ZGlmZiAtLWdpdCBhL0NSRURJVFMgYi9DUkVESVRTCmluZGV4IGFiZTA1YTAuLjJiMzkxNjggMTAwNjQ0Ci0tLSBhL0NSRURJVFMKKysrIGIvQ1JFRElUUwpAQCAtNDY0LDYgKzQ2NCwxMSBAQAogUzogTmFtcGEsIElkYWhvIDgzNjg2CiBTOiBVU0EKIAorTjogRGlyayBKLiBCcmFuZGV3aWUKK0U6IGRpcmsuai5icmFuZGV3aWVAaW50ZWwuY29tCitFOiBsaW51eC13aW1heEBpbnRlbC5jb20KK0Q6IEludGVsIFdpcmVsZXNzIFdpTUFYIENvbm5lY3Rpb24gMjQwMCBTRElPIGRyaXZlcgorCiBOOiBEZXJyaWNrIEouIEJyYXNoZWFyCiBFOiBzaGFkb3dAZGVtZW50aWEub3JnCiBXOiBodHRwOi8vd3d3LmRlbWVudGlhLm9yZy9+c2hhZG93CkBAIC0xNjgxLDcgKzE2ODYsNyBAQAogRDogZmJkZXYgaGFja2luZwogCiBOOiBKZXNwZXIgSnVobAotRTogamVzcGVyLmp1aGxAZ21haWwuY29tCitFOiBqakBjaGFvc2JpdHMubmV0CiBEOiBWYXJpb3VzIGZpeGVzLCBjbGVhbnVwcyBhbmQgbWlub3IgZmVhdHVyZXMgYWxsIG92ZXIgdGhlIHRyZWUuCiBEOiBXcm90ZSBpbml0aWFsIHZlcnNpb24gb2YgdGhlIGhkYXBzIGRyaXZlciAoc2luY2UgcGFzc2VkIG9uIHRvIG90aGVycykuCiBTOiBMZW1ub3N2ZWogMSwgMy50dgpAQCAtMjExOSw2ICsyMTI0LDExIEBACiBFOiBoamxAZ251LmFpLm1pdC5lZHUKIEQ6IEdDQyArIGxpYnJhcmllcyBoYWNrZXIKIAorTjogWWFuaXIgTHViZXRraW4KK0U6IHlhbmlyeC5sdWJhdGtpbkBpbnRlbC5jb20KK0U6IGxpbnV4LXdpbWF4QGludGVsLmNvbQorRDogSW50ZWwgV2lyZWxlc3MgV2lNQVggQ29ubmVjdGlvbiAyNDAwIGRyaXZlcgorCiBOOiBNaWNoYWwgTHVkdmlnCiBFOiBtaWNoYWxAbG9naXguY3oKIEU6IG1pY2hhbC5sdWR2aWdAYXN0ZXJpc2suY28ubnoKQEAgLTI2OTMsNiArMjcwMywxMyBAQAogUzogVGh1bmRlciBCYXksIE9udGFyaW8KIFM6IENBTkFEQSBQN0MgNU05CiAKK046IEluYWt5IFBlcmV6LUdvbnphbGV6CitFOiBpbmFreS5wZXJlei1nb256YWxlekBpbnRlbC5jb20KK0U6IGxpbnV4LXdpbWF4QGludGVsLmNvbQorRTogaW5ha3lwZ0B5YWhvby5jb20KK0Q6IFdpTUFYIHN0YWNrCitEOiBJbnRlbCBXaXJlbGVzcyBXaU1BWCBDb25uZWN0aW9uIDI0MDAgZHJpdmVyCisKIE46IFl1cmkgUGVyCiBFOiB5dXJpQHB0cy5taXB0LnJ1CiBEOiBTb21lIHNtYmZzIGZpeGVzCkBAIC0zNzY5LDE0ICszNzg2LDExIEBACiAKIE46IERhdmlkIFdvb2Rob3VzZQogRTogZHdtdzJAaW5mcmFkZWFkLm9yZwotRDogQVJDbmV0IHN0dWZmLCBBcHBsaWNvbSBib2FyZCBkcml2ZXIsIFNPX0JJTkRUT0RFVklDRSwKLUQ6IHNvbWUgQWxwaGEgcGxhdGZvcm0gcG9ydGluZyBmcm9tIDIuMCwgTWVtb3J5IFRlY2hub2xvZ3kgRGV2aWNlcywKLUQ6IEFjcXVpcmUgd2F0Y2hkb2cgdGltZXIsIFBDIHNwZWFrZXIgZHJpdmVyIG1haW50ZW5hbmNlLAorRDogSkZGUzIgZmlsZSBzeXN0ZW0sIE1lbW9yeSBUZWNobm9sb2d5IERldmljZSBzdWJzeXN0ZW0sCiBEOiB2YXJpb3VzIG90aGVyIHN0dWZmIHRoYXQgYW5ub3llZCBtZSBieSBub3Qgd29ya2luZy4KLVM6IGMvbyBSZWQgSGF0IEVuZ2luZWVyaW5nCi1TOiBSdXN0YXQgSG91c2UKLVM6IDYwIENsaWZ0b24gUm9hZAotUzogQ2FtYnJpZGdlLiBDQjEgN0VHCitTOiBjL28gSW50ZWwgQ29ycG9yYXRpb24KK1M6IFBpcGVycyBXYXkKK1M6IFN3aW5kb24uIFNOMyAxUkoKIFM6IEVuZ2xhbmQKIAogTjogQ2hyaXMgV3JpZ2h0CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWNsYXNzLXJlZ3VsYXRvciBiL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtY2xhc3MtcmVndWxhdG9yCmluZGV4IDM3MzFmNmYuLjg3M2VmMWYgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtY2xhc3MtcmVndWxhdG9yCisrKyBiL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtY2xhc3MtcmVndWxhdG9yCkBAIC0zLDggKzMsOSBAQAogS2VybmVsVmVyc2lvbjoJMi42LjI2CiBDb250YWN0OglMaWFtIEdpcmR3b29kIDxscmdAc2xpbWxvZ2ljLmNvLnVrPgogRGVzY3JpcHRpb246Ci0JCUVhY2ggcmVndWxhdG9yIGRpcmVjdG9yeSB3aWxsIGNvbnRhaW4gYSBmaWVsZCBjYWxsZWQKLQkJc3RhdGUuIFRoaXMgaG9sZHMgdGhlIHJlZ3VsYXRvciBvdXRwdXQgc3RhdGUuCisJCVNvbWUgcmVndWxhdG9yIGRpcmVjdG9yaWVzIHdpbGwgY29udGFpbiBhIGZpZWxkIGNhbGxlZAorCQlzdGF0ZS4gVGhpcyByZXBvcnRzIHRoZSByZWd1bGF0b3IgZW5hYmxlIHN0YXR1cywgZm9yCisJCXJlZ3VsYXRvcnMgd2hpY2ggY2FuIHJlcG9ydCB0aGF0IHZhbHVlLgogCiAJCVRoaXMgd2lsbCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyBzdHJpbmdzOgogCkBAIC0xOCw3ICsxOSw4IEBACiAJCSdkaXNhYmxlZCcgbWVhbnMgdGhlIHJlZ3VsYXRvciBvdXRwdXQgaXMgT0ZGIGFuZCBpcyBub3QKIAkJc3VwcGx5aW5nIHBvd2VyIHRvIHRoZSBzeXN0ZW0uLgogCi0JCSd1bmtub3duJyBtZWFucyBzb2Z0d2FyZSBjYW5ub3QgZGV0ZXJtaW5lIHRoZSBzdGF0ZS4KKwkJJ3Vua25vd24nIG1lYW5zIHNvZnR3YXJlIGNhbm5vdCBkZXRlcm1pbmUgdGhlIHN0YXRlLCBvcgorCQl0aGUgcmVwb3J0ZWQgc3RhdGUgaXMgaW52YWxpZC4KIAogCQlOT1RFOiB0aGlzIGZpZWxkIGNhbiBiZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggbWljcm92b2x0cwogCQlhbmQgbWljcm9hbXBzIHRvIGRldGVybWluZSByZWd1bGF0b3Igb3V0cHV0IGxldmVscy4KQEAgLTUzLDkgKzU1LDEwIEBACiBLZXJuZWxWZXJzaW9uOgkyLjYuMjYKIENvbnRhY3Q6CUxpYW0gR2lyZHdvb2QgPGxyZ0BzbGltbG9naWMuY28udWs+CiBEZXNjcmlwdGlvbjoKLQkJRWFjaCByZWd1bGF0b3IgZGlyZWN0b3J5IHdpbGwgY29udGFpbiBhIGZpZWxkIGNhbGxlZAorCQlTb21lIHJlZ3VsYXRvciBkaXJlY3RvcmllcyB3aWxsIGNvbnRhaW4gYSBmaWVsZCBjYWxsZWQKIAkJbWljcm92b2x0cy4gVGhpcyBob2xkcyB0aGUgcmVndWxhdG9yIG91dHB1dCB2b2x0YWdlIHNldHRpbmcKLQkJbWVhc3VyZWQgaW4gbWljcm92b2x0cyAoaS5lLiBFLTYgVm9sdHMpLgorCQltZWFzdXJlZCBpbiBtaWNyb3ZvbHRzIChpLmUuIEUtNiBWb2x0cyksIGZvciByZWd1bGF0b3JzCisJCXdoaWNoIGNhbiByZXBvcnQgdGhhdCB2b2x0YWdlLgogCiAJCU5PVEU6IFRoaXMgdmFsdWUgc2hvdWxkIG5vdCBiZSB1c2VkIHRvIGRldGVybWluZSB0aGUgcmVndWxhdG9yCiAJCW91dHB1dCB2b2x0YWdlIGxldmVsIGFzIHRoaXMgdmFsdWUgaXMgdGhlIHNhbWUgcmVnYXJkbGVzcyBvZgpAQCAtNjcsOSArNzAsMTAgQEAKIEtlcm5lbFZlcnNpb246CTIuNi4yNgogQ29udGFjdDoJTGlhbSBHaXJkd29vZCA8bHJnQHNsaW1sb2dpYy5jby51az4KIERlc2NyaXB0aW9uOgotCQlFYWNoIHJlZ3VsYXRvciBkaXJlY3Rvcnkgd2lsbCBjb250YWluIGEgZmllbGQgY2FsbGVkCisJCVNvbWUgcmVndWxhdG9yIGRpcmVjdG9yaWVzIHdpbGwgY29udGFpbiBhIGZpZWxkIGNhbGxlZAogCQltaWNyb2FtcHMuIFRoaXMgaG9sZHMgdGhlIHJlZ3VsYXRvciBvdXRwdXQgY3VycmVudCBsaW1pdAotCQlzZXR0aW5nIG1lYXN1cmVkIGluIG1pY3JvYW1wcyAoaS5lLiBFLTYgQW1wcykuCisJCXNldHRpbmcgbWVhc3VyZWQgaW4gbWljcm9hbXBzIChpLmUuIEUtNiBBbXBzKSwgZm9yIHJlZ3VsYXRvcnMKKwkJd2hpY2ggY2FuIHJlcG9ydCB0aGF0IGN1cnJlbnQuCiAKIAkJTk9URTogVGhpcyB2YWx1ZSBzaG91bGQgbm90IGJlIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSByZWd1bGF0b3IKIAkJb3V0cHV0IGN1cnJlbnQgbGV2ZWwgYXMgdGhpcyB2YWx1ZSBpcyB0aGUgc2FtZSByZWdhcmRsZXNzIG9mCkBAIC04MSw4ICs4NSw5IEBACiBLZXJuZWxWZXJzaW9uOgkyLjYuMjYKIENvbnRhY3Q6CUxpYW0gR2lyZHdvb2QgPGxyZ0BzbGltbG9naWMuY28udWs+CiBEZXNjcmlwdGlvbjoKLQkJRWFjaCByZWd1bGF0b3IgZGlyZWN0b3J5IHdpbGwgY29udGFpbiBhIGZpZWxkIGNhbGxlZAotCQlvcG1vZGUuIFRoaXMgaG9sZHMgdGhlIHJlZ3VsYXRvciBvcGVyYXRpbmcgbW9kZSBzZXR0aW5nLgorCQlTb21lIHJlZ3VsYXRvciBkaXJlY3RvcmllcyB3aWxsIGNvbnRhaW4gYSBmaWVsZCBjYWxsZWQKKwkJb3Btb2RlLiBUaGlzIGhvbGRzIHRoZSBjdXJyZW50IHJlZ3VsYXRvciBvcGVyYXRpbmcgbW9kZSwKKwkJZm9yIHJlZ3VsYXRvcnMgd2hpY2ggY2FuIHJlcG9ydCBpdC4KIAogCQlUaGUgb3Btb2RlIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyBzdHJpbmdzOgogCkBAIC05Miw3ICs5Nyw3IEBACiAJCSdzdGFuZGJ5JwogCQkndW5rbm93bicKIAotCQlUaGUgbW9kZXMgYXJlIGRlc2NyaWJlZCBpbiBpbmNsdWRlL2xpbnV4L3JlZ3VsYXRvci9yZWd1bGF0b3IuaAorCQlUaGUgbW9kZXMgYXJlIGRlc2NyaWJlZCBpbiBpbmNsdWRlL2xpbnV4L3JlZ3VsYXRvci9jb25zdW1lci5oCiAKIAkJTk9URTogVGhpcyB2YWx1ZSBzaG91bGQgbm90IGJlIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSByZWd1bGF0b3IKIAkJb3V0cHV0IG9wZXJhdGluZyBtb2RlIGFzIHRoaXMgdmFsdWUgaXMgdGhlIHNhbWUgcmVnYXJkbGVzcyBvZgpAQCAtMTA0LDkgKzEwOSwxMCBAQAogS2VybmVsVmVyc2lvbjoJMi42LjI2CiBDb250YWN0OglMaWFtIEdpcmR3b29kIDxscmdAc2xpbWxvZ2ljLmNvLnVrPgogRGVzY3JpcHRpb246Ci0JCUVhY2ggcmVndWxhdG9yIGRpcmVjdG9yeSB3aWxsIGNvbnRhaW4gYSBmaWVsZCBjYWxsZWQKKwkJU29tZSByZWd1bGF0b3IgZGlyZWN0b3JpZXMgd2lsbCBjb250YWluIGEgZmllbGQgY2FsbGVkCiAJCW1pbl9taWNyb3ZvbHRzLiBUaGlzIGhvbGRzIHRoZSBtaW5pbXVtIHNhZmUgd29ya2luZyByZWd1bGF0b3IKLQkJb3V0cHV0IHZvbHRhZ2Ugc2V0dGluZyBmb3IgdGhpcyBkb21haW4gbWVhc3VyZWQgaW4gbWljcm92b2x0cy4KKwkJb3V0cHV0IHZvbHRhZ2Ugc2V0dGluZyBmb3IgdGhpcyBkb21haW4gbWVhc3VyZWQgaW4gbWljcm92b2x0cywKKwkJZm9yIHJlZ3VsYXRvcnMgd2hpY2ggc3VwcG9ydCB2b2x0YWdlIGNvbnN0cmFpbnRzLgogCiAJCU5PVEU6IHRoaXMgd2lsbCByZXR1cm4gdGhlIHN0cmluZyAnY29uc3RyYWludCBub3QgZGVmaW5lZCcgaWYKIAkJdGhlIHBvd2VyIGRvbWFpbiBoYXMgbm8gbWluIG1pY3Jvdm9sdHMgY29uc3RyYWludCBkZWZpbmVkIGJ5CkBAIC0xMTgsOSArMTI0LDEwIEBACiBLZXJuZWxWZXJzaW9uOgkyLjYuMjYKIENvbnRhY3Q6CUxpYW0gR2lyZHdvb2QgPGxyZ0BzbGltbG9naWMuY28udWs+CiBEZXNjcmlwdGlvbjoKLQkJRWFjaCByZWd1bGF0b3IgZGlyZWN0b3J5IHdpbGwgY29udGFpbiBhIGZpZWxkIGNhbGxlZAorCQlTb21lIHJlZ3VsYXRvciBkaXJlY3RvcmllcyB3aWxsIGNvbnRhaW4gYSBmaWVsZCBjYWxsZWQKIAkJbWF4X21pY3Jvdm9sdHMuIFRoaXMgaG9sZHMgdGhlIG1heGltdW0gc2FmZSB3b3JraW5nIHJlZ3VsYXRvcgotCQlvdXRwdXQgdm9sdGFnZSBzZXR0aW5nIGZvciB0aGlzIGRvbWFpbiBtZWFzdXJlZCBpbiBtaWNyb3ZvbHRzLgorCQlvdXRwdXQgdm9sdGFnZSBzZXR0aW5nIGZvciB0aGlzIGRvbWFpbiBtZWFzdXJlZCBpbiBtaWNyb3ZvbHRzLAorCQlmb3IgcmVndWxhdG9ycyB3aGljaCBzdXBwb3J0IHZvbHRhZ2UgY29uc3RyYWludHMuCiAKIAkJTk9URTogdGhpcyB3aWxsIHJldHVybiB0aGUgc3RyaW5nICdjb25zdHJhaW50IG5vdCBkZWZpbmVkJyBpZgogCQl0aGUgcG93ZXIgZG9tYWluIGhhcyBubyBtYXggbWljcm92b2x0cyBjb25zdHJhaW50IGRlZmluZWQgYnkKQEAgLTEzMiwxMCArMTM5LDEwIEBACiBLZXJuZWxWZXJzaW9uOgkyLjYuMjYKIENvbnRhY3Q6CUxpYW0gR2lyZHdvb2QgPGxyZ0BzbGltbG9naWMuY28udWs+CiBEZXNjcmlwdGlvbjoKLQkJRWFjaCByZWd1bGF0b3IgZGlyZWN0b3J5IHdpbGwgY29udGFpbiBhIGZpZWxkIGNhbGxlZAorCQlTb21lIHJlZ3VsYXRvciBkaXJlY3RvcmllcyB3aWxsIGNvbnRhaW4gYSBmaWVsZCBjYWxsZWQKIAkJbWluX21pY3JvYW1wcy4gVGhpcyBob2xkcyB0aGUgbWluaW11bSBzYWZlIHdvcmtpbmcgcmVndWxhdG9yCiAJCW91dHB1dCBjdXJyZW50IGxpbWl0IHNldHRpbmcgZm9yIHRoaXMgZG9tYWluIG1lYXN1cmVkIGluCi0JCW1pY3JvYW1wcy4KKwkJbWljcm9hbXBzLCBmb3IgcmVndWxhdG9ycyB3aGljaCBzdXBwb3J0IGN1cnJlbnQgY29uc3RyYWludHMuCiAKIAkJTk9URTogdGhpcyB3aWxsIHJldHVybiB0aGUgc3RyaW5nICdjb25zdHJhaW50IG5vdCBkZWZpbmVkJyBpZgogCQl0aGUgcG93ZXIgZG9tYWluIGhhcyBubyBtaW4gbWljcm9hbXBzIGNvbnN0cmFpbnQgZGVmaW5lZCBieQpAQCAtMTQ3LDEwICsxNTQsMTAgQEAKIEtlcm5lbFZlcnNpb246CTIuNi4yNgogQ29udGFjdDoJTGlhbSBHaXJkd29vZCA8bHJnQHNsaW1sb2dpYy5jby51az4KIERlc2NyaXB0aW9uOgotCQlFYWNoIHJlZ3VsYXRvciBkaXJlY3Rvcnkgd2lsbCBjb250YWluIGEgZmllbGQgY2FsbGVkCisJCVNvbWUgcmVndWxhdG9yIGRpcmVjdG9yaWVzIHdpbGwgY29udGFpbiBhIGZpZWxkIGNhbGxlZAogCQltYXhfbWljcm9hbXBzLiBUaGlzIGhvbGRzIHRoZSBtYXhpbXVtIHNhZmUgd29ya2luZyByZWd1bGF0b3IKIAkJb3V0cHV0IGN1cnJlbnQgbGltaXQgc2V0dGluZyBmb3IgdGhpcyBkb21haW4gbWVhc3VyZWQgaW4KLQkJbWljcm9hbXBzLgorCQltaWNyb2FtcHMsIGZvciByZWd1bGF0b3JzIHdoaWNoIHN1cHBvcnQgY3VycmVudCBjb25zdHJhaW50cy4KIAogCQlOT1RFOiB0aGlzIHdpbGwgcmV0dXJuIHRoZSBzdHJpbmcgJ2NvbnN0cmFpbnQgbm90IGRlZmluZWQnIGlmCiAJCXRoZSBwb3dlciBkb21haW4gaGFzIG5vIG1heCBtaWNyb2FtcHMgY29uc3RyYWludCBkZWZpbmVkIGJ5CkBAIC0xODUsNyArMTkyLDcgQEAKIEtlcm5lbFZlcnNpb246CTIuNi4yNgogQ29udGFjdDoJTGlhbSBHaXJkd29vZCA8bHJnQHNsaW1sb2dpYy5jby51az4KIERlc2NyaXB0aW9uOgotCQlFYWNoIHJlZ3VsYXRvciBkaXJlY3Rvcnkgd2lsbCBjb250YWluIGEgZmllbGQgY2FsbGVkCisJCVNvbWUgcmVndWxhdG9yIGRpcmVjdG9yaWVzIHdpbGwgY29udGFpbiBhIGZpZWxkIGNhbGxlZAogCQlyZXF1ZXN0ZWRfbWljcm9hbXBzLiBUaGlzIGhvbGRzIHRoZSB0b3RhbCByZXF1ZXN0ZWQgbG9hZAogCQljdXJyZW50IGluIG1pY3JvYW1wcyBmb3IgdGhpcyByZWd1bGF0b3IgZnJvbSBhbGwgaXRzIGNvbnN1bWVyCiAJCWRldmljZXMuCkBAIC0yMDQsMTI1ICsyMTEsMTAyIEBACiBLZXJuZWxWZXJzaW9uOgkyLjYuMjYKIENvbnRhY3Q6CUxpYW0gR2lyZHdvb2QgPGxyZ0BzbGltbG9naWMuY28udWs+CiBEZXNjcmlwdGlvbjoKLQkJRWFjaCByZWd1bGF0b3IgZGlyZWN0b3J5IHdpbGwgY29udGFpbiBhIGZpZWxkIGNhbGxlZAorCQlTb21lIHJlZ3VsYXRvciBkaXJlY3RvcmllcyB3aWxsIGNvbnRhaW4gYSBmaWVsZCBjYWxsZWQKIAkJc3VzcGVuZF9tZW1fbWljcm92b2x0cy4gVGhpcyBob2xkcyB0aGUgcmVndWxhdG9yIG91dHB1dAogCQl2b2x0YWdlIHNldHRpbmcgZm9yIHRoaXMgZG9tYWluIG1lYXN1cmVkIGluIG1pY3Jvdm9sdHMgd2hlbgotCQl0aGUgc3lzdGVtIGlzIHN1c3BlbmRlZCB0byBtZW1vcnkuCi0KLQkJTk9URTogdGhpcyB3aWxsIHJldHVybiB0aGUgc3RyaW5nICdub3QgZGVmaW5lZCcgaWYKLQkJdGhlIHBvd2VyIGRvbWFpbiBoYXMgbm8gc3VzcGVuZCB0byBtZW1vcnkgdm9sdGFnZSBkZWZpbmVkIGJ5Ci0JCXBsYXRmb3JtIGNvZGUuCisJCXRoZSBzeXN0ZW0gaXMgc3VzcGVuZGVkIHRvIG1lbW9yeSwgZm9yIHZvbHRhZ2UgcmVndWxhdG9ycworCQlpbXBsZW1lbnRpbmcgc3VzcGVuZCB2b2x0YWdlIGNvbmZpZ3VyYXRpb24gY29uc3RyYWludHMuCiAKIFdoYXQ6CQkvc3lzL2NsYXNzL3JlZ3VsYXRvci8uLi4vc3VzcGVuZF9kaXNrX21pY3Jvdm9sdHMKIERhdGU6CQlNYXkgMjAwOAogS2VybmVsVmVyc2lvbjoJMi42LjI2CiBDb250YWN0OglMaWFtIEdpcmR3b29kIDxscmdAc2xpbWxvZ2ljLmNvLnVrPgogRGVzY3JpcHRpb246Ci0JCUVhY2ggcmVndWxhdG9yIGRpcmVjdG9yeSB3aWxsIGNvbnRhaW4gYSBmaWVsZCBjYWxsZWQKKwkJU29tZSByZWd1bGF0b3IgZGlyZWN0b3JpZXMgd2lsbCBjb250YWluIGEgZmllbGQgY2FsbGVkCiAJCXN1c3BlbmRfZGlza19taWNyb3ZvbHRzLiBUaGlzIGhvbGRzIHRoZSByZWd1bGF0b3Igb3V0cHV0CiAJCXZvbHRhZ2Ugc2V0dGluZyBmb3IgdGhpcyBkb21haW4gbWVhc3VyZWQgaW4gbWljcm92b2x0cyB3aGVuCi0JCXRoZSBzeXN0ZW0gaXMgc3VzcGVuZGVkIHRvIGRpc2suCi0KLQkJTk9URTogdGhpcyB3aWxsIHJldHVybiB0aGUgc3RyaW5nICdub3QgZGVmaW5lZCcgaWYKLQkJdGhlIHBvd2VyIGRvbWFpbiBoYXMgbm8gc3VzcGVuZCB0byBkaXNrIHZvbHRhZ2UgZGVmaW5lZCBieQotCQlwbGF0Zm9ybSBjb2RlLgorCQl0aGUgc3lzdGVtIGlzIHN1c3BlbmRlZCB0byBkaXNrLCBmb3Igdm9sdGFnZSByZWd1bGF0b3JzCisJCWltcGxlbWVudGluZyBzdXNwZW5kIHZvbHRhZ2UgY29uZmlndXJhdGlvbiBjb25zdHJhaW50cy4KIAogV2hhdDoJCS9zeXMvY2xhc3MvcmVndWxhdG9yLy4uLi9zdXNwZW5kX3N0YW5kYnlfbWljcm92b2x0cwogRGF0ZToJCU1heSAyMDA4CiBLZXJuZWxWZXJzaW9uOgkyLjYuMjYKIENvbnRhY3Q6CUxpYW0gR2lyZHdvb2QgPGxyZ0BzbGltbG9naWMuY28udWs+CiBEZXNjcmlwdGlvbjoKLQkJRWFjaCByZWd1bGF0b3IgZGlyZWN0b3J5IHdpbGwgY29udGFpbiBhIGZpZWxkIGNhbGxlZAorCQlTb21lIHJlZ3VsYXRvciBkaXJlY3RvcmllcyB3aWxsIGNvbnRhaW4gYSBmaWVsZCBjYWxsZWQKIAkJc3VzcGVuZF9zdGFuZGJ5X21pY3Jvdm9sdHMuIFRoaXMgaG9sZHMgdGhlIHJlZ3VsYXRvciBvdXRwdXQKIAkJdm9sdGFnZSBzZXR0aW5nIGZvciB0aGlzIGRvbWFpbiBtZWFzdXJlZCBpbiBtaWNyb3ZvbHRzIHdoZW4KLQkJdGhlIHN5c3RlbSBpcyBzdXNwZW5kZWQgdG8gc3RhbmRieS4KLQotCQlOT1RFOiB0aGlzIHdpbGwgcmV0dXJuIHRoZSBzdHJpbmcgJ25vdCBkZWZpbmVkJyBpZgotCQl0aGUgcG93ZXIgZG9tYWluIGhhcyBubyBzdXNwZW5kIHRvIHN0YW5kYnkgdm9sdGFnZSBkZWZpbmVkIGJ5Ci0JCXBsYXRmb3JtIGNvZGUuCisJCXRoZSBzeXN0ZW0gaXMgc3VzcGVuZGVkIHRvIHN0YW5kYnksIGZvciB2b2x0YWdlIHJlZ3VsYXRvcnMKKwkJaW1wbGVtZW50aW5nIHN1c3BlbmQgdm9sdGFnZSBjb25maWd1cmF0aW9uIGNvbnN0cmFpbnRzLgogCiBXaGF0OgkJL3N5cy9jbGFzcy9yZWd1bGF0b3IvLi4uL3N1c3BlbmRfbWVtX21vZGUKIERhdGU6CQlNYXkgMjAwOAogS2VybmVsVmVyc2lvbjoJMi42LjI2CiBDb250YWN0OglMaWFtIEdpcmR3b29kIDxscmdAc2xpbWxvZ2ljLmNvLnVrPgogRGVzY3JpcHRpb246Ci0JCUVhY2ggcmVndWxhdG9yIGRpcmVjdG9yeSB3aWxsIGNvbnRhaW4gYSBmaWVsZCBjYWxsZWQKKwkJU29tZSByZWd1bGF0b3IgZGlyZWN0b3JpZXMgd2lsbCBjb250YWluIGEgZmllbGQgY2FsbGVkCiAJCXN1c3BlbmRfbWVtX21vZGUuIFRoaXMgaG9sZHMgdGhlIHJlZ3VsYXRvciBvcGVyYXRpbmcgbW9kZQogCQlzZXR0aW5nIGZvciB0aGlzIGRvbWFpbiB3aGVuIHRoZSBzeXN0ZW0gaXMgc3VzcGVuZGVkIHRvCi0JCW1lbW9yeS4KLQotCQlOT1RFOiB0aGlzIHdpbGwgcmV0dXJuIHRoZSBzdHJpbmcgJ25vdCBkZWZpbmVkJyBpZgotCQl0aGUgcG93ZXIgZG9tYWluIGhhcyBubyBzdXNwZW5kIHRvIG1lbW9yeSBtb2RlIGRlZmluZWQgYnkKLQkJcGxhdGZvcm0gY29kZS4KKwkJbWVtb3J5LCBmb3IgcmVndWxhdG9ycyBpbXBsZW1lbnRpbmcgc3VzcGVuZCBtb2RlCisJCWNvbmZpZ3VyYXRpb24gY29uc3RyYWludHMuCiAKIFdoYXQ6CQkvc3lzL2NsYXNzL3JlZ3VsYXRvci8uLi4vc3VzcGVuZF9kaXNrX21vZGUKIERhdGU6CQlNYXkgMjAwOAogS2VybmVsVmVyc2lvbjoJMi42LjI2CiBDb250YWN0OglMaWFtIEdpcmR3b29kIDxscmdAc2xpbWxvZ2ljLmNvLnVrPgogRGVzY3JpcHRpb246Ci0JCUVhY2ggcmVndWxhdG9yIGRpcmVjdG9yeSB3aWxsIGNvbnRhaW4gYSBmaWVsZCBjYWxsZWQKKwkJU29tZSByZWd1bGF0b3IgZGlyZWN0b3JpZXMgd2lsbCBjb250YWluIGEgZmllbGQgY2FsbGVkCiAJCXN1c3BlbmRfZGlza19tb2RlLiBUaGlzIGhvbGRzIHRoZSByZWd1bGF0b3Igb3BlcmF0aW5nIG1vZGUKLQkJc2V0dGluZyBmb3IgdGhpcyBkb21haW4gd2hlbiB0aGUgc3lzdGVtIGlzIHN1c3BlbmRlZCB0byBkaXNrLgotCi0JCU5PVEU6IHRoaXMgd2lsbCByZXR1cm4gdGhlIHN0cmluZyAnbm90IGRlZmluZWQnIGlmCi0JCXRoZSBwb3dlciBkb21haW4gaGFzIG5vIHN1c3BlbmQgdG8gZGlzayBtb2RlIGRlZmluZWQgYnkKLQkJcGxhdGZvcm0gY29kZS4KKwkJc2V0dGluZyBmb3IgdGhpcyBkb21haW4gd2hlbiB0aGUgc3lzdGVtIGlzIHN1c3BlbmRlZCB0byBkaXNrLAorCQlmb3IgcmVndWxhdG9ycyBpbXBsZW1lbnRpbmcgc3VzcGVuZCBtb2RlIGNvbmZpZ3VyYXRpb24KKwkJY29uc3RyYWludHMuCiAKIFdoYXQ6CQkvc3lzL2NsYXNzL3JlZ3VsYXRvci8uLi4vc3VzcGVuZF9zdGFuZGJ5X21vZGUKIERhdGU6CQlNYXkgMjAwOAogS2VybmVsVmVyc2lvbjoJMi42LjI2CiBDb250YWN0OglMaWFtIEdpcmR3b29kIDxscmdAc2xpbWxvZ2ljLmNvLnVrPgogRGVzY3JpcHRpb246Ci0JCUVhY2ggcmVndWxhdG9yIGRpcmVjdG9yeSB3aWxsIGNvbnRhaW4gYSBmaWVsZCBjYWxsZWQKKwkJU29tZSByZWd1bGF0b3IgZGlyZWN0b3JpZXMgd2lsbCBjb250YWluIGEgZmllbGQgY2FsbGVkCiAJCXN1c3BlbmRfc3RhbmRieV9tb2RlLiBUaGlzIGhvbGRzIHRoZSByZWd1bGF0b3Igb3BlcmF0aW5nIG1vZGUKIAkJc2V0dGluZyBmb3IgdGhpcyBkb21haW4gd2hlbiB0aGUgc3lzdGVtIGlzIHN1c3BlbmRlZCB0bwotCQlzdGFuZGJ5LgotCi0JCU5PVEU6IHRoaXMgd2lsbCByZXR1cm4gdGhlIHN0cmluZyAnbm90IGRlZmluZWQnIGlmCi0JCXRoZSBwb3dlciBkb21haW4gaGFzIG5vIHN1c3BlbmQgdG8gc3RhbmRieSBtb2RlIGRlZmluZWQgYnkKLQkJcGxhdGZvcm0gY29kZS4KKwkJc3RhbmRieSwgZm9yIHJlZ3VsYXRvcnMgaW1wbGVtZW50aW5nIHN1c3BlbmQgbW9kZQorCQljb25maWd1cmF0aW9uIGNvbnN0cmFpbnRzLgogCiBXaGF0OgkJL3N5cy9jbGFzcy9yZWd1bGF0b3IvLi4uL3N1c3BlbmRfbWVtX3N0YXRlCiBEYXRlOgkJTWF5IDIwMDgKIEtlcm5lbFZlcnNpb246CTIuNi4yNgogQ29udGFjdDoJTGlhbSBHaXJkd29vZCA8bHJnQHNsaW1sb2dpYy5jby51az4KIERlc2NyaXB0aW9uOgotCQlFYWNoIHJlZ3VsYXRvciBkaXJlY3Rvcnkgd2lsbCBjb250YWluIGEgZmllbGQgY2FsbGVkCisJCVNvbWUgcmVndWxhdG9yIGRpcmVjdG9yaWVzIHdpbGwgY29udGFpbiBhIGZpZWxkIGNhbGxlZAogCQlzdXNwZW5kX21lbV9zdGF0ZS4gVGhpcyBob2xkcyB0aGUgcmVndWxhdG9yIG9wZXJhdGluZyBzdGF0ZQotCQl3aGVuIHN1c3BlbmRlZCB0byBtZW1vcnkuCisJCXdoZW4gc3VzcGVuZGVkIHRvIG1lbW9yeSwgZm9yIHJlZ3VsYXRvcnMgaW1wbGVtZW50aW5nIHN1c3BlbmQKKwkJY29uZmlndXJhdGlvbiBjb25zdHJhaW50cy4KIAotCQlUaGlzIHdpbGwgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgc3RyaW5nczoKLQotCQknZW5hYmxlZCcKLQkJJ2Rpc2FibGVkJwotCQknbm90IGRlZmluZWQnCisJCVRoaXMgd2lsbCBiZSBvbmUgb2YgdGhlIHNhbWUgc3RyaW5ncyByZXBvcnRlZCBieQorCQl0aGUgInN0YXRlIiBhdHRyaWJ1dGUuCiAKIFdoYXQ6CQkvc3lzL2NsYXNzL3JlZ3VsYXRvci8uLi4vc3VzcGVuZF9kaXNrX3N0YXRlCiBEYXRlOgkJTWF5IDIwMDgKIEtlcm5lbFZlcnNpb246CTIuNi4yNgogQ29udGFjdDoJTGlhbSBHaXJkd29vZCA8bHJnQHNsaW1sb2dpYy5jby51az4KIERlc2NyaXB0aW9uOgotCQlFYWNoIHJlZ3VsYXRvciBkaXJlY3Rvcnkgd2lsbCBjb250YWluIGEgZmllbGQgY2FsbGVkCisJCVNvbWUgcmVndWxhdG9yIGRpcmVjdG9yaWVzIHdpbGwgY29udGFpbiBhIGZpZWxkIGNhbGxlZAogCQlzdXNwZW5kX2Rpc2tfc3RhdGUuIFRoaXMgaG9sZHMgdGhlIHJlZ3VsYXRvciBvcGVyYXRpbmcgc3RhdGUKLQkJd2hlbiBzdXNwZW5kZWQgdG8gZGlzay4KKwkJd2hlbiBzdXNwZW5kZWQgdG8gZGlzaywgZm9yIHJlZ3VsYXRvcnMgaW1wbGVtZW50aW5nCisJCXN1c3BlbmQgY29uZmlndXJhdGlvbiBjb25zdHJhaW50cy4KIAotCQlUaGlzIHdpbGwgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgc3RyaW5nczoKLQotCQknZW5hYmxlZCcKLQkJJ2Rpc2FibGVkJwotCQknbm90IGRlZmluZWQnCisJCVRoaXMgd2lsbCBiZSBvbmUgb2YgdGhlIHNhbWUgc3RyaW5ncyByZXBvcnRlZCBieQorCQl0aGUgInN0YXRlIiBhdHRyaWJ1dGUuCiAKIFdoYXQ6CQkvc3lzL2NsYXNzL3JlZ3VsYXRvci8uLi4vc3VzcGVuZF9zdGFuZGJ5X3N0YXRlCiBEYXRlOgkJTWF5IDIwMDgKIEtlcm5lbFZlcnNpb246CTIuNi4yNgogQ29udGFjdDoJTGlhbSBHaXJkd29vZCA8bHJnQHNsaW1sb2dpYy5jby51az4KIERlc2NyaXB0aW9uOgotCQlFYWNoIHJlZ3VsYXRvciBkaXJlY3Rvcnkgd2lsbCBjb250YWluIGEgZmllbGQgY2FsbGVkCisJCVNvbWUgcmVndWxhdG9yIGRpcmVjdG9yaWVzIHdpbGwgY29udGFpbiBhIGZpZWxkIGNhbGxlZAogCQlzdXNwZW5kX3N0YW5kYnlfc3RhdGUuIFRoaXMgaG9sZHMgdGhlIHJlZ3VsYXRvciBvcGVyYXRpbmcKLQkJc3RhdGUgd2hlbiBzdXNwZW5kZWQgdG8gc3RhbmRieS4KKwkJc3RhdGUgd2hlbiBzdXNwZW5kZWQgdG8gc3RhbmRieSwgZm9yIHJlZ3VsYXRvcnMgaW1wbGVtZW50aW5nCisJCXN1c3BlbmQgY29uZmlndXJhdGlvbiBjb25zdHJhaW50cy4KIAotCQlUaGlzIHdpbGwgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgc3RyaW5nczoKLQotCQknZW5hYmxlZCcKLQkJJ2Rpc2FibGVkJwotCQknbm90IGRlZmluZWQnCisJCVRoaXMgd2lsbCBiZSBvbmUgb2YgdGhlIHNhbWUgc3RyaW5ncyByZXBvcnRlZCBieQorCQl0aGUgInN0YXRlIiBhdHRyaWJ1dGUuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RNQS1BUEkudHh0IGIvRG9jdW1lbnRhdGlvbi9ETUEtQVBJLnR4dAppbmRleCBiNDYyYmIxLi41MjQ0MTY5IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0RNQS1BUEkudHh0CisrKyBiL0RvY3VtZW50YXRpb24vRE1BLUFQSS50eHQKQEAgLTE3MCwxNiArMTcwLDE1IEBACiB1NjQKIGRtYV9nZXRfcmVxdWlyZWRfbWFzayhzdHJ1Y3QgZGV2aWNlICpkZXYpCiAKLUFmdGVyIHNldHRpbmcgdGhlIG1hc2sgd2l0aCBkbWFfc2V0X21hc2soKSwgdGhpcyBBUEkgcmV0dXJucyB0aGUKLWFjdHVhbCBtYXNrICh3aXRoaW4gdGhhdCBhbHJlYWR5IHNldCkgdGhhdCB0aGUgcGxhdGZvcm0gYWN0dWFsbHkKLXJlcXVpcmVzIHRvIG9wZXJhdGUgZWZmaWNpZW50bHkuICBVc3VhbGx5IHRoaXMgbWVhbnMgdGhlIHJldHVybmVkIG1hc2sKK1RoaXMgQVBJIHJldHVybnMgdGhlIG1hc2sgdGhhdCB0aGUgcGxhdGZvcm0gcmVxdWlyZXMgdG8KK29wZXJhdGUgZWZmaWNpZW50bHkuICBVc3VhbGx5IHRoaXMgbWVhbnMgdGhlIHJldHVybmVkIG1hc2sKIGlzIHRoZSBtaW5pbXVtIHJlcXVpcmVkIHRvIGNvdmVyIGFsbCBvZiBtZW1vcnkuICBFeGFtaW5pbmcgdGhlCiByZXF1aXJlZCBtYXNrIGdpdmVzIGRyaXZlcnMgd2l0aCB2YXJpYWJsZSBkZXNjcmlwdG9yIHNpemVzIHRoZQogb3Bwb3J0dW5pdHkgdG8gdXNlIHNtYWxsZXIgZGVzY3JpcHRvcnMgYXMgbmVjZXNzYXJ5LgogCiBSZXF1ZXN0aW5nIHRoZSByZXF1aXJlZCBtYXNrIGRvZXMgbm90IGFsdGVyIHRoZSBjdXJyZW50IG1hc2suICBJZiB5b3UKLXdpc2ggdG8gdGFrZSBhZHZhbnRhZ2Ugb2YgaXQsIHlvdSBzaG91bGQgaXNzdWUgYW5vdGhlciBkbWFfc2V0X21hc2soKQotY2FsbCB0byBsb3dlciB0aGUgbWFzayBhZ2Fpbi4KK3dpc2ggdG8gdGFrZSBhZHZhbnRhZ2Ugb2YgaXQsIHlvdSBzaG91bGQgaXNzdWUgYSBkbWFfc2V0X21hc2soKQorY2FsbCB0byBzZXQgdGhlIG1hc2sgdG8gdGhlIHZhbHVlIHJldHVybmVkLgogCiAKIFBhcnQgSWQgLSBTdHJlYW1pbmcgRE1BIG1hcHBpbmdzCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svTWFrZWZpbGUgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svTWFrZWZpbGUKaW5kZXggMGEwODEyNi4uZGMzMTU0ZSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL01ha2VmaWxlCisrKyBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9NYWtlZmlsZQpAQCAtMTIsNyArMTIsNyBAQAogCSAgICBrZXJuZWwtYXBpLnhtbCBmaWxlc3lzdGVtcy54bWwgbHNtLnhtbCB1c2IueG1sIGtnZGIueG1sIFwKIAkgICAgZ2FkZ2V0LnhtbCBsaWJhdGEueG1sIG10ZG5hbmQueG1sIGxpYnJzLnhtbCByYXBpZGlvLnhtbCBcCiAJICAgIGdlbmVyaWNpcnEueG1sIHMzOTAtZHJpdmVycy54bWwgdWlvLWhvd3RvLnhtbCBzY3NpLnhtbCBcCi0JICAgIG1hYzgwMjExLnhtbCBkZWJ1Z29iamVjdHMueG1sIHNoLnhtbAorCSAgICBtYWM4MDIxMS54bWwgZGVidWdvYmplY3RzLnhtbCBzaC54bWwgcmVndWxhdG9yLnhtbAogCiAjIyMKICMgVGhlIGJ1aWxkIHByb2Nlc3MgaXMgYXMgZm9sbG93cyAodGFyZ2V0cyk6CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbmV0d29ya2luZy50bXBsIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL25ldHdvcmtpbmcudG1wbAppbmRleCA2Mjc3MDdhLi41OWFkNjlhIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbmV0d29ya2luZy50bXBsCisrKyBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9uZXR3b3JraW5nLnRtcGwKQEAgLTc0LDYgKzc0LDE0IEBACiAhRW5ldC9zdW5ycGMvcnBjYl9jbG50LmMKICFFbmV0L3N1bnJwYy9jbG50LmMKICAgICAgPC9zZWN0MT4KKyAgICAgPHNlY3QxPjx0aXRsZT5XaU1BWDwvdGl0bGU+CishRW5ldC93aW1heC9vcC1tc2cuYworIUVuZXQvd2ltYXgvb3AtcmVzZXQuYworIUVuZXQvd2ltYXgvb3AtcmZraWxsLmMKKyFFbmV0L3dpbWF4L3N0YWNrLmMKKyFJaW5jbHVkZS9uZXQvd2ltYXguaAorIUlpbmNsdWRlL2xpbnV4L3dpbWF4LmgKKyAgICAgPC9zZWN0MT4KICAgPC9jaGFwdGVyPgogCiAgIDxjaGFwdGVyIGlkPSJuZXRkZXYiPgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3JlZ3VsYXRvci50bXBsIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3JlZ3VsYXRvci50bXBsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzZjRmOGQKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svcmVndWxhdG9yLnRtcGwKQEAgLTAsMCArMSwzMDQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IURPQ1RZUEUgYm9vayBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRG9jQm9vayBYTUwgVjQuMS4yLy9FTiIKKwkiaHR0cDovL3d3dy5vYXNpcy1vcGVuLm9yZy9kb2Nib29rL3htbC80LjEuMi9kb2Nib29reC5kdGQiIFtdPgorCis8Ym9vayBpZD0icmVndWxhdG9yLWFwaSI+CisgPGJvb2tpbmZvPgorICA8dGl0bGU+Vm9sdGFnZSBhbmQgY3VycmVudCByZWd1bGF0b3IgQVBJPC90aXRsZT4KKworICA8YXV0aG9yZ3JvdXA+CisgICA8YXV0aG9yPgorICAgIDxmaXJzdG5hbWU+TGlhbTwvZmlyc3RuYW1lPgorICAgIDxzdXJuYW1lPkdpcmR3b29kPC9zdXJuYW1lPgorICAgIDxhZmZpbGlhdGlvbj4KKyAgICAgPGFkZHJlc3M+CisgICAgICA8ZW1haWw+bHJnQHNsaW1sb2dpYy5jby51azwvZW1haWw+CisgICAgIDwvYWRkcmVzcz4KKyAgICA8L2FmZmlsaWF0aW9uPgorICAgPC9hdXRob3I+CisgICA8YXV0aG9yPgorICAgIDxmaXJzdG5hbWU+TWFyazwvZmlyc3RuYW1lPgorICAgIDxzdXJuYW1lPkJyb3duPC9zdXJuYW1lPgorICAgIDxhZmZpbGlhdGlvbj4KKyAgICAgPG9yZ25hbWU+V29sZnNvbiBNaWNyb2VsZWN0cm9uaWNzPC9vcmduYW1lPgorICAgICA8YWRkcmVzcz4KKyAgICAgIDxlbWFpbD5icm9vbmllQG9wZW5zb3VyY2Uud29sZnNvbm1pY3JvLmNvbTwvZW1haWw+CisgICAgIDwvYWRkcmVzcz4KKyAgICA8L2FmZmlsaWF0aW9uPgorICAgPC9hdXRob3I+CisgIDwvYXV0aG9yZ3JvdXA+CisKKyAgPGNvcHlyaWdodD4KKyAgIDx5ZWFyPjIwMDctMjAwODwveWVhcj4KKyAgIDxob2xkZXI+V29sZnNvbiBNaWNyb2VsZWN0cm9uaWNzPC9ob2xkZXI+CisgIDwvY29weXJpZ2h0PgorICA8Y29weXJpZ2h0PgorICAgPHllYXI+MjAwODwveWVhcj4KKyAgIDxob2xkZXI+TGlhbSBHaXJkd29vZDwvaG9sZGVyPgorICA8L2NvcHlyaWdodD4KKworICA8bGVnYWxub3RpY2U+CisgICA8cGFyYT4KKyAgICAgVGhpcyBkb2N1bWVudGF0aW9uIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlCisgICAgIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAgICAgTGljZW5zZSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgICA8L3BhcmE+CisKKyAgIDxwYXJhPgorICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlCisgICAgIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQKKyAgICAgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICAgICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgICA8L3BhcmE+CisKKyAgIDxwYXJhPgorICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICAgICBNQSAwMjExMS0xMzA3IFVTQQorICAgPC9wYXJhPgorCisgICA8cGFyYT4KKyAgICAgRm9yIG1vcmUgZGV0YWlscyBzZWUgdGhlIGZpbGUgQ09QWUlORyBpbiB0aGUgc291cmNlCisgICAgIGRpc3RyaWJ1dGlvbiBvZiBMaW51eC4KKyAgIDwvcGFyYT4KKyAgPC9sZWdhbG5vdGljZT4KKyA8L2Jvb2tpbmZvPgorCis8dG9jPjwvdG9jPgorCisgIDxjaGFwdGVyIGlkPSJpbnRybyI+CisgICAgPHRpdGxlPkludHJvZHVjdGlvbjwvdGl0bGU+CisgICAgPHBhcmE+CisJVGhpcyBmcmFtZXdvcmsgaXMgZGVzaWduZWQgdG8gcHJvdmlkZSBhIHN0YW5kYXJkIGtlcm5lbAorCWludGVyZmFjZSB0byBjb250cm9sIHZvbHRhZ2UgYW5kIGN1cnJlbnQgcmVndWxhdG9ycy4KKyAgICA8L3BhcmE+CisgICAgPHBhcmE+CisJVGhlIGludGVudGlvbiBpcyB0byBhbGxvdyBzeXN0ZW1zIHRvIGR5bmFtaWNhbGx5IGNvbnRyb2wKKwlyZWd1bGF0b3IgcG93ZXIgb3V0cHV0IGluIG9yZGVyIHRvIHNhdmUgcG93ZXIgYW5kIHByb2xvbmcKKwliYXR0ZXJ5IGxpZmUuICBUaGlzIGFwcGxpZXMgdG8gYm90aCB2b2x0YWdlIHJlZ3VsYXRvcnMgKHdoZXJlCisJdm9sdGFnZSBvdXRwdXQgaXMgY29udHJvbGxhYmxlKSBhbmQgY3VycmVudCBzaW5rcyAod2hlcmUgY3VycmVudAorCWxpbWl0IGlzIGNvbnRyb2xsYWJsZSkuCisgICAgPC9wYXJhPgorICAgIDxwYXJhPgorCU5vdGUgdGhhdCBhZGRpdGlvbmFsIChhbmQgY3VycmVudGx5IG1vcmUgY29tcGxldGUpIGRvY3VtZW50YXRpb24KKwlpcyBhdmFpbGFibGUgaW4gdGhlIExpbnV4IGtlcm5lbCBzb3VyY2UgdW5kZXIKKwk8ZmlsZW5hbWU+RG9jdW1lbnRhdGlvbi9wb3dlci9yZWd1bGF0b3I8L2ZpbGVuYW1lPi4KKyAgICA8L3BhcmE+CisKKyAgICA8c2VjdDEgaWQ9Imdsb3NzYXJ5Ij4KKyAgICAgICA8dGl0bGU+R2xvc3Nhcnk8L3RpdGxlPgorICAgICAgIDxwYXJhPgorCVRoZSByZWd1bGF0b3IgQVBJIHVzZXMgYSBudW1iZXIgb2YgdGVybXMgd2hpY2ggbWF5IG5vdCBiZQorCWZhbWlsaWFyOgorICAgICAgIDwvcGFyYT4KKyAgICAgICA8Z2xvc3Nhcnk+CisKKyAgICAgICAgIDxnbG9zc2VudHJ5PgorCSAgIDxnbG9zc3Rlcm0+UmVndWxhdG9yPC9nbG9zc3Rlcm0+CisJICAgPGdsb3NzZGVmPgorCSAgICAgPHBhcmE+CisJRWxlY3Ryb25pYyBkZXZpY2UgdGhhdCBzdXBwbGllcyBwb3dlciB0byBvdGhlciBkZXZpY2VzLiAgTW9zdAorCXJlZ3VsYXRvcnMgY2FuIGVuYWJsZSBhbmQgZGlzYWJsZSB0aGVpciBvdXRwdXQgYW5kIHNvbWUgY2FuIGFsc28KKwljb250cm9sIHRoZWlyIG91dHB1dCB2b2x0YWdlIG9yIGN1cnJlbnQuCisJICAgICA8L3BhcmE+CisJICAgPC9nbG9zc2RlZj4KKyAgICAgICAgIDwvZ2xvc3NlbnRyeT4KKworCSA8Z2xvc3NlbnRyeT4KKwkgICA8Z2xvc3N0ZXJtPkNvbnN1bWVyPC9nbG9zc3Rlcm0+CisJICAgPGdsb3NzZGVmPgorCSAgICAgPHBhcmE+CisJRWxlY3Ryb25pYyBkZXZpY2Ugd2hpY2ggY29uc3VtZXMgcG93ZXIgcHJvdmlkZWQgYnkgYSByZWd1bGF0b3IuCisJVGhlc2UgbWF5IGVpdGhlciBiZSBzdGF0aWMsIHJlcXVpcmluZyBvbmx5IGEgZml4ZWQgc3VwcGx5LCBvcgorCWR5bmFtaWMsIHJlcXVpcmluZyBhY3RpdmUgbWFuYWdlbWVudCBvZiB0aGUgcmVndWxhdG9yIGF0CisJcnVudGltZS4KKwkgICAgIDwvcGFyYT4KKwkgICA8L2dsb3NzZGVmPgorCSA8L2dsb3NzZW50cnk+CisKKwkgPGdsb3NzZW50cnk+CisJICAgPGdsb3NzdGVybT5Qb3dlciBEb21haW48L2dsb3NzdGVybT4KKwkgICA8Z2xvc3NkZWY+CisJICAgICA8cGFyYT4KKwlUaGUgZWxlY3Ryb25pYyBjaXJjdWl0IHN1cHBsaWVkIGJ5IGEgZ2l2ZW4gcmVndWxhdG9yLCBpbmNsdWRpbmcKKwl0aGUgcmVndWxhdG9yIGFuZCBhbGwgY29uc3VtZXIgZGV2aWNlcy4gIFRoZSBjb25maWd1cmF0aW9uIG9mCisJdGhlIHJlZ3VsYXRvciBpcyBzaGFyZWQgYmV0d2VlbiBhbGwgdGhlIGNvbXBvbmVudHMgaW4gdGhlCisJY2lyY3VpdC4KKwkgICAgIDwvcGFyYT4KKwkgICA8L2dsb3NzZGVmPgorCSA8L2dsb3NzZW50cnk+CisKKwkgPGdsb3NzZW50cnk+CisJICAgPGdsb3NzdGVybT5Qb3dlciBNYW5hZ2VtZW50IEludGVncmF0ZWQgQ2lyY3VpdDwvZ2xvc3N0ZXJtPgorCSAgIDxhY3JvbnltPlBNSUM8L2Fjcm9ueW0+CisJICAgPGdsb3NzZGVmPgorCSAgICAgPHBhcmE+CisJQW4gSUMgd2hpY2ggY29udGFpbnMgbnVtZXJvdXMgcmVndWxhdG9ycyBhbmQgb2Z0ZW4gYWxzbyBvdGhlcgorCXN1YnN5c3RlbXMuICBJbiBhbiBlbWJlZGRlZCBzeXN0ZW0gdGhlIHByaW1hcnkgUE1JQyBpcyBvZnRlbgorCWVxdWl2YWxlbnQgdG8gYSBjb21iaW5hdGlvbiBvZiB0aGUgUFNVIGFuZCBzb3V0aGJyaWRnZSBpbiBhCisJZGVza3RvcCBzeXN0ZW0uCisJICAgICA8L3BhcmE+CisJICAgPC9nbG9zc2RlZj4KKwkgPC9nbG9zc2VudHJ5PgorCTwvZ2xvc3Nhcnk+CisgICAgIDwvc2VjdDE+CisgIDwvY2hhcHRlcj4KKworICA8Y2hhcHRlciBpZD0iY29uc3VtZXIiPgorICAgICA8dGl0bGU+Q29uc3VtZXIgZHJpdmVyIGludGVyZmFjZTwvdGl0bGU+CisgICAgIDxwYXJhPgorICAgICAgIFRoaXMgb2ZmZXJzIGEgc2ltaWxhciBBUEkgdG8gdGhlIGtlcm5lbCBjbG9jayBmcmFtZXdvcmsuCisgICAgICAgQ29uc3VtZXIgZHJpdmVycyB1c2UgPGxpbmsKKyAgICAgICBsaW5rZW5kPSdBUEktcmVndWxhdG9yLWdldCc+Z2V0PC9saW5rPiBhbmQgPGxpbmsKKyAgICAgICBsaW5rZW5kPSdBUEktcmVndWxhdG9yLXB1dCc+cHV0PC9saW5rPiBvcGVyYXRpb25zIHRvIGFjcXVpcmUgYW5kCisgICAgICAgcmVsZWFzZSByZWd1bGF0b3JzLiAgRnVuY3Rpb25zIGFyZQorICAgICAgIHByb3ZpZGVkIHRvIDxsaW5rIGxpbmtlbmQ9J0FQSS1yZWd1bGF0b3ItZW5hYmxlJz5lbmFibGU8L2xpbms+CisgICAgICAgYW5kIDxsaW5rIGxpbmtlbmQ9J0FQSS1yZWd1bGF0b3ItZGlzYWJsZSc+ZGlzYWJsZTwvbGluaz4gdGhlCisgICAgICAgcmVndWF0b3IgYW5kIHRvIGdldCBhbmQgc2V0IHRoZSBydW50aW1lIHBhcmFtZXRlcnMgb2YgdGhlCisgICAgICAgcmVndWxhdG9yLgorICAgICA8L3BhcmE+CisgICAgIDxwYXJhPgorICAgICAgIFdoZW4gcmVxdWVzdGluZyByZWd1bGF0b3JzIGNvbnN1bWVycyB1c2Ugc3ltYm9saWMgbmFtZXMgZm9yIHRoZWlyCisgICAgICAgc3VwcGxpZXMsIHN1Y2ggYXMgIlZjYyIsIHdoaWNoIGFyZSBtYXBwZWQgaW50byBhY3R1YWwgcmVndWxhdG9yCisgICAgICAgZGV2aWNlcyBieSB0aGUgbWFjaGluZSBpbnRlcmZhY2UuCisgICAgIDwvcGFyYT4KKyAgICAgPHBhcmE+CisJQSBzdHViIHZlcnNpb24gb2YgdGhpcyBBUEkgaXMgcHJvdmlkZWQgd2hlbiB0aGUgcmVndWxhdG9yCisJZnJhbWV3b3JrIGlzIG5vdCBpbiB1c2UgaW4gb3JkZXIgdG8gbWluaW1pc2UgdGhlIG5lZWQgdG8gdXNlCisJaWZkZWZzLgorICAgICA8L3BhcmE+CisKKyAgICAgPHNlY3QxIGlkPSJjb25zdW1lci1lbmFibGUiPgorICAgICAgIDx0aXRsZT5FbmFibGluZyBhbmQgZGlzYWJsaW5nPC90aXRsZT4KKyAgICAgICA8cGFyYT4KKyAgICAgICAgIFRoZSByZWd1bGF0b3IgQVBJIHByb3ZpZGVzIHJlZmVyZW5jZSBjb3VudGVkIGVuYWJsaW5nIGFuZAorCSBkaXNhYmxpbmcgb2YgcmVndWxhdG9ycy4gQ29uc3VtZXIgZGV2aWNlcyB1c2UgdGhlIDxmdW5jdGlvbj48bGluaworCSBsaW5rZW5kPSdBUEktcmVndWxhdG9yLWVuYWJsZSc+cmVndWxhdG9yX2VuYWJsZTwvbGluaz48L2Z1bmN0aW9uPgorCSBhbmQgPGZ1bmN0aW9uPjxsaW5rCisJIGxpbmtlbmQ9J0FQSS1yZWd1bGF0b3ItZGlzYWJsZSc+cmVndWxhdG9yX2Rpc2FibGU8L2xpbms+CisJIDwvZnVuY3Rpb24+IGZ1bmN0aW9ucyB0byBlbmFibGUgYW5kIGRpc2FibGUgcmVndWxhdG9ycy4gIENhbGxzCisJIHRvIHRoZSB0d28gZnVuY3Rpb25zIG11c3QgYmUgYmFsYW5jZWQuCisgICAgICAgPC9wYXJhPgorICAgICAgIDxwYXJhPgorICAgICAgICAgTm90ZSB0aGF0IHNpbmNlIG11bHRpcGxlIGNvbnN1bWVycyBtYXkgYmUgdXNpbmcgYSByZWd1bGF0b3IgYW5kCisJIG1hY2hpbmUgY29uc3RyYWludHMgbWF5IG5vdCBhbGxvdyB0aGUgcmVndWxhdG9yIHRvIGJlIGRpc2FibGVkCisJIHRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGF0IGNhbGxpbmcKKwkgPGZ1bmN0aW9uPnJlZ3VsYXRvcl9kaXNhYmxlPC9mdW5jdGlvbj4gd2lsbCBhY3R1YWxseSBjYXVzZSB0aGUKKwkgc3VwcGx5IHByb3ZpZGVkIGJ5IHRoZSByZWd1bGF0b3IgdG8gYmUgZGlzYWJsZWQuIENvbnN1bWVyCisJIGRyaXZlcnMgc2hvdWxkIGFzc3VtZSB0aGF0IHRoZSByZWd1bGF0b3IgbWF5IGJlIGVuYWJsZWQgYXQgYWxsCisJIHRpbWVzLgorICAgICAgIDwvcGFyYT4KKyAgICAgPC9zZWN0MT4KKworICAgICA8c2VjdDEgaWQ9ImNvbnN1bWVyLWNvbmZpZyI+CisgICAgICAgPHRpdGxlPkNvbmZpZ3VyYXRpb248L3RpdGxlPgorICAgICAgIDxwYXJhPgorICAgICAgICAgU29tZSBjb25zdW1lciBkZXZpY2VzIG1heSBuZWVkIHRvIGJlIGFibGUgdG8gZHluYW1pY2FsbHkKKwkgY29uZmlndXJlIHRoZWlyIHN1cHBsaWVzLiAgRm9yIGV4YW1wbGUsIE1NQyBkcml2ZXJzIG1heSBuZWVkIHRvCisJIHNlbGVjdCB0aGUgY29ycmVjdCBvcGVyYXRpbmcgdm9sdGFnZSBmb3IgdGhlaXIgY2FyZHMuICBUaGlzIG1heQorCSBiZSBkb25lIHdoaWxlIHRoZSByZWd1bGF0b3IgaXMgZW5hYmxlZCBvciBkaXNhYmxlZC4KKyAgICAgICA8L3BhcmE+CisgICAgICAgPHBhcmE+CisJIFRoZSA8ZnVuY3Rpb24+PGxpbmsKKwkgbGlua2VuZD0nQVBJLXJlZ3VsYXRvci1zZXQtdm9sdGFnZSc+cmVndWxhdG9yX3NldF92b2x0YWdlPC9saW5rPgorCSA8L2Z1bmN0aW9uPiBhbmQgPGZ1bmN0aW9uPjxsaW5rCisJIGxpbmtlbmQ9J0FQSS1yZWd1bGF0b3Itc2V0LWN1cnJlbnQtbGltaXQnCisJID5yZWd1bGF0b3Jfc2V0X2N1cnJlbnRfbGltaXQ8L2xpbms+CisJIDwvZnVuY3Rpb24+IGZ1bmN0aW9ucyBwcm92aWRlIHRoZSBwcmltYXJ5IGludGVyZmFjZSBmb3IgdGhpcy4KKwkgQm90aCB0YWtlIHJhbmdlcyBvZiB2b2x0YWdlcyBhbmQgY3VycmVudHMsIHN1cHBvcnRpbmcgZHJpdmVycworCSB0aGF0IGRvIG5vdCByZXF1aXJlIGEgc3BlY2lmaWMgdmFsdWUgKGVnLCBDUFUgZnJlcXVlbmN5IHNjYWxpbmcKKwkgbm9ybWFsbHkgcGVybWl0cyB0aGUgQ1BVIHRvIHVzZSBhIHdpZGVyIHJhbmdlIG9mIHN1cHBseQorCSB2b2x0YWdlcyBhdCBsb3dlciBmcmVxdWVuY2llcyBidXQgZG9lcyBub3QgcmVxdWlyZSB0aGF0IHRoZQorCSBzdXBwbHkgdm9sdGFnZSBiZSBsb3dlcmVkKS4gIFdoZXJlIGFuIGV4YWN0IHZhbHVlIGlzIHJlcXVpcmVkCisJIGJvdGggbWluaW11bSBhbmQgbWF4aW11bSB2YWx1ZXMgc2hvdWxkIGJlIGlkZW50aWNhbC4KKyAgICAgICA8L3BhcmE+CisgICAgIDwvc2VjdDE+CisKKyAgICAgPHNlY3QxIGlkPSJjb25zdW1lci1jYWxsYmFjayI+CisgICAgICAgPHRpdGxlPkNhbGxiYWNrczwvdGl0bGU+CisgICAgICAgPHBhcmE+CisJICBDYWxsYmFja3MgbWF5IGFsc28gYmUgPGxpbmsKKwkgIGxpbmtlbmQ9J0FQSS1yZWd1bGF0b3ItcmVnaXN0ZXItbm90aWZpZXInPnJlZ2lzdGVyZWQ8L2xpbms+CisJICBmb3IgZXZlbnRzIHN1Y2ggYXMgcmVndWxhdGlvbiBmYWlsdXJlcy4KKyAgICAgICA8L3BhcmE+CisgICAgIDwvc2VjdDE+CisgICA8L2NoYXB0ZXI+CisKKyAgIDxjaGFwdGVyIGlkPSJkcml2ZXIiPgorICAgICA8dGl0bGU+UmVndWxhdG9yIGRyaXZlciBpbnRlcmZhY2U8L3RpdGxlPgorICAgICA8cGFyYT4KKyAgICAgICBEcml2ZXJzIGZvciByZWd1bGF0b3IgY2hpcHMgPGxpbmsKKyAgICAgICBsaW5rZW5kPSdBUEktcmVndWxhdG9yLXJlZ2lzdGVyJz5yZWdpc3RlcjwvbGluaz4gdGhlIHJlZ3VsYXRvcnMKKyAgICAgICB3aXRoIHRoZSByZWd1bGF0b3IgY29yZSwgcHJvdmlkaW5nIG9wZXJhdGlvbnMgc3RydWN0dXJlcyB0byB0aGUKKyAgICAgICBjb3JlLiAgQSA8bGluaworICAgICAgIGxpbmtlbmQ9J0FQSS1yZWd1bGF0b3Itbm90aWZpZXItY2FsbC1jaGFpbic+bm90aWZpZXI8L2xpbms+IGludGVyZmFjZQorICAgICAgIGFsbG93cyBlcnJvciBjb25kaXRpb25zIHRvIGJlIHJlcG9ydGVkIHRvIHRoZSBjb3JlLgorICAgICA8L3BhcmE+CisgICAgIDxwYXJhPgorICAgICAgIFJlZ2lzdHJhdGlvbiBzaG91bGQgYmUgdHJpZ2dlcmVkIGJ5IGV4cGxpY2l0IHNldHVwIGRvbmUgYnkgdGhlCisgICAgICAgcGxhdGZvcm0sIHN1cHBseWluZyBhIDxsaW5rCisgICAgICAgbGlua2VuZD0nQVBJLXN0cnVjdC1yZWd1bGF0b3ItaW5pdC1kYXRhJz5zdHJ1Y3QKKyAgICAgICByZWd1bGF0b3JfaW5pdF9kYXRhPC9saW5rPiBmb3IgdGhlIHJlZ3VsYXRvciBjb250YWluaW5nCisgICAgICAgPGxpbmsgbGlua2VuZD0nbWFjaGluZS1jb25zdHJhaW50Jz5jb25zdHJhaW50PC9saW5rPiBhbmQKKyAgICAgICA8bGluayBsaW5rZW5kPSdtYWNoaW5lLXN1cHBseSc+c3VwcGx5PC9saW5rPiBpbmZvcm1hdGlvbi4KKyAgICAgPC9wYXJhPgorICAgPC9jaGFwdGVyPgorCisgICA8Y2hhcHRlciBpZD0ibWFjaGluZSI+CisgICAgIDx0aXRsZT5NYWNoaW5lIGludGVyZmFjZTwvdGl0bGU+CisgICAgIDxwYXJhPgorICAgICAgIFRoaXMgaW50ZXJmYWNlIHByb3ZpZGVzIGEgd2F5IHRvIGRlZmluZSBob3cgcmVndWxhdG9ycyBhcmUKKyAgICAgICBjb25uZWN0ZWQgdG8gY29uc3VtZXJzIG9uIGEgZ2l2ZW4gc3lzdGVtIGFuZCB3aGF0IHRoZSB2YWxpZAorICAgICAgIG9wZXJhdGluZyBwYXJhbWV0ZXJzIGFyZSBmb3IgdGhlIHN5c3RlbS4KKyAgICAgPC9wYXJhPgorCisgICAgIDxzZWN0MSBpZD0ibWFjaGluZS1zdXBwbHkiPgorICAgICAgIDx0aXRsZT5TdXBwbGllczwvdGl0bGU+CisgICAgICAgPHBhcmE+CisgICAgICAgICBSZWd1bGF0b3Igc3VwcGxpZXMgYXJlIHNwZWNpZmllZCB1c2luZyA8bGluaworCSBsaW5rZW5kPSdBUEktc3RydWN0LXJlZ3VsYXRvci1jb25zdW1lci1zdXBwbHknPnN0cnVjdAorCSByZWd1bGF0b3JfY29uc3VtZXJfc3VwcGx5PC9saW5rPi4gIFRoaXMgaXMgZG9uZSBhdAorCSA8bGluayBsaW5rZW5kPSdkcml2ZXInPmRyaXZlciByZWdpc3RyYXRpb24KKwkgdGltZTwvbGluaz4gYXMgcGFydCBvZiB0aGUgbWFjaGluZSBjb25zdHJhaW50cy4KKyAgICAgICA8L3BhcmE+CisgICAgIDwvc2VjdDE+CisKKyAgICAgPHNlY3QxIGlkPSJtYWNoaW5lLWNvbnN0cmFpbnQiPgorICAgICAgIDx0aXRsZT5Db25zdHJhaW50czwvdGl0bGU+CisgICAgICAgPHBhcmE+CisJIEFzIHdlbGwgYXMgZGVmaW5pbmluZyB0aGUgY29ubmVjdGlvbnMgdGhlIG1hY2hpbmUgaW50ZXJmYWNlCisJIGFsc28gcHJvdmlkZXMgY29uc3RyYWludHMgZGVmaW5pbmluZyB0aGUgb3BlcmF0aW9ucyB0aGF0CisJIGNsaWVudHMgYXJlIGFsbG93ZWQgdG8gcGVyZm9ybSBhbmQgdGhlIHBhcmFtZXRlcnMgdGhhdCBtYXkgYmUKKwkgc2V0LiAgVGhpcyBpcyByZXF1aXJlZCBzaW5jZSBnZW5lcmFsbHkgcmVndWxhdG9yIGRldmljZXMgd2lsbAorCSBvZmZlciBtb3JlIGZsZXhpYmlsaXR5IHRoYW4gaXQgaXMgc2FmZSB0byB1c2Ugb24gYSBnaXZlbgorCSBzeXN0ZW0sIGZvciBleGFtcGxlIHN1cHBvcnRpbmcgaGlnaGVyIHN1cHBseSB2b2x0YWdlcyB0aGFuIHRoZQorCSBjb25zdW1lcnMgYXJlIHJhdGVkIGZvci4KKyAgICAgICA8L3BhcmE+CisgICAgICAgPHBhcmE+CisJIFRoaXMgaXMgZG9uZSBhdCA8bGluayBsaW5rZW5kPSdkcml2ZXInPmRyaXZlcgorCSByZWdpc3RyYXRpb24gdGltZTwvbGluaz4gYnkgcHJvdmlkaW5nIGEgPGxpbmsKKwkgbGlua2VuZD0nQVBJLXN0cnVjdC1yZWd1bGF0aW9uLWNvbnN0cmFpbnRzJz5zdHJ1Y3QKKwkgcmVndWxhdGlvbl9jb25zdHJhaW50czwvbGluaz4uCisgICAgICAgPC9wYXJhPgorICAgICAgIDxwYXJhPgorICAgICAgICAgVGhlIGNvbnN0cmFpbnRzIG1heSBhbHNvIHNwZWNpZnkgYW4gaW5pdGlhbCBjb25maWd1cmF0aW9uIGZvciB0aGUKKyAgICAgICAgIHJlZ3VsYXRvciBpbiB0aGUgY29uc3RyYWludHMsIHdoaWNoIGlzIHBhcnRpY3VsYXJseSB1c2VmdWwgZm9yCisgICAgICAgICB1c2Ugd2l0aCBzdGF0aWMgY29uc3VtZXJzLgorICAgICAgIDwvcGFyYT4KKyAgICAgPC9zZWN0MT4KKyAgPC9jaGFwdGVyPgorCisgIDxjaGFwdGVyIGlkPSJhcGkiPgorICAgIDx0aXRsZT5BUEkgcmVmZXJlbmNlPC90aXRsZT4KKyAgICA8cGFyYT4KKyAgICAgIER1ZSB0byBsaW1pdGF0aW9ucyBvZiB0aGUga2VybmVsIGRvY3VtZW50YXRpb24gZnJhbWV3b3JrIGFuZCB0aGUKKyAgICAgIGV4aXN0aW5nIGxheW91dCBvZiB0aGUgc291cmNlIGNvZGUgdGhlIGVudGlyZSByZWd1bGF0b3IgQVBJIGlzCisgICAgICBkb2N1bWVudGVkIGhlcmUuCisgICAgPC9wYXJhPgorIUlpbmNsdWRlL2xpbnV4L3JlZ3VsYXRvci9jb25zdW1lci5oCishSWluY2x1ZGUvbGludXgvcmVndWxhdG9yL21hY2hpbmUuaAorIUlpbmNsdWRlL2xpbnV4L3JlZ3VsYXRvci9kcml2ZXIuaAorIUVkcml2ZXJzL3JlZ3VsYXRvci9jb3JlLmMKKyAgPC9jaGFwdGVyPgorPC9ib29rPgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9QQ0kvcGNpLnR4dCBiL0RvY3VtZW50YXRpb24vUENJL3BjaS50eHQKaW5kZXggZmQ0OTA3YS4uN2Y2ZGU2ZSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9QQ0kvcGNpLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL1BDSS9wY2kudHh0CkBAIC0yOTQsNyArMjk0LDggQEAKIAogcGNpX3NldF9tYXN0ZXIoKSB3aWxsIGVuYWJsZSBETUEgYnkgc2V0dGluZyB0aGUgYnVzIG1hc3RlciBiaXQKIGluIHRoZSBQQ0lfQ09NTUFORCByZWdpc3Rlci4gSXQgYWxzbyBmaXhlcyB0aGUgbGF0ZW5jeSB0aW1lciB2YWx1ZSBpZgotaXQncyBzZXQgdG8gc29tZXRoaW5nIGJvZ3VzIGJ5IHRoZSBCSU9TLgoraXQncyBzZXQgdG8gc29tZXRoaW5nIGJvZ3VzIGJ5IHRoZSBCSU9TLiAgcGNpX2NsZWFyX21hc3RlcigpIHdpbGwKK2Rpc2FibGUgRE1BIGJ5IGNsZWFyaW5nIHRoZSBidXMgbWFzdGVyIGJpdC4KIAogSWYgdGhlIFBDSSBkZXZpY2UgY2FuIHVzZSB0aGUgUENJIE1lbW9yeS1Xcml0ZS1JbnZhbGlkYXRlIHRyYW5zYWN0aW9uLAogY2FsbCBwY2lfc2V0X213aSgpLiAgVGhpcyBlbmFibGVzIHRoZSBQQ0lfQ09NTUFORCBiaXQgZm9yIE1lbS1Xci1JbnZhbApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9SQ1UvMDAtSU5ERVggYi9Eb2N1bWVudGF0aW9uL1JDVS8wMC1JTkRFWAppbmRleCA3ZGMwNjk1Li45YmI2MmY3IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL1JDVS8wMC1JTkRFWAorKysgYi9Eb2N1bWVudGF0aW9uL1JDVS8wMC1JTkRFWApAQCAtMTIsNiArMTIsOCBAQAogCS0gUmVmZXJlbmNlLWNvdW50IGRlc2lnbiBmb3IgZWxlbWVudHMgb2YgbGlzdHMvYXJyYXlzIHByb3RlY3RlZCBieSBSQ1UKIHJjdS50eHQKIAktIFJDVSBDb25jZXB0cworcmN1YmFycmllci50eHQKKwktIFVubG9hZGluZyBtb2R1bGVzIHRoYXQgdXNlIFJDVSBjYWxsYmFja3MKIFJURlAudHh0CiAJLSBMaXN0IG9mIFJDVSBwYXBlcnMgKGJpYmxpb2dyYXBoeSkgZ29pbmcgYmFjayB0byAxOTgwLgogdG9ydHVyZS50eHQKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vUkNVL3JjdWJhcnJpZXIudHh0IGIvRG9jdW1lbnRhdGlvbi9SQ1UvcmN1YmFycmllci50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTA5NjAyZAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vUkNVL3JjdWJhcnJpZXIudHh0CkBAIC0wLDAgKzEsMzA0IEBACitSQ1UgYW5kIFVubG9hZGFibGUgTW9kdWxlcworCitbT3JpZ2luYWxseSBwdWJsaXNoZWQgaW4gTFdOIEphbi4gMTQsIDIwMDc6IGh0dHA6Ly9sd24ubmV0L0FydGljbGVzLzIxNzQ4NC9dCisKK1JDVSAocmVhZC1jb3B5IHVwZGF0ZSkgaXMgYSBzeW5jaHJvbml6YXRpb24gbWVjaGFuaXNtIHRoYXQgY2FuIGJlIHRob3VnaHQKK29mIGFzIGEgcmVwbGFjZW1lbnQgZm9yIHJlYWQtd3JpdGVyIGxvY2tpbmcgKGFtb25nIG90aGVyIHRoaW5ncyksIGJ1dCB3aXRoCit2ZXJ5IGxvdy1vdmVyaGVhZCByZWFkZXJzIHRoYXQgYXJlIGltbXVuZSB0byBkZWFkbG9jaywgcHJpb3JpdHkgaW52ZXJzaW9uLAorYW5kIHVuYm91bmRlZCBsYXRlbmN5LiBSQ1UgcmVhZC1zaWRlIGNyaXRpY2FsIHNlY3Rpb25zIGFyZSBkZWxpbWl0ZWQKK2J5IHJjdV9yZWFkX2xvY2soKSBhbmQgcmN1X3JlYWRfdW5sb2NrKCksIHdoaWNoLCBpbiBub24tQ09ORklHX1BSRUVNUFQKK2tlcm5lbHMsIGdlbmVyYXRlIG5vIGNvZGUgd2hhdHNvZXZlci4KKworVGhpcyBtZWFucyB0aGF0IFJDVSB3cml0ZXJzIGFyZSB1bmF3YXJlIG9mIHRoZSBwcmVzZW5jZSBvZiBjb25jdXJyZW50CityZWFkZXJzLCBzbyB0aGF0IFJDVSB1cGRhdGVzIHRvIHNoYXJlZCBkYXRhIG11c3QgYmUgdW5kZXJ0YWtlbiBxdWl0ZQorY2FyZWZ1bGx5LCBsZWF2aW5nIGFuIG9sZCB2ZXJzaW9uIG9mIHRoZSBkYXRhIHN0cnVjdHVyZSBpbiBwbGFjZSB1bnRpbCBhbGwKK3ByZS1leGlzdGluZyByZWFkZXJzIGhhdmUgZmluaXNoZWQuIFRoZXNlIG9sZCB2ZXJzaW9ucyBhcmUgbmVlZGVkIGJlY2F1c2UKK3N1Y2ggcmVhZGVycyBtaWdodCBob2xkIGEgcmVmZXJlbmNlIHRvIHRoZW0uIFJDVSB1cGRhdGVzIGNhbiB0aGVyZWZvcmUgYmUKK3JhdGhlciBleHBlbnNpdmUsIGFuZCBSQ1UgaXMgdGh1cyBiZXN0IHN1aXRlZCBmb3IgcmVhZC1tb3N0bHkgc2l0dWF0aW9ucy4KKworSG93IGNhbiBhbiBSQ1Ugd3JpdGVyIHBvc3NpYmx5IGRldGVybWluZSB3aGVuIGFsbCByZWFkZXJzIGFyZSBmaW5pc2hlZCwKK2dpdmVuIHRoYXQgcmVhZGVycyBtaWdodCB3ZWxsIGxlYXZlIGFic29sdXRlbHkgbm8gdHJhY2Ugb2YgdGhlaXIKK3ByZXNlbmNlPyBUaGVyZSBpcyBhIHN5bmNocm9uaXplX3JjdSgpIHByaW1pdGl2ZSB0aGF0IGJsb2NrcyB1bnRpbCBhbGwKK3ByZS1leGlzdGluZyByZWFkZXJzIGhhdmUgY29tcGxldGVkLiBBbiB1cGRhdGVyIHdpc2hpbmcgdG8gZGVsZXRlIGFuCitlbGVtZW50IHAgZnJvbSBhIGxpbmtlZCBsaXN0IG1pZ2h0IGRvIHRoZSBmb2xsb3dpbmcsIHdoaWxlIGhvbGRpbmcgYW4KK2FwcHJvcHJpYXRlIGxvY2ssIG9mIGNvdXJzZToKKworCWxpc3RfZGVsX3JjdShwKTsKKwlzeW5jaHJvbml6ZV9yY3UoKTsKKwlrZnJlZShwKTsKKworQnV0IHRoZSBhYm92ZSBjb2RlIGNhbm5vdCBiZSB1c2VkIGluIElSUSBjb250ZXh0IC0tIHRoZSBjYWxsX3JjdSgpCitwcmltaXRpdmUgbXVzdCBiZSB1c2VkIGluc3RlYWQuIFRoaXMgcHJpbWl0aXZlIHRha2VzIGEgcG9pbnRlciB0byBhbgorcmN1X2hlYWQgc3RydWN0IHBsYWNlZCB3aXRoaW4gdGhlIFJDVS1wcm90ZWN0ZWQgZGF0YSBzdHJ1Y3R1cmUgYW5kCithbm90aGVyIHBvaW50ZXIgdG8gYSBmdW5jdGlvbiB0aGF0IG1heSBiZSBpbnZva2VkIGxhdGVyIHRvIGZyZWUgdGhhdAorc3RydWN0dXJlLiBDb2RlIHRvIGRlbGV0ZSBhbiBlbGVtZW50IHAgZnJvbSB0aGUgbGlua2VkIGxpc3QgZnJvbSBJUlEKK2NvbnRleHQgbWlnaHQgdGhlbiBiZSBhcyBmb2xsb3dzOgorCisJbGlzdF9kZWxfcmN1KHApOworCWNhbGxfcmN1KCZwLT5yY3UsIHBfY2FsbGJhY2spOworCitTaW5jZSBjYWxsX3JjdSgpIG5ldmVyIGJsb2NrcywgdGhpcyBjb2RlIGNhbiBzYWZlbHkgYmUgdXNlZCBmcm9tIHdpdGhpbgorSVJRIGNvbnRleHQuIFRoZSBmdW5jdGlvbiBwX2NhbGxiYWNrKCkgbWlnaHQgYmUgZGVmaW5lZCBhcyBmb2xsb3dzOgorCisJc3RhdGljIHZvaWQgcF9jYWxsYmFjayhzdHJ1Y3QgcmN1X2hlYWQgKnJwKQorCXsKKwkJc3RydWN0IHBzdHJ1Y3QgKnAgPSBjb250YWluZXJfb2YocnAsIHN0cnVjdCBwc3RydWN0LCByY3UpOworCisJCWtmcmVlKHApOworCX0KKworCitVbmxvYWRpbmcgTW9kdWxlcyBUaGF0IFVzZSBjYWxsX3JjdSgpCisKK0J1dCB3aGF0IGlmIHBfY2FsbGJhY2sgaXMgZGVmaW5lZCBpbiBhbiB1bmxvYWRhYmxlIG1vZHVsZT8KKworSWYgd2UgdW5sb2FkIHRoZSBtb2R1bGUgd2hpbGUgc29tZSBSQ1UgY2FsbGJhY2tzIGFyZSBwZW5kaW5nLAordGhlIENQVXMgZXhlY3V0aW5nIHRoZXNlIGNhbGxiYWNrcyBhcmUgZ29pbmcgdG8gYmUgc2V2ZXJlbHkKK2Rpc2FwcG9pbnRlZCB3aGVuIHRoZXkgYXJlIGxhdGVyIGludm9rZWQsIGFzIGZhbmNpZnVsbHkgZGVwaWN0ZWQgYXQKK2h0dHA6Ly9sd24ubmV0L2ltYWdlcy9ucy9rZXJuZWwvcmN1LWRyb3AuanBnLgorCitXZSBjb3VsZCB0cnkgcGxhY2luZyBhIHN5bmNocm9uaXplX3JjdSgpIGluIHRoZSBtb2R1bGUtZXhpdCBjb2RlIHBhdGgsCitidXQgdGhpcyBpcyBub3Qgc3VmZmljaWVudC4gQWx0aG91Z2ggc3luY2hyb25pemVfcmN1KCkgZG9lcyB3YWl0IGZvciBhCitncmFjZSBwZXJpb2QgdG8gZWxhcHNlLCBpdCBkb2VzIG5vdCB3YWl0IGZvciB0aGUgY2FsbGJhY2tzIHRvIGNvbXBsZXRlLgorCitPbmUgbWlnaHQgYmUgdGVtcHRlZCB0byB0cnkgc2V2ZXJhbCBiYWNrLXRvLWJhY2sgc3luY2hyb25pemVfcmN1KCkKK2NhbGxzLCBidXQgdGhpcyBpcyBzdGlsbCBub3QgZ3VhcmFudGVlZCB0byB3b3JrLiBJZiB0aGVyZSBpcyBhIHZlcnkKK2hlYXZ5IFJDVS1jYWxsYmFjayBsb2FkLCB0aGVuIHNvbWUgb2YgdGhlIGNhbGxiYWNrcyBtaWdodCBiZSBkZWZlcnJlZAoraW4gb3JkZXIgdG8gYWxsb3cgb3RoZXIgcHJvY2Vzc2luZyB0byBwcm9jZWVkLiBTdWNoIGRlZmVycmFsIGlzIHJlcXVpcmVkCitpbiByZWFsdGltZSBrZXJuZWxzIGluIG9yZGVyIHRvIGF2b2lkIGV4Y2Vzc2l2ZSBzY2hlZHVsaW5nIGxhdGVuY2llcy4KKworCityY3VfYmFycmllcigpCisKK1dlIGluc3RlYWQgbmVlZCB0aGUgcmN1X2JhcnJpZXIoKSBwcmltaXRpdmUuIFRoaXMgcHJpbWl0aXZlIGlzIHNpbWlsYXIKK3RvIHN5bmNocm9uaXplX3JjdSgpLCBidXQgaW5zdGVhZCBvZiB3YWl0aW5nIHNvbGVseSBmb3IgYSBncmFjZQorcGVyaW9kIHRvIGVsYXBzZSwgaXQgYWxzbyB3YWl0cyBmb3IgYWxsIG91dHN0YW5kaW5nIFJDVSBjYWxsYmFja3MgdG8KK2NvbXBsZXRlLiBQc2V1ZG8tY29kZSB1c2luZyByY3VfYmFycmllcigpIGlzIGFzIGZvbGxvd3M6CisKKyAgIDEuIFByZXZlbnQgYW55IG5ldyBSQ1UgY2FsbGJhY2tzIGZyb20gYmVpbmcgcG9zdGVkLgorICAgMi4gRXhlY3V0ZSByY3VfYmFycmllcigpLgorICAgMy4gQWxsb3cgdGhlIG1vZHVsZSB0byBiZSB1bmxvYWRlZC4KKworUXVpY2sgUXVpeiAjMTogV2h5IGlzIHRoZXJlIG5vIHNyY3VfYmFycmllcigpPworCitUaGUgcmN1dG9ydHVyZSBtb2R1bGUgbWFrZXMgdXNlIG9mIHJjdV9iYXJyaWVyIGluIGl0cyBleGl0IGZ1bmN0aW9uCithcyBmb2xsb3dzOgorCisgMSBzdGF0aWMgdm9pZAorIDIgcmN1X3RvcnR1cmVfY2xlYW51cCh2b2lkKQorIDMgeworIDQgICBpbnQgaTsKKyA1CisgNiAgIGZ1bGxzdG9wID0gMTsKKyA3ICAgaWYgKHNodWZmbGVyX3Rhc2sgIT0gTlVMTCkgeworIDggICAgIFZFUkJPU0VfUFJJTlRLX1NUUklORygiU3RvcHBpbmcgcmN1X3RvcnR1cmVfc2h1ZmZsZSB0YXNrIik7CisgOSAgICAga3RocmVhZF9zdG9wKHNodWZmbGVyX3Rhc2spOworMTAgICB9CisxMSAgIHNodWZmbGVyX3Rhc2sgPSBOVUxMOworMTIKKzEzICAgaWYgKHdyaXRlcl90YXNrICE9IE5VTEwpIHsKKzE0ICAgICBWRVJCT1NFX1BSSU5US19TVFJJTkcoIlN0b3BwaW5nIHJjdV90b3J0dXJlX3dyaXRlciB0YXNrIik7CisxNSAgICAga3RocmVhZF9zdG9wKHdyaXRlcl90YXNrKTsKKzE2ICAgfQorMTcgICB3cml0ZXJfdGFzayA9IE5VTEw7CisxOAorMTkgICBpZiAocmVhZGVyX3Rhc2tzICE9IE5VTEwpIHsKKzIwICAgICBmb3IgKGkgPSAwOyBpIDwgbnJlYWxyZWFkZXJzOyBpKyspIHsKKzIxICAgICAgIGlmIChyZWFkZXJfdGFza3NbaV0gIT0gTlVMTCkgeworMjIgICAgICAgICBWRVJCT1NFX1BSSU5US19TVFJJTkcoCisyMyAgICAgICAgICAgIlN0b3BwaW5nIHJjdV90b3J0dXJlX3JlYWRlciB0YXNrIik7CisyNCAgICAgICAgIGt0aHJlYWRfc3RvcChyZWFkZXJfdGFza3NbaV0pOworMjUgICAgICAgfQorMjYgICAgICAgcmVhZGVyX3Rhc2tzW2ldID0gTlVMTDsKKzI3ICAgICB9CisyOCAgICAga2ZyZWUocmVhZGVyX3Rhc2tzKTsKKzI5ICAgICByZWFkZXJfdGFza3MgPSBOVUxMOworMzAgICB9CiszMSAgIHJjdV90b3J0dXJlX2N1cnJlbnQgPSBOVUxMOworMzIKKzMzICAgaWYgKGZha2V3cml0ZXJfdGFza3MgIT0gTlVMTCkgeworMzQgICAgIGZvciAoaSA9IDA7IGkgPCBuZmFrZXdyaXRlcnM7IGkrKykgeworMzUgICAgICAgaWYgKGZha2V3cml0ZXJfdGFza3NbaV0gIT0gTlVMTCkgeworMzYgICAgICAgICBWRVJCT1NFX1BSSU5US19TVFJJTkcoCiszNyAgICAgICAgICAgIlN0b3BwaW5nIHJjdV90b3J0dXJlX2Zha2V3cml0ZXIgdGFzayIpOworMzggICAgICAgICBrdGhyZWFkX3N0b3AoZmFrZXdyaXRlcl90YXNrc1tpXSk7CiszOSAgICAgICB9Cis0MCAgICAgICBmYWtld3JpdGVyX3Rhc2tzW2ldID0gTlVMTDsKKzQxICAgICB9Cis0MiAgICAga2ZyZWUoZmFrZXdyaXRlcl90YXNrcyk7Cis0MyAgICAgZmFrZXdyaXRlcl90YXNrcyA9IE5VTEw7Cis0NCAgIH0KKzQ1Cis0NiAgIGlmIChzdGF0c190YXNrICE9IE5VTEwpIHsKKzQ3ICAgICBWRVJCT1NFX1BSSU5US19TVFJJTkcoIlN0b3BwaW5nIHJjdV90b3J0dXJlX3N0YXRzIHRhc2siKTsKKzQ4ICAgICBrdGhyZWFkX3N0b3Aoc3RhdHNfdGFzayk7Cis0OSAgIH0KKzUwICAgc3RhdHNfdGFzayA9IE5VTEw7Cis1MQorNTIgICAvKiBXYWl0IGZvciBhbGwgUkNVIGNhbGxiYWNrcyB0byBmaXJlLiAqLworNTMgICByY3VfYmFycmllcigpOworNTQKKzU1ICAgcmN1X3RvcnR1cmVfc3RhdHNfcHJpbnQoKTsgLyogLUFmdGVyLSB0aGUgc3RhdHMgdGhyZWFkIGlzIHN0b3BwZWQhICovCis1NgorNTcgICBpZiAoY3VyX29wcy0+Y2xlYW51cCAhPSBOVUxMKQorNTggICAgIGN1cl9vcHMtPmNsZWFudXAoKTsKKzU5ICAgaWYgKGF0b21pY19yZWFkKCZuX3JjdV90b3J0dXJlX2Vycm9yKSkKKzYwICAgICByY3VfdG9ydHVyZV9wcmludF9tb2R1bGVfcGFybXMoIkVuZCBvZiB0ZXN0OiBGQUlMVVJFIik7Cis2MSAgIGVsc2UKKzYyICAgICByY3VfdG9ydHVyZV9wcmludF9tb2R1bGVfcGFybXMoIkVuZCBvZiB0ZXN0OiBTVUNDRVNTIik7Cis2MyB9CisKK0xpbmUgNiBzZXRzIGEgZ2xvYmFsIHZhcmlhYmxlIHRoYXQgcHJldmVudHMgYW55IFJDVSBjYWxsYmFja3MgZnJvbQorcmUtcG9zdGluZyB0aGVtc2VsdmVzLiBUaGlzIHdpbGwgbm90IGJlIG5lY2Vzc2FyeSBpbiBtb3N0IGNhc2VzLCBzaW5jZQorUkNVIGNhbGxiYWNrcyByYXJlbHkgaW5jbHVkZSBjYWxscyB0byBjYWxsX3JjdSgpLiBIb3dldmVyLCB0aGUgcmN1dG9ydHVyZQorbW9kdWxlIGlzIGFuIGV4Y2VwdGlvbiB0byB0aGlzIHJ1bGUsIGFuZCB0aGVyZWZvcmUgbmVlZHMgdG8gc2V0IHRoaXMKK2dsb2JhbCB2YXJpYWJsZS4KKworTGluZXMgNy01MCBzdG9wIGFsbCB0aGUga2VybmVsIHRhc2tzIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmN1dG9ydHVyZQorbW9kdWxlLiBUaGVyZWZvcmUsIG9uY2UgZXhlY3V0aW9uIHJlYWNoZXMgbGluZSA1Mywgbm8gbW9yZSByY3V0b3J0dXJlCitSQ1UgY2FsbGJhY2tzIHdpbGwgYmUgcG9zdGVkLiBUaGUgcmN1X2JhcnJpZXIoKSBjYWxsIG9uIGxpbmUgNTMgd2FpdHMKK2ZvciBhbnkgcHJlLWV4aXN0aW5nIGNhbGxiYWNrcyB0byBjb21wbGV0ZS4KKworVGhlbiBsaW5lcyA1NS02MiBwcmludCBzdGF0dXMgYW5kIGRvIG9wZXJhdGlvbi1zcGVjaWZpYyBjbGVhbnVwLCBhbmQKK3RoZW4gcmV0dXJuLCBwZXJtaXR0aW5nIHRoZSBtb2R1bGUtdW5sb2FkIG9wZXJhdGlvbiB0byBiZSBjb21wbGV0ZWQuCisKK1F1aWNrIFF1aXogIzI6IElzIHRoZXJlIGFueSBvdGhlciBzaXR1YXRpb24gd2hlcmUgcmN1X2JhcnJpZXIoKSBtaWdodAorCWJlIHJlcXVpcmVkPworCitZb3VyIG1vZHVsZSBtaWdodCBoYXZlIGFkZGl0aW9uYWwgY29tcGxpY2F0aW9ucy4gRm9yIGV4YW1wbGUsIGlmIHlvdXIKK21vZHVsZSBpbnZva2VzIGNhbGxfcmN1KCkgZnJvbSB0aW1lcnMsIHlvdSB3aWxsIG5lZWQgdG8gZmlyc3QgY2FuY2VsIGFsbAordGhlIHRpbWVycywgYW5kIG9ubHkgdGhlbiBpbnZva2UgcmN1X2JhcnJpZXIoKSB0byB3YWl0IGZvciBhbnkgcmVtYWluaW5nCitSQ1UgY2FsbGJhY2tzIHRvIGNvbXBsZXRlLgorCisKK0ltcGxlbWVudGluZyByY3VfYmFycmllcigpCisKK0RpcGFua2FyIFNhcm1hJ3MgaW1wbGVtZW50YXRpb24gb2YgcmN1X2JhcnJpZXIoKSBtYWtlcyB1c2Ugb2YgdGhlIGZhY3QKK3RoYXQgUkNVIGNhbGxiYWNrcyBhcmUgbmV2ZXIgcmVvcmRlcmVkIG9uY2UgcXVldWVkIG9uIG9uZSBvZiB0aGUgcGVyLUNQVQorcXVldWVzLiBIaXMgaW1wbGVtZW50YXRpb24gcXVldWVzIGFuIFJDVSBjYWxsYmFjayBvbiBlYWNoIG9mIHRoZSBwZXItQ1BVCitjYWxsYmFjayBxdWV1ZXMsIGFuZCB0aGVuIHdhaXRzIHVudGlsIHRoZXkgaGF2ZSBhbGwgc3RhcnRlZCBleGVjdXRpbmcsIGF0Cit3aGljaCBwb2ludCwgYWxsIGVhcmxpZXIgUkNVIGNhbGxiYWNrcyBhcmUgZ3VhcmFudGVlZCB0byBoYXZlIGNvbXBsZXRlZC4KKworVGhlIG9yaWdpbmFsIGNvZGUgZm9yIHJjdV9iYXJyaWVyKCkgd2FzIGFzIGZvbGxvd3M6CisKKyAxIHZvaWQgcmN1X2JhcnJpZXIodm9pZCkKKyAyIHsKKyAzICAgQlVHX09OKGluX2ludGVycnVwdCgpKTsKKyA0ICAgLyogVGFrZSBjcHVjb250cm9sIG11dGV4IHRvIHByb3RlY3QgYWdhaW5zdCBDUFUgaG90cGx1ZyAqLworIDUgICBtdXRleF9sb2NrKCZyY3VfYmFycmllcl9tdXRleCk7CisgNiAgIGluaXRfY29tcGxldGlvbigmcmN1X2JhcnJpZXJfY29tcGxldGlvbik7CisgNyAgIGF0b21pY19zZXQoJnJjdV9iYXJyaWVyX2NwdV9jb3VudCwgMCk7CisgOCAgIG9uX2VhY2hfY3B1KHJjdV9iYXJyaWVyX2Z1bmMsIE5VTEwsIDAsIDEpOworIDkgICB3YWl0X2Zvcl9jb21wbGV0aW9uKCZyY3VfYmFycmllcl9jb21wbGV0aW9uKTsKKzEwICAgbXV0ZXhfdW5sb2NrKCZyY3VfYmFycmllcl9tdXRleCk7CisxMSB9CisKK0xpbmUgMyB2ZXJpZmllcyB0aGF0IHRoZSBjYWxsZXIgaXMgaW4gcHJvY2VzcyBjb250ZXh0LCBhbmQgbGluZXMgNSBhbmQgMTAKK3VzZSByY3VfYmFycmllcl9tdXRleCB0byBlbnN1cmUgdGhhdCBvbmx5IG9uZSByY3VfYmFycmllcigpIGlzIHVzaW5nIHRoZQorZ2xvYmFsIGNvbXBsZXRpb24gYW5kIGNvdW50ZXJzIGF0IGEgdGltZSwgd2hpY2ggYXJlIGluaXRpYWxpemVkIG9uIGxpbmVzCis2IGFuZCA3LiBMaW5lIDggY2F1c2VzIGVhY2ggQ1BVIHRvIGludm9rZSByY3VfYmFycmllcl9mdW5jKCksIHdoaWNoIGlzCitzaG93biBiZWxvdy4gTm90ZSB0aGF0IHRoZSBmaW5hbCAiMSIgaW4gb25fZWFjaF9jcHUoKSdzIGFyZ3VtZW50IGxpc3QKK2Vuc3VyZXMgdGhhdCBhbGwgdGhlIGNhbGxzIHRvIHJjdV9iYXJyaWVyX2Z1bmMoKSB3aWxsIGhhdmUgY29tcGxldGVkCitiZWZvcmUgb25fZWFjaF9jcHUoKSByZXR1cm5zLiBMaW5lIDkgdGhlbiB3YWl0cyBmb3IgdGhlIGNvbXBsZXRpb24uCisKK1RoaXMgY29kZSB3YXMgcmV3cml0dGVuIGluIDIwMDggdG8gc3VwcG9ydCByY3VfYmFycmllcl9iaCgpIGFuZAorcmN1X2JhcnJpZXJfc2NoZWQoKSBpbiBhZGRpdGlvbiB0byB0aGUgb3JpZ2luYWwgcmN1X2JhcnJpZXIoKS4KKworVGhlIHJjdV9iYXJyaWVyX2Z1bmMoKSBydW5zIG9uIGVhY2ggQ1BVLCB3aGVyZSBpdCBpbnZva2VzIGNhbGxfcmN1KCkKK3RvIHBvc3QgYW4gUkNVIGNhbGxiYWNrLCBhcyBmb2xsb3dzOgorCisgMSBzdGF0aWMgdm9pZCByY3VfYmFycmllcl9mdW5jKHZvaWQgKm5vdHVzZWQpCisgMiB7CisgMyBpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOworIDQgc3RydWN0IHJjdV9kYXRhICpyZHAgPSAmcGVyX2NwdShyY3VfZGF0YSwgY3B1KTsKKyA1IHN0cnVjdCByY3VfaGVhZCAqaGVhZDsKKyA2CisgNyBoZWFkID0gJnJkcC0+YmFycmllcjsKKyA4IGF0b21pY19pbmMoJnJjdV9iYXJyaWVyX2NwdV9jb3VudCk7CisgOSBjYWxsX3JjdShoZWFkLCByY3VfYmFycmllcl9jYWxsYmFjayk7CisxMCB9CisKK0xpbmVzIDMgYW5kIDQgbG9jYXRlIFJDVSdzIGludGVybmFsIHBlci1DUFUgcmN1X2RhdGEgc3RydWN0dXJlLAord2hpY2ggY29udGFpbnMgdGhlIHN0cnVjdCByY3VfaGVhZCB0aGF0IG5lZWRlZCBmb3IgdGhlIGxhdGVyIGNhbGwgdG8KK2NhbGxfcmN1KCkuIExpbmUgNyBwaWNrcyB1cCBhIHBvaW50ZXIgdG8gdGhpcyBzdHJ1Y3QgcmN1X2hlYWQsIGFuZCBsaW5lCis4IGluY3JlbWVudHMgYSBnbG9iYWwgY291bnRlci4gVGhpcyBjb3VudGVyIHdpbGwgbGF0ZXIgYmUgZGVjcmVtZW50ZWQKK2J5IHRoZSBjYWxsYmFjay4gTGluZSA5IHRoZW4gcmVnaXN0ZXJzIHRoZSByY3VfYmFycmllcl9jYWxsYmFjaygpIG9uCit0aGUgY3VycmVudCBDUFUncyBxdWV1ZS4KKworVGhlIHJjdV9iYXJyaWVyX2NhbGxiYWNrKCkgZnVuY3Rpb24gc2ltcGx5IGF0b21pY2FsbHkgZGVjcmVtZW50cyB0aGUKK3JjdV9iYXJyaWVyX2NwdV9jb3VudCB2YXJpYWJsZSBhbmQgZmluYWxpemVzIHRoZSBjb21wbGV0aW9uIHdoZW4gaXQKK3JlYWNoZXMgemVybywgYXMgZm9sbG93czoKKworIDEgc3RhdGljIHZvaWQgcmN1X2JhcnJpZXJfY2FsbGJhY2soc3RydWN0IHJjdV9oZWFkICpub3R1c2VkKQorIDIgeworIDMgaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJnJjdV9iYXJyaWVyX2NwdV9jb3VudCkpCisgNCBjb21wbGV0ZSgmcmN1X2JhcnJpZXJfY29tcGxldGlvbik7CisgNSB9CisKK1F1aWNrIFF1aXogIzM6IFdoYXQgaGFwcGVucyBpZiBDUFUgMCdzIHJjdV9iYXJyaWVyX2Z1bmMoKSBleGVjdXRlcworCWltbWVkaWF0ZWx5ICh0aHVzIGluY3JlbWVudGluZyByY3VfYmFycmllcl9jcHVfY291bnQgdG8gdGhlCisJdmFsdWUgb25lKSwgYnV0IHRoZSBvdGhlciBDUFUncyByY3VfYmFycmllcl9mdW5jKCkgaW52b2NhdGlvbnMKKwlhcmUgZGVsYXllZCBmb3IgYSBmdWxsIGdyYWNlIHBlcmlvZD8gQ291bGRuJ3QgdGhpcyByZXN1bHQgaW4KKwlyY3VfYmFycmllcigpIHJldHVybmluZyBwcmVtYXR1cmVseT8KKworCityY3VfYmFycmllcigpIFN1bW1hcnkKKworVGhlIHJjdV9iYXJyaWVyKCkgcHJpbWl0aXZlIGhhcyBzZWVuIHJlbGF0aXZlbHkgbGl0dGxlIHVzZSwgc2luY2UgbW9zdAorY29kZSB1c2luZyBSQ1UgaXMgaW4gdGhlIGNvcmUga2VybmVsIHJhdGhlciB0aGFuIGluIG1vZHVsZXMuIEhvd2V2ZXIsIGlmCit5b3UgYXJlIHVzaW5nIFJDVSBmcm9tIGFuIHVubG9hZGFibGUgbW9kdWxlLCB5b3UgbmVlZCB0byB1c2UgcmN1X2JhcnJpZXIoKQorc28gdGhhdCB5b3VyIG1vZHVsZSBtYXkgYmUgc2FmZWx5IHVubG9hZGVkLgorCisKK0Fuc3dlcnMgdG8gUXVpY2sgUXVpenplcworCitRdWljayBRdWl6ICMxOiBXaHkgaXMgdGhlcmUgbm8gc3JjdV9iYXJyaWVyKCk/CisKK0Fuc3dlcjogU2luY2UgdGhlcmUgaXMgbm8gY2FsbF9zcmN1KCksIHRoZXJlIGNhbiBiZSBubyBvdXRzdGFuZGluZyBTUkNVCisJY2FsbGJhY2tzLiBUaGVyZWZvcmUsIHRoZXJlIGlzIG5vIG5lZWQgdG8gd2FpdCBmb3IgdGhlbS4KKworUXVpY2sgUXVpeiAjMjogSXMgdGhlcmUgYW55IG90aGVyIHNpdHVhdGlvbiB3aGVyZSByY3VfYmFycmllcigpIG1pZ2h0CisJYmUgcmVxdWlyZWQ/CisKK0Fuc3dlcjogSW50ZXJlc3RpbmdseSBlbm91Z2gsIHJjdV9iYXJyaWVyKCkgd2FzIG5vdCBvcmlnaW5hbGx5CisJaW1wbGVtZW50ZWQgZm9yIG1vZHVsZSB1bmxvYWRpbmcuIE5pa2l0YSBEYW5pbG92IHdhcyB1c2luZworCVJDVSBpbiBhIGZpbGVzeXN0ZW0sIHdoaWNoIHJlc3VsdGVkIGluIGEgc2ltaWxhciBzaXR1YXRpb24gYXQKKwlmaWxlc3lzdGVtLXVubW91bnQgdGltZS4gRGlwYW5rYXIgU2FybWEgY29kZWQgdXAgcmN1X2JhcnJpZXIoKQorCWluIHJlc3BvbnNlLCBzbyB0aGF0IE5pa2l0YSBjb3VsZCBpbnZva2UgaXQgZHVyaW5nIHRoZQorCWZpbGVzeXN0ZW0tdW5tb3VudCBwcm9jZXNzLgorCisJTXVjaCBsYXRlciwgeW91cnMgdHJ1bHkgaGl0IHRoZSBSQ1UgbW9kdWxlLXVubG9hZCBwcm9ibGVtIHdoZW4KKwlpbXBsZW1lbnRpbmcgcmN1dG9ydHVyZSwgYW5kIGZvdW5kIHRoYXQgcmN1X2JhcnJpZXIoKSBzb2x2ZXMKKwl0aGlzIHByb2JsZW0gYXMgd2VsbC4KKworUXVpY2sgUXVpeiAjMzogV2hhdCBoYXBwZW5zIGlmIENQVSAwJ3MgcmN1X2JhcnJpZXJfZnVuYygpIGV4ZWN1dGVzCisJaW1tZWRpYXRlbHkgKHRodXMgaW5jcmVtZW50aW5nIHJjdV9iYXJyaWVyX2NwdV9jb3VudCB0byB0aGUKKwl2YWx1ZSBvbmUpLCBidXQgdGhlIG90aGVyIENQVSdzIHJjdV9iYXJyaWVyX2Z1bmMoKSBpbnZvY2F0aW9ucworCWFyZSBkZWxheWVkIGZvciBhIGZ1bGwgZ3JhY2UgcGVyaW9kPyBDb3VsZG4ndCB0aGlzIHJlc3VsdCBpbgorCXJjdV9iYXJyaWVyKCkgcmV0dXJuaW5nIHByZW1hdHVyZWx5PworCitBbnN3ZXI6IFRoaXMgY2Fubm90IGhhcHBlbi4gVGhlIHJlYXNvbiBpcyB0aGF0IG9uX2VhY2hfY3B1KCkgaGFzIGl0cyBsYXN0CisJYXJndW1lbnQsIHRoZSB3YWl0IGZsYWcsIHNldCB0byAiMSIuIFRoaXMgZmxhZyBpcyBwYXNzZWQgdGhyb3VnaAorCXRvIHNtcF9jYWxsX2Z1bmN0aW9uKCkgYW5kIGZ1cnRoZXIgdG8gc21wX2NhbGxfZnVuY3Rpb25fb25fY3B1KCksCisJY2F1c2luZyB0aGlzIGxhdHRlciB0byBzcGluIHVudGlsIHRoZSBjcm9zcy1DUFUgaW52b2NhdGlvbiBvZgorCXJjdV9iYXJyaWVyX2Z1bmMoKSBoYXMgY29tcGxldGVkLiBUaGlzIGJ5IGl0c2VsZiB3b3VsZCBwcmV2ZW50CisJYSBncmFjZSBwZXJpb2QgZnJvbSBjb21wbGV0aW5nIG9uIG5vbi1DT05GSUdfUFJFRU1QVCBrZXJuZWxzLAorCXNpbmNlIGVhY2ggQ1BVIG11c3QgdW5kZXJnbyBhIGNvbnRleHQgc3dpdGNoIChvciBvdGhlciBxdWllc2NlbnQKKwlzdGF0ZSkgYmVmb3JlIHRoZSBncmFjZSBwZXJpb2QgY2FuIGNvbXBsZXRlLiBIb3dldmVyLCB0aGlzIGlzCisJb2Ygbm8gdXNlIGluIENPTkZJR19QUkVFTVBUIGtlcm5lbHMuCisKKwlUaGVyZWZvcmUsIG9uX2VhY2hfY3B1KCkgZGlzYWJsZXMgcHJlZW1wdGlvbiBhY3Jvc3MgaXRzIGNhbGwKKwl0byBzbXBfY2FsbF9mdW5jdGlvbigpIGFuZCBhbHNvIGFjcm9zcyB0aGUgbG9jYWwgY2FsbCB0bworCXJjdV9iYXJyaWVyX2Z1bmMoKS4gVGhpcyBwcmV2ZW50cyB0aGUgbG9jYWwgQ1BVIGZyb20gY29udGV4dAorCXN3aXRjaGluZywgYWdhaW4gcHJldmVudGluZyBncmFjZSBwZXJpb2RzIGZyb20gY29tcGxldGluZy4gVGhpcworCW1lYW5zIHRoYXQgYWxsIENQVXMgaGF2ZSBleGVjdXRlZCByY3VfYmFycmllcl9mdW5jKCkgYmVmb3JlCisJdGhlIGZpcnN0IHJjdV9iYXJyaWVyX2NhbGxiYWNrKCkgY2FuIHBvc3NpYmx5IGV4ZWN1dGUsIGluIHR1cm4KKwlwcmV2ZW50aW5nIHJjdV9iYXJyaWVyX2NwdV9jb3VudCBmcm9tIHByZW1hdHVyZWx5IHJlYWNoaW5nIHplcm8uCisKKwlDdXJyZW50bHksIC1ydCBpbXBsZW1lbnRhdGlvbnMgb2YgUkNVIGtlZXAgYnV0IGEgc2luZ2xlIGdsb2JhbAorCXF1ZXVlIGZvciBSQ1UgY2FsbGJhY2tzLCBhbmQgdGh1cyBkbyBub3Qgc3VmZmVyIGZyb20gdGhpcworCXByb2JsZW0uIEhvd2V2ZXIsIHdoZW4gdGhlIC1ydCBSQ1UgZXZlbnR1YWxseSBkb2VzIGhhdmUgcGVyLUNQVQorCWNhbGxiYWNrIHF1ZXVlcywgdGhpbmdzIHdpbGwgaGF2ZSB0byBjaGFuZ2UuIE9uZSBzaW1wbGUgY2hhbmdlCisJaXMgdG8gYWRkIGFuIHJjdV9yZWFkX2xvY2soKSBiZWZvcmUgbGluZSA4IG9mIHJjdV9iYXJyaWVyKCkKKwlhbmQgYW4gcmN1X3JlYWRfdW5sb2NrKCkgYWZ0ZXIgbGluZSA4IG9mIHRoaXMgc2FtZSBmdW5jdGlvbi4gSWYKKwl5b3UgY2FuIHRoaW5rIG9mIGEgYmV0dGVyIGNoYW5nZSwgcGxlYXNlIGxldCBtZSBrbm93IQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9hY2NvdW50aW5nL2dldGRlbGF5cy5jIGIvRG9jdW1lbnRhdGlvbi9hY2NvdW50aW5nL2dldGRlbGF5cy5jCmluZGV4IGNjNDk0MDAuLjdlYTIzMTEgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vYWNjb3VudGluZy9nZXRkZWxheXMuYworKysgYi9Eb2N1bWVudGF0aW9uL2FjY291bnRpbmcvZ2V0ZGVsYXlzLmMKQEAgLTM5Miw2ICszOTIsMTAgQEAKIAkJCWdvdG8gZXJyOwogCQl9CiAJfQorCWlmICghbWFza3NldCAmJiAhdGlkICYmICFjb250YWluZXJzZXQpIHsKKwkJdXNhZ2UoKTsKKwkJZ290byBlcnI7CisJfQogCiAJZG8gewogCQlpbnQgaTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vYmFkX21lbW9yeS50eHQgYi9Eb2N1bWVudGF0aW9uL2JhZF9tZW1vcnkudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmODQxNjIKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2JhZF9tZW1vcnkudHh0CkBAIC0wLDAgKzEsNDUgQEAKK01hcmNoIDIwMDgKK0phbi1TaW1vbiBNb2VsbGVyLCBkbDlwZkBnbXguZGUKKworCitIb3cgdG8gZGVhbCB3aXRoIGJhZCBtZW1vcnkgZS5nLiByZXBvcnRlZCBieSBtZW10ZXN0ODYrID8KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitUaGVyZSBhcmUgdGhyZWUgcG9zc2liaWxpdGllcyBJIGtub3cgb2Y6CisKKzEpIFJlaW5zZXJ0L3N3YXAgdGhlIG1lbW9yeSBtb2R1bGVzCisKKzIpIEJ1eSBuZXcgbW9kdWxlcyAoYmVzdCEpIG9yIHRyeSB0byBleGNoYW5nZSB0aGUgbWVtb3J5CisgICBpZiB5b3UgaGF2ZSBzcGFyZS1wYXJ0cworCiszKSBVc2UgQmFkUkFNIG9yIG1lbW1hcAorCitUaGlzIEhvd3RvIGlzIGFib3V0IG51bWJlciAzKSAuCisKKworQmFkUkFNCisjIyMjIyMKK0JhZFJBTSBpcyB0aGUgYWN0aXZlbHkgZGV2ZWxvcGVkIGFuZCBhdmFpbGFibGUgYXMga2VybmVsLXBhdGNoCitoZXJlOiAgaHR0cDovL3JpY2sudmFucmVpbi5vcmcvbGludXgvYmFkcmFtLworCitGb3IgbW9yZSBkZXRhaWxzIHNlZSB0aGUgQmFkUkFNIGRvY3VtZW50YXRpb24uCisKK21lbW1hcAorIyMjIyMjCisKK21lbW1hcCBpcyBhbHJlYWR5IGluIHRoZSBrZXJuZWwgYW5kIHVzYWJsZSBhcyBrZXJuZWwtcGFyYW1ldGVyIGF0Citib290LXRpbWUuICBJdHMgc3ludGF4IGlzIHNsaWdodGx5IHN0cmFuZ2UgYW5kIHlvdSBtYXkgbmVlZCB0bworY2FsY3VsYXRlIHRoZSB2YWx1ZXMgYnkgeW91cnNlbGYhCisKK1N5bnRheCB0byBleGNsdWRlIGEgbWVtb3J5IGFyZWEgKHNlZSBrZXJuZWwtcGFyYW1ldGVycy50eHQgZm9yIGRldGFpbHMpOgorbWVtbWFwPTxzaXplPiQ8YWRkcmVzcz4KKworRXhhbXBsZTogbWVtdGVzdDg2KyByZXBvcnRlZCBoZXJlIGVycm9ycyBhdCBhZGRyZXNzIDB4MTg2OTE0NTgsIDB4MTg2OTg0MjQgYW5kCisgICAgICAgICBzb21lIG90aGVycy4gQWxsIGhhZCAweDE4Njl4eHh4IGluIGNvbW1vbiwgc28gSSBjaG9zZSBhIHBhdHRlcm4gb2YKKyAgICAgICAgIDB4MTg2OTAwMDAsMHhmZmZmMDAwMC4KKworV2l0aCB0aGUgbnVtYmVycyBvZiB0aGUgZXhhbXBsZSBhYm92ZToKK21lbW1hcD02NEskMHgxODY5MDAwMAorIG9yCittZW1tYXA9MHgxMDAwMCQweDE4NjkwMDAwCisKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vYmxhY2tmaW4vMDAtSU5ERVggYi9Eb2N1bWVudGF0aW9uL2JsYWNrZmluLzAwLUlOREVYCmluZGV4IDdjYjNiMzUuLmQ2ODQwYTkgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vYmxhY2tmaW4vMDAtSU5ERVgKKysrIGIvRG9jdW1lbnRhdGlvbi9ibGFja2Zpbi8wMC1JTkRFWApAQCAtOSwzICs5LDYgQEAKIAogRmlsZXN5c3RlbXMKIAktIFJlcXVpcmVtZW50cyBmb3IgbW91bnRpbmcgdGhlIHJvb3QgZmlsZSBzeXN0ZW0uCisKK2JmaW4tZ3Bpby1ub3RlLnR4dAorCS0gTm90ZXMgaW4gZGV2ZWxvcGluZy91c2luZyBiZmluLWdwaW8gZHJpdmVyLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9ibGFja2Zpbi9iZmluLWdwaW8tbm90ZXMudHh0IGIvRG9jdW1lbnRhdGlvbi9ibGFja2Zpbi9iZmluLWdwaW8tbm90ZXMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4OThjN2RlCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9ibGFja2Zpbi9iZmluLWdwaW8tbm90ZXMudHh0CkBAIC0wLDAgKzEsNzEgQEAKKy8qCisgKiBGaWxlOiAgICAgICAgIERvY3VtZW50YXRpb24vYmxhY2tmaW4vYmZpbi1ncGlvLW5vdGUudHh0CisgKiBCYXNlZCBvbjoKKyAqIEF1dGhvcjoKKyAqCisgKiBDcmVhdGVkOiAgICAgICRJZDogYmZpbi1ncGlvLW5vdGUudHh0IDIwMDgtMTEtMjQgMTY6NDIgZ3JhZnlhbmcgJAorICogRGVzY3JpcHRpb246ICBUaGlzIGZpbGUgY29udGFpbnMgdGhlIG5vdGVzIGluIGRldmVsb3BpbmcvdXNpbmcgYmZpbi1ncGlvLgorICoKKyAqCisgKiBSZXY6CisgKgorICogTW9kaWZpZWQ6CisgKiAgICAgICAgICAgICAgIENvcHlyaWdodCAyMDA0LTIwMDggQW5hbG9nIERldmljZXMgSW5jLgorICoKKyAqIEJ1Z3M6ICAgICAgICAgRW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCisgKgorICovCisKKworMS4gQmxhY2tmaW4gR1BJTyBpbnRyb2R1Y3Rpb24KKworICAgIFRoZXJlIGFyZSBtYW55IEdQSU8gcGlucyBvbiBCbGFja2Zpbi4gTW9zdCBvZiB0aGVzZSBwaW5zIGFyZSBtdXhlZCB0bworICAgIG11bHRpLWZ1bmN0aW9ucy4gVGhleSBjYW4gYmUgY29uZmlndXJlZCBhcyBwZXJpcGhlcmFsLCBvciBqdXN0IGFzIEdQSU8sCisgICAgY29uZmlndXJlZCB0byBpbnB1dCB3aXRoIGludGVycnVwdCBlbmFibGVkLCBvciBvdXRwdXQuCisKKyAgICBGb3IgZGV0YWlsZWQgaW5mb3JtYXRpb24sIHBsZWFzZSBzZWUgImFyY2gvYmxhY2tmaW4va2VybmVsL2JmaW5fZ3Bpby5jIiwKKyAgICBvciB0aGUgcmVsZXZhbnQgSFJNLgorCisKKzIuIEF2b2lkaW5nIHJlc291cmNlIGNvbmZsaWN0CisKKyAgICBGb2xsb3dlZCBmdW5jdGlvbiBncm91cHMgYXJlIHVzZWQgdG8gYXZvaWRpbmcgcmVzb3VyY2UgY29uZmxpY3QsCisgICAgLSBVc2UgdGhlIHBpbiBhcyBwZXJpcGhlcmFsLAorCWludCBwZXJpcGhlcmFsX3JlcXVlc3QodW5zaWduZWQgc2hvcnQgcGVyLCBjb25zdCBjaGFyICpsYWJlbCk7CisJaW50IHBlcmlwaGVyYWxfcmVxdWVzdF9saXN0KGNvbnN0IHVuc2lnbmVkIHNob3J0IHBlcltdLCBjb25zdCBjaGFyICpsYWJlbCk7CisJdm9pZCBwZXJpcGhlcmFsX2ZyZWUodW5zaWduZWQgc2hvcnQgcGVyKTsKKwl2b2lkIHBlcmlwaGVyYWxfZnJlZV9saXN0KGNvbnN0IHVuc2lnbmVkIHNob3J0IHBlcltdKTsKKyAgICAtIFVzZSB0aGUgcGluIGFzIEdQSU8sCisJaW50IGJmaW5fZ3Bpb19yZXF1ZXN0KHVuc2lnbmVkIGdwaW8sIGNvbnN0IGNoYXIgKmxhYmVsKTsKKwl2b2lkIGJmaW5fZ3Bpb19mcmVlKHVuc2lnbmVkIGdwaW8pOworICAgIC0gVXNlIHRoZSBwaW4gYXMgR1BJTyBpbnRlcnJ1cHQsCisJaW50IGJmaW5fZ3Bpb19pcnFfcmVxdWVzdCh1bnNpZ25lZCBncGlvLCBjb25zdCBjaGFyICpsYWJlbCk7CisJdm9pZCBiZmluX2dwaW9faXJxX2ZyZWUodW5zaWduZWQgZ3Bpbyk7CisKKyAgICBUaGUgcmVxdWVzdCBmdW5jdGlvbnMgd2lsbCByZWNvcmQgdGhlIGZ1bmN0aW9uIHN0YXRlIGZvciBhIGNlcnRhaW4gcGluLAorICAgIHRoZSBmcmVlIGZ1bmN0aW9ucyB3aWxsIGNsZWFyIGl0J3MgZnVuY3Rpb24gc3RhdGUuCisgICAgT25jZSBhIHBpbiBpcyByZXF1ZXN0ZWQsIGl0IGNhbid0IGJlIHJlcXVlc3RlZCBhZ2FpbiBiZWZvcmUgaXQgaXMgZnJlZWQgYnkKKyAgICBwcmV2aW91cyBjYWxsZXIsIG90aGVyd2lzZSBrZXJuZWwgd2lsbCBkdW1wIHN0YWNrcywgYW5kIHRoZSByZXF1ZXN0CisgICAgZnVuY3Rpb24gZmFpbC4KKyAgICBUaGVzZSBmdW5jdGlvbnMgYXJlIHdyYXBwZWQgYnkgb3RoZXIgZnVuY3Rpb25zLCBtb3N0IG9mIHRoZSB1c2VycyBuZWVkIG5vdAorICAgIGNhcmUuCisKKworMy4gQnV0IHRoZXJlIGFyZSBzb21lIGV4Y2VwdGlvbnMKKyAgICAtIEtlcm5lbCBwZXJtaXQgdGhlIGlkZW50aWNhbCBHUElPIGJlIHJlcXVlc3RlZCBib3RoIGFzIEdQSU8gYW5kIEdQSU8KKyAgICBpbnRlcnJ1dC4KKyAgICBTb21lIGRyaXZlcnMsIGxpa2UgZ3Bpby1rZXlzLCBuZWVkIHRoaXMgYmVoYXZpb3IuIEtlcm5lbCBvbmx5IHByaW50IG91dAorICAgIHdhcm5pbmcgbWVzc2FnZXMgbGlrZSwKKwliZmluLWdwaW86IEdQSU8gMjQgaXMgYWxyZWFkeSByZXNlcnZlZCBieSBncGlvLWtleXM6IEJUTjAsIGFuZCB5b3UgYXJlCitjb25maWd1cmluZyBpdCBhcyBJUlEhCisKKyAgICAgICAgTm90ZTogQ29uc2lkZXIgdGhlIGNhc2UgdGhhdCwgaWYgdGhlcmUgYXJlIHR3byBkcml2ZXJzIG5lZWQgdGhlCisJaWRlbnRpY2FsIEdQSU8sIG9uZSBvZiB0aGVtIHVzZSBpdCBhcyBHUElPLCB0aGUgb3RoZXIgdXNlIGl0IGFzCisJR1BJTyBpbnRlcnJ1cHQuIFRoaXMgd2lsbCByZWFsbHkgY2F1c2UgcmVzb3VyY2UgY29uZmxpY3QuIFNvIGlmCisJdGhlcmUgaXMgYW55IGFibm9ybWFsIGRyaXZlciBiZWhhdmlvciwgcGxlYXNlIGNoZWNrIHRoZSBiZmluLWdwaW8KKwl3YXJuaW5nIG1lc3NhZ2VzLgorCisgICAgLSBLZXJuZWwgcGVybWl0IHRoZSBpZGVudGljYWwgR1BJTyBiZSByZXF1ZXN0ZWQgZnJvbSB0aGUgc2FtZSBkcml2ZXIgdHdpY2UuCisKKworCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2Nncm91cHMvY2dyb3Vwcy50eHQgYi9Eb2N1bWVudGF0aW9uL2Nncm91cHMvY2dyb3Vwcy50eHQKaW5kZXggZDkwMTRhYS4uZDllNWQ2ZiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9jZ3JvdXBzL2Nncm91cHMudHh0CisrKyBiL0RvY3VtZW50YXRpb24vY2dyb3Vwcy9jZ3JvdXBzLnR4dApAQCAtMSw3ICsxLDggQEAKIAkJCQlDR1JPVVBTCiAJCQkJLS0tLS0tLQogCi1Xcml0dGVuIGJ5IFBhdWwgTWVuYWdlIDxtZW5hZ2VAZ29vZ2xlLmNvbT4gYmFzZWQgb24gRG9jdW1lbnRhdGlvbi9jcHVzZXRzLnR4dAorV3JpdHRlbiBieSBQYXVsIE1lbmFnZSA8bWVuYWdlQGdvb2dsZS5jb20+IGJhc2VkIG9uCitEb2N1bWVudGF0aW9uL2Nncm91cHMvY3B1c2V0cy50eHQKIAogT3JpZ2luYWwgY29weXJpZ2h0IHN0YXRlbWVudHMgZnJvbSBjcHVzZXRzLnR4dDoKIFBvcnRpb25zIENvcHlyaWdodCAoQykgMjAwNCBCVUxMIFNBLgpAQCAtNjgsNyArNjksNyBAQAogdHJhY2tpbmcuIFRoZSBpbnRlbnRpb24gaXMgdGhhdCBvdGhlciBzdWJzeXN0ZW1zIGhvb2sgaW50byB0aGUgZ2VuZXJpYwogY2dyb3VwIHN1cHBvcnQgdG8gcHJvdmlkZSBuZXcgYXR0cmlidXRlcyBmb3IgY2dyb3Vwcywgc3VjaCBhcwogYWNjb3VudGluZy9saW1pdGluZyB0aGUgcmVzb3VyY2VzIHdoaWNoIHByb2Nlc3NlcyBpbiBhIGNncm91cCBjYW4KLWFjY2Vzcy4gRm9yIGV4YW1wbGUsIGNwdXNldHMgKHNlZSBEb2N1bWVudGF0aW9uL2NwdXNldHMudHh0KSBhbGxvd3MKK2FjY2Vzcy4gRm9yIGV4YW1wbGUsIGNwdXNldHMgKHNlZSBEb2N1bWVudGF0aW9uL2Nncm91cHMvY3B1c2V0cy50eHQpIGFsbG93cwogeW91IHRvIGFzc29jaWF0ZSBhIHNldCBvZiBDUFVzIGFuZCBhIHNldCBvZiBtZW1vcnkgbm9kZXMgd2l0aCB0aGUKIHRhc2tzIGluIGVhY2ggY2dyb3VwLgogCkBAIC0yMjcsNyArMjI4LDYgQEAKIGNvbnRhaW5pbmcgdGhlIGZvbGxvd2luZyBmaWxlcyBkZXNjcmliaW5nIHRoYXQgY2dyb3VwOgogCiAgLSB0YXNrczogbGlzdCBvZiB0YXNrcyAoYnkgcGlkKSBhdHRhY2hlZCB0byB0aGF0IGNncm91cAotIC0gcmVsZWFzYWJsZSBmbGFnOiBjZ3JvdXAgY3VycmVudGx5IHJlbW92ZWFibGU/CiAgLSBub3RpZnlfb25fcmVsZWFzZSBmbGFnOiBydW4gdGhlIHJlbGVhc2UgYWdlbnQgb24gZXhpdD8KICAtIHJlbGVhc2VfYWdlbnQ6IHRoZSBwYXRoIHRvIHVzZSBmb3IgcmVsZWFzZSBub3RpZmljYXRpb25zICh0aGlzIGZpbGUKICAgIGV4aXN0cyBpbiB0aGUgdG9wIGNncm91cCBvbmx5KQpAQCAtMzYwLDcgKzM2MCw3IEBACiAKIEluIHRoaXMgZGlyZWN0b3J5IHlvdSBjYW4gZmluZCBzZXZlcmFsIGZpbGVzOgogIyBscwotbm90aWZ5X29uX3JlbGVhc2UgcmVsZWFzYWJsZSB0YXNrcworbm90aWZ5X29uX3JlbGVhc2UgdGFza3MKIChwbHVzIHdoYXRldmVyIGZpbGVzIGFkZGVkIGJ5IHRoZSBhdHRhY2hlZCBzdWJzeXN0ZW1zKQogCiBOb3cgYXR0YWNoIHlvdXIgc2hlbGwgdG8gdGhpcyBjZ3JvdXA6CkBAIC00NzksNyArNDc5LDYgQEAKIGNyZWF0ZSgpIG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQgZm9yIHRoZSBuZXcgY2dyb3VwKS4KIAogdm9pZCBwcmVfZGVzdHJveShzdHJ1Y3QgY2dyb3VwX3N1YnN5cyAqc3MsIHN0cnVjdCBjZ3JvdXAgKmNncnApOwotKGNncm91cF9tdXRleCBoZWxkIGJ5IGNhbGxlcikKIAogQ2FsbGVkIGJlZm9yZSBjaGVja2luZyB0aGUgcmVmZXJlbmNlIGNvdW50IG9uIGVhY2ggc3Vic3lzdGVtLiBUaGlzIG1heQogYmUgdXNlZnVsIGZvciBzdWJzeXN0ZW1zIHdoaWNoIGhhdmUgc29tZSBleHRyYSByZWZlcmVuY2VzIGV2ZW4gaWYKQEAgLTQ5OCw2ICs0OTcsNyBAQAogCiB2b2lkIGF0dGFjaChzdHJ1Y3QgY2dyb3VwX3N1YnN5cyAqc3MsIHN0cnVjdCBjZ3JvdXAgKmNncnAsCiAJICAgIHN0cnVjdCBjZ3JvdXAgKm9sZF9jZ3JwLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spCisoY2dyb3VwX211dGV4IGhlbGQgYnkgY2FsbGVyKQogCiBDYWxsZWQgYWZ0ZXIgdGhlIHRhc2sgaGFzIGJlZW4gYXR0YWNoZWQgdG8gdGhlIGNncm91cCwgdG8gYWxsb3cgYW55CiBwb3N0LWF0dGFjaG1lbnQgYWN0aXZpdHkgdGhhdCByZXF1aXJlcyBtZW1vcnkgYWxsb2NhdGlvbnMgb3IgYmxvY2tpbmcuCkBAIC01MTEsNiArNTExLDcgQEAKIENhbGxlZCBkdXJpbmcgdGFzayBleGl0LgogCiBpbnQgcG9wdWxhdGUoc3RydWN0IGNncm91cF9zdWJzeXMgKnNzLCBzdHJ1Y3QgY2dyb3VwICpjZ3JwKQorKGNncm91cF9tdXRleCBoZWxkIGJ5IGNhbGxlcikKIAogQ2FsbGVkIGFmdGVyIGNyZWF0aW9uIG9mIGEgY2dyb3VwIHRvIGFsbG93IGEgc3Vic3lzdGVtIHRvIHBvcHVsYXRlCiB0aGUgY2dyb3VwIGRpcmVjdG9yeSB3aXRoIGZpbGUgZW50cmllcy4gIFRoZSBzdWJzeXN0ZW0gc2hvdWxkIG1ha2UKQEAgLTUyMCw2ICs1MjEsNyBAQAogYWx3YXlzIGhhbmRsZWQgd2VsbC4KIAogdm9pZCBwb3N0X2Nsb25lKHN0cnVjdCBjZ3JvdXBfc3Vic3lzICpzcywgc3RydWN0IGNncm91cCAqY2dycCkKKyhjZ3JvdXBfbXV0ZXggaGVsZCBieSBjYWxsZXIpCiAKIENhbGxlZCBhdCB0aGUgZW5kIG9mIGNncm91cF9jbG9uZSgpIHRvIGRvIGFueSBwYXJhbWF0ZXIKIGluaXRpYWxpemF0aW9uIHdoaWNoIG1pZ2h0IGJlIHJlcXVpcmVkIGJlZm9yZSBhIHRhc2sgY291bGQgYXR0YWNoLiAgRm9yCkBAIC01MjcsNyArNTI5LDcgQEAKIHVwLgogCiB2b2lkIGJpbmQoc3RydWN0IGNncm91cF9zdWJzeXMgKnNzLCBzdHJ1Y3QgY2dyb3VwICpyb290KQotKGNncm91cF9tdXRleCBoZWxkIGJ5IGNhbGxlcikKKyhjZ3JvdXBfbXV0ZXggYW5kIHNzLT5oaWVyYXJjaHlfbXV0ZXggaGVsZCBieSBjYWxsZXIpCiAKIENhbGxlZCB3aGVuIGEgY2dyb3VwIHN1YnN5c3RlbSBpcyByZWJvdW5kIHRvIGEgZGlmZmVyZW50IGhpZXJhcmNoeQogYW5kIHJvb3QgY2dyb3VwLiBDdXJyZW50bHkgdGhpcyB3aWxsIG9ubHkgaW52b2x2ZSBtb3ZlbWVudCBiZXR3ZWVuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2NvbnRyb2xsZXJzL2NwdWFjY3QudHh0IGIvRG9jdW1lbnRhdGlvbi9jZ3JvdXBzL2NwdWFjY3QudHh0CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL2NvbnRyb2xsZXJzL2NwdWFjY3QudHh0CnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL2Nncm91cHMvY3B1YWNjdC50eHQKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vY3B1c2V0cy50eHQgYi9Eb2N1bWVudGF0aW9uL2Nncm91cHMvY3B1c2V0cy50eHQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vY3B1c2V0cy50eHQKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vY2dyb3Vwcy9jcHVzZXRzLnR4dApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9jb250cm9sbGVycy9kZXZpY2VzLnR4dCBiL0RvY3VtZW50YXRpb24vY2dyb3Vwcy9kZXZpY2VzLnR4dApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gRG9jdW1lbnRhdGlvbi9jb250cm9sbGVycy9kZXZpY2VzLnR4dApyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9jZ3JvdXBzL2RldmljZXMudHh0CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2Nncm91cHMvbWVtY2dfdGVzdC50eHQgYi9Eb2N1bWVudGF0aW9uL2Nncm91cHMvbWVtY2dfdGVzdC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTk1MzNmOQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vY2dyb3Vwcy9tZW1jZ190ZXN0LnR4dApAQCAtMCwwICsxLDM0MiBAQAorTWVtb3J5IFJlc291cmNlIENvbnRyb2xsZXIoTWVtY2cpICBJbXBsZW1lbnRhdGlvbiBNZW1vLgorTGFzdCBVcGRhdGVkOiAyMDA4LzEyLzE1CitCYXNlIEtlcm5lbCBWZXJzaW9uOiBiYXNlZCBvbiAyLjYuMjgtcmM4LW1tLgorCitCZWNhdXNlIFZNIGlzIGdldHRpbmcgY29tcGxleCAob25lIG9mIHJlYXNvbnMgaXMgbWVtY2cuLi4pLCBtZW1jZydzIGJlaGF2aW9yCitpcyBjb21wbGV4LiBUaGlzIGlzIGEgZG9jdW1lbnQgZm9yIG1lbWNnJ3MgaW50ZXJuYWwgYmVoYXZpb3IuCitQbGVhc2Ugbm90ZSB0aGF0IGltcGxlbWVudGF0aW9uIGRldGFpbHMgY2FuIGJlIGNoYW5nZWQuCisKKygqKSBUb3BpY3Mgb24gQVBJIHNob3VsZCBiZSBpbiBEb2N1bWVudGF0aW9uL2Nncm91cHMvbWVtb3J5LnR4dCkKKworMC4gSG93IHRvIHJlY29yZCB1c2FnZSA/CisgICAyIG9iamVjdHMgYXJlIHVzZWQuCisKKyAgIHBhZ2VfY2dyb3VwIC4uLi5hbiBvYmplY3QgcGVyIHBhZ2UuCisJQWxsb2NhdGVkIGF0IGJvb3Qgb3IgbWVtb3J5IGhvdHBsdWcuIEZyZWVkIGF0IG1lbW9yeSBob3QgcmVtb3ZhbC4KKworICAgc3dhcF9jZ3JvdXAgLi4uIGFuIGVudHJ5IHBlciBzd3BfZW50cnkuCisJQWxsb2NhdGVkIGF0IHN3YXBvbigpLiBGcmVlZCBhdCBzd2Fwb2ZmKCkuCisKKyAgIFRoZSBwYWdlX2Nncm91cCBoYXMgVVNFRCBiaXQgYW5kIGRvdWJsZSBjb3VudCBhZ2FpbnN0IGEgcGFnZV9jZ3JvdXAgbmV2ZXIKKyAgIG9jY3Vycy4gc3dhcF9jZ3JvdXAgaXMgdXNlZCBvbmx5IHdoZW4gYSBjaGFyZ2VkIHBhZ2UgaXMgc3dhcHBlZC1vdXQuCisKKzEuIENoYXJnZQorCisgICBhIHBhZ2Uvc3dwX2VudHJ5IG1heSBiZSBjaGFyZ2VkICh1c2FnZSArPSBQQUdFX1NJWkUpIGF0CisKKwltZW1fY2dyb3VwX25ld3BhZ2VfY2hhcmdlKCkKKwkgIENhbGxlZCBhdCBuZXcgcGFnZSBmYXVsdCBhbmQgQ29weS1Pbi1Xcml0ZS4KKworCW1lbV9jZ3JvdXBfdHJ5X2NoYXJnZV9zd2FwaW4oKQorCSAgQ2FsbGVkIGF0IGRvX3N3YXBfcGFnZSgpIChwYWdlIGZhdWx0IG9uIHN3YXAgZW50cnkpIGFuZCBzd2Fwb2ZmLgorCSAgRm9sbG93ZWQgYnkgY2hhcmdlLWNvbW1pdC1jYW5jZWwgcHJvdG9jb2wuIChXaXRoIHN3YXAgYWNjb3VudGluZykKKwkgIEF0IGNvbW1pdCwgYSBjaGFyZ2UgcmVjb3JkZWQgaW4gc3dhcF9jZ3JvdXAgaXMgcmVtb3ZlZC4KKworCW1lbV9jZ3JvdXBfY2FjaGVfY2hhcmdlKCkKKwkgIENhbGxlZCBhdCBhZGRfdG9fcGFnZV9jYWNoZSgpCisKKwltZW1fY2dyb3VwX2NhY2hlX2NoYXJnZV9zd2FwaW4oKQorCSAgQ2FsbGVkIGF0IHNobWVtJ3Mgc3dhcGluLgorCisJbWVtX2Nncm91cF9wcmVwYXJlX21pZ3JhdGlvbigpCisJICBDYWxsZWQgYmVmb3JlIG1pZ3JhdGlvbi4gImV4dHJhIiBjaGFyZ2UgaXMgZG9uZSBhbmQgZm9sbG93ZWQgYnkKKwkgIGNoYXJnZS1jb21taXQtY2FuY2VsIHByb3RvY29sLgorCSAgQXQgY29tbWl0LCBjaGFyZ2UgYWdhaW5zdCBvbGRwYWdlIG9yIG5ld3BhZ2Ugd2lsbCBiZSBjb21taXR0ZWQuCisKKzIuIFVuY2hhcmdlCisgIGEgcGFnZS9zd3BfZW50cnkgbWF5IGJlIHVuY2hhcmdlZCAodXNhZ2UgLT0gUEFHRV9TSVpFKSBieQorCisJbWVtX2Nncm91cF91bmNoYXJnZV9wYWdlKCkKKwkgIENhbGxlZCB3aGVuIGFuIGFub255bW91cyBwYWdlIGlzIGZ1bGx5IHVubWFwcGVkLiBJLmUuLCBtYXBjb3VudCBnb2VzCisJICB0byAwLiBJZiB0aGUgcGFnZSBpcyBTd2FwQ2FjaGUsIHVuY2hhcmdlIGlzIGRlbGF5ZWQgdW50aWwKKwkgIG1lbV9jZ3JvdXBfdW5jaGFyZ2Vfc3dhcGNhY2hlKCkuCisKKwltZW1fY2dyb3VwX3VuY2hhcmdlX2NhY2hlX3BhZ2UoKQorCSAgQ2FsbGVkIHdoZW4gYSBwYWdlLWNhY2hlIGlzIGRlbGV0ZWQgZnJvbSByYWRpeC10cmVlLiBJZiB0aGUgcGFnZSBpcworCSAgU3dhcENhY2hlLCB1bmNoYXJnZSBpcyBkZWxheWVkIHVudGlsIG1lbV9jZ3JvdXBfdW5jaGFyZ2Vfc3dhcGNhY2hlKCkuCisKKwltZW1fY2dyb3VwX3VuY2hhcmdlX3N3YXBjYWNoZSgpCisJICBDYWxsZWQgd2hlbiBTd2FwQ2FjaGUgaXMgcmVtb3ZlZCBmcm9tIHJhZGl4LXRyZWUuIFRoZSBjaGFyZ2UgaXRzZWxmCisJICBpcyBtb3ZlZCB0byBzd2FwX2Nncm91cC4gKElmIG1lbStzd2FwIGNvbnRyb2xsZXIgaXMgZGlzYWJsZWQsIG5vCisJICBjaGFyZ2UgdG8gc3dhcCBvY2N1cnMuKQorCisJbWVtX2Nncm91cF91bmNoYXJnZV9zd2FwKCkKKwkgIENhbGxlZCB3aGVuIHN3cF9lbnRyeSdzIHJlZmNudCBnb2VzIGRvd24gdG8gMC4gQSBjaGFyZ2UgYWdhaW5zdCBzd2FwCisJICBkaXNhcHBlYXJzLgorCisJbWVtX2Nncm91cF9lbmRfbWlncmF0aW9uKG9sZCwgbmV3KQorCUF0IHN1Y2Nlc3Mgb2YgbWlncmF0aW9uIG9sZCBpcyB1bmNoYXJnZWQgKGlmIG5lY2Vzc2FyeSksIGEgY2hhcmdlCisJdG8gbmV3IHBhZ2UgaXMgY29tbWl0dGVkLiBBdCBmYWlsdXJlLCBjaGFyZ2UgdG8gb2xkIHBhZ2UgaXMgY29tbWl0dGVkLgorCiszLiBjaGFyZ2UtY29tbWl0LWNhbmNlbAorCUluIHNvbWUgY2FzZSwgd2UgY2FuJ3Qga25vdyB0aGlzICJjaGFyZ2UiIGlzIHZhbGlkIG9yIG5vdCBhdCBjaGFyZ2luZworCShiZWNhdXNlIG9mIHJhY2VzKS4KKwlUbyBoYW5kbGUgc3VjaCBjYXNlLCB0aGVyZSBhcmUgY2hhcmdlLWNvbW1pdC1jYW5jZWwgZnVuY3Rpb25zLgorCQltZW1fY2dyb3VwX3RyeV9jaGFyZ2VfWFhYCisJCW1lbV9jZ3JvdXBfY29tbWl0X2NoYXJnZV9YWFgKKwkJbWVtX2Nncm91cF9jYW5jZWxfY2hhcmdlX1hYWAorCXRoZXNlIGFyZSB1c2VkIGluIHN3YXAtaW4gYW5kIG1pZ3JhdGlvbi4KKworCUF0IHRyeV9jaGFyZ2UoKSwgdGhlcmUgYXJlIG5vIGZsYWdzIHRvIHNheSAidGhpcyBwYWdlIGlzIGNoYXJnZWQiLgorCWF0IHRoaXMgcG9pbnQsIHVzYWdlICs9IFBBR0VfU0laRS4KKworCUF0IGNvbW1pdCgpLCB0aGUgZnVuY3Rpb24gY2hlY2tzIHRoZSBwYWdlIHNob3VsZCBiZSBjaGFyZ2VkIG9yIG5vdAorCWFuZCBzZXQgZmxhZ3Mgb3IgYXZvaWQgY2hhcmdpbmcuKHVzYWdlIC09IFBBR0VfU0laRSkKKworCUF0IGNhbmNlbCgpLCBzaW1wbHkgdXNhZ2UgLT0gUEFHRV9TSVpFLgorCitVbmRlciBiZWxvdyBleHBsYW5hdGlvbiwgd2UgYXNzdW1lIENPTkZJR19NRU1fUkVTX0NUUkxfU1dBUD15LgorCis0LiBBbm9ueW1vdXMKKwlBbm9ueW1vdXMgcGFnZSBpcyBuZXdseSBhbGxvY2F0ZWQgYXQKKwkJICAtIHBhZ2UgZmF1bHQgaW50byBNQVBfQU5PTllNT1VTIG1hcHBpbmcuCisJCSAgLSBDb3B5LU9uLVdyaXRlLgorIAlJdCBpcyBjaGFyZ2VkIHJpZ2h0IGFmdGVyIGl0J3MgYWxsb2NhdGVkIGJlZm9yZSBkb2luZyBhbnkgcGFnZSB0YWJsZQorCXJlbGF0ZWQgb3BlcmF0aW9ucy4gT2YgY291cnNlLCBpdCdzIHVuY2hhcmdlZCB3aGVuIGFub3RoZXIgcGFnZSBpcyB1c2VkCisJZm9yIHRoZSBmYXVsdCBhZGRyZXNzLgorCisJQXQgZnJlZWluZyBhbm9ueW1vdXMgcGFnZSAoYnkgZXhpdCgpIG9yIG11bm1hcCgpKSwgemFwX3B0ZSgpIGlzIGNhbGxlZAorCWFuZCBwYWdlcyBmb3IgcHRlcyBhcmUgZnJlZWQgb25lIGJ5IG9uZS4oc2VlIG1tL21lbW9yeS5jKS4gVW5jaGFyZ2VzCisJYXJlIGRvbmUgYXQgcGFnZV9yZW1vdmVfcm1hcCgpIHdoZW4gcGFnZV9tYXBjb3VudCgpIGdvZXMgZG93biB0byAwLgorCisJQW5vdGhlciBwYWdlIGZyZWVpbmcgaXMgYnkgcGFnZS1yZWNsYWltICh2bXNjYW4uYykgYW5kIGFub255bW91cworCXBhZ2VzIGFyZSBzd2FwcGVkIG91dC4gSW4gdGhpcyBjYXNlLCB0aGUgcGFnZSBpcyBtYXJrZWQgYXMKKwlQYWdlU3dhcENhY2hlKCkuIHVuY2hhcmdlKCkgcm91dGluZSBkb2Vzbid0IHVuY2hhcmdlIHRoZSBwYWdlIG1hcmtlZAorCWFzIFN3YXBDYWNoZSgpLiBJdCdzIGRlbGF5ZWQgdW50aWwgX19kZWxldGVfZnJvbV9zd2FwX2NhY2hlKCkuCisKKwk0LjEgU3dhcC1pbi4KKwlBdCBzd2FwLWluLCB0aGUgcGFnZSBpcyB0YWtlbiBmcm9tIHN3YXAtY2FjaGUuIFRoZXJlIGFyZSAyIGNhc2VzLgorCisJKGEpIElmIHRoZSBTd2FwQ2FjaGUgaXMgbmV3bHkgYWxsb2NhdGVkIGFuZCByZWFkLCBpdCBoYXMgbm8gY2hhcmdlcy4KKwkoYikgSWYgdGhlIFN3YXBDYWNoZSBoYXMgYmVlbiBtYXBwZWQgYnkgcHJvY2Vzc2VzLCBpdCBoYXMgYmVlbgorCSAgICBjaGFyZ2VkIGFscmVhZHkuCisKKwlUaGlzIHN3YXAtaW4gaXMgb25lIG9mIHRoZSBtb3N0IGNvbXBsaWNhdGVkIHdvcmsuIEluIGRvX3N3YXBfcGFnZSgpLAorCWZvbGxvd2luZyBldmVudHMgb2NjdXIgd2hlbiBwdGUgaXMgdW5jaGFuZ2VkLgorCisJKDEpIHRoZSBwYWdlIChTd2FwQ2FjaGUpIGlzIGxvb2tlZCB1cC4KKwkoMikgbG9ja19wYWdlKCkKKwkoMykgdHJ5X2NoYXJnZV9zd2FwaW4oKQorCSg0KSByZXVzZV9zd2FwX3BhZ2UoKSAobWF5IGNhbGwgZGVsZXRlX3N3YXBfY2FjaGUoKSkKKwkoNSkgY29tbWl0X2NoYXJnZV9zd2FwaW4oKQorCSg2KSBzd2FwX2ZyZWUoKS4KKworCUNvbnNpZGVyaW5nIGZvbGxvd2luZyBzaXR1YXRpb24gZm9yIGV4YW1wbGUuCisKKwkoQSkgVGhlIHBhZ2UgaGFzIG5vdCBiZWVuIGNoYXJnZWQgYmVmb3JlICgyKSBhbmQgcmV1c2Vfc3dhcF9wYWdlKCkKKwkgICAgZG9lc24ndCBjYWxsIGRlbGV0ZV9mcm9tX3N3YXBfY2FjaGUoKS4KKwkoQikgVGhlIHBhZ2UgaGFzIG5vdCBiZWVuIGNoYXJnZWQgYmVmb3JlICgyKSBhbmQgcmV1c2Vfc3dhcF9wYWdlKCkKKwkgICAgY2FsbHMgZGVsZXRlX2Zyb21fc3dhcF9jYWNoZSgpLgorCShDKSBUaGUgcGFnZSBoYXMgYmVlbiBjaGFyZ2VkIGJlZm9yZSAoMikgYW5kIHJldXNlX3N3YXBfcGFnZSgpIGRvZXNuJ3QKKwkgICAgY2FsbCBkZWxldGVfZnJvbV9zd2FwX2NhY2hlKCkuCisJKEQpIFRoZSBwYWdlIGhhcyBiZWVuIGNoYXJnZWQgYmVmb3JlICgyKSBhbmQgcmV1c2Vfc3dhcF9wYWdlKCkgY2FsbHMKKwkgICAgZGVsZXRlX2Zyb21fc3dhcF9jYWNoZSgpLgorCisJICAgIG1lbW9yeS51c2FnZS9tZW1zdy51c2FnZSBjaGFuZ2VzIHRvIHRoaXMgcGFnZS9zd3BfZW50cnkgd2lsbCBiZQorCSBDYXNlICAgICAgICAgIChBKSAgICAgIChCKSAgICAgICAoQykgICAgIChEKQorICAgICAgICAgRXZlbnQKKyAgICAgICBCZWZvcmUgKDIpICAgICAwLyAxICAgICAwLyAxICAgICAgMS8gMSAgICAxLyAxCisgICAgICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICgzKSAgICAgICAgKzEvKzEgICAgKzEvKzEgICAgICsxLysxICAgKzEvKzEKKyAgICAgICAgICAoNCkgICAgICAgICAgLSAgICAgICAwLyAwICAgICAgIC0gICAgIC0xLyAwCisgICAgICAgICAgKDUpICAgICAgICAgMC8tMSAgICAgMC8gMCAgICAgLTEvLTEgICAgMC8gMAorICAgICAgICAgICg2KSAgICAgICAgICAtICAgICAgIDAvLTEgICAgICAgLSAgICAgIDAvLTEKKyAgICAgICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgUmVzdWx0ICAgICAgICAgMS8gMSAgICAgMS8gMSAgICAgIDEvIDEgICAgMS8gMQorCisgICAgICAgSW4gYW55IGNhc2VzLCBjaGFyZ2VzIHRvIHRoaXMgcGFnZSBzaG91bGQgYmUgMS8gMS4KKworCTQuMiBTd2FwLW91dC4KKwlBdCBzd2FwLW91dCwgdHlwaWNhbCBzdGF0ZSB0cmFuc2l0aW9uIGlzIGJlbG93LgorCisJKGEpIGFkZCB0byBzd2FwIGNhY2hlLiAobWFya2VkIGFzIFN3YXBDYWNoZSkKKwkgICAgc3dwX2VudHJ5J3MgcmVmY250ICs9IDEuCisJKGIpIGZ1bGx5IHVubWFwcGVkLgorCSAgICBzd3BfZW50cnkncyByZWZjbnQgKz0gIyBvZiBwdGVzLgorCShjKSB3cml0ZSBiYWNrIHRvIHN3YXAuCisJKGQpIGRlbGV0ZSBmcm9tIHN3YXAgY2FjaGUuIChyZW1vdmUgZnJvbSBTd2FwQ2FjaGUpCisJICAgIHN3cF9lbnRyeSdzIHJlZmNudCAtPSAxLgorCisKKwlBdCAoYiksIHRoZSBwYWdlIGlzIG1hcmtlZCBhcyBTd2FwQ2FjaGUgYW5kIG5vdCB1bmNoYXJnZWQuCisJQXQgKGQpLCB0aGUgcGFnZSBpcyByZW1vdmVkIGZyb20gU3dhcENhY2hlIGFuZCBhIGNoYXJnZSBpbiBwYWdlX2Nncm91cAorCWlzIG1vdmVkIHRvIHN3YXBfY2dyb3VwLgorCisJRmluYWxseSwgYXQgdGFzayBleGl0LAorCShlKSB6YXBfcHRlKCkgaXMgY2FsbGVkIGFuZCBzd3BfZW50cnkncyByZWZjbnQgLT0xIC0+IDAuCisJSGVyZSwgYSBjaGFyZ2UgaW4gc3dhcF9jZ3JvdXAgZGlzYXBwZWFycy4KKworNS4gUGFnZSBDYWNoZQorICAgCVBhZ2UgQ2FjaGUgaXMgY2hhcmdlZCBhdAorCS0gYWRkX3RvX3BhZ2VfY2FjaGVfbG9ja2VkKCkuCisKKwl1bmNoYXJnZWQgYXQKKwktIF9fcmVtb3ZlX2Zyb21fcGFnZV9jYWNoZSgpLgorCisJVGhlIGxvZ2ljIGlzIHZlcnkgY2xlYXIuIChBYm91dCBtaWdyYXRpb24sIHNlZSBiZWxvdykKKwlOb3RlOiBfX3JlbW92ZV9mcm9tX3BhZ2VfY2FjaGUoKSBpcyBjYWxsZWQgYnkgcmVtb3ZlX2Zyb21fcGFnZV9jYWNoZSgpCisJYW5kIF9fcmVtb3ZlX21hcHBpbmcoKS4KKworNi4gU2htZW0odG1wZnMpIFBhZ2UgQ2FjaGUKKwlNZW1jZydzIGNoYXJnZS91bmNoYXJnZSBoYXZlIHNwZWNpYWwgaGFuZGxlcnMgb2Ygc2htZW0uIFRoZSBiZXN0IHdheQorCXRvIHVuZGVyc3RhbmQgc2htZW0ncyBwYWdlIHN0YXRlIHRyYW5zaXRpb24gaXMgdG8gcmVhZCBtbS9zaG1lbS5jLgorCUJ1dCBicmllZiBleHBsYW5hdGlvbiBvZiB0aGUgYmVoYXZpb3Igb2YgbWVtY2cgYXJvdW5kIHNobWVtIHdpbGwgYmUKKwloZWxwZnVsIHRvIHVuZGVyc3RhbmQgdGhlIGxvZ2ljLgorCisJU2htZW0ncyBwYWdlIChqdXN0IGxlYWYgcGFnZSwgbm90IGRpcmVjdC9pbmRpcmVjdCBibG9jaykgY2FuIGJlIG9uCisJCS0gcmFkaXgtdHJlZSBvZiBzaG1lbSdzIGlub2RlLgorCQktIFN3YXBDYWNoZS4KKwkJLSBCb3RoIG9uIHJhZGl4LXRyZWUgYW5kIFN3YXBDYWNoZS4gVGhpcyBoYXBwZW5zIGF0IHN3YXAtaW4KKwkJICBhbmQgc3dhcC1vdXQsCisKKwlJdCdzIGNoYXJnZWQgd2hlbi4uLgorCS0gQSBuZXcgcGFnZSBpcyBhZGRlZCB0byBzaG1lbSdzIHJhZGl4LXRyZWUuCisJLSBBIHN3cCBwYWdlIGlzIHJlYWQuIChtb3ZlIGEgY2hhcmdlIGZyb20gc3dhcF9jZ3JvdXAgdG8gcGFnZV9jZ3JvdXApCisJSXQncyB1bmNoYXJnZWQgd2hlbgorCS0gQSBwYWdlIGlzIHJlbW92ZWQgZnJvbSByYWRpeC10cmVlIGFuZCBub3QgU3dhcENhY2hlLgorCS0gV2hlbiBTd2FwQ2FjaGUgaXMgcmVtb3ZlZCwgYSBjaGFyZ2UgaXMgbW92ZWQgdG8gc3dhcF9jZ3JvdXAuCisJLSBXaGVuIHN3cF9lbnRyeSdzIHJlZmNudCBnb2VzIGRvd24gdG8gMCwgYSBjaGFyZ2UgaW4gc3dhcF9jZ3JvdXAKKwkgIGRpc2FwcGVhcnMuCisKKzcuIFBhZ2UgTWlncmF0aW9uCisgICAJT25lIG9mIHRoZSBtb3N0IGNvbXBsaWNhdGVkIGZ1bmN0aW9ucyBpcyBwYWdlLW1pZ3JhdGlvbi1oYW5kbGVyLgorCU1lbWNnIGhhcyAyIHJvdXRpbmVzLiBBc3N1bWUgdGhhdCB3ZSBhcmUgbWlncmF0aW5nIGEgcGFnZSdzIGNvbnRlbnRzCisJZnJvbSBPTERQQUdFIHRvIE5FV1BBR0UuCisKKwlVc3VhbCBtaWdyYXRpb24gbG9naWMgaXMuLgorCShhKSByZW1vdmUgdGhlIHBhZ2UgZnJvbSBMUlUuCisJKGIpIGFsbG9jYXRlIE5FV1BBR0UgKG1pZ3JhdGlvbiB0YXJnZXQpCisJKGMpIGxvY2sgYnkgbG9ja19wYWdlKCkuCisJKGQpIHVubWFwIGFsbCBtYXBwaW5ncy4KKwkoZS0xKSBJZiBuZWNlc3NhcnksIHJlcGxhY2UgZW50cnkgaW4gcmFkaXgtdHJlZS4KKwkoZS0yKSBtb3ZlIGNvbnRlbnRzIG9mIGEgcGFnZS4KKwkoZikgbWFwIGFsbCBtYXBwaW5ncyBhZ2Fpbi4KKwkoZykgcHVzaGJhY2sgdGhlIHBhZ2UgdG8gTFJVLgorCSgtKSBPTERQQUdFIHdpbGwgYmUgZnJlZWQuCisKKwlCZWZvcmUgKGcpLCBtZW1jZyBzaG91bGQgY29tcGxldGUgYWxsIG5lY2Vzc2FyeSBjaGFyZ2UvdW5jaGFyZ2UgdG8KKwlORVdQQUdFL09MRFBBR0UuCisKKwlUaGUgcG9pbnQgaXMuLi4uCisJLSBJZiBPTERQQUdFIGlzIGFub255bW91cywgYWxsIGNoYXJnZXMgd2lsbCBiZSBkcm9wcGVkIGF0IChkKSBiZWNhdXNlCisgICAgICAgICAgdHJ5X3RvX3VubWFwKCkgZHJvcHMgYWxsIG1hcGNvdW50IGFuZCB0aGUgcGFnZSB3aWxsIG5vdCBiZQorCSAgU3dhcENhY2hlLgorCisJLSBJZiBPTERQQUdFIGlzIFN3YXBDYWNoZSwgY2hhcmdlcyB3aWxsIGJlIGtlcHQgYXQgKGcpIGJlY2F1c2UKKwkgIF9fZGVsZXRlX2Zyb21fc3dhcF9jYWNoZSgpIGlzbid0IGNhbGxlZCBhdCAoZS0xKQorCisJLSBJZiBPTERQQUdFIGlzIHBhZ2UtY2FjaGUsIGNoYXJnZXMgd2lsbCBiZSBrZXB0IGF0IChnKSBiZWNhdXNlCisJICByZW1vdmVfZnJvbV9zd2FwX2NhY2hlKCkgaXNuJ3QgY2FsbGVkIGF0IChlLTEpCisKKwltZW1jZyBwcm92aWRlcyBmb2xsb3dpbmcgaG9va3MuCisKKwktIG1lbV9jZ3JvdXBfcHJlcGFyZV9taWdyYXRpb24oT0xEUEFHRSkKKwkgIENhbGxlZCBhZnRlciAoYikgdG8gYWNjb3VudCBhIGNoYXJnZSAodXNhZ2UgKz0gUEFHRV9TSVpFKSBhZ2FpbnN0CisJICBtZW1jZyB3aGljaCBPTERQQUdFIGJlbG9uZ3MgdG8uCisKKyAgICAgICAgLSBtZW1fY2dyb3VwX2VuZF9taWdyYXRpb24oT0xEUEFHRSwgTkVXUEFHRSkKKwkgIENhbGxlZCBhZnRlciAoZikgYmVmb3JlIChnKS4KKwkgIElmIE9MRFBBR0UgaXMgdXNlZCwgY29tbWl0IE9MRFBBR0UgYWdhaW4uIElmIE9MRFBBR0UgaXMgYWxyZWFkeQorCSAgY2hhcmdlZCwgYSBjaGFyZ2UgYnkgcHJlcGFyZV9taWdyYXRpb24oKSBpcyBhdXRvbWF0aWNhbGx5IGNhbmNlbGVkLgorCSAgSWYgTkVXUEFHRSBpcyB1c2VkLCBjb21taXQgTkVXUEFHRSBhbmQgdW5jaGFyZ2UgT0xEUEFHRS4KKworCSAgQnV0IHphcF9wdGUoKSAoYnkgZXhpdCBvciBtdW5tYXApIGNhbiBiZSBjYWxsZWQgd2hpbGUgbWlncmF0aW9uLAorCSAgd2UgaGF2ZSB0byBjaGVjayBpZiBPTERQQUdFL05FV1BBR0UgaXMgYSB2YWxpZCBwYWdlIGFmdGVyIGNvbW1pdCgpLgorCis4LiBMUlUKKyAgICAgICAgRWFjaCBtZW1jZyBoYXMgaXRzIG93biBwcml2YXRlIExSVS4gTm93LCBpdCdzIGhhbmRsaW5nIGlzIHVuZGVyIGdsb2JhbAorCVZNJ3MgY29udHJvbCAobWVhbnMgdGhhdCBpdCdzIGhhbmRsZWQgdW5kZXIgZ2xvYmFsIHpvbmUtPmxydV9sb2NrKS4KKwlBbG1vc3QgYWxsIHJvdXRpbmVzIGFyb3VuZCBtZW1jZydzIExSVSBpcyBjYWxsZWQgYnkgZ2xvYmFsIExSVSdzCisJbGlzdCBtYW5hZ2VtZW50IGZ1bmN0aW9ucyB1bmRlciB6b25lLT5scnVfbG9jaygpLgorCisJQSBzcGVjaWFsIGZ1bmN0aW9uIGlzIG1lbV9jZ3JvdXBfaXNvbGF0ZV9wYWdlcygpLiBUaGlzIHNjYW5zCisJbWVtY2cncyBwcml2YXRlIExSVSBhbmQgY2FsbCBfX2lzb2xhdGVfbHJ1X3BhZ2UoKSB0byBleHRyYWN0IGEgcGFnZQorCWZyb20gTFJVLgorCShCeSBfX2lzb2xhdGVfbHJ1X3BhZ2UoKSwgdGhlIHBhZ2UgaXMgcmVtb3ZlZCBmcm9tIGJvdGggb2YgZ2xvYmFsIGFuZAorCSBwcml2YXRlIExSVS4pCisKKworOS4gVHlwaWNhbCBUZXN0cy4KKworIFRlc3RzIGZvciByYWN5IGNhc2VzLgorCisgOS4xIFNtYWxsIGxpbWl0IHRvIG1lbWNnLgorCVdoZW4geW91IGRvIHRlc3QgdG8gZG8gcmFjeSBjYXNlLCBpdCdzIGdvb2QgdGVzdCB0byBzZXQgbWVtY2cncyBsaW1pdAorCXRvIGJlIHZlcnkgc21hbGwgcmF0aGVyIHRoYW4gR0IuIE1hbnkgcmFjZXMgZm91bmQgaW4gdGhlIHRlc3QgdW5kZXIKKwl4S0Igb3IgeHhNQiBsaW1pdHMuCisJKE1lbW9yeSBiZWhhdmlvciB1bmRlciBHQiBhbmQgTWVtb3J5IGJlaGF2aW9yIHVuZGVyIE1CIHNob3dzIHZlcnkKKwkgZGlmZmVyZW50IHNpdHVhdGlvbi4pCisKKyA5LjIgU2htZW0KKwlIaXN0b3JpY2FsbHksIG1lbWNnJ3Mgc2htZW0gaGFuZGxpbmcgd2FzIHBvb3IgYW5kIHdlIHNhdyBzb21lIGFtb3VudAorCW9mIHRyb3VibGVzIGhlcmUuIFRoaXMgaXMgYmVjYXVzZSBzaG1lbSBpcyBwYWdlLWNhY2hlIGJ1dCBjYW4gYmUKKwlTd2FwQ2FjaGUuIFRlc3Qgd2l0aCBzaG1lbS90bXBmcyBpcyBhbHdheXMgZ29vZCB0ZXN0LgorCisgOS4zIE1pZ3JhdGlvbgorCUZvciBOVU1BLCBtaWdyYXRpb24gaXMgYW4gYW5vdGhlciBzcGVjaWFsIGNhc2UuIFRvIGRvIGVhc3kgdGVzdCwgY3B1c2V0CisJaXMgdXNlZnVsLiBGb2xsb3dpbmcgaXMgYSBzYW1wbGUgc2NyaXB0IHRvIGRvIG1pZ3JhdGlvbi4KKworCW1vdW50IC10IGNncm91cCAtbyBjcHVzZXQgbm9uZSAvb3B0L2NwdXNldAorCisJbWtkaXIgL29wdC9jcHVzZXQvMDEKKwllY2hvIDEgPiAvb3B0L2NwdXNldC8wMS9jcHVzZXQuY3B1cworCWVjaG8gMCA+IC9vcHQvY3B1c2V0LzAxL2NwdXNldC5tZW1zCisJZWNobyAxID4gL29wdC9jcHVzZXQvMDEvY3B1c2V0Lm1lbW9yeV9taWdyYXRlCisJbWtkaXIgL29wdC9jcHVzZXQvMDIKKwllY2hvIDEgPiAvb3B0L2NwdXNldC8wMi9jcHVzZXQuY3B1cworCWVjaG8gMSA+IC9vcHQvY3B1c2V0LzAyL2NwdXNldC5tZW1zCisJZWNobyAxID4gL29wdC9jcHVzZXQvMDIvY3B1c2V0Lm1lbW9yeV9taWdyYXRlCisKKwlJbiBhYm92ZSBzZXQsIHdoZW4geW91IG1vdmVzIGEgdGFzayBmcm9tIDAxIHRvIDAyLCBwYWdlIG1pZ3JhdGlvbiB0bworCW5vZGUgMCB0byBub2RlIDEgd2lsbCBvY2N1ci4gRm9sbG93aW5nIGlzIGEgc2NyaXB0IHRvIG1pZ3JhdGUgYWxsCisJdW5kZXIgY3B1c2V0LgorCS0tCisJbW92ZV90YXNrKCkKKwl7CisJZm9yIHBpZCBpbiAkMQorICAgICAgICBkbworICAgICAgICAgICAgICAgIC9iaW4vZWNobyAkcGlkID4kMi90YXNrcyAyPi9kZXYvbnVsbAorCQllY2hvIC1uICRwaWQKKwkJZWNobyAtbiAiICIKKyAgICAgICAgZG9uZQorCWVjaG8gRU5ECisJfQorCisJRzFfVEFTSz1gY2F0ICR7RzF9L3Rhc2tzYAorCUcyX1RBU0s9YGNhdCAke0cyfS90YXNrc2AKKwltb3ZlX3Rhc2sgIiR7RzFfVEFTS30iICR7RzJ9ICYKKwktLQorIDkuNCBNZW1vcnkgaG90cGx1Zy4KKwltZW1vcnkgaG90cGx1ZyB0ZXN0IGlzIG9uZSBvZiBnb29kIHRlc3QuCisJdG8gb2ZmbGluZSBtZW1vcnksIGRvIGZvbGxvd2luZy4KKwkjIGVjaG8gb2ZmbGluZSA+IC9zeXMvZGV2aWNlcy9zeXN0ZW0vbWVtb3J5L21lbW9yeVhYWC9zdGF0ZQorCShYWFggaXMgdGhlIHBsYWNlIG9mIG1lbW9yeSkKKwlUaGlzIGlzIGFuIGVhc3kgd2F5IHRvIHRlc3QgcGFnZSBtaWdyYXRpb24sIHRvby4KKworIDkuNSBta2Rpci9ybWRpcgorCVdoZW4gdXNpbmcgaGllcmFyY2h5LCBta2Rpci9ybWRpciB0ZXN0IHNob3VsZCBiZSBkb25lLgorCVVzZSB0ZXN0cyBsaWtlIHRoZSBmb2xsb3dpbmcuCisKKwllY2hvIDEgPi9vcHQvY2dyb3VwLzAxL21lbW9yeS91c2VfaGllcmFyY2h5CisJbWtkaXIgL29wdC9jZ3JvdXAvMDEvY2hpbGRfYQorCW1rZGlyIC9vcHQvY2dyb3VwLzAxL2NoaWxkX2IKKworCXNldCBsaW1pdCB0byAwMS4KKwlhZGQgbGltaXQgdG8gMDEvY2hpbGRfYgorCXJ1biBqb2JzIHVuZGVyIGNoaWxkX2EgYW5kIGNoaWxkX2IKKworCWNyZWF0ZS9kZWxldGUgZm9sbG93aW5nIGdyb3VwcyBhdCByYW5kb20gd2hpbGUgam9icyBhcmUgcnVubmluZy4KKwkvb3B0L2Nncm91cC8wMS9jaGlsZF9hL2NoaWxkX2FhCisJL29wdC9jZ3JvdXAvMDEvY2hpbGRfYi9jaGlsZF9iYgorCS9vcHQvY2dyb3VwLzAxL2NoaWxkX2MKKworCXJ1bm5pbmcgbmV3IGpvYnMgaW4gbmV3IGdyb3VwIGlzIGFsc28gZ29vZC4KKworIDkuNiBNb3VudCB3aXRoIG90aGVyIHN1YnN5c3RlbXMuCisJTW91bnRpbmcgd2l0aCBvdGhlciBzdWJzeXN0ZW1zIGlzIGEgZ29vZCB0ZXN0IGJlY2F1c2UgdGhlcmUgaXMgYQorCXJhY2UgYW5kIGxvY2sgZGVwZW5kZW5jeSB3aXRoIG90aGVyIGNncm91cCBzdWJzeXN0ZW1zLgorCisJZXhhbXBsZSkKKwkjIG1vdW50IC10IGNncm91cCBub25lIC9jZ3JvdXAgLXQgY3B1c2V0LG1lbW9yeSxjcHUsZGV2aWNlcworCisJYW5kIGRvIHRhc2sgbW92ZSwgbWtkaXIsIHJtZGlyIGV0Yy4uLnVuZGVyIHRoaXMuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2Nncm91cHMvbWVtb3J5LnR4dCBiL0RvY3VtZW50YXRpb24vY2dyb3Vwcy9tZW1vcnkudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxNTAxOTYKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2Nncm91cHMvbWVtb3J5LnR4dApAQCAtMCwwICsxLDM5OSBAQAorTWVtb3J5IFJlc291cmNlIENvbnRyb2xsZXIKKworTk9URTogVGhlIE1lbW9yeSBSZXNvdXJjZSBDb250cm9sbGVyIGhhcyBiZWVuIGdlbmVyaWNhbGx5IGJlZW4gcmVmZXJyZWQKK3RvIGFzIHRoZSBtZW1vcnkgY29udHJvbGxlciBpbiB0aGlzIGRvY3VtZW50LiBEbyBub3QgY29uZnVzZSBtZW1vcnkgY29udHJvbGxlcgordXNlZCBoZXJlIHdpdGggdGhlIG1lbW9yeSBjb250cm9sbGVyIHRoYXQgaXMgdXNlZCBpbiBoYXJkd2FyZS4KKworU2FsaWVudCBmZWF0dXJlcworCithLiBFbmFibGUgY29udHJvbCBvZiBib3RoIFJTUyAobWFwcGVkKSBhbmQgUGFnZSBDYWNoZSAodW5tYXBwZWQpIHBhZ2VzCitiLiBUaGUgaW5mcmFzdHJ1Y3R1cmUgYWxsb3dzIGVhc3kgYWRkaXRpb24gb2Ygb3RoZXIgdHlwZXMgb2YgbWVtb3J5IHRvIGNvbnRyb2wKK2MuIFByb3ZpZGVzICp6ZXJvIG92ZXJoZWFkKiBmb3Igbm9uIG1lbW9yeSBjb250cm9sbGVyIHVzZXJzCitkLiBQcm92aWRlcyBhIGRvdWJsZSBMUlU6IGdsb2JhbCBtZW1vcnkgcHJlc3N1cmUgY2F1c2VzIHJlY2xhaW0gZnJvbSB0aGUKKyAgIGdsb2JhbCBMUlU7IGEgY2dyb3VwIG9uIGhpdHRpbmcgYSBsaW1pdCwgcmVjbGFpbXMgZnJvbSB0aGUgcGVyCisgICBjZ3JvdXAgTFJVCisKK05PVEU6IFN3YXAgQ2FjaGUgKHVubWFwcGVkKSBpcyBub3QgYWNjb3VudGVkIG5vdy4KKworQmVuZWZpdHMgYW5kIFB1cnBvc2Ugb2YgdGhlIG1lbW9yeSBjb250cm9sbGVyCisKK1RoZSBtZW1vcnkgY29udHJvbGxlciBpc29sYXRlcyB0aGUgbWVtb3J5IGJlaGF2aW91ciBvZiBhIGdyb3VwIG9mIHRhc2tzCitmcm9tIHRoZSByZXN0IG9mIHRoZSBzeXN0ZW0uIFRoZSBhcnRpY2xlIG9uIExXTiBbMTJdIG1lbnRpb25zIHNvbWUgcHJvYmFibGUKK3VzZXMgb2YgdGhlIG1lbW9yeSBjb250cm9sbGVyLiBUaGUgbWVtb3J5IGNvbnRyb2xsZXIgY2FuIGJlIHVzZWQgdG8KKworYS4gSXNvbGF0ZSBhbiBhcHBsaWNhdGlvbiBvciBhIGdyb3VwIG9mIGFwcGxpY2F0aW9ucworICAgTWVtb3J5IGh1bmdyeSBhcHBsaWNhdGlvbnMgY2FuIGJlIGlzb2xhdGVkIGFuZCBsaW1pdGVkIHRvIGEgc21hbGxlcgorICAgYW1vdW50IG9mIG1lbW9yeS4KK2IuIENyZWF0ZSBhIGNncm91cCB3aXRoIGxpbWl0ZWQgYW1vdW50IG9mIG1lbW9yeSwgdGhpcyBjYW4gYmUgdXNlZAorICAgYXMgYSBnb29kIGFsdGVybmF0aXZlIHRvIGJvb3Rpbmcgd2l0aCBtZW09WFhYWC4KK2MuIFZpcnR1YWxpemF0aW9uIHNvbHV0aW9ucyBjYW4gY29udHJvbCB0aGUgYW1vdW50IG9mIG1lbW9yeSB0aGV5IHdhbnQKKyAgIHRvIGFzc2lnbiB0byBhIHZpcnR1YWwgbWFjaGluZSBpbnN0YW5jZS4KK2QuIEEgQ0QvRFZEIGJ1cm5lciBjb3VsZCBjb250cm9sIHRoZSBhbW91bnQgb2YgbWVtb3J5IHVzZWQgYnkgdGhlCisgICByZXN0IG9mIHRoZSBzeXN0ZW0gdG8gZW5zdXJlIHRoYXQgYnVybmluZyBkb2VzIG5vdCBmYWlsIGR1ZSB0byBsYWNrCisgICBvZiBhdmFpbGFibGUgbWVtb3J5LgorZS4gVGhlcmUgYXJlIHNldmVyYWwgb3RoZXIgdXNlIGNhc2VzLCBmaW5kIG9uZSBvciB1c2UgdGhlIGNvbnRyb2xsZXIganVzdAorICAgZm9yIGZ1biAodG8gbGVhcm4gYW5kIGhhY2sgb24gdGhlIFZNIHN1YnN5c3RlbSkuCisKKzEuIEhpc3RvcnkKKworVGhlIG1lbW9yeSBjb250cm9sbGVyIGhhcyBhIGxvbmcgaGlzdG9yeS4gQSByZXF1ZXN0IGZvciBjb21tZW50cyBmb3IgdGhlIG1lbW9yeQorY29udHJvbGxlciB3YXMgcG9zdGVkIGJ5IEJhbGJpciBTaW5naCBbMV0uIEF0IHRoZSB0aW1lIHRoZSBSRkMgd2FzIHBvc3RlZAordGhlcmUgd2VyZSBzZXZlcmFsIGltcGxlbWVudGF0aW9ucyBmb3IgbWVtb3J5IGNvbnRyb2wuIFRoZSBnb2FsIG9mIHRoZQorUkZDIHdhcyB0byBidWlsZCBjb25zZW5zdXMgYW5kIGFncmVlbWVudCBmb3IgdGhlIG1pbmltYWwgZmVhdHVyZXMgcmVxdWlyZWQKK2ZvciBtZW1vcnkgY29udHJvbC4gVGhlIGZpcnN0IFJTUyBjb250cm9sbGVyIHdhcyBwb3N0ZWQgYnkgQmFsYmlyIFNpbmdoWzJdCitpbiBGZWIgMjAwNy4gUGF2ZWwgRW1lbGlhbm92IFszXVs0XVs1XSBoYXMgc2luY2UgcG9zdGVkIHRocmVlIHZlcnNpb25zIG9mIHRoZQorUlNTIGNvbnRyb2xsZXIuIEF0IE9MUywgYXQgdGhlIHJlc291cmNlIG1hbmFnZW1lbnQgQm9GLCBldmVyeW9uZSBzdWdnZXN0ZWQKK3RoYXQgd2UgaGFuZGxlIGJvdGggcGFnZSBjYWNoZSBhbmQgUlNTIHRvZ2V0aGVyLiBBbm90aGVyIHJlcXVlc3Qgd2FzIHJhaXNlZAordG8gYWxsb3cgdXNlciBzcGFjZSBoYW5kbGluZyBvZiBPT00uIFRoZSBjdXJyZW50IG1lbW9yeSBjb250cm9sbGVyIGlzCithdCB2ZXJzaW9uIDY7IGl0IGNvbWJpbmVzIGJvdGggbWFwcGVkIChSU1MpIGFuZCB1bm1hcHBlZCBQYWdlCitDYWNoZSBDb250cm9sIFsxMV0uCisKKzIuIE1lbW9yeSBDb250cm9sCisKK01lbW9yeSBpcyBhIHVuaXF1ZSByZXNvdXJjZSBpbiB0aGUgc2Vuc2UgdGhhdCBpdCBpcyBwcmVzZW50IGluIGEgbGltaXRlZAorYW1vdW50LiBJZiBhIHRhc2sgcmVxdWlyZXMgYSBsb3Qgb2YgQ1BVIHByb2Nlc3NpbmcsIHRoZSB0YXNrIGNhbiBzcHJlYWQKK2l0cyBwcm9jZXNzaW5nIG92ZXIgYSBwZXJpb2Qgb2YgaG91cnMsIGRheXMsIG1vbnRocyBvciB5ZWFycywgYnV0IHdpdGgKK21lbW9yeSwgdGhlIHNhbWUgcGh5c2ljYWwgbWVtb3J5IG5lZWRzIHRvIGJlIHJldXNlZCB0byBhY2NvbXBsaXNoIHRoZSB0YXNrLgorCitUaGUgbWVtb3J5IGNvbnRyb2xsZXIgaW1wbGVtZW50YXRpb24gaGFzIGJlZW4gZGl2aWRlZCBpbnRvIHBoYXNlcy4gVGhlc2UKK2FyZToKKworMS4gTWVtb3J5IGNvbnRyb2xsZXIKKzIuIG1sb2NrKDIpIGNvbnRyb2xsZXIKKzMuIEtlcm5lbCB1c2VyIG1lbW9yeSBhY2NvdW50aW5nIGFuZCBzbGFiIGNvbnRyb2wKKzQuIHVzZXIgbWFwcGluZ3MgbGVuZ3RoIGNvbnRyb2xsZXIKKworVGhlIG1lbW9yeSBjb250cm9sbGVyIGlzIHRoZSBmaXJzdCBjb250cm9sbGVyIGRldmVsb3BlZC4KKworMi4xLiBEZXNpZ24KKworVGhlIGNvcmUgb2YgdGhlIGRlc2lnbiBpcyBhIGNvdW50ZXIgY2FsbGVkIHRoZSByZXNfY291bnRlci4gVGhlIHJlc19jb3VudGVyCit0cmFja3MgdGhlIGN1cnJlbnQgbWVtb3J5IHVzYWdlIGFuZCBsaW1pdCBvZiB0aGUgZ3JvdXAgb2YgcHJvY2Vzc2VzIGFzc29jaWF0ZWQKK3dpdGggdGhlIGNvbnRyb2xsZXIuIEVhY2ggY2dyb3VwIGhhcyBhIG1lbW9yeSBjb250cm9sbGVyIHNwZWNpZmljIGRhdGEKK3N0cnVjdHVyZSAobWVtX2Nncm91cCkgYXNzb2NpYXRlZCB3aXRoIGl0LgorCisyLjIuIEFjY291bnRpbmcKKworCQkrLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisJCXwgIG1lbV9jZ3JvdXAgICAgIHwKKwkJfCAgKHJlc19jb3VudGVyKSAgICAgfAorCQkrLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisJCSAvICAgICAgICAgICAgXiAgICAgIFwKKwkJLyAgICAgICAgICAgICB8ICAgICAgIFwKKyAgICAgICAgICAgKy0tLS0tLS0tLS0tLS0tLSsgIHwgICAgICAgICstLS0tLS0tLS0tLS0tLS0rCisgICAgICAgICAgIHwgbW1fc3RydWN0ICAgICB8ICB8Li4uLiAgICB8IG1tX3N0cnVjdCAgICAgfAorICAgICAgICAgICB8ICAgICAgICAgICAgICAgfCAgfCAgICAgICAgfCAgICAgICAgICAgICAgIHwKKyAgICAgICAgICAgKy0tLS0tLS0tLS0tLS0tLSsgIHwgICAgICAgICstLS0tLS0tLS0tLS0tLS0rCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIC0tLS0tLS0tLS0tLS0tKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgICAgKy0tLS0tLS0tLS0tLS0tLSsgICAgICAgICAgICstLS0tLS0rLS0tLS0tLS0rCisgICAgICAgICAgIHwgcGFnZSAgICAgICAgICArLS0tLS0tLS0tLT4gIHBhZ2VfY2dyb3VwfAorICAgICAgICAgICB8ICAgICAgICAgICAgICAgfCAgICAgICAgICAgfCAgICAgICAgICAgICAgIHwKKyAgICAgICAgICAgKy0tLS0tLS0tLS0tLS0tLSsgICAgICAgICAgICstLS0tLS0tLS0tLS0tLS0rCisKKyAgICAgICAgICAgICAoRmlndXJlIDE6IEhpZXJhcmNoeSBvZiBBY2NvdW50aW5nKQorCisKK0ZpZ3VyZSAxIHNob3dzIHRoZSBpbXBvcnRhbnQgYXNwZWN0cyBvZiB0aGUgY29udHJvbGxlcgorCisxLiBBY2NvdW50aW5nIGhhcHBlbnMgcGVyIGNncm91cAorMi4gRWFjaCBtbV9zdHJ1Y3Qga25vd3MgYWJvdXQgd2hpY2ggY2dyb3VwIGl0IGJlbG9uZ3MgdG8KKzMuIEVhY2ggcGFnZSBoYXMgYSBwb2ludGVyIHRvIHRoZSBwYWdlX2Nncm91cCwgd2hpY2ggaW4gdHVybiBrbm93cyB0aGUKKyAgIGNncm91cCBpdCBiZWxvbmdzIHRvCisKK1RoZSBhY2NvdW50aW5nIGlzIGRvbmUgYXMgZm9sbG93czogbWVtX2Nncm91cF9jaGFyZ2UoKSBpcyBpbnZva2VkIHRvIHNldHVwCit0aGUgbmVjZXNzYXJ5IGRhdGEgc3RydWN0dXJlcyBhbmQgY2hlY2sgaWYgdGhlIGNncm91cCB0aGF0IGlzIGJlaW5nIGNoYXJnZWQKK2lzIG92ZXIgaXRzIGxpbWl0LiBJZiBpdCBpcyB0aGVuIHJlY2xhaW0gaXMgaW52b2tlZCBvbiB0aGUgY2dyb3VwLgorTW9yZSBkZXRhaWxzIGNhbiBiZSBmb3VuZCBpbiB0aGUgcmVjbGFpbSBzZWN0aW9uIG9mIHRoaXMgZG9jdW1lbnQuCitJZiBldmVyeXRoaW5nIGdvZXMgd2VsbCwgYSBwYWdlIG1ldGEtZGF0YS1zdHJ1Y3R1cmUgY2FsbGVkIHBhZ2VfY2dyb3VwIGlzCithbGxvY2F0ZWQgYW5kIGFzc29jaWF0ZWQgd2l0aCB0aGUgcGFnZS4gIFRoaXMgcm91dGluZSBhbHNvIGFkZHMgdGhlIHBhZ2UgdG8KK3RoZSBwZXIgY2dyb3VwIExSVS4KKworMi4yLjEgQWNjb3VudGluZyBkZXRhaWxzCisKK0FsbCBtYXBwZWQgYW5vbiBwYWdlcyAoUlNTKSBhbmQgY2FjaGUgcGFnZXMgKFBhZ2UgQ2FjaGUpIGFyZSBhY2NvdW50ZWQuCisoc29tZSBwYWdlcyB3aGljaCBuZXZlciBiZSByZWNsYWltYWJsZSBhbmQgd2lsbCBub3QgYmUgb24gZ2xvYmFsIExSVQorIGFyZSBub3QgYWNjb3VudGVkLiB3ZSBqdXN0IGFjY291bnRzIHBhZ2VzIHVuZGVyIHVzdWFsIHZtIG1hbmFnZW1lbnQuKQorCitSU1MgcGFnZXMgYXJlIGFjY291bnRlZCBhdCBwYWdlX2ZhdWx0IHVubGVzcyB0aGV5J3ZlIGFscmVhZHkgYmVlbiBhY2NvdW50ZWQKK2ZvciBlYXJsaWVyLiBBIGZpbGUgcGFnZSB3aWxsIGJlIGFjY291bnRlZCBmb3IgYXMgUGFnZSBDYWNoZSB3aGVuIGl0J3MKK2luc2VydGVkIGludG8gaW5vZGUgKHJhZGl4LXRyZWUpLiBXaGlsZSBpdCdzIG1hcHBlZCBpbnRvIHRoZSBwYWdlIHRhYmxlcyBvZgorcHJvY2Vzc2VzLCBkdXBsaWNhdGUgYWNjb3VudGluZyBpcyBjYXJlZnVsbHkgYXZvaWRlZC4KKworQSBSU1MgcGFnZSBpcyB1bmFjY291bnRlZCB3aGVuIGl0J3MgZnVsbHkgdW5tYXBwZWQuIEEgUGFnZUNhY2hlIHBhZ2UgaXMKK3VuYWNjb3VudGVkIHdoZW4gaXQncyByZW1vdmVkIGZyb20gcmFkaXgtdHJlZS4KKworQXQgcGFnZSBtaWdyYXRpb24sIGFjY291bnRpbmcgaW5mb3JtYXRpb24gaXMga2VwdC4KKworTm90ZTogd2UganVzdCBhY2NvdW50IHBhZ2VzLW9uLWxydSBiZWNhdXNlIG91ciBwdXJwb3NlIGlzIHRvIGNvbnRyb2wgYW1vdW50CitvZiB1c2VkIHBhZ2VzLiBub3Qtb24tbHJ1IHBhZ2VzIGFyZSB0ZW5kIHRvIGJlIG91dC1vZi1jb250cm9sIGZyb20gdm0gdmlldy4KKworMi4zIFNoYXJlZCBQYWdlIEFjY291bnRpbmcKKworU2hhcmVkIHBhZ2VzIGFyZSBhY2NvdW50ZWQgb24gdGhlIGJhc2lzIG9mIHRoZSBmaXJzdCB0b3VjaCBhcHByb2FjaC4gVGhlCitjZ3JvdXAgdGhhdCBmaXJzdCB0b3VjaGVzIGEgcGFnZSBpcyBhY2NvdW50ZWQgZm9yIHRoZSBwYWdlLiBUaGUgcHJpbmNpcGxlCitiZWhpbmQgdGhpcyBhcHByb2FjaCBpcyB0aGF0IGEgY2dyb3VwIHRoYXQgYWdncmVzc2l2ZWx5IHVzZXMgYSBzaGFyZWQKK3BhZ2Ugd2lsbCBldmVudHVhbGx5IGdldCBjaGFyZ2VkIGZvciBpdCAob25jZSBpdCBpcyB1bmNoYXJnZWQgZnJvbQordGhlIGNncm91cCB0aGF0IGJyb3VnaHQgaXQgaW4gLS0gdGhpcyB3aWxsIGhhcHBlbiBvbiBtZW1vcnkgcHJlc3N1cmUpLgorCitFeGNlcHRpb246IElmIENPTkZJR19DR1JPVVBfQ0dST1VQX01FTV9SRVNfQ1RMUl9TV0FQIGlzIG5vdCB1c2VkLi4KK1doZW4geW91IGRvIHN3YXBvZmYgYW5kIG1ha2Ugc3dhcHBlZC1vdXQgcGFnZXMgb2Ygc2htZW0odG1wZnMpIHRvCitiZSBiYWNrZWQgaW50byBtZW1vcnkgaW4gZm9yY2UsIGNoYXJnZXMgZm9yIHBhZ2VzIGFyZSBhY2NvdW50ZWQgYWdhaW5zdCB0aGUKK2NhbGxlciBvZiBzd2Fwb2ZmIHJhdGhlciB0aGFuIHRoZSB1c2VycyBvZiBzaG1lbS4KKworCisyLjQgU3dhcCBFeHRlbnNpb24gKENPTkZJR19DR1JPVVBfTUVNX1JFU19DVExSX1NXQVApCitTd2FwIEV4dGVuc2lvbiBhbGxvd3MgeW91IHRvIHJlY29yZCBjaGFyZ2UgZm9yIHN3YXAuIEEgc3dhcHBlZC1pbiBwYWdlIGlzCitjaGFyZ2VkIGJhY2sgdG8gb3JpZ2luYWwgcGFnZSBhbGxvY2F0b3IgaWYgcG9zc2libGUuCisKK1doZW4gc3dhcCBpcyBhY2NvdW50ZWQsIGZvbGxvd2luZyBmaWxlcyBhcmUgYWRkZWQuCisgLSBtZW1vcnkubWVtc3cudXNhZ2VfaW5fYnl0ZXMuCisgLSBtZW1vcnkubWVtc3cubGltaXRfaW5fYnl0ZXMuCisKK3VzYWdlIG9mIG1lbStzd2FwIGlzIGxpbWl0ZWQgYnkgbWVtc3cubGltaXRfaW5fYnl0ZXMuCisKK05vdGU6IHdoeSAnbWVtK3N3YXAnIHJhdGhlciB0aGFuIHN3YXAuCitUaGUgZ2xvYmFsIExSVShrc3dhcGQpIGNhbiBzd2FwIG91dCBhcmJpdHJhcnkgcGFnZXMuIFN3YXAtb3V0IG1lYW5zCit0byBtb3ZlIGFjY291bnQgZnJvbSBtZW1vcnkgdG8gc3dhcC4uLnRoZXJlIGlzIG5vIGNoYW5nZSBpbiB1c2FnZSBvZgorbWVtK3N3YXAuCisKK0luIG90aGVyIHdvcmRzLCB3aGVuIHdlIHdhbnQgdG8gbGltaXQgdGhlIHVzYWdlIG9mIHN3YXAgd2l0aG91dCBhZmZlY3RpbmcKK2dsb2JhbCBMUlUsIG1lbStzd2FwIGxpbWl0IGlzIGJldHRlciB0aGFuIGp1c3QgbGltaXRpbmcgc3dhcCBmcm9tIE9TIHBvaW50CitvZiB2aWV3LgorCisyLjUgUmVjbGFpbQorCitFYWNoIGNncm91cCBtYWludGFpbnMgYSBwZXIgY2dyb3VwIExSVSB0aGF0IGNvbnNpc3RzIG9mIGFuIGFjdGl2ZQorYW5kIGluYWN0aXZlIGxpc3QuIFdoZW4gYSBjZ3JvdXAgZ29lcyBvdmVyIGl0cyBsaW1pdCwgd2UgZmlyc3QgdHJ5Cit0byByZWNsYWltIG1lbW9yeSBmcm9tIHRoZSBjZ3JvdXAgc28gYXMgdG8gbWFrZSBzcGFjZSBmb3IgdGhlIG5ldworcGFnZXMgdGhhdCB0aGUgY2dyb3VwIGhhcyB0b3VjaGVkLiBJZiB0aGUgcmVjbGFpbSBpcyB1bnN1Y2Nlc3NmdWwsCithbiBPT00gcm91dGluZSBpcyBpbnZva2VkIHRvIHNlbGVjdCBhbmQga2lsbCB0aGUgYnVsa2llc3QgdGFzayBpbiB0aGUKK2Nncm91cC4KKworVGhlIHJlY2xhaW0gYWxnb3JpdGhtIGhhcyBub3QgYmVlbiBtb2RpZmllZCBmb3IgY2dyb3VwcywgZXhjZXB0IHRoYXQKK3BhZ2VzIHRoYXQgYXJlIHNlbGVjdGVkIGZvciByZWNsYWltaW5nIGNvbWUgZnJvbSB0aGUgcGVyIGNncm91cCBMUlUKK2xpc3QuCisKKzIuIExvY2tpbmcKKworVGhlIG1lbW9yeSBjb250cm9sbGVyIHVzZXMgdGhlIGZvbGxvd2luZyBoaWVyYXJjaHkKKworMS4gem9uZS0+bHJ1X2xvY2sgaXMgdXNlZCBmb3Igc2VsZWN0aW5nIHBhZ2VzIHRvIGJlIGlzb2xhdGVkCisyLiBtZW0tPnBlcl96b25lLT5scnVfbG9jayBwcm90ZWN0cyB0aGUgcGVyIGNncm91cCBMUlUgKHBlciB6b25lKQorMy4gbG9ja19wYWdlX2Nncm91cCgpIGlzIHVzZWQgdG8gcHJvdGVjdCBwYWdlLT5wYWdlX2Nncm91cAorCiszLiBVc2VyIEludGVyZmFjZQorCiswLiBDb25maWd1cmF0aW9uCisKK2EuIEVuYWJsZSBDT05GSUdfQ0dST1VQUworYi4gRW5hYmxlIENPTkZJR19SRVNPVVJDRV9DT1VOVEVSUworYy4gRW5hYmxlIENPTkZJR19DR1JPVVBfTUVNX1JFU19DVExSCisKKzEuIFByZXBhcmUgdGhlIGNncm91cHMKKyMgbWtkaXIgLXAgL2Nncm91cHMKKyMgbW91bnQgLXQgY2dyb3VwIG5vbmUgL2Nncm91cHMgLW8gbWVtb3J5CisKKzIuIE1ha2UgdGhlIG5ldyBncm91cCBhbmQgbW92ZSBiYXNoIGludG8gaXQKKyMgbWtkaXIgL2Nncm91cHMvMAorIyBlY2hvICQkID4gIC9jZ3JvdXBzLzAvdGFza3MKKworU2luY2Ugbm93IHdlJ3JlIGluIHRoZSAwIGNncm91cCwKK1dlIGNhbiBhbHRlciB0aGUgbWVtb3J5IGxpbWl0OgorIyBlY2hvIDRNID4gL2Nncm91cHMvMC9tZW1vcnkubGltaXRfaW5fYnl0ZXMKKworTk9URTogV2UgY2FuIHVzZSBhIHN1ZmZpeCAoaywgSywgbSwgTSwgZyBvciBHKSB0byBpbmRpY2F0ZSB2YWx1ZXMgaW4ga2lsbywKK21lZ2Egb3IgZ2lnYWJ5dGVzLgorCisjIGNhdCAvY2dyb3Vwcy8wL21lbW9yeS5saW1pdF9pbl9ieXRlcworNDE5NDMwNAorCitOT1RFOiBUaGUgaW50ZXJmYWNlIGhhcyBub3cgY2hhbmdlZCB0byBkaXNwbGF5IHRoZSB1c2FnZSBpbiBieXRlcworaW5zdGVhZCBvZiBwYWdlcworCitXZSBjYW4gY2hlY2sgdGhlIHVzYWdlOgorIyBjYXQgL2Nncm91cHMvMC9tZW1vcnkudXNhZ2VfaW5fYnl0ZXMKKzEyMTY1MTIKKworQSBzdWNjZXNzZnVsIHdyaXRlIHRvIHRoaXMgZmlsZSBkb2VzIG5vdCBndWFyYW50ZWUgYSBzdWNjZXNzZnVsIHNldCBvZgordGhpcyBsaW1pdCB0byB0aGUgdmFsdWUgd3JpdHRlbiBpbnRvIHRoZSBmaWxlLiAgVGhpcyBjYW4gYmUgZHVlIHRvIGEKK251bWJlciBvZiBmYWN0b3JzLCBzdWNoIGFzIHJvdW5kaW5nIHVwIHRvIHBhZ2UgYm91bmRhcmllcyBvciB0aGUgdG90YWwKK2F2YWlsYWJpbGl0eSBvZiBtZW1vcnkgb24gdGhlIHN5c3RlbS4gIFRoZSB1c2VyIGlzIHJlcXVpcmVkIHRvIHJlLXJlYWQKK3RoaXMgZmlsZSBhZnRlciBhIHdyaXRlIHRvIGd1YXJhbnRlZSB0aGUgdmFsdWUgY29tbWl0dGVkIGJ5IHRoZSBrZXJuZWwuCisKKyMgZWNobyAxID4gbWVtb3J5LmxpbWl0X2luX2J5dGVzCisjIGNhdCBtZW1vcnkubGltaXRfaW5fYnl0ZXMKKzQwOTYKKworVGhlIG1lbW9yeS5mYWlsY250IGZpZWxkIGdpdmVzIHRoZSBudW1iZXIgb2YgdGltZXMgdGhhdCB0aGUgY2dyb3VwIGxpbWl0IHdhcworZXhjZWVkZWQuCisKK1RoZSBtZW1vcnkuc3RhdCBmaWxlIGdpdmVzIGFjY291bnRpbmcgaW5mb3JtYXRpb24uIE5vdywgdGhlIG51bWJlciBvZgorY2FjaGVzLCBSU1MgYW5kIEFjdGl2ZSBwYWdlcy9JbmFjdGl2ZSBwYWdlcyBhcmUgc2hvd24uCisKKzQuIFRlc3RpbmcKKworQmFsYmlyIHBvc3RlZCBsbWJlbmNoLCBBSU05LCBMVFAgYW5kIHZtbXN0cmVzcyByZXN1bHRzIFsxMF0gYW5kIFsxMV0uCitBcGFydCBmcm9tIHRoYXQgdjYgaGFzIGJlZW4gdGVzdGVkIHdpdGggc2V2ZXJhbCBhcHBsaWNhdGlvbnMgYW5kIHJlZ3VsYXIKK2RhaWx5IHVzZS4gVGhlIGNvbnRyb2xsZXIgaGFzIGFsc28gYmVlbiB0ZXN0ZWQgb24gdGhlIFBQQzY0LCB4ODZfNjQgYW5kCitVTUwgcGxhdGZvcm1zLgorCis0LjEgVHJvdWJsZXNob290aW5nCisKK1NvbWV0aW1lcyBhIHVzZXIgbWlnaHQgZmluZCB0aGF0IHRoZSBhcHBsaWNhdGlvbiB1bmRlciBhIGNncm91cCBpcwordGVybWluYXRlZC4gVGhlcmUgYXJlIHNldmVyYWwgY2F1c2VzIGZvciB0aGlzOgorCisxLiBUaGUgY2dyb3VwIGxpbWl0IGlzIHRvbyBsb3cgKGp1c3QgdG9vIGxvdyB0byBkbyBhbnl0aGluZyB1c2VmdWwpCisyLiBUaGUgdXNlciBpcyB1c2luZyBhbm9ueW1vdXMgbWVtb3J5IGFuZCBzd2FwIGlzIHR1cm5lZCBvZmYgb3IgdG9vIGxvdworCitBIHN5bmMgZm9sbG93ZWQgYnkgZWNobyAxID4gL3Byb2Mvc3lzL3ZtL2Ryb3BfY2FjaGVzIHdpbGwgaGVscCBnZXQgcmlkIG9mCitzb21lIG9mIHRoZSBwYWdlcyBjYWNoZWQgaW4gdGhlIGNncm91cCAocGFnZSBjYWNoZSBwYWdlcykuCisKKzQuMiBUYXNrIG1pZ3JhdGlvbgorCitXaGVuIGEgdGFzayBtaWdyYXRlcyBmcm9tIG9uZSBjZ3JvdXAgdG8gYW5vdGhlciwgaXQncyBjaGFyZ2UgaXMgbm90CitjYXJyaWVkIGZvcndhcmQuIFRoZSBwYWdlcyBhbGxvY2F0ZWQgZnJvbSB0aGUgb3JpZ2luYWwgY2dyb3VwIHN0aWxsCityZW1haW4gY2hhcmdlZCB0byBpdCwgdGhlIGNoYXJnZSBpcyBkcm9wcGVkIHdoZW4gdGhlIHBhZ2UgaXMgZnJlZWQgb3IKK3JlY2xhaW1lZC4KKworNC4zIFJlbW92aW5nIGEgY2dyb3VwCisKK0EgY2dyb3VwIGNhbiBiZSByZW1vdmVkIGJ5IHJtZGlyLCBidXQgYXMgZGlzY3Vzc2VkIGluIHNlY3Rpb25zIDQuMSBhbmQgNC4yLCBhCitjZ3JvdXAgbWlnaHQgaGF2ZSBzb21lIGNoYXJnZSBhc3NvY2lhdGVkIHdpdGggaXQsIGV2ZW4gdGhvdWdoIGFsbAordGFza3MgaGF2ZSBtaWdyYXRlZCBhd2F5IGZyb20gaXQuCitTdWNoIGNoYXJnZXMgYXJlIGZyZWVkKGF0IGRlZmF1bHQpIG9yIG1vdmVkIHRvIGl0cyBwYXJlbnQuIFdoZW4gbW92ZWQsCitib3RoIG9mIFJTUyBhbmQgQ0FDSEVTIGFyZSBtb3ZlZCB0byBwYXJlbnQuCitJZiBib3RoIG9mIHRoZW0gYXJlIGJ1c3ksIHJtZGlyKCkgcmV0dXJucyAtRUJVU1kuIFNlZSA1LjEgQWxzby4KKworQ2hhcmdlcyByZWNvcmRlZCBpbiBzd2FwIGluZm9ybWF0aW9uIGlzIG5vdCB1cGRhdGVkIGF0IHJlbW92YWwgb2YgY2dyb3VwLgorUmVjb3JkZWQgaW5mb3JtYXRpb24gaXMgZGlzY2FyZGVkIGFuZCBhIGNncm91cCB3aGljaCB1c2VzIHN3YXAgKHN3YXBjYWNoZSkKK3dpbGwgYmUgY2hhcmdlZCBhcyBhIG5ldyBvd25lciBvZiBpdC4KKworCis1LiBNaXNjLiBpbnRlcmZhY2VzLgorCis1LjEgZm9yY2VfZW1wdHkKKyAgbWVtb3J5LmZvcmNlX2VtcHR5IGludGVyZmFjZSBpcyBwcm92aWRlZCB0byBtYWtlIGNncm91cCdzIG1lbW9yeSB1c2FnZSBlbXB0eS4KKyAgWW91IGNhbiB1c2UgdGhpcyBpbnRlcmZhY2Ugb25seSB3aGVuIHRoZSBjZ3JvdXAgaGFzIG5vIHRhc2tzLgorICBXaGVuIHdyaXRpbmcgYW55dGhpbmcgdG8gdGhpcworCisgICMgZWNobyAwID4gbWVtb3J5LmZvcmNlX2VtcHR5CisKKyAgQWxtb3N0IGFsbCBwYWdlcyB0cmFja2VkIGJ5IHRoaXMgbWVtY2cgd2lsbCBiZSB1bm1hcHBlZCBhbmQgZnJlZWQuIFNvbWUgb2YKKyAgcGFnZXMgY2Fubm90IGJlIGZyZWVkIGJlY2F1c2UgaXQncyBsb2NrZWQgb3IgaW4tdXNlLiBTdWNoIHBhZ2VzIGFyZSBtb3ZlZAorICB0byBwYXJlbnQgYW5kIHRoaXMgY2dyb3VwIHdpbGwgYmUgZW1wdHkuIEJ1dCB0aGlzIG1heSByZXR1cm4gLUVCVVNZIGluCisgIHNvbWUgdG9vIGJ1c3kgY2FzZS4KKworICBUeXBpY2FsIHVzZSBjYXNlIG9mIHRoaXMgaW50ZXJmYWNlIGlzIHRoYXQgY2FsbGluZyB0aGlzIGJlZm9yZSBybWRpcigpLgorICBCZWNhdXNlIHJtZGlyKCkgbW92ZXMgYWxsIHBhZ2VzIHRvIHBhcmVudCwgc29tZSBvdXQtb2YtdXNlIHBhZ2UgY2FjaGVzIGNhbiBiZQorICBtb3ZlZCB0byB0aGUgcGFyZW50LiBJZiB5b3Ugd2FudCB0byBhdm9pZCB0aGF0LCBmb3JjZV9lbXB0eSB3aWxsIGJlIHVzZWZ1bC4KKworNS4yIHN0YXQgZmlsZQorICBtZW1vcnkuc3RhdCBmaWxlIGluY2x1ZGVzIGZvbGxvd2luZyBzdGF0aXN0aWNzIChub3cpCisJY2FjaGUJCQktICMgb2YgcGFnZXMgZnJvbSBwYWdlLWNhY2hlIGFuZCBzaG1lbS4KKwlyc3MJCQktICMgb2YgcGFnZXMgZnJvbSBhbm9ueW1vdXMgbWVtb3J5LgorCXBncGdpbgkJCS0gIyBvZiBldmVudCBvZiBjaGFyZ2luZworCXBncGdvdXQJCQktICMgb2YgZXZlbnQgb2YgdW5jaGFyZ2luZworCWFjdGl2ZV9hbm9uCQktICMgb2YgcGFnZXMgb24gYWN0aXZlIGxydSBvZiBhbm9uLCBzaG1lbS4KKwlpbmFjdGl2ZV9hbm9uIAkJLSAjIG9mIHBhZ2VzIG9uIGFjdGl2ZSBscnUgb2YgYW5vbiwgc2htZW0KKwlhY3RpdmVfZmlsZQkJLSAjIG9mIHBhZ2VzIG9uIGFjdGl2ZSBscnUgb2YgZmlsZS1jYWNoZQorCWluYWN0aXZlX2ZpbGUJCS0gIyBvZiBwYWdlcyBvbiBpbmFjdGl2ZSBscnUgb2YgZmlsZSBjYWNoZQorCXVuZXZpY3RhYmxlCQktICMgb2YgcGFnZXMgY2Fubm90IGJlIHJlY2xhaW1lZC4obWxvY2tlZCBldGMpCisKKwlCZWxvdyBpcyBkZXBlbmQgb24gQ09ORklHX0RFQlVHX1ZNLgorCWluYWN0aXZlX3JhdGlvCQktIFZNIGluZXJuYWwgcGFyYW1ldGVyLiAoc2VlIG1tL3BhZ2VfYWxsb2MuYykKKwlyZWNlbnRfcm90YXRlZF9hbm9uCS0gVk0gaW50ZXJuYWwgcGFyYW1ldGVyLiAoc2VlIG1tL3Ztc2Nhbi5jKQorCXJlY2VudF9yb3RhdGVkX2ZpbGUJLSBWTSBpbnRlcm5hbCBwYXJhbWV0ZXIuIChzZWUgbW0vdm1zY2FuLmMpCisJcmVjZW50X3NjYW5uZWRfYW5vbiAJLSBWTSBpbnRlcm5hbCBwYXJhbWV0ZXIuIChzZWUgbW0vdm1zY2FuLmMpCisJcmVjZW50X3NjYW5uZWRfZmlsZSAJLSBWTSBpbnRlcm5hbCBwYXJhbWV0ZXIuIChzZWUgbW0vdm1zY2FuLmMpCisKKyAgTWVtbzoKKwlyZWNlbnRfcm90YXRlZCBtZWFucyByZWNlbnQgZnJlcXVlbmN5IG9mIGxydSByb3RhdGlvbi4KKwlyZWNlbnRfc2Nhbm5lZCBtZWFucyByZWNlbnQgIyBvZiBzY2FucyB0byBscnUuCisJc2hvd2luZyBmb3IgYmV0dGVyIGRlYnVnIHBsZWFzZSBzZWUgdGhlIGNvZGUgZm9yIG1lYW5pbmdzLgorCisKKzUuMyBzd2FwcGluZXNzCisgIFNpbWlsYXIgdG8gL3Byb2Mvc3lzL3ZtL3N3YXBwaW5lc3MsIGJ1dCBhZmZlY3RpbmcgYSBoaWVyYXJjaHkgb2YgZ3JvdXBzIG9ubHkuCisKKyAgRm9sbG93aW5nIGNncm91cCdzIHN3YXBpbmVzcyBjYW4ndCBiZSBjaGFuZ2VkLgorICAtIHJvb3QgY2dyb3VwICh1c2VzIC9wcm9jL3N5cy92bS9zd2FwcGluZXNzKS4KKyAgLSBhIGNncm91cCB3aGljaCB1c2VzIGhpZXJhcmNoeSBhbmQgaXQgaGFzIGNoaWxkIGNncm91cC4KKyAgLSBhIGNncm91cCB3aGljaCB1c2VzIGhpZXJhcmNoeSBhbmQgbm90IHRoZSByb290IG9mIGhpZXJhcmNoeS4KKworCis2LiBIaWVyYXJjaHkgc3VwcG9ydAorCitUaGUgbWVtb3J5IGNvbnRyb2xsZXIgc3VwcG9ydHMgYSBkZWVwIGhpZXJhcmNoeSBhbmQgaGllcmFyY2hpY2FsIGFjY291bnRpbmcuCitUaGUgaGllcmFyY2h5IGlzIGNyZWF0ZWQgYnkgY3JlYXRpbmcgdGhlIGFwcHJvcHJpYXRlIGNncm91cHMgaW4gdGhlCitjZ3JvdXAgZmlsZXN5c3RlbS4gQ29uc2lkZXIgZm9yIGV4YW1wbGUsIHRoZSBmb2xsb3dpbmcgY2dyb3VwIGZpbGVzeXN0ZW0KK2hpZXJhcmNoeQorCisJCXJvb3QKKwkgICAgIC8gIHwgICBcCisgICAgICAgICAgIC8JfCAgICBcCisJICBhCWIJYworCQkJfCBcCisJCQl8ICBcCisJCQlkICAgZQorCitJbiB0aGUgZGlhZ3JhbSBhYm92ZSwgd2l0aCBoaWVyYXJjaGljYWwgYWNjb3VudGluZyBlbmFibGVkLCBhbGwgbWVtb3J5Cit1c2FnZSBvZiBlLCBpcyBhY2NvdW50ZWQgdG8gaXRzIGFuY2VzdG9ycyB1cCB1bnRpbCB0aGUgcm9vdCAoaS5lLCBjIGFuZCByb290KSwKK3RoYXQgaGFzIG1lbW9yeS51c2VfaGllcmFyY2h5IGVuYWJsZWQuICBJZiBvbmUgb2YgdGhlIGFuY2VzdG9ycyBnb2VzIG92ZXIgaXRzCitsaW1pdCwgdGhlIHJlY2xhaW0gYWxnb3JpdGhtIHJlY2xhaW1zIGZyb20gdGhlIHRhc2tzIGluIHRoZSBhbmNlc3RvciBhbmQgdGhlCitjaGlsZHJlbiBvZiB0aGUgYW5jZXN0b3IuCisKKzYuMSBFbmFibGluZyBoaWVyYXJjaGljYWwgYWNjb3VudGluZyBhbmQgcmVjbGFpbQorCitUaGUgbWVtb3J5IGNvbnRyb2xsZXIgYnkgZGVmYXVsdCBkaXNhYmxlcyB0aGUgaGllcmFyY2h5IGZlYXR1cmUuIFN1cHBvcnQKK2NhbiBiZSBlbmFibGVkIGJ5IHdyaXRpbmcgMSB0byBtZW1vcnkudXNlX2hpZXJhcmNoeSBmaWxlIG9mIHRoZSByb290IGNncm91cAorCisjIGVjaG8gMSA+IG1lbW9yeS51c2VfaGllcmFyY2h5CisKK1RoZSBmZWF0dXJlIGNhbiBiZSBkaXNhYmxlZCBieQorCisjIGVjaG8gMCA+IG1lbW9yeS51c2VfaGllcmFyY2h5CisKK05PVEUxOiBFbmFibGluZy9kaXNhYmxpbmcgd2lsbCBmYWlsIGlmIHRoZSBjZ3JvdXAgYWxyZWFkeSBoYXMgb3RoZXIKK2Nncm91cHMgY3JlYXRlZCBiZWxvdyBpdC4KKworTk9URTI6IFRoaXMgZmVhdHVyZSBjYW4gYmUgZW5hYmxlZC9kaXNhYmxlZCBwZXIgc3VidHJlZS4KKworNy4gVE9ETworCisxLiBBZGQgc3VwcG9ydCBmb3IgYWNjb3VudGluZyBodWdlIHBhZ2VzIChhcyBhIHNlcGFyYXRlIGNvbnRyb2xsZXIpCisyLiBNYWtlIHBlci1jZ3JvdXAgc2Nhbm5lciByZWNsYWltIG5vdC1zaGFyZWQgcGFnZXMgZmlyc3QKKzMuIFRlYWNoIGNvbnRyb2xsZXIgdG8gYWNjb3VudCBmb3Igc2hhcmVkLXBhZ2VzCis0LiBTdGFydCByZWNsYW1hdGlvbiBpbiB0aGUgYmFja2dyb3VuZCB3aGVuIHRoZSBsaW1pdCBpcworICAgbm90IHlldCBoaXQgYnV0IHRoZSB1c2FnZSBpcyBnZXR0aW5nIGNsb3NlcgorCitTdW1tYXJ5CisKK092ZXJhbGwsIHRoZSBtZW1vcnkgY29udHJvbGxlciBoYXMgYmVlbiBhIHN0YWJsZSBjb250cm9sbGVyIGFuZCBoYXMgYmVlbgorY29tbWVudGVkIGFuZCBkaXNjdXNzZWQgcXVpdGUgZXh0ZW5zaXZlbHkgaW4gdGhlIGNvbW11bml0eS4KKworUmVmZXJlbmNlcworCisxLiBTaW5naCwgQmFsYmlyLiBSRkM6IE1lbW9yeSBDb250cm9sbGVyLCBodHRwOi8vbHduLm5ldC9BcnRpY2xlcy8yMDY2OTcvCisyLiBTaW5naCwgQmFsYmlyLiBNZW1vcnkgQ29udHJvbGxlciAoUlNTIENvbnRyb2wpLAorICAgaHR0cDovL2x3bi5uZXQvQXJ0aWNsZXMvMjIyNzYyLworMy4gRW1lbGlhbm92LCBQYXZlbC4gUmVzb3VyY2UgY29udHJvbGxlcnMgYmFzZWQgb24gcHJvY2VzcyBjZ3JvdXBzCisgICBodHRwOi8vbGttbC5vcmcvbGttbC8yMDA3LzMvNi8xOTgKKzQuIEVtZWxpYW5vdiwgUGF2ZWwuIFJTUyBjb250cm9sbGVyIGJhc2VkIG9uIHByb2Nlc3MgY2dyb3VwcyAodjIpCisgICBodHRwOi8vbGttbC5vcmcvbGttbC8yMDA3LzQvOS83OAorNS4gRW1lbGlhbm92LCBQYXZlbC4gUlNTIGNvbnRyb2xsZXIgYmFzZWQgb24gcHJvY2VzcyBjZ3JvdXBzICh2MykKKyAgIGh0dHA6Ly9sa21sLm9yZy9sa21sLzIwMDcvNS8zMC8yNDQKKzYuIE1lbmFnZSwgUGF1bC4gQ29udHJvbCBHcm91cHMgdjEwLCBodHRwOi8vbHduLm5ldC9BcnRpY2xlcy8yMzYwMzIvCis3LiBWYWlkeWFuYXRoYW4sIFNyaW5pdmFzYW4sIENvbnRyb2wgR3JvdXBzOiBQYWdlY2FjaGUgYWNjb3VudGluZyBhbmQgY29udHJvbAorICAgc3Vic3lzdGVtICh2MyksIGh0dHA6Ly9sd24ubmV0L0FydGljbGVzLzIzNTUzNC8KKzguIFNpbmdoLCBCYWxiaXIuIFJTUyBjb250cm9sbGVyIHYyIHRlc3QgcmVzdWx0cyAobG1iZW5jaCksCisgICBodHRwOi8vbGttbC5vcmcvbGttbC8yMDA3LzUvMTcvMjMyCis5LiBTaW5naCwgQmFsYmlyLiBSU1MgY29udHJvbGxlciB2MiBBSU05IHJlc3VsdHMKKyAgIGh0dHA6Ly9sa21sLm9yZy9sa21sLzIwMDcvNS8xOC8xCisxMC4gU2luZ2gsIEJhbGJpci4gTWVtb3J5IGNvbnRyb2xsZXIgdjYgdGVzdCByZXN1bHRzLAorICAgIGh0dHA6Ly9sa21sLm9yZy9sa21sLzIwMDcvOC8xOS8zNgorMTEuIFNpbmdoLCBCYWxiaXIuIE1lbW9yeSBjb250cm9sbGVyIGludHJvZHVjdGlvbiAodjYpLAorICAgIGh0dHA6Ly9sa21sLm9yZy9sa21sLzIwMDcvOC8xNy82OQorMTIuIENvcmJldCwgSm9uYXRoYW4sIENvbnRyb2xsaW5nIG1lbW9yeSB1c2UgaW4gY2dyb3VwcywKKyAgICBodHRwOi8vbHduLm5ldC9BcnRpY2xlcy8yNDM3OTUvCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2NvbnRyb2xsZXJzL3Jlc291cmNlX2NvdW50ZXIudHh0IGIvRG9jdW1lbnRhdGlvbi9jZ3JvdXBzL3Jlc291cmNlX2NvdW50ZXIudHh0CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL2NvbnRyb2xsZXJzL3Jlc291cmNlX2NvdW50ZXIudHh0CnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL2Nncm91cHMvcmVzb3VyY2VfY291bnRlci50eHQKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vY29udHJvbGxlcnMvbWVtb3J5LnR4dCBiL0RvY3VtZW50YXRpb24vY29udHJvbGxlcnMvbWVtb3J5LnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWMwNzU0Ny4uMDAwMDAwMAotLS0gYS9Eb2N1bWVudGF0aW9uL2NvbnRyb2xsZXJzL21lbW9yeS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwyODQgKzAsMCBAQAotTWVtb3J5IFJlc291cmNlIENvbnRyb2xsZXIKLQotTk9URTogVGhlIE1lbW9yeSBSZXNvdXJjZSBDb250cm9sbGVyIGhhcyBiZWVuIGdlbmVyaWNhbGx5IGJlZW4gcmVmZXJyZWQKLXRvIGFzIHRoZSBtZW1vcnkgY29udHJvbGxlciBpbiB0aGlzIGRvY3VtZW50LiBEbyBub3QgY29uZnVzZSBtZW1vcnkgY29udHJvbGxlcgotdXNlZCBoZXJlIHdpdGggdGhlIG1lbW9yeSBjb250cm9sbGVyIHRoYXQgaXMgdXNlZCBpbiBoYXJkd2FyZS4KLQotU2FsaWVudCBmZWF0dXJlcwotCi1hLiBFbmFibGUgY29udHJvbCBvZiBib3RoIFJTUyAobWFwcGVkKSBhbmQgUGFnZSBDYWNoZSAodW5tYXBwZWQpIHBhZ2VzCi1iLiBUaGUgaW5mcmFzdHJ1Y3R1cmUgYWxsb3dzIGVhc3kgYWRkaXRpb24gb2Ygb3RoZXIgdHlwZXMgb2YgbWVtb3J5IHRvIGNvbnRyb2wKLWMuIFByb3ZpZGVzICp6ZXJvIG92ZXJoZWFkKiBmb3Igbm9uIG1lbW9yeSBjb250cm9sbGVyIHVzZXJzCi1kLiBQcm92aWRlcyBhIGRvdWJsZSBMUlU6IGdsb2JhbCBtZW1vcnkgcHJlc3N1cmUgY2F1c2VzIHJlY2xhaW0gZnJvbSB0aGUKLSAgIGdsb2JhbCBMUlU7IGEgY2dyb3VwIG9uIGhpdHRpbmcgYSBsaW1pdCwgcmVjbGFpbXMgZnJvbSB0aGUgcGVyCi0gICBjZ3JvdXAgTFJVCi0KLU5PVEU6IFN3YXAgQ2FjaGUgKHVubWFwcGVkKSBpcyBub3QgYWNjb3VudGVkIG5vdy4KLQotQmVuZWZpdHMgYW5kIFB1cnBvc2Ugb2YgdGhlIG1lbW9yeSBjb250cm9sbGVyCi0KLVRoZSBtZW1vcnkgY29udHJvbGxlciBpc29sYXRlcyB0aGUgbWVtb3J5IGJlaGF2aW91ciBvZiBhIGdyb3VwIG9mIHRhc2tzCi1mcm9tIHRoZSByZXN0IG9mIHRoZSBzeXN0ZW0uIFRoZSBhcnRpY2xlIG9uIExXTiBbMTJdIG1lbnRpb25zIHNvbWUgcHJvYmFibGUKLXVzZXMgb2YgdGhlIG1lbW9yeSBjb250cm9sbGVyLiBUaGUgbWVtb3J5IGNvbnRyb2xsZXIgY2FuIGJlIHVzZWQgdG8KLQotYS4gSXNvbGF0ZSBhbiBhcHBsaWNhdGlvbiBvciBhIGdyb3VwIG9mIGFwcGxpY2F0aW9ucwotICAgTWVtb3J5IGh1bmdyeSBhcHBsaWNhdGlvbnMgY2FuIGJlIGlzb2xhdGVkIGFuZCBsaW1pdGVkIHRvIGEgc21hbGxlcgotICAgYW1vdW50IG9mIG1lbW9yeS4KLWIuIENyZWF0ZSBhIGNncm91cCB3aXRoIGxpbWl0ZWQgYW1vdW50IG9mIG1lbW9yeSwgdGhpcyBjYW4gYmUgdXNlZAotICAgYXMgYSBnb29kIGFsdGVybmF0aXZlIHRvIGJvb3Rpbmcgd2l0aCBtZW09WFhYWC4KLWMuIFZpcnR1YWxpemF0aW9uIHNvbHV0aW9ucyBjYW4gY29udHJvbCB0aGUgYW1vdW50IG9mIG1lbW9yeSB0aGV5IHdhbnQKLSAgIHRvIGFzc2lnbiB0byBhIHZpcnR1YWwgbWFjaGluZSBpbnN0YW5jZS4KLWQuIEEgQ0QvRFZEIGJ1cm5lciBjb3VsZCBjb250cm9sIHRoZSBhbW91bnQgb2YgbWVtb3J5IHVzZWQgYnkgdGhlCi0gICByZXN0IG9mIHRoZSBzeXN0ZW0gdG8gZW5zdXJlIHRoYXQgYnVybmluZyBkb2VzIG5vdCBmYWlsIGR1ZSB0byBsYWNrCi0gICBvZiBhdmFpbGFibGUgbWVtb3J5LgotZS4gVGhlcmUgYXJlIHNldmVyYWwgb3RoZXIgdXNlIGNhc2VzLCBmaW5kIG9uZSBvciB1c2UgdGhlIGNvbnRyb2xsZXIganVzdAotICAgZm9yIGZ1biAodG8gbGVhcm4gYW5kIGhhY2sgb24gdGhlIFZNIHN1YnN5c3RlbSkuCi0KLTEuIEhpc3RvcnkKLQotVGhlIG1lbW9yeSBjb250cm9sbGVyIGhhcyBhIGxvbmcgaGlzdG9yeS4gQSByZXF1ZXN0IGZvciBjb21tZW50cyBmb3IgdGhlIG1lbW9yeQotY29udHJvbGxlciB3YXMgcG9zdGVkIGJ5IEJhbGJpciBTaW5naCBbMV0uIEF0IHRoZSB0aW1lIHRoZSBSRkMgd2FzIHBvc3RlZAotdGhlcmUgd2VyZSBzZXZlcmFsIGltcGxlbWVudGF0aW9ucyBmb3IgbWVtb3J5IGNvbnRyb2wuIFRoZSBnb2FsIG9mIHRoZQotUkZDIHdhcyB0byBidWlsZCBjb25zZW5zdXMgYW5kIGFncmVlbWVudCBmb3IgdGhlIG1pbmltYWwgZmVhdHVyZXMgcmVxdWlyZWQKLWZvciBtZW1vcnkgY29udHJvbC4gVGhlIGZpcnN0IFJTUyBjb250cm9sbGVyIHdhcyBwb3N0ZWQgYnkgQmFsYmlyIFNpbmdoWzJdCi1pbiBGZWIgMjAwNy4gUGF2ZWwgRW1lbGlhbm92IFszXVs0XVs1XSBoYXMgc2luY2UgcG9zdGVkIHRocmVlIHZlcnNpb25zIG9mIHRoZQotUlNTIGNvbnRyb2xsZXIuIEF0IE9MUywgYXQgdGhlIHJlc291cmNlIG1hbmFnZW1lbnQgQm9GLCBldmVyeW9uZSBzdWdnZXN0ZWQKLXRoYXQgd2UgaGFuZGxlIGJvdGggcGFnZSBjYWNoZSBhbmQgUlNTIHRvZ2V0aGVyLiBBbm90aGVyIHJlcXVlc3Qgd2FzIHJhaXNlZAotdG8gYWxsb3cgdXNlciBzcGFjZSBoYW5kbGluZyBvZiBPT00uIFRoZSBjdXJyZW50IG1lbW9yeSBjb250cm9sbGVyIGlzCi1hdCB2ZXJzaW9uIDY7IGl0IGNvbWJpbmVzIGJvdGggbWFwcGVkIChSU1MpIGFuZCB1bm1hcHBlZCBQYWdlCi1DYWNoZSBDb250cm9sIFsxMV0uCi0KLTIuIE1lbW9yeSBDb250cm9sCi0KLU1lbW9yeSBpcyBhIHVuaXF1ZSByZXNvdXJjZSBpbiB0aGUgc2Vuc2UgdGhhdCBpdCBpcyBwcmVzZW50IGluIGEgbGltaXRlZAotYW1vdW50LiBJZiBhIHRhc2sgcmVxdWlyZXMgYSBsb3Qgb2YgQ1BVIHByb2Nlc3NpbmcsIHRoZSB0YXNrIGNhbiBzcHJlYWQKLWl0cyBwcm9jZXNzaW5nIG92ZXIgYSBwZXJpb2Qgb2YgaG91cnMsIGRheXMsIG1vbnRocyBvciB5ZWFycywgYnV0IHdpdGgKLW1lbW9yeSwgdGhlIHNhbWUgcGh5c2ljYWwgbWVtb3J5IG5lZWRzIHRvIGJlIHJldXNlZCB0byBhY2NvbXBsaXNoIHRoZSB0YXNrLgotCi1UaGUgbWVtb3J5IGNvbnRyb2xsZXIgaW1wbGVtZW50YXRpb24gaGFzIGJlZW4gZGl2aWRlZCBpbnRvIHBoYXNlcy4gVGhlc2UKLWFyZToKLQotMS4gTWVtb3J5IGNvbnRyb2xsZXIKLTIuIG1sb2NrKDIpIGNvbnRyb2xsZXIKLTMuIEtlcm5lbCB1c2VyIG1lbW9yeSBhY2NvdW50aW5nIGFuZCBzbGFiIGNvbnRyb2wKLTQuIHVzZXIgbWFwcGluZ3MgbGVuZ3RoIGNvbnRyb2xsZXIKLQotVGhlIG1lbW9yeSBjb250cm9sbGVyIGlzIHRoZSBmaXJzdCBjb250cm9sbGVyIGRldmVsb3BlZC4KLQotMi4xLiBEZXNpZ24KLQotVGhlIGNvcmUgb2YgdGhlIGRlc2lnbiBpcyBhIGNvdW50ZXIgY2FsbGVkIHRoZSByZXNfY291bnRlci4gVGhlIHJlc19jb3VudGVyCi10cmFja3MgdGhlIGN1cnJlbnQgbWVtb3J5IHVzYWdlIGFuZCBsaW1pdCBvZiB0aGUgZ3JvdXAgb2YgcHJvY2Vzc2VzIGFzc29jaWF0ZWQKLXdpdGggdGhlIGNvbnRyb2xsZXIuIEVhY2ggY2dyb3VwIGhhcyBhIG1lbW9yeSBjb250cm9sbGVyIHNwZWNpZmljIGRhdGEKLXN0cnVjdHVyZSAobWVtX2Nncm91cCkgYXNzb2NpYXRlZCB3aXRoIGl0LgotCi0yLjIuIEFjY291bnRpbmcKLQotCQkrLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0JCXwgIG1lbV9jZ3JvdXAgICAgIHwKLQkJfCAgKHJlc19jb3VudGVyKSAgICAgfAotCQkrLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0JCSAvICAgICAgICAgICAgXiAgICAgIFwKLQkJLyAgICAgICAgICAgICB8ICAgICAgIFwKLSAgICAgICAgICAgKy0tLS0tLS0tLS0tLS0tLSsgIHwgICAgICAgICstLS0tLS0tLS0tLS0tLS0rCi0gICAgICAgICAgIHwgbW1fc3RydWN0ICAgICB8ICB8Li4uLiAgICB8IG1tX3N0cnVjdCAgICAgfAotICAgICAgICAgICB8ICAgICAgICAgICAgICAgfCAgfCAgICAgICAgfCAgICAgICAgICAgICAgIHwKLSAgICAgICAgICAgKy0tLS0tLS0tLS0tLS0tLSsgIHwgICAgICAgICstLS0tLS0tLS0tLS0tLS0rCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIC0tLS0tLS0tLS0tLS0tKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAgICAgICAgKy0tLS0tLS0tLS0tLS0tLSsgICAgICAgICAgICstLS0tLS0rLS0tLS0tLS0rCi0gICAgICAgICAgIHwgcGFnZSAgICAgICAgICArLS0tLS0tLS0tLT4gIHBhZ2VfY2dyb3VwfAotICAgICAgICAgICB8ICAgICAgICAgICAgICAgfCAgICAgICAgICAgfCAgICAgICAgICAgICAgIHwKLSAgICAgICAgICAgKy0tLS0tLS0tLS0tLS0tLSsgICAgICAgICAgICstLS0tLS0tLS0tLS0tLS0rCi0KLSAgICAgICAgICAgICAoRmlndXJlIDE6IEhpZXJhcmNoeSBvZiBBY2NvdW50aW5nKQotCi0KLUZpZ3VyZSAxIHNob3dzIHRoZSBpbXBvcnRhbnQgYXNwZWN0cyBvZiB0aGUgY29udHJvbGxlcgotCi0xLiBBY2NvdW50aW5nIGhhcHBlbnMgcGVyIGNncm91cAotMi4gRWFjaCBtbV9zdHJ1Y3Qga25vd3MgYWJvdXQgd2hpY2ggY2dyb3VwIGl0IGJlbG9uZ3MgdG8KLTMuIEVhY2ggcGFnZSBoYXMgYSBwb2ludGVyIHRvIHRoZSBwYWdlX2Nncm91cCwgd2hpY2ggaW4gdHVybiBrbm93cyB0aGUKLSAgIGNncm91cCBpdCBiZWxvbmdzIHRvCi0KLVRoZSBhY2NvdW50aW5nIGlzIGRvbmUgYXMgZm9sbG93czogbWVtX2Nncm91cF9jaGFyZ2UoKSBpcyBpbnZva2VkIHRvIHNldHVwCi10aGUgbmVjZXNzYXJ5IGRhdGEgc3RydWN0dXJlcyBhbmQgY2hlY2sgaWYgdGhlIGNncm91cCB0aGF0IGlzIGJlaW5nIGNoYXJnZWQKLWlzIG92ZXIgaXRzIGxpbWl0LiBJZiBpdCBpcyB0aGVuIHJlY2xhaW0gaXMgaW52b2tlZCBvbiB0aGUgY2dyb3VwLgotTW9yZSBkZXRhaWxzIGNhbiBiZSBmb3VuZCBpbiB0aGUgcmVjbGFpbSBzZWN0aW9uIG9mIHRoaXMgZG9jdW1lbnQuCi1JZiBldmVyeXRoaW5nIGdvZXMgd2VsbCwgYSBwYWdlIG1ldGEtZGF0YS1zdHJ1Y3R1cmUgY2FsbGVkIHBhZ2VfY2dyb3VwIGlzCi1hbGxvY2F0ZWQgYW5kIGFzc29jaWF0ZWQgd2l0aCB0aGUgcGFnZS4gIFRoaXMgcm91dGluZSBhbHNvIGFkZHMgdGhlIHBhZ2UgdG8KLXRoZSBwZXIgY2dyb3VwIExSVS4KLQotMi4yLjEgQWNjb3VudGluZyBkZXRhaWxzCi0KLUFsbCBtYXBwZWQgYW5vbiBwYWdlcyAoUlNTKSBhbmQgY2FjaGUgcGFnZXMgKFBhZ2UgQ2FjaGUpIGFyZSBhY2NvdW50ZWQuCi0oc29tZSBwYWdlcyB3aGljaCBuZXZlciBiZSByZWNsYWltYWJsZSBhbmQgd2lsbCBub3QgYmUgb24gZ2xvYmFsIExSVQotIGFyZSBub3QgYWNjb3VudGVkLiB3ZSBqdXN0IGFjY291bnRzIHBhZ2VzIHVuZGVyIHVzdWFsIHZtIG1hbmFnZW1lbnQuKQotCi1SU1MgcGFnZXMgYXJlIGFjY291bnRlZCBhdCBwYWdlX2ZhdWx0IHVubGVzcyB0aGV5J3ZlIGFscmVhZHkgYmVlbiBhY2NvdW50ZWQKLWZvciBlYXJsaWVyLiBBIGZpbGUgcGFnZSB3aWxsIGJlIGFjY291bnRlZCBmb3IgYXMgUGFnZSBDYWNoZSB3aGVuIGl0J3MKLWluc2VydGVkIGludG8gaW5vZGUgKHJhZGl4LXRyZWUpLiBXaGlsZSBpdCdzIG1hcHBlZCBpbnRvIHRoZSBwYWdlIHRhYmxlcyBvZgotcHJvY2Vzc2VzLCBkdXBsaWNhdGUgYWNjb3VudGluZyBpcyBjYXJlZnVsbHkgYXZvaWRlZC4KLQotQSBSU1MgcGFnZSBpcyB1bmFjY291bnRlZCB3aGVuIGl0J3MgZnVsbHkgdW5tYXBwZWQuIEEgUGFnZUNhY2hlIHBhZ2UgaXMKLXVuYWNjb3VudGVkIHdoZW4gaXQncyByZW1vdmVkIGZyb20gcmFkaXgtdHJlZS4KLQotQXQgcGFnZSBtaWdyYXRpb24sIGFjY291bnRpbmcgaW5mb3JtYXRpb24gaXMga2VwdC4KLQotTm90ZTogd2UganVzdCBhY2NvdW50IHBhZ2VzLW9uLWxydSBiZWNhdXNlIG91ciBwdXJwb3NlIGlzIHRvIGNvbnRyb2wgYW1vdW50Ci1vZiB1c2VkIHBhZ2VzLiBub3Qtb24tbHJ1IHBhZ2VzIGFyZSB0ZW5kIHRvIGJlIG91dC1vZi1jb250cm9sIGZyb20gdm0gdmlldy4KLQotMi4zIFNoYXJlZCBQYWdlIEFjY291bnRpbmcKLQotU2hhcmVkIHBhZ2VzIGFyZSBhY2NvdW50ZWQgb24gdGhlIGJhc2lzIG9mIHRoZSBmaXJzdCB0b3VjaCBhcHByb2FjaC4gVGhlCi1jZ3JvdXAgdGhhdCBmaXJzdCB0b3VjaGVzIGEgcGFnZSBpcyBhY2NvdW50ZWQgZm9yIHRoZSBwYWdlLiBUaGUgcHJpbmNpcGxlCi1iZWhpbmQgdGhpcyBhcHByb2FjaCBpcyB0aGF0IGEgY2dyb3VwIHRoYXQgYWdncmVzc2l2ZWx5IHVzZXMgYSBzaGFyZWQKLXBhZ2Ugd2lsbCBldmVudHVhbGx5IGdldCBjaGFyZ2VkIGZvciBpdCAob25jZSBpdCBpcyB1bmNoYXJnZWQgZnJvbQotdGhlIGNncm91cCB0aGF0IGJyb3VnaHQgaXQgaW4gLS0gdGhpcyB3aWxsIGhhcHBlbiBvbiBtZW1vcnkgcHJlc3N1cmUpLgotCi0yLjQgUmVjbGFpbQotCi1FYWNoIGNncm91cCBtYWludGFpbnMgYSBwZXIgY2dyb3VwIExSVSB0aGF0IGNvbnNpc3RzIG9mIGFuIGFjdGl2ZQotYW5kIGluYWN0aXZlIGxpc3QuIFdoZW4gYSBjZ3JvdXAgZ29lcyBvdmVyIGl0cyBsaW1pdCwgd2UgZmlyc3QgdHJ5Ci10byByZWNsYWltIG1lbW9yeSBmcm9tIHRoZSBjZ3JvdXAgc28gYXMgdG8gbWFrZSBzcGFjZSBmb3IgdGhlIG5ldwotcGFnZXMgdGhhdCB0aGUgY2dyb3VwIGhhcyB0b3VjaGVkLiBJZiB0aGUgcmVjbGFpbSBpcyB1bnN1Y2Nlc3NmdWwsCi1hbiBPT00gcm91dGluZSBpcyBpbnZva2VkIHRvIHNlbGVjdCBhbmQga2lsbCB0aGUgYnVsa2llc3QgdGFzayBpbiB0aGUKLWNncm91cC4KLQotVGhlIHJlY2xhaW0gYWxnb3JpdGhtIGhhcyBub3QgYmVlbiBtb2RpZmllZCBmb3IgY2dyb3VwcywgZXhjZXB0IHRoYXQKLXBhZ2VzIHRoYXQgYXJlIHNlbGVjdGVkIGZvciByZWNsYWltaW5nIGNvbWUgZnJvbSB0aGUgcGVyIGNncm91cCBMUlUKLWxpc3QuCi0KLTIuIExvY2tpbmcKLQotVGhlIG1lbW9yeSBjb250cm9sbGVyIHVzZXMgdGhlIGZvbGxvd2luZyBoaWVyYXJjaHkKLQotMS4gem9uZS0+bHJ1X2xvY2sgaXMgdXNlZCBmb3Igc2VsZWN0aW5nIHBhZ2VzIHRvIGJlIGlzb2xhdGVkCi0yLiBtZW0tPnBlcl96b25lLT5scnVfbG9jayBwcm90ZWN0cyB0aGUgcGVyIGNncm91cCBMUlUgKHBlciB6b25lKQotMy4gbG9ja19wYWdlX2Nncm91cCgpIGlzIHVzZWQgdG8gcHJvdGVjdCBwYWdlLT5wYWdlX2Nncm91cAotCi0zLiBVc2VyIEludGVyZmFjZQotCi0wLiBDb25maWd1cmF0aW9uCi0KLWEuIEVuYWJsZSBDT05GSUdfQ0dST1VQUwotYi4gRW5hYmxlIENPTkZJR19SRVNPVVJDRV9DT1VOVEVSUwotYy4gRW5hYmxlIENPTkZJR19DR1JPVVBfTUVNX1JFU19DVExSCi0KLTEuIFByZXBhcmUgdGhlIGNncm91cHMKLSMgbWtkaXIgLXAgL2Nncm91cHMKLSMgbW91bnQgLXQgY2dyb3VwIG5vbmUgL2Nncm91cHMgLW8gbWVtb3J5Ci0KLTIuIE1ha2UgdGhlIG5ldyBncm91cCBhbmQgbW92ZSBiYXNoIGludG8gaXQKLSMgbWtkaXIgL2Nncm91cHMvMAotIyBlY2hvICQkID4gIC9jZ3JvdXBzLzAvdGFza3MKLQotU2luY2Ugbm93IHdlJ3JlIGluIHRoZSAwIGNncm91cCwKLVdlIGNhbiBhbHRlciB0aGUgbWVtb3J5IGxpbWl0OgotIyBlY2hvIDRNID4gL2Nncm91cHMvMC9tZW1vcnkubGltaXRfaW5fYnl0ZXMKLQotTk9URTogV2UgY2FuIHVzZSBhIHN1ZmZpeCAoaywgSywgbSwgTSwgZyBvciBHKSB0byBpbmRpY2F0ZSB2YWx1ZXMgaW4ga2lsbywKLW1lZ2Egb3IgZ2lnYWJ5dGVzLgotCi0jIGNhdCAvY2dyb3Vwcy8wL21lbW9yeS5saW1pdF9pbl9ieXRlcwotNDE5NDMwNAotCi1OT1RFOiBUaGUgaW50ZXJmYWNlIGhhcyBub3cgY2hhbmdlZCB0byBkaXNwbGF5IHRoZSB1c2FnZSBpbiBieXRlcwotaW5zdGVhZCBvZiBwYWdlcwotCi1XZSBjYW4gY2hlY2sgdGhlIHVzYWdlOgotIyBjYXQgL2Nncm91cHMvMC9tZW1vcnkudXNhZ2VfaW5fYnl0ZXMKLTEyMTY1MTIKLQotQSBzdWNjZXNzZnVsIHdyaXRlIHRvIHRoaXMgZmlsZSBkb2VzIG5vdCBndWFyYW50ZWUgYSBzdWNjZXNzZnVsIHNldCBvZgotdGhpcyBsaW1pdCB0byB0aGUgdmFsdWUgd3JpdHRlbiBpbnRvIHRoZSBmaWxlLiAgVGhpcyBjYW4gYmUgZHVlIHRvIGEKLW51bWJlciBvZiBmYWN0b3JzLCBzdWNoIGFzIHJvdW5kaW5nIHVwIHRvIHBhZ2UgYm91bmRhcmllcyBvciB0aGUgdG90YWwKLWF2YWlsYWJpbGl0eSBvZiBtZW1vcnkgb24gdGhlIHN5c3RlbS4gIFRoZSB1c2VyIGlzIHJlcXVpcmVkIHRvIHJlLXJlYWQKLXRoaXMgZmlsZSBhZnRlciBhIHdyaXRlIHRvIGd1YXJhbnRlZSB0aGUgdmFsdWUgY29tbWl0dGVkIGJ5IHRoZSBrZXJuZWwuCi0KLSMgZWNobyAxID4gbWVtb3J5LmxpbWl0X2luX2J5dGVzCi0jIGNhdCBtZW1vcnkubGltaXRfaW5fYnl0ZXMKLTQwOTYKLQotVGhlIG1lbW9yeS5mYWlsY250IGZpZWxkIGdpdmVzIHRoZSBudW1iZXIgb2YgdGltZXMgdGhhdCB0aGUgY2dyb3VwIGxpbWl0IHdhcwotZXhjZWVkZWQuCi0KLVRoZSBtZW1vcnkuc3RhdCBmaWxlIGdpdmVzIGFjY291bnRpbmcgaW5mb3JtYXRpb24uIE5vdywgdGhlIG51bWJlciBvZgotY2FjaGVzLCBSU1MgYW5kIEFjdGl2ZSBwYWdlcy9JbmFjdGl2ZSBwYWdlcyBhcmUgc2hvd24uCi0KLVRoZSBtZW1vcnkuZm9yY2VfZW1wdHkgZ2l2ZXMgYW4gaW50ZXJmYWNlIHRvIGRyb3AgKmFsbCogY2hhcmdlcyBieSBmb3JjZS4KLQotIyBlY2hvIDEgPiBtZW1vcnkuZm9yY2VfZW1wdHkKLQotd2lsbCBkcm9wIGFsbCBjaGFyZ2VzIGluIGNncm91cC4gQ3VycmVudGx5LCB0aGlzIGlzIG1haW50YWluZWQgZm9yIHRlc3QuCi0KLTQuIFRlc3RpbmcKLQotQmFsYmlyIHBvc3RlZCBsbWJlbmNoLCBBSU05LCBMVFAgYW5kIHZtbXN0cmVzcyByZXN1bHRzIFsxMF0gYW5kIFsxMV0uCi1BcGFydCBmcm9tIHRoYXQgdjYgaGFzIGJlZW4gdGVzdGVkIHdpdGggc2V2ZXJhbCBhcHBsaWNhdGlvbnMgYW5kIHJlZ3VsYXIKLWRhaWx5IHVzZS4gVGhlIGNvbnRyb2xsZXIgaGFzIGFsc28gYmVlbiB0ZXN0ZWQgb24gdGhlIFBQQzY0LCB4ODZfNjQgYW5kCi1VTUwgcGxhdGZvcm1zLgotCi00LjEgVHJvdWJsZXNob290aW5nCi0KLVNvbWV0aW1lcyBhIHVzZXIgbWlnaHQgZmluZCB0aGF0IHRoZSBhcHBsaWNhdGlvbiB1bmRlciBhIGNncm91cCBpcwotdGVybWluYXRlZC4gVGhlcmUgYXJlIHNldmVyYWwgY2F1c2VzIGZvciB0aGlzOgotCi0xLiBUaGUgY2dyb3VwIGxpbWl0IGlzIHRvbyBsb3cgKGp1c3QgdG9vIGxvdyB0byBkbyBhbnl0aGluZyB1c2VmdWwpCi0yLiBUaGUgdXNlciBpcyB1c2luZyBhbm9ueW1vdXMgbWVtb3J5IGFuZCBzd2FwIGlzIHR1cm5lZCBvZmYgb3IgdG9vIGxvdwotCi1BIHN5bmMgZm9sbG93ZWQgYnkgZWNobyAxID4gL3Byb2Mvc3lzL3ZtL2Ryb3BfY2FjaGVzIHdpbGwgaGVscCBnZXQgcmlkIG9mCi1zb21lIG9mIHRoZSBwYWdlcyBjYWNoZWQgaW4gdGhlIGNncm91cCAocGFnZSBjYWNoZSBwYWdlcykuCi0KLTQuMiBUYXNrIG1pZ3JhdGlvbgotCi1XaGVuIGEgdGFzayBtaWdyYXRlcyBmcm9tIG9uZSBjZ3JvdXAgdG8gYW5vdGhlciwgaXQncyBjaGFyZ2UgaXMgbm90Ci1jYXJyaWVkIGZvcndhcmQuIFRoZSBwYWdlcyBhbGxvY2F0ZWQgZnJvbSB0aGUgb3JpZ2luYWwgY2dyb3VwIHN0aWxsCi1yZW1haW4gY2hhcmdlZCB0byBpdCwgdGhlIGNoYXJnZSBpcyBkcm9wcGVkIHdoZW4gdGhlIHBhZ2UgaXMgZnJlZWQgb3IKLXJlY2xhaW1lZC4KLQotNC4zIFJlbW92aW5nIGEgY2dyb3VwCi0KLUEgY2dyb3VwIGNhbiBiZSByZW1vdmVkIGJ5IHJtZGlyLCBidXQgYXMgZGlzY3Vzc2VkIGluIHNlY3Rpb25zIDQuMSBhbmQgNC4yLCBhCi1jZ3JvdXAgbWlnaHQgaGF2ZSBzb21lIGNoYXJnZSBhc3NvY2lhdGVkIHdpdGggaXQsIGV2ZW4gdGhvdWdoIGFsbAotdGFza3MgaGF2ZSBtaWdyYXRlZCBhd2F5IGZyb20gaXQuIFN1Y2ggY2hhcmdlcyBhcmUgYXV0b21hdGljYWxseSBkcm9wcGVkIGF0Ci1ybWRpcigpIGlmIHRoZXJlIGFyZSBubyB0YXNrcy4KLQotNS4gVE9ETwotCi0xLiBBZGQgc3VwcG9ydCBmb3IgYWNjb3VudGluZyBodWdlIHBhZ2VzIChhcyBhIHNlcGFyYXRlIGNvbnRyb2xsZXIpCi0yLiBNYWtlIHBlci1jZ3JvdXAgc2Nhbm5lciByZWNsYWltIG5vdC1zaGFyZWQgcGFnZXMgZmlyc3QKLTMuIFRlYWNoIGNvbnRyb2xsZXIgdG8gYWNjb3VudCBmb3Igc2hhcmVkLXBhZ2VzCi00LiBTdGFydCByZWNsYW1hdGlvbiBpbiB0aGUgYmFja2dyb3VuZCB3aGVuIHRoZSBsaW1pdCBpcwotICAgbm90IHlldCBoaXQgYnV0IHRoZSB1c2FnZSBpcyBnZXR0aW5nIGNsb3NlcgotCi1TdW1tYXJ5Ci0KLU92ZXJhbGwsIHRoZSBtZW1vcnkgY29udHJvbGxlciBoYXMgYmVlbiBhIHN0YWJsZSBjb250cm9sbGVyIGFuZCBoYXMgYmVlbgotY29tbWVudGVkIGFuZCBkaXNjdXNzZWQgcXVpdGUgZXh0ZW5zaXZlbHkgaW4gdGhlIGNvbW11bml0eS4KLQotUmVmZXJlbmNlcwotCi0xLiBTaW5naCwgQmFsYmlyLiBSRkM6IE1lbW9yeSBDb250cm9sbGVyLCBodHRwOi8vbHduLm5ldC9BcnRpY2xlcy8yMDY2OTcvCi0yLiBTaW5naCwgQmFsYmlyLiBNZW1vcnkgQ29udHJvbGxlciAoUlNTIENvbnRyb2wpLAotICAgaHR0cDovL2x3bi5uZXQvQXJ0aWNsZXMvMjIyNzYyLwotMy4gRW1lbGlhbm92LCBQYXZlbC4gUmVzb3VyY2UgY29udHJvbGxlcnMgYmFzZWQgb24gcHJvY2VzcyBjZ3JvdXBzCi0gICBodHRwOi8vbGttbC5vcmcvbGttbC8yMDA3LzMvNi8xOTgKLTQuIEVtZWxpYW5vdiwgUGF2ZWwuIFJTUyBjb250cm9sbGVyIGJhc2VkIG9uIHByb2Nlc3MgY2dyb3VwcyAodjIpCi0gICBodHRwOi8vbGttbC5vcmcvbGttbC8yMDA3LzQvOS83OAotNS4gRW1lbGlhbm92LCBQYXZlbC4gUlNTIGNvbnRyb2xsZXIgYmFzZWQgb24gcHJvY2VzcyBjZ3JvdXBzICh2MykKLSAgIGh0dHA6Ly9sa21sLm9yZy9sa21sLzIwMDcvNS8zMC8yNDQKLTYuIE1lbmFnZSwgUGF1bC4gQ29udHJvbCBHcm91cHMgdjEwLCBodHRwOi8vbHduLm5ldC9BcnRpY2xlcy8yMzYwMzIvCi03LiBWYWlkeWFuYXRoYW4sIFNyaW5pdmFzYW4sIENvbnRyb2wgR3JvdXBzOiBQYWdlY2FjaGUgYWNjb3VudGluZyBhbmQgY29udHJvbAotICAgc3Vic3lzdGVtICh2MyksIGh0dHA6Ly9sd24ubmV0L0FydGljbGVzLzIzNTUzNC8KLTguIFNpbmdoLCBCYWxiaXIuIFJTUyBjb250cm9sbGVyIHYyIHRlc3QgcmVzdWx0cyAobG1iZW5jaCksCi0gICBodHRwOi8vbGttbC5vcmcvbGttbC8yMDA3LzUvMTcvMjMyCi05LiBTaW5naCwgQmFsYmlyLiBSU1MgY29udHJvbGxlciB2MiBBSU05IHJlc3VsdHMKLSAgIGh0dHA6Ly9sa21sLm9yZy9sa21sLzIwMDcvNS8xOC8xCi0xMC4gU2luZ2gsIEJhbGJpci4gTWVtb3J5IGNvbnRyb2xsZXIgdjYgdGVzdCByZXN1bHRzLAotICAgIGh0dHA6Ly9sa21sLm9yZy9sa21sLzIwMDcvOC8xOS8zNgotMTEuIFNpbmdoLCBCYWxiaXIuIE1lbW9yeSBjb250cm9sbGVyIGludHJvZHVjdGlvbiAodjYpLAotICAgIGh0dHA6Ly9sa21sLm9yZy9sa21sLzIwMDcvOC8xNy82OQotMTIuIENvcmJldCwgSm9uYXRoYW4sIENvbnRyb2xsaW5nIG1lbW9yeSB1c2UgaW4gY2dyb3VwcywKLSAgICBodHRwOi8vbHduLm5ldC9BcnRpY2xlcy8yNDM3OTUvCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2NyeXB0by9hc3luYy10eC1hcGkudHh0IGIvRG9jdW1lbnRhdGlvbi9jcnlwdG8vYXN5bmMtdHgtYXBpLnR4dAppbmRleCBjMWU5NTQ1Li45ZjU5ZmNiIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2NyeXB0by9hc3luYy10eC1hcGkudHh0CisrKyBiL0RvY3VtZW50YXRpb24vY3J5cHRvL2FzeW5jLXR4LWFwaS50eHQKQEAgLTEzLDkgKzEzLDkgQEAKIDMuNiBDb25zdHJhaW50cwogMy43IEV4YW1wbGUKIAotNCBEUklWRVIgREVWRUxPUEVSIE5PVEVTCis0IERNQUVOR0lORSBEUklWRVIgREVWRUxPUEVSIE5PVEVTCiA0LjEgQ29uZm9ybWFuY2UgcG9pbnRzCi00LjIgIk15IGFwcGxpY2F0aW9uIG5lZWRzIGZpbmVyIGNvbnRyb2wgb2YgaGFyZHdhcmUgY2hhbm5lbHMiCis0LjIgIk15IGFwcGxpY2F0aW9uIG5lZWRzIGV4Y2x1c2l2ZSBjb250cm9sIG9mIGhhcmR3YXJlIGNoYW5uZWxzIgogCiA1IFNPVVJDRQogCkBAIC0xNTAsNiArMTUwLDcgQEAKIGltcGxlbWVudGF0aW9uIGV4YW1wbGVzLgogCiA0IERSSVZFUiBERVZFTE9QTUVOVCBOT1RFUworCiA0LjEgQ29uZm9ybWFuY2UgcG9pbnRzOgogVGhlcmUgYXJlIGEgZmV3IGNvbmZvcm1hbmNlIHBvaW50cyByZXF1aXJlZCBpbiBkbWFlbmdpbmUgZHJpdmVycyB0bwogYWNjb21tb2RhdGUgYXNzdW1wdGlvbnMgbWFkZSBieSBhcHBsaWNhdGlvbnMgdXNpbmcgdGhlIGFzeW5jX3R4IEFQSToKQEAgLTE1OCw1OCArMTU5LDQ5IEBACiAzLyBVc2UgYXN5bmNfdHhfcnVuX2RlcGVuZGVuY2llcygpIGluIHRoZSBkZXNjcmlwdG9yIGNsZWFuIHVwIHBhdGggdG8KICAgIGhhbmRsZSBzdWJtaXNzaW9uIG9mIGRlcGVuZGVudCBvcGVyYXRpb25zCiAKLTQuMiAiTXkgYXBwbGljYXRpb24gbmVlZHMgZmluZXIgY29udHJvbCBvZiBoYXJkd2FyZSBjaGFubmVscyIKLVRoaXMgcmVxdWlyZW1lbnQgc2VlbXMgdG8gYXJpc2UgZnJvbSBjYXNlcyB3aGVyZSBhIERNQSBlbmdpbmUgZHJpdmVyIGlzCi10cnlpbmcgdG8gc3VwcG9ydCBkZXZpY2UtdG8tbWVtb3J5IERNQS4gIFRoZSBkbWFlbmdpbmUgYW5kIGFzeW5jX3R4Ci1pbXBsZW1lbnRhdGlvbnMgd2VyZSBkZXNpZ25lZCBmb3Igb2ZmbG9hZGluZyBtZW1vcnktdG8tbWVtb3J5Ci1vcGVyYXRpb25zOyBob3dldmVyLCB0aGVyZSBhcmUgc29tZSBjYXBhYmlsaXRpZXMgb2YgdGhlIGRtYWVuZ2luZSBsYXllcgotdGhhdCBjYW4gYmUgdXNlZCBmb3IgcGxhdGZvcm0tc3BlY2lmaWMgY2hhbm5lbCBtYW5hZ2VtZW50LgotUGxhdGZvcm0tc3BlY2lmaWMgY29uc3RyYWludHMgY2FuIGJlIGhhbmRsZWQgYnkgcmVnaXN0ZXJpbmcgdGhlCi1hcHBsaWNhdGlvbiBhcyBhICdkbWFfY2xpZW50JyBhbmQgaW1wbGVtZW50aW5nIGEgJ2RtYV9ldmVudF9jYWxsYmFjaycgdG8KLWFwcGx5IGEgZmlsdGVyIHRvIHRoZSBhdmFpbGFibGUgY2hhbm5lbHMgaW4gdGhlIHN5c3RlbS4gIEJlZm9yZSBzaG93aW5nCi1ob3cgdG8gaW1wbGVtZW50IGEgY3VzdG9tIGRtYV9ldmVudCBjYWxsYmFjayBzb21lIGJhY2tncm91bmQgb2YKLWRtYWVuZ2luZSdzIGNsaWVudCBzdXBwb3J0IGlzIHJlcXVpcmVkLgorNC4yICJNeSBhcHBsaWNhdGlvbiBuZWVkcyBleGNsdXNpdmUgY29udHJvbCBvZiBoYXJkd2FyZSBjaGFubmVscyIKK1ByaW1hcmlseSB0aGlzIHJlcXVpcmVtZW50IGFyaXNlcyBmcm9tIGNhc2VzIHdoZXJlIGEgRE1BIGVuZ2luZSBkcml2ZXIKK2lzIGJlaW5nIHVzZWQgdG8gc3VwcG9ydCBkZXZpY2UtdG8tbWVtb3J5IG9wZXJhdGlvbnMuICBBIGNoYW5uZWwgdGhhdCBpcworcGVyZm9ybWluZyB0aGVzZSBvcGVyYXRpb25zIGNhbm5vdCwgZm9yIG1hbnkgcGxhdGZvcm0gc3BlY2lmaWMgcmVhc29ucywKK2JlIHNoYXJlZC4gIEZvciB0aGVzZSBjYXNlcyB0aGUgZG1hX3JlcXVlc3RfY2hhbm5lbCgpIGludGVyZmFjZSBpcworcHJvdmlkZWQuCiAKLVRoZSBmb2xsb3dpbmcgcm91dGluZXMgaW4gZG1hZW5naW5lIHN1cHBvcnQgbXVsdGlwbGUgY2xpZW50cyByZXF1ZXN0aW5nCi11c2Ugb2YgYSBjaGFubmVsOgotLSBkbWFfYXN5bmNfY2xpZW50X3JlZ2lzdGVyKHN0cnVjdCBkbWFfY2xpZW50ICpjbGllbnQpCi0tIGRtYV9hc3luY19jbGllbnRfY2hhbl9yZXF1ZXN0KHN0cnVjdCBkbWFfY2xpZW50ICpjbGllbnQpCitUaGUgaW50ZXJmYWNlIGlzOgorc3RydWN0IGRtYV9jaGFuICpkbWFfcmVxdWVzdF9jaGFubmVsKGRtYV9jYXBfbWFza190IG1hc2ssCisJCQkJICAgICBkbWFfZmlsdGVyX2ZuIGZpbHRlcl9mbiwKKwkJCQkgICAgIHZvaWQgKmZpbHRlcl9wYXJhbSk7CiAKLWRtYV9hc3luY19jbGllbnRfcmVnaXN0ZXIgdGFrZXMgYSBwb2ludGVyIHRvIGFuIGluaXRpYWxpemVkIGRtYV9jbGllbnQKLXN0cnVjdHVyZS4gIEl0IGV4cGVjdHMgdGhhdCB0aGUgJ2V2ZW50X2NhbGxiYWNrJyBhbmQgJ2NhcF9tYXNrJyBmaWVsZHMKLWFyZSBhbHJlYWR5IGluaXRpYWxpemVkLgorV2hlcmUgZG1hX2ZpbHRlcl9mbiBpcyBkZWZpbmVkIGFzOgordHlwZWRlZiBib29sICgqZG1hX2ZpbHRlcl9mbikoc3RydWN0IGRtYV9jaGFuICpjaGFuLCB2b2lkICpmaWx0ZXJfcGFyYW0pOwogCi1kbWFfYXN5bmNfY2xpZW50X2NoYW5fcmVxdWVzdCB0cmlnZ2VycyBkbWFlbmdpbmUgdG8gbm90aWZ5IHRoZSBjbGllbnQgb2YKLWFsbCBjaGFubmVscyB0aGF0IHNhdGlzZnkgdGhlIGNhcGFiaWxpdHkgbWFzay4gIEl0IGlzIHVwIHRvIHRoZSBjbGllbnQncwotZXZlbnRfY2FsbGJhY2sgcm91dGluZSB0byB0cmFjayBob3cgbWFueSBjaGFubmVscyB0aGUgY2xpZW50IG5lZWRzIGFuZAotaG93IG1hbnkgaXQgaXMgY3VycmVudGx5IHVzaW5nLiAgVGhlIGRtYV9ldmVudF9jYWxsYmFjayByb3V0aW5lIHJldHVybnMgYQotZG1hX3N0YXRlX2NsaWVudCBjb2RlIHRvIGxldCBkbWFlbmdpbmUga25vdyB0aGUgc3RhdHVzIG9mIHRoZQotYWxsb2NhdGlvbi4KK1doZW4gdGhlIG9wdGlvbmFsICdmaWx0ZXJfZm4nIHBhcmFtZXRlciBpcyBzZXQgdG8gTlVMTAorZG1hX3JlcXVlc3RfY2hhbm5lbCBzaW1wbHkgcmV0dXJucyB0aGUgZmlyc3QgY2hhbm5lbCB0aGF0IHNhdGlzZmllcyB0aGUKK2NhcGFiaWxpdHkgbWFzay4gIE90aGVyd2lzZSwgd2hlbiB0aGUgbWFzayBwYXJhbWV0ZXIgaXMgaW5zdWZmaWNpZW50IGZvcgorc3BlY2lmeWluZyB0aGUgbmVjZXNzYXJ5IGNoYW5uZWwsIHRoZSBmaWx0ZXJfZm4gcm91dGluZSBjYW4gYmUgdXNlZCB0bworZGlzcG9zaXRpb24gdGhlIGF2YWlsYWJsZSBjaGFubmVscyBpbiB0aGUgc3lzdGVtLiBUaGUgZmlsdGVyX2ZuIHJvdXRpbmUKK2lzIGNhbGxlZCBvbmNlIGZvciBlYWNoIGZyZWUgY2hhbm5lbCBpbiB0aGUgc3lzdGVtLiAgVXBvbiBzZWVpbmcgYQorc3VpdGFibGUgY2hhbm5lbCBmaWx0ZXJfZm4gcmV0dXJucyBETUFfQUNLIHdoaWNoIGZsYWdzIHRoYXQgY2hhbm5lbCB0bworYmUgdGhlIHJldHVybiB2YWx1ZSBmcm9tIGRtYV9yZXF1ZXN0X2NoYW5uZWwuICBBIGNoYW5uZWwgYWxsb2NhdGVkIHZpYQordGhpcyBpbnRlcmZhY2UgaXMgZXhjbHVzaXZlIHRvIHRoZSBjYWxsZXIsIHVudGlsIGRtYV9yZWxlYXNlX2NoYW5uZWwoKQoraXMgY2FsbGVkLgogCi1CZWxvdyBpcyB0aGUgZXhhbXBsZSBvZiBob3cgdG8gZXh0ZW5kIHRoaXMgZnVuY3Rpb25hbGl0eSBmb3IKLXBsYXRmb3JtLXNwZWNpZmljIGZpbHRlcmluZyBvZiB0aGUgYXZhaWxhYmxlIGNoYW5uZWxzIGJleW9uZCB0aGUKLXN0YW5kYXJkIGNhcGFiaWxpdHkgbWFzazoKK1RoZSBETUFfUFJJVkFURSBjYXBhYmlsaXR5IGZsYWcgaXMgdXNlZCB0byB0YWcgZG1hIGRldmljZXMgdGhhdCBzaG91bGQKK25vdCBiZSB1c2VkIGJ5IHRoZSBnZW5lcmFsLXB1cnBvc2UgYWxsb2NhdG9yLiAgSXQgY2FuIGJlIHNldCBhdAoraW5pdGlhbGl6YXRpb24gdGltZSBpZiBpdCBpcyBrbm93biB0aGF0IGEgY2hhbm5lbCB3aWxsIGFsd2F5cyBiZQorcHJpdmF0ZS4gIEFsdGVybmF0aXZlbHksIGl0IGlzIHNldCB3aGVuIGRtYV9yZXF1ZXN0X2NoYW5uZWwoKSBmaW5kcyBhbgordW51c2VkICJwdWJsaWMiIGNoYW5uZWwuCiAKLXN0YXRpYyBlbnVtIGRtYV9zdGF0ZV9jbGllbnQKLW15X2RtYV9jbGllbnRfY2FsbGJhY2soc3RydWN0IGRtYV9jbGllbnQgKmNsaWVudCwKLQkJCXN0cnVjdCBkbWFfY2hhbiAqY2hhbiwgZW51bSBkbWFfc3RhdGUgc3RhdGUpCi17Ci0Jc3RydWN0IGRtYV9kZXZpY2UgKmRtYV9kZXY7Ci0Jc3RydWN0IG15X3BsYXRmb3JtX3NwZWNpZmljX2RtYSAqcGxhdF9kbWFfZGV2OwotCQotCWRtYV9kZXYgPSBjaGFuLT5kZXZpY2U7Ci0JcGxhdF9kbWFfZGV2ID0gY29udGFpbmVyX29mKGRtYV9kZXYsCi0JCQkJICAgIHN0cnVjdCBteV9wbGF0Zm9ybV9zcGVjaWZpY19kbWEsCi0JCQkJICAgIGRtYV9kZXYpOwotCi0JaWYgKCFwbGF0X2RtYV9kZXYtPnBsYXRmb3JtX3NwZWNpZmljX2NhcGFiaWxpdHkpCi0JCXJldHVybiBETUFfRFVQOwotCi0JLiAuIC4KLX0KK0EgY291cGxlIGNhdmVhdHMgdG8gbm90ZSB3aGVuIGltcGxlbWVudGluZyBhIGRyaXZlciBhbmQgY29uc3VtZXI6CisxLyBPbmNlIGEgY2hhbm5lbCBoYXMgYmVlbiBwcml2YXRlbHkgYWxsb2NhdGVkIGl0IHdpbGwgbm8gbG9uZ2VyIGJlCisgICBjb25zaWRlcmVkIGJ5IHRoZSBnZW5lcmFsLXB1cnBvc2UgYWxsb2NhdG9yIGV2ZW4gYWZ0ZXIgYSBjYWxsIHRvCisgICBkbWFfcmVsZWFzZV9jaGFubmVsKCkuCisyLyBTaW5jZSBjYXBhYmlsaXRpZXMgYXJlIHNwZWNpZmllZCBhdCB0aGUgZGV2aWNlIGxldmVsIGEgZG1hX2RldmljZQorICAgd2l0aCBtdWx0aXBsZSBjaGFubmVscyB3aWxsIGVpdGhlciBoYXZlIGFsbCBjaGFubmVscyBwdWJsaWMsIG9yIGFsbAorICAgY2hhbm5lbHMgcHJpdmF0ZS4KIAogNSBTT1VSQ0UKLWluY2x1ZGUvbGludXgvZG1hZW5naW5lLmg6IGNvcmUgaGVhZGVyIGZpbGUgZm9yIERNQSBkcml2ZXJzIGFuZCBjbGllbnRzCisKK2luY2x1ZGUvbGludXgvZG1hZW5naW5lLmg6IGNvcmUgaGVhZGVyIGZpbGUgZm9yIERNQSBkcml2ZXJzIGFuZCBhcGkgdXNlcnMKIGRyaXZlcnMvZG1hL2RtYWVuZ2luZS5jOiBvZmZsb2FkIGVuZ2luZSBjaGFubmVsIG1hbmFnZW1lbnQgcm91dGluZXMKIGRyaXZlcnMvZG1hLzogbG9jYXRpb24gZm9yIG9mZmxvYWQgZW5naW5lIGRyaXZlcnMKIGluY2x1ZGUvbGludXgvYXN5bmNfdHguaDogY29yZSBoZWFkZXIgZmlsZSBmb3IgdGhlIGFzeW5jX3R4IGFwaQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZWxsX3JidS50eHQgYi9Eb2N1bWVudGF0aW9uL2RlbGxfcmJ1LnR4dAppbmRleCAyYzBkNjMxLi5jMTFiOTMxIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RlbGxfcmJ1LnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RlbGxfcmJ1LnR4dApAQCAtODEsOCArODEsOCBAQAogQWxzbyBlY2hvaW5nIGVpdGhlciBtb25vICxwYWNrZXQgb3IgaW5pdCBpbiB0byBpbWFnZV90eXBlIHdpbGwgZnJlZSB1cCB0aGUKIG1lbW9yeSBhbGxvY2F0ZWQgYnkgdGhlIGRyaXZlci4KIAotSWYgYW4gdXNlciBieSBhY2NpZGVudCBleGVjdXRlcyBzdGVwcyAxIGFuZCAzIGFib3ZlIHdpdGhvdXQgZXhlY3V0aW5nIHN0ZXAgMjsKLWl0IHdpbGwgbWFrZSB0aGUgL3N5cy9jbGFzcy9maXJtd2FyZS9kZWxsX3JidS8gZW50cmllcyB0byBkaXNhcHBlYXIuCitJZiBhIHVzZXIgYnkgYWNjaWRlbnQgZXhlY3V0ZXMgc3RlcHMgMSBhbmQgMyBhYm92ZSB3aXRob3V0IGV4ZWN1dGluZyBzdGVwIDI7CitpdCB3aWxsIG1ha2UgdGhlIC9zeXMvY2xhc3MvZmlybXdhcmUvZGVsbF9yYnUvIGVudHJpZXMgZGlzYXBwZWFyLgogVGhlIGVudHJpZXMgY2FuIGJlIHJlY3JlYXRlZCBieSBkb2luZyB0aGUgZm9sbG93aW5nCiBlY2hvIGluaXQgPiAvc3lzL2RldmljZXMvcGxhdGZvcm0vZGVsbF9yYnUvaW1hZ2VfdHlwZQogTk9URTogZWNob2luZyBpbml0IGluIGltYWdlX3R5cGUgZG9lcyBub3QgY2hhbmdlIGl0IG9yaWdpbmFsIHZhbHVlLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZlbG9wbWVudC1wcm9jZXNzLzQuQ29kaW5nIGIvRG9jdW1lbnRhdGlvbi9kZXZlbG9wbWVudC1wcm9jZXNzLzQuQ29kaW5nCmluZGV4IDAxNGFjYTguLmE1YTM0NTAgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2ZWxvcG1lbnQtcHJvY2Vzcy80LkNvZGluZworKysgYi9Eb2N1bWVudGF0aW9uL2RldmVsb3BtZW50LXByb2Nlc3MvNC5Db2RpbmcKQEAgLTM3NSwxMCArMzc1LDEwIEBACiBqdXN0aWZpY2F0aW9uIGlzIHNvbGlkLgogCiBXaGVuIG1ha2luZyBhbiBpbmNvbXBhdGlibGUgQVBJIGNoYW5nZSwgb25lIHNob3VsZCwgd2hlbmV2ZXIgcG9zc2libGUsCi1lbnN1cmUgdGhhdCBjb2RlIHdoaWNoIGhhcyBub3QgYmVlbiB1cGRhdGVkIGlzIGNhdWdodCBieSB0aGUgY29tcGlsZXIuICAKK2Vuc3VyZSB0aGF0IGNvZGUgd2hpY2ggaGFzIG5vdCBiZWVuIHVwZGF0ZWQgaXMgY2F1Z2h0IGJ5IHRoZSBjb21waWxlci4KIFRoaXMgd2lsbCBoZWxwIHlvdSB0byBiZSBzdXJlIHRoYXQgeW91IGhhdmUgZm91bmQgYWxsIGluLXRyZWUgdXNlcyBvZiB0aGF0CiBpbnRlcmZhY2UuICBJdCB3aWxsIGFsc28gYWxlcnQgZGV2ZWxvcGVycyBvZiBvdXQtb2YtdHJlZSBjb2RlIHRoYXQgdGhlcmUgaXMKIGEgY2hhbmdlIHRoYXQgdGhleSBuZWVkIHRvIHJlc3BvbmQgdG8uICBTdXBwb3J0aW5nIG91dC1vZi10cmVlIGNvZGUgaXMgbm90CiBzb21ldGhpbmcgdGhhdCBrZXJuZWwgZGV2ZWxvcGVycyBuZWVkIHRvIGJlIHdvcnJpZWQgYWJvdXQsIGJ1dCB3ZSBhbHNvIGRvCi1ub3QgaGF2ZSB0byBtYWtlIGxpZmUgaGFyZGVyIGZvciBvdXQtb2YtdHJlZSBkZXZlbG9wZXJzIHRoYW4gaXQgaXQgbmVlZHMgdG8KLWJlLiAKK25vdCBoYXZlIHRvIG1ha2UgbGlmZSBoYXJkZXIgZm9yIG91dC1vZi10cmVlIGRldmVsb3BlcnMgdGhhbiBpdCBuZWVkcyB0bworYmUuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RtYWVuZ2luZS50eHQgYi9Eb2N1bWVudGF0aW9uL2RtYWVuZ2luZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGMxYzJmNgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZG1hZW5naW5lLnR4dApAQCAtMCwwICsxIEBACitTZWUgRG9jdW1lbnRhdGlvbi9jcnlwdG8vYXN5bmMtdHgtYXBpLnR4dApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9mZWF0dXJlLXJlbW92YWwtc2NoZWR1bGUudHh0IGIvRG9jdW1lbnRhdGlvbi9mZWF0dXJlLXJlbW92YWwtc2NoZWR1bGUudHh0CmluZGV4IDIxOTNiZTUuLjVkZGJlMzUgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZmVhdHVyZS1yZW1vdmFsLXNjaGVkdWxlLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2ZlYXR1cmUtcmVtb3ZhbC1zY2hlZHVsZS50eHQKQEAgLTMxOCw2ICszMTgsMTQgQEAKIAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKK1doYXQ6CWZzY2hlciBhbmQgZnNjcG9zIGRyaXZlcnMKK1doZW46CUp1bmUgMjAwOQorV2h5OglEZXByZWNhdGVkIGJ5IHRoZSBuZXcgZnNjaG1kIGRyaXZlci4KK1dobzoJSGFucyBkZSBHb2VkZSA8aGRlZ29lZGVAcmVkaGF0LmNvbT4KKwlKZWFuIERlbHZhcmUgPGtoYWxpQGxpbnV4LWZyLm9yZz4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKIFdoYXQ6CVNFTGludXggImNvbXBhdF9uZXQiIGZ1bmN0aW9uYWxpdHkKIFdoZW46CTIuNi4zMCBhdCB0aGUgZWFybGllc3QKIFdoeToJSW4gMi42LjE4IHRoZSBTZWNtYXJrIGNvbmNlcHQgd2FzIGludHJvZHVjZWQgdG8gcmVwbGFjZSB0aGUgImNvbXBhdF9uZXQiCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL0xvY2tpbmcgYi9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL0xvY2tpbmcKaW5kZXggY2ZiZmExNS4uZWM2YTkzOSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9Mb2NraW5nCisrKyBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvTG9ja2luZwpAQCAtOTcsOCArOTcsOCBAQAogCXZvaWQgKCpwdXRfc3VwZXIpIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKik7CiAJdm9pZCAoKndyaXRlX3N1cGVyKSAoc3RydWN0IHN1cGVyX2Jsb2NrICopOwogCWludCAoKnN5bmNfZnMpKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCB3YWl0KTsKLQl2b2lkICgqd3JpdGVfc3VwZXJfbG9ja2ZzKSAoc3RydWN0IHN1cGVyX2Jsb2NrICopOwotCXZvaWQgKCp1bmxvY2tmcykgKHN0cnVjdCBzdXBlcl9ibG9jayAqKTsKKwlpbnQgKCpmcmVlemVfZnMpIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKik7CisJaW50ICgqdW5mcmVlemVfZnMpIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKik7CiAJaW50ICgqc3RhdGZzKSAoc3RydWN0IGRlbnRyeSAqLCBzdHJ1Y3Qga3N0YXRmcyAqKTsKIAlpbnQgKCpyZW1vdW50X2ZzKSAoc3RydWN0IHN1cGVyX2Jsb2NrICosIGludCAqLCBjaGFyICopOwogCXZvaWQgKCpjbGVhcl9pbm9kZSkgKHN0cnVjdCBpbm9kZSAqKTsKQEAgLTExOSw4ICsxMTksOCBAQAogcHV0X3N1cGVyOgkJeWVzCXllcwlubwogd3JpdGVfc3VwZXI6CQlubwl5ZXMJcmVhZAogc3luY19mczoJCW5vCW5vCXJlYWQKLXdyaXRlX3N1cGVyX2xvY2tmczoJPwotdW5sb2NrZnM6CQk/CitmcmVlemVfZnM6CQk/Cit1bmZyZWV6ZV9mczoJCT8KIHN0YXRmczoJCQlubwlubwlubwogcmVtb3VudF9mczoJCXllcwl5ZXMJbWF5YmUJCShzZWUgYmVsb3cpCiBjbGVhcl9pbm9kZToJCW5vCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL2J0cmZzLnR4dCBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvYnRyZnMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0MDg3YzMKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL2J0cmZzLnR4dApAQCAtMCwwICsxLDkxIEBACisKKwlCVFJGUworCT09PT09CisKK0J0cmZzIGlzIGEgbmV3IGNvcHkgb24gd3JpdGUgZmlsZXN5c3RlbSBmb3IgTGludXggYWltZWQgYXQKK2ltcGxlbWVudGluZyBhZHZhbmNlZCBmZWF0dXJlcyB3aGlsZSBmb2N1c2luZyBvbiBmYXVsdCB0b2xlcmFuY2UsCityZXBhaXIgYW5kIGVhc3kgYWRtaW5pc3RyYXRpb24uIEluaXRpYWxseSBkZXZlbG9wZWQgYnkgT3JhY2xlLCBCdHJmcworaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdQTCBhbmQgb3BlbiBmb3IgY29udHJpYnV0aW9uIGZyb20gYW55b25lLgorCitMaW51eCBoYXMgYSB3ZWFsdGggb2YgZmlsZXN5c3RlbXMgdG8gY2hvb3NlIGZyb20sIGJ1dCB3ZSBhcmUgZmFjaW5nIGEKK251bWJlciBvZiBjaGFsbGVuZ2VzIHdpdGggc2NhbGluZyB0byB0aGUgbGFyZ2Ugc3RvcmFnZSBzdWJzeXN0ZW1zIHRoYXQKK2FyZSBiZWNvbWluZyBjb21tb24gaW4gdG9kYXkncyBkYXRhIGNlbnRlcnMuIEZpbGVzeXN0ZW1zIG5lZWQgdG8gc2NhbGUKK2luIHRoZWlyIGFiaWxpdHkgdG8gYWRkcmVzcyBhbmQgbWFuYWdlIGxhcmdlIHN0b3JhZ2UsIGFuZCBhbHNvIGluCit0aGVpciBhYmlsaXR5IHRvIGRldGVjdCwgcmVwYWlyIGFuZCB0b2xlcmF0ZSBlcnJvcnMgaW4gdGhlIGRhdGEgc3RvcmVkCitvbiBkaXNrLiAgQnRyZnMgaXMgdW5kZXIgaGVhdnkgZGV2ZWxvcG1lbnQsIGFuZCBpcyBub3Qgc3VpdGFibGUgZm9yCithbnkgdXNlcyBvdGhlciB0aGFuIGJlbmNobWFya2luZyBhbmQgcmV2aWV3LiBUaGUgQnRyZnMgZGlzayBmb3JtYXQgaXMKK25vdCB5ZXQgZmluYWxpemVkLgorCitUaGUgbWFpbiBCdHJmcyBmZWF0dXJlcyBpbmNsdWRlOgorCisgICAgKiBFeHRlbnQgYmFzZWQgZmlsZSBzdG9yYWdlICgyXjY0IG1heCBmaWxlIHNpemUpCisgICAgKiBTcGFjZSBlZmZpY2llbnQgcGFja2luZyBvZiBzbWFsbCBmaWxlcworICAgICogU3BhY2UgZWZmaWNpZW50IGluZGV4ZWQgZGlyZWN0b3JpZXMKKyAgICAqIER5bmFtaWMgaW5vZGUgYWxsb2NhdGlvbgorICAgICogV3JpdGFibGUgc25hcHNob3RzCisgICAgKiBTdWJ2b2x1bWVzIChzZXBhcmF0ZSBpbnRlcm5hbCBmaWxlc3lzdGVtIHJvb3RzKQorICAgICogT2JqZWN0IGxldmVsIG1pcnJvcmluZyBhbmQgc3RyaXBpbmcKKyAgICAqIENoZWNrc3VtcyBvbiBkYXRhIGFuZCBtZXRhZGF0YSAobXVsdGlwbGUgYWxnb3JpdGhtcyBhdmFpbGFibGUpCisgICAgKiBDb21wcmVzc2lvbgorICAgICogSW50ZWdyYXRlZCBtdWx0aXBsZSBkZXZpY2Ugc3VwcG9ydCwgd2l0aCBzZXZlcmFsIHJhaWQgYWxnb3JpdGhtcworICAgICogT25saW5lIGZpbGVzeXN0ZW0gY2hlY2sgKG5vdCB5ZXQgaW1wbGVtZW50ZWQpCisgICAgKiBWZXJ5IGZhc3Qgb2ZmbGluZSBmaWxlc3lzdGVtIGNoZWNrCisgICAgKiBFZmZpY2llbnQgaW5jcmVtZW50YWwgYmFja3VwIGFuZCBGUyBtaXJyb3JpbmcgKG5vdCB5ZXQgaW1wbGVtZW50ZWQpCisgICAgKiBPbmxpbmUgZmlsZXN5c3RlbSBkZWZyYWdtZW50YXRpb24KKworCisKKwlNQUlMSU5HIExJU1QKKwk9PT09PT09PT09PT0KKworVGhlcmUgaXMgYSBCdHJmcyBtYWlsaW5nIGxpc3QgaG9zdGVkIG9uIHZnZXIua2VybmVsLm9yZy4gWW91IGNhbgorZmluZCBkZXRhaWxzIG9uIGhvdyB0byBzdWJzY3JpYmUgaGVyZToKKworaHR0cDovL3ZnZXIua2VybmVsLm9yZy92Z2VyLWxpc3RzLmh0bWwjbGludXgtYnRyZnMKKworTWFpbGluZyBsaXN0IGFyY2hpdmVzIGFyZSBhdmFpbGFibGUgZnJvbSBnbWFuZToKKworaHR0cDovL2Rpci5nbWFuZS5vcmcvZ21hbmUuY29tcC5maWxlLXN5c3RlbXMuYnRyZnMKKworCisKKwlJUkMKKwk9PT0KKworRGlzY3Vzc2lvbiBvZiBCdHJmcyBhbHNvIG9jY3VycyBvbiB0aGUgI2J0cmZzIGNoYW5uZWwgb2YgdGhlIEZyZWVub2RlCitJUkMgbmV0d29yay4KKworCisKKwlVVElMSVRJRVMKKwk9PT09PT09PT0KKworVXNlcnNwYWNlIHRvb2xzIGZvciBjcmVhdGluZyBhbmQgbWFuaXB1bGF0aW5nIEJ0cmZzIGZpbGUgc3lzdGVtcyBhcmUKK2F2YWlsYWJsZSBmcm9tIHRoZSBnaXQgcmVwb3NpdG9yeSBhdCB0aGUgZm9sbG93aW5nIGxvY2F0aW9uOgorCisgaHR0cDovL2dpdC5rZXJuZWwub3JnLz9wPWxpbnV4L2tlcm5lbC9naXQvbWFzb24vYnRyZnMtcHJvZ3MtdW5zdGFibGUuZ2l0CisgZ2l0Oi8vZ2l0Lmtlcm5lbC5vcmcvcHViL3NjbS9saW51eC9rZXJuZWwvZ2l0L21hc29uL2J0cmZzLXByb2dzLXVuc3RhYmxlLmdpdAorCitUaGVzZSBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgdG9vbHM6CisKK21rZnMuYnRyZnM6IGNyZWF0ZSBhIGZpbGVzeXN0ZW0KKworYnRyZnNjdGw6IGNvbnRyb2wgcHJvZ3JhbSB0byBjcmVhdGUgc25hcHNob3RzIGFuZCBzdWJ2b2x1bWVzOgorCisJbW91bnQgL2Rldi9zZGEyIC9tbnQKKwlidHJmc2N0bCAtcyBuZXdfc3Vidm9sX25hbWUgL21udAorCWJ0cmZzY3RsIC1zIHNuYXBzaG90X29mX2RlZmF1bHQgL21udC9kZWZhdWx0CisJYnRyZnNjdGwgLXMgc25hcHNob3Rfb2ZfbmV3X3N1YnZvbCAvbW50L25ld19zdWJ2b2xfbmFtZQorCWJ0cmZzY3RsIC1zIHNuYXBzaG90X29mX2Ffc25hcHNob3QgL21udC9zbmFwc2hvdF9vZl9uZXdfc3Vidm9sCisJbHMgL21udAorCWRlZmF1bHQgc25hcHNob3Rfb2ZfYV9zbmFwc2hvdCBzbmFwc2hvdF9vZl9uZXdfc3Vidm9sCisJbmV3X3N1YnZvbF9uYW1lIHNuYXBzaG90X29mX2RlZmF1bHQKKworCVNuYXBzaG90cyBhbmQgc3Vidm9sdW1lcyBjYW5ub3QgYmUgZGVsZXRlZCByaWdodCBub3csIGJ1dCB5b3UgY2FuCisJcm0gLXJmIGFsbCB0aGUgZmlsZXMgYW5kIGRpcmVjdG9yaWVzIGluc2lkZSB0aGVtLgorCitidHJmc2NrOiBkbyBhIGxpbWl0ZWQgY2hlY2sgb2YgdGhlIEZTIGV4dGVudCB0cmVlcy4KKworYnRyZnMtZGVidWctdHJlZTogcHJpbnQgYWxsIG9mIHRoZSBGUyBtZXRhZGF0YSBpbiB0ZXh0IGZvcm0uICBFeGFtcGxlOgorCisJYnRyZnMtZGVidWctdHJlZSAvZGV2L3NkYTIgPiYgYmlnX291dHB1dF9maWxlCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL2V4dDQudHh0IGIvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9leHQ0LnR4dAppbmRleCAxNzRlYWZmLi5jZWM4MjliIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL2V4dDQudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvZXh0NC50eHQKQEAgLTU4LDEzICs1OCwyMiBAQAogCiAJIyBtb3VudCAtdCBleHQ0IC9kZXYvaGRhMSAvd2hlcmV2ZXIKIAotICAtIFdoZW4gY29tcGFyaW5nIHBlcmZvcm1hbmNlIHdpdGggb3RoZXIgZmlsZXN5c3RlbXMsIHJlbWVtYmVyIHRoYXQKLSAgICBleHQzLzQgYnkgZGVmYXVsdCBvZmZlcnMgaGlnaGVyIGRhdGEgaW50ZWdyaXR5IGd1YXJhbnRlZXMgdGhhbiBtb3N0LgotICAgIFNvIHdoZW4gY29tcGFyaW5nIHdpdGggYSBtZXRhZGF0YS1vbmx5IGpvdXJuYWxsaW5nIGZpbGVzeXN0ZW0sIHN1Y2gKLSAgICBhcyBleHQzLCB1c2UgYG1vdW50IC1vIGRhdGE9d3JpdGViYWNrJy4gIEFuZCB5b3UgbWlnaHQgYXMgd2VsbCB1c2UKLSAgICBgbW91bnQgLW8gbm9iaCcgdG9vIGFsb25nIHdpdGggaXQuICBNYWtpbmcgdGhlIGpvdXJuYWwgbGFyZ2VyIHRoYW4KLSAgICB0aGUgbWtlMmZzIGRlZmF1bHQgb2Z0ZW4gaGVscHMgcGVyZm9ybWFuY2Ugd2l0aCBtZXRhZGF0YS1pbnRlbnNpdmUKLSAgICB3b3JrbG9hZHMuCisgIC0gV2hlbiBjb21wYXJpbmcgcGVyZm9ybWFuY2Ugd2l0aCBvdGhlciBmaWxlc3lzdGVtcywgaXQncyBhbHdheXMKKyAgICBpbXBvcnRhbnQgdG8gdHJ5IG11bHRpcGxlIHdvcmtsb2FkczsgdmVyeSBvZnRlbiBhIHN1YnRsZSBjaGFuZ2UgaW4gYQorICAgIHdvcmtsb2FkIHBhcmFtZXRlciBjYW4gY29tcGxldGVseSBjaGFuZ2UgdGhlIHJhbmtpbmcgb2Ygd2hpY2gKKyAgICBmaWxlc3lzdGVtcyBkbyB3ZWxsIGNvbXBhcmVkIHRvIG90aGVycy4gIFdoZW4gY29tcGFyaW5nIHZlcnN1cyBleHQzLAorICAgIG5vdGUgdGhhdCBleHQ0IGVuYWJsZXMgd3JpdGUgYmFycmllcnMgYnkgZGVmYXVsdCwgd2hpbGUgZXh0MyBkb2VzCisgICAgbm90IGVuYWJsZSB3cml0ZSBiYXJyaWVycyBieSBkZWZhdWx0LiAgU28gaXQgaXMgdXNlZnVsIHRvIHVzZQorICAgIGV4cGxpY2l0bHkgc3BlY2lmeSB3aGV0aGVyIGJhcnJpZXJzIGFyZSBlbmFibGVkIG9yIG5vdCB3aGVuIHZpYSB0aGUKKyAgICAnLW8gYmFycmllcnM9WzB8MV0nIG1vdW50IG9wdGlvbiBmb3IgYm90aCBleHQzIGFuZCBleHQ0IGZpbGVzeXN0ZW1zCisgICAgZm9yIGEgZmFpciBjb21wYXJpc29uLiAgV2hlbiB0dW5pbmcgZXh0MyBmb3IgYmVzdCBiZW5jaG1hcmsgbnVtYmVycywKKyAgICBpdCBpcyBvZnRlbiB3b3J0aHdoaWxlIHRvIHRyeSBjaGFuZ2luZyB0aGUgZGF0YSBqb3VybmFsaW5nIG1vZGU7ICctbworICAgIGRhdGE9d3JpdGViYWNrLG5vYmgnIGNhbiBiZSBmYXN0ZXIgZm9yIHNvbWUgd29ya2xvYWRzLiAgKE5vdGUKKyAgICBob3dldmVyIHRoYXQgcnVubmluZyBtb3VudGVkIHdpdGggZGF0YT13cml0ZWJhY2sgY2FuIHBvdGVudGlhbGx5CisgICAgbGVhdmUgc3RhbGUgZGF0YSBleHBvc2VkIGluIHJlY2VudGx5IHdyaXR0ZW4gZmlsZXMgaW4gY2FzZSBvZiBhbgorICAgIHVuY2xlYW4gc2h1dGRvd24sIHdoaWNoIGNvdWxkIGJlIGEgc2VjdXJpdHkgZXhwb3N1cmUgaW4gc29tZQorICAgIHNpdHVhdGlvbnMuKSAgQ29uZmlndXJpbmcgdGhlIGZpbGVzeXN0ZW0gd2l0aCBhIGxhcmdlIGpvdXJuYWwgY2FuCisgICAgYWxzbyBiZSBoZWxwZnVsIGZvciBtZXRhZGF0YS1pbnRlbnNpdmUgd29ya2xvYWRzLgogCiAyLiBGZWF0dXJlcwogPT09PT09PT09PT0KQEAgLTc0LDcgKzgzLDcgQEAKICogYWJpbGl0eSB0byB1c2UgZmlsZXN5c3RlbXMgPiAxNlRCIChlMmZzcHJvZ3Mgc3VwcG9ydCBub3QgYXZhaWxhYmxlIHlldCkKICogZXh0ZW50IGZvcm1hdCByZWR1Y2VzIG1ldGFkYXRhIG92ZXJoZWFkIChSQU0sIElPIGZvciBhY2Nlc3MsIHRyYW5zYWN0aW9ucykKICogZXh0ZW50IGZvcm1hdCBtb3JlIHJvYnVzdCBpbiBmYWNlIG9mIG9uLWRpc2sgY29ycnVwdGlvbiBkdWUgdG8gbWFnaWNzLAotKiBpbnRlcm5hbCByZWR1bmFuY3kgaW4gdHJlZQorKiBpbnRlcm5hbCByZWR1bmRhbmN5IGluIHRyZWUKICogaW1wcm92ZWQgZmlsZSBhbGxvY2F0aW9uIChtdWx0aS1ibG9jayBhbGxvYykKICogZml4IDMyMDAwIHN1YmRpcmVjdG9yeSBsaW1pdAogKiBuc2VjIHRpbWVzdGFtcHMgZm9yIG10aW1lLCBhdGltZSwgY3RpbWUsIGNyZWF0ZSB0aW1lCkBAIC0xMTYsMTAgKzEyNSwxMSBAQAogV2hlbiBtb3VudGluZyBhbiBleHQ0IGZpbGVzeXN0ZW0sIHRoZSBmb2xsb3dpbmcgb3B0aW9uIGFyZSBhY2NlcHRlZDoKICgqKSA9PSBkZWZhdWx0CiAKLWV4dGVudHMJCSgqKQlleHQ0IHdpbGwgdXNlIGV4dGVudHMgdG8gYWRkcmVzcyBmaWxlIGRhdGEuICBUaGUKLQkJCWZpbGUgc3lzdGVtIHdpbGwgbm8gbG9uZ2VyIGJlIG1vdW50YWJsZSBieSBleHQzLgotCi1ub2V4dGVudHMJCWV4dDQgd2lsbCBub3QgdXNlIGV4dGVudHMgZm9yIG5ld2x5IGNyZWF0ZWQgZmlsZXMKK3JvICAgICAgICAgICAgICAgICAgIAlNb3VudCBmaWxlc3lzdGVtIHJlYWQgb25seS4gTm90ZSB0aGF0IGV4dDQgd2lsbAorICAgICAgICAgICAgICAgICAgICAgCXJlcGxheSB0aGUgam91cm5hbCAoYW5kIHRodXMgd3JpdGUgdG8gdGhlCisgICAgICAgICAgICAgICAgICAgICAJcGFydGl0aW9uKSBldmVuIHdoZW4gbW91bnRlZCAicmVhZCBvbmx5Ii4gVGhlCisgICAgICAgICAgICAgICAgICAgICAJbW91bnQgb3B0aW9ucyAicm8sbm9sb2FkIiBjYW4gYmUgdXNlZCB0byBwcmV2ZW50CisJCSAgICAgCXdyaXRlcyB0byB0aGUgZmlsZXN5c3RlbS4KIAogam91cm5hbF9jaGVja3N1bQlFbmFibGUgY2hlY2tzdW1taW5nIG9mIHRoZSBqb3VybmFsIHRyYW5zYWN0aW9ucy4KIAkJCVRoaXMgd2lsbCBhbGxvdyB0aGUgcmVjb3ZlcnkgY29kZSBpbiBlMmZzY2sgYW5kIHRoZQpAQCAtMTM0LDE3ICsxNDQsMTcgQEAKIGpvdXJuYWw9dXBkYXRlCQlVcGRhdGUgdGhlIGV4dDQgZmlsZSBzeXN0ZW0ncyBqb3VybmFsIHRvIHRoZSBjdXJyZW50CiAJCQlmb3JtYXQuCiAKLWpvdXJuYWw9aW51bQkJV2hlbiBhIGpvdXJuYWwgYWxyZWFkeSBleGlzdHMsIHRoaXMgb3B0aW9uIGlzIGlnbm9yZWQuCi0JCQlPdGhlcndpc2UsIGl0IHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIHRoZSBpbm9kZSB3aGljaAotCQkJd2lsbCByZXByZXNlbnQgdGhlIGV4dDQgZmlsZSBzeXN0ZW0ncyBqb3VybmFsIGZpbGUuCi0KIGpvdXJuYWxfZGV2PWRldm51bQlXaGVuIHRoZSBleHRlcm5hbCBqb3VybmFsIGRldmljZSdzIG1ham9yL21pbm9yIG51bWJlcnMKIAkJCWhhdmUgY2hhbmdlZCwgdGhpcyBvcHRpb24gYWxsb3dzIHRoZSB1c2VyIHRvIHNwZWNpZnkKIAkJCXRoZSBuZXcgam91cm5hbCBsb2NhdGlvbi4gIFRoZSBqb3VybmFsIGRldmljZSBpcwogCQkJaWRlbnRpZmllZCB0aHJvdWdoIGl0cyBuZXcgbWFqb3IvbWlub3IgbnVtYmVycyBlbmNvZGVkCiAJCQlpbiBkZXZudW0uCiAKLW5vbG9hZAkJCURvbid0IGxvYWQgdGhlIGpvdXJuYWwgb24gbW91bnRpbmcuCitub2xvYWQJCQlEb24ndCBsb2FkIHRoZSBqb3VybmFsIG9uIG1vdW50aW5nLiAgTm90ZSB0aGF0CisgICAgICAgICAgICAgICAgICAgICAJaWYgdGhlIGZpbGVzeXN0ZW0gd2FzIG5vdCB1bm1vdW50ZWQgY2xlYW5seSwKKyAgICAgICAgICAgICAgICAgICAgIAlza2lwcGluZyB0aGUgam91cm5hbCByZXBsYXkgd2lsbCBsZWFkIHRvIHRoZQorICAgICAgICAgICAgICAgICAgICAgCWZpbGVzeXN0ZW0gY29udGFpbmluZyBpbmNvbnNpc3RlbmNpZXMgdGhhdCBjYW4KKyAgICAgICAgICAgICAgICAgICAgIAlsZWFkIHRvIGFueSBudW1iZXIgb2YgcHJvYmxlbXMuCiAKIGRhdGE9am91cm5hbAkJQWxsIGRhdGEgYXJlIGNvbW1pdHRlZCBpbnRvIHRoZSBqb3VybmFsIHByaW9yIHRvIGJlaW5nCiAJCQl3cml0dGVuIGludG8gdGhlIG1haW4gZmlsZSBzeXN0ZW0uCkBAIC0yMTksOSArMjI5LDEyIEBACiAKIGRlYnVnCQkJRXh0cmEgZGVidWdnaW5nIGluZm9ybWF0aW9uIGlzIHNlbnQgdG8gc3lzbG9nLgogCi1lcnJvcnM9cmVtb3VudC1ybygqKQlSZW1vdW50IHRoZSBmaWxlc3lzdGVtIHJlYWQtb25seSBvbiBhbiBlcnJvci4KK2Vycm9ycz1yZW1vdW50LXJvCVJlbW91bnQgdGhlIGZpbGVzeXN0ZW0gcmVhZC1vbmx5IG9uIGFuIGVycm9yLgogZXJyb3JzPWNvbnRpbnVlCQlLZWVwIGdvaW5nIG9uIGEgZmlsZXN5c3RlbSBlcnJvci4KIGVycm9ycz1wYW5pYwkJUGFuaWMgYW5kIGhhbHQgdGhlIG1hY2hpbmUgaWYgYW4gZXJyb3Igb2NjdXJzLgorICAgICAgICAgICAgICAgICAgICAgICAgKFRoZXNlIG1vdW50IG9wdGlvbnMgb3ZlcnJpZGUgdGhlIGVycm9ycyBiZWhhdmlvcgorICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWVkIGluIHRoZSBzdXBlcmJsb2NrLCB3aGljaCBjYW4gYmUgY29uZmlndXJlZAorICAgICAgICAgICAgICAgICAgICAgICAgdXNpbmcgdHVuZTJmcykKIAogZGF0YV9lcnI9aWdub3JlKCopCUp1c3QgcHJpbnQgYW4gZXJyb3IgbWVzc2FnZSBpZiBhbiBlcnJvciBvY2N1cnMKIAkJCWluIGEgZmlsZSBkYXRhIGJ1ZmZlciBpbiBvcmRlcmVkIG1vZGUuCkBAIC0yNjEsNiArMjc0LDQyIEBACiBub2RlbGFsbG9jCQlEaXNhYmxlIGRlbGF5ZWQgYWxsb2NhdGlvbi4gQmxvY2tzIGFyZSBhbGxvY2F0aW9uCiAJCQl3aGVuIGRhdGEgaXMgY29waWVkIGZyb20gdXNlciB0byBwYWdlIGNhY2hlLgogCittYXhfYmF0Y2hfdGltZT11c2VjCU1heGltdW0gYW1vdW50IG9mIHRpbWUgZXh0NCBzaG91bGQgd2FpdCBmb3IKKwkJCWFkZGl0aW9uYWwgZmlsZXN5c3RlbSBvcGVyYXRpb25zIHRvIGJlIGJhdGNoCisJCQl0b2dldGhlciB3aXRoIGEgc3luY2hyb25vdXMgd3JpdGUgb3BlcmF0aW9uLgorCQkJU2luY2UgYSBzeW5jaHJvbm91cyB3cml0ZSBvcGVyYXRpb24gaXMgZ29pbmcgdG8KKwkJCWZvcmNlIGEgY29tbWl0IGFuZCB0aGVuIGEgd2FpdCBmb3IgdGhlIEkvTworCQkJY29tcGxldGUsIGl0IGRvZXNuJ3QgY29zdCBtdWNoLCBhbmQgY2FuIGJlIGEKKwkJCWh1Z2UgdGhyb3VnaHB1dCB3aW4sIHdlIHdhaXQgZm9yIGEgc21hbGwgYW1vdW50CisJCQlvZiB0aW1lIHRvIHNlZSBpZiBhbnkgb3RoZXIgdHJhbnNhY3Rpb25zIGNhbgorCQkJcGlnZ3liYWNrIG9uIHRoZSBzeW5jaHJvbm91cyB3cml0ZS4gICBUaGUKKwkJCWFsZ29yaXRobSB1c2VkIGlzIGRlc2lnbmVkIHRvIGF1dG9tYXRpY2FsbHkgdHVuZQorCQkJZm9yIHRoZSBzcGVlZCBvZiB0aGUgZGlzaywgYnkgbWVhc3VyaW5nIHRoZQorCQkJYW1vdW50IG9mIHRpbWUgKG9uIGF2ZXJhZ2UpIHRoYXQgaXQgdGFrZXMgdG8KKwkJCWZpbmlzaCBjb21taXR0aW5nIGEgdHJhbnNhY3Rpb24uICBDYWxsIHRoaXMgdGltZQorCQkJdGhlICJjb21taXQgdGltZSIuICBJZiB0aGUgdGltZSB0aGF0IHRoZQorCQkJdHJhbnNhY3RvaW4gaGFzIGJlZW4gcnVubmluZyBpcyBsZXNzIHRoYW4gdGhlCisJCQljb21taXQgdGltZSwgZXh0NCB3aWxsIHRyeSBzbGVlcGluZyBmb3IgdGhlCisJCQljb21taXQgdGltZSB0byBzZWUgaWYgb3RoZXIgb3BlcmF0aW9ucyB3aWxsIGpvaW4KKwkJCXRoZSB0cmFuc2FjdGlvbi4gICBUaGUgY29tbWl0IHRpbWUgaXMgY2FwcGVkIGJ5CisJCQl0aGUgbWF4X2JhdGNoX3RpbWUsIHdoaWNoIGRlZmF1bHRzIHRvIDE1MDAwdXMKKwkJCSgxNW1zKS4gICBUaGlzIG9wdGltaXphdGlvbiBjYW4gYmUgdHVybmVkIG9mZgorCQkJZW50aXJlbHkgYnkgc2V0dGluZyBtYXhfYmF0Y2hfdGltZSB0byAwLgorCittaW5fYmF0Y2hfdGltZT11c2VjCVRoaXMgcGFyYW1ldGVyIHNldHMgdGhlIGNvbW1pdCB0aW1lIChhcworCQkJZGVzY3JpYmVkIGFib3ZlKSB0byBiZSBhdCBsZWFzdCBtaW5fYmF0Y2hfdGltZS4KKwkJCUl0IGRlZmF1bHRzIHRvIHplcm8gbWljcm9zZWNvbmRzLiAgSW5jcmVhc2luZworCQkJdGhpcyBwYXJhbWV0ZXIgbWF5IGltcHJvdmUgdGhlIHRocm91Z2hwdXQgb2YKKwkJCW11bHRpLXRocmVhZGVkLCBzeW5jaHJvbm91cyB3b3JrbG9hZHMgb24gdmVyeQorCQkJZmFzdCBkaXNrcywgYXQgdGhlIGNvc3Qgb2YgaW5jcmVhc2luZyBsYXRlbmN5LgorCitqb3VybmFsX2lvcHJpbz1wcmlvCVRoZSBJL08gcHJpb3JpdHkgKGZyb20gMCB0byA3LCB3aGVyZSAwIGlzIHRoZQorCQkJaGlnaGVzdCBwcmlvcnR5KSB3aGljaCBzaG91bGQgYmUgdXNlZCBmb3IgSS9PCisJCQlvcGVyYXRpb25zIHN1Ym1pdHRlZCBieSBram91cm5hbGQyIGR1cmluZyBhCisJCQljb21taXQgb3BlcmF0aW9uLiAgVGhpcyBkZWZhdWx0cyB0byAzLCB3aGljaCBpcworCQkJYSBzbGlnaHRseSBoaWdoZXIgcHJpb3JpdHkgdGhhbiB0aGUgZGVmYXVsdCBJL08KKwkJCXByaW9yaXR5LgorCiBEYXRhIE1vZGUKID09PT09PT09PQogVGhlcmUgYXJlIDMgZGlmZmVyZW50IGRhdGEgbW9kZXM6CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL3Byb2MudHh0IGIvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9wcm9jLnR4dAppbmRleCAzMmU5NDYzLi5iYmViYzNhIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL3Byb2MudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvcHJvYy50eHQKQEAgLTE0MCw2ICsxNDAsNyBAQAogIHN0YXRtCQlQcm9jZXNzIG1lbW9yeSBzdGF0dXMgaW5mb3JtYXRpb24KICBzdGF0dXMJCVByb2Nlc3Mgc3RhdHVzIGluIGh1bWFuIHJlYWRhYmxlIGZvcm0KICB3Y2hhbgkJSWYgQ09ORklHX0tBTExTWU1TIGlzIHNldCwgYSBwcmUtZGVjb2RlZCB3Y2hhbgorIHN0YWNrCQlSZXBvcnQgZnVsbCBzdGFjayB0cmFjZSwgZW5hYmxlIHZpYSBDT05GSUdfU1RBQ0tUUkFDRQogIHNtYXBzCQlFeHRlbnNpb24gYmFzZWQgb24gbWFwcywgdGhlIHJzcyBzaXplIGZvciBlYWNoIG1hcHBlZCBmaWxlCiAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KIApAQCAtMTM3MCwyOTIgKzEzNzEsOCBAQAogMi40IC9wcm9jL3N5cy92bSAtIFRoZSB2aXJ0dWFsIG1lbW9yeSBzdWJzeXN0ZW0KIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLVRoZSBmaWxlcyAgaW4gIHRoaXMgZGlyZWN0b3J5IGNhbiBiZSB1c2VkIHRvIHR1bmUgdGhlIG9wZXJhdGlvbiBvZiB0aGUgdmlydHVhbAotbWVtb3J5IChWTSkgIHN1YnN5c3RlbSAgb2YgIHRoZSAgTGludXggIGtlcm5lbC4KLQotdmZzX2NhY2hlX3ByZXNzdXJlCi0tLS0tLS0tLS0tLS0tLS0tLS0KLQotQ29udHJvbHMgdGhlIHRlbmRlbmN5IG9mIHRoZSBrZXJuZWwgdG8gcmVjbGFpbSB0aGUgbWVtb3J5IHdoaWNoIGlzIHVzZWQgZm9yCi1jYWNoaW5nIG9mIGRpcmVjdG9yeSBhbmQgaW5vZGUgb2JqZWN0cy4KLQotQXQgdGhlIGRlZmF1bHQgdmFsdWUgb2YgdmZzX2NhY2hlX3ByZXNzdXJlPTEwMCB0aGUga2VybmVsIHdpbGwgYXR0ZW1wdCB0bwotcmVjbGFpbSBkZW50cmllcyBhbmQgaW5vZGVzIGF0IGEgImZhaXIiIHJhdGUgd2l0aCByZXNwZWN0IHRvIHBhZ2VjYWNoZSBhbmQKLXN3YXBjYWNoZSByZWNsYWltLiAgRGVjcmVhc2luZyB2ZnNfY2FjaGVfcHJlc3N1cmUgY2F1c2VzIHRoZSBrZXJuZWwgdG8gcHJlZmVyCi10byByZXRhaW4gZGVudHJ5IGFuZCBpbm9kZSBjYWNoZXMuICBJbmNyZWFzaW5nIHZmc19jYWNoZV9wcmVzc3VyZSBiZXlvbmQgMTAwCi1jYXVzZXMgdGhlIGtlcm5lbCB0byBwcmVmZXIgdG8gcmVjbGFpbSBkZW50cmllcyBhbmQgaW5vZGVzLgotCi1kaXJ0eV9iYWNrZ3JvdW5kX2J5dGVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUNvbnRhaW5zIHRoZSBhbW91bnQgb2YgZGlydHkgbWVtb3J5IGF0IHdoaWNoIHRoZSBwZGZsdXNoIGJhY2tncm91bmQgd3JpdGViYWNrCi1kYWVtb24gd2lsbCBzdGFydCB3cml0ZWJhY2suCi0KLUlmIGRpcnR5X2JhY2tncm91bmRfYnl0ZXMgaXMgd3JpdHRlbiwgZGlydHlfYmFja2dyb3VuZF9yYXRpbyBiZWNvbWVzIGEgZnVuY3Rpb24KLW9mIGl0cyB2YWx1ZSAoZGlydHlfYmFja2dyb3VuZF9ieXRlcyAvIHRoZSBhbW91bnQgb2YgZGlydHlhYmxlIHN5c3RlbSBtZW1vcnkpLgotCi1kaXJ0eV9iYWNrZ3JvdW5kX3JhdGlvCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUNvbnRhaW5zLCBhcyBhIHBlcmNlbnRhZ2Ugb2YgdGhlIGRpcnR5YWJsZSBzeXN0ZW0gbWVtb3J5IChmcmVlIHBhZ2VzICsgbWFwcGVkCi1wYWdlcyArIGZpbGUgY2FjaGUsIG5vdCBpbmNsdWRpbmcgbG9ja2VkIHBhZ2VzIGFuZCBIdWdlUGFnZXMpLCB0aGUgbnVtYmVyIG9mCi1wYWdlcyBhdCB3aGljaCB0aGUgcGRmbHVzaCBiYWNrZ3JvdW5kIHdyaXRlYmFjayBkYWVtb24gd2lsbCBzdGFydCB3cml0aW5nIG91dAotZGlydHkgZGF0YS4KLQotSWYgZGlydHlfYmFja2dyb3VuZF9yYXRpbyBpcyB3cml0dGVuLCBkaXJ0eV9iYWNrZ3JvdW5kX2J5dGVzIGJlY29tZXMgYSBmdW5jdGlvbgotb2YgaXRzIHZhbHVlIChkaXJ0eV9iYWNrZ3JvdW5kX3JhdGlvICogdGhlIGFtb3VudCBvZiBkaXJ0eWFibGUgc3lzdGVtIG1lbW9yeSkuCi0KLWRpcnR5X2J5dGVzCi0tLS0tLS0tLS0tLQotCi1Db250YWlucyB0aGUgYW1vdW50IG9mIGRpcnR5IG1lbW9yeSBhdCB3aGljaCBhIHByb2Nlc3MgZ2VuZXJhdGluZyBkaXNrIHdyaXRlcwotd2lsbCBpdHNlbGYgc3RhcnQgd3JpdGViYWNrLgotCi1JZiBkaXJ0eV9ieXRlcyBpcyB3cml0dGVuLCBkaXJ0eV9yYXRpbyBiZWNvbWVzIGEgZnVuY3Rpb24gb2YgaXRzIHZhbHVlCi0oZGlydHlfYnl0ZXMgLyB0aGUgYW1vdW50IG9mIGRpcnR5YWJsZSBzeXN0ZW0gbWVtb3J5KS4KLQotZGlydHlfcmF0aW8KLS0tLS0tLS0tLS0tCi0KLUNvbnRhaW5zLCBhcyBhIHBlcmNlbnRhZ2Ugb2YgdGhlIGRpcnR5YWJsZSBzeXN0ZW0gbWVtb3J5IChmcmVlIHBhZ2VzICsgbWFwcGVkCi1wYWdlcyArIGZpbGUgY2FjaGUsIG5vdCBpbmNsdWRpbmcgbG9ja2VkIHBhZ2VzIGFuZCBIdWdlUGFnZXMpLCB0aGUgbnVtYmVyIG9mCi1wYWdlcyBhdCB3aGljaCBhIHByb2Nlc3Mgd2hpY2ggaXMgZ2VuZXJhdGluZyBkaXNrIHdyaXRlcyB3aWxsIGl0c2VsZiBzdGFydAotd3JpdGluZyBvdXQgZGlydHkgZGF0YS4KLQotSWYgZGlydHlfcmF0aW8gaXMgd3JpdHRlbiwgZGlydHlfYnl0ZXMgYmVjb21lcyBhIGZ1bmN0aW9uIG9mIGl0cyB2YWx1ZQotKGRpcnR5X3JhdGlvICogdGhlIGFtb3VudCBvZiBkaXJ0eWFibGUgc3lzdGVtIG1lbW9yeSkuCi0KLWRpcnR5X3dyaXRlYmFja19jZW50aXNlY3MKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotVGhlIHBkZmx1c2ggd3JpdGViYWNrIGRhZW1vbnMgd2lsbCBwZXJpb2RpY2FsbHkgd2FrZSB1cCBhbmQgd3JpdGUgYG9sZCcgZGF0YQotb3V0IHRvIGRpc2suICBUaGlzIHR1bmFibGUgZXhwcmVzc2VzIHRoZSBpbnRlcnZhbCBiZXR3ZWVuIHRob3NlIHdha2V1cHMsIGluCi0xMDAndGhzIG9mIGEgc2Vjb25kLgotCi1TZXR0aW5nIHRoaXMgdG8gemVybyBkaXNhYmxlcyBwZXJpb2RpYyB3cml0ZWJhY2sgYWx0b2dldGhlci4KLQotZGlydHlfZXhwaXJlX2NlbnRpc2VjcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1UaGlzIHR1bmFibGUgaXMgdXNlZCB0byBkZWZpbmUgd2hlbiBkaXJ0eSBkYXRhIGlzIG9sZCBlbm91Z2ggdG8gYmUgZWxpZ2libGUKLWZvciB3cml0ZW91dCBieSB0aGUgcGRmbHVzaCBkYWVtb25zLiAgSXQgaXMgZXhwcmVzc2VkIGluIDEwMCd0aHMgb2YgYSBzZWNvbmQuIAotRGF0YSB3aGljaCBoYXMgYmVlbiBkaXJ0eSBpbi1tZW1vcnkgZm9yIGxvbmdlciB0aGFuIHRoaXMgaW50ZXJ2YWwgd2lsbCBiZQotd3JpdHRlbiBvdXQgbmV4dCB0aW1lIGEgcGRmbHVzaCBkYWVtb24gd2FrZXMgdXAuCi0KLWhpZ2htZW1faXNfZGlydHlhYmxlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1Pbmx5IHByZXNlbnQgaWYgQ09ORklHX0hJR0hNRU0gaXMgc2V0LgotCi1UaGlzIGRlZmF1bHRzIHRvIDAgKGZhbHNlKSwgbWVhbmluZyB0aGF0IHRoZSByYXRpb3Mgc2V0IGFib3ZlIGFyZSBjYWxjdWxhdGVkCi1hcyBhIHBlcmNlbnRhZ2Ugb2YgbG93bWVtIG9ubHkuICBUaGlzIHByb3RlY3RzIGFnYWluc3QgZXhjZXNzaXZlIHNjYW5uaW5nCi1pbiBwYWdlIHJlY2xhaW0sIHN3YXBwaW5nIGFuZCBnZW5lcmFsIFZNIGRpc3RyZXNzLgotCi1TZXR0aW5nIHRoaXMgdG8gMSBjYW4gYmUgdXNlZnVsIG9uIDMyIGJpdCBtYWNoaW5lcyB3aGVyZSB5b3Ugd2FudCB0byBtYWtlCi1yYW5kb20gY2hhbmdlcyB3aXRoaW4gYW4gTU1BUGVkIGZpbGUgdGhhdCBpcyBsYXJnZXIgdGhhbiB5b3VyIGF2YWlsYWJsZQotbG93bWVtIHdpdGhvdXQgY2F1c2luZyBsYXJnZSBxdWFudGl0aWVzIG9mIHJhbmRvbSBJTy4gIElzIGlzIHNhZmUgaWYgdGhlCi1iZWhhdmlvciBvZiBhbGwgcHJvZ3JhbXMgcnVubmluZyBvbiB0aGUgbWFjaGluZSBpcyBrbm93biBhbmQgbWVtb3J5IHdpbGwKLW5vdCBiZSBvdGhlcndpc2Ugc3RyZXNzZWQuCi0KLWxlZ2FjeV92YV9sYXlvdXQKLS0tLS0tLS0tLS0tLS0tLS0KLQotSWYgbm9uLXplcm8sIHRoaXMgc3lzY3RsIGRpc2FibGVzIHRoZSBuZXcgMzItYml0IG1tYXAgbW1hcCBsYXlvdXQgLSB0aGUga2VybmVsCi13aWxsIHVzZSB0aGUgbGVnYWN5ICgyLjQpIGxheW91dCBmb3IgYWxsIHByb2Nlc3Nlcy4KLQotbG93bWVtX3Jlc2VydmVfcmF0aW8KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1Gb3Igc29tZSBzcGVjaWFsaXNlZCB3b3JrbG9hZHMgb24gaGlnaG1lbSBtYWNoaW5lcyBpdCBpcyBkYW5nZXJvdXMgZm9yCi10aGUga2VybmVsIHRvIGFsbG93IHByb2Nlc3MgbWVtb3J5IHRvIGJlIGFsbG9jYXRlZCBmcm9tIHRoZSAibG93bWVtIgotem9uZS4gIFRoaXMgaXMgYmVjYXVzZSB0aGF0IG1lbW9yeSBjb3VsZCB0aGVuIGJlIHBpbm5lZCB2aWEgdGhlIG1sb2NrKCkKLXN5c3RlbSBjYWxsLCBvciBieSB1bmF2YWlsYWJpbGl0eSBvZiBzd2Fwc3BhY2UuCi0KLUFuZCBvbiBsYXJnZSBoaWdobWVtIG1hY2hpbmVzIHRoaXMgbGFjayBvZiByZWNsYWltYWJsZSBsb3dtZW0gbWVtb3J5Ci1jYW4gYmUgZmF0YWwuCi0KLVNvIHRoZSBMaW51eCBwYWdlIGFsbG9jYXRvciBoYXMgYSBtZWNoYW5pc20gd2hpY2ggcHJldmVudHMgYWxsb2NhdGlvbnMKLXdoaWNoIF9jb3VsZF8gdXNlIGhpZ2htZW0gZnJvbSB1c2luZyB0b28gbXVjaCBsb3dtZW0uICBUaGlzIG1lYW5zIHRoYXQKLWEgY2VydGFpbiBhbW91bnQgb2YgbG93bWVtIGlzIGRlZmVuZGVkIGZyb20gdGhlIHBvc3NpYmlsaXR5IG9mIGJlaW5nCi1jYXB0dXJlZCBpbnRvIHBpbm5lZCB1c2VyIG1lbW9yeS4KLQotKFRoZSBzYW1lIGFyZ3VtZW50IGFwcGxpZXMgdG8gdGhlIG9sZCAxNiBtZWdhYnl0ZSBJU0EgRE1BIHJlZ2lvbi4gIFRoaXMKLW1lY2hhbmlzbSB3aWxsIGFsc28gZGVmZW5kIHRoYXQgcmVnaW9uIGZyb20gYWxsb2NhdGlvbnMgd2hpY2ggY291bGQgdXNlCi1oaWdobWVtIG9yIGxvd21lbSkuCi0KLVRoZSBgbG93bWVtX3Jlc2VydmVfcmF0aW8nIHR1bmFibGUgZGV0ZXJtaW5lcyBob3cgYWdncmVzc2l2ZSB0aGUga2VybmVsIGlzCi1pbiBkZWZlbmRpbmcgdGhlc2UgbG93ZXIgem9uZXMuCi0KLUlmIHlvdSBoYXZlIGEgbWFjaGluZSB3aGljaCB1c2VzIGhpZ2htZW0gb3IgSVNBIERNQSBhbmQgeW91cgotYXBwbGljYXRpb25zIGFyZSB1c2luZyBtbG9jaygpLCBvciBpZiB5b3UgYXJlIHJ1bm5pbmcgd2l0aCBubyBzd2FwIHRoZW4KLXlvdSBwcm9iYWJseSBzaG91bGQgY2hhbmdlIHRoZSBsb3dtZW1fcmVzZXJ2ZV9yYXRpbyBzZXR0aW5nLgotCi1UaGUgbG93bWVtX3Jlc2VydmVfcmF0aW8gaXMgYW4gYXJyYXkuIFlvdSBjYW4gc2VlIHRoZW0gYnkgcmVhZGluZyB0aGlzIGZpbGUuCi0tCi0lIGNhdCAvcHJvYy9zeXMvdm0vbG93bWVtX3Jlc2VydmVfcmF0aW8KLTI1NiAgICAgMjU2ICAgICAzMgotLQotTm90ZTogIyBvZiB0aGlzIGVsZW1lbnRzIGlzIG9uZSBmZXdlciB0aGFuIG51bWJlciBvZiB6b25lcy4gQmVjYXVzZSB0aGUgaGlnaGVzdAotICAgICAgem9uZSdzIHZhbHVlIGlzIG5vdCBuZWNlc3NhcnkgZm9yIGZvbGxvd2luZyBjYWxjdWxhdGlvbi4KLQotQnV0LCB0aGVzZSB2YWx1ZXMgYXJlIG5vdCB1c2VkIGRpcmVjdGx5LiBUaGUga2VybmVsIGNhbGN1bGF0ZXMgIyBvZiBwcm90ZWN0aW9uCi1wYWdlcyBmb3IgZWFjaCB6b25lcyBmcm9tIHRoZW0uIFRoZXNlIGFyZSBzaG93biBhcyBhcnJheSBvZiBwcm90ZWN0aW9uIHBhZ2VzCi1pbiAvcHJvYy96b25laW5mbyBsaWtlIGZvbGxvd2luZ3MuIChUaGlzIGlzIGFuIGV4YW1wbGUgb2YgeDg2LTY0IGJveCkuCi1FYWNoIHpvbmUgaGFzIGFuIGFycmF5IG9mIHByb3RlY3Rpb24gcGFnZXMgbGlrZSB0aGlzLgotCi0tCi1Ob2RlIDAsIHpvbmUgICAgICBETUEKLSAgcGFnZXMgZnJlZSAgICAgMTM1NQotICAgICAgICBtaW4gICAgICAzCi0gICAgICAgIGxvdyAgICAgIDMKLSAgICAgICAgaGlnaCAgICAgNAotCToKLQk6Ci0gICAgbnVtYV9vdGhlciAgIDAKLSAgICAgICAgcHJvdGVjdGlvbjogKDAsIDIwMDQsIDIwMDQsIDIwMDQpCi0JXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eCi0gIHBhZ2VzZXRzCi0gICAgY3B1OiAwIHBjcDogMAotICAgICAgICA6Ci0tCi1UaGVzZSBwcm90ZWN0aW9ucyBhcmUgYWRkZWQgdG8gc2NvcmUgdG8ganVkZ2Ugd2hldGhlciB0aGlzIHpvbmUgc2hvdWxkIGJlIHVzZWQKLWZvciBwYWdlIGFsbG9jYXRpb24gb3Igc2hvdWxkIGJlIHJlY2xhaW1lZC4KLQotSW4gdGhpcyBleGFtcGxlLCBpZiBub3JtYWwgcGFnZXMgKGluZGV4PTIpIGFyZSByZXF1aXJlZCB0byB0aGlzIERNQSB6b25lIGFuZAotcGFnZXNfaGlnaCBpcyB1c2VkIGZvciB3YXRlcm1hcmssIHRoZSBrZXJuZWwganVkZ2VzIHRoaXMgem9uZSBzaG91bGQgbm90IGJlCi11c2VkIGJlY2F1c2UgcGFnZXNfZnJlZSgxMzU1KSBpcyBzbWFsbGVyIHRoYW4gd2F0ZXJtYXJrICsgcHJvdGVjdGlvblsyXQotKDQgKyAyMDA0ID0gMjAwOCkuIElmIHRoaXMgcHJvdGVjdGlvbiB2YWx1ZSBpcyAwLCB0aGlzIHpvbmUgd291bGQgYmUgdXNlZCBmb3IKLW5vcm1hbCBwYWdlIHJlcXVpcmVtZW50LiBJZiByZXF1aXJlbWVudCBpcyBETUEgem9uZShpbmRleD0wKSwgcHJvdGVjdGlvblswXQotKD0wKSBpcyB1c2VkLgotCi16b25lW2ldJ3MgcHJvdGVjdGlvbltqXSBpcyBjYWxjdWxhdGVkIGJ5IGZvbGxvd2luZyBleHByZXNzaW9uLgotCi0oaSA8IGopOgotICB6b25lW2ldLT5wcm90ZWN0aW9uW2pdCi0gID0gKHRvdGFsIHN1bXMgb2YgcHJlc2VudF9wYWdlcyBmcm9tIHpvbmVbaSsxXSB0byB6b25lW2pdIG9uIHRoZSBub2RlKQotICAgIC8gbG93bWVtX3Jlc2VydmVfcmF0aW9baV07Ci0oaSA9IGopOgotICAgKHNob3VsZCBub3QgYmUgcHJvdGVjdGVkLiA9IDA7Ci0oaSA+IGopOgotICAgKG5vdCBuZWNlc3NhcnksIGJ1dCBsb29rcyAwKQotCi1UaGUgZGVmYXVsdCB2YWx1ZXMgb2YgbG93bWVtX3Jlc2VydmVfcmF0aW9baV0gYXJlCi0gICAgMjU2IChpZiB6b25lW2ldIG1lYW5zIERNQSBvciBETUEzMiB6b25lKQotICAgIDMyICAob3RoZXJzKS4KLUFzIGFib3ZlIGV4cHJlc3Npb24sIHRoZXkgYXJlIHJlY2lwcm9jYWwgbnVtYmVyIG9mIHJhdGlvLgotMjU2IG1lYW5zIDEvMjU2LiAjIG9mIHByb3RlY3Rpb24gcGFnZXMgYmVjb21lcyBhYm91dCAiMC4zOSUiIG9mIHRvdGFsIHByZXNlbnQKLXBhZ2VzIG9mIGhpZ2hlciB6b25lcyBvbiB0aGUgbm9kZS4KLQotSWYgeW91IHdvdWxkIGxpa2UgdG8gcHJvdGVjdCBtb3JlIHBhZ2VzLCBzbWFsbGVyIHZhbHVlcyBhcmUgZWZmZWN0aXZlLgotVGhlIG1pbmltdW0gdmFsdWUgaXMgMSAoMS8xIC0+IDEwMCUpLgotCi1wYWdlLWNsdXN0ZXIKLS0tLS0tLS0tLS0tLQotCi1wYWdlLWNsdXN0ZXIgY29udHJvbHMgdGhlIG51bWJlciBvZiBwYWdlcyB3aGljaCBhcmUgd3JpdHRlbiB0byBzd2FwIGluCi1hIHNpbmdsZSBhdHRlbXB0LiAgVGhlIHN3YXAgSS9PIHNpemUuCi0KLUl0IGlzIGEgbG9nYXJpdGhtaWMgdmFsdWUgLSBzZXR0aW5nIGl0IHRvIHplcm8gbWVhbnMgIjEgcGFnZSIsIHNldHRpbmcKLWl0IHRvIDEgbWVhbnMgIjIgcGFnZXMiLCBzZXR0aW5nIGl0IHRvIDIgbWVhbnMgIjQgcGFnZXMiLCBldGMuCi0KLVRoZSBkZWZhdWx0IHZhbHVlIGlzIHRocmVlIChlaWdodCBwYWdlcyBhdCBhIHRpbWUpLiAgVGhlcmUgbWF5IGJlIHNvbWUKLXNtYWxsIGJlbmVmaXRzIGluIHR1bmluZyB0aGlzIHRvIGEgZGlmZmVyZW50IHZhbHVlIGlmIHlvdXIgd29ya2xvYWQgaXMKLXN3YXAtaW50ZW5zaXZlLgotCi1vdmVyY29tbWl0X21lbW9yeQotLS0tLS0tLS0tLS0tLS0tLS0KLQotQ29udHJvbHMgb3ZlcmNvbW1pdCBvZiBzeXN0ZW0gbWVtb3J5LCBwb3NzaWJseSBhbGxvd2luZyBwcm9jZXNzZXMKLXRvIGFsbG9jYXRlIChidXQgbm90IHVzZSkgbW9yZSBtZW1vcnkgdGhhbiBpcyBhY3R1YWxseSBhdmFpbGFibGUuCi0KLQotMAktCUhldXJpc3RpYyBvdmVyY29tbWl0IGhhbmRsaW5nLiBPYnZpb3VzIG92ZXJjb21taXRzIG9mCi0JCWFkZHJlc3Mgc3BhY2UgYXJlIHJlZnVzZWQuIFVzZWQgZm9yIGEgdHlwaWNhbCBzeXN0ZW0uIEl0Ci0JCWVuc3VyZXMgYSBzZXJpb3VzbHkgd2lsZCBhbGxvY2F0aW9uIGZhaWxzIHdoaWxlIGFsbG93aW5nCi0JCW92ZXJjb21taXQgdG8gcmVkdWNlIHN3YXAgdXNhZ2UuICByb290IGlzIGFsbG93ZWQgdG8KLQkJYWxsb2NhdGUgc2xpZ2h0bHkgbW9yZSBtZW1vcnkgaW4gdGhpcyBtb2RlLiBUaGlzIGlzIHRoZQotCQlkZWZhdWx0LgotCi0xCS0JQWx3YXlzIG92ZXJjb21taXQuIEFwcHJvcHJpYXRlIGZvciBzb21lIHNjaWVudGlmaWMKLQkJYXBwbGljYXRpb25zLgotCi0yCS0JRG9uJ3Qgb3ZlcmNvbW1pdC4gVGhlIHRvdGFsIGFkZHJlc3Mgc3BhY2UgY29tbWl0Ci0JCWZvciB0aGUgc3lzdGVtIGlzIG5vdCBwZXJtaXR0ZWQgdG8gZXhjZWVkIHN3YXAgcGx1cyBhCi0JCWNvbmZpZ3VyYWJsZSBwZXJjZW50YWdlIChkZWZhdWx0IGlzIDUwKSBvZiBwaHlzaWNhbCBSQU0uCi0JCURlcGVuZGluZyBvbiB0aGUgcGVyY2VudGFnZSB5b3UgdXNlLCBpbiBtb3N0IHNpdHVhdGlvbnMKLQkJdGhpcyBtZWFucyBhIHByb2Nlc3Mgd2lsbCBub3QgYmUga2lsbGVkIHdoaWxlIGF0dGVtcHRpbmcKLQkJdG8gdXNlIGFscmVhZHktYWxsb2NhdGVkIG1lbW9yeSBidXQgd2lsbCByZWNlaXZlIGVycm9ycwotCQlvbiBtZW1vcnkgYWxsb2NhdGlvbiBhcwlhcHByb3ByaWF0ZS4KLQotb3ZlcmNvbW1pdF9yYXRpbwotLS0tLS0tLS0tLS0tLS0tLQotCi1QZXJjZW50YWdlIG9mIHBoeXNpY2FsIG1lbW9yeSBzaXplIHRvIGluY2x1ZGUgaW4gb3ZlcmNvbW1pdCBjYWxjdWxhdGlvbnMKLShzZWUgYWJvdmUuKQotCi1NZW1vcnkgYWxsb2NhdGlvbiBsaW1pdCA9IHN3YXBzcGFjZSArIHBoeXNtZW0gKiAob3ZlcmNvbW1pdF9yYXRpbyAvIDEwMCkKLQotCXN3YXBzcGFjZSA9IHRvdGFsIHNpemUgb2YgYWxsIHN3YXAgYXJlYXMKLQlwaHlzbWVtID0gc2l6ZSBvZiBwaHlzaWNhbCBtZW1vcnkgaW4gc3lzdGVtCi0KLW5yX2h1Z2VwYWdlcyBhbmQgaHVnZXRsYl9zaG1fZ3JvdXAKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotbnJfaHVnZXBhZ2VzIGNvbmZpZ3VyZXMgbnVtYmVyIG9mIGh1Z2V0bGIgcGFnZSByZXNlcnZlZCBmb3IgdGhlIHN5c3RlbS4KLQotaHVnZXRsYl9zaG1fZ3JvdXAgY29udGFpbnMgZ3JvdXAgaWQgdGhhdCBpcyBhbGxvd2VkIHRvIGNyZWF0ZSBTeXNWIHNoYXJlZAotbWVtb3J5IHNlZ21lbnQgdXNpbmcgaHVnZXRsYiBwYWdlLgotCi1odWdlcGFnZXNfdHJlYXRfYXNfbW92YWJsZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotVGhpcyBwYXJhbWV0ZXIgaXMgb25seSB1c2VmdWwgd2hlbiBrZXJuZWxjb3JlPSBpcyBzcGVjaWZpZWQgYXQgYm9vdCB0aW1lIHRvCi1jcmVhdGUgWk9ORV9NT1ZBQkxFIGZvciBwYWdlcyB0aGF0IG1heSBiZSByZWNsYWltZWQgb3IgbWlncmF0ZWQuIEh1Z2UgcGFnZXMKLWFyZSBub3QgbW92YWJsZSBzbyBhcmUgbm90IG5vcm1hbGx5IGFsbG9jYXRlZCBmcm9tIFpPTkVfTU9WQUJMRS4gQSBub24temVybwotdmFsdWUgd3JpdHRlbiB0byBodWdlcGFnZXNfdHJlYXRfYXNfbW92YWJsZSBhbGxvd3MgaHVnZSBwYWdlcyB0byBiZSBhbGxvY2F0ZWQKLWZyb20gWk9ORV9NT1ZBQkxFLgotCi1PbmNlIGVuYWJsZWQsIHRoZSBaT05FX01PVkFCTEUgaXMgdHJlYXRlZCBhcyBhbiBhcmVhIG9mIG1lbW9yeSB0aGUgaHVnZQotcGFnZXMgcG9vbCBjYW4gZWFzaWx5IGdyb3cgb3Igc2hyaW5rIHdpdGhpbi4gQXNzdW1pbmcgdGhhdCBhcHBsaWNhdGlvbnMgYXJlCi1ub3QgcnVubmluZyB0aGF0IG1sb2NrKCkgYSBsb3Qgb2YgbWVtb3J5LCBpdCBpcyBsaWtlbHkgdGhlIGh1Z2UgcGFnZXMgcG9vbAotY2FuIGdyb3cgdG8gdGhlIHNpemUgb2YgWk9ORV9NT1ZBQkxFIGJ5IHJlcGVhdGVkbHkgZW50ZXJpbmcgdGhlIGRlc2lyZWQgdmFsdWUKLWludG8gbnJfaHVnZXBhZ2VzIGFuZCB0cmlnZ2VyaW5nIHBhZ2UgcmVjbGFpbS4KLQotbGFwdG9wX21vZGUKLS0tLS0tLS0tLS0tCi0KLWxhcHRvcF9tb2RlIGlzIGEga25vYiB0aGF0IGNvbnRyb2xzICJsYXB0b3AgbW9kZSIuIEFsbCB0aGUgdGhpbmdzIHRoYXQgYXJlCi1jb250cm9sbGVkIGJ5IHRoaXMga25vYiBhcmUgZGlzY3Vzc2VkIGluIERvY3VtZW50YXRpb24vbGFwdG9wcy9sYXB0b3AtbW9kZS50eHQuCi0KLWJsb2NrX2R1bXAKLS0tLS0tLS0tLS0KLQotYmxvY2tfZHVtcCBlbmFibGVzIGJsb2NrIEkvTyBkZWJ1Z2dpbmcgd2hlbiBzZXQgdG8gYSBub256ZXJvIHZhbHVlLiBNb3JlCi1pbmZvcm1hdGlvbiBvbiBibG9jayBJL08gZGVidWdnaW5nIGlzIGluIERvY3VtZW50YXRpb24vbGFwdG9wcy9sYXB0b3AtbW9kZS50eHQuCi0KLXN3YXBfdG9rZW5fdGltZW91dAotLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVRoaXMgZmlsZSBjb250YWlucyB2YWxpZCBob2xkIHRpbWUgb2Ygc3dhcCBvdXQgcHJvdGVjdGlvbiB0b2tlbi4gVGhlIExpbnV4Ci1WTSBoYXMgdG9rZW4gYmFzZWQgdGhyYXNoaW5nIGNvbnRyb2wgbWVjaGFuaXNtIGFuZCB1c2VzIHRoZSB0b2tlbiB0byBwcmV2ZW50Ci11bm5lY2Vzc2FyeSBwYWdlIGZhdWx0cyBpbiB0aHJhc2hpbmcgc2l0dWF0aW9uLiBUaGUgdW5pdCBvZiB0aGUgdmFsdWUgaXMKLXNlY29uZC4gVGhlIHZhbHVlIHdvdWxkIGJlIHVzZWZ1bCB0byB0dW5lIHRocmFzaGluZyBiZWhhdmlvci4KLQotZHJvcF9jYWNoZXMKLS0tLS0tLS0tLS0tCi0KLVdyaXRpbmcgdG8gdGhpcyB3aWxsIGNhdXNlIHRoZSBrZXJuZWwgdG8gZHJvcCBjbGVhbiBjYWNoZXMsIGRlbnRyaWVzIGFuZAotaW5vZGVzIGZyb20gbWVtb3J5LCBjYXVzaW5nIHRoYXQgbWVtb3J5IHRvIGJlY29tZSBmcmVlLgotCi1UbyBmcmVlIHBhZ2VjYWNoZToKLQllY2hvIDEgPiAvcHJvYy9zeXMvdm0vZHJvcF9jYWNoZXMKLVRvIGZyZWUgZGVudHJpZXMgYW5kIGlub2RlczoKLQllY2hvIDIgPiAvcHJvYy9zeXMvdm0vZHJvcF9jYWNoZXMKLVRvIGZyZWUgcGFnZWNhY2hlLCBkZW50cmllcyBhbmQgaW5vZGVzOgotCWVjaG8gMyA+IC9wcm9jL3N5cy92bS9kcm9wX2NhY2hlcwotCi1BcyB0aGlzIGlzIGEgbm9uLWRlc3RydWN0aXZlIG9wZXJhdGlvbiBhbmQgZGlydHkgb2JqZWN0cyBhcmUgbm90IGZyZWVhYmxlLCB0aGUKLXVzZXIgc2hvdWxkIHJ1biBgc3luYycgZmlyc3QuCitQbGVhc2Ugc2VlOiBEb2N1bWVudGF0aW9uL3N5c2N0bHMvdm0udHh0IGZvciBhIGRlc2NyaXB0aW9uIG9mIHRoZXNlCitlbnRyaWVzLgogCiAKIDIuNSAvcHJvYy9zeXMvZGV2IC0gRGV2aWNlIHNwZWNpZmljIHBhcmFtZXRlcnMKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvc3F1YXNoZnMudHh0IGIvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9zcXVhc2hmcy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2U3OWU0YQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvc3F1YXNoZnMudHh0CkBAIC0wLDAgKzEsMjI1IEBACitTUVVBU0hGUyA0LjAgRklMRVNZU1RFTQorPT09PT09PT09PT09PT09PT09PT09PT0KKworU3F1YXNoZnMgaXMgYSBjb21wcmVzc2VkIHJlYWQtb25seSBmaWxlc3lzdGVtIGZvciBMaW51eC4KK0l0IHVzZXMgemxpYiBjb21wcmVzc2lvbiB0byBjb21wcmVzcyBmaWxlcywgaW5vZGVzIGFuZCBkaXJlY3Rvcmllcy4KK0lub2RlcyBpbiB0aGUgc3lzdGVtIGFyZSB2ZXJ5IHNtYWxsIGFuZCBhbGwgYmxvY2tzIGFyZSBwYWNrZWQgdG8gbWluaW1pc2UKK2RhdGEgb3ZlcmhlYWQuIEJsb2NrIHNpemVzIGdyZWF0ZXIgdGhhbiA0SyBhcmUgc3VwcG9ydGVkIHVwIHRvIGEgbWF4aW11bQorb2YgMU1ieXRlcyAoZGVmYXVsdCBibG9jayBzaXplIDEyOEspLgorCitTcXVhc2hmcyBpcyBpbnRlbmRlZCBmb3IgZ2VuZXJhbCByZWFkLW9ubHkgZmlsZXN5c3RlbSB1c2UsIGZvciBhcmNoaXZhbAordXNlIChpLmUuIGluIGNhc2VzIHdoZXJlIGEgLnRhci5neiBmaWxlIG1heSBiZSB1c2VkKSwgYW5kIGluIGNvbnN0cmFpbmVkCitibG9jayBkZXZpY2UvbWVtb3J5IHN5c3RlbXMgKGUuZy4gZW1iZWRkZWQgc3lzdGVtcykgd2hlcmUgbG93IG92ZXJoZWFkIGlzCituZWVkZWQuCisKK01haWxpbmcgbGlzdDogc3F1YXNoZnMtZGV2ZWxAbGlzdHMuc291cmNlZm9yZ2UubmV0CitXZWIgc2l0ZTogd3d3LnNxdWFzaGZzLm9yZworCisxLiBGSUxFU1lTVEVNIEZFQVRVUkVTCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1NxdWFzaGZzIGZpbGVzeXN0ZW0gZmVhdHVyZXMgdmVyc3VzIENyYW1mczoKKworCQkJCVNxdWFzaGZzCQlDcmFtZnMKKworTWF4IGZpbGVzeXN0ZW0gc2l6ZToJCTJeNjQJCQkxNiBNaUIKK01heCBmaWxlIHNpemU6CQkJfiAyIFRpQgkJCTE2IE1pQgorTWF4IGZpbGVzOgkJCXVubGltaXRlZAkJdW5saW1pdGVkCitNYXggZGlyZWN0b3JpZXM6CQl1bmxpbWl0ZWQJCXVubGltaXRlZAorTWF4IGVudHJpZXMgcGVyIGRpcmVjdG9yeToJdW5saW1pdGVkCQl1bmxpbWl0ZWQKK01heCBibG9jayBzaXplOgkJCTEgTWlCCQkJNCBLaUIKK01ldGFkYXRhIGNvbXByZXNzaW9uOgkJeWVzCQkJbm8KK0RpcmVjdG9yeSBpbmRleGVzOgkJeWVzCQkJbm8KK1NwYXJzZSBmaWxlIHN1cHBvcnQ6CQl5ZXMJCQlubworVGFpbC1lbmQgcGFja2luZyAoZnJhZ21lbnRzKToJeWVzCQkJbm8KK0V4cG9ydGFibGUgKE5GUyBldGMuKToJCXllcwkJCW5vCitIYXJkIGxpbmsgc3VwcG9ydDoJCXllcwkJCW5vCisiLiIgYW5kICIuLiIgaW4gcmVhZGRpcjoJeWVzCQkJbm8KK1JlYWwgaW5vZGUgbnVtYmVyczoJCXllcwkJCW5vCiszMi1iaXQgdWlkcy9naWRzOgkJeWVzCQkJbm8KK0ZpbGUgY3JlYXRpb24gdGltZToJCXllcwkJCW5vCitYYXR0ciBhbmQgQUNMIHN1cHBvcnQ6CQlubwkJCW5vCisKK1NxdWFzaGZzIGNvbXByZXNzZXMgZGF0YSwgaW5vZGVzIGFuZCBkaXJlY3Rvcmllcy4gIEluIGFkZGl0aW9uLCBpbm9kZSBhbmQKK2RpcmVjdG9yeSBkYXRhIGFyZSBoaWdobHkgY29tcGFjdGVkLCBhbmQgcGFja2VkIG9uIGJ5dGUgYm91bmRhcmllcy4gIEVhY2gKK2NvbXByZXNzZWQgaW5vZGUgaXMgb24gYXZlcmFnZSA4IGJ5dGVzIGluIGxlbmd0aCAodGhlIGV4YWN0IGxlbmd0aCB2YXJpZXMgb24KK2ZpbGUgdHlwZSwgaS5lLiByZWd1bGFyIGZpbGUsIGRpcmVjdG9yeSwgc3ltYm9saWMgbGluaywgYW5kIGJsb2NrL2NoYXIgZGV2aWNlCitpbm9kZXMgaGF2ZSBkaWZmZXJlbnQgc2l6ZXMpLgorCisyLiBVU0lORyBTUVVBU0hGUworLS0tLS0tLS0tLS0tLS0tLS0KKworQXMgc3F1YXNoZnMgaXMgYSByZWFkLW9ubHkgZmlsZXN5c3RlbSwgdGhlIG1rc3F1YXNoZnMgcHJvZ3JhbSBtdXN0IGJlIHVzZWQgdG8KK2NyZWF0ZSBwb3B1bGF0ZWQgc3F1YXNoZnMgZmlsZXN5c3RlbXMuICBUaGlzIGFuZCBvdGhlciBzcXVhc2hmcyB1dGlsaXRpZXMKK2NhbiBiZSBvYnRhaW5lZCBmcm9tIGh0dHA6Ly93d3cuc3F1YXNoZnMub3JnLiAgVXNhZ2UgaW5zdHJ1Y3Rpb25zIGNhbiBiZQorb2J0YWluZWQgZnJvbSB0aGlzIHNpdGUgYWxzby4KKworCiszLiBTUVVBU0hGUyBGSUxFU1lTVEVNIERFU0lHTgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQSBzcXVhc2hmcyBmaWxlc3lzdGVtIGNvbnNpc3RzIG9mIHNldmVuIHBhcnRzLCBwYWNrZWQgdG9nZXRoZXIgb24gYSBieXRlCithbGlnbm1lbnQ6CisKKwkgLS0tLS0tLS0tLS0tLS0tCisJfCAgc3VwZXJibG9jayAJfAorCXwtLS0tLS0tLS0tLS0tLS18CisJfCAgZGF0YWJsb2NrcyAgIHwKKwl8ICAmIGZyYWdtZW50cyAgfAorCXwtLS0tLS0tLS0tLS0tLS18CisJfCAgaW5vZGUgdGFibGUJfAorCXwtLS0tLS0tLS0tLS0tLS18CisJfCAgIGRpcmVjdG9yeQl8CisJfCAgICAgdGFibGUgICAgIHwKKwl8LS0tLS0tLS0tLS0tLS0tfAorCXwgICBmcmFnbWVudAl8CisJfCAgICB0YWJsZSAgICAgIHwKKwl8LS0tLS0tLS0tLS0tLS0tfAorCXwgICAgZXhwb3J0ICAgICB8CisJfCAgICB0YWJsZSAgICAgIHwKKwl8LS0tLS0tLS0tLS0tLS0tfAorCXwgICAgdWlkL2dpZAl8CisJfCAgbG9va3VwIHRhYmxlCXwKKwkgLS0tLS0tLS0tLS0tLS0tCisKK0NvbXByZXNzZWQgZGF0YSBibG9ja3MgYXJlIHdyaXR0ZW4gdG8gdGhlIGZpbGVzeXN0ZW0gYXMgZmlsZXMgYXJlIHJlYWQgZnJvbQordGhlIHNvdXJjZSBkaXJlY3RvcnksIGFuZCBjaGVja2VkIGZvciBkdXBsaWNhdGVzLiAgT25jZSBhbGwgZmlsZSBkYXRhIGhhcyBiZWVuCit3cml0dGVuIHRoZSBjb21wbGV0ZWQgaW5vZGUsIGRpcmVjdG9yeSwgZnJhZ21lbnQsIGV4cG9ydCBhbmQgdWlkL2dpZCBsb29rdXAKK3RhYmxlcyBhcmUgd3JpdHRlbi4KKworMy4xIElub2RlcworLS0tLS0tLS0tLQorCitNZXRhZGF0YSAoaW5vZGVzIGFuZCBkaXJlY3RvcmllcykgYXJlIGNvbXByZXNzZWQgaW4gOEtieXRlIGJsb2Nrcy4gIEVhY2gKK2NvbXByZXNzZWQgYmxvY2sgaXMgcHJlZml4ZWQgYnkgYSB0d28gYnl0ZSBsZW5ndGgsIHRoZSB0b3AgYml0IGlzIHNldCBpZiB0aGUKK2Jsb2NrIGlzIHVuY29tcHJlc3NlZC4gIEEgYmxvY2sgd2lsbCBiZSB1bmNvbXByZXNzZWQgaWYgdGhlIC1ub0kgb3B0aW9uIGlzIHNldCwKK29yIGlmIHRoZSBjb21wcmVzc2VkIGJsb2NrIHdhcyBsYXJnZXIgdGhhbiB0aGUgdW5jb21wcmVzc2VkIGJsb2NrLgorCitJbm9kZXMgYXJlIHBhY2tlZCBpbnRvIHRoZSBtZXRhZGF0YSBibG9ja3MsIGFuZCBhcmUgbm90IGFsaWduZWQgdG8gYmxvY2sKK2JvdW5kYXJpZXMsIHRoZXJlZm9yZSBpbm9kZXMgb3ZlcmxhcCBjb21wcmVzc2VkIGJsb2Nrcy4gIElub2RlcyBhcmUgaWRlbnRpZmllZAorYnkgYSA0OC1iaXQgbnVtYmVyIHdoaWNoIGVuY29kZXMgdGhlIGxvY2F0aW9uIG9mIHRoZSBjb21wcmVzc2VkIG1ldGFkYXRhIGJsb2NrCitjb250YWluaW5nIHRoZSBpbm9kZSwgYW5kIHRoZSBieXRlIG9mZnNldCBpbnRvIHRoYXQgYmxvY2sgd2hlcmUgdGhlIGlub2RlIGlzCitwbGFjZWQgKDxibG9jaywgb2Zmc2V0PikuCisKK1RvIG1heGltaXNlIGNvbXByZXNzaW9uIHRoZXJlIGFyZSBkaWZmZXJlbnQgaW5vZGVzIGZvciBlYWNoIGZpbGUgdHlwZQorKHJlZ3VsYXIgZmlsZSwgZGlyZWN0b3J5LCBkZXZpY2UsIGV0Yy4pLCB0aGUgaW5vZGUgY29udGVudHMgYW5kIGxlbmd0aAordmFyeWluZyB3aXRoIHRoZSB0eXBlLgorCitUbyBmdXJ0aGVyIG1heGltaXNlIGNvbXByZXNzaW9uLCB0d28gdHlwZXMgb2YgcmVndWxhciBmaWxlIGlub2RlIGFuZAorZGlyZWN0b3J5IGlub2RlIGFyZSBkZWZpbmVkOiBpbm9kZXMgb3B0aW1pc2VkIGZvciBmcmVxdWVudGx5IG9jY3VycmluZworcmVndWxhciBmaWxlcyBhbmQgZGlyZWN0b3JpZXMsIGFuZCBleHRlbmRlZCB0eXBlcyB3aGVyZSBleHRyYQoraW5mb3JtYXRpb24gaGFzIHRvIGJlIHN0b3JlZC4KKworMy4yIERpcmVjdG9yaWVzCistLS0tLS0tLS0tLS0tLS0KKworTGlrZSBpbm9kZXMsIGRpcmVjdG9yaWVzIGFyZSBwYWNrZWQgaW50byBjb21wcmVzc2VkIG1ldGFkYXRhIGJsb2Nrcywgc3RvcmVkCitpbiBhIGRpcmVjdG9yeSB0YWJsZS4gIERpcmVjdG9yaWVzIGFyZSBhY2Nlc3NlZCB1c2luZyB0aGUgc3RhcnQgYWRkcmVzcyBvZgordGhlIG1ldGFibG9jayBjb250YWluaW5nIHRoZSBkaXJlY3RvcnkgYW5kIHRoZSBvZmZzZXQgaW50byB0aGUKK2RlY29tcHJlc3NlZCBibG9jayAoPGJsb2NrLCBvZmZzZXQ+KS4KKworRGlyZWN0b3JpZXMgYXJlIG9yZ2FuaXNlZCBpbiBhIHNsaWdodGx5IGNvbXBsZXggd2F5LCBhbmQgYXJlIG5vdCBzaW1wbHkKK2EgbGlzdCBvZiBmaWxlIG5hbWVzLiAgVGhlIG9yZ2FuaXNhdGlvbiB0YWtlcyBhZHZhbnRhZ2Ugb2YgdGhlCitmYWN0IHRoYXQgKGluIG1vc3QgY2FzZXMpIHRoZSBpbm9kZXMgb2YgdGhlIGZpbGVzIHdpbGwgYmUgaW4gdGhlIHNhbWUKK2NvbXByZXNzZWQgbWV0YWRhdGEgYmxvY2ssIGFuZCB0aGVyZWZvcmUsIGNhbiBzaGFyZSB0aGUgc3RhcnQgYmxvY2suCitEaXJlY3RvcmllcyBhcmUgdGhlcmVmb3JlIG9yZ2FuaXNlZCBpbiBhIHR3byBsZXZlbCBsaXN0LCBhIGRpcmVjdG9yeQoraGVhZGVyIGNvbnRhaW5pbmcgdGhlIHNoYXJlZCBzdGFydCBibG9jayB2YWx1ZSwgYW5kIGEgc2VxdWVuY2Ugb2YgZGlyZWN0b3J5CitlbnRyaWVzLCBlYWNoIG9mIHdoaWNoIHNoYXJlIHRoZSBzaGFyZWQgc3RhcnQgYmxvY2suICBBIG5ldyBkaXJlY3RvcnkgaGVhZGVyCitpcyB3cml0dGVuIG9uY2UvaWYgdGhlIGlub2RlIHN0YXJ0IGJsb2NrIGNoYW5nZXMuICBUaGUgZGlyZWN0b3J5CitoZWFkZXIvZGlyZWN0b3J5IGVudHJ5IGxpc3QgaXMgcmVwZWF0ZWQgYXMgbWFueSB0aW1lcyBhcyBuZWNlc3NhcnkuCisKK0RpcmVjdG9yaWVzIGFyZSBzb3J0ZWQsIGFuZCBjYW4gY29udGFpbiBhIGRpcmVjdG9yeSBpbmRleCB0byBzcGVlZCB1cAorZmlsZSBsb29rdXAuICBEaXJlY3RvcnkgaW5kZXhlcyBzdG9yZSBvbmUgZW50cnkgcGVyIG1ldGFibG9jaywgZWFjaCBlbnRyeQorc3RvcmluZyB0aGUgaW5kZXgvZmlsZW5hbWUgbWFwcGluZyB0byB0aGUgZmlyc3QgZGlyZWN0b3J5IGhlYWRlcgoraW4gZWFjaCBtZXRhZGF0YSBibG9jay4gIERpcmVjdG9yaWVzIGFyZSBzb3J0ZWQgaW4gYWxwaGFiZXRpY2FsIG9yZGVyLAorYW5kIGF0IGxvb2t1cCB0aGUgaW5kZXggaXMgc2Nhbm5lZCBsaW5lYXJseSBsb29raW5nIGZvciB0aGUgZmlyc3QgZmlsZW5hbWUKK2FscGhhYmV0aWNhbGx5IGxhcmdlciB0aGFuIHRoZSBmaWxlbmFtZSBiZWluZyBsb29rZWQgdXAuICBBdCB0aGlzIHBvaW50IHRoZQorbG9jYXRpb24gb2YgdGhlIG1ldGFkYXRhIGJsb2NrIHRoZSBmaWxlbmFtZSBpcyBpbiBoYXMgYmVlbiBmb3VuZC4KK1RoZSBnZW5lcmFsIGlkZWEgb2YgdGhlIGluZGV4IGlzIGVuc3VyZSBvbmx5IG9uZSBtZXRhZGF0YSBibG9jayBuZWVkcyB0byBiZQorZGVjb21wcmVzc2VkIHRvIGRvIGEgbG9va3VwIGlycmVzcGVjdGl2ZSBvZiB0aGUgbGVuZ3RoIG9mIHRoZSBkaXJlY3RvcnkuCitUaGlzIHNjaGVtZSBoYXMgdGhlIGFkdmFudGFnZSB0aGF0IGl0IGRvZXNuJ3QgcmVxdWlyZSBleHRyYSBtZW1vcnkgb3ZlcmhlYWQKK2FuZCBkb2Vzbid0IHJlcXVpcmUgbXVjaCBleHRyYSBzdG9yYWdlIG9uIGRpc2suCisKKzMuMyBGaWxlIGRhdGEKKy0tLS0tLS0tLS0tLS0KKworUmVndWxhciBmaWxlcyBjb25zaXN0IG9mIGEgc2VxdWVuY2Ugb2YgY29udGlndW91cyBjb21wcmVzc2VkIGJsb2NrcywgYW5kL29yIGEKK2NvbXByZXNzZWQgZnJhZ21lbnQgYmxvY2sgKHRhaWwtZW5kIHBhY2tlZCBibG9jaykuICAgVGhlIGNvbXByZXNzZWQgc2l6ZQorb2YgZWFjaCBkYXRhYmxvY2sgaXMgc3RvcmVkIGluIGEgYmxvY2sgbGlzdCBjb250YWluZWQgd2l0aGluIHRoZQorZmlsZSBpbm9kZS4KKworVG8gc3BlZWQgdXAgYWNjZXNzIHRvIGRhdGFibG9ja3Mgd2hlbiByZWFkaW5nICdsYXJnZScgZmlsZXMgKDI1NiBNYnl0ZXMgb3IKK2xhcmdlciksIHRoZSBjb2RlIGltcGxlbWVudHMgYW4gaW5kZXggY2FjaGUgdGhhdCBjYWNoZXMgdGhlIG1hcHBpbmcgZnJvbQorYmxvY2sgaW5kZXggdG8gZGF0YWJsb2NrIGxvY2F0aW9uIG9uIGRpc2suCisKK1RoZSBpbmRleCBjYWNoZSBhbGxvd3MgU3F1YXNoZnMgdG8gaGFuZGxlIGxhcmdlIGZpbGVzICh1cCB0byAxLjc1IFRpQikgd2hpbGUKK3JldGFpbmluZyBhIHNpbXBsZSBhbmQgc3BhY2UtZWZmaWNpZW50IGJsb2NrIGxpc3Qgb24gZGlzay4gIFRoZSBjYWNoZQoraXMgc3BsaXQgaW50byBzbG90cywgY2FjaGluZyB1cCB0byBlaWdodCAyMjQgR2lCIGZpbGVzICgxMjggS2lCIGJsb2NrcykuCitMYXJnZXIgZmlsZXMgdXNlIG11bHRpcGxlIHNsb3RzLCB3aXRoIDEuNzUgVGlCIGZpbGVzIHVzaW5nIGFsbCA4IHNsb3RzLgorVGhlIGluZGV4IGNhY2hlIGlzIGRlc2lnbmVkIHRvIGJlIG1lbW9yeSBlZmZpY2llbnQsIGFuZCBieSBkZWZhdWx0IHVzZXMKKzE2IEtpQi4KKworMy40IEZyYWdtZW50IGxvb2t1cCB0YWJsZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitSZWd1bGFyIGZpbGVzIGNhbiBjb250YWluIGEgZnJhZ21lbnQgaW5kZXggd2hpY2ggaXMgbWFwcGVkIHRvIGEgZnJhZ21lbnQKK2xvY2F0aW9uIG9uIGRpc2sgYW5kIGNvbXByZXNzZWQgc2l6ZSB1c2luZyBhIGZyYWdtZW50IGxvb2t1cCB0YWJsZS4gIFRoaXMKK2ZyYWdtZW50IGxvb2t1cCB0YWJsZSBpcyBpdHNlbGYgc3RvcmVkIGNvbXByZXNzZWQgaW50byBtZXRhZGF0YSBibG9ja3MuCitBIHNlY29uZCBpbmRleCB0YWJsZSBpcyB1c2VkIHRvIGxvY2F0ZSB0aGVzZS4gIFRoaXMgc2Vjb25kIGluZGV4IHRhYmxlIGZvcgorc3BlZWQgb2YgYWNjZXNzIChhbmQgYmVjYXVzZSBpdCBpcyBzbWFsbCkgaXMgcmVhZCBhdCBtb3VudCB0aW1lIGFuZCBjYWNoZWQKK2luIG1lbW9yeS4KKworMy41IFVpZC9naWQgbG9va3VwIHRhYmxlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworRm9yIHNwYWNlIGVmZmljaWVuY3kgcmVndWxhciBmaWxlcyBzdG9yZSB1aWQgYW5kIGdpZCBpbmRleGVzLCB3aGljaCBhcmUKK2NvbnZlcnRlZCB0byAzMi1iaXQgdWlkcy9naWRzIHVzaW5nIGFuIGlkIGxvb2sgdXAgdGFibGUuICBUaGlzIHRhYmxlIGlzCitzdG9yZWQgY29tcHJlc3NlZCBpbnRvIG1ldGFkYXRhIGJsb2Nrcy4gIEEgc2Vjb25kIGluZGV4IHRhYmxlIGlzIHVzZWQgdG8KK2xvY2F0ZSB0aGVzZS4gIFRoaXMgc2Vjb25kIGluZGV4IHRhYmxlIGZvciBzcGVlZCBvZiBhY2Nlc3MgKGFuZCBiZWNhdXNlIGl0CitpcyBzbWFsbCkgaXMgcmVhZCBhdCBtb3VudCB0aW1lIGFuZCBjYWNoZWQgaW4gbWVtb3J5LgorCiszLjYgRXhwb3J0IHRhYmxlCistLS0tLS0tLS0tLS0tLS0tCisKK1RvIGVuYWJsZSBTcXVhc2hmcyBmaWxlc3lzdGVtcyB0byBiZSBleHBvcnRhYmxlICh2aWEgTkZTIGV0Yy4pIGZpbGVzeXN0ZW1zCitjYW4gb3B0aW9uYWxseSAoZGlzYWJsZWQgd2l0aCB0aGUgLW5vLWV4cG9ydHMgTWtzcXVhc2hmcyBvcHRpb24pIGNvbnRhaW4KK2FuIGlub2RlIG51bWJlciB0byBpbm9kZSBkaXNrIGxvY2F0aW9uIGxvb2t1cCB0YWJsZS4gIFRoaXMgaXMgcmVxdWlyZWQgdG8KK2VuYWJsZSBTcXVhc2hmcyB0byBtYXAgaW5vZGUgbnVtYmVycyBwYXNzZWQgaW4gZmlsZWhhbmRsZXMgdG8gdGhlIGlub2RlCitsb2NhdGlvbiBvbiBkaXNrLCB3aGljaCBpcyBuZWNlc3Nhcnkgd2hlbiB0aGUgZXhwb3J0IGNvZGUgcmVpbnN0YW50aWF0ZXMKK2V4cGlyZWQvZmx1c2hlZCBpbm9kZXMuCisKK1RoaXMgdGFibGUgaXMgc3RvcmVkIGNvbXByZXNzZWQgaW50byBtZXRhZGF0YSBibG9ja3MuICBBIHNlY29uZCBpbmRleCB0YWJsZSBpcwordXNlZCB0byBsb2NhdGUgdGhlc2UuICBUaGlzIHNlY29uZCBpbmRleCB0YWJsZSBmb3Igc3BlZWQgb2YgYWNjZXNzIChhbmQgYmVjYXVzZQoraXQgaXMgc21hbGwpIGlzIHJlYWQgYXQgbW91bnQgdGltZSBhbmQgY2FjaGVkIGluIG1lbW9yeS4KKworCis0LiBUT0RPUyBBTkQgT1VUU1RBTkRJTkcgSVNTVUVTCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKzQuMSBUb2RvIGxpc3QKKy0tLS0tLS0tLS0tLS0KKworSW1wbGVtZW50IFhhdHRyIGFuZCBBQ0wgc3VwcG9ydC4gIFRoZSBTcXVhc2hmcyA0LjAgZmlsZXN5c3RlbSBsYXlvdXQgaGFzIGhvb2tzCitmb3IgdGhlc2UgYnV0IHRoZSBjb2RlIGhhcyBub3QgYmVlbiB3cml0dGVuLiAgT25jZSB0aGUgY29kZSBoYXMgYmVlbiB3cml0dGVuCit0aGUgZXhpc3RpbmcgbGF5b3V0IHNob3VsZCBub3QgcmVxdWlyZSBtb2RpZmljYXRpb24uCisKKzQuMiBTcXVhc2hmcyBpbnRlcm5hbCBjYWNoZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0Jsb2NrcyBpbiBTcXVhc2hmcyBhcmUgY29tcHJlc3NlZC4gIFRvIGF2b2lkIHJlcGVhdGVkbHkgZGVjb21wcmVzc2luZworcmVjZW50bHkgYWNjZXNzZWQgZGF0YSBTcXVhc2hmcyB1c2VzIHR3byBzbWFsbCBtZXRhZGF0YSBhbmQgZnJhZ21lbnQgY2FjaGVzLgorCitUaGUgY2FjaGUgaXMgbm90IHVzZWQgZm9yIGZpbGUgZGF0YWJsb2NrcywgdGhlc2UgYXJlIGRlY29tcHJlc3NlZCBhbmQgY2FjaGVkIGluCit0aGUgcGFnZS1jYWNoZSBpbiB0aGUgbm9ybWFsIHdheS4gIFRoZSBjYWNoZSBpcyB1c2VkIHRvIHRlbXBvcmFyaWx5IGNhY2hlCitmcmFnbWVudCBhbmQgbWV0YWRhdGEgYmxvY2tzIHdoaWNoIGhhdmUgYmVlbiByZWFkIGFzIGEgcmVzdWx0IG9mIGEgbWV0YWRhdGEKKyhpLmUuIGlub2RlIG9yIGRpcmVjdG9yeSkgb3IgZnJhZ21lbnQgYWNjZXNzLiAgQmVjYXVzZSBtZXRhZGF0YSBhbmQgZnJhZ21lbnRzCithcmUgcGFja2VkIHRvZ2V0aGVyIGludG8gYmxvY2tzICh0byBnYWluIGdyZWF0ZXIgY29tcHJlc3Npb24pIHRoZSByZWFkIG9mIGEKK3BhcnRpY3VsYXIgcGllY2Ugb2YgbWV0YWRhdGEgb3IgZnJhZ21lbnQgd2lsbCByZXRyaWV2ZSBvdGhlciBtZXRhZGF0YS9mcmFnbWVudHMKK3doaWNoIGhhdmUgYmVlbiBwYWNrZWQgd2l0aCBpdCwgdGhlc2UgYmVjYXVzZSBvZiBsb2NhbGl0eS1vZi1yZWZlcmVuY2UgbWF5IGJlCityZWFkIGluIHRoZSBuZWFyIGZ1dHVyZS4gVGVtcG9yYXJpbHkgY2FjaGluZyB0aGVtIGVuc3VyZXMgdGhleSBhcmUgYXZhaWxhYmxlCitmb3IgbmVhciBmdXR1cmUgYWNjZXNzIHdpdGhvdXQgcmVxdWlyaW5nIGFuIGFkZGl0aW9uYWwgcmVhZCBhbmQgZGVjb21wcmVzcy4KKworSW4gdGhlIGZ1dHVyZSB0aGlzIGludGVybmFsIGNhY2hlIG1heSBiZSByZXBsYWNlZCB3aXRoIGFuIGltcGxlbWVudGF0aW9uIHdoaWNoCit1c2VzIHRoZSBrZXJuZWwgcGFnZSBjYWNoZS4gIEJlY2F1c2UgdGhlIHBhZ2UgY2FjaGUgb3BlcmF0ZXMgb24gcGFnZSBzaXplZAordW5pdHMgdGhpcyBtYXkgaW50cm9kdWNlIGFkZGl0aW9uYWwgY29tcGxleGl0eSBpbiB0ZXJtcyBvZiBsb2NraW5nIGFuZAorYXNzb2NpYXRlZCByYWNlIGNvbmRpdGlvbnMuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL3Zmcy50eHQgYi9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL3Zmcy50eHQKaW5kZXggZWYxOWFmYS4uZGVlZWVkMCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy92ZnMudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvdmZzLnR4dApAQCAtMjEwLDggKzIxMCw4IEBACiAgICAgICAgIHZvaWQgKCpwdXRfc3VwZXIpIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKik7CiAgICAgICAgIHZvaWQgKCp3cml0ZV9zdXBlcikgKHN0cnVjdCBzdXBlcl9ibG9jayAqKTsKICAgICAgICAgaW50ICgqc3luY19mcykoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IHdhaXQpOwotICAgICAgICB2b2lkICgqd3JpdGVfc3VwZXJfbG9ja2ZzKSAoc3RydWN0IHN1cGVyX2Jsb2NrICopOwotICAgICAgICB2b2lkICgqdW5sb2NrZnMpIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKik7CisgICAgICAgIGludCAoKmZyZWV6ZV9mcykgKHN0cnVjdCBzdXBlcl9ibG9jayAqKTsKKyAgICAgICAgaW50ICgqdW5mcmVlemVfZnMpIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKik7CiAgICAgICAgIGludCAoKnN0YXRmcykgKHN0cnVjdCBkZW50cnkgKiwgc3RydWN0IGtzdGF0ZnMgKik7CiAgICAgICAgIGludCAoKnJlbW91bnRfZnMpIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgaW50ICosIGNoYXIgKik7CiAgICAgICAgIHZvaWQgKCpjbGVhcl9pbm9kZSkgKHN0cnVjdCBpbm9kZSAqKTsKQEAgLTI3MCwxMSArMjcwLDExIEBACiAgIAlhIHN1cGVyYmxvY2suIFRoZSBzZWNvbmQgcGFyYW1ldGVyIGluZGljYXRlcyB3aGV0aGVyIHRoZSBtZXRob2QKIAlzaG91bGQgd2FpdCB1bnRpbCB0aGUgd3JpdGUgb3V0IGhhcyBiZWVuIGNvbXBsZXRlZC4gT3B0aW9uYWwuCiAKLSAgd3JpdGVfc3VwZXJfbG9ja2ZzOiBjYWxsZWQgd2hlbiBWRlMgaXMgbG9ja2luZyBhIGZpbGVzeXN0ZW0gYW5kCisgIGZyZWV6ZV9mczogY2FsbGVkIHdoZW4gVkZTIGlzIGxvY2tpbmcgYSBmaWxlc3lzdGVtIGFuZAogICAJZm9yY2luZyBpdCBpbnRvIGEgY29uc2lzdGVudCBzdGF0ZS4gIFRoaXMgbWV0aG9kIGlzIGN1cnJlbnRseQogICAJdXNlZCBieSB0aGUgTG9naWNhbCBWb2x1bWUgTWFuYWdlciAoTFZNKS4KIAotICB1bmxvY2tmczogY2FsbGVkIHdoZW4gVkZTIGlzIHVubG9ja2luZyBhIGZpbGVzeXN0ZW0gYW5kIG1ha2luZyBpdCB3cml0YWJsZQorICB1bmZyZWV6ZV9mczogY2FsbGVkIHdoZW4gVkZTIGlzIHVubG9ja2luZyBhIGZpbGVzeXN0ZW0gYW5kIG1ha2luZyBpdCB3cml0YWJsZQogICAJYWdhaW4uCiAKICAgc3RhdGZzOiBjYWxsZWQgd2hlbiB0aGUgVkZTIG5lZWRzIHRvIGdldCBmaWxlc3lzdGVtIHN0YXRpc3RpY3MuIFRoaXMKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaHdtb24vYWJpdHVndXJ1LWRhdGFzaGVldCBiL0RvY3VtZW50YXRpb24vaHdtb24vYWJpdHVndXJ1LWRhdGFzaGVldAppbmRleCBhZWY1YTliLi5kOTI1MWVmIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2h3bW9uL2FiaXR1Z3VydS1kYXRhc2hlZXQKKysrIGIvRG9jdW1lbnRhdGlvbi9od21vbi9hYml0dWd1cnUtZGF0YXNoZWV0CkBAIC03NCw3ICs3NCw3IEBACiBOb3RpY2UgdGhhdCBzb21lIGJhbmtzIGhhdmUgYm90aCBhIHJlYWQgYW5kIGEgd3JpdGUgYWRkcmVzcyB0aGlzIGlzIGhvdyB0aGUKIHVHdXJ1IGRldGVybWluZXMgaWYgYSByZWFkIGZyb20gb3IgYSB3cml0ZSB0byB0aGUgYmFuayBpcyB0YWtpbmcgcGxhY2UsIHRodXMKIHdoZW4gcmVhZGluZyB5b3Ugc2hvdWxkIGFsd2F5cyB1c2UgdGhlIHJlYWQgYWRkcmVzcyBhbmQgd2hlbiB3cml0aW5nIHRoZQotd3JpdGUgYWRkcmVzcy4gVGhlIHdyaXRlIGFkZHJlc3MgaXMgYWx3YXlzIG9uZSAoMSkgbW9yZSB0aGVuIHRoZSByZWFkIGFkZHJlc3MuCit3cml0ZSBhZGRyZXNzLiBUaGUgd3JpdGUgYWRkcmVzcyBpcyBhbHdheXMgb25lICgxKSBtb3JlIHRoYW4gdGhlIHJlYWQgYWRkcmVzcy4KIAogCiB1R3VydSByZWFkeQpAQCAtMTIxLDcgKzEyMSw3IEBACiB0ZXN0IGZvciB0aGlzLiBOb3RpY2UgdGhhdCB0aGUgbnVtYmVyIG9mIGJ5dGVzIGlzIGJhbmsgYWRkcmVzcyBkZXBlbmRlbnQgc2VlCiBhYm92ZSBhbmQgYmVsb3cuCiAKLUFmdGVyIGNvbXBsZXRpbmcgYSBzdWNjZXNzZnVsbCByZWFkIGl0IGlzIGFkdmlzZWQgdG8gcHV0IHRoZSB1R3VydSBiYWNrIGluCitBZnRlciBjb21wbGV0aW5nIGEgc3VjY2Vzc2Z1bCByZWFkIGl0IGlzIGFkdmlzZWQgdG8gcHV0IHRoZSB1R3VydSBiYWNrIGluCiByZWFkeSBtb2RlLCBzbyB0aGF0IGl0IGlzIHJlYWR5IGZvciB0aGUgbmV4dCByZWFkIC8gd3JpdGUgY3ljbGUuIFRoaXMgd2F5CiBpZiB5b3VyIHByb2dyYW0gLyBkcml2ZXIgaXMgdW5sb2FkZWQgYW5kIGxhdGVyIGxvYWRlZCBhZ2FpbiB0aGUgZGV0ZWN0aW9uCiBhbGdvcml0aG0gZGVzY3JpYmVkIGFib3ZlIHdpbGwgc3RpbGwgd29yay4KQEAgLTE0MSw3ICsxNDEsNyBAQAogCiBPbmNlIERBVEEgaG9sZHMgMHgwMSByZWFkIENNRCBpdCBzaG91bGQgaG9sZCAweEFDIG5vdy4KIAotQWZ0ZXIgY29tcGxldGluZyBhIHN1Y2Nlc3NmdWxsIHdyaXRlIGl0IGlzIGFkdmlzZWQgdG8gcHV0IHRoZSB1R3VydSBiYWNrIGluCitBZnRlciBjb21wbGV0aW5nIGEgc3VjY2Vzc2Z1bCB3cml0ZSBpdCBpcyBhZHZpc2VkIHRvIHB1dCB0aGUgdUd1cnUgYmFjayBpbgogcmVhZHkgbW9kZSwgc28gdGhhdCBpdCBpcyByZWFkeSBmb3IgdGhlIG5leHQgcmVhZCAvIHdyaXRlIGN5Y2xlLiBUaGlzIHdheQogaWYgeW91ciBwcm9ncmFtIC8gZHJpdmVyIGlzIHVubG9hZGVkIGFuZCBsYXRlciBsb2FkZWQgYWdhaW4gdGhlIGRldGVjdGlvbgogYWxnb3JpdGhtIGRlc2NyaWJlZCBhYm92ZSB3aWxsIHN0aWxsIHdvcmsuCkBAIC0yMjQsNyArMjI0LDcgQEAKIEJpdCA0OiAxIGlmIGFsYXJtIGNhdXNlIG1lYXN1cmVkIHRlbXAgaXMgb3ZlciB0aGUgd2FybmluZyB0aHJlc2hvbGQJKFIpCiBCaXQgNTogMSBpZiBhbGFybSBjYXVzZSBtZWFzdXJlZCB2b2x0IGlzIG92ZXIgdGhlIG1heCB0aHJlc2hvbGQJCShSKQogQml0IDY6IDEgaWYgYWxhcm0gY2F1c2UgbWVhc3VyZWQgdm9sdCBpcyB1bmRlciB0aGUgbWluIHRocmVzaG9sZAkoUikKLUJpdCA3OiBWb2x0IHNlbnNvcjogU2h1dGRvd24gaWYgYWxhcm0gcGVyc2lzdCBmb3IgbW9yZSB0aGVuIDQgc2Vjb25kcwkoUlcpCitCaXQgNzogVm9sdCBzZW5zb3I6IFNodXRkb3duIGlmIGFsYXJtIHBlcnNpc3QgZm9yIG1vcmUgdGhhbiA0IHNlY29uZHMJKFJXKQogICAgICAgIFRlbXAgc2Vuc29yOiBTaHV0ZG93biBpZiB0ZW1wIGlzIG92ZXIgdGhlIHNodXRkb3duIHRocmVzaG9sZAkoUlcpCiAKICogIFRoaXMgYml0IGlzIG9ubHkgaG9ub3JlZC91c2VkIGJ5IHRoZSB1R3VydSBpZiBhIHRlbXAgc2Vuc29yIGlzIGNvbm5lY3RlZApAQCAtMjkzLDcgKzI5Myw3IEBACiBBbGFybSBiZWhhdmlvdXIgZm9yIHRoZSBzZWxlY3RlZCBzZW5zb3IuIEEgMSBlbmFibGVzIHRoZSBkZXNjcmliZWQgYmVoYXZpb3VyLgogQml0IDA6IEdpdmUgYW4gYWxhcm0gaWYgbWVhc3VyZWQgcnBtIGlzIHVuZGVyIHRoZSBtaW4gdGhyZXNob2xkCShSVykKIEJpdCAzOiBCZWVwIGlmIGFsYXJtCQkJCQkJKFJXKQotQml0IDc6IFNodXRkb3duIGlmIGFsYXJtIHBlcnNpc3QgZm9yIG1vcmUgdGhlbiA0IHNlY29uZHMJKFJXKQorQml0IDc6IFNodXRkb3duIGlmIGFsYXJtIHBlcnNpc3QgZm9yIG1vcmUgdGhhbiA0IHNlY29uZHMJKFJXKQogCiBCeXRlIDE6CiBtaW4gdGhyZXNob2xkIChzY2FsZSBhcyBiYW5rIDB4MjYpCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2h3bW9uL2FkdDc0NzUgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL2FkdDc0NzUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTJiMWFiZQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vaHdtb24vYWR0NzQ3NQpAQCAtMCwwICsxLDg3IEBACitUaGlzIGRlc2NyaWJlcyB0aGUgaW50ZXJmYWNlIGZvciB0aGUgQURUNzQ3NSBkcml2ZXI6CisKKyh0aGVyZSBhcmUgNCBmYW5zLCBudW1iZXJlZCBmYW4xIHRvIGZhbjQpOgorCitmYW5YX2lucHV0CQlSZWFkIHRoZSBjdXJyZW50IHNwZWVkIG9mIHRoZSBmYW4gKGluIFJQTXMpCitmYW5YX21pbgkJUmVhZC93cml0ZSB0aGUgbWluaW11bSBzcGVlZCBvZiB0aGUgZmFuLiAgRHJvcHBpbmcKKwkJCWJlbG93IHRoaXMgc2V0cyBhbiBhbGFybS4KKworKHRoZXJlIGFyZSB0aHJlZSBQV01zLCBudW1iZXJlZCBwd20xIHRvIHB3bTMpOgorCitwd21YCQkJUmVhZC93cml0ZSB0aGUgY3VycmVudCBkdXR5IGN5Y2xlIG9mIHRoZSBQV00uICBXcml0ZXMKKwkJCW9ubHkgaGF2ZSBlZmZlY3Qgd2hlbiBhdXRvIG1vZGUgaXMgdHVybmVkIG9mZiAoc2VlCisJCQliZWxvdykuICBSYW5nZSBpcyAwIC0gMjU1LgorCitwd21YX2VuYWJsZQkJRmFuIHNwZWVkIGNvbnRyb2wgbWV0aG9kOgorCisJCQkwIC0gTm8gY29udHJvbCAoZmFuIGF0IGZ1bGwgc3BlZWQpCisJCQkxIC0gTWFudWFsIGZhbiBzcGVlZCBjb250cm9sICh1c2luZyBwd21bMS0qXSkKKwkJCTIgLSBBdXRvbWF0aWMgZmFuIHNwZWVkIGNvbnRyb2wKKworcHdtWF9hdXRvX2NoYW5uZWxzX3RlbXAJU2VsZWN0IHdoaWNoIGNoYW5uZWxzIGFmZmVjdCB0aGlzIFBXTQorCisJCQkxIC0gVEVNUDEgY29udHJvbHMgUFdNCisJCQkyIC0gVEVNUDIgY29udHJvbHMgUFdNCisJCQk0IC0gVEVNUDMgY29udHJvbHMgUFdNCisJCQk2IC0gVEVNUDIgYW5kIFRFTVAzIGNvbnRyb2wgUFdNCisJCQk3IC0gQWxsIHRocmVlIGlucHV0cyBjb250cm9sIFBXTQorCitwd21YX2ZyZXEJCVJlYWQvd3JpdGUgdGhlIFBXTSBmcmVxdWVuY3kgaW4gSHouIFRoZSBudW1iZXIKKwkJCXNob3VsZCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKKworCQkJMTEgSHoKKwkJCTE0IEh6CisJCQkyMiBIegorCQkJMjkgSHoKKwkJCTM1IEh6CisJCQk0NCBIegorCQkJNTggSHoKKwkJCTg4IEh6CisKK3B3bVhfYXV0b19wb2ludDFfcHdtCVJlYWQvd3JpdGUgdGhlIG1pbmltdW0gUFdNIGR1dHkgY3ljbGUgaW4gYXV0b21hdGljIG1vZGUKKworcHdtWF9hdXRvX3BvaW50Ml9wd20JUmVhZC93cml0ZSB0aGUgbWF4aW11bSBQV00gZHV0eSBjeWNsZSBpbiBhdXRvbWF0aWMgbW9kZQorCisodGhlcmUgYXJlIHRocmVlIHRlbXBlcmF0dXJlIHNldHRpbmdzIG51bWJlcmVkIHRlbXAxIHRvIHRlbXAzKToKKwordGVtcFhfaW5wdXQJCVJlYWQgdGhlIGN1cnJlbnQgdGVtcGVyYXR1cmUuICBUaGUgdmFsdWUgaXMgaW4gbWlsbGkKKwkJCWRlZ3JlZXMgb2YgQ2Vsc2l1cy4KKwordGVtcFhfbWF4CQlSZWFkL3dyaXRlIHRoZSB1cHBlciB0ZW1wZXJhdHVyZSBsaW1pdCAtIGV4Y2VlZGluZyB0aGlzCisJCQl3aWxsIGNhdXNlIGFuIGFsYXJtLgorCit0ZW1wWF9taW4JCVJlYWQvd3JpdGUgdGhlIGxvd2VyIHRlbXBlcmF0dXJlIGxpbWl0IC0gZXhjZWVkaW5nIHRoaXMKKwkJCXdpbGwgY2F1c2UgYW4gYWxhcm0uCisKK3RlbXBYX29mZnNldAkJUmVhZC93cml0ZSB0aGUgdGVtcGVyYXR1cmUgYWRqdXN0bWVudCBvZmZzZXQKKwordGVtcFhfY3JpdAkJUmVhZC93cml0ZSB0aGUgVEhFUk0gbGltaXQgZm9yIHJlbW90ZTEuCisKK3RlbXBYX2NyaXRfaHlzdAkJU2V0IHRoZSB0ZW1wZXJhdHVyZSB2YWx1ZSBiZWxvdyBjcml0IHdoZXJlIHRoZQorCQkJZmFucyB3aWxsIHN0YXkgb24gLSB0aGlzIGhlbHBzIGRyaXZlIHRoZSB0ZW1wZXJhdHVyZQorCQkJbG93IGVub3VnaCBzbyBpdCBkb2Vzbid0IHN0YXkgbmVhciB0aGUgZWRnZSBhbmQKKwkJCWNhdXNlIFRIRVJNIHRvIGtlZXAgdHJpcHBpbmcuCisKK3RlbXBYX2F1dG9fcG9pbnQxX3RlbXAJUmVhZC93cml0ZSB0aGUgbWluaW11bSB0ZW1wZXJhdHVyZSB3aGVyZSB0aGUgZmFucyB3aWxsCisJCQl0dXJuIG9uIGluIGF1dG9tYXRpYyBtb2RlLgorCit0ZW1wWF9hdXRvX3BvaW50Ml90ZW1wCVJlYWQvd3JpdGUgdGhlIG1heGltdW0gdGVtcGVyYXR1cmUgb3ZlciB3aGljaCB0aGUgZmFucworCQkJd2lsbCBydW4gaW4gYXV0b21hdGljIG1vZGUuICB0ZW1wWF9hdXRvX3BvaW50MV90ZW1wCisJCQlhbmQgdGVtcFhfYXV0b19wb2ludDJfdGVtcCB0b2dldGhlciBkZWZpbmUgdGhlCisJCQlyYW5nZSBvZiBhdXRvbWF0aWMgY29udHJvbC4KKwordGVtcFhfYWxhcm0JCVJlYWQgYSAxIGlmIHRoZSBtYXgvbWluIGFsYXJtIGlzIHNldAordGVtcFhfZmF1bHQJCVJlYWQgYSAxIGlmIGVpdGhlciB0ZW1wMSBvciB0ZW1wMyBkaW9kZSBoYXMgYSBmYXVsdAorCisoVGhlcmUgYXJlIHR3byB2b2x0YWdlIHNldHRpbmdzLCBpbjEgYW5kIGluMik6CisKK2luWF9pbnB1dAkJUmVhZCB0aGUgY3VycmVudCB2b2x0YWdlIG9uIFZDQy4gIFZhbHVlIGlzIGluCisJCQltaWxsaXZvbHRzLgorCitpblhfbWluCQkJcmVhZC93cml0ZSB0aGUgbWluaW11bSB2b2x0YWdlIGxpbWl0LgorCQkJRHJvcHBpbmcgYmVsb3cgdGhpcyBjYXVzZXMgYW4gYWxhcm0uCisKK2luWF9tYXgJCQlyZWFkL3dyaXRlIHRoZSBtYXhpbXVtIHZvbHRhZ2UgbGltaXQuCisJCQlFeGNlZWRpbmcgdGhpcyBjYXVzZXMgYW4gYWxhcm0uCisKK2luWF9hbGFybQkJUmVhZCBhIDEgaWYgdGhlIG1heC9taW4gYWxhcm0gaXMgc2V0LgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9od21vbi9mNzE4ODJmZyBiL0RvY3VtZW50YXRpb24vaHdtb24vZjcxODgyZmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTgzMjEyNgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vaHdtb24vZjcxODgyZmcKQEAgLTAsMCArMSw4OSBAQAorS2VybmVsIGRyaXZlciBmNzE4ODJmZworPT09PT09PT09PT09PT09PT09PT09PQorCitTdXBwb3J0ZWQgY2hpcHM6CisgICogRmludGVrIEY3MTg4MkZHIGFuZCBGNzE4ODNGRworICAgIFByZWZpeDogJ2Y3MTg4MmZnJworICAgIEFkZHJlc3NlcyBzY2FubmVkOiBub25lLCBhZGRyZXNzIHJlYWQgZnJvbSBTdXBlciBJL08gY29uZmlnIHNwYWNlCisgICAgRGF0YXNoZWV0OiBBdmFpbGFibGUgZnJvbSB0aGUgRmludGVrIHdlYnNpdGUKKyAgKiBGaW50ZWsgRjcxODYyRkcgYW5kIEY3MTg2M0ZHCisgICAgUHJlZml4OiAnZjcxODYyZmcnCisgICAgQWRkcmVzc2VzIHNjYW5uZWQ6IG5vbmUsIGFkZHJlc3MgcmVhZCBmcm9tIFN1cGVyIEkvTyBjb25maWcgc3BhY2UKKyAgICBEYXRhc2hlZXQ6IEF2YWlsYWJsZSBmcm9tIHRoZSBGaW50ZWsgd2Vic2l0ZQorICAqIEZpbnRlayBGODAwMAorICAgIFByZWZpeDogJ2Y4MDAwJworICAgIEFkZHJlc3NlcyBzY2FubmVkOiBub25lLCBhZGRyZXNzIHJlYWQgZnJvbSBTdXBlciBJL08gY29uZmlnIHNwYWNlCisgICAgRGF0YXNoZWV0OiBOb3QgcHVibGljCisKK0F1dGhvcjogSGFucyBkZSBHb2VkZSA8aGRlZ29lZGVAcmVkaGF0LmNvbT4KKworCitEZXNjcmlwdGlvbgorLS0tLS0tLS0tLS0KKworRmludGVrIEY3MTh4eEZHL0Y4MDAwIFN1cGVyIEkvTyBjaGlwcyBpbmNsdWRlIGNvbXBsZXRlIGhhcmR3YXJlIG1vbml0b3JpbmcKK2NhcGFiaWxpdGllcy4gVGhleSBjYW4gbW9uaXRvciB1cCB0byA5IHZvbHRhZ2VzICgzIGZvciB0aGUgRjgwMDApLCA0IGZhbnMgYW5kCiszIHRlbXBlcmF0dXJlIHNlbnNvcnMuCisKK1RoZXNlIGNoaXBzIGFsc28gaGF2ZSBmYW4gY29udHJvbGxpbmcgZmVhdHVyZXMsIHVzaW5nIGVpdGhlciBEQyBvciBQV00sIGluCit0aHJlZSBkaWZmZXJlbnQgbW9kZXMgKG9uZSBtYW51YWwsIHR3byBhdXRvbWF0aWMpLgorCitUaGUgZHJpdmVyIGFzc3VtZXMgdGhhdCBubyBtb3JlIHRoYW4gb25lIGNoaXAgaXMgcHJlc2VudCwgd2hpY2ggc2VlbXMKK3JlYXNvbmFibGUuCisKKworTW9uaXRvcmluZworLS0tLS0tLS0tLQorCitUaGUgVm9sdGFnZSwgRmFuIGFuZCBUZW1wZXJhdHVyZSBNb25pdG9yaW5nIHVzZXMgdGhlIHN0YW5kYXJkIHN5c2ZzCitpbnRlcmZhY2UgYXMgZG9jdW1lbnRlZCBpbiBzeXNmcy1pbnRlcmZhY2UsIHdpdGhvdXQgYW55IGV4Y2VwdGlvbnMuCisKKworRmFuIENvbnRyb2wKKy0tLS0tLS0tLS0tCisKK0JvdGggUFdNIChwdWxzZS13aWR0aCBtb2R1bGF0aW9uKSBhbmQgREMgZmFuIHNwZWVkIGNvbnRyb2wgbWV0aG9kcyBhcmUKK3N1cHBvcnRlZC4gVGhlIHJpZ2h0IG9uZSB0byB1c2UgZGVwZW5kcyBvbiBleHRlcm5hbCBjaXJjdWl0cnkgb24gdGhlCittb3RoZXJib2FyZCwgc28gdGhlIGRyaXZlciBhc3N1bWVzIHRoYXQgdGhlIEJJT1Mgc2V0IHRoZSBtZXRob2QKK3Byb3Blcmx5LgorCitUaGVyZSBhcmUgMiBtb2RlcyB0byBzcGVjaWZ5IHRoZSBzcGVlZCBvZiB0aGUgZmFuLCBQV00gZHV0eSBjeWNsZSAob3IgREMKK3ZvbHRhZ2UpIG1vZGUsIHdoZXJlIDAtMTAwJSBkdXR5IGN5Y2xlICgwLTEwMCUgb2YgMTJWKSBpcyBzcGVjaWZpZWQuIEFuZCBSUE0KK21vZGUgd2hlcmUgdGhlIGFjdHVhbCBSUE0gb2YgdGhlIGZhbiAoYXMgbWVhc3VyZWQpIGlzIGNvbnRyb2xsZWQgYW5kIHRoZSBzcGVlZAorZ2V0cyBzcGVjaWZpZWQgYXMgMC0xMDAlIG9mIHRoZSBmYW4jX2Z1bGxfc3BlZWQgZmlsZS4KKworU2luY2UgYm90aCBtb2RlcyB3b3JrIGluIGEgMC0xMDAlIChtYXBwZWQgdG8gMC0yNTUpIHNjYWxlLCB0aGVyZSBpc24ndCBhCit3aG9sZSBsb3Qgb2YgYSBkaWZmZXJlbmNlIHdoZW4gbW9kaWZ5aW5nIGZhbiBjb250cm9sIHNldHRpbmdzLiBUaGUgb25seQoraW1wb3J0YW50IGRpZmZlcmVuY2UgaXMgdGhhdCBpbiBSUE0gbW9kZSB0aGUgMC0xMDAlIGNvbnRyb2xzIHRoZSBmYW4gc3BlZWQKK2JldHdlZW4gMC0xMDAlIG9mIGZhbiNfZnVsbF9zcGVlZC4gSXQgaXMgYXNzdW1lZCB0aGF0IGlmIHRoZSBCSU9TIHByb2dyYW1zCitSUE0gbW9kZSwgaXQgd2lsbCBhbHNvIHNldCBmYW4jX2Z1bGxfc3BlZWQgcHJvcGVybHksIGlmIGl0IGRvZXMgbm90IHRoZW4KK2ZhbiBjb250cm9sIHdpbGwgbm90IHdvcmsgcHJvcGVybHksIHVubGVzcyB5b3Ugc2V0IGEgc2FuZSBmYW4jX2Z1bGxfc3BlZWQKK3ZhbHVlIHlvdXJzZWxmLgorCitTd2l0Y2hpbmcgYmV0d2VlbiB0aGVzZSBtb2RlcyByZXF1aXJlcyByZS1pbml0aWFsaXppbmcgYSB3aG9sZSBidW5jaCBvZgorcmVnaXN0ZXJzLCBzbyB0aGUgbW9kZSB3aGljaCB0aGUgQklPUyBoYXMgc2V0IGlzIGtlcHQuIFRoZSBtb2RlIGlzCitwcmludGVkIHdoZW4gbG9hZGluZyB0aGUgZHJpdmVyLgorCitUaHJlZSBkaWZmZXJlbnQgZmFuIGNvbnRyb2wgbW9kZXMgYXJlIHN1cHBvcnRlZDsgdGhlIG1vZGUgbnVtYmVyIGlzIHdyaXR0ZW4KK3RvIHRoZSBwd20jX2VuYWJsZSBmaWxlLiBOb3RlIHRoYXQgbm90IGFsbCBtb2RlcyBhcmUgc3VwcG9ydGVkIG9uIGFsbAorY2hpcHMsIGFuZCBzb21lIG1vZGVzIG1heSBvbmx5IGJlIGF2YWlsYWJsZSBpbiBSUE0gLyBQV00gbW9kZSBvbiB0aGUgRjgwMDAuCitXcml0aW5nIGFuIHVuc3VwcG9ydGVkIG1vZGUgd2lsbCByZXN1bHQgaW4gYW4gaW52YWxpZCBwYXJhbWV0ZXIgZXJyb3IuCisKKyogMTogTWFudWFsIG1vZGUKKyAgWW91IGFzayBmb3IgYSBzcGVjaWZpYyBQV00gZHV0eSBjeWNsZSAvIERDIHZvbHRhZ2Ugb3IgYSBzcGVjaWZpYyAlIG9mCisgIGZhbiNfZnVsbF9zcGVlZCBieSB3cml0aW5nIHRvIHRoZSBwd20jIGZpbGUuIFRoaXMgbW9kZSBpcyBvbmx5CisgIGF2YWlsYWJsZSBvbiB0aGUgRjgwMDAgaWYgdGhlIGZhbiBjaGFubmVsIGlzIGluIFJQTSBtb2RlLgorCisqIDI6IE5vcm1hbCBhdXRvIG1vZGUKKyAgWW91IGNhbiBkZWZpbmUgYSBudW1iZXIgb2YgdGVtcGVyYXR1cmUvZmFuIHNwZWVkIHRyaXAgcG9pbnRzLCB3aGljaCAlIHRoZQorICBmYW4gc2hvdWxkIHJ1biBhdCBhdCB0aGlzIHRlbXAgYW5kIHdoaWNoIHRlbXAgYSBmYW4gc2hvdWxkIGZvbGxvdyB1c2luZyB0aGUKKyAgc3RhbmRhcmQgc3lzZnMgaW50ZXJmYWNlLiBUaGUgbnVtYmVyIGFuZCB0eXBlIG9mIHRyaXAgcG9pbnRzIGlzIGNoaXAKKyAgZGVwZW5kZWQsIHNlZSB3aGljaCBmaWxlcyBhcmUgYXZhaWxhYmxlIGluIHN5c2ZzLgorICBGYW4vUFdNIGNoYW5uZWwgMyBvZiB0aGUgRjgwMDAgaXMgYWx3YXlzIGluIHRoaXMgbW9kZSEKKworKiAzOiBUaGVybW9zdGF0IG1vZGUgKE9ubHkgYXZhaWxhYmxlIG9uIHRoZSBGODAwMCB3aGVuIGluIGR1dHkgY3ljbGUgbW9kZSkKKyAgVGhlIGZhbiBzcGVlZCBpcyByZWd1bGF0ZWQgdG8ga2VlcCB0aGUgdGVtcCB0aGUgZmFuIGlzIG1hcHBlZCB0byBiZXR3ZWVuCisgIHRlbXAjX2F1dG9fcG9pbnQyX3RlbXAgYW5kIHRlbXAjX2F1dG9fcG9pbnQzX3RlbXAuCisKK0JvdGggb2YgdGhlIGF1dG9tYXRpYyBtb2RlcyByZXF1aXJlIHRoYXQgcHdtMSBjb3JyZXNwb25kcyB0byBmYW4xLCBwd20yIHRvCitmYW4yIGFuZCBwd20zIHRvIGZhbjMuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2h3bW9uL2l0ODcgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL2l0ODcKaW5kZXggMDQyYzA0MS4uNjU5MzE1ZCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9od21vbi9pdDg3CisrKyBiL0RvY3VtZW50YXRpb24vaHdtb24vaXQ4NwpAQCAtMjYsNiArMjYsMTAgQEAKICAgICBEYXRhc2hlZXQ6IFB1YmxpY2x5IGF2YWlsYWJsZSBhdCB0aGUgSVRFIHdlYnNpdGUKICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuaXRlLmNvbS50dy9wcm9kdWN0X2luZm8vZmlsZS9wYy9JVDg3MThGX1YwLjIuemlwCiAgICAgICAgICAgICAgICBodHRwOi8vd3d3Lml0ZS5jb20udHcvcHJvZHVjdF9pbmZvL2ZpbGUvcGMvSVQ4NzE4Rl9WMCUyMDNfKGZvciUyMEMlMjB2ZXJzaW9uKS56aXAKKyAgKiBJVDg3MjBGCisgICAgUHJlZml4OiAnaXQ4NzIwJworICAgIEFkZHJlc3NlcyBzY2FubmVkOiBmcm9tIFN1cGVyIEkvTyBjb25maWcgc3BhY2UgKDggSS9PIHBvcnRzKQorICAgIERhdGFzaGVldDogTm90IHlldCBwdWJsaWNseSBhdmFpbGFibGUuCiAgICogU2lTOTUwICAgW2Nsb25lIG9mIElUODcwNUZdCiAgICAgUHJlZml4OiAnaXQ4NycKICAgICBBZGRyZXNzZXMgc2Nhbm5lZDogZnJvbSBTdXBlciBJL08gY29uZmlnIHNwYWNlICg4IEkvTyBwb3J0cykKQEAgLTcxLDcgKzc1LDcgQEAKIC0tLS0tLS0tLS0tCiAKIFRoaXMgZHJpdmVyIGltcGxlbWVudHMgc3VwcG9ydCBmb3IgdGhlIElUODcwNUYsIElUODcxMkYsIElUODcxNkYsCi1JVDg3MThGLCBJVDg3MjZGIGFuZCBTaVM5NTAgY2hpcHMuCitJVDg3MThGLCBJVDg3MjBGLCBJVDg3MjZGIGFuZCBTaVM5NTAgY2hpcHMuCiAKIFRoZXNlIGNoaXBzIGFyZSAnU3VwZXIgSS9PIGNoaXBzJywgc3VwcG9ydGluZyBmbG9wcHkgZGlza3MsIGluZnJhcmVkIHBvcnRzLAogam95c3RpY2tzIGFuZCBvdGhlciBtaXNjZWxsYW5lb3VzIHN0dWZmLiBGb3IgaGFyZHdhcmUgbW9uaXRvcmluZywgdGhleQpAQCAtODQsMTkgKzg4LDE5IEBACiB0aG91Z2gsIHNvIHRoZSBmdW5jdGlvbmFsaXR5IG1heSBub3QgYmUgYXZhaWxhYmxlIG9uIGEgZ2l2ZW4gc3lzdGVtLgogVGhlIGRyaXZlciBkdW1ibHkgYXNzdW1lIGl0IGlzIHRoZXJlLgogCi1UaGUgSVQ4NzE4RiBhbHNvIGZlYXR1cmVzIFZJRCBpbnB1dHMgKHVwIHRvIDggcGlucykgYnV0IHRoZSB2YWx1ZSBpcwotc3RvcmVkIGluIHRoZSBTdXBlci1JL08gY29uZmlndXJhdGlvbiBzcGFjZS4gRHVlIHRvIHRlY2huaWNhbCBsaW1pdGF0aW9ucywKK1RoZSBJVDg3MThGIGFuZCBJVDg3MjBGIGFsc28gZmVhdHVyZXMgVklEIGlucHV0cyAodXAgdG8gOCBwaW5zKSBidXQgdGhlIHZhbHVlCitpcyBzdG9yZWQgaW4gdGhlIFN1cGVyLUkvTyBjb25maWd1cmF0aW9uIHNwYWNlLiBEdWUgdG8gdGVjaG5pY2FsIGxpbWl0YXRpb25zLAogdGhpcyB2YWx1ZSBjYW4gY3VycmVudGx5IG9ubHkgYmUgcmVhZCBvbmNlIGF0IGluaXRpYWxpemF0aW9uIHRpbWUsIHNvCiB0aGUgZHJpdmVyIHdvbid0IG5vdGljZSBhbmQgcmVwb3J0IGNoYW5nZXMgaW4gdGhlIFZJRCB2YWx1ZS4gVGhlIHR3bwogdXBwZXIgVklEIGJpdHMgc2hhcmUgdGhlaXIgcGlucyB3aXRoIHZvbHRhZ2UgaW5wdXRzIChpbjUgYW5kIGluNikgc28geW91CiBjYW4ndCBoYXZlIGJvdGggb24gYSBnaXZlbiBib2FyZC4KIAotVGhlIElUODcxNkYsIElUODcxOEYgYW5kIGxhdGVyIElUODcxMkYgcmV2aXNpb25zIGhhdmUgc3VwcG9ydCBmb3IKK1RoZSBJVDg3MTZGLCBJVDg3MThGLCBJVDg3MjBGIGFuZCBsYXRlciBJVDg3MTJGIHJldmlzaW9ucyBoYXZlIHN1cHBvcnQgZm9yCiAyIGFkZGl0aW9uYWwgZmFucy4gVGhlIGFkZGl0aW9uYWwgZmFucyBhcmUgc3VwcG9ydGVkIGJ5IHRoZSBkcml2ZXIuCiAKLVRoZSBJVDg3MTZGIGFuZCBJVDg3MThGLCBhbmQgbGF0ZSBJVDg3MTJGIGFuZCBJVDg3MDVGIGFsc28gaGF2ZSBvcHRpb25hbAotMTYtYml0IHRhY2hvbWV0ZXIgY291bnRlcnMgZm9yIGZhbnMgMSB0byAzLiBUaGlzIGlzIGJldHRlciAobm8gbW9yZSBmYW4KLWNsb2NrIGRpdmlkZXIgbWVzcykgYnV0IG5vdCBjb21wYXRpYmxlIHdpdGggdGhlIG9sZGVyIGNoaXBzIGFuZAorVGhlIElUODcxNkYsIElUODcxOEYgYW5kIElUODcyMEYsIGFuZCBsYXRlIElUODcxMkYgYW5kIElUODcwNUYgYWxzbyBoYXZlCitvcHRpb25hbCAxNi1iaXQgdGFjaG9tZXRlciBjb3VudGVycyBmb3IgZmFucyAxIHRvIDMuIFRoaXMgaXMgYmV0dGVyIChubyBtb3JlCitmYW4gY2xvY2sgZGl2aWRlciBtZXNzKSBidXQgbm90IGNvbXBhdGlibGUgd2l0aCB0aGUgb2xkZXIgY2hpcHMgYW5kCiByZXZpc2lvbnMuIFRoZSAxNi1iaXQgdGFjaG9tZXRlciBtb2RlIGlzIGVuYWJsZWQgYnkgdGhlIGRyaXZlciB3aGVuIG9uZQogb2YgdGhlIGFib3ZlIGNoaXBzIGlzIGRldGVjdGVkLgogCkBAIC0xMjIsNyArMTI2LDcgQEAKIGlucHV0cyBjYW4gbWVhc3VyZSB2b2x0YWdlcyBiZXR3ZWVuIDAgYW5kIDQuMDggdm9sdHMsIHdpdGggYSByZXNvbHV0aW9uIG9mCiAwLjAxNiB2b2x0LiBUaGUgYmF0dGVyeSB2b2x0YWdlIGluOCBkb2VzIG5vdCBoYXZlIGxpbWl0IHJlZ2lzdGVycy4KIAotVGhlIFZJRCBsaW5lcyAoSVQ4NzEyRi9JVDg3MTZGL0lUODcxOEYpIGVuY29kZSB0aGUgY29yZSB2b2x0YWdlIHZhbHVlOgorVGhlIFZJRCBsaW5lcyAoSVQ4NzEyRi9JVDg3MTZGL0lUODcxOEYvSVQ4NzIwRikgZW5jb2RlIHRoZSBjb3JlIHZvbHRhZ2UgdmFsdWU6CiB0aGUgdm9sdGFnZSBsZXZlbCB5b3VyIHByb2Nlc3NvciBzaG91bGQgd29yayB3aXRoLiBUaGlzIGlzIGhhcmRjb2RlZCBieQogdGhlIG1haW5ib2FyZCBhbmQvb3IgcHJvY2Vzc29yIGl0c2VsZi4gSXQgaXMgYSB2YWx1ZSBpbiB2b2x0cy4KIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9od21vbi9saXMzbHYwMmQgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL2xpczNsdjAyZAppbmRleCA2NWRmYjBjLi4wZmNmYzRhIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2h3bW9uL2xpczNsdjAyZAorKysgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL2xpczNsdjAyZApAQCAtMTMsMTggKzEzLDIxIEBACiBEZXNjcmlwdGlvbgogLS0tLS0tLS0tLS0KIAotVGhpcyBkcml2ZXIgcHJvdmlkZXMgc3VwcG9ydCBmb3IgdGhlIGFjY2VsZXJvbWV0ZXIgZm91bmQgaW4gdmFyaW91cyBIUCBsYXB0b3BzCi1zcG9ydGluZyB0aGUgZmVhdHVyZSBvZmZpY2lhbGx5IGNhbGxlZCAiSFAgTW9iaWxlIERhdGEgUHJvdGVjdGlvbiBTeXN0ZW0gM0QiIG9yCi0iSFAgM0QgRHJpdmVHdWFyZCIuIEl0IGRldGVjdCBhdXRvbWF0aWNhbGx5IGxhcHRvcHMgd2l0aCB0aGlzIHNlbnNvci4gS25vd24gbW9kZWxzCi0oZm9yIG5vdyB0aGUgSFAgMjEzMywgbmM2NDIwLCBuYzI1MTAsIG5jODUxMCwgbmM4NHgwLCBudzk0NDAgYW5kIG54OTQyMCkgd2lsbAotaGF2ZSB0aGVpciBheGlzIGF1dG9tYXRpY2FsbHkgb3JpZW50ZWQgb24gc3RhbmRhcmQgd2F5IChlZzogeW91IGNhbiBkaXJlY3RseQotcGxheSBuZXZlcmJhbGwpLiAgVGhlIGFjY2VsZXJvbWV0ZXIgZGF0YSBpcyByZWFkYWJsZSB2aWEKK1RoaXMgZHJpdmVyIHByb3ZpZGVzIHN1cHBvcnQgZm9yIHRoZSBhY2NlbGVyb21ldGVyIGZvdW5kIGluIHZhcmlvdXMgSFAKK2xhcHRvcHMgc3BvcnRpbmcgdGhlIGZlYXR1cmUgb2ZmaWNpYWxseSBjYWxsZWQgIkhQIE1vYmlsZSBEYXRhCitQcm90ZWN0aW9uIFN5c3RlbSAzRCIgb3IgIkhQIDNEIERyaXZlR3VhcmQiLiBJdCBkZXRlY3QgYXV0b21hdGljYWxseQorbGFwdG9wcyB3aXRoIHRoaXMgc2Vuc29yLiBLbm93biBtb2RlbHMgKGZvciBub3cgdGhlIEhQIDIxMzMsIG5jNjQyMCwKK25jMjUxMCwgbmM4NTEwLCBuYzg0eDAsIG53OTQ0MCBhbmQgbng5NDIwKSB3aWxsIGhhdmUgdGhlaXIgYXhpcworYXV0b21hdGljYWxseSBvcmllbnRlZCBvbiBzdGFuZGFyZCB3YXkgKGVnOiB5b3UgY2FuIGRpcmVjdGx5IHBsYXkKK25ldmVyYmFsbCkuICBUaGUgYWNjZWxlcm9tZXRlciBkYXRhIGlzIHJlYWRhYmxlIHZpYQogL3N5cy9kZXZpY2VzL3BsYXRmb3JtL2xpczNsdjAyZC4KIAogU3lzZnMgYXR0cmlidXRlcyB1bmRlciAvc3lzL2RldmljZXMvcGxhdGZvcm0vbGlzM2x2MDJkLzoKIHBvc2l0aW9uIC0gM0QgcG9zaXRpb24gdGhhdCB0aGUgYWNjZWxlcm9tZXRlciByZXBvcnRzLiBGb3JtYXQ6ICIoeCx5LHopIgotY2FsaWJyYXRlIC0gcmVhZDogdmFsdWVzICh4LCB5LCB6KSB0aGF0IGFyZSB1c2VkIGFzIHRoZSBiYXNlIGZvciBpbnB1dCBjbGFzcyBkZXZpY2Ugb3BlcmF0aW9uLgotICAgICAgICAgICAgd3JpdGU6IGZvcmNlcyB0aGUgYmFzZSB0byBiZSByZWNhbGlicmF0ZWQgd2l0aCB0aGUgY3VycmVudCBwb3NpdGlvbi4KK2NhbGlicmF0ZSAtIHJlYWQ6IHZhbHVlcyAoeCwgeSwgeikgdGhhdCBhcmUgdXNlZCBhcyB0aGUgYmFzZSBmb3IgaW5wdXQKKwkJICBjbGFzcyBkZXZpY2Ugb3BlcmF0aW9uLgorICAgICAgICAgICAgd3JpdGU6IGZvcmNlcyB0aGUgYmFzZSB0byBiZSByZWNhbGlicmF0ZWQgd2l0aCB0aGUgY3VycmVudAorCQkgIHBvc2l0aW9uLgogcmF0ZSAtIHJlcG9ydHMgdGhlIHNhbXBsaW5nIHJhdGUgb2YgdGhlIGFjY2VsZXJvbWV0ZXIgZGV2aWNlIGluIEhaCiAKIFRoaXMgZHJpdmVyIGFsc28gcHJvdmlkZXMgYW4gYWJzb2x1dGUgaW5wdXQgY2xhc3MgZGV2aWNlLCBhbGxvd2luZwpAQCAtMzksMTEgKzQyLDEyIEBACiAgKiBXaGVuIHRoZSBsYXB0b3AgaXMgaG9yaXpvbnRhbCB0aGUgcG9zaXRpb24gcmVwb3J0ZWQgaXMgYWJvdXQgMCBmb3IgWCBhbmQgWQogYW5kIGEgcG9zaXRpdmUgdmFsdWUgZm9yIFoKICAqIElmIHRoZSBsZWZ0IHNpZGUgaXMgZWxldmF0ZWQsIFggaW5jcmVhc2VzIChiZWNvbWVzIHBvc2l0aXZlKQotICogSWYgdGhlIGZyb250IHNpZGUgKHdoZXJlIHRoZSB0b3VjaHBhZCBpcykgaXMgZWxldmF0ZWQsIFkgZGVjcmVhc2VzIChiZWNvbWVzIG5lZ2F0aXZlKQorICogSWYgdGhlIGZyb250IHNpZGUgKHdoZXJlIHRoZSB0b3VjaHBhZCBpcykgaXMgZWxldmF0ZWQsIFkgZGVjcmVhc2VzCisJKGJlY29tZXMgbmVnYXRpdmUpCiAgKiBJZiB0aGUgbGFwdG9wIGlzIHB1dCB1cHNpZGUtZG93biwgWiBiZWNvbWVzIG5lZ2F0aXZlCiAKLUlmIHlvdXIgbGFwdG9wIG1vZGVsIGlzIG5vdCByZWNvZ25pemVkIChjZiAiZG1lc2ciKSwgeW91IGNhbiBzZW5kIGFuIGVtYWlsIHRvIHRoZQotYXV0aG9ycyB0byBhZGQgaXQgdG8gdGhlIGRhdGFiYXNlLiAgV2hlbiByZXBvcnRpbmcgYSBuZXcgbGFwdG9wLCBwbGVhc2UgaW5jbHVkZQotdGhlIG91dHB1dCBvZiAiZG1pZGVjb2RlIiBwbHVzIHRoZSB2YWx1ZSBvZiAvc3lzL2RldmljZXMvcGxhdGZvcm0vbGlzM2x2MDJkL3Bvc2l0aW9uCi1pbiB0aGVzZSBmb3VyIGNhc2VzLgorSWYgeW91ciBsYXB0b3AgbW9kZWwgaXMgbm90IHJlY29nbml6ZWQgKGNmICJkbWVzZyIpLCB5b3UgY2FuIHNlbmQgYW4KK2VtYWlsIHRvIHRoZSBhdXRob3JzIHRvIGFkZCBpdCB0byB0aGUgZGF0YWJhc2UuICBXaGVuIHJlcG9ydGluZyBhIG5ldworbGFwdG9wLCBwbGVhc2UgaW5jbHVkZSB0aGUgb3V0cHV0IG9mICJkbWlkZWNvZGUiIHBsdXMgdGhlIHZhbHVlIG9mCisvc3lzL2RldmljZXMvcGxhdGZvcm0vbGlzM2x2MDJkL3Bvc2l0aW9uIGluIHRoZXNlIGZvdXIgY2FzZXMuCiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaHdtb24vbG03MCBiL0RvY3VtZW50YXRpb24vaHdtb24vbG03MAppbmRleCAyYmRkM2ZlLi4wZDI0MDI5IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2h3bW9uL2xtNzAKKysrIGIvRG9jdW1lbnRhdGlvbi9od21vbi9sbTcwCkBAIC0xLDkgKzEsMTEgQEAKIEtlcm5lbCBkcml2ZXIgbG03MAogPT09PT09PT09PT09PT09PT09CiAKLVN1cHBvcnRlZCBjaGlwOgorU3VwcG9ydGVkIGNoaXBzOgogICAqIE5hdGlvbmFsIFNlbWljb25kdWN0b3IgTE03MAogICAgIERhdGFzaGVldDogaHR0cDovL3d3dy5uYXRpb25hbC5jb20vcGYvTE0vTE03MC5odG1sCisgICogVGV4YXMgSW5zdHJ1bWVudHMgVE1QMTIxL1RNUDEyMworICAgIEluZm9ybWF0aW9uOiBodHRwOi8vZm9jdXMudGkuY29tL2RvY3MvcHJvZC9mb2xkZXJzL3ByaW50L3RtcDEyMS5odG1sCiAKIEF1dGhvcjoKICAgICAgICAgS2Fpd2FuIE4gQmlsbGltb3JpYSA8a2Fpd2FuQGRlc2lnbmVyZ3JhcGhpeC5jb20+CkBAIC0yNSw2ICsyNywxNCBAQAogZHJpdmVyIGZvciBpbnRlcnByZXRhdGlvbi4gVGhpcyBkcml2ZXIgbWFrZXMgdXNlIG9mIHRoZSBrZXJuZWwncyBpbi1jb3JlCiBTUEkgc3VwcG9ydC4KIAorQXMgYSByZWFsIChpbi10cmVlKSBleGFtcGxlIG9mIHRoaXMgIlNQSSBwcm90b2NvbCBkcml2ZXIiIGludGVyZmFjaW5nCit3aXRoIGEgIlNQSSBtYXN0ZXIgY29udHJvbGxlciBkcml2ZXIiLCBzZWUgZHJpdmVycy9zcGkvc3BpX2xtNzBsbHAuYworYW5kIGl0cyBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24uCisKK1RoZSBUTVAxMjEvVE1QMTIzIGFyZSB2ZXJ5IHNpbWlsYXI7IG1haW4gZGlmZmVyZW5jZXMgYXJlIDQgd2lyZSBTUEkgaW50ZXItCitmYWNlIChyZWFkIG9ubHkpIGFuZCAxMy1iaXQgdGVtcGVyYXR1cmUgZGF0YSAoMC4wNjI1IGRlZ3JlZXMgY2Vsc2l1cyByZXNvLQorbHV0aW9uKS4KKwogVGhhbmtzIHRvCiAtLS0tLS0tLS0KIEplYW4gRGVsdmFyZSA8a2hhbGlAbGludXgtZnIub3JnPiBmb3IgbWVudG9yaW5nIHRoZSBod21vbi1zaWRlIGRyaXZlcgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9od21vbi9sbTg1IGIvRG9jdW1lbnRhdGlvbi9od21vbi9sbTg1CmluZGV4IDQwMDYyMDcuLmExMzY4MDggMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vaHdtb24vbG04NQorKysgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL2xtODUKQEAgLTE2NCw3ICsxNjQsNyBAQAogICAgICAgICAgICAgICAgICAgICAgIHRlbXBlcmF0dXJlLiAoUFdNIHZhbHVlIGZyb20gMCB0byAyNTUpCiAKICogcHdtI19hdXRvX3B3bV9taW5jdGwgLSB0aGlzIGZsYWdzIHNlbGVjdHMgZm9yIHRlbXAjX2F1dG9fdGVtcF9vZmYgdGVtcGVyYXR1cmUKLSAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgYmFoYXZpb3VyIG9mIGZhbnMuIFdyaXRlIDEgdG8gbGV0IGZhbnMgc3Bpbm5pbmcgYXQKKyAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgYmVoYXZpb3VyIG9mIGZhbnMuIFdyaXRlIDEgdG8gbGV0IGZhbnMgc3Bpbm5pbmcgYXQKIAkJCSBwd20jX2F1dG9fcHdtX21pbiBvciB3cml0ZSAwIHRvIGxldCB0aGVtIG9mZi4KIAogTk9URTogSXQgaGFzIGJlZW4gcmVwb3J0ZWQgdGhhdCB0aGVyZSBpcyBhIGJ1ZyBpbiB0aGUgTE04NSB0aGF0IGNhdXNlcyB0aGUgZmxhZwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9od21vbi9sdGM0MjQ1IGIvRG9jdW1lbnRhdGlvbi9od21vbi9sdGM0MjQ1Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhZTdhM2EKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL2x0YzQyNDUKQEAgLTAsMCArMSw4MSBAQAorS2VybmVsIGRyaXZlciBsdGM0MjQ1Cis9PT09PT09PT09PT09PT09PT09PT0KKworU3VwcG9ydGVkIGNoaXBzOgorICAqIExpbmVhciBUZWNobm9sb2d5IExUQzQyNDUKKyAgICBQcmVmaXg6ICdsdGM0MjQ1JworICAgIEFkZHJlc3NlcyBzY2FubmVkOiAweDIwLTB4M2YKKyAgICBEYXRhc2hlZXQ6CisgICAgICAgIGh0dHA6Ly93d3cubGluZWFyLmNvbS9wYy9kb3dubG9hZERvY3VtZW50LmRvP25hdklkPUgwLEMxLEMxMDAzLEMxMDA2LEMxMTQwLFAxOTM5MixEMTM1MTcKKworQXV0aG9yOiBJcmEgVy4gU255ZGVyIDxpd3NAb3Zyby5jYWx0ZWNoLmVkdT4KKworCitEZXNjcmlwdGlvbgorLS0tLS0tLS0tLS0KKworVGhlIExUQzQyNDUgY29udHJvbGxlciBhbGxvd3MgYSBib2FyZCB0byBiZSBzYWZlbHkgaW5zZXJ0ZWQgYW5kIHJlbW92ZWQKK2Zyb20gYSBsaXZlIGJhY2twbGFuZSBpbiBtdWx0aXBsZSBzdXBwbHkgc3lzdGVtcyBzdWNoIGFzIENvbXBhY3RQQ0kgYW5kCitQQ0kgRXhwcmVzcy4KKworCitVc2FnZSBOb3RlcworLS0tLS0tLS0tLS0KKworVGhpcyBkcml2ZXIgZG9lcyBub3QgcHJvYmUgZm9yIExUQzQyNDUgZGV2aWNlcywgZHVlIHRvIHRoZSBmYWN0IHRoYXQgc29tZQorb2YgdGhlIHBvc3NpYmxlIGFkZHJlc3NlcyBhcmUgdW5mcmllbmRseSB0byBwcm9iaW5nLiBZb3Ugd2lsbCBuZWVkIHRvIHVzZQordGhlICJmb3JjZSIgcGFyYW1ldGVyIHRvIHRlbGwgdGhlIGRyaXZlciB3aGVyZSB0byBmaW5kIHRoZSBkZXZpY2UuCisKK0V4YW1wbGU6IHRoZSBmb2xsb3dpbmcgd2lsbCBsb2FkIHRoZSBkcml2ZXIgZm9yIGFuIExUQzQyNDUgYXQgYWRkcmVzcyAweDIzCitvbiBJMkMgYnVzICMxOgorJCBtb2Rwcm9iZSBsdGM0MjQ1IGZvcmNlPTEsMHgyMworCisKK1N5c2ZzIGVudHJpZXMKKy0tLS0tLS0tLS0tLS0KKworVGhlIExUQzQyNDUgaGFzIGJ1aWx0LWluIGxpbWl0cyBmb3Igb3ZlciBhbmQgdW5kZXIgY3VycmVudCB3YXJuaW5ncy4gVGhpcworbWFrZXMgaXQgdmVyeSBsaWtlbHkgdGhhdCB0aGUgcmVmZXJlbmNlIGNpcmN1aXQgd2lsbCBiZSB1c2VkLgorCitUaGlzIGRyaXZlciB1c2VzIHRoZSB2YWx1ZXMgaW4gdGhlIGRhdGFzaGVldCB0byBjaGFuZ2UgdGhlIHJlZ2lzdGVyIHZhbHVlcworaW50byB0aGUgdmFsdWVzIHNwZWNpZmllZCBpbiB0aGUgc3lzZnMtaW50ZXJmYWNlIGRvY3VtZW50LiBUaGUgY3VycmVudCByZWFkaW5ncworcmVseSBvbiB0aGUgc2Vuc2UgcmVzaXN0b3JzIGxpc3RlZCBpbiBUYWJsZSAyOiAiU2Vuc2UgUmVzaXN0b3IgVmFsdWVzIi4KKworaW4xX2lucHV0CQkxMnYgaW5wdXQgdm9sdGFnZSAobVYpCitpbjJfaW5wdXQJCTV2ICBpbnB1dCB2b2x0YWdlIChtVikKK2luM19pbnB1dAkJM3YgIGlucHV0IHZvbHRhZ2UgKG1WKQoraW40X2lucHV0CQlWZWUgKC0xMnYpIGlucHV0IHZvbHRhZ2UgKG1WKQorCitpbjFfbWluX2FsYXJtCQkxMnYgaW5wdXQgdW5kZXJ2b2x0YWdlIGFsYXJtCitpbjJfbWluX2FsYXJtCQk1diAgaW5wdXQgdW5kZXJ2b2x0YWdlIGFsYXJtCitpbjNfbWluX2FsYXJtCQkzdiAgaW5wdXQgdW5kZXJ2b2x0YWdlIGFsYXJtCitpbjRfbWluX2FsYXJtCQlWZWUgKC0xMnYpIGlucHV0IHVuZGVydm9sdGFnZSBhbGFybQorCitjdXJyMV9pbnB1dAkJMTJ2IGN1cnJlbnQgKG1BKQorY3VycjJfaW5wdXQJCTV2ICBjdXJyZW50IChtQSkKK2N1cnIzX2lucHV0CQkzdiAgY3VycmVudCAobUEpCitjdXJyNF9pbnB1dAkJVmVlICgtMTJ2KSBjdXJyZW50IChtQSkKKworY3VycjFfbWF4X2FsYXJtCQkxMnYgb3ZlcmN1cnJlbnQgYWxhcm0KK2N1cnIyX21heF9hbGFybQkJNXYgIG92ZXJjdXJyZW50IGFsYXJtCitjdXJyM19tYXhfYWxhcm0JCTN2ICBvdmVyY3VycmVudCBhbGFybQorY3VycjRfbWF4X2FsYXJtCQlWZWUgKC0xMnYpIG92ZXJjdXJyZW50IGFsYXJtCisKK2luNV9pbnB1dAkJMTJ2IG91dHB1dCB2b2x0YWdlIChtVikKK2luNl9pbnB1dAkJNXYgIG91dHB1dCB2b2x0YWdlIChtVikKK2luN19pbnB1dAkJM3YgIG91dHB1dCB2b2x0YWdlIChtVikKK2luOF9pbnB1dAkJVmVlICgtMTJ2KSBvdXRwdXQgdm9sdGFnZSAobVYpCisKK2luNV9taW5fYWxhcm0JCTEydiBvdXRwdXQgdW5kZXJ2b2x0YWdlIGFsYXJtCitpbjZfbWluX2FsYXJtCQk1diAgb3V0cHV0IHVuZGVydm9sdGFnZSBhbGFybQoraW43X21pbl9hbGFybQkJM3YgIG91dHB1dCB1bmRlcnZvbHRhZ2UgYWxhcm0KK2luOF9taW5fYWxhcm0JCVZlZSAoLTEydikgb3V0cHV0IHVuZGVydm9sdGFnZSBhbGFybQorCitpbjlfaW5wdXQJCUdQSU8gIzEgdm9sdGFnZSBkYXRhCitpbjEwX2lucHV0CQlHUElPICMyIHZvbHRhZ2UgZGF0YQoraW4xMV9pbnB1dAkJR1BJTyAjMyB2b2x0YWdlIGRhdGEKKworcG93ZXIxX2lucHV0CQkxMnYgcG93ZXIgdXNhZ2UgKG1XKQorcG93ZXIyX2lucHV0CQk1diAgcG93ZXIgdXNhZ2UgKG1XKQorcG93ZXIzX2lucHV0CQkzdiAgcG93ZXIgdXNhZ2UgKG1XKQorcG93ZXI0X2lucHV0CQlWZWUgKC0xMnYpIHBvd2VyIHVzYWdlIChtVykKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24va2J1aWxkL2tidWlsZC50eHQgYi9Eb2N1bWVudGF0aW9uL2tidWlsZC9rYnVpbGQudHh0CmluZGV4IDUxNzcxODQuLjkyM2Y5ZGQgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24va2J1aWxkL2tidWlsZC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9rYnVpbGQva2J1aWxkLnR4dApAQCAtMTI0LDMgKzEyNCwxMCBAQAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIEZvciBtb2R1bGVzIHVzZSBzeW1ib2xzIGZyb20gYW5vdGhlciBtb2R1bGVzLgogU2VlIG1vcmUgZGV0YWlscyBpbiBtb2R1bGVzLnR4dC4KKworQUxMU09VUkNFX0FSQ0hTCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRm9yIHRhZ3MvVEFHUy9jc2NvcGUgdGFyZ2V0cywgeW91IGNhbiBzcGVjaWZ5IG1vcmUgdGhhbiBvbmUgYXJjaHMKK3RvIGJlIGluY2x1ZGVkIGluIHRoZSBkYXRhYmFzZXMsIHNlcGFyYXRlZCBieSBibGFua3NwYWNlLiBlLmcuCisKKyAgICAkIG1ha2UgQUxMU09VUkNFX0FSQ0hTPSJ4ODYgbWlwcyBhcm0iIHRhZ3MKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24va2J1aWxkL21vZHVsZXMudHh0IGIvRG9jdW1lbnRhdGlvbi9rYnVpbGQvbW9kdWxlcy50eHQKaW5kZXggMTgyMWMwNy4uYjEwOTZkYSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9rYnVpbGQvbW9kdWxlcy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9rYnVpbGQvbW9kdWxlcy50eHQKQEAgLTI1Myw3ICsyNTMsNyBAQAogCiAJCSMgTW9kdWxlIHNwZWNpZmljIHRhcmdldHMKIAkJZ2VuYmluOgotCQkJZWNobyAiWCIgPiA4MTIzX2Jpbl9zaGlwcGVkCisJCQllY2hvICJYIiA+IDgxMjNfYmluLm9fc2hpcHBlZAogCiAKIAlJbiBleGFtcGxlIDIsIHdlIGFyZSBkb3duIHRvIHR3byBmYWlybHkgc2ltcGxlIGZpbGVzIGFuZCBmb3Igc2ltcGxlCkBAIC0yNzksNyArMjc5LDcgQEAKIAogCQkjIE1vZHVsZSBzcGVjaWZpYyB0YXJnZXRzCiAJCWdlbmJpbjoKLQkJCWVjaG8gIlgiID4gODEyM19iaW5fc2hpcHBlZAorCQkJZWNobyAiWCIgPiA4MTIzX2Jpbi5vX3NoaXBwZWQKIAogCQllbmRpZgogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2tlcm5lbC1wYXJhbWV0ZXJzLnR4dCBiL0RvY3VtZW50YXRpb24va2VybmVsLXBhcmFtZXRlcnMudHh0CmluZGV4IDBiM2Y2NzEuLjg1MTFkMzUgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24va2VybmVsLXBhcmFtZXRlcnMudHh0CisrKyBiL0RvY3VtZW50YXRpb24va2VybmVsLXBhcmFtZXRlcnMudHh0CkBAIC05MSw2ICs5MSw3IEBACiAJU1VTUEVORAlTeXN0ZW0gc3VzcGVuZCBzdGF0ZXMgYXJlIGVuYWJsZWQuCiAJRlRSQUNFCUZ1bmN0aW9uIHRyYWNpbmcgZW5hYmxlZC4KIAlUUwlBcHByb3ByaWF0ZSB0b3VjaHNjcmVlbiBzdXBwb3J0IGlzIGVuYWJsZWQuCisJVU1TCVVTQiBNYXNzIFN0b3JhZ2Ugc3VwcG9ydCBpcyBlbmFibGVkLgogCVVTQglVU0Igc3VwcG9ydCBpcyBlbmFibGVkLgogCVVTQkhJRAlVU0IgSHVtYW4gSW50ZXJmYWNlIERldmljZSBzdXBwb3J0IGlzIGVuYWJsZWQuCiAJVjRMCVZpZGVvIEZvciBMaW51eCBzdXBwb3J0IGlzIGVuYWJsZWQuCkBAIC0xNDAsNiArMTQxLDcgQEAKIAkJCWh0IC0tIHJ1biBvbmx5IGVub3VnaCBBQ1BJIHRvIGVuYWJsZSBIeXBlciBUaHJlYWRpbmcKIAkJCXN0cmljdCAtLSBCZSBsZXNzIHRvbGVyYW50IG9mIHBsYXRmb3JtcyB0aGF0IGFyZSBub3QKIAkJCQlzdHJpY3RseSBBQ1BJIHNwZWNpZmljYXRpb24gY29tcGxpYW50LgorCQkJcnNkdCAtLSBwcmVmZXIgUlNEVCBvdmVyIChkZWZhdWx0KSBYU0RUCiAKIAkJCVNlZSBhbHNvIERvY3VtZW50YXRpb24vcG93ZXIvcG0udHh0LCBwY2k9bm9hY3BpCiAKQEAgLTE1MCwxNiArMTUyLDIwIEBACiAJCQlkZWZhdWx0OiAwCiAKIAlhY3BpX3NsZWVwPQlbSFcsQUNQSV0gU2xlZXAgb3B0aW9ucwotCQkJRm9ybWF0OiB7IHMzX2Jpb3MsIHMzX21vZGUsIHMzX2JlZXAsIHM0X25vaHdzaWcsIG9sZF9vcmRlcmluZyB9Ci0JCQlTZWUgRG9jdW1lbnRhdGlvbi9wb3dlci92aWRlby50eHQgZm9yIHMzX2Jpb3MgYW5kIHMzX21vZGUuCisJCQlGb3JtYXQ6IHsgczNfYmlvcywgczNfbW9kZSwgczNfYmVlcCwgczRfbm9od3NpZywKKwkJCQkgIG9sZF9vcmRlcmluZywgczRfbm9udnMgfQorCQkJU2VlIERvY3VtZW50YXRpb24vcG93ZXIvdmlkZW8udHh0IGZvciBpbmZvcm1hdGlvbiBvbgorCQkJczNfYmlvcyBhbmQgczNfbW9kZS4KIAkJCXMzX2JlZXAgaXMgZm9yIGRlYnVnZ2luZzsgaXQgbWFrZXMgdGhlIFBDJ3Mgc3BlYWtlciBiZWVwCiAJCQlhcyBzb29uIGFzIHRoZSBrZXJuZWwncyByZWFsLW1vZGUgZW50cnkgcG9pbnQgaXMgY2FsbGVkLgogCQkJczRfbm9od3NpZyBwcmV2ZW50cyBBQ1BJIGhhcmR3YXJlIHNpZ25hdHVyZSBmcm9tIGJlaW5nCiAJCQl1c2VkIGR1cmluZyByZXN1bWUgZnJvbSBoaWJlcm5hdGlvbi4KIAkJCW9sZF9vcmRlcmluZyBjYXVzZXMgdGhlIEFDUEkgMS4wIG9yZGVyaW5nIG9mIHRoZSBfUFRTCi0JCQljb250cm9sIG1ldGhvZCwgd3J0IHB1dHRpbmcgZGV2aWNlcyBpbnRvIGxvdyBwb3dlcgotCQkJc3RhdGVzLCB0byBiZSBlbmZvcmNlZCAodGhlIEFDUEkgMi4wIG9yZGVyaW5nIG9mIF9QVFMgaXMKLQkJCXVzZWQgYnkgZGVmYXVsdCkuCisJCQljb250cm9sIG1ldGhvZCwgd2l0aCByZXNwZWN0IHRvIHB1dHRpbmcgZGV2aWNlcyBpbnRvCisJCQlsb3cgcG93ZXIgc3RhdGVzLCB0byBiZSBlbmZvcmNlZCAodGhlIEFDUEkgMi4wIG9yZGVyaW5nCisJCQlvZiBfUFRTIGlzIHVzZWQgYnkgZGVmYXVsdCkuCisJCQlzNF9ub252cyBwcmV2ZW50cyB0aGUga2VybmVsIGZyb20gc2F2aW5nL3Jlc3RvcmluZyB0aGUKKwkJCUFDUEkgTlZTIG1lbW9yeSBkdXJpbmcgaGliZXJuYXRpb24uCiAKIAlhY3BpX3NjaT0JW0hXLEFDUEldIEFDUEkgU3lzdGVtIENvbnRyb2wgSW50ZXJydXB0IHRyaWdnZXIgbW9kZQogCQkJRm9ybWF0OiB7IGxldmVsIHwgZWRnZSB8IGhpZ2ggfCBsb3cgfQpAQCAtMTk0LDcgKzIwMCw3IEBACiAJYWNwaV9za2lwX3RpbWVyX292ZXJyaWRlIFtIVyxBQ1BJXQogCQkJUmVjb2duaXplIGFuZCBpZ25vcmUgSVJRMC9waW4yIEludGVycnVwdCBPdmVycmlkZS4KIAkJCUZvciBicm9rZW4gbkZvcmNlMiBCSU9TIHJlc3VsdGluZyBpbiBYVC1QSUMgdGltZXIuCi0JYWNwaV91c2VfdGltZXJfb3ZlcnJpZGUgW0hXLEFDUEl9CisJYWNwaV91c2VfdGltZXJfb3ZlcnJpZGUgW0hXLEFDUEldCiAJCQlVc2UgdGltZXIgb3ZlcnJpZGUuIEZvciBzb21lIGJyb2tlbiBOdmlkaWEgTkY1IGJvYXJkcwogCQkJdGhhdCByZXF1aXJlIGEgdGltZXIgb3ZlcnJpZGUsIGJ1dCBkb24ndCBoYXZlCiAJCQlIUEVUCkBAIC04MjgsOCArODM0LDggQEAKIAogCWhsdAkJW0JVR1M9QVJNLFNIXQogCi0JaHZjX2l1Y3Y9CVtTMzkwXSBOdW1iZXIgb2Ygei9WTSBJVUNWIEh5cGVydmlzb3IgY29uc29sZSAoSFZDKQotCQkJICAgICAgIGJhY2stZW5kcy4gVmFsaWQgcGFyYW1ldGVyczogMC4uOAorCWh2Y19pdWN2PQlbUzM5MF0gTnVtYmVyIG9mIHovVk0gSVVDViBoeXBlcnZpc29yIGNvbnNvbGUgKEhWQykKKwkJCSAgICAgICB0ZXJtaW5hbCBkZXZpY2VzLiBWYWxpZCB2YWx1ZXM6IDAuLjgKIAogCWk4MDQyLmRlYnVnCVtIV10gVG9nZ2xlIGk4MDQyIGRlYnVnIG1vZGUKIAlpODA0Mi5kaXJlY3QJW0hXXSBQdXQga2V5Ym9hcmQgcG9ydCBpbnRvIG5vbi10cmFuc2xhdGVkIG1vZGUKQEAgLTg3NywxNyArODgzLDE5IEBACiAJCQlTZWUgRG9jdW1lbnRhdGlvbi9pZGUvaWRlLnR4dC4KIAogCWlkbGU9CQlbWDg2XQotCQkJRm9ybWF0OiBpZGxlPXBvbGwgb3IgaWRsZT1td2FpdCwgaWRsZT1oYWx0LCBpZGxlPW5vbXdhaXQKLQkJCVBvbGwgZm9yY2VzIGEgcG9sbGluZyBpZGxlIGxvb3AgdGhhdCBjYW4gc2xpZ2h0bHkgaW1wcm92ZXMgdGhlIHBlcmZvcm1hbmNlCi0JCQlvZiB3YWtpbmcgdXAgYSBpZGxlIENQVSwgYnV0IHdpbGwgdXNlIGEgbG90IG9mIHBvd2VyIGFuZCBtYWtlIHRoZSBzeXN0ZW0KLQkJCXJ1biBob3QuIE5vdCByZWNvbW1lbmRlZC4KLQkJCWlkbGU9bXdhaXQuIE9uIHN5c3RlbXMgd2hpY2ggc3VwcG9ydCBNT05JVE9SL01XQUlUIGJ1dCB0aGUga2VybmVsIGNob3NlCi0JCQl0byBub3QgdXNlIGl0IGJlY2F1c2UgaXQgZG9lc24ndCBzYXZlIGFzIG11Y2ggcG93ZXIgYXMgYSBub3JtYWwgaWRsZQotCQkJbG9vcCB1c2UgdGhlIE1PTklUT1IvTVdBSVQgaWRsZSBsb29wIGFueXdheXMuIFBlcmZvcm1hbmNlIHNob3VsZCBiZSB0aGUgc2FtZQotCQkJYXMgaWRsZT1wb2xsLgotCQkJaWRsZT1oYWx0LiBIYWx0IGlzIGZvcmNlZCB0byBiZSB1c2VkIGZvciBDUFUgaWRsZS4KKwkJCUZvcm1hdDogaWRsZT1wb2xsLCBpZGxlPW13YWl0LCBpZGxlPWhhbHQsIGlkbGU9bm9td2FpdAorCQkJUG9sbCBmb3JjZXMgYSBwb2xsaW5nIGlkbGUgbG9vcCB0aGF0IGNhbiBzbGlnaHRseQorCQkJaW1wcm92ZSB0aGUgcGVyZm9ybWFuY2Ugb2Ygd2FraW5nIHVwIGEgaWRsZSBDUFUsIGJ1dAorCQkJd2lsbCB1c2UgYSBsb3Qgb2YgcG93ZXIgYW5kIG1ha2UgdGhlIHN5c3RlbSBydW4gaG90LgorCQkJTm90IHJlY29tbWVuZGVkLgorCQkJaWRsZT1td2FpdDogT24gc3lzdGVtcyB3aGljaCBzdXBwb3J0IE1PTklUT1IvTVdBSVQgYnV0CisJCQl0aGUga2VybmVsIGNob3NlIHRvIG5vdCB1c2UgaXQgYmVjYXVzZSBpdCBkb2Vzbid0IHNhdmUKKwkJCWFzIG11Y2ggcG93ZXIgYXMgYSBub3JtYWwgaWRsZSBsb29wLCB1c2UgdGhlCisJCQlNT05JVE9SL01XQUlUIGlkbGUgbG9vcCBhbnl3YXlzLiBQZXJmb3JtYW5jZSBzaG91bGQgYmUKKwkJCXRoZSBzYW1lIGFzIGlkbGU9cG9sbC4KKwkJCWlkbGU9aGFsdDogSGFsdCBpcyBmb3JjZWQgdG8gYmUgdXNlZCBmb3IgQ1BVIGlkbGUuCiAJCQlJbiBzdWNoIGNhc2UgQzIvQzMgd29uJ3QgYmUgdXNlZCBhZ2Fpbi4KLQkJCWlkbGU9bm9td2FpdC4gRGlzYWJsZSBtd2FpdCBmb3IgQ1BVIEMtc3RhdGVzCisJCQlpZGxlPW5vbXdhaXQ6IERpc2FibGUgbXdhaXQgZm9yIENQVSBDLXN0YXRlcwogCiAJaWRlLXBjaS1nZW5lcmljLmFsbC1nZW5lcmljLWlkZSBbSFddIChFKUlERSBzdWJzeXN0ZW0KIAkJCUNsYWltIGFsbCB1bmtub3duIFBDSSBJREUgc3RvcmFnZSBjb250cm9sbGVycy4KQEAgLTkxOCw2ICs5MjYsMTAgQEAKIAogCWludHRlc3Q9CVtJQTY0XQogCisJaW9tZW09CQlEaXNhYmxlIHN0cmljdCBjaGVja2luZyBvZiBhY2Nlc3MgdG8gTU1JTyBtZW1vcnkKKwkJc3RyaWN0CXJlZ2lvbnMgZnJvbSB1c2Vyc3BhY2UuCisJCXJlbGF4ZWQKKwogCWlvbW11PQkJW3g4Nl0KIAkJb2ZmCiAJCWZvcmNlCkBAIC0xMDY5LDggKzEwODEsOCBAQAogCWxhcGljCQlbWDg2LTMyLEFQSUNdIEVuYWJsZSB0aGUgbG9jYWwgQVBJQyBldmVuIGlmIEJJT1MKIAkJCWRpc2FibGVkIGl0LgogCi0JbGFwaWNfdGltZXJfYzJfb2sJW1g4Ni0zMix4ODYtNjQsQVBJQ10gdHJ1c3QgdGhlIGxvY2FsIGFwaWMgdGltZXIgaW4KLQkJCUMyIHBvd2VyIHN0YXRlLgorCWxhcGljX3RpbWVyX2MyX29rCVtYODYtMzIseDg2LTY0LEFQSUNdIHRydXN0IHRoZSBsb2NhbCBhcGljIHRpbWVyCisJCQlpbiBDMiBwb3dlciBzdGF0ZS4KIAogCWxpYmF0YS5kbWE9CVtMSUJBVEFdIERNQSBjb250cm9sCiAJCQlsaWJhdGEuZG1hPTAJICBEaXNhYmxlIGFsbCBQQVRBIGFuZCBTQVRBIERNQQpAQCAtMTU1Nyw2ICsxNTY5LDkgQEAKIAogCW5vc29mdGxvY2t1cAlbS05MXSBEaXNhYmxlIHRoZSBzb2Z0LWxvY2t1cCBkZXRlY3Rvci4KIAorCW5vc3dhcGFjY291bnQJW0tOTF0gRGlzYWJsZSBhY2NvdW50aW5nIG9mIHN3YXAgaW4gbWVtb3J5IHJlc291cmNlCisJCQljb250cm9sbGVyLiAoU2VlIERvY3VtZW50YXRpb24vY29udHJvbGxlcnMvbWVtb3J5LnR4dCkKKwogCW5vc3luYwkJW0hXLE02OEtdIERpc2FibGVzIHN5bmMgbmVnb3RpYXRpb24gZm9yIGFsbCBkZXZpY2VzLgogCiAJbm90c2MJCVtCVUdTPVg4Ni0zMl0gRGlzYWJsZSBUaW1lIFN0YW1wIENvdW50ZXIKQEAgLTIyOTUsNyArMjMxMCw4IEBACiAKIAl0aGVybWFsLnBzdj0JW0hXLEFDUEldCiAJCQktMTogZGlzYWJsZSBhbGwgcGFzc2l2ZSB0cmlwIHBvaW50cwotCQkJPGRlZ3JlZXMgQz46IG92ZXJyaWRlIGFsbCBwYXNzaXZlIHRyaXAgcG9pbnRzIHRvIHRoaXMgdmFsdWUKKwkJCTxkZWdyZWVzIEM+OiBvdmVycmlkZSBhbGwgcGFzc2l2ZSB0cmlwIHBvaW50cyB0byB0aGlzCisJCQl2YWx1ZQogCiAJdGhlcm1hbC50enA9CVtIVyxBQ1BJXQogCQkJU3BlY2lmeSBnbG9iYWwgZGVmYXVsdCBBQ1BJIHRoZXJtYWwgem9uZSBwb2xsaW5nIHJhdGUKQEAgLTIzODMsNiArMjM5OSw0MSBAQAogCXVzYmhpZC5tb3VzZXBvbGw9CiAJCQlbVVNCSElEXSBUaGUgaW50ZXJ2YWwgd2hpY2ggbWljZSBhcmUgdG8gYmUgcG9sbGVkIGF0LgogCisJdXNiLXN0b3JhZ2UuZGVsYXlfdXNlPQorCQkJW1VNU10gVGhlIGRlbGF5IGluIHNlY29uZHMgYmVmb3JlIGEgbmV3IGRldmljZSBpcworCQkJc2Nhbm5lZCBmb3IgTG9naWNhbCBVbml0cyAoZGVmYXVsdCA1KS4KKworCXVzYi1zdG9yYWdlLnF1aXJrcz0KKwkJCVtVTVNdIEEgbGlzdCBvZiBxdWlya3MgZW50cmllcyB0byBzdXBwbGVtZW50IG9yCisJCQlvdmVycmlkZSB0aGUgYnVpbHQtaW4gdW51c3VhbF9kZXZzIGxpc3QuICBMaXN0CisJCQllbnRyaWVzIGFyZSBzZXBhcmF0ZWQgYnkgY29tbWFzLiAgRWFjaCBlbnRyeSBoYXMKKwkJCXRoZSBmb3JtIFZJRDpQSUQ6RmxhZ3Mgd2hlcmUgVklEIGFuZCBQSUQgYXJlIFZlbmRvcgorCQkJYW5kIFByb2R1Y3QgSUQgdmFsdWVzICg0LWRpZ2l0IGhleCBudW1iZXJzKSBhbmQKKwkJCUZsYWdzIGlzIGEgc2V0IG9mIGNoYXJhY3RlcnMsIGVhY2ggY29ycmVzcG9uZGluZworCQkJdG8gYSBjb21tb24gdXNiLXN0b3JhZ2UgcXVpcmsgZmxhZyBhcyBmb2xsb3dzOgorCQkJCWEgPSBTQU5FX1NFTlNFIChjb2xsZWN0IG1vcmUgdGhhbiAxOCBieXRlcworCQkJCQlvZiBzZW5zZSBkYXRhKTsKKwkJCQljID0gRklYX0NBUEFDSVRZIChkZWNyZWFzZSB0aGUgcmVwb3J0ZWQKKwkJCQkJZGV2aWNlIGNhcGFjaXR5IGJ5IG9uZSBzZWN0b3IpOworCQkJCWggPSBDQVBBQ0lUWV9IRVVSSVNUSUNTIChkZWNyZWFzZSB0aGUKKwkJCQkJcmVwb3J0ZWQgZGV2aWNlIGNhcGFjaXR5IGJ5IG9uZQorCQkJCQlzZWN0b3IgaWYgdGhlIG51bWJlciBpcyBvZGQpOworCQkJCWkgPSBJR05PUkVfREVWSUNFIChkb24ndCBiaW5kIHRvIHRoaXMKKwkJCQkJZGV2aWNlKTsKKwkJCQlsID0gTk9UX0xPQ0tBQkxFIChkb24ndCB0cnkgdG8gbG9jayBhbmQKKwkJCQkJdW5sb2NrIGVqZWN0YWJsZSBtZWRpYSk7CisJCQkJbSA9IE1BWF9TRUNUT1JTXzY0IChkb24ndCB0cmFuc2ZlciBtb3JlCisJCQkJCXRoYW4gNjQgc2VjdG9ycyA9IDMyIEtCIGF0IGEgdGltZSk7CisJCQkJbyA9IENBUEFDSVRZX09LIChhY2NlcHQgdGhlIGNhcGFjaXR5CisJCQkJCXJlcG9ydGVkIGJ5IHRoZSBkZXZpY2UpOworCQkJCXIgPSBJR05PUkVfUkVTSURVRSAodGhlIGRldmljZSByZXBvcnRzCisJCQkJCWJvZ3VzIHJlc2lkdWUgdmFsdWVzKTsKKwkJCQlzID0gU0lOR0xFX0xVTiAodGhlIGRldmljZSBoYXMgb25seSBvbmUKKwkJCQkJTG9naWNhbCBVbml0KTsKKwkJCQl3ID0gTk9fV1BfREVURUNUIChkb24ndCB0ZXN0IHdoZXRoZXIgdGhlCisJCQkJCW1lZGl1bSBpcyB3cml0ZS1wcm90ZWN0ZWQpLgorCQkJRXhhbXBsZTogcXVpcmtzPTA0MTk6YWFmNTpybCwwNDIxOjA0MzM6cmMKKwogCWFkZF9lZmlfbWVtbWFwCVtFRkk7IHg4Ni0zMixYODYtNjRdIEluY2x1ZGUgRUZJIG1lbW9yeSBtYXAgaW4KIAkJCWtlcm5lbCdzIG1hcCBvZiBhdmFpbGFibGUgcGh5c2ljYWwgUkFNLgogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2xhcHRvcHMvdGhpbmtwYWQtYWNwaS50eHQgYi9Eb2N1bWVudGF0aW9uL2xhcHRvcHMvdGhpbmtwYWQtYWNwaS50eHQKaW5kZXggNzFmMGZlMS4uNDFiYzk5ZiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9sYXB0b3BzL3RoaW5rcGFkLWFjcGkudHh0CisrKyBiL0RvY3VtZW50YXRpb24vbGFwdG9wcy90aGlua3BhZC1hY3BpLnR4dApAQCAtMSw3ICsxLDcgQEAKIAkJICAgICBUaGlua1BhZCBBQ1BJIEV4dHJhcyBEcml2ZXIKIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMC4yMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF5IDI5dGgsIDIwMDgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDAuMjIKKyAgICAgICAgICAgICAgICAgICAgICAgIE5vdmVtYmVyIDIzcmQsICAyMDA4CiAKICAgICAgICAgICAgICAgIEJvcmlzbGF2IERlaWFub3YgPGJvcmlzbGF2QHVzZXJzLnNmLm5ldD4KICAgICAgICAgICAgICBIZW5yaXF1ZSBkZSBNb3JhZXMgSG9sc2NodWggPGhtaEBobWguZW5nLmJyPgpAQCAtMTYsNyArMTYsOCBAQAogVGhpcyBkcml2ZXIgdXNlZCB0byBiZSBuYW1lZCBpYm0tYWNwaSB1bnRpbCBrZXJuZWwgMi42LjIxIGFuZCByZWxlYXNlCiAwLjEzLTIwMDcwMzE0LiAgSXQgdXNlZCB0byBiZSBpbiB0aGUgZHJpdmVycy9hY3BpIHRyZWUsIGJ1dCBpdCB3YXMKIG1vdmVkIHRvIHRoZSBkcml2ZXJzL21pc2MgdHJlZSBhbmQgcmVuYW1lZCB0byB0aGlua3BhZC1hY3BpIGZvciBrZXJuZWwKLTIuNi4yMiwgYW5kIHJlbGVhc2UgMC4xNC4KKzIuNi4yMiwgYW5kIHJlbGVhc2UgMC4xNC4gIEl0IHdhcyBtb3ZlZCB0byBkcml2ZXJzL3BsYXRmb3JtL3g4NiBmb3IKK2tlcm5lbCAyLjYuMjkgYW5kIHJlbGVhc2UgMC4yMi4KIAogVGhlIGRyaXZlciBpcyBuYW1lZCAidGhpbmtwYWQtYWNwaSIuICBJbiBzb21lIHBsYWNlcywgbGlrZSBtb2R1bGUKIG5hbWVzLCAidGhpbmtwYWRfYWNwaSIgaXMgdXNlZCBiZWNhdXNlIG9mIHVzZXJzcGFjZSBpc3N1ZXMuCkBAIC0xNDEyLDYgKzE0MTMsMjQgQEAKIAlyZmtpbGwgY29udHJvbGxlciBzd2l0Y2ggInRwYWNwaV93d2FuX3N3IjogcmVmZXIgdG8KIAlEb2N1bWVudGF0aW9uL3Jma2lsbC50eHQgZm9yIGRldGFpbHMuCiAKK0VYUEVSSU1FTlRBTDogVVdCCistLS0tLS0tLS0tLS0tLS0tLQorCitUaGlzIGZlYXR1cmUgaXMgbWFya2VkIEVYUEVSSU1FTlRBTCBiZWNhdXNlIGl0IGhhcyBub3QgYmVlbiBleHRlbnNpdmVseQordGVzdGVkIGFuZCB2YWxpZGF0ZWQgaW4gdmFyaW91cyBUaGlua1BhZCBtb2RlbHMgeWV0LiAgVGhlIGZlYXR1cmUgbWF5IG5vdAord29yayBhcyBleHBlY3RlZC4gVVNFIFdJVEggQ0FVVElPTiEgVG8gdXNlIHRoaXMgZmVhdHVyZSwgeW91IG5lZWQgdG8gc3VwcGx5Cit0aGUgZXhwZXJpbWVudGFsPTEgcGFyYW1ldGVyIHdoZW4gbG9hZGluZyB0aGUgbW9kdWxlLgorCitzeXNmcyByZmtpbGwgY2xhc3M6IHN3aXRjaCAidHBhY3BpX3V3Yl9zdyIKKworVGhpcyBmZWF0dXJlIGV4cG9ydHMgYW4gcmZraWxsIGNvbnRyb2xsZXIgZm9yIHRoZSBVV0IgZGV2aWNlLCBpZiBvbmUgaXMKK3ByZXNlbnQgYW5kIGVuYWJsZWQgaW4gdGhlIEJJT1MuCisKK1N5c2ZzIG5vdGVzOgorCisJcmZraWxsIGNvbnRyb2xsZXIgc3dpdGNoICJ0cGFjcGlfdXdiX3N3IjogcmVmZXIgdG8KKwlEb2N1bWVudGF0aW9uL3Jma2lsbC50eHQgZm9yIGRldGFpbHMuCisKIE11bHRpcGxlIENvbW1hbmRzLCBNb2R1bGUgUGFyYW1ldGVycwogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKQEAgLTE0NzUsNyArMTQ5NCw3IEBACiAKIDB4MDIwMTAwOglNYXJrZXIgZm9yIHRoaW5rcGFkLWFjcGkgd2l0aCBob3Qga2V5IE5WUkFNIHBvbGxpbmcKIAkJc3VwcG9ydC4gIElmIHlvdSBtdXN0LCB1c2UgaXQgdG8ga25vdyB5b3Ugc2hvdWxkIG5vdAotCQlzdGFydCBhbiB1c2Vyc3BhY2UgTlZSQU0gcG9sbGVyIChhbGxvd3MgdG8gZGV0ZWN0IHdoZW4KKwkJc3RhcnQgYSB1c2Vyc3BhY2UgTlZSQU0gcG9sbGVyIChhbGxvd3MgdG8gZGV0ZWN0IHdoZW4KIAkJTlZSQU0gaXMgY29tcGlsZWQgb3V0IGJ5IHRoZSB1c2VyIGJlY2F1c2UgaXQgaXMKIAkJdW5uZWVkZWQvdW5kZXNpcmVkIGluIHRoZSBmaXJzdCBwbGFjZSkuCiAweDAyMDEwMToJTWFya2VyIGZvciB0aGlua3BhZC1hY3BpIHdpdGggaG90IGtleSBOVlJBTSBwb2xsaW5nCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL21pcHMvQVUxeHh4X0lERS5SRUFETUUgYi9Eb2N1bWVudGF0aW9uL21pcHMvQVUxeHh4X0lERS5SRUFETUUKaW5kZXggZjU0OTYyYS4uOGFjZTM1ZSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9taXBzL0FVMXh4eF9JREUuUkVBRE1FCisrKyBiL0RvY3VtZW50YXRpb24vbWlwcy9BVTF4eHhfSURFLlJFQURNRQpAQCAtNTIsMTQgKzUyLDEyIEBACiAgIGIpICdkcml2ZXJzL2lkZS9taXBzL2F1MXh4eC1pZGUuYycKICAgICAgY29udGFpbnMgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgdGhlIEFVMVhYWCBJREUgZHJpdmVyCiAKLUZvdXIgY29uZmlncyB2YXJpYWJsZXMgYXJlIGludHJvZHVjZWQ6CitGb2xsb3dpbmcgZXh0cmEgY29uZmlncyB2YXJpYWJsZXMgYXJlIGludHJvZHVjZWQ6CiAKICAgQ09ORklHX0JMS19ERVZfSURFX0FVMVhYWF9QSU9fREJETUEgICAgLSBlbmFibGUgdGhlIFBJTytEQkRNQSBtb2RlCiAgIENPTkZJR19CTEtfREVWX0lERV9BVTFYWFhfTURNQTJfREJETUEgIC0gZW5hYmxlIHRoZSBNV0RNQSBtb2RlCiAgIENPTkZJR19CTEtfREVWX0lERV9BVTFYWFhfQlVSU1RBQkxFX09OIC0gc2V0IEJ1cnN0YWJsZSBGSUZPIGluIERCRE1BCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlcgotICBDT05GSUdfQkxLX0RFVl9JREVfQVUxWFhYX1NFUVRTX1BFUl9SUSAtIG1heGltdW0gdHJhbnNmZXIgc2l6ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlciBkZXNjcmlwdG9yCiAKIAogU1VQUE9SVEVEIElERSBNT0RFUwpAQCAtODcsNyArODUsNiBAQAogQ09ORklHX0lERURNQV9QQ0lfQVVUTz15CiBDT05GSUdfQkxLX0RFVl9JREVfQVUxWFhYPXkKIENPTkZJR19CTEtfREVWX0lERV9BVTFYWFhfTURNQTJfREJETUE9eQotQ09ORklHX0JMS19ERVZfSURFX0FVMVhYWF9TRVFUU19QRVJfUlE9MTI4CiBDT05GSUdfQkxLX0RFVl9JREVETUE9eQogQ09ORklHX0lERURNQV9BVVRPPXkKIApAQCAtMTA1LDcgKzEwMiw2IEBACiBDT05GSUdfSURFRE1BX1BDSV9BVVRPPXkKIENPTkZJR19CTEtfREVWX0lERV9BVTFYWFg9eQogQ09ORklHX0JMS19ERVZfSURFX0FVMVhYWF9NRE1BMl9EQkRNQT15Ci1DT05GSUdfQkxLX0RFVl9JREVfQVUxWFhYX1NFUVRTX1BFUl9SUT0xMjgKIENPTkZJR19CTEtfREVWX0lERURNQT15CiBDT05GSUdfSURFRE1BX0FVVE89eQogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvcnhycGMudHh0IGIvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL3J4cnBjLnR4dAppbmRleCBjMzY2OWEzLi42MGQwNWViIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvcnhycGMudHh0CisrKyBiL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9yeHJwYy50eHQKQEAgLTU0MCw3ICs1NDAsNyBAQAogICAgICBNU0dfTU9SRSBzaG91bGQgYmUgc2V0IGluIG1zZ2hkcjo6bXNnX2ZsYWdzIG9uIGFsbCBidXQgdGhlIGxhc3QgcGFydCBvZgogICAgICB0aGUgcmVxdWVzdC4gIE11bHRpcGxlIHJlcXVlc3RzIG1heSBiZSBtYWRlIHNpbXVsdGFuZW91c2x5LgogCi0gICAgIElmIGEgY2FsbCBpcyBpbnRlbmRlZCB0byBnbyB0byBhIGRlc3RpbmF0aW9uIG90aGVyIHRoZW4gdGhlIGRlZmF1bHQKKyAgICAgSWYgYSBjYWxsIGlzIGludGVuZGVkIHRvIGdvIHRvIGEgZGVzdGluYXRpb24gb3RoZXIgdGhhbiB0aGUgZGVmYXVsdAogICAgICBzcGVjaWZpZWQgdGhyb3VnaCBjb25uZWN0KCksIHRoZW4gbXNnaGRyOjptc2dfbmFtZSBzaG91bGQgYmUgc2V0IG9uIHRoZQogICAgICBmaXJzdCByZXF1ZXN0IG1lc3NhZ2Ugb2YgdGhhdCBjYWxsLgogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvdHVudGFwLnR4dCBiL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy90dW50YXAudHh0CmluZGV4IDgzOWNiYjcuLmMwYWFiOTggMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy90dW50YXAudHh0CisrKyBiL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy90dW50YXAudHh0CkBAIC0xMTgsNyArMTE4LDcgQEAKIEl0IGlzIHVzZWQgYnkgVlR1biAoaHR0cDovL3Z0dW4uc291cmNlZm9yZ2UubmV0KS4KIAogQW5vdGhlciBpbnRlcmVzdGluZyBhcHBsaWNhdGlvbiB1c2luZyBUVU4vVEFQIGlzIHBpcHNlY2QKLShodHRwOi8vcGVyc28uZW5zdC5mci9+YmV5c3NhYy9waXBzZWMvKSwgYW4gdXNlcnNwYWNlIElQU2VjCisoaHR0cDovL3BlcnNvLmVuc3QuZnIvfmJleXNzYWMvcGlwc2VjLyksIGEgdXNlcnNwYWNlIElQU2VjCiBpbXBsZW1lbnRhdGlvbiB0aGF0IGNhbiB1c2UgY29tcGxldGUga2VybmVsIHJvdXRpbmcgKHVubGlrZSBGcmVlUy9XQU4pLgogCiAzLiBIb3cgZG9lcyBWaXJ0dWFsIG5ldHdvcmsgZGV2aWNlIGFjdHVhbGx5IHdvcmsgPyAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vbm9tbXUtbW1hcC50eHQgYi9Eb2N1bWVudGF0aW9uL25vbW11LW1tYXAudHh0CmluZGV4IDc3MTRmNTcuLmI1NjVlODIgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vbm9tbXUtbW1hcC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9ub21tdS1tbWFwLnR4dApAQCAtMTA5LDEyICsxMDksMTggQEAKIEZVUlRIRVIgTk9URVMgT04gTk8tTU1VIE1NQVAKID09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAotICgqKSBBIHJlcXVlc3QgZm9yIGEgcHJpdmF0ZSBtYXBwaW5nIG9mIGxlc3MgdGhhbiBhIHBhZ2UgaW4gc2l6ZSBtYXkgbm90IHJldHVybgotICAgICBhIHBhZ2UtYWxpZ25lZCBidWZmZXIuIFRoaXMgaXMgYmVjYXVzZSB0aGUga2VybmVsIGNhbGxzIGttYWxsb2MoKSB0bwotICAgICBhbGxvY2F0ZSB0aGUgYnVmZmVyLCBub3QgZ2V0X2ZyZWVfcGFnZSgpLgorICgqKSBBIHJlcXVlc3QgZm9yIGEgcHJpdmF0ZSBtYXBwaW5nIG9mIGEgZmlsZSBtYXkgcmV0dXJuIGEgYnVmZmVyIHRoYXQgaXMgbm90CisgICAgIHBhZ2UtYWxpZ25lZC4gIFRoaXMgaXMgYmVjYXVzZSBYSVAgbWF5IHRha2UgcGxhY2UsIGFuZCB0aGUgZGF0YSBtYXkgbm90IGJlCisgICAgIHBhZ2VkIGFsaWduZWQgaW4gdGhlIGJhY2tpbmcgc3RvcmUuCiAKLSAoKikgQSBsaXN0IG9mIGFsbCB0aGUgbWFwcGluZ3Mgb24gdGhlIHN5c3RlbSBpcyB2aXNpYmxlIHRocm91Z2ggL3Byb2MvbWFwcyBpbgotICAgICBuby1NTVUgbW9kZS4KKyAoKikgQSByZXF1ZXN0IGZvciBhbiBhbm9ueW1vdXMgbWFwcGluZyB3aWxsIGFsd2F5cyBiZSBwYWdlIGFsaWduZWQuICBJZgorICAgICBwb3NzaWJsZSB0aGUgc2l6ZSBvZiB0aGUgcmVxdWVzdCBzaG91bGQgYmUgYSBwb3dlciBvZiB0d28gb3RoZXJ3aXNlIHNvbWUKKyAgICAgb2YgdGhlIHNwYWNlIG1heSBiZSB3YXN0ZWQgYXMgdGhlIGtlcm5lbCBtdXN0IGFsbG9jYXRlIGEgcG93ZXItb2YtMgorICAgICBncmFudWxlIGJ1dCB3aWxsIG9ubHkgZGlzY2FyZCB0aGUgZXhjZXNzIGlmIGFwcHJvcHJpYXRlbHkgY29uZmlndXJlZCBhcworICAgICB0aGlzIGhhcyBhbiBlZmZlY3Qgb24gZnJhZ21lbnRhdGlvbi4KKworICgqKSBBIGxpc3Qgb2YgYWxsIHRoZSBwcml2YXRlIGNvcHkgYW5kIGFub255bW91cyBtYXBwaW5ncyBvbiB0aGUgc3lzdGVtIGlzCisgICAgIHZpc2libGUgdGhyb3VnaCAvcHJvYy9tYXBzIGluIG5vLU1NVSBtb2RlLgogCiAgKCopIEEgbGlzdCBvZiBhbGwgdGhlIG1hcHBpbmdzIGluIHVzZSBieSBhIHByb2Nlc3MgaXMgdmlzaWJsZSB0aHJvdWdoCiAgICAgIC9wcm9jLzxwaWQ+L21hcHMgaW4gbm8tTU1VIG1vZGUuCkBAIC0yNDIsMyArMjQ4LDE4IEBACiBQcm92aXNpb24gb2Ygc2hhcmVkIG1hcHBpbmdzIG9uIGJsb2NrIGRldmljZSBmaWxlcyBpcyBleGFjdGx5IHRoZSBzYW1lIGFzIGZvcgogY2hhcmFjdGVyIGRldmljZXMuIElmIHRoZXJlIGlzbid0IGEgcmVhbCBkZXZpY2UgdW5kZXJuZWF0aCwgdGhlbiB0aGUgZHJpdmVyCiBzaG91bGQgYWxsb2NhdGUgc3VmZmljaWVudCBjb250aWd1b3VzIG1lbW9yeSB0byBob25vdXIgYW55IHN1cHBvcnRlZCBtYXBwaW5nLgorCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorQURKVVNUSU5HIFBBR0UgVFJJTU1JTkcgQkVIQVZJT1VSCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworTk9NTVUgbW1hcCBhdXRvbWF0aWNhbGx5IHJvdW5kcyB1cCB0byB0aGUgbmVhcmVzdCBwb3dlci1vZi0yIG51bWJlciBvZiBwYWdlcword2hlbiBwZXJmb3JtaW5nIGFuIGFsbG9jYXRpb24uICBUaGlzIGNhbiBoYXZlIGFkdmVyc2UgZWZmZWN0cyBvbiBtZW1vcnkKK2ZyYWdtZW50YXRpb24sIGFuZCBhcyBzdWNoLCBpcyBsZWZ0IGNvbmZpZ3VyYWJsZS4gIFRoZSBkZWZhdWx0IGJlaGF2aW91ciBpcyB0bworYWdncmVzc2l2ZWx5IHRyaW0gYWxsb2NhdGlvbnMgYW5kIGRpc2NhcmQgYW55IGV4Y2VzcyBwYWdlcyBiYWNrIGluIHRvIHRoZSBwYWdlCithbGxvY2F0b3IuICBJbiBvcmRlciB0byByZXRhaW4gZmluZXItZ3JhaW5lZCBjb250cm9sIG92ZXIgZnJhZ21lbnRhdGlvbiwgdGhpcworYmVoYXZpb3VyIGNhbiBlaXRoZXIgYmUgZGlzYWJsZWQgY29tcGxldGVseSwgb3IgYnVtcGVkIHVwIHRvIGEgaGlnaGVyIHBhZ2UKK3dhdGVybWFyayB3aGVyZSB0cmltbWluZyBiZWdpbnMuCisKK1BhZ2UgdHJpbW1pbmcgYmVoYXZpb3VyIGlzIGNvbmZpZ3VyYWJsZSB2aWEgdGhlIHN5c2N0bCBgdm0ubnJfdHJpbV9wYWdlcycuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3Bvd2VycGMvZHRzLWJpbmRpbmdzLzR4eC9uZGZjLnR4dCBiL0RvY3VtZW50YXRpb24vcG93ZXJwYy9kdHMtYmluZGluZ3MvNHh4L25kZmMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2OWYwYjUKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL3Bvd2VycGMvZHRzLWJpbmRpbmdzLzR4eC9uZGZjLnR4dApAQCAtMCwwICsxLDM5IEBACitBTUNDIE5ERkMgKE5hbkQgRmxhc2ggQ29udHJvbGxlcikKKworUmVxdWlyZWQgcHJvcGVydGllczoKKy0gY29tcGF0aWJsZSA6ICJpYm0sbmRmYyIuCistIHJlZyA6IHNob3VsZCBzcGVjaWZ5IGNoaXAgc2VsZWN0IGFuZCBzaXplIHVzZWQgZm9yIHRoZSBjaGlwICgweDIwMDApLgorCitPcHRpb25hbCBwcm9wZXJ0aWVzOgorLSBjY3IgOiBOREZDIGNvbmZpZyBhbmQgY29udHJvbCByZWdpc3RlciB2YWx1ZSAoZGVmYXVsdCAwKS4KKy0gYmFuay1zZXR0aW5ncyA6IE5ERkMgYmFuayBjb25maWd1cmF0aW9uIHJlZ2lzdGVyIHZhbHVlIChkZWZhdWx0IDApLgorCitOb3RlczoKKy0gcGFydGl0aW9uKHMpIC0gZm9sbG93cyB0aGUgT0YgTVREIHN0YW5kYXJkIGZvciBwYXJ0aXRpb25zCisKK0V4YW1wbGU6CisKK25kZmNAMSwwIHsKKwljb21wYXRpYmxlID0gImlibSxuZGZjIjsKKwlyZWcgPSA8MHgwMDAwMDAwMSAweDAwMDAwMDAwIDB4MDAwMDIwMDA+OworCWNjciA9IDwweDAwMDAxMDAwPjsKKwliYW5rLXNldHRpbmdzID0gPDB4ODAwMDIyMjI+OworCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCSNzaXplLWNlbGxzID0gPDE+OworCisJbmFuZCB7CisJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkjc2l6ZS1jZWxscyA9IDwxPjsKKworCQlwYXJ0aXRpb25AMCB7CisJCQlsYWJlbCA9ICJrZXJuZWwiOworCQkJcmVnID0gPDB4MDAwMDAwMDAgMHgwMDIwMDAwMD47CisJCX07CisJCXBhcnRpdGlvbkAyMDAwMDAgeworCQkJbGFiZWwgPSAicm9vdCI7CisJCQlyZWcgPSA8MHgwMDIwMDAwMCAweDAzRTAwMDAwPjsKKwkJfTsKKwl9OworfTsKKworCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3Bvd2VycGMvZHRzLWJpbmRpbmdzL2ZzbC9ib2FyZC50eHQgYi9Eb2N1bWVudGF0aW9uL3Bvd2VycGMvZHRzLWJpbmRpbmdzL2ZzbC9ib2FyZC50eHQKaW5kZXggODFhOTE3ZS4uNmM5NzRkMiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9wb3dlcnBjL2R0cy1iaW5kaW5ncy9mc2wvYm9hcmQudHh0CisrKyBiL0RvY3VtZW50YXRpb24vcG93ZXJwYy9kdHMtYmluZGluZ3MvZnNsL2JvYXJkLnR4dApAQCAtMTgsNyArMTgsNyBAQAogCiBSZXF1aXJlZCBwcm9wZXJpdGllczoKIC0gY29tcGF0aWJsZSA6IHNob3VsZCBiZSAiZnNsLGZwZ2EtcGl4aXMiLgotLSByZWcgOiBzaG91bGQgY29udGFpbiB0aGUgYWRkcmVzcyBhbmQgdGhlIGxlbmdodCBvZiB0aGUgRlBQR0EgcmVnaXN0ZXIKKy0gcmVnIDogc2hvdWxkIGNvbnRhaW4gdGhlIGFkZHJlc3MgYW5kIHRoZSBsZW5ndGggb2YgdGhlIEZQUEdBIHJlZ2lzdGVyCiAgIHNldC4KIAogRXhhbXBsZSAoTVBDODYxMEhQQ0QpOgpAQCAtMjcsMyArMjcsMzMgQEAKIAkJY29tcGF0aWJsZSA9ICJmc2wsZnBnYS1waXhpcyI7CiAJCXJlZyA9IDwweGU4MDAwMDAwIDMyPjsKIAl9OworCisqIEZyZWVzY2FsZSBCQ1NSIEdQSU8gYmFua3MKKworU29tZSBCQ1NSIHJlZ2lzdGVycyBhY3QgYXMgc2ltcGxlIEdQSU8gY29udHJvbGxlcnMsIGVhY2ggc3VjaAorcmVnaXN0ZXIgY2FuIGJlIHJlcHJlc2VudGVkIGJ5IHRoZSBncGlvLWNvbnRyb2xsZXIgbm9kZS4KKworUmVxdWlyZWQgcHJvcGVyaXRpZXM6CistIGNvbXBhdGlibGUgOiBTaG91bGQgYmUgImZzbCw8Ym9hcmQ+LWJjc3ItZ3BpbyIuCistIHJlZyA6IFNob3VsZCBjb250YWluIHRoZSBhZGRyZXNzIGFuZCB0aGUgbGVuZ3RoIG9mIHRoZSBHUElPIGJhbmsKKyAgcmVnaXN0ZXIuCistICNncGlvLWNlbGxzIDogU2hvdWxkIGJlIHR3by4gVGhlIGZpcnN0IGNlbGwgaXMgdGhlIHBpbiBudW1iZXIgYW5kIHRoZQorICBzZWNvbmQgY2VsbCBpcyB1c2VkIHRvIHNwZWNpZnkgb3B0aW9uYWwgcGFyYW10ZXJzIChjdXJyZW50bHkgdW51c2VkKS4KKy0gZ3Bpby1jb250cm9sbGVyIDogTWFya3MgdGhlIHBvcnQgYXMgR1BJTyBjb250cm9sbGVyLgorCitFeGFtcGxlOgorCisJYmNzckAxLDAgeworCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJI3NpemUtY2VsbHMgPSA8MT47CisJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzgzNjBtZHMtYmNzciI7CisJCXJlZyA9IDwxIDAgMHg4MDAwPjsKKwkJcmFuZ2VzID0gPDAgMSAwIDB4ODAwMD47CisKKwkJYmNzcjEzOiBncGlvLWNvbnRyb2xsZXJAZCB7CisJCQkjZ3Bpby1jZWxscyA9IDwyPjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzgzNjBtZHMtYmNzci1ncGlvIjsKKwkJCXJlZyA9IDwweGQgMT47CisJCQlncGlvLWNvbnRyb2xsZXI7CisJCX07CisJfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vc2NoZWR1bGVyL3NjaGVkLWRlc2lnbi1DRlMudHh0IGIvRG9jdW1lbnRhdGlvbi9zY2hlZHVsZXIvc2NoZWQtZGVzaWduLUNGUy50eHQKaW5kZXggODM5OGNhNC4uNmYzMzU5MyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9zY2hlZHVsZXIvc2NoZWQtZGVzaWduLUNGUy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9zY2hlZHVsZXIvc2NoZWQtZGVzaWduLUNGUy50eHQKQEAgLTIzMSw3ICsyMzEsNyBAQAogCiAgICBUaGlzIG9wdGlvbnMgbmVlZHMgQ09ORklHX0NHUk9VUFMgdG8gYmUgZGVmaW5lZCwgYW5kIGxldHMgdGhlIGFkbWluaXN0cmF0b3IKICAgIGNyZWF0ZSBhcmJpdHJhcnkgZ3JvdXBzIG9mIHRhc2tzLCB1c2luZyB0aGUgImNncm91cCIgcHNldWRvIGZpbGVzeXN0ZW0uICBTZWUKLSAgIERvY3VtZW50YXRpb24vY2dyb3Vwcy50eHQgZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBmaWxlc3lzdGVtLgorICAgRG9jdW1lbnRhdGlvbi9jZ3JvdXBzL2Nncm91cHMudHh0IGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgZmlsZXN5c3RlbS4KIAogT25seSBvbmUgb2YgdGhlc2Ugb3B0aW9ucyB0byBncm91cCB0YXNrcyBjYW4gYmUgY2hvc2VuIGFuZCBub3QgYm90aC4KIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zY3NpL0NoYW5nZUxvZy5scGZjIGIvRG9jdW1lbnRhdGlvbi9zY3NpL0NoYW5nZUxvZy5scGZjCmluZGV4IGFlM2Y5NjJhLi5mZjE5YTUyIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3Njc2kvQ2hhbmdlTG9nLmxwZmMKKysrIGIvRG9jdW1lbnRhdGlvbi9zY3NpL0NoYW5nZUxvZy5scGZjCkBAIC03MzMsNyArNzMzLDcgQEAKIAkgIEkvTyBjb21wbGV0aW9uIHBhdGggYSBsaXR0bGUgbW9yZSwgZXNwZWNpYWxseSB0YWtpbmcgY2FyZSBvZgogCSAgZmFzdC1wYXRoaW5nIHRoZSBub24tZXJyb3IgY2FzZS4gIEFsc28gcmVtb3ZlcyB0b25zIG9mIGRlYWQKIAkgIG1lbWJlcnMgYW5kIGRlZmluZXMgZnJvbSBscGZjX3Njc2kuaCAtIGUuZy4gbHBmY190YXJnZXQgaXMgZG93bgotCSAgdG8gbm90aGluZyBtb3JlIHRoZW4gdGhlIGxwZmNfbm9kZWxpc3QgcG9pbnRlci4KKwkgIHRvIG5vdGhpbmcgbW9yZSB0aGFuIHRoZSBscGZjX25vZGVsaXN0IHBvaW50ZXIuCiAJKiBBZGRlZCBiaW5hcnkgc3lzZnMgZmlsZSB0byBpc3N1ZSBtYm94IGNvbW1hbmRzCiAJKiBSZXBsYWNlZCAjaWYgX19CSUdfRU5ESUFOIHdpdGggI2lmIF9fQklHX0VORElBTl9CSVRGSUVMRCBmb3IKIAkgIGNvbXBhdGliaWxpdHkgd2l0aCB0aGUgdXNlciBzcGFjZSBhcHBsaWNhdGlvbnMuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3Njc2kvQ2hhbmdlTG9nLm5jcjUzYzh4eCBiL0RvY3VtZW50YXRpb24vc2NzaS9DaGFuZ2VMb2cubmNyNTNjOHh4CmluZGV4IGE5ZjcyMWEuLjhiMjc4YzEgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vc2NzaS9DaGFuZ2VMb2cubmNyNTNjOHh4CisrKyBiL0RvY3VtZW50YXRpb24vc2NzaS9DaGFuZ2VMb2cubmNyNTNjOHh4CkBAIC0xOSw3ICsxOSw3IEBACiAKIFdlZCBKdWwgMjYgMjM6MzAgMjAwMCBHZXJhcmQgUm91ZGllciAoZ3JvdWRpZXJAY2x1Yi1pbnRlcm5ldC5mcikKIAkqIHZlcnNpb24gbmNyNTNjOHh4LTMuNC4xCi0JLSBQcm92aWRlIE9wZW5GaXJtYXJlIHBhdGggdGhyb3VnaCB0aGUgcHJvYyBGUyBvbiBQUEMuCisJLSBQcm92aWRlIE9wZW5GaXJtd2FyZSBwYXRoIHRocm91Z2ggdGhlIHByb2MgRlMgb24gUFBDLgogCS0gUmVtb3ZlIHRyYWlsaW5nIGFyZ3VtZW50ICMyIGZyb20gYSBjb3VwbGUgb2YgI3VuZGVmcy4KIAogU3VuIEp1bCAwOSAxNjozMCAyMDAwIEdlcmFyZCBSb3VkaWVyIChncm91ZGllckBjbHViLWludGVybmV0LmZyKQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zY3NpL0NoYW5nZUxvZy5zeW01M2M4eHggYi9Eb2N1bWVudGF0aW9uL3Njc2kvQ2hhbmdlTG9nLnN5bTUzYzh4eAppbmRleCBlZjk4NWVjLi4wMmZmYmMxIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3Njc2kvQ2hhbmdlTG9nLnN5bTUzYzh4eAorKysgYi9Eb2N1bWVudGF0aW9uL3Njc2kvQ2hhbmdlTG9nLnN5bTUzYzh4eApAQCAtODEsNyArODEsNyBAQAogCiBXZWQgSnVsIDI2IDIzOjMwIDIwMDAgR2VyYXJkIFJvdWRpZXIgKGdyb3VkaWVyQGNsdWItaW50ZXJuZXQuZnIpCiAJKiB2ZXJzaW9uIHN5bTUzYzh4eC0xLjcuMQotCS0gUHJvdmlkZSBPcGVuRmlybWFyZSBwYXRoIHRocm91Z2ggdGhlIHByb2MgRlMgb24gUFBDLgorCS0gUHJvdmlkZSBPcGVuRmlybXdhcmUgcGF0aCB0aHJvdWdoIHRoZSBwcm9jIEZTIG9uIFBQQy4KIAktIERvd25sb2FkIG9mIG9uLWNoaXAgU1JBTSB1c2luZyBtZW1jcHlfdG9pbygpIGRvZXNuJ3Qgd29yayAKIAkgIG9uIFBQQy4gUmVzdG9yZSBwcmV2aW91cyBtZXRob2QgKE1FTU9SWSBNT1ZFIGZyb20gU0NSSVBUUykuCiAJLSBSZW1vdmUgdHJhaWxpbmcgYXJndW1lbnQgIzIgZnJvbSBhIGNvdXBsZSBvZiAjdW5kZWZzLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zY3NpL3Njc2lfZmNfdHJhbnNwb3J0LnR4dCBiL0RvY3VtZW50YXRpb24vc2NzaS9zY3NpX2ZjX3RyYW5zcG9ydC50eHQKaW5kZXggMzhkMzI0ZDYuLmU1YjA3MWQgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vc2NzaS9zY3NpX2ZjX3RyYW5zcG9ydC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9zY3NpL3Njc2lfZmNfdHJhbnNwb3J0LnR4dApAQCAtMTkxLDcgKzE5MSw3IEBACiAgICAgICBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gYSBkcml2ZXIgImF0dGFjaCIgb24gYW4gYWRhcHRlciwgd2hpY2ggaXMKICAgICAgIGluZGVwZW5kZW50IG9mIHRoZSBhZGFwdGVyJ3MgbGluayBzdGF0ZS4KICAgICAtIEluc3RhbnRpYXRpb24gb2YgdGhlIHZwb3J0IG9uIHRoZSBGQyBsaW5rIHZpYSBFTFMgdHJhZmZpYywgZXRjLgotICAgICAgVGhpcyBpcyBlcXVpdmFsZW50IHRvIGEgImxpbmsgdXAiIGFuZCBzdWNjZXNzZnVsbCBsaW5rIGluaXRpYWxpemF0aW9uLgorICAgICAgVGhpcyBpcyBlcXVpdmFsZW50IHRvIGEgImxpbmsgdXAiIGFuZCBzdWNjZXNzZnVsIGxpbmsgaW5pdGlhbGl6YXRpb24uCiAgIEZ1cnRoZXIgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluIHRoZSBpbnRlcmZhY2VzIHNlY3Rpb24gYmVsb3cgZm9yCiAgIFZwb3J0IENyZWF0aW9uLgogCkBAIC0zMjAsNyArMzIwLDcgQEAKICAgICAgIFRoaXMgaXMgZXF1aXZhbGVudCB0byBhIGRyaXZlciAiYXR0YWNoIiBvbiBhbiBhZGFwdGVyLCB3aGljaCBpcwogICAgICAgaW5kZXBlbmRlbnQgb2YgdGhlIGFkYXB0ZXIncyBsaW5rIHN0YXRlLgogICAgIC0gSW5zdGFudGlhdGlvbiBvZiB0aGUgdnBvcnQgb24gdGhlIEZDIGxpbmsgdmlhIEVMUyB0cmFmZmljLCBldGMuCi0gICAgICBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gYSAibGluayB1cCIgYW5kIHN1Y2Nlc3NmdWxsIGxpbmsgaW5pdGlhbGl6YXRpb24uCisgICAgICBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gYSAibGluayB1cCIgYW5kIHN1Y2Nlc3NmdWwgbGluayBpbml0aWFsaXphdGlvbi4KIAogICBUaGUgTExERCdzIHZwb3J0X2NyZWF0ZSgpIGZ1bmN0aW9uIHdpbGwgbm90IHN5bmNocm9ub3VzbHkgd2FpdCBmb3IgYm90aAogICBwYXJ0cyB0byBiZSBmdWxseSBjb21wbGV0ZWQgYmVmb3JlIHJldHVybmluZy4gSXQgbXVzdCB2YWxpZGF0ZSB0aGF0IHRoZQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zb3VuZC9hbHNhL0hELUF1ZGlvLU1vZGVscy50eHQgYi9Eb2N1bWVudGF0aW9uL3NvdW5kL2Fsc2EvSEQtQXVkaW8tTW9kZWxzLnR4dAppbmRleCA0YjdhYzIxLi42NGViMTEwIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3NvdW5kL2Fsc2EvSEQtQXVkaW8tTW9kZWxzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3NvdW5kL2Fsc2EvSEQtQXVkaW8tTW9kZWxzLnR4dApAQCAtMjc1LDcgKzI3NSw4IEBACiAgIGRlbGwtbTI1CURlbGwgSW5zcGlyb24gRTE1MDVuCiAgIGRlbGwtbTI2CURlbGwgSW5zcGlyb24gMTUwMQogICBkZWxsLW0yNwlEZWxsIEluc3Bpcm9uIEUxNzA1Lzk0MDAKLSAgZ2F0ZXdheQlHYXRld2F5IGxhcHRvcHMgd2l0aCBFQVBEIGNvbnRyb2wKKyAgZ2F0ZXdheS1tNAlHYXRld2F5IGxhcHRvcHMgd2l0aCBFQVBEIGNvbnRyb2wKKyAgZ2F0ZXdheS1tNC0yCUdhdGV3YXkgbGFwdG9wcyB3aXRoIEVBUEQgY29udHJvbAogICBwYW5hc29uaWMJUGFuYXNvbmljIENGLTc0CiAKIFNUQUM5MjA1LzkyNTQKQEAgLTMwMiw2ICszMDMsNyBAQAogICBtYWNib29rLXBybwlJbnRlbCBNYWMgQm9vayBQcm8gMm5kIGdlbmVyYXRpb24gKGVxLiB0eXBlIDMpCiAgIGltYWMtaW50ZWwJSW50ZWwgaU1hYyAoZXEuIHR5cGUgMikKICAgaW1hYy1pbnRlbC0yMAlJbnRlbCBpTWFjIChuZXdlciB2ZXJzaW9uKSAoZXEuIHR5cGUgMykKKyAgZWNzMjAyCUVDUy9QQyBjaGlwcwogICBkZWxsLWQ4MQlEZWxsICh1bmtub3duKQogICBkZWxsLWQ4MglEZWxsICh1bmtub3duKQogICBkZWxsLW04MQlEZWxsICh1bmtub3duKQpAQCAtMzEwLDkgKzMxMiwxMyBAQAogU1RBQzkyMDIvOTI1MC85MjUxCiA9PT09PT09PT09PT09PT09PT0KICAgcmVmCQlSZWZlcmVuY2UgYm9hcmQsIGJhc2UgY29uZmlnCisgIG0xCQlTb21lIEdhdGV3YXkgTVggc2VyaWVzIGxhcHRvcHMgKE5YNTYwWEwpCisgIG0xLTIJCVNvbWUgR2F0ZXdheSBNWCBzZXJpZXMgbGFwdG9wcyAoTVg2NDUzKQorICBtMgkJU29tZSBHYXRld2F5IE1YIHNlcmllcyBsYXB0b3BzIChNMjU1KQogICBtMi0yCQlTb21lIEdhdGV3YXkgTVggc2VyaWVzIGxhcHRvcHMKKyAgbTMJCVNvbWUgR2F0ZXdheSBNWCBzZXJpZXMgbGFwdG9wcworICBtNQkJU29tZSBHYXRld2F5IE1YIHNlcmllcyBsYXB0b3BzIChNUDY5NTQpCiAgIG02CQlTb21lIEdhdGV3YXkgTlggc2VyaWVzIGxhcHRvcHMKLSAgcGE2CQlHYXRld2F5IE5YODYwIHNlcmllcwogCiBTVEFDOTIyNy85MjI4LzkyMjkvOTI3eAogPT09PT09PT09PT09PT09PT09PT09PT0KQEAgLTMyOSw2ICszMzUsNyBAQAogICBkZWxsLW00LTEJRGVsbCBkZXNrdG9wcwogICBkZWxsLW00LTIJRGVsbCBkZXNrdG9wcwogICBkZWxsLW00LTMJRGVsbCBkZXNrdG9wcworICBocC1tNAkJSFAgZHYgbGFwdG9wcwogCiBTVEFDOTJIRDczKgogPT09PT09PT09PT0KQEAgLTMzNyw2ICszNDQsNyBAQAogICBkZWxsLW02LWFtaWMJRGVsbCBkZXNrdG9wcy9sYXB0b3BzIHdpdGggYW5hbG9nIG1pY3MKICAgZGVsbC1tNi1kbWljCURlbGwgZGVza3RvcHMvbGFwdG9wcyB3aXRoIGRpZ2l0YWwgbWljcwogICBkZWxsLW02CURlbGwgZGVza3RvcHMvbGFwdG9wcyB3aXRoIGJvdGggdHlwZSBvZiBtaWNzCisgIGRlbGwtZXEJRGVsbCBkZXNrdG9wcy9sYXB0b3BzCiAKIFNUQUM5MkhEODMqCiA9PT09PT09PT09PQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zcGkvc3BpLWxtNzBsbHAgYi9Eb2N1bWVudGF0aW9uL3NwaS9zcGktbG03MGxscAppbmRleCAxNTRiZDAyLi4zNGE5Y2ZkIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3NwaS9zcGktbG03MGxscAorKysgYi9Eb2N1bWVudGF0aW9uL3NwaS9zcGktbG03MGxscApAQCAtMTMsMTAgKzEzLDIwIEBACiBUaGlzIGRyaXZlciBwcm92aWRlcyBnbHVlIGNvZGUgY29ubmVjdGluZyBhIE5hdGlvbmFsIFNlbWljb25kdWN0b3IgTE03MCBMTFAKIHRlbXBlcmF0dXJlIHNlbnNvciBldmFsdWF0aW9uIGJvYXJkIHRvIHRoZSBrZXJuZWwncyBTUEkgY29yZSBzdWJzeXN0ZW0uCiAKK1RoaXMgaXMgYSBTUEkgbWFzdGVyIGNvbnRyb2xsZXIgZHJpdmVyLiBJdCBjYW4gYmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoCisobGF5ZXJlZCB1bmRlcikgdGhlIExNNzAgbG9naWNhbCBkcml2ZXIgKGEgIlNQSSBwcm90b2NvbCBkcml2ZXIiKS4KIEluIGVmZmVjdCwgdGhpcyBkcml2ZXIgdHVybnMgdGhlIHBhcmFsbGVsIHBvcnQgaW50ZXJmYWNlIG9uIHRoZSBldmFsIGJvYXJkCiBpbnRvIGEgU1BJIGJ1cyB3aXRoIGEgc2luZ2xlIGRldmljZSwgd2hpY2ggd2lsbCBiZSBkcml2ZW4gYnkgdGhlIGdlbmVyaWMKIExNNzAgZHJpdmVyIChkcml2ZXJzL2h3bW9uL2xtNzAuYykuCiAKKworSGFyZHdhcmUgSW50ZXJmYWNpbmcKKy0tLS0tLS0tLS0tLS0tLS0tLS0tCitUaGUgc2NoZW1hdGljIGZvciB0aGlzIHBhcnRpY3VsYXIgYm9hcmQgKHRoZSBMTTcwRVZBTC1MTFApIGlzCithdmFpbGFibGUgKG9uIHBhZ2UgNCkgaGVyZToKKworICBodHRwOi8vd3d3Lm5hdGlvbmFsLmNvbS9hcHBpbmZvL3RlbXBzZW5zb3JzL2ZpbGVzL0xNNzBMTFBFVkFMbWFudWFsLnBkZgorCiBUaGUgaGFyZHdhcmUgaW50ZXJmYWNpbmcgb24gdGhlIExNNzAgTExQIGV2YWwgYm9hcmQgaXMgYXMgZm9sbG93czoKIAogICAgUGFyYWxsZWwgICAgICAgICAgICAgICAgIExNNzAgTExQCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3N5c2N0bC92bS50eHQgYi9Eb2N1bWVudGF0aW9uL3N5c2N0bC92bS50eHQKaW5kZXggY2QwNTk5NC4uMzE5N2ZjOCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9zeXNjdGwvdm0udHh0CisrKyBiL0RvY3VtZW50YXRpb24vc3lzY3RsL3ZtLnR4dApAQCAtMSwxMiArMSwxMyBAQAotRG9jdW1lbnRhdGlvbiBmb3IgL3Byb2Mvc3lzL3ZtLyoJa2VybmVsIHZlcnNpb24gMi4yLjEwCitEb2N1bWVudGF0aW9uIGZvciAvcHJvYy9zeXMvdm0vKglrZXJuZWwgdmVyc2lvbiAyLjYuMjkKIAkoYykgMTk5OCwgMTk5OSwgIFJpayB2YW4gUmllbCA8cmllbEBubC5saW51eC5vcmc+CisJKGMpIDIwMDggICAgICAgICBQZXRlciBXLiBNb3JyZWFsZSA8cG1vcnJlYWxlQG5vdmVsbC5jb20+CiAKIEZvciBnZW5lcmFsIGluZm8gYW5kIGxlZ2FsIGJsdXJiLCBwbGVhc2UgbG9vayBpbiBSRUFETUUuCiAKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKIFRoaXMgZmlsZSBjb250YWlucyB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIHN5c2N0bCBmaWxlcyBpbgotL3Byb2Mvc3lzL3ZtIGFuZCBpcyB2YWxpZCBmb3IgTGludXgga2VybmVsIHZlcnNpb24gMi4yLgorL3Byb2Mvc3lzL3ZtIGFuZCBpcyB2YWxpZCBmb3IgTGludXgga2VybmVsIHZlcnNpb24gMi42LjI5LgogCiBUaGUgZmlsZXMgaW4gdGhpcyBkaXJlY3RvcnkgY2FuIGJlIHVzZWQgdG8gdHVuZSB0aGUgb3BlcmF0aW9uCiBvZiB0aGUgdmlydHVhbCBtZW1vcnkgKFZNKSBzdWJzeXN0ZW0gb2YgdGhlIExpbnV4IGtlcm5lbCBhbmQKQEAgLTE2LDgyICsxNywyNDQgQEAKIGZpbGVzIGNhbiBiZSBmb3VuZCBpbiBtbS9zd2FwLmMuCiAKIEN1cnJlbnRseSwgdGhlc2UgZmlsZXMgYXJlIGluIC9wcm9jL3N5cy92bToKLS0gb3ZlcmNvbW1pdF9tZW1vcnkKLS0gcGFnZS1jbHVzdGVyCi0tIGRpcnR5X3JhdGlvCisKKy0gYmxvY2tfZHVtcAorLSBkaXJ0eV9iYWNrZ3JvdW5kX2J5dGVzCiAtIGRpcnR5X2JhY2tncm91bmRfcmF0aW8KKy0gZGlydHlfYnl0ZXMKIC0gZGlydHlfZXhwaXJlX2NlbnRpc2VjcworLSBkaXJ0eV9yYXRpbwogLSBkaXJ0eV93cml0ZWJhY2tfY2VudGlzZWNzCi0tIGhpZ2htZW1faXNfZGlydHlhYmxlICAgKG9ubHkgaWYgQ09ORklHX0hJR0hNRU0gc2V0KQorLSBkcm9wX2NhY2hlcworLSBodWdlcGFnZXNfdHJlYXRfYXNfbW92YWJsZQorLSBodWdldGxiX3NobV9ncm91cAorLSBsYXB0b3BfbW9kZQorLSBsZWdhY3lfdmFfbGF5b3V0CistIGxvd21lbV9yZXNlcnZlX3JhdGlvCiAtIG1heF9tYXBfY291bnQKIC0gbWluX2ZyZWVfa2J5dGVzCi0tIGxhcHRvcF9tb2RlCi0tIGJsb2NrX2R1bXAKLS0gZHJvcC1jYWNoZXMKLS0gem9uZV9yZWNsYWltX21vZGUKLS0gbWluX3VubWFwcGVkX3JhdGlvCiAtIG1pbl9zbGFiX3JhdGlvCi0tIHBhbmljX29uX29vbQotLSBvb21fZHVtcF90YXNrcwotLSBvb21fa2lsbF9hbGxvY2F0aW5nX3Rhc2sKLS0gbW1hcF9taW5fYWRkcmVzcwotLSBudW1hX3pvbmVsaXN0X29yZGVyCistIG1pbl91bm1hcHBlZF9yYXRpbworLSBtbWFwX21pbl9hZGRyCiAtIG5yX2h1Z2VwYWdlcwogLSBucl9vdmVyY29tbWl0X2h1Z2VwYWdlcworLSBucl9wZGZsdXNoX3RocmVhZHMKKy0gbnJfdHJpbV9wYWdlcyAgICAgICAgIChvbmx5IGlmIENPTkZJR19NTVU9bikKKy0gbnVtYV96b25lbGlzdF9vcmRlcgorLSBvb21fZHVtcF90YXNrcworLSBvb21fa2lsbF9hbGxvY2F0aW5nX3Rhc2sKKy0gb3ZlcmNvbW1pdF9tZW1vcnkKKy0gb3ZlcmNvbW1pdF9yYXRpbworLSBwYWdlLWNsdXN0ZXIKKy0gcGFuaWNfb25fb29tCistIHBlcmNwdV9wYWdlbGlzdF9mcmFjdGlvbgorLSBzdGF0X2ludGVydmFsCistIHN3YXBwaW5lc3MKKy0gdmZzX2NhY2hlX3ByZXNzdXJlCistIHpvbmVfcmVjbGFpbV9tb2RlCisKIAogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAotZGlydHlfYnl0ZXMsIGRpcnR5X3JhdGlvLCBkaXJ0eV9iYWNrZ3JvdW5kX2J5dGVzLAotZGlydHlfYmFja2dyb3VuZF9yYXRpbywgZGlydHlfZXhwaXJlX2NlbnRpc2VjcywKLWRpcnR5X3dyaXRlYmFja19jZW50aXNlY3MsIGhpZ2htZW1faXNfZGlydHlhYmxlLAotdmZzX2NhY2hlX3ByZXNzdXJlLCBsYXB0b3BfbW9kZSwgYmxvY2tfZHVtcCwgc3dhcF90b2tlbl90aW1lb3V0LAotZHJvcC1jYWNoZXMsIGh1Z2VwYWdlc190cmVhdF9hc19tb3ZhYmxlOgorYmxvY2tfZHVtcAogCi1TZWUgRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9wcm9jLnR4dAorYmxvY2tfZHVtcCBlbmFibGVzIGJsb2NrIEkvTyBkZWJ1Z2dpbmcgd2hlbiBzZXQgdG8gYSBub256ZXJvIHZhbHVlLiBNb3JlCitpbmZvcm1hdGlvbiBvbiBibG9jayBJL08gZGVidWdnaW5nIGlzIGluIERvY3VtZW50YXRpb24vbGFwdG9wcy9sYXB0b3AtbW9kZS50eHQuCiAKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKLW92ZXJjb21taXRfbWVtb3J5OgorZGlydHlfYmFja2dyb3VuZF9ieXRlcwogCi1UaGlzIHZhbHVlIGNvbnRhaW5zIGEgZmxhZyB0aGF0IGVuYWJsZXMgbWVtb3J5IG92ZXJjb21taXRtZW50LgorQ29udGFpbnMgdGhlIGFtb3VudCBvZiBkaXJ0eSBtZW1vcnkgYXQgd2hpY2ggdGhlIHBkZmx1c2ggYmFja2dyb3VuZCB3cml0ZWJhY2sKK2RhZW1vbiB3aWxsIHN0YXJ0IHdyaXRlYmFjay4KIAotV2hlbiB0aGlzIGZsYWcgaXMgMCwgdGhlIGtlcm5lbCBhdHRlbXB0cyB0byBlc3RpbWF0ZSB0aGUgYW1vdW50Ci1vZiBmcmVlIG1lbW9yeSBsZWZ0IHdoZW4gdXNlcnNwYWNlIHJlcXVlc3RzIG1vcmUgbWVtb3J5LgotCi1XaGVuIHRoaXMgZmxhZyBpcyAxLCB0aGUga2VybmVsIHByZXRlbmRzIHRoZXJlIGlzIGFsd2F5cyBlbm91Z2gKLW1lbW9yeSB1bnRpbCBpdCBhY3R1YWxseSBydW5zIG91dC4KLQotV2hlbiB0aGlzIGZsYWcgaXMgMiwgdGhlIGtlcm5lbCB1c2VzIGEgIm5ldmVyIG92ZXJjb21taXQiCi1wb2xpY3kgdGhhdCBhdHRlbXB0cyB0byBwcmV2ZW50IGFueSBvdmVyY29tbWl0IG9mIG1lbW9yeS4gIAotCi1UaGlzIGZlYXR1cmUgY2FuIGJlIHZlcnkgdXNlZnVsIGJlY2F1c2UgdGhlcmUgYXJlIGEgbG90IG9mCi1wcm9ncmFtcyB0aGF0IG1hbGxvYygpIGh1Z2UgYW1vdW50cyBvZiBtZW1vcnkgImp1c3QtaW4tY2FzZSIKLWFuZCBkb24ndCB1c2UgbXVjaCBvZiBpdC4KLQotVGhlIGRlZmF1bHQgdmFsdWUgaXMgMC4KLQotU2VlIERvY3VtZW50YXRpb24vdm0vb3ZlcmNvbW1pdC1hY2NvdW50aW5nIGFuZAotc2VjdXJpdHkvY29tbW9uY2FwLmM6OmNhcF92bV9lbm91Z2hfbWVtb3J5KCkgZm9yIG1vcmUgaW5mb3JtYXRpb24uCitJZiBkaXJ0eV9iYWNrZ3JvdW5kX2J5dGVzIGlzIHdyaXR0ZW4sIGRpcnR5X2JhY2tncm91bmRfcmF0aW8gYmVjb21lcyBhIGZ1bmN0aW9uCitvZiBpdHMgdmFsdWUgKGRpcnR5X2JhY2tncm91bmRfYnl0ZXMgLyB0aGUgYW1vdW50IG9mIGRpcnR5YWJsZSBzeXN0ZW0gbWVtb3J5KS4KIAogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAotb3ZlcmNvbW1pdF9yYXRpbzoKK2RpcnR5X2JhY2tncm91bmRfcmF0aW8KIAotV2hlbiBvdmVyY29tbWl0X21lbW9yeSBpcyBzZXQgdG8gMiwgdGhlIGNvbW1pdHRlZCBhZGRyZXNzCi1zcGFjZSBpcyBub3QgcGVybWl0dGVkIHRvIGV4Y2VlZCBzd2FwIHBsdXMgdGhpcyBwZXJjZW50YWdlCi1vZiBwaHlzaWNhbCBSQU0uICBTZWUgYWJvdmUuCitDb250YWlucywgYXMgYSBwZXJjZW50YWdlIG9mIHRvdGFsIHN5c3RlbSBtZW1vcnksIHRoZSBudW1iZXIgb2YgcGFnZXMgYXQgd2hpY2gKK3RoZSBwZGZsdXNoIGJhY2tncm91bmQgd3JpdGViYWNrIGRhZW1vbiB3aWxsIHN0YXJ0IHdyaXRpbmcgb3V0IGRpcnR5IGRhdGEuCiAKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKLXBhZ2UtY2x1c3RlcjoKK2RpcnR5X2J5dGVzCiAKLVRoZSBMaW51eCBWTSBzdWJzeXN0ZW0gYXZvaWRzIGV4Y2Vzc2l2ZSBkaXNrIHNlZWtzIGJ5IHJlYWRpbmcKLW11bHRpcGxlIHBhZ2VzIG9uIGEgcGFnZSBmYXVsdC4gVGhlIG51bWJlciBvZiBwYWdlcyBpdCByZWFkcwotaXMgZGVwZW5kZW50IG9uIHRoZSBhbW91bnQgb2YgbWVtb3J5IGluIHlvdXIgbWFjaGluZS4KK0NvbnRhaW5zIHRoZSBhbW91bnQgb2YgZGlydHkgbWVtb3J5IGF0IHdoaWNoIGEgcHJvY2VzcyBnZW5lcmF0aW5nIGRpc2sgd3JpdGVzCit3aWxsIGl0c2VsZiBzdGFydCB3cml0ZWJhY2suCiAKLVRoZSBudW1iZXIgb2YgcGFnZXMgdGhlIGtlcm5lbCByZWFkcyBpbiBhdCBvbmNlIGlzIGVxdWFsIHRvCi0yIF4gcGFnZS1jbHVzdGVyLiBWYWx1ZXMgYWJvdmUgMiBeIDUgZG9uJ3QgbWFrZSBtdWNoIHNlbnNlCi1mb3Igc3dhcCBiZWNhdXNlIHdlIG9ubHkgY2x1c3RlciBzd2FwIGRhdGEgaW4gMzItcGFnZSBncm91cHMuCitJZiBkaXJ0eV9ieXRlcyBpcyB3cml0dGVuLCBkaXJ0eV9yYXRpbyBiZWNvbWVzIGEgZnVuY3Rpb24gb2YgaXRzIHZhbHVlCisoZGlydHlfYnl0ZXMgLyB0aGUgYW1vdW50IG9mIGRpcnR5YWJsZSBzeXN0ZW0gbWVtb3J5KS4KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworZGlydHlfZXhwaXJlX2NlbnRpc2VjcworCitUaGlzIHR1bmFibGUgaXMgdXNlZCB0byBkZWZpbmUgd2hlbiBkaXJ0eSBkYXRhIGlzIG9sZCBlbm91Z2ggdG8gYmUgZWxpZ2libGUKK2ZvciB3cml0ZW91dCBieSB0aGUgcGRmbHVzaCBkYWVtb25zLiAgSXQgaXMgZXhwcmVzc2VkIGluIDEwMCd0aHMgb2YgYSBzZWNvbmQuCitEYXRhIHdoaWNoIGhhcyBiZWVuIGRpcnR5IGluLW1lbW9yeSBmb3IgbG9uZ2VyIHRoYW4gdGhpcyBpbnRlcnZhbCB3aWxsIGJlCit3cml0dGVuIG91dCBuZXh0IHRpbWUgYSBwZGZsdXNoIGRhZW1vbiB3YWtlcyB1cC4KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworZGlydHlfcmF0aW8KKworQ29udGFpbnMsIGFzIGEgcGVyY2VudGFnZSBvZiB0b3RhbCBzeXN0ZW0gbWVtb3J5LCB0aGUgbnVtYmVyIG9mIHBhZ2VzIGF0IHdoaWNoCithIHByb2Nlc3Mgd2hpY2ggaXMgZ2VuZXJhdGluZyBkaXNrIHdyaXRlcyB3aWxsIGl0c2VsZiBzdGFydCB3cml0aW5nIG91dCBkaXJ0eQorZGF0YS4KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworZGlydHlfd3JpdGViYWNrX2NlbnRpc2VjcworCitUaGUgcGRmbHVzaCB3cml0ZWJhY2sgZGFlbW9ucyB3aWxsIHBlcmlvZGljYWxseSB3YWtlIHVwIGFuZCB3cml0ZSBgb2xkJyBkYXRhCitvdXQgdG8gZGlzay4gIFRoaXMgdHVuYWJsZSBleHByZXNzZXMgdGhlIGludGVydmFsIGJldHdlZW4gdGhvc2Ugd2FrZXVwcywgaW4KKzEwMCd0aHMgb2YgYSBzZWNvbmQuCisKK1NldHRpbmcgdGhpcyB0byB6ZXJvIGRpc2FibGVzIHBlcmlvZGljIHdyaXRlYmFjayBhbHRvZ2V0aGVyLgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitkcm9wX2NhY2hlcworCitXcml0aW5nIHRvIHRoaXMgd2lsbCBjYXVzZSB0aGUga2VybmVsIHRvIGRyb3AgY2xlYW4gY2FjaGVzLCBkZW50cmllcyBhbmQKK2lub2RlcyBmcm9tIG1lbW9yeSwgY2F1c2luZyB0aGF0IG1lbW9yeSB0byBiZWNvbWUgZnJlZS4KKworVG8gZnJlZSBwYWdlY2FjaGU6CisJZWNobyAxID4gL3Byb2Mvc3lzL3ZtL2Ryb3BfY2FjaGVzCitUbyBmcmVlIGRlbnRyaWVzIGFuZCBpbm9kZXM6CisJZWNobyAyID4gL3Byb2Mvc3lzL3ZtL2Ryb3BfY2FjaGVzCitUbyBmcmVlIHBhZ2VjYWNoZSwgZGVudHJpZXMgYW5kIGlub2RlczoKKwllY2hvIDMgPiAvcHJvYy9zeXMvdm0vZHJvcF9jYWNoZXMKKworQXMgdGhpcyBpcyBhIG5vbi1kZXN0cnVjdGl2ZSBvcGVyYXRpb24gYW5kIGRpcnR5IG9iamVjdHMgYXJlIG5vdCBmcmVlYWJsZSwgdGhlCit1c2VyIHNob3VsZCBydW4gYHN5bmMnIGZpcnN0LgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitodWdlcGFnZXNfdHJlYXRfYXNfbW92YWJsZQorCitUaGlzIHBhcmFtZXRlciBpcyBvbmx5IHVzZWZ1bCB3aGVuIGtlcm5lbGNvcmU9IGlzIHNwZWNpZmllZCBhdCBib290IHRpbWUgdG8KK2NyZWF0ZSBaT05FX01PVkFCTEUgZm9yIHBhZ2VzIHRoYXQgbWF5IGJlIHJlY2xhaW1lZCBvciBtaWdyYXRlZC4gSHVnZSBwYWdlcworYXJlIG5vdCBtb3ZhYmxlIHNvIGFyZSBub3Qgbm9ybWFsbHkgYWxsb2NhdGVkIGZyb20gWk9ORV9NT1ZBQkxFLiBBIG5vbi16ZXJvCit2YWx1ZSB3cml0dGVuIHRvIGh1Z2VwYWdlc190cmVhdF9hc19tb3ZhYmxlIGFsbG93cyBodWdlIHBhZ2VzIHRvIGJlIGFsbG9jYXRlZAorZnJvbSBaT05FX01PVkFCTEUuCisKK09uY2UgZW5hYmxlZCwgdGhlIFpPTkVfTU9WQUJMRSBpcyB0cmVhdGVkIGFzIGFuIGFyZWEgb2YgbWVtb3J5IHRoZSBodWdlCitwYWdlcyBwb29sIGNhbiBlYXNpbHkgZ3JvdyBvciBzaHJpbmsgd2l0aGluLiBBc3N1bWluZyB0aGF0IGFwcGxpY2F0aW9ucyBhcmUKK25vdCBydW5uaW5nIHRoYXQgbWxvY2soKSBhIGxvdCBvZiBtZW1vcnksIGl0IGlzIGxpa2VseSB0aGUgaHVnZSBwYWdlcyBwb29sCitjYW4gZ3JvdyB0byB0aGUgc2l6ZSBvZiBaT05FX01PVkFCTEUgYnkgcmVwZWF0ZWRseSBlbnRlcmluZyB0aGUgZGVzaXJlZCB2YWx1ZQoraW50byBucl9odWdlcGFnZXMgYW5kIHRyaWdnZXJpbmcgcGFnZSByZWNsYWltLgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitodWdldGxiX3NobV9ncm91cAorCitodWdldGxiX3NobV9ncm91cCBjb250YWlucyBncm91cCBpZCB0aGF0IGlzIGFsbG93ZWQgdG8gY3JlYXRlIFN5c1YKK3NoYXJlZCBtZW1vcnkgc2VnbWVudCB1c2luZyBodWdldGxiIHBhZ2UuCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK2xhcHRvcF9tb2RlCisKK2xhcHRvcF9tb2RlIGlzIGEga25vYiB0aGF0IGNvbnRyb2xzICJsYXB0b3AgbW9kZSIuIEFsbCB0aGUgdGhpbmdzIHRoYXQgYXJlCitjb250cm9sbGVkIGJ5IHRoaXMga25vYiBhcmUgZGlzY3Vzc2VkIGluIERvY3VtZW50YXRpb24vbGFwdG9wcy9sYXB0b3AtbW9kZS50eHQuCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK2xlZ2FjeV92YV9sYXlvdXQKKworSWYgbm9uLXplcm8sIHRoaXMgc3lzY3RsIGRpc2FibGVzIHRoZSBuZXcgMzItYml0IG1tYXAgbW1hcCBsYXlvdXQgLSB0aGUga2VybmVsCit3aWxsIHVzZSB0aGUgbGVnYWN5ICgyLjQpIGxheW91dCBmb3IgYWxsIHByb2Nlc3Nlcy4KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworbG93bWVtX3Jlc2VydmVfcmF0aW8KKworRm9yIHNvbWUgc3BlY2lhbGlzZWQgd29ya2xvYWRzIG9uIGhpZ2htZW0gbWFjaGluZXMgaXQgaXMgZGFuZ2Vyb3VzIGZvcgordGhlIGtlcm5lbCB0byBhbGxvdyBwcm9jZXNzIG1lbW9yeSB0byBiZSBhbGxvY2F0ZWQgZnJvbSB0aGUgImxvd21lbSIKK3pvbmUuICBUaGlzIGlzIGJlY2F1c2UgdGhhdCBtZW1vcnkgY291bGQgdGhlbiBiZSBwaW5uZWQgdmlhIHRoZSBtbG9jaygpCitzeXN0ZW0gY2FsbCwgb3IgYnkgdW5hdmFpbGFiaWxpdHkgb2Ygc3dhcHNwYWNlLgorCitBbmQgb24gbGFyZ2UgaGlnaG1lbSBtYWNoaW5lcyB0aGlzIGxhY2sgb2YgcmVjbGFpbWFibGUgbG93bWVtIG1lbW9yeQorY2FuIGJlIGZhdGFsLgorCitTbyB0aGUgTGludXggcGFnZSBhbGxvY2F0b3IgaGFzIGEgbWVjaGFuaXNtIHdoaWNoIHByZXZlbnRzIGFsbG9jYXRpb25zCit3aGljaCBfY291bGRfIHVzZSBoaWdobWVtIGZyb20gdXNpbmcgdG9vIG11Y2ggbG93bWVtLiAgVGhpcyBtZWFucyB0aGF0CithIGNlcnRhaW4gYW1vdW50IG9mIGxvd21lbSBpcyBkZWZlbmRlZCBmcm9tIHRoZSBwb3NzaWJpbGl0eSBvZiBiZWluZworY2FwdHVyZWQgaW50byBwaW5uZWQgdXNlciBtZW1vcnkuCisKKyhUaGUgc2FtZSBhcmd1bWVudCBhcHBsaWVzIHRvIHRoZSBvbGQgMTYgbWVnYWJ5dGUgSVNBIERNQSByZWdpb24uICBUaGlzCittZWNoYW5pc20gd2lsbCBhbHNvIGRlZmVuZCB0aGF0IHJlZ2lvbiBmcm9tIGFsbG9jYXRpb25zIHdoaWNoIGNvdWxkIHVzZQoraGlnaG1lbSBvciBsb3dtZW0pLgorCitUaGUgYGxvd21lbV9yZXNlcnZlX3JhdGlvJyB0dW5hYmxlIGRldGVybWluZXMgaG93IGFnZ3Jlc3NpdmUgdGhlIGtlcm5lbCBpcworaW4gZGVmZW5kaW5nIHRoZXNlIGxvd2VyIHpvbmVzLgorCitJZiB5b3UgaGF2ZSBhIG1hY2hpbmUgd2hpY2ggdXNlcyBoaWdobWVtIG9yIElTQSBETUEgYW5kIHlvdXIKK2FwcGxpY2F0aW9ucyBhcmUgdXNpbmcgbWxvY2soKSwgb3IgaWYgeW91IGFyZSBydW5uaW5nIHdpdGggbm8gc3dhcCB0aGVuCit5b3UgcHJvYmFibHkgc2hvdWxkIGNoYW5nZSB0aGUgbG93bWVtX3Jlc2VydmVfcmF0aW8gc2V0dGluZy4KKworVGhlIGxvd21lbV9yZXNlcnZlX3JhdGlvIGlzIGFuIGFycmF5LiBZb3UgY2FuIHNlZSB0aGVtIGJ5IHJlYWRpbmcgdGhpcyBmaWxlLgorLQorJSBjYXQgL3Byb2Mvc3lzL3ZtL2xvd21lbV9yZXNlcnZlX3JhdGlvCisyNTYgICAgIDI1NiAgICAgMzIKKy0KK05vdGU6ICMgb2YgdGhpcyBlbGVtZW50cyBpcyBvbmUgZmV3ZXIgdGhhbiBudW1iZXIgb2Ygem9uZXMuIEJlY2F1c2UgdGhlIGhpZ2hlc3QKKyAgICAgIHpvbmUncyB2YWx1ZSBpcyBub3QgbmVjZXNzYXJ5IGZvciBmb2xsb3dpbmcgY2FsY3VsYXRpb24uCisKK0J1dCwgdGhlc2UgdmFsdWVzIGFyZSBub3QgdXNlZCBkaXJlY3RseS4gVGhlIGtlcm5lbCBjYWxjdWxhdGVzICMgb2YgcHJvdGVjdGlvbgorcGFnZXMgZm9yIGVhY2ggem9uZXMgZnJvbSB0aGVtLiBUaGVzZSBhcmUgc2hvd24gYXMgYXJyYXkgb2YgcHJvdGVjdGlvbiBwYWdlcworaW4gL3Byb2Mvem9uZWluZm8gbGlrZSBmb2xsb3dpbmdzLiAoVGhpcyBpcyBhbiBleGFtcGxlIG9mIHg4Ni02NCBib3gpLgorRWFjaCB6b25lIGhhcyBhbiBhcnJheSBvZiBwcm90ZWN0aW9uIHBhZ2VzIGxpa2UgdGhpcy4KKworLQorTm9kZSAwLCB6b25lICAgICAgRE1BCisgIHBhZ2VzIGZyZWUgICAgIDEzNTUKKyAgICAgICAgbWluICAgICAgMworICAgICAgICBsb3cgICAgICAzCisgICAgICAgIGhpZ2ggICAgIDQKKwk6CisJOgorICAgIG51bWFfb3RoZXIgICAwCisgICAgICAgIHByb3RlY3Rpb246ICgwLCAyMDA0LCAyMDA0LCAyMDA0KQorCV5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXgorICBwYWdlc2V0cworICAgIGNwdTogMCBwY3A6IDAKKyAgICAgICAgOgorLQorVGhlc2UgcHJvdGVjdGlvbnMgYXJlIGFkZGVkIHRvIHNjb3JlIHRvIGp1ZGdlIHdoZXRoZXIgdGhpcyB6b25lIHNob3VsZCBiZSB1c2VkCitmb3IgcGFnZSBhbGxvY2F0aW9uIG9yIHNob3VsZCBiZSByZWNsYWltZWQuCisKK0luIHRoaXMgZXhhbXBsZSwgaWYgbm9ybWFsIHBhZ2VzIChpbmRleD0yKSBhcmUgcmVxdWlyZWQgdG8gdGhpcyBETUEgem9uZSBhbmQKK3BhZ2VzX2hpZ2ggaXMgdXNlZCBmb3Igd2F0ZXJtYXJrLCB0aGUga2VybmVsIGp1ZGdlcyB0aGlzIHpvbmUgc2hvdWxkIG5vdCBiZQordXNlZCBiZWNhdXNlIHBhZ2VzX2ZyZWUoMTM1NSkgaXMgc21hbGxlciB0aGFuIHdhdGVybWFyayArIHByb3RlY3Rpb25bMl0KKyg0ICsgMjAwNCA9IDIwMDgpLiBJZiB0aGlzIHByb3RlY3Rpb24gdmFsdWUgaXMgMCwgdGhpcyB6b25lIHdvdWxkIGJlIHVzZWQgZm9yCitub3JtYWwgcGFnZSByZXF1aXJlbWVudC4gSWYgcmVxdWlyZW1lbnQgaXMgRE1BIHpvbmUoaW5kZXg9MCksIHByb3RlY3Rpb25bMF0KKyg9MCkgaXMgdXNlZC4KKworem9uZVtpXSdzIHByb3RlY3Rpb25bal0gaXMgY2FsY3VsYXRlZCBieSBmb2xsb3dpbmcgZXhwcmVzc2lvbi4KKworKGkgPCBqKToKKyAgem9uZVtpXS0+cHJvdGVjdGlvbltqXQorICA9ICh0b3RhbCBzdW1zIG9mIHByZXNlbnRfcGFnZXMgZnJvbSB6b25lW2krMV0gdG8gem9uZVtqXSBvbiB0aGUgbm9kZSkKKyAgICAvIGxvd21lbV9yZXNlcnZlX3JhdGlvW2ldOworKGkgPSBqKToKKyAgIChzaG91bGQgbm90IGJlIHByb3RlY3RlZC4gPSAwOworKGkgPiBqKToKKyAgIChub3QgbmVjZXNzYXJ5LCBidXQgbG9va3MgMCkKKworVGhlIGRlZmF1bHQgdmFsdWVzIG9mIGxvd21lbV9yZXNlcnZlX3JhdGlvW2ldIGFyZQorICAgIDI1NiAoaWYgem9uZVtpXSBtZWFucyBETUEgb3IgRE1BMzIgem9uZSkKKyAgICAzMiAgKG90aGVycykuCitBcyBhYm92ZSBleHByZXNzaW9uLCB0aGV5IGFyZSByZWNpcHJvY2FsIG51bWJlciBvZiByYXRpby4KKzI1NiBtZWFucyAxLzI1Ni4gIyBvZiBwcm90ZWN0aW9uIHBhZ2VzIGJlY29tZXMgYWJvdXQgIjAuMzklIiBvZiB0b3RhbCBwcmVzZW50CitwYWdlcyBvZiBoaWdoZXIgem9uZXMgb24gdGhlIG5vZGUuCisKK0lmIHlvdSB3b3VsZCBsaWtlIHRvIHByb3RlY3QgbW9yZSBwYWdlcywgc21hbGxlciB2YWx1ZXMgYXJlIGVmZmVjdGl2ZS4KK1RoZSBtaW5pbXVtIHZhbHVlIGlzIDEgKDEvMSAtPiAxMDAlKS4KIAogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIApAQCAtMTEyLDkgKzI3NSw5IEBACiAKIG1pbl9mcmVlX2tieXRlczoKIAotVGhpcyBpcyB1c2VkIHRvIGZvcmNlIHRoZSBMaW51eCBWTSB0byBrZWVwIGEgbWluaW11bSBudW1iZXIgCitUaGlzIGlzIHVzZWQgdG8gZm9yY2UgdGhlIExpbnV4IFZNIHRvIGtlZXAgYSBtaW5pbXVtIG51bWJlcgogb2Yga2lsb2J5dGVzIGZyZWUuICBUaGUgVk0gdXNlcyB0aGlzIG51bWJlciB0byBjb21wdXRlIGEgcGFnZXNfbWluCi12YWx1ZSBmb3IgZWFjaCBsb3dtZW0gem9uZSBpbiB0aGUgc3lzdGVtLiAgRWFjaCBsb3dtZW0gem9uZSBnZXRzIAordmFsdWUgZm9yIGVhY2ggbG93bWVtIHpvbmUgaW4gdGhlIHN5c3RlbS4gIEVhY2ggbG93bWVtIHpvbmUgZ2V0cwogYSBudW1iZXIgb2YgcmVzZXJ2ZWQgZnJlZSBwYWdlcyBiYXNlZCBwcm9wb3J0aW9uYWxseSBvbiBpdHMgc2l6ZS4KIAogU29tZSBtaW5pbWFsIGFtb3VudCBvZiBtZW1vcnkgaXMgbmVlZGVkIHRvIHNhdGlzZnkgUEZfTUVNQUxMT0MKQEAgLTEyMyw3MyArMjg2LDYgQEAKIAogU2V0dGluZyB0aGlzIHRvbyBoaWdoIHdpbGwgT09NIHlvdXIgbWFjaGluZSBpbnN0YW50bHkuCiAKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLXBlcmNwdV9wYWdlbGlzdF9mcmFjdGlvbgotCi1UaGlzIGlzIHRoZSBmcmFjdGlvbiBvZiBwYWdlcyBhdCBtb3N0IChoaWdoIG1hcmsgcGNwLT5oaWdoKSBpbiBlYWNoIHpvbmUgdGhhdAotYXJlIGFsbG9jYXRlZCBmb3IgZWFjaCBwZXIgY3B1IHBhZ2UgbGlzdC4gIFRoZSBtaW4gdmFsdWUgZm9yIHRoaXMgaXMgOC4gIEl0Ci1tZWFucyB0aGF0IHdlIGRvbid0IGFsbG93IG1vcmUgdGhhbiAxLzh0aCBvZiBwYWdlcyBpbiBlYWNoIHpvbmUgdG8gYmUKLWFsbG9jYXRlZCBpbiBhbnkgc2luZ2xlIHBlcl9jcHVfcGFnZWxpc3QuICBUaGlzIGVudHJ5IG9ubHkgY2hhbmdlcyB0aGUgdmFsdWUKLW9mIGhvdCBwZXIgY3B1IHBhZ2VsaXN0cy4gIFVzZXIgY2FuIHNwZWNpZnkgYSBudW1iZXIgbGlrZSAxMDAgdG8gYWxsb2NhdGUKLTEvMTAwdGggb2YgZWFjaCB6b25lIHRvIGVhY2ggcGVyIGNwdSBwYWdlIGxpc3QuCi0KLVRoZSBiYXRjaCB2YWx1ZSBvZiBlYWNoIHBlciBjcHUgcGFnZWxpc3QgaXMgYWxzbyB1cGRhdGVkIGFzIGEgcmVzdWx0LiAgSXQgaXMKLXNldCB0byBwY3AtPmhpZ2gvNC4gIFRoZSB1cHBlciBsaW1pdCBvZiBiYXRjaCBpcyAoUEFHRV9TSElGVCAqIDgpCi0KLVRoZSBpbml0aWFsIHZhbHVlIGlzIHplcm8uICBLZXJuZWwgZG9lcyBub3QgdXNlIHRoaXMgdmFsdWUgYXQgYm9vdCB0aW1lIHRvIHNldAotdGhlIGhpZ2ggd2F0ZXIgbWFya3MgZm9yIGVhY2ggcGVyIGNwdSBwYWdlIGxpc3QuCi0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi16b25lX3JlY2xhaW1fbW9kZToKLQotWm9uZV9yZWNsYWltX21vZGUgYWxsb3dzIHNvbWVvbmUgdG8gc2V0IG1vcmUgb3IgbGVzcyBhZ2dyZXNzaXZlIGFwcHJvYWNoZXMgdG8KLXJlY2xhaW0gbWVtb3J5IHdoZW4gYSB6b25lIHJ1bnMgb3V0IG9mIG1lbW9yeS4gSWYgaXQgaXMgc2V0IHRvIHplcm8gdGhlbiBubwotem9uZSByZWNsYWltIG9jY3Vycy4gQWxsb2NhdGlvbnMgd2lsbCBiZSBzYXRpc2ZpZWQgZnJvbSBvdGhlciB6b25lcyAvIG5vZGVzCi1pbiB0aGUgc3lzdGVtLgotCi1UaGlzIGlzIHZhbHVlIE9SZWQgdG9nZXRoZXIgb2YKLQotMQk9IFpvbmUgcmVjbGFpbSBvbgotMgk9IFpvbmUgcmVjbGFpbSB3cml0ZXMgZGlydHkgcGFnZXMgb3V0Ci00CT0gWm9uZSByZWNsYWltIHN3YXBzIHBhZ2VzCi0KLXpvbmVfcmVjbGFpbV9tb2RlIGlzIHNldCBkdXJpbmcgYm9vdHVwIHRvIDEgaWYgaXQgaXMgZGV0ZXJtaW5lZCB0aGF0IHBhZ2VzCi1mcm9tIHJlbW90ZSB6b25lcyB3aWxsIGNhdXNlIGEgbWVhc3VyYWJsZSBwZXJmb3JtYW5jZSByZWR1Y3Rpb24uIFRoZQotcGFnZSBhbGxvY2F0b3Igd2lsbCB0aGVuIHJlY2xhaW0gZWFzaWx5IHJldXNhYmxlIHBhZ2VzICh0aG9zZSBwYWdlCi1jYWNoZSBwYWdlcyB0aGF0IGFyZSBjdXJyZW50bHkgbm90IHVzZWQpIGJlZm9yZSBhbGxvY2F0aW5nIG9mZiBub2RlIHBhZ2VzLgotCi1JdCBtYXkgYmUgYmVuZWZpY2lhbCB0byBzd2l0Y2ggb2ZmIHpvbmUgcmVjbGFpbSBpZiB0aGUgc3lzdGVtIGlzCi11c2VkIGZvciBhIGZpbGUgc2VydmVyIGFuZCBhbGwgb2YgbWVtb3J5IHNob3VsZCBiZSB1c2VkIGZvciBjYWNoaW5nIGZpbGVzCi1mcm9tIGRpc2suIEluIHRoYXQgY2FzZSB0aGUgY2FjaGluZyBlZmZlY3QgaXMgbW9yZSBpbXBvcnRhbnQgdGhhbgotZGF0YSBsb2NhbGl0eS4KLQotQWxsb3dpbmcgem9uZSByZWNsYWltIHRvIHdyaXRlIG91dCBwYWdlcyBzdG9wcyBwcm9jZXNzZXMgdGhhdCBhcmUKLXdyaXRpbmcgbGFyZ2UgYW1vdW50cyBvZiBkYXRhIGZyb20gZGlydHlpbmcgcGFnZXMgb24gb3RoZXIgbm9kZXMuIFpvbmUKLXJlY2xhaW0gd2lsbCB3cml0ZSBvdXQgZGlydHkgcGFnZXMgaWYgYSB6b25lIGZpbGxzIHVwIGFuZCBzbyBlZmZlY3RpdmVseQotdGhyb3R0bGUgdGhlIHByb2Nlc3MuIFRoaXMgbWF5IGRlY3JlYXNlIHRoZSBwZXJmb3JtYW5jZSBvZiBhIHNpbmdsZSBwcm9jZXNzCi1zaW5jZSBpdCBjYW5ub3QgdXNlIGFsbCBvZiBzeXN0ZW0gbWVtb3J5IHRvIGJ1ZmZlciB0aGUgb3V0Z29pbmcgd3JpdGVzCi1hbnltb3JlIGJ1dCBpdCBwcmVzZXJ2ZSB0aGUgbWVtb3J5IG9uIG90aGVyIG5vZGVzIHNvIHRoYXQgdGhlIHBlcmZvcm1hbmNlCi1vZiBvdGhlciBwcm9jZXNzZXMgcnVubmluZyBvbiBvdGhlciBub2RlcyB3aWxsIG5vdCBiZSBhZmZlY3RlZC4KLQotQWxsb3dpbmcgcmVndWxhciBzd2FwIGVmZmVjdGl2ZWx5IHJlc3RyaWN0cyBhbGxvY2F0aW9ucyB0byB0aGUgbG9jYWwKLW5vZGUgdW5sZXNzIGV4cGxpY2l0bHkgb3ZlcnJpZGRlbiBieSBtZW1vcnkgcG9saWNpZXMgb3IgY3B1c2V0Ci1jb25maWd1cmF0aW9ucy4KLQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1taW5fdW5tYXBwZWRfcmF0aW86Ci0KLVRoaXMgaXMgYXZhaWxhYmxlIG9ubHkgb24gTlVNQSBrZXJuZWxzLgotCi1BIHBlcmNlbnRhZ2Ugb2YgdGhlIHRvdGFsIHBhZ2VzIGluIGVhY2ggem9uZS4gIFpvbmUgcmVjbGFpbSB3aWxsIG9ubHkKLW9jY3VyIGlmIG1vcmUgdGhhbiB0aGlzIHBlcmNlbnRhZ2Ugb2YgcGFnZXMgYXJlIGZpbGUgYmFja2VkIGFuZCB1bm1hcHBlZC4KLVRoaXMgaXMgdG8gaW5zdXJlIHRoYXQgYSBtaW5pbWFsIGFtb3VudCBvZiBsb2NhbCBwYWdlcyBpcyBzdGlsbCBhdmFpbGFibGUgZm9yCi1maWxlIEkvTyBldmVuIGlmIHRoZSBub2RlIGlzIG92ZXJhbGxvY2F0ZWQuCi0KLVRoZSBkZWZhdWx0IGlzIDEgcGVyY2VudC4KLQogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCiBtaW5fc2xhYl9yYXRpbzoKQEAgLTIxMCw2OSArMzA2LDE2IEBACiAKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAotcGFuaWNfb25fb29tCittaW5fdW5tYXBwZWRfcmF0aW86CiAKLVRoaXMgZW5hYmxlcyBvciBkaXNhYmxlcyBwYW5pYyBvbiBvdXQtb2YtbWVtb3J5IGZlYXR1cmUuCitUaGlzIGlzIGF2YWlsYWJsZSBvbmx5IG9uIE5VTUEga2VybmVscy4KIAotSWYgdGhpcyBpcyBzZXQgdG8gMCwgdGhlIGtlcm5lbCB3aWxsIGtpbGwgc29tZSByb2d1ZSBwcm9jZXNzLAotY2FsbGVkIG9vbV9raWxsZXIuICBVc3VhbGx5LCBvb21fa2lsbGVyIGNhbiBraWxsIHJvZ3VlIHByb2Nlc3NlcyBhbmQKLXN5c3RlbSB3aWxsIHN1cnZpdmUuCitBIHBlcmNlbnRhZ2Ugb2YgdGhlIHRvdGFsIHBhZ2VzIGluIGVhY2ggem9uZS4gIFpvbmUgcmVjbGFpbSB3aWxsIG9ubHkKK29jY3VyIGlmIG1vcmUgdGhhbiB0aGlzIHBlcmNlbnRhZ2Ugb2YgcGFnZXMgYXJlIGZpbGUgYmFja2VkIGFuZCB1bm1hcHBlZC4KK1RoaXMgaXMgdG8gaW5zdXJlIHRoYXQgYSBtaW5pbWFsIGFtb3VudCBvZiBsb2NhbCBwYWdlcyBpcyBzdGlsbCBhdmFpbGFibGUgZm9yCitmaWxlIEkvTyBldmVuIGlmIHRoZSBub2RlIGlzIG92ZXJhbGxvY2F0ZWQuCiAKLUlmIHRoaXMgaXMgc2V0IHRvIDEsIHRoZSBrZXJuZWwgcGFuaWNzIHdoZW4gb3V0LW9mLW1lbW9yeSBoYXBwZW5zLgotSG93ZXZlciwgaWYgYSBwcm9jZXNzIGxpbWl0cyB1c2luZyBub2RlcyBieSBtZW1wb2xpY3kvY3B1c2V0cywKLWFuZCB0aG9zZSBub2RlcyBiZWNvbWUgbWVtb3J5IGV4aGF1c3Rpb24gc3RhdHVzLCBvbmUgcHJvY2VzcwotbWF5IGJlIGtpbGxlZCBieSBvb20ta2lsbGVyLiBObyBwYW5pYyBvY2N1cnMgaW4gdGhpcyBjYXNlLgotQmVjYXVzZSBvdGhlciBub2RlcycgbWVtb3J5IG1heSBiZSBmcmVlLiBUaGlzIG1lYW5zIHN5c3RlbSB0b3RhbCBzdGF0dXMKLW1heSBiZSBub3QgZmF0YWwgeWV0LgotCi1JZiB0aGlzIGlzIHNldCB0byAyLCB0aGUga2VybmVsIHBhbmljcyBjb21wdWxzb3JpbHkgZXZlbiBvbiB0aGUKLWFib3ZlLW1lbnRpb25lZC4KLQotVGhlIGRlZmF1bHQgdmFsdWUgaXMgMC4KLTEgYW5kIDIgYXJlIGZvciBmYWlsb3ZlciBvZiBjbHVzdGVyaW5nLiBQbGVhc2Ugc2VsZWN0IGVpdGhlcgotYWNjb3JkaW5nIHRvIHlvdXIgcG9saWN5IG9mIGZhaWxvdmVyLgotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLW9vbV9kdW1wX3Rhc2tzCi0KLUVuYWJsZXMgYSBzeXN0ZW0td2lkZSB0YXNrIGR1bXAgKGV4Y2x1ZGluZyBrZXJuZWwgdGhyZWFkcykgdG8gYmUKLXByb2R1Y2VkIHdoZW4gdGhlIGtlcm5lbCBwZXJmb3JtcyBhbiBPT00ta2lsbGluZyBhbmQgaW5jbHVkZXMgc3VjaAotaW5mb3JtYXRpb24gYXMgcGlkLCB1aWQsIHRnaWQsIHZtIHNpemUsIHJzcywgY3B1LCBvb21fYWRqIHNjb3JlLCBhbmQKLW5hbWUuICBUaGlzIGlzIGhlbHBmdWwgdG8gZGV0ZXJtaW5lIHdoeSB0aGUgT09NIGtpbGxlciB3YXMgaW52b2tlZAotYW5kIHRvIGlkZW50aWZ5IHRoZSByb2d1ZSB0YXNrIHRoYXQgY2F1c2VkIGl0LgotCi1JZiB0aGlzIGlzIHNldCB0byB6ZXJvLCB0aGlzIGluZm9ybWF0aW9uIGlzIHN1cHByZXNzZWQuICBPbiB2ZXJ5Ci1sYXJnZSBzeXN0ZW1zIHdpdGggdGhvdXNhbmRzIG9mIHRhc2tzIGl0IG1heSBub3QgYmUgZmVhc2libGUgdG8gZHVtcAotdGhlIG1lbW9yeSBzdGF0ZSBpbmZvcm1hdGlvbiBmb3IgZWFjaCBvbmUuICBTdWNoIHN5c3RlbXMgc2hvdWxkIG5vdAotYmUgZm9yY2VkIHRvIGluY3VyIGEgcGVyZm9ybWFuY2UgcGVuYWx0eSBpbiBPT00gY29uZGl0aW9ucyB3aGVuIHRoZQotaW5mb3JtYXRpb24gbWF5IG5vdCBiZSBkZXNpcmVkLgotCi1JZiB0aGlzIGlzIHNldCB0byBub24temVybywgdGhpcyBpbmZvcm1hdGlvbiBpcyBzaG93biB3aGVuZXZlciB0aGUKLU9PTSBraWxsZXIgYWN0dWFsbHkga2lsbHMgYSBtZW1vcnktaG9nZ2luZyB0YXNrLgotCi1UaGUgZGVmYXVsdCB2YWx1ZSBpcyAwLgotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLW9vbV9raWxsX2FsbG9jYXRpbmdfdGFzawotCi1UaGlzIGVuYWJsZXMgb3IgZGlzYWJsZXMga2lsbGluZyB0aGUgT09NLXRyaWdnZXJpbmcgdGFzayBpbgotb3V0LW9mLW1lbW9yeSBzaXR1YXRpb25zLgotCi1JZiB0aGlzIGlzIHNldCB0byB6ZXJvLCB0aGUgT09NIGtpbGxlciB3aWxsIHNjYW4gdGhyb3VnaCB0aGUgZW50aXJlCi10YXNrbGlzdCBhbmQgc2VsZWN0IGEgdGFzayBiYXNlZCBvbiBoZXVyaXN0aWNzIHRvIGtpbGwuICBUaGlzIG5vcm1hbGx5Ci1zZWxlY3RzIGEgcm9ndWUgbWVtb3J5LWhvZ2dpbmcgdGFzayB0aGF0IGZyZWVzIHVwIGEgbGFyZ2UgYW1vdW50IG9mCi1tZW1vcnkgd2hlbiBraWxsZWQuCi0KLUlmIHRoaXMgaXMgc2V0IHRvIG5vbi16ZXJvLCB0aGUgT09NIGtpbGxlciBzaW1wbHkga2lsbHMgdGhlIHRhc2sgdGhhdAotdHJpZ2dlcmVkIHRoZSBvdXQtb2YtbWVtb3J5IGNvbmRpdGlvbi4gIFRoaXMgYXZvaWRzIHRoZSBleHBlbnNpdmUKLXRhc2tsaXN0IHNjYW4uCi0KLUlmIHBhbmljX29uX29vbSBpcyBzZWxlY3RlZCwgaXQgdGFrZXMgcHJlY2VkZW5jZSBvdmVyIHdoYXRldmVyIHZhbHVlCi1pcyB1c2VkIGluIG9vbV9raWxsX2FsbG9jYXRpbmdfdGFzay4KLQotVGhlIGRlZmF1bHQgdmFsdWUgaXMgMC4KK1RoZSBkZWZhdWx0IGlzIDEgcGVyY2VudC4KIAogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIApAQCAtMjg5LDYgKzMzMiw1MCBAQAogCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCitucl9odWdlcGFnZXMKKworQ2hhbmdlIHRoZSBtaW5pbXVtIHNpemUgb2YgdGhlIGh1Z2VwYWdlIHBvb2wuCisKK1NlZSBEb2N1bWVudGF0aW9uL3ZtL2h1Z2V0bGJwYWdlLnR4dAorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitucl9vdmVyY29tbWl0X2h1Z2VwYWdlcworCitDaGFuZ2UgdGhlIG1heGltdW0gc2l6ZSBvZiB0aGUgaHVnZXBhZ2UgcG9vbC4gVGhlIG1heGltdW0gaXMKK25yX2h1Z2VwYWdlcyArIG5yX292ZXJjb21taXRfaHVnZXBhZ2VzLgorCitTZWUgRG9jdW1lbnRhdGlvbi92bS9odWdldGxicGFnZS50eHQKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworbnJfcGRmbHVzaF90aHJlYWRzCisKK1RoZSBjdXJyZW50IG51bWJlciBvZiBwZGZsdXNoIHRocmVhZHMuICBUaGlzIHZhbHVlIGlzIHJlYWQtb25seS4KK1RoZSB2YWx1ZSBjaGFuZ2VzIGFjY29yZGluZyB0byB0aGUgbnVtYmVyIG9mIGRpcnR5IHBhZ2VzIGluIHRoZSBzeXN0ZW0uCisKK1doZW4gbmVjY2Vzc2FyeSwgYWRkaXRpb25hbCBwZGZsdXNoIHRocmVhZHMgYXJlIGNyZWF0ZWQsIG9uZSBwZXIgc2Vjb25kLCB1cCB0bworbnJfcGRmbHVzaF90aHJlYWRzX21heC4KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworbnJfdHJpbV9wYWdlcworCitUaGlzIGlzIGF2YWlsYWJsZSBvbmx5IG9uIE5PTU1VIGtlcm5lbHMuCisKK1RoaXMgdmFsdWUgYWRqdXN0cyB0aGUgZXhjZXNzIHBhZ2UgdHJpbW1pbmcgYmVoYXZpb3VyIG9mIHBvd2VyLW9mLTIgYWxpZ25lZAorTk9NTVUgbW1hcCBhbGxvY2F0aW9ucy4KKworQSB2YWx1ZSBvZiAwIGRpc2FibGVzIHRyaW1taW5nIG9mIGFsbG9jYXRpb25zIGVudGlyZWx5LCB3aGlsZSBhIHZhbHVlIG9mIDEKK3RyaW1zIGV4Y2VzcyBwYWdlcyBhZ2dyZXNzaXZlbHkuIEFueSB2YWx1ZSA+PSAxIGFjdHMgYXMgdGhlIHdhdGVybWFyayB3aGVyZQordHJpbW1pbmcgb2YgYWxsb2NhdGlvbnMgaXMgaW5pdGlhdGVkLgorCitUaGUgZGVmYXVsdCB2YWx1ZSBpcyAxLgorCitTZWUgRG9jdW1lbnRhdGlvbi9ub21tdS1tbWFwLnR4dCBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwogbnVtYV96b25lbGlzdF9vcmRlcgogCiBUaGlzIHN5c2N0bCBpcyBvbmx5IGZvciBOVU1BLgpAQCAtMzM0LDE3ICs0MjEsMTk5IEBACiAKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKLW5yX2h1Z2VwYWdlcworb29tX2R1bXBfdGFza3MKIAotQ2hhbmdlIHRoZSBtaW5pbXVtIHNpemUgb2YgdGhlIGh1Z2VwYWdlIHBvb2wuCitFbmFibGVzIGEgc3lzdGVtLXdpZGUgdGFzayBkdW1wIChleGNsdWRpbmcga2VybmVsIHRocmVhZHMpIHRvIGJlCitwcm9kdWNlZCB3aGVuIHRoZSBrZXJuZWwgcGVyZm9ybXMgYW4gT09NLWtpbGxpbmcgYW5kIGluY2x1ZGVzIHN1Y2gKK2luZm9ybWF0aW9uIGFzIHBpZCwgdWlkLCB0Z2lkLCB2bSBzaXplLCByc3MsIGNwdSwgb29tX2FkaiBzY29yZSwgYW5kCituYW1lLiAgVGhpcyBpcyBoZWxwZnVsIHRvIGRldGVybWluZSB3aHkgdGhlIE9PTSBraWxsZXIgd2FzIGludm9rZWQKK2FuZCB0byBpZGVudGlmeSB0aGUgcm9ndWUgdGFzayB0aGF0IGNhdXNlZCBpdC4KIAotU2VlIERvY3VtZW50YXRpb24vdm0vaHVnZXRsYnBhZ2UudHh0CitJZiB0aGlzIGlzIHNldCB0byB6ZXJvLCB0aGlzIGluZm9ybWF0aW9uIGlzIHN1cHByZXNzZWQuICBPbiB2ZXJ5CitsYXJnZSBzeXN0ZW1zIHdpdGggdGhvdXNhbmRzIG9mIHRhc2tzIGl0IG1heSBub3QgYmUgZmVhc2libGUgdG8gZHVtcAordGhlIG1lbW9yeSBzdGF0ZSBpbmZvcm1hdGlvbiBmb3IgZWFjaCBvbmUuICBTdWNoIHN5c3RlbXMgc2hvdWxkIG5vdAorYmUgZm9yY2VkIHRvIGluY3VyIGEgcGVyZm9ybWFuY2UgcGVuYWx0eSBpbiBPT00gY29uZGl0aW9ucyB3aGVuIHRoZQoraW5mb3JtYXRpb24gbWF5IG5vdCBiZSBkZXNpcmVkLgorCitJZiB0aGlzIGlzIHNldCB0byBub24temVybywgdGhpcyBpbmZvcm1hdGlvbiBpcyBzaG93biB3aGVuZXZlciB0aGUKK09PTSBraWxsZXIgYWN0dWFsbHkga2lsbHMgYSBtZW1vcnktaG9nZ2luZyB0YXNrLgorCitUaGUgZGVmYXVsdCB2YWx1ZSBpcyAwLgogCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCi1ucl9vdmVyY29tbWl0X2h1Z2VwYWdlcworb29tX2tpbGxfYWxsb2NhdGluZ190YXNrCiAKLUNoYW5nZSB0aGUgbWF4aW11bSBzaXplIG9mIHRoZSBodWdlcGFnZSBwb29sLiBUaGUgbWF4aW11bSBpcwotbnJfaHVnZXBhZ2VzICsgbnJfb3ZlcmNvbW1pdF9odWdlcGFnZXMuCitUaGlzIGVuYWJsZXMgb3IgZGlzYWJsZXMga2lsbGluZyB0aGUgT09NLXRyaWdnZXJpbmcgdGFzayBpbgorb3V0LW9mLW1lbW9yeSBzaXR1YXRpb25zLgogCi1TZWUgRG9jdW1lbnRhdGlvbi92bS9odWdldGxicGFnZS50eHQKK0lmIHRoaXMgaXMgc2V0IHRvIHplcm8sIHRoZSBPT00ga2lsbGVyIHdpbGwgc2NhbiB0aHJvdWdoIHRoZSBlbnRpcmUKK3Rhc2tsaXN0IGFuZCBzZWxlY3QgYSB0YXNrIGJhc2VkIG9uIGhldXJpc3RpY3MgdG8ga2lsbC4gIFRoaXMgbm9ybWFsbHkKK3NlbGVjdHMgYSByb2d1ZSBtZW1vcnktaG9nZ2luZyB0YXNrIHRoYXQgZnJlZXMgdXAgYSBsYXJnZSBhbW91bnQgb2YKK21lbW9yeSB3aGVuIGtpbGxlZC4KKworSWYgdGhpcyBpcyBzZXQgdG8gbm9uLXplcm8sIHRoZSBPT00ga2lsbGVyIHNpbXBseSBraWxscyB0aGUgdGFzayB0aGF0Cit0cmlnZ2VyZWQgdGhlIG91dC1vZi1tZW1vcnkgY29uZGl0aW9uLiAgVGhpcyBhdm9pZHMgdGhlIGV4cGVuc2l2ZQordGFza2xpc3Qgc2Nhbi4KKworSWYgcGFuaWNfb25fb29tIGlzIHNlbGVjdGVkLCBpdCB0YWtlcyBwcmVjZWRlbmNlIG92ZXIgd2hhdGV2ZXIgdmFsdWUKK2lzIHVzZWQgaW4gb29tX2tpbGxfYWxsb2NhdGluZ190YXNrLgorCitUaGUgZGVmYXVsdCB2YWx1ZSBpcyAwLgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitvdmVyY29tbWl0X21lbW9yeToKKworVGhpcyB2YWx1ZSBjb250YWlucyBhIGZsYWcgdGhhdCBlbmFibGVzIG1lbW9yeSBvdmVyY29tbWl0bWVudC4KKworV2hlbiB0aGlzIGZsYWcgaXMgMCwgdGhlIGtlcm5lbCBhdHRlbXB0cyB0byBlc3RpbWF0ZSB0aGUgYW1vdW50CitvZiBmcmVlIG1lbW9yeSBsZWZ0IHdoZW4gdXNlcnNwYWNlIHJlcXVlc3RzIG1vcmUgbWVtb3J5LgorCitXaGVuIHRoaXMgZmxhZyBpcyAxLCB0aGUga2VybmVsIHByZXRlbmRzIHRoZXJlIGlzIGFsd2F5cyBlbm91Z2gKK21lbW9yeSB1bnRpbCBpdCBhY3R1YWxseSBydW5zIG91dC4KKworV2hlbiB0aGlzIGZsYWcgaXMgMiwgdGhlIGtlcm5lbCB1c2VzIGEgIm5ldmVyIG92ZXJjb21taXQiCitwb2xpY3kgdGhhdCBhdHRlbXB0cyB0byBwcmV2ZW50IGFueSBvdmVyY29tbWl0IG9mIG1lbW9yeS4KKworVGhpcyBmZWF0dXJlIGNhbiBiZSB2ZXJ5IHVzZWZ1bCBiZWNhdXNlIHRoZXJlIGFyZSBhIGxvdCBvZgorcHJvZ3JhbXMgdGhhdCBtYWxsb2MoKSBodWdlIGFtb3VudHMgb2YgbWVtb3J5ICJqdXN0LWluLWNhc2UiCithbmQgZG9uJ3QgdXNlIG11Y2ggb2YgaXQuCisKK1RoZSBkZWZhdWx0IHZhbHVlIGlzIDAuCisKK1NlZSBEb2N1bWVudGF0aW9uL3ZtL292ZXJjb21taXQtYWNjb3VudGluZyBhbmQKK3NlY3VyaXR5L2NvbW1vbmNhcC5jOjpjYXBfdm1fZW5vdWdoX21lbW9yeSgpIGZvciBtb3JlIGluZm9ybWF0aW9uLgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitvdmVyY29tbWl0X3JhdGlvOgorCitXaGVuIG92ZXJjb21taXRfbWVtb3J5IGlzIHNldCB0byAyLCB0aGUgY29tbWl0dGVkIGFkZHJlc3MKK3NwYWNlIGlzIG5vdCBwZXJtaXR0ZWQgdG8gZXhjZWVkIHN3YXAgcGx1cyB0aGlzIHBlcmNlbnRhZ2UKK29mIHBoeXNpY2FsIFJBTS4gIFNlZSBhYm92ZS4KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworcGFnZS1jbHVzdGVyCisKK3BhZ2UtY2x1c3RlciBjb250cm9scyB0aGUgbnVtYmVyIG9mIHBhZ2VzIHdoaWNoIGFyZSB3cml0dGVuIHRvIHN3YXAgaW4KK2Egc2luZ2xlIGF0dGVtcHQuICBUaGUgc3dhcCBJL08gc2l6ZS4KKworSXQgaXMgYSBsb2dhcml0aG1pYyB2YWx1ZSAtIHNldHRpbmcgaXQgdG8gemVybyBtZWFucyAiMSBwYWdlIiwgc2V0dGluZworaXQgdG8gMSBtZWFucyAiMiBwYWdlcyIsIHNldHRpbmcgaXQgdG8gMiBtZWFucyAiNCBwYWdlcyIsIGV0Yy4KKworVGhlIGRlZmF1bHQgdmFsdWUgaXMgdGhyZWUgKGVpZ2h0IHBhZ2VzIGF0IGEgdGltZSkuICBUaGVyZSBtYXkgYmUgc29tZQorc21hbGwgYmVuZWZpdHMgaW4gdHVuaW5nIHRoaXMgdG8gYSBkaWZmZXJlbnQgdmFsdWUgaWYgeW91ciB3b3JrbG9hZCBpcworc3dhcC1pbnRlbnNpdmUuCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworcGFuaWNfb25fb29tCisKK1RoaXMgZW5hYmxlcyBvciBkaXNhYmxlcyBwYW5pYyBvbiBvdXQtb2YtbWVtb3J5IGZlYXR1cmUuCisKK0lmIHRoaXMgaXMgc2V0IHRvIDAsIHRoZSBrZXJuZWwgd2lsbCBraWxsIHNvbWUgcm9ndWUgcHJvY2VzcywKK2NhbGxlZCBvb21fa2lsbGVyLiAgVXN1YWxseSwgb29tX2tpbGxlciBjYW4ga2lsbCByb2d1ZSBwcm9jZXNzZXMgYW5kCitzeXN0ZW0gd2lsbCBzdXJ2aXZlLgorCitJZiB0aGlzIGlzIHNldCB0byAxLCB0aGUga2VybmVsIHBhbmljcyB3aGVuIG91dC1vZi1tZW1vcnkgaGFwcGVucy4KK0hvd2V2ZXIsIGlmIGEgcHJvY2VzcyBsaW1pdHMgdXNpbmcgbm9kZXMgYnkgbWVtcG9saWN5L2NwdXNldHMsCithbmQgdGhvc2Ugbm9kZXMgYmVjb21lIG1lbW9yeSBleGhhdXN0aW9uIHN0YXR1cywgb25lIHByb2Nlc3MKK21heSBiZSBraWxsZWQgYnkgb29tLWtpbGxlci4gTm8gcGFuaWMgb2NjdXJzIGluIHRoaXMgY2FzZS4KK0JlY2F1c2Ugb3RoZXIgbm9kZXMnIG1lbW9yeSBtYXkgYmUgZnJlZS4gVGhpcyBtZWFucyBzeXN0ZW0gdG90YWwgc3RhdHVzCittYXkgYmUgbm90IGZhdGFsIHlldC4KKworSWYgdGhpcyBpcyBzZXQgdG8gMiwgdGhlIGtlcm5lbCBwYW5pY3MgY29tcHVsc29yaWx5IGV2ZW4gb24gdGhlCithYm92ZS1tZW50aW9uZWQuCisKK1RoZSBkZWZhdWx0IHZhbHVlIGlzIDAuCisxIGFuZCAyIGFyZSBmb3IgZmFpbG92ZXIgb2YgY2x1c3RlcmluZy4gUGxlYXNlIHNlbGVjdCBlaXRoZXIKK2FjY29yZGluZyB0byB5b3VyIHBvbGljeSBvZiBmYWlsb3Zlci4KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitwZXJjcHVfcGFnZWxpc3RfZnJhY3Rpb24KKworVGhpcyBpcyB0aGUgZnJhY3Rpb24gb2YgcGFnZXMgYXQgbW9zdCAoaGlnaCBtYXJrIHBjcC0+aGlnaCkgaW4gZWFjaCB6b25lIHRoYXQKK2FyZSBhbGxvY2F0ZWQgZm9yIGVhY2ggcGVyIGNwdSBwYWdlIGxpc3QuICBUaGUgbWluIHZhbHVlIGZvciB0aGlzIGlzIDguICBJdAorbWVhbnMgdGhhdCB3ZSBkb24ndCBhbGxvdyBtb3JlIHRoYW4gMS84dGggb2YgcGFnZXMgaW4gZWFjaCB6b25lIHRvIGJlCithbGxvY2F0ZWQgaW4gYW55IHNpbmdsZSBwZXJfY3B1X3BhZ2VsaXN0LiAgVGhpcyBlbnRyeSBvbmx5IGNoYW5nZXMgdGhlIHZhbHVlCitvZiBob3QgcGVyIGNwdSBwYWdlbGlzdHMuICBVc2VyIGNhbiBzcGVjaWZ5IGEgbnVtYmVyIGxpa2UgMTAwIHRvIGFsbG9jYXRlCisxLzEwMHRoIG9mIGVhY2ggem9uZSB0byBlYWNoIHBlciBjcHUgcGFnZSBsaXN0LgorCitUaGUgYmF0Y2ggdmFsdWUgb2YgZWFjaCBwZXIgY3B1IHBhZ2VsaXN0IGlzIGFsc28gdXBkYXRlZCBhcyBhIHJlc3VsdC4gIEl0IGlzCitzZXQgdG8gcGNwLT5oaWdoLzQuICBUaGUgdXBwZXIgbGltaXQgb2YgYmF0Y2ggaXMgKFBBR0VfU0hJRlQgKiA4KQorCitUaGUgaW5pdGlhbCB2YWx1ZSBpcyB6ZXJvLiAgS2VybmVsIGRvZXMgbm90IHVzZSB0aGlzIHZhbHVlIGF0IGJvb3QgdGltZSB0byBzZXQKK3RoZSBoaWdoIHdhdGVyIG1hcmtzIGZvciBlYWNoIHBlciBjcHUgcGFnZSBsaXN0LgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitzdGF0X2ludGVydmFsCisKK1RoZSB0aW1lIGludGVydmFsIGJldHdlZW4gd2hpY2ggdm0gc3RhdGlzdGljcyBhcmUgdXBkYXRlZC4gIFRoZSBkZWZhdWx0CitpcyAxIHNlY29uZC4KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworc3dhcHBpbmVzcworCitUaGlzIGNvbnRyb2wgaXMgdXNlZCB0byBkZWZpbmUgaG93IGFnZ3Jlc3NpdmUgdGhlIGtlcm5lbCB3aWxsIHN3YXAKK21lbW9yeSBwYWdlcy4gIEhpZ2hlciB2YWx1ZXMgd2lsbCBpbmNyZWFzZSBhZ3Jlc3NpdmVuZXNzLCBsb3dlciB2YWx1ZXMKK2Rlc2NyZWFzZSB0aGUgYW1vdW50IG9mIHN3YXAuCisKK1RoZSBkZWZhdWx0IHZhbHVlIGlzIDYwLgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCit2ZnNfY2FjaGVfcHJlc3N1cmUKKy0tLS0tLS0tLS0tLS0tLS0tLQorCitDb250cm9scyB0aGUgdGVuZGVuY3kgb2YgdGhlIGtlcm5lbCB0byByZWNsYWltIHRoZSBtZW1vcnkgd2hpY2ggaXMgdXNlZCBmb3IKK2NhY2hpbmcgb2YgZGlyZWN0b3J5IGFuZCBpbm9kZSBvYmplY3RzLgorCitBdCB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB2ZnNfY2FjaGVfcHJlc3N1cmU9MTAwIHRoZSBrZXJuZWwgd2lsbCBhdHRlbXB0IHRvCityZWNsYWltIGRlbnRyaWVzIGFuZCBpbm9kZXMgYXQgYSAiZmFpciIgcmF0ZSB3aXRoIHJlc3BlY3QgdG8gcGFnZWNhY2hlIGFuZAorc3dhcGNhY2hlIHJlY2xhaW0uICBEZWNyZWFzaW5nIHZmc19jYWNoZV9wcmVzc3VyZSBjYXVzZXMgdGhlIGtlcm5lbCB0byBwcmVmZXIKK3RvIHJldGFpbiBkZW50cnkgYW5kIGlub2RlIGNhY2hlcy4gIEluY3JlYXNpbmcgdmZzX2NhY2hlX3ByZXNzdXJlIGJleW9uZCAxMDAKK2NhdXNlcyB0aGUga2VybmVsIHRvIHByZWZlciB0byByZWNsYWltIGRlbnRyaWVzIGFuZCBpbm9kZXMuCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK3pvbmVfcmVjbGFpbV9tb2RlOgorCitab25lX3JlY2xhaW1fbW9kZSBhbGxvd3Mgc29tZW9uZSB0byBzZXQgbW9yZSBvciBsZXNzIGFnZ3Jlc3NpdmUgYXBwcm9hY2hlcyB0bworcmVjbGFpbSBtZW1vcnkgd2hlbiBhIHpvbmUgcnVucyBvdXQgb2YgbWVtb3J5LiBJZiBpdCBpcyBzZXQgdG8gemVybyB0aGVuIG5vCit6b25lIHJlY2xhaW0gb2NjdXJzLiBBbGxvY2F0aW9ucyB3aWxsIGJlIHNhdGlzZmllZCBmcm9tIG90aGVyIHpvbmVzIC8gbm9kZXMKK2luIHRoZSBzeXN0ZW0uCisKK1RoaXMgaXMgdmFsdWUgT1JlZCB0b2dldGhlciBvZgorCisxCT0gWm9uZSByZWNsYWltIG9uCisyCT0gWm9uZSByZWNsYWltIHdyaXRlcyBkaXJ0eSBwYWdlcyBvdXQKKzQJPSBab25lIHJlY2xhaW0gc3dhcHMgcGFnZXMKKworem9uZV9yZWNsYWltX21vZGUgaXMgc2V0IGR1cmluZyBib290dXAgdG8gMSBpZiBpdCBpcyBkZXRlcm1pbmVkIHRoYXQgcGFnZXMKK2Zyb20gcmVtb3RlIHpvbmVzIHdpbGwgY2F1c2UgYSBtZWFzdXJhYmxlIHBlcmZvcm1hbmNlIHJlZHVjdGlvbi4gVGhlCitwYWdlIGFsbG9jYXRvciB3aWxsIHRoZW4gcmVjbGFpbSBlYXNpbHkgcmV1c2FibGUgcGFnZXMgKHRob3NlIHBhZ2UKK2NhY2hlIHBhZ2VzIHRoYXQgYXJlIGN1cnJlbnRseSBub3QgdXNlZCkgYmVmb3JlIGFsbG9jYXRpbmcgb2ZmIG5vZGUgcGFnZXMuCisKK0l0IG1heSBiZSBiZW5lZmljaWFsIHRvIHN3aXRjaCBvZmYgem9uZSByZWNsYWltIGlmIHRoZSBzeXN0ZW0gaXMKK3VzZWQgZm9yIGEgZmlsZSBzZXJ2ZXIgYW5kIGFsbCBvZiBtZW1vcnkgc2hvdWxkIGJlIHVzZWQgZm9yIGNhY2hpbmcgZmlsZXMKK2Zyb20gZGlzay4gSW4gdGhhdCBjYXNlIHRoZSBjYWNoaW5nIGVmZmVjdCBpcyBtb3JlIGltcG9ydGFudCB0aGFuCitkYXRhIGxvY2FsaXR5LgorCitBbGxvd2luZyB6b25lIHJlY2xhaW0gdG8gd3JpdGUgb3V0IHBhZ2VzIHN0b3BzIHByb2Nlc3NlcyB0aGF0IGFyZQord3JpdGluZyBsYXJnZSBhbW91bnRzIG9mIGRhdGEgZnJvbSBkaXJ0eWluZyBwYWdlcyBvbiBvdGhlciBub2Rlcy4gWm9uZQorcmVjbGFpbSB3aWxsIHdyaXRlIG91dCBkaXJ0eSBwYWdlcyBpZiBhIHpvbmUgZmlsbHMgdXAgYW5kIHNvIGVmZmVjdGl2ZWx5Cit0aHJvdHRsZSB0aGUgcHJvY2Vzcy4gVGhpcyBtYXkgZGVjcmVhc2UgdGhlIHBlcmZvcm1hbmNlIG9mIGEgc2luZ2xlIHByb2Nlc3MKK3NpbmNlIGl0IGNhbm5vdCB1c2UgYWxsIG9mIHN5c3RlbSBtZW1vcnkgdG8gYnVmZmVyIHRoZSBvdXRnb2luZyB3cml0ZXMKK2FueW1vcmUgYnV0IGl0IHByZXNlcnZlIHRoZSBtZW1vcnkgb24gb3RoZXIgbm9kZXMgc28gdGhhdCB0aGUgcGVyZm9ybWFuY2UKK29mIG90aGVyIHByb2Nlc3NlcyBydW5uaW5nIG9uIG90aGVyIG5vZGVzIHdpbGwgbm90IGJlIGFmZmVjdGVkLgorCitBbGxvd2luZyByZWd1bGFyIHN3YXAgZWZmZWN0aXZlbHkgcmVzdHJpY3RzIGFsbG9jYXRpb25zIHRvIHRoZSBsb2NhbAorbm9kZSB1bmxlc3MgZXhwbGljaXRseSBvdmVycmlkZGVuIGJ5IG1lbW9yeSBwb2xpY2llcyBvciBjcHVzZXQKK2NvbmZpZ3VyYXRpb25zLgorCis9PT09PT09PT09PT0gRW5kIG9mIERvY3VtZW50ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zeXNycS50eHQgYi9Eb2N1bWVudGF0aW9uL3N5c3JxLnR4dAppbmRleCAxMGEwMjYzLi45ZTU5MmM3IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3N5c3JxLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3N5c3JxLnR4dApAQCAtMSw2ICsxLDUgQEAKIExpbnV4IE1hZ2ljIFN5c3RlbSBSZXF1ZXN0IEtleSBIYWNrcwogRG9jdW1lbnRhdGlvbiBmb3Igc3lzcnEuYwotTGFzdCB1cGRhdGU6IDIwMDctQVVHLTA0CiAKICogIFdoYXQgaXMgdGhlIG1hZ2ljIFN5c1JxIGtleT8KIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KQEAgLTIxMSw2ICsyMTAsMjQgQEAKIGEgbG9jayAoeW91IGFyZSBhbHNvIGluIGFuIGludGVycnVwdCBoYW5kbGVyLCB3aGljaCBtZWFucyBkb24ndCBzbGVlcCEpLCBzbwogeW91IG11c3QgY2FsbCBfX2hhbmRsZV9zeXNycV9ub2xvY2sgaW5zdGVhZC4KIAorKiAgV2hlbiBJIGhpdCBhIFN5c1JxIGtleSBjb21iaW5hdGlvbiBvbmx5IHRoZSBoZWFkZXIgYXBwZWFycyBvbiB0aGUgY29uc29sZT8KK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CitTeXNycSBvdXRwdXQgaXMgc3ViamVjdCB0byB0aGUgc2FtZSBjb25zb2xlIGxvZ2xldmVsIGNvbnRyb2wgYXMgYWxsCitvdGhlciBjb25zb2xlIG91dHB1dC4gIFRoaXMgbWVhbnMgdGhhdCBpZiB0aGUga2VybmVsIHdhcyBib290ZWQgJ3F1aWV0JworYXMgaXMgY29tbW9uIG9uIGRpc3RybyBrZXJuZWxzIHRoZSBvdXRwdXQgbWF5IG5vdCBhcHBlYXIgb24gdGhlIGFjdHVhbAorY29uc29sZSwgZXZlbiB0aG91Z2ggaXQgd2lsbCBhcHBlYXIgaW4gdGhlIGRtZXNnIGJ1ZmZlciwgYW5kIGJlIGFjY2Vzc2libGUKK3ZpYSB0aGUgZG1lc2cgY29tbWFuZCBhbmQgdG8gdGhlIGNvbnN1bWVycyBvZiAvcHJvYy9rbXNnLiAgQXMgYSBzcGVjaWZpYworZXhjZXB0aW9uIHRoZSBoZWFkZXIgbGluZSBmcm9tIHRoZSBzeXNycSBjb21tYW5kIGlzIHBhc3NlZCB0byBhbGwgY29uc29sZQorY29uc3VtZXJzIGFzIGlmIHRoZSBjdXJyZW50IGxvZ2xldmVsIHdhcyBtYXhpbXVtLiAgSWYgb25seSB0aGUgaGVhZGVyCitpcyBlbWl0dGVkIGl0IGlzIGFsbW9zdCBjZXJ0YWluIHRoYXQgdGhlIGtlcm5lbCBsb2dsZXZlbCBpcyB0b28gbG93LgorU2hvdWxkIHlvdSByZXF1aXJlIHRoZSBvdXRwdXQgb24gdGhlIGNvbnNvbGUgY2hhbm5lbCB0aGVuIHlvdSB3aWxsIG5lZWQKK3RvIHRlbXBvcmFyaWx5IHVwIHRoZSBjb25zb2xlIGxvZ2xldmVsIHVzaW5nIGFsdC1zeXNycS04IG9yOgorCisgICAgZWNobyA4ID4gL3Byb2Mvc3lzcnEtdHJpZ2dlcgorCitSZW1lbWJlciB0byByZXR1cm4gdGhlIGxvZ2xldmVsIHRvIG5vcm1hbCBhZnRlciB0cmlnZ2VyaW5nIHRoZSBzeXNycQorY29tbWFuZCB5b3UgYXJlIGludGVyZXN0ZWQgaW4uCisKICogIEkgaGF2ZSBtb3JlIHF1ZXN0aW9ucywgd2hvIGNhbiBJIGFzaz8KIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KIEFuZCBJJ2xsIGFuc3dlciBhbnkgcXVlc3Rpb25zIGFib3V0IHRoZSByZWdpc3RyYXRpb24gc3lzdGVtIHlvdSBnb3QsIGFsc28KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdXNiL3Bvd2VyLW1hbmFnZW1lbnQudHh0IGIvRG9jdW1lbnRhdGlvbi91c2IvcG93ZXItbWFuYWdlbWVudC50eHQKaW5kZXggZTQ4ZWExZC4uYWQ2NDI2MSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi91c2IvcG93ZXItbWFuYWdlbWVudC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi91c2IvcG93ZXItbWFuYWdlbWVudC50eHQKQEAgLTMxMywxMSArMzEzLDEzIEBACiB0aGF0IGl0IHN1cHBvcnRzIGF1dG9zdXNwZW5kIGJ5IHNldHRpbmcgdGhlIC5zdXBwb3J0c19hdXRvc3VzcGVuZCBmbGFnCiBpbiBpdHMgdXNiX2RyaXZlciBzdHJ1Y3R1cmUuICBJdCBpcyB0aGVuIHJlc3BvbnNpYmxlIGZvciBpbmZvcm1pbmcgdGhlCiBVU0IgY29yZSB3aGVuZXZlciBvbmUgb2YgaXRzIGludGVyZmFjZXMgYmVjb21lcyBidXN5IG9yIGlkbGUuICBUaGUKLWRyaXZlciBkb2VzIHNvIGJ5IGNhbGxpbmcgdGhlc2UgdGhyZWUgZnVuY3Rpb25zOgorZHJpdmVyIGRvZXMgc28gYnkgY2FsbGluZyB0aGVzZSBmaXZlIGZ1bmN0aW9uczoKIAogCWludCAgdXNiX2F1dG9wbV9nZXRfaW50ZXJmYWNlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKTsKIAl2b2lkIHVzYl9hdXRvcG1fcHV0X2ludGVyZmFjZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50Zik7CiAJaW50ICB1c2JfYXV0b3BtX3NldF9pbnRlcmZhY2Uoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpOworCWludCAgdXNiX2F1dG9wbV9nZXRfaW50ZXJmYWNlX2FzeW5jKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKTsKKwl2b2lkIHVzYl9hdXRvcG1fcHV0X2ludGVyZmFjZV9hc3luYyhzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50Zik7CiAKIFRoZSBmdW5jdGlvbnMgd29yayBieSBtYWludGFpbmluZyBhIGNvdW50ZXIgaW4gdGhlIHVzYl9pbnRlcmZhY2UKIHN0cnVjdHVyZS4gIFdoZW4gaW50Zi0+cG1fdXNhZ2VfY291bnQgaXMgPiAwIHRoZW4gdGhlIGludGVyZmFjZSBpcwpAQCAtMzMwLDEwICszMzIsMTIgQEAKIFRoaXMgZmllbGQgaXMgdXNlZCBvbmx5IGJ5IHRoZSBVU0IgY29yZS4pCiAKIFRoZSBkcml2ZXIgb3ducyBpbnRmLT5wbV91c2FnZV9jb3VudDsgaXQgY2FuIG1vZGlmeSB0aGUgdmFsdWUgaG93ZXZlcgotYW5kIHdoZW5ldmVyIGl0IGxpa2VzLiAgQSBuaWNlIGFzcGVjdCBvZiB0aGUgdXNiX2F1dG9wbV8qIHJvdXRpbmVzIGlzCi10aGF0IHRoZSBjaGFuZ2VzIHRoZXkgbWFrZSBhcmUgcHJvdGVjdGVkIGJ5IHRoZSB1c2JfZGV2aWNlIHN0cnVjdHVyZSdzCi1QTSBtdXRleCAodWRldi0+cG1fbXV0ZXgpOyBob3dldmVyIGRyaXZlcnMgbWF5IGNoYW5nZSBwbV91c2FnZV9jb3VudAotd2l0aG91dCBob2xkaW5nIHRoZSBtdXRleC4KK2FuZCB3aGVuZXZlciBpdCBsaWtlcy4gIEEgbmljZSBhc3BlY3Qgb2YgdGhlIG5vbi1hc3luYyB1c2JfYXV0b3BtXyoKK3JvdXRpbmVzIGlzIHRoYXQgdGhlIGNoYW5nZXMgdGhleSBtYWtlIGFyZSBwcm90ZWN0ZWQgYnkgdGhlIHVzYl9kZXZpY2UKK3N0cnVjdHVyZSdzIFBNIG11dGV4ICh1ZGV2LT5wbV9tdXRleCk7IGhvd2V2ZXIgZHJpdmVycyBtYXkgY2hhbmdlCitwbV91c2FnZV9jb3VudCB3aXRob3V0IGhvbGRpbmcgdGhlIG11dGV4LiAgRHJpdmVycyB1c2luZyB0aGUgYXN5bmMKK3JvdXRpbmVzIGFyZSByZXNwb25zaWJsZSBmb3IgdGhlaXIgb3duIHN5bmNocm9uaXphdGlvbiBhbmQgbXV0dWFsCitleGNsdXNpb24uCiAKIAl1c2JfYXV0b3BtX2dldF9pbnRlcmZhY2UoKSBpbmNyZW1lbnRzIHBtX3VzYWdlX2NvdW50IGFuZAogCWF0dGVtcHRzIGFuIGF1dG9yZXN1bWUgaWYgdGhlIG5ldyB2YWx1ZSBpcyA+IDAgYW5kIHRoZQpAQCAtMzQ4LDYgKzM1MiwxNCBAQAogCWlzIHN1c3BlbmRlZCwgYW5kIGl0IGF0dGVtcHRzIGFuIGF1dG9zdXNwZW5kIGlmIHRoZSB2YWx1ZSBpcwogCTw9IDAgYW5kIHRoZSBkZXZpY2UgaXNuJ3Qgc3VzcGVuZGVkLgogCisJdXNiX2F1dG9wbV9nZXRfaW50ZXJmYWNlX2FzeW5jKCkgYW5kCisJdXNiX2F1dG9wbV9wdXRfaW50ZXJmYWNlX2FzeW5jKCkgZG8gYWxtb3N0IHRoZSBzYW1lIHRoaW5ncyBhcworCXRoZWlyIG5vbi1hc3luYyBjb3VudGVycGFydHMuICBUaGUgZGlmZmVyZW5jZXMgYXJlOiB0aGV5IGRvCisJbm90IGFjcXVpcmUgdGhlIFBNIG11dGV4LCBhbmQgdGhleSB1c2UgYSB3b3JrcXVldWUgdG8gZG8gdGhlaXIKKwlqb2JzLiAgQXMgYSByZXN1bHQgdGhleSBjYW4gYmUgY2FsbGVkIGluIGFuIGF0b21pYyBjb250ZXh0LAorCXN1Y2ggYXMgYW4gVVJCJ3MgY29tcGxldGlvbiBoYW5kbGVyLCBidXQgd2hlbiB0aGV5IHJldHVybiB0aGUKKwlkZXZpY2Ugd2lsbCBub3QgZ2VuZXJhbGx5IG5vdCB5ZXQgYmUgaW4gdGhlIGRlc2lyZWQgc3RhdGUuCisKIFRoZXJlIGFsc28gYXJlIGEgY291cGxlIG9mIHV0aWxpdHkgcm91dGluZXMgZHJpdmVycyBjYW4gdXNlOgogCiAJdXNiX2F1dG9wbV9lbmFibGUoKSBzZXRzIHBtX3VzYWdlX2NudCB0byAwIGFuZCB0aGVuIGNhbGxzCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3cxL21hc3RlcnMvMDAtSU5ERVggYi9Eb2N1bWVudGF0aW9uL3cxL21hc3RlcnMvMDAtSU5ERVgKaW5kZXggN2IwY2VhYS4uZDYzZmEwMiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi93MS9tYXN0ZXJzLzAwLUlOREVYCisrKyBiL0RvY3VtZW50YXRpb24vdzEvbWFzdGVycy8wMC1JTkRFWApAQCAtNCw1ICs0LDcgQEAKIAktIFRoZSBNYXhpbS9EYWxsYXMgU2VtaWNvbmR1Y3RvciBEUzI0ODIgcHJvdmlkZXMgMS13aXJlIGJ1c3Nlcy4KIGRzMjQ5MAogCS0gVGhlIE1heGltL0RhbGxhcyBTZW1pY29uZHVjdG9yIERTMjQ5MCBidWlsZHMgVVNCIDwtPiBXMSBicmlkZ2VzLgorbXhjX3cxCisJLSBXMSBtYXN0ZXIgY29udHJvbGxlciBkcml2ZXIgZm91bmQgb24gRnJlZXNjYWxlIE1YMi9NWDMgU29DcwogdzEtZ3BpbwogCS0gR1BJTyAxLXdpcmUgYnVzIG1hc3RlciBkcml2ZXIuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3cxL21hc3RlcnMvbXhjLXcxIGIvRG9jdW1lbnRhdGlvbi93MS9tYXN0ZXJzL214Yy13MQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45N2Y2MTk5Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi93MS9tYXN0ZXJzL214Yy13MQpAQCAtMCwwICsxLDExIEBACitLZXJuZWwgZHJpdmVyIG14Y193MQorPT09PT09PT09PT09PT09PT09PT0KKworU3VwcG9ydGVkIGNoaXBzOgorICAqIEZyZWVzY2FsZSBNWDI3LCBNWDMxIGFuZCBwcm9iYWJseSBvdGhlciBpLk1YIFNvQ3MKKyAgICBEYXRhc2hlZXRzOgorICAgICAgICBodHRwOi8vd3d3LmZyZWVzY2FsZS5jb20vZmlsZXMvMzJiaXQvZG9jL2RhdGFfc2hlZXQvTUNJTVgzMS5wZGY/ZnBzcD0xCisJaHR0cDovL3d3dy5mcmVlc2NhbGUuY29tL2ZpbGVzL2RzcC9NQ0lNWDI3LnBkZj9mcHNwPTEKKworQXV0aG9yOiBPcmlnaW5hbGx5IGJhc2VkIG9uIEZyZWVzY2FsZSBjb2RlLCBwcmVwYXJlZCBmb3IgbWFpbmxpbmUgYnkKKwlTYXNjaGEgSGF1ZXIgPHMuaGF1ZXJAcGVuZ3V0cm9uaXguZGU+CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3cxL3cxLm5ldGxpbmsgYi9Eb2N1bWVudGF0aW9uL3cxL3cxLm5ldGxpbmsKaW5kZXggMzY0MGM3YzguLjgwNDQ0NWYgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vdzEvdzEubmV0bGluaworKysgYi9Eb2N1bWVudGF0aW9uL3cxL3cxLm5ldGxpbmsKQEAgLTUsNjkgKzUsMTU3IEBACiA9PT09PT09PT09PT09CiAKIFRoZXJlIGFyZSB0aHJlZSB0eXBlcyBvZiBtZXNzYWdlcyBiZXR3ZWVuIHcxIGNvcmUgYW5kIHVzZXJzcGFjZToKLTEuIEV2ZW50cy4gVGhleSBhcmUgZ2VuZXJhdGVkIGVhY2ggdGltZSBuZXcgbWFzdGVyIG9yIHNsYXZlIGRldmljZSBmb3VuZAotCWVpdGhlciBkdWUgdG8gYXV0b21hdGljIG9yIHJlcXVlc3RlZCBzZWFyY2guCi0yLiBVc2Vyc3BhY2UgY29tbWFuZHMuIEluY2x1ZGVzIHJlYWQvd3JpdGUgYW5kIHNlYXJjaC9hbGFybSBzZWFyY2ggY29tYW1uZHMuCisxLiBFdmVudHMuIFRoZXkgYXJlIGdlbmVyYXRlZCBlYWNoIHRpbWUgbmV3IG1hc3RlciBvciBzbGF2ZSBkZXZpY2UKKwlmb3VuZCBlaXRoZXIgZHVlIHRvIGF1dG9tYXRpYyBvciByZXF1ZXN0ZWQgc2VhcmNoLgorMi4gVXNlcnNwYWNlIGNvbW1hbmRzLgogMy4gUmVwbGllcyB0byB1c2Vyc3BhY2UgY29tbWFuZHMuCiAKIAogUHJvdG9jb2wuCiA9PT09PT09PQogCi1bc3RydWN0IGNuX21zZ10gLSBjb25uZWN0b3IgaGVhZGVyLiBJdCdzIGxlbmd0aCBmaWVsZCBpcyBlcXVhbCB0byBzaXplIG9mIHRoZSBhdHRhY2hlZCBkYXRhLgorW3N0cnVjdCBjbl9tc2ddIC0gY29ubmVjdG9yIGhlYWRlci4KKwlJdHMgbGVuZ3RoIGZpZWxkIGlzIGVxdWFsIHRvIHNpemUgb2YgdGhlIGF0dGFjaGVkIGRhdGEKIFtzdHJ1Y3QgdzFfbmV0bGlua19tc2ddIC0gdzEgbmV0bGluayBoZWFkZXIuCiAJX191OCB0eXBlIAktIG1lc3NhZ2UgdHlwZS4KLQkJCVcxX1NMQVZFX0FERC9XMV9TTEFWRV9SRU1PVkUgLSBzbGF2ZSBhZGQvcmVtb3ZlIGV2ZW50cy4KLQkJCVcxX01BU1RFUl9BREQvVzFfTUFTVEVSX1JFTU9WRSAtIG1hc3RlciBhZGQvcmVtb3ZlIGV2ZW50cy4KLQkJCVcxX01BU1RFUl9DTUQgLSB1c2Vyc3BhY2UgY29tbWFuZCBmb3IgYnVzIG1hc3RlciBkZXZpY2UgKHNlYXJjaC9hbGFybSBzZWFyY2gpLgotCQkJVzFfU0xBVkVfQ01EIC0gdXNlcnNwYWNlIGNvbW1hbmQgZm9yIHNsYXZlIGRldmljZSAocmVhZC93cml0ZS8gc2VhcmNoL2FsYXJtIHNlYXJjaAotCQkJCQlmb3IgYnVzIG1hc3RlciBkZXZpY2Ugd2hlcmUgZ2l2ZW4gc2xhdmUgZGV2aWNlIGZvdW5kKS4KKwkJCVcxX0xJU1RfTUFTVEVSUworCQkJCWxpc3QgY3VycmVudCBidXMgbWFzdGVycworCQkJVzFfU0xBVkVfQUREL1cxX1NMQVZFX1JFTU9WRQorCQkJCXNsYXZlIGFkZC9yZW1vdmUgZXZlbnRzCisJCQlXMV9NQVNURVJfQUREL1cxX01BU1RFUl9SRU1PVkUKKwkJCQltYXN0ZXIgYWRkL3JlbW92ZSBldmVudHMKKwkJCVcxX01BU1RFUl9DTUQKKwkJCQl1c2Vyc3BhY2UgY29tbWFuZCBmb3IgYnVzIG1hc3RlcgorCQkJCWRldmljZSAoc2VhcmNoL2FsYXJtIHNlYXJjaCkKKwkJCVcxX1NMQVZFX0NNRAorCQkJCXVzZXJzcGFjZSBjb21tYW5kIGZvciBzbGF2ZSBkZXZpY2UKKwkJCQkocmVhZC93cml0ZS90b3VjaCkKIAlfX3U4IHJlcwktIHJlc2VydmVkCi0JX191MTYgbGVuCS0gc2l6ZSBvZiBhdHRhY2hlZCB0byB0aGlzIGhlYWRlciBkYXRhLgorCV9fdTE2IGxlbgktIHNpemUgb2YgZGF0YSBhdHRhY2hlZCB0byB0aGlzIGhlYWRlciBkYXRhCiAJdW5pb24gewotCQlfX3U4IGlkOwkJCSAtIHNsYXZlIHVuaXF1ZSBkZXZpY2UgaWQKKwkJX191OCBpZFs4XTsJCQkgLSBzbGF2ZSB1bmlxdWUgZGV2aWNlIGlkCiAJCXN0cnVjdCB3MV9tc3QgewotCQkJX191MzIJCWlkOwkgLSBtYXN0ZXIncyBpZC4KKwkJCV9fdTMyCQlpZDsJIC0gbWFzdGVyJ3MgaWQKIAkJCV9fdTMyCQlyZXM7CSAtIHJlc2VydmVkCiAJCX0gbXN0OwogCX0gaWQ7CiAKLVtzdHJ1Y3J0IHcxX25ldGxpbmtfY21kXSAtIGNvbW1hbmQgZm9yIGdpdmVkIG1hc3RlciBvciBzbGF2ZSBkZXZpY2UuCitbc3RydWN0IHcxX25ldGxpbmtfY21kXSAtIGNvbW1hbmQgZm9yIGdpdmVuIG1hc3RlciBvciBzbGF2ZSBkZXZpY2UuCiAJX191OCBjbWQJLSBjb21tYW5kIG9wY29kZS4KLQkJCVcxX0NNRF9SRUFEIAktIHJlYWQgY29tbWFuZC4KLQkJCVcxX0NNRF9XUklURQktIHdyaXRlIGNvbW1hbmQuCi0JCQlXMV9DTURfU0VBUkNICS0gc2VhcmNoIGNvbW1hbmQuCi0JCQlXMV9DTURfQUxBUk1fU0VBUkNIIC0gYWxhcm0gc2VhcmNoIGNvbW1hbmQuCisJCQlXMV9DTURfUkVBRCAJLSByZWFkIGNvbW1hbmQKKwkJCVcxX0NNRF9XUklURQktIHdyaXRlIGNvbW1hbmQKKwkJCVcxX0NNRF9UT1VDSAktIHRvdWNoIGNvbW1hbmQKKwkJCQkod3JpdGUgYW5kIHNhbXBsZSBkYXRhIGJhY2sgdG8gdXNlcnNwYWNlKQorCQkJVzFfQ01EX1NFQVJDSAktIHNlYXJjaCBjb21tYW5kCisJCQlXMV9DTURfQUxBUk1fU0VBUkNIIC0gYWxhcm0gc2VhcmNoIGNvbW1hbmQKIAlfX3U4IHJlcwktIHJlc2VydmVkCi0JX191MTYgbGVuCS0gbGVuZ3RoIG9mIGRhdGEgZm9yIHRoaXMgY29tbWFuZC4KLQkJCUZvciByZWFkIGNvbW1hbmQgZGF0YSBtdXN0IGJlIGFsbG9jYXRlZCBsaWtlIGZvciB3cml0ZSBjb21tYW5kLgotCV9fdTggZGF0YVswXQktIGRhdGEgZm9yIHRoaXMgY29tbWFuZC4KKwlfX3UxNiBsZW4JLSBsZW5ndGggb2YgZGF0YSBmb3IgdGhpcyBjb21tYW5kCisJCUZvciByZWFkIGNvbW1hbmQgZGF0YSBtdXN0IGJlIGFsbG9jYXRlZCBsaWtlIGZvciB3cml0ZSBjb21tYW5kCisJX191OCBkYXRhWzBdCS0gZGF0YSBmb3IgdGhpcyBjb21tYW5kCiAKIAotRWFjaCBjb25uZWN0b3IgbWVzc2FnZSBjYW4gaW5jbHVkZSBvbmUgb3IgbW9yZSB3MV9uZXRsaW5rX21zZyB3aXRoIHplcm8gb2YgbW9yZSBhdHRhY2hlZCB3MV9uZXRsaW5rX2NtZCBtZXNzYWdlcy4KK0VhY2ggY29ubmVjdG9yIG1lc3NhZ2UgY2FuIGluY2x1ZGUgb25lIG9yIG1vcmUgdzFfbmV0bGlua19tc2cgd2l0aAoremVybyBvciBtb3JlIGF0dGFjaGVkIHcxX25ldGxpbmtfY21kIG1lc3NhZ2VzLgogCi1Gb3IgZXZlbnQgbWVzc2FnZXMgdGhlcmUgYXJlIG5vIHcxX25ldGxpbmtfY21kIGVtYmVkZGVkIHN0cnVjdHVyZXMsIG9ubHkgY29ubmVjdG9yIGhlYWRlcgotYW5kIHcxX25ldGxpbmtfbXNnIHN0cnVjdXRyZSB3aXRoICJsZW4iIGZpZWxkIGJlaW5nIHplcm8gYW5kIGZpbGxlZCB0eXBlIChvbmUgb2YgZXZlbnQgdHlwZXMpCi1hbmQgaWQgLSBlaXRoZXIgOCBieXRlcyBvZiBzbGF2ZSB1bmlxdWUgaWQgaW4gaG9zdCBvcmRlciwgb3IgbWFzdGVyJ3MgaWQsIHdoaWNoIGlzIGFzc2lnbmVkCi10byBidXMgbWFzdGVyIGRldmljZSB3aGVuIGl0IGlzIGFkZGVkIHRvIHcxIGNvcmUuCitGb3IgZXZlbnQgbWVzc2FnZXMgdGhlcmUgYXJlIG5vIHcxX25ldGxpbmtfY21kIGVtYmVkZGVkIHN0cnVjdHVyZXMsCitvbmx5IGNvbm5lY3RvciBoZWFkZXIgYW5kIHcxX25ldGxpbmtfbXNnIHN0cnVjdXRyZSB3aXRoICJsZW4iIGZpZWxkCitiZWluZyB6ZXJvIGFuZCBmaWxsZWQgdHlwZSAob25lIG9mIGV2ZW50IHR5cGVzKSBhbmQgaWQ6CitlaXRoZXIgOCBieXRlcyBvZiBzbGF2ZSB1bmlxdWUgaWQgaW4gaG9zdCBvcmRlciwKK29yIG1hc3RlcidzIGlkLCB3aGljaCBpcyBhc3NpZ25lZCB0byBidXMgbWFzdGVyIGRldmljZQord2hlbiBpdCBpcyBhZGRlZCB0byB3MSBjb3JlLgogCi1DdXJyZW50bHkgcmVwbGllcyB0byB1c2Vyc3BhY2UgY29tbWFuZHMgYXJlIG9ubHkgZ2VuZXJhdGVkIGZvciByZWFkIGNvbW1hbmQgcmVxdWVzdC4KLU9uZSByZXBseSBpcyBnZW5lcmF0ZWQgZXhhY3RseSBmb3Igb25lIHcxX25ldGxpbmtfY21kIHJlYWQgcmVxdWVzdC4KLVJlcGxpZXMgYXJlIG5vdCBjb21iaW5lZCB3aGVuIHNlbnQgLSBpLmUuIHR5cGljYWwgcmVwbHkgbWVzc2FnZXMgbG9va3MgbGlrZSB0aGUgZm9sbG93aW5nOgorQ3VycmVudGx5IHJlcGxpZXMgdG8gdXNlcnNwYWNlIGNvbW1hbmRzIGFyZSBvbmx5IGdlbmVyYXRlZCBmb3IgcmVhZAorY29tbWFuZCByZXF1ZXN0LiBPbmUgcmVwbHkgaXMgZ2VuZXJhdGVkIGV4YWN0bHkgZm9yIG9uZSB3MV9uZXRsaW5rX2NtZAorcmVhZCByZXF1ZXN0LiBSZXBsaWVzIGFyZSBub3QgY29tYmluZWQgd2hlbiBzZW50IC0gaS5lLiB0eXBpY2FsIHJlcGx5CittZXNzYWdlcyBsb29rcyBsaWtlIHRoZSBmb2xsb3dpbmc6CisKIFtjbl9tc2ddW3cxX25ldGxpbmtfbXNnXVt3MV9uZXRsaW5rX2NtZF0KLWNuX21zZy5sZW4gPSBzaXplb2Yoc3RydWN0IHcxX25ldGxpbmtfbXNnKSArIHNpemVvZihzdHJ1Y3QgdzFfbmV0bGlua19jbWQpICsgY21kLT5sZW47Citjbl9tc2cubGVuID0gc2l6ZW9mKHN0cnVjdCB3MV9uZXRsaW5rX21zZykgKworCSAgICAgc2l6ZW9mKHN0cnVjdCB3MV9uZXRsaW5rX2NtZCkgKworCSAgICAgY21kLT5sZW47CiB3MV9uZXRsaW5rX21zZy5sZW4gPSBzaXplb2Yoc3RydWN0IHcxX25ldGxpbmtfY21kKSArIGNtZC0+bGVuOwogdzFfbmV0bGlua19jbWQubGVuID0gY21kLT5sZW47CiAKK1JlcGxpZXMgdG8gVzFfTElTVF9NQVNURVJTIHNob3VsZCBzZW5kIGEgbWVzc2FnZSBiYWNrIHRvIHRoZSB1c2Vyc3BhY2UKK3doaWNoIHdpbGwgY29udGFpbiBsaXN0IG9mIGFsbCByZWdpc3RlcmVkIG1hc3RlciBpZHMgaW4gdGhlIGZvbGxvd2luZworZm9ybWF0OgorCisJY25fbXNnIChDTl9XMV9JRFguQ05fVzFfVkFMIGFzIGlkLCBsZW4gaXMgZXF1YWwgdG8gc2l6ZW9mKHN0cnVjdAorCXcxX25ldGxpbmtfbXNnKSBwbHVzIG51bWJlciBvZiBtYXN0ZXJzIG11bHRpcGxlZCBieSA0KQorCXcxX25ldGxpbmtfbXNnICh0eXBlOiBXMV9MSVNUX01BU1RFUlMsIGxlbiBpcyBlcXVhbCB0bworCQludW1iZXIgb2YgbWFzdGVycyBtdWx0aXBsaWVkIGJ5IDQgKHUzMiBzaXplKSkKKwlpZDAgLi4uIGlkTgorCisJRWFjaCBtZXNzYWdlIGlzIGF0IG1vc3QgNGsgaW4gc2l6ZSwgc28gaWYgbnVtYmVyIG9mIG1hc3RlciBkZXZpY2VzCisJZXhjZWVkcyB0aGlzLCBpdCB3aWxsIGJlIHNwbGl0IGludG8gc2V2ZXJhbCBtZXNzYWdlcywKKwljbi5zZXEgd2lsbCBiZSBpbmNyZWFzZWQgZm9yIGVhY2ggb25lLgorCitXMSBzZWFyY2ggYW5kIGFsYXJtIHNlYXJjaCBjb21tYW5kcy4KK3JlcXVlc3Q6CitbY25fbXNnXQorICBbdzFfbmV0bGlua19tc2cgdHlwZSA9IFcxX01BU1RFUl9DTUQKKyAgCWlkIGlzIGVxdWFsIHRvIHRoZSBidXMgbWFzdGVyIGlkIHRvIHVzZSBmb3Igc2VhcmNoaW5nXQorICBbdzFfbmV0bGlua19jbWQgY21kID0gVzFfQ01EX1NFQVJDSCBvciBXMV9DTURfQUxBUk1fU0VBUkNIXQorCityZXBseToKKyAgW2NuX21zZywgYWNrID0gMSBhbmQgaW5jcmVhc2luZywgMCBtZWFucyB0aGUgbGFzdCBtZXNzYWdlLAorICAJc2VxIGlzIGVxdWFsIHRvIHRoZSByZXF1ZXN0IHNlcV0KKyAgW3cxX25ldGxpbmtfbXNnIHR5cGUgPSBXMV9NQVNURVJfQ01EXQorICBbdzFfbmV0bGlua19jbWQgY21kID0gVzFfQ01EX1NFQVJDSCBvciBXMV9DTURfQUxBUk1fU0VBUkNICisJbGVuIGlzIGVxdWFsIHRvIG51bWJlciBvZiBJRHMgbXVsdGlwbGllZCBieSA4XQorICBbNjRiaXQtaWQwIC4uLiA2NGJpdC1pZE5dCitMZW5ndGggaW4gZWFjaCBoZWFkZXIgY29ycmVzcG9uZHMgdG8gdGhlIHNpemUgb2YgdGhlIGRhdGEgYmVoaW5kIGl0LCBzbwordzFfbmV0bGlua19jbWQtPmxlbiA9IE4gKiA4OyB3aGVyZSBOIGlzIG51bWJlciBvZiBJRHMgaW4gdGhpcyBtZXNzYWdlLgorCUNhbiBiZSB6ZXJvLgordzFfbmV0bGlua19tc2ctPmxlbiA9IHNpemVvZihzdHJ1Y3QgdzFfbmV0bGlua19jbWQpICsgTiAqIDg7Citjbl9tc2ctPmxlbiA9IHNpemVvZihzdHJ1Y3QgdzFfbmV0bGlua19tc2cpICsKKwkgICAgICBzaXplb2Yoc3RydWN0IHcxX25ldGxpbmtfY21kKSArCisJICAgICAgTio4OworCitXMSByZXNldCBjb21tYW5kLgorW2NuX21zZ10KKyAgW3cxX25ldGxpbmtfbXNnIHR5cGUgPSBXMV9NQVNURVJfQ01ECisgIAlpZCBpcyBlcXVhbCB0byB0aGUgYnVzIG1hc3RlciBpZCB0byB1c2UgZm9yIHNlYXJjaGluZ10KKyAgW3cxX25ldGxpbmtfY21kIGNtZCA9IFcxX0NNRF9SRVNFVF0KKworCitDb21tYW5kIHN0YXR1cyByZXBsaWVzLgorPT09PT09PT09PT09PT09PT09PT09PQorCitFYWNoIGNvbW1hbmQgKGVpdGhlciByb290LCBtYXN0ZXIgb3Igc2xhdmUgd2l0aCBvciB3aXRob3V0IHcxX25ldGxpbmtfY21kCitzdHJ1Y3R1cmUpIHdpbGwgYmUgJ2Fja2VkJyBieSB0aGUgdzEgY29yZS4gRm9ybWF0IG9mIHRoZSByZXBseSBpcyB0aGUgc2FtZQorYXMgcmVxdWVzdCBtZXNzYWdlIGV4Y2VwdCB0aGF0IGxlbmd0aCBwYXJhbWV0ZXJzIGRvIG5vdCBhY2NvdW50IGZvciBkYXRhCityZXF1ZXN0ZWQgYnkgdGhlIHVzZXIsIGkuZS4gcmVhZC93cml0ZS90b3VjaCBJTyByZXF1ZXN0cyB3aWxsIG5vdCBjb250YWluCitkYXRhLCBzbyB3MV9uZXRsaW5rX2NtZC5sZW4gd2lsbCBiZSAwLCB3MV9uZXRsaW5rX21zZy5sZW4gd2lsbCBiZSBzaXplCitvZiB0aGUgdzFfbmV0bGlua19jbWQgc3RydWN0dXJlIGFuZCBjbl9tc2cubGVuIHdpbGwgYmUgZXF1YWwgdG8gdGhlIHN1bQorb2YgdGhlIHNpemVvZihzdHJ1Y3QgdzFfbmV0bGlua19tc2cpIGFuZCBzaXplb2Yoc3RydWN0IHcxX25ldGxpbmtfY21kKS4KK0lmIHJlcGx5IGlzIGdlbmVyYXRlZCBmb3IgbWFzdGVyIG9yIHJvb3QgY29tbWFuZCAod2hpY2ggZG8gbm90IGhhdmUKK3cxX25ldGxpbmtfY21kIGF0dGFjaGVkKSwgcmVwbHkgd2lsbCBjb250YWluIG9ubHkgY25fbXNnIGFuZCB3MV9uZXRsaW5rX21zZworc3RydWN0aXJlcy4KKwordzFfbmV0bGlua19tc2cuc3RhdHVzIGZpZWxkIHdpbGwgY2FycnkgcG9zaXRpdmUgZXJyb3IgdmFsdWUKKyhFSU5WQUwgZm9yIGV4YW1wbGUpIG9yIHplcm8gaW4gY2FzZSBvZiBzdWNjZXNzLgorCitBbGwgb3RoZXIgZmllbGRzIGluIGV2ZXJ5IHN0cnVjdHVyZSB3aWxsIG1pcnJvciB0aGUgc2FtZSBwYXJhbWV0ZXJzIGluIHRoZQorcmVxdWVzdCBtZXNzYWdlIChleGNlcHQgbGVuZ3RocyBhcyBkZXNjcmliZWQgYWJvdmUpLgorCitTdGF0dXMgcmVwbHkgaXMgZ2VuZXJhdGVkIGZvciBldmVyeSB3MV9uZXRsaW5rX2NtZCBlbWJlZGRlZCBpbiB0aGUKK3cxX25ldGxpbmtfbXNnLCBpZiB0aGVyZSBhcmUgbm8gdzFfbmV0bGlua19jbWQgc3RydWN0dXJlcywKK3JlcGx5IHdpbGwgYmUgZ2VuZXJhdGVkIGZvciB0aGUgdzFfbmV0bGlua19tc2cuCisKK0FsbCB3MV9uZXRsaW5rX2NtZCBjb21tYW5kIHN0cnVjdHVyZXMgYXJlIGhhbmRsZWQgaW4gZXZlcnkgdzFfbmV0bGlua19tc2csCitldmVuIGlmIHRoZXJlIHdlcmUgZXJyb3JzLCBvbmx5IGxlbmd0aCBtaXNtYXRjaCBpbnRlcnJ1cHRzIG1lc3NhZ2UgcHJvY2Vzc2luZy4KKwogCiBPcGVyYXRpb24gc3RlcHMgaW4gdzEgY29yZSB3aGVuIG5ldyBjb21tYW5kIGlzIHJlY2VpdmVkLgogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCi1XaGVuIG5ldyBtZXNzYWdlICh3MV9uZXRsaW5rX21zZykgaXMgcmVjZWl2ZWQgdzEgY29yZSBkZXRlY3RzIGlmIGl0IGlzIG1hc3RlciBvZiBzbGF2ZSByZXF1ZXN0LAotYWNjb3JkaW5nIHRvIHcxX25ldGxpbmtfbXNnLnR5cGUgZmllbGQuCitXaGVuIG5ldyBtZXNzYWdlICh3MV9uZXRsaW5rX21zZykgaXMgcmVjZWl2ZWQgdzEgY29yZSBkZXRlY3RzIGlmIGl0IGlzCittYXN0ZXIgb3Igc2xhdmUgcmVxdWVzdCwgYWNjb3JkaW5nIHRvIHcxX25ldGxpbmtfbXNnLnR5cGUgZmllbGQuCiBUaGVuIG1hc3RlciBvciBzbGF2ZSBkZXZpY2UgaXMgc2VhcmNoZWQgZm9yLgotV2hlbiBmb3VuZCwgbWFzdGVyIGRldmljZSAocmVxdWVzdGVkIG9yIHRob3NlIG9uZSBvbiB3aGVyZSBzbGF2ZSBkZXZpY2UgaXMgZm91bmQpIGlzIGxvY2tlZC4KLUlmIHNsYXZlIGNvbW1hbmQgaXMgcmVxdWVzdGVkLCB0aGVuIHJlc2V0L3NlbGVjdCBwcm9jZWR1cmUgaXMgc3RhcnRlZCB0byBzZWxlY3QgZ2l2ZW4gZGV2aWNlLgorV2hlbiBmb3VuZCwgbWFzdGVyIGRldmljZSAocmVxdWVzdGVkIG9yIHRob3NlIG9uZSBvbiB3aGVyZSBzbGF2ZSBkZXZpY2UKK2lzIGZvdW5kKSBpcyBsb2NrZWQuIElmIHNsYXZlIGNvbW1hbmQgaXMgcmVxdWVzdGVkLCB0aGVuIHJlc2V0L3NlbGVjdAorcHJvY2VkdXJlIGlzIHN0YXJ0ZWQgdG8gc2VsZWN0IGdpdmVuIGRldmljZS4KIAogVGhlbiBhbGwgcmVxdWVzdGVkIGluIHcxX25ldGxpbmtfbXNnIG9wZXJhdGlvbnMgYXJlIHBlcmZvcm1lZCBvbmUgYnkgb25lLgogSWYgY29tbWFuZCByZXF1aXJlcyByZXBseSAobGlrZSByZWFkIGNvbW1hbmQpIGl0IGlzIHNlbnQgb24gY29tbWFuZCBjb21wbGV0aW9uLgpAQCAtODIsOCArMTcwLDggQEAKIEVhY2ggY29ubmVjdG9yIG1lc3NhZ2UgaW5jbHVkZXMgdHdvIHUzMiBmaWVsZHMgYXMgImFkZHJlc3MiLgogdzEgdXNlcyBDTl9XMV9JRFggYW5kIENOX1cxX1ZBTCBkZWZpbmVkIGluIGluY2x1ZGUvbGludXgvY29ubmVjdG9yLmggaGVhZGVyLgogRWFjaCBtZXNzYWdlIGFsc28gaW5jbHVkZXMgc2VxdWVuY2UgYW5kIGFja25vd2xlZGdlIG51bWJlcnMuCi1TZXF1ZW5jZSBudW1iZXIgZm9yIGV2ZW50IG1lc3NhZ2VzIGlzIGFwcHJvcHJpYXRlIGJ1cyBtYXN0ZXIgc2VxdWVuY2UgbnVtYmVyIGluY3JlYXNlZCB3aXRoCi1lYWNoIGV2ZW50IG1lc3NhZ2Ugc2VudCAidGhyb3VnaCIgdGhpcyBtYXN0ZXIuCitTZXF1ZW5jZSBudW1iZXIgZm9yIGV2ZW50IG1lc3NhZ2VzIGlzIGFwcHJvcHJpYXRlIGJ1cyBtYXN0ZXIgc2VxdWVuY2UgbnVtYmVyCitpbmNyZWFzZWQgd2l0aCBlYWNoIGV2ZW50IG1lc3NhZ2Ugc2VudCAidGhyb3VnaCIgdGhpcyBtYXN0ZXIuCiBTZXF1ZW5jZSBudW1iZXIgZm9yIHVzZXJzcGFjZSByZXF1ZXN0cyBpcyBzZXQgYnkgdXNlcnNwYWNlIGFwcGxpY2F0aW9uLgogU2VxdWVuY2UgbnVtYmVyIGZvciByZXBseSBpcyB0aGUgc2FtZSBhcyB3YXMgaW4gcmVxdWVzdCwgYW5kCiBhY2tub3dsZWRnZSBudW1iZXIgaXMgc2V0IHRvIHNlcSsxLgpAQCAtOTMsNiArMTgxLDYgQEAKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKIDEuIERvY3VtZW50YXRpb24vY29ubmVjdG9yCi0yLiBodHRwOi8vdHNlcnZpY2UubmV0LnJ1L35zMG1icmUvYXJjaGl2ZS93MQotVGhpcyBhcmNoaXZlIGluY2x1ZGVzIHVzZXJzcGFjZSBhcHBsaWNhdGlvbiB3MWQuYyB3aGljaAotdXNlcyByZWFkL3dyaXRlL3NlYXJjaCBjb21tYW5kcyBmb3IgYWxsIG1hc3Rlci9zbGF2ZSBkZXZpY2VzIGZvdW5kIG9uIHRoZSBidXMuCisyLiBodHRwOi8vd3d3LmlvcmVtYXAubmV0L2FyY2hpdmUvdzEKK1RoaXMgYXJjaGl2ZSBpbmNsdWRlcyB1c2Vyc3BhY2UgYXBwbGljYXRpb24gdzFkLmMgd2hpY2ggdXNlcworcmVhZC93cml0ZS9zZWFyY2ggY29tbWFuZHMgZm9yIGFsbCBtYXN0ZXIvc2xhdmUgZGV2aWNlcyBmb3VuZCBvbiB0aGUgYnVzLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi93aW1heC9SRUFETUUuaTI0MDBtIGIvRG9jdW1lbnRhdGlvbi93aW1heC9SRUFETUUuaTI0MDBtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkZmZkODkKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL3dpbWF4L1JFQURNRS5pMjQwMG0KQEAgLTAsMCArMSwyNjAgQEAKKworICAgRHJpdmVyIGZvciB0aGUgSW50ZWwgV2lyZWxlc3MgV2ltYXggQ29ubmVjdGlvbiAyNDAwbQorCisgICAoQykgMjAwOCBJbnRlbCBDb3Jwb3JhdGlvbiA8IGxpbnV4LXdpbWF4QGludGVsLmNvbSA+CisKKyAgIFRoaXMgcHJvdmlkZXMgYSBkcml2ZXIgZm9yIHRoZSBJbnRlbCBXaXJlbGVzcyBXaU1BWCBDb25uZWN0aW9uIDI0MDBtCisgICBhbmQgYSBiYXNpYyBMaW51eCBrZXJuZWwgV2lNQVggc3RhY2suCisKKzEuIFJlcXVpcmVtZW50cworCisgICAgICogTGludXggaW5zdGFsbGF0aW9uIHdpdGggTGludXgga2VybmVsIDIuNi4yMiBvciBuZXdlciAoaWYgYnVpbGRpbmcKKyAgICAgICBmcm9tIGEgc2VwYXJhdGUgdHJlZSkKKyAgICAgKiBJbnRlbCBpMjQwMG0gRWNobyBQZWFrIG9yIEJheHRlciBQZWFrOyB0aGlzIGluY2x1ZGVzIHRoZSBJbnRlbAorICAgICAgIFdpcmVsZXNzIFdpTUFYL1dpRmkgTGluayA1eDUwIHNlcmllcy4KKyAgICAgKiBidWlsZCB0b29sczoKKyAgICAgICAgICArIExpbnV4IGtlcm5lbCBkZXZlbG9wbWVudCBwYWNrYWdlIGZvciB0aGUgdGFyZ2V0IGtlcm5lbDsgdG8KKyAgICAgICAgICAgIGJ1aWxkIGFnYWluc3QgeW91ciBjdXJyZW50bHkgcnVubmluZyBrZXJuZWwsIHlvdSBuZWVkIHRvIGhhdmUKKyAgICAgICAgICAgIHRoZSBrZXJuZWwgZGV2ZWxvcG1lbnQgcGFja2FnZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBydW5uaW5nCisgICAgICAgICAgICBpbWFnZSBpbnN0YWxsZWQgKHVzdWFsbHkgaWYgeW91ciBrZXJuZWwgaXMgbmFtZWQKKyAgICAgICAgICAgIGxpbnV4LVZFUlNJT04sIHRoZSBkZXZlbG9wbWVudCBwYWNrYWdlIGlzIGNhbGxlZAorICAgICAgICAgICAgbGludXgtZGV2LVZFUlNJT04gb3IgbGludXgtaGVhZGVycy1WRVJTSU9OKS4KKyAgICAgICAgICArIEdOVSBDIENvbXBpbGVyLCBtYWtlCisKKzIuIENvbXBpbGF0aW9uIGFuZCBpbnN0YWxsYXRpb24KKworMi4xLiBDb21waWxhdGlvbiBvZiB0aGUgZHJpdmVycyBpbmNsdWRlZCBpbiB0aGUga2VybmVsCisKKyAgIENvbmZpZ3VyZSB0aGUga2VybmVsOyB0byBlbmFibGUgdGhlIFdpTUFYIGRyaXZlcnMgc2VsZWN0IERyaXZlcnMgPgorICAgTmV0d29ya2luZyBEcml2ZXJzID4gV2lNQVggZGV2aWNlIHN1cHBvcnQuIEVuYWJsZSBhbGwgb2YgdGhlbSBhcworICAgbW9kdWxlcyAoZWFzaWVyKS4KKworICAgSWYgVVNCIG9yIFNESU8gYXJlIG5vdCBlbmFibGVkIGluIHRoZSBrZXJuZWwgY29uZmlndXJhdGlvbiwgdGhlIG9wdGlvbnMKKyAgIHRvIGJ1aWxkIHRoZSBpMjQwMG0gVVNCIG9yIFNESU8gZHJpdmVycyB3aWxsIG5vdCBzaG93LiBFbmFibGUgc2FpZAorICAgc3Vic3lzdGVtcyBhbmQgZ28gYmFjayB0byB0aGUgV2lNQVggbWVudSB0byBlbmFibGUgdGhlIGRyaXZlcnMuCisKKyAgIENvbXBpbGUgYW5kIGluc3RhbGwgeW91ciBrZXJuZWwgYXMgdXN1YWwuCisKKzIuMi4gQ29tcGlsYXRpb24gb2YgdGhlIGRyaXZlcnMgZGlzdHJpYnV0ZWQgYXMgYW4gc3RhbmRhbG9uZSBtb2R1bGUKKworICAgVG8gY29tcGlsZQorCiskIGNkIHNvdXJjZS9kaXJlY3RvcnkKKyQgbWFrZQorCisgICBPbmNlIGJ1aWx0IHlvdSBjYW4gbG9hZCBhbmQgdW5sb2FkIHVzaW5nIHRoZSBwcm92aWRlZCBsb2FkLnNoIHNjcmlwdDsKKyAgIGxvYWQuc2ggd2lsbCBsb2FkIHRoZSBtb2R1bGVzLCBsb2FkLnNoIHUgd2lsbCB1bmxvYWQgdGhlbS4KKworICAgVG8gaW5zdGFsbCBpbiB0aGUgZGVmYXVsdCBrZXJuZWwgZGlyZWN0b3JpZXMgKGFuZCBlbmFibGUgYXV0byBsb2FkaW5nCisgICB3aGVuIHRoZSBkZXZpY2UgaXMgcGx1Z2dlZCk6CisKKyQgbWFrZSBpbnN0YWxsCiskIGRlcG1vZCAtYQorCisgICBJZiB5b3VyIGtlcm5lbCBkZXZlbG9wbWVudCBmaWxlcyBhcmUgbG9jYXRlZCBpbiBhIG5vbiBzdGFuZGFyZAorICAgZGlyZWN0b3J5IG9yIGlmIHlvdSB3YW50IHRvIGJ1aWxkIGZvciBhIGtlcm5lbCB0aGF0IGlzIG5vdCB0aGUKKyAgIGN1cnJlbnRseSBydW5uaW5nIG9uZSwgc2V0IEtESVIgdG8gdGhlIHJpZ2h0IGxvY2F0aW9uOgorCiskIG1ha2UgS0RJUj0vcGF0aC90by9rZXJuZWwvZGV2L3RyZWUKKworICAgRm9yIG1vcmUgaW5mb3JtYXRpb24sIHBsZWFzZSBjb250YWN0IGxpbnV4LXdpbWF4QGludGVsLmNvbS4KKworMy4gSW5zdGFsbGluZyB0aGUgZmlybXdhcmUKKworICAgVGhlIGZpcm13YXJlIGNhbiBiZSBvYnRhaW5lZCBmcm9tIGh0dHA6Ly9saW51eHdpbWF4Lm9yZyBvciBtaWdodCBoYXZlCisgICBiZWVuIHN1cHBsaWVkIHdpdGggeW91ciBoYXJkd2FyZS4KKworICAgSXQgaGFzIHRvIGJlIGluc3RhbGxlZCBpbiB0aGUgdGFyZ2V0IHN5c3RlbToKKyAgICAgKgorJCBjcCBGSVJNV0FSRUZJTEUuc2JjZiAvbGliL2Zpcm13YXJlL2kyNDAwbS1mdy1CVVNUWVBFLTEuMy5zYmNmCisKKyAgICAgKiBOT1RFOiBpZiB5b3VyIGZpcm13YXJlIGNhbWUgaW4gYW4gLnJwbSBvciAuZGViIGZpbGUsIGp1c3QgaW5zdGFsbAorICAgICAgIGl0IGFzIG5vcm1hbCwgd2l0aCB0aGUgcnBtIChycG0gLWkgRklSTVdBUkUucnBtKSBvciBkcGtnCisgICAgICAgKGRwa2cgLWkgRklSTVdBUkUuZGViKSBjb21tYW5kcy4gTm8gZnVydGhlciBhY3Rpb24gaXMgbmVlZGVkLgorICAgICAqIEJVU1RZUEUgd2lsbCBiZSB1c2Igb3Igc2RpbywgZGVwZW5kaW5nIG9uIHRoZSBoYXJkd2FyZSB5b3UgaGF2ZS4KKyAgICAgICBFYWNoIGhhcmR3YXJlIHR5cGUgY29tZXMgd2l0aCBpdHMgb3duIGZpcm13YXJlIGFuZCB3aWxsIG5vdCB3b3JrCisgICAgICAgd2l0aCBvdGhlciB0eXBlcy4KKworNC4gRGVzaWduCisKKyAgIFRoaXMgcGFja2FnZSBjb250YWlucyB0d28gbWFqb3IgcGFydHM6IGEgV2lNQVgga2VybmVsIHN0YWNrIGFuZCBhCisgICBkcml2ZXIgZm9yIHRoZSBJbnRlbCBpMjQwMG0uCisKKyAgIFRoZSBXaU1BWCBzdGFjayBpcyBkZXNpZ25lZCB0byBwcm92aWRlIGZvciBjb21tb24gV2lNQVggY29udHJvbAorICAgc2VydmljZXMgdG8gY3VycmVudCBhbmQgZnV0dXJlIFdpTUFYIGRldmljZXMgZnJvbSBhbnkgdmVuZG9yOyBwbGVhc2UKKyAgIHNlZSBSRUFETUUud2ltYXggZm9yIGRldGFpbHMuCisKKyAgIFRoZSBpMjQwMG0ga2VybmVsIGRyaXZlciBpcyBicm9rZW4gdXAgaW4gdHdvIG1haW4gcGFydHM6IHRoZSBidXMKKyAgIGdlbmVyaWMgZHJpdmVyIGFuZCB0aGUgYnVzLXNwZWNpZmljIGRyaXZlcnMuIFRoZSBidXMgZ2VuZXJpYyBkcml2ZXIKKyAgIGZvcm1zIHRoZSBkcml2ZXJjb3JlIGFuZCBjb250YWluIG5vIGtub3dsZWRnZSBvZiB0aGUgYWN0dWFsIG1ldGhvZCB3ZQorICAgdXNlIHRvIGNvbm5lY3QgdG8gdGhlIGRldmljZS4gVGhlIGJ1cyBzcGVjaWZpYyBkcml2ZXJzIGFyZSBqdXN0IHRoZQorICAgZ2x1ZSB0byBjb25uZWN0IHRoZSBidXMtZ2VuZXJpYyBkcml2ZXIgYW5kIHRoZSBkZXZpY2UuIEN1cnJlbnRseSBvbmx5CisgICBVU0IgYW5kIFNESU8gYXJlIHN1cHBvcnRlZC4gU2VlIGRyaXZlcnMvbmV0L3dpbWF4L2kyNDAwbS9pMjQwMG0uaCBmb3IKKyAgIG1vcmUgaW5mb3JtYXRpb24uCisKKyAgIFRoZSBidXMgZ2VuZXJpYyBkcml2ZXIgaXMgbG9naWNhbGx5IGJyb2tlbiB1cCBpbiB0d28gcGFydHM6IE9TLWdsdWUgYW5kCisgICBoYXJkd2FyZS1nbHVlLiBUaGUgT1MtZ2x1ZSBpbnRlcmZhY2VzIHdpdGggTGludXguIFRoZSBoYXJkd2FyZS1nbHVlCisgICBpbnRlcmZhY2VzIHdpdGggdGhlIGRldmljZSBvbiB1c2luZyBhbiBpbnRlcmZhY2UgcHJvdmlkZWQgYnkgdGhlCisgICBidXMtc3BlY2lmaWMgZHJpdmVyLiBUaGUgcmVhc29uIGZvciB0aGlzIGJyZWFrdXAgaXMgdG8gYmUgYWJsZSB0bworICAgZWFzaWx5IHJldXNlIHRoZSBoYXJkd2FyZS1nbHVlIHRvIHdyaXRlIGRyaXZlcnMgZm9yIG90aGVyIE9TZXM7IG5vdGUKKyAgIHRoZSBoYXJkd2FyZSBnbHVlIHBhcnQgaXMgd3JpdHRlbiBhcyBhIG5hdGl2ZSBMaW51eCBkcml2ZXI7IG5vCisgICBhYnN0cmFjdGlvbiBsYXllcnMgYXJlIHVzZWQsIHNvIHRvIHBvcnQgdG8gYW5vdGhlciBPUywgdGhlIExpbnV4IGtlcm5lbAorICAgQVBJIGNhbGxzIHNob3VsZCBiZSByZXBsYWNlZCB3aXRoIHRoZSB0YXJnZXQgT1Mncy4KKworNS4gVXNhZ2UKKworICAgVG8gbG9hZCB0aGUgZHJpdmVyLCBmb2xsb3cgdGhlIGluc3RydWN0aW9ucyBpbiB0aGUgaW5zdGFsbCBzZWN0aW9uOworICAgb25jZSB0aGUgZHJpdmVyIGlzIGxvYWRlZCwgcGx1ZyBpbiB0aGUgZGV2aWNlICh1bmxlc3MgaXQgaXMgcGVybWFuZW50bHkKKyAgIHBsdWdnZWQgaW4pLiBUaGUgZHJpdmVyIHdpbGwgZW51bWVyYXRlIHRoZSBkZXZpY2UsIHVwbG9hZCB0aGUgZmlybXdhcmUKKyAgIGFuZCBvdXRwdXQgbWVzc2FnZXMgaW4gdGhlIGtlcm5lbCBsb2cgKGRtZXNnLCAvdmFyL2xvZy9tZXNzYWdlcyBvcgorICAgL3Zhci9sb2cva2Vybi5sb2cpIHN1Y2ggYXM6CisKKy4uLgoraTI0MDBtX3VzYiA1LTQ6MS4wOiBmaXJtd2FyZSBpbnRlcmZhY2UgdmVyc2lvbiA4LjAuMAoraTI0MDBtX3VzYiA1LTQ6MS4wOiBXaU1BWCBpbnRlcmZhY2Ugd214MCAoMDA6MWQ6ZTE6MDE6OTQ6MmMpIHJlYWR5CisKKyAgIEF0IHRoaXMgcG9pbnQgdGhlIGRldmljZSBpcyByZWFkeSB0byB3b3JrLgorCisgICBDdXJyZW50IHZlcnNpb25zIHJlcXVpcmUgdGhlIEludGVsIFdpTUFYIE5ldHdvcmsgU2VydmljZSBpbiB1c2Vyc3BhY2UKKyAgIHRvIG1ha2UgdGhpbmdzIHdvcmsuIFNlZSB0aGUgbmV0d29yayBzZXJ2aWNlJ3MgUkVBRE1FIGZvciBpbnN0cnVjdGlvbnMKKyAgIG9uIGhvdyB0byBzY2FuLCBjb25uZWN0IGFuZCBkaXNjb25uZWN0LgorCis1LjEuIE1vZHVsZSBwYXJhbWV0ZXJzCisKKyAgIE1vZHVsZSBwYXJhbWV0ZXJzIGNhbiBiZSBzZXQgYXQga2VybmVsIG9yIG1vZHVsZSBsb2FkIHRpbWUgb3IgYnkKKyAgIGVjaG9pbmcgdmFsdWVzOgorCiskIGVjaG8gVkFMVUUgPiAvc3lzL21vZHVsZS9NT0RVTEVOQU1FL3BhcmFtZXRlcnMvUEFSQU1FVEVSTkFNRQorCisgICBUbyBtYWtlIGNoYW5nZXMgcGVybWFuZW50LCBmb3IgZXhhbXBsZSwgZm9yIHRoZSBpMjQwMG0gbW9kdWxlLCB5b3UgY2FuCisgICBhbHNvIGNyZWF0ZSBhIGZpbGUgbmFtZWQgL2V0Yy9tb2Rwcm9iZS5kL2kyNDAwbSBjb250YWluaW5nOgorCitvcHRpb25zIGkyNDAwbSBpZGxlX21vZGVfZGlzYWJsZWQ9MQorCisgICBUbyBmaW5kIHdoaWNoIHBhcmFtZXRlcnMgYXJlIHN1cHBvcnRlZCBieSBhIG1vZHVsZSwgcnVuOgorCiskIG1vZGluZm8gcGF0aC90by9tb2R1bGUua28KKworICAgRHVyaW5nIGtlcm5lbCBib290dXAgKGlmIHRoZSBkcml2ZXIgaXMgbGlua2VkIGluIHRoZSBrZXJuZWwpLCBzcGVjaWZ5CisgICB0aGUgZm9sbG93aW5nIHRvIHRoZSBrZXJuZWwgY29tbWFuZCBsaW5lOgorCitpMjQwMG0uUEFSQU1FVEVSPVZBTFVFCisKKzUuMS4xLiBpMjQwMG06IGlkbGVfbW9kZV9kaXNhYmxlZAorCisgICBUaGUgaTI0MDBtIG1vZHVsZSBzdXBwb3J0cyBhIHBhcmFtZXRlciB0byBkaXNhYmxlIGlkbGUgbW9kZS4gVGhpcworICAgcGFyYW1ldGVyLCBvbmNlIHNldCwgd2lsbCB0YWtlIGVmZmVjdCBvbmx5IHdoZW4gdGhlIGRldmljZSBpcworICAgcmVpbml0aWFsaXplZCBieSB0aGUgZHJpdmVyIChlZzogZm9sbG93aW5nIGEgcmVzZXQgb3IgYSByZWNvbm5lY3QpLgorCis1LjIuIERlYnVnIG9wZXJhdGlvbnM6IGRlYnVnZnMgZW50cmllcworCisgICBUaGUgZHJpdmVyIHdpbGwgcmVnaXN0ZXIgZGVidWdmcyBlbnRyaWVzIHRoYXQgYWxsb3cgdGhlIHVzZXIgdG8gdHdlYWsKKyAgIGRlYnVnIHNldHRpbmdzLiBUaGVyZSBhcmUgdGhyZWUgbWFpbiBjb250YWluZXIgZGlyZWN0b3JpZXMgd2hlcmUKKyAgIGVudHJpZXMgYXJlIHBsYWNlZCwgd2hpY2ggY29ycmVzcG9uZCB0byB0aGUgdGhyZWUgYmxvY2tzIGEgaTI0MDBtIFdpTUFYCisgICBkcml2ZXIgaGFzOgorICAgICAqIC9zeXMva2VybmVsL2RlYnVnL3dpbWF4OkRFVk5BTUUvIGZvciB0aGUgZ2VuZXJpYyBXaU1BWCBzdGFjaworICAgICAgIGNvbnRyb2xzCisgICAgICogL3N5cy9rZXJuZWwvZGVidWcvd2ltYXg6REVWTkFNRS9pMjQwMG0gZm9yIHRoZSBpMjQwMG0gZ2VuZXJpYworICAgICAgIGRyaXZlciBjb250cm9scworICAgICAqIC9zeXMva2VybmVsL2RlYnVnL3dpbWF4OkRFVk5BTUUvaTI0MDBtLXVzYiAob3IgLXNkaW8pIGZvciB0aGUKKyAgICAgICBidXMtc3BlY2lmaWMgaTI0MDBtLXVzYiBvciBpMjQwMG0tc2RpbyBjb250cm9scykuCisKKyAgIE9mIGNvdXJzZSwgaWYgZGVidWdmcyBpcyBtb3VudGVkIGluIGEgZGlyZWN0b3J5IG90aGVyIHRoYW4KKyAgIC9zeXMva2VybmVsL2RlYnVnLCB0aG9zZSBwYXRocyB3aWxsIGNoYW5nZS4KKworNS4yLjEuIEluY3JlYXNpbmcgZGVidWcgb3V0cHV0CisKKyAgIFRoZSBmaWxlcyBuYW1lZCAqZGxfKiBpbmRpY2F0ZSBrbm9icyBmb3IgY29udHJvbGxpbmcgdGhlIGRlYnVnIG91dHB1dAorICAgb2YgZGlmZmVyZW50IHN1Ym1vZHVsZXM6CisgICAgICoKKyMgZmluZCAvc3lzL2tlcm5lbC9kZWJ1Zy93aW1heFw6d214MCAtbmFtZSBcKmRsX1wqCisvc3lzL2tlcm5lbC9kZWJ1Zy93aW1heDp3bXgwL2kyNDAwbS11c2IvZGxfdHgKKy9zeXMva2VybmVsL2RlYnVnL3dpbWF4OndteDAvaTI0MDBtLXVzYi9kbF9yeAorL3N5cy9rZXJuZWwvZGVidWcvd2ltYXg6d214MC9pMjQwMG0tdXNiL2RsX25vdGlmCisvc3lzL2tlcm5lbC9kZWJ1Zy93aW1heDp3bXgwL2kyNDAwbS11c2IvZGxfZncKKy9zeXMva2VybmVsL2RlYnVnL3dpbWF4OndteDAvaTI0MDBtLXVzYi9kbF91c2IKKy9zeXMva2VybmVsL2RlYnVnL3dpbWF4OndteDAvaTI0MDBtL2RsX3R4Cisvc3lzL2tlcm5lbC9kZWJ1Zy93aW1heDp3bXgwL2kyNDAwbS9kbF9yeAorL3N5cy9rZXJuZWwvZGVidWcvd2ltYXg6d214MC9pMjQwMG0vZGxfcmZraWxsCisvc3lzL2tlcm5lbC9kZWJ1Zy93aW1heDp3bXgwL2kyNDAwbS9kbF9uZXRkZXYKKy9zeXMva2VybmVsL2RlYnVnL3dpbWF4OndteDAvaTI0MDBtL2RsX2Z3Cisvc3lzL2tlcm5lbC9kZWJ1Zy93aW1heDp3bXgwL2kyNDAwbS9kbF9kZWJ1Z2ZzCisvc3lzL2tlcm5lbC9kZWJ1Zy93aW1heDp3bXgwL2kyNDAwbS9kbF9kcml2ZXIKKy9zeXMva2VybmVsL2RlYnVnL3dpbWF4OndteDAvaTI0MDBtL2RsX2NvbnRyb2wKKy9zeXMva2VybmVsL2RlYnVnL3dpbWF4OndteDAvd2ltYXhfZGxfc3RhY2sKKy9zeXMva2VybmVsL2RlYnVnL3dpbWF4OndteDAvd2ltYXhfZGxfb3BfcmZraWxsCisvc3lzL2tlcm5lbC9kZWJ1Zy93aW1heDp3bXgwL3dpbWF4X2RsX29wX3Jlc2V0Cisvc3lzL2tlcm5lbC9kZWJ1Zy93aW1heDp3bXgwL3dpbWF4X2RsX29wX21zZworL3N5cy9rZXJuZWwvZGVidWcvd2ltYXg6d214MC93aW1heF9kbF9pZF90YWJsZQorL3N5cy9rZXJuZWwvZGVidWcvd2ltYXg6d214MC93aW1heF9kbF9kZWJ1Z2ZzCisKKyAgIEJ5IHJlYWRpbmcgdGhlIGZpbGUgeW91IGNhbiBvYnRhaW4gdGhlIGN1cnJlbnQgdmFsdWUgb2Ygc2FpZCBkZWJ1ZworICAgbGV2ZWw7IGJ5IHdyaXRpbmcgdG8gaXQsIHlvdSBjYW4gc2V0IGl0LgorCisgICBUbyBpbmNyZWFzZSB0aGUgZGVidWcgbGV2ZWwgb2YsIGZvciBleGFtcGxlLCB0aGUgaTI0MDBtJ3MgZ2VuZXJpYyBUWAorICAgZW5naW5lLCBqdXN0IHdyaXRlOgorCiskIGVjaG8gMyA+IC9zeXMva2VybmVsL2RlYnVnL3dpbWF4OndteDAvaTI0MDBtL2RsX3R4CisKKyAgIEluY3JlYXNpbmcgbnVtYmVycyB5aWVsZCBpbmNyZWFzaW5nIGRlYnVnIGluZm9ybWF0aW9uOyBmb3IgZGV0YWlscyBvZgorICAgd2hhdCBpcyBwcmludGVkIGFuZCB0aGUgYXZhaWxhYmxlIGxldmVscywgY2hlY2sgdGhlIHNvdXJjZS4gVGhlIGNvZGUKKyAgIHVzZXMgMCBmb3IgZGlzYWJsZWQgYW5kIGluY3JlYXNpbmcgdmFsdWVzIHVudGlsIDguCisKKzUuMi4yLiBSWCBhbmQgVFggc3RhdGlzdGljcworCisgICBUaGUgaTI0MDBtL3J4X3N0YXRzIGFuZCBpMjQwMG0vdHhfc3RhdHMgcHJvdmlkZSBzdGF0aXN0aWNzIGFib3V0IHRoZQorICAgZGF0YSByZWNlcHRpb24vZGVsaXZlcnkgZnJvbSB0aGUgZGV2aWNlOgorCiskIGNhdCAvc3lzL2tlcm5lbC9kZWJ1Zy93aW1heDp3bXgwL2kyNDAwbS9yeF9zdGF0cworNDUgMSAzIDM0IDMxMDQgNDggNDgwCisKKyAgIFRoZSBudW1iZXJzIHJlcG9ydGVkIGFyZQorICAgICAqIHBhY2tldHMvUlgtYnVmZmVyOiB0b3RhbCwgbWluLCBtYXgKKyAgICAgKiBSWC1idWZmZXJzOiB0b3RhbCBSWCBidWZmZXJzIHJlY2VpdmVkLCBhY2N1bXVsYXRlZCBSWCBidWZmZXIgc2l6ZQorICAgICAgIGluIGJ5dGVzLCBtaW4gc2l6ZSByZWNlaXZlZCwgbWF4IHNpemUgcmVjZWl2ZWQKKworICAgVGh1cywgdG8gZmluZCB0aGUgYXZlcmFnZSBidWZmZXIgc2l6ZSByZWNlaXZlZCwgZGl2aWRlIGFjY3VtdWxhdGVkCisgICBSWC1idWZmZXIgLyB0b3RhbCBSWC1idWZmZXJzLgorCisgICBUbyBjbGVhciB0aGUgc3RhdGlzdGljcyBiYWNrIHRvIDAsIHdyaXRlIGFueXRoaW5nIHRvIHRoZSByeF9zdGF0cyBmaWxlOgorCiskIGVjaG8gMSA+IC9zeXMva2VybmVsL2RlYnVnL3dpbWF4OndteDAvaTI0MDBtX3J4X3N0YXRzCisKKyAgIExpa2V3aXNlIGZvciBUWC4KKworICAgTm90ZSB0aGUgcGFja2V0cyB0aGlzIGRlYnVnIGZpbGUgcmVmZXJzIHRvIGFyZSBub3QgbmV0d29yayBwYWNrZXQsIGJ1dAorICAgcGFja2V0cyBpbiB0aGUgc2Vuc2Ugb2YgdGhlIGRldmljZS1zcGVjaWZpYyBwcm90b2NvbCBmb3IgY29tbXVuaWNhdGlvbgorICAgdG8gdGhlIGhvc3QuIFNlZSBkcml2ZXJzL25ldC93aW1heC9pMjQwMG0vdHguYy4KKworNS4yLjMuIFRyYWNpbmcgbWVzc2FnZXMgcmVjZWl2ZWQgZnJvbSB1c2VyIHNwYWNlCisKKyAgIFRvIGVjaG8gbWVzc2FnZXMgcmVjZWl2ZWQgZnJvbSB1c2VyIHNwYWNlIGludG8gdGhlIHRyYWNlIHBpcGUgdGhhdCB0aGUKKyAgIGkyNDAwbSBkcml2ZXIgY3JlYXRlcywgc2V0IHRoZSBkZWJ1ZyBmaWxlIGkyNDAwbS90cmFjZV9tc2dfZnJvbV91c2VyIHRvCisgICAxOgorICAgICAqCiskIGVjaG8gMSA+IC9zeXMva2VybmVsL2RlYnVnL3dpbWF4OndteDAvaTI0MDBtL3RyYWNlX21zZ19mcm9tX3VzZXIKKworNS4yLjQuIFBlcmZvcm1pbmcgYSBkZXZpY2UgcmVzZXQKKworICAgQnkgd3JpdGluZyBhIDAsIGEgMSBvciBhIDIgdG8gdGhlIGZpbGUKKyAgIC9zeXMva2VybmVsL2RlYnVnL3dpbWF4OndteDAvcmVzZXQsIHRoZSBkcml2ZXIgcGVyZm9ybXMgYSB3YXJtICh3aXRob3V0CisgICBkaXNjb25uZWN0aW5nIGZyb20gdGhlIGJ1cyksIGNvbGQgKGRpc2Nvbm5lY3RpbmcgZnJvbSB0aGUgYnVzKSBvciBidXMKKyAgIChidXMgc3BlY2lmaWMpIHJlc2V0IG9uIHRoZSBkZXZpY2UuCisKKzUuMi41LiBBc2tpbmcgdGhlIGRldmljZSB0byBlbnRlciBwb3dlciBzYXZpbmcgbW9kZQorCisgICBCeSB3cml0aW5nIGFueSB2YWx1ZSB0byB0aGUgL3N5cy9rZXJuZWwvZGVidWcvd2ltYXg6d214MCBmaWxlLCB0aGUKKyAgIGRldmljZSB3aWxsIGF0dGVtcHQgdG8gZW50ZXIgcG93ZXIgc2F2aW5nIG1vZGUuCisKKzYuIFRyb3VibGVzaG9vdGluZworCis2LjEuIERyaXZlciBjb21wbGFpbnMgYWJvdXQgJ2kyNDAwbS1mdy11c2ItMS4yLnNiY2Y6IHJlcXVlc3QgZmFpbGVkJworCisgICBJZiB1cG9uIGNvbm5lY3RpbmcgdGhlIGRldmljZSwgdGhlIGZvbGxvd2luZyBpcyBvdXRwdXQgaW4gdGhlIGtlcm5lbAorICAgbG9nOgorCitpMjQwMG1fdXNiIDUtNDoxLjA6IGZ3IGkyNDAwbS1mdy11c2ItMS4zLnNiY2Y6IHJlcXVlc3QgZmFpbGVkOiAtMgorCisgICBUaGlzIG1lYW5zIHRoYXQgdGhlIGRyaXZlciBjYW5ub3QgbG9jYXRlIHRoZSBmaXJtd2FyZSBmaWxlIG5hbWVkCisgICAvbGliL2Zpcm13YXJlL2kyNDAwbS1mdy11c2ItMS4yLnNiY2YuIENoZWNrIHRoYXQgdGhlIGZpbGUgaXMgcHJlc2VudCBpbgorICAgdGhlIHJpZ2h0IGxvY2F0aW9uLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi93aW1heC9SRUFETUUud2ltYXggYi9Eb2N1bWVudGF0aW9uL3dpbWF4L1JFQURNRS53aW1heApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzhjNDM3Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi93aW1heC9SRUFETUUud2ltYXgKQEAgLTAsMCArMSw4MSBAQAorCisgICBMaW51eCBrZXJuZWwgV2lNQVggc3RhY2sKKworICAgKEMpIDIwMDggSW50ZWwgQ29ycG9yYXRpb24gPCBsaW51eC13aW1heEBpbnRlbC5jb20gPgorCisgICBUaGlzIHByb3ZpZGVzIGEgYmFzaWMgTGludXgga2VybmVsIFdpTUFYIHN0YWNrIHRvIHByb3ZpZGUgYSBjb21tb24KKyAgIGNvbnRyb2wgQVBJIGZvciBXaU1BWCBkZXZpY2VzLCB1c2FibGUgZnJvbSBrZXJuZWwgYW5kIHVzZXIgc3BhY2UuCisKKzEuIERlc2lnbgorCisgICBUaGUgV2lNQVggc3RhY2sgaXMgZGVzaWduZWQgdG8gcHJvdmlkZSBmb3IgY29tbW9uIFdpTUFYIGNvbnRyb2wKKyAgIHNlcnZpY2VzIHRvIGN1cnJlbnQgYW5kIGZ1dHVyZSBXaU1BWCBkZXZpY2VzIGZyb20gYW55IHZlbmRvci4KKworICAgQmVjYXVzZSBjdXJyZW50bHkgdGhlcmUgaXMgb25seSBvbmUgYW5kIHdlIGRvbid0IGtub3cgd2hhdCB3b3VsZCBiZSB0aGUKKyAgIGNvbW1vbiBzZXJ2aWNlcywgdGhlIEFQSXMgaXQgY3VycmVudGx5IHByb3ZpZGVzIGFyZSB2ZXJ5IG1pbmltYWwuCisgICBIb3dldmVyLCBpdCBpcyBkb25lIGluIHN1Y2ggYSB3YXkgdGhhdCBpdCBpcyBlYXNpbHkgZXh0ZW5zaWJsZSB0bworICAgYWNjb21tb2RhdGUgZnV0dXJlIHJlcXVpcmVtZW50cy4KKworICAgVGhlIHN0YWNrIHdvcmtzIGJ5IGVtYmVkZGluZyBhIHN0cnVjdCB3aW1heF9kZXYgaW4geW91ciBkZXZpY2UncworICAgY29udHJvbCBzdHJ1Y3R1cmVzLiBUaGlzIHByb3ZpZGVzIGEgc2V0IG9mIGNhbGxiYWNrcyB0aGF0IHRoZSBXaU1BWAorICAgc3RhY2sgd2lsbCBjYWxsIGluIG9yZGVyIHRvIGltcGxlbWVudCBjb250cm9sIG9wZXJhdGlvbnMgcmVxdWVzdGVkIGJ5CisgICB0aGUgdXNlci4gQXMgd2VsbCwgdGhlIHN0YWNrIHByb3ZpZGVzIEFQSSBmdW5jdGlvbnMgdGhhdCB0aGUgZHJpdmVyCisgICBjYWxscyB0byBub3RpZnkgYWJvdXQgY2hhbmdlcyBvZiBzdGF0ZSBpbiB0aGUgZGV2aWNlLgorCisgICBUaGUgc3RhY2sgZXhwb3J0cyB0aGUgQVBJIGNhbGxzIG5lZWRlZCB0byBjb250cm9sIHRoZSBkZXZpY2UgdG8gdXNlcgorICAgc3BhY2UgdXNpbmcgZ2VuZXJpYyBuZXRsaW5rIGFzIGEgbWFyc2hhbGxpbmcgbWVjaGFuaXNtLiBZb3UgY2FuIGFjY2VzcworICAgdGhlbSB1c2luZyB5b3VyIG93biBjb2RlIG9yIHVzZSB0aGUgd3JhcHBlcnMgcHJvdmlkZWQgZm9yIHlvdXIKKyAgIGNvbnZlbmllbmNlIGluIGxpYndpbWF4IChpbiB0aGUgd2ltYXgtdG9vbHMgcGFja2FnZSkuCisKKyAgIEZvciBkZXRhaWxlZCBpbmZvcm1hdGlvbiBvbiB0aGUgc3RhY2ssIHBsZWFzZSBzZWUKKyAgIGluY2x1ZGUvbGludXgvd2ltYXguaC4KKworMi4gVXNhZ2UKKworICAgRm9yIHVzYWdlIGluIGEgZHJpdmVyIChyZWdpc3RyYXRpb24sIEFQSSwgZXRjKSBwbGVhc2UgcmVmZXIgdG8gdGhlCisgICBpbnN0cnVjdGlvbnMgaW4gdGhlIGhlYWRlciBmaWxlIGluY2x1ZGUvbGludXgvd2ltYXguaC4KKworICAgV2hlbiBhIGRldmljZSBpcyByZWdpc3RlcmVkIHdpdGggdGhlIFdpTUFYIHN0YWNrLCBhIHNldCBvZiBkZWJ1Z2ZzCisgICBmaWxlcyB3aWxsIGFwcGVhciBpbiAvc3lzL2tlcm5lbC9kZWJ1Zy93aW1heDp3bXhYIGNhbiB0d2VhayBmb3IKKyAgIGNvbnRyb2wuCisKKzIuMS4gT2J0YWluaW5nIGRlYnVnIGluZm9ybWF0aW9uOiBkZWJ1Z2ZzIGVudHJpZXMKKworICAgVGhlIFdpTUFYIHN0YWNrIGlzIGNvbXBpbGVkLCBieSBkZWZhdWx0LCB3aXRoIGRlYnVnIG1lc3NhZ2VzIHRoYXQgY2FuCisgICBiZSB1c2VkIHRvIGRpYWdub3NlIGlzc3Vlcy4gQnkgZGVmYXVsdCwgc2FpZCBtZXNzYWdlcyBhcmUgZGlzYWJsZWQuCisKKyAgIFRoZSBkcml2ZXJzIHdpbGwgcmVnaXN0ZXIgZGVidWdmcyBlbnRyaWVzIHRoYXQgYWxsb3cgdGhlIHVzZXIgdG8gdHdlYWsKKyAgIGRlYnVnIHNldHRpbmdzLgorCisgICBFYWNoIGRyaXZlciwgd2hlbiByZWdpc3RlcmluZyB3aXRoIHRoZSBzdGFjaywgd2lsbCBjYXVzZSBhIGRlYnVnZnMKKyAgIGRpcmVjdG9yeSBuYW1lZCB3aW1heDpERVZJQ0VOQU1FIHRvIGJlIGNyZWF0ZWQ7IG9wdGlvbmFsbHksIGl0IG1pZ2h0CisgICBjcmVhdGUgbW9yZSBzdWJlbnRyaWVzIGJlbG93IGl0LgorCisyLjEuMS4gSW5jcmVhc2luZyBkZWJ1ZyBvdXRwdXQKKworICAgVGhlIGZpbGVzIG5hbWVkICpkbF8qIGluZGljYXRlIGtub2JzIGZvciBjb250cm9sbGluZyB0aGUgZGVidWcgb3V0cHV0CisgICBvZiBkaWZmZXJlbnQgc3VibW9kdWxlcyBvZiB0aGUgV2lNQVggc3RhY2s6CisgICAgICoKKyMgZmluZCAvc3lzL2tlcm5lbC9kZWJ1Zy93aW1heFw6d214MCAtbmFtZSBcKmRsX1wqCisvc3lzL2tlcm5lbC9kZWJ1Zy93aW1heDp3bXgwL3dpbWF4X2RsX3N0YWNrCisvc3lzL2tlcm5lbC9kZWJ1Zy93aW1heDp3bXgwL3dpbWF4X2RsX29wX3Jma2lsbAorL3N5cy9rZXJuZWwvZGVidWcvd2ltYXg6d214MC93aW1heF9kbF9vcF9yZXNldAorL3N5cy9rZXJuZWwvZGVidWcvd2ltYXg6d214MC93aW1heF9kbF9vcF9tc2cKKy9zeXMva2VybmVsL2RlYnVnL3dpbWF4OndteDAvd2ltYXhfZGxfaWRfdGFibGUKKy9zeXMva2VybmVsL2RlYnVnL3dpbWF4OndteDAvd2ltYXhfZGxfZGVidWdmcworL3N5cy9rZXJuZWwvZGVidWcvd2ltYXg6d214MC8uLi4uICMgb3RoZXIgZHJpdmVyIHNwZWNpZmljIGZpbGVzCisKKyAgICAgICBOT1RFOiBPZiBjb3Vyc2UsIGlmIGRlYnVnZnMgaXMgbW91bnRlZCBpbiBhIGRpcmVjdG9yeSBvdGhlciB0aGFuCisgICAgICAgL3N5cy9rZXJuZWwvZGVidWcsIHRob3NlIHBhdGhzIHdpbGwgY2hhbmdlLgorCisgICBCeSByZWFkaW5nIHRoZSBmaWxlIHlvdSBjYW4gb2J0YWluIHRoZSBjdXJyZW50IHZhbHVlIG9mIHNhaWQgZGVidWcKKyAgIGxldmVsOyBieSB3cml0aW5nIHRvIGl0LCB5b3UgY2FuIHNldCBpdC4KKworICAgVG8gaW5jcmVhc2UgdGhlIGRlYnVnIGxldmVsIG9mLCBmb3IgZXhhbXBsZSwgdGhlIGlkLXRhYmxlIHN1Ym1vZHVsZSwKKyAgIGp1c3Qgd3JpdGU6CisKKyQgZWNobyAzID4gL3N5cy9rZXJuZWwvZGVidWcvd2ltYXg6d214MC93aW1heF9kbF9pZF90YWJsZQorCisgICBJbmNyZWFzaW5nIG51bWJlcnMgeWllbGQgaW5jcmVhc2luZyBkZWJ1ZyBpbmZvcm1hdGlvbjsgZm9yIGRldGFpbHMgb2YKKyAgIHdoYXQgaXMgcHJpbnRlZCBhbmQgdGhlIGF2YWlsYWJsZSBsZXZlbHMsIGNoZWNrIHRoZSBzb3VyY2UuIFRoZSBjb2RlCisgICB1c2VzIDAgZm9yIGRpc2FibGVkIGFuZCBpbmNyZWFzaW5nIHZhbHVlcyB1bnRpbCA4LgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi94ODYvYm9vdC50eHQgYi9Eb2N1bWVudGF0aW9uL3g4Ni9ib290LnR4dAppbmRleCBmY2RjNjJiLi43YjQ1OTZhIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3g4Ni9ib290LnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3g4Ni9ib290LnR4dApAQCAtNDQsNyArNDQsNyBAQAogCQlhbmQgS0VFUF9TRUdNRU5UUyBmbGFnIGluIGxvYWRfZmxhZ3MuCiAKIFByb3RvY29sIDIuMDg6CShLZXJuZWwgMi42LjI2KSBBZGRlZCBjcmMzMiBjaGVja3N1bSBhbmQgRUxGIGZvcm1hdAotCQlwYXlsb2FkLiBJbnRyb2R1Y2VkIHBheWxvYWRfb2Zmc2V0IGFuZCBwYXlsb2FkIGxlbmd0aAorCQlwYXlsb2FkLiBJbnRyb2R1Y2VkIHBheWxvYWRfb2Zmc2V0IGFuZCBwYXlsb2FkX2xlbmd0aAogCQlmaWVsZHMgdG8gYWlkIGluIGxvY2F0aW5nIHRoZSBwYXlsb2FkLgogCiBQcm90b2NvbCAyLjA5OgkoS2VybmVsIDIuNi4yNikgQWRkZWQgYSBmaWVsZCBvZiA2NC1iaXQgcGh5c2ljYWwKZGlmZiAtLWdpdCBhL01BSU5UQUlORVJTIGIvTUFJTlRBSU5FUlMKaW5kZXggMDk0ZGQ1Mi4uM2ZlNGRjMiAxMDA2NDQKLS0tIGEvTUFJTlRBSU5FUlMKKysrIGIvTUFJTlRBSU5FUlMKQEAgLTEwMjQsMTYgKzEwMjQsMTcgQEAKIEJUVFYgVklERU80TElOVVggRFJJVkVSCiBQOglNYXVybyBDYXJ2YWxobyBDaGVoYWIKIE06CW1jaGVoYWJAaW5mcmFkZWFkLm9yZwotTToJdjRsLWR2Yi1tYWludGFpbmVyQGxpbnV4dHYub3JnCitMOglsaW51eC1tZWRpYUB2Z2VyLmtlcm5lbC5vcmcKIEw6CXZpZGVvNGxpbnV4LWxpc3RAcmVkaGF0LmNvbQogVzoJaHR0cDovL2xpbnV4dHYub3JnCi1UOglnaXQga2VybmVsLm9yZzovcHViL3NjbS9saW51eC9rZXJuZWwvZ2l0L21jaGVoYWIvdjRsLWR2Yi5naXQKK1Q6CWdpdCBrZXJuZWwub3JnOi9wdWIvc2NtL2xpbnV4L2tlcm5lbC9naXQvbWNoZWhhYi9saW51eC0yLjYuZ2l0CiBTOglNYWludGFpbmVkCiAKIENBRkUgQ01PUyBJTlRFR1JBVEVEIENBTUVSQSBDT05UUk9MTEVSIERSSVZFUgogUDoJSm9uYXRoYW4gQ29yYmV0CiBNOgljb3JiZXRAbHduLm5ldAotTDoJdmlkZW80bGludXgtbGlzdEByZWRoYXQuY29tCitMOglsaW51eC1tZWRpYUB2Z2VyLmtlcm5lbC5vcmcKK1Q6CWdpdCBrZXJuZWwub3JnOi9wdWIvc2NtL2xpbnV4L2tlcm5lbC9naXQvbWNoZWhhYi9saW51eC0yLjYuZ2l0CiBTOglNYWludGFpbmVkCiAKIENBTEdBUlkgeDg2LTY0IElPTU1VCkBAIC0xMjYxLDcgKzEyNjIsOCBAQAogTToJaHZlcmt1aWxAeHM0YWxsLm5sLCBhd2FsbHNAcmFkaXgubmV0CiBMOglpdnR2LWRldmVsQGl2dHZkcml2ZXIub3JnCiBMOglpdnR2LXVzZXJzQGl2dHZkcml2ZXIub3JnCi1MOgl2aWRlbzRsaW51eC1saXN0QHJlZGhhdC5jb20KK0w6CWxpbnV4LW1lZGlhQHZnZXIua2VybmVsLm9yZworVDoJZ2l0IGtlcm5lbC5vcmc6L3B1Yi9zY20vbGludXgva2VybmVsL2dpdC9tY2hlaGFiL2xpbnV4LTIuNi5naXQKIFc6CWh0dHA6Ly9saW51eHR2Lm9yZwogUzoJTWFpbnRhaW5lZAogCkBAIC0xMzU4LDYgKzEzNjAsMTEgQEAKIE06CW1hY3JvQGxpbnV4LW1pcHMub3JnCiBTOglNYWludGFpbmVkCiAKK0RFTEwgTEFQVE9QIERSSVZFUgorUDoJTWF0dGhldyBHYXJyZXR0CitNOgltamc1OUBzcmNmLnVjYW0ub3JnCitTOglNYWludGFpbmVkCisKIERFTEwgTEFQVE9QIFNNTSBEUklWRVIKIFA6CU1hc3NpbW8gRGFsIFpvdHRvCiBNOglkekBkZWJpYW4ub3JnCkBAIC0xNDg3LDEwICsxNDk0LDEwIEBACiAKIERWQiBTVUJTWVNURU0gQU5EIERSSVZFUlMKIFA6CUxpbnV4VFYub3JnIFByb2plY3QKLU06CXY0bC1kdmItbWFpbnRhaW5lckBsaW51eHR2Lm9yZworTToJbGludXgtbWVkaWFAdmdlci5rZXJuZWwub3JnCiBMOglsaW51eC1kdmJAbGludXh0di5vcmcgKHN1YnNjcmlwdGlvbiByZXF1aXJlZCkKIFc6CWh0dHA6Ly9saW51eHR2Lm9yZy8KLVQ6CWdpdCBrZXJuZWwub3JnOi9wdWIvc2NtL2xpbnV4L2tlcm5lbC9naXQvbWNoZWhhYi92NGwtZHZiLmdpdAorVDoJZ2l0IGtlcm5lbC5vcmc6L3B1Yi9zY20vbGludXgva2VybmVsL2dpdC9tY2hlaGFiL2xpbnV4LTIuNi5naXQKIFM6CU1haW50YWluZWQKIAogRFogREVDU1RBVElPTiBEWjExIFNFUklBTCBEUklWRVIKQEAgLTE1NzQsNiArMTU4MSwxMyBAQAogVzoJYmx1ZXNtb2tlLnNvdXJjZWZvcmdlLm5ldAogUzoJTWFpbnRhaW5lZAogCitFREFDLUk1NDAwCitQOglNYXVybyBDYXJ2YWxobyBDaGVoYWIKK006CW1jaGVoYWJAcmVkaGF0LmNvbQorTDoJYmx1ZXNtb2tlLWRldmVsQGxpc3RzLnNvdXJjZWZvcmdlLm5ldAorVzoJYmx1ZXNtb2tlLnNvdXJjZWZvcmdlLm5ldAorUzoJTWFpbnRhaW5lZAorCiBFREFDLUk4Mjk3NVgKIFA6CVJhbmdhbmF0aGFuIERlc2lrYW4KIFA6CUFydmluZCBSLgpAQCAtMTgwNyw2ICsxODIxLDE0IEBACiBXOglmdHA6Ly9mdHAub3BlbmxpbnV4Lm9yZy9wdWIvcGVvcGxlL2hjaC92eGZzCiBTOglNYWludGFpbmVkCiAKK0ZSRUVaRVIKK1A6CVBhdmVsIE1hY2hlaworTToJcGF2ZWxAc3VzZS5jegorUDoJUmFmYWVsIEouIFd5c29ja2kKK006CXJqd0BzaXNrLnBsCitMOglsaW51eC1wbUBsaXN0cy5saW51eC1mb3VuZGF0aW9uLm9yZworUzoJU3VwcG9ydGVkCisKIEZUUkFDRQogUDoJU3RldmVuIFJvc3RlZHQKIE06CXJvc3RlZHRAZ29vZG1pcy5vcmcKQEAgLTE4ODIsMzIgKzE5MDQsMzcgQEAKIEdTUENBIEZJTkVQSVggU1VCRFJJVkVSCiBQOglGcmFuayBaYWdvCiBNOglmcmFua0B6YWdvLm5ldAotTDoJdmlkZW80bGludXgtbGlzdEByZWRoYXQuY29tCitMOglsaW51eC1tZWRpYUB2Z2VyLmtlcm5lbC5vcmcKK1Q6CWdpdCBrZXJuZWwub3JnOi9wdWIvc2NtL2xpbnV4L2tlcm5lbC9naXQvbWNoZWhhYi9saW51eC0yLjYuZ2l0CiBTOglNYWludGFpbmVkCiAKIEdTUENBIE01NjAyIFNVQkRSSVZFUgogUDoJRXJpayBBbmRyZW4KIE06CWVyaWsuYW5kcmVuQGdtYWlsLmNvbQotTDoJdmlkZW80bGludXgtbGlzdEByZWRoYXQuY29tCitMOglsaW51eC1tZWRpYUB2Z2VyLmtlcm5lbC5vcmcKK1Q6CWdpdCBrZXJuZWwub3JnOi9wdWIvc2NtL2xpbnV4L2tlcm5lbC9naXQvbWNoZWhhYi9saW51eC0yLjYuZ2l0CiBTOglNYWludGFpbmVkCiAKIEdTUENBIFBBQzIwNyBTT05JWEIgU1VCRFJJVkVSCiBQOglIYW5zIGRlIEdvZWRlCiBNOgloZGVnb2VkZUByZWRoYXQuY29tCi1MOgl2aWRlbzRsaW51eC1saXN0QHJlZGhhdC5jb20KK0w6CWxpbnV4LW1lZGlhQHZnZXIua2VybmVsLm9yZworVDoJZ2l0IGtlcm5lbC5vcmc6L3B1Yi9zY20vbGludXgva2VybmVsL2dpdC9tY2hlaGFiL2xpbnV4LTIuNi5naXQKIFM6CU1haW50YWluZWQKIAogR1NQQ0EgVDYxMyBTVUJEUklWRVIKIFA6CUxlYW5kcm8gQ29zdGFudGlubwogTToJbGNvc3RhbnRpbm9AZ21haWwuY29tCi1MOgl2aWRlbzRsaW51eC1saXN0QHJlZGhhdC5jb20KK0w6CWxpbnV4LW1lZGlhQHZnZXIua2VybmVsLm9yZworVDoJZ2l0IGtlcm5lbC5vcmc6L3B1Yi9zY20vbGludXgva2VybmVsL2dpdC9tY2hlaGFiL2xpbnV4LTIuNi5naXQKIFM6CU1haW50YWluZWQKIAogR1NQQ0EgVVNCIFdFQkNBTSBEUklWRVIKIFA6CUplYW4tRnJhbmNvaXMgTW9pbmUKIE06CW1vaW5lamZAZnJlZS5mcgogVzoJaHR0cDovL21vaW5lamYuZnJlZS5mcgotTDoJdmlkZW80bGludXgtbGlzdEByZWRoYXQuY29tCitMOglsaW51eC1tZWRpYUB2Z2VyLmtlcm5lbC5vcmcKK1Q6CWdpdCBrZXJuZWwub3JnOi9wdWIvc2NtL2xpbnV4L2tlcm5lbC9naXQvbWNoZWhhYi9saW51eC0yLjYuZ2l0CiBTOglNYWludGFpbmVkCiAKIEhBUkRXQVJFIE1PTklUT1JJTkcKQEAgLTIzMDUsNiArMjMzMiwxNCBAQAogVzoJaHR0cDovL2lwdzIyMDAuc291cmNlZm9yZ2UubmV0CiBTOglTdXBwb3J0ZWQKIAorSU5URUwgV0lSRUxFU1MgV0lNQVggQ09OTkVDVElPTiAyNDAwCitQOglJbmFreSBQZXJlei1Hb256YWxlegorTToJaW5ha3kucGVyZXotZ29uemFsZXpAaW50ZWwuY29tCitNOglsaW51eC13aW1heEBpbnRlbC5jb20KK0w6CXdpbWF4QGxpbnV4d2ltYXgub3JnCitTOglTdXBwb3J0ZWQKK1c6CWh0dHA6Ly9saW51eHdpbWF4Lm9yZworCiBJTlRFTCBXSVJFTEVTUyBXSUZJIExJTksgKGl3bHdpZmkpCiBQOglaaHUgWWkKIE06CXlpLnpodUBpbnRlbC5jb20KQEAgLTI0MjksNyArMjQ2NCw4IEBACiBNOglodmVya3VpbEB4czRhbGwubmwKIEw6CWl2dHYtZGV2ZWxAaXZ0dmRyaXZlci5vcmcKIEw6CWl2dHYtdXNlcnNAaXZ0dmRyaXZlci5vcmcKLUw6CXZpZGVvNGxpbnV4LWxpc3RAcmVkaGF0LmNvbQorTDoJbGludXgtbWVkaWFAdmdlci5rZXJuZWwub3JnCitUOglnaXQga2VybmVsLm9yZzovcHViL3NjbS9saW51eC9rZXJuZWwvZ2l0L21jaGVoYWIvbGludXgtMi42LmdpdAogVzoJaHR0cDovL3d3dy5pdnR2ZHJpdmVyLm9yZwogUzoJTWFpbnRhaW5lZAogCkBAIC0yOTgyLDYgKzMwMTgsNyBAQAogUDoJRmVsaXBlIEJhbGJpCiBNOglmZWxpcGUuYmFsYmlAbm9raWEuY29tCiBMOglsaW51eC11c2JAdmdlci5rZXJuZWwub3JnCitUOglnaXQgZ2l0b3Jpb3VzLm9yZzovbXVzYi9tYWlubGluZS5naXQKIFM6CU1haW50YWluZWQKIAogTVlSSUNPTSBNWVJJLTEwRyAxMEdiRSBEUklWRVIgKE1ZUkkxMEdFKQpAQCAtMzE4OCw3ICszMjI1LDggQEAKIE9NTklWSVNJT04gT1Y3NjcwIFNFTlNPUiBEUklWRVIKIFA6CUpvbmF0aGFuIENvcmJldAogTToJY29yYmV0QGx3bi5uZXQKLUw6CXZpZGVvNGxpbnV4LWxpc3RAcmVkaGF0LmNvbQorTDoJbGludXgtbWVkaWFAdmdlci5rZXJuZWwub3JnCitUOglnaXQga2VybmVsLm9yZzovcHViL3NjbS9saW51eC9rZXJuZWwvZ2l0L21jaGVoYWIvbGludXgtMi42LmdpdAogUzoJTWFpbnRhaW5lZAogCiBPTkVOQU5EIEZMQVNIIERSSVZFUgpAQCAtMzQ2NiwxMiArMzUwNCwxOSBAQAogTDoJY2JlLW9zcy1kZXZAb3psYWJzLm9yZwogUzoJU3VwcG9ydGVkCiAKK1BTM1ZSQU0gRFJJVkVSCitQOglKaW0gUGFyaXMKK006CWppbUBqdGFuLmNvbQorTDoJY2JlLW9zcy1kZXZAb3psYWJzLm9yZworUzoJTWFpbnRhaW5lZAorCiBQVlJVU0IyIFZJREVPNExJTlVYIERSSVZFUgogUDoJTWlrZSBJc2VseQogTToJaXNlbHlAcG9ib3guY29tCiBMOglwdnJ1c2IyQGlzZWx5Lm5ldAkoc3Vic2NyaWJlcnMtb25seSkKLUw6CXZpZGVvNGxpbnV4LWxpc3RAcmVkaGF0LmNvbQorTDoJbGludXgtbWVkaWFAdmdlci5rZXJuZWwub3JnCiBXOglodHRwOi8vd3d3LmlzZWx5Lm5ldC9wdnJ1c2IyLworVDoJZ2l0IGtlcm5lbC5vcmc6L3B1Yi9zY20vbGludXgva2VybmVsL2dpdC9tY2hlaGFiL2xpbnV4LTIuNi5naXQKIFM6CU1haW50YWluZWQKIAogUFhBMnh4L1BYQTN4eCBTVVBQT1JUCkBAIC0zNjkxLDYgKzM3MzYsOCBAQAogU0FBNzE0NiBWSURFTzRMSU5VWC0yIERSSVZFUgogUDoJTWljaGFlbCBIdW5vbGQKIE06CW1pY2hhZWxAbWlodS5kZQorTDoJbGludXgtbWVkaWFAdmdlci5rZXJuZWwub3JnCitUOglnaXQga2VybmVsLm9yZzovcHViL3NjbS9saW51eC9rZXJuZWwvZ2l0L21jaGVoYWIvbGludXgtMi42LmdpdAogVzoJaHR0cDovL3d3dy5taWh1LmRlL2xpbnV4L3NhYTcxNDYKIFM6CU1haW50YWluZWQKIApAQCAtMzk1NCw3ICs0MDAxLDggQEAKIFNPQy1DQU1FUkEgVjRMMiBTVUJTWVNURU0KIFA6CUd1ZW5uYWRpIExpYWtob3ZldHNraQogTToJZy5saWFraG92ZXRza2lAZ214LmRlCi1MOgl2aWRlbzRsaW51eC1saXN0QHJlZGhhdC5jb20KK0w6CWxpbnV4LW1lZGlhQHZnZXIua2VybmVsLm9yZworVDoJZ2l0IGtlcm5lbC5vcmc6L3B1Yi9zY20vbGludXgva2VybmVsL2dpdC9tY2hlaGFiL2xpbnV4LTIuNi5naXQKIFM6CU1haW50YWluZWQKIAogU09FS1JJUyBORVQ0OFhYIExFRCBTVVBQT1JUCkBAIC00MDQ4LDYgKzQwOTYsMTMgQEAKIFc6CWh0dHA6Ly93d3cuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9wb3dlci9jZWxsLwogUzoJU3VwcG9ydGVkCiAKK1NRVUFTSEZTIEZJTEUgU1lTVEVNCitQOglQaGlsbGlwIExvdWdoZXIKK006CXBoaWxsaXBAbG91Z2hlci5kZW1vbi5jby51aworTDoJc3F1YXNoZnMtZGV2ZWxAbGlzdHMuc291cmNlZm9yZ2UubmV0IChzdWJzY3JpYmVycy1vbmx5KQorVzoJaHR0cDovL3NxdWFzaGZzLm9yZy51aworUzoJTWFpbnRhaW5lZAorCiBTUk0gKEFscGhhKSBlbnZpcm9ubWVudCBhY2Nlc3MKIFA6CUphbi1CZW5lZGljdCBHbGF3CiBNOglqYmdsYXdAbHVnLW93bC5kZQpAQCAtNDIyOSw5ICs0Mjg0LDEwIEBACiBTOglNYWludGFpbmVkCiAKIFRSSVZJQUwgUEFUQ0hFUwotUDoJSmVzcGVyIEp1aGwKK1A6CUppcmkgS29zaW5hCiBNOgl0cml2aWFsQGtlcm5lbC5vcmcKIEw6CWxpbnV4LWtlcm5lbEB2Z2VyLmtlcm5lbC5vcmcKK1Q6CWdpdCBrZXJuZWwub3JnOi9wdWIvc2NtL2xpbnV4L2tlcm5lbC9naXQvamlrb3MvdHJpdmlhbC5naXQKIFM6CU1haW50YWluZWQKIAogVFRZIExBWUVSCkBAIC00MzcyLDcgKzQ0MjgsOCBAQAogUDoJTHVjYSBSaXNvbGlhCiBNOglsdWNhLnJpc29saWFAc3R1ZGlvLnVuaWJvLml0CiBMOglsaW51eC11c2JAdmdlci5rZXJuZWwub3JnCi1MOgl2aWRlbzRsaW51eC1saXN0QHJlZGhhdC5jb20KK0w6CWxpbnV4LW1lZGlhQHZnZXIua2VybmVsLm9yZworVDoJZ2l0IGtlcm5lbC5vcmc6L3B1Yi9zY20vbGludXgva2VybmVsL2dpdC9tY2hlaGFiL2xpbnV4LTIuNi5naXQKIFc6CWh0dHA6Ly93d3cubGludXgtcHJvamVjdHMub3JnCiBTOglNYWludGFpbmVkCiAKQEAgLTQ1MjEsNyArNDU3OCw4IEBACiBQOglMdWNhIFJpc29saWEKIE06CWx1Y2Eucmlzb2xpYUBzdHVkaW8udW5pYm8uaXQKIEw6CWxpbnV4LXVzYkB2Z2VyLmtlcm5lbC5vcmcKLUw6CXZpZGVvNGxpbnV4LWxpc3RAcmVkaGF0LmNvbQorTDoJbGludXgtbWVkaWFAdmdlci5rZXJuZWwub3JnCitUOglnaXQga2VybmVsLm9yZzovcHViL3NjbS9saW51eC9rZXJuZWwvZ2l0L21jaGVoYWIvbGludXgtMi42LmdpdAogVzoJaHR0cDovL3d3dy5saW51eC1wcm9qZWN0cy5vcmcKIFM6CU1haW50YWluZWQKIApAQCAtNDU1MCw3ICs0NjA4LDggQEAKIFA6CUxhdXJlbnQgUGluY2hhcnQKIE06CWxhdXJlbnQucGluY2hhcnRAc2t5bmV0LmJlCiBMOglsaW51eC11dmMtZGV2ZWxAbGlzdHMuYmVybGlvcy5kZSAoc3Vic2NyaWJlcnMtb25seSkKLUw6CXZpZGVvNGxpbnV4LWxpc3RAcmVkaGF0LmNvbQorTDoJbGludXgtbWVkaWFAdmdlci5rZXJuZWwub3JnCitUOglnaXQga2VybmVsLm9yZzovcHViL3NjbS9saW51eC9rZXJuZWwvZ2l0L21jaGVoYWIvbGludXgtMi42LmdpdAogVzoJaHR0cDovL2xpbnV4LXV2Yy5iZXJsaW9zLmRlCiBTOglNYWludGFpbmVkCiAKQEAgLTQ1NTgsNyArNDYxNyw4IEBACiBQOglMdWNhIFJpc29saWEKIE06CWx1Y2Eucmlzb2xpYUBzdHVkaW8udW5pYm8uaXQKIEw6CWxpbnV4LXVzYkB2Z2VyLmtlcm5lbC5vcmcKLUw6CXZpZGVvNGxpbnV4LWxpc3RAcmVkaGF0LmNvbQorTDoJbGludXgtbWVkaWFAdmdlci5rZXJuZWwub3JnCitUOglnaXQga2VybmVsLm9yZzovcHViL3NjbS9saW51eC9rZXJuZWwvZ2l0L21jaGVoYWIvbGludXgtMi42LmdpdAogVzoJaHR0cDovL3d3dy5saW51eC1wcm9qZWN0cy5vcmcKIFM6CU1haW50YWluZWQKIApAQCAtNDU3Miw3ICs0NjMyLDggQEAKIFA6CUx1Y2EgUmlzb2xpYQogTToJbHVjYS5yaXNvbGlhQHN0dWRpby51bmliby5pdAogTDoJbGludXgtdXNiQHZnZXIua2VybmVsLm9yZwotTDoJdmlkZW80bGludXgtbGlzdEByZWRoYXQuY29tCitMOglsaW51eC1tZWRpYUB2Z2VyLmtlcm5lbC5vcmcKK1Q6CWdpdCBrZXJuZWwub3JnOi9wdWIvc2NtL2xpbnV4L2tlcm5lbC9naXQvbWNoZWhhYi9saW51eC0yLjYuZ2l0CiBXOglodHRwOi8vd3d3LmxpbnV4LXByb2plY3RzLm9yZwogUzoJTWFpbnRhaW5lZAogCkBAIC00NTg3LDcgKzQ2NDgsOCBAQAogUDoJQW50b2luZSBKYWNxdWV0CiBNOglyb3lhbGVAemVyZXpvLmNvbQogTDoJbGludXgtdXNiQHZnZXIua2VybmVsLm9yZwotTDoJdmlkZW80bGludXgtbGlzdEByZWRoYXQuY29tCitMOglsaW51eC1tZWRpYUB2Z2VyLmtlcm5lbC5vcmcKK1Q6CWdpdCBrZXJuZWwub3JnOi9wdWIvc2NtL2xpbnV4L2tlcm5lbC9naXQvbWNoZWhhYi9saW51eC0yLjYuZ2l0CiBXOglodHRwOi8vcm95YWxlLnplcmV6by5jb20venIzNjR4eC8KIFM6CU1haW50YWluZWQKIApAQCAtNDY1NiwxMCArNDcxOCwxMCBAQAogVklERU8gRk9SIExJTlVYIChWNEwpCiBQOglNYXVybyBDYXJ2YWxobyBDaGVoYWIKIE06CW1jaGVoYWJAaW5mcmFkZWFkLm9yZwotTToJdjRsLWR2Yi1tYWludGFpbmVyQGxpbnV4dHYub3JnCitMOglsaW51eC1tZWRpYUB2Z2VyLmtlcm5lbC5vcmcKIEw6CXZpZGVvNGxpbnV4LWxpc3RAcmVkaGF0LmNvbQogVzoJaHR0cDovL2xpbnV4dHYub3JnCi1UOglnaXQga2VybmVsLm9yZzovcHViL3NjbS9saW51eC9rZXJuZWwvZ2l0L21jaGVoYWIvdjRsLWR2Yi5naXQKK1Q6CWdpdCBrZXJuZWwub3JnOi9wdWIvc2NtL2xpbnV4L2tlcm5lbC9naXQvbWNoZWhhYi9saW51eC0yLjYuZ2l0CiBTOglNYWludGFpbmVkCiAKIFZMQU4gKDgwMi4xUSkKQEAgLTQ3MzIsNiArNDc5NCwxNCBAQAogTDoJbGludXgtc2NzaUB2Z2VyLmtlcm5lbC5vcmcKIFM6CU1haW50YWluZWQKIAorV0lNQVggU1RBQ0sKK1A6CUluYWt5IFBlcmV6LUdvbnphbGV6CitNOglpbmFreS5wZXJlei1nb256YWxlekBpbnRlbC5jb20KK006CWxpbnV4LXdpbWF4QGludGVsLmNvbQorTDoJd2ltYXhAbGludXh3aW1heC5vcmcKK1M6CVN1cHBvcnRlZAorVzoJaHR0cDovL2xpbnV4d2ltYXgub3JnCisKIFdJTUVESUEgTExDIFBST1RPQ09MIChXTFApIFNVQlNZU1RFTQogUDoJRGF2aWQgVnJhYmVsCiBNOglkYXZpZC52cmFiZWxAY3NyLmNvbQpAQCAtNDc4NywxMSArNDg1NywxMSBAQAogCiBYRlMgRklMRVNZU1RFTQogUDoJU2lsaWNvbiBHcmFwaGljcyBJbmMKLVA6CVRpbSBTaGltbWluCitQOglCaWxsIE8nRG9ubmVsbAogTToJeGZzLW1hc3RlcnNAb3NzLnNnaS5jb20KIEw6CXhmc0Bvc3Muc2dpLmNvbQogVzoJaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL3hmcwotVDoJZ2l0IGdpdDovL29zcy5zZ2kuY29tOjgwOTAveGZzL3hmcy0yLjYuZ2l0CitUOglnaXQ6Ly9vc3Muc2dpLmNvbS94ZnMveGZzLmdpdAogUzoJU3VwcG9ydGVkCiAKIFhJTElOWCBTWVNURU1BQ0UgRFJJVkVSCmRpZmYgLS1naXQgYS9NYWtlZmlsZSBiL01ha2VmaWxlCmluZGV4IGY5MDA2NjYuLjIwNzMwM2QgMTAwNjQ0Ci0tLSBhL01ha2VmaWxlCisrKyBiL01ha2VmaWxlCkBAIC0xLDcgKzEsNyBAQAogVkVSU0lPTiA9IDIKIFBBVENITEVWRUwgPSA2Ci1TVUJMRVZFTCA9IDI4Ci1FWFRSQVZFUlNJT04gPQorU1VCTEVWRUwgPSAyOQorRVhUUkFWRVJTSU9OID0gLXJjMgogTkFNRSA9IEVyb3RpYyBQaWNrbGVkIEhlcnJpbmcKIAogIyAqRE9DVU1FTlRBVElPTioKQEAgLTk2NSw2ICs5NjUsNyBAQAogCSAgICBta2RpciAtcCBpbmNsdWRlMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAJICAgIGxuIC1mc24gJChzcmN0cmVlKS9pbmNsdWRlL2FzbS0kKFNSQ0FSQ0gpIGluY2x1ZGUyL2FzbTsgICAgIFwKIAlmaQorCWxuIC1mc24gJChzcmN0cmVlKSBzb3VyY2UKIGVuZGlmCiAKICMgcHJlcGFyZTIgY3JlYXRlcyBhIG1ha2VmaWxlIGlmIHVzaW5nIGEgc2VwYXJhdGUgb3V0cHV0IGRpcmVjdG9yeQpAQCAtMTAwOCw3ICsxMDA5LDcgQEAKIGVuZGVmCiAKICMgV2UgY3JlYXRlIHRoZSB0YXJnZXQgZGlyZWN0b3J5IG9mIHRoZSBzeW1saW5rIGlmIGl0IGRvZXMKLSMgbm90IGV4aXN0IHNvIHRoZSB0ZXN0IGluIGNoYWNrLXN5bWxpbmsgd29ya3MgYW5kIHdlIGhhdmUgYQorIyBub3QgZXhpc3Qgc28gdGhlIHRlc3QgaW4gY2hlY2stc3ltbGluayB3b3JrcyBhbmQgd2UgaGF2ZSBhCiAjIGRpcmVjdG9yeSBmb3IgZ2VuZXJhdGVkIGZpbGVzYXMgdXNlZCBieSBzb21lIGFyY2hpdGVjdHVyZXMuCiBkZWZpbmUgY3JlYXRlLXN5bWxpbmsKIAlpZiBbICEgLUwgaW5jbHVkZS9hc20gXTsgdGhlbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXApkaWZmIC0tZ2l0IGEvYXJjaC9LY29uZmlnIGIvYXJjaC9LY29uZmlnCmluZGV4IDJlMTNhYTIuLjU1MGRhYjIgMTAwNjQ0Ci0tLSBhL2FyY2gvS2NvbmZpZworKysgYi9hcmNoL0tjb25maWcKQEAgLTYyLDYgKzYyLDkgQEAKIAkgIFNlZSBEb2N1bWVudGF0aW9uL3VuYWxpZ25lZC1tZW1vcnktYWNjZXNzLnR4dCBmb3IgbW9yZQogCSAgaW5mb3JtYXRpb24gb24gdGhlIHRvcGljIG9mIHVuYWxpZ25lZCBtZW1vcnkgYWNjZXNzZXMuCiAKK2NvbmZpZyBIQVZFX1NZU0NBTExfV1JBUFBFUlMKKwlib29sCisKIGNvbmZpZyBLUkVUUFJPQkVTCiAJZGVmX2Jvb2wgeQogCWRlcGVuZHMgb24gS1BST0JFUyAmJiBIQVZFX0tSRVRQUk9CRVMKZGlmZiAtLWdpdCBhL2FyY2gvYWxwaGEvaW5jbHVkZS9hc20vS2J1aWxkIGIvYXJjaC9hbHBoYS9pbmNsdWRlL2FzbS9LYnVpbGQKaW5kZXggNGRhZDI3My4uYjdjOGYxOCAxMDA2NDQKLS0tIGEvYXJjaC9hbHBoYS9pbmNsdWRlL2FzbS9LYnVpbGQKKysrIGIvYXJjaC9hbHBoYS9pbmNsdWRlL2FzbS9LYnVpbGQKQEAgLTksNCArOSwzIEBACiB1bmlmZGVmLXkgKz0gZnB1LmgKIHVuaWZkZWYteSArPSBzeXNpbmZvLmgKIHVuaWZkZWYteSArPSBjb21waWxlci5oCi11bmlmZGVmLXkgKz0gc3dhYi5oCmRpZmYgLS1naXQgYS9hcmNoL2FscGhhL2luY2x1ZGUvYXNtL2J5dGVvcmRlci5oIGIvYXJjaC9hbHBoYS9pbmNsdWRlL2FzbS9ieXRlb3JkZXIuaAppbmRleCA2NzcyZjMxLi43MzY4MzA5IDEwMDY0NAotLS0gYS9hcmNoL2FscGhhL2luY2x1ZGUvYXNtL2J5dGVvcmRlci5oCisrKyBiL2FyY2gvYWxwaGEvaW5jbHVkZS9hc20vYnl0ZW9yZGVyLmgKQEAgLTEsNyArMSw2IEBACiAjaWZuZGVmIF9BTFBIQV9CWVRFT1JERVJfSAogI2RlZmluZSBfQUxQSEFfQllURU9SREVSX0gKIAotI2luY2x1ZGUgPGFzbS9zd2FiLmg+CiAjaW5jbHVkZSA8bGludXgvYnl0ZW9yZGVyL2xpdHRsZV9lbmRpYW4uaD4KIAogI2VuZGlmIC8qIF9BTFBIQV9CWVRFT1JERVJfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hbHBoYS9pbmNsdWRlL2FzbS9tYWNodmVjLmggYi9hcmNoL2FscGhhL2luY2x1ZGUvYXNtL21hY2h2ZWMuaAppbmRleCBhODZjMDgzLi5mZWE0ZWE3IDEwMDY0NAotLS0gYS9hcmNoL2FscGhhL2luY2x1ZGUvYXNtL21hY2h2ZWMuaAorKysgYi9hcmNoL2FscGhhL2luY2x1ZGUvYXNtL21hY2h2ZWMuaApAQCAtMjEsNiArMjEsNyBAQAogc3RydWN0IHBjaV9vcHM7CiBzdHJ1Y3QgcGNpX2NvbnRyb2xsZXI7CiBzdHJ1Y3QgX2FscGhhX2FncF9pbmZvOworc3RydWN0IHJ0Y190aW1lOwogCiBzdHJ1Y3QgYWxwaGFfbWFjaGluZV92ZWN0b3IKIHsKQEAgLTk0LDYgKzk1LDkgQEAKIAogCXN0cnVjdCBfYWxwaGFfYWdwX2luZm8gKigqYWdwX2luZm8pKHZvaWQpOwogCisJdW5zaWduZWQgaW50ICgqcnRjX2dldF90aW1lKShzdHJ1Y3QgcnRjX3RpbWUgKik7CisJaW50ICgqcnRjX3NldF90aW1lKShzdHJ1Y3QgcnRjX3RpbWUgKik7CisKIAljb25zdCBjaGFyICp2ZWN0b3JfbmFtZTsKIAogCS8qIE5VTUEgaW5mb3JtYXRpb24gKi8KZGlmZiAtLWdpdCBhL2FyY2gvYWxwaGEvaW5jbHVkZS9hc20vcGdhbGxvYy5oIGIvYXJjaC9hbHBoYS9pbmNsdWRlL2FzbS9wZ2FsbG9jLmgKaW5kZXggZmQwOTAxNS4uYmMyYTBkYSAxMDA2NDQKLS0tIGEvYXJjaC9hbHBoYS9pbmNsdWRlL2FzbS9wZ2FsbG9jLmgKKysrIGIvYXJjaC9hbHBoYS9pbmNsdWRlL2FzbS9wZ2FsbG9jLmgKQEAgLTUwLDcgKzUwLDEyIEBACiAJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKXBtZCk7CiB9CiAKLWV4dGVybiBwdGVfdCAqcHRlX2FsbG9jX29uZV9rZXJuZWwoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkcik7CitzdGF0aWMgaW5saW5lIHB0ZV90ICoKK3B0ZV9hbGxvY19vbmVfa2VybmVsKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MpCit7CisJcHRlX3QgKnB0ZSA9IChwdGVfdCAqKV9fZ2V0X2ZyZWVfcGFnZShHRlBfS0VSTkVMfF9fR0ZQX1JFUEVBVHxfX0dGUF9aRVJPKTsKKwlyZXR1cm4gcHRlOworfQogCiBzdGF0aWMgaW5saW5lIHZvaWQKIHB0ZV9mcmVlX2tlcm5lbChzdHJ1Y3QgbW1fc3RydWN0ICptbSwgcHRlX3QgKnB0ZSkKZGlmZiAtLWdpdCBhL2FyY2gvYWxwaGEvaW5jbHVkZS9hc20vcnRjLmggYi9hcmNoL2FscGhhL2luY2x1ZGUvYXNtL3J0Yy5oCmluZGV4IDRlODU0YjEuLjFmN2ZiYTYgMTAwNjQ0Ci0tLSBhL2FyY2gvYWxwaGEvaW5jbHVkZS9hc20vcnRjLmgKKysrIGIvYXJjaC9hbHBoYS9pbmNsdWRlL2FzbS9ydGMuaApAQCAtMSw5ICsxLDE1IEBACiAjaWZuZGVmIF9BTFBIQV9SVENfSAogI2RlZmluZSBfQUxQSEFfUlRDX0gKIAotLyoKLSAqIEFscGhhIHVzZXMgdGhlIGRlZmF1bHQgYWNjZXNzIG1ldGhvZHMgZm9yIHRoZSBSVEMuCi0gKi8KKyNpZiBkZWZpbmVkKENPTkZJR19BTFBIQV9HRU5FUklDKQorIyBkZWZpbmUgZ2V0X3J0Y190aW1lCQlhbHBoYV9tdi5ydGNfZ2V0X3RpbWUKKyMgZGVmaW5lIHNldF9ydGNfdGltZQkJYWxwaGFfbXYucnRjX3NldF90aW1lCisjZWxzZQorIyBpZiBkZWZpbmVkKENPTkZJR19BTFBIQV9NQVJWRUwpICYmIGRlZmluZWQoQ09ORklHX1NNUCkKKyMgIGRlZmluZSBnZXRfcnRjX3RpbWUJCW1hcnZlbF9nZXRfcnRjX3RpbWUKKyMgIGRlZmluZSBzZXRfcnRjX3RpbWUJCW1hcnZlbF9zZXRfcnRjX3RpbWUKKyMgZW5kaWYKKyNlbmRpZgogCiAjaW5jbHVkZSA8YXNtLWdlbmVyaWMvcnRjLmg+CiAKZGlmZiAtLWdpdCBhL2FyY2gvYWxwaGEva2VybmVsLy5naXRpZ25vcmUgYi9hcmNoL2FscGhhL2tlcm5lbC8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1ZjY3NmMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FscGhhL2tlcm5lbC8uZ2l0aWdub3JlCkBAIC0wLDAgKzEgQEAKK3ZtbGludXgubGRzCmRpZmYgLS1naXQgYS9hcmNoL2FscGhhL2tlcm5lbC9jb3JlX21hcnZlbC5jIGIvYXJjaC9hbHBoYS9rZXJuZWwvY29yZV9tYXJ2ZWwuYwppbmRleCA5Y2Q4ZGNhLi5lMzAyZGFlIDEwMDY0NAotLS0gYS9hcmNoL2FscGhhL2tlcm5lbC9jb3JlX21hcnZlbC5jCisrKyBiL2FyY2gvYWxwaGEva2VybmVsL2NvcmVfbWFydmVsLmMKQEAgLTY1OCwxNiArNjU4LDggQEAKIAkJcnRjX2FjY2Vzcy5kYXRhID0gYmNkMmJpbihiKTsKIAkJcnRjX2FjY2Vzcy5mdW5jdGlvbiA9IDB4NDggKyAhd3JpdGU7CS8qIEdFVC9QVVRfVE9ZICovCiAKLSNpZmRlZiBDT05GSUdfU01QCi0JCWlmIChzbXBfcHJvY2Vzc29yX2lkKCkgIT0gYm9vdF9jcHVpZCkKLQkJCXNtcF9jYWxsX2Z1bmN0aW9uX3NpbmdsZShib290X2NwdWlkLAotCQkJCQkJIF9fbWFydmVsX2FjY2Vzc19ydGMsCi0JCQkJCQkgJnJ0Y19hY2Nlc3MsIDEpOwotCQllbHNlCi0JCQlfX21hcnZlbF9hY2Nlc3NfcnRjKCZydGNfYWNjZXNzKTsKLSNlbHNlCiAJCV9fbWFydmVsX2FjY2Vzc19ydGMoJnJ0Y19hY2Nlc3MpOwotI2VuZGlmCisKIAkJcmV0ID0gYmluMmJjZChydGNfYWNjZXNzLmRhdGEpOwogCQlicmVhazsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hbHBoYS9rZXJuZWwvZW50cnkuUyBiL2FyY2gvYWxwaGEva2VybmVsL2VudHJ5LlMKaW5kZXggZjc3MzQ1Yi4uYWEyZTUwYyAxMDA2NDQKLS0tIGEvYXJjaC9hbHBoYS9rZXJuZWwvZW50cnkuUworKysgYi9hcmNoL2FscGhhL2tlcm5lbC9lbnRyeS5TCkBAIC04OTYsOSArODk2LDkgQEAKIC5lbmQgc3lzX2dldHhwaWQKIAogCS5hbGlnbgk0Ci0JLmdsb2JsCXN5c19waXBlCi0JLmVudAlzeXNfcGlwZQotc3lzX3BpcGU6CisJLmdsb2JsCXN5c19hbHBoYV9waXBlCisJLmVudAlzeXNfYWxwaGFfcGlwZQorc3lzX2FscGhhX3BpcGU6CiAJbGRhCSRzcCwgLTE2KCRzcCkKIAlzdHEJJDI2LCAwKCRzcCkKIAkucHJvbG9ndWUgMApAQCAtOTE2LDcgKzkxNiw3IEBACiAJc3RxCSQxLCA4MCsxNigkc3ApCiAxOglsZGEJJHNwLCAxNigkc3ApCiAJcmV0Ci0uZW5kIHN5c19waXBlCisuZW5kIHN5c19hbHBoYV9waXBlCiAKIAkuYWxpZ24JNAogCS5nbG9ibAlzeXNfZXhlY3ZlCmRpZmYgLS1naXQgYS9hcmNoL2FscGhhL2tlcm5lbC9pcnFfc3JtLmMgYi9hcmNoL2FscGhhL2tlcm5lbC9pcnFfc3JtLmMKaW5kZXggMzIyMTIwMS4uYTAzZmJjYSAxMDA2NDQKLS0tIGEvYXJjaC9hbHBoYS9rZXJuZWwvaXJxX3NybS5jCisrKyBiL2FyY2gvYWxwaGEva2VybmVsL2lycV9zcm0uYwpAQCAtNjMsNiArNjMsOCBAQAogewogCWxvbmcgaTsKIAorCWlmIChOUl9JUlFTIDw9IDE2KQorCQlyZXR1cm47CiAJZm9yIChpID0gMTY7IGkgPCBtYXg7ICsraSkgewogCQlpZiAoaSA8IDY0ICYmICgoaWdub3JlX21hc2sgPj4gaSkgJiAxKSkKIAkJCWNvbnRpbnVlOwpkaWZmIC0tZ2l0IGEvYXJjaC9hbHBoYS9rZXJuZWwvbWFjaHZlY19pbXBsLmggYi9hcmNoL2FscGhhL2tlcm5lbC9tYWNodmVjX2ltcGwuaAppbmRleCA0NjZjOWRmLi41MTI2ODVmIDEwMDY0NAotLS0gYS9hcmNoL2FscGhhL2tlcm5lbC9tYWNodmVjX2ltcGwuaAorKysgYi9hcmNoL2FscGhhL2tlcm5lbC9tYWNodmVjX2ltcGwuaApAQCAtNDAsNyArNDAsMTAgQEAKICNkZWZpbmUgQ0FUMSh4LHkpICB4IyN5CiAjZGVmaW5lIENBVCh4LHkpICAgQ0FUMSh4LHkpCiAKLSNkZWZpbmUgRE9fREVGQVVMVF9SVEMgLnJ0Y19wb3J0ID0gMHg3MAorI2RlZmluZSBET19ERUZBVUxUX1JUQyBcCisJLnJ0Y19wb3J0ID0gMHg3MCwgXAorCS5ydGNfZ2V0X3RpbWUgPSBjb21tb25fZ2V0X3J0Y190aW1lLCBcCisJLnJ0Y19zZXRfdGltZSA9IGNvbW1vbl9zZXRfcnRjX3RpbWUKIAogI2RlZmluZSBET19FVjRfTU1VCQkJCQkJCVwKIAkubWF4X2FzbiA9CQkJRVY0X01BWF9BU04sCQkJXApkaWZmIC0tZ2l0IGEvYXJjaC9hbHBoYS9rZXJuZWwvcGNpLmMgYi9hcmNoL2FscGhhL2tlcm5lbC9wY2kuYwppbmRleCBmZjhjYjYzLi5hM2I5Mzg4IDEwMDY0NAotLS0gYS9hcmNoL2FscGhhL2tlcm5lbC9wY2kuYworKysgYi9hcmNoL2FscGhhL2tlcm5lbC9wY2kuYwpAQCAtMzIwLDI0ICszMjAsNiBAQAogCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIFBDSV9JTlRFUlJVUFRfTElORSwgaXJxKTsKIH0KIAotLyogTW9zdCBBbHBoYXMgaGF2ZSBzdHJhaWdodC1mb3J3YXJkIHN3aXp6bGluZyBuZWVkcy4gICovCi0KLXU4IF9faW5pdAotY29tbW9uX3N3aXp6bGUoc3RydWN0IHBjaV9kZXYgKmRldiwgdTggKnBpbnApCi17Ci0JdTggcGluID0gKnBpbnA7Ci0KLQl3aGlsZSAoZGV2LT5idXMtPnBhcmVudCkgewotCQlwaW4gPSBicmlkZ2Vfc3dpenpsZShwaW4sIFBDSV9TTE9UKGRldi0+ZGV2Zm4pKTsKLQkJLyogTW92ZSB1cCB0aGUgY2hhaW4gb2YgYnJpZGdlcy4gKi8KLQkJZGV2ID0gZGV2LT5idXMtPnNlbGY7Ci0gICAgICAgIH0KLQkqcGlucCA9IHBpbjsKLQotCS8qIFRoZSBzbG90IGlzIHRoZSBzbG90IG9mIHRoZSBsYXN0IGJyaWRnZS4gKi8KLQlyZXR1cm4gUENJX1NMT1QoZGV2LT5kZXZmbik7Ci19Ci0KIHZvaWQKIHBjaWJpb3NfcmVzb3VyY2VfdG9fYnVzKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHN0cnVjdCBwY2lfYnVzX3JlZ2lvbiAqcmVnaW9uLAogCQkJIHN0cnVjdCByZXNvdXJjZSAqcmVzKQpkaWZmIC0tZ2l0IGEvYXJjaC9hbHBoYS9rZXJuZWwvcGNpX2ltcGwuaCBiL2FyY2gvYWxwaGEva2VybmVsL3BjaV9pbXBsLmgKaW5kZXggZjhiNzQ5OS4uMDBlZGQwNCAxMDA2NDQKLS0tIGEvYXJjaC9hbHBoYS9rZXJuZWwvcGNpX2ltcGwuaAorKysgYi9hcmNoL2FscGhhL2tlcm5lbC9wY2lfaW1wbC5oCkBAIC0xMDYsMTYgKzEwNiwxMSBAQAogICogICBXaGVyZSBBID0gcGluIDEsIEIgPSBwaW4gMiBhbmQgc28gb24gYW5kIHBpbj0wID0gZGVmYXVsdCA9IEEuCiAgKiAgIFRodXMsIGVhY2ggc3dpenpsZSBpcyAoKHBpbi0xKSArIChkZXZpY2UjLTQpKSAlIDQKICAqCi0gKiAgIFRoZSBmb2xsb3dpbmcgY29kZSBzd2l6emxlcyBmb3IgZXhhY3RseSBvbmUgYnJpZGdlLiAgVGhlIHJvdXRpbmUKLSAqICAgY29tbW9uX3N3aXp6bGUgYmVsb3cgaGFuZGxlcyBtdWx0aXBsZSBicmlkZ2VzLiAgQnV0IHRoZXJlIGFyZSBhCi0gKiAgIGNvdXBsZSBib2FyZHMgdGhhdCBkbyBzdHJhbmdlIHRoaW5ncywgc28gd2UgZGVmaW5lIHRoaXMgaGVyZS4KKyAqICAgcGNpX3N3aXp6bGVfaW50ZXJydXB0X3BpbigpIHN3aXp6bGVzIGZvciBleGFjdGx5IG9uZSBicmlkZ2UuICBUaGUgcm91dGluZQorICogICBwY2lfY29tbW9uX3N3aXp6bGUoKSBoYW5kbGVzIG11bHRpcGxlIGJyaWRnZXMuICBCdXQgdGhlcmUgYXJlIGEKKyAqICAgY291cGxlIGJvYXJkcyB0aGF0IGRvIHN0cmFuZ2UgdGhpbmdzLgogICovCiAKLXN0YXRpYyBpbmxpbmUgdTggYnJpZGdlX3N3aXp6bGUodTggcGluLCB1OCBzbG90KSAKLXsKLQlyZXR1cm4gKCgocGluLTEpICsgc2xvdCkgJSA0KSArIDE7Ci19Ci0KIAogLyogVGhlIGZvbGxvd2luZyBtYWNybyBpcyB1c2VkIHRvIGltcGxlbWVudCB0aGUgdGFibGUtYmFzZWQgaXJxIG1hcHBpbmcKICAgIGZ1bmN0aW9uIGZvciBhbGwgc2luZ2xlLWJ1cyBBbHBoYXMuICAqLwpAQCAtMTg0LDcgKzE3OSw3IEBACiBleHRlcm4gdW5zaWduZWQgbG9uZyBhbHBoYV9hZ3BnYXJ0X3NpemU7CiAKIGV4dGVybiB2b2lkIGNvbW1vbl9pbml0X3BjaSh2b2lkKTsKLWV4dGVybiB1OCBjb21tb25fc3dpenpsZShzdHJ1Y3QgcGNpX2RldiAqLCB1OCAqKTsKKyNkZWZpbmUgY29tbW9uX3N3aXp6bGUgcGNpX2NvbW1vbl9zd2l6emxlCiBleHRlcm4gc3RydWN0IHBjaV9jb250cm9sbGVyICphbGxvY19wY2lfY29udHJvbGxlcih2b2lkKTsKIGV4dGVybiBzdHJ1Y3QgcmVzb3VyY2UgKmFsbG9jX3Jlc291cmNlKHZvaWQpOwogCmRpZmYgLS1naXQgYS9hcmNoL2FscGhhL2tlcm5lbC9wcm90by5oIGIvYXJjaC9hbHBoYS9rZXJuZWwvcHJvdG8uaAppbmRleCA3MDhkNWNhLi5mZTE0YzY3IDEwMDY0NAotLS0gYS9hcmNoL2FscGhhL2tlcm5lbC9wcm90by5oCisrKyBiL2FyY2gvYWxwaGEva2VybmVsL3Byb3RvLmgKQEAgLTE0NSw2ICsxNDUsOCBAQAogZXh0ZXJuIGlycXJldHVybl90IHRpbWVyX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXYpOwogZXh0ZXJuIHZvaWQgY29tbW9uX2luaXRfcnRjKHZvaWQpOwogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgZXN0X2N5Y2xlX2ZyZXE7CitleHRlcm4gdW5zaWduZWQgaW50IGNvbW1vbl9nZXRfcnRjX3RpbWUoc3RydWN0IHJ0Y190aW1lICp0aW1lKTsKK2V4dGVybiBpbnQgY29tbW9uX3NldF9ydGNfdGltZShzdHJ1Y3QgcnRjX3RpbWUgKnRpbWUpOwogCiAvKiBzbWMzN2M5M3guYyAqLwogZXh0ZXJuIHZvaWQgU01DOTN4X0luaXQodm9pZCk7CmRpZmYgLS1naXQgYS9hcmNoL2FscGhhL2tlcm5lbC9zeXNfZHAyNjQuYyBiL2FyY2gvYWxwaGEva2VybmVsL3N5c19kcDI2NC5jCmluZGV4IGFiNDRjMTYuLjljOWQxZmQgMTAwNjQ0Ci0tLSBhL2FyY2gvYWxwaGEva2VybmVsL3N5c19kcDI2NC5jCisrKyBiL2FyY2gvYWxwaGEva2VybmVsL3N5c19kcDI2NC5jCkBAIC00ODEsNyArNDgxLDcgQEAKIAkJCQlzbG90ID0gUENJX1NMT1QoZGV2LT5kZXZmbik7CiAJCQkJYnJlYWs7CiAJCQl9Ci0JCQlwaW4gPSBicmlkZ2Vfc3dpenpsZShwaW4sIFBDSV9TTE9UKGRldi0+ZGV2Zm4pKSA7CisJCQlwaW4gPSBwY2lfc3dpenpsZV9pbnRlcnJ1cHRfcGluKGRldiwgcGluKTsKIAogCQkJLyogTW92ZSB1cCB0aGUgY2hhaW4gb2YgYnJpZGdlcy4gICovCiAJCQlkZXYgPSBkZXYtPmJ1cy0+c2VsZjsKZGlmZiAtLWdpdCBhL2FyY2gvYWxwaGEva2VybmVsL3N5c19laWdlci5jIGIvYXJjaC9hbHBoYS9rZXJuZWwvc3lzX2VpZ2VyLmMKaW5kZXggN2VmM2I2Zi4uYmFmNjBmMyAxMDA2NDQKLS0tIGEvYXJjaC9hbHBoYS9rZXJuZWwvc3lzX2VpZ2VyLmMKKysrIGIvYXJjaC9hbHBoYS9rZXJuZWwvc3lzX2VpZ2VyLmMKQEAgLTIwNCw3ICsyMDQsNyBAQAogCQkJYnJlYWs7CiAJCX0KIAkJLyogTXVzdCBiZSBhIGNhcmQtYmFzZWQgYnJpZGdlLiAgKi8KLQkJcGluID0gYnJpZGdlX3N3aXp6bGUocGluLCBQQ0lfU0xPVChkZXYtPmRldmZuKSk7CisJCXBpbiA9IHBjaV9zd2l6emxlX2ludGVycnVwdF9waW4oZGV2LCBwaW4pOwogCiAJCS8qIE1vdmUgdXAgdGhlIGNoYWluIG9mIGJyaWRnZXMuICAqLwogCQlkZXYgPSBkZXYtPmJ1cy0+c2VsZjsKZGlmZiAtLWdpdCBhL2FyY2gvYWxwaGEva2VybmVsL3N5c19qZW5zZW4uYyBiL2FyY2gvYWxwaGEva2VybmVsL3N5c19qZW5zZW4uYwppbmRleCAyYzNkZTk3Li5lMjUxNmY5IDEwMDY0NAotLS0gYS9hcmNoL2FscGhhL2tlcm5lbC9zeXNfamVuc2VuLmMKKysrIGIvYXJjaC9hbHBoYS9rZXJuZWwvc3lzX2plbnNlbi5jCkBAIC0yNjEsNiArMjYxLDggQEAKIAkubWFjaGluZV9jaGVjawkJPSBqZW5zZW5fbWFjaGluZV9jaGVjaywKIAkubWF4X2lzYV9kbWFfYWRkcmVzcwk9IEFMUEhBX01BWF9JU0FfRE1BX0FERFJFU1MsCiAJLnJ0Y19wb3J0CQk9IDB4MTcwLAorCS5ydGNfZ2V0X3RpbWUJCT0gY29tbW9uX2dldF9ydGNfdGltZSwKKwkucnRjX3NldF90aW1lCQk9IGNvbW1vbl9zZXRfcnRjX3RpbWUsCiAKIAkubnJfaXJxcwkJPSAxNiwKIAkuZGV2aWNlX2ludGVycnVwdAk9IGplbnNlbl9kZXZpY2VfaW50ZXJydXB0LApkaWZmIC0tZ2l0IGEvYXJjaC9hbHBoYS9rZXJuZWwvc3lzX21hcnZlbC5jIGIvYXJjaC9hbHBoYS9rZXJuZWwvc3lzX21hcnZlbC5jCmluZGV4IDgyODQ0OWMuLmM1YTFhMjQgMTAwNjQ0Ci0tLSBhL2FyY2gvYWxwaGEva2VybmVsL3N5c19tYXJ2ZWwuYworKysgYi9hcmNoL2FscGhhL2tlcm5lbC9zeXNfbWFydmVsLmMKQEAgLTIzLDYgKzIzLDcgQEAKICNpbmNsdWRlIDxhc20vaHdycGIuaD4KICNpbmNsdWRlIDxhc20vdGxiZmx1c2guaD4KICNpbmNsdWRlIDxhc20vdmdhLmg+CisjaW5jbHVkZSA8YXNtL3J0Yy5oPgogCiAjaW5jbHVkZSAicHJvdG8uaCIKICNpbmNsdWRlICJlcnJfaW1wbC5oIgpAQCAtNDI2LDYgKzQyNyw1NyBAQAogCWluaXRfcnRjX2lycSgpOwogfQogCitzdHJ1Y3QgbWFydmVsX3J0Y190aW1lIHsKKwlzdHJ1Y3QgcnRjX3RpbWUgKnRpbWU7CisJaW50IHJldHZhbDsKK307CisKKyNpZmRlZiBDT05GSUdfU01QCitzdGF0aWMgdm9pZAorc21wX2dldF9ydGNfdGltZSh2b2lkICpkYXRhKQoreworCXN0cnVjdCBtYXJ2ZWxfcnRjX3RpbWUgKm1ydCA9IGRhdGE7CisJbXJ0LT5yZXR2YWwgPSBfX2dldF9ydGNfdGltZShtcnQtPnRpbWUpOworfQorCitzdGF0aWMgdm9pZAorc21wX3NldF9ydGNfdGltZSh2b2lkICpkYXRhKQoreworCXN0cnVjdCBtYXJ2ZWxfcnRjX3RpbWUgKm1ydCA9IGRhdGE7CisJbXJ0LT5yZXR2YWwgPSBfX3NldF9ydGNfdGltZShtcnQtPnRpbWUpOworfQorI2VuZGlmCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQKK21hcnZlbF9nZXRfcnRjX3RpbWUoc3RydWN0IHJ0Y190aW1lICp0aW1lKQoreworI2lmZGVmIENPTkZJR19TTVAKKwlzdHJ1Y3QgbWFydmVsX3J0Y190aW1lIG1ydDsKKworCWlmIChzbXBfcHJvY2Vzc29yX2lkKCkgIT0gYm9vdF9jcHVpZCkgeworCQltcnQudGltZSA9IHRpbWU7CisJCXNtcF9jYWxsX2Z1bmN0aW9uX3NpbmdsZShib290X2NwdWlkLCBzbXBfZ2V0X3J0Y190aW1lLCAmbXJ0LCAxKTsKKwkJcmV0dXJuIG1ydC5yZXR2YWw7CisJfQorI2VuZGlmCisJcmV0dXJuIF9fZ2V0X3J0Y190aW1lKHRpbWUpOworfQorCitzdGF0aWMgaW50CittYXJ2ZWxfc2V0X3J0Y190aW1lKHN0cnVjdCBydGNfdGltZSAqdGltZSkKK3sKKyNpZmRlZiBDT05GSUdfU01QCisJc3RydWN0IG1hcnZlbF9ydGNfdGltZSBtcnQ7CisKKwlpZiAoc21wX3Byb2Nlc3Nvcl9pZCgpICE9IGJvb3RfY3B1aWQpIHsKKwkJbXJ0LnRpbWUgPSB0aW1lOworCQlzbXBfY2FsbF9mdW5jdGlvbl9zaW5nbGUoYm9vdF9jcHVpZCwgc21wX3NldF9ydGNfdGltZSwgJm1ydCwgMSk7CisJCXJldHVybiBtcnQucmV0dmFsOworCX0KKyNlbmRpZgorCXJldHVybiBfX3NldF9ydGNfdGltZSh0aW1lKTsKK30KKwogc3RhdGljIHZvaWQKIG1hcnZlbF9zbXBfY2FsbGluKHZvaWQpCiB7CkBAIC00NjYsNyArNTE4LDkgQEAKIHN0cnVjdCBhbHBoYV9tYWNoaW5lX3ZlY3RvciBtYXJ2ZWxfZXY3X212IF9faW5pdG12ID0gewogCS52ZWN0b3JfbmFtZQkJPSAiTUFSVkVML0VWNyIsCiAJRE9fRVY3X01NVSwKLQlET19ERUZBVUxUX1JUQywKKwkucnRjX3BvcnQJCT0gMHg3MCwKKwkucnRjX2dldF90aW1lCQk9IG1hcnZlbF9nZXRfcnRjX3RpbWUsCisJLnJ0Y19zZXRfdGltZQkJPSBtYXJ2ZWxfc2V0X3J0Y190aW1lLAogCURPX01BUlZFTF9JTywKIAkubWFjaGluZV9jaGVjawkJPSBtYXJ2ZWxfbWFjaGluZV9jaGVjaywKIAkubWF4X2lzYV9kbWFfYWRkcmVzcwk9IEFMUEhBX01BWF9JU0FfRE1BX0FERFJFU1MsCmRpZmYgLS1naXQgYS9hcmNoL2FscGhhL2tlcm5lbC9zeXNfbWlhdGEuYyBiL2FyY2gvYWxwaGEva2VybmVsL3N5c19taWF0YS5jCmluZGV4IDkxMGI0M2MuLjYxY2NkOTUgMTAwNjQ0Ci0tLSBhL2FyY2gvYWxwaGEva2VybmVsL3N5c19taWF0YS5jCisrKyBiL2FyY2gvYWxwaGEva2VybmVsL3N5c19taWF0YS5jCkBAIC0yMTksNyArMjE5LDcgQEAKIAkJCQlzbG90ID0gUENJX1NMT1QoZGV2LT5kZXZmbikgKyA5OwogCQkJCWJyZWFrOwogCQkJfQotCQkJcGluID0gYnJpZGdlX3N3aXp6bGUocGluLCBQQ0lfU0xPVChkZXYtPmRldmZuKSk7CisJCQlwaW4gPSBwY2lfc3dpenpsZV9pbnRlcnJ1cHRfcGluKGRldiwgcGluKTsKIAogCQkJLyogTW92ZSB1cCB0aGUgY2hhaW4gb2YgYnJpZGdlcy4gICovCiAJCQlkZXYgPSBkZXYtPmJ1cy0+c2VsZjsKZGlmZiAtLWdpdCBhL2FyY2gvYWxwaGEva2VybmVsL3N5c19uYXV0aWx1cy5jIGIvYXJjaC9hbHBoYS9rZXJuZWwvc3lzX25hdXRpbHVzLmMKaW5kZXggYTdmMjNiNS4uOTljMGY0NiAxMDA2NDQKLS0tIGEvYXJjaC9hbHBoYS9rZXJuZWwvc3lzX25hdXRpbHVzLmMKKysrIGIvYXJjaC9hbHBoYS9rZXJuZWwvc3lzX25hdXRpbHVzLmMKQEAgLTI0NSw2ICsyNDUsMTAgQEAKIAkJSVJPTkdBVEUwLT5wY2lfbWVtID0gcGNpX21lbTsKIAogCXBjaV9idXNfYXNzaWduX3Jlc291cmNlcyhidXMpOworCisJLyogcGNpX2NvbW1vbl9zd2l6emxlKCkgcmVsaWVzIG9uIGJ1cy0+c2VsZiBiZWluZyBOVUxMCisJICAgZm9yIHRoZSByb290IGJ1cywgc28ganVzdCBjbGVhciBpdC4gKi8KKwlidXMtPnNlbGYgPSBOVUxMOwogCXBjaV9maXh1cF9pcnFzKGFscGhhX212LnBjaV9zd2l6emxlLCBhbHBoYV9tdi5wY2lfbWFwX2lycSk7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvYWxwaGEva2VybmVsL3N5c19ub3JpdGFrZS5jIGIvYXJjaC9hbHBoYS9rZXJuZWwvc3lzX25vcml0YWtlLmMKaW5kZXggZWIyYTFkNi4uNTM4ODc2YiAxMDA2NDQKLS0tIGEvYXJjaC9hbHBoYS9rZXJuZWwvc3lzX25vcml0YWtlLmMKKysrIGIvYXJjaC9hbHBoYS9rZXJuZWwvc3lzX25vcml0YWtlLmMKQEAgLTI1Nyw3ICsyNTcsNyBAQAogCQkJCXNsb3QgPSBQQ0lfU0xPVChkZXYtPmRldmZuKSArIDE1OwogCQkJCWJyZWFrOwogCQkJfQotCQkJcGluID0gYnJpZGdlX3N3aXp6bGUocGluLCBQQ0lfU0xPVChkZXYtPmRldmZuKSkgOworCQkJcGluID0gcGNpX3N3aXp6bGVfaW50ZXJydXB0X3BpbihkZXYsIHBpbik7CiAKIAkJCS8qIE1vdmUgdXAgdGhlIGNoYWluIG9mIGJyaWRnZXMuICAqLwogCQkJZGV2ID0gZGV2LT5idXMtPnNlbGY7CmRpZmYgLS1naXQgYS9hcmNoL2FscGhhL2tlcm5lbC9zeXNfcnVmZmlhbi5jIGIvYXJjaC9hbHBoYS9rZXJuZWwvc3lzX3J1ZmZpYW4uYwppbmRleCA1Yjk5Y2YzLi5mMTVhMzI5IDEwMDY0NAotLS0gYS9hcmNoL2FscGhhL2tlcm5lbC9zeXNfcnVmZmlhbi5jCisrKyBiL2FyY2gvYWxwaGEva2VybmVsL3N5c19ydWZmaWFuLmMKQEAgLTE2MCw3ICsxNjAsNyBAQAogCQkJCXNsb3QgPSBQQ0lfU0xPVChkZXYtPmRldmZuKSArIDEwOwogCQkJCWJyZWFrOwogCQkJfQotCQkJcGluID0gYnJpZGdlX3N3aXp6bGUocGluLCBQQ0lfU0xPVChkZXYtPmRldmZuKSk7CisJCQlwaW4gPSBwY2lfc3dpenpsZV9pbnRlcnJ1cHRfcGluKGRldiwgcGluKTsKIAogCQkJLyogTW92ZSB1cCB0aGUgY2hhaW4gb2YgYnJpZGdlcy4gICovCiAJCQlkZXYgPSBkZXYtPmJ1cy0+c2VsZjsKZGlmZiAtLWdpdCBhL2FyY2gvYWxwaGEva2VybmVsL3N5c19zYWJsZS5jIGIvYXJjaC9hbHBoYS9rZXJuZWwvc3lzX3NhYmxlLmMKaW5kZXggYTQ1NTVmNC4uZDIzMmU0MiAxMDA2NDQKLS0tIGEvYXJjaC9hbHBoYS9rZXJuZWwvc3lzX3NhYmxlLmMKKysrIGIvYXJjaC9hbHBoYS9rZXJuZWwvc3lzX3NhYmxlLmMKQEAgLTQyNSw3ICs0MjUsNyBAQAogCQkJCXNsb3QgPSBQQ0lfU0xPVChkZXYtPmRldmZuKSArIDExOwogCQkJCWJyZWFrOwogCQkJfQotCQkJcGluID0gYnJpZGdlX3N3aXp6bGUocGluLCBQQ0lfU0xPVChkZXYtPmRldmZuKSkgOworCQkJcGluID0gcGNpX3N3aXp6bGVfaW50ZXJydXB0X3BpbihkZXYsIHBpbik7CiAKIAkJCS8qIE1vdmUgdXAgdGhlIGNoYWluIG9mIGJyaWRnZXMuICAqLwogCQkJZGV2ID0gZGV2LT5idXMtPnNlbGY7CmRpZmYgLS1naXQgYS9hcmNoL2FscGhhL2tlcm5lbC9zeXN0YmxzLlMgYi9hcmNoL2FscGhhL2tlcm5lbC9zeXN0YmxzLlMKaW5kZXggYmE5MTRhZi4uOWQ5ZTNhOSAxMDA2NDQKLS0tIGEvYXJjaC9hbHBoYS9rZXJuZWwvc3lzdGJscy5TCisrKyBiL2FyY2gvYWxwaGEva2VybmVsL3N5c3RibHMuUwpAQCAtNTIsNyArNTIsNyBAQAogCS5xdWFkIHN5c19zZXRwZ2lkCiAJLnF1YWQgYWxwaGFfbmlfc3lzY2FsbAkJCS8qIDQwICovCiAJLnF1YWQgc3lzX2R1cAotCS5xdWFkIHN5c19waXBlCisJLnF1YWQgc3lzX2FscGhhX3BpcGUKIAkucXVhZCBvc2Zfc2V0X3Byb2dyYW1fYXR0cmlidXRlcwogCS5xdWFkIGFscGhhX25pX3N5c2NhbGwKIAkucXVhZCBzeXNfb3BlbgkJCQkvKiA0NSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hbHBoYS9rZXJuZWwvdGltZS5jIGIvYXJjaC9hbHBoYS9rZXJuZWwvdGltZS5jCmluZGV4IGU2YTIzMTQuLmIwNGUyY2IgMTAwNjQ0Ci0tLSBhL2FyY2gvYWxwaGEva2VybmVsL3RpbWUuYworKysgYi9hcmNoL2FscGhhL2tlcm5lbC90aW1lLmMKQEAgLTQ2LDYgKzQ2LDcgQEAKICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vaHdycGIuaD4KICNpbmNsdWRlIDxhc20vODI1M3BpdC5oPgorI2luY2x1ZGUgPGFzbS9ydGMuaD4KIAogI2luY2x1ZGUgPGxpbnV4L21jMTQ2ODE4cnRjLmg+CiAjaW5jbHVkZSA8bGludXgvdGltZS5oPgpAQCAtMTgwLDYgKzE4MSwxNSBAQAogCWluaXRfcnRjX2lycSgpOwogfQogCit1bnNpZ25lZCBpbnQgY29tbW9uX2dldF9ydGNfdGltZShzdHJ1Y3QgcnRjX3RpbWUgKnRpbWUpCit7CisJcmV0dXJuIF9fZ2V0X3J0Y190aW1lKHRpbWUpOworfQorCitpbnQgY29tbW9uX3NldF9ydGNfdGltZShzdHJ1Y3QgcnRjX3RpbWUgKnRpbWUpCit7CisJcmV0dXJuIF9fc2V0X3J0Y190aW1lKHRpbWUpOworfQogCiAvKiBWYWxpZGF0ZSBhIGNvbXB1dGVkIGN5Y2xlIGNvdW50ZXIgcmVzdWx0IGFnYWluc3QgdGhlIGtub3duIGJvdW5kcyBmb3IKICAgIHRoZSBnaXZlbiBwcm9jZXNzb3IgY29yZS4gIFRoZXJlJ3MgdG9vIG11Y2ggYnJva2VubmVzcyBpbiB0aGUgd2F5IG9mCmRpZmYgLS1naXQgYS9hcmNoL2FscGhhL21tL2luaXQuYyBiL2FyY2gvYWxwaGEvbW0vaW5pdC5jCmluZGV4IDIzNGU0MmIuLjVkN2ExNmUgMTAwNjQ0Ci0tLSBhL2FyY2gvYWxwaGEvbW0vaW5pdC5jCisrKyBiL2FyY2gvYWxwaGEvbW0vaW5pdC5jCkBAIC01OSwxMyArNTksNiBAQAogCXJldHVybiByZXQ7CiB9CiAKLXB0ZV90ICoKLXB0ZV9hbGxvY19vbmVfa2VybmVsKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MpCi17Ci0JcHRlX3QgKnB0ZSA9IChwdGVfdCAqKV9fZ2V0X2ZyZWVfcGFnZShHRlBfS0VSTkVMfF9fR0ZQX1JFUEVBVHxfX0dGUF9aRVJPKTsKLQlyZXR1cm4gcHRlOwotfQotCiAKIC8qCiAgKiBCQURfUEFHRSBpcyB0aGUgcGFnZSB0aGF0IGlzIHVzZWQgZm9yIHBhZ2UgZmF1bHRzIHdoZW4gbGludXgKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbmZpZ3MvY2xwczc1MDBfZGVmY29uZmlnIGIvYXJjaC9hcm0vY29uZmlncy9jbHBzNzUwMF9kZWZjb25maWcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5ZTlmOWQuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vY29uZmlncy9jbHBzNzUwMF9kZWZjb25maWcKKysrIC9kZXYvbnVsbApAQCAtMSw4MDEgKzAsMCBAQAotIwotIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAotIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjEyLXJjMS1iazIKLSMgU3VuIE1hciAyNyAxNzoyMDo0OCAyMDA1Ci0jCi1DT05GSUdfQVJNPXkKLUNPTkZJR19NTVU9eQotQ09ORklHX1VJRDE2PXkKLUNPTkZJR19SV1NFTV9HRU5FUklDX1NQSU5MT0NLPXkKLUNPTkZJR19HRU5FUklDX0NBTElCUkFURV9ERUxBWT15Ci1DT05GSUdfR0VORVJJQ19JT01BUD15Ci0KLSMKLSMgQ29kZSBtYXR1cml0eSBsZXZlbCBvcHRpb25zCi0jCi1DT05GSUdfRVhQRVJJTUVOVEFMPXkKLUNPTkZJR19DTEVBTl9DT01QSUxFPXkKLUNPTkZJR19CUk9LRU5fT05fU01QPXkKLQotIwotIyBHZW5lcmFsIHNldHVwCi0jCi1DT05GSUdfTE9DQUxWRVJTSU9OPSIiCi1DT05GSUdfU1dBUD15Ci1DT05GSUdfU1lTVklQQz15Ci0jIENPTkZJR19QT1NJWF9NUVVFVUUgaXMgbm90IHNldAotIyBDT05GSUdfQlNEX1BST0NFU1NfQUNDVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TWVNDVEwgaXMgbm90IHNldAotIyBDT05GSUdfQVVESVQgaXMgbm90IHNldAotIyBDT05GSUdfSE9UUExVRyBpcyBub3Qgc2V0Ci1DT05GSUdfS09CSkVDVF9VRVZFTlQ9eQotIyBDT05GSUdfSUtDT05GSUcgaXMgbm90IHNldAotQ09ORklHX0VNQkVEREVEPXkKLUNPTkZJR19LQUxMU1lNUz15Ci0jIENPTkZJR19LQUxMU1lNU19FWFRSQV9QQVNTIGlzIG5vdCBzZXQKLUNPTkZJR19CQVNFX0ZVTEw9eQotQ09ORklHX0ZVVEVYPXkKLUNPTkZJR19FUE9MTD15Ci1DT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkU9eQotQ09ORklHX1NITUVNPXkKLUNPTkZJR19DQ19BTElHTl9GVU5DVElPTlM9MAotQ09ORklHX0NDX0FMSUdOX0xBQkVMUz0wCi1DT05GSUdfQ0NfQUxJR05fTE9PUFM9MAotQ09ORklHX0NDX0FMSUdOX0pVTVBTPTAKLSMgQ09ORklHX1RJTllfU0hNRU0gaXMgbm90IHNldAotQ09ORklHX0JBU0VfU01BTEw9MAotCi0jCi0jIExvYWRhYmxlIG1vZHVsZSBzdXBwb3J0Ci0jCi0jIENPTkZJR19NT0RVTEVTIGlzIG5vdCBzZXQKLQotIwotIyBTeXN0ZW0gVHlwZQotIwotQ09ORklHX0FSQ0hfQ0xQUzc1MDA9eQotIyBDT05GSUdfQVJDSF9DTFBTNzExWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX0NPMjg1IGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfRUJTQTExMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX0ZPT1RCUklER0UgaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9JTlRFR1JBVE9SIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfSU9QM1hYIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfSVhQNFhYIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfSVhQMjAwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX0w3MjAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfUFhBIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfUlBDIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfU0ExMTAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfUzNDMjQxMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX1NIQVJLIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfTEg3QTQwWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX09NQVAgaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9WRVJTQVRJTEUgaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9JTVggaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9INzIwWCBpcyBub3Qgc2V0Ci0KLSMKLSMgUHJvY2Vzc29yIFR5cGUKLSMKLUNPTkZJR19DUFVfMzI9eQotQ09ORklHX0NQVV9BUk03MTA9eQotQ09ORklHX0NQVV8zMnYzPXkKLUNPTkZJR19DUFVfQ0FDSEVfVjM9eQotQ09ORklHX0NQVV9DQUNIRV9WSVZUPXkKLUNPTkZJR19DUFVfQ09QWV9WMz15Ci1DT05GSUdfQ1BVX1RMQl9WMz15Ci0KLSMKLSMgUHJvY2Vzc29yIEZlYXR1cmVzCi0jCi1DT05GSUdfVElNRVJfQUNPUk49eQotCi0jCi0jIEJ1cyBzdXBwb3J0Ci0jCi1DT05GSUdfSVNBPXkKLQotIwotIyBQQ0NBUkQgKFBDTUNJQS9DYXJkQnVzKSBzdXBwb3J0Ci0jCi0jIENPTkZJR19QQ0NBUkQgaXMgbm90IHNldAotCi0jCi0jIEtlcm5lbCBGZWF0dXJlcwotIwotIyBDT05GSUdfUFJFRU1QVCBpcyBub3Qgc2V0Ci1DT05GSUdfQUxJR05NRU5UX1RSQVA9eQotCi0jCi0jIEJvb3Qgb3B0aW9ucwotIwotQ09ORklHX1pCT09UX1JPTV9URVhUPTB4MAotQ09ORklHX1pCT09UX1JPTV9CU1M9MHgwCi1DT05GSUdfQ01ETElORT0ibWVtPTE2TSByb290PW5mcyIKLSMgQ09ORklHX1hJUF9LRVJORUwgaXMgbm90IHNldAotCi0jCi0jIEZsb2F0aW5nIHBvaW50IGVtdWxhdGlvbgotIwotCi0jCi0jIEF0IGxlYXN0IG9uZSBlbXVsYXRpb24gbXVzdCBiZSBzZWxlY3RlZAotIwotIyBDT05GSUdfRlBFX05XRlBFIGlzIG5vdCBzZXQKLQotIwotIyBVc2Vyc3BhY2UgYmluYXJ5IGZvcm1hdHMKLSMKLUNPTkZJR19CSU5GTVRfRUxGPXkKLSMgQ09ORklHX0JJTkZNVF9BT1VUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JJTkZNVF9NSVNDIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSVEhVUiBpcyBub3Qgc2V0Ci0KLSMKLSMgUG93ZXIgbWFuYWdlbWVudCBvcHRpb25zCi0jCi0jIENPTkZJR19QTSBpcyBub3Qgc2V0Ci0KLSMKLSMgRGV2aWNlIERyaXZlcnMKLSMKLQotIwotIyBHZW5lcmljIERyaXZlciBPcHRpb25zCi0jCi1DT05GSUdfU1RBTkRBTE9ORT15Ci1DT05GSUdfUFJFVkVOVF9GSVJNV0FSRV9CVUlMRD15Ci0jIENPTkZJR19GV19MT0FERVIgaXMgbm90IHNldAotCi0jCi0jIE1lbW9yeSBUZWNobm9sb2d5IERldmljZXMgKE1URCkKLSMKLUNPTkZJR19NVEQ9eQotIyBDT05GSUdfTVREX0RFQlVHIGlzIG5vdCBzZXQKLSMgQ09ORklHX01URF9DT05DQVQgaXMgbm90IHNldAotIyBDT05GSUdfTVREX1BBUlRJVElPTlMgaXMgbm90IHNldAotCi0jCi0jIFVzZXIgTW9kdWxlcyBBbmQgVHJhbnNsYXRpb24gTGF5ZXJzCi0jCi0jIENPTkZJR19NVERfQ0hBUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19NVERfQkxPQ0sgaXMgbm90IHNldAotIyBDT05GSUdfTVREX0JMT0NLX1JPIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZUTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORlRMIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lORlRMIGlzIG5vdCBzZXQKLQotIwotIyBSQU0vUk9NL0ZsYXNoIGNoaXAgZHJpdmVycwotIwotIyBDT05GSUdfTVREX0NGSSBpcyBub3Qgc2V0Ci0jIENPTkZJR19NVERfSkVERUNQUk9CRSBpcyBub3Qgc2V0Ci1DT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzE9eQotQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8yPXkKLUNPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfND15Ci0jIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfOCBpcyBub3Qgc2V0Ci0jIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMTYgaXMgbm90IHNldAotIyBDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzMyIGlzIG5vdCBzZXQKLUNPTkZJR19NVERfQ0ZJX0kxPXkKLUNPTkZJR19NVERfQ0ZJX0kyPXkKLSMgQ09ORklHX01URF9DRklfSTQgaXMgbm90IHNldAotIyBDT05GSUdfTVREX0NGSV9JOCBpcyBub3Qgc2V0Ci0jIENPTkZJR19NVERfUkFNIGlzIG5vdCBzZXQKLSMgQ09ORklHX01URF9ST00gaXMgbm90IHNldAotIyBDT05GSUdfTVREX0FCU0VOVCBpcyBub3Qgc2V0Ci0KLSMKLSMgTWFwcGluZyBkcml2ZXJzIGZvciBjaGlwIGFjY2VzcwotIwotIyBDT05GSUdfTVREX0NPTVBMRVhfTUFQUElOR1MgaXMgbm90IHNldAotCi0jCi0jIFNlbGYtY29udGFpbmVkIE1URCBkZXZpY2UgZHJpdmVycwotIwotIyBDT05GSUdfTVREX1NMUkFNIGlzIG5vdCBzZXQKLSMgQ09ORklHX01URF9QSFJBTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19NVERfTVREUkFNIGlzIG5vdCBzZXQKLSMgQ09ORklHX01URF9CTEtNVEQgaXMgbm90IHNldAotIyBDT05GSUdfTVREX0JMT0NLMk1URCBpcyBub3Qgc2V0Ci0KLSMKLSMgRGlzay1Pbi1DaGlwIERldmljZSBEcml2ZXJzCi0jCi0jIENPTkZJR19NVERfRE9DMjAwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19NVERfRE9DMjAwMSBpcyBub3Qgc2V0Ci0jIENPTkZJR19NVERfRE9DMjAwMVBMVVMgaXMgbm90IHNldAotCi0jCi0jIE5BTkQgRmxhc2ggRGV2aWNlIERyaXZlcnMKLSMKLSMgQ09ORklHX01URF9OQU5EIGlzIG5vdCBzZXQKLQotIwotIyBQYXJhbGxlbCBwb3J0IHN1cHBvcnQKLSMKLUNPTkZJR19QQVJQT1JUPXkKLUNPTkZJR19QQVJQT1JUX1BDPXkKLUNPTkZJR19QQVJQT1JUX1BDX0ZJRk89eQotIyBDT05GSUdfUEFSUE9SVF9QQ19TVVBFUklPIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BBUlBPUlRfQVJDIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BBUlBPUlRfR1NDIGlzIG5vdCBzZXQKLUNPTkZJR19QQVJQT1JUXzEyODQ9eQotCi0jCi0jIFBsdWcgYW5kIFBsYXkgc3VwcG9ydAotIwotIyBDT05GSUdfUE5QIGlzIG5vdCBzZXQKLQotIwotIyBCbG9jayBkZXZpY2VzCi0jCi0jIENPTkZJR19CTEtfREVWX0ZEIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfWEQgaXMgbm90IHNldAotIyBDT05GSUdfUEFSSURFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfQ09XX0NPTU1PTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX0xPT1AgaXMgbm90IHNldAotQ09ORklHX0JMS19ERVZfTkJEPXkKLUNPTkZJR19CTEtfREVWX1JBTT15Ci1DT05GSUdfQkxLX0RFVl9SQU1fQ09VTlQ9MTYKLUNPTkZJR19CTEtfREVWX1JBTV9TSVpFPTQwOTYKLSMgQ09ORklHX0JMS19ERVZfSU5JVFJEIGlzIG5vdCBzZXQKLUNPTkZJR19JTklUUkFNRlNfU09VUkNFPSIiCi0jIENPTkZJR19DRFJPTV9QS1RDRFZEIGlzIG5vdCBzZXQKLQotIwotIyBJTyBTY2hlZHVsZXJzCi0jCi1DT05GSUdfSU9TQ0hFRF9OT09QPXkKLUNPTkZJR19JT1NDSEVEX0FTPXkKLUNPTkZJR19JT1NDSEVEX0RFQURMSU5FPXkKLUNPTkZJR19JT1NDSEVEX0NGUT15Ci0jIENPTkZJR19BVEFfT1ZFUl9FVEggaXMgbm90IHNldAotCi0jCi0jIEFUQS9BVEFQSS9NRk0vUkxMIHN1cHBvcnQKLSMKLSMgQ09ORklHX0lERSBpcyBub3Qgc2V0Ci0KLSMKLSMgU0NTSSBkZXZpY2Ugc3VwcG9ydAotIwotIyBDT05GSUdfU0NTSSBpcyBub3Qgc2V0Ci0KLSMKLSMgTXVsdGktZGV2aWNlIHN1cHBvcnQgKFJBSUQgYW5kIExWTSkKLSMKLSMgQ09ORklHX01EIGlzIG5vdCBzZXQKLQotIwotIyBGdXNpb24gTVBUIGRldmljZSBzdXBwb3J0Ci0jCi0KLSMKLSMgSUVFRSAxMzk0IChGaXJlV2lyZSkgc3VwcG9ydAotIwotCi0jCi0jIEkyTyBkZXZpY2Ugc3VwcG9ydAotIwotCi0jCi0jIE5ldHdvcmtpbmcgc3VwcG9ydAotIwotQ09ORklHX05FVD15Ci0KLSMKLSMgTmV0d29ya2luZyBvcHRpb25zCi0jCi0jIENPTkZJR19QQUNLRVQgaXMgbm90IHNldAotIyBDT05GSUdfTkVUTElOS19ERVYgaXMgbm90IHNldAotQ09ORklHX1VOSVg9eQotIyBDT05GSUdfTkVUX0tFWSBpcyBub3Qgc2V0Ci1DT05GSUdfSU5FVD15Ci0jIENPTkZJR19JUF9NVUxUSUNBU1QgaXMgbm90IHNldAotIyBDT05GSUdfSVBfQURWQU5DRURfUk9VVEVSIGlzIG5vdCBzZXQKLUNPTkZJR19JUF9QTlA9eQotIyBDT05GSUdfSVBfUE5QX0RIQ1AgaXMgbm90IHNldAotQ09ORklHX0lQX1BOUF9CT09UUD15Ci0jIENPTkZJR19JUF9QTlBfUkFSUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRfSVBJUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRfSVBHUkUgaXMgbm90IHNldAotIyBDT05GSUdfQVJQRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TWU5fQ09PS0lFUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTkVUX0FIIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lORVRfRVNQIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lORVRfSVBDT01QIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lORVRfVFVOTkVMIGlzIG5vdCBzZXQKLUNPTkZJR19JUF9UQ1BESUFHPXkKLSMgQ09ORklHX0lQX1RDUERJQUdfSVBWNiBpcyBub3Qgc2V0Ci0jIENPTkZJR19JUFY2IGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVEZJTFRFUiBpcyBub3Qgc2V0Ci0KLSMKLSMgU0NUUCBDb25maWd1cmF0aW9uIChFWFBFUklNRU5UQUwpCi0jCi0jIENPTkZJR19JUF9TQ1RQIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FUTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19CUklER0UgaXMgbm90IHNldAotIyBDT05GSUdfVkxBTl84MDIxUSBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUNORVQgaXMgbm90IHNldAotIyBDT05GSUdfTExDMiBpcyBub3Qgc2V0Ci0jIENPTkZJR19JUFggaXMgbm90IHNldAotIyBDT05GSUdfQVRBTEsgaXMgbm90IHNldAotIyBDT05GSUdfWDI1IGlzIG5vdCBzZXQKLSMgQ09ORklHX0xBUEIgaXMgbm90IHNldAotIyBDT05GSUdfTkVUX0RJVkVSVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19FQ09ORVQgaXMgbm90IHNldAotIyBDT05GSUdfV0FOX1JPVVRFUiBpcyBub3Qgc2V0Ci0KLSMKLSMgUW9TIGFuZC9vciBmYWlyIHF1ZXVlaW5nCi0jCi0jIENPTkZJR19ORVRfU0NIRUQgaXMgbm90IHNldAotIyBDT05GSUdfTkVUX0NMU19ST1VURSBpcyBub3Qgc2V0Ci0KLSMKLSMgTmV0d29yayB0ZXN0aW5nCi0jCi0jIENPTkZJR19ORVRfUEtUR0VOIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVFBPTEwgaXMgbm90IHNldAotIyBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19IQU1SQURJTyBpcyBub3Qgc2V0Ci0jIENPTkZJR19JUkRBIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JUIGlzIG5vdCBzZXQKLUNPTkZJR19ORVRERVZJQ0VTPXkKLUNPTkZJR19EVU1NWT15Ci0jIENPTkZJR19CT05ESU5HIGlzIG5vdCBzZXQKLSMgQ09ORklHX0VRVUFMSVpFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19UVU4gaXMgbm90IHNldAotCi0jCi0jIEFSQ25ldCBkZXZpY2VzCi0jCi0jIENPTkZJR19BUkNORVQgaXMgbm90IHNldAotCi0jCi0jIEV0aGVybmV0ICgxMCBvciAxMDBNYml0KQotIwotQ09ORklHX05FVF9FVEhFUk5FVD15Ci0jIENPTkZJR19NSUkgaXMgbm90IHNldAotIyBDT05GSUdfTkVUX1ZFTkRPUl8zQ09NIGlzIG5vdCBzZXQKLSMgQ09ORklHX0xBTkNFIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVF9WRU5ET1JfU01DIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NNQzkxWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRfVkVORE9SX1JBQ0FMIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FUMTcwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERVBDQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19IUDEwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRfSVNBIGlzIG5vdCBzZXQKLUNPTkZJR19ORVRfUENJPXkKLSMgQ09ORklHX0FDMzIwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUFJJQ09UIGlzIG5vdCBzZXQKLUNPTkZJR19DUzg5eDA9eQotIyBDT05GSUdfTkVUX1BPQ0tFVCBpcyBub3Qgc2V0Ci0KLSMKLSMgRXRoZXJuZXQgKDEwMDAgTWJpdCkKLSMKLQotIwotIyBFdGhlcm5ldCAoMTAwMDAgTWJpdCkKLSMKLQotIwotIyBUb2tlbiBSaW5nIGRldmljZXMKLSMKLSMgQ09ORklHX1RSIGlzIG5vdCBzZXQKLQotIwotIyBXaXJlbGVzcyBMQU4gKG5vbi1oYW1yYWRpbykKLSMKLSMgQ09ORklHX05FVF9SQURJTyBpcyBub3Qgc2V0Ci0KLSMKLSMgV2FuIGludGVyZmFjZXMKLSMKLSMgQ09ORklHX1dBTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19QTElQIGlzIG5vdCBzZXQKLUNPTkZJR19QUFA9eQotIyBDT05GSUdfUFBQX01VTFRJTElOSyBpcyBub3Qgc2V0Ci0jIENPTkZJR19QUFBfRklMVEVSIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BQUF9BU1lOQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19QUFBfU1lOQ19UVFkgaXMgbm90IHNldAotIyBDT05GSUdfUFBQX0RFRkxBVEUgaXMgbm90IHNldAotIyBDT05GSUdfUFBQX0JTRENPTVAgaXMgbm90IHNldAotIyBDT05GSUdfUFBQT0UgaXMgbm90IHNldAotQ09ORklHX1NMSVA9eQotQ09ORklHX1NMSVBfQ09NUFJFU1NFRD15Ci0jIENPTkZJR19TTElQX1NNQVJUIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NMSVBfTU9ERV9TTElQNiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSEFQRVIgaXMgbm90IHNldAotIyBDT05GSUdfTkVUQ09OU09MRSBpcyBub3Qgc2V0Ci0KLSMKLSMgSVNETiBzdWJzeXN0ZW0KLSMKLSMgQ09ORklHX0lTRE4gaXMgbm90IHNldAotCi0jCi0jIElucHV0IGRldmljZSBzdXBwb3J0Ci0jCi1DT05GSUdfSU5QVVQ9eQotCi0jCi0jIFVzZXJsYW5kIGludGVyZmFjZXMKLSMKLUNPTkZJR19JTlBVVF9NT1VTRURFVj15Ci1DT05GSUdfSU5QVVRfTU9VU0VERVZfUFNBVVg9eQotQ09ORklHX0lOUFVUX01PVVNFREVWX1NDUkVFTl9YPTEwMjQKLUNPTkZJR19JTlBVVF9NT1VTRURFVl9TQ1JFRU5fWT03NjgKLSMgQ09ORklHX0lOUFVUX0pPWURFViBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTlBVVF9UU0RFViBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTlBVVF9FVkRFViBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTlBVVF9FVkJVRyBpcyBub3Qgc2V0Ci0KLSMKLSMgSW5wdXQgRGV2aWNlIERyaXZlcnMKLSMKLUNPTkZJR19JTlBVVF9LRVlCT0FSRD15Ci1DT05GSUdfS0VZQk9BUkRfQVRLQkQ9eQotIyBDT05GSUdfS0VZQk9BUkRfU1VOS0JEIGlzIG5vdCBzZXQKLSMgQ09ORklHX0tFWUJPQVJEX0xLS0JEIGlzIG5vdCBzZXQKLSMgQ09ORklHX0tFWUJPQVJEX1hUS0JEIGlzIG5vdCBzZXQKLSMgQ09ORklHX0tFWUJPQVJEX05FV1RPTiBpcyBub3Qgc2V0Ci1DT05GSUdfSU5QVVRfTU9VU0U9eQotQ09ORklHX01PVVNFX1BTMj15Ci0jIENPTkZJR19NT1VTRV9TRVJJQUwgaXMgbm90IHNldAotIyBDT05GSUdfTU9VU0VfSU5QT1JUIGlzIG5vdCBzZXQKLSMgQ09ORklHX01PVVNFX0xPR0lCTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19NT1VTRV9QQzExMFBBRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19NT1VTRV9WU1hYWEFBIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lOUFVUX0pPWVNUSUNLIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lOUFVUX1RPVUNIU0NSRUVOIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lOUFVUX01JU0MgaXMgbm90IHNldAotCi0jCi0jIEhhcmR3YXJlIEkvTyBwb3J0cwotIwotQ09ORklHX1NFUklPPXkKLSMgQ09ORklHX1NFUklPX1NFUlBPUlQgaXMgbm90IHNldAotIyBDT05GSUdfU0VSSU9fUEFSS0JEIGlzIG5vdCBzZXQKLUNPTkZJR19TRVJJT19SUENLQkQ9eQotQ09ORklHX1NFUklPX0xJQlBTMj15Ci0jIENPTkZJR19TRVJJT19SQVcgaXMgbm90IHNldAotIyBDT05GSUdfR0FNRVBPUlQgaXMgbm90IHNldAotQ09ORklHX1NPVU5EX0dBTUVQT1JUPXkKLQotIwotIyBDaGFyYWN0ZXIgZGV2aWNlcwotIwotQ09ORklHX1ZUPXkKLUNPTkZJR19WVF9DT05TT0xFPXkKLUNPTkZJR19IV19DT05TT0xFPXkKLSMgQ09ORklHX1NFUklBTF9OT05TVEFOREFSRCBpcyBub3Qgc2V0Ci0KLSMKLSMgU2VyaWFsIGRyaXZlcnMKLSMKLUNPTkZJR19TRVJJQUxfODI1MD15Ci1DT05GSUdfU0VSSUFMXzgyNTBfQ09OU09MRT15Ci1DT05GSUdfU0VSSUFMXzgyNTBfTlJfVUFSVFM9NAotIyBDT05GSUdfU0VSSUFMXzgyNTBfRVhURU5ERUQgaXMgbm90IHNldAotCi0jCi0jIE5vbi04MjUwIHNlcmlhbCBwb3J0IHN1cHBvcnQKLSMKLUNPTkZJR19TRVJJQUxfQ09SRT15Ci1DT05GSUdfU0VSSUFMX0NPUkVfQ09OU09MRT15Ci1DT05GSUdfVU5JWDk4X1BUWVM9eQotQ09ORklHX0xFR0FDWV9QVFlTPXkKLUNPTkZJR19MRUdBQ1lfUFRZX0NPVU5UPTI1NgotQ09ORklHX1BSSU5URVI9eQotIyBDT05GSUdfTFBfQ09OU09MRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19QUERFViBpcyBub3Qgc2V0Ci0jIENPTkZJR19USVBBUiBpcyBub3Qgc2V0Ci0KLSMKLSMgSVBNSQotIwotIyBDT05GSUdfSVBNSV9IQU5ETEVSIGlzIG5vdCBzZXQKLQotIwotIyBXYXRjaGRvZyBDYXJkcwotIwotIyBDT05GSUdfV0FUQ0hET0cgaXMgbm90IHNldAotIyBDT05GSUdfTlZSQU0gaXMgbm90IHNldAotIyBDT05GSUdfUlRDIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RUTEsgaXMgbm90IHNldAotIyBDT05GSUdfUjM5NjQgaXMgbm90IHNldAotCi0jCi0jIEZ0YXBlLCB0aGUgZmxvcHB5IHRhcGUgZGV2aWNlIGRyaXZlcgotIwotIyBDT05GSUdfRFJNIGlzIG5vdCBzZXQKLSMgQ09ORklHX1JBV19EUklWRVIgaXMgbm90IHNldAotCi0jCi0jIFRQTSBkZXZpY2VzCi0jCi0jIENPTkZJR19UQ0dfVFBNIGlzIG5vdCBzZXQKLQotIwotIyBJMkMgc3VwcG9ydAotIwotQ09ORklHX0kyQz15Ci0jIENPTkZJR19JMkNfQ0hBUkRFViBpcyBub3Qgc2V0Ci0KLSMKLSMgSTJDIEFsZ29yaXRobXMKLSMKLUNPTkZJR19JMkNfQUxHT0JJVD15Ci0jIENPTkZJR19JMkNfQUxHT1BDRiBpcyBub3Qgc2V0Ci0jIENPTkZJR19JMkNfQUxHT1BDQSBpcyBub3Qgc2V0Ci0KLSMKLSMgSTJDIEhhcmR3YXJlIEJ1cyBzdXBwb3J0Ci0jCi0jIENPTkZJR19JMkNfRUxFS1RPUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19JMkNfUEFSUE9SVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JMkNfUEFSUE9SVF9MSUdIVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JMkNfUENBX0lTQSBpcyBub3Qgc2V0Ci0KLSMKLSMgSGFyZHdhcmUgU2Vuc29ycyBDaGlwIHN1cHBvcnQKLSMKLSMgQ09ORklHX0kyQ19TRU5TT1IgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19BRE0xMDIxIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfQURNMTAyNSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX0FETTEwMjYgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19BRE0xMDMxIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfQVNCMTAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfRFMxNjIxIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfRlNDSEVSIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfRlNDUE9TIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfR0w1MThTTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX0dMNTIwU00gaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19JVDg3IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfTE02MyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX0xNNzUgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19MTTc3IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfTE03OCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX0xNODAgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19MTTgzIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfTE04NSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX0xNODcgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19MTTkwIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfTUFYMTYxOSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX1BDODczNjAgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19TTVNDNDdCMzk3IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfU01TQzQ3TTEgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19XODM3ODFEIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfVzgzTDc4NVRTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfVzgzNjI3SEYgaXMgbm90IHNldAotCi0jCi0jIE90aGVyIEkyQyBDaGlwIHN1cHBvcnQKLSMKLSMgQ09ORklHX1NFTlNPUlNfRUVQUk9NIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfUENGODU3NCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX1BDRjg1OTEgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19SVEM4NTY0IGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19ERUJVR19DT1JFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19ERUJVR19BTEdPIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19ERUJVR19CVVMgaXMgbm90IHNldAotIyBDT05GSUdfSTJDX0RFQlVHX0NISVAgaXMgbm90IHNldAotCi0jCi0jIE1pc2MgZGV2aWNlcwotIwotCi0jCi0jIE11bHRpbWVkaWEgZGV2aWNlcwotIwotIyBDT05GSUdfVklERU9fREVWIGlzIG5vdCBzZXQKLQotIwotIyBEaWdpdGFsIFZpZGVvIEJyb2FkY2FzdGluZyBEZXZpY2VzCi0jCi0jIENPTkZJR19EVkIgaXMgbm90IHNldAotCi0jCi0jIEdyYXBoaWNzIHN1cHBvcnQKLSMKLUNPTkZJR19GQj15Ci1DT05GSUdfRkJfQ0ZCX0ZJTExSRUNUPXkKLUNPTkZJR19GQl9DRkJfQ09QWUFSRUE9eQotQ09ORklHX0ZCX0NGQl9JTUFHRUJMSVQ9eQotQ09ORklHX0ZCX1NPRlRfQ1VSU09SPXkKLSMgQ09ORklHX0ZCX01PREVfSEVMUEVSUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19GQl9USUxFQkxJVFRJTkcgaXMgbm90IHNldAotQ09ORklHX0ZCX0FDT1JOPXkKLSMgQ09ORklHX0ZCX1ZJUlRVQUwgaXMgbm90IHNldAotCi0jCi0jIENvbnNvbGUgZGlzcGxheSBkcml2ZXIgc3VwcG9ydAotIwotIyBDT05GSUdfVkdBX0NPTlNPTEUgaXMgbm90IHNldAotIyBDT05GSUdfTURBX0NPTlNPTEUgaXMgbm90IHNldAotQ09ORklHX0RVTU1ZX0NPTlNPTEU9eQotQ09ORklHX0ZSQU1FQlVGRkVSX0NPTlNPTEU9eQotQ09ORklHX0ZPTlRTPXkKLUNPTkZJR19GT05UXzh4OD15Ci1DT05GSUdfRk9OVF84eDE2PXkKLSMgQ09ORklHX0ZPTlRfNngxMSBpcyBub3Qgc2V0Ci0jIENPTkZJR19GT05UX1BFQVJMXzh4OCBpcyBub3Qgc2V0Ci0jIENPTkZJR19GT05UX0FDT1JOXzh4OCBpcyBub3Qgc2V0Ci0jIENPTkZJR19GT05UX01JTklfNHg2IGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZPTlRfU1VOOHgxNiBpcyBub3Qgc2V0Ci0jIENPTkZJR19GT05UX1NVTjEyeDIyIGlzIG5vdCBzZXQKLQotIwotIyBMb2dvIGNvbmZpZ3VyYXRpb24KLSMKLUNPTkZJR19MT0dPPXkKLUNPTkZJR19MT0dPX0xJTlVYX01PTk89eQotQ09ORklHX0xPR09fTElOVVhfVkdBMTY9eQotQ09ORklHX0xPR09fTElOVVhfQ0xVVDIyND15Ci0jIENPTkZJR19CQUNLTElHSFRfTENEX1NVUFBPUlQgaXMgbm90IHNldAotCi0jCi0jIFNvdW5kCi0jCi0jIENPTkZJR19TT1VORCBpcyBub3Qgc2V0Ci0KLSMKLSMgVVNCIHN1cHBvcnQKLSMKLUNPTkZJR19VU0JfQVJDSF9IQVNfSENEPXkKLSMgQ09ORklHX1VTQl9BUkNIX0hBU19PSENJIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQiBpcyBub3Qgc2V0Ci0KLSMKLSMgVVNCIEdhZGdldCBTdXBwb3J0Ci0jCi0jIENPTkZJR19VU0JfR0FER0VUIGlzIG5vdCBzZXQKLQotIwotIyBNTUMvU0QgQ2FyZCBzdXBwb3J0Ci0jCi0jIENPTkZJR19NTUMgaXMgbm90IHNldAotCi0jCi0jIEZpbGUgc3lzdGVtcwotIwotQ09ORklHX0VYVDJfRlM9eQotIyBDT05GSUdfRVhUMl9GU19YQVRUUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19FWFQzX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0pCRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19SRUlTRVJGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19KRlNfRlMgaXMgbm90IHNldAotCi0jCi0jIFhGUyBzdXBwb3J0Ci0jCi0jIENPTkZJR19YRlNfRlMgaXMgbm90IHNldAotQ09ORklHX01JTklYX0ZTPXkKLSMgQ09ORklHX1JPTUZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1FVT1RBIGlzIG5vdCBzZXQKLUNPTkZJR19ETk9USUZZPXkKLSMgQ09ORklHX0FVVE9GU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19BVVRPRlM0X0ZTIGlzIG5vdCBzZXQKLQotIwotIyBDRC1ST00vRFZEIEZpbGVzeXN0ZW1zCi0jCi0jIENPTkZJR19JU085NjYwX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VERl9GUyBpcyBub3Qgc2V0Ci0KLSMKLSMgRE9TL0ZBVC9OVCBGaWxlc3lzdGVtcwotIwotIyBDT05GSUdfTVNET1NfRlMgaXMgbm90IHNldAotIyBDT05GSUdfVkZBVF9GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19OVEZTX0ZTIGlzIG5vdCBzZXQKLQotIwotIyBQc2V1ZG8gZmlsZXN5c3RlbXMKLSMKLUNPTkZJR19QUk9DX0ZTPXkKLUNPTkZJR19TWVNGUz15Ci0jIENPTkZJR19ERVZGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERVZQVFNfRlNfWEFUVFIgaXMgbm90IHNldAotIyBDT05GSUdfVE1QRlMgaXMgbm90IHNldAotIyBDT05GSUdfSFVHRVRMQl9QQUdFIGlzIG5vdCBzZXQKLUNPTkZJR19SQU1GUz15Ci0KLSMKLSMgTWlzY2VsbGFuZW91cyBmaWxlc3lzdGVtcwotIwotIyBDT05GSUdfQURGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19BRkZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19IRlNQTFVTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JFRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfQkZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0VGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19KRkZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0pGRlMyX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSQU1GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19WWEZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hQRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfUU5YNEZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NZU1ZfRlMgaXMgbm90IHNldAotIyBDT05GSUdfVUZTX0ZTIGlzIG5vdCBzZXQKLQotIwotIyBOZXR3b3JrIEZpbGUgU3lzdGVtcwotIwotQ09ORklHX05GU19GUz15Ci0jIENPTkZJR19ORlNfVjMgaXMgbm90IHNldAotIyBDT05GSUdfTkZTX1Y0IGlzIG5vdCBzZXQKLSMgQ09ORklHX05GU19ESVJFQ1RJTyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORlNEIGlzIG5vdCBzZXQKLUNPTkZJR19ST09UX05GUz15Ci1DT05GSUdfTE9DS0Q9eQotQ09ORklHX1NVTlJQQz15Ci0jIENPTkZJR19SUENTRUNfR1NTX0tSQjUgaXMgbm90IHNldAotIyBDT05GSUdfUlBDU0VDX0dTU19TUEtNMyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTUJfRlMgaXMgbm90IHNldAotIyBDT05GSUdfQ0lGUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19OQ1BfRlMgaXMgbm90IHNldAotIyBDT05GSUdfQ09EQV9GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19BRlNfRlMgaXMgbm90IHNldAotCi0jCi0jIFBhcnRpdGlvbiBUeXBlcwotIwotQ09ORklHX1BBUlRJVElPTl9BRFZBTkNFRD15Ci0jIENPTkZJR19BQ09STl9QQVJUSVRJT04gaXMgbm90IHNldAotIyBDT05GSUdfT1NGX1BBUlRJVElPTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19BTUlHQV9QQVJUSVRJT04gaXMgbm90IHNldAotIyBDT05GSUdfQVRBUklfUEFSVElUSU9OIGlzIG5vdCBzZXQKLSMgQ09ORklHX01BQ19QQVJUSVRJT04gaXMgbm90IHNldAotIyBDT05GSUdfTVNET1NfUEFSVElUSU9OIGlzIG5vdCBzZXQKLSMgQ09ORklHX0xETV9QQVJUSVRJT04gaXMgbm90IHNldAotIyBDT05GSUdfU0dJX1BBUlRJVElPTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19VTFRSSVhfUEFSVElUSU9OIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NVTl9QQVJUSVRJT04gaXMgbm90IHNldAotIyBDT05GSUdfRUZJX1BBUlRJVElPTiBpcyBub3Qgc2V0Ci0KLSMKLSMgTmF0aXZlIExhbmd1YWdlIFN1cHBvcnQKLSMKLSMgQ09ORklHX05MUyBpcyBub3Qgc2V0Ci0KLSMKLSMgUHJvZmlsaW5nIHN1cHBvcnQKLSMKLSMgQ09ORklHX1BST0ZJTElORyBpcyBub3Qgc2V0Ci0KLSMKLSMgS2VybmVsIGhhY2tpbmcKLSMKLSMgQ09ORklHX1BSSU5US19USU1FIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQlVHX0tFUk5FTCBpcyBub3Qgc2V0Ci1DT05GSUdfTE9HX0JVRl9TSElGVD0xNAotIyBDT05GSUdfREVCVUdfQlVHVkVSQk9TRSBpcyBub3Qgc2V0Ci1DT05GSUdfRlJBTUVfUE9JTlRFUj15Ci0jIENPTkZJR19ERUJVR19VU0VSIGlzIG5vdCBzZXQKLQotIwotIyBTZWN1cml0eSBvcHRpb25zCi0jCi0jIENPTkZJR19LRVlTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFQ1VSSVRZIGlzIG5vdCBzZXQKLQotIwotIyBDcnlwdG9ncmFwaGljIG9wdGlvbnMKLSMKLSMgQ09ORklHX0NSWVBUTyBpcyBub3Qgc2V0Ci0KLSMKLSMgSGFyZHdhcmUgY3J5cHRvIGRldmljZXMKLSMKLQotIwotIyBMaWJyYXJ5IHJvdXRpbmVzCi0jCi0jIENPTkZJR19DUkNfQ0NJVFQgaXMgbm90IHNldAotQ09ORklHX0NSQzMyPXkKLSMgQ09ORklHX0xJQkNSQzMyQyBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9LYnVpbGQgYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9LYnVpbGQKaW5kZXggNDNiMGIyYi4uNzMyMzdiZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vS2J1aWxkCisrKyBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL0tidWlsZApAQCAtMSw0ICsxLDMgQEAKIGluY2x1ZGUgaW5jbHVkZS9hc20tZ2VuZXJpYy9LYnVpbGQuYXNtCiAKIHVuaWZkZWYteSArPSBod2NhcC5oCi11bmlmZGVmLXkgKz0gc3dhYi5oCmRpZmYgLS1naXQgYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9ieXRlb3JkZXIuaCBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2J5dGVvcmRlci5oCmluZGV4IGMwMmI2ZmMuLjc3Mzc5NzQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2J5dGVvcmRlci5oCisrKyBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2J5dGVvcmRlci5oCkBAIC0xNSw4ICsxNSw2IEBACiAjaWZuZGVmIF9fQVNNX0FSTV9CWVRFT1JERVJfSAogI2RlZmluZSBfX0FTTV9BUk1fQllURU9SREVSX0gKIAotI2luY2x1ZGUgPGFzbS9zd2FiLmg+Ci0KICNpZmRlZiBfX0FSTUVCX18KICNpbmNsdWRlIDxsaW51eC9ieXRlb3JkZXIvYmlnX2VuZGlhbi5oPgogI2Vsc2UKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL21hY2gvcGNpLmggYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9tYWNoL3BjaS5oCmluZGV4IDMyZGExYWUuLmEzOGJkYzcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL21hY2gvcGNpLmgKKysrIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vbWFjaC9wY2kuaApAQCAtNDIsNyArNDIsNyBAQAogLyoKICAqIFRoaXMgaXMgdGhlIHN0YW5kYXJkIFBDSS1QQ0kgYnJpZGdlIHN3aXp6bGluZyBhbGdvcml0aG0uCiAgKi8KLXU4IHBjaV9zdGRfc3dpenpsZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCAqcGlucCk7CisjZGVmaW5lIHBjaV9zdGRfc3dpenpsZSBwY2lfY29tbW9uX3N3aXp6bGUKIAogLyoKICAqIENhbGwgdGhpcyB3aXRoIHlvdXIgaHdfcGNpIHN0cnVjdCB0byBpbml0aWFsaXNlIHRoZSBQQ0kgc3lzdGVtLgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vbW11LmggYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9tbXUuaAppbmRleCA1MzA5OWQ0Li5iNTYxNTg0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9tbXUuaAorKysgYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9tbXUuaApAQCAtMjQsNyArMjQsNiBAQAogICogIG1vZGlmaWVkIGZvciAyLjYgYnkgSHlvayBTLiBDaG9pIDxoeW9rLmNob2lAc2Ftc3VuZy5jb20+CiAgKi8KIHR5cGVkZWYgc3RydWN0IHsKLQlzdHJ1Y3Qgdm1fbGlzdF9zdHJ1Y3QJKnZtbGlzdDsKIAl1bnNpZ25lZCBsb25nCQllbmRfYnJrOwogfSBtbV9jb250ZXh0X3Q7CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC9iaW9zMzIuYyBiL2FyY2gvYXJtL2tlcm5lbC9iaW9zMzIuYwppbmRleCAxN2E1OWI2Li44MDk2ODE5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9rZXJuZWwvYmlvczMyLmMKKysrIGIvYXJjaC9hcm0va2VybmVsL2Jpb3MzMi5jCkBAIC00ODAsMzMgKzQ4MCw2IEBACiAjZW5kaWYKIAogLyoKLSAqIFRoaXMgaXMgdGhlIHN0YW5kYXJkIFBDSS1QQ0kgYnJpZGdlIHN3aXp6bGluZyBhbGdvcml0aG06Ci0gKgotICogICBEZXY6IDAgIDEgIDIgIDMKLSAqICAgIEEgICBBICBCICBDICBECi0gKiAgICBCICAgQiAgQyAgRCAgQQotICogICAgQyAgIEMgIEQgIEEgIEIKLSAqICAgIEQgICBEICBBICBCICBDCi0gKiAgICAgICAgXl5eXl5eXl5eXiBpcnEgcGluIG9uIGJyaWRnZQotICovCi11OCBfX2RldmluaXQgcGNpX3N0ZF9zd2l6emxlKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4ICpwaW5wKQotewotCWludCBwaW4gPSAqcGlucCAtIDE7Ci0KLQl3aGlsZSAoZGV2LT5idXMtPnNlbGYpIHsKLQkJcGluID0gKHBpbiArIFBDSV9TTE9UKGRldi0+ZGV2Zm4pKSAmIDM7Ci0JCS8qCi0JCSAqIG1vdmUgdXAgdGhlIGNoYWluIG9mIGJyaWRnZXMsCi0JCSAqIHN3aXp6bGluZyBhcyB3ZSBnby4KLQkJICovCi0JCWRldiA9IGRldi0+YnVzLT5zZWxmOwotCX0KLQkqcGlucCA9IHBpbiArIDE7Ci0KLQlyZXR1cm4gUENJX1NMT1QoZGV2LT5kZXZmbik7Ci19Ci0KLS8qCiAgKiBTd2l6emxlIHRoZSBkZXZpY2UgcGluIGVhY2ggdGltZSB3ZSBjcm9zcyBhIGJyaWRnZS4KICAqIFRoaXMgbWlnaHQgdXBkYXRlIHBpbiBhbmQgcmV0dXJucyB0aGUgc2xvdCBudW1iZXIuCiAgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC9jYWxscy5TIGIvYXJjaC9hcm0va2VybmVsL2NhbGxzLlMKaW5kZXggMDlhMDYxYy4uOWNhOGQxMyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va2VybmVsL2NhbGxzLlMKKysrIGIvYXJjaC9hcm0va2VybmVsL2NhbGxzLlMKQEAgLTk4LDcgKzk4LDcgQEAKIAkJQ0FMTChzeXNfdXNlbGliKQogCQlDQUxMKHN5c19zd2Fwb24pCiAJCUNBTEwoc3lzX3JlYm9vdCkKLQkJQ0FMTChPQlNPTEVURShvbGRfcmVhZGRpcikpCS8qIHVzZWQgYnkgbGliYzQgKi8KKwkJQ0FMTChPQlNPTEVURShzeXNfb2xkX3JlYWRkaXIpKQkvKiB1c2VkIGJ5IGxpYmM0ICovCiAvKiA5MCAqLwlDQUxMKE9CU09MRVRFKG9sZF9tbWFwKSkJLyogdXNlZCBieSBsaWJjNCAqLwogCQlDQUxMKHN5c19tdW5tYXApCiAJCUNBTEwoc3lzX3RydW5jYXRlKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL2lzYS5jIGIvYXJjaC9hcm0va2VybmVsL2lzYS5jCmluZGV4IDUwYTMwYmMuLjhhYzliODQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2tlcm5lbC9pc2EuYworKysgYi9hcmNoL2FybS9rZXJuZWwvaXNhLmMKQEAgLTE2LDYgKzE2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2N0bC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgogCiBzdGF0aWMgdW5zaWduZWQgaW50IGlzYV9tZW1iYXNlLCBpc2FfcG9ydGJhc2UsIGlzYV9wb3J0c2hpZnQ7CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxY2FwOS5jIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFjYXA5LmMKaW5kZXggMGEzOGM2OS4uNzMzNzYxNyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFjYXA5LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFjYXA5LmMKQEAgLTE1LDYgKzE1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9wbS5oPgogCisjaW5jbHVkZSA8YXNtL2lycS5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KICNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFybTkyMDAuYyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxcm05MjAwLmMKaW5kZXggMjg1OTRmYy4uMmU5ZWNhZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFybTkyMDAuYworKysgYi9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MXJtOTIwMC5jCkBAIC0xMiw2ICsxMiw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAorI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+CiAjaW5jbHVkZSA8bWFjaC9hdDkxcm05MjAwLmg+CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MXNhbTkyNjAuYyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxc2FtOTI2MC5jCmluZGV4IGFjY2I2OWUuLjA4OTRmMTAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxc2FtOTI2MC5jCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxc2FtOTI2MC5jCkBAIC0xMyw2ICsxMyw3IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcG0uaD4KIAorI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+CiAjaW5jbHVkZSA8bWFjaC9jcHUuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxc2FtOTI2MS5jIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFzYW05MjYxLmMKaW5kZXggN2I1MWE1OS4uM2FjZDdkNyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFzYW05MjYxLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFzYW05MjYxLmMKQEAgLTEzLDYgKzEzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9wbS5oPgogCisjaW5jbHVkZSA8YXNtL2lycS5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KICNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KICNpbmNsdWRlIDxtYWNoL2F0OTFzYW05MjYxLmg+CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MXNhbTkyNjMuYyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxc2FtOTI2My5jCmluZGV4IGFkYTRiNjcuLjk0Mjc5MmQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxc2FtOTI2My5jCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxc2FtOTI2My5jCkBAIC0xMyw2ICsxMyw3IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcG0uaD4KIAorI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+CiAjaW5jbHVkZSA8bWFjaC9hdDkxc2FtOTI2My5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFzYW05cmwuYyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxc2FtOXJsLmMKaW5kZXggMjUyZTk1NC4uMjExYzVjMSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFzYW05cmwuYworKysgYi9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MXNhbTlybC5jCkBAIC0xMiw2ICsxMiw3IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcG0uaD4KIAorI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+CiAjaW5jbHVkZSA8bWFjaC9jcHUuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1zYW05cmxlay5jIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXNhbTlybGVrLmMKaW5kZXggOWI5MzdlZS4uMzVlMTJhNCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXNhbTlybGVrLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXNhbTlybGVrLmMKQEAgLTI5LDYgKzI5LDcgQEAKICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8bWFjaC9ib2FyZC5oPgogI2luY2x1ZGUgPG1hY2gvZ3Bpby5oPgorI2luY2x1ZGUgPG1hY2gvYXQ5MXNhbTlfc21jLmg+CiAjaW5jbHVkZSA8bWFjaC9hdDkxX3NoZHdjLmg+CiAKICNpbmNsdWRlICJzYW05X3NtYy5oIgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1jbHBzNzExeC9lZGI3MjExLW1tLmMgYi9hcmNoL2FybS9tYWNoLWNscHM3MTF4L2VkYjcyMTEtbW0uYwppbmRleCBjNThlMzJlLi4wYmVhMTQ1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWNscHM3MTF4L2VkYjcyMTEtbW0uYworKysgYi9hcmNoL2FybS9tYWNoLWNscHM3MTF4L2VkYjcyMTEtbW0uYwpAQCAtMjQsNyArMjQsNiBAQAogCiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPGFzbS9wYWdlLmg+Ci0jaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KICNpbmNsdWRlIDxhc20vc2l6ZXMuaD4KICAKICNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtY2xwczcxMXgvZm9ydHVuZXQuYyBiL2FyY2gvYXJtL21hY2gtY2xwczcxMXgvZm9ydHVuZXQuYwppbmRleCA3MTIyYjNkLi43NDMwZTQwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWNscHM3MTF4L2ZvcnR1bmV0LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1jbHBzNzExeC9mb3J0dW5ldC5jCkBAIC0yNCw3ICsyNCw2IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdHJkLmg+CiAKICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+Ci0jaW5jbHVkZSA8YXNtL2lycS5oPgogI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgogI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9kZXZpY2VzLmMgYi9hcmNoL2FybS9tYWNoLWRhdmluY2kvZGV2aWNlcy5jCmluZGV4IDNkNGIxZGUuLjgwODYzM2YgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9kZXZpY2VzLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2RldmljZXMuYwpAQCAtMjAsNiArMjAsNyBAQAogCiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPG1hY2gvaTJjLmg+CisjaW5jbHVkZSA8bWFjaC9pcnFzLmg+CiAKIHN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgaTJjX3Jlc291cmNlc1tdID0gewogCXsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9pbmNsdWRlL21hY2gvZ3Bpby5oIGIvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2luY2x1ZGUvbWFjaC9ncGlvLmgKaW5kZXggYjNhMjk2MS4uYjQ1NmYwNyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2luY2x1ZGUvbWFjaC9ncGlvLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2luY2x1ZGUvbWFjaC9ncGlvLmgKQEAgLTE2LDYgKzE2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGFzbS1nZW5lcmljL2dwaW8uaD4KICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8bWFjaC9pcnFzLmg+CiAKIC8qCiAgKiBiYXNpYyBncGlvIHJvdXRpbmVzCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvY29tbW9uLmMgYi9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvY29tbW9uLmMKaW5kZXggMzZmZjA2ZC4uYjk3ZjUyOSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL2NvbW1vbi5jCisrKyBiL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9jb21tb24uYwpAQCAtMjgsMTIgKzI4LDE3IEBACiAKICNpbmNsdWRlICJjb21tb24uaCIKIAotZXh0ZXJuIHZvaWQgX19pbml0IGlzYV9pbml0X2lycSh1bnNpZ25lZCBpbnQgaXJxKTsKLQogdW5zaWduZWQgaW50IG1lbV9mY2xrXzIxMjg1ID0gNTAwMDAwMDA7CiAKIEVYUE9SVF9TWU1CT0wobWVtX2ZjbGtfMjEyODUpOwogCitzdGF0aWMgdm9pZCBfX2luaXQgZWFybHlfZmNsayhjaGFyICoqYXJnKQoreworCW1lbV9mY2xrXzIxMjg1ID0gc2ltcGxlX3N0cnRvdWwoKmFyZywgYXJnLCAwKTsKK30KKworX19lYXJseV9wYXJhbSgibWVtX2ZjbGtfMjEyODU9IiwgZWFybHlfZmNsayk7CisKIHN0YXRpYyBpbnQgX19pbml0IHBhcnNlX3RhZ19tZW1jbGsoY29uc3Qgc3RydWN0IHRhZyAqdGFnKQogewogCW1lbV9mY2xrXzIxMjg1ID0gdGFnLT51Lm1lbWNsay5mbWVtY2xrOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL2NvbW1vbi5oIGIvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL2NvbW1vbi5oCmluZGV4IDU4MGUzMWIuLmIwNWU2NjIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9jb21tb24uaAorKysgYi9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvY29tbW9uLmgKQEAgLTcsMyArNyw0IEBACiBleHRlcm4gdm9pZCBmb290YnJpZGdlX21hcF9pbyh2b2lkKTsKIGV4dGVybiB2b2lkIGZvb3RicmlkZ2VfaW5pdF9pcnEodm9pZCk7CiAKK2V4dGVybiB2b2lkIGlzYV9pbml0X2lycSh1bnNpZ25lZCBpbnQgaXJxKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9kYzIxMjg1LmMgYi9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvZGMyMTI4NS5jCmluZGV4IDEzMzA4NjAuLjNmZmE1NDggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9kYzIxMjg1LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL2RjMjEyODUuYwpAQCAtMjg3LDYgKzI4Nyw5IEBACiAJcmV0dXJuIHBjaV9zY2FuX2J1cygwLCAmZGMyMTI4NV9vcHMsIHN5cyk7CiB9CiAKKyNkZWZpbmUgZGMyMTI4NV9yZXF1ZXN0X2lycShfYSwgX2IsIF9jLCBfZCwgX2UpIFwKKwlXQVJOX09OKHJlcXVlc3RfaXJxKF9hLCBfYiwgX2MsIF9kLCBfZSkgPCAwKQorCiB2b2lkIF9faW5pdCBkYzIxMjg1X3ByZWluaXQodm9pZCkKIHsKIAl1bnNpZ25lZCBpbnQgbWVtX3NpemUsIG1lbV9tYXNrOwpAQCAtMzM1LDE2ICszMzgsMTYgQEAKIAkvKgogCSAqIFdlIGRvbid0IGNhcmUgaWYgdGhlc2UgZmFpbC4KIAkgKi8KLQlyZXF1ZXN0X2lycShJUlFfUENJX1NFUlIsIGRjMjEyODVfc2Vycl9pcnEsIElSUUZfRElTQUJMRUQsCi0JCSAgICAiUENJIHN5c3RlbSBlcnJvciIsICZzZXJyX3RpbWVyKTsKLQlyZXF1ZXN0X2lycShJUlFfUENJX1BFUlIsIGRjMjEyODVfcGFyaXR5X2lycSwgSVJRRl9ESVNBQkxFRCwKLQkJICAgICJQQ0kgcGFyaXR5IGVycm9yIiwgJnBlcnJfdGltZXIpOwotCXJlcXVlc3RfaXJxKElSUV9QQ0lfQUJPUlQsIGRjMjEyODVfYWJvcnRfaXJxLCBJUlFGX0RJU0FCTEVELAotCQkgICAgIlBDSSBhYm9ydCIsIE5VTEwpOwotCXJlcXVlc3RfaXJxKElSUV9ESVNDQVJEX1RJTUVSLCBkYzIxMjg1X2Rpc2NhcmRfaXJxLCBJUlFGX0RJU0FCTEVELAotCQkgICAgIkRpc2NhcmQgdGltZXIiLCBOVUxMKTsKLQlyZXF1ZXN0X2lycShJUlFfUENJX0RQRVJSLCBkYzIxMjg1X2RwYXJpdHlfaXJxLCBJUlFGX0RJU0FCTEVELAotCQkgICAgIlBDSSBkYXRhIHBhcml0eSIsIE5VTEwpOworCWRjMjEyODVfcmVxdWVzdF9pcnEoSVJRX1BDSV9TRVJSLCBkYzIxMjg1X3NlcnJfaXJxLCBJUlFGX0RJU0FCTEVELAorCQkJICAgICJQQ0kgc3lzdGVtIGVycm9yIiwgJnNlcnJfdGltZXIpOworCWRjMjEyODVfcmVxdWVzdF9pcnEoSVJRX1BDSV9QRVJSLCBkYzIxMjg1X3Bhcml0eV9pcnEsIElSUUZfRElTQUJMRUQsCisJCQkgICAgIlBDSSBwYXJpdHkgZXJyb3IiLCAmcGVycl90aW1lcik7CisJZGMyMTI4NV9yZXF1ZXN0X2lycShJUlFfUENJX0FCT1JULCBkYzIxMjg1X2Fib3J0X2lycSwgSVJRRl9ESVNBQkxFRCwKKwkJCSAgICAiUENJIGFib3J0IiwgTlVMTCk7CisJZGMyMTI4NV9yZXF1ZXN0X2lycShJUlFfRElTQ0FSRF9USU1FUiwgZGMyMTI4NV9kaXNjYXJkX2lycSwgSVJRRl9ESVNBQkxFRCwKKwkJCSAgICAiRGlzY2FyZCB0aW1lciIsIE5VTEwpOworCWRjMjEyODVfcmVxdWVzdF9pcnEoSVJRX1BDSV9EUEVSUiwgZGMyMTI4NV9kcGFyaXR5X2lycSwgSVJRRl9ESVNBQkxFRCwKKwkJCSAgICAiUENJIGRhdGEgcGFyaXR5IiwgTlVMTCk7CiAKIAlpZiAoY2ZuX21vZGUpIHsKIAkJc3RhdGljIHN0cnVjdCByZXNvdXJjZSBjc3JpbzsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9pc2EtaXJxLmMgYi9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvaXNhLWlycS5jCmluZGV4IDllZTgwYTIuLjhiZmQwNmEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9pc2EtaXJxLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL2lzYS1pcnEuYwpAQCAtMjgsNiArMjgsOCBAQAogI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgogCisjaW5jbHVkZSAiY29tbW9uLmgiCisKIHN0YXRpYyB2b2lkIGlzYV9tYXNrX3BpY19sb19pcnEodW5zaWduZWQgaW50IGlycSkKIHsKIAl1bnNpZ25lZCBpbnQgbWFzayA9IDEgPDwgKGlycSAmIDcpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1oNzIweC9oNzIwMi1ldmFsLmMgYi9hcmNoL2FybS9tYWNoLWg3MjB4L2g3MjAyLWV2YWwuYwppbmRleCA1NjE2MWQ1Li44YzBiYTk5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWg3MjB4L2g3MjAyLWV2YWwuYworKysgYi9hcmNoL2FybS9tYWNoLWg3MjB4L2g3MjAyLWV2YWwuYwpAQCAtMjUsNiArMjUsNyBAQAogI2luY2x1ZGUgPGFzbS9wYWdlLmg+CiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KICNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CisjaW5jbHVkZSA8bWFjaC9pcnFzLmg+CiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgImNvbW1vbi5oIgogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlteC9jbG9jay5jIGIvYXJjaC9hcm0vbWFjaC1pbXgvY2xvY2suYwppbmRleCA3ZWM2MGZjLi5jZjMzMmFlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWlteC9jbG9jay5jCisrKyBiL2FyY2gvYXJtL21hY2gtaW14L2Nsb2NrLmMKQEAgLTIzLDcgKzIzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogCi0jaW5jbHVkZSA8bWFjaC9pbXgtcmVncy5oPgorI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KIAogLyoKICAqIFZlcnkgc2ltcGxlIGFwcHJvYWNoOiBXZSBjYW4ndCBkaXNhYmxlIGNsb2Nrcywgc28gd2UgZG8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW14L2dlbmVyaWMuYyBiL2FyY2gvYXJtL21hY2gtaW14L2dlbmVyaWMuYwppbmRleCBmYTcyMTc0Li44ODdjYjIxIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWlteC9nZW5lcmljLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1pbXgvZ2VuZXJpYy5jCkBAIC0yNDUsMTEgKzI0NSwxMSBAQAogCWlteF9tbWNfZGV2aWNlLmRldi5wbGF0Zm9ybV9kYXRhID0gaW5mbzsKIH0KIAotc3RhdGljIHN0cnVjdCBpbXhmYl9tYWNoX2luZm8gaW14X2ZiX2luZm87CitzdGF0aWMgc3RydWN0IGlteF9mYl9wbGF0Zm9ybV9kYXRhIGlteF9mYl9pbmZvOwogCi12b2lkIF9faW5pdCBzZXRfaW14X2ZiX2luZm8oc3RydWN0IGlteGZiX21hY2hfaW5mbyAqaGFyZF9pbXhfZmJfaW5mbykKK3ZvaWQgX19pbml0IHNldF9pbXhfZmJfaW5mbyhzdHJ1Y3QgaW14X2ZiX3BsYXRmb3JtX2RhdGEgKmhhcmRfaW14X2ZiX2luZm8pCiB7Ci0JbWVtY3B5KCZpbXhfZmJfaW5mbyxoYXJkX2lteF9mYl9pbmZvLHNpemVvZihzdHJ1Y3QgaW14ZmJfbWFjaF9pbmZvKSk7CisJbWVtY3B5KCZpbXhfZmJfaW5mbyxoYXJkX2lteF9mYl9pbmZvLHNpemVvZihzdHJ1Y3QgaW14X2ZiX3BsYXRmb3JtX2RhdGEpKTsKIH0KIAogc3RhdGljIHN0cnVjdCByZXNvdXJjZSBpbXhmYl9yZXNvdXJjZXNbXSA9IHsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW14L2luY2x1ZGUvbWFjaC9pbXgtcmVncy5oIGIvYXJjaC9hcm0vbWFjaC1pbXgvaW5jbHVkZS9tYWNoL2lteC1yZWdzLmgKaW5kZXggZmI5ZGUyNy4uNDkwMjk3ZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1pbXgvaW5jbHVkZS9tYWNoL2lteC1yZWdzLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1pbXgvaW5jbHVkZS9tYWNoL2lteC1yZWdzLmgKQEAgLTM3MywxMTAgKzM3Myw0IEBACiAjZGVmaW5lIFRTVEFUX0NBUFQgICAgICAgICAoMTw8MSkKICNkZWZpbmUgVFNUQVRfQ09NUCAgICAgICAgICgxPDwwKQogCi0vKgotICogTENEIENvbnRyb2xsZXIKLSAqLwotCi0jZGVmaW5lIExDRENfU1NBCV9fUkVHKElNWF9MQ0RDX0JBU0UrMHgwMCkKLQotI2RlZmluZSBMQ0RDX1NJWkUJX19SRUcoSU1YX0xDRENfQkFTRSsweDA0KQotI2RlZmluZSBTSVpFX1hNQVgoeCkJKCgoKHgpID4+IDQpICYgMHgzZikgPDwgMjApCi0jZGVmaW5lIFNJWkVfWU1BWCh5KSAgICAoICh5KSAmIDB4MWZmICkKLQotI2RlZmluZSBMQ0RDX1ZQVwlfX1JFRyhJTVhfTENEQ19CQVNFKzB4MDgpCi0jZGVmaW5lIFZQV19WUFcoeCkJKCAoeCkgJiAweDNmZiApCi0KLSNkZWZpbmUgTENEQ19DUE9TCV9fUkVHKElNWF9MQ0RDX0JBU0UrMHgwQykKLSNkZWZpbmUgQ1BPU19DQzEgICAgICAgICgxPDwzMSkKLSNkZWZpbmUgQ1BPU19DQzAgICAgICAgICgxPDwzMCkKLSNkZWZpbmUgQ1BPU19PUCAgICAgICAgICgxPDwyOCkKLSNkZWZpbmUgQ1BPU19DWFAoeCkgICAgICgoKHgpICYgM2ZmKSA8PCAxNikKLSNkZWZpbmUgQ1BPU19DWVAoeSkgICAgICgoeSkgJiAweDFmZikKLQotI2RlZmluZSBMQ0RDX0xDV0hCCV9fUkVHKElNWF9MQ0RDX0JBU0UrMHgxMCkKLSNkZWZpbmUgTENXSEJfQktfRU4gICAgICgxPDwzMSkKLSNkZWZpbmUgTENXSEJfQ1codykgICAgICgoKHcpICYgMHgxZikgPDwgMjQpCi0jZGVmaW5lIExDV0hCX0NIKGgpICAgICAoKChoKSAmIDB4MWYpIDw8IDE2KQotI2RlZmluZSBMQ1dIQl9CRCh4KSAgICAgKCh4KSAmIDB4ZmYpCi0KLSNkZWZpbmUgTENEQ19MQ0hDQwlfX1JFRyhJTVhfTENEQ19CQVNFKzB4MTQpCi0jZGVmaW5lIExDSENDX0NVUl9DT0xfUihyKSAoKChyKSAmIDB4MWYpIDw8IDExKQotI2RlZmluZSBMQ0hDQ19DVVJfQ09MX0coZykgKCgoZykgJiAweDNmKSA8PCA1KQotI2RlZmluZSBMQ0hDQ19DVVJfQ09MX0IoYikgKChiKSAmIDB4MWYpCi0KLSNkZWZpbmUgTENEQ19QQ1IJX19SRUcoSU1YX0xDRENfQkFTRSsweDE4KQotI2RlZmluZSBQQ1JfVEZUICAgICAgICAgKDE8PDMxKQotI2RlZmluZSBQQ1JfQ09MT1IgICAgICAgKDE8PDMwKQotI2RlZmluZSBQQ1JfUEJTSVpfMSAgICAgKDA8PDI4KQotI2RlZmluZSBQQ1JfUEJTSVpfMiAgICAgKDE8PDI4KQotI2RlZmluZSBQQ1JfUEJTSVpfNCAgICAgKDI8PDI4KQotI2RlZmluZSBQQ1JfUEJTSVpfOCAgICAgKDM8PDI4KQotI2RlZmluZSBQQ1JfQlBJWF8xICAgICAgKDA8PDI1KQotI2RlZmluZSBQQ1JfQlBJWF8yICAgICAgKDE8PDI1KQotI2RlZmluZSBQQ1JfQlBJWF80ICAgICAgKDI8PDI1KQotI2RlZmluZSBQQ1JfQlBJWF84ICAgICAgKDM8PDI1KQotI2RlZmluZSBQQ1JfQlBJWF8xMiAgICAgKDQ8PDI1KQotI2RlZmluZSBQQ1JfQlBJWF8xNiAgICAgKDQ8PDI1KQotI2RlZmluZSBQQ1JfUElYUE9MICAgICAgKDE8PDI0KQotI2RlZmluZSBQQ1JfRkxNUE9MICAgICAgKDE8PDIzKQotI2RlZmluZSBQQ1JfTFBQT0wgICAgICAgKDE8PDIyKQotI2RlZmluZSBQQ1JfQ0xLUE9MICAgICAgKDE8PDIxKQotI2RlZmluZSBQQ1JfT0VQT0wgICAgICAgKDE8PDIwKQotI2RlZmluZSBQQ1JfU0NMS0lETEUgICAgKDE8PDE5KQotI2RlZmluZSBQQ1JfRU5EX1NFTCAgICAgKDE8PDE4KQotI2RlZmluZSBQQ1JfRU5EX0JZVEVfU1dBUCAoMTw8MTcpCi0jZGVmaW5lIFBDUl9SRVZfVlMgICAgICAoMTw8MTYpCi0jZGVmaW5lIFBDUl9BQ0RfU0VMICAgICAoMTw8MTUpCi0jZGVmaW5lIFBDUl9BQ0QoeCkgICAgICAoKCh4KSAmIDB4N2YpIDw8IDgpCi0jZGVmaW5lIFBDUl9TQ0xLX1NFTCAgICAoMTw8NykKLSNkZWZpbmUgUENSX1NIQVJQICAgICAgICgxPDw2KQotI2RlZmluZSBQQ1JfUENEKHgpICAgICAgKCh4KSAmIDB4M2YpCi0KLSNkZWZpbmUgTENEQ19IQ1IJX19SRUcoSU1YX0xDRENfQkFTRSsweDFDKQotI2RlZmluZSBIQ1JfSF9XSURUSCh4KSAgKCgoeCkgJiAweDNmKSA8PCAyNikKLSNkZWZpbmUgSENSX0hfV0FJVF8xKHgpICgoKHgpICYgMHhmZikgPDwgOCkKLSNkZWZpbmUgSENSX0hfV0FJVF8yKHgpICgoeCkgJiAweGZmKQotCi0jZGVmaW5lIExDRENfVkNSCV9fUkVHKElNWF9MQ0RDX0JBU0UrMHgyMCkKLSNkZWZpbmUgVkNSX1ZfV0lEVEgoeCkgICgoKHgpICYgMHgzZikgPDwgMjYpCi0jZGVmaW5lIFZDUl9WX1dBSVRfMSh4KSAoKCh4KSAmIDB4ZmYpIDw8IDgpCi0jZGVmaW5lIFZDUl9WX1dBSVRfMih4KSAoKHgpICYgMHhmZikKLQotI2RlZmluZSBMQ0RDX1BPUwlfX1JFRyhJTVhfTENEQ19CQVNFKzB4MjQpCi0jZGVmaW5lIFBPU19QT1MoeCkgICAgICAoKHgpICYgMWYpCi0KLSNkZWZpbmUgTENEQ19MU0NSMQlfX1JFRyhJTVhfTENEQ19CQVNFKzB4MjgpCi0jZGVmaW5lIExTQ1IxX1BTX1JJU0VfREVMQVkoeCkgICAgKCgoeCkgJiAweDdmKSA8PCAyNikKLSNkZWZpbmUgTFNDUjFfQ0xTX1JJU0VfREVMQVkoeCkgICAoKCh4KSAmIDB4M2YpIDw8IDE2KQotI2RlZmluZSBMU0NSMV9SRVZfVE9HR0xFX0RFTEFZKHgpICgoKHgpICYgMHhmKSA8PCA4KQotI2RlZmluZSBMU0NSMV9HUkFZMih4KSAgICAgICAgICAgICgoKHgpICYgMHhmKSA8PCA0KQotI2RlZmluZSBMU0NSMV9HUkFZMSh4KSAgICAgICAgICAgICgoKHgpICYgMHhmKSkKLQotI2RlZmluZSBMQ0RDX1BXTVIJX19SRUcoSU1YX0xDRENfQkFTRSsweDJDKQotI2RlZmluZSBQV01SX0NMUyh4KSAgICAgKCgoeCkgJiAweDFmZikgPDwgMTYpCi0jZGVmaW5lIFBXTVJfTERNU0sgICAgICAoMTw8MTUpCi0jZGVmaW5lIFBXTVJfU0NSMSAgICAgICAoMTw8MTApCi0jZGVmaW5lIFBXTVJfU0NSMCAgICAgICAoMTw8OSkKLSNkZWZpbmUgUFdNUl9DQ19FTiAgICAgICgxPDw4KQotI2RlZmluZSBQV01SX1BXKHgpICAgICAgKCh4KSAmIDB4ZmYpCi0KLSNkZWZpbmUgTENEQ19ETUFDUglfX1JFRyhJTVhfTENEQ19CQVNFKzB4MzApCi0jZGVmaW5lIERNQUNSX0JVUlNUICAgICAoMTw8MzEpCi0jZGVmaW5lIERNQUNSX0hNKHgpICAgICAoKCh4KSAmIDB4ZikgPDwgMTYpCi0jZGVmaW5lIERNQUNSX1RNKHgpICAgICAoKHgpICYweGYpCi0KLSNkZWZpbmUgTENEQ19STUNSCV9fUkVHKElNWF9MQ0RDX0JBU0UrMHgzNCkKLSNkZWZpbmUgUk1DUl9MQ0RDX0VOCQkoMTw8MSkKLSNkZWZpbmUgUk1DUl9TRUxGX1JFRgkJKDE8PDApCi0KLSNkZWZpbmUgTENEQ19MQ0RJQ1IJX19SRUcoSU1YX0xDRENfQkFTRSsweDM4KQotI2RlZmluZSBMQ0RJQ1JfSU5UX1NZTiAgKDE8PDIpCi0jZGVmaW5lIExDRElDUl9JTlRfQ09OICAoMSkKLQotI2RlZmluZSBMQ0RDX0xDRElTUglfX1JFRyhJTVhfTENEQ19CQVNFKzB4NDApCi0jZGVmaW5lIExDRElTUl9VRFJfRVJSICgxPDwzKQotI2RlZmluZSBMQ0RJU1JfRVJSX1JFUyAoMTw8MikKLSNkZWZpbmUgTENESVNSX0VPRiAgICAgKDE8PDEpCi0jZGVmaW5lIExDRElTUl9CT0YgICAgICgxPDwwKQotCiAjZW5kaWYJCQkJLy8gX0lNWF9SRUdTX0gKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW50ZWdyYXRvci9wY2kuYyBiL2FyY2gvYXJtL21hY2gtaW50ZWdyYXRvci9wY2kuYwppbmRleCBhZjdkM2ZmLi4yZmRiOTU0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWludGVncmF0b3IvcGNpLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1pbnRlZ3JhdG9yL3BjaS5jCkBAIC02MywxMyArNjMsNyBAQAogICoKICAqIFdoZXJlIEEgPSBwaW4gMSwgQiA9IHBpbiAyIGFuZCBzbyBvbiBhbmQgcGluPTAgPSBkZWZhdWx0ID0gQS4KICAqIFRodXMsIGVhY2ggc3dpenpsZSBpcyAoKHBpbi0xKSArIChkZXZpY2UjLTQpKSAlIDQKLSAqCi0gKiBUaGUgZm9sbG93aW5nIGNvZGUgc3dpenpsZXMgZm9yIGV4YWN0bHkgb25lIGJyaWRnZS4gIAogICovCi1zdGF0aWMgaW5saW5lIGludCBicmlkZ2Vfc3dpenpsZShpbnQgcGluLCB1bnNpZ25lZCBpbnQgc2xvdCkgCi17Ci0JcmV0dXJuIChwaW4gKyBzbG90KSAmIDM7Ci19CiAKIC8qCiAgKiBUaGlzIHJvdXRpbmUgaGFuZGxlcyBtdWx0aXBsZSBicmlkZ2VzLgpAQCAtODEsMTUgKzc1LDE0IEBACiAJaWYgKHBpbiA9PSAwKQogCQlwaW4gPSAxOwogCi0JcGluIC09IDE7CiAJd2hpbGUgKGRldi0+YnVzLT5zZWxmKSB7Ci0JCXBpbiA9IGJyaWRnZV9zd2l6emxlKHBpbiwgUENJX1NMT1QoZGV2LT5kZXZmbikpOworCQlwaW4gPSBwY2lfc3dpenpsZV9pbnRlcnJ1cHRfcGluKGRldiwgcGluKTsKIAkJLyoKIAkJICogbW92ZSB1cCB0aGUgY2hhaW4gb2YgYnJpZGdlcywgc3dpenpsaW5nIGFzIHdlIGdvLgogCQkgKi8KIAkJZGV2ID0gZGV2LT5idXMtPnNlbGY7CiAJfQotCSpwaW5wID0gcGluICsgMTsKKwkqcGlucCA9IHBpbjsKIAogCXJldHVybiBQQ0lfU0xPVChkZXYtPmRldmZuKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gta2lya3dvb2QvY29tbW9uLmMgYi9hcmNoL2FybS9tYWNoLWtpcmt3b29kL2NvbW1vbi5jCmluZGV4IDdiOGVmOTcuLmIzNDA0YjcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gta2lya3dvb2QvY29tbW9uLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1raXJrd29vZC9jb21tb24uYwpAQCAtNjk4LDYgKzY5OCw3IEBACiAJcHJpbnRrKEtFUk5fSU5GTyAiS2lya3dvb2Q6ICVzLCBUQ0xLPSVkLlxuIiwKIAkJa2lya3dvb2RfaWQoKSwga2lya3dvb2RfdGNsayk7CiAJa2lya3dvb2RfZ2UwMF9zaGFyZWRfZGF0YS50X2NsayA9IGtpcmt3b29kX3RjbGs7CisJa2lya3dvb2RfZ2UwMV9zaGFyZWRfZGF0YS50X2NsayA9IGtpcmt3b29kX3RjbGs7CiAJa2lya3dvb2Rfc3BpX3BsYXRfZGF0YS50Y2xrID0ga2lya3dvb2RfdGNsazsKIAlraXJrd29vZF91YXJ0MF9kYXRhWzBdLnVhcnRjbGsgPSBraXJrd29vZF90Y2xrOwogCWtpcmt3b29kX3VhcnQxX2RhdGFbMF0udWFydGNsayA9IGtpcmt3b29kX3RjbGs7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWtpcmt3b29kL3BjaWUuYyBiL2FyY2gvYXJtL21hY2gta2lya3dvb2QvcGNpZS5jCmluZGV4IGY2YjA4ZjIuLjczZmNjYWMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gta2lya3dvb2QvcGNpZS5jCisrKyBiL2FyY2gvYXJtL21hY2gta2lya3dvb2QvcGNpZS5jCkBAIC0xMSw2ICsxMSw3IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvbWJ1cy5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlIDxhc20vbWFjaC9wY2kuaD4KICNpbmNsdWRlIDxwbGF0L3BjaWUuaD4KICNpbmNsdWRlICJjb21tb24uaCIKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gta3M4Njk1L2RldmljZXMuYyBiL2FyY2gvYXJtL21hY2gta3M4Njk1L2RldmljZXMuYwppbmRleCAzNmFiMGZkLi5iODlmYjZkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWtzODY5NS9kZXZpY2VzLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1rczg2OTUvZGV2aWNlcy5jCkBAIC0yMiw2ICsyMiw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KIAorI2luY2x1ZGUgPG1hY2gvaXJxcy5oPgogI2luY2x1ZGUgPG1hY2gvcmVncy13YW4uaD4KICNpbmNsdWRlIDxtYWNoL3JlZ3MtbGFuLmg+CiAjaW5jbHVkZSA8bWFjaC9yZWdzLWhwbmEuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXNtL2RldmljZXMuYyBiL2FyY2gvYXJtL21hY2gtbXNtL2RldmljZXMuYwppbmRleCBmMmE3NGI5Li4zMWI2YjMwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW1zbS9kZXZpY2VzLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1tc20vZGV2aWNlcy5jCkBAIC0xNiw2ICsxNiw3IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAKKyNpbmNsdWRlIDxtYWNoL2lycXMuaD4KICNpbmNsdWRlIDxtYWNoL21zbV9pb21hcC5oPgogI2luY2x1ZGUgImRldmljZXMuaCIKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1tdjc4eHgwL3BjaWUuYyBiL2FyY2gvYXJtL21hY2gtbXY3OHh4MC9wY2llLmMKaW5kZXggNDMwZWE4NC4uYWFkM2E3YSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1tdjc4eHgwL3BjaWUuYworKysgYi9hcmNoL2FybS9tYWNoLW12Nzh4eDAvcGNpZS5jCkBAIC0xMSw2ICsxMSw3IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvbWJ1cy5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlIDxhc20vbWFjaC9wY2kuaD4KICNpbmNsdWRlIDxwbGF0L3BjaWUuaD4KICNpbmNsdWRlICJjb21tb24uaCIKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXgyL2RldmljZXMuYyBiL2FyY2gvYXJtL21hY2gtbXgyL2RldmljZXMuYwppbmRleCBhZjEyMWY1Li4yZjkyNDBiIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW14Mi9kZXZpY2VzLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1teDIvZGV2aWNlcy5jCkBAIC0zMiw2ICszMiw3IEBACiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogCisjaW5jbHVkZSA8bWFjaC9pcnFzLmg+CiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogCiAvKgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1teDMvZGV2aWNlcy5jIGIvYXJjaC9hcm0vbWFjaC1teDMvZGV2aWNlcy5jCmluZGV4IDFkNDZjYjQuLmY4NDI4ODAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbXgzL2RldmljZXMuYworKysgYi9hcmNoL2FybS9tYWNoLW14My9kZXZpY2VzLmMKQEAgLTIyLDYgKzIyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zZXJpYWwuaD4KICNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPG1hY2gvaXJxcy5oPgogI2luY2x1ZGUgPG1hY2gvaW14LXVhcnQuaD4KIAogc3RhdGljIHN0cnVjdCByZXNvdXJjZSB1YXJ0MFtdID0gewpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1uZXR4L2ZiLmMgYi9hcmNoL2FybS9tYWNoLW5ldHgvZmIuYwppbmRleCBlYThmYTg4Li4xZDg0NGUyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW5ldHgvZmIuYworKysgYi9hcmNoL2FybS9tYWNoLW5ldHgvZmIuYwpAQCAtMjQsNiArMjQsOCBAQAogI2luY2x1ZGUgPGxpbnV4L2FtYmEvY2xjZC5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogCisjaW5jbHVkZSA8YXNtL2lycS5oPgorCiAjaW5jbHVkZSA8bWFjaC9uZXR4LXJlZ3MuaD4KICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbmV0eC90aW1lLmMgYi9hcmNoL2FybS9tYWNoLW5ldHgvdGltZS5jCmluZGV4IGQ1MWQ2MjcuLmYyMDFmZGQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbmV0eC90aW1lLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1uZXR4L3RpbWUuYwpAQCAtMTYzLDcgKzE2Myw3IEBACiAJICogQWRkaW5nIHNvbWUgc2FmZXR5IC4uLiAqLwogCW5ldHhfY2xvY2tldmVudC5taW5fZGVsdGFfbnMgPQogCQljbG9ja2V2ZW50X2RlbHRhMm5zKDB4YTAwLCAmbmV0eF9jbG9ja2V2ZW50KTsKLQluZXR4X2Nsb2NrZXZlbnQuY3B1bWFzayA9IGNwdW1hc2tfb2ZfY3B1KDApOworCW5ldHhfY2xvY2tldmVudC5jcHVtYXNrID0gY3B1bWFza19vZigwKTsKIAljbG9ja2V2ZW50c19yZWdpc3Rlcl9kZXZpY2UoJm5ldHhfY2xvY2tldmVudCk7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbmV0eC94Yy5jIGIvYXJjaC9hcm0vbWFjaC1uZXR4L3hjLmMKaW5kZXggOGZjNjIwNS4uMTgxYTc4YiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1uZXR4L3hjLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1uZXR4L3hjLmMKQEAgLTI0LDYgKzI0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pby5oPgogCiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPG1hY2gvaXJxcy5oPgogI2luY2x1ZGUgPG1hY2gvbmV0eC1yZWdzLmg+CiAKICNpbmNsdWRlIDxtYWNoL3hjLmg+CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAxL21jYnNwLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAxL21jYnNwLmMKaW5kZXggN2RlN2M2OS4uNDQ3NGRhNyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9tY2JzcC5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDEvbWNic3AuYwpAQCAtMTgsNiArMTgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogCiAjaW5jbHVkZSA8bWFjaC9kbWEuaD4KKyNpbmNsdWRlIDxtYWNoL2lycXMuaD4KICNpbmNsdWRlIDxtYWNoL211eC5oPgogI2luY2x1ZGUgPG1hY2gvY3B1Lmg+CiAjaW5jbHVkZSA8bWFjaC9tY2JzcC5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9tY2JzcC5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9tY2JzcC5jCmluZGV4IGNhZTNlYmUuLmFjZGM3MDkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvbWNic3AuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL21jYnNwLmMKQEAgLTE4LDYgKzE4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KIAogI2luY2x1ZGUgPG1hY2gvZG1hLmg+CisjaW5jbHVkZSA8bWFjaC9pcnFzLmg+CiAjaW5jbHVkZSA8bWFjaC9tdXguaD4KICNpbmNsdWRlIDxtYWNoL2NwdS5oPgogI2luY2x1ZGUgPG1hY2gvbWNic3AuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb3Jpb241eC9wY2kuYyBiL2FyY2gvYXJtL21hY2gtb3Jpb241eC9wY2kuYwppbmRleCBhN2I3ZDc3Li5kMGE3ODVhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9yaW9uNXgvcGNpLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L3BjaS5jCkBAIC0xMyw2ICsxMyw3IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvbWJ1cy5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlIDxhc20vbWFjaC9wY2kuaD4KICNpbmNsdWRlIDxwbGF0L3BjaWUuaD4KICNpbmNsdWRlICJjb21tb24uaCIKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcG54NDAwOC9ncGlvLmMgYi9hcmNoL2FybS9tYWNoLXBueDQwMDgvZ3Bpby5jCmluZGV4IDAxNWNjMjEuLmYyMTk5MTQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcG54NDAwOC9ncGlvLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1wbng0MDA4L2dwaW8uYwpAQCAtMTgsNiArMTgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPG1hY2gvcGxhdGZvcm0uaD4KICNpbmNsdWRlIDxtYWNoL2dwaW8uaD4KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1wbng0MDA4L2kyYy5jIGIvYXJjaC9hcm0vbWFjaC1wbng0MDA4L2kyYy5jCmluZGV4IDg3YzA5MzIuLmYzZmVhMjkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcG54NDAwOC9pMmMuYworKysgYi9hcmNoL2FybS9tYWNoLXBueDQwMDgvaTJjLmMKQEAgLTE1LDYgKzE1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxtYWNoL3BsYXRmb3JtLmg+CisjaW5jbHVkZSA8bWFjaC9pcnFzLmg+CiAjaW5jbHVkZSA8bWFjaC9pMmMuaD4KIAogc3RhdGljIGludCBzZXRfY2xvY2tfcnVuKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9jb3JnaS5jIGIvYXJjaC9hcm0vbWFjaC1weGEvY29yZ2kuYwppbmRleCBjNWUyOGE0Li5hOGQ5MWI2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9jb3JnaS5jCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL2NvcmdpLmMKQEAgLTI3LDYgKzI3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpL2Fkczc4NDYuaD4KICNpbmNsdWRlIDxsaW51eC9zcGkvY29yZ2lfbGNkLmg+CisjaW5jbHVkZSA8bGludXgvbXRkL3NoYXJwc2wuaD4KICNpbmNsdWRlIDx2aWRlby93MTAwZmIuaD4KIAogI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgpAQCAtNTQyLDYgKzU0Myw1NSBAQAogc3RhdGljIGlubGluZSB2b2lkIGNvcmdpX2luaXRfc3BpKHZvaWQpIHt9CiAjZW5kaWYKIAorc3RhdGljIHN0cnVjdCBtdGRfcGFydGl0aW9uIHNoYXJwc2xfbmFuZF9wYXJ0aXRpb25zW10gPSB7CisJeworCQkubmFtZSA9ICJTeXN0ZW0gQXJlYSIsCisJCS5vZmZzZXQgPSAwLAorCQkuc2l6ZSA9IDcgKiAxMDI0ICogMTAyNCwKKwl9LAorCXsKKwkJLm5hbWUgPSAiUm9vdCBGaWxlc3lzdGVtIiwKKwkJLm9mZnNldCA9IDcgKiAxMDI0ICogMTAyNCwKKwkJLnNpemUgPSAyNSAqIDEwMjQgKiAxMDI0LAorCX0sCisJeworCQkubmFtZSA9ICJIb21lIEZpbGVzeXN0ZW0iLAorCQkub2Zmc2V0ID0gTVREUEFSVF9PRlNfQVBQRU5ELAorCQkuc2l6ZSA9IE1URFBBUlRfU0laX0ZVTEwsCisJfSwKK307CisKK3N0YXRpYyB1aW50OF90IHNjYW5fZmZfcGF0dGVybltdID0geyAweGZmLCAweGZmIH07CisKK3N0YXRpYyBzdHJ1Y3QgbmFuZF9iYnRfZGVzY3Igc2hhcnBzbF9iYnQgPSB7CisJLm9wdGlvbnMgPSAwLAorCS5vZmZzID0gNCwKKwkubGVuID0gMiwKKwkucGF0dGVybiA9IHNjYW5fZmZfcGF0dGVybgorfTsKKworc3RhdGljIHN0cnVjdCBzaGFycHNsX25hbmRfcGxhdGZvcm1fZGF0YSBzaGFycHNsX25hbmRfcGxhdGZvcm1fZGF0YSA9IHsKKwkuYmFkYmxvY2tfcGF0dGVybgk9ICZzaGFycHNsX2JidCwKKwkucGFydGl0aW9ucwkJPSBzaGFycHNsX25hbmRfcGFydGl0aW9ucywKKwkubnJfcGFydGl0aW9ucwkJPSBBUlJBWV9TSVpFKHNoYXJwc2xfbmFuZF9wYXJ0aXRpb25zKSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2Ugc2hhcnBzbF9uYW5kX3Jlc291cmNlc1tdID0geworCXsKKwkJLnN0YXJ0CT0gMHgwQzAwMDAwMCwKKwkJLmVuZAk9IDB4MEMwMDBGRkYsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBzaGFycHNsX25hbmRfZGV2aWNlID0geworCS5uYW1lCQk9ICJzaGFycHNsLW5hbmQiLAorCS5pZAkJPSAtMSwKKwkucmVzb3VyY2UJPSBzaGFycHNsX25hbmRfcmVzb3VyY2VzLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShzaGFycHNsX25hbmRfcmVzb3VyY2VzKSwKKwkuZGV2LnBsYXRmb3JtX2RhdGEJPSAmc2hhcnBzbF9uYW5kX3BsYXRmb3JtX2RhdGEsCit9OworCiBzdGF0aWMgc3RydWN0IG10ZF9wYXJ0aXRpb24gc2hhcnBzbF9yb21fcGFydHNbXSA9IHsKIAl7CiAJCS5uYW1lCT0iQm9vdCBQUk9NIEZpbGVzeXN0ZW0iLApAQCAtNTc3LDYgKzYyNyw3IEBACiAJJmNvcmdpZmJfZGV2aWNlLAogCSZjb3JnaWtiZF9kZXZpY2UsCiAJJmNvcmdpbGVkX2RldmljZSwKKwkmc2hhcnBzbF9uYW5kX2RldmljZSwKIAkmc2hhcnBzbF9yb21fZGV2aWNlLAogfTsKIApAQCAtNjE3LDYgKzY2OCw5IEBACiAKIAlwbGF0Zm9ybV9zY29vcF9jb25maWcgPSAmY29yZ2lfcGNtY2lhX2NvbmZpZzsKIAorCWlmIChtYWNoaW5lX2lzX2h1c2t5KCkpCisJCXNoYXJwc2xfbmFuZF9wYXJ0aXRpb25zWzFdLnNpemUgPSA1MyAqIDEwMjQgKiAxMDI0OworCiAJcGxhdGZvcm1fYWRkX2RldmljZXMoZGV2aWNlcywgQVJSQVlfU0laRShkZXZpY2VzKSk7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL2UzNTAuYyBiL2FyY2gvYXJtL21hY2gtcHhhL2UzNTAuYwppbmRleCAyNTExMjkzLi5lZGNkOWQ1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9lMzUwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvZTM1MC5jCkBAIC0yMCw2ICsyMCw3IEBACiAjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgogI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CiAKKyNpbmNsdWRlIDxtYWNoL2lycXMuaD4KICNpbmNsdWRlIDxtYWNoL21mcC1weGEyNXguaD4KICNpbmNsdWRlIDxtYWNoL3B4YS1yZWdzLmg+CiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvZTQwMC5jIGIvYXJjaC9hcm0vbWFjaC1weGEvZTQwMC5jCmluZGV4IGJlZDAzMzYuLjc3YmI4ZTIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL2U0MDAuYworKysgYi9hcmNoL2FybS9tYWNoLXB4YS9lNDAwLmMKQEAgLTI4LDYgKzI4LDcgQEAKICNpbmNsdWRlIDxtYWNoL2VzZXJpZXMtZ3Bpby5oPgogI2luY2x1ZGUgPG1hY2gvcHhhZmIuaD4KICNpbmNsdWRlIDxtYWNoL3VkYy5oPgorI2luY2x1ZGUgPG1hY2gvaXJxcy5oPgogCiAjaW5jbHVkZSAiZ2VuZXJpYy5oIgogI2luY2x1ZGUgImVzZXJpZXMuaCIKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL2U3NDAuYyBiL2FyY2gvYXJtL21hY2gtcHhhL2U3NDAuYwppbmRleCBiMDBkNjcwLi42ZDQ4ZTAwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9lNzQwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvZTc0MC5jCkBAIC0zMCw2ICszMCw3IEBACiAjaW5jbHVkZSA8bWFjaC9lc2VyaWVzLWdwaW8uaD4KICNpbmNsdWRlIDxtYWNoL3VkYy5oPgogI2luY2x1ZGUgPG1hY2gvaXJkYS5oPgorI2luY2x1ZGUgPG1hY2gvaXJxcy5oPgogCiAjaW5jbHVkZSAiZ2VuZXJpYy5oIgogI2luY2x1ZGUgImVzZXJpZXMuaCIKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL2U3NTAuYyBiL2FyY2gvYXJtL21hY2gtcHhhL2U3NTAuYwppbmRleCA4NGQ3YzFhLi5iZTFhYjhlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9lNzUwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvZTc1MC5jCkBAIC0yOSw2ICsyOSw3IEBACiAjaW5jbHVkZSA8bWFjaC9lc2VyaWVzLWdwaW8uaD4KICNpbmNsdWRlIDxtYWNoL3VkYy5oPgogI2luY2x1ZGUgPG1hY2gvaXJkYS5oPgorI2luY2x1ZGUgPG1hY2gvaXJxcy5oPgogCiAjaW5jbHVkZSAiZ2VuZXJpYy5oIgogI2luY2x1ZGUgImVzZXJpZXMuaCIKQEAgLTEwNSw2ICsxMDYsNTcgQEAKIAkucmVzb3VyY2UgICAgICAgPSBlNzUwX2ZiX3Jlc291cmNlcywKIH07CiAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tIGU3NTAgTUZQIHBhcmFtZXRlcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgZTc1MF9waW5fY29uZmlnW10gX19pbml0ZGF0YSA9IHsKKwkvKiBDaGlwIHNlbGVjdHMgKi8KKwlHUElPMTVfbkNTXzEsICAgLyogQ1MxIC0gRmxhc2ggKi8KKwlHUElPNzlfbkNTXzMsICAgLyogQ1MzIC0gSU1BR0VPTiAqLworCUdQSU84MF9uQ1NfNCwgICAvKiBDUzQgLSBUTUlPICovCisKKwkvKiBDbG9ja3MgKi8KKwlHUElPMTFfM182TUh6LAorCisJLyogQlRVQVJUICovCisJR1BJTzQyX0JUVUFSVF9SWEQsCisJR1BJTzQzX0JUVUFSVF9UWEQsCisJR1BJTzQ0X0JUVUFSVF9DVFMsCisKKwkvKiBUTUlPIGNvbnRyb2xsZXIgKi8KKwlHUElPMTlfR1BJTywgLyogdDdsNjZ4YiAjUENMUiAqLworCUdQSU80NV9HUElPLCAvKiB0N2w2NnhiICNTVVNQRU5EIChOT1QgQlRVQVJUISkgKi8KKworCS8qIFVEQyAqLworCUdQSU8xM19HUElPLAorCUdQSU8zX0dQSU8sCisKKwkvKiBJckRBICovCisJR1BJTzM4X0dQSU8gfCBNRlBfTFBNX0RSSVZFX0hJR0gsCisKKwkvKiBQQyBDYXJkICovCisJR1BJTzhfR1BJTywgICAvKiBDRDAgKi8KKwlHUElPNDRfR1BJTywgIC8qIENEMSAqLworCUdQSU8xMV9HUElPLCAgLyogSVJRMCAqLworCUdQSU82X0dQSU8sICAgLyogSVJRMSAqLworCUdQSU8yN19HUElPLCAgLyogUlNUMCAqLworCUdQSU8yNF9HUElPLCAgLyogUlNUMSAqLworCUdQSU8yMF9HUElPLCAgLyogUFdSMCAqLworCUdQSU8yM19HUElPLCAgLyogUFdSMSAqLworCUdQSU80OF9uUE9FLAorCUdQSU80OV9uUFdFLAorCUdQSU81MF9uUElPUiwKKwlHUElPNTFfblBJT1csCisJR1BJTzUyX25QQ0VfMSwKKwlHUElPNTNfblBDRV8yLAorCUdQSU81NF9uUFNLVFNFTCwKKwlHUElPNTVfblBSRUcsCisJR1BJTzU2X25QV0FJVCwKKwlHUElPNTdfbklPSVMxNiwKKworCS8qIHdha2V1cCAqLworCUdQSU8wX0dQSU8gfCBXQUtFVVBfT05fRURHRV9SSVNFLAorfTsKKwogLyogLS0tLS0tLS0tLS0tLS0tLS0gZTc1MCB0YzYzOTN4YiBwYXJhbWV0ZXJzIC0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCiBzdGF0aWMgc3RydWN0IHRjNjM5M3hiX3BsYXRmb3JtX2RhdGEgZTc1MF90YzYzOTN4Yl9pbmZvID0gewpAQCAtMTM3LDYgKzE4OSw3IEBACiAKIHN0YXRpYyB2b2lkIF9faW5pdCBlNzUwX2luaXQodm9pZCkKIHsKKwlweGEyeHhfbWZwX2NvbmZpZyhBUlJBWV9BTkRfU0laRShlNzUwX3Bpbl9jb25maWcpKTsKIAljbGtfYWRkX2FsaWFzKCJDTEtfQ0szUDZNSSIsICZlNzUwX3RjNjM5M3hiX2RldmljZS5kZXYsCiAJCQkiR1BJTzExX0NMSyIsIE5VTEwpLAogCWVzZXJpZXNfZ2V0X3RtaW9fZ3Bpb3MoKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL2U4MDAuYyBiL2FyY2gvYXJtL21hY2gtcHhhL2U4MDAuYwppbmRleCA5YTg2YTQyLi5jYzliMTI5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9lODAwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvZTgwMC5jCkBAIC0yOCw2ICsyOCw3IEBACiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPG1hY2gvZXNlcmllcy1ncGlvLmg+CiAjaW5jbHVkZSA8bWFjaC91ZGMuaD4KKyNpbmNsdWRlIDxtYWNoL2lycXMuaD4KIAogI2luY2x1ZGUgImdlbmVyaWMuaCIKICNpbmNsdWRlICJlc2VyaWVzLmgiCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9pbmNsdWRlL21hY2gvcHhhM3h4LXJlZ3MuaCBiL2FyY2gvYXJtL21hY2gtcHhhL2luY2x1ZGUvbWFjaC9weGEzeHgtcmVncy5oCmluZGV4IGIxZmNkMTAuLmJjZjNmYjIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL2luY2x1ZGUvbWFjaC9weGEzeHgtcmVncy5oCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL2luY2x1ZGUvbWFjaC9weGEzeHgtcmVncy5oCkBAIC0xOTMsMTAgKzE5Myw4IEBACiAjZGVmaW5lIENLRU5fTUlOSV9JTQk0OAkvKiA8IE1pbmktSU0gKi8KICNkZWZpbmUgQ0tFTl9NSU5JX0xDRAk0OQkvKiA8IE1pbmkgTENEICovCiAKLSNpZiBkZWZpbmVkKENPTkZJR19DUFVfUFhBMzEwKQogI2RlZmluZSBDS0VOX01NQzMJNQkvKiA8IE1NQzMgQ2xvY2sgRW5hYmxlICovCiAjZGVmaW5lIENLRU5fTVZFRAk0MwkvKiA8IE1WRUQgY2xvY2sgZW5hYmxlICovCi0jZW5kaWYKIAogLyogTm90ZTogR0NVIGNsb2NrIGVuYWJsZSBiaXQgZGlmZmVycyBvbiBQWEEzMDAvUFhBMzEwIGFuZCBQWEEzMjAgKi8KICNkZWZpbmUgUFhBMzAwX0NLRU5fR1JBUEhJQ1MJNDIJLyogR3JhcGhpY3MgY29udHJvbGxlciBjbG9jayBlbmFibGUgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL3Bvb2RsZS5jIGIvYXJjaC9hcm0vbWFjaC1weGEvcG9vZGxlLmMKaW5kZXggYWU4ODg1NS4uZjkwOTNiZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvcG9vZGxlLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvcG9vZGxlLmMKQEAgLTI0LDYgKzI0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaS9hZHM3ODQ2Lmg+CisjaW5jbHVkZSA8bGludXgvbXRkL3NoYXJwc2wuaD4KIAogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgpAQCAtNDE0LDYgKzQxNSw1NSBAQAogCS5sY2RfY29ubgk9IExDRF9DT0xPUl9URlRfMTZCUFAsCiB9OwogCitzdGF0aWMgc3RydWN0IG10ZF9wYXJ0aXRpb24gc2hhcnBzbF9uYW5kX3BhcnRpdGlvbnNbXSA9IHsKKwl7CisJCS5uYW1lID0gIlN5c3RlbSBBcmVhIiwKKwkJLm9mZnNldCA9IDAsCisJCS5zaXplID0gNyAqIDEwMjQgKiAxMDI0LAorCX0sCisJeworCQkubmFtZSA9ICJSb290IEZpbGVzeXN0ZW0iLAorCQkub2Zmc2V0ID0gNyAqIDEwMjQgKiAxMDI0LAorCQkuc2l6ZSA9IDIyICogMTAyNCAqIDEwMjQsCisJfSwKKwl7CisJCS5uYW1lID0gIkhvbWUgRmlsZXN5c3RlbSIsCisJCS5vZmZzZXQgPSBNVERQQVJUX09GU19BUFBFTkQsCisJCS5zaXplID0gTVREUEFSVF9TSVpfRlVMTCwKKwl9LAorfTsKKworc3RhdGljIHVpbnQ4X3Qgc2Nhbl9mZl9wYXR0ZXJuW10gPSB7IDB4ZmYsIDB4ZmYgfTsKKworc3RhdGljIHN0cnVjdCBuYW5kX2JidF9kZXNjciBzaGFycHNsX2JidCA9IHsKKwkub3B0aW9ucyA9IDAsCisJLm9mZnMgPSA0LAorCS5sZW4gPSAyLAorCS5wYXR0ZXJuID0gc2Nhbl9mZl9wYXR0ZXJuCit9OworCitzdGF0aWMgc3RydWN0IHNoYXJwc2xfbmFuZF9wbGF0Zm9ybV9kYXRhIHNoYXJwc2xfbmFuZF9wbGF0Zm9ybV9kYXRhID0geworCS5iYWRibG9ja19wYXR0ZXJuCT0gJnNoYXJwc2xfYmJ0LAorCS5wYXJ0aXRpb25zCQk9IHNoYXJwc2xfbmFuZF9wYXJ0aXRpb25zLAorCS5ucl9wYXJ0aXRpb25zCQk9IEFSUkFZX1NJWkUoc2hhcnBzbF9uYW5kX3BhcnRpdGlvbnMpLAorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzaGFycHNsX25hbmRfcmVzb3VyY2VzW10gPSB7CisJeworCQkuc3RhcnQJPSAweDBDMDAwMDAwLAorCQkuZW5kCT0gMHgwQzAwMEZGRiwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHNoYXJwc2xfbmFuZF9kZXZpY2UgPSB7CisJLm5hbWUJCT0gInNoYXJwc2wtbmFuZCIsCisJLmlkCQk9IC0xLAorCS5yZXNvdXJjZQk9IHNoYXJwc2xfbmFuZF9yZXNvdXJjZXMsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHNoYXJwc2xfbmFuZF9yZXNvdXJjZXMpLAorCS5kZXYucGxhdGZvcm1fZGF0YQk9ICZzaGFycHNsX25hbmRfcGxhdGZvcm1fZGF0YSwKK307CisKIHN0YXRpYyBzdHJ1Y3QgbXRkX3BhcnRpdGlvbiBzaGFycHNsX3JvbV9wYXJ0c1tdID0gewogCXsKIAkJLm5hbWUJPSJCb290IFBST00gRmlsZXN5c3RlbSIsCkBAIC00NDcsNiArNDk3LDcgQEAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXZpY2VzW10gX19pbml0ZGF0YSA9IHsKIAkmcG9vZGxlX2xvY29tb19kZXZpY2UsCiAJJnBvb2RsZV9zY29vcF9kZXZpY2UsCisJJnNoYXJwc2xfbmFuZF9kZXZpY2UsCiAJJnNoYXJwc2xfcm9tX2RldmljZSwKIH07CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL3NwaXR6LmMgYi9hcmNoL2FybS9tYWNoLXB4YS9zcGl0ei5jCmluZGV4IDcyOTlkODcuLjZkNDQ3YzkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL3NwaXR6LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvc3BpdHouYwpAQCAtMzEsNiArMzEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KICNpbmNsdWRlIDxsaW51eC9zcGkvYWRzNzg0Ni5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaS9jb3JnaV9sY2QuaD4KKyNpbmNsdWRlIDxsaW51eC9tdGQvc2hhcnBzbC5oPgogCiAjaW5jbHVkZSA8YXNtL3NldHVwLmg+CiAjaW5jbHVkZSA8YXNtL21lbW9yeS5oPgpAQCAtNjEzLDYgKzYxNCw1NCBAQAogCS5sY2RfY29ubgk9IExDRF9DT0xPUl9URlRfMTZCUFAgfCBMQ0RfQUxURVJOQVRFX01BUFBJTkcsCiB9OwogCitzdGF0aWMgc3RydWN0IG10ZF9wYXJ0aXRpb24gc2hhcnBzbF9uYW5kX3BhcnRpdGlvbnNbXSA9IHsKKwl7CisJCS5uYW1lID0gIlN5c3RlbSBBcmVhIiwKKwkJLm9mZnNldCA9IDAsCisJCS5zaXplID0gNyAqIDEwMjQgKiAxMDI0LAorCX0sCisJeworCQkubmFtZSA9ICJSb290IEZpbGVzeXN0ZW0iLAorCQkub2Zmc2V0ID0gNyAqIDEwMjQgKiAxMDI0LAorCX0sCisJeworCQkubmFtZSA9ICJIb21lIEZpbGVzeXN0ZW0iLAorCQkub2Zmc2V0ID0gTVREUEFSVF9PRlNfQVBQRU5ELAorCQkuc2l6ZSA9IE1URFBBUlRfU0laX0ZVTEwsCisJfSwKK307CisKK3N0YXRpYyB1aW50OF90IHNjYW5fZmZfcGF0dGVybltdID0geyAweGZmLCAweGZmIH07CisKK3N0YXRpYyBzdHJ1Y3QgbmFuZF9iYnRfZGVzY3Igc2hhcnBzbF9iYnQgPSB7CisJLm9wdGlvbnMgPSAwLAorCS5vZmZzID0gNCwKKwkubGVuID0gMiwKKwkucGF0dGVybiA9IHNjYW5fZmZfcGF0dGVybgorfTsKKworc3RhdGljIHN0cnVjdCBzaGFycHNsX25hbmRfcGxhdGZvcm1fZGF0YSBzaGFycHNsX25hbmRfcGxhdGZvcm1fZGF0YSA9IHsKKwkuYmFkYmxvY2tfcGF0dGVybgk9ICZzaGFycHNsX2JidCwKKwkucGFydGl0aW9ucwkJPSBzaGFycHNsX25hbmRfcGFydGl0aW9ucywKKwkubnJfcGFydGl0aW9ucwkJPSBBUlJBWV9TSVpFKHNoYXJwc2xfbmFuZF9wYXJ0aXRpb25zKSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2Ugc2hhcnBzbF9uYW5kX3Jlc291cmNlc1tdID0geworCXsKKwkJLnN0YXJ0CT0gMHgwQzAwMDAwMCwKKwkJLmVuZAk9IDB4MEMwMDBGRkYsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBzaGFycHNsX25hbmRfZGV2aWNlID0geworCS5uYW1lCQk9ICJzaGFycHNsLW5hbmQiLAorCS5pZAkJPSAtMSwKKwkucmVzb3VyY2UJPSBzaGFycHNsX25hbmRfcmVzb3VyY2VzLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShzaGFycHNsX25hbmRfcmVzb3VyY2VzKSwKKwkuZGV2LnBsYXRmb3JtX2RhdGEJPSAmc2hhcnBzbF9uYW5kX3BsYXRmb3JtX2RhdGEsCit9OworCiAKIHN0YXRpYyBzdHJ1Y3QgbXRkX3BhcnRpdGlvbiBzaGFycHNsX3JvbV9wYXJ0c1tdID0gewogCXsKQEAgLTY0OCw2ICs2OTcsNyBAQAogCSZzcGl0enNjb29wX2RldmljZSwKIAkmc3BpdHprYmRfZGV2aWNlLAogCSZzcGl0emxlZF9kZXZpY2UsCisJJnNoYXJwc2xfbmFuZF9kZXZpY2UsCiAJJnNoYXJwc2xfcm9tX2RldmljZSwKIH07CiAKQEAgLTY3MSw2ICs3MjEsMTQgQEAKIAlwbV9wb3dlcl9vZmYgPSBzcGl0el9wb3dlcm9mZjsKIAlhcm1fcG1fcmVzdGFydCA9IHNwaXR6X3Jlc3RhcnQ7CiAKKwlpZiAobWFjaGluZV9pc19zcGl0eigpKSB7CisJCXNoYXJwc2xfbmFuZF9wYXJ0aXRpb25zWzFdLnNpemUgPSA1ICogMTAyNCAqIDEwMjQ7CisJfSBlbHNlIGlmIChtYWNoaW5lX2lzX2FraXRhKCkpIHsKKwkJc2hhcnBzbF9uYW5kX3BhcnRpdGlvbnNbMV0uc2l6ZSA9IDU4ICogMTAyNCAqIDEwMjQ7CisJfSBlbHNlIGlmIChtYWNoaW5lX2lzX2JvcnpvaSgpKSB7CisJCXNoYXJwc2xfbmFuZF9wYXJ0aXRpb25zWzFdLnNpemUgPSAzMiAqIDEwMjQgKiAxMDI0OworCX0KKwogCVBNQ1IgPSAweDAwOwogCiAJLyogU3RvcCAzLjZNSHogYW5kIGRyaXZlIEhJR0ggdG8gUENNQ0lBIGFuZCBDUyAqLwpAQCAtNzE1LDEwICs3NzMsMjkgQEAKIAl9LAogfTsKIAorc3RhdGljIHN0cnVjdCBuYW5kX2JidF9kZXNjciBzaGFycHNsX2FraXRhX2JidCA9IHsKKwkub3B0aW9ucyA9IDAsCisJLm9mZnMgPSA0LAorCS5sZW4gPSAxLAorCS5wYXR0ZXJuID0gc2Nhbl9mZl9wYXR0ZXJuCit9OworCitzdGF0aWMgc3RydWN0IG5hbmRfZWNjbGF5b3V0IGFraXRhX29vYmluZm8gPSB7CisJLmVjY2J5dGVzID0gMjQsCisJLmVjY3BvcyA9IHsKKwkJICAgMHg1LCAweDEsIDB4MiwgMHgzLCAweDYsIDB4NywgMHgxNSwgMHgxMSwKKwkJICAgMHgxMiwgMHgxMywgMHgxNiwgMHgxNywgMHgyNSwgMHgyMSwgMHgyMiwgMHgyMywKKwkJICAgMHgyNiwgMHgyNywgMHgzNSwgMHgzMSwgMHgzMiwgMHgzMywgMHgzNiwgMHgzN30sCisJLm9vYmZyZWUgPSB7ezB4MDgsIDB4MDl9fQorfTsKKwogc3RhdGljIHZvaWQgX19pbml0IGFraXRhX2luaXQodm9pZCkKIHsKIAlzcGl0el9maWNwX3BsYXRmb3JtX2RhdGEudHJhbnNjZWl2ZXJfbW9kZSA9IGFraXRhX2lyZGFfdHJhbnNjZWl2ZXJfbW9kZTsKIAorCXNoYXJwc2xfbmFuZF9wbGF0Zm9ybV9kYXRhLmJhZGJsb2NrX3BhdHRlcm4gPSAmc2hhcnBzbF9ha2l0YV9iYnQ7CisJc2hhcnBzbF9uYW5kX3BsYXRmb3JtX2RhdGEuZWNjX2xheW91dCA9ICZha2l0YV9vb2JpbmZvOworCiAJLyogV2UganVzdCBwcmV0ZW5kIHRoZSBzZWNvbmQgZWxlbWVudCBvZiB0aGUgYXJyYXkgZG9lc24ndCBleGlzdCAqLwogCXNwaXR6X3BjbWNpYV9jb25maWcubnVtX2RldnMgPSAxOwogCXBsYXRmb3JtX3Njb29wX2NvbmZpZyA9ICZzcGl0el9wY21jaWFfY29uZmlnOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1yZWFsdmlldy9wbGF0c21wLmMgYi9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L3BsYXRzbXAuYwppbmRleCA4ZmNlODVmLi5lYTNjNzU1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L3BsYXRzbXAuYworKysgYi9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L3BsYXRzbXAuYwpAQCAtMTIsNiArMTIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CiAjaW5jbHVkZSA8bGludXgvc21wLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2luY2x1ZGUvbWFjaC9ncGlvLmggYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvaW5jbHVkZS9tYWNoL2dwaW8uaAppbmRleCBlMDM0OWFmLi4wMDQ3NmE1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvaW5jbHVkZS9tYWNoL2dwaW8uaAorKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvaW5jbHVkZS9tYWNoL2dwaW8uaApAQCAtMTQsNiArMTQsNyBAQAogI2RlZmluZSBncGlvX2dldF92YWx1ZQlfX2dwaW9fZ2V0X3ZhbHVlCiAjZGVmaW5lIGdwaW9fc2V0X3ZhbHVlCV9fZ3Bpb19zZXRfdmFsdWUKICNkZWZpbmUgZ3Bpb19jYW5zbGVlcAlfX2dwaW9fY2Fuc2xlZXAKKyNkZWZpbmUgZ3Bpb190b19pcnEJX19ncGlvX3RvX2lycQogCiAvKiBzb21lIGJvYXJkcyByZXF1aXJlIGV4dHJhIGdwaW8gY2FwYWNpdHkgdG8gc3VwcG9ydCBleHRlcm5hbAogICogZGV2aWNlcyB0aGF0IG5lZWQgR1BJTy4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9pbmNsdWRlL21hY2gvaXJxcy5oIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2luY2x1ZGUvbWFjaC9pcnFzLmgKaW5kZXggOTU2NTkwMy4uNDllZmNlOCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2luY2x1ZGUvbWFjaC9pcnFzLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2luY2x1ZGUvbWFjaC9pcnFzLmgKQEAgLTEyLDEwICsxMiw2IEBACiAjaWZuZGVmIF9fQVNNX0FSQ0hfSVJRU19ICiAjZGVmaW5lIF9fQVNNX0FSQ0hfSVJRU19IIF9fRklMRV9fCiAKLSNpZm5kZWYgX19BU01fQVJNX0lSUV9ICi0jZXJyb3IgIkRvIG5vdCBpbmNsdWRlIHRoaXMgZGlyZWN0bHksIGluc3RlYWQgI2luY2x1ZGUgPGFzbS9pcnEuaD4iCi0jZW5kaWYKLQogLyogd2Uga2VlcCB0aGUgZmlyc3Qgc2V0IG9mIENQVSBJUlFzIG91dCBvZiB0aGUgcmFuZ2Ugb2YKICAqIHRoZSBJU0Egc3BhY2UsIHNvIHRoYXQgdGhlIFBDMTA0IGhhcyB0aGVtIHRvIGl0c2VsZgogICogYW5kIHdlIGRvbid0IGVuZCB1cCBoYXZpbmcgdG8gZG8gaG9ycmlibGUgdGhpbmdzIHRvIHRoZQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDQwL21hY2gtYXQyNDQwZXZiLmMgYi9hcmNoL2FybS9tYWNoLXMzYzI0NDAvbWFjaC1hdDI0NDBldmIuYwppbmRleCAwYTZkMGE1Li4zMTVjNDJlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzI0NDAvbWFjaC1hdDI0NDBldmIuYworKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0NDAvbWFjaC1hdDI0NDBldmIuYwpAQCAtNDcsNyArNDcsNyBAQAogI2luY2x1ZGUgPHBsYXQvY2xvY2suaD4KICNpbmNsdWRlIDxwbGF0L2RldnMuaD4KICNpbmNsdWRlIDxwbGF0L2NwdS5oPgotI2luY2x1ZGUgPGFzbS9wbGF0LXMzYzI0eHgvbWNpLmg+CisjaW5jbHVkZSA8cGxhdC9tY2kuaD4KIAogc3RhdGljIHN0cnVjdCBtYXBfZGVzYyBhdDI0NDBldmJfaW9kZXNjW10gX19pbml0ZGF0YSA9IHsKIAkvKiBOb3RoaW5nIGhlcmUgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjNjQwMC9pbmNsdWRlL21hY2gvaXJxcy5oIGIvYXJjaC9hcm0vbWFjaC1zM2M2NDAwL2luY2x1ZGUvbWFjaC9pcnFzLmgKaW5kZXggYjM4YzQ3Yy4uNGM5N2Y5YSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2M2NDAwL2luY2x1ZGUvbWFjaC9pcnFzLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2M2NDAwL2luY2x1ZGUvbWFjaC9pcnFzLmgKQEAgLTExLDEwICsxMSw2IEBACiAjaWZuZGVmIF9fQVNNX0FSQ0hfSVJRU19ICiAjZGVmaW5lIF9fQVNNX0FSQ0hfSVJRU19IIF9fRklMRV9fCiAKLSNpZm5kZWYgX19BU01fQVJNX0lSUV9ICi0jZXJyb3IgIkRvIG5vdCBpbmNsdWRlIHRoaXMgZGlyZWN0bHksIGluc3RlYWQgI2luY2x1ZGUgPGFzbS9pcnEuaD4iCi0jZW5kaWYKLQogI2luY2x1ZGUgPHBsYXQvaXJxcy5oPgogCiAjZW5kaWYgLyogX19BU01fQVJDSF9JUlFfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC13OTB4OTAwL21hY2gtdzkwcDkxMGV2Yi5jIGIvYXJjaC9hcm0vbWFjaC13OTB4OTAwL21hY2gtdzkwcDkxMGV2Yi5jCmluZGV4IDkzMDdhMjQuLjllYmM5M2YgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtdzkweDkwMC9tYWNoLXc5MHA5MTBldmIuYworKysgYi9hcmNoL2FybS9tYWNoLXc5MHg5MDAvbWFjaC13OTBwOTEwZXZiLmMKQEAgLTI5LDYgKzI5LDcgQEAKICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgogCiAjaW5jbHVkZSA8bWFjaC9yZWdzLXNlcmlhbC5oPgorI2luY2x1ZGUgPG1hY2gvbWFwLmg+CiAKICNpbmNsdWRlICJjcHUuaCIKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC13OTB4OTAwL3RpbWUuYyBiL2FyY2gvYXJtL21hY2gtdzkweDkwMC90aW1lLmMKaW5kZXggM2E2OWUzOC4uYmNjODM4ZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC13OTB4OTAwL3RpbWUuYworKysgYi9hcmNoL2FybS9tYWNoLXc5MHg5MDAvdGltZS5jCkBAIC0yOCw3ICsyOCw2IEBACiAjaW5jbHVkZSA8YXNtL21hY2gvaXJxLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvdGltZS5oPgogCi0jaW5jbHVkZSA8bWFjaC9zeXN0ZW0uaD4KICNpbmNsdWRlIDxtYWNoL21hcC5oPgogI2luY2x1ZGUgPG1hY2gvcmVncy10aW1lci5oPgogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9kbWEtbWFwcGluZy5jIGIvYXJjaC9hcm0vbW0vZG1hLW1hcHBpbmcuYwppbmRleCA2Nzk2MDAxLi4zMTBlNDc5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tbS9kbWEtbWFwcGluZy5jCisrKyBiL2FyY2gvYXJtL21tL2RtYS1tYXBwaW5nLmMKQEAgLTcxLDcgKzcxLDcgQEAKICAqIHRoZSBhbW91bnQgb2YgUkFNIGZvdW5kIGF0IGJvb3QgdGltZS4pICBJIHdvdWxkIGltYWdpbmUgdGhhdCBnZXRfdm1fYXJlYSgpCiAgKiB3b3VsZCBoYXZlIHRvIGluaXRpYWxpc2UgdGhpcyBlYWNoIHRpbWUgcHJpb3IgdG8gY2FsbGluZyB2bV9yZWdpb25fYWxsb2MoKS4KICAqLwotc3RydWN0IHZtX3JlZ2lvbiB7CitzdHJ1Y3QgYXJtX3ZtX3JlZ2lvbiB7CiAJc3RydWN0IGxpc3RfaGVhZAl2bV9saXN0OwogCXVuc2lnbmVkIGxvbmcJCXZtX3N0YXJ0OwogCXVuc2lnbmVkIGxvbmcJCXZtX2VuZDsKQEAgLTc5LDIwICs3OSwyMCBAQAogCWludAkJCXZtX2FjdGl2ZTsKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgdm1fcmVnaW9uIGNvbnNpc3RlbnRfaGVhZCA9IHsKK3N0YXRpYyBzdHJ1Y3QgYXJtX3ZtX3JlZ2lvbiBjb25zaXN0ZW50X2hlYWQgPSB7CiAJLnZtX2xpc3QJPSBMSVNUX0hFQURfSU5JVChjb25zaXN0ZW50X2hlYWQudm1fbGlzdCksCiAJLnZtX3N0YXJ0CT0gQ09OU0lTVEVOVF9CQVNFLAogCS52bV9lbmQJCT0gQ09OU0lTVEVOVF9FTkQsCiB9OwogCi1zdGF0aWMgc3RydWN0IHZtX3JlZ2lvbiAqCi12bV9yZWdpb25fYWxsb2Moc3RydWN0IHZtX3JlZ2lvbiAqaGVhZCwgc2l6ZV90IHNpemUsIGdmcF90IGdmcCkKK3N0YXRpYyBzdHJ1Y3QgYXJtX3ZtX3JlZ2lvbiAqCithcm1fdm1fcmVnaW9uX2FsbG9jKHN0cnVjdCBhcm1fdm1fcmVnaW9uICpoZWFkLCBzaXplX3Qgc2l6ZSwgZ2ZwX3QgZ2ZwKQogewogCXVuc2lnbmVkIGxvbmcgYWRkciA9IGhlYWQtPnZtX3N0YXJ0LCBlbmQgPSBoZWFkLT52bV9lbmQgLSBzaXplOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc3RydWN0IHZtX3JlZ2lvbiAqYywgKm5ldzsKKwlzdHJ1Y3QgYXJtX3ZtX3JlZ2lvbiAqYywgKm5ldzsKIAotCW5ldyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB2bV9yZWdpb24pLCBnZnApOworCW5ldyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBhcm1fdm1fcmVnaW9uKSwgZ2ZwKTsKIAlpZiAoIW5ldykKIAkJZ290byBvdXQ7CiAKQEAgLTEyNyw5ICsxMjcsOSBAQAogCXJldHVybiBOVUxMOwogfQogCi1zdGF0aWMgc3RydWN0IHZtX3JlZ2lvbiAqdm1fcmVnaW9uX2ZpbmQoc3RydWN0IHZtX3JlZ2lvbiAqaGVhZCwgdW5zaWduZWQgbG9uZyBhZGRyKQorc3RhdGljIHN0cnVjdCBhcm1fdm1fcmVnaW9uICphcm1fdm1fcmVnaW9uX2ZpbmQoc3RydWN0IGFybV92bV9yZWdpb24gKmhlYWQsIHVuc2lnbmVkIGxvbmcgYWRkcikKIHsKLQlzdHJ1Y3Qgdm1fcmVnaW9uICpjOworCXN0cnVjdCBhcm1fdm1fcmVnaW9uICpjOwogCQogCWxpc3RfZm9yX2VhY2hfZW50cnkoYywgJmhlYWQtPnZtX2xpc3QsIHZtX2xpc3QpIHsKIAkJaWYgKGMtPnZtX2FjdGl2ZSAmJiBjLT52bV9zdGFydCA9PSBhZGRyKQpAQCAtMTQ5LDcgKzE0OSw3IEBACiAJICAgIHBncHJvdF90IHByb3QpCiB7CiAJc3RydWN0IHBhZ2UgKnBhZ2U7Ci0Jc3RydWN0IHZtX3JlZ2lvbiAqYzsKKwlzdHJ1Y3QgYXJtX3ZtX3JlZ2lvbiAqYzsKIAl1bnNpZ25lZCBsb25nIG9yZGVyOwogCXU2NCBtYXNrID0gSVNBX0RNQV9USFJFU0hPTEQsIGxpbWl0OwogCkBAIC0yMTQsNyArMjE0LDcgQEAKIAkvKgogCSAqIEFsbG9jYXRlIGEgdmlydHVhbCBhZGRyZXNzIGluIHRoZSBjb25zaXN0ZW50IG1hcHBpbmcgcmVnaW9uLgogCSAqLwotCWMgPSB2bV9yZWdpb25fYWxsb2MoJmNvbnNpc3RlbnRfaGVhZCwgc2l6ZSwKKwljID0gYXJtX3ZtX3JlZ2lvbl9hbGxvYygmY29uc2lzdGVudF9oZWFkLCBzaXplLAogCQkJICAgIGdmcCAmIH4oX19HRlBfRE1BIHwgX19HRlBfSElHSE1FTSkpOwogCWlmIChjKSB7CiAJCXB0ZV90ICpwdGU7CkBAIC0zMTEsMTMgKzMxMSwxMyBAQAogCQkgICAgdm9pZCAqY3B1X2FkZHIsIGRtYV9hZGRyX3QgZG1hX2FkZHIsIHNpemVfdCBzaXplKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIHVzZXJfc2l6ZSwga2Vybl9zaXplOwotCXN0cnVjdCB2bV9yZWdpb24gKmM7CisJc3RydWN0IGFybV92bV9yZWdpb24gKmM7CiAJaW50IHJldCA9IC1FTlhJTzsKIAogCXVzZXJfc2l6ZSA9ICh2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQpID4+IFBBR0VfU0hJRlQ7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmY29uc2lzdGVudF9sb2NrLCBmbGFncyk7Ci0JYyA9IHZtX3JlZ2lvbl9maW5kKCZjb25zaXN0ZW50X2hlYWQsICh1bnNpZ25lZCBsb25nKWNwdV9hZGRyKTsKKwljID0gYXJtX3ZtX3JlZ2lvbl9maW5kKCZjb25zaXN0ZW50X2hlYWQsICh1bnNpZ25lZCBsb25nKWNwdV9hZGRyKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjb25zaXN0ZW50X2xvY2ssIGZsYWdzKTsKIAogCWlmIChjKSB7CkBAIC0zNTksNyArMzU5LDcgQEAKICAqLwogdm9pZCBkbWFfZnJlZV9jb2hlcmVudChzdHJ1Y3QgZGV2aWNlICpkZXYsIHNpemVfdCBzaXplLCB2b2lkICpjcHVfYWRkciwgZG1hX2FkZHJfdCBoYW5kbGUpCiB7Ci0Jc3RydWN0IHZtX3JlZ2lvbiAqYzsKKwlzdHJ1Y3QgYXJtX3ZtX3JlZ2lvbiAqYzsKIAl1bnNpZ25lZCBsb25nIGZsYWdzLCBhZGRyOwogCXB0ZV90ICpwdGVwOwogCWludCBpZHg7CkBAIC0zNzgsNyArMzc4LDcgQEAKIAlzaXplID0gUEFHRV9BTElHTihzaXplKTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZjb25zaXN0ZW50X2xvY2ssIGZsYWdzKTsKLQljID0gdm1fcmVnaW9uX2ZpbmQoJmNvbnNpc3RlbnRfaGVhZCwgKHVuc2lnbmVkIGxvbmcpY3B1X2FkZHIpOworCWMgPSBhcm1fdm1fcmVnaW9uX2ZpbmQoJmNvbnNpc3RlbnRfaGVhZCwgKHVuc2lnbmVkIGxvbmcpY3B1X2FkZHIpOwogCWlmICghYykKIAkJZ290byBub19hcmVhOwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9wcm9jLXN5bXMuYyBiL2FyY2gvYXJtL21tL3Byb2Mtc3ltcy5jCmluZGV4IDRhZDNiZjIuLjE5NWU0OGUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21tL3Byb2Mtc3ltcy5jCisrKyBiL2FyY2gvYXJtL21tL3Byb2Mtc3ltcy5jCkBAIC0yNyw2ICsyNyw3IEBACiBFWFBPUlRfU1lNQk9MKF9fY3B1Y19mbHVzaF91c2VyX2FsbCk7CiBFWFBPUlRfU1lNQk9MKF9fY3B1Y19mbHVzaF91c2VyX3JhbmdlKTsKIEVYUE9SVF9TWU1CT0woX19jcHVjX2NvaGVyZW50X2tlcm5fcmFuZ2UpOworRVhQT1JUX1NZTUJPTChkbWFjX2ludl9yYW5nZSk7ICAvKiBiZWNhdXNlIG9mIGZsdXNoX2lvcmVtYXBfcmVnaW9uKCkgKi8KICNlbHNlCiBFWFBPUlRfU1lNQk9MKGNwdV9jYWNoZSk7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC91c2IuaCBiL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC91c2IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZGFjYjMwOAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC91c2IuaApAQCAtMCwwICsxLDIzIEBACisvKgorICoJQ29weXJpZ2h0IChDKSAyMDA4IERhcml1cyBBdWd1bGlzIDxhdWd1bGlzLmRhcml1c0BnbWFpbC5jb20+CisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqCWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKgl0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICoJKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqCWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKglNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKglHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpZm5kZWYgX19BU01fQVJDSF9NWENfVVNCCisjZGVmaW5lIF9fQVNNX0FSQ0hfTVhDX1VTQgorCitzdHJ1Y3QgaW14dXNiX3BsYXRmb3JtX2RhdGEgeworCWludCAoKmluaXQpKHN0cnVjdCBkZXZpY2UgKik7CisJaW50ICgqZXhpdCkoc3RydWN0IGRldmljZSAqKTsKK307CisKKyNlbmRpZiAvKiBfX0FTTV9BUkNIX01YQ19VU0IgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtb21hcC9pMmMuYyBiL2FyY2gvYXJtL3BsYXQtb21hcC9pMmMuYwppbmRleCA4OWE2YWIwLi40Njc1MzFlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW9tYXAvaTJjLmMKKysrIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2kyYy5jCkBAIC0yNiw2ICsyNiw3IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bWFjaC9pcnFzLmg+CiAjaW5jbHVkZSA8bWFjaC9tdXguaD4KIAogI2RlZmluZSBPTUFQX0kyQ19TSVpFCQkweDNmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW9tYXAvdXNiLmMgYi9hcmNoL2FybS9wbGF0LW9tYXAvdXNiLmMKaW5kZXggNjdjYTFlMi4uYWRkMDQ4NSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1vbWFwL3VzYi5jCisrKyBiL2FyY2gvYXJtL3BsYXQtb21hcC91c2IuYwpAQCAtNzcsMzggKzc3LDYgQEAKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAotI2lmCWRlZmluZWQoQ09ORklHX0FSQ0hfT01BUF9PVEcpIHx8IGRlZmluZWQoQ09ORklHX1VTQl9NVVNCX09URykKLQotc3RhdGljIHN0cnVjdCBvdGdfdHJhbnNjZWl2ZXIgKnhjZWl2OwotCi0vKioKLSAqIG90Z19nZXRfdHJhbnNjZWl2ZXIgLSBmaW5kIHRoZSAoc2luZ2xlKSBPVEcgdHJhbnNjZWl2ZXIgZHJpdmVyCi0gKgotICogUmV0dXJucyB0aGUgdHJhbnNjZWl2ZXIgZHJpdmVyLCBhZnRlciBnZXR0aW5nIGEgcmVmY291bnQgdG8gaXQ7IG9yCi0gKiBudWxsIGlmIHRoZXJlIGlzIG5vIHN1Y2ggdHJhbnNjZWl2ZXIuICBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvcgotICogcmVsZWFzaW5nIHRoYXQgY291bnQuCi0gKi8KLXN0cnVjdCBvdGdfdHJhbnNjZWl2ZXIgKm90Z19nZXRfdHJhbnNjZWl2ZXIodm9pZCkKLXsKLQlpZiAoeGNlaXYpCi0JCWdldF9kZXZpY2UoeGNlaXYtPmRldik7Ci0JcmV0dXJuIHhjZWl2OwotfQotRVhQT1JUX1NZTUJPTChvdGdfZ2V0X3RyYW5zY2VpdmVyKTsKLQotaW50IG90Z19zZXRfdHJhbnNjZWl2ZXIoc3RydWN0IG90Z190cmFuc2NlaXZlciAqeCkKLXsKLQlpZiAoeGNlaXYgJiYgeCkKLQkJcmV0dXJuIC1FQlVTWTsKLQl4Y2VpdiA9IHg7Ci0JcmV0dXJuIDA7Ci19Ci1FWFBPUlRfU1lNQk9MKG90Z19zZXRfdHJhbnNjZWl2ZXIpOwotCi0jZW5kaWYKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQogI2lmIGRlZmluZWQoQ09ORklHX0FSQ0hfT01BUF9PVEcpIHx8IGRlZmluZWQoQ09ORklHX0FSQ0hfT01BUDE1WFgpCiAKIHN0YXRpYyB2b2lkIG9tYXAyX3VzYl9kZXZjb25mX2NsZWFyKHU4IHBvcnQsIHUzMiBtYXNrKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zM2MvZGV2LWZiLmMgYi9hcmNoL2FybS9wbGF0LXMzYy9kZXYtZmIuYwppbmRleCAwNDU0YjhlLi5hOTAxOThmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LXMzYy9kZXYtZmIuYworKysgYi9hcmNoL2FybS9wbGF0LXMzYy9kZXYtZmIuYwpAQCAtMTYsNiArMTYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2ZiLmg+CiAKKyNpbmNsdWRlIDxtYWNoL2lycXMuaD4KICNpbmNsdWRlIDxtYWNoL21hcC5oPgogI2luY2x1ZGUgPG1hY2gvcmVncy1mYi5oPgogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXMzYy9kZXYtaTJjMC5jIGIvYXJjaC9hcm0vcGxhdC1zM2MvZGV2LWkyYzAuYwppbmRleCAyYzAxMjhjLi5mZTMyNzA3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LXMzYy9kZXYtaTJjMC5jCisrKyBiL2FyY2gvYXJtL3BsYXQtczNjL2Rldi1pMmMwLmMKQEAgLTE1LDYgKzE1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KIAorI2luY2x1ZGUgPG1hY2gvaXJxcy5oPgogI2luY2x1ZGUgPG1hY2gvbWFwLmg+CiAKICNpbmNsdWRlIDxwbGF0L3JlZ3MtaWljLmg+CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXMzYy9kZXYtaTJjMS5jIGIvYXJjaC9hcm0vcGxhdC1zM2MvZGV2LWkyYzEuYwppbmRleCA5NjU4ZmIwLi4yMzg3ZmJmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LXMzYy9kZXYtaTJjMS5jCisrKyBiL2FyY2gvYXJtL3BsYXQtczNjL2Rldi1pMmMxLmMKQEAgLTE1LDYgKzE1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KIAorI2luY2x1ZGUgPG1hY2gvaXJxcy5oPgogI2luY2x1ZGUgPG1hY2gvbWFwLmg+CiAKICNpbmNsdWRlIDxwbGF0L3JlZ3MtaWljLmg+CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXMzYzI0eHgvZ3Bpb2xpYi5jIGIvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L2dwaW9saWIuYwppbmRleCBmOTVjNmM5Li45NGEzNDFhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LXMzYzI0eHgvZ3Bpb2xpYi5jCisrKyBiL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9ncGlvbGliLmMKQEAgLTU5LDYgKzU5LDIyIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgczNjMjR4eF9ncGlvbGliX2JhbmtmX3RvaXJxKHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCkKK3sKKwlpZiAob2Zmc2V0IDwgNCkKKwkJcmV0dXJuIElSUV9FSU5UMCArIG9mZnNldDsKKwkKKwlpZiAob2Zmc2V0IDwgOCkKKwkJcmV0dXJuIElSUV9FSU5UNCArIG9mZnNldCAtIDQ7CisJCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbnQgczNjMjR4eF9ncGlvbGliX2JhbmtnX3RvaXJxKHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCkKK3sKKwlyZXR1cm4gSVJRX0VJTlQ4ICsgb2Zmc2V0OworfQorCiBzdHJ1Y3QgczNjX2dwaW9fY2hpcCBzM2MyNHh4X2dwaW9zW10gPSB7CiAJWzBdID0gewogCQkuYmFzZQk9IFMzQzI0WFhfR1BJT19CQVNFKFMzQzI0MTBfR1BBMCksCkBAIC0xMTQsNiArMTMwLDcgQEAKIAkJCS5vd25lcgkJCT0gVEhJU19NT0RVTEUsCiAJCQkubGFiZWwJCQk9ICJHUElPRiIsCiAJCQkubmdwaW8JCQk9IDgsCisJCQkudG9faXJxCQkJPSBzM2MyNHh4X2dwaW9saWJfYmFua2ZfdG9pcnEsCiAJCX0sCiAJfSwKIAlbNl0gPSB7CkBAIC0xMjMsNiArMTQwLDcgQEAKIAkJCS5vd25lcgkJCT0gVEhJU19NT0RVTEUsCiAJCQkubGFiZWwJCQk9ICJHUElPRyIsCiAJCQkubmdwaW8JCQk9IDEwLAorCQkJLnRvX2lycQkJCT0gczNjMjR4eF9ncGlvbGliX2JhbmtnX3RvaXJxLAogCQl9LAogCX0sCiB9OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L3B3bS5jIGIvYXJjaC9hcm0vcGxhdC1zM2MyNHh4L3B3bS5jCmluZGV4IGVjNTZiODguLjAxMjBiNzYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtczNjMjR4eC9wd20uYworKysgYi9hcmNoL2FybS9wbGF0LXMzYzI0eHgvcHdtLmMKQEAgLTE5LDYgKzE5LDggQEAKICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L3B3bS5oPgogCisjaW5jbHVkZSA8bWFjaC9pcnFzLmg+CisKICNpbmNsdWRlIDxwbGF0L2RldnMuaD4KICNpbmNsdWRlIDxwbGF0L3JlZ3MtdGltZXIuaD4KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zM2M2NHh4L2luY2x1ZGUvcGxhdC9pcnFzLmggYi9hcmNoL2FybS9wbGF0LXMzYzY0eHgvaW5jbHVkZS9wbGF0L2lycXMuaAppbmRleCAwMmU4ZGQ0Li4yODQ2ZjU1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LXMzYzY0eHgvaW5jbHVkZS9wbGF0L2lycXMuaAorKysgYi9hcmNoL2FybS9wbGF0LXMzYzY0eHgvaW5jbHVkZS9wbGF0L2lycXMuaApAQCAtMTkxLDcgKzE5MSw3IEBACiAjZGVmaW5lIElSUV9FSU5UX0dST1VQOF9CQVNFCShJUlFfRUlOVF9HUk9VUDdfQkFTRSArIElSUV9FSU5UX0dST1VQN19OUikKICNkZWZpbmUgSVJRX0VJTlRfR1JPVVA5X0JBU0UJKElSUV9FSU5UX0dST1VQOF9CQVNFICsgSVJRX0VJTlRfR1JPVVA4X05SKQogCi0jZGVmaW5lIElSUV9FSU5UX0dST1VQKGdyb3VwLCBubykJKElSUV9FSU5UX0dST1VQIyNncm91cCMjX19CQVNFICsgKHgpKQorI2RlZmluZSBJUlFfRUlOVF9HUk9VUChncm91cCwgbm8pCShJUlFfRUlOVF9HUk9VUCMjZ3JvdXAjI19CQVNFICsgKG5vKSkKIAogLyogU2V0IHRoZSBkZWZhdWx0IE5SX0lSUVMgKi8KIApkaWZmIC0tZ2l0IGEvYXJjaC9hdnIzMi9LY29uZmlnIGIvYXJjaC9hdnIzMi9LY29uZmlnCmluZGV4IDI2ZWNhODdmLi5iMTg5NjgwIDEwMDY0NAotLS0gYS9hcmNoL2F2cjMyL0tjb25maWcKKysrIGIvYXJjaC9hdnIzMi9LY29uZmlnCkBAIC0xMjIsNiArMTIyLDI0IEBACiAJYm9vbCAiQVROR1cxMDAgTmV0d29yayBHYXRld2F5IgogCXNlbGVjdCBDUFVfQVQzMkFQNzAwMAogCitjb25maWcgQk9BUkRfSEFNTUVSSEVBRAorCWJvb2wgIkhhbW1lcmhlYWQgYm9hcmQiCisJc2VsZWN0IENQVV9BVDMyQVA3MDAwCisJc2VsZWN0IFVTQl9BUkNIX0hBU19IQ0QKKwloZWxwCisJICBUaGUgSGFtbWVyaGVhZCBwbGF0Zm9ybSBpcyBidWlsdCBhcm91bmQgYSBBVlIzMiAzMi1iaXQgbWljcm9jb250cm9sbGVyIGZyb20gQXRtZWwuCisJICBJdCBvZmZlcnMgdmVyc2F0aWxlIHBlcmlwaGVyYWxzLCBzdWNoIGFzIGV0aGVybmV0LCB1c2IgZGV2aWNlLCB1c2IgaG9zdCBldGMuCisKKwkgIFRoZSBib2FyZCBhbHNvIGluY29vcGVyYXRlcyBhIHBvd2VyIHN1cHBseSBhbmQgaXMgYSBQb3dlciBvdmVyIEV0aGVybmV0IChQb0UpIFBvd2VyZWQKKwkgIERldmljZSAoUEQpLgorCisJICBBZGRpdG9uYWxseSwgYSBDeWNsb25lIElJSSBGUEdBIGZyb20gQWx0ZXJhIGlzIGludGVncmF0ZWQgb24gdGhlIGJvYXJkLiBUaGUgRlBHQSBpcworCSAgbWFwcGVkIGludG8gdGhlIDMyLWJpdCBBVlIgbWVtb3J5IGJ1cy4gVGhlIEZQR0Egb2ZmZXJzIHR3byBERFIyIFNEUkFNIGludGVyZmFjZXMsIHdoaWNoCisJICB3aWxsIGNvdmVyIGV2ZW4gdGhlIG1vc3QgZXhjZXB0aW9uYWwgbmVlZCBvZiBtZW1vcnkgYmFuZHdpZHRoLiBUb2dldGhlciB3aXRoIHRoZSBvbmJvYXJkCisJICB2aWRlbyBkZWNvZGVyIHRoZSBib2FyZCBpcyByZWFkeSBmb3IgdmlkZW8gcHJvY2Vzc2luZy4KKworCSAgRm9yIG1vcmUgaW5mb3JtYXRpb24gc2VlOiBodHRwOi8vd3d3Lm1pcm9taWNvLmNvbS9oYW1tZXJoZWFkCisKIGNvbmZpZyBCT0FSRF9GQVZSXzMyCiAJYm9vbCAiRmF2ci0zMiBMQ0QtYm9hcmQiCiAJc2VsZWN0IENQVV9BVDMyQVA3MDAwCkBAIC0xMzMsNiArMTUxLDcgQEAKIAogc291cmNlICJhcmNoL2F2cjMyL2JvYXJkcy9hdHN0azEwMDAvS2NvbmZpZyIKIHNvdXJjZSAiYXJjaC9hdnIzMi9ib2FyZHMvYXRuZ3cxMDAvS2NvbmZpZyIKK3NvdXJjZSAiYXJjaC9hdnIzMi9ib2FyZHMvaGFtbWVyaGVhZC9LY29uZmlnIgogc291cmNlICJhcmNoL2F2cjMyL2JvYXJkcy9mYXZyLTMyL0tjb25maWciCiAKIGNob2ljZQpkaWZmIC0tZ2l0IGEvYXJjaC9hdnIzMi9NYWtlZmlsZSBiL2FyY2gvYXZyMzIvTWFrZWZpbGUKaW5kZXggYjA4OGUxMC4uZjNlZjNiYiAxMDA2NDQKLS0tIGEvYXJjaC9hdnIzMi9NYWtlZmlsZQorKysgYi9hcmNoL2F2cjMyL01ha2VmaWxlCkBAIC0zMyw2ICszMyw3IEBACiBjb3JlLXkJCQkJCSs9ICQobWFjaGRpcnMpCiBjb3JlLSQoQ09ORklHX0JPQVJEX0FUU1RLMTAwMCkJCSs9IGFyY2gvYXZyMzIvYm9hcmRzL2F0c3RrMTAwMC8KIGNvcmUtJChDT05GSUdfQk9BUkRfQVROR1cxMDApCQkrPSBhcmNoL2F2cjMyL2JvYXJkcy9hdG5ndzEwMC8KK2NvcmUtJChDT05GSUdfQk9BUkRfSEFNTUVSSEVBRCkJCSs9IGFyY2gvYXZyMzIvYm9hcmRzL2hhbW1lcmhlYWQvCiBjb3JlLSQoQ09ORklHX0JPQVJEX0ZBVlJfMzIpCQkrPSBhcmNoL2F2cjMyL2JvYXJkcy9mYXZyLTMyLwogY29yZS0kKENPTkZJR19CT0FSRF9NSU1DMjAwKQkJKz0gYXJjaC9hdnIzMi9ib2FyZHMvbWltYzIwMC8KIGNvcmUtJChDT05GSUdfTE9BREVSX1VfQk9PVCkJCSs9IGFyY2gvYXZyMzIvYm9vdC91LWJvb3QvCmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL2JvYXJkcy9hdG5ndzEwMC9zZXR1cC5jIGIvYXJjaC9hdnIzMi9ib2FyZHMvYXRuZ3cxMDAvc2V0dXAuYwppbmRleCAzMmZiOWJhLi4wNWQzNzIyIDEwMDY0NAotLS0gYS9hcmNoL2F2cjMyL2JvYXJkcy9hdG5ndzEwMC9zZXR1cC5jCisrKyBiL2FyY2gvYXZyMzIvYm9hcmRzL2F0bmd3MTAwL3NldHVwLmMKQEAgLTE5LDggKzE5LDggQEAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2xlZHMuaD4KICNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CisjaW5jbHVkZSA8bGludXgvYXRtZWwtbWNpLmg+CiAKLSNpbmNsdWRlIDxhc20vYXRtZWwtbWNpLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL3NldHVwLmg+CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXZyMzIvYm9hcmRzL2F0c3RrMTAwMC9hdHN0azEwMDIuYyBiL2FyY2gvYXZyMzIvYm9hcmRzL2F0c3RrMTAwMC9hdHN0azEwMDIuYwppbmRleCA1YzVjZGYzLi4xZjMzYTEwIDEwMDY0NAotLS0gYS9hcmNoL2F2cjMyL2JvYXJkcy9hdHN0azEwMDAvYXRzdGsxMDAyLmMKKysrIGIvYXJjaC9hdnIzMi9ib2FyZHMvYXRzdGsxMDAwL2F0c3RrMTAwMi5jCkBAIC0xNiwxMiArMTYsMTIgQEAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KICNpbmNsdWRlIDxsaW51eC9zcGkvYXQ3M2MyMTMuaD4KKyNpbmNsdWRlIDxsaW51eC9hdG1lbC1tY2kuaD4KIAogI2luY2x1ZGUgPHZpZGVvL2F0bWVsX2xjZGMuaD4KIAogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgotI2luY2x1ZGUgPGFzbS9hdG1lbC1tY2kuaD4KIAogI2luY2x1ZGUgPG1hY2gvYXQzMmFwNzAweC5oPgogI2luY2x1ZGUgPG1hY2gvYm9hcmQuaD4KQEAgLTI4NywyMyArMjg3LDcgQEAKIAkgKiBBVFNUSzEwMDAgdXNlcyAzMi1iaXQgU0RSQU0gaW50ZXJmYWNlLiBSZXNlcnZlIHRoZQogCSAqIFNEUkFNLXNwZWNpZmljIHBpbnMgc28gdGhhdCBub2JvZHkgbWVzc2VzIHdpdGggdGhlbS4KIAkgKi8KLQlhdDMyX3Jlc2VydmVfcGluKEdQSU9fUElOX1BFKDApKTsJLyogREFUQVsxNl0JKi8KLQlhdDMyX3Jlc2VydmVfcGluKEdQSU9fUElOX1BFKDEpKTsJLyogREFUQVsxN10JKi8KLQlhdDMyX3Jlc2VydmVfcGluKEdQSU9fUElOX1BFKDIpKTsJLyogREFUQVsxOF0JKi8KLQlhdDMyX3Jlc2VydmVfcGluKEdQSU9fUElOX1BFKDMpKTsJLyogREFUQVsxOV0JKi8KLQlhdDMyX3Jlc2VydmVfcGluKEdQSU9fUElOX1BFKDQpKTsJLyogREFUQVsyMF0JKi8KLQlhdDMyX3Jlc2VydmVfcGluKEdQSU9fUElOX1BFKDUpKTsJLyogREFUQVsyMV0JKi8KLQlhdDMyX3Jlc2VydmVfcGluKEdQSU9fUElOX1BFKDYpKTsJLyogREFUQVsyMl0JKi8KLQlhdDMyX3Jlc2VydmVfcGluKEdQSU9fUElOX1BFKDcpKTsJLyogREFUQVsyM10JKi8KLQlhdDMyX3Jlc2VydmVfcGluKEdQSU9fUElOX1BFKDgpKTsJLyogREFUQVsyNF0JKi8KLQlhdDMyX3Jlc2VydmVfcGluKEdQSU9fUElOX1BFKDkpKTsJLyogREFUQVsyNV0JKi8KLQlhdDMyX3Jlc2VydmVfcGluKEdQSU9fUElOX1BFKDEwKSk7CS8qIERBVEFbMjZdCSovCi0JYXQzMl9yZXNlcnZlX3BpbihHUElPX1BJTl9QRSgxMSkpOwkvKiBEQVRBWzI3XQkqLwotCWF0MzJfcmVzZXJ2ZV9waW4oR1BJT19QSU5fUEUoMTIpKTsJLyogREFUQVsyOF0JKi8KLQlhdDMyX3Jlc2VydmVfcGluKEdQSU9fUElOX1BFKDEzKSk7CS8qIERBVEFbMjldCSovCi0JYXQzMl9yZXNlcnZlX3BpbihHUElPX1BJTl9QRSgxNCkpOwkvKiBEQVRBWzMwXQkqLwotCWF0MzJfcmVzZXJ2ZV9waW4oR1BJT19QSU5fUEUoMTUpKTsJLyogREFUQVszMV0JKi8KLQlhdDMyX3Jlc2VydmVfcGluKEdQSU9fUElOX1BFKDI2KSk7CS8qIFNEQ1MJCSovCisJYXQzMl9yZXNlcnZlX3BpbihHUElPX1BJT0VfQkFTRSwgQVRNRUxfRUJJX1BFX0RBVEFfQUxMKTsKIAogI2lmZGVmIENPTkZJR19CT0FSRF9BVFNUSzEwMDYKIAlzbWNfc2V0X3RpbWluZygmbmFuZF9jb25maWcsICZuYW5kX3RpbWluZyk7CmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL2JvYXJkcy9hdHN0azEwMDAvYXRzdGsxMDAzLmMgYi9hcmNoL2F2cjMyL2JvYXJkcy9hdHN0azEwMDAvYXRzdGsxMDAzLmMKaW5kZXggMTM0YjU2Ni4uYjNhMjNjOCAxMDA2NDQKLS0tIGEvYXJjaC9hdnIzMi9ib2FyZHMvYXRzdGsxMDAwL2F0c3RrMTAwMy5jCisrKyBiL2FyY2gvYXZyMzIvYm9hcmRzL2F0c3RrMTAwMC9hdHN0azEwMDMuYwpAQCAtMTcsOSArMTcsOSBAQAogCiAjaW5jbHVkZSA8bGludXgvc3BpL2F0NzNjMjEzLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorI2luY2x1ZGUgPGxpbnV4L2F0bWVsLW1jaS5oPgogCiAjaW5jbHVkZSA8YXNtL3NldHVwLmg+Ci0jaW5jbHVkZSA8YXNtL2F0bWVsLW1jaS5oPgogCiAjaW5jbHVkZSA8bWFjaC9hdDMyYXA3MDB4Lmg+CiAjaW5jbHVkZSA8bWFjaC9ib2FyZC5oPgpAQCAtMTMxLDIzICsxMzEsNyBAQAogCSAqIEFUU1RLMTAwMCB1c2VzIDMyLWJpdCBTRFJBTSBpbnRlcmZhY2UuIFJlc2VydmUgdGhlCiAJICogU0RSQU0tc3BlY2lmaWMgcGlucyBzbyB0aGF0IG5vYm9keSBtZXNzZXMgd2l0aCB0aGVtLgogCSAqLwotCWF0MzJfcmVzZXJ2ZV9waW4oR1BJT19QSU5fUEUoMCkpOwkvKiBEQVRBWzE2XQkqLwotCWF0MzJfcmVzZXJ2ZV9waW4oR1BJT19QSU5fUEUoMSkpOwkvKiBEQVRBWzE3XQkqLwotCWF0MzJfcmVzZXJ2ZV9waW4oR1BJT19QSU5fUEUoMikpOwkvKiBEQVRBWzE4XQkqLwotCWF0MzJfcmVzZXJ2ZV9waW4oR1BJT19QSU5fUEUoMykpOwkvKiBEQVRBWzE5XQkqLwotCWF0MzJfcmVzZXJ2ZV9waW4oR1BJT19QSU5fUEUoNCkpOwkvKiBEQVRBWzIwXQkqLwotCWF0MzJfcmVzZXJ2ZV9waW4oR1BJT19QSU5fUEUoNSkpOwkvKiBEQVRBWzIxXQkqLwotCWF0MzJfcmVzZXJ2ZV9waW4oR1BJT19QSU5fUEUoNikpOwkvKiBEQVRBWzIyXQkqLwotCWF0MzJfcmVzZXJ2ZV9waW4oR1BJT19QSU5fUEUoNykpOwkvKiBEQVRBWzIzXQkqLwotCWF0MzJfcmVzZXJ2ZV9waW4oR1BJT19QSU5fUEUoOCkpOwkvKiBEQVRBWzI0XQkqLwotCWF0MzJfcmVzZXJ2ZV9waW4oR1BJT19QSU5fUEUoOSkpOwkvKiBEQVRBWzI1XQkqLwotCWF0MzJfcmVzZXJ2ZV9waW4oR1BJT19QSU5fUEUoMTApKTsJLyogREFUQVsyNl0JKi8KLQlhdDMyX3Jlc2VydmVfcGluKEdQSU9fUElOX1BFKDExKSk7CS8qIERBVEFbMjddCSovCi0JYXQzMl9yZXNlcnZlX3BpbihHUElPX1BJTl9QRSgxMikpOwkvKiBEQVRBWzI4XQkqLwotCWF0MzJfcmVzZXJ2ZV9waW4oR1BJT19QSU5fUEUoMTMpKTsJLyogREFUQVsyOV0JKi8KLQlhdDMyX3Jlc2VydmVfcGluKEdQSU9fUElOX1BFKDE0KSk7CS8qIERBVEFbMzBdCSovCi0JYXQzMl9yZXNlcnZlX3BpbihHUElPX1BJTl9QRSgxNSkpOwkvKiBEQVRBWzMxXQkqLwotCWF0MzJfcmVzZXJ2ZV9waW4oR1BJT19QSU5fUEUoMjYpKTsJLyogU0RDUwkJKi8KKwlhdDMyX3Jlc2VydmVfcGluKEdQSU9fUElPRV9CQVNFLCBBVE1FTF9FQklfUEVfREFUQV9BTEwpOwogCiAjaWZkZWYJQ09ORklHX0JPQVJEX0FUU1RLMTAwWF9TVzJfQ1VTVE9NCiAJYXQzMl9hZGRfZGV2aWNlX3VzYXJ0KDEpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hdnIzMi9ib2FyZHMvYXRzdGsxMDAwL2F0c3RrMTAwNC5jIGIvYXJjaC9hdnIzMi9ib2FyZHMvYXRzdGsxMDAwL2F0c3RrMTAwNC5jCmluZGV4IGNiMzJlYjguLjI5YjM1YWMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXZyMzIvYm9hcmRzL2F0c3RrMTAwMC9hdHN0azEwMDQuYworKysgYi9hcmNoL2F2cjMyL2JvYXJkcy9hdHN0azEwMDAvYXRzdGsxMDA0LmMKQEAgLTE3LDExICsxNywxMSBAQAogCiAjaW5jbHVkZSA8bGludXgvc3BpL2F0NzNjMjEzLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorI2luY2x1ZGUgPGxpbnV4L2F0bWVsLW1jaS5oPgogCiAjaW5jbHVkZSA8dmlkZW8vYXRtZWxfbGNkYy5oPgogCiAjaW5jbHVkZSA8YXNtL3NldHVwLmg+Ci0jaW5jbHVkZSA8YXNtL2F0bWVsLW1jaS5oPgogCiAjaW5jbHVkZSA8bWFjaC9hdDMyYXA3MDB4Lmg+CiAjaW5jbHVkZSA8bWFjaC9ib2FyZC5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9hdnIzMi9ib2FyZHMvZmF2ci0zMi9zZXR1cC5jIGIvYXJjaC9hdnIzMi9ib2FyZHMvZmF2ci0zMi9zZXR1cC5jCmluZGV4IDFlZTRmYWYuLjc0NWM0MDggMTAwNjQ0Ci0tLSBhL2FyY2gvYXZyMzIvYm9hcmRzL2ZhdnItMzIvc2V0dXAuYworKysgYi9hcmNoL2F2cjMyL2JvYXJkcy9mYXZyLTMyL3NldHVwLmMKQEAgLTE3LDYgKzE3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CiAjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L2xlZHMuaD4KKyNpbmNsdWRlIDxsaW51eC9hdG1lbC1tY2kuaD4KICNpbmNsdWRlIDxsaW51eC9hdG1lbC1wd20tYmwuaD4KICNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpL2Fkczc4NDYuaD4KQEAgLTc5LDYgKzgwLDE0IEBACiAJfSwKIH07CiAKK3N0YXRpYyBzdHJ1Y3QgbWNpX3BsYXRmb3JtX2RhdGEgX19pbml0ZGF0YSBtY2kwX2RhdGEgPSB7CisJLnNsb3RbMF0gPSB7CisJCS5idXNfd2lkdGgJPSA0LAorCQkuZGV0ZWN0X3Bpbgk9IC1FTk9ERVYsCisJCS53cF9waW4JCT0gLUVOT0RFViwKKwl9LAorfTsKKwogc3RhdGljIHN0cnVjdCBmYl92aWRlb21vZGUgX19pbml0ZGF0YSBsYjEwNHYwM19tb2Rlc1tdID0gewogCXsKIAkJLm5hbWUJCT0gIjY0MHg0ODAgQCA1MCIsCkBAIC0zMDcsMjggKzMxNiwxMCBAQAogCSAqIEZhdnItMzIgdXNlcyAzMi1iaXQgU0RSQU0gaW50ZXJmYWNlLiBSZXNlcnZlIHRoZSBTRFJBTS1zcGVjaWZpYwogCSAqIHBpbnMgc28gdGhhdCBub2JvZHkgbWVzc2VzIHdpdGggdGhlbS4KIAkgKi8KLQlhdDMyX3Jlc2VydmVfcGluKEdQSU9fUElOX1BFKDApKTsJLyogREFUQVsxNl0JKi8KLQlhdDMyX3Jlc2VydmVfcGluKEdQSU9fUElOX1BFKDEpKTsJLyogREFUQVsxN10JKi8KLQlhdDMyX3Jlc2VydmVfcGluKEdQSU9fUElOX1BFKDIpKTsJLyogREFUQVsxOF0JKi8KLQlhdDMyX3Jlc2VydmVfcGluKEdQSU9fUElOX1BFKDMpKTsJLyogREFUQVsxOV0JKi8KLQlhdDMyX3Jlc2VydmVfcGluKEdQSU9fUElOX1BFKDQpKTsJLyogREFUQVsyMF0JKi8KLQlhdDMyX3Jlc2VydmVfcGluKEdQSU9fUElOX1BFKDUpKTsJLyogREFUQVsyMV0JKi8KLQlhdDMyX3Jlc2VydmVfcGluKEdQSU9fUElOX1BFKDYpKTsJLyogREFUQVsyMl0JKi8KLQlhdDMyX3Jlc2VydmVfcGluKEdQSU9fUElOX1BFKDcpKTsJLyogREFUQVsyM10JKi8KLQlhdDMyX3Jlc2VydmVfcGluKEdQSU9fUElOX1BFKDgpKTsJLyogREFUQVsyNF0JKi8KLQlhdDMyX3Jlc2VydmVfcGluKEdQSU9fUElOX1BFKDkpKTsJLyogREFUQVsyNV0JKi8KLQlhdDMyX3Jlc2VydmVfcGluKEdQSU9fUElOX1BFKDEwKSk7CS8qIERBVEFbMjZdCSovCi0JYXQzMl9yZXNlcnZlX3BpbihHUElPX1BJTl9QRSgxMSkpOwkvKiBEQVRBWzI3XQkqLwotCWF0MzJfcmVzZXJ2ZV9waW4oR1BJT19QSU5fUEUoMTIpKTsJLyogREFUQVsyOF0JKi8KLQlhdDMyX3Jlc2VydmVfcGluKEdQSU9fUElOX1BFKDEzKSk7CS8qIERBVEFbMjldCSovCi0JYXQzMl9yZXNlcnZlX3BpbihHUElPX1BJTl9QRSgxNCkpOwkvKiBEQVRBWzMwXQkqLwotCWF0MzJfcmVzZXJ2ZV9waW4oR1BJT19QSU5fUEUoMTUpKTsJLyogREFUQVszMV0JKi8KLQlhdDMyX3Jlc2VydmVfcGluKEdQSU9fUElOX1BFKDI2KSk7CS8qIFNEQ1MJCSovCisJYXQzMl9yZXNlcnZlX3BpbihHUElPX1BJT0VfQkFTRSwgQVRNRUxfRUJJX1BFX0RBVEFfQUxMKTsKIAogCWF0MzJfc2VsZWN0X2dwaW8oR1BJT19QSU5fUEIoMyksIDApOwkvKiBJUlEgZnJvbSBBRFM3ODQzICovCiAKLQlhdDMyX2FkZF9zeXN0ZW1fZGV2aWNlcygpOwotCiAJYXQzMl9hZGRfZGV2aWNlX3VzYXJ0KDApOwogCiAJc2V0X2h3X2FkZHIoYXQzMl9hZGRfZGV2aWNlX2V0aCgwLCAmZXRoX2RhdGFbMF0pKTsKQEAgLTMzOSw3ICszMzAsNyBAQAogCiAJYXQzMl9hZGRfZGV2aWNlX3B3bSgxIDw8IGF0bWVsX3B3bV9ibF9wZGF0YS5wd21fY2hhbm5lbCk7CiAJYXQzMl9hZGRfZGV2aWNlX3NwaSgxLCBzcGkxX2JvYXJkX2luZm8sIEFSUkFZX1NJWkUoc3BpMV9ib2FyZF9pbmZvKSk7Ci0JYXQzMl9hZGRfZGV2aWNlX21jaSgwLCBOVUxMKTsKKwlhdDMyX2FkZF9kZXZpY2VfbWNpKDAsICZtY2kwX2RhdGEpOwogCWF0MzJfYWRkX2RldmljZV91c2JhKDAsIE5VTEwpOwogCWF0MzJfYWRkX2RldmljZV9sY2RjKDAsICZmYXZyMzJfbGNkY19kYXRhLCBmYm1lbV9zdGFydCwgZmJtZW1fc2l6ZSwgMCk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXZyMzIvYm9hcmRzL2hhbW1lcmhlYWQvS2NvbmZpZyBiL2FyY2gvYXZyMzIvYm9hcmRzL2hhbW1lcmhlYWQvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZGEyMzMxCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hdnIzMi9ib2FyZHMvaGFtbWVyaGVhZC9LY29uZmlnCkBAIC0wLDAgKzEsNDMgQEAKKyMgSGFtbWVyaGVhZCBjdXN0b21pemF0aW9uCisKK2lmIEJPQVJEX0hBTU1FUkhFQUQKKworY29uZmlnIEJPQVJEX0hBTU1FUkhFQURfVVNCCisJYm9vbCAiUGhpbGlwcyBJU1AxMTZ4LWhjZCBVU0Igc3VwcG9ydCIKKwloZWxwCisJICBUaGlzIGVuYWJsZXMgVVNCIHN1cHBvcnQgZm9yIEhhbW1lcmhlYWRzIGludGVybmFsIElTUDExNngKKwkgIGNvbnRyb2xsZXIgZnJvbSBQaGlsaXBzLgorCisJICBDaG9vc2UgJ1knIGhlcmUgaWYgeW91IHdhbnQgdG8gaGF2ZSB5b3VyIGJvYXJkIFVTQiBkcml2ZW4uCisKK2NvbmZpZyBCT0FSRF9IQU1NRVJIRUFEX0xDRAorCWJvb2wgIkF0bWVsIEFUOTEvQVQzMiBMQ0Qgc3VwcG9ydCIKKwloZWxwCisJICBUaGlzIGVuYWJsZXMgTENEIHN1cHBvcnQgZm9yIHRoZSBIYW1tZXJoZWFkIGJvYXJkLiBZb3UgbWF5CisJICBhbHNvIGFkZCBzdXBwb3J0IGZvciBmcmFtZWJ1ZmZlciBkZXZpY2VzIChBVDkxL0FUMzIgTENEIENvbnRyb2xsZXIpCisJICBhbmQgZnJhbWVidWZmZXIgY29uc29sZSBzdXBwb3J0IHRvIGdldCB0aGUgbW9zdCBvdXQgb2YgeW91ciBMQ0QuCisKKwkgIENob29zZSAnWScgaGVyZSBpZiB5b3UgaGF2ZSBvcmRlcmVkIGEgQ29yb25hIGRhdWd0aGVyIGJvYXJkIGFuZAorCSAgd2FudCB0byBoYXZlIHN1cHBvcnQgZm9yIHlvdXIgSGFudHJvbml4IEhEQS0zNTFULUxWIExDRC4KKworY29uZmlnIEJPQVJEX0hBTU1FUkhFQURfU05ECisJYm9vbCAiQXRtZWwgQUM5NyBTb3VuZCBzdXBwb3J0IgorCWhlbHAKKwkgIFRoaXMgZW5hYmxlcyBTb3VuZCBzdXBwb3J0IGZvciB0aGUgSGFtbWVyaGVhZCBib2FyZC4gWW91IG1heQorCSAgYWxzbyBnbyB0cm91Z2ggdGhlIEFMU0Egc2V0dGluZ3MgdG8gZ2V0IGl0IHdvcmtpbmcuCisKKwkgIENob29zZSAnWScgaGVyZSBpZiB5b3UgaGF2ZSBvcmRlcmVkIGEgQ29yb25hIGRhdWd0aGVyIGJvYXJkIGFuZAorCSAgd2FudCB0byBtYWtlIHlvdXIgYm9hcmQgZnVua3kuCisKK2NvbmZpZyBCT0FSRF9IQU1NRVJIRUFEX0ZQR0EKKwlib29sICJIYW1tZXJoZWFkIEZQR0EgU3VwcG9ydCIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBUaGlzIGFkZHMgc3VwcG9ydCBmb3IgdGhlIEN5Y2xvbmUgSUlJIEZQR0EgZnJvbSBBbHRlcmEKKwkgIGZvdW5kIG9uIE1pcm9taWNvJ3MgSGFtbWVyaGVhZCBib2FyZC4KKworCSAgQ2hvb3NlICdZJyBoZXJlIGlmIHlvdSB3YW50IHRvIGhhdmUgRlBHQSBzdXBwb3J0IGVuYWJsZWQuCisJICBZb3Ugd2lsbCBoYXZlIHRvIGNob29zZSB0aGUgIkhhbW1lcmhlYWQgRlBHQSBEZXZpY2UgU3VwcG9ydCIgaW4KKwkgIERldmljZSBEcml2ZXJzLT5NaXNjIHRvIGJlIGFibGUgdG8gdXNlIEZQR0EgZnVuY3Rpb25hbGl0eS4KKworZW5kaWYJIyBCT0FSRF9BVE5HVzEwMApkaWZmIC0tZ2l0IGEvYXJjaC9hdnIzMi9ib2FyZHMvaGFtbWVyaGVhZC9NYWtlZmlsZSBiL2FyY2gvYXZyMzIvYm9hcmRzL2hhbW1lcmhlYWQvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzc0MGFhMQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXZyMzIvYm9hcmRzL2hhbW1lcmhlYWQvTWFrZWZpbGUKQEAgLTAsMCArMSBAQAorb2JqLXkJCQkJKz0gc2V0dXAubyBmbGFzaC5vCmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL2JvYXJkcy9oYW1tZXJoZWFkL2ZsYXNoLmMgYi9hcmNoL2F2cjMyL2JvYXJkcy9oYW1tZXJoZWFkL2ZsYXNoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTk4YzZkZAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXZyMzIvYm9hcmRzL2hhbW1lcmhlYWQvZmxhc2guYwpAQCAtMCwwICsxLDM3NyBAQAorLyoKKyAqIEhhbW1lcmhlYWQgYm9hcmQtc3BlY2lmaWMgZmxhc2ggaW5pdGlhbGl6YXRpb24KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggTWlyb21pY28gQUcKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbXRkL210ZC5oPgorI2luY2x1ZGUgPGxpbnV4L210ZC9wYXJ0aXRpb25zLmg+CisjaW5jbHVkZSA8bGludXgvbXRkL3BoeXNtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC91c2IvaXNwMTE2eC5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKworI2luY2x1ZGUgPG1hY2gvcG9ydG11eC5oPgorI2luY2x1ZGUgPG1hY2gvYXQzMmFwNzAweC5oPgorI2luY2x1ZGUgPG1hY2gvc21jLmg+CisKKyNpbmNsdWRlICIuLi8uLi9tYWNoLWF0MzJhcC9jbG9jay5oIgorI2luY2x1ZGUgImZsYXNoLmgiCisKKworI2RlZmluZSBIQU1NRVJIRUFEX1VTQl9QRVJJUEhfR0NMSzAJMHg0MDAwMDAwMAorI2RlZmluZSBIQU1NRVJIRUFEX1VTQl9QRVJJUEhfQ1MyCTB4MDIwMDAwMDAKKyNkZWZpbmUgSEFNTUVSSEVBRF9VU0JfUEVSSVBIX0VYVElOVDAJMHgwMjAwMDAwMAorCisjZGVmaW5lIEhBTU1FUkhFQURfRlBHQV9QRVJJUEhfTU9TSQkweDAwMDAwMDAyCisjZGVmaW5lIEhBTU1FUkhFQURfRlBHQV9QRVJJUEhfU0NLCTB4MDAwMDAwMjAKKyNkZWZpbmUgSEFNTUVSSEVBRF9GUEdBX1BFUklQSF9FWFRJTlQzCTB4MTAwMDAwMDAKKworc3RhdGljIHN0cnVjdCBzbWNfdGltaW5nIGZsYXNoX3RpbWluZyBfX2luaXRkYXRhID0geworCS5uY3NfcmVhZF9zZXR1cAkJPSAwLAorCS5ucmRfc2V0dXAJCT0gNDAsCisJLm5jc193cml0ZV9zZXR1cAk9IDAsCisJLm53ZV9zZXR1cAkJPSAxMCwKKworCS5uY3NfcmVhZF9wdWxzZQkJPSA4MCwKKwkubnJkX3B1bHNlCQk9IDQwLAorCS5uY3Nfd3JpdGVfcHVsc2UJPSA2NSwKKwkubndlX3B1bHNlCQk9IDU1LAorCisJLnJlYWRfY3ljbGUJCT0gMTIwLAorCS53cml0ZV9jeWNsZQkJPSAxMjAsCit9OworCitzdGF0aWMgc3RydWN0IHNtY19jb25maWcgZmxhc2hfY29uZmlnIF9faW5pdGRhdGEgPSB7CisJLmJ1c193aWR0aAkJPSAyLAorCS5ucmRfY29udHJvbGxlZAkJPSAxLAorCS5ud2VfY29udHJvbGxlZAkJPSAxLAorCS5ieXRlX3dyaXRlCQk9IDEsCit9OworCitzdGF0aWMgc3RydWN0IG10ZF9wYXJ0aXRpb24gZmxhc2hfcGFydHNbXSA9IHsKKwl7CisJCS5uYW1lCQk9ICJ1LWJvb3QiLAorCQkub2Zmc2V0CQk9IDB4MDAwMDAwMDAsCisJCS5zaXplCQk9IDB4MDAwMjAwMDAsICAgICAgICAgICAvKiAxMjggS2lCICovCisJCS5tYXNrX2ZsYWdzCT0gTVREX1dSSVRFQUJMRSwKKwl9LAorCXsKKwkJLm5hbWUJCT0gInJvb3QiLAorCQkub2Zmc2V0CQk9IDB4MDAwMjAwMDAsCisJCS5zaXplCQk9IDB4MDA3ZDAwMDAsCisJfSwKKwl7CisJCS5uYW1lCQk9ICJlbnYiLAorCQkub2Zmc2V0CQk9IDB4MDA3ZjAwMDAsCisJCS5zaXplCQk9IDB4MDAwMTAwMDAsCisJCS5tYXNrX2ZsYWdzCT0gTVREX1dSSVRFQUJMRSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwaHlzbWFwX2ZsYXNoX2RhdGEgZmxhc2hfZGF0YSA9IHsKKwkud2lkdGgJCT0gMiwKKwkubnJfcGFydHMJPSBBUlJBWV9TSVpFKGZsYXNoX3BhcnRzKSwKKwkucGFydHMJCT0gZmxhc2hfcGFydHMsCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGZsYXNoX3Jlc291cmNlID0geworCS5zdGFydAkJPSAweDAwMDAwMDAwLAorCS5lbmQJCT0gMHgwMDdmZmZmZiwKKwkuZmxhZ3MJCT0gSU9SRVNPVVJDRV9NRU0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBmbGFzaF9kZXZpY2UgPSB7CisJLm5hbWUJCT0gInBoeXNtYXAtZmxhc2giLAorCS5pZAkJPSAwLAorCS5yZXNvdXJjZQk9ICZmbGFzaF9yZXNvdXJjZSwKKwkubnVtX3Jlc291cmNlcwk9IDEsCisJLmRldgkJPSB7IC5wbGF0Zm9ybV9kYXRhID0gJmZsYXNoX2RhdGEsIH0sCit9OworCisjaWZkZWYgQ09ORklHX0JPQVJEX0hBTU1FUkhFQURfVVNCCisKK3N0YXRpYyBzdHJ1Y3Qgc21jX3RpbWluZyBpc3AxMTYwX3RpbWluZyBfX2luaXRkYXRhID0geworCS5uY3NfcmVhZF9zZXR1cAkJPSA3NSwKKwkubnJkX3NldHVwCQk9IDc1LAorCS5uY3Nfd3JpdGVfc2V0dXAJPSA3NSwKKwkubndlX3NldHVwCQk9IDc1LAorCisKKwkvKiBXZSB1c2UgY29uc2VydmF0aXZlIHRpbWluZyBzZXR0aW5ncywgYXMgdGhlIG1pbmltYWwgc2V0dGluZ3MgYXJlbid0CisJICAgc3RhYmxlLiBUaGVyZSBtYXkgYmUgcm9vbSBmb3IgdHdlYWtpbmcuICovCisJLm5jc19yZWFkX3B1bHNlCQk9IDc1LCAgLyogbWluLiAzM25zICovCisJLm5yZF9wdWxzZQkJPSA3NSwgIC8qIG1pbi4gMzNucyAqLworCS5uY3Nfd3JpdGVfcHVsc2UJPSA3NSwgIC8qIG1pbi4gMjZucyAqLworCS5ud2VfcHVsc2UJCT0gNzUsICAvKiBtaW4uIDI2bnMgKi8KKworCS5yZWFkX2N5Y2xlCQk9IDIyNSwgLyogbWluLiAxNDNucyAqLworCS53cml0ZV9jeWNsZQkJPSAyMjUsIC8qIG1pbi4gMTM2bnMgKi8KK307CisKK3N0YXRpYyBzdHJ1Y3Qgc21jX2NvbmZpZyBpc3AxMTYwX2NvbmZpZyBfX2luaXRkYXRhID0geworCS5idXNfd2lkdGgJCT0gMiwKKwkubnJkX2NvbnRyb2xsZWQJCT0gMSwKKwkubndlX2NvbnRyb2xsZWQJCT0gMSwKKwkuYnl0ZV93cml0ZQkJPSAwLAorfTsKKworLyoKKyAqIFRoZSBwbGF0Zm9ybSBkZWxheSBmdW5jdGlvbiBpcyBvbmx5IHVzZWQgdG8gZW5mb3JjZSB0aGUgc3RyYW5nZQorICogcmVhZCB0byB3cml0ZSBkZWxheS4gVGhpcyBjYW4gbm90IGJlIGNvbmZpZ3VyZWQgaW4gdGhlIFNNQy4gQWxsIG90aGVyCisgKiB0aW1pbmdzIGFyZSBjb250cm9sbGVkIGJ5IHRoZSBTTUMgKHNlZSB0aW1pbmdzIG9ib3ZlKQorICogU28gaW4gaXNwMTE2eC1oY2QuYyB3ZSBzaG91bGQgY29tbWVudCBvdXQgVVNFX1BMQVRGT1JNX0RFTEFZCisgKi8KK3ZvaWQgaXNwMTE2eF9kZWxheShzdHJ1Y3QgZGV2aWNlICpkZXYsIGludCBkZWxheSkKK3sKKwlpZiAoZGVsYXkgPiAxNTApCisJCW5kZWxheShkZWxheSAtIDE1MCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgIGlzcDExNnhfcGxhdGZvcm1fZGF0YSBpc3AxMTYwX2RhdGEgPSB7CisJLnNlbDE1S3JlcwkJPSAxLAkvKiB1c2UgaW50ZXJuYWwgZG93bnN0cmVhbSByZXNpc3RvcnMgKi8KKwkub2NfZW5hYmxlCQk9IDAsCS8qIGV4dGVybmFsIG92ZXJjdXJyZW50IGRldGVjdGlvbiAqLworCS5pbnRfZWRnZV90cmlnZ2VyZWQJPSAwLAkvKiBpbnRlcnJ1cHQgaXMgbGV2ZWwgdHJpZ2dlcmVkICovCisJLmludF9hY3RfaGlnaAkJPSAwLAkvKiBpbnRlcnJ1cHQgaXMgYWN0aXZlIGxvdyAqLworCS5kZWxheSA9IGlzcDExNnhfZGVsYXksCQkvKiBwbGF0Zm9ybSBkZWxheSBmdW5jdGlvbiAqLworfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBpc3AxMTYwX3Jlc291cmNlW10gPSB7CisJeworCQkuc3RhcnQJCT0gMHgwODAwMDAwMCwKKwkJLmVuZAkJPSAweDA4MDAwMDAxLAorCQkuZmxhZ3MJCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwl7CisJCS5zdGFydAkJPSAweDA4MDAwMDAyLAorCQkuZW5kCQk9IDB4MDgwMDAwMDMsCisJCS5mbGFncwkJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCXsKKwkJLnN0YXJ0CQk9IDY0LAorCQkuZmxhZ3MJCT0gSU9SRVNPVVJDRV9JUlEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGlzcDExNjBfZGV2aWNlID0geworCS5uYW1lCQk9ICJpc3AxMTZ4LWhjZCIsCisJLmlkCQk9IDAsCisJLnJlc291cmNlCT0gaXNwMTE2MF9yZXNvdXJjZSwKKwkubnVtX3Jlc291cmNlcwk9IDMsCisJLmRldgkJPSB7CisJCS5wbGF0Zm9ybV9kYXRhID0gJmlzcDExNjBfZGF0YSwKKwl9LAorfTsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0JPQVJEX0hBTU1FUkhFQURfVVNCCitzdGF0aWMgaW50IF9faW5pdCBoYW1tZXJoZWFkX3VzYmhfaW5pdCh2b2lkKQoreworCXN0cnVjdCBjbGsgKmdjbGs7CisJc3RydWN0IGNsayAqb3NjOworCisJaW50IHJldDsKKworCS8qIHNldHVwIHNtYyBmb3IgdXNiaCAqLworCXNtY19zZXRfdGltaW5nKCZpc3AxMTYwX2NvbmZpZywgJmlzcDExNjBfdGltaW5nKTsKKwlyZXQgPSBzbWNfc2V0X2NvbmZpZ3VyYXRpb24oMiwgJmlzcDExNjBfY29uZmlnKTsKKworCWlmIChyZXQgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUgorCQkgICAgICAgImhhbW1lcmhlYWQ6IGZhaWxlZCB0byBzZXQgSVNQMTE2MCBVU0JIIHRpbWluZ1xuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJLyogc2V0dXAgZ2NsazAgdG8gcnVuIGZyb20gb3NjMSAqLworCWdjbGsgPSBjbGtfZ2V0KE5VTEwsICJnY2xrMCIpOworCWlmIChJU19FUlIoZ2NsaykpCisJCWdvdG8gZXJyX2djbGs7CisKKwlvc2MgPSBjbGtfZ2V0KE5VTEwsICJvc2MxIik7CisJaWYgKElTX0VSUihvc2MpKQorCQlnb3RvIGVycl9vc2M7CisKKwlpZiAoY2xrX3NldF9wYXJlbnQoZ2Nsaywgb3NjKSkgeworCQlwcl9kZWJ1ZygiaGFtbWVyaGVhZDogZmFpbGVkIHRvIHNldCBvc2MxIGZvciBVU0JIIGNsb2NrXG4iKTsKKwkJZ290byBlcnJfc2V0X2NsazsKKwl9CisKKwkvKiBzZXQgY2xvY2sgdG8gNk1IeiAqLworCWNsa19zZXRfcmF0ZShnY2xrLCA2MDAwMDAwKTsKKworCS8qIGFuZCBlbmFibGUgKi8KKwljbGtfZW5hYmxlKGdjbGspOworCisJLyogc2VsZWN0IEdDTEswIHBlcmlwaGVyYWwgZnVuY3Rpb24gKi8KKwlhdDMyX3NlbGVjdF9wZXJpcGgoR1BJT19QSU9BX0JBU0UsIEhBTU1FUkhFQURfVVNCX1BFUklQSF9HQ0xLMCwKKwkJCSAgIEdQSU9fUEVSSVBIX0EsIDApOworCisJLyogZW5hYmxlIENTMiBwZXJpcGhlcmFsIGZ1bmN0aW9uICovCisJYXQzMl9zZWxlY3RfcGVyaXBoKEdQSU9fUElPRV9CQVNFLCBIQU1NRVJIRUFEX1VTQl9QRVJJUEhfQ1MyLAorCQkJICAgR1BJT19QRVJJUEhfQSwgMCk7CisKKwkvKiBIX1dBS0VVUCBtdXN0IGJlIGRyaXZlbiBsb3cgKi8KKwlhdDMyX3NlbGVjdF9ncGlvKEdQSU9fUElOX1BBKDgpLCBBVDMyX0dQSU9GX09VVFBVVCk7CisKKwkvKiBTZWxlY3QgRVhUSU5UMCBmb3IgUEIyNSAqLworCWF0MzJfc2VsZWN0X3BlcmlwaChHUElPX1BJT0JfQkFTRSwgSEFNTUVSSEVBRF9VU0JfUEVSSVBIX0VYVElOVDAsCisJCQkgICBHUElPX1BFUklQSF9BLCAwKTsKKworCS8qIHJlZ2lzdGVyIHVzYmggZGV2aWNlIGRyaXZlciAqLworCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmaXNwMTE2MF9kZXZpY2UpOworCisgZXJyX3NldF9jbGs6CisJY2xrX3B1dChvc2MpOworIGVycl9vc2M6CisJY2xrX3B1dChnY2xrKTsKKyBlcnJfZ2NsazoKKwlyZXR1cm4gcmV0OworfQorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfQk9BUkRfSEFNTUVSSEVBRF9GUEdBCitzdGF0aWMgc3RydWN0IHNtY190aW1pbmcgZnBnYV90aW1pbmcgX19pbml0ZGF0YSA9IHsKKwkubmNzX3JlYWRfc2V0dXAJCT0gMTYsCisJLm5yZF9zZXR1cAkJPSAzMiwKKwkubmNzX3JlYWRfcHVsc2UJCT0gNDgsCisJLm5yZF9wdWxzZQkJPSAzMiwKKwkucmVhZF9jeWNsZQkJPSA2NCwKKworCS5uY3Nfd3JpdGVfc2V0dXAJPSAxNiwKKwkubndlX3NldHVwCQk9IDE2LAorCS5uY3Nfd3JpdGVfcHVsc2UJPSAzMiwKKwkubndlX3B1bHNlCQk9IDMyLAorCS53cml0ZV9jeWNsZQkJPSA2NCwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc21jX2NvbmZpZyBmcGdhX2NvbmZpZyBfX2luaXRkYXRhID0geworCS5idXNfd2lkdGgJCT0gNCwKKwkubnJkX2NvbnRyb2xsZWQJCT0gMSwKKwkubndlX2NvbnRyb2xsZWQJCT0gMSwKKwkuYnl0ZV93cml0ZQkJPSAwLAorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBoaF9mcGdhMF9yZXNvdXJjZVtdID0geworCXsKKwkJLnN0YXJ0CQk9IDB4ZmZlMDA0MDAsCisJCS5lbmQJCT0gMHhmZmUwMDQwMCArIDB4M2ZmLAorCQkuZmxhZ3MJCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwl7CisJCS5zdGFydAkJPSA0LAorCQkuZW5kCQk9IDQsCisJCS5mbGFncwkJPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorCXsKKwkJLnN0YXJ0CQk9IDB4MGMwMDAwMDAsCisJCS5lbmQJCT0gMHgwYzAwMDEwMCwKKwkJLmZsYWdzCQk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJeworCQkuc3RhcnQJCT0gNjcsCisJCS5lbmQJCT0gNjcsCisJCS5mbGFncwkJPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorfTsKKworc3RhdGljIHU2NCBoaF9mcGdhMF9kbWFfbWFzayA9IERNQV8zMkJJVF9NQVNLOworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgaGhfZnBnYTBfZGV2aWNlID0geworCS5uYW1lCQk9ICJoaF9mcGdhIiwKKwkuaWQJCT0gMCwKKwkuZGV2CQk9IHsKKwkJLmRtYV9tYXNrID0gJmhoX2ZwZ2EwX2RtYV9tYXNrLAorCQkuY29oZXJlbnRfZG1hX21hc2sgPSBETUFfMzJCSVRfTUFTSywKKwl9LAorCS5yZXNvdXJjZQk9IGhoX2ZwZ2EwX3Jlc291cmNlLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShoaF9mcGdhMF9yZXNvdXJjZSksCit9OworCitzdGF0aWMgc3RydWN0IGNsayBoaF9mcGdhMF9zcGlfY2xrID0geworCS5uYW1lCQk9ICJzcGlfY2xrIiwKKwkuZGV2CQk9ICZoaF9mcGdhMF9kZXZpY2UuZGV2LAorCS5tb2RlCQk9IHBiYV9jbGtfbW9kZSwKKwkuZ2V0X3JhdGUJPSBwYmFfY2xrX2dldF9yYXRlLAorCS5pbmRleAkJPSAxLAorfTsKKworc3RydWN0IHBsYXRmb3JtX2RldmljZSAqX19pbml0IGF0MzJfYWRkX2RldmljZV9oaF9mcGdhKHZvaWQpCit7CisJLyogU2VsZWN0IHBlcmlwaGVyYWwgZnVuY3Rpb25hbGxpdHkgZm9yIFNQSSBTQ0sgYW5kIE1PU0kgKi8KKwlhdDMyX3NlbGVjdF9wZXJpcGgoR1BJT19QSU9CX0JBU0UsIEhBTU1FUkhFQURfRlBHQV9QRVJJUEhfU0NLLAorCQkJICAgR1BJT19QRVJJUEhfQiwgMCk7CisJYXQzMl9zZWxlY3RfcGVyaXBoKEdQSU9fUElPQl9CQVNFLCBIQU1NRVJIRUFEX0ZQR0FfUEVSSVBIX01PU0ksCisJCQkgICBHUElPX1BFUklQSF9CLCAwKTsKKworCS8qIHJlc2VydmUgYWxsIG90aGVyIG5lZWRlZCBncGlvCisJICogV2UgaGF2ZSBvbiBib2FyZCBwdWxsIHVwcywgc28gdGhlcmUgaXMgbm8gbmVlZAorCSAqIHRvIGVuYWJsZSBncGlvIHB1bGwgdXBzICovCisJLyogSU5JVF9ET05FIChpbnB1dCkgKi8KKwlhdDMyX3NlbGVjdF9ncGlvKEdQSU9fUElOX1BCKDApLCAwKTsKKworCS8qIG5TVEFUVVMgKGlucHV0KSAqLworCWF0MzJfc2VsZWN0X2dwaW8oR1BJT19QSU5fUEIoMiksIDApOworCisJLyogbkNPTkZJRyAob3V0cHV0LCBsb3cpICovCisJYXQzMl9zZWxlY3RfZ3BpbyhHUElPX1BJTl9QQigzKSwgQVQzMl9HUElPRl9PVVRQVVQpOworCisJLyogQ09ORl9ET05FIChpbnB1dCkgKi8KKwlhdDMyX3NlbGVjdF9ncGlvKEdQSU9fUElOX1BCKDQpLCAwKTsKKworCS8qIFNlbGVjdCBFWFRJTlQzIGZvciBQQjI4IChJbnRlcnJ1cHQgZnJvbSBGUEdBKSAqLworCWF0MzJfc2VsZWN0X3BlcmlwaChHUElPX1BJT0JfQkFTRSwgSEFNTUVSSEVBRF9GUEdBX1BFUklQSF9FWFRJTlQzLAorCQkJICAgR1BJT19QRVJJUEhfQSwgMCk7CisKKwkvKiBHZXQgb3VyIHBhcmVudCBjbG9jayAqLworCWhoX2ZwZ2EwX3NwaV9jbGsucGFyZW50ID0gY2xrX2dldChOVUxMLCAicGJhIik7CisJY2xrX3B1dChoaF9mcGdhMF9zcGlfY2xrLnBhcmVudCk7CisKKwkvKiBSZWdpc3RlciBjbG9jayBpbiBhdDMyIGNsb2NrIHRyZWUgKi8KKwlhdDMyX2Nsa19yZWdpc3RlcigmaGhfZnBnYTBfc3BpX2Nsayk7CisKKwlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJmhoX2ZwZ2EwX2RldmljZSk7CisJcmV0dXJuICZoaF9mcGdhMF9kZXZpY2U7Cit9CisjZW5kaWYKKworLyogVGhpcyBuZWVkcyB0byBiZSBjYWxsZWQgYWZ0ZXIgdGhlIFNNQyBoYXMgYmVlbiBpbml0aWFsaXplZCAqLworc3RhdGljIGludCBfX2luaXQgaGFtbWVyaGVhZF9mbGFzaF9pbml0KHZvaWQpCit7CisJaW50IHJldDsKKworCXNtY19zZXRfdGltaW5nKCZmbGFzaF9jb25maWcsICZmbGFzaF90aW1pbmcpOworCXJldCA9IHNtY19zZXRfY29uZmlndXJhdGlvbigwLCAmZmxhc2hfY29uZmlnKTsKKworCWlmIChyZXQgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiaGFtbWVyaGVhZDogZmFpbGVkIHRvIHNldCBOT1IgZmxhc2ggdGltaW5nXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJmZsYXNoX2RldmljZSk7CisKKyNpZmRlZiBDT05GSUdfQk9BUkRfSEFNTUVSSEVBRF9VU0IKKwloYW1tZXJoZWFkX3VzYmhfaW5pdCgpOworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfQk9BUkRfSEFNTUVSSEVBRF9GUEdBCisJLyogU2V0dXAgU01DIGZvciBGUEdBIGludGVyZmFjZSAqLworCXNtY19zZXRfdGltaW5nKCZmcGdhX2NvbmZpZywgJmZwZ2FfdGltaW5nKTsKKwlyZXQgPSBzbWNfc2V0X2NvbmZpZ3VyYXRpb24oMywgJmZwZ2FfY29uZmlnKTsKKyNlbmRpZgorCisKKwlpZiAocmV0IDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgImhhbW1lcmhlYWQ6IGZhaWxlZCB0byBzZXQgRlBHQSB0aW1pbmdcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiAwOworfQorCitkZXZpY2VfaW5pdGNhbGwoaGFtbWVyaGVhZF9mbGFzaF9pbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvYXZyMzIvYm9hcmRzL2hhbW1lcmhlYWQvZmxhc2guaCBiL2FyY2gvYXZyMzIvYm9hcmRzL2hhbW1lcmhlYWQvZmxhc2guaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTcwYzYyCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hdnIzMi9ib2FyZHMvaGFtbWVyaGVhZC9mbGFzaC5oCkBAIC0wLDAgKzEsNiBAQAorI2lmbmRlZiBfX0JPQVJEU19IQU1NRVJIRUFEX0ZMQVNIX0gKKyNkZWZpbmUgX19CT0FSRFNfSEFNTUVSSEVBRF9GTEFTSF9ICisKK3N0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmF0MzJfYWRkX2RldmljZV9oaF9mcGdhKHZvaWQpOworCisjZW5kaWYgLyogX19CT0FSRFNfSEFNTUVSSEVBRF9GTEFTSF9IICovCmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL2JvYXJkcy9oYW1tZXJoZWFkL3NldHVwLmMgYi9hcmNoL2F2cjMyL2JvYXJkcy9oYW1tZXJoZWFkL3NldHVwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQyZmU4MgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXZyMzIvYm9hcmRzL2hhbW1lcmhlYWQvc2V0dXAuYwpAQCAtMCwwICsxLDI0NSBAQAorLyoKKyAqIEJvYXJkLXNwZWNpZmljIHNldHVwIGNvZGUgZm9yIHRoZSBNaXJvbWljbyBIYW1tZXJoZWFkIGJvYXJkCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA4IE1pcm9taWNvIEFHCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2F0bWVsLW1jaS5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L2ZiLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMtZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CisKKyNpbmNsdWRlIDx2aWRlby9hdG1lbF9sY2RjLmg+CisKKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgorCisjaW5jbHVkZSA8bWFjaC9hdDMyYXA3MDB4Lmg+CisjaW5jbHVkZSA8bWFjaC9ib2FyZC5oPgorI2luY2x1ZGUgPG1hY2gvaW5pdC5oPgorI2luY2x1ZGUgPG1hY2gvcG9ydG11eC5oPgorCisjaW5jbHVkZSAiLi4vLi4vbWFjaC1hdDMyYXAvY2xvY2suaCIKKyNpbmNsdWRlICJmbGFzaC5oIgorCisvKiBPc2NpbGxhdG9yIGZyZXF1ZW5jaWVzLiBUaGVzZSBhcmUgYm9hcmQtc3BlY2lmaWMgKi8KK3Vuc2lnbmVkIGxvbmcgYXQzMl9ib2FyZF9vc2NfcmF0ZXNbM10gPSB7CisJWzBdID0gMzI3NjgsCS8qIDMyLjc2OCBrSHogb24gUlRDIG9zYyAqLworCVsxXSA9IDI1MDAwMDAwLCAvKiAyNU1IeiBvbiBvc2MwICovCisJWzJdID0gMTIwMDAwMDAsCS8qIDEyIE1IeiBvbiBvc2MxICovCit9OworCisvKiBJbml0aWFsaXplZCBieSBib290bG9hZGVyLXNwZWNpZmljIHN0YXJ0dXAgY29kZS4gKi8KK3N0cnVjdCB0YWcgKmJvb3Rsb2FkZXJfdGFncyBfX2luaXRkYXRhOworCisjaWZkZWYgQ09ORklHX0JPQVJEX0hBTU1FUkhFQURfTENECitzdGF0aWMgc3RydWN0IGZiX3ZpZGVvbW9kZSBfX2luaXRkYXRhIGhkYTM1MHRsdl9tb2Rlc1tdID0geworCXsKKwkJLm5hbWUJCT0gIjMyMHgyNDAgQCA3NSIsCisJCS5yZWZyZXNoCT0gNzUsCisJCS54cmVzCQk9IDMyMCwKKwkJLnlyZXMJCT0gMjQwLAorCQkucGl4Y2xvY2sJPSBLSFoyUElDT1MoNjg5MSksCisKKwkJLmxlZnRfbWFyZ2luCT0gNDgsCisJCS5yaWdodF9tYXJnaW4JPSAxOCwKKwkJLnVwcGVyX21hcmdpbgk9IDE4LAorCQkubG93ZXJfbWFyZ2luCT0gNCwKKwkJLmhzeW5jX2xlbgk9IDIwLAorCQkudnN5bmNfbGVuCT0gMiwKKworCQkuc3luYwkJPSAwLAorCQkudm1vZGUJCT0gRkJfVk1PREVfTk9OSU5URVJMQUNFRCwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBmYl9tb25zcGVjcyBfX2luaXRkYXRhIGhhbW1lcmhlYWRfaGRhMzUwdF9tb25zcGVjcyA9IHsKKwkubWFudWZhY3R1cmVyCQk9ICJIQU4iLAorCS5tb25pdG9yCQk9ICJIREEzNTBULUxWIiwKKwkubW9kZWRiCQkJPSBoZGEzNTB0bHZfbW9kZXMsCisJLm1vZGVkYl9sZW4JCT0gQVJSQVlfU0laRShoZGEzNTB0bHZfbW9kZXMpLAorCS5oZm1pbgkJCT0gMTQ5MDAsCisJLmhmbWF4CQkJPSAyMjM1MCwKKwkudmZtaW4JCQk9IDYwLAorCS52Zm1heAkJCT0gOTAsCisJLmRjbGttYXgJCT0gMTAwMDAwMDAsCit9OworCitzdHJ1Y3QgYXRtZWxfbGNkZmJfaW5mbyBfX2luaXRkYXRhIGhhbW1lcmhlYWRfbGNkY19kYXRhID0geworCS5kZWZhdWx0X2JwcAkJPSAyNCwKKwkuZGVmYXVsdF9kbWFjb24JCT0gQVRNRUxfTENEQ19ETUFFTiB8IEFUTUVMX0xDRENfRE1BMkRFTiwKKwkuZGVmYXVsdF9sY2Rjb24yCT0gKEFUTUVMX0xDRENfRElTVFlQRV9URlQKKwkJCQkgICB8IEFUTUVMX0xDRENfSU5WQ0xLCisJCQkJICAgfCBBVE1FTF9MQ0RDX0NMS01PRF9BTFdBWVNBQ1RJVkUKKwkJCQkgICB8IEFUTUVMX0xDRENfTUVNT1JfQklHKSwKKwkuZGVmYXVsdF9tb25zcGVjcwk9ICZoYW1tZXJoZWFkX2hkYTM1MHRfbW9uc3BlY3MsCisJLmd1YXJkX3RpbWUJCT0gMiwKK307CisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBtY2lfcGxhdGZvcm1fZGF0YSBfX2luaXRkYXRhIG1jaTBfZGF0YSA9IHsKKwkuc2xvdFswXSA9IHsKKwkJLmJ1c193aWR0aAk9IDQsCisJCS5kZXRlY3RfcGluCT0gLUVOT0RFViwKKwkJLndwX3BpbgkJPSAtRU5PREVWLAorCX0sCit9OworCitzdHJ1Y3QgZXRoX2FkZHIgeworCXU4IGFkZHJbNl07Cit9OworCitzdGF0aWMgc3RydWN0IGV0aF9hZGRyIF9faW5pdGRhdGEgaHdfYWRkclsxXTsKK3N0YXRpYyBzdHJ1Y3QgZXRoX3BsYXRmb3JtX2RhdGEgX19pbml0ZGF0YSBldGhfZGF0YVsxXTsKKworLyoKKyAqIFRoZSBuZXh0IHR3byBmdW5jdGlvbnMgc2hvdWxkIGdvIGF3YXkgYXMgdGhlIGJvb3QgbG9hZGVyIGlzCisgKiBzdXBwb3NlZCB0byBpbml0aWFsaXplIHRoZSBtYWNiIGFkZHJlc3MgcmVnaXN0ZXJzIHdpdGggYSB2YWxpZAorICogZXRoZXJuZXQgYWRkcmVzcy4gQnV0IHdlIG5lZWQgdG8ga2VlcCBpdCBhcm91bmQgZm9yIGEgd2hpbGUgdW50aWwKKyAqIHdlIGNhbiBiZSByZWFzb25hYmx5IHN1cmUgdGhlIGJvb3QgbG9hZGVyIGRvZXMgdGhpcy4KKyAqCisgKiBUaGUgcGh5X2lkIGlzIGlnbm9yZWQgYXMgdGhlIGRyaXZlciB3aWxsIHByb2JlIGZvciBpdC4KKyAqLworc3RhdGljIGludCBfX2luaXQgcGFyc2VfdGFnX2V0aGVybmV0KHN0cnVjdCB0YWcgKnRhZykKK3sKKwlpbnQgaSA9IHRhZy0+dS5ldGhlcm5ldC5tYWNfaW5kZXg7CisKKwlpZiAoaSA8IEFSUkFZX1NJWkUoaHdfYWRkcikpCisJCW1lbWNweShod19hZGRyW2ldLmFkZHIsIHRhZy0+dS5ldGhlcm5ldC5od19hZGRyZXNzLAorCQkgICAgICAgc2l6ZW9mKGh3X2FkZHJbaV0uYWRkcikpOworCisJcmV0dXJuIDA7Cit9CitfX3RhZ3RhYmxlKEFUQUdfRVRIRVJORVQsIHBhcnNlX3RhZ19ldGhlcm5ldCk7CisKK3N0YXRpYyB2b2lkIF9faW5pdCBzZXRfaHdfYWRkcihzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCByZXNvdXJjZSAqcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwljb25zdCB1OCAqYWRkcjsKKwl2b2lkIF9faW9tZW0gKnJlZ3M7CisJc3RydWN0IGNsayAqcGNsazsKKworCWlmICghcmVzKQorCQlyZXR1cm47CisKKwlpZiAocGRldi0+aWQgPj0gQVJSQVlfU0laRShod19hZGRyKSkKKwkJcmV0dXJuOworCisJYWRkciA9IGh3X2FkZHJbcGRldi0+aWRdLmFkZHI7CisKKwlpZiAoIWlzX3ZhbGlkX2V0aGVyX2FkZHIoYWRkcikpCisJCXJldHVybjsKKworCS8qCisJICogU2luY2UgdGhpcyBpcyBib2FyZC1zcGVjaWZpYyBjb2RlLCB3ZSdsbCBjaGVhdCBhbmQgdXNlIHRoZQorCSAqIHBoeXNpY2FsIGFkZHJlc3MgZGlyZWN0bHkgYXMgd2UgaGFwcGVuIHRvIGtub3cgdGhhdCBpdCdzCisJICogdGhlIHNhbWUgYXMgdGhlIHZpcnR1YWwgYWRkcmVzcy4KKwkgKi8KKwlyZWdzID0gKHZvaWQgX19pb21lbSBfX2ZvcmNlICopcmVzLT5zdGFydDsKKwlwY2xrID0gY2xrX2dldCgmcGRldi0+ZGV2LCAicGNsayIpOworCisJaWYgKCFwY2xrKQorCQlyZXR1cm47CisKKwljbGtfZW5hYmxlKHBjbGspOworCisJX19yYXdfd3JpdGVsKChhZGRyWzNdIDw8IDI0KSB8IChhZGRyWzJdIDw8IDE2KSB8IChhZGRyWzFdIDw8IDgpIHwKKwkJICAgICBhZGRyWzBdLCByZWdzICsgMHg5OCk7CisJX19yYXdfd3JpdGVsKChhZGRyWzVdIDw8IDgpIHwgYWRkcls0XSwgcmVncyArIDB4OWMpOworCisJY2xrX2Rpc2FibGUocGNsayk7CisJY2xrX3B1dChwY2xrKTsKK30KKwordm9pZCBfX2luaXQgc2V0dXBfYm9hcmQodm9pZCkKK3sKKwlhdDMyX21hcF91c2FydCgxLCAwKTsJLyogVVNBUlQgMTogL2Rldi90dHlTMCwgREI5ICovCisJYXQzMl9zZXR1cF9zZXJpYWxfY29uc29sZSgwKTsKK30KKworc3RhdGljIHN0cnVjdCBpMmNfZ3Bpb19wbGF0Zm9ybV9kYXRhIGkyY19ncGlvX2RhdGEgPSB7CisJLnNkYV9waW4JCT0gR1BJT19QSU5fUEEoNiksCisJLnNjbF9waW4JCT0gR1BJT19QSU5fUEEoNyksCisJLnNkYV9pc19vcGVuX2RyYWluCT0gMSwKKwkuc2NsX2lzX29wZW5fZHJhaW4JPSAxLAorCS51ZGVsYXkJCQk9IDIsCS8qIGNsb3NlIHRvIDEwMCBrSHogKi8KK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGkyY19ncGlvX2RldmljZSA9IHsKKwkubmFtZQkJPSAiaTJjLWdwaW8iLAorCS5pZAkJPSAwLAorCS5kZXYJCT0geyAucGxhdGZvcm1fZGF0YSA9ICZpMmNfZ3Bpb19kYXRhLCB9LAorfTsKKworc3RhdGljIHN0cnVjdCBpMmNfYm9hcmRfaW5mbyBfX2luaXRkYXRhIGkyY19pbmZvW10gPSB7fTsKKworI2lmZGVmIENPTkZJR19CT0FSRF9IQU1NRVJIRUFEX1NORAorc3RhdGljIHN0cnVjdCBhYzk3Y19wbGF0Zm9ybV9kYXRhIGFjOTdjX2RhdGEgPSB7CisJLnJlc2V0X3BpbiA9IEdQSU9fUElOX1BBKDE2KSwKK307CisjZW5kaWYKKworc3RhdGljIGludCBfX2luaXQgaGFtbWVyaGVhZF9pbml0KHZvaWQpCit7CisJLyoKKwkgKiBIYW1tZXJoZWFkIHVzZXMgMzItYml0IFNEUkFNIGludGVyZmFjZS4gUmVzZXJ2ZSB0aGUKKwkgKiBTRFJBTS1zcGVjaWZpYyBwaW5zIHNvIHRoYXQgbm9ib2R5IG1lc3NlcyB3aXRoIHRoZW0uCisJICovCisJYXQzMl9yZXNlcnZlX3BpbihHUElPX1BJT0VfQkFTRSwgQVRNRUxfRUJJX1BFX0RBVEFfQUxMKTsKKworCWF0MzJfYWRkX2RldmljZV91c2FydCgwKTsKKworCS8qIFJlc2VydmUgUEIyOSAoR0NMSzMpLiBUaGlzIHBpbiBpcyB1c2VkIGFzIGNsb2NrIHNvdXJjZQorCSAqIGZvciBFVEggUEhZICgyNU1IeikuIEdDTEszIHNldHVwIGlzIGRvbmUgYnkgVS1Cb290LgorCSAqLworCWF0MzJfcmVzZXJ2ZV9waW4oR1BJT19QSU9CX0JBU0UsICgxPDwyOSkpOworCisJLyoKKwkgKiBIYW1tZXJoZWFkIHVzZXMgb25seSBvbmUgZXRoZXJuZXQgcG9ydCwgc28gd2UgZG9uJ3Qgc2V0CisJICogYWRkcmVzcyBvZiBzZWNvbmQgcG9ydAorCSAqLworCXNldF9od19hZGRyKGF0MzJfYWRkX2RldmljZV9ldGgoMCwgJmV0aF9kYXRhWzBdKSk7CisKKyNpZmRlZiBDT05GSUdfQk9BUkRfSEFNTUVSSEVBRF9GUEdBCisJYXQzMl9hZGRfZGV2aWNlX2hoX2ZwZ2EoKTsKKyNlbmRpZgorCWF0MzJfYWRkX2RldmljZV9tY2koMCwgJm1jaTBfZGF0YSk7CisKKyNpZmRlZiBDT05GSUdfQk9BUkRfSEFNTUVSSEVBRF9VU0IKKwlhdDMyX2FkZF9kZXZpY2VfdXNiYSgwLCBOVUxMKTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19CT0FSRF9IQU1NRVJIRUFEX0xDRAorCWF0MzJfYWRkX2RldmljZV9sY2RjKDAsICZoYW1tZXJoZWFkX2xjZGNfZGF0YSwgZmJtZW1fc3RhcnQsCisJCQkgICAgIGZibWVtX3NpemUsIEFUTUVMX0xDRENfUFJJXzI0QklUKTsKKyNlbmRpZgorCisJYXQzMl9zZWxlY3RfZ3BpbyhpMmNfZ3Bpb19kYXRhLnNkYV9waW4sCisJCQkgQVQzMl9HUElPRl9NVUxUSURSViB8IEFUMzJfR1BJT0ZfT1VUUFVUIHwKKwkJCSBBVDMyX0dQSU9GX0hJR0gpOworCWF0MzJfc2VsZWN0X2dwaW8oaTJjX2dwaW9fZGF0YS5zY2xfcGluLAorCQkJIEFUMzJfR1BJT0ZfTVVMVElEUlYgfCBBVDMyX0dQSU9GX09VVFBVVCB8CisJCQkgQVQzMl9HUElPRl9ISUdIKTsKKwlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJmkyY19ncGlvX2RldmljZSk7CisJaTJjX3JlZ2lzdGVyX2JvYXJkX2luZm8oMCwgaTJjX2luZm8sIEFSUkFZX1NJWkUoaTJjX2luZm8pKTsKKworI2lmZGVmIENPTkZJR19CT0FSRF9IQU1NRVJIRUFEX1NORAorCWF0MzJfYWRkX2RldmljZV9hYzk3YygwLCAmYWM5N2NfZGF0YSk7CisjZW5kaWYKKworCS8qIFNlbGVjdCB0aGUgVG91Y2hzY3JlZW4gaW50ZXJydXB0IHBpbiBtb2RlICovCisJYXQzMl9zZWxlY3RfcGVyaXBoKEdQSU9fUElPQl9CQVNFLCAweDA4MDAwMDAwLCBHUElPX1BFUklQSF9BLCAwKTsKKworCXJldHVybiAwOworfQorCitwb3N0Y29yZV9pbml0Y2FsbChoYW1tZXJoZWFkX2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hdnIzMi9ib2FyZHMvbWltYzIwMC9zZXR1cC5jIGIvYXJjaC9hdnIzMi9ib2FyZHMvbWltYzIwMC9zZXR1cC5jCmluZGV4IDM5N2NiYjguLjJiNThkNjEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXZyMzIvYm9hcmRzL21pbWMyMDAvc2V0dXAuYworKysgYi9hcmNoL2F2cjMyL2JvYXJkcy9taW1jMjAwL3NldHVwLmMKQEAgLTI0LDcgKzI0LDcgQEAKICNpbmNsdWRlIDx2aWRlby9hdG1lbF9sY2RjLmg+CiAjaW5jbHVkZSA8bGludXgvZmIuaD4KIAotI2luY2x1ZGUgPGFzbS9hdG1lbC1tY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9hdG1lbC1tY2kuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgogCkBAIC0yMDcsOCArMjA3LDYgQEAKIAkgKiByZXNlcnZlIGFueSBwaW5zIGZvciBpdC4KIAkgKi8KIAotCWF0MzJfYWRkX3N5c3RlbV9kZXZpY2VzKCk7Ci0KIAlhdDMyX2FkZF9kZXZpY2VfdXNhcnQoMCk7CiAJYXQzMl9hZGRfZGV2aWNlX3VzYXJ0KDEpOwogCWF0MzJfYWRkX2RldmljZV91c2FydCgyKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXZyMzIvY29uZmlncy9hdG5ndzEwMF9kZWZjb25maWcgYi9hcmNoL2F2cjMyL2NvbmZpZ3MvYXRuZ3cxMDBfZGVmY29uZmlnCmluZGV4IDU0MTUyMDkxLi4xNjRlMjgxIDEwMDY0NAotLS0gYS9hcmNoL2F2cjMyL2NvbmZpZ3MvYXRuZ3cxMDBfZGVmY29uZmlnCisrKyBiL2FyY2gvYXZyMzIvY29uZmlncy9hdG5ndzEwMF9kZWZjb25maWcKQEAgLTg5Miw3ICs4OTIsNyBAQAogIyBETUEgQ2xpZW50cwogIwogIyBDT05GSUdfTkVUX0RNQSBpcyBub3Qgc2V0Ci1DT05GSUdfRE1BVEVTVD1tCisjIENPTkZJR19ETUFURVNUIGlzIG5vdCBzZXQKICMgQ09ORklHX1VJTyBpcyBub3Qgc2V0CiAKICMKZGlmZiAtLWdpdCBhL2FyY2gvYXZyMzIvY29uZmlncy9hdHN0azEwMDJfZGVmY29uZmlnIGIvYXJjaC9hdnIzMi9jb25maWdzL2F0c3RrMTAwMl9kZWZjb25maWcKaW5kZXggNjlmY2U2Yi4uYzlkYzY0OCAxMDA2NDQKLS0tIGEvYXJjaC9hdnIzMi9jb25maWdzL2F0c3RrMTAwMl9kZWZjb25maWcKKysrIGIvYXJjaC9hdnIzMi9jb25maWdzL2F0c3RrMTAwMl9kZWZjb25maWcKQEAgLTk2NCw3ICs5NjQsNyBAQAogIyBETUEgQ2xpZW50cwogIwogIyBDT05GSUdfTkVUX0RNQSBpcyBub3Qgc2V0Ci1DT05GSUdfRE1BVEVTVD1tCisjIENPTkZJR19ETUFURVNUIGlzIG5vdCBzZXQKICMgQ09ORklHX1VJTyBpcyBub3Qgc2V0CiAKICMKZGlmZiAtLWdpdCBhL2FyY2gvYXZyMzIvY29uZmlncy9hdHN0azEwMDNfZGVmY29uZmlnIGIvYXJjaC9hdnIzMi9jb25maWdzL2F0c3RrMTAwM19kZWZjb25maWcKaW5kZXggNTQ3N2VkMy4uMjllYTEzMiAxMDA2NDQKLS0tIGEvYXJjaC9hdnIzMi9jb25maWdzL2F0c3RrMTAwM19kZWZjb25maWcKKysrIGIvYXJjaC9hdnIzMi9jb25maWdzL2F0c3RrMTAwM19kZWZjb25maWcKQEAgLTg4Miw3ICs4ODIsNyBAQAogIyBETUEgQ2xpZW50cwogIwogIyBDT05GSUdfTkVUX0RNQSBpcyBub3Qgc2V0Ci1DT05GSUdfRE1BVEVTVD1tCisjIENPTkZJR19ETUFURVNUIGlzIG5vdCBzZXQKICMgQ09ORklHX1VJTyBpcyBub3Qgc2V0CiAKICMKZGlmZiAtLWdpdCBhL2FyY2gvYXZyMzIvY29uZmlncy9hdHN0azEwMDZfZGVmY29uZmlnIGIvYXJjaC9hdnIzMi9jb25maWdzL2F0c3RrMTAwNl9kZWZjb25maWcKaW5kZXggNmM0NWEzYi4uMzYxYzMxYyAxMDA2NDQKLS0tIGEvYXJjaC9hdnIzMi9jb25maWdzL2F0c3RrMTAwNl9kZWZjb25maWcKKysrIGIvYXJjaC9hdnIzMi9jb25maWdzL2F0c3RrMTAwNl9kZWZjb25maWcKQEAgLTEwMTQsNyArMTAxNCw3IEBACiAjIERNQSBDbGllbnRzCiAjCiAjIENPTkZJR19ORVRfRE1BIGlzIG5vdCBzZXQKLUNPTkZJR19ETUFURVNUPW0KKyMgQ09ORklHX0RNQVRFU1QgaXMgbm90IHNldAogIyBDT05GSUdfVUlPIGlzIG5vdCBzZXQKICMgQ09ORklHX1NUQUdJTkcgaXMgbm90IHNldAogQ09ORklHX1NUQUdJTkdfRVhDTFVERV9CVUlMRD15CmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL2NvbmZpZ3MvaGFtbWVyaGVhZF9kZWZjb25maWcgYi9hcmNoL2F2cjMyL2NvbmZpZ3MvaGFtbWVyaGVhZF9kZWZjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQzZDI5OAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXZyMzIvY29uZmlncy9oYW1tZXJoZWFkX2RlZmNvbmZpZwpAQCAtMCwwICsxLDE0NjcgQEAKKyMKKyMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKKyMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4yNworIyBUdWUgRGVjICA5IDE1OjM3OjMwIDIwMDgKKyMKK0NPTkZJR19BVlIzMj15CitDT05GSUdfR0VORVJJQ19HUElPPXkKK0NPTkZJR19HRU5FUklDX0hBUkRJUlFTPXkKK0NPTkZJR19TVEFDS1RSQUNFX1NVUFBPUlQ9eQorQ09ORklHX0xPQ0tERVBfU1VQUE9SVD15CitDT05GSUdfVFJBQ0VfSVJRRkxBR1NfU1VQUE9SVD15CitDT05GSUdfSEFSRElSUVNfU1dfUkVTRU5EPXkKK0NPTkZJR19HRU5FUklDX0lSUV9QUk9CRT15CitDT05GSUdfUldTRU1fR0VORVJJQ19TUElOTE9DSz15CitDT05GSUdfR0VORVJJQ19USU1FPXkKK0NPTkZJR19HRU5FUklDX0NMT0NLRVZFTlRTPXkKKyMgQ09ORklHX1JXU0VNX1hDSEdBRERfQUxHT1JJVEhNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSEFTX0lMT0cyX1UzMiBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0hBU19JTE9HMl9VNjQgaXMgbm90IHNldAorQ09ORklHX0dFTkVSSUNfSFdFSUdIVD15CitDT05GSUdfR0VORVJJQ19DQUxJQlJBVEVfREVMQVk9eQorQ09ORklHX0dFTkVSSUNfQlVHPXkKK0NPTkZJR19ERUZDT05GSUdfTElTVD0iL2xpYi9tb2R1bGVzLyRVTkFNRV9SRUxFQVNFLy5jb25maWciCisKKyMKKyMgR2VuZXJhbCBzZXR1cAorIworQ09ORklHX0VYUEVSSU1FTlRBTD15CitDT05GSUdfQlJPS0VOX09OX1NNUD15CitDT05GSUdfSU5JVF9FTlZfQVJHX0xJTUlUPTMyCitDT05GSUdfTE9DQUxWRVJTSU9OPSIiCisjIENPTkZJR19MT0NBTFZFUlNJT05fQVVUTyBpcyBub3Qgc2V0CitDT05GSUdfU1dBUD15CitDT05GSUdfU1lTVklQQz15CitDT05GSUdfU1lTVklQQ19TWVNDVEw9eQorQ09ORklHX1BPU0lYX01RVUVVRT15CitDT05GSUdfQlNEX1BST0NFU1NfQUNDVD15CitDT05GSUdfQlNEX1BST0NFU1NfQUNDVF9WMz15CisjIENPTkZJR19UQVNLU1RBVFMgaXMgbm90IHNldAorIyBDT05GSUdfQVVESVQgaXMgbm90IHNldAorIyBDT05GSUdfSUtDT05GSUcgaXMgbm90IHNldAorQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKKyMgQ09ORklHX0NHUk9VUFMgaXMgbm90IHNldAorIyBDT05GSUdfR1JPVVBfU0NIRUQgaXMgbm90IHNldAorQ09ORklHX1NZU0ZTX0RFUFJFQ0FURUQ9eQorQ09ORklHX1NZU0ZTX0RFUFJFQ0FURURfVjI9eQorIyBDT05GSUdfUkVMQVkgaXMgbm90IHNldAorIyBDT05GSUdfTkFNRVNQQUNFUyBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVl9JTklUUkQ9eQorQ09ORklHX0lOSVRSQU1GU19TT1VSQ0U9IiIKK0NPTkZJR19DQ19PUFRJTUlaRV9GT1JfU0laRT15CitDT05GSUdfU1lTQ1RMPXkKK0NPTkZJR19FTUJFRERFRD15CisjIENPTkZJR19TWVNDVExfU1lTQ0FMTCBpcyBub3Qgc2V0CitDT05GSUdfS0FMTFNZTVM9eQorIyBDT05GSUdfS0FMTFNZTVNfQUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tBTExTWU1TX0VYVFJBX1BBU1MgaXMgbm90IHNldAorQ09ORklHX0hPVFBMVUc9eQorQ09ORklHX1BSSU5USz15CitDT05GSUdfQlVHPXkKK0NPTkZJR19FTEZfQ09SRT15CisjIENPTkZJR19DT01QQVRfQlJLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JBU0VfRlVMTCBpcyBub3Qgc2V0CitDT05GSUdfRlVURVg9eQorQ09ORklHX0FOT05fSU5PREVTPXkKK0NPTkZJR19FUE9MTD15CitDT05GSUdfU0lHTkFMRkQ9eQorQ09ORklHX1RJTUVSRkQ9eQorQ09ORklHX0VWRU5URkQ9eQorQ09ORklHX1NITUVNPXkKK0NPTkZJR19BSU89eQorQ09ORklHX1ZNX0VWRU5UX0NPVU5URVJTPXkKK0NPTkZJR19QQ0lfUVVJUktTPXkKK0NPTkZJR19TTFVCX0RFQlVHPXkKKyMgQ09ORklHX1NMQUIgaXMgbm90IHNldAorQ09ORklHX1NMVUI9eQorIyBDT05GSUdfU0xPQiBpcyBub3Qgc2V0CitDT05GSUdfUFJPRklMSU5HPXkKKyMgQ09ORklHX01BUktFUlMgaXMgbm90IHNldAorQ09ORklHX09QUk9GSUxFPW0KK0NPTkZJR19IQVZFX09QUk9GSUxFPXkKK0NPTkZJR19LUFJPQkVTPXkKK0NPTkZJR19IQVZFX0tQUk9CRVM9eQorQ09ORklHX0hBVkVfQ0xLPXkKKyMgQ09ORklHX0hBVkVfR0VORVJJQ19ETUFfQ09IRVJFTlQgaXMgbm90IHNldAorQ09ORklHX1NMQUJJTkZPPXkKK0NPTkZJR19SVF9NVVRFWEVTPXkKKyMgQ09ORklHX1RJTllfU0hNRU0gaXMgbm90IHNldAorQ09ORklHX0JBU0VfU01BTEw9MQorQ09ORklHX01PRFVMRVM9eQorIyBDT05GSUdfTU9EVUxFX0ZPUkNFX0xPQUQgaXMgbm90IHNldAorQ09ORklHX01PRFVMRV9VTkxPQUQ9eQorQ09ORklHX01PRFVMRV9GT1JDRV9VTkxPQUQ9eQorIyBDT05GSUdfTU9EVkVSU0lPTlMgaXMgbm90IHNldAorIyBDT05GSUdfTU9EVUxFX1NSQ1ZFUlNJT05fQUxMIGlzIG5vdCBzZXQKK0NPTkZJR19LTU9EPXkKK0NPTkZJR19CTE9DSz15CisjIENPTkZJR19MQkQgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9JT19UUkFDRSBpcyBub3Qgc2V0CisjIENPTkZJR19MU0YgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9CU0cgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9JTlRFR1JJVFkgaXMgbm90IHNldAorCisjCisjIElPIFNjaGVkdWxlcnMKKyMKK0NPTkZJR19JT1NDSEVEX05PT1A9eQorIyBDT05GSUdfSU9TQ0hFRF9BUyBpcyBub3Qgc2V0CisjIENPTkZJR19JT1NDSEVEX0RFQURMSU5FIGlzIG5vdCBzZXQKK0NPTkZJR19JT1NDSEVEX0NGUT15CisjIENPTkZJR19ERUZBVUxUX0FTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFRkFVTFRfREVBRExJTkUgaXMgbm90IHNldAorQ09ORklHX0RFRkFVTFRfQ0ZRPXkKKyMgQ09ORklHX0RFRkFVTFRfTk9PUCBpcyBub3Qgc2V0CitDT05GSUdfREVGQVVMVF9JT1NDSEVEPSJjZnEiCitDT05GSUdfQ0xBU1NJQ19SQ1U9eQorIyBDT05GSUdfRlJFRVpFUiBpcyBub3Qgc2V0CisKKyMKKyMgU3lzdGVtIFR5cGUgYW5kIGZlYXR1cmVzCisjCitDT05GSUdfVElDS19PTkVTSE9UPXkKK0NPTkZJR19OT19IWj15CitDT05GSUdfSElHSF9SRVNfVElNRVJTPXkKK0NPTkZJR19HRU5FUklDX0NMT0NLRVZFTlRTX0JVSUxEPXkKK0NPTkZJR19TVUJBUkNIX0FWUjMyQj15CitDT05GSUdfTU1VPXkKK0NPTkZJR19QRVJGT1JNQU5DRV9DT1VOVEVSUz15CitDT05GSUdfUExBVEZPUk1fQVQzMkFQPXkKK0NPTkZJR19DUFVfQVQzMkFQNzAwWD15CitDT05GSUdfQ1BVX0FUMzJBUDcwMDA9eQorIyBDT05GSUdfQk9BUkRfQVRTVEsxMDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JPQVJEX0FUTkdXMTAwIGlzIG5vdCBzZXQKK0NPTkZJR19CT0FSRF9IQU1NRVJIRUFEPXkKKyMgQ09ORklHX0JPQVJEX0ZBVlJfMzIgaXMgbm90IHNldAorIyBDT05GSUdfQk9BUkRfTUlNQzIwMCBpcyBub3Qgc2V0CitDT05GSUdfQk9BUkRfSEFNTUVSSEVBRF9VU0I9eQorQ09ORklHX0JPQVJEX0hBTU1FUkhFQURfTENEPXkKK0NPTkZJR19CT0FSRF9IQU1NRVJIRUFEX1NORD15CisjIENPTkZJR19CT0FSRF9IQU1NRVJIRUFEX0ZQR0EgaXMgbm90IHNldAorQ09ORklHX0xPQURFUl9VX0JPT1Q9eQorCisjCisjIEF0bWVsIEFWUjMyIEFQIG9wdGlvbnMKKyMKKyMgQ09ORklHX0FQNzAwWF8zMl9CSVRfU01DIGlzIG5vdCBzZXQKK0NPTkZJR19BUDcwMFhfMTZfQklUX1NNQz15CisjIENPTkZJR19BUDcwMFhfOF9CSVRfU01DIGlzIG5vdCBzZXQKK0NPTkZJR19MT0FEX0FERFJFU1M9MHgxMDAwMDAwMAorQ09ORklHX0VOVFJZX0FERFJFU1M9MHg5MDAwMDAwMAorQ09ORklHX1BIWVNfT0ZGU0VUPTB4MTAwMDAwMDAKK0NPTkZJR19QUkVFTVBUX05PTkU9eQorIyBDT05GSUdfUFJFRU1QVF9WT0xVTlRBUlkgaXMgbm90IHNldAorIyBDT05GSUdfUFJFRU1QVCBpcyBub3Qgc2V0CitDT05GSUdfUVVJQ0tMSVNUPXkKKyMgQ09ORklHX0hBVkVfQVJDSF9CT09UTUVNX05PREUgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9IQVZFX01FTU9SWV9QUkVTRU5UIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FRURfTk9ERV9NRU1NQVBfU0laRSBpcyBub3Qgc2V0CitDT05GSUdfQVJDSF9GTEFUTUVNX0VOQUJMRT15CisjIENPTkZJR19BUkNIX0RJU0NPTlRJR01FTV9FTkFCTEUgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9TUEFSU0VNRU1fRU5BQkxFIGlzIG5vdCBzZXQKK0NPTkZJR19TRUxFQ1RfTUVNT1JZX01PREVMPXkKK0NPTkZJR19GTEFUTUVNX01BTlVBTD15CisjIENPTkZJR19ESVNDT05USUdNRU1fTUFOVUFMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NQQVJTRU1FTV9NQU5VQUwgaXMgbm90IHNldAorQ09ORklHX0ZMQVRNRU09eQorQ09ORklHX0ZMQVRfTk9ERV9NRU1fTUFQPXkKK0NPTkZJR19QQUdFRkxBR1NfRVhURU5ERUQ9eQorQ09ORklHX1NQTElUX1BUTE9DS19DUFVTPTQKKyMgQ09ORklHX1JFU09VUkNFU182NEJJVCBpcyBub3Qgc2V0CisjIENPTkZJR19QSFlTX0FERFJfVF82NEJJVCBpcyBub3Qgc2V0CitDT05GSUdfWk9ORV9ETUFfRkxBRz0wCitDT05GSUdfTlJfUVVJQ0s9MgorQ09ORklHX1ZJUlRfVE9fQlVTPXkKK0NPTkZJR19VTkVWSUNUQUJMRV9MUlU9eQorIyBDT05GSUdfT1dORVJTSElQX1RSQUNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX05NSV9ERUJVR0dJTkcgaXMgbm90IHNldAorIyBDT05GSUdfSFpfMTAwIGlzIG5vdCBzZXQKK0NPTkZJR19IWl8yNTA9eQorIyBDT05GSUdfSFpfMzAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0haXzEwMDAgaXMgbm90IHNldAorQ09ORklHX0haPTI1MAorQ09ORklHX1NDSEVEX0hSVElDSz15CitDT05GSUdfQ01ETElORT0iIgorCisjCisjIFBvd2VyIG1hbmFnZW1lbnQgb3B0aW9ucworIworIyBDT05GSUdfUE0gaXMgbm90IHNldAorQ09ORklHX0FSQ0hfU1VTUEVORF9QT1NTSUJMRT15CisKKyMKKyMgQ1BVIEZyZXF1ZW5jeSBzY2FsaW5nCisjCitDT05GSUdfQ1BVX0ZSRVE9eQorQ09ORklHX0NQVV9GUkVRX1RBQkxFPXkKKyMgQ09ORklHX0NQVV9GUkVRX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9GUkVRX1NUQVQgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX0ZSRVFfREVGQVVMVF9HT1ZfUEVSRk9STUFOQ0UgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX0ZSRVFfREVGQVVMVF9HT1ZfUE9XRVJTQVZFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9GUkVRX0RFRkFVTFRfR09WX1VTRVJTUEFDRSBpcyBub3Qgc2V0CitDT05GSUdfQ1BVX0ZSRVFfREVGQVVMVF9HT1ZfT05ERU1BTkQ9eQorIyBDT05GSUdfQ1BVX0ZSRVFfREVGQVVMVF9HT1ZfQ09OU0VSVkFUSVZFIGlzIG5vdCBzZXQKK0NPTkZJR19DUFVfRlJFUV9HT1ZfUEVSRk9STUFOQ0U9eQorIyBDT05GSUdfQ1BVX0ZSRVFfR09WX1BPV0VSU0FWRSBpcyBub3Qgc2V0CitDT05GSUdfQ1BVX0ZSRVFfR09WX1VTRVJTUEFDRT15CitDT05GSUdfQ1BVX0ZSRVFfR09WX09OREVNQU5EPXkKKyMgQ09ORklHX0NQVV9GUkVRX0dPVl9DT05TRVJWQVRJVkUgaXMgbm90IHNldAorQ09ORklHX0NQVV9GUkVRX0FUMzJBUD15CisKKyMKKyMgQnVzIG9wdGlvbnMKKyMKKyMgQ09ORklHX0FSQ0hfU1VQUE9SVFNfTVNJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BDQ0FSRCBpcyBub3Qgc2V0CisKKyMKKyMgRXhlY3V0YWJsZSBmaWxlIGZvcm1hdHMKKyMKK0NPTkZJR19CSU5GTVRfRUxGPXkKKyMgQ09ORklHX0NPUkVfRFVNUF9ERUZBVUxUX0VMRl9IRUFERVJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hBVkVfQU9VVCBpcyBub3Qgc2V0CisjIENPTkZJR19CSU5GTVRfTUlTQyBpcyBub3Qgc2V0CitDT05GSUdfTkVUPXkKKworIworIyBOZXR3b3JraW5nIG9wdGlvbnMKKyMKK0NPTkZJR19QQUNLRVQ9eQorQ09ORklHX1BBQ0tFVF9NTUFQPXkKK0NPTkZJR19VTklYPXkKK0NPTkZJR19YRlJNPXkKK0NPTkZJR19YRlJNX1VTRVI9eQorIyBDT05GSUdfWEZSTV9TVUJfUE9MSUNZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1hGUk1fTUlHUkFURSBpcyBub3Qgc2V0CisjIENPTkZJR19YRlJNX1NUQVRJU1RJQ1MgaXMgbm90IHNldAorQ09ORklHX1hGUk1fSVBDT01QPXkKK0NPTkZJR19ORVRfS0VZPXkKKyMgQ09ORklHX05FVF9LRVlfTUlHUkFURSBpcyBub3Qgc2V0CitDT05GSUdfSU5FVD15CitDT05GSUdfSVBfTVVMVElDQVNUPXkKK0NPTkZJR19JUF9BRFZBTkNFRF9ST1VURVI9eQorQ09ORklHX0FTS19JUF9GSUJfSEFTSD15CisjIENPTkZJR19JUF9GSUJfVFJJRSBpcyBub3Qgc2V0CitDT05GSUdfSVBfRklCX0hBU0g9eQorIyBDT05GSUdfSVBfTVVMVElQTEVfVEFCTEVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX1JPVVRFX01VTFRJUEFUSCBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9ST1VURV9WRVJCT1NFIGlzIG5vdCBzZXQKK0NPTkZJR19JUF9QTlA9eQorQ09ORklHX0lQX1BOUF9ESENQPXkKKyMgQ09ORklHX0lQX1BOUF9CT09UUCBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9QTlBfUkFSUCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfSVBJUCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfSVBHUkUgaXMgbm90IHNldAorQ09ORklHX0lQX01ST1VURT15CitDT05GSUdfSVBfUElNU01fVjE9eQorIyBDT05GSUdfSVBfUElNU01fVjIgaXMgbm90IHNldAorIyBDT05GSUdfQVJQRCBpcyBub3Qgc2V0CitDT05GSUdfU1lOX0NPT0tJRVM9eQorQ09ORklHX0lORVRfQUg9eQorQ09ORklHX0lORVRfRVNQPXkKK0NPTkZJR19JTkVUX0lQQ09NUD15CitDT05GSUdfSU5FVF9YRlJNX1RVTk5FTD15CitDT05GSUdfSU5FVF9UVU5ORUw9eQorQ09ORklHX0lORVRfWEZSTV9NT0RFX1RSQU5TUE9SVD15CitDT05GSUdfSU5FVF9YRlJNX01PREVfVFVOTkVMPXkKK0NPTkZJR19JTkVUX1hGUk1fTU9ERV9CRUVUPXkKKyMgQ09ORklHX0lORVRfTFJPIGlzIG5vdCBzZXQKK0NPTkZJR19JTkVUX0RJQUc9eQorQ09ORklHX0lORVRfVENQX0RJQUc9eQorIyBDT05GSUdfVENQX0NPTkdfQURWQU5DRUQgaXMgbm90IHNldAorQ09ORklHX1RDUF9DT05HX0NVQklDPXkKK0NPTkZJR19ERUZBVUxUX1RDUF9DT05HPSJjdWJpYyIKKyMgQ09ORklHX1RDUF9NRDVTSUcgaXMgbm90IHNldAorIyBDT05GSUdfSVBWNiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRXT1JLX1NFQ01BUksgaXMgbm90IHNldAorQ09ORklHX05FVEZJTFRFUj15CisjIENPTkZJR19ORVRGSUxURVJfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfTkVURklMVEVSX0FEVkFOQ0VEIGlzIG5vdCBzZXQKKworIworIyBDb3JlIE5ldGZpbHRlciBDb25maWd1cmF0aW9uCisjCitDT05GSUdfTkVURklMVEVSX05FVExJTks9bQorQ09ORklHX05FVEZJTFRFUl9ORVRMSU5LX0xPRz1tCitDT05GSUdfTkZfQ09OTlRSQUNLPW0KK0NPTkZJR19ORl9DT05OVFJBQ0tfRlRQPW0KK0NPTkZJR19ORl9DT05OVFJBQ0tfSVJDPW0KK0NPTkZJR19ORl9DT05OVFJBQ0tfU0lQPW0KK0NPTkZJR19ORl9DVF9ORVRMSU5LPW0KK0NPTkZJR19ORVRGSUxURVJfWFRBQkxFUz15CitDT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9NQVJLPW0KK0NPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX05GTE9HPW0KK0NPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX1RDUE1TUz1tCitDT05GSUdfTkVURklMVEVSX1hUX01BVENIX0NPTk5UUkFDSz1tCitDT05GSUdfTkVURklMVEVSX1hUX01BVENIX01BUks9bQorQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9QT0xJQ1k9bQorQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9TVEFURT1tCisjIENPTkZJR19JUF9WUyBpcyBub3Qgc2V0CisKKyMKKyMgSVA6IE5ldGZpbHRlciBDb25maWd1cmF0aW9uCisjCitDT05GSUdfTkZfREVGUkFHX0lQVjQ9bQorQ09ORklHX05GX0NPTk5UUkFDS19JUFY0PW0KK0NPTkZJR19ORl9DT05OVFJBQ0tfUFJPQ19DT01QQVQ9eQorQ09ORklHX0lQX05GX0lQVEFCTEVTPW0KK0NPTkZJR19JUF9ORl9GSUxURVI9bQorQ09ORklHX0lQX05GX1RBUkdFVF9SRUpFQ1Q9bQorQ09ORklHX0lQX05GX1RBUkdFVF9MT0c9bQorIyBDT05GSUdfSVBfTkZfVEFSR0VUX1VMT0cgaXMgbm90IHNldAorQ09ORklHX05GX05BVD1tCitDT05GSUdfTkZfTkFUX05FRURFRD15CitDT05GSUdfSVBfTkZfVEFSR0VUX01BU1FVRVJBREU9bQorQ09ORklHX05GX05BVF9GVFA9bQorQ09ORklHX05GX05BVF9JUkM9bQorIyBDT05GSUdfTkZfTkFUX1RGVFAgaXMgbm90IHNldAorIyBDT05GSUdfTkZfTkFUX0FNQU5EQSBpcyBub3Qgc2V0CisjIENPTkZJR19ORl9OQVRfUFBUUCBpcyBub3Qgc2V0CisjIENPTkZJR19ORl9OQVRfSDMyMyBpcyBub3Qgc2V0CitDT05GSUdfTkZfTkFUX1NJUD1tCitDT05GSUdfSVBfTkZfTUFOR0xFPW0KKyMgQ09ORklHX0lQX0RDQ1AgaXMgbm90IHNldAorIyBDT05GSUdfSVBfU0NUUCBpcyBub3Qgc2V0CisjIENPTkZJR19USVBDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUTSBpcyBub3Qgc2V0CisjIENPTkZJR19CUklER0UgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0RTQSBpcyBub3Qgc2V0CisjIENPTkZJR19WTEFOXzgwMjFRIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQ05FVCBpcyBub3Qgc2V0CisjIENPTkZJR19MTEMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQWCBpcyBub3Qgc2V0CisjIENPTkZJR19BVEFMSyBpcyBub3Qgc2V0CisjIENPTkZJR19YMjUgaXMgbm90IHNldAorIyBDT05GSUdfTEFQQiBpcyBub3Qgc2V0CisjIENPTkZJR19FQ09ORVQgaXMgbm90IHNldAorIyBDT05GSUdfV0FOX1JPVVRFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfU0NIRUQgaXMgbm90IHNldAorCisjCisjIE5ldHdvcmsgdGVzdGluZworIworIyBDT05GSUdfTkVUX1BLVEdFTiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfVENQUFJPQkUgaXMgbm90IHNldAorIyBDT05GSUdfSEFNUkFESU8gaXMgbm90IHNldAorIyBDT05GSUdfQ0FOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lSREEgaXMgbm90IHNldAorIyBDT05GSUdfQlQgaXMgbm90IHNldAorIyBDT05GSUdfQUZfUlhSUEMgaXMgbm90IHNldAorIyBDT05GSUdfUEhPTkVUIGlzIG5vdCBzZXQKK0NPTkZJR19XSVJFTEVTUz15CisjIENPTkZJR19DRkc4MDIxMSBpcyBub3Qgc2V0CisjIENPTkZJR19XSVJFTEVTU19PTERfUkVHVUxBVE9SWSBpcyBub3Qgc2V0CisjIENPTkZJR19XSVJFTEVTU19FWFQgaXMgbm90IHNldAorIyBDT05GSUdfTUFDODAyMTEgaXMgbm90IHNldAorIyBDT05GSUdfSUVFRTgwMjExIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JGS0lMTCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfOVAgaXMgbm90IHNldAorCisjCisjIERldmljZSBEcml2ZXJzCisjCisKKyMKKyMgR2VuZXJpYyBEcml2ZXIgT3B0aW9ucworIworQ09ORklHX1VFVkVOVF9IRUxQRVJfUEFUSD0iL3NiaW4vaG90cGx1ZyIKK0NPTkZJR19TVEFOREFMT05FPXkKKyMgQ09ORklHX1BSRVZFTlRfRklSTVdBUkVfQlVJTEQgaXMgbm90IHNldAorIyBDT05GSUdfRldfTE9BREVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0RSSVZFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19ERVZSRVMgaXMgbm90IHNldAorIyBDT05GSUdfU1lTX0hZUEVSVklTT1IgaXMgbm90IHNldAorIyBDT05GSUdfQ09OTkVDVE9SIGlzIG5vdCBzZXQKK0NPTkZJR19NVEQ9eQorIyBDT05GSUdfTVREX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9DT05DQVQgaXMgbm90IHNldAorQ09ORklHX01URF9QQVJUSVRJT05TPXkKKyMgQ09ORklHX01URF9SRURCT09UX1BBUlRTIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfQ01ETElORV9QQVJUUz15CisjIENPTkZJR19NVERfQVI3X1BBUlRTIGlzIG5vdCBzZXQKKworIworIyBVc2VyIE1vZHVsZXMgQW5kIFRyYW5zbGF0aW9uIExheWVycworIworQ09ORklHX01URF9DSEFSPXkKK0NPTkZJR19NVERfQkxLREVWUz15CitDT05GSUdfTVREX0JMT0NLPXkKKyMgQ09ORklHX0ZUTCBpcyBub3Qgc2V0CisjIENPTkZJR19ORlRMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORlRMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JGRF9GVEwgaXMgbm90IHNldAorIyBDT05GSUdfU1NGREMgaXMgbm90IHNldAorIyBDT05GSUdfTVREX09PUFMgaXMgbm90IHNldAorCisjCisjIFJBTS9ST00vRmxhc2ggY2hpcCBkcml2ZXJzCisjCitDT05GSUdfTVREX0NGST15CisjIENPTkZJR19NVERfSkVERUNQUk9CRSBpcyBub3Qgc2V0CitDT05GSUdfTVREX0dFTl9QUk9CRT15CisjIENPTkZJR19NVERfQ0ZJX0FEVl9PUFRJT05TIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMT15CitDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzI9eQorQ09ORklHX01URF9NQVBfQkFOS19XSURUSF80PXkKKyMgQ09ORklHX01URF9NQVBfQkFOS19XSURUSF84IGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8xNiBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMzIgaXMgbm90IHNldAorQ09ORklHX01URF9DRklfSTE9eQorQ09ORklHX01URF9DRklfSTI9eQorIyBDT05GSUdfTVREX0NGSV9JNCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQ0ZJX0k4IGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9DRklfSU5URUxFWFQgaXMgbm90IHNldAorQ09ORklHX01URF9DRklfQU1EU1REPXkKKyMgQ09ORklHX01URF9DRklfU1RBQSBpcyBub3Qgc2V0CitDT05GSUdfTVREX0NGSV9VVElMPXkKKyMgQ09ORklHX01URF9SQU0gaXMgbm90IHNldAorIyBDT05GSUdfTVREX1JPTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQUJTRU5UIGlzIG5vdCBzZXQKKworIworIyBNYXBwaW5nIGRyaXZlcnMgZm9yIGNoaXAgYWNjZXNzCisjCisjIENPTkZJR19NVERfQ09NUExFWF9NQVBQSU5HUyBpcyBub3Qgc2V0CitDT05GSUdfTVREX1BIWVNNQVA9eQorQ09ORklHX01URF9QSFlTTUFQX1NUQVJUPTB4ODAwMDAwMDAKK0NPTkZJR19NVERfUEhZU01BUF9MRU49MHgwCitDT05GSUdfTVREX1BIWVNNQVBfQkFOS1dJRFRIPTIKKyMgQ09ORklHX01URF9QTEFUUkFNIGlzIG5vdCBzZXQKKworIworIyBTZWxmLWNvbnRhaW5lZCBNVEQgZGV2aWNlIGRyaXZlcnMKKyMKK0NPTkZJR19NVERfREFUQUZMQVNIPXkKKyMgQ09ORklHX01URF9EQVRBRkxBU0hfV1JJVEVfVkVSSUZZIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9EQVRBRkxBU0hfT1RQIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9NMjVQODAgaXMgbm90IHNldAorIyBDT05GSUdfTVREX1NMUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9QSFJBTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTVREUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9CTE9DSzJNVEQgaXMgbm90IHNldAorCisjCisjIERpc2stT24tQ2hpcCBEZXZpY2UgRHJpdmVycworIworIyBDT05GSUdfTVREX0RPQzIwMDAgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0RPQzIwMDEgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0RPQzIwMDFQTFVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9OQU5EIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9PTkVOQU5EIGlzIG5vdCBzZXQKKworIworIyBVQkkgLSBVbnNvcnRlZCBibG9jayBpbWFnZXMKKyMKKyMgQ09ORklHX01URF9VQkkgaXMgbm90IHNldAorIyBDT05GSUdfUEFSUE9SVCBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVj15CisjIENPTkZJR19CTEtfREVWX0NPV19DT01NT04gaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9MT09QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfTkJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfVUIgaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfUkFNPW0KK0NPTkZJR19CTEtfREVWX1JBTV9DT1VOVD0xNgorQ09ORklHX0JMS19ERVZfUkFNX1NJWkU9NDA5NgorIyBDT05GSUdfQkxLX0RFVl9YSVAgaXMgbm90IHNldAorIyBDT05GSUdfQ0RST01fUEtUQ0RWRCBpcyBub3Qgc2V0CisjIENPTkZJR19BVEFfT1ZFUl9FVEggaXMgbm90IHNldAorQ09ORklHX01JU0NfREVWSUNFUz15CisjIENPTkZJR19BVE1FTF9QV00gaXMgbm90IHNldAorQ09ORklHX0FUTUVMX1RDTElCPXkKK0NPTkZJR19BVE1FTF9UQ0JfQ0xLU1JDPXkKK0NPTkZJR19BVE1FTF9UQ0JfQ0xLU1JDX0JMT0NLPTAKKyMgQ09ORklHX0VFUFJPTV85M0NYNiBpcyBub3Qgc2V0CisjIENPTkZJR19BVE1FTF9TU0MgaXMgbm90IHNldAorIyBDT05GSUdfRU5DTE9TVVJFX1NFUlZJQ0VTIGlzIG5vdCBzZXQKKworIworIyBTQ1NJIGRldmljZSBzdXBwb3J0CisjCisjIENPTkZJR19SQUlEX0FUVFJTIGlzIG5vdCBzZXQKK0NPTkZJR19TQ1NJPW0KK0NPTkZJR19TQ1NJX0RNQT15CisjIENPTkZJR19TQ1NJX1RHVCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX05FVExJTksgaXMgbm90IHNldAorQ09ORklHX1NDU0lfUFJPQ19GUz15CisKKyMKKyMgU0NTSSBzdXBwb3J0IHR5cGUgKGRpc2ssIHRhcGUsIENELVJPTSkKKyMKK0NPTkZJR19CTEtfREVWX1NEPW0KKyMgQ09ORklHX0NIUl9ERVZfU1QgaXMgbm90IHNldAorIyBDT05GSUdfQ0hSX0RFVl9PU1NUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfU1IgaXMgbm90IHNldAorIyBDT05GSUdfQ0hSX0RFVl9TRyBpcyBub3Qgc2V0CisjIENPTkZJR19DSFJfREVWX1NDSCBpcyBub3Qgc2V0CisKKyMKKyMgU29tZSBTQ1NJIGRldmljZXMgKGUuZy4gQ0QganVrZWJveCkgc3VwcG9ydCBtdWx0aXBsZSBMVU5zCisjCisjIENPTkZJR19TQ1NJX01VTFRJX0xVTiBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0NPTlNUQU5UUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0xPR0dJTkcgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9TQ0FOX0FTWU5DIGlzIG5vdCBzZXQKK0NPTkZJR19TQ1NJX1dBSVRfU0NBTj1tCisKKyMKKyMgU0NTSSBUcmFuc3BvcnRzCisjCisjIENPTkZJR19TQ1NJX1NQSV9BVFRSUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0ZDX0FUVFJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfSVNDU0lfQVRUUlMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9TQVNfTElCU0FTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfU1JQX0FUVFJTIGlzIG5vdCBzZXQKK0NPTkZJR19TQ1NJX0xPV0xFVkVMPXkKKyMgQ09ORklHX0lTQ1NJX1RDUCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfREggaXMgbm90IHNldAorIyBDT05GSUdfQVRBIGlzIG5vdCBzZXQKKyMgQ09ORklHX01EIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRERVZJQ0VTPXkKKyMgQ09ORklHX0RVTU1ZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JPTkRJTkcgaXMgbm90IHNldAorIyBDT05GSUdfTUFDVkxBTiBpcyBub3Qgc2V0CisjIENPTkZJR19FUVVBTElaRVIgaXMgbm90IHNldAorIyBDT05GSUdfVFVOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZFVEggaXMgbm90IHNldAorQ09ORklHX1BIWUxJQj15CisKKyMKKyMgTUlJIFBIWSBkZXZpY2UgZHJpdmVycworIworIyBDT05GSUdfTUFSVkVMTF9QSFkgaXMgbm90IHNldAorIyBDT05GSUdfREFWSUNPTV9QSFkgaXMgbm90IHNldAorIyBDT05GSUdfUVNFTUlfUEhZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xYVF9QSFkgaXMgbm90IHNldAorIyBDT05GSUdfQ0lDQURBX1BIWSBpcyBub3Qgc2V0CisjIENPTkZJR19WSVRFU1NFX1BIWSBpcyBub3Qgc2V0CisjIENPTkZJR19TTVNDX1BIWSBpcyBub3Qgc2V0CisjIENPTkZJR19CUk9BRENPTV9QSFkgaXMgbm90IHNldAorIyBDT05GSUdfSUNQTFVTX1BIWSBpcyBub3Qgc2V0CisjIENPTkZJR19SRUFMVEVLX1BIWSBpcyBub3Qgc2V0CisjIENPTkZJR19GSVhFRF9QSFkgaXMgbm90IHNldAorIyBDT05GSUdfTURJT19CSVRCQU5HIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRfRVRIRVJORVQ9eQorIyBDT05GSUdfTUlJIGlzIG5vdCBzZXQKK0NPTkZJR19NQUNCPXkKKyMgQ09ORklHX0VOQzI4SjYwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lCTV9ORVdfRU1BQ19aTUlJIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lCTV9ORVdfRU1BQ19SR01JSSBpcyBub3Qgc2V0CisjIENPTkZJR19JQk1fTkVXX0VNQUNfVEFIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lCTV9ORVdfRU1BQ19FTUFDNCBpcyBub3Qgc2V0CisjIENPTkZJR19JQk1fTkVXX0VNQUNfTk9fRkxPV19DVFJMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lCTV9ORVdfRU1BQ19NQUxfQ0xSX0lDSU5UU1RBVCBpcyBub3Qgc2V0CisjIENPTkZJR19JQk1fTkVXX0VNQUNfTUFMX0NPTU1PTl9FUlIgaXMgbm90IHNldAorIyBDT05GSUdfQjQ0IGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVERFVl8xMDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVERFVl8xMDAwMCBpcyBub3Qgc2V0CisKKyMKKyMgV2lyZWxlc3MgTEFOCisjCisjIENPTkZJR19XTEFOX1BSRTgwMjExIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dMQU5fODAyMTEgaXMgbm90IHNldAorIyBDT05GSUdfSVdMV0lGSV9MRURTIGlzIG5vdCBzZXQKKworIworIyBVU0IgTmV0d29yayBBZGFwdGVycworIworIyBDT05GSUdfVVNCX0NBVEMgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0tBV0VUSCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfUEVHQVNVUyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfUlRMODE1MCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfVVNCTkVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dBTiBpcyBub3Qgc2V0CisjIENPTkZJR19QUFAgaXMgbm90IHNldAorIyBDT05GSUdfU0xJUCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRDT05TT0xFIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVFBPTEwgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUiBpcyBub3Qgc2V0CisjIENPTkZJR19JU0ROIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BIT05FIGlzIG5vdCBzZXQKKworIworIyBJbnB1dCBkZXZpY2Ugc3VwcG9ydAorIworQ09ORklHX0lOUFVUPXkKK0NPTkZJR19JTlBVVF9GRl9NRU1MRVNTPW0KKyMgQ09ORklHX0lOUFVUX1BPTExERVYgaXMgbm90IHNldAorCisjCisjIFVzZXJsYW5kIGludGVyZmFjZXMKKyMKK0NPTkZJR19JTlBVVF9NT1VTRURFVj15CitDT05GSUdfSU5QVVRfTU9VU0VERVZfUFNBVVg9eQorQ09ORklHX0lOUFVUX01PVVNFREVWX1NDUkVFTl9YPTEwMjQKK0NPTkZJR19JTlBVVF9NT1VTRURFVl9TQ1JFRU5fWT03NjgKKyMgQ09ORklHX0lOUFVUX0pPWURFViBpcyBub3Qgc2V0CitDT05GSUdfSU5QVVRfRVZERVY9bQorIyBDT05GSUdfSU5QVVRfRVZCVUcgaXMgbm90IHNldAorCisjCisjIElucHV0IERldmljZSBEcml2ZXJzCisjCitDT05GSUdfSU5QVVRfS0VZQk9BUkQ9eQorQ09ORklHX0tFWUJPQVJEX0FUS0JEPXkKKyMgQ09ORklHX0tFWUJPQVJEX1NVTktCRCBpcyBub3Qgc2V0CisjIENPTkZJR19LRVlCT0FSRF9MS0tCRCBpcyBub3Qgc2V0CisjIENPTkZJR19LRVlCT0FSRF9YVEtCRCBpcyBub3Qgc2V0CisjIENPTkZJR19LRVlCT0FSRF9ORVdUT04gaXMgbm90IHNldAorIyBDT05GSUdfS0VZQk9BUkRfU1RPV0FXQVkgaXMgbm90IHNldAorIyBDT05GSUdfS0VZQk9BUkRfR1BJTyBpcyBub3Qgc2V0CitDT05GSUdfSU5QVVRfTU9VU0U9eQorQ09ORklHX01PVVNFX1BTMj15CitDT05GSUdfTU9VU0VfUFMyX0FMUFM9eQorQ09ORklHX01PVVNFX1BTMl9MT0dJUFMyUFA9eQorQ09ORklHX01PVVNFX1BTMl9TWU5BUFRJQ1M9eQorQ09ORklHX01PVVNFX1BTMl9MSUZFQk9PSz15CitDT05GSUdfTU9VU0VfUFMyX1RSQUNLUE9JTlQ9eQorIyBDT05GSUdfTU9VU0VfUFMyX1RPVUNIS0lUIGlzIG5vdCBzZXQKKyMgQ09ORklHX01PVVNFX1NFUklBTCBpcyBub3Qgc2V0CisjIENPTkZJR19NT1VTRV9BUFBMRVRPVUNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX01PVVNFX0JDTTU5NzQgaXMgbm90IHNldAorIyBDT05GSUdfTU9VU0VfVlNYWFhBQSBpcyBub3Qgc2V0CisjIENPTkZJR19NT1VTRV9HUElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX0pPWVNUSUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX1RBQkxFVCBpcyBub3Qgc2V0CitDT05GSUdfSU5QVVRfVE9VQ0hTQ1JFRU49eQorIyBDT05GSUdfVE9VQ0hTQ1JFRU5fQURTNzg0NiBpcyBub3Qgc2V0CisjIENPTkZJR19UT1VDSFNDUkVFTl9GVUpJVFNVIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RPVUNIU0NSRUVOX0dVTlpFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RPVUNIU0NSRUVOX0VMTyBpcyBub3Qgc2V0CisjIENPTkZJR19UT1VDSFNDUkVFTl9NVE9VQ0ggaXMgbm90IHNldAorIyBDT05GSUdfVE9VQ0hTQ1JFRU5fSU5FWElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RPVUNIU0NSRUVOX01LNzEyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RPVUNIU0NSRUVOX1BFTk1PVU5UIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RPVUNIU0NSRUVOX1RPVUNIUklHSFQgaXMgbm90IHNldAorIyBDT05GSUdfVE9VQ0hTQ1JFRU5fVE9VQ0hXSU4gaXMgbm90IHNldAorIyBDT05GSUdfVE9VQ0hTQ1JFRU5fVVNCX0NPTVBPU0lURSBpcyBub3Qgc2V0CisjIENPTkZJR19UT1VDSFNDUkVFTl9UT1VDSElUMjEzIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX01JU0MgaXMgbm90IHNldAorCisjCisjIEhhcmR3YXJlIEkvTyBwb3J0cworIworQ09ORklHX1NFUklPPXkKK0NPTkZJR19TRVJJT19JODA0Mj15CitDT05GSUdfU0VSSU9fU0VSUE9SVD15CisjIENPTkZJR19TRVJJT19BVDMyUFNJRiBpcyBub3Qgc2V0CitDT05GSUdfU0VSSU9fTElCUFMyPXkKKyMgQ09ORklHX1NFUklPX1JBVyBpcyBub3Qgc2V0CisjIENPTkZJR19HQU1FUE9SVCBpcyBub3Qgc2V0CisKKyMKKyMgQ2hhcmFjdGVyIGRldmljZXMKKyMKK0NPTkZJR19WVD15CitDT05GSUdfQ09OU09MRV9UUkFOU0xBVElPTlM9eQorQ09ORklHX1ZUX0NPTlNPTEU9eQorQ09ORklHX0hXX0NPTlNPTEU9eQorIyBDT05GSUdfVlRfSFdfQ09OU09MRV9CSU5ESU5HIGlzIG5vdCBzZXQKK0NPTkZJR19ERVZLTUVNPXkKKyMgQ09ORklHX1NFUklBTF9OT05TVEFOREFSRCBpcyBub3Qgc2V0CisKKyMKKyMgU2VyaWFsIGRyaXZlcnMKKyMKKyMgQ09ORklHX1NFUklBTF84MjUwIGlzIG5vdCBzZXQKKworIworIyBOb24tODI1MCBzZXJpYWwgcG9ydCBzdXBwb3J0CisjCitDT05GSUdfU0VSSUFMX0FUTUVMPXkKK0NPTkZJR19TRVJJQUxfQVRNRUxfQ09OU09MRT15CitDT05GSUdfU0VSSUFMX0FUTUVMX1BEQz15CisjIENPTkZJR19TRVJJQUxfQVRNRUxfVFRZQVQgaXMgbm90IHNldAorQ09ORklHX1NFUklBTF9DT1JFPXkKK0NPTkZJR19TRVJJQUxfQ09SRV9DT05TT0xFPXkKK0NPTkZJR19VTklYOThfUFRZUz15CisjIENPTkZJR19MRUdBQ1lfUFRZUyBpcyBub3Qgc2V0CisjIENPTkZJR19JUE1JX0hBTkRMRVIgaXMgbm90IHNldAorIyBDT05GSUdfSFdfUkFORE9NIGlzIG5vdCBzZXQKKyMgQ09ORklHX1IzOTY0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JBV19EUklWRVIgaXMgbm90IHNldAorIyBDT05GSUdfVENHX1RQTSBpcyBub3Qgc2V0CitDT05GSUdfSTJDPW0KK0NPTkZJR19JMkNfQk9BUkRJTkZPPXkKK0NPTkZJR19JMkNfQ0hBUkRFVj1tCitDT05GSUdfSTJDX0hFTFBFUl9BVVRPPXkKK0NPTkZJR19JMkNfQUxHT0JJVD1tCisKKyMKKyMgSTJDIEhhcmR3YXJlIEJ1cyBzdXBwb3J0CisjCisKKyMKKyMgSTJDIHN5c3RlbSBidXMgZHJpdmVycyAobW9zdGx5IGVtYmVkZGVkIC8gc3lzdGVtLW9uLWNoaXApCisjCitDT05GSUdfSTJDX0dQSU89bQorIyBDT05GSUdfSTJDX09DT1JFUyBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfU0lNVEVDIGlzIG5vdCBzZXQKKworIworIyBFeHRlcm5hbCBJMkMvU01CdXMgYWRhcHRlciBkcml2ZXJzCisjCisjIENPTkZJR19JMkNfUEFSUE9SVF9MSUdIVCBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfVEFPU19FVk0gaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1RJTllfVVNCIGlzIG5vdCBzZXQKKworIworIyBPdGhlciBJMkMvU01CdXMgYnVzIGRyaXZlcnMKKyMKKyMgQ09ORklHX0kyQ19QQ0FfUExBVEZPUk0gaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1NUVUIgaXMgbm90IHNldAorCisjCisjIE1pc2NlbGxhbmVvdXMgSTJDIENoaXAgc3VwcG9ydAorIworIyBDT05GSUdfRFMxNjgyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUMjQgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19FRVBST00gaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19QQ0Y4NTc0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1BDRjg1NzUgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19QQ0E5NTM5IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfUENGODU5MSBpcyBub3Qgc2V0CisjIENPTkZJR19UUFM2NTAxMCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX01BWDY4NzUgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19UU0wyNTUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19ERUJVR19DT1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19ERUJVR19BTEdPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19ERUJVR19CVVMgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0RFQlVHX0NISVAgaXMgbm90IHNldAorQ09ORklHX1NQST15CisjIENPTkZJR19TUElfREVCVUcgaXMgbm90IHNldAorQ09ORklHX1NQSV9NQVNURVI9eQorCisjCisjIFNQSSBNYXN0ZXIgQ29udHJvbGxlciBEcml2ZXJzCisjCitDT05GSUdfU1BJX0FUTUVMPXkKKyMgQ09ORklHX1NQSV9CSVRCQU5HIGlzIG5vdCBzZXQKKworIworIyBTUEkgUHJvdG9jb2wgTWFzdGVycworIworIyBDT05GSUdfU1BJX0FUMjUgaXMgbm90IHNldAorQ09ORklHX1NQSV9TUElERVY9bQorIyBDT05GSUdfU1BJX1RMRTYyWDAgaXMgbm90IHNldAorQ09ORklHX0FSQ0hfUkVRVUlSRV9HUElPTElCPXkKK0NPTkZJR19HUElPTElCPXkKKyMgQ09ORklHX0RFQlVHX0dQSU8gaXMgbm90IHNldAorIyBDT05GSUdfR1BJT19TWVNGUyBpcyBub3Qgc2V0CisKKyMKKyMgSTJDIEdQSU8gZXhwYW5kZXJzOgorIworIyBDT05GSUdfR1BJT19NQVg3MzJYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dQSU9fUENBOTUzWCBpcyBub3Qgc2V0CisjIENPTkZJR19HUElPX1BDRjg1N1ggaXMgbm90IHNldAorCisjCisjIFBDSSBHUElPIGV4cGFuZGVyczoKKyMKKworIworIyBTUEkgR1BJTyBleHBhbmRlcnM6CisjCisjIENPTkZJR19HUElPX01BWDczMDEgaXMgbm90IHNldAorIyBDT05GSUdfR1BJT19NQ1AyM1MwOCBpcyBub3Qgc2V0CisjIENPTkZJR19XMSBpcyBub3Qgc2V0CisjIENPTkZJR19QT1dFUl9TVVBQTFkgaXMgbm90IHNldAorIyBDT05GSUdfSFdNT04gaXMgbm90IHNldAorIyBDT05GSUdfVEhFUk1BTCBpcyBub3Qgc2V0CisjIENPTkZJR19USEVSTUFMX0hXTU9OIGlzIG5vdCBzZXQKK0NPTkZJR19XQVRDSERPRz15CisjIENPTkZJR19XQVRDSERPR19OT1dBWU9VVCBpcyBub3Qgc2V0CisKKyMKKyMgV2F0Y2hkb2cgRGV2aWNlIERyaXZlcnMKKyMKKyMgQ09ORklHX1NPRlRfV0FUQ0hET0cgaXMgbm90IHNldAorQ09ORklHX0FUMzJBUDcwMFhfV0RUPXkKKworIworIyBVU0ItYmFzZWQgV2F0Y2hkb2cgQ2FyZHMKKyMKKyMgQ09ORklHX1VTQlBDV0FUQ0hET0cgaXMgbm90IHNldAorCisjCisjIFNvbmljcyBTaWxpY29uIEJhY2twbGFuZQorIworQ09ORklHX1NTQl9QT1NTSUJMRT15CisjIENPTkZJR19TU0IgaXMgbm90IHNldAorCisjCisjIE11bHRpZnVuY3Rpb24gZGV2aWNlIGRyaXZlcnMKKyMKKyMgQ09ORklHX01GRF9DT1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9TTTUwMSBpcyBub3Qgc2V0CisjIENPTkZJR19IVENfUEFTSUMzIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9UTUlPIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9XTTg0MDAgaXMgbm90IHNldAorIyBDT05GSUdfTUZEX1dNODM1MF9JMkMgaXMgbm90IHNldAorCisjCisjIE11bHRpbWVkaWEgZGV2aWNlcworIworCisjCisjIE11bHRpbWVkaWEgY29yZSBzdXBwb3J0CisjCisjIENPTkZJR19WSURFT19ERVYgaXMgbm90IHNldAorIyBDT05GSUdfRFZCX0NPUkUgaXMgbm90IHNldAorIyBDT05GSUdfVklERU9fTUVESUEgaXMgbm90IHNldAorCisjCisjIE11bHRpbWVkaWEgZHJpdmVycworIworIyBDT05GSUdfREFCIGlzIG5vdCBzZXQKKworIworIyBHcmFwaGljcyBzdXBwb3J0CisjCisjIENPTkZJR19WR0FTVEFURSBpcyBub3Qgc2V0CisjIENPTkZJR19WSURFT19PVVRQVVRfQ09OVFJPTCBpcyBub3Qgc2V0CitDT05GSUdfRkI9eQorIyBDT05GSUdfRklSTVdBUkVfRURJRCBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9EREMgaXMgbm90IHNldAorIyBDT05GSUdfRkJfQk9PVF9WRVNBX1NVUFBPUlQgaXMgbm90IHNldAorQ09ORklHX0ZCX0NGQl9GSUxMUkVDVD15CitDT05GSUdfRkJfQ0ZCX0NPUFlBUkVBPXkKK0NPTkZJR19GQl9DRkJfSU1BR0VCTElUPXkKKyMgQ09ORklHX0ZCX0NGQl9SRVZfUElYRUxTX0lOX0JZVEUgaXMgbm90IHNldAorIyBDT05GSUdfRkJfU1lTX0ZJTExSRUNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX1NZU19DT1BZQVJFQSBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9TWVNfSU1BR0VCTElUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX0ZPUkVJR05fRU5ESUFOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX1NZU19GT1BTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX1NWR0FMSUIgaXMgbm90IHNldAorIyBDT05GSUdfRkJfTUFDTU9ERVMgaXMgbm90IHNldAorIyBDT05GSUdfRkJfQkFDS0xJR0hUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX01PREVfSEVMUEVSUyBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9USUxFQkxJVFRJTkcgaXMgbm90IHNldAorCisjCisjIEZyYW1lIGJ1ZmZlciBoYXJkd2FyZSBkcml2ZXJzCisjCisjIENPTkZJR19GQl9TMUQxM1hYWCBpcyBub3Qgc2V0CitDT05GSUdfRkJfQVRNRUw9eQorIyBDT05GSUdfRkJfVklSVFVBTCBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9NRVRST05PTUUgaXMgbm90IHNldAorIyBDT05GSUdfQkFDS0xJR0hUX0xDRF9TVVBQT1JUIGlzIG5vdCBzZXQKKworIworIyBEaXNwbGF5IGRldmljZSBzdXBwb3J0CisjCisjIENPTkZJR19ESVNQTEFZX1NVUFBPUlQgaXMgbm90IHNldAorCisjCisjIENvbnNvbGUgZGlzcGxheSBkcml2ZXIgc3VwcG9ydAorIworQ09ORklHX0RVTU1ZX0NPTlNPTEU9eQorQ09ORklHX0ZSQU1FQlVGRkVSX0NPTlNPTEU9eQorIyBDT05GSUdfRlJBTUVCVUZGRVJfQ09OU09MRV9ERVRFQ1RfUFJJTUFSWSBpcyBub3Qgc2V0CisjIENPTkZJR19GUkFNRUJVRkZFUl9DT05TT0xFX1JPVEFUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZPTlRTIGlzIG5vdCBzZXQKK0NPTkZJR19GT05UXzh4OD15CitDT05GSUdfRk9OVF84eDE2PXkKKyMgQ09ORklHX0xPR08gaXMgbm90IHNldAorQ09ORklHX1NPVU5EPW0KK0NPTkZJR19TT1VORF9PU1NfQ09SRT15CitDT05GSUdfU05EPW0KK0NPTkZJR19TTkRfVElNRVI9bQorQ09ORklHX1NORF9QQ009bQorQ09ORklHX1NORF9TRVFVRU5DRVI9bQorIyBDT05GSUdfU05EX1NFUV9EVU1NWSBpcyBub3Qgc2V0CitDT05GSUdfU05EX09TU0VNVUw9eQorQ09ORklHX1NORF9NSVhFUl9PU1M9bQorQ09ORklHX1NORF9QQ01fT1NTPW0KK0NPTkZJR19TTkRfUENNX09TU19QTFVHSU5TPXkKK0NPTkZJR19TTkRfU0VRVUVOQ0VSX09TUz15CisjIENPTkZJR19TTkRfRFlOQU1JQ19NSU5PUlMgaXMgbm90IHNldAorIyBDT05GSUdfU05EX1NVUFBPUlRfT0xEX0FQSSBpcyBub3Qgc2V0CitDT05GSUdfU05EX1ZFUkJPU0VfUFJPQ0ZTPXkKKyMgQ09ORklHX1NORF9WRVJCT1NFX1BSSU5USyBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfREVCVUcgaXMgbm90IHNldAorQ09ORklHX1NORF9EUklWRVJTPXkKKyMgQ09ORklHX1NORF9EVU1NWSBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfVklSTUlESSBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfTVRQQVYgaXMgbm90IHNldAorIyBDT05GSUdfU05EX1NFUklBTF9VMTY1NTAgaXMgbm90IHNldAorIyBDT05GSUdfU05EX01QVTQwMSBpcyBub3Qgc2V0CitDT05GSUdfU05EX1NQST15CitDT05GSUdfU05EX1VTQj15CisjIENPTkZJR19TTkRfVVNCX0FVRElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9VU0JfQ0FJQVEgaXMgbm90IHNldAorIyBDT05GSUdfU05EX1NPQyBpcyBub3Qgc2V0CisjIENPTkZJR19TT1VORF9QUklNRSBpcyBub3Qgc2V0CitDT05GSUdfSElEX1NVUFBPUlQ9eQorQ09ORklHX0hJRD15CisjIENPTkZJR19ISURfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfSElEUkFXIGlzIG5vdCBzZXQKKworIworIyBVU0IgSW5wdXQgRGV2aWNlcworIworQ09ORklHX1VTQl9ISUQ9bQorIyBDT05GSUdfSElEX1BJRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfSElEREVWIGlzIG5vdCBzZXQKKworIworIyBVU0IgSElEIEJvb3QgUHJvdG9jb2wgZHJpdmVycworIworIyBDT05GSUdfVVNCX0tCRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfTU9VU0UgaXMgbm90IHNldAorCisjCisjIFNwZWNpYWwgSElEIGRyaXZlcnMKKyMKK0NPTkZJR19ISURfQ09NUEFUPXkKK0NPTkZJR19ISURfQTRURUNIPW0KK0NPTkZJR19ISURfQVBQTEU9bQorQ09ORklHX0hJRF9CRUxLSU49bQorQ09ORklHX0hJRF9CUklHSFQ9bQorQ09ORklHX0hJRF9DSEVSUlk9bQorQ09ORklHX0hJRF9DSElDT05ZPW0KK0NPTkZJR19ISURfQ1lQUkVTUz1tCitDT05GSUdfSElEX0RFTEw9bQorQ09ORklHX0hJRF9FWktFWT1tCitDT05GSUdfSElEX0dZUkFUSU9OPW0KK0NPTkZJR19ISURfTE9HSVRFQ0g9bQorIyBDT05GSUdfTE9HSVRFQ0hfRkYgaXMgbm90IHNldAorIyBDT05GSUdfTE9HSVJVTUJMRVBBRDJfRkYgaXMgbm90IHNldAorQ09ORklHX0hJRF9NSUNST1NPRlQ9bQorQ09ORklHX0hJRF9NT05URVJFWT1tCitDT05GSUdfSElEX1BBTlRIRVJMT1JEPW0KKyMgQ09ORklHX1BBTlRIRVJMT1JEX0ZGIGlzIG5vdCBzZXQKK0NPTkZJR19ISURfUEVUQUxZTlg9bQorQ09ORklHX0hJRF9TQU1TVU5HPW0KK0NPTkZJR19ISURfU09OWT1tCitDT05GSUdfSElEX1NVTlBMVVM9bQorQ09ORklHX1RIUlVTVE1BU1RFUl9GRj1tCitDT05GSUdfWkVST1BMVVNfRkY9bQorQ09ORklHX1VTQl9TVVBQT1JUPXkKK0NPTkZJR19VU0JfQVJDSF9IQVNfSENEPXkKKyMgQ09ORklHX1VTQl9BUkNIX0hBU19PSENJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9BUkNIX0hBU19FSENJIGlzIG5vdCBzZXQKK0NPTkZJR19VU0I9bQorIyBDT05GSUdfVVNCX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9BTk5PVU5DRV9ORVdfREVWSUNFUyBpcyBub3Qgc2V0CisKKyMKKyMgTWlzY2VsbGFuZW91cyBVU0Igb3B0aW9ucworIworQ09ORklHX1VTQl9ERVZJQ0VGUz15CisjIENPTkZJR19VU0JfREVWSUNFX0NMQVNTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9EWU5BTUlDX01JTk9SUyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfT1RHIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9PVEdfV0hJVEVMSVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9PVEdfQkxBQ0tMSVNUX0hVQiBpcyBub3Qgc2V0CitDT05GSUdfVVNCX01PTj15CisKKyMKKyMgVVNCIEhvc3QgQ29udHJvbGxlciBEcml2ZXJzCisjCisjIENPTkZJR19VU0JfQzY3WDAwX0hDRCBpcyBub3Qgc2V0CitDT05GSUdfVVNCX0lTUDExNlhfSENEPW0KKyMgQ09ORklHX1VTQl9JU1AxNzYwX0hDRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0w4MTFfSENEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9SOEE2NjU5N19IQ0QgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX01VU0JfSERSQyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfR0FER0VUX01VU0JfSERSQyBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIERldmljZSBDbGFzcyBkcml2ZXJzCisjCisjIENPTkZJR19VU0JfQUNNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9QUklOVEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9XRE0gaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1RNQyBpcyBub3Qgc2V0CisKKyMKKyMgTk9URTogVVNCX1NUT1JBR0UgZW5hYmxlcyBTQ1NJLCBhbmQgJ1NDU0kgZGlzayBzdXBwb3J0JworIworCisjCisjIG1heSBhbHNvIGJlIG5lZWRlZDsgc2VlIFVTQl9TVE9SQUdFIEhlbHAgZm9yIG1vcmUgaW5mb3JtYXRpb24KKyMKK0NPTkZJR19VU0JfU1RPUkFHRT1tCisjIENPTkZJR19VU0JfU1RPUkFHRV9ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1RPUkFHRV9EQVRBRkFCIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TVE9SQUdFX0ZSRUVDT00gaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NUT1JBR0VfSVNEMjAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TVE9SQUdFX0RQQ00gaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NUT1JBR0VfVVNCQVQgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NUT1JBR0VfU0REUjA5IGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TVE9SQUdFX1NERFI1NSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1RPUkFHRV9KVU1QU0hPVCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1RPUkFHRV9BTEFVREEgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NUT1JBR0VfT05FVE9VQ0ggaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NUT1JBR0VfS0FSTUEgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NUT1JBR0VfQ1lQUkVTU19BVEFDQiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfTElCVVNVQUwgaXMgbm90IHNldAorCisjCisjIFVTQiBJbWFnaW5nIGRldmljZXMKKyMKKyMgQ09ORklHX1VTQl9NREM4MDAgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX01JQ1JPVEVLIGlzIG5vdCBzZXQKKworIworIyBVU0IgcG9ydCBkcml2ZXJzCisjCisjIENPTkZJR19VU0JfU0VSSUFMIGlzIG5vdCBzZXQKKworIworIyBVU0IgTWlzY2VsbGFuZW91cyBkcml2ZXJzCisjCisjIENPTkZJR19VU0JfRU1JNjIgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0VNSTI2IGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9BRFVUVVggaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NFVlNFRyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfUklPNTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9MRUdPVE9XRVIgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0xDRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfQkVSUllfQ0hBUkdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9MRUQgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0NZUFJFU1NfQ1k3QzYzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9DWVRIRVJNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9QSElER0VUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9JRE1PVVNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9GVERJX0VMQU4gaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0FQUExFRElTUExBWSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfTEQgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1RSQU5DRVZJQlJBVE9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9JT1dBUlJJT1IgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1RFU1QgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0lTSUdIVEZXIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9WU1QgaXMgbm90IHNldAorQ09ORklHX1VTQl9HQURHRVQ9eQorIyBDT05GSUdfVVNCX0dBREdFVF9ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfR0FER0VUX0RFQlVHX0ZJTEVTIGlzIG5vdCBzZXQKK0NPTkZJR19VU0JfR0FER0VUX1ZCVVNfRFJBVz0yCitDT05GSUdfVVNCX0dBREdFVF9TRUxFQ1RFRD15CisjIENPTkZJR19VU0JfR0FER0VUX0FUOTEgaXMgbm90IHNldAorQ09ORklHX1VTQl9HQURHRVRfQVRNRUxfVVNCQT15CitDT05GSUdfVVNCX0FUTUVMX1VTQkE9eQorIyBDT05GSUdfVVNCX0dBREdFVF9GU0xfVVNCMiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfR0FER0VUX0xIN0E0MFggaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0dBREdFVF9PTUFQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9HQURHRVRfUFhBMjVYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9HQURHRVRfUFhBMjdYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9HQURHRVRfUzNDMjQxMCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfR0FER0VUX002NjU5MiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfR0FER0VUX0FNRDU1MzZVREMgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0dBREdFVF9GU0xfUUUgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0dBREdFVF9ORVQyMjgwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9HQURHRVRfR09LVSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfR0FER0VUX0RVTU1ZX0hDRCBpcyBub3Qgc2V0CitDT05GSUdfVVNCX0dBREdFVF9EVUFMU1BFRUQ9eQorQ09ORklHX1VTQl9aRVJPPW0KK0NPTkZJR19VU0JfRVRIPW0KK0NPTkZJR19VU0JfRVRIX1JORElTPXkKK0NPTkZJR19VU0JfR0FER0VURlM9bQorQ09ORklHX1VTQl9GSUxFX1NUT1JBR0U9bQorIyBDT05GSUdfVVNCX0ZJTEVfU1RPUkFHRV9URVNUIGlzIG5vdCBzZXQKK0NPTkZJR19VU0JfR19TRVJJQUw9bQorIyBDT05GSUdfVVNCX01JRElfR0FER0VUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9HX1BSSU5URVIgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0NEQ19DT01QT1NJVEUgaXMgbm90IHNldAorQ09ORklHX01NQz1tCisjIENPTkZJR19NTUNfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfTU1DX1VOU0FGRV9SRVNVTUUgaXMgbm90IHNldAorCisjCisjIE1NQy9TRC9TRElPIENhcmQgRHJpdmVycworIworQ09ORklHX01NQ19CTE9DSz1tCitDT05GSUdfTU1DX0JMT0NLX0JPVU5DRT15CisjIENPTkZJR19TRElPX1VBUlQgaXMgbm90IHNldAorIyBDT05GSUdfTU1DX1RFU1QgaXMgbm90IHNldAorCisjCisjIE1NQy9TRC9TRElPIEhvc3QgQ29udHJvbGxlciBEcml2ZXJzCisjCisjIENPTkZJR19NTUNfU0RIQ0kgaXMgbm90IHNldAorQ09ORklHX01NQ19BVE1FTE1DST1tCisjIENPTkZJR19NTUNfU1BJIGlzIG5vdCBzZXQKKyMgQ09ORklHX01FTVNUSUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FV19MRURTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FDQ0VTU0lCSUxJVFkgaXMgbm90IHNldAorQ09ORklHX1JUQ19MSUI9eQorQ09ORklHX1JUQ19DTEFTUz15CitDT05GSUdfUlRDX0hDVE9TWVM9eQorQ09ORklHX1JUQ19IQ1RPU1lTX0RFVklDRT0icnRjMCIKKyMgQ09ORklHX1JUQ19ERUJVRyBpcyBub3Qgc2V0CisKKyMKKyMgUlRDIGludGVyZmFjZXMKKyMKK0NPTkZJR19SVENfSU5URl9TWVNGUz15CitDT05GSUdfUlRDX0lOVEZfUFJPQz15CitDT05GSUdfUlRDX0lOVEZfREVWPXkKKyMgQ09ORklHX1JUQ19JTlRGX0RFVl9VSUVfRU1VTCBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX1RFU1QgaXMgbm90IHNldAorCisjCisjIEkyQyBSVEMgZHJpdmVycworIworIyBDT05GSUdfUlRDX0RSVl9EUzEzMDcgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9EUzEzNzQgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9EUzE2NzIgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9NQVg2OTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfUlM1QzM3MiBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX0lTTDEyMDggaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9YMTIwNSBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX1BDRjg1NjMgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9QQ0Y4NTgzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfTTQxVDgwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfUzM1MzkwQSBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX0ZNMzEzMCBpcyBub3Qgc2V0CisKKyMKKyMgU1BJIFJUQyBkcml2ZXJzCisjCisjIENPTkZJR19SVENfRFJWX000MVQ5NCBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX0RTMTMwNSBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX01BWDY5MDIgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9SOTcwMSBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX1JTNUMzNDggaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9EUzMyMzQgaXMgbm90IHNldAorCisjCisjIFBsYXRmb3JtIFJUQyBkcml2ZXJzCisjCisjIENPTkZJR19SVENfRFJWX0RTMTI4NiBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX0RTMTUxMSBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX0RTMTU1MyBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX0RTMTc0MiBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX1NUSzE3VEE4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfTTQ4VDg2IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfTTQ4VDM1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfTTQ4VDU5IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfQlE0ODAyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfVjMwMjAgaXMgbm90IHNldAorCisjCisjIG9uLUNQVSBSVEMgZHJpdmVycworIworQ09ORklHX1JUQ19EUlZfQVQzMkFQNzAwWD15CisjIENPTkZJR19ETUFERVZJQ0VTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VJTyBpcyBub3Qgc2V0CisjIENPTkZJR19TVEFHSU5HIGlzIG5vdCBzZXQKKworIworIyBGaWxlIHN5c3RlbXMKKyMKK0NPTkZJR19FWFQyX0ZTPW0KKyMgQ09ORklHX0VYVDJfRlNfWEFUVFIgaXMgbm90IHNldAorIyBDT05GSUdfRVhUMl9GU19YSVAgaXMgbm90IHNldAorIyBDT05GSUdfRVhUM19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19FWFQ0X0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JFSVNFUkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19GU19QT1NJWF9BQ0wgaXMgbm90IHNldAorQ09ORklHX0ZJTEVfTE9DS0lORz15CisjIENPTkZJR19YRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfT0NGUzJfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRE5PVElGWSBpcyBub3Qgc2V0CitDT05GSUdfSU5PVElGWT15CitDT05GSUdfSU5PVElGWV9VU0VSPXkKKyMgQ09ORklHX1FVT1RBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FVVE9GU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19BVVRPRlM0X0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZVU0VfRlMgaXMgbm90IHNldAorCisjCisjIENELVJPTS9EVkQgRmlsZXN5c3RlbXMKKyMKKyMgQ09ORklHX0lTTzk2NjBfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVURGX0ZTIGlzIG5vdCBzZXQKKworIworIyBET1MvRkFUL05UIEZpbGVzeXN0ZW1zCisjCitDT05GSUdfRkFUX0ZTPXkKK0NPTkZJR19NU0RPU19GUz15CitDT05GSUdfVkZBVF9GUz1tCitDT05GSUdfRkFUX0RFRkFVTFRfQ09ERVBBR0U9ODUwCitDT05GSUdfRkFUX0RFRkFVTFRfSU9DSEFSU0VUPSJpc284ODU5LTEiCisjIENPTkZJR19OVEZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBQc2V1ZG8gZmlsZXN5c3RlbXMKKyMKK0NPTkZJR19QUk9DX0ZTPXkKKyMgQ09ORklHX1BST0NfS0NPUkUgaXMgbm90IHNldAorQ09ORklHX1BST0NfU1lTQ1RMPXkKK0NPTkZJR19QUk9DX1BBR0VfTU9OSVRPUj15CitDT05GSUdfU1lTRlM9eQorQ09ORklHX1RNUEZTPXkKKyMgQ09ORklHX1RNUEZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0CisjIENPTkZJR19IVUdFVExCX1BBR0UgaXMgbm90IHNldAorQ09ORklHX0NPTkZJR0ZTX0ZTPXkKKworIworIyBNaXNjZWxsYW5lb3VzIGZpbGVzeXN0ZW1zCisjCisjIENPTkZJR19BREZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FGRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hGU1BMVVNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQkVGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19CRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRUZTX0ZTIGlzIG5vdCBzZXQKK0NPTkZJR19KRkZTMl9GUz15CitDT05GSUdfSkZGUzJfRlNfREVCVUc9MAorQ09ORklHX0pGRlMyX0ZTX1dSSVRFQlVGRkVSPXkKKyMgQ09ORklHX0pGRlMyX0ZTX1dCVUZfVkVSSUZZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGRlMyX1NVTU1BUlkgaXMgbm90IHNldAorIyBDT05GSUdfSkZGUzJfRlNfWEFUVFIgaXMgbm90IHNldAorIyBDT05GSUdfSkZGUzJfQ09NUFJFU1NJT05fT1BUSU9OUyBpcyBub3Qgc2V0CitDT05GSUdfSkZGUzJfWkxJQj15CisjIENPTkZJR19KRkZTMl9MWk8gaXMgbm90IHNldAorQ09ORklHX0pGRlMyX1JUSU1FPXkKKyMgQ09ORklHX0pGRlMyX1JVQklOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQU1GUyBpcyBub3Qgc2V0CisjIENPTkZJR19WWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01JTklYX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX09NRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSFBGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19RTlg0RlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUk9NRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfU1lTVl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19VRlNfRlMgaXMgbm90IHNldAorQ09ORklHX05FVFdPUktfRklMRVNZU1RFTVM9eQorQ09ORklHX05GU19GUz15CitDT05GSUdfTkZTX1YzPXkKKyMgQ09ORklHX05GU19WM19BQ0wgaXMgbm90IHNldAorIyBDT05GSUdfTkZTX1Y0IGlzIG5vdCBzZXQKK0NPTkZJR19ST09UX05GUz15CisjIENPTkZJR19ORlNEIGlzIG5vdCBzZXQKK0NPTkZJR19MT0NLRD15CitDT05GSUdfTE9DS0RfVjQ9eQorQ09ORklHX05GU19DT01NT049eQorQ09ORklHX1NVTlJQQz15CisjIENPTkZJR19TVU5SUENfUkVHSVNURVJfVjQgaXMgbm90IHNldAorIyBDT05GSUdfUlBDU0VDX0dTU19LUkI1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JQQ1NFQ19HU1NfU1BLTTMgaXMgbm90IHNldAorIyBDT05GSUdfU01CX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NJRlMgaXMgbm90IHNldAorIyBDT05GSUdfTkNQX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NPREFfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQUZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBQYXJ0aXRpb24gVHlwZXMKKyMKKyMgQ09ORklHX1BBUlRJVElPTl9BRFZBTkNFRCBpcyBub3Qgc2V0CitDT05GSUdfTVNET1NfUEFSVElUSU9OPXkKK0NPTkZJR19OTFM9eQorQ09ORklHX05MU19ERUZBVUxUPSJpc284ODU5LTEiCitDT05GSUdfTkxTX0NPREVQQUdFXzQzNz1tCisjIENPTkZJR19OTFNfQ09ERVBBR0VfNzM3IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV83NzUgaXMgbm90IHNldAorQ09ORklHX05MU19DT0RFUEFHRV84NTA9bQorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg1MiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODU1IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NTcgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODYxIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjIgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODY0IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjUgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2NiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODY5IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV85MzYgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzk1MCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfOTMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV85NDkgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg3NCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV84IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV8xMjUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV8xMjUxIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19BU0NJSSBpcyBub3Qgc2V0CitDT05GSUdfTkxTX0lTTzg4NTlfMT1tCisjIENPTkZJR19OTFNfSVNPODg1OV8yIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzMgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfNCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV81IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzYgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfNyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV85IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzEzIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzE0IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzE1IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19LT0k4X1IgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0tPSThfVSBpcyBub3Qgc2V0CitDT05GSUdfTkxTX1VURjg9bQorIyBDT05GSUdfRExNIGlzIG5vdCBzZXQKKworIworIyBLZXJuZWwgaGFja2luZworIworIyBDT05GSUdfUFJJTlRLX1RJTUUgaXMgbm90IHNldAorQ09ORklHX0VOQUJMRV9XQVJOX0RFUFJFQ0FURUQ9eQorQ09ORklHX0VOQUJMRV9NVVNUX0NIRUNLPXkKK0NPTkZJR19GUkFNRV9XQVJOPTEwMjQKK0NPTkZJR19NQUdJQ19TWVNSUT15CisjIENPTkZJR19VTlVTRURfU1lNQk9MUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IRUFERVJTX0NIRUNLIGlzIG5vdCBzZXQKK0NPTkZJR19ERUJVR19LRVJORUw9eQorIyBDT05GSUdfREVCVUdfU0hJUlEgaXMgbm90IHNldAorQ09ORklHX0RFVEVDVF9TT0ZUTE9DS1VQPXkKKyMgQ09ORklHX0JPT1RQQVJBTV9TT0ZUTE9DS1VQX1BBTklDIGlzIG5vdCBzZXQKK0NPTkZJR19CT09UUEFSQU1fU09GVExPQ0tVUF9QQU5JQ19WQUxVRT0wCitDT05GSUdfU0NIRURfREVCVUc9eQorIyBDT05GSUdfU0NIRURTVEFUUyBpcyBub3Qgc2V0CisjIENPTkZJR19USU1FUl9TVEFUUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19PQkpFQ1RTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NMVUJfREVCVUdfT04gaXMgbm90IHNldAorIyBDT05GSUdfU0xVQl9TVEFUUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19SVF9NVVRFWEVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUX01VVEVYX1RFU1RFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TUElOTE9DSyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19NVVRFWEVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0xPQ0tfQUxMT0MgaXMgbm90IHNldAorIyBDT05GSUdfUFJPVkVfTE9DS0lORyBpcyBub3Qgc2V0CisjIENPTkZJR19MT0NLX1NUQVQgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU1BJTkxPQ0tfU0xFRVAgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfTE9DS0lOR19BUElfU0VMRlRFU1RTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0tPQkpFQ1QgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX0JVR1ZFUkJPU0U9eQorIyBDT05GSUdfREVCVUdfSU5GTyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19WTSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19XUklURUNPVU5UIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX01FTU9SWV9JTklUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0xJU1QgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU0cgaXMgbm90IHNldAorQ09ORklHX0ZSQU1FX1BPSU5URVI9eQorIyBDT05GSUdfQk9PVF9QUklOVEtfREVMQVkgaXMgbm90IHNldAorIyBDT05GSUdfUkNVX1RPUlRVUkVfVEVTVCBpcyBub3Qgc2V0CisjIENPTkZJR19SQ1VfQ1BVX1NUQUxMX0RFVEVDVE9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tQUk9CRVNfU0FOSVRZX1RFU1QgaXMgbm90IHNldAorIyBDT05GSUdfQkFDS1RSQUNFX1NFTEZfVEVTVCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19CTE9DS19FWFRfREVWVCBpcyBub3Qgc2V0CisjIENPTkZJR19MS0RUTSBpcyBub3Qgc2V0CisjIENPTkZJR19GQVVMVF9JTkpFQ1RJT04gaXMgbm90IHNldAorIyBDT05GSUdfRFlOQU1JQ19QUklOVEtfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfU0FNUExFUyBpcyBub3Qgc2V0CisKKyMKKyMgU2VjdXJpdHkgb3B0aW9ucworIworIyBDT05GSUdfS0VZUyBpcyBub3Qgc2V0CisjIENPTkZJR19TRUNVUklUWSBpcyBub3Qgc2V0CisjIENPTkZJR19TRUNVUklUWUZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFQ1VSSVRZX0ZJTEVfQ0FQQUJJTElUSUVTIGlzIG5vdCBzZXQKK0NPTkZJR19DUllQVE89eQorCisjCisjIENyeXB0byBjb3JlIG9yIGhlbHBlcgorIworIyBDT05GSUdfQ1JZUFRPX0ZJUFMgaXMgbm90IHNldAorQ09ORklHX0NSWVBUT19BTEdBUEk9eQorQ09ORklHX0NSWVBUT19BRUFEPXkKK0NPTkZJR19DUllQVE9fQkxLQ0lQSEVSPXkKK0NPTkZJR19DUllQVE9fSEFTSD15CitDT05GSUdfQ1JZUFRPX1JORz15CitDT05GSUdfQ1JZUFRPX01BTkFHRVI9eQorIyBDT05GSUdfQ1JZUFRPX0dGMTI4TVVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19OVUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19DUllQVEQgaXMgbm90IHNldAorQ09ORklHX0NSWVBUT19BVVRIRU5DPXkKKyMgQ09ORklHX0NSWVBUT19URVNUIGlzIG5vdCBzZXQKKworIworIyBBdXRoZW50aWNhdGVkIEVuY3J5cHRpb24gd2l0aCBBc3NvY2lhdGVkIERhdGEKKyMKKyMgQ09ORklHX0NSWVBUT19DQ00gaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0dDTSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0VRSVYgaXMgbm90IHNldAorCisjCisjIEJsb2NrIG1vZGVzCisjCitDT05GSUdfQ1JZUFRPX0NCQz15CisjIENPTkZJR19DUllQVE9fQ1RSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19DVFMgaXMgbm90IHNldAorQ09ORklHX0NSWVBUT19FQ0I9bQorIyBDT05GSUdfQ1JZUFRPX0xSVyBpcyBub3Qgc2V0CitDT05GSUdfQ1JZUFRPX1BDQkM9bQorIyBDT05GSUdfQ1JZUFRPX1hUUyBpcyBub3Qgc2V0CisKKyMKKyMgSGFzaCBtb2RlcworIworQ09ORklHX0NSWVBUT19ITUFDPXkKKyMgQ09ORklHX0NSWVBUT19YQ0JDIGlzIG5vdCBzZXQKKworIworIyBEaWdlc3QKKyMKKyMgQ09ORklHX0NSWVBUT19DUkMzMkMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX01ENCBpcyBub3Qgc2V0CitDT05GSUdfQ1JZUFRPX01ENT15CisjIENPTkZJR19DUllQVE9fTUlDSEFFTF9NSUMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1JNRDEyOCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fUk1EMTYwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19STUQyNTYgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1JNRDMyMCBpcyBub3Qgc2V0CitDT05GSUdfQ1JZUFRPX1NIQTE9eQorIyBDT05GSUdfQ1JZUFRPX1NIQTI1NiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0hBNTEyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19UR1IxOTIgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1dQNTEyIGlzIG5vdCBzZXQKKworIworIyBDaXBoZXJzCisjCisjIENPTkZJR19DUllQVE9fQUVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19BTlVCSVMgaXMgbm90IHNldAorQ09ORklHX0NSWVBUT19BUkM0PW0KKyMgQ09ORklHX0NSWVBUT19CTE9XRklTSCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQ0FNRUxMSUEgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0NBU1Q1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19DQVNUNiBpcyBub3Qgc2V0CitDT05GSUdfQ1JZUFRPX0RFUz15CisjIENPTkZJR19DUllQVE9fRkNSWVBUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19LSEFaQUQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1NBTFNBMjAgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1NFRUQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1NFUlBFTlQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1RFQSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fVFdPRklTSCBpcyBub3Qgc2V0CisKKyMKKyMgQ29tcHJlc3Npb24KKyMKK0NPTkZJR19DUllQVE9fREVGTEFURT15CisjIENPTkZJR19DUllQVE9fTFpPIGlzIG5vdCBzZXQKKworIworIyBSYW5kb20gTnVtYmVyIEdlbmVyYXRpb24KKyMKKyMgQ09ORklHX0NSWVBUT19BTlNJX0NQUk5HIGlzIG5vdCBzZXQKK0NPTkZJR19DUllQVE9fSFc9eQorCisjCisjIExpYnJhcnkgcm91dGluZXMKKyMKK0NPTkZJR19CSVRSRVZFUlNFPXkKK0NPTkZJR19DUkNfQ0NJVFQ9bQorIyBDT05GSUdfQ1JDMTYgaXMgbm90IHNldAorIyBDT05GSUdfQ1JDX1QxMERJRiBpcyBub3Qgc2V0CitDT05GSUdfQ1JDX0lUVV9UPW0KK0NPTkZJR19DUkMzMj15CitDT05GSUdfQ1JDNz1tCisjIENPTkZJR19MSUJDUkMzMkMgaXMgbm90IHNldAorQ09ORklHX1pMSUJfSU5GTEFURT15CitDT05GSUdfWkxJQl9ERUZMQVRFPXkKK0NPTkZJR19HRU5FUklDX0FMTE9DQVRPUj15CitDT05GSUdfUExJU1Q9eQorQ09ORklHX0hBU19JT01FTT15CitDT05GSUdfSEFTX0lPUE9SVD15CitDT05GSUdfSEFTX0RNQT15CmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL2luY2x1ZGUvYXNtL0tidWlsZCBiL2FyY2gvYXZyMzIvaW5jbHVkZS9hc20vS2J1aWxkCmluZGV4IDIxOTgyMmMuLjMxMzY2MjggMTAwNjQ0Ci0tLSBhL2FyY2gvYXZyMzIvaW5jbHVkZS9hc20vS2J1aWxkCisrKyBiL2FyY2gvYXZyMzIvaW5jbHVkZS9hc20vS2J1aWxkCkBAIC0xLDQgKzEsMyBAQAogaW5jbHVkZSBpbmNsdWRlL2FzbS1nZW5lcmljL0tidWlsZC5hc20KIAotaGVhZGVyLXkJKz0gc3dhYi5oCiBoZWFkZXIteQkrPSBjYWNoZWN0bC5oCmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL2luY2x1ZGUvYXNtL2F0bWVsLW1jaS5oIGIvYXJjaC9hdnIzMi9pbmNsdWRlL2FzbS9hdG1lbC1tY2kuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTlmM2ZhZC4uMDAwMDAwMAotLS0gYS9hcmNoL2F2cjMyL2luY2x1ZGUvYXNtL2F0bWVsLW1jaS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotI2lmbmRlZiBfX0FTTV9BVlIzMl9BVE1FTF9NQ0lfSAotI2RlZmluZSBfX0FTTV9BVlIzMl9BVE1FTF9NQ0lfSAotCi0jZGVmaW5lIEFUTUVMX01DSV9NQVhfTlJfU0xPVFMJMgotCi1zdHJ1Y3QgZG1hX3NsYXZlOwotCi0vKioKLSAqIHN0cnVjdCBtY2lfc2xvdF9wZGF0YSAtIGJvYXJkLXNwZWNpZmljIHBlci1zbG90IGNvbmZpZ3VyYXRpb24KLSAqIEBidXNfd2lkdGg6IE51bWJlciBvZiBkYXRhIGxpbmVzIHdpcmVkIHVwIHRoZSBzbG90Ci0gKiBAZGV0ZWN0X3BpbjogR1BJTyBwaW4gd2lyZWQgdG8gdGhlIGNhcmQgZGV0ZWN0IHN3aXRjaAotICogQHdwX3BpbjogR1BJTyBwaW4gd2lyZWQgdG8gdGhlIHdyaXRlIHByb3RlY3Qgc2Vuc29yCi0gKgotICogSWYgYSBnaXZlbiBzbG90IGlzIG5vdCBwcmVzZW50IG9uIHRoZSBib2FyZCwgQGJ1c193aWR0aCBzaG91bGQgYmUKLSAqIHNldCB0byAwLiBUaGUgb3RoZXIgZmllbGRzIGFyZSBpZ25vcmVkIGluIHRoaXMgY2FzZS4KLSAqCi0gKiBBbnkgcGlucyB0aGF0IGFyZW4ndCBhdmFpbGFibGUgc2hvdWxkIGJlIHNldCB0byBhIG5lZ2F0aXZlIHZhbHVlLgotICoKLSAqIE5vdGUgdGhhdCBzdXBwb3J0IGZvciBtdWx0aXBsZSBzbG90cyBpcyBleHBlcmltZW50YWwgLS0gc29tZSBjYXJkcwotICogbWlnaHQgZ2V0IHVwc2V0IGlmIHdlIGRvbid0IGdldCB0aGUgY2xvY2sgbWFuYWdlbWVudCBleGFjdGx5IHJpZ2h0LgotICogQnV0IGluIG1vc3QgY2FzZXMsIGl0IHNob3VsZCB3b3JrIGp1c3QgZmluZS4KLSAqLwotc3RydWN0IG1jaV9zbG90X3BkYXRhIHsKLQl1bnNpZ25lZCBpbnQJCWJ1c193aWR0aDsKLQlpbnQJCQlkZXRlY3RfcGluOwotCWludAkJCXdwX3BpbjsKLX07Ci0KLS8qKgotICogc3RydWN0IG1jaV9wbGF0Zm9ybV9kYXRhIC0gYm9hcmQtc3BlY2lmaWMgTU1DL1NEY2FyZCBjb25maWd1cmF0aW9uCi0gKiBAZG1hX3NsYXZlOiBETUEgc2xhdmUgaW50ZXJmYWNlIHRvIHVzZSBpbiBkYXRhIHRyYW5zZmVycywgb3IgTlVMTC4KLSAqIEBzbG90OiBQZXItc2xvdCBjb25maWd1cmF0aW9uIGRhdGEuCi0gKi8KLXN0cnVjdCBtY2lfcGxhdGZvcm1fZGF0YSB7Ci0Jc3RydWN0IGRtYV9zbGF2ZQkqZG1hX3NsYXZlOwotCXN0cnVjdCBtY2lfc2xvdF9wZGF0YQlzbG90W0FUTUVMX01DSV9NQVhfTlJfU0xPVFNdOwotfTsKLQotI2VuZGlmIC8qIF9fQVNNX0FWUjMyX0FUTUVMX01DSV9IICovCmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL2luY2x1ZGUvYXNtL2J5dGVvcmRlci5oIGIvYXJjaC9hdnIzMi9pbmNsdWRlL2FzbS9ieXRlb3JkZXIuaAppbmRleCAyYWJhNjRiLi41MGFiYzIxIDEwMDY0NAotLS0gYS9hcmNoL2F2cjMyL2luY2x1ZGUvYXNtL2J5dGVvcmRlci5oCisrKyBiL2FyY2gvYXZyMzIvaW5jbHVkZS9hc20vYnl0ZW9yZGVyLmgKQEAgLTQsNyArNCw2IEBACiAjaWZuZGVmIF9fQVNNX0FWUjMyX0JZVEVPUkRFUl9ICiAjZGVmaW5lIF9fQVNNX0FWUjMyX0JZVEVPUkRFUl9ICiAKLSNpbmNsdWRlIDxhc20vc3dhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2J5dGVvcmRlci9iaWdfZW5kaWFuLmg+CiAKICNlbmRpZiAvKiBfX0FTTV9BVlIzMl9CWVRFT1JERVJfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hdnIzMi9pbmNsdWRlL2FzbS9rZGVidWcuaCBiL2FyY2gvYXZyMzIvaW5jbHVkZS9hc20va2RlYnVnLmgKaW5kZXggY2E0Zjk1NC4uZjkzMGNlMiAxMDA2NDQKLS0tIGEvYXJjaC9hdnIzMi9pbmNsdWRlL2FzbS9rZGVidWcuaAorKysgYi9hcmNoL2F2cjMyL2luY2x1ZGUvYXNtL2tkZWJ1Zy5oCkBAIC02LDYgKzYsNyBAQAogCURJRV9CUkVBS1BPSU5ULAogCURJRV9TU1RFUCwKIAlESUVfTk1JLAorCURJRV9PT1BTLAogfTsKIAogI2VuZGlmIC8qIF9fQVNNX0FWUjMyX0tERUJVR19IICovCmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL2luY2x1ZGUvYXNtL3N5c2NhbGxzLmggYi9hcmNoL2F2cjMyL2luY2x1ZGUvYXNtL3N5c2NhbGxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDgzZDY2NgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXZyMzIvaW5jbHVkZS9hc20vc3lzY2FsbHMuaApAQCAtMCwwICsxLDM5IEBACisvKgorICogc3lzY2FsbHMuaCAtIExpbnV4IHN5c2NhbGwgaW50ZXJmYWNlcyAoYXJjaC1zcGVjaWZpYykKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSmFzd2luZGVyIFNpbmdoCisgKgorICogVGhpcyBmaWxlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBHUEx2Mi4KKyAqIFNlZSB0aGUgZmlsZSBDT1BZSU5HIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2lmbmRlZiBfQVNNX0FWUjMyX1NZU0NBTExTX0gKKyNkZWZpbmUgX0FTTV9BVlIzMl9TWVNDQUxMU19ICisKKyNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgorI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgorCisvKiBrZXJuZWwvcHJvY2Vzcy5jICovCithc21saW5rYWdlIGludCBzeXNfZm9yayhzdHJ1Y3QgcHRfcmVncyAqKTsKK2FzbWxpbmthZ2UgaW50IHN5c19jbG9uZSh1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nLAorCQkJIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcsCisJCQkgc3RydWN0IHB0X3JlZ3MgKik7Cithc21saW5rYWdlIGludCBzeXNfdmZvcmsoc3RydWN0IHB0X3JlZ3MgKik7Cithc21saW5rYWdlIGludCBzeXNfZXhlY3ZlKGNoYXIgX191c2VyICosIGNoYXIgX191c2VyICpfX3VzZXIgKiwKKwkJCSAgY2hhciBfX3VzZXIgKl9fdXNlciAqLCBzdHJ1Y3QgcHRfcmVncyAqKTsKKworLyoga2VybmVsL3NpZ25hbC5jICovCithc21saW5rYWdlIGludCBzeXNfc2lnYWx0c3RhY2soY29uc3Qgc3RhY2tfdCBfX3VzZXIgKiwgc3RhY2tfdCBfX3VzZXIgKiwKKwkJCSAgICAgICBzdHJ1Y3QgcHRfcmVncyAqKTsKK2FzbWxpbmthZ2UgaW50IHN5c19ydF9zaWdyZXR1cm4oc3RydWN0IHB0X3JlZ3MgKik7CisKKy8qIGtlcm5lbC9zeXNfYXZyMzIuYyAqLworYXNtbGlua2FnZSBsb25nIHN5c19tbWFwMih1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nLAorCQkJICB1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nLCBvZmZfdCk7CisKKy8qIG1tL2NhY2hlLmMgKi8KK2FzbWxpbmthZ2UgaW50IHN5c19jYWNoZWZsdXNoKGludCwgdm9pZCBfX3VzZXIgKiwgc2l6ZV90KTsKKworI2VuZGlmIC8qIF9BU01fQVZSMzJfU1lTQ0FMTFNfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hdnIzMi9rZXJuZWwvcHJvY2Vzcy5jIGIvYXJjaC9hdnIzMi9rZXJuZWwvcHJvY2Vzcy5jCmluZGV4IDEzNGQ1MzAuLjQzYWU1NTUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXZyMzIva2VybmVsL3Byb2Nlc3MuYworKysgYi9hcmNoL2F2cjMyL2tlcm5lbC9wcm9jZXNzLmMKQEAgLTE4LDYgKzE4LDcgQEAKIAogI2luY2x1ZGUgPGFzbS9zeXNyZWcuaD4KICNpbmNsdWRlIDxhc20vb2NkLmg+CisjaW5jbHVkZSA8YXNtL3N5c2NhbGxzLmg+CiAKICNpbmNsdWRlIDxtYWNoL3BtLmg+CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXZyMzIva2VybmVsL3NpZ25hbC5jIGIvYXJjaC9hdnIzMi9rZXJuZWwvc2lnbmFsLmMKaW5kZXggYzViMTFmOS4uODAzZDdiZSAxMDA2NDQKLS0tIGEvYXJjaC9hdnIzMi9rZXJuZWwvc2lnbmFsLmMKKysrIGIvYXJjaC9hdnIzMi9rZXJuZWwvc2lnbmFsLmMKQEAgLTE5LDYgKzE5LDcgQEAKIAogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL3Vjb250ZXh0Lmg+CisjaW5jbHVkZSA8YXNtL3N5c2NhbGxzLmg+CiAKICNkZWZpbmUgX0JMT0NLQUJMRSAofihzaWdtYXNrKFNJR0tJTEwpIHwgc2lnbWFzayhTSUdTVE9QKSkpCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXZyMzIva2VybmVsL3N5c19hdnIzMi5jIGIvYXJjaC9hdnIzMi9rZXJuZWwvc3lzX2F2cjMyLmMKaW5kZXggOGU4OTExZS4uNWQyZGFlYSAxMDA2NDQKLS0tIGEvYXJjaC9hdnIzMi9rZXJuZWwvc3lzX2F2cjMyLmMKKysrIGIvYXJjaC9hdnIzMi9rZXJuZWwvc3lzX2F2cjMyLmMKQEAgLTEzLDYgKzEzLDcgQEAKIAogI2luY2x1ZGUgPGFzbS9tbWFuLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vc3lzY2FsbHMuaD4KIAogYXNtbGlua2FnZSBsb25nIHN5c19tbWFwMih1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgbGVuLAogCQkJICB1bnNpZ25lZCBsb25nIHByb3QsIHVuc2lnbmVkIGxvbmcgZmxhZ3MsCmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL21hY2gtYXQzMmFwL2F0MzJhcDcwMHguYyBiL2FyY2gvYXZyMzIvbWFjaC1hdDMyYXAvYXQzMmFwNzAweC5jCmluZGV4IDA2NjI1MmUuLjNmYmZkMWUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXZyMzIvbWFjaC1hdDMyYXAvYXQzMmFwNzAweC5jCisrKyBiL2FyY2gvYXZyMzIvbWFjaC1hdDMyYXAvYXQzMmFwNzAweC5jCkBAIC0xNSw4ICsxNSw4IEBACiAjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KICNpbmNsdWRlIDxsaW51eC91c2IvYXRtZWxfdXNiYV91ZGMuaD4KKyNpbmNsdWRlIDxsaW51eC9hdG1lbC1tY2kuaD4KIAotI2luY2x1ZGUgPGFzbS9hdG1lbC1tY2kuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+CiAKQEAgLTQyMSw3ICs0MjEsNyBAQAogCXJldHVybiBidXNfY2xrX2dldF9yYXRlKGNsaywgc2hpZnQpOwogfQogCi1zdGF0aWMgdm9pZCBwYmFfY2xrX21vZGUoc3RydWN0IGNsayAqY2xrLCBpbnQgZW5hYmxlZCkKK3ZvaWQgcGJhX2Nsa19tb2RlKHN0cnVjdCBjbGsgKmNsaywgaW50IGVuYWJsZWQpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAl1MzIgbWFzazsKQEAgLTQzNiw3ICs0MzYsNyBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBtX2xvY2ssIGZsYWdzKTsKIH0KIAotc3RhdGljIHVuc2lnbmVkIGxvbmcgcGJhX2Nsa19nZXRfcmF0ZShzdHJ1Y3QgY2xrICpjbGspCit1bnNpZ25lZCBsb25nIHBiYV9jbGtfZ2V0X3JhdGUoc3RydWN0IGNsayAqY2xrKQogewogCXVuc2lnbmVkIGxvbmcgY2tzZWwsIHNoaWZ0ID0gMDsKIApAQCAtMTMwNSw3ICsxMzA1LDcgQEAKIGF0MzJfYWRkX2RldmljZV9tY2kodW5zaWduZWQgaW50IGlkLCBzdHJ1Y3QgbWNpX3BsYXRmb3JtX2RhdGEgKmRhdGEpCiB7CiAJc3RydWN0IHBsYXRmb3JtX2RldmljZQkJKnBkZXY7Ci0Jc3RydWN0IGR3X2RtYV9zbGF2ZQkJKmR3czsKKwlzdHJ1Y3QgZHdfZG1hX3NsYXZlCQkqZHdzID0gJmRhdGEtPmRtYV9zbGF2ZTsKIAl1MzIJCQkJcGlvYV9tYXNrOwogCXUzMgkJCQlwaW9iX21hc2s7CiAKQEAgLTEzMjQsMjIgKzEzMjQsMTMgQEAKIAkJCQlBUlJBWV9TSVpFKGF0bWVsX21jaTBfcmVzb3VyY2UpKSkKIAkJZ290byBmYWlsOwogCi0JaWYgKGRhdGEtPmRtYV9zbGF2ZSkKLQkJZHdzID0ga21lbWR1cCh0b19kd19kbWFfc2xhdmUoZGF0YS0+ZG1hX3NsYXZlKSwKLQkJCQlzaXplb2Yoc3RydWN0IGR3X2RtYV9zbGF2ZSksIEdGUF9LRVJORUwpOwotCWVsc2UKLQkJZHdzID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGR3X2RtYV9zbGF2ZSksIEdGUF9LRVJORUwpOwotCi0JZHdzLT5zbGF2ZS5kZXYgPSAmcGRldi0+ZGV2OwotCWR3cy0+c2xhdmUuZG1hX2RldiA9ICZkd19kbWFjMF9kZXZpY2UuZGV2OwotCWR3cy0+c2xhdmUucmVnX3dpZHRoID0gRE1BX1NMQVZFX1dJRFRIXzMyQklUOworCWR3cy0+ZG1hX2RldiA9ICZkd19kbWFjMF9kZXZpY2UuZGV2OworCWR3cy0+cmVnX3dpZHRoID0gRFdfRE1BX1NMQVZFX1dJRFRIXzMyQklUOwogCWR3cy0+Y2ZnX2hpID0gKERXQ19DRkdIX1NSQ19QRVIoMCkKIAkJCQl8IERXQ19DRkdIX0RTVF9QRVIoMSkpOwogCWR3cy0+Y2ZnX2xvICY9IH4oRFdDX0NGR0xfSFNfRFNUX1BPTAogCQkJCXwgRFdDX0NGR0xfSFNfU1JDX1BPTCk7CiAKLQlkYXRhLT5kbWFfc2xhdmUgPSAmZHdzLT5zbGF2ZTsKLQogCWlmIChwbGF0Zm9ybV9kZXZpY2VfYWRkX2RhdGEocGRldiwgZGF0YSwKIAkJCQlzaXplb2Yoc3RydWN0IG1jaV9wbGF0Zm9ybV9kYXRhKSkpCiAJCWdvdG8gZmFpbDsKZGlmZiAtLWdpdCBhL2FyY2gvYXZyMzIvbWFjaC1hdDMyYXAvY2xvY2suaCBiL2FyY2gvYXZyMzIvbWFjaC1hdDMyYXAvY2xvY2suaAppbmRleCA2MjNiZjBlLi40YzdlYmJkIDEwMDY0NAotLS0gYS9hcmNoL2F2cjMyL21hY2gtYXQzMmFwL2Nsb2NrLmgKKysrIGIvYXJjaC9hdnIzMi9tYWNoLWF0MzJhcC9jbG9jay5oCkBAIC0zMCwzICszMCw2IEBACiAJdTE2CQl1c2VyczsJCS8qIEVuYWJsZWQgaWYgbm9uLXplcm8gKi8KIAl1MTYJCWluZGV4OwkJLyogU2libGluZyBpbmRleCAqLwogfTsKKwordW5zaWduZWQgbG9uZyBwYmFfY2xrX2dldF9yYXRlKHN0cnVjdCBjbGsgKmNsayk7Cit2b2lkIHBiYV9jbGtfbW9kZShzdHJ1Y3QgY2xrICpjbGssIGludCBlbmFibGVkKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXZyMzIvbWFjaC1hdDMyYXAvaW5jbHVkZS9tYWNoL2F0MzJhcDcwMHguaCBiL2FyY2gvYXZyMzIvbWFjaC1hdDMyYXAvaW5jbHVkZS9tYWNoL2F0MzJhcDcwMHguaAppbmRleCBhNzdkMzcyLi41YzRjOTcxIDEwMDY0NAotLS0gYS9hcmNoL2F2cjMyL21hY2gtYXQzMmFwL2luY2x1ZGUvbWFjaC9hdDMyYXA3MDB4LmgKKysrIGIvYXJjaC9hdnIzMi9tYWNoLWF0MzJhcC9pbmNsdWRlL21hY2gvYXQzMmFwNzAweC5oCkBAIC0yMTEsNCArMjExLDcgQEAKIAogI2RlZmluZSBBVE1FTF9MQ0RDX0FMVF8xNUJJVAkoQVRNRUxfTENEQ19DT05UUk9MIHwgQVRNRUxfTENEQ19BTFRfMTVCX0RBVEEpCiAKKy8qIEJpdG1hc2sgZm9yIGFsbCBFQkkgZGF0YSAoRDE2Li5EMzEpIHBpbnMgb24gcG9ydCBFICovCisjZGVmaW5lIEFUTUVMX0VCSV9QRV9EQVRBX0FMTCAgKDB4MDAwMEZGRkYpCisKICNlbmRpZiAvKiBfX0FTTV9BUkNIX0FUMzJBUDcwMFhfSF9fICovCmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL21hY2gtYXQzMmFwL2luY2x1ZGUvbWFjaC9wb3J0bXV4LmggYi9hcmNoL2F2cjMyL21hY2gtYXQzMmFwL2luY2x1ZGUvbWFjaC9wb3J0bXV4LmgKaW5kZXggMjFjNzkzNy4uNDg3MzAyNCAxMDA2NDQKLS0tIGEvYXJjaC9hdnIzMi9tYWNoLWF0MzJhcC9pbmNsdWRlL21hY2gvcG9ydG11eC5oCisrKyBiL2FyY2gvYXZyMzIvbWFjaC1hdDMyYXAvaW5jbHVkZS9tYWNoL3BvcnRtdXguaApAQCAtMjUsNiArMjUsNiBAQAogCQkJdW5zaWduZWQgaW50IHBlcmlwaCwgdW5zaWduZWQgbG9uZyBmbGFncyk7CiB2b2lkIGF0MzJfc2VsZWN0X2dwaW8odW5zaWduZWQgaW50IHBpbiwgdW5zaWduZWQgbG9uZyBmbGFncyk7CiB2b2lkIGF0MzJfZGVzZWxlY3RfcGluKHVuc2lnbmVkIGludCBwaW4pOwotdm9pZCBhdDMyX3Jlc2VydmVfcGluKHVuc2lnbmVkIGludCBwaW4pOwordm9pZCBhdDMyX3Jlc2VydmVfcGluKHVuc2lnbmVkIGludCBwb3J0LCB1MzIgcGluX21hc2spOwogCiAjZW5kaWYgLyogX19BU01fQVJDSF9QT1JUTVVYX0hfXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hdnIzMi9tYWNoLWF0MzJhcC9waW8uYyBiL2FyY2gvYXZyMzIvbWFjaC1hdDMyYXAvcGlvLmMKaW5kZXggZWQ4MWE4Yi4uMDlhMjc0YyAxMDA2NDQKLS0tIGEvYXJjaC9hdnIzMi9tYWNoLWF0MzJhcC9waW8uYworKysgYi9hcmNoL2F2cjMyL21hY2gtYXQzMmFwL3Bpby5jCkBAIC0xNjcsMjIgKzE2NywyOSBAQAogfQogCiAvKiBSZXNlcnZlIGEgcGluLCBwcmV2ZW50aW5nIGFueW9uZSBlbHNlIGZyb20gY2hhbmdpbmcgaXRzIGNvbmZpZ3VyYXRpb24uICovCi12b2lkIF9faW5pdCBhdDMyX3Jlc2VydmVfcGluKHVuc2lnbmVkIGludCBwaW4pCit2b2lkIF9faW5pdCBhdDMyX3Jlc2VydmVfcGluKHVuc2lnbmVkIGludCBwb3J0LCB1MzIgcGluX21hc2spCiB7CiAJc3RydWN0IHBpb19kZXZpY2UgKnBpbzsKLQl1bnNpZ25lZCBpbnQgcGluX2luZGV4ID0gcGluICYgMHgxZjsKIAotCXBpbyA9IGdwaW9fdG9fcGlvKHBpbik7CisJLyogYXNzaWduIGFuZCB2ZXJpZnkgcGlvICovCisJcGlvID0gZ3Bpb190b19waW8ocG9ydCk7CiAJaWYgKHVubGlrZWx5KCFwaW8pKSB7Ci0JCXByaW50aygicGlvOiBpbnZhbGlkIHBpbiAldVxuIiwgcGluKTsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAicGlvOiBpbnZhbGlkIHBvcnQgJXVcbiIsIHBvcnQpOwogCQlnb3RvIGZhaWw7CiAJfQogCi0JaWYgKHVubGlrZWx5KHRlc3RfYW5kX3NldF9iaXQocGluX2luZGV4LCAmcGlvLT5waW5tdXhfbWFzaykpKSB7Ci0JCXByaW50aygiJXM6IHBpbiAldSBpcyBidXN5XG4iLCBwaW8tPm5hbWUsIHBpbl9pbmRleCk7CisJLyogVGVzdCBpZiBhbnkgb2YgdGhlIHJlcXVlc3RlZCBwaW5zIGlzIGFscmVhZHkgbXV4ZWQgKi8KKwlzcGluX2xvY2soJnBpb19sb2NrKTsKKwlpZiAodW5saWtlbHkocGlvLT5waW5tdXhfbWFzayAmIHBpbl9tYXNrKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogcGluKHMpIGJ1c3kgKHJlcS4gMHgleCwgYnVzeSAweCV4KVxuIiwKKwkJICAgICAgIHBpby0+bmFtZSwgcGluX21hc2ssIHBpby0+cGlubXV4X21hc2sgJiBwaW5fbWFzayk7CisJCXNwaW5fdW5sb2NrKCZwaW9fbG9jayk7CiAJCWdvdG8gZmFpbDsKIAl9CiAKKwkvKiBSZXNlcnZlIHBpbnMgKi8KKwlwaW8tPnBpbm11eF9tYXNrIHw9IHBpbl9tYXNrOworCXNwaW5fdW5sb2NrKCZwaW9fbG9jayk7CiAJcmV0dXJuOwogCiBmYWlsOgpkaWZmIC0tZ2l0IGEvYXJjaC9hdnIzMi9tbS9jYWNoZS5jIGIvYXJjaC9hdnIzMi9tbS9jYWNoZS5jCmluZGV4IDE1YTRlNWUuLjI0YTc0ZDEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXZyMzIvbW0vY2FjaGUuYworKysgYi9hcmNoL2F2cjMyL21tL2NhY2hlLmMKQEAgLTEzLDYgKzEzLDcgQEAKICNpbmNsdWRlIDxhc20vY2FjaGVjdGwuaD4KICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vc3lzY2FsbHMuaD4KIAogLyoKICAqIElmIHlvdSBhdHRlbXB0IHRvIGZsdXNoIGFueXRoaW5nIG1vcmUgdGhhbiB0aGlzLCB5b3UgbmVlZCBzdXBlcnVzZXIKZGlmZiAtLWdpdCBhL2FyY2gvYXZyMzIvbW0vaW5pdC5jIGIvYXJjaC9hdnIzMi9tbS9pbml0LmMKaW5kZXggZmE5MmZmNi4uZTgxOWZhNiAxMDA2NDQKLS0tIGEvYXJjaC9hdnIzMi9tbS9pbml0LmMKKysrIGIvYXJjaC9hdnIzMi9tbS9pbml0LmMKQEAgLTk3LDcgKzk3LDYgQEAKIAogCW1lbV9tYXAgPSBOT0RFX0RBVEEoMCktPm5vZGVfbWVtX21hcDsKIAotCW1lbXNldCh6ZXJvX3BhZ2UsIDAsIFBBR0VfU0laRSk7CiAJZW1wdHlfemVyb19wYWdlID0gdmlydF90b19wYWdlKHplcm9fcGFnZSk7CiAJZmx1c2hfZGNhY2hlX3BhZ2UoZW1wdHlfemVyb19wYWdlKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vS2NvbmZpZyBiL2FyY2gvYmxhY2tmaW4vS2NvbmZpZwppbmRleCAyOWU3MWVkLi5hOTQ5YzRmIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL0tjb25maWcKKysrIGIvYXJjaC9ibGFja2Zpbi9LY29uZmlnCkBAIC0yNiw2ICsyNiw3IEBACiAJZGVmYXVsdCB5CiAJc2VsZWN0IEhBVkVfSURFCiAJc2VsZWN0IEhBVkVfT1BST0ZJTEUKKwlzZWxlY3QgQVJDSF9XQU5UX09QVElPTkFMX0dQSU9MSUIKIAogY29uZmlnIFpPTkVfRE1BCiAJYm9vbApAQCAtNTksMTAgKzYwLDYgQEAKIAlib29sCiAJZGVmYXVsdCB5CiAKLWNvbmZpZyBIQVJEV0FSRV9QTQotCWRlZl9ib29sIHkKLQlkZXBlbmRzIG9uIE9QUk9GSUxFCi0KIHNvdXJjZSAiaW5pdC9LY29uZmlnIgogCiBzb3VyY2UgImtlcm5lbC9LY29uZmlnLnByZWVtcHQiCkBAIC03Nyw2ICs3NCwyNiBAQAogCXByb21wdCAiQ1BVIgogCWRlZmF1bHQgQkY1MzMKIAorY29uZmlnIEJGNTEyCisJYm9vbCAiQkY1MTIiCisJaGVscAorCSAgQkY1MTIgUHJvY2Vzc29yIFN1cHBvcnQuCisKK2NvbmZpZyBCRjUxNAorCWJvb2wgIkJGNTE0IgorCWhlbHAKKwkgIEJGNTE0IFByb2Nlc3NvciBTdXBwb3J0LgorCitjb25maWcgQkY1MTYKKwlib29sICJCRjUxNiIKKwloZWxwCisJICBCRjUxNiBQcm9jZXNzb3IgU3VwcG9ydC4KKworY29uZmlnIEJGNTE4CisJYm9vbCAiQkY1MTgiCisJaGVscAorCSAgQkY1MTggUHJvY2Vzc29yIFN1cHBvcnQuCisKIGNvbmZpZyBCRjUyMgogCWJvb2wgIkJGNTIyIgogCWhlbHAKQEAgLTEzNyw2ICsxNTQsMTYgQEAKIAloZWxwCiAJICBCRjUzNyBQcm9jZXNzb3IgU3VwcG9ydC4KIAorY29uZmlnIEJGNTM4CisJYm9vbCAiQkY1MzgiCisJaGVscAorCSAgQkY1MzggUHJvY2Vzc29yIFN1cHBvcnQuCisKK2NvbmZpZyBCRjUzOQorCWJvb2wgIkJGNTM5IgorCWhlbHAKKwkgIEJGNTM5IFByb2Nlc3NvciBTdXBwb3J0LgorCiBjb25maWcgQkY1NDIKIAlib29sICJCRjU0MiIKIAloZWxwCkBAIC0xNjksMjggKzE5Niw1NSBAQAogCiBlbmRjaG9pY2UKIAorY29uZmlnIFNNUAorCWRlcGVuZHMgb24gQkY1NjEKKwlib29sICJTeW1tZXRyaWMgbXVsdGktcHJvY2Vzc2luZyBzdXBwb3J0IgorCS0tLWhlbHAtLS0KKwkgIFRoaXMgZW5hYmxlcyBzdXBwb3J0IGZvciBzeXN0ZW1zIHdpdGggbW9yZSB0aGFuIG9uZSBDUFUsCisJICBsaWtlIHRoZSBkdWFsIGNvcmUgQkY1NjEuIElmIHlvdSBoYXZlIGEgc3lzdGVtIHdpdGggb25seSBvbmUKKwkgIENQVSwgc2F5IE4uIElmIHlvdSBoYXZlIGEgc3lzdGVtIHdpdGggbW9yZSB0aGFuIG9uZSBDUFUsIHNheSBZLgorCisJICBJZiB5b3UgZG9uJ3Qga25vdyB3aGF0IHRvIGRvIGhlcmUsIHNheSBOLgorCitjb25maWcgTlJfQ1BVUworCWludAorCWRlcGVuZHMgb24gU01QCisJZGVmYXVsdCAyIGlmIEJGNTYxCisKK2NvbmZpZyBJUlFfUEVSX0NQVQorCWJvb2wKKwlkZXBlbmRzIG9uIFNNUAorCWRlZmF1bHQgeQorCitjb25maWcgVElDS19TT1VSQ0VfU1lTVE1SMAorCWJvb2wKKwlzZWxlY3QgQkZJTl9HUFRJTUVSUworCWRlcGVuZHMgb24gU01QCisJZGVmYXVsdCB5CisKIGNvbmZpZyBCRl9SRVZfTUlOCiAJaW50Ci0JZGVmYXVsdCAwIGlmIChCRjUyeCB8fCBCRjU0eCkKKwlkZWZhdWx0IDAgaWYgKEJGNTF4IHx8IEJGNTJ4IHx8IEJGNTR4KQogCWRlZmF1bHQgMiBpZiAoQkY1MzcgfHwgQkY1MzYgfHwgQkY1MzQpCiAJZGVmYXVsdCAzIGlmIChCRjU2MSB8fEJGNTMzIHx8IEJGNTMyIHx8IEJGNTMxKQorCWRlZmF1bHQgNCBpZiAoQkY1MzggfHwgQkY1MzkpCiAKIGNvbmZpZyBCRl9SRVZfTUFYCiAJaW50Ci0JZGVmYXVsdCAyIGlmIChCRjUyeCB8fCBCRjU0eCkKKwlkZWZhdWx0IDIgaWYgKEJGNTF4IHx8IEJGNTJ4IHx8IEJGNTR4KQogCWRlZmF1bHQgMyBpZiAoQkY1MzcgfHwgQkY1MzYgfHwgQkY1MzQpCi0JZGVmYXVsdCA1IGlmIChCRjU2MSkKKwlkZWZhdWx0IDUgaWYgKEJGNTYxIHx8IEJGNTM4IHx8IEJGNTM5KQogCWRlZmF1bHQgNiBpZiAoQkY1MzMgfHwgQkY1MzIgfHwgQkY1MzEpCiAKIGNob2ljZQogCXByb21wdCAiU2lsaWNvbiBSZXYiCi0JZGVmYXVsdCBCRl9SRVZfMF8xIGlmIChCRjUyeCB8fCBCRjU0eCkKKwlkZWZhdWx0IEJGX1JFVl8wXzEgaWYgKEJGNTF4IHx8IEJGNTJ4IHx8IEJGNTR4KQogCWRlZmF1bHQgQkZfUkVWXzBfMiBpZiAoQkY1MzQgfHwgQkY1MzYgfHwgQkY1MzcpCiAJZGVmYXVsdCBCRl9SRVZfMF8zIGlmIChCRjUzMSB8fCBCRjUzMiB8fCBCRjUzMyB8fCBCRjU2MSkKIAogY29uZmlnIEJGX1JFVl8wXzAKIAlib29sICIwLjAiCi0JZGVwZW5kcyBvbiAoQkY1MnggfHwgQkY1NHgpCisJZGVwZW5kcyBvbiAoQkY1MXggfHwgQkY1MnggfHwgQkY1NHgpCiAKIGNvbmZpZyBCRl9SRVZfMF8xCiAJYm9vbCAiMC4xIgpAQCAtMjA2LDExICsyNjAsMTEgQEAKIAogY29uZmlnIEJGX1JFVl8wXzQKIAlib29sICIwLjQiCi0JZGVwZW5kcyBvbiAoQkY1NjEgfHwgQkY1MzMgfHwgQkY1MzIgfHwgQkY1MzEpCisJZGVwZW5kcyBvbiAoQkY1NjEgfHwgQkY1MzMgfHwgQkY1MzIgfHwgQkY1MzEgfHwgQkY1MzggfHwgQkY1MzkpCiAKIGNvbmZpZyBCRl9SRVZfMF81CiAJYm9vbCAiMC41IgotCWRlcGVuZHMgb24gKEJGNTYxIHx8IEJGNTMzIHx8IEJGNTMyIHx8IEJGNTMxKQorCWRlcGVuZHMgb24gKEJGNTYxIHx8IEJGNTMzIHx8IEJGNTMyIHx8IEJGNTMxIHx8IEJGNTM4IHx8IEJGNTM5KQogCiBjb25maWcgQkZfUkVWXzBfNgogCWJvb2wgIjAuNiIKQEAgLTIyNCw2ICsyNzgsMTEgQEAKIAogZW5kY2hvaWNlCiAKK2NvbmZpZyBCRjUxeAorCWJvb2wKKwlkZXBlbmRzIG9uIChCRjUxMiB8fCBCRjUxNCB8fCBCRjUxNiB8fCBCRjUxOCkKKwlkZWZhdWx0IHkKKwogY29uZmlnIEJGNTJ4CiAJYm9vbAogCWRlcGVuZHMgb24gKEJGNTIyIHx8IEJGNTIzIHx8IEJGNTI0IHx8IEJGNTI1IHx8IEJGNTI2IHx8IEJGNTI3KQpAQCAtMjU4LDcgKzMxNyw3IEBACiAKIGNvbmZpZyBNRU1fTVQ0OExDMzJNOEEyXzc1CiAJYm9vbAotCWRlcGVuZHMgb24gKEJGSU41MzdfU1RBTVAgfHwgUE5BVjEwKQorCWRlcGVuZHMgb24gKEJGSU41MzdfU1RBTVAgfHwgUE5BVjEwIHx8IEJGSU41MzhfRVpLSVQpCiAJZGVmYXVsdCB5CiAKIGNvbmZpZyBNRU1fTVQ0OExDOE0zMkIyQjVfNwpAQCAtMjcxLDEwICszMzAsMTcgQEAKIAlkZXBlbmRzIG9uIChCRklONTI3X0VaS0lUIHx8IEJGSU41MzJfSVAwWCB8fCBCTEFDS1NUQU1QIHx8IEJGSU41MjZfRVpCUkQpCiAJZGVmYXVsdCB5CiAKK2NvbmZpZyBNRU1fTVQ0OExDMzJNOEEyXzc1CisJYm9vbAorCWRlcGVuZHMgb24gKEJGSU41MThGX0VaQlJEKQorCWRlZmF1bHQgeQorCitzb3VyY2UgImFyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9LY29uZmlnIgogc291cmNlICJhcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvS2NvbmZpZyIKIHNvdXJjZSAiYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL0tjb25maWciCiBzb3VyY2UgImFyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9LY29uZmlnIgogc291cmNlICJhcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvS2NvbmZpZyIKK3NvdXJjZSAiYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM4L0tjb25maWciCiBzb3VyY2UgImFyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9LY29uZmlnIgogCiBtZW51ICJCb2FyZCBjdXN0b21pemF0aW9ucyIKQEAgLTMwNyw2ICszNzMsNyBAQAogCiBjb25maWcgUk9NX0JBU0UKIAloZXggIktlcm5lbCBST00gQmFzZSIKKwlkZXBlbmRzIG9uIFJPTUtFUk5FTAogCWRlZmF1bHQgIjB4MjAwNDAwMDAiCiAJcmFuZ2UgMHgyMDAwMDAwMCAweDIwNDAwMDAwIGlmICEoQkY1NHggfHwgQkY1NjEpCiAJcmFuZ2UgMHgyMDAwMDAwMCAweDMwMDAwMDAwIGlmIChCRjU0eCB8fCBCRjU2MSkKQEAgLTMxOCw3ICszODUsNyBAQAogCWludCAiRnJlcXVlbmN5IG9mIHRoZSBjcnlzdGFsIG9uIHRoZSBib2FyZCBpbiBIeiIKIAlkZWZhdWx0ICIxMTA1OTIwMCIgaWYgQkZJTjUzM19TVEFNUAogCWRlZmF1bHQgIjI3MDAwMDAwIiBpZiBCRklONTMzX0VaS0lUCi0JZGVmYXVsdCAiMjUwMDAwMDAiIGlmIChCRklONTM3X1NUQU1QIHx8IEJGSU41MjdfRVpLSVQgfHwgSDg2MDZfSFZTSVNURU1BUyB8fCBCTEFDS1NUQU1QIHx8IEJGSU41MjZfRVpCUkQpCisJZGVmYXVsdCAiMjUwMDAwMDAiIGlmIChCRklONTM3X1NUQU1QIHx8IEJGSU41MjdfRVpLSVQgfHwgSDg2MDZfSFZTSVNURU1BUyB8fCBCTEFDS1NUQU1QIHx8IEJGSU41MjZfRVpCUkQgfHwgQkZJTjUzOF9FWktJVCB8fCBCRklONTE4Ri1FWkJSRCkKIAlkZWZhdWx0ICIzMDAwMDAwMCIgaWYgQkZJTjU2MV9FWktJVAogCWRlZmF1bHQgIjI0NTc2MDAwIiBpZiBQTkFWMTAKIAlkZWZhdWx0ICIxMDAwMDAwMCIgaWYgQkZJTjUzMl9JUDBYCkBAIC0zNTQsMTEgKzQyMSwxMSBAQAogCXJhbmdlIDEgNjQKIAlkZWZhdWx0ICIyMiIgaWYgQkZJTjUzM19FWktJVAogCWRlZmF1bHQgIjQ1IiBpZiBCRklONTMzX1NUQU1QCi0JZGVmYXVsdCAiMjAiIGlmIChCRklONTM3X1NUQU1QIHx8IEJGSU41MjdfRVpLSVQgfHwgQkZJTjU0OF9FWktJVCB8fCBCRklONTQ4X0JMVUVURUNITklYX0NNKQorCWRlZmF1bHQgIjIwIiBpZiAoQkZJTjUzN19TVEFNUCB8fCBCRklONTI3X0VaS0lUIHx8IEJGSU41NDhfRVpLSVQgfHwgQkZJTjU0OF9CTFVFVEVDSE5JWF9DTSB8fCBCRklONTM4X0VaS0lUKQogCWRlZmF1bHQgIjIyIiBpZiBCRklONTMzX0JMVUVURUNITklYX0NNCiAJZGVmYXVsdCAiMjAiIGlmIChCRklONTM3X0JMVUVURUNITklYX0NNIHx8IEJGSU41MjdfQkxVRVRFQ0hOSVhfQ00gfHwgQkZJTjU2MV9CTFVFVEVDSE5JWF9DTSkKIAlkZWZhdWx0ICIyMCIgaWYgQkZJTjU2MV9FWktJVAotCWRlZmF1bHQgIjE2IiBpZiAoSDg2MDZfSFZTSVNURU1BUyB8fCBCTEFDS1NUQU1QIHx8IEJGSU41MjZfRVpCUkQpCisJZGVmYXVsdCAiMTYiIGlmIChIODYwNl9IVlNJU1RFTUFTIHx8IEJMQUNLU1RBTVAgfHwgQkZJTjUyNl9FWkJSRCB8fCBCRklONTE4Rl9FWkJSRCkKIAloZWxwCiAJICBUaGlzIGNvbnRyb2xzIHRoZSBmcmVxdWVuY3kgb2YgdGhlIG9uLWNoaXAgUExMLiBUaGlzIGNhbiBiZSBiZXR3ZWVuIDEgYW5kIDY0LgogCSAgUExMIEZyZXF1ZW5jeSA9IChDcnlzdGFsIEZyZXF1ZW5jeSkgKiAodGhpcyBzZXR0aW5nKQpAQCAtNDA3LDE5ICs0NzQsNzAgQEAKIAlib29sICJNVDQ2VjMyTTE2XzVCIgogZW5kY2hvaWNlCiAKLWNvbmZpZyBNQVhfTUVNX1NJWkUKLQlpbnQgIk1heCBTRFJBTSBNZW1vcnkgU2l6ZSBpbiBNQnl0ZXMiCi0JZGVwZW5kcyBvbiAhTVBVCi0JZGVmYXVsdCA1MTIKK2Nob2ljZQorCXByb21wdCAiRERSL1NEUkFNIFRpbWluZyIKKwlkZXBlbmRzIG9uIEJGSU5fS0VSTkVMX0NMT0NLCisJZGVmYXVsdCBCRklOX0tFUk5FTF9DTE9DS19NRU1JTklUX0NBTEMKIAloZWxwCi0JICBUaGlzIGlzIHRoZSBtYXggbWVtb3J5IHNpemUgdGhhdCB0aGUga2VybmVsIHdpbGwgY3JlYXRlIENQTEIKLQkgIHRhYmxlcyBmb3IuICBZb3VyIHN5c3RlbSB3aWxsIG5vdCBiZSBhYmxlIHRvIGhhbmRsZSBhbnkgbW9yZS4KKwkgIFRoaXMgb3B0aW9uIGFsbG93cyB5b3UgdG8gc3BlY2lmeSBCbGFja2ZpbiBTRFJBTS9ERFIgVGltaW5nIHBhcmFtZXRlcnMKKwkgIFRoZSBjYWxjdWxhdGVkIFNEUkFNIHRpbWluZyBwYXJhbWV0ZXJzIG1heSBub3QgYmUgMTAwJQorCSAgYWNjdXJhdGUgLSBUaGlzIG9wdGlvbiBpcyB0aGVyZWZvcmUgbWFya2VkIGV4cGVyaW1lbnRhbC4KKworY29uZmlnIEJGSU5fS0VSTkVMX0NMT0NLX01FTUlOSVRfQ0FMQworCWJvb2wgIkNhbGN1bGF0ZSBUaW1pbmdzIChFWFBFUklNRU5UQUwpIgorCWRlcGVuZHMgb24gRVhQRVJJTUVOVEFMCisKK2NvbmZpZyBCRklOX0tFUk5FTF9DTE9DS19NRU1JTklUX1NQRUMKKwlib29sICJQcm92aWRlIGFjY3VyYXRlIFRpbWluZ3MgYmFzZWQgb24gdGFyZ2V0IFNDTEsiCisJaGVscAorCSAgUGxlYXNlIGNvbnN1bHQgdGhlIEJsYWNrZmluIEhhcmR3YXJlIFJlZmVyZW5jZSBNYW51YWxzIGFzIHdlbGwKKwkgIGFzIHRoZSBtZW1vcnkgZGV2aWNlIGRhdGFzaGVldC4KKwkgIGh0dHA6Ly9kb2NzLmJsYWNrZmluLnVjbGludXgub3JnL2Rva3UucGhwP2lkPWJmaW46c2RyYW0KK2VuZGNob2ljZQorCittZW51ICJNZW1vcnkgSW5pdCBDb250cm9sIgorCWRlcGVuZHMgb24gQkZJTl9LRVJORUxfQ0xPQ0tfTUVNSU5JVF9TUEVDCisKK2NvbmZpZyBNRU1fRERSQ1RMMAorCWRlcGVuZHMgb24gQkY1NHgKKwloZXggIkREUkNUTDAiCisJZGVmYXVsdCAweDAKKworY29uZmlnIE1FTV9ERFJDVEwxCisJZGVwZW5kcyBvbiBCRjU0eAorCWhleCAiRERSQ1RMMSIKKwlkZWZhdWx0IDB4MAorCitjb25maWcgTUVNX0REUkNUTDIKKwlkZXBlbmRzIG9uIEJGNTR4CisJaGV4ICJERFJDVEwyIgorCWRlZmF1bHQgMHgwCisKK2NvbmZpZyBNRU1fRUJJVV9ERFJRVUUKKwlkZXBlbmRzIG9uIEJGNTR4CisJaGV4ICJERFJRVUUiCisJZGVmYXVsdCAweDAKKworY29uZmlnIE1FTV9TRFJSQworCWRlcGVuZHMgb24gIUJGNTR4CisJaGV4ICJTRFJSQyIKKwlkZWZhdWx0IDB4MAorCitjb25maWcgTUVNX1NER0NUTAorCWRlcGVuZHMgb24gIUJGNTR4CisJaGV4ICJTREdDVEwiCisJZGVmYXVsdCAweDAKK2VuZG1lbnUKIAogIwogIyBNYXggJiBNaW4gU3BlZWRzIGZvciB2YXJpb3VzIENoaXBzCiAjCiBjb25maWcgTUFYX1ZDT19IWgogCWludAorCWRlZmF1bHQgNDAwMDAwMDAwIGlmIEJGNTEyCisJZGVmYXVsdCA0MDAwMDAwMDAgaWYgQkY1MTQKKwlkZWZhdWx0IDQwMDAwMDAwMCBpZiBCRjUxNgorCWRlZmF1bHQgNDAwMDAwMDAwIGlmIEJGNTE4CiAJZGVmYXVsdCA2MDAwMDAwMDAgaWYgQkY1MjIKIAlkZWZhdWx0IDQwMDAwMDAwMCBpZiBCRjUyMwogCWRlZmF1bHQgNDAwMDAwMDAwIGlmIEJGNTI0CkBAIC00NTksNiArNTc3LDcgQEAKIAogY29uZmlnIEdFTkVSSUNfVElNRQogCWJvb2wgIkdlbmVyaWMgdGltZSIKKwlkZXBlbmRzIG9uICFTTVAKIAlkZWZhdWx0IHkKIAogY29uZmlnIEdFTkVSSUNfQ0xPQ0tFVkVOVFMKQEAgLTUzMyw2ICs2NTIsNyBAQAogCiAKIG1lbnUgIkJsYWNrZmluIEtlcm5lbCBPcHRpbWl6YXRpb25zIgorCWRlcGVuZHMgb24gIVNNUAogCiBjb21tZW50ICJNZW1vcnkgT3B0aW1pemF0aW9ucyIKIApAQCAtNjU1LDYgKzc3NSwxNyBAQAogCiAJICBDdXJyZW50bHkgb25seSB3b3JrcyB3aXRoIEZMQVQgYmluYXJpZXMuCiAKK2NvbmZpZyBFWENFUFRJT05fTDFfU0NSQVRDSAorCWJvb2wgIkxvY2F0ZSBleGNlcHRpb24gc3RhY2sgaW4gTDEgU2NyYXRjaCBNZW1vcnkiCisJZGVmYXVsdCBuCisJZGVwZW5kcyBvbiAhQVBQX1NUQUNLX0wxICYmICFTWVNDQUxMX1RBQl9MMQorCWhlbHAKKwkgIFdoZW5ldmVyIGFuIGV4Y2VwdGlvbiBvY2N1cnMsIHVzZSB0aGUgTDEgU2NyYXRjaCBtZW1vcnkgZm9yCisJICBzdGFjayBzdG9yYWdlLiAgWW91IGNhbm5vdCBwbGFjZSB0aGUgc3RhY2tzIG9mIEZMQVQgYmluYXJpZXMKKwkgIGluIEwxIHdoZW4gdXNpbmcgdGhpcyBvcHRpb24uCisKKwkgIElmIHlvdSBkb24ndCB1c2UgTDEgU2NyYXRjaCwgdGhlbiB5b3Ugc2hvdWxkIHNheSBZIGhlcmUuCisKIGNvbW1lbnQgIlNwZWVkIE9wdGltaXphdGlvbnMiCiBjb25maWcgQkZJTl9JTlNfTE9XT1ZFUkhFQUQKIAlib29sICJpbnNbYndsXSBsb3cgb3ZlcmhlYWQsIGhpZ2hlciBpbnRlcnJ1cHQgbGF0ZW5jeSIKQEAgLTY4NCw3ICs4MTUsNiBAQAogCiBlbmRtZW51CiAKLQogY2hvaWNlCiAJcHJvbXB0ICJLZXJuZWwgZXhlY3V0ZXMgZnJvbSIKIAloZWxwCkBAIC03MTQsMTcgKzg0NCw5IEBACiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlCiAJICB3aWxsIGJlIGNhbGxlZCBncHRpbWVycy5rby4KIAotY29uZmlnIEJGSU5fRE1BXzVYWAotCWJvb2wgIkVuYWJsZSBETUEgU3VwcG9ydCIKLQlkZXBlbmRzIG9uIChCRjUyeCB8fCBCRjUzeCB8fCBCRjU2MSB8fCBCRjU0eCkKLQlkZWZhdWx0IHkKLQloZWxwCi0JICBETUEgZHJpdmVyIGZvciBCRjV4eC4KLQogY2hvaWNlCi0JcHJvbXB0ICJVbmNhY2hlZCBTRFJBTSByZWdpb24iCisJcHJvbXB0ICJVbmNhY2hlZCBETUEgcmVnaW9uIgogCWRlZmF1bHQgRE1BX1VOQ0FDSEVEXzFNCi0JZGVwZW5kcyBvbiBCRklOX0RNQV81WFgKIGNvbmZpZyBETUFfVU5DQUNIRURfNE0KIAlib29sICJFbmFibGUgNE0gRE1BIHJlZ2lvbiIKIGNvbmZpZyBETUFfVU5DQUNIRURfMk0KQEAgLTc1MSw5ICs4NzMsMTEgQEAKIGNob2ljZQogCXByb21wdCAiUG9saWN5IgogCWRlcGVuZHMgb24gQkZJTl9EQ0FDSEUKLQlkZWZhdWx0IEJGSU5fV0IKKwlkZWZhdWx0IEJGSU5fV0IgaWYgIVNNUAorCWRlZmF1bHQgQkZJTl9XVCBpZiBTTVAKIGNvbmZpZyBCRklOX1dCCiAJYm9vbCAiV3JpdGUgYmFjayIKKwlkZXBlbmRzIG9uICFTTVAKIAloZWxwCiAJICBXcml0ZSBCYWNrIFBvbGljeToKIAkgICAgQ2FjaGVkIGRhdGEgd2lsbCBiZSB3cml0dGVuIGJhY2sgdG8gU0RSQU0gb25seSB3aGVuIG5lZWRlZC4KQEAgLTc5MCw3ICs5MTQsNyBAQAogCiBjb25maWcgQkZJTl9MMl9DQUNIRUFCTEUKIAlib29sICJDYWNoZSBMMiBTUkFNIgotCWRlcGVuZHMgb24gKEJGSU5fRENBQ0hFIHx8IEJGSU5fSUNBQ0hFKSAmJiAoQkY1NHggfHwgQkY1NjEpCisJZGVwZW5kcyBvbiAoQkZJTl9EQ0FDSEUgfHwgQkZJTl9JQ0FDSEUpICYmIChCRjU0eCB8fCAoQkY1NjEgJiYgIVNNUCkpCiAJZGVmYXVsdCBuCiAJaGVscAogCSAgU2VsZWN0IHRvIG1ha2UgTDIgU1JBTSBjYWNoZWFibGUgaW4gTDEgZGF0YSBhbmQgaW5zdHJ1Y3Rpb24gY2FjaGUuCkBAIC05ODAsNyArMTEwNCw3IEBACiAJaW50ICJHUElPIG51bWJlciIKIAlyYW5nZSAwIDQ3CiAJZGVwZW5kcyBvbiBQTV9XQUtFVVBfQllfR1BJTwotCWRlZmF1bHQgMiBpZiBCRklONTM3X1NUQU1QCisJZGVmYXVsdCAyCiAKIGNob2ljZQogCXByb21wdCAiR1BJTyBQb2xhcml0eSIKQEAgLTEwMDMsNyArMTEyNyw3IEBACiAKIGNvbmZpZyBQTV9CRklOX1dBS0VfUEg2CiAJYm9vbCAiQWxsb3cgV2FrZS1VcCBmcm9tIG9uLWNoaXAgUEhZIG9yIFBINiBHUCIKLQlkZXBlbmRzIG9uIFBNICYmIChCRjUyeCB8fCBCRjUzNCB8fCBCRjUzNiB8fCBCRjUzNykKKwlkZXBlbmRzIG9uIFBNICYmIChCRjUxeCB8fCBCRjUyeCB8fCBCRjUzNCB8fCBCRjUzNiB8fCBCRjUzNykKIAlkZWZhdWx0IG4KIAloZWxwCiAJICBFbmFibGUgUEhZIGFuZCBQSDYgR1AgV2FrZS1VcCAoVm9sdGFnZSBSZWd1bGF0b3IgUG93ZXItVXApCkBAIC0xMDIwLDE1ICsxMTQ0LDIxIEBACiAKIHNvdXJjZSAiZHJpdmVycy9jcHVmcmVxL0tjb25maWciCiAKK2NvbmZpZyBCRklOX0NQVV9GUkVRCisJYm9vbAorCWRlcGVuZHMgb24gQ1BVX0ZSRVEKKwlzZWxlY3QgQ1BVX0ZSRVFfVEFCTEUKKwlkZWZhdWx0IHkKKwogY29uZmlnIENQVV9WT0xUQUdFCiAJYm9vbCAiQ1BVIFZvbHRhZ2Ugc2NhbGluZyIKLQlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTAkKKwlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTAogCWRlcGVuZHMgb24gQ1BVX0ZSRVEKIAlkZWZhdWx0IG4KIAloZWxwCiAJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IENQVSB2b2x0YWdlIHNjYWxpbmcgYWNjb3JkaW5nIHRvIHRoZSBDUFUgZnJlcXVlbmN5LgogCSAgVGhpcyBvcHRpb24gdmlvbGF0ZXMgdGhlIFBMTCBCWVBBU1MgcmVjb21tZW5kYXRpb24gaW4gdGhlIEJsYWNrZmluIFByb2Nlc3NvcgotCSAgbWFudWFscy4gVGhlcmUgaXMgYSB0aGVvcmV0aWNhbCByaXNrIHRoYXQgZHVyaW5nIFZERElOVCB0cmFuc2l0aW9ucyAKKwkgIG1hbnVhbHMuIFRoZXJlIGlzIGEgdGhlb3JldGljYWwgcmlzayB0aGF0IGR1cmluZyBWRERJTlQgdHJhbnNpdGlvbnMKIAkgIHRoZSBQTEwgbWF5IHVubG9jay4KIAogZW5kbWVudQpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9LY29uZmlnLmRlYnVnIGIvYXJjaC9ibGFja2Zpbi9LY29uZmlnLmRlYnVnCmluZGV4IDNhZDI1OTguLjVmOTgxZDkgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vS2NvbmZpZy5kZWJ1ZworKysgYi9hcmNoL2JsYWNrZmluL0tjb25maWcuZGVidWcKQEAgLTIsOCArMiwzMCBAQAogCiBzb3VyY2UgImxpYi9LY29uZmlnLmRlYnVnIgogCitjb25maWcgREVCVUdfU1RBQ0tPVkVSRkxPVworCWJvb2wgIkNoZWNrIGZvciBzdGFjayBvdmVyZmxvd3MiCisJZGVwZW5kcyBvbiBERUJVR19LRVJORUwKKwloZWxwCisJICBUaGlzIG9wdGlvbiB3aWxsIGNhdXNlIG1lc3NhZ2VzIHRvIGJlIHByaW50ZWQgaWYgZnJlZSBzdGFjayBzcGFjZQorCSAgZHJvcHMgYmVsb3cgYSBjZXJ0YWluIGxpbWl0LgorCitjb25maWcgREVCVUdfU1RBQ0tfVVNBR0UKKwlib29sICJFbmFibGUgc3RhY2sgdXRpbGl6YXRpb24gaW5zdHJ1bWVudGF0aW9uIgorCWRlcGVuZHMgb24gREVCVUdfS0VSTkVMCisJaGVscAorCSAgRW5hYmxlcyB0aGUgZGlzcGxheSBvZiB0aGUgbWluaW11bSBhbW91bnQgb2YgZnJlZSBzdGFjayB3aGljaCBlYWNoCisJICB0YXNrIGhhcyBldmVyIGhhZCBhdmFpbGFibGUgaW4gdGhlIHN5c3JxLVQgb3V0cHV0LgorCisJICBUaGlzIG9wdGlvbiB3aWxsIHNsb3cgZG93biBwcm9jZXNzIGNyZWF0aW9uIHNvbWV3aGF0LgorCiBjb25maWcgSEFWRV9BUkNIX0tHREIKLSAgICAgICBkZWZfYm9vbCB5CisJZGVmX2Jvb2wgeQorCitjb25maWcgS0dEQl9URVNUQ0FTRQorCXRyaXN0YXRlICJLR0RCOiBmb3IgdGVzdCBjYXNlIGluIGV4cGVjdCIKKwlkZWZhdWx0IG4KKwloZWxwCisJICBUaGlzIGlzIGEga2dkYiB0ZXN0IGNhc2UgZm9yIGF1dG9tYXRlZCB0ZXN0aW5nLgogCiBjb25maWcgREVCVUdfVkVSQk9TRQogCWJvb2wgIlZlcmJvc2UgZmF1bHQgbWVzc2FnZXMiCkBAIC0xODIsMTEgKzIwNCwxMSBAQAogCSAgNCBmb3IgKDJeNCkgMTZrLCBvciA0MDk2IGVudHJpZXMKIAogY29uZmlnIERFQlVHX0JGSU5fTk9fS0VSTl9IV1RSQUNFCi0JYm9vbCAiVHJhY2UgdXNlciBhcHBzICh0dXJuIG9mZiBod3RyYWNlIGluIGtlcm5lbCkiCisJYm9vbCAiVHVybiBvZmYgaHd0cmFjZSBpbiBDUExCIGhhbmRsZXJzIgogCWRlcGVuZHMgb24gREVCVUdfQkZJTl9IV1RSQUNFX09OCi0JZGVmYXVsdCBuCisJZGVmYXVsdCB5CiAJaGVscAotCSAgU29tZSBwaWVjZXMgb2YgdGhlIGtlcm5lbCBjb250YWluIGEgbG90IG9mIGZsb3cgY2hhbmdlcyB3aGljaCBjYW4KKwkgIFRoZSBDUExCIGVycm9yIGhhbmRsZXIgY29udGFpbnMgYSBsb3Qgb2YgZmxvdyBjaGFuZ2VzIHdoaWNoIGNhbgogCSAgcXVpY2tseSBmaWxsIHVwIHRoZSBoYXJkd2FyZSB0cmFjZSBidWZmZXIuICBXaGVuIGRlYnVnZ2luZyBjcmFzaGVzLAogCSAgdGhlIGhhcmR3YXJlIHRyYWNlIG1heSBpbmRpY2F0ZSB0aGF0IHRoZSBwcm9ibGVtIGxpZXMgaW4ga2VybmVsCiAJICBzcGFjZSB3aGVuIGluIHJlYWxpdHkgYW4gYXBwbGljYXRpb24gaXMgYnVnZ3kuCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL01ha2VmaWxlIGIvYXJjaC9ibGFja2Zpbi9NYWtlZmlsZQppbmRleCA2YmY1MDk3Li5lNTUwYzhkIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL01ha2VmaWxlCisrKyBiL2FyY2gvYmxhY2tmaW4vTWFrZWZpbGUKQEAgLTIxLDYgKzIxLDEwIEBACiBLQlVJTERfREVGQ09ORklHIDo9IEJGNTM3LVNUQU1QX2RlZmNvbmZpZwogCiAjIHNldHVwIHRoZSBtYWNoaW5lIG5hbWUgYW5kIHRoZSBtYWNoaW5lIGRlcGVuZGVudCBzZXR0aW5ncworbWFjaGluZS0kKENPTkZJR19CRjUxMikgOj0gYmY1MTgKK21hY2hpbmUtJChDT05GSUdfQkY1MTQpIDo9IGJmNTE4CittYWNoaW5lLSQoQ09ORklHX0JGNTE2KSA6PSBiZjUxOAorbWFjaGluZS0kKENPTkZJR19CRjUxOCkgOj0gYmY1MTgKIG1hY2hpbmUtJChDT05GSUdfQkY1MjIpIDo9IGJmNTI3CiBtYWNoaW5lLSQoQ09ORklHX0JGNTIzKSA6PSBiZjUyNwogbWFjaGluZS0kKENPTkZJR19CRjUyNCkgOj0gYmY1MjcKQEAgLTMzLDYgKzM3LDggQEAKIG1hY2hpbmUtJChDT05GSUdfQkY1MzQpIDo9IGJmNTM3CiBtYWNoaW5lLSQoQ09ORklHX0JGNTM2KSA6PSBiZjUzNwogbWFjaGluZS0kKENPTkZJR19CRjUzNykgOj0gYmY1MzcKK21hY2hpbmUtJChDT05GSUdfQkY1MzgpIDo9IGJmNTM4CittYWNoaW5lLSQoQ09ORklHX0JGNTM5KSA6PSBiZjUzOAogbWFjaGluZS0kKENPTkZJR19CRjU0MikgOj0gYmY1NDgKIG1hY2hpbmUtJChDT05GSUdfQkY1NDQpIDo9IGJmNTQ4CiBtYWNoaW5lLSQoQ09ORklHX0JGNTQ3KSA6PSBiZjU0OApAQCAtNDIsNiArNDgsMTAgQEAKIE1BQ0hJTkUgOj0gJChtYWNoaW5lLXkpCiBleHBvcnQgTUFDSElORQogCitjcHUtJChDT05GSUdfQkY1MTIpIDo9IGJmNTEyCitjcHUtJChDT05GSUdfQkY1MTQpIDo9IGJmNTE0CitjcHUtJChDT05GSUdfQkY1MTYpIDo9IGJmNTE2CitjcHUtJChDT05GSUdfQkY1MTgpIDo9IGJmNTE4CiBjcHUtJChDT05GSUdfQkY1MjIpIDo9IGJmNTIyCiBjcHUtJChDT05GSUdfQkY1MjMpIDo9IGJmNTIzCiBjcHUtJChDT05GSUdfQkY1MjQpIDo9IGJmNTI0CkBAIC01NCw2ICs2NCw4IEBACiBjcHUtJChDT05GSUdfQkY1MzQpIDo9IGJmNTM0CiBjcHUtJChDT05GSUdfQkY1MzYpIDo9IGJmNTM2CiBjcHUtJChDT05GSUdfQkY1MzcpIDo9IGJmNTM3CitjcHUtJChDT05GSUdfQkY1MzgpIDo9IGJmNTM4CitjcHUtJChDT05GSUdfQkY1MzkpIDo9IGJmNTM5CiBjcHUtJChDT05GSUdfQkY1NDIpIDo9IGJmNTQyCiBjcHUtJChDT05GSUdfQkY1NDQpIDo9IGJmNTQ0CiBjcHUtJChDT05GSUdfQkY1NDcpIDo9IGJmNTQ3CkBAIC03OSw3ICs5MSw3IEBACiBDSEVDS0ZMQUdTX1NJTElDT04gPSAkKHNoZWxsIGVjaG8gIiIgfCAkKENQUCkgJChLQlVJTERfQ0ZMQUdTKSAtZEQgLSAyPi9kZXYvbnVsbCB8IGF3ayAnJCQyID09ICJfX1NJTElDT05fUkVWSVNJT05fXyIgeyBwcmludCAkJDMgfScpCiBDSEVDS0ZMQUdTICs9IC1EX19TSUxJQ09OX1JFVklTSU9OX189JChDSEVDS0ZMQUdTX1NJTElDT04pIC1EbDFfdGV4dD1fX3VzZWRfXwogCi1oZWFkLXkgICA6PSBhcmNoLyQoQVJDSCkvbWFjaC0kKE1BQ0hJTkUpL2hlYWQubyBhcmNoLyQoQVJDSCkva2VybmVsL2luaXRfdGFzay5vCitoZWFkLXkgICA6PSBhcmNoLyQoQVJDSCkva2VybmVsL2luaXRfdGFzay5vCiAKIGNvcmUteSAgICs9IGFyY2gvJChBUkNIKS9rZXJuZWwvIGFyY2gvJChBUkNIKS9tbS8gYXJjaC8kKEFSQ0gpL21hY2gtY29tbW9uLwogCkBAIC05NSwxMCArMTA3LDEwIEBACiBjb3JlLXkJKz0gYXJjaC8kKEFSQ0gpL2tlcm5lbC9jcGxiLW5vbXB1LwogZW5kaWYKIAotbGlicy15ICAgKz0gYXJjaC8kKEFSQ0gpL2xpYi8KLQogZHJpdmVycy0kKENPTkZJR19PUFJPRklMRSkgKz0gYXJjaC8kKEFSQ0gpL29wcm9maWxlLwogCitsaWJzLXkgICArPSBhcmNoLyQoQVJDSCkvbGliLworCiBtYWNoZGlycwk6PSAkKHBhdHN1YnN0ICUsYXJjaC9ibGFja2Zpbi9tYWNoLSUvLCAkKG1hY2hpbmUteSkpCiAKIEtCVUlMRF9DRkxBR1MgKz0gLUlhcmNoLyQoQVJDSCkvaW5jbHVkZS8KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vY29uZmlncy9CRjUxOEYtRVpCUkRfZGVmY29uZmlnIGIvYXJjaC9ibGFja2Zpbi9jb25maWdzL0JGNTE4Ri1FWkJSRF9kZWZjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTBiM2YyNAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYmxhY2tmaW4vY29uZmlncy9CRjUxOEYtRVpCUkRfZGVmY29uZmlnCkBAIC0wLDAgKzEsMTE5MSBAQAorIworIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAorIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjI4LXJjMgorIworIyBDT05GSUdfTU1VIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZQVSBpcyBub3Qgc2V0CitDT05GSUdfUldTRU1fR0VORVJJQ19TUElOTE9DSz15CisjIENPTkZJR19SV1NFTV9YQ0hHQUREX0FMR09SSVRITSBpcyBub3Qgc2V0CitDT05GSUdfQkxBQ0tGSU49eQorQ09ORklHX1pPTkVfRE1BPXkKK0NPTkZJR19HRU5FUklDX0ZJTkRfTkVYVF9CSVQ9eQorQ09ORklHX0dFTkVSSUNfSFdFSUdIVD15CitDT05GSUdfR0VORVJJQ19IQVJESVJRUz15CitDT05GSUdfR0VORVJJQ19JUlFfUFJPQkU9eQorQ09ORklHX0dFTkVSSUNfR1BJTz15CitDT05GSUdfRk9SQ0VfTUFYX1pPTkVPUkRFUj0xNAorQ09ORklHX0dFTkVSSUNfQ0FMSUJSQVRFX0RFTEFZPXkKK0NPTkZJR19ERUZDT05GSUdfTElTVD0iL2xpYi9tb2R1bGVzLyRVTkFNRV9SRUxFQVNFLy5jb25maWciCisKKyMKKyMgR2VuZXJhbCBzZXR1cAorIworQ09ORklHX0VYUEVSSU1FTlRBTD15CitDT05GSUdfQlJPS0VOX09OX1NNUD15CitDT05GSUdfSU5JVF9FTlZfQVJHX0xJTUlUPTMyCitDT05GSUdfTE9DQUxWRVJTSU9OPSIiCitDT05GSUdfTE9DQUxWRVJTSU9OX0FVVE89eQorQ09ORklHX1NZU1ZJUEM9eQorQ09ORklHX1NZU1ZJUENfU1lTQ1RMPXkKKyMgQ09ORklHX1BPU0lYX01RVUVVRSBpcyBub3Qgc2V0CisjIENPTkZJR19CU0RfUFJPQ0VTU19BQ0NUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RBU0tTVEFUUyBpcyBub3Qgc2V0CisjIENPTkZJR19BVURJVCBpcyBub3Qgc2V0CitDT05GSUdfSUtDT05GSUc9eQorQ09ORklHX0lLQ09ORklHX1BST0M9eQorQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKKyMgQ09ORklHX0NHUk9VUFMgaXMgbm90IHNldAorIyBDT05GSUdfR1JPVVBfU0NIRUQgaXMgbm90IHNldAorIyBDT05GSUdfU1lTRlNfREVQUkVDQVRFRF9WMiBpcyBub3Qgc2V0CisjIENPTkZJR19SRUxBWSBpcyBub3Qgc2V0CisjIENPTkZJR19OQU1FU1BBQ0VTIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX0lOSVRSRD15CitDT05GSUdfSU5JVFJBTUZTX1NPVVJDRT0iIgorIyBDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkUgaXMgbm90IHNldAorQ09ORklHX1NZU0NUTD15CitDT05GSUdfRU1CRURERUQ9eQorQ09ORklHX1VJRDE2PXkKK0NPTkZJR19TWVNDVExfU1lTQ0FMTD15CitDT05GSUdfS0FMTFNZTVM9eQorIyBDT05GSUdfS0FMTFNZTVNfQUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tBTExTWU1TX0VYVFJBX1BBU1MgaXMgbm90IHNldAorQ09ORklHX0hPVFBMVUc9eQorQ09ORklHX1BSSU5USz15CitDT05GSUdfQlVHPXkKKyMgQ09ORklHX0VMRl9DT1JFIGlzIG5vdCBzZXQKK0NPTkZJR19DT01QQVRfQlJLPXkKK0NPTkZJR19CQVNFX0ZVTEw9eQorQ09ORklHX0ZVVEVYPXkKK0NPTkZJR19BTk9OX0lOT0RFUz15CitDT05GSUdfRVBPTEw9eQorQ09ORklHX1NJR05BTEZEPXkKK0NPTkZJR19USU1FUkZEPXkKK0NPTkZJR19FVkVOVEZEPXkKK0NPTkZJR19BSU89eQorQ09ORklHX1ZNX0VWRU5UX0NPVU5URVJTPXkKK0NPTkZJR19TTEFCPXkKKyMgQ09ORklHX1NMVUIgaXMgbm90IHNldAorIyBDT05GSUdfU0xPQiBpcyBub3Qgc2V0CisjIENPTkZJR19QUk9GSUxJTkcgaXMgbm90IHNldAorIyBDT05GSUdfTUFSS0VSUyBpcyBub3Qgc2V0CitDT05GSUdfSEFWRV9PUFJPRklMRT15CisjIENPTkZJR19IQVZFX0dFTkVSSUNfRE1BX0NPSEVSRU5UIGlzIG5vdCBzZXQKK0NPTkZJR19TTEFCSU5GTz15CitDT05GSUdfUlRfTVVURVhFUz15CitDT05GSUdfVElOWV9TSE1FTT15CitDT05GSUdfQkFTRV9TTUFMTD0wCitDT05GSUdfTU9EVUxFUz15CisjIENPTkZJR19NT0RVTEVfRk9SQ0VfTE9BRCBpcyBub3Qgc2V0CitDT05GSUdfTU9EVUxFX1VOTE9BRD15CisjIENPTkZJR19NT0RVTEVfRk9SQ0VfVU5MT0FEIGlzIG5vdCBzZXQKKyMgQ09ORklHX01PRFZFUlNJT05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX01PRFVMRV9TUkNWRVJTSU9OX0FMTCBpcyBub3Qgc2V0CitDT05GSUdfS01PRD15CitDT05GSUdfQkxPQ0s9eQorIyBDT05GSUdfTEJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSU9fVFJBQ0UgaXMgbm90IHNldAorIyBDT05GSUdfTFNGIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfQlNHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSU5URUdSSVRZIGlzIG5vdCBzZXQKKworIworIyBJTyBTY2hlZHVsZXJzCisjCitDT05GSUdfSU9TQ0hFRF9OT09QPXkKKyMgQ09ORklHX0lPU0NIRURfQVMgaXMgbm90IHNldAorIyBDT05GSUdfSU9TQ0hFRF9ERUFETElORSBpcyBub3Qgc2V0CisjIENPTkZJR19JT1NDSEVEX0NGUSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUZBVUxUX0FTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFRkFVTFRfREVBRExJTkUgaXMgbm90IHNldAorIyBDT05GSUdfREVGQVVMVF9DRlEgaXMgbm90IHNldAorQ09ORklHX0RFRkFVTFRfTk9PUD15CitDT05GSUdfREVGQVVMVF9JT1NDSEVEPSJub29wIgorQ09ORklHX0NMQVNTSUNfUkNVPXkKKyMgQ09ORklHX1BSRUVNUFRfTk9ORSBpcyBub3Qgc2V0CitDT05GSUdfUFJFRU1QVF9WT0xVTlRBUlk9eQorIyBDT05GSUdfUFJFRU1QVCBpcyBub3Qgc2V0CisjIENPTkZJR19GUkVFWkVSIGlzIG5vdCBzZXQKKworIworIyBCbGFja2ZpbiBQcm9jZXNzb3IgT3B0aW9ucworIworCisjCisjIFByb2Nlc3NvciBhbmQgQm9hcmQgU2V0dGluZ3MKKyMKKyMgQ09ORklHX0JGNTEyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGNTE0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGNTE2IGlzIG5vdCBzZXQKK0NPTkZJR19CRjUxOD15CisjIENPTkZJR19CRjUyMiBpcyBub3Qgc2V0CisjIENPTkZJR19CRjUyMyBpcyBub3Qgc2V0CisjIENPTkZJR19CRjUyNCBpcyBub3Qgc2V0CisjIENPTkZJR19CRjUyNSBpcyBub3Qgc2V0CisjIENPTkZJR19CRjUyNiBpcyBub3Qgc2V0CisjIENPTkZJR19CRjUyNyBpcyBub3Qgc2V0CisjIENPTkZJR19CRjUzMSBpcyBub3Qgc2V0CisjIENPTkZJR19CRjUzMiBpcyBub3Qgc2V0CisjIENPTkZJR19CRjUzMyBpcyBub3Qgc2V0CisjIENPTkZJR19CRjUzNCBpcyBub3Qgc2V0CisjIENPTkZJR19CRjUzNiBpcyBub3Qgc2V0CisjIENPTkZJR19CRjUzNyBpcyBub3Qgc2V0CisjIENPTkZJR19CRjUzOCBpcyBub3Qgc2V0CisjIENPTkZJR19CRjUzOSBpcyBub3Qgc2V0CisjIENPTkZJR19CRjU0MiBpcyBub3Qgc2V0CisjIENPTkZJR19CRjU0NCBpcyBub3Qgc2V0CisjIENPTkZJR19CRjU0NyBpcyBub3Qgc2V0CisjIENPTkZJR19CRjU0OCBpcyBub3Qgc2V0CisjIENPTkZJR19CRjU0OSBpcyBub3Qgc2V0CisjIENPTkZJR19CRjU2MSBpcyBub3Qgc2V0CitDT05GSUdfQkZfUkVWX01JTj0wCitDT05GSUdfQkZfUkVWX01BWD0yCitDT05GSUdfQkZfUkVWXzBfMD15CisjIENPTkZJR19CRl9SRVZfMF8xIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGX1JFVl8wXzIgaXMgbm90IHNldAorIyBDT05GSUdfQkZfUkVWXzBfMyBpcyBub3Qgc2V0CisjIENPTkZJR19CRl9SRVZfMF80IGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGX1JFVl8wXzUgaXMgbm90IHNldAorIyBDT05GSUdfQkZfUkVWXzBfNiBpcyBub3Qgc2V0CisjIENPTkZJR19CRl9SRVZfQU5ZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGX1JFVl9OT05FIGlzIG5vdCBzZXQKK0NPTkZJR19CRjUxeD15CitDT05GSUdfQkZJTjUxOEZfRVpCUkQ9eQorCisjCisjIEJGNTE4IFNwZWNpZmljIENvbmZpZ3VyYXRpb24KKyMKKworIworIyBBbHRlcm5hdGl2ZSBNdWx0aXBsZXhpbmcgU2NoZW1lCisjCisjIENPTkZJR19CRjUxOF9TUE9SVDBfUE9SVEYgaXMgbm90IHNldAorQ09ORklHX0JGNTE4X1NQT1JUMF9QT1JURz15CitDT05GSUdfQkY1MThfU1BPUlQwX1RTQ0xLX1BHMTA9eQorIyBDT05GSUdfQkY1MThfU1BPUlQwX1RTQ0xLX1BHMTQgaXMgbm90IHNldAorQ09ORklHX0JGNTE4X1VBUlQxX1BPUlRGPXkKKyMgQ09ORklHX0JGNTE4X1VBUlQxX1BPUlRHIGlzIG5vdCBzZXQKKworIworIyBJbnRlcnJ1cHQgUHJpb3JpdHkgQXNzaWdubWVudAorIworCisjCisjIFByaW9yaXR5CisjCitDT05GSUdfSVJRX1BMTF9XQUtFVVA9NworQ09ORklHX0lSUV9ETUEwX0VSUk9SPTcKK0NPTkZJR19JUlFfRE1BUjBfQkxLPTcKK0NPTkZJR19JUlFfRE1BUjFfQkxLPTcKK0NPTkZJR19JUlFfRE1BUjBfT1ZSPTcKK0NPTkZJR19JUlFfRE1BUjFfT1ZSPTcKK0NPTkZJR19JUlFfUFBJX0VSUk9SPTcKK0NPTkZJR19JUlFfTUFDX0VSUk9SPTcKK0NPTkZJR19JUlFfU1BPUlQwX0VSUk9SPTcKK0NPTkZJR19JUlFfU1BPUlQxX0VSUk9SPTcKK0NPTkZJR19JUlFfUFRQX0VSUk9SPTcKK0NPTkZJR19JUlFfVUFSVDBfRVJST1I9NworQ09ORklHX0lSUV9VQVJUMV9FUlJPUj03CitDT05GSUdfSVJRX1JUQz04CitDT05GSUdfSVJRX1BQST04CitDT05GSUdfSVJRX1NQT1JUMF9SWD05CitDT05GSUdfSVJRX1NQT1JUMF9UWD05CitDT05GSUdfSVJRX1NQT1JUMV9SWD05CitDT05GSUdfSVJRX1NQT1JUMV9UWD05CitDT05GSUdfSVJRX1RXST0xMAorQ09ORklHX0lSUV9TUEkwPTEwCitDT05GSUdfSVJRX1VBUlQwX1JYPTEwCitDT05GSUdfSVJRX1VBUlQwX1RYPTEwCitDT05GSUdfSVJRX1VBUlQxX1JYPTEwCitDT05GSUdfSVJRX1VBUlQxX1RYPTEwCitDT05GSUdfSVJRX09QVFNFQz0xMQorQ09ORklHX0lSUV9DTlQ9MTEKK0NPTkZJR19JUlFfTUFDX1JYPTExCitDT05GSUdfSVJRX1BPUlRIX0lOVEE9MTEKK0NPTkZJR19JUlFfTUFDX1RYPTExCitDT05GSUdfSVJRX1BPUlRIX0lOVEI9MTEKK0NPTkZJR19JUlFfVElNRVIwPTEyCitDT05GSUdfSVJRX1RJTUVSMT0xMgorQ09ORklHX0lSUV9USU1FUjI9MTIKK0NPTkZJR19JUlFfVElNRVIzPTEyCitDT05GSUdfSVJRX1RJTUVSND0xMgorQ09ORklHX0lSUV9USU1FUjU9MTIKK0NPTkZJR19JUlFfVElNRVI2PTEyCitDT05GSUdfSVJRX1RJTUVSNz0xMgorQ09ORklHX0lSUV9QT1JUR19JTlRBPTEyCitDT05GSUdfSVJRX1BPUlRHX0lOVEI9MTIKK0NPTkZJR19JUlFfTUVNX0RNQTA9MTMKK0NPTkZJR19JUlFfTUVNX0RNQTE9MTMKK0NPTkZJR19JUlFfV0FUQ0g9MTMKK0NPTkZJR19JUlFfUE9SVEZfSU5UQT0xMworQ09ORklHX0lSUV9QT1JURl9JTlRCPTEzCitDT05GSUdfSVJRX1NQSTBfRVJST1I9NworQ09ORklHX0lSUV9TUEkxX0VSUk9SPTcKK0NPTkZJR19JUlFfUlNJX0lOVDA9NworQ09ORklHX0lSUV9SU0lfSU5UMT03CitDT05GSUdfSVJRX1BXTV9UUklQPTEwCitDT05GSUdfSVJRX1BXTV9TWU5DPTEwCitDT05GSUdfSVJRX1BUUF9TVEFUPTEwCisKKyMKKyMgQm9hcmQgY3VzdG9taXphdGlvbnMKKyMKKyMgQ09ORklHX0NNRExJTkVfQk9PTCBpcyBub3Qgc2V0CitDT05GSUdfQk9PVF9MT0FEPTB4MTAwMAorCisjCisjIENsb2NrL1BMTCBTZXR1cAorIworQ09ORklHX0NMS0lOX0haPTI1MDAwMDAwCisjIENPTkZJR19CRklOX0tFUk5FTF9DTE9DSyBpcyBub3Qgc2V0CitDT05GSUdfTUFYX1ZDT19IWj00MDAwMDAwMDAKK0NPTkZJR19NSU5fVkNPX0haPTUwMDAwMDAwCitDT05GSUdfTUFYX1NDTEtfSFo9MTMzMzMzMzMzCitDT05GSUdfTUlOX1NDTEtfSFo9MjcwMDAwMDAKKworIworIyBLZXJuZWwgVGltZXIvU2NoZWR1bGVyCisjCisjIENPTkZJR19IWl8xMDAgaXMgbm90IHNldAorQ09ORklHX0haXzI1MD15CisjIENPTkZJR19IWl8zMDAgaXMgbm90IHNldAorIyBDT05GSUdfSFpfMTAwMCBpcyBub3Qgc2V0CitDT05GSUdfSFo9MjUwCisjIENPTkZJR19TQ0hFRF9IUlRJQ0sgaXMgbm90IHNldAorQ09ORklHX0dFTkVSSUNfVElNRT15CitDT05GSUdfR0VORVJJQ19DTE9DS0VWRU5UUz15CisjIENPTkZJR19DWUNMRVNfQ0xPQ0tTT1VSQ0UgaXMgbm90IHNldAorIyBDT05GSUdfTk9fSFogaXMgbm90IHNldAorIyBDT05GSUdfSElHSF9SRVNfVElNRVJTIGlzIG5vdCBzZXQKK0NPTkZJR19HRU5FUklDX0NMT0NLRVZFTlRTX0JVSUxEPXkKKworIworIyBNaXNjCisjCitDT05GSUdfQkZJTl9TQ1JBVENIX1JFR19SRVROPXkKKyMgQ09ORklHX0JGSU5fU0NSQVRDSF9SRUdfUkVURSBpcyBub3Qgc2V0CisjIENPTkZJR19CRklOX1NDUkFUQ0hfUkVHX0NZQ0xFUyBpcyBub3Qgc2V0CisKKyMKKyMgQmxhY2tmaW4gS2VybmVsIE9wdGltaXphdGlvbnMKKyMKKworIworIyBNZW1vcnkgT3B0aW1pemF0aW9ucworIworQ09ORklHX0lfRU5UUllfTDE9eQorQ09ORklHX0VYQ1BUX0lSUV9TWVNDX0wxPXkKK0NPTkZJR19ET19JUlFfTDE9eQorQ09ORklHX0NPUkVfVElNRVJfSVJRX0wxPXkKK0NPTkZJR19JRExFX0wxPXkKKyMgQ09ORklHX1NDSEVEVUxFX0wxIGlzIG5vdCBzZXQKK0NPTkZJR19BUklUSE1FVElDX09QU19MMT15CitDT05GSUdfQUNDRVNTX09LX0wxPXkKKyMgQ09ORklHX01FTVNFVF9MMSBpcyBub3Qgc2V0CisjIENPTkZJR19NRU1DUFlfTDEgaXMgbm90IHNldAorIyBDT05GSUdfU1lTX0JGSU5fU1BJTkxPQ0tfTDEgaXMgbm90IHNldAorIyBDT05GSUdfSVBfQ0hFQ0tTVU1fTDEgaXMgbm90IHNldAorQ09ORklHX0NBQ0hFTElORV9BTElHTkVEX0wxPXkKKyMgQ09ORklHX1NZU0NBTExfVEFCX0wxIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQTEJfU1dJVENIX1RBQl9MMSBpcyBub3Qgc2V0CitDT05GSUdfQVBQX1NUQUNLX0wxPXkKKworIworIyBTcGVlZCBPcHRpbWl6YXRpb25zCisjCitDT05GSUdfQkZJTl9JTlNfTE9XT1ZFUkhFQUQ9eQorQ09ORklHX1JBTUtFUk5FTD15CisjIENPTkZJR19ST01LRVJORUwgaXMgbm90IHNldAorQ09ORklHX1NFTEVDVF9NRU1PUllfTU9ERUw9eQorQ09ORklHX0ZMQVRNRU1fTUFOVUFMPXkKKyMgQ09ORklHX0RJU0NPTlRJR01FTV9NQU5VQUwgaXMgbm90IHNldAorIyBDT05GSUdfU1BBUlNFTUVNX01BTlVBTCBpcyBub3Qgc2V0CitDT05GSUdfRkxBVE1FTT15CitDT05GSUdfRkxBVF9OT0RFX01FTV9NQVA9eQorQ09ORklHX1BBR0VGTEFHU19FWFRFTkRFRD15CitDT05GSUdfU1BMSVRfUFRMT0NLX0NQVVM9NAorIyBDT05GSUdfUkVTT1VSQ0VTXzY0QklUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BIWVNfQUREUl9UXzY0QklUIGlzIG5vdCBzZXQKK0NPTkZJR19aT05FX0RNQV9GTEFHPTEKK0NPTkZJR19WSVJUX1RPX0JVUz15CitDT05GSUdfQkZJTl9HUFRJTUVSUz15CisjIENPTkZJR19ETUFfVU5DQUNIRURfNE0gaXMgbm90IHNldAorIyBDT05GSUdfRE1BX1VOQ0FDSEVEXzJNIGlzIG5vdCBzZXQKK0NPTkZJR19ETUFfVU5DQUNIRURfMU09eQorIyBDT05GSUdfRE1BX1VOQ0FDSEVEX05PTkUgaXMgbm90IHNldAorCisjCisjIENhY2hlIFN1cHBvcnQKKyMKK0NPTkZJR19CRklOX0lDQUNIRT15CitDT05GSUdfQkZJTl9EQ0FDSEU9eQorIyBDT05GSUdfQkZJTl9EQ0FDSEVfQkFOS0EgaXMgbm90IHNldAorIyBDT05GSUdfQkZJTl9JQ0FDSEVfTE9DSyBpcyBub3Qgc2V0CitDT05GSUdfQkZJTl9XQj15CisjIENPTkZJR19CRklOX1dUIGlzIG5vdCBzZXQKKyMgQ09ORklHX01QVSBpcyBub3Qgc2V0CisKKyMKKyMgQXN5bmNob25vdXMgTWVtb3J5IENvbmZpZ3VyYXRpb24KKyMKKworIworIyBFQklVX0FNR0NUTCBHbG9iYWwgQ29udHJvbAorIworQ09ORklHX0NfQU1DS0VOPXkKK0NPTkZJR19DX0NEUFJJTz15CisjIENPTkZJR19DX0FNQkVOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NfQU1CRU5fQjAgaXMgbm90IHNldAorIyBDT05GSUdfQ19BTUJFTl9CMF9CMSBpcyBub3Qgc2V0CisjIENPTkZJR19DX0FNQkVOX0IwX0IxX0IyIGlzIG5vdCBzZXQKK0NPTkZJR19DX0FNQkVOX0FMTD15CisKKyMKKyMgRUJJVV9BTUJDVEwgQ29udHJvbAorIworQ09ORklHX0JBTktfMD0weDdCQjAKK0NPTkZJR19CQU5LXzE9MHg1NTU0CitDT05GSUdfQkFOS18yPTB4N0JCMAorQ09ORklHX0JBTktfMz0weEZGQzAKKworIworIyBCdXMgb3B0aW9ucyAoUENJLCBQQ01DSUEsIEVJU0EsIE1DQSwgSVNBKQorIworIyBDT05GSUdfQVJDSF9TVVBQT1JUU19NU0kgaXMgbm90IHNldAorIyBDT05GSUdfUENDQVJEIGlzIG5vdCBzZXQKKworIworIyBFeGVjdXRhYmxlIGZpbGUgZm9ybWF0cworIworQ09ORklHX0JJTkZNVF9FTEZfRkRQSUM9eQorQ09ORklHX0JJTkZNVF9GTEFUPXkKK0NPTkZJR19CSU5GTVRfWkZMQVQ9eQorIyBDT05GSUdfQklORk1UX1NIQVJFRF9GTEFUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hBVkVfQU9VVCBpcyBub3Qgc2V0CisjIENPTkZJR19CSU5GTVRfTUlTQyBpcyBub3Qgc2V0CisKKyMKKyMgUG93ZXIgbWFuYWdlbWVudCBvcHRpb25zCisjCisjIENPTkZJR19QTSBpcyBub3Qgc2V0CitDT05GSUdfQVJDSF9TVVNQRU5EX1BPU1NJQkxFPXkKKyMgQ09ORklHX1BNX1dBS0VVUF9CWV9HUElPIGlzIG5vdCBzZXQKKworIworIyBDUFUgRnJlcXVlbmN5IHNjYWxpbmcKKyMKKyMgQ09ORklHX0NQVV9GUkVRIGlzIG5vdCBzZXQKK0NPTkZJR19ORVQ9eQorCisjCisjIE5ldHdvcmtpbmcgb3B0aW9ucworIworQ09ORklHX1BBQ0tFVD15CisjIENPTkZJR19QQUNLRVRfTU1BUCBpcyBub3Qgc2V0CitDT05GSUdfVU5JWD15CitDT05GSUdfWEZSTT15CisjIENPTkZJR19YRlJNX1VTRVIgaXMgbm90IHNldAorIyBDT05GSUdfWEZSTV9TVUJfUE9MSUNZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1hGUk1fTUlHUkFURSBpcyBub3Qgc2V0CisjIENPTkZJR19YRlJNX1NUQVRJU1RJQ1MgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0tFWSBpcyBub3Qgc2V0CitDT05GSUdfSU5FVD15CisjIENPTkZJR19JUF9NVUxUSUNBU1QgaXMgbm90IHNldAorIyBDT05GSUdfSVBfQURWQU5DRURfUk9VVEVSIGlzIG5vdCBzZXQKK0NPTkZJR19JUF9GSUJfSEFTSD15CitDT05GSUdfSVBfUE5QPXkKKyMgQ09ORklHX0lQX1BOUF9ESENQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX1BOUF9CT09UUCBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9QTlBfUkFSUCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfSVBJUCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfSVBHUkUgaXMgbm90IHNldAorIyBDT05GSUdfQVJQRCBpcyBub3Qgc2V0CitDT05GSUdfU1lOX0NPT0tJRVM9eQorIyBDT05GSUdfSU5FVF9BSCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX0VTUCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX0lQQ09NUCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX1hGUk1fVFVOTkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfVFVOTkVMIGlzIG5vdCBzZXQKK0NPTkZJR19JTkVUX1hGUk1fTU9ERV9UUkFOU1BPUlQ9eQorQ09ORklHX0lORVRfWEZSTV9NT0RFX1RVTk5FTD15CitDT05GSUdfSU5FVF9YRlJNX01PREVfQkVFVD15CisjIENPTkZJR19JTkVUX0xSTyBpcyBub3Qgc2V0CitDT05GSUdfSU5FVF9ESUFHPXkKK0NPTkZJR19JTkVUX1RDUF9ESUFHPXkKKyMgQ09ORklHX1RDUF9DT05HX0FEVkFOQ0VEIGlzIG5vdCBzZXQKK0NPTkZJR19UQ1BfQ09OR19DVUJJQz15CitDT05GSUdfREVGQVVMVF9UQ1BfQ09ORz0iY3ViaWMiCisjIENPTkZJR19UQ1BfTUQ1U0lHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQVjYgaXMgbm90IHNldAorIyBDT05GSUdfTkVUTEFCRUwgaXMgbm90IHNldAorIyBDT05GSUdfTkVUV09SS19TRUNNQVJLIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVEZJTFRFUiBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9EQ0NQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX1NDVFAgaXMgbm90IHNldAorIyBDT05GSUdfVElQQyBpcyBub3Qgc2V0CisjIENPTkZJR19BVE0gaXMgbm90IHNldAorIyBDT05GSUdfQlJJREdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9EU0EgaXMgbm90IHNldAorIyBDT05GSUdfVkxBTl84MDIxUSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUNORVQgaXMgbm90IHNldAorIyBDT05GSUdfTExDMiBpcyBub3Qgc2V0CisjIENPTkZJR19JUFggaXMgbm90IHNldAorIyBDT05GSUdfQVRBTEsgaXMgbm90IHNldAorIyBDT05GSUdfWDI1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0xBUEIgaXMgbm90IHNldAorIyBDT05GSUdfRUNPTkVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dBTl9ST1VURVIgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1NDSEVEIGlzIG5vdCBzZXQKKworIworIyBOZXR3b3JrIHRlc3RpbmcKKyMKKyMgQ09ORklHX05FVF9QS1RHRU4gaXMgbm90IHNldAorIyBDT05GSUdfSEFNUkFESU8gaXMgbm90IHNldAorIyBDT05GSUdfQ0FOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lSREEgaXMgbm90IHNldAorIyBDT05GSUdfQlQgaXMgbm90IHNldAorIyBDT05GSUdfQUZfUlhSUEMgaXMgbm90IHNldAorIyBDT05GSUdfUEhPTkVUIGlzIG5vdCBzZXQKK0NPTkZJR19XSVJFTEVTUz15CisjIENPTkZJR19DRkc4MDIxMSBpcyBub3Qgc2V0CitDT05GSUdfV0lSRUxFU1NfT0xEX1JFR1VMQVRPUlk9eQorIyBDT05GSUdfV0lSRUxFU1NfRVhUIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BQzgwMjExIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lFRUU4MDIxMSBpcyBub3Qgc2V0CisjIENPTkZJR19SRktJTEwgaXMgbm90IHNldAorIyBDT05GSUdfTkVUXzlQIGlzIG5vdCBzZXQKKworIworIyBEZXZpY2UgRHJpdmVycworIworCisjCisjIEdlbmVyaWMgRHJpdmVyIE9wdGlvbnMKKyMKK0NPTkZJR19VRVZFTlRfSEVMUEVSX1BBVEg9Ii9zYmluL2hvdHBsdWciCitDT05GSUdfU1RBTkRBTE9ORT15CitDT05GSUdfUFJFVkVOVF9GSVJNV0FSRV9CVUlMRD15CisjIENPTkZJR19GV19MT0FERVIgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfRFJJVkVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0RFVlJFUyBpcyBub3Qgc2V0CisjIENPTkZJR19TWVNfSFlQRVJWSVNPUiBpcyBub3Qgc2V0CisjIENPTkZJR19DT05ORUNUT1IgaXMgbm90IHNldAorQ09ORklHX01URD15CisjIENPTkZJR19NVERfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0NPTkNBVCBpcyBub3Qgc2V0CitDT05GSUdfTVREX1BBUlRJVElPTlM9eQorIyBDT05GSUdfTVREX1JFREJPT1RfUEFSVFMgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0NNRExJTkVfUEFSVFMgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0FSN19QQVJUUyBpcyBub3Qgc2V0CisKKyMKKyMgVXNlciBNb2R1bGVzIEFuZCBUcmFuc2xhdGlvbiBMYXllcnMKKyMKK0NPTkZJR19NVERfQ0hBUj15CitDT05GSUdfTVREX0JMS0RFVlM9eQorQ09ORklHX01URF9CTE9DSz15CisjIENPTkZJR19GVEwgaXMgbm90IHNldAorIyBDT05GSUdfTkZUTCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkZUTCBpcyBub3Qgc2V0CisjIENPTkZJR19SRkRfRlRMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NTRkRDIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9PT1BTIGlzIG5vdCBzZXQKKworIworIyBSQU0vUk9NL0ZsYXNoIGNoaXAgZHJpdmVycworIworIyBDT05GSUdfTVREX0NGSSBpcyBub3Qgc2V0CitDT05GSUdfTVREX0pFREVDUFJPQkU9bQorQ09ORklHX01URF9HRU5fUFJPQkU9bQorIyBDT05GSUdfTVREX0NGSV9BRFZfT1BUSU9OUyBpcyBub3Qgc2V0CitDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzE9eQorQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8yPXkKK0NPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfND15CisjIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfOCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMTYgaXMgbm90IHNldAorIyBDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzMyIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfQ0ZJX0kxPXkKK0NPTkZJR19NVERfQ0ZJX0kyPXkKKyMgQ09ORklHX01URF9DRklfSTQgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0NGSV9JOCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQ0ZJX0lOVEVMRVhUIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9DRklfQU1EU1REIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9DRklfU1RBQSBpcyBub3Qgc2V0CitDT05GSUdfTVREX1JBTT15CitDT05GSUdfTVREX1JPTT1tCisjIENPTkZJR19NVERfQUJTRU5UIGlzIG5vdCBzZXQKKworIworIyBNYXBwaW5nIGRyaXZlcnMgZm9yIGNoaXAgYWNjZXNzCisjCitDT05GSUdfTVREX0NPTVBMRVhfTUFQUElOR1M9eQorIyBDT05GSUdfTVREX1BIWVNNQVAgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0dQSU9fQUREUiBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfVUNMSU5VWCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfUExBVFJBTSBpcyBub3Qgc2V0CisKKyMKKyMgU2VsZi1jb250YWluZWQgTVREIGRldmljZSBkcml2ZXJzCisjCisjIENPTkZJR19NVERfU0xSQU0gaXMgbm90IHNldAorIyBDT05GSUdfTVREX1BIUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9NVERSQU0gaXMgbm90IHNldAorIyBDT05GSUdfTVREX0JMT0NLMk1URCBpcyBub3Qgc2V0CisKKyMKKyMgRGlzay1Pbi1DaGlwIERldmljZSBEcml2ZXJzCisjCisjIENPTkZJR19NVERfRE9DMjAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfRE9DMjAwMSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfRE9DMjAwMVBMVVMgaXMgbm90IHNldAorIyBDT05GSUdfTVREX05BTkQgaXMgbm90IHNldAorIyBDT05GSUdfTVREX09ORU5BTkQgaXMgbm90IHNldAorCisjCisjIFVCSSAtIFVuc29ydGVkIGJsb2NrIGltYWdlcworIworIyBDT05GSUdfTVREX1VCSSBpcyBub3Qgc2V0CisjIENPTkZJR19QQVJQT1JUIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWPXkKKyMgQ09ORklHX0JMS19ERVZfQ09XX0NPTU1PTiBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0xPT1AgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9OQkQgaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfUkFNPXkKK0NPTkZJR19CTEtfREVWX1JBTV9DT1VOVD0xNgorQ09ORklHX0JMS19ERVZfUkFNX1NJWkU9NDA5NgorIyBDT05GSUdfQkxLX0RFVl9YSVAgaXMgbm90IHNldAorIyBDT05GSUdfQ0RST01fUEtUQ0RWRCBpcyBub3Qgc2V0CisjIENPTkZJR19BVEFfT1ZFUl9FVEggaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9IRCBpcyBub3Qgc2V0CitDT05GSUdfTUlTQ19ERVZJQ0VTPXkKKyMgQ09ORklHX0VFUFJPTV85M0NYNiBpcyBub3Qgc2V0CisjIENPTkZJR19FTkNMT1NVUkVfU0VSVklDRVMgaXMgbm90IHNldAorQ09ORklHX0hBVkVfSURFPXkKKyMgQ09ORklHX0lERSBpcyBub3Qgc2V0CisKKyMKKyMgU0NTSSBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfUkFJRF9BVFRSUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfRE1BIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfTkVUTElOSyBpcyBub3Qgc2V0CisjIENPTkZJR19BVEEgaXMgbm90IHNldAorIyBDT05GSUdfTUQgaXMgbm90IHNldAorQ09ORklHX05FVERFVklDRVM9eQorIyBDT05GSUdfRFVNTVkgaXMgbm90IHNldAorIyBDT05GSUdfQk9ORElORyBpcyBub3Qgc2V0CisjIENPTkZJR19NQUNWTEFOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VRVUFMSVpFUiBpcyBub3Qgc2V0CisjIENPTkZJR19UVU4gaXMgbm90IHNldAorIyBDT05GSUdfVkVUSCBpcyBub3Qgc2V0CitDT05GSUdfUEhZTElCPXkKKworIworIyBNSUkgUEhZIGRldmljZSBkcml2ZXJzCisjCisjIENPTkZJR19NQVJWRUxMX1BIWSBpcyBub3Qgc2V0CisjIENPTkZJR19EQVZJQ09NX1BIWSBpcyBub3Qgc2V0CisjIENPTkZJR19RU0VNSV9QSFkgaXMgbm90IHNldAorIyBDT05GSUdfTFhUX1BIWSBpcyBub3Qgc2V0CisjIENPTkZJR19DSUNBREFfUEhZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZJVEVTU0VfUEhZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NNU0NfUEhZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JST0FEQ09NX1BIWSBpcyBub3Qgc2V0CisjIENPTkZJR19JQ1BMVVNfUEhZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JFQUxURUtfUEhZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZJWEVEX1BIWSBpcyBub3Qgc2V0CisjIENPTkZJR19NRElPX0JJVEJBTkcgaXMgbm90IHNldAorQ09ORklHX05FVF9FVEhFUk5FVD15CitDT05GSUdfTUlJPXkKKyMgQ09ORklHX0JGSU5fTUFDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NNQzkxWCBpcyBub3Qgc2V0CisjIENPTkZJR19TTVNDOTExWCBpcyBub3Qgc2V0CisjIENPTkZJR19ETTkwMDAgaXMgbm90IHNldAorIyBDT05GSUdfSUJNX05FV19FTUFDX1pNSUkgaXMgbm90IHNldAorIyBDT05GSUdfSUJNX05FV19FTUFDX1JHTUlJIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lCTV9ORVdfRU1BQ19UQUggaXMgbm90IHNldAorIyBDT05GSUdfSUJNX05FV19FTUFDX0VNQUM0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0lCTV9ORVdfRU1BQ19OT19GTE9XX0NUUkwgaXMgbm90IHNldAorIyBDT05GSUdfSUJNX05FV19FTUFDX01BTF9DTFJfSUNJTlRTVEFUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lCTV9ORVdfRU1BQ19NQUxfQ09NTU9OX0VSUiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRERVZfMTAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRERVZfMTAwMDAgaXMgbm90IHNldAorCisjCisjIFdpcmVsZXNzIExBTgorIworIyBDT05GSUdfV0xBTl9QUkU4MDIxMSBpcyBub3Qgc2V0CisjIENPTkZJR19XTEFOXzgwMjExIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lXTFdJRklfTEVEUyBpcyBub3Qgc2V0CisjIENPTkZJR19XQU4gaXMgbm90IHNldAorIyBDT05GSUdfUFBQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NMSVAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUQ09OU09MRSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRQT0xMIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIgaXMgbm90IHNldAorIyBDT05GSUdfSVNETiBpcyBub3Qgc2V0CisjIENPTkZJR19QSE9ORSBpcyBub3Qgc2V0CisKKyMKKyMgSW5wdXQgZGV2aWNlIHN1cHBvcnQKKyMKK0NPTkZJR19JTlBVVD15CisjIENPTkZJR19JTlBVVF9GRl9NRU1MRVNTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX1BPTExERVYgaXMgbm90IHNldAorCisjCisjIFVzZXJsYW5kIGludGVyZmFjZXMKKyMKKyMgQ09ORklHX0lOUFVUX01PVVNFREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX0pPWURFViBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9FVkRFViBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9FVkJVRyBpcyBub3Qgc2V0CisKKyMKKyMgSW5wdXQgRGV2aWNlIERyaXZlcnMKKyMKKyMgQ09ORklHX0lOUFVUX0tFWUJPQVJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX01PVVNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX0pPWVNUSUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX1RBQkxFVCBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9UT1VDSFNDUkVFTiBpcyBub3Qgc2V0CitDT05GSUdfSU5QVVRfTUlTQz15CisjIENPTkZJR19JTlBVVF9VSU5QVVQgaXMgbm90IHNldAorIyBDT05GSUdfQ09ORklHX0lOUFVUX1BDRjg1NzQgaXMgbm90IHNldAorCisjCisjIEhhcmR3YXJlIEkvTyBwb3J0cworIworIyBDT05GSUdfU0VSSU8gaXMgbm90IHNldAorIyBDT05GSUdfR0FNRVBPUlQgaXMgbm90IHNldAorCisjCisjIENoYXJhY3RlciBkZXZpY2VzCisjCisjIENPTkZJR19BRDk5NjAgaXMgbm90IHNldAorIyBDT05GSUdfU1BJX0FEQ19CRjUzMyBpcyBub3Qgc2V0CisjIENPTkZJR19CRjV4eF9QUElGQ0QgaXMgbm90IHNldAorIyBDT05GSUdfQkZJTl9TSU1QTEVfVElNRVIgaXMgbm90IHNldAorIyBDT05GSUdfQkY1eHhfUFBJIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGSU5fU1BPUlQgaXMgbm90IHNldAorIyBDT05GSUdfQkZJTl9USU1FUl9MQVRFTkNZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RXSV9MQ0QgaXMgbm90IHNldAorQ09ORklHX0JGSU5fRE1BX0lOVEVSRkFDRT1tCitDT05GSUdfU0lNUExFX0dQSU89bQorQ09ORklHX1ZUPXkKK0NPTkZJR19DT05TT0xFX1RSQU5TTEFUSU9OUz15CitDT05GSUdfVlRfQ09OU09MRT15CitDT05GSUdfSFdfQ09OU09MRT15CisjIENPTkZJR19WVF9IV19DT05TT0xFX0JJTkRJTkcgaXMgbm90IHNldAorIyBDT05GSUdfREVWS01FTSBpcyBub3Qgc2V0CisjIENPTkZJR19CRklOX0pUQUdfQ09NTSBpcyBub3Qgc2V0CisjIENPTkZJR19TRVJJQUxfTk9OU1RBTkRBUkQgaXMgbm90IHNldAorCisjCisjIFNlcmlhbCBkcml2ZXJzCisjCisjIENPTkZJR19TRVJJQUxfODI1MCBpcyBub3Qgc2V0CisKKyMKKyMgTm9uLTgyNTAgc2VyaWFsIHBvcnQgc3VwcG9ydAorIworQ09ORklHX1NFUklBTF9CRklOPXkKK0NPTkZJR19TRVJJQUxfQkZJTl9DT05TT0xFPXkKK0NPTkZJR19TRVJJQUxfQkZJTl9ETUE9eQorIyBDT05GSUdfU0VSSUFMX0JGSU5fUElPIGlzIG5vdCBzZXQKK0NPTkZJR19TRVJJQUxfQkZJTl9VQVJUMD15CisjIENPTkZJR19CRklOX1VBUlQwX0NUU1JUUyBpcyBub3Qgc2V0CisjIENPTkZJR19TRVJJQUxfQkZJTl9VQVJUMSBpcyBub3Qgc2V0CitDT05GSUdfU0VSSUFMX0NPUkU9eQorQ09ORklHX1NFUklBTF9DT1JFX0NPTlNPTEU9eQorIyBDT05GSUdfU0VSSUFMX0JGSU5fU1BPUlQgaXMgbm90IHNldAorQ09ORklHX1VOSVg5OF9QVFlTPXkKKyMgQ09ORklHX0xFR0FDWV9QVFlTIGlzIG5vdCBzZXQKKworIworIyBDQU4sIHRoZSBjYXIgYnVzIGFuZCBpbmR1c3RyaWFsIGZpZWxkYnVzCisjCisjIENPTkZJR19DQU40TElOVVggaXMgbm90IHNldAorIyBDT05GSUdfSVBNSV9IQU5ETEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hXX1JBTkRPTSBpcyBub3Qgc2V0CisjIENPTkZJR19SMzk2NCBpcyBub3Qgc2V0CisjIENPTkZJR19SQVdfRFJJVkVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RDR19UUE0gaXMgbm90IHNldAorQ09ORklHX0kyQz15CitDT05GSUdfSTJDX0JPQVJESU5GTz15CitDT05GSUdfSTJDX0NIQVJERVY9eQorQ09ORklHX0kyQ19IRUxQRVJfQVVUTz15CisKKyMKKyMgSTJDIEhhcmR3YXJlIEJ1cyBzdXBwb3J0CisjCisKKyMKKyMgSTJDIHN5c3RlbSBidXMgZHJpdmVycyAobW9zdGx5IGVtYmVkZGVkIC8gc3lzdGVtLW9uLWNoaXApCisjCitDT05GSUdfSTJDX0JMQUNLRklOX1RXST15CitDT05GSUdfSTJDX0JMQUNLRklOX1RXSV9DTEtfS0haPTEwMAorIyBDT05GSUdfSTJDX0dQSU8gaXMgbm90IHNldAorIyBDT05GSUdfSTJDX09DT1JFUyBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfU0lNVEVDIGlzIG5vdCBzZXQKKworIworIyBFeHRlcm5hbCBJMkMvU01CdXMgYWRhcHRlciBkcml2ZXJzCisjCisjIENPTkZJR19JMkNfUEFSUE9SVF9MSUdIVCBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfVEFPU19FVk0gaXMgbm90IHNldAorCisjCisjIE90aGVyIEkyQy9TTUJ1cyBidXMgZHJpdmVycworIworIyBDT05GSUdfSTJDX1BDQV9QTEFURk9STSBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfU1RVQiBpcyBub3Qgc2V0CisKKyMKKyMgTWlzY2VsbGFuZW91cyBJMkMgQ2hpcCBzdXBwb3J0CisjCisjIENPTkZJR19EUzE2ODIgaXMgbm90IHNldAorIyBDT05GSUdfQVQyNCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FENTI1MiBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0VFUFJPTSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1BDRjg1NzQgaXMgbm90IHNldAorIyBDT05GSUdfUENGODU3NSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1BDQTk1MzkgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19QQ0Y4NTkxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTUFYNjg3NSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1RTTDI1NTAgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0RFQlVHX0NPUkUgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0RFQlVHX0FMR08gaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0RFQlVHX0JVUyBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfREVCVUdfQ0hJUCBpcyBub3Qgc2V0CisjIENPTkZJR19TUEkgaXMgbm90IHNldAorQ09ORklHX0FSQ0hfV0FOVF9PUFRJT05BTF9HUElPTElCPXkKKyMgQ09ORklHX0dQSU9MSUIgaXMgbm90IHNldAorIyBDT05GSUdfVzEgaXMgbm90IHNldAorIyBDT05GSUdfUE9XRVJfU1VQUExZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hXTU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RIRVJNQUwgaXMgbm90IHNldAorIyBDT05GSUdfVEhFUk1BTF9IV01PTiBpcyBub3Qgc2V0CitDT05GSUdfV0FUQ0hET0c9eQorIyBDT05GSUdfV0FUQ0hET0dfTk9XQVlPVVQgaXMgbm90IHNldAorCisjCisjIFdhdGNoZG9nIERldmljZSBEcml2ZXJzCisjCisjIENPTkZJR19TT0ZUX1dBVENIRE9HIGlzIG5vdCBzZXQKK0NPTkZJR19CRklOX1dEVD15CisKKyMKKyMgTXVsdGlmdW5jdGlvbiBkZXZpY2UgZHJpdmVycworIworIyBDT05GSUdfTUZEX0NPUkUgaXMgbm90IHNldAorIyBDT05GSUdfTUZEX1NNNTAxIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hUQ19QQVNJQzMgaXMgbm90IHNldAorIyBDT05GSUdfTUZEX1RNSU8gaXMgbm90IHNldAorIyBDT05GSUdfTUZEX1dNODQwMCBpcyBub3Qgc2V0CisjIENPTkZJR19NRkRfV004MzUwX0kyQyBpcyBub3Qgc2V0CisKKyMKKyMgTXVsdGltZWRpYSBkZXZpY2VzCisjCisKKyMKKyMgTXVsdGltZWRpYSBjb3JlIHN1cHBvcnQKKyMKKyMgQ09ORklHX1ZJREVPX0RFViBpcyBub3Qgc2V0CisjIENPTkZJR19EVkJfQ09SRSBpcyBub3Qgc2V0CisjIENPTkZJR19WSURFT19NRURJQSBpcyBub3Qgc2V0CisKKyMKKyMgTXVsdGltZWRpYSBkcml2ZXJzCisjCisjIENPTkZJR19EQUIgaXMgbm90IHNldAorCisjCisjIEdyYXBoaWNzIHN1cHBvcnQKKyMKKyMgQ09ORklHX1ZHQVNUQVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZJREVPX09VVFBVVF9DT05UUk9MIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JBQ0tMSUdIVF9MQ0RfU1VQUE9SVCBpcyBub3Qgc2V0CisKKyMKKyMgRGlzcGxheSBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfRElTUExBWV9TVVBQT1JUIGlzIG5vdCBzZXQKKworIworIyBDb25zb2xlIGRpc3BsYXkgZHJpdmVyIHN1cHBvcnQKKyMKK0NPTkZJR19EVU1NWV9DT05TT0xFPXkKKyMgQ09ORklHX1NPVU5EIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hJRF9TVVBQT1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TVVBQT1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX01NQyBpcyBub3Qgc2V0CisjIENPTkZJR19NRU1TVElDSyBpcyBub3Qgc2V0CisjIENPTkZJR19ORVdfTEVEUyBpcyBub3Qgc2V0CisjIENPTkZJR19BQ0NFU1NJQklMSVRZIGlzIG5vdCBzZXQKK0NPTkZJR19SVENfTElCPXkKK0NPTkZJR19SVENfQ0xBU1M9eQorQ09ORklHX1JUQ19IQ1RPU1lTPXkKK0NPTkZJR19SVENfSENUT1NZU19ERVZJQ0U9InJ0YzAiCisjIENPTkZJR19SVENfREVCVUcgaXMgbm90IHNldAorCisjCisjIFJUQyBpbnRlcmZhY2VzCisjCitDT05GSUdfUlRDX0lOVEZfU1lTRlM9eQorQ09ORklHX1JUQ19JTlRGX1BST0M9eQorQ09ORklHX1JUQ19JTlRGX0RFVj15CisjIENPTkZJR19SVENfSU5URl9ERVZfVUlFX0VNVUwgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9URVNUIGlzIG5vdCBzZXQKKworIworIyBJMkMgUlRDIGRyaXZlcnMKKyMKKyMgQ09ORklHX1JUQ19EUlZfRFMxMzA3IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfRFMxMzc0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfRFMxNjcyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfTUFYNjkwMCBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX1JTNUMzNzIgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9JU0wxMjA4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfWDEyMDUgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9QQ0Y4NTYzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfUENGODU4MyBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX000MVQ4MCBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX1MzNTM5MEEgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9GTTMxMzAgaXMgbm90IHNldAorCisjCisjIFNQSSBSVEMgZHJpdmVycworIworCisjCisjIFBsYXRmb3JtIFJUQyBkcml2ZXJzCisjCisjIENPTkZJR19SVENfRFJWX0RTMTI4NiBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX0RTMTUxMSBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX0RTMTU1MyBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX0RTMTc0MiBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX1NUSzE3VEE4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfTTQ4VDg2IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfTTQ4VDM1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfTTQ4VDU5IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfQlE0ODAyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfVjMwMjAgaXMgbm90IHNldAorCisjCisjIG9uLUNQVSBSVEMgZHJpdmVycworIworQ09ORklHX1JUQ19EUlZfQkZJTj15CisjIENPTkZJR19ETUFERVZJQ0VTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VJTyBpcyBub3Qgc2V0CisjIENPTkZJR19TVEFHSU5HIGlzIG5vdCBzZXQKKworIworIyBGaWxlIHN5c3RlbXMKKyMKKyMgQ09ORklHX0VYVDJfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRVhUM19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19FWFQ0X0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JFSVNFUkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19GU19QT1NJWF9BQ0wgaXMgbm90IHNldAorQ09ORklHX0ZJTEVfTE9DS0lORz15CisjIENPTkZJR19YRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfT0NGUzJfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRE5PVElGWSBpcyBub3Qgc2V0CitDT05GSUdfSU5PVElGWT15CitDT05GSUdfSU5PVElGWV9VU0VSPXkKKyMgQ09ORklHX1FVT1RBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FVVE9GU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19BVVRPRlM0X0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZVU0VfRlMgaXMgbm90IHNldAorCisjCisjIENELVJPTS9EVkQgRmlsZXN5c3RlbXMKKyMKKyMgQ09ORklHX0lTTzk2NjBfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVURGX0ZTIGlzIG5vdCBzZXQKKworIworIyBET1MvRkFUL05UIEZpbGVzeXN0ZW1zCisjCisjIENPTkZJR19NU0RPU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19WRkFUX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX05URlNfRlMgaXMgbm90IHNldAorCisjCisjIFBzZXVkbyBmaWxlc3lzdGVtcworIworQ09ORklHX1BST0NfRlM9eQorQ09ORklHX1BST0NfU1lTQ1RMPXkKK0NPTkZJR19TWVNGUz15CisjIENPTkZJR19UTVBGUyBpcyBub3Qgc2V0CisjIENPTkZJR19IVUdFVExCX1BBR0UgaXMgbm90IHNldAorIyBDT05GSUdfQ09ORklHRlNfRlMgaXMgbm90IHNldAorCisjCisjIE1pc2NlbGxhbmVvdXMgZmlsZXN5c3RlbXMKKyMKKyMgQ09ORklHX0FERlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQUZGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSEZTUExVU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19CRUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19FRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfWUFGRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSkZGUzJfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JBTUZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZYRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTUlOSVhfRlMgaXMgbm90IHNldAorIyBDT05GSUdfT01GU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IUEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1FOWDRGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19ST01GU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19TWVNWX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VGU19GUyBpcyBub3Qgc2V0CitDT05GSUdfTkVUV09SS19GSUxFU1lTVEVNUz15CitDT05GSUdfTkZTX0ZTPW0KK0NPTkZJR19ORlNfVjM9eQorIyBDT05GSUdfTkZTX1YzX0FDTCBpcyBub3Qgc2V0CisjIENPTkZJR19ORlNfVjQgaXMgbm90IHNldAorIyBDT05GSUdfTkZTRCBpcyBub3Qgc2V0CitDT05GSUdfTE9DS0Q9bQorQ09ORklHX0xPQ0tEX1Y0PXkKK0NPTkZJR19ORlNfQ09NTU9OPXkKK0NPTkZJR19TVU5SUEM9bQorIyBDT05GSUdfU1VOUlBDX1JFR0lTVEVSX1Y0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JQQ1NFQ19HU1NfS1JCNSBpcyBub3Qgc2V0CisjIENPTkZJR19SUENTRUNfR1NTX1NQS00zIGlzIG5vdCBzZXQKK0NPTkZJR19TTUJfRlM9bQorIyBDT05GSUdfU01CX05MU19ERUZBVUxUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NJRlMgaXMgbm90IHNldAorIyBDT05GSUdfTkNQX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NPREFfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQUZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBQYXJ0aXRpb24gVHlwZXMKKyMKKyMgQ09ORklHX1BBUlRJVElPTl9BRFZBTkNFRCBpcyBub3Qgc2V0CitDT05GSUdfTVNET1NfUEFSVElUSU9OPXkKK0NPTkZJR19OTFM9eQorQ09ORklHX05MU19ERUZBVUxUPSJpc284ODU5LTEiCitDT05GSUdfTkxTX0NPREVQQUdFXzQzNz15CisjIENPTkZJR19OTFNfQ09ERVBBR0VfNzM3IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV83NzUgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg1MCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODUyIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NTUgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg1NyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODYwIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjEgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODYzIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjQgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2NSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODY2IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjkgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzkzNiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfOTUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV85MzIgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzk0OSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODc0IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzggaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzEyNTAgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzEyNTEgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0FTQ0lJIGlzIG5vdCBzZXQKK0NPTkZJR19OTFNfSVNPODg1OV8xPXkKKyMgQ09ORklHX05MU19JU084ODU5XzIgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfMyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV80IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzUgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfNiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV83IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzkgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfMTMgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfMTQgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfMTUgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0tPSThfUiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfS09JOF9VIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19VVEY4IGlzIG5vdCBzZXQKKyMgQ09ORklHX0RMTSBpcyBub3Qgc2V0CisKKyMKKyMgS2VybmVsIGhhY2tpbmcKKyMKKyMgQ09ORklHX1BSSU5US19USU1FIGlzIG5vdCBzZXQKK0NPTkZJR19FTkFCTEVfV0FSTl9ERVBSRUNBVEVEPXkKK0NPTkZJR19FTkFCTEVfTVVTVF9DSEVDSz15CitDT05GSUdfRlJBTUVfV0FSTj0xMDI0CisjIENPTkZJR19NQUdJQ19TWVNSUSBpcyBub3Qgc2V0CisjIENPTkZJR19VTlVTRURfU1lNQk9MUyBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfRlM9eQorIyBDT05GSUdfSEVBREVSU19DSEVDSyBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfS0VSTkVMPXkKKyMgQ09ORklHX0RFQlVHX1NISVJRIGlzIG5vdCBzZXQKK0NPTkZJR19ERVRFQ1RfU09GVExPQ0tVUD15CisjIENPTkZJR19CT09UUEFSQU1fU09GVExPQ0tVUF9QQU5JQyBpcyBub3Qgc2V0CitDT05GSUdfQk9PVFBBUkFNX1NPRlRMT0NLVVBfUEFOSUNfVkFMVUU9MAorQ09ORklHX1NDSEVEX0RFQlVHPXkKKyMgQ09ORklHX1NDSEVEU1RBVFMgaXMgbm90IHNldAorIyBDT05GSUdfVElNRVJfU1RBVFMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfT0JKRUNUUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TTEFCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1JUX01VVEVYRVMgaXMgbm90IHNldAorIyBDT05GSUdfUlRfTVVURVhfVEVTVEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NQSU5MT0NLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX01VVEVYRVMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU1BJTkxPQ0tfU0xFRVAgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfTE9DS0lOR19BUElfU0VMRlRFU1RTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0tPQkpFQ1QgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfQlVHVkVSQk9TRSBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfSU5GTz15CisjIENPTkZJR19ERUJVR19WTSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19XUklURUNPVU5UIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX01FTU9SWV9JTklUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0xJU1QgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU0cgaXMgbm90IHNldAorIyBDT05GSUdfRlJBTUVfUE9JTlRFUiBpcyBub3Qgc2V0CisjIENPTkZJR19CT09UX1BSSU5US19ERUxBWSBpcyBub3Qgc2V0CisjIENPTkZJR19SQ1VfVE9SVFVSRV9URVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JDVV9DUFVfU1RBTExfREVURUNUT1IgaXMgbm90IHNldAorIyBDT05GSUdfQkFDS1RSQUNFX1NFTEZfVEVTVCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19CTE9DS19FWFRfREVWVCBpcyBub3Qgc2V0CisjIENPTkZJR19GQVVMVF9JTkpFQ1RJT04gaXMgbm90IHNldAorQ09ORklHX1NZU0NUTF9TWVNDQUxMX0NIRUNLPXkKKyMgQ09ORklHX0RZTkFNSUNfUFJJTlRLX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBTVBMRVMgaXMgbm90IHNldAorQ09ORklHX0hBVkVfQVJDSF9LR0RCPXkKKyMgQ09ORklHX0tHREIgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU1RBQ0tPVkVSRkxPVyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TVEFDS19VU0FHRSBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfVkVSQk9TRT15CitDT05GSUdfREVCVUdfTU1SUz15CisjIENPTkZJR19ERUJVR19IV0VSUiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19ET1VCTEVGQVVMVCBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfSFVOVF9GT1JfWkVSTz15CitDT05GSUdfREVCVUdfQkZJTl9IV1RSQUNFX09OPXkKK0NPTkZJR19ERUJVR19CRklOX0hXVFJBQ0VfQ09NUFJFU1NJT05fT0ZGPXkKKyMgQ09ORklHX0RFQlVHX0JGSU5fSFdUUkFDRV9DT01QUkVTU0lPTl9PTkUgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfQkZJTl9IV1RSQUNFX0NPTVBSRVNTSU9OX1RXTyBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfQkZJTl9IV1RSQUNFX0NPTVBSRVNTSU9OPTAKKyMgQ09ORklHX0RFQlVHX0JGSU5fSFdUUkFDRV9FWFBBTkQgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfQkZJTl9OT19LRVJOX0hXVFJBQ0UgaXMgbm90IHNldAorQ09ORklHX0VBUkxZX1BSSU5USz15CitDT05GSUdfQ1BMQl9JTkZPPXkKK0NPTkZJR19BQ0NFU1NfQ0hFQ0s9eQorCisjCisjIFNlY3VyaXR5IG9wdGlvbnMKKyMKKyMgQ09ORklHX0tFWVMgaXMgbm90IHNldAorQ09ORklHX1NFQ1VSSVRZPXkKKyMgQ09ORklHX1NFQ1VSSVRZRlMgaXMgbm90IHNldAorIyBDT05GSUdfU0VDVVJJVFlfTkVUV09SSyBpcyBub3Qgc2V0CisjIENPTkZJR19TRUNVUklUWV9GSUxFX0NBUEFCSUxJVElFUyBpcyBub3Qgc2V0CitDT05GSUdfU0VDVVJJVFlfREVGQVVMVF9NTUFQX01JTl9BRERSPTAKK0NPTkZJR19DUllQVE89eQorCisjCisjIENyeXB0byBjb3JlIG9yIGhlbHBlcgorIworIyBDT05GSUdfQ1JZUFRPX0ZJUFMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX01BTkFHRVIgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0dGMTI4TVVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19OVUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19DUllQVEQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0FVVEhFTkMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1RFU1QgaXMgbm90IHNldAorCisjCisjIEF1dGhlbnRpY2F0ZWQgRW5jcnlwdGlvbiB3aXRoIEFzc29jaWF0ZWQgRGF0YQorIworIyBDT05GSUdfQ1JZUFRPX0NDTSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fR0NNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TRVFJViBpcyBub3Qgc2V0CisKKyMKKyMgQmxvY2sgbW9kZXMKKyMKKyMgQ09ORklHX0NSWVBUT19DQkMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0NUUiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQ1RTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19FQ0IgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0xSVyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fUENCQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fWFRTIGlzIG5vdCBzZXQKKworIworIyBIYXNoIG1vZGVzCisjCisjIENPTkZJR19DUllQVE9fSE1BQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fWENCQyBpcyBub3Qgc2V0CisKKyMKKyMgRGlnZXN0CisjCisjIENPTkZJR19DUllQVE9fQ1JDMzJDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19NRDQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX01ENSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fTUlDSEFFTF9NSUMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1JNRDEyOCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fUk1EMTYwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19STUQyNTYgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1JNRDMyMCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0hBMSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0hBMjU2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TSEE1MTIgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1RHUjE5MiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fV1A1MTIgaXMgbm90IHNldAorCisjCisjIENpcGhlcnMKKyMKKyMgQ09ORklHX0NSWVBUT19BRVMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0FOVUJJUyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQVJDNCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQkxPV0ZJU0ggaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0NBTUVMTElBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19DQVNUNSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQ0FTVDYgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0RFUyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fRkNSWVBUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19LSEFaQUQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1NBTFNBMjAgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1NFRUQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1NFUlBFTlQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1RFQSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fVFdPRklTSCBpcyBub3Qgc2V0CisKKyMKKyMgQ29tcHJlc3Npb24KKyMKKyMgQ09ORklHX0NSWVBUT19ERUZMQVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19MWk8gaXMgbm90IHNldAorCisjCisjIFJhbmRvbSBOdW1iZXIgR2VuZXJhdGlvbgorIworIyBDT05GSUdfQ1JZUFRPX0FOU0lfQ1BSTkcgaXMgbm90IHNldAorQ09ORklHX0NSWVBUT19IVz15CisKKyMKKyMgTGlicmFyeSByb3V0aW5lcworIworQ09ORklHX0JJVFJFVkVSU0U9eQorQ09ORklHX0NSQ19DQ0lUVD1tCisjIENPTkZJR19DUkMxNiBpcyBub3Qgc2V0CisjIENPTkZJR19DUkNfVDEwRElGIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQ19JVFVfVCBpcyBub3Qgc2V0CitDT05GSUdfQ1JDMzI9eQorIyBDT05GSUdfQ1JDNyBpcyBub3Qgc2V0CisjIENPTkZJR19MSUJDUkMzMkMgaXMgbm90IHNldAorQ09ORklHX1pMSUJfSU5GTEFURT15CitDT05GSUdfUExJU1Q9eQorQ09ORklHX0hBU19JT01FTT15CitDT05GSUdfSEFTX0lPUE9SVD15CitDT05GSUdfSEFTX0RNQT15CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2NvbmZpZ3MvQkY1MjYtRVpCUkRfZGVmY29uZmlnIGIvYXJjaC9ibGFja2Zpbi9jb25maWdzL0JGNTI2LUVaQlJEX2RlZmNvbmZpZwppbmRleCA0NDQzYTQ3Li42OWY2NmMzIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2NvbmZpZ3MvQkY1MjYtRVpCUkRfZGVmY29uZmlnCisrKyBiL2FyY2gvYmxhY2tmaW4vY29uZmlncy9CRjUyNi1FWkJSRF9kZWZjb25maWcKQEAgLTEsNyArMSw2IEBACiAjCiAjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0Ci0jIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMjYuMwotIyBUaHUgQXVnIDI4IDE2OjQ5OjUzIDIwMDgKKyMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4yOC1yYzIKICMKICMgQ09ORklHX01NVSBpcyBub3Qgc2V0CiAjIENPTkZJR19GUFUgaXMgbm90IHNldApAQCAtMzcsOCArMzYsNyBAQAogQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKICMgQ09ORklHX0NHUk9VUFMgaXMgbm90IHNldAogIyBDT05GSUdfR1JPVVBfU0NIRUQgaXMgbm90IHNldAotQ09ORklHX1NZU0ZTX0RFUFJFQ0FURUQ9eQotQ09ORklHX1NZU0ZTX0RFUFJFQ0FURURfVjI9eQorIyBDT05GSUdfU1lTRlNfREVQUkVDQVRFRF9WMiBpcyBub3Qgc2V0CiAjIENPTkZJR19SRUxBWSBpcyBub3Qgc2V0CiAjIENPTkZJR19OQU1FU1BBQ0VTIGlzIG5vdCBzZXQKIENPTkZJR19CTEtfREVWX0lOSVRSRD15CkBAIC00OCwxMyArNDYsMTMgQEAKIENPTkZJR19FTUJFRERFRD15CiBDT05GSUdfVUlEMTY9eQogQ09ORklHX1NZU0NUTF9TWVNDQUxMPXkKLUNPTkZJR19TWVNDVExfU1lTQ0FMTF9DSEVDSz15CiBDT05GSUdfS0FMTFNZTVM9eQorIyBDT05GSUdfS0FMTFNZTVNfQUxMIGlzIG5vdCBzZXQKICMgQ09ORklHX0tBTExTWU1TX0VYVFJBX1BBU1MgaXMgbm90IHNldAogQ09ORklHX0hPVFBMVUc9eQogQ09ORklHX1BSSU5USz15CiBDT05GSUdfQlVHPXkKLUNPTkZJR19FTEZfQ09SRT15CisjIENPTkZJR19FTEZfQ09SRSBpcyBub3Qgc2V0CiBDT05GSUdfQ09NUEFUX0JSSz15CiBDT05GSUdfQkFTRV9GVUxMPXkKIENPTkZJR19GVVRFWD15CkBAIC02Myw2ICs2MSw3IEBACiBDT05GSUdfU0lHTkFMRkQ9eQogQ09ORklHX1RJTUVSRkQ9eQogQ09ORklHX0VWRU5URkQ9eQorQ09ORklHX0FJTz15CiBDT05GSUdfVk1fRVZFTlRfQ09VTlRFUlM9eQogQ09ORklHX1NMQUI9eQogIyBDT05GSUdfU0xVQiBpcyBub3Qgc2V0CkBAIC03MCw5ICs2OSw3IEBACiAjIENPTkZJR19QUk9GSUxJTkcgaXMgbm90IHNldAogIyBDT05GSUdfTUFSS0VSUyBpcyBub3Qgc2V0CiBDT05GSUdfSEFWRV9PUFJPRklMRT15Ci0jIENPTkZJR19IQVZFX0tQUk9CRVMgaXMgbm90IHNldAotIyBDT05GSUdfSEFWRV9LUkVUUFJPQkVTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hBVkVfRE1BX0FUVFJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hBVkVfR0VORVJJQ19ETUFfQ09IRVJFTlQgaXMgbm90IHNldAogQ09ORklHX1NMQUJJTkZPPXkKIENPTkZJR19SVF9NVVRFWEVTPXkKIENPTkZJR19USU5ZX1NITUVNPXkKQEAgLTg5LDYgKzg2LDcgQEAKICMgQ09ORklHX0JMS19ERVZfSU9fVFJBQ0UgaXMgbm90IHNldAogIyBDT05GSUdfTFNGIGlzIG5vdCBzZXQKICMgQ09ORklHX0JMS19ERVZfQlNHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSU5URUdSSVRZIGlzIG5vdCBzZXQKIAogIwogIyBJTyBTY2hlZHVsZXJzCkBAIC0xMDYsNiArMTA0LDcgQEAKICMgQ09ORklHX1BSRUVNUFRfTk9ORSBpcyBub3Qgc2V0CiBDT05GSUdfUFJFRU1QVF9WT0xVTlRBUlk9eQogIyBDT05GSUdfUFJFRU1QVCBpcyBub3Qgc2V0CisjIENPTkZJR19GUkVFWkVSIGlzIG5vdCBzZXQKIAogIwogIyBCbGFja2ZpbiBQcm9jZXNzb3IgT3B0aW9ucwpAQCAtMTE0LDYgKzExMywxMCBAQAogIwogIyBQcm9jZXNzb3IgYW5kIEJvYXJkIFNldHRpbmdzCiAjCisjIENPTkZJR19CRjUxMiBpcyBub3Qgc2V0CisjIENPTkZJR19CRjUxNCBpcyBub3Qgc2V0CisjIENPTkZJR19CRjUxNiBpcyBub3Qgc2V0CisjIENPTkZJR19CRjUxOCBpcyBub3Qgc2V0CiAjIENPTkZJR19CRjUyMiBpcyBub3Qgc2V0CiAjIENPTkZJR19CRjUyMyBpcyBub3Qgc2V0CiAjIENPTkZJR19CRjUyNCBpcyBub3Qgc2V0CkBAIC0xMjYsMjIgKzEyOSw3MSBAQAogIyBDT05GSUdfQkY1MzQgaXMgbm90IHNldAogIyBDT05GSUdfQkY1MzYgaXMgbm90IHNldAogIyBDT05GSUdfQkY1MzcgaXMgbm90IHNldAorIyBDT05GSUdfQkY1MzggaXMgbm90IHNldAorIyBDT05GSUdfQkY1MzkgaXMgbm90IHNldAogIyBDT05GSUdfQkY1NDIgaXMgbm90IHNldAogIyBDT05GSUdfQkY1NDQgaXMgbm90IHNldAogIyBDT05GSUdfQkY1NDcgaXMgbm90IHNldAogIyBDT05GSUdfQkY1NDggaXMgbm90IHNldAogIyBDT05GSUdfQkY1NDkgaXMgbm90IHNldAogIyBDT05GSUdfQkY1NjEgaXMgbm90IHNldAorQ09ORklHX0JGX1JFVl9NSU49MAorQ09ORklHX0JGX1JFVl9NQVg9MgogQ09ORklHX0JGX1JFVl8wXzA9eQogIyBDT05GSUdfQkZfUkVWXzBfMSBpcyBub3Qgc2V0CiAjIENPTkZJR19CRl9SRVZfMF8yIGlzIG5vdCBzZXQKICMgQ09ORklHX0JGX1JFVl8wXzMgaXMgbm90IHNldAogIyBDT05GSUdfQkZfUkVWXzBfNCBpcyBub3Qgc2V0CiAjIENPTkZJR19CRl9SRVZfMF81IGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGX1JFVl8wXzYgaXMgbm90IHNldAogIyBDT05GSUdfQkZfUkVWX0FOWSBpcyBub3Qgc2V0CiAjIENPTkZJR19CRl9SRVZfTk9ORSBpcyBub3Qgc2V0CiBDT05GSUdfQkY1Mng9eQogQ09ORklHX01FTV9NVDQ4TEMzMk0xNkEyVEdfNzU9eQorQ09ORklHX0lSUV9QTExfV0FLRVVQPTcKK0NPTkZJR19JUlFfRE1BMF9FUlJPUj03CitDT05GSUdfSVJRX0RNQVIwX0JMSz03CitDT05GSUdfSVJRX0RNQVIxX0JMSz03CitDT05GSUdfSVJRX0RNQVIwX09WUj03CitDT05GSUdfSVJRX0RNQVIxX09WUj03CitDT05GSUdfSVJRX1BQSV9FUlJPUj03CitDT05GSUdfSVJRX01BQ19FUlJPUj03CitDT05GSUdfSVJRX1NQT1JUMF9FUlJPUj03CitDT05GSUdfSVJRX1NQT1JUMV9FUlJPUj03CitDT05GSUdfSVJRX1VBUlQwX0VSUk9SPTcKK0NPTkZJR19JUlFfVUFSVDFfRVJST1I9NworQ09ORklHX0lSUV9SVEM9OAorQ09ORklHX0lSUV9QUEk9OAorQ09ORklHX0lSUV9TUE9SVDBfUlg9OQorQ09ORklHX0lSUV9TUE9SVDBfVFg9OQorQ09ORklHX0lSUV9TUE9SVDFfUlg9OQorQ09ORklHX0lSUV9TUE9SVDFfVFg9OQorQ09ORklHX0lSUV9UV0k9MTAKK0NPTkZJR19JUlFfVUFSVDBfUlg9MTAKK0NPTkZJR19JUlFfVUFSVDBfVFg9MTAKK0NPTkZJR19JUlFfVUFSVDFfUlg9MTAKK0NPTkZJR19JUlFfVUFSVDFfVFg9MTAKK0NPTkZJR19JUlFfT1BUU0VDPTExCitDT05GSUdfSVJRX0NOVD0xMQorQ09ORklHX0lSUV9NQUNfUlg9MTEKK0NPTkZJR19JUlFfUE9SVEhfSU5UQT0xMQorQ09ORklHX0lSUV9NQUNfVFg9MTEKK0NPTkZJR19JUlFfUE9SVEhfSU5UQj0xMQorQ09ORklHX0lSUV9USU1FUjA9MTIKK0NPTkZJR19JUlFfVElNRVIxPTEyCitDT05GSUdfSVJRX1RJTUVSMj0xMgorQ09ORklHX0lSUV9USU1FUjM9MTIKK0NPTkZJR19JUlFfVElNRVI0PTEyCitDT05GSUdfSVJRX1RJTUVSNT0xMgorQ09ORklHX0lSUV9USU1FUjY9MTIKK0NPTkZJR19JUlFfVElNRVI3PTEyCitDT05GSUdfSVJRX1BPUlRHX0lOVEE9MTIKK0NPTkZJR19JUlFfUE9SVEdfSU5UQj0xMgorQ09ORklHX0lSUV9NRU1fRE1BMD0xMworQ09ORklHX0lSUV9NRU1fRE1BMT0xMworQ09ORklHX0lSUV9XQVRDSD0xMworQ09ORklHX0lSUV9QT1JURl9JTlRBPTEzCitDT05GSUdfSVJRX1BPUlRGX0lOVEI9MTMKICMgQ09ORklHX0JGSU41MjdfRVpLSVQgaXMgbm90IHNldAogIyBDT05GSUdfQkZJTjUyN19CTFVFVEVDSE5JWF9DTSBpcyBub3Qgc2V0CiBDT05GSUdfQkZJTjUyNl9FWkJSRD15CkBAIC0xNjksNTEgKzIyMSw3IEBACiAjCiAjIFByaW9yaXR5CiAjCi1DT05GSUdfSVJRX1BMTF9XQUtFVVA9NwotQ09ORklHX0lSUV9ETUEwX0VSUk9SPTcKLUNPTkZJR19JUlFfRE1BUjBfQkxLPTcKLUNPTkZJR19JUlFfRE1BUjFfQkxLPTcKLUNPTkZJR19JUlFfRE1BUjBfT1ZSPTcKLUNPTkZJR19JUlFfRE1BUjFfT1ZSPTcKLUNPTkZJR19JUlFfUFBJX0VSUk9SPTcKLUNPTkZJR19JUlFfTUFDX0VSUk9SPTcKLUNPTkZJR19JUlFfU1BPUlQwX0VSUk9SPTcKLUNPTkZJR19JUlFfU1BPUlQxX0VSUk9SPTcKLUNPTkZJR19JUlFfVUFSVDBfRVJST1I9NwotQ09ORklHX0lSUV9VQVJUMV9FUlJPUj03Ci1DT05GSUdfSVJRX1JUQz04Ci1DT05GSUdfSVJRX1BQST04Ci1DT05GSUdfSVJRX1NQT1JUMF9SWD05Ci1DT05GSUdfSVJRX1NQT1JUMF9UWD05Ci1DT05GSUdfSVJRX1NQT1JUMV9SWD05Ci1DT05GSUdfSVJRX1NQT1JUMV9UWD05Ci1DT05GSUdfSVJRX1RXST0xMAogQ09ORklHX0lSUV9TUEk9MTAKLUNPTkZJR19JUlFfVUFSVDBfUlg9MTAKLUNPTkZJR19JUlFfVUFSVDBfVFg9MTAKLUNPTkZJR19JUlFfVUFSVDFfUlg9MTAKLUNPTkZJR19JUlFfVUFSVDFfVFg9MTAKLUNPTkZJR19JUlFfT1BUU0VDPTExCi1DT05GSUdfSVJRX0NOVD0xMQotQ09ORklHX0lSUV9NQUNfUlg9MTEKLUNPTkZJR19JUlFfUE9SVEhfSU5UQT0xMQotQ09ORklHX0lSUV9NQUNfVFg9MTEKLUNPTkZJR19JUlFfUE9SVEhfSU5UQj0xMQotQ09ORklHX0lSUV9UTVIwPTEyCi1DT05GSUdfSVJRX1RNUjE9MTIKLUNPTkZJR19JUlFfVE1SMj0xMgotQ09ORklHX0lSUV9UTVIzPTEyCi1DT05GSUdfSVJRX1RNUjQ9MTIKLUNPTkZJR19JUlFfVE1SNT0xMgotQ09ORklHX0lSUV9UTVI2PTEyCi1DT05GSUdfSVJRX1RNUjc9MTIKLUNPTkZJR19JUlFfUE9SVEdfSU5UQT0xMgotQ09ORklHX0lSUV9QT1JUR19JTlRCPTEyCi1DT05GSUdfSVJRX01FTV9ETUEwPTEzCi1DT05GSUdfSVJRX01FTV9ETUExPTEzCi1DT05GSUdfSVJRX1dBVENIPTEzCi1DT05GSUdfSVJRX1BPUlRGX0lOVEE9MTMKLUNPTkZJR19JUlFfUE9SVEZfSU5UQj0xMwogQ09ORklHX0lSUV9TUElfRVJST1I9NwogQ09ORklHX0lSUV9ORkNfRVJST1I9NwogQ09ORklHX0lSUV9IRE1BX0VSUk9SPTcKQEAgLTIzNSw3ICsyNDMsNiBAQAogIwogQ09ORklHX0NMS0lOX0haPTI1MDAwMDAwCiAjIENPTkZJR19CRklOX0tFUk5FTF9DTE9DSyBpcyBub3Qgc2V0Ci1DT05GSUdfTUFYX01FTV9TSVpFPTUxMgogQ09ORklHX01BWF9WQ09fSFo9NDAwMDAwMDAwCiBDT05GSUdfTUlOX1ZDT19IWj01MDAwMDAwMAogQ09ORklHX01BWF9TQ0xLX0haPTEzMzMzMzMzMwpAQCAtMjUzLDE2ICsyNjAsMTEgQEAKIENPTkZJR19HRU5FUklDX1RJTUU9eQogQ09ORklHX0dFTkVSSUNfQ0xPQ0tFVkVOVFM9eQogIyBDT05GSUdfQ1lDTEVTX0NMT0NLU09VUkNFIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RJQ0tfT05FU0hPVCBpcyBub3Qgc2V0CiAjIENPTkZJR19OT19IWiBpcyBub3Qgc2V0CiAjIENPTkZJR19ISUdIX1JFU19USU1FUlMgaXMgbm90IHNldAogQ09ORklHX0dFTkVSSUNfQ0xPQ0tFVkVOVFNfQlVJTEQ9eQogCiAjCi0jIE1lbW9yeSBTZXR1cAotIwotCi0jCiAjIE1pc2MKICMKIENPTkZJR19CRklOX1NDUkFUQ0hfUkVHX1JFVE49eQpAQCAtMjkxLDYgKzI5Myw3IEBACiBDT05GSUdfQ0FDSEVMSU5FX0FMSUdORURfTDE9eQogIyBDT05GSUdfU1lTQ0FMTF9UQUJfTDEgaXMgbm90IHNldAogIyBDT05GSUdfQ1BMQl9TV0lUQ0hfVEFCX0wxIGlzIG5vdCBzZXQKK0NPTkZJR19BUFBfU1RBQ0tfTDE9eQogCiAjCiAjIFNwZWVkIE9wdGltaXphdGlvbnMKQEAgLTMwNCwxNSArMzA3LDEzIEBACiAjIENPTkZJR19TUEFSU0VNRU1fTUFOVUFMIGlzIG5vdCBzZXQKIENPTkZJR19GTEFUTUVNPXkKIENPTkZJR19GTEFUX05PREVfTUVNX01BUD15Ci0jIENPTkZJR19TUEFSU0VNRU1fU1RBVElDIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NQQVJTRU1FTV9WTUVNTUFQX0VOQUJMRSBpcyBub3Qgc2V0CiBDT05GSUdfUEFHRUZMQUdTX0VYVEVOREVEPXkKIENPTkZJR19TUExJVF9QVExPQ0tfQ1BVUz00CiAjIENPTkZJR19SRVNPVVJDRVNfNjRCSVQgaXMgbm90IHNldAorIyBDT05GSUdfUEhZU19BRERSX1RfNjRCSVQgaXMgbm90IHNldAogQ09ORklHX1pPTkVfRE1BX0ZMQUc9MQogQ09ORklHX1ZJUlRfVE9fQlVTPXkKIENPTkZJR19CRklOX0dQVElNRVJTPXkKLUNPTkZJR19CRklOX0RNQV81WFg9eQogIyBDT05GSUdfRE1BX1VOQ0FDSEVEXzRNIGlzIG5vdCBzZXQKICMgQ09ORklHX0RNQV9VTkNBQ0hFRF8yTSBpcyBub3Qgc2V0CiBDT05GSUdfRE1BX1VOQ0FDSEVEXzFNPXkKQEAgLTM2NSw2ICszNjYsNyBAQAogQ09ORklHX0JJTkZNVF9GTEFUPXkKIENPTkZJR19CSU5GTVRfWkZMQVQ9eQogIyBDT05GSUdfQklORk1UX1NIQVJFRF9GTEFUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hBVkVfQU9VVCBpcyBub3Qgc2V0CiAjIENPTkZJR19CSU5GTVRfTUlTQyBpcyBub3Qgc2V0CiAKICMKQEAgLTM3OCwxMCArMzgwLDYgQEAKICMgQ1BVIEZyZXF1ZW5jeSBzY2FsaW5nCiAjCiAjIENPTkZJR19DUFVfRlJFUSBpcyBub3Qgc2V0Ci0KLSMKLSMgTmV0d29ya2luZwotIwogQ09ORklHX05FVD15CiAKICMKQEAgLTQzMiw2ICs0MzAsNyBAQAogIyBDT05GSUdfVElQQyBpcyBub3Qgc2V0CiAjIENPTkZJR19BVE0gaXMgbm90IHNldAogIyBDT05GSUdfQlJJREdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9EU0EgaXMgbm90IHNldAogIyBDT05GSUdfVkxBTl84MDIxUSBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUNORVQgaXMgbm90IHNldAogIyBDT05GSUdfTExDMiBpcyBub3Qgc2V0CkBAIC00NTIsMTEgKzQ1MSwxMCBAQAogIyBDT05GSUdfSVJEQSBpcyBub3Qgc2V0CiAjIENPTkZJR19CVCBpcyBub3Qgc2V0CiAjIENPTkZJR19BRl9SWFJQQyBpcyBub3Qgc2V0Ci0KLSMKLSMgV2lyZWxlc3MKLSMKKyMgQ09ORklHX1BIT05FVCBpcyBub3Qgc2V0CitDT05GSUdfV0lSRUxFU1M9eQogIyBDT05GSUdfQ0ZHODAyMTEgaXMgbm90IHNldAorQ09ORklHX1dJUkVMRVNTX09MRF9SRUdVTEFUT1JZPXkKICMgQ09ORklHX1dJUkVMRVNTX0VYVCBpcyBub3Qgc2V0CiAjIENPTkZJR19NQUM4MDIxMSBpcyBub3Qgc2V0CiAjIENPTkZJR19JRUVFODAyMTEgaXMgbm90IHNldApAQCAtNDc0LDYgKzQ3Miw4IEBACiBDT05GSUdfU1RBTkRBTE9ORT15CiBDT05GSUdfUFJFVkVOVF9GSVJNV0FSRV9CVUlMRD15CiAjIENPTkZJR19GV19MT0FERVIgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfRFJJVkVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0RFVlJFUyBpcyBub3Qgc2V0CiAjIENPTkZJR19TWVNfSFlQRVJWSVNPUiBpcyBub3Qgc2V0CiAjIENPTkZJR19DT05ORUNUT1IgaXMgbm90IHNldAogQ09ORklHX01URD15CkBAIC01MzQsNyArNTM0LDggQEAKICMgU2VsZi1jb250YWluZWQgTVREIGRldmljZSBkcml2ZXJzCiAjCiAjIENPTkZJR19NVERfREFUQUZMQVNIIGlzIG5vdCBzZXQKLSMgQ09ORklHX01URF9NMjVQODAgaXMgbm90IHNldAorQ09ORklHX01URF9NMjVQODA9eQorQ09ORklHX00yNVBYWF9VU0VfRkFTVF9SRUFEPXkKICMgQ09ORklHX01URF9TTFJBTSBpcyBub3Qgc2V0CiAjIENPTkZJR19NVERfUEhSQU0gaXMgbm90IHNldAogIyBDT05GSUdfTVREX01URFJBTSBpcyBub3Qgc2V0CkBAIC01NzksNiArNTgwLDcgQEAKICMgQ09ORklHX0JMS19ERVZfWElQIGlzIG5vdCBzZXQKICMgQ09ORklHX0NEUk9NX1BLVENEVkQgaXMgbm90IHNldAogIyBDT05GSUdfQVRBX09WRVJfRVRIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSEQgaXMgbm90IHNldAogQ09ORklHX01JU0NfREVWSUNFUz15CiAjIENPTkZJR19FRVBST01fOTNDWDYgaXMgbm90IHNldAogIyBDT05GSUdfRU5DTE9TVVJFX1NFUlZJQ0VTIGlzIG5vdCBzZXQKQEAgLTU5NSw3ICs1OTcsNiBAQAogIyBDT05GSUdfQVRBIGlzIG5vdCBzZXQKICMgQ09ORklHX01EIGlzIG5vdCBzZXQKIENPTkZJR19ORVRERVZJQ0VTPXkKLSMgQ09ORklHX05FVERFVklDRVNfTVVMVElRVUVVRSBpcyBub3Qgc2V0CiAjIENPTkZJR19EVU1NWSBpcyBub3Qgc2V0CiAjIENPTkZJR19CT05ESU5HIGlzIG5vdCBzZXQKICMgQ09ORklHX01BQ1ZMQU4gaXMgbm90IHNldApAQCAtNjMzLDkgKzYzNCwxMCBAQAogIyBDT05GSUdfSUJNX05FV19FTUFDX1JHTUlJIGlzIG5vdCBzZXQKICMgQ09ORklHX0lCTV9ORVdfRU1BQ19UQUggaXMgbm90IHNldAogIyBDT05GSUdfSUJNX05FV19FTUFDX0VNQUM0IGlzIG5vdCBzZXQKLSMgQ09ORklHX0I0NCBpcyBub3Qgc2V0CisjIENPTkZJR19JQk1fTkVXX0VNQUNfTk9fRkxPV19DVFJMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lCTV9ORVdfRU1BQ19NQUxfQ0xSX0lDSU5UU1RBVCBpcyBub3Qgc2V0CisjIENPTkZJR19JQk1fTkVXX0VNQUNfTUFMX0NPTU1PTl9FUlIgaXMgbm90IHNldAogQ09ORklHX05FVERFVl8xMDAwPXkKLSMgQ09ORklHX0UxMDAwRV9FTkFCTEVEIGlzIG5vdCBzZXQKICMgQ09ORklHX0FYODgxODAgaXMgbm90IHNldAogQ09ORklHX05FVERFVl8xMDAwMD15CiAKQEAgLTY2Nyw3ICs2NjksNyBAQAogIyBJbnB1dCBkZXZpY2Ugc3VwcG9ydAogIwogQ09ORklHX0lOUFVUPXkKLSMgQ09ORklHX0lOUFVUX0ZGX01FTUxFU1MgaXMgbm90IHNldAorQ09ORklHX0lOUFVUX0ZGX01FTUxFU1M9bQogIyBDT05GSUdfSU5QVVRfUE9MTERFViBpcyBub3Qgc2V0CiAKICMKQEAgLTY5Miw4ICs2OTQsOSBAQAogIyBDT05GSUdfSU5QVVRfS0VZU1BBTl9SRU1PVEUgaXMgbm90IHNldAogIyBDT05GSUdfSU5QVVRfUE9XRVJNQVRFIGlzIG5vdCBzZXQKICMgQ09ORklHX0lOUFVUX1lFQUxJTksgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfQ00xMDkgaXMgbm90IHNldAogIyBDT05GSUdfSU5QVVRfVUlOUFVUIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RXSV9LRVlQQUQgaXMgbm90IHNldAorIyBDT05GSUdfQ09ORklHX0lOUFVUX1BDRjg1NzQgaXMgbm90IHNldAogCiAjCiAjIEhhcmR3YXJlIEkvTyBwb3J0cwpAQCAtNzEyLDEyICs3MTUsMTUgQEAKICMgQ09ORklHX0JGSU5fU1BPUlQgaXMgbm90IHNldAogIyBDT05GSUdfQkZJTl9USU1FUl9MQVRFTkNZIGlzIG5vdCBzZXQKICMgQ09ORklHX1RXSV9MQ0QgaXMgbm90IHNldAorQ09ORklHX0JGSU5fRE1BX0lOVEVSRkFDRT1tCiBDT05GSUdfU0lNUExFX0dQSU89bQogQ09ORklHX1ZUPXkKK0NPTkZJR19DT05TT0xFX1RSQU5TTEFUSU9OUz15CiBDT05GSUdfVlRfQ09OU09MRT15CiBDT05GSUdfSFdfQ09OU09MRT15CiAjIENPTkZJR19WVF9IV19DT05TT0xFX0JJTkRJTkcgaXMgbm90IHNldAotQ09ORklHX0RFVktNRU09eQorIyBDT05GSUdfREVWS01FTSBpcyBub3Qgc2V0CisjIENPTkZJR19CRklOX0pUQUdfQ09NTSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRVJJQUxfTk9OU1RBTkRBUkQgaXMgbm90IHNldAogCiAjCkBAIC03NjAsMjUgKzc2NiwzOSBAQAogIwogIyBJMkMgSGFyZHdhcmUgQnVzIHN1cHBvcnQKICMKKworIworIyBJMkMgc3lzdGVtIGJ1cyBkcml2ZXJzIChtb3N0bHkgZW1iZWRkZWQgLyBzeXN0ZW0tb24tY2hpcCkKKyMKIENPTkZJR19JMkNfQkxBQ0tGSU5fVFdJPXkKLUNPTkZJR19JMkNfQkxBQ0tGSU5fVFdJX0NMS19LSFo9NTAKK0NPTkZJR19JMkNfQkxBQ0tGSU5fVFdJX0NMS19LSFo9MTAwCiAjIENPTkZJR19JMkNfR1BJTyBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfT0NPUkVTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19QQVJQT1JUX0xJR0hUIGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19TSU1URUMgaXMgbm90IHNldAorCisjCisjIEV4dGVybmFsIEkyQy9TTUJ1cyBhZGFwdGVyIGRyaXZlcnMKKyMKKyMgQ09ORklHX0kyQ19QQVJQT1JUX0xJR0hUIGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19UQU9TX0VWTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19JMkNfU1RVQiBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfVElOWV9VU0IgaXMgbm90IHNldAorCisjCisjIE90aGVyIEkyQy9TTUJ1cyBidXMgZHJpdmVycworIwogIyBDT05GSUdfSTJDX1BDQV9QTEFURk9STSBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfU1RVQiBpcyBub3Qgc2V0CiAKICMKICMgTWlzY2VsbGFuZW91cyBJMkMgQ2hpcCBzdXBwb3J0CiAjCiAjIENPTkZJR19EUzE2ODIgaXMgbm90IHNldAorIyBDT05GSUdfQVQyNCBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0FENTI1MiBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0VFUFJPTSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1BDRjg1NzQgaXMgbm90IHNldAogIyBDT05GSUdfUENGODU3NSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1BDQTk1MzkgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19QQ0Y4NTkxIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfTUFYNjg3NSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1RTTDI1NTAgaXMgbm90IHNldApAQCAtNzg3LDEyICs4MDcsMTQgQEAKICMgQ09ORklHX0kyQ19ERUJVR19CVVMgaXMgbm90IHNldAogIyBDT05GSUdfSTJDX0RFQlVHX0NISVAgaXMgbm90IHNldAogQ09ORklHX1NQST15CisjIENPTkZJR19TUElfREVCVUcgaXMgbm90IHNldAogQ09ORklHX1NQSV9NQVNURVI9eQogCiAjCiAjIFNQSSBNYXN0ZXIgQ29udHJvbGxlciBEcml2ZXJzCiAjCiBDT05GSUdfU1BJX0JGSU49eQorIyBDT05GSUdfU1BJX0JGSU5fTE9DSyBpcyBub3Qgc2V0CiAjIENPTkZJR19TUElfQklUQkFORyBpcyBub3Qgc2V0CiAKICMKQEAgLTgwMSwxMSArODIzLDE1IEBACiAjIENPTkZJR19TUElfQVQyNSBpcyBub3Qgc2V0CiAjIENPTkZJR19TUElfU1BJREVWIGlzIG5vdCBzZXQKICMgQ09ORklHX1NQSV9UTEU2MlgwIGlzIG5vdCBzZXQKK0NPTkZJR19BUkNIX1dBTlRfT1BUSU9OQUxfR1BJT0xJQj15CisjIENPTkZJR19HUElPTElCIGlzIG5vdCBzZXQKICMgQ09ORklHX1cxIGlzIG5vdCBzZXQKICMgQ09ORklHX1BPV0VSX1NVUFBMWSBpcyBub3Qgc2V0CiBDT05GSUdfSFdNT049eQogIyBDT05GSUdfSFdNT05fVklEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQUQ3NDE0IGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfQUQ3NDE4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQURDWFggaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19BRE0xMDIxIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfQURNMTAyNSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0FETTEwMjYgaXMgbm90IHNldApAQCAtODM0LDYgKzg2MCw3IEBACiAjIENPTkZJR19TRU5TT1JTX0xNOTAgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19MTTkyIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfTE05MyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX01BWDExMTEgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19NQVgxNjE5IGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfTUFYNjY1MCBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1BDODczNjAgaXMgbm90IHNldApAQCAtODcxLDE2ICs4OTgsMTQgQEAKICMgQ09ORklHX1VTQlBDV0FUQ0hET0cgaXMgbm90IHNldAogCiAjCi0jIFNvbmljcyBTaWxpY29uIEJhY2twbGFuZQotIwotQ09ORklHX1NTQl9QT1NTSUJMRT15Ci0jIENPTkZJR19TU0IgaXMgbm90IHNldAotCi0jCiAjIE11bHRpZnVuY3Rpb24gZGV2aWNlIGRyaXZlcnMKICMKKyMgQ09ORklHX01GRF9DT1JFIGlzIG5vdCBzZXQKICMgQ09ORklHX01GRF9TTTUwMSBpcyBub3Qgc2V0CiAjIENPTkZJR19IVENfUEFTSUMzIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9UTUlPIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9XTTg0MDAgaXMgbm90IHNldAorIyBDT05GSUdfTUZEX1dNODM1MF9JMkMgaXMgbm90IHNldAogCiAjCiAjIE11bHRpbWVkaWEgZGV2aWNlcwpAQCAtOTE1LDE1ICs5NDAsOCBAQAogIyBDb25zb2xlIGRpc3BsYXkgZHJpdmVyIHN1cHBvcnQKICMKIENPTkZJR19EVU1NWV9DT05TT0xFPXkKLQotIwotIyBTb3VuZAotIwogQ09ORklHX1NPVU5EPW0KLQotIwotIyBBZHZhbmNlZCBMaW51eCBTb3VuZCBBcmNoaXRlY3R1cmUKLSMKK0NPTkZJR19TT1VORF9PU1NfQ09SRT15CiBDT05GSUdfU05EPW0KIENPTkZJR19TTkRfVElNRVI9bQogQ09ORklHX1NORF9QQ009bQpAQCAtOTM3LDU2ICs5NTUsNDAgQEAKIENPTkZJR19TTkRfVkVSQk9TRV9QUk9DRlM9eQogIyBDT05GSUdfU05EX1ZFUkJPU0VfUFJJTlRLIGlzIG5vdCBzZXQKICMgQ09ORklHX1NORF9ERUJVRyBpcyBub3Qgc2V0Ci0KLSMKLSMgR2VuZXJpYyBkZXZpY2VzCi0jCitDT05GSUdfU05EX0RSSVZFUlM9eQogIyBDT05GSUdfU05EX0RVTU1ZIGlzIG5vdCBzZXQKICMgQ09ORklHX1NORF9NVFBBViBpcyBub3Qgc2V0CiAjIENPTkZJR19TTkRfU0VSSUFMX1UxNjU1MCBpcyBub3Qgc2V0CiAjIENPTkZJR19TTkRfTVBVNDAxIGlzIG5vdCBzZXQKLQotIwotIyBTUEkgZGV2aWNlcwotIworQ09ORklHX1NORF9TUEk9eQogCiAjCiAjIEFMU0EgQmxhY2tmaW4gZGV2aWNlcwogIwogIyBDT05GSUdfU05EX0JMQUNLRklOX0FEMTgzNiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfQkZJTl9BRDczMzExIGlzIG5vdCBzZXQKICMgQ09ORklHX1NORF9CRklOX0FENzMzMjIgaXMgbm90IHNldAotCi0jCi0jIFVTQiBkZXZpY2VzCi0jCitDT05GSUdfU05EX1VTQj15CiAjIENPTkZJR19TTkRfVVNCX0FVRElPIGlzIG5vdCBzZXQKICMgQ09ORklHX1NORF9VU0JfQ0FJQVEgaXMgbm90IHNldAotCi0jCi0jIFN5c3RlbSBvbiBDaGlwIGF1ZGlvIHN1cHBvcnQKLSMKIENPTkZJR19TTkRfU09DPW0KK0NPTkZJR19TTkRfU09DX0FDOTdfQlVTPXkKIENPTkZJR19TTkRfQkY1WFhfSTJTPW0KIENPTkZJR19TTkRfQkY1WFhfU09DX1NTTTI2MDI9bQotIyBDT05GSUdfU05EX0JGNVhYX0FDOTcgaXMgbm90IHNldAorIyBDT05GSUdfU05EX0JGNVhYX1NPQ19BRDczMzExIGlzIG5vdCBzZXQKK0NPTkZJR19TTkRfQkY1WFhfQUM5Nz1tCitDT05GSUdfU05EX0JGNVhYX01NQVBfU1VQUE9SVD15CisjIENPTkZJR19TTkRfQkY1WFhfTVVMVElDSEFOX1NVUFBPUlQgaXMgbm90IHNldAogQ09ORklHX1NORF9CRjVYWF9TT0NfU1BPUlQ9bQogQ09ORklHX1NORF9CRjVYWF9TT0NfSTJTPW0KK0NPTkZJR19TTkRfQkY1WFhfU09DX0FDOTc9bQorQ09ORklHX1NORF9CRjVYWF9TT0NfQUQxOTgwPW0KIENPTkZJR19TTkRfQkY1WFhfU1BPUlRfTlVNPTAKLQotIwotIyBBTFNBIFNvQyBhdWRpbyBmb3IgRnJlZXNjYWxlIFNPQ3MKLSMKLQotIwotIyBTb0MgQXVkaW8gZm9yIHRoZSBUZXhhcyBJbnN0cnVtZW50cyBPTUFQCi0jCisjIENPTkZJR19TTkRfQkY1WFhfSEFWRV9DT0xEX1JFU0VUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9TT0NfQUxMX0NPREVDUyBpcyBub3Qgc2V0CitDT05GSUdfU05EX1NPQ19BRDE5ODA9bQogQ09ORklHX1NORF9TT0NfU1NNMjYwMj1tCi0KLSMKLSMgT3BlbiBTb3VuZCBTeXN0ZW0KLSMKICMgQ09ORklHX1NPVU5EX1BSSU1FIGlzIG5vdCBzZXQKK0NPTkZJR19BQzk3X0JVUz1tCiBDT05GSUdfSElEX1NVUFBPUlQ9eQogQ09ORklHX0hJRD15CiAjIENPTkZJR19ISURfREVCVUcgaXMgbm90IHNldApAQCAtOTk2LDkgKzk5OCwzNiBAQAogIyBVU0IgSW5wdXQgRGV2aWNlcwogIwogQ09ORklHX1VTQl9ISUQ9eQotIyBDT05GSUdfVVNCX0hJRElOUFVUX1BPV0VSQk9PSyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ISURfRkYgaXMgbm90IHNldAorIyBDT05GSUdfSElEX1BJRCBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfSElEREVWIGlzIG5vdCBzZXQKKworIworIyBTcGVjaWFsIEhJRCBkcml2ZXJzCisjCitDT05GSUdfSElEX0NPTVBBVD15CitDT05GSUdfSElEX0E0VEVDSD15CitDT05GSUdfSElEX0FQUExFPXkKK0NPTkZJR19ISURfQkVMS0lOPXkKK0NPTkZJR19ISURfQlJJR0hUPXkKK0NPTkZJR19ISURfQ0hFUlJZPXkKK0NPTkZJR19ISURfQ0hJQ09OWT15CitDT05GSUdfSElEX0NZUFJFU1M9eQorQ09ORklHX0hJRF9ERUxMPXkKK0NPTkZJR19ISURfRVpLRVk9eQorQ09ORklHX0hJRF9HWVJBVElPTj15CitDT05GSUdfSElEX0xPR0lURUNIPXkKKyMgQ09ORklHX0xPR0lURUNIX0ZGIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xPR0lSVU1CTEVQQUQyX0ZGIGlzIG5vdCBzZXQKK0NPTkZJR19ISURfTUlDUk9TT0ZUPXkKK0NPTkZJR19ISURfTU9OVEVSRVk9eQorQ09ORklHX0hJRF9QQU5USEVSTE9SRD15CisjIENPTkZJR19QQU5USEVSTE9SRF9GRiBpcyBub3Qgc2V0CitDT05GSUdfSElEX1BFVEFMWU5YPXkKK0NPTkZJR19ISURfU0FNU1VORz15CitDT05GSUdfSElEX1NPTlk9eQorQ09ORklHX0hJRF9TVU5QTFVTPXkKK0NPTkZJR19USFJVU1RNQVNURVJfRkY9bQorQ09ORklHX1pFUk9QTFVTX0ZGPW0KIENPTkZJR19VU0JfU1VQUE9SVD15CiBDT05GSUdfVVNCX0FSQ0hfSEFTX0hDRD15CiAjIENPTkZJR19VU0JfQVJDSF9IQVNfT0hDSSBpcyBub3Qgc2V0CkBAIC0xMDE2LDYgKzEwNDUsOSBAQAogIyBDT05GSUdfVVNCX09URyBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfT1RHX1dISVRFTElTVCBpcyBub3Qgc2V0CiBDT05GSUdfVVNCX09UR19CTEFDS0xJU1RfSFVCPXkKK0NPTkZJR19VU0JfTU9OPXkKKyMgQ09ORklHX1VTQl9XVVNCIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9XVVNCX0NCQUYgaXMgbm90IHNldAogCiAjCiAjIFVTQiBIb3N0IENvbnRyb2xsZXIgRHJpdmVycwpAQCAtMTAyNiw2ICsxMDU4LDcgQEAKICMgQ09ORklHX1VTQl9JU1AxMzYyX0hDRCBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfU0w4MTFfSENEIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9SOEE2NjU5N19IQ0QgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0hXQV9IQ0QgaXMgbm90IHNldAogQ09ORklHX1VTQl9NVVNCX0hEUkM9eQogQ09ORklHX1VTQl9NVVNCX1NPQz15CiAKQEAgLTEwMzcsNyArMTA3MCw3IEBACiAjIENPTkZJR19VU0JfTVVTQl9PVEcgaXMgbm90IHNldAogQ09ORklHX1VTQl9NVVNCX0hEUkNfSENEPXkKIENPTkZJR19NVVNCX1BJT19PTkxZPXkKLUNPTkZJR19VU0JfTVVTQl9MT0dMRVZFTD0wCisjIENPTkZJR19VU0JfTVVTQl9ERUJVRyBpcyBub3Qgc2V0CiAKICMKICMgVVNCIERldmljZSBDbGFzcyBkcml2ZXJzCkBAIC0xMDQ1LDYgKzEwNzgsNyBAQAogIyBDT05GSUdfVVNCX0FDTSBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfUFJJTlRFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfV0RNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9UTUMgaXMgbm90IHNldAogCiAjCiAjIE5PVEU6IFVTQl9TVE9SQUdFIGVuYWJsZXMgU0NTSSwgYW5kICdTQ1NJIGRpc2sgc3VwcG9ydCcKQEAgLTEwNTksNyArMTA5Myw2IEBACiAjIFVTQiBJbWFnaW5nIGRldmljZXMKICMKICMgQ09ORklHX1VTQl9NREM4MDAgaXMgbm90IHNldAotQ09ORklHX1VTQl9NT049eQogCiAjCiAjIFVTQiBwb3J0IGRyaXZlcnMKQEAgLTEwNzIsNyArMTEwNSw3IEBACiAjIENPTkZJR19VU0JfRU1JNjIgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX0VNSTI2IGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9BRFVUVVggaXMgbm90IHNldAotIyBDT05GSUdfVVNCX0FVRVJTV0FMRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0VWU0VHIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9SSU81MDAgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX0xFR09UT1dFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfTENEIGlzIG5vdCBzZXQKQEAgLTEwODksNiArMTEyMiw3IEBACiAjIENPTkZJR19VU0JfVFJBTkNFVklCUkFUT1IgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX0lPV0FSUklPUiBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfSVNJR0hURlcgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1ZTVCBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfR0FER0VUIGlzIG5vdCBzZXQKICMgQ09ORklHX01NQyBpcyBub3Qgc2V0CiAjIENPTkZJR19NRU1TVElDSyBpcyBub3Qgc2V0CkBAIC0xMTI4LDM2ICsxMTYyLDQ1IEBACiAjCiAjIFNQSSBSVEMgZHJpdmVycwogIworIyBDT05GSUdfUlRDX0RSVl9NNDFUOTQgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9EUzEzMDUgaXMgbm90IHNldAogIyBDT05GSUdfUlRDX0RSVl9NQVg2OTAyIGlzIG5vdCBzZXQKICMgQ09ORklHX1JUQ19EUlZfUjk3MDEgaXMgbm90IHNldAogIyBDT05GSUdfUlRDX0RSVl9SUzVDMzQ4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfRFMzMjM0IGlzIG5vdCBzZXQKIAogIwogIyBQbGF0Zm9ybSBSVEMgZHJpdmVycwogIworIyBDT05GSUdfUlRDX0RSVl9EUzEyODYgaXMgbm90IHNldAogIyBDT05GSUdfUlRDX0RSVl9EUzE1MTEgaXMgbm90IHNldAogIyBDT05GSUdfUlRDX0RSVl9EUzE1NTMgaXMgbm90IHNldAogIyBDT05GSUdfUlRDX0RSVl9EUzE3NDIgaXMgbm90IHNldAogIyBDT05GSUdfUlRDX0RSVl9TVEsxN1RBOCBpcyBub3Qgc2V0CiAjIENPTkZJR19SVENfRFJWX000OFQ4NiBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX000OFQzNSBpcyBub3Qgc2V0CiAjIENPTkZJR19SVENfRFJWX000OFQ1OSBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX0JRNDgwMiBpcyBub3Qgc2V0CiAjIENPTkZJR19SVENfRFJWX1YzMDIwIGlzIG5vdCBzZXQKIAogIwogIyBvbi1DUFUgUlRDIGRyaXZlcnMKICMKIENPTkZJR19SVENfRFJWX0JGSU49eQorIyBDT05GSUdfRE1BREVWSUNFUyBpcyBub3Qgc2V0CiAjIENPTkZJR19VSU8gaXMgbm90IHNldAorIyBDT05GSUdfU1RBR0lORyBpcyBub3Qgc2V0CiAKICMKICMgRmlsZSBzeXN0ZW1zCiAjCiAjIENPTkZJR19FWFQyX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0VYVDNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfRVhUNERFVl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19FWFQ0X0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1JFSVNFUkZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0pGU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19GU19QT1NJWF9BQ0wgaXMgbm90IHNldAorQ09ORklHX0ZJTEVfTE9DS0lORz15CiAjIENPTkZJR19YRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfT0NGUzJfRlMgaXMgbm90IHNldAogIyBDT05GSUdfRE5PVElGWSBpcyBub3Qgc2V0CkBAIC0xMjI1LDYgKzEyNjgsNyBAQAogIyBDT05GSUdfQ1JBTUZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1ZYRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfTUlOSVhfRlMgaXMgbm90IHNldAorIyBDT05GSUdfT01GU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19IUEZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1FOWDRGU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19ST01GU19GUyBpcyBub3Qgc2V0CkBAIC0xMjQwLDcgKzEyODQsNyBAQAogQ09ORklHX0xPQ0tEX1Y0PXkKIENPTkZJR19ORlNfQ09NTU9OPXkKIENPTkZJR19TVU5SUEM9bQotIyBDT05GSUdfU1VOUlBDX0JJTkQzNCBpcyBub3Qgc2V0CisjIENPTkZJR19TVU5SUENfUkVHSVNURVJfVjQgaXMgbm90IHNldAogIyBDT05GSUdfUlBDU0VDX0dTU19LUkI1IGlzIG5vdCBzZXQKICMgQ09ORklHX1JQQ1NFQ19HU1NfU1BLTTMgaXMgbm90IHNldAogQ09ORklHX1NNQl9GUz1tCkBAIC0xMzA4LDEwICsxMzUyLDQ4IEBACiAjIENPTkZJR19VTlVTRURfU1lNQk9MUyBpcyBub3Qgc2V0CiBDT05GSUdfREVCVUdfRlM9eQogIyBDT05GSUdfSEVBREVSU19DSEVDSyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUJVR19LRVJORUwgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX0tFUk5FTD15CisjIENPTkZJR19ERUJVR19TSElSUSBpcyBub3Qgc2V0CitDT05GSUdfREVURUNUX1NPRlRMT0NLVVA9eQorIyBDT05GSUdfQk9PVFBBUkFNX1NPRlRMT0NLVVBfUEFOSUMgaXMgbm90IHNldAorQ09ORklHX0JPT1RQQVJBTV9TT0ZUTE9DS1VQX1BBTklDX1ZBTFVFPTAKK0NPTkZJR19TQ0hFRF9ERUJVRz15CisjIENPTkZJR19TQ0hFRFNUQVRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RJTUVSX1NUQVRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX09CSkVDVFMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU0xBQiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19SVF9NVVRFWEVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUX01VVEVYX1RFU1RFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TUElOTE9DSyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19NVVRFWEVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NQSU5MT0NLX1NMRUVQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0xPQ0tJTkdfQVBJX1NFTEZURVNUUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19LT0JKRUNUIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX0JVR1ZFUkJPU0UgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX0lORk89eQorIyBDT05GSUdfREVCVUdfVk0gaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfV1JJVEVDT1VOVCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19NRU1PUllfSU5JVCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19MSVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZSQU1FX1BPSU5URVIgaXMgbm90IHNldAorIyBDT05GSUdfQk9PVF9QUklOVEtfREVMQVkgaXMgbm90IHNldAorIyBDT05GSUdfUkNVX1RPUlRVUkVfVEVTVCBpcyBub3Qgc2V0CisjIENPTkZJR19SQ1VfQ1BVX1NUQUxMX0RFVEVDVE9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JBQ0tUUkFDRV9TRUxGX1RFU1QgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfQkxPQ0tfRVhUX0RFVlQgaXMgbm90IHNldAorIyBDT05GSUdfRkFVTFRfSU5KRUNUSU9OIGlzIG5vdCBzZXQKK0NPTkZJR19TWVNDVExfU1lTQ0FMTF9DSEVDSz15CisjIENPTkZJR19EWU5BTUlDX1BSSU5US19ERUJVRyBpcyBub3Qgc2V0CiAjIENPTkZJR19TQU1QTEVTIGlzIG5vdCBzZXQKK0NPTkZJR19IQVZFX0FSQ0hfS0dEQj15CisjIENPTkZJR19LR0RCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NUQUNLT1ZFUkZMT1cgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU1RBQ0tfVVNBR0UgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX1ZFUkJPU0U9eQogQ09ORklHX0RFQlVHX01NUlM9eQorIyBDT05GSUdfREVCVUdfSFdFUlIgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfRE9VQkxFRkFVTFQgaXMgbm90IHNldAogQ09ORklHX0RFQlVHX0hVTlRfRk9SX1pFUk89eQogQ09ORklHX0RFQlVHX0JGSU5fSFdUUkFDRV9PTj15CiBDT05GSUdfREVCVUdfQkZJTl9IV1RSQUNFX0NPTVBSRVNTSU9OX09GRj15CkBAIC0xMzI5LDggKzE0MTEsOSBAQAogIwogIyBDT05GSUdfS0VZUyBpcyBub3Qgc2V0CiBDT05GSUdfU0VDVVJJVFk9eQorIyBDT05GSUdfU0VDVVJJVFlGUyBpcyBub3Qgc2V0CiAjIENPTkZJR19TRUNVUklUWV9ORVRXT1JLIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFQ1VSSVRZX0NBUEFCSUxJVElFUyBpcyBub3Qgc2V0CisjIENPTkZJR19TRUNVUklUWV9GSUxFX0NBUEFCSUxJVElFUyBpcyBub3Qgc2V0CiAjIENPTkZJR19TRUNVUklUWV9ST09UUExVRyBpcyBub3Qgc2V0CiBDT05GSUdfU0VDVVJJVFlfREVGQVVMVF9NTUFQX01JTl9BRERSPTAKIENPTkZJR19DUllQVE89eQpAQCAtMTMzOCw2ICsxNDIxLDcgQEAKICMKICMgQ3J5cHRvIGNvcmUgb3IgaGVscGVyCiAjCisjIENPTkZJR19DUllQVE9fRklQUyBpcyBub3Qgc2V0CiAjIENPTkZJR19DUllQVE9fTUFOQUdFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19DUllQVE9fR0YxMjhNVUwgaXMgbm90IHNldAogIyBDT05GSUdfQ1JZUFRPX05VTEwgaXMgbm90IHNldApAQCAtMTM3Niw2ICsxNDYwLDEwIEBACiAjIENPTkZJR19DUllQVE9fTUQ0IGlzIG5vdCBzZXQKICMgQ09ORklHX0NSWVBUT19NRDUgaXMgbm90IHNldAogIyBDT05GSUdfQ1JZUFRPX01JQ0hBRUxfTUlDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19STUQxMjggaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1JNRDE2MCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fUk1EMjU2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19STUQzMjAgaXMgbm90IHNldAogIyBDT05GSUdfQ1JZUFRPX1NIQTEgaXMgbm90IHNldAogIyBDT05GSUdfQ1JZUFRPX1NIQTI1NiBpcyBub3Qgc2V0CiAjIENPTkZJR19DUllQVE9fU0hBNTEyIGlzIG5vdCBzZXQKQEAgLTE0MDYsMTUgKzE0OTQsMjAgQEAKICMKICMgQ09ORklHX0NSWVBUT19ERUZMQVRFIGlzIG5vdCBzZXQKICMgQ09ORklHX0NSWVBUT19MWk8gaXMgbm90IHNldAorCisjCisjIFJhbmRvbSBOdW1iZXIgR2VuZXJhdGlvbgorIworIyBDT05GSUdfQ1JZUFRPX0FOU0lfQ1BSTkcgaXMgbm90IHNldAogQ09ORklHX0NSWVBUT19IVz15CiAKICMKICMgTGlicmFyeSByb3V0aW5lcwogIwogQ09ORklHX0JJVFJFVkVSU0U9eQotIyBDT05GSUdfR0VORVJJQ19GSU5EX0ZJUlNUX0JJVCBpcyBub3Qgc2V0CiBDT05GSUdfQ1JDX0NDSVRUPW0KICMgQ09ORklHX0NSQzE2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQ19UMTBESUYgaXMgbm90IHNldAogIyBDT05GSUdfQ1JDX0lUVV9UIGlzIG5vdCBzZXQKIENPTkZJR19DUkMzMj15CiAjIENPTkZJR19DUkM3IGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vY29uZmlncy9CRjUyNy1FWktJVF9kZWZjb25maWcgYi9hcmNoL2JsYWNrZmluL2NvbmZpZ3MvQkY1MjctRVpLSVRfZGVmY29uZmlnCmluZGV4IDRhMmE2NjAuLmY5MjY2OGEgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vY29uZmlncy9CRjUyNy1FWktJVF9kZWZjb25maWcKKysrIGIvYXJjaC9ibGFja2Zpbi9jb25maWdzL0JGNTI3LUVaS0lUX2RlZmNvbmZpZwpAQCAtMSw2ICsxLDYgQEAKICMKICMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKLSMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4yNC43CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMjgtcmMyCiAjCiAjIENPTkZJR19NTVUgaXMgbm90IHNldAogIyBDT05GSUdfRlBVIGlzIG5vdCBzZXQKQEAgLTgsNyArOCw2IEBACiAjIENPTkZJR19SV1NFTV9YQ0hHQUREX0FMR09SSVRITSBpcyBub3Qgc2V0CiBDT05GSUdfQkxBQ0tGSU49eQogQ09ORklHX1pPTkVfRE1BPXkKLUNPTkZJR19TRU1BUEhPUkVfU0xFRVBFUlM9eQogQ09ORklHX0dFTkVSSUNfRklORF9ORVhUX0JJVD15CiBDT05GSUdfR0VORVJJQ19IV0VJR0hUPXkKIENPTkZJR19HRU5FUklDX0hBUkRJUlFTPXkKQEAgLTMxLDE4ICszMCwxNiBAQAogIyBDT05GSUdfUE9TSVhfTVFVRVVFIGlzIG5vdCBzZXQKICMgQ09ORklHX0JTRF9QUk9DRVNTX0FDQ1QgaXMgbm90IHNldAogIyBDT05GSUdfVEFTS1NUQVRTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTRVJfTlMgaXMgbm90IHNldAotIyBDT05GSUdfUElEX05TIGlzIG5vdCBzZXQKICMgQ09ORklHX0FVRElUIGlzIG5vdCBzZXQKIENPTkZJR19JS0NPTkZJRz15CiBDT05GSUdfSUtDT05GSUdfUFJPQz15CiBDT05GSUdfTE9HX0JVRl9TSElGVD0xNAogIyBDT05GSUdfQ0dST1VQUyBpcyBub3Qgc2V0Ci1DT05GSUdfRkFJUl9HUk9VUF9TQ0hFRD15Ci1DT05GSUdfRkFJUl9VU0VSX1NDSEVEPXkKLSMgQ09ORklHX0ZBSVJfQ0dST1VQX1NDSEVEIGlzIG5vdCBzZXQKLUNPTkZJR19TWVNGU19ERVBSRUNBVEVEPXkKKyMgQ09ORklHX0dST1VQX1NDSEVEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZU0ZTX0RFUFJFQ0FURUQgaXMgbm90IHNldAorIyBDT05GSUdfU1lTRlNfREVQUkVDQVRFRF9WMiBpcyBub3Qgc2V0CiAjIENPTkZJR19SRUxBWSBpcyBub3Qgc2V0CisjIENPTkZJR19OQU1FU1BBQ0VTIGlzIG5vdCBzZXQKIENPTkZJR19CTEtfREVWX0lOSVRSRD15CiBDT05GSUdfSU5JVFJBTUZTX1NPVVJDRT0iIgogIyBDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkUgaXMgbm90IHNldApAQCAtNTEsMjYgKzQ4LDM1IEBACiBDT05GSUdfVUlEMTY9eQogQ09ORklHX1NZU0NUTF9TWVNDQUxMPXkKIENPTkZJR19LQUxMU1lNUz15CisjIENPTkZJR19LQUxMU1lNU19BTEwgaXMgbm90IHNldAogIyBDT05GSUdfS0FMTFNZTVNfRVhUUkFfUEFTUyBpcyBub3Qgc2V0CiBDT05GSUdfSE9UUExVRz15CiBDT05GSUdfUFJJTlRLPXkKIENPTkZJR19CVUc9eQotQ09ORklHX0VMRl9DT1JFPXkKKyMgQ09ORklHX0VMRl9DT1JFIGlzIG5vdCBzZXQKK0NPTkZJR19DT01QQVRfQlJLPXkKIENPTkZJR19CQVNFX0ZVTEw9eQogQ09ORklHX0ZVVEVYPXkKIENPTkZJR19BTk9OX0lOT0RFUz15CiBDT05GSUdfRVBPTEw9eQogQ09ORklHX1NJR05BTEZEPXkKK0NPTkZJR19USU1FUkZEPXkKIENPTkZJR19FVkVOVEZEPXkKK0NPTkZJR19BSU89eQogQ09ORklHX1ZNX0VWRU5UX0NPVU5URVJTPXkKIENPTkZJR19TTEFCPXkKICMgQ09ORklHX1NMVUIgaXMgbm90IHNldAogIyBDT05GSUdfU0xPQiBpcyBub3Qgc2V0CisjIENPTkZJR19QUk9GSUxJTkcgaXMgbm90IHNldAorIyBDT05GSUdfTUFSS0VSUyBpcyBub3Qgc2V0CitDT05GSUdfSEFWRV9PUFJPRklMRT15CisjIENPTkZJR19IQVZFX0dFTkVSSUNfRE1BX0NPSEVSRU5UIGlzIG5vdCBzZXQKIENPTkZJR19TTEFCSU5GTz15CiBDT05GSUdfUlRfTVVURVhFUz15CiBDT05GSUdfVElOWV9TSE1FTT15CiBDT05GSUdfQkFTRV9TTUFMTD0wCiBDT05GSUdfTU9EVUxFUz15CisjIENPTkZJR19NT0RVTEVfRk9SQ0VfTE9BRCBpcyBub3Qgc2V0CiBDT05GSUdfTU9EVUxFX1VOTE9BRD15CiAjIENPTkZJR19NT0RVTEVfRk9SQ0VfVU5MT0FEIGlzIG5vdCBzZXQKICMgQ09ORklHX01PRFZFUlNJT05TIGlzIG5vdCBzZXQKQEAgLTgxLDYgKzg3LDcgQEAKICMgQ09ORklHX0JMS19ERVZfSU9fVFJBQ0UgaXMgbm90IHNldAogIyBDT05GSUdfTFNGIGlzIG5vdCBzZXQKICMgQ09ORklHX0JMS19ERVZfQlNHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSU5URUdSSVRZIGlzIG5vdCBzZXQKIAogIwogIyBJTyBTY2hlZHVsZXJzCkBAIC05NCw5ICsxMDEsMTEgQEAKICMgQ09ORklHX0RFRkFVTFRfQ0ZRIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFRkFVTFRfTk9PUCBpcyBub3Qgc2V0CiBDT05GSUdfREVGQVVMVF9JT1NDSEVEPSJhbnRpY2lwYXRvcnkiCitDT05GSUdfQ0xBU1NJQ19SQ1U9eQogIyBDT05GSUdfUFJFRU1QVF9OT05FIGlzIG5vdCBzZXQKIENPTkZJR19QUkVFTVBUX1ZPTFVOVEFSWT15CiAjIENPTkZJR19QUkVFTVBUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZSRUVaRVIgaXMgbm90IHNldAogCiAjCiAjIEJsYWNrZmluIFByb2Nlc3NvciBPcHRpb25zCkBAIC0xMDUsNiArMTE0LDEwIEBACiAjCiAjIFByb2Nlc3NvciBhbmQgQm9hcmQgU2V0dGluZ3MKICMKKyMgQ09ORklHX0JGNTEyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGNTE0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGNTE2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGNTE4IGlzIG5vdCBzZXQKICMgQ09ORklHX0JGNTIyIGlzIG5vdCBzZXQKICMgQ09ORklHX0JGNTIzIGlzIG5vdCBzZXQKICMgQ09ORklHX0JGNTI0IGlzIG5vdCBzZXQKQEAgLTExNywyMyArMTMwLDc0IEBACiAjIENPTkZJR19CRjUzNCBpcyBub3Qgc2V0CiAjIENPTkZJR19CRjUzNiBpcyBub3Qgc2V0CiAjIENPTkZJR19CRjUzNyBpcyBub3Qgc2V0CisjIENPTkZJR19CRjUzOCBpcyBub3Qgc2V0CisjIENPTkZJR19CRjUzOSBpcyBub3Qgc2V0CiAjIENPTkZJR19CRjU0MiBpcyBub3Qgc2V0CiAjIENPTkZJR19CRjU0NCBpcyBub3Qgc2V0CiAjIENPTkZJR19CRjU0NyBpcyBub3Qgc2V0CiAjIENPTkZJR19CRjU0OCBpcyBub3Qgc2V0CiAjIENPTkZJR19CRjU0OSBpcyBub3Qgc2V0CiAjIENPTkZJR19CRjU2MSBpcyBub3Qgc2V0CitDT05GSUdfQkZfUkVWX01JTj0wCitDT05GSUdfQkZfUkVWX01BWD0yCiBDT05GSUdfQkZfUkVWXzBfMD15CiAjIENPTkZJR19CRl9SRVZfMF8xIGlzIG5vdCBzZXQKICMgQ09ORklHX0JGX1JFVl8wXzIgaXMgbm90IHNldAogIyBDT05GSUdfQkZfUkVWXzBfMyBpcyBub3Qgc2V0CiAjIENPTkZJR19CRl9SRVZfMF80IGlzIG5vdCBzZXQKICMgQ09ORklHX0JGX1JFVl8wXzUgaXMgbm90IHNldAorIyBDT05GSUdfQkZfUkVWXzBfNiBpcyBub3Qgc2V0CiAjIENPTkZJR19CRl9SRVZfQU5ZIGlzIG5vdCBzZXQKICMgQ09ORklHX0JGX1JFVl9OT05FIGlzIG5vdCBzZXQKIENPTkZJR19CRjUyeD15CiBDT05GSUdfTUVNX01UNDhMQzMyTTE2QTJUR183NT15CitDT05GSUdfSVJRX1BMTF9XQUtFVVA9NworQ09ORklHX0lSUV9ETUEwX0VSUk9SPTcKK0NPTkZJR19JUlFfRE1BUjBfQkxLPTcKK0NPTkZJR19JUlFfRE1BUjFfQkxLPTcKK0NPTkZJR19JUlFfRE1BUjBfT1ZSPTcKK0NPTkZJR19JUlFfRE1BUjFfT1ZSPTcKK0NPTkZJR19JUlFfUFBJX0VSUk9SPTcKK0NPTkZJR19JUlFfTUFDX0VSUk9SPTcKK0NPTkZJR19JUlFfU1BPUlQwX0VSUk9SPTcKK0NPTkZJR19JUlFfU1BPUlQxX0VSUk9SPTcKK0NPTkZJR19JUlFfVUFSVDBfRVJST1I9NworQ09ORklHX0lSUV9VQVJUMV9FUlJPUj03CitDT05GSUdfSVJRX1JUQz04CitDT05GSUdfSVJRX1BQST04CitDT05GSUdfSVJRX1NQT1JUMF9SWD05CitDT05GSUdfSVJRX1NQT1JUMF9UWD05CitDT05GSUdfSVJRX1NQT1JUMV9SWD05CitDT05GSUdfSVJRX1NQT1JUMV9UWD05CitDT05GSUdfSVJRX1RXST0xMAorQ09ORklHX0lSUV9VQVJUMF9SWD0xMAorQ09ORklHX0lSUV9VQVJUMF9UWD0xMAorQ09ORklHX0lSUV9VQVJUMV9SWD0xMAorQ09ORklHX0lSUV9VQVJUMV9UWD0xMAorQ09ORklHX0lSUV9PUFRTRUM9MTEKK0NPTkZJR19JUlFfQ05UPTExCitDT05GSUdfSVJRX01BQ19SWD0xMQorQ09ORklHX0lSUV9QT1JUSF9JTlRBPTExCitDT05GSUdfSVJRX01BQ19UWD0xMQorQ09ORklHX0lSUV9QT1JUSF9JTlRCPTExCitDT05GSUdfSVJRX1RJTUVSMD04CitDT05GSUdfSVJRX1RJTUVSMT0xMgorQ09ORklHX0lSUV9USU1FUjI9MTIKK0NPTkZJR19JUlFfVElNRVIzPTEyCitDT05GSUdfSVJRX1RJTUVSND0xMgorQ09ORklHX0lSUV9USU1FUjU9MTIKK0NPTkZJR19JUlFfVElNRVI2PTEyCitDT05GSUdfSVJRX1RJTUVSNz0xMgorQ09ORklHX0lSUV9QT1JUR19JTlRBPTEyCitDT05GSUdfSVJRX1BPUlRHX0lOVEI9MTIKK0NPTkZJR19JUlFfTUVNX0RNQTA9MTMKK0NPTkZJR19JUlFfTUVNX0RNQTE9MTMKK0NPTkZJR19JUlFfV0FUQ0g9MTMKK0NPTkZJR19JUlFfUE9SVEZfSU5UQT0xMworQ09ORklHX0lSUV9QT1JURl9JTlRCPTEzCiBDT05GSUdfQkZJTjUyN19FWktJVD15CisjIENPTkZJR19CRklONTI3X0JMVUVURUNITklYX0NNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGSU41MjZfRVpCUkQgaXMgbm90IHNldAogCiAjCiAjIEJGNTI3IFNwZWNpZmljIENvbmZpZ3VyYXRpb24KQEAgLTE1OCw1MSArMjIyLDcgQEAKICMKICMgUHJpb3JpdHkKICMKLUNPTkZJR19JUlFfUExMX1dBS0VVUD03Ci1DT05GSUdfSVJRX0RNQTBfRVJST1I9NwotQ09ORklHX0lSUV9ETUFSMF9CTEs9NwotQ09ORklHX0lSUV9ETUFSMV9CTEs9NwotQ09ORklHX0lSUV9ETUFSMF9PVlI9NwotQ09ORklHX0lSUV9ETUFSMV9PVlI9NwotQ09ORklHX0lSUV9QUElfRVJST1I9NwotQ09ORklHX0lSUV9NQUNfRVJST1I9NwotQ09ORklHX0lSUV9TUE9SVDBfRVJST1I9NwotQ09ORklHX0lSUV9TUE9SVDFfRVJST1I9NwotQ09ORklHX0lSUV9VQVJUMF9FUlJPUj03Ci1DT05GSUdfSVJRX1VBUlQxX0VSUk9SPTcKLUNPTkZJR19JUlFfUlRDPTgKLUNPTkZJR19JUlFfUFBJPTgKLUNPTkZJR19JUlFfU1BPUlQwX1JYPTkKLUNPTkZJR19JUlFfU1BPUlQwX1RYPTkKLUNPTkZJR19JUlFfU1BPUlQxX1JYPTkKLUNPTkZJR19JUlFfU1BPUlQxX1RYPTkKLUNPTkZJR19JUlFfVFdJPTEwCiBDT05GSUdfSVJRX1NQST0xMAotQ09ORklHX0lSUV9VQVJUMF9SWD0xMAotQ09ORklHX0lSUV9VQVJUMF9UWD0xMAotQ09ORklHX0lSUV9VQVJUMV9SWD0xMAotQ09ORklHX0lSUV9VQVJUMV9UWD0xMAotQ09ORklHX0lSUV9PUFRTRUM9MTEKLUNPTkZJR19JUlFfQ05UPTExCi1DT05GSUdfSVJRX01BQ19SWD0xMQotQ09ORklHX0lSUV9QT1JUSF9JTlRBPTExCi1DT05GSUdfSVJRX01BQ19UWD0xMQotQ09ORklHX0lSUV9QT1JUSF9JTlRCPTExCi1DT05GSUdfSVJRX1RNUjA9MTIKLUNPTkZJR19JUlFfVE1SMT0xMgotQ09ORklHX0lSUV9UTVIyPTEyCi1DT05GSUdfSVJRX1RNUjM9MTIKLUNPTkZJR19JUlFfVE1SND0xMgotQ09ORklHX0lSUV9UTVI1PTEyCi1DT05GSUdfSVJRX1RNUjY9MTIKLUNPTkZJR19JUlFfVE1SNz0xMgotQ09ORklHX0lSUV9QT1JUR19JTlRBPTEyCi1DT05GSUdfSVJRX1BPUlRHX0lOVEI9MTIKLUNPTkZJR19JUlFfTUVNX0RNQTA9MTMKLUNPTkZJR19JUlFfTUVNX0RNQTE9MTMKLUNPTkZJR19JUlFfV0FUQ0g9MTMKLUNPTkZJR19JUlFfUE9SVEZfSU5UQT0xMwotQ09ORklHX0lSUV9QT1JURl9JTlRCPTEzCiBDT05GSUdfSVJRX1NQSV9FUlJPUj03CiBDT05GSUdfSVJRX05GQ19FUlJPUj03CiBDT05GSUdfSVJRX0hETUFfRVJST1I9NwpAQCAtMjI0LDcgKzI0NCw2IEBACiAjCiBDT05GSUdfQ0xLSU5fSFo9MjUwMDAwMDAKICMgQ09ORklHX0JGSU5fS0VSTkVMX0NMT0NLIGlzIG5vdCBzZXQKLUNPTkZJR19NQVhfTUVNX1NJWkU9NTEyCiBDT05GSUdfTUFYX1ZDT19IWj02MDAwMDAwMDAKIENPTkZJR19NSU5fVkNPX0haPTUwMDAwMDAwCiBDT05GSUdfTUFYX1NDTEtfSFo9MTMzMzMzMzMzCkBAIC0yMzgsMTAgKzI1NywxMCBAQAogIyBDT05GSUdfSFpfMzAwIGlzIG5vdCBzZXQKICMgQ09ORklHX0haXzEwMDAgaXMgbm90IHNldAogQ09ORklHX0haPTI1MAorIyBDT05GSUdfU0NIRURfSFJUSUNLIGlzIG5vdCBzZXQKIENPTkZJR19HRU5FUklDX1RJTUU9eQogQ09ORklHX0dFTkVSSUNfQ0xPQ0tFVkVOVFM9eQogIyBDT05GSUdfQ1lDTEVTX0NMT0NLU09VUkNFIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RJQ0tfT05FU0hPVCBpcyBub3Qgc2V0CiAjIENPTkZJR19OT19IWiBpcyBub3Qgc2V0CiAjIENPTkZJR19ISUdIX1JFU19USU1FUlMgaXMgbm90IHNldAogQ09ORklHX0dFTkVSSUNfQ0xPQ0tFVkVOVFNfQlVJTEQ9eQpAQCAtMjc1LDYgKzI5NCwxMiBAQAogQ09ORklHX0NBQ0hFTElORV9BTElHTkVEX0wxPXkKICMgQ09ORklHX1NZU0NBTExfVEFCX0wxIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQTEJfU1dJVENIX1RBQl9MMSBpcyBub3Qgc2V0CitDT05GSUdfQVBQX1NUQUNLX0wxPXkKKworIworIyBTcGVlZCBPcHRpbWl6YXRpb25zCisjCitDT05GSUdfQkZJTl9JTlNfTE9XT1ZFUkhFQUQ9eQogQ09ORklHX1JBTUtFUk5FTD15CiAjIENPTkZJR19ST01LRVJORUwgaXMgbm90IHNldAogQ09ORklHX1NFTEVDVF9NRU1PUllfTU9ERUw9eQpAQCAtMjgzLDE0ICszMDgsMTMgQEAKICMgQ09ORklHX1NQQVJTRU1FTV9NQU5VQUwgaXMgbm90IHNldAogQ09ORklHX0ZMQVRNRU09eQogQ09ORklHX0ZMQVRfTk9ERV9NRU1fTUFQPXkKLSMgQ09ORklHX1NQQVJTRU1FTV9TVEFUSUMgaXMgbm90IHNldAotIyBDT05GSUdfU1BBUlNFTUVNX1ZNRU1NQVBfRU5BQkxFIGlzIG5vdCBzZXQKK0NPTkZJR19QQUdFRkxBR1NfRVhURU5ERUQ9eQogQ09ORklHX1NQTElUX1BUTE9DS19DUFVTPTQKICMgQ09ORklHX1JFU09VUkNFU182NEJJVCBpcyBub3Qgc2V0CisjIENPTkZJR19QSFlTX0FERFJfVF82NEJJVCBpcyBub3Qgc2V0CiBDT05GSUdfWk9ORV9ETUFfRkxBRz0xCiBDT05GSUdfVklSVF9UT19CVVM9eQogQ09ORklHX0JGSU5fR1BUSU1FUlM9eQotQ09ORklHX0JGSU5fRE1BXzVYWD15CiAjIENPTkZJR19ETUFfVU5DQUNIRURfNE0gaXMgbm90IHNldAogIyBDT05GSUdfRE1BX1VOQ0FDSEVEXzJNIGlzIG5vdCBzZXQKIENPTkZJR19ETUFfVU5DQUNIRURfMU09eQpAQCAtMzA1LDcgKzMyOSw2IEBACiAjIENPTkZJR19CRklOX0lDQUNIRV9MT0NLIGlzIG5vdCBzZXQKICMgQ09ORklHX0JGSU5fV0IgaXMgbm90IHNldAogQ09ORklHX0JGSU5fV1Q9eQotQ09ORklHX0wxX01BWF9QSUVDRT0xNgogIyBDT05GSUdfTVBVIGlzIG5vdCBzZXQKIAogIwpAQCAtMzM0LDcgKzM1Nyw2IEBACiAjCiAjIEJ1cyBvcHRpb25zIChQQ0ksIFBDTUNJQSwgRUlTQSwgTUNBLCBJU0EpCiAjCi0jIENPTkZJR19QQ0kgaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9TVVBQT1JUU19NU0kgaXMgbm90IHNldAogIyBDT05GSUdfUENDQVJEIGlzIG5vdCBzZXQKIApAQCAtMzQ1LDIzICszNjcsMjAgQEAKIENPTkZJR19CSU5GTVRfRkxBVD15CiBDT05GSUdfQklORk1UX1pGTEFUPXkKICMgQ09ORklHX0JJTkZNVF9TSEFSRURfRkxBVCBpcyBub3Qgc2V0CisjIENPTkZJR19IQVZFX0FPVVQgaXMgbm90IHNldAogIyBDT05GSUdfQklORk1UX01JU0MgaXMgbm90IHNldAogCiAjCiAjIFBvd2VyIG1hbmFnZW1lbnQgb3B0aW9ucwogIwogIyBDT05GSUdfUE0gaXMgbm90IHNldAotQ09ORklHX1NVU1BFTkRfVVBfUE9TU0lCTEU9eQorQ09ORklHX0FSQ0hfU1VTUEVORF9QT1NTSUJMRT15CiAjIENPTkZJR19QTV9XQUtFVVBfQllfR1BJTyBpcyBub3Qgc2V0CiAKICMKICMgQ1BVIEZyZXF1ZW5jeSBzY2FsaW5nCiAjCiAjIENPTkZJR19DUFVfRlJFUSBpcyBub3Qgc2V0Ci0KLSMKLSMgTmV0d29ya2luZwotIwogQ09ORklHX05FVD15CiAKICMKQEAgLTM3NCw2ICszOTMsNyBAQAogIyBDT05GSUdfWEZSTV9VU0VSIGlzIG5vdCBzZXQKICMgQ09ORklHX1hGUk1fU1VCX1BPTElDWSBpcyBub3Qgc2V0CiAjIENPTkZJR19YRlJNX01JR1JBVEUgaXMgbm90IHNldAorIyBDT05GSUdfWEZSTV9TVEFUSVNUSUNTIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVF9LRVkgaXMgbm90IHNldAogQ09ORklHX0lORVQ9eQogIyBDT05GSUdfSVBfTVVMVElDQVNUIGlzIG5vdCBzZXQKQEAgLTQwMyw4ICs0MjMsNiBAQAogQ09ORklHX0RFRkFVTFRfVENQX0NPTkc9ImN1YmljIgogIyBDT05GSUdfVENQX01ENVNJRyBpcyBub3Qgc2V0CiAjIENPTkZJR19JUFY2IGlzIG5vdCBzZXQKLSMgQ09ORklHX0lORVQ2X1hGUk1fVFVOTkVMIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lORVQ2X1RVTk5FTCBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRMQUJFTCBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRXT1JLX1NFQ01BUksgaXMgbm90IHNldAogIyBDT05GSUdfTkVURklMVEVSIGlzIG5vdCBzZXQKQEAgLTQxMyw2ICs0MzEsNyBAQAogIyBDT05GSUdfVElQQyBpcyBub3Qgc2V0CiAjIENPTkZJR19BVE0gaXMgbm90IHNldAogIyBDT05GSUdfQlJJREdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9EU0EgaXMgbm90IHNldAogIyBDT05GSUdfVkxBTl84MDIxUSBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUNORVQgaXMgbm90IHNldAogIyBDT05GSUdfTExDMiBpcyBub3Qgc2V0CkBAIC00MjksNiArNDQ4LDcgQEAKICMKICMgQ09ORklHX05FVF9QS1RHRU4gaXMgbm90IHNldAogIyBDT05GSUdfSEFNUkFESU8gaXMgbm90IHNldAorIyBDT05GSUdfQ0FOIGlzIG5vdCBzZXQKIENPTkZJR19JUkRBPW0KIAogIwpAQCAtNDY3LDE1ICs0ODcsNiBAQAogIyBDT05GSUdfS1M5NTlfRE9OR0xFIGlzIG5vdCBzZXQKIAogIwotIyBPbGQgU0lSIGRldmljZSBkcml2ZXJzCi0jCi0jIENPTkZJR19JUlBPUlRfU0lSIGlzIG5vdCBzZXQKLQotIwotIyBPbGQgU2VyaWFsIGRvbmdsZSBzdXBwb3J0Ci0jCi0KLSMKICMgRklSIGRldmljZSBkcml2ZXJzCiAjCiAjIENPTkZJR19VU0JfSVJEQSBpcyBub3Qgc2V0CkBAIC00ODMsMTEgKzQ5NCwxMCBAQAogIyBDT05GSUdfTUNTX0ZJUiBpcyBub3Qgc2V0CiAjIENPTkZJR19CVCBpcyBub3Qgc2V0CiAjIENPTkZJR19BRl9SWFJQQyBpcyBub3Qgc2V0Ci0KLSMKLSMgV2lyZWxlc3MKLSMKKyMgQ09ORklHX1BIT05FVCBpcyBub3Qgc2V0CitDT05GSUdfV0lSRUxFU1M9eQogIyBDT05GSUdfQ0ZHODAyMTEgaXMgbm90IHNldAorQ09ORklHX1dJUkVMRVNTX09MRF9SRUdVTEFUT1JZPXkKICMgQ09ORklHX1dJUkVMRVNTX0VYVCBpcyBub3Qgc2V0CiAjIENPTkZJR19NQUM4MDIxMSBpcyBub3Qgc2V0CiAjIENPTkZJR19JRUVFODAyMTEgaXMgbm90IHNldApAQCAtNTA1LDYgKzUxNSw4IEBACiBDT05GSUdfU1RBTkRBTE9ORT15CiBDT05GSUdfUFJFVkVOVF9GSVJNV0FSRV9CVUlMRD15CiAjIENPTkZJR19GV19MT0FERVIgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfRFJJVkVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0RFVlJFUyBpcyBub3Qgc2V0CiAjIENPTkZJR19TWVNfSFlQRVJWSVNPUiBpcyBub3Qgc2V0CiAjIENPTkZJR19DT05ORUNUT1IgaXMgbm90IHNldAogQ09ORklHX01URD15CkBAIC01MTMsNiArNTI1LDcgQEAKIENPTkZJR19NVERfUEFSVElUSU9OUz15CiAjIENPTkZJR19NVERfUkVEQk9PVF9QQVJUUyBpcyBub3Qgc2V0CiAjIENPTkZJR19NVERfQ01ETElORV9QQVJUUyBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQVI3X1BBUlRTIGlzIG5vdCBzZXQKIAogIwogIyBVc2VyIE1vZHVsZXMgQW5kIFRyYW5zbGF0aW9uIExheWVycwpAQCAtNTU2LDYgKzU2OSw3IEBACiAjCiBDT05GSUdfTVREX0NPTVBMRVhfTUFQUElOR1M9eQogIyBDT05GSUdfTVREX1BIWVNNQVAgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0dQSU9fQUREUiBpcyBub3Qgc2V0CiAjIENPTkZJR19NVERfVUNMSU5VWCBpcyBub3Qgc2V0CiAjIENPTkZJR19NVERfUExBVFJBTSBpcyBub3Qgc2V0CiAKQEAgLTU2Myw3ICs1NzcsOCBAQAogIyBTZWxmLWNvbnRhaW5lZCBNVEQgZGV2aWNlIGRyaXZlcnMKICMKICMgQ09ORklHX01URF9EQVRBRkxBU0ggaXMgbm90IHNldAotIyBDT05GSUdfTVREX00yNVA4MCBpcyBub3Qgc2V0CitDT05GSUdfTVREX00yNVA4MD15CitDT05GSUdfTTI1UFhYX1VTRV9GQVNUX1JFQUQ9eQogIyBDT05GSUdfTVREX1NMUkFNIGlzIG5vdCBzZXQKICMgQ09ORklHX01URF9QSFJBTSBpcyBub3Qgc2V0CiAjIENPTkZJR19NVERfTVREUkFNIGlzIG5vdCBzZXQKQEAgLTYwNSwxMSArNjIwLDE0IEBACiBDT05GSUdfQkxLX0RFVl9SQU09eQogQ09ORklHX0JMS19ERVZfUkFNX0NPVU5UPTE2CiBDT05GSUdfQkxLX0RFVl9SQU1fU0laRT00MDk2Ci1DT05GSUdfQkxLX0RFVl9SQU1fQkxPQ0tTSVpFPTEwMjQKKyMgQ09ORklHX0JMS19ERVZfWElQIGlzIG5vdCBzZXQKICMgQ09ORklHX0NEUk9NX1BLVENEVkQgaXMgbm90IHNldAogIyBDT05GSUdfQVRBX09WRVJfRVRIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSEQgaXMgbm90IHNldAogQ09ORklHX01JU0NfREVWSUNFUz15CiAjIENPTkZJR19FRVBST01fOTNDWDYgaXMgbm90IHNldAorIyBDT05GSUdfRU5DTE9TVVJFX1NFUlZJQ0VTIGlzIG5vdCBzZXQKK0NPTkZJR19IQVZFX0lERT15CiAjIENPTkZJR19JREUgaXMgbm90IHNldAogCiAjCkBAIC02MjIsNyArNjQwLDYgQEAKICMgQ09ORklHX0FUQSBpcyBub3Qgc2V0CiAjIENPTkZJR19NRCBpcyBub3Qgc2V0CiBDT05GSUdfTkVUREVWSUNFUz15Ci0jIENPTkZJR19ORVRERVZJQ0VTX01VTFRJUVVFVUUgaXMgbm90IHNldAogIyBDT05GSUdfRFVNTVkgaXMgbm90IHNldAogIyBDT05GSUdfQk9ORElORyBpcyBub3Qgc2V0CiAjIENPTkZJR19NQUNWTEFOIGlzIG5vdCBzZXQKQEAgLTY0Myw2ICs2NjAsNyBAQAogIyBDT05GSUdfU01TQ19QSFkgaXMgbm90IHNldAogIyBDT05GSUdfQlJPQURDT01fUEhZIGlzIG5vdCBzZXQKICMgQ09ORklHX0lDUExVU19QSFkgaXMgbm90IHNldAorIyBDT05GSUdfUkVBTFRFS19QSFkgaXMgbm90IHNldAogIyBDT05GSUdfRklYRURfUEhZIGlzIG5vdCBzZXQKICMgQ09ORklHX01ESU9fQklUQkFORyBpcyBub3Qgc2V0CiBDT05GSUdfTkVUX0VUSEVSTkVUPXkKQEAgLTY1NSwxMSArNjczLDE0IEBACiAjIENPTkZJR19TTUM5MVggaXMgbm90IHNldAogIyBDT05GSUdfU01TQzkxMVggaXMgbm90IHNldAogIyBDT05GSUdfRE05MDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VOQzI4SjYwIGlzIG5vdCBzZXQKICMgQ09ORklHX0lCTV9ORVdfRU1BQ19aTUlJIGlzIG5vdCBzZXQKICMgQ09ORklHX0lCTV9ORVdfRU1BQ19SR01JSSBpcyBub3Qgc2V0CiAjIENPTkZJR19JQk1fTkVXX0VNQUNfVEFIIGlzIG5vdCBzZXQKICMgQ09ORklHX0lCTV9ORVdfRU1BQ19FTUFDNCBpcyBub3Qgc2V0Ci0jIENPTkZJR19CNDQgaXMgbm90IHNldAorIyBDT05GSUdfSUJNX05FV19FTUFDX05PX0ZMT1dfQ1RSTCBpcyBub3Qgc2V0CisjIENPTkZJR19JQk1fTkVXX0VNQUNfTUFMX0NMUl9JQ0lOVFNUQVQgaXMgbm90IHNldAorIyBDT05GSUdfSUJNX05FV19FTUFDX01BTF9DT01NT05fRVJSIGlzIG5vdCBzZXQKIENPTkZJR19ORVRERVZfMTAwMD15CiAjIENPTkZJR19BWDg4MTgwIGlzIG5vdCBzZXQKIENPTkZJR19ORVRERVZfMTAwMDA9eQpAQCAtNjY5LDYgKzY5MCw3IEBACiAjCiAjIENPTkZJR19XTEFOX1BSRTgwMjExIGlzIG5vdCBzZXQKICMgQ09ORklHX1dMQU5fODAyMTEgaXMgbm90IHNldAorIyBDT05GSUdfSVdMV0lGSV9MRURTIGlzIG5vdCBzZXQKIAogIwogIyBVU0IgTmV0d29yayBBZGFwdGVycwpAQCAtNjgxLDcgKzcwMyw2IEBACiAjIENPTkZJR19XQU4gaXMgbm90IHNldAogIyBDT05GSUdfUFBQIGlzIG5vdCBzZXQKICMgQ09ORklHX1NMSVAgaXMgbm90IHNldAotIyBDT05GSUdfU0hBUEVSIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVENPTlNPTEUgaXMgbm90IHNldAogIyBDT05GSUdfTkVUUE9MTCBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSIGlzIG5vdCBzZXQKQEAgLTY5Miw3ICs3MTMsNyBAQAogIyBJbnB1dCBkZXZpY2Ugc3VwcG9ydAogIwogQ09ORklHX0lOUFVUPXkKLSMgQ09ORklHX0lOUFVUX0ZGX01FTUxFU1MgaXMgbm90IHNldAorQ09ORklHX0lOUFVUX0ZGX01FTUxFU1M9bQogIyBDT05GSUdfSU5QVVRfUE9MTERFViBpcyBub3Qgc2V0CiAKICMKQEAgLTcxNyw4ICs3MzgsOSBAQAogIyBDT05GSUdfSU5QVVRfS0VZU1BBTl9SRU1PVEUgaXMgbm90IHNldAogIyBDT05GSUdfSU5QVVRfUE9XRVJNQVRFIGlzIG5vdCBzZXQKICMgQ09ORklHX0lOUFVUX1lFQUxJTksgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfQ00xMDkgaXMgbm90IHNldAogIyBDT05GSUdfSU5QVVRfVUlOUFVUIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RXSV9LRVlQQUQgaXMgbm90IHNldAorIyBDT05GSUdfQ09ORklHX0lOUFVUX1BDRjg1NzQgaXMgbm90IHNldAogCiAjCiAjIEhhcmR3YXJlIEkvTyBwb3J0cwpAQCAtNzM0LDE2ICs3NTYsMTggQEAKICMgQ09ORklHX0JGNXh4X1BQSUZDRCBpcyBub3Qgc2V0CiAjIENPTkZJR19CRklOX1NJTVBMRV9USU1FUiBpcyBub3Qgc2V0CiAjIENPTkZJR19CRjV4eF9QUEkgaXMgbm90IHNldAotQ09ORklHX0JGSU5fT1RQPXkKLSMgQ09ORklHX0JGSU5fT1RQX1dSSVRFX0VOQUJMRSBpcyBub3Qgc2V0CiAjIENPTkZJR19CRklOX1NQT1JUIGlzIG5vdCBzZXQKICMgQ09ORklHX0JGSU5fVElNRVJfTEFURU5DWSBpcyBub3Qgc2V0CiAjIENPTkZJR19UV0lfTENEIGlzIG5vdCBzZXQKK0NPTkZJR19CRklOX0RNQV9JTlRFUkZBQ0U9bQogQ09ORklHX1NJTVBMRV9HUElPPW0KIENPTkZJR19WVD15CitDT05GSUdfQ09OU09MRV9UUkFOU0xBVElPTlM9eQogQ09ORklHX1ZUX0NPTlNPTEU9eQogQ09ORklHX0hXX0NPTlNPTEU9eQogIyBDT05GSUdfVlRfSFdfQ09OU09MRV9CSU5ESU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFVktNRU0gaXMgbm90IHNldAorIyBDT05GSUdfQkZJTl9KVEFHX0NPTU0gaXMgbm90IHNldAogIyBDT05GSUdfU0VSSUFMX05PTlNUQU5EQVJEIGlzIG5vdCBzZXQKIAogIwpAQCAtNzY2LDYgKzc5MCw4IEBACiAjIENPTkZJR19TRVJJQUxfQkZJTl9TUE9SVCBpcyBub3Qgc2V0CiBDT05GSUdfVU5JWDk4X1BUWVM9eQogIyBDT05GSUdfTEVHQUNZX1BUWVMgaXMgbm90IHNldAorQ09ORklHX0JGSU5fT1RQPXkKKyMgQ09ORklHX0JGSU5fT1RQX1dSSVRFX0VOQUJMRSBpcyBub3Qgc2V0CiAKICMKICMgQ0FOLCB0aGUgY2FyIGJ1cyBhbmQgaW5kdXN0cmlhbCBmaWVsZGJ1cwpAQCAtNzczLDQ0ICs3OTksNDkgQEAKICMgQ09ORklHX0NBTjRMSU5VWCBpcyBub3Qgc2V0CiAjIENPTkZJR19JUE1JX0hBTkRMRVIgaXMgbm90IHNldAogIyBDT05GSUdfSFdfUkFORE9NIGlzIG5vdCBzZXQKLSMgQ09ORklHX0dFTl9SVEMgaXMgbm90IHNldAogIyBDT05GSUdfUjM5NjQgaXMgbm90IHNldAogIyBDT05GSUdfUkFXX0RSSVZFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19UQ0dfVFBNIGlzIG5vdCBzZXQKIENPTkZJR19JMkM9eQogQ09ORklHX0kyQ19CT0FSRElORk89eQogQ09ORklHX0kyQ19DSEFSREVWPW0KLQotIwotIyBJMkMgQWxnb3JpdGhtcwotIwotIyBDT05GSUdfSTJDX0FMR09CSVQgaXMgbm90IHNldAotIyBDT05GSUdfSTJDX0FMR09QQ0YgaXMgbm90IHNldAotIyBDT05GSUdfSTJDX0FMR09QQ0EgaXMgbm90IHNldAorQ09ORklHX0kyQ19IRUxQRVJfQVVUTz15CiAKICMKICMgSTJDIEhhcmR3YXJlIEJ1cyBzdXBwb3J0CiAjCisKKyMKKyMgSTJDIHN5c3RlbSBidXMgZHJpdmVycyAobW9zdGx5IGVtYmVkZGVkIC8gc3lzdGVtLW9uLWNoaXApCisjCiBDT05GSUdfSTJDX0JMQUNLRklOX1RXST1tCi1DT05GSUdfSTJDX0JMQUNLRklOX1RXSV9DTEtfS0haPTUwCitDT05GSUdfSTJDX0JMQUNLRklOX1RXSV9DTEtfS0haPTEwMAogIyBDT05GSUdfSTJDX0dQSU8gaXMgbm90IHNldAogIyBDT05GSUdfSTJDX09DT1JFUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19JMkNfUEFSUE9SVF9MSUdIVCBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfU0lNVEVDIGlzIG5vdCBzZXQKKworIworIyBFeHRlcm5hbCBJMkMvU01CdXMgYWRhcHRlciBkcml2ZXJzCisjCisjIENPTkZJR19JMkNfUEFSUE9SVF9MSUdIVCBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfVEFPU19FVk0gaXMgbm90IHNldAotIyBDT05GSUdfSTJDX1NUVUIgaXMgbm90IHNldAogIyBDT05GSUdfSTJDX1RJTllfVVNCIGlzIG5vdCBzZXQKIAogIworIyBPdGhlciBJMkMvU01CdXMgYnVzIGRyaXZlcnMKKyMKKyMgQ09ORklHX0kyQ19QQ0FfUExBVEZPUk0gaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1NUVUIgaXMgbm90IHNldAorCisjCiAjIE1pc2NlbGxhbmVvdXMgSTJDIENoaXAgc3VwcG9ydAogIwotIyBDT05GSUdfU0VOU09SU19EUzEzMzcgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19EUzEzNzQgaXMgbm90IHNldAogIyBDT05GSUdfRFMxNjgyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUMjQgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19BRDUyNTIgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19FRVBST00gaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19QQ0Y4NTc0IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfUENGODU3NSBpcyBub3Qgc2V0CisjIENPTkZJR19QQ0Y4NTc1IGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfUENBOTUzOSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1BDRjg1OTEgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19NQVg2ODc1IGlzIG5vdCBzZXQKQEAgLTgxOSwxNyArODUwLDE1IEBACiAjIENPTkZJR19JMkNfREVCVUdfQUxHTyBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfREVCVUdfQlVTIGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19ERUJVR19DSElQIGlzIG5vdCBzZXQKLQotIwotIyBTUEkgc3VwcG9ydAotIwogQ09ORklHX1NQST15CisjIENPTkZJR19TUElfREVCVUcgaXMgbm90IHNldAogQ09ORklHX1NQSV9NQVNURVI9eQogCiAjCiAjIFNQSSBNYXN0ZXIgQ29udHJvbGxlciBEcml2ZXJzCiAjCiBDT05GSUdfU1BJX0JGSU49eQorIyBDT05GSUdfU1BJX0JGSU5fTE9DSyBpcyBub3Qgc2V0CiAjIENPTkZJR19TUElfQklUQkFORyBpcyBub3Qgc2V0CiAKICMKQEAgLTgzOCwxMSArODY3LDE1IEBACiAjIENPTkZJR19TUElfQVQyNSBpcyBub3Qgc2V0CiAjIENPTkZJR19TUElfU1BJREVWIGlzIG5vdCBzZXQKICMgQ09ORklHX1NQSV9UTEU2MlgwIGlzIG5vdCBzZXQKK0NPTkZJR19BUkNIX1dBTlRfT1BUSU9OQUxfR1BJT0xJQj15CisjIENPTkZJR19HUElPTElCIGlzIG5vdCBzZXQKICMgQ09ORklHX1cxIGlzIG5vdCBzZXQKICMgQ09ORklHX1BPV0VSX1NVUFBMWSBpcyBub3Qgc2V0CiBDT05GSUdfSFdNT049eQogIyBDT05GSUdfSFdNT05fVklEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQUQ3NDE0IGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfQUQ3NDE4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQURDWFggaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19BRE0xMDIxIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfQURNMTAyNSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0FETTEwMjYgaXMgbm90IHNldApAQCAtODUwLDYgKzg4Myw3IEBACiAjIENPTkZJR19TRU5TT1JTX0FETTEwMzEgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19BRE05MjQwIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfQURUNzQ3MCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FEVDc0NzMgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19BVFhQMSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0RTMTYyMSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0Y3MTgwNUYgaXMgbm90IHNldApAQCAtODcwLDYgKzkwNCw3IEBACiAjIENPTkZJR19TRU5TT1JTX0xNOTAgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19MTTkyIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfTE05MyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX01BWDExMTEgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19NQVgxNjE5IGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfTUFYNjY1MCBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1BDODczNjAgaXMgbm90IHNldApAQCAtODc4LDYgKzkxMyw3IEBACiAjIENPTkZJR19TRU5TT1JTX1NNU0M0N00xIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfU01TQzQ3TTE5MiBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1NNU0M0N0IzOTcgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRFM3ODI4IGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfVEhNQzUwIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfVlQxMjExIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfVzgzNzgxRCBpcyBub3Qgc2V0CkBAIC04ODUsOSArOTIxLDEyIEBACiAjIENPTkZJR19TRU5TT1JTX1c4Mzc5MkQgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19XODM3OTMgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19XODNMNzg1VFMgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19XODNMNzg2TkcgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19XODM2MjdIRiBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1c4MzYyN0VIRiBpcyBub3Qgc2V0CiAjIENPTkZJR19IV01PTl9ERUJVR19DSElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RIRVJNQUwgaXMgbm90IHNldAorIyBDT05GSUdfVEhFUk1BTF9IV01PTiBpcyBub3Qgc2V0CiBDT05GSUdfV0FUQ0hET0c9eQogIyBDT05GSUdfV0FUQ0hET0dfTk9XQVlPVVQgaXMgbm90IHNldAogCkBAIC05MDMsMjEgKzk0MiwyOSBAQAogIyBDT05GSUdfVVNCUENXQVRDSERPRyBpcyBub3Qgc2V0CiAKICMKLSMgU29uaWNzIFNpbGljb24gQmFja3BsYW5lCi0jCi1DT05GSUdfU1NCX1BPU1NJQkxFPXkKLSMgQ09ORklHX1NTQiBpcyBub3Qgc2V0Ci0KLSMKICMgTXVsdGlmdW5jdGlvbiBkZXZpY2UgZHJpdmVycwogIworIyBDT05GSUdfTUZEX0NPUkUgaXMgbm90IHNldAogIyBDT05GSUdfTUZEX1NNNTAxIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hUQ19QQVNJQzMgaXMgbm90IHNldAorIyBDT05GSUdfTUZEX1RNSU8gaXMgbm90IHNldAorIyBDT05GSUdfTUZEX1dNODQwMCBpcyBub3Qgc2V0CisjIENPTkZJR19NRkRfV004MzUwX0kyQyBpcyBub3Qgc2V0CiAKICMKICMgTXVsdGltZWRpYSBkZXZpY2VzCiAjCisKKyMKKyMgTXVsdGltZWRpYSBjb3JlIHN1cHBvcnQKKyMKICMgQ09ORklHX1ZJREVPX0RFViBpcyBub3Qgc2V0CiAjIENPTkZJR19EVkJfQ09SRSBpcyBub3Qgc2V0CisjIENPTkZJR19WSURFT19NRURJQSBpcyBub3Qgc2V0CisKKyMKKyMgTXVsdGltZWRpYSBkcml2ZXJzCisjCiAjIENPTkZJR19EQUIgaXMgbm90IHNldAogCiAjCkBAIC05MjgsNiArOTc1LDcgQEAKIENPTkZJR19GQj15CiAjIENPTkZJR19GSVJNV0FSRV9FRElEIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZCX0REQyBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9CT09UX1ZFU0FfU1VQUE9SVCBpcyBub3Qgc2V0CiBDT05GSUdfRkJfQ0ZCX0ZJTExSRUNUPXkKIENPTkZJR19GQl9DRkJfQ09QWUFSRUE9eQogQ09ORklHX0ZCX0NGQl9JTUFHRUJMSVQ9eQpAQCAtOTM1LDggKzk4Myw4IEBACiAjIENPTkZJR19GQl9TWVNfRklMTFJFQ1QgaXMgbm90IHNldAogIyBDT05GSUdfRkJfU1lTX0NPUFlBUkVBIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZCX1NZU19JTUFHRUJMSVQgaXMgbm90IHNldAorIyBDT05GSUdfRkJfRk9SRUlHTl9FTkRJQU4gaXMgbm90IHNldAogIyBDT05GSUdfRkJfU1lTX0ZPUFMgaXMgbm90IHNldAotQ09ORklHX0ZCX0RFRkVSUkVEX0lPPXkKICMgQ09ORklHX0ZCX1NWR0FMSUIgaXMgbm90IHNldAogIyBDT05GSUdfRkJfTUFDTU9ERVMgaXMgbm90IHNldAogIyBDT05GSUdfRkJfQkFDS0xJR0hUIGlzIG5vdCBzZXQKQEAgLTk0NywxMiArOTk1LDE4IEBACiAjIEZyYW1lIGJ1ZmZlciBoYXJkd2FyZSBkcml2ZXJzCiAjCiBDT05GSUdfRkJfQkZJTl9UMzUwTUNRQj15CisjIENPTkZJR19GQl9CRklOX0xRMDM1UTEgaXMgbm90IHNldAogIyBDT05GSUdfRkJfQkZJTl83MzkzIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZCX1MxRDEzWFhYIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZCX1ZJUlRVQUwgaXMgbm90IHNldAorIyBDT05GSUdfRkJfTUVUUk9OT01FIGlzIG5vdCBzZXQKIENPTkZJR19CQUNLTElHSFRfTENEX1NVUFBPUlQ9eQogQ09ORklHX0xDRF9DTEFTU19ERVZJQ0U9bQogQ09ORklHX0xDRF9MVFYzNTBRVj1tCisjIENPTkZJR19MQ0RfSUxJOTMyMCBpcyBub3Qgc2V0CisjIENPTkZJR19MQ0RfVERPMjRNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xDRF9WR0cyNDMyQTQgaXMgbm90IHNldAorIyBDT05GSUdfTENEX1BMQVRGT1JNIGlzIG5vdCBzZXQKIENPTkZJR19CQUNLTElHSFRfQ0xBU1NfREVWSUNFPW0KICMgQ09ORklHX0JBQ0tMSUdIVF9DT1JHSSBpcyBub3Qgc2V0CiAKQEAgLTk3NywxNSArMTAzMSw4IEBACiAjIENPTkZJR19MT0dPX0xJTlVYX0NMVVQyMjQgaXMgbm90IHNldAogIyBDT05GSUdfTE9HT19CTEFDS0ZJTl9WR0ExNiBpcyBub3Qgc2V0CiBDT05GSUdfTE9HT19CTEFDS0ZJTl9DTFVUMjI0PXkKLQotIwotIyBTb3VuZAotIwogQ09ORklHX1NPVU5EPW0KLQotIwotIyBBZHZhbmNlZCBMaW51eCBTb3VuZCBBcmNoaXRlY3R1cmUKLSMKKyMgQ09ORklHX1NPVU5EX09TU19DT1JFIGlzIG5vdCBzZXQKIENPTkZJR19TTkQ9bQogQ09ORklHX1NORF9USU1FUj1tCiBDT05GSUdfU05EX1BDTT1tCkBAIC05OTcsNjIgKzEwNDQsMzggQEAKIENPTkZJR19TTkRfVkVSQk9TRV9QUk9DRlM9eQogIyBDT05GSUdfU05EX1ZFUkJPU0VfUFJJTlRLIGlzIG5vdCBzZXQKICMgQ09ORklHX1NORF9ERUJVRyBpcyBub3Qgc2V0Ci0KLSMKLSMgR2VuZXJpYyBkZXZpY2VzCi0jCitDT05GSUdfU05EX0RSSVZFUlM9eQogIyBDT05GSUdfU05EX0RVTU1ZIGlzIG5vdCBzZXQKICMgQ09ORklHX1NORF9NVFBBViBpcyBub3Qgc2V0CiAjIENPTkZJR19TTkRfU0VSSUFMX1UxNjU1MCBpcyBub3Qgc2V0CiAjIENPTkZJR19TTkRfTVBVNDAxIGlzIG5vdCBzZXQKLQotIwotIyBTUEkgZGV2aWNlcwotIworQ09ORklHX1NORF9TUEk9eQogCiAjCiAjIEFMU0EgQmxhY2tmaW4gZGV2aWNlcwogIwogIyBDT05GSUdfU05EX0JMQUNLRklOX0FEMTgzNiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfQkxBQ0tGSU5fQUQxODM2X1RETSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfQkxBQ0tGSU5fQUQxODM2X0kyUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfQkxBQ0tGSU5fQUQxODM2X01VTFNVQiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfQkxBQ0tGSU5fQUQxODM2XzVQMSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfQkZJTl9BRDczMzExIGlzIG5vdCBzZXQKICMgQ09ORklHX1NORF9CRklOX0FENzMzMjIgaXMgbm90IHNldAotCi0jCi0jIFVTQiBkZXZpY2VzCi0jCitDT05GSUdfU05EX1VTQj15CiAjIENPTkZJR19TTkRfVVNCX0FVRElPIGlzIG5vdCBzZXQKICMgQ09ORklHX1NORF9VU0JfQ0FJQVEgaXMgbm90IHNldAotCi0jCi0jIFN5c3RlbSBvbiBDaGlwIGF1ZGlvIHN1cHBvcnQKLSMKLUNPTkZJR19TTkRfU09DX0FDOTdfQlVTPXkKIENPTkZJR19TTkRfU09DPW0KLUNPTkZJR19TTkRfQkY1WFhfU09DPW0KLUNPTkZJR19TTkRfTU1BUF9TVVBQT1JUPXkKK0NPTkZJR19TTkRfU09DX0FDOTdfQlVTPXkKK0NPTkZJR19TTkRfQkY1WFhfSTJTPW0KK0NPTkZJR19TTkRfQkY1WFhfU09DX1NTTTI2MDI9bQorIyBDT05GSUdfU05EX0JGNVhYX1NPQ19BRDczMzExIGlzIG5vdCBzZXQKK0NPTkZJR19TTkRfQkY1WFhfQUM5Nz1tCitDT05GSUdfU05EX0JGNVhYX01NQVBfU1VQUE9SVD15CisjIENPTkZJR19TTkRfQkY1WFhfTVVMVElDSEFOX1NVUFBPUlQgaXMgbm90IHNldAorQ09ORklHX1NORF9CRjVYWF9TT0NfU1BPUlQ9bQogQ09ORklHX1NORF9CRjVYWF9TT0NfSTJTPW0KIENPTkZJR19TTkRfQkY1WFhfU09DX0FDOTc9bQotIyBDT05GSUdfU05EX0JGNVhYX1NPQ19XTTg3NTAgaXMgbm90IHNldAotIyBDT05GSUdfU05EX0JGNVhYX1NPQ19XTTg3MzEgaXMgbm90IHNldAotQ09ORklHX1NORF9CRjVYWF9TT0NfU1NNMjYwMj1tCi1DT05GSUdfU05EX0JGNVhYX1NPQ19CRjV4eD1tCitDT05GSUdfU05EX0JGNVhYX1NPQ19BRDE5ODA9bQogQ09ORklHX1NORF9CRjVYWF9TUE9SVF9OVU09MAogIyBDT05GSUdfU05EX0JGNVhYX0hBVkVfQ09MRF9SRVNFVCBpcyBub3Qgc2V0Ci0KLSMKLSMgU29DIEF1ZGlvIHN1cHBvcnQgZm9yIFN1cGVySAotIwotQ09ORklHX1NORF9TT0NfU1NNMjYwMj1tCi0jIENPTkZJR19TTkRfU09DX1NTTTI2MDJfU1BJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9TT0NfQUxMX0NPREVDUyBpcyBub3Qgc2V0CiBDT05GSUdfU05EX1NPQ19BRDE5ODA9bQotCi0jCi0jIE9wZW4gU291bmQgU3lzdGVtCi0jCitDT05GSUdfU05EX1NPQ19TU00yNjAyPW0KICMgQ09ORklHX1NPVU5EX1BSSU1FIGlzIG5vdCBzZXQKIENPTkZJR19BQzk3X0JVUz1tCiBDT05GSUdfSElEX1NVUFBPUlQ9eQpAQCAtMTA2NCwxNSArMTA4Nyw0MyBAQAogIyBVU0IgSW5wdXQgRGV2aWNlcwogIwogQ09ORklHX1VTQl9ISUQ9eQotIyBDT05GSUdfVVNCX0hJRElOUFVUX1BPV0VSQk9PSyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ISURfRkYgaXMgbm90IHNldAorIyBDT05GSUdfSElEX1BJRCBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfSElEREVWIGlzIG5vdCBzZXQKKworIworIyBTcGVjaWFsIEhJRCBkcml2ZXJzCisjCitDT05GSUdfSElEX0NPTVBBVD15CitDT05GSUdfSElEX0E0VEVDSD15CitDT05GSUdfSElEX0FQUExFPXkKK0NPTkZJR19ISURfQkVMS0lOPXkKK0NPTkZJR19ISURfQlJJR0hUPXkKK0NPTkZJR19ISURfQ0hFUlJZPXkKK0NPTkZJR19ISURfQ0hJQ09OWT15CitDT05GSUdfSElEX0NZUFJFU1M9eQorQ09ORklHX0hJRF9ERUxMPXkKK0NPTkZJR19ISURfRVpLRVk9eQorQ09ORklHX0hJRF9HWVJBVElPTj15CitDT05GSUdfSElEX0xPR0lURUNIPXkKKyMgQ09ORklHX0xPR0lURUNIX0ZGIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xPR0lSVU1CTEVQQUQyX0ZGIGlzIG5vdCBzZXQKK0NPTkZJR19ISURfTUlDUk9TT0ZUPXkKK0NPTkZJR19ISURfTU9OVEVSRVk9eQorQ09ORklHX0hJRF9QQU5USEVSTE9SRD15CisjIENPTkZJR19QQU5USEVSTE9SRF9GRiBpcyBub3Qgc2V0CitDT05GSUdfSElEX1BFVEFMWU5YPXkKK0NPTkZJR19ISURfU0FNU1VORz15CitDT05GSUdfSElEX1NPTlk9eQorQ09ORklHX0hJRF9TVU5QTFVTPXkKK0NPTkZJR19USFJVU1RNQVNURVJfRkY9bQorQ09ORklHX1pFUk9QTFVTX0ZGPW0KIENPTkZJR19VU0JfU1VQUE9SVD15CiBDT05GSUdfVVNCX0FSQ0hfSEFTX0hDRD15CiAjIENPTkZJR19VU0JfQVJDSF9IQVNfT0hDSSBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfQVJDSF9IQVNfRUhDSSBpcyBub3Qgc2V0CiBDT05GSUdfVVNCPXkKICMgQ09ORklHX1VTQl9ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfQU5OT1VOQ0VfTkVXX0RFVklDRVMgaXMgbm90IHNldAogCiAjCiAjIE1pc2NlbGxhbmVvdXMgVVNCIG9wdGlvbnMKQEAgLTEwODMsMTUgKzExMzQsMjAgQEAKICMgQ09ORklHX1VTQl9PVEcgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX09UR19XSElURUxJU1QgaXMgbm90IHNldAogQ09ORklHX1VTQl9PVEdfQkxBQ0tMSVNUX0hVQj15CitDT05GSUdfVVNCX01PTj15CisjIENPTkZJR19VU0JfV1VTQiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfV1VTQl9DQkFGIGlzIG5vdCBzZXQKIAogIwogIyBVU0IgSG9zdCBDb250cm9sbGVyIERyaXZlcnMKICMKKyMgQ09ORklHX1VTQl9DNjdYMDBfSENEIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9JU1AxMTZYX0hDRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfSVNQMTM2Ml9IQ0QgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX0lTUDE3NjBfSENEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9JU1AxMzYyX0hDRCBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfU0w4MTFfSENEIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9SOEE2NjU5N19IQ0QgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0hXQV9IQ0QgaXMgbm90IHNldAogQ09ORklHX1VTQl9NVVNCX0hEUkM9eQogQ09ORklHX1VTQl9NVVNCX1NPQz15CiAKQEAgLTExMDMsMTMgKzExNTksMTUgQEAKICMgQ09ORklHX1VTQl9NVVNCX09URyBpcyBub3Qgc2V0CiBDT05GSUdfVVNCX01VU0JfSERSQ19IQ0Q9eQogQ09ORklHX01VU0JfUElPX09OTFk9eQotQ09ORklHX1VTQl9NVVNCX0xPR0xFVkVMPTAKKyMgQ09ORklHX1VTQl9NVVNCX0RFQlVHIGlzIG5vdCBzZXQKIAogIwogIyBVU0IgRGV2aWNlIENsYXNzIGRyaXZlcnMKICMKICMgQ09ORklHX1VTQl9BQ00gaXMgbm90IHNldAogIyBDT05GSUdfVVNCX1BSSU5URVIgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1dETSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfVE1DIGlzIG5vdCBzZXQKIAogIwogIyBOT1RFOiBVU0JfU1RPUkFHRSBlbmFibGVzIFNDU0ksIGFuZCAnU0NTSSBkaXNrIHN1cHBvcnQnCkBAIC0xMTI0LDE1ICsxMTgyLDEwIEBACiAjIFVTQiBJbWFnaW5nIGRldmljZXMKICMKICMgQ09ORklHX1VTQl9NREM4MDAgaXMgbm90IHNldAotQ09ORklHX1VTQl9NT049eQogCiAjCiAjIFVTQiBwb3J0IGRyaXZlcnMKICMKLQotIwotIyBVU0IgU2VyaWFsIENvbnZlcnRlciBzdXBwb3J0Ci0jCiAjIENPTkZJR19VU0JfU0VSSUFMIGlzIG5vdCBzZXQKIAogIwpAQCAtMTE0MSw3ICsxMTk0LDcgQEAKICMgQ09ORklHX1VTQl9FTUk2MiBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfRU1JMjYgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX0FEVVRVWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfQVVFUlNXQUxEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TRVZTRUcgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX1JJTzUwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfTEVHT1RPV0VSIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9MQ0QgaXMgbm90IHNldApAQCAtMTE1NywxNyArMTIxMCwxMyBAQAogIyBDT05GSUdfVVNCX0xEIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9UUkFOQ0VWSUJSQVRPUiBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfSU9XQVJSSU9SIGlzIG5vdCBzZXQKLQotIwotIyBVU0IgRFNMIG1vZGVtIHN1cHBvcnQKLSMKLQotIwotIyBVU0IgR2FkZ2V0IFN1cHBvcnQKLSMKKyMgQ09ORklHX1VTQl9JU0lHSFRGVyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfVlNUIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9HQURHRVQgaXMgbm90IHNldAogIyBDT05GSUdfTU1DIGlzIG5vdCBzZXQKKyMgQ09ORklHX01FTVNUSUNLIGlzIG5vdCBzZXQKICMgQ09ORklHX05FV19MRURTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FDQ0VTU0lCSUxJVFkgaXMgbm90IHNldAogQ09ORklHX1JUQ19MSUI9eQogQ09ORklHX1JUQ19DTEFTUz15CiBDT05GSUdfUlRDX0hDVE9TWVM9eQpAQCAtMTE5Niw1MSArMTI0NSw1NyBAQAogIyBDT05GSUdfUlRDX0RSVl9QQ0Y4NTYzIGlzIG5vdCBzZXQKICMgQ09ORklHX1JUQ19EUlZfUENGODU4MyBpcyBub3Qgc2V0CiAjIENPTkZJR19SVENfRFJWX000MVQ4MCBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX1MzNTM5MEEgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9GTTMxMzAgaXMgbm90IHNldAogCiAjCiAjIFNQSSBSVEMgZHJpdmVycwogIwotIyBDT05GSUdfUlRDX0RSVl9SUzVDMzQ4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfTTQxVDk0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfRFMxMzA1IGlzIG5vdCBzZXQKICMgQ09ORklHX1JUQ19EUlZfTUFYNjkwMiBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX1I5NzAxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfUlM1QzM0OCBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX0RTMzIzNCBpcyBub3Qgc2V0CiAKICMKICMgUGxhdGZvcm0gUlRDIGRyaXZlcnMKICMKKyMgQ09ORklHX1JUQ19EUlZfRFMxMjg2IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfRFMxNTExIGlzIG5vdCBzZXQKICMgQ09ORklHX1JUQ19EUlZfRFMxNTUzIGlzIG5vdCBzZXQKLSMgQ09ORklHX1JUQ19EUlZfU1RLMTdUQTggaXMgbm90IHNldAogIyBDT05GSUdfUlRDX0RSVl9EUzE3NDIgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9TVEsxN1RBOCBpcyBub3Qgc2V0CiAjIENPTkZJR19SVENfRFJWX000OFQ4NiBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX000OFQzNSBpcyBub3Qgc2V0CiAjIENPTkZJR19SVENfRFJWX000OFQ1OSBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX0JRNDgwMiBpcyBub3Qgc2V0CiAjIENPTkZJR19SVENfRFJWX1YzMDIwIGlzIG5vdCBzZXQKIAogIwogIyBvbi1DUFUgUlRDIGRyaXZlcnMKICMKIENPTkZJR19SVENfRFJWX0JGSU49eQotCi0jCi0jIFVzZXJzcGFjZSBJL08KLSMKKyMgQ09ORklHX0RNQURFVklDRVMgaXMgbm90IHNldAogIyBDT05GSUdfVUlPIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NUQUdJTkcgaXMgbm90IHNldAogCiAjCiAjIEZpbGUgc3lzdGVtcwogIwogIyBDT05GSUdfRVhUMl9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19FWFQzX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0VYVDRERVZfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRVhUNF9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19SRUlTRVJGU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19KRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfRlNfUE9TSVhfQUNMIGlzIG5vdCBzZXQKK0NPTkZJR19GSUxFX0xPQ0tJTkc9eQogIyBDT05GSUdfWEZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0dGUzJfRlMgaXMgbm90IHNldAogIyBDT05GSUdfT0NGUzJfRlMgaXMgbm90IHNldAotIyBDT05GSUdfTUlOSVhfRlMgaXMgbm90IHNldAotIyBDT05GSUdfUk9NRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRE5PVElGWSBpcyBub3Qgc2V0CiBDT05GSUdfSU5PVElGWT15CiBDT05GSUdfSU5PVElGWV9VU0VSPXkKICMgQ09ORklHX1FVT1RBIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ROT1RJRlkgaXMgbm90IHNldAogIyBDT05GSUdfQVVUT0ZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0FVVE9GUzRfRlMgaXMgbm90IHNldAogIyBDT05GSUdfRlVTRV9GUyBpcyBub3Qgc2V0CkBAIC0xMjgwLDExICsxMzM1LDExIEBACiAjIENPTkZJR19FRlNfRlMgaXMgbm90IHNldAogQ09ORklHX1lBRkZTX0ZTPW0KIENPTkZJR19ZQUZGU19ZQUZGUzE9eQorIyBDT05GSUdfWUFGRlNfOUJZVEVfVEFHUyBpcyBub3Qgc2V0CiAjIENPTkZJR19ZQUZGU19ET0VTX0VDQyBpcyBub3Qgc2V0CiBDT05GSUdfWUFGRlNfWUFGRlMyPXkKIENPTkZJR19ZQUZGU19BVVRPX1lBRkZTMj15CiAjIENPTkZJR19ZQUZGU19ESVNBQkxFX0xBWllfTE9BRCBpcyBub3Qgc2V0Ci1DT05GSUdfWUFGRlNfQ0hFQ0tQT0lOVF9SRVNFUlZFRF9CTE9DS1M9MTAKICMgQ09ORklHX1lBRkZTX0RJU0FCTEVfV0lERV9UTk9ERVMgaXMgbm90IHNldAogIyBDT05GSUdfWUFGRlNfQUxXQVlTX0NIRUNLX0NIVU5LX0VSQVNFRCBpcyBub3Qgc2V0CiBDT05GSUdfWUFGRlNfU0hPUlRfTkFNRVNfSU5fUkFNPXkKQEAgLTEzMDEsOCArMTM1NiwxMSBAQAogIyBDT05GSUdfSkZGUzJfUlVCSU4gaXMgbm90IHNldAogIyBDT05GSUdfQ1JBTUZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1ZYRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTUlOSVhfRlMgaXMgbm90IHNldAorIyBDT05GSUdfT01GU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19IUEZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1FOWDRGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19ST01GU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19TWVNWX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1VGU19GUyBpcyBub3Qgc2V0CiBDT05GSUdfTkVUV09SS19GSUxFU1lTVEVNUz15CkBAIC0xMzEwLDEzICsxMzY4LDEyIEBACiBDT05GSUdfTkZTX1YzPXkKICMgQ09ORklHX05GU19WM19BQ0wgaXMgbm90IHNldAogIyBDT05GSUdfTkZTX1Y0IGlzIG5vdCBzZXQKLSMgQ09ORklHX05GU19ESVJFQ1RJTyBpcyBub3Qgc2V0CiAjIENPTkZJR19ORlNEIGlzIG5vdCBzZXQKIENPTkZJR19MT0NLRD1tCiBDT05GSUdfTE9DS0RfVjQ9eQogQ09ORklHX05GU19DT01NT049eQogQ09ORklHX1NVTlJQQz1tCi0jIENPTkZJR19TVU5SUENfQklORDM0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NVTlJQQ19SRUdJU1RFUl9WNCBpcyBub3Qgc2V0CiAjIENPTkZJR19SUENTRUNfR1NTX0tSQjUgaXMgbm90IHNldAogIyBDT05GSUdfUlBDU0VDX0dTU19TUEtNMyBpcyBub3Qgc2V0CiBDT05GSUdfU01CX0ZTPW0KQEAgLTEzNzIsOSArMTQyOSw2IEBACiAjIENPTkZJR19OTFNfS09JOF9VIGlzIG5vdCBzZXQKICMgQ09ORklHX05MU19VVEY4IGlzIG5vdCBzZXQKICMgQ09ORklHX0RMTSBpcyBub3Qgc2V0Ci1DT05GSUdfSU5TVFJVTUVOVEFUSU9OPXkKLSMgQ09ORklHX1BST0ZJTElORyBpcyBub3Qgc2V0Ci0jIENPTkZJR19NQVJLRVJTIGlzIG5vdCBzZXQKIAogIwogIyBLZXJuZWwgaGFja2luZwpAQCAtMTM4MiwxNCArMTQzNiw1MyBAQAogIyBDT05GSUdfUFJJTlRLX1RJTUUgaXMgbm90IHNldAogQ09ORklHX0VOQUJMRV9XQVJOX0RFUFJFQ0FURUQ9eQogQ09ORklHX0VOQUJMRV9NVVNUX0NIRUNLPXkKK0NPTkZJR19GUkFNRV9XQVJOPTEwMjQKICMgQ09ORklHX01BR0lDX1NZU1JRIGlzIG5vdCBzZXQKICMgQ09ORklHX1VOVVNFRF9TWU1CT0xTIGlzIG5vdCBzZXQKIENPTkZJR19ERUJVR19GUz15CiAjIENPTkZJR19IRUFERVJTX0NIRUNLIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQlVHX0tFUk5FTCBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfS0VSTkVMPXkKKyMgQ09ORklHX0RFQlVHX1NISVJRIGlzIG5vdCBzZXQKK0NPTkZJR19ERVRFQ1RfU09GVExPQ0tVUD15CisjIENPTkZJR19CT09UUEFSQU1fU09GVExPQ0tVUF9QQU5JQyBpcyBub3Qgc2V0CitDT05GSUdfQk9PVFBBUkFNX1NPRlRMT0NLVVBfUEFOSUNfVkFMVUU9MAorQ09ORklHX1NDSEVEX0RFQlVHPXkKKyMgQ09ORklHX1NDSEVEU1RBVFMgaXMgbm90IHNldAorIyBDT05GSUdfVElNRVJfU1RBVFMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfT0JKRUNUUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TTEFCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1JUX01VVEVYRVMgaXMgbm90IHNldAorIyBDT05GSUdfUlRfTVVURVhfVEVTVEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NQSU5MT0NLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX01VVEVYRVMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU1BJTkxPQ0tfU0xFRVAgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfTE9DS0lOR19BUElfU0VMRlRFU1RTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0tPQkpFQ1QgaXMgbm90IHNldAogIyBDT05GSUdfREVCVUdfQlVHVkVSQk9TRSBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfSU5GTz15CisjIENPTkZJR19ERUJVR19WTSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19XUklURUNPVU5UIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX01FTU9SWV9JTklUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0xJU1QgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU0cgaXMgbm90IHNldAorIyBDT05GSUdfRlJBTUVfUE9JTlRFUiBpcyBub3Qgc2V0CisjIENPTkZJR19CT09UX1BSSU5US19ERUxBWSBpcyBub3Qgc2V0CisjIENPTkZJR19SQ1VfVE9SVFVSRV9URVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JDVV9DUFVfU1RBTExfREVURUNUT1IgaXMgbm90IHNldAorIyBDT05GSUdfQkFDS1RSQUNFX1NFTEZfVEVTVCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19CTE9DS19FWFRfREVWVCBpcyBub3Qgc2V0CisjIENPTkZJR19GQVVMVF9JTkpFQ1RJT04gaXMgbm90IHNldAorIyBDT05GSUdfU1lTQ1RMX1NZU0NBTExfQ0hFQ0sgaXMgbm90IHNldAorIyBDT05GSUdfRFlOQU1JQ19QUklOVEtfREVCVUcgaXMgbm90IHNldAogIyBDT05GSUdfU0FNUExFUyBpcyBub3Qgc2V0CitDT05GSUdfSEFWRV9BUkNIX0tHREI9eQorIyBDT05GSUdfS0dEQiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TVEFDS09WRVJGTE9XIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NUQUNLX1VTQUdFIGlzIG5vdCBzZXQKK0NPTkZJR19ERUJVR19WRVJCT1NFPXkKIENPTkZJR19ERUJVR19NTVJTPXkKKyMgQ09ORklHX0RFQlVHX0hXRVJSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0RPVUJMRUZBVUxUIGlzIG5vdCBzZXQKIENPTkZJR19ERUJVR19IVU5UX0ZPUl9aRVJPPXkKIENPTkZJR19ERUJVR19CRklOX0hXVFJBQ0VfT049eQogQ09ORklHX0RFQlVHX0JGSU5fSFdUUkFDRV9DT01QUkVTU0lPTl9PRkY9eQpAQCAtMTQwNywxMCArMTUwMCw5NSBAQAogIwogIyBDT05GSUdfS0VZUyBpcyBub3Qgc2V0CiBDT05GSUdfU0VDVVJJVFk9eQorIyBDT05GSUdfU0VDVVJJVFlGUyBpcyBub3Qgc2V0CiAjIENPTkZJR19TRUNVUklUWV9ORVRXT1JLIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFQ1VSSVRZX0NBUEFCSUxJVElFUyBpcyBub3Qgc2V0CisjIENPTkZJR19TRUNVUklUWV9GSUxFX0NBUEFCSUxJVElFUyBpcyBub3Qgc2V0CiAjIENPTkZJR19TRUNVUklUWV9ST09UUExVRyBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE8gaXMgbm90IHNldAorQ09ORklHX1NFQ1VSSVRZX0RFRkFVTFRfTU1BUF9NSU5fQUREUj0wCitDT05GSUdfQ1JZUFRPPXkKKworIworIyBDcnlwdG8gY29yZSBvciBoZWxwZXIKKyMKKyMgQ09ORklHX0NSWVBUT19GSVBTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19NQU5BR0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19HRjEyOE1VTCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fTlVMTCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQ1JZUFREIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19BVVRIRU5DIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19URVNUIGlzIG5vdCBzZXQKKworIworIyBBdXRoZW50aWNhdGVkIEVuY3J5cHRpb24gd2l0aCBBc3NvY2lhdGVkIERhdGEKKyMKKyMgQ09ORklHX0NSWVBUT19DQ00gaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0dDTSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0VRSVYgaXMgbm90IHNldAorCisjCisjIEJsb2NrIG1vZGVzCisjCisjIENPTkZJR19DUllQVE9fQ0JDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19DVFIgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0NUUyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fRUNCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19MUlcgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1BDQkMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1hUUyBpcyBub3Qgc2V0CisKKyMKKyMgSGFzaCBtb2RlcworIworIyBDT05GSUdfQ1JZUFRPX0hNQUMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1hDQkMgaXMgbm90IHNldAorCisjCisjIERpZ2VzdAorIworIyBDT05GSUdfQ1JZUFRPX0NSQzMyQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fTUQ0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19NRDUgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX01JQ0hBRUxfTUlDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19STUQxMjggaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1JNRDE2MCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fUk1EMjU2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19STUQzMjAgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1NIQTEgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1NIQTI1NiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0hBNTEyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19UR1IxOTIgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1dQNTEyIGlzIG5vdCBzZXQKKworIworIyBDaXBoZXJzCisjCisjIENPTkZJR19DUllQVE9fQUVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19BTlVCSVMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0FSQzQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0JMT1dGSVNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19DQU1FTExJQSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQ0FTVDUgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0NBU1Q2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19ERVMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0ZDUllQVCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fS0hBWkFEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TQUxTQTIwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TRUVEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TRVJQRU5UIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19URUEgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1RXT0ZJU0ggaXMgbm90IHNldAorCisjCisjIENvbXByZXNzaW9uCisjCisjIENPTkZJR19DUllQVE9fREVGTEFURSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fTFpPIGlzIG5vdCBzZXQKKworIworIyBSYW5kb20gTnVtYmVyIEdlbmVyYXRpb24KKyMKKyMgQ09ORklHX0NSWVBUT19BTlNJX0NQUk5HIGlzIG5vdCBzZXQKK0NPTkZJR19DUllQVE9fSFc9eQogCiAjCiAjIExpYnJhcnkgcm91dGluZXMKQEAgLTE0MTgsNiArMTU5Niw3IEBACiBDT05GSUdfQklUUkVWRVJTRT15CiBDT05GSUdfQ1JDX0NDSVRUPW0KICMgQ09ORklHX0NSQzE2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQ19UMTBESUYgaXMgbm90IHNldAogIyBDT05GSUdfQ1JDX0lUVV9UIGlzIG5vdCBzZXQKIENPTkZJR19DUkMzMj15CiAjIENPTkZJR19DUkM3IGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vY29uZmlncy9CRjUzMy1FWktJVF9kZWZjb25maWcgYi9hcmNoL2JsYWNrZmluL2NvbmZpZ3MvQkY1MzMtRVpLSVRfZGVmY29uZmlnCmluZGV4IGRlZWI1ZTQuLjkyYWZkOTggMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vY29uZmlncy9CRjUzMy1FWktJVF9kZWZjb25maWcKKysrIGIvYXJjaC9ibGFja2Zpbi9jb25maWdzL0JGNTMzLUVaS0lUX2RlZmNvbmZpZwpAQCAtMSw2ICsxLDYgQEAKICMKICMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKLSMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4yNC43CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMjgtcmMyCiAjCiAjIENPTkZJR19NTVUgaXMgbm90IHNldAogIyBDT05GSUdfRlBVIGlzIG5vdCBzZXQKQEAgLTgsNyArOCw2IEBACiAjIENPTkZJR19SV1NFTV9YQ0hHQUREX0FMR09SSVRITSBpcyBub3Qgc2V0CiBDT05GSUdfQkxBQ0tGSU49eQogQ09ORklHX1pPTkVfRE1BPXkKLUNPTkZJR19TRU1BUEhPUkVfU0xFRVBFUlM9eQogQ09ORklHX0dFTkVSSUNfRklORF9ORVhUX0JJVD15CiBDT05GSUdfR0VORVJJQ19IV0VJR0hUPXkKIENPTkZJR19HRU5FUklDX0hBUkRJUlFTPXkKQEAgLTMxLDE4ICszMCwxNiBAQAogIyBDT05GSUdfUE9TSVhfTVFVRVVFIGlzIG5vdCBzZXQKICMgQ09ORklHX0JTRF9QUk9DRVNTX0FDQ1QgaXMgbm90IHNldAogIyBDT05GSUdfVEFTS1NUQVRTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTRVJfTlMgaXMgbm90IHNldAotIyBDT05GSUdfUElEX05TIGlzIG5vdCBzZXQKICMgQ09ORklHX0FVRElUIGlzIG5vdCBzZXQKIENPTkZJR19JS0NPTkZJRz15CiBDT05GSUdfSUtDT05GSUdfUFJPQz15CiBDT05GSUdfTE9HX0JVRl9TSElGVD0xNAogIyBDT05GSUdfQ0dST1VQUyBpcyBub3Qgc2V0Ci1DT05GSUdfRkFJUl9HUk9VUF9TQ0hFRD15Ci1DT05GSUdfRkFJUl9VU0VSX1NDSEVEPXkKLSMgQ09ORklHX0ZBSVJfQ0dST1VQX1NDSEVEIGlzIG5vdCBzZXQKLUNPTkZJR19TWVNGU19ERVBSRUNBVEVEPXkKKyMgQ09ORklHX0dST1VQX1NDSEVEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZU0ZTX0RFUFJFQ0FURUQgaXMgbm90IHNldAorIyBDT05GSUdfU1lTRlNfREVQUkVDQVRFRF9WMiBpcyBub3Qgc2V0CiAjIENPTkZJR19SRUxBWSBpcyBub3Qgc2V0CisjIENPTkZJR19OQU1FU1BBQ0VTIGlzIG5vdCBzZXQKIENPTkZJR19CTEtfREVWX0lOSVRSRD15CiBDT05GSUdfSU5JVFJBTUZTX1NPVVJDRT0iIgogIyBDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkUgaXMgbm90IHNldApAQCAtNTEsMjYgKzQ4LDM1IEBACiBDT05GSUdfVUlEMTY9eQogQ09ORklHX1NZU0NUTF9TWVNDQUxMPXkKIENPTkZJR19LQUxMU1lNUz15CisjIENPTkZJR19LQUxMU1lNU19BTEwgaXMgbm90IHNldAogIyBDT05GSUdfS0FMTFNZTVNfRVhUUkFfUEFTUyBpcyBub3Qgc2V0CiBDT05GSUdfSE9UUExVRz15CiBDT05GSUdfUFJJTlRLPXkKIENPTkZJR19CVUc9eQotQ09ORklHX0VMRl9DT1JFPXkKKyMgQ09ORklHX0VMRl9DT1JFIGlzIG5vdCBzZXQKK0NPTkZJR19DT01QQVRfQlJLPXkKIENPTkZJR19CQVNFX0ZVTEw9eQogQ09ORklHX0ZVVEVYPXkKIENPTkZJR19BTk9OX0lOT0RFUz15CiBDT05GSUdfRVBPTEw9eQogQ09ORklHX1NJR05BTEZEPXkKK0NPTkZJR19USU1FUkZEPXkKIENPTkZJR19FVkVOVEZEPXkKK0NPTkZJR19BSU89eQogQ09ORklHX1ZNX0VWRU5UX0NPVU5URVJTPXkKIENPTkZJR19TTEFCPXkKICMgQ09ORklHX1NMVUIgaXMgbm90IHNldAogIyBDT05GSUdfU0xPQiBpcyBub3Qgc2V0CisjIENPTkZJR19QUk9GSUxJTkcgaXMgbm90IHNldAorIyBDT05GSUdfTUFSS0VSUyBpcyBub3Qgc2V0CitDT05GSUdfSEFWRV9PUFJPRklMRT15CisjIENPTkZJR19IQVZFX0dFTkVSSUNfRE1BX0NPSEVSRU5UIGlzIG5vdCBzZXQKIENPTkZJR19TTEFCSU5GTz15CiBDT05GSUdfUlRfTVVURVhFUz15CiBDT05GSUdfVElOWV9TSE1FTT15CiBDT05GSUdfQkFTRV9TTUFMTD0wCiBDT05GSUdfTU9EVUxFUz15CisjIENPTkZJR19NT0RVTEVfRk9SQ0VfTE9BRCBpcyBub3Qgc2V0CiBDT05GSUdfTU9EVUxFX1VOTE9BRD15CiAjIENPTkZJR19NT0RVTEVfRk9SQ0VfVU5MT0FEIGlzIG5vdCBzZXQKICMgQ09ORklHX01PRFZFUlNJT05TIGlzIG5vdCBzZXQKQEAgLTgxLDYgKzg3LDcgQEAKICMgQ09ORklHX0JMS19ERVZfSU9fVFJBQ0UgaXMgbm90IHNldAogIyBDT05GSUdfTFNGIGlzIG5vdCBzZXQKICMgQ09ORklHX0JMS19ERVZfQlNHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSU5URUdSSVRZIGlzIG5vdCBzZXQKIAogIwogIyBJTyBTY2hlZHVsZXJzCkBAIC05NCw5ICsxMDEsMTEgQEAKICMgQ09ORklHX0RFRkFVTFRfQ0ZRIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFRkFVTFRfTk9PUCBpcyBub3Qgc2V0CiBDT05GSUdfREVGQVVMVF9JT1NDSEVEPSJhbnRpY2lwYXRvcnkiCitDT05GSUdfQ0xBU1NJQ19SQ1U9eQogIyBDT05GSUdfUFJFRU1QVF9OT05FIGlzIG5vdCBzZXQKIENPTkZJR19QUkVFTVBUX1ZPTFVOVEFSWT15CiAjIENPTkZJR19QUkVFTVBUIGlzIG5vdCBzZXQKK0NPTkZJR19GUkVFWkVSPXkKIAogIwogIyBCbGFja2ZpbiBQcm9jZXNzb3IgT3B0aW9ucwpAQCAtMTA1LDYgKzExNCwxMCBAQAogIwogIyBQcm9jZXNzb3IgYW5kIEJvYXJkIFNldHRpbmdzCiAjCisjIENPTkZJR19CRjUxMiBpcyBub3Qgc2V0CisjIENPTkZJR19CRjUxNCBpcyBub3Qgc2V0CisjIENPTkZJR19CRjUxNiBpcyBub3Qgc2V0CisjIENPTkZJR19CRjUxOCBpcyBub3Qgc2V0CiAjIENPTkZJR19CRjUyMiBpcyBub3Qgc2V0CiAjIENPTkZJR19CRjUyMyBpcyBub3Qgc2V0CiAjIENPTkZJR19CRjUyNCBpcyBub3Qgc2V0CkBAIC0xMTcsMjQgKzEzMCwzMCBAQAogIyBDT05GSUdfQkY1MzQgaXMgbm90IHNldAogIyBDT05GSUdfQkY1MzYgaXMgbm90IHNldAogIyBDT05GSUdfQkY1MzcgaXMgbm90IHNldAorIyBDT05GSUdfQkY1MzggaXMgbm90IHNldAorIyBDT05GSUdfQkY1MzkgaXMgbm90IHNldAogIyBDT05GSUdfQkY1NDIgaXMgbm90IHNldAogIyBDT05GSUdfQkY1NDQgaXMgbm90IHNldAogIyBDT05GSUdfQkY1NDcgaXMgbm90IHNldAogIyBDT05GSUdfQkY1NDggaXMgbm90IHNldAogIyBDT05GSUdfQkY1NDkgaXMgbm90IHNldAogIyBDT05GSUdfQkY1NjEgaXMgbm90IHNldAorQ09ORklHX0JGX1JFVl9NSU49MworQ09ORklHX0JGX1JFVl9NQVg9NgogIyBDT05GSUdfQkZfUkVWXzBfMCBpcyBub3Qgc2V0CiAjIENPTkZJR19CRl9SRVZfMF8xIGlzIG5vdCBzZXQKICMgQ09ORklHX0JGX1JFVl8wXzIgaXMgbm90IHNldAogQ09ORklHX0JGX1JFVl8wXzM9eQogIyBDT05GSUdfQkZfUkVWXzBfNCBpcyBub3Qgc2V0CiAjIENPTkZJR19CRl9SRVZfMF81IGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGX1JFVl8wXzYgaXMgbm90IHNldAogIyBDT05GSUdfQkZfUkVWX0FOWSBpcyBub3Qgc2V0CiAjIENPTkZJR19CRl9SRVZfTk9ORSBpcyBub3Qgc2V0CiBDT05GSUdfQkY1M3g9eQogQ09ORklHX01FTV9NVDQ4TEMxNk0xNkEyVEdfNzU9eQogQ09ORklHX0JGSU41MzNfRVpLSVQ9eQogIyBDT05GSUdfQkZJTjUzM19TVEFNUCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEFDS1NUQU1QIGlzIG5vdCBzZXQKICMgQ09ORklHX0JGSU41MzNfQkxVRVRFQ0hOSVhfQ00gaXMgbm90IHNldAogIyBDT05GSUdfSDg2MDZfSFZTSVNURU1BUyBpcyBub3Qgc2V0CiAjIENPTkZJR19CRklONTMyX0lQMFggaXMgbm90IHNldApAQCAtMTg3LDcgKzIwNiw2IEBACiAjCiBDT05GSUdfQ0xLSU5fSFo9MjcwMDAwMDAKICMgQ09ORklHX0JGSU5fS0VSTkVMX0NMT0NLIGlzIG5vdCBzZXQKLUNPTkZJR19NQVhfTUVNX1NJWkU9NTEyCiBDT05GSUdfTUFYX1ZDT19IWj03NTAwMDAwMDAKIENPTkZJR19NSU5fVkNPX0haPTUwMDAwMDAwCiBDT05GSUdfTUFYX1NDTEtfSFo9MTMzMzMzMzMzCkBAIC0yMDEsNiArMjE5LDcgQEAKICMgQ09ORklHX0haXzMwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19IWl8xMDAwIGlzIG5vdCBzZXQKIENPTkZJR19IWj0yNTAKK0NPTkZJR19TQ0hFRF9IUlRJQ0s9eQogQ09ORklHX0dFTkVSSUNfVElNRT15CiBDT05GSUdfR0VORVJJQ19DTE9DS0VWRU5UUz15CiAjIENPTkZJR19DWUNMRVNfQ0xPQ0tTT1VSQ0UgaXMgbm90IHNldApAQCAtMjM4LDYgKzI1NywxMiBAQAogQ09ORklHX0NBQ0hFTElORV9BTElHTkVEX0wxPXkKICMgQ09ORklHX1NZU0NBTExfVEFCX0wxIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQTEJfU1dJVENIX1RBQl9MMSBpcyBub3Qgc2V0CitDT05GSUdfQVBQX1NUQUNLX0wxPXkKKworIworIyBTcGVlZCBPcHRpbWl6YXRpb25zCisjCitDT05GSUdfQkZJTl9JTlNfTE9XT1ZFUkhFQUQ9eQogQ09ORklHX1JBTUtFUk5FTD15CiAjIENPTkZJR19ST01LRVJORUwgaXMgbm90IHNldAogQ09ORklHX1NFTEVDVF9NRU1PUllfTU9ERUw9eQpAQCAtMjQ2LDE0ICsyNzEsMTMgQEAKICMgQ09ORklHX1NQQVJTRU1FTV9NQU5VQUwgaXMgbm90IHNldAogQ09ORklHX0ZMQVRNRU09eQogQ09ORklHX0ZMQVRfTk9ERV9NRU1fTUFQPXkKLSMgQ09ORklHX1NQQVJTRU1FTV9TVEFUSUMgaXMgbm90IHNldAotIyBDT05GSUdfU1BBUlNFTUVNX1ZNRU1NQVBfRU5BQkxFIGlzIG5vdCBzZXQKK0NPTkZJR19QQUdFRkxBR1NfRVhURU5ERUQ9eQogQ09ORklHX1NQTElUX1BUTE9DS19DUFVTPTQKICMgQ09ORklHX1JFU09VUkNFU182NEJJVCBpcyBub3Qgc2V0CisjIENPTkZJR19QSFlTX0FERFJfVF82NEJJVCBpcyBub3Qgc2V0CiBDT05GSUdfWk9ORV9ETUFfRkxBRz0xCiBDT05GSUdfVklSVF9UT19CVVM9eQogIyBDT05GSUdfQkZJTl9HUFRJTUVSUyBpcyBub3Qgc2V0Ci1DT05GSUdfQkZJTl9ETUFfNVhYPXkKICMgQ09ORklHX0RNQV9VTkNBQ0hFRF80TSBpcyBub3Qgc2V0CiAjIENPTkZJR19ETUFfVU5DQUNIRURfMk0gaXMgbm90IHNldAogQ09ORklHX0RNQV9VTkNBQ0hFRF8xTT15CkBAIC0yNjgsNyArMjkyLDYgQEAKICMgQ09ORklHX0JGSU5fSUNBQ0hFX0xPQ0sgaXMgbm90IHNldAogIyBDT05GSUdfQkZJTl9XQiBpcyBub3Qgc2V0CiBDT05GSUdfQkZJTl9XVD15Ci1DT05GSUdfTDFfTUFYX1BJRUNFPTE2CiAjIENPTkZJR19NUFUgaXMgbm90IHNldAogCiAjCkBAIC0yOTcsNyArMzIwLDYgQEAKICMKICMgQnVzIG9wdGlvbnMgKFBDSSwgUENNQ0lBLCBFSVNBLCBNQ0EsIElTQSkKICMKLSMgQ09ORklHX1BDSSBpcyBub3Qgc2V0CiAjIENPTkZJR19BUkNIX1NVUFBPUlRTX01TSSBpcyBub3Qgc2V0CiAjIENPTkZJR19QQ0NBUkQgaXMgbm90IHNldAogCkBAIC0zMDgsMjkgKzMzMCwzMCBAQAogQ09ORklHX0JJTkZNVF9GTEFUPXkKIENPTkZJR19CSU5GTVRfWkZMQVQ9eQogIyBDT05GSUdfQklORk1UX1NIQVJFRF9GTEFUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hBVkVfQU9VVCBpcyBub3Qgc2V0CiAjIENPTkZJR19CSU5GTVRfTUlTQyBpcyBub3Qgc2V0CiAKICMKICMgUG93ZXIgbWFuYWdlbWVudCBvcHRpb25zCiAjCiBDT05GSUdfUE09eQotIyBDT05GSUdfUE1fTEVHQUNZIGlzIG5vdCBzZXQKICMgQ09ORklHX1BNX0RFQlVHIGlzIG5vdCBzZXQKIENPTkZJR19QTV9TTEVFUD15Ci1DT05GSUdfU1VTUEVORF9VUF9QT1NTSUJMRT15CiBDT05GSUdfU1VTUEVORD15CitDT05GSUdfU1VTUEVORF9GUkVFWkVSPXkKK0NPTkZJR19BUkNIX1NVU1BFTkRfUE9TU0lCTEU9eQogQ09ORklHX1BNX0JGSU5fU0xFRVBfREVFUEVSPXkKICMgQ09ORklHX1BNX0JGSU5fU0xFRVAgaXMgbm90IHNldAogIyBDT05GSUdfUE1fV0FLRVVQX0JZX0dQSU8gaXMgbm90IHNldAogCiAjCisjIFBvc3NpYmxlIFN1c3BlbmQgTWVtIC8gSGliZXJuYXRlIFdha2UtVXAgU291cmNlcworIworCisjCiAjIENQVSBGcmVxdWVuY3kgc2NhbGluZwogIwogIyBDT05GSUdfQ1BVX0ZSRVEgaXMgbm90IHNldAotCi0jCi0jIE5ldHdvcmtpbmcKLSMKIENPTkZJR19ORVQ9eQogCiAjCkBAIC0zNDMsNiArMzY2LDcgQEAKICMgQ09ORklHX1hGUk1fVVNFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19YRlJNX1NVQl9QT0xJQ1kgaXMgbm90IHNldAogIyBDT05GSUdfWEZSTV9NSUdSQVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1hGUk1fU1RBVElTVElDUyBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRfS0VZIGlzIG5vdCBzZXQKIENPTkZJR19JTkVUPXkKICMgQ09ORklHX0lQX01VTFRJQ0FTVCBpcyBub3Qgc2V0CkBAIC0zNzIsOCArMzk2LDYgQEAKIENPTkZJR19ERUZBVUxUX1RDUF9DT05HPSJjdWJpYyIKICMgQ09ORklHX1RDUF9NRDVTSUcgaXMgbm90IHNldAogIyBDT05GSUdfSVBWNiBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTkVUNl9YRlJNX1RVTk5FTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTkVUNl9UVU5ORUwgaXMgbm90IHNldAogIyBDT05GSUdfTkVUTEFCRUwgaXMgbm90IHNldAogIyBDT05GSUdfTkVUV09SS19TRUNNQVJLIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVEZJTFRFUiBpcyBub3Qgc2V0CkBAIC0zODIsNiArNDA0LDcgQEAKICMgQ09ORklHX1RJUEMgaXMgbm90IHNldAogIyBDT05GSUdfQVRNIGlzIG5vdCBzZXQKICMgQ09ORklHX0JSSURHRSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfRFNBIGlzIG5vdCBzZXQKICMgQ09ORklHX1ZMQU5fODAyMVEgaXMgbm90IHNldAogIyBDT05GSUdfREVDTkVUIGlzIG5vdCBzZXQKICMgQ09ORklHX0xMQzIgaXMgbm90IHNldApAQCAtMzk4LDYgKzQyMSw3IEBACiAjCiAjIENPTkZJR19ORVRfUEtUR0VOIGlzIG5vdCBzZXQKICMgQ09ORklHX0hBTVJBRElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NBTiBpcyBub3Qgc2V0CiBDT05GSUdfSVJEQT1tCiAKICMKQEAgLTQzMCwyNCArNDU0LDE0IEBACiAjIENPTkZJR19ET05HTEUgaXMgbm90IHNldAogCiAjCi0jIE9sZCBTSVIgZGV2aWNlIGRyaXZlcnMKLSMKLSMgQ09ORklHX0lSUE9SVF9TSVIgaXMgbm90IHNldAotCi0jCi0jIE9sZCBTZXJpYWwgZG9uZ2xlIHN1cHBvcnQKLSMKLQotIwogIyBGSVIgZGV2aWNlIGRyaXZlcnMKICMKICMgQ09ORklHX0JUIGlzIG5vdCBzZXQKICMgQ09ORklHX0FGX1JYUlBDIGlzIG5vdCBzZXQKLQotIwotIyBXaXJlbGVzcwotIworIyBDT05GSUdfUEhPTkVUIGlzIG5vdCBzZXQKK0NPTkZJR19XSVJFTEVTUz15CiAjIENPTkZJR19DRkc4MDIxMSBpcyBub3Qgc2V0CitDT05GSUdfV0lSRUxFU1NfT0xEX1JFR1VMQVRPUlk9eQogIyBDT05GSUdfV0lSRUxFU1NfRVhUIGlzIG5vdCBzZXQKICMgQ09ORklHX01BQzgwMjExIGlzIG5vdCBzZXQKICMgQ09ORklHX0lFRUU4MDIxMSBpcyBub3Qgc2V0CkBAIC00NjUsNiArNDc5LDggQEAKIENPTkZJR19TVEFOREFMT05FPXkKIENPTkZJR19QUkVWRU5UX0ZJUk1XQVJFX0JVSUxEPXkKICMgQ09ORklHX0ZXX0xPQURFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19EUklWRVIgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfREVWUkVTIGlzIG5vdCBzZXQKICMgQ09ORklHX1NZU19IWVBFUlZJU09SIGlzIG5vdCBzZXQKICMgQ09ORklHX0NPTk5FQ1RPUiBpcyBub3Qgc2V0CiBDT05GSUdfTVREPXkKQEAgLTQ3Myw2ICs0ODksNyBAQAogQ09ORklHX01URF9QQVJUSVRJT05TPXkKICMgQ09ORklHX01URF9SRURCT09UX1BBUlRTIGlzIG5vdCBzZXQKICMgQ09ORklHX01URF9DTURMSU5FX1BBUlRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9BUjdfUEFSVFMgaXMgbm90IHNldAogCiAjCiAjIFVzZXIgTW9kdWxlcyBBbmQgVHJhbnNsYXRpb24gTGF5ZXJzCkBAIC01MTYsNiArNTMzLDcgQEAKICMKIENPTkZJR19NVERfQ09NUExFWF9NQVBQSU5HUz15CiAjIENPTkZJR19NVERfUEhZU01BUCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfR1BJT19BRERSIGlzIG5vdCBzZXQKICMgQ09ORklHX01URF9VQ0xJTlVYIGlzIG5vdCBzZXQKICMgQ09ORklHX01URF9QTEFUUkFNIGlzIG5vdCBzZXQKIApAQCAtNTUwLDExICs1NjgsMTQgQEAKIENPTkZJR19CTEtfREVWX1JBTT15CiBDT05GSUdfQkxLX0RFVl9SQU1fQ09VTlQ9MTYKIENPTkZJR19CTEtfREVWX1JBTV9TSVpFPTQwOTYKLUNPTkZJR19CTEtfREVWX1JBTV9CTE9DS1NJWkU9MTAyNAorIyBDT05GSUdfQkxLX0RFVl9YSVAgaXMgbm90IHNldAogIyBDT05GSUdfQ0RST01fUEtUQ0RWRCBpcyBub3Qgc2V0CiAjIENPTkZJR19BVEFfT1ZFUl9FVEggaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9IRCBpcyBub3Qgc2V0CiBDT05GSUdfTUlTQ19ERVZJQ0VTPXkKICMgQ09ORklHX0VFUFJPTV85M0NYNiBpcyBub3Qgc2V0CisjIENPTkZJR19FTkNMT1NVUkVfU0VSVklDRVMgaXMgbm90IHNldAorQ09ORklHX0hBVkVfSURFPXkKICMgQ09ORklHX0lERSBpcyBub3Qgc2V0CiAKICMKQEAgLTU2Nyw3ICs1ODgsNiBAQAogIyBDT05GSUdfQVRBIGlzIG5vdCBzZXQKICMgQ09ORklHX01EIGlzIG5vdCBzZXQKIENPTkZJR19ORVRERVZJQ0VTPXkKLSMgQ09ORklHX05FVERFVklDRVNfTVVMVElRVUVVRSBpcyBub3Qgc2V0CiAjIENPTkZJR19EVU1NWSBpcyBub3Qgc2V0CiAjIENPTkZJR19CT05ESU5HIGlzIG5vdCBzZXQKICMgQ09ORklHX01BQ1ZMQU4gaXMgbm90IHNldApAQCAtNTgwLDExICs2MDAsMTQgQEAKIENPTkZJR19TTUM5MVg9eQogIyBDT05GSUdfU01TQzkxMVggaXMgbm90IHNldAogIyBDT05GSUdfRE05MDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VOQzI4SjYwIGlzIG5vdCBzZXQKICMgQ09ORklHX0lCTV9ORVdfRU1BQ19aTUlJIGlzIG5vdCBzZXQKICMgQ09ORklHX0lCTV9ORVdfRU1BQ19SR01JSSBpcyBub3Qgc2V0CiAjIENPTkZJR19JQk1fTkVXX0VNQUNfVEFIIGlzIG5vdCBzZXQKICMgQ09ORklHX0lCTV9ORVdfRU1BQ19FTUFDNCBpcyBub3Qgc2V0Ci0jIENPTkZJR19CNDQgaXMgbm90IHNldAorIyBDT05GSUdfSUJNX05FV19FTUFDX05PX0ZMT1dfQ1RSTCBpcyBub3Qgc2V0CisjIENPTkZJR19JQk1fTkVXX0VNQUNfTUFMX0NMUl9JQ0lOVFNUQVQgaXMgbm90IHNldAorIyBDT05GSUdfSUJNX05FV19FTUFDX01BTF9DT01NT05fRVJSIGlzIG5vdCBzZXQKIENPTkZJR19ORVRERVZfMTAwMD15CiAjIENPTkZJR19BWDg4MTgwIGlzIG5vdCBzZXQKIENPTkZJR19ORVRERVZfMTAwMDA9eQpAQCAtNTk0LDEwICs2MTcsMTAgQEAKICMKICMgQ09ORklHX1dMQU5fUFJFODAyMTEgaXMgbm90IHNldAogIyBDT05GSUdfV0xBTl84MDIxMSBpcyBub3Qgc2V0CisjIENPTkZJR19JV0xXSUZJX0xFRFMgaXMgbm90IHNldAogIyBDT05GSUdfV0FOIGlzIG5vdCBzZXQKICMgQ09ORklHX1BQUCBpcyBub3Qgc2V0CiAjIENPTkZJR19TTElQIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIQVBFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRDT05TT0xFIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVFBPTEwgaXMgbm90IHNldAogIyBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUiBpcyBub3Qgc2V0CkBAIC02NDUsOCArNjY4LDExIEBACiAjIENPTkZJR19CRjV4eF9QUEkgaXMgbm90IHNldAogQ09ORklHX0JGSU5fU1BPUlQ9eQogIyBDT05GSUdfQkZJTl9USU1FUl9MQVRFTkNZIGlzIG5vdCBzZXQKK0NPTkZJR19CRklOX0RNQV9JTlRFUkZBQ0U9bQogQ09ORklHX1NJTVBMRV9HUElPPW0KICMgQ09ORklHX1ZUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFVktNRU0gaXMgbm90IHNldAorIyBDT05GSUdfQkZJTl9KVEFHX0NPTU0gaXMgbm90IHNldAogIyBDT05GSUdfU0VSSUFMX05PTlNUQU5EQVJEIGlzIG5vdCBzZXQKIAogIwpAQCAtNjc1LDIyICs3MDEsMTkgQEAKICMgQ09ORklHX0NBTjRMSU5VWCBpcyBub3Qgc2V0CiAjIENPTkZJR19JUE1JX0hBTkRMRVIgaXMgbm90IHNldAogIyBDT05GSUdfSFdfUkFORE9NIGlzIG5vdCBzZXQKLSMgQ09ORklHX0dFTl9SVEMgaXMgbm90IHNldAogIyBDT05GSUdfUjM5NjQgaXMgbm90IHNldAogIyBDT05GSUdfUkFXX0RSSVZFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19UQ0dfVFBNIGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQyBpcyBub3Qgc2V0Ci0KLSMKLSMgU1BJIHN1cHBvcnQKLSMKIENPTkZJR19TUEk9eQorIyBDT05GSUdfU1BJX0RFQlVHIGlzIG5vdCBzZXQKIENPTkZJR19TUElfTUFTVEVSPXkKIAogIwogIyBTUEkgTWFzdGVyIENvbnRyb2xsZXIgRHJpdmVycwogIwogQ09ORklHX1NQSV9CRklOPXkKKyMgQ09ORklHX1NQSV9CRklOX0xPQ0sgaXMgbm90IHNldAogIyBDT05GSUdfU1BJX0JJVEJBTkcgaXMgbm90IHNldAogCiAjCkBAIC02OTksMTQgKzcyMiwxOCBAQAogIyBDT05GSUdfU1BJX0FUMjUgaXMgbm90IHNldAogIyBDT05GSUdfU1BJX1NQSURFViBpcyBub3Qgc2V0CiAjIENPTkZJR19TUElfVExFNjJYMCBpcyBub3Qgc2V0CitDT05GSUdfQVJDSF9XQU5UX09QVElPTkFMX0dQSU9MSUI9eQorIyBDT05GSUdfR1BJT0xJQiBpcyBub3Qgc2V0CiAjIENPTkZJR19XMSBpcyBub3Qgc2V0CiAjIENPTkZJR19QT1dFUl9TVVBQTFkgaXMgbm90IHNldAogQ09ORklHX0hXTU9OPXkKICMgQ09ORklHX0hXTU9OX1ZJRCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FEQ1hYIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfRjcxODA1RiBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0Y3MTg4MkZHIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfSVQ4NyBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0xNNzAgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19NQVgxMTExIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfUEM4NzM2MCBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1BDODc0MjcgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19TTVNDNDdNMSBpcyBub3Qgc2V0CkBAIC03MTUsNiArNzQyLDggQEAKICMgQ09ORklHX1NFTlNPUlNfVzgzNjI3SEYgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19XODM2MjdFSEYgaXMgbm90IHNldAogIyBDT05GSUdfSFdNT05fREVCVUdfQ0hJUCBpcyBub3Qgc2V0CisjIENPTkZJR19USEVSTUFMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RIRVJNQUxfSFdNT04gaXMgbm90IHNldAogQ09ORklHX1dBVENIRE9HPXkKICMgQ09ORklHX1dBVENIRE9HX05PV0FZT1VUIGlzIG5vdCBzZXQKIApAQCAtNzI1LDIxICs3NTQsMjggQEAKIENPTkZJR19CRklOX1dEVD15CiAKICMKLSMgU29uaWNzIFNpbGljb24gQmFja3BsYW5lCi0jCi1DT05GSUdfU1NCX1BPU1NJQkxFPXkKLSMgQ09ORklHX1NTQiBpcyBub3Qgc2V0Ci0KLSMKICMgTXVsdGlmdW5jdGlvbiBkZXZpY2UgZHJpdmVycwogIworIyBDT05GSUdfTUZEX0NPUkUgaXMgbm90IHNldAogIyBDT05GSUdfTUZEX1NNNTAxIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hUQ19QQVNJQzMgaXMgbm90IHNldAorIyBDT05GSUdfTUZEX1RNSU8gaXMgbm90IHNldAorIyBDT05GSUdfTUZEX1dNODQwMCBpcyBub3Qgc2V0CiAKICMKICMgTXVsdGltZWRpYSBkZXZpY2VzCiAjCisKKyMKKyMgTXVsdGltZWRpYSBjb3JlIHN1cHBvcnQKKyMKICMgQ09ORklHX1ZJREVPX0RFViBpcyBub3Qgc2V0CiAjIENPTkZJR19EVkJfQ09SRSBpcyBub3Qgc2V0CisjIENPTkZJR19WSURFT19NRURJQSBpcyBub3Qgc2V0CisKKyMKKyMgTXVsdGltZWRpYSBkcml2ZXJzCisjCiAjIENPTkZJR19EQUIgaXMgbm90IHNldAogCiAjCkBAIC03NTQsMTggKzc5MCwyMiBAQAogIyBEaXNwbGF5IGRldmljZSBzdXBwb3J0CiAjCiAjIENPTkZJR19ESVNQTEFZX1NVUFBPUlQgaXMgbm90IHNldAotCi0jCi0jIFNvdW5kCi0jCiAjIENPTkZJR19TT1VORCBpcyBub3Qgc2V0CiBDT05GSUdfSElEX1NVUFBPUlQ9eQogQ09ORklHX0hJRD1tCiAjIENPTkZJR19ISURfREVCVUcgaXMgbm90IHNldAogIyBDT05GSUdfSElEUkFXIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hJRF9QSUQgaXMgbm90IHNldAorCisjCisjIFNwZWNpYWwgSElEIGRyaXZlcnMKKyMKK0NPTkZJR19ISURfQ09NUEFUPXkKICMgQ09ORklHX1VTQl9TVVBQT1JUIGlzIG5vdCBzZXQKICMgQ09ORklHX01NQyBpcyBub3Qgc2V0CisjIENPTkZJR19NRU1TVElDSyBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVdfTEVEUyBpcyBub3Qgc2V0CisjIENPTkZJR19BQ0NFU1NJQklMSVRZIGlzIG5vdCBzZXQKIENPTkZJR19SVENfTElCPXkKIENPTkZJR19SVENfQ0xBU1M9eQogQ09ORklHX1JUQ19IQ1RPU1lTPXkKQEAgLTc4NCw0NyArODI0LDUxIEBACiAjCiAjIFNQSSBSVEMgZHJpdmVycwogIwotIyBDT05GSUdfUlRDX0RSVl9SUzVDMzQ4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfTTQxVDk0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfRFMxMzA1IGlzIG5vdCBzZXQKICMgQ09ORklHX1JUQ19EUlZfTUFYNjkwMiBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX1I5NzAxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfUlM1QzM0OCBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX0RTMzIzNCBpcyBub3Qgc2V0CiAKICMKICMgUGxhdGZvcm0gUlRDIGRyaXZlcnMKICMKKyMgQ09ORklHX1JUQ19EUlZfRFMxMjg2IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfRFMxNTExIGlzIG5vdCBzZXQKICMgQ09ORklHX1JUQ19EUlZfRFMxNTUzIGlzIG5vdCBzZXQKLSMgQ09ORklHX1JUQ19EUlZfU1RLMTdUQTggaXMgbm90IHNldAogIyBDT05GSUdfUlRDX0RSVl9EUzE3NDIgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9TVEsxN1RBOCBpcyBub3Qgc2V0CiAjIENPTkZJR19SVENfRFJWX000OFQ4NiBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX000OFQzNSBpcyBub3Qgc2V0CiAjIENPTkZJR19SVENfRFJWX000OFQ1OSBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX0JRNDgwMiBpcyBub3Qgc2V0CiAjIENPTkZJR19SVENfRFJWX1YzMDIwIGlzIG5vdCBzZXQKIAogIwogIyBvbi1DUFUgUlRDIGRyaXZlcnMKICMKIENPTkZJR19SVENfRFJWX0JGSU49eQotCi0jCi0jIFVzZXJzcGFjZSBJL08KLSMKKyMgQ09ORklHX0RNQURFVklDRVMgaXMgbm90IHNldAogIyBDT05GSUdfVUlPIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NUQUdJTkcgaXMgbm90IHNldAogCiAjCiAjIEZpbGUgc3lzdGVtcwogIwogIyBDT05GSUdfRVhUMl9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19FWFQzX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0VYVDRERVZfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRVhUNF9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19SRUlTRVJGU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19KRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfRlNfUE9TSVhfQUNMIGlzIG5vdCBzZXQKK0NPTkZJR19GSUxFX0xPQ0tJTkc9eQogIyBDT05GSUdfWEZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0dGUzJfRlMgaXMgbm90IHNldAogIyBDT05GSUdfT0NGUzJfRlMgaXMgbm90IHNldAotIyBDT05GSUdfTUlOSVhfRlMgaXMgbm90IHNldAotIyBDT05GSUdfUk9NRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRE5PVElGWSBpcyBub3Qgc2V0CiBDT05GSUdfSU5PVElGWT15CiBDT05GSUdfSU5PVElGWV9VU0VSPXkKICMgQ09ORklHX1FVT1RBIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ROT1RJRlkgaXMgbm90IHNldAogIyBDT05GSUdfQVVUT0ZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0FVVE9GUzRfRlMgaXMgbm90IHNldAogIyBDT05GSUdfRlVTRV9GUyBpcyBub3Qgc2V0CkBAIC04NjQsMTEgKzkwOCwxMSBAQAogIyBDT05GSUdfRUZTX0ZTIGlzIG5vdCBzZXQKIENPTkZJR19ZQUZGU19GUz1tCiBDT05GSUdfWUFGRlNfWUFGRlMxPXkKKyMgQ09ORklHX1lBRkZTXzlCWVRFX1RBR1MgaXMgbm90IHNldAogIyBDT05GSUdfWUFGRlNfRE9FU19FQ0MgaXMgbm90IHNldAogQ09ORklHX1lBRkZTX1lBRkZTMj15CiBDT05GSUdfWUFGRlNfQVVUT19ZQUZGUzI9eQogIyBDT05GSUdfWUFGRlNfRElTQUJMRV9MQVpZX0xPQUQgaXMgbm90IHNldAotQ09ORklHX1lBRkZTX0NIRUNLUE9JTlRfUkVTRVJWRURfQkxPQ0tTPTEwCiAjIENPTkZJR19ZQUZGU19ESVNBQkxFX1dJREVfVE5PREVTIGlzIG5vdCBzZXQKICMgQ09ORklHX1lBRkZTX0FMV0FZU19DSEVDS19DSFVOS19FUkFTRUQgaXMgbm90IHNldAogQ09ORklHX1lBRkZTX1NIT1JUX05BTUVTX0lOX1JBTT15CkBAIC04ODUsOCArOTI5LDExIEBACiAjIENPTkZJR19KRkZTMl9SVUJJTiBpcyBub3Qgc2V0CiAjIENPTkZJR19DUkFNRlMgaXMgbm90IHNldAogIyBDT05GSUdfVlhGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19NSU5JWF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19PTUZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0hQRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfUU5YNEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JPTUZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1NZU1ZfRlMgaXMgbm90IHNldAogIyBDT05GSUdfVUZTX0ZTIGlzIG5vdCBzZXQKIENPTkZJR19ORVRXT1JLX0ZJTEVTWVNURU1TPXkKQEAgLTg5NCwxMyArOTQxLDEyIEBACiBDT05GSUdfTkZTX1YzPXkKICMgQ09ORklHX05GU19WM19BQ0wgaXMgbm90IHNldAogIyBDT05GSUdfTkZTX1Y0IGlzIG5vdCBzZXQKLSMgQ09ORklHX05GU19ESVJFQ1RJTyBpcyBub3Qgc2V0CiAjIENPTkZJR19ORlNEIGlzIG5vdCBzZXQKIENPTkZJR19MT0NLRD1tCiBDT05GSUdfTE9DS0RfVjQ9eQogQ09ORklHX05GU19DT01NT049eQogQ09ORklHX1NVTlJQQz1tCi0jIENPTkZJR19TVU5SUENfQklORDM0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NVTlJQQ19SRUdJU1RFUl9WNCBpcyBub3Qgc2V0CiAjIENPTkZJR19SUENTRUNfR1NTX0tSQjUgaXMgbm90IHNldAogIyBDT05GSUdfUlBDU0VDX0dTU19TUEtNMyBpcyBub3Qgc2V0CiBDT05GSUdfU01CX0ZTPW0KQEAgLTk1Niw5ICsxMDAyLDYgQEAKICMgQ09ORklHX05MU19LT0k4X1UgaXMgbm90IHNldAogIyBDT05GSUdfTkxTX1VURjggaXMgbm90IHNldAogIyBDT05GSUdfRExNIGlzIG5vdCBzZXQKLUNPTkZJR19JTlNUUlVNRU5UQVRJT049eQotIyBDT05GSUdfUFJPRklMSU5HIGlzIG5vdCBzZXQKLSMgQ09ORklHX01BUktFUlMgaXMgbm90IHNldAogCiAjCiAjIEtlcm5lbCBoYWNraW5nCkBAIC05NjYsMTQgKzEwMDksNTMgQEAKICMgQ09ORklHX1BSSU5US19USU1FIGlzIG5vdCBzZXQKIENPTkZJR19FTkFCTEVfV0FSTl9ERVBSRUNBVEVEPXkKIENPTkZJR19FTkFCTEVfTVVTVF9DSEVDSz15CitDT05GSUdfRlJBTUVfV0FSTj0xMDI0CiAjIENPTkZJR19NQUdJQ19TWVNSUSBpcyBub3Qgc2V0CiAjIENPTkZJR19VTlVTRURfU1lNQk9MUyBpcyBub3Qgc2V0CiBDT05GSUdfREVCVUdfRlM9eQogIyBDT05GSUdfSEVBREVSU19DSEVDSyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUJVR19LRVJORUwgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX0tFUk5FTD15CisjIENPTkZJR19ERUJVR19TSElSUSBpcyBub3Qgc2V0CitDT05GSUdfREVURUNUX1NPRlRMT0NLVVA9eQorIyBDT05GSUdfQk9PVFBBUkFNX1NPRlRMT0NLVVBfUEFOSUMgaXMgbm90IHNldAorQ09ORklHX0JPT1RQQVJBTV9TT0ZUTE9DS1VQX1BBTklDX1ZBTFVFPTAKK0NPTkZJR19TQ0hFRF9ERUJVRz15CisjIENPTkZJR19TQ0hFRFNUQVRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RJTUVSX1NUQVRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX09CSkVDVFMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU0xBQiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19SVF9NVVRFWEVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUX01VVEVYX1RFU1RFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TUElOTE9DSyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19NVVRFWEVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NQSU5MT0NLX1NMRUVQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0xPQ0tJTkdfQVBJX1NFTEZURVNUUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19LT0JKRUNUIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX0JVR1ZFUkJPU0UgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX0lORk89eQorIyBDT05GSUdfREVCVUdfVk0gaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfV1JJVEVDT1VOVCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19NRU1PUllfSU5JVCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19MSVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZSQU1FX1BPSU5URVIgaXMgbm90IHNldAorIyBDT05GSUdfQk9PVF9QUklOVEtfREVMQVkgaXMgbm90IHNldAorIyBDT05GSUdfUkNVX1RPUlRVUkVfVEVTVCBpcyBub3Qgc2V0CisjIENPTkZJR19SQ1VfQ1BVX1NUQUxMX0RFVEVDVE9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JBQ0tUUkFDRV9TRUxGX1RFU1QgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfQkxPQ0tfRVhUX0RFVlQgaXMgbm90IHNldAorIyBDT05GSUdfRkFVTFRfSU5KRUNUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZU0NUTF9TWVNDQUxMX0NIRUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RZTkFNSUNfUFJJTlRLX0RFQlVHIGlzIG5vdCBzZXQKICMgQ09ORklHX1NBTVBMRVMgaXMgbm90IHNldAorQ09ORklHX0hBVkVfQVJDSF9LR0RCPXkKKyMgQ09ORklHX0tHREIgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU1RBQ0tPVkVSRkxPVyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TVEFDS19VU0FHRSBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfVkVSQk9TRT15CiBDT05GSUdfREVCVUdfTU1SUz15CisjIENPTkZJR19ERUJVR19IV0VSUiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19ET1VCTEVGQVVMVCBpcyBub3Qgc2V0CiBDT05GSUdfREVCVUdfSFVOVF9GT1JfWkVSTz15CiBDT05GSUdfREVCVUdfQkZJTl9IV1RSQUNFX09OPXkKIENPTkZJR19ERUJVR19CRklOX0hXVFJBQ0VfQ09NUFJFU1NJT05fT0ZGPXkKQEAgLTk5MSw5ICsxMDczLDk0IEBACiAjCiAjIENPTkZJR19LRVlTIGlzIG5vdCBzZXQKIENPTkZJR19TRUNVUklUWT15CisjIENPTkZJR19TRUNVUklUWUZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFQ1VSSVRZX05FVFdPUksgaXMgbm90IHNldAotIyBDT05GSUdfU0VDVVJJVFlfQ0FQQUJJTElUSUVTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUTyBpcyBub3Qgc2V0CisjIENPTkZJR19TRUNVUklUWV9GSUxFX0NBUEFCSUxJVElFUyBpcyBub3Qgc2V0CitDT05GSUdfU0VDVVJJVFlfREVGQVVMVF9NTUFQX01JTl9BRERSPTAKK0NPTkZJR19DUllQVE89eQorCisjCisjIENyeXB0byBjb3JlIG9yIGhlbHBlcgorIworIyBDT05GSUdfQ1JZUFRPX0ZJUFMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX01BTkFHRVIgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0dGMTI4TVVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19OVUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19DUllQVEQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0FVVEhFTkMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1RFU1QgaXMgbm90IHNldAorCisjCisjIEF1dGhlbnRpY2F0ZWQgRW5jcnlwdGlvbiB3aXRoIEFzc29jaWF0ZWQgRGF0YQorIworIyBDT05GSUdfQ1JZUFRPX0NDTSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fR0NNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TRVFJViBpcyBub3Qgc2V0CisKKyMKKyMgQmxvY2sgbW9kZXMKKyMKKyMgQ09ORklHX0NSWVBUT19DQkMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0NUUiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQ1RTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19FQ0IgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0xSVyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fUENCQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fWFRTIGlzIG5vdCBzZXQKKworIworIyBIYXNoIG1vZGVzCisjCisjIENPTkZJR19DUllQVE9fSE1BQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fWENCQyBpcyBub3Qgc2V0CisKKyMKKyMgRGlnZXN0CisjCisjIENPTkZJR19DUllQVE9fQ1JDMzJDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19NRDQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX01ENSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fTUlDSEFFTF9NSUMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1JNRDEyOCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fUk1EMTYwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19STUQyNTYgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1JNRDMyMCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0hBMSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0hBMjU2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TSEE1MTIgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1RHUjE5MiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fV1A1MTIgaXMgbm90IHNldAorCisjCisjIENpcGhlcnMKKyMKKyMgQ09ORklHX0NSWVBUT19BRVMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0FOVUJJUyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQVJDNCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQkxPV0ZJU0ggaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0NBTUVMTElBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19DQVNUNSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQ0FTVDYgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0RFUyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fRkNSWVBUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19LSEFaQUQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1NBTFNBMjAgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1NFRUQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1NFUlBFTlQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1RFQSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fVFdPRklTSCBpcyBub3Qgc2V0CisKKyMKKyMgQ29tcHJlc3Npb24KKyMKKyMgQ09ORklHX0NSWVBUT19ERUZMQVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19MWk8gaXMgbm90IHNldAorCisjCisjIFJhbmRvbSBOdW1iZXIgR2VuZXJhdGlvbgorIworIyBDT05GSUdfQ1JZUFRPX0FOU0lfQ1BSTkcgaXMgbm90IHNldAorQ09ORklHX0NSWVBUT19IVz15CiAKICMKICMgTGlicmFyeSByb3V0aW5lcwpAQCAtMTAwMSw2ICsxMTY4LDcgQEAKIENPTkZJR19CSVRSRVZFUlNFPXkKIENPTkZJR19DUkNfQ0NJVFQ9bQogIyBDT05GSUdfQ1JDMTYgaXMgbm90IHNldAorIyBDT05GSUdfQ1JDX1QxMERJRiBpcyBub3Qgc2V0CiAjIENPTkZJR19DUkNfSVRVX1QgaXMgbm90IHNldAogQ09ORklHX0NSQzMyPXkKICMgQ09ORklHX0NSQzcgaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9jb25maWdzL0JGNTMzLVNUQU1QX2RlZmNvbmZpZyBiL2FyY2gvYmxhY2tmaW4vY29uZmlncy9CRjUzMy1TVEFNUF9kZWZjb25maWcKaW5kZXggYzIzMjY3ZS4uNDllYWJiNCAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9jb25maWdzL0JGNTMzLVNUQU1QX2RlZmNvbmZpZworKysgYi9hcmNoL2JsYWNrZmluL2NvbmZpZ3MvQkY1MzMtU1RBTVBfZGVmY29uZmlnCkBAIC0xLDYgKzEsNiBAQAogIwogIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAotIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjI0LjcKKyMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4yOC1yYzIKICMKICMgQ09ORklHX01NVSBpcyBub3Qgc2V0CiAjIENPTkZJR19GUFUgaXMgbm90IHNldApAQCAtOCw3ICs4LDYgQEAKICMgQ09ORklHX1JXU0VNX1hDSEdBRERfQUxHT1JJVEhNIGlzIG5vdCBzZXQKIENPTkZJR19CTEFDS0ZJTj15CiBDT05GSUdfWk9ORV9ETUE9eQotQ09ORklHX1NFTUFQSE9SRV9TTEVFUEVSUz15CiBDT05GSUdfR0VORVJJQ19GSU5EX05FWFRfQklUPXkKIENPTkZJR19HRU5FUklDX0hXRUlHSFQ9eQogQ09ORklHX0dFTkVSSUNfSEFSRElSUVM9eQpAQCAtMzEsMTggKzMwLDE2IEBACiAjIENPTkZJR19QT1NJWF9NUVVFVUUgaXMgbm90IHNldAogIyBDT05GSUdfQlNEX1BST0NFU1NfQUNDVCBpcyBub3Qgc2V0CiAjIENPTkZJR19UQVNLU1RBVFMgaXMgbm90IHNldAotIyBDT05GSUdfVVNFUl9OUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19QSURfTlMgaXMgbm90IHNldAogIyBDT05GSUdfQVVESVQgaXMgbm90IHNldAogQ09ORklHX0lLQ09ORklHPXkKIENPTkZJR19JS0NPTkZJR19QUk9DPXkKIENPTkZJR19MT0dfQlVGX1NISUZUPTE0CiAjIENPTkZJR19DR1JPVVBTIGlzIG5vdCBzZXQKLUNPTkZJR19GQUlSX0dST1VQX1NDSEVEPXkKLUNPTkZJR19GQUlSX1VTRVJfU0NIRUQ9eQotIyBDT05GSUdfRkFJUl9DR1JPVVBfU0NIRUQgaXMgbm90IHNldAotQ09ORklHX1NZU0ZTX0RFUFJFQ0FURUQ9eQorIyBDT05GSUdfR1JPVVBfU0NIRUQgaXMgbm90IHNldAorIyBDT05GSUdfU1lTRlNfREVQUkVDQVRFRCBpcyBub3Qgc2V0CisjIENPTkZJR19TWVNGU19ERVBSRUNBVEVEX1YyIGlzIG5vdCBzZXQKICMgQ09ORklHX1JFTEFZIGlzIG5vdCBzZXQKKyMgQ09ORklHX05BTUVTUEFDRVMgaXMgbm90IHNldAogQ09ORklHX0JMS19ERVZfSU5JVFJEPXkKIENPTkZJR19JTklUUkFNRlNfU09VUkNFPSIiCiAjIENPTkZJR19DQ19PUFRJTUlaRV9GT1JfU0laRSBpcyBub3Qgc2V0CkBAIC01MSwyNiArNDgsMzUgQEAKIENPTkZJR19VSUQxNj15CiBDT05GSUdfU1lTQ1RMX1NZU0NBTEw9eQogQ09ORklHX0tBTExTWU1TPXkKKyMgQ09ORklHX0tBTExTWU1TX0FMTCBpcyBub3Qgc2V0CiAjIENPTkZJR19LQUxMU1lNU19FWFRSQV9QQVNTIGlzIG5vdCBzZXQKIENPTkZJR19IT1RQTFVHPXkKIENPTkZJR19QUklOVEs9eQogQ09ORklHX0JVRz15Ci1DT05GSUdfRUxGX0NPUkU9eQorIyBDT05GSUdfRUxGX0NPUkUgaXMgbm90IHNldAorQ09ORklHX0NPTVBBVF9CUks9eQogQ09ORklHX0JBU0VfRlVMTD15CiBDT05GSUdfRlVURVg9eQogQ09ORklHX0FOT05fSU5PREVTPXkKIENPTkZJR19FUE9MTD15CiBDT05GSUdfU0lHTkFMRkQ9eQorQ09ORklHX1RJTUVSRkQ9eQogQ09ORklHX0VWRU5URkQ9eQorQ09ORklHX0FJTz15CiBDT05GSUdfVk1fRVZFTlRfQ09VTlRFUlM9eQogQ09ORklHX1NMQUI9eQogIyBDT05GSUdfU0xVQiBpcyBub3Qgc2V0CiAjIENPTkZJR19TTE9CIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BST0ZJTElORyBpcyBub3Qgc2V0CisjIENPTkZJR19NQVJLRVJTIGlzIG5vdCBzZXQKK0NPTkZJR19IQVZFX09QUk9GSUxFPXkKKyMgQ09ORklHX0hBVkVfR0VORVJJQ19ETUFfQ09IRVJFTlQgaXMgbm90IHNldAogQ09ORklHX1NMQUJJTkZPPXkKIENPTkZJR19SVF9NVVRFWEVTPXkKIENPTkZJR19USU5ZX1NITUVNPXkKIENPTkZJR19CQVNFX1NNQUxMPTAKIENPTkZJR19NT0RVTEVTPXkKKyMgQ09ORklHX01PRFVMRV9GT1JDRV9MT0FEIGlzIG5vdCBzZXQKIENPTkZJR19NT0RVTEVfVU5MT0FEPXkKICMgQ09ORklHX01PRFVMRV9GT1JDRV9VTkxPQUQgaXMgbm90IHNldAogIyBDT05GSUdfTU9EVkVSU0lPTlMgaXMgbm90IHNldApAQCAtODEsNiArODcsNyBAQAogIyBDT05GSUdfQkxLX0RFVl9JT19UUkFDRSBpcyBub3Qgc2V0CiAjIENPTkZJR19MU0YgaXMgbm90IHNldAogIyBDT05GSUdfQkxLX0RFVl9CU0cgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9JTlRFR1JJVFkgaXMgbm90IHNldAogCiAjCiAjIElPIFNjaGVkdWxlcnMKQEAgLTk0LDkgKzEwMSwxMSBAQAogIyBDT05GSUdfREVGQVVMVF9DRlEgaXMgbm90IHNldAogIyBDT05GSUdfREVGQVVMVF9OT09QIGlzIG5vdCBzZXQKIENPTkZJR19ERUZBVUxUX0lPU0NIRUQ9ImFudGljaXBhdG9yeSIKK0NPTkZJR19DTEFTU0lDX1JDVT15CiAjIENPTkZJR19QUkVFTVBUX05PTkUgaXMgbm90IHNldAogQ09ORklHX1BSRUVNUFRfVk9MVU5UQVJZPXkKICMgQ09ORklHX1BSRUVNUFQgaXMgbm90IHNldAorQ09ORklHX0ZSRUVaRVI9eQogCiAjCiAjIEJsYWNrZmluIFByb2Nlc3NvciBPcHRpb25zCkBAIC0xMDUsNiArMTE0LDEwIEBACiAjCiAjIFByb2Nlc3NvciBhbmQgQm9hcmQgU2V0dGluZ3MKICMKKyMgQ09ORklHX0JGNTEyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGNTE0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGNTE2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGNTE4IGlzIG5vdCBzZXQKICMgQ09ORklHX0JGNTIyIGlzIG5vdCBzZXQKICMgQ09ORklHX0JGNTIzIGlzIG5vdCBzZXQKICMgQ09ORklHX0JGNTI0IGlzIG5vdCBzZXQKQEAgLTExNywyNCArMTMwLDMwIEBACiAjIENPTkZJR19CRjUzNCBpcyBub3Qgc2V0CiAjIENPTkZJR19CRjUzNiBpcyBub3Qgc2V0CiAjIENPTkZJR19CRjUzNyBpcyBub3Qgc2V0CisjIENPTkZJR19CRjUzOCBpcyBub3Qgc2V0CisjIENPTkZJR19CRjUzOSBpcyBub3Qgc2V0CiAjIENPTkZJR19CRjU0MiBpcyBub3Qgc2V0CiAjIENPTkZJR19CRjU0NCBpcyBub3Qgc2V0CiAjIENPTkZJR19CRjU0NyBpcyBub3Qgc2V0CiAjIENPTkZJR19CRjU0OCBpcyBub3Qgc2V0CiAjIENPTkZJR19CRjU0OSBpcyBub3Qgc2V0CiAjIENPTkZJR19CRjU2MSBpcyBub3Qgc2V0CitDT05GSUdfQkZfUkVWX01JTj0zCitDT05GSUdfQkZfUkVWX01BWD02CiAjIENPTkZJR19CRl9SRVZfMF8wIGlzIG5vdCBzZXQKICMgQ09ORklHX0JGX1JFVl8wXzEgaXMgbm90IHNldAogIyBDT05GSUdfQkZfUkVWXzBfMiBpcyBub3Qgc2V0CiBDT05GSUdfQkZfUkVWXzBfMz15CiAjIENPTkZJR19CRl9SRVZfMF80IGlzIG5vdCBzZXQKICMgQ09ORklHX0JGX1JFVl8wXzUgaXMgbm90IHNldAorIyBDT05GSUdfQkZfUkVWXzBfNiBpcyBub3Qgc2V0CiAjIENPTkZJR19CRl9SRVZfQU5ZIGlzIG5vdCBzZXQKICMgQ09ORklHX0JGX1JFVl9OT05FIGlzIG5vdCBzZXQKIENPTkZJR19CRjUzeD15CiBDT05GSUdfTUVNX01UNDhMQzY0TTRBMkZCXzdFPXkKICMgQ09ORklHX0JGSU41MzNfRVpLSVQgaXMgbm90IHNldAogQ09ORklHX0JGSU41MzNfU1RBTVA9eQorIyBDT05GSUdfQkxBQ0tTVEFNUCBpcyBub3Qgc2V0CiAjIENPTkZJR19CRklONTMzX0JMVUVURUNITklYX0NNIGlzIG5vdCBzZXQKICMgQ09ORklHX0g4NjA2X0hWU0lTVEVNQVMgaXMgbm90IHNldAogIyBDT05GSUdfQkZJTjUzMl9JUDBYIGlzIG5vdCBzZXQKQEAgLTE4Nyw3ICsyMDYsNiBAQAogIwogQ09ORklHX0NMS0lOX0haPTExMDU5MjAwCiAjIENPTkZJR19CRklOX0tFUk5FTF9DTE9DSyBpcyBub3Qgc2V0Ci1DT05GSUdfTUFYX01FTV9TSVpFPTUxMgogQ09ORklHX01BWF9WQ09fSFo9NzUwMDAwMDAwCiBDT05GSUdfTUlOX1ZDT19IWj01MDAwMDAwMAogQ09ORklHX01BWF9TQ0xLX0haPTEzMzMzMzMzMwpAQCAtMjAxLDYgKzIxOSw3IEBACiAjIENPTkZJR19IWl8zMDAgaXMgbm90IHNldAogIyBDT05GSUdfSFpfMTAwMCBpcyBub3Qgc2V0CiBDT05GSUdfSFo9MjUwCitDT05GSUdfU0NIRURfSFJUSUNLPXkKIENPTkZJR19HRU5FUklDX1RJTUU9eQogQ09ORklHX0dFTkVSSUNfQ0xPQ0tFVkVOVFM9eQogIyBDT05GSUdfQ1lDTEVTX0NMT0NLU09VUkNFIGlzIG5vdCBzZXQKQEAgLTIzOCw2ICsyNTcsMTIgQEAKIENPTkZJR19DQUNIRUxJTkVfQUxJR05FRF9MMT15CiAjIENPTkZJR19TWVNDQUxMX1RBQl9MMSBpcyBub3Qgc2V0CiAjIENPTkZJR19DUExCX1NXSVRDSF9UQUJfTDEgaXMgbm90IHNldAorQ09ORklHX0FQUF9TVEFDS19MMT15CisKKyMKKyMgU3BlZWQgT3B0aW1pemF0aW9ucworIworQ09ORklHX0JGSU5fSU5TX0xPV09WRVJIRUFEPXkKIENPTkZJR19SQU1LRVJORUw9eQogIyBDT05GSUdfUk9NS0VSTkVMIGlzIG5vdCBzZXQKIENPTkZJR19TRUxFQ1RfTUVNT1JZX01PREVMPXkKQEAgLTI0NiwxNCArMjcxLDEzIEBACiAjIENPTkZJR19TUEFSU0VNRU1fTUFOVUFMIGlzIG5vdCBzZXQKIENPTkZJR19GTEFUTUVNPXkKIENPTkZJR19GTEFUX05PREVfTUVNX01BUD15Ci0jIENPTkZJR19TUEFSU0VNRU1fU1RBVElDIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NQQVJTRU1FTV9WTUVNTUFQX0VOQUJMRSBpcyBub3Qgc2V0CitDT05GSUdfUEFHRUZMQUdTX0VYVEVOREVEPXkKIENPTkZJR19TUExJVF9QVExPQ0tfQ1BVUz00CiAjIENPTkZJR19SRVNPVVJDRVNfNjRCSVQgaXMgbm90IHNldAorIyBDT05GSUdfUEhZU19BRERSX1RfNjRCSVQgaXMgbm90IHNldAogQ09ORklHX1pPTkVfRE1BX0ZMQUc9MQogQ09ORklHX1ZJUlRfVE9fQlVTPXkKICMgQ09ORklHX0JGSU5fR1BUSU1FUlMgaXMgbm90IHNldAotQ09ORklHX0JGSU5fRE1BXzVYWD15CiAjIENPTkZJR19ETUFfVU5DQUNIRURfNE0gaXMgbm90IHNldAogIyBDT05GSUdfRE1BX1VOQ0FDSEVEXzJNIGlzIG5vdCBzZXQKIENPTkZJR19ETUFfVU5DQUNIRURfMU09eQpAQCAtMjY4LDcgKzI5Miw2IEBACiAjIENPTkZJR19CRklOX0lDQUNIRV9MT0NLIGlzIG5vdCBzZXQKICMgQ09ORklHX0JGSU5fV0IgaXMgbm90IHNldAogQ09ORklHX0JGSU5fV1Q9eQotQ09ORklHX0wxX01BWF9QSUVDRT0xNgogIyBDT05GSUdfTVBVIGlzIG5vdCBzZXQKIAogIwpAQCAtMjk3LDcgKzMyMCw2IEBACiAjCiAjIEJ1cyBvcHRpb25zIChQQ0ksIFBDTUNJQSwgRUlTQSwgTUNBLCBJU0EpCiAjCi0jIENPTkZJR19QQ0kgaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9TVVBQT1JUU19NU0kgaXMgbm90IHNldAogIyBDT05GSUdfUENDQVJEIGlzIG5vdCBzZXQKIApAQCAtMzA4LDI5ICszMzAsMzAgQEAKIENPTkZJR19CSU5GTVRfRkxBVD15CiBDT05GSUdfQklORk1UX1pGTEFUPXkKICMgQ09ORklHX0JJTkZNVF9TSEFSRURfRkxBVCBpcyBub3Qgc2V0CisjIENPTkZJR19IQVZFX0FPVVQgaXMgbm90IHNldAogIyBDT05GSUdfQklORk1UX01JU0MgaXMgbm90IHNldAogCiAjCiAjIFBvd2VyIG1hbmFnZW1lbnQgb3B0aW9ucwogIwogQ09ORklHX1BNPXkKLSMgQ09ORklHX1BNX0xFR0FDWSBpcyBub3Qgc2V0CiAjIENPTkZJR19QTV9ERUJVRyBpcyBub3Qgc2V0CiBDT05GSUdfUE1fU0xFRVA9eQotQ09ORklHX1NVU1BFTkRfVVBfUE9TU0lCTEU9eQogQ09ORklHX1NVU1BFTkQ9eQorQ09ORklHX1NVU1BFTkRfRlJFRVpFUj15CitDT05GSUdfQVJDSF9TVVNQRU5EX1BPU1NJQkxFPXkKIENPTkZJR19QTV9CRklOX1NMRUVQX0RFRVBFUj15CiAjIENPTkZJR19QTV9CRklOX1NMRUVQIGlzIG5vdCBzZXQKICMgQ09ORklHX1BNX1dBS0VVUF9CWV9HUElPIGlzIG5vdCBzZXQKIAogIworIyBQb3NzaWJsZSBTdXNwZW5kIE1lbSAvIEhpYmVybmF0ZSBXYWtlLVVwIFNvdXJjZXMKKyMKKworIwogIyBDUFUgRnJlcXVlbmN5IHNjYWxpbmcKICMKICMgQ09ORklHX0NQVV9GUkVRIGlzIG5vdCBzZXQKLQotIwotIyBOZXR3b3JraW5nCi0jCiBDT05GSUdfTkVUPXkKIAogIwpAQCAtMzQzLDYgKzM2Niw3IEBACiAjIENPTkZJR19YRlJNX1VTRVIgaXMgbm90IHNldAogIyBDT05GSUdfWEZSTV9TVUJfUE9MSUNZIGlzIG5vdCBzZXQKICMgQ09ORklHX1hGUk1fTUlHUkFURSBpcyBub3Qgc2V0CisjIENPTkZJR19YRlJNX1NUQVRJU1RJQ1MgaXMgbm90IHNldAogIyBDT05GSUdfTkVUX0tFWSBpcyBub3Qgc2V0CiBDT05GSUdfSU5FVD15CiAjIENPTkZJR19JUF9NVUxUSUNBU1QgaXMgbm90IHNldApAQCAtMzcyLDggKzM5Niw2IEBACiBDT05GSUdfREVGQVVMVF9UQ1BfQ09ORz0iY3ViaWMiCiAjIENPTkZJR19UQ1BfTUQ1U0lHIGlzIG5vdCBzZXQKICMgQ09ORklHX0lQVjYgaXMgbm90IHNldAotIyBDT05GSUdfSU5FVDZfWEZSTV9UVU5ORUwgaXMgbm90IHNldAotIyBDT05GSUdfSU5FVDZfVFVOTkVMIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVExBQkVMIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVFdPUktfU0VDTUFSSyBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRGSUxURVIgaXMgbm90IHNldApAQCAtMzgyLDYgKzQwNCw3IEBACiAjIENPTkZJR19USVBDIGlzIG5vdCBzZXQKICMgQ09ORklHX0FUTSBpcyBub3Qgc2V0CiAjIENPTkZJR19CUklER0UgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0RTQSBpcyBub3Qgc2V0CiAjIENPTkZJR19WTEFOXzgwMjFRIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQ05FVCBpcyBub3Qgc2V0CiAjIENPTkZJR19MTEMyIGlzIG5vdCBzZXQKQEAgLTM5OCw2ICs0MjEsNyBAQAogIwogIyBDT05GSUdfTkVUX1BLVEdFTiBpcyBub3Qgc2V0CiAjIENPTkZJR19IQU1SQURJTyBpcyBub3Qgc2V0CisjIENPTkZJR19DQU4gaXMgbm90IHNldAogQ09ORklHX0lSREE9bQogCiAjCkBAIC00MzIsMjQgKzQ1NiwxNCBAQAogIyBDT05GSUdfRE9OR0xFIGlzIG5vdCBzZXQKIAogIwotIyBPbGQgU0lSIGRldmljZSBkcml2ZXJzCi0jCi0jIENPTkZJR19JUlBPUlRfU0lSIGlzIG5vdCBzZXQKLQotIwotIyBPbGQgU2VyaWFsIGRvbmdsZSBzdXBwb3J0Ci0jCi0KLSMKICMgRklSIGRldmljZSBkcml2ZXJzCiAjCiAjIENPTkZJR19CVCBpcyBub3Qgc2V0CiAjIENPTkZJR19BRl9SWFJQQyBpcyBub3Qgc2V0Ci0KLSMKLSMgV2lyZWxlc3MKLSMKKyMgQ09ORklHX1BIT05FVCBpcyBub3Qgc2V0CitDT05GSUdfV0lSRUxFU1M9eQogIyBDT05GSUdfQ0ZHODAyMTEgaXMgbm90IHNldAorQ09ORklHX1dJUkVMRVNTX09MRF9SRUdVTEFUT1JZPXkKICMgQ09ORklHX1dJUkVMRVNTX0VYVCBpcyBub3Qgc2V0CiAjIENPTkZJR19NQUM4MDIxMSBpcyBub3Qgc2V0CiAjIENPTkZJR19JRUVFODAyMTEgaXMgbm90IHNldApAQCAtNDY3LDYgKzQ4MSw4IEBACiBDT05GSUdfU1RBTkRBTE9ORT15CiBDT05GSUdfUFJFVkVOVF9GSVJNV0FSRV9CVUlMRD15CiAjIENPTkZJR19GV19MT0FERVIgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfRFJJVkVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0RFVlJFUyBpcyBub3Qgc2V0CiAjIENPTkZJR19TWVNfSFlQRVJWSVNPUiBpcyBub3Qgc2V0CiAjIENPTkZJR19DT05ORUNUT1IgaXMgbm90IHNldAogQ09ORklHX01URD15CkBAIC00NzUsNiArNDkxLDcgQEAKIENPTkZJR19NVERfUEFSVElUSU9OUz15CiAjIENPTkZJR19NVERfUkVEQk9PVF9QQVJUUyBpcyBub3Qgc2V0CiBDT05GSUdfTVREX0NNRExJTkVfUEFSVFM9eQorIyBDT05GSUdfTVREX0FSN19QQVJUUyBpcyBub3Qgc2V0CiAKICMKICMgVXNlciBNb2R1bGVzIEFuZCBUcmFuc2xhdGlvbiBMYXllcnMKQEAgLTUyMCw2ICs1MzcsNyBAQAogQ09ORklHX01URF9DT01QTEVYX01BUFBJTkdTPXkKICMgQ09ORklHX01URF9QSFlTTUFQIGlzIG5vdCBzZXQKIENPTkZJR19NVERfQkZJTl9BU1lOQz1tCisjIENPTkZJR19NVERfR1BJT19BRERSIGlzIG5vdCBzZXQKICMgQ09ORklHX01URF9VQ0xJTlVYIGlzIG5vdCBzZXQKICMgQ09ORklHX01URF9QTEFUUkFNIGlzIG5vdCBzZXQKIApAQCAtNTU0LDExICs1NzIsMTQgQEAKIENPTkZJR19CTEtfREVWX1JBTT15CiBDT05GSUdfQkxLX0RFVl9SQU1fQ09VTlQ9MTYKIENPTkZJR19CTEtfREVWX1JBTV9TSVpFPTQwOTYKLUNPTkZJR19CTEtfREVWX1JBTV9CTE9DS1NJWkU9MTAyNAorIyBDT05GSUdfQkxLX0RFVl9YSVAgaXMgbm90IHNldAogIyBDT05GSUdfQ0RST01fUEtUQ0RWRCBpcyBub3Qgc2V0CiAjIENPTkZJR19BVEFfT1ZFUl9FVEggaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9IRCBpcyBub3Qgc2V0CiBDT05GSUdfTUlTQ19ERVZJQ0VTPXkKICMgQ09ORklHX0VFUFJPTV85M0NYNiBpcyBub3Qgc2V0CisjIENPTkZJR19FTkNMT1NVUkVfU0VSVklDRVMgaXMgbm90IHNldAorQ09ORklHX0hBVkVfSURFPXkKICMgQ09ORklHX0lERSBpcyBub3Qgc2V0CiAKICMKQEAgLTU3MSw3ICs1OTIsNiBAQAogIyBDT05GSUdfQVRBIGlzIG5vdCBzZXQKICMgQ09ORklHX01EIGlzIG5vdCBzZXQKIENPTkZJR19ORVRERVZJQ0VTPXkKLSMgQ09ORklHX05FVERFVklDRVNfTVVMVElRVUVVRSBpcyBub3Qgc2V0CiAjIENPTkZJR19EVU1NWSBpcyBub3Qgc2V0CiAjIENPTkZJR19CT05ESU5HIGlzIG5vdCBzZXQKICMgQ09ORklHX01BQ1ZMQU4gaXMgbm90IHNldApAQCAtNTg0LDExICs2MDQsMTQgQEAKIENPTkZJR19TTUM5MVg9eQogIyBDT05GSUdfU01TQzkxMVggaXMgbm90IHNldAogIyBDT05GSUdfRE05MDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VOQzI4SjYwIGlzIG5vdCBzZXQKICMgQ09ORklHX0lCTV9ORVdfRU1BQ19aTUlJIGlzIG5vdCBzZXQKICMgQ09ORklHX0lCTV9ORVdfRU1BQ19SR01JSSBpcyBub3Qgc2V0CiAjIENPTkZJR19JQk1fTkVXX0VNQUNfVEFIIGlzIG5vdCBzZXQKICMgQ09ORklHX0lCTV9ORVdfRU1BQ19FTUFDNCBpcyBub3Qgc2V0Ci0jIENPTkZJR19CNDQgaXMgbm90IHNldAorIyBDT05GSUdfSUJNX05FV19FTUFDX05PX0ZMT1dfQ1RSTCBpcyBub3Qgc2V0CisjIENPTkZJR19JQk1fTkVXX0VNQUNfTUFMX0NMUl9JQ0lOVFNUQVQgaXMgbm90IHNldAorIyBDT05GSUdfSUJNX05FV19FTUFDX01BTF9DT01NT05fRVJSIGlzIG5vdCBzZXQKIENPTkZJR19ORVRERVZfMTAwMD15CiAjIENPTkZJR19BWDg4MTgwIGlzIG5vdCBzZXQKIENPTkZJR19ORVRERVZfMTAwMDA9eQpAQCAtNTk4LDEwICs2MjEsMTAgQEAKICMKICMgQ09ORklHX1dMQU5fUFJFODAyMTEgaXMgbm90IHNldAogIyBDT05GSUdfV0xBTl84MDIxMSBpcyBub3Qgc2V0CisjIENPTkZJR19JV0xXSUZJX0xFRFMgaXMgbm90IHNldAogIyBDT05GSUdfV0FOIGlzIG5vdCBzZXQKICMgQ09ORklHX1BQUCBpcyBub3Qgc2V0CiAjIENPTkZJR19TTElQIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIQVBFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRDT05TT0xFIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVFBPTEwgaXMgbm90IHNldAogIyBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUiBpcyBub3Qgc2V0CkBAIC02MzMsNyArNjU2LDcgQEAKICMgQ09ORklHX0lOUFVUX1RPVUNIU0NSRUVOIGlzIG5vdCBzZXQKIENPTkZJR19JTlBVVF9NSVNDPXkKICMgQ09ORklHX0lOUFVUX1VJTlBVVCBpcyBub3Qgc2V0Ci1DT05GSUdfVFdJX0tFWVBBRD1tCitDT05GSUdfQ09ORklHX0lOUFVUX1BDRjg1NzQ9bQogCiAjCiAjIEhhcmR3YXJlIEkvTyBwb3J0cwpAQCAtNjUyLDggKzY3NSwxMSBAQAogQ09ORklHX0JGSU5fU1BPUlQ9eQogIyBDT05GSUdfQkZJTl9USU1FUl9MQVRFTkNZIGlzIG5vdCBzZXQKIENPTkZJR19UV0lfTENEPW0KK0NPTkZJR19CRklOX0RNQV9JTlRFUkZBQ0U9bQogQ09ORklHX1NJTVBMRV9HUElPPW0KICMgQ09ORklHX1ZUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFVktNRU0gaXMgbm90IHNldAorIyBDT05GSUdfQkZJTl9KVEFHX0NPTU0gaXMgbm90IHNldAogIyBDT05GSUdfU0VSSUFMX05PTlNUQU5EQVJEIGlzIG5vdCBzZXQKIAogIwpAQCAtNjgyLDQxICs3MDgsNDYgQEAKICMgQ09ORklHX0NBTjRMSU5VWCBpcyBub3Qgc2V0CiAjIENPTkZJR19JUE1JX0hBTkRMRVIgaXMgbm90IHNldAogIyBDT05GSUdfSFdfUkFORE9NIGlzIG5vdCBzZXQKLSMgQ09ORklHX0dFTl9SVEMgaXMgbm90IHNldAogIyBDT05GSUdfUjM5NjQgaXMgbm90IHNldAogIyBDT05GSUdfUkFXX0RSSVZFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19UQ0dfVFBNIGlzIG5vdCBzZXQKIENPTkZJR19JMkM9bQogQ09ORklHX0kyQ19CT0FSRElORk89eQogQ09ORklHX0kyQ19DSEFSREVWPW0KLQotIwotIyBJMkMgQWxnb3JpdGhtcwotIwotQ09ORklHX0kyQ19BTEdPQklUPW0KLSMgQ09ORklHX0kyQ19BTEdPUENGIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19BTEdPUENBIGlzIG5vdCBzZXQKK0NPTkZJR19JMkNfSEVMUEVSX0FVVE89eQogCiAjCiAjIEkyQyBIYXJkd2FyZSBCdXMgc3VwcG9ydAogIworCisjCisjIEkyQyBzeXN0ZW0gYnVzIGRyaXZlcnMgKG1vc3RseSBlbWJlZGRlZCAvIHN5c3RlbS1vbi1jaGlwKQorIwogIyBDT05GSUdfSTJDX0dQSU8gaXMgbm90IHNldAogIyBDT05GSUdfSTJDX09DT1JFUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19JMkNfUEFSUE9SVF9MSUdIVCBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfU0lNVEVDIGlzIG5vdCBzZXQKKworIworIyBFeHRlcm5hbCBJMkMvU01CdXMgYWRhcHRlciBkcml2ZXJzCisjCisjIENPTkZJR19JMkNfUEFSUE9SVF9MSUdIVCBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfVEFPU19FVk0gaXMgbm90IHNldAorCisjCisjIE90aGVyIEkyQy9TTUJ1cyBidXMgZHJpdmVycworIworIyBDT05GSUdfSTJDX1BDQV9QTEFURk9STSBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfU1RVQiBpcyBub3Qgc2V0CiAKICMKICMgTWlzY2VsbGFuZW91cyBJMkMgQ2hpcCBzdXBwb3J0CiAjCi0jIENPTkZJR19TRU5TT1JTX0RTMTMzNyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX0RTMTM3NCBpcyBub3Qgc2V0CiAjIENPTkZJR19EUzE2ODIgaXMgbm90IHNldAorIyBDT05GSUdfQVQyNCBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0FENTI1MiBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0VFUFJPTSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1BDRjg1NzQgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19QQ0Y4NTc1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1BDRjg1NzUgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19QQ0E5NTM5IGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfUENGODU5MSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX01BWDY4NzUgaXMgbm90IHNldApAQCAtNzI1LDE3ICs3NTYsMTUgQEAKICMgQ09ORklHX0kyQ19ERUJVR19BTEdPIGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19ERUJVR19CVVMgaXMgbm90IHNldAogIyBDT05GSUdfSTJDX0RFQlVHX0NISVAgaXMgbm90IHNldAotCi0jCi0jIFNQSSBzdXBwb3J0Ci0jCiBDT05GSUdfU1BJPXkKKyMgQ09ORklHX1NQSV9ERUJVRyBpcyBub3Qgc2V0CiBDT05GSUdfU1BJX01BU1RFUj15CiAKICMKICMgU1BJIE1hc3RlciBDb250cm9sbGVyIERyaXZlcnMKICMKIENPTkZJR19TUElfQkZJTj15CisjIENPTkZJR19TUElfQkZJTl9MT0NLIGlzIG5vdCBzZXQKICMgQ09ORklHX1NQSV9CSVRCQU5HIGlzIG5vdCBzZXQKIAogIwpAQCAtNzQ0LDExICs3NzMsMTUgQEAKICMgQ09ORklHX1NQSV9BVDI1IGlzIG5vdCBzZXQKICMgQ09ORklHX1NQSV9TUElERVYgaXMgbm90IHNldAogIyBDT05GSUdfU1BJX1RMRTYyWDAgaXMgbm90IHNldAorQ09ORklHX0FSQ0hfV0FOVF9PUFRJT05BTF9HUElPTElCPXkKKyMgQ09ORklHX0dQSU9MSUIgaXMgbm90IHNldAogIyBDT05GSUdfVzEgaXMgbm90IHNldAogIyBDT05GSUdfUE9XRVJfU1VQUExZIGlzIG5vdCBzZXQKIENPTkZJR19IV01PTj15CiAjIENPTkZJR19IV01PTl9WSUQgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRDc0MTQgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19BRDc0MTggaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRENYWCBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0FETTEwMjEgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19BRE0xMDI1IGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfQURNMTAyNiBpcyBub3Qgc2V0CkBAIC03NTYsNiArNzg5LDcgQEAKICMgQ09ORklHX1NFTlNPUlNfQURNMTAzMSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0FETTkyNDAgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19BRFQ3NDcwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQURUNzQ3MyBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0FUWFAxIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfRFMxNjIxIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfRjcxODA1RiBpcyBub3Qgc2V0CkBAIC03NzYsNiArODEwLDcgQEAKICMgQ09ORklHX1NFTlNPUlNfTE05MCBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0xNOTIgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19MTTkzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTUFYMTExMSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX01BWDE2MTkgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19NQVg2NjUwIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfUEM4NzM2MCBpcyBub3Qgc2V0CkBAIC03ODQsNiArODE5LDcgQEAKICMgQ09ORklHX1NFTlNPUlNfU01TQzQ3TTEgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19TTVNDNDdNMTkyIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfU01TQzQ3QjM5NyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FEUzc4MjggaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19USE1DNTAgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19WVDEyMTEgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19XODM3ODFEIGlzIG5vdCBzZXQKQEAgLTc5MSw5ICs4MjcsMTIgQEAKICMgQ09ORklHX1NFTlNPUlNfVzgzNzkyRCBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1c4Mzc5MyBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1c4M0w3ODVUUyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1c4M0w3ODZORyBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1c4MzYyN0hGIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfVzgzNjI3RUhGIGlzIG5vdCBzZXQKICMgQ09ORklHX0hXTU9OX0RFQlVHX0NISVAgaXMgbm90IHNldAorIyBDT05GSUdfVEhFUk1BTCBpcyBub3Qgc2V0CisjIENPTkZJR19USEVSTUFMX0hXTU9OIGlzIG5vdCBzZXQKIENPTkZJR19XQVRDSERPRz15CiAjIENPTkZJR19XQVRDSERPR19OT1dBWU9VVCBpcyBub3Qgc2V0CiAKQEAgLTgwNCwyMSArODQzLDI5IEBACiBDT05GSUdfQkZJTl9XRFQ9eQogCiAjCi0jIFNvbmljcyBTaWxpY29uIEJhY2twbGFuZQotIwotQ09ORklHX1NTQl9QT1NTSUJMRT15Ci0jIENPTkZJR19TU0IgaXMgbm90IHNldAotCi0jCiAjIE11bHRpZnVuY3Rpb24gZGV2aWNlIGRyaXZlcnMKICMKKyMgQ09ORklHX01GRF9DT1JFIGlzIG5vdCBzZXQKICMgQ09ORklHX01GRF9TTTUwMSBpcyBub3Qgc2V0CisjIENPTkZJR19IVENfUEFTSUMzIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9UTUlPIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9XTTg0MDAgaXMgbm90IHNldAorIyBDT05GSUdfTUZEX1dNODM1MF9JMkMgaXMgbm90IHNldAogCiAjCiAjIE11bHRpbWVkaWEgZGV2aWNlcwogIworCisjCisjIE11bHRpbWVkaWEgY29yZSBzdXBwb3J0CisjCiAjIENPTkZJR19WSURFT19ERVYgaXMgbm90IHNldAogIyBDT05GSUdfRFZCX0NPUkUgaXMgbm90IHNldAorIyBDT05GSUdfVklERU9fTUVESUEgaXMgbm90IHNldAorCisjCisjIE11bHRpbWVkaWEgZHJpdmVycworIwogIyBDT05GSUdfREFCIGlzIG5vdCBzZXQKIAogIwpAQCAtODI5LDYgKzg3Niw3IEBACiBDT05GSUdfRkI9bQogQ09ORklHX0ZJUk1XQVJFX0VESUQ9eQogIyBDT05GSUdfRkJfRERDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX0JPT1RfVkVTQV9TVVBQT1JUIGlzIG5vdCBzZXQKIENPTkZJR19GQl9DRkJfRklMTFJFQ1Q9bQogQ09ORklHX0ZCX0NGQl9DT1BZQVJFQT1tCiBDT05GSUdfRkJfQ0ZCX0lNQUdFQkxJVD1tCkBAIC04MzYsOCArODg0LDggQEAKICMgQ09ORklHX0ZCX1NZU19GSUxMUkVDVCBpcyBub3Qgc2V0CiAjIENPTkZJR19GQl9TWVNfQ09QWUFSRUEgaXMgbm90IHNldAogIyBDT05GSUdfRkJfU1lTX0lNQUdFQkxJVCBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9GT1JFSUdOX0VORElBTiBpcyBub3Qgc2V0CiAjIENPTkZJR19GQl9TWVNfRk9QUyBpcyBub3Qgc2V0Ci1DT05GSUdfRkJfREVGRVJSRURfSU89eQogIyBDT05GSUdfRkJfU1ZHQUxJQiBpcyBub3Qgc2V0CiAjIENPTkZJR19GQl9NQUNNT0RFUyBpcyBub3Qgc2V0CiAjIENPTkZJR19GQl9CQUNLTElHSFQgaXMgbm90IHNldApAQCAtODQ4LDYgKzg5Niw3IEBACiAjIEZyYW1lIGJ1ZmZlciBoYXJkd2FyZSBkcml2ZXJzCiAjCiAjIENPTkZJR19GQl9CRklOX1QzNTBNQ1FCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX0JGSU5fTFEwMzVRMSBpcyBub3Qgc2V0CiBDT05GSUdfRkJfQkZJTl83MzkzPW0KIENPTkZJR19OVFNDPXkKICMgQ09ORklHX1BBTCBpcyBub3Qgc2V0CkBAIC04NTksNiArOTA4LDcgQEAKICMgQ09ORklHX0FEVjczOTNfMlhNRU0gaXMgbm90IHNldAogIyBDT05GSUdfRkJfUzFEMTNYWFggaXMgbm90IHNldAogIyBDT05GSUdfRkJfVklSVFVBTCBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9NRVRST05PTUUgaXMgbm90IHNldAogIyBDT05GSUdfQkFDS0xJR0hUX0xDRF9TVVBQT1JUIGlzIG5vdCBzZXQKIAogIwpAQCAtODY2LDE1ICs5MTYsOCBAQAogIwogIyBDT05GSUdfRElTUExBWV9TVVBQT1JUIGlzIG5vdCBzZXQKICMgQ09ORklHX0xPR08gaXMgbm90IHNldAotCi0jCi0jIFNvdW5kCi0jCiBDT05GSUdfU09VTkQ9bQotCi0jCi0jIEFkdmFuY2VkIExpbnV4IFNvdW5kIEFyY2hpdGVjdHVyZQotIworQ09ORklHX1NPVU5EX09TU19DT1JFPXkKIENPTkZJR19TTkQ9bQogQ09ORklHX1NORF9USU1FUj1tCiBDT05GSUdfU05EX1BDTT1tCkBAIC04ODgsMTggKzkzMSwxMiBAQAogQ09ORklHX1NORF9WRVJCT1NFX1BST0NGUz15CiAjIENPTkZJR19TTkRfVkVSQk9TRV9QUklOVEsgaXMgbm90IHNldAogIyBDT05GSUdfU05EX0RFQlVHIGlzIG5vdCBzZXQKLQotIwotIyBHZW5lcmljIGRldmljZXMKLSMKK0NPTkZJR19TTkRfRFJJVkVSUz15CiAjIENPTkZJR19TTkRfRFVNTVkgaXMgbm90IHNldAogIyBDT05GSUdfU05EX01UUEFWIGlzIG5vdCBzZXQKICMgQ09ORklHX1NORF9TRVJJQUxfVTE2NTUwIGlzIG5vdCBzZXQKICMgQ09ORklHX1NORF9NUFU0MDEgaXMgbm90IHNldAotCi0jCi0jIFNQSSBkZXZpY2VzCi0jCitDT05GSUdfU05EX1NQST15CiAKICMKICMgQUxTQSBCbGFja2ZpbiBkZXZpY2VzCkBAIC05MTEsNDYgKzk0OCw0NiBAQAogIyBDT05GSUdfU05EX0JMQUNLRklOX0FEMTgzNl81UDEgaXMgbm90IHNldAogQ09ORklHX1NORF9CTEFDS0ZJTl9TUE9SVD0wCiBDT05GSUdfU05EX0JMQUNLRklOX1NQSV9QRkJJVD00Ci1DT05GSUdfU05EX0JGSU5fQUQ3MzMxMT1tCiBDT05GSUdfU05EX0JGSU5fU1BPUlQ9MAotQ09ORklHX1NORF9CRklOX0FENzMzMTFfU0U9NAogQ09ORklHX1NORF9CRklOX0FENzMzMjI9bQogQ09ORklHX1NORF9CRklOX0FENzMzMjJfU1BPUlQwX1NFPTEwCiBDT05GSUdfU05EX0JGSU5fQUQ3MzMyMl9TUE9SVDFfU0U9MTQKIENPTkZJR19TTkRfQkZJTl9BRDczMzIyX1JFU0VUPTEyCi0KLSMKLSMgU3lzdGVtIG9uIENoaXAgYXVkaW8gc3VwcG9ydAotIwotQ09ORklHX1NORF9TT0NfQUM5N19CVVM9eQogQ09ORklHX1NORF9TT0M9bQotQ09ORklHX1NORF9CRjVYWF9TT0M9bQotQ09ORklHX1NORF9NTUFQX1NVUFBPUlQ9eQotQ09ORklHX1NORF9CRjVYWF9TT0NfQUM5Nz1tCi0jIENPTkZJR19TTkRfQkY1WFhfU09DX1dNODc1MCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfQkY1WFhfU09DX1dNODczMSBpcyBub3Qgc2V0CitDT05GSUdfU05EX1NPQ19BQzk3X0JVUz15CitDT05GSUdfU05EX0JGNVhYX0kyUz1tCiAjIENPTkZJR19TTkRfQkY1WFhfU09DX1NTTTI2MDIgaXMgbm90IHNldAotQ09ORklHX1NORF9CRjVYWF9TT0NfQkY1eHg9bQorQ09ORklHX1NORF9CRjVYWF9TT0NfQUQ3MzMxMT1tCitDT05GSUdfU05EX0JGSU5fQUQ3MzMxMV9TRT00CitDT05GSUdfU05EX0JGNVhYX0FDOTc9bQorQ09ORklHX1NORF9CRjVYWF9NTUFQX1NVUFBPUlQ9eQorIyBDT05GSUdfU05EX0JGNVhYX01VTFRJQ0hBTl9TVVBQT1JUIGlzIG5vdCBzZXQKK0NPTkZJR19TTkRfQkY1WFhfU09DX1NQT1JUPW0KK0NPTkZJR19TTkRfQkY1WFhfU09DX0kyUz1tCitDT05GSUdfU05EX0JGNVhYX1NPQ19BQzk3PW0KK0NPTkZJR19TTkRfQkY1WFhfU09DX0FEMTk4MD1tCiBDT05GSUdfU05EX0JGNVhYX1NQT1JUX05VTT0wCiAjIENPTkZJR19TTkRfQkY1WFhfSEFWRV9DT0xEX1JFU0VUIGlzIG5vdCBzZXQKLQotIwotIyBTb0MgQXVkaW8gc3VwcG9ydCBmb3IgU3VwZXJICi0jCisjIENPTkZJR19TTkRfU09DX0FMTF9DT0RFQ1MgaXMgbm90IHNldAogQ09ORklHX1NORF9TT0NfQUQxOTgwPW0KLQotIwotIyBPcGVuIFNvdW5kIFN5c3RlbQotIworQ09ORklHX1NORF9TT0NfQUQ3MzMxMT1tCiAjIENPTkZJR19TT1VORF9QUklNRSBpcyBub3Qgc2V0CiBDT05GSUdfQUM5N19CVVM9bQogQ09ORklHX0hJRF9TVVBQT1JUPXkKIENPTkZJR19ISUQ9eQogIyBDT05GSUdfSElEX0RFQlVHIGlzIG5vdCBzZXQKICMgQ09ORklHX0hJRFJBVyBpcyBub3Qgc2V0CisjIENPTkZJR19ISURfUElEIGlzIG5vdCBzZXQKKworIworIyBTcGVjaWFsIEhJRCBkcml2ZXJzCisjCitDT05GSUdfSElEX0NPTVBBVD15CiAjIENPTkZJR19VU0JfU1VQUE9SVCBpcyBub3Qgc2V0CiAjIENPTkZJR19NTUMgaXMgbm90IHNldAorIyBDT05GSUdfTUVNU1RJQ0sgaXMgbm90IHNldAogIyBDT05GSUdfTkVXX0xFRFMgaXMgbm90IHNldAorIyBDT05GSUdfQUNDRVNTSUJJTElUWSBpcyBub3Qgc2V0CiBDT05GSUdfUlRDX0xJQj15CiBDT05GSUdfUlRDX0NMQVNTPXkKIENPTkZJR19SVENfSENUT1NZUz15CkBAIC05NzksNTEgKzEwMTYsNTcgQEAKICMgQ09ORklHX1JUQ19EUlZfUENGODU2MyBpcyBub3Qgc2V0CiAjIENPTkZJR19SVENfRFJWX1BDRjg1ODMgaXMgbm90IHNldAogIyBDT05GSUdfUlRDX0RSVl9NNDFUODAgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9TMzUzOTBBIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfRk0zMTMwIGlzIG5vdCBzZXQKIAogIwogIyBTUEkgUlRDIGRyaXZlcnMKICMKLSMgQ09ORklHX1JUQ19EUlZfUlM1QzM0OCBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX000MVQ5NCBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX0RTMTMwNSBpcyBub3Qgc2V0CiAjIENPTkZJR19SVENfRFJWX01BWDY5MDIgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9SOTcwMSBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX1JTNUMzNDggaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9EUzMyMzQgaXMgbm90IHNldAogCiAjCiAjIFBsYXRmb3JtIFJUQyBkcml2ZXJzCiAjCisjIENPTkZJR19SVENfRFJWX0RTMTI4NiBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX0RTMTUxMSBpcyBub3Qgc2V0CiAjIENPTkZJR19SVENfRFJWX0RTMTU1MyBpcyBub3Qgc2V0Ci0jIENPTkZJR19SVENfRFJWX1NUSzE3VEE4IGlzIG5vdCBzZXQKICMgQ09ORklHX1JUQ19EUlZfRFMxNzQyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfU1RLMTdUQTggaXMgbm90IHNldAogIyBDT05GSUdfUlRDX0RSVl9NNDhUODYgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9NNDhUMzUgaXMgbm90IHNldAogIyBDT05GSUdfUlRDX0RSVl9NNDhUNTkgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9CUTQ4MDIgaXMgbm90IHNldAogIyBDT05GSUdfUlRDX0RSVl9WMzAyMCBpcyBub3Qgc2V0CiAKICMKICMgb24tQ1BVIFJUQyBkcml2ZXJzCiAjCiBDT05GSUdfUlRDX0RSVl9CRklOPXkKLQotIwotIyBVc2Vyc3BhY2UgSS9PCi0jCisjIENPTkZJR19ETUFERVZJQ0VTIGlzIG5vdCBzZXQKICMgQ09ORklHX1VJTyBpcyBub3Qgc2V0CisjIENPTkZJR19TVEFHSU5HIGlzIG5vdCBzZXQKIAogIwogIyBGaWxlIHN5c3RlbXMKICMKICMgQ09ORklHX0VYVDJfRlMgaXMgbm90IHNldAogIyBDT05GSUdfRVhUM19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19FWFQ0REVWX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYVDRfRlMgaXMgbm90IHNldAogIyBDT05GSUdfUkVJU0VSRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfSkZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0CitDT05GSUdfRklMRV9MT0NLSU5HPXkKICMgQ09ORklHX1hGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19HRlMyX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX09DRlMyX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX01JTklYX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1JPTUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ROT1RJRlkgaXMgbm90IHNldAogQ09ORklHX0lOT1RJRlk9eQogQ09ORklHX0lOT1RJRllfVVNFUj15CiAjIENPTkZJR19RVU9UQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19ETk9USUZZIGlzIG5vdCBzZXQKICMgQ09ORklHX0FVVE9GU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19BVVRPRlM0X0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZVU0VfRlMgaXMgbm90IHNldApAQCAtMTA2MywxMSArMTEwNiwxMSBAQAogIyBDT05GSUdfRUZTX0ZTIGlzIG5vdCBzZXQKIENPTkZJR19ZQUZGU19GUz1tCiBDT05GSUdfWUFGRlNfWUFGRlMxPXkKKyMgQ09ORklHX1lBRkZTXzlCWVRFX1RBR1MgaXMgbm90IHNldAogIyBDT05GSUdfWUFGRlNfRE9FU19FQ0MgaXMgbm90IHNldAogQ09ORklHX1lBRkZTX1lBRkZTMj15CiBDT05GSUdfWUFGRlNfQVVUT19ZQUZGUzI9eQogIyBDT05GSUdfWUFGRlNfRElTQUJMRV9MQVpZX0xPQUQgaXMgbm90IHNldAotQ09ORklHX1lBRkZTX0NIRUNLUE9JTlRfUkVTRVJWRURfQkxPQ0tTPTEwCiAjIENPTkZJR19ZQUZGU19ESVNBQkxFX1dJREVfVE5PREVTIGlzIG5vdCBzZXQKICMgQ09ORklHX1lBRkZTX0FMV0FZU19DSEVDS19DSFVOS19FUkFTRUQgaXMgbm90IHNldAogQ09ORklHX1lBRkZTX1NIT1JUX05BTUVTX0lOX1JBTT15CkBAIC0xMDg0LDggKzExMjcsMTEgQEAKICMgQ09ORklHX0pGRlMyX1JVQklOIGlzIG5vdCBzZXQKICMgQ09ORklHX0NSQU1GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19WWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01JTklYX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX09NRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfSFBGU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19RTlg0RlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUk9NRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfU1lTVl9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19VRlNfRlMgaXMgbm90IHNldAogQ09ORklHX05FVFdPUktfRklMRVNZU1RFTVM9eQpAQCAtMTA5MywxMyArMTEzOSwxMiBAQAogQ09ORklHX05GU19WMz15CiAjIENPTkZJR19ORlNfVjNfQUNMIGlzIG5vdCBzZXQKICMgQ09ORklHX05GU19WNCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORlNfRElSRUNUSU8gaXMgbm90IHNldAogIyBDT05GSUdfTkZTRCBpcyBub3Qgc2V0CiBDT05GSUdfTE9DS0Q9bQogQ09ORklHX0xPQ0tEX1Y0PXkKIENPTkZJR19ORlNfQ09NTU9OPXkKIENPTkZJR19TVU5SUEM9bQotIyBDT05GSUdfU1VOUlBDX0JJTkQzNCBpcyBub3Qgc2V0CisjIENPTkZJR19TVU5SUENfUkVHSVNURVJfVjQgaXMgbm90IHNldAogIyBDT05GSUdfUlBDU0VDX0dTU19LUkI1IGlzIG5vdCBzZXQKICMgQ09ORklHX1JQQ1NFQ19HU1NfU1BLTTMgaXMgbm90IHNldAogQ09ORklHX1NNQl9GUz1tCkBAIC0xMTU1LDkgKzEyMDAsNiBAQAogIyBDT05GSUdfTkxTX0tPSThfVSBpcyBub3Qgc2V0CiAjIENPTkZJR19OTFNfVVRGOCBpcyBub3Qgc2V0CiAjIENPTkZJR19ETE0gaXMgbm90IHNldAotQ09ORklHX0lOU1RSVU1FTlRBVElPTj15Ci0jIENPTkZJR19QUk9GSUxJTkcgaXMgbm90IHNldAotIyBDT05GSUdfTUFSS0VSUyBpcyBub3Qgc2V0CiAKICMKICMgS2VybmVsIGhhY2tpbmcKQEAgLTExNjUsMTQgKzEyMDcsNTMgQEAKICMgQ09ORklHX1BSSU5US19USU1FIGlzIG5vdCBzZXQKIENPTkZJR19FTkFCTEVfV0FSTl9ERVBSRUNBVEVEPXkKIENPTkZJR19FTkFCTEVfTVVTVF9DSEVDSz15CitDT05GSUdfRlJBTUVfV0FSTj0xMDI0CiAjIENPTkZJR19NQUdJQ19TWVNSUSBpcyBub3Qgc2V0CiAjIENPTkZJR19VTlVTRURfU1lNQk9MUyBpcyBub3Qgc2V0CiBDT05GSUdfREVCVUdfRlM9eQogIyBDT05GSUdfSEVBREVSU19DSEVDSyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUJVR19LRVJORUwgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX0tFUk5FTD15CisjIENPTkZJR19ERUJVR19TSElSUSBpcyBub3Qgc2V0CitDT05GSUdfREVURUNUX1NPRlRMT0NLVVA9eQorIyBDT05GSUdfQk9PVFBBUkFNX1NPRlRMT0NLVVBfUEFOSUMgaXMgbm90IHNldAorQ09ORklHX0JPT1RQQVJBTV9TT0ZUTE9DS1VQX1BBTklDX1ZBTFVFPTAKK0NPTkZJR19TQ0hFRF9ERUJVRz15CisjIENPTkZJR19TQ0hFRFNUQVRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RJTUVSX1NUQVRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX09CSkVDVFMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU0xBQiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19SVF9NVVRFWEVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUX01VVEVYX1RFU1RFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TUElOTE9DSyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19NVVRFWEVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NQSU5MT0NLX1NMRUVQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0xPQ0tJTkdfQVBJX1NFTEZURVNUUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19LT0JKRUNUIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX0JVR1ZFUkJPU0UgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX0lORk89eQorIyBDT05GSUdfREVCVUdfVk0gaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfV1JJVEVDT1VOVCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19NRU1PUllfSU5JVCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19MSVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZSQU1FX1BPSU5URVIgaXMgbm90IHNldAorIyBDT05GSUdfQk9PVF9QUklOVEtfREVMQVkgaXMgbm90IHNldAorIyBDT05GSUdfUkNVX1RPUlRVUkVfVEVTVCBpcyBub3Qgc2V0CisjIENPTkZJR19SQ1VfQ1BVX1NUQUxMX0RFVEVDVE9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JBQ0tUUkFDRV9TRUxGX1RFU1QgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfQkxPQ0tfRVhUX0RFVlQgaXMgbm90IHNldAorIyBDT05GSUdfRkFVTFRfSU5KRUNUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZU0NUTF9TWVNDQUxMX0NIRUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RZTkFNSUNfUFJJTlRLX0RFQlVHIGlzIG5vdCBzZXQKICMgQ09ORklHX1NBTVBMRVMgaXMgbm90IHNldAorQ09ORklHX0hBVkVfQVJDSF9LR0RCPXkKKyMgQ09ORklHX0tHREIgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU1RBQ0tPVkVSRkxPVyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TVEFDS19VU0FHRSBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfVkVSQk9TRT15CiBDT05GSUdfREVCVUdfTU1SUz15CisjIENPTkZJR19ERUJVR19IV0VSUiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19ET1VCTEVGQVVMVCBpcyBub3Qgc2V0CiBDT05GSUdfREVCVUdfSFVOVF9GT1JfWkVSTz15CiBDT05GSUdfREVCVUdfQkZJTl9IV1RSQUNFX09OPXkKIENPTkZJR19ERUJVR19CRklOX0hXVFJBQ0VfQ09NUFJFU1NJT05fT0ZGPXkKQEAgLTExOTAsOSArMTI3MSw5NCBAQAogIwogIyBDT05GSUdfS0VZUyBpcyBub3Qgc2V0CiBDT05GSUdfU0VDVVJJVFk9eQorIyBDT05GSUdfU0VDVVJJVFlGUyBpcyBub3Qgc2V0CiAjIENPTkZJR19TRUNVUklUWV9ORVRXT1JLIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFQ1VSSVRZX0NBUEFCSUxJVElFUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE8gaXMgbm90IHNldAorIyBDT05GSUdfU0VDVVJJVFlfRklMRV9DQVBBQklMSVRJRVMgaXMgbm90IHNldAorQ09ORklHX1NFQ1VSSVRZX0RFRkFVTFRfTU1BUF9NSU5fQUREUj0wCitDT05GSUdfQ1JZUFRPPXkKKworIworIyBDcnlwdG8gY29yZSBvciBoZWxwZXIKKyMKKyMgQ09ORklHX0NSWVBUT19GSVBTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19NQU5BR0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19HRjEyOE1VTCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fTlVMTCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQ1JZUFREIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19BVVRIRU5DIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19URVNUIGlzIG5vdCBzZXQKKworIworIyBBdXRoZW50aWNhdGVkIEVuY3J5cHRpb24gd2l0aCBBc3NvY2lhdGVkIERhdGEKKyMKKyMgQ09ORklHX0NSWVBUT19DQ00gaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0dDTSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0VRSVYgaXMgbm90IHNldAorCisjCisjIEJsb2NrIG1vZGVzCisjCisjIENPTkZJR19DUllQVE9fQ0JDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19DVFIgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0NUUyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fRUNCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19MUlcgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1BDQkMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1hUUyBpcyBub3Qgc2V0CisKKyMKKyMgSGFzaCBtb2RlcworIworIyBDT05GSUdfQ1JZUFRPX0hNQUMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1hDQkMgaXMgbm90IHNldAorCisjCisjIERpZ2VzdAorIworIyBDT05GSUdfQ1JZUFRPX0NSQzMyQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fTUQ0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19NRDUgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX01JQ0hBRUxfTUlDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19STUQxMjggaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1JNRDE2MCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fUk1EMjU2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19STUQzMjAgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1NIQTEgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1NIQTI1NiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0hBNTEyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19UR1IxOTIgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1dQNTEyIGlzIG5vdCBzZXQKKworIworIyBDaXBoZXJzCisjCisjIENPTkZJR19DUllQVE9fQUVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19BTlVCSVMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0FSQzQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0JMT1dGSVNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19DQU1FTExJQSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQ0FTVDUgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0NBU1Q2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19ERVMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0ZDUllQVCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fS0hBWkFEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TQUxTQTIwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TRUVEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TRVJQRU5UIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19URUEgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1RXT0ZJU0ggaXMgbm90IHNldAorCisjCisjIENvbXByZXNzaW9uCisjCisjIENPTkZJR19DUllQVE9fREVGTEFURSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fTFpPIGlzIG5vdCBzZXQKKworIworIyBSYW5kb20gTnVtYmVyIEdlbmVyYXRpb24KKyMKKyMgQ09ORklHX0NSWVBUT19BTlNJX0NQUk5HIGlzIG5vdCBzZXQKK0NPTkZJR19DUllQVE9fSFc9eQogCiAjCiAjIExpYnJhcnkgcm91dGluZXMKQEAgLTEyMDAsNiArMTM2Niw3IEBACiBDT05GSUdfQklUUkVWRVJTRT15CiBDT05GSUdfQ1JDX0NDSVRUPW0KICMgQ09ORklHX0NSQzE2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQ19UMTBESUYgaXMgbm90IHNldAogIyBDT05GSUdfQ1JDX0lUVV9UIGlzIG5vdCBzZXQKIENPTkZJR19DUkMzMj15CiAjIENPTkZJR19DUkM3IGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vY29uZmlncy9CRjUzNy1TVEFNUF9kZWZjb25maWcgYi9hcmNoL2JsYWNrZmluL2NvbmZpZ3MvQkY1MzctU1RBTVBfZGVmY29uZmlnCmluZGV4IDYzYTBmODUuLjMzMjE0MmYgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vY29uZmlncy9CRjUzNy1TVEFNUF9kZWZjb25maWcKKysrIGIvYXJjaC9ibGFja2Zpbi9jb25maWdzL0JGNTM3LVNUQU1QX2RlZmNvbmZpZwpAQCAtMSw2ICsxLDcgQEAKICMKICMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKLSMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4yNC43CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMjgtcmMyCisjIFR1ZSBEZWMgMzAgMTc6MjQ6MzcgMjAwOAogIwogIyBDT05GSUdfTU1VIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZQVSBpcyBub3Qgc2V0CkBAIC04LDcgKzksNiBAQAogIyBDT05GSUdfUldTRU1fWENIR0FERF9BTEdPUklUSE0gaXMgbm90IHNldAogQ09ORklHX0JMQUNLRklOPXkKIENPTkZJR19aT05FX0RNQT15Ci1DT05GSUdfU0VNQVBIT1JFX1NMRUVQRVJTPXkKIENPTkZJR19HRU5FUklDX0ZJTkRfTkVYVF9CSVQ9eQogQ09ORklHX0dFTkVSSUNfSFdFSUdIVD15CiBDT05GSUdfR0VORVJJQ19IQVJESVJRUz15CkBAIC0zMSwxOCArMzEsMTYgQEAKICMgQ09ORklHX1BPU0lYX01RVUVVRSBpcyBub3Qgc2V0CiAjIENPTkZJR19CU0RfUFJPQ0VTU19BQ0NUIGlzIG5vdCBzZXQKICMgQ09ORklHX1RBU0tTVEFUUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0VSX05TIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BJRF9OUyBpcyBub3Qgc2V0CiAjIENPTkZJR19BVURJVCBpcyBub3Qgc2V0CiBDT05GSUdfSUtDT05GSUc9eQogQ09ORklHX0lLQ09ORklHX1BST0M9eQogQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKICMgQ09ORklHX0NHUk9VUFMgaXMgbm90IHNldAotQ09ORklHX0ZBSVJfR1JPVVBfU0NIRUQ9eQotQ09ORklHX0ZBSVJfVVNFUl9TQ0hFRD15Ci0jIENPTkZJR19GQUlSX0NHUk9VUF9TQ0hFRCBpcyBub3Qgc2V0Ci1DT05GSUdfU1lTRlNfREVQUkVDQVRFRD15CisjIENPTkZJR19HUk9VUF9TQ0hFRCBpcyBub3Qgc2V0CisjIENPTkZJR19TWVNGU19ERVBSRUNBVEVEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZU0ZTX0RFUFJFQ0FURURfVjIgaXMgbm90IHNldAogIyBDT05GSUdfUkVMQVkgaXMgbm90IHNldAorIyBDT05GSUdfTkFNRVNQQUNFUyBpcyBub3Qgc2V0CiBDT05GSUdfQkxLX0RFVl9JTklUUkQ9eQogQ09ORklHX0lOSVRSQU1GU19TT1VSQ0U9IiIKICMgQ09ORklHX0NDX09QVElNSVpFX0ZPUl9TSVpFIGlzIG5vdCBzZXQKQEAgLTUxLDI2ICs0OSwzNSBAQAogQ09ORklHX1VJRDE2PXkKIENPTkZJR19TWVNDVExfU1lTQ0FMTD15CiBDT05GSUdfS0FMTFNZTVM9eQorIyBDT05GSUdfS0FMTFNZTVNfQUxMIGlzIG5vdCBzZXQKICMgQ09ORklHX0tBTExTWU1TX0VYVFJBX1BBU1MgaXMgbm90IHNldAogQ09ORklHX0hPVFBMVUc9eQogQ09ORklHX1BSSU5USz15CiBDT05GSUdfQlVHPXkKLUNPTkZJR19FTEZfQ09SRT15CisjIENPTkZJR19FTEZfQ09SRSBpcyBub3Qgc2V0CitDT05GSUdfQ09NUEFUX0JSSz15CiBDT05GSUdfQkFTRV9GVUxMPXkKIENPTkZJR19GVVRFWD15CiBDT05GSUdfQU5PTl9JTk9ERVM9eQogQ09ORklHX0VQT0xMPXkKIENPTkZJR19TSUdOQUxGRD15CitDT05GSUdfVElNRVJGRD15CiBDT05GSUdfRVZFTlRGRD15CitDT05GSUdfQUlPPXkKIENPTkZJR19WTV9FVkVOVF9DT1VOVEVSUz15CiBDT05GSUdfU0xBQj15CiAjIENPTkZJR19TTFVCIGlzIG5vdCBzZXQKICMgQ09ORklHX1NMT0IgaXMgbm90IHNldAorIyBDT05GSUdfUFJPRklMSU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BUktFUlMgaXMgbm90IHNldAorQ09ORklHX0hBVkVfT1BST0ZJTEU9eQorIyBDT05GSUdfSEFWRV9HRU5FUklDX0RNQV9DT0hFUkVOVCBpcyBub3Qgc2V0CiBDT05GSUdfU0xBQklORk89eQogQ09ORklHX1JUX01VVEVYRVM9eQogQ09ORklHX1RJTllfU0hNRU09eQogQ09ORklHX0JBU0VfU01BTEw9MAogQ09ORklHX01PRFVMRVM9eQorIyBDT05GSUdfTU9EVUxFX0ZPUkNFX0xPQUQgaXMgbm90IHNldAogQ09ORklHX01PRFVMRV9VTkxPQUQ9eQogIyBDT05GSUdfTU9EVUxFX0ZPUkNFX1VOTE9BRCBpcyBub3Qgc2V0CiAjIENPTkZJR19NT0RWRVJTSU9OUyBpcyBub3Qgc2V0CkBAIC04MSw2ICs4OCw3IEBACiAjIENPTkZJR19CTEtfREVWX0lPX1RSQUNFIGlzIG5vdCBzZXQKICMgQ09ORklHX0xTRiBpcyBub3Qgc2V0CiAjIENPTkZJR19CTEtfREVWX0JTRyBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0lOVEVHUklUWSBpcyBub3Qgc2V0CiAKICMKICMgSU8gU2NoZWR1bGVycwpAQCAtOTQsOSArMTAyLDExIEBACiAjIENPTkZJR19ERUZBVUxUX0NGUSBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUZBVUxUX05PT1AgaXMgbm90IHNldAogQ09ORklHX0RFRkFVTFRfSU9TQ0hFRD0iYW50aWNpcGF0b3J5IgorQ09ORklHX0NMQVNTSUNfUkNVPXkKICMgQ09ORklHX1BSRUVNUFRfTk9ORSBpcyBub3Qgc2V0CiBDT05GSUdfUFJFRU1QVF9WT0xVTlRBUlk9eQogIyBDT05GSUdfUFJFRU1QVCBpcyBub3Qgc2V0CitDT05GSUdfRlJFRVpFUj15CiAKICMKICMgQmxhY2tmaW4gUHJvY2Vzc29yIE9wdGlvbnMKQEAgLTEwNSw2ICsxMTUsMTAgQEAKICMKICMgUHJvY2Vzc29yIGFuZCBCb2FyZCBTZXR0aW5ncwogIworIyBDT05GSUdfQkY1MTIgaXMgbm90IHNldAorIyBDT05GSUdfQkY1MTQgaXMgbm90IHNldAorIyBDT05GSUdfQkY1MTYgaXMgbm90IHNldAorIyBDT05GSUdfQkY1MTggaXMgbm90IHNldAogIyBDT05GSUdfQkY1MjIgaXMgbm90IHNldAogIyBDT05GSUdfQkY1MjMgaXMgbm90IHNldAogIyBDT05GSUdfQkY1MjQgaXMgbm90IHNldApAQCAtMTE3LDE4ICsxMzEsMjMgQEAKICMgQ09ORklHX0JGNTM0IGlzIG5vdCBzZXQKICMgQ09ORklHX0JGNTM2IGlzIG5vdCBzZXQKIENPTkZJR19CRjUzNz15CisjIENPTkZJR19CRjUzOCBpcyBub3Qgc2V0CisjIENPTkZJR19CRjUzOSBpcyBub3Qgc2V0CiAjIENPTkZJR19CRjU0MiBpcyBub3Qgc2V0CiAjIENPTkZJR19CRjU0NCBpcyBub3Qgc2V0CiAjIENPTkZJR19CRjU0NyBpcyBub3Qgc2V0CiAjIENPTkZJR19CRjU0OCBpcyBub3Qgc2V0CiAjIENPTkZJR19CRjU0OSBpcyBub3Qgc2V0CiAjIENPTkZJR19CRjU2MSBpcyBub3Qgc2V0CitDT05GSUdfQkZfUkVWX01JTj0yCitDT05GSUdfQkZfUkVWX01BWD0zCiAjIENPTkZJR19CRl9SRVZfMF8wIGlzIG5vdCBzZXQKICMgQ09ORklHX0JGX1JFVl8wXzEgaXMgbm90IHNldAogQ09ORklHX0JGX1JFVl8wXzI9eQogIyBDT05GSUdfQkZfUkVWXzBfMyBpcyBub3Qgc2V0CiAjIENPTkZJR19CRl9SRVZfMF80IGlzIG5vdCBzZXQKICMgQ09ORklHX0JGX1JFVl8wXzUgaXMgbm90IHNldAorIyBDT05GSUdfQkZfUkVWXzBfNiBpcyBub3Qgc2V0CiAjIENPTkZJR19CRl9SRVZfQU5ZIGlzIG5vdCBzZXQKICMgQ09ORklHX0JGX1JFVl9OT05FIGlzIG5vdCBzZXQKIENPTkZJR19CRjUzeD15CkBAIC0xNDEsMjcgKzE2MCwyOCBAQAogQ09ORklHX0lSUV9TUE9SVDFfUlg9OQogQ09ORklHX0lSUV9TUE9SVDFfVFg9OQogQ09ORklHX0lSUV9UV0k9MTAKLUNPTkZJR19JUlFfU1BJPTEwCiBDT05GSUdfSVJRX1VBUlQwX1JYPTEwCiBDT05GSUdfSVJRX1VBUlQwX1RYPTEwCiBDT05GSUdfSVJRX1VBUlQxX1JYPTEwCiBDT05GSUdfSVJRX1VBUlQxX1RYPTEwCiBDT05GSUdfSVJRX01BQ19SWD0xMQogQ09ORklHX0lSUV9NQUNfVFg9MTEKLUNPTkZJR19JUlFfVE1SMD0xMgotQ09ORklHX0lSUV9UTVIxPTEyCi1DT05GSUdfSVJRX1RNUjI9MTIKLUNPTkZJR19JUlFfVE1SMz0xMgotQ09ORklHX0lSUV9UTVI0PTEyCi1DT05GSUdfSVJRX1RNUjU9MTIKLUNPTkZJR19JUlFfVE1SNj0xMgotQ09ORklHX0lSUV9UTVI3PTEyCitDT05GSUdfSVJRX1RJTUVSMD04CitDT05GSUdfSVJRX1RJTUVSMT0xMgorQ09ORklHX0lSUV9USU1FUjI9MTIKK0NPTkZJR19JUlFfVElNRVIzPTEyCitDT05GSUdfSVJRX1RJTUVSND0xMgorQ09ORklHX0lSUV9USU1FUjU9MTIKK0NPTkZJR19JUlFfVElNRVI2PTEyCitDT05GSUdfSVJRX1RJTUVSNz0xMgogQ09ORklHX0lSUV9QT1JUR19JTlRCPTEyCiBDT05GSUdfSVJRX01FTV9ETUEwPTEzCiBDT05GSUdfSVJRX01FTV9ETUExPTEzCiBDT05GSUdfSVJRX1dBVENIPTEzCitDT05GSUdfSVJRX1NQST0xMAogQ09ORklHX0JGSU41MzdfU1RBTVA9eQogIyBDT05GSUdfQkZJTjUzN19CTFVFVEVDSE5JWF9DTSBpcyBub3Qgc2V0CisjIENPTkZJR19CRklONTM3X0JMVUVURUNITklYX1RDTSBpcyBub3Qgc2V0CiAjIENPTkZJR19QTkFWMTAgaXMgbm90IHNldAogIyBDT05GSUdfQ0FNU0lHX01JTk9UQVVSIGlzIG5vdCBzZXQKICMgQ09ORklHX0dFTkVSSUNfQkY1MzdfQk9BUkQgaXMgbm90IHNldApAQCAtMTk0LDcgKzIxNCw2IEBACiAjCiBDT05GSUdfQ0xLSU5fSFo9MjUwMDAwMDAKICMgQ09ORklHX0JGSU5fS0VSTkVMX0NMT0NLIGlzIG5vdCBzZXQKLUNPTkZJR19NQVhfTUVNX1NJWkU9NTEyCiBDT05GSUdfTUFYX1ZDT19IWj02MDAwMDAwMDAKIENPTkZJR19NSU5fVkNPX0haPTUwMDAwMDAwCiBDT05GSUdfTUFYX1NDTEtfSFo9MTMzMzMzMzMzCkBAIC0yMDgsNiArMjI3LDcgQEAKICMgQ09ORklHX0haXzMwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19IWl8xMDAwIGlzIG5vdCBzZXQKIENPTkZJR19IWj0yNTAKK0NPTkZJR19TQ0hFRF9IUlRJQ0s9eQogQ09ORklHX0dFTkVSSUNfVElNRT15CiBDT05GSUdfR0VORVJJQ19DTE9DS0VWRU5UUz15CiAjIENPTkZJR19DWUNMRVNfQ0xPQ0tTT1VSQ0UgaXMgbm90IHNldApAQCAtMjQ1LDYgKzI2NSwxMiBAQAogQ09ORklHX0NBQ0hFTElORV9BTElHTkVEX0wxPXkKICMgQ09ORklHX1NZU0NBTExfVEFCX0wxIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQTEJfU1dJVENIX1RBQl9MMSBpcyBub3Qgc2V0CitDT05GSUdfQVBQX1NUQUNLX0wxPXkKKworIworIyBTcGVlZCBPcHRpbWl6YXRpb25zCisjCitDT05GSUdfQkZJTl9JTlNfTE9XT1ZFUkhFQUQ9eQogQ09ORklHX1JBTUtFUk5FTD15CiAjIENPTkZJR19ST01LRVJORUwgaXMgbm90IHNldAogQ09ORklHX1NFTEVDVF9NRU1PUllfTU9ERUw9eQpAQCAtMjUzLDE0ICsyNzksMTMgQEAKICMgQ09ORklHX1NQQVJTRU1FTV9NQU5VQUwgaXMgbm90IHNldAogQ09ORklHX0ZMQVRNRU09eQogQ09ORklHX0ZMQVRfTk9ERV9NRU1fTUFQPXkKLSMgQ09ORklHX1NQQVJTRU1FTV9TVEFUSUMgaXMgbm90IHNldAotIyBDT05GSUdfU1BBUlNFTUVNX1ZNRU1NQVBfRU5BQkxFIGlzIG5vdCBzZXQKK0NPTkZJR19QQUdFRkxBR1NfRVhURU5ERUQ9eQogQ09ORklHX1NQTElUX1BUTE9DS19DUFVTPTQKICMgQ09ORklHX1JFU09VUkNFU182NEJJVCBpcyBub3Qgc2V0CisjIENPTkZJR19QSFlTX0FERFJfVF82NEJJVCBpcyBub3Qgc2V0CiBDT05GSUdfWk9ORV9ETUFfRkxBRz0xCiBDT05GSUdfVklSVF9UT19CVVM9eQotIyBDT05GSUdfQkZJTl9HUFRJTUVSUyBpcyBub3Qgc2V0Ci1DT05GSUdfQkZJTl9ETUFfNVhYPXkKK0NPTkZJR19CRklOX0dQVElNRVJTPW0KICMgQ09ORklHX0RNQV9VTkNBQ0hFRF80TSBpcyBub3Qgc2V0CiAjIENPTkZJR19ETUFfVU5DQUNIRURfMk0gaXMgbm90IHNldAogQ09ORklHX0RNQV9VTkNBQ0hFRF8xTT15CkBAIC0yNzUsNyArMzAwLDYgQEAKICMgQ09ORklHX0JGSU5fSUNBQ0hFX0xPQ0sgaXMgbm90IHNldAogIyBDT05GSUdfQkZJTl9XQiBpcyBub3Qgc2V0CiBDT05GSUdfQkZJTl9XVD15Ci1DT05GSUdfTDFfTUFYX1BJRUNFPTE2CiAjIENPTkZJR19NUFUgaXMgbm90IHNldAogCiAjCkBAIC0zMDQsNyArMzI4LDYgQEAKICMKICMgQnVzIG9wdGlvbnMgKFBDSSwgUENNQ0lBLCBFSVNBLCBNQ0EsIElTQSkKICMKLSMgQ09ORklHX1BDSSBpcyBub3Qgc2V0CiAjIENPTkZJR19BUkNIX1NVUFBPUlRTX01TSSBpcyBub3Qgc2V0CiAjIENPTkZJR19QQ0NBUkQgaXMgbm90IHNldAogCkBAIC0zMTUsMjkgKzMzOCwzMSBAQAogQ09ORklHX0JJTkZNVF9GTEFUPXkKIENPTkZJR19CSU5GTVRfWkZMQVQ9eQogIyBDT05GSUdfQklORk1UX1NIQVJFRF9GTEFUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hBVkVfQU9VVCBpcyBub3Qgc2V0CiAjIENPTkZJR19CSU5GTVRfTUlTQyBpcyBub3Qgc2V0CiAKICMKICMgUG93ZXIgbWFuYWdlbWVudCBvcHRpb25zCiAjCiBDT05GSUdfUE09eQotIyBDT05GSUdfUE1fTEVHQUNZIGlzIG5vdCBzZXQKICMgQ09ORklHX1BNX0RFQlVHIGlzIG5vdCBzZXQKIENPTkZJR19QTV9TTEVFUD15Ci1DT05GSUdfU1VTUEVORF9VUF9QT1NTSUJMRT15CiBDT05GSUdfU1VTUEVORD15CitDT05GSUdfU1VTUEVORF9GUkVFWkVSPXkKK0NPTkZJR19BUkNIX1NVU1BFTkRfUE9TU0lCTEU9eQogQ09ORklHX1BNX0JGSU5fU0xFRVBfREVFUEVSPXkKICMgQ09ORklHX1BNX0JGSU5fU0xFRVAgaXMgbm90IHNldAogIyBDT05GSUdfUE1fV0FLRVVQX0JZX0dQSU8gaXMgbm90IHNldAogCiAjCisjIFBvc3NpYmxlIFN1c3BlbmQgTWVtIC8gSGliZXJuYXRlIFdha2UtVXAgU291cmNlcworIworIyBDT05GSUdfUE1fQkZJTl9XQUtFX1BINiBpcyBub3Qgc2V0CisKKyMKICMgQ1BVIEZyZXF1ZW5jeSBzY2FsaW5nCiAjCiAjIENPTkZJR19DUFVfRlJFUSBpcyBub3Qgc2V0Ci0KLSMKLSMgTmV0d29ya2luZwotIwogQ09ORklHX05FVD15CiAKICMKQEAgLTM1MCw2ICszNzUsNyBAQAogIyBDT05GSUdfWEZSTV9VU0VSIGlzIG5vdCBzZXQKICMgQ09ORklHX1hGUk1fU1VCX1BPTElDWSBpcyBub3Qgc2V0CiAjIENPTkZJR19YRlJNX01JR1JBVEUgaXMgbm90IHNldAorIyBDT05GSUdfWEZSTV9TVEFUSVNUSUNTIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVF9LRVkgaXMgbm90IHNldAogQ09ORklHX0lORVQ9eQogIyBDT05GSUdfSVBfTVVMVElDQVNUIGlzIG5vdCBzZXQKQEAgLTM3OSw4ICs0MDUsNiBAQAogQ09ORklHX0RFRkFVTFRfVENQX0NPTkc9ImN1YmljIgogIyBDT05GSUdfVENQX01ENVNJRyBpcyBub3Qgc2V0CiAjIENPTkZJR19JUFY2IGlzIG5vdCBzZXQKLSMgQ09ORklHX0lORVQ2X1hGUk1fVFVOTkVMIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lORVQ2X1RVTk5FTCBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRMQUJFTCBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRXT1JLX1NFQ01BUksgaXMgbm90IHNldAogIyBDT05GSUdfTkVURklMVEVSIGlzIG5vdCBzZXQKQEAgLTM4OSw2ICs0MTMsNyBAQAogIyBDT05GSUdfVElQQyBpcyBub3Qgc2V0CiAjIENPTkZJR19BVE0gaXMgbm90IHNldAogIyBDT05GSUdfQlJJREdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9EU0EgaXMgbm90IHNldAogIyBDT05GSUdfVkxBTl84MDIxUSBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUNORVQgaXMgbm90IHNldAogIyBDT05GSUdfTExDMiBpcyBub3Qgc2V0CkBAIC00MDUsNiArNDMwLDcgQEAKICMKICMgQ09ORklHX05FVF9QS1RHRU4gaXMgbm90IHNldAogIyBDT05GSUdfSEFNUkFESU8gaXMgbm90IHNldAorIyBDT05GSUdfQ0FOIGlzIG5vdCBzZXQKIENPTkZJR19JUkRBPW0KIAogIwpAQCAtNDQwLDI0ICs0NjYsMTQgQEAKICMgQ09ORklHX0RPTkdMRSBpcyBub3Qgc2V0CiAKICMKLSMgT2xkIFNJUiBkZXZpY2UgZHJpdmVycwotIwotIyBDT05GSUdfSVJQT1JUX1NJUiBpcyBub3Qgc2V0Ci0KLSMKLSMgT2xkIFNlcmlhbCBkb25nbGUgc3VwcG9ydAotIwotCi0jCiAjIEZJUiBkZXZpY2UgZHJpdmVycwogIwogIyBDT05GSUdfQlQgaXMgbm90IHNldAogIyBDT05GSUdfQUZfUlhSUEMgaXMgbm90IHNldAotCi0jCi0jIFdpcmVsZXNzCi0jCisjIENPTkZJR19QSE9ORVQgaXMgbm90IHNldAorQ09ORklHX1dJUkVMRVNTPXkKICMgQ09ORklHX0NGRzgwMjExIGlzIG5vdCBzZXQKK0NPTkZJR19XSVJFTEVTU19PTERfUkVHVUxBVE9SWT15CiAjIENPTkZJR19XSVJFTEVTU19FWFQgaXMgbm90IHNldAogIyBDT05GSUdfTUFDODAyMTEgaXMgbm90IHNldAogIyBDT05GSUdfSUVFRTgwMjExIGlzIG5vdCBzZXQKQEAgLTQ3NSw2ICs0OTEsOCBAQAogQ09ORklHX1NUQU5EQUxPTkU9eQogQ09ORklHX1BSRVZFTlRfRklSTVdBUkVfQlVJTEQ9eQogIyBDT05GSUdfRldfTE9BREVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0RSSVZFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19ERVZSRVMgaXMgbm90IHNldAogIyBDT05GSUdfU1lTX0hZUEVSVklTT1IgaXMgbm90IHNldAogIyBDT05GSUdfQ09OTkVDVE9SIGlzIG5vdCBzZXQKIENPTkZJR19NVEQ9eQpAQCAtNDgzLDYgKzUwMSw3IEBACiBDT05GSUdfTVREX1BBUlRJVElPTlM9eQogIyBDT05GSUdfTVREX1JFREJPT1RfUEFSVFMgaXMgbm90IHNldAogQ09ORklHX01URF9DTURMSU5FX1BBUlRTPXkKKyMgQ09ORklHX01URF9BUjdfUEFSVFMgaXMgbm90IHNldAogCiAjCiAjIFVzZXIgTW9kdWxlcyBBbmQgVHJhbnNsYXRpb24gTGF5ZXJzCkBAIC01NTMsMTUgKzU3MiwxMSBAQAogIyBDT05GSUdfTVREX05BTkRfVkVSSUZZX1dSSVRFIGlzIG5vdCBzZXQKICMgQ09ORklHX01URF9OQU5EX0VDQ19TTUMgaXMgbm90IHNldAogIyBDT05GSUdfTVREX05BTkRfTVVTRVVNX0lEUyBpcyBub3Qgc2V0Ci1DT05GSUdfTVREX05BTkRfQkZJTj1tCi1DT05GSUdfQkZJTl9OQU5EX0JBU0U9MHgyMDIxMjAwMAotQ09ORklHX0JGSU5fTkFORF9DTEU9MgotQ09ORklHX0JGSU5fTkFORF9BTEU9MQotQ09ORklHX0JGSU5fTkFORF9SRUFEWT0zCisjIENPTkZJR19NVERfTkFORF9CRklOIGlzIG5vdCBzZXQKIENPTkZJR19NVERfTkFORF9JRFM9bQogIyBDT05GSUdfTVREX05BTkRfRElTS09OQ0hJUCBpcyBub3Qgc2V0CiAjIENPTkZJR19NVERfTkFORF9OQU5EU0lNIGlzIG5vdCBzZXQKLSMgQ09ORklHX01URF9OQU5EX1BMQVRGT1JNIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfTkFORF9QTEFURk9STT1tCiAjIENPTkZJR19NVERfT05FTkFORCBpcyBub3Qgc2V0CiAKICMKQEAgLTU3NiwxMSArNTkxLDE0IEBACiBDT05GSUdfQkxLX0RFVl9SQU09eQogQ09ORklHX0JMS19ERVZfUkFNX0NPVU5UPTE2CiBDT05GSUdfQkxLX0RFVl9SQU1fU0laRT00MDk2Ci1DT05GSUdfQkxLX0RFVl9SQU1fQkxPQ0tTSVpFPTEwMjQKKyMgQ09ORklHX0JMS19ERVZfWElQIGlzIG5vdCBzZXQKICMgQ09ORklHX0NEUk9NX1BLVENEVkQgaXMgbm90IHNldAogIyBDT05GSUdfQVRBX09WRVJfRVRIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSEQgaXMgbm90IHNldAogQ09ORklHX01JU0NfREVWSUNFUz15CiAjIENPTkZJR19FRVBST01fOTNDWDYgaXMgbm90IHNldAorIyBDT05GSUdfRU5DTE9TVVJFX1NFUlZJQ0VTIGlzIG5vdCBzZXQKK0NPTkZJR19IQVZFX0lERT15CiAjIENPTkZJR19JREUgaXMgbm90IHNldAogCiAjCkBAIC01OTMsNyArNjExLDYgQEAKICMgQ09ORklHX0FUQSBpcyBub3Qgc2V0CiAjIENPTkZJR19NRCBpcyBub3Qgc2V0CiBDT05GSUdfTkVUREVWSUNFUz15Ci0jIENPTkZJR19ORVRERVZJQ0VTX01VTFRJUVVFVUUgaXMgbm90IHNldAogIyBDT05GSUdfRFVNTVkgaXMgbm90IHNldAogIyBDT05GSUdfQk9ORElORyBpcyBub3Qgc2V0CiAjIENPTkZJR19NQUNWTEFOIGlzIG5vdCBzZXQKQEAgLTYxNCw2ICs2MzEsNyBAQAogQ09ORklHX1NNU0NfUEhZPXkKICMgQ09ORklHX0JST0FEQ09NX1BIWSBpcyBub3Qgc2V0CiAjIENPTkZJR19JQ1BMVVNfUEhZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JFQUxURUtfUEhZIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZJWEVEX1BIWSBpcyBub3Qgc2V0CiAjIENPTkZJR19NRElPX0JJVEJBTkcgaXMgbm90IHNldAogQ09ORklHX05FVF9FVEhFUk5FVD15CkBAIC02MjYsMTEgKzY0NCwxNCBAQAogIyBDT05GSUdfU01DOTFYIGlzIG5vdCBzZXQKICMgQ09ORklHX1NNU0M5MTFYIGlzIG5vdCBzZXQKICMgQ09ORklHX0RNOTAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19FTkMyOEo2MCBpcyBub3Qgc2V0CiAjIENPTkZJR19JQk1fTkVXX0VNQUNfWk1JSSBpcyBub3Qgc2V0CiAjIENPTkZJR19JQk1fTkVXX0VNQUNfUkdNSUkgaXMgbm90IHNldAogIyBDT05GSUdfSUJNX05FV19FTUFDX1RBSCBpcyBub3Qgc2V0CiAjIENPTkZJR19JQk1fTkVXX0VNQUNfRU1BQzQgaXMgbm90IHNldAotIyBDT05GSUdfQjQ0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0lCTV9ORVdfRU1BQ19OT19GTE9XX0NUUkwgaXMgbm90IHNldAorIyBDT05GSUdfSUJNX05FV19FTUFDX01BTF9DTFJfSUNJTlRTVEFUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lCTV9ORVdfRU1BQ19NQUxfQ09NTU9OX0VSUiBpcyBub3Qgc2V0CiBDT05GSUdfTkVUREVWXzEwMDA9eQogIyBDT05GSUdfQVg4ODE4MCBpcyBub3Qgc2V0CiBDT05GSUdfTkVUREVWXzEwMDAwPXkKQEAgLTY0MCwxMCArNjYxLDEwIEBACiAjCiAjIENPTkZJR19XTEFOX1BSRTgwMjExIGlzIG5vdCBzZXQKICMgQ09ORklHX1dMQU5fODAyMTEgaXMgbm90IHNldAorIyBDT05GSUdfSVdMV0lGSV9MRURTIGlzIG5vdCBzZXQKICMgQ09ORklHX1dBTiBpcyBub3Qgc2V0CiAjIENPTkZJR19QUFAgaXMgbm90IHNldAogIyBDT05GSUdfU0xJUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSEFQRVIgaXMgbm90IHNldAogIyBDT05GSUdfTkVUQ09OU09MRSBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRQT0xMIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIgaXMgbm90IHNldApAQCAtNjc1LDEyICs2OTYsMTUgQEAKICMgQ09ORklHX0lOUFVUX1RPVUNIU0NSRUVOIGlzIG5vdCBzZXQKIENPTkZJR19JTlBVVF9NSVNDPXkKICMgQ09ORklHX0lOUFVUX1VJTlBVVCBpcyBub3Qgc2V0Ci1DT05GSUdfVFdJX0tFWVBBRD1tCitDT05GSUdfQ09ORklHX0lOUFVUX1BDRjg1NzQ9bQogCiAjCiAjIEhhcmR3YXJlIEkvTyBwb3J0cwogIwotIyBDT05GSUdfU0VSSU8gaXMgbm90IHNldAorQ09ORklHX1NFUklPPXkKK0NPTkZJR19TRVJJT19TRVJQT1JUPXkKK0NPTkZJR19TRVJJT19MSUJQUzI9eQorIyBDT05GSUdfU0VSSU9fUkFXIGlzIG5vdCBzZXQKICMgQ09ORklHX0dBTUVQT1JUIGlzIG5vdCBzZXQKIAogIwpAQCAtNjkxLDExICs3MTUsMTQgQEAKICMgQ09ORklHX0JGNXh4X1BQSUZDRCBpcyBub3Qgc2V0CiAjIENPTkZJR19CRklOX1NJTVBMRV9USU1FUiBpcyBub3Qgc2V0CiAjIENPTkZJR19CRjV4eF9QUEkgaXMgbm90IHNldAotQ09ORklHX0JGSU5fU1BPUlQ9eQorQ09ORklHX0JGSU5fU1BPUlQ9bQogIyBDT05GSUdfQkZJTl9USU1FUl9MQVRFTkNZIGlzIG5vdCBzZXQKIENPTkZJR19UV0lfTENEPW0KK0NPTkZJR19CRklOX0RNQV9JTlRFUkZBQ0U9bQogQ09ORklHX1NJTVBMRV9HUElPPW0KICMgQ09ORklHX1ZUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFVktNRU0gaXMgbm90IHNldAorIyBDT05GSUdfQkZJTl9KVEFHX0NPTU0gaXMgbm90IHNldAogIyBDT05GSUdfU0VSSUFMX05PTlNUQU5EQVJEIGlzIG5vdCBzZXQKIAogIwpAQCAtNzI3LDQ4ICs3NTQsNTEgQEAKICMKICMgbGludXggZW1iZWRkZWQgZHJpdmVycwogIwotIyBDT05GSUdfQ0FOX01DRjUyODIgaXMgbm90IHNldAotIyBDT05GSUdfQ0FOX1VOQ1RXSU5DQU4gaXMgbm90IHNldAogQ09ORklHX0NBTl9CTEFDS0ZJTj1tCiAjIENPTkZJR19JUE1JX0hBTkRMRVIgaXMgbm90IHNldAogIyBDT05GSUdfSFdfUkFORE9NIGlzIG5vdCBzZXQKLSMgQ09ORklHX0dFTl9SVEMgaXMgbm90IHNldAogIyBDT05GSUdfUjM5NjQgaXMgbm90IHNldAogIyBDT05GSUdfUkFXX0RSSVZFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19UQ0dfVFBNIGlzIG5vdCBzZXQKIENPTkZJR19JMkM9bQogQ09ORklHX0kyQ19CT0FSRElORk89eQogQ09ORklHX0kyQ19DSEFSREVWPW0KLQotIwotIyBJMkMgQWxnb3JpdGhtcwotIwotIyBDT05GSUdfSTJDX0FMR09CSVQgaXMgbm90IHNldAotIyBDT05GSUdfSTJDX0FMR09QQ0YgaXMgbm90IHNldAotIyBDT05GSUdfSTJDX0FMR09QQ0EgaXMgbm90IHNldAorQ09ORklHX0kyQ19IRUxQRVJfQVVUTz15CiAKICMKICMgSTJDIEhhcmR3YXJlIEJ1cyBzdXBwb3J0CiAjCisKKyMKKyMgSTJDIHN5c3RlbSBidXMgZHJpdmVycyAobW9zdGx5IGVtYmVkZGVkIC8gc3lzdGVtLW9uLWNoaXApCisjCiBDT05GSUdfSTJDX0JMQUNLRklOX1RXST1tCi1DT05GSUdfSTJDX0JMQUNLRklOX1RXSV9DTEtfS0haPTUwCitDT05GSUdfSTJDX0JMQUNLRklOX1RXSV9DTEtfS0haPTEwMAogIyBDT05GSUdfSTJDX0dQSU8gaXMgbm90IHNldAogIyBDT05GSUdfSTJDX09DT1JFUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19JMkNfUEFSUE9SVF9MSUdIVCBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfU0lNVEVDIGlzIG5vdCBzZXQKKworIworIyBFeHRlcm5hbCBJMkMvU01CdXMgYWRhcHRlciBkcml2ZXJzCisjCisjIENPTkZJR19JMkNfUEFSUE9SVF9MSUdIVCBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfVEFPU19FVk0gaXMgbm90IHNldAorCisjCisjIE90aGVyIEkyQy9TTUJ1cyBidXMgZHJpdmVycworIworIyBDT05GSUdfSTJDX1BDQV9QTEFURk9STSBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfU1RVQiBpcyBub3Qgc2V0CiAKICMKICMgTWlzY2VsbGFuZW91cyBJMkMgQ2hpcCBzdXBwb3J0CiAjCi0jIENPTkZJR19TRU5TT1JTX0RTMTMzNyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX0RTMTM3NCBpcyBub3Qgc2V0CiAjIENPTkZJR19EUzE2ODIgaXMgbm90IHNldAorIyBDT05GSUdfQVQyNCBpcyBub3Qgc2V0CiBDT05GSUdfU0VOU09SU19BRDUyNTI9bQogIyBDT05GSUdfU0VOU09SU19FRVBST00gaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19QQ0Y4NTc0IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfUENGODU3NSBpcyBub3Qgc2V0CisjIENPTkZJR19QQ0Y4NTc1IGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfUENBOTUzOSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1BDRjg1OTEgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19NQVg2ODc1IGlzIG5vdCBzZXQKQEAgLTc3NywxNyArODA3LDE1IEBACiAjIENPTkZJR19JMkNfREVCVUdfQUxHTyBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfREVCVUdfQlVTIGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19ERUJVR19DSElQIGlzIG5vdCBzZXQKLQotIwotIyBTUEkgc3VwcG9ydAotIwogQ09ORklHX1NQST15CisjIENPTkZJR19TUElfREVCVUcgaXMgbm90IHNldAogQ09ORklHX1NQSV9NQVNURVI9eQogCiAjCiAjIFNQSSBNYXN0ZXIgQ29udHJvbGxlciBEcml2ZXJzCiAjCiBDT05GSUdfU1BJX0JGSU49eQorIyBDT05GSUdfU1BJX0JGSU5fTE9DSyBpcyBub3Qgc2V0CiAjIENPTkZJR19TUElfQklUQkFORyBpcyBub3Qgc2V0CiAKICMKQEAgLTc5NiwxMSArODI0LDE1IEBACiAjIENPTkZJR19TUElfQVQyNSBpcyBub3Qgc2V0CiAjIENPTkZJR19TUElfU1BJREVWIGlzIG5vdCBzZXQKICMgQ09ORklHX1NQSV9UTEU2MlgwIGlzIG5vdCBzZXQKK0NPTkZJR19BUkNIX1dBTlRfT1BUSU9OQUxfR1BJT0xJQj15CisjIENPTkZJR19HUElPTElCIGlzIG5vdCBzZXQKICMgQ09ORklHX1cxIGlzIG5vdCBzZXQKICMgQ09ORklHX1BPV0VSX1NVUFBMWSBpcyBub3Qgc2V0CiBDT05GSUdfSFdNT049eQogIyBDT05GSUdfSFdNT05fVklEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQUQ3NDE0IGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfQUQ3NDE4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQURDWFggaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19BRE0xMDIxIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfQURNMTAyNSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0FETTEwMjYgaXMgbm90IHNldApAQCAtODA4LDYgKzg0MCw3IEBACiAjIENPTkZJR19TRU5TT1JTX0FETTEwMzEgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19BRE05MjQwIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfQURUNzQ3MCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FEVDc0NzMgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19BVFhQMSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0RTMTYyMSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0Y3MTgwNUYgaXMgbm90IHNldApAQCAtODI4LDYgKzg2MSw3IEBACiAjIENPTkZJR19TRU5TT1JTX0xNOTAgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19MTTkyIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfTE05MyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX01BWDExMTEgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19NQVgxNjE5IGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfTUFYNjY1MCBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1BDODczNjAgaXMgbm90IHNldApAQCAtODM2LDYgKzg3MCw3IEBACiAjIENPTkZJR19TRU5TT1JTX1NNU0M0N00xIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfU01TQzQ3TTE5MiBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1NNU0M0N0IzOTcgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRFM3ODI4IGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfVEhNQzUwIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfVlQxMjExIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfVzgzNzgxRCBpcyBub3Qgc2V0CkBAIC04NDMsOSArODc4LDEyIEBACiAjIENPTkZJR19TRU5TT1JTX1c4Mzc5MkQgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19XODM3OTMgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19XODNMNzg1VFMgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19XODNMNzg2TkcgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19XODM2MjdIRiBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1c4MzYyN0VIRiBpcyBub3Qgc2V0CiAjIENPTkZJR19IV01PTl9ERUJVR19DSElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RIRVJNQUwgaXMgbm90IHNldAorIyBDT05GSUdfVEhFUk1BTF9IV01PTiBpcyBub3Qgc2V0CiBDT05GSUdfV0FUQ0hET0c9eQogIyBDT05GSUdfV0FUQ0hET0dfTk9XQVlPVVQgaXMgbm90IHNldAogCkBAIC04NTYsMjEgKzg5NCwyOSBAQAogQ09ORklHX0JGSU5fV0RUPXkKIAogIwotIyBTb25pY3MgU2lsaWNvbiBCYWNrcGxhbmUKLSMKLUNPTkZJR19TU0JfUE9TU0lCTEU9eQotIyBDT05GSUdfU1NCIGlzIG5vdCBzZXQKLQotIwogIyBNdWx0aWZ1bmN0aW9uIGRldmljZSBkcml2ZXJzCiAjCisjIENPTkZJR19NRkRfQ09SRSBpcyBub3Qgc2V0CiAjIENPTkZJR19NRkRfU001MDEgaXMgbm90IHNldAorIyBDT05GSUdfSFRDX1BBU0lDMyBpcyBub3Qgc2V0CisjIENPTkZJR19NRkRfVE1JTyBpcyBub3Qgc2V0CisjIENPTkZJR19NRkRfV004NDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9XTTgzNTBfSTJDIGlzIG5vdCBzZXQKIAogIwogIyBNdWx0aW1lZGlhIGRldmljZXMKICMKKworIworIyBNdWx0aW1lZGlhIGNvcmUgc3VwcG9ydAorIwogIyBDT05GSUdfVklERU9fREVWIGlzIG5vdCBzZXQKICMgQ09ORklHX0RWQl9DT1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZJREVPX01FRElBIGlzIG5vdCBzZXQKKworIworIyBNdWx0aW1lZGlhIGRyaXZlcnMKKyMKICMgQ09ORklHX0RBQiBpcyBub3Qgc2V0CiAKICMKQEAgLTg4MSw2ICs5MjcsNyBAQAogQ09ORklHX0ZCPW0KIENPTkZJR19GSVJNV0FSRV9FRElEPXkKICMgQ09ORklHX0ZCX0REQyBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9CT09UX1ZFU0FfU1VQUE9SVCBpcyBub3Qgc2V0CiBDT05GSUdfRkJfQ0ZCX0ZJTExSRUNUPW0KIENPTkZJR19GQl9DRkJfQ09QWUFSRUE9bQogQ09ORklHX0ZCX0NGQl9JTUFHRUJMSVQ9bQpAQCAtODg4LDggKzkzNSw4IEBACiAjIENPTkZJR19GQl9TWVNfRklMTFJFQ1QgaXMgbm90IHNldAogIyBDT05GSUdfRkJfU1lTX0NPUFlBUkVBIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZCX1NZU19JTUFHRUJMSVQgaXMgbm90IHNldAorIyBDT05GSUdfRkJfRk9SRUlHTl9FTkRJQU4gaXMgbm90IHNldAogIyBDT05GSUdfRkJfU1lTX0ZPUFMgaXMgbm90IHNldAotQ09ORklHX0ZCX0RFRkVSUkVEX0lPPXkKICMgQ09ORklHX0ZCX1NWR0FMSUIgaXMgbm90IHNldAogIyBDT05GSUdfRkJfTUFDTU9ERVMgaXMgbm90IHNldAogIyBDT05GSUdfRkJfQkFDS0xJR0hUIGlzIG5vdCBzZXQKQEAgLTg5OSw4ICs5NDYsMTIgQEAKICMKICMgRnJhbWUgYnVmZmVyIGhhcmR3YXJlIGRyaXZlcnMKICMKLSMgQ09ORklHX0ZCX0hJVEFDSElfVFgwOSBpcyBub3Qgc2V0CiAjIENPTkZJR19GQl9CRklOX1QzNTBNQ1FCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX0JGSU5fTFEwMzVRMSBpcyBub3Qgc2V0CitDT05GSUdfRkJfQkY1MzdfTFEwMzU9bQorQ09ORklHX0xRMDM1X1NMQVZFX0FERFI9MHg1OAorIyBDT05GSUdfRkJfQkZJTl9MQU5EU0NBUEUgaXMgbm90IHNldAorIyBDT05GSUdfRkJfQkZJTl9CR1IgaXMgbm90IHNldAogQ09ORklHX0ZCX0JGSU5fNzM5Mz1tCiBDT05GSUdfTlRTQz15CiAjIENPTkZJR19QQUwgaXMgbm90IHNldApAQCAtOTEwLDE1ICs5NjEsMTcgQEAKICMgQ09ORklHX1BBTF9ZQ0JDUiBpcyBub3Qgc2V0CiBDT05GSUdfQURWNzM5M18xWE1FTT15CiAjIENPTkZJR19BRFY3MzkzXzJYTUVNIGlzIG5vdCBzZXQKLUNPTkZJR19GQl9CRjUzN19MUTAzNT1tCi1DT05GSUdfTFEwMzVfU0xBVkVfQUREUj0weDU4Ci0jIENPTkZJR19GQl9CRklOX0xBTkRTQ0FQRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19GQl9CRklOX0JHUiBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9ISVRBQ0hJX1RYMDkgaXMgbm90IHNldAogIyBDT05GSUdfRkJfUzFEMTNYWFggaXMgbm90IHNldAogIyBDT05GSUdfRkJfVklSVFVBTCBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9NRVRST05PTUUgaXMgbm90IHNldAogQ09ORklHX0JBQ0tMSUdIVF9MQ0RfU1VQUE9SVD15CiBDT05GSUdfTENEX0NMQVNTX0RFVklDRT1tCiAjIENPTkZJR19MQ0RfTFRWMzUwUVYgaXMgbm90IHNldAorIyBDT05GSUdfTENEX0lMSTkzMjAgaXMgbm90IHNldAorIyBDT05GSUdfTENEX1RETzI0TSBpcyBub3Qgc2V0CisjIENPTkZJR19MQ0RfVkdHMjQzMkE0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0xDRF9QTEFURk9STSBpcyBub3Qgc2V0CiBDT05GSUdfQkFDS0xJR0hUX0NMQVNTX0RFVklDRT1tCiBDT05GSUdfQkFDS0xJR0hUX0NPUkdJPW0KIApAQCAtOTI3LDE1ICs5ODAsOCBAQAogIwogIyBDT05GSUdfRElTUExBWV9TVVBQT1JUIGlzIG5vdCBzZXQKICMgQ09ORklHX0xPR08gaXMgbm90IHNldAotCi0jCi0jIFNvdW5kCi0jCiBDT05GSUdfU09VTkQ9bQotCi0jCi0jIEFkdmFuY2VkIExpbnV4IFNvdW5kIEFyY2hpdGVjdHVyZQotIworQ09ORklHX1NPVU5EX09TU19DT1JFPXkKIENPTkZJR19TTkQ9bQogQ09ORklHX1NORF9USU1FUj1tCiBDT05GSUdfU05EX1BDTT1tCkBAIC05NDksMTggKzk5NSwxMiBAQAogQ09ORklHX1NORF9WRVJCT1NFX1BST0NGUz15CiAjIENPTkZJR19TTkRfVkVSQk9TRV9QUklOVEsgaXMgbm90IHNldAogIyBDT05GSUdfU05EX0RFQlVHIGlzIG5vdCBzZXQKLQotIwotIyBHZW5lcmljIGRldmljZXMKLSMKK0NPTkZJR19TTkRfRFJJVkVSUz15CiAjIENPTkZJR19TTkRfRFVNTVkgaXMgbm90IHNldAogIyBDT05GSUdfU05EX01UUEFWIGlzIG5vdCBzZXQKICMgQ09ORklHX1NORF9TRVJJQUxfVTE2NTUwIGlzIG5vdCBzZXQKICMgQ09ORklHX1NORF9NUFU0MDEgaXMgbm90IHNldAotCi0jCi0jIFNQSSBkZXZpY2VzCi0jCitDT05GSUdfU05EX1NQST15CiAKICMKICMgQUxTQSBCbGFja2ZpbiBkZXZpY2VzCkBAIC05NzIsNTEgKzEwMTIsNDYgQEAKICMgQ09ORklHX1NORF9CTEFDS0ZJTl9BRDE4MzZfNVAxIGlzIG5vdCBzZXQKIENPTkZJR19TTkRfQkxBQ0tGSU5fU1BPUlQ9MAogQ09ORklHX1NORF9CTEFDS0ZJTl9TUElfUEZCSVQ9NAotQ09ORklHX1NORF9CRklOX0FENzMzMTE9bQogQ09ORklHX1NORF9CRklOX1NQT1JUPTAKLUNPTkZJR19TTkRfQkZJTl9BRDczMzExX1NFPTQKIENPTkZJR19TTkRfQkZJTl9BRDczMzIyPW0KIENPTkZJR19TTkRfQkZJTl9BRDczMzIyX1NQT1JUMF9TRT0xMAogQ09ORklHX1NORF9CRklOX0FENzMzMjJfU1BPUlQxX1NFPTE0CiBDT05GSUdfU05EX0JGSU5fQUQ3MzMyMl9SRVNFVD0xMgotCi0jCi0jIFN5c3RlbSBvbiBDaGlwIGF1ZGlvIHN1cHBvcnQKLSMKLUNPTkZJR19TTkRfU09DX0FDOTdfQlVTPXkKIENPTkZJR19TTkRfU09DPW0KLUNPTkZJR19TTkRfQkY1WFhfU09DPW0KLUNPTkZJR19TTkRfTU1BUF9TVVBQT1JUPXkKLUNPTkZJR19TTkRfQkY1WFhfU09DX0FDOTc9bQotIyBDT05GSUdfU05EX0JGNVhYX1NPQ19XTTg3NTAgaXMgbm90IHNldAotIyBDT05GSUdfU05EX0JGNVhYX1NPQ19XTTg3MzEgaXMgbm90IHNldAorQ09ORklHX1NORF9TT0NfQUM5N19CVVM9eQorQ09ORklHX1NORF9CRjVYWF9JMlM9bQogIyBDT05GSUdfU05EX0JGNVhYX1NPQ19TU00yNjAyIGlzIG5vdCBzZXQKLUNPTkZJR19TTkRfQkY1WFhfU09DX0JGNXh4PW0KK0NPTkZJR19TTkRfQkY1WFhfU09DX0FENzMzMTE9bQorQ09ORklHX1NORF9CRklOX0FENzMzMTFfU0U9NAorQ09ORklHX1NORF9CRjVYWF9BQzk3PW0KK0NPTkZJR19TTkRfQkY1WFhfTU1BUF9TVVBQT1JUPXkKKyMgQ09ORklHX1NORF9CRjVYWF9NVUxUSUNIQU5fU1VQUE9SVCBpcyBub3Qgc2V0CitDT05GSUdfU05EX0JGNVhYX1NPQ19TUE9SVD1tCitDT05GSUdfU05EX0JGNVhYX1NPQ19JMlM9bQorQ09ORklHX1NORF9CRjVYWF9TT0NfQUM5Nz1tCitDT05GSUdfU05EX0JGNVhYX1NPQ19BRDE5ODA9bQogQ09ORklHX1NORF9CRjVYWF9TUE9SVF9OVU09MAogIyBDT05GSUdfU05EX0JGNVhYX0hBVkVfQ09MRF9SRVNFVCBpcyBub3Qgc2V0Ci0KLSMKLSMgU29DIEF1ZGlvIHN1cHBvcnQgZm9yIFN1cGVySAotIworIyBDT05GSUdfU05EX1NPQ19BTExfQ09ERUNTIGlzIG5vdCBzZXQKIENPTkZJR19TTkRfU09DX0FEMTk4MD1tCi0KLSMKLSMgT3BlbiBTb3VuZCBTeXN0ZW0KLSMKK0NPTkZJR19TTkRfU09DX0FENzMzMTE9bQogIyBDT05GSUdfU09VTkRfUFJJTUUgaXMgbm90IHNldAogQ09ORklHX0FDOTdfQlVTPW0KIENPTkZJR19ISURfU1VQUE9SVD15CiBDT05GSUdfSElEPXkKICMgQ09ORklHX0hJRF9ERUJVRyBpcyBub3Qgc2V0CiAjIENPTkZJR19ISURSQVcgaXMgbm90IHNldAorIyBDT05GSUdfSElEX1BJRCBpcyBub3Qgc2V0CisKKyMKKyMgU3BlY2lhbCBISUQgZHJpdmVycworIworQ09ORklHX0hJRF9DT01QQVQ9eQogIyBDT05GSUdfVVNCX1NVUFBPUlQgaXMgbm90IHNldAotIyBDT05GSUdfTk9fRFVNTVlfREVMQVkgaXMgbm90IHNldAotIyBDT05GSUdfRFVNTVlfREVMQVlfQkFOSzAgaXMgbm90IHNldAotIyBDT05GSUdfRFVNTVlfREVMQVlfQkFOSzEgaXMgbm90IHNldAotIyBDT05GSUdfRFVNTVlfREVMQVlfQkFOSzIgaXMgbm90IHNldAotIyBDT05GSUdfRFVNTVlfREVMQVlfQkFOSzMgaXMgbm90IHNldAogIyBDT05GSUdfTU1DIGlzIG5vdCBzZXQKKyMgQ09ORklHX01FTVNUSUNLIGlzIG5vdCBzZXQKICMgQ09ORklHX05FV19MRURTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FDQ0VTU0lCSUxJVFkgaXMgbm90IHNldAogQ09ORklHX1JUQ19MSUI9eQogQ09ORklHX1JUQ19DTEFTUz15CiBDT05GSUdfUlRDX0hDVE9TWVM9eQpAQCAtMTA0NSw1MSArMTA4MCw1NyBAQAogIyBDT05GSUdfUlRDX0RSVl9QQ0Y4NTYzIGlzIG5vdCBzZXQKICMgQ09ORklHX1JUQ19EUlZfUENGODU4MyBpcyBub3Qgc2V0CiAjIENPTkZJR19SVENfRFJWX000MVQ4MCBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX1MzNTM5MEEgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9GTTMxMzAgaXMgbm90IHNldAogCiAjCiAjIFNQSSBSVEMgZHJpdmVycwogIwotIyBDT05GSUdfUlRDX0RSVl9SUzVDMzQ4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfTTQxVDk0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfRFMxMzA1IGlzIG5vdCBzZXQKICMgQ09ORklHX1JUQ19EUlZfTUFYNjkwMiBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX1I5NzAxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfUlM1QzM0OCBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX0RTMzIzNCBpcyBub3Qgc2V0CiAKICMKICMgUGxhdGZvcm0gUlRDIGRyaXZlcnMKICMKKyMgQ09ORklHX1JUQ19EUlZfRFMxMjg2IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfRFMxNTExIGlzIG5vdCBzZXQKICMgQ09ORklHX1JUQ19EUlZfRFMxNTUzIGlzIG5vdCBzZXQKLSMgQ09ORklHX1JUQ19EUlZfU1RLMTdUQTggaXMgbm90IHNldAogIyBDT05GSUdfUlRDX0RSVl9EUzE3NDIgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9TVEsxN1RBOCBpcyBub3Qgc2V0CiAjIENPTkZJR19SVENfRFJWX000OFQ4NiBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX000OFQzNSBpcyBub3Qgc2V0CiAjIENPTkZJR19SVENfRFJWX000OFQ1OSBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX0JRNDgwMiBpcyBub3Qgc2V0CiAjIENPTkZJR19SVENfRFJWX1YzMDIwIGlzIG5vdCBzZXQKIAogIwogIyBvbi1DUFUgUlRDIGRyaXZlcnMKICMKIENPTkZJR19SVENfRFJWX0JGSU49eQotCi0jCi0jIFVzZXJzcGFjZSBJL08KLSMKKyMgQ09ORklHX0RNQURFVklDRVMgaXMgbm90IHNldAogIyBDT05GSUdfVUlPIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NUQUdJTkcgaXMgbm90IHNldAogCiAjCiAjIEZpbGUgc3lzdGVtcwogIwogIyBDT05GSUdfRVhUMl9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19FWFQzX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0VYVDRERVZfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRVhUNF9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19SRUlTRVJGU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19KRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfRlNfUE9TSVhfQUNMIGlzIG5vdCBzZXQKK0NPTkZJR19GSUxFX0xPQ0tJTkc9eQogIyBDT05GSUdfWEZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0dGUzJfRlMgaXMgbm90IHNldAogIyBDT05GSUdfT0NGUzJfRlMgaXMgbm90IHNldAotIyBDT05GSUdfTUlOSVhfRlMgaXMgbm90IHNldAotIyBDT05GSUdfUk9NRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRE5PVElGWSBpcyBub3Qgc2V0CiBDT05GSUdfSU5PVElGWT15CiBDT05GSUdfSU5PVElGWV9VU0VSPXkKICMgQ09ORklHX1FVT1RBIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ROT1RJRlkgaXMgbm90IHNldAogIyBDT05GSUdfQVVUT0ZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0FVVE9GUzRfRlMgaXMgbm90IHNldAogIyBDT05GSUdfRlVTRV9GUyBpcyBub3Qgc2V0CkBAIC0xMTI5LDExICsxMTcwLDExIEBACiAjIENPTkZJR19FRlNfRlMgaXMgbm90IHNldAogQ09ORklHX1lBRkZTX0ZTPW0KIENPTkZJR19ZQUZGU19ZQUZGUzE9eQorIyBDT05GSUdfWUFGRlNfOUJZVEVfVEFHUyBpcyBub3Qgc2V0CiAjIENPTkZJR19ZQUZGU19ET0VTX0VDQyBpcyBub3Qgc2V0CiBDT05GSUdfWUFGRlNfWUFGRlMyPXkKIENPTkZJR19ZQUZGU19BVVRPX1lBRkZTMj15CiAjIENPTkZJR19ZQUZGU19ESVNBQkxFX0xBWllfTE9BRCBpcyBub3Qgc2V0Ci1DT05GSUdfWUFGRlNfQ0hFQ0tQT0lOVF9SRVNFUlZFRF9CTE9DS1M9MTAKICMgQ09ORklHX1lBRkZTX0RJU0FCTEVfV0lERV9UTk9ERVMgaXMgbm90IHNldAogIyBDT05GSUdfWUFGRlNfQUxXQVlTX0NIRUNLX0NIVU5LX0VSQVNFRCBpcyBub3Qgc2V0CiBDT05GSUdfWUFGRlNfU0hPUlRfTkFNRVNfSU5fUkFNPXkKQEAgLTExNTAsOCArMTE5MSwxMSBAQAogIyBDT05GSUdfSkZGUzJfUlVCSU4gaXMgbm90IHNldAogIyBDT05GSUdfQ1JBTUZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1ZYRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTUlOSVhfRlMgaXMgbm90IHNldAorIyBDT05GSUdfT01GU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19IUEZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1FOWDRGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19ST01GU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19TWVNWX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1VGU19GUyBpcyBub3Qgc2V0CiBDT05GSUdfTkVUV09SS19GSUxFU1lTVEVNUz15CkBAIC0xMTU5LDEzICsxMjAzLDEyIEBACiBDT05GSUdfTkZTX1YzPXkKICMgQ09ORklHX05GU19WM19BQ0wgaXMgbm90IHNldAogIyBDT05GSUdfTkZTX1Y0IGlzIG5vdCBzZXQKLSMgQ09ORklHX05GU19ESVJFQ1RJTyBpcyBub3Qgc2V0CiAjIENPTkZJR19ORlNEIGlzIG5vdCBzZXQKIENPTkZJR19MT0NLRD1tCiBDT05GSUdfTE9DS0RfVjQ9eQogQ09ORklHX05GU19DT01NT049eQogQ09ORklHX1NVTlJQQz1tCi0jIENPTkZJR19TVU5SUENfQklORDM0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NVTlJQQ19SRUdJU1RFUl9WNCBpcyBub3Qgc2V0CiAjIENPTkZJR19SUENTRUNfR1NTX0tSQjUgaXMgbm90IHNldAogIyBDT05GSUdfUlBDU0VDX0dTU19TUEtNMyBpcyBub3Qgc2V0CiBDT05GSUdfU01CX0ZTPW0KQEAgLTEyMjEsOSArMTI2NCw2IEBACiAjIENPTkZJR19OTFNfS09JOF9VIGlzIG5vdCBzZXQKICMgQ09ORklHX05MU19VVEY4IGlzIG5vdCBzZXQKICMgQ09ORklHX0RMTSBpcyBub3Qgc2V0Ci1DT05GSUdfSU5TVFJVTUVOVEFUSU9OPXkKLSMgQ09ORklHX1BST0ZJTElORyBpcyBub3Qgc2V0Ci0jIENPTkZJR19NQVJLRVJTIGlzIG5vdCBzZXQKIAogIwogIyBLZXJuZWwgaGFja2luZwpAQCAtMTIzMSwxNCArMTI3MSw1MyBAQAogIyBDT05GSUdfUFJJTlRLX1RJTUUgaXMgbm90IHNldAogQ09ORklHX0VOQUJMRV9XQVJOX0RFUFJFQ0FURUQ9eQogQ09ORklHX0VOQUJMRV9NVVNUX0NIRUNLPXkKK0NPTkZJR19GUkFNRV9XQVJOPTEwMjQKICMgQ09ORklHX01BR0lDX1NZU1JRIGlzIG5vdCBzZXQKICMgQ09ORklHX1VOVVNFRF9TWU1CT0xTIGlzIG5vdCBzZXQKIENPTkZJR19ERUJVR19GUz15CiAjIENPTkZJR19IRUFERVJTX0NIRUNLIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQlVHX0tFUk5FTCBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfS0VSTkVMPXkKKyMgQ09ORklHX0RFQlVHX1NISVJRIGlzIG5vdCBzZXQKK0NPTkZJR19ERVRFQ1RfU09GVExPQ0tVUD15CisjIENPTkZJR19CT09UUEFSQU1fU09GVExPQ0tVUF9QQU5JQyBpcyBub3Qgc2V0CitDT05GSUdfQk9PVFBBUkFNX1NPRlRMT0NLVVBfUEFOSUNfVkFMVUU9MAorQ09ORklHX1NDSEVEX0RFQlVHPXkKKyMgQ09ORklHX1NDSEVEU1RBVFMgaXMgbm90IHNldAorIyBDT05GSUdfVElNRVJfU1RBVFMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfT0JKRUNUUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TTEFCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1JUX01VVEVYRVMgaXMgbm90IHNldAorIyBDT05GSUdfUlRfTVVURVhfVEVTVEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NQSU5MT0NLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX01VVEVYRVMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU1BJTkxPQ0tfU0xFRVAgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfTE9DS0lOR19BUElfU0VMRlRFU1RTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0tPQkpFQ1QgaXMgbm90IHNldAogIyBDT05GSUdfREVCVUdfQlVHVkVSQk9TRSBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfSU5GTz15CisjIENPTkZJR19ERUJVR19WTSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19XUklURUNPVU5UIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX01FTU9SWV9JTklUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0xJU1QgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU0cgaXMgbm90IHNldAorIyBDT05GSUdfRlJBTUVfUE9JTlRFUiBpcyBub3Qgc2V0CisjIENPTkZJR19CT09UX1BSSU5US19ERUxBWSBpcyBub3Qgc2V0CisjIENPTkZJR19SQ1VfVE9SVFVSRV9URVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JDVV9DUFVfU1RBTExfREVURUNUT1IgaXMgbm90IHNldAorIyBDT05GSUdfQkFDS1RSQUNFX1NFTEZfVEVTVCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19CTE9DS19FWFRfREVWVCBpcyBub3Qgc2V0CisjIENPTkZJR19GQVVMVF9JTkpFQ1RJT04gaXMgbm90IHNldAorIyBDT05GSUdfU1lTQ1RMX1NZU0NBTExfQ0hFQ0sgaXMgbm90IHNldAorIyBDT05GSUdfRFlOQU1JQ19QUklOVEtfREVCVUcgaXMgbm90IHNldAogIyBDT05GSUdfU0FNUExFUyBpcyBub3Qgc2V0CitDT05GSUdfSEFWRV9BUkNIX0tHREI9eQorIyBDT05GSUdfS0dEQiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TVEFDS09WRVJGTE9XIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NUQUNLX1VTQUdFIGlzIG5vdCBzZXQKK0NPTkZJR19ERUJVR19WRVJCT1NFPXkKIENPTkZJR19ERUJVR19NTVJTPXkKKyMgQ09ORklHX0RFQlVHX0hXRVJSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0RPVUJMRUZBVUxUIGlzIG5vdCBzZXQKIENPTkZJR19ERUJVR19IVU5UX0ZPUl9aRVJPPXkKIENPTkZJR19ERUJVR19CRklOX0hXVFJBQ0VfT049eQogQ09ORklHX0RFQlVHX0JGSU5fSFdUUkFDRV9DT01QUkVTU0lPTl9PRkY9eQpAQCAtMTI1Niw5ICsxMzM1LDk0IEBACiAjCiAjIENPTkZJR19LRVlTIGlzIG5vdCBzZXQKIENPTkZJR19TRUNVUklUWT15CisjIENPTkZJR19TRUNVUklUWUZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFQ1VSSVRZX05FVFdPUksgaXMgbm90IHNldAotIyBDT05GSUdfU0VDVVJJVFlfQ0FQQUJJTElUSUVTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUTyBpcyBub3Qgc2V0CisjIENPTkZJR19TRUNVUklUWV9GSUxFX0NBUEFCSUxJVElFUyBpcyBub3Qgc2V0CitDT05GSUdfU0VDVVJJVFlfREVGQVVMVF9NTUFQX01JTl9BRERSPTAKK0NPTkZJR19DUllQVE89eQorCisjCisjIENyeXB0byBjb3JlIG9yIGhlbHBlcgorIworIyBDT05GSUdfQ1JZUFRPX0ZJUFMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX01BTkFHRVIgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0dGMTI4TVVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19OVUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19DUllQVEQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0FVVEhFTkMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1RFU1QgaXMgbm90IHNldAorCisjCisjIEF1dGhlbnRpY2F0ZWQgRW5jcnlwdGlvbiB3aXRoIEFzc29jaWF0ZWQgRGF0YQorIworIyBDT05GSUdfQ1JZUFRPX0NDTSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fR0NNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TRVFJViBpcyBub3Qgc2V0CisKKyMKKyMgQmxvY2sgbW9kZXMKKyMKKyMgQ09ORklHX0NSWVBUT19DQkMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0NUUiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQ1RTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19FQ0IgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0xSVyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fUENCQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fWFRTIGlzIG5vdCBzZXQKKworIworIyBIYXNoIG1vZGVzCisjCisjIENPTkZJR19DUllQVE9fSE1BQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fWENCQyBpcyBub3Qgc2V0CisKKyMKKyMgRGlnZXN0CisjCisjIENPTkZJR19DUllQVE9fQ1JDMzJDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19NRDQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX01ENSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fTUlDSEFFTF9NSUMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1JNRDEyOCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fUk1EMTYwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19STUQyNTYgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1JNRDMyMCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0hBMSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0hBMjU2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TSEE1MTIgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1RHUjE5MiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fV1A1MTIgaXMgbm90IHNldAorCisjCisjIENpcGhlcnMKKyMKKyMgQ09ORklHX0NSWVBUT19BRVMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0FOVUJJUyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQVJDNCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQkxPV0ZJU0ggaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0NBTUVMTElBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19DQVNUNSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQ0FTVDYgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0RFUyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fRkNSWVBUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19LSEFaQUQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1NBTFNBMjAgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1NFRUQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1NFUlBFTlQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1RFQSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fVFdPRklTSCBpcyBub3Qgc2V0CisKKyMKKyMgQ29tcHJlc3Npb24KKyMKKyMgQ09ORklHX0NSWVBUT19ERUZMQVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19MWk8gaXMgbm90IHNldAorCisjCisjIFJhbmRvbSBOdW1iZXIgR2VuZXJhdGlvbgorIworIyBDT05GSUdfQ1JZUFRPX0FOU0lfQ1BSTkcgaXMgbm90IHNldAorQ09ORklHX0NSWVBUT19IVz15CiAKICMKICMgTGlicmFyeSByb3V0aW5lcwpAQCAtMTI2Niw2ICsxNDMwLDcgQEAKIENPTkZJR19CSVRSRVZFUlNFPXkKIENPTkZJR19DUkNfQ0NJVFQ9bQogIyBDT05GSUdfQ1JDMTYgaXMgbm90IHNldAorIyBDT05GSUdfQ1JDX1QxMERJRiBpcyBub3Qgc2V0CiAjIENPTkZJR19DUkNfSVRVX1QgaXMgbm90IHNldAogQ09ORklHX0NSQzMyPXkKICMgQ09ORklHX0NSQzcgaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9jb25maWdzL0JGNTM4LUVaS0lUX2RlZmNvbmZpZyBiL2FyY2gvYmxhY2tmaW4vY29uZmlncy9CRjUzOC1FWktJVF9kZWZjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQxNTkzNAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYmxhY2tmaW4vY29uZmlncy9CRjUzOC1FWktJVF9kZWZjb25maWcKQEAgLTAsMCArMSwxMzY4IEBACisjCisjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMjgtcmMyCisjCisjIENPTkZJR19NTVUgaXMgbm90IHNldAorIyBDT05GSUdfRlBVIGlzIG5vdCBzZXQKK0NPTkZJR19SV1NFTV9HRU5FUklDX1NQSU5MT0NLPXkKKyMgQ09ORklHX1JXU0VNX1hDSEdBRERfQUxHT1JJVEhNIGlzIG5vdCBzZXQKK0NPTkZJR19CTEFDS0ZJTj15CitDT05GSUdfWk9ORV9ETUE9eQorQ09ORklHX0dFTkVSSUNfRklORF9ORVhUX0JJVD15CitDT05GSUdfR0VORVJJQ19IV0VJR0hUPXkKK0NPTkZJR19HRU5FUklDX0hBUkRJUlFTPXkKK0NPTkZJR19HRU5FUklDX0lSUV9QUk9CRT15CitDT05GSUdfR0VORVJJQ19HUElPPXkKK0NPTkZJR19GT1JDRV9NQVhfWk9ORU9SREVSPTE0CitDT05GSUdfR0VORVJJQ19DQUxJQlJBVEVfREVMQVk9eQorQ09ORklHX0RFRkNPTkZJR19MSVNUPSIvbGliL21vZHVsZXMvJFVOQU1FX1JFTEVBU0UvLmNvbmZpZyIKKworIworIyBHZW5lcmFsIHNldHVwCisjCitDT05GSUdfRVhQRVJJTUVOVEFMPXkKK0NPTkZJR19CUk9LRU5fT05fU01QPXkKK0NPTkZJR19JTklUX0VOVl9BUkdfTElNSVQ9MzIKK0NPTkZJR19MT0NBTFZFUlNJT049IiIKK0NPTkZJR19MT0NBTFZFUlNJT05fQVVUTz15CitDT05GSUdfU1lTVklQQz15CitDT05GSUdfU1lTVklQQ19TWVNDVEw9eQorIyBDT05GSUdfUE9TSVhfTVFVRVVFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JTRF9QUk9DRVNTX0FDQ1QgaXMgbm90IHNldAorIyBDT05GSUdfVEFTS1NUQVRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FVRElUIGlzIG5vdCBzZXQKK0NPTkZJR19JS0NPTkZJRz15CitDT05GSUdfSUtDT05GSUdfUFJPQz15CitDT05GSUdfTE9HX0JVRl9TSElGVD0xNAorIyBDT05GSUdfQ0dST1VQUyBpcyBub3Qgc2V0CisjIENPTkZJR19HUk9VUF9TQ0hFRCBpcyBub3Qgc2V0CisjIENPTkZJR19TWVNGU19ERVBSRUNBVEVEX1YyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JFTEFZIGlzIG5vdCBzZXQKKyMgQ09ORklHX05BTUVTUEFDRVMgaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfSU5JVFJEPXkKK0NPTkZJR19JTklUUkFNRlNfU09VUkNFPSIiCisjIENPTkZJR19DQ19PUFRJTUlaRV9GT1JfU0laRSBpcyBub3Qgc2V0CitDT05GSUdfU1lTQ1RMPXkKK0NPTkZJR19FTUJFRERFRD15CitDT05GSUdfVUlEMTY9eQorQ09ORklHX1NZU0NUTF9TWVNDQUxMPXkKK0NPTkZJR19LQUxMU1lNUz15CisjIENPTkZJR19LQUxMU1lNU19BTEwgaXMgbm90IHNldAorIyBDT05GSUdfS0FMTFNZTVNfRVhUUkFfUEFTUyBpcyBub3Qgc2V0CitDT05GSUdfSE9UUExVRz15CitDT05GSUdfUFJJTlRLPXkKK0NPTkZJR19CVUc9eQorIyBDT05GSUdfRUxGX0NPUkUgaXMgbm90IHNldAorQ09ORklHX0NPTVBBVF9CUks9eQorQ09ORklHX0JBU0VfRlVMTD15CitDT05GSUdfRlVURVg9eQorQ09ORklHX0FOT05fSU5PREVTPXkKK0NPTkZJR19FUE9MTD15CitDT05GSUdfU0lHTkFMRkQ9eQorQ09ORklHX1RJTUVSRkQ9eQorQ09ORklHX0VWRU5URkQ9eQorQ09ORklHX0FJTz15CitDT05GSUdfVk1fRVZFTlRfQ09VTlRFUlM9eQorQ09ORklHX1NMQUI9eQorIyBDT05GSUdfU0xVQiBpcyBub3Qgc2V0CisjIENPTkZJR19TTE9CIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BST0ZJTElORyBpcyBub3Qgc2V0CisjIENPTkZJR19NQVJLRVJTIGlzIG5vdCBzZXQKK0NPTkZJR19IQVZFX09QUk9GSUxFPXkKKyMgQ09ORklHX0hBVkVfR0VORVJJQ19ETUFfQ09IRVJFTlQgaXMgbm90IHNldAorQ09ORklHX1NMQUJJTkZPPXkKK0NPTkZJR19SVF9NVVRFWEVTPXkKK0NPTkZJR19USU5ZX1NITUVNPXkKK0NPTkZJR19CQVNFX1NNQUxMPTAKK0NPTkZJR19NT0RVTEVTPXkKKyMgQ09ORklHX01PRFVMRV9GT1JDRV9MT0FEIGlzIG5vdCBzZXQKK0NPTkZJR19NT0RVTEVfVU5MT0FEPXkKKyMgQ09ORklHX01PRFVMRV9GT1JDRV9VTkxPQUQgaXMgbm90IHNldAorIyBDT05GSUdfTU9EVkVSU0lPTlMgaXMgbm90IHNldAorIyBDT05GSUdfTU9EVUxFX1NSQ1ZFUlNJT05fQUxMIGlzIG5vdCBzZXQKK0NPTkZJR19LTU9EPXkKK0NPTkZJR19CTE9DSz15CisjIENPTkZJR19MQkQgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9JT19UUkFDRSBpcyBub3Qgc2V0CisjIENPTkZJR19MU0YgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9CU0cgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9JTlRFR1JJVFkgaXMgbm90IHNldAorCisjCisjIElPIFNjaGVkdWxlcnMKKyMKK0NPTkZJR19JT1NDSEVEX05PT1A9eQorQ09ORklHX0lPU0NIRURfQVM9eQorIyBDT05GSUdfSU9TQ0hFRF9ERUFETElORSBpcyBub3Qgc2V0CitDT05GSUdfSU9TQ0hFRF9DRlE9eQorQ09ORklHX0RFRkFVTFRfQVM9eQorIyBDT05GSUdfREVGQVVMVF9ERUFETElORSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUZBVUxUX0NGUSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUZBVUxUX05PT1AgaXMgbm90IHNldAorQ09ORklHX0RFRkFVTFRfSU9TQ0hFRD0iYW50aWNpcGF0b3J5IgorQ09ORklHX0NMQVNTSUNfUkNVPXkKKyMgQ09ORklHX1BSRUVNUFRfTk9ORSBpcyBub3Qgc2V0CitDT05GSUdfUFJFRU1QVF9WT0xVTlRBUlk9eQorIyBDT05GSUdfUFJFRU1QVCBpcyBub3Qgc2V0CisjIENPTkZJR19GUkVFWkVSIGlzIG5vdCBzZXQKKworIworIyBCbGFja2ZpbiBQcm9jZXNzb3IgT3B0aW9ucworIworCisjCisjIFByb2Nlc3NvciBhbmQgQm9hcmQgU2V0dGluZ3MKKyMKKyMgQ09ORklHX0JGNTEyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGNTE0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGNTE2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGNTE4IGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGNTIyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGNTIzIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGNTI0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGNTI1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGNTI2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGNTI3IGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGNTMxIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGNTMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGNTMzIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGNTM0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGNTM2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGNTM3IGlzIG5vdCBzZXQKK0NPTkZJR19CRjUzOD15CisjIENPTkZJR19CRjUzOSBpcyBub3Qgc2V0CisjIENPTkZJR19CRjU0MiBpcyBub3Qgc2V0CisjIENPTkZJR19CRjU0NCBpcyBub3Qgc2V0CisjIENPTkZJR19CRjU0NyBpcyBub3Qgc2V0CisjIENPTkZJR19CRjU0OCBpcyBub3Qgc2V0CisjIENPTkZJR19CRjU0OSBpcyBub3Qgc2V0CisjIENPTkZJR19CRjU2MSBpcyBub3Qgc2V0CitDT05GSUdfQkZfUkVWX01JTj00CitDT05GSUdfQkZfUkVWX01BWD01CisjIENPTkZJR19CRl9SRVZfMF8wIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGX1JFVl8wXzEgaXMgbm90IHNldAorIyBDT05GSUdfQkZfUkVWXzBfMiBpcyBub3Qgc2V0CisjIENPTkZJR19CRl9SRVZfMF8zIGlzIG5vdCBzZXQKK0NPTkZJR19CRl9SRVZfMF80PXkKKyMgQ09ORklHX0JGX1JFVl8wXzUgaXMgbm90IHNldAorIyBDT05GSUdfQkZfUkVWXzBfNiBpcyBub3Qgc2V0CisjIENPTkZJR19CRl9SRVZfQU5ZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGX1JFVl9OT05FIGlzIG5vdCBzZXQKK0NPTkZJR19NRU1fTVQ0OExDMzJNOEEyXzc1PXkKK0NPTkZJR19JUlFfUExMX1dBS0VVUD03CitDT05GSUdfSVJRX0RNQTBfRVJST1I9NworQ09ORklHX0lSUV9QUElfRVJST1I9NworQ09ORklHX0lSUV9TUE9SVDBfRVJST1I9NworQ09ORklHX0lSUV9TUE9SVDFfRVJST1I9NworQ09ORklHX0lSUV9VQVJUMF9FUlJPUj03CitDT05GSUdfSVJRX1VBUlQxX0VSUk9SPTcKK0NPTkZJR19JUlFfUlRDPTgKK0NPTkZJR19JUlFfUFBJPTgKK0NPTkZJR19JUlFfU1BPUlQwX1JYPTkKK0NPTkZJR19JUlFfU1BPUlQwX1RYPTkKK0NPTkZJR19JUlFfU1BPUlQxX1JYPTkKK0NPTkZJR19JUlFfU1BPUlQxX1RYPTkKK0NPTkZJR19JUlFfU1BJMD0xMAorQ09ORklHX0lSUV9VQVJUMF9SWD0xMAorQ09ORklHX0lSUV9VQVJUMF9UWD0xMAorQ09ORklHX0lSUV9VQVJUMV9SWD0xMAorQ09ORklHX0lSUV9VQVJUMV9UWD0xMAorQ09ORklHX0lSUV9USU1FUjA9MTIKK0NPTkZJR19JUlFfVElNRVIxPTEyCitDT05GSUdfSVJRX1RJTUVSMj0xMgorQ09ORklHX0lSUV9XQVRDSD0xMworQ09ORklHX0lSUV9QT1JURl9JTlRBPTEyCitDT05GSUdfSVJRX1BPUlRGX0lOVEI9MTIKK0NPTkZJR19JUlFfU1BJMF9FUlJPUj03CitDT05GSUdfSVJRX1NQSTFfRVJST1I9NworQ09ORklHX0lSUV9ETUExX0VSUk9SPTcKK0NPTkZJR19JUlFfQ0FOX1JYPTExCitDT05GSUdfSVJRX0NBTl9UWD0xMQorQ09ORklHX0JGSU41MzhfRVpLSVQ9eQorCisjCisjIEJGNTM4IFNwZWNpZmljIENvbmZpZ3VyYXRpb24KKyMKKworIworIyBJbnRlcnJ1cHQgUHJpb3JpdHkgQXNzaWdubWVudAorIworCisjCisjIFByaW9yaXR5CisjCitDT05GSUdfSVJRX01FTTBfRE1BMD0xMworQ09ORklHX0lSUV9NRU0wX0RNQTE9MTMKK0NPTkZJR19JUlFfU1BPUlQyX0VSUk9SPTcKK0NPTkZJR19JUlFfU1BPUlQzX0VSUk9SPTcKK0NPTkZJR19JUlFfU1BJMl9FUlJPUj03CitDT05GSUdfSVJRX1VBUlQyX0VSUk9SPTcKK0NPTkZJR19JUlFfQ0FOX0VSUk9SPTcKK0NPTkZJR19JUlFfU1BPUlQyX1JYPTkKK0NPTkZJR19JUlFfU1BPUlQyX1RYPTkKK0NPTkZJR19JUlFfU1BPUlQzX1JYPTkKK0NPTkZJR19JUlFfU1BPUlQzX1RYPTkKK0NPTkZJR19JUlFfU1BJMT0xMAorQ09ORklHX0lSUV9TUEkyPTEwCitDT05GSUdfSVJRX1VBUlQyX1JYPTEwCitDT05GSUdfSVJRX1VBUlQyX1RYPTEwCitDT05GSUdfSVJRX1RXSTA9MTEKK0NPTkZJR19JUlFfVFdJMT0xMQorQ09ORklHX0lSUV9NRU0xX0RNQTA9MTMKK0NPTkZJR19JUlFfTUVNMV9ETUExPTEzCisKKyMKKyMgQm9hcmQgY3VzdG9taXphdGlvbnMKKyMKKyMgQ09ORklHX0NNRExJTkVfQk9PTCBpcyBub3Qgc2V0CitDT05GSUdfQk9PVF9MT0FEPTB4MTAwMAorCisjCisjIENsb2NrL1BMTCBTZXR1cAorIworQ09ORklHX0NMS0lOX0haPTI1MDAwMDAwCisjIENPTkZJR19CRklOX0tFUk5FTF9DTE9DSyBpcyBub3Qgc2V0CitDT05GSUdfTUFYX1ZDT19IWj01MzMzMzMzMzMKK0NPTkZJR19NSU5fVkNPX0haPTUwMDAwMDAwCitDT05GSUdfTUFYX1NDTEtfSFo9MTMzMzMzMzMzCitDT05GSUdfTUlOX1NDTEtfSFo9MjcwMDAwMDAKKworIworIyBLZXJuZWwgVGltZXIvU2NoZWR1bGVyCisjCisjIENPTkZJR19IWl8xMDAgaXMgbm90IHNldAorQ09ORklHX0haXzI1MD15CisjIENPTkZJR19IWl8zMDAgaXMgbm90IHNldAorIyBDT05GSUdfSFpfMTAwMCBpcyBub3Qgc2V0CitDT05GSUdfSFo9MjUwCitDT05GSUdfU0NIRURfSFJUSUNLPXkKK0NPTkZJR19HRU5FUklDX1RJTUU9eQorQ09ORklHX0dFTkVSSUNfQ0xPQ0tFVkVOVFM9eQorIyBDT05GSUdfQ1lDTEVTX0NMT0NLU09VUkNFIGlzIG5vdCBzZXQKK0NPTkZJR19USUNLX09ORVNIT1Q9eQorIyBDT05GSUdfTk9fSFogaXMgbm90IHNldAorQ09ORklHX0hJR0hfUkVTX1RJTUVSUz15CitDT05GSUdfR0VORVJJQ19DTE9DS0VWRU5UU19CVUlMRD15CisKKyMKKyMgTWlzYworIworQ09ORklHX0JGSU5fU0NSQVRDSF9SRUdfUkVUTj15CisjIENPTkZJR19CRklOX1NDUkFUQ0hfUkVHX1JFVEUgaXMgbm90IHNldAorIyBDT05GSUdfQkZJTl9TQ1JBVENIX1JFR19DWUNMRVMgaXMgbm90IHNldAorCisjCisjIEJsYWNrZmluIEtlcm5lbCBPcHRpbWl6YXRpb25zCisjCisKKyMKKyMgTWVtb3J5IE9wdGltaXphdGlvbnMKKyMKK0NPTkZJR19JX0VOVFJZX0wxPXkKK0NPTkZJR19FWENQVF9JUlFfU1lTQ19MMT15CitDT05GSUdfRE9fSVJRX0wxPXkKK0NPTkZJR19DT1JFX1RJTUVSX0lSUV9MMT15CitDT05GSUdfSURMRV9MMT15CitDT05GSUdfU0NIRURVTEVfTDE9eQorQ09ORklHX0FSSVRITUVUSUNfT1BTX0wxPXkKK0NPTkZJR19BQ0NFU1NfT0tfTDE9eQorQ09ORklHX01FTVNFVF9MMT15CitDT05GSUdfTUVNQ1BZX0wxPXkKK0NPTkZJR19TWVNfQkZJTl9TUElOTE9DS19MMT15CisjIENPTkZJR19JUF9DSEVDS1NVTV9MMSBpcyBub3Qgc2V0CitDT05GSUdfQ0FDSEVMSU5FX0FMSUdORURfTDE9eQorIyBDT05GSUdfU1lTQ0FMTF9UQUJfTDEgaXMgbm90IHNldAorIyBDT05GSUdfQ1BMQl9TV0lUQ0hfVEFCX0wxIGlzIG5vdCBzZXQKK0NPTkZJR19BUFBfU1RBQ0tfTDE9eQorCisjCisjIFNwZWVkIE9wdGltaXphdGlvbnMKKyMKK0NPTkZJR19CRklOX0lOU19MT1dPVkVSSEVBRD15CitDT05GSUdfUkFNS0VSTkVMPXkKKyMgQ09ORklHX1JPTUtFUk5FTCBpcyBub3Qgc2V0CitDT05GSUdfU0VMRUNUX01FTU9SWV9NT0RFTD15CitDT05GSUdfRkxBVE1FTV9NQU5VQUw9eQorIyBDT05GSUdfRElTQ09OVElHTUVNX01BTlVBTCBpcyBub3Qgc2V0CisjIENPTkZJR19TUEFSU0VNRU1fTUFOVUFMIGlzIG5vdCBzZXQKK0NPTkZJR19GTEFUTUVNPXkKK0NPTkZJR19GTEFUX05PREVfTUVNX01BUD15CitDT05GSUdfUEFHRUZMQUdTX0VYVEVOREVEPXkKK0NPTkZJR19TUExJVF9QVExPQ0tfQ1BVUz00CisjIENPTkZJR19SRVNPVVJDRVNfNjRCSVQgaXMgbm90IHNldAorIyBDT05GSUdfUEhZU19BRERSX1RfNjRCSVQgaXMgbm90IHNldAorQ09ORklHX1pPTkVfRE1BX0ZMQUc9MQorQ09ORklHX1ZJUlRfVE9fQlVTPXkKK0NPTkZJR19CRklOX0dQVElNRVJTPXkKKyMgQ09ORklHX0RNQV9VTkNBQ0hFRF80TSBpcyBub3Qgc2V0CisjIENPTkZJR19ETUFfVU5DQUNIRURfMk0gaXMgbm90IHNldAorQ09ORklHX0RNQV9VTkNBQ0hFRF8xTT15CisjIENPTkZJR19ETUFfVU5DQUNIRURfTk9ORSBpcyBub3Qgc2V0CisKKyMKKyMgQ2FjaGUgU3VwcG9ydAorIworQ09ORklHX0JGSU5fSUNBQ0hFPXkKK0NPTkZJR19CRklOX0RDQUNIRT15CisjIENPTkZJR19CRklOX0RDQUNIRV9CQU5LQSBpcyBub3Qgc2V0CisjIENPTkZJR19CRklOX0lDQUNIRV9MT0NLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGSU5fV0IgaXMgbm90IHNldAorQ09ORklHX0JGSU5fV1Q9eQorIyBDT05GSUdfTVBVIGlzIG5vdCBzZXQKKworIworIyBBc3luY2hvbm91cyBNZW1vcnkgQ29uZmlndXJhdGlvbgorIworCisjCisjIEVCSVVfQU1HQ1RMIEdsb2JhbCBDb250cm9sCisjCitDT05GSUdfQ19BTUNLRU49eQorQ09ORklHX0NfQ0RQUklPPXkKKyMgQ09ORklHX0NfQU1CRU4gaXMgbm90IHNldAorIyBDT05GSUdfQ19BTUJFTl9CMCBpcyBub3Qgc2V0CisjIENPTkZJR19DX0FNQkVOX0IwX0IxIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NfQU1CRU5fQjBfQjFfQjIgaXMgbm90IHNldAorQ09ORklHX0NfQU1CRU5fQUxMPXkKKworIworIyBFQklVX0FNQkNUTCBDb250cm9sCisjCitDT05GSUdfQkFOS18wPTB4N0JCMAorQ09ORklHX0JBTktfMT0weDdCQjAKK0NPTkZJR19CQU5LXzI9MHg3QkIwCitDT05GSUdfQkFOS18zPTB4OTlCMgorCisjCisjIEJ1cyBvcHRpb25zIChQQ0ksIFBDTUNJQSwgRUlTQSwgTUNBLCBJU0EpCisjCisjIENPTkZJR19BUkNIX1NVUFBPUlRTX01TSSBpcyBub3Qgc2V0CisjIENPTkZJR19QQ0NBUkQgaXMgbm90IHNldAorCisjCisjIEV4ZWN1dGFibGUgZmlsZSBmb3JtYXRzCisjCitDT05GSUdfQklORk1UX0VMRl9GRFBJQz15CitDT05GSUdfQklORk1UX0ZMQVQ9eQorQ09ORklHX0JJTkZNVF9aRkxBVD15CisjIENPTkZJR19CSU5GTVRfU0hBUkVEX0ZMQVQgaXMgbm90IHNldAorIyBDT05GSUdfSEFWRV9BT1VUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JJTkZNVF9NSVNDIGlzIG5vdCBzZXQKKworIworIyBQb3dlciBtYW5hZ2VtZW50IG9wdGlvbnMKKyMKKyMgQ09ORklHX1BNIGlzIG5vdCBzZXQKK0NPTkZJR19BUkNIX1NVU1BFTkRfUE9TU0lCTEU9eQorIyBDT05GSUdfUE1fV0FLRVVQX0JZX0dQSU8gaXMgbm90IHNldAorCisjCisjIENQVSBGcmVxdWVuY3kgc2NhbGluZworIworIyBDT05GSUdfQ1BVX0ZSRVEgaXMgbm90IHNldAorQ09ORklHX05FVD15CisKKyMKKyMgTmV0d29ya2luZyBvcHRpb25zCisjCitDT05GSUdfUEFDS0VUPXkKKyMgQ09ORklHX1BBQ0tFVF9NTUFQIGlzIG5vdCBzZXQKK0NPTkZJR19VTklYPXkKK0NPTkZJR19YRlJNPXkKKyMgQ09ORklHX1hGUk1fVVNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19YRlJNX1NVQl9QT0xJQ1kgaXMgbm90IHNldAorIyBDT05GSUdfWEZSTV9NSUdSQVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1hGUk1fU1RBVElTVElDUyBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfS0VZIGlzIG5vdCBzZXQKK0NPTkZJR19JTkVUPXkKKyMgQ09ORklHX0lQX01VTFRJQ0FTVCBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9BRFZBTkNFRF9ST1VURVIgaXMgbm90IHNldAorQ09ORklHX0lQX0ZJQl9IQVNIPXkKK0NPTkZJR19JUF9QTlA9eQorIyBDT05GSUdfSVBfUE5QX0RIQ1AgaXMgbm90IHNldAorIyBDT05GSUdfSVBfUE5QX0JPT1RQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX1BOUF9SQVJQIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9JUElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9JUEdSRSBpcyBub3Qgc2V0CisjIENPTkZJR19BUlBEIGlzIG5vdCBzZXQKK0NPTkZJR19TWU5fQ09PS0lFUz15CisjIENPTkZJR19JTkVUX0FIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfRVNQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfSVBDT01QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfWEZSTV9UVU5ORUwgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9UVU5ORUwgaXMgbm90IHNldAorQ09ORklHX0lORVRfWEZSTV9NT0RFX1RSQU5TUE9SVD15CitDT05GSUdfSU5FVF9YRlJNX01PREVfVFVOTkVMPXkKK0NPTkZJR19JTkVUX1hGUk1fTU9ERV9CRUVUPXkKKyMgQ09ORklHX0lORVRfTFJPIGlzIG5vdCBzZXQKK0NPTkZJR19JTkVUX0RJQUc9eQorQ09ORklHX0lORVRfVENQX0RJQUc9eQorIyBDT05GSUdfVENQX0NPTkdfQURWQU5DRUQgaXMgbm90IHNldAorQ09ORklHX1RDUF9DT05HX0NVQklDPXkKK0NPTkZJR19ERUZBVUxUX1RDUF9DT05HPSJjdWJpYyIKKyMgQ09ORklHX1RDUF9NRDVTSUcgaXMgbm90IHNldAorIyBDT05GSUdfSVBWNiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRMQUJFTCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRXT1JLX1NFQ01BUksgaXMgbm90IHNldAorIyBDT05GSUdfTkVURklMVEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX0RDQ1AgaXMgbm90IHNldAorIyBDT05GSUdfSVBfU0NUUCBpcyBub3Qgc2V0CisjIENPTkZJR19USVBDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUTSBpcyBub3Qgc2V0CisjIENPTkZJR19CUklER0UgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0RTQSBpcyBub3Qgc2V0CisjIENPTkZJR19WTEFOXzgwMjFRIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQ05FVCBpcyBub3Qgc2V0CisjIENPTkZJR19MTEMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQWCBpcyBub3Qgc2V0CisjIENPTkZJR19BVEFMSyBpcyBub3Qgc2V0CisjIENPTkZJR19YMjUgaXMgbm90IHNldAorIyBDT05GSUdfTEFQQiBpcyBub3Qgc2V0CisjIENPTkZJR19FQ09ORVQgaXMgbm90IHNldAorIyBDT05GSUdfV0FOX1JPVVRFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfU0NIRUQgaXMgbm90IHNldAorCisjCisjIE5ldHdvcmsgdGVzdGluZworIworIyBDT05GSUdfTkVUX1BLVEdFTiBpcyBub3Qgc2V0CisjIENPTkZJR19IQU1SQURJTyBpcyBub3Qgc2V0CisjIENPTkZJR19DQU4gaXMgbm90IHNldAorQ09ORklHX0lSREE9bQorCisjCisjIElyREEgcHJvdG9jb2xzCisjCitDT05GSUdfSVJMQU49bQorQ09ORklHX0lSQ09NTT1tCisjIENPTkZJR19JUkRBX1VMVFJBIGlzIG5vdCBzZXQKKworIworIyBJckRBIG9wdGlvbnMKKyMKK0NPTkZJR19JUkRBX0NBQ0hFX0xBU1RfTFNBUD15CisjIENPTkZJR19JUkRBX0ZBU1RfUlIgaXMgbm90IHNldAorIyBDT05GSUdfSVJEQV9ERUJVRyBpcyBub3Qgc2V0CisKKyMKKyMgSW5mcmFyZWQtcG9ydCBkZXZpY2UgZHJpdmVycworIworCisjCisjIFNJUiBkZXZpY2UgZHJpdmVycworIworQ09ORklHX0lSVFRZX1NJUj1tCitDT05GSUdfQkZJTl9TSVI9bQorQ09ORklHX1NJUl9CRklOX0RNQT15CisjIENPTkZJR19TSVJfQkZJTl9QSU8gaXMgbm90IHNldAorCisjCisjIERvbmdsZSBzdXBwb3J0CisjCisjIENPTkZJR19ET05HTEUgaXMgbm90IHNldAorCisjCisjIEZJUiBkZXZpY2UgZHJpdmVycworIworIyBDT05GSUdfQlQgaXMgbm90IHNldAorIyBDT05GSUdfQUZfUlhSUEMgaXMgbm90IHNldAorIyBDT05GSUdfUEhPTkVUIGlzIG5vdCBzZXQKK0NPTkZJR19XSVJFTEVTUz15CisjIENPTkZJR19DRkc4MDIxMSBpcyBub3Qgc2V0CitDT05GSUdfV0lSRUxFU1NfT0xEX1JFR1VMQVRPUlk9eQorIyBDT05GSUdfV0lSRUxFU1NfRVhUIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BQzgwMjExIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lFRUU4MDIxMSBpcyBub3Qgc2V0CisjIENPTkZJR19SRktJTEwgaXMgbm90IHNldAorIyBDT05GSUdfTkVUXzlQIGlzIG5vdCBzZXQKKworIworIyBEZXZpY2UgRHJpdmVycworIworCisjCisjIEdlbmVyaWMgRHJpdmVyIE9wdGlvbnMKKyMKK0NPTkZJR19VRVZFTlRfSEVMUEVSX1BBVEg9Ii9zYmluL2hvdHBsdWciCitDT05GSUdfU1RBTkRBTE9ORT15CitDT05GSUdfUFJFVkVOVF9GSVJNV0FSRV9CVUlMRD15CisjIENPTkZJR19GV19MT0FERVIgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfRFJJVkVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0RFVlJFUyBpcyBub3Qgc2V0CisjIENPTkZJR19TWVNfSFlQRVJWSVNPUiBpcyBub3Qgc2V0CisjIENPTkZJR19DT05ORUNUT1IgaXMgbm90IHNldAorQ09ORklHX01URD15CisjIENPTkZJR19NVERfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0NPTkNBVCBpcyBub3Qgc2V0CitDT05GSUdfTVREX1BBUlRJVElPTlM9eQorIyBDT05GSUdfTVREX1JFREJPT1RfUEFSVFMgaXMgbm90IHNldAorQ09ORklHX01URF9DTURMSU5FX1BBUlRTPXkKKyMgQ09ORklHX01URF9BUjdfUEFSVFMgaXMgbm90IHNldAorCisjCisjIFVzZXIgTW9kdWxlcyBBbmQgVHJhbnNsYXRpb24gTGF5ZXJzCisjCitDT05GSUdfTVREX0NIQVI9bQorQ09ORklHX01URF9CTEtERVZTPXkKK0NPTkZJR19NVERfQkxPQ0s9eQorIyBDT05GSUdfRlRMIGlzIG5vdCBzZXQKKyMgQ09ORklHX05GVEwgaXMgbm90IHNldAorIyBDT05GSUdfSU5GVEwgaXMgbm90IHNldAorIyBDT05GSUdfUkZEX0ZUTCBpcyBub3Qgc2V0CisjIENPTkZJR19TU0ZEQyBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfT09QUyBpcyBub3Qgc2V0CisKKyMKKyMgUkFNL1JPTS9GbGFzaCBjaGlwIGRyaXZlcnMKKyMKK0NPTkZJR19NVERfQ0ZJPW0KKyMgQ09ORklHX01URF9KRURFQ1BST0JFIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfR0VOX1BST0JFPW0KKyMgQ09ORklHX01URF9DRklfQURWX09QVElPTlMgaXMgbm90IHNldAorQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8xPXkKK0NPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMj15CitDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzQ9eQorIyBDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzggaXMgbm90IHNldAorIyBDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzE2IGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8zMiBpcyBub3Qgc2V0CitDT05GSUdfTVREX0NGSV9JMT15CitDT05GSUdfTVREX0NGSV9JMj15CisjIENPTkZJR19NVERfQ0ZJX0k0IGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9DRklfSTggaXMgbm90IHNldAorIyBDT05GSUdfTVREX0NGSV9JTlRFTEVYVCBpcyBub3Qgc2V0CitDT05GSUdfTVREX0NGSV9BTURTVEQ9bQorIyBDT05GSUdfTVREX0NGSV9TVEFBIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfQ0ZJX1VUSUw9bQorQ09ORklHX01URF9SQU09eQorQ09ORklHX01URF9ST009bQorIyBDT05GSUdfTVREX0FCU0VOVCBpcyBub3Qgc2V0CisKKyMKKyMgTWFwcGluZyBkcml2ZXJzIGZvciBjaGlwIGFjY2VzcworIworIyBDT05GSUdfTVREX0NPTVBMRVhfTUFQUElOR1MgaXMgbm90IHNldAorQ09ORklHX01URF9QSFlTTUFQPW0KK0NPTkZJR19NVERfUEhZU01BUF9TVEFSVD0weDIwMDAwMDAwCitDT05GSUdfTVREX1BIWVNNQVBfTEVOPTB4MAorQ09ORklHX01URF9QSFlTTUFQX0JBTktXSURUSD0yCisjIENPTkZJR19NVERfVUNMSU5VWCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfUExBVFJBTSBpcyBub3Qgc2V0CisKKyMKKyMgU2VsZi1jb250YWluZWQgTVREIGRldmljZSBkcml2ZXJzCisjCisjIENPTkZJR19NVERfREFUQUZMQVNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9NMjVQODAgaXMgbm90IHNldAorIyBDT05GSUdfTVREX1NMUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9QSFJBTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTVREUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9CTE9DSzJNVEQgaXMgbm90IHNldAorCisjCisjIERpc2stT24tQ2hpcCBEZXZpY2UgRHJpdmVycworIworIyBDT05GSUdfTVREX0RPQzIwMDAgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0RPQzIwMDEgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0RPQzIwMDFQTFVTIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfTkFORD1tCisjIENPTkZJR19NVERfTkFORF9WRVJJRllfV1JJVEUgaXMgbm90IHNldAorIyBDT05GSUdfTVREX05BTkRfRUNDX1NNQyBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTkFORF9NVVNFVU1fSURTIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfTkFORF9CRklOPW0KK0NPTkZJR19CRklOX05BTkRfQkFTRT0weDIwMjEyMDAwCitDT05GSUdfQkZJTl9OQU5EX0NMRT0yCitDT05GSUdfQkZJTl9OQU5EX0FMRT0xCitDT05GSUdfQkZJTl9OQU5EX1JFQURZPTMKK0NPTkZJR19NVERfTkFORF9JRFM9bQorIyBDT05GSUdfTVREX05BTkRfRElTS09OQ0hJUCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTkFORF9OQU5EU0lNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9OQU5EX1BMQVRGT1JNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9PTkVOQU5EIGlzIG5vdCBzZXQKKworIworIyBVQkkgLSBVbnNvcnRlZCBibG9jayBpbWFnZXMKKyMKKyMgQ09ORklHX01URF9VQkkgaXMgbm90IHNldAorIyBDT05GSUdfUEFSUE9SVCBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVj15CisjIENPTkZJR19CTEtfREVWX0NPV19DT01NT04gaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9MT09QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfTkJEIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX1JBTT15CitDT05GSUdfQkxLX0RFVl9SQU1fQ09VTlQ9MTYKK0NPTkZJR19CTEtfREVWX1JBTV9TSVpFPTQwOTYKKyMgQ09ORklHX0JMS19ERVZfWElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NEUk9NX1BLVENEVkQgaXMgbm90IHNldAorIyBDT05GSUdfQVRBX09WRVJfRVRIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSEQgaXMgbm90IHNldAorIyBDT05GSUdfTUlTQ19ERVZJQ0VTIGlzIG5vdCBzZXQKK0NPTkZJR19IQVZFX0lERT15CisjIENPTkZJR19JREUgaXMgbm90IHNldAorCisjCisjIFNDU0kgZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX1JBSURfQVRUUlMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSSBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0RNQSBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX05FVExJTksgaXMgbm90IHNldAorIyBDT05GSUdfQVRBIGlzIG5vdCBzZXQKKyMgQ09ORklHX01EIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRERVZJQ0VTPXkKKyMgQ09ORklHX0RVTU1ZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JPTkRJTkcgaXMgbm90IHNldAorIyBDT05GSUdfTUFDVkxBTiBpcyBub3Qgc2V0CisjIENPTkZJR19FUVVBTElaRVIgaXMgbm90IHNldAorIyBDT05GSUdfVFVOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZFVEggaXMgbm90IHNldAorQ09ORklHX1BIWUxJQj15CisKKyMKKyMgTUlJIFBIWSBkZXZpY2UgZHJpdmVycworIworIyBDT05GSUdfTUFSVkVMTF9QSFkgaXMgbm90IHNldAorIyBDT05GSUdfREFWSUNPTV9QSFkgaXMgbm90IHNldAorIyBDT05GSUdfUVNFTUlfUEhZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xYVF9QSFkgaXMgbm90IHNldAorIyBDT05GSUdfQ0lDQURBX1BIWSBpcyBub3Qgc2V0CisjIENPTkZJR19WSVRFU1NFX1BIWSBpcyBub3Qgc2V0CitDT05GSUdfU01TQ19QSFk9eQorIyBDT05GSUdfQlJPQURDT01fUEhZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lDUExVU19QSFkgaXMgbm90IHNldAorIyBDT05GSUdfUkVBTFRFS19QSFkgaXMgbm90IHNldAorIyBDT05GSUdfRklYRURfUEhZIGlzIG5vdCBzZXQKKyMgQ09ORklHX01ESU9fQklUQkFORyBpcyBub3Qgc2V0CitDT05GSUdfTkVUX0VUSEVSTkVUPXkKK0NPTkZJR19NSUk9eQorQ09ORklHX1NNQzkxWD15CisjIENPTkZJR19TTVNDOTExWCBpcyBub3Qgc2V0CisjIENPTkZJR19ETTkwMDAgaXMgbm90IHNldAorIyBDT05GSUdfRU5DMjhKNjAgaXMgbm90IHNldAorIyBDT05GSUdfSUJNX05FV19FTUFDX1pNSUkgaXMgbm90IHNldAorIyBDT05GSUdfSUJNX05FV19FTUFDX1JHTUlJIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lCTV9ORVdfRU1BQ19UQUggaXMgbm90IHNldAorIyBDT05GSUdfSUJNX05FV19FTUFDX0VNQUM0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0lCTV9ORVdfRU1BQ19OT19GTE9XX0NUUkwgaXMgbm90IHNldAorIyBDT05GSUdfSUJNX05FV19FTUFDX01BTF9DTFJfSUNJTlRTVEFUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lCTV9ORVdfRU1BQ19NQUxfQ09NTU9OX0VSUiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRERVZfMTAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRERVZfMTAwMDAgaXMgbm90IHNldAorCisjCisjIFdpcmVsZXNzIExBTgorIworIyBDT05GSUdfV0xBTl9QUkU4MDIxMSBpcyBub3Qgc2V0CisjIENPTkZJR19XTEFOXzgwMjExIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lXTFdJRklfTEVEUyBpcyBub3Qgc2V0CisjIENPTkZJR19XQU4gaXMgbm90IHNldAorIyBDT05GSUdfUFBQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NMSVAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUQ09OU09MRSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRQT0xMIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIgaXMgbm90IHNldAorIyBDT05GSUdfSVNETiBpcyBub3Qgc2V0CisjIENPTkZJR19QSE9ORSBpcyBub3Qgc2V0CisKKyMKKyMgSW5wdXQgZGV2aWNlIHN1cHBvcnQKKyMKK0NPTkZJR19JTlBVVD15CisjIENPTkZJR19JTlBVVF9GRl9NRU1MRVNTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX1BPTExERVYgaXMgbm90IHNldAorCisjCisjIFVzZXJsYW5kIGludGVyZmFjZXMKKyMKKyMgQ09ORklHX0lOUFVUX01PVVNFREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX0pPWURFViBpcyBub3Qgc2V0CitDT05GSUdfSU5QVVRfRVZERVY9bQorIyBDT05GSUdfSU5QVVRfRVZCVUcgaXMgbm90IHNldAorCisjCisjIElucHV0IERldmljZSBEcml2ZXJzCisjCisjIENPTkZJR19JTlBVVF9LRVlCT0FSRCBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9NT1VTRSBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9KT1lTVElDSyBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9UQUJMRVQgaXMgbm90IHNldAorQ09ORklHX0lOUFVUX1RPVUNIU0NSRUVOPXkKKyMgQ09ORklHX1RPVUNIU0NSRUVOX0FEUzc4NDYgaXMgbm90IHNldAorIyBDT05GSUdfVE9VQ0hTQ1JFRU5fQUQ3ODc3IGlzIG5vdCBzZXQKKyMgQ09ORklHX1RPVUNIU0NSRUVOX0FENzg3OV9JMkMgaXMgbm90IHNldAorQ09ORklHX1RPVUNIU0NSRUVOX0FENzg3OV9TUEk9eQorQ09ORklHX1RPVUNIU0NSRUVOX0FENzg3OT1tCisjIENPTkZJR19UT1VDSFNDUkVFTl9GVUpJVFNVIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RPVUNIU0NSRUVOX0dVTlpFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RPVUNIU0NSRUVOX0VMTyBpcyBub3Qgc2V0CisjIENPTkZJR19UT1VDSFNDUkVFTl9NVE9VQ0ggaXMgbm90IHNldAorIyBDT05GSUdfVE9VQ0hTQ1JFRU5fSU5FWElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RPVUNIU0NSRUVOX01LNzEyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RPVUNIU0NSRUVOX1BFTk1PVU5UIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RPVUNIU0NSRUVOX1RPVUNIUklHSFQgaXMgbm90IHNldAorIyBDT05GSUdfVE9VQ0hTQ1JFRU5fVE9VQ0hXSU4gaXMgbm90IHNldAorIyBDT05GSUdfVE9VQ0hTQ1JFRU5fVE9VQ0hJVDIxMyBpcyBub3Qgc2V0CitDT05GSUdfSU5QVVRfTUlTQz15CisjIENPTkZJR19JTlBVVF9VSU5QVVQgaXMgbm90IHNldAorIyBDT05GSUdfQ09ORklHX0lOUFVUX1BDRjg1NzQgaXMgbm90IHNldAorCisjCisjIEhhcmR3YXJlIEkvTyBwb3J0cworIworIyBDT05GSUdfU0VSSU8gaXMgbm90IHNldAorIyBDT05GSUdfR0FNRVBPUlQgaXMgbm90IHNldAorCisjCisjIENoYXJhY3RlciBkZXZpY2VzCisjCisjIENPTkZJR19BRDk5NjAgaXMgbm90IHNldAorIyBDT05GSUdfU1BJX0FEQ19CRjUzMyBpcyBub3Qgc2V0CisjIENPTkZJR19CRjV4eF9QUElGQ0QgaXMgbm90IHNldAorIyBDT05GSUdfQkZJTl9TSU1QTEVfVElNRVIgaXMgbm90IHNldAorIyBDT05GSUdfQkY1eHhfUFBJIGlzIG5vdCBzZXQKK0NPTkZJR19CRklOX1NQT1JUPXkKKyMgQ09ORklHX0JGSU5fVElNRVJfTEFURU5DWSBpcyBub3Qgc2V0CisjIENPTkZJR19UV0lfTENEIGlzIG5vdCBzZXQKK0NPTkZJR19CRklOX0RNQV9JTlRFUkZBQ0U9bQorQ09ORklHX1NJTVBMRV9HUElPPW0KKyMgQ09ORklHX1ZUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFVktNRU0gaXMgbm90IHNldAorIyBDT05GSUdfQkZJTl9KVEFHX0NPTU0gaXMgbm90IHNldAorIyBDT05GSUdfU0VSSUFMX05PTlNUQU5EQVJEIGlzIG5vdCBzZXQKKworIworIyBTZXJpYWwgZHJpdmVycworIworIyBDT05GSUdfU0VSSUFMXzgyNTAgaXMgbm90IHNldAorCisjCisjIE5vbi04MjUwIHNlcmlhbCBwb3J0IHN1cHBvcnQKKyMKK0NPTkZJR19TRVJJQUxfQkZJTj15CitDT05GSUdfU0VSSUFMX0JGSU5fQ09OU09MRT15CitDT05GSUdfU0VSSUFMX0JGSU5fRE1BPXkKKyMgQ09ORklHX1NFUklBTF9CRklOX1BJTyBpcyBub3Qgc2V0CitDT05GSUdfU0VSSUFMX0JGSU5fVUFSVDA9eQorIyBDT05GSUdfQkZJTl9VQVJUMF9DVFNSVFMgaXMgbm90IHNldAorQ09ORklHX1NFUklBTF9CRklOX1VBUlQxPXkKKyMgQ09ORklHX0JGSU5fVUFSVDFfQ1RTUlRTIGlzIG5vdCBzZXQKK0NPTkZJR19TRVJJQUxfQkZJTl9VQVJUMj15CisjIENPTkZJR19CRklOX1VBUlQyX0NUU1JUUyBpcyBub3Qgc2V0CitDT05GSUdfU0VSSUFMX0NPUkU9eQorQ09ORklHX1NFUklBTF9DT1JFX0NPTlNPTEU9eQorIyBDT05GSUdfU0VSSUFMX0JGSU5fU1BPUlQgaXMgbm90IHNldAorQ09ORklHX1VOSVg5OF9QVFlTPXkKKyMgQ09ORklHX0xFR0FDWV9QVFlTIGlzIG5vdCBzZXQKKworIworIyBDQU4sIHRoZSBjYXIgYnVzIGFuZCBpbmR1c3RyaWFsIGZpZWxkYnVzCisjCisjIENPTkZJR19DQU40TElOVVggaXMgbm90IHNldAorIyBDT05GSUdfSVBNSV9IQU5ETEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hXX1JBTkRPTSBpcyBub3Qgc2V0CisjIENPTkZJR19SMzk2NCBpcyBub3Qgc2V0CisjIENPTkZJR19SQVdfRFJJVkVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RDR19UUE0gaXMgbm90IHNldAorQ09ORklHX0kyQz15CitDT05GSUdfSTJDX0JPQVJESU5GTz15CisjIENPTkZJR19JMkNfQ0hBUkRFViBpcyBub3Qgc2V0CitDT05GSUdfSTJDX0hFTFBFUl9BVVRPPXkKKworIworIyBJMkMgSGFyZHdhcmUgQnVzIHN1cHBvcnQKKyMKKworIworIyBJMkMgc3lzdGVtIGJ1cyBkcml2ZXJzIChtb3N0bHkgZW1iZWRkZWQgLyBzeXN0ZW0tb24tY2hpcCkKKyMKK0NPTkZJR19JMkNfQkxBQ0tGSU5fVFdJPXkKK0NPTkZJR19JMkNfQkxBQ0tGSU5fVFdJX0NMS19LSFo9MTAwCisjIENPTkZJR19JMkNfR1BJTyBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfT0NPUkVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19TSU1URUMgaXMgbm90IHNldAorCisjCisjIEV4dGVybmFsIEkyQy9TTUJ1cyBhZGFwdGVyIGRyaXZlcnMKKyMKKyMgQ09ORklHX0kyQ19QQVJQT1JUX0xJR0hUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19UQU9TX0VWTSBpcyBub3Qgc2V0CisKKyMKKyMgT3RoZXIgSTJDL1NNQnVzIGJ1cyBkcml2ZXJzCisjCisjIENPTkZJR19JMkNfUENBX1BMQVRGT1JNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19TVFVCIGlzIG5vdCBzZXQKKworIworIyBNaXNjZWxsYW5lb3VzIEkyQyBDaGlwIHN1cHBvcnQKKyMKKyMgQ09ORklHX0RTMTY4MiBpcyBub3Qgc2V0CisjIENPTkZJR19BVDI0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQUQ1MjUyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfRUVQUk9NIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfUENGODU3NCBpcyBub3Qgc2V0CisjIENPTkZJR19QQ0Y4NTc1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfUENBOTUzOSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1BDRjg1OTEgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19NQVg2ODc1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVFNMMjU1MCBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfREVCVUdfQ09SRSBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfREVCVUdfQUxHTyBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfREVCVUdfQlVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19ERUJVR19DSElQIGlzIG5vdCBzZXQKK0NPTkZJR19TUEk9eQorIyBDT05GSUdfU1BJX0RFQlVHIGlzIG5vdCBzZXQKK0NPTkZJR19TUElfTUFTVEVSPXkKKworIworIyBTUEkgTWFzdGVyIENvbnRyb2xsZXIgRHJpdmVycworIworQ09ORklHX1NQSV9CRklOPXkKKyMgQ09ORklHX1NQSV9CRklOX0xPQ0sgaXMgbm90IHNldAorIyBDT05GSUdfU1BJX0JJVEJBTkcgaXMgbm90IHNldAorCisjCisjIFNQSSBQcm90b2NvbCBNYXN0ZXJzCisjCisjIENPTkZJR19TUElfQVQyNSBpcyBub3Qgc2V0CisjIENPTkZJR19TUElfU1BJREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NQSV9UTEU2MlgwIGlzIG5vdCBzZXQKK0NPTkZJR19BUkNIX1dBTlRfT1BUSU9OQUxfR1BJT0xJQj15CisjIENPTkZJR19HUElPTElCIGlzIG5vdCBzZXQKKyMgQ09ORklHX1cxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BPV0VSX1NVUFBMWSBpcyBub3Qgc2V0CitDT05GSUdfSFdNT049eQorIyBDT05GSUdfSFdNT05fVklEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQUQ3NDE0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQUQ3NDE4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQURDWFggaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRE0xMDIxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQURNMTAyNSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FETTEwMjYgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRE0xMDI5IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQURNMTAzMSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FETTkyNDAgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRFQ3NDcwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQURUNzQ3MyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FUWFAxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfRFMxNjIxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfRjcxODA1RiBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0Y3MTg4MkZHIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfRjc1Mzc1UyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0dMNTE4U00gaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19HTDUyMFNNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfSVQ4NyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNNjMgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTcwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE03NSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNNzcgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTc4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE04MCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNODMgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTg1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE04NyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNOTAgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTkyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE05MyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX01BWDExMTEgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19NQVgxNjE5IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTUFYNjY1MCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1BDODczNjAgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19QQzg3NDI3IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfRE1FMTczNyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1NNU0M0N00xIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfU01TQzQ3TTE5MiBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1NNU0M0N0IzOTcgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRFM3ODI4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVEhNQzUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVlQxMjExIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVzgzNzgxRCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1c4Mzc5MUQgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19XODM3OTJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVzgzNzkzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVzgzTDc4NVRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVzgzTDc4Nk5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVzgzNjI3SEYgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19XODM2MjdFSEYgaXMgbm90IHNldAorIyBDT05GSUdfSFdNT05fREVCVUdfQ0hJUCBpcyBub3Qgc2V0CisjIENPTkZJR19USEVSTUFMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RIRVJNQUxfSFdNT04gaXMgbm90IHNldAorQ09ORklHX1dBVENIRE9HPXkKKyMgQ09ORklHX1dBVENIRE9HX05PV0FZT1VUIGlzIG5vdCBzZXQKKworIworIyBXYXRjaGRvZyBEZXZpY2UgRHJpdmVycworIworIyBDT05GSUdfU09GVF9XQVRDSERPRyBpcyBub3Qgc2V0CitDT05GSUdfQkZJTl9XRFQ9eQorCisjCisjIE11bHRpZnVuY3Rpb24gZGV2aWNlIGRyaXZlcnMKKyMKKyMgQ09ORklHX01GRF9DT1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9TTTUwMSBpcyBub3Qgc2V0CisjIENPTkZJR19IVENfUEFTSUMzIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9UTUlPIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9XTTg0MDAgaXMgbm90IHNldAorIyBDT05GSUdfTUZEX1dNODM1MF9JMkMgaXMgbm90IHNldAorCisjCisjIE11bHRpbWVkaWEgZGV2aWNlcworIworCisjCisjIE11bHRpbWVkaWEgY29yZSBzdXBwb3J0CisjCisjIENPTkZJR19WSURFT19ERVYgaXMgbm90IHNldAorIyBDT05GSUdfRFZCX0NPUkUgaXMgbm90IHNldAorIyBDT05GSUdfVklERU9fTUVESUEgaXMgbm90IHNldAorCisjCisjIE11bHRpbWVkaWEgZHJpdmVycworIworIyBDT05GSUdfREFCIGlzIG5vdCBzZXQKKworIworIyBHcmFwaGljcyBzdXBwb3J0CisjCisjIENPTkZJR19WR0FTVEFURSBpcyBub3Qgc2V0CisjIENPTkZJR19WSURFT19PVVRQVVRfQ09OVFJPTCBpcyBub3Qgc2V0CitDT05GSUdfRkI9bQorIyBDT05GSUdfRklSTVdBUkVfRURJRCBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9EREMgaXMgbm90IHNldAorIyBDT05GSUdfRkJfQk9PVF9WRVNBX1NVUFBPUlQgaXMgbm90IHNldAorQ09ORklHX0ZCX0NGQl9GSUxMUkVDVD1tCitDT05GSUdfRkJfQ0ZCX0NPUFlBUkVBPW0KK0NPTkZJR19GQl9DRkJfSU1BR0VCTElUPW0KKyMgQ09ORklHX0ZCX0NGQl9SRVZfUElYRUxTX0lOX0JZVEUgaXMgbm90IHNldAorIyBDT05GSUdfRkJfU1lTX0ZJTExSRUNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX1NZU19DT1BZQVJFQSBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9TWVNfSU1BR0VCTElUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX0ZPUkVJR05fRU5ESUFOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX1NZU19GT1BTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX1NWR0FMSUIgaXMgbm90IHNldAorIyBDT05GSUdfRkJfTUFDTU9ERVMgaXMgbm90IHNldAorIyBDT05GSUdfRkJfQkFDS0xJR0hUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX01PREVfSEVMUEVSUyBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9USUxFQkxJVFRJTkcgaXMgbm90IHNldAorCisjCisjIEZyYW1lIGJ1ZmZlciBoYXJkd2FyZSBkcml2ZXJzCisjCisjIENPTkZJR19GQl9CRklOX1QzNTBNQ1FCIGlzIG5vdCBzZXQKK0NPTkZJR19GQl9CRklOX0xRMDM1UTE9bQorIyBDT05GSUdfRkJfQkZJTl83MzkzIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX1MxRDEzWFhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX1ZJUlRVQUwgaXMgbm90IHNldAorIyBDT05GSUdfRkJfTUVUUk9OT01FIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JBQ0tMSUdIVF9MQ0RfU1VQUE9SVCBpcyBub3Qgc2V0CisKKyMKKyMgRGlzcGxheSBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfRElTUExBWV9TVVBQT1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xPR08gaXMgbm90IHNldAorIyBDT05GSUdfU09VTkQgaXMgbm90IHNldAorQ09ORklHX0hJRF9TVVBQT1JUPXkKK0NPTkZJR19ISUQ9eQorIyBDT05GSUdfSElEX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hJRFJBVyBpcyBub3Qgc2V0CisjIENPTkZJR19ISURfUElEIGlzIG5vdCBzZXQKKworIworIyBTcGVjaWFsIEhJRCBkcml2ZXJzCisjCitDT05GSUdfSElEX0NPTVBBVD15CisjIENPTkZJR19VU0JfU1VQUE9SVCBpcyBub3Qgc2V0CisjIENPTkZJR19NTUMgaXMgbm90IHNldAorIyBDT05GSUdfTUVNU1RJQ0sgaXMgbm90IHNldAorIyBDT05GSUdfTkVXX0xFRFMgaXMgbm90IHNldAorIyBDT05GSUdfQUNDRVNTSUJJTElUWSBpcyBub3Qgc2V0CitDT05GSUdfUlRDX0xJQj15CitDT05GSUdfUlRDX0NMQVNTPXkKK0NPTkZJR19SVENfSENUT1NZUz15CitDT05GSUdfUlRDX0hDVE9TWVNfREVWSUNFPSJydGMwIgorIyBDT05GSUdfUlRDX0RFQlVHIGlzIG5vdCBzZXQKKworIworIyBSVEMgaW50ZXJmYWNlcworIworQ09ORklHX1JUQ19JTlRGX1NZU0ZTPXkKK0NPTkZJR19SVENfSU5URl9QUk9DPXkKK0NPTkZJR19SVENfSU5URl9ERVY9eQorIyBDT05GSUdfUlRDX0lOVEZfREVWX1VJRV9FTVVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfVEVTVCBpcyBub3Qgc2V0CisKKyMKKyMgSTJDIFJUQyBkcml2ZXJzCisjCisjIENPTkZJR19SVENfRFJWX0RTMTMwNyBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX0RTMTM3NCBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX0RTMTY3MiBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX01BWDY5MDAgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9SUzVDMzcyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfSVNMMTIwOCBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX1gxMjA1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfUENGODU2MyBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX1BDRjg1ODMgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9NNDFUODAgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9TMzUzOTBBIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfRk0zMTMwIGlzIG5vdCBzZXQKKworIworIyBTUEkgUlRDIGRyaXZlcnMKKyMKKyMgQ09ORklHX1JUQ19EUlZfTTQxVDk0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfRFMxMzA1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfTUFYNjkwMiBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX1I5NzAxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfUlM1QzM0OCBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX0RTMzIzNCBpcyBub3Qgc2V0CisKKyMKKyMgUGxhdGZvcm0gUlRDIGRyaXZlcnMKKyMKKyMgQ09ORklHX1JUQ19EUlZfRFMxMjg2IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfRFMxNTExIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfRFMxNTUzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfRFMxNzQyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfU1RLMTdUQTggaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9NNDhUODYgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9NNDhUMzUgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9NNDhUNTkgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9CUTQ4MDIgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9WMzAyMCBpcyBub3Qgc2V0CisKKyMKKyMgb24tQ1BVIFJUQyBkcml2ZXJzCisjCitDT05GSUdfUlRDX0RSVl9CRklOPXkKKyMgQ09ORklHX0RNQURFVklDRVMgaXMgbm90IHNldAorIyBDT05GSUdfVUlPIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NUQUdJTkcgaXMgbm90IHNldAorCisjCisjIEZpbGUgc3lzdGVtcworIworIyBDT05GSUdfRVhUMl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19FWFQzX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYVDRfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUkVJU0VSRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0CitDT05GSUdfRklMRV9MT0NLSU5HPXkKKyMgQ09ORklHX1hGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19PQ0ZTMl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19ETk9USUZZIGlzIG5vdCBzZXQKK0NPTkZJR19JTk9USUZZPXkKK0NPTkZJR19JTk9USUZZX1VTRVI9eQorIyBDT05GSUdfUVVPVEEgaXMgbm90IHNldAorIyBDT05GSUdfQVVUT0ZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FVVE9GUzRfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRlVTRV9GUyBpcyBub3Qgc2V0CisKKyMKKyMgQ0QtUk9NL0RWRCBGaWxlc3lzdGVtcworIworIyBDT05GSUdfSVNPOTY2MF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19VREZfRlMgaXMgbm90IHNldAorCisjCisjIERPUy9GQVQvTlQgRmlsZXN5c3RlbXMKKyMKKyMgQ09ORklHX01TRE9TX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZGQVRfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTlRGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgUHNldWRvIGZpbGVzeXN0ZW1zCisjCitDT05GSUdfUFJPQ19GUz15CitDT05GSUdfUFJPQ19TWVNDVEw9eQorQ09ORklHX1NZU0ZTPXkKKyMgQ09ORklHX1RNUEZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hVR0VUTEJfUEFHRSBpcyBub3Qgc2V0CisjIENPTkZJR19DT05GSUdGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgTWlzY2VsbGFuZW91cyBmaWxlc3lzdGVtcworIworIyBDT05GSUdfQURGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19BRkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IRlNQTFVTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JFRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VGU19GUyBpcyBub3Qgc2V0CitDT05GSUdfWUFGRlNfRlM9bQorQ09ORklHX1lBRkZTX1lBRkZTMT15CisjIENPTkZJR19ZQUZGU185QllURV9UQUdTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1lBRkZTX0RPRVNfRUNDIGlzIG5vdCBzZXQKK0NPTkZJR19ZQUZGU19ZQUZGUzI9eQorQ09ORklHX1lBRkZTX0FVVE9fWUFGRlMyPXkKKyMgQ09ORklHX1lBRkZTX0RJU0FCTEVfTEFaWV9MT0FEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1lBRkZTX0RJU0FCTEVfV0lERV9UTk9ERVMgaXMgbm90IHNldAorIyBDT05GSUdfWUFGRlNfQUxXQVlTX0NIRUNLX0NIVU5LX0VSQVNFRCBpcyBub3Qgc2V0CitDT05GSUdfWUFGRlNfU0hPUlRfTkFNRVNfSU5fUkFNPXkKK0NPTkZJR19KRkZTMl9GUz1tCitDT05GSUdfSkZGUzJfRlNfREVCVUc9MAorQ09ORklHX0pGRlMyX0ZTX1dSSVRFQlVGRkVSPXkKKyMgQ09ORklHX0pGRlMyX0ZTX1dCVUZfVkVSSUZZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGRlMyX1NVTU1BUlkgaXMgbm90IHNldAorIyBDT05GSUdfSkZGUzJfRlNfWEFUVFIgaXMgbm90IHNldAorIyBDT05GSUdfSkZGUzJfQ09NUFJFU1NJT05fT1BUSU9OUyBpcyBub3Qgc2V0CitDT05GSUdfSkZGUzJfWkxJQj15CisjIENPTkZJR19KRkZTMl9MWk8gaXMgbm90IHNldAorQ09ORklHX0pGRlMyX1JUSU1FPXkKKyMgQ09ORklHX0pGRlMyX1JVQklOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQU1GUyBpcyBub3Qgc2V0CisjIENPTkZJR19WWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01JTklYX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX09NRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSFBGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19RTlg0RlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUk9NRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfU1lTVl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19VRlNfRlMgaXMgbm90IHNldAorQ09ORklHX05FVFdPUktfRklMRVNZU1RFTVM9eQorQ09ORklHX05GU19GUz1tCitDT05GSUdfTkZTX1YzPXkKKyMgQ09ORklHX05GU19WM19BQ0wgaXMgbm90IHNldAorIyBDT05GSUdfTkZTX1Y0IGlzIG5vdCBzZXQKKyMgQ09ORklHX05GU0QgaXMgbm90IHNldAorQ09ORklHX0xPQ0tEPW0KK0NPTkZJR19MT0NLRF9WND15CitDT05GSUdfTkZTX0NPTU1PTj15CitDT05GSUdfU1VOUlBDPW0KKyMgQ09ORklHX1NVTlJQQ19SRUdJU1RFUl9WNCBpcyBub3Qgc2V0CisjIENPTkZJR19SUENTRUNfR1NTX0tSQjUgaXMgbm90IHNldAorIyBDT05GSUdfUlBDU0VDX0dTU19TUEtNMyBpcyBub3Qgc2V0CitDT05GSUdfU01CX0ZTPW0KKyMgQ09ORklHX1NNQl9OTFNfREVGQVVMVCBpcyBub3Qgc2V0CisjIENPTkZJR19DSUZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX05DUF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19DT0RBX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgUGFydGl0aW9uIFR5cGVzCisjCisjIENPTkZJR19QQVJUSVRJT05fQURWQU5DRUQgaXMgbm90IHNldAorQ09ORklHX01TRE9TX1BBUlRJVElPTj15CitDT05GSUdfTkxTPW0KK0NPTkZJR19OTFNfREVGQVVMVD0iaXNvODg1OS0xIgorIyBDT05GSUdfTkxTX0NPREVQQUdFXzQzNyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfNzM3IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV83NzUgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg1MCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODUyIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NTUgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg1NyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODYwIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjEgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODYzIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjQgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2NSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODY2IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjkgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzkzNiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfOTUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV85MzIgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzk0OSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODc0IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzggaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzEyNTAgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzEyNTEgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0FTQ0lJIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzEgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfMiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV8zIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzQgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfNSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV82IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzcgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfOSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV8xMyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV8xNCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV8xNSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfS09JOF9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19LT0k4X1UgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX1VURjggaXMgbm90IHNldAorIyBDT05GSUdfRExNIGlzIG5vdCBzZXQKKworIworIyBLZXJuZWwgaGFja2luZworIworIyBDT05GSUdfUFJJTlRLX1RJTUUgaXMgbm90IHNldAorQ09ORklHX0VOQUJMRV9XQVJOX0RFUFJFQ0FURUQ9eQorQ09ORklHX0VOQUJMRV9NVVNUX0NIRUNLPXkKK0NPTkZJR19GUkFNRV9XQVJOPTEwMjQKKyMgQ09ORklHX01BR0lDX1NZU1JRIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VOVVNFRF9TWU1CT0xTIGlzIG5vdCBzZXQKK0NPTkZJR19ERUJVR19GUz15CisjIENPTkZJR19IRUFERVJTX0NIRUNLIGlzIG5vdCBzZXQKK0NPTkZJR19ERUJVR19LRVJORUw9eQorIyBDT05GSUdfREVCVUdfU0hJUlEgaXMgbm90IHNldAorQ09ORklHX0RFVEVDVF9TT0ZUTE9DS1VQPXkKKyMgQ09ORklHX0JPT1RQQVJBTV9TT0ZUTE9DS1VQX1BBTklDIGlzIG5vdCBzZXQKK0NPTkZJR19CT09UUEFSQU1fU09GVExPQ0tVUF9QQU5JQ19WQUxVRT0wCitDT05GSUdfU0NIRURfREVCVUc9eQorIyBDT05GSUdfU0NIRURTVEFUUyBpcyBub3Qgc2V0CisjIENPTkZJR19USU1FUl9TVEFUUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19PQkpFQ1RTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NMQUIgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfUlRfTVVURVhFUyBpcyBub3Qgc2V0CisjIENPTkZJR19SVF9NVVRFWF9URVNURVIgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU1BJTkxPQ0sgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfTVVURVhFUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TUElOTE9DS19TTEVFUCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19MT0NLSU5HX0FQSV9TRUxGVEVTVFMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfS09CSkVDVCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19CVUdWRVJCT1NFIGlzIG5vdCBzZXQKK0NPTkZJR19ERUJVR19JTkZPPXkKKyMgQ09ORklHX0RFQlVHX1ZNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1dSSVRFQ09VTlQgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfTUVNT1JZX0lOSVQgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfTElTVCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TRyBpcyBub3Qgc2V0CisjIENPTkZJR19GUkFNRV9QT0lOVEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JPT1RfUFJJTlRLX0RFTEFZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JDVV9UT1JUVVJFX1RFU1QgaXMgbm90IHNldAorIyBDT05GSUdfUkNVX0NQVV9TVEFMTF9ERVRFQ1RPUiBpcyBub3Qgc2V0CisjIENPTkZJR19CQUNLVFJBQ0VfU0VMRl9URVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0JMT0NLX0VYVF9ERVZUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZBVUxUX0lOSkVDVElPTiBpcyBub3Qgc2V0CitDT05GSUdfU1lTQ1RMX1NZU0NBTExfQ0hFQ0s9eQorIyBDT05GSUdfRFlOQU1JQ19QUklOVEtfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfU0FNUExFUyBpcyBub3Qgc2V0CitDT05GSUdfSEFWRV9BUkNIX0tHREI9eQorIyBDT05GSUdfS0dEQiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TVEFDS09WRVJGTE9XIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NUQUNLX1VTQUdFIGlzIG5vdCBzZXQKK0NPTkZJR19ERUJVR19WRVJCT1NFPXkKK0NPTkZJR19ERUJVR19NTVJTPXkKKyMgQ09ORklHX0RFQlVHX0hXRVJSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0RPVUJMRUZBVUxUIGlzIG5vdCBzZXQKK0NPTkZJR19ERUJVR19IVU5UX0ZPUl9aRVJPPXkKK0NPTkZJR19ERUJVR19CRklOX0hXVFJBQ0VfT049eQorQ09ORklHX0RFQlVHX0JGSU5fSFdUUkFDRV9DT01QUkVTU0lPTl9PRkY9eQorIyBDT05GSUdfREVCVUdfQkZJTl9IV1RSQUNFX0NPTVBSRVNTSU9OX09ORSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19CRklOX0hXVFJBQ0VfQ09NUFJFU1NJT05fVFdPIGlzIG5vdCBzZXQKK0NPTkZJR19ERUJVR19CRklOX0hXVFJBQ0VfQ09NUFJFU1NJT049MAorIyBDT05GSUdfREVCVUdfQkZJTl9IV1RSQUNFX0VYUEFORCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19CRklOX05PX0tFUk5fSFdUUkFDRSBpcyBub3Qgc2V0CitDT05GSUdfRUFSTFlfUFJJTlRLPXkKK0NPTkZJR19DUExCX0lORk89eQorQ09ORklHX0FDQ0VTU19DSEVDSz15CisKKyMKKyMgU2VjdXJpdHkgb3B0aW9ucworIworIyBDT05GSUdfS0VZUyBpcyBub3Qgc2V0CitDT05GSUdfU0VDVVJJVFk9eQorIyBDT05GSUdfU0VDVVJJVFlGUyBpcyBub3Qgc2V0CisjIENPTkZJR19TRUNVUklUWV9ORVRXT1JLIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFQ1VSSVRZX0ZJTEVfQ0FQQUJJTElUSUVTIGlzIG5vdCBzZXQKK0NPTkZJR19TRUNVUklUWV9ERUZBVUxUX01NQVBfTUlOX0FERFI9MAorQ09ORklHX0NSWVBUTz15CisKKyMKKyMgQ3J5cHRvIGNvcmUgb3IgaGVscGVyCisjCisjIENPTkZJR19DUllQVE9fRklQUyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fTUFOQUdFUiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fR0YxMjhNVUwgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX05VTEwgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0NSWVBURCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQVVUSEVOQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fVEVTVCBpcyBub3Qgc2V0CisKKyMKKyMgQXV0aGVudGljYXRlZCBFbmNyeXB0aW9uIHdpdGggQXNzb2NpYXRlZCBEYXRhCisjCisjIENPTkZJR19DUllQVE9fQ0NNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19HQ00gaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1NFUUlWIGlzIG5vdCBzZXQKKworIworIyBCbG9jayBtb2RlcworIworIyBDT05GSUdfQ1JZUFRPX0NCQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQ1RSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19DVFMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0VDQiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fTFJXIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19QQ0JDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19YVFMgaXMgbm90IHNldAorCisjCisjIEhhc2ggbW9kZXMKKyMKKyMgQ09ORklHX0NSWVBUT19ITUFDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19YQ0JDIGlzIG5vdCBzZXQKKworIworIyBEaWdlc3QKKyMKKyMgQ09ORklHX0NSWVBUT19DUkMzMkMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX01ENCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fTUQ1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19NSUNIQUVMX01JQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fUk1EMTI4IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19STUQxNjAgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1JNRDI1NiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fUk1EMzIwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TSEExIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TSEEyNTYgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1NIQTUxMiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fVEdSMTkyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19XUDUxMiBpcyBub3Qgc2V0CisKKyMKKyMgQ2lwaGVycworIworIyBDT05GSUdfQ1JZUFRPX0FFUyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQU5VQklTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19BUkM0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19CTE9XRklTSCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQ0FNRUxMSUEgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0NBU1Q1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19DQVNUNiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fREVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19GQ1JZUFQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0tIQVpBRCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0FMU0EyMCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0VFRCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0VSUEVOVCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fVEVBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19UV09GSVNIIGlzIG5vdCBzZXQKKworIworIyBDb21wcmVzc2lvbgorIworIyBDT05GSUdfQ1JZUFRPX0RFRkxBVEUgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0xaTyBpcyBub3Qgc2V0CisKKyMKKyMgUmFuZG9tIE51bWJlciBHZW5lcmF0aW9uCisjCisjIENPTkZJR19DUllQVE9fQU5TSV9DUFJORyBpcyBub3Qgc2V0CitDT05GSUdfQ1JZUFRPX0hXPXkKKworIworIyBMaWJyYXJ5IHJvdXRpbmVzCisjCitDT05GSUdfQklUUkVWRVJTRT15CitDT05GSUdfQ1JDX0NDSVRUPW0KKyMgQ09ORklHX0NSQzE2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQ19UMTBESUYgaXMgbm90IHNldAorIyBDT05GSUdfQ1JDX0lUVV9UIGlzIG5vdCBzZXQKK0NPTkZJR19DUkMzMj15CisjIENPTkZJR19DUkM3IGlzIG5vdCBzZXQKKyMgQ09ORklHX0xJQkNSQzMyQyBpcyBub3Qgc2V0CitDT05GSUdfWkxJQl9JTkZMQVRFPXkKK0NPTkZJR19aTElCX0RFRkxBVEU9bQorQ09ORklHX1BMSVNUPXkKK0NPTkZJR19IQVNfSU9NRU09eQorQ09ORklHX0hBU19JT1BPUlQ9eQorQ09ORklHX0hBU19ETUE9eQpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9jb25maWdzL0JGNTQ4LUVaS0lUX2RlZmNvbmZpZyBiL2FyY2gvYmxhY2tmaW4vY29uZmlncy9CRjU0OC1FWktJVF9kZWZjb25maWcKaW5kZXggYmY2MzY2MC4uZDRlZDljZSAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9jb25maWdzL0JGNTQ4LUVaS0lUX2RlZmNvbmZpZworKysgYi9hcmNoL2JsYWNrZmluL2NvbmZpZ3MvQkY1NDgtRVpLSVRfZGVmY29uZmlnCkBAIC0xLDYgKzEsNiBAQAogIwogIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAotIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjI0LjcKKyMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4yOC1yYzIKICMKICMgQ09ORklHX01NVSBpcyBub3Qgc2V0CiAjIENPTkZJR19GUFUgaXMgbm90IHNldApAQCAtOCw3ICs4LDYgQEAKICMgQ09ORklHX1JXU0VNX1hDSEdBRERfQUxHT1JJVEhNIGlzIG5vdCBzZXQKIENPTkZJR19CTEFDS0ZJTj15CiBDT05GSUdfWk9ORV9ETUE9eQotQ09ORklHX1NFTUFQSE9SRV9TTEVFUEVSUz15CiBDT05GSUdfR0VORVJJQ19GSU5EX05FWFRfQklUPXkKIENPTkZJR19HRU5FUklDX0hXRUlHSFQ9eQogQ09ORklHX0dFTkVSSUNfSEFSRElSUVM9eQpAQCAtMzEsMTggKzMwLDE2IEBACiAjIENPTkZJR19QT1NJWF9NUVVFVUUgaXMgbm90IHNldAogIyBDT05GSUdfQlNEX1BST0NFU1NfQUNDVCBpcyBub3Qgc2V0CiAjIENPTkZJR19UQVNLU1RBVFMgaXMgbm90IHNldAotIyBDT05GSUdfVVNFUl9OUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19QSURfTlMgaXMgbm90IHNldAogIyBDT05GSUdfQVVESVQgaXMgbm90IHNldAogQ09ORklHX0lLQ09ORklHPXkKIENPTkZJR19JS0NPTkZJR19QUk9DPXkKIENPTkZJR19MT0dfQlVGX1NISUZUPTE0CiAjIENPTkZJR19DR1JPVVBTIGlzIG5vdCBzZXQKLUNPTkZJR19GQUlSX0dST1VQX1NDSEVEPXkKLUNPTkZJR19GQUlSX1VTRVJfU0NIRUQ9eQotIyBDT05GSUdfRkFJUl9DR1JPVVBfU0NIRUQgaXMgbm90IHNldAotQ09ORklHX1NZU0ZTX0RFUFJFQ0FURUQ9eQorIyBDT05GSUdfR1JPVVBfU0NIRUQgaXMgbm90IHNldAorIyBDT05GSUdfU1lTRlNfREVQUkVDQVRFRCBpcyBub3Qgc2V0CisjIENPTkZJR19TWVNGU19ERVBSRUNBVEVEX1YyIGlzIG5vdCBzZXQKICMgQ09ORklHX1JFTEFZIGlzIG5vdCBzZXQKKyMgQ09ORklHX05BTUVTUEFDRVMgaXMgbm90IHNldAogQ09ORklHX0JMS19ERVZfSU5JVFJEPXkKIENPTkZJR19JTklUUkFNRlNfU09VUkNFPSIiCiAjIENPTkZJR19DQ19PUFRJTUlaRV9GT1JfU0laRSBpcyBub3Qgc2V0CkBAIC01MSwyNiArNDgsMzUgQEAKIENPTkZJR19VSUQxNj15CiBDT05GSUdfU1lTQ1RMX1NZU0NBTEw9eQogQ09ORklHX0tBTExTWU1TPXkKKyMgQ09ORklHX0tBTExTWU1TX0FMTCBpcyBub3Qgc2V0CiAjIENPTkZJR19LQUxMU1lNU19FWFRSQV9QQVNTIGlzIG5vdCBzZXQKIENPTkZJR19IT1RQTFVHPXkKIENPTkZJR19QUklOVEs9eQogQ09ORklHX0JVRz15Ci1DT05GSUdfRUxGX0NPUkU9eQorIyBDT05GSUdfRUxGX0NPUkUgaXMgbm90IHNldAorQ09ORklHX0NPTVBBVF9CUks9eQogQ09ORklHX0JBU0VfRlVMTD15CiBDT05GSUdfRlVURVg9eQogQ09ORklHX0FOT05fSU5PREVTPXkKIENPTkZJR19FUE9MTD15CiBDT05GSUdfU0lHTkFMRkQ9eQorQ09ORklHX1RJTUVSRkQ9eQogQ09ORklHX0VWRU5URkQ9eQorQ09ORklHX0FJTz15CiBDT05GSUdfVk1fRVZFTlRfQ09VTlRFUlM9eQogQ09ORklHX1NMQUI9eQogIyBDT05GSUdfU0xVQiBpcyBub3Qgc2V0CiAjIENPTkZJR19TTE9CIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BST0ZJTElORyBpcyBub3Qgc2V0CisjIENPTkZJR19NQVJLRVJTIGlzIG5vdCBzZXQKK0NPTkZJR19IQVZFX09QUk9GSUxFPXkKKyMgQ09ORklHX0hBVkVfR0VORVJJQ19ETUFfQ09IRVJFTlQgaXMgbm90IHNldAogQ09ORklHX1NMQUJJTkZPPXkKIENPTkZJR19SVF9NVVRFWEVTPXkKIENPTkZJR19USU5ZX1NITUVNPXkKIENPTkZJR19CQVNFX1NNQUxMPTAKIENPTkZJR19NT0RVTEVTPXkKKyMgQ09ORklHX01PRFVMRV9GT1JDRV9MT0FEIGlzIG5vdCBzZXQKIENPTkZJR19NT0RVTEVfVU5MT0FEPXkKICMgQ09ORklHX01PRFVMRV9GT1JDRV9VTkxPQUQgaXMgbm90IHNldAogIyBDT05GSUdfTU9EVkVSU0lPTlMgaXMgbm90IHNldApAQCAtODEsNiArODcsNyBAQAogIyBDT05GSUdfQkxLX0RFVl9JT19UUkFDRSBpcyBub3Qgc2V0CiAjIENPTkZJR19MU0YgaXMgbm90IHNldAogIyBDT05GSUdfQkxLX0RFVl9CU0cgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9JTlRFR1JJVFkgaXMgbm90IHNldAogCiAjCiAjIElPIFNjaGVkdWxlcnMKQEAgLTk0LDkgKzEwMSwxMSBAQAogIyBDT05GSUdfREVGQVVMVF9DRlEgaXMgbm90IHNldAogIyBDT05GSUdfREVGQVVMVF9OT09QIGlzIG5vdCBzZXQKIENPTkZJR19ERUZBVUxUX0lPU0NIRUQ9ImFudGljaXBhdG9yeSIKK0NPTkZJR19DTEFTU0lDX1JDVT15CiAjIENPTkZJR19QUkVFTVBUX05PTkUgaXMgbm90IHNldAogQ09ORklHX1BSRUVNUFRfVk9MVU5UQVJZPXkKICMgQ09ORklHX1BSRUVNUFQgaXMgbm90IHNldAorIyBDT05GSUdfRlJFRVpFUiBpcyBub3Qgc2V0CiAKICMKICMgQmxhY2tmaW4gUHJvY2Vzc29yIE9wdGlvbnMKQEAgLTEwNSw2ICsxMTQsMTAgQEAKICMKICMgUHJvY2Vzc29yIGFuZCBCb2FyZCBTZXR0aW5ncwogIworIyBDT05GSUdfQkY1MTIgaXMgbm90IHNldAorIyBDT05GSUdfQkY1MTQgaXMgbm90IHNldAorIyBDT05GSUdfQkY1MTYgaXMgbm90IHNldAorIyBDT05GSUdfQkY1MTggaXMgbm90IHNldAogIyBDT05GSUdfQkY1MjIgaXMgbm90IHNldAogIyBDT05GSUdfQkY1MjMgaXMgbm90IHNldAogIyBDT05GSUdfQkY1MjQgaXMgbm90IHNldApAQCAtMTE3LDE4ICsxMzAsMjMgQEAKICMgQ09ORklHX0JGNTM0IGlzIG5vdCBzZXQKICMgQ09ORklHX0JGNTM2IGlzIG5vdCBzZXQKICMgQ09ORklHX0JGNTM3IGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGNTM4IGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGNTM5IGlzIG5vdCBzZXQKICMgQ09ORklHX0JGNTQyIGlzIG5vdCBzZXQKICMgQ09ORklHX0JGNTQ0IGlzIG5vdCBzZXQKICMgQ09ORklHX0JGNTQ3IGlzIG5vdCBzZXQKIENPTkZJR19CRjU0OD15CiAjIENPTkZJR19CRjU0OSBpcyBub3Qgc2V0CiAjIENPTkZJR19CRjU2MSBpcyBub3Qgc2V0CitDT05GSUdfQkZfUkVWX01JTj0wCitDT05GSUdfQkZfUkVWX01BWD0yCiBDT05GSUdfQkZfUkVWXzBfMD15CiAjIENPTkZJR19CRl9SRVZfMF8xIGlzIG5vdCBzZXQKICMgQ09ORklHX0JGX1JFVl8wXzIgaXMgbm90IHNldAogIyBDT05GSUdfQkZfUkVWXzBfMyBpcyBub3Qgc2V0CiAjIENPTkZJR19CRl9SRVZfMF80IGlzIG5vdCBzZXQKICMgQ09ORklHX0JGX1JFVl8wXzUgaXMgbm90IHNldAorIyBDT05GSUdfQkZfUkVWXzBfNiBpcyBub3Qgc2V0CiAjIENPTkZJR19CRl9SRVZfQU5ZIGlzIG5vdCBzZXQKICMgQ09ORklHX0JGX1JFVl9OT05FIGlzIG5vdCBzZXQKIENPTkZJR19CRjU0eD15CkBAIC0xMzgsMTUgKzE1NiwxMiBAQAogQ09ORklHX0lSUV9TUE9SVDBfVFg9OQogQ09ORklHX0lSUV9TUE9SVDFfUlg9OQogQ09ORklHX0lSUV9TUE9SVDFfVFg9OQorQ09ORklHX0lSUV9TUEkwPTEwCiBDT05GSUdfSVJRX1VBUlQwX1JYPTEwCiBDT05GSUdfSVJRX1VBUlQwX1RYPTEwCiBDT05GSUdfSVJRX1VBUlQxX1JYPTEwCiBDT05GSUdfSVJRX1VBUlQxX1RYPTEwCiBDT05GSUdfSVJRX0NOVD04Ci1DT05GSUdfSVJRX1VTQl9JTlQwPTExCi1DT05GSUdfSVJRX1VTQl9JTlQxPTExCi1DT05GSUdfSVJRX1VTQl9JTlQyPTExCi1DT05GSUdfSVJRX1VTQl9ETUE9MTEKIENPTkZJR19JUlFfVElNRVIwPTExCiBDT05GSUdfSVJRX1RJTUVSMT0xMQogQ09ORklHX0lSUV9USU1FUjI9MTEKQEAgLTE1NSw5ICsxNzAsMjEgQEAKIENPTkZJR19JUlFfVElNRVI1PTExCiBDT05GSUdfSVJRX1RJTUVSNj0xMQogQ09ORklHX0lSUV9USU1FUjc9MTEKK0NPTkZJR19JUlFfVVNCX0lOVDA9MTEKK0NPTkZJR19JUlFfVVNCX0lOVDE9MTEKK0NPTkZJR19JUlFfVVNCX0lOVDI9MTEKK0NPTkZJR19JUlFfVVNCX0RNQT0xMQogQ09ORklHX0lSUV9USU1FUjg9MTEKIENPTkZJR19JUlFfVElNRVI5PTExCiBDT05GSUdfSVJRX1RJTUVSMTA9MTEKK0NPTkZJR19JUlFfU1BPUlQyX1JYPTkKK0NPTkZJR19JUlFfU1BPUlQyX1RYPTkKK0NPTkZJR19JUlFfU1BPUlQzX1JYPTkKK0NPTkZJR19JUlFfU1BPUlQzX1RYPTkKK0NPTkZJR19JUlFfU1BJMT0xMAorQ09ORklHX0lSUV9TUEkyPTEwCitDT05GSUdfSVJRX1RXSTA9MTEKK0NPTkZJR19JUlFfVFdJMT0xMQogQ09ORklHX0JGSU41NDhfRVpLSVQ9eQogIyBDT05GSUdfQkZJTjU0OF9CTFVFVEVDSE5JWF9DTSBpcyBub3Qgc2V0CiAKQEAgLTE4MCw3ICsyMDcsNiBAQAogQ09ORklHX0lSUV9TUEkwX0VSUj03CiBDT05GSUdfSVJRX1VBUlQwX0VSUj03CiBDT05GSUdfSVJRX0VQUEkwPTgKLUNPTkZJR19JUlFfU1BJMD0xMAogQ09ORklHX0lSUV9QSU5UMD0xMgogQ09ORklHX0lSUV9QSU5UMT0xMgogQ09ORklHX0lSUV9NRE1BUzA9MTMKQEAgLTE5NSwxOCArMjIxLDEwIEBACiBDT05GSUdfSVJRX1VBUlQxX0VSUj03CiBDT05GSUdfSVJRX1VBUlQyX0VSUj03CiBDT05GSUdfSVJRX0NBTjBfRVJSPTcKLUNPTkZJR19JUlFfU1BPUlQyX1JYPTkKLUNPTkZJR19JUlFfU1BPUlQyX1RYPTkKLUNPTkZJR19JUlFfU1BPUlQzX1JYPTkKLUNPTkZJR19JUlFfU1BPUlQzX1RYPTkKIENPTkZJR19JUlFfRVBQSTE9OQogQ09ORklHX0lSUV9FUFBJMj05Ci1DT05GSUdfSVJRX1NQSTE9MTAKLUNPTkZJR19JUlFfU1BJMj0xMAogQ09ORklHX0lSUV9BVEFQSV9SWD0xMAogQ09ORklHX0lSUV9BVEFQSV9UWD0xMAotQ09ORklHX0lSUV9UV0kwPTExCi1DT05GSUdfSVJRX1RXSTE9MTEKIENPTkZJR19JUlFfQ0FOMF9SWD0xMQogQ09ORklHX0lSUV9DQU4wX1RYPTExCiBDT05GSUdfSVJRX01ETUFTMj0xMwpAQCAtMjYwLDcgKzI3OCw2IEBACiAjCiBDT05GSUdfQ0xLSU5fSFo9MjUwMDAwMDAKICMgQ09ORklHX0JGSU5fS0VSTkVMX0NMT0NLIGlzIG5vdCBzZXQKLUNPTkZJR19NQVhfTUVNX1NJWkU9NTEyCiBDT05GSUdfTUFYX1ZDT19IWj02MDAwMDAwMDAKIENPTkZJR19NSU5fVkNPX0haPTUwMDAwMDAwCiBDT05GSUdfTUFYX1NDTEtfSFo9MTMzMzMzMzMzCkBAIC0yNzQsMTAgKzI5MSwxMCBAQAogIyBDT05GSUdfSFpfMzAwIGlzIG5vdCBzZXQKICMgQ09ORklHX0haXzEwMDAgaXMgbm90IHNldAogQ09ORklHX0haPTI1MAorIyBDT05GSUdfU0NIRURfSFJUSUNLIGlzIG5vdCBzZXQKIENPTkZJR19HRU5FUklDX1RJTUU9eQogQ09ORklHX0dFTkVSSUNfQ0xPQ0tFVkVOVFM9eQogIyBDT05GSUdfQ1lDTEVTX0NMT0NLU09VUkNFIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RJQ0tfT05FU0hPVCBpcyBub3Qgc2V0CiAjIENPTkZJR19OT19IWiBpcyBub3Qgc2V0CiAjIENPTkZJR19ISUdIX1JFU19USU1FUlMgaXMgbm90IHNldAogQ09ORklHX0dFTkVSSUNfQ0xPQ0tFVkVOVFNfQlVJTEQ9eQpAQCAtMzExLDYgKzMyOCwxMiBAQAogQ09ORklHX0NBQ0hFTElORV9BTElHTkVEX0wxPXkKICMgQ09ORklHX1NZU0NBTExfVEFCX0wxIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQTEJfU1dJVENIX1RBQl9MMSBpcyBub3Qgc2V0CitDT05GSUdfQVBQX1NUQUNLX0wxPXkKKworIworIyBTcGVlZCBPcHRpbWl6YXRpb25zCisjCitDT05GSUdfQkZJTl9JTlNfTE9XT1ZFUkhFQUQ9eQogQ09ORklHX1JBTUtFUk5FTD15CiAjIENPTkZJR19ST01LRVJORUwgaXMgbm90IHNldAogQ09ORklHX1NFTEVDVF9NRU1PUllfTU9ERUw9eQpAQCAtMzE5LDE0ICszNDIsMTMgQEAKICMgQ09ORklHX1NQQVJTRU1FTV9NQU5VQUwgaXMgbm90IHNldAogQ09ORklHX0ZMQVRNRU09eQogQ09ORklHX0ZMQVRfTk9ERV9NRU1fTUFQPXkKLSMgQ09ORklHX1NQQVJTRU1FTV9TVEFUSUMgaXMgbm90IHNldAotIyBDT05GSUdfU1BBUlNFTUVNX1ZNRU1NQVBfRU5BQkxFIGlzIG5vdCBzZXQKK0NPTkZJR19QQUdFRkxBR1NfRVhURU5ERUQ9eQogQ09ORklHX1NQTElUX1BUTE9DS19DUFVTPTQKICMgQ09ORklHX1JFU09VUkNFU182NEJJVCBpcyBub3Qgc2V0CisjIENPTkZJR19QSFlTX0FERFJfVF82NEJJVCBpcyBub3Qgc2V0CiBDT05GSUdfWk9ORV9ETUFfRkxBRz0xCiBDT05GSUdfVklSVF9UT19CVVM9eQogIyBDT05GSUdfQkZJTl9HUFRJTUVSUyBpcyBub3Qgc2V0Ci1DT05GSUdfQkZJTl9ETUFfNVhYPXkKICMgQ09ORklHX0RNQV9VTkNBQ0hFRF80TSBpcyBub3Qgc2V0CiBDT05GSUdfRE1BX1VOQ0FDSEVEXzJNPXkKICMgQ09ORklHX0RNQV9VTkNBQ0hFRF8xTSBpcyBub3Qgc2V0CkBAIC0zNDEsNyArMzYzLDcgQEAKICMgQ09ORklHX0JGSU5fSUNBQ0hFX0xPQ0sgaXMgbm90IHNldAogIyBDT05GSUdfQkZJTl9XQiBpcyBub3Qgc2V0CiBDT05GSUdfQkZJTl9XVD15Ci1DT05GSUdfTDFfTUFYX1BJRUNFPTE2CisjIENPTkZJR19CRklOX0wyX0NBQ0hFQUJMRSBpcyBub3Qgc2V0CiAjIENPTkZJR19NUFUgaXMgbm90IHNldAogCiAjCkBAIC0zNzMsNyArMzk1LDYgQEAKICMKICMgQnVzIG9wdGlvbnMgKFBDSSwgUENNQ0lBLCBFSVNBLCBNQ0EsIElTQSkKICMKLSMgQ09ORklHX1BDSSBpcyBub3Qgc2V0CiAjIENPTkZJR19BUkNIX1NVUFBPUlRTX01TSSBpcyBub3Qgc2V0CiAjIENPTkZJR19QQ0NBUkQgaXMgbm90IHNldAogCkBAIC0zODQsMjMgKzQwNSwyMCBAQAogQ09ORklHX0JJTkZNVF9GTEFUPXkKIENPTkZJR19CSU5GTVRfWkZMQVQ9eQogIyBDT05GSUdfQklORk1UX1NIQVJFRF9GTEFUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hBVkVfQU9VVCBpcyBub3Qgc2V0CiAjIENPTkZJR19CSU5GTVRfTUlTQyBpcyBub3Qgc2V0CiAKICMKICMgUG93ZXIgbWFuYWdlbWVudCBvcHRpb25zCiAjCiAjIENPTkZJR19QTSBpcyBub3Qgc2V0Ci1DT05GSUdfU1VTUEVORF9VUF9QT1NTSUJMRT15CitDT05GSUdfQVJDSF9TVVNQRU5EX1BPU1NJQkxFPXkKICMgQ09ORklHX1BNX1dBS0VVUF9CWV9HUElPIGlzIG5vdCBzZXQKIAogIwogIyBDUFUgRnJlcXVlbmN5IHNjYWxpbmcKICMKICMgQ09ORklHX0NQVV9GUkVRIGlzIG5vdCBzZXQKLQotIwotIyBOZXR3b3JraW5nCi0jCiBDT05GSUdfTkVUPXkKIAogIwpAQCAtNDEzLDYgKzQzMSw3IEBACiAjIENPTkZJR19YRlJNX1VTRVIgaXMgbm90IHNldAogIyBDT05GSUdfWEZSTV9TVUJfUE9MSUNZIGlzIG5vdCBzZXQKICMgQ09ORklHX1hGUk1fTUlHUkFURSBpcyBub3Qgc2V0CisjIENPTkZJR19YRlJNX1NUQVRJU1RJQ1MgaXMgbm90IHNldAogIyBDT05GSUdfTkVUX0tFWSBpcyBub3Qgc2V0CiBDT05GSUdfSU5FVD15CiAjIENPTkZJR19JUF9NVUxUSUNBU1QgaXMgbm90IHNldApAQCAtNDQyLDggKzQ2MSw2IEBACiBDT05GSUdfREVGQVVMVF9UQ1BfQ09ORz0iY3ViaWMiCiAjIENPTkZJR19UQ1BfTUQ1U0lHIGlzIG5vdCBzZXQKICMgQ09ORklHX0lQVjYgaXMgbm90IHNldAotIyBDT05GSUdfSU5FVDZfWEZSTV9UVU5ORUwgaXMgbm90IHNldAotIyBDT05GSUdfSU5FVDZfVFVOTkVMIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVExBQkVMIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVFdPUktfU0VDTUFSSyBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRGSUxURVIgaXMgbm90IHNldApAQCAtNDUyLDYgKzQ2OSw3IEBACiAjIENPTkZJR19USVBDIGlzIG5vdCBzZXQKICMgQ09ORklHX0FUTSBpcyBub3Qgc2V0CiAjIENPTkZJR19CUklER0UgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0RTQSBpcyBub3Qgc2V0CiAjIENPTkZJR19WTEFOXzgwMjFRIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQ05FVCBpcyBub3Qgc2V0CiAjIENPTkZJR19MTEMyIGlzIG5vdCBzZXQKQEAgLTQ2OCw2ICs0ODYsNyBAQAogIwogIyBDT05GSUdfTkVUX1BLVEdFTiBpcyBub3Qgc2V0CiAjIENPTkZJR19IQU1SQURJTyBpcyBub3Qgc2V0CisjIENPTkZJR19DQU4gaXMgbm90IHNldAogQ09ORklHX0lSREE9bQogCiAjCkBAIC00OTMsOSArNTEyLDkgQEAKICMKIENPTkZJR19JUlRUWV9TSVI9bQogQ09ORklHX0JGSU5fU0lSPW0KK0NPTkZJR19CRklOX1NJUjM9eQogIyBDT05GSUdfQkZJTl9TSVIwIGlzIG5vdCBzZXQKICMgQ09ORklHX0JGSU5fU0lSMiBpcyBub3Qgc2V0Ci1DT05GSUdfQkZJTl9TSVIzPXkKIENPTkZJR19TSVJfQkZJTl9ETUE9eQogIyBDT05GSUdfU0lSX0JGSU5fUElPIGlzIG5vdCBzZXQKIApAQCAtNTA4LDE1ICs1MjcsNiBAQAogIyBDT05GSUdfS1M5NTlfRE9OR0xFIGlzIG5vdCBzZXQKIAogIwotIyBPbGQgU0lSIGRldmljZSBkcml2ZXJzCi0jCi0jIENPTkZJR19JUlBPUlRfU0lSIGlzIG5vdCBzZXQKLQotIwotIyBPbGQgU2VyaWFsIGRvbmdsZSBzdXBwb3J0Ci0jCi0KLSMKICMgRklSIGRldmljZSBkcml2ZXJzCiAjCiAjIENPTkZJR19VU0JfSVJEQSBpcyBub3Qgc2V0CkBAIC01MjQsMTEgKzUzNCwxMCBAQAogIyBDT05GSUdfTUNTX0ZJUiBpcyBub3Qgc2V0CiAjIENPTkZJR19CVCBpcyBub3Qgc2V0CiAjIENPTkZJR19BRl9SWFJQQyBpcyBub3Qgc2V0Ci0KLSMKLSMgV2lyZWxlc3MKLSMKKyMgQ09ORklHX1BIT05FVCBpcyBub3Qgc2V0CitDT05GSUdfV0lSRUxFU1M9eQogIyBDT05GSUdfQ0ZHODAyMTEgaXMgbm90IHNldAorQ09ORklHX1dJUkVMRVNTX09MRF9SRUdVTEFUT1JZPXkKICMgQ09ORklHX1dJUkVMRVNTX0VYVCBpcyBub3Qgc2V0CiAjIENPTkZJR19NQUM4MDIxMSBpcyBub3Qgc2V0CiAjIENPTkZJR19JRUVFODAyMTEgaXMgbm90IHNldApAQCAtNTQ2LDYgKzU1NSw4IEBACiBDT05GSUdfU1RBTkRBTE9ORT15CiBDT05GSUdfUFJFVkVOVF9GSVJNV0FSRV9CVUlMRD15CiAjIENPTkZJR19GV19MT0FERVIgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfRFJJVkVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0RFVlJFUyBpcyBub3Qgc2V0CiAjIENPTkZJR19TWVNfSFlQRVJWSVNPUiBpcyBub3Qgc2V0CiAjIENPTkZJR19DT05ORUNUT1IgaXMgbm90IHNldAogQ09ORklHX01URD15CkBAIC01NTQsNiArNTY1LDcgQEAKIENPTkZJR19NVERfUEFSVElUSU9OUz15CiAjIENPTkZJR19NVERfUkVEQk9PVF9QQVJUUyBpcyBub3Qgc2V0CiBDT05GSUdfTVREX0NNRExJTkVfUEFSVFM9eQorIyBDT05GSUdfTVREX0FSN19QQVJUUyBpcyBub3Qgc2V0CiAKICMKICMgVXNlciBNb2R1bGVzIEFuZCBUcmFuc2xhdGlvbiBMYXllcnMKQEAgLTYwMSw2ICs2MTMsNyBAQAogQ09ORklHX01URF9QSFlTTUFQX1NUQVJUPTB4MjAwMDAwMDAKIENPTkZJR19NVERfUEhZU01BUF9MRU49MAogQ09ORklHX01URF9QSFlTTUFQX0JBTktXSURUSD0yCisjIENPTkZJR19NVERfR1BJT19BRERSIGlzIG5vdCBzZXQKICMgQ09ORklHX01URF9VQ0xJTlVYIGlzIG5vdCBzZXQKICMgQ09ORklHX01URF9QTEFUUkFNIGlzIG5vdCBzZXQKIApAQCAtNjA4LDcgKzYyMSw4IEBACiAjIFNlbGYtY29udGFpbmVkIE1URCBkZXZpY2UgZHJpdmVycwogIwogIyBDT05GSUdfTVREX0RBVEFGTEFTSCBpcyBub3Qgc2V0Ci0jIENPTkZJR19NVERfTTI1UDgwIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfTTI1UDgwPXkKK0NPTkZJR19NMjVQWFhfVVNFX0ZBU1RfUkVBRD15CiAjIENPTkZJR19NVERfU0xSQU0gaXMgbm90IHNldAogIyBDT05GSUdfTVREX1BIUkFNIGlzIG5vdCBzZXQKICMgQ09ORklHX01URF9NVERSQU0gaXMgbm90IHNldApAQCAtNjQ4LDExICs2NjIsMTQgQEAKIENPTkZJR19CTEtfREVWX1JBTT15CiBDT05GSUdfQkxLX0RFVl9SQU1fQ09VTlQ9MTYKIENPTkZJR19CTEtfREVWX1JBTV9TSVpFPTQwOTYKLUNPTkZJR19CTEtfREVWX1JBTV9CTE9DS1NJWkU9MTAyNAorIyBDT05GSUdfQkxLX0RFVl9YSVAgaXMgbm90IHNldAogIyBDT05GSUdfQ0RST01fUEtUQ0RWRCBpcyBub3Qgc2V0CiAjIENPTkZJR19BVEFfT1ZFUl9FVEggaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9IRCBpcyBub3Qgc2V0CiBDT05GSUdfTUlTQ19ERVZJQ0VTPXkKICMgQ09ORklHX0VFUFJPTV85M0NYNiBpcyBub3Qgc2V0CisjIENPTkZJR19FTkNMT1NVUkVfU0VSVklDRVMgaXMgbm90IHNldAorQ09ORklHX0hBVkVfSURFPXkKICMgQ09ORklHX0lERSBpcyBub3Qgc2V0CiAKICMKQEAgLTY5NiwxMyArNzEzLDE2IEBACiBDT05GSUdfU0NTSV9MT1dMRVZFTD15CiAjIENPTkZJR19JU0NTSV9UQ1AgaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0RIIGlzIG5vdCBzZXQKIENPTkZJR19BVEE9eQogIyBDT05GSUdfQVRBX05PTlNUQU5EQVJEIGlzIG5vdCBzZXQKK0NPTkZJR19TQVRBX1BNUD15CitDT05GSUdfQVRBX1NGRj15CisjIENPTkZJR19TQVRBX01WIGlzIG5vdCBzZXQKICMgQ09ORklHX1BBVEFfUExBVEZPUk0gaXMgbm90IHNldAogQ09ORklHX1BBVEFfQkY1NFg9eQogIyBDT05GSUdfTUQgaXMgbm90IHNldAogQ09ORklHX05FVERFVklDRVM9eQotIyBDT05GSUdfTkVUREVWSUNFU19NVUxUSVFVRVVFIGlzIG5vdCBzZXQKICMgQ09ORklHX0RVTU1ZIGlzIG5vdCBzZXQKICMgQ09ORklHX0JPTkRJTkcgaXMgbm90IHNldAogIyBDT05GSUdfTUFDVkxBTiBpcyBub3Qgc2V0CkBAIC03MTUsMTEgKzczNSwxNCBAQAogIyBDT05GSUdfU01DOTFYIGlzIG5vdCBzZXQKIENPTkZJR19TTVNDOTExWD15CiAjIENPTkZJR19ETTkwMDAgaXMgbm90IHNldAorIyBDT05GSUdfRU5DMjhKNjAgaXMgbm90IHNldAogIyBDT05GSUdfSUJNX05FV19FTUFDX1pNSUkgaXMgbm90IHNldAogIyBDT05GSUdfSUJNX05FV19FTUFDX1JHTUlJIGlzIG5vdCBzZXQKICMgQ09ORklHX0lCTV9ORVdfRU1BQ19UQUggaXMgbm90IHNldAogIyBDT05GSUdfSUJNX05FV19FTUFDX0VNQUM0IGlzIG5vdCBzZXQKLSMgQ09ORklHX0I0NCBpcyBub3Qgc2V0CisjIENPTkZJR19JQk1fTkVXX0VNQUNfTk9fRkxPV19DVFJMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lCTV9ORVdfRU1BQ19NQUxfQ0xSX0lDSU5UU1RBVCBpcyBub3Qgc2V0CisjIENPTkZJR19JQk1fTkVXX0VNQUNfTUFMX0NPTU1PTl9FUlIgaXMgbm90IHNldAogQ09ORklHX05FVERFVl8xMDAwPXkKICMgQ09ORklHX0FYODgxODAgaXMgbm90IHNldAogQ09ORklHX05FVERFVl8xMDAwMD15CkBAIC03MjksNiArNzUyLDcgQEAKICMKICMgQ09ORklHX1dMQU5fUFJFODAyMTEgaXMgbm90IHNldAogIyBDT05GSUdfV0xBTl84MDIxMSBpcyBub3Qgc2V0CisjIENPTkZJR19JV0xXSUZJX0xFRFMgaXMgbm90IHNldAogCiAjCiAjIFVTQiBOZXR3b3JrIEFkYXB0ZXJzCkBAIC03NDEsNyArNzY1LDYgQEAKICMgQ09ORklHX1dBTiBpcyBub3Qgc2V0CiAjIENPTkZJR19QUFAgaXMgbm90IHNldAogIyBDT05GSUdfU0xJUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSEFQRVIgaXMgbm90IHNldAogIyBDT05GSUdfTkVUQ09OU09MRSBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRQT0xMIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIgaXMgbm90IHNldApAQCAtNzUyLDcgKzc3NSw3IEBACiAjIElucHV0IGRldmljZSBzdXBwb3J0CiAjCiBDT05GSUdfSU5QVVQ9eQotIyBDT05GSUdfSU5QVVRfRkZfTUVNTEVTUyBpcyBub3Qgc2V0CitDT05GSUdfSU5QVVRfRkZfTUVNTEVTUz1tCiAjIENPTkZJR19JTlBVVF9QT0xMREVWIGlzIG5vdCBzZXQKIAogIwpAQCAtNzc2LDMwICs3OTksMzcgQEAKICMgQ09ORklHX0tFWUJPQVJEX0dQSU8gaXMgbm90IHNldAogQ09ORklHX0tFWUJPQVJEX0JGSU49eQogIyBDT05GSUdfS0VZQk9BUkRfT1BFTkNPUkVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFWUJPQVJEX0FEUDU1ODggaXMgbm90IHNldAogIyBDT05GSUdfSU5QVVRfTU9VU0UgaXMgbm90IHNldAogIyBDT05GSUdfSU5QVVRfSk9ZU1RJQ0sgaXMgbm90IHNldAogIyBDT05GSUdfSU5QVVRfVEFCTEVUIGlzIG5vdCBzZXQKIENPTkZJR19JTlBVVF9UT1VDSFNDUkVFTj15CiAjIENPTkZJR19UT1VDSFNDUkVFTl9BRFM3ODQ2IGlzIG5vdCBzZXQKIENPTkZJR19UT1VDSFNDUkVFTl9BRDc4Nzc9bQorIyBDT05GSUdfVE9VQ0hTQ1JFRU5fQUQ3ODc5X0kyQyBpcyBub3Qgc2V0CisjIENPTkZJR19UT1VDSFNDUkVFTl9BRDc4NzlfU1BJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RPVUNIU0NSRUVOX0FENzg3OSBpcyBub3Qgc2V0CiAjIENPTkZJR19UT1VDSFNDUkVFTl9GVUpJVFNVIGlzIG5vdCBzZXQKICMgQ09ORklHX1RPVUNIU0NSRUVOX0dVTlpFIGlzIG5vdCBzZXQKICMgQ09ORklHX1RPVUNIU0NSRUVOX0VMTyBpcyBub3Qgc2V0CiAjIENPTkZJR19UT1VDSFNDUkVFTl9NVE9VQ0ggaXMgbm90IHNldAorIyBDT05GSUdfVE9VQ0hTQ1JFRU5fSU5FWElPIGlzIG5vdCBzZXQKICMgQ09ORklHX1RPVUNIU0NSRUVOX01LNzEyIGlzIG5vdCBzZXQKICMgQ09ORklHX1RPVUNIU0NSRUVOX1BFTk1PVU5UIGlzIG5vdCBzZXQKICMgQ09ORklHX1RPVUNIU0NSRUVOX1RPVUNIUklHSFQgaXMgbm90IHNldAogIyBDT05GSUdfVE9VQ0hTQ1JFRU5fVE9VQ0hXSU4gaXMgbm90IHNldAotIyBDT05GSUdfVE9VQ0hTQ1JFRU5fVUNCMTQwMCBpcyBub3Qgc2V0CisjIENPTkZJR19UT1VDSFNDUkVFTl9XTTk3WFggaXMgbm90IHNldAogIyBDT05GSUdfVE9VQ0hTQ1JFRU5fVVNCX0NPTVBPU0lURSBpcyBub3Qgc2V0CisjIENPTkZJR19UT1VDSFNDUkVFTl9UT1VDSElUMjEzIGlzIG5vdCBzZXQKIENPTkZJR19JTlBVVF9NSVNDPXkKICMgQ09ORklHX0lOUFVUX0FUSV9SRU1PVEUgaXMgbm90IHNldAogIyBDT05GSUdfSU5QVVRfQVRJX1JFTU9URTIgaXMgbm90IHNldAogIyBDT05GSUdfSU5QVVRfS0VZU1BBTl9SRU1PVEUgaXMgbm90IHNldAogIyBDT05GSUdfSU5QVVRfUE9XRVJNQVRFIGlzIG5vdCBzZXQKICMgQ09ORklHX0lOUFVUX1lFQUxJTksgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfQ00xMDkgaXMgbm90IHNldAogIyBDT05GSUdfSU5QVVRfVUlOUFVUIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RXSV9LRVlQQUQgaXMgbm90IHNldAorIyBDT05GSUdfQ09ORklHX0lOUFVUX1BDRjg1NzQgaXMgbm90IHNldAogCiAjCiAjIEhhcmR3YXJlIEkvTyBwb3J0cwpAQCAtODE1LDE2ICs4NDUsMTggQEAKICMgQ09ORklHX0JGNXh4X1BQSUZDRCBpcyBub3Qgc2V0CiAjIENPTkZJR19CRklOX1NJTVBMRV9USU1FUiBpcyBub3Qgc2V0CiAjIENPTkZJR19CRjV4eF9QUEkgaXMgbm90IHNldAotQ09ORklHX0JGSU5fT1RQPXkKLSMgQ09ORklHX0JGSU5fT1RQX1dSSVRFX0VOQUJMRSBpcyBub3Qgc2V0CiAjIENPTkZJR19CRklOX1NQT1JUIGlzIG5vdCBzZXQKICMgQ09ORklHX0JGSU5fVElNRVJfTEFURU5DWSBpcyBub3Qgc2V0CiAjIENPTkZJR19UV0lfTENEIGlzIG5vdCBzZXQKK0NPTkZJR19CRklOX0RNQV9JTlRFUkZBQ0U9bQogQ09ORklHX1NJTVBMRV9HUElPPW0KIENPTkZJR19WVD15CitDT05GSUdfQ09OU09MRV9UUkFOU0xBVElPTlM9eQogQ09ORklHX1ZUX0NPTlNPTEU9eQogQ09ORklHX0hXX0NPTlNPTEU9eQogIyBDT05GSUdfVlRfSFdfQ09OU09MRV9CSU5ESU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFVktNRU0gaXMgbm90IHNldAorIyBDT05GSUdfQkZJTl9KVEFHX0NPTU0gaXMgbm90IHNldAogIyBDT05GSUdfU0VSSUFMX05PTlNUQU5EQVJEIGlzIG5vdCBzZXQKIAogIwpAQCAtODQ5LDYgKzg4MSw4IEBACiAjIENPTkZJR19TRVJJQUxfQkZJTl9TUE9SVCBpcyBub3Qgc2V0CiBDT05GSUdfVU5JWDk4X1BUWVM9eQogIyBDT05GSUdfTEVHQUNZX1BUWVMgaXMgbm90IHNldAorQ09ORklHX0JGSU5fT1RQPXkKKyMgQ09ORklHX0JGSU5fT1RQX1dSSVRFX0VOQUJMRSBpcyBub3Qgc2V0CiAKICMKICMgQ0FOLCB0aGUgY2FyIGJ1cyBhbmQgaW5kdXN0cmlhbCBmaWVsZGJ1cwpAQCAtODU2LDQ0ICs4OTAsNDkgQEAKICMgQ09ORklHX0NBTjRMSU5VWCBpcyBub3Qgc2V0CiAjIENPTkZJR19JUE1JX0hBTkRMRVIgaXMgbm90IHNldAogIyBDT05GSUdfSFdfUkFORE9NIGlzIG5vdCBzZXQKLSMgQ09ORklHX0dFTl9SVEMgaXMgbm90IHNldAogIyBDT05GSUdfUjM5NjQgaXMgbm90IHNldAogIyBDT05GSUdfUkFXX0RSSVZFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19UQ0dfVFBNIGlzIG5vdCBzZXQKIENPTkZJR19JMkM9eQogQ09ORklHX0kyQ19CT0FSRElORk89eQogQ09ORklHX0kyQ19DSEFSREVWPXkKLQotIwotIyBJMkMgQWxnb3JpdGhtcwotIwotIyBDT05GSUdfSTJDX0FMR09CSVQgaXMgbm90IHNldAotIyBDT05GSUdfSTJDX0FMR09QQ0YgaXMgbm90IHNldAotIyBDT05GSUdfSTJDX0FMR09QQ0EgaXMgbm90IHNldAorQ09ORklHX0kyQ19IRUxQRVJfQVVUTz15CiAKICMKICMgSTJDIEhhcmR3YXJlIEJ1cyBzdXBwb3J0CiAjCisKKyMKKyMgSTJDIHN5c3RlbSBidXMgZHJpdmVycyAobW9zdGx5IGVtYmVkZGVkIC8gc3lzdGVtLW9uLWNoaXApCisjCiBDT05GSUdfSTJDX0JMQUNLRklOX1RXST15Ci1DT05GSUdfSTJDX0JMQUNLRklOX1RXSV9DTEtfS0haPTUwCitDT05GSUdfSTJDX0JMQUNLRklOX1RXSV9DTEtfS0haPTEwMAogIyBDT05GSUdfSTJDX0dQSU8gaXMgbm90IHNldAogIyBDT05GSUdfSTJDX09DT1JFUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19JMkNfUEFSUE9SVF9MSUdIVCBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfU0lNVEVDIGlzIG5vdCBzZXQKKworIworIyBFeHRlcm5hbCBJMkMvU01CdXMgYWRhcHRlciBkcml2ZXJzCisjCisjIENPTkZJR19JMkNfUEFSUE9SVF9MSUdIVCBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfVEFPU19FVk0gaXMgbm90IHNldAotIyBDT05GSUdfSTJDX1NUVUIgaXMgbm90IHNldAogIyBDT05GSUdfSTJDX1RJTllfVVNCIGlzIG5vdCBzZXQKIAogIworIyBPdGhlciBJMkMvU01CdXMgYnVzIGRyaXZlcnMKKyMKKyMgQ09ORklHX0kyQ19QQ0FfUExBVEZPUk0gaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1NUVUIgaXMgbm90IHNldAorCisjCiAjIE1pc2NlbGxhbmVvdXMgSTJDIENoaXAgc3VwcG9ydAogIwotIyBDT05GSUdfU0VOU09SU19EUzEzMzcgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19EUzEzNzQgaXMgbm90IHNldAogIyBDT05GSUdfRFMxNjgyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUMjQgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19BRDUyNTIgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19FRVBST00gaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19QQ0Y4NTc0IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfUENGODU3NSBpcyBub3Qgc2V0CisjIENPTkZJR19QQ0Y4NTc1IGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfUENBOTUzOSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1BDRjg1OTEgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19NQVg2ODc1IGlzIG5vdCBzZXQKQEAgLTkwMiwxNyArOTQxLDE1IEBACiAjIENPTkZJR19JMkNfREVCVUdfQUxHTyBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfREVCVUdfQlVTIGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19ERUJVR19DSElQIGlzIG5vdCBzZXQKLQotIwotIyBTUEkgc3VwcG9ydAotIwogQ09ORklHX1NQST15CisjIENPTkZJR19TUElfREVCVUcgaXMgbm90IHNldAogQ09ORklHX1NQSV9NQVNURVI9eQogCiAjCiAjIFNQSSBNYXN0ZXIgQ29udHJvbGxlciBEcml2ZXJzCiAjCiBDT05GSUdfU1BJX0JGSU49eQorIyBDT05GSUdfU1BJX0JGSU5fTE9DSyBpcyBub3Qgc2V0CiAjIENPTkZJR19TUElfQklUQkFORyBpcyBub3Qgc2V0CiAKICMKQEAgLTkyMSwxMSArOTU4LDE1IEBACiAjIENPTkZJR19TUElfQVQyNSBpcyBub3Qgc2V0CiAjIENPTkZJR19TUElfU1BJREVWIGlzIG5vdCBzZXQKICMgQ09ORklHX1NQSV9UTEU2MlgwIGlzIG5vdCBzZXQKK0NPTkZJR19BUkNIX1dBTlRfT1BUSU9OQUxfR1BJT0xJQj15CisjIENPTkZJR19HUElPTElCIGlzIG5vdCBzZXQKICMgQ09ORklHX1cxIGlzIG5vdCBzZXQKICMgQ09ORklHX1BPV0VSX1NVUFBMWSBpcyBub3Qgc2V0CiBDT05GSUdfSFdNT049eQogIyBDT05GSUdfSFdNT05fVklEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQUQ3NDE0IGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfQUQ3NDE4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQURDWFggaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19BRE0xMDIxIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfQURNMTAyNSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0FETTEwMjYgaXMgbm90IHNldApAQCAtOTMzLDYgKzk3NCw3IEBACiAjIENPTkZJR19TRU5TT1JTX0FETTEwMzEgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19BRE05MjQwIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfQURUNzQ3MCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FEVDc0NzMgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19BVFhQMSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0RTMTYyMSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0Y3MTgwNUYgaXMgbm90IHNldApAQCAtOTUzLDYgKzk5NSw3IEBACiAjIENPTkZJR19TRU5TT1JTX0xNOTAgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19MTTkyIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfTE05MyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX01BWDExMTEgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19NQVgxNjE5IGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfTUFYNjY1MCBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1BDODczNjAgaXMgbm90IHNldApAQCAtOTYxLDYgKzEwMDQsNyBAQAogIyBDT05GSUdfU0VOU09SU19TTVNDNDdNMSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1NNU0M0N00xOTIgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19TTVNDNDdCMzk3IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQURTNzgyOCBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1RITUM1MCBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1ZUMTIxMSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1c4Mzc4MUQgaXMgbm90IHNldApAQCAtOTY4LDkgKzEwMTIsMTIgQEAKICMgQ09ORklHX1NFTlNPUlNfVzgzNzkyRCBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1c4Mzc5MyBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1c4M0w3ODVUUyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1c4M0w3ODZORyBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1c4MzYyN0hGIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfVzgzNjI3RUhGIGlzIG5vdCBzZXQKICMgQ09ORklHX0hXTU9OX0RFQlVHX0NISVAgaXMgbm90IHNldAorIyBDT05GSUdfVEhFUk1BTCBpcyBub3Qgc2V0CisjIENPTkZJR19USEVSTUFMX0hXTU9OIGlzIG5vdCBzZXQKIENPTkZJR19XQVRDSERPRz15CiAjIENPTkZJR19XQVRDSERPR19OT1dBWU9VVCBpcyBub3Qgc2V0CiAKQEAgLTk4NiwyMyArMTAzMywzMCBAQAogIyBDT05GSUdfVVNCUENXQVRDSERPRyBpcyBub3Qgc2V0CiAKICMKLSMgU29uaWNzIFNpbGljb24gQmFja3BsYW5lCi0jCi1DT05GSUdfU1NCX1BPU1NJQkxFPXkKLSMgQ09ORklHX1NTQiBpcyBub3Qgc2V0Ci0KLSMKICMgTXVsdGlmdW5jdGlvbiBkZXZpY2UgZHJpdmVycwogIworIyBDT05GSUdfTUZEX0NPUkUgaXMgbm90IHNldAogIyBDT05GSUdfTUZEX1NNNTAxIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hUQ19QQVNJQzMgaXMgbm90IHNldAorIyBDT05GSUdfTUZEX1RNSU8gaXMgbm90IHNldAorIyBDT05GSUdfTUZEX1dNODQwMCBpcyBub3Qgc2V0CisjIENPTkZJR19NRkRfV004MzUwX0kyQyBpcyBub3Qgc2V0CiAKICMKICMgTXVsdGltZWRpYSBkZXZpY2VzCiAjCisKKyMKKyMgTXVsdGltZWRpYSBjb3JlIHN1cHBvcnQKKyMKICMgQ09ORklHX1ZJREVPX0RFViBpcyBub3Qgc2V0CiAjIENPTkZJR19EVkJfQ09SRSBpcyBub3Qgc2V0CisjIENPTkZJR19WSURFT19NRURJQSBpcyBub3Qgc2V0CisKKyMKKyMgTXVsdGltZWRpYSBkcml2ZXJzCisjCiAjIENPTkZJR19EQUIgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX0RBQlVTQiBpcyBub3Qgc2V0CiAKICMKICMgR3JhcGhpY3Mgc3VwcG9ydApAQCAtMTAxMiw2ICsxMDY2LDcgQEAKIENPTkZJR19GQj15CiBDT05GSUdfRklSTVdBUkVfRURJRD15CiAjIENPTkZJR19GQl9EREMgaXMgbm90IHNldAorIyBDT05GSUdfRkJfQk9PVF9WRVNBX1NVUFBPUlQgaXMgbm90IHNldAogQ09ORklHX0ZCX0NGQl9GSUxMUkVDVD15CiBDT05GSUdfRkJfQ0ZCX0NPUFlBUkVBPXkKIENPTkZJR19GQl9DRkJfSU1BR0VCTElUPXkKQEAgLTEwMTksOCArMTA3NCw4IEBACiAjIENPTkZJR19GQl9TWVNfRklMTFJFQ1QgaXMgbm90IHNldAogIyBDT05GSUdfRkJfU1lTX0NPUFlBUkVBIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZCX1NZU19JTUFHRUJMSVQgaXMgbm90IHNldAorIyBDT05GSUdfRkJfRk9SRUlHTl9FTkRJQU4gaXMgbm90IHNldAogIyBDT05GSUdfRkJfU1lTX0ZPUFMgaXMgbm90IHNldAotQ09ORklHX0ZCX0RFRkVSUkVEX0lPPXkKICMgQ09ORklHX0ZCX1NWR0FMSUIgaXMgbm90IHNldAogIyBDT05GSUdfRkJfTUFDTU9ERVMgaXMgbm90IHNldAogIyBDT05GSUdfRkJfQkFDS0xJR0hUIGlzIG5vdCBzZXQKQEAgLTEwMzIsOSArMTA4NywxMSBAQAogIwogQ09ORklHX0ZCX0JGNTRYX0xRMDQzPXkKICMgQ09ORklHX0ZCX0JGSU5fVDM1ME1DUUIgaXMgbm90IHNldAorIyBDT05GSUdfRkJfQkZJTl9MUTAzNVExIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZCX0JGSU5fNzM5MyBpcyBub3Qgc2V0CiAjIENPTkZJR19GQl9TMUQxM1hYWCBpcyBub3Qgc2V0CiAjIENPTkZJR19GQl9WSVJUVUFMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX01FVFJPTk9NRSBpcyBub3Qgc2V0CiAjIENPTkZJR19CQUNLTElHSFRfTENEX1NVUFBPUlQgaXMgbm90IHNldAogCiAjCkBAIC0xMDY2LDE1ICsxMTIzLDggQEAKICMgQ09ORklHX0xPR09fTElOVVhfQ0xVVDIyNCBpcyBub3Qgc2V0CiAjIENPTkZJR19MT0dPX0JMQUNLRklOX1ZHQTE2IGlzIG5vdCBzZXQKIENPTkZJR19MT0dPX0JMQUNLRklOX0NMVVQyMjQ9eQotCi0jCi0jIFNvdW5kCi0jCiBDT05GSUdfU09VTkQ9eQotCi0jCi0jIEFkdmFuY2VkIExpbnV4IFNvdW5kIEFyY2hpdGVjdHVyZQotIworQ09ORklHX1NPVU5EX09TU19DT1JFPXkKIENPTkZJR19TTkQ9eQogQ09ORklHX1NORF9USU1FUj15CiBDT05GSUdfU05EX1BDTT15CkBAIC0xMDg4LDU2ICsxMTM4LDM1IEBACiBDT05GSUdfU05EX1ZFUkJPU0VfUFJPQ0ZTPXkKICMgQ09ORklHX1NORF9WRVJCT1NFX1BSSU5USyBpcyBub3Qgc2V0CiAjIENPTkZJR19TTkRfREVCVUcgaXMgbm90IHNldAotCi0jCi0jIEdlbmVyaWMgZGV2aWNlcwotIworQ09ORklHX1NORF9EUklWRVJTPXkKICMgQ09ORklHX1NORF9EVU1NWSBpcyBub3Qgc2V0CiAjIENPTkZJR19TTkRfTVRQQVYgaXMgbm90IHNldAogIyBDT05GSUdfU05EX1NFUklBTF9VMTY1NTAgaXMgbm90IHNldAogIyBDT05GSUdfU05EX01QVTQwMSBpcyBub3Qgc2V0Ci0KLSMKLSMgU1BJIGRldmljZXMKLSMKK0NPTkZJR19TTkRfU1BJPXkKIAogIwogIyBBTFNBIEJsYWNrZmluIGRldmljZXMKICMKICMgQ09ORklHX1NORF9CTEFDS0ZJTl9BRDE4MzYgaXMgbm90IHNldAotIyBDT05GSUdfU05EX0JGSU5fQUQ3MzMxMSBpcyBub3Qgc2V0CiAjIENPTkZJR19TTkRfQkZJTl9BRDczMzIyIGlzIG5vdCBzZXQKLQotIwotIyBVU0IgZGV2aWNlcwotIworQ09ORklHX1NORF9VU0I9eQogIyBDT05GSUdfU05EX1VTQl9BVURJTyBpcyBub3Qgc2V0CiAjIENPTkZJR19TTkRfVVNCX0NBSUFRIGlzIG5vdCBzZXQKLQotIwotIyBTeXN0ZW0gb24gQ2hpcCBhdWRpbyBzdXBwb3J0Ci0jCi1DT05GSUdfU05EX1NPQ19BQzk3X0JVUz15CiBDT05GSUdfU05EX1NPQz15Ci1DT05GSUdfU05EX0JGNVhYX1NPQz15Ci1DT05GSUdfU05EX01NQVBfU1VQUE9SVD15CitDT05GSUdfU05EX1NPQ19BQzk3X0JVUz15CisjIENPTkZJR19TTkRfQkY1WFhfSTJTIGlzIG5vdCBzZXQKK0NPTkZJR19TTkRfQkY1WFhfQUM5Nz15CitDT05GSUdfU05EX0JGNVhYX01NQVBfU1VQUE9SVD15CisjIENPTkZJR19TTkRfQkY1WFhfTVVMVElDSEFOX1NVUFBPUlQgaXMgbm90IHNldAorQ09ORklHX1NORF9CRjVYWF9TT0NfU1BPUlQ9eQogQ09ORklHX1NORF9CRjVYWF9TT0NfQUM5Nz15Ci1DT05GSUdfU05EX0JGNVhYX1NPQ19CRjU0OF9FWktJVD15Ci0jIENPTkZJR19TTkRfQkY1WFhfU09DX1dNODc1MCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfQkY1WFhfU09DX1dNODczMSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfQkY1WFhfU09DX1NTTTI2MDIgaXMgbm90IHNldAorQ09ORklHX1NORF9CRjVYWF9TT0NfQUQxOTgwPXkKIENPTkZJR19TTkRfQkY1WFhfU1BPUlRfTlVNPTAKIENPTkZJR19TTkRfQkY1WFhfSEFWRV9DT0xEX1JFU0VUPXkKIENPTkZJR19TTkRfQkY1WFhfUkVTRVRfR1BJT19OVU09MTkKLQotIwotIyBTb0MgQXVkaW8gc3VwcG9ydCBmb3IgU3VwZXJICi0jCisjIENPTkZJR19TTkRfU09DX0FMTF9DT0RFQ1MgaXMgbm90IHNldAogQ09ORklHX1NORF9TT0NfQUQxOTgwPXkKLQotIwotIyBPcGVuIFNvdW5kIFN5c3RlbQotIwogIyBDT05GSUdfU09VTkRfUFJJTUUgaXMgbm90IHNldAogQ09ORklHX0FDOTdfQlVTPXkKIENPTkZJR19ISURfU1VQUE9SVD15CkBAIC0xMTQ5LDE1ICsxMTc4LDQzIEBACiAjIFVTQiBJbnB1dCBEZXZpY2VzCiAjCiBDT05GSUdfVVNCX0hJRD15Ci0jIENPTkZJR19VU0JfSElESU5QVVRfUE9XRVJCT09LIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hJRF9GRiBpcyBub3Qgc2V0CisjIENPTkZJR19ISURfUElEIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9ISURERVYgaXMgbm90IHNldAorCisjCisjIFNwZWNpYWwgSElEIGRyaXZlcnMKKyMKK0NPTkZJR19ISURfQ09NUEFUPXkKK0NPTkZJR19ISURfQTRURUNIPXkKK0NPTkZJR19ISURfQVBQTEU9eQorQ09ORklHX0hJRF9CRUxLSU49eQorQ09ORklHX0hJRF9CUklHSFQ9eQorQ09ORklHX0hJRF9DSEVSUlk9eQorQ09ORklHX0hJRF9DSElDT05ZPXkKK0NPTkZJR19ISURfQ1lQUkVTUz15CitDT05GSUdfSElEX0RFTEw9eQorQ09ORklHX0hJRF9FWktFWT15CitDT05GSUdfSElEX0dZUkFUSU9OPXkKK0NPTkZJR19ISURfTE9HSVRFQ0g9eQorIyBDT05GSUdfTE9HSVRFQ0hfRkYgaXMgbm90IHNldAorIyBDT05GSUdfTE9HSVJVTUJMRVBBRDJfRkYgaXMgbm90IHNldAorQ09ORklHX0hJRF9NSUNST1NPRlQ9eQorQ09ORklHX0hJRF9NT05URVJFWT15CitDT05GSUdfSElEX1BBTlRIRVJMT1JEPXkKKyMgQ09ORklHX1BBTlRIRVJMT1JEX0ZGIGlzIG5vdCBzZXQKK0NPTkZJR19ISURfUEVUQUxZTlg9eQorQ09ORklHX0hJRF9TQU1TVU5HPXkKK0NPTkZJR19ISURfU09OWT15CitDT05GSUdfSElEX1NVTlBMVVM9eQorQ09ORklHX1RIUlVTVE1BU1RFUl9GRj1tCitDT05GSUdfWkVST1BMVVNfRkY9bQogQ09ORklHX1VTQl9TVVBQT1JUPXkKIENPTkZJR19VU0JfQVJDSF9IQVNfSENEPXkKICMgQ09ORklHX1VTQl9BUkNIX0hBU19PSENJIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9BUkNIX0hBU19FSENJIGlzIG5vdCBzZXQKIENPTkZJR19VU0I9eQogIyBDT05GSUdfVVNCX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9BTk5PVU5DRV9ORVdfREVWSUNFUyBpcyBub3Qgc2V0CiAKICMKICMgTWlzY2VsbGFuZW91cyBVU0Igb3B0aW9ucwpAQCAtMTE2OCwxNSArMTIyNSwyMCBAQAogIyBDT05GSUdfVVNCX09URyBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfT1RHX1dISVRFTElTVCBpcyBub3Qgc2V0CiBDT05GSUdfVVNCX09UR19CTEFDS0xJU1RfSFVCPXkKK0NPTkZJR19VU0JfTU9OPXkKKyMgQ09ORklHX1VTQl9XVVNCIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9XVVNCX0NCQUYgaXMgbm90IHNldAogCiAjCiAjIFVTQiBIb3N0IENvbnRyb2xsZXIgRHJpdmVycwogIworIyBDT05GSUdfVVNCX0M2N1gwMF9IQ0QgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX0lTUDExNlhfSENEIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9JU1AxMzYyX0hDRCBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfSVNQMTc2MF9IQ0QgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0lTUDEzNjJfSENEIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9TTDgxMV9IQ0QgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX1I4QTY2NTk3X0hDRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfSFdBX0hDRCBpcyBub3Qgc2V0CiBDT05GSUdfVVNCX01VU0JfSERSQz15CiBDT05GSUdfVVNCX01VU0JfU09DPXkKIApAQCAtMTE5MCwxMyArMTI1MiwxNSBAQAogIyBDT05GSUdfTVVTQl9QSU9fT05MWSBpcyBub3Qgc2V0CiBDT05GSUdfVVNCX0lOVkVOVFJBX0RNQT15CiAjIENPTkZJR19VU0JfVElfQ1BQSV9ETUEgaXMgbm90IHNldAotQ09ORklHX1VTQl9NVVNCX0xPR0xFVkVMPTAKKyMgQ09ORklHX1VTQl9NVVNCX0RFQlVHIGlzIG5vdCBzZXQKIAogIwogIyBVU0IgRGV2aWNlIENsYXNzIGRyaXZlcnMKICMKICMgQ09ORklHX1VTQl9BQ00gaXMgbm90IHNldAogIyBDT05GSUdfVVNCX1BSSU5URVIgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1dETSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfVE1DIGlzIG5vdCBzZXQKIAogIwogIyBOT1RFOiBVU0JfU1RPUkFHRSBlbmFibGVzIFNDU0ksIGFuZCAnU0NTSSBkaXNrIHN1cHBvcnQnCkBAIC0xMjE4LDYgKzEyODIsNyBAQAogIyBDT05GSUdfVVNCX1NUT1JBR0VfQUxBVURBIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9TVE9SQUdFX09ORVRPVUNIIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9TVE9SQUdFX0tBUk1BIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TVE9SQUdFX0NZUFJFU1NfQVRBQ0IgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX0xJQlVTVUFMIGlzIG5vdCBzZXQKIAogIwpAQCAtMTIyNSwxNSArMTI5MCwxMCBAQAogIwogIyBDT05GSUdfVVNCX01EQzgwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfTUlDUk9URUsgaXMgbm90IHNldAotQ09ORklHX1VTQl9NT049eQogCiAjCiAjIFVTQiBwb3J0IGRyaXZlcnMKICMKLQotIwotIyBVU0IgU2VyaWFsIENvbnZlcnRlciBzdXBwb3J0Ci0jCiAjIENPTkZJR19VU0JfU0VSSUFMIGlzIG5vdCBzZXQKIAogIwpAQCAtMTI0Miw3ICsxMzAyLDcgQEAKICMgQ09ORklHX1VTQl9FTUk2MiBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfRU1JMjYgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX0FEVVRVWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfQVVFUlNXQUxEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TRVZTRUcgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX1JJTzUwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfTEVHT1RPV0VSIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9MQ0QgaXMgbm90IHNldApAQCAtMTI1OCwzNCArMTMxOCwzMSBAQAogIyBDT05GSUdfVVNCX0xEIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9UUkFOQ0VWSUJSQVRPUiBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfSU9XQVJSSU9SIGlzIG5vdCBzZXQKLQotIwotIyBVU0IgRFNMIG1vZGVtIHN1cHBvcnQKLSMKLQotIwotIyBVU0IgR2FkZ2V0IFN1cHBvcnQKLSMKKyMgQ09ORklHX1VTQl9JU0lHSFRGVyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfVlNUIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9HQURHRVQgaXMgbm90IHNldAogQ09ORklHX01NQz1tCiAjIENPTkZJR19NTUNfREVCVUcgaXMgbm90IHNldAogIyBDT05GSUdfTU1DX1VOU0FGRV9SRVNVTUUgaXMgbm90IHNldAogCiAjCi0jIE1NQy9TRCBDYXJkIERyaXZlcnMKKyMgTU1DL1NEL1NESU8gQ2FyZCBEcml2ZXJzCiAjCiBDT05GSUdfTU1DX0JMT0NLPW0KIENPTkZJR19NTUNfQkxPQ0tfQk9VTkNFPXkKICMgQ09ORklHX1NESU9fVUFSVCBpcyBub3Qgc2V0CisjIENPTkZJR19NTUNfVEVTVCBpcyBub3Qgc2V0CiAKICMKLSMgTU1DL1NEIEhvc3QgQ29udHJvbGxlciBEcml2ZXJzCisjIE1NQy9TRC9TRElPIEhvc3QgQ29udHJvbGxlciBEcml2ZXJzCiAjCisjIENPTkZJR19NTUNfU0RIQ0kgaXMgbm90IHNldAogQ09ORklHX1NESF9CRklOPW0KICMgQ09ORklHX1NESF9CRklOX01JU1NJTkdfQ01EX1BVTExVUF9XT1JLQVJPVU5EIGlzIG5vdCBzZXQKICMgQ09ORklHX01NQ19TUEkgaXMgbm90IHNldAotIyBDT05GSUdfU1BJX01NQyBpcyBub3Qgc2V0CisjIENPTkZJR19NRU1TVElDSyBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVdfTEVEUyBpcyBub3Qgc2V0CisjIENPTkZJR19BQ0NFU1NJQklMSVRZIGlzIG5vdCBzZXQKIENPTkZJR19SVENfTElCPXkKIENPTkZJR19SVENfQ0xBU1M9eQogQ09ORklHX1JUQ19IQ1RPU1lTPXkKQEAgLTEzMTQsMzIgKzEzNzEsNDAgQEAKICMgQ09ORklHX1JUQ19EUlZfUENGODU2MyBpcyBub3Qgc2V0CiAjIENPTkZJR19SVENfRFJWX1BDRjg1ODMgaXMgbm90IHNldAogIyBDT05GSUdfUlRDX0RSVl9NNDFUODAgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9TMzUzOTBBIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfRk0zMTMwIGlzIG5vdCBzZXQKIAogIwogIyBTUEkgUlRDIGRyaXZlcnMKICMKLSMgQ09ORklHX1JUQ19EUlZfUlM1QzM0OCBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX000MVQ5NCBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX0RTMTMwNSBpcyBub3Qgc2V0CiAjIENPTkZJR19SVENfRFJWX01BWDY5MDIgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9SOTcwMSBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX1JTNUMzNDggaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9EUzMyMzQgaXMgbm90IHNldAogCiAjCiAjIFBsYXRmb3JtIFJUQyBkcml2ZXJzCiAjCisjIENPTkZJR19SVENfRFJWX0RTMTI4NiBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX0RTMTUxMSBpcyBub3Qgc2V0CiAjIENPTkZJR19SVENfRFJWX0RTMTU1MyBpcyBub3Qgc2V0Ci0jIENPTkZJR19SVENfRFJWX1NUSzE3VEE4IGlzIG5vdCBzZXQKICMgQ09ORklHX1JUQ19EUlZfRFMxNzQyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfU1RLMTdUQTggaXMgbm90IHNldAogIyBDT05GSUdfUlRDX0RSVl9NNDhUODYgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9NNDhUMzUgaXMgbm90IHNldAogIyBDT05GSUdfUlRDX0RSVl9NNDhUNTkgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9CUTQ4MDIgaXMgbm90IHNldAogIyBDT05GSUdfUlRDX0RSVl9WMzAyMCBpcyBub3Qgc2V0CiAKICMKICMgb24tQ1BVIFJUQyBkcml2ZXJzCiAjCiBDT05GSUdfUlRDX0RSVl9CRklOPXkKLQotIwotIyBVc2Vyc3BhY2UgSS9PCi0jCisjIENPTkZJR19ETUFERVZJQ0VTIGlzIG5vdCBzZXQKICMgQ09ORklHX1VJTyBpcyBub3Qgc2V0CisjIENPTkZJR19TVEFHSU5HIGlzIG5vdCBzZXQKIAogIwogIyBGaWxlIHN5c3RlbXMKQEAgLTEzNTIsMjIgKzE0MTcsMjAgQEAKIENPTkZJR19FWFQzX0ZTX1hBVFRSPXkKICMgQ09ORklHX0VYVDNfRlNfUE9TSVhfQUNMIGlzIG5vdCBzZXQKICMgQ09ORklHX0VYVDNfRlNfU0VDVVJJVFkgaXMgbm90IHNldAotIyBDT05GSUdfRVhUNERFVl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19FWFQ0X0ZTIGlzIG5vdCBzZXQKIENPTkZJR19KQkQ9eQogIyBDT05GSUdfSkJEX0RFQlVHIGlzIG5vdCBzZXQKIENPTkZJR19GU19NQkNBQ0hFPXkKICMgQ09ORklHX1JFSVNFUkZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0pGU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19GU19QT1NJWF9BQ0wgaXMgbm90IHNldAorQ09ORklHX0ZJTEVfTE9DS0lORz15CiAjIENPTkZJR19YRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfR0ZTMl9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19PQ0ZTMl9GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19NSU5JWF9GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ST01GU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19ETk9USUZZIGlzIG5vdCBzZXQKIENPTkZJR19JTk9USUZZPXkKIENPTkZJR19JTk9USUZZX1VTRVI9eQogIyBDT05GSUdfUVVPVEEgaXMgbm90IHNldAotIyBDT05GSUdfRE5PVElGWSBpcyBub3Qgc2V0CiAjIENPTkZJR19BVVRPRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfQVVUT0ZTNF9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19GVVNFX0ZTIGlzIG5vdCBzZXQKQEAgLTE0MTQsMTEgKzE0NzcsMTEgQEAKICMgQ09ORklHX0VGU19GUyBpcyBub3Qgc2V0CiBDT05GSUdfWUFGRlNfRlM9bQogQ09ORklHX1lBRkZTX1lBRkZTMT15CisjIENPTkZJR19ZQUZGU185QllURV9UQUdTIGlzIG5vdCBzZXQKICMgQ09ORklHX1lBRkZTX0RPRVNfRUNDIGlzIG5vdCBzZXQKIENPTkZJR19ZQUZGU19ZQUZGUzI9eQogQ09ORklHX1lBRkZTX0FVVE9fWUFGRlMyPXkKICMgQ09ORklHX1lBRkZTX0RJU0FCTEVfTEFaWV9MT0FEIGlzIG5vdCBzZXQKLUNPTkZJR19ZQUZGU19DSEVDS1BPSU5UX1JFU0VSVkVEX0JMT0NLUz0xMAogIyBDT05GSUdfWUFGRlNfRElTQUJMRV9XSURFX1ROT0RFUyBpcyBub3Qgc2V0CiAjIENPTkZJR19ZQUZGU19BTFdBWVNfQ0hFQ0tfQ0hVTktfRVJBU0VEIGlzIG5vdCBzZXQKIENPTkZJR19ZQUZGU19TSE9SVF9OQU1FU19JTl9SQU09eQpAQCAtMTQzNSw4ICsxNDk4LDExIEBACiAjIENPTkZJR19KRkZTMl9SVUJJTiBpcyBub3Qgc2V0CiAjIENPTkZJR19DUkFNRlMgaXMgbm90IHNldAogIyBDT05GSUdfVlhGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19NSU5JWF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19PTUZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0hQRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfUU5YNEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JPTUZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1NZU1ZfRlMgaXMgbm90IHNldAogIyBDT05GSUdfVUZTX0ZTIGlzIG5vdCBzZXQKIENPTkZJR19ORVRXT1JLX0ZJTEVTWVNURU1TPXkKQEAgLTE0NDQsMTggKzE1MTAsMTYgQEAKIENPTkZJR19ORlNfVjM9eQogIyBDT05GSUdfTkZTX1YzX0FDTCBpcyBub3Qgc2V0CiAjIENPTkZJR19ORlNfVjQgaXMgbm90IHNldAotIyBDT05GSUdfTkZTX0RJUkVDVElPIGlzIG5vdCBzZXQKIENPTkZJR19ORlNEPW0KIENPTkZJR19ORlNEX1YzPXkKICMgQ09ORklHX05GU0RfVjNfQUNMIGlzIG5vdCBzZXQKICMgQ09ORklHX05GU0RfVjQgaXMgbm90IHNldAotQ09ORklHX05GU0RfVENQPXkKIENPTkZJR19MT0NLRD1tCiBDT05GSUdfTE9DS0RfVjQ9eQogQ09ORklHX0VYUE9SVEZTPW0KIENPTkZJR19ORlNfQ09NTU9OPXkKIENPTkZJR19TVU5SUEM9bQotIyBDT05GSUdfU1VOUlBDX0JJTkQzNCBpcyBub3Qgc2V0CisjIENPTkZJR19TVU5SUENfUkVHSVNURVJfVjQgaXMgbm90IHNldAogIyBDT05GSUdfUlBDU0VDX0dTU19LUkI1IGlzIG5vdCBzZXQKICMgQ09ORklHX1JQQ1NFQ19HU1NfU1BLTTMgaXMgbm90IHNldAogQ09ORklHX1NNQl9GUz1tCkBAIC0xNTMzLDkgKzE1OTcsNiBAQAogQ09ORklHX05MU19LT0k4X1U9bQogQ09ORklHX05MU19VVEY4PW0KICMgQ09ORklHX0RMTSBpcyBub3Qgc2V0Ci1DT05GSUdfSU5TVFJVTUVOVEFUSU9OPXkKLSMgQ09ORklHX1BST0ZJTElORyBpcyBub3Qgc2V0Ci0jIENPTkZJR19NQVJLRVJTIGlzIG5vdCBzZXQKIAogIwogIyBLZXJuZWwgaGFja2luZwpAQCAtMTU0MywxNCArMTYwNCw1MyBAQAogIyBDT05GSUdfUFJJTlRLX1RJTUUgaXMgbm90IHNldAogQ09ORklHX0VOQUJMRV9XQVJOX0RFUFJFQ0FURUQ9eQogQ09ORklHX0VOQUJMRV9NVVNUX0NIRUNLPXkKK0NPTkZJR19GUkFNRV9XQVJOPTEwMjQKICMgQ09ORklHX01BR0lDX1NZU1JRIGlzIG5vdCBzZXQKICMgQ09ORklHX1VOVVNFRF9TWU1CT0xTIGlzIG5vdCBzZXQKIENPTkZJR19ERUJVR19GUz15CiAjIENPTkZJR19IRUFERVJTX0NIRUNLIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQlVHX0tFUk5FTCBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfS0VSTkVMPXkKKyMgQ09ORklHX0RFQlVHX1NISVJRIGlzIG5vdCBzZXQKK0NPTkZJR19ERVRFQ1RfU09GVExPQ0tVUD15CisjIENPTkZJR19CT09UUEFSQU1fU09GVExPQ0tVUF9QQU5JQyBpcyBub3Qgc2V0CitDT05GSUdfQk9PVFBBUkFNX1NPRlRMT0NLVVBfUEFOSUNfVkFMVUU9MAorQ09ORklHX1NDSEVEX0RFQlVHPXkKKyMgQ09ORklHX1NDSEVEU1RBVFMgaXMgbm90IHNldAorIyBDT05GSUdfVElNRVJfU1RBVFMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfT0JKRUNUUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TTEFCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1JUX01VVEVYRVMgaXMgbm90IHNldAorIyBDT05GSUdfUlRfTVVURVhfVEVTVEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NQSU5MT0NLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX01VVEVYRVMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU1BJTkxPQ0tfU0xFRVAgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfTE9DS0lOR19BUElfU0VMRlRFU1RTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0tPQkpFQ1QgaXMgbm90IHNldAogIyBDT05GSUdfREVCVUdfQlVHVkVSQk9TRSBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfSU5GTz15CisjIENPTkZJR19ERUJVR19WTSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19XUklURUNPVU5UIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX01FTU9SWV9JTklUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0xJU1QgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU0cgaXMgbm90IHNldAorIyBDT05GSUdfRlJBTUVfUE9JTlRFUiBpcyBub3Qgc2V0CisjIENPTkZJR19CT09UX1BSSU5US19ERUxBWSBpcyBub3Qgc2V0CisjIENPTkZJR19SQ1VfVE9SVFVSRV9URVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JDVV9DUFVfU1RBTExfREVURUNUT1IgaXMgbm90IHNldAorIyBDT05GSUdfQkFDS1RSQUNFX1NFTEZfVEVTVCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19CTE9DS19FWFRfREVWVCBpcyBub3Qgc2V0CisjIENPTkZJR19GQVVMVF9JTkpFQ1RJT04gaXMgbm90IHNldAorIyBDT05GSUdfU1lTQ1RMX1NZU0NBTExfQ0hFQ0sgaXMgbm90IHNldAorIyBDT05GSUdfRFlOQU1JQ19QUklOVEtfREVCVUcgaXMgbm90IHNldAogIyBDT05GSUdfU0FNUExFUyBpcyBub3Qgc2V0CitDT05GSUdfSEFWRV9BUkNIX0tHREI9eQorIyBDT05GSUdfS0dEQiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TVEFDS09WRVJGTE9XIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NUQUNLX1VTQUdFIGlzIG5vdCBzZXQKK0NPTkZJR19ERUJVR19WRVJCT1NFPXkKIENPTkZJR19ERUJVR19NTVJTPXkKKyMgQ09ORklHX0RFQlVHX0hXRVJSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0RPVUJMRUZBVUxUIGlzIG5vdCBzZXQKIENPTkZJR19ERUJVR19IVU5UX0ZPUl9aRVJPPXkKIENPTkZJR19ERUJVR19CRklOX0hXVFJBQ0VfT049eQogQ09ORklHX0RFQlVHX0JGSU5fSFdUUkFDRV9DT01QUkVTU0lPTl9PRkY9eQpAQCAtMTU2OCwxMCArMTY2OCw5NSBAQAogIwogIyBDT05GSUdfS0VZUyBpcyBub3Qgc2V0CiBDT05GSUdfU0VDVVJJVFk9eQorIyBDT05GSUdfU0VDVVJJVFlGUyBpcyBub3Qgc2V0CiAjIENPTkZJR19TRUNVUklUWV9ORVRXT1JLIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFQ1VSSVRZX0NBUEFCSUxJVElFUyBpcyBub3Qgc2V0CisjIENPTkZJR19TRUNVUklUWV9GSUxFX0NBUEFCSUxJVElFUyBpcyBub3Qgc2V0CiAjIENPTkZJR19TRUNVUklUWV9ST09UUExVRyBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE8gaXMgbm90IHNldAorQ09ORklHX1NFQ1VSSVRZX0RFRkFVTFRfTU1BUF9NSU5fQUREUj0wCitDT05GSUdfQ1JZUFRPPXkKKworIworIyBDcnlwdG8gY29yZSBvciBoZWxwZXIKKyMKKyMgQ09ORklHX0NSWVBUT19GSVBTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19NQU5BR0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19HRjEyOE1VTCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fTlVMTCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQ1JZUFREIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19BVVRIRU5DIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19URVNUIGlzIG5vdCBzZXQKKworIworIyBBdXRoZW50aWNhdGVkIEVuY3J5cHRpb24gd2l0aCBBc3NvY2lhdGVkIERhdGEKKyMKKyMgQ09ORklHX0NSWVBUT19DQ00gaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0dDTSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0VRSVYgaXMgbm90IHNldAorCisjCisjIEJsb2NrIG1vZGVzCisjCisjIENPTkZJR19DUllQVE9fQ0JDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19DVFIgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0NUUyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fRUNCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19MUlcgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1BDQkMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1hUUyBpcyBub3Qgc2V0CisKKyMKKyMgSGFzaCBtb2RlcworIworIyBDT05GSUdfQ1JZUFRPX0hNQUMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1hDQkMgaXMgbm90IHNldAorCisjCisjIERpZ2VzdAorIworIyBDT05GSUdfQ1JZUFRPX0NSQzMyQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fTUQ0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19NRDUgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX01JQ0hBRUxfTUlDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19STUQxMjggaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1JNRDE2MCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fUk1EMjU2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19STUQzMjAgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1NIQTEgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1NIQTI1NiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0hBNTEyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19UR1IxOTIgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1dQNTEyIGlzIG5vdCBzZXQKKworIworIyBDaXBoZXJzCisjCisjIENPTkZJR19DUllQVE9fQUVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19BTlVCSVMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0FSQzQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0JMT1dGSVNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19DQU1FTExJQSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQ0FTVDUgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0NBU1Q2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19ERVMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0ZDUllQVCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fS0hBWkFEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TQUxTQTIwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TRUVEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TRVJQRU5UIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19URUEgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1RXT0ZJU0ggaXMgbm90IHNldAorCisjCisjIENvbXByZXNzaW9uCisjCisjIENPTkZJR19DUllQVE9fREVGTEFURSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fTFpPIGlzIG5vdCBzZXQKKworIworIyBSYW5kb20gTnVtYmVyIEdlbmVyYXRpb24KKyMKKyMgQ09ORklHX0NSWVBUT19BTlNJX0NQUk5HIGlzIG5vdCBzZXQKK0NPTkZJR19DUllQVE9fSFc9eQogCiAjCiAjIExpYnJhcnkgcm91dGluZXMKQEAgLTE1NzksNiArMTc2NCw3IEBACiBDT05GSUdfQklUUkVWRVJTRT15CiBDT05GSUdfQ1JDX0NDSVRUPW0KICMgQ09ORklHX0NSQzE2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQ19UMTBESUYgaXMgbm90IHNldAogIyBDT05GSUdfQ1JDX0lUVV9UIGlzIG5vdCBzZXQKIENPTkZJR19DUkMzMj15CiAjIENPTkZJR19DUkM3IGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vY29uZmlncy9CRjU2MS1FWktJVF9kZWZjb25maWcgYi9hcmNoL2JsYWNrZmluL2NvbmZpZ3MvQkY1NjEtRVpLSVRfZGVmY29uZmlnCmluZGV4IDNjNzBkNjIuLjFlY2I3YTMgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vY29uZmlncy9CRjU2MS1FWktJVF9kZWZjb25maWcKKysrIGIvYXJjaC9ibGFja2Zpbi9jb25maWdzL0JGNTYxLUVaS0lUX2RlZmNvbmZpZwpAQCAtMSw2ICsxLDYgQEAKICMKICMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKLSMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4yNC43CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMjgtcmMyCiAjCiAjIENPTkZJR19NTVUgaXMgbm90IHNldAogIyBDT05GSUdfRlBVIGlzIG5vdCBzZXQKQEAgLTgsNyArOCw2IEBACiAjIENPTkZJR19SV1NFTV9YQ0hHQUREX0FMR09SSVRITSBpcyBub3Qgc2V0CiBDT05GSUdfQkxBQ0tGSU49eQogQ09ORklHX1pPTkVfRE1BPXkKLUNPTkZJR19TRU1BUEhPUkVfU0xFRVBFUlM9eQogQ09ORklHX0dFTkVSSUNfRklORF9ORVhUX0JJVD15CiBDT05GSUdfR0VORVJJQ19IV0VJR0hUPXkKIENPTkZJR19HRU5FUklDX0hBUkRJUlFTPXkKQEAgLTMxLDE4ICszMCwxNiBAQAogIyBDT05GSUdfUE9TSVhfTVFVRVVFIGlzIG5vdCBzZXQKICMgQ09ORklHX0JTRF9QUk9DRVNTX0FDQ1QgaXMgbm90IHNldAogIyBDT05GSUdfVEFTS1NUQVRTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTRVJfTlMgaXMgbm90IHNldAotIyBDT05GSUdfUElEX05TIGlzIG5vdCBzZXQKICMgQ09ORklHX0FVRElUIGlzIG5vdCBzZXQKIENPTkZJR19JS0NPTkZJRz15CiBDT05GSUdfSUtDT05GSUdfUFJPQz15CiBDT05GSUdfTE9HX0JVRl9TSElGVD0xNAogIyBDT05GSUdfQ0dST1VQUyBpcyBub3Qgc2V0Ci1DT05GSUdfRkFJUl9HUk9VUF9TQ0hFRD15Ci1DT05GSUdfRkFJUl9VU0VSX1NDSEVEPXkKLSMgQ09ORklHX0ZBSVJfQ0dST1VQX1NDSEVEIGlzIG5vdCBzZXQKLUNPTkZJR19TWVNGU19ERVBSRUNBVEVEPXkKKyMgQ09ORklHX0dST1VQX1NDSEVEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZU0ZTX0RFUFJFQ0FURUQgaXMgbm90IHNldAorIyBDT05GSUdfU1lTRlNfREVQUkVDQVRFRF9WMiBpcyBub3Qgc2V0CiAjIENPTkZJR19SRUxBWSBpcyBub3Qgc2V0CisjIENPTkZJR19OQU1FU1BBQ0VTIGlzIG5vdCBzZXQKIENPTkZJR19CTEtfREVWX0lOSVRSRD15CiBDT05GSUdfSU5JVFJBTUZTX1NPVVJDRT0iIgogIyBDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkUgaXMgbm90IHNldApAQCAtNTEsMjYgKzQ4LDM1IEBACiBDT05GSUdfVUlEMTY9eQogQ09ORklHX1NZU0NUTF9TWVNDQUxMPXkKIENPTkZJR19LQUxMU1lNUz15CisjIENPTkZJR19LQUxMU1lNU19BTEwgaXMgbm90IHNldAogIyBDT05GSUdfS0FMTFNZTVNfRVhUUkFfUEFTUyBpcyBub3Qgc2V0CiBDT05GSUdfSE9UUExVRz15CiBDT05GSUdfUFJJTlRLPXkKIENPTkZJR19CVUc9eQotQ09ORklHX0VMRl9DT1JFPXkKKyMgQ09ORklHX0VMRl9DT1JFIGlzIG5vdCBzZXQKK0NPTkZJR19DT01QQVRfQlJLPXkKIENPTkZJR19CQVNFX0ZVTEw9eQogQ09ORklHX0ZVVEVYPXkKIENPTkZJR19BTk9OX0lOT0RFUz15CiBDT05GSUdfRVBPTEw9eQogQ09ORklHX1NJR05BTEZEPXkKK0NPTkZJR19USU1FUkZEPXkKIENPTkZJR19FVkVOVEZEPXkKK0NPTkZJR19BSU89eQogQ09ORklHX1ZNX0VWRU5UX0NPVU5URVJTPXkKIENPTkZJR19TTEFCPXkKICMgQ09ORklHX1NMVUIgaXMgbm90IHNldAogIyBDT05GSUdfU0xPQiBpcyBub3Qgc2V0CisjIENPTkZJR19QUk9GSUxJTkcgaXMgbm90IHNldAorIyBDT05GSUdfTUFSS0VSUyBpcyBub3Qgc2V0CitDT05GSUdfSEFWRV9PUFJPRklMRT15CisjIENPTkZJR19IQVZFX0dFTkVSSUNfRE1BX0NPSEVSRU5UIGlzIG5vdCBzZXQKIENPTkZJR19TTEFCSU5GTz15CiBDT05GSUdfUlRfTVVURVhFUz15CiBDT05GSUdfVElOWV9TSE1FTT15CiBDT05GSUdfQkFTRV9TTUFMTD0wCiBDT05GSUdfTU9EVUxFUz15CisjIENPTkZJR19NT0RVTEVfRk9SQ0VfTE9BRCBpcyBub3Qgc2V0CiBDT05GSUdfTU9EVUxFX1VOTE9BRD15CiAjIENPTkZJR19NT0RVTEVfRk9SQ0VfVU5MT0FEIGlzIG5vdCBzZXQKICMgQ09ORklHX01PRFZFUlNJT05TIGlzIG5vdCBzZXQKQEAgLTgxLDYgKzg3LDcgQEAKICMgQ09ORklHX0JMS19ERVZfSU9fVFJBQ0UgaXMgbm90IHNldAogIyBDT05GSUdfTFNGIGlzIG5vdCBzZXQKICMgQ09ORklHX0JMS19ERVZfQlNHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSU5URUdSSVRZIGlzIG5vdCBzZXQKIAogIwogIyBJTyBTY2hlZHVsZXJzCkBAIC05NCw5ICsxMDEsMTEgQEAKICMgQ09ORklHX0RFRkFVTFRfQ0ZRIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFRkFVTFRfTk9PUCBpcyBub3Qgc2V0CiBDT05GSUdfREVGQVVMVF9JT1NDSEVEPSJhbnRpY2lwYXRvcnkiCitDT05GSUdfQ0xBU1NJQ19SQ1U9eQogIyBDT05GSUdfUFJFRU1QVF9OT05FIGlzIG5vdCBzZXQKIENPTkZJR19QUkVFTVBUX1ZPTFVOVEFSWT15CiAjIENPTkZJR19QUkVFTVBUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZSRUVaRVIgaXMgbm90IHNldAogCiAjCiAjIEJsYWNrZmluIFByb2Nlc3NvciBPcHRpb25zCkBAIC0xMDUsNiArMTE0LDEwIEBACiAjCiAjIFByb2Nlc3NvciBhbmQgQm9hcmQgU2V0dGluZ3MKICMKKyMgQ09ORklHX0JGNTEyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGNTE0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGNTE2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGNTE4IGlzIG5vdCBzZXQKICMgQ09ORklHX0JGNTIyIGlzIG5vdCBzZXQKICMgQ09ORklHX0JGNTIzIGlzIG5vdCBzZXQKICMgQ09ORklHX0JGNTI0IGlzIG5vdCBzZXQKQEAgLTExNywyNCArMTMwLDM4IEBACiAjIENPTkZJR19CRjUzNCBpcyBub3Qgc2V0CiAjIENPTkZJR19CRjUzNiBpcyBub3Qgc2V0CiAjIENPTkZJR19CRjUzNyBpcyBub3Qgc2V0CisjIENPTkZJR19CRjUzOCBpcyBub3Qgc2V0CisjIENPTkZJR19CRjUzOSBpcyBub3Qgc2V0CiAjIENPTkZJR19CRjU0MiBpcyBub3Qgc2V0CiAjIENPTkZJR19CRjU0NCBpcyBub3Qgc2V0CiAjIENPTkZJR19CRjU0NyBpcyBub3Qgc2V0CiAjIENPTkZJR19CRjU0OCBpcyBub3Qgc2V0CiAjIENPTkZJR19CRjU0OSBpcyBub3Qgc2V0CiBDT05GSUdfQkY1NjE9eQorIyBDT05GSUdfU01QIGlzIG5vdCBzZXQKK0NPTkZJR19CRl9SRVZfTUlOPTMKK0NPTkZJR19CRl9SRVZfTUFYPTUKICMgQ09ORklHX0JGX1JFVl8wXzAgaXMgbm90IHNldAogIyBDT05GSUdfQkZfUkVWXzBfMSBpcyBub3Qgc2V0CiAjIENPTkZJR19CRl9SRVZfMF8yIGlzIG5vdCBzZXQKIENPTkZJR19CRl9SRVZfMF8zPXkKICMgQ09ORklHX0JGX1JFVl8wXzQgaXMgbm90IHNldAogIyBDT05GSUdfQkZfUkVWXzBfNSBpcyBub3Qgc2V0CisjIENPTkZJR19CRl9SRVZfMF82IGlzIG5vdCBzZXQKICMgQ09ORklHX0JGX1JFVl9BTlkgaXMgbm90IHNldAogIyBDT05GSUdfQkZfUkVWX05PTkUgaXMgbm90IHNldAogQ09ORklHX01FTV9NVDQ4TEMxNk0xNkEyVEdfNzU9eQogQ09ORklHX0lSUV9QTExfV0FLRVVQPTcKIENPTkZJR19JUlFfU1BPUlQwX0VSUk9SPTcKIENPTkZJR19JUlFfU1BPUlQxX0VSUk9SPTcKK0NPTkZJR19JUlFfVElNRVIwPTEwCitDT05GSUdfSVJRX1RJTUVSMT0xMAorQ09ORklHX0lSUV9USU1FUjI9MTAKK0NPTkZJR19JUlFfVElNRVIzPTEwCitDT05GSUdfSVJRX1RJTUVSND0xMAorQ09ORklHX0lSUV9USU1FUjU9MTAKK0NPTkZJR19JUlFfVElNRVI2PTEwCitDT05GSUdfSVJRX1RJTUVSNz0xMAogQ09ORklHX0lSUV9TUElfRVJST1I9NwogQ09ORklHX0JGSU41NjFfRVpLSVQ9eQogIyBDT05GSUdfQkZJTjU2MV9URVBMQSBpcyBub3Qgc2V0CkBAIC0xNDgsMTAgKzE3NSw2IEBACiAjCiAjIENvcmUgQiBTdXBwb3J0CiAjCi0KLSMKLSMgQ29yZSBCIFN1cHBvcnQKLSMKIENPTkZJR19CRjU2MV9DT1JFQj15CiBDT05GSUdfQkY1NjFfQ09SRUJfUkVTRVQ9eQogCkBAIC0xOTMsMTQgKzIxNiw2IEBACiBDT05GSUdfSVJRX0RNQTJfOT05CiBDT05GSUdfSVJRX0RNQTJfMTA9OQogQ09ORklHX0lSUV9ETUEyXzExPTkKLUNPTkZJR19JUlFfVElNRVIwPTEwCi1DT05GSUdfSVJRX1RJTUVSMT0xMAotQ09ORklHX0lSUV9USU1FUjI9MTAKLUNPTkZJR19JUlFfVElNRVIzPTEwCi1DT05GSUdfSVJRX1RJTUVSND0xMAotQ09ORklHX0lSUV9USU1FUjU9MTAKLUNPTkZJR19JUlFfVElNRVI2PTEwCi1DT05GSUdfSVJRX1RJTUVSNz0xMAogQ09ORklHX0lSUV9USU1FUjg9MTAKIENPTkZJR19JUlFfVElNRVI5PTEwCiBDT05GSUdfSVJRX1RJTUVSMTA9MTAKQEAgLTIzMCw3ICsyNDUsNiBAQAogIwogQ09ORklHX0NMS0lOX0haPTMwMDAwMDAwCiAjIENPTkZJR19CRklOX0tFUk5FTF9DTE9DSyBpcyBub3Qgc2V0Ci1DT05GSUdfTUFYX01FTV9TSVpFPTUxMgogQ09ORklHX01BWF9WQ09fSFo9NjAwMDAwMDAwCiBDT05GSUdfTUlOX1ZDT19IWj01MDAwMDAwMAogQ09ORklHX01BWF9TQ0xLX0haPTEzMzMzMzMzMwpAQCAtMjQ0LDYgKzI1OCw3IEBACiAjIENPTkZJR19IWl8zMDAgaXMgbm90IHNldAogIyBDT05GSUdfSFpfMTAwMCBpcyBub3Qgc2V0CiBDT05GSUdfSFo9MjUwCitDT05GSUdfU0NIRURfSFJUSUNLPXkKIENPTkZJR19HRU5FUklDX1RJTUU9eQogQ09ORklHX0dFTkVSSUNfQ0xPQ0tFVkVOVFM9eQogIyBDT05GSUdfQ1lDTEVTX0NMT0NLU09VUkNFIGlzIG5vdCBzZXQKQEAgLTI4MSw2ICsyOTYsMTIgQEAKIENPTkZJR19DQUNIRUxJTkVfQUxJR05FRF9MMT15CiAjIENPTkZJR19TWVNDQUxMX1RBQl9MMSBpcyBub3Qgc2V0CiAjIENPTkZJR19DUExCX1NXSVRDSF9UQUJfTDEgaXMgbm90IHNldAorQ09ORklHX0FQUF9TVEFDS19MMT15CisKKyMKKyMgU3BlZWQgT3B0aW1pemF0aW9ucworIworQ09ORklHX0JGSU5fSU5TX0xPV09WRVJIRUFEPXkKIENPTkZJR19SQU1LRVJORUw9eQogIyBDT05GSUdfUk9NS0VSTkVMIGlzIG5vdCBzZXQKIENPTkZJR19TRUxFQ1RfTUVNT1JZX01PREVMPXkKQEAgLTI4OSwxNCArMzEwLDEzIEBACiAjIENPTkZJR19TUEFSU0VNRU1fTUFOVUFMIGlzIG5vdCBzZXQKIENPTkZJR19GTEFUTUVNPXkKIENPTkZJR19GTEFUX05PREVfTUVNX01BUD15Ci0jIENPTkZJR19TUEFSU0VNRU1fU1RBVElDIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NQQVJTRU1FTV9WTUVNTUFQX0VOQUJMRSBpcyBub3Qgc2V0CitDT05GSUdfUEFHRUZMQUdTX0VYVEVOREVEPXkKIENPTkZJR19TUExJVF9QVExPQ0tfQ1BVUz00CiAjIENPTkZJR19SRVNPVVJDRVNfNjRCSVQgaXMgbm90IHNldAorIyBDT05GSUdfUEhZU19BRERSX1RfNjRCSVQgaXMgbm90IHNldAogQ09ORklHX1pPTkVfRE1BX0ZMQUc9MQogQ09ORklHX1ZJUlRfVE9fQlVTPXkKICMgQ09ORklHX0JGSU5fR1BUSU1FUlMgaXMgbm90IHNldAotQ09ORklHX0JGSU5fRE1BXzVYWD15CiAjIENPTkZJR19ETUFfVU5DQUNIRURfNE0gaXMgbm90IHNldAogIyBDT05GSUdfRE1BX1VOQ0FDSEVEXzJNIGlzIG5vdCBzZXQKIENPTkZJR19ETUFfVU5DQUNIRURfMU09eQpAQCAtMzExLDcgKzMzMSw3IEBACiAjIENPTkZJR19CRklOX0lDQUNIRV9MT0NLIGlzIG5vdCBzZXQKICMgQ09ORklHX0JGSU5fV0IgaXMgbm90IHNldAogQ09ORklHX0JGSU5fV1Q9eQotQ09ORklHX0wxX01BWF9QSUVDRT0xNgorIyBDT05GSUdfQkZJTl9MMl9DQUNIRUFCTEUgaXMgbm90IHNldAogIyBDT05GSUdfTVBVIGlzIG5vdCBzZXQKIAogIwpAQCAtMzQ0LDcgKzM2NCw2IEBACiAjCiAjIEJ1cyBvcHRpb25zIChQQ0ksIFBDTUNJQSwgRUlTQSwgTUNBLCBJU0EpCiAjCi0jIENPTkZJR19QQ0kgaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9TVVBQT1JUU19NU0kgaXMgbm90IHNldAogIyBDT05GSUdfUENDQVJEIGlzIG5vdCBzZXQKIApAQCAtMzU1LDIzICszNzQsMjAgQEAKIENPTkZJR19CSU5GTVRfRkxBVD15CiBDT05GSUdfQklORk1UX1pGTEFUPXkKICMgQ09ORklHX0JJTkZNVF9TSEFSRURfRkxBVCBpcyBub3Qgc2V0CisjIENPTkZJR19IQVZFX0FPVVQgaXMgbm90IHNldAogIyBDT05GSUdfQklORk1UX01JU0MgaXMgbm90IHNldAogCiAjCiAjIFBvd2VyIG1hbmFnZW1lbnQgb3B0aW9ucwogIwogIyBDT05GSUdfUE0gaXMgbm90IHNldAotQ09ORklHX1NVU1BFTkRfVVBfUE9TU0lCTEU9eQorQ09ORklHX0FSQ0hfU1VTUEVORF9QT1NTSUJMRT15CiAjIENPTkZJR19QTV9XQUtFVVBfQllfR1BJTyBpcyBub3Qgc2V0CiAKICMKICMgQ1BVIEZyZXF1ZW5jeSBzY2FsaW5nCiAjCiAjIENPTkZJR19DUFVfRlJFUSBpcyBub3Qgc2V0Ci0KLSMKLSMgTmV0d29ya2luZwotIwogQ09ORklHX05FVD15CiAKICMKQEAgLTM4NCw2ICs0MDAsNyBAQAogIyBDT05GSUdfWEZSTV9VU0VSIGlzIG5vdCBzZXQKICMgQ09ORklHX1hGUk1fU1VCX1BPTElDWSBpcyBub3Qgc2V0CiAjIENPTkZJR19YRlJNX01JR1JBVEUgaXMgbm90IHNldAorIyBDT05GSUdfWEZSTV9TVEFUSVNUSUNTIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVF9LRVkgaXMgbm90IHNldAogQ09ORklHX0lORVQ9eQogIyBDT05GSUdfSVBfTVVMVElDQVNUIGlzIG5vdCBzZXQKQEAgLTQxMyw4ICs0MzAsNiBAQAogQ09ORklHX0RFRkFVTFRfVENQX0NPTkc9ImN1YmljIgogIyBDT05GSUdfVENQX01ENVNJRyBpcyBub3Qgc2V0CiAjIENPTkZJR19JUFY2IGlzIG5vdCBzZXQKLSMgQ09ORklHX0lORVQ2X1hGUk1fVFVOTkVMIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lORVQ2X1RVTk5FTCBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRMQUJFTCBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRXT1JLX1NFQ01BUksgaXMgbm90IHNldAogIyBDT05GSUdfTkVURklMVEVSIGlzIG5vdCBzZXQKQEAgLTQyMyw2ICs0MzgsNyBAQAogIyBDT05GSUdfVElQQyBpcyBub3Qgc2V0CiAjIENPTkZJR19BVE0gaXMgbm90IHNldAogIyBDT05GSUdfQlJJREdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9EU0EgaXMgbm90IHNldAogIyBDT05GSUdfVkxBTl84MDIxUSBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUNORVQgaXMgbm90IHNldAogIyBDT05GSUdfTExDMiBpcyBub3Qgc2V0CkBAIC00MzksNiArNDU1LDcgQEAKICMKICMgQ09ORklHX05FVF9QS1RHRU4gaXMgbm90IHNldAogIyBDT05GSUdfSEFNUkFESU8gaXMgbm90IHNldAorIyBDT05GSUdfQ0FOIGlzIG5vdCBzZXQKIENPTkZJR19JUkRBPW0KIAogIwpAQCAtNDcxLDI0ICs0ODgsMTQgQEAKICMgQ09ORklHX0RPTkdMRSBpcyBub3Qgc2V0CiAKICMKLSMgT2xkIFNJUiBkZXZpY2UgZHJpdmVycwotIwotIyBDT05GSUdfSVJQT1JUX1NJUiBpcyBub3Qgc2V0Ci0KLSMKLSMgT2xkIFNlcmlhbCBkb25nbGUgc3VwcG9ydAotIwotCi0jCiAjIEZJUiBkZXZpY2UgZHJpdmVycwogIwogIyBDT05GSUdfQlQgaXMgbm90IHNldAogIyBDT05GSUdfQUZfUlhSUEMgaXMgbm90IHNldAotCi0jCi0jIFdpcmVsZXNzCi0jCisjIENPTkZJR19QSE9ORVQgaXMgbm90IHNldAorQ09ORklHX1dJUkVMRVNTPXkKICMgQ09ORklHX0NGRzgwMjExIGlzIG5vdCBzZXQKK0NPTkZJR19XSVJFTEVTU19PTERfUkVHVUxBVE9SWT15CiAjIENPTkZJR19XSVJFTEVTU19FWFQgaXMgbm90IHNldAogIyBDT05GSUdfTUFDODAyMTEgaXMgbm90IHNldAogIyBDT05GSUdfSUVFRTgwMjExIGlzIG5vdCBzZXQKQEAgLTUwNiw2ICs1MTMsOCBAQAogQ09ORklHX1NUQU5EQUxPTkU9eQogQ09ORklHX1BSRVZFTlRfRklSTVdBUkVfQlVJTEQ9eQogIyBDT05GSUdfRldfTE9BREVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0RSSVZFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19ERVZSRVMgaXMgbm90IHNldAogIyBDT05GSUdfU1lTX0hZUEVSVklTT1IgaXMgbm90IHNldAogIyBDT05GSUdfQ09OTkVDVE9SIGlzIG5vdCBzZXQKIENPTkZJR19NVEQ9eQpAQCAtNTE0LDYgKzUyMyw3IEBACiBDT05GSUdfTVREX1BBUlRJVElPTlM9eQogIyBDT05GSUdfTVREX1JFREJPT1RfUEFSVFMgaXMgbm90IHNldAogQ09ORklHX01URF9DTURMSU5FX1BBUlRTPXkKKyMgQ09ORklHX01URF9BUjdfUEFSVFMgaXMgbm90IHNldAogCiAjCiAjIFVzZXIgTW9kdWxlcyBBbmQgVHJhbnNsYXRpb24gTGF5ZXJzCkBAIC01OTUsMTEgKzYwNSwxNCBAQAogQ09ORklHX0JMS19ERVZfUkFNPXkKIENPTkZJR19CTEtfREVWX1JBTV9DT1VOVD0xNgogQ09ORklHX0JMS19ERVZfUkFNX1NJWkU9NDA5NgotQ09ORklHX0JMS19ERVZfUkFNX0JMT0NLU0laRT0xMDI0CisjIENPTkZJR19CTEtfREVWX1hJUCBpcyBub3Qgc2V0CiAjIENPTkZJR19DRFJPTV9QS1RDRFZEIGlzIG5vdCBzZXQKICMgQ09ORklHX0FUQV9PVkVSX0VUSCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0hEIGlzIG5vdCBzZXQKIENPTkZJR19NSVNDX0RFVklDRVM9eQogIyBDT05GSUdfRUVQUk9NXzkzQ1g2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0VOQ0xPU1VSRV9TRVJWSUNFUyBpcyBub3Qgc2V0CitDT05GSUdfSEFWRV9JREU9eQogIyBDT05GSUdfSURFIGlzIG5vdCBzZXQKIAogIwpAQCAtNjEyLDcgKzYyNSw2IEBACiAjIENPTkZJR19BVEEgaXMgbm90IHNldAogIyBDT05GSUdfTUQgaXMgbm90IHNldAogQ09ORklHX05FVERFVklDRVM9eQotIyBDT05GSUdfTkVUREVWSUNFU19NVUxUSVFVRVVFIGlzIG5vdCBzZXQKICMgQ09ORklHX0RVTU1ZIGlzIG5vdCBzZXQKICMgQ09ORklHX0JPTkRJTkcgaXMgbm90IHNldAogIyBDT05GSUdfTUFDVkxBTiBpcyBub3Qgc2V0CkBAIC02MjUsMTEgKzYzNywxNCBAQAogQ09ORklHX1NNQzkxWD15CiAjIENPTkZJR19TTVNDOTExWCBpcyBub3Qgc2V0CiAjIENPTkZJR19ETTkwMDAgaXMgbm90IHNldAorIyBDT05GSUdfRU5DMjhKNjAgaXMgbm90IHNldAogIyBDT05GSUdfSUJNX05FV19FTUFDX1pNSUkgaXMgbm90IHNldAogIyBDT05GSUdfSUJNX05FV19FTUFDX1JHTUlJIGlzIG5vdCBzZXQKICMgQ09ORklHX0lCTV9ORVdfRU1BQ19UQUggaXMgbm90IHNldAogIyBDT05GSUdfSUJNX05FV19FTUFDX0VNQUM0IGlzIG5vdCBzZXQKLSMgQ09ORklHX0I0NCBpcyBub3Qgc2V0CisjIENPTkZJR19JQk1fTkVXX0VNQUNfTk9fRkxPV19DVFJMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lCTV9ORVdfRU1BQ19NQUxfQ0xSX0lDSU5UU1RBVCBpcyBub3Qgc2V0CisjIENPTkZJR19JQk1fTkVXX0VNQUNfTUFMX0NPTU1PTl9FUlIgaXMgbm90IHNldAogQ09ORklHX05FVERFVl8xMDAwPXkKICMgQ09ORklHX0FYODgxODAgaXMgbm90IHNldAogQ09ORklHX05FVERFVl8xMDAwMD15CkBAIC02MzksMTAgKzY1NCwxMCBAQAogIwogIyBDT05GSUdfV0xBTl9QUkU4MDIxMSBpcyBub3Qgc2V0CiAjIENPTkZJR19XTEFOXzgwMjExIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lXTFdJRklfTEVEUyBpcyBub3Qgc2V0CiAjIENPTkZJR19XQU4gaXMgbm90IHNldAogIyBDT05GSUdfUFBQIGlzIG5vdCBzZXQKICMgQ09ORklHX1NMSVAgaXMgbm90IHNldAotIyBDT05GSUdfU0hBUEVSIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVENPTlNPTEUgaXMgbm90IHNldAogIyBDT05GSUdfTkVUUE9MTCBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSIGlzIG5vdCBzZXQKQEAgLTY5MCw4ICs3MDUsMTEgQEAKICMgQ09ORklHX0JGNXh4X1BQSSBpcyBub3Qgc2V0CiAjIENPTkZJR19CRklOX1NQT1JUIGlzIG5vdCBzZXQKICMgQ09ORklHX0JGSU5fVElNRVJfTEFURU5DWSBpcyBub3Qgc2V0CitDT05GSUdfQkZJTl9ETUFfSU5URVJGQUNFPW0KIENPTkZJR19TSU1QTEVfR1BJTz1tCiAjIENPTkZJR19WVCBpcyBub3Qgc2V0CisjIENPTkZJR19ERVZLTUVNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGSU5fSlRBR19DT01NIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFUklBTF9OT05TVEFOREFSRCBpcyBub3Qgc2V0CiAKICMKQEAgLTcyMCwyMiArNzM4LDE5IEBACiAjIENPTkZJR19DQU40TElOVVggaXMgbm90IHNldAogIyBDT05GSUdfSVBNSV9IQU5ETEVSIGlzIG5vdCBzZXQKICMgQ09ORklHX0hXX1JBTkRPTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19HRU5fUlRDIGlzIG5vdCBzZXQKICMgQ09ORklHX1IzOTY0IGlzIG5vdCBzZXQKICMgQ09ORklHX1JBV19EUklWRVIgaXMgbm90IHNldAogIyBDT05GSUdfVENHX1RQTSBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkMgaXMgbm90IHNldAotCi0jCi0jIFNQSSBzdXBwb3J0Ci0jCiBDT05GSUdfU1BJPXkKKyMgQ09ORklHX1NQSV9ERUJVRyBpcyBub3Qgc2V0CiBDT05GSUdfU1BJX01BU1RFUj15CiAKICMKICMgU1BJIE1hc3RlciBDb250cm9sbGVyIERyaXZlcnMKICMKIENPTkZJR19TUElfQkZJTj15CisjIENPTkZJR19TUElfQkZJTl9MT0NLIGlzIG5vdCBzZXQKICMgQ09ORklHX1NQSV9CSVRCQU5HIGlzIG5vdCBzZXQKIAogIwpAQCAtNzQ0LDE0ICs3NTksMTggQEAKICMgQ09ORklHX1NQSV9BVDI1IGlzIG5vdCBzZXQKICMgQ09ORklHX1NQSV9TUElERVYgaXMgbm90IHNldAogIyBDT05GSUdfU1BJX1RMRTYyWDAgaXMgbm90IHNldAorQ09ORklHX0FSQ0hfV0FOVF9PUFRJT05BTF9HUElPTElCPXkKKyMgQ09ORklHX0dQSU9MSUIgaXMgbm90IHNldAogIyBDT05GSUdfVzEgaXMgbm90IHNldAogIyBDT05GSUdfUE9XRVJfU1VQUExZIGlzIG5vdCBzZXQKIENPTkZJR19IV01PTj15CiAjIENPTkZJR19IV01PTl9WSUQgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRENYWCBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0Y3MTgwNUYgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19GNzE4ODJGRyBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0lUODcgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19MTTcwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTUFYMTExMSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1BDODczNjAgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19QQzg3NDI3IGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfU01TQzQ3TTEgaXMgbm90IHNldApAQCAtNzYwLDYgKzc3OSw4IEBACiAjIENPTkZJR19TRU5TT1JTX1c4MzYyN0hGIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfVzgzNjI3RUhGIGlzIG5vdCBzZXQKICMgQ09ORklHX0hXTU9OX0RFQlVHX0NISVAgaXMgbm90IHNldAorIyBDT05GSUdfVEhFUk1BTCBpcyBub3Qgc2V0CisjIENPTkZJR19USEVSTUFMX0hXTU9OIGlzIG5vdCBzZXQKIENPTkZJR19XQVRDSERPRz15CiAjIENPTkZJR19XQVRDSERPR19OT1dBWU9VVCBpcyBub3Qgc2V0CiAKQEAgLTc3MCwyMSArNzkxLDI4IEBACiBDT05GSUdfQkZJTl9XRFQ9eQogCiAjCi0jIFNvbmljcyBTaWxpY29uIEJhY2twbGFuZQotIwotQ09ORklHX1NTQl9QT1NTSUJMRT15Ci0jIENPTkZJR19TU0IgaXMgbm90IHNldAotCi0jCiAjIE11bHRpZnVuY3Rpb24gZGV2aWNlIGRyaXZlcnMKICMKKyMgQ09ORklHX01GRF9DT1JFIGlzIG5vdCBzZXQKICMgQ09ORklHX01GRF9TTTUwMSBpcyBub3Qgc2V0CisjIENPTkZJR19IVENfUEFTSUMzIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9UTUlPIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9XTTg0MDAgaXMgbm90IHNldAogCiAjCiAjIE11bHRpbWVkaWEgZGV2aWNlcwogIworCisjCisjIE11bHRpbWVkaWEgY29yZSBzdXBwb3J0CisjCiAjIENPTkZJR19WSURFT19ERVYgaXMgbm90IHNldAogIyBDT05GSUdfRFZCX0NPUkUgaXMgbm90IHNldAorIyBDT05GSUdfVklERU9fTUVESUEgaXMgbm90IHNldAorCisjCisjIE11bHRpbWVkaWEgZHJpdmVycworIwogIyBDT05GSUdfREFCIGlzIG5vdCBzZXQKIAogIwpAQCAtNzk5LDQzICs4MjcsNDMgQEAKICMgRGlzcGxheSBkZXZpY2Ugc3VwcG9ydAogIwogIyBDT05GSUdfRElTUExBWV9TVVBQT1JUIGlzIG5vdCBzZXQKLQotIwotIyBTb3VuZAotIwogIyBDT05GSUdfU09VTkQgaXMgbm90IHNldAogQ09ORklHX0hJRF9TVVBQT1JUPXkKIENPTkZJR19ISUQ9bQogIyBDT05GSUdfSElEX0RFQlVHIGlzIG5vdCBzZXQKICMgQ09ORklHX0hJRFJBVyBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfU1VQUE9SVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19NTUMgaXMgbm90IHNldAotIyBDT05GSUdfTkVXX0xFRFMgaXMgbm90IHNldAotIyBDT05GSUdfUlRDX0NMQVNTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hJRF9QSUQgaXMgbm90IHNldAogCiAjCi0jIFVzZXJzcGFjZSBJL08KKyMgU3BlY2lhbCBISUQgZHJpdmVycwogIworQ09ORklHX0hJRF9DT01QQVQ9eQorIyBDT05GSUdfVVNCX1NVUFBPUlQgaXMgbm90IHNldAorIyBDT05GSUdfTU1DIGlzIG5vdCBzZXQKKyMgQ09ORklHX01FTVNUSUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FV19MRURTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FDQ0VTU0lCSUxJVFkgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0NMQVNTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RNQURFVklDRVMgaXMgbm90IHNldAogIyBDT05GSUdfVUlPIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NUQUdJTkcgaXMgbm90IHNldAogCiAjCiAjIEZpbGUgc3lzdGVtcwogIwogIyBDT05GSUdfRVhUMl9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19FWFQzX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0VYVDRERVZfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRVhUNF9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19SRUlTRVJGU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19KRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfRlNfUE9TSVhfQUNMIGlzIG5vdCBzZXQKK0NPTkZJR19GSUxFX0xPQ0tJTkc9eQogIyBDT05GSUdfWEZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0dGUzJfRlMgaXMgbm90IHNldAogIyBDT05GSUdfT0NGUzJfRlMgaXMgbm90IHNldAotIyBDT05GSUdfTUlOSVhfRlMgaXMgbm90IHNldAotIyBDT05GSUdfUk9NRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRE5PVElGWSBpcyBub3Qgc2V0CiBDT05GSUdfSU5PVElGWT15CiBDT05GSUdfSU5PVElGWV9VU0VSPXkKICMgQ09ORklHX1FVT1RBIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ROT1RJRlkgaXMgbm90IHNldAogIyBDT05GSUdfQVVUT0ZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0FVVE9GUzRfRlMgaXMgbm90IHNldAogIyBDT05GSUdfRlVTRV9GUyBpcyBub3Qgc2V0CkBAIC04NzUsMTEgKzkwMywxMSBAQAogIyBDT05GSUdfRUZTX0ZTIGlzIG5vdCBzZXQKIENPTkZJR19ZQUZGU19GUz1tCiBDT05GSUdfWUFGRlNfWUFGRlMxPXkKKyMgQ09ORklHX1lBRkZTXzlCWVRFX1RBR1MgaXMgbm90IHNldAogIyBDT05GSUdfWUFGRlNfRE9FU19FQ0MgaXMgbm90IHNldAogQ09ORklHX1lBRkZTX1lBRkZTMj15CiBDT05GSUdfWUFGRlNfQVVUT19ZQUZGUzI9eQogIyBDT05GSUdfWUFGRlNfRElTQUJMRV9MQVpZX0xPQUQgaXMgbm90IHNldAotQ09ORklHX1lBRkZTX0NIRUNLUE9JTlRfUkVTRVJWRURfQkxPQ0tTPTEwCiAjIENPTkZJR19ZQUZGU19ESVNBQkxFX1dJREVfVE5PREVTIGlzIG5vdCBzZXQKICMgQ09ORklHX1lBRkZTX0FMV0FZU19DSEVDS19DSFVOS19FUkFTRUQgaXMgbm90IHNldAogQ09ORklHX1lBRkZTX1NIT1JUX05BTUVTX0lOX1JBTT15CkBAIC04OTYsOCArOTI0LDExIEBACiAjIENPTkZJR19KRkZTMl9SVUJJTiBpcyBub3Qgc2V0CiAjIENPTkZJR19DUkFNRlMgaXMgbm90IHNldAogIyBDT05GSUdfVlhGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19NSU5JWF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19PTUZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0hQRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfUU5YNEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JPTUZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1NZU1ZfRlMgaXMgbm90IHNldAogIyBDT05GSUdfVUZTX0ZTIGlzIG5vdCBzZXQKIENPTkZJR19ORVRXT1JLX0ZJTEVTWVNURU1TPXkKQEAgLTkwNSwxMyArOTM2LDEyIEBACiBDT05GSUdfTkZTX1YzPXkKICMgQ09ORklHX05GU19WM19BQ0wgaXMgbm90IHNldAogIyBDT05GSUdfTkZTX1Y0IGlzIG5vdCBzZXQKLSMgQ09ORklHX05GU19ESVJFQ1RJTyBpcyBub3Qgc2V0CiAjIENPTkZJR19ORlNEIGlzIG5vdCBzZXQKIENPTkZJR19MT0NLRD1tCiBDT05GSUdfTE9DS0RfVjQ9eQogQ09ORklHX05GU19DT01NT049eQogQ09ORklHX1NVTlJQQz1tCi0jIENPTkZJR19TVU5SUENfQklORDM0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NVTlJQQ19SRUdJU1RFUl9WNCBpcyBub3Qgc2V0CiAjIENPTkZJR19SUENTRUNfR1NTX0tSQjUgaXMgbm90IHNldAogIyBDT05GSUdfUlBDU0VDX0dTU19TUEtNMyBpcyBub3Qgc2V0CiBDT05GSUdfU01CX0ZTPW0KQEAgLTk2Nyw5ICs5OTcsNiBAQAogIyBDT05GSUdfTkxTX0tPSThfVSBpcyBub3Qgc2V0CiAjIENPTkZJR19OTFNfVVRGOCBpcyBub3Qgc2V0CiAjIENPTkZJR19ETE0gaXMgbm90IHNldAotQ09ORklHX0lOU1RSVU1FTlRBVElPTj15Ci0jIENPTkZJR19QUk9GSUxJTkcgaXMgbm90IHNldAotIyBDT05GSUdfTUFSS0VSUyBpcyBub3Qgc2V0CiAKICMKICMgS2VybmVsIGhhY2tpbmcKQEAgLTk3NywxNCArMTAwNCw1MyBAQAogIyBDT05GSUdfUFJJTlRLX1RJTUUgaXMgbm90IHNldAogQ09ORklHX0VOQUJMRV9XQVJOX0RFUFJFQ0FURUQ9eQogQ09ORklHX0VOQUJMRV9NVVNUX0NIRUNLPXkKK0NPTkZJR19GUkFNRV9XQVJOPTEwMjQKICMgQ09ORklHX01BR0lDX1NZU1JRIGlzIG5vdCBzZXQKICMgQ09ORklHX1VOVVNFRF9TWU1CT0xTIGlzIG5vdCBzZXQKIENPTkZJR19ERUJVR19GUz15CiAjIENPTkZJR19IRUFERVJTX0NIRUNLIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQlVHX0tFUk5FTCBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfS0VSTkVMPXkKKyMgQ09ORklHX0RFQlVHX1NISVJRIGlzIG5vdCBzZXQKK0NPTkZJR19ERVRFQ1RfU09GVExPQ0tVUD15CisjIENPTkZJR19CT09UUEFSQU1fU09GVExPQ0tVUF9QQU5JQyBpcyBub3Qgc2V0CitDT05GSUdfQk9PVFBBUkFNX1NPRlRMT0NLVVBfUEFOSUNfVkFMVUU9MAorQ09ORklHX1NDSEVEX0RFQlVHPXkKKyMgQ09ORklHX1NDSEVEU1RBVFMgaXMgbm90IHNldAorIyBDT05GSUdfVElNRVJfU1RBVFMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfT0JKRUNUUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TTEFCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1JUX01VVEVYRVMgaXMgbm90IHNldAorIyBDT05GSUdfUlRfTVVURVhfVEVTVEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NQSU5MT0NLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX01VVEVYRVMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU1BJTkxPQ0tfU0xFRVAgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfTE9DS0lOR19BUElfU0VMRlRFU1RTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0tPQkpFQ1QgaXMgbm90IHNldAogIyBDT05GSUdfREVCVUdfQlVHVkVSQk9TRSBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfSU5GTz15CisjIENPTkZJR19ERUJVR19WTSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19XUklURUNPVU5UIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX01FTU9SWV9JTklUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0xJU1QgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU0cgaXMgbm90IHNldAorIyBDT05GSUdfRlJBTUVfUE9JTlRFUiBpcyBub3Qgc2V0CisjIENPTkZJR19CT09UX1BSSU5US19ERUxBWSBpcyBub3Qgc2V0CisjIENPTkZJR19SQ1VfVE9SVFVSRV9URVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JDVV9DUFVfU1RBTExfREVURUNUT1IgaXMgbm90IHNldAorIyBDT05GSUdfQkFDS1RSQUNFX1NFTEZfVEVTVCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19CTE9DS19FWFRfREVWVCBpcyBub3Qgc2V0CisjIENPTkZJR19GQVVMVF9JTkpFQ1RJT04gaXMgbm90IHNldAorIyBDT05GSUdfU1lTQ1RMX1NZU0NBTExfQ0hFQ0sgaXMgbm90IHNldAorIyBDT05GSUdfRFlOQU1JQ19QUklOVEtfREVCVUcgaXMgbm90IHNldAogIyBDT05GSUdfU0FNUExFUyBpcyBub3Qgc2V0CitDT05GSUdfSEFWRV9BUkNIX0tHREI9eQorIyBDT05GSUdfS0dEQiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TVEFDS09WRVJGTE9XIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NUQUNLX1VTQUdFIGlzIG5vdCBzZXQKK0NPTkZJR19ERUJVR19WRVJCT1NFPXkKIENPTkZJR19ERUJVR19NTVJTPXkKKyMgQ09ORklHX0RFQlVHX0hXRVJSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0RPVUJMRUZBVUxUIGlzIG5vdCBzZXQKIENPTkZJR19ERUJVR19IVU5UX0ZPUl9aRVJPPXkKIENPTkZJR19ERUJVR19CRklOX0hXVFJBQ0VfT049eQogQ09ORklHX0RFQlVHX0JGSU5fSFdUUkFDRV9DT01QUkVTU0lPTl9PRkY9eQpAQCAtOTk0LDcgKzEwNjAsNiBAQAogIyBDT05GSUdfREVCVUdfQkZJTl9IV1RSQUNFX0VYUEFORCBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19CRklOX05PX0tFUk5fSFdUUkFDRSBpcyBub3Qgc2V0CiBDT05GSUdfRUFSTFlfUFJJTlRLPXkKLSMgQ09ORklHX0RVQUxfQ09SRV9URVNUX01PRFVMRSBpcyBub3Qgc2V0CiBDT05GSUdfQ1BMQl9JTkZPPXkKIENPTkZJR19BQ0NFU1NfQ0hFQ0s9eQogCkBAIC0xMDAzLDkgKzEwNjgsOTQgQEAKICMKICMgQ09ORklHX0tFWVMgaXMgbm90IHNldAogQ09ORklHX1NFQ1VSSVRZPXkKKyMgQ09ORklHX1NFQ1VSSVRZRlMgaXMgbm90IHNldAogIyBDT05GSUdfU0VDVVJJVFlfTkVUV09SSyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRUNVUklUWV9DQVBBQklMSVRJRVMgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFQ1VSSVRZX0ZJTEVfQ0FQQUJJTElUSUVTIGlzIG5vdCBzZXQKK0NPTkZJR19TRUNVUklUWV9ERUZBVUxUX01NQVBfTUlOX0FERFI9MAorQ09ORklHX0NSWVBUTz15CisKKyMKKyMgQ3J5cHRvIGNvcmUgb3IgaGVscGVyCisjCisjIENPTkZJR19DUllQVE9fRklQUyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fTUFOQUdFUiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fR0YxMjhNVUwgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX05VTEwgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0NSWVBURCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQVVUSEVOQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fVEVTVCBpcyBub3Qgc2V0CisKKyMKKyMgQXV0aGVudGljYXRlZCBFbmNyeXB0aW9uIHdpdGggQXNzb2NpYXRlZCBEYXRhCisjCisjIENPTkZJR19DUllQVE9fQ0NNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19HQ00gaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1NFUUlWIGlzIG5vdCBzZXQKKworIworIyBCbG9jayBtb2RlcworIworIyBDT05GSUdfQ1JZUFRPX0NCQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQ1RSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19DVFMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0VDQiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fTFJXIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19QQ0JDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19YVFMgaXMgbm90IHNldAorCisjCisjIEhhc2ggbW9kZXMKKyMKKyMgQ09ORklHX0NSWVBUT19ITUFDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19YQ0JDIGlzIG5vdCBzZXQKKworIworIyBEaWdlc3QKKyMKKyMgQ09ORklHX0NSWVBUT19DUkMzMkMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX01ENCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fTUQ1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19NSUNIQUVMX01JQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fUk1EMTI4IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19STUQxNjAgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1JNRDI1NiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fUk1EMzIwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TSEExIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TSEEyNTYgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1NIQTUxMiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fVEdSMTkyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19XUDUxMiBpcyBub3Qgc2V0CisKKyMKKyMgQ2lwaGVycworIworIyBDT05GSUdfQ1JZUFRPX0FFUyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQU5VQklTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19BUkM0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19CTE9XRklTSCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQ0FNRUxMSUEgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0NBU1Q1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19DQVNUNiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fREVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19GQ1JZUFQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0tIQVpBRCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0FMU0EyMCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0VFRCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0VSUEVOVCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fVEVBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19UV09GSVNIIGlzIG5vdCBzZXQKKworIworIyBDb21wcmVzc2lvbgorIworIyBDT05GSUdfQ1JZUFRPX0RFRkxBVEUgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0xaTyBpcyBub3Qgc2V0CisKKyMKKyMgUmFuZG9tIE51bWJlciBHZW5lcmF0aW9uCisjCisjIENPTkZJR19DUllQVE9fQU5TSV9DUFJORyBpcyBub3Qgc2V0CitDT05GSUdfQ1JZUFRPX0hXPXkKIAogIwogIyBMaWJyYXJ5IHJvdXRpbmVzCkBAIC0xMDEzLDYgKzExNjMsNyBAQAogQ09ORklHX0JJVFJFVkVSU0U9eQogQ09ORklHX0NSQ19DQ0lUVD1tCiAjIENPTkZJR19DUkMxNiBpcyBub3Qgc2V0CisjIENPTkZJR19DUkNfVDEwRElGIGlzIG5vdCBzZXQKICMgQ09ORklHX0NSQ19JVFVfVCBpcyBub3Qgc2V0CiBDT05GSUdfQ1JDMzI9eQogIyBDT05GSUdfQ1JDNyBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2NvbmZpZ3MvQmxhY2tTdGFtcF9kZWZjb25maWcgYi9hcmNoL2JsYWNrZmluL2NvbmZpZ3MvQmxhY2tTdGFtcF9kZWZjb25maWcKaW5kZXggMjkyMWY5OS4uOTY4M2IyZSAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9jb25maWdzL0JsYWNrU3RhbXBfZGVmY29uZmlnCisrKyBiL2FyY2gvYmxhY2tmaW4vY29uZmlncy9CbGFja1N0YW1wX2RlZmNvbmZpZwpAQCAtNTMsNyArNTMsNyBAQAogQ09ORklHX0hPVFBMVUc9eQogQ09ORklHX1BSSU5USz15CiBDT05GSUdfQlVHPXkKLUNPTkZJR19FTEZfQ09SRT15CisjIENPTkZJR19FTEZfQ09SRSBpcyBub3Qgc2V0CiBDT05GSUdfQ09NUEFUX0JSSz15CiBDT05GSUdfQkFTRV9GVUxMPXkKIENPTkZJR19GVVRFWD15CkBAIC0yNzYsNyArMjc2LDYgQEAKIENPTkZJR19aT05FX0RNQV9GTEFHPTEKIENPTkZJR19WSVJUX1RPX0JVUz15CiBDT05GSUdfQkZJTl9HUFRJTUVSUz15Ci1DT05GSUdfQkZJTl9ETUFfNVhYPXkKICMgQ09ORklHX0RNQV9VTkNBQ0hFRF80TSBpcyBub3Qgc2V0CiAjIENPTkZJR19ETUFfVU5DQUNIRURfMk0gaXMgbm90IHNldAogQ09ORklHX0RNQV9VTkNBQ0hFRF8xTT15CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2NvbmZpZ3MvQ00tQkY1MjdfZGVmY29uZmlnIGIvYXJjaC9ibGFja2Zpbi9jb25maWdzL0NNLUJGNTI3X2RlZmNvbmZpZwppbmRleCBiNmExNDYzLi5hMDQxZTdlIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2NvbmZpZ3MvQ00tQkY1MjdfZGVmY29uZmlnCisrKyBiL2FyY2gvYmxhY2tmaW4vY29uZmlncy9DTS1CRjUyN19kZWZjb25maWcKQEAgLTQyLDcgKzQyLDcgQEAKIENPTkZJR19GQUlSX0dST1VQX1NDSEVEPXkKIENPTkZJR19GQUlSX1VTRVJfU0NIRUQ9eQogIyBDT05GSUdfRkFJUl9DR1JPVVBfU0NIRUQgaXMgbm90IHNldAotQ09ORklHX1NZU0ZTX0RFUFJFQ0FURUQ9eQorIyBDT05GSUdfU1lTRlNfREVQUkVDQVRFRCBpcyBub3Qgc2V0CiAjIENPTkZJR19SRUxBWSBpcyBub3Qgc2V0CiBDT05GSUdfQkxLX0RFVl9JTklUUkQ9eQogQ09ORklHX0lOSVRSQU1GU19TT1VSQ0U9IiIKQEAgLTU2LDcgKzU2LDcgQEAKIENPTkZJR19IT1RQTFVHPXkKIENPTkZJR19QUklOVEs9eQogQ09ORklHX0JVRz15Ci1DT05GSUdfRUxGX0NPUkU9eQorIyBDT05GSUdfRUxGX0NPUkUgaXMgbm90IHNldAogQ09ORklHX0JBU0VfRlVMTD15CiBDT05GSUdfRlVURVg9eQogQ09ORklHX0FOT05fSU5PREVTPXkKQEAgLTE5MCwxNCArMTkwLDE0IEBACiBDT05GSUdfSVJRX1BPUlRIX0lOVEE9MTEKIENPTkZJR19JUlFfTUFDX1RYPTExCiBDT05GSUdfSVJRX1BPUlRIX0lOVEI9MTEKLUNPTkZJR19JUlFfVE1SMD0xMgotQ09ORklHX0lSUV9UTVIxPTEyCi1DT05GSUdfSVJRX1RNUjI9MTIKLUNPTkZJR19JUlFfVE1SMz0xMgotQ09ORklHX0lSUV9UTVI0PTEyCi1DT05GSUdfSVJRX1RNUjU9MTIKLUNPTkZJR19JUlFfVE1SNj0xMgotQ09ORklHX0lSUV9UTVI3PTEyCitDT05GSUdfSVJRX1RJTUVSMD0xMgorQ09ORklHX0lSUV9USU1FUjE9MTIKK0NPTkZJR19JUlFfVElNRVIyPTEyCitDT05GSUdfSVJRX1RJTUVSMz0xMgorQ09ORklHX0lSUV9USU1FUjQ9MTIKK0NPTkZJR19JUlFfVElNRVI1PTEyCitDT05GSUdfSVJRX1RJTUVSNj0xMgorQ09ORklHX0lSUV9USU1FUjc9MTIKIENPTkZJR19JUlFfUE9SVEdfSU5UQT0xMgogQ09ORklHX0lSUV9QT1JUR19JTlRCPTEyCiBDT05GSUdfSVJRX01FTV9ETUEwPTEzCkBAIC0yOTIsNyArMjkyLDYgQEAKIENPTkZJR19aT05FX0RNQV9GTEFHPTEKIENPTkZJR19WSVJUX1RPX0JVUz15CiBDT05GSUdfQkZJTl9HUFRJTUVSUz15Ci1DT05GSUdfQkZJTl9ETUFfNVhYPXkKICMgQ09ORklHX0RNQV9VTkNBQ0hFRF80TSBpcyBub3Qgc2V0CiAjIENPTkZJR19ETUFfVU5DQUNIRURfMk0gaXMgbm90IHNldAogQ09ORklHX0RNQV9VTkNBQ0hFRF8xTT15CkBAIC02NTAsNiArNjQ5LDcgQEAKICMgQ09ORklHX1RXSV9MQ0QgaXMgbm90IHNldAogQ09ORklHX1NJTVBMRV9HUElPPW0KICMgQ09ORklHX1ZUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFVktNRU0gaXMgbm90IHNldAogIyBDT05GSUdfU0VSSUFMX05PTlNUQU5EQVJEIGlzIG5vdCBzZXQKIAogIwpAQCAtNjk5LDcgKzY5OSw3IEBACiAjIEkyQyBIYXJkd2FyZSBCdXMgc3VwcG9ydAogIwogQ09ORklHX0kyQ19CTEFDS0ZJTl9UV0k9bQotQ09ORklHX0kyQ19CTEFDS0ZJTl9UV0lfQ0xLX0tIWj01MAorQ09ORklHX0kyQ19CTEFDS0ZJTl9UV0lfQ0xLX0tIWj0xMDAKICMgQ09ORklHX0kyQ19HUElPIGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19PQ09SRVMgaXMgbm90IHNldAogIyBDT05GSUdfSTJDX1BBUlBPUlRfTElHSFQgaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9jb25maWdzL0NNLUJGNTMzX2RlZmNvbmZpZyBiL2FyY2gvYmxhY2tmaW4vY29uZmlncy9DTS1CRjUzM19kZWZjb25maWcKaW5kZXggYzNiYTkwNi4uMDg1MjExYiAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9jb25maWdzL0NNLUJGNTMzX2RlZmNvbmZpZworKysgYi9hcmNoL2JsYWNrZmluL2NvbmZpZ3MvQ00tQkY1MzNfZGVmY29uZmlnCkBAIC00Miw3ICs0Miw3IEBACiBDT05GSUdfSUtDT05GSUc9eQogQ09ORklHX0lLQ09ORklHX1BST0M9eQogQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKLUNPTkZJR19TWVNGU19ERVBSRUNBVEVEPXkKKyMgQ09ORklHX1NZU0ZTX0RFUFJFQ0FURUQgaXMgbm90IHNldAogIyBDT05GSUdfUkVMQVkgaXMgbm90IHNldAogIyBDT05GSUdfQkxLX0RFVl9JTklUUkQgaXMgbm90IHNldAogIyBDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkUgaXMgbm90IHNldApAQCAtNTUsNyArNTUsNyBAQAogIyBDT05GSUdfSE9UUExVRyBpcyBub3Qgc2V0CiBDT05GSUdfUFJJTlRLPXkKIENPTkZJR19CVUc9eQotQ09ORklHX0VMRl9DT1JFPXkKKyMgQ09ORklHX0VMRl9DT1JFIGlzIG5vdCBzZXQKIENPTkZJR19CQVNFX0ZVTEw9eQogQ09ORklHX0ZVVEVYPXkKIENPTkZJR19BTk9OX0lOT0RFUz15CkBAIC0yNTQsNyArMjU0LDYgQEAKIENPTkZJR19aT05FX0RNQV9GTEFHPTEKIENPTkZJR19MQVJHRV9BTExPQ1M9eQogIyBDT05GSUdfQkZJTl9HUFRJTUVSUyBpcyBub3Qgc2V0Ci1DT05GSUdfQkZJTl9ETUFfNVhYPXkKICMgQ09ORklHX0RNQV9VTkNBQ0hFRF8yTSBpcyBub3Qgc2V0CiBDT05GSUdfRE1BX1VOQ0FDSEVEXzFNPXkKICMgQ09ORklHX0RNQV9VTkNBQ0hFRF9OT05FIGlzIG5vdCBzZXQKQEAgLTU5OCw2ICs1OTcsNyBAQAogQ09ORklHX0JGSU5fU1BPUlQ9eQogIyBDT05GSUdfQkZJTl9USU1FUl9MQVRFTkNZIGlzIG5vdCBzZXQKICMgQ09ORklHX1ZUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFVktNRU0gaXMgbm90IHNldAogIyBDT05GSUdfU0VSSUFMX05PTlNUQU5EQVJEIGlzIG5vdCBzZXQKIAogIwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9jb25maWdzL0NNLUJGNTM3RV9kZWZjb25maWcgYi9hcmNoL2JsYWNrZmluL2NvbmZpZ3MvQ00tQkY1MzdFX2RlZmNvbmZpZwppbmRleCBjZGM2YjdmLi43NTAyMDNlIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2NvbmZpZ3MvQ00tQkY1MzdFX2RlZmNvbmZpZworKysgYi9hcmNoL2JsYWNrZmluL2NvbmZpZ3MvQ00tQkY1MzdFX2RlZmNvbmZpZwpAQCAtNDIsNyArNDIsNyBAQAogQ09ORklHX0lLQ09ORklHPXkKIENPTkZJR19JS0NPTkZJR19QUk9DPXkKIENPTkZJR19MT0dfQlVGX1NISUZUPTE0Ci1DT05GSUdfU1lTRlNfREVQUkVDQVRFRD15CisjIENPTkZJR19TWVNGU19ERVBSRUNBVEVEIGlzIG5vdCBzZXQKICMgQ09ORklHX1JFTEFZIGlzIG5vdCBzZXQKICMgQ09ORklHX0JMS19ERVZfSU5JVFJEIGlzIG5vdCBzZXQKICMgQ09ORklHX0NDX09QVElNSVpFX0ZPUl9TSVpFIGlzIG5vdCBzZXQKQEAgLTU1LDcgKzU1LDcgQEAKICMgQ09ORklHX0hPVFBMVUcgaXMgbm90IHNldAogQ09ORklHX1BSSU5USz15CiBDT05GSUdfQlVHPXkKLUNPTkZJR19FTEZfQ09SRT15CisjIENPTkZJR19FTEZfQ09SRSBpcyBub3Qgc2V0CiBDT05GSUdfQkFTRV9GVUxMPXkKIENPTkZJR19GVVRFWD15CiBDT05GSUdfQU5PTl9JTk9ERVM9eQpAQCAtMTU3LDE0ICsxNTcsMTQgQEAKIENPTkZJR19JUlFfVUFSVDFfVFg9MTAKIENPTkZJR19JUlFfTUFDX1JYPTExCiBDT05GSUdfSVJRX01BQ19UWD0xMQotQ09ORklHX0lSUV9UTVIwPTEyCi1DT05GSUdfSVJRX1RNUjE9MTIKLUNPTkZJR19JUlFfVE1SMj0xMgotQ09ORklHX0lSUV9UTVIzPTEyCi1DT05GSUdfSVJRX1RNUjQ9MTIKLUNPTkZJR19JUlFfVE1SNT0xMgotQ09ORklHX0lSUV9UTVI2PTEyCi1DT05GSUdfSVJRX1RNUjc9MTIKK0NPTkZJR19JUlFfVElNRVIwPTEyCitDT05GSUdfSVJRX1RJTUVSMT0xMgorQ09ORklHX0lSUV9USU1FUjI9MTIKK0NPTkZJR19JUlFfVElNRVIzPTEyCitDT05GSUdfSVJRX1RJTUVSND0xMgorQ09ORklHX0lSUV9USU1FUjU9MTIKK0NPTkZJR19JUlFfVElNRVI2PTEyCitDT05GSUdfSVJRX1RJTUVSNz0xMgogQ09ORklHX0lSUV9QT1JUR19JTlRCPTEyCiBDT05GSUdfSVJRX01FTV9ETUEwPTEzCiBDT05GSUdfSVJRX01FTV9ETUExPTEzCkBAIC0yNjIsNyArMjYyLDYgQEAKIENPTkZJR19aT05FX0RNQV9GTEFHPTEKIENPTkZJR19MQVJHRV9BTExPQ1M9eQogIyBDT05GSUdfQkZJTl9HUFRJTUVSUyBpcyBub3Qgc2V0Ci1DT05GSUdfQkZJTl9ETUFfNVhYPXkKICMgQ09ORklHX0RNQV9VTkNBQ0hFRF8yTSBpcyBub3Qgc2V0CiBDT05GSUdfRE1BX1VOQ0FDSEVEXzFNPXkKICMgQ09ORklHX0RNQV9VTkNBQ0hFRF9OT05FIGlzIG5vdCBzZXQKQEAgLTYyNyw2ICs2MjYsNyBAQAogQ09ORklHX0JGSU5fU1BPUlQ9eQogIyBDT05GSUdfQkZJTl9USU1FUl9MQVRFTkNZIGlzIG5vdCBzZXQKICMgQ09ORklHX1ZUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFVktNRU0gaXMgbm90IHNldAogIyBDT05GSUdfU0VSSUFMX05PTlNUQU5EQVJEIGlzIG5vdCBzZXQKIAogIwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9jb25maWdzL0NNLUJGNTM3VV9kZWZjb25maWcgYi9hcmNoL2JsYWNrZmluL2NvbmZpZ3MvQ00tQkY1MzdVX2RlZmNvbmZpZwppbmRleCBmMDc0YmRjLi5kZWM4YTdkIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2NvbmZpZ3MvQ00tQkY1MzdVX2RlZmNvbmZpZworKysgYi9hcmNoL2JsYWNrZmluL2NvbmZpZ3MvQ00tQkY1MzdVX2RlZmNvbmZpZwpAQCAtNDIsNyArNDIsNyBAQAogQ09ORklHX0lLQ09ORklHPXkKIENPTkZJR19JS0NPTkZJR19QUk9DPXkKIENPTkZJR19MT0dfQlVGX1NISUZUPTE0Ci1DT05GSUdfU1lTRlNfREVQUkVDQVRFRD15CisjIENPTkZJR19TWVNGU19ERVBSRUNBVEVEIGlzIG5vdCBzZXQKICMgQ09ORklHX1JFTEFZIGlzIG5vdCBzZXQKICMgQ09ORklHX0JMS19ERVZfSU5JVFJEIGlzIG5vdCBzZXQKICMgQ09ORklHX0NDX09QVElNSVpFX0ZPUl9TSVpFIGlzIG5vdCBzZXQKQEAgLTU1LDcgKzU1LDcgQEAKICMgQ09ORklHX0hPVFBMVUcgaXMgbm90IHNldAogQ09ORklHX1BSSU5USz15CiBDT05GSUdfQlVHPXkKLUNPTkZJR19FTEZfQ09SRT15CisjIENPTkZJR19FTEZfQ09SRSBpcyBub3Qgc2V0CiBDT05GSUdfQkFTRV9GVUxMPXkKIENPTkZJR19GVVRFWD15CiBDT05GSUdfQU5PTl9JTk9ERVM9eQpAQCAtMTU3LDE0ICsxNTcsMTQgQEAKIENPTkZJR19JUlFfVUFSVDFfVFg9MTAKIENPTkZJR19JUlFfTUFDX1JYPTExCiBDT05GSUdfSVJRX01BQ19UWD0xMQotQ09ORklHX0lSUV9UTVIwPTEyCi1DT05GSUdfSVJRX1RNUjE9MTIKLUNPTkZJR19JUlFfVE1SMj0xMgotQ09ORklHX0lSUV9UTVIzPTEyCi1DT05GSUdfSVJRX1RNUjQ9MTIKLUNPTkZJR19JUlFfVE1SNT0xMgotQ09ORklHX0lSUV9UTVI2PTEyCi1DT05GSUdfSVJRX1RNUjc9MTIKK0NPTkZJR19JUlFfVElNRVIwPTEyCitDT05GSUdfSVJRX1RJTUVSMT0xMgorQ09ORklHX0lSUV9USU1FUjI9MTIKK0NPTkZJR19JUlFfVElNRVIzPTEyCitDT05GSUdfSVJRX1RJTUVSND0xMgorQ09ORklHX0lSUV9USU1FUjU9MTIKK0NPTkZJR19JUlFfVElNRVI2PTEyCitDT05GSUdfSVJRX1RJTUVSNz0xMgogQ09ORklHX0lSUV9QT1JUR19JTlRCPTEyCiBDT05GSUdfSVJRX01FTV9ETUEwPTEzCiBDT05GSUdfSVJRX01FTV9ETUExPTEzCkBAIC0yNjIsNyArMjYyLDYgQEAKIENPTkZJR19aT05FX0RNQV9GTEFHPTEKIENPTkZJR19MQVJHRV9BTExPQ1M9eQogIyBDT05GSUdfQkZJTl9HUFRJTUVSUyBpcyBub3Qgc2V0Ci1DT05GSUdfQkZJTl9ETUFfNVhYPXkKICMgQ09ORklHX0RNQV9VTkNBQ0hFRF8yTSBpcyBub3Qgc2V0CiBDT05GSUdfRE1BX1VOQ0FDSEVEXzFNPXkKICMgQ09ORklHX0RNQV9VTkNBQ0hFRF9OT05FIGlzIG5vdCBzZXQKQEAgLTYwNyw2ICs2MDYsNyBAQAogQ09ORklHX0JGSU5fU1BPUlQ9eQogIyBDT05GSUdfQkZJTl9USU1FUl9MQVRFTkNZIGlzIG5vdCBzZXQKICMgQ09ORklHX1ZUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFVktNRU0gaXMgbm90IHNldAogIyBDT05GSUdfU0VSSUFMX05PTlNUQU5EQVJEIGlzIG5vdCBzZXQKIAogIwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9jb25maWdzL0NNLUJGNTQ4X2RlZmNvbmZpZyBiL2FyY2gvYmxhY2tmaW4vY29uZmlncy9DTS1CRjU0OF9kZWZjb25maWcKaW5kZXggNWM0NGZkYi4uZWZkNjhiYyAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9jb25maWdzL0NNLUJGNTQ4X2RlZmNvbmZpZworKysgYi9hcmNoL2JsYWNrZmluL2NvbmZpZ3MvQ00tQkY1NDhfZGVmY29uZmlnCkBAIC00MSw3ICs0MSw3IEBACiBDT05GSUdfRkFJUl9HUk9VUF9TQ0hFRD15CiBDT05GSUdfRkFJUl9VU0VSX1NDSEVEPXkKICMgQ09ORklHX0ZBSVJfQ0dST1VQX1NDSEVEIGlzIG5vdCBzZXQKLUNPTkZJR19TWVNGU19ERVBSRUNBVEVEPXkKKyMgQ09ORklHX1NZU0ZTX0RFUFJFQ0FURUQgaXMgbm90IHNldAogIyBDT05GSUdfUkVMQVkgaXMgbm90IHNldAogQ09ORklHX0JMS19ERVZfSU5JVFJEPXkKIENPTkZJR19JTklUUkFNRlNfU09VUkNFPSIiCkBAIC01NSw3ICs1NSw3IEBACiBDT05GSUdfSE9UUExVRz15CiBDT05GSUdfUFJJTlRLPXkKIENPTkZJR19CVUc9eQotQ09ORklHX0VMRl9DT1JFPXkKKyMgQ09ORklHX0VMRl9DT1JFIGlzIG5vdCBzZXQKIENPTkZJR19CQVNFX0ZVTEw9eQogQ09ORklHX0ZVVEVYPXkKIENPTkZJR19BTk9OX0lOT0RFUz15CkBAIC0zMjUsNyArMzI1LDYgQEAKIENPTkZJR19aT05FX0RNQV9GTEFHPTEKIENPTkZJR19WSVJUX1RPX0JVUz15CiAjIENPTkZJR19CRklOX0dQVElNRVJTIGlzIG5vdCBzZXQKLUNPTkZJR19CRklOX0RNQV81WFg9eQogIyBDT05GSUdfRE1BX1VOQ0FDSEVEXzJNIGlzIG5vdCBzZXQKIENPTkZJR19ETUFfVU5DQUNIRURfMU09eQogIyBDT05GSUdfRE1BX1VOQ0FDSEVEX05PTkUgaXMgbm90IHNldApAQCAtNTQ0LDcgKzU0Myw3IEBACiBDT05GSUdfTVREX0NPTVBMRVhfTUFQUElOR1M9eQogQ09ORklHX01URF9QSFlTTUFQPXkKIENPTkZJR19NVERfUEhZU01BUF9TVEFSVD0weDIwMDAwMDAwCi1DT05GSUdfTVREX1BIWVNNQVBfTEVOPTB4ODAwMDAwCitDT05GSUdfTVREX1BIWVNNQVBfTEVOPTAKIENPTkZJR19NVERfUEhZU01BUF9CQU5LV0lEVEg9MgogIyBDT05GSUdfTVREX1VDTElOVVggaXMgbm90IHNldAogIyBDT05GSUdfTVREX1BMQVRSQU0gaXMgbm90IHNldApAQCAtNzMyLDYgKzczMSw3IEBACiAjIENPTkZJR19UV0lfTENEIGlzIG5vdCBzZXQKICMgQ09ORklHX1NJTVBMRV9HUElPIGlzIG5vdCBzZXQKICMgQ09ORklHX1ZUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFVktNRU0gaXMgbm90IHNldAogIyBDT05GSUdfU0VSSUFMX05PTlNUQU5EQVJEIGlzIG5vdCBzZXQKIAogIwpAQCAtNzgyLDcgKzc4Miw3IEBACiAjIEkyQyBIYXJkd2FyZSBCdXMgc3VwcG9ydAogIwogQ09ORklHX0kyQ19CTEFDS0ZJTl9UV0k9eQotQ09ORklHX0kyQ19CTEFDS0ZJTl9UV0lfQ0xLX0tIWj01MAorQ09ORklHX0kyQ19CTEFDS0ZJTl9UV0lfQ0xLX0tIWj0xMDAKICMgQ09ORklHX0kyQ19HUElPIGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19PQ09SRVMgaXMgbm90IHNldAogIyBDT05GSUdfSTJDX1BBUlBPUlRfTElHSFQgaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9jb25maWdzL0NNLUJGNTYxX2RlZmNvbmZpZyBiL2FyY2gvYmxhY2tmaW4vY29uZmlncy9DTS1CRjU2MV9kZWZjb25maWcKaW5kZXggMDg2ZmU1ZC4uMzQ2YmM3YSAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9jb25maWdzL0NNLUJGNTYxX2RlZmNvbmZpZworKysgYi9hcmNoL2JsYWNrZmluL2NvbmZpZ3MvQ00tQkY1NjFfZGVmY29uZmlnCkBAIC00Miw3ICs0Miw3IEBACiBDT05GSUdfRkFJUl9HUk9VUF9TQ0hFRD15CiBDT05GSUdfRkFJUl9VU0VSX1NDSEVEPXkKICMgQ09ORklHX0ZBSVJfQ0dST1VQX1NDSEVEIGlzIG5vdCBzZXQKLUNPTkZJR19TWVNGU19ERVBSRUNBVEVEPXkKKyMgQ09ORklHX1NZU0ZTX0RFUFJFQ0FURUQgaXMgbm90IHNldAogIyBDT05GSUdfUkVMQVkgaXMgbm90IHNldAogIyBDT05GSUdfQkxLX0RFVl9JTklUUkQgaXMgbm90IHNldAogIyBDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkUgaXMgbm90IHNldApAQCAtNTUsNyArNTUsNyBAQAogIyBDT05GSUdfSE9UUExVRyBpcyBub3Qgc2V0CiBDT05GSUdfUFJJTlRLPXkKIENPTkZJR19CVUc9eQotQ09ORklHX0VMRl9DT1JFPXkKKyMgQ09ORklHX0VMRl9DT1JFIGlzIG5vdCBzZXQKIENPTkZJR19CQVNFX0ZVTEw9eQogQ09ORklHX0ZVVEVYPXkKIENPTkZJR19BTk9OX0lOT0RFUz15CkBAIC0zMDAsNyArMzAwLDYgQEAKIENPTkZJR19WSVJUX1RPX0JVUz15CiBDT05GSUdfTEFSR0VfQUxMT0NTPXkKICMgQ09ORklHX0JGSU5fR1BUSU1FUlMgaXMgbm90IHNldAotQ09ORklHX0JGSU5fRE1BXzVYWD15CiAjIENPTkZJR19ETUFfVU5DQUNIRURfMk0gaXMgbm90IHNldAogQ09ORklHX0RNQV9VTkNBQ0hFRF8xTT15CiAjIENPTkZJR19ETUFfVU5DQUNIRURfTk9ORSBpcyBub3Qgc2V0CkBAIC02MTIsNiArNjExLDcgQEAKICMgQ09ORklHX0JGSU5fVElNRVJfTEFURU5DWSBpcyBub3Qgc2V0CiAjIENPTkZJR19TSU1QTEVfR1BJTyBpcyBub3Qgc2V0CiAjIENPTkZJR19WVCBpcyBub3Qgc2V0CisjIENPTkZJR19ERVZLTUVNIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFUklBTF9OT05TVEFOREFSRCBpcyBub3Qgc2V0CiAKICMKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vY29uZmlncy9IODYwNl9kZWZjb25maWcgYi9hcmNoL2JsYWNrZmluL2NvbmZpZ3MvSDg2MDZfZGVmY29uZmlnCmluZGV4IDFmYzMxZjEuLjVkMzkwMWQgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vY29uZmlncy9IODYwNl9kZWZjb25maWcKKysrIGIvYXJjaC9ibGFja2Zpbi9jb25maWdzL0g4NjA2X2RlZmNvbmZpZwpAQCAtNTQsNyArNTQsNyBAQAogQ09ORklHX0hPVFBMVUc9eQogQ09ORklHX1BSSU5USz15CiBDT05GSUdfQlVHPXkKLUNPTkZJR19FTEZfQ09SRT15CisjIENPTkZJR19FTEZfQ09SRSBpcyBub3Qgc2V0CiBDT05GSUdfQkFTRV9GVUxMPXkKIENPTkZJR19GVVRFWD15CiBDT05GSUdfQU5PTl9JTk9ERVM9eQpAQCAtMjUwLDcgKzI1MCw2IEBACiBDT05GSUdfWk9ORV9ETUFfRkxBRz0xCiBDT05GSUdfTEFSR0VfQUxMT0NTPXkKIENPTkZJR19CRklOX0dQVElNRVJTPXkKLUNPTkZJR19CRklOX0RNQV81WFg9eQogIyBDT05GSUdfRE1BX1VOQ0FDSEVEXzJNIGlzIG5vdCBzZXQKIENPTkZJR19ETUFfVU5DQUNIRURfMU09eQogIyBDT05GSUdfRE1BX1VOQ0FDSEVEX05PTkUgaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9jb25maWdzL0lQMFhfZGVmY29uZmlnIGIvYXJjaC9ibGFja2Zpbi9jb25maWdzL0lQMFhfZGVmY29uZmlnCmluZGV4IDI4NWQyMjQuLmU2NmY1ZGEgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vY29uZmlncy9JUDBYX2RlZmNvbmZpZworKysgYi9hcmNoL2JsYWNrZmluL2NvbmZpZ3MvSVAwWF9kZWZjb25maWcKQEAgLTU1LDcgKzU1LDcgQEAKICMgQ09ORklHX0hPVFBMVUcgaXMgbm90IHNldAogQ09ORklHX1BSSU5USz15CiBDT05GSUdfQlVHPXkKLUNPTkZJR19FTEZfQ09SRT15CisjIENPTkZJR19FTEZfQ09SRSBpcyBub3Qgc2V0CiBDT05GSUdfQkFTRV9GVUxMPXkKIENPTkZJR19GVVRFWD15CiBDT05GSUdfQU5PTl9JTk9ERVM9eQpAQCAtMjYyLDcgKzI2Miw2IEBACiBDT05GSUdfWk9ORV9ETUFfRkxBRz0xCiBDT05GSUdfTEFSR0VfQUxMT0NTPXkKICMgQ09ORklHX0JGSU5fR1BUSU1FUlMgaXMgbm90IHNldAotQ09ORklHX0JGSU5fRE1BXzVYWD15CiAjIENPTkZJR19ETUFfVU5DQUNIRURfMk0gaXMgbm90IHNldAogQ09ORklHX0RNQV9VTkNBQ0hFRF8xTT15CiAjIENPTkZJR19ETUFfVU5DQUNIRURfTk9ORSBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2NvbmZpZ3MvUE5BVi0xMF9kZWZjb25maWcgYi9hcmNoL2JsYWNrZmluL2NvbmZpZ3MvUE5BVi0xMF9kZWZjb25maWcKaW5kZXggYmZmY2E3ZC4uY2U1ZGRlOSAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9jb25maWdzL1BOQVYtMTBfZGVmY29uZmlnCisrKyBiL2FyY2gvYmxhY2tmaW4vY29uZmlncy9QTkFWLTEwX2RlZmNvbmZpZwpAQCAtMSw2ICsxLDYgQEAKICMKICMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKLSMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4yMi4xMgorIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjI4LXJjMgogIwogIyBDT05GSUdfTU1VIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZQVSBpcyBub3Qgc2V0CkBAIC04LDQxICs4LDM3IEBACiAjIENPTkZJR19SV1NFTV9YQ0hHQUREX0FMR09SSVRITSBpcyBub3Qgc2V0CiBDT05GSUdfQkxBQ0tGSU49eQogQ09ORklHX1pPTkVfRE1BPXkKLUNPTkZJR19TRU1BUEhPUkVfU0xFRVBFUlM9eQogQ09ORklHX0dFTkVSSUNfRklORF9ORVhUX0JJVD15CiBDT05GSUdfR0VORVJJQ19IV0VJR0hUPXkKIENPTkZJR19HRU5FUklDX0hBUkRJUlFTPXkKIENPTkZJR19HRU5FUklDX0lSUV9QUk9CRT15Ci1DT05GSUdfR0VORVJJQ19USU1FPXkKIENPTkZJR19HRU5FUklDX0dQSU89eQogQ09ORklHX0ZPUkNFX01BWF9aT05FT1JERVI9MTQKIENPTkZJR19HRU5FUklDX0NBTElCUkFURV9ERUxBWT15CiBDT05GSUdfREVGQ09ORklHX0xJU1Q9Ii9saWIvbW9kdWxlcy8kVU5BTUVfUkVMRUFTRS8uY29uZmlnIgogCiAjCi0jIENvZGUgbWF0dXJpdHkgbGV2ZWwgb3B0aW9ucworIyBHZW5lcmFsIHNldHVwCiAjCiBDT05GSUdfRVhQRVJJTUVOVEFMPXkKIENPTkZJR19CUk9LRU5fT05fU01QPXkKIENPTkZJR19JTklUX0VOVl9BUkdfTElNSVQ9MzIKLQotIwotIyBHZW5lcmFsIHNldHVwCi0jCiBDT05GSUdfTE9DQUxWRVJTSU9OPSIiCiBDT05GSUdfTE9DQUxWRVJTSU9OX0FVVE89eQogQ09ORklHX1NZU1ZJUEM9eQotIyBDT05GSUdfSVBDX05TIGlzIG5vdCBzZXQKIENPTkZJR19TWVNWSVBDX1NZU0NUTD15CiAjIENPTkZJR19QT1NJWF9NUVVFVUUgaXMgbm90IHNldAogIyBDT05GSUdfQlNEX1BST0NFU1NfQUNDVCBpcyBub3Qgc2V0CiAjIENPTkZJR19UQVNLU1RBVFMgaXMgbm90IHNldAotIyBDT05GSUdfVVRTX05TIGlzIG5vdCBzZXQKICMgQ09ORklHX0FVRElUIGlzIG5vdCBzZXQKICMgQ09ORklHX0lLQ09ORklHIGlzIG5vdCBzZXQKIENPTkZJR19MT0dfQlVGX1NISUZUPTE0Ci1DT05GSUdfU1lTRlNfREVQUkVDQVRFRD15CisjIENPTkZJR19DR1JPVVBTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dST1VQX1NDSEVEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZU0ZTX0RFUFJFQ0FURUQgaXMgbm90IHNldAorIyBDT05GSUdfU1lTRlNfREVQUkVDQVRFRF9WMiBpcyBub3Qgc2V0CiAjIENPTkZJR19SRUxBWSBpcyBub3Qgc2V0CisjIENPTkZJR19OQU1FU1BBQ0VTIGlzIG5vdCBzZXQKICMgQ09ORklHX0JMS19ERVZfSU5JVFJEIGlzIG5vdCBzZXQKICMgQ09ORklHX0NDX09QVElNSVpFX0ZPUl9TSVpFIGlzIG5vdCBzZXQKIENPTkZJR19TWVNDVEw9eQpAQCAtNTQsNDAgKzUwLDQxIEBACiBDT05GSUdfSE9UUExVRz15CiBDT05GSUdfUFJJTlRLPXkKIENPTkZJR19CVUc9eQotQ09ORklHX0VMRl9DT1JFPXkKKyMgQ09ORklHX0VMRl9DT1JFIGlzIG5vdCBzZXQKK0NPTkZJR19DT01QQVRfQlJLPXkKIENPTkZJR19CQVNFX0ZVTEw9eQogQ09ORklHX0ZVVEVYPXkKIENPTkZJR19BTk9OX0lOT0RFUz15CiBDT05GSUdfRVBPTEw9eQogQ09ORklHX1NJR05BTEZEPXkKK0NPTkZJR19USU1FUkZEPXkKIENPTkZJR19FVkVOVEZEPXkKK0NPTkZJR19BSU89eQogQ09ORklHX1ZNX0VWRU5UX0NPVU5URVJTPXkKLUNPTkZJR19CSUdfT1JERVJfQUxMT0NfTk9GQUlMX01BR0lDPTkKLSMgQ09ORklHX05QMiBpcyBub3Qgc2V0CiBDT05GSUdfU0xBQj15CiAjIENPTkZJR19TTFVCIGlzIG5vdCBzZXQKICMgQ09ORklHX1NMT0IgaXMgbm90IHNldAorIyBDT05GSUdfUFJPRklMSU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BUktFUlMgaXMgbm90IHNldAorQ09ORklHX0hBVkVfT1BST0ZJTEU9eQorIyBDT05GSUdfSEFWRV9HRU5FUklDX0RNQV9DT0hFUkVOVCBpcyBub3Qgc2V0CitDT05GSUdfU0xBQklORk89eQogQ09ORklHX1JUX01VVEVYRVM9eQogQ09ORklHX1RJTllfU0hNRU09eQogQ09ORklHX0JBU0VfU01BTEw9MAotCi0jCi0jIExvYWRhYmxlIG1vZHVsZSBzdXBwb3J0Ci0jCiBDT05GSUdfTU9EVUxFUz15CisjIENPTkZJR19NT0RVTEVfRk9SQ0VfTE9BRCBpcyBub3Qgc2V0CiBDT05GSUdfTU9EVUxFX1VOTE9BRD15CiAjIENPTkZJR19NT0RVTEVfRk9SQ0VfVU5MT0FEIGlzIG5vdCBzZXQKICMgQ09ORklHX01PRFZFUlNJT05TIGlzIG5vdCBzZXQKICMgQ09ORklHX01PRFVMRV9TUkNWRVJTSU9OX0FMTCBpcyBub3Qgc2V0CiBDT05GSUdfS01PRD15Ci0KLSMKLSMgQmxvY2sgbGF5ZXIKLSMKIENPTkZJR19CTE9DSz15CiAjIENPTkZJR19MQkQgaXMgbm90IHNldAogIyBDT05GSUdfQkxLX0RFVl9JT19UUkFDRSBpcyBub3Qgc2V0CiAjIENPTkZJR19MU0YgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9CU0cgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9JTlRFR1JJVFkgaXMgbm90IHNldAogCiAjCiAjIElPIFNjaGVkdWxlcnMKQEAgLTEwMSw5ICs5OCwxMSBAQAogIyBDT05GSUdfREVGQVVMVF9DRlEgaXMgbm90IHNldAogIyBDT05GSUdfREVGQVVMVF9OT09QIGlzIG5vdCBzZXQKIENPTkZJR19ERUZBVUxUX0lPU0NIRUQ9ImFudGljaXBhdG9yeSIKK0NPTkZJR19DTEFTU0lDX1JDVT15CiAjIENPTkZJR19QUkVFTVBUX05PTkUgaXMgbm90IHNldAogQ09ORklHX1BSRUVNUFRfVk9MVU5UQVJZPXkKICMgQ09ORklHX1BSRUVNUFQgaXMgbm90IHNldAorIyBDT05GSUdfRlJFRVpFUiBpcyBub3Qgc2V0CiAKICMKICMgQmxhY2tmaW4gUHJvY2Vzc29yIE9wdGlvbnMKQEAgLTExMiw4ICsxMTEsMTUgQEAKICMKICMgUHJvY2Vzc29yIGFuZCBCb2FyZCBTZXR0aW5ncwogIworIyBDT05GSUdfQkY1MTIgaXMgbm90IHNldAorIyBDT05GSUdfQkY1MTQgaXMgbm90IHNldAorIyBDT05GSUdfQkY1MTYgaXMgbm90IHNldAorIyBDT05GSUdfQkY1MTggaXMgbm90IHNldAogIyBDT05GSUdfQkY1MjIgaXMgbm90IHNldAorIyBDT05GSUdfQkY1MjMgaXMgbm90IHNldAorIyBDT05GSUdfQkY1MjQgaXMgbm90IHNldAogIyBDT05GSUdfQkY1MjUgaXMgbm90IHNldAorIyBDT05GSUdfQkY1MjYgaXMgbm90IHNldAogIyBDT05GSUdfQkY1MjcgaXMgbm90IHNldAogIyBDT05GSUdfQkY1MzEgaXMgbm90IHNldAogIyBDT05GSUdfQkY1MzIgaXMgbm90IHNldApAQCAtMTIxLDIyICsxMjcsMjYgQEAKICMgQ09ORklHX0JGNTM0IGlzIG5vdCBzZXQKICMgQ09ORklHX0JGNTM2IGlzIG5vdCBzZXQKIENPTkZJR19CRjUzNz15CisjIENPTkZJR19CRjUzOCBpcyBub3Qgc2V0CisjIENPTkZJR19CRjUzOSBpcyBub3Qgc2V0CiAjIENPTkZJR19CRjU0MiBpcyBub3Qgc2V0CiAjIENPTkZJR19CRjU0NCBpcyBub3Qgc2V0CiAjIENPTkZJR19CRjU0NyBpcyBub3Qgc2V0CiAjIENPTkZJR19CRjU0OCBpcyBub3Qgc2V0CiAjIENPTkZJR19CRjU0OSBpcyBub3Qgc2V0CiAjIENPTkZJR19CRjU2MSBpcyBub3Qgc2V0CitDT05GSUdfQkZfUkVWX01JTj0yCitDT05GSUdfQkZfUkVWX01BWD0zCiAjIENPTkZJR19CRl9SRVZfMF8wIGlzIG5vdCBzZXQKICMgQ09ORklHX0JGX1JFVl8wXzEgaXMgbm90IHNldAogQ09ORklHX0JGX1JFVl8wXzI9eQogIyBDT05GSUdfQkZfUkVWXzBfMyBpcyBub3Qgc2V0CiAjIENPTkZJR19CRl9SRVZfMF80IGlzIG5vdCBzZXQKICMgQ09ORklHX0JGX1JFVl8wXzUgaXMgbm90IHNldAorIyBDT05GSUdfQkZfUkVWXzBfNiBpcyBub3Qgc2V0CiAjIENPTkZJR19CRl9SRVZfQU5ZIGlzIG5vdCBzZXQKICMgQ09ORklHX0JGX1JFVl9OT05FIGlzIG5vdCBzZXQKIENPTkZJR19CRjUzeD15Ci1DT05GSUdfQkZJTl9TSU5HTEVfQ09SRT15CiBDT05GSUdfTUVNX01UNDhMQzMyTThBMl83NT15CiBDT05GSUdfSVJRX1BMTF9XQUtFVVA9NwogQ09ORklHX0lSUV9SVEM9OApAQCAtMTQ2LDI4ICsxNTYsMzAgQEAKIENPTkZJR19JUlFfU1BPUlQxX1JYPTkKIENPTkZJR19JUlFfU1BPUlQxX1RYPTkKIENPTkZJR19JUlFfVFdJPTEwCi1DT05GSUdfSVJRX1NQST0xMAogQ09ORklHX0lSUV9VQVJUMF9SWD0xMAogQ09ORklHX0lSUV9VQVJUMF9UWD0xMAogQ09ORklHX0lSUV9VQVJUMV9SWD0xMAogQ09ORklHX0lSUV9VQVJUMV9UWD0xMAogQ09ORklHX0lSUV9NQUNfUlg9MTEKIENPTkZJR19JUlFfTUFDX1RYPTExCi1DT05GSUdfSVJRX1RNUjA9MTIKLUNPTkZJR19JUlFfVE1SMT0xMgotQ09ORklHX0lSUV9UTVIyPTEyCi1DT05GSUdfSVJRX1RNUjM9MTIKLUNPTkZJR19JUlFfVE1SND0xMgotQ09ORklHX0lSUV9UTVI1PTEyCi1DT05GSUdfSVJRX1RNUjY9MTIKLUNPTkZJR19JUlFfVE1SNz0xMgorQ09ORklHX0lSUV9USU1FUjA9MTIKK0NPTkZJR19JUlFfVElNRVIxPTEyCitDT05GSUdfSVJRX1RJTUVSMj0xMgorQ09ORklHX0lSUV9USU1FUjM9MTIKK0NPTkZJR19JUlFfVElNRVI0PTEyCitDT05GSUdfSVJRX1RJTUVSNT0xMgorQ09ORklHX0lSUV9USU1FUjY9MTIKK0NPTkZJR19JUlFfVElNRVI3PTEyCiBDT05GSUdfSVJRX1BPUlRHX0lOVEI9MTIKIENPTkZJR19JUlFfTUVNX0RNQTA9MTMKIENPTkZJR19JUlFfTUVNX0RNQTE9MTMKIENPTkZJR19JUlFfV0FUQ0g9MTMKK0NPTkZJR19JUlFfU1BJPTEwCiAjIENPTkZJR19CRklONTM3X1NUQU1QIGlzIG5vdCBzZXQKICMgQ09ORklHX0JGSU41MzdfQkxVRVRFQ0hOSVhfQ00gaXMgbm90IHNldAorIyBDT05GSUdfQkZJTjUzN19CTFVFVEVDSE5JWF9UQ00gaXMgbm90IHNldAogQ09ORklHX1BOQVYxMD15CisjIENPTkZJR19DQU1TSUdfTUlOT1RBVVIgaXMgbm90IHNldAogIyBDT05GSUdfR0VORVJJQ19CRjUzN19CT0FSRCBpcyBub3Qgc2V0CiAKICMKQEAgLTE5MSw2ICsyMDMsNyBAQAogIyBCb2FyZCBjdXN0b21pemF0aW9ucwogIwogIyBDT05GSUdfQ01ETElORV9CT09MIGlzIG5vdCBzZXQKK0NPTkZJR19CT09UX0xPQUQ9MHgxMDAwCiAKICMKICMgQ2xvY2svUExMIFNldHVwCkBAIC0xOTksNyArMjEyLDcgQEAKICMgQ09ORklHX0JGSU5fS0VSTkVMX0NMT0NLIGlzIG5vdCBzZXQKIENPTkZJR19NQVhfVkNPX0haPTYwMDAwMDAwMAogQ09ORklHX01JTl9WQ09fSFo9NTAwMDAwMDAKLUNPTkZJR19NQVhfU0NMS19IWj0xMzMwMDAwMDAKK0NPTkZJR19NQVhfU0NMS19IWj0xMzMzMzMzMzMKIENPTkZJR19NSU5fU0NMS19IWj0yNzAwMDAwMAogCiAjCkBAIC0yMTAsMTMgKzIyMywxNyBAQAogIyBDT05GSUdfSFpfMzAwIGlzIG5vdCBzZXQKICMgQ09ORklHX0haXzEwMDAgaXMgbm90IHNldAogQ09ORklHX0haPTI1MAorIyBDT05GSUdfU0NIRURfSFJUSUNLIGlzIG5vdCBzZXQKK0NPTkZJR19HRU5FUklDX1RJTUU9eQorQ09ORklHX0dFTkVSSUNfQ0xPQ0tFVkVOVFM9eQorIyBDT05GSUdfQ1lDTEVTX0NMT0NLU09VUkNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX05PX0haIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hJR0hfUkVTX1RJTUVSUyBpcyBub3Qgc2V0CitDT05GSUdfR0VORVJJQ19DTE9DS0VWRU5UU19CVUlMRD15CiAKICMKLSMgTWVtb3J5IFNldHVwCisjIE1pc2MKICMKLUNPTkZJR19NQVhfTUVNX1NJWkU9NjQKLUNPTkZJR19NRU1fQUREX1dJRFRIPTEwCi1DT05GSUdfQk9PVF9MT0FEPTB4MTAwMAogQ09ORklHX0JGSU5fU0NSQVRDSF9SRUdfUkVUTj15CiAjIENPTkZJR19CRklOX1NDUkFUQ0hfUkVHX1JFVEUgaXMgbm90IHNldAogIyBDT05GSUdfQkZJTl9TQ1JBVENIX1JFR19DWUNMRVMgaXMgbm90IHNldApAQCAtMjQzLDYgKzI2MCwxMiBAQAogQ09ORklHX0NBQ0hFTElORV9BTElHTkVEX0wxPXkKIENPTkZJR19TWVNDQUxMX1RBQl9MMT15CiBDT05GSUdfQ1BMQl9TV0lUQ0hfVEFCX0wxPXkKK0NPTkZJR19BUFBfU1RBQ0tfTDE9eQorCisjCisjIFNwZWVkIE9wdGltaXphdGlvbnMKKyMKK0NPTkZJR19CRklOX0lOU19MT1dPVkVSSEVBRD15CiBDT05GSUdfUkFNS0VSTkVMPXkKICMgQ09ORklHX1JPTUtFUk5FTCBpcyBub3Qgc2V0CiBDT05GSUdfU0VMRUNUX01FTU9SWV9NT0RFTD15CkBAIC0yNTEsMTMgKzI3NCwxNCBAQAogIyBDT05GSUdfU1BBUlNFTUVNX01BTlVBTCBpcyBub3Qgc2V0CiBDT05GSUdfRkxBVE1FTT15CiBDT05GSUdfRkxBVF9OT0RFX01FTV9NQVA9eQotIyBDT05GSUdfU1BBUlNFTUVNX1NUQVRJQyBpcyBub3Qgc2V0CitDT05GSUdfUEFHRUZMQUdTX0VYVEVOREVEPXkKIENPTkZJR19TUExJVF9QVExPQ0tfQ1BVUz00CiAjIENPTkZJR19SRVNPVVJDRVNfNjRCSVQgaXMgbm90IHNldAorIyBDT05GSUdfUEhZU19BRERSX1RfNjRCSVQgaXMgbm90IHNldAogQ09ORklHX1pPTkVfRE1BX0ZMQUc9MQotQ09ORklHX0xBUkdFX0FMTE9DUz15Ci0jIENPTkZJR19CRklOX0dQVElNRVJTIGlzIG5vdCBzZXQKLUNPTkZJR19CRklOX0RNQV81WFg9eQorQ09ORklHX1ZJUlRfVE9fQlVTPXkKK0NPTkZJR19CRklOX0dQVElNRVJTPXkKKyMgQ09ORklHX0RNQV9VTkNBQ0hFRF80TSBpcyBub3Qgc2V0CiAjIENPTkZJR19ETUFfVU5DQUNIRURfMk0gaXMgbm90IHNldAogQ09ORklHX0RNQV9VTkNBQ0hFRF8xTT15CiAjIENPTkZJR19ETUFfVU5DQUNIRURfTk9ORSBpcyBub3Qgc2V0CkBAIC0yNzEsNyArMjk1LDcgQEAKICMgQ09ORklHX0JGSU5fSUNBQ0hFX0xPQ0sgaXMgbm90IHNldAogQ09ORklHX0JGSU5fV0I9eQogIyBDT05GSUdfQkZJTl9XVCBpcyBub3Qgc2V0Ci1DT05GSUdfTDFfTUFYX1BJRUNFPTE2CisjIENPTkZJR19NUFUgaXMgbm90IHNldAogCiAjCiAjIEFzeW5jaG9ub3VzIE1lbW9yeSBDb25maWd1cmF0aW9uCkBAIC0yOTksMTIgKzMyMyw3IEBACiAjCiAjIEJ1cyBvcHRpb25zIChQQ0ksIFBDTUNJQSwgRUlTQSwgTUNBLCBJU0EpCiAjCi0jIENPTkZJR19QQ0kgaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9TVVBQT1JUU19NU0kgaXMgbm90IHNldAotCi0jCi0jIFBDQ0FSRCAoUENNQ0lBL0NhcmRCdXMpIHN1cHBvcnQKLSMKICMgQ09ORklHX1BDQ0FSRCBpcyBub3Qgc2V0CiAKICMKQEAgLTMxNCwyMSArMzMzLDIwIEBACiBDT05GSUdfQklORk1UX0ZMQVQ9eQogQ09ORklHX0JJTkZNVF9aRkxBVD15CiAjIENPTkZJR19CSU5GTVRfU0hBUkVEX0ZMQVQgaXMgbm90IHNldAorIyBDT05GSUdfSEFWRV9BT1VUIGlzIG5vdCBzZXQKICMgQ09ORklHX0JJTkZNVF9NSVNDIGlzIG5vdCBzZXQKIAogIwogIyBQb3dlciBtYW5hZ2VtZW50IG9wdGlvbnMKICMKICMgQ09ORklHX1BNIGlzIG5vdCBzZXQKK0NPTkZJR19BUkNIX1NVU1BFTkRfUE9TU0lCTEU9eQorIyBDT05GSUdfUE1fV0FLRVVQX0JZX0dQSU8gaXMgbm90IHNldAogCiAjCiAjIENQVSBGcmVxdWVuY3kgc2NhbGluZwogIwogIyBDT05GSUdfQ1BVX0ZSRVEgaXMgbm90IHNldAotCi0jCi0jIE5ldHdvcmtpbmcKLSMKIENPTkZJR19ORVQ9eQogCiAjCkBAIC0zNDEsNiArMzU5LDcgQEAKICMgQ09ORklHX1hGUk1fVVNFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19YRlJNX1NVQl9QT0xJQ1kgaXMgbm90IHNldAogIyBDT05GSUdfWEZSTV9NSUdSQVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1hGUk1fU1RBVElTVElDUyBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRfS0VZIGlzIG5vdCBzZXQKIENPTkZJR19JTkVUPXkKICMgQ09ORklHX0lQX01VTFRJQ0FTVCBpcyBub3Qgc2V0CkBAIC0zNjIsNiArMzgxLDcgQEAKIENPTkZJR19JTkVUX1hGUk1fTU9ERV9UUkFOU1BPUlQ9eQogQ09ORklHX0lORVRfWEZSTV9NT0RFX1RVTk5FTD15CiBDT05GSUdfSU5FVF9YRlJNX01PREVfQkVFVD15CisjIENPTkZJR19JTkVUX0xSTyBpcyBub3Qgc2V0CiBDT05GSUdfSU5FVF9ESUFHPXkKIENPTkZJR19JTkVUX1RDUF9ESUFHPXkKICMgQ09ORklHX1RDUF9DT05HX0FEVkFOQ0VEIGlzIG5vdCBzZXQKQEAgLTM2OSw4ICszODksNiBAQAogQ09ORklHX0RFRkFVTFRfVENQX0NPTkc9ImN1YmljIgogIyBDT05GSUdfVENQX01ENVNJRyBpcyBub3Qgc2V0CiAjIENPTkZJR19JUFY2IGlzIG5vdCBzZXQKLSMgQ09ORklHX0lORVQ2X1hGUk1fVFVOTkVMIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lORVQ2X1RVTk5FTCBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRMQUJFTCBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRXT1JLX1NFQ01BUksgaXMgbm90IHNldAogIyBDT05GSUdfTkVURklMVEVSIGlzIG5vdCBzZXQKQEAgLTM3OSw2ICszOTcsNyBAQAogIyBDT05GSUdfVElQQyBpcyBub3Qgc2V0CiAjIENPTkZJR19BVE0gaXMgbm90IHNldAogIyBDT05GSUdfQlJJREdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9EU0EgaXMgbm90IHNldAogIyBDT05GSUdfVkxBTl84MDIxUSBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUNORVQgaXMgbm90IHNldAogIyBDT05GSUdfTExDMiBpcyBub3Qgc2V0CkBAIC0zODgsMTAgKzQwNyw2IEBACiAjIENPTkZJR19MQVBCIGlzIG5vdCBzZXQKICMgQ09ORklHX0VDT05FVCBpcyBub3Qgc2V0CiAjIENPTkZJR19XQU5fUk9VVEVSIGlzIG5vdCBzZXQKLQotIwotIyBRb1MgYW5kL29yIGZhaXIgcXVldWVpbmcKLSMKICMgQ09ORklHX05FVF9TQ0hFRCBpcyBub3Qgc2V0CiAKICMKQEAgLTM5OSwxOCArNDE0LDE5IEBACiAjCiAjIENPTkZJR19ORVRfUEtUR0VOIGlzIG5vdCBzZXQKICMgQ09ORklHX0hBTVJBRElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NBTiBpcyBub3Qgc2V0CiAjIENPTkZJR19JUkRBIGlzIG5vdCBzZXQKICMgQ09ORklHX0JUIGlzIG5vdCBzZXQKICMgQ09ORklHX0FGX1JYUlBDIGlzIG5vdCBzZXQKLQotIwotIyBXaXJlbGVzcwotIworIyBDT05GSUdfUEhPTkVUIGlzIG5vdCBzZXQKK0NPTkZJR19XSVJFTEVTUz15CiAjIENPTkZJR19DRkc4MDIxMSBpcyBub3Qgc2V0CitDT05GSUdfV0lSRUxFU1NfT0xEX1JFR1VMQVRPUlk9eQogIyBDT05GSUdfV0lSRUxFU1NfRVhUIGlzIG5vdCBzZXQKICMgQ09ORklHX01BQzgwMjExIGlzIG5vdCBzZXQKICMgQ09ORklHX0lFRUU4MDIxMSBpcyBub3Qgc2V0CiAjIENPTkZJR19SRktJTEwgaXMgbm90IHNldAorIyBDT05GSUdfTkVUXzlQIGlzIG5vdCBzZXQKIAogIwogIyBEZXZpY2UgRHJpdmVycwpAQCAtNDE5LDE0ICs0MzUsMTEgQEAKICMKICMgR2VuZXJpYyBEcml2ZXIgT3B0aW9ucwogIworQ09ORklHX1VFVkVOVF9IRUxQRVJfUEFUSD0iL3NiaW4vaG90cGx1ZyIKIENPTkZJR19TVEFOREFMT05FPXkKIENPTkZJR19QUkVWRU5UX0ZJUk1XQVJFX0JVSUxEPXkKICMgQ09ORklHX0ZXX0xPQURFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19TWVNfSFlQRVJWSVNPUiBpcyBub3Qgc2V0Ci0KLSMKLSMgQ29ubmVjdG9yIC0gdW5pZmllZCB1c2Vyc3BhY2UgPC0+IGtlcm5lbHNwYWNlIGxpbmtlcgotIwogIyBDT05GSUdfQ09OTkVDVE9SIGlzIG5vdCBzZXQKIENPTkZJR19NVEQ9eQogIyBDT05GSUdfTVREX0RFQlVHIGlzIG5vdCBzZXQKQEAgLTQzNCw2ICs0NDcsNyBAQAogQ09ORklHX01URF9QQVJUSVRJT05TPXkKICMgQ09ORklHX01URF9SRURCT09UX1BBUlRTIGlzIG5vdCBzZXQKICMgQ09ORklHX01URF9DTURMSU5FX1BBUlRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9BUjdfUEFSVFMgaXMgbm90IHNldAogCiAjCiAjIFVzZXIgTW9kdWxlcyBBbmQgVHJhbnNsYXRpb24gTGF5ZXJzCkBAIC00NDYsNiArNDYwLDcgQEAKICMgQ09ORklHX0lORlRMIGlzIG5vdCBzZXQKICMgQ09ORklHX1JGRF9GVEwgaXMgbm90IHNldAogIyBDT05GSUdfU1NGREMgaXMgbm90IHNldAorIyBDT05GSUdfTVREX09PUFMgaXMgbm90IHNldAogCiAjCiAjIFJBTS9ST00vRmxhc2ggY2hpcCBkcml2ZXJzCkBAIC00NzAsNyArNDg1LDcgQEAKICMgTWFwcGluZyBkcml2ZXJzIGZvciBjaGlwIGFjY2VzcwogIwogQ09ORklHX01URF9DT01QTEVYX01BUFBJTkdTPXkKLSMgQ09ORklHX01URF9CRjV4eCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfR1BJT19BRERSIGlzIG5vdCBzZXQKIENPTkZJR19NVERfVUNMSU5VWD15CiAjIENPTkZJR19NVERfUExBVFJBTSBpcyBub3Qgc2V0CiAKQEAgLTUwOSwzMyArNTI0LDIyIEBACiAjIFVCSSAtIFVuc29ydGVkIGJsb2NrIGltYWdlcwogIwogIyBDT05GSUdfTVREX1VCSSBpcyBub3Qgc2V0Ci0KLSMKLSMgUGFyYWxsZWwgcG9ydCBzdXBwb3J0Ci0jCiAjIENPTkZJR19QQVJQT1JUIGlzIG5vdCBzZXQKLQotIwotIyBQbHVnIGFuZCBQbGF5IHN1cHBvcnQKLSMKLSMgQ09ORklHX1BOUEFDUEkgaXMgbm90IHNldAotCi0jCi0jIEJsb2NrIGRldmljZXMKLSMKK0NPTkZJR19CTEtfREVWPXkKICMgQ09ORklHX0JMS19ERVZfQ09XX0NPTU1PTiBpcyBub3Qgc2V0CiAjIENPTkZJR19CTEtfREVWX0xPT1AgaXMgbm90IHNldAogIyBDT05GSUdfQkxLX0RFVl9OQkQgaXMgbm90IHNldAogQ09ORklHX0JMS19ERVZfUkFNPXkKIENPTkZJR19CTEtfREVWX1JBTV9DT1VOVD0xNgogQ09ORklHX0JMS19ERVZfUkFNX1NJWkU9NDA5NgotQ09ORklHX0JMS19ERVZfUkFNX0JMT0NLU0laRT0xMDI0CisjIENPTkZJR19CTEtfREVWX1hJUCBpcyBub3Qgc2V0CiAjIENPTkZJR19DRFJPTV9QS1RDRFZEIGlzIG5vdCBzZXQKICMgQ09ORklHX0FUQV9PVkVSX0VUSCBpcyBub3Qgc2V0Ci0KLSMKLSMgTWlzYyBkZXZpY2VzCi0jCisjIENPTkZJR19CTEtfREVWX0hEIGlzIG5vdCBzZXQKK0NPTkZJR19NSVNDX0RFVklDRVM9eQorIyBDT05GSUdfRUVQUk9NXzkzQ1g2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0VOQ0xPU1VSRV9TRVJWSUNFUyBpcyBub3Qgc2V0CitDT05GSUdfSEFWRV9JREU9eQogIyBDT05GSUdfSURFIGlzIG5vdCBzZXQKIAogIwpAQCAtNTQzLDIyICs1NDcsMTcgQEAKICMKICMgQ09ORklHX1JBSURfQVRUUlMgaXMgbm90IHNldAogIyBDT05GSUdfU0NTSSBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0RNQSBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX05FVExJTksgaXMgbm90IHNldAogIyBDT05GSUdfQVRBIGlzIG5vdCBzZXQKLQotIwotIyBNdWx0aS1kZXZpY2Ugc3VwcG9ydCAoUkFJRCBhbmQgTFZNKQotIwogIyBDT05GSUdfTUQgaXMgbm90IHNldAotCi0jCi0jIE5ldHdvcmsgZGV2aWNlIHN1cHBvcnQKLSMKIENPTkZJR19ORVRERVZJQ0VTPXkKICMgQ09ORklHX0RVTU1ZIGlzIG5vdCBzZXQKICMgQ09ORklHX0JPTkRJTkcgaXMgbm90IHNldAorIyBDT05GSUdfTUFDVkxBTiBpcyBub3Qgc2V0CiAjIENPTkZJR19FUVVBTElaRVIgaXMgbm90IHNldAogIyBDT05GSUdfVFVOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZFVEggaXMgbm90IHNldAogQ09ORklHX1BIWUxJQj15CiAKICMKQEAgLTU3Miw0NiArNTcxLDQ1IEBACiAjIENPTkZJR19WSVRFU1NFX1BIWSBpcyBub3Qgc2V0CiAjIENPTkZJR19TTVNDX1BIWSBpcyBub3Qgc2V0CiAjIENPTkZJR19CUk9BRENPTV9QSFkgaXMgbm90IHNldAorIyBDT05GSUdfSUNQTFVTX1BIWSBpcyBub3Qgc2V0CisjIENPTkZJR19SRUFMVEVLX1BIWSBpcyBub3Qgc2V0CiAjIENPTkZJR19GSVhFRF9QSFkgaXMgbm90IHNldAotCi0jCi0jIEV0aGVybmV0ICgxMCBvciAxMDBNYml0KQotIworIyBDT05GSUdfTURJT19CSVRCQU5HIGlzIG5vdCBzZXQKIENPTkZJR19ORVRfRVRIRVJORVQ9eQogQ09ORklHX01JST15Ci0jIENPTkZJR19TTUM5MVggaXMgbm90IHNldAogQ09ORklHX0JGSU5fTUFDPXkKICMgQ09ORklHX0JGSU5fTUFDX1VTRV9MMSBpcyBub3Qgc2V0CiBDT05GSUdfQkZJTl9UWF9ERVNDX05VTT0xMDAKIENPTkZJR19CRklOX1JYX0RFU0NfTlVNPTEwMAogQ09ORklHX0JGSU5fTUFDX1JNSUk9eQorIyBDT05GSUdfU01DOTFYIGlzIG5vdCBzZXQKICMgQ09ORklHX1NNU0M5MTFYIGlzIG5vdCBzZXQKICMgQ09ORklHX0RNOTAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19FTkMyOEo2MCBpcyBub3Qgc2V0CisjIENPTkZJR19JQk1fTkVXX0VNQUNfWk1JSSBpcyBub3Qgc2V0CisjIENPTkZJR19JQk1fTkVXX0VNQUNfUkdNSUkgaXMgbm90IHNldAorIyBDT05GSUdfSUJNX05FV19FTUFDX1RBSCBpcyBub3Qgc2V0CisjIENPTkZJR19JQk1fTkVXX0VNQUNfRU1BQzQgaXMgbm90IHNldAorIyBDT05GSUdfSUJNX05FV19FTUFDX05PX0ZMT1dfQ1RSTCBpcyBub3Qgc2V0CisjIENPTkZJR19JQk1fTkVXX0VNQUNfTUFMX0NMUl9JQ0lOVFNUQVQgaXMgbm90IHNldAorIyBDT05GSUdfSUJNX05FV19FTUFDX01BTF9DT01NT05fRVJSIGlzIG5vdCBzZXQKIENPTkZJR19ORVRERVZfMTAwMD15Ci1DT05GSUdfTkVUREVWXzEwMDAwPXkKICMgQ09ORklHX0FYODgxODAgaXMgbm90IHNldAorQ09ORklHX05FVERFVl8xMDAwMD15CiAKICMKICMgV2lyZWxlc3MgTEFOCiAjCiAjIENPTkZJR19XTEFOX1BSRTgwMjExIGlzIG5vdCBzZXQKICMgQ09ORklHX1dMQU5fODAyMTEgaXMgbm90IHNldAorIyBDT05GSUdfSVdMV0lGSV9MRURTIGlzIG5vdCBzZXQKICMgQ09ORklHX1dBTiBpcyBub3Qgc2V0CiAjIENPTkZJR19QUFAgaXMgbm90IHNldAogIyBDT05GSUdfU0xJUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSEFQRVIgaXMgbm90IHNldAogIyBDT05GSUdfTkVUQ09OU09MRSBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRQT0xMIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIgaXMgbm90IHNldAotCi0jCi0jIElTRE4gc3Vic3lzdGVtCi0jCiAjIENPTkZJR19JU0ROIGlzIG5vdCBzZXQKLQotIwotIyBUZWxlcGhvbnkgU3VwcG9ydAotIwogIyBDT05GSUdfUEhPTkUgaXMgbm90IHNldAogCiAjCkBAIC02MjYsOSArNjI0LDYgQEAKICMKICMgQ09ORklHX0lOUFVUX01PVVNFREVWIGlzIG5vdCBzZXQKICMgQ09ORklHX0lOUFVUX0pPWURFViBpcyBub3Qgc2V0Ci1DT05GSUdfSU5QVVRfVFNERVY9eQotQ09ORklHX0lOUFVUX1RTREVWX1NDUkVFTl9YPTI0MAotQ09ORklHX0lOUFVUX1RTREVWX1NDUkVFTl9ZPTMyMAogQ09ORklHX0lOUFVUX0VWREVWPXkKICMgQ09ORklHX0lOUFVUX0VWQlVHIGlzIG5vdCBzZXQKIApAQCAtNjQyLDI0ICs2MzcsMjkgQEAKIENPTkZJR19JTlBVVF9UT1VDSFNDUkVFTj15CiAjIENPTkZJR19UT1VDSFNDUkVFTl9BRFM3ODQ2IGlzIG5vdCBzZXQKIENPTkZJR19UT1VDSFNDUkVFTl9BRDc4Nzc9eQorIyBDT05GSUdfVE9VQ0hTQ1JFRU5fQUQ3ODc5X0kyQyBpcyBub3Qgc2V0CisjIENPTkZJR19UT1VDSFNDUkVFTl9BRDc4NzlfU1BJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RPVUNIU0NSRUVOX0FENzg3OSBpcyBub3Qgc2V0CisjIENPTkZJR19UT1VDSFNDUkVFTl9GVUpJVFNVIGlzIG5vdCBzZXQKICMgQ09ORklHX1RPVUNIU0NSRUVOX0dVTlpFIGlzIG5vdCBzZXQKICMgQ09ORklHX1RPVUNIU0NSRUVOX0VMTyBpcyBub3Qgc2V0CiAjIENPTkZJR19UT1VDSFNDUkVFTl9NVE9VQ0ggaXMgbm90IHNldAorIyBDT05GSUdfVE9VQ0hTQ1JFRU5fSU5FWElPIGlzIG5vdCBzZXQKICMgQ09ORklHX1RPVUNIU0NSRUVOX01LNzEyIGlzIG5vdCBzZXQKICMgQ09ORklHX1RPVUNIU0NSRUVOX1BFTk1PVU5UIGlzIG5vdCBzZXQKICMgQ09ORklHX1RPVUNIU0NSRUVOX1RPVUNIUklHSFQgaXMgbm90IHNldAogIyBDT05GSUdfVE9VQ0hTQ1JFRU5fVE9VQ0hXSU4gaXMgbm90IHNldAotIyBDT05GSUdfVE9VQ0hTQ1JFRU5fVUNCMTQwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19UT1VDSFNDUkVFTl9VU0JfQ09NUE9TSVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RPVUNIU0NSRUVOX1RPVUNISVQyMTMgaXMgbm90IHNldAogQ09ORklHX0lOUFVUX01JU0M9eQogIyBDT05GSUdfSU5QVVRfQVRJX1JFTU9URSBpcyBub3Qgc2V0CiAjIENPTkZJR19JTlBVVF9BVElfUkVNT1RFMiBpcyBub3Qgc2V0CiAjIENPTkZJR19JTlBVVF9LRVlTUEFOX1JFTU9URSBpcyBub3Qgc2V0CiAjIENPTkZJR19JTlBVVF9QT1dFUk1BVEUgaXMgbm90IHNldAogIyBDT05GSUdfSU5QVVRfWUVBTElOSyBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9DTTEwOSBpcyBub3Qgc2V0CiBDT05GSUdfSU5QVVRfVUlOUFVUPXkKLSMgQ09ORklHX0JGNTNYX1BGQlVUVE9OUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19UV0lfS0VZUEFEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NPTkZJR19JTlBVVF9QQ0Y4NTc0IGlzIG5vdCBzZXQKIAogIwogIyBIYXJkd2FyZSBJL08gcG9ydHMKQEAgLTY3MiwxOCArNjcyLDE3IEBACiAjCiAjIENPTkZJR19BRDk5NjAgaXMgbm90IHNldAogIyBDT05GSUdfU1BJX0FEQ19CRjUzMyBpcyBub3Qgc2V0Ci0jIENPTkZJR19CRjV4eF9QRkxBR1MgaXMgbm90IHNldAogIyBDT05GSUdfQkY1eHhfUFBJRkNEIGlzIG5vdCBzZXQKICMgQ09ORklHX0JGSU5fU0lNUExFX1RJTUVSIGlzIG5vdCBzZXQKICMgQ09ORklHX0JGNXh4X1BQSSBpcyBub3Qgc2V0CiBDT05GSUdfQkZJTl9TUE9SVD15CiAjIENPTkZJR19CRklOX1RJTUVSX0xBVEVOQ1kgaXMgbm90IHNldAogQ09ORklHX1RXSV9MQ0Q9bQotQ09ORklHX1RXSV9MQ0RfU0xBVkVfQUREUj0zNAotIyBDT05GSUdfQUQ1MzA0IGlzIG5vdCBzZXQKLSMgQ09ORklHX0JGNXh4X1RFQTU3NjQgaXMgbm90IHNldAotIyBDT05GSUdfQkY1eHhfRkJETUEgaXMgbm90IHNldAorQ09ORklHX0JGSU5fRE1BX0lOVEVSRkFDRT1tCisjIENPTkZJR19TSU1QTEVfR1BJTyBpcyBub3Qgc2V0CiAjIENPTkZJR19WVCBpcyBub3Qgc2V0CitDT05GSUdfREVWS01FTT15CisjIENPTkZJR19CRklOX0pUQUdfQ09NTSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRVJJQUxfTk9OU1RBTkRBUkQgaXMgbm90IHNldAogCiAjCkBAIC03MTYsNjggKzcxNSw1OSBAQAogIwogIyBsaW51eCBlbWJlZGRlZCBkcml2ZXJzCiAjCi0jIENPTkZJR19DQU5fTUNGNTI4MiBpcyBub3Qgc2V0Ci0jIENPTkZJR19DQU5fVU5DVFdJTkNBTiBpcyBub3Qgc2V0CiBDT05GSUdfQ0FOX0JMQUNLRklOPW0KLQotIwotIyBJUE1JCi0jCiAjIENPTkZJR19JUE1JX0hBTkRMRVIgaXMgbm90IHNldAotIyBDT05GSUdfV0FUQ0hET0cgaXMgbm90IHNldAogQ09ORklHX0hXX1JBTkRPTT15Ci0jIENPTkZJR19HRU5fUlRDIGlzIG5vdCBzZXQKICMgQ09ORklHX1IzOTY0IGlzIG5vdCBzZXQKICMgQ09ORklHX1JBV19EUklWRVIgaXMgbm90IHNldAotCi0jCi0jIFRQTSBkZXZpY2VzCi0jCiAjIENPTkZJR19UQ0dfVFBNIGlzIG5vdCBzZXQKIENPTkZJR19JMkM9eQogQ09ORklHX0kyQ19CT0FSRElORk89eQogQ09ORklHX0kyQ19DSEFSREVWPXkKLQotIwotIyBJMkMgQWxnb3JpdGhtcwotIwotIyBDT05GSUdfSTJDX0FMR09CSVQgaXMgbm90IHNldAotIyBDT05GSUdfSTJDX0FMR09QQ0YgaXMgbm90IHNldAotIyBDT05GSUdfSTJDX0FMR09QQ0EgaXMgbm90IHNldAorQ09ORklHX0kyQ19IRUxQRVJfQVVUTz15CiAKICMKICMgSTJDIEhhcmR3YXJlIEJ1cyBzdXBwb3J0CiAjCi0jIENPTkZJR19JMkNfQkxBQ0tGSU5fR1BJTyBpcyBub3Qgc2V0CisKKyMKKyMgSTJDIHN5c3RlbSBidXMgZHJpdmVycyAobW9zdGx5IGVtYmVkZGVkIC8gc3lzdGVtLW9uLWNoaXApCisjCiBDT05GSUdfSTJDX0JMQUNLRklOX1RXST15Ci1DT05GSUdfSTJDX0JMQUNLRklOX1RXSV9DTEtfS0haPTUwCitDT05GSUdfSTJDX0JMQUNLRklOX1RXSV9DTEtfS0haPTEwMAogIyBDT05GSUdfSTJDX0dQSU8gaXMgbm90IHNldAogIyBDT05GSUdfSTJDX09DT1JFUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19JMkNfUEFSUE9SVF9MSUdIVCBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfU0lNVEVDIGlzIG5vdCBzZXQKKworIworIyBFeHRlcm5hbCBJMkMvU01CdXMgYWRhcHRlciBkcml2ZXJzCisjCisjIENPTkZJR19JMkNfUEFSUE9SVF9MSUdIVCBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfVEFPU19FVk0gaXMgbm90IHNldAorCisjCisjIE90aGVyIEkyQy9TTUJ1cyBidXMgZHJpdmVycworIworIyBDT05GSUdfSTJDX1BDQV9QTEFURk9STSBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfU1RVQiBpcyBub3Qgc2V0CiAKICMKICMgTWlzY2VsbGFuZW91cyBJMkMgQ2hpcCBzdXBwb3J0CiAjCi0jIENPTkZJR19TRU5TT1JTX0RTMTMzNyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX0RTMTM3NCBpcyBub3Qgc2V0CisjIENPTkZJR19EUzE2ODIgaXMgbm90IHNldAorIyBDT05GSUdfQVQyNCBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0FENTI1MiBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0VFUFJPTSBpcyBub3Qgc2V0CiBDT05GSUdfU0VOU09SU19QQ0Y4NTc0PW0KLUNPTkZJR19TRU5TT1JTX1BDRjg1NzU9eQotIyBDT05GSUdfU0VOU09SU19QQ0E5NTQzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BDRjg1NzUgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19QQ0E5NTM5IGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfUENGODU5MSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX01BWDY4NzUgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19UU0wyNTUwIGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19ERUJVR19DT1JFIGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19ERUJVR19BTEdPIGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19ERUJVR19CVVMgaXMgbm90IHNldAogIyBDT05GSUdfSTJDX0RFQlVHX0NISVAgaXMgbm90IHNldAotCi0jCi0jIFNQSSBzdXBwb3J0Ci0jCiBDT05GSUdfU1BJPXkKIENPTkZJR19TUElfTUFTVEVSPXkKIApAQCAtNzg1LDYgKzc3NSw3IEBACiAjIFNQSSBNYXN0ZXIgQ29udHJvbGxlciBEcml2ZXJzCiAjCiBDT05GSUdfU1BJX0JGSU49eQorIyBDT05GSUdfU1BJX0JGSU5fTE9DSyBpcyBub3Qgc2V0CiAjIENPTkZJR19TUElfQklUQkFORyBpcyBub3Qgc2V0CiAKICMKQEAgLTc5MiwyNyArNzgzLDI5IEBACiAjCiAjIENPTkZJR19TUElfQVQyNSBpcyBub3Qgc2V0CiAjIENPTkZJR19TUElfU1BJREVWIGlzIG5vdCBzZXQKLQotIwotIyBEYWxsYXMncyAxLXdpcmUgYnVzCi0jCisjIENPTkZJR19TUElfVExFNjJYMCBpcyBub3Qgc2V0CitDT05GSUdfQVJDSF9XQU5UX09QVElPTkFMX0dQSU9MSUI9eQorIyBDT05GSUdfR1BJT0xJQiBpcyBub3Qgc2V0CiAjIENPTkZJR19XMSBpcyBub3Qgc2V0CisjIENPTkZJR19QT1dFUl9TVVBQTFkgaXMgbm90IHNldAogQ09ORklHX0hXTU9OPXkKICMgQ09ORklHX0hXTU9OX1ZJRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX0FCSVRVR1VSVSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FENzQxNCBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0FENzQxOCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FEQ1hYIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfQURNMTAyMSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0FETTEwMjUgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19BRE0xMDI2IGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfQURNMTAyOSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0FETTEwMzEgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19BRE05MjQwIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfQVNCMTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQURUNzQ3MCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FEVDc0NzMgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19BVFhQMSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0RTMTYyMSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0Y3MTgwNUYgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19GU0NIRVIgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19GU0NQT1MgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19GNzE4ODJGRyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0Y3NTM3NVMgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19HTDUxOFNNIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfR0w1MjBTTSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0lUODcgaXMgbm90IHNldApAQCAtODI3LDU4ICs4MjAsNzYgQEAKICMgQ09ORklHX1NFTlNPUlNfTE04NyBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0xNOTAgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19MTTkyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE05MyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX01BWDExMTEgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19NQVgxNjE5IGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfTUFYNjY1MCBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1BDODczNjAgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19QQzg3NDI3IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfRE1FMTczNyBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1NNU0M0N00xIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfU01TQzQ3TTE5MiBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1NNU0M0N0IzOTcgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRFM3ODI4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVEhNQzUwIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfVlQxMjExIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfVzgzNzgxRCBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1c4Mzc5MUQgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19XODM3OTJEIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfVzgzNzkzIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfVzgzTDc4NVRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVzgzTDc4Nk5HIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfVzgzNjI3SEYgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19XODM2MjdFSEYgaXMgbm90IHNldAogIyBDT05GSUdfSFdNT05fREVCVUdfQ0hJUCBpcyBub3Qgc2V0CisjIENPTkZJR19USEVSTUFMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RIRVJNQUxfSFdNT04gaXMgbm90IHNldAorIyBDT05GSUdfV0FUQ0hET0cgaXMgbm90IHNldAogCiAjCiAjIE11bHRpZnVuY3Rpb24gZGV2aWNlIGRyaXZlcnMKICMKKyMgQ09ORklHX01GRF9DT1JFIGlzIG5vdCBzZXQKICMgQ09ORklHX01GRF9TTTUwMSBpcyBub3Qgc2V0CisjIENPTkZJR19IVENfUEFTSUMzIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9UTUlPIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9XTTg0MDAgaXMgbm90IHNldAorIyBDT05GSUdfTUZEX1dNODM1MF9JMkMgaXMgbm90IHNldAogCiAjCiAjIE11bHRpbWVkaWEgZGV2aWNlcwogIworCisjCisjIE11bHRpbWVkaWEgY29yZSBzdXBwb3J0CisjCiAjIENPTkZJR19WSURFT19ERVYgaXMgbm90IHNldAogIyBDT05GSUdfRFZCX0NPUkUgaXMgbm90IHNldAorIyBDT05GSUdfVklERU9fTUVESUEgaXMgbm90IHNldAorCisjCisjIE11bHRpbWVkaWEgZHJpdmVycworIwogQ09ORklHX0RBQj15CiAKICMKICMgR3JhcGhpY3Mgc3VwcG9ydAogIwotQ09ORklHX0JBQ0tMSUdIVF9MQ0RfU1VQUE9SVD15Ci1DT05GSUdfQkFDS0xJR0hUX0NMQVNTX0RFVklDRT15Ci1DT05GSUdfTENEX0NMQVNTX0RFVklDRT15Ci0KLSMKLSMgRGlzcGxheSBkZXZpY2Ugc3VwcG9ydAotIwotIyBDT05GSUdfRElTUExBWV9TVVBQT1JUIGlzIG5vdCBzZXQKICMgQ09ORklHX1ZHQVNUQVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZJREVPX09VVFBVVF9DT05UUk9MIGlzIG5vdCBzZXQKIENPTkZJR19GQj15CiBDT05GSUdfRklSTVdBUkVfRURJRD15CiAjIENPTkZJR19GQl9EREMgaXMgbm90IHNldAorIyBDT05GSUdfRkJfQk9PVF9WRVNBX1NVUFBPUlQgaXMgbm90IHNldAogQ09ORklHX0ZCX0NGQl9GSUxMUkVDVD15CiBDT05GSUdfRkJfQ0ZCX0NPUFlBUkVBPXkKIENPTkZJR19GQl9DRkJfSU1BR0VCTElUPXkKKyMgQ09ORklHX0ZCX0NGQl9SRVZfUElYRUxTX0lOX0JZVEUgaXMgbm90IHNldAogIyBDT05GSUdfRkJfU1lTX0ZJTExSRUNUIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZCX1NZU19DT1BZQVJFQSBpcyBub3Qgc2V0CiAjIENPTkZJR19GQl9TWVNfSU1BR0VCTElUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX0ZPUkVJR05fRU5ESUFOIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZCX1NZU19GT1BTIGlzIG5vdCBzZXQKLUNPTkZJR19GQl9ERUZFUlJFRF9JTz15CiAjIENPTkZJR19GQl9TVkdBTElCIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZCX01BQ01PREVTIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZCX0JBQ0tMSUdIVCBpcyBub3Qgc2V0CkBAIC04ODgsMjUgKzg5OSwzNCBAQAogIwogIyBGcmFtZSBidWZmZXIgaGFyZHdhcmUgZHJpdmVycwogIwotIyBDT05GSUdfRkJfQkZJTl83MTcxIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZCX0JGSU5fNzM5MyBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9CRklOX1QzNTBNQ1FCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX0JGSU5fTFEwMzVRMSBpcyBub3Qgc2V0CiBDT05GSUdfRkJfQkY1MzdfTFEwMzU9eQogQ09ORklHX0xRMDM1X1NMQVZFX0FERFI9MHg1OAogQ09ORklHX0ZCX0JGSU5fTEFORFNDQVBFPXkKICMgQ09ORklHX0ZCX0JGSU5fQkdSIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZCX0JGSU5fVDM1ME1DUUIgaXMgbm90IHNldAorIyBDT05GSUdfRkJfQkZJTl83MzkzIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX0hJVEFDSElfVFgwOSBpcyBub3Qgc2V0CiAjIENPTkZJR19GQl9TMUQxM1hYWCBpcyBub3Qgc2V0CiAjIENPTkZJR19GQl9WSVJUVUFMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX01FVFJPTk9NRSBpcyBub3Qgc2V0CitDT05GSUdfQkFDS0xJR0hUX0xDRF9TVVBQT1JUPXkKK0NPTkZJR19MQ0RfQ0xBU1NfREVWSUNFPXkKKyMgQ09ORklHX0xDRF9MVFYzNTBRViBpcyBub3Qgc2V0CisjIENPTkZJR19MQ0RfSUxJOTMyMCBpcyBub3Qgc2V0CisjIENPTkZJR19MQ0RfVERPMjRNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xDRF9WR0cyNDMyQTQgaXMgbm90IHNldAorIyBDT05GSUdfTENEX1BMQVRGT1JNIGlzIG5vdCBzZXQKK0NPTkZJR19CQUNLTElHSFRfQ0xBU1NfREVWSUNFPXkKKyMgQ09ORklHX0JBQ0tMSUdIVF9DT1JHSSBpcyBub3Qgc2V0CisKKyMKKyMgRGlzcGxheSBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfRElTUExBWV9TVVBQT1JUIGlzIG5vdCBzZXQKICMgQ09ORklHX0xPR08gaXMgbm90IHNldAotCi0jCi0jIFNvdW5kCi0jCiBDT05GSUdfU09VTkQ9eQotCi0jCi0jIEFkdmFuY2VkIExpbnV4IFNvdW5kIEFyY2hpdGVjdHVyZQotIworQ09ORklHX1NPVU5EX09TU19DT1JFPXkKIENPTkZJR19TTkQ9bQogIyBDT05GSUdfU05EX1NFUVVFTkNFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19TTkRfTUlYRVJfT1NTIGlzIG5vdCBzZXQKQEAgLTkxNiw0NiArOTM2LDMwIEBACiAjIENPTkZJR19TTkRfVkVSQk9TRV9QUk9DRlMgaXMgbm90IHNldAogIyBDT05GSUdfU05EX1ZFUkJPU0VfUFJJTlRLIGlzIG5vdCBzZXQKICMgQ09ORklHX1NORF9ERUJVRyBpcyBub3Qgc2V0Ci0KLSMKLSMgR2VuZXJpYyBkZXZpY2VzCi0jCitDT05GSUdfU05EX0RSSVZFUlM9eQogIyBDT05GSUdfU05EX0RVTU1ZIGlzIG5vdCBzZXQKICMgQ09ORklHX1NORF9NVFBBViBpcyBub3Qgc2V0CiAjIENPTkZJR19TTkRfU0VSSUFMX1UxNjU1MCBpcyBub3Qgc2V0CiAjIENPTkZJR19TTkRfTVBVNDAxIGlzIG5vdCBzZXQKK0NPTkZJR19TTkRfU1BJPXkKIAogIwogIyBBTFNBIEJsYWNrZmluIGRldmljZXMKICMKICMgQ09ORklHX1NORF9CTEFDS0ZJTl9BRDE4MzYgaXMgbm90IHNldAotIyBDT05GSUdfU05EX0JGSU5fQUQ3MzMxMSBpcyBub3Qgc2V0Ci0KLSMKLSMgU3lzdGVtIG9uIENoaXAgYXVkaW8gc3VwcG9ydAotIworIyBDT05GSUdfU05EX0JGSU5fQUQ3MzMyMiBpcyBub3Qgc2V0CiAjIENPTkZJR19TTkRfU09DIGlzIG5vdCBzZXQKLQotIwotIyBPcGVuIFNvdW5kIFN5c3RlbQotIwogQ09ORklHX1NPVU5EX1BSSU1FPXkKLSMgQ09ORklHX09TU19PQlNPTEVURSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TT1VORF9NU05EQ0xBUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TT1VORF9NU05EUElOIGlzIG5vdCBzZXQKLQotIwotIyBISUQgRGV2aWNlcwotIworQ09ORklHX0hJRF9TVVBQT1JUPXkKICMgQ09ORklHX0hJRCBpcyBub3Qgc2V0Ci0KLSMKLSMgVVNCIHN1cHBvcnQKLSMKKyMgQ09ORklHX0hJRF9QSUQgaXMgbm90IHNldAorQ09ORklHX1VTQl9TVVBQT1JUPXkKIENPTkZJR19VU0JfQVJDSF9IQVNfSENEPXkKICMgQ09ORklHX1VTQl9BUkNIX0hBU19PSENJIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9BUkNIX0hBU19FSENJIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfT1RHX1dISVRFTElTVCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfT1RHX0JMQUNLTElTVF9IVUIgaXMgbm90IHNldAogCiAjCiAjIEVuYWJsZSBIb3N0IG9yIEdhZGdldCBzdXBwb3J0IHRvIHNlZSBJbnZlbnRyYSBvcHRpb25zCkBAIC05NjQsMzcgKzk2OCwxMSBAQAogIwogIyBOT1RFOiBVU0JfU1RPUkFHRSBlbmFibGVzIFNDU0ksIGFuZCAnU0NTSSBkaXNrIHN1cHBvcnQnCiAjCi0KLSMKLSMgVVNCIEdhZGdldCBTdXBwb3J0Ci0jCiAjIENPTkZJR19VU0JfR0FER0VUIGlzIG5vdCBzZXQKICMgQ09ORklHX01NQyBpcyBub3Qgc2V0Ci0KLSMKLSMgTEVEIGRldmljZXMKLSMKKyMgQ09ORklHX01FTVNUSUNLIGlzIG5vdCBzZXQKICMgQ09ORklHX05FV19MRURTIGlzIG5vdCBzZXQKLQotIwotIyBMRUQgZHJpdmVycwotIwotCi0jCi0jIExFRCBUcmlnZ2VycwotIwotCi0jCi0jIEluZmluaUJhbmQgc3VwcG9ydAotIwotCi0jCi0jIEVEQUMgLSBlcnJvciBkZXRlY3Rpb24gYW5kIHJlcG9ydGluZyAoUkFTKSAoRVhQRVJJTUVOVEFMKQotIwotCi0jCi0jIFJlYWwgVGltZSBDbG9jawotIworIyBDT05GSUdfQUNDRVNTSUJJTElUWSBpcyBub3Qgc2V0CiBDT05GSUdfUlRDX0xJQj15CiBDT05GSUdfUlRDX0NMQVNTPXkKIENPTkZJR19SVENfSENUT1NZUz15CkBAIC0xMDE0LDYgKzk5Miw3IEBACiAjIEkyQyBSVEMgZHJpdmVycwogIwogIyBDT05GSUdfUlRDX0RSVl9EUzEzMDcgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9EUzEzNzQgaXMgbm90IHNldAogIyBDT05GSUdfUlRDX0RSVl9EUzE2NzIgaXMgbm90IHNldAogIyBDT05GSUdfUlRDX0RSVl9NQVg2OTAwIGlzIG5vdCBzZXQKICMgQ09ORklHX1JUQ19EUlZfUlM1QzM3MiBpcyBub3Qgc2V0CkBAIC0xMDIxLDQzICsxMDAwLDQxIEBACiAjIENPTkZJR19SVENfRFJWX1gxMjA1IGlzIG5vdCBzZXQKICMgQ09ORklHX1JUQ19EUlZfUENGODU2MyBpcyBub3Qgc2V0CiAjIENPTkZJR19SVENfRFJWX1BDRjg1ODMgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9NNDFUODAgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9TMzUzOTBBIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfRk0zMTMwIGlzIG5vdCBzZXQKIAogIwogIyBTUEkgUlRDIGRyaXZlcnMKICMKLSMgQ09ORklHX1JUQ19EUlZfUlM1QzM0OCBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX000MVQ5NCBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX0RTMTMwNSBpcyBub3Qgc2V0CiAjIENPTkZJR19SVENfRFJWX01BWDY5MDIgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9SOTcwMSBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX1JTNUMzNDggaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9EUzMyMzQgaXMgbm90IHNldAogCiAjCiAjIFBsYXRmb3JtIFJUQyBkcml2ZXJzCiAjCisjIENPTkZJR19SVENfRFJWX0RTMTI4NiBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX0RTMTUxMSBpcyBub3Qgc2V0CiAjIENPTkZJR19SVENfRFJWX0RTMTU1MyBpcyBub3Qgc2V0CiAjIENPTkZJR19SVENfRFJWX0RTMTc0MiBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX1NUSzE3VEE4IGlzIG5vdCBzZXQKICMgQ09ORklHX1JUQ19EUlZfTTQ4VDg2IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfTTQ4VDM1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfTTQ4VDU5IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfQlE0ODAyIGlzIG5vdCBzZXQKICMgQ09ORklHX1JUQ19EUlZfVjMwMjAgaXMgbm90IHNldAogCiAjCiAjIG9uLUNQVSBSVEMgZHJpdmVycwogIwogQ09ORklHX1JUQ19EUlZfQkZJTj15Ci0KLSMKLSMgRE1BIEVuZ2luZSBzdXBwb3J0Ci0jCi0jIENPTkZJR19ETUFfRU5HSU5FIGlzIG5vdCBzZXQKLQotIwotIyBETUEgQ2xpZW50cwotIwotCi0jCi0jIERNQSBEZXZpY2VzCi0jCi0KLSMKLSMgUEJYIHN1cHBvcnQKLSMKLSMgQ09ORklHX1BCWCBpcyBub3Qgc2V0CisjIENPTkZJR19ETUFERVZJQ0VTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VJTyBpcyBub3Qgc2V0CisjIENPTkZJR19TVEFHSU5HIGlzIG5vdCBzZXQKIAogIwogIyBGaWxlIHN5c3RlbXMKQEAgLTEwNjcsMjAgKzEwNDQsMTggQEAKICMgQ09ORklHX0VYVDJfRlNfUE9TSVhfQUNMIGlzIG5vdCBzZXQKICMgQ09ORklHX0VYVDJfRlNfU0VDVVJJVFkgaXMgbm90IHNldAogIyBDT05GSUdfRVhUM19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19FWFQ0REVWX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYVDRfRlMgaXMgbm90IHNldAogQ09ORklHX0ZTX01CQ0FDSEU9eQogIyBDT05GSUdfUkVJU0VSRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfSkZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0CitDT05GSUdfRklMRV9MT0NLSU5HPXkKICMgQ09ORklHX1hGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19HRlMyX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX09DRlMyX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX01JTklYX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1JPTUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ROT1RJRlkgaXMgbm90IHNldAogQ09ORklHX0lOT1RJRlk9eQogQ09ORklHX0lOT1RJRllfVVNFUj15CiAjIENPTkZJR19RVU9UQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19ETk9USUZZIGlzIG5vdCBzZXQKICMgQ09ORklHX0FVVE9GU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19BVVRPRlM0X0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZVU0VfRlMgaXMgbm90IHNldApAQCAtMTEwNiw3ICsxMDgxLDYgQEAKIENPTkZJR19TWVNGUz15CiAjIENPTkZJR19UTVBGUyBpcyBub3Qgc2V0CiAjIENPTkZJR19IVUdFVExCX1BBR0UgaXMgbm90IHNldAotQ09ORklHX1JBTUZTPXkKICMgQ09ORklHX0NPTkZJR0ZTX0ZTIGlzIG5vdCBzZXQKIAogIwpAQCAtMTEyMSwzNiArMTA5NSwzNSBAQAogIyBDT05GSUdfRUZTX0ZTIGlzIG5vdCBzZXQKIENPTkZJR19ZQUZGU19GUz15CiBDT05GSUdfWUFGRlNfWUFGRlMxPXkKKyMgQ09ORklHX1lBRkZTXzlCWVRFX1RBR1MgaXMgbm90IHNldAogIyBDT05GSUdfWUFGRlNfRE9FU19FQ0MgaXMgbm90IHNldAogQ09ORklHX1lBRkZTX1lBRkZTMj15CiBDT05GSUdfWUFGRlNfQVVUT19ZQUZGUzI9eQogIyBDT05GSUdfWUFGRlNfRElTQUJMRV9MQVpZX0xPQUQgaXMgbm90IHNldAotQ09ORklHX1lBRkZTX0NIRUNLUE9JTlRfUkVTRVJWRURfQkxPQ0tTPTEwCiAjIENPTkZJR19ZQUZGU19ESVNBQkxFX1dJREVfVE5PREVTIGlzIG5vdCBzZXQKICMgQ09ORklHX1lBRkZTX0FMV0FZU19DSEVDS19DSFVOS19FUkFTRUQgaXMgbm90IHNldAogQ09ORklHX1lBRkZTX1NIT1JUX05BTUVTX0lOX1JBTT15CiAjIENPTkZJR19KRkZTMl9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19DUkFNRlMgaXMgbm90IHNldAogIyBDT05GSUdfVlhGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19NSU5JWF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19PTUZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0hQRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfUU5YNEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JPTUZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1NZU1ZfRlMgaXMgbm90IHNldAogIyBDT05GSUdfVUZTX0ZTIGlzIG5vdCBzZXQKLQotIwotIyBOZXR3b3JrIEZpbGUgU3lzdGVtcwotIworQ09ORklHX05FVFdPUktfRklMRVNZU1RFTVM9eQogQ09ORklHX05GU19GUz1tCiBDT05GSUdfTkZTX1YzPXkKICMgQ09ORklHX05GU19WM19BQ0wgaXMgbm90IHNldAogIyBDT05GSUdfTkZTX1Y0IGlzIG5vdCBzZXQKLSMgQ09ORklHX05GU19ESVJFQ1RJTyBpcyBub3Qgc2V0CiAjIENPTkZJR19ORlNEIGlzIG5vdCBzZXQKIENPTkZJR19MT0NLRD1tCiBDT05GSUdfTE9DS0RfVjQ9eQogQ09ORklHX05GU19DT01NT049eQogQ09ORklHX1NVTlJQQz1tCi0jIENPTkZJR19TVU5SUENfQklORDM0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NVTlJQQ19SRUdJU1RFUl9WNCBpcyBub3Qgc2V0CiAjIENPTkZJR19SUENTRUNfR1NTX0tSQjUgaXMgbm90IHNldAogIyBDT05GSUdfUlBDU0VDX0dTU19TUEtNMyBpcyBub3Qgc2V0CiBDT05GSUdfU01CX0ZTPW0KQEAgLTExNTksMTcgKzExMzIsMTIgQEAKICMgQ09ORklHX05DUF9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19DT0RBX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0FGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR185UF9GUyBpcyBub3Qgc2V0CiAKICMKICMgUGFydGl0aW9uIFR5cGVzCiAjCiAjIENPTkZJR19QQVJUSVRJT05fQURWQU5DRUQgaXMgbm90IHNldAogQ09ORklHX01TRE9TX1BBUlRJVElPTj15Ci0KLSMKLSMgTmF0aXZlIExhbmd1YWdlIFN1cHBvcnQKLSMKIENPTkZJR19OTFM9bQogQ09ORklHX05MU19ERUZBVUxUPSJpc284ODU5LTEiCiAjIENPTkZJR19OTFNfQ09ERVBBR0VfNDM3IGlzIG5vdCBzZXQKQEAgLTEyMTAsMjkgKzExNzgsMzAgQEAKICMgQ09ORklHX05MU19LT0k4X1IgaXMgbm90IHNldAogIyBDT05GSUdfTkxTX0tPSThfVSBpcyBub3Qgc2V0CiAjIENPTkZJR19OTFNfVVRGOCBpcyBub3Qgc2V0Ci0KLSMKLSMgRGlzdHJpYnV0ZWQgTG9jayBNYW5hZ2VyCi0jCiAjIENPTkZJR19ETE0gaXMgbm90IHNldAogCiAjCi0jIFByb2ZpbGluZyBzdXBwb3J0Ci0jCi0jIENPTkZJR19QUk9GSUxJTkcgaXMgbm90IHNldAotCi0jCiAjIEtlcm5lbCBoYWNraW5nCiAjCiAjIENPTkZJR19QUklOVEtfVElNRSBpcyBub3Qgc2V0CitDT05GSUdfRU5BQkxFX1dBUk5fREVQUkVDQVRFRD15CiBDT05GSUdfRU5BQkxFX01VU1RfQ0hFQ0s9eQorQ09ORklHX0ZSQU1FX1dBUk49MTAyNAogIyBDT05GSUdfTUFHSUNfU1lTUlEgaXMgbm90IHNldAogIyBDT05GSUdfVU5VU0VEX1NZTUJPTFMgaXMgbm90IHNldAogIyBDT05GSUdfREVCVUdfRlMgaXMgbm90IHNldAogIyBDT05GSUdfSEVBREVSU19DSEVDSyBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19LRVJORUwgaXMgbm90IHNldAogIyBDT05GSUdfREVCVUdfQlVHVkVSQk9TRSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19NRU1PUllfSU5JVCBpcyBub3Qgc2V0CisjIENPTkZJR19SQ1VfQ1BVX1NUQUxMX0RFVEVDVE9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZU0NUTF9TWVNDQUxMX0NIRUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RZTkFNSUNfUFJJTlRLX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBTVBMRVMgaXMgbm90IHNldAorQ09ORklHX0hBVkVfQVJDSF9LR0RCPXkKK0NPTkZJR19ERUJVR19WRVJCT1NFPXkKICMgQ09ORklHX0RFQlVHX01NUlMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfRE9VQkxFRkFVTFQgaXMgbm90IHNldAogIyBDT05GSUdfREVCVUdfSFVOVF9GT1JfWkVSTyBpcyBub3Qgc2V0CiBDT05GSUdfREVCVUdfQkZJTl9IV1RSQUNFX09OPXkKIENPTkZJR19ERUJVR19CRklOX0hXVFJBQ0VfQ09NUFJFU1NJT05fT0ZGPXkKQEAgLTEyNTAsMTMgKzEyMTksOTQgQEAKICMKICMgQ09ORklHX0tFWVMgaXMgbm90IHNldAogQ09ORklHX1NFQ1VSSVRZPXkKKyMgQ09ORklHX1NFQ1VSSVRZRlMgaXMgbm90IHNldAogIyBDT05GSUdfU0VDVVJJVFlfTkVUV09SSyBpcyBub3Qgc2V0Ci1DT05GSUdfU0VDVVJJVFlfQ0FQQUJJTElUSUVTPXkKKyMgQ09ORklHX1NFQ1VSSVRZX0ZJTEVfQ0FQQUJJTElUSUVTIGlzIG5vdCBzZXQKK0NPTkZJR19TRUNVUklUWV9ERUZBVUxUX01NQVBfTUlOX0FERFI9MAorQ09ORklHX0NSWVBUTz15CiAKICMKLSMgQ3J5cHRvZ3JhcGhpYyBvcHRpb25zCisjIENyeXB0byBjb3JlIG9yIGhlbHBlcgogIwotIyBDT05GSUdfQ1JZUFRPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19GSVBTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19NQU5BR0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19HRjEyOE1VTCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fTlVMTCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQ1JZUFREIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19BVVRIRU5DIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19URVNUIGlzIG5vdCBzZXQKKworIworIyBBdXRoZW50aWNhdGVkIEVuY3J5cHRpb24gd2l0aCBBc3NvY2lhdGVkIERhdGEKKyMKKyMgQ09ORklHX0NSWVBUT19DQ00gaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0dDTSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0VRSVYgaXMgbm90IHNldAorCisjCisjIEJsb2NrIG1vZGVzCisjCisjIENPTkZJR19DUllQVE9fQ0JDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19DVFIgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0NUUyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fRUNCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19MUlcgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1BDQkMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1hUUyBpcyBub3Qgc2V0CisKKyMKKyMgSGFzaCBtb2RlcworIworIyBDT05GSUdfQ1JZUFRPX0hNQUMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1hDQkMgaXMgbm90IHNldAorCisjCisjIERpZ2VzdAorIworIyBDT05GSUdfQ1JZUFRPX0NSQzMyQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fTUQ0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19NRDUgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX01JQ0hBRUxfTUlDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19STUQxMjggaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1JNRDE2MCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fUk1EMjU2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19STUQzMjAgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1NIQTEgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1NIQTI1NiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0hBNTEyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19UR1IxOTIgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1dQNTEyIGlzIG5vdCBzZXQKKworIworIyBDaXBoZXJzCisjCisjIENPTkZJR19DUllQVE9fQUVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19BTlVCSVMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0FSQzQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0JMT1dGSVNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19DQU1FTExJQSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQ0FTVDUgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0NBU1Q2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19ERVMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0ZDUllQVCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fS0hBWkFEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TQUxTQTIwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TRUVEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TRVJQRU5UIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19URUEgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1RXT0ZJU0ggaXMgbm90IHNldAorCisjCisjIENvbXByZXNzaW9uCisjCisjIENPTkZJR19DUllQVE9fREVGTEFURSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fTFpPIGlzIG5vdCBzZXQKKworIworIyBSYW5kb20gTnVtYmVyIEdlbmVyYXRpb24KKyMKKyMgQ09ORklHX0NSWVBUT19BTlNJX0NQUk5HIGlzIG5vdCBzZXQKK0NPTkZJR19DUllQVE9fSFc9eQogCiAjCiAjIExpYnJhcnkgcm91dGluZXMKQEAgLTEyNjQsOCArMTMxNCwxMCBAQAogQ09ORklHX0JJVFJFVkVSU0U9eQogQ09ORklHX0NSQ19DQ0lUVD1tCiAjIENPTkZJR19DUkMxNiBpcyBub3Qgc2V0CisjIENPTkZJR19DUkNfVDEwRElGIGlzIG5vdCBzZXQKICMgQ09ORklHX0NSQ19JVFVfVCBpcyBub3Qgc2V0CiBDT05GSUdfQ1JDMzI9eQorIyBDT05GSUdfQ1JDNyBpcyBub3Qgc2V0CiAjIENPTkZJR19MSUJDUkMzMkMgaXMgbm90IHNldAogQ09ORklHX1pMSUJfSU5GTEFURT15CiBDT05GSUdfUExJU1Q9eQpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9jb25maWdzL1NSVjFfZGVmY29uZmlnIGIvYXJjaC9ibGFja2Zpbi9jb25maWdzL1NSVjFfZGVmY29uZmlnCmluZGV4IGIxMzA5ZjguLjdjODI1MGQgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vY29uZmlncy9TUlYxX2RlZmNvbmZpZworKysgYi9hcmNoL2JsYWNrZmluL2NvbmZpZ3MvU1JWMV9kZWZjb25maWcKQEAgLTU5LDcgKzU5LDcgQEAKIENPTkZJR19IT1RQTFVHPXkKIENPTkZJR19QUklOVEs9eQogQ09ORklHX0JVRz15Ci1DT05GSUdfRUxGX0NPUkU9eQorIyBDT05GSUdfRUxGX0NPUkUgaXMgbm90IHNldAogQ09ORklHX0JBU0VfRlVMTD15CiBDT05GSUdfRlVURVg9eQogQ09ORklHX0FOT05fSU5PREVTPXkKQEAgLTE3MiwxNCArMTcyLDE0IEBACiBDT05GSUdfSVJRX1VBUlQxX1RYPTEwCiBDT05GSUdfSVJRX01BQ19SWD0xMQogQ09ORklHX0lSUV9NQUNfVFg9MTEKLUNPTkZJR19JUlFfVE1SMD0xMgotQ09ORklHX0lSUV9UTVIxPTEyCi1DT05GSUdfSVJRX1RNUjI9MTIKLUNPTkZJR19JUlFfVE1SMz0xMgotQ09ORklHX0lSUV9UTVI0PTEyCi1DT05GSUdfSVJRX1RNUjU9MTIKLUNPTkZJR19JUlFfVE1SNj0xMgotQ09ORklHX0lSUV9UTVI3PTEyCitDT05GSUdfSVJRX1RJTUVSMD0xMgorQ09ORklHX0lSUV9USU1FUjE9MTIKK0NPTkZJR19JUlFfVElNRVIyPTEyCitDT05GSUdfSVJRX1RJTUVSMz0xMgorQ09ORklHX0lSUV9USU1FUjQ9MTIKK0NPTkZJR19JUlFfVElNRVI1PTEyCitDT05GSUdfSVJRX1RJTUVSNj0xMgorQ09ORklHX0lSUV9USU1FUjc9MTIKIENPTkZJR19JUlFfUE9SVEdfSU5UQj0xMgogQ09ORklHX0lSUV9NRU1fRE1BMD0xMwogQ09ORklHX0lSUV9NRU1fRE1BMT0xMwpAQCAtMjcxLDcgKzI3MSw2IEBACiAjIENPTkZJR19SRVNPVVJDRVNfNjRCSVQgaXMgbm90IHNldAogQ09ORklHX1pPTkVfRE1BX0ZMQUc9MQogQ09ORklHX0xBUkdFX0FMTE9DUz15Ci1DT05GSUdfQkZJTl9ETUFfNVhYPXkKIENPTkZJR19ETUFfVU5DQUNIRURfMk09eQogIyBDT05GSUdfRE1BX1VOQ0FDSEVEXzFNIGlzIG5vdCBzZXQKICMgQ09ORklHX0RNQV9VTkNBQ0hFRF9OT05FIGlzIG5vdCBzZXQKQEAgLTc4Niw3ICs3ODUsNyBAQAogIwogIyBDT05GSUdfSTJDX0JMQUNLRklOX0dQSU8gaXMgbm90IHNldAogQ09ORklHX0kyQ19CTEFDS0ZJTl9UV0k9eQotQ09ORklHX0kyQ19CTEFDS0ZJTl9UV0lfQ0xLX0tIWj01MAorQ09ORklHX0kyQ19CTEFDS0ZJTl9UV0lfQ0xLX0tIWj0xMDAKICMgQ09ORklHX0kyQ19HUElPIGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19PQ09SRVMgaXMgbm90IHNldAogIyBDT05GSUdfSTJDX1BBUlBPUlRfTElHSFQgaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9jb25maWdzL1RDTS1CRjUzN19kZWZjb25maWcgYi9hcmNoL2JsYWNrZmluL2NvbmZpZ3MvVENNLUJGNTM3X2RlZmNvbmZpZwppbmRleCBjNDgyZWUxLi45YWY1MjJjIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2NvbmZpZ3MvVENNLUJGNTM3X2RlZmNvbmZpZworKysgYi9hcmNoL2JsYWNrZmluL2NvbmZpZ3MvVENNLUJGNTM3X2RlZmNvbmZpZwpAQCAtMSw3ICsxLDcgQEAKICMKICMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKLSMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4yNC43Ci0jIFRodSBKdWwgMzEgMDA6NTM6MTUgMjAwOAorIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjI4LXJjMgorIyBUdWUgSmFuICA2IDA5OjIyOjE3IDIwMDkKICMKICMgQ09ORklHX01NVSBpcyBub3Qgc2V0CiAjIENPTkZJR19GUFUgaXMgbm90IHNldApAQCAtOSw3ICs5LDYgQEAKICMgQ09ORklHX1JXU0VNX1hDSEdBRERfQUxHT1JJVEhNIGlzIG5vdCBzZXQKIENPTkZJR19CTEFDS0ZJTj15CiBDT05GSUdfWk9ORV9ETUE9eQotQ09ORklHX1NFTUFQSE9SRV9TTEVFUEVSUz15CiBDT05GSUdfR0VORVJJQ19GSU5EX05FWFRfQklUPXkKIENPTkZJR19HRU5FUklDX0hXRUlHSFQ9eQogQ09ORklHX0dFTkVSSUNfSEFSRElSUVM9eQpAQCAtMzAsMTcgKzI5LDE0IEBACiBDT05GSUdfU1lTVklQQz15CiBDT05GSUdfU1lTVklQQ19TWVNDVEw9eQogIyBDT05GSUdfQlNEX1BST0NFU1NfQUNDVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0VSX05TIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BJRF9OUyBpcyBub3Qgc2V0CiBDT05GSUdfSUtDT05GSUc9eQogQ09ORklHX0lLQ09ORklHX1BST0M9eQogQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKICMgQ09ORklHX0NHUk9VUFMgaXMgbm90IHNldAotQ09ORklHX0ZBSVJfR1JPVVBfU0NIRUQ9eQotQ09ORklHX0ZBSVJfVVNFUl9TQ0hFRD15Ci0jIENPTkZJR19GQUlSX0NHUk9VUF9TQ0hFRCBpcyBub3Qgc2V0Ci1DT05GSUdfU1lTRlNfREVQUkVDQVRFRD15CisjIENPTkZJR19HUk9VUF9TQ0hFRCBpcyBub3Qgc2V0CisjIENPTkZJR19TWVNGU19ERVBSRUNBVEVEX1YyIGlzIG5vdCBzZXQKICMgQ09ORklHX1JFTEFZIGlzIG5vdCBzZXQKKyMgQ09ORklHX05BTUVTUEFDRVMgaXMgbm90IHNldAogIyBDT05GSUdfQkxLX0RFVl9JTklUUkQgaXMgbm90IHNldAogIyBDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkUgaXMgbm90IHNldAogQ09ORklHX1NZU0NUTD15CkBAIC01MiwyMiArNDgsMzAgQEAKICMgQ09ORklHX0hPVFBMVUcgaXMgbm90IHNldAogQ09ORklHX1BSSU5USz15CiBDT05GSUdfQlVHPXkKLUNPTkZJR19FTEZfQ09SRT15CisjIENPTkZJR19FTEZfQ09SRSBpcyBub3Qgc2V0CitDT05GSUdfQ09NUEFUX0JSSz15CiBDT05GSUdfQkFTRV9GVUxMPXkKIENPTkZJR19GVVRFWD15CiBDT05GSUdfQU5PTl9JTk9ERVM9eQogQ09ORklHX0VQT0xMPXkKIENPTkZJR19TSUdOQUxGRD15CitDT05GSUdfVElNRVJGRD15CiBDT05GSUdfRVZFTlRGRD15CitDT05GSUdfQUlPPXkKIENPTkZJR19WTV9FVkVOVF9DT1VOVEVSUz15CiBDT05GSUdfU0xBQj15CiAjIENPTkZJR19TTFVCIGlzIG5vdCBzZXQKICMgQ09ORklHX1NMT0IgaXMgbm90IHNldAorIyBDT05GSUdfUFJPRklMSU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BUktFUlMgaXMgbm90IHNldAorQ09ORklHX0hBVkVfT1BST0ZJTEU9eQorIyBDT05GSUdfSEFWRV9HRU5FUklDX0RNQV9DT0hFUkVOVCBpcyBub3Qgc2V0CiBDT05GSUdfU0xBQklORk89eQogQ09ORklHX1JUX01VVEVYRVM9eQogQ09ORklHX1RJTllfU0hNRU09eQogQ09ORklHX0JBU0VfU01BTEw9MAogQ09ORklHX01PRFVMRVM9eQorIyBDT05GSUdfTU9EVUxFX0ZPUkNFX0xPQUQgaXMgbm90IHNldAogQ09ORklHX01PRFVMRV9VTkxPQUQ9eQogIyBDT05GSUdfTU9EVUxFX0ZPUkNFX1VOTE9BRCBpcyBub3Qgc2V0CiAjIENPTkZJR19NT0RWRVJTSU9OUyBpcyBub3Qgc2V0CkBAIC03OCw2ICs4Miw3IEBACiAjIENPTkZJR19CTEtfREVWX0lPX1RSQUNFIGlzIG5vdCBzZXQKICMgQ09ORklHX0xTRiBpcyBub3Qgc2V0CiAjIENPTkZJR19CTEtfREVWX0JTRyBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0lOVEVHUklUWSBpcyBub3Qgc2V0CiAKICMKICMgSU8gU2NoZWR1bGVycwpAQCAtOTEsOSArOTYsMTEgQEAKICMgQ09ORklHX0RFRkFVTFRfQ0ZRIGlzIG5vdCBzZXQKIENPTkZJR19ERUZBVUxUX05PT1A9eQogQ09ORklHX0RFRkFVTFRfSU9TQ0hFRD0ibm9vcCIKK0NPTkZJR19DTEFTU0lDX1JDVT15CiBDT05GSUdfUFJFRU1QVF9OT05FPXkKICMgQ09ORklHX1BSRUVNUFRfVk9MVU5UQVJZIGlzIG5vdCBzZXQKICMgQ09ORklHX1BSRUVNUFQgaXMgbm90IHNldAorIyBDT05GSUdfRlJFRVpFUiBpcyBub3Qgc2V0CiAKICMKICMgQmxhY2tmaW4gUHJvY2Vzc29yIE9wdGlvbnMKQEAgLTEwMiw2ICsxMDksMTAgQEAKICMKICMgUHJvY2Vzc29yIGFuZCBCb2FyZCBTZXR0aW5ncwogIworIyBDT05GSUdfQkY1MTIgaXMgbm90IHNldAorIyBDT05GSUdfQkY1MTQgaXMgbm90IHNldAorIyBDT05GSUdfQkY1MTYgaXMgbm90IHNldAorIyBDT05GSUdfQkY1MTggaXMgbm90IHNldAogIyBDT05GSUdfQkY1MjIgaXMgbm90IHNldAogIyBDT05GSUdfQkY1MjMgaXMgbm90IHNldAogIyBDT05GSUdfQkY1MjQgaXMgbm90IHNldApAQCAtMTE0LDE4ICsxMjUsMjMgQEAKICMgQ09ORklHX0JGNTM0IGlzIG5vdCBzZXQKICMgQ09ORklHX0JGNTM2IGlzIG5vdCBzZXQKIENPTkZJR19CRjUzNz15CisjIENPTkZJR19CRjUzOCBpcyBub3Qgc2V0CisjIENPTkZJR19CRjUzOSBpcyBub3Qgc2V0CiAjIENPTkZJR19CRjU0MiBpcyBub3Qgc2V0CiAjIENPTkZJR19CRjU0NCBpcyBub3Qgc2V0CiAjIENPTkZJR19CRjU0NyBpcyBub3Qgc2V0CiAjIENPTkZJR19CRjU0OCBpcyBub3Qgc2V0CiAjIENPTkZJR19CRjU0OSBpcyBub3Qgc2V0CiAjIENPTkZJR19CRjU2MSBpcyBub3Qgc2V0CitDT05GSUdfQkZfUkVWX01JTj0yCitDT05GSUdfQkZfUkVWX01BWD0zCiAjIENPTkZJR19CRl9SRVZfMF8wIGlzIG5vdCBzZXQKICMgQ09ORklHX0JGX1JFVl8wXzEgaXMgbm90IHNldAogQ09ORklHX0JGX1JFVl8wXzI9eQogIyBDT05GSUdfQkZfUkVWXzBfMyBpcyBub3Qgc2V0CiAjIENPTkZJR19CRl9SRVZfMF80IGlzIG5vdCBzZXQKICMgQ09ORklHX0JGX1JFVl8wXzUgaXMgbm90IHNldAorIyBDT05GSUdfQkZfUkVWXzBfNiBpcyBub3Qgc2V0CiAjIENPTkZJR19CRl9SRVZfQU5ZIGlzIG5vdCBzZXQKICMgQ09ORklHX0JGX1JFVl9OT05FIGlzIG5vdCBzZXQKIENPTkZJR19CRjUzeD15CkBAIC0xMzcsMjUgKzE1MywyNSBAQAogQ09ORklHX0lSUV9TUE9SVDFfUlg9OQogQ09ORklHX0lSUV9TUE9SVDFfVFg9OQogQ09ORklHX0lSUV9UV0k9MTAKLUNPTkZJR19JUlFfU1BJPTEwCiBDT05GSUdfSVJRX1VBUlQwX1JYPTEwCiBDT05GSUdfSVJRX1VBUlQwX1RYPTEwCiBDT05GSUdfSVJRX1VBUlQxX1JYPTEwCiBDT05GSUdfSVJRX1VBUlQxX1RYPTEwCiBDT05GSUdfSVJRX01BQ19SWD0xMQogQ09ORklHX0lSUV9NQUNfVFg9MTEKLUNPTkZJR19JUlFfVE1SMD0xMgotQ09ORklHX0lSUV9UTVIxPTEyCi1DT05GSUdfSVJRX1RNUjI9MTIKLUNPTkZJR19JUlFfVE1SMz0xMgotQ09ORklHX0lSUV9UTVI0PTEyCi1DT05GSUdfSVJRX1RNUjU9MTIKLUNPTkZJR19JUlFfVE1SNj0xMgotQ09ORklHX0lSUV9UTVI3PTEyCitDT05GSUdfSVJRX1RJTUVSMD0xMgorQ09ORklHX0lSUV9USU1FUjE9MTIKK0NPTkZJR19JUlFfVElNRVIyPTEyCitDT05GSUdfSVJRX1RJTUVSMz0xMgorQ09ORklHX0lSUV9USU1FUjQ9MTIKK0NPTkZJR19JUlFfVElNRVI1PTEyCitDT05GSUdfSVJRX1RJTUVSNj0xMgorQ09ORklHX0lSUV9USU1FUjc9MTIKIENPTkZJR19JUlFfUE9SVEdfSU5UQj0xMgogQ09ORklHX0lSUV9NRU1fRE1BMD0xMwogQ09ORklHX0lSUV9NRU1fRE1BMT0xMwogQ09ORklHX0lSUV9XQVRDSD0xMworQ09ORklHX0lSUV9TUEk9MTAKICMgQ09ORklHX0JGSU41MzdfU1RBTVAgaXMgbm90IHNldAogIyBDT05GSUdfQkZJTjUzN19CTFVFVEVDSE5JWF9DTSBpcyBub3Qgc2V0CiBDT05GSUdfQkZJTjUzN19CTFVFVEVDSE5JWF9UQ009eQpAQCAtMTkxLDcgKzIwNyw2IEBACiAjCiBDT05GSUdfQ0xLSU5fSFo9MjUwMDAwMDAKICMgQ09ORklHX0JGSU5fS0VSTkVMX0NMT0NLIGlzIG5vdCBzZXQKLUNPTkZJR19NQVhfTUVNX1NJWkU9MzIKIENPTkZJR19NQVhfVkNPX0haPTYwMDAwMDAwMAogQ09ORklHX01JTl9WQ09fSFo9NTAwMDAwMDAKIENPTkZJR19NQVhfU0NMS19IWj0xMzMzMzMzMzMKQEAgLTIwNSwxMCArMjIwLDEwIEBACiAjIENPTkZJR19IWl8zMDAgaXMgbm90IHNldAogIyBDT05GSUdfSFpfMTAwMCBpcyBub3Qgc2V0CiBDT05GSUdfSFo9MjUwCisjIENPTkZJR19TQ0hFRF9IUlRJQ0sgaXMgbm90IHNldAogQ09ORklHX0dFTkVSSUNfVElNRT15CiBDT05GSUdfR0VORVJJQ19DTE9DS0VWRU5UUz15CiAjIENPTkZJR19DWUNMRVNfQ0xPQ0tTT1VSQ0UgaXMgbm90IHNldAotIyBDT05GSUdfVElDS19PTkVTSE9UIGlzIG5vdCBzZXQKICMgQ09ORklHX05PX0haIGlzIG5vdCBzZXQKICMgQ09ORklHX0hJR0hfUkVTX1RJTUVSUyBpcyBub3Qgc2V0CiBDT05GSUdfR0VORVJJQ19DTE9DS0VWRU5UU19CVUlMRD15CkBAIC0yNDIsNiArMjU3LDEyIEBACiBDT05GSUdfQ0FDSEVMSU5FX0FMSUdORURfTDE9eQogQ09ORklHX1NZU0NBTExfVEFCX0wxPXkKIENPTkZJR19DUExCX1NXSVRDSF9UQUJfTDE9eQorQ09ORklHX0FQUF9TVEFDS19MMT15CisKKyMKKyMgU3BlZWQgT3B0aW1pemF0aW9ucworIworQ09ORklHX0JGSU5fSU5TX0xPV09WRVJIRUFEPXkKIENPTkZJR19SQU1LRVJORUw9eQogIyBDT05GSUdfUk9NS0VSTkVMIGlzIG5vdCBzZXQKIENPTkZJR19TRUxFQ1RfTUVNT1JZX01PREVMPXkKQEAgLTI1MCwxNCArMjcxLDEzIEBACiAjIENPTkZJR19TUEFSU0VNRU1fTUFOVUFMIGlzIG5vdCBzZXQKIENPTkZJR19GTEFUTUVNPXkKIENPTkZJR19GTEFUX05PREVfTUVNX01BUD15Ci0jIENPTkZJR19TUEFSU0VNRU1fU1RBVElDIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NQQVJTRU1FTV9WTUVNTUFQX0VOQUJMRSBpcyBub3Qgc2V0CitDT05GSUdfUEFHRUZMQUdTX0VYVEVOREVEPXkKIENPTkZJR19TUExJVF9QVExPQ0tfQ1BVUz00CiAjIENPTkZJR19SRVNPVVJDRVNfNjRCSVQgaXMgbm90IHNldAorIyBDT05GSUdfUEhZU19BRERSX1RfNjRCSVQgaXMgbm90IHNldAogQ09ORklHX1pPTkVfRE1BX0ZMQUc9MQogQ09ORklHX1ZJUlRfVE9fQlVTPXkKICMgQ09ORklHX0JGSU5fR1BUSU1FUlMgaXMgbm90IHNldAotQ09ORklHX0JGSU5fRE1BXzVYWD15CiAjIENPTkZJR19ETUFfVU5DQUNIRURfNE0gaXMgbm90IHNldAogIyBDT05GSUdfRE1BX1VOQ0FDSEVEXzJNIGlzIG5vdCBzZXQKIENPTkZJR19ETUFfVU5DQUNIRURfMU09eQpAQCAtMzAwLDcgKzMyMCw2IEBACiAjCiAjIEJ1cyBvcHRpb25zIChQQ0ksIFBDTUNJQSwgRUlTQSwgTUNBLCBJU0EpCiAjCi0jIENPTkZJR19QQ0kgaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9TVVBQT1JUU19NU0kgaXMgbm90IHNldAogCiAjCkBAIC0zMTAsMjMgKzMyOSwyMCBAQAogQ09ORklHX0JJTkZNVF9GTEFUPXkKIENPTkZJR19CSU5GTVRfWkZMQVQ9eQogQ09ORklHX0JJTkZNVF9TSEFSRURfRkxBVD15CisjIENPTkZJR19IQVZFX0FPVVQgaXMgbm90IHNldAogIyBDT05GSUdfQklORk1UX01JU0MgaXMgbm90IHNldAogCiAjCiAjIFBvd2VyIG1hbmFnZW1lbnQgb3B0aW9ucwogIwogIyBDT05GSUdfUE0gaXMgbm90IHNldAotQ09ORklHX1NVU1BFTkRfVVBfUE9TU0lCTEU9eQorQ09ORklHX0FSQ0hfU1VTUEVORF9QT1NTSUJMRT15CiAjIENPTkZJR19QTV9XQUtFVVBfQllfR1BJTyBpcyBub3Qgc2V0CiAKICMKICMgQ1BVIEZyZXF1ZW5jeSBzY2FsaW5nCiAjCiAjIENPTkZJR19DUFVfRlJFUSBpcyBub3Qgc2V0Ci0KLSMKLSMgTmV0d29ya2luZwotIwogIyBDT05GSUdfTkVUIGlzIG5vdCBzZXQKIAogIwpAQCAtMzQ1LDYgKzM2MSw3IEBACiBDT05GSUdfTVREX1BBUlRJVElPTlM9eQogIyBDT05GSUdfTVREX1JFREJPT1RfUEFSVFMgaXMgbm90IHNldAogIyBDT05GSUdfTVREX0NNRExJTkVfUEFSVFMgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0FSN19QQVJUUyBpcyBub3Qgc2V0CiAKICMKICMgVXNlciBNb2R1bGVzIEFuZCBUcmFuc2xhdGlvbiBMYXllcnMKQEAgLTM2Miw4ICszNzksMTAgQEAKICMKICMgUkFNL1JPTS9GbGFzaCBjaGlwIGRyaXZlcnMKICMKLSMgQ09ORklHX01URF9DRkkgaXMgbm90IHNldAorQ09ORklHX01URF9DRkk9eQogIyBDT05GSUdfTVREX0pFREVDUFJPQkUgaXMgbm90IHNldAorQ09ORklHX01URF9HRU5fUFJPQkU9eQorIyBDT05GSUdfTVREX0NGSV9BRFZfT1BUSU9OUyBpcyBub3Qgc2V0CiBDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzE9eQogQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8yPXkKIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfND15CkBAIC0zNzQsNiArMzkzLDEwIEBACiBDT05GSUdfTVREX0NGSV9JMj15CiAjIENPTkZJR19NVERfQ0ZJX0k0IGlzIG5vdCBzZXQKICMgQ09ORklHX01URF9DRklfSTggaXMgbm90IHNldAorQ09ORklHX01URF9DRklfSU5URUxFWFQ9eQorIyBDT05GSUdfTVREX0NGSV9BTURTVEQgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0NGSV9TVEFBIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfQ0ZJX1VUSUw9eQogQ09ORklHX01URF9SQU09eQogIyBDT05GSUdfTVREX1JPTSBpcyBub3Qgc2V0CiAjIENPTkZJR19NVERfQUJTRU5UIGlzIG5vdCBzZXQKQEAgLTM4MSw4ICs0MDQsOSBAQAogIwogIyBNYXBwaW5nIGRyaXZlcnMgZm9yIGNoaXAgYWNjZXNzCiAjCi0jIENPTkZJR19NVERfQ09NUExFWF9NQVBQSU5HUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19NVERfR1BJT19BRERSIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfQ09NUExFWF9NQVBQSU5HUz15CisjIENPTkZJR19NVERfUEhZU01BUCBpcyBub3Qgc2V0CitDT05GSUdfTVREX0dQSU9fQUREUj15CiBDT05GSUdfTVREX1VDTElOVVg9eQogIyBDT05GSUdfTVREX1BMQVRSQU0gaXMgbm90IHNldAogCkBAIC00MTYsMTAgKzQ0MCwxMyBAQAogQ09ORklHX0JMS19ERVZfUkFNPXkKIENPTkZJR19CTEtfREVWX1JBTV9DT1VOVD0xNgogQ09ORklHX0JMS19ERVZfUkFNX1NJWkU9NDA5NgotQ09ORklHX0JMS19ERVZfUkFNX0JMT0NLU0laRT0xMDI0CisjIENPTkZJR19CTEtfREVWX1hJUCBpcyBub3Qgc2V0CiAjIENPTkZJR19DRFJPTV9QS1RDRFZEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSEQgaXMgbm90IHNldAogQ09ORklHX01JU0NfREVWSUNFUz15CiAjIENPTkZJR19FRVBST01fOTNDWDYgaXMgbm90IHNldAorIyBDT05GSUdfRU5DTE9TVVJFX1NFUlZJQ0VTIGlzIG5vdCBzZXQKK0NPTkZJR19IQVZFX0lERT15CiAjIENPTkZJR19JREUgaXMgbm90IHNldAogCiAjCkBAIC00NTQsOCArNDgxLDExIEBACiAjIENPTkZJR19CRjV4eF9QUEkgaXMgbm90IHNldAogQ09ORklHX0JGSU5fU1BPUlQ9eQogIyBDT05GSUdfQkZJTl9USU1FUl9MQVRFTkNZIGlzIG5vdCBzZXQKK0NPTkZJR19CRklOX0RNQV9JTlRFUkZBQ0U9bQogIyBDT05GSUdfU0lNUExFX0dQSU8gaXMgbm90IHNldAogIyBDT05GSUdfVlQgaXMgbm90IHNldAorIyBDT05GSUdfREVWS01FTSBpcyBub3Qgc2V0CisjIENPTkZJR19CRklOX0pUQUdfQ09NTSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRVJJQUxfTk9OU1RBTkRBUkQgaXMgbm90IHNldAogCiAjCkBAIC00ODYsMTUgKzUxNiwxMCBAQAogIyBDT05GSUdfQ0FONExJTlVYIGlzIG5vdCBzZXQKICMgQ09ORklHX0lQTUlfSEFORExFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19IV19SQU5ET00gaXMgbm90IHNldAotIyBDT05GSUdfR0VOX1JUQyBpcyBub3Qgc2V0CiAjIENPTkZJR19SMzk2NCBpcyBub3Qgc2V0CiAjIENPTkZJR19SQVdfRFJJVkVSIGlzIG5vdCBzZXQKICMgQ09ORklHX1RDR19UUE0gaXMgbm90IHNldAogIyBDT05GSUdfSTJDIGlzIG5vdCBzZXQKLQotIwotIyBTUEkgc3VwcG9ydAotIwogQ09ORklHX1NQST15CiBDT05GSUdfU1BJX01BU1RFUj15CiAKQEAgLTUwMiw2ICs1MjcsNyBAQAogIyBTUEkgTWFzdGVyIENvbnRyb2xsZXIgRHJpdmVycwogIwogQ09ORklHX1NQSV9CRklOPXkKKyMgQ09ORklHX1NQSV9CRklOX0xPQ0sgaXMgbm90IHNldAogIyBDT05GSUdfU1BJX0JJVEJBTkcgaXMgbm90IHNldAogCiAjCkBAIC01MTAsOSArNTM2LDEzIEBACiAjIENPTkZJR19TUElfQVQyNSBpcyBub3Qgc2V0CiAjIENPTkZJR19TUElfU1BJREVWIGlzIG5vdCBzZXQKICMgQ09ORklHX1NQSV9UTEU2MlgwIGlzIG5vdCBzZXQKK0NPTkZJR19BUkNIX1dBTlRfT1BUSU9OQUxfR1BJT0xJQj15CisjIENPTkZJR19HUElPTElCIGlzIG5vdCBzZXQKICMgQ09ORklHX1cxIGlzIG5vdCBzZXQKICMgQ09ORklHX1BPV0VSX1NVUFBMWSBpcyBub3Qgc2V0CiAjIENPTkZJR19IV01PTiBpcyBub3Qgc2V0CisjIENPTkZJR19USEVSTUFMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RIRVJNQUxfSFdNT04gaXMgbm90IHNldAogQ09ORklHX1dBVENIRE9HPXkKICMgQ09ORklHX1dBVENIRE9HX05PV0FZT1VUIGlzIG5vdCBzZXQKIApAQCAtNTIzLDIwICs1NTMsMjcgQEAKIENPTkZJR19CRklOX1dEVD15CiAKICMKLSMgU29uaWNzIFNpbGljb24gQmFja3BsYW5lCi0jCi1DT05GSUdfU1NCX1BPU1NJQkxFPXkKLSMgQ09ORklHX1NTQiBpcyBub3Qgc2V0Ci0KLSMKICMgTXVsdGlmdW5jdGlvbiBkZXZpY2UgZHJpdmVycwogIworIyBDT05GSUdfTUZEX0NPUkUgaXMgbm90IHNldAogIyBDT05GSUdfTUZEX1NNNTAxIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hUQ19QQVNJQzMgaXMgbm90IHNldAorIyBDT05GSUdfTUZEX1RNSU8gaXMgbm90IHNldAorIyBDT05GSUdfTUZEX1dNODQwMCBpcyBub3Qgc2V0CiAKICMKICMgTXVsdGltZWRpYSBkZXZpY2VzCiAjCisKKyMKKyMgTXVsdGltZWRpYSBjb3JlIHN1cHBvcnQKKyMKICMgQ09ORklHX1ZJREVPX0RFViBpcyBub3Qgc2V0CisjIENPTkZJR19WSURFT19NRURJQSBpcyBub3Qgc2V0CisKKyMKKyMgTXVsdGltZWRpYSBkcml2ZXJzCisjCiAjIENPTkZJR19EQUIgaXMgbm90IHNldAogCiAjCkBAIC01NTEsMjAgKzU4OCwxNiBAQAogIyBEaXNwbGF5IGRldmljZSBzdXBwb3J0CiAjCiAjIENPTkZJR19ESVNQTEFZX1NVUFBPUlQgaXMgbm90IHNldAotCi0jCi0jIFNvdW5kCi0jCiAjIENPTkZJR19TT1VORCBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfU1VQUE9SVCBpcyBub3Qgc2V0CiAjIENPTkZJR19NTUMgaXMgbm90IHNldAorIyBDT05GSUdfTUVNU1RJQ0sgaXMgbm90IHNldAogIyBDT05GSUdfTkVXX0xFRFMgaXMgbm90IHNldAorIyBDT05GSUdfQUNDRVNTSUJJTElUWSBpcyBub3Qgc2V0CiAjIENPTkZJR19SVENfQ0xBU1MgaXMgbm90IHNldAotCi0jCi0jIFVzZXJzcGFjZSBJL08KLSMKKyMgQ09ORklHX0RNQURFVklDRVMgaXMgbm90IHNldAogIyBDT05GSUdfVUlPIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NUQUdJTkcgaXMgbm90IHNldAogCiAjCiAjIEZpbGUgc3lzdGVtcwpAQCAtNTc0LDE5ICs2MDcsMTcgQEAKICMgQ09ORklHX0VYVDJfRlNfUE9TSVhfQUNMIGlzIG5vdCBzZXQKICMgQ09ORklHX0VYVDJfRlNfU0VDVVJJVFkgaXMgbm90IHNldAogIyBDT05GSUdfRVhUM19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19FWFQ0REVWX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYVDRfRlMgaXMgbm90IHNldAogQ09ORklHX0ZTX01CQ0FDSEU9eQogIyBDT05GSUdfUkVJU0VSRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfSkZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0CitDT05GSUdfRklMRV9MT0NLSU5HPXkKICMgQ09ORklHX1hGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19HRlMyX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX01JTklYX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1JPTUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ROT1RJRlkgaXMgbm90IHNldAogQ09ORklHX0lOT1RJRlk9eQogQ09ORklHX0lOT1RJRllfVVNFUj15CiAjIENPTkZJR19RVU9UQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19ETk9USUZZIGlzIG5vdCBzZXQKICMgQ09ORklHX0FVVE9GU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19BVVRPRlM0X0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZVU0VfRlMgaXMgbm90IHNldApAQCAtNjI4LDggKzY1OSwxMSBAQAogIyBDT05GSUdfSkZGUzJfRlMgaXMgbm90IHNldAogIyBDT05GSUdfQ1JBTUZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1ZYRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTUlOSVhfRlMgaXMgbm90IHNldAorIyBDT05GSUdfT01GU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19IUEZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1FOWDRGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19ST01GU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19TWVNWX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1VGU19GUyBpcyBub3Qgc2V0CiAKQEAgLTYzOSw3ICs2NzMsNiBAQAogIyBDT05GSUdfUEFSVElUSU9OX0FEVkFOQ0VEIGlzIG5vdCBzZXQKIENPTkZJR19NU0RPU19QQVJUSVRJT049eQogIyBDT05GSUdfTkxTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lOU1RSVU1FTlRBVElPTiBpcyBub3Qgc2V0CiAKICMKICMgS2VybmVsIGhhY2tpbmcKQEAgLTY0NywxNCArNjgwLDIyIEBACiAjIENPTkZJR19QUklOVEtfVElNRSBpcyBub3Qgc2V0CiBDT05GSUdfRU5BQkxFX1dBUk5fREVQUkVDQVRFRD15CiBDT05GSUdfRU5BQkxFX01VU1RfQ0hFQ0s9eQorQ09ORklHX0ZSQU1FX1dBUk49MTAyNAogIyBDT05GSUdfTUFHSUNfU1lTUlEgaXMgbm90IHNldAogIyBDT05GSUdfVU5VU0VEX1NZTUJPTFMgaXMgbm90IHNldAogQ09ORklHX0RFQlVHX0ZTPXkKICMgQ09ORklHX0hFQURFUlNfQ0hFQ0sgaXMgbm90IHNldAogIyBDT05GSUdfREVCVUdfS0VSTkVMIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX0JVR1ZFUkJPU0UgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfTUVNT1JZX0lOSVQgaXMgbm90IHNldAorIyBDT05GSUdfUkNVX0NQVV9TVEFMTF9ERVRFQ1RPUiBpcyBub3Qgc2V0CisjIENPTkZJR19TWVNDVExfU1lTQ0FMTF9DSEVDSyBpcyBub3Qgc2V0CisjIENPTkZJR19EWU5BTUlDX1BSSU5US19ERUJVRyBpcyBub3Qgc2V0CiAjIENPTkZJR19TQU1QTEVTIGlzIG5vdCBzZXQKK0NPTkZJR19IQVZFX0FSQ0hfS0dEQj15CitDT05GSUdfREVCVUdfVkVSQk9TRT15CiBDT05GSUdfREVCVUdfTU1SUz15CisjIENPTkZJR19ERUJVR19ET1VCTEVGQVVMVCBpcyBub3Qgc2V0CiBDT05GSUdfREVCVUdfSFVOVF9GT1JfWkVSTz15CiBDT05GSUdfREVCVUdfQkZJTl9IV1RSQUNFX09OPXkKIENPTkZJR19ERUJVR19CRklOX0hXVFJBQ0VfQ09NUFJFU1NJT05fT0ZGPXkKQEAgLTY3MSw5ICs3MTIsOCBAQAogIyBTZWN1cml0eSBvcHRpb25zCiAjCiAjIENPTkZJR19LRVlTIGlzIG5vdCBzZXQKLUNPTkZJR19TRUNVUklUWT15Ci0jIENPTkZJR19TRUNVUklUWV9ORVRXT1JLIGlzIG5vdCBzZXQKLUNPTkZJR19TRUNVUklUWV9DQVBBQklMSVRJRVM9eQorIyBDT05GSUdfU0VDVVJJVFkgaXMgbm90IHNldAorIyBDT05GSUdfU0VDVVJJVFlGUyBpcyBub3Qgc2V0CiAjIENPTkZJR19TRUNVUklUWV9GSUxFX0NBUEFCSUxJVElFUyBpcyBub3Qgc2V0CiAjIENPTkZJR19DUllQVE8gaXMgbm90IHNldAogCkBAIC02ODIsNiArNzIyLDcgQEAKICMKICMgQ09ORklHX0NSQ19DQ0lUVCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUkMxNiBpcyBub3Qgc2V0CisjIENPTkZJR19DUkNfVDEwRElGIGlzIG5vdCBzZXQKICMgQ09ORklHX0NSQ19JVFVfVCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUkMzMiBpcyBub3Qgc2V0CiAjIENPTkZJR19DUkM3IGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vS2J1aWxkIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9LYnVpbGQKaW5kZXggZDBkMWFjNC4uNjA2ZWNmZCAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9LYnVpbGQKKysrIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9LYnVpbGQKQEAgLTEsNCArMSwzIEBACiBpbmNsdWRlIGluY2x1ZGUvYXNtLWdlbmVyaWMvS2J1aWxkLmFzbQogCiB1bmlmZGVmLXkgKz0gZml4ZWRfY29kZS5oCi11bmlmZGVmLXkgKz0gc3dhYi5oCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2F0b21pYy5oIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9hdG9taWMuaAppbmRleCAyNTc3NmMxLi45NGIyYTliIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2F0b21pYy5oCisrKyBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vYXRvbWljLmgKQEAgLTE1LDY1ICsxNSwxNzIgQEAKICAqLwogCiAjZGVmaW5lIEFUT01JQ19JTklUKGkpCXsgKGkpIH0KLQotI2RlZmluZSBhdG9taWNfcmVhZCh2KQkJKCh2KS0+Y291bnRlcikKICNkZWZpbmUgYXRvbWljX3NldCh2LCBpKQkoKCh2KS0+Y291bnRlcikgPSBpKQogCi1zdGF0aWMgX19pbmxpbmVfXyB2b2lkIGF0b21pY19hZGQoaW50IGksIGF0b21pY190ICogdikKKyNpZmRlZiBDT05GSUdfU01QCisKKyNkZWZpbmUgYXRvbWljX3JlYWQodikJX19yYXdfdW5jYWNoZWRfZmV0Y2hfYXNtKCYodiktPmNvdW50ZXIpCisKK2FzbWxpbmthZ2UgaW50IF9fcmF3X3VuY2FjaGVkX2ZldGNoX2FzbShjb25zdCB2b2xhdGlsZSBpbnQgKnB0cik7CisKK2FzbWxpbmthZ2UgaW50IF9fcmF3X2F0b21pY191cGRhdGVfYXNtKHZvbGF0aWxlIGludCAqcHRyLCBpbnQgdmFsdWUpOworCithc21saW5rYWdlIGludCBfX3Jhd19hdG9taWNfY2xlYXJfYXNtKHZvbGF0aWxlIGludCAqcHRyLCBpbnQgdmFsdWUpOworCithc21saW5rYWdlIGludCBfX3Jhd19hdG9taWNfc2V0X2FzbSh2b2xhdGlsZSBpbnQgKnB0ciwgaW50IHZhbHVlKTsKKworYXNtbGlua2FnZSBpbnQgX19yYXdfYXRvbWljX3hvcl9hc20odm9sYXRpbGUgaW50ICpwdHIsIGludCB2YWx1ZSk7CisKK2FzbWxpbmthZ2UgaW50IF9fcmF3X2F0b21pY190ZXN0X2FzbShjb25zdCB2b2xhdGlsZSBpbnQgKnB0ciwgaW50IHZhbHVlKTsKKworc3RhdGljIGlubGluZSB2b2lkIGF0b21pY19hZGQoaW50IGksIGF0b21pY190ICp2KQoreworCV9fcmF3X2F0b21pY191cGRhdGVfYXNtKCZ2LT5jb3VudGVyLCBpKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGF0b21pY19zdWIoaW50IGksIGF0b21pY190ICp2KQoreworCV9fcmF3X2F0b21pY191cGRhdGVfYXNtKCZ2LT5jb3VudGVyLCAtaSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGF0b21pY19hZGRfcmV0dXJuKGludCBpLCBhdG9taWNfdCAqdikKK3sKKwlyZXR1cm4gX19yYXdfYXRvbWljX3VwZGF0ZV9hc20oJnYtPmNvdW50ZXIsIGkpOworfQorCitzdGF0aWMgaW5saW5lIGludCBhdG9taWNfc3ViX3JldHVybihpbnQgaSwgYXRvbWljX3QgKnYpCit7CisJcmV0dXJuIF9fcmF3X2F0b21pY191cGRhdGVfYXNtKCZ2LT5jb3VudGVyLCAtaSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhdG9taWNfaW5jKHZvbGF0aWxlIGF0b21pY190ICp2KQoreworCV9fcmF3X2F0b21pY191cGRhdGVfYXNtKCZ2LT5jb3VudGVyLCAxKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGF0b21pY19kZWModm9sYXRpbGUgYXRvbWljX3QgKnYpCit7CisJX19yYXdfYXRvbWljX3VwZGF0ZV9hc20oJnYtPmNvdW50ZXIsIC0xKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGF0b21pY19jbGVhcl9tYXNrKGludCBtYXNrLCBhdG9taWNfdCAqdikKK3sKKwlfX3Jhd19hdG9taWNfY2xlYXJfYXNtKCZ2LT5jb3VudGVyLCBtYXNrKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGF0b21pY19zZXRfbWFzayhpbnQgbWFzaywgYXRvbWljX3QgKnYpCit7CisJX19yYXdfYXRvbWljX3NldF9hc20oJnYtPmNvdW50ZXIsIG1hc2spOworfQorCitzdGF0aWMgaW5saW5lIGludCBhdG9taWNfdGVzdF9tYXNrKGludCBtYXNrLCBhdG9taWNfdCAqdikKK3sKKwlyZXR1cm4gX19yYXdfYXRvbWljX3Rlc3RfYXNtKCZ2LT5jb3VudGVyLCBtYXNrKTsKK30KKworLyogQXRvbWljIG9wZXJhdGlvbnMgYXJlIGFscmVhZHkgc2VyaWFsaXppbmcgKi8KKyNkZWZpbmUgc21wX21iX19iZWZvcmVfYXRvbWljX2RlYygpICAgIGJhcnJpZXIoKQorI2RlZmluZSBzbXBfbWJfX2FmdGVyX2F0b21pY19kZWMoKSBiYXJyaWVyKCkKKyNkZWZpbmUgc21wX21iX19iZWZvcmVfYXRvbWljX2luYygpICAgIGJhcnJpZXIoKQorI2RlZmluZSBzbXBfbWJfX2FmdGVyX2F0b21pY19pbmMoKSBiYXJyaWVyKCkKKworI2Vsc2UgLyogIUNPTkZJR19TTVAgKi8KKworI2RlZmluZSBhdG9taWNfcmVhZCh2KQkoKHYpLT5jb3VudGVyKQorCitzdGF0aWMgaW5saW5lIHZvaWQgYXRvbWljX2FkZChpbnQgaSwgYXRvbWljX3QgKnYpCiB7CiAJbG9uZyBmbGFnczsKIAotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwlsb2NhbF9pcnFfc2F2ZV9odyhmbGFncyk7CiAJdi0+Y291bnRlciArPSBpOwotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwlsb2NhbF9pcnFfcmVzdG9yZV9odyhmbGFncyk7CiB9CiAKLXN0YXRpYyBfX2lubGluZV9fIHZvaWQgYXRvbWljX3N1YihpbnQgaSwgYXRvbWljX3QgKiB2KQorc3RhdGljIGlubGluZSB2b2lkIGF0b21pY19zdWIoaW50IGksIGF0b21pY190ICp2KQogewogCWxvbmcgZmxhZ3M7CiAKLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJbG9jYWxfaXJxX3NhdmVfaHcoZmxhZ3MpOwogCXYtPmNvdW50ZXIgLT0gaTsKLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJbG9jYWxfaXJxX3Jlc3RvcmVfaHcoZmxhZ3MpOwogCiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IGF0b21pY19hZGRfcmV0dXJuKGludCBpLCBhdG9taWNfdCAqIHYpCitzdGF0aWMgaW5saW5lIGludCBhdG9taWNfYWRkX3JldHVybihpbnQgaSwgYXRvbWljX3QgKnYpCiB7CiAJaW50IF9fdGVtcCA9IDA7CiAJbG9uZyBmbGFnczsKIAotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwlsb2NhbF9pcnFfc2F2ZV9odyhmbGFncyk7CiAJdi0+Y291bnRlciArPSBpOwogCV9fdGVtcCA9IHYtPmNvdW50ZXI7Ci0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCWxvY2FsX2lycV9yZXN0b3JlX2h3KGZsYWdzKTsKIAogCiAJcmV0dXJuIF9fdGVtcDsKIH0KIAorc3RhdGljIGlubGluZSBpbnQgYXRvbWljX3N1Yl9yZXR1cm4oaW50IGksIGF0b21pY190ICp2KQoreworCWludCBfX3RlbXAgPSAwOworCWxvbmcgZmxhZ3M7CisKKwlsb2NhbF9pcnFfc2F2ZV9odyhmbGFncyk7CisJdi0+Y291bnRlciAtPSBpOworCV9fdGVtcCA9IHYtPmNvdW50ZXI7CisJbG9jYWxfaXJxX3Jlc3RvcmVfaHcoZmxhZ3MpOworCisJcmV0dXJuIF9fdGVtcDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGF0b21pY19pbmModm9sYXRpbGUgYXRvbWljX3QgKnYpCit7CisJbG9uZyBmbGFnczsKKworCWxvY2FsX2lycV9zYXZlX2h3KGZsYWdzKTsKKwl2LT5jb3VudGVyKys7CisJbG9jYWxfaXJxX3Jlc3RvcmVfaHcoZmxhZ3MpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYXRvbWljX2RlYyh2b2xhdGlsZSBhdG9taWNfdCAqdikKK3sKKwlsb25nIGZsYWdzOworCisJbG9jYWxfaXJxX3NhdmVfaHcoZmxhZ3MpOworCXYtPmNvdW50ZXItLTsKKwlsb2NhbF9pcnFfcmVzdG9yZV9odyhmbGFncyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhdG9taWNfY2xlYXJfbWFzayh1bnNpZ25lZCBpbnQgbWFzaywgYXRvbWljX3QgKnYpCit7CisJbG9uZyBmbGFnczsKKworCWxvY2FsX2lycV9zYXZlX2h3KGZsYWdzKTsKKwl2LT5jb3VudGVyICY9IH5tYXNrOworCWxvY2FsX2lycV9yZXN0b3JlX2h3KGZsYWdzKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGF0b21pY19zZXRfbWFzayh1bnNpZ25lZCBpbnQgbWFzaywgYXRvbWljX3QgKnYpCit7CisJbG9uZyBmbGFnczsKKworCWxvY2FsX2lycV9zYXZlX2h3KGZsYWdzKTsKKwl2LT5jb3VudGVyIHw9IG1hc2s7CisJbG9jYWxfaXJxX3Jlc3RvcmVfaHcoZmxhZ3MpOworfQorCisvKiBBdG9taWMgb3BlcmF0aW9ucyBhcmUgYWxyZWFkeSBzZXJpYWxpemluZyAqLworI2RlZmluZSBzbXBfbWJfX2JlZm9yZV9hdG9taWNfZGVjKCkgICAgYmFycmllcigpCisjZGVmaW5lIHNtcF9tYl9fYWZ0ZXJfYXRvbWljX2RlYygpIGJhcnJpZXIoKQorI2RlZmluZSBzbXBfbWJfX2JlZm9yZV9hdG9taWNfaW5jKCkgICAgYmFycmllcigpCisjZGVmaW5lIHNtcF9tYl9fYWZ0ZXJfYXRvbWljX2luYygpIGJhcnJpZXIoKQorCisjZW5kaWYgLyogIUNPTkZJR19TTVAgKi8KKwogI2RlZmluZSBhdG9taWNfYWRkX25lZ2F0aXZlKGEsIHYpCShhdG9taWNfYWRkX3JldHVybigoYSksICh2KSkgPCAwKQotc3RhdGljIGlubGluZSBpbnQgYXRvbWljX3N1Yl9yZXR1cm4oaW50IGksIGF0b21pY190ICogdikKLXsKLQlpbnQgX190ZW1wID0gMDsKLQlsb25nIGZsYWdzOwotCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCXYtPmNvdW50ZXIgLT0gaTsKLQlfX3RlbXAgPSB2LT5jb3VudGVyOwotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLQotCXJldHVybiBfX3RlbXA7Ci19Ci0KLXN0YXRpYyBfX2lubGluZV9fIHZvaWQgYXRvbWljX2luYyh2b2xhdGlsZSBhdG9taWNfdCAqIHYpCi17Ci0JbG9uZyBmbGFnczsKLQotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQl2LT5jb3VudGVyKys7Ci0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotfQorI2RlZmluZSBhdG9taWNfZGVjX3JldHVybih2KSBhdG9taWNfc3ViX3JldHVybigxLCh2KSkKKyNkZWZpbmUgYXRvbWljX2luY19yZXR1cm4odikgYXRvbWljX2FkZF9yZXR1cm4oMSwodikpCiAKICNkZWZpbmUgYXRvbWljX2NtcHhjaGcodiwgbywgbikgKChpbnQpY21weGNoZygmKCh2KS0+Y291bnRlciksIChvKSwgKG4pKSkKICNkZWZpbmUgYXRvbWljX3hjaGcodiwgbmV3KSAoeGNoZygmKCh2KS0+Y291bnRlciksIG5ldykpCkBAIC04OCw0MiArMTk1LDYgQEAKIH0pCiAjZGVmaW5lIGF0b21pY19pbmNfbm90X3plcm8odikgYXRvbWljX2FkZF91bmxlc3MoKHYpLCAxLCAwKQogCi1zdGF0aWMgX19pbmxpbmVfXyB2b2lkIGF0b21pY19kZWModm9sYXRpbGUgYXRvbWljX3QgKiB2KQotewotCWxvbmcgZmxhZ3M7Ci0KLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0Jdi0+Y291bnRlci0tOwotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLX0KLQotc3RhdGljIF9faW5saW5lX18gdm9pZCBhdG9taWNfY2xlYXJfbWFzayh1bnNpZ25lZCBpbnQgbWFzaywgYXRvbWljX3QgKiB2KQotewotCWxvbmcgZmxhZ3M7Ci0KLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0Jdi0+Y291bnRlciAmPSB+bWFzazsKLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci19Ci0KLXN0YXRpYyBfX2lubGluZV9fIHZvaWQgYXRvbWljX3NldF9tYXNrKHVuc2lnbmVkIGludCBtYXNrLCBhdG9taWNfdCAqIHYpCi17Ci0JbG9uZyBmbGFnczsKLQotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQl2LT5jb3VudGVyIHw9IG1hc2s7Ci0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotfQotCi0vKiBBdG9taWMgb3BlcmF0aW9ucyBhcmUgYWxyZWFkeSBzZXJpYWxpemluZyAqLwotI2RlZmluZSBzbXBfbWJfX2JlZm9yZV9hdG9taWNfZGVjKCkgICAgYmFycmllcigpCi0jZGVmaW5lIHNtcF9tYl9fYWZ0ZXJfYXRvbWljX2RlYygpIGJhcnJpZXIoKQotI2RlZmluZSBzbXBfbWJfX2JlZm9yZV9hdG9taWNfaW5jKCkgICAgYmFycmllcigpCi0jZGVmaW5lIHNtcF9tYl9fYWZ0ZXJfYXRvbWljX2luYygpIGJhcnJpZXIoKQotCi0jZGVmaW5lIGF0b21pY19kZWNfcmV0dXJuKHYpIGF0b21pY19zdWJfcmV0dXJuKDEsKHYpKQotI2RlZmluZSBhdG9taWNfaW5jX3JldHVybih2KSBhdG9taWNfYWRkX3JldHVybigxLCh2KSkKLQogLyoKICAqIGF0b21pY19pbmNfYW5kX3Rlc3QgLSBpbmNyZW1lbnQgYW5kIHRlc3QKICAqIEB2OiBwb2ludGVyIG9mIHR5cGUgYXRvbWljX3QKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vYmZpbi1nbG9iYWwuaCBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vYmZpbi1nbG9iYWwuaAppbmRleCA3NzI5NTY2Li5kYWZmYzA2IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2JmaW4tZ2xvYmFsLmgKKysrIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9iZmluLWdsb2JhbC5oCkBAIC00Nyw2ICs0Nyw5IEBACiAjIGRlZmluZSBETUFfVU5DQUNIRURfUkVHSU9OICgwKQogI2VuZGlmCiAKK2V4dGVybiB2b2lkIGJmaW5fc2V0dXBfY2FjaGVzKHVuc2lnbmVkIGludCBjcHUpOworZXh0ZXJuIHZvaWQgYmZpbl9zZXR1cF9jcHVkYXRhKHVuc2lnbmVkIGludCBjcHUpOworCiBleHRlcm4gdW5zaWduZWQgbG9uZyBnZXRfY2Nsayh2b2lkKTsKIGV4dGVybiB1bnNpZ25lZCBsb25nIGdldF9zY2xrKHZvaWQpOwogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgc2Nsa190b191c2Vjcyh1bnNpZ25lZCBsb25nIHNjbGspOwpAQCAtNTgsOCArNjEsNiBAQAogCiAvKiBpbml0IGZ1bmN0aW9ucyBvbmx5ICovCiBleHRlcm4gaW50IGluaXRfYXJjaF9pcnEodm9pZCk7Ci1leHRlcm4gdm9pZCBiZmluX2ljYWNoZV9pbml0KHZvaWQpOwotZXh0ZXJuIHZvaWQgYmZpbl9kY2FjaGVfaW5pdCh2b2lkKTsKIGV4dGVybiB2b2lkIGluaXRfZXhjZXB0aW9uX3ZlY3RvcnModm9pZCk7CiBleHRlcm4gdm9pZCBwcm9ncmFtX0lBUih2b2lkKTsKIApAQCAtMTEwLDcgKzExMSw3IEBACiAKICNpZmRlZiBDT05GSUdfQkZJTl9JQ0FDSEVfTE9DSwogZXh0ZXJuIHZvaWQgY2FjaGVfZ3JhYl9sb2NrKGludCB3YXkpOwotZXh0ZXJuIHZvaWQgY2FjaGVfbG9jayhpbnQgd2F5KTsKK2V4dGVybiB2b2lkIGJmaW5fY2FjaGVfbG9jayhpbnQgd2F5KTsKICNlbmRpZgogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vYmZpbjV4eF9zcGkuaCBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vYmZpbjV4eF9zcGkuaAppbmRleCA5ZmExOTE1Li4xMzA2ZTZiIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2JmaW41eHhfc3BpLmgKKysrIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9iZmluNXh4X3NwaS5oCkBAIC0xLDIyICsxLDEyIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSogQ29weXJpZ2h0IChDKSAyMDA2LTIwMDgsIEFuYWxvZyBEZXZpY2VzLiBBbGwgUmlnaHRzIFJlc2VydmVkCi0qCi0qIEZJTEUgYmZpbjV4eF9zcGkuaAotKiBQUk9HUkFNTUVSKFMpOiBMdWtlIFlhbmcgKEFuYWxvZyBEZXZpY2VzIEluYy4pCi0qCi0qCi0qIERBVEUgT0YgQ1JFQVRJT046IE1hcmNoLiAxMHRoIDIwMDYKLSoKLSogU1lOT1BTSVM6Ci0qCi0qIERFU0NSSVBUSU9OOiBoZWFkZXIgZmlsZSBmb3IgU1BJIGNvbnRyb2xsZXIgZHJpdmVyIGZvciBCbGFja2ZpbjV4eC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSogTU9ESUZJQ0FUSU9OIEhJU1RPUlk6Ci0qIE1hcmNoIDEwLCAyMDA2ICBiZmluNXh4X3NwaS5oIENyZWF0ZWQuIChMdWtlIFlhbmcpCi0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBCbGFja2ZpbiBPbi1DaGlwIFNQSSBEcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgMjAwNC0yMDA4IEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqCisgKiBFbnRlciBidWdzIGF0IGh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZy8KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCisgKi8KIAogI2lmbmRlZiBfU1BJX0NIQU5ORUxfSF8KICNkZWZpbmUgX1NQSV9DSEFOTkVMX0hfCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2JmaW5fc2RoLmggYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2JmaW5fc2RoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDYxZDU0OQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vYmZpbl9zZGguaApAQCAtMCwwICsxLDE5IEBACisvKgorICogYmZpbl9zZGguaCAtIEJsYWNrZmluIFNESCBkZWZpbml0aW9ucworICoKKyAqIENvcHlyaWdodCAyMDA4IEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCisgKi8KKworI2lmbmRlZiBfX0JGSU5fU0RIX0hfXworI2RlZmluZSBfX0JGSU5fU0RIX0hfXworCitzdHJ1Y3QgYmZpbl9zZF9ob3N0IHsKKwlpbnQgZG1hX2NoYW47CisJaW50IGlycV9pbnQwOworCWludCBpcnFfaW50MTsKKwl1MTYgcGluX3JlcVs3XTsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9iZmluX3Nwb3J0LmggYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2JmaW5fc3BvcnQuaAppbmRleCBjNzZlZDhkLi5mZTg4YTJjIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2JmaW5fc3BvcnQuaAorKysgYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2JmaW5fc3BvcnQuaApAQCAtMTIwLDkgKzEyMCw2IEBACiAjZGVmaW5lIFNQT1JUX0lPQ19NQUdJQwkJJ1AnCiAjZGVmaW5lIFNQT1JUX0lPQ19DT05GSUcJX0lPV1IoJ1AnLCAweDAxLCBzdHJ1Y3Qgc3BvcnRfY29uZmlnKQogCi0vKiBUZXN0IHB1cnBvc2UgKi8KLSNkZWZpbmUgRU5BQkxFX0FENzMzMTEJCV9JT1dSKCdQJywgMHgwMiwgaW50KQotCiBzdHJ1Y3Qgc3BvcnRfZGV2IHsKIAlzdHJ1Y3QgY2RldiBjZGV2OwkvKiBDaGFyIGRldmljZSBzdHJ1Y3R1cmUgKi8KIApkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9iZnJvbS5oIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9iZnJvbS5oCmluZGV4IGNmZTgwMjQuLjllNGJlNWU1IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2Jmcm9tLmgKKysrIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9iZnJvbS5oCkBAIC00Myw2ICs0MywxMSBAQAogc3RhdGljIGlubGluZSB2b2lkIGJmcm9tX1NvZnRSZXNldCh2b2lkICpuZXdfc3RhY2spCiB7CiAJd2hpbGUgKDEpCisJCS8qCisJCSAqIFdlIGRvbid0IGRlY2xhcmUgdGhlIFNQIGFzIGNsb2JiZXJlZCBvbiBwdXJwb3NlLCBzaW5jZQorCQkgKiBpdCBjb25mdXNlcyB0aGUgaGVjayBvdXQgb2YgdGhlIGNvbXBpbGVyLCBhbmQgdGhpcyBmdW5jdGlvbgorCQkgKiBuZXZlciByZXR1cm5zCisJCSAqLwogCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygKIAkJCSJzcCA9ICVbc3RhY2tdOyIKIAkJCSJqdW1wICglW2Jmcm9tX3N5c2NvbnRyb2xdKTsiCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2JpdG9wcy5oIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9iaXRvcHMuaAppbmRleCBjNDI4ZTQxLi4yMWIwMzZlIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2JpdG9wcy5oCisrKyBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vYml0b3BzLmgKQEAgLTcsNyArNyw2IEBACiAKICNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgogI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4JLyogc3dhYjMyICovCi0jaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgkJLyogc2F2ZV9mbGFncyAqLwogCiAjaWZkZWYgX19LRVJORUxfXwogCkBAIC0yMCw5NiArMTksMTkyIEBACiAjaW5jbHVkZSA8YXNtLWdlbmVyaWMvYml0b3BzL3NjaGVkLmg+CiAjaW5jbHVkZSA8YXNtLWdlbmVyaWMvYml0b3BzL2Zmei5oPgogCi1zdGF0aWMgX19pbmxpbmVfXyB2b2lkIHNldF9iaXQoaW50IG5yLCB2b2xhdGlsZSB1bnNpZ25lZCBsb25nICphZGRyKQorI2lmZGVmIENPTkZJR19TTVAKKworI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KKworYXNtbGlua2FnZSBpbnQgX19yYXdfYml0X3NldF9hc20odm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqYWRkciwgaW50IG5yKTsKKworYXNtbGlua2FnZSBpbnQgX19yYXdfYml0X2NsZWFyX2FzbSh2b2xhdGlsZSB1bnNpZ25lZCBsb25nICphZGRyLCBpbnQgbnIpOworCithc21saW5rYWdlIGludCBfX3Jhd19iaXRfdG9nZ2xlX2FzbSh2b2xhdGlsZSB1bnNpZ25lZCBsb25nICphZGRyLCBpbnQgbnIpOworCithc21saW5rYWdlIGludCBfX3Jhd19iaXRfdGVzdF9zZXRfYXNtKHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKmFkZHIsIGludCBucik7CisKK2FzbWxpbmthZ2UgaW50IF9fcmF3X2JpdF90ZXN0X2NsZWFyX2FzbSh2b2xhdGlsZSB1bnNpZ25lZCBsb25nICphZGRyLCBpbnQgbnIpOworCithc21saW5rYWdlIGludCBfX3Jhd19iaXRfdGVzdF90b2dnbGVfYXNtKHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKmFkZHIsIGludCBucik7CisKK2FzbWxpbmthZ2UgaW50IF9fcmF3X2JpdF90ZXN0X2FzbShjb25zdCB2b2xhdGlsZSB1bnNpZ25lZCBsb25nICphZGRyLCBpbnQgbnIpOworCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X2JpdChpbnQgbnIsIHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKmFkZHIpCit7CisJdm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqYSA9IGFkZHIgKyAobnIgPj4gNSk7CisJX19yYXdfYml0X3NldF9hc20oYSwgbnIgJiAweDFmKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGNsZWFyX2JpdChpbnQgbnIsIHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKmFkZHIpCit7CisJdm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqYSA9IGFkZHIgKyAobnIgPj4gNSk7CisJX19yYXdfYml0X2NsZWFyX2FzbShhLCBuciAmIDB4MWYpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgY2hhbmdlX2JpdChpbnQgbnIsIHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKmFkZHIpCit7CisJdm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqYSA9IGFkZHIgKyAobnIgPj4gNSk7CisJX19yYXdfYml0X3RvZ2dsZV9hc20oYSwgbnIgJiAweDFmKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgdGVzdF9iaXQoaW50IG5yLCBjb25zdCB2b2xhdGlsZSB1bnNpZ25lZCBsb25nICphZGRyKQoreworCXZvbGF0aWxlIGNvbnN0IHVuc2lnbmVkIGxvbmcgKmEgPSBhZGRyICsgKG5yID4+IDUpOworCXJldHVybiBfX3Jhd19iaXRfdGVzdF9hc20oYSwgbnIgJiAweDFmKSAhPSAwOworfQorCitzdGF0aWMgaW5saW5lIGludCB0ZXN0X2FuZF9zZXRfYml0KGludCBuciwgdm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqYWRkcikKK3sKKwl2b2xhdGlsZSB1bnNpZ25lZCBsb25nICphID0gYWRkciArIChuciA+PiA1KTsKKwlyZXR1cm4gX19yYXdfYml0X3Rlc3Rfc2V0X2FzbShhLCBuciAmIDB4MWYpOworfQorCitzdGF0aWMgaW5saW5lIGludCB0ZXN0X2FuZF9jbGVhcl9iaXQoaW50IG5yLCB2b2xhdGlsZSB1bnNpZ25lZCBsb25nICphZGRyKQoreworCXZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKmEgPSBhZGRyICsgKG5yID4+IDUpOworCXJldHVybiBfX3Jhd19iaXRfdGVzdF9jbGVhcl9hc20oYSwgbnIgJiAweDFmKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgdGVzdF9hbmRfY2hhbmdlX2JpdChpbnQgbnIsIHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKmFkZHIpCit7CisJdm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqYSA9IGFkZHIgKyAobnIgPj4gNSk7CisJcmV0dXJuIF9fcmF3X2JpdF90ZXN0X3RvZ2dsZV9hc20oYSwgbnIgJiAweDFmKTsKK30KKworI2Vsc2UgLyogIUNPTkZJR19TTVAgKi8KKworI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4JCS8qIHNhdmVfZmxhZ3MgKi8KKworc3RhdGljIGlubGluZSB2b2lkIHNldF9iaXQoaW50IG5yLCB2b2xhdGlsZSB1bnNpZ25lZCBsb25nICphZGRyKQogewogCWludCAqYSA9IChpbnQgKilhZGRyOwogCWludCBtYXNrOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KIAlhICs9IG5yID4+IDU7CiAJbWFzayA9IDEgPDwgKG5yICYgMHgxZik7Ci0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCWxvY2FsX2lycV9zYXZlX2h3KGZsYWdzKTsKIAkqYSB8PSBtYXNrOwotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwlsb2NhbF9pcnFfcmVzdG9yZV9odyhmbGFncyk7CiB9CiAKLXN0YXRpYyBfX2lubGluZV9fIHZvaWQgX19zZXRfYml0KGludCBuciwgdm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqYWRkcikKK3N0YXRpYyBpbmxpbmUgdm9pZCBjbGVhcl9iaXQoaW50IG5yLCB2b2xhdGlsZSB1bnNpZ25lZCBsb25nICphZGRyKQogewogCWludCAqYSA9IChpbnQgKilhZGRyOwogCWludCBtYXNrOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJYSArPSBuciA+PiA1OworCW1hc2sgPSAxIDw8IChuciAmIDB4MWYpOworCWxvY2FsX2lycV9zYXZlX2h3KGZsYWdzKTsKKwkqYSAmPSB+bWFzazsKKwlsb2NhbF9pcnFfcmVzdG9yZV9odyhmbGFncyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjaGFuZ2VfYml0KGludCBuciwgdm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqYWRkcikKK3sKKwlpbnQgbWFzaywgZmxhZ3M7CisJdW5zaWduZWQgbG9uZyAqQUREUiA9ICh1bnNpZ25lZCBsb25nICopYWRkcjsKKworCUFERFIgKz0gbnIgPj4gNTsKKwltYXNrID0gMSA8PCAobnIgJiAzMSk7CisJbG9jYWxfaXJxX3NhdmVfaHcoZmxhZ3MpOworCSpBRERSIF49IG1hc2s7CisJbG9jYWxfaXJxX3Jlc3RvcmVfaHcoZmxhZ3MpOworfQorCitzdGF0aWMgaW5saW5lIGludCB0ZXN0X2FuZF9zZXRfYml0KGludCBuciwgdm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqYWRkcikKK3sKKwlpbnQgbWFzaywgcmV0dmFsOworCXZvbGF0aWxlIHVuc2lnbmVkIGludCAqYSA9ICh2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKilhZGRyOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlhICs9IG5yID4+IDU7CiAJbWFzayA9IDEgPDwgKG5yICYgMHgxZik7CisJbG9jYWxfaXJxX3NhdmVfaHcoZmxhZ3MpOworCXJldHZhbCA9IChtYXNrICYgKmEpICE9IDA7CiAJKmEgfD0gbWFzazsKKwlsb2NhbF9pcnFfcmVzdG9yZV9odyhmbGFncyk7CisKKwlyZXR1cm4gcmV0dmFsOwogfQogCitzdGF0aWMgaW5saW5lIGludCB0ZXN0X2FuZF9jbGVhcl9iaXQoaW50IG5yLCB2b2xhdGlsZSB1bnNpZ25lZCBsb25nICphZGRyKQoreworCWludCBtYXNrLCByZXR2YWw7CisJdm9sYXRpbGUgdW5zaWduZWQgaW50ICphID0gKHZvbGF0aWxlIHVuc2lnbmVkIGludCAqKWFkZHI7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWEgKz0gbnIgPj4gNTsKKwltYXNrID0gMSA8PCAobnIgJiAweDFmKTsKKwlsb2NhbF9pcnFfc2F2ZV9odyhmbGFncyk7CisJcmV0dmFsID0gKG1hc2sgJiAqYSkgIT0gMDsKKwkqYSAmPSB+bWFzazsKKwlsb2NhbF9pcnFfcmVzdG9yZV9odyhmbGFncyk7CisKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgaW5saW5lIGludCB0ZXN0X2FuZF9jaGFuZ2VfYml0KGludCBuciwgdm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqYWRkcikKK3sKKwlpbnQgbWFzaywgcmV0dmFsOworCXZvbGF0aWxlIHVuc2lnbmVkIGludCAqYSA9ICh2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKilhZGRyOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlhICs9IG5yID4+IDU7CisJbWFzayA9IDEgPDwgKG5yICYgMHgxZik7CisJbG9jYWxfaXJxX3NhdmVfaHcoZmxhZ3MpOworCXJldHZhbCA9IChtYXNrICYgKmEpICE9IDA7CisJKmEgXj0gbWFzazsKKwlsb2NhbF9pcnFfcmVzdG9yZV9odyhmbGFncyk7CisJcmV0dXJuIHJldHZhbDsKK30KKworI2VuZGlmIC8qIENPTkZJR19TTVAgKi8KKwogLyoKICAqIGNsZWFyX2JpdCgpIGRvZXNuJ3QgcHJvdmlkZSBhbnkgYmFycmllciBmb3IgdGhlIGNvbXBpbGVyLgogICovCiAjZGVmaW5lIHNtcF9tYl9fYmVmb3JlX2NsZWFyX2JpdCgpCWJhcnJpZXIoKQogI2RlZmluZSBzbXBfbWJfX2FmdGVyX2NsZWFyX2JpdCgpCWJhcnJpZXIoKQogCi1zdGF0aWMgX19pbmxpbmVfXyB2b2lkIGNsZWFyX2JpdChpbnQgbnIsIHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKmFkZHIpCi17Ci0JaW50ICphID0gKGludCAqKWFkZHI7Ci0JaW50IG1hc2s7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlhICs9IG5yID4+IDU7Ci0JbWFzayA9IDEgPDwgKG5yICYgMHgxZik7Ci0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCSphICY9IH5tYXNrOwotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLX0KLQotc3RhdGljIF9faW5saW5lX18gdm9pZCBfX2NsZWFyX2JpdChpbnQgbnIsIHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKmFkZHIpCitzdGF0aWMgaW5saW5lIHZvaWQgX19zZXRfYml0KGludCBuciwgdm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqYWRkcikKIHsKIAlpbnQgKmEgPSAoaW50ICopYWRkcjsKIAlpbnQgbWFzazsKIAogCWEgKz0gbnIgPj4gNTsKIAltYXNrID0gMSA8PCAobnIgJiAweDFmKTsKLQkqYSAmPSB+bWFzazsKLX0KLQotc3RhdGljIF9faW5saW5lX18gdm9pZCBjaGFuZ2VfYml0KGludCBuciwgdm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqYWRkcikKLXsKLQlpbnQgbWFzaywgZmxhZ3M7Ci0JdW5zaWduZWQgbG9uZyAqQUREUiA9ICh1bnNpZ25lZCBsb25nICopYWRkcjsKLQotCUFERFIgKz0gbnIgPj4gNTsKLQltYXNrID0gMSA8PCAobnIgJiAzMSk7Ci0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCSpBRERSIF49IG1hc2s7Ci0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotfQotCi1zdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fY2hhbmdlX2JpdChpbnQgbnIsIHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKmFkZHIpCi17Ci0JaW50IG1hc2s7Ci0JdW5zaWduZWQgbG9uZyAqQUREUiA9ICh1bnNpZ25lZCBsb25nICopYWRkcjsKLQotCUFERFIgKz0gbnIgPj4gNTsKLQltYXNrID0gMSA8PCAobnIgJiAzMSk7Ci0JKkFERFIgXj0gbWFzazsKLX0KLQotc3RhdGljIF9faW5saW5lX18gaW50IHRlc3RfYW5kX3NldF9iaXQoaW50IG5yLCB2b2lkICphZGRyKQotewotCWludCBtYXNrLCByZXR2YWw7Ci0Jdm9sYXRpbGUgdW5zaWduZWQgaW50ICphID0gKHZvbGF0aWxlIHVuc2lnbmVkIGludCAqKWFkZHI7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWEgKz0gbnIgPj4gNTsKLQltYXNrID0gMSA8PCAobnIgJiAweDFmKTsKLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0JcmV0dmFsID0gKG1hc2sgJiAqYSkgIT0gMDsKIAkqYSB8PSBtYXNrOwotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLQotCXJldHVybiByZXR2YWw7CiB9CiAKLXN0YXRpYyBfX2lubGluZV9fIGludCBfX3Rlc3RfYW5kX3NldF9iaXQoaW50IG5yLCB2b2xhdGlsZSB1bnNpZ25lZCBsb25nICphZGRyKQorc3RhdGljIGlubGluZSB2b2lkIF9fY2xlYXJfYml0KGludCBuciwgdm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqYWRkcikKK3sKKwlpbnQgKmEgPSAoaW50ICopYWRkcjsKKwlpbnQgbWFzazsKKworCWEgKz0gbnIgPj4gNTsKKwltYXNrID0gMSA8PCAobnIgJiAweDFmKTsKKwkqYSAmPSB+bWFzazsKK30KKworc3RhdGljIGlubGluZSB2b2lkIF9fY2hhbmdlX2JpdChpbnQgbnIsIHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKmFkZHIpCit7CisJaW50IG1hc2s7CisJdW5zaWduZWQgbG9uZyAqQUREUiA9ICh1bnNpZ25lZCBsb25nICopYWRkcjsKKworCUFERFIgKz0gbnIgPj4gNTsKKwltYXNrID0gMSA8PCAobnIgJiAzMSk7CisJKkFERFIgXj0gbWFzazsKK30KKworc3RhdGljIGlubGluZSBpbnQgX190ZXN0X2FuZF9zZXRfYml0KGludCBuciwgdm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqYWRkcikKIHsKIAlpbnQgbWFzaywgcmV0dmFsOwogCXZvbGF0aWxlIHVuc2lnbmVkIGludCAqYSA9ICh2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKilhZGRyOwpAQCAtMTIxLDIzICsyMTYsNyBAQAogCXJldHVybiByZXR2YWw7CiB9CiAKLXN0YXRpYyBfX2lubGluZV9fIGludCB0ZXN0X2FuZF9jbGVhcl9iaXQoaW50IG5yLCB2b2xhdGlsZSB1bnNpZ25lZCBsb25nICphZGRyKQotewotCWludCBtYXNrLCByZXR2YWw7Ci0Jdm9sYXRpbGUgdW5zaWduZWQgaW50ICphID0gKHZvbGF0aWxlIHVuc2lnbmVkIGludCAqKWFkZHI7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWEgKz0gbnIgPj4gNTsKLQltYXNrID0gMSA8PCAobnIgJiAweDFmKTsKLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0JcmV0dmFsID0gKG1hc2sgJiAqYSkgIT0gMDsKLQkqYSAmPSB+bWFzazsKLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci0KLQlyZXR1cm4gcmV0dmFsOwotfQotCi1zdGF0aWMgX19pbmxpbmVfXyBpbnQgX190ZXN0X2FuZF9jbGVhcl9iaXQoaW50IG5yLCB2b2xhdGlsZSB1bnNpZ25lZCBsb25nICphZGRyKQorc3RhdGljIGlubGluZSBpbnQgX190ZXN0X2FuZF9jbGVhcl9iaXQoaW50IG5yLCB2b2xhdGlsZSB1bnNpZ25lZCBsb25nICphZGRyKQogewogCWludCBtYXNrLCByZXR2YWw7CiAJdm9sYXRpbGUgdW5zaWduZWQgaW50ICphID0gKHZvbGF0aWxlIHVuc2lnbmVkIGludCAqKWFkZHI7CkBAIC0xNDksMjIgKzIyOCw3IEBACiAJcmV0dXJuIHJldHZhbDsKIH0KIAotc3RhdGljIF9faW5saW5lX18gaW50IHRlc3RfYW5kX2NoYW5nZV9iaXQoaW50IG5yLCB2b2xhdGlsZSB1bnNpZ25lZCBsb25nICphZGRyKQotewotCWludCBtYXNrLCByZXR2YWw7Ci0Jdm9sYXRpbGUgdW5zaWduZWQgaW50ICphID0gKHZvbGF0aWxlIHVuc2lnbmVkIGludCAqKWFkZHI7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWEgKz0gbnIgPj4gNTsKLQltYXNrID0gMSA8PCAobnIgJiAweDFmKTsKLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0JcmV0dmFsID0gKG1hc2sgJiAqYSkgIT0gMDsKLQkqYSBePSBtYXNrOwotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLQlyZXR1cm4gcmV0dmFsOwotfQotCi1zdGF0aWMgX19pbmxpbmVfXyBpbnQgX190ZXN0X2FuZF9jaGFuZ2VfYml0KGludCBuciwKK3N0YXRpYyBpbmxpbmUgaW50IF9fdGVzdF9hbmRfY2hhbmdlX2JpdChpbnQgbnIsCiAJCQkJCSAgICB2b2xhdGlsZSB1bnNpZ25lZCBsb25nICphZGRyKQogewogCWludCBtYXNrLCByZXR2YWw7CkBAIC0xNzcsMTYgKzI0MSw3IEBACiAJcmV0dXJuIHJldHZhbDsKIH0KIAotLyoKLSAqIFRoaXMgcm91dGluZSBkb2Vzbid0IG5lZWQgdG8gYmUgYXRvbWljLgotICovCi1zdGF0aWMgX19pbmxpbmVfXyBpbnQgX19jb25zdGFudF90ZXN0X2JpdChpbnQgbnIsIGNvbnN0IHZvaWQgKmFkZHIpCi17Ci0JcmV0dXJuICgoMVVMIDw8IChuciAmIDMxKSkgJgotCQkoKChjb25zdCB2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKilhZGRyKVtuciA+PiA1XSkpICE9IDA7Ci19Ci0KLXN0YXRpYyBfX2lubGluZV9fIGludCBfX3Rlc3RfYml0KGludCBuciwgY29uc3Qgdm9pZCAqYWRkcikKK3N0YXRpYyBpbmxpbmUgaW50IF9fdGVzdF9iaXQoaW50IG5yLCBjb25zdCB2b2lkICphZGRyKQogewogCWludCAqYSA9IChpbnQgKilhZGRyOwogCWludCBtYXNrOwpAQCAtMTk2LDEwICsyNTEsMTYgQEAKIAlyZXR1cm4gKChtYXNrICYgKmEpICE9IDApOwogfQogCi0jZGVmaW5lIHRlc3RfYml0KG5yLGFkZHIpIFwKLShfX2J1aWx0aW5fY29uc3RhbnRfcChucikgPyBcCi0gX19jb25zdGFudF90ZXN0X2JpdCgobnIpLChhZGRyKSkgOiBcCi0gX190ZXN0X2JpdCgobnIpLChhZGRyKSkpCisjaWZuZGVmIENPTkZJR19TTVAKKy8qCisgKiBUaGlzIHJvdXRpbmUgZG9lc24ndCBuZWVkIGlycSBzYXZlIGFuZCByZXN0b3JlIG9wcyBpbiBVUAorICogY29udGV4dC4KKyAqLworc3RhdGljIGlubGluZSBpbnQgdGVzdF9iaXQoaW50IG5yLCBjb25zdCB2b2lkICphZGRyKQoreworCXJldHVybiBfX3Rlc3RfYml0KG5yLCBhZGRyKTsKK30KKyNlbmRpZgogCiAjaW5jbHVkZSA8YXNtLWdlbmVyaWMvYml0b3BzL2ZpbmQuaD4KICNpbmNsdWRlIDxhc20tZ2VuZXJpYy9iaXRvcHMvaHdlaWdodC5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9ibGFja2Zpbi5oIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9ibGFja2Zpbi5oCmluZGV4IDg3NDliMGUuLjhiYjJjYjEgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vYmxhY2tmaW4uaAorKysgYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2JsYWNrZmluLmgKQEAgLTYsMTEgKzYsNiBAQAogI2lmbmRlZiBfQkxBQ0tGSU5fSF8KICNkZWZpbmUgX0JMQUNLRklOX0hfCiAKLSNkZWZpbmUgTE8oY29uMzIpICgoY29uMzIpICYgMHhGRkZGKQotI2RlZmluZSBsbyhjb24zMikgKChjb24zMikgJiAweEZGRkYpCi0jZGVmaW5lIEhJKGNvbjMyKSAoKChjb24zMikgPj4gMTYpICYgMHhGRkZGKQotI2RlZmluZSBoaShjb24zMikgKCgoY29uMzIpID4+IDE2KSAmIDB4RkZGRikKLQogI2luY2x1ZGUgPG1hY2gvYW5vbWFseS5oPgogCiAjaWZuZGVmIF9fQVNTRU1CTFlfXwpAQCAtNjUsNiArNjAsMTEgQEAKIAogI2Vsc2UgIC8qIF9fQVNTRU1CTFlfXyAqLwogCisjZGVmaW5lIExPKGNvbjMyKSAoKGNvbjMyKSAmIDB4RkZGRikKKyNkZWZpbmUgbG8oY29uMzIpICgoY29uMzIpICYgMHhGRkZGKQorI2RlZmluZSBISShjb24zMikgKCgoY29uMzIpID4+IDE2KSAmIDB4RkZGRikKKyNkZWZpbmUgaGkoY29uMzIpICgoKGNvbjMyKSA+PiAxNikgJiAweEZGRkYpCisKIC8qIFNTWU5DICYgQ1NZTkMgaW1wbGVtZW50YXRpb25zIGZvciBhc3NlbWJseSBmaWxlcyAqLwogCiAjZGVmaW5lIHNzeW5jKHgpIFNTWU5DKHgpCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2J5dGVvcmRlci5oIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9ieXRlb3JkZXIuaAppbmRleCBiOWU3OTdhLi4zZTY5MTA2IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2J5dGVvcmRlci5oCisrKyBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vYnl0ZW9yZGVyLmgKQEAgLTEsNyArMSw2IEBACiAjaWZuZGVmIF9CTEFDS0ZJTl9CWVRFT1JERVJfSAogI2RlZmluZSBfQkxBQ0tGSU5fQllURU9SREVSX0gKIAotI2luY2x1ZGUgPGFzbS9zd2FiLmg+CiAjaW5jbHVkZSA8bGludXgvYnl0ZW9yZGVyL2xpdHRsZV9lbmRpYW4uaD4KIAogI2VuZGlmCQkJCS8qIF9CTEFDS0ZJTl9CWVRFT1JERVJfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9jYWNoZS5oIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9jYWNoZS5oCmluZGV4IDAyM2Q3MjEuLjg2NjM3ODEgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vY2FjaGUuaAorKysgYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2NhY2hlLmgKQEAgLTEyLDYgKzEyLDExIEBACiAjZGVmaW5lIEwxX0NBQ0hFX0JZVEVTCSgxIDw8IEwxX0NBQ0hFX1NISUZUKQogI2RlZmluZSBTTVBfQ0FDSEVfQllURVMJTDFfQ0FDSEVfQllURVMKIAorI2lmZGVmIENPTkZJR19TTVAKKyNkZWZpbmUgX19jYWNoZWxpbmVfYWxpZ25lZAorI2Vsc2UKKyNkZWZpbmUgX19fX2NhY2hlbGluZV9hbGlnbmVkCisKIC8qCiAgKiBQdXQgY2FjaGVsaW5lX2FsaWdlZCBkYXRhIHRvIEwxIGRhdGEgbWVtb3J5CiAgKi8KQEAgLTIxLDkgKzI2LDMzIEBACiAJCV9fc2VjdGlvbl9fKCIuZGF0YV9sMS5jYWNoZWxpbmVfYWxpZ25lZCIpKSkKICNlbmRpZgogCisjZW5kaWYKKwogLyoKICAqIGxhcmdlc3QgTDEgd2hpY2ggdGhpcyBhcmNoIHN1cHBvcnRzCiAgKi8KICNkZWZpbmUgTDFfQ0FDSEVfU0hJRlRfTUFYCTUKIAorI2lmIGRlZmluZWQoQ09ORklHX1NNUCkgJiYgXAorICAgICFkZWZpbmVkKENPTkZJR19CRklOX0NBQ0hFX0NPSEVSRU5UKSAmJiBcCisgICAgZGVmaW5lZChDT05GSUdfQkZJTl9EQ0FDSEUpCisjZGVmaW5lIF9fQVJDSF9TWU5DX0NPUkVfRENBQ0hFCisjaWZuZGVmIF9fQVNTRU1CTFlfXworYXNtbGlua2FnZSB2b2lkIF9fcmF3X3NtcF9tYXJrX2JhcnJpZXJfYXNtKHZvaWQpOworYXNtbGlua2FnZSB2b2lkIF9fcmF3X3NtcF9jaGVja19iYXJyaWVyX2FzbSh2b2lkKTsKKworc3RhdGljIGlubGluZSB2b2lkIHNtcF9tYXJrX2JhcnJpZXIodm9pZCkKK3sKKwlfX3Jhd19zbXBfbWFya19iYXJyaWVyX2FzbSgpOworfQorc3RhdGljIGlubGluZSB2b2lkIHNtcF9jaGVja19iYXJyaWVyKHZvaWQpCit7CisJX19yYXdfc21wX2NoZWNrX2JhcnJpZXJfYXNtKCk7Cit9CisKK3ZvaWQgcmVzeW5jX2NvcmVfZGNhY2hlKHZvaWQpOworI2VuZGlmCisjZW5kaWYKKworCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vY2FjaGVmbHVzaC5oIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9jYWNoZWZsdXNoLmgKaW5kZXggNDQwMzQxNS4uMWIwNDBmNSAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9jYWNoZWZsdXNoLmgKKysrIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9jYWNoZWZsdXNoLmgKQEAgLTM1LDYgKzM1LDcgQEAKIGV4dGVybiB2b2lkIGJsYWNrZmluX2RjYWNoZV9mbHVzaF9yYW5nZSh1bnNpZ25lZCBsb25nIHN0YXJ0X2FkZHJlc3MsIHVuc2lnbmVkIGxvbmcgZW5kX2FkZHJlc3MpOwogZXh0ZXJuIHZvaWQgYmxhY2tmaW5fZGNhY2hlX2ludmFsaWRhdGVfcmFuZ2UodW5zaWduZWQgbG9uZyBzdGFydF9hZGRyZXNzLCB1bnNpZ25lZCBsb25nIGVuZF9hZGRyZXNzKTsKIGV4dGVybiB2b2lkIGJsYWNrZmluX2RmbHVzaF9wYWdlKHZvaWQgKnBhZ2UpOworZXh0ZXJuIHZvaWQgYmxhY2tmaW5faW52YWxpZGF0ZV9lbnRpcmVfZGNhY2hlKHZvaWQpOwogCiAjZGVmaW5lIGZsdXNoX2RjYWNoZV9tbWFwX2xvY2sobWFwcGluZykJCWRvIHsgfSB3aGlsZSAoMCkKICNkZWZpbmUgZmx1c2hfZGNhY2hlX21tYXBfdW5sb2NrKG1hcHBpbmcpCWRvIHsgfSB3aGlsZSAoMCkKQEAgLTQ0LDEyICs0NSwyMCBAQAogI2RlZmluZSBmbHVzaF9jYWNoZV92bWFwKHN0YXJ0LCBlbmQpCQlkbyB7IH0gd2hpbGUgKDApCiAjZGVmaW5lIGZsdXNoX2NhY2hlX3Z1bm1hcChzdGFydCwgZW5kKQkJZG8geyB9IHdoaWxlICgwKQogCisjaWZkZWYgQ09ORklHX1NNUAorI2RlZmluZSBmbHVzaF9pY2FjaGVfcmFuZ2Vfb3RoZXJzKHN0YXJ0LCBlbmQpCVwKKwlzbXBfaWNhY2hlX2ZsdXNoX3JhbmdlX290aGVycygoc3RhcnQpLCAoZW5kKSkKKyNlbHNlCisjZGVmaW5lIGZsdXNoX2ljYWNoZV9yYW5nZV9vdGhlcnMoc3RhcnQsIGVuZCkJZG8geyB9IHdoaWxlICgwKQorI2VuZGlmCisKIHN0YXRpYyBpbmxpbmUgdm9pZCBmbHVzaF9pY2FjaGVfcmFuZ2UodW5zaWduZWQgc3RhcnQsIHVuc2lnbmVkIGVuZCkKIHsKICNpZiBkZWZpbmVkKENPTkZJR19CRklOX0RDQUNIRSkgJiYgZGVmaW5lZChDT05GSUdfQkZJTl9JQ0FDSEUpCiAKICMgaWYgZGVmaW5lZChDT05GSUdfQkZJTl9XVCkKIAlibGFja2Zpbl9pY2FjaGVfZmx1c2hfcmFuZ2UoKHN0YXJ0KSwgKGVuZCkpOworCWZsdXNoX2ljYWNoZV9yYW5nZV9vdGhlcnMoc3RhcnQsIGVuZCk7CiAjIGVsc2UKIAlibGFja2Zpbl9pY2FjaGVfZGNhY2hlX2ZsdXNoX3JhbmdlKChzdGFydCksIChlbmQpKTsKICMgZW5kaWYKQEAgLTU4LDYgKzY3LDcgQEAKIAogIyBpZiBkZWZpbmVkKENPTkZJR19CRklOX0lDQUNIRSkKIAlibGFja2Zpbl9pY2FjaGVfZmx1c2hfcmFuZ2UoKHN0YXJ0KSwgKGVuZCkpOworCWZsdXNoX2ljYWNoZV9yYW5nZV9vdGhlcnMoc3RhcnQsIGVuZCk7CiAjIGVuZGlmCiAjIGlmIGRlZmluZWQoQ09ORklHX0JGSU5fRENBQ0hFKQogCWJsYWNrZmluX2RjYWNoZV9mbHVzaF9yYW5nZSgoc3RhcnQpLCAoZW5kKSk7CkBAIC02NiwxMCArNzYsMTIgQEAKICNlbmRpZgogfQogCi0jZGVmaW5lIGNvcHlfdG9fdXNlcl9wYWdlKHZtYSwgcGFnZSwgdmFkZHIsIGRzdCwgc3JjLCBsZW4pIFwKLWRvIHsgbWVtY3B5KGRzdCwgc3JjLCBsZW4pOyBcCi0gICAgIGZsdXNoX2ljYWNoZV9yYW5nZSAoKHVuc2lnbmVkKSAoZHN0KSwgKHVuc2lnbmVkKSAoZHN0KSArIChsZW4pKTsgXAorI2RlZmluZSBjb3B5X3RvX3VzZXJfcGFnZSh2bWEsIHBhZ2UsIHZhZGRyLCBkc3QsIHNyYywgbGVuKQkJXAorZG8geyBtZW1jcHkoZHN0LCBzcmMsIGxlbik7CQkJCQkJXAorICAgICBmbHVzaF9pY2FjaGVfcmFuZ2UoKHVuc2lnbmVkKSAoZHN0KSwgKHVuc2lnbmVkKSAoZHN0KSArIChsZW4pKTsJXAorICAgICBmbHVzaF9pY2FjaGVfcmFuZ2Vfb3RoZXJzKCh1bnNpZ25lZCBsb25nKSAoZHN0KSwgKHVuc2lnbmVkIGxvbmcpIChkc3QpICsgKGxlbikpO1wKIH0gd2hpbGUgKDApCisKICNkZWZpbmUgY29weV9mcm9tX3VzZXJfcGFnZSh2bWEsIHBhZ2UsIHZhZGRyLCBkc3QsIHNyYywgbGVuKQltZW1jcHkoZHN0LCBzcmMsIGxlbikKIAogI2lmIGRlZmluZWQoQ09ORklHX0JGSU5fRENBQ0hFKQpAQCAtODIsNyArOTQsNyBAQAogIyBkZWZpbmUgZmx1c2hfZGNhY2hlX3BhZ2UocGFnZSkJCQlibGFja2Zpbl9kZmx1c2hfcGFnZShwYWdlX2FkZHJlc3MocGFnZSkpCiAjZWxzZQogIyBkZWZpbmUgZmx1c2hfZGNhY2hlX3JhbmdlKHN0YXJ0LGVuZCkJCWRvIHsgfSB3aGlsZSAoMCkKLSMgZGVmaW5lIGZsdXNoX2RjYWNoZV9wYWdlKHBhZ2UpCQkJZG8geyB9IHdoaWxlICgwKQorIyBkZWZpbmUgZmx1c2hfZGNhY2hlX3BhZ2UocGFnZSkJCWRvIHsgfSB3aGlsZSAoMCkKICNlbmRpZgogCiBleHRlcm4gdW5zaWduZWQgbG9uZyByZXNlcnZlZF9tZW1fZGNhY2hlX29uOwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9jaGVja3N1bS5oIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9jaGVja3N1bS5oCmluZGV4IDZmNmFmMmIuLmY2NzI4OWEgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vY2hlY2tzdW0uaAorKysgYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2NoZWNrc3VtLmgKQEAgLTc4LDcgKzc4LDggQEAKICAgICAgICAgICAgICAgICAgIiUwID0gJTAgKyAlNDtcblx0IgogICAgICAgICAgICAgICAgICAiTk9QO1xuXHQiCiAgCQkgOiAiPWQiIChzdW0pCi0JCSA6ICJkIiAoZGFkZHIpLCAiZCIgKHNhZGRyKSwgImQiICgobnRvaHMobGVuKTw8MTYpK3Byb3RvKjI1NiksICJkIiAoMSksICIwIihzdW0pKTsKKwkJIDogImQiIChkYWRkciksICJkIiAoc2FkZHIpLCAiZCIgKChudG9ocyhsZW4pPDwxNikrcHJvdG8qMjU2KSwgImQiICgxKSwgIjAiKHN1bSkKKwkJIDogIkNDIik7CiAKIAlyZXR1cm4gKHN1bSk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2NvbnRleHQuUyBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vY29udGV4dC5TCmluZGV4IGMwZTYzMGUuLjE2NTYxYWIgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vY29udGV4dC5TCisrKyBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vY29udGV4dC5TCkBAIC0zMDMsOSArMzAzLDE0IEBACiAJUkVUSSA9IFtzcCsrXTsKIAlSRVRTID0gW3NwKytdOwogCi0JcDAuaCA9IF9pcnFfZmxhZ3M7Ci0JcDAubCA9IF9pcnFfZmxhZ3M7CisjaWZkZWYgQ09ORklHX1NNUAorCUdFVF9QREEocDAsIHIwKTsKKwlyMCA9IFtwMCArIFBEQV9JUlFGTEFHU107CisjZWxzZQorCXAwLmggPSBfYmZpbl9pcnFfZmxhZ3M7CisJcDAubCA9IF9iZmluX2lycV9mbGFnczsKIAlyMCA9IFtwMF07CisjZW5kaWYKIAlzdGkgcjA7CiAKIAlzcCArPSA0OwkvKiBTa2lwIFJlc2VydmVkICovCkBAIC0zNTMsMyArMzU4LDQxIEBACiAJY3N5bmM7CiAuZW5kbQogCisubWFjcm8gc2F2ZV9jb250ZXh0X2NwbGIKKwlbLS1zcF0gPSAoUjc6MCwgUDU6MCk7CisJWy0tc3BdID0gZnA7CisKKwlbLS1zcF0gPSBhMC54OworCVstLXNwXSA9IGEwLnc7CisJWy0tc3BdID0gYTEueDsKKwlbLS1zcF0gPSBhMS53OworCisJWy0tc3BdID0gTEMwOworCVstLXNwXSA9IExDMTsKKwlbLS1zcF0gPSBMVDA7CisJWy0tc3BdID0gTFQxOworCVstLXNwXSA9IExCMDsKKwlbLS1zcF0gPSBMQjE7CisKKwlbLS1zcF0gPSBSRVRTOworLmVuZG0KKworLm1hY3JvIHJlc3RvcmVfY29udGV4dF9jcGxiCisJUkVUUyA9IFtzcCsrXTsKKworCUxCMSA9IFtzcCsrXTsKKwlMQjAgPSBbc3ArK107CisJTFQxID0gW3NwKytdOworCUxUMCA9IFtzcCsrXTsKKwlMQzEgPSBbc3ArK107CisJTEMwID0gW3NwKytdOworCisJYTEudyA9IFtzcCsrXTsKKwlhMS54ID0gW3NwKytdOworCWEwLncgPSBbc3ArK107CisJYTAueCA9IFtzcCsrXTsKKworCWZwID0gW3NwKytdOworCisJKFI3OjAsIFA1OjApID0gW1NQKytdOworLmVuZG0KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vY3BsYi1tcHUuaCBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vY3BsYi1tcHUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzVjNjdiOS4uMDAwMDAwMAotLS0gYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2NwbGItbXB1LmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKgotICogRmlsZTogICAgICAgICBpbmNsdWRlL2FzbS1ibGFja2Zpbi9jcGxiaW5pdC5oCi0gKiBCYXNlZCBvbjoKLSAqIEF1dGhvcjoKLSAqCi0gKiBDcmVhdGVkOgotICogRGVzY3JpcHRpb246Ci0gKgotICogTW9kaWZpZWQ6Ci0gKiAgICAgICAgICAgICAgIENvcHlyaWdodCAyMDA0LTIwMDYgQW5hbG9nIERldmljZXMgSW5jLgotICoKLSAqIEJ1Z3M6ICAgICAgICAgRW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCBzZWUgdGhlIGZpbGUgQ09QWUlORywgb3Igd3JpdGUKLSAqIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gKiA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotICovCi0jaWZuZGVmIF9fQVNNX0JGSU5fQ1BMQl9NUFVfSAotI2RlZmluZSBfX0FTTV9CRklOX0NQTEJfTVBVX0gKLQotc3RydWN0IGNwbGJfZW50cnkgewotCXVuc2lnbmVkIGxvbmcgZGF0YSwgYWRkcjsKLX07Ci0KLXN0cnVjdCBtZW1fcmVnaW9uIHsKLQl1bnNpZ25lZCBsb25nIHN0YXJ0LCBlbmQ7Ci0JdW5zaWduZWQgbG9uZyBkY3BsYl9kYXRhOwotCXVuc2lnbmVkIGxvbmcgaWNwbGJfZGF0YTsKLX07Ci0KLWV4dGVybiBzdHJ1Y3QgY3BsYl9lbnRyeSBkY3BsYl90YmxbTUFYX0NQTEJTXTsKLWV4dGVybiBzdHJ1Y3QgY3BsYl9lbnRyeSBpY3BsYl90YmxbTUFYX0NQTEJTXTsKLWV4dGVybiBpbnQgZmlyc3Rfc3dpdGNoZWRfaWNwbGI7Ci1leHRlcm4gaW50IGZpcnN0X21hc2tfZGNwbGI7Ci1leHRlcm4gaW50IGZpcnN0X3N3aXRjaGVkX2RjcGxiOwotCi1leHRlcm4gaW50IG5yX2RjcGxiX21pc3MsIG5yX2ljcGxiX21pc3MsIG5yX2ljcGxiX3N1cHZfbWlzcywgbnJfZGNwbGJfcHJvdDsKLWV4dGVybiBpbnQgbnJfY3BsYl9mbHVzaDsKLQotZXh0ZXJuIGludCBwYWdlX21hc2tfb3JkZXI7Ci1leHRlcm4gaW50IHBhZ2VfbWFza19uZWx0czsKLQotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgKmN1cnJlbnRfcnd4X21hc2s7Ci0KLWV4dGVybiB2b2lkIGZsdXNoX3N3aXRjaGVkX2NwbGJzKHZvaWQpOwotZXh0ZXJuIHZvaWQgc2V0X21hc2tfZGNwbGJzKHVuc2lnbmVkIGxvbmcgKik7Ci0KLWV4dGVybiB2b2lkIF9fbm9yZXR1cm4gcGFuaWNfY3BsYl9lcnJvcihpbnQgc2Vxc3RhdCwgc3RydWN0IHB0X3JlZ3MgKik7Ci0KLSNlbmRpZiAvKiBfX0FTTV9CRklOX0NQTEJfTVBVX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vY3BsYi5oIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9jcGxiLmgKaW5kZXggOWU4YjQwMy4uYWQ1NjZmZiAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9jcGxiLmgKKysrIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9jcGxiLmgKQEAgLTMwLDcgKzMwLDYgQEAKICNpZm5kZWYgX0NQTEJfSAogI2RlZmluZSBfQ1BMQl9ICiAKLSNpbmNsdWRlIDxhc20vYmxhY2tmaW4uaD4KICNpbmNsdWRlIDxtYWNoL2Fub21hbHkuaD4KIAogI2RlZmluZSBTRFJBTV9JR0VORVJJQyAgICAoQ1BMQl9MMV9DSEJMIHwgQ1BMQl9VU0VSX1JEIHwgQ1BMQl9WQUxJRCB8IENQTEJfUE9SVFBSSU8pCkBAIC01NSwxMyArNTQsMjQgQEAKICNlbmRpZgogCiAjZGVmaW5lIEwxX0RNRU1PUlkgICAgICAgKENQTEJfTE9DSyB8IENQTEJfQ09NTU9OKQorCisjaWZkZWYgQ09ORklHX1NNUAorI2RlZmluZSBMMl9BVFRSICAgICAgICAgICAoSU5JVElBTF9UIHwgSV9DUExCIHwgRF9DUExCKQorI2RlZmluZSBMMl9JTUVNT1JZICAgICAgICAgKENQTEJfQ09NTU9OIHwgQ1BMQl9MT0NLKQorI2RlZmluZSBMMl9ETUVNT1JZICAgICAgICAgKENQTEJfQ09NTU9OIHwgQ1BMQl9MT0NLKQorCisjZWxzZQogI2lmZGVmIENPTkZJR19CRklOX0wyX0NBQ0hFQUJMRQogI2RlZmluZSBMMl9JTUVNT1JZICAgICAgICAoU0RSQU1fSUdFTkVSSUMpCiAjZGVmaW5lIEwyX0RNRU1PUlkgICAgICAgIChTRFJBTV9ER0VORVJJQykKICNlbHNlCiAjZGVmaW5lIEwyX0lNRU1PUlkgICAgICAgIChDUExCX0NPTU1PTikKICNkZWZpbmUgTDJfRE1FTU9SWSAgICAgICAgKENQTEJfQ09NTU9OKQotI2VuZGlmCisjZW5kaWYgLyogQ09ORklHX0JGSU5fTDJfQ0FDSEVBQkxFICovCisKKyNkZWZpbmUgTDJfQVRUUiAgICAgICAgICAgKElOSVRJQUxfVCB8IFNXSVRDSF9UIHwgSV9DUExCIHwgRF9DUExCKQorI2VuZGlmIC8qIENPTkZJR19TTVAgKi8KKwogI2RlZmluZSBTRFJBTV9ETk9OX0NIQkwgIChDUExCX0NPTU1PTikKICNkZWZpbmUgU0RSQU1fRUJJVSAgICAgICAoQ1BMQl9DT01NT04pCiAjZGVmaW5lIFNEUkFNX09PUFMgICAgICAgKENQTEJfVkFMSUQgfCBBTk9NQUxZXzA1MDAwMTU4X1dPUktBUk9VTkQgfCBDUExCX0xPQ0sgfCBDUExCX0RJUlRZKQpAQCAtNzEsMTQgKzgxLDcgQEAKICNkZWZpbmUgU0laRV8xTSAweDAwMTAwMDAwICAgICAgLyogMU0gKi8KICNkZWZpbmUgU0laRV80TSAweDAwNDAwMDAwICAgICAgLyogNE0gKi8KIAotI2lmZGVmIENPTkZJR19NUFUKICNkZWZpbmUgTUFYX0NQTEJTIDE2Ci0jZWxzZQotI2RlZmluZSBNQVhfQ1BMQlMgKDE2ICogMikKLSNlbmRpZgotCi0jZGVmaW5lIEFTWU5DX01FTU9SWV9DUExCX0NPVkVSQUdFCSgoQVNZTkNfQkFOSzBfU0laRSArIEFTWU5DX0JBTksxX1NJWkUgKyBcCi0JCQkJIEFTWU5DX0JBTksyX1NJWkUgKyBBU1lOQ19CQU5LM19TSVpFKSAvIFNJWkVfNE0pCiAKICNkZWZpbmUgQ1BMQl9FTkFCTEVfSUNBQ0hFX1AJMAogI2RlZmluZSBDUExCX0VOQUJMRV9EQ0FDSEVfUAkxCkBAIC0xMTMsNCArMTE2LDggQEAKICNkZWZpbmUgQ1BMQl9JTk9DQUNIRSAgIAlDUExCX1VTRVJfUkQgfCBDUExCX1ZBTElECiAjZGVmaW5lIENQTEJfSURPQ0FDSEUgICAJQ1BMQl9JTk9DQUNIRSB8IENQTEJfTDFfQ0hCTAogCisjZGVmaW5lIEZBVUxUX1JXICAgICAgICAoMSA8PCAxNikKKyNkZWZpbmUgRkFVTFRfVVNFUlNVUFYgICgxIDw8IDE3KQorI2RlZmluZSBGQVVMVF9DUExCQklUUyAgMHgwMDAwZmZmZgorCiAjZW5kaWYJCQkJLyogX0NQTEJfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9jcGxiaW5pdC5oIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9jcGxiaW5pdC5oCmluZGV4IGY4NDViNDEuLjA1YjE0YTYgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vY3BsYmluaXQuaAorKysgYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2NwbGJpbml0LmgKQEAgLTMyLDYxICszMiw1NiBAQAogCiAjaW5jbHVkZSA8YXNtL2JsYWNrZmluLmg+CiAjaW5jbHVkZSA8YXNtL2NwbGIuaD4KKyNpbmNsdWRlIDxsaW51eC90aHJlYWRzLmg+CisKKyNpZmRlZiBDT05GSUdfQ1BMQl9TV0lUQ0hfVEFCX0wxCisjIGRlZmluZSBQRFRfQVRUUiBfX2F0dHJpYnV0ZV9fKChsMV9kYXRhKSkKKyNlbHNlCisjIGRlZmluZSBQRFRfQVRUUgorI2VuZGlmCisKK3N0cnVjdCBjcGxiX2VudHJ5IHsKKwl1bnNpZ25lZCBsb25nIGRhdGEsIGFkZHI7Cit9OworCitzdHJ1Y3QgY3BsYl9ib3VuZGFyeSB7CisJdW5zaWduZWQgbG9uZyBlYWRkcjsgLyogRW5kIG9mIHRoaXMgcmVnaW9uLiAgKi8KKwl1bnNpZ25lZCBsb25nIGRhdGE7IC8qIENQTEIgZGF0YSB2YWx1ZS4gICovCit9OworCitleHRlcm4gc3RydWN0IGNwbGJfYm91bmRhcnkgZGNwbGJfYm91bmRzW107CitleHRlcm4gc3RydWN0IGNwbGJfYm91bmRhcnkgaWNwbGJfYm91bmRzW107CitleHRlcm4gaW50IGRjcGxiX25yX2JvdW5kcywgaWNwbGJfbnJfYm91bmRzOworCitleHRlcm4gc3RydWN0IGNwbGJfZW50cnkgZGNwbGJfdGJsW05SX0NQVVNdW01BWF9DUExCU107CitleHRlcm4gc3RydWN0IGNwbGJfZW50cnkgaWNwbGJfdGJsW05SX0NQVVNdW01BWF9DUExCU107CitleHRlcm4gaW50IGZpcnN0X3N3aXRjaGVkX2ljcGxiOworZXh0ZXJuIGludCBmaXJzdF9zd2l0Y2hlZF9kY3BsYjsKKworZXh0ZXJuIGludCBucl9kY3BsYl9taXNzW10sIG5yX2ljcGxiX21pc3NbXSwgbnJfaWNwbGJfc3Vwdl9taXNzW107CitleHRlcm4gaW50IG5yX2RjcGxiX3Byb3RbXSwgbnJfY3BsYl9mbHVzaFtdOwogCiAjaWZkZWYgQ09ORklHX01QVQogCi0jaW5jbHVkZSA8YXNtL2NwbGItbXB1Lmg+CitleHRlcm4gaW50IGZpcnN0X21hc2tfZGNwbGI7CiAKLSNlbHNlCitleHRlcm4gaW50IHBhZ2VfbWFza19vcmRlcjsKK2V4dGVybiBpbnQgcGFnZV9tYXNrX25lbHRzOwogCi0jZGVmaW5lIElOSVRJQUxfVCAweDEKLSNkZWZpbmUgU1dJVENIX1QgIDB4MgotI2RlZmluZSBJX0NQTEIgICAgMHg0Ci0jZGVmaW5lIERfQ1BMQiAgICAweDgKK2V4dGVybiB1bnNpZ25lZCBsb25nICpjdXJyZW50X3J3eF9tYXNrW05SX0NQVVNdOwogCi0jZGVmaW5lIElOX0tFUk5FTCAxCitleHRlcm4gdm9pZCBmbHVzaF9zd2l0Y2hlZF9jcGxicyh1bnNpZ25lZCBpbnQpOworZXh0ZXJuIHZvaWQgc2V0X21hc2tfZGNwbGJzKHVuc2lnbmVkIGxvbmcgKiwgdW5zaWduZWQgaW50KTsKIAotZW51bQote1pFUk9fUCwgTDFJX01FTSwgTDFEX01FTSwgU0RSQU1fS0VSTiAsIFNEUkFNX1JBTV9NVEQsIFNEUkFNX0RNQVosIFJFU19NRU0sIEFTWU5DX01FTSwgTDJfTUVNfTsKLQotc3RydWN0IGNwbGJfZGVzYyB7Ci0JdTMyIHN0YXJ0OyAvKiBzdGFydCBhZGRyZXNzICovCi0JdTMyIGVuZDsgLyogZW5kIGFkZHJlc3MgKi8KLQl1MzIgcHNpemU7IC8qIHByZWZlcmVkIHNpemUgaWYgYW55IG90aGVyd2lzZSAxTUIgb3IgNE1CKi8KLQl1MTYgYXR0cjsvKiBhdHRyaWJ1dGVzICovCi0JdTE2IGlfY29uZjsvKiBJLUNQTEIgREFUQSAqLwotCXUxNiBkX2NvbmY7LyogRC1DUExCIERBVEEgKi8KLQl1MTYgdmFsaWQ7LyogdmFsaWQgKi8KLQljb25zdCBzOCBuYW1lWzMwXTsvKiBuYW1lICovCi19OwotCi1zdHJ1Y3QgY3BsYl90YWIgewotICB1X2xvbmcgKnRhYjsKLQl1MTYgcG9zOwotCXUxNiBzaXplOwotfTsKLQotZXh0ZXJuIHVfbG9uZyBpY3BsYl90YWJsZVtdOwotZXh0ZXJuIHVfbG9uZyBkY3BsYl90YWJsZVtdOwotCi0vKiBUaWxsIGhlcmUgd2UgYXJlIGRpc2N1c3NpbmcgYWJvdXQgdGhlIHN0YXRpYyBtZW1vcnkgbWFuYWdlbWVudCBtb2RlbC4KLSAqIEhvd2V2ZXIsIHRoZSBvcGVyYXRpbmcgZW52b3Jvbm1lbnRzIGNvbW1vbmx5IGRlZmluZSBtb3JlIENQTEIKLSAqIGRlc2NyaXB0b3JzIHRvIGNvdmVyIHRoZSBlbnRpcmUgYWRkcmVzc2FibGUgbWVtb3J5IHRoYW4gd2lsbCBmaXQgaW50bwotICogdGhlIGF2YWlsYWJsZSBvbi1jaGlwIDE2IENQTEIgTU1Scy4gV2hlbiB0aGlzIGhhcHBlbnMsIHRoZSBiZWxvdyB0YWJsZQotICogd2lsbCBiZSB1c2VkIHdoaWNoIHdpbGwgaG9sZCBhbGwgdGhlIHBvdGVudGlhbGx5IHJlcXVpcmVkIENQTEIgZGVzY3JpcHRvcnMKLSAqCi0gKiBUaGlzIGlzIGhvdyBQYWdlIGRlc2NyaXB0b3IgVGFibGUgaXMgaW1wbGVtZW50ZWQgaW4gdUNsaW51eC9CbGFja2Zpbi4KLSAqLwotCi1leHRlcm4gdV9sb25nIGlwZHRfdGFibGVbXTsKLWV4dGVybiB1X2xvbmcgZHBkdF90YWJsZVtdOwotI2lmZGVmIENPTkZJR19DUExCX0lORk8KLWV4dGVybiB1X2xvbmcgaXBkdF9zd2FwY291bnRfdGFibGVbXTsKLWV4dGVybiB1X2xvbmcgZHBkdF9zd2FwY291bnRfdGFibGVbXTsKLSNlbmRpZgorZXh0ZXJuIHZvaWQgX19ub3JldHVybiBwYW5pY19jcGxiX2Vycm9yKGludCBzZXFzdGF0LCBzdHJ1Y3QgcHRfcmVncyAqKTsKIAogI2VuZGlmIC8qIENPTkZJR19NUFUgKi8KIAotZXh0ZXJuIHZvaWQgZ2VuZXJhdGVfY3BsYl90YWJsZXModm9pZCk7CitleHRlcm4gdm9pZCBiZmluX2ljYWNoZV9pbml0KHN0cnVjdCBjcGxiX2VudHJ5ICppY3BsYl90YmwpOworZXh0ZXJuIHZvaWQgYmZpbl9kY2FjaGVfaW5pdChzdHJ1Y3QgY3BsYl9lbnRyeSAqaWNwbGJfdGJsKTsKIAorI2lmIGRlZmluZWQoQ09ORklHX0JGSU5fRENBQ0hFKSB8fCBkZWZpbmVkKENPTkZJR19CRklOX0lDQUNIRSkKK2V4dGVybiB2b2lkIGdlbmVyYXRlX2NwbGJfdGFibGVzX2FsbCh2b2lkKTsKK2V4dGVybiB2b2lkIGdlbmVyYXRlX2NwbGJfdGFibGVzX2NwdSh1bnNpZ25lZCBpbnQgY3B1KTsKKyNlbmRpZgogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2NwdS5oIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9jcHUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjU5NGVmCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9jcHUuaApAQCAtMCwwICsxLDQxIEBACisvKgorICogRmlsZTogICAgICAgICBhcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2NwdS5oLgorICogQXV0aG9yOiAgICAgICBQaGlsaXBwZSBHZXJ1bSA8cnBtQHhlbm9tYWkub3JnPgorICoKKyAqICAgICAgICAgICAgICAgQ29weXJpZ2h0IDIwMDcgQW5hbG9nIERldmljZXMgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIHRoZSBmaWxlIENPUFlJTkcsIG9yIHdyaXRlCisgKiB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqLworCisjaWZuZGVmIF9fQVNNX0JMQUNLRklOX0NQVV9ICisjZGVmaW5lIF9fQVNNX0JMQUNLRklOX0NQVV9ICisKKyNpbmNsdWRlIDxsaW51eC9wZXJjcHUuaD4KKworc3RydWN0IHRhc2tfc3RydWN0OworCitzdHJ1Y3QgYmxhY2tmaW5fY3B1ZGF0YSB7CisJc3RydWN0IGNwdSBjcHU7CisJc3RydWN0IHRhc2tfc3RydWN0ICppZGxlOworCXVuc2lnbmVkIGludCBpbWVtY3RsOworCXVuc2lnbmVkIGludCBkbWVtY3RsOworCXVuc2lnbmVkIGxvbmcgbG9vcHNfcGVyX2ppZmZ5OworCXVuc2lnbmVkIGxvbmcgZGNhY2hlX2ludmxkX2NvdW50OworfTsKKworREVDTEFSRV9QRVJfQ1BVKHN0cnVjdCBibGFja2Zpbl9jcHVkYXRhLCBjcHVfZGF0YSk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9kbWEuaCBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vZG1hLmgKaW5kZXggNjUwOTczMy4uZTRmN2I4MCAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9kbWEuaAorKysgYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2RtYS5oCkBAIC0xLDQ0ICsxLDE3IEBACiAvKgotICogRmlsZTogICAgICAgICBpbmNsdWRlL2FzbS1ibGFja2Zpbi9zaW1wbGVfYmY1MzNfZG1hLmgKLSAqIEJhc2VkIG9uOiAgICAgbm9uZSAtIG9yaWdpbmFsIHdvcmsKLSAqIEF1dGhvcjogICAgICAgTEcgU29mdCBJbmRpYQotICogICAgICAgICAgICAgICBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNSBBbmFsb2cgRGV2aWNlcyBJbmMuCi0gKiBDcmVhdGVkOiAgICAgIFR1ZSBTZXAgMjEgMjAwNAotICogRGVzY3JpcHRpb246ICBUaGlzIGZpbGUgY29udGFpbnMgdGhlIG1ham9yIERhdGEgc3RydWN0dXJlcyBhbmQgY29uc3RhbnRzCi0gKiAJCSB1c2VkIGZvciBETUEgSW1wbGVtZW50YXRpb24gaW4gQkY1MzMKLSAqIE1vZGlmaWVkOgorICogZG1hLmggLSBCbGFja2ZpbiBETUEgZGVmaW5lcy9zdHJ1Y3R1cmVzL2V0Yy4uLgogICoKLSAqIEJ1Z3M6ICAgICAgICAgRW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gKiBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuCi0gKiBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICogQ29weXJpZ2h0IDIwMDQtMjAwOCBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCiAgKi8KIAogI2lmbmRlZiBfQkxBQ0tGSU5fRE1BX0hfCiAjZGVmaW5lIF9CTEFDS0ZJTl9ETUFfSF8KIAotI2luY2x1ZGUgPGFzbS9pby5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxhc20vaXJxLmg+Ci0jaW5jbHVkZSA8YXNtL3NpZ25hbC5oPgotCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bWFjaC9kbWEuaD4KLSNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPG1hY2gvZG1hLmg+CiAjaW5jbHVkZSA8YXNtL2JsYWNrZmluLmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KIAogI2RlZmluZSBNQVhfRE1BX0FERFJFU1MgUEFHRV9PRkZTRVQKIApAQCAtNzksNyArNTIsNyBAQAogI2RlZmluZSBETUFfU1lOQ19SRVNUQVJUCTEKIAogc3RydWN0IGRtYXNnIHsKLQl1bnNpZ25lZCBsb25nIG5leHRfZGVzY19hZGRyOworCXZvaWQgKm5leHRfZGVzY19hZGRyOwogCXVuc2lnbmVkIGxvbmcgc3RhcnRfYWRkcjsKIAl1bnNpZ25lZCBzaG9ydCBjZmc7CiAJdW5zaWduZWQgc2hvcnQgeF9jb3VudDsKQEAgLTg5LDcgKzYyLDcgQEAKIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CiAKIHN0cnVjdCBkbWFfcmVnaXN0ZXIgewotCXVuc2lnbmVkIGxvbmcgbmV4dF9kZXNjX3B0cjsJLyogRE1BIE5leHQgRGVzY3JpcHRvciBQb2ludGVyIHJlZ2lzdGVyICovCisJdm9pZCAqbmV4dF9kZXNjX3B0cjsJLyogRE1BIE5leHQgRGVzY3JpcHRvciBQb2ludGVyIHJlZ2lzdGVyICovCiAJdW5zaWduZWQgbG9uZyBzdGFydF9hZGRyOwkvKiBETUEgU3RhcnQgYWRkcmVzcyAgcmVnaXN0ZXIgKi8KIAogCXVuc2lnbmVkIHNob3J0IGNmZzsJLyogRE1BIENvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgKi8KQEAgLTEwOSw3ICs4Miw3IEBACiAJc2hvcnQgeV9tb2RpZnk7CS8qIERNQSB5X21vZGlmeSByZWdpc3RlciAqLwogCXVuc2lnbmVkIHNob3J0IGR1bW15NTsKIAotCXVuc2lnbmVkIGxvbmcgY3Vycl9kZXNjX3B0cjsJLyogRE1BIEN1cnJlbnQgRGVzY3JpcHRvciBQb2ludGVyCisJdm9pZCAqY3Vycl9kZXNjX3B0cjsJLyogRE1BIEN1cnJlbnQgRGVzY3JpcHRvciBQb2ludGVyCiAJCQkJCSAgIHJlZ2lzdGVyICovCiAJdW5zaWduZWQgbG9uZyBjdXJyX2FkZHJfcHRyOwkvKiBETUEgQ3VycmVudCBBZGRyZXNzIFBvaW50ZXIKIAkJCQkJCSAgIHJlZ2lzdGVyICovCkBAIC0xMzEsMTkgKzEwNCwxNSBAQAogCiB9OwogCi10eXBlZGVmIGlycXJldHVybl90KCpkbWFfaW50ZXJydXB0X3QpIChpbnQgaXJxLCB2b2lkICpkZXZfaWQpOwotCitzdHJ1Y3QgbXV0ZXg7CiBzdHJ1Y3QgZG1hX2NoYW5uZWwgewogCXN0cnVjdCBtdXRleCBkbWFsb2NrOwotCWNoYXIgKmRldmljZV9pZDsKKwljb25zdCBjaGFyICpkZXZpY2VfaWQ7CiAJZW51bSBkbWFfY2hhbl9zdGF0dXMgY2hhbl9zdGF0dXM7Ci0Jc3RydWN0IGRtYV9yZWdpc3RlciAqcmVnczsKKwl2b2xhdGlsZSBzdHJ1Y3QgZG1hX3JlZ2lzdGVyICpyZWdzOwogCXN0cnVjdCBkbWFzZyAqc2c7CQkvKiBsYXJnZSBtb2RlIGRlc2NyaXB0b3IgKi8KLQl1bnNpZ25lZCBpbnQgY3RybF9udW07CS8qIGNvbnRyb2xsZXIgbnVtYmVyICovCi0JZG1hX2ludGVycnVwdF90IGlycV9jYWxsYmFjazsKKwl1bnNpZ25lZCBpbnQgaXJxOwogCXZvaWQgKmRhdGE7Ci0JdW5zaWduZWQgaW50IGRtYV9lbmFibGVfZmxhZzsKLQl1bnNpZ25lZCBpbnQgbG9vcGJhY2tfZmxhZzsKICNpZmRlZiBDT05GSUdfUE0KIAl1bnNpZ25lZCBzaG9ydCBzYXZlZF9wZXJpcGhlcmFsX21hcDsKICNlbmRpZgpAQCAtMTU3LDQ5ICsxMjYsMTMyIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKglETUEgQVBJJ3MKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBmdW5jdGlvbnMgdG8gc2V0IHJlZ2lzdGVyIG1vZGUgKi8KLXZvaWQgc2V0X2RtYV9zdGFydF9hZGRyKHVuc2lnbmVkIGludCBjaGFubmVsLCB1bnNpZ25lZCBsb25nIGFkZHIpOwotdm9pZCBzZXRfZG1hX25leHRfZGVzY19hZGRyKHVuc2lnbmVkIGludCBjaGFubmVsLCB1bnNpZ25lZCBsb25nIGFkZHIpOwotdm9pZCBzZXRfZG1hX2N1cnJfZGVzY19hZGRyKHVuc2lnbmVkIGludCBjaGFubmVsLCB1bnNpZ25lZCBsb25nIGFkZHIpOwotdm9pZCBzZXRfZG1hX3hfY291bnQodW5zaWduZWQgaW50IGNoYW5uZWwsIHVuc2lnbmVkIHNob3J0IHhfY291bnQpOwotdm9pZCBzZXRfZG1hX3hfbW9kaWZ5KHVuc2lnbmVkIGludCBjaGFubmVsLCBzaG9ydCB4X21vZGlmeSk7Ci12b2lkIHNldF9kbWFfeV9jb3VudCh1bnNpZ25lZCBpbnQgY2hhbm5lbCwgdW5zaWduZWQgc2hvcnQgeV9jb3VudCk7Ci12b2lkIHNldF9kbWFfeV9tb2RpZnkodW5zaWduZWQgaW50IGNoYW5uZWwsIHNob3J0IHlfbW9kaWZ5KTsKLXZvaWQgc2V0X2RtYV9jb25maWcodW5zaWduZWQgaW50IGNoYW5uZWwsIHVuc2lnbmVkIHNob3J0IGNvbmZpZyk7Ci11bnNpZ25lZCBzaG9ydCBzZXRfYmZpbl9kbWFfY29uZmlnKGNoYXIgZGlyZWN0aW9uLCBjaGFyIGZsb3dfbW9kZSwKLQkJCQkgICBjaGFyIGludHJfbW9kZSwgY2hhciBkbWFfbW9kZSwgY2hhciB3aWR0aCwKLQkJCQkgICBjaGFyIHN5bmNtb2RlKTsKLXZvaWQgc2V0X2RtYV9jdXJyX2FkZHIodW5zaWduZWQgaW50IGNoYW5uZWwsIHVuc2lnbmVkIGxvbmcgYWRkcik7CitleHRlcm4gc3RydWN0IGRtYV9jaGFubmVsIGRtYV9jaFtNQVhfRE1BX0NIQU5ORUxTXTsKK2V4dGVybiBzdHJ1Y3QgZG1hX3JlZ2lzdGVyICpkbWFfaW9fYmFzZV9hZGRyW01BWF9ETUFfQ0hBTk5FTFNdOworZXh0ZXJuIGludCBjaGFubmVsMmlycSh1bnNpZ25lZCBpbnQgY2hhbm5lbCk7CiAKLS8qIGdldCBjdXJyIHN0YXR1cyBmb3IgcG9sbGluZyAqLwotdW5zaWduZWQgc2hvcnQgZ2V0X2RtYV9jdXJyX2lycXN0YXQodW5zaWduZWQgaW50IGNoYW5uZWwpOwotdW5zaWduZWQgc2hvcnQgZ2V0X2RtYV9jdXJyX3hjb3VudCh1bnNpZ25lZCBpbnQgY2hhbm5lbCk7Ci11bnNpZ25lZCBzaG9ydCBnZXRfZG1hX2N1cnJfeWNvdW50KHVuc2lnbmVkIGludCBjaGFubmVsKTsKLXVuc2lnbmVkIGxvbmcgZ2V0X2RtYV9uZXh0X2Rlc2NfcHRyKHVuc2lnbmVkIGludCBjaGFubmVsKTsKLXVuc2lnbmVkIGxvbmcgZ2V0X2RtYV9jdXJyX2Rlc2NfcHRyKHVuc2lnbmVkIGludCBjaGFubmVsKTsKLXVuc2lnbmVkIGxvbmcgZ2V0X2RtYV9jdXJyX2FkZHIodW5zaWduZWQgaW50IGNoYW5uZWwpOworc3RhdGljIGlubGluZSB2b2lkIHNldF9kbWFfc3RhcnRfYWRkcih1bnNpZ25lZCBpbnQgY2hhbm5lbCwgdW5zaWduZWQgbG9uZyBhZGRyKQoreworCWRtYV9jaFtjaGFubmVsXS5yZWdzLT5zdGFydF9hZGRyID0gYWRkcjsKK30KK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfZG1hX25leHRfZGVzY19hZGRyKHVuc2lnbmVkIGludCBjaGFubmVsLCB2b2lkICphZGRyKQoreworCWRtYV9jaFtjaGFubmVsXS5yZWdzLT5uZXh0X2Rlc2NfcHRyID0gYWRkcjsKK30KK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfZG1hX2N1cnJfZGVzY19hZGRyKHVuc2lnbmVkIGludCBjaGFubmVsLCB2b2lkICphZGRyKQoreworCWRtYV9jaFtjaGFubmVsXS5yZWdzLT5jdXJyX2Rlc2NfcHRyID0gYWRkcjsKK30KK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfZG1hX3hfY291bnQodW5zaWduZWQgaW50IGNoYW5uZWwsIHVuc2lnbmVkIHNob3J0IHhfY291bnQpCit7CisJZG1hX2NoW2NoYW5uZWxdLnJlZ3MtPnhfY291bnQgPSB4X2NvdW50OworfQorc3RhdGljIGlubGluZSB2b2lkIHNldF9kbWFfeV9jb3VudCh1bnNpZ25lZCBpbnQgY2hhbm5lbCwgdW5zaWduZWQgc2hvcnQgeV9jb3VudCkKK3sKKwlkbWFfY2hbY2hhbm5lbF0ucmVncy0+eV9jb3VudCA9IHlfY291bnQ7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X2RtYV94X21vZGlmeSh1bnNpZ25lZCBpbnQgY2hhbm5lbCwgc2hvcnQgeF9tb2RpZnkpCit7CisJZG1hX2NoW2NoYW5uZWxdLnJlZ3MtPnhfbW9kaWZ5ID0geF9tb2RpZnk7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X2RtYV95X21vZGlmeSh1bnNpZ25lZCBpbnQgY2hhbm5lbCwgc2hvcnQgeV9tb2RpZnkpCit7CisJZG1hX2NoW2NoYW5uZWxdLnJlZ3MtPnlfbW9kaWZ5ID0geV9tb2RpZnk7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X2RtYV9jb25maWcodW5zaWduZWQgaW50IGNoYW5uZWwsIHVuc2lnbmVkIHNob3J0IGNvbmZpZykKK3sKKwlkbWFfY2hbY2hhbm5lbF0ucmVncy0+Y2ZnID0gY29uZmlnOworfQorc3RhdGljIGlubGluZSB2b2lkIHNldF9kbWFfY3Vycl9hZGRyKHVuc2lnbmVkIGludCBjaGFubmVsLCB1bnNpZ25lZCBsb25nIGFkZHIpCit7CisJZG1hX2NoW2NoYW5uZWxdLnJlZ3MtPmN1cnJfYWRkcl9wdHIgPSBhZGRyOworfQogCi0vKiBzZXQgbGFyZ2UgRE1BIG1vZGUgZGVzY3JpcHRvciAqLwotdm9pZCBzZXRfZG1hX3NnKHVuc2lnbmVkIGludCBjaGFubmVsLCBzdHJ1Y3QgZG1hc2cgKnNnLCBpbnQgbnJfc2cpOworc3RhdGljIGlubGluZSB1bnNpZ25lZCBzaG9ydAorc2V0X2JmaW5fZG1hX2NvbmZpZyhjaGFyIGRpcmVjdGlvbiwgY2hhciBmbG93X21vZGUsCisJCSAgICBjaGFyIGludHJfbW9kZSwgY2hhciBkbWFfbW9kZSwgY2hhciB3aWR0aCwgY2hhciBzeW5jbW9kZSkKK3sKKwlyZXR1cm4gKGRpcmVjdGlvbiA8PCAxKSB8ICh3aWR0aCA8PCAyKSB8IChkbWFfbW9kZSA8PCA0KSB8CisJCShpbnRyX21vZGUgPDwgNikgfCAoZmxvd19tb2RlIDw8IDEyKSB8IChzeW5jbW9kZSA8PCA1KTsKK30KIAotLyogY2hlY2sgaWYgY3VycmVudCBjaGFubmVsIGlzIGluIHVzZSAqLwotaW50IGRtYV9jaGFubmVsX2FjdGl2ZSh1bnNpZ25lZCBpbnQgY2hhbm5lbCk7CitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIHNob3J0IGdldF9kbWFfY3Vycl9pcnFzdGF0KHVuc2lnbmVkIGludCBjaGFubmVsKQoreworCXJldHVybiBkbWFfY2hbY2hhbm5lbF0ucmVncy0+aXJxX3N0YXR1czsKK30KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgc2hvcnQgZ2V0X2RtYV9jdXJyX3hjb3VudCh1bnNpZ25lZCBpbnQgY2hhbm5lbCkKK3sKKwlyZXR1cm4gZG1hX2NoW2NoYW5uZWxdLnJlZ3MtPmN1cnJfeF9jb3VudDsKK30KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgc2hvcnQgZ2V0X2RtYV9jdXJyX3ljb3VudCh1bnNpZ25lZCBpbnQgY2hhbm5lbCkKK3sKKwlyZXR1cm4gZG1hX2NoW2NoYW5uZWxdLnJlZ3MtPmN1cnJfeV9jb3VudDsKK30KK3N0YXRpYyBpbmxpbmUgdm9pZCAqZ2V0X2RtYV9uZXh0X2Rlc2NfcHRyKHVuc2lnbmVkIGludCBjaGFubmVsKQoreworCXJldHVybiBkbWFfY2hbY2hhbm5lbF0ucmVncy0+bmV4dF9kZXNjX3B0cjsKK30KK3N0YXRpYyBpbmxpbmUgdm9pZCAqZ2V0X2RtYV9jdXJyX2Rlc2NfcHRyKHVuc2lnbmVkIGludCBjaGFubmVsKQoreworCXJldHVybiBkbWFfY2hbY2hhbm5lbF0ucmVncy0+Y3Vycl9kZXNjX3B0cjsKK30KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgc2hvcnQgZ2V0X2RtYV9jb25maWcodW5zaWduZWQgaW50IGNoYW5uZWwpCit7CisJcmV0dXJuIGRtYV9jaFtjaGFubmVsXS5yZWdzLT5jZmc7Cit9CitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgZ2V0X2RtYV9jdXJyX2FkZHIodW5zaWduZWQgaW50IGNoYW5uZWwpCit7CisJcmV0dXJuIGRtYV9jaFtjaGFubmVsXS5yZWdzLT5jdXJyX2FkZHJfcHRyOworfQogCi0vKiBjb21tb24gZnVuY3Rpb25zIG11c3QgYmUgY2FsbGVkIGluIGFueSBtb2RlICovCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X2RtYV9zZyh1bnNpZ25lZCBpbnQgY2hhbm5lbCwgc3RydWN0IGRtYXNnICpzZywgaW50IG5kc2l6ZSkKK3sKKwlkbWFfY2hbY2hhbm5lbF0ucmVncy0+Y2ZnID0KKwkJKGRtYV9jaFtjaGFubmVsXS5yZWdzLT5jZmcgJiB+KDB4ZiA8PCA4KSkgfAorCQkoKG5kc2l6ZSAmIDB4ZikgPDwgOCk7CisJZG1hX2NoW2NoYW5uZWxdLnJlZ3MtPm5leHRfZGVzY19wdHIgPSBzZzsKK30KKworc3RhdGljIGlubGluZSBpbnQgZG1hX2NoYW5uZWxfYWN0aXZlKHVuc2lnbmVkIGludCBjaGFubmVsKQoreworCWlmIChkbWFfY2hbY2hhbm5lbF0uY2hhbl9zdGF0dXMgPT0gRE1BX0NIQU5ORUxfRlJFRSkKKwkJcmV0dXJuIDA7CisJZWxzZQorCQlyZXR1cm4gMTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGRpc2FibGVfZG1hKHVuc2lnbmVkIGludCBjaGFubmVsKQoreworCWRtYV9jaFtjaGFubmVsXS5yZWdzLT5jZmcgJj0gfkRNQUVOOworCVNTWU5DKCk7CisJZG1hX2NoW2NoYW5uZWxdLmNoYW5fc3RhdHVzID0gRE1BX0NIQU5ORUxfUkVRVUVTVEVEOworfQorc3RhdGljIGlubGluZSB2b2lkIGVuYWJsZV9kbWEodW5zaWduZWQgaW50IGNoYW5uZWwpCit7CisJZG1hX2NoW2NoYW5uZWxdLnJlZ3MtPmN1cnJfeF9jb3VudCA9IDA7CisJZG1hX2NoW2NoYW5uZWxdLnJlZ3MtPmN1cnJfeV9jb3VudCA9IDA7CisJZG1hX2NoW2NoYW5uZWxdLnJlZ3MtPmNmZyB8PSBETUFFTjsKKwlkbWFfY2hbY2hhbm5lbF0uY2hhbl9zdGF0dXMgPSBETUFfQ0hBTk5FTF9FTkFCTEVEOworfQogdm9pZCBmcmVlX2RtYSh1bnNpZ25lZCBpbnQgY2hhbm5lbCk7Ci1pbnQgZG1hX2NoYW5uZWxfYWN0aXZlKHVuc2lnbmVkIGludCBjaGFubmVsKTsgLyogY2hlY2sgaWYgYSBjaGFubmVsIGlzIGluIHVzZSAqLwotdm9pZCBkaXNhYmxlX2RtYSh1bnNpZ25lZCBpbnQgY2hhbm5lbCk7Ci12b2lkIGVuYWJsZV9kbWEodW5zaWduZWQgaW50IGNoYW5uZWwpOwotaW50IHJlcXVlc3RfZG1hKHVuc2lnbmVkIGludCBjaGFubmVsLCBjaGFyICpkZXZpY2VfaWQpOwotaW50IHNldF9kbWFfY2FsbGJhY2sodW5zaWduZWQgaW50IGNoYW5uZWwsIGRtYV9pbnRlcnJ1cHRfdCBjYWxsYmFjaywKLQkJICAgICB2b2lkICpkYXRhKTsKLXZvaWQgZG1hX2Rpc2FibGVfaXJxKHVuc2lnbmVkIGludCBjaGFubmVsKTsKLXZvaWQgZG1hX2VuYWJsZV9pcnEodW5zaWduZWQgaW50IGNoYW5uZWwpOwotdm9pZCBjbGVhcl9kbWFfaXJxc3RhdCh1bnNpZ25lZCBpbnQgY2hhbm5lbCk7CitpbnQgcmVxdWVzdF9kbWEodW5zaWduZWQgaW50IGNoYW5uZWwsIGNvbnN0IGNoYXIgKmRldmljZV9pZCk7CitpbnQgc2V0X2RtYV9jYWxsYmFjayh1bnNpZ25lZCBpbnQgY2hhbm5lbCwgaXJxX2hhbmRsZXJfdCBjYWxsYmFjaywgdm9pZCAqZGF0YSk7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkbWFfZGlzYWJsZV9pcnEodW5zaWduZWQgaW50IGNoYW5uZWwpCit7CisJZGlzYWJsZV9pcnEoZG1hX2NoW2NoYW5uZWxdLmlycSk7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgZG1hX2VuYWJsZV9pcnEodW5zaWduZWQgaW50IGNoYW5uZWwpCit7CisJZW5hYmxlX2lycShkbWFfY2hbY2hhbm5lbF0uaXJxKTsKK30KK3N0YXRpYyBpbmxpbmUgdm9pZCBjbGVhcl9kbWFfaXJxc3RhdCh1bnNpZ25lZCBpbnQgY2hhbm5lbCkKK3sKKwlkbWFfY2hbY2hhbm5lbF0ucmVncy0+aXJxX3N0YXR1cyA9IERNQV9ET05FIHwgRE1BX0VSUjsKK30KKwogdm9pZCAqZG1hX21lbWNweSh2b2lkICpkZXN0LCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBjb3VudCk7CiB2b2lkICpzYWZlX2RtYV9tZW1jcHkodm9pZCAqZGVzdCwgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3QgY291bnQpOwotCi1leHRlcm4gaW50IGNoYW5uZWwyaXJxKHVuc2lnbmVkIGludCBjaGFubmVsKTsKLWV4dGVybiBzdHJ1Y3QgZG1hX3JlZ2lzdGVyICpkbWFfaW9fYmFzZV9hZGRyW01BWF9CTEFDS0ZJTl9ETUFfQ0hBTk5FTF07Cit2b2lkIGJsYWNrZmluX2RtYV9lYXJseV9pbml0KHZvaWQpOwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vZW50cnkuaCBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vZW50cnkuaAppbmRleCBjNGY3MjFlLi5iMzBhMjk2IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2VudHJ5LmgKKysrIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9lbnRyeS5oCkBAIC0yNyw2ICsyNywxNCBAQAogI2RlZmluZSBTQVZFX0FMTF9TWVMJCXNhdmVfY29udGV4dF9ub19pbnRlcnJ1cHRzCiAvKiBUaGlzIGlzIHVzZWQgZm9yIGFsbCBub3JtYWwgaW50ZXJydXB0cy4gIEl0IHNhdmVzIGEgbWluaW11bSBvZiByZWdpc3RlcnMKICAgIHRvIHRoZSBzdGFjaywgbG9hZHMgdGhlIElSUSBudW1iZXIsIGFuZCBqdW1wcyB0byBjb21tb24gY29kZS4gICovCisjaWZkZWYgQ09ORklHX0lQSVBFCisjIGRlZmluZSBMT0FEX0lQSVBFX0lQRU5EIFwKKwlQMC5sID0gbG8oSVBFTkQpOyBcCisJUDAuaCA9IGhpKElQRU5EKTsgXAorCVIxID0gW1AwXTsKKyNlbHNlCisjIGRlZmluZSBMT0FEX0lQSVBFX0lQRU5ECisjZW5kaWYKICNkZWZpbmUgSU5URVJSVVBUX0VOVFJZKE4pCQkJCQkJXAogICAgIFstLXNwXSA9IFNZU0NGRzsJCQkJCQkJXAogCQkJCQkJCQkJXApAQCAtMzQsNiArNDIsNyBAQAogICAgIFstLXNwXSA9IFIwOwkvKm9yaWdfcjAqLwkJCQkJXAogICAgIFstLXNwXSA9IChSNzowLFA1OjApOwkJCQkJCVwKICAgICBSMCA9IChOKTsJCQkJCQkJCVwKKyAgICBMT0FEX0lQSVBFX0lQRU5ECQkJCQkJCVwKICAgICBqdW1wIF9fY29tbW9uX2ludF9lbnRyeTsKIAogLyogRm9yIHRpbWVyIGludGVycnVwdHMsIHdlIG5lZWQgdG8gc2F2ZSBJUEVORCwgc2luY2UgdGhlIHVzZXJfbW9kZQpAQCAtNTMsOSArNjIsMTEgQEAKIC8qIFRoaXMgb25lIHB1c2hlcyBSRVRJIHdpdGhvdXQgdXNpbmcgQ0xJLiAgSW50ZXJydXB0cyBhcmUgZW5hYmxlZC4gICovCiAjZGVmaW5lIFNBVkVfQ09OVEVYVF9TWVNDQUxMCXNhdmVfY29udGV4dF9zeXNjYWxsCiAjZGVmaW5lIFNBVkVfQ09OVEVYVAkJc2F2ZV9jb250ZXh0X3dpdGhfaW50ZXJydXB0cworI2RlZmluZSBTQVZFX0NPTlRFWFRfQ1BMQglzYXZlX2NvbnRleHRfY3BsYgogCiAjZGVmaW5lIFJFU1RPUkVfQUxMX1NZUwkJcmVzdG9yZV9jb250ZXh0X25vX2ludGVycnVwdHMKICNkZWZpbmUgUkVTVE9SRV9DT05URVhUCQlyZXN0b3JlX2NvbnRleHRfd2l0aF9pbnRlcnJ1cHRzCisjZGVmaW5lIFJFU1RPUkVfQ09OVEVYVF9DUExCCXJlc3RvcmVfY29udGV4dF9jcGxiCiAKICNlbmRpZgkJCQkvKiBfX0FTU0VNQkxZX18gKi8KICNlbmRpZgkJCQkvKiBfX0JGSU5fRU5UUllfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9ncGlvLmggYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2dwaW8uaAppbmRleCBhZDMzYWMyLi45NDc3ZDgyIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2dwaW8uaAorKysgYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2dwaW8uaApAQCAtODQsMTEgKzg0LDE0IEBACiAjaWZuZGVmIF9fQVJDSF9CTEFDS0ZJTl9HUElPX0hfXwogI2RlZmluZSBfX0FSQ0hfQkxBQ0tGSU5fR1BJT19IX18KIAotI2RlZmluZSBncGlvX2JhbmsoeCkgKCh4KSA+PiA0KQotI2RlZmluZSBncGlvX2JpdCh4KSAgKDE8PCgoeCkgJiAweEYpKQotI2RlZmluZSBncGlvX3N1Yl9uKHgpICgoeCkgJiAweEYpCisjZGVmaW5lIGdwaW9fYmFuayh4KSAJKCh4KSA+PiA0KQorI2RlZmluZSBncGlvX2JpdCh4KSAgCSgxPDwoKHgpICYgMHhGKSkKKyNkZWZpbmUgZ3Bpb19zdWJfbih4KSAJKCh4KSAmIDB4RikKIAotI2RlZmluZSBHUElPX0JBTktTSVpFIDE2CisjZGVmaW5lIEdQSU9fQkFOS1NJWkUgCTE2CisjZGVmaW5lIEdQSU9fQkFOS19OVU0gCURJVl9ST1VORF9VUChNQVhfQkxBQ0tGSU5fR1BJT1MsIEdQSU9fQkFOS1NJWkUpCisKKyNpbmNsdWRlIDxtYWNoL2dwaW8uaD4KIAogI2RlZmluZQlHUElPXzAJMAogI2RlZmluZQlHUElPXzEJMQpAQCAtMTM5LDE1MSArMTQyLDkgQEAKICNkZWZpbmUJR1BJT180Ngk0NgogI2RlZmluZQlHUElPXzQ3CTQ3CiAKLQogI2RlZmluZSBQRVJJUEhFUkFMX1VTQUdFIDEKICNkZWZpbmUgR1BJT19VU0FHRSAwCiAKLSNpZmRlZiBCRjUzM19GQU1JTFkKLSNkZWZpbmUgTUFYX0JMQUNLRklOX0dQSU9TIDE2Ci0KLSNkZWZpbmUJR1BJT19QRjAJMAotI2RlZmluZQlHUElPX1BGMQkxCi0jZGVmaW5lCUdQSU9fUEYyCTIKLSNkZWZpbmUJR1BJT19QRjMJMwotI2RlZmluZQlHUElPX1BGNAk0Ci0jZGVmaW5lCUdQSU9fUEY1CTUKLSNkZWZpbmUJR1BJT19QRjYJNgotI2RlZmluZQlHUElPX1BGNwk3Ci0jZGVmaW5lCUdQSU9fUEY4CTgKLSNkZWZpbmUJR1BJT19QRjkJOQotI2RlZmluZQlHUElPX1BGMTAJMTAKLSNkZWZpbmUJR1BJT19QRjExCTExCi0jZGVmaW5lCUdQSU9fUEYxMgkxMgotI2RlZmluZQlHUElPX1BGMTMJMTMKLSNkZWZpbmUJR1BJT19QRjE0CTE0Ci0jZGVmaW5lCUdQSU9fUEYxNQkxNQotCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoQkY1MjdfRkFNSUxZKSB8fCBkZWZpbmVkKEJGNTM3X0ZBTUlMWSkKLSNkZWZpbmUgTUFYX0JMQUNLRklOX0dQSU9TIDQ4Ci0KLSNkZWZpbmUJR1BJT19QRjAJMAotI2RlZmluZQlHUElPX1BGMQkxCi0jZGVmaW5lCUdQSU9fUEYyCTIKLSNkZWZpbmUJR1BJT19QRjMJMwotI2RlZmluZQlHUElPX1BGNAk0Ci0jZGVmaW5lCUdQSU9fUEY1CTUKLSNkZWZpbmUJR1BJT19QRjYJNgotI2RlZmluZQlHUElPX1BGNwk3Ci0jZGVmaW5lCUdQSU9fUEY4CTgKLSNkZWZpbmUJR1BJT19QRjkJOQotI2RlZmluZQlHUElPX1BGMTAJMTAKLSNkZWZpbmUJR1BJT19QRjExCTExCi0jZGVmaW5lCUdQSU9fUEYxMgkxMgotI2RlZmluZQlHUElPX1BGMTMJMTMKLSNkZWZpbmUJR1BJT19QRjE0CTE0Ci0jZGVmaW5lCUdQSU9fUEYxNQkxNQotI2RlZmluZQlHUElPX1BHMAkxNgotI2RlZmluZQlHUElPX1BHMQkxNwotI2RlZmluZQlHUElPX1BHMgkxOAotI2RlZmluZQlHUElPX1BHMwkxOQotI2RlZmluZQlHUElPX1BHNAkyMAotI2RlZmluZQlHUElPX1BHNQkyMQotI2RlZmluZQlHUElPX1BHNgkyMgotI2RlZmluZQlHUElPX1BHNwkyMwotI2RlZmluZQlHUElPX1BHOAkyNAotI2RlZmluZQlHUElPX1BHOQkyNQotI2RlZmluZQlHUElPX1BHMTAgICAgICAJMjYKLSNkZWZpbmUJR1BJT19QRzExICAgICAgCTI3Ci0jZGVmaW5lCUdQSU9fUEcxMiAgICAgIAkyOAotI2RlZmluZQlHUElPX1BHMTMgICAgICAJMjkKLSNkZWZpbmUJR1BJT19QRzE0ICAgICAgCTMwCi0jZGVmaW5lCUdQSU9fUEcxNSAgICAgIAkzMQotI2RlZmluZQlHUElPX1BIMAkzMgotI2RlZmluZQlHUElPX1BIMQkzMwotI2RlZmluZQlHUElPX1BIMgkzNAotI2RlZmluZQlHUElPX1BIMwkzNQotI2RlZmluZQlHUElPX1BINAkzNgotI2RlZmluZQlHUElPX1BINQkzNwotI2RlZmluZQlHUElPX1BINgkzOAotI2RlZmluZQlHUElPX1BINwkzOQotI2RlZmluZQlHUElPX1BIOAk0MAotI2RlZmluZQlHUElPX1BIOQk0MQotI2RlZmluZQlHUElPX1BIMTAgICAgICAJNDIKLSNkZWZpbmUJR1BJT19QSDExICAgICAgCTQzCi0jZGVmaW5lCUdQSU9fUEgxMiAgICAgIAk0NAotI2RlZmluZQlHUElPX1BIMTMgICAgICAJNDUKLSNkZWZpbmUJR1BJT19QSDE0ICAgICAgCTQ2Ci0jZGVmaW5lCUdQSU9fUEgxNSAgICAgIAk0NwotCi0jZGVmaW5lIFBPUlRfRiBHUElPX1BGMAotI2RlZmluZSBQT1JUX0cgR1BJT19QRzAKLSNkZWZpbmUgUE9SVF9IIEdQSU9fUEgwCi0KLSNlbmRpZgotCi0jaWZkZWYgQkY1NDhfRkFNSUxZCi0jaW5jbHVkZSA8bWFjaC9ncGlvLmg+Ci0jZW5kaWYKLQotI2lmZGVmIEJGNTYxX0ZBTUlMWQotI2RlZmluZSBNQVhfQkxBQ0tGSU5fR1BJT1MgNDgKLQotI2RlZmluZQlHUElPX1BGMAkwCi0jZGVmaW5lCUdQSU9fUEYxCTEKLSNkZWZpbmUJR1BJT19QRjIJMgotI2RlZmluZQlHUElPX1BGMwkzCi0jZGVmaW5lCUdQSU9fUEY0CTQKLSNkZWZpbmUJR1BJT19QRjUJNQotI2RlZmluZQlHUElPX1BGNgk2Ci0jZGVmaW5lCUdQSU9fUEY3CTcKLSNkZWZpbmUJR1BJT19QRjgJOAotI2RlZmluZQlHUElPX1BGOQk5Ci0jZGVmaW5lCUdQSU9fUEYxMAkxMAotI2RlZmluZQlHUElPX1BGMTEJMTEKLSNkZWZpbmUJR1BJT19QRjEyCTEyCi0jZGVmaW5lCUdQSU9fUEYxMwkxMwotI2RlZmluZQlHUElPX1BGMTQJMTQKLSNkZWZpbmUJR1BJT19QRjE1CTE1Ci0jZGVmaW5lCUdQSU9fUEYxNgkxNgotI2RlZmluZQlHUElPX1BGMTcJMTcKLSNkZWZpbmUJR1BJT19QRjE4CTE4Ci0jZGVmaW5lCUdQSU9fUEYxOQkxOQotI2RlZmluZQlHUElPX1BGMjAJMjAKLSNkZWZpbmUJR1BJT19QRjIxCTIxCi0jZGVmaW5lCUdQSU9fUEYyMgkyMgotI2RlZmluZQlHUElPX1BGMjMJMjMKLSNkZWZpbmUJR1BJT19QRjI0CTI0Ci0jZGVmaW5lCUdQSU9fUEYyNQkyNQotI2RlZmluZQlHUElPX1BGMjYJMjYKLSNkZWZpbmUJR1BJT19QRjI3CTI3Ci0jZGVmaW5lCUdQSU9fUEYyOAkyOAotI2RlZmluZQlHUElPX1BGMjkJMjkKLSNkZWZpbmUJR1BJT19QRjMwCTMwCi0jZGVmaW5lCUdQSU9fUEYzMQkzMQotI2RlZmluZQlHUElPX1BGMzIJMzIKLSNkZWZpbmUJR1BJT19QRjMzCTMzCi0jZGVmaW5lCUdQSU9fUEYzNAkzNAotI2RlZmluZQlHUElPX1BGMzUJMzUKLSNkZWZpbmUJR1BJT19QRjM2CTM2Ci0jZGVmaW5lCUdQSU9fUEYzNwkzNwotI2RlZmluZQlHUElPX1BGMzgJMzgKLSNkZWZpbmUJR1BJT19QRjM5CTM5Ci0jZGVmaW5lCUdQSU9fUEY0MAk0MAotI2RlZmluZQlHUElPX1BGNDEJNDEKLSNkZWZpbmUJR1BJT19QRjQyCTQyCi0jZGVmaW5lCUdQSU9fUEY0Mwk0MwotI2RlZmluZQlHUElPX1BGNDQJNDQKLSNkZWZpbmUJR1BJT19QRjQ1CTQ1Ci0jZGVmaW5lCUdQSU9fUEY0Ngk0NgotI2RlZmluZQlHUElPX1BGNDcJNDcKLQotI2RlZmluZSBQT1JUX0ZJTzAgR1BJT18wCi0jZGVmaW5lIFBPUlRfRklPMSBHUElPXzE2Ci0jZGVmaW5lIFBPUlRfRklPMiBHUElPXzMyCi0jZW5kaWYKLQogI2lmbmRlZiBfX0FTU0VNQkxZX18KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC00MjUsMjAgKzI4Niw3NyBAQAogKiBNT0RJRklDQVRJT04gSElTVE9SWSA6CiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotaW50IGdwaW9fcmVxdWVzdCh1bnNpZ25lZCwgY29uc3QgY2hhciAqKTsKLXZvaWQgZ3Bpb19mcmVlKHVuc2lnbmVkKTsKLQotdm9pZCBncGlvX3NldF92YWx1ZSh1bnNpZ25lZCBncGlvLCBpbnQgYXJnKTsKLWludCBncGlvX2dldF92YWx1ZSh1bnNpZ25lZCBncGlvKTsKK2ludCBiZmluX2dwaW9fcmVxdWVzdCh1bnNpZ25lZCBncGlvLCBjb25zdCBjaGFyICpsYWJlbCk7Cit2b2lkIGJmaW5fZ3Bpb19mcmVlKHVuc2lnbmVkIGdwaW8pOworaW50IGJmaW5fZ3Bpb19pcnFfcmVxdWVzdCh1bnNpZ25lZCBncGlvLCBjb25zdCBjaGFyICpsYWJlbCk7Cit2b2lkIGJmaW5fZ3Bpb19pcnFfZnJlZSh1bnNpZ25lZCBncGlvKTsKK2ludCBiZmluX2dwaW9fZGlyZWN0aW9uX2lucHV0KHVuc2lnbmVkIGdwaW8pOworaW50IGJmaW5fZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KHVuc2lnbmVkIGdwaW8sIGludCB2YWx1ZSk7CitpbnQgYmZpbl9ncGlvX2dldF92YWx1ZSh1bnNpZ25lZCBncGlvKTsKK3ZvaWQgYmZpbl9ncGlvX3NldF92YWx1ZSh1bnNpZ25lZCBncGlvLCBpbnQgdmFsdWUpOwogCiAjaWZuZGVmIEJGNTQ4X0ZBTUlMWQotI2RlZmluZSBncGlvX3NldF92YWx1ZShncGlvLCB2YWx1ZSkJc2V0X2dwaW9fZGF0YShncGlvLCB2YWx1ZSkKKyNkZWZpbmUgYmZpbl9ncGlvX3NldF92YWx1ZShncGlvLCB2YWx1ZSkgICAgc2V0X2dwaW9fZGF0YShncGlvLCB2YWx1ZSkKICNlbmRpZgogCi1pbnQgZ3Bpb19kaXJlY3Rpb25faW5wdXQodW5zaWduZWQgZ3Bpbyk7Ci1pbnQgZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KHVuc2lnbmVkIGdwaW8sIGludCB2YWx1ZSk7CisjaWZkZWYgQ09ORklHX0dQSU9MSUIKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9ncGlvLmg+CQkvKiBjYW5zbGVlcCB3cmFwcGVycyAqLworCitzdGF0aWMgaW5saW5lIGludCBncGlvX2dldF92YWx1ZSh1bnNpZ25lZCBpbnQgZ3BpbykKK3sKKwlpZiAoZ3BpbyA8IE1BWF9CTEFDS0ZJTl9HUElPUykKKwkJcmV0dXJuIGJmaW5fZ3Bpb19nZXRfdmFsdWUoZ3Bpbyk7CisJZWxzZQorCQlyZXR1cm4gX19ncGlvX2dldF92YWx1ZShncGlvKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGdwaW9fc2V0X3ZhbHVlKHVuc2lnbmVkIGludCBncGlvLCBpbnQgdmFsdWUpCit7CisJaWYgKGdwaW8gPCBNQVhfQkxBQ0tGSU5fR1BJT1MpCisJCWJmaW5fZ3Bpb19zZXRfdmFsdWUoZ3BpbywgdmFsdWUpOworCWVsc2UKKwkJX19ncGlvX3NldF92YWx1ZShncGlvLCB2YWx1ZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGdwaW9fY2Fuc2xlZXAodW5zaWduZWQgaW50IGdwaW8pCit7CisJcmV0dXJuIF9fZ3Bpb19jYW5zbGVlcChncGlvKTsKK30KKworI2Vsc2UgLyogIUNPTkZJR19HUElPTElCICovCisKK3N0YXRpYyBpbmxpbmUgaW50IGdwaW9fcmVxdWVzdCh1bnNpZ25lZCBncGlvLCBjb25zdCBjaGFyICpsYWJlbCkKK3sKKwlyZXR1cm4gYmZpbl9ncGlvX3JlcXVlc3QoZ3BpbywgbGFiZWwpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZ3Bpb19mcmVlKHVuc2lnbmVkIGdwaW8pCit7CisJcmV0dXJuIGJmaW5fZ3Bpb19mcmVlKGdwaW8pOworfQorCitzdGF0aWMgaW5saW5lIGludCBncGlvX2RpcmVjdGlvbl9pbnB1dCh1bnNpZ25lZCBncGlvKQoreworCXJldHVybiBiZmluX2dwaW9fZGlyZWN0aW9uX2lucHV0KGdwaW8pOworfQorCitzdGF0aWMgaW5saW5lIGludCBncGlvX2RpcmVjdGlvbl9vdXRwdXQodW5zaWduZWQgZ3BpbywgaW50IHZhbHVlKQoreworCXJldHVybiBiZmluX2dwaW9fZGlyZWN0aW9uX291dHB1dChncGlvLCB2YWx1ZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGdwaW9fZ2V0X3ZhbHVlKHVuc2lnbmVkIGdwaW8pCit7CisJcmV0dXJuIGJmaW5fZ3Bpb19nZXRfdmFsdWUoZ3Bpbyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBncGlvX3NldF92YWx1ZSh1bnNpZ25lZCBncGlvLCBpbnQgdmFsdWUpCit7CisJcmV0dXJuIGJmaW5fZ3Bpb19zZXRfdmFsdWUoZ3BpbywgdmFsdWUpOworfQogCiAjaW5jbHVkZSA8YXNtLWdlbmVyaWMvZ3Bpby5oPgkJLyogY2Fuc2xlZXAgd3JhcHBlcnMgKi8KKyNlbmRpZgkvKiAhQ09ORklHX0dQSU9MSUIgKi8KICNpbmNsdWRlIDxhc20vaXJxLmg+CiAKIHN0YXRpYyBpbmxpbmUgaW50IGdwaW9fdG9faXJxKHVuc2lnbmVkIGdwaW8pCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2hhcmRpcnEuaCBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vaGFyZGlycS5oCmluZGV4IGI2YjE5ZjEuLjcxNzE4MWEgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vaGFyZGlycS5oCisrKyBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vaGFyZGlycS5oCkBAIC00Miw0ICs0Miw2IEBACiAKICNkZWZpbmUgX19BUkNIX0lSUV9FWElUX0lSUVNfRElTQUJMRUQJMQogCitleHRlcm4gdm9pZCBhY2tfYmFkX2lycSh1bnNpZ25lZCBpbnQgaXJxKTsKKwogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2lvLmggYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2lvLmgKaW5kZXggN2RjNzdhMi4uNjNiMmQ4YyAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9pby5oCisrKyBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vaW8uaApAQCAtOTQsMTIgKzk0LDEyIEBACiAjZGVmaW5lIG91dHdfcCh4LGFkZHIpIG91dHcoeCxhZGRyKQogI2RlZmluZSBvdXRsX3AoeCxhZGRyKSBvdXRsKHgsYWRkcikKIAotI2RlZmluZSBpb3JlYWQ4X3JlcChhLGQsYykJaW5zYihhLGQsYykKLSNkZWZpbmUgaW9yZWFkMTZfcmVwKGEsZCxjKQlpbnN3KGEsZCxjKQotI2RlZmluZSBpb3JlYWQzMl9yZXAoYSxkLGMpCWluc2woYSxkLGMpCi0jZGVmaW5lIGlvd3JpdGU4X3JlcChhLHMsYykJb3V0c2IoYSxzLGMpCi0jZGVmaW5lIGlvd3JpdGUxNl9yZXAoYSxzLGMpCW91dHN3KGEscyxjKQotI2RlZmluZSBpb3dyaXRlMzJfcmVwKGEscyxjKQlvdXRzbChhLHMsYykKKyNkZWZpbmUgaW9yZWFkOF9yZXAoYSxkLGMpCXJlYWRzYihhLGQsYykKKyNkZWZpbmUgaW9yZWFkMTZfcmVwKGEsZCxjKQlyZWFkc3coYSxkLGMpCisjZGVmaW5lIGlvcmVhZDMyX3JlcChhLGQsYykJcmVhZHNsKGEsZCxjKQorI2RlZmluZSBpb3dyaXRlOF9yZXAoYSxzLGMpCXdyaXRlc2IoYSxzLGMpCisjZGVmaW5lIGlvd3JpdGUxNl9yZXAoYSxzLGMpCXdyaXRlc3coYSxzLGMpCisjZGVmaW5lIGlvd3JpdGUzMl9yZXAoYSxzLGMpCXdyaXRlc2woYSxzLGMpCiAKICNkZWZpbmUgaW9yZWFkOChYKQkJCXJlYWRiKFgpCiAjZGVmaW5lIGlvcmVhZDE2KFgpCQkJcmVhZHcoWCkKQEAgLTEwOCw2ICsxMDgsOCBAQAogI2RlZmluZSBpb3dyaXRlMTYodmFsLFgpCQl3cml0ZXcodmFsLFgpCiAjZGVmaW5lIGlvd3JpdGUzMih2YWwsWCkJCXdyaXRlbCh2YWwsWCkKIAorI2RlZmluZSBtbWlvd2IoKSB3bWIoKQorCiAjZGVmaW5lIElPX1NQQUNFX0xJTUlUIDB4ZmZmZmZmZmYKIAogLyogVmFsdWVzIGZvciBub2NhY2hlZmxhZyBhbmQgY21vZGUgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vaXBpcGUuaCBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vaXBpcGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NmY1M2Q4Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9pcGlwZS5oCkBAIC0wLDAgKzEsMjc4IEBACisvKiAgIC0qLSBsaW51eC1jIC0qLQorICogICBpbmNsdWRlL2FzbS1ibGFja2Zpbi9pcGlwZS5oCisgKgorICogICBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNyBQaGlsaXBwZSBHZXJ1bS4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlIE1BIDAyMTM5LAorICogICBVU0E7IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisgKiAgIHZlcnNpb24uCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fQVNNX0JMQUNLRklOX0lQSVBFX0gKKyNkZWZpbmUgX19BU01fQkxBQ0tGSU5fSVBJUEVfSAorCisjaWZkZWYgQ09ORklHX0lQSVBFCisKKyNpbmNsdWRlIDxsaW51eC9jcHVtYXNrLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L3RocmVhZHMuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9pcGlwZV9wZXJjcHUuaD4KKyNpbmNsdWRlIDxhc20vcHRyYWNlLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9iaXRvcHMuaD4KKyNpbmNsdWRlIDxhc20vYXRvbWljLmg+CisjaW5jbHVkZSA8YXNtL3RyYXBzLmg+CisKKyNkZWZpbmUgSVBJUEVfQVJDSF9TVFJJTkcgICAgICIxLjgtMDAiCisjZGVmaW5lIElQSVBFX01BSk9SX05VTUJFUiAgICAxCisjZGVmaW5lIElQSVBFX01JTk9SX05VTUJFUiAgICA4CisjZGVmaW5lIElQSVBFX1BBVENIX05VTUJFUiAgICAwCisKKyNpZmRlZiBDT05GSUdfU01QCisjZXJyb3IgIkktcGlwZS9ibGFja2ZpbjogU01QIG5vdCBpbXBsZW1lbnRlZCIKKyNlbHNlIC8qICFDT05GSUdfU01QICovCisjZGVmaW5lIGlwaXBlX3Byb2Nlc3Nvcl9pZCgpCTAKKyNlbmRpZgkvKiBDT05GSUdfU01QICovCisKKyNkZWZpbmUgcHJlcGFyZV9hcmNoX3N3aXRjaChuZXh0KQkJXAorZG8gewkJCQkJCVwKKwlpcGlwZV9zY2hlZHVsZV9ub3RpZnkoY3VycmVudCwgbmV4dCk7CVwKKwlsb2NhbF9pcnFfZGlzYWJsZV9odygpOwkJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgdGFza19oaWphY2tlZChwKQkJCQkJCVwKKwkoewkJCQkJCQkJXAorCQlpbnQgX194X18gPSBpcGlwZV9jdXJyZW50X2RvbWFpbiAhPSBpcGlwZV9yb290X2RvbWFpbjsJXAorCQkvKiBXZSB3b3VsZCBuZWVkIHRvIGNsZWFyIHRoZSBTWU5DIGZsYWcgZm9yIHRoZSByb290IGRvbWFpbiAqLyBcCisJCS8qIG92ZXIgdGhlIGN1cnJlbnQgcHJvY2Vzc29yIGluIFNNUCBtb2RlLiAqLwkJXAorCQlsb2NhbF9pcnFfZW5hYmxlX2h3KCk7IF9feF9fOwkJCQlcCisJfSkKKworc3RydWN0IGlwaXBlX2RvbWFpbjsKKworc3RydWN0IGlwaXBlX3N5c2luZm8geworCisJaW50IG5jcHVzOwkJLyogTnVtYmVyIG9mIENQVXMgb24gYm9hcmQgKi8KKwl1NjQgY3B1ZnJlcTsJCS8qIENQVSBmcmVxdWVuY3kgKGluIEh6KSAqLworCisJLyogQXJjaC1kZXBlbmRlbnQgYmxvY2sgKi8KKworCXN0cnVjdCB7CisJCXVuc2lnbmVkIHRtaXJxOwkvKiBUaW1lciB0aWNrIElSUSAqLworCQl1NjQgdG1mcmVxOwkvKiBUaW1lciBmcmVxdWVuY3kgKi8KKwl9IGFyY2hkZXA7Cit9OworCisjZGVmaW5lIGlwaXBlX3JlYWRfdHNjKHQpCQkJCQlcCisJKHsJCQkJCQkJXAorCXVuc2lnbmVkIGxvbmcgX19jeTI7CQkJCQlcCisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCIxOiAlMCA9IENZQ0xFUzJcbiIJCVwKKwkJCQkiJTEgPSBDWUNMRVNcbiIJCQlcCisJCQkJIiUyID0gQ1lDTEVTMlxuIgkJXAorCQkJCSJDQyA9ICUyID09ICUwXG4iCQlcCisJCQkJImlmICEgQ0MganVtcCAxYlxuIgkJXAorCQkJCTogIj1yIiAoKCh1bnNpZ25lZCBsb25nICopJnQpWzFdKSwJXAorCQkJCSAgIj1yIiAoKCh1bnNpZ25lZCBsb25nICopJnQpWzBdKSwJXAorCQkJCSAgIj1yIiAoX19jeTIpCQkJCVwKKwkJCQk6IC8qbm8gaW5wdXQqLyA6ICJDQyIpOwkJCVwKKwl0OwkJCQkJCQkJXAorCX0pCisKKyNkZWZpbmUgaXBpcGVfY3B1X2ZyZXEoKQlfX2lwaXBlX2NvcmVfY2xvY2sKKyNkZWZpbmUgaXBpcGVfdHNjMm5zKF90KQkoKCh1bnNpZ25lZCBsb25nKShfdCkpICogX19pcGlwZV9mcmVxX3NjYWxlKQorI2RlZmluZSBpcGlwZV90c2MydXMoX3QpCShpcGlwZV90c2MybnMoX3QpIC8gMTAwMCArIDEpCisKKy8qIFByaXZhdGUgaW50ZXJmYWNlIC0tIEludGVybmFsIHVzZSBvbmx5ICovCisKKyNkZWZpbmUgX19pcGlwZV9jaGVja19wbGF0Zm9ybSgpCWRvIHsgfSB3aGlsZSAoMCkKKworI2RlZmluZSBfX2lwaXBlX2luaXRfcGxhdGZvcm0oKQkJZG8geyB9IHdoaWxlICgwKQorCitleHRlcm4gYXRvbWljX3QgX19pcGlwZV9pcnFfbHZkZXB0aFtJVkcxNSArIDFdOworCitleHRlcm4gdW5zaWduZWQgbG9uZyBfX2lwaXBlX2lycV9sdm1hc2s7CisKK2V4dGVybiBzdHJ1Y3QgaXBpcGVfZG9tYWluIGlwaXBlX3Jvb3Q7CisKKy8qIGVuYWJsZS9kaXNhYmxlX2lycWRlc2MgX211c3RfIGJlIHVzZWQgaW4gcGFpcnMuICovCisKK3ZvaWQgX19pcGlwZV9lbmFibGVfaXJxZGVzYyhzdHJ1Y3QgaXBpcGVfZG9tYWluICppcGQsCisJCQkgICAgdW5zaWduZWQgaXJxKTsKKwordm9pZCBfX2lwaXBlX2Rpc2FibGVfaXJxZGVzYyhzdHJ1Y3QgaXBpcGVfZG9tYWluICppcGQsCisJCQkgICAgIHVuc2lnbmVkIGlycSk7CisKKyNkZWZpbmUgX19pcGlwZV9lbmFibGVfaXJxKGlycSkJCShpcnFfZGVzY1tpcnFdLmNoaXAtPnVubWFzayhpcnEpKQorCisjZGVmaW5lIF9faXBpcGVfZGlzYWJsZV9pcnEoaXJxKQkoaXJxX2Rlc2NbaXJxXS5jaGlwLT5tYXNrKGlycSkpCisKKyNkZWZpbmUgX19pcGlwZV9sb2NrX3Jvb3QoKQkJCQkJXAorCXNldF9iaXQoSVBJUEVfUk9PVExPQ0tfRkxBRywgJmlwaXBlX3Jvb3RfZG9tYWluLT5mbGFncykKKworI2RlZmluZSBfX2lwaXBlX3VubG9ja19yb290KCkJCQkJCVwKKwljbGVhcl9iaXQoSVBJUEVfUk9PVExPQ0tfRkxBRywgJmlwaXBlX3Jvb3RfZG9tYWluLT5mbGFncykKKwordm9pZCBfX2lwaXBlX2VuYWJsZV9waXBlbGluZSh2b2lkKTsKKworI2RlZmluZSBfX2lwaXBlX2hvb2tfY3JpdGljYWxfaXBpKGlwZCkgZG8geyB9IHdoaWxlICgwKQorCisjZGVmaW5lIF9faXBpcGVfc3luY19waXBlbGluZShzeW5jbWFzaykJCQkJCVwKKwlkbyB7CQkJCQkJCQlcCisJCXN0cnVjdCBpcGlwZV9kb21haW4gKmlwZCA9IGlwaXBlX2N1cnJlbnRfZG9tYWluOwlcCisJCWlmIChsaWtlbHkoaXBkICE9IGlwaXBlX3Jvb3RfZG9tYWluIHx8ICF0ZXN0X2JpdChJUElQRV9ST09UTE9DS19GTEFHLCAmaXBkLT5mbGFncykpKSBcCisJCQlfX2lwaXBlX3N5bmNfc3RhZ2Uoc3luY21hc2spOwkJCVwKKwl9IHdoaWxlICgwKQorCit2b2lkIF9faXBpcGVfaGFuZGxlX2lycSh1bnNpZ25lZCBpcnEsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKKworaW50IF9faXBpcGVfZ2V0X2lycV9wcmlvcml0eSh1bnNpZ25lZCBpcnEpOworCitpbnQgX19pcGlwZV9nZXRfaXJxdGhyZWFkX3ByaW9yaXR5KHVuc2lnbmVkIGlycSk7CisKK3ZvaWQgX19pcGlwZV9zdGFsbF9yb290X3Jhdyh2b2lkKTsKKwordm9pZCBfX2lwaXBlX3Vuc3RhbGxfcm9vdF9yYXcodm9pZCk7CisKK3ZvaWQgX19pcGlwZV9zZXJpYWxfZGVidWcoY29uc3QgY2hhciAqZm10LCAuLi4pOworCitERUNMQVJFX1BFUl9DUFUoc3RydWN0IHB0X3JlZ3MsIF9faXBpcGVfdGlja19yZWdzKTsKKworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgX19pcGlwZV9jb3JlX2Nsb2NrOworCitleHRlcm4gdW5zaWduZWQgbG9uZyBfX2lwaXBlX2ZyZXFfc2NhbGU7CisKK2V4dGVybiB1bnNpZ25lZCBsb25nIF9faXBpcGVfaXJxX3RhaWxfaG9vazsKKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIF9faXBpcGVfZmZueih1bnNpZ25lZCBsb25nIHVsKQoreworCXJldHVybiBmZnModWwpIC0gMTsKK30KKworI2RlZmluZSBfX2lwaXBlX3J1bl9pcnF0YWlsKCkgIC8qIE11c3QgYmUgYSBtYWNybyAqLwkJCVwKKwlkbyB7CQkJCQkJCQlcCisJCWFzbWxpbmthZ2Ugdm9pZCBfX2lwaXBlX2NhbGxfaXJxdGFpbCh2b2lkKTsJCVwKKwkJdW5zaWduZWQgbG9uZyBfX3BlbmRpbmc7CQkJCVwKKwkJQ1NZTkMoKTsJCQkJCVwKKwkJX19wZW5kaW5nID0gYmZpbl9yZWFkX0lQRU5EKCk7CQkJCVwKKwkJaWYgKF9fcGVuZGluZyAmIDB4ODAwMCkgewkJCQlcCisJCQlfX3BlbmRpbmcgJj0gfjB4ODAxMDsJCQkJXAorCQkJaWYgKF9fcGVuZGluZyAmJiAoX19wZW5kaW5nICYgKF9fcGVuZGluZyAtIDEpKSA9PSAwKSBcCisJCQkJX19pcGlwZV9jYWxsX2lycXRhaWwoKTsJCQlcCisJCX0JCQkJCQkJXAorCX0gd2hpbGUgKDApCisKKyNkZWZpbmUgX19pcGlwZV9ydW5faXNyKGlwZCwgaXJxKQkJCQkJXAorCWRvIHsJCQkJCQkJCVwKKwkJaWYgKGlwZCA9PSBpcGlwZV9yb290X2RvbWFpbikgewkJCQlcCisJCQkvKgkJCQkJCVwKKwkJCSAqIE5vdGU6IHRoZSBJLXBpcGUgaW1wbGVtZW50cyBhIHRocmVhZGVkIGludGVycnVwdCBtb2RlbCBvbiBcCisJCQkgKiB0aGlzIGFyY2ggZm9yIExpbnV4IGV4dGVybmFsIElSUXMuIFRoZSBpbnRlcnJ1cHQgaGFuZGxlciB3ZSBcCisJCQkgKiBjYWxsIGhlcmUgb25seSB3YWtlcyB1cCB0aGUgYXNzb2NpYXRlZCBJUlEgdGhyZWFkLiBcCisJCQkgKi8JCQkJCQlcCisJCQlpZiAoaXBpcGVfdmlydHVhbF9pcnFfcChpcnEpKSB7CQkJXAorCQkJCS8qIE5vIGlycXRhaWwgaGVyZTsgdmlydHVhbCBpbnRlcnJ1cHRzIGhhdmUgbm8gZWZmZWN0IFwKKwkJCQkgICBvbiBJUEVORCBzbyB0aGVyZSBpcyBubyBuZWVkIGZvciBwcm9jZXNzaW5nIFwKKwkJCQkgICBkZWZlcnJhbC4gKi8JCQkJXAorCQkJCWxvY2FsX2lycV9lbmFibGVfbm9oZWFkKGlwZCk7CQlcCisJCQkJaXBkLT5pcnFzW2lycV0uaGFuZGxlcihpcnEsIGlwZC0+aXJxc1tpcnFdLmNvb2tpZSk7IFwKKwkJCQlsb2NhbF9pcnFfZGlzYWJsZV9ub2hlYWQoaXBkKTsJCVwKKwkJCX0gZWxzZQkJCQkJCVwKKwkJCQkvKgkJCQkJXAorCQkJCSAqIE5vIG5lZWQgdG8gcnVuIHRoZSBpcnF0YWlsIGhlcmUgZWl0aGVyOyBcCisJCQkJICogd2UgY2FuJ3QgYmUgcHJlZW1wdGVkIGJ5IGh3IElSUXMsIHNvCVwKKwkJCQkgKiBub24tTGludXggSVJRcyBjYW5ub3Qgc3RhY2sgb3ZlciB0aGUgc2hvcnQgXAorCQkJCSAqIHRocmVhZCB3YWtldXAgY29kZS4gV2hpY2ggaW4gdHVybiBtZWFucyBcCisJCQkJICogdGhhdCBubyBpcnF0YWlsIGNvbmRpdGlvbiBjb3VsZCBiZSBwZW5kaW5nIFwKKwkJCQkgKiBmb3IgZG9tYWlucyBhYm92ZSBMaW51eCBpbiB0aGUgcGlwZWxpbmUuIFwKKwkJCQkgKi8JCQkJCVwKKwkJCQlpcGQtPmlycXNbaXJxXS5oYW5kbGVyKGlycSwgJl9fcmF3X2dldF9jcHVfdmFyKF9faXBpcGVfdGlja19yZWdzKSk7IFwKKwkJfSBlbHNlIHsJCQkJCQlcCisJCQlfX2NsZWFyX2JpdChJUElQRV9TWU5DX0ZMQUcsICZpcGlwZV9jcHVkb21fdmFyKGlwZCwgc3RhdHVzKSk7IFwKKwkJCWxvY2FsX2lycV9lbmFibGVfbm9oZWFkKGlwZCk7CQkJXAorCQkJaXBkLT5pcnFzW2lycV0uaGFuZGxlcihpcnEsIGlwZC0+aXJxc1tpcnFdLmNvb2tpZSk7IFwKKwkJCS8qIEF0dGVtcHQgdG8gZXhpdCB0aGUgb3V0ZXIgaW50ZXJydXB0IGxldmVsIGJlZm9yZSBcCisJCQkgKiBzdGFydGluZyB0aGUgZGVmZXJyZWQgSVJRIHByb2Nlc3NpbmcuICovCVwKKwkJCWxvY2FsX2lycV9kaXNhYmxlX25vaGVhZChpcGQpOwkJCVwKKwkJCV9faXBpcGVfcnVuX2lycXRhaWwoKTsJCQkJXAorCQkJX19zZXRfYml0KElQSVBFX1NZTkNfRkxBRywgJmlwaXBlX2NwdWRvbV92YXIoaXBkLCBzdGF0dXMpKTsgXAorCQl9CQkJCQkJCVwKKwl9IHdoaWxlICgwKQorCisjZGVmaW5lIF9faXBpcGVfc3lzY2FsbF93YXRjaGVkX3AocCwgc2MpCVwKKwkoKChwKS0+ZmxhZ3MgJiBQRl9FVk5PVElGWSkgfHwgKHVuc2lnbmVkIGxvbmcpc2MgPj0gTlJfc3lzY2FsbHMpCisKK3ZvaWQgaXBpcGVfaW5pdF9pcnFfdGhyZWFkcyh2b2lkKTsKKworaW50IGlwaXBlX3N0YXJ0X2lycV90aHJlYWQodW5zaWduZWQgaXJxLCBzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MpOworCisjZGVmaW5lIElTX1NZU0lSUShpcnEpCQkoKGlycSkgPiBJUlFfQ09SRVRNUiAmJiAoaXJxKSA8PSBTWVNfSVJRUykKKyNkZWZpbmUgSVNfR1BJT0lSUShpcnEpCQkoKGlycSkgPj0gR1BJT19JUlFfQkFTRSAmJiAoaXJxKSA8IE5SX0lSUVMpCisKKyNkZWZpbmUgSVJRX1NZU1RNUgkJSVJRX1RJTUVSMAorI2RlZmluZSBJUlFfUFJJT1RNUgkJQ09ORklHX0lSUV9USU1FUjAKKworI2lmIGRlZmluZWQoQ09ORklHX0JGNTMxKSB8fCBkZWZpbmVkKENPTkZJR19CRjUzMikgfHwgZGVmaW5lZChDT05GSUdfQkY1MzMpCisjZGVmaW5lIFBSSU9fR1BJT0RFTVVYKGlycSkJQ09ORklHX1BGQQorI2VsaWYgZGVmaW5lZChDT05GSUdfQkY1MzQpIHx8IGRlZmluZWQoQ09ORklHX0JGNTM2KSB8fCBkZWZpbmVkKENPTkZJR19CRjUzNykKKyNkZWZpbmUgUFJJT19HUElPREVNVVgoaXJxKQlDT05GSUdfSVJRX1BST0dfSU5UQQorI2VsaWYgZGVmaW5lZChDT05GSUdfQkY1MngpCisjZGVmaW5lIFBSSU9fR1BJT0RFTVVYKGlycSkJKChpcnEpID09IElSUV9QT1JURl9JTlRBID8gQ09ORklHX0lSUV9QT1JURl9JTlRBIDogXAorCQkJCSAoaXJxKSA9PSBJUlFfUE9SVEdfSU5UQSA/IENPTkZJR19JUlFfUE9SVEdfSU5UQSA6IFwKKwkJCQkgKGlycSkgPT0gSVJRX1BPUlRIX0lOVEEgPyBDT05GSUdfSVJRX1BPUlRIX0lOVEEgOiBcCisJCQkJIC0xKQorI2VsaWYgZGVmaW5lZChDT05GSUdfQkY1NjEpCisjZGVmaW5lIFBSSU9fR1BJT0RFTVVYKGlycSkJKChpcnEpID09IElSUV9QUk9HMF9JTlRBID8gQ09ORklHX0lSUV9QUk9HMF9JTlRBIDogXAorCQkJCSAoaXJxKSA9PSBJUlFfUFJPRzFfSU5UQSA/IENPTkZJR19JUlFfUFJPRzFfSU5UQSA6IFwKKwkJCQkgKGlycSkgPT0gSVJRX1BST0cyX0lOVEEgPyBDT05GSUdfSVJRX1BST0cyX0lOVEEgOiBcCisJCQkJIC0xKQorI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSX0RJU0FCTEUodmFsKQliZmluX3dyaXRlX1RNUlM4X0RJU0FCTEUodmFsKQorI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSX0VOQUJMRSh2YWwpCWJmaW5fd3JpdGVfVE1SUzhfRU5BQkxFKHZhbCkKKyNkZWZpbmUgYmZpbl93cml0ZV9USU1FUl9TVEFUVVModmFsKQliZmluX3dyaXRlX1RNUlM4X1NUQVRVUyh2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9USU1FUl9TVEFUVVMoKQliZmluX3JlYWRfVE1SUzhfU1RBVFVTKCkKKyNlbGlmIGRlZmluZWQoQ09ORklHX0JGNTR4KQorI2RlZmluZSBQUklPX0dQSU9ERU1VWChpcnEpCSgoaXJxKSA9PSBJUlFfUElOVDAgPyBDT05GSUdfSVJRX1BJTlQwIDogXAorCQkJCSAoaXJxKSA9PSBJUlFfUElOVDEgPyBDT05GSUdfSVJRX1BJTlQxIDogXAorCQkJCSAoaXJxKSA9PSBJUlFfUElOVDIgPyBDT05GSUdfSVJRX1BJTlQyIDogXAorCQkJCSAoaXJxKSA9PSBJUlFfUElOVDMgPyBDT05GSUdfSVJRX1BJTlQzIDogXAorCQkJCSAtMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9USU1FUl9ESVNBQkxFKHZhbCkJYmZpbl93cml0ZV9USU1FUl9ESVNBQkxFMCh2YWwpCisjZGVmaW5lIGJmaW5fd3JpdGVfVElNRVJfRU5BQkxFKHZhbCkJYmZpbl93cml0ZV9USU1FUl9FTkFCTEUwKHZhbCkKKyNkZWZpbmUgYmZpbl93cml0ZV9USU1FUl9TVEFUVVModmFsKQliZmluX3dyaXRlX1RJTUVSX1NUQVRVUzAodmFsKQorI2RlZmluZSBiZmluX3JlYWRfVElNRVJfU1RBVFVTKHZhbCkJYmZpbl9yZWFkX1RJTUVSX1NUQVRVUzAodmFsKQorI2Vsc2UKKyMgZXJyb3IgIm5vIFBSSU9fR1BJT0RFTVVYKCkgZm9yIHRoaXMgcGFydCIKKyNlbmRpZgorCisjZGVmaW5lIF9faXBpcGVfcm9vdF90aWNrX3AocmVncykJKChyZWdzLT5pcGVuZCAmIDB4MTApICE9IDApCisKKyNlbHNlIC8qICFDT05GSUdfSVBJUEUgKi8KKworI2RlZmluZSB0YXNrX2hpamFja2VkKHApCQkwCisjZGVmaW5lIGlwaXBlX3RyYXBfbm90aWZ5KHQsIHIpICAJMAorCisjZGVmaW5lIF9faXBpcGVfc3RhbGxfcm9vdF9yYXcoKQlkbyB7IH0gd2hpbGUgKDApCisjZGVmaW5lIF9faXBpcGVfdW5zdGFsbF9yb290X3JhdygpCWRvIHsgfSB3aGlsZSAoMCkKKworI2RlZmluZSBpcGlwZV9pbml0X2lycV90aHJlYWRzKCkJCWRvIHsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgaXBpcGVfc3RhcnRfaXJxX3RocmVhZChpcnEsIGRlc2MpCTAKKworI2RlZmluZSBJUlFfU1lTVE1SCQlJUlFfQ09SRVRNUgorI2RlZmluZSBJUlFfUFJJT1RNUgkJSVJRX0NPUkVUTVIKKworI2RlZmluZSBfX2lwaXBlX3Jvb3RfdGlja19wKHJlZ3MpCTEKKworI2VuZGlmIC8qICFDT05GSUdfSVBJUEUgKi8KKworI2VuZGlmCS8qICFfX0FTTV9CTEFDS0ZJTl9JUElQRV9IICovCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2lwaXBlX2Jhc2UuaCBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vaXBpcGVfYmFzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiMTAyNWEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2lwaXBlX2Jhc2UuaApAQCAtMCwwICsxLDgwIEBACisvKiAgIC0qLSBsaW51eC1jIC0qLQorICogICBpbmNsdWRlL2FzbS1ibGFja2Zpbi9fYmFzZWlwaXBlLmgKKyAqCisgKiAgIENvcHlyaWdodCAoQykgMjAwNyBQaGlsaXBwZSBHZXJ1bS4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlIE1BIDAyMTM5LAorICogICBVU0E7IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisgKiAgIHZlcnNpb24uCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fQVNNX0JMQUNLRklOX0lQSVBFX0JBU0VfSAorI2RlZmluZSBfX0FTTV9CTEFDS0ZJTl9JUElQRV9CQVNFX0gKKworI2lmZGVmIENPTkZJR19JUElQRQorCisjZGVmaW5lIElQSVBFX05SX1hJUlFTCQlOUl9JUlFTCisjZGVmaW5lIElQSVBFX0lSUV9JU0hJRlQJNQkvKiAyXjUgZm9yIDMyYml0cyBhcmNoLiAqLworCisvKiBCbGFja2Zpbi1zcGVjaWZpYywgZ2xvYmFsIGRvbWFpbiBmbGFncyAqLworI2RlZmluZSBJUElQRV9ST09UTE9DS19GTEFHCTEJLyogTG9jayBwaXBlbGluZSBmb3Igcm9vdCAqLworCisgLyogQmxhY2tmaW4gdHJhcHMgLS0gaS5lLiBleGNlcHRpb24gdmVjdG9yIG51bWJlcnMgKi8KKyNkZWZpbmUgSVBJUEVfTlJfRkFVTFRTCQk1MiAvKiBXZSBsZWF2ZSBhIGdhcCBhZnRlciBWRUNfSUxMX1JFUy4gKi8KKy8qIFBzZXVkby12ZWN0b3JzIHVzZWQgZm9yIGtlcm5lbCBldmVudHMgKi8KKyNkZWZpbmUgSVBJUEVfRklSU1RfRVZFTlQJSVBJUEVfTlJfRkFVTFRTCisjZGVmaW5lIElQSVBFX0VWRU5UX1NZU0NBTEwJKElQSVBFX0ZJUlNUX0VWRU5UKQorI2RlZmluZSBJUElQRV9FVkVOVF9TQ0hFRFVMRQkoSVBJUEVfRklSU1RfRVZFTlQgKyAxKQorI2RlZmluZSBJUElQRV9FVkVOVF9TSUdXQUtFCShJUElQRV9GSVJTVF9FVkVOVCArIDIpCisjZGVmaW5lIElQSVBFX0VWRU5UX1NFVFNDSEVECShJUElQRV9GSVJTVF9FVkVOVCArIDMpCisjZGVmaW5lIElQSVBFX0VWRU5UX0lOSVQJKElQSVBFX0ZJUlNUX0VWRU5UICsgNCkKKyNkZWZpbmUgSVBJUEVfRVZFTlRfRVhJVAkoSVBJUEVfRklSU1RfRVZFTlQgKyA1KQorI2RlZmluZSBJUElQRV9FVkVOVF9DTEVBTlVQCShJUElQRV9GSVJTVF9FVkVOVCArIDYpCisjZGVmaW5lIElQSVBFX0xBU1RfRVZFTlQJSVBJUEVfRVZFTlRfQ0xFQU5VUAorI2RlZmluZSBJUElQRV9OUl9FVkVOVFMJCShJUElQRV9MQVNUX0VWRU5UICsgMSkKKworI2RlZmluZSBJUElQRV9USU1FUl9JUlEJCUlSUV9DT1JFVE1SCisKKyNpZm5kZWYgX19BU1NFTUJMWV9fCisKKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKworZXh0ZXJuIGludCB0ZXN0X2JpdChpbnQgbnIsIGNvbnN0IHZvaWQgKmFkZHIpOworCisKK2V4dGVybiB1bnNpZ25lZCBsb25nIF9faXBpcGVfcm9vdF9zdGF0dXM7IC8qIEFsaWFzIHRvIGlwaXBlX3Jvb3RfY3B1ZG9tX3ZhcihzdGF0dXMpICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2lwaXBlX3N0YWxsX3Jvb3Qodm9pZCkKK3sKKwl2b2xhdGlsZSB1bnNpZ25lZCBsb25nICpwID0gJl9faXBpcGVfcm9vdF9zdGF0dXM7CisJc2V0X2JpdCgwLCBwKTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIF9faXBpcGVfdGVzdF9hbmRfc3RhbGxfcm9vdCh2b2lkKQoreworCXZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKnAgPSAmX19pcGlwZV9yb290X3N0YXR1czsKKwlyZXR1cm4gdGVzdF9hbmRfc2V0X2JpdCgwLCBwKTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIF9faXBpcGVfdGVzdF9yb290KHZvaWQpCit7CisJY29uc3QgdW5zaWduZWQgbG9uZyAqcCA9ICZfX2lwaXBlX3Jvb3Rfc3RhdHVzOworCXJldHVybiB0ZXN0X2JpdCgwLCBwKTsKK30KKworI2VuZGlmIC8qICFfX0FTU0VNQkxZX18gKi8KKworI2VuZGlmIC8qIENPTkZJR19JUElQRSAqLworCisjZW5kaWYgLyogIV9fQVNNX0JMQUNLRklOX0lQSVBFX0JBU0VfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9pcnEuaCBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vaXJxLmgKaW5kZXggODlmNTllMS4uM2Q5Nzc5MCAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9pcnEuaAorKysgYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2lycS5oCkBAIC0xNyw1NiArMTcsMjcyIEBACiAjaWZuZGVmIF9CRklOX0lSUV9IXwogI2RlZmluZSBfQkZJTl9JUlFfSF8KIAotI2luY2x1ZGUgPG1hY2gvaXJxLmg+Ci0jaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoqKioqICAgSU5UUk9EVUNUSU9OICoqKioqKioqKioqCi0gKiAgIE9uIHRoZSBCbGFja2ZpbiwgdGhlIGludGVycnVwdCBzdHJ1Y3R1cmUgYWxsb3dzIHJlbW1hcHBpbmcgb2YgdGhlIGhhcmR3YXJlCi0gKiAgIGxldmVscy4KLSAqIC0gSSdtIGdvaW5nIHRvIGFzc3VtZSB0aGF0IHRoZSBIL1cgbGV2ZWwgaXMgZ29pbmcgdG8gc3RheSBhdCB0aGUgZGVmYXVsdAotICogICBzZXR0aW5ncy4gSWYgc29tZW9uZSB3YW50cyB0byBnbyB0aHJvdWdoIGFuZCBhYnN0YXJ0IHRoaXMgb3V0LCBmZWVsIGZyZWUKLSAqICAgdG8gbW9kIHRoZSBpbnRlcnJ1cHQgbnVtYmVyaW5nIHNjaGVtZS4KLSAqIC0gSSdtIGFic3RyYWN0aW5nIHRoZSBpbnRlcnJ1cHRzIHNvIHRoYXQgdUNsaW51eCBkb2VzIG5vdCBrbm93IGFueXRoaW5nCi0gKiAgIGFib3V0IHRoZSBIL1cgbGV2ZWxzLiBJZiB5b3Ugd2FudCB0byBjaGFuZ2UgdGhlIEgvVyBBTkQga2VlcCB0aGUgYWJzdHJhY3RlZAotICogICBsZXZlbHMgdGhhdCB1Q2xpbnV4IHNlZXMsIHlvdSBzaG91bGQgYmUgYWJsZSB0byBkbyBtb3N0IG9mIGl0IGhlcmUuCi0gKiAtIEkndmUgbGVmdCB0aGUgImFic3RyYWN0IiBudW1iZXJpbmcgc3BhcmNlIGluIGNhc2Ugc29tZW9uZSB3YW50cyB0byBwdWxsIHRoZQotICogICBpbnRlcnJ1cHRzIGFwYXJ0IChqdXN0IHRoZSBUWC9SWCBmb3IgdGhlIHZhcmlvdXMgZGV2aWNlcykKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCiAvKiBTWVNfSVJRUyBhbmQgTlJfSVJRUyBhcmUgZGVmaW5lZCBpbiA8bWFjaC1iZjV4eC9pcnEuaD4qLworI2luY2x1ZGUgPG1hY2gvaXJxLmg+CisjaW5jbHVkZSA8YXNtL3BkYS5oPgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKworI2lmZGVmIENPTkZJR19TTVAKKy8qIEZvcndhcmQgZGVjbCBuZWVkZWQgZHVlIHRvIGNkZWYgaW50ZXIgZGVwZW5kZW5jaWVzICovCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IF9fcHVyZSBiZmluX2RzcGlkKHZvaWQpOworIyBkZWZpbmUgYmxhY2tmaW5fY29yZV9pZCgpIChiZmluX2RzcGlkKCkgJiAweGZmKQorIyBkZWZpbmUgYmZpbl9pcnFfZmxhZ3MgY3B1X3BkYVtibGFja2Zpbl9jb3JlX2lkKCldLmltYXNrCisjZWxzZQorZXh0ZXJuIHVuc2lnbmVkIGxvbmcgYmZpbl9pcnFfZmxhZ3M7CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19JUElQRQorCisjaW5jbHVkZSA8bGludXgvaXBpcGVfdHJhY2UuaD4KKwordm9pZCBfX2lwaXBlX3Vuc3RhbGxfcm9vdCh2b2lkKTsKKwordm9pZCBfX2lwaXBlX3Jlc3RvcmVfcm9vdCh1bnNpZ25lZCBsb25nIGZsYWdzKTsKKworI2lmZGVmIENPTkZJR19ERUJVR19IV0VSUgorIyBkZWZpbmUgX19hbGxfbWFza2VkX2lycV9mbGFncyAweDNmCisjIGRlZmluZSBfX3NhdmVfYW5kX2NsaV9odyh4KSBcCisJX19hc21fXyBfX3ZvbGF0aWxlX18oIFwKKwkJImNsaSAlMDsiIFwKKwkJInN0aSAlMTsiIFwKKwkJOiAiPSZkIih4KSBcCisJCTogImQiICgweDNGKSBcCisJKQorI2Vsc2UKKyMgZGVmaW5lIF9fYWxsX21hc2tlZF9pcnFfZmxhZ3MgMHgxZgorIyBkZWZpbmUgX19zYXZlX2FuZF9jbGlfaHcoeCkgXAorCV9fYXNtX18gX192b2xhdGlsZV9fKCBcCisJCSJjbGkgJTA7IiBcCisJCTogIj0mZCIoeCkgXAorCSkKKyNlbmRpZgorCisjZGVmaW5lIGlycXNfZW5hYmxlZF9mcm9tX2ZsYWdzX2h3KHgpCSgoeCkgIT0gX19hbGxfbWFza2VkX2lycV9mbGFncykKKyNkZWZpbmUgcmF3X2lycXNfZGlzYWJsZWRfZmxhZ3MoZmxhZ3MpCSghaXJxc19lbmFibGVkX2Zyb21fZmxhZ3NfaHcoZmxhZ3MpKQorI2RlZmluZSBsb2NhbF90ZXN0X2lmbGFnX2h3KHgpCQlpcnFzX2VuYWJsZWRfZnJvbV9mbGFnc19odyh4KQorCisjZGVmaW5lIGxvY2FsX3NhdmVfZmxhZ3MoeCkJCQkJCQlcCisJZG8gewkJCQkJCQkJXAorCQkoeCkgPSBfX2lwaXBlX3Rlc3Rfcm9vdCgpID8gXAorCQkJX19hbGxfbWFza2VkX2lycV9mbGFncyA6IGJmaW5faXJxX2ZsYWdzOyBcCisJfSB3aGlsZSAoMCkKKworI2RlZmluZSBsb2NhbF9pcnFfc2F2ZSh4KQkJCQlcCisJZG8gewkJCQkJCVwKKwkJKHgpID0gX19pcGlwZV90ZXN0X2FuZF9zdGFsbF9yb290KCk7CVwKKwl9IHdoaWxlICgwKQorCisjZGVmaW5lIGxvY2FsX2lycV9yZXN0b3JlKHgpCV9faXBpcGVfcmVzdG9yZV9yb290KHgpCisjZGVmaW5lIGxvY2FsX2lycV9kaXNhYmxlKCkJX19pcGlwZV9zdGFsbF9yb290KCkKKyNkZWZpbmUgbG9jYWxfaXJxX2VuYWJsZSgpCV9faXBpcGVfdW5zdGFsbF9yb290KCkKKyNkZWZpbmUgaXJxc19kaXNhYmxlZCgpCQlfX2lwaXBlX3Rlc3Rfcm9vdCgpCisKKyNkZWZpbmUgbG9jYWxfc2F2ZV9mbGFnc19odyh4KSBcCisJX19hc21fXyBfX3ZvbGF0aWxlX18oIFwKKwkJImNsaSAlMDsiIFwKKwkJInN0aSAlMDsiIFwKKwkJOiAiPWQiKHgpIFwKKwkpCisKKyNkZWZpbmUJaXJxc19kaXNhYmxlZF9odygpCQkJCVwKKwkoewkJCQkJCVwKKwkJdW5zaWduZWQgbG9uZyBmbGFnczsJCQlcCisJCWxvY2FsX3NhdmVfZmxhZ3NfaHcoZmxhZ3MpOwkJXAorCQkhaXJxc19lbmFibGVkX2Zyb21fZmxhZ3NfaHcoZmxhZ3MpOwlcCisJfSkKKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHJhd19tYW5nbGVfaXJxX2JpdHMoaW50IHZpcnQsIHVuc2lnbmVkIGxvbmcgcmVhbCkKK3sKKwkvKiBNZXJnZSB2aXJ0dWFsIGFuZCByZWFsIGludGVycnVwdCBtYXNrIGJpdHMgaW50byBhIHNpbmdsZQorCSAgIDMyYml0IHdvcmQuICovCisJcmV0dXJuIChyZWFsICYgfigxIDw8IDMxKSkgfCAoKHZpcnQgIT0gMCkgPDwgMzEpOworfQorCitzdGF0aWMgaW5saW5lIGludCByYXdfZGVtYW5nbGVfaXJxX2JpdHModW5zaWduZWQgbG9uZyAqeCkKK3sKKwlpbnQgdmlydCA9ICgqeCAmICgxIDw8IDMxKSkgIT0gMDsKKwkqeCAmPSB+KDFMIDw8IDMxKTsKKwlyZXR1cm4gdmlydDsKK30KKworI2lmZGVmIENPTkZJR19JUElQRV9UUkFDRV9JUlFTT0ZGCisKKyNkZWZpbmUgbG9jYWxfaXJxX2Rpc2FibGVfaHcoKQkJCQkJCVwKKwlkbyB7CQkJCQkJCQlcCisJCWludCBfdG1wX2R1bW15OwkJCQkJCVwKKwkJaWYgKCFpcnFzX2Rpc2FibGVkX2h3KCkpCQkJCVwKKwkJCWlwaXBlX3RyYWNlX2JlZ2luKDB4ODAwMDAwMDApOwkJCVwKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJjbGkgJTA7IiA6ICI9ZCIgKF90bXBfZHVtbXkpIDogKTsJXAorCX0gd2hpbGUgKDApCisKKyNkZWZpbmUgbG9jYWxfaXJxX2VuYWJsZV9odygpCQkJCQkJXAorCWRvIHsJCQkJCQkJCVwKKwkJaWYgKGlycXNfZGlzYWJsZWRfaHcoKSkJCQkJCVwKKwkJCWlwaXBlX3RyYWNlX2VuZCgweDgwMDAwMDAwKTsJCQlcCisJCV9fYXNtX18gX192b2xhdGlsZV9fICgic3RpICUwOyIgOiA6ICJkIihiZmluX2lycV9mbGFncykpOwlcCisJfSB3aGlsZSAoMCkKKworI2RlZmluZSBsb2NhbF9pcnFfc2F2ZV9odyh4KQkJCQlcCisJZG8gewkJCQkJCVwKKwkJX19zYXZlX2FuZF9jbGlfaHcoeCk7CQkJXAorCQlpZiAobG9jYWxfdGVzdF9pZmxhZ19odyh4KSkJCVwKKwkJCWlwaXBlX3RyYWNlX2JlZ2luKDB4ODAwMDAwMDEpOwlcCisJfSB3aGlsZSAoMCkKKworI2RlZmluZSBsb2NhbF9pcnFfcmVzdG9yZV9odyh4KQkJCQlcCisJZG8gewkJCQkJCVwKKwkJaWYgKGxvY2FsX3Rlc3RfaWZsYWdfaHcoeCkpIHsJCVwKKwkJCWlwaXBlX3RyYWNlX2VuZCgweDgwMDAwMDAxKTsJXAorCQkJbG9jYWxfaXJxX2VuYWJsZV9od19ub3RyYWNlKCk7CVwKKwkJfQkJCQkJXAorCX0gd2hpbGUgKDApCisKKyNkZWZpbmUgbG9jYWxfaXJxX2Rpc2FibGVfaHdfbm90cmFjZSgpCQkJCQlcCisJZG8gewkJCQkJCQkJXAorCQlpbnQgX3RtcF9kdW1teTsJCQkJCQlcCisJCV9fYXNtX18gX192b2xhdGlsZV9fICgiY2xpICUwOyIgOiAiPWQiIChfdG1wX2R1bW15KSA6ICk7CVwKKwl9IHdoaWxlICgwKQorCisjZGVmaW5lIGxvY2FsX2lycV9lbmFibGVfaHdfbm90cmFjZSgpIFwKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyggXAorCQkic3RpICUwOyIgXAorCQk6IFwKKwkJOiAiZCIoYmZpbl9pcnFfZmxhZ3MpIFwKKwkpCisKKyNkZWZpbmUgbG9jYWxfaXJxX3NhdmVfaHdfbm90cmFjZSh4KSBfX3NhdmVfYW5kX2NsaV9odyh4KQorCisjZGVmaW5lIGxvY2FsX2lycV9yZXN0b3JlX2h3X25vdHJhY2UoeCkJCQlcCisJZG8gewkJCQkJCVwKKwkJaWYgKGxvY2FsX3Rlc3RfaWZsYWdfaHcoeCkpCQlcCisJCQlsb2NhbF9pcnFfZW5hYmxlX2h3X25vdHJhY2UoKTsJXAorCX0gd2hpbGUgKDApCisKKyNlbHNlIC8qIENPTkZJR19JUElQRV9UUkFDRV9JUlFTT0ZGICovCisKKyNkZWZpbmUgbG9jYWxfaXJxX2VuYWJsZV9odygpIFwKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyggXAorCQkic3RpICUwOyIgXAorCQk6IFwKKwkJOiAiZCIoYmZpbl9pcnFfZmxhZ3MpIFwKKwkpCisKKyNkZWZpbmUgbG9jYWxfaXJxX2Rpc2FibGVfaHcoKQkJCVwKKwlkbyB7CQkJCQlcCisJCWludCBfdG1wX2R1bW15OwkJCVwKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18gKAkJXAorCQkJImNsaSAlMDsiCQlcCisJCQk6ICI9ZCIgKF90bXBfZHVtbXkpKTsJXAorCX0gd2hpbGUgKDApCisKKyNkZWZpbmUgbG9jYWxfaXJxX3Jlc3RvcmVfaHcoeCkgXAorCWRvIHsgXAorCQlpZiAoaXJxc19lbmFibGVkX2Zyb21fZmxhZ3NfaHcoeCkpIFwKKwkJCWxvY2FsX2lycV9lbmFibGVfaHcoKTsgXAorCX0gd2hpbGUgKDApCisKKyNkZWZpbmUgbG9jYWxfaXJxX3NhdmVfaHcoeCkJCV9fc2F2ZV9hbmRfY2xpX2h3KHgpCisKKyNkZWZpbmUgbG9jYWxfaXJxX2Rpc2FibGVfaHdfbm90cmFjZSgpCWxvY2FsX2lycV9kaXNhYmxlX2h3KCkKKyNkZWZpbmUgbG9jYWxfaXJxX2VuYWJsZV9od19ub3RyYWNlKCkJbG9jYWxfaXJxX2VuYWJsZV9odygpCisjZGVmaW5lIGxvY2FsX2lycV9zYXZlX2h3X25vdHJhY2UoeCkJbG9jYWxfaXJxX3NhdmVfaHcoeCkKKyNkZWZpbmUgbG9jYWxfaXJxX3Jlc3RvcmVfaHdfbm90cmFjZSh4KQlsb2NhbF9pcnFfcmVzdG9yZV9odyh4KQorCisjZW5kaWYgIC8qIENPTkZJR19JUElQRV9UUkFDRV9JUlFTT0ZGICovCisKKyNlbHNlIC8qICFDT05GSUdfSVBJUEUgKi8KIAogLyoKLSAqIE1hY2hpbmUgc3BlY2lmaWMgaW50ZXJydXB0IHNvdXJjZXMuCi0gKgotICogQWRkaW5nIGFuIGludGVycnVwdCBzZXJ2aWNlIHJvdXRpbmUgZm9yIGEgc291cmNlIHdpdGggdGhpcyBiaXQKLSAqIHNldCBpbmRpY2F0ZXMgYSBzcGVjaWFsIG1hY2hpbmUgc3BlY2lmaWMgaW50ZXJydXB0IHNvdXJjZS4KLSAqIFRoZSBtYWNoaW5lIHNwZWNpZmljIGZpbGVzIGRlZmluZSB0aGVzZSBzb3VyY2VzLgotICoKLSAqIFRoZSBJUlFfTUFDSFNQRUMgYml0IGlzIG5vdyBnb25lIC0gdGhlIG9ubHkgdGhpbmcgaXQgZGlkIHdhcyB0bwotICogaW50cm9kdWNlIHVubmVjZXNzYXJ5IG92ZXJoZWFkLgotICoKLSAqIEFsbCBpbnRlcnJ1cHQgaGFuZGxpbmcgaXMgYWN0dWFsbHkgbWFjaGluZSBzcGVjaWZpYyBzbyBpdCBpcyBiZXR0ZXIKLSAqIHRvIHVzZSBmdW5jdGlvbiBwb2ludGVycywgYXMgdXNlZCBieSB0aGUgU3BhcmMgcG9ydCwgYW5kIHNlbGVjdCB0aGUKLSAqIGludGVycnVwdCBoYW5kbGluZyBmdW5jdGlvbnMgd2hlbiBpbml0aWFsaXppbmcgdGhlIGtlcm5lbC4gVGhpcyB3YXkKLSAqIHdlIHNhdmUgc29tZSB1bm5lY2Vzc2FyeSBvdmVyaGVhZCBhdCBydW4tdGltZS4KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMDEvMTEvOTcgLSBKZXMKKyAqIEludGVycnVwdCBjb25maWd1cmluZyBtYWNyb3MuCiAgKi8KKyNkZWZpbmUgbG9jYWxfaXJxX2Rpc2FibGUoKSBcCisJZG8geyBcCisJCWludCBfX3RtcF9kdW1teTsgXAorCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyggXAorCQkJImNsaSAlMDsiIFwKKwkJCTogIj1kIiAoX190bXBfZHVtbXkpIFwKKwkJKTsgXAorCX0gd2hpbGUgKDApCiAKLWV4dGVybiB2b2lkIGFja19iYWRfaXJxKHVuc2lnbmVkIGludCBpcnEpOworI2RlZmluZSBsb2NhbF9pcnFfZW5hYmxlKCkgXAorCV9fYXNtX18gX192b2xhdGlsZV9fKCBcCisJCSJzdGkgJTA7IiBcCisJCTogXAorCQk6ICJkIiAoYmZpbl9pcnFfZmxhZ3MpIFwKKwkpCiAKLXN0YXRpYyBfX2lubGluZV9fIGludCBpcnFfY2Fub25pY2FsaXplKGludCBpcnEpCisjaWZkZWYgQ09ORklHX0RFQlVHX0hXRVJSCisjIGRlZmluZSBfX3NhdmVfYW5kX2NsaSh4KSBcCisJX19hc21fXyBfX3ZvbGF0aWxlX18oIFwKKwkJImNsaSAlMDsiIFwKKwkJInN0aSAlMTsiIFwKKwkJOiAiPSZkIiAoeCkgXAorCQk6ICJkIiAoMHgzRikgXAorCSkKKyNlbHNlCisjIGRlZmluZSBfX3NhdmVfYW5kX2NsaSh4KSBcCisJX19hc21fXyBfX3ZvbGF0aWxlX18oIFwKKwkJImNsaSAlMDsiIFwKKwkJOiAiPSZkIiAoeCkgXAorCSkKKyNlbmRpZgorCisjZGVmaW5lIGxvY2FsX3NhdmVfZmxhZ3MoeCkgXAorCV9fYXNtX18gX192b2xhdGlsZV9fKCBcCisJCSJjbGkgJTA7IiBcCisJCSJzdGkgJTA7IiBcCisJCTogIj1kIiAoeCkgXAorCSkKKworI2lmZGVmIENPTkZJR19ERUJVR19IV0VSUgorI2RlZmluZSBpcnFzX2VuYWJsZWRfZnJvbV9mbGFncyh4KSAoKCh4KSAmIH4weDNmKSAhPSAwKQorI2Vsc2UKKyNkZWZpbmUgaXJxc19lbmFibGVkX2Zyb21fZmxhZ3MoeCkgKCh4KSAhPSAweDFmKQorI2VuZGlmCisKKyNkZWZpbmUgbG9jYWxfaXJxX3Jlc3RvcmUoeCkgXAorCWRvIHsgXAorCQlpZiAoaXJxc19lbmFibGVkX2Zyb21fZmxhZ3MoeCkpIFwKKwkJCWxvY2FsX2lycV9lbmFibGUoKTsgXAorCX0gd2hpbGUgKDApCisKKy8qIEZvciBzcGlubG9ja3MgZXRjICovCisjZGVmaW5lIGxvY2FsX2lycV9zYXZlKHgpIF9fc2F2ZV9hbmRfY2xpKHgpCisKKyNkZWZpbmUgaXJxc19kaXNhYmxlZCgpCQkJCVwKKyh7CQkJCQkJXAorCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CQkJXAorCWxvY2FsX3NhdmVfZmxhZ3MoZmxhZ3MpOwkJXAorCSFpcnFzX2VuYWJsZWRfZnJvbV9mbGFncyhmbGFncyk7CVwKK30pCisKKyNkZWZpbmUgbG9jYWxfaXJxX3NhdmVfaHcoeCkJCWxvY2FsX2lycV9zYXZlKHgpCisjZGVmaW5lIGxvY2FsX2lycV9yZXN0b3JlX2h3KHgpCQlsb2NhbF9pcnFfcmVzdG9yZSh4KQorI2RlZmluZSBsb2NhbF9pcnFfZW5hYmxlX2h3KCkJCWxvY2FsX2lycV9lbmFibGUoKQorI2RlZmluZSBsb2NhbF9pcnFfZGlzYWJsZV9odygpCQlsb2NhbF9pcnFfZGlzYWJsZSgpCisjZGVmaW5lIGlycXNfZGlzYWJsZWRfaHcoKQkJaXJxc19kaXNhYmxlZCgpCisKKyNlbmRpZiAvKiAhQ09ORklHX0lQSVBFICovCisKKyNpZiBBTk9NQUxZXzA1MDAwMjQ0ICYmIGRlZmluZWQoQ09ORklHX0JGSU5fSUNBQ0hFKQorIyBkZWZpbmUgTk9QX1BBRF9BTk9NQUxZXzA1MDAwMjQ0ICJub3A7IG5vcDsiCisjZWxzZQorIyBkZWZpbmUgTk9QX1BBRF9BTk9NQUxZXzA1MDAwMjQ0CisjZW5kaWYKKworI2RlZmluZSBpZGxlX3dpdGhfaXJxX2Rpc2FibGVkKCkgXAorCV9fYXNtX18gX192b2xhdGlsZV9fKCBcCisJCU5PUF9QQURfQU5PTUFMWV8wNTAwMDI0NCBcCisJCSIuYWxpZ24gODsiIFwKKwkJInN0aSAlMDsiIFwKKwkJImlkbGU7IiBcCisJCTogXAorCQk6ICJkIiAoYmZpbl9pcnFfZmxhZ3MpIFwKKwkpCisKK3N0YXRpYyBpbmxpbmUgaW50IGlycV9jYW5vbmljYWxpemUoaW50IGlycSkKIHsKIAlyZXR1cm4gaXJxOwogfQogCi0vKiBjb3VudCBvZiBzcHVyaW91cyBpbnRlcnJ1cHRzICovCi0vKiBleHRlcm4gdm9sYXRpbGUgdW5zaWduZWQgaW50IG51bV9zcHVyaW91czsgKi8KLQotI2lmbmRlZiBOT19JUlEKLSNkZWZpbmUgTk9fSVJRICgodW5zaWduZWQgaW50KSgtMSkpCi0jZW5kaWYKLQotI2RlZmluZSBTSUNfU1lTSVJRKGlycSkJKGlycSAtIChJUlFfQ09SRVRNUiArIDEpKQotCiAjZW5kaWYJCQkJLyogX0JGSU5fSVJRX0hfICovCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2wxbGF5b3V0LmggYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2wxbGF5b3V0LmgKaW5kZXggYzEzZGVkNy4uNzlkYmVmYWEgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vbDFsYXlvdXQuaAorKysgYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL2wxbGF5b3V0LmgKQEAgLTgsNiArOCw3IEBACiAKICNpbmNsdWRlIDxhc20vYmxhY2tmaW4uaD4KIAorI2lmbmRlZiBDT05GSUdfU01QCiAjaWZuZGVmIF9fQVNTRU1CTFlfXwogCiAvKiBEYXRhIHRoYXQgaXMgIm1hcHBlZCIgaW50byB0aGUgcHJvY2VzcyBWTSBhdCB0aGUgc3RhcnQgb2YgdGhlIEwxIHNjcmF0Y2gKQEAgLTI0LDggKzI1LDEwIEBACiB9OwogCiAvKiBBIHBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSBpbiBtZW1vcnkuICAqLwotI2RlZmluZSBMMV9TQ1JBVENIX1RBU0tfSU5GTyAoKHN0cnVjdCBsMV9zY3JhdGNoX3Rhc2tfaW5mbyAqKUwxX1NDUkFUQ0hfU1RBUlQpCisjZGVmaW5lIEwxX1NDUkFUQ0hfVEFTS19JTkZPICgoc3RydWN0IGwxX3NjcmF0Y2hfdGFza19pbmZvICopXAorCQkJCQkJZ2V0X2wxX3NjcmF0Y2hfc3RhcnQoKSkKIAogI2VuZGlmCisjZW5kaWYKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL21lbV9pbml0LmggYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL21lbV9pbml0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjU1YTkzMQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vbWVtX2luaXQuaApAQCAtMCwwICsxLDM2NCBAQAorLyoKKyAqIGFyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vbWVtX2luaXQuaCAtIHJlcHJvZ3JhbSBjbG9ja3MgLyBtZW1vcnkKKyAqCisgKiBDb3B5cmlnaHQgMjAwNC0yMDA4IEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCisgKi8KKworI2lmIGRlZmluZWQoRUJJVV9TREdDVEwpCisjaWYgZGVmaW5lZChDT05GSUdfTUVNX01UNDhMQzE2TTE2QTJUR183NSkgfHwgXAorICAgIGRlZmluZWQoQ09ORklHX01FTV9NVDQ4TEM2NE00QTJGQl83RSkgfHwgXAorICAgIGRlZmluZWQoQ09ORklHX01FTV9NVDQ4TEMxNk04QTJUR183NSkgfHwgXAorICAgIGRlZmluZWQoQ09ORklHX01FTV9HRU5FUklDX0JPQVJEKSB8fCBcCisgICAgZGVmaW5lZChDT05GSUdfTUVNX01UNDhMQzMyTThBMl83NSkgfHwgXAorICAgIGRlZmluZWQoQ09ORklHX01FTV9NVDQ4TEM4TTMyQjJCNV83KSB8fCBcCisgICAgZGVmaW5lZChDT05GSUdfTUVNX01UNDhMQzMyTTE2QTJUR183NSkgfHwgXAorICAgIGRlZmluZWQoQ09ORklHX01FTV9NVDQ4TEMzMk04QTJfNzUpCisjaWYgKENPTkZJR19TQ0xLX0haID4gMTE5NDAyOTg1KQorI2RlZmluZSBTRFJBTV90UlAgICAgICAgVFJQXzIKKyNkZWZpbmUgU0RSQU1fdFJQX251bSAgIDIKKyNkZWZpbmUgU0RSQU1fdFJBUyAgICAgIFRSQVNfNworI2RlZmluZSBTRFJBTV90UkFTX251bSAgNworI2RlZmluZSBTRFJBTV90UkNEICAgICAgVFJDRF8yCisjZGVmaW5lIFNEUkFNX3RXUiAgICAgICBUV1JfMgorI2VuZGlmCisjaWYgKENPTkZJR19TQ0xLX0haID4gMTA0NDc3NjEyKSAmJiAoQ09ORklHX1NDTEtfSFogPD0gMTE5NDAyOTg1KQorI2RlZmluZSBTRFJBTV90UlAgICAgICAgVFJQXzIKKyNkZWZpbmUgU0RSQU1fdFJQX251bSAgIDIKKyNkZWZpbmUgU0RSQU1fdFJBUyAgICAgIFRSQVNfNgorI2RlZmluZSBTRFJBTV90UkFTX251bSAgNgorI2RlZmluZSBTRFJBTV90UkNEICAgICAgVFJDRF8yCisjZGVmaW5lIFNEUkFNX3RXUiAgICAgICBUV1JfMgorI2VuZGlmCisjaWYgKENPTkZJR19TQ0xLX0haID4gODk1NTIyMzkpICYmIChDT05GSUdfU0NMS19IWiA8PSAxMDQ0Nzc2MTIpCisjZGVmaW5lIFNEUkFNX3RSUCAgICAgICBUUlBfMgorI2RlZmluZSBTRFJBTV90UlBfbnVtICAgMgorI2RlZmluZSBTRFJBTV90UkFTICAgICAgVFJBU181CisjZGVmaW5lIFNEUkFNX3RSQVNfbnVtICA1CisjZGVmaW5lIFNEUkFNX3RSQ0QgICAgICBUUkNEXzIKKyNkZWZpbmUgU0RSQU1fdFdSICAgICAgIFRXUl8yCisjZW5kaWYKKyNpZiAoQ09ORklHX1NDTEtfSFogPiA3NDYyNjg2NikgJiYgKENPTkZJR19TQ0xLX0haIDw9IDg5NTUyMjM5KQorI2RlZmluZSBTRFJBTV90UlAgICAgICAgVFJQXzIKKyNkZWZpbmUgU0RSQU1fdFJQX251bSAgIDIKKyNkZWZpbmUgU0RSQU1fdFJBUyAgICAgIFRSQVNfNAorI2RlZmluZSBTRFJBTV90UkFTX251bSAgNAorI2RlZmluZSBTRFJBTV90UkNEICAgICAgVFJDRF8yCisjZGVmaW5lIFNEUkFNX3RXUiAgICAgICBUV1JfMgorI2VuZGlmCisjaWYgKENPTkZJR19TQ0xLX0haID4gNjY2NjY2NjcpICYmIChDT05GSUdfU0NMS19IWiA8PSA3NDYyNjg2NikKKyNkZWZpbmUgU0RSQU1fdFJQICAgICAgIFRSUF8yCisjZGVmaW5lIFNEUkFNX3RSUF9udW0gICAyCisjZGVmaW5lIFNEUkFNX3RSQVMgICAgICBUUkFTXzMKKyNkZWZpbmUgU0RSQU1fdFJBU19udW0gIDMKKyNkZWZpbmUgU0RSQU1fdFJDRCAgICAgIFRSQ0RfMgorI2RlZmluZSBTRFJBTV90V1IgICAgICAgVFdSXzIKKyNlbmRpZgorI2lmIChDT05GSUdfU0NMS19IWiA+IDU5NzAxNDkzKSAmJiAoQ09ORklHX1NDTEtfSFogPD0gNjY2NjY2NjcpCisjZGVmaW5lIFNEUkFNX3RSUCAgICAgICBUUlBfMQorI2RlZmluZSBTRFJBTV90UlBfbnVtICAgMQorI2RlZmluZSBTRFJBTV90UkFTICAgICAgVFJBU180CisjZGVmaW5lIFNEUkFNX3RSQVNfbnVtICAzCisjZGVmaW5lIFNEUkFNX3RSQ0QgICAgICBUUkNEXzEKKyNkZWZpbmUgU0RSQU1fdFdSICAgICAgIFRXUl8yCisjZW5kaWYKKyNpZiAoQ09ORklHX1NDTEtfSFogPiA0NDc3NjExOSkgJiYgKENPTkZJR19TQ0xLX0haIDw9IDU5NzAxNDkzKQorI2RlZmluZSBTRFJBTV90UlAgICAgICAgVFJQXzEKKyNkZWZpbmUgU0RSQU1fdFJQX251bSAgIDEKKyNkZWZpbmUgU0RSQU1fdFJBUyAgICAgIFRSQVNfMworI2RlZmluZSBTRFJBTV90UkFTX251bSAgMworI2RlZmluZSBTRFJBTV90UkNEICAgICAgVFJDRF8xCisjZGVmaW5lIFNEUkFNX3RXUiAgICAgICBUV1JfMgorI2VuZGlmCisjaWYgKENPTkZJR19TQ0xLX0haID4gMjk4NTA3NDYpICYmIChDT05GSUdfU0NMS19IWiA8PSA0NDc3NjExOSkKKyNkZWZpbmUgU0RSQU1fdFJQICAgICAgIFRSUF8xCisjZGVmaW5lIFNEUkFNX3RSUF9udW0gICAxCisjZGVmaW5lIFNEUkFNX3RSQVMgICAgICBUUkFTXzIKKyNkZWZpbmUgU0RSQU1fdFJBU19udW0gIDIKKyNkZWZpbmUgU0RSQU1fdFJDRCAgICAgIFRSQ0RfMQorI2RlZmluZSBTRFJBTV90V1IgICAgICAgVFdSXzIKKyNlbmRpZgorI2lmIChDT05GSUdfU0NMS19IWiA8PSAyOTg1MDc0NikKKyNkZWZpbmUgU0RSQU1fdFJQICAgICAgIFRSUF8xCisjZGVmaW5lIFNEUkFNX3RSUF9udW0gICAxCisjZGVmaW5lIFNEUkFNX3RSQVMgICAgICBUUkFTXzEKKyNkZWZpbmUgU0RSQU1fdFJBU19udW0gIDEKKyNkZWZpbmUgU0RSQU1fdFJDRCAgICAgIFRSQ0RfMQorI2RlZmluZSBTRFJBTV90V1IgICAgICAgVFdSXzIKKyNlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19NRU1fTVQ0OExDMTZNOEEyVEdfNzUpIHx8IFwKKyAgICBkZWZpbmVkKENPTkZJR19NRU1fTVQ0OExDOE0zMkIyQjVfNykKKyAgLypTRFJBTSBJTkZPUk1BVElPTjogKi8KKyNkZWZpbmUgU0RSQU1fVHJlZiAgNjQJCS8qIFJlZnJlc2ggcGVyaW9kIGluIG1pbGxpc2Vjb25kcyAgICovCisjZGVmaW5lIFNEUkFNX05SQSAgIDQwOTYJLyogTnVtYmVyIG9mIHJvdyBhZGRyZXNzZXMgaW4gU0RSQU0gKi8KKyNkZWZpbmUgU0RSQU1fQ0wgICAgQ0xfMworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19NRU1fTVQ0OExDMzJNOEEyXzc1KSB8fCBcCisgICAgZGVmaW5lZChDT05GSUdfTUVNX01UNDhMQzY0TTRBMkZCXzdFKSB8fCBcCisgICAgZGVmaW5lZChDT05GSUdfTUVNX0dFTkVSSUNfQk9BUkQpIHx8IFwKKyAgICBkZWZpbmVkKENPTkZJR19NRU1fTVQ0OExDMzJNMTZBMlRHXzc1KSB8fCBcCisgICAgZGVmaW5lZChDT05GSUdfTUVNX01UNDhMQzE2TTE2QTJUR183NSkgfHwgXAorICAgIGRlZmluZWQoQ09ORklHX01FTV9NVDQ4TEMzMk04QTJfNzUpCisgIC8qU0RSQU0gSU5GT1JNQVRJT046ICovCisjZGVmaW5lIFNEUkFNX1RyZWYgIDY0CQkvKiBSZWZyZXNoIHBlcmlvZCBpbiBtaWxsaXNlY29uZHMgICAqLworI2RlZmluZSBTRFJBTV9OUkEgICA4MTkyCS8qIE51bWJlciBvZiByb3cgYWRkcmVzc2VzIGluIFNEUkFNICovCisjZGVmaW5lIFNEUkFNX0NMICAgIENMXzMKKyNlbmRpZgorCisKKyNpZmRlZiBDT05GSUdfQkZJTl9LRVJORUxfQ0xPQ0tfTUVNSU5JVF9DQUxDCisvKiBFcXVhdGlvbiBmcm9tIHNlY3Rpb24gMTcgKHAxNy00Nikgb2YgQkY1MzMgSFJNICovCisjZGVmaW5lIG1lbV9TRFJSQyAgICAgICAoKChDT05GSUdfU0NMS19IWiAvIDEwMDApICogU0RSQU1fVHJlZikgLyBTRFJBTV9OUkEpIC0gKFNEUkFNX3RSQVNfbnVtICsgU0RSQU1fdFJQX251bSkKKworLyogRW5hYmxlIFNDTEsgT3V0ICovCisjZGVmaW5lIG1lbV9TREdDVEwgICAgICAgICgweDgwMDAwMDAwIHwgU0NUTEUgfCBTRFJBTV9DTCB8IFNEUkFNX3RSQVMgfCBTRFJBTV90UlAgfCBTRFJBTV90UkNEIHwgU0RSQU1fdFdSIHwgUFNTKQorI2Vsc2UKKyNkZWZpbmUgbWVtX1NEUlJDIAlDT05GSUdfTUVNX1NEUlJDCisjZGVmaW5lIG1lbV9TREdDVEwJQ09ORklHX01FTV9TREdDVEwKKyNlbmRpZgorI2VuZGlmCisKKworI2lmIGRlZmluZWQoRUJJVV9ERFJDVEwwKQorI2RlZmluZSBNSU5fRERSX1NDTEsoeCkJKHgqKENPTkZJR19TQ0xLX0haLzEwMDAvMTAwMCkvMTAwMCArIDEpCisjZGVmaW5lIE1BWF9ERFJfU0NMSyh4KQkoeCooQ09ORklHX1NDTEtfSFovMTAwMC8xMDAwKS8xMDAwKQorI2RlZmluZSBERFJfQ0xLX0haKHgpCSgxMDAwKjEwMDAqMTAwMC94KQorCisjaWYgZGVmaW5lZChDT05GSUdfTUVNX01UNDZWMzJNMTZfNlQpCisjZGVmaW5lIEREUl9TSVpFCURFVlNaXzUxMgorI2RlZmluZSBERFJfV0lEVEgJREVWV0RfMTYKKyNkZWZpbmUgRERSX01BWF90Q0sJMTMKKworI2RlZmluZSBERFJfdFJDCQlERFJfVFJDKE1JTl9ERFJfU0NMSyg2MCkpCisjZGVmaW5lIEREUl90UkFTCUREUl9UUkFTKE1JTl9ERFJfU0NMSyg0MikpCisjZGVmaW5lIEREUl90UlAJCUREUl9UUlAoTUlOX0REUl9TQ0xLKDE1KSkKKyNkZWZpbmUgRERSX3RSRkMJRERSX1RSRkMoTUlOX0REUl9TQ0xLKDcyKSkKKyNkZWZpbmUgRERSX3RSRUZJCUREUl9UUkVGSShNQVhfRERSX1NDTEsoNzgwMCkpCisKKyNkZWZpbmUgRERSX3RSQ0QJRERSX1RSQ0QoTUlOX0REUl9TQ0xLKDE1KSkKKyNkZWZpbmUgRERSX3RXVFIJRERSX1RXVFIoMSkKKyNkZWZpbmUgRERSX3RNUkQJRERSX1RNUkQoTUlOX0REUl9TQ0xLKDEyKSkKKyNkZWZpbmUgRERSX3RXUgkJRERSX1RXUihNSU5fRERSX1NDTEsoMTUpKQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19NRU1fTVQ0NlYzMk0xNl81QikKKyNkZWZpbmUgRERSX1NJWkUJREVWU1pfNTEyCisjZGVmaW5lIEREUl9XSURUSAlERVZXRF8xNgorI2RlZmluZSBERFJfTUFYX3RDSwkxMworCisjZGVmaW5lIEREUl90UkMJCUREUl9UUkMoTUlOX0REUl9TQ0xLKDU1KSkKKyNkZWZpbmUgRERSX3RSQVMJRERSX1RSQVMoTUlOX0REUl9TQ0xLKDQwKSkKKyNkZWZpbmUgRERSX3RSUAkJRERSX1RSUChNSU5fRERSX1NDTEsoMTUpKQorI2RlZmluZSBERFJfdFJGQwlERFJfVFJGQyhNSU5fRERSX1NDTEsoNzApKQorI2RlZmluZSBERFJfdFJFRkkJRERSX1RSRUZJKE1BWF9ERFJfU0NMSyg3ODAwKSkKKworI2RlZmluZSBERFJfdFJDRAlERFJfVFJDRChNSU5fRERSX1NDTEsoMTUpKQorI2RlZmluZSBERFJfdFdUUglERFJfVFdUUigyKQorI2RlZmluZSBERFJfdE1SRAlERFJfVE1SRChNSU5fRERSX1NDTEsoMTApKQorI2RlZmluZSBERFJfdFdSCQlERFJfVFdSKE1JTl9ERFJfU0NMSygxNSkpCisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX01FTV9HRU5FUklDX0JPQVJEKQorI2RlZmluZSBERFJfU0laRQlERVZTWl81MTIKKyNkZWZpbmUgRERSX1dJRFRICURFVldEXzE2CisjZGVmaW5lIEREUl9NQVhfdENLCTEzCisKKyNkZWZpbmUgRERSX3RSQ0QJRERSX1RSQ0QoMykKKyNkZWZpbmUgRERSX3RXVFIJRERSX1RXVFIoMikKKyNkZWZpbmUgRERSX3RXUgkJRERSX1RXUigyKQorI2RlZmluZSBERFJfdE1SRAlERFJfVE1SRCgyKQorI2RlZmluZSBERFJfdFJQCQlERFJfVFJQKDMpCisjZGVmaW5lIEREUl90UkFTCUREUl9UUkFTKDcpCisjZGVmaW5lIEREUl90UkMJCUREUl9UUkMoMTApCisjZGVmaW5lIEREUl90UkZDCUREUl9UUkZDKDEyKQorI2RlZmluZSBERFJfdFJFRkkJRERSX1RSRUZJKDEyODgpCisjZW5kaWYKKworI2lmIChDT05GSUdfU0NMS19IWiA8IEREUl9DTEtfSFooRERSX01BWF90Q0spKQorIyBlcnJvciAiQ09ORklHX1NDTEtfSFogaXMgdG9vIHNtYWxsICg8RERSX0NMS19IWihERFJfTUFYX3RDSykgSHopLiIKKyNlbGlmKENPTkZJR19TQ0xLX0haIDw9IDEzMzMzMzMzMykKKyMgZGVmaW5lCUREUl9DTAkJQ0xfMgorI2Vsc2UKKyMgZXJyb3IgIkNPTkZJR19TQ0xLX0haIGlzIHRvbyBsYXJnZSAoPjEzMzMzMzMzMyBIeikuIgorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfQkZJTl9LRVJORUxfQ0xPQ0tfTUVNSU5JVF9DQUxDCisjZGVmaW5lIG1lbV9ERFJDVEwwCShERFJfdFJQIHwgRERSX3RSQVMgfCBERFJfdFJDIHwgRERSX3RSRkMgfCBERFJfdFJFRkkpCisjZGVmaW5lIG1lbV9ERFJDVEwxCShERFJfREFUV0lEVEggfCBFWFRCQU5LXzEgfCBERFJfU0laRSB8IEREUl9XSURUSCB8IEREUl90V1RSIFwKKwkJCXwgRERSX3RNUkQgfCBERFJfdFdSIHwgRERSX3RSQ0QpCisjZGVmaW5lIG1lbV9ERFJDVEwyCUREUl9DTAorI2Vsc2UKKyNkZWZpbmUgbWVtX0REUkNUTDAJQ09ORklHX01FTV9ERFJDVEwwCisjZGVmaW5lIG1lbV9ERFJDVEwxCUNPTkZJR19NRU1fRERSQ1RMMQorI2RlZmluZSBtZW1fRERSQ1RMMglDT05GSUdfTUVNX0REUkNUTDIKKyNlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIENPTkZJR19DTEtJTl9IQUxGCisjZGVmaW5lIENMS0lOX0hBTEYgICAgICAgMQorI2Vsc2UKKyNkZWZpbmUgQ0xLSU5fSEFMRiAgICAgICAwCisjZW5kaWYKKworI2lmIGRlZmluZWQgQ09ORklHX1BMTF9CWVBBU1MKKyNkZWZpbmUgUExMX0JZUEFTUyAgICAgIDEKKyNlbHNlCisjZGVmaW5lIFBMTF9CWVBBU1MgICAgICAgMAorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipDdXJyZW50bHkgTm90IEJlaW5nIFVzZWQgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWYgZGVmaW5lZChDT05GSUdfRkxBU0hfU1BFRURfQldBVCkgJiYgXAorZGVmaW5lZChDT05GSUdfRkxBU0hfU1BFRURfQlJBVCkgJiYgXAorZGVmaW5lZChDT05GSUdfRkxBU0hfU1BFRURfQkhUKSAmJiBcCitkZWZpbmVkKENPTkZJR19GTEFTSF9TUEVFRF9CU1QpICYmIFwKK2RlZmluZWQoQ09ORklHX0ZMQVNIX1NQRUVEX0JUVCkKKworI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTF9XQVQgICgoQ09ORklHX0ZMQVNIX1NQRUVEX0JXQVQgKiA0KSAvICg0MDAwMDAwMDAwIC8gQ09ORklHX1NDTEtfSFopKSArIDEKKyNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVExfUkFUICAoKENPTkZJR19GTEFTSF9TUEVFRF9CUkFUICogNCkgLyAoNDAwMDAwMDAwMCAvIENPTkZJR19TQ0xLX0haKSkgKyAxCisjZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMX0hUICAgKChDT05GSUdfRkxBU0hfU1BFRURfQkhUICAqIDQpIC8gKDQwMDAwMDAwMDAgLyBDT05GSUdfU0NMS19IWikpCisjZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMX1NUICAgKChDT05GSUdfRkxBU0hfU1BFRURfQlNUICAqIDQpIC8gKDQwMDAwMDAwMDAgLyBDT05GSUdfU0NMS19IWikpICsgMQorI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTF9UVCAgICgoQ09ORklHX0ZMQVNIX1NQRUVEX0JUVCAgKiA0KSAvICg0MDAwMDAwMDAwIC8gQ09ORklHX1NDTEtfSFopKSArIDEKKworI2lmIChmbGFzaF9FQklVX0FNQkNUTF9UVCA+IDMpCisjZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9UVCAgIEIwVFRfNAorI2VuZGlmCisjaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1RUID09IDMpCisjZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9UVCAgIEIwVFRfMworI2VuZGlmCisjaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1RUID09IDIpCisjZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9UVCAgIEIwVFRfMgorI2VuZGlmCisjaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1RUIDwgMikKKyNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1RUICAgQjBUVF8xCisjZW5kaWYKKworI2lmIChmbGFzaF9FQklVX0FNQkNUTF9TVCA+IDMpCisjZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9TVCAgIEIwU1RfNAorI2VuZGlmCisjaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1NUID09IDMpCisjZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9TVCAgIEIwU1RfMworI2VuZGlmCisjaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1NUID09IDIpCisjZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9TVCAgIEIwU1RfMgorI2VuZGlmCisjaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1NUIDwgMikKKyNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1NUICAgQjBTVF8xCisjZW5kaWYKKworI2lmIChmbGFzaF9FQklVX0FNQkNUTF9IVCA+IDIpCisjZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9IVCAgIEIwSFRfMworI2VuZGlmCisjaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX0hUID09IDIpCisjZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9IVCAgIEIwSFRfMgorI2VuZGlmCisjaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX0hUID09IDEpCisjZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9IVCAgIEIwSFRfMQorI2VuZGlmCisjaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX0hUID09IDAgJiYgQ09ORklHX0ZMQVNIX1NQRUVEX0JIVCA9PSAwKQorI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfSFQgICBCMEhUXzAKKyNlbmRpZgorI2lmIChmbGFzaF9FQklVX0FNQkNUTF9IVCA9PSAwICYmIENPTkZJR19GTEFTSF9TUEVFRF9CSFQgIT0gMCkKKyNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX0hUICAgQjBIVF8xCisjZW5kaWYKKworI2lmIChmbGFzaF9FQklVX0FNQkNUTF9XQVQgPiAxNCkKKyNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1dBVCAgQjBXQVRfMTUKKyNlbmRpZgorI2lmIChmbGFzaF9FQklVX0FNQkNUTF9XQVQgPT0gMTQpCisjZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9XQVQgIEIwV0FUXzE0CisjZW5kaWYKKyNpZiAoZmxhc2hfRUJJVV9BTUJDVExfV0FUID09IDEzKQorI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfV0FUICBCMFdBVF8xMworI2VuZGlmCisjaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1dBVCA9PSAxMikKKyNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1dBVCAgQjBXQVRfMTIKKyNlbmRpZgorI2lmIChmbGFzaF9FQklVX0FNQkNUTF9XQVQgPT0gMTEpCisjZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9XQVQgIEIwV0FUXzExCisjZW5kaWYKKyNpZiAoZmxhc2hfRUJJVV9BTUJDVExfV0FUID09IDEwKQorI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfV0FUICBCMFdBVF8xMAorI2VuZGlmCisjaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1dBVCA9PSA5KQorI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfV0FUICBCMFdBVF85CisjZW5kaWYKKyNpZiAoZmxhc2hfRUJJVV9BTUJDVExfV0FUID09IDgpCisjZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9XQVQgIEIwV0FUXzgKKyNlbmRpZgorI2lmIChmbGFzaF9FQklVX0FNQkNUTF9XQVQgPT0gNykKKyNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1dBVCAgQjBXQVRfNworI2VuZGlmCisjaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1dBVCA9PSA2KQorI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfV0FUICBCMFdBVF82CisjZW5kaWYKKyNpZiAoZmxhc2hfRUJJVV9BTUJDVExfV0FUID09IDUpCisjZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9XQVQgIEIwV0FUXzUKKyNlbmRpZgorI2lmIChmbGFzaF9FQklVX0FNQkNUTF9XQVQgPT0gNCkKKyNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1dBVCAgQjBXQVRfNAorI2VuZGlmCisjaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1dBVCA9PSAzKQorI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfV0FUICBCMFdBVF8zCisjZW5kaWYKKyNpZiAoZmxhc2hfRUJJVV9BTUJDVExfV0FUID09IDIpCisjZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9XQVQgIEIwV0FUXzIKKyNlbmRpZgorI2lmIChmbGFzaF9FQklVX0FNQkNUTF9XQVQgPT0gMSkKKyNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1dBVCAgQjBXQVRfMQorI2VuZGlmCisKKyNpZiAoZmxhc2hfRUJJVV9BTUJDVExfUkFUID4gMTQpCisjZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9SQVQgIEIwUkFUXzE1CisjZW5kaWYKKyNpZiAoZmxhc2hfRUJJVV9BTUJDVExfUkFUID09IDE0KQorI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfUkFUICBCMFJBVF8xNAorI2VuZGlmCisjaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1JBVCA9PSAxMykKKyNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1JBVCAgQjBSQVRfMTMKKyNlbmRpZgorI2lmIChmbGFzaF9FQklVX0FNQkNUTF9SQVQgPT0gMTIpCisjZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9SQVQgIEIwUkFUXzEyCisjZW5kaWYKKyNpZiAoZmxhc2hfRUJJVV9BTUJDVExfUkFUID09IDExKQorI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfUkFUICBCMFJBVF8xMQorI2VuZGlmCisjaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1JBVCA9PSAxMCkKKyNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1JBVCAgQjBSQVRfMTAKKyNlbmRpZgorI2lmIChmbGFzaF9FQklVX0FNQkNUTF9SQVQgPT0gOSkKKyNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1JBVCAgQjBSQVRfOQorI2VuZGlmCisjaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1JBVCA9PSA4KQorI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfUkFUICBCMFJBVF84CisjZW5kaWYKKyNpZiAoZmxhc2hfRUJJVV9BTUJDVExfUkFUID09IDcpCisjZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9SQVQgIEIwUkFUXzcKKyNlbmRpZgorI2lmIChmbGFzaF9FQklVX0FNQkNUTF9SQVQgPT0gNikKKyNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1JBVCAgQjBSQVRfNgorI2VuZGlmCisjaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1JBVCA9PSA1KQorI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfUkFUICBCMFJBVF81CisjZW5kaWYKKyNpZiAoZmxhc2hfRUJJVV9BTUJDVExfUkFUID09IDQpCisjZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9SQVQgIEIwUkFUXzQKKyNlbmRpZgorI2lmIChmbGFzaF9FQklVX0FNQkNUTF9SQVQgPT0gMykKKyNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1JBVCAgQjBSQVRfMworI2VuZGlmCisjaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1JBVCA9PSAyKQorI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfUkFUICBCMFJBVF8yCisjZW5kaWYKKyNpZiAoZmxhc2hfRUJJVV9BTUJDVExfUkFUID09IDEpCisjZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9SQVQgIEIwUkFUXzEKKyNlbmRpZgorCisjZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMCAgXAorCShmbGFzaF9FQklVX0FNQkNUTDBfV0FUIHwgZmxhc2hfRUJJVV9BTUJDVEwwX1JBVCB8IGZsYXNoX0VCSVVfQU1CQ1RMMF9IVCB8IFwKKwkgZmxhc2hfRUJJVV9BTUJDVEwwX1NUIHwgZmxhc2hfRUJJVV9BTUJDVEwwX1RUIHwgQ09ORklHX0ZMQVNIX1NQRUVEX1JEWUVOKQorI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL21lbV9tYXAuaCBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vbWVtX21hcC5oCmluZGV4IDg4ZDA0YTcuLmU5MmIzMTAgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vbWVtX21hcC5oCisrKyBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vbWVtX21hcC5oCkBAIC05LDQgKzksNzkgQEAKIAogI2luY2x1ZGUgPG1hY2gvbWVtX21hcC5oPgogCisjaWZuZGVmIF9fQVNTRU1CTFlfXworCisjaWZkZWYgQ09ORklHX1NNUAorc3RhdGljIGlubGluZSB1bG9uZyBnZXRfbDFfc2NyYXRjaF9zdGFydF9jcHUoaW50IGNwdSkKK3sKKwlyZXR1cm4gKGNwdSkgPyBDT1JFQl9MMV9TQ1JBVENIX1NUQVJUIDogQ09SRUFfTDFfU0NSQVRDSF9TVEFSVDsKK30KK3N0YXRpYyBpbmxpbmUgdWxvbmcgZ2V0X2wxX2NvZGVfc3RhcnRfY3B1KGludCBjcHUpCit7CisJcmV0dXJuIChjcHUpID8gQ09SRUJfTDFfQ09ERV9TVEFSVCA6IENPUkVBX0wxX0NPREVfU1RBUlQ7Cit9CitzdGF0aWMgaW5saW5lIHVsb25nIGdldF9sMV9kYXRhX2Ffc3RhcnRfY3B1KGludCBjcHUpCit7CisJcmV0dXJuIChjcHUpID8gQ09SRUJfTDFfREFUQV9BX1NUQVJUIDogQ09SRUFfTDFfREFUQV9BX1NUQVJUOworfQorc3RhdGljIGlubGluZSB1bG9uZyBnZXRfbDFfZGF0YV9iX3N0YXJ0X2NwdShpbnQgY3B1KQoreworCXJldHVybiAoY3B1KSA/IENPUkVCX0wxX0RBVEFfQl9TVEFSVCA6IENPUkVBX0wxX0RBVEFfQl9TVEFSVDsKK30KKworc3RhdGljIGlubGluZSB1bG9uZyBnZXRfbDFfc2NyYXRjaF9zdGFydCh2b2lkKQoreworCXJldHVybiBnZXRfbDFfc2NyYXRjaF9zdGFydF9jcHUoYmxhY2tmaW5fY29yZV9pZCgpKTsKK30KK3N0YXRpYyBpbmxpbmUgdWxvbmcgZ2V0X2wxX2NvZGVfc3RhcnQodm9pZCkKK3sKKwlyZXR1cm4gZ2V0X2wxX2NvZGVfc3RhcnRfY3B1KGJsYWNrZmluX2NvcmVfaWQoKSk7Cit9CitzdGF0aWMgaW5saW5lIHVsb25nIGdldF9sMV9kYXRhX2Ffc3RhcnQodm9pZCkKK3sKKwlyZXR1cm4gZ2V0X2wxX2RhdGFfYV9zdGFydF9jcHUoYmxhY2tmaW5fY29yZV9pZCgpKTsKK30KK3N0YXRpYyBpbmxpbmUgdWxvbmcgZ2V0X2wxX2RhdGFfYl9zdGFydCh2b2lkKQoreworCXJldHVybiBnZXRfbDFfZGF0YV9iX3N0YXJ0X2NwdShibGFja2Zpbl9jb3JlX2lkKCkpOworfQorCisjZWxzZSAvKiAhQ09ORklHX1NNUCAqLworCitzdGF0aWMgaW5saW5lIHVsb25nIGdldF9sMV9zY3JhdGNoX3N0YXJ0X2NwdShpbnQgY3B1KQoreworCXJldHVybiBMMV9TQ1JBVENIX1NUQVJUOworfQorc3RhdGljIGlubGluZSB1bG9uZyBnZXRfbDFfY29kZV9zdGFydF9jcHUoaW50IGNwdSkKK3sKKwlyZXR1cm4gTDFfQ09ERV9TVEFSVDsKK30KK3N0YXRpYyBpbmxpbmUgdWxvbmcgZ2V0X2wxX2RhdGFfYV9zdGFydF9jcHUoaW50IGNwdSkKK3sKKwlyZXR1cm4gTDFfREFUQV9BX1NUQVJUOworfQorc3RhdGljIGlubGluZSB1bG9uZyBnZXRfbDFfZGF0YV9iX3N0YXJ0X2NwdShpbnQgY3B1KQoreworCXJldHVybiBMMV9EQVRBX0JfU1RBUlQ7Cit9CitzdGF0aWMgaW5saW5lIHVsb25nIGdldF9sMV9zY3JhdGNoX3N0YXJ0KHZvaWQpCit7CisJcmV0dXJuIGdldF9sMV9zY3JhdGNoX3N0YXJ0X2NwdSgwKTsKK30KK3N0YXRpYyBpbmxpbmUgdWxvbmcgZ2V0X2wxX2NvZGVfc3RhcnQodm9pZCkKK3sKKwlyZXR1cm4gIGdldF9sMV9jb2RlX3N0YXJ0X2NwdSgwKTsKK30KK3N0YXRpYyBpbmxpbmUgdWxvbmcgZ2V0X2wxX2RhdGFfYV9zdGFydCh2b2lkKQoreworCXJldHVybiBnZXRfbDFfZGF0YV9hX3N0YXJ0X2NwdSgwKTsKK30KK3N0YXRpYyBpbmxpbmUgdWxvbmcgZ2V0X2wxX2RhdGFfYl9zdGFydCh2b2lkKQoreworCXJldHVybiBnZXRfbDFfZGF0YV9iX3N0YXJ0X2NwdSgwKTsKK30KKworI2VuZGlmIC8qIENPTkZJR19TTVAgKi8KKyNlbmRpZiAvKiBfX0FTU0VNQkxZX18gKi8KKwogI2VuZGlmCQkJCS8qIF9NRU1fTUFQX0hfICovCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL21tdS5oIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9tbXUuaAppbmRleCA3NTdlNDM5Li5kYmZkNjg2IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL21tdS5oCisrKyBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vbW11LmgKQEAgLTEwLDcgKzEwLDYgQEAKIH07CiAKIHR5cGVkZWYgc3RydWN0IHsKLQlzdHJ1Y3Qgdm1fbGlzdF9zdHJ1Y3QgKnZtbGlzdDsKIAl1bnNpZ25lZCBsb25nIGVuZF9icms7CiAJdW5zaWduZWQgbG9uZyBzdGFja19zdGFydDsKIApkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9tbXVfY29udGV4dC5oIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9tbXVfY29udGV4dC5oCmluZGV4IDM1NTkzZGQuLjk0NGUyOWYgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vbW11X2NvbnRleHQuaAorKysgYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL21tdV9jb250ZXh0LmgKQEAgLTM3LDYgKzM3LDEwIEBACiAjaW5jbHVkZSA8YXNtL3BnYWxsb2MuaD4KICNpbmNsdWRlIDxhc20vY3BsYmluaXQuaD4KIAorLyogTm90ZTogTDEgc3RhY2tzIGFyZSBDUFUtcHJpdmF0ZSB0aGluZ3MsIHNvIHdlIGJsdW50bHkgZGlzYWJsZSB0aGlzCisgICBmZWF0dXJlIGluIFNNUCBtb2RlLCBhbmQgdXNlIHRoZSBwZXItQ1BVIHNjcmF0Y2ggU1JBTSBiYW5rIG9ubHkgdG8KKyAgIHN0b3JlIHRoZSBQREEgaW5zdGVhZC4gKi8KKwogZXh0ZXJuIHZvaWQgKmN1cnJlbnRfbDFfc3RhY2tfc2F2ZTsKIGV4dGVybiBpbnQgbnJfbDFzdGFja190YXNrczsKIGV4dGVybiB2b2lkICpsMV9zdGFja19iYXNlOwpAQCAtODgsMTIgKzkyLDE1IEBACiBzdGF0aWMgaW5saW5lIHZvaWQgc3dpdGNoX21tKHN0cnVjdCBtbV9zdHJ1Y3QgKnByZXZfbW0sIHN0cnVjdCBtbV9zdHJ1Y3QgKm5leHRfbW0sCiAJCQkgICAgIHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKQogeworI2lmZGVmIENPTkZJR19NUFUKKwl1bnNpZ25lZCBpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOworI2VuZGlmCiAJaWYgKHByZXZfbW0gPT0gbmV4dF9tbSkKIAkJcmV0dXJuOwogI2lmZGVmIENPTkZJR19NUFUKLQlpZiAocHJldl9tbS0+Y29udGV4dC5wYWdlX3J3eF9tYXNrID09IGN1cnJlbnRfcnd4X21hc2spIHsKLQkJZmx1c2hfc3dpdGNoZWRfY3BsYnMoKTsKLQkJc2V0X21hc2tfZGNwbGJzKG5leHRfbW0tPmNvbnRleHQucGFnZV9yd3hfbWFzayk7CisJaWYgKHByZXZfbW0tPmNvbnRleHQucGFnZV9yd3hfbWFzayA9PSBjdXJyZW50X3J3eF9tYXNrW2NwdV0pIHsKKwkJZmx1c2hfc3dpdGNoZWRfY3BsYnMoY3B1KTsKKwkJc2V0X21hc2tfZGNwbGJzKG5leHRfbW0tPmNvbnRleHQucGFnZV9yd3hfbWFzaywgY3B1KTsKIAl9CiAjZW5kaWYKIApAQCAtMTM4LDkgKzE0NSwxMCBAQAogCiBzdGF0aWMgaW5saW5lIHZvaWQgdXBkYXRlX3Byb3RlY3Rpb25zKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKQogewotCWlmIChtbS0+Y29udGV4dC5wYWdlX3J3eF9tYXNrID09IGN1cnJlbnRfcnd4X21hc2spIHsKLQkJZmx1c2hfc3dpdGNoZWRfY3BsYnMoKTsKLQkJc2V0X21hc2tfZGNwbGJzKG1tLT5jb250ZXh0LnBhZ2Vfcnd4X21hc2spOworCXVuc2lnbmVkIGludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisJaWYgKG1tLT5jb250ZXh0LnBhZ2Vfcnd4X21hc2sgPT0gY3VycmVudF9yd3hfbWFza1tjcHVdKSB7CisJCWZsdXNoX3N3aXRjaGVkX2NwbGJzKGNwdSk7CisJCXNldF9tYXNrX2RjcGxicyhtbS0+Y29udGV4dC5wYWdlX3J3eF9tYXNrLCBjcHUpOwogCX0KIH0KICNlbmRpZgpAQCAtMTY1LDYgKzE3Myw5IEBACiBzdGF0aWMgaW5saW5lIHZvaWQgZGVzdHJveV9jb250ZXh0KHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKQogewogCXN0cnVjdCBzcmFtX2xpc3Rfc3RydWN0ICp0bXA7CisjaWZkZWYgQ09ORklHX01QVQorCXVuc2lnbmVkIGludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisjZW5kaWYKIAogI2lmZGVmIENPTkZJR19BUFBfU1RBQ0tfTDEKIAlpZiAoY3VycmVudF9sMV9zdGFja19zYXZlID09IG1tLT5jb250ZXh0LmwxX3N0YWNrX3NhdmUpCkBAIC0xNzksOCArMTkwLDggQEAKIAkJa2ZyZWUodG1wKTsKIAl9CiAjaWZkZWYgQ09ORklHX01QVQotCWlmIChjdXJyZW50X3J3eF9tYXNrID09IG1tLT5jb250ZXh0LnBhZ2Vfcnd4X21hc2spCi0JCWN1cnJlbnRfcnd4X21hc2sgPSBOVUxMOworCWlmIChjdXJyZW50X3J3eF9tYXNrW2NwdV0gPT0gbW0tPmNvbnRleHQucGFnZV9yd3hfbWFzaykKKwkJY3VycmVudF9yd3hfbWFza1tjcHVdID0gTlVMTDsKIAlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKW1tLT5jb250ZXh0LnBhZ2Vfcnd4X21hc2ssIHBhZ2VfbWFza19vcmRlcik7CiAjZW5kaWYKIH0KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vbXV0ZXgtZGVjLmggYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL211dGV4LWRlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxMzQxNTEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL211dGV4LWRlYy5oCkBAIC0wLDAgKzEsMTEyIEBACisvKgorICogaW5jbHVkZS9hc20tZ2VuZXJpYy9tdXRleC1kZWMuaAorICoKKyAqIEdlbmVyaWMgaW1wbGVtZW50YXRpb24gb2YgdGhlIG11dGV4IGZhc3RwYXRoLCBiYXNlZCBvbiBhdG9taWMKKyAqIGRlY3JlbWVudC9pbmNyZW1lbnQuCisgKi8KKyNpZm5kZWYgX0FTTV9HRU5FUklDX01VVEVYX0RFQ19ICisjZGVmaW5lIF9BU01fR0VORVJJQ19NVVRFWF9ERUNfSAorCisvKioKKyAqICBfX211dGV4X2Zhc3RwYXRoX2xvY2sgLSB0cnkgdG8gdGFrZSB0aGUgbG9jayBieSBtb3ZpbmcgdGhlIGNvdW50CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSAxIHRvIGEgMCB2YWx1ZQorICogIEBjb3VudDogcG9pbnRlciBvZiB0eXBlIGF0b21pY190CisgKiAgQGZhaWxfZm46IGZ1bmN0aW9uIHRvIGNhbGwgaWYgdGhlIG9yaWdpbmFsIHZhbHVlIHdhcyBub3QgMQorICoKKyAqIENoYW5nZSB0aGUgY291bnQgZnJvbSAxIHRvIGEgdmFsdWUgbG93ZXIgdGhhbiAxLCBhbmQgY2FsbCA8ZmFpbF9mbj4gaWYKKyAqIGl0IHdhc24ndCAxIG9yaWdpbmFsbHkuIFRoaXMgZnVuY3Rpb24gTVVTVCBsZWF2ZSB0aGUgdmFsdWUgbG93ZXIgdGhhbgorICogMSBldmVuIHdoZW4gdGhlICIxIiBhc3NlcnRpb24gd2Fzbid0IHRydWUuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorX19tdXRleF9mYXN0cGF0aF9sb2NrKGF0b21pY190ICpjb3VudCwgZmFzdGNhbGwgdm9pZCAoKmZhaWxfZm4pKGF0b21pY190ICopKQoreworCWlmICh1bmxpa2VseShhdG9taWNfZGVjX3JldHVybihjb3VudCkgPCAwKSkKKwkJZmFpbF9mbihjb3VudCk7CisJZWxzZQorCQlzbXBfbWIoKTsKK30KKworLyoqCisgKiAgX19tdXRleF9mYXN0cGF0aF9sb2NrX3JldHZhbCAtIHRyeSB0byB0YWtlIHRoZSBsb2NrIGJ5IG1vdmluZyB0aGUgY291bnQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSAxIHRvIGEgMCB2YWx1ZQorICogIEBjb3VudDogcG9pbnRlciBvZiB0eXBlIGF0b21pY190CisgKiAgQGZhaWxfZm46IGZ1bmN0aW9uIHRvIGNhbGwgaWYgdGhlIG9yaWdpbmFsIHZhbHVlIHdhcyBub3QgMQorICoKKyAqIENoYW5nZSB0aGUgY291bnQgZnJvbSAxIHRvIGEgdmFsdWUgbG93ZXIgdGhhbiAxLCBhbmQgY2FsbCA8ZmFpbF9mbj4gaWYKKyAqIGl0IHdhc24ndCAxIG9yaWdpbmFsbHkuIFRoaXMgZnVuY3Rpb24gcmV0dXJucyAwIGlmIHRoZSBmYXN0cGF0aCBzdWNjZWVkcywKKyAqIG9yIGFueXRoaW5nIHRoZSBzbG93IHBhdGggZnVuY3Rpb24gcmV0dXJucy4KKyAqLworc3RhdGljIGlubGluZSBpbnQKK19fbXV0ZXhfZmFzdHBhdGhfbG9ja19yZXR2YWwoYXRvbWljX3QgKmNvdW50LCBmYXN0Y2FsbCBpbnQgKCpmYWlsX2ZuKShhdG9taWNfdCAqKSkKK3sKKwlpZiAodW5saWtlbHkoYXRvbWljX2RlY19yZXR1cm4oY291bnQpIDwgMCkpCisJCXJldHVybiBmYWlsX2ZuKGNvdW50KTsKKwllbHNlIHsKKwkJc21wX21iKCk7CisJCXJldHVybiAwOworCX0KK30KKworLyoqCisgKiAgX19tdXRleF9mYXN0cGF0aF91bmxvY2sgLSB0cnkgdG8gcHJvbW90ZSB0aGUgY291bnQgZnJvbSAwIHRvIDEKKyAqICBAY291bnQ6IHBvaW50ZXIgb2YgdHlwZSBhdG9taWNfdAorICogIEBmYWlsX2ZuOiBmdW5jdGlvbiB0byBjYWxsIGlmIHRoZSBvcmlnaW5hbCB2YWx1ZSB3YXMgbm90IDAKKyAqCisgKiBUcnkgdG8gcHJvbW90ZSB0aGUgY291bnQgZnJvbSAwIHRvIDEuIElmIGl0IHdhc24ndCAwLCBjYWxsIDxmYWlsX2ZuPi4KKyAqIEluIHRoZSBmYWlsdXJlIGNhc2UsIHRoaXMgZnVuY3Rpb24gaXMgYWxsb3dlZCB0byBlaXRoZXIgc2V0IHRoZSB2YWx1ZSB0bworICogMSwgb3IgdG8gc2V0IGl0IHRvIGEgdmFsdWUgbG93ZXIgdGhhbiAxLgorICoKKyAqIElmIHRoZSBpbXBsZW1lbnRhdGlvbiBzZXRzIGl0IHRvIGEgdmFsdWUgb2YgbG93ZXIgdGhhbiAxLCB0aGVuIHRoZQorICogX19tdXRleF9zbG93cGF0aF9uZWVkc190b191bmxvY2soKSBtYWNybyBuZWVkcyB0byByZXR1cm4gMSwgaXQgbmVlZHMKKyAqIHRvIHJldHVybiAwIG90aGVyd2lzZS4KKyAqLworc3RhdGljIGlubGluZSB2b2lkCitfX211dGV4X2Zhc3RwYXRoX3VubG9jayhhdG9taWNfdCAqY291bnQsIGZhc3RjYWxsIHZvaWQgKCpmYWlsX2ZuKShhdG9taWNfdCAqKSkKK3sKKwlzbXBfbWIoKTsKKwlpZiAodW5saWtlbHkoYXRvbWljX2luY19yZXR1cm4oY291bnQpIDw9IDApKQorCQlmYWlsX2ZuKGNvdW50KTsKK30KKworI2RlZmluZSBfX211dGV4X3Nsb3dwYXRoX25lZWRzX3RvX3VubG9jaygpCQkxCisKKy8qKgorICogX19tdXRleF9mYXN0cGF0aF90cnlsb2NrIC0gdHJ5IHRvIGFjcXVpcmUgdGhlIG11dGV4LCB3aXRob3V0IHdhaXRpbmcKKyAqCisgKiAgQGNvdW50OiBwb2ludGVyIG9mIHR5cGUgYXRvbWljX3QKKyAqICBAZmFpbF9mbjogZmFsbGJhY2sgZnVuY3Rpb24KKyAqCisgKiBDaGFuZ2UgdGhlIGNvdW50IGZyb20gMSB0byBhIHZhbHVlIGxvd2VyIHRoYW4gMSwgYW5kIHJldHVybiAwIChmYWlsdXJlKQorICogaWYgaXQgd2Fzbid0IDEgb3JpZ2luYWxseSwgb3IgcmV0dXJuIDEgKHN1Y2Nlc3MpIG90aGVyd2lzZS4gVGhpcyBmdW5jdGlvbgorICogTVVTVCBsZWF2ZSB0aGUgdmFsdWUgbG93ZXIgdGhhbiAxIGV2ZW4gd2hlbiB0aGUgIjEiIGFzc2VydGlvbiB3YXNuJ3QgdHJ1ZS4KKyAqIEFkZGl0aW9uYWxseSwgaWYgdGhlIHZhbHVlIHdhcyA8IDAgb3JpZ2luYWxseSwgdGhpcyBmdW5jdGlvbiBtdXN0IG5vdCBsZWF2ZQorICogaXQgdG8gMCBvbiBmYWlsdXJlLgorICoKKyAqIElmIHRoZSBhcmNoaXRlY3R1cmUgaGFzIG5vIGVmZmVjdGl2ZSB0cnlsb2NrIHZhcmlhbnQsIGl0IHNob3VsZCBjYWxsIHRoZQorICogPGZhaWxfZm4+IHNwaW5sb2NrLWJhc2VkIHRyeWxvY2sgdmFyaWFudCB1bmNvbmRpdGlvbmFsbHkuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50CitfX211dGV4X2Zhc3RwYXRoX3RyeWxvY2soYXRvbWljX3QgKmNvdW50LCBpbnQgKCpmYWlsX2ZuKShhdG9taWNfdCAqKSkKK3sKKwkvKgorCSAqIFdlIGhhdmUgdHdvIHZhcmlhbnRzIGhlcmUuIFRoZSBjbXB4Y2hnIGJhc2VkIG9uZSBpcyB0aGUgYmVzdCBvbmUKKwkgKiBiZWNhdXNlIGl0IG5ldmVyIGluZHVjZSBhIGZhbHNlIGNvbnRlbnRpb24gc3RhdGUuICBJdCBpcyBpbmNsdWRlZAorCSAqIGhlcmUgYmVjYXVzZSBhcmNoaXRlY3R1cmVzIHVzaW5nIHRoZSBpbmMvZGVjIGFsZ29yaXRobXMgb3ZlciB0aGUKKwkgKiB4Y2hnIG9uZXMgYXJlIG11Y2ggbW9yZSBsaWtlbHkgdG8gc3VwcG9ydCBjbXB4Y2hnIG5hdGl2ZWx5LgorCSAqCisJICogSWYgbm90IHdlIGZhbGwgYmFjayB0byB0aGUgc3BpbmxvY2sgYmFzZWQgdmFyaWFudCAtIHRoYXQgaXMKKwkgKiBqdXN0IGFzIGVmZmljaWVudCAoYW5kIHNpbXBsZXIpIGFzIGEgJ2Rlc3RydWN0aXZlJyBwcm9iaW5nIG9mCisJICogdGhlIG11dGV4IHN0YXRlIHdvdWxkIGJlLgorCSAqLworI2lmZGVmIF9fSEFWRV9BUkNIX0NNUFhDSEcKKwlpZiAobGlrZWx5KGF0b21pY19jbXB4Y2hnKGNvdW50LCAxLCAwKSA9PSAxKSkgeworCQlzbXBfbWIoKTsKKwkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworI2Vsc2UKKwlyZXR1cm4gZmFpbF9mbihjb3VudCk7CisjZW5kaWYKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL211dGV4LmggYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL211dGV4LmgKaW5kZXggNDU4YzFmNy4uNWQzOTkyNSAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9tdXRleC5oCisrKyBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vbXV0ZXguaApAQCAtNiw0ICs2LDY3IEBACiAgKiBpbXBsZW1lbnRhdGlvbi4gKHNlZSBhc20tZ2VuZXJpYy9tdXRleC14Y2hnLmggZm9yIGRldGFpbHMpCiAgKi8KIAorI2lmbmRlZiBfQVNNX01VVEVYX0gKKyNkZWZpbmUgX0FTTV9NVVRFWF9ICisKKyNpZm5kZWYgQ09ORklHX1NNUAogI2luY2x1ZGUgPGFzbS1nZW5lcmljL211dGV4LWRlYy5oPgorI2Vsc2UKKworc3RhdGljIGlubGluZSB2b2lkCitfX211dGV4X2Zhc3RwYXRoX2xvY2soYXRvbWljX3QgKmNvdW50LCB2b2lkICgqZmFpbF9mbikoYXRvbWljX3QgKikpCit7CisJaWYgKHVubGlrZWx5KGF0b21pY19kZWNfcmV0dXJuKGNvdW50KSA8IDApKQorCQlmYWlsX2ZuKGNvdW50KTsKKwllbHNlCisJCXNtcF9tYigpOworfQorCitzdGF0aWMgaW5saW5lIGludAorX19tdXRleF9mYXN0cGF0aF9sb2NrX3JldHZhbChhdG9taWNfdCAqY291bnQsIGludCAoKmZhaWxfZm4pKGF0b21pY190ICopKQoreworCWlmICh1bmxpa2VseShhdG9taWNfZGVjX3JldHVybihjb3VudCkgPCAwKSkKKwkJcmV0dXJuIGZhaWxfZm4oY291bnQpOworCWVsc2UgeworCQlzbXBfbWIoKTsKKwkJcmV0dXJuIDA7CisJfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK19fbXV0ZXhfZmFzdHBhdGhfdW5sb2NrKGF0b21pY190ICpjb3VudCwgdm9pZCAoKmZhaWxfZm4pKGF0b21pY190ICopKQoreworCXNtcF9tYigpOworCWlmICh1bmxpa2VseShhdG9taWNfaW5jX3JldHVybihjb3VudCkgPD0gMCkpCisJCWZhaWxfZm4oY291bnQpOworfQorCisjZGVmaW5lIF9fbXV0ZXhfc2xvd3BhdGhfbmVlZHNfdG9fdW5sb2NrKCkJCTEKKworc3RhdGljIGlubGluZSBpbnQKK19fbXV0ZXhfZmFzdHBhdGhfdHJ5bG9jayhhdG9taWNfdCAqY291bnQsIGludCAoKmZhaWxfZm4pKGF0b21pY190ICopKQoreworCS8qCisJICogV2UgaGF2ZSB0d28gdmFyaWFudHMgaGVyZS4gVGhlIGNtcHhjaGcgYmFzZWQgb25lIGlzIHRoZSBiZXN0IG9uZQorCSAqIGJlY2F1c2UgaXQgbmV2ZXIgaW5kdWNlIGEgZmFsc2UgY29udGVudGlvbiBzdGF0ZS4gIEl0IGlzIGluY2x1ZGVkCisJICogaGVyZSBiZWNhdXNlIGFyY2hpdGVjdHVyZXMgdXNpbmcgdGhlIGluYy9kZWMgYWxnb3JpdGhtcyBvdmVyIHRoZQorCSAqIHhjaGcgb25lcyBhcmUgbXVjaCBtb3JlIGxpa2VseSB0byBzdXBwb3J0IGNtcHhjaGcgbmF0aXZlbHkuCisJICoKKwkgKiBJZiBub3Qgd2UgZmFsbCBiYWNrIHRvIHRoZSBzcGlubG9jayBiYXNlZCB2YXJpYW50IC0gdGhhdCBpcworCSAqIGp1c3QgYXMgZWZmaWNpZW50IChhbmQgc2ltcGxlcikgYXMgYSAnZGVzdHJ1Y3RpdmUnIHByb2Jpbmcgb2YKKwkgKiB0aGUgbXV0ZXggc3RhdGUgd291bGQgYmUuCisJICovCisjaWZkZWYgX19IQVZFX0FSQ0hfQ01QWENIRworCWlmIChsaWtlbHkoYXRvbWljX2NtcHhjaGcoY291bnQsIDEsIDApID09IDEpKSB7CisJCXNtcF9tYigpOworCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7CisjZWxzZQorCXJldHVybiBmYWlsX2ZuKGNvdW50KTsKKyNlbmRpZgorfQorCisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL3BkYS5oIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9wZGEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDhkNGE3Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9wZGEuaApAQCAtMCwwICsxLDcwIEBACisvKgorICogRmlsZTogICAgICAgICBhcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL3BkYS5oCisgKiBBdXRob3I6ICAgICAgIFBoaWxpcHBlIEdlcnVtIDxycG1AeGVub21haS5vcmc+CisgKgorICogICAgICAgICAgICAgICBDb3B5cmlnaHQgMjAwNyBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCBzZWUgdGhlIGZpbGUgQ09QWUlORywgb3Igd3JpdGUKKyAqIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICovCisKKyNpZm5kZWYgX0FTTV9CTEFDS0ZJTl9QREFfSAorI2RlZmluZSBfQVNNX0JMQUNLRklOX1BEQV9ICisKKyNpbmNsdWRlIDxtYWNoL2Fub21hbHkuaD4KKworI2lmbmRlZiBfX0FTU0VNQkxZX18KKworc3RydWN0IGJsYWNrZmluX3BkYSB7CQkJLyogUGVyLXByb2Nlc3NvciBEYXRhIEFyZWEgKi8KKwlzdHJ1Y3QgYmxhY2tmaW5fcGRhICpuZXh0OworCisJdW5zaWduZWQgbG9uZyBzeXNjZmc7CisjaWZkZWYgQ09ORklHX1NNUAorCXVuc2lnbmVkIGxvbmcgaW1hc2s7CQkvKiBDdXJyZW50IElNQVNLIHZhbHVlICovCisjZW5kaWYKKworCXVuc2lnbmVkIGxvbmcgKmlwZHQ7CQkvKiBTdGFydCBvZiBzd2l0Y2hhYmxlIEktQ1BMQiB0YWJsZSAqLworCXVuc2lnbmVkIGxvbmcgKmlwZHRfc3dhcGNvdW50OwkvKiBOdW1iZXIgb2Ygc3dhcHMgaW4gaXBkdCAqLworCXVuc2lnbmVkIGxvbmcgKmRwZHQ7CQkvKiBTdGFydCBvZiBzd2l0Y2hhYmxlIEQtQ1BMQiB0YWJsZSAqLworCXVuc2lnbmVkIGxvbmcgKmRwZHRfc3dhcGNvdW50OwkvKiBOdW1iZXIgb2Ygc3dhcHMgaW4gZHBkdCAqLworCisJLyoKKwkgKiBTaW5nbGUgaW5zdHJ1Y3Rpb25zIGNhbiBoYXZlIG11bHRpcGxlIGZhdWx0cywgd2hpY2gKKwkgKiBuZWVkIHRvIGJlIGhhbmRsZWQgYnkgdHJhcHMuYywgaW4gaXJxNS4gV2Ugc3RvcmUKKwkgKiB0aGUgZXhjZXB0aW9uIGNhdXNlIHRvIGVuc3VyZSB3ZSBkb24ndCBtaXNzIGEKKwkgKiBkb3VibGUgZmF1bHQgY29uZGl0aW9uCisJICovCisJdW5zaWduZWQgbG9uZyBleF9pcHRyOworCXVuc2lnbmVkIGxvbmcgZXhfb3B0cjsKKwl1bnNpZ25lZCBsb25nIGV4X2J1Zls0XTsKKwl1bnNpZ25lZCBsb25nIGV4X2ltYXNrOwkJLyogU2F2ZWQgaW1hc2sgZnJvbSBleGNlcHRpb24gKi8KKwl1bnNpZ25lZCBsb25nICpleF9zdGFjazsJLyogRXhjZXB0aW9uIHN0YWNrIHNwYWNlICovCisKKyNpZmRlZiBBTk9NQUxZXzA1MDAwMjYxCisJdW5zaWduZWQgbG9uZyBsYXN0X2NwbGJfZmF1bHRfcmV0eDsKKyNlbmRpZgorCXVuc2lnbmVkIGxvbmcgZGNwbGJfZmF1bHRfYWRkcjsKKwl1bnNpZ25lZCBsb25nIGljcGxiX2ZhdWx0X2FkZHI7CisJdW5zaWduZWQgbG9uZyByZXR4OworCXVuc2lnbmVkIGxvbmcgc2Vxc3RhdDsKK307CisKK2V4dGVybiBzdHJ1Y3QgYmxhY2tmaW5fcGRhIGNwdV9wZGFbXTsKKwordm9pZCByZXNlcnZlX3BkYSh2b2lkKTsKKworI2VuZGlmCS8qIF9fQVNTRU1CTFlfXyAqLworCisjZW5kaWYgLyogX0FTTV9CTEFDS0ZJTl9QREFfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9wZXJjcHUuaCBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vcGVyY3B1LmgKaW5kZXggNzhkZDYxZi4uNzk3YzBjMSAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9wZXJjcHUuaAorKysgYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL3BlcmNwdS5oCkBAIC0zLDQgKzMsMTQgQEAKIAogI2luY2x1ZGUgPGFzbS1nZW5lcmljL3BlcmNwdS5oPgogCi0jZW5kaWYJCQkJLyogX19BUkNIX0JMQUNLRklOX1BFUkNQVV9fICovCisjaWZkZWYgQ09ORklHX01PRFVMRVMKKyNkZWZpbmUgUEVSQ1BVX01PRFVMRV9SRVNFUlZFIDgxOTIKKyNlbHNlCisjZGVmaW5lIFBFUkNQVV9NT0RVTEVfUkVTRVJWRSAwCisjZW5kaWYKKworI2RlZmluZSBQRVJDUFVfRU5PVUdIX1JPT00gXAorCShBTElHTihfX3Blcl9jcHVfZW5kIC0gX19wZXJfY3B1X3N0YXJ0LCBTTVBfQ0FDSEVfQllURVMpICsgXAorCSBQRVJDUFVfTU9EVUxFX1JFU0VSVkUpCisKKyNlbmRpZgkvKiBfX0FSQ0hfQkxBQ0tGSU5fUEVSQ1BVX18gKi8KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vcGd0YWJsZS5oIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9wZ3RhYmxlLmgKaW5kZXggZjExNjg0ZS4uNzgzYzhmNyAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9wZ3RhYmxlLmgKKysrIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9wZ3RhYmxlLmgKQEAgLTI5LDYgKzI5LDcgQEAKICNkZWZpbmUgUEFHRV9DT1BZCQlfX3BncHJvdCgwKQkvKiB0aGVzZSBtZWFuIG5vdGhpbmcgdG8gTk9fTU0gKi8KICNkZWZpbmUgUEFHRV9SRUFET05MWQkJX19wZ3Byb3QoMCkJLyogdGhlc2UgbWVhbiBub3RoaW5nIHRvIE5PX01NICovCiAjZGVmaW5lIFBBR0VfS0VSTkVMCQlfX3BncHJvdCgwKQkvKiB0aGVzZSBtZWFuIG5vdGhpbmcgdG8gTk9fTU0gKi8KKyNkZWZpbmUgcGdwcm90X25vbmNhY2hlZChwcm90KQkocHJvdCkKIAogZXh0ZXJuIHZvaWQgcGFnaW5nX2luaXQodm9pZCk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vcHJvY2Vzc29yLmggYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL3Byb2Nlc3Nvci5oCmluZGV4IGUzZTliNDEuLjBlZWNlMjMgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vcHJvY2Vzc29yLmgKKysrIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9wcm9jZXNzb3IuaApAQCAtMjQsNiArMjQsMTQgQEAKIAlfX2FzbV9fIF9fdm9sYXRpbGVfXygidXNwID0gJTA7XG5cdCI6OiJkYSIodXNwKSk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBfX2dldF9TUCh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgc3A7CisKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygiJTAgPSBzcDtcblx0IiA6ICI9ZGEiKHNwKSk7CisJcmV0dXJuIHNwOworfQorCiAvKgogICogVXNlciBzcGFjZSBwcm9jZXNzIHNpemU6IDFzdCBieXRlIGJleW9uZCB1c2VyIGFkZHJlc3Mgc3BhY2UuCiAgKiBGYWlybHkgbWVhbmluZ2xlc3Mgb24gbm9tbXUuICBQYXJ0cyBvZiB1c2VyIHByb2dyYW1zIGNhbiBiZSBzY2F0dGVyZWQKQEAgLTU3LDYgKzY1LDcgQEAKICAqIHBhc3MgdGhlIGRhdGEgc2VnbWVudCBpbnRvIHVzZXIgcHJvZ3JhbXMgaWYgaXQgZXhpc3RzLAogICogaXQgY2FuJ3QgaHVydCBhbnl0aGluZyBhcyBmYXIgYXMgSSBjYW4gdGVsbAogICovCisjaWZuZGVmIENPTkZJR19TTVAKICNkZWZpbmUgc3RhcnRfdGhyZWFkKF9yZWdzLCBfcGMsIF91c3ApCQkJCQlcCiBkbyB7CQkJCQkJCQkJXAogCXNldF9mcyhVU0VSX0RTKTsJCQkJCQlcCkBAIC03MCw2ICs3OSwxNiBAQAogCQlzaXplb2YoKkwxX1NDUkFUQ0hfVEFTS19JTkZPKSk7CQkJCVwKIAl3cnVzcChfdXNwKTsJCQkJCQkJXAogfSB3aGlsZSgwKQorI2Vsc2UKKyNkZWZpbmUgc3RhcnRfdGhyZWFkKF9yZWdzLCBfcGMsIF91c3ApCQkJCQlcCitkbyB7CQkJCQkJCQkJXAorCXNldF9mcyhVU0VSX0RTKTsJCQkJCQlcCisJKF9yZWdzKS0+cGMgPSAoX3BjKTsJCQkJCQlcCisJaWYgKGN1cnJlbnQtPm1tKQkJCQkJCVwKKwkJKF9yZWdzKS0+cDUgPSBjdXJyZW50LT5tbS0+c3RhcnRfZGF0YTsJCQlcCisJd3J1c3AoX3VzcCk7CQkJCQkJCVwKK30gd2hpbGUgKDApCisjZW5kaWYKIAogLyogRm9yd2FyZCBkZWNsYXJhdGlvbiwgYSBzdHJhbmdlIEMgdGhpbmcgKi8KIHN0cnVjdCB0YXNrX3N0cnVjdDsKQEAgLTEwNiw3ICsxMjUsOCBAQAogCWVpcDsgfSkKICNkZWZpbmUJS1NUS19FU1AodHNrKQkoKHRzaykgPT0gY3VycmVudCA/IHJkdXNwKCkgOiAodHNrKS0+dGhyZWFkLnVzcCkKIAotI2RlZmluZSBjcHVfcmVsYXgoKSAgICAJYmFycmllcigpCisjZGVmaW5lIGNwdV9yZWxheCgpICAgIAlzbXBfbWIoKQorCiAKIC8qIEdldCB0aGUgU2lsaWNvbiBSZXZpc2lvbiBvZiB0aGUgY2hpcCAqLwogc3RhdGljIGlubGluZSB1aW50MzJfdCBfX3B1cmUgYmZpbl9yZXZpZCh2b2lkKQpAQCAtMTM3LDcgKzE1NywxMSBAQAogc3RhdGljIGlubGluZSB1aW50MTZfdCBfX3B1cmUgYmZpbl9jcHVpZCh2b2lkKQogewogCXJldHVybiAoYmZpbl9yZWFkX0NISVBJRCgpICYgQ0hJUElEX0ZBTUlMWSkgPj4gMTI7Cit9CiAKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgX19wdXJlIGJmaW5fZHNwaWQodm9pZCkKK3sKKwlyZXR1cm4gYmZpbl9yZWFkX0RTUElEKCk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdWludDMyX3QgX19wdXJlIGJmaW5fY29tcGlsZWRfcmV2aWQodm9pZCkKQEAgLTE1NCw2ICsxNzgsOCBAQAogCXJldHVybiA0OwogI2VsaWYgZGVmaW5lZChDT05GSUdfQkZfUkVWXzBfNSkKIAlyZXR1cm4gNTsKKyNlbGlmIGRlZmluZWQoQ09ORklHX0JGX1JFVl8wXzYpCisJcmV0dXJuIDY7CiAjZWxpZiBkZWZpbmVkKENPTkZJR19CRl9SRVZfQU5ZKQogCXJldHVybiAweGZmZmY7CiAjZWxzZQpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9yZWJvb3QuaCBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vcmVib290LmgKaW5kZXggNmQ0NDhiNS4uNDg1NmQ2MiAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9yZWJvb3QuaAorKysgYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL3JlYm9vdC5oCkBAIC0xLDcgKzEsNyBAQAogLyoKLSAqIGluY2x1ZGUvYXNtLWJsYWNrZmluL3JlYm9vdC5oIC0gc2h1dGRvd24vcmVib290IGhlYWRlcgorICogcmVib290LmggLSBzaHV0ZG93bi9yZWJvb3QgaGVhZGVyCiAgKgotICogQ29weXJpZ2h0IDIwMDQtMjAwNyBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKiBDb3B5cmlnaHQgMjAwNC0yMDA4IEFuYWxvZyBEZXZpY2VzIEluYy4KICAqCiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCiAgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vcndsb2NrLmggYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL3J3bG9jay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhNzI0YjMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL3J3bG9jay5oCkBAIC0wLDAgKzEsNiBAQAorI2lmbmRlZiBfQVNNX0JMQUNLRklOX1JXTE9DS19ICisjZGVmaW5lIF9BU01fQkxBQ0tGSU5fUldMT0NLX0gKKworI2RlZmluZSBSV19MT0NLX0JJQVMJMHgwMTAwMDAwMAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vc2VyaWFsLmggYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL3NlcmlhbC5oCmluZGV4IDk5NGRkODYuLjNhNDc2MDYgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vc2VyaWFsLmgKKysrIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9zZXJpYWwuaApAQCAtMywzICszLDQgQEAKICAqLwogCiAjZGVmaW5lIFNFUklBTF9FWFRSQV9JUlFfRkxBR1MgSVJRRl9UUklHR0VSX0hJR0gKKyNkZWZpbmUgQkFTRV9CQVVEICgxODQzMjAwIC8gMTYpCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL3NtcC5oIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9zbXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMThkZWVlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9zbXAuaApAQCAtMCwwICsxLDQ0IEBACisvKgorICogRmlsZTogICAgICAgICBhcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL3NtcC5oCisgKiBBdXRob3I6ICAgICAgIFBoaWxpcHBlIEdlcnVtIDxycG1AeGVub21haS5vcmc+CisgKgorICogICAgICAgICAgICAgICBDb3B5cmlnaHQgMjAwNyBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCBzZWUgdGhlIGZpbGUgQ09QWUlORywgb3Igd3JpdGUKKyAqIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICovCisKKyNpZm5kZWYgX19BU01fQkxBQ0tGSU5fU01QX0gKKyNkZWZpbmUgX19BU01fQkxBQ0tGSU5fU01QX0gKKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3RocmVhZHMuaD4KKyNpbmNsdWRlIDxsaW51eC9jcHVtYXNrLmg+CisjaW5jbHVkZSA8bGludXgvY2FjaGUuaD4KKyNpbmNsdWRlIDxhc20vYmxhY2tmaW4uaD4KKyNpbmNsdWRlIDxtYWNoL3NtcC5oPgorCisjZGVmaW5lIHJhd19zbXBfcHJvY2Vzc29yX2lkKCkgIGJsYWNrZmluX2NvcmVfaWQoKQorCitleHRlcm4gY2hhciBjb3JlYl90cmFtcG9saW5lX3N0YXJ0LCBjb3JlYl90cmFtcG9saW5lX2VuZDsKKworc3RydWN0IGNvcmVsb2NrX3Nsb3QgeworCWludCBsb2NrOworfTsKKwordm9pZCBzbXBfaWNhY2hlX2ZsdXNoX3JhbmdlX290aGVycyh1bnNpZ25lZCBsb25nIHN0YXJ0LAorCQkJCSAgIHVuc2lnbmVkIGxvbmcgZW5kKTsKKworI2VuZGlmIC8qICFfX0FTTV9CTEFDS0ZJTl9TTVBfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9zcGlubG9jay5oIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9zcGlubG9jay5oCmluZGV4IDY0ZTkwOGEuLjAyNDlhYzMgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vc3BpbmxvY2suaAorKysgYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL3NwaW5sb2NrLmgKQEAgLTEsNiArMSw4OSBAQAogI2lmbmRlZiBfX0JGSU5fU1BJTkxPQ0tfSAogI2RlZmluZSBfX0JGSU5fU1BJTkxPQ0tfSAogCi0jZXJyb3IgYmxhY2tmaW4gYXJjaGl0ZWN0dXJlIGRvZXMgbm90IHN1cHBvcnQgU01QIHNwaW4gbG9jayB5ZXQKKyNpbmNsdWRlIDxhc20vYXRvbWljLmg+CiAKLSNlbmRpZgorYXNtbGlua2FnZSBpbnQgX19yYXdfc3Bpbl9pc19sb2NrZWRfYXNtKHZvbGF0aWxlIGludCAqcHRyKTsKK2FzbWxpbmthZ2Ugdm9pZCBfX3Jhd19zcGluX2xvY2tfYXNtKHZvbGF0aWxlIGludCAqcHRyKTsKK2FzbWxpbmthZ2UgaW50IF9fcmF3X3NwaW5fdHJ5bG9ja19hc20odm9sYXRpbGUgaW50ICpwdHIpOworYXNtbGlua2FnZSB2b2lkIF9fcmF3X3NwaW5fdW5sb2NrX2FzbSh2b2xhdGlsZSBpbnQgKnB0cik7Cithc21saW5rYWdlIHZvaWQgX19yYXdfcmVhZF9sb2NrX2FzbSh2b2xhdGlsZSBpbnQgKnB0cik7Cithc21saW5rYWdlIGludCBfX3Jhd19yZWFkX3RyeWxvY2tfYXNtKHZvbGF0aWxlIGludCAqcHRyKTsKK2FzbWxpbmthZ2Ugdm9pZCBfX3Jhd19yZWFkX3VubG9ja19hc20odm9sYXRpbGUgaW50ICpwdHIpOworYXNtbGlua2FnZSB2b2lkIF9fcmF3X3dyaXRlX2xvY2tfYXNtKHZvbGF0aWxlIGludCAqcHRyKTsKK2FzbWxpbmthZ2UgaW50IF9fcmF3X3dyaXRlX3RyeWxvY2tfYXNtKHZvbGF0aWxlIGludCAqcHRyKTsKK2FzbWxpbmthZ2Ugdm9pZCBfX3Jhd193cml0ZV91bmxvY2tfYXNtKHZvbGF0aWxlIGludCAqcHRyKTsKKworc3RhdGljIGlubGluZSBpbnQgX19yYXdfc3Bpbl9pc19sb2NrZWQocmF3X3NwaW5sb2NrX3QgKmxvY2spCit7CisJcmV0dXJuIF9fcmF3X3NwaW5faXNfbG9ja2VkX2FzbSgmbG9jay0+bG9jayk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX3Jhd19zcGluX2xvY2socmF3X3NwaW5sb2NrX3QgKmxvY2spCit7CisJX19yYXdfc3Bpbl9sb2NrX2FzbSgmbG9jay0+bG9jayk7Cit9CisKKyNkZWZpbmUgX19yYXdfc3Bpbl9sb2NrX2ZsYWdzKGxvY2ssIGZsYWdzKSBfX3Jhd19zcGluX2xvY2sobG9jaykKKworc3RhdGljIGlubGluZSBpbnQgX19yYXdfc3Bpbl90cnlsb2NrKHJhd19zcGlubG9ja190ICpsb2NrKQoreworCXJldHVybiBfX3Jhd19zcGluX3RyeWxvY2tfYXNtKCZsb2NrLT5sb2NrKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIF9fcmF3X3NwaW5fdW5sb2NrKHJhd19zcGlubG9ja190ICpsb2NrKQoreworCV9fcmF3X3NwaW5fdW5sb2NrX2FzbSgmbG9jay0+bG9jayk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX3Jhd19zcGluX3VubG9ja193YWl0KHJhd19zcGlubG9ja190ICpsb2NrKQoreworCXdoaWxlIChfX3Jhd19zcGluX2lzX2xvY2tlZChsb2NrKSkKKwkJY3B1X3JlbGF4KCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IF9fcmF3X3JlYWRfY2FuX2xvY2socmF3X3J3bG9ja190ICpydykKK3sKKwlyZXR1cm4gX19yYXdfdW5jYWNoZWRfZmV0Y2hfYXNtKCZydy0+bG9jaykgPiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBfX3Jhd193cml0ZV9jYW5fbG9jayhyYXdfcndsb2NrX3QgKnJ3KQoreworCXJldHVybiBfX3Jhd191bmNhY2hlZF9mZXRjaF9hc20oJnJ3LT5sb2NrKSA9PSBSV19MT0NLX0JJQVM7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX3Jhd19yZWFkX2xvY2socmF3X3J3bG9ja190ICpydykKK3sKKwlfX3Jhd19yZWFkX2xvY2tfYXNtKCZydy0+bG9jayk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IF9fcmF3X3JlYWRfdHJ5bG9jayhyYXdfcndsb2NrX3QgKnJ3KQoreworCXJldHVybiBfX3Jhd19yZWFkX3RyeWxvY2tfYXNtKCZydy0+bG9jayk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX3Jhd19yZWFkX3VubG9jayhyYXdfcndsb2NrX3QgKnJ3KQoreworCV9fcmF3X3JlYWRfdW5sb2NrX2FzbSgmcnctPmxvY2spOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgX19yYXdfd3JpdGVfbG9jayhyYXdfcndsb2NrX3QgKnJ3KQoreworCV9fcmF3X3dyaXRlX2xvY2tfYXNtKCZydy0+bG9jayk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IF9fcmF3X3dyaXRlX3RyeWxvY2socmF3X3J3bG9ja190ICpydykKK3sKKwlyZXR1cm4gX19yYXdfd3JpdGVfdHJ5bG9ja19hc20oJnJ3LT5sb2NrKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIF9fcmF3X3dyaXRlX3VubG9jayhyYXdfcndsb2NrX3QgKnJ3KQoreworCV9fcmF3X3dyaXRlX3VubG9ja19hc20oJnJ3LT5sb2NrKTsKK30KKworI2RlZmluZSBfcmF3X3NwaW5fcmVsYXgobG9jaykgIAljcHVfcmVsYXgoKQorI2RlZmluZSBfcmF3X3JlYWRfcmVsYXgobG9jaykJY3B1X3JlbGF4KCkKKyNkZWZpbmUgX3Jhd193cml0ZV9yZWxheChsb2NrKQljcHVfcmVsYXgoKQorCisjZW5kaWYgLyogICFfX0JGSU5fU1BJTkxPQ0tfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9zcGlubG9ja190eXBlcy5oIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9zcGlubG9ja190eXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxZTNjNGMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL3NwaW5sb2NrX3R5cGVzLmgKQEAgLTAsMCArMSwyMiBAQAorI2lmbmRlZiBfX0FTTV9TUElOTE9DS19UWVBFU19ICisjZGVmaW5lIF9fQVNNX1NQSU5MT0NLX1RZUEVTX0gKKworI2lmbmRlZiBfX0xJTlVYX1NQSU5MT0NLX1RZUEVTX0gKKyMgZXJyb3IgInBsZWFzZSBkb24ndCBpbmNsdWRlIHRoaXMgZmlsZSBkaXJlY3RseSIKKyNlbmRpZgorCisjaW5jbHVkZSA8YXNtL3J3bG9jay5oPgorCit0eXBlZGVmIHN0cnVjdCB7CisJdm9sYXRpbGUgdW5zaWduZWQgaW50IGxvY2s7Cit9IHJhd19zcGlubG9ja190OworCisjZGVmaW5lIF9fUkFXX1NQSU5fTE9DS19VTkxPQ0tFRAl7IDAgfQorCit0eXBlZGVmIHN0cnVjdCB7CisJdm9sYXRpbGUgdW5zaWduZWQgaW50IGxvY2s7Cit9IHJhd19yd2xvY2tfdDsKKworI2RlZmluZSBfX1JBV19SV19MT0NLX1VOTE9DS0VECQl7IFJXX0xPQ0tfQklBUyB9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9zeXN0ZW0uaCBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vc3lzdGVtLmgKaW5kZXggOGYxNjI3ZC4uYTRjODI1NCAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS9zeXN0ZW0uaAorKysgYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL3N5c3RlbS5oCkBAIC0zNywxMTQgKzM3LDk4IEBACiAjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CiAjaW5jbHVkZSA8bWFjaC9hbm9tYWx5Lmg+Ci0KLS8qCi0gKiBJbnRlcnJ1cHQgY29uZmlndXJpbmcgbWFjcm9zLgotICovCi0KLWV4dGVybiB1bnNpZ25lZCBsb25nIGlycV9mbGFnczsKLQotI2RlZmluZSBsb2NhbF9pcnFfZW5hYmxlKCkgXAotCV9fYXNtX18gX192b2xhdGlsZV9fKCBcCi0JCSJzdGkgJTA7IiBcCi0JCTogXAotCQk6ICJkIiAoaXJxX2ZsYWdzKSBcCi0JKQotCi0jZGVmaW5lIGxvY2FsX2lycV9kaXNhYmxlKCkgXAotCWRvIHsgXAotCQlpbnQgX190bXBfZHVtbXk7IFwKLQkJX19hc21fXyBfX3ZvbGF0aWxlX18oIFwKLQkJCSJjbGkgJTA7IiBcCi0JCQk6ICI9ZCIgKF9fdG1wX2R1bW15KSBcCi0JCSk7IFwKLQl9IHdoaWxlICgwKQotCi0jaWYgQU5PTUFMWV8wNTAwMDI0NCAmJiBkZWZpbmVkKENPTkZJR19CRklOX0lDQUNIRSkKLSMgZGVmaW5lIE5PUF9QQURfQU5PTUFMWV8wNTAwMDI0NCAibm9wOyBub3A7IgotI2Vsc2UKLSMgZGVmaW5lIE5PUF9QQURfQU5PTUFMWV8wNTAwMDI0NAotI2VuZGlmCi0KLSNkZWZpbmUgaWRsZV93aXRoX2lycV9kaXNhYmxlZCgpIFwKLQlfX2FzbV9fIF9fdm9sYXRpbGVfXyggXAotCQlOT1BfUEFEX0FOT01BTFlfMDUwMDAyNDQgXAotCQkiLmFsaWduIDg7IiBcCi0JCSJzdGkgJTA7IiBcCi0JCSJpZGxlOyIgXAotCQk6IFwKLQkJOiAiZCIgKGlycV9mbGFncykgXAotCSkKLQotI2lmZGVmIENPTkZJR19ERUJVR19IV0VSUgotIyBkZWZpbmUgX19zYXZlX2FuZF9jbGkoeCkgXAotCV9fYXNtX18gX192b2xhdGlsZV9fKCBcCi0JCSJjbGkgJTA7IiBcCi0JCSJzdGkgJTE7IiBcCi0JCTogIj0mZCIgKHgpIFwKLQkJOiAiZCIgKDB4M0YpIFwKLQkpCi0jZWxzZQotIyBkZWZpbmUgX19zYXZlX2FuZF9jbGkoeCkgXAotCV9fYXNtX18gX192b2xhdGlsZV9fKCBcCi0JCSJjbGkgJTA7IiBcCi0JCTogIj0mZCIgKHgpIFwKLQkpCi0jZW5kaWYKLQotI2RlZmluZSBsb2NhbF9zYXZlX2ZsYWdzKHgpIFwKLQlfX2FzbV9fIF9fdm9sYXRpbGVfXyggXAotCQkiY2xpICUwOyIgXAotCQkic3RpICUwOyIgXAotCQk6ICI9ZCIgKHgpIFwKLQkpCi0KLSNpZmRlZiBDT05GSUdfREVCVUdfSFdFUlIKLSNkZWZpbmUgaXJxc19lbmFibGVkX2Zyb21fZmxhZ3MoeCkgKCgoeCkgJiB+MHgzZikgIT0gMCkKLSNlbHNlCi0jZGVmaW5lIGlycXNfZW5hYmxlZF9mcm9tX2ZsYWdzKHgpICgoeCkgIT0gMHgxZikKLSNlbmRpZgotCi0jZGVmaW5lIGxvY2FsX2lycV9yZXN0b3JlKHgpIFwKLQlkbyB7IFwKLQkJaWYgKGlycXNfZW5hYmxlZF9mcm9tX2ZsYWdzKHgpKSBcCi0JCQlsb2NhbF9pcnFfZW5hYmxlKCk7IFwKLQl9IHdoaWxlICgwKQotCi0vKiBGb3Igc3BpbmxvY2tzIGV0YyAqLwotI2RlZmluZSBsb2NhbF9pcnFfc2F2ZSh4KSBfX3NhdmVfYW5kX2NsaSh4KQotCi0jZGVmaW5lCWlycXNfZGlzYWJsZWQoKQkJCQlcCi0oewkJCQkJCVwKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwkJCVwKLQlsb2NhbF9zYXZlX2ZsYWdzKGZsYWdzKTsJCVwKLQkhaXJxc19lbmFibGVkX2Zyb21fZmxhZ3MoZmxhZ3MpOwlcCi19KQorI2luY2x1ZGUgPGFzbS9wZGEuaD4KKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgogCiAvKgogICogRm9yY2Ugc3RyaWN0IENQVSBvcmRlcmluZy4KICAqLwotI2RlZmluZSBub3AoKSAgYXNtIHZvbGF0aWxlICgibm9wO1xuXHQiOjopCi0jZGVmaW5lIG1iKCkgICBhc20gdm9sYXRpbGUgKCIiICAgOiA6IDoibWVtb3J5IikKLSNkZWZpbmUgcm1iKCkgIGFzbSB2b2xhdGlsZSAoIiIgICA6IDogOiJtZW1vcnkiKQotI2RlZmluZSB3bWIoKSAgYXNtIHZvbGF0aWxlICgiIiAgIDogOiA6Im1lbW9yeSIpCisjZGVmaW5lIG5vcCgpICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIm5vcDtcblx0IiA6IDogKQorI2RlZmluZSBtYigpICAgX19hc21fXyBfX3ZvbGF0aWxlX18gKCIiICAgOiA6IDogIm1lbW9yeSIpCisjZGVmaW5lIHJtYigpICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIiIgICA6IDogOiAibWVtb3J5IikKKyNkZWZpbmUgd21iKCkgIF9fYXNtX18gX192b2xhdGlsZV9fICgiIiAgIDogOiA6ICJtZW1vcnkiKQogI2RlZmluZSBzZXRfbWIodmFyLCB2YWx1ZSkgZG8geyAodm9pZCkgeGNoZygmdmFyLCB2YWx1ZSk7IH0gd2hpbGUgKDApCi0KICNkZWZpbmUgcmVhZF9iYXJyaWVyX2RlcGVuZHMoKSAJCWRvIHsgfSB3aGlsZSgwKQogCiAjaWZkZWYgQ09ORklHX1NNUAotI2RlZmluZSBzbXBfbWIoKQltYigpCi0jZGVmaW5lIHNtcF9ybWIoKQlybWIoKQotI2RlZmluZSBzbXBfd21iKCkJd21iKCkKLSNkZWZpbmUgc21wX3JlYWRfYmFycmllcl9kZXBlbmRzKCkJcmVhZF9iYXJyaWVyX2RlcGVuZHMoKQorYXNtbGlua2FnZSB1bnNpZ25lZCBsb25nIF9fcmF3X3hjaGdfMV9hc20odm9sYXRpbGUgdm9pZCAqcHRyLCB1bnNpZ25lZCBsb25nIHZhbHVlKTsKK2FzbWxpbmthZ2UgdW5zaWduZWQgbG9uZyBfX3Jhd194Y2hnXzJfYXNtKHZvbGF0aWxlIHZvaWQgKnB0ciwgdW5zaWduZWQgbG9uZyB2YWx1ZSk7Cithc21saW5rYWdlIHVuc2lnbmVkIGxvbmcgX19yYXdfeGNoZ180X2FzbSh2b2xhdGlsZSB2b2lkICpwdHIsIHVuc2lnbmVkIGxvbmcgdmFsdWUpOworYXNtbGlua2FnZSB1bnNpZ25lZCBsb25nIF9fcmF3X2NtcHhjaGdfMV9hc20odm9sYXRpbGUgdm9pZCAqcHRyLAorCQkJCQl1bnNpZ25lZCBsb25nIG5ldywgdW5zaWduZWQgbG9uZyBvbGQpOworYXNtbGlua2FnZSB1bnNpZ25lZCBsb25nIF9fcmF3X2NtcHhjaGdfMl9hc20odm9sYXRpbGUgdm9pZCAqcHRyLAorCQkJCQl1bnNpZ25lZCBsb25nIG5ldywgdW5zaWduZWQgbG9uZyBvbGQpOworYXNtbGlua2FnZSB1bnNpZ25lZCBsb25nIF9fcmF3X2NtcHhjaGdfNF9hc20odm9sYXRpbGUgdm9pZCAqcHRyLAorCQkJCQl1bnNpZ25lZCBsb25nIG5ldywgdW5zaWduZWQgbG9uZyBvbGQpOworCisjaWZkZWYgX19BUkNIX1NZTkNfQ09SRV9EQ0FDSEUKKyMgZGVmaW5lIHNtcF9tYigpCWRvIHsgYmFycmllcigpOyBzbXBfY2hlY2tfYmFycmllcigpOyBzbXBfbWFya19iYXJyaWVyKCk7IH0gd2hpbGUgKDApCisjIGRlZmluZSBzbXBfcm1iKCkJZG8geyBiYXJyaWVyKCk7IHNtcF9jaGVja19iYXJyaWVyKCk7IH0gd2hpbGUgKDApCisjIGRlZmluZSBzbXBfd21iKCkJZG8geyBiYXJyaWVyKCk7IHNtcF9tYXJrX2JhcnJpZXIoKTsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgc21wX3JlYWRfYmFycmllcl9kZXBlbmRzKCkJZG8geyBiYXJyaWVyKCk7IHNtcF9jaGVja19iYXJyaWVyKCk7IH0gd2hpbGUgKDApCisKICNlbHNlCisjIGRlZmluZSBzbXBfbWIoKQliYXJyaWVyKCkKKyMgZGVmaW5lIHNtcF9ybWIoKQliYXJyaWVyKCkKKyMgZGVmaW5lIHNtcF93bWIoKQliYXJyaWVyKCkKKyNkZWZpbmUgc21wX3JlYWRfYmFycmllcl9kZXBlbmRzKCkJYmFycmllcigpCisjZW5kaWYKKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIF9feGNoZyh1bnNpZ25lZCBsb25nIHgsIHZvbGF0aWxlIHZvaWQgKnB0ciwKKwkJCQkgICBpbnQgc2l6ZSkKK3sKKwl1bnNpZ25lZCBsb25nIHRtcDsKKworCXN3aXRjaCAoc2l6ZSkgeworCWNhc2UgMToKKwkJdG1wID0gX19yYXdfeGNoZ18xX2FzbShwdHIsIHgpOworCQlicmVhazsKKwljYXNlIDI6CisJCXRtcCA9IF9fcmF3X3hjaGdfMl9hc20ocHRyLCB4KTsKKwkJYnJlYWs7CisJY2FzZSA0OgorCQl0bXAgPSBfX3Jhd194Y2hnXzRfYXNtKHB0ciwgeCk7CisJCWJyZWFrOworCX0KKworCXJldHVybiB0bXA7Cit9CisKKy8qCisgKiBBdG9taWMgY29tcGFyZSBhbmQgZXhjaGFuZ2UuICBDb21wYXJlIE9MRCB3aXRoIE1FTSwgaWYgaWRlbnRpY2FsLAorICogc3RvcmUgTkVXIGluIE1FTS4gIFJldHVybiB0aGUgaW5pdGlhbCB2YWx1ZSBpbiBNRU0uICBTdWNjZXNzIGlzCisgKiBpbmRpY2F0ZWQgYnkgY29tcGFyaW5nIFJFVFVSTiB3aXRoIE9MRC4KKyAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIF9fY21weGNoZyh2b2xhdGlsZSB2b2lkICpwdHIsIHVuc2lnbmVkIGxvbmcgb2xkLAorCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgbmV3LCBpbnQgc2l6ZSkKK3sKKwl1bnNpZ25lZCBsb25nIHRtcDsKKworCXN3aXRjaCAoc2l6ZSkgeworCWNhc2UgMToKKwkJdG1wID0gX19yYXdfY21weGNoZ18xX2FzbShwdHIsIG5ldywgb2xkKTsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQl0bXAgPSBfX3Jhd19jbXB4Y2hnXzJfYXNtKHB0ciwgbmV3LCBvbGQpOworCQlicmVhazsKKwljYXNlIDQ6CisJCXRtcCA9IF9fcmF3X2NtcHhjaGdfNF9hc20ocHRyLCBuZXcsIG9sZCk7CisJCWJyZWFrOworCX0KKworCXJldHVybiB0bXA7Cit9CisjZGVmaW5lIGNtcHhjaGcocHRyLCBvLCBuKSBcCisJKChfX3R5cGVvZl9fKCoocHRyKSkpX19jbXB4Y2hnKChwdHIpLCAodW5zaWduZWQgbG9uZykobyksIFwKKwkJKHVuc2lnbmVkIGxvbmcpKG4pLCBzaXplb2YoKihwdHIpKSkpCisKKyNlbHNlIC8qICFDT05GSUdfU01QICovCisKICNkZWZpbmUgc21wX21iKCkJYmFycmllcigpCiAjZGVmaW5lIHNtcF9ybWIoKQliYXJyaWVyKCkKICNkZWZpbmUgc21wX3dtYigpCWJhcnJpZXIoKQogI2RlZmluZSBzbXBfcmVhZF9iYXJyaWVyX2RlcGVuZHMoKQlkbyB7IH0gd2hpbGUoMCkKLSNlbmRpZgotCi0jZGVmaW5lIHhjaGcocHRyLHgpICgoX190eXBlb2ZfXygqKHB0cikpKV9feGNoZygodW5zaWduZWQgbG9uZykoeCksKHB0ciksc2l6ZW9mKCoocHRyKSkpKQogCiBzdHJ1Y3QgX194Y2hnX2R1bW15IHsKIAl1bnNpZ25lZCBsb25nIGFbMTAwXTsKQEAgLTE1Nyw3ICsxNDEsNyBAQAogCXVuc2lnbmVkIGxvbmcgdG1wID0gMDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzID0gMDsKIAotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwlsb2NhbF9pcnFfc2F2ZV9odyhmbGFncyk7CiAKIAlzd2l0Y2ggKHNpemUpIHsKIAljYXNlIDE6CkBAIC0xNzksNyArMTYzLDcgQEAKIAkJCSA6ICI9JmQiICh0bXApIDogImQiICh4KSwgIm0iICgqX194ZyhwdHIpKSA6ICJtZW1vcnkiKTsKIAkJYnJlYWs7CiAJfQotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwlsb2NhbF9pcnFfcmVzdG9yZV9odyhmbGFncyk7CiAJcmV0dXJuIHRtcDsKIH0KIApAQCAtMTk0LDkgKzE3OCwxMiBAQAogCQkJKHVuc2lnbmVkIGxvbmcpKG4pLCBzaXplb2YoKihwdHIpKSkpCiAjZGVmaW5lIGNtcHhjaGc2NF9sb2NhbChwdHIsIG8sIG4pIF9fY21weGNoZzY0X2xvY2FsX2dlbmVyaWMoKHB0ciksIChvKSwgKG4pKQogCi0jaWZuZGVmIENPTkZJR19TTVAKICNpbmNsdWRlIDxhc20tZ2VuZXJpYy9jbXB4Y2hnLmg+Ci0jZW5kaWYKKworI2VuZGlmIC8qICFDT05GSUdfU01QICovCisKKyNkZWZpbmUgeGNoZyhwdHIsIHgpICgoX190eXBlb2ZfXygqKHB0cikpKV9feGNoZygodW5zaWduZWQgbG9uZykoeCksIChwdHIpLCBzaXplb2YoKihwdHIpKSkpCisjZGVmaW5lIHRhcyhwdHIpICgodm9pZCl4Y2hnKChwdHIpLCAxKSkKIAogI2RlZmluZSBwcmVwYXJlX3RvX3N3aXRjaCgpICAgICBkbyB7IH0gd2hpbGUoMCkKIApAQCAtMjA1LDEwICsxOTIsMTIgQEAKICAqIHB0ciBpc24ndCB0aGUgY3VycmVudCB0YXNrLCBpbiB3aGljaCBjYXNlIGl0IGRvZXMgbm90aGluZy4KICAqLwogCi0jaW5jbHVkZSA8YXNtL2JsYWNrZmluLmg+CisjaW5jbHVkZSA8YXNtL2wxbGF5b3V0Lmg+CisjaW5jbHVkZSA8YXNtL21lbV9tYXAuaD4KIAogYXNtbGlua2FnZSBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnJlc3VtZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnByZXYsIHN0cnVjdCB0YXNrX3N0cnVjdCAqbmV4dCk7CiAKKyNpZm5kZWYgQ09ORklHX1NNUAogI2RlZmluZSBzd2l0Y2hfdG8ocHJldixuZXh0LGxhc3QpIFwKIGRvIHsgICAgXAogCW1lbWNweSAoJnRhc2tfdGhyZWFkX2luZm8ocHJldiktPmwxX3Rhc2tfaW5mbywgTDFfU0NSQVRDSF9UQVNLX0lORk8sIFwKQEAgLTIxNyw1ICsyMDYsMTEgQEAKIAkJc2l6ZW9mICpMMV9TQ1JBVENIX1RBU0tfSU5GTyk7IFwKIAkobGFzdCkgPSByZXN1bWUgKHByZXYsIG5leHQpOyAgIFwKIH0gd2hpbGUgKDApCisjZWxzZQorI2RlZmluZSBzd2l0Y2hfdG8ocHJldiwgbmV4dCwgbGFzdCkgXAorZG8geyAgICBcCisJKGxhc3QpID0gcmVzdW1lKHByZXYsIG5leHQpOyAgIFwKK30gd2hpbGUgKDApCisjZW5kaWYKIAotI2VuZGlmCQkJCS8qIF9CTEFDS0ZJTl9TWVNURU1fSCAqLworI2VuZGlmCS8qIF9CTEFDS0ZJTl9TWVNURU1fSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS90aHJlYWRfaW5mby5oIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS90aHJlYWRfaW5mby5oCmluZGV4IDY0Mjc2OTMuLmU3MjFjZTUgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vdGhyZWFkX2luZm8uaAorKysgYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL3RocmVhZF9pbmZvLmgKQEAgLTQ0LDYgKzQ0LDcgQEAKICAqLwogI2RlZmluZSBUSFJFQURfU0laRV9PUkRFUgkxCiAjZGVmaW5lIFRIUkVBRF9TSVpFCQk4MTkyCS8qIDIgcGFnZXMgKi8KKyNkZWZpbmUgU1RBQ0tfV0FSTgkJKFRIUkVBRF9TSVpFLzgpCiAKICNpZm5kZWYgX19BU1NFTUJMWV9fCiAKQEAgLTYyLDcgKzYzLDkgQEAKIAlpbnQgcHJlZW1wdF9jb3VudDsJLyogMCA9PiBwcmVlbXB0YWJsZSwgPDAgPT4gQlVHICovCiAJbW1fc2VnbWVudF90IGFkZHJfbGltaXQ7CS8qIGFkZHJlc3MgbGltaXQgKi8KIAlzdHJ1Y3QgcmVzdGFydF9ibG9jayByZXN0YXJ0X2Jsb2NrOworI2lmbmRlZiBDT05GSUdfU01QCiAJc3RydWN0IGwxX3NjcmF0Y2hfdGFza19pbmZvIGwxX3Rhc2tfaW5mbzsKKyNlbmRpZgogfTsKIAogLyoKQEAgLTkwLDcgKzkzLDcgQEAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IHRocmVhZF9pbmZvICpjdXJyZW50X3RocmVhZF9pbmZvKHZvaWQpCiB7CiAJc3RydWN0IHRocmVhZF9pbmZvICp0aTsKLSAgICAgIF9fYXNtX18oIiUwID0gc3A7IjogIj0mZCIodGkpOgorICAgICAgX19hc21fXygiJTAgPSBzcDsiIDogIj1kYSIodGkpIDoKIAkpOwogCXJldHVybiAoc3RydWN0IHRocmVhZF9pbmZvICopKChsb25nKXRpICYgfigobG9uZylUSFJFQURfU0laRS0xKSk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL3VhY2Nlc3MuaCBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vdWFjY2Vzcy5oCmluZGV4IGQ5MjhiODAuLjMyNDgwMzMgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vdWFjY2Vzcy5oCisrKyBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vdWFjY2Vzcy5oCkBAIC0xNDksNTQgKzE0OSw0MiBAQAogCQkgOiAvKiBubyBvdXRwdXRzICovCQkJXAogCQkgOiJkIiAoeCksImEiIChfX3B0cihwKSkgOiAibWVtb3J5IikKIAotI2RlZmluZSBnZXRfdXNlcih4LHApCQkJCQkJCVwKLQkoewkJCQkJCQkJXAotCQlpbnQgX2VyciA9IDA7CQkJCQkJXAotCQl0eXBlb2YoKihwKSkgKl9wID0gKHApOwkJCQkJXAotCQlpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgX3AsIHNpemVvZigqKF9wKSkpKSB7CVwKLQkJCV9lcnIgPSAtRUZBVUxUOwkJCQkJXAotCQl9CQkJCQkJCVwKLQkJZWxzZSB7CQkJCQkJCVwKLQkJc3dpdGNoIChzaXplb2YoKihfcCkpKSB7CQkJCVwKLQkJY2FzZSAxOgkJCQkJCQlcCi0JCQlfX2dldF91c2VyX2FzbSh4LCBfcCwgQiwoWikpOwkJCVwKLQkJCWJyZWFrOwkJCQkJCVwKLQkJY2FzZSAyOgkJCQkJCQlcCi0JCQlfX2dldF91c2VyX2FzbSh4LCBfcCwgVywoWikpOwkJCVwKLQkJCWJyZWFrOwkJCQkJCVwKLQkJY2FzZSA0OgkJCQkJCQlcCi0JCQlfX2dldF91c2VyX2FzbSh4LCBfcCwgICwgKTsJCQlcCi0JCQlicmVhazsJCQkJCQlcCi0JCWNhc2UgODogewkJCQkJCVwKLQkJCXVuc2lnbmVkIGxvbmcgX3hsLCBfeGg7CQkJCVwKLQkJCV9fZ2V0X3VzZXJfYXNtKF94bCwgKCh1bnNpZ25lZCBsb25nICopX3ApKzAsICAsICk7IFwKLQkJCV9fZ2V0X3VzZXJfYXNtKF94aCwgKCh1bnNpZ25lZCBsb25nICopX3ApKzEsICAsICk7IFwKLQkJCSgodW5zaWduZWQgbG9uZyAqKSZ4KVswXSA9IF94bDsJCQlcCi0JCQkoKHVuc2lnbmVkIGxvbmcgKikmeClbMV0gPSBfeGg7CQkJXAotCQl9IGJyZWFrOwkJCQkJCVwKLQkJZGVmYXVsdDoJCQkJCQlcCi0JCQl4ID0gMDsJCQkJCQlcCi0JCQlwcmludGsoS0VSTl9JTkZPICJnZXRfdXNlcl9iYWQ6ICVzOiVkICVzXG4iLCAgICBcCi0JCQkgICAgICAgX19GSUxFX18sIF9fTElORV9fLCBfX2Z1bmNfXyk7CVwKLQkJCV9lcnIgPSBfX2dldF91c2VyX2JhZCgpOwkJCVwKLQkJCWJyZWFrOwkJCQkJCVwKLQkJfQkJCQkJCQlcCi0JCX0JCQkJCQkJXAotCQlfZXJyOwkJCQkJCQlcCi0JfSkKKyNkZWZpbmUgZ2V0X3VzZXIoeCwgcHRyKQkJCQkJXAorKHsJCQkJCQkJCVwKKwlpbnQgX2VyciA9IDA7CQkJCQkJXAorCXVuc2lnbmVkIGxvbmcgX3ZhbCA9IDA7CQkJCQlcCisJY29uc3QgdHlwZW9mKCoocHRyKSkgX191c2VyICpfcCA9IChwdHIpOwkJXAorCWNvbnN0IHNpemVfdCBwdHJfc2l6ZSA9IHNpemVvZigqKF9wKSk7CQkJXAorCWlmIChsaWtlbHkoYWNjZXNzX29rKFZFUklGWV9SRUFELCBfcCwgcHRyX3NpemUpKSkgewlcCisJCUJVSUxEX0JVR19PTihwdHJfc2l6ZSA+PSA4KTsJCQlcCisJCXN3aXRjaCAocHRyX3NpemUpIHsJCQkJXAorCQljYXNlIDE6CQkJCQkJXAorCQkJX19nZXRfdXNlcl9hc20oX3ZhbCwgX3AsIEIsKFopKTsJXAorCQkJYnJlYWs7CQkJCQlcCisJCWNhc2UgMjoJCQkJCQlcCisJCQlfX2dldF91c2VyX2FzbShfdmFsLCBfcCwgVywoWikpOwlcCisJCQlicmVhazsJCQkJCVwKKwkJY2FzZSA0OgkJCQkJCVwKKwkJCV9fZ2V0X3VzZXJfYXNtKF92YWwsIF9wLCAgLCApOwkJXAorCQkJYnJlYWs7CQkJCQlcCisJCX0JCQkJCQlcCisJfSBlbHNlCQkJCQkJCVwKKwkJX2VyciA9IC1FRkFVTFQ7CQkJCQlcCisJeCA9ICh0eXBlb2YoKihwdHIpKSlfdmFsOwkJCQlcCisJX2VycjsJCQkJCQkJXAorfSkKIAogI2RlZmluZSBfX2dldF91c2VyKHgscCkgZ2V0X3VzZXIoeCxwKQogCiAjZGVmaW5lIF9fZ2V0X3VzZXJfYmFkKCkgKGJhZF91c2VyX2FjY2Vzc19sZW5ndGgoKSwgKC1FRkFVTFQpKQogCi0jZGVmaW5lIF9fZ2V0X3VzZXJfYXNtKHgscCxiaHcsb3B0aW9uKQkJCQlcCi0JewkJCQkJCQlcCi0JCXVuc2lnbmVkIGxvbmcgX3RtcDsJCQkJXAotCQlfX2FzbV9fICgiJTAgPSIgI2JodyAiWyUxXSIjb3B0aW9uIjtcblx0IglcCi0JCQkgOiAiPWQiIChfdG1wKQkJCQlcCi0JCQkgOiAiYSIgKF9fcHRyKHApKSk7CQkJXAotCQkoeCkgPSAoX190eXBlb2ZfXygqKHApKSkgX3RtcDsJCQlcCi0JfQorI2RlZmluZSBfX2dldF91c2VyX2FzbSh4LCBwdHIsIGJodywgb3B0aW9uKQlcCisoewkJCQkJCVwKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCQkJXAorCQkiJTAgPSIgI2JodyAiWyUxXSIgI29wdGlvbiAiOyIJXAorCQk6ICI9ZCIgKHgpCQkJXAorCQk6ICJhIiAoX19wdHIocHRyKSkpOwkJXAorfSkKIAogI2RlZmluZSBfX2NvcHlfZnJvbV91c2VyKHRvLCBmcm9tLCBuKSBjb3B5X2Zyb21fdXNlcih0bywgZnJvbSwgbikKICNkZWZpbmUgX19jb3B5X3RvX3VzZXIodG8sIGZyb20sIG4pIGNvcHlfdG9fdXNlcih0bywgZnJvbSwgbikKQEAgLTIwOSw4ICsxOTcsOCBAQAogI2RlZmluZSBjb3B5X2Zyb21fdXNlcl9yZXQodG8sZnJvbSxuLHJldHZhbCkgKHsgaWYgKGNvcHlfZnJvbV91c2VyKHRvLGZyb20sbikpXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldHZhbDsgfSkKIAotc3RhdGljIGlubGluZSBsb25nIGNvcHlfZnJvbV91c2VyKHZvaWQgKnRvLAotCQkJCSAgY29uc3Qgdm9pZCBfX3VzZXIgKiBmcm9tLCB1bnNpZ25lZCBsb25nIG4pCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgX19tdXN0X2NoZWNrCitjb3B5X2Zyb21fdXNlcih2b2lkICp0bywgY29uc3Qgdm9pZCBfX3VzZXIgKmZyb20sIHVuc2lnbmVkIGxvbmcgbikKIHsKIAlpZiAoYWNjZXNzX29rKFZFUklGWV9SRUFELCBmcm9tLCBuKSkKIAkJbWVtY3B5KHRvLCBmcm9tLCBuKTsKQEAgLTIxOSw4ICsyMDcsOCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW5saW5lIGxvbmcgY29weV90b191c2VyKHZvaWQgKnRvLAotCQkJCWNvbnN0IHZvaWQgX191c2VyICogZnJvbSwgdW5zaWduZWQgbG9uZyBuKQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIF9fbXVzdF9jaGVjaworY29weV90b191c2VyKHZvaWQgKnRvLCBjb25zdCB2b2lkIF9fdXNlciAqZnJvbSwgdW5zaWduZWQgbG9uZyBuKQogewogCWlmIChhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCB0bywgbikpCiAJCW1lbWNweSh0bywgZnJvbSwgbik7CkBAIC0yMzMsOCArMjIxLDggQEAKICAqIENvcHkgYSBudWxsIHRlcm1pbmF0ZWQgc3RyaW5nIGZyb20gdXNlcnNwYWNlLgogICovCiAKLXN0YXRpYyBpbmxpbmUgbG9uZyBzdHJuY3B5X2Zyb21fdXNlcihjaGFyICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqc3JjLCBsb25nIGNvdW50KQorc3RhdGljIGlubGluZSBsb25nIF9fbXVzdF9jaGVjaworc3RybmNweV9mcm9tX3VzZXIoY2hhciAqZHN0LCBjb25zdCBjaGFyICpzcmMsIGxvbmcgY291bnQpCiB7CiAJY2hhciAqdG1wOwogCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCBzcmMsIDEpKQpAQCAtMjYwLDcgKzI0OCw4IEBACiAgKiBaZXJvIFVzZXJzcGFjZQogICovCiAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBfX2NsZWFyX3VzZXIodm9pZCAqdG8sIHVuc2lnbmVkIGxvbmcgbikKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBfX211c3RfY2hlY2sKK19fY2xlYXJfdXNlcih2b2lkICp0bywgdW5zaWduZWQgbG9uZyBuKQogewogCW1lbXNldCh0bywgMCwgbik7CiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL3hvci5oIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS94b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODJlYjEyCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS94b3IuaApAQCAtMCwwICsxIEBACisjaW5jbHVkZSA8YXNtLWdlbmVyaWMveG9yLmg+CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2tlcm5lbC9NYWtlZmlsZSBiL2FyY2gvYmxhY2tmaW4va2VybmVsL01ha2VmaWxlCmluZGV4IDYwNmFkYzcuLjM4YTIzMzMgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4va2VybmVsL01ha2VmaWxlCisrKyBiL2FyY2gvYmxhY2tmaW4va2VybmVsL01ha2VmaWxlCkBAIC03LDcgKzcsNyBAQAogb2JqLXkgOj0gXAogCWVudHJ5Lm8gcHJvY2Vzcy5vIGJmaW5fa3N5bXMubyBwdHJhY2UubyBzZXR1cC5vIHNpZ25hbC5vIFwKIAlzeXNfYmZpbi5vIHRyYXBzLm8gaXJxY2hpcC5vIGRtYS1tYXBwaW5nLm8gZmxhdC5vIFwKLQlmaXhlZF9jb2RlLm8gcmVib290Lm8gYmZpbl9ncGlvLm8KKwlmaXhlZF9jb2RlLm8gcmVib290Lm8gYmZpbl9ncGlvLm8gYmZpbl9kbWFfNXh4Lm8KIAogaWZlcSAoJChDT05GSUdfR0VORVJJQ19DTE9DS0VWRU5UUykseSkKICAgICBvYmoteSArPSB0aW1lLXRzLm8KQEAgLTE1LDggKzE1LDExIEBACiAgICAgb2JqLXkgKz0gdGltZS5vCiBlbmRpZgogCitvYmotJChDT05GSUdfSVBJUEUpICAgICAgICAgICAgICAgICAgKz0gaXBpcGUubworb2JqLSQoQ09ORklHX0lQSVBFX1RSQUNFX01DT1VOVCkgICAgICs9IG1jb3VudC5vCiBvYmotJChDT05GSUdfQkZJTl9HUFRJTUVSUykgICAgICAgICAgKz0gZ3B0aW1lcnMubworb2JqLSQoQ09ORklHX0NQTEJfSU5GTykgICAgICAgICAgICAgICs9IGNwbGJpbmZvLm8KIG9iai0kKENPTkZJR19NT0RVTEVTKSAgICAgICAgICAgICAgICArPSBtb2R1bGUubwotb2JqLSQoQ09ORklHX0JGSU5fRE1BXzVYWCkgICAgICAgICAgICs9IGJmaW5fZG1hXzV4eC5vCiBvYmotJChDT05GSUdfS0dEQikgICAgICAgICAgICAgICAgICAgKz0ga2dkYi5vCitvYmotJChDT05GSUdfS0dEQl9URVNUQ0FTRSkgICAgICAgICAgKz0ga2dkYl90ZXN0Lm8KIG9iai0kKENPTkZJR19FQVJMWV9QUklOVEspICAgICAgICAgICArPSBlYXJseV9wcmludGsubwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9rZXJuZWwvYXNtLW9mZnNldHMuYyBiL2FyY2gvYmxhY2tmaW4va2VybmVsL2FzbS1vZmZzZXRzLmMKaW5kZXggOWJiODVkZC4uYjVkZjk0NSAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9rZXJuZWwvYXNtLW9mZnNldHMuYworKysgYi9hcmNoL2JsYWNrZmluL2tlcm5lbC9hc20tb2Zmc2V0cy5jCkBAIC01Niw2ICs1Niw5IEBACiAJLyogb2Zmc2V0cyBpbnRvIHRoZSB0aHJlYWQgc3RydWN0ICovCiAJREVGSU5FKFRIUkVBRF9LU1AsIG9mZnNldG9mKHN0cnVjdCB0aHJlYWRfc3RydWN0LCBrc3ApKTsKIAlERUZJTkUoVEhSRUFEX1VTUCwgb2Zmc2V0b2Yoc3RydWN0IHRocmVhZF9zdHJ1Y3QsIHVzcCkpOworCURFRklORShUSFJFQURfU1IsIG9mZnNldG9mKHN0cnVjdCB0aHJlYWRfc3RydWN0LCBzZXFzdGF0KSk7CisJREVGSU5FKFBUX1NSLCBvZmZzZXRvZihzdHJ1Y3QgdGhyZWFkX3N0cnVjdCwgc2Vxc3RhdCkpOworCURFRklORShUSFJFQURfRVNQMCwgb2Zmc2V0b2Yoc3RydWN0IHRocmVhZF9zdHJ1Y3QsIGVzcDApKTsKIAlERUZJTkUoVEhSRUFEX1BDLCBvZmZzZXRvZihzdHJ1Y3QgdGhyZWFkX3N0cnVjdCwgcGMpKTsKIAlERUZJTkUoS0VSTkVMX1NUQUNLX1NJWkUsIFRIUkVBRF9TSVpFKTsKIApAQCAtMTI4LDUgKzEzMSwzMSBAQAogCURFRklORShTSUdTRUdWLCBTSUdTRUdWKTsKIAlERUZJTkUoU0lHVFJBUCwgU0lHVFJBUCk7CiAKKwkvKiBQREEgbWFuYWdlbWVudCAoaW4gTDEgc2NyYXRjaHBhZCkgKi8KKwlERUZJTkUoUERBX1NZU0NGRywgb2Zmc2V0b2Yoc3RydWN0IGJsYWNrZmluX3BkYSwgc3lzY2ZnKSk7CisjaWZkZWYgQ09ORklHX1NNUAorCURFRklORShQREFfSVJRRkxBR1MsIG9mZnNldG9mKHN0cnVjdCBibGFja2Zpbl9wZGEsIGltYXNrKSk7CisjZW5kaWYKKwlERUZJTkUoUERBX0lQRFQsIG9mZnNldG9mKHN0cnVjdCBibGFja2Zpbl9wZGEsIGlwZHQpKTsKKwlERUZJTkUoUERBX0lQRFRfU1dBUENPVU5ULCBvZmZzZXRvZihzdHJ1Y3QgYmxhY2tmaW5fcGRhLCBpcGR0X3N3YXBjb3VudCkpOworCURFRklORShQREFfRFBEVCwgb2Zmc2V0b2Yoc3RydWN0IGJsYWNrZmluX3BkYSwgZHBkdCkpOworCURFRklORShQREFfRFBEVF9TV0FQQ09VTlQsIG9mZnNldG9mKHN0cnVjdCBibGFja2Zpbl9wZGEsIGRwZHRfc3dhcGNvdW50KSk7CisJREVGSU5FKFBEQV9FWElQVFIsIG9mZnNldG9mKHN0cnVjdCBibGFja2Zpbl9wZGEsIGV4X2lwdHIpKTsKKwlERUZJTkUoUERBX0VYT1BUUiwgb2Zmc2V0b2Yoc3RydWN0IGJsYWNrZmluX3BkYSwgZXhfb3B0cikpOworCURFRklORShQREFfRVhCVUYsIG9mZnNldG9mKHN0cnVjdCBibGFja2Zpbl9wZGEsIGV4X2J1ZikpOworCURFRklORShQREFfRVhJTUFTSywgb2Zmc2V0b2Yoc3RydWN0IGJsYWNrZmluX3BkYSwgZXhfaW1hc2spKTsKKwlERUZJTkUoUERBX0VYU1RBQ0ssIG9mZnNldG9mKHN0cnVjdCBibGFja2Zpbl9wZGEsIGV4X3N0YWNrKSk7CisjaWZkZWYgQU5PTUFMWV8wNTAwMDI2MQorCURFRklORShQREFfTEZSRVRYLCBvZmZzZXRvZihzdHJ1Y3QgYmxhY2tmaW5fcGRhLCBsYXN0X2NwbGJfZmF1bHRfcmV0eCkpOworI2VuZGlmCisJREVGSU5FKFBEQV9EQ1BMQiwgb2Zmc2V0b2Yoc3RydWN0IGJsYWNrZmluX3BkYSwgZGNwbGJfZmF1bHRfYWRkcikpOworCURFRklORShQREFfSUNQTEIsIG9mZnNldG9mKHN0cnVjdCBibGFja2Zpbl9wZGEsIGljcGxiX2ZhdWx0X2FkZHIpKTsKKwlERUZJTkUoUERBX1JFVFgsIG9mZnNldG9mKHN0cnVjdCBibGFja2Zpbl9wZGEsIHJldHgpKTsKKwlERUZJTkUoUERBX1NFUVNUQVQsIG9mZnNldG9mKHN0cnVjdCBibGFja2Zpbl9wZGEsIHNlcXN0YXQpKTsKKyNpZmRlZiBDT05GSUdfU01QCisJLyogSW50ZXItY29yZSBsb2NrIChpbiBMMiBTUkFNKSAqLworCURFRklORShTSVpFT0ZfQ09SRUxPQ0ssIHNpemVvZihzdHJ1Y3QgY29yZWxvY2tfc2xvdCkpOworI2VuZGlmCisKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4va2VybmVsL2JmaW5fZG1hXzV4eC5jIGIvYXJjaC9ibGFja2Zpbi9rZXJuZWwvYmZpbl9kbWFfNXh4LmMKaW5kZXggMzM5MjkzZC4uMDdlMDJjMCAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9rZXJuZWwvYmZpbl9kbWFfNXh4LmMKKysrIGIvYXJjaC9ibGFja2Zpbi9rZXJuZWwvYmZpbl9kbWFfNXh4LmMKQEAgLTEsNjMgKzEsMjcgQEAKIC8qCi0gKiBGaWxlOiAgICAgICAgIGFyY2gvYmxhY2tmaW4va2VybmVsL2JmaW5fZG1hXzV4eC5jCi0gKiBCYXNlZCBvbjoKLSAqIEF1dGhvcjoKKyAqIGJmaW5fZG1hXzV4eC5jIC0gQmxhY2tmaW4gRE1BIGltcGxlbWVudGF0aW9uCiAgKgotICogQ3JlYXRlZDoKLSAqIERlc2NyaXB0aW9uOiAgVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBzaW1wbGUgRE1BIEltcGxlbWVudGF0aW9uIGZvciBCbGFja2ZpbgotICoKLSAqIE1vZGlmaWVkOgotICogICAgICAgICAgICAgICBDb3B5cmlnaHQgMjAwNC0yMDA2IEFuYWxvZyBEZXZpY2VzIEluYy4KLSAqCi0gKiBCdWdzOiAgICAgICAgIEVudGVyIGJ1Z3MgYXQgaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnLwotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIHRoZSBmaWxlIENPUFlJTkcsIG9yIHdyaXRlCi0gKiB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICogNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqIENvcHlyaWdodCAyMDA0LTIwMDggQW5hbG9nIERldmljZXMgSW5jLgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgogICovCiAKICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAKICNpbmNsdWRlIDxhc20vYmxhY2tmaW4uaD4KLSNpbmNsdWRlIDxhc20vZG1hLmg+CiAjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KKyNpbmNsdWRlIDxhc20vZG1hLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KIAotLyogUmVtb3ZlIHVudXNlZCBjb2RlIG5vdCBleHBvcnRlZCBieSBzeW1ib2wgb3IgaW50ZXJuYWxseSBjYWxsZWQgKi8KLSNkZWZpbmUgUkVNT1ZFX0RFQURfQ09ERQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEdsb2JhbCBWYXJpYWJsZXMKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIHN0cnVjdCBkbWFfY2hhbm5lbCBkbWFfY2hbTUFYX0JMQUNLRklOX0RNQV9DSEFOTkVMXTsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqICAgICAgIFNldCB0aGUgQnVmZmVyIENsZWFyIGJpdCBpbiB0aGUgQ29uZmlndXJhdGlvbiByZWdpc3RlciBvZiBzcGVjaWZpYyBETUEKLSAqICAgICAgIGNoYW5uZWwuIFRoaXMgd2lsbCBzdG9wIHRoZSBkZXNjcmlwdG9yIGJhc2VkIERNQSBvcGVyYXRpb24uCi0gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXN0YXRpYyB2b2lkIGNsZWFyX2RtYV9idWZmZXIodW5zaWduZWQgaW50IGNoYW5uZWwpCi17Ci0JZG1hX2NoW2NoYW5uZWxdLnJlZ3MtPmNmZyB8PSBSRVNUQVJUOwotCVNTWU5DKCk7Ci0JZG1hX2NoW2NoYW5uZWxdLnJlZ3MtPmNmZyAmPSB+UkVTVEFSVDsKLQlTU1lOQygpOwotfQorc3RydWN0IGRtYV9jaGFubmVsIGRtYV9jaFtNQVhfRE1BX0NIQU5ORUxTXTsKK0VYUE9SVF9TWU1CT0woZG1hX2NoKTsKIAogc3RhdGljIGludCBfX2luaXQgYmxhY2tmaW5fZG1hX2luaXQodm9pZCkKIHsKQEAgLTY1LDMyICsyOSw2NyBAQAogCiAJcHJpbnRrKEtFUk5fSU5GTyAiQmxhY2tmaW4gRE1BIENvbnRyb2xsZXJcbiIpOwogCi0JZm9yIChpID0gMDsgaSA8IE1BWF9CTEFDS0ZJTl9ETUFfQ0hBTk5FTDsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IE1BWF9ETUFfQ0hBTk5FTFM7IGkrKykgewogCQlkbWFfY2hbaV0uY2hhbl9zdGF0dXMgPSBETUFfQ0hBTk5FTF9GUkVFOwogCQlkbWFfY2hbaV0ucmVncyA9IGRtYV9pb19iYXNlX2FkZHJbaV07CiAJCW11dGV4X2luaXQoJihkbWFfY2hbaV0uZG1hbG9jaykpOwogCX0KIAkvKiBNYXJrIE1FTURNQSBDaGFubmVsIDAgYXMgcmVxdWVzdGVkIHNpbmNlIHdlJ3JlIHVzaW5nIGl0IGludGVybmFsbHkgKi8KLQlkbWFfY2hbQ0hfTUVNX1NUUkVBTTBfREVTVF0uY2hhbl9zdGF0dXMgPSBETUFfQ0hBTk5FTF9SRVFVRVNURUQ7Ci0JZG1hX2NoW0NIX01FTV9TVFJFQU0wX1NSQ10uY2hhbl9zdGF0dXMgPSBETUFfQ0hBTk5FTF9SRVFVRVNURUQ7CisJcmVxdWVzdF9kbWEoQ0hfTUVNX1NUUkVBTTBfREVTVCwgIkJsYWNrZmluIGRtYV9tZW1jcHkiKTsKKwlyZXF1ZXN0X2RtYShDSF9NRU1fU1RSRUFNMF9TUkMsICJCbGFja2ZpbiBkbWFfbWVtY3B5Iik7CiAKICNpZiBkZWZpbmVkKENPTkZJR19ERUJfRE1BX1VSR0VOVCkKIAliZmluX3dyaXRlX0VCSVVfRERSUVVFKGJmaW5fcmVhZF9FQklVX0REUlFVRSgpCiAJCQkgfCBERUIxX1VSR0VOVCB8IERFQjJfVVJHRU5UIHwgREVCM19VUkdFTlQpOwogI2VuZGlmCisKKwlyZXR1cm4gMDsKK30KK2FyY2hfaW5pdGNhbGwoYmxhY2tmaW5fZG1hX2luaXQpOworCisjaWZkZWYgQ09ORklHX1BST0NfRlMKK3N0YXRpYyBpbnQgcHJvY19kbWFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnYpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0RNQV9DSEFOTkVMUzsgKytpKQorCQlpZiAoZG1hX2NoW2ldLmNoYW5fc3RhdHVzICE9IERNQV9DSEFOTkVMX0ZSRUUpCisJCQlzZXFfcHJpbnRmKG0sICIlMmQ6ICVzXG4iLCBpLCBkbWFfY2hbaV0uZGV2aWNlX2lkKTsKKwogCXJldHVybiAwOwogfQogCi1hcmNoX2luaXRjYWxsKGJsYWNrZmluX2RtYV9pbml0KTsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqCVJlcXVlc3QgdGhlIHNwZWNpZmljIERNQSBjaGFubmVsIGZyb20gdGhlIHN5c3RlbS4KLSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotaW50IHJlcXVlc3RfZG1hKHVuc2lnbmVkIGludCBjaGFubmVsLCBjaGFyICpkZXZpY2VfaWQpCitzdGF0aWMgaW50IHByb2NfZG1hX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCiB7CisJcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIHByb2NfZG1hX3Nob3csIE5VTEwpOworfQogCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwcm9jX2RtYV9vcGVyYXRpb25zID0geworCS5vcGVuCQk9IHByb2NfZG1hX29wZW4sCisJLnJlYWQJCT0gc2VxX3JlYWQsCisJLmxsc2VlawkJPSBzZXFfbHNlZWssCisJLnJlbGVhc2UJPSBzaW5nbGVfcmVsZWFzZSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHByb2NfZG1hX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcHJvY19jcmVhdGUoImRtYSIsIDAsIE5VTEwsICZwcm9jX2RtYV9vcGVyYXRpb25zKSAhPSBOVUxMOworfQorbGF0ZV9pbml0Y2FsbChwcm9jX2RtYV9pbml0KTsKKyNlbmRpZgorCisvKioKKyAqCXJlcXVlc3RfZG1hIC0gcmVxdWVzdCBhIERNQSBjaGFubmVsCisgKgorICogUmVxdWVzdCB0aGUgc3BlY2lmaWMgRE1BIGNoYW5uZWwgZnJvbSB0aGUgc3lzdGVtIGlmIGl0J3MgYXZhaWxhYmxlLgorICovCitpbnQgcmVxdWVzdF9kbWEodW5zaWduZWQgaW50IGNoYW5uZWwsIGNvbnN0IGNoYXIgKmRldmljZV9pZCkKK3sKIAlwcl9kZWJ1ZygicmVxdWVzdF9kbWEoKSA6IEJFR0lOIFxuIik7CiAKKwlpZiAoZGV2aWNlX2lkID09IE5VTEwpCisJCXByaW50ayhLRVJOX1dBUk5JTkcgInJlcXVlc3RfZG1hKCV1KTogbm8gZGV2aWNlX2lkIGdpdmVuXG4iLCBjaGFubmVsKTsKKwogI2lmIGRlZmluZWQoQ09ORklHX0JGNTYxKSAmJiBBTk9NQUxZXzA1MDAwMTgyCiAJaWYgKGNoYW5uZWwgPj0gQ0hfSU1FTV9TVFJFQU0wX0RFU1QgJiYgY2hhbm5lbCA8PSBDSF9JTUVNX1NUUkVBTTFfREVTVCkgewogCQlpZiAoZ2V0X2NjbGsoKSA+IDUwMDAwMDAwMCkgewpAQCAtMTI5LDYwICsxMjgsNjMgQEAKICNlbmRpZgogCiAJZG1hX2NoW2NoYW5uZWxdLmRldmljZV9pZCA9IGRldmljZV9pZDsKLQlkbWFfY2hbY2hhbm5lbF0uaXJxX2NhbGxiYWNrID0gTlVMTDsKKwlkbWFfY2hbY2hhbm5lbF0uaXJxID0gMDsKIAogCS8qIFRoaXMgaXMgdG8gYmUgZW5hYmxlZCBieSBwdXR0aW5nIGEgcmVzdHJpY3Rpb24gLQogCSAqIHlvdSBoYXZlIHRvIHJlcXVlc3QgRE1BLCBiZWZvcmUgZG9pbmcgYW55IG9wZXJhdGlvbnMgb24KIAkgKiBkZXNjcmlwdG9yL2NoYW5uZWwKIAkgKi8KIAlwcl9kZWJ1ZygicmVxdWVzdF9kbWEoKSA6IEVORCAgXG4iKTsKLQlyZXR1cm4gY2hhbm5lbDsKKwlyZXR1cm4gMDsKIH0KIEVYUE9SVF9TWU1CT0wocmVxdWVzdF9kbWEpOwogCi1pbnQgc2V0X2RtYV9jYWxsYmFjayh1bnNpZ25lZCBpbnQgY2hhbm5lbCwgZG1hX2ludGVycnVwdF90IGNhbGxiYWNrLCB2b2lkICpkYXRhKQoraW50IHNldF9kbWFfY2FsbGJhY2sodW5zaWduZWQgaW50IGNoYW5uZWwsIGlycV9oYW5kbGVyX3QgY2FsbGJhY2ssIHZvaWQgKmRhdGEpCiB7Ci0JaW50IHJldF9pcnEgPSAwOwotCiAJQlVHX09OKCEoZG1hX2NoW2NoYW5uZWxdLmNoYW5fc3RhdHVzICE9IERNQV9DSEFOTkVMX0ZSRUUKLQkgICAgICAgJiYgY2hhbm5lbCA8IE1BWF9CTEFDS0ZJTl9ETUFfQ0hBTk5FTCkpOworCSAgICAgICAmJiBjaGFubmVsIDwgTUFYX0RNQV9DSEFOTkVMUykpOwogCiAJaWYgKGNhbGxiYWNrICE9IE5VTEwpIHsKLQkJaW50IHJldF92YWw7Ci0JCXJldF9pcnEgPSBjaGFubmVsMmlycShjaGFubmVsKTsKKwkJaW50IHJldDsKKwkJdW5zaWduZWQgaW50IGlycSA9IGNoYW5uZWwyaXJxKGNoYW5uZWwpOwogCisJCXJldCA9IHJlcXVlc3RfaXJxKGlycSwgY2FsbGJhY2ssIElSUUZfRElTQUJMRUQsCisJCQlkbWFfY2hbY2hhbm5lbF0uZGV2aWNlX2lkLCBkYXRhKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisKKwkJZG1hX2NoW2NoYW5uZWxdLmlycSA9IGlycTsKIAkJZG1hX2NoW2NoYW5uZWxdLmRhdGEgPSBkYXRhOwotCi0JCXJldF92YWwgPQotCQkgICAgcmVxdWVzdF9pcnEocmV0X2lycSwgKHZvaWQgKiljYWxsYmFjaywgSVJRRl9ESVNBQkxFRCwKLQkJCQlkbWFfY2hbY2hhbm5lbF0uZGV2aWNlX2lkLCBkYXRhKTsKLQkJaWYgKHJldF92YWwpIHsKLQkJCXByaW50ayhLRVJOX05PVElDRQotCQkJICAgICAgICJSZXF1ZXN0IGlycSBpbiBETUEgZW5naW5lIGZhaWxlZC5cbiIpOwotCQkJcmV0dXJuIC1FUEVSTTsKLQkJfQotCQlkbWFfY2hbY2hhbm5lbF0uaXJxX2NhbGxiYWNrID0gY2FsbGJhY2s7CiAJfQogCXJldHVybiAwOwogfQogRVhQT1JUX1NZTUJPTChzZXRfZG1hX2NhbGxiYWNrKTsKIAorLyoqCisgKgljbGVhcl9kbWFfYnVmZmVyIC0gY2xlYXIgRE1BIGZpZm9zIGZvciBzcGVjaWZpZWQgY2hhbm5lbAorICoKKyAqIFNldCB0aGUgQnVmZmVyIENsZWFyIGJpdCBpbiB0aGUgQ29uZmlndXJhdGlvbiByZWdpc3RlciBvZiBzcGVjaWZpYyBETUEKKyAqIGNoYW5uZWwuIFRoaXMgd2lsbCBzdG9wIHRoZSBkZXNjcmlwdG9yIGJhc2VkIERNQSBvcGVyYXRpb24uCisgKi8KK3N0YXRpYyB2b2lkIGNsZWFyX2RtYV9idWZmZXIodW5zaWduZWQgaW50IGNoYW5uZWwpCit7CisJZG1hX2NoW2NoYW5uZWxdLnJlZ3MtPmNmZyB8PSBSRVNUQVJUOworCVNTWU5DKCk7CisJZG1hX2NoW2NoYW5uZWxdLnJlZ3MtPmNmZyAmPSB+UkVTVEFSVDsKK30KKwogdm9pZCBmcmVlX2RtYSh1bnNpZ25lZCBpbnQgY2hhbm5lbCkKIHsKLQlpbnQgcmV0X2lycTsKLQogCXByX2RlYnVnKCJmcmVlZG1hKCkgOiBCRUdJTiBcbiIpOwogCUJVR19PTighKGRtYV9jaFtjaGFubmVsXS5jaGFuX3N0YXR1cyAhPSBETUFfQ0hBTk5FTF9GUkVFCi0JICAgICAgICYmIGNoYW5uZWwgPCBNQVhfQkxBQ0tGSU5fRE1BX0NIQU5ORUwpKTsKKwkgICAgICAgJiYgY2hhbm5lbCA8IE1BWF9ETUFfQ0hBTk5FTFMpKTsKIAogCS8qIEhhbHQgdGhlIERNQSAqLwogCWRpc2FibGVfZG1hKGNoYW5uZWwpOwogCWNsZWFyX2RtYV9idWZmZXIoY2hhbm5lbCk7CiAKLQlpZiAoZG1hX2NoW2NoYW5uZWxdLmlycV9jYWxsYmFjayAhPSBOVUxMKSB7Ci0JCXJldF9pcnEgPSBjaGFubmVsMmlycShjaGFubmVsKTsKLQkJZnJlZV9pcnEocmV0X2lycSwgZG1hX2NoW2NoYW5uZWxdLmRhdGEpOwotCX0KKwlpZiAoZG1hX2NoW2NoYW5uZWxdLmlycSkKKwkJZnJlZV9pcnEoZG1hX2NoW2NoYW5uZWxdLmlycSwgZG1hX2NoW2NoYW5uZWxdLmRhdGEpOwogCiAJLyogQ2xlYXIgdGhlIERNQSBWYXJpYWJsZSBpbiB0aGUgQ2hhbm5lbCAqLwogCW11dGV4X2xvY2soJihkbWFfY2hbY2hhbm5lbF0uZG1hbG9jaykpOwpAQCAtMTkzLDI5NCArMTk1LDE1IEBACiB9CiBFWFBPUlRfU1lNQk9MKGZyZWVfZG1hKTsKIAotdm9pZCBkbWFfZW5hYmxlX2lycSh1bnNpZ25lZCBpbnQgY2hhbm5lbCkKLXsKLQlpbnQgcmV0X2lycTsKLQotCXByX2RlYnVnKCJkbWFfZW5hYmxlX2lycSgpIDogQkVHSU4gXG4iKTsKLQlCVUdfT04oIShkbWFfY2hbY2hhbm5lbF0uY2hhbl9zdGF0dXMgIT0gRE1BX0NIQU5ORUxfRlJFRQotCSAgICAgICAmJiBjaGFubmVsIDwgTUFYX0JMQUNLRklOX0RNQV9DSEFOTkVMKSk7Ci0KLQlyZXRfaXJxID0gY2hhbm5lbDJpcnEoY2hhbm5lbCk7Ci0JZW5hYmxlX2lycShyZXRfaXJxKTsKLX0KLUVYUE9SVF9TWU1CT0woZG1hX2VuYWJsZV9pcnEpOwotCi12b2lkIGRtYV9kaXNhYmxlX2lycSh1bnNpZ25lZCBpbnQgY2hhbm5lbCkKLXsKLQlpbnQgcmV0X2lycTsKLQotCXByX2RlYnVnKCJkbWFfZGlzYWJsZV9pcnEoKSA6IEJFR0lOIFxuIik7Ci0JQlVHX09OKCEoZG1hX2NoW2NoYW5uZWxdLmNoYW5fc3RhdHVzICE9IERNQV9DSEFOTkVMX0ZSRUUKLQkgICAgICAgJiYgY2hhbm5lbCA8IE1BWF9CTEFDS0ZJTl9ETUFfQ0hBTk5FTCkpOwotCi0JcmV0X2lycSA9IGNoYW5uZWwyaXJxKGNoYW5uZWwpOwotCWRpc2FibGVfaXJxKHJldF9pcnEpOwotfQotRVhQT1JUX1NZTUJPTChkbWFfZGlzYWJsZV9pcnEpOwotCi1pbnQgZG1hX2NoYW5uZWxfYWN0aXZlKHVuc2lnbmVkIGludCBjaGFubmVsKQotewotCWlmIChkbWFfY2hbY2hhbm5lbF0uY2hhbl9zdGF0dXMgPT0gRE1BX0NIQU5ORUxfRlJFRSkgewotCQlyZXR1cm4gMDsKLQl9IGVsc2UgewotCQlyZXR1cm4gMTsKLQl9Ci19Ci1FWFBPUlRfU1lNQk9MKGRtYV9jaGFubmVsX2FjdGl2ZSk7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qCXN0b3AgdGhlIHNwZWNpZmljIERNQSBjaGFubmVsLgotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXZvaWQgZGlzYWJsZV9kbWEodW5zaWduZWQgaW50IGNoYW5uZWwpCi17Ci0JcHJfZGVidWcoInN0b3BfZG1hKCkgOiBCRUdJTiBcbiIpOwotCi0JQlVHX09OKCEoZG1hX2NoW2NoYW5uZWxdLmNoYW5fc3RhdHVzICE9IERNQV9DSEFOTkVMX0ZSRUUKLQkgICAgICAgJiYgY2hhbm5lbCA8IE1BWF9CTEFDS0ZJTl9ETUFfQ0hBTk5FTCkpOwotCi0JZG1hX2NoW2NoYW5uZWxdLnJlZ3MtPmNmZyAmPSB+RE1BRU47CS8qIENsZWFuIHRoZSBlbmFibGUgYml0ICovCi0JU1NZTkMoKTsKLQlkbWFfY2hbY2hhbm5lbF0uY2hhbl9zdGF0dXMgPSBETUFfQ0hBTk5FTF9SRVFVRVNURUQ7Ci0JLyogTmVlZHMgdG8gYmUgZW5hYmxlZCBMYXRlciAqLwotCXByX2RlYnVnKCJzdG9wX2RtYSgpIDogRU5EIFxuIik7Ci0JcmV0dXJuOwotfQotRVhQT1JUX1NZTUJPTChkaXNhYmxlX2RtYSk7Ci0KLXZvaWQgZW5hYmxlX2RtYSh1bnNpZ25lZCBpbnQgY2hhbm5lbCkKLXsKLQlwcl9kZWJ1ZygiZW5hYmxlX2RtYSgpIDogQkVHSU4gXG4iKTsKLQotCUJVR19PTighKGRtYV9jaFtjaGFubmVsXS5jaGFuX3N0YXR1cyAhPSBETUFfQ0hBTk5FTF9GUkVFCi0JICAgICAgICYmIGNoYW5uZWwgPCBNQVhfQkxBQ0tGSU5fRE1BX0NIQU5ORUwpKTsKLQotCWRtYV9jaFtjaGFubmVsXS5jaGFuX3N0YXR1cyA9IERNQV9DSEFOTkVMX0VOQUJMRUQ7Ci0JZG1hX2NoW2NoYW5uZWxdLnJlZ3MtPmN1cnJfeF9jb3VudCA9IDA7Ci0JZG1hX2NoW2NoYW5uZWxdLnJlZ3MtPmN1cnJfeV9jb3VudCA9IDA7Ci0KLQlkbWFfY2hbY2hhbm5lbF0ucmVncy0+Y2ZnIHw9IERNQUVOOwkvKiBTZXQgdGhlIGVuYWJsZSBiaXQgKi8KLQlTU1lOQygpOwotCXByX2RlYnVnKCJlbmFibGVfZG1hKCkgOiBFTkQgXG4iKTsKLQlyZXR1cm47Ci19Ci1FWFBPUlRfU1lNQk9MKGVuYWJsZV9kbWEpOwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKgkJU2V0IHRoZSBTdGFydCBBZGRyZXNzIHJlZ2lzdGVyIGZvciB0aGUgc3BlY2lmaWMgRE1BIGNoYW5uZWwKLSogCQlUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIGZvciByZWdpc3RlciBiYXNlZCBETUEsCi0qCQl0byBzZXR1cCB0aGUgc3RhcnQgYWRkcmVzcwotKgkJYWRkcjoJCVN0YXJ0aW5nIGFkZHJlc3Mgb2YgdGhlIERNQSBEYXRhIHRvIGJlIHRyYW5zZmVycmVkLgotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXZvaWQgc2V0X2RtYV9zdGFydF9hZGRyKHVuc2lnbmVkIGludCBjaGFubmVsLCB1bnNpZ25lZCBsb25nIGFkZHIpCi17Ci0JcHJfZGVidWcoInNldF9kbWFfc3RhcnRfYWRkcigpIDogQkVHSU4gXG4iKTsKLQotCUJVR19PTighKGRtYV9jaFtjaGFubmVsXS5jaGFuX3N0YXR1cyAhPSBETUFfQ0hBTk5FTF9GUkVFCi0JICAgICAgICYmIGNoYW5uZWwgPCBNQVhfQkxBQ0tGSU5fRE1BX0NIQU5ORUwpKTsKLQotCWRtYV9jaFtjaGFubmVsXS5yZWdzLT5zdGFydF9hZGRyID0gYWRkcjsKLQlTU1lOQygpOwotCXByX2RlYnVnKCJzZXRfZG1hX3N0YXJ0X2FkZHIoKSA6IEVORFxuIik7Ci19Ci1FWFBPUlRfU1lNQk9MKHNldF9kbWFfc3RhcnRfYWRkcik7Ci0KLXZvaWQgc2V0X2RtYV9uZXh0X2Rlc2NfYWRkcih1bnNpZ25lZCBpbnQgY2hhbm5lbCwgdW5zaWduZWQgbG9uZyBhZGRyKQotewotCXByX2RlYnVnKCJzZXRfZG1hX25leHRfZGVzY19hZGRyKCkgOiBCRUdJTiBcbiIpOwotCi0JQlVHX09OKCEoZG1hX2NoW2NoYW5uZWxdLmNoYW5fc3RhdHVzICE9IERNQV9DSEFOTkVMX0ZSRUUKLQkgICAgICAgJiYgY2hhbm5lbCA8IE1BWF9CTEFDS0ZJTl9ETUFfQ0hBTk5FTCkpOwotCi0JZG1hX2NoW2NoYW5uZWxdLnJlZ3MtPm5leHRfZGVzY19wdHIgPSBhZGRyOwotCVNTWU5DKCk7Ci0JcHJfZGVidWcoInNldF9kbWFfbmV4dF9kZXNjX2FkZHIoKSA6IEVORFxuIik7Ci19Ci1FWFBPUlRfU1lNQk9MKHNldF9kbWFfbmV4dF9kZXNjX2FkZHIpOwotCi12b2lkIHNldF9kbWFfY3Vycl9kZXNjX2FkZHIodW5zaWduZWQgaW50IGNoYW5uZWwsIHVuc2lnbmVkIGxvbmcgYWRkcikKLXsKLQlwcl9kZWJ1Zygic2V0X2RtYV9jdXJyX2Rlc2NfYWRkcigpIDogQkVHSU4gXG4iKTsKLQotCUJVR19PTighKGRtYV9jaFtjaGFubmVsXS5jaGFuX3N0YXR1cyAhPSBETUFfQ0hBTk5FTF9GUkVFCi0JICAgICAgICYmIGNoYW5uZWwgPCBNQVhfQkxBQ0tGSU5fRE1BX0NIQU5ORUwpKTsKLQotCWRtYV9jaFtjaGFubmVsXS5yZWdzLT5jdXJyX2Rlc2NfcHRyID0gYWRkcjsKLQlTU1lOQygpOwotCXByX2RlYnVnKCJzZXRfZG1hX2N1cnJfZGVzY19hZGRyKCkgOiBFTkRcbiIpOwotfQotRVhQT1JUX1NZTUJPTChzZXRfZG1hX2N1cnJfZGVzY19hZGRyKTsKLQotdm9pZCBzZXRfZG1hX3hfY291bnQodW5zaWduZWQgaW50IGNoYW5uZWwsIHVuc2lnbmVkIHNob3J0IHhfY291bnQpCi17Ci0JQlVHX09OKCEoZG1hX2NoW2NoYW5uZWxdLmNoYW5fc3RhdHVzICE9IERNQV9DSEFOTkVMX0ZSRUUKLQkgICAgICAgJiYgY2hhbm5lbCA8IE1BWF9CTEFDS0ZJTl9ETUFfQ0hBTk5FTCkpOwotCi0JZG1hX2NoW2NoYW5uZWxdLnJlZ3MtPnhfY291bnQgPSB4X2NvdW50OwotCVNTWU5DKCk7Ci19Ci1FWFBPUlRfU1lNQk9MKHNldF9kbWFfeF9jb3VudCk7Ci0KLXZvaWQgc2V0X2RtYV95X2NvdW50KHVuc2lnbmVkIGludCBjaGFubmVsLCB1bnNpZ25lZCBzaG9ydCB5X2NvdW50KQotewotCUJVR19PTighKGRtYV9jaFtjaGFubmVsXS5jaGFuX3N0YXR1cyAhPSBETUFfQ0hBTk5FTF9GUkVFCi0JICAgICAgICYmIGNoYW5uZWwgPCBNQVhfQkxBQ0tGSU5fRE1BX0NIQU5ORUwpKTsKLQotCWRtYV9jaFtjaGFubmVsXS5yZWdzLT55X2NvdW50ID0geV9jb3VudDsKLQlTU1lOQygpOwotfQotRVhQT1JUX1NZTUJPTChzZXRfZG1hX3lfY291bnQpOwotCi12b2lkIHNldF9kbWFfeF9tb2RpZnkodW5zaWduZWQgaW50IGNoYW5uZWwsIHNob3J0IHhfbW9kaWZ5KQotewotCUJVR19PTighKGRtYV9jaFtjaGFubmVsXS5jaGFuX3N0YXR1cyAhPSBETUFfQ0hBTk5FTF9GUkVFCi0JICAgICAgICYmIGNoYW5uZWwgPCBNQVhfQkxBQ0tGSU5fRE1BX0NIQU5ORUwpKTsKLQotCWRtYV9jaFtjaGFubmVsXS5yZWdzLT54X21vZGlmeSA9IHhfbW9kaWZ5OwotCVNTWU5DKCk7Ci19Ci1FWFBPUlRfU1lNQk9MKHNldF9kbWFfeF9tb2RpZnkpOwotCi12b2lkIHNldF9kbWFfeV9tb2RpZnkodW5zaWduZWQgaW50IGNoYW5uZWwsIHNob3J0IHlfbW9kaWZ5KQotewotCUJVR19PTighKGRtYV9jaFtjaGFubmVsXS5jaGFuX3N0YXR1cyAhPSBETUFfQ0hBTk5FTF9GUkVFCi0JICAgICAgICYmIGNoYW5uZWwgPCBNQVhfQkxBQ0tGSU5fRE1BX0NIQU5ORUwpKTsKLQotCWRtYV9jaFtjaGFubmVsXS5yZWdzLT55X21vZGlmeSA9IHlfbW9kaWZ5OwotCVNTWU5DKCk7Ci19Ci1FWFBPUlRfU1lNQk9MKHNldF9kbWFfeV9tb2RpZnkpOwotCi12b2lkIHNldF9kbWFfY29uZmlnKHVuc2lnbmVkIGludCBjaGFubmVsLCB1bnNpZ25lZCBzaG9ydCBjb25maWcpCi17Ci0JQlVHX09OKCEoZG1hX2NoW2NoYW5uZWxdLmNoYW5fc3RhdHVzICE9IERNQV9DSEFOTkVMX0ZSRUUKLQkgICAgICAgJiYgY2hhbm5lbCA8IE1BWF9CTEFDS0ZJTl9ETUFfQ0hBTk5FTCkpOwotCi0JZG1hX2NoW2NoYW5uZWxdLnJlZ3MtPmNmZyA9IGNvbmZpZzsKLQlTU1lOQygpOwotfQotRVhQT1JUX1NZTUJPTChzZXRfZG1hX2NvbmZpZyk7Ci0KLXVuc2lnbmVkIHNob3J0Ci1zZXRfYmZpbl9kbWFfY29uZmlnKGNoYXIgZGlyZWN0aW9uLCBjaGFyIGZsb3dfbW9kZSwKLQkJICAgIGNoYXIgaW50cl9tb2RlLCBjaGFyIGRtYV9tb2RlLCBjaGFyIHdpZHRoLCBjaGFyIHN5bmNtb2RlKQotewotCXVuc2lnbmVkIHNob3J0IGNvbmZpZzsKLQotCWNvbmZpZyA9Ci0JICAgICgoZGlyZWN0aW9uIDw8IDEpIHwgKHdpZHRoIDw8IDIpIHwgKGRtYV9tb2RlIDw8IDQpIHwKLQkgICAgIChpbnRyX21vZGUgPDwgNikgfCAoZmxvd19tb2RlIDw8IDEyKSB8IChzeW5jbW9kZSA8PCA1KSk7Ci0JcmV0dXJuIGNvbmZpZzsKLX0KLUVYUE9SVF9TWU1CT0woc2V0X2JmaW5fZG1hX2NvbmZpZyk7Ci0KLXZvaWQgc2V0X2RtYV9zZyh1bnNpZ25lZCBpbnQgY2hhbm5lbCwgc3RydWN0IGRtYXNnICpzZywgaW50IG5yX3NnKQotewotCUJVR19PTighKGRtYV9jaFtjaGFubmVsXS5jaGFuX3N0YXR1cyAhPSBETUFfQ0hBTk5FTF9GUkVFCi0JICAgICAgICYmIGNoYW5uZWwgPCBNQVhfQkxBQ0tGSU5fRE1BX0NIQU5ORUwpKTsKLQotCWRtYV9jaFtjaGFubmVsXS5yZWdzLT5jZmcgfD0gKChucl9zZyAmIDB4MEYpIDw8IDgpOwotCi0JZG1hX2NoW2NoYW5uZWxdLnJlZ3MtPm5leHRfZGVzY19wdHIgPSAodW5zaWduZWQgaW50KXNnOwotCi0JU1NZTkMoKTsKLX0KLUVYUE9SVF9TWU1CT0woc2V0X2RtYV9zZyk7Ci0KLXZvaWQgc2V0X2RtYV9jdXJyX2FkZHIodW5zaWduZWQgaW50IGNoYW5uZWwsIHVuc2lnbmVkIGxvbmcgYWRkcikKLXsKLQlCVUdfT04oIShkbWFfY2hbY2hhbm5lbF0uY2hhbl9zdGF0dXMgIT0gRE1BX0NIQU5ORUxfRlJFRQotCSAgICAgICAmJiBjaGFubmVsIDwgTUFYX0JMQUNLRklOX0RNQV9DSEFOTkVMKSk7Ci0KLQlkbWFfY2hbY2hhbm5lbF0ucmVncy0+Y3Vycl9hZGRyX3B0ciA9IGFkZHI7Ci0JU1NZTkMoKTsKLX0KLUVYUE9SVF9TWU1CT0woc2V0X2RtYV9jdXJyX2FkZHIpOwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICoJR2V0IHRoZSBETUEgc3RhdHVzIG9mIGEgc3BlY2lmaWMgRE1BIGNoYW5uZWwgZnJvbSB0aGUgc3lzdGVtLgotICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi11bnNpZ25lZCBzaG9ydCBnZXRfZG1hX2N1cnJfaXJxc3RhdCh1bnNpZ25lZCBpbnQgY2hhbm5lbCkKLXsKLQlCVUdfT04oIShkbWFfY2hbY2hhbm5lbF0uY2hhbl9zdGF0dXMgIT0gRE1BX0NIQU5ORUxfRlJFRQotCSAgICAgICAmJiBjaGFubmVsIDwgTUFYX0JMQUNLRklOX0RNQV9DSEFOTkVMKSk7Ci0KLQlyZXR1cm4gZG1hX2NoW2NoYW5uZWxdLnJlZ3MtPmlycV9zdGF0dXM7Ci19Ci1FWFBPUlRfU1lNQk9MKGdldF9kbWFfY3Vycl9pcnFzdGF0KTsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqCUNsZWFyIHRoZSBETUFfRE9ORSBiaXQgaW4gRE1BIHN0YXR1cy4gU3RvcCB0aGUgRE1BIGNvbXBsZXRpb24gaW50ZXJydXB0LgotICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi12b2lkIGNsZWFyX2RtYV9pcnFzdGF0KHVuc2lnbmVkIGludCBjaGFubmVsKQotewotCUJVR19PTighKGRtYV9jaFtjaGFubmVsXS5jaGFuX3N0YXR1cyAhPSBETUFfQ0hBTk5FTF9GUkVFCi0JICAgICAgICYmIGNoYW5uZWwgPCBNQVhfQkxBQ0tGSU5fRE1BX0NIQU5ORUwpKTsKLQlkbWFfY2hbY2hhbm5lbF0ucmVncy0+aXJxX3N0YXR1cyB8PSAzOwotfQotRVhQT1JUX1NZTUJPTChjbGVhcl9kbWFfaXJxc3RhdCk7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKglHZXQgY3VycmVudCBETUEgeGNvdW50IG9mIGEgc3BlY2lmaWMgRE1BIGNoYW5uZWwgZnJvbSB0aGUgc3lzdGVtLgotICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi11bnNpZ25lZCBzaG9ydCBnZXRfZG1hX2N1cnJfeGNvdW50KHVuc2lnbmVkIGludCBjaGFubmVsKQotewotCUJVR19PTighKGRtYV9jaFtjaGFubmVsXS5jaGFuX3N0YXR1cyAhPSBETUFfQ0hBTk5FTF9GUkVFCi0JICAgICAgICYmIGNoYW5uZWwgPCBNQVhfQkxBQ0tGSU5fRE1BX0NIQU5ORUwpKTsKLQotCXJldHVybiBkbWFfY2hbY2hhbm5lbF0ucmVncy0+Y3Vycl94X2NvdW50OwotfQotRVhQT1JUX1NZTUJPTChnZXRfZG1hX2N1cnJfeGNvdW50KTsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqCUdldCBjdXJyZW50IERNQSB5Y291bnQgb2YgYSBzcGVjaWZpYyBETUEgY2hhbm5lbCBmcm9tIHRoZSBzeXN0ZW0uCi0gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXVuc2lnbmVkIHNob3J0IGdldF9kbWFfY3Vycl95Y291bnQodW5zaWduZWQgaW50IGNoYW5uZWwpCi17Ci0JQlVHX09OKCEoZG1hX2NoW2NoYW5uZWxdLmNoYW5fc3RhdHVzICE9IERNQV9DSEFOTkVMX0ZSRUUKLQkgICAgICAgJiYgY2hhbm5lbCA8IE1BWF9CTEFDS0ZJTl9ETUFfQ0hBTk5FTCkpOwotCi0JcmV0dXJuIGRtYV9jaFtjaGFubmVsXS5yZWdzLT5jdXJyX3lfY291bnQ7Ci19Ci1FWFBPUlRfU1lNQk9MKGdldF9kbWFfY3Vycl95Y291bnQpOwotCi11bnNpZ25lZCBsb25nIGdldF9kbWFfbmV4dF9kZXNjX3B0cih1bnNpZ25lZCBpbnQgY2hhbm5lbCkKLXsKLQlCVUdfT04oIShkbWFfY2hbY2hhbm5lbF0uY2hhbl9zdGF0dXMgIT0gRE1BX0NIQU5ORUxfRlJFRQotCSAgICAgICYmIGNoYW5uZWwgPCBNQVhfQkxBQ0tGSU5fRE1BX0NIQU5ORUwpKTsKLQotCXJldHVybiBkbWFfY2hbY2hhbm5lbF0ucmVncy0+bmV4dF9kZXNjX3B0cjsKLX0KLUVYUE9SVF9TWU1CT0woZ2V0X2RtYV9uZXh0X2Rlc2NfcHRyKTsKLQotdW5zaWduZWQgbG9uZyBnZXRfZG1hX2N1cnJfZGVzY19wdHIodW5zaWduZWQgaW50IGNoYW5uZWwpCi17Ci0JQlVHX09OKCEoZG1hX2NoW2NoYW5uZWxdLmNoYW5fc3RhdHVzICE9IERNQV9DSEFOTkVMX0ZSRUUKLQkgICAgICAmJiBjaGFubmVsIDwgTUFYX0JMQUNLRklOX0RNQV9DSEFOTkVMKSk7Ci0KLQlyZXR1cm4gZG1hX2NoW2NoYW5uZWxdLnJlZ3MtPmN1cnJfZGVzY19wdHI7Ci19Ci1FWFBPUlRfU1lNQk9MKGdldF9kbWFfY3Vycl9kZXNjX3B0cik7Ci0KLXVuc2lnbmVkIGxvbmcgZ2V0X2RtYV9jdXJyX2FkZHIodW5zaWduZWQgaW50IGNoYW5uZWwpCi17Ci0JQlVHX09OKCEoZG1hX2NoW2NoYW5uZWxdLmNoYW5fc3RhdHVzICE9IERNQV9DSEFOTkVMX0ZSRUUKLQkgICAgICAmJiBjaGFubmVsIDwgTUFYX0JMQUNLRklOX0RNQV9DSEFOTkVMKSk7Ci0KLQlyZXR1cm4gZG1hX2NoW2NoYW5uZWxdLnJlZ3MtPmN1cnJfYWRkcl9wdHI7Ci19Ci1FWFBPUlRfU1lNQk9MKGdldF9kbWFfY3Vycl9hZGRyKTsKLQogI2lmZGVmIENPTkZJR19QTQorIyBpZm5kZWYgTUFYX0RNQV9TVVNQRU5EX0NIQU5ORUxTCisjICBkZWZpbmUgTUFYX0RNQV9TVVNQRU5EX0NIQU5ORUxTIE1BWF9ETUFfQ0hBTk5FTFMKKyMgZW5kaWYKIGludCBibGFja2Zpbl9kbWFfc3VzcGVuZCh2b2lkKQogewogCWludCBpOwogCi0jaWZkZWYgQ09ORklHX0JGNTYxCS8qIElNRE1BIGNoYW5uZWxzIGRvZXNuJ3QgaGF2ZSBhIFBFUklQSEVSQUxfTUFQICovCi0JZm9yIChpID0gMDsgaSA8PSBDSF9NRU1fU1RSRUFNM19TUkM7IGkrKykgewotI2Vsc2UKLQlmb3IgKGkgPSAwOyBpIDwgTUFYX0JMQUNLRklOX0RNQV9DSEFOTkVMOyBpKyspIHsKLSNlbmRpZgorCWZvciAoaSA9IDA7IGkgPCBNQVhfRE1BX1NVU1BFTkRfQ0hBTk5FTFM7ICsraSkgewogCQlpZiAoZG1hX2NoW2ldLmNoYW5fc3RhdHVzID09IERNQV9DSEFOTkVMX0VOQUJMRUQpIHsKIAkJCXByaW50ayhLRVJOX0VSUiAiRE1BIENoYW5uZWwgJWQgZmFpbGVkIHRvIHN1c3BlbmRcbiIsIGkpOwogCQkJcmV0dXJuIC1FQlVTWTsKQEAgLTQ5NSwzODggKzIxOCwyMDEgQEAKIHZvaWQgYmxhY2tmaW5fZG1hX3Jlc3VtZSh2b2lkKQogewogCWludCBpOwotCi0jaWZkZWYgQ09ORklHX0JGNTYxCS8qIElNRE1BIGNoYW5uZWxzIGRvZXNuJ3QgaGF2ZSBhIFBFUklQSEVSQUxfTUFQICovCi0JZm9yIChpID0gMDsgaSA8PSBDSF9NRU1fU1RSRUFNM19TUkM7IGkrKykKLSNlbHNlCi0JZm9yIChpID0gMDsgaSA8IE1BWF9CTEFDS0ZJTl9ETUFfQ0hBTk5FTDsgaSsrKQotI2VuZGlmCisJZm9yIChpID0gMDsgaSA8IE1BWF9ETUFfU1VTUEVORF9DSEFOTkVMUzsgKytpKQogCQlkbWFfY2hbaV0ucmVncy0+cGVyaXBoZXJhbF9tYXAgPSBkbWFfY2hbaV0uc2F2ZWRfcGVyaXBoZXJhbF9tYXA7CiB9CiAjZW5kaWYKIAotc3RhdGljIHZvaWQgKl9fZG1hX21lbWNweSh2b2lkICpkZXN0LCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBzaXplKQorLyoqCisgKglibGFja2Zpbl9kbWFfZWFybHlfaW5pdCAtIG1pbmltYWwgRE1BIGluaXQKKyAqCisgKiBTZXR1cCBhIGZldyBETUEgcmVnaXN0ZXJzIHNvIHdlIGNhbiBzYWZlbHkgZG8gRE1BIHRyYW5zZmVycyBlYXJseSBvbiBpbgorICogdGhlIGtlcm5lbCBib290aW5nIHByb2Nlc3MuICBSZWFsbHkgdGhpcyBqdXN0IG1lYW5zIHVzaW5nIGRtYV9tZW1jcHkoKS4KKyAqLwordm9pZCBfX2luaXQgYmxhY2tmaW5fZG1hX2Vhcmx5X2luaXQodm9pZCkKIHsKLQlpbnQgZGlyZWN0aW9uOwkvKiAxIC0gYWRkcmVzcyBkZWNyZWFzZSwgMCAtIGFkZHJlc3MgaW5jcmVhc2UgKi8KLQlpbnQgZmxhZ19hbGlnbjsJLyogMSAtIGFkZHJlc3MgYWxpZ25lZCwgIDAgLSBhZGRyZXNzIHVuYWxpZ25lZCAqLwotCWludCBmbGFnXzJEOwkvKiAxIC0gMkQgRE1BIG5lZWRlZCwJIDAgLSAxRCBETUEgbmVlZGVkICovCisJYmZpbl93cml0ZV9NRE1BX1MwX0NPTkZJRygwKTsKK30KKworLyoqCisgKglfX2RtYV9tZW1jcHkgLSBwcm9ncmFtIHRoZSBNRE1BIHJlZ2lzdGVycworICoKKyAqIEFjdHVhbGx5IHByb2dyYW0gTURNQTAgYW5kIHdhaXQgZm9yIHRoZSB0cmFuc2ZlciB0byBmaW5pc2guICBEaXNhYmxlIElSUXMKKyAqIHdoaWxlIHByb2dyYW1taW5nIHJlZ2lzdGVycyBzbyB0aGF0IGV2ZXJ5dGhpbmcgaXMgZnVsbHkgY29uZmlndXJlZC4gIFdhaXQKKyAqIGZvciBETUEgdG8gZmluaXNoIHdpdGggSVJRcyBlbmFibGVkLiAgSWYgaW50ZXJydXB0ZWQsIHRoZSBpbml0aWFsIERNQV9ET05FCisgKiBjaGVjayB3aWxsIG1ha2Ugc3VyZSB3ZSBkb24ndCBjbG9iYmVyIGFueSBleGlzdGluZyB0cmFuc2Zlci4KKyAqLworc3RhdGljIHZvaWQgX19kbWFfbWVtY3B5KHUzMiBkYWRkciwgczE2IGRtb2QsIHUzMiBzYWRkciwgczE2IHNtb2QsIHNpemVfdCBjbnQsIHUzMiBjb25mKQoreworCXN0YXRpYyBERUZJTkVfU1BJTkxPQ0sobWRtYV9sb2NrKTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JaWYgKHNpemUgPD0gMCkKLQkJcmV0dXJuIE5VTEw7CisJc3Bpbl9sb2NrX2lycXNhdmUoJm1kbWFfbG9jaywgZmxhZ3MpOwogCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCWlmIChiZmluX3JlYWRfTURNQV9TMF9DT05GSUcoKSkKKwkJd2hpbGUgKCEoYmZpbl9yZWFkX01ETUFfRDBfSVJRX1NUQVRVUygpICYgRE1BX0RPTkUpKQorCQkJY29udGludWU7CiAKLQlpZiAoKHVuc2lnbmVkIGxvbmcpc3JjIDwgbWVtb3J5X2VuZCkKLQkJYmxhY2tmaW5fZGNhY2hlX2ZsdXNoX3JhbmdlKCh1bnNpZ25lZCBpbnQpc3JjLAotCQkJCQkgICAgKHVuc2lnbmVkIGludCkoc3JjICsgc2l6ZSkpOworCWlmIChjb25mICYgRE1BMkQpIHsKKwkJLyogRm9yIGxhcmdlciBiaXQgc2l6ZXMsIHdlJ3ZlIGFscmVhZHkgZGl2aWRlZCBkb3duIGNudCBzbyBpdAorCQkgKiBpcyBubyBsb25nZXIgYSBtdWx0aXBsZSBvZiA2NGsuICBTbyB3ZSBoYXZlIHRvIGJyZWFrIGRvd24KKwkJICogdGhlIGxpbWl0IGhlcmUgc28gaXQgaXMgYSBtdWx0aXBsZSBvZiB0aGUgaW5jb21pbmcgc2l6ZS4KKwkJICogVGhlcmUgaXMgbm8gbGltaXRhdGlvbiBoZXJlIGluIHRlcm1zIG9mIHRvdGFsIHNpemUgb3RoZXIKKwkJICogdGhhbiB0aGUgaGFyZHdhcmUgdGhvdWdoIGFzIHRoZSBiaXRzIGxvc3QgaW4gdGhlIHNoaWZ0IGFyZQorCQkgKiBtYWRlIHVwIGJ5IE1PRElGWSAoPT0gd2UgY2FuIGhpdCB0aGUgd2hvbGUgYWRkcmVzcyBzcGFjZSkuCisJCSAqIFg6ICgyXigxNiAtIDApKSAqIDEgPT0gKDJeKDE2IC0gMSkpICogMiA9PSAoMl4oMTYgLSAyKSkgKiA0CisJCSAqLworCQl1MzIgc2hpZnQgPSBhYnMoZG1vZCkgPj4gMTsKKwkJc2l6ZV90IHljbnQgPSBjbnQgPj4gKDE2IC0gc2hpZnQpOworCQljbnQgPSAxIDw8ICgxNiAtIHNoaWZ0KTsKKwkJYmZpbl93cml0ZV9NRE1BX0QwX1lfQ09VTlQoeWNudCk7CisJCWJmaW5fd3JpdGVfTURNQV9TMF9ZX0NPVU5UKHljbnQpOworCQliZmluX3dyaXRlX01ETUFfRDBfWV9NT0RJRlkoZG1vZCk7CisJCWJmaW5fd3JpdGVfTURNQV9TMF9ZX01PRElGWShzbW9kKTsKKwl9CiAKLQlpZiAoKHVuc2lnbmVkIGxvbmcpZGVzdCA8IG1lbW9yeV9lbmQpCi0JCWJsYWNrZmluX2RjYWNoZV9pbnZhbGlkYXRlX3JhbmdlKCh1bnNpZ25lZCBpbnQpZGVzdCwKLQkJCQkJCSAodW5zaWduZWQgaW50KShkZXN0ICsgc2l6ZSkpOwotCisJYmZpbl93cml0ZV9NRE1BX0QwX1NUQVJUX0FERFIoZGFkZHIpOworCWJmaW5fd3JpdGVfTURNQV9EMF9YX0NPVU5UKGNudCk7CisJYmZpbl93cml0ZV9NRE1BX0QwX1hfTU9ESUZZKGRtb2QpOwogCWJmaW5fd3JpdGVfTURNQV9EMF9JUlFfU1RBVFVTKERNQV9ET05FIHwgRE1BX0VSUik7CiAKLQlpZiAoKHVuc2lnbmVkIGxvbmcpc3JjIDwgKHVuc2lnbmVkIGxvbmcpZGVzdCkKLQkJZGlyZWN0aW9uID0gMTsKLQllbHNlCi0JCWRpcmVjdGlvbiA9IDA7CisJYmZpbl93cml0ZV9NRE1BX1MwX1NUQVJUX0FERFIoc2FkZHIpOworCWJmaW5fd3JpdGVfTURNQV9TMF9YX0NPVU5UKGNudCk7CisJYmZpbl93cml0ZV9NRE1BX1MwX1hfTU9ESUZZKHNtb2QpOworCWJmaW5fd3JpdGVfTURNQV9TMF9JUlFfU1RBVFVTKERNQV9ET05FIHwgRE1BX0VSUik7CiAKLQlpZiAoKCgodW5zaWduZWQgbG9uZylkZXN0ICUgMikgPT0gMCkgJiYgKCgodW5zaWduZWQgbG9uZylzcmMgJSAyKSA9PSAwKQotCSAgICAmJiAoKHNpemUgJSAyKSA9PSAwKSkKLQkJZmxhZ19hbGlnbiA9IDE7Ci0JZWxzZQotCQlmbGFnX2FsaWduID0gMDsKKwliZmluX3dyaXRlX01ETUFfUzBfQ09ORklHKERNQUVOIHwgY29uZik7CisJYmZpbl93cml0ZV9NRE1BX0QwX0NPTkZJRyhXTlIgfCBESV9FTiB8IERNQUVOIHwgY29uZik7CiAKLQlpZiAoc2l6ZSA+IDB4MTAwMDApCS8qIHNpemUgPiA2NEsgKi8KLQkJZmxhZ18yRCA9IDE7Ci0JZWxzZQotCQlmbGFnXzJEID0gMDsKLQotCS8qIFNldHVwIGRlc3RpbmF0aW9uIGFuZCBzb3VyY2Ugc3RhcnQgYWRkcmVzcyAqLwotCWlmIChkaXJlY3Rpb24pIHsKLQkJaWYgKGZsYWdfYWxpZ24pIHsKLQkJCWJmaW5fd3JpdGVfTURNQV9EMF9TVEFSVF9BRERSKGRlc3QgKyBzaXplIC0gMik7Ci0JCQliZmluX3dyaXRlX01ETUFfUzBfU1RBUlRfQUREUihzcmMgKyBzaXplIC0gMik7Ci0JCX0gZWxzZSB7Ci0JCQliZmluX3dyaXRlX01ETUFfRDBfU1RBUlRfQUREUihkZXN0ICsgc2l6ZSAtIDEpOwotCQkJYmZpbl93cml0ZV9NRE1BX1MwX1NUQVJUX0FERFIoc3JjICsgc2l6ZSAtIDEpOwotCQl9Ci0JfSBlbHNlIHsKLQkJYmZpbl93cml0ZV9NRE1BX0QwX1NUQVJUX0FERFIoZGVzdCk7Ci0JCWJmaW5fd3JpdGVfTURNQV9TMF9TVEFSVF9BRERSKHNyYyk7Ci0JfQotCi0JLyogU2V0dXAgZGVzdGluYXRpb24gYW5kIHNvdXJjZSB4Y291bnQgKi8KLQlpZiAoZmxhZ18yRCkgewotCQlpZiAoZmxhZ19hbGlnbikgewotCQkJYmZpbl93cml0ZV9NRE1BX0QwX1hfQ09VTlQoMTAyNCAvIDIpOwotCQkJYmZpbl93cml0ZV9NRE1BX1MwX1hfQ09VTlQoMTAyNCAvIDIpOwotCQl9IGVsc2UgewotCQkJYmZpbl93cml0ZV9NRE1BX0QwX1hfQ09VTlQoMTAyNCk7Ci0JCQliZmluX3dyaXRlX01ETUFfUzBfWF9DT1VOVCgxMDI0KTsKLQkJfQotCQliZmluX3dyaXRlX01ETUFfRDBfWV9DT1VOVChzaXplID4+IDEwKTsKLQkJYmZpbl93cml0ZV9NRE1BX1MwX1lfQ09VTlQoc2l6ZSA+PiAxMCk7Ci0JfSBlbHNlIHsKLQkJaWYgKGZsYWdfYWxpZ24pIHsKLQkJCWJmaW5fd3JpdGVfTURNQV9EMF9YX0NPVU5UKHNpemUgLyAyKTsKLQkJCWJmaW5fd3JpdGVfTURNQV9TMF9YX0NPVU5UKHNpemUgLyAyKTsKLQkJfSBlbHNlIHsKLQkJCWJmaW5fd3JpdGVfTURNQV9EMF9YX0NPVU5UKHNpemUpOwotCQkJYmZpbl93cml0ZV9NRE1BX1MwX1hfQ09VTlQoc2l6ZSk7Ci0JCX0KLQl9Ci0KLQkvKiBTZXR1cCBkZXN0aW5hdGlvbiBhbmQgc291cmNlIHhtb2RpZnkgYW5kIHltb2RpZnkgKi8KLQlpZiAoZGlyZWN0aW9uKSB7Ci0JCWlmIChmbGFnX2FsaWduKSB7Ci0JCQliZmluX3dyaXRlX01ETUFfRDBfWF9NT0RJRlkoLTIpOwotCQkJYmZpbl93cml0ZV9NRE1BX1MwX1hfTU9ESUZZKC0yKTsKLQkJCWlmIChmbGFnXzJEKSB7Ci0JCQkJYmZpbl93cml0ZV9NRE1BX0QwX1lfTU9ESUZZKC0yKTsKLQkJCQliZmluX3dyaXRlX01ETUFfUzBfWV9NT0RJRlkoLTIpOwotCQkJfQotCQl9IGVsc2UgewotCQkJYmZpbl93cml0ZV9NRE1BX0QwX1hfTU9ESUZZKC0xKTsKLQkJCWJmaW5fd3JpdGVfTURNQV9TMF9YX01PRElGWSgtMSk7Ci0JCQlpZiAoZmxhZ18yRCkgewotCQkJCWJmaW5fd3JpdGVfTURNQV9EMF9ZX01PRElGWSgtMSk7Ci0JCQkJYmZpbl93cml0ZV9NRE1BX1MwX1lfTU9ESUZZKC0xKTsKLQkJCX0KLQkJfQotCX0gZWxzZSB7Ci0JCWlmIChmbGFnX2FsaWduKSB7Ci0JCQliZmluX3dyaXRlX01ETUFfRDBfWF9NT0RJRlkoMik7Ci0JCQliZmluX3dyaXRlX01ETUFfUzBfWF9NT0RJRlkoMik7Ci0JCQlpZiAoZmxhZ18yRCkgewotCQkJCWJmaW5fd3JpdGVfTURNQV9EMF9ZX01PRElGWSgyKTsKLQkJCQliZmluX3dyaXRlX01ETUFfUzBfWV9NT0RJRlkoMik7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQliZmluX3dyaXRlX01ETUFfRDBfWF9NT0RJRlkoMSk7Ci0JCQliZmluX3dyaXRlX01ETUFfUzBfWF9NT0RJRlkoMSk7Ci0JCQlpZiAoZmxhZ18yRCkgewotCQkJCWJmaW5fd3JpdGVfTURNQV9EMF9ZX01PRElGWSgxKTsKLQkJCQliZmluX3dyaXRlX01ETUFfUzBfWV9NT0RJRlkoMSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKiBFbmFibGUgc291cmNlIERNQSAqLwotCWlmIChmbGFnXzJEKSB7Ci0JCWlmIChmbGFnX2FsaWduKSB7Ci0JCQliZmluX3dyaXRlX01ETUFfUzBfQ09ORklHKERNQUVOIHwgRE1BMkQgfCBXRFNJWkVfMTYpOwotCQkJYmZpbl93cml0ZV9NRE1BX0QwX0NPTkZJRyhXTlIgfCBESV9FTiB8IERNQUVOIHwgRE1BMkQgfCBXRFNJWkVfMTYpOwotCQl9IGVsc2UgewotCQkJYmZpbl93cml0ZV9NRE1BX1MwX0NPTkZJRyhETUFFTiB8IERNQTJEKTsKLQkJCWJmaW5fd3JpdGVfTURNQV9EMF9DT05GSUcoV05SIHwgRElfRU4gfCBETUFFTiB8IERNQTJEKTsKLQkJfQotCX0gZWxzZSB7Ci0JCWlmIChmbGFnX2FsaWduKSB7Ci0JCQliZmluX3dyaXRlX01ETUFfUzBfQ09ORklHKERNQUVOIHwgV0RTSVpFXzE2KTsKLQkJCWJmaW5fd3JpdGVfTURNQV9EMF9DT05GSUcoV05SIHwgRElfRU4gfCBETUFFTiB8IFdEU0laRV8xNik7Ci0JCX0gZWxzZSB7Ci0JCQliZmluX3dyaXRlX01ETUFfUzBfQ09ORklHKERNQUVOKTsKLQkJCWJmaW5fd3JpdGVfTURNQV9EMF9DT05GSUcoV05SIHwgRElfRU4gfCBETUFFTik7Ci0JCX0KLQl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWRtYV9sb2NrLCBmbGFncyk7CiAKIAlTU1lOQygpOwogCiAJd2hpbGUgKCEoYmZpbl9yZWFkX01ETUFfRDBfSVJRX1NUQVRVUygpICYgRE1BX0RPTkUpKQotCQk7CisJCWlmIChiZmluX3JlYWRfTURNQV9TMF9DT05GSUcoKSkKKwkJCWNvbnRpbnVlOworCQllbHNlCisJCQlyZXR1cm47CiAKLQliZmluX3dyaXRlX01ETUFfRDBfSVJRX1NUQVRVUyhiZmluX3JlYWRfTURNQV9EMF9JUlFfU1RBVFVTKCkgfAotCQkJCSAgICAgIChETUFfRE9ORSB8IERNQV9FUlIpKTsKKwliZmluX3dyaXRlX01ETUFfRDBfSVJRX1NUQVRVUyhETUFfRE9ORSB8IERNQV9FUlIpOwogCiAJYmZpbl93cml0ZV9NRE1BX1MwX0NPTkZJRygwKTsKIAliZmluX3dyaXRlX01ETUFfRDBfQ09ORklHKDApOwotCi0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotCi0JcmV0dXJuIGRlc3Q7CiB9CiAKLXZvaWQgKmRtYV9tZW1jcHkodm9pZCAqZGVzdCwgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3Qgc2l6ZSkKKy8qKgorICoJX2RtYV9tZW1jcHkgLSB0cmFuc2xhdGUgQyBtZW1jcHkgc2V0dGluZ3MgaW50byBNRE1BIHNldHRpbmdzCisgKgorICogSGFuZGxlIGFsbCB0aGUgaGlnaCBsZXZlbCBzdGVwcyBiZWZvcmUgd2UgdG91Y2ggdGhlIE1ETUEgcmVnaXN0ZXJzLiAgU28KKyAqIGhhbmRsZSBkaXJlY3Rpb24sIHR3ZWFraW5nIG9mIHNpemVzLCBhbmQgZm9ybWF0dGluZyBvZiBhZGRyZXNzZXMuCisgKi8KK3N0YXRpYyB2b2lkICpfZG1hX21lbWNweSh2b2lkICpwZHN0LCBjb25zdCB2b2lkICpwc3JjLCBzaXplX3Qgc2l6ZSkKIHsKLQlzaXplX3QgYnVsazsKLQlzaXplX3QgcmVzdDsKLQl2b2lkICogYWRkcjsKKwl1MzIgY29uZiwgc2hpZnQ7CisJczE2IG1vZDsKKwl1bnNpZ25lZCBsb25nIGRzdCA9ICh1bnNpZ25lZCBsb25nKXBkc3Q7CisJdW5zaWduZWQgbG9uZyBzcmMgPSAodW5zaWduZWQgbG9uZylwc3JjOwogCi0JYnVsayA9IChzaXplID4+IDE2KSA8PCAxNjsKKwlpZiAoc2l6ZSA9PSAwKQorCQlyZXR1cm4gTlVMTDsKKworCWlmIChkc3QgJSA0ID09IDAgJiYgc3JjICUgNCA9PSAwICYmIHNpemUgJSA0ID09IDApIHsKKwkJY29uZiA9IFdEU0laRV8zMjsKKwkJc2hpZnQgPSAyOworCX0gZWxzZSBpZiAoZHN0ICUgMiA9PSAwICYmIHNyYyAlIDIgPT0gMCAmJiBzaXplICUgMiA9PSAwKSB7CisJCWNvbmYgPSBXRFNJWkVfMTY7CisJCXNoaWZ0ID0gMTsKKwl9IGVsc2UgeworCQljb25mID0gV0RTSVpFXzg7CisJCXNoaWZ0ID0gMDsKKwl9CisKKwkvKiBJZiB0aGUgdHdvIG1lbW9yeSByZWdpb25zIGhhdmUgYSBjaGFuY2Ugb2Ygb3ZlcmxhcHBpbmcsIG1ha2UKKwkgKiBzdXJlIHRoZSBtZW1jcHkgc3RpbGwgd29ya3MgYXMgZXhwZWN0ZWQuICBEbyB0aGlzIGJ5IGhhdmluZyB0aGUKKwkgKiBjb3B5IHJ1biBiYWNrd2FyZHMgaW5zdGVhZC4KKwkgKi8KKwltb2QgPSAxIDw8IHNoaWZ0OworCWlmIChzcmMgPCBkc3QpIHsKKwkJbW9kICo9IC0xOworCQlkc3QgKz0gc2l6ZSArIG1vZDsKKwkJc3JjICs9IHNpemUgKyBtb2Q7CisJfQorCXNpemUgPj49IHNoaWZ0OworCisJaWYgKHNpemUgPiAweDEwMDAwKQorCQljb25mIHw9IERNQTJEOworCisJX19kbWFfbWVtY3B5KGRzdCwgbW9kLCBzcmMsIG1vZCwgc2l6ZSwgY29uZik7CisKKwlyZXR1cm4gcGRzdDsKK30KKworLyoqCisgKglkbWFfbWVtY3B5IC0gRE1BIG1lbWNweSB1bmRlciBtdXRleCBsb2NrCisgKgorICogRG8gbm90IGNoZWNrIGFyZ3VtZW50cyBiZWZvcmUgc3RhcnRpbmcgdGhlIERNQSBtZW1jcHkuICBCcmVhayB0aGUgdHJhbnNmZXIKKyAqIHVwIGludG8gdHdvIHBpZWNlcy4gIFRoZSBmaXJzdCB0cmFuc2ZlciBpcyBpbiBtdWx0aXBsZXMgb2YgNjRrIGFuZCB0aGUKKyAqIHNlY29uZCB0cmFuc2ZlciBpcyB0aGUgcGllY2Ugc21hbGxlciB0aGFuIDY0ay4KKyAqLwordm9pZCAqZG1hX21lbWNweSh2b2lkICpwZHN0LCBjb25zdCB2b2lkICpwc3JjLCBzaXplX3Qgc2l6ZSkKK3sKKwl1bnNpZ25lZCBsb25nIGRzdCA9ICh1bnNpZ25lZCBsb25nKXBkc3Q7CisJdW5zaWduZWQgbG9uZyBzcmMgPSAodW5zaWduZWQgbG9uZylwc3JjOworCXNpemVfdCBidWxrLCByZXN0OworCisJaWYgKGJmaW5fYWRkcl9kY2FjaGFibGUoc3JjKSkKKwkJYmxhY2tmaW5fZGNhY2hlX2ZsdXNoX3JhbmdlKHNyYywgc3JjICsgc2l6ZSk7CisKKwlpZiAoYmZpbl9hZGRyX2RjYWNoYWJsZShkc3QpKQorCQlibGFja2Zpbl9kY2FjaGVfaW52YWxpZGF0ZV9yYW5nZShkc3QsIGRzdCArIHNpemUpOworCisJYnVsayA9IHNpemUgJiB+MHhmZmZmOwogCXJlc3QgPSBzaXplIC0gYnVsazsKIAlpZiAoYnVsaykKLQkJX19kbWFfbWVtY3B5KGRlc3QsIHNyYywgYnVsayk7Ci0JYWRkciA9IF9fZG1hX21lbWNweShkZXN0K2J1bGssIHNyYytidWxrLCByZXN0KTsKLQlyZXR1cm4gYWRkcjsKKwkJX2RtYV9tZW1jcHkocGRzdCwgcHNyYywgYnVsayk7CisJX2RtYV9tZW1jcHkocGRzdCArIGJ1bGssIHBzcmMgKyBidWxrLCByZXN0KTsKKwlyZXR1cm4gcGRzdDsKIH0KIEVYUE9SVF9TWU1CT0woZG1hX21lbWNweSk7CiAKLXZvaWQgKnNhZmVfZG1hX21lbWNweSh2b2lkICpkZXN0LCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBzaXplKQorLyoqCisgKglzYWZlX2RtYV9tZW1jcHkgLSBETUEgbWVtY3B5IHcvYXJndW1lbnQgY2hlY2tpbmcKKyAqCisgKiBWZXJpZnkgYXJndW1lbnRzIGFyZSBzYWZlIGJlZm9yZSBoZWFkaW5nIHRvIGRtYV9tZW1jcHkoKS4KKyAqLwordm9pZCAqc2FmZV9kbWFfbWVtY3B5KHZvaWQgKmRzdCwgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3Qgc2l6ZSkKIHsKLQl2b2lkICphZGRyOwotCWFkZHIgPSBkbWFfbWVtY3B5KGRlc3QsIHNyYywgc2l6ZSk7Ci0JcmV0dXJuIGFkZHI7CisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBkc3QsIHNpemUpKQorCQlyZXR1cm4gTlVMTDsKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgc3JjLCBzaXplKSkKKwkJcmV0dXJuIE5VTEw7CisJcmV0dXJuIGRtYV9tZW1jcHkoZHN0LCBzcmMsIHNpemUpOwogfQogRVhQT1JUX1NZTUJPTChzYWZlX2RtYV9tZW1jcHkpOwogCi12b2lkIGRtYV9vdXRzYih1bnNpZ25lZCBsb25nIGFkZHIsIGNvbnN0IHZvaWQgKmJ1ZiwgdW5zaWduZWQgc2hvcnQgbGVuKQorc3RhdGljIHZvaWQgX2RtYV9vdXQodW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGJ1ZiwgdW5zaWduZWQgc2hvcnQgbGVuLAorICAgICAgICAgICAgICAgICAgICAgdTE2IHNpemUsIHUxNiBkbWFfc2l6ZSkKIHsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCi0JYmxhY2tmaW5fZGNhY2hlX2ZsdXNoX3JhbmdlKCh1bnNpZ25lZCBpbnQpYnVmLAotCQkJICh1bnNpZ25lZCBpbnQpKGJ1ZikgKyBsZW4pOwotCi0JYmZpbl93cml0ZV9NRE1BX0QwX1NUQVJUX0FERFIoYWRkcik7Ci0JYmZpbl93cml0ZV9NRE1BX0QwX1hfQ09VTlQobGVuKTsKLQliZmluX3dyaXRlX01ETUFfRDBfWF9NT0RJRlkoMCk7Ci0JYmZpbl93cml0ZV9NRE1BX0QwX0lSUV9TVEFUVVMoRE1BX0RPTkUgfCBETUFfRVJSKTsKLQotCWJmaW5fd3JpdGVfTURNQV9TMF9TVEFSVF9BRERSKGJ1Zik7Ci0JYmZpbl93cml0ZV9NRE1BX1MwX1hfQ09VTlQobGVuKTsKLQliZmluX3dyaXRlX01ETUFfUzBfWF9NT0RJRlkoMSk7Ci0JYmZpbl93cml0ZV9NRE1BX1MwX0lSUV9TVEFUVVMoRE1BX0RPTkUgfCBETUFfRVJSKTsKLQotCWJmaW5fd3JpdGVfTURNQV9TMF9DT05GSUcoRE1BRU4gfCBXRFNJWkVfOCk7Ci0JYmZpbl93cml0ZV9NRE1BX0QwX0NPTkZJRyhXTlIgfCBESV9FTiB8IERNQUVOIHwgV0RTSVpFXzgpOwotCi0JU1NZTkMoKTsKLQotCXdoaWxlICghKGJmaW5fcmVhZF9NRE1BX0QwX0lSUV9TVEFUVVMoKSAmIERNQV9ET05FKSk7Ci0KLQliZmluX3dyaXRlX01ETUFfRDBfSVJRX1NUQVRVUyhETUFfRE9ORSB8IERNQV9FUlIpOwotCi0JYmZpbl93cml0ZV9NRE1BX1MwX0NPTkZJRygwKTsKLQliZmluX3dyaXRlX01ETUFfRDBfQ09ORklHKDApOwotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLQorCWJsYWNrZmluX2RjYWNoZV9mbHVzaF9yYW5nZShidWYsIGJ1ZiArIGxlbiAqIHNpemUpOworCV9fZG1hX21lbWNweShhZGRyLCAwLCBidWYsIHNpemUsIGxlbiwgZG1hX3NpemUpOwogfQotRVhQT1JUX1NZTUJPTChkbWFfb3V0c2IpOwogCi0KLXZvaWQgZG1hX2luc2IodW5zaWduZWQgbG9uZyBhZGRyLCB2b2lkICpidWYsIHVuc2lnbmVkIHNob3J0IGxlbikKK3N0YXRpYyB2b2lkIF9kbWFfaW4odW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGJ1ZiwgdW5zaWduZWQgc2hvcnQgbGVuLAorICAgICAgICAgICAgICAgICAgICB1MTYgc2l6ZSwgdTE2IGRtYV9zaXplKQogewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlibGFja2Zpbl9kY2FjaGVfaW52YWxpZGF0ZV9yYW5nZSgodW5zaWduZWQgaW50KWJ1ZiwKLQkJCSAodW5zaWduZWQgaW50KShidWYpICsgbGVuKTsKLQotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQliZmluX3dyaXRlX01ETUFfRDBfU1RBUlRfQUREUihidWYpOwotCWJmaW5fd3JpdGVfTURNQV9EMF9YX0NPVU5UKGxlbik7Ci0JYmZpbl93cml0ZV9NRE1BX0QwX1hfTU9ESUZZKDEpOwotCWJmaW5fd3JpdGVfTURNQV9EMF9JUlFfU1RBVFVTKERNQV9ET05FIHwgRE1BX0VSUik7Ci0KLQliZmluX3dyaXRlX01ETUFfUzBfU1RBUlRfQUREUihhZGRyKTsKLQliZmluX3dyaXRlX01ETUFfUzBfWF9DT1VOVChsZW4pOwotCWJmaW5fd3JpdGVfTURNQV9TMF9YX01PRElGWSgwKTsKLQliZmluX3dyaXRlX01ETUFfUzBfSVJRX1NUQVRVUyhETUFfRE9ORSB8IERNQV9FUlIpOwotCi0JYmZpbl93cml0ZV9NRE1BX1MwX0NPTkZJRyhETUFFTiB8IFdEU0laRV84KTsKLQliZmluX3dyaXRlX01ETUFfRDBfQ09ORklHKFdOUiB8IERJX0VOIHwgRE1BRU4gfCBXRFNJWkVfOCk7Ci0KLQlTU1lOQygpOwotCi0Jd2hpbGUgKCEoYmZpbl9yZWFkX01ETUFfRDBfSVJRX1NUQVRVUygpICYgRE1BX0RPTkUpKTsKLQotCWJmaW5fd3JpdGVfTURNQV9EMF9JUlFfU1RBVFVTKERNQV9ET05FIHwgRE1BX0VSUik7Ci0KLQliZmluX3dyaXRlX01ETUFfUzBfQ09ORklHKDApOwotCWJmaW5fd3JpdGVfTURNQV9EMF9DT05GSUcoMCk7Ci0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotCisJYmxhY2tmaW5fZGNhY2hlX2ludmFsaWRhdGVfcmFuZ2UoYnVmLCBidWYgKyBsZW4gKiBzaXplKTsKKwlfX2RtYV9tZW1jcHkoYnVmLCBzaXplLCBhZGRyLCAwLCBsZW4sIGRtYV9zaXplKTsKIH0KLUVYUE9SVF9TWU1CT0woZG1hX2luc2IpOwogCi12b2lkIGRtYV9vdXRzdyh1bnNpZ25lZCBsb25nIGFkZHIsIGNvbnN0IHZvaWQgICpidWYsIHVuc2lnbmVkIHNob3J0IGxlbikKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCi0JYmxhY2tmaW5fZGNhY2hlX2ZsdXNoX3JhbmdlKCh1bnNpZ25lZCBpbnQpYnVmLAotCQkJICh1bnNpZ25lZCBpbnQpKGJ1ZikgKyBsZW4gKiBzaXplb2Yoc2hvcnQpKTsKLQotCWJmaW5fd3JpdGVfTURNQV9EMF9TVEFSVF9BRERSKGFkZHIpOwotCWJmaW5fd3JpdGVfTURNQV9EMF9YX0NPVU5UKGxlbik7Ci0JYmZpbl93cml0ZV9NRE1BX0QwX1hfTU9ESUZZKDApOwotCWJmaW5fd3JpdGVfTURNQV9EMF9JUlFfU1RBVFVTKERNQV9ET05FIHwgRE1BX0VSUik7Ci0KLQliZmluX3dyaXRlX01ETUFfUzBfU1RBUlRfQUREUihidWYpOwotCWJmaW5fd3JpdGVfTURNQV9TMF9YX0NPVU5UKGxlbik7Ci0JYmZpbl93cml0ZV9NRE1BX1MwX1hfTU9ESUZZKDIpOwotCWJmaW5fd3JpdGVfTURNQV9TMF9JUlFfU1RBVFVTKERNQV9ET05FIHwgRE1BX0VSUik7Ci0KLQliZmluX3dyaXRlX01ETUFfUzBfQ09ORklHKERNQUVOIHwgV0RTSVpFXzE2KTsKLQliZmluX3dyaXRlX01ETUFfRDBfQ09ORklHKFdOUiB8IERJX0VOIHwgRE1BRU4gfCBXRFNJWkVfMTYpOwotCi0JU1NZTkMoKTsKLQotCXdoaWxlICghKGJmaW5fcmVhZF9NRE1BX0QwX0lSUV9TVEFUVVMoKSAmIERNQV9ET05FKSk7Ci0KLQliZmluX3dyaXRlX01ETUFfRDBfSVJRX1NUQVRVUyhETUFfRE9ORSB8IERNQV9FUlIpOwotCi0JYmZpbl93cml0ZV9NRE1BX1MwX0NPTkZJRygwKTsKLQliZmluX3dyaXRlX01ETUFfRDBfQ09ORklHKDApOwotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLQotfQotRVhQT1JUX1NZTUJPTChkbWFfb3V0c3cpOwotCi12b2lkIGRtYV9pbnN3KHVuc2lnbmVkIGxvbmcgYWRkciwgdm9pZCAqYnVmLCB1bnNpZ25lZCBzaG9ydCBsZW4pCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWJsYWNrZmluX2RjYWNoZV9pbnZhbGlkYXRlX3JhbmdlKCh1bnNpZ25lZCBpbnQpYnVmLAotCQkJICh1bnNpZ25lZCBpbnQpKGJ1ZikgKyBsZW4gKiBzaXplb2Yoc2hvcnQpKTsKLQotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQotCWJmaW5fd3JpdGVfTURNQV9EMF9TVEFSVF9BRERSKGJ1Zik7Ci0JYmZpbl93cml0ZV9NRE1BX0QwX1hfQ09VTlQobGVuKTsKLQliZmluX3dyaXRlX01ETUFfRDBfWF9NT0RJRlkoMik7Ci0JYmZpbl93cml0ZV9NRE1BX0QwX0lSUV9TVEFUVVMoRE1BX0RPTkUgfCBETUFfRVJSKTsKLQotCWJmaW5fd3JpdGVfTURNQV9TMF9TVEFSVF9BRERSKGFkZHIpOwotCWJmaW5fd3JpdGVfTURNQV9TMF9YX0NPVU5UKGxlbik7Ci0JYmZpbl93cml0ZV9NRE1BX1MwX1hfTU9ESUZZKDApOwotCWJmaW5fd3JpdGVfTURNQV9TMF9JUlFfU1RBVFVTKERNQV9ET05FIHwgRE1BX0VSUik7Ci0KLQliZmluX3dyaXRlX01ETUFfUzBfQ09ORklHKERNQUVOIHwgV0RTSVpFXzE2KTsKLQliZmluX3dyaXRlX01ETUFfRDBfQ09ORklHKFdOUiB8IERJX0VOIHwgRE1BRU4gfCBXRFNJWkVfMTYpOwotCi0JU1NZTkMoKTsKLQotCXdoaWxlICghKGJmaW5fcmVhZF9NRE1BX0QwX0lSUV9TVEFUVVMoKSAmIERNQV9ET05FKSk7Ci0KLQliZmluX3dyaXRlX01ETUFfRDBfSVJRX1NUQVRVUyhETUFfRE9ORSB8IERNQV9FUlIpOwotCi0JYmZpbl93cml0ZV9NRE1BX1MwX0NPTkZJRygwKTsKLQliZmluX3dyaXRlX01ETUFfRDBfQ09ORklHKDApOwotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLQotfQotRVhQT1JUX1NZTUJPTChkbWFfaW5zdyk7Ci0KLXZvaWQgZG1hX291dHNsKHVuc2lnbmVkIGxvbmcgYWRkciwgY29uc3Qgdm9pZCAqYnVmLCB1bnNpZ25lZCBzaG9ydCBsZW4pCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQotCWJsYWNrZmluX2RjYWNoZV9mbHVzaF9yYW5nZSgodW5zaWduZWQgaW50KWJ1ZiwKLQkJCSAodW5zaWduZWQgaW50KShidWYpICsgbGVuICogc2l6ZW9mKGxvbmcpKTsKLQotCWJmaW5fd3JpdGVfTURNQV9EMF9TVEFSVF9BRERSKGFkZHIpOwotCWJmaW5fd3JpdGVfTURNQV9EMF9YX0NPVU5UKGxlbik7Ci0JYmZpbl93cml0ZV9NRE1BX0QwX1hfTU9ESUZZKDApOwotCWJmaW5fd3JpdGVfTURNQV9EMF9JUlFfU1RBVFVTKERNQV9ET05FIHwgRE1BX0VSUik7Ci0KLQliZmluX3dyaXRlX01ETUFfUzBfU1RBUlRfQUREUihidWYpOwotCWJmaW5fd3JpdGVfTURNQV9TMF9YX0NPVU5UKGxlbik7Ci0JYmZpbl93cml0ZV9NRE1BX1MwX1hfTU9ESUZZKDQpOwotCWJmaW5fd3JpdGVfTURNQV9TMF9JUlFfU1RBVFVTKERNQV9ET05FIHwgRE1BX0VSUik7Ci0KLQliZmluX3dyaXRlX01ETUFfUzBfQ09ORklHKERNQUVOIHwgV0RTSVpFXzMyKTsKLQliZmluX3dyaXRlX01ETUFfRDBfQ09ORklHKFdOUiB8IERJX0VOIHwgRE1BRU4gfCBXRFNJWkVfMzIpOwotCi0JU1NZTkMoKTsKLQotCXdoaWxlICghKGJmaW5fcmVhZF9NRE1BX0QwX0lSUV9TVEFUVVMoKSAmIERNQV9ET05FKSk7Ci0KLQliZmluX3dyaXRlX01ETUFfRDBfSVJRX1NUQVRVUyhETUFfRE9ORSB8IERNQV9FUlIpOwotCi0JYmZpbl93cml0ZV9NRE1BX1MwX0NPTkZJRygwKTsKLQliZmluX3dyaXRlX01ETUFfRDBfQ09ORklHKDApOwotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLQotfQotRVhQT1JUX1NZTUJPTChkbWFfb3V0c2wpOwotCi12b2lkIGRtYV9pbnNsKHVuc2lnbmVkIGxvbmcgYWRkciwgdm9pZCAqYnVmLCB1bnNpZ25lZCBzaG9ydCBsZW4pCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWJsYWNrZmluX2RjYWNoZV9pbnZhbGlkYXRlX3JhbmdlKCh1bnNpZ25lZCBpbnQpYnVmLAotCQkJICh1bnNpZ25lZCBpbnQpKGJ1ZikgKyBsZW4gKiBzaXplb2YobG9uZykpOwotCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCi0JYmZpbl93cml0ZV9NRE1BX0QwX1NUQVJUX0FERFIoYnVmKTsKLQliZmluX3dyaXRlX01ETUFfRDBfWF9DT1VOVChsZW4pOwotCWJmaW5fd3JpdGVfTURNQV9EMF9YX01PRElGWSg0KTsKLQliZmluX3dyaXRlX01ETUFfRDBfSVJRX1NUQVRVUyhETUFfRE9ORSB8IERNQV9FUlIpOwotCi0JYmZpbl93cml0ZV9NRE1BX1MwX1NUQVJUX0FERFIoYWRkcik7Ci0JYmZpbl93cml0ZV9NRE1BX1MwX1hfQ09VTlQobGVuKTsKLQliZmluX3dyaXRlX01ETUFfUzBfWF9NT0RJRlkoMCk7Ci0JYmZpbl93cml0ZV9NRE1BX1MwX0lSUV9TVEFUVVMoRE1BX0RPTkUgfCBETUFfRVJSKTsKLQotCWJmaW5fd3JpdGVfTURNQV9TMF9DT05GSUcoRE1BRU4gfCBXRFNJWkVfMzIpOwotCWJmaW5fd3JpdGVfTURNQV9EMF9DT05GSUcoV05SIHwgRElfRU4gfCBETUFFTiB8IFdEU0laRV8zMik7Ci0KLQlTU1lOQygpOwotCi0Jd2hpbGUgKCEoYmZpbl9yZWFkX01ETUFfRDBfSVJRX1NUQVRVUygpICYgRE1BX0RPTkUpKTsKLQotCWJmaW5fd3JpdGVfTURNQV9EMF9JUlFfU1RBVFVTKERNQV9ET05FIHwgRE1BX0VSUik7Ci0KLQliZmluX3dyaXRlX01ETUFfUzBfQ09ORklHKDApOwotCWJmaW5fd3JpdGVfTURNQV9EMF9DT05GSUcoMCk7Ci0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotCi19Ci1FWFBPUlRfU1lNQk9MKGRtYV9pbnNsKTsKKyNkZWZpbmUgTUFLRV9ETUFfSU8oaW8sIGJ3bCwgaXNpemUsIGRtYXNpemUsIGNuc3QpIFwKK3ZvaWQgZG1hXyMjaW8jI3MjI2J3bCh1bnNpZ25lZCBsb25nIGFkZHIsIGNuc3Qgdm9pZCAqYnVmLCB1bnNpZ25lZCBzaG9ydCBsZW4pIFwKK3sgXAorCV9kbWFfIyNpbyhhZGRyLCAodW5zaWduZWQgbG9uZylidWYsIGxlbiwgaXNpemUsIFdEU0laRV8jI2RtYXNpemUpOyBcCit9IFwKK0VYUE9SVF9TWU1CT0woZG1hXyMjaW8jI3MjI2J3bCkKK01BS0VfRE1BX0lPKG91dCwgYiwgMSwgIDgsIGNvbnN0KTsKK01BS0VfRE1BX0lPKGluLCAgYiwgMSwgIDgsICk7CitNQUtFX0RNQV9JTyhvdXQsIHcsIDIsIDE2LCBjb25zdCk7CitNQUtFX0RNQV9JTyhpbiwgIHcsIDIsIDE2LCApOworTUFLRV9ETUFfSU8ob3V0LCBsLCA0LCAzMiwgY29uc3QpOworTUFLRV9ETUFfSU8oaW4sICBsLCA0LCAzMiwgKTsKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4va2VybmVsL2JmaW5fZ3Bpby5jIGIvYXJjaC9ibGFja2Zpbi9rZXJuZWwvYmZpbl9ncGlvLmMKaW5kZXggNWMwODAwYS4uNGMxNDMzMSAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9rZXJuZWwvYmZpbl9ncGlvLmMKKysrIGIvYXJjaC9ibGFja2Zpbi9rZXJuZWwvYmZpbl9ncGlvLmMKQEAgLTExOSwyOCArMTE5LDI4IEBACiAjZGVmaW5lIEFXQV9EVU1NWV9SRUFEKC4uLikgIGRvIHsgfSB3aGlsZSAoMCkKICNlbmRpZgogCi0jaWZkZWYgQkY1MzNfRkFNSUxZCi1zdGF0aWMgc3RydWN0IGdwaW9fcG9ydF90ICpncGlvX2JhbmtiW2dwaW9fYmFuayhNQVhfQkxBQ0tGSU5fR1BJT1MpXSA9IHsKKyNpZiBkZWZpbmVkKEJGNTMzX0ZBTUlMWSkgfHwgZGVmaW5lZChCRjUzOF9GQU1JTFkpCitzdGF0aWMgc3RydWN0IGdwaW9fcG9ydF90ICpncGlvX2JhbmtiW10gPSB7CiAJKHN0cnVjdCBncGlvX3BvcnRfdCAqKSBGSU9fRkxBR19ELAogfTsKICNlbmRpZgogCi0jaWYgZGVmaW5lZChCRjUyN19GQU1JTFkpIHx8IGRlZmluZWQoQkY1MzdfRkFNSUxZKQotc3RhdGljIHN0cnVjdCBncGlvX3BvcnRfdCAqZ3Bpb19iYW5rYltncGlvX2JhbmsoTUFYX0JMQUNLRklOX0dQSU9TKV0gPSB7CisjaWYgZGVmaW5lZChCRjUyN19GQU1JTFkpIHx8IGRlZmluZWQoQkY1MzdfRkFNSUxZKSB8fCBkZWZpbmVkKEJGNTE4X0ZBTUlMWSkKK3N0YXRpYyBzdHJ1Y3QgZ3Bpb19wb3J0X3QgKmdwaW9fYmFua2JbXSA9IHsKIAkoc3RydWN0IGdwaW9fcG9ydF90ICopIFBPUlRGSU8sCiAJKHN0cnVjdCBncGlvX3BvcnRfdCAqKSBQT1JUR0lPLAogCShzdHJ1Y3QgZ3Bpb19wb3J0X3QgKikgUE9SVEhJTywKIH07CiAKLXN0YXRpYyB1bnNpZ25lZCBzaG9ydCAqcG9ydF9mZXJbZ3Bpb19iYW5rKE1BWF9CTEFDS0ZJTl9HUElPUyldID0geworc3RhdGljIHVuc2lnbmVkIHNob3J0ICpwb3J0X2ZlcltdID0gewogCSh1bnNpZ25lZCBzaG9ydCAqKSBQT1JURl9GRVIsCiAJKHVuc2lnbmVkIHNob3J0ICopIFBPUlRHX0ZFUiwKIAkodW5zaWduZWQgc2hvcnQgKikgUE9SVEhfRkVSLAogfTsKICNlbmRpZgogCi0jaWZkZWYgQkY1MjdfRkFNSUxZCi1zdGF0aWMgdW5zaWduZWQgc2hvcnQgKnBvcnRfbXV4W2dwaW9fYmFuayhNQVhfQkxBQ0tGSU5fR1BJT1MpXSA9IHsKKyNpZiBkZWZpbmVkKEJGNTI3X0ZBTUlMWSkgfHwgZGVmaW5lZChCRjUxOF9GQU1JTFkpCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgKnBvcnRfbXV4W10gPSB7CiAJKHVuc2lnbmVkIHNob3J0ICopIFBPUlRGX01VWCwKIAkodW5zaWduZWQgc2hvcnQgKikgUE9SVEdfTVVYLAogCSh1bnNpZ25lZCBzaG9ydCAqKSBQT1JUSF9NVVgsCkBAIC0xNTUsNyArMTU1LDcgQEAKICNlbmRpZgogCiAjaWZkZWYgQkY1NjFfRkFNSUxZCi1zdGF0aWMgc3RydWN0IGdwaW9fcG9ydF90ICpncGlvX2JhbmtiW2dwaW9fYmFuayhNQVhfQkxBQ0tGSU5fR1BJT1MpXSA9IHsKK3N0YXRpYyBzdHJ1Y3QgZ3Bpb19wb3J0X3QgKmdwaW9fYmFua2JbXSA9IHsKIAkoc3RydWN0IGdwaW9fcG9ydF90ICopIEZJTzBfRkxBR19ELAogCShzdHJ1Y3QgZ3Bpb19wb3J0X3QgKikgRklPMV9GTEFHX0QsCiAJKHN0cnVjdCBncGlvX3BvcnRfdCAqKSBGSU8yX0ZMQUdfRCwKQEAgLTE2Myw3ICsxNjMsNyBAQAogI2VuZGlmCiAKICNpZmRlZiBCRjU0OF9GQU1JTFkKLXN0YXRpYyBzdHJ1Y3QgZ3Bpb19wb3J0X3QgKmdwaW9fYXJyYXlbZ3Bpb19iYW5rKE1BWF9CTEFDS0ZJTl9HUElPUyldID0geworc3RhdGljIHN0cnVjdCBncGlvX3BvcnRfdCAqZ3Bpb19hcnJheVtdID0gewogCShzdHJ1Y3QgZ3Bpb19wb3J0X3QgKilQT1JUQV9GRVIsCiAJKHN0cnVjdCBncGlvX3BvcnRfdCAqKVBPUlRCX0ZFUiwKIAkoc3RydWN0IGdwaW9fcG9ydF90ICopUE9SVENfRkVSLApAQCAtMTc3LDggKzE3Nyw5IEBACiB9OwogI2VuZGlmCiAKLXN0YXRpYyB1bnNpZ25lZCBzaG9ydCByZXNlcnZlZF9ncGlvX21hcFtncGlvX2JhbmsoTUFYX0JMQUNLRklOX0dQSU9TKV07CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgcmVzZXJ2ZWRfZ3Bpb19tYXBbR1BJT19CQU5LX05VTV07CiBzdGF0aWMgdW5zaWduZWQgc2hvcnQgcmVzZXJ2ZWRfcGVyaV9tYXBbZ3Bpb19iYW5rKE1BWF9SRVNPVVJDRVMpXTsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCByZXNlcnZlZF9ncGlvX2lycV9tYXBbR1BJT19CQU5LX05VTV07CiAKICNkZWZpbmUgUkVTT1VSQ0VfTEFCRUxfU0laRSAJMTYKIApAQCAtMTg4LDQ4ICsxODksNDYgQEAKIAogI2lmIGRlZmluZWQoQ09ORklHX1BNKQogI2lmIGRlZmluZWQoQ09ORklHX0JGNTR4KQotc3RhdGljIHN0cnVjdCBncGlvX3BvcnRfcyBncGlvX2Jhbmtfc2F2ZWRbZ3Bpb19iYW5rKE1BWF9CTEFDS0ZJTl9HUElPUyldOworc3RhdGljIHN0cnVjdCBncGlvX3BvcnRfcyBncGlvX2Jhbmtfc2F2ZWRbR1BJT19CQU5LX05VTV07CiAjZWxzZQotc3RhdGljIHVuc2lnbmVkIHNob3J0IHdha2V1cF9tYXBbZ3Bpb19iYW5rKE1BWF9CTEFDS0ZJTl9HUElPUyldOworc3RhdGljIHVuc2lnbmVkIHNob3J0IHdha2V1cF9tYXBbR1BJT19CQU5LX05VTV07CiBzdGF0aWMgdW5zaWduZWQgY2hhciB3YWtldXBfZmxhZ3NfbWFwW01BWF9CTEFDS0ZJTl9HUElPU107Ci1zdGF0aWMgc3RydWN0IGdwaW9fcG9ydF9zIGdwaW9fYmFua19zYXZlZFtncGlvX2JhbmsoTUFYX0JMQUNLRklOX0dQSU9TKV07CitzdGF0aWMgc3RydWN0IGdwaW9fcG9ydF9zIGdwaW9fYmFua19zYXZlZFtHUElPX0JBTktfTlVNXTsKIAogI2lmZGVmIEJGNTMzX0ZBTUlMWQotc3RhdGljIHVuc2lnbmVkIGludCBzaWNfaXdyX2lycXNbZ3Bpb19iYW5rKE1BWF9CTEFDS0ZJTl9HUElPUyldID0ge0lSUV9QUk9HX0lOVEJ9Oworc3RhdGljIHVuc2lnbmVkIGludCBzaWNfaXdyX2lycXNbXSA9IHtJUlFfUFJPR19JTlRCfTsKICNlbmRpZgogCiAjaWZkZWYgQkY1MzdfRkFNSUxZCi1zdGF0aWMgdW5zaWduZWQgaW50IHNpY19pd3JfaXJxc1tncGlvX2JhbmsoTUFYX0JMQUNLRklOX0dQSU9TKV0gPSB7SVJRX1BST0dfSU5UQiwgSVJRX1BPUlRHX0lOVEIsIElSUV9NQUNfVFh9Oworc3RhdGljIHVuc2lnbmVkIGludCBzaWNfaXdyX2lycXNbXSA9IHtJUlFfUFJPR19JTlRCLCBJUlFfUE9SVEdfSU5UQiwgSVJRX01BQ19UWH07CiAjZW5kaWYKIAotI2lmZGVmIEJGNTI3X0ZBTUlMWQotc3RhdGljIHVuc2lnbmVkIGludCBzaWNfaXdyX2lycXNbZ3Bpb19iYW5rKE1BWF9CTEFDS0ZJTl9HUElPUyldID0ge0lSUV9QT1JURl9JTlRCLCBJUlFfUE9SVEdfSU5UQiwgSVJRX1BPUlRIX0lOVEJ9OworI2lmZGVmIEJGNTM4X0ZBTUlMWQorc3RhdGljIHVuc2lnbmVkIGludCBzaWNfaXdyX2lycXNbXSA9IHtJUlFfUE9SVEZfSU5UQn07CisjZW5kaWYKKworI2lmIGRlZmluZWQoQkY1MjdfRkFNSUxZKSB8fCBkZWZpbmVkKEJGNTE4X0ZBTUlMWSkKK3N0YXRpYyB1bnNpZ25lZCBpbnQgc2ljX2l3cl9pcnFzW10gPSB7SVJRX1BPUlRGX0lOVEIsIElSUV9QT1JUR19JTlRCLCBJUlFfUE9SVEhfSU5UQn07CiAjZW5kaWYKIAogI2lmZGVmIEJGNTYxX0ZBTUlMWQotc3RhdGljIHVuc2lnbmVkIGludCBzaWNfaXdyX2lycXNbZ3Bpb19iYW5rKE1BWF9CTEFDS0ZJTl9HUElPUyldID0ge0lSUV9QUk9HMF9JTlRCLCBJUlFfUFJPRzFfSU5UQiwgSVJRX1BST0cyX0lOVEJ9Oworc3RhdGljIHVuc2lnbmVkIGludCBzaWNfaXdyX2lycXNbXSA9IHtJUlFfUFJPRzBfSU5UQiwgSVJRX1BST0cxX0lOVEIsIElSUV9QUk9HMl9JTlRCfTsKICNlbmRpZgogI2VuZGlmCiAjZW5kaWYgLyogQ09ORklHX1BNICovCiAKLSNpZiBkZWZpbmVkKEJGNTQ4X0ZBTUlMWSkKIGlubGluZSBpbnQgY2hlY2tfZ3Bpbyh1bnNpZ25lZCBncGlvKQogeworI2lmIGRlZmluZWQoQkY1NDhfRkFNSUxZKQogCWlmIChncGlvID09IEdQSU9fUEIxNSB8fCBncGlvID09IEdQSU9fUEMxNCB8fCBncGlvID09IEdQSU9fUEMxNQogCSAgICB8fCBncGlvID09IEdQSU9fUEgxNCB8fCBncGlvID09IEdQSU9fUEgxNQotCSAgICB8fCBncGlvID09IEdQSU9fUEoxNCB8fCBncGlvID09IEdQSU9fUEoxNQotCSAgICB8fCBncGlvID49IE1BWF9CTEFDS0ZJTl9HUElPUykKKwkgICAgfHwgZ3BpbyA9PSBHUElPX1BKMTQgfHwgZ3BpbyA9PSBHUElPX1BKMTUpCiAJCXJldHVybiAtRUlOVkFMOwotCXJldHVybiAwOwotfQotI2Vsc2UKLWlubGluZSBpbnQgY2hlY2tfZ3Bpbyh1bnNpZ25lZCBncGlvKQoteworI2VuZGlmCiAJaWYgKGdwaW8gPj0gTUFYX0JMQUNLRklOX0dQSU9TKQogCQlyZXR1cm4gLUVJTlZBTDsKIAlyZXR1cm4gMDsKIH0KLSNlbmRpZgogCiBzdGF0aWMgdm9pZCBncGlvX2Vycm9yKHVuc2lnbmVkIGdwaW8pCiB7CkBAIC0yNTgsMzUgKzI1NywzMCBAQAogCX0KIAogCWlmIChsYWJlbCkKLQkJcmV0dXJuIHN0cm5jbXAoc3RyX2lkZW50W2lkZW50XS5uYW1lLAotCQkJCSBsYWJlbCwgc3RybGVuKGxhYmVsKSk7CisJCXJldHVybiBzdHJjbXAoc3RyX2lkZW50W2lkZW50XS5uYW1lLCBsYWJlbCk7CiAJZWxzZQogCQlyZXR1cm4gLUVJTlZBTDsKIH0KIAotI2lmIGRlZmluZWQoQkY1MjdfRkFNSUxZKSB8fCBkZWZpbmVkKEJGNTM3X0ZBTUlMWSkKIHN0YXRpYyB2b2lkIHBvcnRfc2V0dXAodW5zaWduZWQgZ3BpbywgdW5zaWduZWQgc2hvcnQgdXNhZ2UpCiB7Ci0JaWYgKCFjaGVja19ncGlvKGdwaW8pKSB7Ci0JCWlmICh1c2FnZSA9PSBHUElPX1VTQUdFKQotCQkJKnBvcnRfZmVyW2dwaW9fYmFuayhncGlvKV0gJj0gfmdwaW9fYml0KGdwaW8pOwotCQllbHNlCi0JCQkqcG9ydF9mZXJbZ3Bpb19iYW5rKGdwaW8pXSB8PSBncGlvX2JpdChncGlvKTsKLQkJU1NZTkMoKTsKLQl9Ci19CisJaWYgKGNoZWNrX2dwaW8oZ3BpbykpCisJCXJldHVybjsKKworI2lmIGRlZmluZWQoQkY1MjdfRkFNSUxZKSB8fCBkZWZpbmVkKEJGNTM3X0ZBTUlMWSkgfHwgZGVmaW5lZChCRjUxOF9GQU1JTFkpCisJaWYgKHVzYWdlID09IEdQSU9fVVNBR0UpCisJCSpwb3J0X2ZlcltncGlvX2JhbmsoZ3BpbyldICY9IH5ncGlvX2JpdChncGlvKTsKKwllbHNlCisJCSpwb3J0X2ZlcltncGlvX2JhbmsoZ3BpbyldIHw9IGdwaW9fYml0KGdwaW8pOworCVNTWU5DKCk7CiAjZWxpZiBkZWZpbmVkKEJGNTQ4X0ZBTUlMWSkKLXN0YXRpYyB2b2lkIHBvcnRfc2V0dXAodW5zaWduZWQgZ3BpbywgdW5zaWduZWQgc2hvcnQgdXNhZ2UpCi17CiAJaWYgKHVzYWdlID09IEdQSU9fVVNBR0UpCiAJCWdwaW9fYXJyYXlbZ3Bpb19iYW5rKGdwaW8pXS0+cG9ydF9mZXIgJj0gfmdwaW9fYml0KGdwaW8pOwogCWVsc2UKIAkJZ3Bpb19hcnJheVtncGlvX2JhbmsoZ3BpbyldLT5wb3J0X2ZlciB8PSBncGlvX2JpdChncGlvKTsKIAlTU1lOQygpOwotfQotI2Vsc2UKLSMgZGVmaW5lIHBvcnRfc2V0dXAoLi4uKSAgZG8geyB9IHdoaWxlICgwKQogI2VuZGlmCit9CiAKICNpZmRlZiBCRjUzN19GQU1JTFkKIHN0YXRpYyBzdHJ1Y3QgewpAQCAtMzc5LDcgKzM3Myw3IEBACiAKIAlyZXR1cm4gKHBtdXggPj4gKDIgKiBncGlvX3N1Yl9uKHBvcnRubykpICYgMHgzKTsKIH0KLSNlbGlmIGRlZmluZWQoQkY1MjdfRkFNSUxZKQorI2VsaWYgZGVmaW5lZChCRjUyN19GQU1JTFkpIHx8IGRlZmluZWQoQkY1MThfRkFNSUxZKQogaW5saW5lIHZvaWQgcG9ydG11eF9zZXR1cCh1bnNpZ25lZCBzaG9ydCBwb3J0bm8sIHVuc2lnbmVkIHNob3J0IGZ1bmN0aW9uKQogewogCXUxNiBwbXV4LCBpZGVudCA9IFBfSURFTlQocG9ydG5vKTsKQEAgLTQyOCwxMyArNDIyLDEzIEBACiB2b2lkIHNldF9ncGlvXyAjIyBuYW1lKHVuc2lnbmVkIGdwaW8sIHVuc2lnbmVkIHNob3J0IGFyZykgXAogeyBcCiAJdW5zaWduZWQgbG9uZyBmbGFnczsgXAotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsgXAorCWxvY2FsX2lycV9zYXZlX2h3KGZsYWdzKTsgXAogCWlmIChhcmcpIFwKIAkJZ3Bpb19iYW5rYltncGlvX2JhbmsoZ3BpbyldLT5uYW1lIHw9IGdwaW9fYml0KGdwaW8pOyBcCiAJZWxzZSBcCiAJCWdwaW9fYmFua2JbZ3Bpb19iYW5rKGdwaW8pXS0+bmFtZSAmPSB+Z3Bpb19iaXQoZ3Bpbyk7IFwKIAlBV0FfRFVNTVlfUkVBRChuYW1lKTsgXAotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsgXAorCWxvY2FsX2lycV9yZXN0b3JlX2h3KGZsYWdzKTsgXAogfSBcCiBFWFBPUlRfU1lNQk9MKHNldF9ncGlvXyAjIyBuYW1lKTsKIApAQCAtNDUwLDEzICs0NDQsMTMgQEAKIHZvaWQgc2V0X2dwaW9fICMjIG5hbWUodW5zaWduZWQgZ3BpbywgdW5zaWduZWQgc2hvcnQgYXJnKSBcCiB7IFwKIAl1bnNpZ25lZCBsb25nIGZsYWdzOyBcCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOyBcCisJbG9jYWxfaXJxX3NhdmVfaHcoZmxhZ3MpOyBcCiAJaWYgKGFyZykgXAogCQlncGlvX2JhbmtiW2dwaW9fYmFuayhncGlvKV0tPm5hbWUgIyMgX3NldCA9IGdwaW9fYml0KGdwaW8pOyBcCiAJZWxzZSBcCiAJCWdwaW9fYmFua2JbZ3Bpb19iYW5rKGdwaW8pXS0+bmFtZSAjIyBfY2xlYXIgPSBncGlvX2JpdChncGlvKTsgXAogCUFXQV9EVU1NWV9SRUFEKG5hbWUpOyBcCi0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOyBcCisJbG9jYWxfaXJxX3Jlc3RvcmVfaHcoZmxhZ3MpOyBcCiB9IFwKIEVYUE9SVF9TWU1CT0woc2V0X2dwaW9fICMjIG5hbWUpOwogI2Vsc2UKQEAgLTQ3OSwxMCArNDczLDEwIEBACiB2b2lkIHNldF9ncGlvX3RvZ2dsZSh1bnNpZ25lZCBncGlvKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCWxvY2FsX2lycV9zYXZlX2h3KGZsYWdzKTsKIAlncGlvX2JhbmtiW2dwaW9fYmFuayhncGlvKV0tPnRvZ2dsZSA9IGdwaW9fYml0KGdwaW8pOwogCUFXQV9EVU1NWV9SRUFEKHRvZ2dsZSk7Ci0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCWxvY2FsX2lycV9yZXN0b3JlX2h3KGZsYWdzKTsKIH0KICNlbHNlCiB2b2lkIHNldF9ncGlvX3RvZ2dsZSh1bnNpZ25lZCBncGlvKQpAQCAtNTAwLDEwICs0OTQsMTAgQEAKIHZvaWQgc2V0X2dwaW9wXyAjIyBuYW1lKHVuc2lnbmVkIGdwaW8sIHVuc2lnbmVkIHNob3J0IGFyZykgXAogeyBcCiAJdW5zaWduZWQgbG9uZyBmbGFnczsgXAotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsgXAorCWxvY2FsX2lycV9zYXZlX2h3KGZsYWdzKTsgXAogCWdwaW9fYmFua2JbZ3Bpb19iYW5rKGdwaW8pXS0+bmFtZSA9IGFyZzsgXAogCUFXQV9EVU1NWV9SRUFEKG5hbWUpOyBcCi0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOyBcCisJbG9jYWxfaXJxX3Jlc3RvcmVfaHcoZmxhZ3MpOyBcCiB9IFwKIEVYUE9SVF9TWU1CT0woc2V0X2dwaW9wXyAjIyBuYW1lKTsKICNlbHNlCkBAIC01MzEsMTAgKzUyNSwxMCBAQAogeyBcCiAJdW5zaWduZWQgbG9uZyBmbGFnczsgXAogCXVuc2lnbmVkIHNob3J0IHJldDsgXAotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsgXAorCWxvY2FsX2lycV9zYXZlX2h3KGZsYWdzKTsgXAogCXJldCA9IDB4MDEgJiAoZ3Bpb19iYW5rYltncGlvX2JhbmsoZ3BpbyldLT5uYW1lID4+IGdwaW9fc3ViX24oZ3BpbykpOyBcCiAJQVdBX0RVTU1ZX1JFQUQobmFtZSk7IFwKLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7IFwKKwlsb2NhbF9pcnFfcmVzdG9yZV9odyhmbGFncyk7IFwKIAlyZXR1cm4gcmV0OyBcCiB9IFwKIEVYUE9SVF9TWU1CT0woZ2V0X2dwaW9fICMjIG5hbWUpOwpAQCAtNTY0LDEwICs1NTgsMTAgQEAKIHsgXAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7IFwKIAl1bnNpZ25lZCBzaG9ydCByZXQ7IFwKLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7IFwKKwlsb2NhbF9pcnFfc2F2ZV9odyhmbGFncyk7IFwKIAlyZXQgPSAoZ3Bpb19iYW5rYltncGlvX2JhbmsoZ3BpbyldLT5uYW1lKTsgXAogCUFXQV9EVU1NWV9SRUFEKG5hbWUpOyBcCi0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOyBcCisJbG9jYWxfaXJxX3Jlc3RvcmVfaHcoZmxhZ3MpOyBcCiAJcmV0dXJuIHJldDsgXAogfSBcCiBFWFBPUlRfU1lNQk9MKGdldF9ncGlvcF8gIyMgbmFtZSk7CkBAIC02MTcsMTAgKzYxMSwxMCBAQAogCWlmICgoY2hlY2tfZ3BpbyhncGlvKSA8IDApIHx8ICF0eXBlKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwlsb2NhbF9pcnFfc2F2ZV9odyhmbGFncyk7CiAJd2FrZXVwX21hcFtncGlvX2JhbmsoZ3BpbyldIHw9IGdwaW9fYml0KGdwaW8pOwogCXdha2V1cF9mbGFnc19tYXBbZ3Bpb10gPSB0eXBlOwotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwlsb2NhbF9pcnFfcmVzdG9yZV9odyhmbGFncyk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTYzMywxMSArNjI3LDExIEBACiAJaWYgKGNoZWNrX2dwaW8oZ3BpbykgPCAwKQogCQlyZXR1cm47CiAKLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJbG9jYWxfaXJxX3NhdmVfaHcoZmxhZ3MpOwogCiAJd2FrZXVwX21hcFtncGlvX2JhbmsoZ3BpbyldICY9IH5ncGlvX2JpdChncGlvKTsKIAotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwlsb2NhbF9pcnFfcmVzdG9yZV9odyhmbGFncyk7CiB9CiBFWFBPUlRfU1lNQk9MKGdwaW9fcG1fd2FrZXVwX2ZyZWUpOwogCkBAIC02NzksNyArNjczLDcgQEAKIAkJZ3Bpb19iYW5rYltiYW5rXS0+bWFza2IgPSAwOwogCiAJCWlmIChtYXNrKSB7Ci0jaWYgZGVmaW5lZChCRjUyN19GQU1JTFkpIHx8IGRlZmluZWQoQkY1MzdfRkFNSUxZKQorI2lmIGRlZmluZWQoQkY1MjdfRkFNSUxZKSB8fCBkZWZpbmVkKEJGNTM3X0ZBTUlMWSkgfHwgZGVmaW5lZChCRjUxOF9GQU1JTFkpCiAJCQlncGlvX2Jhbmtfc2F2ZWRbYmFua10uZmVyICAgPSAqcG9ydF9mZXJbYmFua107CiAjZW5kaWYKIAkJCWdwaW9fYmFua19zYXZlZFtiYW5rXS5pbmVuICA9IGdwaW9fYmFua2JbYmFua10tPmluZW47CkBAIC03MjQsNyArNzE4LDcgQEAKIAkJYmFuayA9IGdwaW9fYmFuayhpKTsKIAogCQlpZiAobWFzaykgewotI2lmIGRlZmluZWQoQkY1MjdfRkFNSUxZKSB8fCBkZWZpbmVkKEJGNTM3X0ZBTUlMWSkKKyNpZiBkZWZpbmVkKEJGNTI3X0ZBTUlMWSkgfHwgZGVmaW5lZChCRjUzN19GQU1JTFkpIHx8IGRlZmluZWQoQkY1MThfRkFNSUxZKQogCQkJKnBvcnRfZmVyW2JhbmtdICAgCT0gZ3Bpb19iYW5rX3NhdmVkW2JhbmtdLmZlcjsKICNlbmRpZgogCQkJZ3Bpb19iYW5rYltiYW5rXS0+aW5lbiAgPSBncGlvX2Jhbmtfc2F2ZWRbYmFua10uaW5lbjsKQEAgLTc1MCw5ICs3NDQsOSBAQAogCWZvciAoaSA9IDA7IGkgPCBNQVhfQkxBQ0tGSU5fR1BJT1M7IGkgKz0gR1BJT19CQU5LU0laRSkgewogCQliYW5rID0gZ3Bpb19iYW5rKGkpOwogCi0jaWYgZGVmaW5lZChCRjUyN19GQU1JTFkpIHx8IGRlZmluZWQoQkY1MzdfRkFNSUxZKQorI2lmIGRlZmluZWQoQkY1MjdfRkFNSUxZKSB8fCBkZWZpbmVkKEJGNTM3X0ZBTUlMWSkgfHwgZGVmaW5lZChCRjUxOF9GQU1JTFkpCiAJCQlncGlvX2Jhbmtfc2F2ZWRbYmFua10uZmVyICAgPSAqcG9ydF9mZXJbYmFua107Ci0jaWZkZWYgQkY1MjdfRkFNSUxZCisjaWYgZGVmaW5lZChCRjUyN19GQU1JTFkpIHx8IGRlZmluZWQoQkY1MThfRkFNSUxZKQogCQkJZ3Bpb19iYW5rX3NhdmVkW2JhbmtdLm11eCAgID0gKnBvcnRfbXV4W2JhbmtdOwogI2Vsc2UKIAkJCWlmIChiYW5rID09IDApCkBAIC03NzgsOCArNzcyLDggQEAKIAlmb3IgKGkgPSAwOyBpIDwgTUFYX0JMQUNLRklOX0dQSU9TOyBpICs9IEdQSU9fQkFOS1NJWkUpIHsKIAkJCWJhbmsgPSBncGlvX2JhbmsoaSk7CiAKLSNpZiBkZWZpbmVkKEJGNTI3X0ZBTUlMWSkgfHwgZGVmaW5lZChCRjUzN19GQU1JTFkpCi0jaWZkZWYgQkY1MjdfRkFNSUxZCisjaWYgZGVmaW5lZChCRjUyN19GQU1JTFkpIHx8IGRlZmluZWQoQkY1MzdfRkFNSUxZKSB8fCBkZWZpbmVkKEJGNTE4X0ZBTUlMWSkKKyNpZiBkZWZpbmVkKEJGNTI3X0ZBTUlMWSkgfHwgZGVmaW5lZChCRjUxOF9GQU1JTFkpCiAJCQkqcG9ydF9tdXhbYmFua10gPSBncGlvX2Jhbmtfc2F2ZWRbYmFua10ubXV4OwogI2Vsc2UKIAkJCWlmIChiYW5rID09IDApCkBAIC04NzMsNyArODY3LDYgQEAKICogTU9ESUZJQ0FUSU9OIEhJU1RPUlkgOgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSNpZmRlZiBCRjU0OF9GQU1JTFkKIGludCBwZXJpcGhlcmFsX3JlcXVlc3QodW5zaWduZWQgc2hvcnQgcGVyLCBjb25zdCBjaGFyICpsYWJlbCkKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwpAQCAtODg5LDMxICs4ODIsMzUgQEAKIAlpZiAoIShwZXIgJiBQX0RFRklORUQpKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCWlmIChjaGVja19ncGlvKGlkZW50KSA8IDApCi0JCXJldHVybiAtRUlOVkFMOworCWxvY2FsX2lycV9zYXZlX2h3KGZsYWdzKTsKIAotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQotCWlmICh1bmxpa2VseShyZXNlcnZlZF9ncGlvX21hcFtncGlvX2JhbmsoaWRlbnQpXSAmIGdwaW9fYml0KGlkZW50KSkpIHsKKwkvKiBJZiBhIHBpbiBjYW4gYmUgbXV4ZWQgYXMgZWl0aGVyIEdQSU8gb3IgcGVyaXBoZXJhbCwgbWFrZQorCSAqIHN1cmUgaXQgaXMgbm90IGFscmVhZHkgYSBHUElPIHBpbiB3aGVuIHdlIHJlcXVlc3QgaXQuCisJICovCisJaWYgKHVubGlrZWx5KCFjaGVja19ncGlvKGlkZW50KSAmJgorCSAgICByZXNlcnZlZF9ncGlvX21hcFtncGlvX2JhbmsoaWRlbnQpXSAmIGdwaW9fYml0KGlkZW50KSkpIHsKIAkJZHVtcF9zdGFjaygpOwogCQlwcmludGsoS0VSTl9FUlIKLQkJICAgICIlczogUGVyaXBoZXJhbCAlZCBpcyBhbHJlYWR5IHJlc2VydmVkIGFzIEdQSU8gYnkgJXMgIVxuIiwKKwkJICAgICAgICIlczogUGVyaXBoZXJhbCAlZCBpcyBhbHJlYWR5IHJlc2VydmVkIGFzIEdQSU8gYnkgJXMgIVxuIiwKIAkJICAgICAgIF9fZnVuY19fLCBpZGVudCwgZ2V0X2xhYmVsKGlkZW50KSk7Ci0JCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwkJbG9jYWxfaXJxX3Jlc3RvcmVfaHcoZmxhZ3MpOwogCQlyZXR1cm4gLUVCVVNZOwogCX0KIAogCWlmICh1bmxpa2VseShyZXNlcnZlZF9wZXJpX21hcFtncGlvX2JhbmsoaWRlbnQpXSAmIGdwaW9fYml0KGlkZW50KSkpIHsKIAotCQl1MTYgZnVuY3QgPSBnZXRfcG9ydG11eChpZGVudCk7Ci0KIAkJLyoKIAkJICogUGluIGZ1bmN0aW9ucyBsaWtlIEFNQyBhZGRyZXNzIHN0cm9iZXMgbXkKIAkJICogYmUgcmVxdWVzdGVkIGFuZCB1c2VkIGJ5IHNldmVyYWwgZHJpdmVycwogCQkgKi8KIAotCQlpZiAoISgocGVyICYgUF9NQVlTSEFSRSkgJiYgKGZ1bmN0ID09IFBfRlVOQ1QyTVVYKHBlcikpKSkgeworI2lmZGVmIEJGNTQ4X0ZBTUlMWQorCQl1MTYgZnVuY3QgPSBnZXRfcG9ydG11eChpZGVudCk7CiAKKwkJaWYgKCEoKHBlciAmIFBfTUFZU0hBUkUpICYmIChmdW5jdCA9PSBQX0ZVTkNUMk1VWChwZXIpKSkpIHsKKyNlbHNlCisJCWlmICghKHBlciAmIFBfTUFZU0hBUkUpKSB7CisjZW5kaWYKIAkJCS8qCiAJCQkgKiBBbGxvdyB0aGF0IHRoZSBpZGVudGljYWwgcGluIGZ1bmN0aW9uIGNhbgogCQkJICogYmUgcmVxdWVzdGVkIGZyb20gdGhlIHNhbWUgZHJpdmVyIHR3aWNlCkBAIC05MjYsNyArOTIzLDcgQEAKIAkJCXByaW50ayhLRVJOX0VSUgogCQkJICAgICAgICIlczogUGVyaXBoZXJhbCAlZCBmdW5jdGlvbiAlZCBpcyBhbHJlYWR5IHJlc2VydmVkIGJ5ICVzICFcbiIsCiAJCQkgICAgICAgX19mdW5jX18sIGlkZW50LCBQX0ZVTkNUMk1VWChwZXIpLCBnZXRfbGFiZWwoaWRlbnQpKTsKLQkJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwkJCWxvY2FsX2lycV9yZXN0b3JlX2h3KGZsYWdzKTsKIAkJCXJldHVybiAtRUJVU1k7CiAJCX0KIAl9CkBAIC05MzQsODkgKzkzMSwxOSBAQAogIGFueXdheToKIAlyZXNlcnZlZF9wZXJpX21hcFtncGlvX2JhbmsoaWRlbnQpXSB8PSBncGlvX2JpdChpZGVudCk7CiAKKyNpZmRlZiBCRjU0OF9GQU1JTFkKIAlwb3J0bXV4X3NldHVwKGlkZW50LCBQX0ZVTkNUMk1VWChwZXIpKTsKLQlwb3J0X3NldHVwKGlkZW50LCBQRVJJUEhFUkFMX1VTQUdFKTsKLQotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLQlzZXRfbGFiZWwoaWRlbnQsIGxhYmVsKTsKLQotCXJldHVybiAwOwotfQotRVhQT1JUX1NZTUJPTChwZXJpcGhlcmFsX3JlcXVlc3QpOwogI2Vsc2UKLQotaW50IHBlcmlwaGVyYWxfcmVxdWVzdCh1bnNpZ25lZCBzaG9ydCBwZXIsIGNvbnN0IGNoYXIgKmxhYmVsKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdW5zaWduZWQgc2hvcnQgaWRlbnQgPSBQX0lERU5UKHBlcik7Ci0KLQkvKgotCSAqIERvbid0IGNhcmVzIGFyZSBwaW5zIHdpdGggb25seSBvbmUgZGVkaWNhdGVkIGZ1bmN0aW9uCi0JICovCi0KLQlpZiAocGVyICYgUF9ET05UQ0FSRSkKLQkJcmV0dXJuIDA7Ci0KLQlpZiAoIShwZXIgJiBQX0RFRklORUQpKQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQotCWlmICghY2hlY2tfZ3BpbyhpZGVudCkpIHsKLQotCQlpZiAodW5saWtlbHkocmVzZXJ2ZWRfZ3Bpb19tYXBbZ3Bpb19iYW5rKGlkZW50KV0gJiBncGlvX2JpdChpZGVudCkpKSB7Ci0JCQlkdW1wX3N0YWNrKCk7Ci0JCQlwcmludGsoS0VSTl9FUlIKLQkJCSAgICAgICAiJXM6IFBlcmlwaGVyYWwgJWQgaXMgYWxyZWFkeSByZXNlcnZlZCBhcyBHUElPIGJ5ICVzICFcbiIsCi0JCQkgICAgICAgX19mdW5jX18sIGlkZW50LCBnZXRfbGFiZWwoaWRlbnQpKTsKLQkJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLQkJCXJldHVybiAtRUJVU1k7Ci0JCX0KLQotCX0KLQotCWlmICh1bmxpa2VseShyZXNlcnZlZF9wZXJpX21hcFtncGlvX2JhbmsoaWRlbnQpXSAmIGdwaW9fYml0KGlkZW50KSkpIHsKLQotCQkvKgotCQkgKiBQaW4gZnVuY3Rpb25zIGxpa2UgQU1DIGFkZHJlc3Mgc3Ryb2JlcyBteQotCQkgKiBiZSByZXF1ZXN0ZWQgYW5kIHVzZWQgYnkgc2V2ZXJhbCBkcml2ZXJzCi0JCSAqLwotCi0JCWlmICghKHBlciAmIFBfTUFZU0hBUkUpKSB7Ci0KLQkJCS8qCi0JCQkgKiBBbGxvdyB0aGF0IHRoZSBpZGVudGljYWwgcGluIGZ1bmN0aW9uIGNhbgotCQkJICogYmUgcmVxdWVzdGVkIGZyb20gdGhlIHNhbWUgZHJpdmVyIHR3aWNlCi0JCQkgKi8KLQotCQkJaWYgKGNtcF9sYWJlbChpZGVudCwgbGFiZWwpID09IDApCi0JCQkJZ290byBhbnl3YXk7Ci0KLQkJCWR1bXBfc3RhY2soKTsKLQkJCXByaW50ayhLRVJOX0VSUgotCQkJICAgICAgICIlczogUGVyaXBoZXJhbCAlZCBmdW5jdGlvbiAlZCBpcyBhbHJlYWR5IgotCQkJICAgICAgICIgcmVzZXJ2ZWQgYnkgJXMgIVxuIiwKLQkJCSAgICAgICBfX2Z1bmNfXywgaWRlbnQsIFBfRlVOQ1QyTVVYKHBlciksCi0JCQkJZ2V0X2xhYmVsKGlkZW50KSk7Ci0JCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci0JCQlyZXR1cm4gLUVCVVNZOwotCQl9Ci0KLQl9Ci0KLSBhbnl3YXk6CiAJcG9ydG11eF9zZXR1cChwZXIsIFBfRlVOQ1QyTVVYKHBlcikpOwotCisjZW5kaWYKIAlwb3J0X3NldHVwKGlkZW50LCBQRVJJUEhFUkFMX1VTQUdFKTsKIAotCXJlc2VydmVkX3BlcmlfbWFwW2dwaW9fYmFuayhpZGVudCldIHw9IGdwaW9fYml0KGlkZW50KTsKLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJbG9jYWxfaXJxX3Jlc3RvcmVfaHcoZmxhZ3MpOwogCXNldF9sYWJlbChpZGVudCwgbGFiZWwpOwogCiAJcmV0dXJuIDA7CiB9CiBFWFBPUlRfU1lNQk9MKHBlcmlwaGVyYWxfcmVxdWVzdCk7Ci0jZW5kaWYKIAogaW50IHBlcmlwaGVyYWxfcmVxdWVzdF9saXN0KGNvbnN0IHVuc2lnbmVkIHNob3J0IHBlcltdLCBjb25zdCBjaGFyICpsYWJlbCkKIHsKQEAgLTEwNTMsMTAgKzk4MCwxMCBAQAogCWlmIChjaGVja19ncGlvKGlkZW50KSA8IDApCiAJCXJldHVybjsKIAotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwlsb2NhbF9pcnFfc2F2ZV9odyhmbGFncyk7CiAKIAlpZiAodW5saWtlbHkoIShyZXNlcnZlZF9wZXJpX21hcFtncGlvX2JhbmsoaWRlbnQpXSAmIGdwaW9fYml0KGlkZW50KSkpKSB7Ci0JCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwkJbG9jYWxfaXJxX3Jlc3RvcmVfaHcoZmxhZ3MpOwogCQlyZXR1cm47CiAJfQogCkBAIC0xMDY3LDcgKzk5NCw3IEBACiAKIAlzZXRfbGFiZWwoaWRlbnQsICJmcmVlIik7CiAKLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJbG9jYWxfaXJxX3Jlc3RvcmVfaHcoZmxhZ3MpOwogfQogRVhQT1JUX1NZTUJPTChwZXJpcGhlcmFsX2ZyZWUpOwogCkBAIC0xMDk0LDE0ICsxMDIxLDE0IEBACiAqIE1PRElGSUNBVElPTiBISVNUT1JZIDoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1pbnQgZ3Bpb19yZXF1ZXN0KHVuc2lnbmVkIGdwaW8sIGNvbnN0IGNoYXIgKmxhYmVsKQoraW50IGJmaW5fZ3Bpb19yZXF1ZXN0KHVuc2lnbmVkIGdwaW8sIGNvbnN0IGNoYXIgKmxhYmVsKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlpZiAoY2hlY2tfZ3BpbyhncGlvKSA8IDApCiAJCXJldHVybiAtRUlOVkFMOwogCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCWxvY2FsX2lycV9zYXZlX2h3KGZsYWdzKTsKIAogCS8qCiAJICogQWxsb3cgdGhhdCB0aGUgaWRlbnRpY2FsIEdQSU8gY2FuCkBAIC0xMTEwLDE1ICsxMDM3LDE1IEBACiAJICovCiAKIAlpZiAoY21wX2xhYmVsKGdwaW8sIGxhYmVsKSA9PSAwKSB7Ci0JCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwkJbG9jYWxfaXJxX3Jlc3RvcmVfaHcoZmxhZ3MpOwogCQlyZXR1cm4gMDsKIAl9CiAKIAlpZiAodW5saWtlbHkocmVzZXJ2ZWRfZ3Bpb19tYXBbZ3Bpb19iYW5rKGdwaW8pXSAmIGdwaW9fYml0KGdwaW8pKSkgewogCQlkdW1wX3N0YWNrKCk7CiAJCXByaW50ayhLRVJOX0VSUiAiYmZpbi1ncGlvOiBHUElPICVkIGlzIGFscmVhZHkgcmVzZXJ2ZWQgYnkgJXMgIVxuIiwKLQkJCSBncGlvLCBnZXRfbGFiZWwoZ3BpbykpOwotCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJCSAgICAgICBncGlvLCBnZXRfbGFiZWwoZ3BpbykpOworCQlsb2NhbF9pcnFfcmVzdG9yZV9odyhmbGFncyk7CiAJCXJldHVybiAtRUJVU1k7CiAJfQogCWlmICh1bmxpa2VseShyZXNlcnZlZF9wZXJpX21hcFtncGlvX2JhbmsoZ3BpbyldICYgZ3Bpb19iaXQoZ3BpbykpKSB7CkBAIC0xMTI2LDM0ICsxMDUzLDM3IEBACiAJCXByaW50ayhLRVJOX0VSUgogCQkgICAgICAgImJmaW4tZ3BpbzogR1BJTyAlZCBpcyBhbHJlYWR5IHJlc2VydmVkIGFzIFBlcmlwaGVyYWwgYnkgJXMgIVxuIiwKIAkJICAgICAgIGdwaW8sIGdldF9sYWJlbChncGlvKSk7Ci0JCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwkJbG9jYWxfaXJxX3Jlc3RvcmVfaHcoZmxhZ3MpOwogCQlyZXR1cm4gLUVCVVNZOwogCX0KKwlpZiAodW5saWtlbHkocmVzZXJ2ZWRfZ3Bpb19pcnFfbWFwW2dwaW9fYmFuayhncGlvKV0gJiBncGlvX2JpdChncGlvKSkpCisJCXByaW50ayhLRVJOX05PVElDRSAiYmZpbi1ncGlvOiBHUElPICVkIGlzIGFscmVhZHkgcmVzZXJ2ZWQgYXMgZ3Bpby1pcnEhIgorCQkgICAgICAgIiAoRG9jdW1lbnRhdGlvbi9ibGFja2Zpbi9iZmluLWdwaW8tbm90ZXMudHh0KVxuIiwgZ3Bpbyk7CiAKIAlyZXNlcnZlZF9ncGlvX21hcFtncGlvX2JhbmsoZ3BpbyldIHw9IGdwaW9fYml0KGdwaW8pOworCXNldF9sYWJlbChncGlvLCBsYWJlbCk7CiAKLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJbG9jYWxfaXJxX3Jlc3RvcmVfaHcoZmxhZ3MpOwogCiAJcG9ydF9zZXR1cChncGlvLCBHUElPX1VTQUdFKTsKLQlzZXRfbGFiZWwoZ3BpbywgbGFiZWwpOwogCiAJcmV0dXJuIDA7CiB9Ci1FWFBPUlRfU1lNQk9MKGdwaW9fcmVxdWVzdCk7CitFWFBPUlRfU1lNQk9MKGJmaW5fZ3Bpb19yZXF1ZXN0KTsKIAotdm9pZCBncGlvX2ZyZWUodW5zaWduZWQgZ3BpbykKK3ZvaWQgYmZpbl9ncGlvX2ZyZWUodW5zaWduZWQgZ3BpbykKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJaWYgKGNoZWNrX2dwaW8oZ3BpbykgPCAwKQogCQlyZXR1cm47CiAKLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJbG9jYWxfaXJxX3NhdmVfaHcoZmxhZ3MpOwogCiAJaWYgKHVubGlrZWx5KCEocmVzZXJ2ZWRfZ3Bpb19tYXBbZ3Bpb19iYW5rKGdwaW8pXSAmIGdwaW9fYml0KGdwaW8pKSkpIHsKIAkJZHVtcF9zdGFjaygpOwogCQlncGlvX2Vycm9yKGdwaW8pOwotCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJCWxvY2FsX2lycV9yZXN0b3JlX2h3KGZsYWdzKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtMTE2MSwxMyArMTA5MSw3NiBAQAogCiAJc2V0X2xhYmVsKGdwaW8sICJmcmVlIik7CiAKLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJbG9jYWxfaXJxX3Jlc3RvcmVfaHcoZmxhZ3MpOwogfQotRVhQT1JUX1NZTUJPTChncGlvX2ZyZWUpOworRVhQT1JUX1NZTUJPTChiZmluX2dwaW9fZnJlZSk7CisKK2ludCBiZmluX2dwaW9faXJxX3JlcXVlc3QodW5zaWduZWQgZ3BpbywgY29uc3QgY2hhciAqbGFiZWwpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChjaGVja19ncGlvKGdwaW8pIDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlsb2NhbF9pcnFfc2F2ZV9odyhmbGFncyk7CisKKwlpZiAodW5saWtlbHkocmVzZXJ2ZWRfZ3Bpb19pcnFfbWFwW2dwaW9fYmFuayhncGlvKV0gJiBncGlvX2JpdChncGlvKSkpIHsKKwkJZHVtcF9zdGFjaygpOworCQlwcmludGsoS0VSTl9FUlIKKwkJICAgICAgICJiZmluLWdwaW86IEdQSU8gJWQgaXMgYWxyZWFkeSByZXNlcnZlZCBhcyBncGlvLWlycSAhXG4iLAorCQkgICAgICAgZ3Bpbyk7CisJCWxvY2FsX2lycV9yZXN0b3JlX2h3KGZsYWdzKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisJaWYgKHVubGlrZWx5KHJlc2VydmVkX3BlcmlfbWFwW2dwaW9fYmFuayhncGlvKV0gJiBncGlvX2JpdChncGlvKSkpIHsKKwkJZHVtcF9zdGFjaygpOworCQlwcmludGsoS0VSTl9FUlIKKwkJICAgICAgICJiZmluLWdwaW86IEdQSU8gJWQgaXMgYWxyZWFkeSByZXNlcnZlZCBhcyBQZXJpcGhlcmFsIGJ5ICVzICFcbiIsCisJCSAgICAgICBncGlvLCBnZXRfbGFiZWwoZ3BpbykpOworCQlsb2NhbF9pcnFfcmVzdG9yZV9odyhmbGFncyk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCWlmICh1bmxpa2VseShyZXNlcnZlZF9ncGlvX21hcFtncGlvX2JhbmsoZ3BpbyldICYgZ3Bpb19iaXQoZ3BpbykpKQorCQlwcmludGsoS0VSTl9OT1RJQ0UgImJmaW4tZ3BpbzogR1BJTyAlZCBpcyBhbHJlYWR5IHJlc2VydmVkIGJ5ICVzISAiCisJCSAgICAgICAiKERvY3VtZW50YXRpb24vYmxhY2tmaW4vYmZpbi1ncGlvLW5vdGVzLnR4dClcbiIsCisJCSAgICAgICBncGlvLCBnZXRfbGFiZWwoZ3BpbykpOworCisJcmVzZXJ2ZWRfZ3Bpb19pcnFfbWFwW2dwaW9fYmFuayhncGlvKV0gfD0gZ3Bpb19iaXQoZ3Bpbyk7CisJc2V0X2xhYmVsKGdwaW8sIGxhYmVsKTsKKworCWxvY2FsX2lycV9yZXN0b3JlX2h3KGZsYWdzKTsKKworCXBvcnRfc2V0dXAoZ3BpbywgR1BJT19VU0FHRSk7CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBiZmluX2dwaW9faXJxX2ZyZWUodW5zaWduZWQgZ3BpbykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKGNoZWNrX2dwaW8oZ3BpbykgPCAwKQorCQlyZXR1cm47CisKKwlsb2NhbF9pcnFfc2F2ZV9odyhmbGFncyk7CisKKwlpZiAodW5saWtlbHkoIShyZXNlcnZlZF9ncGlvX2lycV9tYXBbZ3Bpb19iYW5rKGdwaW8pXSAmIGdwaW9fYml0KGdwaW8pKSkpIHsKKwkJZHVtcF9zdGFjaygpOworCQlncGlvX2Vycm9yKGdwaW8pOworCQlsb2NhbF9pcnFfcmVzdG9yZV9odyhmbGFncyk7CisJCXJldHVybjsKKwl9CisKKwlyZXNlcnZlZF9ncGlvX2lycV9tYXBbZ3Bpb19iYW5rKGdwaW8pXSAmPSB+Z3Bpb19iaXQoZ3Bpbyk7CisKKwlzZXRfbGFiZWwoZ3BpbywgImZyZWUiKTsKKworCWxvY2FsX2lycV9yZXN0b3JlX2h3KGZsYWdzKTsKK30KIAogCiAjaWZkZWYgQkY1NDhfRkFNSUxZCi1pbnQgZ3Bpb19kaXJlY3Rpb25faW5wdXQodW5zaWduZWQgZ3BpbykKK2ludCBiZmluX2dwaW9fZGlyZWN0aW9uX2lucHV0KHVuc2lnbmVkIGdwaW8pCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIApAQCAtMTE3NiwxNiArMTE2OSwxNiBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJbG9jYWxfaXJxX3NhdmVfaHcoZmxhZ3MpOwogCWdwaW9fYXJyYXlbZ3Bpb19iYW5rKGdwaW8pXS0+cG9ydF9kaXJfY2xlYXIgPSBncGlvX2JpdChncGlvKTsKIAlncGlvX2FycmF5W2dwaW9fYmFuayhncGlvKV0tPnBvcnRfaW5lbiB8PSBncGlvX2JpdChncGlvKTsKLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJbG9jYWxfaXJxX3Jlc3RvcmVfaHcoZmxhZ3MpOwogCiAJcmV0dXJuIDA7CiB9Ci1FWFBPUlRfU1lNQk9MKGdwaW9fZGlyZWN0aW9uX2lucHV0KTsKK0VYUE9SVF9TWU1CT0woYmZpbl9ncGlvX2RpcmVjdGlvbl9pbnB1dCk7CiAKLWludCBncGlvX2RpcmVjdGlvbl9vdXRwdXQodW5zaWduZWQgZ3BpbywgaW50IHZhbHVlKQoraW50IGJmaW5fZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KHVuc2lnbmVkIGdwaW8sIGludCB2YWx1ZSkKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCkBAIC0xMTk0LDMwICsxMTg3LDMwIEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwlsb2NhbF9pcnFfc2F2ZV9odyhmbGFncyk7CiAJZ3Bpb19hcnJheVtncGlvX2JhbmsoZ3BpbyldLT5wb3J0X2luZW4gJj0gfmdwaW9fYml0KGdwaW8pOwogCWdwaW9fc2V0X3ZhbHVlKGdwaW8sIHZhbHVlKTsKIAlncGlvX2FycmF5W2dwaW9fYmFuayhncGlvKV0tPnBvcnRfZGlyX3NldCA9IGdwaW9fYml0KGdwaW8pOwotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwlsb2NhbF9pcnFfcmVzdG9yZV9odyhmbGFncyk7CiAKIAlyZXR1cm4gMDsKIH0KLUVYUE9SVF9TWU1CT0woZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KTsKK0VYUE9SVF9TWU1CT0woYmZpbl9ncGlvX2RpcmVjdGlvbl9vdXRwdXQpOwogCi12b2lkIGdwaW9fc2V0X3ZhbHVlKHVuc2lnbmVkIGdwaW8sIGludCBhcmcpCit2b2lkIGJmaW5fZ3Bpb19zZXRfdmFsdWUodW5zaWduZWQgZ3BpbywgaW50IGFyZykKIHsKIAlpZiAoYXJnKQogCQlncGlvX2FycmF5W2dwaW9fYmFuayhncGlvKV0tPnBvcnRfc2V0ID0gZ3Bpb19iaXQoZ3Bpbyk7CiAJZWxzZQogCQlncGlvX2FycmF5W2dwaW9fYmFuayhncGlvKV0tPnBvcnRfY2xlYXIgPSBncGlvX2JpdChncGlvKTsKIH0KLUVYUE9SVF9TWU1CT0woZ3Bpb19zZXRfdmFsdWUpOworRVhQT1JUX1NZTUJPTChiZmluX2dwaW9fc2V0X3ZhbHVlKTsKIAotaW50IGdwaW9fZ2V0X3ZhbHVlKHVuc2lnbmVkIGdwaW8pCitpbnQgYmZpbl9ncGlvX2dldF92YWx1ZSh1bnNpZ25lZCBncGlvKQogewogCXJldHVybiAoMSAmIChncGlvX2FycmF5W2dwaW9fYmFuayhncGlvKV0tPnBvcnRfZGF0YSA+PiBncGlvX3N1Yl9uKGdwaW8pKSk7CiB9Ci1FWFBPUlRfU1lNQk9MKGdwaW9fZ2V0X3ZhbHVlKTsKK0VYUE9SVF9TWU1CT0woYmZpbl9ncGlvX2dldF92YWx1ZSk7CiAKIHZvaWQgYmZpbl9ncGlvX2lycV9wcmVwYXJlKHVuc2lnbmVkIGdwaW8pCiB7CkBAIC0xMjI1LDM0ICsxMjE4LDM0IEBACiAKIAlwb3J0X3NldHVwKGdwaW8sIEdQSU9fVVNBR0UpOwogCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCWxvY2FsX2lycV9zYXZlX2h3KGZsYWdzKTsKIAlncGlvX2FycmF5W2dwaW9fYmFuayhncGlvKV0tPnBvcnRfZGlyX2NsZWFyID0gZ3Bpb19iaXQoZ3Bpbyk7CiAJZ3Bpb19hcnJheVtncGlvX2JhbmsoZ3BpbyldLT5wb3J0X2luZW4gfD0gZ3Bpb19iaXQoZ3Bpbyk7Ci0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCWxvY2FsX2lycV9yZXN0b3JlX2h3KGZsYWdzKTsKIH0KIAogI2Vsc2UKIAotaW50IGdwaW9fZ2V0X3ZhbHVlKHVuc2lnbmVkIGdwaW8pCitpbnQgYmZpbl9ncGlvX2dldF92YWx1ZSh1bnNpZ25lZCBncGlvKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IHJldDsKIAogCWlmICh1bmxpa2VseShnZXRfZ3Bpb19lZGdlKGdwaW8pKSkgewotCQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJCWxvY2FsX2lycV9zYXZlX2h3KGZsYWdzKTsKIAkJc2V0X2dwaW9fZWRnZShncGlvLCAwKTsKIAkJcmV0ID0gZ2V0X2dwaW9fZGF0YShncGlvKTsKIAkJc2V0X2dwaW9fZWRnZShncGlvLCAxKTsKLQkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCQlsb2NhbF9pcnFfcmVzdG9yZV9odyhmbGFncyk7CiAKIAkJcmV0dXJuIHJldDsKIAl9IGVsc2UKIAkJcmV0dXJuIGdldF9ncGlvX2RhdGEoZ3Bpbyk7CiB9Ci1FWFBPUlRfU1lNQk9MKGdwaW9fZ2V0X3ZhbHVlKTsKK0VYUE9SVF9TWU1CT0woYmZpbl9ncGlvX2dldF92YWx1ZSk7CiAKIAotaW50IGdwaW9fZGlyZWN0aW9uX2lucHV0KHVuc2lnbmVkIGdwaW8pCitpbnQgYmZpbl9ncGlvX2RpcmVjdGlvbl9pbnB1dCh1bnNpZ25lZCBncGlvKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKQEAgLTEyNjEsMTcgKzEyNTQsMTcgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCWxvY2FsX2lycV9zYXZlX2h3KGZsYWdzKTsKIAlncGlvX2JhbmtiW2dwaW9fYmFuayhncGlvKV0tPmRpciAmPSB+Z3Bpb19iaXQoZ3Bpbyk7CiAJZ3Bpb19iYW5rYltncGlvX2JhbmsoZ3BpbyldLT5pbmVuIHw9IGdwaW9fYml0KGdwaW8pOwogCUFXQV9EVU1NWV9SRUFEKGluZW4pOwotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwlsb2NhbF9pcnFfcmVzdG9yZV9odyhmbGFncyk7CiAKIAlyZXR1cm4gMDsKIH0KLUVYUE9SVF9TWU1CT0woZ3Bpb19kaXJlY3Rpb25faW5wdXQpOworRVhQT1JUX1NZTUJPTChiZmluX2dwaW9fZGlyZWN0aW9uX2lucHV0KTsKIAotaW50IGdwaW9fZGlyZWN0aW9uX291dHB1dCh1bnNpZ25lZCBncGlvLCBpbnQgdmFsdWUpCitpbnQgYmZpbl9ncGlvX2RpcmVjdGlvbl9vdXRwdXQodW5zaWduZWQgZ3BpbywgaW50IHZhbHVlKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKQEAgLTEyODAsNyArMTI3Myw3IEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwlsb2NhbF9pcnFfc2F2ZV9odyhmbGFncyk7CiAJZ3Bpb19iYW5rYltncGlvX2JhbmsoZ3BpbyldLT5pbmVuICY9IH5ncGlvX2JpdChncGlvKTsKIAogCWlmICh2YWx1ZSkKQEAgLTEyOTAsMTEgKzEyODMsMTEgQEAKIAogCWdwaW9fYmFua2JbZ3Bpb19iYW5rKGdwaW8pXS0+ZGlyIHw9IGdwaW9fYml0KGdwaW8pOwogCUFXQV9EVU1NWV9SRUFEKGRpcik7Ci0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCWxvY2FsX2lycV9yZXN0b3JlX2h3KGZsYWdzKTsKIAogCXJldHVybiAwOwogfQotRVhQT1JUX1NZTUJPTChncGlvX2RpcmVjdGlvbl9vdXRwdXQpOworRVhQT1JUX1NZTUJPTChiZmluX2dwaW9fZGlyZWN0aW9uX291dHB1dCk7CiAKIC8qIElmIHdlIGFyZSBib290aW5nIGZyb20gU1BJIGFuZCBvdXIgYm9hcmQgbGFja3MgYSBzdHJvbmcgZW5vdWdoIHB1bGwgdXAsCiAgKiB0aGUgY29yZSBjYW4gcmVzZXQgYW5kIGV4ZWN1dGUgdGhlIGJvb3Ryb20gZmFzdGVyIHRoYW4gdGhlIHJlc2lzdG9yIGNhbgpAQCAtMTMyNywxNCArMTMyMCwxNyBAQAogc3RhdGljIGludCBncGlvX3Byb2NfcmVhZChjaGFyICpidWYsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2Zmc2V0LAogCQkJICBpbnQgbGVuLCBpbnQgKnVudXNlZF9pLCB2b2lkICp1bnVzZWRfdikKIHsKLQlpbnQgYywgb3V0bGVuID0gMDsKKwlpbnQgYywgaXJxLCBncGlvLCBvdXRsZW4gPSAwOwogCiAJZm9yIChjID0gMDsgYyA8IE1BWF9SRVNPVVJDRVM7IGMrKykgewotCQlpZiAoIWNoZWNrX2dwaW8oYykgJiYgKHJlc2VydmVkX2dwaW9fbWFwW2dwaW9fYmFuayhjKV0gJiBncGlvX2JpdChjKSkpCi0JCQlsZW4gPSBzcHJpbnRmKGJ1ZiwgIkdQSU9fJWQ6ICVzIFx0XHRHUElPICVzXG4iLCBjLAotCQkJCSBnZXRfbGFiZWwoYyksIGdldF9ncGlvX2RpcihjKSA/ICJPVVRQVVQiIDogIklOUFVUIik7CisJCWlycSA9IHJlc2VydmVkX2dwaW9faXJxX21hcFtncGlvX2JhbmsoYyldICYgZ3Bpb19iaXQoYyk7CisJCWdwaW8gPSByZXNlcnZlZF9ncGlvX21hcFtncGlvX2JhbmsoYyldICYgZ3Bpb19iaXQoYyk7CisJCWlmICghY2hlY2tfZ3BpbyhjKSAmJiAoZ3BpbyB8fCBpcnEpKQorCQkJbGVuID0gc3ByaW50ZihidWYsICJHUElPXyVkOiBcdCVzJXMgXHRcdEdQSU8gJXNcbiIsIGMsCisJCQkJIGdldF9sYWJlbChjKSwgKGdwaW8gJiYgaXJxKSA/ICIgKiIgOiAiIiwKKwkJCQkgZ2V0X2dwaW9fZGlyKGMpID8gIk9VVFBVVCIgOiAiSU5QVVQiKTsKIAkJZWxzZSBpZiAocmVzZXJ2ZWRfcGVyaV9tYXBbZ3Bpb19iYW5rKGMpXSAmIGdwaW9fYml0KGMpKQotCQkJbGVuID0gc3ByaW50ZihidWYsICJHUElPXyVkOiAlcyBcdFx0UGVyaXBoZXJhbFxuIiwgYywgZ2V0X2xhYmVsKGMpKTsKKwkJCWxlbiA9IHNwcmludGYoYnVmLCAiR1BJT18lZDogXHQlcyBcdFx0UGVyaXBoZXJhbFxuIiwgYywgZ2V0X2xhYmVsKGMpKTsKIAkJZWxzZQogCQkJY29udGludWU7CiAJCWJ1ZiArPSBsZW47CkBAIC0xMzU0LDMgKzEzNTAsNTcgQEAKIH0KIF9faW5pdGNhbGwoZ3Bpb19yZWdpc3Rlcl9wcm9jKTsKICNlbmRpZgorCisjaWZkZWYgQ09ORklHX0dQSU9MSUIKK2ludCBiZmluX2dwaW9saWJfZGlyZWN0aW9uX2lucHV0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIGdwaW8pCit7CisJcmV0dXJuIGJmaW5fZ3Bpb19kaXJlY3Rpb25faW5wdXQoZ3Bpbyk7Cit9CisKK2ludCBiZmluX2dwaW9saWJfZGlyZWN0aW9uX291dHB1dChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBncGlvLCBpbnQgbGV2ZWwpCit7CisJcmV0dXJuIGJmaW5fZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KGdwaW8sIGxldmVsKTsKK30KKworaW50IGJmaW5fZ3Bpb2xpYl9nZXRfdmFsdWUoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgZ3BpbykKK3sKKwlyZXR1cm4gYmZpbl9ncGlvX2dldF92YWx1ZShncGlvKTsKK30KKwordm9pZCBiZmluX2dwaW9saWJfc2V0X3ZhbHVlKHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIGdwaW8sIGludCB2YWx1ZSkKK3sKKyNpZmRlZiBCRjU0OF9GQU1JTFkKKwlyZXR1cm4gYmZpbl9ncGlvX3NldF92YWx1ZShncGlvLCB2YWx1ZSk7CisjZWxzZQorCXJldHVybiBzZXRfZ3Bpb19kYXRhKGdwaW8sIHZhbHVlKTsKKyNlbmRpZgorfQorCitpbnQgYmZpbl9ncGlvbGliX2dwaW9fcmVxdWVzdChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBncGlvKQoreworCXJldHVybiBiZmluX2dwaW9fcmVxdWVzdChncGlvLCBjaGlwLT5sYWJlbCk7Cit9CisKK3ZvaWQgYmZpbl9ncGlvbGliX2dwaW9fZnJlZShzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBncGlvKQoreworCXJldHVybiBiZmluX2dwaW9fZnJlZShncGlvKTsKK30KKworc3RhdGljIHN0cnVjdCBncGlvX2NoaXAgYmZpbl9jaGlwID0geworCS5sYWJlbAkJCT0gIkJsYWNrZmluLUdQSU9saWIiLAorCS5kaXJlY3Rpb25faW5wdXQJPSBiZmluX2dwaW9saWJfZGlyZWN0aW9uX2lucHV0LAorCS5nZXQJCQk9IGJmaW5fZ3Bpb2xpYl9nZXRfdmFsdWUsCisJLmRpcmVjdGlvbl9vdXRwdXQJPSBiZmluX2dwaW9saWJfZGlyZWN0aW9uX291dHB1dCwKKwkuc2V0CQkJPSBiZmluX2dwaW9saWJfc2V0X3ZhbHVlLAorCS5yZXF1ZXN0CQk9IGJmaW5fZ3Bpb2xpYl9ncGlvX3JlcXVlc3QsCisJLmZyZWUJCQk9IGJmaW5fZ3Bpb2xpYl9ncGlvX2ZyZWUsCisJLmJhc2UJCQk9IDAsCisJLm5ncGlvCQkJPSBNQVhfQkxBQ0tGSU5fR1BJT1MsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBiZmluX2dwaW9saWJfc2V0dXAodm9pZCkKK3sKKwlyZXR1cm4gZ3Bpb2NoaXBfYWRkKCZiZmluX2NoaXApOworfQorYXJjaF9pbml0Y2FsbChiZmluX2dwaW9saWJfc2V0dXApOworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2tlcm5lbC9iZmluX2tzeW1zLmMgYi9hcmNoL2JsYWNrZmluL2tlcm5lbC9iZmluX2tzeW1zLmMKaW5kZXggNDM2NzMzMC4uMDFmOTE3ZCAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9rZXJuZWwvYmZpbl9rc3ltcy5jCisrKyBiL2FyY2gvYmxhY2tmaW4va2VybmVsL2JmaW5fa3N5bXMuYwpAQCAtMSw1MiArMSwyNSBAQAogLyoKLSAqIEZpbGU6ICAgICAgICAgYXJjaC9ibGFja2Zpbi9rZXJuZWwvYmZpbl9rc3ltcy5jCi0gKiBCYXNlZCBvbjogICAgIG5vbmUgLSBvcmlnaW5hbCB3b3JrCi0gKiBBdXRob3I6CisgKiBhcmNoL2JsYWNrZmluL2tlcm5lbC9iZmluX2tzeW1zLmMgLSBleHBvcnRzIGZvciByYW5kb20gc3ltYm9scwogICoKLSAqIENyZWF0ZWQ6Ci0gKiBEZXNjcmlwdGlvbjoKKyAqIENvcHlyaWdodCAyMDA0LTIwMDggQW5hbG9nIERldmljZXMgSW5jLgogICoKLSAqIE1vZGlmaWVkOgotICogICAgICAgICAgICAgICBDb3B5cmlnaHQgMjAwNC0yMDA2IEFuYWxvZyBEZXZpY2VzIEluYy4KLSAqCi0gKiBCdWdzOiAgICAgICAgIEVudGVyIGJ1Z3MgYXQgaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnLwotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIHRoZSBmaWxlIENPUFlJTkcsIG9yIHdyaXRlCi0gKiB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICogNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KICAqLwogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvaXJxLmg+CiAjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgogCi0jaW5jbHVkZSA8YXNtL2NoZWNrc3VtLmg+CiAjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KIAotLyogcGxhdGZvcm0gZGVwZW5kZW50IHN1cHBvcnQgKi8KLQotRVhQT1JUX1NZTUJPTChfX2lvcmVtYXApOwotCi1FWFBPUlRfU1lNQk9MKGlwX2Zhc3RfY3N1bSk7Ci0KLUVYUE9SVF9TWU1CT0woa2VybmVsX3RocmVhZCk7Ci0KLUVYUE9SVF9TWU1CT0woaXNfaW5fcm9tKTsKKy8qIEFsbG93IHBlb3BsZSB0byBoYXZlIHRoZWlyIG93biBCbGFja2ZpbiBleGNlcHRpb24gaGFuZGxlciBpbiBhIG1vZHVsZSAqLwogRVhQT1JUX1NZTUJPTChiZmluX3JldHVybl9mcm9tX2V4Y2VwdGlvbik7CiAKLS8qIE5ldHdvcmtpbmcgaGVscGVyIHJvdXRpbmVzLiAqLwotRVhQT1JUX1NZTUJPTChjc3VtX3BhcnRpYWxfY29weSk7CisvKiBBbGwgdGhlIEJsYWNrZmluIGNhY2hlIGZ1bmN0aW9uczogbWFjaC1jb21tb24vY2FjaGUuUyAqLworRVhQT1JUX1NZTUJPTChibGFja2Zpbl9kY2FjaGVfaW52YWxpZGF0ZV9yYW5nZSk7CitFWFBPUlRfU1lNQk9MKGJsYWNrZmluX2ljYWNoZV9kY2FjaGVfZmx1c2hfcmFuZ2UpOworRVhQT1JUX1NZTUJPTChibGFja2Zpbl9pY2FjaGVfZmx1c2hfcmFuZ2UpOworRVhQT1JUX1NZTUJPTChibGFja2Zpbl9kY2FjaGVfZmx1c2hfcmFuZ2UpOworRVhQT1JUX1NZTUJPTChibGFja2Zpbl9kZmx1c2hfcGFnZSk7CiAKIC8qIFRoZSBmb2xsb3dpbmcgYXJlIHNwZWNpYWwgYmVjYXVzZSB0aGV5J3JlIG5vdCBjYWxsZWQKICAqIGV4cGxpY2l0bHkgKHRoZSBDIGNvbXBpbGVyIGdlbmVyYXRlcyB0aGVtKS4gIEZvcnR1bmF0ZWx5LApAQCAtNzQsOCArNDcsNiBAQAogZXh0ZXJuIHZvaWQgX19tdWxkaTModm9pZCk7CiBleHRlcm4gdm9pZCBfX3VkaXZzaTModm9pZCk7CiBleHRlcm4gdm9pZCBfX3Vtb2RzaTModm9pZCk7Ci0KLS8qIGdjYyBsaWIgZnVuY3Rpb25zICovCiBFWFBPUlRfU1lNQk9MKF9fYXNobGRpMyk7CiBFWFBPUlRfU1lNQk9MKF9fYXNocmRpMyk7CiBFWFBPUlRfU1lNQk9MKF9fdW11bHNpM19oaWdocGFydCk7CkBAIC04Nyw2ICs1OCw3IEBACiBFWFBPUlRfU1lNQk9MKF9fdWRpdnNpMyk7CiBFWFBPUlRfU1lNQk9MKF9fdW1vZHNpMyk7CiAKKy8qIElucHV0L291dHB1dCBzeW1ib2xzOiBsaWIve2luLG91dH1zLlMgKi8KIEVYUE9SVF9TWU1CT0wob3V0c2IpOwogRVhQT1JUX1NZTUJPTChpbnNiKTsKIEVYUE9SVF9TWU1CT0wob3V0c3cpOwpAQCAtOTYsMjAgKzY4LDM5IEBACiBFWFBPUlRfU1lNQk9MKG91dHNsKTsKIEVYUE9SVF9TWU1CT0woaW5zbCk7CiBFWFBPUlRfU1lNQk9MKGluc2xfMTYpOwotRVhQT1JUX1NZTUJPTChpcnFfZmxhZ3MpOwotRVhQT1JUX1NZTUJPTChpb3VubWFwKTsKLUVYUE9SVF9TWU1CT0woYmxhY2tmaW5fZGNhY2hlX2ludmFsaWRhdGVfcmFuZ2UpOwotRVhQT1JUX1NZTUJPTChibGFja2Zpbl9pY2FjaGVfZGNhY2hlX2ZsdXNoX3JhbmdlKTsKLUVYUE9SVF9TWU1CT0woYmxhY2tmaW5faWNhY2hlX2ZsdXNoX3JhbmdlKTsKLUVYUE9SVF9TWU1CT0woYmxhY2tmaW5fZGNhY2hlX2ZsdXNoX3JhbmdlKTsKLUVYUE9SVF9TWU1CT0woYmxhY2tmaW5fZGZsdXNoX3BhZ2UpOwogCi1FWFBPUlRfU1lNQk9MKGNzdW1fcGFydGlhbCk7Ci1FWFBPUlRfU1lNQk9MKF9faW5pdF9iZWdpbik7Ci1FWFBPUlRfU1lNQk9MKF9faW5pdF9lbmQpOwotRVhQT1JUX1NZTUJPTChfZWJzc19sMSk7Ci1FWFBPUlRfU1lNQk9MKF9zdGV4dF9sMSk7Ci1FWFBPUlRfU1lNQk9MKF9ldGV4dF9sMSk7Ci1FWFBPUlRfU1lNQk9MKF9zZGF0YV9sMSk7Ci1FWFBPUlRfU1lNQk9MKF9lYnNzX2JfbDEpOwotRVhQT1JUX1NZTUJPTChfc2RhdGFfYl9sMSk7CisjaWZkZWYgQ09ORklHX1NNUAorRVhQT1JUX1NZTUJPTChfX3Jhd19hdG9taWNfdXBkYXRlX2FzbSk7CitFWFBPUlRfU1lNQk9MKF9fcmF3X2F0b21pY19jbGVhcl9hc20pOworRVhQT1JUX1NZTUJPTChfX3Jhd19hdG9taWNfc2V0X2FzbSk7CitFWFBPUlRfU1lNQk9MKF9fcmF3X2F0b21pY194b3JfYXNtKTsKK0VYUE9SVF9TWU1CT0woX19yYXdfYXRvbWljX3Rlc3RfYXNtKTsKK0VYUE9SVF9TWU1CT0woX19yYXdfeGNoZ18xX2FzbSk7CitFWFBPUlRfU1lNQk9MKF9fcmF3X3hjaGdfMl9hc20pOworRVhQT1JUX1NZTUJPTChfX3Jhd194Y2hnXzRfYXNtKTsKK0VYUE9SVF9TWU1CT0woX19yYXdfY21weGNoZ18xX2FzbSk7CitFWFBPUlRfU1lNQk9MKF9fcmF3X2NtcHhjaGdfMl9hc20pOworRVhQT1JUX1NZTUJPTChfX3Jhd19jbXB4Y2hnXzRfYXNtKTsKK0VYUE9SVF9TWU1CT0woX19yYXdfc3Bpbl9pc19sb2NrZWRfYXNtKTsKK0VYUE9SVF9TWU1CT0woX19yYXdfc3Bpbl9sb2NrX2FzbSk7CitFWFBPUlRfU1lNQk9MKF9fcmF3X3NwaW5fdHJ5bG9ja19hc20pOworRVhQT1JUX1NZTUJPTChfX3Jhd19zcGluX3VubG9ja19hc20pOworRVhQT1JUX1NZTUJPTChfX3Jhd19yZWFkX2xvY2tfYXNtKTsKK0VYUE9SVF9TWU1CT0woX19yYXdfcmVhZF90cnlsb2NrX2FzbSk7CitFWFBPUlRfU1lNQk9MKF9fcmF3X3JlYWRfdW5sb2NrX2FzbSk7CitFWFBPUlRfU1lNQk9MKF9fcmF3X3dyaXRlX2xvY2tfYXNtKTsKK0VYUE9SVF9TWU1CT0woX19yYXdfd3JpdGVfdHJ5bG9ja19hc20pOworRVhQT1JUX1NZTUJPTChfX3Jhd193cml0ZV91bmxvY2tfYXNtKTsKK0VYUE9SVF9TWU1CT0woX19yYXdfYml0X3NldF9hc20pOworRVhQT1JUX1NZTUJPTChfX3Jhd19iaXRfY2xlYXJfYXNtKTsKK0VYUE9SVF9TWU1CT0woX19yYXdfYml0X3RvZ2dsZV9hc20pOworRVhQT1JUX1NZTUJPTChfX3Jhd19iaXRfdGVzdF9hc20pOworRVhQT1JUX1NZTUJPTChfX3Jhd19iaXRfdGVzdF9zZXRfYXNtKTsKK0VYUE9SVF9TWU1CT0woX19yYXdfYml0X3Rlc3RfY2xlYXJfYXNtKTsKK0VYUE9SVF9TWU1CT0woX19yYXdfYml0X3Rlc3RfdG9nZ2xlX2FzbSk7CitFWFBPUlRfU1lNQk9MKF9fcmF3X3VuY2FjaGVkX2ZldGNoX2FzbSk7CisjaWZkZWYgX19BUkNIX1NZTkNfQ09SRV9EQ0FDSEUKK0VYUE9SVF9TWU1CT0woX19yYXdfc21wX21hcmtfYmFycmllcl9hc20pOworRVhQT1JUX1NZTUJPTChfX3Jhd19zbXBfY2hlY2tfYmFycmllcl9hc20pOworI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4va2VybmVsL2NwbGItbXB1L01ha2VmaWxlIGIvYXJjaC9ibGFja2Zpbi9rZXJuZWwvY3BsYi1tcHUvTWFrZWZpbGUKaW5kZXggMjg2YjY5My4uN2Q3MGQzYiAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9rZXJuZWwvY3BsYi1tcHUvTWFrZWZpbGUKKysrIGIvYXJjaC9ibGFja2Zpbi9rZXJuZWwvY3BsYi1tcHUvTWFrZWZpbGUKQEAgLTQsNSArNCw3IEBACiAKIG9iai15IDo9IGNwbGJpbml0Lm8gY2FjaGVpbml0Lm8gY3BsYm1nci5vCiAKLW9iai0kKENPTkZJR19DUExCX0lORk8pICs9IGNwbGJpbmZvLm8KLQorQ0ZMQUdTX2NwbGJtZ3IubyA6PSAtZmZpeGVkLUkwIC1mZml4ZWQtSTEgLWZmaXhlZC1JMiAtZmZpeGVkLUkzIFwKKwkJICAgIC1mZml4ZWQtTDAgLWZmaXhlZC1MMSAtZmZpeGVkLUwyIC1mZml4ZWQtTDMgXAorCQkgICAgLWZmaXhlZC1NMCAtZmZpeGVkLU0xIC1mZml4ZWQtTTIgLWZmaXhlZC1NMyBcCisJCSAgICAtZmZpeGVkLUIwIC1mZml4ZWQtQjEgLWZmaXhlZC1CMiAtZmZpeGVkLUIzCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2tlcm5lbC9jcGxiLW1wdS9jYWNoZWluaXQuYyBiL2FyY2gvYmxhY2tmaW4va2VybmVsL2NwbGItbXB1L2NhY2hlaW5pdC5jCmluZGV4IGE4YjcxMmEuLmM2ZmY5NDcgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4va2VybmVsL2NwbGItbXB1L2NhY2hlaW5pdC5jCisrKyBiL2FyY2gvYmxhY2tmaW4va2VybmVsL2NwbGItbXB1L2NhY2hlaW5pdC5jCkBAIC0yNSw3ICsyNSw3IEBACiAjaW5jbHVkZSA8YXNtL2NwbGJpbml0Lmg+CiAKICNpZiBkZWZpbmVkKENPTkZJR19CRklOX0lDQUNIRSkKLXZvaWQgX19pbml0IGJmaW5faWNhY2hlX2luaXQodm9pZCkKK3ZvaWQgX19jcHVpbml0IGJmaW5faWNhY2hlX2luaXQoc3RydWN0IGNwbGJfZW50cnkgKmljcGxiX3RibCkKIHsKIAl1bnNpZ25lZCBsb25nIGN0cmw7CiAJaW50IGk7CkBAIC00Myw3ICs0Myw3IEBACiAjZW5kaWYKIAogI2lmIGRlZmluZWQoQ09ORklHX0JGSU5fRENBQ0hFKQotdm9pZCBfX2luaXQgYmZpbl9kY2FjaGVfaW5pdCh2b2lkKQordm9pZCBfX2NwdWluaXQgYmZpbl9kY2FjaGVfaW5pdChzdHJ1Y3QgY3BsYl9lbnRyeSAqZGNwbGJfdGJsKQogewogCXVuc2lnbmVkIGxvbmcgY3RybDsKIAlpbnQgaTsKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4va2VybmVsL2NwbGItbXB1L2NwbGJpbmZvLmMgYi9hcmNoL2JsYWNrZmluL2tlcm5lbC9jcGxiLW1wdS9jcGxiaW5mby5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjJiZWVmLi4wMDAwMDAwCi0tLSBhL2FyY2gvYmxhY2tmaW4va2VybmVsL2NwbGItbXB1L2NwbGJpbmZvLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLyoKLSAqIEZpbGU6ICAgICAgICAgYXJjaC9ibGFja2Zpbi9tYWNoLWNvbW1vbi9jcGxiaW5mby5jCi0gKiBCYXNlZCBvbjoKLSAqIEF1dGhvcjogICAgICAgU29uaWMgWmhhbmcgPHNvbmljLnpoYW5nQGFuYWxvZy5jb20+Ci0gKgotICogQ3JlYXRlZDogICAgICBKYW4uIDIwMDUKLSAqIERlc2NyaXB0aW9uOiAgRGlzcGxheSBDUExCIHN0YXR1cwotICoKLSAqIE1vZGlmaWVkOgotICogICAgICAgICAgICAgICBDb3B5cmlnaHQgMjAwNC0yMDA2IEFuYWxvZyBEZXZpY2VzIEluYy4KLSAqCi0gKiBCdWdzOiAgICAgICAgIEVudGVyIGJ1Z3MgYXQgaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnLwotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIHRoZSBmaWxlIENPUFlJTkcsIG9yIHdyaXRlCi0gKiB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICogNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KLSNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+Ci0KLSNpbmNsdWRlIDxhc20vY3VycmVudC5oPgotI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KLSNpbmNsdWRlIDxhc20vY3BsYi5oPgotI2luY2x1ZGUgPGFzbS9jcGxiaW5pdC5oPgotI2luY2x1ZGUgPGFzbS9ibGFja2Zpbi5oPgotCi1zdGF0aWMgY2hhciBwYWdlX3NpemVfc3RyaW5nX3RhYmxlW11bNF0gPSB7ICIxSyIsICI0SyIsICIxTSIsICI0TSIgfTsKLQotc3RhdGljIGNoYXIgKmNwbGJfcHJpbnRfZW50cnkoY2hhciAqYnVmLCBzdHJ1Y3QgY3BsYl9lbnRyeSAqdGJsLCBpbnQgc3dpdGNoZWQpCi17Ci0JaW50IGk7Ci0JYnVmICs9IHNwcmludGYoYnVmLCAiSW5kZXhcdEFkZHJlc3NcdFx0RGF0YVx0U2l6ZVx0VS9SRFx0VS9XUlx0Uy9XUlx0U3dpdGNoXG4iKTsKLQlmb3IgKGkgPSAwOyBpIDwgTUFYX0NQTEJTOyBpKyspIHsKLQkJdW5zaWduZWQgbG9uZyBkYXRhID0gdGJsW2ldLmRhdGE7Ci0JCXVuc2lnbmVkIGxvbmcgYWRkciA9IHRibFtpXS5hZGRyOwotCQlpZiAoIShkYXRhICYgQ1BMQl9WQUxJRCkpCi0JCQljb250aW51ZTsKLQotCQlidWYgKz0KLQkJICAgIHNwcmludGYoYnVmLAotCQkJICAgICIlZFx0MHglMDhseFx0JTA2bHhcdCVzXHQlY1x0JWNcdCVjXHQlY1xuIiwKLQkJCSAgICBpLCBhZGRyLCBkYXRhLAotCQkJICAgIHBhZ2Vfc2l6ZV9zdHJpbmdfdGFibGVbKGRhdGEgJiAweDMwMDAwKSA+PiAxNl0sCi0JCQkgICAgKGRhdGEgJiBDUExCX1VTRVJfUkQpID8gJ1knIDogJ04nLAotCQkJICAgIChkYXRhICYgQ1BMQl9VU0VSX1dSKSA/ICdZJyA6ICdOJywKLQkJCSAgICAoZGF0YSAmIENQTEJfU1VQVl9XUikgPyAnWScgOiAnTicsCi0JCQkgICAgaSA8IHN3aXRjaGVkID8gJ04nIDogJ1knKTsKLQl9Ci0JYnVmICs9IHNwcmludGYoYnVmLCAiXG4iKTsKLQotCXJldHVybiBidWY7Ci19Ci0KLWludCBjcGxiaW5mb19wcm9jX291dHB1dChjaGFyICpidWYpCi17Ci0JY2hhciAqcDsKLQotCXAgPSBidWY7Ci0KLQlwICs9IHNwcmludGYocCwgIi0tLS0tLS0tLS0tLS0tLS0tLSBDUExCIEluZm9ybWF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLVxuXG4iKTsKLQotCWlmIChiZmluX3JlYWRfSU1FTV9DT05UUk9MKCkgJiBFTklDUExCKSB7Ci0JCXAgKz0gc3ByaW50ZihwLCAiSW5zdHJ1Y3Rpb24gQ1BMQiBlbnRyeTpcbiIpOwotCQlwID0gY3BsYl9wcmludF9lbnRyeShwLCBpY3BsYl90YmwsIGZpcnN0X3N3aXRjaGVkX2ljcGxiKTsKLQl9IGVsc2UKLQkJcCArPSBzcHJpbnRmKHAsICJJbnN0cnVjdGlvbiBDUExCIGlzIGRpc2FibGVkLlxuXG4iKTsKLQotCWlmICgxIHx8IGJmaW5fcmVhZF9ETUVNX0NPTlRST0woKSAmIEVORENQTEIpIHsKLQkJcCArPSBzcHJpbnRmKHAsICJEYXRhIENQTEIgZW50cnk6XG4iKTsKLQkJcCA9IGNwbGJfcHJpbnRfZW50cnkocCwgZGNwbGJfdGJsLCBmaXJzdF9zd2l0Y2hlZF9kY3BsYik7Ci0JfSBlbHNlCi0JCXAgKz0gc3ByaW50ZihwLCAiRGF0YSBDUExCIGlzIGRpc2FibGVkLlxuIik7Ci0KLQlwICs9IHNwcmludGYocCwgIklDUExCIG1pc3M6ICVkXG5JQ1BMQiBzdXBlcnZpc29yIG1pc3M6ICVkXG4iLAotCQkgICAgIG5yX2ljcGxiX21pc3MsIG5yX2ljcGxiX3N1cHZfbWlzcyk7Ci0JcCArPSBzcHJpbnRmKHAsICJEQ1BMQiBtaXNzOiAlZFxuRENQTEIgcHJvdGVjdGlvbiBmYXVsdDolZFxuIiwKLQkJICAgICBucl9kY3BsYl9taXNzLCBucl9kY3BsYl9wcm90KTsKLQlwICs9IHNwcmludGYocCwgIkNQTEIgZmx1c2hlczogJWRcbiIsCi0JCSAgICAgbnJfY3BsYl9mbHVzaCk7Ci0KLQlyZXR1cm4gcCAtIGJ1ZjsKLX0KLQotc3RhdGljIGludCBjcGxiaW5mb19yZWFkX3Byb2MoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmYsCi0JCQkgICAgICBpbnQgY291bnQsIGludCAqZW9mLCB2b2lkICpkYXRhKQotewotCWludCBsZW47Ci0KLQlsZW4gPSBjcGxiaW5mb19wcm9jX291dHB1dChwYWdlKTsKLQlpZiAobGVuIDw9IG9mZiArIGNvdW50KQotCQkqZW9mID0gMTsKLQkqc3RhcnQgPSBwYWdlICsgb2ZmOwotCWxlbiAtPSBvZmY7Ci0JaWYgKGxlbiA+IGNvdW50KQotCQlsZW4gPSBjb3VudDsKLQlpZiAobGVuIDwgMCkKLQkJbGVuID0gMDsKLQlyZXR1cm4gbGVuOwotfQotCi1zdGF0aWMgaW50IF9faW5pdCBjcGxiaW5mb19pbml0KHZvaWQpCi17Ci0Jc3RydWN0IHByb2NfZGlyX2VudHJ5ICplbnRyeTsKLQotCWVudHJ5ID0gY3JlYXRlX3Byb2NfZW50cnkoImNwbGJpbmZvIiwgMCwgTlVMTCk7Ci0JaWYgKCFlbnRyeSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQllbnRyeS0+cmVhZF9wcm9jID0gY3BsYmluZm9fcmVhZF9wcm9jOwotCWVudHJ5LT5kYXRhID0gTlVMTDsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgY3BsYmluZm9fZXhpdCh2b2lkKQotewotCXJlbW92ZV9wcm9jX2VudHJ5KCJjcGxiaW5mbyIsIE5VTEwpOwotfQotCi1tb2R1bGVfaW5pdChjcGxiaW5mb19pbml0KTsKLW1vZHVsZV9leGl0KGNwbGJpbmZvX2V4aXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9rZXJuZWwvY3BsYi1tcHUvY3BsYmluaXQuYyBiL2FyY2gvYmxhY2tmaW4va2VybmVsL2NwbGItbXB1L2NwbGJpbml0LmMKaW5kZXggNTVhZjcyOS4uYmRiOTU4NCAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9rZXJuZWwvY3BsYi1tcHUvY3BsYmluaXQuYworKysgYi9hcmNoL2JsYWNrZmluL2tlcm5lbC9jcGxiLW1wdS9jcGxiaW5pdC5jCkBAIC0yNSwxOCArMjUsMTkgQEAKICNpbmNsdWRlIDxhc20vYmxhY2tmaW4uaD4KICNpbmNsdWRlIDxhc20vY3BsYi5oPgogI2luY2x1ZGUgPGFzbS9jcGxiaW5pdC5oPgorI2luY2x1ZGUgPGFzbS9tZW1fbWFwLmg+CiAKICNpZiBBTk9NQUxZXzA1MDAwMjYzCiAjIGVycm9yIHRoZSBNUFUgd2lsbCBub3QgZnVuY3Rpb24gc2FmZWx5IHdoaWxlIEFub21hbHkgMDUwMDAyNjMgYXBwbGllcwogI2VuZGlmCiAKLXN0cnVjdCBjcGxiX2VudHJ5IGljcGxiX3RibFtNQVhfQ1BMQlNdOwotc3RydWN0IGNwbGJfZW50cnkgZGNwbGJfdGJsW01BWF9DUExCU107CitzdHJ1Y3QgY3BsYl9lbnRyeSBpY3BsYl90YmxbTlJfQ1BVU11bTUFYX0NQTEJTXTsKK3N0cnVjdCBjcGxiX2VudHJ5IGRjcGxiX3RibFtOUl9DUFVTXVtNQVhfQ1BMQlNdOwogCiBpbnQgZmlyc3Rfc3dpdGNoZWRfaWNwbGIsIGZpcnN0X3N3aXRjaGVkX2RjcGxiOwogaW50IGZpcnN0X21hc2tfZGNwbGI7CiAKLXZvaWQgX19pbml0IGdlbmVyYXRlX2NwbGJfdGFibGVzKHZvaWQpCit2b2lkIF9faW5pdCBnZW5lcmF0ZV9jcGxiX3RhYmxlc19jcHUodW5zaWduZWQgaW50IGNwdSkKIHsKIAlpbnQgaV9kLCBpX2k7CiAJdW5zaWduZWQgbG9uZyBhZGRyOwpAQCAtNTUsMTUgKzU2LDE2IEBACiAJZF9jYWNoZSB8PSBDUExCX0wxX0FPVyB8IENQTEJfV1Q7CiAjZW5kaWYKICNlbmRpZgorCiAJaV9kID0gaV9pID0gMDsKIAogCS8qIFNldCB1cCB0aGUgemVybyBwYWdlLiAgKi8KLQlkY3BsYl90YmxbaV9kXS5hZGRyID0gMDsKLQlkY3BsYl90YmxbaV9kKytdLmRhdGEgPSBTRFJBTV9PT1BTIHwgUEFHRV9TSVpFXzFLQjsKKwlkY3BsYl90YmxbY3B1XVtpX2RdLmFkZHIgPSAwOworCWRjcGxiX3RibFtjcHVdW2lfZCsrXS5kYXRhID0gU0RSQU1fT09QUyB8IFBBR0VfU0laRV8xS0I7CiAKICNpZiAwCi0JaWNwbGJfdGJsW2lfaV0uYWRkciA9IDA7Ci0JaWNwbGJfdGJsW2lfaSsrXS5kYXRhID0gaV9jYWNoZSB8IENQTEJfVVNFUl9SRCB8IFBBR0VfU0laRV80S0I7CisJaWNwbGJfdGJsW2NwdV1baV9pXS5hZGRyID0gMDsKKwlpY3BsYl90YmxbY3B1XVtpX2krK10uZGF0YSA9IGlfY2FjaGUgfCBDUExCX1VTRVJfUkQgfCBQQUdFX1NJWkVfNEtCOwogI2VuZGlmCiAKIAkvKiBDb3ZlciBrZXJuZWwgbWVtb3J5IHdpdGggNE0gcGFnZXMuICAqLwpAQCAtNzIsMjggKzc0LDI4IEBACiAJaV9kYXRhID0gaV9jYWNoZSB8IENQTEJfVkFMSUQgfCBDUExCX1BPUlRQUklPIHwgUEFHRV9TSVpFXzRNQjsKIAogCWZvciAoOyBhZGRyIDwgbWVtb3J5X3N0YXJ0OyBhZGRyICs9IDQgKiAxMDI0ICogMTAyNCkgewotCQlkY3BsYl90YmxbaV9kXS5hZGRyID0gYWRkcjsKLQkJZGNwbGJfdGJsW2lfZCsrXS5kYXRhID0gZF9kYXRhOwotCQlpY3BsYl90YmxbaV9pXS5hZGRyID0gYWRkcjsKLQkJaWNwbGJfdGJsW2lfaSsrXS5kYXRhID0gaV9kYXRhIHwgKGFkZHIgPT0gMCA/IENQTEJfVVNFUl9SRCA6IDApOworCQlkY3BsYl90YmxbY3B1XVtpX2RdLmFkZHIgPSBhZGRyOworCQlkY3BsYl90YmxbY3B1XVtpX2QrK10uZGF0YSA9IGRfZGF0YTsKKwkJaWNwbGJfdGJsW2NwdV1baV9pXS5hZGRyID0gYWRkcjsKKwkJaWNwbGJfdGJsW2NwdV1baV9pKytdLmRhdGEgPSBpX2RhdGEgfCAoYWRkciA9PSAwID8gQ1BMQl9VU0VSX1JEIDogMCk7CiAJfQogCiAJLyogQ292ZXIgTDEgbWVtb3J5LiAgT25lIDRNIGFyZWEgZm9yIGNvZGUgYW5kIGRhdGEgZWFjaCBpcyBlbm91Z2guICAqLwogI2lmIEwxX0RBVEFfQV9MRU5HVEggPiAwIHx8IEwxX0RBVEFfQl9MRU5HVEggPiAwCi0JZGNwbGJfdGJsW2lfZF0uYWRkciA9IEwxX0RBVEFfQV9TVEFSVDsKLQlkY3BsYl90YmxbaV9kKytdLmRhdGEgPSBMMV9ETUVNT1JZIHwgUEFHRV9TSVpFXzRNQjsKKwlkY3BsYl90YmxbY3B1XVtpX2RdLmFkZHIgPSBnZXRfbDFfZGF0YV9hX3N0YXJ0X2NwdShjcHUpOworCWRjcGxiX3RibFtjcHVdW2lfZCsrXS5kYXRhID0gTDFfRE1FTU9SWSB8IFBBR0VfU0laRV80TUI7CiAjZW5kaWYKICNpZiBMMV9DT0RFX0xFTkdUSCA+IDAKLQlpY3BsYl90YmxbaV9pXS5hZGRyID0gTDFfQ09ERV9TVEFSVDsKLQlpY3BsYl90YmxbaV9pKytdLmRhdGEgPSBMMV9JTUVNT1JZIHwgUEFHRV9TSVpFXzRNQjsKKwlpY3BsYl90YmxbY3B1XVtpX2ldLmFkZHIgPSBnZXRfbDFfY29kZV9zdGFydF9jcHUoY3B1KTsKKwlpY3BsYl90YmxbY3B1XVtpX2krK10uZGF0YSA9IEwxX0lNRU1PUlkgfCBQQUdFX1NJWkVfNE1COwogI2VuZGlmCiAKIAkvKiBDb3ZlciBMMiBtZW1vcnkgKi8KICNpZiBMMl9MRU5HVEggPiAwCi0JZGNwbGJfdGJsW2lfZF0uYWRkciA9IEwyX1NUQVJUOwotCWRjcGxiX3RibFtpX2QrK10uZGF0YSA9IEwyX0RNRU1PUlkgfCBQQUdFX1NJWkVfMU1COwotCWljcGxiX3RibFtpX2ldLmFkZHIgPSBMMl9TVEFSVDsKLQlpY3BsYl90YmxbaV9pKytdLmRhdGEgPSBMMl9JTUVNT1JZIHwgUEFHRV9TSVpFXzFNQjsKKwlkY3BsYl90YmxbY3B1XVtpX2RdLmFkZHIgPSBMMl9TVEFSVDsKKwlkY3BsYl90YmxbY3B1XVtpX2QrK10uZGF0YSA9IEwyX0RNRU1PUlkgfCBQQUdFX1NJWkVfMU1COworCWljcGxiX3RibFtjcHVdW2lfaV0uYWRkciA9IEwyX1NUQVJUOworCWljcGxiX3RibFtjcHVdW2lfaSsrXS5kYXRhID0gTDJfSU1FTU9SWSB8IFBBR0VfU0laRV8xTUI7CiAjZW5kaWYKIAogCWZpcnN0X21hc2tfZGNwbGIgPSBpX2Q7CkBAIC0xMDEsNyArMTAzLDExIEBACiAJZmlyc3Rfc3dpdGNoZWRfaWNwbGIgPSBpX2k7CiAKIAl3aGlsZSAoaV9kIDwgTUFYX0NQTEJTKQotCQlkY3BsYl90YmxbaV9kKytdLmRhdGEgPSAwOworCQlkY3BsYl90YmxbY3B1XVtpX2QrK10uZGF0YSA9IDA7CiAJd2hpbGUgKGlfaSA8IE1BWF9DUExCUykKLQkJaWNwbGJfdGJsW2lfaSsrXS5kYXRhID0gMDsKKwkJaWNwbGJfdGJsW2NwdV1baV9pKytdLmRhdGEgPSAwOworfQorCit2b2lkIGdlbmVyYXRlX2NwbGJfdGFibGVzX2FsbCh2b2lkKQorewogfQpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9rZXJuZWwvY3BsYi1tcHUvY3BsYm1nci5jIGIvYXJjaC9ibGFja2Zpbi9rZXJuZWwvY3BsYi1tcHUvY3BsYm1nci5jCmluZGV4IGJhYTUyZTIuLjg3NDYzY2UgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4va2VybmVsL2NwbGItbXB1L2NwbGJtZ3IuYworKysgYi9hcmNoL2JsYWNrZmluL2tlcm5lbC9jcGxiLW1wdS9jcGxibWdyLmMKQEAgLTI1LDE1ICsyNSwyMSBAQAogI2luY2x1ZGUgPGFzbS9jcGxiaW5pdC5oPgogI2luY2x1ZGUgPGFzbS9tbXVfY29udGV4dC5oPgogCi0jZGVmaW5lIEZBVUxUX1JXCSgxIDw8IDE2KQotI2RlZmluZSBGQVVMVF9VU0VSU1VQVgkoMSA8PCAxNykKKy8qCisgKiBXQVJOSU5HCisgKgorICogVGhpcyBmaWxlIGlzIGNvbXBpbGVkIHdpdGggY2VydGFpbiAtZmZpeGVkLXJlZyBvcHRpb25zLiAgV2UgaGF2ZSB0bworICogbWFrZSBzdXJlIG5vdCB0byBjYWxsIGFueSBmdW5jdGlvbnMgaGVyZSB0aGF0IGNvdWxkIGNsb2JiZXIgdGhlc2UKKyAqIHJlZ2lzdGVycy4KKyAqLwogCiBpbnQgcGFnZV9tYXNrX25lbHRzOwogaW50IHBhZ2VfbWFza19vcmRlcjsKLXVuc2lnbmVkIGxvbmcgKmN1cnJlbnRfcnd4X21hc2s7Cit1bnNpZ25lZCBsb25nICpjdXJyZW50X3J3eF9tYXNrW05SX0NQVVNdOwogCi1pbnQgbnJfZGNwbGJfbWlzcywgbnJfaWNwbGJfbWlzcywgbnJfaWNwbGJfc3Vwdl9taXNzLCBucl9kY3BsYl9wcm90OwotaW50IG5yX2NwbGJfZmx1c2g7CitpbnQgbnJfZGNwbGJfbWlzc1tOUl9DUFVTXSwgbnJfaWNwbGJfbWlzc1tOUl9DUFVTXTsKK2ludCBucl9pY3BsYl9zdXB2X21pc3NbTlJfQ1BVU10sIG5yX2RjcGxiX3Byb3RbTlJfQ1BVU107CitpbnQgbnJfY3BsYl9mbHVzaFtOUl9DUFVTXTsKIAogc3RhdGljIGlubGluZSB2b2lkIGRpc2FibGVfZGNwbGIodm9pZCkKIHsKQEAgLTk4LDQyICsxMDQsNDIgQEAKIH0KIAogLyogQ291bnRlcnMgdG8gaW1wbGVtZW50IHJvdW5kLXJvYmluIHJlcGxhY2VtZW50LiAgKi8KLXN0YXRpYyBpbnQgaWNwbGJfcnJfaW5kZXgsIGRjcGxiX3JyX2luZGV4Oworc3RhdGljIGludCBpY3BsYl9ycl9pbmRleFtOUl9DUFVTXSwgZGNwbGJfcnJfaW5kZXhbTlJfQ1BVU107CiAKIC8qCiAgKiBGaW5kIGFuIElDUExCIGVudHJ5IHRvIGJlIGV2aWN0ZWQgYW5kIHJldHVybiBpdHMgaW5kZXguCiAgKi8KLXN0YXRpYyBpbnQgZXZpY3Rfb25lX2ljcGxiKHZvaWQpCitzdGF0aWMgaW50IGV2aWN0X29uZV9pY3BsYih1bnNpZ25lZCBpbnQgY3B1KQogewogCWludCBpOwogCWZvciAoaSA9IGZpcnN0X3N3aXRjaGVkX2ljcGxiOyBpIDwgTUFYX0NQTEJTOyBpKyspCi0JCWlmICgoaWNwbGJfdGJsW2ldLmRhdGEgJiBDUExCX1ZBTElEKSA9PSAwKQorCQlpZiAoKGljcGxiX3RibFtjcHVdW2ldLmRhdGEgJiBDUExCX1ZBTElEKSA9PSAwKQogCQkJcmV0dXJuIGk7Ci0JaSA9IGZpcnN0X3N3aXRjaGVkX2ljcGxiICsgaWNwbGJfcnJfaW5kZXg7CisJaSA9IGZpcnN0X3N3aXRjaGVkX2ljcGxiICsgaWNwbGJfcnJfaW5kZXhbY3B1XTsKIAlpZiAoaSA+PSBNQVhfQ1BMQlMpIHsKIAkJaSAtPSBNQVhfQ1BMQlMgLSBmaXJzdF9zd2l0Y2hlZF9pY3BsYjsKLQkJaWNwbGJfcnJfaW5kZXggLT0gTUFYX0NQTEJTIC0gZmlyc3Rfc3dpdGNoZWRfaWNwbGI7CisJCWljcGxiX3JyX2luZGV4W2NwdV0gLT0gTUFYX0NQTEJTIC0gZmlyc3Rfc3dpdGNoZWRfaWNwbGI7CiAJfQotCWljcGxiX3JyX2luZGV4Kys7CisJaWNwbGJfcnJfaW5kZXhbY3B1XSsrOwogCXJldHVybiBpOwogfQogCi1zdGF0aWMgaW50IGV2aWN0X29uZV9kY3BsYih2b2lkKQorc3RhdGljIGludCBldmljdF9vbmVfZGNwbGIodW5zaWduZWQgaW50IGNwdSkKIHsKIAlpbnQgaTsKIAlmb3IgKGkgPSBmaXJzdF9zd2l0Y2hlZF9kY3BsYjsgaSA8IE1BWF9DUExCUzsgaSsrKQotCQlpZiAoKGRjcGxiX3RibFtpXS5kYXRhICYgQ1BMQl9WQUxJRCkgPT0gMCkKKwkJaWYgKChkY3BsYl90YmxbY3B1XVtpXS5kYXRhICYgQ1BMQl9WQUxJRCkgPT0gMCkKIAkJCXJldHVybiBpOwotCWkgPSBmaXJzdF9zd2l0Y2hlZF9kY3BsYiArIGRjcGxiX3JyX2luZGV4OworCWkgPSBmaXJzdF9zd2l0Y2hlZF9kY3BsYiArIGRjcGxiX3JyX2luZGV4W2NwdV07CiAJaWYgKGkgPj0gTUFYX0NQTEJTKSB7CiAJCWkgLT0gTUFYX0NQTEJTIC0gZmlyc3Rfc3dpdGNoZWRfZGNwbGI7Ci0JCWRjcGxiX3JyX2luZGV4IC09IE1BWF9DUExCUyAtIGZpcnN0X3N3aXRjaGVkX2RjcGxiOworCQlkY3BsYl9ycl9pbmRleFtjcHVdIC09IE1BWF9DUExCUyAtIGZpcnN0X3N3aXRjaGVkX2RjcGxiOwogCX0KLQlkY3BsYl9ycl9pbmRleCsrOworCWRjcGxiX3JyX2luZGV4W2NwdV0rKzsKIAlyZXR1cm4gaTsKIH0KIAotc3RhdGljIG5vaW5saW5lIGludCBkY3BsYl9taXNzKHZvaWQpCitzdGF0aWMgbm9pbmxpbmUgaW50IGRjcGxiX21pc3ModW5zaWduZWQgaW50IGNwdSkKIHsKIAl1bnNpZ25lZCBsb25nIGFkZHIgPSBiZmluX3JlYWRfRENQTEJfRkFVTFRfQUREUigpOwogCWludCBzdGF0dXMgPSBiZmluX3JlYWRfRENQTEJfU1RBVFVTKCk7CkBAIC0xNDEsNyArMTQ3LDcgQEAKIAlpbnQgaWR4OwogCXVuc2lnbmVkIGxvbmcgZF9kYXRhOwogCi0JbnJfZGNwbGJfbWlzcysrOworCW5yX2RjcGxiX21pc3NbY3B1XSsrOwogCiAJZF9kYXRhID0gQ1BMQl9TVVBWX1dSIHwgQ1BMQl9WQUxJRCB8IENQTEJfRElSVFkgfCBQQUdFX1NJWkVfNEtCOwogI2lmZGVmIENPTkZJR19CRklOX0RDQUNIRQpAQCAtMTY4LDI1ICsxNzQsMjUgQEAKIAl9IGVsc2UgaWYgKGFkZHIgPj0gX3JhbWVuZCkgewogCSAgICBkX2RhdGEgfD0gQ1BMQl9VU0VSX1JEIHwgQ1BMQl9VU0VSX1dSOwogCX0gZWxzZSB7Ci0JCW1hc2sgPSBjdXJyZW50X3J3eF9tYXNrOworCQltYXNrID0gY3VycmVudF9yd3hfbWFza1tjcHVdOwogCQlpZiAobWFzaykgewogCQkJaW50IHBhZ2UgPSBhZGRyID4+IFBBR0VfU0hJRlQ7Ci0JCQlpbnQgb2ZmcyA9IHBhZ2UgPj4gNTsKKwkJCWludCBpZHggPSBwYWdlID4+IDU7CiAJCQlpbnQgYml0ID0gMSA8PCAocGFnZSAmIDMxKTsKIAotCQkJaWYgKG1hc2tbb2Zmc10gJiBiaXQpCisJCQlpZiAobWFza1tpZHhdICYgYml0KQogCQkJCWRfZGF0YSB8PSBDUExCX1VTRVJfUkQ7CiAKIAkJCW1hc2sgKz0gcGFnZV9tYXNrX25lbHRzOwotCQkJaWYgKG1hc2tbb2Zmc10gJiBiaXQpCisJCQlpZiAobWFza1tpZHhdICYgYml0KQogCQkJCWRfZGF0YSB8PSBDUExCX1VTRVJfV1I7CiAJCX0KIAl9Ci0JaWR4ID0gZXZpY3Rfb25lX2RjcGxiKCk7CisJaWR4ID0gZXZpY3Rfb25lX2RjcGxiKGNwdSk7CiAKIAlhZGRyICY9IFBBR0VfTUFTSzsKLQlkY3BsYl90YmxbaWR4XS5hZGRyID0gYWRkcjsKLQlkY3BsYl90YmxbaWR4XS5kYXRhID0gZF9kYXRhOworCWRjcGxiX3RibFtjcHVdW2lkeF0uYWRkciA9IGFkZHI7CisJZGNwbGJfdGJsW2NwdV1baWR4XS5kYXRhID0gZF9kYXRhOwogCiAJZGlzYWJsZV9kY3BsYigpOwogCWJmaW5fd3JpdGUzMihEQ1BMQl9EQVRBMCArIGlkeCAqIDQsIGRfZGF0YSk7CkBAIC0xOTYsMjEgKzIwMiwyMSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgbm9pbmxpbmUgaW50IGljcGxiX21pc3Modm9pZCkKK3N0YXRpYyBub2lubGluZSBpbnQgaWNwbGJfbWlzcyh1bnNpZ25lZCBpbnQgY3B1KQogewogCXVuc2lnbmVkIGxvbmcgYWRkciA9IGJmaW5fcmVhZF9JQ1BMQl9GQVVMVF9BRERSKCk7CiAJaW50IHN0YXR1cyA9IGJmaW5fcmVhZF9JQ1BMQl9TVEFUVVMoKTsKIAlpbnQgaWR4OwogCXVuc2lnbmVkIGxvbmcgaV9kYXRhOwogCi0JbnJfaWNwbGJfbWlzcysrOworCW5yX2ljcGxiX21pc3NbY3B1XSsrOwogCiAJLyogSWYgaW5zaWRlIHRoZSB1bmNhY2hlZCBETUEgcmVnaW9uLCBmYXVsdC4gICovCiAJaWYgKGFkZHIgPj0gX3JhbWVuZCAtIERNQV9VTkNBQ0hFRF9SRUdJT04gJiYgYWRkciA8IF9yYW1lbmQpCiAJCXJldHVybiBDUExCX1BST1RfVklPTDsKIAogCWlmIChzdGF0dXMgJiBGQVVMVF9VU0VSU1VQVikKLQkJbnJfaWNwbGJfc3Vwdl9taXNzKys7CisJCW5yX2ljcGxiX3N1cHZfbWlzc1tjcHVdKys7CiAKIAkvKgogCSAqIEZpcnN0LCB0cnkgdG8gZmluZCBhIENQTEIgdGhhdCBtYXRjaGVzIHRoaXMgYWRkcmVzcy4gIElmIHdlCkBAIC0yMTgsOCArMjI0LDggQEAKIAkgKiB0aGF0IHRoZSBpbnN0cnVjdGlvbiBjcm9zc2VzIGEgcGFnZSBib3VuZGFyeS4KIAkgKi8KIAlmb3IgKGlkeCA9IGZpcnN0X3N3aXRjaGVkX2ljcGxiOyBpZHggPCBNQVhfQ1BMQlM7IGlkeCsrKSB7Ci0JCWlmIChpY3BsYl90YmxbaWR4XS5kYXRhICYgQ1BMQl9WQUxJRCkgewotCQkJdW5zaWduZWQgbG9uZyB0aGlzX2FkZHIgPSBpY3BsYl90YmxbaWR4XS5hZGRyOworCQlpZiAoaWNwbGJfdGJsW2NwdV1baWR4XS5kYXRhICYgQ1BMQl9WQUxJRCkgeworCQkJdW5zaWduZWQgbG9uZyB0aGlzX2FkZHIgPSBpY3BsYl90YmxbY3B1XVtpZHhdLmFkZHI7CiAJCQlpZiAodGhpc19hZGRyIDw9IGFkZHIgJiYgdGhpc19hZGRyICsgUEFHRV9TSVpFID4gYWRkcikgewogCQkJCWFkZHIgKz0gUEFHRV9TSVpFOwogCQkJCWJyZWFrOwpAQCAtMjU3LDIzICsyNjMsMjMgQEAKIAkJICogT3RoZXJ3aXNlLCBjaGVjayB0aGUgeCBiaXRtYXAgb2YgdGhlIGN1cnJlbnQgcHJvY2Vzcy4KIAkJICovCiAJCWlmICghKHN0YXR1cyAmIEZBVUxUX1VTRVJTVVBWKSkgewotCQkJdW5zaWduZWQgbG9uZyAqbWFzayA9IGN1cnJlbnRfcnd4X21hc2s7CisJCQl1bnNpZ25lZCBsb25nICptYXNrID0gY3VycmVudF9yd3hfbWFza1tjcHVdOwogCiAJCQlpZiAobWFzaykgewogCQkJCWludCBwYWdlID0gYWRkciA+PiBQQUdFX1NISUZUOwotCQkJCWludCBvZmZzID0gcGFnZSA+PiA1OworCQkJCWludCBpZHggPSBwYWdlID4+IDU7CiAJCQkJaW50IGJpdCA9IDEgPDwgKHBhZ2UgJiAzMSk7CiAKIAkJCQltYXNrICs9IDIgKiBwYWdlX21hc2tfbmVsdHM7Ci0JCQkJaWYgKG1hc2tbb2Zmc10gJiBiaXQpCisJCQkJaWYgKG1hc2tbaWR4XSAmIGJpdCkKIAkJCQkJaV9kYXRhIHw9IENQTEJfVVNFUl9SRDsKIAkJCX0KIAkJfQogCX0KLQlpZHggPSBldmljdF9vbmVfaWNwbGIoKTsKKwlpZHggPSBldmljdF9vbmVfaWNwbGIoY3B1KTsKIAlhZGRyICY9IFBBR0VfTUFTSzsKLQlpY3BsYl90YmxbaWR4XS5hZGRyID0gYWRkcjsKLQlpY3BsYl90YmxbaWR4XS5kYXRhID0gaV9kYXRhOworCWljcGxiX3RibFtjcHVdW2lkeF0uYWRkciA9IGFkZHI7CisJaWNwbGJfdGJsW2NwdV1baWR4XS5kYXRhID0gaV9kYXRhOwogCiAJZGlzYWJsZV9pY3BsYigpOwogCWJmaW5fd3JpdGUzMihJQ1BMQl9EQVRBMCArIGlkeCAqIDQsIGlfZGF0YSk7CkBAIC0yODMsMTkgKzI4OSwxOSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgbm9pbmxpbmUgaW50IGRjcGxiX3Byb3RlY3Rpb25fZmF1bHQodm9pZCkKK3N0YXRpYyBub2lubGluZSBpbnQgZGNwbGJfcHJvdGVjdGlvbl9mYXVsdCh1bnNpZ25lZCBpbnQgY3B1KQogewogCWludCBzdGF0dXMgPSBiZmluX3JlYWRfRENQTEJfU1RBVFVTKCk7CiAKLQlucl9kY3BsYl9wcm90Kys7CisJbnJfZGNwbGJfcHJvdFtjcHVdKys7CiAKIAlpZiAoc3RhdHVzICYgRkFVTFRfUlcpIHsKIAkJaW50IGlkeCA9IGZhdWx0aW5nX2NwbGJfaW5kZXgoc3RhdHVzKTsKLQkJdW5zaWduZWQgbG9uZyBkYXRhID0gZGNwbGJfdGJsW2lkeF0uZGF0YTsKKwkJdW5zaWduZWQgbG9uZyBkYXRhID0gZGNwbGJfdGJsW2NwdV1baWR4XS5kYXRhOwogCQlpZiAoIShkYXRhICYgQ1BMQl9XVCkgJiYgIShkYXRhICYgQ1BMQl9ESVJUWSkgJiYKIAkJICAgIHdyaXRlX3Blcm1pdHRlZChzdGF0dXMsIGRhdGEpKSB7CiAJCQlkYXRhIHw9IENQTEJfRElSVFk7Ci0JCQlkY3BsYl90YmxbaWR4XS5kYXRhID0gZGF0YTsKKwkJCWRjcGxiX3RibFtjcHVdW2lkeF0uZGF0YSA9IGRhdGE7CiAJCQliZmluX3dyaXRlMzIoRENQTEJfREFUQTAgKyBpZHggKiA0LCBkYXRhKTsKIAkJCXJldHVybiAwOwogCQl9CkBAIC0zMDYsNDQgKzMxMiw0NSBAQAogaW50IGNwbGJfaGRyKGludCBzZXFzdGF0LCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAlpbnQgY2F1c2UgPSBzZXFzdGF0ICYgMHgzZjsKKwl1bnNpZ25lZCBpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwogCXN3aXRjaCAoY2F1c2UpIHsKIAljYXNlIDB4MjM6Ci0JCXJldHVybiBkY3BsYl9wcm90ZWN0aW9uX2ZhdWx0KCk7CisJCXJldHVybiBkY3BsYl9wcm90ZWN0aW9uX2ZhdWx0KGNwdSk7CiAJY2FzZSAweDJDOgotCQlyZXR1cm4gaWNwbGJfbWlzcygpOworCQlyZXR1cm4gaWNwbGJfbWlzcyhjcHUpOwogCWNhc2UgMHgyNjoKLQkJcmV0dXJuIGRjcGxiX21pc3MoKTsKKwkJcmV0dXJuIGRjcGxiX21pc3MoY3B1KTsKIAlkZWZhdWx0OgogCQlyZXR1cm4gMTsKIAl9CiB9CiAKLXZvaWQgZmx1c2hfc3dpdGNoZWRfY3BsYnModm9pZCkKK3ZvaWQgZmx1c2hfc3dpdGNoZWRfY3BsYnModW5zaWduZWQgaW50IGNwdSkKIHsKIAlpbnQgaTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JbnJfY3BsYl9mbHVzaCsrOworCW5yX2NwbGJfZmx1c2hbY3B1XSsrOwogCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCWxvY2FsX2lycV9zYXZlX2h3KGZsYWdzKTsKIAlkaXNhYmxlX2ljcGxiKCk7CiAJZm9yIChpID0gZmlyc3Rfc3dpdGNoZWRfaWNwbGI7IGkgPCBNQVhfQ1BMQlM7IGkrKykgewotCQlpY3BsYl90YmxbaV0uZGF0YSA9IDA7CisJCWljcGxiX3RibFtjcHVdW2ldLmRhdGEgPSAwOwogCQliZmluX3dyaXRlMzIoSUNQTEJfREFUQTAgKyBpICogNCwgMCk7CiAJfQogCWVuYWJsZV9pY3BsYigpOwogCiAJZGlzYWJsZV9kY3BsYigpOwogCWZvciAoaSA9IGZpcnN0X3N3aXRjaGVkX2RjcGxiOyBpIDwgTUFYX0NQTEJTOyBpKyspIHsKLQkJZGNwbGJfdGJsW2ldLmRhdGEgPSAwOworCQlkY3BsYl90YmxbY3B1XVtpXS5kYXRhID0gMDsKIAkJYmZpbl93cml0ZTMyKERDUExCX0RBVEEwICsgaSAqIDQsIDApOwogCX0KIAllbmFibGVfZGNwbGIoKTsKLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJbG9jYWxfaXJxX3Jlc3RvcmVfaHcoZmxhZ3MpOwogCiB9CiAKLXZvaWQgc2V0X21hc2tfZGNwbGJzKHVuc2lnbmVkIGxvbmcgKm1hc2tzKQordm9pZCBzZXRfbWFza19kY3BsYnModW5zaWduZWQgbG9uZyAqbWFza3MsIHVuc2lnbmVkIGludCBjcHUpCiB7CiAJaW50IGk7CiAJdW5zaWduZWQgbG9uZyBhZGRyID0gKHVuc2lnbmVkIGxvbmcpbWFza3M7CkBAIC0zNTEsMTIgKzM1OCwxMiBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlpZiAoIW1hc2tzKSB7Ci0JCWN1cnJlbnRfcnd4X21hc2sgPSBtYXNrczsKKwkJY3VycmVudF9yd3hfbWFza1tjcHVdID0gbWFza3M7CiAJCXJldHVybjsKIAl9CiAKLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0JY3VycmVudF9yd3hfbWFzayA9IG1hc2tzOworCWxvY2FsX2lycV9zYXZlX2h3KGZsYWdzKTsKKwljdXJyZW50X3J3eF9tYXNrW2NwdV0gPSBtYXNrczsKIAogCWRfZGF0YSA9IENQTEJfU1VQVl9XUiB8IENQTEJfVkFMSUQgfCBDUExCX0RJUlRZIHwgUEFHRV9TSVpFXzRLQjsKICNpZmRlZiBDT05GSUdfQkZJTl9EQ0FDSEUKQEAgLTM2OCwxMiArMzc1LDEyIEBACiAKIAlkaXNhYmxlX2RjcGxiKCk7CiAJZm9yIChpID0gZmlyc3RfbWFza19kY3BsYjsgaSA8IGZpcnN0X3N3aXRjaGVkX2RjcGxiOyBpKyspIHsKLQkJZGNwbGJfdGJsW2ldLmFkZHIgPSBhZGRyOwotCQlkY3BsYl90YmxbaV0uZGF0YSA9IGRfZGF0YTsKKwkJZGNwbGJfdGJsW2NwdV1baV0uYWRkciA9IGFkZHI7CisJCWRjcGxiX3RibFtjcHVdW2ldLmRhdGEgPSBkX2RhdGE7CiAJCWJmaW5fd3JpdGUzMihEQ1BMQl9EQVRBMCArIGkgKiA0LCBkX2RhdGEpOwogCQliZmluX3dyaXRlMzIoRENQTEJfQUREUjAgKyBpICogNCwgYWRkcik7CiAJCWFkZHIgKz0gUEFHRV9TSVpFOwogCX0KIAllbmFibGVfZGNwbGIoKTsKLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJbG9jYWxfaXJxX3Jlc3RvcmVfaHcoZmxhZ3MpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9rZXJuZWwvY3BsYi1ub21wdS9NYWtlZmlsZSBiL2FyY2gvYmxhY2tmaW4va2VybmVsL2NwbGItbm9tcHUvTWFrZWZpbGUKaW5kZXggZDM2ZWE5Yi4uN2Q3MGQzYiAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9rZXJuZWwvY3BsYi1ub21wdS9NYWtlZmlsZQorKysgYi9hcmNoL2JsYWNrZmluL2tlcm5lbC9jcGxiLW5vbXB1L01ha2VmaWxlCkBAIC0yLDcgKzIsOSBAQAogIyBhcmNoL2JsYWNrZmluL2tlcm5lbC9jcGxiLW5vbXB1L01ha2VmaWxlCiAjCiAKLW9iai15IDo9IGNwbGJpbml0Lm8gY2FjaGVpbml0Lm8gY3BsYmhkbHIubyBjcGxibWdyLm8KK29iai15IDo9IGNwbGJpbml0Lm8gY2FjaGVpbml0Lm8gY3BsYm1nci5vCiAKLW9iai0kKENPTkZJR19DUExCX0lORk8pICs9IGNwbGJpbmZvLm8KLQorQ0ZMQUdTX2NwbGJtZ3IubyA6PSAtZmZpeGVkLUkwIC1mZml4ZWQtSTEgLWZmaXhlZC1JMiAtZmZpeGVkLUkzIFwKKwkJICAgIC1mZml4ZWQtTDAgLWZmaXhlZC1MMSAtZmZpeGVkLUwyIC1mZml4ZWQtTDMgXAorCQkgICAgLWZmaXhlZC1NMCAtZmZpeGVkLU0xIC1mZml4ZWQtTTIgLWZmaXhlZC1NMyBcCisJCSAgICAtZmZpeGVkLUIwIC1mZml4ZWQtQjEgLWZmaXhlZC1CMiAtZmZpeGVkLUIzCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2tlcm5lbC9jcGxiLW5vbXB1L2NhY2hlaW5pdC5jIGIvYXJjaC9ibGFja2Zpbi9rZXJuZWwvY3BsYi1ub21wdS9jYWNoZWluaXQuYwppbmRleCBiZDA4MzE1Li5jNmZmOTQ3IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2tlcm5lbC9jcGxiLW5vbXB1L2NhY2hlaW5pdC5jCisrKyBiL2FyY2gvYmxhY2tmaW4va2VybmVsL2NwbGItbm9tcHUvY2FjaGVpbml0LmMKQEAgLTI1LDE5ICsyNSwxNSBAQAogI2luY2x1ZGUgPGFzbS9jcGxiaW5pdC5oPgogCiAjaWYgZGVmaW5lZChDT05GSUdfQkZJTl9JQ0FDSEUpCi12b2lkIF9faW5pdCBiZmluX2ljYWNoZV9pbml0KHZvaWQpCit2b2lkIF9fY3B1aW5pdCBiZmluX2ljYWNoZV9pbml0KHN0cnVjdCBjcGxiX2VudHJ5ICppY3BsYl90YmwpCiB7Ci0JdW5zaWduZWQgbG9uZyAqdGFibGUgPSBpY3BsYl90YWJsZTsKIAl1bnNpZ25lZCBsb25nIGN0cmw7CiAJaW50IGk7CiAKKwlTU1lOQygpOwogCWZvciAoaSA9IDA7IGkgPCBNQVhfQ1BMQlM7IGkrKykgewotCQl1bnNpZ25lZCBsb25nIGFkZHIgPSAqdGFibGUrKzsKLQkJdW5zaWduZWQgbG9uZyBkYXRhID0gKnRhYmxlKys7Ci0JCWlmIChhZGRyID09ICh1bnNpZ25lZCBsb25nKS0xKQotCQkJYnJlYWs7Ci0JCWJmaW5fd3JpdGUzMihJQ1BMQl9BRERSMCArIGkgKiA0LCBhZGRyKTsKLQkJYmZpbl93cml0ZTMyKElDUExCX0RBVEEwICsgaSAqIDQsIGRhdGEpOworCQliZmluX3dyaXRlMzIoSUNQTEJfQUREUjAgKyBpICogNCwgaWNwbGJfdGJsW2ldLmFkZHIpOworCQliZmluX3dyaXRlMzIoSUNQTEJfREFUQTAgKyBpICogNCwgaWNwbGJfdGJsW2ldLmRhdGEpOwogCX0KIAljdHJsID0gYmZpbl9yZWFkX0lNRU1fQ09OVFJPTCgpOwogCWN0cmwgfD0gSU1DIHwgRU5JQ1BMQjsKQEAgLTQ3LDIwICs0MywxNyBAQAogI2VuZGlmCiAKICNpZiBkZWZpbmVkKENPTkZJR19CRklOX0RDQUNIRSkKLXZvaWQgX19pbml0IGJmaW5fZGNhY2hlX2luaXQodm9pZCkKK3ZvaWQgX19jcHVpbml0IGJmaW5fZGNhY2hlX2luaXQoc3RydWN0IGNwbGJfZW50cnkgKmRjcGxiX3RibCkKIHsKLQl1bnNpZ25lZCBsb25nICp0YWJsZSA9IGRjcGxiX3RhYmxlOwogCXVuc2lnbmVkIGxvbmcgY3RybDsKIAlpbnQgaTsKIAorCVNTWU5DKCk7CiAJZm9yIChpID0gMDsgaSA8IE1BWF9DUExCUzsgaSsrKSB7Ci0JCXVuc2lnbmVkIGxvbmcgYWRkciA9ICp0YWJsZSsrOwotCQl1bnNpZ25lZCBsb25nIGRhdGEgPSAqdGFibGUrKzsKLQkJaWYgKGFkZHIgPT0gKHVuc2lnbmVkIGxvbmcpLTEpCi0JCQlicmVhazsKLQkJYmZpbl93cml0ZTMyKERDUExCX0FERFIwICsgaSAqIDQsIGFkZHIpOwotCQliZmluX3dyaXRlMzIoRENQTEJfREFUQTAgKyBpICogNCwgZGF0YSk7CisJCWJmaW5fd3JpdGUzMihEQ1BMQl9BRERSMCArIGkgKiA0LCBkY3BsYl90YmxbaV0uYWRkcik7CisJCWJmaW5fd3JpdGUzMihEQ1BMQl9EQVRBMCArIGkgKiA0LCBkY3BsYl90YmxbaV0uZGF0YSk7CiAJfQorCiAJY3RybCA9IGJmaW5fcmVhZF9ETUVNX0NPTlRST0woKTsKIAljdHJsIHw9IERNRU1fQ05UUjsKIAliZmluX3dyaXRlX0RNRU1fQ09OVFJPTChjdHJsKTsKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4va2VybmVsL2NwbGItbm9tcHUvY3BsYmhkbHIuUyBiL2FyY2gvYmxhY2tmaW4va2VybmVsL2NwbGItbm9tcHUvY3BsYmhkbHIuUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWNiYWJjMC4uMDAwMDAwMAotLS0gYS9hcmNoL2JsYWNrZmluL2tlcm5lbC9jcGxiLW5vbXB1L2NwbGJoZGxyLlMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzAgKzAsMCBAQAotLyoKLSAqIEZpbGU6ICAgICAgICAgYXJjaC9ibGFja2Zpbi9tYWNoLWNvbW1vbi9jcGxiaGRsci5TCi0gKiBCYXNlZCBvbjoKLSAqIEF1dGhvcjogICAgICAgTEcgU29mdCBJbmRpYQotICoKLSAqIENyZWF0ZWQ6ICAgICAgPwotICogRGVzY3JpcHRpb246ICBDUExCIGV4Y2VwdGlvbiBoYW5kbGVyCi0gKgotICogTW9kaWZpZWQ6Ci0gKiAgICAgICAgICAgICAgIENvcHlyaWdodCAyMDA0LTIwMDYgQW5hbG9nIERldmljZXMgSW5jLgotICoKLSAqIEJ1Z3M6ICAgICAgICAgRW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCBzZWUgdGhlIGZpbGUgQ09QWUlORywgb3Igd3JpdGUKLSAqIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gKiA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotICovCi0KLSNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+Ci0jaW5jbHVkZSA8YXNtL2NwbGIuaD4KLSNpbmNsdWRlIDxhc20vZW50cnkuaD4KLQotI2lmZGVmIENPTkZJR19FWENQVF9JUlFfU1lTQ19MMQotLnNlY3Rpb24gLmwxLnRleHQKLSNlbHNlCi0udGV4dAotI2VuZGlmCi0KLS50eXBlIF9jcGxiX21nciwgU1RUX0ZVTkM7Ci0udHlwZSBfcGFuaWNfY3BsYl9lcnJvciwgU1RUX0ZVTkM7Ci0KLS5hbGlnbiAyCi0KLUVOVFJZKF9fY3BsYl9oZHIpCi0JUjIgPSBTRVFTVEFUOwotCi0JLyogTWFzayB0aGUgY29udGVudHMgb2YgU0VRU1RBVCBhbmQgbGVhdmUgb25seSBFWENBVVNFIGluIFIyICovCi0JUjIgPDw9IDI2OwotCVIyID4+PSAyNjsKLQotCVIxID0gMHgyMzsgLyogRGF0YSBhY2Nlc3MgQ1BMQiBwcm90ZWN0aW9uIHZpb2xhdGlvbiAqLwotCUNDID0gUjIgPT0gUjE7Ci0JSUYgIUNDIEpVTVAgLkxub3RfZGF0YV93cml0ZTsKLQlSMCA9IDI7CQkvKiBpcyBhIHdyaXRlIHRvIGRhdGEgc3BhY2UqLwotCUpVTVAgLkxpc19pY3BsYl9taXNzOwotCi0uTG5vdF9kYXRhX3dyaXRlOgotCVIxID0gMHgyQzsgLyogQ1BMQiBtaXNzIG9uIGFuIGluc3RydWN0aW9uIGZldGNoICovCi0JQ0MgPSBSMiA9PSBSMTsKLQlSMCA9IDA7CQkvKiBpc19kYXRhX21pc3MgPT0gRmFsc2UqLwotCUlGIENDIEpVTVAgLkxpc19pY3BsYl9taXNzOwotCi0JUjEgPSAweDI2OwotCUNDID0gUjIgPT0gUjE7Ci0JSUYgIUNDIEpVTVAgLkx1bmtub3duOwotCi0JUjAgPSAxOwkJLyogaXNfZGF0YV9taXNzID09IFRydWUqLwotCi0uTGlzX2ljcGxiX21pc3M6Ci0KLSNpZiBkZWZpbmVkKENPTkZJR19CRklOX0lDQUNIRSkgfHwgZGVmaW5lZChDT05GSUdfQkZJTl9EQ0FDSEUpCi0jIGlmIGRlZmluZWQoQ09ORklHX0JGSU5fSUNBQ0hFKSAmJiAhZGVmaW5lZChDT05GSUdfQkZJTl9EQ0FDSEUpCi0JUjEgPSBDUExCX0VOQUJMRV9JQ0FDSEU7Ci0jIGVuZGlmCi0jIGlmICFkZWZpbmVkKENPTkZJR19CRklOX0lDQUNIRSkgJiYgZGVmaW5lZChDT05GSUdfQkZJTl9EQ0FDSEUpCi0JUjEgPSBDUExCX0VOQUJMRV9EQ0FDSEU7Ci0jIGVuZGlmCi0jIGlmIGRlZmluZWQoQ09ORklHX0JGSU5fSUNBQ0hFKSAmJiBkZWZpbmVkKENPTkZJR19CRklOX0RDQUNIRSkKLQlSMSA9IENQTEJfRU5BQkxFX0RDQUNIRSB8IENQTEJfRU5BQkxFX0lDQUNIRTsKLSMgZW5kaWYKLSNlbHNlCi0JUjEgPSAwOwotI2VuZGlmCi0KLQlbLS1TUF0gPSBSRVRTOwotCUNBTEwgX2NwbGJfbWdyOwotCVJFVFMgPSBbU1ArK107Ci0JQ0MgPSBSMCA9PSAwOwotCUlGICFDQyBKVU1QIC5Mbm90X3JlcGxhY2VkOwotCVJUUzsKLQotLyoKLSAqIERpYWdub3N0aWMgZXhjZXB0aW9uIGhhbmRsZXJzCi0gKi8KLS5MdW5rbm93bjoKLQlSMCA9IENQTEJfVU5LTk9XTl9FUlI7Ci0JSlVNUCAuTGNwbGJfZXJyb3I7Ci0KLS5Mbm90X3JlcGxhY2VkOgotCUNDID0gUjAgPT0gQ1BMQl9OT19VTkxPQ0tFRDsKLQlJRiAhQ0MgSlVNUCAuTG5leHRfY2hlY2s7Ci0JUjAgPSBDUExCX05PX1VOTE9DS0VEOwotCUpVTVAgLkxjcGxiX2Vycm9yOwotCi0uTG5leHRfY2hlY2s6Ci0JQ0MgPSBSMCA9PSBDUExCX05PX0FERFJfTUFUQ0g7Ci0JSUYgIUNDIEpVTVAgLkxuZXh0X2NoZWNrMjsKLQlSMCA9IENQTEJfTk9fQUREUl9NQVRDSDsKLQlKVU1QIC5MY3BsYl9lcnJvcjsKLQotLkxuZXh0X2NoZWNrMjoKLQlDQyA9IFIwID09IENQTEJfUFJPVF9WSU9MOwotCUlGICFDQyBKVU1QIC5Mc3RyYW5nZV9yZXR1cm5fZnJvbV9jcGxiX21ncjsKLQlSMCA9IENQTEJfUFJPVF9WSU9MOwotCUpVTVAgLkxjcGxiX2Vycm9yOwotCi0uTHN0cmFuZ2VfcmV0dXJuX2Zyb21fY3BsYl9tZ3I6Ci0JSURMRTsKLQlDU1lOQzsKLQlKVU1QIC5Mc3RyYW5nZV9yZXR1cm5fZnJvbV9jcGxiX21ncjsKLQotLkxjcGxiX2Vycm9yOgotCVIxID0gc3A7Ci0JU1AgKz0gLTEyOwotCWNhbGwgX3BhbmljX2NwbGJfZXJyb3I7Ci0JU1AgKz0gMTI7Ci0JSlVNUC5MIF9oYW5kbGVfYmFkX2NwbGI7Ci0KLUVORFBST0MoX19jcGxiX2hkcikKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4va2VybmVsL2NwbGItbm9tcHUvY3BsYmluZm8uYyBiL2FyY2gvYmxhY2tmaW4va2VybmVsL2NwbGItbm9tcHUvY3BsYmluZm8uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWU3NGYwYi4uMDAwMDAwMAotLS0gYS9hcmNoL2JsYWNrZmluL2tlcm5lbC9jcGxiLW5vbXB1L2NwbGJpbmZvLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxOTUgKzAsMCBAQAotLyoKLSAqIEZpbGU6ICAgICAgICAgYXJjaC9ibGFja2Zpbi9tYWNoLWNvbW1vbi9jcGxiaW5mby5jCi0gKiBCYXNlZCBvbjoKLSAqIEF1dGhvcjogICAgICAgU29uaWMgWmhhbmcgPHNvbmljLnpoYW5nQGFuYWxvZy5jb20+Ci0gKgotICogQ3JlYXRlZDogICAgICBKYW4uIDIwMDUKLSAqIERlc2NyaXB0aW9uOiAgRGlzcGxheSBDUExCIHN0YXR1cwotICoKLSAqIE1vZGlmaWVkOgotICogICAgICAgICAgICAgICBDb3B5cmlnaHQgMjAwNC0yMDA2IEFuYWxvZyBEZXZpY2VzIEluYy4KLSAqCi0gKiBCdWdzOiAgICAgICAgIEVudGVyIGJ1Z3MgYXQgaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnLwotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIHRoZSBmaWxlIENPUFlJTkcsIG9yIHdyaXRlCi0gKiB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICogNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KLSNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+Ci0KLSNpbmNsdWRlIDxhc20vY3BsYmluaXQuaD4KLSNpbmNsdWRlIDxhc20vYmxhY2tmaW4uaD4KLQotI2RlZmluZSBDUExCX0kgMQotI2RlZmluZSBDUExCX0QgMgotCi0jZGVmaW5lIFNZTkNfU1lTICAgIFNTWU5DKCkKLSNkZWZpbmUgU1lOQ19DT1JFICAgQ1NZTkMoKQotCi0jZGVmaW5lIENQTEJfQklUX1BBR0VTSVpFIDB4MzAwMDAKLQotc3RhdGljIGludCBwYWdlX3NpemVfdGFibGVbNF0gPSB7Ci0JMHgwMDAwMDQwMCwJCS8qIDFLICovCi0JMHgwMDAwMTAwMCwJCS8qIDRLICovCi0JMHgwMDEwMDAwMCwJCS8qIDFNICovCi0JMHgwMDQwMDAwMAkJLyogNE0gKi8KLX07Ci0KLXN0YXRpYyBjaGFyIHBhZ2Vfc2l6ZV9zdHJpbmdfdGFibGVbXVs0XSA9IHsgIjFLIiwgIjRLIiwgIjFNIiwgIjRNIiB9OwotCi1zdGF0aWMgaW50IGNwbGJfZmluZF9lbnRyeSh1bnNpZ25lZCBsb25nICpjcGxiX2FkZHIsCi0JCQkgICB1bnNpZ25lZCBsb25nICpjcGxiX2RhdGEsIHVuc2lnbmVkIGxvbmcgYWRkciwKLQkJCSAgIHVuc2lnbmVkIGxvbmcgZGF0YSkKLXsKLQlpbnQgaWk7Ci0KLQlmb3IgKGlpID0gMDsgaWkgPCAxNjsgaWkrKykKLQkJaWYgKGFkZHIgPj0gY3BsYl9hZGRyW2lpXSAmJiBhZGRyIDwgY3BsYl9hZGRyW2lpXSArCi0JCSAgICBwYWdlX3NpemVfdGFibGVbKGNwbGJfZGF0YVtpaV0gJiBDUExCX0JJVF9QQUdFU0laRSkgPj4gMTZdCi0JCQkmJiAoY3BsYl9kYXRhW2lpXSA9PSBkYXRhKSkKLQkJCXJldHVybiBpaTsKLQotCXJldHVybiAtMTsKLX0KLQotc3RhdGljIGNoYXIgKmNwbGJfcHJpbnRfZW50cnkoY2hhciAqYnVmLCBpbnQgdHlwZSkKLXsKLQl1bnNpZ25lZCBsb25nICpwX2FkZHIgPSBkcGR0X3RhYmxlOwotCXVuc2lnbmVkIGxvbmcgKnBfZGF0YSA9IGRwZHRfdGFibGUgKyAxOwotCXVuc2lnbmVkIGxvbmcgKnBfaWNvdW50ID0gZHBkdF9zd2FwY291bnRfdGFibGU7Ci0JdW5zaWduZWQgbG9uZyAqcF9vY291bnQgPSBkcGR0X3N3YXBjb3VudF90YWJsZSArIDE7Ci0JdW5zaWduZWQgbG9uZyAqY3BsYl9hZGRyID0gKHVuc2lnbmVkIGxvbmcgKilEQ1BMQl9BRERSMDsKLQl1bnNpZ25lZCBsb25nICpjcGxiX2RhdGEgPSAodW5zaWduZWQgbG9uZyAqKURDUExCX0RBVEEwOwotCWludCBlbnRyeSA9IDAsIHVzZWRfY3BsYiA9IDA7Ci0KLQlpZiAodHlwZSA9PSBDUExCX0kpIHsKLQkJYnVmICs9IHNwcmludGYoYnVmLCAiSW5zdHJ1Y3Rpb24gQ1BMQiBlbnRyeTpcbiIpOwotCQlwX2FkZHIgPSBpcGR0X3RhYmxlOwotCQlwX2RhdGEgPSBpcGR0X3RhYmxlICsgMTsKLQkJcF9pY291bnQgPSBpcGR0X3N3YXBjb3VudF90YWJsZTsKLQkJcF9vY291bnQgPSBpcGR0X3N3YXBjb3VudF90YWJsZSArIDE7Ci0JCWNwbGJfYWRkciA9ICh1bnNpZ25lZCBsb25nICopSUNQTEJfQUREUjA7Ci0JCWNwbGJfZGF0YSA9ICh1bnNpZ25lZCBsb25nICopSUNQTEJfREFUQTA7Ci0JfSBlbHNlCi0JCWJ1ZiArPSBzcHJpbnRmKGJ1ZiwgIkRhdGEgQ1BMQiBlbnRyeTpcbiIpOwotCi0JYnVmICs9IHNwcmludGYoYnVmLCAiQWRkcmVzc1x0XHREYXRhXHRTaXplXHRWYWxpZFx0TG9ja2VkXHRTd2FwaW5cdGlDb3VudFx0b0NvdW50XG4iKTsKLQotCXdoaWxlICgqcF9hZGRyICE9IDB4ZmZmZmZmZmYpIHsKLQkJZW50cnkgPSBjcGxiX2ZpbmRfZW50cnkoY3BsYl9hZGRyLCBjcGxiX2RhdGEsICpwX2FkZHIsICpwX2RhdGEpOwotCQlpZiAoZW50cnkgPj0gMCkKLQkJCXVzZWRfY3BsYiB8PSAxIDw8IGVudHJ5OwotCi0JCWJ1ZiArPQotCQkgICAgc3ByaW50ZihidWYsCi0JCQkgICAgIjB4JTA4bHhcdDB4JTA1bHhcdCVzXHQlY1x0JWNcdCUyZFx0JWxkXHQlbGRcbiIsCi0JCQkgICAgKnBfYWRkciwgKnBfZGF0YSwKLQkJCSAgICBwYWdlX3NpemVfc3RyaW5nX3RhYmxlWygqcF9kYXRhICYgMHgzMDAwMCkgPj4gMTZdLAotCQkJICAgICgqcF9kYXRhICYgQ1BMQl9WQUxJRCkgPyAnWScgOiAnTicsCi0JCQkgICAgKCpwX2RhdGEgJiBDUExCX0xPQ0spID8gJ1knIDogJ04nLCBlbnRyeSwgKnBfaWNvdW50LAotCQkJICAgICpwX29jb3VudCk7Ci0KLQkJcF9hZGRyICs9IDI7Ci0JCXBfZGF0YSArPSAyOwotCQlwX2ljb3VudCArPSAyOwotCQlwX29jb3VudCArPSAyOwotCX0KLQotCWlmICh1c2VkX2NwbGIgIT0gMHhmZmZmKSB7Ci0JCWJ1ZiArPSBzcHJpbnRmKGJ1ZiwgIlVudXNlZC9taXNtYXRjaGVkIENQTEJzOlxuIik7Ci0KLQkJZm9yIChlbnRyeSA9IDA7IGVudHJ5IDwgMTY7IGVudHJ5KyspCi0JCQlpZiAoMCA9PSAoKDEgPDwgZW50cnkpICYgdXNlZF9jcGxiKSkgewotCQkJCWludCBmbGFncyA9IGNwbGJfZGF0YVtlbnRyeV07Ci0JCQkJYnVmICs9Ci0JCQkJICAgIHNwcmludGYoYnVmLAotCQkJCQkgICAgIiUyZDogMHglMDhseFx0MHglMDV4XHQlc1x0JWNcdCVjXG4iLAotCQkJCQkgICAgZW50cnksIGNwbGJfYWRkcltlbnRyeV0sIGZsYWdzLAotCQkJCQkgICAgcGFnZV9zaXplX3N0cmluZ190YWJsZVsoZmxhZ3MgJgotCQkJCQkJCQkgICAgMHgzMDAwMCkgPj4KLQkJCQkJCQkJICAgMTZdLAotCQkJCQkgICAgKGZsYWdzICYgQ1BMQl9WQUxJRCkgPyAnWScgOiAnTicsCi0JCQkJCSAgICAoZmxhZ3MgJiBDUExCX0xPQ0spID8gJ1knIDogJ04nKTsKLQkJCX0KLQl9Ci0KLQlidWYgKz0gc3ByaW50ZihidWYsICJcbiIpOwotCi0JcmV0dXJuIGJ1ZjsKLX0KLQotc3RhdGljIGludCBjcGxiaW5mb19wcm9jX291dHB1dChjaGFyICpidWYpCi17Ci0JY2hhciAqcDsKLQotCXAgPSBidWY7Ci0KLQlwICs9IHNwcmludGYocCwgIi0tLS0tLS0tLS0tLS0tLS0tLSBDUExCIEluZm9ybWF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLVxuXG4iKTsKLQotCWlmIChiZmluX3JlYWRfSU1FTV9DT05UUk9MKCkgJiBFTklDUExCKQotCQlwID0gY3BsYl9wcmludF9lbnRyeShwLCBDUExCX0kpOwotCWVsc2UKLQkJcCArPSBzcHJpbnRmKHAsICJJbnN0cnVjdGlvbiBDUExCIGlzIGRpc2FibGVkLlxuXG4iKTsKLQotCWlmIChiZmluX3JlYWRfRE1FTV9DT05UUk9MKCkgJiBFTkRDUExCKQotCQlwID0gY3BsYl9wcmludF9lbnRyeShwLCBDUExCX0QpOwotCWVsc2UKLQkJcCArPSBzcHJpbnRmKHAsICJEYXRhIENQTEIgaXMgZGlzYWJsZWQuXG4iKTsKLQotCXJldHVybiBwIC0gYnVmOwotfQotCi1zdGF0aWMgaW50IGNwbGJpbmZvX3JlYWRfcHJvYyhjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZiwKLQkJCSAgICAgIGludCBjb3VudCwgaW50ICplb2YsIHZvaWQgKmRhdGEpCi17Ci0JaW50IGxlbjsKLQotCWxlbiA9IGNwbGJpbmZvX3Byb2Nfb3V0cHV0KHBhZ2UpOwotCWlmIChsZW4gPD0gb2ZmICsgY291bnQpCi0JCSplb2YgPSAxOwotCSpzdGFydCA9IHBhZ2UgKyBvZmY7Ci0JbGVuIC09IG9mZjsKLQlpZiAobGVuID4gY291bnQpCi0JCWxlbiA9IGNvdW50OwotCWlmIChsZW4gPCAwKQotCQlsZW4gPSAwOwotCXJldHVybiBsZW47Ci19Ci0KLXN0YXRpYyBpbnQgX19pbml0IGNwbGJpbmZvX2luaXQodm9pZCkKLXsKLQlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmVudHJ5OwotCi0JZW50cnkgPSBjcmVhdGVfcHJvY19lbnRyeSgiY3BsYmluZm8iLCAwLCBOVUxMKTsKLQlpZiAoIWVudHJ5KQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWVudHJ5LT5yZWFkX3Byb2MgPSBjcGxiaW5mb19yZWFkX3Byb2M7Ci0JZW50cnktPmRhdGEgPSBOVUxMOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBjcGxiaW5mb19leGl0KHZvaWQpCi17Ci0JcmVtb3ZlX3Byb2NfZW50cnkoImNwbGJpbmZvIiwgTlVMTCk7Ci19Ci0KLW1vZHVsZV9pbml0KGNwbGJpbmZvX2luaXQpOwotbW9kdWxlX2V4aXQoY3BsYmluZm9fZXhpdCk7CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2tlcm5lbC9jcGxiLW5vbXB1L2NwbGJpbml0LmMgYi9hcmNoL2JsYWNrZmluL2tlcm5lbC9jcGxiLW5vbXB1L2NwbGJpbml0LmMKaW5kZXggMmRlYmM5MC4uMGUyOGY3NSAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9rZXJuZWwvY3BsYi1ub21wdS9jcGxiaW5pdC5jCisrKyBiL2FyY2gvYmxhY2tmaW4va2VybmVsL2NwbGItbm9tcHUvY3BsYmluaXQuYwpAQCAtMjAsNDQ1ICsyMCwxNTIgQEAKICAqIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCiAgKiA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQogICovCisKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgPGFzbS9ibGFja2Zpbi5oPgogI2luY2x1ZGUgPGFzbS9jYWNoZWZsdXNoLmg+CiAjaW5jbHVkZSA8YXNtL2NwbGIuaD4KICNpbmNsdWRlIDxhc20vY3BsYmluaXQuaD4KKyNpbmNsdWRlIDxhc20vbWVtX21hcC5oPgogCi0jZGVmaW5lIENQTEJfTUVNIENPTkZJR19NQVhfTUVNX1NJWkUKK3N0cnVjdCBjcGxiX2VudHJ5IGljcGxiX3RibFtOUl9DUFVTXVtNQVhfQ1BMQlNdIFBEVF9BVFRSOworc3RydWN0IGNwbGJfZW50cnkgZGNwbGJfdGJsW05SX0NQVVNdW01BWF9DUExCU10gUERUX0FUVFI7CiAKLS8qCi0qIE51bWJlciBvZiByZXF1aXJlZCBkYXRhIENQTEIgc3dpdGNodGFibGUgZW50cmllcwotKiBNRU1TSVpFIC8gNCAod2UgbW9zdGx5IGluc3RhbGwgNE0gcGFnZSBzaXplIENQTEJzCi0qIGFwcHJveCAxNiBmb3Igc21hbGxlciAxTUIgcGFnZSBzaXplIENQTEJzIGZvciBhbGxpZ25tZW50IHB1cnBvc2VzCi0qIDEgZm9yIEwxIERhdGEgTWVtb3J5Ci0qIHBvc3NpYmx5IDEgZm9yIEwyIERhdGEgTWVtb3J5Ci0qIDEgZm9yIENPTkZJR19ERUJVR19IVU5UX0ZPUl9aRVJPCi0qIDEgZm9yIEFTWU5DIE1lbW9yeQotKi8KLSNkZWZpbmUgTUFYX1NXSVRDSF9EX0NQTEJTICgoKENQTEJfTUVNIC8gNCkgKyAxNiArIDEgKyAxICsgMSBcCi0JCQkJICsgQVNZTkNfTUVNT1JZX0NQTEJfQ09WRVJBR0UpICogMikKK2ludCBmaXJzdF9zd2l0Y2hlZF9pY3BsYiBQRFRfQVRUUjsKK2ludCBmaXJzdF9zd2l0Y2hlZF9kY3BsYiBQRFRfQVRUUjsKIAotLyoKLSogTnVtYmVyIG9mIHJlcXVpcmVkIGluc3RydWN0aW9uIENQTEIgc3dpdGNodGFibGUgZW50cmllcwotKiBNRU1TSVpFIC8gNCAod2UgbW9zdGx5IGluc3RhbGwgNE0gcGFnZSBzaXplIENQTEJzCi0qIGFwcHJveCAxMiBmb3Igc21hbGxlciAxTUIgcGFnZSBzaXplIENQTEJzIGZvciBhbGxpZ25tZW50IHB1cnBvc2VzCi0qIDEgZm9yIEwxIEluc3RydWN0aW9uIE1lbW9yeQotKiBwb3NzaWJseSAxIGZvciBMMiBJbnN0cnVjdGlvbiBNZW1vcnkKLSogMSBmb3IgQ09ORklHX0RFQlVHX0hVTlRfRk9SX1pFUk8KLSovCi0jZGVmaW5lIE1BWF9TV0lUQ0hfSV9DUExCUyAoKChDUExCX01FTSAvIDQpICsgMTIgKyAxICsgMSArIDEpICogMikKK3N0cnVjdCBjcGxiX2JvdW5kYXJ5IGRjcGxiX2JvdW5kc1s5XSBQRFRfQVRUUjsKK3N0cnVjdCBjcGxiX2JvdW5kYXJ5IGljcGxiX2JvdW5kc1s3XSBQRFRfQVRUUjsKIAoraW50IGljcGxiX25yX2JvdW5kcyBQRFRfQVRUUjsKK2ludCBkY3BsYl9ucl9ib3VuZHMgUERUX0FUVFI7CiAKLXVfbG9uZyBpY3BsYl90YWJsZVtNQVhfQ1BMQlMgKyAxXTsKLXVfbG9uZyBkY3BsYl90YWJsZVtNQVhfQ1BMQlMgKyAxXTsKLQotI2lmZGVmIENPTkZJR19DUExCX1NXSVRDSF9UQUJfTDEKLSMgZGVmaW5lIFBEVF9BVFRSIF9fYXR0cmlidXRlX18oKGwxX2RhdGEpKQotI2Vsc2UKLSMgZGVmaW5lIFBEVF9BVFRSCi0jZW5kaWYKLQotdV9sb25nIGlwZHRfdGFibGVbTUFYX1NXSVRDSF9JX0NQTEJTICsgMV0gUERUX0FUVFI7Ci11X2xvbmcgZHBkdF90YWJsZVtNQVhfU1dJVENIX0RfQ1BMQlMgKyAxXSBQRFRfQVRUUjsKLQotI2lmZGVmIENPTkZJR19DUExCX0lORk8KLXVfbG9uZyBpcGR0X3N3YXBjb3VudF90YWJsZVtNQVhfU1dJVENIX0lfQ1BMQlNdIFBEVF9BVFRSOwotdV9sb25nIGRwZHRfc3dhcGNvdW50X3RhYmxlW01BWF9TV0lUQ0hfRF9DUExCU10gUERUX0FUVFI7Ci0jZW5kaWYKLQotc3RydWN0IHNfY3BsYiB7Ci0Jc3RydWN0IGNwbGJfdGFiIGluaXRfaTsKLQlzdHJ1Y3QgY3BsYl90YWIgaW5pdF9kOwotCXN0cnVjdCBjcGxiX3RhYiBzd2l0Y2hfaTsKLQlzdHJ1Y3QgY3BsYl90YWIgc3dpdGNoX2Q7Ci19OwotCi0jaWYgZGVmaW5lZChDT05GSUdfQkZJTl9EQ0FDSEUpIHx8IGRlZmluZWQoQ09ORklHX0JGSU5fSUNBQ0hFKQotc3RhdGljIHN0cnVjdCBjcGxiX2Rlc2MgY3BsYl9kYXRhW10gPSB7Ci0JewotCQkuc3RhcnQgPSAwLAotCQkuZW5kID0gU0laRV8xSywKLQkJLnBzaXplID0gU0laRV8xSywKLQkJLmF0dHIgPSBJTklUSUFMX1QgfCBTV0lUQ0hfVCB8IElfQ1BMQiB8IERfQ1BMQiwKLQkJLmlfY29uZiA9IFNEUkFNX09PUFMsCi0JCS5kX2NvbmYgPSBTRFJBTV9PT1BTLAotI2lmIGRlZmluZWQoQ09ORklHX0RFQlVHX0hVTlRfRk9SX1pFUk8pCi0JCS52YWxpZCA9IDEsCi0jZWxzZQotCQkudmFsaWQgPSAwLAotI2VuZGlmCi0JCS5uYW1lID0gIlplcm8gUG9pbnRlciBHdWFyZCBQYWdlIiwKLQl9LAotCXsKLQkJLnN0YXJ0ID0gTDFfQ09ERV9TVEFSVCwKLQkJLmVuZCA9IEwxX0NPREVfU1RBUlQgKyBMMV9DT0RFX0xFTkdUSCwKLQkJLnBzaXplID0gU0laRV80TSwKLQkJLmF0dHIgPSBJTklUSUFMX1QgfCBTV0lUQ0hfVCB8IElfQ1BMQiwKLQkJLmlfY29uZiA9IEwxX0lNRU1PUlksCi0JCS5kX2NvbmYgPSAwLAotCQkudmFsaWQgPSAxLAotCQkubmFtZSA9ICJMMSBJLU1lbW9yeSIsCi0JfSwKLQl7Ci0JCS5zdGFydCA9IEwxX0RBVEFfQV9TVEFSVCwKLQkJLmVuZCA9IEwxX0RBVEFfQl9TVEFSVCArIEwxX0RBVEFfQl9MRU5HVEgsCi0JCS5wc2l6ZSA9IFNJWkVfNE0sCi0JCS5hdHRyID0gSU5JVElBTF9UIHwgU1dJVENIX1QgfCBEX0NQTEIsCi0JCS5pX2NvbmYgPSAwLAotCQkuZF9jb25mID0gTDFfRE1FTU9SWSwKLSNpZiAoKEwxX0RBVEFfQV9MRU5HVEggPiAwKSB8fCAoTDFfREFUQV9CX0xFTkdUSCA+IDApKQotCQkudmFsaWQgPSAxLAotI2Vsc2UKLQkJLnZhbGlkID0gMCwKLSNlbmRpZgotCQkubmFtZSA9ICJMMSBELU1lbW9yeSIsCi0JfSwKLQl7Ci0JCS5zdGFydCA9IDAsCi0JCS5lbmQgPSAwLCAgLyogZHluYW1pYyAqLwotCQkucHNpemUgPSAwLAotCQkuYXR0ciA9IElOSVRJQUxfVCB8IFNXSVRDSF9UIHwgSV9DUExCIHwgRF9DUExCLAotCQkuaV9jb25mID0gU0RSQU1fSUdFTkVSSUMsCi0JCS5kX2NvbmYgPSBTRFJBTV9ER0VORVJJQywKLQkJLnZhbGlkID0gMSwKLQkJLm5hbWUgPSAiS2VybmVsIE1lbW9yeSIsCi0JfSwKLQl7Ci0JCS5zdGFydCA9IDAsIC8qIGR5bmFtaWMgKi8KLQkJLmVuZCA9IDAsIC8qIGR5bmFtaWMgKi8KLQkJLnBzaXplID0gMCwKLQkJLmF0dHIgPSBJTklUSUFMX1QgfCBTV0lUQ0hfVCB8IERfQ1BMQiwKLQkJLmlfY29uZiA9IFNEUkFNX0lHRU5FUklDLAotCQkuZF9jb25mID0gU0RSQU1fRE5PTl9DSEJMLAotCQkudmFsaWQgPSAxLAotCQkubmFtZSA9ICJ1Q2xpbnV4IE1URCBNZW1vcnkiLAotCX0sCi0JewotCQkuc3RhcnQgPSAwLCAvKiBkeW5hbWljICovCi0JCS5lbmQgPSAwLCAgIC8qIGR5bmFtaWMgKi8KLQkJLnBzaXplID0gU0laRV8xTSwKLQkJLmF0dHIgPSBJTklUSUFMX1QgfCBTV0lUQ0hfVCB8IERfQ1BMQiwKLQkJLmRfY29uZiA9IFNEUkFNX0ROT05fQ0hCTCwKLQkJLnZhbGlkID0gMSwKLQkJLm5hbWUgPSAiVW5jYWNoZWQgRE1BIFpvbmUiLAotCX0sCi0JewotCQkuc3RhcnQgPSAwLCAvKiBkeW5hbWljICovCi0JCS5lbmQgPSAwLCAvKiBkeW5hbWljICovCi0JCS5wc2l6ZSA9IDAsCi0JCS5hdHRyID0gU1dJVENIX1QgfCBEX0NQTEIsCi0JCS5pX2NvbmYgPSAwLCAvKiBkeW5hbWljICovCi0JCS5kX2NvbmYgPSAwLCAvKiBkeW5hbWljICovCi0JCS52YWxpZCA9IDEsCi0JCS5uYW1lID0gIlJlc2VydmVkIE1lbW9yeSIsCi0JfSwKLQl7Ci0JCS5zdGFydCA9IEFTWU5DX0JBTkswX0JBU0UsCi0JCS5lbmQgPSBBU1lOQ19CQU5LM19CQVNFICsgQVNZTkNfQkFOSzNfU0laRSwKLQkJLnBzaXplID0gMCwKLQkJLmF0dHIgPSBTV0lUQ0hfVCB8IERfQ1BMQiwKLQkJLmRfY29uZiA9IFNEUkFNX0VCSVUsCi0JCS52YWxpZCA9IDEsCi0JCS5uYW1lID0gIkFzeW5jaHJvbm91cyBNZW1vcnkgQmFua3MiLAotCX0sCi0JewotCQkuc3RhcnQgPSBMMl9TVEFSVCwKLQkJLmVuZCA9IEwyX1NUQVJUICsgTDJfTEVOR1RILAotCQkucHNpemUgPSBTSVpFXzFNLAotCQkuYXR0ciA9IFNXSVRDSF9UIHwgSV9DUExCIHwgRF9DUExCLAotCQkuaV9jb25mID0gTDJfSU1FTU9SWSwKLQkJLmRfY29uZiA9IEwyX0RNRU1PUlksCi0JCS52YWxpZCA9IChMMl9MRU5HVEggPiAwKSwKLQkJLm5hbWUgPSAiTDIgTWVtb3J5IiwKLQl9LAotCXsKLQkJLnN0YXJ0ID0gQk9PVF9ST01fU1RBUlQsCi0JCS5lbmQgPSBCT09UX1JPTV9TVEFSVCArIEJPT1RfUk9NX0xFTkdUSCwKLQkJLnBzaXplID0gU0laRV8xTSwKLQkJLmF0dHIgPSBTV0lUQ0hfVCB8IElfQ1BMQiB8IERfQ1BMQiwKLQkJLmlfY29uZiA9IFNEUkFNX0lHRU5FUklDLAotCQkuZF9jb25mID0gU0RSQU1fREdFTkVSSUMsCi0JCS52YWxpZCA9IDEsCi0JCS5uYW1lID0gIk9uLUNoaXAgQm9vdFJPTSIsCi0JfSwKLX07Ci0KLXN0YXRpYyB1MTYgX19pbml0IGxvY2tfa2VybmVsX2NoZWNrKHUzMiBzdGFydCwgdTMyIGVuZCkKK3ZvaWQgX19pbml0IGdlbmVyYXRlX2NwbGJfdGFibGVzX2NwdSh1bnNpZ25lZCBpbnQgY3B1KQogewotCWlmIChzdGFydCA+PSAodTMyKV9lbmQgfHwgZW5kIDw9ICh1MzIpX3N0ZXh0KQotCQlyZXR1cm4gMDsKKwlpbnQgaV9kLCBpX2k7CisJdW5zaWduZWQgbG9uZyBhZGRyOwogCi0JLyogVGhpcyBjcGxiIGJsb2NrIG92ZXJsYXBwZWQgd2l0aCBrZXJuZWwgYXJlYS4gKi8KLQlyZXR1cm4gSU5fS0VSTkVMOwotfQorCXN0cnVjdCBjcGxiX2VudHJ5ICpkX3RibCA9IGRjcGxiX3RibFtjcHVdOworCXN0cnVjdCBjcGxiX2VudHJ5ICppX3RibCA9IGljcGxiX3RibFtjcHVdOwogCi1zdGF0aWMgdW5zaWduZWQgc2hvcnQgX19pbml0Ci1maWxsX2NwbGJ0YWIoc3RydWN0IGNwbGJfdGFiICp0YWJsZSwKLQkgICAgIHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kLAotCSAgICAgdW5zaWduZWQgbG9uZyBibG9ja19zaXplLCB1bnNpZ25lZCBsb25nIGNwbGJfZGF0YSkKLXsKLQlpbnQgaTsKKwlwcmludGsoS0VSTl9JTkZPICJOT01QVTogc2V0dGluZyB1cCBjcGxiIHRhYmxlc1xuIik7CiAKLQlzd2l0Y2ggKGJsb2NrX3NpemUpIHsKLQljYXNlIFNJWkVfNE06Ci0JCWkgPSAzOwotCQlicmVhazsKLQljYXNlIFNJWkVfMU06Ci0JCWkgPSAyOwotCQlicmVhazsKLQljYXNlIFNJWkVfNEs6Ci0JCWkgPSAxOwotCQlicmVhazsKLQljYXNlIFNJWkVfMUs6Ci0JZGVmYXVsdDoKLQkJaSA9IDA7Ci0JCWJyZWFrOworCWlfZCA9IGlfaSA9IDA7CisKKwkvKiBTZXQgdXAgdGhlIHplcm8gcGFnZS4gICovCisJZF90YmxbaV9kXS5hZGRyID0gMDsKKwlkX3RibFtpX2QrK10uZGF0YSA9IFNEUkFNX09PUFMgfCBQQUdFX1NJWkVfMUtCOworCisJLyogQ292ZXIga2VybmVsIG1lbW9yeSB3aXRoIDRNIHBhZ2VzLiAgKi8KKwlhZGRyID0gMDsKKworCWZvciAoOyBhZGRyIDwgbWVtb3J5X3N0YXJ0OyBhZGRyICs9IDQgKiAxMDI0ICogMTAyNCkgeworCQlkX3RibFtpX2RdLmFkZHIgPSBhZGRyOworCQlkX3RibFtpX2QrK10uZGF0YSA9IFNEUkFNX0RHRU5FUklDIHwgUEFHRV9TSVpFXzRNQjsKKwkJaV90YmxbaV9pXS5hZGRyID0gYWRkcjsKKwkJaV90YmxbaV9pKytdLmRhdGEgPSBTRFJBTV9JR0VORVJJQyB8IFBBR0VfU0laRV80TUI7CiAJfQogCi0JY3BsYl9kYXRhID0gKGNwbGJfZGF0YSAmIH4oMyA8PCAxNikpIHwgKGkgPDwgMTYpOwotCi0Jd2hpbGUgKChzdGFydCA8IGVuZCkgJiYgKHRhYmxlLT5wb3MgPCB0YWJsZS0+c2l6ZSkpIHsKLQotCQl0YWJsZS0+dGFiW3RhYmxlLT5wb3MrK10gPSBzdGFydDsKLQotCQlpZiAobG9ja19rZXJuZWxfY2hlY2soc3RhcnQsIHN0YXJ0ICsgYmxvY2tfc2l6ZSkgPT0gSU5fS0VSTkVMKQotCQkJdGFibGUtPnRhYlt0YWJsZS0+cG9zKytdID0KLQkJCSAgICBjcGxiX2RhdGEgfCBDUExCX0xPQ0sgfCBDUExCX0RJUlRZOwotCQllbHNlCi0JCQl0YWJsZS0+dGFiW3RhYmxlLT5wb3MrK10gPSBjcGxiX2RhdGE7Ci0KLQkJc3RhcnQgKz0gYmxvY2tfc2l6ZTsKKwkvKiBDb3ZlciBMMSBtZW1vcnkuICBPbmUgNE0gYXJlYSBmb3IgY29kZSBhbmQgZGF0YSBlYWNoIGlzIGVub3VnaC4gICovCisJaWYgKEwxX0RBVEFfQV9MRU5HVEggfHwgTDFfREFUQV9CX0xFTkdUSCkgeworCQlkX3RibFtpX2RdLmFkZHIgPSBMMV9EQVRBX0FfU1RBUlQ7CisJCWRfdGJsW2lfZCsrXS5kYXRhID0gTDFfRE1FTU9SWSB8IFBBR0VfU0laRV80TUI7CiAJfQotCXJldHVybiAwOworCWlfdGJsW2lfaV0uYWRkciA9IEwxX0NPREVfU1RBUlQ7CisJaV90YmxbaV9pKytdLmRhdGEgPSBMMV9JTUVNT1JZIHwgUEFHRV9TSVpFXzRNQjsKKworCWZpcnN0X3N3aXRjaGVkX2RjcGxiID0gaV9kOworCWZpcnN0X3N3aXRjaGVkX2ljcGxiID0gaV9pOworCisJQlVHX09OKGZpcnN0X3N3aXRjaGVkX2RjcGxiID4gTUFYX0NQTEJTKTsKKwlCVUdfT04oZmlyc3Rfc3dpdGNoZWRfaWNwbGIgPiBNQVhfQ1BMQlMpOworCisJd2hpbGUgKGlfZCA8IE1BWF9DUExCUykKKwkJZF90YmxbaV9kKytdLmRhdGEgPSAwOworCXdoaWxlIChpX2kgPCBNQVhfQ1BMQlMpCisJCWlfdGJsW2lfaSsrXS5kYXRhID0gMDsKIH0KIAotc3RhdGljIHVuc2lnbmVkIHNob3J0IF9faW5pdAotY2xvc2VfY3BsYnRhYihzdHJ1Y3QgY3BsYl90YWIgKnRhYmxlKQordm9pZCBfX2luaXQgZ2VuZXJhdGVfY3BsYl90YWJsZXNfYWxsKHZvaWQpCiB7CisJaW50IGlfZCwgaV9pOwogCi0Jd2hpbGUgKHRhYmxlLT5wb3MgPCB0YWJsZS0+c2l6ZSkgewotCi0JCXRhYmxlLT50YWJbdGFibGUtPnBvcysrXSA9IDA7Ci0JCXRhYmxlLT50YWJbdGFibGUtPnBvcysrXSA9IDA7IC8qICFDUExCX1ZBTElEICovCi0JfQotCXJldHVybiAwOwotfQotCi0vKiBoZWxwZXIgZnVuY3Rpb24gKi8KLXN0YXRpYyB2b2lkIF9faW5pdAotX19maWxsX2NvZGVfY3BsYnRhYihzdHJ1Y3QgY3BsYl90YWIgKnQsIGludCBpLCB1MzIgYV9zdGFydCwgdTMyIGFfZW5kKQotewotCWlmIChjcGxiX2RhdGFbaV0ucHNpemUpIHsKLQkJZmlsbF9jcGxidGFiKHQsCi0JCQkJY3BsYl9kYXRhW2ldLnN0YXJ0LAotCQkJCWNwbGJfZGF0YVtpXS5lbmQsCi0JCQkJY3BsYl9kYXRhW2ldLnBzaXplLAotCQkJCWNwbGJfZGF0YVtpXS5pX2NvbmYpOwotCX0gZWxzZSB7Ci0jaWYgZGVmaW5lZChDT05GSUdfQkZJTl9JQ0FDSEUpCi0JCWlmIChBTk9NQUxZXzA1MDAwMjYzICYmIGkgPT0gU0RSQU1fS0VSTikgewotCQkJZmlsbF9jcGxidGFiKHQsCi0JCQkJCWNwbGJfZGF0YVtpXS5zdGFydCwKLQkJCQkJY3BsYl9kYXRhW2ldLmVuZCwKLQkJCQkJU0laRV80TSwKLQkJCQkJY3BsYl9kYXRhW2ldLmlfY29uZik7Ci0JCX0gZWxzZQotI2VuZGlmCi0JCXsKLQkJCWZpbGxfY3BsYnRhYih0LAotCQkJCQljcGxiX2RhdGFbaV0uc3RhcnQsCi0JCQkJCWFfc3RhcnQsCi0JCQkJCVNJWkVfMU0sCi0JCQkJCWNwbGJfZGF0YVtpXS5pX2NvbmYpOwotCQkJZmlsbF9jcGxidGFiKHQsCi0JCQkJCWFfc3RhcnQsCi0JCQkJCWFfZW5kLAotCQkJCQlTSVpFXzRNLAotCQkJCQljcGxiX2RhdGFbaV0uaV9jb25mKTsKLQkJCWZpbGxfY3BsYnRhYih0LCBhX2VuZCwKLQkJCQkJY3BsYl9kYXRhW2ldLmVuZCwKLQkJCQkJU0laRV8xTSwKLQkJCQkJY3BsYl9kYXRhW2ldLmlfY29uZik7Ci0JCX0KLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIF9faW5pdAotX19maWxsX2RhdGFfY3BsYnRhYihzdHJ1Y3QgY3BsYl90YWIgKnQsIGludCBpLCB1MzIgYV9zdGFydCwgdTMyIGFfZW5kKQotewotCWlmIChjcGxiX2RhdGFbaV0ucHNpemUpIHsKLQkJZmlsbF9jcGxidGFiKHQsCi0JCQkJY3BsYl9kYXRhW2ldLnN0YXJ0LAotCQkJCWNwbGJfZGF0YVtpXS5lbmQsCi0JCQkJY3BsYl9kYXRhW2ldLnBzaXplLAotCQkJCWNwbGJfZGF0YVtpXS5kX2NvbmYpOwotCX0gZWxzZSB7Ci0JCWZpbGxfY3BsYnRhYih0LAotCQkJCWNwbGJfZGF0YVtpXS5zdGFydCwKLQkJCQlhX3N0YXJ0LCBTSVpFXzFNLAotCQkJCWNwbGJfZGF0YVtpXS5kX2NvbmYpOwotCQlmaWxsX2NwbGJ0YWIodCwgYV9zdGFydCwKLQkJCQlhX2VuZCwgU0laRV80TSwKLQkJCQljcGxiX2RhdGFbaV0uZF9jb25mKTsKLQkJZmlsbF9jcGxidGFiKHQsIGFfZW5kLAotCQkJCWNwbGJfZGF0YVtpXS5lbmQsCi0JCQkJU0laRV8xTSwKLQkJCQljcGxiX2RhdGFbaV0uZF9jb25mKTsKLQl9Ci19Ci0KLXZvaWQgX19pbml0IGdlbmVyYXRlX2NwbGJfdGFibGVzKHZvaWQpCi17Ci0KLQl1MTYgaSwgaiwgcHJvY2VzczsKLQl1MzIgYV9zdGFydCwgYV9lbmQsIGFzLCBhZSwgYXNfMW07Ci0KLQlzdHJ1Y3QgY3BsYl90YWIgKnRfaSA9IE5VTEw7Ci0Jc3RydWN0IGNwbGJfdGFiICp0X2QgPSBOVUxMOwotCXN0cnVjdCBzX2NwbGIgY3BsYjsKLQotCXByaW50ayhLRVJOX0lORk8gIk5PTVBVOiBzZXR0aW5nIHVwIGNwbGIgdGFibGVzIGZvciBnbG9iYWwgYWNjZXNzXG4iKTsKLQotCWNwbGIuaW5pdF9pLnNpemUgPSBNQVhfQ1BMQlM7Ci0JY3BsYi5pbml0X2Quc2l6ZSA9IE1BWF9DUExCUzsKLQljcGxiLnN3aXRjaF9pLnNpemUgPSBNQVhfU1dJVENIX0lfQ1BMQlM7Ci0JY3BsYi5zd2l0Y2hfZC5zaXplID0gTUFYX1NXSVRDSF9EX0NQTEJTOwotCi0JY3BsYi5pbml0X2kucG9zID0gMDsKLQljcGxiLmluaXRfZC5wb3MgPSAwOwotCWNwbGIuc3dpdGNoX2kucG9zID0gMDsKLQljcGxiLnN3aXRjaF9kLnBvcyA9IDA7Ci0KLQljcGxiLmluaXRfaS50YWIgPSBpY3BsYl90YWJsZTsKLQljcGxiLmluaXRfZC50YWIgPSBkY3BsYl90YWJsZTsKLQljcGxiLnN3aXRjaF9pLnRhYiA9IGlwZHRfdGFibGU7Ci0JY3BsYi5zd2l0Y2hfZC50YWIgPSBkcGR0X3RhYmxlOwotCi0JY3BsYl9kYXRhW1NEUkFNX0tFUk5dLmVuZCA9IG1lbW9yeV9lbmQ7Ci0KKwlpX2QgPSAwOworCS8qIE5vcm1hbCBSQU0sIGluY2x1ZGluZyBNVEQgRlMuICAqLwogI2lmZGVmIENPTkZJR19NVERfVUNMSU5VWAotCWNwbGJfZGF0YVtTRFJBTV9SQU1fTVREXS5zdGFydCA9IG1lbW9yeV9tdGRfc3RhcnQ7Ci0JY3BsYl9kYXRhW1NEUkFNX1JBTV9NVERdLmVuZCA9IG1lbW9yeV9tdGRfc3RhcnQgKyBtdGRfc2l6ZTsKLQljcGxiX2RhdGFbU0RSQU1fUkFNX01URF0udmFsaWQgPSBtdGRfc2l6ZSA+IDA7Ci0jIGlmIGRlZmluZWQoQ09ORklHX1JPTUZTX0ZTKQotCWNwbGJfZGF0YVtTRFJBTV9SQU1fTVREXS5hdHRyIHw9IElfQ1BMQjsKLQotCS8qCi0JICogVGhlIFJPTUZTX0ZTIHNpemUgaXMgb2Z0ZW4gbm90IG11bHRpcGxlIG9mIDFNQi4KLQkgKiBUaGlzIGNhbiBjYXVzZSBtdWx0aXBsZSBDUExCIHNldHMgY292ZXJpbmcgdGhlIHNhbWUgbWVtb3J5IGFyZWEuCi0JICogVGhpcyB3aWxsIHRoZW4gY2F1c2UgbXVsdGlwbGUgQ1BMQiBoaXQgZXhjZXB0aW9ucy4KLQkgKiBXb3JrYXJvdW5kOiBXZSBlbnN1cmUgYSBjb250aWd1b3VzIG1lbW9yeSBhcmVhIGJ5IGV4dGVuZGluZyB0aGUga2VybmVsCi0JICogbWVtb3J5IHNlY3Rpb24gb3ZlciB0aGUgbXRkIHNlY3Rpb24uCi0JICogRm9yIFJPTUZTX0ZTIG1lbW9yeSBtdXN0IGJlIGNvdmVyZWQgd2l0aCBJQ1BMQnMgYW55d2F5cy4KLQkgKiBTbyB0aGVyZSBpcyBubyBkaWZmZXJlbmNlIGJldHdlZW4ga2VybmVsIGFuZCBtdGQgbWVtb3J5IHNldHVwLgotCSAqLwotCi0JY3BsYl9kYXRhW1NEUkFNX0tFUk5dLmVuZCA9IG1lbW9yeV9tdGRfc3RhcnQgKyBtdGRfc2l6ZTs7Ci0JY3BsYl9kYXRhW1NEUkFNX1JBTV9NVERdLnZhbGlkID0gMDsKLQotIyBlbmRpZgorCWRjcGxiX2JvdW5kc1tpX2RdLmVhZGRyID0gbWVtb3J5X210ZF9zdGFydCArIG10ZF9zaXplOwogI2Vsc2UKLQljcGxiX2RhdGFbU0RSQU1fUkFNX01URF0udmFsaWQgPSAwOworCWRjcGxiX2JvdW5kc1tpX2RdLmVhZGRyID0gbWVtb3J5X2VuZDsKICNlbmRpZgotCi0JY3BsYl9kYXRhW1NEUkFNX0RNQVpdLnN0YXJ0ID0gX3JhbWVuZCAtIERNQV9VTkNBQ0hFRF9SRUdJT047Ci0JY3BsYl9kYXRhW1NEUkFNX0RNQVpdLmVuZCA9IF9yYW1lbmQ7Ci0KLQljcGxiX2RhdGFbUkVTX01FTV0uc3RhcnQgPSBfcmFtZW5kOwotCWNwbGJfZGF0YVtSRVNfTUVNXS5lbmQgPSBwaHlzaWNhbF9tZW1fZW5kOwotCi0JaWYgKHJlc2VydmVkX21lbV9kY2FjaGVfb24pCi0JCWNwbGJfZGF0YVtSRVNfTUVNXS5kX2NvbmYgPSBTRFJBTV9ER0VORVJJQzsKLQllbHNlCi0JCWNwbGJfZGF0YVtSRVNfTUVNXS5kX2NvbmYgPSBTRFJBTV9ETk9OX0NIQkw7Ci0KLQlpZiAocmVzZXJ2ZWRfbWVtX2ljYWNoZV9vbikKLQkJY3BsYl9kYXRhW1JFU19NRU1dLmlfY29uZiA9IFNEUkFNX0lHRU5FUklDOwotCWVsc2UKLQkJY3BsYl9kYXRhW1JFU19NRU1dLmlfY29uZiA9IFNEUkFNX0lOT05fQ0hCTDsKLQotCWZvciAoaSA9IFpFUk9fUDsgaSA8IEFSUkFZX1NJWkUoY3BsYl9kYXRhKTsgKytpKSB7Ci0JCWlmICghY3BsYl9kYXRhW2ldLnZhbGlkKQotCQkJY29udGludWU7Ci0KLQkJYXNfMW0gPSBjcGxiX2RhdGFbaV0uc3RhcnQgJSBTSVpFXzFNOwotCi0JCS8qIFdlIG5lZWQgdG8gbWFrZSBzdXJlIGFsbCBzZWN0aW9ucyBhcmUgcHJvcGVybHkgMU0gYWxpZ25lZAotCQkgKiBIb3dldmVyIGJldHdlZW4gS2VybmVsIE1lbW9yeSBhbmQgdGhlIEtlcm5lbCBtdGQgc2VjdGlvbiwgZGVwZW5kaW5nIG9uIHRoZQotCQkgKiByb290ZnMgc2l6ZSwgdGhlcmUgY2FuIGJlIG92ZXJsYXBwaW5nIG1lbW9yeSBhcmVhcy4KLQkJICovCi0KLQkJaWYgKGFzXzFtICYmIGkgIT0gTDFJX01FTSAmJiBpICE9IEwxRF9NRU0pIHsKLSNpZmRlZiBDT05GSUdfTVREX1VDTElOVVgKLQkJCWlmIChpID09IFNEUkFNX1JBTV9NVEQpIHsKLQkJCQlpZiAoKGNwbGJfZGF0YVtTRFJBTV9LRVJOXS5lbmQgKyAxKSA+IGNwbGJfZGF0YVtTRFJBTV9SQU1fTVREXS5zdGFydCkKLQkJCQkJY3BsYl9kYXRhW1NEUkFNX1JBTV9NVERdLnN0YXJ0ID0gKGNwbGJfZGF0YVtpXS5zdGFydCAmICgtMipTSVpFXzFNKSkgKyBTSVpFXzFNOwotCQkJCWVsc2UKLQkJCQkJY3BsYl9kYXRhW1NEUkFNX1JBTV9NVERdLnN0YXJ0ID0gKGNwbGJfZGF0YVtpXS5zdGFydCAmICgtMipTSVpFXzFNKSk7Ci0JCQl9IGVsc2UKLSNlbmRpZgotCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIlVuYWxpZ25lZCBTdGFydCBvZiAlcyBhdCAweCVYXG4iLAotCQkJCSAgICAgICBjcGxiX2RhdGFbaV0ubmFtZSwgY3BsYl9kYXRhW2ldLnN0YXJ0KTsKLQkJfQotCi0JCWFzID0gY3BsYl9kYXRhW2ldLnN0YXJ0ICUgU0laRV80TTsKLQkJYWUgPSBjcGxiX2RhdGFbaV0uZW5kICUgU0laRV80TTsKLQotCQlpZiAoYXMpCi0JCQlhX3N0YXJ0ID0gY3BsYl9kYXRhW2ldLnN0YXJ0ICsgKFNJWkVfNE0gLSAoYXMpKTsKLQkJZWxzZQotCQkJYV9zdGFydCA9IGNwbGJfZGF0YVtpXS5zdGFydDsKLQotCQlhX2VuZCA9IGNwbGJfZGF0YVtpXS5lbmQgLSBhZTsKLQotCQlmb3IgKGogPSBJTklUSUFMX1Q7IGogPD0gU1dJVENIX1Q7IGorKykgewotCi0JCQlzd2l0Y2ggKGopIHsKLQkJCWNhc2UgSU5JVElBTF9UOgotCQkJCWlmIChjcGxiX2RhdGFbaV0uYXR0ciAmIElOSVRJQUxfVCkgewotCQkJCQl0X2kgPSAmY3BsYi5pbml0X2k7Ci0JCQkJCXRfZCA9ICZjcGxiLmluaXRfZDsKLQkJCQkJcHJvY2VzcyA9IDE7Ci0JCQkJfSBlbHNlCi0JCQkJCXByb2Nlc3MgPSAwOwotCQkJCWJyZWFrOwotCQkJY2FzZSBTV0lUQ0hfVDoKLQkJCQlpZiAoY3BsYl9kYXRhW2ldLmF0dHIgJiBTV0lUQ0hfVCkgewotCQkJCQl0X2kgPSAmY3BsYi5zd2l0Y2hfaTsKLQkJCQkJdF9kID0gJmNwbGIuc3dpdGNoX2Q7Ci0JCQkJCXByb2Nlc3MgPSAxOwotCQkJCX0gZWxzZQotCQkJCQlwcm9jZXNzID0gMDsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJCXByb2Nlc3MgPSAwOwotCQkJCWJyZWFrOwotCQkJfQotCi0JCQlpZiAoIXByb2Nlc3MpCi0JCQkJY29udGludWU7Ci0JCQlpZiAoY3BsYl9kYXRhW2ldLmF0dHIgJiBJX0NQTEIpCi0JCQkJX19maWxsX2NvZGVfY3BsYnRhYih0X2ksIGksIGFfc3RhcnQsIGFfZW5kKTsKLQotCQkJaWYgKGNwbGJfZGF0YVtpXS5hdHRyICYgRF9DUExCKQotCQkJCV9fZmlsbF9kYXRhX2NwbGJ0YWIodF9kLCBpLCBhX3N0YXJ0LCBhX2VuZCk7Ci0JCX0KKwlkY3BsYl9ib3VuZHNbaV9kKytdLmRhdGEgPSBTRFJBTV9ER0VORVJJQzsKKwkvKiBETUEgdW5jYWNoZWQgcmVnaW9uLiAgKi8KKwlpZiAoRE1BX1VOQ0FDSEVEX1JFR0lPTikgeworCQlkY3BsYl9ib3VuZHNbaV9kXS5lYWRkciA9IF9yYW1lbmQ7CisJCWRjcGxiX2JvdW5kc1tpX2QrK10uZGF0YSA9IFNEUkFNX0ROT05fQ0hCTDsKIAl9CisJaWYgKF9yYW1lbmQgIT0gcGh5c2ljYWxfbWVtX2VuZCkgeworCQkvKiBSZXNlcnZlZCBtZW1vcnkuICAqLworCQlkY3BsYl9ib3VuZHNbaV9kXS5lYWRkciA9IHBoeXNpY2FsX21lbV9lbmQ7CisJCWRjcGxiX2JvdW5kc1tpX2QrK10uZGF0YSA9IChyZXNlcnZlZF9tZW1fZGNhY2hlX29uID8KKwkJCQkJICAgIFNEUkFNX0RHRU5FUklDIDogU0RSQU1fRE5PTl9DSEJMKTsKKwl9CisJLyogQWRkcmVzc2luZyBob2xlIHVwIHRvIHRoZSBhc3luYyBiYW5rLiAgKi8KKwlkY3BsYl9ib3VuZHNbaV9kXS5lYWRkciA9IEFTWU5DX0JBTkswX0JBU0U7CisJZGNwbGJfYm91bmRzW2lfZCsrXS5kYXRhID0gMDsKKwkvKiBBU1lOQyBiYW5rcy4gICovCisJZGNwbGJfYm91bmRzW2lfZF0uZWFkZHIgPSBBU1lOQ19CQU5LM19CQVNFICsgQVNZTkNfQkFOSzNfU0laRTsKKwlkY3BsYl9ib3VuZHNbaV9kKytdLmRhdGEgPSBTRFJBTV9FQklVOworCS8qIEFkZHJlc3NpbmcgaG9sZSB1cCB0byBCb290Uk9NLiAgKi8KKwlkY3BsYl9ib3VuZHNbaV9kXS5lYWRkciA9IEJPT1RfUk9NX1NUQVJUOworCWRjcGxiX2JvdW5kc1tpX2QrK10uZGF0YSA9IDA7CisJLyogQm9vdFJPTSAtLSBsYXJnZXN0IG9uZSBzaG91bGQgYmUgbGVzcyB0aGFuIDEgbWVnLiAgKi8KKwlkY3BsYl9ib3VuZHNbaV9kXS5lYWRkciA9IEJPT1RfUk9NX1NUQVJUICsgKDEgKiAxMDI0ICogMTAyNCk7CisJZGNwbGJfYm91bmRzW2lfZCsrXS5kYXRhID0gU0RSQU1fREdFTkVSSUM7CisJaWYgKEwyX0xFTkdUSCkgeworCQkvKiBBZGRyZXNzaW5nIGhvbGUgdXAgdG8gTDIgU1JBTS4gICovCisJCWRjcGxiX2JvdW5kc1tpX2RdLmVhZGRyID0gTDJfU1RBUlQ7CisJCWRjcGxiX2JvdW5kc1tpX2QrK10uZGF0YSA9IDA7CisJCS8qIEwyIFNSQU0uICAqLworCQlkY3BsYl9ib3VuZHNbaV9kXS5lYWRkciA9IEwyX1NUQVJUICsgTDJfTEVOR1RIOworCQlkY3BsYl9ib3VuZHNbaV9kKytdLmRhdGEgPSBMMl9ETUVNT1JZOworCX0KKwlkY3BsYl9ucl9ib3VuZHMgPSBpX2Q7CisJQlVHX09OKGRjcGxiX25yX2JvdW5kcyA+IEFSUkFZX1NJWkUoZGNwbGJfYm91bmRzKSk7CiAKLS8qIGNsb3NlIHRhYmxlcyAqLwotCi0JY2xvc2VfY3BsYnRhYigmY3BsYi5pbml0X2kpOwotCWNsb3NlX2NwbGJ0YWIoJmNwbGIuaW5pdF9kKTsKLQotCWNwbGIuaW5pdF9pLnRhYltjcGxiLmluaXRfaS5wb3NdID0gLTE7Ci0JY3BsYi5pbml0X2QudGFiW2NwbGIuaW5pdF9kLnBvc10gPSAtMTsKLQljcGxiLnN3aXRjaF9pLnRhYltjcGxiLnN3aXRjaF9pLnBvc10gPSAtMTsKLQljcGxiLnN3aXRjaF9kLnRhYltjcGxiLnN3aXRjaF9kLnBvc10gPSAtMTsKLQotfQotCisJaV9pID0gMDsKKwkvKiBOb3JtYWwgUkFNLCBpbmNsdWRpbmcgTVREIEZTLiAgKi8KKyNpZmRlZiBDT05GSUdfTVREX1VDTElOVVgKKwlpY3BsYl9ib3VuZHNbaV9pXS5lYWRkciA9IG1lbW9yeV9tdGRfc3RhcnQgKyBtdGRfc2l6ZTsKKyNlbHNlCisJaWNwbGJfYm91bmRzW2lfaV0uZWFkZHIgPSBtZW1vcnlfZW5kOwogI2VuZGlmCi0KKwlpY3BsYl9ib3VuZHNbaV9pKytdLmRhdGEgPSBTRFJBTV9JR0VORVJJQzsKKwkvKiBETUEgdW5jYWNoZWQgcmVnaW9uLiAgKi8KKwlpZiAoRE1BX1VOQ0FDSEVEX1JFR0lPTikgeworCQlpY3BsYl9ib3VuZHNbaV9pXS5lYWRkciA9IF9yYW1lbmQ7CisJCWljcGxiX2JvdW5kc1tpX2krK10uZGF0YSA9IDA7CisJfQorCWlmIChfcmFtZW5kICE9IHBoeXNpY2FsX21lbV9lbmQpIHsKKwkJLyogUmVzZXJ2ZWQgbWVtb3J5LiAgKi8KKwkJaWNwbGJfYm91bmRzW2lfaV0uZWFkZHIgPSBwaHlzaWNhbF9tZW1fZW5kOworCQlpY3BsYl9ib3VuZHNbaV9pKytdLmRhdGEgPSAocmVzZXJ2ZWRfbWVtX2ljYWNoZV9vbiA/CisJCQkJCSAgICBTRFJBTV9JR0VORVJJQyA6IFNEUkFNX0lOT05fQ0hCTCk7CisJfQorCS8qIEFkZHJlc3NpbmcgaG9sZSB1cCB0byBCb290Uk9NLiAgKi8KKwlpY3BsYl9ib3VuZHNbaV9pXS5lYWRkciA9IEJPT1RfUk9NX1NUQVJUOworCWljcGxiX2JvdW5kc1tpX2krK10uZGF0YSA9IDA7CisJLyogQm9vdFJPTSAtLSBsYXJnZXN0IG9uZSBzaG91bGQgYmUgbGVzcyB0aGFuIDEgbWVnLiAgKi8KKwlpY3BsYl9ib3VuZHNbaV9pXS5lYWRkciA9IEJPT1RfUk9NX1NUQVJUICsgKDEgKiAxMDI0ICogMTAyNCk7CisJaWNwbGJfYm91bmRzW2lfaSsrXS5kYXRhID0gU0RSQU1fSUdFTkVSSUM7CisJaWYgKEwyX0xFTkdUSCkgeworCQkvKiBBZGRyZXNzaW5nIGhvbGUgdXAgdG8gTDIgU1JBTSwgaW5jbHVkaW5nIHRoZSBhc3luYyBiYW5rLiAgKi8KKwkJaWNwbGJfYm91bmRzW2lfaV0uZWFkZHIgPSBMMl9TVEFSVDsKKwkJaWNwbGJfYm91bmRzW2lfaSsrXS5kYXRhID0gMDsKKwkJLyogTDIgU1JBTS4gICovCisJCWljcGxiX2JvdW5kc1tpX2ldLmVhZGRyID0gTDJfU1RBUlQgKyBMMl9MRU5HVEg7CisJCWljcGxiX2JvdW5kc1tpX2krK10uZGF0YSA9IEwyX0lNRU1PUlk7CisJfQorCWljcGxiX25yX2JvdW5kcyA9IGlfaTsKKwlCVUdfT04oaWNwbGJfbnJfYm91bmRzID4gQVJSQVlfU0laRShpY3BsYl9ib3VuZHMpKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4va2VybmVsL2NwbGItbm9tcHUvY3BsYm1nci5TIGIvYXJjaC9ibGFja2Zpbi9rZXJuZWwvY3BsYi1ub21wdS9jcGxibWdyLlMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1Y2YzYWMuLjAwMDAwMDAKLS0tIGEvYXJjaC9ibGFja2Zpbi9rZXJuZWwvY3BsYi1ub21wdS9jcGxibWdyLlMKKysrIC9kZXYvbnVsbApAQCAtMSw2NDYgKzAsMCBAQAotLyoKLSAqIEZpbGU6ICAgICAgICAgYXJjaC9ibGFja2Zpbi9tYWNoLWNvbW1vbi9jcGxibWd0ci5TCi0gKiBCYXNlZCBvbjoKLSAqIEF1dGhvcjogICAgICAgTEcgU29mdCBJbmRpYQotICoKLSAqIENyZWF0ZWQ6ICAgICAgPwotICogRGVzY3JpcHRpb246ICBDUExCIHJlcGxhY2VtZW50IHJvdXRpbmUgZm9yIENQTEIgbWlzbWF0Y2gKLSAqCi0gKiBNb2RpZmllZDoKLSAqICAgICAgICAgICAgICAgQ29weXJpZ2h0IDIwMDQtMjAwNiBBbmFsb2cgRGV2aWNlcyBJbmMuCi0gKgotICogQnVnczogICAgICAgICBFbnRlciBidWdzIGF0IGh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZy8KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSB0aGUgZmlsZSBDT1BZSU5HLCBvciB3cml0ZQotICogdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAqIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0gKi8KLQotLyogVXNhZ2U6IGludCBfY3BsYl9tZ3IoaXNfZGF0YV9taXNzLGludCBlbmFibGVfY2FjaGUpCi0gKiBpc19kYXRhX21pc3M9PTIgPT4gTWFyayBhcyBEaXJ0eSwgd3JpdGUgdG8gdGhlIGNsZWFuIGRhdGEgcGFnZQotICogaXNfZGF0YV9taXNzPT0xID0+IFJlcGxhY2UgYSBkYXRhIENQTEIuCi0gKiBpc19kYXRhX21pc3M9PTAgPT4gUmVwbGFjZSBhbiBpbnN0cnVjdGlvbiBDUExCLgotICoKLSAqIFJldHVybnM6Ci0gKiBDUExCX1JFTE9BREVECT0+IFN1Y2Nlc3NmdWxseSB1cGRhdGVkIENQTEIgdGFibGUuCi0gKiBDUExCX05PX1VOTE9DS0VECT0+IEFsbCBDUExCcyBhcmUgbG9ja2VkLCBzbyBjYW5ub3QgYmUgZXZpY3RlZC4KLSAqCQkJICAgVGhpcyBpbmRpY2F0ZXMgdGhhdCB0aGUgQ1BMQnMgaW4gdGhlIGNvbmZpZ3VyYXRpb24KLSAqCQkJICAgdGFibGVpIGFyZSBiYWRseSBjb25maWd1cmVkLCBhcyB0aGlzIHNob3VsZCBuZXZlcgotICoJCQkgICBvY2N1ci4KLSAqIENQTEJfTk9fQUREUl9NQVRDSAk9PiBUaGUgYWRkcmVzcyBiZWluZyBhY2Nlc3NlZCwgdGhhdCB0cmlnZ2VyZWQgdGhlCi0gKgkJCSAgIGV4Y2VwdGlvbiwgaXMgbm90IGNvdmVyZWQgYnkgYW55IG9mIHRoZSBDUExCcyBpbgotICoJCQkgICB0aGUgY29uZmlndXJhdGlvbiB0YWJsZS4gVGhlIGFwcGxpY2F0aW9uIGlzCi0gKgkJCSAgIHByZXN1bWFibHkgbWlzYmVoYXZpbmcuCi0gKiBDUExCX1BST1RfVklPTAk9PiBUaGUgYWRkcmVzcyBiZWluZyBhY2Nlc3NlZCwgdGhhdCB0cmlnZ2VyZWQgdGhlCi0gKgkJCSAgIGV4Y2VwdGlvbiwgd2FzIG5vdCBhIGZpcnN0LXdyaXRlIHRvIGEgY2xlYW4gV3JpdGUKLSAqCQkJICAgQmFjayBEYXRhIHBhZ2UsIGFuZCBzbyBwcmVzdW1hYmx5IGlzIGEgZ2VudWluZQotICoJCQkgICB2aW9sYXRpb24gb2YgdGhlIHBhZ2UncyBwcm90ZWN0aW9uIGF0dHJpYnV0ZXMuCi0gKgkJCSAgIFRoZSBhcHBsaWNhdGlvbiBpcyBtaXNiZWhhdmluZy4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgotI2luY2x1ZGUgPGFzbS9ibGFja2Zpbi5oPgotI2luY2x1ZGUgPGFzbS9jcGxiLmg+Ci0KLSNpZmRlZiBDT05GSUdfRVhDUFRfSVJRX1NZU0NfTDEKLS5zZWN0aW9uIC5sMS50ZXh0Ci0jZWxzZQotLnRleHQKLSNlbmRpZgotCi0uYWxpZ24gMjsKLUVOVFJZKF9jcGxiX21ncikKLQotCVstLVNQXT0oIFI3OjQsUDU6MyApOwotCi0JQ0MgPSBSMCA9PSAyOwotCUlGIENDIEpVTVAgLkxkY3BsYl93cml0ZTsKLQotCUNDID0gUjAgPT0gMDsKLQlJRiAhQ0MgSlVNUCAuTGRjcGxiX21pc3NfY29tcGFyZTsKLQotCS8qIElDUExCIE1pc3MgRXhjZXB0aW9uLiBXZSBuZWVkIHRvIGNob29zZSBvbmUgb2YgdGhlCi0JKiBjdXJyZW50bHktaW5zdGFsbGVkIENQTEJzLCBhbmQgcmVwbGFjZSBpdCB3aXRoIG9uZQotCSogZnJvbSB0aGUgY29uZmlndXJhdGlvbiB0YWJsZS4KLQkqLwotCi0JLyogQSBtdWx0aS13b3JkIGluc3RydWN0aW9uIGNhbiBjcm9zcyBhIHBhZ2UgYm91bmRhcnkuIFRoaXMgbWVhbnMgdGhlCi0JICogZmlyc3QgcGFydCBvZiB0aGUgaW5zdHJ1Y3Rpb24gY2FuIGJlIGluIGEgdmFsaWQgcGFnZSwgYnV0IHRoZQotCSAqIHNlY29uZCBwYXJ0IGlzIG5vdCwgYW5kIGhlbmNlIGdlbmVyYXRlcyB0aGUgaW5zdHJ1Y3Rpb24gbWlzcy4KLQkgKiBIb3dldmVyLCB0aGUgZmF1bHQgYWRkcmVzcyBpcyBmb3IgdGhlIHN0YXJ0IG9mIHRoZSBpbnN0cnVjdGlvbiwKLQkgKiBub3QgdGhlIHBhcnQgdGhhdCdzIGluIHRoZSBiYWQgcGFnZS4gVGhlcmVmb3JlLCB3ZSBoYXZlIHRvIGNoZWNrCi0JICogd2hldGhlciB0aGUgZmF1bHQgYWRkcmVzcyBhcHBsaWVzIHRvIGEgcGFnZSB0aGF0IGlzIGFscmVhZHkgcHJlc2VudAotCSAqIGluIHRoZSB0YWJsZS4KLQkgKi8KLQotCVA0LkwgPSBMTyhJQ1BMQl9GQVVMVF9BRERSKTsKLQlQNC5IID0gSEkoSUNQTEJfRkFVTFRfQUREUik7Ci0KLQlQMSA9IDE2OwotCVA1LkwgPSBfcGFnZV9zaXplX3RhYmxlOwotCVA1LkggPSBfcGFnZV9zaXplX3RhYmxlOwotCi0JUDAuTCA9IExPKElDUExCX0RBVEEwKTsKLQlQMC5IID0gSEkoSUNQTEJfREFUQTApOwotCVI0ID0gW1A0XTsJCS8qIEdldCBmYXVsdGluZyBhZGRyZXNzKi8KLQlSNiA9IDY0OwkJLyogQWR2YW5jZSBwYXN0IHRoZSBmYXVsdCBhZGRyZXNzLCB3aGljaCovCi0JUjYgPSBSNiArIFI0OwkJLyogd2UnbGwgdXNlIGlmIHdlIGZpbmQgYSBtYXRjaCovCi0JUjMgPSAoKDE2IDw8IDgpIHwgMik7CS8qIEV4dHJhY3QgbWFzaywgdHdvIGJpdHMgYXQgcG9zbiAxNiAqLwotCi0JUjUgPSAwOwotLkxpc2VhcmNoOgotCi0JUjEgPSBbUDAtMHgxMDBdOwkvKiBBZGRyZXNzIGZvciB0aGlzIENQTEIgKi8KLQotCVIwID0gW1AwKytdOwkJLyogSW5mbyBmb3IgdGhpcyBDUExCKi8KLQlDQyA9IEJJVFRTVChSMCwwKTsJLyogSXMgdGhlIENQTEIgdmFsaWQ/Ki8KLQlJRiAhQ0MgSlVNUCAuTG5vbWF0Y2g7CS8qIFNraXAgaXQsIGlmIG5vdC4qLwotCUNDID0gUjQgPCBSMShJVSk7CS8qIElmIGZhdWx0IGFkZHJlc3MgbGVzcyB0aGFuIHBhZ2Ugc3RhcnQqLwotCUlGIENDIEpVTVAgLkxub21hdGNoOwkvKiB0aGVuIHNraXAgdGhpcyBvbmUuKi8KLQlSMiA9IEVYVFJBQ1QoUjAsUjMuTCkgKFopOwkvKiBHZXQgcGFnZSBzaXplKi8KLQlQMSA9IFIyOwotCVAxID0gUDUgKyAoUDE8PDIpOwkvKiBpbmRleCBpbnRvIHBhZ2Utc2l6ZSB0YWJsZSovCi0JUjIgPSBbUDFdOwkJLyogR2V0IHRoZSBwYWdlIHNpemUqLwotCVIxID0gUjEgKyBSMjsJCS8qIGFuZCBhZGQgdG8gcGFnZSBzdGFydCwgdG8gZ2V0IHBhZ2UgZW5kKi8KLQlDQyA9IFI0IDwgUjEoSVUpOwkvKiBhbmQgc2VlIHdoZXRoZXIgZmF1bHQgYWRkciBpcyBpbiBwYWdlLiovCi0JSUYgIUNDIFI0ID0gUjY7CQkvKiBJZiBzbywgYWR2YW5jZSB0aGUgYWRkcmVzcyBhbmQgZmluaXNoIGxvb3AuKi8KLQlJRiAhQ0MgSlVNUCAuTGlzZWFyY2hfZG9uZTsKLS5Mbm9tYXRjaDoKLQkvKiBHbyBhcm91bmQgYWdhaW4qLwotCVI1ICs9IDE7Ci0JQ0MgPSBCSVRUU1QoUjUsIDQpOwkvKiBpLmUgQ0MgPSBSNSA+PSAxNiovCi0JSUYgIUNDIEpVTVAgLkxpc2VhcmNoOwotCi0uTGlzZWFyY2hfZG9uZToKLQlJMCA9IFI0OwkJLyogRmF1bHQgYWRkcmVzcyB3ZSdsbCBzZWFyY2ggZm9yKi8KLQotCS8qIHNldCB1cCBwb2ludGVycyAqLwotCVAwLkwgPSBMTyhJQ1BMQl9EQVRBMCk7Ci0JUDAuSCA9IEhJKElDUExCX0RBVEEwKTsKLQotCS8qIFRoZSByZXBsYWNlbWVudCBwcm9jZWR1cmUgZm9yIElDUExCcyAqLwotCi0JUDQuTCA9IExPKElNRU1fQ09OVFJPTCk7Ci0JUDQuSCA9IEhJKElNRU1fQ09OVFJPTCk7Ci0KLQkvKiBUdXJuIG9mZiBDUExCcyB3aGlsZSB3ZSB3b3JrLCBuZWNlc3NhcnkgYWNjb3JkaW5nIHRvIEhSTSBiZWZvcmUKLQkgKiBtb2RpZnlpbmcgQ1BMQiBkZXNjcmlwdG9ycwotCSAqLwotCVI1ID0gW1A0XTsJCS8qIENvbnRyb2wgUmVnaXN0ZXIqLwotCUJJVENMUihSNSxFTklDUExCX1ApOwotCUNMSSBSMTsKLQlTU1lOQzsJCS8qIFNTWU5DIHJlcXVpcmVkIGJlZm9yZSB3cml0aW5nIHRvIElNRU1fQ09OVFJPTC4gKi8KLQkuYWxpZ24gODsKLQlbUDRdID0gUjU7Ci0JU1NZTkM7Ci0JU1RJIFIxOwotCi0JUjEgPSAtMTsJCS8qIGVuZCBwb2ludCBjb21wYXJpc29uICovCi0JUjMgPSAxNjsJCS8qIGNvdW50ZXIgKi8KLQotCS8qIFNlYXJjaCB0aHJvdWdoIENQTEJzIGZvciBmaXJzdCBub24tbG9ja2VkIGVudHJ5ICovCi0JLyogT3ZlcndyaXRlIGl0IGJ5IG1vdmluZyBldmVyeW9uZSBlbHNlIHVwIGJ5IDEgKi8KLS5MaWNoZWNrX2xvY2s6Ci0JUjAgPSBbUDArK107Ci0JUjMgPSBSMyArIFIxOwotCUNDID0gUjMgPT0gUjE7Ci0JSUYgQ0MgSlVNUCAuTGFsbF9sb2NrZWQ7Ci0JQ0MgPSBCSVRUU1QoUjAsIDApOwkJLyogYW4gaW52YWxpZCBlbnRyeSBpcyBnb29kICovCi0JSUYgIUNDIEpVTVAgLkxpZm91bmRfdmljdGltOwotCUNDID0gQklUVFNUKFIwLDEpOwkJLyogYnV0IGEgbG9ja2VkIGVudHJ5IGlzbid0ICovCi0JSUYgQ0MgSlVNUCAuTGljaGVja19sb2NrOwotCi0uTGlmb3VuZF92aWN0aW06Ci0jaWZkZWYgQ09ORklHX0NQTEJfSU5GTwotCVI3ID0gW1AwIC0gMHgxMDRdOwotCVAyLkwgPSBfaXBkdF90YWJsZTsKLQlQMi5IID0gX2lwZHRfdGFibGU7Ci0JUDMuTCA9IF9pcGR0X3N3YXBjb3VudF90YWJsZTsKLQlQMy5IID0gX2lwZHRfc3dhcGNvdW50X3RhYmxlOwotCVAzICs9IC00OwotLkxpY291bnQ6Ci0JUjIgPSBbUDJdOwkvKiBhZGRyZXNzIGZyb20gY29uZmlnIHRhYmxlICovCi0JUDIgKz0gODsKLQlQMyArPSA4OwotCUNDID0gUjI9PS0xOwotCUlGIENDIEpVTVAgLkxpY291bnRfZG9uZTsKLQlDQyA9IFI3PT1SMjsKLQlJRiAhQ0MgSlVNUCAuTGljb3VudDsKLQlSNyA9IFtQM107Ci0JUjcgKz0gMTsKLQlbUDNdID0gUjc7Ci0JQ1NZTkM7Ci0uTGljb3VudF9kb25lOgotI2VuZGlmCi0JTEMwPVIzOwotCUxTRVRVUCguTGlzX21vdmUsLkxpZV9tb3ZlKSBMQzA7Ci0uTGlzX21vdmU6Ci0JUjAgPSBbUDBdOwotCVtQMCAtIDRdID0gUjA7Ci0JUjAgPSBbUDAgLSAweDEwMF07Ci0JW1AwLTB4MTA0XSA9IFIwOwotLkxpZV9tb3ZlOgotCVAwKz00OwotCi0JLyogQ2xlYXIgSUNQTEJfREFUQTE1LCBpbiBjYXNlIHdlIGRvbid0IGZpbmQgYSByZXBsYWNlbWVudAotCSAqIG90aGVyd2lzZSwgd2Ugd291bGQgaGF2ZSBhIGR1cGxpY2F0ZSBlbnRyeSwgYW5kIHdpbGwgY3Jhc2gKLQkgKi8KLQlSMCA9IDA7Ci0JW1AwIC0gNF0gPSBSMDsKLQotCS8qIFdlJ3ZlIG1hZGUgc3BhY2UgaW4gdGhlIElDUExCIHRhYmxlLCBzbyB0aGF0IElDUExCMTUKLQkgKiBpcyBub3cgZnJlZSB0byBiZSBvdmVyd3JpdHRlbi4gTmV4dCwgd2UgaGF2ZSB0byBkZXRlcm1pbmUKLQkgKiB3aGljaCBDUExCIHdlIG5lZWQgdG8gaW5zdGFsbCwgZnJvbSB0aGUgY29uZmlndXJhdGlvbgotCSAqIHRhYmxlLiBUaGlzIGlzIGEgbWF0dGVyIG9mIGdldHRpbmcgdGhlIHN0YXJ0LW9mLXBhZ2UKLQkgKiBhZGRyZXNzZXMgYW5kIHBhZ2UtbGVuZ3RocyBmcm9tIHRoZSBjb25maWcgdGFibGUsIGFuZAotCSAqIGRldGVybWluaW5nIHdoZXRoZXIgdGhlIGZhdWx0IGFkZHJlc3MgZmFsbHMgd2l0aGluIHRoYXQKLQkgKiByYW5nZS4KLSAJICovCi0KLQlQMi5MID0gX2lwZHRfdGFibGU7Ci0JUDIuSCA9IF9pcGR0X3RhYmxlOwotI2lmZGVmCUNPTkZJR19DUExCX0lORk8KLQlQMy5MID0gX2lwZHRfc3dhcGNvdW50X3RhYmxlOwotCVAzLkggPSBfaXBkdF9zd2FwY291bnRfdGFibGU7Ci0JUDMgKz0gLTg7Ci0jZW5kaWYKLQlQMC5MID0gX3BhZ2Vfc2l6ZV90YWJsZTsKLQlQMC5IID0gX3BhZ2Vfc2l6ZV90YWJsZTsKLQotCS8qIFJldHJpZXZlIG91ciBmYXVsdCBhZGRyZXNzICh3aGljaCBtYXkgaGF2ZSBiZWVuIGFkdmFuY2VkCi0JICogYmVjYXVzZSB0aGUgZmF1bHRpbmcgaW5zdHJ1Y3Rpb24gY3Jvc3NlZCBhIHBhZ2UgYm91bmRhcnkpLgotCSAqLwotCi0JUjAgPSBJMDsKLQotCS8qIEFuIGV4dHJhY3Rpb24gcGF0dGVybiwgdG8gZ2V0IHRoZSBwYWdlLXNpemUgYml0cyBmcm9tCi0JICogdGhlIENQTEIgZGF0YSBlbnRyeS4gQml0cyAxNi0xNywgc28gdHdvIGJpdHMgYXQgcG9zbiAxNi4KLQkgKi8KLQotCVIxID0gKCgxNjw8OCl8Mik7Ci0uTGluZXh0OglSNCA9IFtQMisrXTsJLyogYWRkcmVzcyBmcm9tIGNvbmZpZyB0YWJsZSAqLwotCVIyID0gW1AyKytdOwkvKiBkYXRhIGZyb20gY29uZmlnIHRhYmxlICovCi0jaWZkZWYJQ09ORklHX0NQTEJfSU5GTwotCVAzICs9IDg7Ci0jZW5kaWYKLQotCUNDID0gUjQgPT0gLTE7CS8qIEVuZCBvZiBjb25maWcgdGFibGUqLwotCUlGIENDIEpVTVAgLkxub19wYWdlX2luX3RhYmxlOwotCi0JLyogU2VlIGlmIGZhaWxlZCBhZGRyZXNzID4gc3RhcnQgYWRkcmVzcyAqLwotCUNDID0gUjQgPD0gUjAoSVUpOwotCUlGICFDQyBKVU1QIC5MaW5leHQ7Ci0KLQkvKiBleHRyYWN0IHBhZ2Ugc2l6ZSAoMTc6MTYpKi8KLQlSMyA9IEVYVFJBQ1QoUjIsIFIxLkwpIChaKTsKLQotCS8qIGFkZCBwYWdlIHNpemUgdG8gYWRkciB0byBnZXQgcmFuZ2UgKi8KLQotCVA1ID0gUjM7Ci0JUDUgPSBQMCArIChQNSA8PCAyKTsJLyogc2NhbGVkLCBmb3IgaW50IGFjY2VzcyovCi0JUjMgPSBbUDVdOwotCVIzID0gUjMgKyBSNDsKLQotCS8qIFNlZSBpZiBmYWlsZWQgYWRkcmVzcyA8IChzdGFydCBhZGRyZXNzICsgcGFnZSBzaXplKSAqLwotCUNDID0gUjAgPCBSMyhJVSk7Ci0JSUYgIUNDIEpVTVAgLkxpbmV4dDsKLQotCS8qIFdlJ3ZlIGZvdW5kIGEgQ1BMQiBpbiB0aGUgY29uZmlnIHRhYmxlIHRoYXQgY292ZXJzCi0JICogdGhlIGZhdWx0aW5nIGFkZHJlc3MsIHNvIGluc3RhbGwgdGhpcyBDUExCIGludG8gdGhlCi0JICogbGFzdCBlbnRyeSBvZiB0aGUgdGFibGUuCi0JICovCi0KLQlQMS5MID0gTE8oSUNQTEJfREFUQTE1KTsJCS8qIElDUExCX0RBVEExNSAqLwotCVAxLkggPSBISShJQ1BMQl9EQVRBMTUpOwotCVtQMV0gPSBSMjsKLQlbUDEtMHgxMDBdID0gUjQ7Ci0jaWZkZWYJQ09ORklHX0NQTEJfSU5GTwotCVIzID0gW1AzXTsKLQlSMyArPSAxOwotCVtQM10gPSBSMzsKLSNlbmRpZgotCi0JLyogUDQgcG9pbnRzIHRvIElNRU1fQ09OVFJPTCwgYW5kIFI1IGNvbnRhaW5zIGl0cyBvbGQKLQkgKiB2YWx1ZSwgYWZ0ZXIgd2UgZGlzYWJsZWQgSUNQTEJTLiBSZS1lbmFibGUgdGhlbS4KLQkgKi8KLQotCUJJVFNFVChSNSxFTklDUExCX1ApOwotCUNMSSBSMjsKLQlTU1lOQzsJCS8qIFNTWU5DIHJlcXVpcmVkIGJlZm9yZSB3cml0aW5nIHRvIElNRU1fQ09OVFJPTC4gKi8KLQkuYWxpZ24gODsKLQlbUDRdID0gUjU7Ci0JU1NZTkM7Ci0JU1RJIFIyOwotCi0JKCBSNzo0LFA1OjMgKSA9IFtTUCsrXTsKLQlSMCA9IENQTEJfUkVMT0FERUQ7Ci0JUlRTOwotCi0vKiBGQUlMRUQgQ0FTRVMqLwotLkxub19wYWdlX2luX3RhYmxlOgotCVIwID0gQ1BMQl9OT19BRERSX01BVENIOwotCUpVTVAgLkxmYWlsX3JldDsKLQotLkxhbGxfbG9ja2VkOgotCVIwID0gQ1BMQl9OT19VTkxPQ0tFRDsKLQlKVU1QIC5MZmFpbF9yZXQ7Ci0KLS5McHJvdF92aW9sYXRpb246Ci0JUjAgPSBDUExCX1BST1RfVklPTDsKLQotLkxmYWlsX3JldDoKLQkvKiBNYWtlIHN1cmUgd2UgdHVybiBwcm90ZWN0aW9uL2NhY2hlIGJhY2sgb24sIGV2ZW4gaW4gdGhlIGZhaWxpbmcgY2FzZSAqLwotCUJJVFNFVChSNSxFTklDUExCX1ApOwotCUNMSSBSMjsKLQlTU1lOQzsgICAgICAgICAgLyogU1NZTkMgcmVxdWlyZWQgYmVmb3JlIHdyaXRpbmcgdG8gSU1FTV9DT05UUk9MLiAqLwotCS5hbGlnbiA4OwotCVtQNF0gPSBSNTsKLQlTU1lOQzsKLQlTVEkgUjI7Ci0KLQkoIFI3OjQsUDU6MyApID0gW1NQKytdOwotCVJUUzsKLQotLkxkY3BsYl93cml0ZToKLQotCS8qIGlmIGEgRENQTEIgaXMgbWFya2VkIGFzIHdyaXRlLWJhY2sgKENQTEJfV1Q9PTApLCBhbmQKLQkgKiBpdCBpcyBjbGVhbiAoQ1BMQl9ESVJUWT09MCksIHRoZW4gYSB3cml0ZSB0byB0aGUKLQkgKiBDUExCJ3MgcGFnZSB0cmlnZ2VycyBhIHByb3RlY3Rpb24gdmlvbGF0aW9uLiBXZSBoYXZlIHRvCi0JICogbWFyayB0aGUgQ1BMQiBhcyBkaXJ0eSwgdG8gaW5kaWNhdGUgdGhhdCB0aGVyZSBhcmUKLQkgKiBwZW5kaW5nIHdyaXRlcyBhc3NvY2lhdGVkIHdpdGggdGhlIENQTEIuCi0JICovCi0KLQlQNC5MID0gTE8oRENQTEJfU1RBVFVTKTsKLQlQNC5IID0gSEkoRENQTEJfU1RBVFVTKTsKLQlQMy5MID0gTE8oRENQTEJfREFUQTApOwotCVAzLkggPSBISShEQ1BMQl9EQVRBMCk7Ci0JUjUgPSBbUDRdOwotCi0JLyogQSBwcm90ZWN0aW9uIHZpb2xhdGlvbiBjYW4gYmUgY2F1c2VkIGJ5IG1vcmUgdGhhbiBqdXN0IHdyaXRlcwotCSAqIHRvIGEgY2xlYW4gV0IgcGFnZSwgc28gd2UgaGF2ZSB0byBlbnN1cmUgdGhhdDoKLQkgKiAtIEl0J3MgYSB3cml0ZQotCSAqIC0gdG8gYSBjbGVhbiBXQiBwYWdlCi0JICogLSBhbmQgaXMgYWxsb3dlZCBpbiB0aGUgbW9kZSB0aGUgYWNjZXNzIG9jY3VycmVkLgotCSAqLwotCi0JQ0MgPSBCSVRUU1QoUjUsIDE2KTsJLyogZW5zdXJlIGl0IHdhcyBhIHdyaXRlKi8KLQlJRiAhQ0MgSlVNUCAuTHByb3RfdmlvbGF0aW9uOwotCi0JLyogdG8gY2hlY2sgdGhlIHJlc3QsIHdlIGhhdmUgdG8gcmV0cmlldmUgdGhlIERDUExCLiovCi0KLQkvKiBUaGUgbG93IGhhbGYgb2YgRENQTEJfU1RBVFVTIGlzIGEgYml0IG1hc2sqLwotCi0JUjIgPSBSNS5MIChaKTsJLyogaW5kaWNhdGluZyB3aGljaCBDUExCIHRyaWdnZXJlZCB0aGUgZXZlbnQuKi8KLQlSMyA9IDMwOwkvKiBzbyB3ZSBjYW4gdXNlIHRoaXMgdG8gZGV0ZXJtaW5lIHRoZSBvZmZzZXQqLwotCVIyLkwgPSBTSUdOQklUUyBSMjsKLQlSMiA9IFIyLkwgKFopOwkvKiBpbnRvIHRoZSBEQ1BMQiB0YWJsZS4qLwotCVIzID0gUjMgLSBSMjsKLQlQNCA9IFIzOwotCVAzID0gUDMgKyAoUDQ8PDIpOwotCVIzID0gW1AzXTsJLyogUmV0cmlldmUgdGhlIENQTEIqLwotCi0JLyogTm93IHdlIGNhbiBjaGVjayB3aGV0aGVyIGl0J3MgYSBjbGVhbiBXQiBwYWdlKi8KLQotCUNDID0gQklUVFNUKFIzLCAxNCk7CS8qIDA9PVdCLCAxPT1XVCovCi0JSUYgQ0MgSlVNUCAuTHByb3RfdmlvbGF0aW9uOwotCUNDID0gQklUVFNUKFIzLCA3KTsJLyogMCA9PSBjbGVhbiwgMSA9PSBkaXJ0eSovCi0JSUYgQ0MgSlVNUCAuTHByb3RfdmlvbGF0aW9uOwotCi0JLyogQ2hlY2sgd2hldGhlciB0aGUgd3JpdGUgaXMgYWxsb3dlZCBpbiB0aGUgbW9kZSB0aGF0IHdhcyBhY3RpdmUuKi8KLQotCVIyID0gMTw8MzsJCS8qIGNoZWNraW5nIHdyaXRlIGluIHVzZXIgbW9kZSovCi0JQ0MgPSBCSVRUU1QoUjUsIDE3KTsJLyogMD09d2FzIHVzZXIsIDE9PXdhcyBzdXBlciovCi0JUjUgPSBDQzsKLQlSMiA8PD0gUjU7CQkvKiBpZiB3YXMgc3VwZXIsIGNoZWNrIHdyaXRlIGluIHN1cGVyIG1vZGUqLwotCVIyID0gUjMgJiBSMjsKLQlDQyA9IFIyID09IDA7Ci0JSUYgQ0MgSlVNUCAuTHByb3RfdmlvbGF0aW9uOwotCi0JLyogSXQncyBhIGdlbnVpbmUgd3JpdGUtdG8tY2xlYW4tcGFnZS4qLwotCi0JQklUU0VUKFIzLCA3KTsJCS8qIG1hcmsgYXMgZGlydHkqLwotCVtQM10gPSBSMzsJCS8qIGFuZCB3cml0ZSBiYWNrLiovCi0JTk9QOwotCUNTWU5DOwotCSggUjc6NCxQNTozICkgPSBbU1ArK107Ci0JUjAgPSBDUExCX1JFTE9BREVEOwotCVJUUzsKLQotLkxkY3BsYl9taXNzX2NvbXBhcmU6Ci0KLQkvKiBEYXRhIENQTEIgTWlzcyBldmVudC4gV2UgbmVlZCB0byBjaG9vc2UgYSBDUExCIHRvCi0JICogZXZpY3QsIGFuZCB0aGVuIGxvY2F0ZSBhIG5ldyBDUExCIHRvIGluc3RhbGwgZnJvbSB0aGUKLQkgKiBjb25maWcgdGFibGUsIHRoYXQgY292ZXJzIHRoZSBmYXVsdGluZyBhZGRyZXNzLgotCSAqLwotCi0JUDEuTCA9IExPKERDUExCX0RBVEExNSk7Ci0JUDEuSCA9IEhJKERDUExCX0RBVEExNSk7Ci0KLQlQNC5MID0gTE8oRENQTEJfRkFVTFRfQUREUik7Ci0JUDQuSCA9IEhJKERDUExCX0ZBVUxUX0FERFIpOwotCVI0ID0gW1A0XTsKLQlJMCA9IFI0OwotCi0JLyogVGhlIHJlcGxhY2VtZW50IHByb2NlZHVyZSBmb3IgRENQTEJzKi8KLQotCVI2ID0gUjE7CS8qIFNhdmUgZm9yIGxhdGVyKi8KLQotCS8qIFR1cm4gb2ZmIENQTEJzIHdoaWxlIHdlIHdvcmsuKi8KLQlQNC5MID0gTE8oRE1FTV9DT05UUk9MKTsKLQlQNC5IID0gSEkoRE1FTV9DT05UUk9MKTsKLQlSNSA9IFtQNF07Ci0JQklUQ0xSKFI1LEVORENQTEJfUCk7Ci0JQ0xJIFIwOwotCVNTWU5DOwkJLyogU1NZTkMgcmVxdWlyZWQgYmVmb3JlIHdyaXRpbmcgdG8gRE1FTV9DT05UUk9MLiAqLwotCS5hbGlnbiA4OwotCVtQNF0gPSBSNTsKLQlTU1lOQzsKLQlTVEkgUjA7Ci0KLQkvKiBTdGFydCBsb29raW5nIGZvciBhIENQTEIgdG8gZXZpY3QuIE91ciBvcmRlciBvZiBwcmVmZXJlbmNlCi0JICogaXM6IGludmFsaWQgQ1BMQnMsIGNsZWFuIENQTEJzLCBkaXJ0eSBDUExCcy4gTG9ja2VkIENQTEJzCi0JICogYXJlIG5vIGdvb2QuCi0JICovCi0KLQlJMS5MID0gTE8oRENQTEJfREFUQTApOwotCUkxLkggPSBISShEQ1BMQl9EQVRBMCk7Ci0JUDEgPSAyOwotCVAyID0gMTY7Ci0JSTIuTCA9IF9kY3BsYl9wcmVmZXJlbmNlOwotCUkyLkggPSBfZGNwbGJfcHJlZmVyZW5jZTsKLQlMU0VUVVAoLkxzZHNlYXJjaDEsIC5MZWRzZWFyY2gxKSBMQzAgPSBQMTsKLS5Mc2RzZWFyY2gxOgotCVIwID0gW0kyKytdOwkJLyogR2V0IHRoZSBiaXRzIHdlJ3JlIGludGVyZXN0ZWQgaW4qLwotCVAwID0gSTE7CQkvKiBHbyBiYWNrIHRvIHN0YXJ0IG9mIHRhYmxlKi8KLQlMU0VUVVAgKC5Mc2RzZWFyY2gyLCAuTGVkc2VhcmNoMikgTEMxID0gUDI7Ci0uTHNkc2VhcmNoMjoKLQlSMSA9IFtQMCsrXTsJCS8qIEZldGNoIGVhY2ggaW5zdGFsbGVkIENQTEIgaW4gdHVybiovCi0JUjIgPSBSMSAmIFIwOwkJLyogYW5kIHRlc3QgZm9yIGludGVyZXN0aW5nIGJpdHMuKi8KLQlDQyA9IFIyID09IDA7CQkvKiBJZiBub25lIGFyZSBzZXQsIGl0J2xsIGRvLiovCi0JSUYgIUNDIEpVTVAgLkxza2lwX3N0YWNrX2NoZWNrOwotCi0JUjIgPSBbUDAgLSAweDEwNF07IAkvKiBSMiAtIFBhZ2VTdGFydCAqLwotCVAzLkwgPSBfcGFnZV9zaXplX3RhYmxlOyAvKiByZXRyaWV2ZSBlbmQgYWRkcmVzcyAqLwotCVAzLkggPSBfcGFnZV9zaXplX3RhYmxlOyAvKiByZXRyaWV2ZSBlbmQgYWRkcmVzcyAqLwotCVIzID0gMHgxMDAyOwkJLyogMTZ0aCAtIHBvc2l0aW9uLCAyIGJpdHMgLWxlbmd0aCAqLwotI2lmIEFOT01BTFlfMDUwMDAyMDkKLQlub3A7CQkJLyogQW5vbWFseSAwNTAwMDIwOSAqLwotI2VuZGlmCi0JUjcgPSBFWFRSQUNUKFIxLFIzLmwpOwotCVI3ID0gUjcgPDwgMjsJCS8qIFBhZ2Ugc2l6ZSBpbmRleCBvZmZzZXQgKi8KLQlQNSA9IFI3OwotCVAzID0gUDMgKyBQNTsKLQlSNyA9IFtQM107CQkvKiBwYWdlIHNpemUgaW4gYnl0ZXMgKi8KLQotCVI3ID0gUjIgKyBSNzsJCS8qIFI3IC0gUGFnZUVuZCAqLwotCVI0ID0gU1A7IAkJLyogVGVzdCBTUCBpcyBpbiByYW5nZSAqLwotCi0JQ0MgPSBSNyA8IFI0OwkJLyogaWYgUGFnZUVuZCA8IFNQICovCi0JSUYgQ0MgSlVNUCAuTGRmb3VuZF92aWN0aW07Ci0JUjMgPSAweDI4NDsJCS8qIHN0YWNrIGxlbmd0aCBmcm9tIHN0YXJ0IG9mIHRyYXAgdGlsbAotCQkJCSAqIHRoZSBwb2ludC4KLQkJCQkgKiAyMCBzdGFjayBsb2NhdGlvbnMgZm9yIGZ1dHVyZSBtb2RpZmljYXRpb25zCi0JCQkJICovCi0JUjQgPSBSNCArIFIzOwotCUNDID0gUjQgPCBSMjsJCS8qIGlmIFNQICsgc3RhY2tsZW4gPCBQYWdlU3RhcnQgKi8KLQlJRiBDQyBKVU1QIC5MZGZvdW5kX3ZpY3RpbTsKLS5Mc2tpcF9zdGFja19jaGVjazoKLQotLkxlZHNlYXJjaDI6IE5PUDsKLS5MZWRzZWFyY2gxOiBOT1A7Ci0KLQkvKiBJZiB3ZSBnb3QgaGVyZSwgd2UgZGlkbid0IGZpbmQgYSBEQ1BMQiB3ZSBjb25zaWRlcmVkCi0JICogcmVwbGFjYWJsZSwgd2hpY2ggbWVhbnMgYWxsIG9mIHRoZW0gd2VyZSBsb2NrZWQuCi0JICovCi0KLQlKVU1QIC5MYWxsX2xvY2tlZDsKLS5MZGZvdW5kX3ZpY3RpbToKLQotI2lmZGVmIENPTkZJR19DUExCX0lORk8KLQlSNyA9IFtQMCAtIDB4MTA0XTsKLQlQMi5MID0gX2RwZHRfdGFibGU7Ci0JUDIuSCA9IF9kcGR0X3RhYmxlOwotCVAzLkwgPSBfZHBkdF9zd2FwY291bnRfdGFibGU7Ci0JUDMuSCA9IF9kcGR0X3N3YXBjb3VudF90YWJsZTsKLQlQMyArPSAtNDsKLS5MZGljb3VudDoKLQlSMiA9IFtQMl07Ci0JUDIgKz0gODsKLQlQMyArPSA4OwotCUNDID0gUjI9PS0xOwotCUlGIENDIEpVTVAgLkxkaWNvdW50X2RvbmU7Ci0JQ0MgPSBSNz09UjI7Ci0JSUYgIUNDIEpVTVAgLkxkaWNvdW50OwotCVI3ID0gW1AzXTsKLQlSNyArPSAxOwotCVtQM10gPSBSNzsKLS5MZGljb3VudF9kb25lOgotI2VuZGlmCi0KLQkvKiBDbGVhbiBkb3duIHRoZSBoYXJkd2FyZSBsb29wcyovCi0JUjIgPSAwOwotCUxDMSA9IFIyOwotCUxDMCA9IFIyOwotCi0JLyogVGhlcmUncyBhIHN1aXRhYmxlIHZpY3RpbSBpbiBbUDAtNF0gKGJlY2F1c2Ugd2UndmUKLQkgKiBhZHZhbmNlZCBhbHJlYWR5KS4KLQkgKi8KLQotLkxEZG92ZXJ3cml0ZToKLQotCS8qIFtQMC00XSBpcyBhIHN1aXRhYmxlIHZpY3RpbSBDUExCLCBzbyB3ZSB3YW50IHRvCi0JICogb3ZlcndyaXRlIGl0IGJ5IG1vdmluZyBhbGwgdGhlIGZvbGxvd2luZyBDUExCcwotCSAqIG9uZSBzcGFjZSBjbG9zZXIgdG8gdGhlIHN0YXJ0LgotCSAqLwotCi0JUjEuTCA9IExPKERDUExCX0RBVEExNik7CQkvKiBEQ1BMQl9EQVRBMTUgKyA0ICovCi0JUjEuSCA9IEhJKERDUExCX0RBVEExNik7Ci0JUjAgPSBQMDsKLQotCS8qIElmIHRoZSB2aWN0aW0gaGFwcGVucyB0byBiZSBpbiBEQ1BMQjE1LAotCSAqIHdlIGRvbid0IG5lZWQgdG8gbW92ZSBhbnl0aGluZy4KLQkgKi8KLQotCUNDID0gUjEgPT0gUjA7Ci0JSUYgQ0MgSlVNUCAuTGRlX21vdmVkOwotCVIxID0gUjEgLSBSMDsKLQlSMSA+Pj0gMjsKLQlQMSA9IFIxOwotCUxTRVRVUCguTGRzX21vdmUsIC5MZGVfbW92ZSkgTEMwPVAxOwotLkxkc19tb3ZlOgotCVIwID0gW1AwKytdOwkvKiBtb3ZlIGRhdGEgKi8KLQlbUDAgLSA4XSA9IFIwOwotCVIwID0gW1AwLTB4MTA0XQkvKiBtb3ZlIGFkZHJlc3MgKi8KLS5MZGVfbW92ZToKLQkgW1AwLTB4MTA4XSA9IFIwOwotCi0uTGRlX21vdmVkOgotCU5PUDsKLQotCS8qIENsZWFyIERDUExCX0RBVEExNSwgaW4gY2FzZSB3ZSBkb24ndCBmaW5kIGEgcmVwbGFjZW1lbnQKLQkgKiBvdGhlcndpc2UsIHdlIHdvdWxkIGhhdmUgYSBkdXBsaWNhdGUgZW50cnksIGFuZCB3aWxsIGNyYXNoCi0JICovCi0JUjAgPSAwOwotCVtQMCAtIDB4NF0gPSBSMDsKLQotCS8qIFdlJ3ZlIG5vdyBtYWRlIHNwYWNlIGluIERDUExCMTUgZm9yIHRoZSBuZXcgQ1BMQiB0byBiZQotCSAqIGluc3RhbGxlZC4gVGhlIG5leHQgc3RhZ2UgaXMgdG8gbG9jYXRlIGEgQ1BMQiBpbiB0aGUKLQkgKiBjb25maWcgdGFibGUgdGhhdCBjb3ZlcnMgdGhlIGZhdWx0aW5nIGFkZHJlc3MuCi0JICovCi0KLQlSMCA9IEkwOwkJLyogT3VyIGZhdWx0aW5nIGFkZHJlc3MgKi8KLQotCVAyLkwgPSBfZHBkdF90YWJsZTsKLQlQMi5IID0gX2RwZHRfdGFibGU7Ci0jaWZkZWYJQ09ORklHX0NQTEJfSU5GTwotCVAzLkwgPSBfZHBkdF9zd2FwY291bnRfdGFibGU7Ci0JUDMuSCA9IF9kcGR0X3N3YXBjb3VudF90YWJsZTsKLQlQMyArPSAtODsKLSNlbmRpZgotCi0JUDEuTCA9IF9wYWdlX3NpemVfdGFibGU7Ci0JUDEuSCA9IF9wYWdlX3NpemVfdGFibGU7Ci0KLQkvKiBBbiBleHRyYWN0aW9uIHBhdHRlcm4sIHRvIHJldHJpZXZlIGJpdHMgMTc6MTYuKi8KLQotCVIxID0gKDE2PDw4KXwyOwotLkxkbmV4dDoJUjQgPSBbUDIrK107CS8qIGFkZHJlc3MgKi8KLQlSMiA9IFtQMisrXTsJLyogZGF0YSAqLwotI2lmZGVmCUNPTkZJR19DUExCX0lORk8KLQlQMyArPSA4OwotI2VuZGlmCi0KLQlDQyA9IFI0ID09IC0xOwotCUlGIENDIEpVTVAgLkxub19wYWdlX2luX3RhYmxlOwotCi0JLyogU2VlIGlmIGZhaWxlZCBhZGRyZXNzID4gc3RhcnQgYWRkcmVzcyAqLwotCUNDID0gUjQgPD0gUjAoSVUpOwotCUlGICFDQyBKVU1QIC5MZG5leHQ7Ci0KLQkvKiBleHRyYWN0IHBhZ2Ugc2l6ZSAoMTc6MTYpKi8KLQlSMyA9IEVYVFJBQ1QoUjIsIFIxLkwpIChaKTsKLQotCS8qIGFkZCBwYWdlIHNpemUgdG8gYWRkciB0byBnZXQgcmFuZ2UgKi8KLQotCVA1ID0gUjM7Ci0JUDUgPSBQMSArIChQNSA8PCAyKTsKLQlSMyA9IFtQNV07Ci0JUjMgPSBSMyArIFI0OwotCi0JLyogU2VlIGlmIGZhaWxlZCBhZGRyZXNzIDwgKHN0YXJ0IGFkZHJlc3MgKyBwYWdlIHNpemUpICovCi0JQ0MgPSBSMCA8IFIzKElVKTsKLQlJRiAhQ0MgSlVNUCAuTGRuZXh0OwotCi0JLyogV2UndmUgZm91bmQgdGhlIENQTEIgdGhhdCBzaG91bGQgYmUgaW5zdGFsbGVkLCBzbwotCSAqIHdyaXRlIGl0IGludG8gQ1BMQjE1LCBtYXNraW5nIG9mZiBhbnkgY2FjaGluZyBiaXRzCi0JICogaWYgbmVjZXNzYXJ5LgotCSAqLwotCi0JUDEuTCA9IExPKERDUExCX0RBVEExNSk7Ci0JUDEuSCA9IEhJKERDUExCX0RBVEExNSk7Ci0KLQkvKiBJZiB0aGUgRENQTEIgaGFzIGNhY2hlIGJpdHMgc2V0LCBidXQgY2FjaGluZyBoYXNuJ3QKLQkgKiBiZWVuIGVuYWJsZWQsIHRoZW4gd2Ugd2FudCB0byBtYXNrIG9mZiB0aGUgY2FjaGUtaW4tTDEKLQkgKiBiaXQgYmVmb3JlIGluc3RhbGxpbmcuIE1vcmVvdmVyLCBpZiBjYWNoaW5nIGlzIG9mZiwgd2UKLQkgKiBhbHNvIHdhbnQgdG8gZW5zdXJlIHRoYXQgdGhlIERDUExCIGhhcyBXVCBtb2RlIHNldCwgcmF0aGVyCi0JICogdGhhbiBXQiwgc2luY2UgV0IgcGFnZXMgc3RpbGwgdHJpZ2dlciBmaXJzdC13cml0ZSBleGNlcHRpb25zCi0JICogZXZlbiB3aGVuIG5vdCBjYWNoaW5nIGlzIG9mZiwgYW5kIHRoZSBwYWdlIGlzbid0IG1hcmtlZCBhcwotCSAqIGNhY2hhYmxlLiBGaW5hbGx5LCB3ZSBjb3VsZCBtYXJrIHRoZSBwYWdlIGFzIGNsZWFuLCBub3QgZGlydHksCi0JICogYnV0IHdlIGNob29zZSB0byBsZWF2ZSB0aGF0IGRlY2lzaW9uIHRvIHRoZSB1c2VyOyBpZiB0aGUgdXNlcgotCSAqIGNob29zZXMgdG8gaGF2ZSBhIENQTEIgcHJlLWRlZmluZWQgYXMgZGlydHksIHRoZW4gdGhleSBhbHdheXMKLQkgKiBwYXkgdGhlIGNvc3Qgb2YgZmx1c2hpbmcgZHVyaW5nIGV2aWN0aW9uLCBidXQgZG9uJ3QgcGF5IHRoZQotCSAqIGNvc3Qgb2YgZmlyc3Qtd3JpdGUgZXhjZXB0aW9ucyB0byBtYXJrIHRoZSBwYWdlIGFzIGRpcnR5LgotCSAqLwotCi0jaWZkZWYgQ09ORklHX0JGSU5fV1QKLQlCSVRTRVQoUjYsIDE0KTsJCS8qIFNldCBXVCovCi0jZW5kaWYKLQotCVtQMV0gPSBSMjsKLQlbUDEtMHgxMDBdID0gUjQ7Ci0jaWZkZWYJQ09ORklHX0NQTEJfSU5GTwotCVIzID0gW1AzXTsKLQlSMyArPSAxOwotCVtQM10gPSBSMzsKLSNlbmRpZgotCi0JLyogV2UndmUgaW5zdGFsbGVkIHRoZSBDUExCLCBzbyByZS1lbmFibGUgQ1BMQnMuIFA0Ci0JICogcG9pbnRzIHRvIERNRU1fQ09OVFJPTCwgYW5kIFI1IGlzIHRoZSB2YWx1ZSB3ZQotCSAqIGxhc3Qgd3JvdGUgdG8gaXQsIHdoZW4gd2Ugd2VyZSBkaXNhYmxpbmcgQ1BMQnMuCi0JICovCi0KLQlCSVRTRVQoUjUsRU5EQ1BMQl9QKTsKLQlDTEkgUjI7Ci0JLmFsaWduIDg7Ci0JW1A0XSA9IFI1OwotCVNTWU5DOwotCVNUSSBSMjsKLQotCSggUjc6NCxQNTozICkgPSBbU1ArK107Ci0JUjAgPSBDUExCX1JFTE9BREVEOwotCVJUUzsKLUVORFBST0MoX2NwbGJfbWdyKQotCi0uZGF0YQotLmFsaWduIDQ7Ci1fcGFnZV9zaXplX3RhYmxlOgotLmJ5dGU0CTB4MDAwMDA0MDA7CS8qIDFLICovCi0uYnl0ZTQJMHgwMDAwMTAwMDsJLyogNEsgKi8KLS5ieXRlNAkweDAwMTAwMDAwOwkvKiAxTSAqLwotLmJ5dGU0CTB4MDA0MDAwMDA7CS8qIDRNICovCi0KLS5hbGlnbiA0OwotX2RjcGxiX3ByZWZlcmVuY2U6Ci0uYnl0ZTQJMHgwMDAwMDAwMTsJLyogdmFsaWQgYml0ICovCi0uYnl0ZTQJMHgwMDAwMDAwMjsJLyogbG9jayBiaXQgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4va2VybmVsL2NwbGItbm9tcHUvY3BsYm1nci5jIGIvYXJjaC9ibGFja2Zpbi9rZXJuZWwvY3BsYi1ub21wdS9jcGxibWdyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzc2MjQ5YQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYmxhY2tmaW4va2VybmVsL2NwbGItbm9tcHUvY3BsYm1nci5jCkBAIC0wLDAgKzEsMjgzIEBACisvKgorICogRmlsZTogICAgICAgICBhcmNoL2JsYWNrZmluL2tlcm5lbC9jcGxiLW5vbXB1LWMvY3BsYm1nci5jCisgKiBCYXNlZCBvbjogICAgIGFyY2gvYmxhY2tmaW4va2VybmVsL2NwbGItbXB1L2NwbGJtZ3IuYworICogQXV0aG9yOiAgICAgICBNaWNoYWVsIE1jVGVybmFuIDxtbWN0ZXJuYW5AYWlydmFuYS5jb20+CisgKgorICogQ3JlYXRlZDogICAgICAwMU5vdjIwMDgKKyAqIERlc2NyaXB0aW9uOiAgQ1BMQiBtaXNzIGhhbmRsZXIuCisgKgorICogTW9kaWZpZWQ6CisgKiAgICAgICAgICAgICAgIENvcHlyaWdodCAyMDA4IEFpcnZhbmEgSW5jLgorICogICAgICAgICAgICAgICBDb3B5cmlnaHQgMjAwNC0yMDA3IEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqCisgKiBCdWdzOiAgICAgICAgIEVudGVyIGJ1Z3MgYXQgaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnLworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8YXNtL2JsYWNrZmluLmg+CisjaW5jbHVkZSA8YXNtL2NwbGJpbml0Lmg+CisjaW5jbHVkZSA8YXNtL2NwbGIuaD4KKyNpbmNsdWRlIDxhc20vbW11X2NvbnRleHQuaD4KKworLyoKKyAqIFdBUk5JTkcKKyAqCisgKiBUaGlzIGZpbGUgaXMgY29tcGlsZWQgd2l0aCBjZXJ0YWluIC1mZml4ZWQtcmVnIG9wdGlvbnMuICBXZSBoYXZlIHRvCisgKiBtYWtlIHN1cmUgbm90IHRvIGNhbGwgYW55IGZ1bmN0aW9ucyBoZXJlIHRoYXQgY291bGQgY2xvYmJlciB0aGVzZQorICogcmVnaXN0ZXJzLgorICovCisKK2ludCBucl9kY3BsYl9taXNzW05SX0NQVVNdLCBucl9pY3BsYl9taXNzW05SX0NQVVNdOworaW50IG5yX2RjcGxiX3N1cHZfbWlzc1tOUl9DUFVTXSwgbnJfaWNwbGJfc3Vwdl9taXNzW05SX0NQVVNdOworaW50IG5yX2NwbGJfZmx1c2hbTlJfQ1BVU10sIG5yX2RjcGxiX3Byb3RbTlJfQ1BVU107CisKKyNpZmRlZiBDT05GSUdfRVhDUFRfSVJRX1NZU0NfTDEKKyNkZWZpbmUgTUdSX0FUVFIgX19hdHRyaWJ1dGVfXygobDFfdGV4dCkpCisjZWxzZQorI2RlZmluZSBNR1JfQVRUUgorI2VuZGlmCisKKy8qCisgKiBXZSdyZSBpbiBhbiBleGNlcHRpb24gaGFuZGxlci4gIFRoZSBub3JtYWwgY2xpIG5vcCBub3Agd29ya2Fyb3VuZAorICogaXNuJ3QgZ29pbmcgdG8gZG8gdmVyeSBtdWNoLCBhcyB0aGUgb25seSB0aGluZyB0aGF0IGNhbiBpbnRlcnJ1cHQKKyAqIHVzIGlzIGFuIE5NSSwgYW5kIHRoZSBjbGkgaXNuJ3QgZ29pbmcgdG8gc3RvcCB0aGF0LgorICovCisjZGVmaW5lIE5PV0FfU1NZTkMgX19hc21fXyBfX3ZvbGF0aWxlX18gKCJzc3luYzsiKQorCisvKiBBbm9tYWx5IGhhbmRsZXJzIHByb3ZpZGUgU1NZTkNzLCBzbyBhdm9pZCBleHRyYSBpZiBhbm9tYWx5IGlzIHByZXNlbnQgKi8KKyNpZiBBTk9NQUxZXzA1MDAwMTI1CisKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUVNX0NPTlRST0xfU1NZTkModikgICAgYmZpbl93cml0ZV9ETUVNX0NPTlRST0wodikKKyNkZWZpbmUgYmZpbl93cml0ZV9JTUVNX0NPTlRST0xfU1NZTkModikgICAgYmZpbl93cml0ZV9JTUVNX0NPTlRST0wodikKKworI2Vsc2UKKworI2RlZmluZSBiZmluX3dyaXRlX0RNRU1fQ09OVFJPTF9TU1lOQyh2KSBcCisgICAgZG8geyBOT1dBX1NTWU5DOyBiZmluX3dyaXRlX0RNRU1fQ09OVFJPTCh2KTsgTk9XQV9TU1lOQzsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9JTUVNX0NPTlRST0xfU1NZTkModikgXAorICAgIGRvIHsgTk9XQV9TU1lOQzsgYmZpbl93cml0ZV9JTUVNX0NPTlRST0wodik7IE5PV0FfU1NZTkM7IH0gd2hpbGUgKDApCisKKyNlbmRpZgorCitzdGF0aWMgaW5saW5lIHZvaWQgd3JpdGVfZGNwbGJfZGF0YShpbnQgY3B1LCBpbnQgaWR4LCB1bnNpZ25lZCBsb25nIGRhdGEsCisJCQkJICAgIHVuc2lnbmVkIGxvbmcgYWRkcikKK3sKKwl1bnNpZ25lZCBsb25nIGN0cmwgPSBiZmluX3JlYWRfRE1FTV9DT05UUk9MKCk7CisJYmZpbl93cml0ZV9ETUVNX0NPTlRST0xfU1NZTkMoY3RybCAmIH5FTkRDUExCKTsKKwliZmluX3dyaXRlMzIoRENQTEJfREFUQTAgKyBpZHggKiA0LCBkYXRhKTsKKwliZmluX3dyaXRlMzIoRENQTEJfQUREUjAgKyBpZHggKiA0LCBhZGRyKTsKKwliZmluX3dyaXRlX0RNRU1fQ09OVFJPTF9TU1lOQyhjdHJsKTsKKworI2lmZGVmIENPTkZJR19DUExCX0lORk8KKwlkY3BsYl90YmxbY3B1XVtpZHhdLmFkZHIgPSBhZGRyOworCWRjcGxiX3RibFtjcHVdW2lkeF0uZGF0YSA9IGRhdGE7CisjZW5kaWYKK30KKworc3RhdGljIGlubGluZSB2b2lkIHdyaXRlX2ljcGxiX2RhdGEoaW50IGNwdSwgaW50IGlkeCwgdW5zaWduZWQgbG9uZyBkYXRhLAorCQkJCSAgICB1bnNpZ25lZCBsb25nIGFkZHIpCit7CisJdW5zaWduZWQgbG9uZyBjdHJsID0gYmZpbl9yZWFkX0lNRU1fQ09OVFJPTCgpOworCisJYmZpbl93cml0ZV9JTUVNX0NPTlRST0xfU1NZTkMoY3RybCAmIH5FTklDUExCKTsKKwliZmluX3dyaXRlMzIoSUNQTEJfREFUQTAgKyBpZHggKiA0LCBkYXRhKTsKKwliZmluX3dyaXRlMzIoSUNQTEJfQUREUjAgKyBpZHggKiA0LCBhZGRyKTsKKwliZmluX3dyaXRlX0lNRU1fQ09OVFJPTF9TU1lOQyhjdHJsKTsKKworI2lmZGVmIENPTkZJR19DUExCX0lORk8KKwlpY3BsYl90YmxbY3B1XVtpZHhdLmFkZHIgPSBhZGRyOworCWljcGxiX3RibFtjcHVdW2lkeF0uZGF0YSA9IGRhdGE7CisjZW5kaWYKK30KKworLyoKKyAqIEdpdmVuIHRoZSBjb250ZW50cyBvZiB0aGUgc3RhdHVzIHJlZ2lzdGVyLCByZXR1cm4gdGhlIGluZGV4IG9mIHRoZQorICogQ1BMQiB0aGF0IGNhdXNlZCB0aGUgZmF1bHQuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGZhdWx0aW5nX2NwbGJfaW5kZXgoaW50IHN0YXR1cykKK3sKKwlpbnQgc2lnbmJpdHMgPSBfX2J1aWx0aW5fYmZpbl9ub3JtX2ZyMXgzMihzdGF0dXMgJiAweEZGRkYpOworCXJldHVybiAzMCAtIHNpZ25iaXRzOworfQorCisvKgorICogR2l2ZW4gdGhlIGNvbnRlbnRzIG9mIHRoZSBzdGF0dXMgcmVnaXN0ZXIgYW5kIHRoZSBEQ1BMQl9EQVRBIGNvbnRlbnRzLAorICogcmV0dXJuIHRydWUgaWYgYSB3cml0ZSBhY2Nlc3Mgc2hvdWxkIGJlIHBlcm1pdHRlZC4KKyAqLworc3RhdGljIGlubGluZSBpbnQgd3JpdGVfcGVybWl0dGVkKGludCBzdGF0dXMsIHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlpZiAoc3RhdHVzICYgRkFVTFRfVVNFUlNVUFYpCisJCXJldHVybiAhIShkYXRhICYgQ1BMQl9TVVBWX1dSKTsKKwllbHNlCisJCXJldHVybiAhIShkYXRhICYgQ1BMQl9VU0VSX1dSKTsKK30KKworLyogQ291bnRlcnMgdG8gaW1wbGVtZW50IHJvdW5kLXJvYmluIHJlcGxhY2VtZW50LiAgKi8KK3N0YXRpYyBpbnQgaWNwbGJfcnJfaW5kZXhbTlJfQ1BVU10gUERUX0FUVFI7CitzdGF0aWMgaW50IGRjcGxiX3JyX2luZGV4W05SX0NQVVNdIFBEVF9BVFRSOworCisvKgorICogRmluZCBhbiBJQ1BMQiBlbnRyeSB0byBiZSBldmljdGVkIGFuZCByZXR1cm4gaXRzIGluZGV4LgorICovCitzdGF0aWMgaW50IGV2aWN0X29uZV9pY3BsYihpbnQgY3B1KQoreworCWludCBpID0gZmlyc3Rfc3dpdGNoZWRfaWNwbGIgKyBpY3BsYl9ycl9pbmRleFtjcHVdOworCWlmIChpID49IE1BWF9DUExCUykgeworCQlpIC09IE1BWF9DUExCUyAtIGZpcnN0X3N3aXRjaGVkX2ljcGxiOworCQlpY3BsYl9ycl9pbmRleFtjcHVdIC09IE1BWF9DUExCUyAtIGZpcnN0X3N3aXRjaGVkX2ljcGxiOworCX0KKwlpY3BsYl9ycl9pbmRleFtjcHVdKys7CisJcmV0dXJuIGk7Cit9CisKK3N0YXRpYyBpbnQgZXZpY3Rfb25lX2RjcGxiKGludCBjcHUpCit7CisJaW50IGkgPSBmaXJzdF9zd2l0Y2hlZF9kY3BsYiArIGRjcGxiX3JyX2luZGV4W2NwdV07CisJaWYgKGkgPj0gTUFYX0NQTEJTKSB7CisJCWkgLT0gTUFYX0NQTEJTIC0gZmlyc3Rfc3dpdGNoZWRfZGNwbGI7CisJCWRjcGxiX3JyX2luZGV4W2NwdV0gLT0gTUFYX0NQTEJTIC0gZmlyc3Rfc3dpdGNoZWRfZGNwbGI7CisJfQorCWRjcGxiX3JyX2luZGV4W2NwdV0rKzsKKwlyZXR1cm4gaTsKK30KKworTUdSX0FUVFIgc3RhdGljIGludCBpY3BsYl9taXNzKGludCBjcHUpCit7CisJdW5zaWduZWQgbG9uZyBhZGRyID0gYmZpbl9yZWFkX0lDUExCX0ZBVUxUX0FERFIoKTsKKwlpbnQgc3RhdHVzID0gYmZpbl9yZWFkX0lDUExCX1NUQVRVUygpOworCWludCBpZHg7CisJdW5zaWduZWQgbG9uZyBpX2RhdGEsIGJhc2UsIGFkZHIxLCBlYWRkcjsKKworCW5yX2ljcGxiX21pc3NbY3B1XSsrOworCWlmICh1bmxpa2VseShzdGF0dXMgJiBGQVVMVF9VU0VSU1VQVikpCisJCW5yX2ljcGxiX3N1cHZfbWlzc1tjcHVdKys7CisKKwliYXNlID0gMDsKKwlmb3IgKGlkeCA9IDA7IGlkeCA8IGljcGxiX25yX2JvdW5kczsgaWR4KyspIHsKKwkJZWFkZHIgPSBpY3BsYl9ib3VuZHNbaWR4XS5lYWRkcjsKKwkJaWYgKGFkZHIgPCBlYWRkcikKKwkJCWJyZWFrOworCQliYXNlID0gZWFkZHI7CisJfQorCWlmICh1bmxpa2VseShpZHggPT0gaWNwbGJfbnJfYm91bmRzKSkKKwkJcmV0dXJuIENQTEJfTk9fQUREUl9NQVRDSDsKKworCWlfZGF0YSA9IGljcGxiX2JvdW5kc1tpZHhdLmRhdGE7CisJaWYgKHVubGlrZWx5KGlfZGF0YSA9PSAwKSkKKwkJcmV0dXJuIENQTEJfTk9fQUREUl9NQVRDSDsKKworCWFkZHIxID0gYWRkciAmIH4oU0laRV80TSAtIDEpOworCWFkZHIgJj0gfihTSVpFXzFNIC0gMSk7CisJaV9kYXRhIHw9IFBBR0VfU0laRV8xTUI7CisJaWYgKGFkZHIxID49IGJhc2UgJiYgKGFkZHIxICsgU0laRV80TSkgPD0gZWFkZHIpIHsKKwkJLyoKKwkJICogVGhpcyB3b3JrcyBiZWNhdXNlCisJCSAqIChQQUdFX1NJWkVfNE1CICYgUEFHRV9TSVpFXzFNQikgPT0gUEFHRV9TSVpFXzFNQi4KKwkJICovCisJCWlfZGF0YSB8PSBQQUdFX1NJWkVfNE1COworCQlhZGRyID0gYWRkcjE7CisJfQorCisJLyogUGljayBlbnRyeSB0byBldmljdCAqLworCWlkeCA9IGV2aWN0X29uZV9pY3BsYihjcHUpOworCisJd3JpdGVfaWNwbGJfZGF0YShjcHUsIGlkeCwgaV9kYXRhLCBhZGRyKTsKKworCXJldHVybiBDUExCX1JFTE9BREVEOworfQorCitNR1JfQVRUUiBzdGF0aWMgaW50IGRjcGxiX21pc3MoaW50IGNwdSkKK3sKKwl1bnNpZ25lZCBsb25nIGFkZHIgPSBiZmluX3JlYWRfRENQTEJfRkFVTFRfQUREUigpOworCWludCBzdGF0dXMgPSBiZmluX3JlYWRfRENQTEJfU1RBVFVTKCk7CisJaW50IGlkeDsKKwl1bnNpZ25lZCBsb25nIGRfZGF0YSwgYmFzZSwgYWRkcjEsIGVhZGRyOworCisJbnJfZGNwbGJfbWlzc1tjcHVdKys7CisJaWYgKHVubGlrZWx5KHN0YXR1cyAmIEZBVUxUX1VTRVJTVVBWKSkKKwkJbnJfZGNwbGJfc3Vwdl9taXNzW2NwdV0rKzsKKworCWJhc2UgPSAwOworCWZvciAoaWR4ID0gMDsgaWR4IDwgZGNwbGJfbnJfYm91bmRzOyBpZHgrKykgeworCQllYWRkciA9IGRjcGxiX2JvdW5kc1tpZHhdLmVhZGRyOworCQlpZiAoYWRkciA8IGVhZGRyKQorCQkJYnJlYWs7CisJCWJhc2UgPSBlYWRkcjsKKwl9CisJaWYgKHVubGlrZWx5KGlkeCA9PSBkY3BsYl9ucl9ib3VuZHMpKQorCQlyZXR1cm4gQ1BMQl9OT19BRERSX01BVENIOworCisJZF9kYXRhID0gZGNwbGJfYm91bmRzW2lkeF0uZGF0YTsKKwlpZiAodW5saWtlbHkoZF9kYXRhID09IDApKQorCQlyZXR1cm4gQ1BMQl9OT19BRERSX01BVENIOworCisJYWRkcjEgPSBhZGRyICYgfihTSVpFXzRNIC0gMSk7CisJYWRkciAmPSB+KFNJWkVfMU0gLSAxKTsKKwlkX2RhdGEgfD0gUEFHRV9TSVpFXzFNQjsKKwlpZiAoYWRkcjEgPj0gYmFzZSAmJiAoYWRkcjEgKyBTSVpFXzRNKSA8PSBlYWRkcikgeworCQkvKgorCQkgKiBUaGlzIHdvcmtzIGJlY2F1c2UKKwkJICogKFBBR0VfU0laRV80TUIgJiBQQUdFX1NJWkVfMU1CKSA9PSBQQUdFX1NJWkVfMU1CLgorCQkgKi8KKwkJZF9kYXRhIHw9IFBBR0VfU0laRV80TUI7CisJCWFkZHIgPSBhZGRyMTsKKwl9CisKKwkvKiBQaWNrIGVudHJ5IHRvIGV2aWN0ICovCisJaWR4ID0gZXZpY3Rfb25lX2RjcGxiKGNwdSk7CisKKwl3cml0ZV9kY3BsYl9kYXRhKGNwdSwgaWR4LCBkX2RhdGEsIGFkZHIpOworCisJcmV0dXJuIENQTEJfUkVMT0FERUQ7Cit9CisKK01HUl9BVFRSIHN0YXRpYyBub2lubGluZSBpbnQgZGNwbGJfcHJvdGVjdGlvbl9mYXVsdChpbnQgY3B1KQoreworCWludCBzdGF0dXMgPSBiZmluX3JlYWRfRENQTEJfU1RBVFVTKCk7CisKKwlucl9kY3BsYl9wcm90W2NwdV0rKzsKKworCWlmIChsaWtlbHkoc3RhdHVzICYgRkFVTFRfUlcpKSB7CisJCWludCBpZHggPSBmYXVsdGluZ19jcGxiX2luZGV4KHN0YXR1cyk7CisJCXVuc2lnbmVkIGxvbmcgcmVnYWRkciA9IERDUExCX0RBVEEwICsgaWR4ICogNDsKKwkJdW5zaWduZWQgbG9uZyBkYXRhID0gYmZpbl9yZWFkMzIocmVnYWRkcik7CisKKwkJLyogQ2hlY2sgaWYgZmF1bHQgaXMgdG8gZGlydHkgYSBjbGVhbiBwYWdlICovCisJCWlmICghKGRhdGEgJiBDUExCX1dUKSAmJiAhKGRhdGEgJiBDUExCX0RJUlRZKSAmJgorCQkgICAgd3JpdGVfcGVybWl0dGVkKHN0YXR1cywgZGF0YSkpIHsKKworCQkJZGNwbGJfdGJsW2NwdV1baWR4XS5kYXRhID0gZGF0YTsKKwkJCWJmaW5fd3JpdGUzMihyZWdhZGRyLCBkYXRhKTsKKwkJCXJldHVybiBDUExCX1JFTE9BREVEOworCQl9CisJfQorCisJcmV0dXJuIENQTEJfUFJPVF9WSU9MOworfQorCitNR1JfQVRUUiBpbnQgY3BsYl9oZHIoaW50IHNlcXN0YXQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWludCBjYXVzZSA9IHNlcXN0YXQgJiAweDNmOworCXVuc2lnbmVkIGludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisJc3dpdGNoIChjYXVzZSkgeworCWNhc2UgMHgyQzoKKwkJcmV0dXJuIGljcGxiX21pc3MoY3B1KTsKKwljYXNlIDB4MjY6CisJCXJldHVybiBkY3BsYl9taXNzKGNwdSk7CisJZGVmYXVsdDoKKwkJaWYgKHVubGlrZWx5KGNhdXNlID09IDB4MjMpKQorCQkJcmV0dXJuIGRjcGxiX3Byb3RlY3Rpb25fZmF1bHQoY3B1KTsKKworCQlyZXR1cm4gQ1BMQl9VTktOT1dOX0VSUjsKKwl9Cit9CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2tlcm5lbC9jcGxiaW5mby5jIGIvYXJjaC9ibGFja2Zpbi9rZXJuZWwvY3BsYmluZm8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NGQ3ODMwCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9ibGFja2Zpbi9rZXJuZWwvY3BsYmluZm8uYwpAQCAtMCwwICsxLDE3NyBAQAorLyoKKyAqIGFyY2gvYmxhY2tmaW4va2VybmVsL2NwbGJpbmZvLmMgLSBkaXNwbGF5IENQTEIgc3RhdHVzCisgKgorICogQ29weXJpZ2h0IDIwMDQtMjAwOCBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KKworI2luY2x1ZGUgPGFzbS9jcGxiaW5pdC5oPgorI2luY2x1ZGUgPGFzbS9ibGFja2Zpbi5oPgorCitzdGF0aWMgY2hhciBjb25zdCBwYWdlX3N0cnRibFtdWzNdID0geyAiMUsiLCAiNEsiLCAiMU0iLCAiNE0iIH07CisjZGVmaW5lIHBhZ2UoZmxhZ3MpICAgICgoKGZsYWdzKSAmIDB4MzAwMDApID4+IDE2KQorI2RlZmluZSBzdHJwYWdlKGZsYWdzKSBwYWdlX3N0cnRibFtwYWdlKGZsYWdzKV0KKworc3RydWN0IGNwbGJpbmZvX2RhdGEgeworCWxvZmZfdCBwb3M7CisJY2hhciBjcGxiX3R5cGU7CisJdTMyIG1lbV9jb250cm9sOworCXN0cnVjdCBjcGxiX2VudHJ5ICp0Ymw7CisJaW50IHN3aXRjaGVkOworfTsKKworc3RhdGljIHZvaWQgY3BsYmluZm9fcHJpbnRfaGVhZGVyKHN0cnVjdCBzZXFfZmlsZSAqbSkKK3sKKwlzZXFfcHJpbnRmKG0sICJJbmRleFx0QWRkcmVzc1x0XHREYXRhXHRTaXplXHRVL1JEXHRVL1dSXHRTL1dSXHRTd2l0Y2hcbiIpOworfQorCitzdGF0aWMgaW50IGNwbGJpbmZvX25vbW9yZShzdHJ1Y3QgY3BsYmluZm9fZGF0YSAqY2RhdGEpCit7CisJcmV0dXJuIGNkYXRhLT5wb3MgPj0gTUFYX0NQTEJTOworfQorCitzdGF0aWMgaW50IGNwbGJpbmZvX3Nob3coc3RydWN0IHNlcV9maWxlICptLCB2b2lkICpwKQoreworCXN0cnVjdCBjcGxiaW5mb19kYXRhICpjZGF0YTsKKwl1bnNpZ25lZCBsb25nIGRhdGEsIGFkZHI7CisJbG9mZl90IHBvczsKKworCWNkYXRhID0gcDsKKwlwb3MgPSBjZGF0YS0+cG9zOworCWFkZHIgPSBjZGF0YS0+dGJsW3Bvc10uYWRkcjsKKwlkYXRhID0gY2RhdGEtPnRibFtwb3NdLmRhdGE7CisKKwlzZXFfcHJpbnRmKG0sCisJCSIlZFx0MHglMDhseFx0JTA1bHhcdCVzXHQlY1x0JWNcdCVjXHQlY1xuIiwKKwkJKGludClwb3MsIGFkZHIsIGRhdGEsIHN0cnBhZ2UoZGF0YSksCisJCShkYXRhICYgQ1BMQl9VU0VSX1JEKSA/ICdZJyA6ICdOJywKKwkJKGRhdGEgJiBDUExCX1VTRVJfV1IpID8gJ1knIDogJ04nLAorCQkoZGF0YSAmIENQTEJfU1VQVl9XUikgPyAnWScgOiAnTicsCisJCXBvcyA8IGNkYXRhLT5zd2l0Y2hlZCA/ICdOJyA6ICdZJyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgY3BsYmluZm9fc2VxX2luaXQoc3RydWN0IGNwbGJpbmZvX2RhdGEgKmNkYXRhLCB1bnNpZ25lZCBpbnQgY3B1KQoreworCWlmIChjZGF0YS0+Y3BsYl90eXBlID09ICdJJykgeworCQljZGF0YS0+bWVtX2NvbnRyb2wgPSBiZmluX3JlYWRfSU1FTV9DT05UUk9MKCk7CisJCWNkYXRhLT50YmwgPSBpY3BsYl90YmxbY3B1XTsKKwkJY2RhdGEtPnN3aXRjaGVkID0gZmlyc3Rfc3dpdGNoZWRfaWNwbGI7CisJfSBlbHNlIHsKKwkJY2RhdGEtPm1lbV9jb250cm9sID0gYmZpbl9yZWFkX0RNRU1fQ09OVFJPTCgpOworCQljZGF0YS0+dGJsID0gZGNwbGJfdGJsW2NwdV07CisJCWNkYXRhLT5zd2l0Y2hlZCA9IGZpcnN0X3N3aXRjaGVkX2RjcGxiOworCX0KK30KKworc3RhdGljIHZvaWQgKmNwbGJpbmZvX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqbSwgbG9mZl90ICpwb3MpCit7CisJc3RydWN0IGNwbGJpbmZvX2RhdGEgKmNkYXRhID0gbS0+cHJpdmF0ZTsKKworCWlmICghKnBvcykgeworCQlzZXFfcHJpbnRmKG0sICIlY0NQTEJzIGFyZSAlc2FibGVkOiAweCV4XG4iLCBjZGF0YS0+Y3BsYl90eXBlLAorCQkJKGNkYXRhLT5tZW1fY29udHJvbCAmIEVORENQTEIgPyAiZW4iIDogImRpcyIpLAorCQkJY2RhdGEtPm1lbV9jb250cm9sKTsKKwkJY3BsYmluZm9fcHJpbnRfaGVhZGVyKG0pOworCX0gZWxzZSBpZiAoY3BsYmluZm9fbm9tb3JlKGNkYXRhKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlnZXRfY3B1KCk7CisJcmV0dXJuIGNkYXRhOworfQorCitzdGF0aWMgdm9pZCAqY3BsYmluZm9fbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnAsIGxvZmZfdCAqcG9zKQoreworCXN0cnVjdCBjcGxiaW5mb19kYXRhICpjZGF0YSA9IHA7CisJY2RhdGEtPnBvcyA9ICsrKCpwb3MpOworCWlmIChjcGxiaW5mb19ub21vcmUoY2RhdGEpKQorCQlyZXR1cm4gTlVMTDsKKwllbHNlCisJCXJldHVybiBjZGF0YTsKK30KKworc3RhdGljIHZvaWQgY3BsYmluZm9fc3RvcChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnApCit7CisJcHV0X2NwdSgpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHNlcV9vcGVyYXRpb25zIGNwbGJpbmZvX3NvcHMgPSB7CisJLnN0YXJ0ID0gY3BsYmluZm9fc3RhcnQsCisJLm5leHQgID0gY3BsYmluZm9fbmV4dCwKKwkuc3RvcCAgPSBjcGxiaW5mb19zdG9wLAorCS5zaG93ICA9IGNwbGJpbmZvX3Nob3csCit9OworCitzdGF0aWMgaW50IGNwbGJpbmZvX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJY2hhciBidWZbMjU2XSwgKnBhdGgsICpwOworCXVuc2lnbmVkIGludCBjcHU7CisJY2hhciAqc19jcHUsICpzX2NwbGI7CisJaW50IHJldDsKKwlzdHJ1Y3Qgc2VxX2ZpbGUgKm07CisJc3RydWN0IGNwbGJpbmZvX2RhdGEgKmNkYXRhOworCisJcGF0aCA9IGRfcGF0aCgmZmlsZS0+Zl9wYXRoLCBidWYsIHNpemVvZihidWYpKTsKKwlpZiAoSVNfRVJSKHBhdGgpKQorCQlyZXR1cm4gUFRSX0VSUihwYXRoKTsKKwlzX2NwdSA9IHN0cnN0cihwYXRoLCAiL2NwdSIpOworCXNfY3BsYiA9IHN0cnJjaHIocGF0aCwgJy8nKTsKKwlpZiAoIXNfY3B1IHx8ICFzX2NwbGIpCisJCXJldHVybiAtRUlOVkFMOworCisJY3B1ID0gc2ltcGxlX3N0cnRvdWwoc19jcHUgKyA0LCAmcCwgMTApOworCWlmICghY3B1X29ubGluZShjcHUpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXJldCA9IHNlcV9vcGVuX3ByaXZhdGUoZmlsZSwgJmNwbGJpbmZvX3NvcHMsIHNpemVvZigqY2RhdGEpKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCW0gPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJY2RhdGEgPSBtLT5wcml2YXRlOworCisJY2RhdGEtPnBvcyA9IDA7CisJY2RhdGEtPmNwbGJfdHlwZSA9IHRvdXBwZXIoc19jcGxiWzFdKTsKKwljcGxiaW5mb19zZXFfaW5pdChjZGF0YSwgY3B1KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBjcGxiaW5mb19mb3BzID0geworCS5vcGVuICAgID0gY3BsYmluZm9fb3BlbiwKKwkucmVhZCAgICA9IHNlcV9yZWFkLAorCS5sbHNlZWsgID0gc2VxX2xzZWVrLAorCS5yZWxlYXNlID0gc2VxX3JlbGVhc2VfcHJpdmF0ZSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGNwbGJpbmZvX2luaXQodm9pZCkKK3sKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmNwbGJfZGlyLCAqY3B1X2RpcjsKKwljaGFyIGJ1ZlsxMF07CisJdW5zaWduZWQgaW50IGNwdTsKKworCWNwbGJfZGlyID0gcHJvY19ta2RpcigiY3BsYmluZm8iLCBOVUxMKTsKKwlpZiAoIWNwbGJfZGlyKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShjcHUpIHsKKwkJc3ByaW50ZihidWYsICJjcHUlaSIsIGNwdSk7CisJCWNwdV9kaXIgPSBwcm9jX21rZGlyKGJ1ZiwgY3BsYl9kaXIpOworCQlpZiAoIWNwdV9kaXIpCisJCQlyZXR1cm4gLUVOT01FTTsKKworCQlwcm9jX2NyZWF0ZSgiaWNwbGIiLCBTX0lSVUdPLCBjcHVfZGlyLCAmY3BsYmluZm9fZm9wcyk7CisJCXByb2NfY3JlYXRlKCJkY3BsYiIsIFNfSVJVR08sIGNwdV9kaXIsICZjcGxiaW5mb19mb3BzKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KK2xhdGVfaW5pdGNhbGwoY3BsYmluZm9faW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2tlcm5lbC9lYXJseV9wcmludGsuYyBiL2FyY2gvYmxhY2tmaW4va2VybmVsL2Vhcmx5X3ByaW50ay5jCmluZGV4IDFmNGUzZDIuLmM4YWQwNTEgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4va2VybmVsL2Vhcmx5X3ByaW50ay5jCisrKyBiL2FyY2gvYmxhY2tmaW4va2VybmVsL2Vhcmx5X3ByaW50ay5jCkBAIC0xMDUsMTAgKzEwNSwxMCBAQAogCQljZmxhZyB8PSBDUzU7CiAJCWJyZWFrOwogCWNhc2UgNjoKLQkJY2ZsYWcgfD0gQ1M1OworCQljZmxhZyB8PSBDUzY7CiAJCWJyZWFrOwogCWNhc2UgNzoKLQkJY2ZsYWcgfD0gQ1M1OworCQljZmxhZyB8PSBDUzc7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCWNmbGFnIHw9IENTODsKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4va2VybmVsL2VudHJ5LlMgYi9hcmNoL2JsYWNrZmluL2tlcm5lbC9lbnRyeS5TCmluZGV4IGZhZWE4OGUuLmE5Y2ZiYTkgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4va2VybmVsL2VudHJ5LlMKKysrIGIvYXJjaC9ibGFja2Zpbi9rZXJuZWwvZW50cnkuUwpAQCAtMzAsNiArMzAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KICNpbmNsdWRlIDxhc20vdGhyZWFkX2luZm8uaD4KICNpbmNsdWRlIDxhc20vZXJybm8uaD4KKyNpbmNsdWRlIDxhc20vYmxhY2tmaW4uaD4KICNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KIAogI2luY2x1ZGUgPGFzbS9jb250ZXh0LlM+CkBAIC00MSw2ICs0MiwxMCBAQAogI2VuZGlmCiAKIEVOVFJZKF9yZXRfZnJvbV9mb3JrKQorI2lmZGVmIENPTkZJR19JUElQRQorCVstLXNwXSA9IHJldGk7IAkJLyogSVJRcyBvbi4gKi8KKwlTUCArPSA0OworI2VuZGlmIC8qIENPTkZJR19JUElQRSAqLwogCVNQICs9IC0xMjsKIAljYWxsIF9zY2hlZHVsZV90YWlsOwogCVNQICs9IDEyOwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9rZXJuZWwvZml4ZWRfY29kZS5TIGIvYXJjaC9ibGFja2Zpbi9rZXJuZWwvZml4ZWRfY29kZS5TCmluZGV4IDRiMDNiYTAuLjBkMmQ5ZTAgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4va2VybmVsL2ZpeGVkX2NvZGUuUworKysgYi9hcmNoL2JsYWNrZmluL2tlcm5lbC9maXhlZF9jb2RlLlMKQEAgLTgsMTAgKzgsMTIgQEAKICAqIEJGNTYxIFNNUCkuCiAgKi8KICNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3VuaXN0ZC5oPgogI2luY2x1ZGUgPGFzbS9lbnRyeS5oPgogCi0udGV4dAorX19JTklUCisKIEVOVFJZKF9maXhlZF9jb2RlX3N0YXJ0KQogCiAuYWxpZ24gMTYKQEAgLTE0NCwzICsxNDYsNSBAQAogRU5EUFJPQyhfc2FmZV91c2VyX2luc3RydWN0aW9uKQogCiBFTlRSWShfZml4ZWRfY29kZV9lbmQpCisKK19fRklOSVQKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4va2VybmVsL2lwaXBlLmMgYi9hcmNoL2JsYWNrZmluL2tlcm5lbC9pcGlwZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzOWJlNWEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2JsYWNrZmluL2tlcm5lbC9pcGlwZS5jCkBAIC0wLDAgKzEsNDI4IEBACisvKiAtKi0gbGludXgtYyAtKi0KKyAqIGxpbnV4L2FyY2gvYmxhY2tmaW4va2VybmVsL2lwaXBlLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUtMjAwNyBQaGlsaXBwZSBHZXJ1bS4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlIE1BIDAyMTM5LAorICogVVNBOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorICogdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIEFyY2hpdGVjdHVyZS1kZXBlbmRlbnQgSS1waXBlIHN1cHBvcnQgZm9yIHRoZSBCbGFja2Zpbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9wZXJjcHUuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CisjaW5jbHVkZSA8YXNtL3VuaXN0ZC5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vYXRvbWljLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisKK3N0YXRpYyBpbnQgY3JlYXRlX2lycV90aHJlYWRzOworCitERUZJTkVfUEVSX0NQVShzdHJ1Y3QgcHRfcmVncywgX19pcGlwZV90aWNrX3JlZ3MpOworCitzdGF0aWMgREVGSU5FX1BFUl9DUFUodW5zaWduZWQgbG9uZywgcGVuZGluZ19pcnF0aHJlYWRfbWFzayk7CisKK3N0YXRpYyBERUZJTkVfUEVSX0NQVShpbnQgW0lWRzEzICsgMV0sIHBlbmRpbmdfaXJxX2NvdW50KTsKKworYXNtbGlua2FnZSB2b2lkIGFzbV9kb19JUlEodW5zaWduZWQgaW50IGlycSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworCitzdGF0aWMgdm9pZCBfX2lwaXBlX25vX2lycXRhaWwodm9pZCk7CisKK3Vuc2lnbmVkIGxvbmcgX19pcGlwZV9pcnFfdGFpbF9ob29rID0gKHVuc2lnbmVkIGxvbmcpJl9faXBpcGVfbm9faXJxdGFpbDsKK0VYUE9SVF9TWU1CT0woX19pcGlwZV9pcnFfdGFpbF9ob29rKTsKKwordW5zaWduZWQgbG9uZyBfX2lwaXBlX2NvcmVfY2xvY2s7CitFWFBPUlRfU1lNQk9MKF9faXBpcGVfY29yZV9jbG9jayk7CisKK3Vuc2lnbmVkIGxvbmcgX19pcGlwZV9mcmVxX3NjYWxlOworRVhQT1JUX1NZTUJPTChfX2lwaXBlX2ZyZXFfc2NhbGUpOworCithdG9taWNfdCBfX2lwaXBlX2lycV9sdmRlcHRoW0lWRzE1ICsgMV07CisKK3Vuc2lnbmVkIGxvbmcgX19pcGlwZV9pcnFfbHZtYXNrID0gX19hbGxfbWFza2VkX2lycV9mbGFnczsKK0VYUE9SVF9TWU1CT0woX19pcGlwZV9pcnFfbHZtYXNrKTsKKworc3RhdGljIHZvaWQgX19pcGlwZV9hY2tfaXJxKHVuc2lnbmVkIGlycSwgc3RydWN0IGlycV9kZXNjICpkZXNjKQoreworCWRlc2MtPmlwaXBlX2FjayhpcnEsIGRlc2MpOworfQorCisvKgorICogX19pcGlwZV9lbmFibGVfcGlwZWxpbmUoKSAtLSBXZSBhcmUgcnVubmluZyBvbiB0aGUgYm9vdCBDUFUsIGh3CisgKiBpbnRlcnJ1cHRzIGFyZSBvZmYsIGFuZCBzZWNvbmRhcnkgQ1BVcyBhcmUgc3RpbGwgbG9zdCBpbiBzcGFjZS4KKyAqLwordm9pZCBfX2lwaXBlX2VuYWJsZV9waXBlbGluZSh2b2lkKQoreworCXVuc2lnbmVkIGlycTsKKworCV9faXBpcGVfY29yZV9jbG9jayA9IGdldF9jY2xrKCk7IC8qIEZldGNoIHRoaXMgb25jZS4gKi8KKwlfX2lwaXBlX2ZyZXFfc2NhbGUgPSAxMDAwMDAwMDAwVUwgLyBfX2lwaXBlX2NvcmVfY2xvY2s7CisKKwlmb3IgKGlycSA9IDA7IGlycSA8IE5SX0lSUVM7ICsraXJxKQorCQlpcGlwZV92aXJ0dWFsaXplX2lycShpcGlwZV9yb290X2RvbWFpbiwKKwkJCQkgICAgIGlycSwKKwkJCQkgICAgIChpcGlwZV9pcnFfaGFuZGxlcl90KSZhc21fZG9fSVJRLAorCQkJCSAgICAgTlVMTCwKKwkJCQkgICAgICZfX2lwaXBlX2Fja19pcnEsCisJCQkJICAgICBJUElQRV9IQU5ETEVfTUFTSyB8IElQSVBFX1BBU1NfTUFTSyk7Cit9CisKKy8qCisgKiBfX2lwaXBlX2hhbmRsZV9pcnEoKSAtLSBJUElQRSdzIGdlbmVyaWMgSVJRIGhhbmRsZXIuIEFuIG9wdGltaXN0aWMKKyAqIGludGVycnVwdCBwcm90ZWN0aW9uIGxvZyBpcyBtYWludGFpbmVkIGhlcmUgZm9yIGVhY2ggZG9tYWluLiBIdworICogaW50ZXJydXB0cyBhcmUgbWFza2VkIG9uIGVudHJ5LgorICovCit2b2lkIF9faXBpcGVfaGFuZGxlX2lycSh1bnNpZ25lZCBpcnEsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBpcGlwZV9kb21haW4gKnRoaXNfZG9tYWluLCAqbmV4dF9kb21haW47CisJc3RydWN0IGxpc3RfaGVhZCAqaGVhZCwgKnBvczsKKwlpbnQgbV9hY2ssIHMgPSAtMTsKKworCS8qCisJICogU29mdHdhcmUtdHJpZ2dlcmVkIElSUXMgZG8gbm90IG5lZWQgYW55IGFjay4gIFRoZSBjb250ZW50cworCSAqIG9mIHRoZSByZWdpc3RlciBmcmFtZSBzaG91bGQgb25seSBiZSB1c2VkIHdoZW4gcHJvY2Vzc2luZworCSAqIHRoZSB0aW1lciBpbnRlcnJ1cHQsIGJ1dCBub3QgZm9yIGhhbmRsaW5nIGFueSBvdGhlcgorCSAqIGludGVycnVwdC4KKwkgKi8KKwltX2FjayA9IChyZWdzID09IE5VTEwgfHwgaXJxID09IElSUV9TWVNUTVIgfHwgaXJxID09IElSUV9DT1JFVE1SKTsKKworCXRoaXNfZG9tYWluID0gaXBpcGVfY3VycmVudF9kb21haW47CisKKwlpZiAodW5saWtlbHkodGVzdF9iaXQoSVBJUEVfU1RJQ0tZX0ZMQUcsICZ0aGlzX2RvbWFpbi0+aXJxc1tpcnFdLmNvbnRyb2wpKSkKKwkJaGVhZCA9ICZ0aGlzX2RvbWFpbi0+cF9saW5rOworCWVsc2UgeworCQloZWFkID0gX19pcGlwZV9waXBlbGluZS5uZXh0OworCQluZXh0X2RvbWFpbiA9IGxpc3RfZW50cnkoaGVhZCwgc3RydWN0IGlwaXBlX2RvbWFpbiwgcF9saW5rKTsKKwkJaWYgKGxpa2VseSh0ZXN0X2JpdChJUElQRV9XSVJFRF9GTEFHLCAmbmV4dF9kb21haW4tPmlycXNbaXJxXS5jb250cm9sKSkpIHsKKwkJCWlmICghbV9hY2sgJiYgbmV4dF9kb21haW4tPmlycXNbaXJxXS5hY2tub3dsZWRnZSAhPSBOVUxMKQorCQkJCW5leHRfZG9tYWluLT5pcnFzW2lycV0uYWNrbm93bGVkZ2UoaXJxLCBpcnFfZGVzYyArIGlycSk7CisJCQlpZiAodGVzdF9iaXQoSVBJUEVfUk9PVExPQ0tfRkxBRywgJmlwaXBlX3Jvb3RfZG9tYWluLT5mbGFncykpCisJCQkJcyA9IF9fdGVzdF9hbmRfc2V0X2JpdChJUElQRV9TVEFMTF9GTEFHLAorCQkJCQkJICAgICAgICZpcGlwZV9yb290X2NwdWRvbV92YXIoc3RhdHVzKSk7CisJCQlfX2lwaXBlX2Rpc3BhdGNoX3dpcmVkKG5leHRfZG9tYWluLCBpcnEpOworCQkJCWdvdG8gZmluYWxpemU7CisJCQlyZXR1cm47CisJCX0KKwl9CisKKwkvKiBBY2sgdGhlIGludGVycnVwdC4gKi8KKworCXBvcyA9IGhlYWQ7CisKKwl3aGlsZSAocG9zICE9ICZfX2lwaXBlX3BpcGVsaW5lKSB7CisJCW5leHRfZG9tYWluID0gbGlzdF9lbnRyeShwb3MsIHN0cnVjdCBpcGlwZV9kb21haW4sIHBfbGluayk7CisJCS8qCisJCSAqIEZvciBlYWNoIGRvbWFpbiBoYW5kbGluZyB0aGUgaW5jb21pbmcgSVJRLCBtYXJrIGl0CisJCSAqIGFzIHBlbmRpbmcgaW4gaXRzIGxvZy4KKwkJICovCisJCWlmICh0ZXN0X2JpdChJUElQRV9IQU5ETEVfRkxBRywgJm5leHRfZG9tYWluLT5pcnFzW2lycV0uY29udHJvbCkpIHsKKwkJCS8qCisJCQkgKiBEb21haW5zIHRoYXQgaGFuZGxlIHRoaXMgSVJRIGFyZSBwb2xsZWQgZm9yCisJCQkgKiBhY2tub3dsZWRnaW5nIGl0IGJ5IGRlY3JlYXNpbmcgcHJpb3JpdHkKKwkJCSAqIG9yZGVyLiBUaGUgaW50ZXJydXB0IG11c3QgYmUgbWFkZSBwZW5kaW5nCisJCQkgKiBfZmlyc3RfIGluIHRoZSBkb21haW4ncyBzdGF0dXMgZmxhZ3MgYmVmb3JlCisJCQkgKiB0aGUgUElDIGlzIHVubG9ja2VkLgorCQkJICovCisJCQlfX2lwaXBlX3NldF9pcnFfcGVuZGluZyhuZXh0X2RvbWFpbiwgaXJxKTsKKworCQkJaWYgKCFtX2FjayAmJiBuZXh0X2RvbWFpbi0+aXJxc1tpcnFdLmFja25vd2xlZGdlICE9IE5VTEwpIHsKKwkJCQluZXh0X2RvbWFpbi0+aXJxc1tpcnFdLmFja25vd2xlZGdlKGlycSwgaXJxX2Rlc2MgKyBpcnEpOworCQkJCW1fYWNrID0gMTsKKwkJCX0KKwkJfQorCisJCS8qCisJCSAqIElmIHRoZSBkb21haW4gZG9lcyBub3Qgd2FudCB0aGUgSVJRIHRvIGJlIHBhc3NlZAorCQkgKiBkb3duIHRoZSBpbnRlcnJ1cHQgcGlwZSwgZXhpdCB0aGUgbG9vcCBub3cuCisJCSAqLworCQlpZiAoIXRlc3RfYml0KElQSVBFX1BBU1NfRkxBRywgJm5leHRfZG9tYWluLT5pcnFzW2lycV0uY29udHJvbCkpCisJCQlicmVhazsKKworCQlwb3MgPSBuZXh0X2RvbWFpbi0+cF9saW5rLm5leHQ7CisJfQorCisJLyoKKwkgKiBOb3cgd2FsayB0aGUgcGlwZWxpbmUsIHlpZWxkaW5nIGNvbnRyb2wgdG8gdGhlIGhpZ2hlc3QKKwkgKiBwcmlvcml0eSBkb21haW4gdGhhdCBoYXMgcGVuZGluZyBpbnRlcnJ1cHQocykgb3IKKwkgKiBpbW1lZGlhdGVseSB0byB0aGUgY3VycmVudCBkb21haW4gaWYgdGhlIGludGVycnVwdCBoYXMgYmVlbgorCSAqIG1hcmtlZCBhcyAnc3RpY2t5Jy4gVGhpcyBzZWFyY2ggZG9lcyBub3QgZ28gYmV5b25kIHRoZQorCSAqIGN1cnJlbnQgZG9tYWluIGluIHRoZSBwaXBlbGluZS4gV2UgYWxzbyBlbmZvcmNlIHRoZQorCSAqIGFkZGl0aW9uYWwgcm9vdCBzdGFnZSBsb2NrIChibGFja2Zpbi1zcGVjaWZpYykuICovCisKKwlpZiAodGVzdF9iaXQoSVBJUEVfUk9PVExPQ0tfRkxBRywgJmlwaXBlX3Jvb3RfZG9tYWluLT5mbGFncykpCisJCXMgPSBfX3Rlc3RfYW5kX3NldF9iaXQoSVBJUEVfU1RBTExfRkxBRywKKwkJCQkgICAgICAgJmlwaXBlX3Jvb3RfY3B1ZG9tX3ZhcihzdGF0dXMpKTsKK2ZpbmFsaXplOgorCisJX19pcGlwZV93YWxrX3BpcGVsaW5lKGhlYWQpOworCisJaWYgKCFzKQorCQlfX2NsZWFyX2JpdChJUElQRV9TVEFMTF9GTEFHLAorCQkJICAgICZpcGlwZV9yb290X2NwdWRvbV92YXIoc3RhdHVzKSk7Cit9CisKK2ludCBfX2lwaXBlX2NoZWNrX3Jvb3Qodm9pZCkKK3sKKwlyZXR1cm4gaXBpcGVfcm9vdF9kb21haW5fcDsKK30KKwordm9pZCBfX2lwaXBlX2VuYWJsZV9pcnFkZXNjKHN0cnVjdCBpcGlwZV9kb21haW4gKmlwZCwgdW5zaWduZWQgaXJxKQoreworCXN0cnVjdCBpcnFfZGVzYyAqZGVzYyA9IGlycV9kZXNjICsgaXJxOworCWludCBwcmlvID0gZGVzYy0+aWNfcHJpbzsKKworCWRlc2MtPmRlcHRoID0gMDsKKwlpZiAoaXBkICE9ICZpcGlwZV9yb290ICYmCisJICAgIGF0b21pY19pbmNfcmV0dXJuKCZfX2lwaXBlX2lycV9sdmRlcHRoW3ByaW9dKSA9PSAxKQorCQlfX3NldF9iaXQocHJpbywgJl9faXBpcGVfaXJxX2x2bWFzayk7Cit9CitFWFBPUlRfU1lNQk9MKF9faXBpcGVfZW5hYmxlX2lycWRlc2MpOworCit2b2lkIF9faXBpcGVfZGlzYWJsZV9pcnFkZXNjKHN0cnVjdCBpcGlwZV9kb21haW4gKmlwZCwgdW5zaWduZWQgaXJxKQoreworCXN0cnVjdCBpcnFfZGVzYyAqZGVzYyA9IGlycV9kZXNjICsgaXJxOworCWludCBwcmlvID0gZGVzYy0+aWNfcHJpbzsKKworCWlmIChpcGQgIT0gJmlwaXBlX3Jvb3QgJiYKKwkgICAgYXRvbWljX2RlY19hbmRfdGVzdCgmX19pcGlwZV9pcnFfbHZkZXB0aFtwcmlvXSkpCisJCV9fY2xlYXJfYml0KHByaW8sICZfX2lwaXBlX2lycV9sdm1hc2spOworfQorRVhQT1JUX1NZTUJPTChfX2lwaXBlX2Rpc2FibGVfaXJxZGVzYyk7CisKK3ZvaWQgX19pcGlwZV9zdGFsbF9yb290X3Jhdyh2b2lkKQoreworCS8qCisJICogVGhpcyBjb2RlIGlzIGNhbGxlZCBieSB0aGUgaW5ze2J3bH0gcm91dGluZXMgKHNlZQorCSAqIGFyY2gvYmxhY2tmaW4vbGliL2lucy5TKSwgd2hpY2ggYXJlIGhlYXZpbHkgdXNlZCBieSB0aGUKKwkgKiBuZXR3b3JrIHN0YWNrLiBJdCBtYXNrcyBhbGwgaW50ZXJydXB0cyBidXQgdGhvc2UgaGFuZGxlZCBieQorCSAqIG5vbi1yb290IGRvbWFpbnMsIHNvIHRoYXQgd2Uga2VlcCBkZWNlbnQgbmV0d29yayB0cmFuc2ZlcgorCSAqIHJhdGVzIGZvciBMaW51eCB3aXRob3V0IGluZHVjaW5nIHBhdGhvbG9naWNhbCBqaXR0ZXIgZm9yCisJICogdGhlIHJlYWwtdGltZSBkb21haW4uCisJICovCisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJzdGkgJTA7IiA6IDogImQiKF9faXBpcGVfaXJxX2x2bWFzaykpOworCisJX19zZXRfYml0KElQSVBFX1NUQUxMX0ZMQUcsCisJCSAgJmlwaXBlX3Jvb3RfY3B1ZG9tX3ZhcihzdGF0dXMpKTsKK30KKwordm9pZCBfX2lwaXBlX3Vuc3RhbGxfcm9vdF9yYXcodm9pZCkKK3sKKwlfX2NsZWFyX2JpdChJUElQRV9TVEFMTF9GTEFHLAorCQkgICAgJmlwaXBlX3Jvb3RfY3B1ZG9tX3ZhcihzdGF0dXMpKTsKKworCV9fYXNtX18gX192b2xhdGlsZV9fICgic3RpICUwOyIgOiA6ICJkIihiZmluX2lycV9mbGFncykpOworfQorCitpbnQgX19pcGlwZV9zeXNjYWxsX3Jvb3Qoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8qIFdlIG5lZWQgdG8gcnVuIHRoZSBJUlEgdGFpbCBob29rIHdoZW5ldmVyIHdlIGRvbid0CisJICogcHJvcGFnYXRlIGEgc3lzY2FsbCB0byBoaWdoZXIgZG9tYWlucywgYmVjYXVzZSB3ZSBrbm93IHRoYXQKKwkgKiBpbXBvcnRhbnQgb3BlcmF0aW9ucyBtaWdodCBiZSBwZW5kaW5nIHRoZXJlIChlLmcuIFhlbm9tYWkKKwkgKiBkZWZlcnJlZCByZXNjaGVkdWxpbmcpLiAqLworCisJaWYgKCFfX2lwaXBlX3N5c2NhbGxfd2F0Y2hlZF9wKGN1cnJlbnQsIHJlZ3MtPm9yaWdfcDApKSB7CisJCXZvaWQgKCpob29rKSh2b2lkKSA9ICh2b2lkICgqKSh2b2lkKSlfX2lwaXBlX2lycV90YWlsX2hvb2s7CisJCWhvb2soKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyoKKwkgKiBUaGlzIHJvdXRpbmUgZWl0aGVyIHJldHVybnM6CisJICogMCAtLSBpZiB0aGUgc3lzY2FsbCBpcyB0byBiZSBwYXNzZWQgdG8gTGludXg7CisJICogMSAtLSBpZiB0aGUgc3lzY2FsbCBzaG91bGQgbm90IGJlIHBhc3NlZCB0byBMaW51eCwgYW5kIG5vCisJICogdGFpbCB3b3JrIHNob3VsZCBiZSBwZXJmb3JtZWQ7CisJICogLTEgLS0gaWYgdGhlIHN5c2NhbGwgc2hvdWxkIG5vdCBiZSBwYXNzZWQgdG8gTGludXggYnV0IHRoZQorCSAqIHRhaWwgd29yayBoYXMgdG8gYmUgcGVyZm9ybWVkIChmb3IgaGFuZGxpbmcgc2lnbmFscyBldGMpLgorCSAqLworCisJaWYgKF9faXBpcGVfZXZlbnRfbW9uaXRvcmVkX3AoSVBJUEVfRVZFTlRfU1lTQ0FMTCkgJiYKKwkgICAgX19pcGlwZV9kaXNwYXRjaF9ldmVudChJUElQRV9FVkVOVF9TWVNDQUxMLCByZWdzKSA+IDApIHsKKwkJaWYgKGlwaXBlX3Jvb3RfZG9tYWluX3AgJiYgIWluX2F0b21pYygpKSB7CisJCQkvKgorCQkJICogU3luYyBwZW5kaW5nIFZJUlFzIGJlZm9yZSBfVElGX05FRURfUkVTQ0hFRAorCQkJICogaXMgdGVzdGVkLgorCQkJICovCisJCQlsb2NhbF9pcnFfc2F2ZV9odyhmbGFncyk7CisJCQlpZiAoKGlwaXBlX3Jvb3RfY3B1ZG9tX3ZhcihpcnFwZW5kX2hpbWFzaykgJiBJUElQRV9JUlFNQVNLX1ZJUlQpICE9IDApCisJCQkJX19pcGlwZV9zeW5jX3BpcGVsaW5lKElQSVBFX0lSUU1BU0tfVklSVCk7CisJCQlsb2NhbF9pcnFfcmVzdG9yZV9odyhmbGFncyk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJcmV0dXJuIDE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3Vuc2lnbmVkIGxvbmcgaXBpcGVfY3JpdGljYWxfZW50ZXIodm9pZCAoKnN5bmNmbikgKHZvaWQpKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlsb2NhbF9pcnFfc2F2ZV9odyhmbGFncyk7CisKKwlyZXR1cm4gZmxhZ3M7Cit9CisKK3ZvaWQgaXBpcGVfY3JpdGljYWxfZXhpdCh1bnNpZ25lZCBsb25nIGZsYWdzKQoreworCWxvY2FsX2lycV9yZXN0b3JlX2h3KGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgX19pcGlwZV9ub19pcnF0YWlsKHZvaWQpCit7Cit9CisKK2ludCBpcGlwZV9nZXRfc3lzaW5mbyhzdHJ1Y3QgaXBpcGVfc3lzaW5mbyAqaW5mbykKK3sKKwlpbmZvLT5uY3B1cyA9IG51bV9vbmxpbmVfY3B1cygpOworCWluZm8tPmNwdWZyZXEgPSBpcGlwZV9jcHVfZnJlcSgpOworCWluZm8tPmFyY2hkZXAudG1pcnEgPSBJUElQRV9USU1FUl9JUlE7CisJaW5mby0+YXJjaGRlcC50bWZyZXEgPSBpbmZvLT5jcHVmcmVxOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBpcGlwZV90cmlnZ2VyX2lycSgpIC0tIFB1c2ggdGhlIGludGVycnVwdCBhdCBmcm9udCBvZiB0aGUgcGlwZWxpbmUKKyAqIGp1c3QgbGlrZSBpZiBpdCBoYXMgYmVlbiBhY3R1YWxseSByZWNlaXZlZCBmcm9tIGEgaHcgc291cmNlLiBBbHNvCisgKiB3b3JrcyBmb3IgdmlydHVhbCBpbnRlcnJ1cHRzLgorICovCitpbnQgaXBpcGVfdHJpZ2dlcl9pcnEodW5zaWduZWQgaXJxKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoaXJxID49IElQSVBFX05SX0lSUVMgfHwKKwkgICAgKGlwaXBlX3ZpcnR1YWxfaXJxX3AoaXJxKQorCSAgICAgJiYgIXRlc3RfYml0KGlycSAtIElQSVBFX1ZJUlFfQkFTRSwgJl9faXBpcGVfdmlydHVhbF9pcnFfbWFwKSkpCisJCXJldHVybiAtRUlOVkFMOworCisJbG9jYWxfaXJxX3NhdmVfaHcoZmxhZ3MpOworCisJX19pcGlwZV9oYW5kbGVfaXJxKGlycSwgTlVMTCk7CisKKwlsb2NhbF9pcnFfcmVzdG9yZV9odyhmbGFncyk7CisKKwlyZXR1cm4gMTsKK30KKworLyogTW92ZSBMaW51eCBJUlEgdG8gdGhyZWFkcy4gKi8KKworc3RhdGljIGludCBkb19pcnFkKHZvaWQgKl9fZGVzYykKK3sKKwlzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MgPSBfX2Rlc2M7CisJdW5zaWduZWQgaXJxID0gZGVzYyAtIGlycV9kZXNjOworCWludCB0aHJwcmlvID0gZGVzYy0+dGhyX3ByaW87CisJaW50IHRocm1hc2sgPSAxIDw8IHRocnByaW87CisJaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKwljcHVtYXNrX3QgY3B1bWFzazsKKworCXNpZ2ZpbGxzZXQoJmN1cnJlbnQtPmJsb2NrZWQpOworCWN1cnJlbnQtPmZsYWdzIHw9IFBGX05PRlJFRVpFOworCWNwdW1hc2sgPSBjcHVtYXNrX29mX2NwdShjcHUpOworCXNldF9jcHVzX2FsbG93ZWQoY3VycmVudCwgY3B1bWFzayk7CisJaXBpcGVfc2V0c2NoZWR1bGVyX3Jvb3QoY3VycmVudCwgU0NIRURfRklGTywgNTAgKyB0aHJwcmlvKTsKKworCXdoaWxlICgha3RocmVhZF9zaG91bGRfc3RvcCgpKSB7CisJCWxvY2FsX2lycV9kaXNhYmxlKCk7CisJCWlmICghKGRlc2MtPnN0YXR1cyAmIElSUV9TQ0hFRFVMRUQpKSB7CisJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworcmVzY2hlZDoKKwkJCWxvY2FsX2lycV9lbmFibGUoKTsKKwkJCXNjaGVkdWxlKCk7CisJCQlsb2NhbF9pcnFfZGlzYWJsZSgpOworCQl9CisJCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKwkJLyoKKwkJICogSWYgaGlnaGVyIHByaW9yaXR5IGludGVycnVwdCBzZXJ2ZXJzIGFyZSByZWFkeSB0bworCQkgKiBydW4sIHJlc2NoZWR1bGUgaW1tZWRpYXRlbHkuIFdlIG5lZWQgdGhpcyBmb3IgdGhlCisJCSAqIEdQSU8gZGVtdXggSVJRIGhhbmRsZXIgdG8gdW5tYXNrIHRoZSBpbnRlcnJ1cHQgbGluZQorCQkgKiBfbGFzdF8sIGFmdGVyIGFsbCBHUElPIElSUXMgaGF2ZSBydW4uCisJCSAqLworCQlpZiAocGVyX2NwdShwZW5kaW5nX2lycXRocmVhZF9tYXNrLCBjcHUpICYgfih0aHJtYXNrfCh0aHJtYXNrLTEpKSkKKwkJCWdvdG8gcmVzY2hlZDsKKwkJaWYgKC0tcGVyX2NwdShwZW5kaW5nX2lycV9jb3VudFt0aHJwcmlvXSwgY3B1KSA9PSAwKQorCQkJcGVyX2NwdShwZW5kaW5nX2lycXRocmVhZF9tYXNrLCBjcHUpICY9IH50aHJtYXNrOworCQlkZXNjLT5zdGF0dXMgJj0gfklSUV9TQ0hFRFVMRUQ7CisJCWRlc2MtPnRocl9oYW5kbGVyKGlycSwgJl9fcmF3X2dldF9jcHVfdmFyKF9faXBpcGVfdGlja19yZWdzKSk7CisJCWxvY2FsX2lycV9lbmFibGUoKTsKKwl9CisJX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBraWNrX2lycWQodW5zaWduZWQgaXJxLCB2b2lkICpjb29raWUpCit7CisJc3RydWN0IGlycV9kZXNjICpkZXNjID0gaXJxX2Rlc2MgKyBpcnE7CisJaW50IHRocnByaW8gPSBkZXNjLT50aHJfcHJpbzsKKwlpbnQgdGhybWFzayA9IDEgPDwgdGhycHJpbzsKKwlpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOworCisJaWYgKCEoZGVzYy0+c3RhdHVzICYgSVJRX1NDSEVEVUxFRCkpIHsKKwkJZGVzYy0+c3RhdHVzIHw9IElSUV9TQ0hFRFVMRUQ7CisJCXBlcl9jcHUocGVuZGluZ19pcnF0aHJlYWRfbWFzaywgY3B1KSB8PSB0aHJtYXNrOworCQkrK3Blcl9jcHUocGVuZGluZ19pcnFfY291bnRbdGhycHJpb10sIGNwdSk7CisJCXdha2VfdXBfcHJvY2VzcyhkZXNjLT50aHJlYWQpOworCX0KK30KKworaW50IGlwaXBlX3N0YXJ0X2lycV90aHJlYWQodW5zaWduZWQgaXJxLCBzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MpCit7CisJaWYgKGRlc2MtPnRocmVhZCB8fCAhY3JlYXRlX2lycV90aHJlYWRzKQorCQlyZXR1cm4gMDsKKworCWRlc2MtPnRocmVhZCA9IGt0aHJlYWRfY3JlYXRlKGRvX2lycWQsIGRlc2MsICJJUlEgJWQiLCBpcnEpOworCWlmIChkZXNjLT50aHJlYWQgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgImlycWQ6IGNvdWxkIG5vdCBjcmVhdGUgSVJRIHRocmVhZCAlZCFcbiIsIGlycSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXdha2VfdXBfcHJvY2VzcyhkZXNjLT50aHJlYWQpOworCisJZGVzYy0+dGhyX2hhbmRsZXIgPSBpcGlwZV9yb290X2RvbWFpbi0+aXJxc1tpcnFdLmhhbmRsZXI7CisJaXBpcGVfcm9vdF9kb21haW4tPmlycXNbaXJxXS5oYW5kbGVyID0gJmtpY2tfaXJxZDsKKworCXJldHVybiAwOworfQorCit2b2lkIF9faW5pdCBpcGlwZV9pbml0X2lycV90aHJlYWRzKHZvaWQpCit7CisJdW5zaWduZWQgaXJxOworCXN0cnVjdCBpcnFfZGVzYyAqZGVzYzsKKworCWNyZWF0ZV9pcnFfdGhyZWFkcyA9IDE7CisKKwlmb3IgKGlycSA9IDA7IGlycSA8IE5SX0lSUVM7IGlycSsrKSB7CisJCWRlc2MgPSBpcnFfZGVzYyArIGlycTsKKwkJaWYgKGRlc2MtPmFjdGlvbiAhPSBOVUxMIHx8CisJCQkoZGVzYy0+c3RhdHVzICYgSVJRX05PUkVRVUVTVCkgIT0gMCkKKwkJCWlwaXBlX3N0YXJ0X2lycV90aHJlYWQoaXJxLCBkZXNjKTsKKwl9Cit9CisKK0VYUE9SVF9TWU1CT0woc2hvd19zdGFjayk7CisKKyNpZmRlZiBDT05GSUdfSVBJUEVfVFJBQ0VfTUNPVU5UCit2b2lkIG5vdHJhY2UgX21jb3VudCh2b2lkKTsKK0VYUE9SVF9TWU1CT0woX21jb3VudCk7CisjZW5kaWYgLyogQ09ORklHX0lQSVBFX1RSQUNFX01DT1VOVCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9rZXJuZWwvaXJxY2hpcC5jIGIvYXJjaC9ibGFja2Zpbi9rZXJuZWwvaXJxY2hpcC5jCmluZGV4IDA3NDAyZjUuLmFiODIwOWMgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4va2VybmVsL2lycWNoaXAuYworKysgYi9hcmNoL2JsYWNrZmluL2tlcm5lbC9pcnFjaGlwLmMKQEAgLTM2LDcgKzM2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KICNpbmNsdWRlIDxhc20vdHJhY2UuaD4KIAotc3RhdGljIHVuc2lnbmVkIGxvbmcgaXJxX2Vycl9jb3VudDsKK3N0YXRpYyBhdG9taWNfdCBpcnFfZXJyX2NvdW50Owogc3RhdGljIHNwaW5sb2NrX3QgaXJxX2NvbnRyb2xsZXJfbG9jazsKIAogLyoKQEAgLTQ4LDEwICs0OCw5IEBACiAKIHZvaWQgYWNrX2JhZF9pcnEodW5zaWduZWQgaW50IGlycSkKIHsKLQlpcnFfZXJyX2NvdW50ICs9IDE7CisJYXRvbWljX2luYygmaXJxX2Vycl9jb3VudCk7CiAJcHJpbnRrKEtFUk5fRVJSICJJUlE6IHNwdXJpb3VzIGludGVycnVwdCAlZFxuIiwgaXJxKTsKIH0KLUVYUE9SVF9TWU1CT0woYWNrX2JhZF9pcnEpOwogCiBzdGF0aWMgc3RydWN0IGlycV9jaGlwIGJhZF9jaGlwID0gewogCS5hY2sgPSBkdW1teV9tYXNrX3VubWFza19pcnEsCkBAIC03Miw3ICs3MSw3IEBACiAKIGludCBzaG93X2ludGVycnVwdHMoc3RydWN0IHNlcV9maWxlICpwLCB2b2lkICp2KQogewotCWludCBpID0gKihsb2ZmX3QgKikgdjsKKwlpbnQgaSA9ICoobG9mZl90ICopIHYsIGo7CiAJc3RydWN0IGlycWFjdGlvbiAqYWN0aW9uOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKQEAgLTgwLDE5ICs3OSwyMCBAQAogCQlzcGluX2xvY2tfaXJxc2F2ZSgmaXJxX2Rlc2NbaV0ubG9jaywgZmxhZ3MpOwogCQlhY3Rpb24gPSBpcnFfZGVzY1tpXS5hY3Rpb247CiAJCWlmICghYWN0aW9uKQotCQkJZ290byB1bmxvY2s7Ci0KLQkJc2VxX3ByaW50ZihwLCAiJTNkOiAlMTB1ICIsIGksIGtzdGF0X2lycXMoaSkpOworCQkJZ290byBza2lwOworCQlzZXFfcHJpbnRmKHAsICIlM2Q6ICIsIGkpOworCQlmb3JfZWFjaF9vbmxpbmVfY3B1KGopCisJCQlzZXFfcHJpbnRmKHAsICIlMTB1ICIsIGtzdGF0X2NwdShqKS5pcnFzW2ldKTsKKwkJc2VxX3ByaW50ZihwLCAiICU4cyIsIGlycV9kZXNjW2ldLmNoaXAtPm5hbWUpOwogCQlzZXFfcHJpbnRmKHAsICIgICVzIiwgYWN0aW9uLT5uYW1lKTsKIAkJZm9yIChhY3Rpb24gPSBhY3Rpb24tPm5leHQ7IGFjdGlvbjsgYWN0aW9uID0gYWN0aW9uLT5uZXh0KQotCQkJc2VxX3ByaW50ZihwLCAiLCAlcyIsIGFjdGlvbi0+bmFtZSk7CisJCQlzZXFfcHJpbnRmKHAsICIgICVzIiwgYWN0aW9uLT5uYW1lKTsKIAogCQlzZXFfcHV0YyhwLCAnXG4nKTsKLSB1bmxvY2s6Cisgc2tpcDoKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaXJxX2Rlc2NbaV0ubG9jaywgZmxhZ3MpOwotCX0gZWxzZSBpZiAoaSA9PSBOUl9JUlFTKSB7Ci0JCXNlcV9wcmludGYocCwgIkVycjogJTEwbHVcbiIsIGlycV9lcnJfY291bnQpOwotCX0KKwl9IGVsc2UgaWYgKGkgPT0gTlJfSVJRUykKKwkJc2VxX3ByaW50ZihwLCAiRXJyOiAlMTB1XG4iLCAgYXRvbWljX3JlYWQoJmlycV9lcnJfY291bnQpKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTAxLDcgKzEwMSw2IEBACiAgKiBjb21lIHZpYSB0aGlzIGZ1bmN0aW9uLiAgSW5zdGVhZCwgdGhleSBzaG91bGQgcHJvdmlkZSB0aGVpcgogICogb3duICdoYW5kbGVyJwogICovCi0KICNpZmRlZiBDT05GSUdfRE9fSVJRX0wxCiBfX2F0dHJpYnV0ZV9fKChsMV90ZXh0KSkKICNlbmRpZgpAQCAtMTA5LDggKzEwOCw5IEBACiB7CiAJc3RydWN0IHB0X3JlZ3MgKm9sZF9yZWdzOwogCXN0cnVjdCBpcnFfZGVzYyAqZGVzYyA9IGlycV9kZXNjICsgaXJxOworI2lmbmRlZiBDT05GSUdfSVBJUEUKIAl1bnNpZ25lZCBzaG9ydCBwZW5kaW5nLCBvdGhlcl9pbnRzOwotCisjZW5kaWYKIAlvbGRfcmVncyA9IHNldF9pcnFfcmVncyhyZWdzKTsKIAogCS8qCkBAIC0xMjEsOSArMTIxLDI0IEBACiAJCWRlc2MgPSAmYmFkX2lycV9kZXNjOwogCiAJaXJxX2VudGVyKCk7CisjaWZkZWYgQ09ORklHX0RFQlVHX1NUQUNLT1ZFUkZMT1cKKwkvKiBEZWJ1Z2dpbmcgY2hlY2sgZm9yIHN0YWNrIG92ZXJmbG93OiBpcyB0aGVyZSBsZXNzIHRoYW4gU1RBQ0tfV0FSTiBmcmVlPyAqLworCXsKKwkJbG9uZyBzcDsKIAorCQlzcCA9IF9fZ2V0X1NQKCkgJiAoVEhSRUFEX1NJWkUtMSk7CisKKwkJaWYgKHVubGlrZWx5KHNwIDwgKHNpemVvZihzdHJ1Y3QgdGhyZWFkX2luZm8pICsgU1RBQ0tfV0FSTikpKSB7CisJCQlkdW1wX3N0YWNrKCk7CisJCQlwcmludGsoS0VSTl9FTUVSRyAiJXM6IHBvc3NpYmxlIHN0YWNrIG92ZXJmbG93IHdoaWxlIGhhbmRsaW5nIGlycSAlaSAiCisJCQkJCSIgb25seSAlbGQgYnl0ZXMgZnJlZVxuIiwKKwkJCQlfX2Z1bmNfXywgaXJxLCBzcCAtIHNpemVvZihzdHJ1Y3QgdGhyZWFkX2luZm8pKTsKKwkJfQorCX0KKyNlbmRpZgogCWdlbmVyaWNfaGFuZGxlX2lycShpcnEpOwogCisjaWZuZGVmIENPTkZJR19JUElQRQkvKiBVc2VsZXNzIGFuZCBidWdvdXMgb3ZlciB0aGUgSS1waXBlOiBJUlFzIGFyZSB0aHJlYWRlZC4gKi8KIAkvKiBJZiB3ZSdyZSB0aGUgb25seSBpbnRlcnJ1cHQgcnVubmluZyAoaWdub3JpbmcgSVJRMTUgd2hpY2ggaXMgZm9yCiAJICAgc3lzY2FsbHMpLCBsb3dlciBvdXIgcHJpb3JpdHkgdG8gSVJRMTQgc28gdGhhdCBzb2Z0aXJxcyBydW4gYXQKIAkgICB0aGF0IGxldmVsLiAgSWYgdGhlcmUncyBhbm90aGVyLCBsb3dlci1sZXZlbCBpbnRlcnJ1cHQsIGlycV9leGl0CkBAIC0xMzMsNiArMTQ4LDcgQEAKIAlvdGhlcl9pbnRzID0gcGVuZGluZyAmIChwZW5kaW5nIC0gMSk7CiAJaWYgKG90aGVyX2ludHMgPT0gMCkKIAkJbG93ZXJfdG9faXJxMTQoKTsKKyNlbmRpZiAvKiAhQ09ORklHX0lQSVBFICovCiAJaXJxX2V4aXQoKTsKIAogCXNldF9pcnFfcmVncyhvbGRfcmVncyk7CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2tlcm5lbC9rZ2RiLmMgYi9hcmNoL2JsYWNrZmluL2tlcm5lbC9rZ2RiLmMKaW5kZXggYjc5NWEyMC4uYjE2M2Y2ZCAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9rZXJuZWwva2dkYi5jCisrKyBiL2FyY2gvYmxhY2tmaW4va2VybmVsL2tnZGIuYwpAQCAtMzQsOSArMzQsMTQgQEAKICNlcnJvciBjaGFuZ2UgdGhlIGRlZmluaXRpb24gb2Ygc2xhdmVjcHVsb2NrcwogI2VuZGlmCiAKLSNpZmRlZiBDT05GSUdfQkZJTl9XRFQKLSMgZXJyb3IgIlBsZWFzZSB1bnNlbGVjdCBibGFja2ZpbiB3YXRjaGRvZyBkcml2ZXIgYmVmb3JlIGJ1aWxkIEtHREIuIgotI2VuZGlmCisjZGVmaW5lIElOX01FTShhZGRyLCBzaXplLCBsMV9hZGRyLCBsMV9zaXplKSBcCisoeyBcCisJdW5zaWduZWQgbG9uZyBfX2FkZHIgPSAodW5zaWduZWQgbG9uZykoYWRkcik7IFwKKwkobDFfc2l6ZSAmJiBfX2FkZHIgPj0gbDFfYWRkciAmJiBfX2FkZHIgKyAoc2l6ZSkgPD0gbDFfYWRkciArIGwxX3NpemUpOyBcCit9KQorI2RlZmluZSBBU1lOQ19CQU5LX1NJWkUgXAorCShBU1lOQ19CQU5LMF9TSVpFICsgQVNZTkNfQkFOSzFfU0laRSArIFwKKwkgQVNZTkNfQkFOSzJfU0laRSArIEFTWU5DX0JBTkszX1NJWkUpCiAKIHZvaWQgcHRfcmVnc190b19nZGJfcmVncyh1bnNpZ25lZCBsb25nICpnZGJfcmVncywgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CkBAIC0xMDUsNyArMTEwLDcgQEAKICAqIEV4dHJhY3RzIGVicCwgZXNwIGFuZCBlaXAgdmFsdWVzIHVuZGVyc3RhbmRhYmxlIGJ5IGdkYiBmcm9tIHRoZSB2YWx1ZXMKICAqIHNhdmVkIGJ5IHN3aXRjaF90by4KICAqIHRocmVhZC5lc3AgcG9pbnRzIHRvIGVicC4gZmxhZ3MgYW5kIGVicCBhcmUgcHVzaGVkIGluIHN3aXRjaF90byBoZW5jZSBlc3AKLSAqIHByaW9yIHRvIGVudGVyaW5nIHN3aXRjaF90byBpcyA4IGdyZWF0ZXIgdGhlbiB0aGUgdmFsdWUgdGhhdCBpcyBzYXZlZC4KKyAqIHByaW9yIHRvIGVudGVyaW5nIHN3aXRjaF90byBpcyA4IGdyZWF0ZXIgdGhhbiB0aGUgdmFsdWUgdGhhdCBpcyBzYXZlZC4KICAqIElmIHN3aXRjaF90byBjaGFuZ2VzLCBjaGFuZ2UgZm9sbG93aW5nIGNvZGUgYXBwcm9wcmlhdGVseS4KICAqLwogdm9pZCBzbGVlcGluZ190aHJlYWRfdG9fZ2RiX3JlZ3ModW5zaWduZWQgbG9uZyAqZ2RiX3JlZ3MsIHN0cnVjdCB0YXNrX3N0cnVjdCAqcCkKQEAgLTIxOSw2ICsyMjQsNyBAQAogCQlpZiAoYmZpbl90eXBlID09IGJyZWFraW5mb1ticmVha25vXS50eXBlCiAJCQkmJiAhYnJlYWtpbmZvW2JyZWFrbm9dLm9jY3VwaWVkKSB7CiAJCQlicmVha2luZm9bYnJlYWtub10ub2NjdXBpZWQgPSAxOworCQkJYnJlYWtpbmZvW2JyZWFrbm9dLnNraXAgPSAwOwogCQkJYnJlYWtpbmZvW2JyZWFrbm9dLmVuYWJsZWQgPSAxOwogCQkJYnJlYWtpbmZvW2JyZWFrbm9dLmFkZHIgPSBhZGRyOwogCQkJYnJlYWtpbmZvW2JyZWFrbm9dLmRhdGFhY2MgPSBkYXRhYWNjOwpAQCAtMzYzLDEyICszNjksMTIgQEAKIAogdm9pZCBrZ2RiX3JvdW5kdXBfY3B1cyh1bnNpZ25lZCBsb25nIGZsYWdzKQogewotCXNtcF9jYWxsX2Z1bmN0aW9uKGtnZGJfcGFzc2l2ZV9jcHVfY2FsbGJhY2ssIE5VTEwsIDAsIDApOworCXNtcF9jYWxsX2Z1bmN0aW9uKGtnZGJfcGFzc2l2ZV9jcHVfY2FsbGJhY2ssIE5VTEwsIDApOwogfQogCiB2b2lkIGtnZGJfcm91bmR1cF9jcHUoaW50IGNwdSwgdW5zaWduZWQgbG9uZyBmbGFncykKIHsKLQlzbXBfY2FsbF9mdW5jdGlvbl9zaW5nbGUoY3B1LCBrZ2RiX3Bhc3NpdmVfY3B1X2NhbGxiYWNrLCBOVUxMLCAwLCAwKTsKKwlzbXBfY2FsbF9mdW5jdGlvbl9zaW5nbGUoY3B1LCBrZ2RiX3Bhc3NpdmVfY3B1X2NhbGxiYWNrLCBOVUxMLCAwKTsKIH0KICNlbmRpZgogCkBAIC0zODUsMTAgKzM5MSw4IEBACiAJCQkgICAgICAgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJbG9uZyBhZGRyOwotCWxvbmcgYnJlYWtubzsKIAljaGFyICpwdHI7CiAJaW50IG5ld1BDOwotCWludCB3cF9zdGF0dXM7CiAJaW50IGk7CiAKIAlzd2l0Y2ggKHJlbWNvbV9pbl9idWZmZXJbMF0pIHsKQEAgLTQyNiwxNyArNDMwLDYgQEAKIAkJCWtnZGJfc2luZ2xlX3N0ZXAgPSBpICsgMTsKIAkJfQogCi0JCWlmICh2ZWN0b3IgPT0gVkVDX1dBVENIKSB7Ci0JCQl3cF9zdGF0dXMgPSBiZmluX3JlYWRfV1BTVEFUKCk7Ci0JCQlmb3IgKGJyZWFrbm8gPSAwOyBicmVha25vIDwgSFdfV0FUQ0hQT0lOVF9OVU07IGJyZWFrbm8rKykgewotCQkJCWlmICh3cF9zdGF0dXMgJiAoMSA8PCBicmVha25vKSkgewotCQkJCQlicmVha2luZm8tPnNraXAgPSAxOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQliZmluX3dyaXRlX1dQU1RBVCgwKTsKLQkJfQotCiAJCWJmaW5fY29ycmVjdF9od19icmVhaygpOwogCiAJCXJldHVybiAwOwpAQCAtNDc4LDU3ICs0NzEsMzIgQEAKIAkJcmV0dXJuIDA7CiAJaWYgKGFkZHIgPj0gU1lTTU1SX0JBU0UpCiAJCXJldHVybiAwOwotCWlmIChhZGRyID49IEFTWU5DX0JBTkswX0JBU0UKLQkgICAmJiBhZGRyICsgc2l6ZSA8PSBBU1lOQ19CQU5LM19CQVNFICsgQVNZTkNfQkFOSzNfU0laRSkKKwlpZiAoSU5fTUVNKGFkZHIsIHNpemUsIEFTWU5DX0JBTkswX0JBU0UsIEFTWU5DX0JBTktfU0laRSkpCiAJCXJldHVybiAwOwogCWlmIChjcHUgPT0gMCkgewotCQlpZiAoYWRkciA+PSBMMV9TQ1JBVENIX1NUQVJUCi0JCSAgICYmIChhZGRyICsgc2l6ZSA8PSBMMV9TQ1JBVENIX1NUQVJUICsgTDFfU0NSQVRDSF9MRU5HVEgpKQorCQlpZiAoSU5fTUVNKGFkZHIsIHNpemUsIEwxX1NDUkFUQ0hfU1RBUlQsIEwxX1NDUkFUQ0hfTEVOR1RIKSkKIAkJCXJldHVybiAwOwotI2lmIEwxX0NPREVfTEVOR1RIICE9IDAKLQkJaWYgKGFkZHIgPj0gTDFfQ09ERV9TVEFSVAotCQkgICAmJiAoYWRkciArIHNpemUgPD0gTDFfQ09ERV9TVEFSVCArIEwxX0NPREVfTEVOR1RIKSkKKwkJaWYgKElOX01FTShhZGRyLCBzaXplLCBMMV9DT0RFX1NUQVJULCBMMV9DT0RFX0xFTkdUSCkpCiAJCQlyZXR1cm4gMDsKLSNlbmRpZgotI2lmIEwxX0RBVEFfQV9MRU5HVEggIT0gMAotCQlpZiAoYWRkciA+PSBMMV9EQVRBX0FfU1RBUlQKLQkJICAgJiYgKGFkZHIgKyBzaXplIDw9IEwxX0RBVEFfQV9TVEFSVCArIEwxX0RBVEFfQV9MRU5HVEgpKQorCQlpZiAoSU5fTUVNKGFkZHIsIHNpemUsIEwxX0RBVEFfQV9TVEFSVCwgTDFfREFUQV9BX0xFTkdUSCkpCiAJCQlyZXR1cm4gMDsKLSNlbmRpZgotI2lmIEwxX0RBVEFfQl9MRU5HVEggIT0gMAotCQlpZiAoYWRkciA+PSBMMV9EQVRBX0JfU1RBUlQKLQkJICAgJiYgKGFkZHIgKyBzaXplIDw9IEwxX0RBVEFfQl9TVEFSVCArIEwxX0RBVEFfQl9MRU5HVEgpKQorCQlpZiAoSU5fTUVNKGFkZHIsIHNpemUsIEwxX0RBVEFfQl9TVEFSVCwgTDFfREFUQV9CX0xFTkdUSCkpCiAJCQlyZXR1cm4gMDsKLSNlbmRpZgogI2lmZGVmIENPTkZJR19TTVAKIAl9IGVsc2UgaWYgKGNwdSA9PSAxKSB7Ci0JCWlmIChhZGRyID49IENPUkVCX0wxX1NDUkFUQ0hfU1RBUlQKLQkJICAgJiYgKGFkZHIgKyBzaXplIDw9IENPUkVCX0wxX1NDUkFUQ0hfU1RBUlQKLQkJICAgKyBMMV9TQ1JBVENIX0xFTkdUSCkpCisJCWlmIChJTl9NRU0oYWRkciwgc2l6ZSwgQ09SRUJfTDFfU0NSQVRDSF9TVEFSVCwgTDFfU0NSQVRDSF9MRU5HVEgpKQogCQkJcmV0dXJuIDA7Ci0jIGlmIEwxX0NPREVfTEVOR1RIICE9IDAKLQkJaWYgKGFkZHIgPj0gQ09SRUJfTDFfQ09ERV9TVEFSVAotCQkgICAmJiAoYWRkciArIHNpemUgPD0gQ09SRUJfTDFfQ09ERV9TVEFSVCArIEwxX0NPREVfTEVOR1RIKSkKKwkJaWYgKElOX01FTShhZGRyLCBzaXplLCBDT1JFQl9MMV9DT0RFX1NUQVJULCBMMV9DT0RFX0xFTkdUSCkpCiAJCQlyZXR1cm4gMDsKLSMgZW5kaWYKLSMgaWYgTDFfREFUQV9BX0xFTkdUSCAhPSAwCi0JCWlmIChhZGRyID49IENPUkVCX0wxX0RBVEFfQV9TVEFSVAotCQkgICAmJiAoYWRkciArIHNpemUgPD0gQ09SRUJfTDFfREFUQV9BX1NUQVJUICsgTDFfREFUQV9BX0xFTkdUSCkpCisJCWlmIChJTl9NRU0oYWRkciwgc2l6ZSwgQ09SRUJfTDFfREFUQV9BX1NUQVJULCBMMV9EQVRBX0FfTEVOR1RIKSkKIAkJCXJldHVybiAwOwotIyBlbmRpZgotIyBpZiBMMV9EQVRBX0JfTEVOR1RIICE9IDAKLQkJaWYgKGFkZHIgPj0gQ09SRUJfTDFfREFUQV9CX1NUQVJUCi0JCSAgICYmIChhZGRyICsgc2l6ZSA8PSBDT1JFQl9MMV9EQVRBX0JfU1RBUlQgKyBMMV9EQVRBX0JfTEVOR1RIKSkKKwkJaWYgKElOX01FTShhZGRyLCBzaXplLCBDT1JFQl9MMV9EQVRBX0JfU1RBUlQsIEwxX0RBVEFfQl9MRU5HVEgpKQogCQkJcmV0dXJuIDA7Ci0jIGVuZGlmCiAjZW5kaWYKIAl9CiAKLSNpZiBMMl9MRU5HVEggIT0gMAotCWlmIChhZGRyID49IEwyX1NUQVJUCi0JICAgJiYgYWRkciArIHNpemUgPD0gTDJfU1RBUlQgKyBMMl9MRU5HVEgpCisJaWYgKElOX01FTShhZGRyLCBzaXplLCBMMl9TVEFSVCwgTDJfTEVOR1RIKSkKIAkJcmV0dXJuIDA7Ci0jZW5kaWYKIAogCXJldHVybiBFRkFVTFQ7CiB9CkBAIC01ODIsMTIgKzU1MCw5IEBACiAJCWRlZmF1bHQ6CiAJCQllcnIgPSBFRkFVTFQ7CiAJCX0KLQl9IGVsc2UgaWYgKGNwdSA9PSAwICYmICh1bnNpZ25lZCBpbnQpbWVtID49IEwxX0NPREVfU1RBUlQgJiYKLQkJKHVuc2lnbmVkIGludCkobWVtICsgY291bnQpIDw9IEwxX0NPREVfU1RBUlQgKyBMMV9DT0RFX0xFTkdUSAorCX0gZWxzZSBpZiAoKGNwdSA9PSAwICYmIElOX01FTShtZW0sIGNvdW50LCBMMV9DT0RFX1NUQVJULCBMMV9DT0RFX0xFTkdUSCkpCiAjaWZkZWYgQ09ORklHX1NNUAotCQl8fCBjcHUgPT0gMSAmJiAodW5zaWduZWQgaW50KW1lbSA+PSBDT1JFQl9MMV9DT0RFX1NUQVJUICYmCi0JCSh1bnNpZ25lZCBpbnQpKG1lbSArIGNvdW50KSA8PQotCQlDT1JFQl9MMV9DT0RFX1NUQVJUICsgTDFfQ09ERV9MRU5HVEgKKwkJfHwgKGNwdSA9PSAxICYmIElOX01FTShtZW0sIGNvdW50LCBDT1JFQl9MMV9DT0RFX1NUQVJULCBMMV9DT0RFX0xFTkdUSCkpCiAjZW5kaWYKIAkJKSB7CiAJCS8qIGFjY2VzcyBMMSBpbnN0cnVjdGlvbiBTUkFNKi8KQEAgLTY1OCwxMiArNjIzLDkgQEAKIAkJZGVmYXVsdDoKIAkJCXJldHVybiBFRkFVTFQ7CiAJCX0KLQl9IGVsc2UgaWYgKGNwdSA9PSAwICYmICh1bnNpZ25lZCBpbnQpbWVtID49IEwxX0NPREVfU1RBUlQgJiYKLQkJKHVuc2lnbmVkIGludCkobWVtICsgY291bnQpIDwgTDFfQ09ERV9TVEFSVCArIEwxX0NPREVfTEVOR1RICisJfSBlbHNlIGlmICgoY3B1ID09IDAgJiYgSU5fTUVNKG1lbSwgY291bnQsIEwxX0NPREVfU1RBUlQsIEwxX0NPREVfTEVOR1RIKSkKICNpZmRlZiBDT05GSUdfU01QCi0JCXx8IGNwdSA9PSAxICYmICh1bnNpZ25lZCBpbnQpbWVtID49IENPUkVCX0wxX0NPREVfU1RBUlQgJiYKLQkJKHVuc2lnbmVkIGludCkobWVtICsgY291bnQpIDw9Ci0JCUNPUkVCX0wxX0NPREVfU1RBUlQgKyBMMV9DT0RFX0xFTkdUSAorCQl8fCAoY3B1ID09IDEgJiYgSU5fTUVNKG1lbSwgY291bnQsIENPUkVCX0wxX0NPREVfU1RBUlQsIEwxX0NPREVfTEVOR1RIKSkKICNlbmRpZgogCQkpIHsKIAkJLyogYWNjZXNzIEwxIGluc3RydWN0aW9uIFNSQU0gKi8KQEAgLTcyMywxMiArNjg1LDkgQEAKIAkJZGVmYXVsdDoKIAkJCXJldHVybiBFRkFVTFQ7CiAJCX0KLQl9IGVsc2UgaWYgKGNwdSA9PSAwICYmICh1bnNpZ25lZCBpbnQpbWVtID49IEwxX0NPREVfU1RBUlQgJiYKLQkJKHVuc2lnbmVkIGludCkobWVtICsgY291bnQpIDw9IEwxX0NPREVfU1RBUlQgKyBMMV9DT0RFX0xFTkdUSAorCX0gZWxzZSBpZiAoKGNwdSA9PSAwICYmIElOX01FTShtZW0sIGNvdW50LCBMMV9DT0RFX1NUQVJULCBMMV9DT0RFX0xFTkdUSCkpCiAjaWZkZWYgQ09ORklHX1NNUAotCQl8fCBjcHUgPT0gMSAmJiAodW5zaWduZWQgaW50KW1lbSA+PSBDT1JFQl9MMV9DT0RFX1NUQVJUICYmCi0JCSh1bnNpZ25lZCBpbnQpKG1lbSArIGNvdW50KSA8PQotCQlDT1JFQl9MMV9DT0RFX1NUQVJUICsgTDFfQ09ERV9MRU5HVEgKKwkJfHwgKGNwdSA9PSAxICYmIElOX01FTShtZW0sIGNvdW50LCBDT1JFQl9MMV9DT0RFX1NUQVJULCBMMV9DT0RFX0xFTkdUSCkpCiAjZW5kaWYKIAkJKSB7CiAJCS8qIGFjY2VzcyBMMSBpbnN0cnVjdGlvbiBTUkFNICovCkBAIC03NDUsMjQgKzcwNCwxNiBAQAogCiAJaWYgKGFkZHIgPj0gMHgxMDAwICYmIChhZGRyICsgQlJFQUtfSU5TVFJfU0laRSkgPD0gcGh5c2ljYWxfbWVtX2VuZCkKIAkJcmV0dXJuIDA7Ci0JaWYgKGFkZHIgPj0gQVNZTkNfQkFOSzBfQkFTRQotCSAgICYmIGFkZHIgKyBCUkVBS19JTlNUUl9TSVpFIDw9IEFTWU5DX0JBTkszX0JBU0UgKyBBU1lOQ19CQU5LM19CQVNFKQorCWlmIChJTl9NRU0oYWRkciwgQlJFQUtfSU5TVFJfU0laRSwgQVNZTkNfQkFOSzBfQkFTRSwgQVNZTkNfQkFOS19TSVpFKSkKIAkJcmV0dXJuIDA7Ci0jaWYgTDFfQ09ERV9MRU5HVEggIT0gMAotCWlmIChjcHUgPT0gMCAmJiBhZGRyID49IEwxX0NPREVfU1RBUlQKLQkgICAmJiBhZGRyICsgQlJFQUtfSU5TVFJfU0laRSA8PSBMMV9DT0RFX1NUQVJUICsgTDFfQ09ERV9MRU5HVEgpCisJaWYgKGNwdSA9PSAwICYmIElOX01FTShhZGRyLCBCUkVBS19JTlNUUl9TSVpFLCBMMV9DT0RFX1NUQVJULCBMMV9DT0RFX0xFTkdUSCkpCiAJCXJldHVybiAwOwotIyBpZmRlZiBDT05GSUdfU01QCi0JZWxzZSBpZiAoY3B1ID09IDEgJiYgYWRkciA+PSBDT1JFQl9MMV9DT0RFX1NUQVJUCi0JICAgJiYgYWRkciArIEJSRUFLX0lOU1RSX1NJWkUgPD0gQ09SRUJfTDFfQ09ERV9TVEFSVCArIEwxX0NPREVfTEVOR1RIKQotCQlyZXR1cm4gMDsKLSMgZW5kaWYKLSNlbmRpZgotI2lmIEwyX0xFTkdUSCAhPSAwCi0JaWYgKGFkZHIgPj0gTDJfU1RBUlQKLQkgICAmJiBhZGRyICsgQlJFQUtfSU5TVFJfU0laRSA8PSBMMl9TVEFSVCArIEwyX0xFTkdUSCkKKyNpZmRlZiBDT05GSUdfU01QCisJZWxzZSBpZiAoY3B1ID09IDEgJiYgSU5fTUVNKGFkZHIsIEJSRUFLX0lOU1RSX1NJWkUsIENPUkVCX0wxX0NPREVfU1RBUlQsIEwxX0NPREVfTEVOR1RIKSkKIAkJcmV0dXJuIDA7CiAjZW5kaWYKKwlpZiAoSU5fTUVNKGFkZHIsIEJSRUFLX0lOU1RSX1NJWkUsIEwyX1NUQVJULCBMMl9MRU5HVEgpKQorCQlyZXR1cm4gMDsKIAogCXJldHVybiBFRkFVTFQ7CiB9CkBAIC03NzIsMTMgKzcyMyw5IEBACiAJaW50IGVycjsKIAlpbnQgY3B1ID0gcmF3X3NtcF9wcm9jZXNzb3JfaWQoKTsKIAotCWlmICgoY3B1ID09IDAgJiYgKHVuc2lnbmVkIGludClhZGRyID49IEwxX0NPREVfU1RBUlQKLQkJJiYgKHVuc2lnbmVkIGludCkoYWRkciArIEJSRUFLX0lOU1RSX1NJWkUpCi0JCTwgTDFfQ09ERV9TVEFSVCArIEwxX0NPREVfTEVOR1RIKQorCWlmICgoY3B1ID09IDAgJiYgSU5fTUVNKGFkZHIsIEJSRUFLX0lOU1RSX1NJWkUsIEwxX0NPREVfU1RBUlQsIEwxX0NPREVfTEVOR1RIKSkKICNpZmRlZiBDT05GSUdfU01QCi0JCXx8IChjcHUgPT0gMSAmJiAodW5zaWduZWQgaW50KWFkZHIgPj0gQ09SRUJfTDFfQ09ERV9TVEFSVAotCQkmJiAodW5zaWduZWQgaW50KShhZGRyICsgQlJFQUtfSU5TVFJfU0laRSkKLQkJPCBDT1JFQl9MMV9DT0RFX1NUQVJUICsgTDFfQ09ERV9MRU5HVEgpCisJCXx8IChjcHUgPT0gMSAmJiBJTl9NRU0oYWRkciwgQlJFQUtfSU5TVFJfU0laRSwgQ09SRUJfTDFfQ09ERV9TVEFSVCwgTDFfQ09ERV9MRU5HVEgpKQogI2VuZGlmCiAJCSkgewogCQkvKiBhY2Nlc3MgTDEgaW5zdHJ1Y3Rpb24gU1JBTSAqLwpAQCAtODA0LDkgKzc1MSw3IEBACiAKIGludCBrZ2RiX2FyY2hfcmVtb3ZlX2JyZWFrcG9pbnQodW5zaWduZWQgbG9uZyBhZGRyLCBjaGFyICpidW5kbGUpCiB7Ci0JaWYgKCh1bnNpZ25lZCBpbnQpYWRkciA+PSBMMV9DT0RFX1NUQVJUICYmCi0JCSh1bnNpZ25lZCBpbnQpKGFkZHIgKyBCUkVBS19JTlNUUl9TSVpFKSA8Ci0JCQlMMV9DT0RFX1NUQVJUICsgTDFfQ09ERV9MRU5HVEgpIHsKKwlpZiAoSU5fTUVNKGFkZHIsIEJSRUFLX0lOU1RSX1NJWkUsIEwxX0NPREVfU1RBUlQsIEwxX0NPREVfTEVOR1RIKSkgewogCQkvKiBhY2Nlc3MgTDEgaW5zdHJ1Y3Rpb24gU1JBTSAqLwogCQlpZiAoZG1hX21lbWNweSgodm9pZCAqKWFkZHIsIGJ1bmRsZSwgQlJFQUtfSU5TVFJfU0laRSkgPT0gTlVMTCkKIAkJCXJldHVybiAtRUZBVUxUOwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9rZXJuZWwva2dkYl90ZXN0LmMgYi9hcmNoL2JsYWNrZmluL2tlcm5lbC9rZ2RiX3Rlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZGJhOWMxCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9ibGFja2Zpbi9rZXJuZWwva2dkYl90ZXN0LmMKQEAgLTAsMCArMSwxMjMgQEAKKy8qCisgKiBhcmNoL2JsYWNrZmluL2tlcm5lbC9rZ2RiX3Rlc3QuYyAtIEJsYWNrZmluIGtnZGIgdGVzdHMKKyAqCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA4IEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisKKyNpbmNsdWRlIDxhc20vY3VycmVudC5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorCisjaW5jbHVkZSA8YXNtL2JsYWNrZmluLmg+CisKK3N0YXRpYyBjaGFyIGNtZGxpbmVbMjU2XTsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGxlbjsKKworc3RhdGljIGludCBudW0xIF9fYXR0cmlidXRlX18oKGwxX2RhdGEpKTsKKwordm9pZCBrZ2RiX2wxX3Rlc3Qodm9pZCkgX19hdHRyaWJ1dGVfXygobDFfdGV4dCkpOworCit2b2lkIGtnZGJfbDFfdGVzdCh2b2lkKQoreworCXByaW50ayhLRVJOX0FMRVJUICJMMShiZWZvcmUgY2hhbmdlKSA6IGRhdGEgdmFyaWFibGUgYWRkciA9IDB4JXAsIGRhdGEgdmFsdWUgaXMgJWRcbiIsICZudW0xLCBudW0xKTsKKwlwcmludGsoS0VSTl9BTEVSVCAiTDEgOiBjb2RlIGZ1bmN0aW9uIGFkZHIgPSAweCVwXG4iLCBrZ2RiX2wxX3Rlc3QpOworCW51bTEgPSBudW0xICsgMTAgOworCXByaW50ayhLRVJOX0FMRVJUICJMMShhZnRlciBjaGFuZ2UpIDogZGF0YSB2YXJpYWJsZSBhZGRyID0gMHglcCwgZGF0YSB2YWx1ZSBpcyAlZFxuIiwgJm51bTEsIG51bTEpOworCXJldHVybiA7Cit9CisjaWYgTDJfTEVOR1RICisKK3N0YXRpYyBpbnQgbnVtMiBfX2F0dHJpYnV0ZV9fKChsMikpOwordm9pZCBrZ2RiX2wyX3Rlc3Qodm9pZCkgX19hdHRyaWJ1dGVfXygobDIpKTsKKwordm9pZCBrZ2RiX2wyX3Rlc3Qodm9pZCkKK3sKKwlwcmludGsoS0VSTl9BTEVSVCAiTDIoYmVmb3JlIGNoYW5nZSkgOiBkYXRhIHZhcmlhYmxlIGFkZHIgPSAweCVwLCBkYXRhIHZhbHVlIGlzICVkXG4iLCAmbnVtMiwgbnVtMik7CisJcHJpbnRrKEtFUk5fQUxFUlQgIkwyIDogY29kZSBmdW5jdGlvbiBhZGRyID0gMHglcFxuIiwga2dkYl9sMl90ZXN0KTsKKwludW0yID0gbnVtMiArIDIwIDsKKwlwcmludGsoS0VSTl9BTEVSVCAiTDIoYWZ0ZXIgY2hhbmdlKSA6IGRhdGEgdmFyaWFibGUgYWRkciA9IDB4JXAsIGRhdGEgdmFsdWUgaXMgJWRcbiIsICZudW0yLCBudW0yKTsKKwlyZXR1cm4gOworfQorCisjZW5kaWYKKworCitpbnQga2dkYl90ZXN0KGNoYXIgKm5hbWUsIGludCBsZW4sIGludCBjb3VudCwgaW50IHopCit7CisJcHJpbnRrKEtFUk5fREVCVUcgImtnZGIgbmFtZSglZCk6ICVzLCAlZCwgJWRcbiIsIGxlbiwgbmFtZSwgY291bnQsIHopOworCWNvdW50ID0gejsKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBpbnQgdGVzdF9wcm9jX291dHB1dChjaGFyICpidWYpCit7CisJa2dkYl90ZXN0KCJoZWxsbyB3b3JsZCEiLCAxMiwgMHg1NSwgMHgxMCk7CisJa2dkYl9sMV90ZXN0KCk7CisJI2lmIEwyX0xFTkdUSAorCWtnZGJfbDJfdGVzdCgpOworCSNlbmRpZgorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGVzdF9yZWFkX3Byb2MoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmYsCisJCQkJIGludCBjb3VudCwgaW50ICplb2YsIHZvaWQgKmRhdGEpCit7CisJaW50IGxlbjsKKworCWxlbiA9IHRlc3RfcHJvY19vdXRwdXQocGFnZSk7CisJaWYgKGxlbiA8PSBvZmYrY291bnQpCisJCSplb2YgPSAxOworCSpzdGFydCA9IHBhZ2UgKyBvZmY7CisJbGVuIC09IG9mZjsKKwlpZiAobGVuID4gY291bnQpCisJCWxlbiA9IGNvdW50OworCWlmIChsZW4gPCAwKQorCQlsZW4gPSAwOworCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyBpbnQgdGVzdF93cml0ZV9wcm9jKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyICpidWZmZXIsCisJCQkJIHVuc2lnbmVkIGxvbmcgY291bnQsIHZvaWQgKmRhdGEpCit7CisJaWYgKGNvdW50ID49IDI1NikKKwkJbGVuID0gMjU1OworCWVsc2UKKwkJbGVuID0gY291bnQ7CisKKwltZW1jcHkoY21kbGluZSwgYnVmZmVyLCBjb3VudCk7CisJY21kbGluZVtsZW5dID0gMDsKKworCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGtnZGJ0ZXN0X2luaXQodm9pZCkKK3sKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmVudHJ5OworCisJZW50cnkgPSBjcmVhdGVfcHJvY19lbnRyeSgia2dkYnRlc3QiLCAwLCBOVUxMKTsKKwlpZiAoZW50cnkgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwllbnRyeS0+cmVhZF9wcm9jID0gdGVzdF9yZWFkX3Byb2M7CisJZW50cnktPndyaXRlX3Byb2MgPSB0ZXN0X3dyaXRlX3Byb2M7CisJZW50cnktPmRhdGEgPSBOVUxMOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBrZ2RidGVzdF9leGl0KHZvaWQpCit7CisJcmVtb3ZlX3Byb2NfZW50cnkoImtnZGJ0ZXN0IiwgTlVMTCk7Cit9CisKK21vZHVsZV9pbml0KGtnZGJ0ZXN0X2luaXQpOworbW9kdWxlX2V4aXQoa2dkYnRlc3RfZXhpdCk7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2tlcm5lbC9tY291bnQuUyBiL2FyY2gvYmxhY2tmaW4va2VybmVsL21jb3VudC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkY2ZiMzgKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2JsYWNrZmluL2tlcm5lbC9tY291bnQuUwpAQCAtMCwwICsxLDcwIEBACisvKgorICogbGludXgvYXJjaC9ibGFja2Zpbi9tY291bnQuUworICoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKgorICogMjAwNy8wNC8xMiBTYXZlIGluZGV4LCBsZW5ndGgsIG1vZGlmeSBhbmQgYmFzZSByZWdpc3RlcnMuIC0tcnBtCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KKyNpbmNsdWRlIDxhc20vYmxhY2tmaW4uaD4KKworLnRleHQKKworLmFsaWduIDQgCS8qIGp1c3QgaW4gY2FzZSAqLworCitFTlRSWShfX21jb3VudCkKKwlbLS1zcF0gPSBpMDsKKwlbLS1zcF0gPSBpMTsKKwlbLS1zcF0gPSBpMjsKKwlbLS1zcF0gPSBpMzsKKwlbLS1zcF0gPSBsMDsKKwlbLS1zcF0gPSBsMTsKKwlbLS1zcF0gPSBsMjsKKwlbLS1zcF0gPSBsMzsKKwlbLS1zcF0gPSBtMDsKKwlbLS1zcF0gPSBtMTsKKwlbLS1zcF0gPSBtMjsKKwlbLS1zcF0gPSBtMzsKKwlbLS1zcF0gPSBiMDsKKwlbLS1zcF0gPSBiMTsKKwlbLS1zcF0gPSBiMjsKKwlbLS1zcF0gPSBiMzsKKwlbLS1zcF0gPSAoIHI3OjAsIHA1OjAgKTsKKwlbLS1zcF0gPSBBU1RBVDsKKworCXAxLkwgPSBfaXBpcGVfdHJhY2VfZW5hYmxlOworCXAxLkggPSBfaXBpcGVfdHJhY2VfZW5hYmxlOworCXI3ID0gW3AxXTsKKwlDQyA9IHI3ID09IDA7CisJaWYgQ0MganVtcCBvdXQ7CisJbGluayAweDEwOworCXIwID0gMHgwOworCVtzcCArIDB4Y10gPSByMDsgLyogdiAqLworCXIwID0gMHgwOwkvKiB0eXBlOiBJUElQRV9UUkFDRV9GTiAqLworCXIxID0gcmV0czsKKwlwMCA9IFtmcF07CS8qIHAwOiBQcmlvciBGUCAqLworCXIyID0gW3AwICsgNF07CS8qIHIyOiBQcmlvciBSRVRTICovCisJY2FsbCBfX19pcGlwZV90cmFjZTsKKwl1bmxpbms7CitvdXQ6CisJQVNUQVQgPSBbc3ArK107CisJKCByNzowLCBwNTowICkgPSBbc3ArK107CisJYjMgPSBbc3ArK107CisJYjIgPSBbc3ArK107CisJYjEgPSBbc3ArK107CisJYjAgPSBbc3ArK107CisJbTMgPSBbc3ArK107CisJbTIgPSBbc3ArK107CisJbTEgPSBbc3ArK107CisJbTAgPSBbc3ArK107CisJbDMgPSBbc3ArK107CisJbDIgPSBbc3ArK107CisJbDEgPSBbc3ArK107CisJbDAgPSBbc3ArK107CisJaTMgPSBbc3ArK107CisJaTIgPSBbc3ArK107CisJaTEgPSBbc3ArK107CisJaTAgPSBbc3ArK107CisJcnRzOworRU5EUFJPQyhfX21jb3VudCkKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4va2VybmVsL21vZHVsZS5jIGIvYXJjaC9ibGFja2Zpbi9rZXJuZWwvbW9kdWxlLmMKaW5kZXggZTFiZWJjOC4uMWJkN2YyZCAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9rZXJuZWwvbW9kdWxlLmMKKysrIGIvYXJjaC9ibGFja2Zpbi9rZXJuZWwvbW9kdWxlLmMKQEAgLTM3LDExMSArMzcsNiBAQAogI2luY2x1ZGUgPGFzbS9kbWEuaD4KICNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgogCi0vKgotICogaGFuZGxlIGFyaXRobWV0aWMgcmVsb2NhdGlvbnMuCi0gKiBTZWUgYmludXRpbHMvYmZkL2VsZjMyLWJmaW4uYyBmb3IgbW9yZSBkZXRhaWxzCi0gKi8KLSNkZWZpbmUgUkVMT0NfU1RBQ0tfU0laRSAxMDAKLXN0YXRpYyB1aW50MzJfdCByZWxvY19zdGFja1tSRUxPQ19TVEFDS19TSVpFXTsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgcmVsb2Nfc3RhY2tfdG9zOwotCi0jZGVmaW5lIGlzX3JlbG9jX3N0YWNrX2VtcHR5KCkgKChyZWxvY19zdGFja190b3MgPiAwKT8wOjEpCi0KLXN0YXRpYyB2b2lkIHJlbG9jX3N0YWNrX3B1c2godWludDMyX3QgdmFsdWUpCi17Ci0JcmVsb2Nfc3RhY2tbcmVsb2Nfc3RhY2tfdG9zKytdID0gdmFsdWU7Ci19Ci0KLXN0YXRpYyB1aW50MzJfdCByZWxvY19zdGFja19wb3Aodm9pZCkKLXsKLQlyZXR1cm4gcmVsb2Nfc3RhY2tbLS1yZWxvY19zdGFja190b3NdOwotfQotCi1zdGF0aWMgdWludDMyX3QgcmVsb2Nfc3RhY2tfb3BlcmF0ZSh1bnNpZ25lZCBpbnQgb3Blciwgc3RydWN0IG1vZHVsZSAqbW9kKQotewotCXVpbnQzMl90IHZhbHVlOwotCi0Jc3dpdGNoIChvcGVyKSB7Ci0JY2FzZSBSX2FkZDoKLQkJdmFsdWUgPSByZWxvY19zdGFja1tyZWxvY19zdGFja190b3MgLSAyXSArCi0JCQlyZWxvY19zdGFja1tyZWxvY19zdGFja190b3MgLSAxXTsKLQkJcmVsb2Nfc3RhY2tfdG9zIC09IDI7Ci0JCWJyZWFrOwotCWNhc2UgUl9zdWI6Ci0JCXZhbHVlID0gcmVsb2Nfc3RhY2tbcmVsb2Nfc3RhY2tfdG9zIC0gMl0gLQotCQkJcmVsb2Nfc3RhY2tbcmVsb2Nfc3RhY2tfdG9zIC0gMV07Ci0JCXJlbG9jX3N0YWNrX3RvcyAtPSAyOwotCQlicmVhazsKLQljYXNlIFJfbXVsdDoKLQkJdmFsdWUgPSByZWxvY19zdGFja1tyZWxvY19zdGFja190b3MgLSAyXSAqCi0JCQlyZWxvY19zdGFja1tyZWxvY19zdGFja190b3MgLSAxXTsKLQkJcmVsb2Nfc3RhY2tfdG9zIC09IDI7Ci0JCWJyZWFrOwotCWNhc2UgUl9kaXY6Ci0JCXZhbHVlID0gcmVsb2Nfc3RhY2tbcmVsb2Nfc3RhY2tfdG9zIC0gMl0gLwotCQkJcmVsb2Nfc3RhY2tbcmVsb2Nfc3RhY2tfdG9zIC0gMV07Ci0JCXJlbG9jX3N0YWNrX3RvcyAtPSAyOwotCQlicmVhazsKLQljYXNlIFJfbW9kOgotCQl2YWx1ZSA9IHJlbG9jX3N0YWNrW3JlbG9jX3N0YWNrX3RvcyAtIDJdICUKLQkJCXJlbG9jX3N0YWNrW3JlbG9jX3N0YWNrX3RvcyAtIDFdOwotCQlyZWxvY19zdGFja190b3MgLT0gMjsKLQkJYnJlYWs7Ci0JY2FzZSBSX2xzaGlmdDoKLQkJdmFsdWUgPSByZWxvY19zdGFja1tyZWxvY19zdGFja190b3MgLSAyXSA8PAotCQkJcmVsb2Nfc3RhY2tbcmVsb2Nfc3RhY2tfdG9zIC0gMV07Ci0JCXJlbG9jX3N0YWNrX3RvcyAtPSAyOwotCQlicmVhazsKLQljYXNlIFJfcnNoaWZ0OgotCQl2YWx1ZSA9IHJlbG9jX3N0YWNrW3JlbG9jX3N0YWNrX3RvcyAtIDJdID4+Ci0JCQlyZWxvY19zdGFja1tyZWxvY19zdGFja190b3MgLSAxXTsKLQkJcmVsb2Nfc3RhY2tfdG9zIC09IDI7Ci0JCWJyZWFrOwotCWNhc2UgUl9hbmQ6Ci0JCXZhbHVlID0gcmVsb2Nfc3RhY2tbcmVsb2Nfc3RhY2tfdG9zIC0gMl0gJgotCQkJcmVsb2Nfc3RhY2tbcmVsb2Nfc3RhY2tfdG9zIC0gMV07Ci0JCXJlbG9jX3N0YWNrX3RvcyAtPSAyOwotCQlicmVhazsKLQljYXNlIFJfb3I6Ci0JCXZhbHVlID0gcmVsb2Nfc3RhY2tbcmVsb2Nfc3RhY2tfdG9zIC0gMl0gfAotCQkJcmVsb2Nfc3RhY2tbcmVsb2Nfc3RhY2tfdG9zIC0gMV07Ci0JCXJlbG9jX3N0YWNrX3RvcyAtPSAyOwotCQlicmVhazsKLQljYXNlIFJfeG9yOgotCQl2YWx1ZSA9IHJlbG9jX3N0YWNrW3JlbG9jX3N0YWNrX3RvcyAtIDJdIF4KLQkJCXJlbG9jX3N0YWNrW3JlbG9jX3N0YWNrX3RvcyAtIDFdOwotCQlyZWxvY19zdGFja190b3MgLT0gMjsKLQkJYnJlYWs7Ci0JY2FzZSBSX2xhbmQ6Ci0JCXZhbHVlID0gcmVsb2Nfc3RhY2tbcmVsb2Nfc3RhY2tfdG9zIC0gMl0gJiYKLQkJCXJlbG9jX3N0YWNrW3JlbG9jX3N0YWNrX3RvcyAtIDFdOwotCQlyZWxvY19zdGFja190b3MgLT0gMjsKLQkJYnJlYWs7Ci0JY2FzZSBSX2xvcjoKLQkJdmFsdWUgPSByZWxvY19zdGFja1tyZWxvY19zdGFja190b3MgLSAyXSB8fAotCQkJcmVsb2Nfc3RhY2tbcmVsb2Nfc3RhY2tfdG9zIC0gMV07Ci0JCXJlbG9jX3N0YWNrX3RvcyAtPSAyOwotCQlicmVhazsKLQljYXNlIFJfbmVnOgotCQl2YWx1ZSA9IC1yZWxvY19zdGFja1tyZWxvY19zdGFja190b3MgLSAxXTsKLQkJcmVsb2Nfc3RhY2tfdG9zLS07Ci0JCWJyZWFrOwotCWNhc2UgUl9jb21wOgotCQl2YWx1ZSA9IH5yZWxvY19zdGFja1tyZWxvY19zdGFja190b3MgLSAxXTsKLQkJcmVsb2Nfc3RhY2tfdG9zIC09IDE7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIm1vZHVsZSAlczogdW5oYW5kbGVkIHJlbG9jdGlvblxuIiwKLQkJCQltb2QtPm5hbWUpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQkvKiBub3cgcHVzaCB0aGUgbmV3IHZhbHVlIGJhY2sgb24gc3RhY2sgKi8KLQlyZWxvY19zdGFja19wdXNoKHZhbHVlKTsKLQotCXJldHVybiB2YWx1ZTsKLX0KLQogdm9pZCAqbW9kdWxlX2FsbG9jKHVuc2lnbmVkIGxvbmcgc2l6ZSkKIHsKIAlpZiAoc2l6ZSA9PSAwKQpAQCAtMzM0LDE2ICsyMjksMTggQEAKIAkJICAgdW5kZWZpbmVkIHN5bWJvbHMgaGF2ZSBiZWVuIHJlc29sdmVkLiAqLwogCQlzeW0gPSAoRWxmMzJfU3ltICopIHNlY2hkcnNbc3ltaW5kZXhdLnNoX2FkZHIKIAkJICAgICsgRUxGMzJfUl9TWU0ocmVsW2ldLnJfaW5mbyk7Ci0JCWlmIChpc19yZWxvY19zdGFja19lbXB0eSgpKSB7Ci0JCQl2YWx1ZSA9IHN5bS0+c3RfdmFsdWU7Ci0JCX0gZWxzZSB7Ci0JCQl2YWx1ZSA9IHJlbG9jX3N0YWNrX3BvcCgpOwotCQl9CisJCXZhbHVlID0gc3ltLT5zdF92YWx1ZTsKIAkJdmFsdWUgKz0gcmVsW2ldLnJfYWRkZW5kOwogCQlwcl9kZWJ1ZygibG9jYXRpb24gaXMgJXgsIHZhbHVlIGlzICV4IHR5cGUgaXMgJWQgXG4iLAogCQkJICh1bnNpZ25lZCBpbnQpIGxvY2F0aW9uMzIsIHZhbHVlLAogCQkJIEVMRjMyX1JfVFlQRShyZWxbaV0ucl9pbmZvKSk7Ci0KKyNpZmRlZiBDT05GSUdfU01QCisJCWlmICgodW5zaWduZWQgbG9uZylsb2NhdGlvbjE2ID49IENPUkVCX0wxX0RBVEFfQV9TVEFSVCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJtb2R1bGUgJXM6IGNhbm5vdCByZWxvY2F0ZSBpbiBMMTogJXUgKFNNUCBrZXJuZWwpIiwKKwkJCQkgICAgICAgbW9kLT5uYW1lLCBFTEYzMl9SX1RZUEUocmVsW2ldLnJfaW5mbykpOworCQkJcmV0dXJuIC1FTk9FWEVDOworCQl9CisjZW5kaWYKIAkJc3dpdGNoIChFTEYzMl9SX1RZUEUocmVsW2ldLnJfaW5mbykpIHsKIAogCQljYXNlIFJfcGNyZWwyNDoKQEAgLTM1NSw2ICsyNTIsMTIgQEAKIAkJCWxvY2F0aW9uMzIgPSAodWludDMyX3QgKikgbG9jYXRpb24xNjsKIAkJCXZhbHVlIC09ICh1aW50MzJfdCkgbG9jYXRpb24zMjsKIAkJCXZhbHVlID4+PSAxOworCQkJaWYgKCh2YWx1ZSAmIDB4RkYwMDAwMDApICE9IDAgJiYKKwkJCSAgICAodmFsdWUgJiAweEZGMDAwMDAwKSAhPSAweEZGMDAwMDAwKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSICJtb2R1bGUgJXM6IHJlbG9jYXRpb24gb3ZlcmZsb3dcbiIsCisJCQkJICAgICAgIG1vZC0+bmFtZSk7CisJCQkJcmV0dXJuIC1FTk9FWEVDOworCQkJfQogCQkJcHJfZGVidWcoInZhbHVlIGlzICV4LCBiZWZvcmUgJXgtJXggYWZ0ZXIgJXgtJXhcbiIsIHZhbHVlLAogCQkJICAgICAgICpsb2NhdGlvbjE2LCAqKGxvY2F0aW9uMTYgKyAxKSwKIAkJCSAgICAgICAoKmxvY2F0aW9uMTYgJiAweGZmMDApIHwgKHZhbHVlID4+IDE2ICYgMHgwMGZmKSwKQEAgLTM5OSwyOCArMzAyLDYgQEAKIAkJCXByX2RlYnVnKCJiZWZvcmUgJXggYWZ0ZXIgJXhcbiIsICpsb2NhdGlvbjMyLCB2YWx1ZSk7CiAJCQkqbG9jYXRpb24zMiA9IHZhbHVlOwogCQkJYnJlYWs7Ci0JCWNhc2UgUl9wdXNoOgotCQkJcmVsb2Nfc3RhY2tfcHVzaCh2YWx1ZSk7Ci0JCQlicmVhazsKLQkJY2FzZSBSX2NvbnN0OgotCQkJcmVsb2Nfc3RhY2tfcHVzaChyZWxbaV0ucl9hZGRlbmQpOwotCQkJYnJlYWs7Ci0JCWNhc2UgUl9hZGQ6Ci0JCWNhc2UgUl9zdWI6Ci0JCWNhc2UgUl9tdWx0OgotCQljYXNlIFJfZGl2OgotCQljYXNlIFJfbW9kOgotCQljYXNlIFJfbHNoaWZ0OgotCQljYXNlIFJfcnNoaWZ0OgotCQljYXNlIFJfYW5kOgotCQljYXNlIFJfb3I6Ci0JCWNhc2UgUl94b3I6Ci0JCWNhc2UgUl9sYW5kOgotCQljYXNlIFJfbG9yOgotCQljYXNlIFJfbmVnOgotCQljYXNlIFJfY29tcDoKLQkJCXJlbG9jX3N0YWNrX29wZXJhdGUoRUxGMzJfUl9UWVBFKHJlbFtpXS5yX2luZm8pLCBtb2QpOwotCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQlwcmludGsoS0VSTl9FUlIgIm1vZHVsZSAlczogVW5rbm93biByZWxvY2F0aW9uOiAldVxuIiwKIAkJCSAgICAgICBtb2QtPm5hbWUsIEVMRjMyX1JfVFlQRShyZWxbaV0ucl9pbmZvKSk7CkBAIC00MzYsNiArMzE3LDcgQEAKIHsKIAl1bnNpZ25lZCBpbnQgaSwgc3RyaW5kZXggPSAwLCBzeW1pbmRleCA9IDA7CiAJY2hhciAqc2Vjc3RyaW5nczsKKwlsb25nIGVyciA9IDA7CiAKIAlzZWNzdHJpbmdzID0gKHZvaWQgKiloZHIgKyBzZWNoZHJzW2hkci0+ZV9zaHN0cm5keF0uc2hfb2Zmc2V0OwogCkBAIC00NjAsOCArMzQyLDEwIEBACiAJCSAgICAoc3RyY21wKCIucmVsYS5sMS50ZXh0Iiwgc2Vjc3RyaW5ncyArIHNlY2hkcnNbaV0uc2hfbmFtZSkgPT0gMCkgfHwKIAkJICAgICgoc3RyY21wKCIucmVsYS50ZXh0Iiwgc2Vjc3RyaW5ncyArIHNlY2hkcnNbaV0uc2hfbmFtZSkgPT0gMCkgJiYKIAkJCShoZHItPmVfZmxhZ3MgJiAoRUZfQkZJTl9DT0RFX0lOX0wxfEVGX0JGSU5fQ09ERV9JTl9MMikpKSkpIHsKLQkJCWFwcGx5X3JlbG9jYXRlX2FkZCgoRWxmX1NoZHIgKikgc2VjaGRycywgc3RydGFiLAorCQkJZXJyID0gYXBwbHlfcmVsb2NhdGVfYWRkKChFbGZfU2hkciAqKSBzZWNoZHJzLCBzdHJ0YWIsCiAJCQkJCSAgIHN5bWluZGV4LCBpLCBtb2QpOworCQkJaWYgKGVyciA8IDApCisJCQkJcmV0dXJuIC1FTk9FWEVDOwogCQl9CiAJfQogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9rZXJuZWwvcHJvY2Vzcy5jIGIvYXJjaC9ibGFja2Zpbi9rZXJuZWwvcHJvY2Vzcy5jCmluZGV4IDBjM2VhMTEuLjMzZTJlODkgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4va2VybmVsL3Byb2Nlc3MuYworKysgYi9hcmNoL2JsYWNrZmluL2tlcm5lbC9wcm9jZXNzLmMKQEAgLTM5LDYgKzM5LDcgQEAKIAogI2luY2x1ZGUgPGFzbS9ibGFja2Zpbi5oPgogI2luY2x1ZGUgPGFzbS9maXhlZF9jb2RlLmg+CisjaW5jbHVkZSA8YXNtL21lbV9tYXAuaD4KIAogYXNtbGlua2FnZSB2b2lkIHJldF9mcm9tX2Zvcmsodm9pZCk7CiAKQEAgLTgxLDExICs4MiwxNCBAQAogICovCiBzdGF0aWMgdm9pZCBkZWZhdWx0X2lkbGUodm9pZCkKIHsKLQlsb2NhbF9pcnFfZGlzYWJsZSgpOworI2lmZGVmIENPTkZJR19JUElQRQorCWlwaXBlX3N1c3BlbmRfZG9tYWluKCk7CisjZW5kaWYKKwlsb2NhbF9pcnFfZGlzYWJsZV9odygpOwogCWlmICghbmVlZF9yZXNjaGVkKCkpCiAJCWlkbGVfd2l0aF9pcnFfZGlzYWJsZWQoKTsKIAotCWxvY2FsX2lycV9lbmFibGUoKTsKKwlsb2NhbF9pcnFfZW5hYmxlX2h3KCk7CiB9CiAKIC8qCkBAIC0xNTQsNiArMTU4LDcgQEAKIAlyZXR1cm4gZG9fZm9yayhmbGFncyB8IENMT05FX1ZNIHwgQ0xPTkVfVU5UUkFDRUQsIDAsICZyZWdzLCAwLCBOVUxMLAogCQkgICAgICAgTlVMTCk7CiB9CitFWFBPUlRfU1lNQk9MKGtlcm5lbF90aHJlYWQpOwogCiB2b2lkIGZsdXNoX3RocmVhZCh2b2lkKQogewpAQCAtMTcwLDYgKzE3NSwxMyBAQAogCXVuc2lnbmVkIGxvbmcgY2xvbmVfZmxhZ3M7CiAJdW5zaWduZWQgbG9uZyBuZXdzcDsKIAorI2lmZGVmIF9fQVJDSF9TWU5DX0NPUkVfRENBQ0hFCisJaWYgKGN1cnJlbnQtPnJ0Lm5yX2NwdXNfYWxsb3dlZCA9PSBudW1fcG9zc2libGVfY3B1cygpKSB7CisJCWN1cnJlbnQtPmNwdXNfYWxsb3dlZCA9IGNwdW1hc2tfb2ZfY3B1KHNtcF9wcm9jZXNzb3JfaWQoKSk7CisJCWN1cnJlbnQtPnJ0Lm5yX2NwdXNfYWxsb3dlZCA9IDE7CisJfQorI2VuZGlmCisKIAkvKiBzeXNjYWxsMiBwdXRzIGNsb25lX2ZsYWdzIGluIHIwIGFuZCB1c3AgaW4gcjEgKi8KIAljbG9uZV9mbGFncyA9IHJlZ3MtPnIwOwogCW5ld3NwID0gcmVncy0+cjE7CkBAIC0zMzcsMjIgKzM0OSwyMiBAQAogCWlmIChhZGRyID49ICh1bnNpZ25lZCBsb25nKV9faW5pdF9iZWdpbiAmJgogCSAgICBhZGRyICsgc2l6ZSA8PSAodW5zaWduZWQgbG9uZylfX2luaXRfZW5kKQogCQlyZXR1cm4gMTsKLQlpZiAoYWRkciA+PSBMMV9TQ1JBVENIX1NUQVJUCi0JICAgICYmIGFkZHIgKyBzaXplIDw9IEwxX1NDUkFUQ0hfU1RBUlQgKyBMMV9TQ1JBVENIX0xFTkdUSCkKKwlpZiAoYWRkciA+PSBnZXRfbDFfc2NyYXRjaF9zdGFydCgpCisJICAgICYmIGFkZHIgKyBzaXplIDw9IGdldF9sMV9zY3JhdGNoX3N0YXJ0KCkgKyBMMV9TQ1JBVENIX0xFTkdUSCkKIAkJcmV0dXJuIDE7CiAjaWYgTDFfQ09ERV9MRU5HVEggIT0gMAotCWlmIChhZGRyID49IEwxX0NPREVfU1RBUlQgKyAoX2V0ZXh0X2wxIC0gX3N0ZXh0X2wxKQotCSAgICAmJiBhZGRyICsgc2l6ZSA8PSBMMV9DT0RFX1NUQVJUICsgTDFfQ09ERV9MRU5HVEgpCisJaWYgKGFkZHIgPj0gZ2V0X2wxX2NvZGVfc3RhcnQoKSArIChfZXRleHRfbDEgLSBfc3RleHRfbDEpCisJICAgICYmIGFkZHIgKyBzaXplIDw9IGdldF9sMV9jb2RlX3N0YXJ0KCkgKyBMMV9DT0RFX0xFTkdUSCkKIAkJcmV0dXJuIDE7CiAjZW5kaWYKICNpZiBMMV9EQVRBX0FfTEVOR1RIICE9IDAKLQlpZiAoYWRkciA+PSBMMV9EQVRBX0FfU1RBUlQgKyAoX2Vic3NfbDEgLSBfc2RhdGFfbDEpCi0JICAgICYmIGFkZHIgKyBzaXplIDw9IEwxX0RBVEFfQV9TVEFSVCArIEwxX0RBVEFfQV9MRU5HVEgpCisJaWYgKGFkZHIgPj0gZ2V0X2wxX2RhdGFfYV9zdGFydCgpICsgKF9lYnNzX2wxIC0gX3NkYXRhX2wxKQorCSAgICAmJiBhZGRyICsgc2l6ZSA8PSBnZXRfbDFfZGF0YV9hX3N0YXJ0KCkgKyBMMV9EQVRBX0FfTEVOR1RIKQogCQlyZXR1cm4gMTsKICNlbmRpZgogI2lmIEwxX0RBVEFfQl9MRU5HVEggIT0gMAotCWlmIChhZGRyID49IEwxX0RBVEFfQl9TVEFSVCArIChfZWJzc19iX2wxIC0gX3NkYXRhX2JfbDEpCi0JICAgICYmIGFkZHIgKyBzaXplIDw9IEwxX0RBVEFfQl9TVEFSVCArIEwxX0RBVEFfQl9MRU5HVEgpCisJaWYgKGFkZHIgPj0gZ2V0X2wxX2RhdGFfYl9zdGFydCgpICsgKF9lYnNzX2JfbDEgLSBfc2RhdGFfYl9sMSkKKwkgICAgJiYgYWRkciArIHNpemUgPD0gZ2V0X2wxX2RhdGFfYl9zdGFydCgpICsgTDFfREFUQV9CX0xFTkdUSCkKIAkJcmV0dXJuIDE7CiAjZW5kaWYKICNpZiBMMl9MRU5HVEggIT0gMApkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9rZXJuZWwvcHRyYWNlLmMgYi9hcmNoL2JsYWNrZmluL2tlcm5lbC9wdHJhY2UuYwppbmRleCAxNDBiZjAwLi41OTRlMzI1IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2tlcm5lbC9wdHJhY2UuYworKysgYi9hcmNoL2JsYWNrZmluL2tlcm5lbC9wdHJhY2UuYwpAQCAtNDUsNiArNDUsNyBAQAogI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgogI2luY2x1ZGUgPGFzbS9kbWEuaD4KICNpbmNsdWRlIDxhc20vZml4ZWRfY29kZS5oPgorI2luY2x1ZGUgPGFzbS9tZW1fbWFwLmg+CiAKICNkZWZpbmUgVEVYVF9PRkZTRVQgMAogLyoKQEAgLTgwLDEwICs4MSwxMiBAQAogLyoKICAqIEdldCBhbGwgdXNlciBpbnRlZ2VyIHJlZ2lzdGVycy4KICAqLwotc3RhdGljIGlubGluZSBpbnQgcHRyYWNlX2dldHJlZ3Moc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIHZvaWQgX191c2VyICogdXJlZ3MpCitzdGF0aWMgaW5saW5lIGludCBwdHJhY2VfZ2V0cmVncyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgdm9pZCBfX3VzZXIgKnVyZWdzKQogewotCXN0cnVjdCBwdF9yZWdzICpyZWdzID0gZ2V0X3VzZXJfcmVncyh0c2spOwotCXJldHVybiBjb3B5X3RvX3VzZXIodXJlZ3MsIHJlZ3MsIHNpemVvZihzdHJ1Y3QgcHRfcmVncykpID8gLUVGQVVMVCA6IDA7CisJc3RydWN0IHB0X3JlZ3MgcmVnczsKKwltZW1jcHkoJnJlZ3MsIGdldF91c2VyX3JlZ3ModHNrKSwgc2l6ZW9mKHJlZ3MpKTsKKwlyZWdzLnVzcCA9IHRzay0+dGhyZWFkLnVzcDsKKwlyZXR1cm4gY29weV90b191c2VyKHVyZWdzLCAmcmVncywgc2l6ZW9mKHN0cnVjdCBwdF9yZWdzKSkgPyAtRUZBVUxUIDogMDsKIH0KIAogLyogTWFwcGluZyBmcm9tIFBUX3h4eCB0byB0aGUgc3RhY2sgb2Zmc2V0IGF0IHdoaWNoIHRoZSByZWdpc3RlciBpcwpAQCAtMTU3LDE1ICsxNjAsMTUgQEAKIHN0YXRpYyBpbmxpbmUgaW50IGlzX3VzZXJfYWRkcl92YWxpZChzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNoaWxkLAogCQkJCSAgICAgdW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBsZW4pCiB7Ci0Jc3RydWN0IHZtX2xpc3Rfc3RydWN0ICp2bWw7CisJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWE7CiAJc3RydWN0IHNyYW1fbGlzdF9zdHJ1Y3QgKnNyYW1sOwogCiAJLyogb3ZlcmZsb3cgKi8KIAlpZiAoc3RhcnQgKyBsZW4gPCBzdGFydCkKIAkJcmV0dXJuIC1FSU87CiAKLQlmb3IgKHZtbCA9IGNoaWxkLT5tbS0+Y29udGV4dC52bWxpc3Q7IHZtbDsgdm1sID0gdm1sLT5uZXh0KQotCQlpZiAoc3RhcnQgPj0gdm1sLT52bWEtPnZtX3N0YXJ0ICYmIHN0YXJ0ICsgbGVuIDwgdm1sLT52bWEtPnZtX2VuZCkKKwl2bWEgPSBmaW5kX3ZtYShjaGlsZC0+bW0sIHN0YXJ0KTsKKwlpZiAodm1hICYmIHN0YXJ0ID49IHZtYS0+dm1fc3RhcnQgJiYgc3RhcnQgKyBsZW4gPD0gdm1hLT52bV9lbmQpCiAJCQlyZXR1cm4gMDsKIAogCWZvciAoc3JhbWwgPSBjaGlsZC0+bW0tPmNvbnRleHQuc3JhbV9saXN0OyBzcmFtbDsgc3JhbWwgPSBzcmFtbC0+bmV4dCkKQEAgLTIyMCw4ICsyMjMsOCBAQAogCQkJCWJyZWFrOwogCQkJcHJfZGVidWcoInB0cmFjZTogdXNlciBhZGRyZXNzIGlzIHZhbGlkXG4iKTsKIAotCQkJaWYgKEwxX0NPREVfTEVOR1RIICE9IDAgJiYgYWRkciA+PSBMMV9DT0RFX1NUQVJUCi0JCQkgICAgJiYgYWRkciArIHNpemVvZih0bXApIDw9IEwxX0NPREVfU1RBUlQgKyBMMV9DT0RFX0xFTkdUSCkgeworCQkJaWYgKEwxX0NPREVfTEVOR1RIICE9IDAgJiYgYWRkciA+PSBnZXRfbDFfY29kZV9zdGFydCgpCisJCQkgICAgJiYgYWRkciArIHNpemVvZih0bXApIDw9IGdldF9sMV9jb2RlX3N0YXJ0KCkgKyBMMV9DT0RFX0xFTkdUSCkgewogCQkJCXNhZmVfZG1hX21lbWNweSAoJnRtcCwgKGNvbnN0IHZvaWQgKikoYWRkciksIHNpemVvZih0bXApKTsKIAkJCQljb3BpZWQgPSBzaXplb2YodG1wKTsKIApAQCAtMzAwLDggKzMwMyw4IEBACiAJCQkJYnJlYWs7CiAJCQlwcl9kZWJ1ZygicHRyYWNlOiB1c2VyIGFkZHJlc3MgaXMgdmFsaWRcbiIpOwogCi0JCQlpZiAoTDFfQ09ERV9MRU5HVEggIT0gMCAmJiBhZGRyID49IEwxX0NPREVfU1RBUlQKLQkJCSAgICAmJiBhZGRyICsgc2l6ZW9mKGRhdGEpIDw9IEwxX0NPREVfU1RBUlQgKyBMMV9DT0RFX0xFTkdUSCkgeworCQkJaWYgKEwxX0NPREVfTEVOR1RIICE9IDAgJiYgYWRkciA+PSBnZXRfbDFfY29kZV9zdGFydCgpCisJCQkgICAgJiYgYWRkciArIHNpemVvZihkYXRhKSA8PSBnZXRfbDFfY29kZV9zdGFydCgpICsgTDFfQ09ERV9MRU5HVEgpIHsKIAkJCQlzYWZlX2RtYV9tZW1jcHkgKCh2b2lkICopKGFkZHIpLCAmZGF0YSwgc2l6ZW9mKGRhdGEpKTsKIAkJCQljb3BpZWQgPSBzaXplb2YoZGF0YSk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4va2VybmVsL3JlYm9vdC5jIGIvYXJjaC9ibGFja2Zpbi9rZXJuZWwvcmVib290LmMKaW5kZXggYWU5N2NhNC4uZWVlZThjYiAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9rZXJuZWwvcmVib290LmMKKysrIGIvYXJjaC9ibGFja2Zpbi9rZXJuZWwvcmVib290LmMKQEAgLTIxLDcgKzIxLDcgQEAKICAqIHRoZSBjb3JlIHJlc2V0LgogICovCiBfX2F0dHJpYnV0ZV9fKChsMV90ZXh0KSkKLXN0YXRpYyB2b2lkIGJmaW5fcmVzZXQodm9pZCkKK3N0YXRpYyB2b2lkIF9iZmluX3Jlc2V0KHZvaWQpCiB7CiAJLyogV2FpdCBmb3IgY29tcGxldGlvbiBvZiAic3lzdGVtIiBldmVudHMgc3VjaCBhcyBjYWNoZSBsaW5lCiAJICogbGluZSBmaWxscyBzbyB0aGF0IHdlIGF2b2lkIGluZmluaXRlIHN0YWxscyBsYXRlciBvbiBhcwpAQCAtNjYsNiArNjYsMTggQEAKIAl9CiB9CiAKK3N0YXRpYyB2b2lkIGJmaW5fcmVzZXQodm9pZCkKK3sKKwlpZiAoQU5PTUFMWV8wNTAwMDM1MyB8fCBBTk9NQUxZXzA1MDAwMzg2KQorCQlfYmZpbl9yZXNldCgpOworCWVsc2UKKwkJLyogdGhlIGJvb3Ryb20gY2hlY2tzIHRvIHNlZSBob3cgaXQgd2FzIHJlc2V0IGFuZCB3aWxsCisJCSAqIGF1dG9tYXRpY2FsbHkgcGVyZm9ybSBhIHNvZnR3YXJlIHJlc2V0IGZvciB1cyB3aGVuCisJCSAqIGl0IHN0YXJ0cyBleGVjdXRpbmcgYm9vdAorCQkgKi8KKwkJYXNtKCJyYWlzZSAxOyIpOworfQorCiBfX2F0dHJpYnV0ZV9fKCh3ZWFrKSkKIHZvaWQgbmF0aXZlX21hY2hpbmVfcmVzdGFydChjaGFyICpjbWQpCiB7CkBAIC03NSwxNCArODcsMTAgQEAKIHsKIAluYXRpdmVfbWFjaGluZV9yZXN0YXJ0KGNtZCk7CiAJbG9jYWxfaXJxX2Rpc2FibGUoKTsKLQlpZiAoQU5PTUFMWV8wNTAwMDM1MyB8fCBBTk9NQUxZXzA1MDAwMzg2KQotCQliZmluX3Jlc2V0KCk7CisJaWYgKHNtcF9wcm9jZXNzb3JfaWQoKSkKKwkJc21wX2NhbGxfZnVuY3Rpb24oKHZvaWQgKiliZmluX3Jlc2V0LCAwLCAxKTsKIAllbHNlCi0JCS8qIHRoZSBib290cm9tIGNoZWNrcyB0byBzZWUgaG93IGl0IHdhcyByZXNldCBhbmQgd2lsbAotCQkgKiBhdXRvbWF0aWNhbGx5IHBlcmZvcm0gYSBzb2Z0d2FyZSByZXNldCBmb3IgdXMgd2hlbgotCQkgKiBpdCBzdGFydHMgZXhlY3V0aW5nIGJvb3QKLQkJICovCi0JCWFzbSgicmFpc2UgMTsiKTsKKwkJYmZpbl9yZXNldCgpOwogfQogCiBfX2F0dHJpYnV0ZV9fKCh3ZWFrKSkKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4va2VybmVsL3NldHVwLmMgYi9hcmNoL2JsYWNrZmluL2tlcm5lbC9zZXR1cC5jCmluZGV4IDcxYTlhOGMuLmIyYTgxMTMgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4va2VybmVsL3NldHVwLmMKKysrIGIvYXJjaC9ibGFja2Zpbi9rZXJuZWwvc2V0dXAuYwpAQCAtMTMsNiArMTMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2NwdS5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvdHR5Lmg+CiAjaW5jbHVkZSA8bGludXgvcGZuLmg+CkBAIC0yNiwxMSArMjcsMTAgQEAKICNpbmNsdWRlIDxhc20vYmxhY2tmaW4uaD4KICNpbmNsdWRlIDxhc20vY3BsYmluaXQuaD4KICNpbmNsdWRlIDxhc20vZGl2NjQuaD4KKyNpbmNsdWRlIDxhc20vY3B1Lmg+CiAjaW5jbHVkZSA8YXNtL2ZpeGVkX2NvZGUuaD4KICNpbmNsdWRlIDxhc20vZWFybHlfcHJpbnRrLmg+CiAKLXN0YXRpYyBERUZJTkVfUEVSX0NQVShzdHJ1Y3QgY3B1LCBjcHVfZGV2aWNlcyk7Ci0KIHUxNiBfYmZpbl9zd3JzdDsKIEVYUE9SVF9TWU1CT0woX2JmaW5fc3dyc3QpOwogCkBAIC03OSwyOSArNzksNzAgQEAKIHN0YXRpYyBzdHJ1Y3QgYmZpbl9tZW1tYXBfZW50cnkgKm92ZXJsYXBfbGlzdFtCRklOX01FTU1BUF9NQVhdIF9faW5pdGRhdGE7CiBzdGF0aWMgc3RydWN0IGJmaW5fbWVtbWFwX2VudHJ5IG5ld19tYXBbQkZJTl9NRU1NQVBfTUFYXSBfX2luaXRkYXRhOwogCi12b2lkIF9faW5pdCBiZmluX2NhY2hlX2luaXQodm9pZCkKLXsKK0RFRklORV9QRVJfQ1BVKHN0cnVjdCBibGFja2Zpbl9jcHVkYXRhLCBjcHVfZGF0YSk7CisKK3N0YXRpYyBpbnQgZWFybHlfaW5pdF9jbGtpbl9oeihjaGFyICpidWYpOworCiAjaWYgZGVmaW5lZChDT05GSUdfQkZJTl9EQ0FDSEUpIHx8IGRlZmluZWQoQ09ORklHX0JGSU5fSUNBQ0hFKQotCWdlbmVyYXRlX2NwbGJfdGFibGVzKCk7Cit2b2lkIF9faW5pdCBnZW5lcmF0ZV9jcGxiX3RhYmxlcyh2b2lkKQoreworCXVuc2lnbmVkIGludCBjcHU7CisKKwlnZW5lcmF0ZV9jcGxiX3RhYmxlc19hbGwoKTsKKwkvKiBHZW5lcmF0ZSBwZXItQ1BVIEkmRCBDUExCIHRhYmxlcyAqLworCWZvciAoY3B1ID0gMDsgY3B1IDwgbnVtX3Bvc3NpYmxlX2NwdXMoKTsgKytjcHUpCisJCWdlbmVyYXRlX2NwbGJfdGFibGVzX2NwdShjcHUpOworfQogI2VuZGlmCiAKK3ZvaWQgX19jcHVpbml0IGJmaW5fc2V0dXBfY2FjaGVzKHVuc2lnbmVkIGludCBjcHUpCit7CiAjaWZkZWYgQ09ORklHX0JGSU5fSUNBQ0hFCi0JYmZpbl9pY2FjaGVfaW5pdCgpOwotCXByaW50ayhLRVJOX0lORk8gIkluc3RydWN0aW9uIENhY2hlIEVuYWJsZWRcbiIpOworCWJmaW5faWNhY2hlX2luaXQoaWNwbGJfdGJsW2NwdV0pOwogI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfQkZJTl9EQ0FDSEUKLQliZmluX2RjYWNoZV9pbml0KCk7Ci0JcHJpbnRrKEtFUk5fSU5GTyAiRGF0YSBDYWNoZSBFbmFibGVkIgorCWJmaW5fZGNhY2hlX2luaXQoZGNwbGJfdGJsW2NwdV0pOworI2VuZGlmCisKKwkvKgorCSAqIEluIGNhY2hlIGNvaGVyZW5jZSBlbXVsYXRpb24gbW9kZSwgd2UgbmVlZCB0byBoYXZlIHRoZQorCSAqIEQtY2FjaGUgZW5hYmxlZCBiZWZvcmUgcnVubmluZyBhbnkgYXRvbWljIG9wZXJhdGlvbiB3aGljaAorCSAqIG1pZ2h0IGludm92ZSBjYWNoZSBpbnZhbGlkYXRpb24gKGkuZS4gc3BpbmxvY2ssIHJ3bG9jaykuCisJICogU28gcHJpbnRrJ3MgYXJlIGRlZmVycmVkIHVudGlsIHRoZW4uCisJICovCisjaWZkZWYgQ09ORklHX0JGSU5fSUNBQ0hFCisJcHJpbnRrKEtFUk5fSU5GTyAiSW5zdHJ1Y3Rpb24gQ2FjaGUgRW5hYmxlZCBmb3IgQ1BVJXVcbiIsIGNwdSk7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfQkZJTl9EQ0FDSEUKKwlwcmludGsoS0VSTl9JTkZPICJEYXRhIENhY2hlIEVuYWJsZWQgZm9yIENQVSV1IgogIyBpZiBkZWZpbmVkIENPTkZJR19CRklOX1dCCiAJCSIgKHdyaXRlLWJhY2spIgogIyBlbGlmIGRlZmluZWQgQ09ORklHX0JGSU5fV1QKIAkJIiAod3JpdGUtdGhyb3VnaCkiCiAjIGVuZGlmCi0JCSJcbiIpOworCQkiXG4iLCBjcHUpOwogI2VuZGlmCiB9CiAKK3ZvaWQgX19jcHVpbml0IGJmaW5fc2V0dXBfY3B1ZGF0YSh1bnNpZ25lZCBpbnQgY3B1KQoreworCXN0cnVjdCBibGFja2Zpbl9jcHVkYXRhICpjcHVkYXRhID0gJnBlcl9jcHUoY3B1X2RhdGEsIGNwdSk7CisKKwljcHVkYXRhLT5pZGxlID0gY3VycmVudDsKKwljcHVkYXRhLT5sb29wc19wZXJfamlmZnkgPSBsb29wc19wZXJfamlmZnk7CisJY3B1ZGF0YS0+aW1lbWN0bCA9IGJmaW5fcmVhZF9JTUVNX0NPTlRST0woKTsKKwljcHVkYXRhLT5kbWVtY3RsID0gYmZpbl9yZWFkX0RNRU1fQ09OVFJPTCgpOworfQorCit2b2lkIF9faW5pdCBiZmluX2NhY2hlX2luaXQodm9pZCkKK3sKKyNpZiBkZWZpbmVkKENPTkZJR19CRklOX0RDQUNIRSkgfHwgZGVmaW5lZChDT05GSUdfQkZJTl9JQ0FDSEUpCisJZ2VuZXJhdGVfY3BsYl90YWJsZXMoKTsKKyNlbmRpZgorCWJmaW5fc2V0dXBfY2FjaGVzKDApOworfQorCiB2b2lkIF9faW5pdCBiZmluX3JlbG9jYXRlX2wxX21lbSh2b2lkKQogewogCXVuc2lnbmVkIGxvbmcgbDFfY29kZV9sZW5ndGg7CkBAIC0xMDksNiArMTUwLDggQEAKIAl1bnNpZ25lZCBsb25nIGwxX2RhdGFfYl9sZW5ndGg7CiAJdW5zaWduZWQgbG9uZyBsMl9sZW5ndGg7CiAKKwlibGFja2Zpbl9kbWFfZWFybHlfaW5pdCgpOworCiAJbDFfY29kZV9sZW5ndGggPSBfZXRleHRfbDEgLSBfc3RleHRfbDE7CiAJaWYgKGwxX2NvZGVfbGVuZ3RoID4gTDFfQ09ERV9MRU5HVEgpCiAJCXBhbmljKCJMMSBJbnN0cnVjdGlvbiBTUkFNIE92ZXJmbG93XG4iKTsKQEAgLTIzMCw3ICsyNzMsNyBAQAogCS8qIHJlY29yZCBhbGwga25vd24gY2hhbmdlLXBvaW50cyAoc3RhcnRpbmcgYW5kIGVuZGluZyBhZGRyZXNzZXMpLAogCSAgIG9taXR0aW5nIHRob3NlIHRoYXQgYXJlIGZvciBlbXB0eSBtZW1vcnkgcmVnaW9ucyAqLwogCWNoZ2lkeCA9IDA7Ci0JZm9yIChpID0gMDsgaSA8IG9sZF9ucjsgaSsrKQl7CisJZm9yIChpID0gMDsgaSA8IG9sZF9ucjsgaSsrKSB7CiAJCWlmIChtYXBbaV0uc2l6ZSAhPSAwKSB7CiAJCQljaGFuZ2VfcG9pbnRbY2hnaWR4XS0+YWRkciA9IG1hcFtpXS5hZGRyOwogCQkJY2hhbmdlX3BvaW50W2NoZ2lkeCsrXS0+cGVudHJ5ID0gJm1hcFtpXTsKQEAgLTIzOCwxMyArMjgxLDEzIEBACiAJCQljaGFuZ2VfcG9pbnRbY2hnaWR4KytdLT5wZW50cnkgPSAmbWFwW2ldOwogCQl9CiAJfQotCWNoZ19uciA9IGNoZ2lkeDsgICAgCS8qIHRydWUgbnVtYmVyIG9mIGNoYW5nZS1wb2ludHMgKi8KKwljaGdfbnIgPSBjaGdpZHg7CS8qIHRydWUgbnVtYmVyIG9mIGNoYW5nZS1wb2ludHMgKi8KIAogCS8qIHNvcnQgY2hhbmdlLXBvaW50IGxpc3QgYnkgbWVtb3J5IGFkZHJlc3NlcyAobG93IC0+IGhpZ2gpICovCiAJc3RpbGxfY2hhbmdpbmcgPSAxOwotCXdoaWxlIChzdGlsbF9jaGFuZ2luZykJeworCXdoaWxlIChzdGlsbF9jaGFuZ2luZykgewogCQlzdGlsbF9jaGFuZ2luZyA9IDA7Ci0JCWZvciAoaSA9IDE7IGkgPCBjaGdfbnI7IGkrKykgIHsKKwkJZm9yIChpID0gMTsgaSA8IGNoZ19ucjsgaSsrKSB7CiAJCQkvKiBpZiA8Y3VycmVudF9hZGRyPiA+IDxsYXN0X2FkZHI+LCBzd2FwICovCiAJCQkvKiBvciwgaWYgY3VycmVudD08c3RhcnRfYWRkcj4gJiBsYXN0PTxlbmRfYWRkcj4sIHN3YXAgKi8KIAkJCWlmICgoY2hhbmdlX3BvaW50W2ldLT5hZGRyIDwgY2hhbmdlX3BvaW50W2ktMV0tPmFkZHIpIHx8CkBAIC0yNjEsMTAgKzMwNCwxMCBAQAogCX0KIAogCS8qIGNyZWF0ZSBhIG5ldyBtZW1tYXAsIHJlbW92aW5nIG92ZXJsYXBzICovCi0Jb3ZlcmxhcF9lbnRyaWVzID0gMDsJIC8qIG51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBvdmVybGFwIHRhYmxlICovCi0JbmV3X2VudHJ5ID0gMDsJIC8qIGluZGV4IGZvciBjcmVhdGluZyBuZXcgbWVtbWFwIGVudHJpZXMgKi8KLQlsYXN0X3R5cGUgPSAwOwkJIC8qIHN0YXJ0IHdpdGggdW5kZWZpbmVkIG1lbW9yeSB0eXBlICovCi0JbGFzdF9hZGRyID0gMDsJCSAvKiBzdGFydCB3aXRoIDAgYXMgbGFzdCBzdGFydGluZyBhZGRyZXNzICovCisJb3ZlcmxhcF9lbnRyaWVzID0gMDsJLyogbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIG92ZXJsYXAgdGFibGUgKi8KKwluZXdfZW50cnkgPSAwOwkJLyogaW5kZXggZm9yIGNyZWF0aW5nIG5ldyBtZW1tYXAgZW50cmllcyAqLworCWxhc3RfdHlwZSA9IDA7CQkvKiBzdGFydCB3aXRoIHVuZGVmaW5lZCBtZW1vcnkgdHlwZSAqLworCWxhc3RfYWRkciA9IDA7CQkvKiBzdGFydCB3aXRoIDAgYXMgbGFzdCBzdGFydGluZyBhZGRyZXNzICovCiAJLyogbG9vcCB0aHJvdWdoIGNoYW5nZS1wb2ludHMsIGRldGVybWluaW5nIGFmZmVjdCBvbiB0aGUgbmV3IG1lbW1hcCAqLwogCWZvciAoY2hnaWR4ID0gMDsgY2hnaWR4IDwgY2hnX25yOyBjaGdpZHgrKykgewogCQkvKiBrZWVwIHRyYWNrIG9mIGFsbCBvdmVybGFwcGluZyBtZW1tYXAgZW50cmllcyAqLwpAQCAtMjg2LDE0ICszMjksMTQgQEAKIAkJCWlmIChvdmVybGFwX2xpc3RbaV0tPnR5cGUgPiBjdXJyZW50X3R5cGUpCiAJCQkJY3VycmVudF90eXBlID0gb3ZlcmxhcF9saXN0W2ldLT50eXBlOwogCQkvKiBjb250aW51ZSBidWlsZGluZyB1cCBuZXcgbWVtbWFwIGJhc2VkIG9uIHRoaXMgaW5mb3JtYXRpb24gKi8KLQkJaWYgKGN1cnJlbnRfdHlwZSAhPSBsYXN0X3R5cGUpCXsKKwkJaWYgKGN1cnJlbnRfdHlwZSAhPSBsYXN0X3R5cGUpIHsKIAkJCWlmIChsYXN0X3R5cGUgIT0gMCkgewogCQkJCW5ld19tYXBbbmV3X2VudHJ5XS5zaXplID0KIAkJCQkJY2hhbmdlX3BvaW50W2NoZ2lkeF0tPmFkZHIgLSBsYXN0X2FkZHI7CiAJCQkJLyogbW92ZSBmb3J3YXJkIG9ubHkgaWYgdGhlIG5ldyBzaXplIHdhcyBub24temVybyAqLwogCQkJCWlmIChuZXdfbWFwW25ld19lbnRyeV0uc2l6ZSAhPSAwKQogCQkJCQlpZiAoKytuZXdfZW50cnkgPj0gQkZJTl9NRU1NQVBfTUFYKQotCQkJCQkJYnJlYWs7IAkvKiBubyBtb3JlIHNwYWNlIGxlZnQgZm9yIG5ldyBlbnRyaWVzICovCisJCQkJCQlicmVhazsJLyogbm8gbW9yZSBzcGFjZSBsZWZ0IGZvciBuZXcgZW50cmllcyAqLwogCQkJfQogCQkJaWYgKGN1cnJlbnRfdHlwZSAhPSAwKSB7CiAJCQkJbmV3X21hcFtuZXdfZW50cnldLmFkZHIgPSBjaGFuZ2VfcG9pbnRbY2hnaWR4XS0+YWRkcjsKQEAgLTMwMyw5ICszNDYsOSBAQAogCQkJbGFzdF90eXBlID0gY3VycmVudF90eXBlOwogCQl9CiAJfQotCW5ld19uciA9IG5ld19lbnRyeTsgICAvKiByZXRhaW4gY291bnQgZm9yIG5ldyBlbnRyaWVzICovCisJbmV3X25yID0gbmV3X2VudHJ5OwkvKiByZXRhaW4gY291bnQgZm9yIG5ldyBlbnRyaWVzICovCiAKLQkvKiBjb3B5IG5ldyAgbWFwcGluZyBpbnRvIG9yaWdpbmFsIGxvY2F0aW9uICovCisJLyogY29weSBuZXcgbWFwcGluZyBpbnRvIG9yaWdpbmFsIGxvY2F0aW9uICovCiAJbWVtY3B5KG1hcCwgbmV3X21hcCwgbmV3X25yKnNpemVvZihzdHJ1Y3QgYmZpbl9tZW1tYXBfZW50cnkpKTsKIAkqcG5yX21hcCA9IG5ld19ucjsKIApAQCAtMzYxLDcgKzQwNCw2IEBACiAgKiAgLSAibWVtbWFwPVhYWFtLa21NXVtAXVskXVhYWFtLa21NXSIgZGVmaW5lcyBhIG1lbW9yeSByZWdpb24KICAqICAgICAgIEAgZnJvbSA8c3RhcnQ+IHRvIDxzdGFydD4rPG1lbT4sIHR5cGUgUkFNCiAgKiAgICAgICAkIGZyb20gPHN0YXJ0PiB0byA8c3RhcnQ+KzxtZW0+LCB0eXBlIFJFU0VSVkVECi0gKgogICovCiBzdGF0aWMgX19pbml0IHZvaWQgcGFyc2VfY21kbGluZV9lYXJseShjaGFyICpjbWRsaW5lX3ApCiB7CkBAIC0zODMsMTQgKzQyNSwxNSBAQAogCQkJCQlpZiAoKnRvICE9ICcgJykgewogCQkJCQkJaWYgKCp0byA9PSAnJCcKIAkJCQkJCSAgICB8fCAqKHRvICsgMSkgPT0gJyQnKQotCQkJCQkJCXJlc2VydmVkX21lbV9kY2FjaGVfb24gPQotCQkJCQkJCSAgICAxOworCQkJCQkJCXJlc2VydmVkX21lbV9kY2FjaGVfb24gPSAxOwogCQkJCQkJaWYgKCp0byA9PSAnIycKIAkJCQkJCSAgICB8fCAqKHRvICsgMSkgPT0gJyMnKQotCQkJCQkJCXJlc2VydmVkX21lbV9pY2FjaGVfb24gPQotCQkJCQkJCSAgICAxOworCQkJCQkJCXJlc2VydmVkX21lbV9pY2FjaGVfb24gPSAxOwogCQkJCQl9CiAJCQkJfQorCQkJfSBlbHNlIGlmICghbWVtY21wKHRvLCAiY2xraW5faHo9IiwgOSkpIHsKKwkJCQl0byArPSA5OworCQkJCWVhcmx5X2luaXRfY2xraW5faHoodG8pOwogCQkJfSBlbHNlIGlmICghbWVtY21wKHRvLCAiZWFybHlwcmludGs9IiwgMTIpKSB7CiAJCQkJdG8gKz0gMTI7CiAJCQkJc2V0dXBfZWFybHlfcHJpbnRrKHRvKTsKQEAgLTQxNyw5ICs0NjAsOCBAQAogICoJW19yYW1lbmQgLSBETUFfVU5DQUNIRURfUkVHSU9OLAogICoJCV9yYW1lbmRdOgkJCXVuY2FjaGVkIERNQSByZWdpb24KICAqICBbX3JhbWVuZCwgcGh5c2ljYWxfbWVtX2VuZF06CW1lbW9yeSBub3QgbWFuYWdlZCBieSBrZXJuZWwKLSAqCiAgKi8KLXN0YXRpYyBfX2luaXQgdm9pZCAgbWVtb3J5X3NldHVwKHZvaWQpCitzdGF0aWMgX19pbml0IHZvaWQgbWVtb3J5X3NldHVwKHZvaWQpCiB7CiAjaWZkZWYgQ09ORklHX01URF9VQ0xJTlVYCiAJdW5zaWduZWQgbG9uZyBtdGRfcGh5cyA9IDA7CkBAIC00MzYsNyArNDc4LDcgQEAKIAltZW1vcnlfZW5kID0gX3JhbWVuZCAtIERNQV9VTkNBQ0hFRF9SRUdJT047CiAKICNpZmRlZiBDT05GSUdfTVBVCi0JLyogUm91bmQgdXAgdG8gbXVsdGlwbGUgb2YgNE1CLiAgKi8KKwkvKiBSb3VuZCB1cCB0byBtdWx0aXBsZSBvZiA0TUIgKi8KIAltZW1vcnlfc3RhcnQgPSAoX3JhbXN0YXJ0ICsgMHgzZmZmZmYpICYgfjB4M2ZmZmZmOwogI2Vsc2UKIAltZW1vcnlfc3RhcnQgPSBQQUdFX0FMSUdOKF9yYW1zdGFydCk7CkBAIC02MTYsNyArNjU4LDcgQEAKIAllbmRfcGZuID0gbWVtb3J5X2VuZCA+PiBQQUdFX1NISUZUOwogCiAJLyoKLQkgKiBnaXZlIGFsbCB0aGUgbWVtb3J5IHRvIHRoZSBib290bWFwIGFsbG9jYXRvciwgIHRlbGwgaXQgdG8gcHV0IHRoZQorCSAqIGdpdmUgYWxsIHRoZSBtZW1vcnkgdG8gdGhlIGJvb3RtYXAgYWxsb2NhdG9yLCB0ZWxsIGl0IHRvIHB1dCB0aGUKIAkgKiBib290IG1lbV9tYXAgYXQgdGhlIHN0YXJ0IG9mIG1lbW9yeS4KIAkgKi8KIAlib290bWFwX3NpemUgPSBpbml0X2Jvb3RtZW1fbm9kZShOT0RFX0RBVEEoMCksCkBAIC03OTEsNyArODMzLDExIEBACiAJYmZpbl93cml0ZV9TV1JTVChfYmZpbl9zd3JzdCB8IERPVUJMRV9GQVVMVCk7CiAjZW5kaWYKIAorI2lmZGVmIENPTkZJR19TTVAKKwlpZiAoX2JmaW5fc3dyc3QgJiBTV1JTVF9EQkxfRkFVTFRfQSkgeworI2Vsc2UKIAlpZiAoX2JmaW5fc3dyc3QgJiBSRVNFVF9ET1VCTEUpIHsKKyNlbmRpZgogCQlwcmludGsoS0VSTl9FTUVSRyAiUmVjb3ZlcmluZyBmcm9tIERPVUJMRSBGQVVMVCBldmVudFxuIik7CiAjaWZkZWYgQ09ORklHX0RFQlVHX0RPVUJMRUZBVUxUCiAJCS8qIFdlIGFzc3VtZSB0aGUgY3Jhc2hpbmcga2VybmVsLCBhbmQgdGhlIGN1cnJlbnQgc3ltYm9sIHRhYmxlIG1hdGNoICovCkBAIC04MjMsOSArODY5LDEyIEBACiAJCQlpZiAoYmZpbl9jb21waWxlZF9yZXZpZCgpID09IC0xKQogCQkJCXByaW50ayhLRVJOX0VSUiAiV2FybmluZzogQ29tcGlsZWQgZm9yIFJldiBub25lLCBidXQgcnVubmluZyBvbiBSZXYgJWRcbiIsCiAJCQkJICAgICAgIGJmaW5fcmV2aWQoKSk7Ci0JCQllbHNlIGlmIChiZmluX2NvbXBpbGVkX3JldmlkKCkgIT0gMHhmZmZmKQorCQkJZWxzZSBpZiAoYmZpbl9jb21waWxlZF9yZXZpZCgpICE9IDB4ZmZmZikgewogCQkJCXByaW50ayhLRVJOX0VSUiAiV2FybmluZzogQ29tcGlsZWQgZm9yIFJldiAlZCwgYnV0IHJ1bm5pbmcgb24gUmV2ICVkXG4iLAogCQkJCSAgICAgICBiZmluX2NvbXBpbGVkX3JldmlkKCksIGJmaW5fcmV2aWQoKSk7CisJCQkJaWYgKGJmaW5fY29tcGlsZWRfcmV2aWQoKSA+IGJmaW5fcmV2aWQoKSkKKwkJCQkJcGFuaWMoIkVycm9yOiB5b3UgYXJlIG1pc3NpbmcgYW5vbWFseSB3b3JrYXJvdW5kcyBmb3IgdGhpcyByZXZcbiIpOworCQkJfQogCQl9CiAJCWlmIChiZmluX3JldmlkKCkgPCBDT05GSUdfQkZfUkVWX01JTiB8fCBiZmluX3JldmlkKCkgPiBDT05GSUdfQkZfUkVWX01BWCkKIAkJCXByaW50ayhLRVJOX0VSUiAiV2FybmluZzogVW5zdXBwb3J0ZWQgQ2hpcCBSZXZpc2lvbiBBRFNQLSVzIFJldiAwLiVkIGRldGVjdGVkXG4iLApAQCAtODM1LDcgKzg4NCw3IEBACiAJcHJpbnRrKEtFUk5fSU5GTyAiQmxhY2tmaW4gTGludXggc3VwcG9ydCBieSBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvXG4iKTsKIAogCXByaW50ayhLRVJOX0lORk8gIlByb2Nlc3NvciBTcGVlZDogJWx1IE1IeiBjb3JlIGNsb2NrIGFuZCAlbHUgTUh6IFN5c3RlbSBDbG9ja1xuIiwKLQkgICAgICAgY2NsayAvIDEwMDAwMDAsICBzY2xrIC8gMTAwMDAwMCk7CisJICAgICAgIGNjbGsgLyAxMDAwMDAwLCBzY2xrIC8gMTAwMDAwMCk7CiAKIAlpZiAoQU5PTUFMWV8wNTAwMDI3MyAmJiAoY2NsayA+PiAxKSA8PSBzY2xrKQogCQlwcmludGsoIlxuXG5cbkFOT01BTFlfMDUwMDAyNzM6IENDTEsgbXVzdCBiZSA+PSAyKlNDTEsgISEhXG5cblxuIik7CkBAIC04NjcsMTggKzkxNiwyMSBAQAogCUJVR19PTigoY2hhciAqKSZzYWZlX3VzZXJfaW5zdHJ1Y3Rpb24gLSAoY2hhciAqKSZmaXhlZF9jb2RlX3N0YXJ0CiAJCSE9IFNBRkVfVVNFUl9JTlNUUlVDVElPTiAtIEZJWEVEX0NPREVfU1RBUlQpOwogCisjaWZkZWYgQ09ORklHX1NNUAorCXBsYXRmb3JtX2luaXRfY3B1cygpOworI2VuZGlmCiAJaW5pdF9leGNlcHRpb25fdmVjdG9ycygpOwotCWJmaW5fY2FjaGVfaW5pdCgpOworCWJmaW5fY2FjaGVfaW5pdCgpOwkvKiBJbml0aWFsaXplIGNhY2hlcyBmb3IgdGhlIGJvb3QgQ1BVICovCiB9CiAKIHN0YXRpYyBpbnQgX19pbml0IHRvcG9sb2d5X2luaXQodm9pZCkKIHsKLQlpbnQgY3B1OworCXVuc2lnbmVkIGludCBjcHU7CisJLyogUmVjb3JkIENQVS1wcml2YXRlIGluZm9ybWF0aW9uIGZvciB0aGUgYm9vdCBwcm9jZXNzb3IuICovCisJYmZpbl9zZXR1cF9jcHVkYXRhKDApOwogCiAJZm9yX2VhY2hfcG9zc2libGVfY3B1KGNwdSkgewotCQlzdHJ1Y3QgY3B1ICpjID0gJnBlcl9jcHUoY3B1X2RldmljZXMsIGNwdSk7Ci0KLQkJcmVnaXN0ZXJfY3B1KGMsIGNwdSk7CisJCXJlZ2lzdGVyX2NwdSgmcGVyX2NwdShjcHVfZGF0YSwgY3B1KS5jcHUsIGNwdSk7CiAJfQogCiAJcmV0dXJuIDA7CkBAIC04ODYsMzYgKzkzOCw1NCBAQAogCiBzdWJzeXNfaW5pdGNhbGwodG9wb2xvZ3lfaW5pdCk7CiAKKy8qIEdldCB0aGUgaW5wdXQgY2xvY2sgZnJlcXVlbmN5ICovCitzdGF0aWMgdV9sb25nIGNhY2hlZF9jbGtpbl9oeiA9IENPTkZJR19DTEtJTl9IWjsKK3N0YXRpYyB1X2xvbmcgZ2V0X2Nsa2luX2h6KHZvaWQpCit7CisJcmV0dXJuIGNhY2hlZF9jbGtpbl9oejsKK30KK3N0YXRpYyBpbnQgX19pbml0IGVhcmx5X2luaXRfY2xraW5faHooY2hhciAqYnVmKQoreworCWNhY2hlZF9jbGtpbl9oeiA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMCk7CisjaWZkZWYgQkZJTl9LRVJORUxfQ0xPQ0sKKwlpZiAoY2FjaGVkX2Nsa2luX2h6ICE9IENPTkZJR19DTEtJTl9IWikKKwkJcGFuaWMoImNhbm5vdCBjaGFuZ2UgY2xraW5faHogd2hlbiByZXByb2dyYW1taW5nIGNsb2NrcyIpOworI2VuZGlmCisJcmV0dXJuIDE7Cit9CitlYXJseV9wYXJhbSgiY2xraW5faHo9IiwgZWFybHlfaW5pdF9jbGtpbl9oeik7CisKIC8qIEdldCB0aGUgdm9sdGFnZSBpbnB1dCBtdWx0aXBsaWVyICovCi1zdGF0aWMgdV9sb25nIGNhY2hlZF92Y29fcGxsX2N0bCwgY2FjaGVkX3ZjbzsKIHN0YXRpYyB1X2xvbmcgZ2V0X3Zjbyh2b2lkKQogewotCXVfbG9uZyBtc2VsOworCXN0YXRpYyB1X2xvbmcgY2FjaGVkX3ZjbzsKKwl1X2xvbmcgbXNlbCwgcGxsX2N0bDsKIAotCXVfbG9uZyBwbGxfY3RsID0gYmZpbl9yZWFkX1BMTF9DVEwoKTsKLQlpZiAocGxsX2N0bCA9PSBjYWNoZWRfdmNvX3BsbF9jdGwpCisJLyogVGhlIGFzc3VtcHRpb24gaGVyZSBpcyB0aGF0IFZDTyBuZXZlciBjaGFuZ2VzIGF0IHJ1bnRpbWUuCisJICogSWYsIHNvbWVkYXksIHdlIHN1cHBvcnQgdGhhdCwgdGhlbiB3ZSdsbCBoYXZlIHRvIGNoYW5nZSB0aGlzLgorCSAqLworCWlmIChjYWNoZWRfdmNvKQogCQlyZXR1cm4gY2FjaGVkX3ZjbzsKLQllbHNlCi0JCWNhY2hlZF92Y29fcGxsX2N0bCA9IHBsbF9jdGw7CiAKKwlwbGxfY3RsID0gYmZpbl9yZWFkX1BMTF9DVEwoKTsKIAltc2VsID0gKHBsbF9jdGwgPj4gOSkgJiAweDNGOwogCWlmICgwID09IG1zZWwpCiAJCW1zZWwgPSA2NDsKIAotCWNhY2hlZF92Y28gPSBDT05GSUdfQ0xLSU5fSFo7CisJY2FjaGVkX3ZjbyA9IGdldF9jbGtpbl9oeigpOwogCWNhY2hlZF92Y28gPj49ICgxICYgcGxsX2N0bCk7CS8qIERGIGJpdCAqLwogCWNhY2hlZF92Y28gKj0gbXNlbDsKIAlyZXR1cm4gY2FjaGVkX3ZjbzsKIH0KIAogLyogR2V0IHRoZSBDb3JlIGNsb2NrICovCi1zdGF0aWMgdV9sb25nIGNhY2hlZF9jY2xrX3BsbF9kaXYsIGNhY2hlZF9jY2xrOwogdV9sb25nIGdldF9jY2xrKHZvaWQpCiB7CisJc3RhdGljIHVfbG9uZyBjYWNoZWRfY2Nsa19wbGxfZGl2LCBjYWNoZWRfY2NsazsKIAl1X2xvbmcgY3NlbCwgc3NlbDsKIAogCWlmIChiZmluX3JlYWRfUExMX1NUQVQoKSAmIDB4MSkKLQkJcmV0dXJuIENPTkZJR19DTEtJTl9IWjsKKwkJcmV0dXJuIGdldF9jbGtpbl9oeigpOwogCiAJc3NlbCA9IGJmaW5fcmVhZF9QTExfRElWKCk7CiAJaWYgKHNzZWwgPT0gY2FjaGVkX2NjbGtfcGxsX2RpdikKQEAgLTkzNCwyMSArMTAwNCwyMSBAQAogRVhQT1JUX1NZTUJPTChnZXRfY2Nsayk7CiAKIC8qIEdldCB0aGUgU3lzdGVtIGNsb2NrICovCi1zdGF0aWMgdV9sb25nIGNhY2hlZF9zY2xrX3BsbF9kaXYsIGNhY2hlZF9zY2xrOwogdV9sb25nIGdldF9zY2xrKHZvaWQpCiB7CisJc3RhdGljIHVfbG9uZyBjYWNoZWRfc2NsazsKIAl1X2xvbmcgc3NlbDsKIAotCWlmIChiZmluX3JlYWRfUExMX1NUQVQoKSAmIDB4MSkKLQkJcmV0dXJuIENPTkZJR19DTEtJTl9IWjsKLQotCXNzZWwgPSBiZmluX3JlYWRfUExMX0RJVigpOwotCWlmIChzc2VsID09IGNhY2hlZF9zY2xrX3BsbF9kaXYpCisJLyogVGhlIGFzc3VtcHRpb24gaGVyZSBpcyB0aGF0IFNDTEsgbmV2ZXIgY2hhbmdlcyBhdCBydW50aW1lLgorCSAqIElmLCBzb21lZGF5LCB3ZSBzdXBwb3J0IHRoYXQsIHRoZW4gd2UnbGwgaGF2ZSB0byBjaGFuZ2UgdGhpcy4KKwkgKi8KKwlpZiAoY2FjaGVkX3NjbGspCiAJCXJldHVybiBjYWNoZWRfc2NsazsKLQllbHNlCi0JCWNhY2hlZF9zY2xrX3BsbF9kaXYgPSBzc2VsOwogCi0Jc3NlbCAmPSAweGY7CisJaWYgKGJmaW5fcmVhZF9QTExfU1RBVCgpICYgMHgxKQorCQlyZXR1cm4gZ2V0X2Nsa2luX2h6KCk7CisKKwlzc2VsID0gYmZpbl9yZWFkX1BMTF9ESVYoKSAmIDB4ZjsKIAlpZiAoMCA9PSBzc2VsKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIkludmFsaWQgU3lzdGVtIENsb2NrXG4iKTsKIAkJc3NlbCA9IDE7CkBAIC05ODIsMTcgKzEwNTIsMTggQEAKIHsKIAljaGFyICpjcHUsICptbXUsICpmcHUsICp2ZW5kb3IsICpjYWNoZTsKIAl1aW50MzJfdCByZXZpZDsKLQotCXVfbG9uZyBjY2xrID0gMCwgc2NsayA9IDA7CisJaW50IGNwdV9udW0gPSAqKHVuc2lnbmVkIGludCAqKXY7CisJdV9sb25nIHNjbGssIGNjbGs7CiAJdV9pbnQgaWNhY2hlX3NpemUgPSBCRklOX0lDQUNIRVNJWkUgLyAxMDI0LCBkY2FjaGVfc2l6ZSA9IDAsIGRzdXBfYmFua3MgPSAwOworCXN0cnVjdCBibGFja2Zpbl9jcHVkYXRhICpjcHVkYXRhID0gJnBlcl9jcHUoY3B1X2RhdGEsIGNwdV9udW0pOwogCiAJY3B1ID0gQ1BVOwogCW1tdSA9ICJub25lIjsKIAlmcHUgPSAibm9uZSI7CiAJcmV2aWQgPSBiZmluX3JldmlkKCk7CiAKLQljY2xrID0gZ2V0X2NjbGsoKTsKIAlzY2xrID0gZ2V0X3NjbGsoKTsKKwljY2xrID0gZ2V0X2NjbGsoKTsKIAogCXN3aXRjaCAoYmZpbl9yZWFkX0NISVBJRCgpICYgQ0hJUElEX01BTlVGQUNUVVJFKSB7CiAJY2FzZSAweGNhOgpAQCAtMTAwMywxMCArMTA3NCw3IEBACiAJCWJyZWFrOwogCX0KIAotCXNlcV9wcmludGYobSwgInByb2Nlc3Nvclx0OiAlZFxuIgotCQkidmVuZG9yX2lkXHQ6ICVzXG4iLAotCQkqKHVuc2lnbmVkIGludCAqKXYsCi0JCXZlbmRvcik7CisJc2VxX3ByaW50ZihtLCAicHJvY2Vzc29yXHQ6ICVkXG4iICJ2ZW5kb3JfaWRcdDogJXNcbiIsIGNwdV9udW0sIHZlbmRvcik7CiAKIAlpZiAoQ1BVSUQgPT0gYmZpbl9jcHVpZCgpKQogCQlzZXFfcHJpbnRmKG0sICJjcHUgZmFtaWx5XHQ6IDB4JTA0eFxuIiwgQ1BVSUQpOwpAQCAtMTAyOSwxMiArMTA5NywxMiBAQAogCQlzY2xrLzEwMDAwMDAsIHNjbGslMTAwMDAwMCk7CiAJc2VxX3ByaW50ZihtLCAiYm9nb21pcHNcdDogJWx1LiUwMmx1XG4iCiAJCSJDYWxpYnJhdGlvblx0OiAlbHUgbG9vcHNcbiIsCi0JCShsb29wc19wZXJfamlmZnkgKiBIWikgLyA1MDAwMDAsCi0JCSgobG9vcHNfcGVyX2ppZmZ5ICogSFopIC8gNTAwMCkgJSAxMDAsCi0JCShsb29wc19wZXJfamlmZnkgKiBIWikpOworCQkoY3B1ZGF0YS0+bG9vcHNfcGVyX2ppZmZ5ICogSFopIC8gNTAwMDAwLAorCQkoKGNwdWRhdGEtPmxvb3BzX3Blcl9qaWZmeSAqIEhaKSAvIDUwMDApICUgMTAwLAorCQkoY3B1ZGF0YS0+bG9vcHNfcGVyX2ppZmZ5ICogSFopKTsKIAogCS8qIENoZWNrIENhY2hlIGNvbmZpZ3V0YXRpb24gKi8KLQlzd2l0Y2ggKGJmaW5fcmVhZF9ETUVNX0NPTlRST0woKSAmICgxIDw8IERNQzBfUCB8IDEgPDwgRE1DMV9QKSkgeworCXN3aXRjaCAoY3B1ZGF0YS0+ZG1lbWN0bCAmICgxIDw8IERNQzBfUCB8IDEgPDwgRE1DMV9QKSkgewogCWNhc2UgQUNBQ0hFX0JTUkFNOgogCQljYWNoZSA9ICJkYmFuay1BL0JcdDogY2FjaGUvc3JhbSI7CiAJCWRjYWNoZV9zaXplID0gMTY7CkBAIC0xMDU4LDEwICsxMTI2LDEwIEBACiAJfQogCiAJLyogSXMgaXQgdHVybmVkIG9uPyAqLwotCWlmICgoYmZpbl9yZWFkX0RNRU1fQ09OVFJPTCgpICYgKEVORENQTEIgfCBETUNfRU5BQkxFKSkgIT0gKEVORENQTEIgfCBETUNfRU5BQkxFKSkKKwlpZiAoKGNwdWRhdGEtPmRtZW1jdGwgJiAoRU5EQ1BMQiB8IERNQ19FTkFCTEUpKSAhPSAoRU5EQ1BMQiB8IERNQ19FTkFCTEUpKQogCQlkY2FjaGVfc2l6ZSA9IDA7CiAKLQlpZiAoKGJmaW5fcmVhZF9JTUVNX0NPTlRST0woKSAmIChJTUMgfCBFTklDUExCKSkgIT0gKElNQyB8IEVOSUNQTEIpKQorCWlmICgoY3B1ZGF0YS0+aW1lbWN0bCAmIChJTUMgfCBFTklDUExCKSkgIT0gKElNQyB8IEVOSUNQTEIpKQogCQlpY2FjaGVfc2l6ZSA9IDA7CiAKIAlzZXFfcHJpbnRmKG0sICJjYWNoZSBzaXplXHQ6ICVkIEtCKEwxIGljYWNoZSkgIgpAQCAtMTA4Niw4ICsxMTU0LDExIEBACiAJCSAgICJkY2FjaGUgc2V0dXBcdDogJWQgU3VwZXItYmFua3MvJWQgU3ViLWJhbmtzLyVkIFdheXMsICVkIExpbmVzL1dheVxuIiwKIAkJICAgZHN1cF9iYW5rcywgQkZJTl9EU1VCQkFOS1MsIEJGSU5fRFdBWVMsCiAJCSAgIEJGSU5fRExJTkVTKTsKKyNpZmRlZiBfX0FSQ0hfU1lOQ19DT1JFX0RDQUNIRQorCXNlcV9wcmludGYobSwgIlNNUCBEY2FjaGUgRmx1c2hlc1x0OiAlbHVcblxuIiwgY3B1ZGF0YS0+ZGNhY2hlX2ludmxkX2NvdW50KTsKKyNlbmRpZgogI2lmZGVmIENPTkZJR19CRklOX0lDQUNIRV9MT0NLCi0Jc3dpdGNoICgoYmZpbl9yZWFkX0lNRU1fQ09OVFJPTCgpID4+IDMpICYgV0FZQUxMX0wpIHsKKwlzd2l0Y2ggKChjcHVkYXRhLT5pbWVtY3RsID4+IDMpICYgV0FZQUxMX0wpIHsKIAljYXNlIFdBWTBfTDoKIAkJc2VxX3ByaW50ZihtLCAiV2F5MCBMb2NrZWQtRG93blxuIik7CiAJCWJyZWFrOwpAQCAtMTEzNyw2ICsxMjA4LDEyIEBACiAJCXNlcV9wcmludGYobSwgIk5vIFdheXMgYXJlIGxvY2tlZFxuIik7CiAJfQogI2VuZGlmCisKKwlpZiAoY3B1X251bSAhPSBudW1fcG9zc2libGVfY3B1cygpIC0gMSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoTDJfTEVOR1RIKQorCQlzZXFfcHJpbnRmKG0sICJMMiBTUkFNXHRcdDogJWRLQlxuIiwgTDJfTEVOR1RILzB4NDAwKTsKIAlzZXFfcHJpbnRmKG0sICJib2FyZCBuYW1lXHQ6ICVzXG4iLCBiZmluX2JvYXJkX25hbWUpOwogCXNlcV9wcmludGYobSwgImJvYXJkIG1lbW9yeVx0OiAlbGQga0IgKDB4JXAgLT4gMHglcClcbiIsCiAJCSBwaHlzaWNhbF9tZW1fZW5kID4+IDEwLCAodm9pZCAqKTAsICh2b2lkICopcGh5c2ljYWxfbWVtX2VuZCk7CkBAIC0xMTQ0LDYgKzEyMjEsNyBAQAogCQkoKGludCltZW1vcnlfZW5kIC0gKGludClfc3RleHQpID4+IDEwLAogCQlfc3RleHQsCiAJCSh2b2lkICopbWVtb3J5X2VuZCk7CisJc2VxX3ByaW50ZihtLCAiXG4iKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9rZXJuZWwvdGltZS5jIGIvYXJjaC9ibGFja2Zpbi9rZXJuZWwvdGltZS5jCmluZGV4IGViMjM1MjMuLjE3MmI0YzU4IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2tlcm5lbC90aW1lLmMKKysrIGIvYXJjaC9ibGFja2Zpbi9rZXJuZWwvdGltZS5jCkBAIC0xLDMyICsxLDExIEBACiAvKgotICogRmlsZTogICAgICAgICBhcmNoL2JsYWNrZmluL2tlcm5lbC90aW1lLmMKLSAqIEJhc2VkIG9uOiAgICAgbm9uZSAtIG9yaWdpbmFsIHdvcmsKLSAqIEF1dGhvcjoKKyAqIGFyY2gvYmxhY2tmaW4va2VybmVsL3RpbWUuYwogICoKLSAqIENyZWF0ZWQ6Ci0gKiBEZXNjcmlwdGlvbjogIFRoaXMgZmlsZSBjb250YWlucyB0aGUgYmZpbi1zcGVjaWZpYyB0aW1lIGhhbmRsaW5nIGRldGFpbHMuCi0gKiAgICAgICAgICAgICAgIE1vc3Qgb2YgdGhlIHN0dWZmIGlzIGxvY2F0ZWQgaW4gdGhlIG1hY2hpbmUgc3BlY2lmaWMgZmlsZXMuCi0gKgkJIEZJWE1FOiAoVGhpcyBmaWxlIGlzIHN1YmplY3QgZm9yIHJlbW92YWwpCisgKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIEJsYWNrZmluLXNwZWNpZmljIHRpbWUgaGFuZGxpbmcgZGV0YWlscy4KKyAqIE1vc3Qgb2YgdGhlIHN0dWZmIGlzIGxvY2F0ZWQgaW4gdGhlIG1hY2hpbmUgc3BlY2lmaWMgZmlsZXMuCiAgKgotICogTW9kaWZpZWQ6Ci0gKiAgICAgICAgICAgICAgIENvcHlyaWdodCAyMDA0LTIwMDggQW5hbG9nIERldmljZXMgSW5jLgotICoKLSAqIEJ1Z3M6ICAgICAgICAgRW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCBzZWUgdGhlIGZpbGUgQ09QWUlORywgb3Igd3JpdGUKLSAqIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gKiA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICogQ29weXJpZ2h0IDIwMDQtMjAwOCBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgpAQCAtMzQsMjMgKzEzLDQzIEBACiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvdGltZS5oPgogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAKICNpbmNsdWRlIDxhc20vYmxhY2tmaW4uaD4KICNpbmNsdWRlIDxhc20vdGltZS5oPgorI2luY2x1ZGUgPGFzbS9ncHRpbWVycy5oPgogCiAvKiBUaGlzIGlzIGFuIE5UUCBzZXR0aW5nICovCiAjZGVmaW5lCVRJQ0tfU0laRSAodGlja19uc2VjIC8gMTAwMCkKIAotc3RhdGljIHZvaWQgdGltZV9zY2hlZF9pbml0KGlycV9oYW5kbGVyX3QgdGltZXJfcm91dGluZSk7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyBnZXR0aW1lb2Zmc2V0KHZvaWQpOwotCiBzdGF0aWMgc3RydWN0IGlycWFjdGlvbiBiZmluX3RpbWVyX2lycSA9IHsKLQkubmFtZSA9ICJCRklOIFRpbWVyIFRpY2siLAorCS5uYW1lID0gIkJsYWNrZmluIFRpbWVyIFRpY2siLAorI2lmZGVmIENPTkZJR19JUlFfUEVSX0NQVQorCS5mbGFncyA9IElSUUZfRElTQUJMRUQgfCBJUlFGX1BFUkNQVSwKKyNlbHNlCiAJLmZsYWdzID0gSVJRRl9ESVNBQkxFRAorI2VuZGlmCiB9OwogCi1zdGF0aWMgdm9pZAotdGltZV9zY2hlZF9pbml0KGlycV9oYW5kbGVyX3QgdGltZXJfcm91dGluZSkKKyNpZiBkZWZpbmVkKENPTkZJR19USUNLX1NPVVJDRV9TWVNUTVIwKSB8fCBkZWZpbmVkKENPTkZJR19JUElQRSkKK3ZvaWQgX19pbml0IHNldHVwX3N5c3RlbV90aW1lcjAodm9pZCkKK3sKKwkvKiBQb3dlciBkb3duIHRoZSBjb3JlIHRpbWVyLCBqdXN0IHRvIHBsYXkgc2FmZS4gKi8KKwliZmluX3dyaXRlX1RDTlRMKDApOworCisJZGlzYWJsZV9ncHRpbWVycyhUSU1FUjBiaXQpOworCXNldF9ncHRpbWVyX3N0YXR1cygwLCBUSU1FUl9TVEFUVVNfVFJVTjApOworCXdoaWxlIChnZXRfZ3B0aW1lcl9zdGF0dXMoMCkgJiBUSU1FUl9TVEFUVVNfVFJVTjApCisJCXVkZWxheSgxMCk7CisKKwlzZXRfZ3B0aW1lcl9jb25maWcoMCwgMHg1OSk7IC8qIElSUSBlbmFibGUsIHBlcmlvZGljLCBQV01fT1VULCBTQ0xLZWQsIE9VVCBQQUQgZGlzYWJsZWQgKi8KKwlzZXRfZ3B0aW1lcl9wZXJpb2QoVElNRVIwX2lkLCBnZXRfc2NsaygpIC8gSFopOworCXNldF9ncHRpbWVyX3B3aWR0aChUSU1FUjBfaWQsIDEpOworCVNTWU5DKCk7CisJZW5hYmxlX2dwdGltZXJzKFRJTUVSMGJpdCk7Cit9CisjZWxzZQordm9pZCBfX2luaXQgc2V0dXBfY29yZV90aW1lcih2b2lkKQogewogCXUzMiB0Y291bnQ7CiAKQEAgLTU4LDEwICs1Nyw4IEBACiAJYmZpbl93cml0ZV9UQ05UTCgxKTsKIAlDU1lOQygpOwogCi0JLyoKLQkgKiB0aGUgVFNDQUxFIHByZXNjYWxlciBjb3VudGVyLgotCSAqLwotCWJmaW5fd3JpdGVfVFNDQUxFKChUSU1FX1NDQUxFIC0gMSkpOworCS8qIHRoZSBUU0NBTEUgcHJlc2NhbGVyIGNvdW50ZXIgKi8KKwliZmluX3dyaXRlX1RTQ0FMRShUSU1FX1NDQUxFIC0gMSk7CiAKIAl0Y291bnQgPSAoKGdldF9jY2xrKCkgLyAoSFogKiBUSU1FX1NDQUxFKSkgLSAxKTsKIAliZmluX3dyaXRlX1RQRVJJT0QodGNvdW50KTsKQEAgLTcxLDM1ICs2OCw1MiBAQAogCUNTWU5DKCk7CiAKIAliZmluX3dyaXRlX1RDTlRMKDcpOworfQorI2VuZGlmCiAKLQliZmluX3RpbWVyX2lycS5oYW5kbGVyID0gKGlycV9oYW5kbGVyX3QpdGltZXJfcm91dGluZTsKLQkvKiBjYWxsIHNldHVwX2lycSBpbnN0ZWFkIG9mIHJlcXVlc3RfaXJxIGJlY2F1c2UgcmVxdWVzdF9pcnEgY2FsbHMKLQkgKiBrbWFsbG9jIHdoaWNoIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZCB5ZXQKLQkgKi8KK3N0YXRpYyB2b2lkIF9faW5pdAordGltZV9zY2hlZF9pbml0KGlycXJldHVybl90KCp0aW1lcl9yb3V0aW5lKSAoaW50LCB2b2lkICopKQoreworI2lmIGRlZmluZWQoQ09ORklHX1RJQ0tfU09VUkNFX1NZU1RNUjApIHx8IGRlZmluZWQoQ09ORklHX0lQSVBFKQorCXNldHVwX3N5c3RlbV90aW1lcjAoKTsKKwliZmluX3RpbWVyX2lycS5oYW5kbGVyID0gdGltZXJfcm91dGluZTsKKwlzZXR1cF9pcnEoSVJRX1RJTUVSMCwgJmJmaW5fdGltZXJfaXJxKTsKKyNlbHNlCisJc2V0dXBfY29yZV90aW1lcigpOworCWJmaW5fdGltZXJfaXJxLmhhbmRsZXIgPSB0aW1lcl9yb3V0aW5lOwogCXNldHVwX2lycShJUlFfQ09SRVRNUiwgJmJmaW5fdGltZXJfaXJxKTsKKyNlbmRpZgogfQogCiAvKgogICogU2hvdWxkIHJldHVybiB1c2Vjb25kcyBzaW5jZSBsYXN0IHRpbWVyIHRpY2sKICAqLworI2lmbmRlZiBDT05GSUdfR0VORVJJQ19USU1FCiBzdGF0aWMgdW5zaWduZWQgbG9uZyBnZXR0aW1lb2Zmc2V0KHZvaWQpCiB7CiAJdW5zaWduZWQgbG9uZyBvZmZzZXQ7CiAJdW5zaWduZWQgbG9uZyBjbG9ja3NfcGVyX2ppZmZ5OwogCisjaWYgZGVmaW5lZChDT05GSUdfVElDS19TT1VSQ0VfU1lTVE1SMCkgfHwgZGVmaW5lZChDT05GSUdfSVBJUEUpCisJY2xvY2tzX3Blcl9qaWZmeSA9IGJmaW5fcmVhZF9USU1FUjBfUEVSSU9EKCk7CisJb2Zmc2V0ID0gYmZpbl9yZWFkX1RJTUVSMF9DT1VOVEVSKCkgLyBcCisJCSgoKGNsb2Nrc19wZXJfamlmZnkgKyAxKSAqIEhaKSAvIFVTRUNfUEVSX1NFQyk7CisKKwlpZiAoKGdldF9ncHRpbWVyX3N0YXR1cygwKSAmIFRJTUVSX1NUQVRVU19USU1JTDApICYmIG9mZnNldCA8ICgxMDAwMDAgLyBIWiAvIDIpKQorCQlvZmZzZXQgKz0gKFVTRUNfUEVSX1NFQyAvIEhaKTsKKyNlbHNlCiAJY2xvY2tzX3Blcl9qaWZmeSA9IGJmaW5fcmVhZF9UUEVSSU9EKCk7Ci0Jb2Zmc2V0ID0KLQkgICAgKGNsb2Nrc19wZXJfamlmZnkgLQotCSAgICAgYmZpbl9yZWFkX1RDT1VOVCgpKSAvICgoKGNsb2Nrc19wZXJfamlmZnkgKyAxKSAqIEhaKSAvCi0JCQkJICAgIFVTRUNfUEVSX1NFQyk7CisJb2Zmc2V0ID0gKGNsb2Nrc19wZXJfamlmZnkgLSBiZmluX3JlYWRfVENPVU5UKCkpIC8gXAorCQkoKChjbG9ja3NfcGVyX2ppZmZ5ICsgMSkgKiBIWikgLyBVU0VDX1BFUl9TRUMpOwogCiAJLyogQ2hlY2sgaWYgd2UganVzdCB3cmFwcGVkIHRoZSBjb3VudGVycyBhbmQgbWF5YmUgbWlzc2VkIGEgdGljayAqLwogCWlmICgoYmZpbl9yZWFkX0lMQVQoKSAmICgxIDw8IElSUV9DT1JFVE1SKSkKLQkgICAgJiYgKG9mZnNldCA8ICgxMDAwMDAgLyBIWiAvIDIpKSkKKwkJJiYgKG9mZnNldCA8ICgxMDAwMDAgLyBIWiAvIDIpKSkKIAkJb2Zmc2V0ICs9IChVU0VDX1BFUl9TRUMgLyBIWik7Ci0KKyNlbmRpZgogCXJldHVybiBvZmZzZXQ7CiB9CisjZW5kaWYKIAogc3RhdGljIGlubGluZSBpbnQgc2V0X3J0Y19tbXNzKHVuc2lnbmVkIGxvbmcgbm93dGltZSkKIHsKQEAgLTExMSw0MyArMTI1LDQ5IEBACiAgKiBhcyB3ZWxsIGFzIGNhbGwgdGhlICJkb190aW1lcigpIiByb3V0aW5lIGV2ZXJ5IGNsb2NrdGljawogICovCiAjaWZkZWYgQ09ORklHX0NPUkVfVElNRVJfSVJRX0wxCi1pcnFyZXR1cm5fdCB0aW1lcl9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZHVtbXkpX19hdHRyaWJ1dGVfXygobDFfdGV4dCkpOworX19hdHRyaWJ1dGVfXygobDFfdGV4dCkpCiAjZW5kaWYKLQogaXJxcmV0dXJuX3QgdGltZXJfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmR1bW15KQogewogCS8qIGxhc3QgdGltZSB0aGUgY21vcyBjbG9jayBnb3QgdXBkYXRlZCAqLwogCXN0YXRpYyBsb25nIGxhc3RfcnRjX3VwZGF0ZTsKIAogCXdyaXRlX3NlcWxvY2soJnh0aW1lX2xvY2spOworI2lmIGRlZmluZWQoQ09ORklHX1RJQ0tfU09VUkNFX1NZU1RNUjApICYmICFkZWZpbmVkKENPTkZJR19JUElQRSkKKy8qIEZJWE1FOiBIZXJlIFRJTUlMMCBpcyBub3Qgc2V0IHdoZW4gSVBJUEUgZW5hYmxlZCwgd2h5PyAqLworCWlmIChnZXRfZ3B0aW1lcl9zdGF0dXMoMCkgJiBUSU1FUl9TVEFUVVNfVElNSUwwKSB7CisjZW5kaWYKKwkJZG9fdGltZXIoMSk7CiAKLQlkb190aW1lcigxKTsKLQotCXByb2ZpbGVfdGljayhDUFVfUFJPRklMSU5HKTsKLQotCS8qCi0JICogSWYgd2UgaGF2ZSBhbiBleHRlcm5hbGx5IHN5bmNocm9uaXplZCBMaW51eCBjbG9jaywgdGhlbiB1cGRhdGUKLQkgKiBDTU9TIGNsb2NrIGFjY29yZGluZ2x5IGV2ZXJ5IH4xMSBtaW51dGVzLiBTZXRfcnRjX21tc3MoKSBoYXMgdG8gYmUKLQkgKiBjYWxsZWQgYXMgY2xvc2UgYXMgcG9zc2libGUgdG8gNTAwIG1zIGJlZm9yZSB0aGUgbmV3IHNlY29uZCBzdGFydHMuCi0JICovCi0KLQlpZiAobnRwX3N5bmNlZCgpICYmCi0JICAgIHh0aW1lLnR2X3NlYyA+IGxhc3RfcnRjX3VwZGF0ZSArIDY2MCAmJgotCSAgICAoeHRpbWUudHZfbnNlYyAvIE5TRUNfUEVSX1VTRUMpID49Ci0JICAgIDUwMDAwMCAtICgodW5zaWduZWQpVElDS19TSVpFKSAvIDIKLQkgICAgJiYgKHh0aW1lLnR2X25zZWMgLyBOU0VDX1BFUl9VU0VDKSA8PQotCSAgICA1MDAwMDAgKyAoKHVuc2lnbmVkKVRJQ0tfU0laRSkgLyAyKSB7Ci0JCWlmIChzZXRfcnRjX21tc3MoeHRpbWUudHZfc2VjKSA9PSAwKQotCQkJbGFzdF9ydGNfdXBkYXRlID0geHRpbWUudHZfc2VjOwotCQllbHNlCi0JCQkvKiBEbyBpdCBhZ2FpbiBpbiA2MHMuICovCi0JCQlsYXN0X3J0Y191cGRhdGUgPSB4dGltZS50dl9zZWMgLSA2MDA7CisJCS8qCisJCSAqIElmIHdlIGhhdmUgYW4gZXh0ZXJuYWxseSBzeW5jaHJvbml6ZWQgTGludXggY2xvY2ssIHRoZW4gdXBkYXRlCisJCSAqIENNT1MgY2xvY2sgYWNjb3JkaW5nbHkgZXZlcnkgfjExIG1pbnV0ZXMuIFNldF9ydGNfbW1zcygpIGhhcyB0byBiZQorCQkgKiBjYWxsZWQgYXMgY2xvc2UgYXMgcG9zc2libGUgdG8gNTAwIG1zIGJlZm9yZSB0aGUgbmV3IHNlY29uZCBzdGFydHMuCisJCSAqLworCQlpZiAobnRwX3N5bmNlZCgpICYmCisJCSAgICB4dGltZS50dl9zZWMgPiBsYXN0X3J0Y191cGRhdGUgKyA2NjAgJiYKKwkJICAgICh4dGltZS50dl9uc2VjIC8gTlNFQ19QRVJfVVNFQykgPj0KKwkJICAgIDUwMDAwMCAtICgodW5zaWduZWQpVElDS19TSVpFKSAvIDIKKwkJICAgICYmICh4dGltZS50dl9uc2VjIC8gTlNFQ19QRVJfVVNFQykgPD0KKwkJICAgIDUwMDAwMCArICgodW5zaWduZWQpVElDS19TSVpFKSAvIDIpIHsKKwkJCWlmIChzZXRfcnRjX21tc3MoeHRpbWUudHZfc2VjKSA9PSAwKQorCQkJCWxhc3RfcnRjX3VwZGF0ZSA9IHh0aW1lLnR2X3NlYzsKKwkJCWVsc2UKKwkJCQkvKiBEbyBpdCBhZ2FpbiBpbiA2MHMuICovCisJCQkJbGFzdF9ydGNfdXBkYXRlID0geHRpbWUudHZfc2VjIC0gNjAwOworCQl9CisjaWYgZGVmaW5lZChDT05GSUdfVElDS19TT1VSQ0VfU1lTVE1SMCkgJiYgIWRlZmluZWQoQ09ORklHX0lQSVBFKQorCQlzZXRfZ3B0aW1lcl9zdGF0dXMoMCwgVElNRVJfU1RBVFVTX1RJTUlMMCk7CiAJfQorI2VuZGlmCiAJd3JpdGVfc2VxdW5sb2NrKCZ4dGltZV9sb2NrKTsKIAotI2lmbmRlZiBDT05GSUdfU01QCisjaWZkZWYgQ09ORklHX0lQSVBFCisJdXBkYXRlX3Jvb3RfcHJvY2Vzc190aW1lcyhnZXRfaXJxX3JlZ3MoKSk7CisjZWxzZQogCXVwZGF0ZV9wcm9jZXNzX3RpbWVzKHVzZXJfbW9kZShnZXRfaXJxX3JlZ3MoKSkpOwogI2VuZGlmCisJcHJvZmlsZV90aWNrKENQVV9QUk9GSUxJTkcpOwogCiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9rZXJuZWwvdHJhcHMuYyBiL2FyY2gvYmxhY2tmaW4va2VybmVsL3RyYXBzLmMKaW5kZXggYmVmMDI1Yi4uNWIwNjY3ZCAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9rZXJuZWwvdHJhcHMuYworKysgYi9hcmNoL2JsYWNrZmluL2tlcm5lbC90cmFwcy5jCkBAIC0zMiw2ICszMiw3IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgva2FsbHN5bXMuaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3JidHJlZS5oPgogI2luY2x1ZGUgPGFzbS90cmFwcy5oPgogI2luY2x1ZGUgPGFzbS9jYWNoZWZsdXNoLmg+CiAjaW5jbHVkZSA8YXNtL2NwbGIuaD4KQEAgLTc1LDE2ICs3Niw2IEBACiAJQ1NZTkMoKTsKIH0KIAotLyoKLSAqIFVzZWQgdG8gc2F2ZSB0aGUgUkVUWCwgU0VRU1RBVCwgSS9EIENQTEIgRkFVTFQgQUREUgotICogdmFsdWVzIGFjcm9zcyB0aGUgdHJhbnNpdGlvbiBmcm9tIGV4Y2VwdGlvbiB0byBJUlE1LgotICogV2UgcHV0IHRoZXNlIGluIEwxLCBzbyB0aGV5IGFyZSBnb2luZyB0byBiZSBpbiBhIHZhbGlkCi0gKiBsb2NhdGlvbiBkdXJpbmcgZXhjZXB0aW9uIGNvbnRleHQKLSAqLwotX19hdHRyaWJ1dGVfXygobDFfZGF0YSkpCi11bnNpZ25lZCBsb25nIHNhdmVkX3JldHgsIHNhdmVkX3NlcXN0YXQsCi0Jc2F2ZWRfaWNwbGJfZmF1bHRfYWRkciwgc2F2ZWRfZGNwbGJfZmF1bHRfYWRkcjsKLQogc3RhdGljIHZvaWQgZGVjb2RlX2FkZHJlc3MoY2hhciAqYnVmLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MpCiB7CiAjaWZkZWYgQ09ORklHX0RFQlVHX1ZFUkJPU0UKQEAgLTkzLDYgKzg0LDcgQEAKIAlzdHJ1Y3QgbW1fc3RydWN0ICptbTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzLCBvZmZzZXQ7CiAJdW5zaWduZWQgY2hhciBpbl9hdG9taWMgPSAoYmZpbl9yZWFkX0lQRU5EKCkgJiAweDEwKSB8fCBpbl9hdG9taWMoKTsKKwlzdHJ1Y3QgcmJfbm9kZSAqbjsKIAogI2lmZGVmIENPTkZJR19LQUxMU1lNUwogCXVuc2lnbmVkIGxvbmcgc3ltc2l6ZTsKQEAgLTEzOCw5ICsxMzAsMTAgQEAKIAkJaWYgKCFtbSkKIAkJCWNvbnRpbnVlOwogCi0JCXZtbCA9IG1tLT5jb250ZXh0LnZtbGlzdDsKLQkJd2hpbGUgKHZtbCkgewotCQkJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEgPSB2bWwtPnZtYTsKKwkJZm9yIChuID0gcmJfZmlyc3QoJm1tLT5tbV9yYik7IG47IG4gPSByYl9uZXh0KG4pKSB7CisJCQlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYTsKKworCQkJdm1hID0gcmJfZW50cnkobiwgc3RydWN0IHZtX2FyZWFfc3RydWN0LCB2bV9yYik7CiAKIAkJCWlmIChhZGRyZXNzID49IHZtYS0+dm1fc3RhcnQgJiYgYWRkcmVzcyA8IHZtYS0+dm1fZW5kKSB7CiAJCQkJY2hhciBfdG1wYnVmWzI1Nl07CkBAIC0xODYsOCArMTc5LDYgQEAKIAogCQkJCWdvdG8gZG9uZTsKIAkJCX0KLQotCQkJdm1sID0gdm1sLT5uZXh0OwogCQl9CiAJCWlmICghaW5fYXRvbWljKQogCQkJbW1wdXQobW0pOwpAQCAtMjExLDE4ICsyMDIsMTggQEAKIAlwcmludGsoS0VSTl9FTUVSRyAiXG4iIEtFUk5fRU1FUkcgIkRvdWJsZSBGYXVsdFxuIik7CiAjaWZkZWYgQ09ORklHX0RFQlVHX0RPVUJMRUZBVUxUX1BSSU5UCiAJaWYgKCgobG9uZylmcC0+c2Vxc3RhdCAmICBTRVFTVEFUX0VYQ0FVU0UpID09IFZFQ19VTkNPVikgeworCQl1bnNpZ25lZCBpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwogCQljaGFyIGJ1ZlsxNTBdOwotCQlkZWNvZGVfYWRkcmVzcyhidWYsIHNhdmVkX3JldHgpOworCQlkZWNvZGVfYWRkcmVzcyhidWYsIGNwdV9wZGFbY3B1XS5yZXR4KTsKIAkJcHJpbnRrKEtFUk5fRU1FUkcgIldoaWxlIGhhbmRsaW5nIGV4Y2VwdGlvbiAoRVhDQVVTRSA9IDB4JXgpIGF0ICVzOlxuIiwKLQkJCShpbnQpc2F2ZWRfc2Vxc3RhdCAmIFNFUVNUQVRfRVhDQVVTRSwgYnVmKTsKLQkJZGVjb2RlX2FkZHJlc3MoYnVmLCBzYXZlZF9kY3BsYl9mYXVsdF9hZGRyKTsKKwkJCSh1bnNpZ25lZCBpbnQpY3B1X3BkYVtjcHVdLnNlcXN0YXQgJiBTRVFTVEFUX0VYQ0FVU0UsIGJ1Zik7CisJCWRlY29kZV9hZGRyZXNzKGJ1ZiwgY3B1X3BkYVtjcHVdLmRjcGxiX2ZhdWx0X2FkZHIpOwogCQlwcmludGsoS0VSTl9OT1RJQ0UgIiAgIERDUExCX0ZBVUxUX0FERFI6ICVzXG4iLCBidWYpOwotCQlkZWNvZGVfYWRkcmVzcyhidWYsIHNhdmVkX2ljcGxiX2ZhdWx0X2FkZHIpOworCQlkZWNvZGVfYWRkcmVzcyhidWYsIGNwdV9wZGFbY3B1XS5pY3BsYl9mYXVsdF9hZGRyKTsKIAkJcHJpbnRrKEtFUk5fTk9USUNFICIgICBJQ1BMQl9GQVVMVF9BRERSOiAlc1xuIiwgYnVmKTsKIAogCQlkZWNvZGVfYWRkcmVzcyhidWYsIGZwLT5yZXR4KTsKLQkJcHJpbnRrKEtFUk5fTk9USUNFICJUaGUgaW5zdHJ1Y3Rpb24gYXQgJXMgY2F1c2VkIGEgZG91YmxlIGV4Y2VwdGlvblxuIiwKLQkJCWJ1Zik7CisJCXByaW50ayhLRVJOX05PVElDRSAiVGhlIGluc3RydWN0aW9uIGF0ICVzIGNhdXNlZCBhIGRvdWJsZSBleGNlcHRpb25cbiIsIGJ1Zik7CiAJfSBlbHNlCiAjZW5kaWYKIAl7CkBAIC0yNDAsNiArMjMxLDkgQEAKICNpZmRlZiBDT05GSUdfREVCVUdfQkZJTl9IV1RSQUNFX09OCiAJaW50IGo7CiAjZW5kaWYKKyNpZmRlZiBDT05GSUdfREVCVUdfSFVOVF9GT1JfWkVSTworCXVuc2lnbmVkIGludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisjZW5kaWYKIAlpbnQgc2lnID0gMDsKIAlzaWdpbmZvX3QgaW5mbzsKIAl1bnNpZ25lZCBsb25nIHRyYXBuciA9IGZwLT5zZXFzdGF0ICYgU0VRU1RBVF9FWENBVVNFOwpAQCAtNDE3LDcgKzQxMSw3IEBACiAJCWluZm8uc2lfY29kZSA9IElMTF9DUExCX01VTEhJVDsKIAkJc2lnID0gU0lHU0VHVjsKICNpZmRlZiBDT05GSUdfREVCVUdfSFVOVF9GT1JfWkVSTwotCQlpZiAoc2F2ZWRfZGNwbGJfZmF1bHRfYWRkciA8IEZJWEVEX0NPREVfU1RBUlQpCisJCWlmIChjcHVfcGRhW2NwdV0uZGNwbGJfZmF1bHRfYWRkciA8IEZJWEVEX0NPREVfU1RBUlQpCiAJCQl2ZXJib3NlX3ByaW50ayhLRVJOX05PVElDRSAiTlVMTCBwb2ludGVyIGFjY2Vzc1xuIik7CiAJCWVsc2UKICNlbmRpZgpAQCAtNDcxLDcgKzQ2NSw3IEBACiAJCWluZm8uc2lfY29kZSA9IElMTF9DUExCX01VTEhJVDsKIAkJc2lnID0gU0lHU0VHVjsKICNpZmRlZiBDT05GSUdfREVCVUdfSFVOVF9GT1JfWkVSTwotCQlpZiAoc2F2ZWRfaWNwbGJfZmF1bHRfYWRkciA8IEZJWEVEX0NPREVfU1RBUlQpCisJCWlmIChjcHVfcGRhW2NwdV0uaWNwbGJfZmF1bHRfYWRkciA8IEZJWEVEX0NPREVfU1RBUlQpCiAJCQl2ZXJib3NlX3ByaW50ayhLRVJOX05PVElDRSAiSnVtcCB0byBOVUxMIGFkZHJlc3NcbiIpOwogCQllbHNlCiAjZW5kaWYKQEAgLTU4NCwxMCArNTc4LDE1IEBACiAJCX0KIAl9CiAKLQlpbmZvLnNpX3NpZ25vID0gc2lnOwotCWluZm8uc2lfZXJybm8gPSAwOwotCWluZm8uc2lfYWRkciA9ICh2b2lkIF9fdXNlciAqKWZwLT5wYzsKLQlmb3JjZV9zaWdfaW5mbyhzaWcsICZpbmZvLCBjdXJyZW50KTsKKyNpZmRlZiBDT05GSUdfSVBJUEUKKwlpZiAoIWlwaXBlX3RyYXBfbm90aWZ5KGZwLT5zZXFzdGF0ICYgMHgzZiwgZnApKQorI2VuZGlmCisJeworCQlpbmZvLnNpX3NpZ25vID0gc2lnOworCQlpbmZvLnNpX2Vycm5vID0gMDsKKwkJaW5mby5zaV9hZGRyID0gKHZvaWQgX191c2VyICopZnAtPnBjOworCQlmb3JjZV9zaWdfaW5mbyhzaWcsICZpbmZvLCBjdXJyZW50KTsKKwl9CiAKIAl0cmFjZV9idWZmZXJfcmVzdG9yZShqKTsKIAlyZXR1cm47CkBAIC02NTYsMTMgKzY1NSwxMyBAQAogCXJldHVybiBmYWxzZTsKIH0KIAotLyogCisvKgogICogZGVjb2RlIHRoZSBpbnN0cnVjdGlvbiBpZiB3ZSBhcmUgcHJpbnRpbmcgb3V0IHRoZSB0cmFjZSwgYXMgaXQKICAqIG1ha2VzIHRoaW5ncyBlYXNpZXIgdG8gZm9sbG93LCB3aXRob3V0IHJ1bm5pbmcgaXQgdGhyb3VnaCBvYmpkdW1wCiAgKiBUaGVzZSBhcmUgdGhlIG5vcm1hbCBpbnN0cnVjdGlvbnMgd2hpY2ggY2F1c2UgY2hhbmdlIG9mIGZsb3csIHdoaWNoCiAgKiB3b3VsZCBiZSBhdCB0aGUgc291cmNlIG9mIHRoZSB0cmFjZSBidWZmZXIKICAqLwotI2lmZGVmIENPTkZJR19ERUJVR19WRVJCT1NFCisjaWYgZGVmaW5lZChDT05GSUdfREVCVUdfVkVSQk9TRSkgJiYgZGVmaW5lZChDT05GSUdfREVCVUdfQkZJTl9IV1RSQUNFX09OKQogc3RhdGljIHZvaWQgZGVjb2RlX2luc3RydWN0aW9uKHVuc2lnbmVkIHNob3J0ICphZGRyZXNzKQogewogCXVuc2lnbmVkIHNob3J0IG9wY29kZTsKQEAgLTg0Niw3ICs4NDUsNyBAQAogCX0KIAlpZiAoZnApIHsKIAkJZnJhbWUgPSBmcDsKLQkJcHJpbnRrKCIgRlA6ICgweCVwKVxuIiwgZnApOworCQlwcmludGsoS0VSTl9OT1RJQ0UgIiBGUDogKDB4JXApXG4iLCBmcCk7CiAJfSBlbHNlCiAJCWZyYW1lID0gMDsKIApAQCAtOTYwLDYgKzk1OSw3IEBACiAJCWVsc2UKIAkJCXZlcmJvc2VfcHJpbnRrKEtFUk5fTk9USUNFICJDT01NPSBpbnZhbGlkXG4iKTsKIAorCQlwcmludGsoS0VSTl9OT1RJQ0UgIkNQVSA9ICVkXG4iLCBjdXJyZW50X3RocmVhZF9pbmZvKCktPmNwdSk7CiAJCWlmICghKCh1bnNpZ25lZCBsb25nKWN1cnJlbnQtPm1tICYgMHgzKSAmJiAodW5zaWduZWQgbG9uZyljdXJyZW50LT5tbSA+PSBGSVhFRF9DT0RFX1NUQVJUKQogCQkJdmVyYm9zZV9wcmludGsoS0VSTl9OT1RJQ0UgICJURVhUID0gMHglcC0weCVwICAgICAgICBEQVRBID0gMHglcC0weCVwXG4iCiAJCQkJS0VSTl9OT1RJQ0UgIiBCU1MgPSAweCVwLTB4JXAgIFVTRVItU1RBQ0sgPSAweCVwXG4iCkBAIC0xMDUzLDYgKzEwNTMsNyBAQAogCXN0cnVjdCBpcnFhY3Rpb24gKmFjdGlvbjsKIAl1bnNpZ25lZCBpbnQgaTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CiAKIAl2ZXJib3NlX3ByaW50ayhLRVJOX05PVElDRSAiXG4iIEtFUk5fTk9USUNFICJTRVFVRU5DRVIgU1RBVFVTOlx0XHQlc1xuIiwgcHJpbnRfdGFpbnRlZCgpKTsKIAl2ZXJib3NlX3ByaW50ayhLRVJOX05PVElDRSAiIFNFUVNUQVQ6ICUwOGx4ICBJUEVORDogJTA0bHggIFNZU0NGRzogJTA0bHhcbiIsCkBAIC0xMTEyLDkgKzExMTMsOSBAQAogCiAJaWYgKCgobG9uZylmcC0+c2Vxc3RhdCAmICBTRVFTVEFUX0VYQ0FVU0UpICYmCiAJICAgICgoKGxvbmcpZnAtPnNlcXN0YXQgJiBTRVFTVEFUX0VYQ0FVU0UpICE9IFZFQ19IV0VSUikpIHsKLQkJZGVjb2RlX2FkZHJlc3MoYnVmLCBzYXZlZF9kY3BsYl9mYXVsdF9hZGRyKTsKKwkJZGVjb2RlX2FkZHJlc3MoYnVmLCBjcHVfcGRhW2NwdV0uZGNwbGJfZmF1bHRfYWRkcik7CiAJCXZlcmJvc2VfcHJpbnRrKEtFUk5fTk9USUNFICJEQ1BMQl9GQVVMVF9BRERSOiAlc1xuIiwgYnVmKTsKLQkJZGVjb2RlX2FkZHJlc3MoYnVmLCBzYXZlZF9pY3BsYl9mYXVsdF9hZGRyKTsKKwkJZGVjb2RlX2FkZHJlc3MoYnVmLCBjcHVfcGRhW2NwdV0uaWNwbGJfZmF1bHRfYWRkcik7CiAJCXZlcmJvc2VfcHJpbnRrKEtFUk5fTk9USUNFICJJQ1BMQl9GQVVMVF9BRERSOiAlc1xuIiwgYnVmKTsKIAl9CiAKQEAgLTExNTMsMjAgKzExNTQsMjEgQEAKIGFzbWxpbmthZ2UgaW50IHN5c19iZmluX3NwaW5sb2NrKGludCAqc3BpbmxvY2spX19hdHRyaWJ1dGVfXygobDFfdGV4dCkpOwogI2VuZGlmCiAKLWFzbWxpbmthZ2UgaW50IHN5c19iZmluX3NwaW5sb2NrKGludCAqc3BpbmxvY2spCi17Ci0JaW50IHJldCA9IDA7Ci0JaW50IHRtcCA9IDA7CitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGJmaW5fc3BpbmxvY2tfbG9jayk7CiAKLQlsb2NhbF9pcnFfZGlzYWJsZSgpOwotCXJldCA9IGdldF91c2VyKHRtcCwgc3BpbmxvY2spOwotCWlmIChyZXQgPT0gMCkgewotCQlpZiAodG1wKQorYXNtbGlua2FnZSBpbnQgc3lzX2JmaW5fc3BpbmxvY2soaW50ICpwKQoreworCWludCByZXQsIHRtcCA9IDA7CisKKwlzcGluX2xvY2soJmJmaW5fc3BpbmxvY2tfbG9jayk7CS8qIFRoaXMgd291bGQgYWxzbyBob2xkIGtlcm5lbCBwcmVlbXB0aW9uLiAqLworCXJldCA9IGdldF91c2VyKHRtcCwgcCk7CisJaWYgKGxpa2VseShyZXQgPT0gMCkpIHsKKwkJaWYgKHVubGlrZWx5KHRtcCkpCiAJCQlyZXQgPSAxOwotCQl0bXAgPSAxOwotCQlwdXRfdXNlcih0bXAsIHNwaW5sb2NrKTsKKwkJZWxzZQorCQkJcHV0X3VzZXIoMSwgcCk7CiAJfQotCWxvY2FsX2lycV9lbmFibGUoKTsKKwlzcGluX3VubG9jaygmYmZpbl9zcGlubG9ja19sb2NrKTsKIAlyZXR1cm4gcmV0OwogfQogCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2tlcm5lbC92bWxpbnV4Lmxkcy5TIGIvYXJjaC9ibGFja2Zpbi9rZXJuZWwvdm1saW51eC5sZHMuUwppbmRleCA3ZDEyYzY2Li40YjQzNDFkIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2tlcm5lbC92bWxpbnV4Lmxkcy5TCisrKyBiL2FyY2gvYmxhY2tmaW4va2VybmVsL3ZtbGludXgubGRzLlMKQEAgLTY4LDYgKzY4LDggQEAKIAkJX19ldGV4dCA9IC47CiAJfQogCisJTk9URVMKKwogCS8qIEp1c3QgaW4gY2FzZSB0aGUgZmlyc3QgcmVhZCBvbmx5IGlzIGEgMzItYml0IGFjY2VzcyAqLwogCVJPX0RBVEEoNCkKIApAQCAtMTA5LDcgKzExMSw2IEBACiAjZW5kaWYKIAogCQlEQVRBX0RBVEEKLQkJKiguZGF0YS4qKQogCQlDT05TVFJVQ1RPUlMKIAogCQkvKiBtYWtlIHN1cmUgdGhlIGluaXRfdGFzayBpcyBhbGlnbmVkIHRvIHRoZQpAQCAtMTYxLDEyICsxNjIsMTQgQEAKIAkJKiguY29uX2luaXRjYWxsLmluaXQpCiAJCV9fX2Nvbl9pbml0Y2FsbF9lbmQgPSAuOwogCX0KKwlQRVJDUFUoNCkKIAlTRUNVUklUWV9JTklUCiAJLmluaXQucmFtZnMgOgogCXsKIAkJLiA9IEFMSUdOKDQpOwogCQlfX19pbml0cmFtZnNfc3RhcnQgPSAuOwogCQkqKC5pbml0LnJhbWZzKQorCQkuID0gQUxJR04oNCk7CiAJCV9fX2luaXRyYW1mc19lbmQgPSAuOwogCX0KIApAQCAtMjEyLDcgKzIxNSw3IEBACiAJCV9fZWJzc19iX2wxID0gLjsKIAl9CiAKLQlfX2wyX2xtYV9zdGFydCA9IC47CisJX19sMl9sbWFfc3RhcnQgPSBMT0FEQUREUiguZGF0YV9iX2wxKSArIFNJWkVPRiguZGF0YV9iX2wxKTsKIAogCS50ZXh0X2RhdGFfbDIgTDJfU1RBUlQgOiBBVChMT0FEQUREUiguZGF0YV9iX2wxKSArIFNJWkVPRiguZGF0YV9iX2wxKSkKIAl7CkBAIC0yNDAsNyArMjQzLDcgQEAKIAkvKiBGb3JjZSB0cmFpbGluZyBhbGlnbm1lbnQgb2Ygb3VyIGluaXQgc2VjdGlvbiBzbyB0aGF0IHdoZW4gd2UKIAkgKiBmcmVlIG91ciBpbml0IG1lbW9yeSwgd2UgZG9uJ3QgbGVhdmUgYmVoaW5kIGEgcGFydGlhbCBwYWdlLgogCSAqLwotCS4gPSBMT0FEQUREUiguZGF0YV9iX2wxKSArIFNJWkVPRiguZGF0YV9iX2wxKTsKKwkuID0gTE9BREFERFIoLnRleHRfZGF0YV9sMikgKyBTSVpFT0YoLnRleHRfZGF0YV9sMik7CiAJLiA9IEFMSUdOKFBBR0VfU0laRSk7CiAJX19faW5pdF9lbmQgPSAuOwogCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2xpYi9jaGVja3N1bS5jIGIvYXJjaC9ibGFja2Zpbi9saWIvY2hlY2tzdW0uYwppbmRleCA1Yzg3NTA1Li43NjJhN2YwIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2xpYi9jaGVja3N1bS5jCisrKyBiL2FyY2gvYmxhY2tmaW4vbGliL2NoZWNrc3VtLmMKQEAgLTI5LDYgKzI5LDcgQEAKICAqIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPG5ldC9jaGVja3N1bS5oPgogI2luY2x1ZGUgPGFzbS9jaGVja3N1bS5oPgogCkBAIC03Niw2ICs3Nyw3IEBACiB7CiAJcmV0dXJuIChfX2ZvcmNlIF9fc3VtMTYpfmRvX2NzdW0oaXBoLCBpaGwgKiA0KTsKIH0KK0VYUE9SVF9TWU1CT0woaXBfZmFzdF9jc3VtKTsKIAogLyoKICAqIGNvbXB1dGVzIHRoZSBjaGVja3N1bSBvZiBhIG1lbW9yeSBibG9jayBhdCBidWZmLCBsZW5ndGggbGVuLApAQCAtMTA0LDYgKzEwNiw3IEBACiAKIAlyZXR1cm4gc3VtOwogfQorRVhQT1JUX1NZTUJPTChjc3VtX3BhcnRpYWwpOwogCiAvKgogICogdGhpcyByb3V0aW5lIGlzIHVzZWQgZm9yIG1pc2NlbGxhbmVvdXMgSVAtbGlrZSBjaGVja3N1bXMsIG1haW5seQpAQCAtMTM3LDMgKzE0MCw0IEBACiAJbWVtY3B5KGRzdCwgc3JjLCBsZW4pOwogCXJldHVybiBjc3VtX3BhcnRpYWwoZHN0LCBsZW4sIHN1bSk7CiB9CitFWFBPUlRfU1lNQk9MKGNzdW1fcGFydGlhbF9jb3B5KTsKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbGliL2lucy5TIGIvYXJjaC9ibGFja2Zpbi9saWIvaW5zLlMKaW5kZXggZDYwNTU0ZC4uMTg2M2E2YiAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9saWIvaW5zLlMKKysrIGIvYXJjaC9ibGFja2Zpbi9saWIvaW5zLlMKQEAgLTEsMzEgKzEsOSBAQAogLyoKLSAqIEZpbGU6ICAgICAgICAgYXJjaC9ibGFja2Zpbi9saWIvaW5zLlMKLSAqIEJhc2VkIG9uOgotICogQXV0aG9yOiAgICAgICBCYXMgVmVybWV1bGVuIDxiYXNAYnV5d2F5cy5ubD4KKyAqIGFyY2gvYmxhY2tmaW4vbGliL2lucy5TIC0gaW5ze2J3bH0gdXNpbmcgaGFyZHdhcmUgbG9vcHMKICAqCi0gKiBDcmVhdGVkOiAgICAgIFR1ZSBNYXIgMjIgMTU6Mjc6MjQgQ0VTVCAyMDA1Ci0gKiBEZXNjcmlwdGlvbjogIEltcGxlbWVudGF0aW9uIG9mIGluc3tid2x9IGZvciBCbGFja0ZpbiBwcm9jZXNzb3JzIHVzaW5nIHplcm8gb3ZlcmhlYWQgbG9vcHMuCi0gKgotICogTW9kaWZpZWQ6Ci0gKiAgICAgICAgICAgICAgIENvcHlyaWdodCAyMDA0LTIwMDggQW5hbG9nIERldmljZXMgSW5jLgotICogICAgICAgICAgICAgICBDb3B5cmlnaHQgKEMpIDIwMDUgQmFzIFZlcm1ldWxlbiwgQnV5V2F5cyBCViA8YmFzQGJ1eXdheXMubmw+Ci0gKgotICogQnVnczogICAgICAgICBFbnRlciBidWdzIGF0IGh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZy8KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSB0aGUgZmlsZSBDT1BZSU5HLCBvciB3cml0ZQotICogdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAqIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKiBDb3B5cmlnaHQgMjAwNC0yMDA4IEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAwNSBCYXMgVmVybWV1bGVuLCBCdXlXYXlzIEJWIDxiYXNAYnV5d2F5cy5ubD4KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KICAqLwogCiAjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgpAQCAtMzMsNiArMTEsNDYgQEAKIAogLmFsaWduIDIKIAorI2lmZGVmIENPTkZJR19JUElQRQorIyBkZWZpbmUgRE9fQ0xJIFwKKwlbLS1zcF0gPSByZXRzOyBcCisJWy0tc3BdID0gKFA1OjApOyBcCisJc3AgKz0gLTEyOyBcCisJY2FsbCBfX19pcGlwZV9zdGFsbF9yb290X3JhdzsgXAorCXNwICs9IDEyOyBcCisJKFA1OjApID0gW3NwKytdOworIyBkZWZpbmUgQ0xJX0lOTkVSX05PUAorI2Vsc2UKKyMgZGVmaW5lIERPX0NMSSBjbGkgUjM7CisjIGRlZmluZSBDTElfSU5ORVJfTk9QIG5vcDsgbm9wOyBub3A7CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19JUElQRQorIyBkZWZpbmUgRE9fU1RJIFwKKwlzcCArPSAtMTI7IFwKKwljYWxsIF9fX2lwaXBlX3Vuc3RhbGxfcm9vdF9yYXc7IFwKKwlzcCArPSAxMjsgXAorMjoJcmV0cyA9IFtzcCsrXTsKKyNlbHNlCisjIGRlZmluZSBET19TVEkgMjogc3RpIFIzOworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfQkZJTl9JTlNfTE9XT1ZFUkhFQUQKKyMgZGVmaW5lIENMSV9PVVRFUiBET19DTEk7CisjIGRlZmluZSBTVElfT1VURVIgRE9fU1RJOworIyBkZWZpbmUgQ0xJX0lOTkVSIDE6CisjIGlmIEFOT01BTFlfMDUwMDA0MTYKKyMgIGRlZmluZSBTVElfSU5ORVIgbm9wOyAyOiBub3A7CisjIGVsc2UKKyMgIGRlZmluZSBTVElfSU5ORVIgMjoKKyMgZW5kaWYKKyNlbHNlCisjIGRlZmluZSBDTElfT1VURVIKKyMgZGVmaW5lIFNUSV9PVVRFUgorIyBkZWZpbmUgQ0xJX0lOTkVSIDE6IERPX0NMSTsgQ0xJX0lOTkVSX05PUDsKKyMgZGVmaW5lIFNUSV9JTk5FUiBET19TVEk7CisjZW5kaWYKKwogLyoKICAqIFJlYWRzIG9uIHRoZSBCbGFja2ZpbiBhcmUgc3BlY3VsYXRpdmUuIEluIEJsYWNrZmluIHRlcm1zLCB0aGlzIG1lYW5zIHRoZXkKICAqIGNhbiBiZSBpbnRlcnJ1cHRlZCBhdCBhbnkgdGltZSAoZXZlbiBhZnRlciB0aGV5IGhhdmUgYmVlbiBpc3N1ZWQgb24gdG8gdGhlCkBAIC01MywxNzAgKzcxLDQ4IEBACiAgKiBidWZmZXJzIGluL291dCBvZiBGSUZPcy4KICAqLwogCi1FTlRSWShfaW5zbCkKLSNpZmRlZiBDT05GSUdfQkZJTl9JTlNfTE9XT1ZFUkhFQUQKLQlQMCA9IFIwOwkvKiBQMCA9IHBvcnQgKi8KLQljbGkgUjM7Ci0JUDEgPSBSMTsJLyogUDEgPSBhZGRyZXNzICovCi0JUDIgPSBSMjsJLyogUDIgPSBjb3VudCAqLwotCVNTWU5DOwotCUxTRVRVUCggLkxsb25nX2xvb3BfcywgLkxsb25nX2xvb3BfZSkgTEMwID0gUDI7Ci0uTGxvbmdfbG9vcF9zOiAgUjAgPSBbUDBdOwotCQlbUDErK10gPSBSMDsKLQkJTk9QOwotLkxsb25nX2xvb3BfZTogCU5PUDsKLQlzdGkgUjM7Ci0JUlRTOwotI2Vsc2UKLQlQMCA9IFIwOwkvKiBQMCA9IHBvcnQgKi8KLQlQMSA9IFIxOwkvKiBQMSA9IGFkZHJlc3MgKi8KLQlQMiA9IFIyOwkvKiBQMiA9IGNvdW50ICovCi0JU1NZTkM7Ci0JTFNFVFVQKCAuTGxvbmdfbG9vcF9zLCAuTGxvbmdfbG9vcF9lKSBMQzAgPSBQMjsKLS5MbG9uZ19sb29wX3M6Ci0JQ0xJIFIzOwotCU5PUDsgTk9QOyBOT1A7Ci0JUjAgPSBbUDBdOwotCVtQMSsrXSA9IFIwOwotLkxsb25nX2xvb3BfZToKLQlTVEkgUjM7CisjZGVmaW5lIENPTU1PTl9JTlMoZnVuYywgb3BzKSBcCitFTlRSWShfaW5zIyNmdW5jKSBcCisJUDAgPSBSMDsJLyogUDAgPSBwb3J0ICovIFwKKwlDTElfT1VURVI7CS8qIDMgaW5zdHJ1Y3Rpb25zIGJlZm9yZSBmaXJzdCByZWFkIGFjY2VzcyAqLyBcCisJUDEgPSBSMTsJLyogUDEgPSBhZGRyZXNzICovIFwKKwlQMiA9IFIyOwkvKiBQMiA9IGNvdW50ICovIFwKKwlTU1lOQzsgXAorIFwKKwlMU0VUVVAoMWYsIDJmKSBMQzAgPSBQMjsgXAorCUNMSV9JTk5FUjsgXAorCW9wczsgXAorCVNUSV9JTk5FUjsgXAorIFwKKwlTVElfT1VURVI7IFwKKwlSVFM7IFwKK0VORFBST0MoX2lucyMjZnVuYykKIAotCVJUUzsKLSNlbmRpZgotRU5EUFJPQyhfaW5zbCkKK0NPTU1PTl9JTlMobCwgXAorCVIwID0gW1AwXTsgXAorCVtQMSsrXSA9IFIwOyBcCispCiAKLUVOVFJZKF9pbnN3KQotI2lmZGVmIENPTkZJR19CRklOX0lOU19MT1dPVkVSSEVBRAotCVAwID0gUjA7CS8qIFAwID0gcG9ydCAqLwotCWNsaSBSMzsKLQlQMSA9IFIxOwkvKiBQMSA9IGFkZHJlc3MgKi8KLQlQMiA9IFIyOwkvKiBQMiA9IGNvdW50ICovCi0JU1NZTkM7Ci0JTFNFVFVQKCAuTHdvcmRfbG9vcF9zLCAuTHdvcmRfbG9vcF9lKSBMQzAgPSBQMjsKLS5Md29yZF9sb29wX3M6ICBSMCA9IFdbUDBdOwotCQlXW1AxKytdID0gUjA7Ci0JCU5PUDsKLS5Md29yZF9sb29wX2U6IAlOT1A7Ci0Jc3RpIFIzOwotCVJUUzsKLSNlbHNlCi0JUDAgPSBSMDsJLyogUDAgPSBwb3J0ICovCi0JUDEgPSBSMTsJLyogUDEgPSBhZGRyZXNzICovCi0JUDIgPSBSMjsJLyogUDIgPSBjb3VudCAqLwotCVNTWU5DOwotCUxTRVRVUCggLkx3b3JkX2xvb3BfcywgLkx3b3JkX2xvb3BfZSkgTEMwID0gUDI7Ci0uTHdvcmRfbG9vcF9zOgotCUNMSSBSMzsKLQlOT1A7IE5PUDsgTk9QOwotCVIwID0gV1tQMF07Ci0JV1tQMSsrXSA9IFIwOwotLkx3b3JkX2xvb3BfZToKLQlTVEkgUjM7Ci0JUlRTOworQ09NTU9OX0lOUyh3LCBcCisJUjAgPSBXW1AwXTsgXAorCVdbUDErK10gPSBSMDsgXAorKQogCi0jZW5kaWYKLUVORFBST0MoX2luc3cpCitDT01NT05fSU5TKHdfOCwgXAorCVIwID0gV1tQMF07IFwKKwlCW1AxKytdID0gUjA7IFwKKwlSMCA9IFIwID4+IDg7IFwKKwlCW1AxKytdID0gUjA7IFwKKykKIAotRU5UUlkoX2luc3dfOCkKLSNpZmRlZiBDT05GSUdfQkZJTl9JTlNfTE9XT1ZFUkhFQUQKLQlQMCA9IFIwOwkvKiBQMCA9IHBvcnQgKi8KLQljbGkgUjM7Ci0JUDEgPSBSMTsJLyogUDEgPSBhZGRyZXNzICovCi0JUDIgPSBSMjsJLyogUDIgPSBjb3VudCAqLwotCVNTWU5DOwotCUxTRVRVUCggLkx3b3JkOF9sb29wX3MsIC5Md29yZDhfbG9vcF9lKSBMQzAgPSBQMjsKLS5Md29yZDhfbG9vcF9zOiAgUjAgPSBXW1AwXTsKLQkJQltQMSsrXSA9IFIwOwotCQlSMCA9IFIwID4+IDg7Ci0JCUJbUDErK10gPSBSMDsKLQkJTk9QOwotLkx3b3JkOF9sb29wX2U6IE5PUDsKLQlzdGkgUjM7Ci0JUlRTOwotI2Vsc2UKLQlQMCA9IFIwOwkvKiBQMCA9IHBvcnQgKi8KLQlQMSA9IFIxOwkvKiBQMSA9IGFkZHJlc3MgKi8KLQlQMiA9IFIyOwkvKiBQMiA9IGNvdW50ICovCi0JU1NZTkM7Ci0JTFNFVFVQKCAuTHdvcmQ4X2xvb3BfcywgLkx3b3JkOF9sb29wX2UpIExDMCA9IFAyOwotLkx3b3JkOF9sb29wX3M6Ci0JQ0xJIFIzOwotCU5PUDsgTk9QOyBOT1A7Ci0JUjAgPSBXW1AwXTsKLQlCW1AxKytdID0gUjA7Ci0JUjAgPSBSMCA+PiA4OwotCUJbUDErK10gPSBSMDsKLQlOT1A7Ci0uTHdvcmQ4X2xvb3BfZToKLQlTVEkgUjM7CitDT01NT05fSU5TKGIsIFwKKwlSMCA9IEJbUDBdOyBcCisJQltQMSsrXSA9IFIwOyBcCispCiAKLQlSVFM7Ci0jZW5kaWYKLUVORFBST0MoX2luc3dfOCkKLQotRU5UUlkoX2luc2IpCi0jaWZkZWYgQ09ORklHX0JGSU5fSU5TX0xPV09WRVJIRUFECi0JUDAgPSBSMDsJLyogUDAgPSBwb3J0ICovCi0JY2xpIFIzOwotCVAxID0gUjE7CS8qIFAxID0gYWRkcmVzcyAqLwotCVAyID0gUjI7CS8qIFAyID0gY291bnQgKi8KLQlTU1lOQzsKLQlMU0VUVVAoIC5MYnl0ZV9sb29wX3MsIC5MYnl0ZV9sb29wX2UpIExDMCA9IFAyOwotLkxieXRlX2xvb3BfczogIFIwID0gQltQMF07Ci0JCUJbUDErK10gPSBSMDsKLQkJTk9QOwotLkxieXRlX2xvb3BfZTogIE5PUDsKLQlzdGkgUjM7Ci0JUlRTOwotI2Vsc2UKLQlQMCA9IFIwOyAgICAgICAgLyogUDAgPSBwb3J0ICovCi0JUDEgPSBSMTsgICAgICAgIC8qIFAxID0gYWRkcmVzcyAqLwotCVAyID0gUjI7ICAgICAgICAvKiBQMiA9IGNvdW50ICovCi0JU1NZTkM7Ci0JTFNFVFVQKCAuTGJ5dGVfbG9vcF9zLCAuTGJ5dGVfbG9vcF9lKSBMQzAgPSBQMjsKLS5MYnl0ZV9sb29wX3M6Ci0JQ0xJIFIzOwotCU5PUDsgTk9QOyBOT1A7Ci0JUjAgPSBCW1AwXTsKLQlCW1AxKytdID0gUjA7Ci0uTGJ5dGVfbG9vcF9lOgotCVNUSSBSMzsKLQotCVJUUzsKLSNlbmRpZgotRU5EUFJPQyhfaW5zYikKLQotRU5UUlkoX2luc2xfMTYpCi0jaWZkZWYgQ09ORklHX0JGSU5fSU5TX0xPV09WRVJIRUFECi0JUDAgPSBSMDsJLyogUDAgPSBwb3J0ICovCi0JY2xpIFIzOwotCVAxID0gUjE7CS8qIFAxID0gYWRkcmVzcyAqLwotCVAyID0gUjI7CS8qIFAyID0gY291bnQgKi8KLQlTU1lOQzsKLQlMU0VUVVAoIC5MbG9uZzE2X2xvb3BfcywgLkxsb25nMTZfbG9vcF9lKSBMQzAgPSBQMjsKLS5MbG9uZzE2X2xvb3BfczogIFIwID0gW1AwXTsKLQkJICBXW1AxKytdID0gUjA7Ci0JCSAgUjAgPSBSMCA+PiAxNjsKLQkJICBXW1AxKytdID0gUjA7Ci0JCSAgTk9QOwotLkxsb25nMTZfbG9vcF9lOiAgTk9QOwotCXN0aSBSMzsKLQlSVFM7Ci0jZWxzZQotCVAwID0gUjA7CS8qIFAwID0gcG9ydCAqLwotCVAxID0gUjE7CS8qIFAxID0gYWRkcmVzcyAqLwotCVAyID0gUjI7CS8qIFAyID0gY291bnQgKi8KLQlTU1lOQzsKLQlMU0VUVVAoIC5MbG9uZzE2X2xvb3BfcywgLkxsb25nMTZfbG9vcF9lKSBMQzAgPSBQMjsKLS5MbG9uZzE2X2xvb3BfczoKLQlDTEkgUjM7Ci0JTk9QOyBOT1A7IE5PUDsKLQlSMCA9IFtQMF07Ci0JV1tQMSsrXSA9IFIwOwotCVIwID0gUjAgPj4gMTY7Ci0JV1tQMSsrXSA9IFIwOwotLkxsb25nMTZfbG9vcF9lOgotCVNUSSBSMzsKLQlSVFM7Ci0jZW5kaWYKLUVORFBST0MoX2luc2xfMTYpCitDT01NT05fSU5TKGxfMTYsIFwKKwlSMCA9IFtQMF07IFwKKwlXW1AxKytdID0gUjA7IFwKKwlSMCA9IFIwID4+IDE2OyBcCisJV1tQMSsrXSA9IFIwOyBcCispCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2xpYi9tdWxkaTMuUyBiL2FyY2gvYmxhY2tmaW4vbGliL211bGRpMy5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiZGUxMjAKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2JsYWNrZmluL2xpYi9tdWxkaTMuUwpAQCAtMCwwICsxLDY4IEBACisuYWxpZ24gMgorLmdsb2JhbCBfX19tdWxkaTM7CisudHlwZSBfX19tdWxkaTMsIFNUVF9GVU5DOworCisjaWZkZWYgQ09ORklHX0FSSVRITUVUSUNfT1BTX0wxCisuc2VjdGlvbiAubDEudGV4dAorI2Vsc2UKKy50ZXh0CisjZW5kaWYKKworLyoKKwkgICBSMTpSMCAqIFIzOlIyCisJID0gUjEuaDpSMS5sOlIwLmg6UjAubCAqIFIzLmg6UjMubDpSMi5oOlIyLmwKK1tYXQkgPSAoUjEuaCAqIFIzLmgpICogMl45NgorW1hdCSAgICsgKFIxLmggKiBSMy5sICsgUjEubCAqIFIzLmgpICogMl44MAorW1hdCSAgICsgKFIxLmggKiBSMi5oICsgUjEubCAqIFIzLmwgKyBSMy5oICogUjAuaCkgKiAyXjY0CitbVDFdCSAgICsgKFIxLmggKiBSMi5sICsgUjMuaCAqIFIwLmwgKyBSMS5sICogUjIuaCArIFIzLmwgKiBSMC5oKSAqIDJeNDgKK1tUMl0JICAgKyAoUjEubCAqIFIyLmwgKyBSMy5sICogUjAubCArIFIwLmggKiBSMi5oKSAqIDJeMzIKK1tUM10JICAgKyAoUjAubCAqIFIyLmggKyBSMi5sICogUjAuaCkgKiAyXjE2CitbVDRdCSAgICsgKFIwLmwgKiBSMi5sKQorCisJV2UgY2FuIGRpc2NhcmQgdGhlIGZpcnN0IHRocmVlIGxpbmVzIG1hcmtlZCAiWCIgc2luY2Ugd2UgcHJvZHVjZQorCW9ubHkgYSA2NCBiaXQgcmVzdWx0LiAgU28sIHdlIG5lZWQgdGVuIDE2LWJpdCBtdWx0aXBsaWVzLgorCisJSW5kaXZpZHVhbCBtdWwtYWNjIHJlc3VsdHM6CitbRTFdCSA9ICBSMS5oICogUjIubCArIFIzLmggKiBSMC5sICsgUjEubCAqIFIyLmggKyBSMy5sICogUjAuaAorW0UyXQkgPSAgUjEubCAqIFIyLmwgKyBSMy5sICogUjAubCArIFIwLmggKiBSMi5oCitbRTNdCSA9ICBSMC5sICogUjIuaCArIFIyLmwgKiBSMC5oCitbRTRdCSA9ICBSMC5sICogUjIubAorCisJV2UgYWxzbyBuZWVkIHRvIGFkZCBoaWdoIHBhcnRzIGZyb20gbG93ZXItbGV2ZWwgcmVzdWx0cyB0byBoaWdoZXIgb25lczoKKwlFW25dYyA9IEVbbl0gKyAoRVtuKzFdYyA+PiAxNiksIHdoZXJlIEU0YyA6PSBFNAorCisJT25lIGludGVyZXN0aW5nIHByb3BlcnR5IGlzIHRoYXQgYWxsIHBhcnRzIG9mIHRoZSByZXN1bHQgdGhhdCBkZXBlbmQKKwlvbiB0aGUgc2lnbiBvZiB0aGUgbXVsdGlwbGljYXRpb24gYXJlIGRpc2NhcmRlZC4gIFRob3NlIHdvdWxkIGJlIHRoZQorCW11bHRpcGxpY2F0aW9ucyBpbnZvbHZpbmcgUjEuaCBhbmQgUjMuaCwgYnV0IG9ubHkgdGhlIHRvcCAxNiBiaXQgb2YKKwl0aGUgMzIgYml0IHJlc3VsdCBkZXBlbmQgb24gdGhlIHNpZ24sIGFuZCBzaW5jZSBSMS5oIGFuZCBSMy5oIG9ubHkKKwlvY2N1ciBpbiBFMSwgdGhlIHRvcCBoYWxmIG9mIHRoZXNlIHJlc3VsdHMgaXMgY3V0IG9mZi4KKwlTbywgd2UgY2FuIGp1c3QgdXNlIEZVIG1vZGUgZm9yIGFsbCBvZiB0aGUgMTYtYml0IG11bHRpcGxpZXMsIGFuZAorCWlnbm9yZSBxdWVzdGlvbnMgb2Ygd2hlbiB0byB1c2UgbWl4ZWQgbW9kZS4gICovCisKK19fX211bGRpMzoKKwkvKiBbU1BdIHRlY2huaWNhbGx5IGlzIHBhcnQgb2YgdGhlIGNhbGxlcidzIGZyYW1lLCBidXQgd2UgY2FuCisJICAgdXNlIGl0IGFzIHNjcmF0Y2ggc3BhY2UuICAqLworCUEwID0gUjIuSCAqIFIxLkwsIEExID0gUjIuTCAqIFIxLkggKEZVKSB8fCBSMyA9IFtTUCArIDEyXTsJLyogRTEgKi8KKwlBMCArPSBSMy5IICogUjAuTCwgQTEgKz0gUjMuTCAqIFIwLkggKEZVKSB8fCBbU1BdID0gUjQ7CQkvKiBFMSAqLworCUEwICs9IEExOwkJCQkJCQkvKiBFMSAqLworCVI0ID0gQTAudzsKKwlBMCA9IFIwLmwgKiBSMy5sIChGVSk7CQkJCQkJLyogRTIgKi8KKwlBMCArPSBSMi5sICogUjEubCAoRlUpOwkJCQkJCS8qIEUyICovCisKKwlBMSA9IFIyLkwgKiBSMC5MIChGVSk7CQkJCQkJLyogRTQgKi8KKwlSMyA9IEExLnc7CisJQTEgPSBBMSA+PiAxNjsJCQkJCQkJLyogRTNjICovCisJQTAgKz0gUjIuSCAqIFIwLkgsIEExICs9IFIyLkwgKiBSMC5IIChGVSk7CQkJLyogRTIsIEUzYyAqLworCUExICs9IFIwLkwgKiBSMi5IIChGVSk7CQkJCQkJLyogRTNjICovCisJUjAgPSBBMS53OworCUExID0gQTEgPj4gMTY7CQkJCQkJCS8qIEUyYyAqLworCUEwICs9IEExOwkJCQkJCQkvKiBFMmMgKi8KKwlSMSA9IEEwLnc7CisKKwkvKiBsb3cocmVzdWx0KSA9IGxvdyhFM2MpOmxvdyhFNCkgKi8KKwlSMCA9IFBBQ0sgKFIwLmwsIFIzLmwpOworCS8qIGhpZ2gocmVzdWx0KSA9IEUyYyArIChFMSA8PCAxNikgKi8KKwlSMS5oID0gUjEuaCArIFI0LmwgKE5TKSB8fCBSNCA9IFtTUF07CisJUlRTOworCisuc2l6ZSBfX19tdWxkaTMsIC4tX19fbXVsZGkzCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2xpYi9tdWxkaTMuYyBiL2FyY2gvYmxhY2tmaW4vbGliL211bGRpMy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDNkMGM2Li4wMDAwMDAwCi0tLSBhL2FyY2gvYmxhY2tmaW4vbGliL211bGRpMy5jCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyoKLSAqIEZpbGU6ICAgICAgICAgYXJjaC9ibGFja2Zpbi9saWIvbXVsZGkzLmMKLSAqIEJhc2VkIG9uOgotICogQXV0aG9yOgotICoKLSAqIENyZWF0ZWQ6Ci0gKiBEZXNjcmlwdGlvbjoKLSAqCi0gKiBNb2RpZmllZDoKLSAqICAgICAgICAgICAgICAgQ29weXJpZ2h0IDIwMDQtMjAwNiBBbmFsb2cgRGV2aWNlcyBJbmMuCi0gKgotICogQnVnczogICAgICAgICBFbnRlciBidWdzIGF0IGh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZy8KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSB0aGUgZmlsZSBDT1BZSU5HLCBvciB3cml0ZQotICogdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAqIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0gKi8KLQotI2lmbmRlZiBTSV9UWVBFX1NJWkUKLSNkZWZpbmUgU0lfVFlQRV9TSVpFIDMyCi0jZW5kaWYKLSNkZWZpbmUgX19sbF9iICgxTCA8PCAoU0lfVFlQRV9TSVpFIC8gMikpCi0jZGVmaW5lIF9fbGxfbG93cGFydCh0KSAoKHVzaXR5cGUpICh0KSAlIF9fbGxfYikKLSNkZWZpbmUgX19sbF9oaWdocGFydCh0KSAoKHVzaXR5cGUpICh0KSAvIF9fbGxfYikKLSNkZWZpbmUgQklUU19QRVJfVU5JVCA4Ci0KLSNpZiAhZGVmaW5lZCh1bXVsX3BwbW0pCi0jZGVmaW5lIHVtdWxfcHBtbSh3MSwgdzAsIHUsIHYpCQkJCQkJXAotICBkbyB7CQkJCQkJCQkJXAotICAgIHVzaXR5cGUgX194MCwgX194MSwgX194MiwgX194MzsJCQkJCVwKLSAgICB1c2l0eXBlIF9fdWwsIF9fdmwsIF9fdWgsIF9fdmg7CQkJCQlcCi0JCQkJCQkJCQlcCi0gICAgX191bCA9IF9fbGxfbG93cGFydCAodSk7CQkJCQkJXAotICAgIF9fdWggPSBfX2xsX2hpZ2hwYXJ0ICh1KTsJCQkJCQlcCi0gICAgX192bCA9IF9fbGxfbG93cGFydCAodik7CQkJCQkJXAotICAgIF9fdmggPSBfX2xsX2hpZ2hwYXJ0ICh2KTsJCQkJCQlcCi0JCQkJCQkJCQlcCi0gICAgX194MCA9ICh1c2l0eXBlKSBfX3VsICogX192bDsJCQkJCVwKLSAgICBfX3gxID0gKHVzaXR5cGUpIF9fdWwgKiBfX3ZoOwkJCQkJXAotICAgIF9feDIgPSAodXNpdHlwZSkgX191aCAqIF9fdmw7CQkJCQlcCi0gICAgX194MyA9ICh1c2l0eXBlKSBfX3VoICogX192aDsJCQkJCVwKLQkJCQkJCQkJCVwKLSAgICBfX3gxICs9IF9fbGxfaGlnaHBhcnQgKF9feDApOy8qIHRoaXMgY2FuJ3QgZ2l2ZSBjYXJyeSAqLwkJXAotICAgIF9feDEgKz0gX194MjsJCS8qIGJ1dCB0aGlzIGluZGVlZCBjYW4gKi8JCVwKLSAgICBpZiAoX194MSA8IF9feDIpCQkvKiBkaWQgd2UgZ2V0IGl0PyAqLwkJCVwKLSAgICAgIF9feDMgKz0gX19sbF9iOwkJLyogeWVzLCBhZGQgaXQgaW4gdGhlIHByb3BlciBwb3MuICovCVwKLQkJCQkJCQkJCVwKLSAgICAodzEpID0gX194MyArIF9fbGxfaGlnaHBhcnQgKF9feDEpOwkJCQkJXAotICAgICh3MCkgPSBfX2xsX2xvd3BhcnQgKF9feDEpICogX19sbF9iICsgX19sbF9sb3dwYXJ0IChfX3gwKTsJCVwKLSAgfSB3aGlsZSAoMCkKLSNlbmRpZgotCi0jaWYgIWRlZmluZWQoX191bXVsc2lkaTMpCi0jZGVmaW5lIF9fdW11bHNpZGkzKHUsIHYpIAkJCQkJCVwKLSAgKHtkaXVuaW9uIF9fdzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICB1bXVsX3BwbW0gKF9fdy5zLmhpZ2gsIF9fdy5zLmxvdywgdSwgdik7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgX193LmxsOyB9KQotI2VuZGlmCi0KLXR5cGVkZWYgdW5zaWduZWQgaW50IHVzaXR5cGUgX19hdHRyaWJ1dGVfXyAoKG1vZGUoU0kpKSk7Ci10eXBlZGVmIGludCBzaXR5cGUgX19hdHRyaWJ1dGVfXyAoKG1vZGUoU0kpKSk7Ci10eXBlZGVmIGludCBkaXR5cGUgX19hdHRyaWJ1dGVfXyAoKG1vZGUoREkpKSk7Ci10eXBlZGVmIGludCB3b3JkX3R5cGUgX19hdHRyaWJ1dGVfXyAoKG1vZGUoX193b3JkX18pKSk7Ci0KLXN0cnVjdCBkaXN0cnVjdCB7Ci0Jc2l0eXBlIGxvdywgaGlnaDsKLX07Ci10eXBlZGVmIHVuaW9uIHsKLQlzdHJ1Y3QgZGlzdHJ1Y3QgczsKLQlkaXR5cGUgbGw7Ci19IGRpdW5pb247Ci0KLSNpZmRlZiBDT05GSUdfQVJJVEhNRVRJQ19PUFNfTDEKLWRpdHlwZSBfX211bGRpMyhkaXR5cGUgdSwgZGl0eXBlIHYpX19hdHRyaWJ1dGVfXygobDFfdGV4dCkpOwotI2VuZGlmCi0KLWRpdHlwZSBfX211bGRpMyhkaXR5cGUgdSwgZGl0eXBlIHYpCi17Ci0JZGl1bmlvbiB3OwotCWRpdW5pb24gdXUsIHZ2OwotCi0JdXUubGwgPSB1LCB2di5sbCA9IHY7Ci0Jdy5sbCA9IF9fdW11bHNpZGkzKHV1LnMubG93LCB2di5zLmxvdyk7Ci0Jdy5zLmhpZ2ggKz0gKCh1c2l0eXBlKSB1dS5zLmxvdyAqICh1c2l0eXBlKSB2di5zLmhpZ2gKLQkJICAgICArICh1c2l0eXBlKSB1dS5zLmhpZ2ggKiAodXNpdHlwZSkgdnYucy5sb3cpOwotCi0JcmV0dXJuIHcubGw7Ci19CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvS2NvbmZpZyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzOTdlZGUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvS2NvbmZpZwpAQCAtMCwwICsxLDIzMyBAQAoraWYgKEJGNTF4KQorCitzb3VyY2UgImFyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9ib2FyZHMvS2NvbmZpZyIKKworbWVudSAiQkY1MTggU3BlY2lmaWMgQ29uZmlndXJhdGlvbiIKKworY29tbWVudCAiQWx0ZXJuYXRpdmUgTXVsdGlwbGV4aW5nIFNjaGVtZSIKKworY2hvaWNlCisJcHJvbXB0ICJTUE9SVDAiCisJZGVmYXVsdCBCRjUxOF9TUE9SVDBfUE9SVEcKKwloZWxwCisJICBTZWxlY3QgUE9SVCB1c2VkIGZvciBTUE9SVDAuIFNlZSBIYXJkd2FyZSBSZWZlcmVuY2UgTWFudWFsCisKK2NvbmZpZyBCRjUxOF9TUE9SVDBfUE9SVEYKKwlib29sICJQT1JUIEYiCisJaGVscAorCSAgUE9SVCBGCisKK2NvbmZpZyBCRjUxOF9TUE9SVDBfUE9SVEcKKwlib29sICJQT1JUIEciCisJaGVscAorCSAgUE9SVCBHCitlbmRjaG9pY2UKKworY2hvaWNlCisJcHJvbXB0ICJTUE9SVDAgVFNDTEsgTG9jYXRpb24iCisJZGVwZW5kcyBvbiBCRjUxOF9TUE9SVDBfUE9SVEcKKwlkZWZhdWx0IEJGNTE4X1NQT1JUMF9UU0NMS19QRzEwCisJaGVscAorCSAgU2VsZWN0IFBJTiB1c2VkIGZvciBTUE9SVDBfVFNDTEsuIFNlZSBIYXJkd2FyZSBSZWZlcmVuY2UgTWFudWFsCisKK2NvbmZpZyBCRjUxOF9TUE9SVDBfVFNDTEtfUEcxMAorCWJvb2wgIlBPUlQgUEcxMCIKKwloZWxwCisJICBQT1JUIFBHMTAKKworY29uZmlnIEJGNTE4X1NQT1JUMF9UU0NMS19QRzE0CisJYm9vbCAiUE9SVCBQRzE0IgorCWhlbHAKKwkgIFBPUlQgUEcxNAorZW5kY2hvaWNlCisKK2Nob2ljZQorCXByb21wdCAiVUFSVDEiCisJZGVmYXVsdCBCRjUxOF9VQVJUMV9QT1JURgorCWhlbHAKKwkgIFNlbGVjdCBQT1JUIHVzZWQgZm9yIFVBUlQxLiBTZWUgSGFyZHdhcmUgUmVmZXJlbmNlIE1hbnVhbAorCitjb25maWcgQkY1MThfVUFSVDFfUE9SVEYKKwlib29sICJQT1JUIEYiCisJaGVscAorCSAgUE9SVCBGCisKK2NvbmZpZyBCRjUxOF9VQVJUMV9QT1JURworCWJvb2wgIlBPUlQgRyIKKwloZWxwCisJICBQT1JUIEcKK2VuZGNob2ljZQorCitjb21tZW50ICJJbnRlcnJ1cHQgUHJpb3JpdHkgQXNzaWdubWVudCIKK21lbnUgIlByaW9yaXR5IgorCitjb25maWcgSVJRX1BMTF9XQUtFVVAKKwlpbnQgIklSUV9QTExfV0FLRVVQIgorCWRlZmF1bHQgNworY29uZmlnIElSUV9ETUEwX0VSUk9SCisJaW50ICJJUlFfRE1BMF9FUlJPUiIKKwlkZWZhdWx0IDcKK2NvbmZpZyBJUlFfRE1BUjBfQkxLCisJaW50ICJJUlFfRE1BUjBfQkxLIgorCWRlZmF1bHQgNworY29uZmlnIElSUV9ETUFSMV9CTEsKKwlpbnQgIklSUV9ETUFSMV9CTEsiCisJZGVmYXVsdCA3Citjb25maWcgSVJRX0RNQVIwX09WUgorCWludCAiSVJRX0RNQVIwX09WUiIKKwlkZWZhdWx0IDcKK2NvbmZpZyBJUlFfRE1BUjFfT1ZSCisJaW50ICJJUlFfRE1BUjFfT1ZSIgorCWRlZmF1bHQgNworY29uZmlnIElSUV9QUElfRVJST1IKKwlpbnQgIklSUV9QUElfRVJST1IiCisJZGVmYXVsdCA3Citjb25maWcgSVJRX01BQ19FUlJPUgorCWludCAiSVJRX01BQ19FUlJPUiIKKwlkZWZhdWx0IDcKK2NvbmZpZyBJUlFfU1BPUlQwX0VSUk9SCisJaW50ICJJUlFfU1BPUlQwX0VSUk9SIgorCWRlZmF1bHQgNworY29uZmlnIElSUV9TUE9SVDFfRVJST1IKKwlpbnQgIklSUV9TUE9SVDFfRVJST1IiCisJZGVmYXVsdCA3Citjb25maWcgSVJRX1BUUF9FUlJPUgorCWludCAiSVJRX1BUUF9FUlJPUiIKKwlkZWZhdWx0IDcKK2NvbmZpZyBJUlFfVUFSVDBfRVJST1IKKwlpbnQgIklSUV9VQVJUMF9FUlJPUiIKKwlkZWZhdWx0IDcKK2NvbmZpZyBJUlFfVUFSVDFfRVJST1IKKwlpbnQgIklSUV9VQVJUMV9FUlJPUiIKKwlkZWZhdWx0IDcKK2NvbmZpZyBJUlFfUlRDCisJaW50ICJJUlFfUlRDIgorCWRlZmF1bHQgOAorY29uZmlnIElSUV9QUEkKKwlpbnQgIklSUV9QUEkiCisJZGVmYXVsdCA4Citjb25maWcgSVJRX1NQT1JUMF9SWAorCWludCAiSVJRX1NQT1JUMF9SWCIKKwlkZWZhdWx0IDkKK2NvbmZpZyBJUlFfU1BPUlQwX1RYCisJaW50ICJJUlFfU1BPUlQwX1RYIgorCWRlZmF1bHQgOQorY29uZmlnIElSUV9TUE9SVDFfUlgKKwlpbnQgIklSUV9TUE9SVDFfUlgiCisJZGVmYXVsdCA5Citjb25maWcgSVJRX1NQT1JUMV9UWAorCWludCAiSVJRX1NQT1JUMV9UWCIKKwlkZWZhdWx0IDkKK2NvbmZpZyBJUlFfVFdJCisJaW50ICJJUlFfVFdJIgorCWRlZmF1bHQgMTAKK2NvbmZpZyBJUlFfU1BJMAorCWludCAiSVJRX1NQSSIKKwlkZWZhdWx0IDEwCitjb25maWcgSVJRX1VBUlQwX1JYCisJaW50ICJJUlFfVUFSVDBfUlgiCisJZGVmYXVsdCAxMAorY29uZmlnIElSUV9VQVJUMF9UWAorCWludCAiSVJRX1VBUlQwX1RYIgorCWRlZmF1bHQgMTAKK2NvbmZpZyBJUlFfVUFSVDFfUlgKKwlpbnQgIklSUV9VQVJUMV9SWCIKKwlkZWZhdWx0IDEwCitjb25maWcgSVJRX1VBUlQxX1RYCisJaW50ICJJUlFfVUFSVDFfVFgiCisJZGVmYXVsdCAxMAorY29uZmlnIElSUV9PUFRTRUMKKwlpbnQgIklSUV9PUFRTRUMiCisJZGVmYXVsdCAxMQorY29uZmlnIElSUV9DTlQKKwlpbnQgIklSUV9DTlQiCisJZGVmYXVsdCAxMQorY29uZmlnIElSUV9NQUNfUlgKKwlpbnQgIklSUV9NQUNfUlgiCisJZGVmYXVsdCAxMQorY29uZmlnIElSUV9QT1JUSF9JTlRBCisJaW50ICJJUlFfUE9SVEhfSU5UQSIKKwlkZWZhdWx0IDExCitjb25maWcgSVJRX01BQ19UWAorCWludCAiSVJRX01BQ19UWC9ORkMiCisJZGVmYXVsdCAxMQorY29uZmlnIElSUV9QT1JUSF9JTlRCCisJaW50ICJJUlFfUE9SVEhfSU5UQiIKKwlkZWZhdWx0IDExCitjb25maWcgSVJRX1RJTUVSMAorCWludCAiSVJRX1RJTUVSMCIKKwlkZWZhdWx0IDgKK2NvbmZpZyBJUlFfVElNRVIxCisJaW50ICJJUlFfVElNRVIxIgorCWRlZmF1bHQgMTIKK2NvbmZpZyBJUlFfVElNRVIyCisJaW50ICJJUlFfVElNRVIyIgorCWRlZmF1bHQgMTIKK2NvbmZpZyBJUlFfVElNRVIzCisJaW50ICJJUlFfVElNRVIzIgorCWRlZmF1bHQgMTIKK2NvbmZpZyBJUlFfVElNRVI0CisJaW50ICJJUlFfVElNRVI0IgorCWRlZmF1bHQgMTIKK2NvbmZpZyBJUlFfVElNRVI1CisJaW50ICJJUlFfVElNRVI1IgorCWRlZmF1bHQgMTIKK2NvbmZpZyBJUlFfVElNRVI2CisJaW50ICJJUlFfVElNRVI2IgorCWRlZmF1bHQgMTIKK2NvbmZpZyBJUlFfVElNRVI3CisJaW50ICJJUlFfVElNRVI3IgorCWRlZmF1bHQgMTIKK2NvbmZpZyBJUlFfUE9SVEdfSU5UQQorCWludCAiSVJRX1BPUlRHX0lOVEEiCisJZGVmYXVsdCAxMgorY29uZmlnIElSUV9QT1JUR19JTlRCCisJaW50ICJJUlFfUE9SVEdfSU5UQiIKKwlkZWZhdWx0IDEyCitjb25maWcgSVJRX01FTV9ETUEwCisJaW50ICJJUlFfTUVNX0RNQTAiCisJZGVmYXVsdCAxMworY29uZmlnIElSUV9NRU1fRE1BMQorCWludCAiSVJRX01FTV9ETUExIgorCWRlZmF1bHQgMTMKK2NvbmZpZyBJUlFfV0FUQ0gKKwlpbnQgIklSUV9XQVRDSCIKKwlkZWZhdWx0IDEzCitjb25maWcgSVJRX1BPUlRGX0lOVEEKKwlpbnQgIklSUV9QT1JURl9JTlRBIgorCWRlZmF1bHQgMTMKK2NvbmZpZyBJUlFfUE9SVEZfSU5UQgorCWludCAiSVJRX1BPUlRGX0lOVEIiCisJZGVmYXVsdCAxMworY29uZmlnIElSUV9TUEkwX0VSUk9SCisJaW50ICJJUlFfU1BJMF9FUlJPUiIKKwlkZWZhdWx0IDcKK2NvbmZpZyBJUlFfU1BJMV9FUlJPUgorCWludCAiSVJRX1NQSTFfRVJST1IiCisJZGVmYXVsdCA3Citjb25maWcgSVJRX1JTSV9JTlQwCisJaW50ICJJUlFfUlNJX0lOVDAiCisJZGVmYXVsdCA3Citjb25maWcgSVJRX1JTSV9JTlQxCisJaW50ICJJUlFfUlNJX0lOVDEiCisJZGVmYXVsdCA3Citjb25maWcgSVJRX1BXTV9UUklQCisJaW50ICJJUlFfUFdNX1RSSVAiCisJZGVmYXVsdCAxMAorY29uZmlnIElSUV9QV01fU1lOQworCWludCAiSVJRX1BXTV9TWU5DIgorCWRlZmF1bHQgMTAKK2NvbmZpZyBJUlFfUFRQX1NUQVQKKwlpbnQgIklSUV9QVFBfU1RBVCIKKwlkZWZhdWx0IDEwCisKKwloZWxwCisJICBFbnRlciB0aGUgcHJpb3JpdHkgbnVtYmVycyBiZXR3ZWVuIDctMTMgT05MWS4gIE90aGVycyBhcmUgUmVzZXJ2ZWQuCisJICBUaGlzIGFwcGxpZXMgdG8gYWxsIHRoZSBhYm92ZS4gIEl0IGlzIG5vdCByZWNvbW1lbmRlZCB0byBhc3NpZ24gdGhlCisJICBoaWdoZXN0IHByaW9yaXR5IG51bWJlciA3IHRvIFVBUlQgb3IgYW55IG90aGVyIGRldmljZS4KKworZW5kbWVudQorCitlbmRtZW51CisKK2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvTWFrZWZpbGUgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTY4YTE5MwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9NYWtlZmlsZQpAQCAtMCwwICsxLDUgQEAKKyMKKyMgYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L01ha2VmaWxlCisjCisKK29iai15IDo9IGludHMtcHJpb3JpdHkubyBkbWEubwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2JvYXJkcy9LY29uZmlnIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2JvYXJkcy9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2MTYzNTEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvYm9hcmRzL0tjb25maWcKQEAgLTAsMCArMSwxMiBAQAorY2hvaWNlCisJcHJvbXB0ICJTeXN0ZW0gdHlwZSIKKwlkZWZhdWx0IEJGSU41MThGX0VaQlJECisJaGVscAorCSAgU2VsZWN0IHlvdXIgYm9hcmQhCisKK2NvbmZpZyBCRklONTE4Rl9FWkJSRAorCWJvb2wgIkJGNTE4Ri1FWkJSRCIKKwloZWxwCisJICBCRjUxOC1FWkJSRCBib2FyZCBzdXBwb3J0LgorCitlbmRjaG9pY2UKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9ib2FyZHMvTWFrZWZpbGUgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvYm9hcmRzL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3MmU4NTkKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvYm9hcmRzL01ha2VmaWxlCkBAIC0wLDAgKzEsNSBAQAorIworIyBhcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvYm9hcmRzL01ha2VmaWxlCisjCisKK29iai0kKENPTkZJR19CRklONTE4Rl9FWkJSRCkgICAgICAgICAgICArPSBlemJyZC5vCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvYm9hcmRzL2V6YnJkLmMgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvYm9hcmRzL2V6YnJkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTVmMTM1MQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9ib2FyZHMvZXpicmQuYwpAQCAtMCwwICsxLDY2OSBAQAorLyoKKyAqIEZpbGU6ICAgICAgICAgYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2JvYXJkcy9lemJyZC5jCisgKiBCYXNlZCBvbjogICAgIGFyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9ib2FyZHMvZXpicmQuYworICogQXV0aG9yOiAgICAgICBCcnlhbiBXdSA8Y29vbG9uZXlAa2VybmVsLm9yZz4KKyAqCisgKiBDcmVhdGVkOgorICogRGVzY3JpcHRpb246CisgKgorICogTW9kaWZpZWQ6CisgKiAgICAgICAgICAgICAgIENvcHlyaWdodCAyMDA1IE5hdGlvbmFsIElDVCBBdXN0cmFsaWEgKE5JQ1RBKQorICogICAgICAgICAgICAgICBDb3B5cmlnaHQgMjAwNC0yMDA4IEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqCisgKiBCdWdzOiAgICAgICAgIEVudGVyIGJ1Z3MgYXQgaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnLworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIHRoZSBmaWxlIENPUFlJTkcsIG9yIHdyaXRlCisgKiB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqLworCisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbXRkL210ZC5oPgorI2luY2x1ZGUgPGxpbnV4L210ZC9wYXJ0aXRpb25zLmg+CisjaW5jbHVkZSA8bGludXgvbXRkL3BoeXNtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CisjaW5jbHVkZSA8bGludXgvc3BpL2ZsYXNoLmg+CisKKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxhc20vZG1hLmg+CisjaW5jbHVkZSA8YXNtL2JmaW41eHhfc3BpLmg+CisjaW5jbHVkZSA8YXNtL3JlYm9vdC5oPgorI2luY2x1ZGUgPGFzbS9wb3J0bXV4Lmg+CisjaW5jbHVkZSA8YXNtL2RwbWMuaD4KKyNpbmNsdWRlIDxhc20vYmZpbl9zZGguaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvYWQ3ODc3Lmg+CisKKy8qCisgKiBOYW1lIHRoZSBCb2FyZCBmb3IgdGhlIC9wcm9jL2NwdWluZm8KKyAqLworY29uc3QgY2hhciBiZmluX2JvYXJkX25hbWVbXSA9ICJBREkgQkY1MThGLUVaQlJEIjsKKworLyoKKyAqICBEcml2ZXIgbmVlZHMgdG8ga25vdyBhZGRyZXNzLCBpcnEgYW5kIGZsYWcgcGluLgorICovCisKKyNpZiBkZWZpbmVkKENPTkZJR19NVERfUEhZU01BUCkgfHwgZGVmaW5lZChDT05GSUdfTVREX1BIWVNNQVBfTU9EVUxFKQorc3RhdGljIHN0cnVjdCBtdGRfcGFydGl0aW9uIGV6YnJkX3BhcnRpdGlvbnNbXSA9IHsKKwl7CisJCS5uYW1lICAgICAgID0gImJvb3Rsb2FkZXIobm9yKSIsCisJCS5zaXplICAgICAgID0gMHg0MDAwMCwKKwkJLm9mZnNldCAgICAgPSAwLAorCX0sIHsKKwkJLm5hbWUgICAgICAgPSAibGludXgga2VybmVsKG5vcikiLAorCQkuc2l6ZSAgICAgICA9IDB4MUMwMDAwLAorCQkub2Zmc2V0ICAgICA9IE1URFBBUlRfT0ZTX0FQUEVORCwKKwl9LCB7CisJCS5uYW1lICAgICAgID0gImZpbGUgc3lzdGVtKG5vcikiLAorCQkuc2l6ZSAgICAgICA9IE1URFBBUlRfU0laX0ZVTEwsCisJCS5vZmZzZXQgICAgID0gTVREUEFSVF9PRlNfQVBQRU5ELAorCX0KK307CisKK3N0YXRpYyBzdHJ1Y3QgcGh5c21hcF9mbGFzaF9kYXRhIGV6YnJkX2ZsYXNoX2RhdGEgPSB7CisJLndpZHRoICAgICAgPSAyLAorCS5wYXJ0cyAgICAgID0gZXpicmRfcGFydGl0aW9ucywKKwkubnJfcGFydHMgICA9IEFSUkFZX1NJWkUoZXpicmRfcGFydGl0aW9ucyksCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGV6YnJkX2ZsYXNoX3Jlc291cmNlID0geworCS5zdGFydCA9IDB4MjAwMDAwMDAsCisJLmVuZCAgID0gMHgyMDNmZmZmZiwKKwkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGV6YnJkX2ZsYXNoX2RldmljZSA9IHsKKwkubmFtZSAgICAgICAgICA9ICJwaHlzbWFwLWZsYXNoIiwKKwkuaWQgICAgICAgICAgICA9IDAsCisJLmRldiA9IHsKKwkJLnBsYXRmb3JtX2RhdGEgPSAmZXpicmRfZmxhc2hfZGF0YSwKKwl9LAorCS5udW1fcmVzb3VyY2VzID0gMSwKKwkucmVzb3VyY2UgICAgICA9ICZlemJyZF9mbGFzaF9yZXNvdXJjZSwKK307CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX1JUQ19EUlZfQkZJTikgfHwgZGVmaW5lZChDT05GSUdfUlRDX0RSVl9CRklOX01PRFVMRSkKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHJ0Y19kZXZpY2UgPSB7CisJLm5hbWUgPSAicnRjLWJmaW4iLAorCS5pZCAgID0gLTEsCit9OworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19CRklOX01BQykgfHwgZGVmaW5lZChDT05GSUdfQkZJTl9NQUNfTU9EVUxFKQorc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYmZpbl9tYWNfZGV2aWNlID0geworCS5uYW1lID0gImJmaW5fbWFjIiwKK307CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX01URF9NMjVQODApIFwKKwl8fCBkZWZpbmVkKENPTkZJR19NVERfTTI1UDgwX01PRFVMRSkKK3N0YXRpYyBzdHJ1Y3QgbXRkX3BhcnRpdGlvbiBiZmluX3NwaV9mbGFzaF9wYXJ0aXRpb25zW10gPSB7CisJeworCQkubmFtZSA9ICJib290bG9hZGVyKHNwaSkiLAorCQkuc2l6ZSA9IDB4MDAwNDAwMDAsCisJCS5vZmZzZXQgPSAwLAorCQkubWFza19mbGFncyA9IE1URF9DQVBfUk9NCisJfSwgeworCQkubmFtZSA9ICJsaW51eCBrZXJuZWwoc3BpKSIsCisJCS5zaXplID0gTVREUEFSVF9TSVpfRlVMTCwKKwkJLm9mZnNldCA9IE1URFBBUlRfT0ZTX0FQUEVORCwKKwl9Cit9OworCitzdGF0aWMgc3RydWN0IGZsYXNoX3BsYXRmb3JtX2RhdGEgYmZpbl9zcGlfZmxhc2hfZGF0YSA9IHsKKwkubmFtZSA9ICJtMjVwODAiLAorCS5wYXJ0cyA9IGJmaW5fc3BpX2ZsYXNoX3BhcnRpdGlvbnMsCisJLm5yX3BhcnRzID0gQVJSQVlfU0laRShiZmluX3NwaV9mbGFzaF9wYXJ0aXRpb25zKSwKKwkudHlwZSA9ICJtMjVwMTYiLAorfTsKKworLyogU1BJIGZsYXNoIGNoaXAgKG0yNXA2NCkgKi8KK3N0YXRpYyBzdHJ1Y3QgYmZpbjV4eF9zcGlfY2hpcCBzcGlfZmxhc2hfY2hpcF9pbmZvID0geworCS5lbmFibGVfZG1hID0gMCwgICAgICAgICAvKiB1c2UgZG1hIHRyYW5zZmVyIHdpdGggdGhpcyBjaGlwKi8KKwkuYml0c19wZXJfd29yZCA9IDgsCit9OworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19TUElfQURDX0JGNTMzKSBcCisJfHwgZGVmaW5lZChDT05GSUdfU1BJX0FEQ19CRjUzM19NT0RVTEUpCisvKiBTUEkgQURDIGNoaXAgKi8KK3N0YXRpYyBzdHJ1Y3QgYmZpbjV4eF9zcGlfY2hpcCBzcGlfYWRjX2NoaXBfaW5mbyA9IHsKKwkuZW5hYmxlX2RtYSA9IDEsICAgICAgICAgLyogdXNlIGRtYSB0cmFuc2ZlciB3aXRoIHRoaXMgY2hpcCovCisJLmJpdHNfcGVyX3dvcmQgPSAxNiwKK307CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX1NQSV9NTUMpIHx8IGRlZmluZWQoQ09ORklHX1NQSV9NTUNfTU9EVUxFKQorc3RhdGljIHN0cnVjdCBiZmluNXh4X3NwaV9jaGlwIHNwaV9tbWNfY2hpcF9pbmZvID0geworCS5lbmFibGVfZG1hID0gMSwKKwkuYml0c19wZXJfd29yZCA9IDgsCit9OworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19QQlgpCitzdGF0aWMgc3RydWN0IGJmaW41eHhfc3BpX2NoaXAgc3BpX3NpM3h4eF9jaGlwX2luZm8gPSB7CisJLmN0bF9yZWcJPSAweDQsIC8qIHNlbmQgemVybyAqLworCS5lbmFibGVfZG1hCT0gMCwKKwkuYml0c19wZXJfd29yZAk9IDgsCisJLmNzX2NoYW5nZV9wZXJfd29yZCA9IDEsCit9OworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19UT1VDSFNDUkVFTl9BRDc4NzcpIHx8IGRlZmluZWQoQ09ORklHX1RPVUNIU0NSRUVOX0FENzg3N19NT0RVTEUpCitzdGF0aWMgc3RydWN0IGJmaW41eHhfc3BpX2NoaXAgc3BpX2FkNzg3N19jaGlwX2luZm8gPSB7CisJLmVuYWJsZV9kbWEgPSAwLAorCS5iaXRzX3Blcl93b3JkID0gMTYsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGFkNzg3N19wbGF0Zm9ybV9kYXRhIGJmaW5fYWQ3ODc3X3RzX2luZm8gPSB7CisJLm1vZGVsCQkJPSA3ODc3LAorCS52cmVmX2RlbGF5X3VzZWNzCT0gNTAsCS8qIGludGVybmFsLCBubyBjYXBhY2l0b3IgKi8KKwkueF9wbGF0ZV9vaG1zCQk9IDQxOSwKKwkueV9wbGF0ZV9vaG1zCQk9IDQ4NiwKKwkucHJlc3N1cmVfbWF4CQk9IDEwMDAsCisJLnByZXNzdXJlX21pbgkJPSAwLAorCS5zdG9wYWNxX3BvbGFyaXR5IAk9IDEsCisJLmZpcnN0X2NvbnZlcnNpb25fZGVsYXkgPSAzLAorCS5hY3F1aXNpdGlvbl90aW1lIAk9IDEsCisJLmF2ZXJhZ2luZyAJCT0gMSwKKwkucGVuX2Rvd25fYWNjX2ludGVydmFsIAk9IDEsCit9OworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19TTkRfU09DX1dNODczMSkgfHwgZGVmaW5lZChDT05GSUdfU05EX1NPQ19XTTg3MzFfTU9EVUxFKSBcCisJICYmIGRlZmluZWQoQ09ORklHX1NORF9TT0NfV004NzMxX1NQSSkKK3N0YXRpYyBzdHJ1Y3QgYmZpbjV4eF9zcGlfY2hpcCBzcGlfd204NzMxX2NoaXBfaW5mbyA9IHsKKwkuZW5hYmxlX2RtYSA9IDAsCisJLmJpdHNfcGVyX3dvcmQgPSAxNiwKK307CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX1NQSV9TUElERVYpIHx8IGRlZmluZWQoQ09ORklHX1NQSV9TUElERVZfTU9EVUxFKQorc3RhdGljIHN0cnVjdCBiZmluNXh4X3NwaV9jaGlwIHNwaWRldl9jaGlwX2luZm8gPSB7CisJLmVuYWJsZV9kbWEgPSAwLAorCS5iaXRzX3Blcl93b3JkID0gOCwKK307CisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBzcGlfYm9hcmRfaW5mbyBiZmluX3NwaV9ib2FyZF9pbmZvW10gX19pbml0ZGF0YSA9IHsKKyNpZiBkZWZpbmVkKENPTkZJR19NVERfTTI1UDgwKSBcCisJfHwgZGVmaW5lZChDT05GSUdfTVREX00yNVA4MF9NT0RVTEUpCisJeworCQkvKiB0aGUgbW9kYWxpYXMgbXVzdCBiZSB0aGUgc2FtZSBhcyBzcGkgZGV2aWNlIGRyaXZlciBuYW1lICovCisJCS5tb2RhbGlhcyA9ICJtMjVwODAiLCAvKiBOYW1lIG9mIHNwaV9kcml2ZXIgZm9yIHRoaXMgZGV2aWNlICovCisJCS5tYXhfc3BlZWRfaHogPSAyNTAwMDAwMCwgICAgIC8qIG1heCBzcGkgY2xvY2sgKFNDSykgc3BlZWQgaW4gSFogKi8KKwkJLmJ1c19udW0gPSAwLCAvKiBGcmFtZXdvcmsgYnVzIG51bWJlciAqLworCQkuY2hpcF9zZWxlY3QgPSAxLCAvKiBGcmFtZXdvcmsgY2hpcCBzZWxlY3QuIE9uIFNUQU1QNTM3IGl0IGlzIFNQSVNTRUwxKi8KKwkJLnBsYXRmb3JtX2RhdGEgPSAmYmZpbl9zcGlfZmxhc2hfZGF0YSwKKwkJLmNvbnRyb2xsZXJfZGF0YSA9ICZzcGlfZmxhc2hfY2hpcF9pbmZvLAorCQkubW9kZSA9IFNQSV9NT0RFXzMsCisJfSwKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfU1BJX0FEQ19CRjUzMykgXAorCXx8IGRlZmluZWQoQ09ORklHX1NQSV9BRENfQkY1MzNfTU9EVUxFKQorCXsKKwkJLm1vZGFsaWFzID0gImJmaW5fc3BpX2FkYyIsIC8qIE5hbWUgb2Ygc3BpX2RyaXZlciBmb3IgdGhpcyBkZXZpY2UgKi8KKwkJLm1heF9zcGVlZF9oeiA9IDYyNTAwMDAsICAgICAvKiBtYXggc3BpIGNsb2NrIChTQ0spIHNwZWVkIGluIEhaICovCisJCS5idXNfbnVtID0gMCwgLyogRnJhbWV3b3JrIGJ1cyBudW1iZXIgKi8KKwkJLmNoaXBfc2VsZWN0ID0gMSwgLyogRnJhbWV3b3JrIGNoaXAgc2VsZWN0LiAqLworCQkucGxhdGZvcm1fZGF0YSA9IE5VTEwsIC8qIE5vIHNwaV9kcml2ZXIgc3BlY2lmaWMgY29uZmlnICovCisJCS5jb250cm9sbGVyX2RhdGEgPSAmc3BpX2FkY19jaGlwX2luZm8sCisJfSwKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfU1BJX01NQykgfHwgZGVmaW5lZChDT05GSUdfU1BJX01NQ19NT0RVTEUpCisJeworCQkubW9kYWxpYXMgPSAic3BpX21tY19kdW1teSIsCisJCS5tYXhfc3BlZWRfaHogPSAyNTAwMDAwMCwgICAgIC8qIG1heCBzcGkgY2xvY2sgKFNDSykgc3BlZWQgaW4gSFogKi8KKwkJLmJ1c19udW0gPSAwLAorCQkuY2hpcF9zZWxlY3QgPSAwLAorCQkucGxhdGZvcm1fZGF0YSA9IE5VTEwsCisJCS5jb250cm9sbGVyX2RhdGEgPSAmc3BpX21tY19jaGlwX2luZm8sCisJCS5tb2RlID0gU1BJX01PREVfMywKKwl9LAorCXsKKwkJLm1vZGFsaWFzID0gInNwaV9tbWMiLAorCQkubWF4X3NwZWVkX2h6ID0gMjUwMDAwMDAsICAgICAvKiBtYXggc3BpIGNsb2NrIChTQ0spIHNwZWVkIGluIEhaICovCisJCS5idXNfbnVtID0gMCwKKwkJLmNoaXBfc2VsZWN0ID0gQ09ORklHX1NQSV9NTUNfQ1NfQ0hBTiwKKwkJLnBsYXRmb3JtX2RhdGEgPSBOVUxMLAorCQkuY29udHJvbGxlcl9kYXRhID0gJnNwaV9tbWNfY2hpcF9pbmZvLAorCQkubW9kZSA9IFNQSV9NT0RFXzMsCisJfSwKKyNlbmRpZgorI2lmIGRlZmluZWQoQ09ORklHX1BCWCkKKwl7CisJCS5tb2RhbGlhcyA9ICJmeHMtc3BpIiwKKwkJLm1heF9zcGVlZF9oeiA9IDEyNTAwMDAwLCAgICAgLyogbWF4IHNwaSBjbG9jayAoU0NLKSBzcGVlZCBpbiBIWiAqLworCQkuYnVzX251bSA9IDAsCisJCS5jaGlwX3NlbGVjdCA9IDggLSBDT05GSUdfSjExX0pVTVBFUiwKKwkJLmNvbnRyb2xsZXJfZGF0YSA9ICZzcGlfc2kzeHh4X2NoaXBfaW5mbywKKwkJLm1vZGUgPSBTUElfTU9ERV8zLAorCX0sCisJeworCQkubW9kYWxpYXMgPSAiZnhvLXNwaSIsCisJCS5tYXhfc3BlZWRfaHogPSAxMjUwMDAwMCwgICAgIC8qIG1heCBzcGkgY2xvY2sgKFNDSykgc3BlZWQgaW4gSFogKi8KKwkJLmJ1c19udW0gPSAwLAorCQkuY2hpcF9zZWxlY3QgPSA4IC0gQ09ORklHX0oxOV9KVU1QRVIsCisJCS5jb250cm9sbGVyX2RhdGEgPSAmc3BpX3NpM3h4eF9jaGlwX2luZm8sCisJCS5tb2RlID0gU1BJX01PREVfMywKKwl9LAorI2VuZGlmCisjaWYgZGVmaW5lZChDT05GSUdfVE9VQ0hTQ1JFRU5fQUQ3ODc3KSB8fCBkZWZpbmVkKENPTkZJR19UT1VDSFNDUkVFTl9BRDc4NzdfTU9EVUxFKQorCXsKKwkJLm1vZGFsaWFzCQk9ICJhZDc4NzciLAorCQkucGxhdGZvcm1fZGF0YQkJPSAmYmZpbl9hZDc4NzdfdHNfaW5mbywKKwkJLmlycQkJCT0gSVJRX1BGOCwKKwkJLm1heF9zcGVlZF9oegk9IDEyNTAwMDAwLCAgICAgLyogbWF4IHNwaSBjbG9jayAoU0NLKSBzcGVlZCBpbiBIWiAqLworCQkuYnVzX251bQk9IDAsCisJCS5jaGlwX3NlbGVjdCAgPSAyLAorCQkuY29udHJvbGxlcl9kYXRhID0gJnNwaV9hZDc4NzdfY2hpcF9pbmZvLAorCX0sCisjZW5kaWYKKyNpZiBkZWZpbmVkKENPTkZJR19TTkRfU09DX1dNODczMSkgfHwgZGVmaW5lZChDT05GSUdfU05EX1NPQ19XTTg3MzFfTU9EVUxFKSBcCisJICYmIGRlZmluZWQoQ09ORklHX1NORF9TT0NfV004NzMxX1NQSSkKKwl7CisJCS5tb2RhbGlhcwk9ICJ3bTg3MzEiLAorCQkubWF4X3NwZWVkX2h6CT0gMzEyNTAwMCwgICAgIC8qIG1heCBzcGkgY2xvY2sgKFNDSykgc3BlZWQgaW4gSFogKi8KKwkJLmJ1c19udW0JPSAwLAorCQkuY2hpcF9zZWxlY3QgICAgPSA1LAorCQkuY29udHJvbGxlcl9kYXRhID0gJnNwaV93bTg3MzFfY2hpcF9pbmZvLAorCQkubW9kZSA9IFNQSV9NT0RFXzAsCisJfSwKKyNlbmRpZgorI2lmIGRlZmluZWQoQ09ORklHX1NQSV9TUElERVYpIHx8IGRlZmluZWQoQ09ORklHX1NQSV9TUElERVZfTU9EVUxFKQorCXsKKwkJLm1vZGFsaWFzID0gInNwaWRldiIsCisJCS5tYXhfc3BlZWRfaHogPSAzMTI1MDAwLCAgICAgLyogbWF4IHNwaSBjbG9jayAoU0NLKSBzcGVlZCBpbiBIWiAqLworCQkuYnVzX251bSA9IDAsCisJCS5jaGlwX3NlbGVjdCA9IDEsCisJCS5jb250cm9sbGVyX2RhdGEgPSAmc3BpZGV2X2NoaXBfaW5mbywKKwl9LAorI2VuZGlmCisjaWYgZGVmaW5lZChDT05GSUdfRkJfQkZJTl9MUTAzNVExKSB8fCBkZWZpbmVkKENPTkZJR19GQl9CRklOX0xRMDM1UTFfTU9EVUxFKQorCXsKKwkJLm1vZGFsaWFzID0gImJmaW4tbHEwMzVxMS1zcGkiLAorCQkubWF4X3NwZWVkX2h6ID0gMjAwMDAwMDAsICAgICAvKiBtYXggc3BpIGNsb2NrIChTQ0spIHNwZWVkIGluIEhaICovCisJCS5idXNfbnVtID0gMCwKKwkJLmNoaXBfc2VsZWN0ID0gMSwKKwkJLmNvbnRyb2xsZXJfZGF0YSA9ICZscTAzNXExX3NwaV9jaGlwX2luZm8sCisJCS5tb2RlID0gU1BJX0NQSEEgfCBTUElfQ1BPTCwKKwl9LAorI2VuZGlmCit9OworCisvKiBTUEkgY29udHJvbGxlciBkYXRhICovCisjaWYgZGVmaW5lZChDT05GSUdfU1BJX0JGSU4pIHx8IGRlZmluZWQoQ09ORklHX1NQSV9CRklOX01PRFVMRSkKKy8qIFNQSSAoMCkgKi8KK3N0YXRpYyBzdHJ1Y3QgYmZpbjV4eF9zcGlfbWFzdGVyIGJmaW5fc3BpMF9pbmZvID0geworCS5udW1fY2hpcHNlbGVjdCA9IDUsCisJLmVuYWJsZV9kbWEgPSAxLCAgLyogbWFzdGVyIGhhcyB0aGUgYWJpbGl0eSB0byBkbyBkbWEgdHJhbnNmZXIgKi8KKwkucGluX3JlcSA9IHtQX1NQSTBfU0NLLCBQX1NQSTBfTUlTTywgUF9TUEkwX01PU0ksIDB9LAorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBiZmluX3NwaTBfcmVzb3VyY2VbXSA9IHsKKwlbMF0gPSB7CisJCS5zdGFydCA9IFNQSTBfUkVHQkFTRSwKKwkJLmVuZCAgID0gU1BJMF9SRUdCQVNFICsgMHhGRiwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCisJCX0sCisJWzFdID0geworCQkuc3RhcnQgPSBDSF9TUEkwLAorCQkuZW5kICAgPSBDSF9TUEkwLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYmZpbl9zcGkwX2RldmljZSA9IHsKKwkubmFtZSA9ICJiZmluLXNwaSIsCisJLmlkID0gMCwgLyogQnVzIG51bWJlciAqLworCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRShiZmluX3NwaTBfcmVzb3VyY2UpLAorCS5yZXNvdXJjZSA9IGJmaW5fc3BpMF9yZXNvdXJjZSwKKwkuZGV2ID0geworCQkucGxhdGZvcm1fZGF0YSA9ICZiZmluX3NwaTBfaW5mbywgLyogUGFzc2VkIHRvIGRyaXZlciAqLworCX0sCit9OworCisvKiBTUEkgKDEpICovCitzdGF0aWMgc3RydWN0IGJmaW41eHhfc3BpX21hc3RlciBiZmluX3NwaTFfaW5mbyA9IHsKKwkubnVtX2NoaXBzZWxlY3QgPSA1LAorCS5lbmFibGVfZG1hID0gMSwgIC8qIG1hc3RlciBoYXMgdGhlIGFiaWxpdHkgdG8gZG8gZG1hIHRyYW5zZmVyICovCisJLnBpbl9yZXEgPSB7UF9TUEkxX1NDSywgUF9TUEkxX01JU08sIFBfU1BJMV9NT1NJLCAwfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYmZpbl9zcGkxX3Jlc291cmNlW10gPSB7CisJWzBdID0geworCQkuc3RhcnQgPSBTUEkxX1JFR0JBU0UsCisJCS5lbmQgICA9IFNQSTFfUkVHQkFTRSArIDB4RkYsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAorCQl9LAorCVsxXSA9IHsKKwkJLnN0YXJ0ID0gQ0hfU1BJMSwKKwkJLmVuZCAgID0gQ0hfU1BJMSwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGJmaW5fc3BpMV9kZXZpY2UgPSB7CisJLm5hbWUgPSAiYmZpbi1zcGkiLAorCS5pZCA9IDEsIC8qIEJ1cyBudW1iZXIgKi8KKwkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUoYmZpbl9zcGkxX3Jlc291cmNlKSwKKwkucmVzb3VyY2UgPSBiZmluX3NwaTFfcmVzb3VyY2UsCisJLmRldiA9IHsKKwkJLnBsYXRmb3JtX2RhdGEgPSAmYmZpbl9zcGkxX2luZm8sIC8qIFBhc3NlZCB0byBkcml2ZXIgKi8KKwl9LAorfTsKKyNlbmRpZiAgLyogc3BpIG1hc3RlciBhbmQgZGV2aWNlcyAqLworCisjaWYgZGVmaW5lZChDT05GSUdfU0VSSUFMX0JGSU4pIHx8IGRlZmluZWQoQ09ORklHX1NFUklBTF9CRklOX01PRFVMRSkKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYmZpbl91YXJ0X3Jlc291cmNlc1tdID0geworI2lmZGVmIENPTkZJR19TRVJJQUxfQkZJTl9VQVJUMAorCXsKKwkJLnN0YXJ0ID0gMHhGRkMwMDQwMCwKKwkJLmVuZCA9IDB4RkZDMDA0RkYsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfU0VSSUFMX0JGSU5fVUFSVDEKKwl7CisJCS5zdGFydCA9IDB4RkZDMDIwMDAsCisJCS5lbmQgPSAweEZGQzAyMEZGLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKKwl9LAorI2VuZGlmCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZmluX3VhcnRfZGV2aWNlID0geworCS5uYW1lID0gImJmaW4tdWFydCIsCisJLmlkID0gMSwKKwkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUoYmZpbl91YXJ0X3Jlc291cmNlcyksCisJLnJlc291cmNlID0gYmZpbl91YXJ0X3Jlc291cmNlcywKK307CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX0JGSU5fU0lSKSB8fCBkZWZpbmVkKENPTkZJR19CRklOX1NJUl9NT0RVTEUpCisjaWZkZWYgQ09ORklHX0JGSU5fU0lSMAorc3RhdGljIHN0cnVjdCByZXNvdXJjZSBiZmluX3NpcjBfcmVzb3VyY2VzW10gPSB7CisJeworCQkuc3RhcnQgPSAweEZGQzAwNDAwLAorCQkuZW5kID0gMHhGRkMwMDRGRiwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwl7CisJCS5zdGFydCA9IElSUV9VQVJUMF9SWCwKKwkJLmVuZCA9IElSUV9VQVJUMF9SWCsxLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorCXsKKwkJLnN0YXJ0ID0gQ0hfVUFSVDBfUlgsCisJCS5lbmQgPSBDSF9VQVJUMF9SWCsxLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0RNQSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYmZpbl9zaXIwX2RldmljZSA9IHsKKwkubmFtZSA9ICJiZmluX3NpciIsCisJLmlkID0gMCwKKwkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUoYmZpbl9zaXIwX3Jlc291cmNlcyksCisJLnJlc291cmNlID0gYmZpbl9zaXIwX3Jlc291cmNlcywKK307CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfQkZJTl9TSVIxCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGJmaW5fc2lyMV9yZXNvdXJjZXNbXSA9IHsKKwl7CisJCS5zdGFydCA9IDB4RkZDMDIwMDAsCisJCS5lbmQgPSAweEZGQzAyMEZGLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCXsKKwkJLnN0YXJ0ID0gSVJRX1VBUlQxX1JYLAorCQkuZW5kID0gSVJRX1VBUlQxX1JYKzEsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCX0sCisJeworCQkuc3RhcnQgPSBDSF9VQVJUMV9SWCwKKwkJLmVuZCA9IENIX1VBUlQxX1JYKzEsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfRE1BLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZmluX3NpcjFfZGV2aWNlID0geworCS5uYW1lID0gImJmaW5fc2lyIiwKKwkuaWQgPSAxLAorCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRShiZmluX3NpcjFfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UgPSBiZmluX3NpcjFfcmVzb3VyY2VzLAorfTsKKyNlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19JMkNfQkxBQ0tGSU5fVFdJKSB8fCBkZWZpbmVkKENPTkZJR19JMkNfQkxBQ0tGSU5fVFdJX01PRFVMRSkKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYmZpbl90d2kwX3Jlc291cmNlW10gPSB7CisJWzBdID0geworCQkuc3RhcnQgPSBUV0kwX1JFR0JBU0UsCisJCS5lbmQgICA9IFRXSTBfUkVHQkFTRSwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMV0gPSB7CisJCS5zdGFydCA9IElSUV9UV0ksCisJCS5lbmQgICA9IElSUV9UV0ksCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBpMmNfYmZpbl90d2lfZGV2aWNlID0geworCS5uYW1lID0gImkyYy1iZmluLXR3aSIsCisJLmlkID0gMCwKKwkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUoYmZpbl90d2kwX3Jlc291cmNlKSwKKwkucmVzb3VyY2UgPSBiZmluX3R3aTBfcmVzb3VyY2UsCit9OworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfSTJDX0JPQVJESU5GTworc3RhdGljIHN0cnVjdCBpMmNfYm9hcmRfaW5mbyBfX2luaXRkYXRhIGJmaW5faTJjX2JvYXJkX2luZm9bXSA9IHsKKyNpZiBkZWZpbmVkKENPTkZJR19UV0lfTENEKSB8fCBkZWZpbmVkKENPTkZJR19UV0lfTENEX01PRFVMRSkKKwl7CisJCUkyQ19CT0FSRF9JTkZPKCJwY2Y4NTc0X2xjZCIsIDB4MjIpLAorCX0sCisjZW5kaWYKKyNpZiBkZWZpbmVkKENPTkZJR19UV0lfS0VZUEFEKSB8fCBkZWZpbmVkKENPTkZJR19UV0lfS0VZUEFEX01PRFVMRSkKKwl7CisJCUkyQ19CT0FSRF9JTkZPKCJwY2Y4NTc0X2tleXBhZCIsIDB4MjcpLAorCQkuaXJxID0gSVJRX1BGOCwKKwl9LAorI2VuZGlmCit9OworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19TRVJJQUxfQkZJTl9TUE9SVCkgfHwgZGVmaW5lZChDT05GSUdfU0VSSUFMX0JGSU5fU1BPUlRfTU9EVUxFKQorc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYmZpbl9zcG9ydDBfdWFydF9kZXZpY2UgPSB7CisJLm5hbWUgPSAiYmZpbi1zcG9ydC11YXJ0IiwKKwkuaWQgPSAwLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYmZpbl9zcG9ydDFfdWFydF9kZXZpY2UgPSB7CisJLm5hbWUgPSAiYmZpbi1zcG9ydC11YXJ0IiwKKwkuaWQgPSAxLAorfTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfS0VZQk9BUkRfR1BJTykgfHwgZGVmaW5lZChDT05GSUdfS0VZQk9BUkRfR1BJT19NT0RVTEUpCisjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvX2tleXMuaD4KKworc3RhdGljIHN0cnVjdCBncGlvX2tleXNfYnV0dG9uIGJmaW5fZ3Bpb19rZXlzX3RhYmxlW10gPSB7CisJe0JUTl8wLCBHUElPX1BHMCwgMSwgImdwaW8ta2V5czogQlROMCJ9LAorCXtCVE5fMSwgR1BJT19QRzEzLCAxLCAiZ3Bpby1rZXlzOiBCVE4xIn0sCit9OworCitzdGF0aWMgc3RydWN0IGdwaW9fa2V5c19wbGF0Zm9ybV9kYXRhIGJmaW5fZ3Bpb19rZXlzX2RhdGEgPSB7CisJLmJ1dHRvbnMgICAgICAgID0gYmZpbl9ncGlvX2tleXNfdGFibGUsCisJLm5idXR0b25zICAgICAgID0gQVJSQVlfU0laRShiZmluX2dwaW9fa2V5c190YWJsZSksCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZmluX2RldmljZV9ncGlva2V5cyA9IHsKKwkubmFtZSAgICAgID0gImdwaW8ta2V5cyIsCisJLmRldiA9IHsKKwkJLnBsYXRmb3JtX2RhdGEgPSAmYmZpbl9ncGlvX2tleXNfZGF0YSwKKwl9LAorfTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfU0RIX0JGSU4pIHx8IGRlZmluZWQoQ09ORklHX1NESF9CRklOX01PRFVMRSkKKworc3RhdGljIHN0cnVjdCBiZmluX3NkX2hvc3QgYmZpbl9zZGhfZGF0YSA9IHsKKwkuZG1hX2NoYW4gPSBDSF9SU0ksCisJLmlycV9pbnQwID0gSVJRX1JTSV9JTlQwLAorCS5waW5fcmVxID0ge1BfUlNJX0RBVEEwLCBQX1JTSV9EQVRBMSwgUF9SU0lfREFUQTIsIFBfUlNJX0RBVEEzLCBQX1JTSV9DTUQsIFBfUlNJX0NMSywgMH0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZjUxeF9zZGhfZGV2aWNlID0geworCS5uYW1lID0gImJmaW4tc2RoIiwKKwkuaWQgPSAwLAorCS5kZXYgPSB7CisJCS5wbGF0Zm9ybV9kYXRhID0gJmJmaW5fc2RoX2RhdGEsCisJfSwKK307CisjZW5kaWYKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBiZmluX2dwaW9zX3Jlc291cmNlcyA9IHsKKwkuc3RhcnQgPSAwLAorCS5lbmQgICA9IE1BWF9CTEFDS0ZJTl9HUElPUyAtIDEsCisJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZmluX2dwaW9zX2RldmljZSA9IHsKKwkubmFtZSA9ICJzaW1wbGUtZ3BpbyIsCisJLmlkID0gLTEsCisJLm51bV9yZXNvdXJjZXMgPSAxLAorCS5yZXNvdXJjZSA9ICZiZmluX2dwaW9zX3Jlc291cmNlcywKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgY2Nsa192bGV2X2RhdGFzaGVldFtdID0KK3sKKwlWUlBBSVIoVkxFVl8xMDAsIDQwMDAwMDAwMCksCisJVlJQQUlSKFZMRVZfMTA1LCA0MjYwMDAwMDApLAorCVZSUEFJUihWTEVWXzExMCwgNTAwMDAwMDAwKSwKKwlWUlBBSVIoVkxFVl8xMTUsIDUzMzAwMDAwMCksCisJVlJQQUlSKFZMRVZfMTIwLCA2MDAwMDAwMDApLAorfTsKKworc3RhdGljIHN0cnVjdCBiZmluX2RwbWNfcGxhdGZvcm1fZGF0YSBiZmluX2RtcGNfdnJlZ19kYXRhID0geworCS50dXBsZV90YWIgPSBjY2xrX3ZsZXZfZGF0YXNoZWV0LAorCS50YWJzaXplID0gQVJSQVlfU0laRShjY2xrX3ZsZXZfZGF0YXNoZWV0KSwKKwkudnJfc2V0dGxpbmdfdGltZSA9IDI1IC8qIHVzICovLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYmZpbl9kcG1jID0geworCS5uYW1lID0gImJmaW4gZHBtYyIsCisJLmRldiA9IHsKKwkJLnBsYXRmb3JtX2RhdGEgPSAmYmZpbl9kbXBjX3ZyZWdfZGF0YSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnN0YW1wX2RldmljZXNbXSBfX2luaXRkYXRhID0geworCisJJmJmaW5fZHBtYywKKworI2lmIGRlZmluZWQoQ09ORklHX1JUQ19EUlZfQkZJTikgfHwgZGVmaW5lZChDT05GSUdfUlRDX0RSVl9CRklOX01PRFVMRSkKKwkmcnRjX2RldmljZSwKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfQkZJTl9NQUMpIHx8IGRlZmluZWQoQ09ORklHX0JGSU5fTUFDX01PRFVMRSkKKwkmYmZpbl9tYWNfZGV2aWNlLAorI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19TUElfQkZJTikgfHwgZGVmaW5lZChDT05GSUdfU1BJX0JGSU5fTU9EVUxFKQorCSZiZmluX3NwaTBfZGV2aWNlLAorCSZiZmluX3NwaTFfZGV2aWNlLAorI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19TRVJJQUxfQkZJTikgfHwgZGVmaW5lZChDT05GSUdfU0VSSUFMX0JGSU5fTU9EVUxFKQorCSZiZmluX3VhcnRfZGV2aWNlLAorI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19CRklOX1NJUikgfHwgZGVmaW5lZChDT05GSUdfQkZJTl9TSVJfTU9EVUxFKQorI2lmZGVmIENPTkZJR19CRklOX1NJUjAKKwkmYmZpbl9zaXIwX2RldmljZSwKKyNlbmRpZgorI2lmZGVmIENPTkZJR19CRklOX1NJUjEKKwkmYmZpbl9zaXIxX2RldmljZSwKKyNlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19JMkNfQkxBQ0tGSU5fVFdJKSB8fCBkZWZpbmVkKENPTkZJR19JMkNfQkxBQ0tGSU5fVFdJX01PRFVMRSkKKwkmaTJjX2JmaW5fdHdpX2RldmljZSwKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfU0VSSUFMX0JGSU5fU1BPUlQpIHx8IGRlZmluZWQoQ09ORklHX1NFUklBTF9CRklOX1NQT1JUX01PRFVMRSkKKwkmYmZpbl9zcG9ydDBfdWFydF9kZXZpY2UsCisJJmJmaW5fc3BvcnQxX3VhcnRfZGV2aWNlLAorI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19LRVlCT0FSRF9HUElPKSB8fCBkZWZpbmVkKENPTkZJR19LRVlCT0FSRF9HUElPX01PRFVMRSkKKwkmYmZpbl9kZXZpY2VfZ3Bpb2tleXMsCisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX1NESF9CRklOKSB8fCBkZWZpbmVkKENPTkZJR19TREhfQkZJTl9NT0RVTEUpCisJJmJmNTF4X3NkaF9kZXZpY2UsCisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX01URF9QSFlTTUFQKSB8fCBkZWZpbmVkKENPTkZJR19NVERfUEhZU01BUF9NT0RVTEUpCisJJmV6YnJkX2ZsYXNoX2RldmljZSwKKyNlbmRpZgorCisJJmJmaW5fZ3Bpb3NfZGV2aWNlLAorfTsKKworc3RhdGljIGludCBfX2luaXQgZXpicmRfaW5pdCh2b2lkKQoreworCXByaW50ayhLRVJOX0lORk8gIiVzKCk6IHJlZ2lzdGVyaW5nIGRldmljZSByZXNvdXJjZXNcbiIsIF9fZnVuY19fKTsKKworI2lmZGVmIENPTkZJR19JMkNfQk9BUkRJTkZPCisJaTJjX3JlZ2lzdGVyX2JvYXJkX2luZm8oMCwgYmZpbl9pMmNfYm9hcmRfaW5mbywKKwkJCQlBUlJBWV9TSVpFKGJmaW5faTJjX2JvYXJkX2luZm8pKTsKKyNlbmRpZgorCisJcGxhdGZvcm1fYWRkX2RldmljZXMoc3RhbXBfZGV2aWNlcywgQVJSQVlfU0laRShzdGFtcF9kZXZpY2VzKSk7CisJc3BpX3JlZ2lzdGVyX2JvYXJkX2luZm8oYmZpbl9zcGlfYm9hcmRfaW5mbywgQVJSQVlfU0laRShiZmluX3NwaV9ib2FyZF9pbmZvKSk7CisJcmV0dXJuIDA7Cit9CisKK2FyY2hfaW5pdGNhbGwoZXpicmRfaW5pdCk7CisKK3ZvaWQgbmF0aXZlX21hY2hpbmVfcmVzdGFydChjaGFyICpjbWQpCit7CisJLyogd29ya2Fyb3VuZCByZWJvb3QgaGFuZyB3aGVuIGJvb3RpbmcgZnJvbSBTUEkgKi8KKwlpZiAoKGJmaW5fcmVhZF9TWVNDUigpICYgMHg3KSA9PSAweDMpCisJCWJmaW5fZ3Bpb19yZXNldF9zcGkwX3NzZWwxKCk7Cit9CisKK3ZvaWQgYmZpbl9nZXRfZXRoZXJfYWRkcihjaGFyICphZGRyKQoreworCS8qIHRoZSBNQUMgaXMgc3RvcmVkIGluIE9UUCBtZW1vcnkgcGFnZSAweERGICovCisJdTMyIHJldDsKKwl1NjQgb3RwX21hYzsKKwl1MzIgKCpvdHBfcmVhZCkodTMyIHBhZ2UsIHUzMiBmbGFncywgdTY0ICpwYWdlX2NvbnRlbnQpID0gKHZvaWQgKikweEVGMDAwMDFBOworCisJcmV0ID0gb3RwX3JlYWQoMHhERiwgMHgwMCwgJm90cF9tYWMpOworCWlmICghKHJldCAmIDB4MSkpIHsKKwkJY2hhciAqb3RwX21hY19wID0gKGNoYXIgKikmb3RwX21hYzsKKwkJZm9yIChyZXQgPSAwOyByZXQgPCA2OyArK3JldCkKKwkJCWFkZHJbcmV0XSA9IG90cF9tYWNfcFs1IC0gcmV0XTsKKwl9Cit9CitFWFBPUlRfU1lNQk9MKGJmaW5fZ2V0X2V0aGVyX2FkZHIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2RtYS5jIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2RtYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5OGU4OGMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvZG1hLmMKQEAgLTAsMCArMSwxMTggQEAKKy8qCisgKiBGaWxlOiAgICAgICAgIGFyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9kbWEuYworICogQmFzZWQgb246CisgKiBBdXRob3I6ICAgICAgIEJyeWFuIFd1IDxjb29sb25leUBrZXJuZWwub3JnPgorICoKKyAqIENyZWF0ZWQ6CisgKiBEZXNjcmlwdGlvbjogIFRoaXMgZmlsZSBjb250YWlucyB0aGUgc2ltcGxlIERNQSBJbXBsZW1lbnRhdGlvbiBmb3IgQmxhY2tmaW4KKyAqCisgKiBNb2RpZmllZDoKKyAqICAgICAgICAgICAgICAgQ29weXJpZ2h0IDIwMDQtMjAwOCBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKgorICogQnVnczogICAgICAgICBFbnRlciBidWdzIGF0IGh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZy8KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSB0aGUgZmlsZSBDT1BZSU5HLCBvciB3cml0ZQorICogdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgPGFzbS9ibGFja2Zpbi5oPgorI2luY2x1ZGUgPGFzbS9kbWEuaD4KKworc3RydWN0IGRtYV9yZWdpc3RlciAqZG1hX2lvX2Jhc2VfYWRkcltNQVhfRE1BX0NIQU5ORUxTXSA9IHsKKwkoc3RydWN0IGRtYV9yZWdpc3RlciAqKSBETUEwX05FWFRfREVTQ19QVFIsCisJKHN0cnVjdCBkbWFfcmVnaXN0ZXIgKikgRE1BMV9ORVhUX0RFU0NfUFRSLAorCShzdHJ1Y3QgZG1hX3JlZ2lzdGVyICopIERNQTJfTkVYVF9ERVNDX1BUUiwKKwkoc3RydWN0IGRtYV9yZWdpc3RlciAqKSBETUEzX05FWFRfREVTQ19QVFIsCisJKHN0cnVjdCBkbWFfcmVnaXN0ZXIgKikgRE1BNF9ORVhUX0RFU0NfUFRSLAorCShzdHJ1Y3QgZG1hX3JlZ2lzdGVyICopIERNQTVfTkVYVF9ERVNDX1BUUiwKKwkoc3RydWN0IGRtYV9yZWdpc3RlciAqKSBETUE2X05FWFRfREVTQ19QVFIsCisJKHN0cnVjdCBkbWFfcmVnaXN0ZXIgKikgRE1BN19ORVhUX0RFU0NfUFRSLAorCShzdHJ1Y3QgZG1hX3JlZ2lzdGVyICopIERNQThfTkVYVF9ERVNDX1BUUiwKKwkoc3RydWN0IGRtYV9yZWdpc3RlciAqKSBETUE5X05FWFRfREVTQ19QVFIsCisJKHN0cnVjdCBkbWFfcmVnaXN0ZXIgKikgRE1BMTBfTkVYVF9ERVNDX1BUUiwKKwkoc3RydWN0IGRtYV9yZWdpc3RlciAqKSBETUExMV9ORVhUX0RFU0NfUFRSLAorCShzdHJ1Y3QgZG1hX3JlZ2lzdGVyICopIE1ETUFfUzBfTkVYVF9ERVNDX1BUUiwKKwkoc3RydWN0IGRtYV9yZWdpc3RlciAqKSBNRE1BX0QwX05FWFRfREVTQ19QVFIsCisJKHN0cnVjdCBkbWFfcmVnaXN0ZXIgKikgTURNQV9TMV9ORVhUX0RFU0NfUFRSLAorCShzdHJ1Y3QgZG1hX3JlZ2lzdGVyICopIE1ETUFfRDFfTkVYVF9ERVNDX1BUUiwKK307CitFWFBPUlRfU1lNQk9MKGRtYV9pb19iYXNlX2FkZHIpOworCitpbnQgY2hhbm5lbDJpcnEodW5zaWduZWQgaW50IGNoYW5uZWwpCit7CisJaW50IHJldF9pcnEgPSAtMTsKKworCXN3aXRjaCAoY2hhbm5lbCkgeworCWNhc2UgQ0hfUFBJOgorCQlyZXRfaXJxID0gSVJRX1BQSTsKKwkJYnJlYWs7CisKKwljYXNlIENIX0VNQUNfUlg6CisJCXJldF9pcnEgPSBJUlFfTUFDX1JYOworCQlicmVhazsKKworCWNhc2UgQ0hfRU1BQ19UWDoKKwkJcmV0X2lycSA9IElSUV9NQUNfVFg7CisJCWJyZWFrOworCisJY2FzZSBDSF9VQVJUMV9SWDoKKwkJcmV0X2lycSA9IElSUV9VQVJUMV9SWDsKKwkJYnJlYWs7CisKKwljYXNlIENIX1VBUlQxX1RYOgorCQlyZXRfaXJxID0gSVJRX1VBUlQxX1RYOworCQlicmVhazsKKworCWNhc2UgQ0hfU1BPUlQwX1JYOgorCQlyZXRfaXJxID0gSVJRX1NQT1JUMF9SWDsKKwkJYnJlYWs7CisKKwljYXNlIENIX1NQT1JUMF9UWDoKKwkJcmV0X2lycSA9IElSUV9TUE9SVDBfVFg7CisJCWJyZWFrOworCisJY2FzZSBDSF9TUE9SVDFfUlg6CisJCXJldF9pcnEgPSBJUlFfU1BPUlQxX1JYOworCQlicmVhazsKKworCWNhc2UgQ0hfU1BPUlQxX1RYOgorCQlyZXRfaXJxID0gSVJRX1NQT1JUMV9UWDsKKwkJYnJlYWs7CisKKwljYXNlIENIX1NQSTA6CisJCXJldF9pcnEgPSBJUlFfU1BJMDsKKwkJYnJlYWs7CisKKwljYXNlIENIX1VBUlQwX1JYOgorCQlyZXRfaXJxID0gSVJRX1VBUlQwX1JYOworCQlicmVhazsKKworCWNhc2UgQ0hfVUFSVDBfVFg6CisJCXJldF9pcnEgPSBJUlFfVUFSVDBfVFg7CisJCWJyZWFrOworCisJY2FzZSBDSF9NRU1fU1RSRUFNMF9TUkM6CisJY2FzZSBDSF9NRU1fU1RSRUFNMF9ERVNUOgorCQlyZXRfaXJxID0gSVJRX01FTV9ETUEwOworCQlicmVhazsKKworCWNhc2UgQ0hfTUVNX1NUUkVBTTFfU1JDOgorCWNhc2UgQ0hfTUVNX1NUUkVBTTFfREVTVDoKKwkJcmV0X2lycSA9IElSUV9NRU1fRE1BMTsKKwkJYnJlYWs7CisJfQorCXJldHVybiByZXRfaXJxOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2luY2x1ZGUvbWFjaC9hbm9tYWx5LmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvaW5jbHVkZS9tYWNoL2Fub21hbHkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNWI0YmVmCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2luY2x1ZGUvbWFjaC9hbm9tYWx5LmgKQEAgLTAsMCArMSw3OSBAQAorLyoKKyAqIEZpbGU6IGluY2x1ZGUvYXNtLWJsYWNrZmluL21hY2gtYmY1MTgvYW5vbWFseS5oCisgKiBCdWdzOiBFbnRlciBidWdzIGF0IGh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZy8KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwOCBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCisgKi8KKworLyogVGhpcyBmaWxlIHNob3VsZSBiZSB1cCB0byBkYXRlIHdpdGg6CisgKiAgLSA/Pz8/CisgKi8KKworI2lmbmRlZiBfTUFDSF9BTk9NQUxZX0hfCisjZGVmaW5lIF9NQUNIX0FOT01BTFlfSF8KKworLyogTXVsdGktSXNzdWUgSW5zdHJ1Y3Rpb24gd2l0aCBkc3AzMnNoaWZ0aW1tIGluIHNsb3QxIGFuZCBQLXJlZyBTdG9yZSBpbiBzbG90MiBOb3QgU3VwcG9ydGVkICovCisjZGVmaW5lIEFOT01BTFlfMDUwMDAwNzQgKDEpCisvKiBSeC5IIENhbm5vdCBCZSBVc2VkIHRvIEFjY2VzcyAxNi1iaXQgU3lzdGVtIE1NUiBSZWdpc3RlcnMgKi8KKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDEyMiAoMSkKKy8qIEZhbHNlIEhhcmR3YXJlIEVycm9yIGZyb20gYW4gQWNjZXNzIGluIHRoZSBTaGFkb3cgb2YgYSBDb25kaXRpb25hbCBCcmFuY2ggKi8KKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDI0NSAoMSkKKy8qIFNlbnNpdGl2aXR5IFRvIE5vaXNlIHdpdGggU2xvdyBJbnB1dCBFZGdlIFJhdGVzIG9uIEV4dGVybmFsIFNQT1JUIFRYIGFuZCBSWCBDbG9ja3MgKi8KKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDI2NSAoMSkKKy8qIEZhbHNlIEhhcmR3YXJlIEVycm9ycyBDYXVzZWQgYnkgRmV0Y2hlcyBhdCB0aGUgQm91bmRhcnkgb2YgUmVzZXJ2ZWQgTWVtb3J5ICovCisjZGVmaW5lIEFOT01BTFlfMDUwMDAzMTAgKDEpCisvKiBQUEkgVW5kZXJmbG93IEVycm9yIEdvZXMgVW5kZXRlY3RlZCBpbiBJVFUtUiA2NTYgTW9kZSAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwMzY2ICgxKQorLyogTG9ja2JveCBTRVNSIEZpcm13YXJlIERvZXMgTm90IFNhdmUvUmVzdG9yZSBGdWxsIENvbnRleHQgKi8KKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDQwNSAoMSkKKy8qIExvY2tib3ggRmlybXdhcmUgTWVtb3J5IENsZWFudXAgUm91dGluZSBEb2VzIG5vdCBDbGVhciBSZWdpc3RlcnMgKi8KKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDQwOCAoMSkKKy8qIFNwZWN1bGF0aXZlIEZldGNoZXMgQ2FuIENhdXNlIFVuZGVzaXJlZCBFeHRlcm5hbCBGSUZPIE9wZXJhdGlvbnMgKi8KKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDQxNiAoMSkKKy8qIFRXSSBGYWxsIFRpbWUgKFRvZikgTWF5IFZpb2xhdGUgdGhlIE1pbmltdW0gSTJDIFNwZWNpZmljYXRpb24gKi8KKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDQyMSAoMSkKKy8qIFRXSSBJbnB1dCBDYXBhY2l0YW5jZSAoQ2kpIE1heSBWaW9sYXRlIHRoZSBNYXhpbXVtIEkyQyBTcGVjaWZpY2F0aW9uICovCisjZGVmaW5lIEFOT01BTFlfMDUwMDA0MjIgKDEpCisvKiBTcGVjdWxhdGl2ZSBGZXRjaGVzIG9mIEluZGlyZWN0LVBvaW50ZXIgSW5zdHJ1Y3Rpb25zIENhbiBDYXVzZSBGYWxzZSBIYXJkd2FyZSBFcnJvcnMgKi8KKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDQyNiAoMSkKKy8qIFNvZnR3YXJlIFN5c3RlbSBSZXNldCBDb3JydXB0cyBQTExfTE9DS0NOVCBSZWdpc3RlciAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwNDMwICgxKQorLyogSW5jb3JyZWN0IFVzZSBvZiBTdGFjayBpbiBMb2NrYm94IEZpcm13YXJlIER1cmluZyBBdXRoZW50aWNhdGlvbiAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwNDMxICgxKQorLyogQ2VydGFpbiBTSUMgUmVnaXN0ZXJzIGFyZSBub3QgUmVzZXQgQWZ0ZXIgU29mdCBvciBDb3JlIERvdWJsZSBGYXVsdCBSZXNldCAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwNDM1ICgxKQorLyogUE9SVHhfRFJJVkUgYW5kIFBPUlR4X0hZU1RFUkVTSVMgUmVnaXN0ZXJzIFJlYWQgQmFjayBJbmNvcnJlY3QgVmFsdWVzICovCisjZGVmaW5lIEFOT01BTFlfMDUwMDA0MzggKDEpCisvKiBQcmVib290IENhbm5vdCBiZSBVc2VkIHRvIFByb2dyYW0gdGhlIFBMTF9ESVYgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDQzOSAoMSkKKy8qIGJmcm9tX1N5c0NvbnRyb2woKSBDYW5ub3QgYmUgVXNlZCB0byBXcml0ZSB0aGUgUExMX0RJViBSZWdpc3RlciAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwNDQwICgxKQorLyogSUZMVVNIIEluc3RydWN0aW9uIGF0IEVuZCBvZiBIYXJkd2FyZSBMb29wIENhdXNlcyBJbmZpbml0ZSBTdGFsbCAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwNDQzICgxKQorLyogSW5jb3JyZWN0IEwxIEluc3RydWN0aW9uIEJhbmsgQiBNZW1vcnkgTWFwIExvY2F0aW9uICovCisjZGVmaW5lIEFOT01BTFlfMDUwMDA0NDQgKDEpCisKKy8qIEFub21hbGllcyB0aGF0IGRvbid0IGV4aXN0IG9uIHRoaXMgcHJvYyAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwMTI1ICgwKQorI2RlZmluZSBBTk9NQUxZXzA1MDAwMTU4ICgwKQorI2RlZmluZSBBTk9NQUxZXzA1MDAwMTgzICgwKQorI2RlZmluZSBBTk9NQUxZXzA1MDAwMTk4ICgwKQorI2RlZmluZSBBTk9NQUxZXzA1MDAwMjMwICgwKQorI2RlZmluZSBBTk9NQUxZXzA1MDAwMjQ0ICgwKQorI2RlZmluZSBBTk9NQUxZXzA1MDAwMjYxICgwKQorI2RlZmluZSBBTk9NQUxZXzA1MDAwMjYzICgwKQorI2RlZmluZSBBTk9NQUxZXzA1MDAwMjY2ICgwKQorI2RlZmluZSBBTk9NQUxZXzA1MDAwMjczICgwKQorI2RlZmluZSBBTk9NQUxZXzA1MDAwMjg1ICgwKQorI2RlZmluZSBBTk9NQUxZXzA1MDAwMzA3ICgwKQorI2RlZmluZSBBTk9NQUxZXzA1MDAwMzExICgwKQorI2RlZmluZSBBTk9NQUxZXzA1MDAwMzEyICgwKQorI2RlZmluZSBBTk9NQUxZXzA1MDAwMzIzICgwKQorI2RlZmluZSBBTk9NQUxZXzA1MDAwMzUzICgwKQorI2RlZmluZSBBTk9NQUxZXzA1MDAwMzYzICgwKQorI2RlZmluZSBBTk9NQUxZXzA1MDAwMzg2ICgwKQorI2RlZmluZSBBTk9NQUxZXzA1MDAwNDEyICgwKQorI2RlZmluZSBBTk9NQUxZXzA1MDAwNDMyICgwKQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9pbmNsdWRlL21hY2gvYmY1MTguaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9pbmNsdWRlL21hY2gvYmY1MTguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OGRhMWEwCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2luY2x1ZGUvbWFjaC9iZjUxOC5oCkBAIC0wLDAgKzEsMTMyIEBACisvKgorICogRmlsZTogICAgICAgICBpbmNsdWRlL2FzbS1ibGFja2Zpbi9tYWNoLWJmNTE4L2JmNTE4LmgKKyAqIEJhc2VkIG9uOglpbmNsdWRlL2FzbS1ibGFja2Zpbi9tYWNoLWJmNTI3L2JmNTI3LmgKKyAqIEF1dGhvcjoJTWljaGFlbCBIZW5uZXJpY2ggKG1pY2hhZWwuaGVubmVyaWNoQGFuYWxvZy5jb20pCisgKgorICogQ3JlYXRlZDoKKyAqIERlc2NyaXB0aW9uOiAgU1lTVEVNIE1NUiBSRUdJU1RFUiBBTkQgTUVNT1JZIE1BUCBGT1IgQURTUC1CRjUxOAorICoKKyAqIE1vZGlmaWVkOgorICogICAgICAgICAgICAgICBDb3B5cmlnaHQgMjAwNC0yMDA3IEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqCisgKiBCdWdzOiAgICAgICAgIEVudGVyIGJ1Z3MgYXQgaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnLworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIHRoZSBmaWxlIENPUFlJTkcsIG9yIHdyaXRlCisgKiB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqLworCisjaWZuZGVmIF9fTUFDSF9CRjUxOF9IX18KKyNkZWZpbmUgX19NQUNIX0JGNTE4X0hfXworCisjZGVmaW5lIE9GRlNFVF8oeCkgKCh4KSAmIDB4MDAwMEZGRkYpCisKKy8qc29tZSBtaXNjIGRlZmluZXMqLworI2RlZmluZSBJTUFTS19JVkcxNQkJMHg4MDAwCisjZGVmaW5lIElNQVNLX0lWRzE0CQkweDQwMDAKKyNkZWZpbmUgSU1BU0tfSVZHMTMJCTB4MjAwMAorI2RlZmluZSBJTUFTS19JVkcxMgkJMHgxMDAwCisKKyNkZWZpbmUgSU1BU0tfSVZHMTEJCTB4MDgwMAorI2RlZmluZSBJTUFTS19JVkcxMAkJMHgwNDAwCisjZGVmaW5lIElNQVNLX0lWRzkJCTB4MDIwMAorI2RlZmluZSBJTUFTS19JVkc4CQkweDAxMDAKKworI2RlZmluZSBJTUFTS19JVkc3CQkweDAwODAKKyNkZWZpbmUgSU1BU0tfSVZHVE1SCQkweDAwNDAKKyNkZWZpbmUgSU1BU0tfSVZHSFcJCTB4MDAyMAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIEJGSU5fRFNVQkJBTktTCTQKKyNkZWZpbmUgQkZJTl9EV0FZUwkJMgorI2RlZmluZSBCRklOX0RMSU5FUwkJNjQKKyNkZWZpbmUgQkZJTl9JU1VCQkFOS1MJNAorI2RlZmluZSBCRklOX0lXQVlTCQk0CisjZGVmaW5lIEJGSU5fSUxJTkVTCQkzMgorCisjZGVmaW5lIFdBWTBfTAkJCTB4MQorI2RlZmluZSBXQVkxX0wJCQkweDIKKyNkZWZpbmUgV0FZMDFfTAkJCTB4MworI2RlZmluZSBXQVkyX0wJCQkweDQKKyNkZWZpbmUgV0FZMDJfTAkJCTB4NQorI2RlZmluZQlXQVkxMl9MCQkJMHg2CisjZGVmaW5lCVdBWTAxMl9MCQkweDcKKworI2RlZmluZQlXQVkzX0wJCQkweDgKKyNkZWZpbmUJV0FZMDNfTAkJCTB4OQorI2RlZmluZQlXQVkxM19MCQkJMHhBCisjZGVmaW5lCVdBWTAxM19MCQkweEIKKworI2RlZmluZQlXQVkzMl9MCQkJMHhDCisjZGVmaW5lCVdBWTMyMF9MCQkweEQKKyNkZWZpbmUJV0FZMzIxX0wJCTB4RQorI2RlZmluZQlXQVlBTExfTAkJMHhGCisKKyNkZWZpbmUgRE1DX0VOQUJMRSAoMjw8MikJLyp5ZXMsIDIsIG5vdCAxICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogRUJJVSBTZXR0aW5ncyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIEFNQkNUTDBWQUwJKChDT05GSUdfQkFOS18xIDw8IDE2KSB8IENPTkZJR19CQU5LXzApCisjZGVmaW5lIEFNQkNUTDFWQUwJKChDT05GSUdfQkFOS18zIDw8IDE2KSB8IENPTkZJR19CQU5LXzIpCisKKyNpZmRlZiBDT05GSUdfQ19BTUJFTl9BTEwKKyNkZWZpbmUgVl9BTUJFTiBBTUJFTl9BTEwKKyNlbmRpZgorI2lmZGVmIENPTkZJR19DX0FNQkVOCisjZGVmaW5lIFZfQU1CRU4gMHgwCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfQ19BTUJFTl9CMAorI2RlZmluZSBWX0FNQkVOIEFNQkVOX0IwCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfQ19BTUJFTl9CMF9CMQorI2RlZmluZSBWX0FNQkVOIEFNQkVOX0IwX0IxCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfQ19BTUJFTl9CMF9CMV9CMgorI2RlZmluZSBWX0FNQkVOIEFNQkVOX0IwX0IxX0IyCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfQ19BTUNLRU4KKyNkZWZpbmUgVl9BTUNLRU4gQU1DS0VOCisjZWxzZQorI2RlZmluZSBWX0FNQ0tFTiAweDAKKyNlbmRpZgorI2lmZGVmIENPTkZJR19DX0NEUFJJTworI2RlZmluZSBWX0NEUFJJTyAweDEwMAorI2Vsc2UKKyNkZWZpbmUgVl9DRFBSSU8gMHgwCisjZW5kaWYKKworI2RlZmluZSBBTUdDVExWQUwJKFZfQU1CRU4gfCBWX0FNQ0tFTiB8IFZfQ0RQUklPKQorCisjaWZkZWYgQ09ORklHX0JGNTE4CisjZGVmaW5lIENQVSAiQkY1MTgiCisjZGVmaW5lIENQVUlEIDB4MjdlOAorI2VuZGlmCisjaWZkZWYgQ09ORklHX0JGNTE2CisjZGVmaW5lIENQVSAiQkY1MTYiCisjZGVmaW5lIENQVUlEIDB4MjdlOAorI2VuZGlmCisjaWZkZWYgQ09ORklHX0JGNTE0CisjZGVmaW5lIENQVSAiQkY1MTQiCisjZGVmaW5lIENQVUlEIDB4MjdlOAorI2VuZGlmCisjaWZkZWYgQ09ORklHX0JGNTEyCisjZGVmaW5lIENQVSAiQkY1MTIiCisjZGVmaW5lIENQVUlEIDB4MjdlOAorI2VuZGlmCisKKyNpZm5kZWYgQ1BVCisjZXJyb3IgIlVua25vd24gQ1BVIHR5cGUgLSBUaGlzIGtlcm5lbCBkb2Vzbid0IHNlZW0gdG8gYmUgY29uZmlndXJlZCBwcm9wZXJseSIKKyNlbmRpZgorCisjZW5kaWYJCQkJLyogX19NQUNIX0JGNTE4X0hfXyAgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9pbmNsdWRlL21hY2gvYmZpbl9zZXJpYWxfNXh4LmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvaW5jbHVkZS9tYWNoL2JmaW5fc2VyaWFsXzV4eC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1MGE2M2IKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvaW5jbHVkZS9tYWNoL2JmaW5fc2VyaWFsXzV4eC5oCkBAIC0wLDAgKzEsMTY5IEBACisvKgorICogZmlsZTogICAgICAgIGluY2x1ZGUvYXNtLWJsYWNrZmluL21hY2gtYmY1MTgvYmZpbl9zZXJpYWxfNXh4LmgKKyAqIGJhc2VkIG9uOgorICogYXV0aG9yOgorICoKKyAqIGNyZWF0ZWQ6CisgKiBkZXNjcmlwdGlvbjoKKyAqCWJsYWNrZmluIHNlcmlhbCBkcml2ZXIgaGVhZCBmaWxlCisgKiByZXY6CisgKgorICogbW9kaWZpZWQ6CisgKgorICoKKyAqIGJ1Z3M6ICAgICAgICAgZW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCisgKgorICogdGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgZ251IGdlbmVyYWwgcHVibGljIGxpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgZnJlZSBzb2Z0d2FyZSBmb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiB0aGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCB3aXRob3V0IGFueSB3YXJyYW50eTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBtZXJjaGFudGFiaWxpdHkgb3IgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuICBzZWUgdGhlCisgKiBnbnUgZ2VuZXJhbCBwdWJsaWMgbGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIHlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIGdudSBnZW5lcmFsIHB1YmxpYyBsaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIGNvcHlpbmcuCisgKiBpZiBub3QsIHdyaXRlIHRvIHRoZSBmcmVlIHNvZnR3YXJlIGZvdW5kYXRpb24sCisgKiA1OSB0ZW1wbGUgcGxhY2UgLSBzdWl0ZSAzMzAsIGJvc3RvbiwgbWEgMDIxMTEtMTMwNywgdXNhLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9zZXJpYWwuaD4KKyNpbmNsdWRlIDxhc20vZG1hLmg+CisjaW5jbHVkZSA8YXNtL3BvcnRtdXguaD4KKworI2RlZmluZSBVQVJUX0dFVF9DSEFSKHVhcnQpICAgICBiZmluX3JlYWQxNigoKHVhcnQpLT5wb3J0Lm1lbWJhc2UgKyBPRkZTRVRfUkJSKSkKKyNkZWZpbmUgVUFSVF9HRVRfRExMKHVhcnQpCWJmaW5fcmVhZDE2KCgodWFydCktPnBvcnQubWVtYmFzZSArIE9GRlNFVF9ETEwpKQorI2RlZmluZSBVQVJUX0dFVF9JRVIodWFydCkgICAgICBiZmluX3JlYWQxNigoKHVhcnQpLT5wb3J0Lm1lbWJhc2UgKyBPRkZTRVRfSUVSKSkKKyNkZWZpbmUgVUFSVF9HRVRfRExIKHVhcnQpCWJmaW5fcmVhZDE2KCgodWFydCktPnBvcnQubWVtYmFzZSArIE9GRlNFVF9ETEgpKQorI2RlZmluZSBVQVJUX0dFVF9JSVIodWFydCkgICAgICBiZmluX3JlYWQxNigoKHVhcnQpLT5wb3J0Lm1lbWJhc2UgKyBPRkZTRVRfSUlSKSkKKyNkZWZpbmUgVUFSVF9HRVRfTENSKHVhcnQpICAgICAgYmZpbl9yZWFkMTYoKCh1YXJ0KS0+cG9ydC5tZW1iYXNlICsgT0ZGU0VUX0xDUikpCisjZGVmaW5lIFVBUlRfR0VUX0dDVEwodWFydCkgICAgIGJmaW5fcmVhZDE2KCgodWFydCktPnBvcnQubWVtYmFzZSArIE9GRlNFVF9HQ1RMKSkKKworI2RlZmluZSBVQVJUX1BVVF9DSEFSKHVhcnQsIHYpICAgYmZpbl93cml0ZTE2KCgodWFydCktPnBvcnQubWVtYmFzZSArIE9GRlNFVF9USFIpLCB2KQorI2RlZmluZSBVQVJUX1BVVF9ETEwodWFydCwgdikgICAgYmZpbl93cml0ZTE2KCgodWFydCktPnBvcnQubWVtYmFzZSArIE9GRlNFVF9ETEwpLCB2KQorI2RlZmluZSBVQVJUX1BVVF9JRVIodWFydCwgdikgICAgYmZpbl93cml0ZTE2KCgodWFydCktPnBvcnQubWVtYmFzZSArIE9GRlNFVF9JRVIpLCB2KQorI2RlZmluZSBVQVJUX1NFVF9JRVIodWFydCwgdikgICAgVUFSVF9QVVRfSUVSKHVhcnQsIFVBUlRfR0VUX0lFUih1YXJ0KSB8ICh2KSkKKyNkZWZpbmUgVUFSVF9DTEVBUl9JRVIodWFydCwgdikgIFVBUlRfUFVUX0lFUih1YXJ0LCBVQVJUX0dFVF9JRVIodWFydCkgJiB+KHYpKQorI2RlZmluZSBVQVJUX1BVVF9ETEgodWFydCwgdikgICAgYmZpbl93cml0ZTE2KCgodWFydCktPnBvcnQubWVtYmFzZSArIE9GRlNFVF9ETEgpLCB2KQorI2RlZmluZSBVQVJUX1BVVF9MQ1IodWFydCwgdikgICAgYmZpbl93cml0ZTE2KCgodWFydCktPnBvcnQubWVtYmFzZSArIE9GRlNFVF9MQ1IpLCB2KQorI2RlZmluZSBVQVJUX1BVVF9HQ1RMKHVhcnQsIHYpICAgYmZpbl93cml0ZTE2KCgodWFydCktPnBvcnQubWVtYmFzZSArIE9GRlNFVF9HQ1RMKSwgdikKKworI2RlZmluZSBVQVJUX1NFVF9ETEFCKHVhcnQpICAgICBkbyB7IFVBUlRfUFVUX0xDUih1YXJ0LCBVQVJUX0dFVF9MQ1IodWFydCkgfCBETEFCKTsgU1NZTkMoKTsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgVUFSVF9DTEVBUl9ETEFCKHVhcnQpICAgZG8geyBVQVJUX1BVVF9MQ1IodWFydCwgVUFSVF9HRVRfTENSKHVhcnQpICYgfkRMQUIpOyBTU1lOQygpOyB9IHdoaWxlICgwKQorCisjZGVmaW5lIFVBUlRfR0VUX0NUUyh4KSBncGlvX2dldF92YWx1ZSh4LT5jdHNfcGluKQorI2RlZmluZSBVQVJUX1NFVF9SVFMoeCkgZ3Bpb19zZXRfdmFsdWUoeC0+cnRzX3BpbiwgMSkKKyNkZWZpbmUgVUFSVF9DTEVBUl9SVFMoeCkgZ3Bpb19zZXRfdmFsdWUoeC0+cnRzX3BpbiwgMCkKKyNkZWZpbmUgVUFSVF9FTkFCTEVfSU5UUyh4LCB2KSBVQVJUX1BVVF9JRVIoeCwgdikKKyNkZWZpbmUgVUFSVF9ESVNBQkxFX0lOVFMoeCkgVUFSVF9QVVRfSUVSKHgsIDApCisKKyNpZiBkZWZpbmVkKENPTkZJR19CRklOX1VBUlQwX0NUU1JUUykgfHwgZGVmaW5lZChDT05GSUdfQkZJTl9VQVJUMV9DVFNSVFMpCisjIGRlZmluZSBDT05GSUdfU0VSSUFMX0JGSU5fQ1RTUlRTCisKKyMgaWZuZGVmIENPTkZJR19VQVJUMF9DVFNfUElOCisjICBkZWZpbmUgQ09ORklHX1VBUlQwX0NUU19QSU4gLTEKKyMgZW5kaWYKKworIyBpZm5kZWYgQ09ORklHX1VBUlQwX1JUU19QSU4KKyMgIGRlZmluZSBDT05GSUdfVUFSVDBfUlRTX1BJTiAtMQorIyBlbmRpZgorCisjIGlmbmRlZiBDT05GSUdfVUFSVDFfQ1RTX1BJTgorIyAgZGVmaW5lIENPTkZJR19VQVJUMV9DVFNfUElOIC0xCisjIGVuZGlmCisKKyMgaWZuZGVmIENPTkZJR19VQVJUMV9SVFNfUElOCisjICBkZWZpbmUgQ09ORklHX1VBUlQxX1JUU19QSU4gLTEKKyMgZW5kaWYKKyNlbmRpZgorCisjZGVmaW5lIEJGSU5fVUFSVF9UWF9GSUZPX1NJWkUJMgorCisvKgorICogVGhlIHBpbiBjb25maWd1cmF0aW9uIGlzIGRpZmZlcmVudCBmcm9tIHNjaGVtYXRpYworICovCitzdHJ1Y3QgYmZpbl9zZXJpYWxfcG9ydCB7CisJc3RydWN0IHVhcnRfcG9ydCBwb3J0OworCXVuc2lnbmVkIGludCBvbGRfc3RhdHVzOworCXVuc2lnbmVkIGludCBsc3I7CisjaWZkZWYgQ09ORklHX1NFUklBTF9CRklOX0RNQQorCWludCB0eF9kb25lOworCWludCB0eF9jb3VudDsKKwlzdHJ1Y3QgY2lyY19idWYgcnhfZG1hX2J1ZjsKKwlzdHJ1Y3QgdGltZXJfbGlzdCByeF9kbWFfdGltZXI7CisJaW50IHJ4X2RtYV9ucm93czsKKwl1bnNpZ25lZCBpbnQgdHhfZG1hX2NoYW5uZWw7CisJdW5zaWduZWQgaW50IHJ4X2RtYV9jaGFubmVsOworCXN0cnVjdCB3b3JrX3N0cnVjdCB0eF9kbWFfd29ya3F1ZXVlOworI2VuZGlmCisjaWZkZWYgQ09ORklHX1NFUklBTF9CRklOX0NUU1JUUworCXN0cnVjdCB0aW1lcl9saXN0IGN0c190aW1lcjsKKwlpbnQgY3RzX3BpbjsKKwlpbnQgcnRzX3BpbjsKKyNlbmRpZgorfTsKKworLyogVGhlIGhhcmR3YXJlIGNsZWFycyB0aGUgTFNSIGJpdHMgdXBvbiByZWFkLCBzbyB3ZSBuZWVkIHRvIGNhY2hlCisgKiBzb21lIG9mIHRoZSBtb3JlIGZ1biBiaXRzIGluIHNvZnR3YXJlIHNvIHRoZXkgZG9uJ3QgZ2V0IGxvc3QKKyAqIHdoZW4gY2hlY2tpbmcgdGhlIExTUiBpbiBvdGhlciBjb2RlIHBhdGhzIChUWCkuCisgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IFVBUlRfR0VUX0xTUihzdHJ1Y3QgYmZpbl9zZXJpYWxfcG9ydCAqdWFydCkKK3sKKwl1bnNpZ25lZCBpbnQgbHNyID0gYmZpbl9yZWFkMTYodWFydC0+cG9ydC5tZW1iYXNlICsgT0ZGU0VUX0xTUik7CisJdWFydC0+bHNyIHw9IChsc3IgJiAoQkl8RkV8UEV8T0UpKTsKKwlyZXR1cm4gbHNyIHwgdWFydC0+bHNyOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgVUFSVF9DTEVBUl9MU1Ioc3RydWN0IGJmaW5fc2VyaWFsX3BvcnQgKnVhcnQpCit7CisJdWFydC0+bHNyID0gMDsKKwliZmluX3dyaXRlMTYodWFydC0+cG9ydC5tZW1iYXNlICsgT0ZGU0VUX0xTUiwgLTEpOworfQorCitzdHJ1Y3QgYmZpbl9zZXJpYWxfcmVzIHsKKwl1bnNpZ25lZCBsb25nIHVhcnRfYmFzZV9hZGRyOworCWludCB1YXJ0X2lycTsKKyNpZmRlZiBDT05GSUdfU0VSSUFMX0JGSU5fRE1BCisJdW5zaWduZWQgaW50IHVhcnRfdHhfZG1hX2NoYW5uZWw7CisJdW5zaWduZWQgaW50IHVhcnRfcnhfZG1hX2NoYW5uZWw7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfU0VSSUFMX0JGSU5fQ1RTUlRTCisJaW50IHVhcnRfY3RzX3BpbjsKKwlpbnQgdWFydF9ydHNfcGluOworI2VuZGlmCit9OworCitzdHJ1Y3QgYmZpbl9zZXJpYWxfcmVzIGJmaW5fc2VyaWFsX3Jlc291cmNlW10gPSB7CisjaWZkZWYgQ09ORklHX1NFUklBTF9CRklOX1VBUlQwCisJeworCSAweEZGQzAwNDAwLAorCSBJUlFfVUFSVDBfUlgsCisjaWZkZWYgQ09ORklHX1NFUklBTF9CRklOX0RNQQorCSBDSF9VQVJUMF9UWCwKKwkgQ0hfVUFSVDBfUlgsCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfQkZJTl9VQVJUMF9DVFNSVFMKKwkgQ09ORklHX1VBUlQwX0NUU19QSU4sCisJIENPTkZJR19VQVJUMF9SVFNfUElOLAorI2VuZGlmCisJIH0sCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfU0VSSUFMX0JGSU5fVUFSVDEKKwl7CisJIDB4RkZDMDIwMDAsCisJIElSUV9VQVJUMV9SWCwKKyNpZmRlZiBDT05GSUdfU0VSSUFMX0JGSU5fRE1BCisJIENIX1VBUlQxX1RYLAorCSBDSF9VQVJUMV9SWCwKKyNlbmRpZgorI2lmZGVmIENPTkZJR19CRklOX1VBUlQxX0NUU1JUUworCSBDT05GSUdfVUFSVDFfQ1RTX1BJTiwKKwkgQ09ORklHX1VBUlQxX1JUU19QSU4sCisjZW5kaWYKKwkgfSwKKyNlbmRpZgorfTsKKworI2RlZmluZSBEUklWRVJfTkFNRSAiYmZpbi11YXJ0IgpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2luY2x1ZGUvbWFjaC9ibGFja2Zpbi5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2luY2x1ZGUvbWFjaC9ibGFja2Zpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxYTJiOWMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvaW5jbHVkZS9tYWNoL2JsYWNrZmluLmgKQEAgLTAsMCArMSwxMDUgQEAKKy8qCisgKiBGaWxlOiAgICAgICAgIGluY2x1ZGUvYXNtLWJsYWNrZmluL21hY2gtYmY1MTgvYmxhY2tmaW4uaAorICogQmFzZWQgb246CisgKiBBdXRob3I6CisgKgorICogQ3JlYXRlZDoKKyAqIERlc2NyaXB0aW9uOgorICoKKyAqIFJldjoKKyAqCisgKiBNb2RpZmllZDoKKyAqCisgKgorICogQnVnczogICAgICAgICBFbnRlciBidWdzIGF0IGh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZy8KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4KKyAqIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKi8KKworI2lmbmRlZiBfTUFDSF9CTEFDS0ZJTl9IXworI2RlZmluZSBfTUFDSF9CTEFDS0ZJTl9IXworCisjZGVmaW5lIEJGNTE4X0ZBTUlMWQorCisjaW5jbHVkZSAiYmY1MTguaCIKKyNpbmNsdWRlICJtZW1fbWFwLmgiCisjaW5jbHVkZSAiZGVmQkY1MTIuaCIKKyNpbmNsdWRlICJhbm9tYWx5LmgiCisKKyNpZiBkZWZpbmVkKENPTkZJR19CRjUxOCkKKyNpbmNsdWRlICJkZWZCRjUxOC5oIgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19CRjUxNikKKyNpbmNsdWRlICJkZWZCRjUxNi5oIgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19CRjUxNCkKKyNpbmNsdWRlICJkZWZCRjUxNC5oIgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19CRjUxMikKKyNpbmNsdWRlICJkZWZCRjUxMi5oIgorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChfX0FTU0VNQkxZX18pCisjaW5jbHVkZSAiY2RlZkJGNTEyLmgiCisKKyNpZiBkZWZpbmVkKENPTkZJR19CRjUxOCkKKyNpbmNsdWRlICJjZGVmQkY1MTguaCIKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfQkY1MTYpCisjaW5jbHVkZSAiY2RlZkJGNTE2LmgiCisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX0JGNTE0KQorI2luY2x1ZGUgImNkZWZCRjUxNC5oIgorI2VuZGlmCisjZW5kaWYKKworLyogVUFSVF9JSVIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgU1RBVFVTKHgpCSgoeCA8PCAxKSAmIDB4MDYpCisjZGVmaW5lIFNUQVRVU19QMQkweDAyCisjZGVmaW5lIFNUQVRVU19QMAkweDAxCisKKyNkZWZpbmUgQkZJTl9VQVJUX05SX1BPUlRTCTIKKworI2RlZmluZSBPRkZTRVRfVEhSICAgICAgICAgICAgICAweDAwCS8qIFRyYW5zbWl0IEhvbGRpbmcgcmVnaXN0ZXIgICAgICAgICAgICAqLworI2RlZmluZSBPRkZTRVRfUkJSICAgICAgICAgICAgICAweDAwCS8qIFJlY2VpdmUgQnVmZmVyIHJlZ2lzdGVyICAgICAgICAgICAgICAqLworI2RlZmluZSBPRkZTRVRfRExMICAgICAgICAgICAgICAweDAwCS8qIERpdmlzb3IgTGF0Y2ggKExvdy1CeXRlKSAgICAgICAgICAgICAqLworI2RlZmluZSBPRkZTRVRfSUVSICAgICAgICAgICAgICAweDA0CS8qIEludGVycnVwdCBFbmFibGUgUmVnaXN0ZXIgICAgICAgICAgICAqLworI2RlZmluZSBPRkZTRVRfRExIICAgICAgICAgICAgICAweDA0CS8qIERpdmlzb3IgTGF0Y2ggKEhpZ2gtQnl0ZSkgICAgICAgICAgICAqLworI2RlZmluZSBPRkZTRVRfSUlSICAgICAgICAgICAgICAweDA4CS8qIEludGVycnVwdCBJZGVudGlmaWNhdGlvbiBSZWdpc3RlciAgICAqLworI2RlZmluZSBPRkZTRVRfTENSICAgICAgICAgICAgICAweDBDCS8qIExpbmUgQ29udHJvbCBSZWdpc3RlciAgICAgICAgICAgICAgICAqLworI2RlZmluZSBPRkZTRVRfTUNSICAgICAgICAgICAgICAweDEwCS8qIE1vZGVtIENvbnRyb2wgUmVnaXN0ZXIgICAgICAgICAgICAgICAqLworI2RlZmluZSBPRkZTRVRfTFNSICAgICAgICAgICAgICAweDE0CS8qIExpbmUgU3RhdHVzIFJlZ2lzdGVyICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBPRkZTRVRfTVNSICAgICAgICAgICAgICAweDE4CS8qIE1vZGVtIFN0YXR1cyBSZWdpc3RlciAgICAgICAgICAgICAgICAqLworI2RlZmluZSBPRkZTRVRfU0NSICAgICAgICAgICAgICAweDFDCS8qIFNDUiBTY3JhdGNoIFJlZ2lzdGVyICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBPRkZTRVRfR0NUTCAgICAgICAgICAgICAweDI0CS8qIEdsb2JhbCBDb250cm9sIFJlZ2lzdGVyICAgICAgICAgICAgICAqLworCisvKiBEUE1DKi8KKyNkZWZpbmUgYmZpbl9yZWFkX1NUT1BDS19PRkYoKSBiZmluX3JlYWRfU1RPUENLKCkKKyNkZWZpbmUgYmZpbl93cml0ZV9TVE9QQ0tfT0ZGKHZhbCkgYmZpbl93cml0ZV9TVE9QQ0sodmFsKQorI2RlZmluZSBTVE9QQ0tfT0ZGIFNUT1BDSworCisvKiBQTExfRElWIE1hc2tzCQkJCQkJCQkJCQkJCSovCisjZGVmaW5lIENDTEtfRElWMSBDU0VMX0RJVjEJLyogICAgICAgICAgQ0NMSyA9IFZDTyAvIDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ0NMS19ESVYyIENTRUxfRElWMgkvKiAgICAgICAgICBDQ0xLID0gVkNPIC8gMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBDQ0xLX0RJVjQgQ1NFTF9ESVY0CS8qICAgICAgICAgIENDTEsgPSBWQ08gLyA0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIENDTEtfRElWOCBDU0VMX0RJVjgJLyogICAgICAgICAgQ0NMSyA9IFZDTyAvIDggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvaW5jbHVkZS9tYWNoL2NkZWZCRjUxMi5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2luY2x1ZGUvbWFjaC9jZGVmQkY1MTIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MjBjMTNjNAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9pbmNsdWRlL21hY2gvY2RlZkJGNTEyLmgKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqIEZpbGU6ICAgICAgICAgaW5jbHVkZS9hc20tYmxhY2tmaW4vbWFjaC1iZjUxOC9jZGVmYmY1MTIuaAorICogQmFzZWQgb246CisgKiBBdXRob3I6CisgKgorICogQ3JlYXRlZDoKKyAqIERlc2NyaXB0aW9uOiAgc3lzdGVtIG1tciByZWdpc3RlciBtYXAKKyAqCisgKiBSZXY6CisgKgorICogTW9kaWZpZWQ6CisgKgorICoKKyAqIEJ1Z3M6ICAgICAgICAgRW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuCisgKiBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICovCisKKyNpZm5kZWYgX0NERUZfQkY1MTJfSAorI2RlZmluZSBfQ0RFRl9CRjUxMl9ICisKKy8qIGluY2x1ZGUgYWxsIENvcmUgcmVnaXN0ZXJzIGFuZCBiaXQgZGVmaW5pdGlvbnMgKi8KKyNpbmNsdWRlICJkZWZCRjUxMi5oIgorCisvKiBpbmNsdWRlIGNvcmUgc3BlY2lmaWMgcmVnaXN0ZXIgcG9pbnRlciBkZWZpbml0aW9ucyAqLworI2luY2x1ZGUgPGFzbS9jZGVmX0xQQmxhY2tmaW4uaD4KKworLyogU1lTVEVNICYgTU1SIEFERFJFU1MgREVGSU5JVElPTlMgRk9SIEFEU1AtQkY1MTIgKi8KKworLyogaW5jbHVkZSBjZGVmQkY1MXhfYmFzZS5oIGZvciB0aGUgc2V0IG9mICNkZWZpbmVzIHRoYXQgYXJlIGNvbW1vbiB0byBhbGwgQURTUC1CRjUxeCBwcm9jZXNzb3JzICovCisjaW5jbHVkZSAiY2RlZkJGNTF4X2Jhc2UuaCIKKworI2VuZGlmIC8qIF9DREVGX0JGNTEyX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9pbmNsdWRlL21hY2gvY2RlZkJGNTE0LmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvaW5jbHVkZS9tYWNoL2NkZWZCRjUxNC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1MjFlMTcKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvaW5jbHVkZS9tYWNoL2NkZWZCRjUxNC5oCkBAIC0wLDAgKzEsNDggQEAKKy8qCisgKiBGaWxlOiAgICAgICAgIGluY2x1ZGUvYXNtLWJsYWNrZmluL21hY2gtYmY1MTgvY2RlZmJmNTE0LmgKKyAqIEJhc2VkIG9uOgorICogQXV0aG9yOgorICoKKyAqIENyZWF0ZWQ6CisgKiBEZXNjcmlwdGlvbjogIHN5c3RlbSBtbXIgcmVnaXN0ZXIgbWFwCisgKgorICogUmV2OgorICoKKyAqIE1vZGlmaWVkOgorICoKKyAqCisgKiBCdWdzOiAgICAgICAgIEVudGVyIGJ1Z3MgYXQgaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnLworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLgorICogSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqLworCisjaWZuZGVmIF9DREVGX0JGNTE0X0gKKyNkZWZpbmUgX0NERUZfQkY1MTRfSAorCisvKiBpbmNsdWRlIGFsbCBDb3JlIHJlZ2lzdGVycyBhbmQgYml0IGRlZmluaXRpb25zICovCisjaW5jbHVkZSAiZGVmQkY1MTQuaCIKKworLyogaW5jbHVkZSBjb3JlIHNwZWNpZmljIHJlZ2lzdGVyIHBvaW50ZXIgZGVmaW5pdGlvbnMgKi8KKyNpbmNsdWRlIDxhc20vY2RlZl9MUEJsYWNrZmluLmg+CisKKy8qIFNZU1RFTSAmIE1NUiBBRERSRVNTIERFRklOSVRJT05TIEZPUiBBRFNQLUJGNTE0ICovCisKKy8qIGluY2x1ZGUgY2RlZkJGNTF4X2Jhc2UuaCBmb3IgdGhlIHNldCBvZiAjZGVmaW5lcyB0aGF0IGFyZSBjb21tb24gdG8gYWxsIEFEU1AtQkY1MXggcHJvY2Vzc29ycyAqLworI2luY2x1ZGUgImNkZWZCRjUxeF9iYXNlLmgiCisKKy8qIFRoZSBmb2xsb3dpbmcgYXJlIHRoZSAjZGVmaW5lcyBuZWVkZWQgYnkgQURTUC1CRjUxNCB0aGF0IGFyZSBub3QgaW4gdGhlIGNvbW1vbiBoZWFkZXIgKi8KKworI2VuZGlmIC8qIF9DREVGX0JGNTE0X0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9pbmNsdWRlL21hY2gvY2RlZkJGNTE2LmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvaW5jbHVkZS9tYWNoL2NkZWZCRjUxNi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlMjZjY2YKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvaW5jbHVkZS9tYWNoL2NkZWZCRjUxNi5oCkBAIC0wLDAgKzEsMjEzIEBACisvKgorICogRmlsZTogICAgICAgICBpbmNsdWRlL2FzbS1ibGFja2Zpbi9tYWNoLWJmNTE4L2NkZWZiZjUxNi5oCisgKiBCYXNlZCBvbjoKKyAqIEF1dGhvcjoKKyAqCisgKiBDcmVhdGVkOgorICogRGVzY3JpcHRpb246ICBzeXN0ZW0gbW1yIHJlZ2lzdGVyIG1hcAorICoKKyAqIFJldjoKKyAqCisgKiBNb2RpZmllZDoKKyAqCisgKgorICogQnVnczogICAgICAgICBFbnRlciBidWdzIGF0IGh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZy8KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4KKyAqIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKi8KKworI2lmbmRlZiBfQ0RFRl9CRjUxNl9ICisjZGVmaW5lIF9DREVGX0JGNTE2X0gKKworLyogaW5jbHVkZSBhbGwgQ29yZSByZWdpc3RlcnMgYW5kIGJpdCBkZWZpbml0aW9ucyAqLworI2luY2x1ZGUgImRlZkJGNTE2LmgiCisKKy8qIGluY2x1ZGUgY29yZSBzcGVjaWZpYyByZWdpc3RlciBwb2ludGVyIGRlZmluaXRpb25zICovCisjaW5jbHVkZSA8YXNtL2NkZWZfTFBCbGFja2Zpbi5oPgorCisvKiBTWVNURU0gJiBNTVIgQUREUkVTUyBERUZJTklUSU9OUyBGT1IgQURTUC1CRjUxNiAqLworCisvKiBpbmNsdWRlIGNkZWZCRjUxeF9iYXNlLmggZm9yIHRoZSBzZXQgb2YgI2RlZmluZXMgdGhhdCBhcmUgY29tbW9uIHRvIGFsbCBBRFNQLUJGNTF4IHByb2Nlc3NvcnMgKi8KKyNpbmNsdWRlICJjZGVmQkY1MXhfYmFzZS5oIgorCisvKiBUaGUgZm9sbG93aW5nIGFyZSB0aGUgI2RlZmluZXMgbmVlZGVkIGJ5IEFEU1AtQkY1MTYgdGhhdCBhcmUgbm90IGluIHRoZSBjb21tb24gaGVhZGVyICovCisKKy8qIDEwLzEwMCBFdGhlcm5ldCBDb250cm9sbGVyCSgweEZGQzAzMDAwIC0gMHhGRkMwMzFGRikgKi8KKworI2RlZmluZSBiZmluX3JlYWRfRU1BQ19PUE1PREUoKQkJCWJmaW5fcmVhZDMyKEVNQUNfT1BNT0RFKQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfT1BNT0RFKHZhbCkJCWJmaW5fd3JpdGUzMihFTUFDX09QTU9ERSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRU1BQ19BRERSTE8oKQkJCWJmaW5fcmVhZDMyKEVNQUNfQUREUkxPKQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfQUREUkxPKHZhbCkJCWJmaW5fd3JpdGUzMihFTUFDX0FERFJMTywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRU1BQ19BRERSSEkoKQkJCWJmaW5fcmVhZDMyKEVNQUNfQUREUkhJKQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfQUREUkhJKHZhbCkJCWJmaW5fd3JpdGUzMihFTUFDX0FERFJISSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRU1BQ19IQVNITE8oKQkJCWJmaW5fcmVhZDMyKEVNQUNfSEFTSExPKQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfSEFTSExPKHZhbCkJCWJmaW5fd3JpdGUzMihFTUFDX0hBU0hMTywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRU1BQ19IQVNISEkoKQkJCWJmaW5fcmVhZDMyKEVNQUNfSEFTSEhJKQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfSEFTSEhJKHZhbCkJCWJmaW5fd3JpdGUzMihFTUFDX0hBU0hISSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRU1BQ19TVEFBREQoKQkJCWJmaW5fcmVhZDMyKEVNQUNfU1RBQUREKQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfU1RBQUREKHZhbCkJCWJmaW5fd3JpdGUzMihFTUFDX1NUQUFERCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRU1BQ19TVEFEQVQoKQkJCWJmaW5fcmVhZDMyKEVNQUNfU1RBREFUKQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfU1RBREFUKHZhbCkJCWJmaW5fd3JpdGUzMihFTUFDX1NUQURBVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRU1BQ19GTEMoKQkJCWJmaW5fcmVhZDMyKEVNQUNfRkxDKQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfRkxDKHZhbCkJCWJmaW5fd3JpdGUzMihFTUFDX0ZMQywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRU1BQ19WTEFOMSgpCQkJYmZpbl9yZWFkMzIoRU1BQ19WTEFOMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX1ZMQU4xKHZhbCkJCWJmaW5fd3JpdGUzMihFTUFDX1ZMQU4xLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX1ZMQU4yKCkJCQliZmluX3JlYWQzMihFTUFDX1ZMQU4yKQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfVkxBTjIodmFsKQkJYmZpbl93cml0ZTMyKEVNQUNfVkxBTjIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfV0tVUF9DVEwoKQkJYmZpbl9yZWFkMzIoRU1BQ19XS1VQX0NUTCkKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX1dLVVBfQ1RMKHZhbCkJCWJmaW5fd3JpdGUzMihFTUFDX1dLVVBfQ1RMLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX1dLVVBfRkZNU0swKCkJCWJmaW5fcmVhZDMyKEVNQUNfV0tVUF9GRk1TSzApCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19XS1VQX0ZGTVNLMCh2YWwpCWJmaW5fd3JpdGUzMihFTUFDX1dLVVBfRkZNU0swLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX1dLVVBfRkZNU0sxKCkJCWJmaW5fcmVhZDMyKEVNQUNfV0tVUF9GRk1TSzEpCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19XS1VQX0ZGTVNLMSh2YWwpCWJmaW5fd3JpdGUzMihFTUFDX1dLVVBfRkZNU0sxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX1dLVVBfRkZNU0syKCkJCWJmaW5fcmVhZDMyKEVNQUNfV0tVUF9GRk1TSzIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19XS1VQX0ZGTVNLMih2YWwpCWJmaW5fd3JpdGUzMihFTUFDX1dLVVBfRkZNU0syLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX1dLVVBfRkZNU0szKCkJCWJmaW5fcmVhZDMyKEVNQUNfV0tVUF9GRk1TSzMpCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19XS1VQX0ZGTVNLMyh2YWwpCWJmaW5fd3JpdGUzMihFTUFDX1dLVVBfRkZNU0szLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX1dLVVBfRkZDTUQoKQkJYmZpbl9yZWFkMzIoRU1BQ19XS1VQX0ZGQ01EKQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfV0tVUF9GRkNNRCh2YWwpCQliZmluX3dyaXRlMzIoRU1BQ19XS1VQX0ZGQ01ELCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX1dLVVBfRkZPRkYoKQkJYmZpbl9yZWFkMzIoRU1BQ19XS1VQX0ZGT0ZGKQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfV0tVUF9GRk9GRih2YWwpCQliZmluX3dyaXRlMzIoRU1BQ19XS1VQX0ZGT0ZGLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX1dLVVBfRkZDUkMwKCkJCWJmaW5fcmVhZDMyKEVNQUNfV0tVUF9GRkNSQzApCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19XS1VQX0ZGQ1JDMCh2YWwpCWJmaW5fd3JpdGUzMihFTUFDX1dLVVBfRkZDUkMwLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX1dLVVBfRkZDUkMxKCkJCWJmaW5fcmVhZDMyKEVNQUNfV0tVUF9GRkNSQzEpCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19XS1VQX0ZGQ1JDMSh2YWwpCWJmaW5fd3JpdGUzMihFTUFDX1dLVVBfRkZDUkMxLCB2YWwpCisKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfU1lTQ1RMKCkJCQliZmluX3JlYWQzMihFTUFDX1NZU0NUTCkKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX1NZU0NUTCh2YWwpCQliZmluX3dyaXRlMzIoRU1BQ19TWVNDVEwsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfU1lTVEFUKCkJCQliZmluX3JlYWQzMihFTUFDX1NZU1RBVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX1NZU1RBVCh2YWwpCQliZmluX3dyaXRlMzIoRU1BQ19TWVNUQVQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfUlhfU1RBVCgpCQliZmluX3JlYWQzMihFTUFDX1JYX1NUQVQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19SWF9TVEFUKHZhbCkJCWJmaW5fd3JpdGUzMihFTUFDX1JYX1NUQVQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfUlhfU1RLWSgpCQliZmluX3JlYWQzMihFTUFDX1JYX1NUS1kpCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19SWF9TVEtZKHZhbCkJCWJmaW5fd3JpdGUzMihFTUFDX1JYX1NUS1ksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfUlhfSVJRRSgpCQliZmluX3JlYWQzMihFTUFDX1JYX0lSUUUpCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19SWF9JUlFFKHZhbCkJCWJmaW5fd3JpdGUzMihFTUFDX1JYX0lSUUUsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfVFhfU1RBVCgpCQliZmluX3JlYWQzMihFTUFDX1RYX1NUQVQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19UWF9TVEFUKHZhbCkJCWJmaW5fd3JpdGUzMihFTUFDX1RYX1NUQVQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfVFhfU1RLWSgpCQliZmluX3JlYWQzMihFTUFDX1RYX1NUS1kpCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19UWF9TVEtZKHZhbCkJCWJmaW5fd3JpdGUzMihFTUFDX1RYX1NUS1ksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfVFhfSVJRRSgpCQliZmluX3JlYWQzMihFTUFDX1RYX0lSUUUpCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19UWF9JUlFFKHZhbCkJCWJmaW5fd3JpdGUzMihFTUFDX1RYX0lSUUUsIHZhbCkKKworI2RlZmluZSBiZmluX3JlYWRfRU1BQ19NTUNfQ1RMKCkJCWJmaW5fcmVhZDMyKEVNQUNfTU1DX0NUTCkKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX01NQ19DVEwodmFsKQkJYmZpbl93cml0ZTMyKEVNQUNfTU1DX0NUTCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRU1BQ19NTUNfUklSUVMoKQkJYmZpbl9yZWFkMzIoRU1BQ19NTUNfUklSUVMpCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19NTUNfUklSUVModmFsKQkJYmZpbl93cml0ZTMyKEVNQUNfTU1DX1JJUlFTLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX01NQ19SSVJRRSgpCQliZmluX3JlYWQzMihFTUFDX01NQ19SSVJRRSkKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX01NQ19SSVJRRSh2YWwpCQliZmluX3dyaXRlMzIoRU1BQ19NTUNfUklSUUUsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfTU1DX1RJUlFTKCkJCWJmaW5fcmVhZDMyKEVNQUNfTU1DX1RJUlFTKQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfTU1DX1RJUlFTKHZhbCkJCWJmaW5fd3JpdGUzMihFTUFDX01NQ19USVJRUywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRU1BQ19NTUNfVElSUUUoKQkJYmZpbl9yZWFkMzIoRU1BQ19NTUNfVElSUUUpCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19NTUNfVElSUUUodmFsKQkJYmZpbl93cml0ZTMyKEVNQUNfTU1DX1RJUlFFLCB2YWwpCisKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfUlhDX09LKCkJCQliZmluX3JlYWQzMihFTUFDX1JYQ19PSykKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX1JYQ19PSyh2YWwpCQliZmluX3dyaXRlMzIoRU1BQ19SWENfT0ssIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfUlhDX0ZDUygpCQliZmluX3JlYWQzMihFTUFDX1JYQ19GQ1MpCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19SWENfRkNTKHZhbCkJCWJmaW5fd3JpdGUzMihFTUFDX1JYQ19GQ1MsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfUlhDX0FMSUdOKCkJCWJmaW5fcmVhZDMyKEVNQUNfUlhDX0FMSUdOKQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfUlhDX0FMSUdOKHZhbCkJCWJmaW5fd3JpdGUzMihFTUFDX1JYQ19BTElHTiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRU1BQ19SWENfT0NURVQoKQkJYmZpbl9yZWFkMzIoRU1BQ19SWENfT0NURVQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19SWENfT0NURVQodmFsKQkJYmZpbl93cml0ZTMyKEVNQUNfUlhDX09DVEVULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX1JYQ19ETUFPVkYoKQkJYmZpbl9yZWFkMzIoRU1BQ19SWENfRE1BT1ZGKQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfUlhDX0RNQU9WRih2YWwpCQliZmluX3dyaXRlMzIoRU1BQ19SWENfRE1BT1ZGLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX1JYQ19VTklDU1QoKQkJYmZpbl9yZWFkMzIoRU1BQ19SWENfVU5JQ1NUKQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfUlhDX1VOSUNTVCh2YWwpCQliZmluX3dyaXRlMzIoRU1BQ19SWENfVU5JQ1NULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX1JYQ19NVUxUSSgpCQliZmluX3JlYWQzMihFTUFDX1JYQ19NVUxUSSkKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX1JYQ19NVUxUSSh2YWwpCQliZmluX3dyaXRlMzIoRU1BQ19SWENfTVVMVEksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfUlhDX0JST0FEKCkJCWJmaW5fcmVhZDMyKEVNQUNfUlhDX0JST0FEKQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfUlhDX0JST0FEKHZhbCkJCWJmaW5fd3JpdGUzMihFTUFDX1JYQ19CUk9BRCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRU1BQ19SWENfTE5FUlJJKCkJCWJmaW5fcmVhZDMyKEVNQUNfUlhDX0xORVJSSSkKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX1JYQ19MTkVSUkkodmFsKQkJYmZpbl93cml0ZTMyKEVNQUNfUlhDX0xORVJSSSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRU1BQ19SWENfTE5FUlJPKCkJCWJmaW5fcmVhZDMyKEVNQUNfUlhDX0xORVJSTykKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX1JYQ19MTkVSUk8odmFsKQkJYmZpbl93cml0ZTMyKEVNQUNfUlhDX0xORVJSTywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRU1BQ19SWENfTE9ORygpCQliZmluX3JlYWQzMihFTUFDX1JYQ19MT05HKQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfUlhDX0xPTkcodmFsKQkJYmZpbl93cml0ZTMyKEVNQUNfUlhDX0xPTkcsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfUlhDX01BQ0NUTCgpCQliZmluX3JlYWQzMihFTUFDX1JYQ19NQUNDVEwpCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19SWENfTUFDQ1RMKHZhbCkJCWJmaW5fd3JpdGUzMihFTUFDX1JYQ19NQUNDVEwsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfUlhDX09QQ09ERSgpCQliZmluX3JlYWQzMihFTUFDX1JYQ19PUENPREUpCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19SWENfT1BDT0RFKHZhbCkJCWJmaW5fd3JpdGUzMihFTUFDX1JYQ19PUENPREUsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfUlhDX1BBVVNFKCkJCWJmaW5fcmVhZDMyKEVNQUNfUlhDX1BBVVNFKQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfUlhDX1BBVVNFKHZhbCkJCWJmaW5fd3JpdGUzMihFTUFDX1JYQ19QQVVTRSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRU1BQ19SWENfQUxMRlJNKCkJCWJmaW5fcmVhZDMyKEVNQUNfUlhDX0FMTEZSTSkKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX1JYQ19BTExGUk0odmFsKQkJYmZpbl93cml0ZTMyKEVNQUNfUlhDX0FMTEZSTSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRU1BQ19SWENfQUxMT0NUKCkJCWJmaW5fcmVhZDMyKEVNQUNfUlhDX0FMTE9DVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX1JYQ19BTExPQ1QodmFsKQkJYmZpbl93cml0ZTMyKEVNQUNfUlhDX0FMTE9DVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRU1BQ19SWENfVFlQRUQoKQkJYmZpbl9yZWFkMzIoRU1BQ19SWENfVFlQRUQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19SWENfVFlQRUQodmFsKQkJYmZpbl93cml0ZTMyKEVNQUNfUlhDX1RZUEVELCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX1JYQ19TSE9SVCgpCQliZmluX3JlYWQzMihFTUFDX1JYQ19TSE9SVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX1JYQ19TSE9SVCh2YWwpCQliZmluX3dyaXRlMzIoRU1BQ19SWENfU0hPUlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfUlhDX0VRNjQoKQkJYmZpbl9yZWFkMzIoRU1BQ19SWENfRVE2NCkKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX1JYQ19FUTY0KHZhbCkJCWJmaW5fd3JpdGUzMihFTUFDX1JYQ19FUTY0LCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX1JYQ19MVDEyOCgpCQliZmluX3JlYWQzMihFTUFDX1JYQ19MVDEyOCkKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX1JYQ19MVDEyOCh2YWwpCQliZmluX3dyaXRlMzIoRU1BQ19SWENfTFQxMjgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfUlhDX0xUMjU2KCkJCWJmaW5fcmVhZDMyKEVNQUNfUlhDX0xUMjU2KQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfUlhDX0xUMjU2KHZhbCkJCWJmaW5fd3JpdGUzMihFTUFDX1JYQ19MVDI1NiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRU1BQ19SWENfTFQ1MTIoKQkJYmZpbl9yZWFkMzIoRU1BQ19SWENfTFQ1MTIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19SWENfTFQ1MTIodmFsKQkJYmZpbl93cml0ZTMyKEVNQUNfUlhDX0xUNTEyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX1JYQ19MVDEwMjQoKQkJYmZpbl9yZWFkMzIoRU1BQ19SWENfTFQxMDI0KQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfUlhDX0xUMTAyNCh2YWwpCQliZmluX3dyaXRlMzIoRU1BQ19SWENfTFQxMDI0LCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX1JYQ19HRTEwMjQoKQkJYmZpbl9yZWFkMzIoRU1BQ19SWENfR0UxMDI0KQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfUlhDX0dFMTAyNCh2YWwpCQliZmluX3dyaXRlMzIoRU1BQ19SWENfR0UxMDI0LCB2YWwpCisKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfVFhDX09LKCkJCQliZmluX3JlYWQzMihFTUFDX1RYQ19PSykKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX1RYQ19PSyh2YWwpCQliZmluX3dyaXRlMzIoRU1BQ19UWENfT0ssIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfVFhDXzFDT0woKQkJYmZpbl9yZWFkMzIoRU1BQ19UWENfMUNPTCkKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX1RYQ18xQ09MKHZhbCkJCWJmaW5fd3JpdGUzMihFTUFDX1RYQ18xQ09MLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX1RYQ19HVDFDT0woKQkJYmZpbl9yZWFkMzIoRU1BQ19UWENfR1QxQ09MKQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfVFhDX0dUMUNPTCh2YWwpCQliZmluX3dyaXRlMzIoRU1BQ19UWENfR1QxQ09MLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX1RYQ19PQ1RFVCgpCQliZmluX3JlYWQzMihFTUFDX1RYQ19PQ1RFVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX1RYQ19PQ1RFVCh2YWwpCQliZmluX3dyaXRlMzIoRU1BQ19UWENfT0NURVQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfVFhDX0RFRkVSKCkJCWJmaW5fcmVhZDMyKEVNQUNfVFhDX0RFRkVSKQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfVFhDX0RFRkVSKHZhbCkJCWJmaW5fd3JpdGUzMihFTUFDX1RYQ19ERUZFUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRU1BQ19UWENfTEFURUNMKCkJCWJmaW5fcmVhZDMyKEVNQUNfVFhDX0xBVEVDTCkKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX1RYQ19MQVRFQ0wodmFsKQkJYmZpbl93cml0ZTMyKEVNQUNfVFhDX0xBVEVDTCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRU1BQ19UWENfWFNfQ09MKCkJCWJmaW5fcmVhZDMyKEVNQUNfVFhDX1hTX0NPTCkKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX1RYQ19YU19DT0wodmFsKQkJYmZpbl93cml0ZTMyKEVNQUNfVFhDX1hTX0NPTCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRU1BQ19UWENfRE1BVU5EKCkJCWJmaW5fcmVhZDMyKEVNQUNfVFhDX0RNQVVORCkKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX1RYQ19ETUFVTkQodmFsKQkJYmZpbl93cml0ZTMyKEVNQUNfVFhDX0RNQVVORCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRU1BQ19UWENfQ1JTRVJSKCkJCWJmaW5fcmVhZDMyKEVNQUNfVFhDX0NSU0VSUikKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX1RYQ19DUlNFUlIodmFsKQkJYmZpbl93cml0ZTMyKEVNQUNfVFhDX0NSU0VSUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRU1BQ19UWENfVU5JQ1NUKCkJCWJmaW5fcmVhZDMyKEVNQUNfVFhDX1VOSUNTVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX1RYQ19VTklDU1QodmFsKQkJYmZpbl93cml0ZTMyKEVNQUNfVFhDX1VOSUNTVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRU1BQ19UWENfTVVMVEkoKQkJYmZpbl9yZWFkMzIoRU1BQ19UWENfTVVMVEkpCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19UWENfTVVMVEkodmFsKQkJYmZpbl93cml0ZTMyKEVNQUNfVFhDX01VTFRJLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX1RYQ19CUk9BRCgpCQliZmluX3JlYWQzMihFTUFDX1RYQ19CUk9BRCkKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX1RYQ19CUk9BRCh2YWwpCQliZmluX3dyaXRlMzIoRU1BQ19UWENfQlJPQUQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfVFhDX1hTX0RGUigpCQliZmluX3JlYWQzMihFTUFDX1RYQ19YU19ERlIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19UWENfWFNfREZSKHZhbCkJCWJmaW5fd3JpdGUzMihFTUFDX1RYQ19YU19ERlIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfVFhDX01BQ0NUTCgpCQliZmluX3JlYWQzMihFTUFDX1RYQ19NQUNDVEwpCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19UWENfTUFDQ1RMKHZhbCkJCWJmaW5fd3JpdGUzMihFTUFDX1RYQ19NQUNDVEwsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfVFhDX0FMTEZSTSgpCQliZmluX3JlYWQzMihFTUFDX1RYQ19BTExGUk0pCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19UWENfQUxMRlJNKHZhbCkJCWJmaW5fd3JpdGUzMihFTUFDX1RYQ19BTExGUk0sIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfVFhDX0FMTE9DVCgpCQliZmluX3JlYWQzMihFTUFDX1RYQ19BTExPQ1QpCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19UWENfQUxMT0NUKHZhbCkJCWJmaW5fd3JpdGUzMihFTUFDX1RYQ19BTExPQ1QsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfVFhDX0VRNjQoKQkJYmZpbl9yZWFkMzIoRU1BQ19UWENfRVE2NCkKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX1RYQ19FUTY0KHZhbCkJCWJmaW5fd3JpdGUzMihFTUFDX1RYQ19FUTY0LCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX1RYQ19MVDEyOCgpCQliZmluX3JlYWQzMihFTUFDX1RYQ19MVDEyOCkKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX1RYQ19MVDEyOCh2YWwpCQliZmluX3dyaXRlMzIoRU1BQ19UWENfTFQxMjgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfVFhDX0xUMjU2KCkJCWJmaW5fcmVhZDMyKEVNQUNfVFhDX0xUMjU2KQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfVFhDX0xUMjU2KHZhbCkJCWJmaW5fd3JpdGUzMihFTUFDX1RYQ19MVDI1NiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRU1BQ19UWENfTFQ1MTIoKQkJYmZpbl9yZWFkMzIoRU1BQ19UWENfTFQ1MTIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19UWENfTFQ1MTIodmFsKQkJYmZpbl93cml0ZTMyKEVNQUNfVFhDX0xUNTEyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX1RYQ19MVDEwMjQoKQkJYmZpbl9yZWFkMzIoRU1BQ19UWENfTFQxMDI0KQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfVFhDX0xUMTAyNCh2YWwpCQliZmluX3dyaXRlMzIoRU1BQ19UWENfTFQxMDI0LCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX1RYQ19HRTEwMjQoKQkJYmZpbl9yZWFkMzIoRU1BQ19UWENfR0UxMDI0KQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfVFhDX0dFMTAyNCh2YWwpCQliZmluX3dyaXRlMzIoRU1BQ19UWENfR0UxMDI0LCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX1RYQ19BQk9SVCgpCQliZmluX3JlYWQzMihFTUFDX1RYQ19BQk9SVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX1RYQ19BQk9SVCh2YWwpCQliZmluX3dyaXRlMzIoRU1BQ19UWENfQUJPUlQsIHZhbCkKKworI2VuZGlmIC8qIF9DREVGX0JGNTE2X0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9pbmNsdWRlL21hY2gvY2RlZkJGNTE4LmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvaW5jbHVkZS9tYWNoL2NkZWZCRjUxOC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhZmIzNzAKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvaW5jbHVkZS9tYWNoL2NkZWZCRjUxOC5oCkBAIC0wLDAgKzEsMjgyIEBACisvKgorICogRmlsZTogICAgICAgICBpbmNsdWRlL2FzbS1ibGFja2Zpbi9tYWNoLWJmNTE4L2NkZWZiZjUxOC5oCisgKiBCYXNlZCBvbjoKKyAqIEF1dGhvcjoKKyAqCisgKiBDcmVhdGVkOgorICogRGVzY3JpcHRpb246ICBzeXN0ZW0gbW1yIHJlZ2lzdGVyIG1hcAorICoKKyAqIFJldjoKKyAqCisgKiBNb2RpZmllZDoKKyAqCisgKgorICogQnVnczogICAgICAgICBFbnRlciBidWdzIGF0IGh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZy8KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4KKyAqIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKi8KKworI2lmbmRlZiBfQ0RFRl9CRjUxOF9ICisjZGVmaW5lIF9DREVGX0JGNTE4X0gKKworLyogaW5jbHVkZSBhbGwgQ29yZSByZWdpc3RlcnMgYW5kIGJpdCBkZWZpbml0aW9ucyAqLworI2luY2x1ZGUgImRlZkJGNTE4LmgiCisKKy8qIGluY2x1ZGUgY29yZSBzcGVjaWZpYyByZWdpc3RlciBwb2ludGVyIGRlZmluaXRpb25zICovCisjaW5jbHVkZSA8YXNtL2NkZWZfTFBCbGFja2Zpbi5oPgorCisvKiBTWVNURU0gJiBNTVIgQUREUkVTUyBERUZJTklUSU9OUyBGT1IgQURTUC1CRjUxOCAqLworCisvKiBpbmNsdWRlIGNkZWZCRjUxeF9iYXNlLmggZm9yIHRoZSBzZXQgb2YgI2RlZmluZXMgdGhhdCBhcmUgY29tbW9uIHRvIGFsbCBBRFNQLUJGNTF4IHByb2Nlc3NvcnMgKi8KKyNpbmNsdWRlICJjZGVmQkY1MXhfYmFzZS5oIgorCisvKiBUaGUgZm9sbG93aW5nIGFyZSB0aGUgI2RlZmluZXMgbmVlZGVkIGJ5IEFEU1AtQkY1MTggdGhhdCBhcmUgbm90IGluIHRoZSBjb21tb24gaGVhZGVyICovCisKKworLyogMTAvMTAwIEV0aGVybmV0IENvbnRyb2xsZXIJKDB4RkZDMDMwMDAgLSAweEZGQzAzMUZGKSAqLworCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX09QTU9ERSgpCQkJYmZpbl9yZWFkMzIoRU1BQ19PUE1PREUpCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19PUE1PREUodmFsKQkJYmZpbl93cml0ZTMyKEVNQUNfT1BNT0RFLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX0FERFJMTygpCQkJYmZpbl9yZWFkMzIoRU1BQ19BRERSTE8pCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19BRERSTE8odmFsKQkJYmZpbl93cml0ZTMyKEVNQUNfQUREUkxPLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX0FERFJISSgpCQkJYmZpbl9yZWFkMzIoRU1BQ19BRERSSEkpCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19BRERSSEkodmFsKQkJYmZpbl93cml0ZTMyKEVNQUNfQUREUkhJLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX0hBU0hMTygpCQkJYmZpbl9yZWFkMzIoRU1BQ19IQVNITE8pCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19IQVNITE8odmFsKQkJYmZpbl93cml0ZTMyKEVNQUNfSEFTSExPLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX0hBU0hISSgpCQkJYmZpbl9yZWFkMzIoRU1BQ19IQVNISEkpCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19IQVNISEkodmFsKQkJYmZpbl93cml0ZTMyKEVNQUNfSEFTSEhJLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX1NUQUFERCgpCQkJYmZpbl9yZWFkMzIoRU1BQ19TVEFBREQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19TVEFBREQodmFsKQkJYmZpbl93cml0ZTMyKEVNQUNfU1RBQURELCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX1NUQURBVCgpCQkJYmZpbl9yZWFkMzIoRU1BQ19TVEFEQVQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19TVEFEQVQodmFsKQkJYmZpbl93cml0ZTMyKEVNQUNfU1RBREFULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX0ZMQygpCQkJYmZpbl9yZWFkMzIoRU1BQ19GTEMpCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19GTEModmFsKQkJYmZpbl93cml0ZTMyKEVNQUNfRkxDLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX1ZMQU4xKCkJCQliZmluX3JlYWQzMihFTUFDX1ZMQU4xKQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfVkxBTjEodmFsKQkJYmZpbl93cml0ZTMyKEVNQUNfVkxBTjEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfVkxBTjIoKQkJCWJmaW5fcmVhZDMyKEVNQUNfVkxBTjIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19WTEFOMih2YWwpCQliZmluX3dyaXRlMzIoRU1BQ19WTEFOMiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRU1BQ19XS1VQX0NUTCgpCQliZmluX3JlYWQzMihFTUFDX1dLVVBfQ1RMKQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfV0tVUF9DVEwodmFsKQkJYmZpbl93cml0ZTMyKEVNQUNfV0tVUF9DVEwsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfV0tVUF9GRk1TSzAoKQkJYmZpbl9yZWFkMzIoRU1BQ19XS1VQX0ZGTVNLMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX1dLVVBfRkZNU0swKHZhbCkJYmZpbl93cml0ZTMyKEVNQUNfV0tVUF9GRk1TSzAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfV0tVUF9GRk1TSzEoKQkJYmZpbl9yZWFkMzIoRU1BQ19XS1VQX0ZGTVNLMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX1dLVVBfRkZNU0sxKHZhbCkJYmZpbl93cml0ZTMyKEVNQUNfV0tVUF9GRk1TSzEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfV0tVUF9GRk1TSzIoKQkJYmZpbl9yZWFkMzIoRU1BQ19XS1VQX0ZGTVNLMikKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX1dLVVBfRkZNU0syKHZhbCkJYmZpbl93cml0ZTMyKEVNQUNfV0tVUF9GRk1TSzIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfV0tVUF9GRk1TSzMoKQkJYmZpbl9yZWFkMzIoRU1BQ19XS1VQX0ZGTVNLMykKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX1dLVVBfRkZNU0szKHZhbCkJYmZpbl93cml0ZTMyKEVNQUNfV0tVUF9GRk1TSzMsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfV0tVUF9GRkNNRCgpCQliZmluX3JlYWQzMihFTUFDX1dLVVBfRkZDTUQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19XS1VQX0ZGQ01EKHZhbCkJCWJmaW5fd3JpdGUzMihFTUFDX1dLVVBfRkZDTUQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfV0tVUF9GRk9GRigpCQliZmluX3JlYWQzMihFTUFDX1dLVVBfRkZPRkYpCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19XS1VQX0ZGT0ZGKHZhbCkJCWJmaW5fd3JpdGUzMihFTUFDX1dLVVBfRkZPRkYsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfV0tVUF9GRkNSQzAoKQkJYmZpbl9yZWFkMzIoRU1BQ19XS1VQX0ZGQ1JDMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX1dLVVBfRkZDUkMwKHZhbCkJYmZpbl93cml0ZTMyKEVNQUNfV0tVUF9GRkNSQzAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfV0tVUF9GRkNSQzEoKQkJYmZpbl9yZWFkMzIoRU1BQ19XS1VQX0ZGQ1JDMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX1dLVVBfRkZDUkMxKHZhbCkJYmZpbl93cml0ZTMyKEVNQUNfV0tVUF9GRkNSQzEsIHZhbCkKKworI2RlZmluZSBiZmluX3JlYWRfRU1BQ19TWVNDVEwoKQkJCWJmaW5fcmVhZDMyKEVNQUNfU1lTQ1RMKQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfU1lTQ1RMKHZhbCkJCWJmaW5fd3JpdGUzMihFTUFDX1NZU0NUTCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRU1BQ19TWVNUQVQoKQkJCWJmaW5fcmVhZDMyKEVNQUNfU1lTVEFUKQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfU1lTVEFUKHZhbCkJCWJmaW5fd3JpdGUzMihFTUFDX1NZU1RBVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRU1BQ19SWF9TVEFUKCkJCWJmaW5fcmVhZDMyKEVNQUNfUlhfU1RBVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX1JYX1NUQVQodmFsKQkJYmZpbl93cml0ZTMyKEVNQUNfUlhfU1RBVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRU1BQ19SWF9TVEtZKCkJCWJmaW5fcmVhZDMyKEVNQUNfUlhfU1RLWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX1JYX1NUS1kodmFsKQkJYmZpbl93cml0ZTMyKEVNQUNfUlhfU1RLWSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRU1BQ19SWF9JUlFFKCkJCWJmaW5fcmVhZDMyKEVNQUNfUlhfSVJRRSkKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX1JYX0lSUUUodmFsKQkJYmZpbl93cml0ZTMyKEVNQUNfUlhfSVJRRSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRU1BQ19UWF9TVEFUKCkJCWJmaW5fcmVhZDMyKEVNQUNfVFhfU1RBVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX1RYX1NUQVQodmFsKQkJYmZpbl93cml0ZTMyKEVNQUNfVFhfU1RBVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRU1BQ19UWF9TVEtZKCkJCWJmaW5fcmVhZDMyKEVNQUNfVFhfU1RLWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX1RYX1NUS1kodmFsKQkJYmZpbl93cml0ZTMyKEVNQUNfVFhfU1RLWSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRU1BQ19UWF9JUlFFKCkJCWJmaW5fcmVhZDMyKEVNQUNfVFhfSVJRRSkKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX1RYX0lSUUUodmFsKQkJYmZpbl93cml0ZTMyKEVNQUNfVFhfSVJRRSwgdmFsKQorCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX01NQ19DVEwoKQkJYmZpbl9yZWFkMzIoRU1BQ19NTUNfQ1RMKQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfTU1DX0NUTCh2YWwpCQliZmluX3dyaXRlMzIoRU1BQ19NTUNfQ1RMLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX01NQ19SSVJRUygpCQliZmluX3JlYWQzMihFTUFDX01NQ19SSVJRUykKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX01NQ19SSVJRUyh2YWwpCQliZmluX3dyaXRlMzIoRU1BQ19NTUNfUklSUVMsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfTU1DX1JJUlFFKCkJCWJmaW5fcmVhZDMyKEVNQUNfTU1DX1JJUlFFKQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfTU1DX1JJUlFFKHZhbCkJCWJmaW5fd3JpdGUzMihFTUFDX01NQ19SSVJRRSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRU1BQ19NTUNfVElSUVMoKQkJYmZpbl9yZWFkMzIoRU1BQ19NTUNfVElSUVMpCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19NTUNfVElSUVModmFsKQkJYmZpbl93cml0ZTMyKEVNQUNfTU1DX1RJUlFTLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX01NQ19USVJRRSgpCQliZmluX3JlYWQzMihFTUFDX01NQ19USVJRRSkKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX01NQ19USVJRRSh2YWwpCQliZmluX3dyaXRlMzIoRU1BQ19NTUNfVElSUUUsIHZhbCkKKworI2RlZmluZSBiZmluX3JlYWRfRU1BQ19SWENfT0soKQkJCWJmaW5fcmVhZDMyKEVNQUNfUlhDX09LKQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfUlhDX09LKHZhbCkJCWJmaW5fd3JpdGUzMihFTUFDX1JYQ19PSywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRU1BQ19SWENfRkNTKCkJCWJmaW5fcmVhZDMyKEVNQUNfUlhDX0ZDUykKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX1JYQ19GQ1ModmFsKQkJYmZpbl93cml0ZTMyKEVNQUNfUlhDX0ZDUywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRU1BQ19SWENfQUxJR04oKQkJYmZpbl9yZWFkMzIoRU1BQ19SWENfQUxJR04pCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19SWENfQUxJR04odmFsKQkJYmZpbl93cml0ZTMyKEVNQUNfUlhDX0FMSUdOLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX1JYQ19PQ1RFVCgpCQliZmluX3JlYWQzMihFTUFDX1JYQ19PQ1RFVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX1JYQ19PQ1RFVCh2YWwpCQliZmluX3dyaXRlMzIoRU1BQ19SWENfT0NURVQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfUlhDX0RNQU9WRigpCQliZmluX3JlYWQzMihFTUFDX1JYQ19ETUFPVkYpCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19SWENfRE1BT1ZGKHZhbCkJCWJmaW5fd3JpdGUzMihFTUFDX1JYQ19ETUFPVkYsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfUlhDX1VOSUNTVCgpCQliZmluX3JlYWQzMihFTUFDX1JYQ19VTklDU1QpCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19SWENfVU5JQ1NUKHZhbCkJCWJmaW5fd3JpdGUzMihFTUFDX1JYQ19VTklDU1QsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfUlhDX01VTFRJKCkJCWJmaW5fcmVhZDMyKEVNQUNfUlhDX01VTFRJKQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfUlhDX01VTFRJKHZhbCkJCWJmaW5fd3JpdGUzMihFTUFDX1JYQ19NVUxUSSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRU1BQ19SWENfQlJPQUQoKQkJYmZpbl9yZWFkMzIoRU1BQ19SWENfQlJPQUQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19SWENfQlJPQUQodmFsKQkJYmZpbl93cml0ZTMyKEVNQUNfUlhDX0JST0FELCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX1JYQ19MTkVSUkkoKQkJYmZpbl9yZWFkMzIoRU1BQ19SWENfTE5FUlJJKQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfUlhDX0xORVJSSSh2YWwpCQliZmluX3dyaXRlMzIoRU1BQ19SWENfTE5FUlJJLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX1JYQ19MTkVSUk8oKQkJYmZpbl9yZWFkMzIoRU1BQ19SWENfTE5FUlJPKQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfUlhDX0xORVJSTyh2YWwpCQliZmluX3dyaXRlMzIoRU1BQ19SWENfTE5FUlJPLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX1JYQ19MT05HKCkJCWJmaW5fcmVhZDMyKEVNQUNfUlhDX0xPTkcpCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19SWENfTE9ORyh2YWwpCQliZmluX3dyaXRlMzIoRU1BQ19SWENfTE9ORywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRU1BQ19SWENfTUFDQ1RMKCkJCWJmaW5fcmVhZDMyKEVNQUNfUlhDX01BQ0NUTCkKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX1JYQ19NQUNDVEwodmFsKQkJYmZpbl93cml0ZTMyKEVNQUNfUlhDX01BQ0NUTCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRU1BQ19SWENfT1BDT0RFKCkJCWJmaW5fcmVhZDMyKEVNQUNfUlhDX09QQ09ERSkKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX1JYQ19PUENPREUodmFsKQkJYmZpbl93cml0ZTMyKEVNQUNfUlhDX09QQ09ERSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRU1BQ19SWENfUEFVU0UoKQkJYmZpbl9yZWFkMzIoRU1BQ19SWENfUEFVU0UpCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19SWENfUEFVU0UodmFsKQkJYmZpbl93cml0ZTMyKEVNQUNfUlhDX1BBVVNFLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX1JYQ19BTExGUk0oKQkJYmZpbl9yZWFkMzIoRU1BQ19SWENfQUxMRlJNKQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfUlhDX0FMTEZSTSh2YWwpCQliZmluX3dyaXRlMzIoRU1BQ19SWENfQUxMRlJNLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX1JYQ19BTExPQ1QoKQkJYmZpbl9yZWFkMzIoRU1BQ19SWENfQUxMT0NUKQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfUlhDX0FMTE9DVCh2YWwpCQliZmluX3dyaXRlMzIoRU1BQ19SWENfQUxMT0NULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX1JYQ19UWVBFRCgpCQliZmluX3JlYWQzMihFTUFDX1JYQ19UWVBFRCkKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX1JYQ19UWVBFRCh2YWwpCQliZmluX3dyaXRlMzIoRU1BQ19SWENfVFlQRUQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfUlhDX1NIT1JUKCkJCWJmaW5fcmVhZDMyKEVNQUNfUlhDX1NIT1JUKQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfUlhDX1NIT1JUKHZhbCkJCWJmaW5fd3JpdGUzMihFTUFDX1JYQ19TSE9SVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRU1BQ19SWENfRVE2NCgpCQliZmluX3JlYWQzMihFTUFDX1JYQ19FUTY0KQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfUlhDX0VRNjQodmFsKQkJYmZpbl93cml0ZTMyKEVNQUNfUlhDX0VRNjQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfUlhDX0xUMTI4KCkJCWJmaW5fcmVhZDMyKEVNQUNfUlhDX0xUMTI4KQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfUlhDX0xUMTI4KHZhbCkJCWJmaW5fd3JpdGUzMihFTUFDX1JYQ19MVDEyOCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRU1BQ19SWENfTFQyNTYoKQkJYmZpbl9yZWFkMzIoRU1BQ19SWENfTFQyNTYpCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19SWENfTFQyNTYodmFsKQkJYmZpbl93cml0ZTMyKEVNQUNfUlhDX0xUMjU2LCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX1JYQ19MVDUxMigpCQliZmluX3JlYWQzMihFTUFDX1JYQ19MVDUxMikKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX1JYQ19MVDUxMih2YWwpCQliZmluX3dyaXRlMzIoRU1BQ19SWENfTFQ1MTIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfUlhDX0xUMTAyNCgpCQliZmluX3JlYWQzMihFTUFDX1JYQ19MVDEwMjQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19SWENfTFQxMDI0KHZhbCkJCWJmaW5fd3JpdGUzMihFTUFDX1JYQ19MVDEwMjQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfUlhDX0dFMTAyNCgpCQliZmluX3JlYWQzMihFTUFDX1JYQ19HRTEwMjQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19SWENfR0UxMDI0KHZhbCkJCWJmaW5fd3JpdGUzMihFTUFDX1JYQ19HRTEwMjQsIHZhbCkKKworI2RlZmluZSBiZmluX3JlYWRfRU1BQ19UWENfT0soKQkJCWJmaW5fcmVhZDMyKEVNQUNfVFhDX09LKQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfVFhDX09LKHZhbCkJCWJmaW5fd3JpdGUzMihFTUFDX1RYQ19PSywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRU1BQ19UWENfMUNPTCgpCQliZmluX3JlYWQzMihFTUFDX1RYQ18xQ09MKQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfVFhDXzFDT0wodmFsKQkJYmZpbl93cml0ZTMyKEVNQUNfVFhDXzFDT0wsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfVFhDX0dUMUNPTCgpCQliZmluX3JlYWQzMihFTUFDX1RYQ19HVDFDT0wpCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19UWENfR1QxQ09MKHZhbCkJCWJmaW5fd3JpdGUzMihFTUFDX1RYQ19HVDFDT0wsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfVFhDX09DVEVUKCkJCWJmaW5fcmVhZDMyKEVNQUNfVFhDX09DVEVUKQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfVFhDX09DVEVUKHZhbCkJCWJmaW5fd3JpdGUzMihFTUFDX1RYQ19PQ1RFVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRU1BQ19UWENfREVGRVIoKQkJYmZpbl9yZWFkMzIoRU1BQ19UWENfREVGRVIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19UWENfREVGRVIodmFsKQkJYmZpbl93cml0ZTMyKEVNQUNfVFhDX0RFRkVSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX1RYQ19MQVRFQ0woKQkJYmZpbl9yZWFkMzIoRU1BQ19UWENfTEFURUNMKQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfVFhDX0xBVEVDTCh2YWwpCQliZmluX3dyaXRlMzIoRU1BQ19UWENfTEFURUNMLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX1RYQ19YU19DT0woKQkJYmZpbl9yZWFkMzIoRU1BQ19UWENfWFNfQ09MKQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfVFhDX1hTX0NPTCh2YWwpCQliZmluX3dyaXRlMzIoRU1BQ19UWENfWFNfQ09MLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX1RYQ19ETUFVTkQoKQkJYmZpbl9yZWFkMzIoRU1BQ19UWENfRE1BVU5EKQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfVFhDX0RNQVVORCh2YWwpCQliZmluX3dyaXRlMzIoRU1BQ19UWENfRE1BVU5ELCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX1RYQ19DUlNFUlIoKQkJYmZpbl9yZWFkMzIoRU1BQ19UWENfQ1JTRVJSKQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfVFhDX0NSU0VSUih2YWwpCQliZmluX3dyaXRlMzIoRU1BQ19UWENfQ1JTRVJSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX1RYQ19VTklDU1QoKQkJYmZpbl9yZWFkMzIoRU1BQ19UWENfVU5JQ1NUKQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfVFhDX1VOSUNTVCh2YWwpCQliZmluX3dyaXRlMzIoRU1BQ19UWENfVU5JQ1NULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX1RYQ19NVUxUSSgpCQliZmluX3JlYWQzMihFTUFDX1RYQ19NVUxUSSkKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX1RYQ19NVUxUSSh2YWwpCQliZmluX3dyaXRlMzIoRU1BQ19UWENfTVVMVEksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfVFhDX0JST0FEKCkJCWJmaW5fcmVhZDMyKEVNQUNfVFhDX0JST0FEKQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfVFhDX0JST0FEKHZhbCkJCWJmaW5fd3JpdGUzMihFTUFDX1RYQ19CUk9BRCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRU1BQ19UWENfWFNfREZSKCkJCWJmaW5fcmVhZDMyKEVNQUNfVFhDX1hTX0RGUikKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX1RYQ19YU19ERlIodmFsKQkJYmZpbl93cml0ZTMyKEVNQUNfVFhDX1hTX0RGUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRU1BQ19UWENfTUFDQ1RMKCkJCWJmaW5fcmVhZDMyKEVNQUNfVFhDX01BQ0NUTCkKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX1RYQ19NQUNDVEwodmFsKQkJYmZpbl93cml0ZTMyKEVNQUNfVFhDX01BQ0NUTCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRU1BQ19UWENfQUxMRlJNKCkJCWJmaW5fcmVhZDMyKEVNQUNfVFhDX0FMTEZSTSkKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX1RYQ19BTExGUk0odmFsKQkJYmZpbl93cml0ZTMyKEVNQUNfVFhDX0FMTEZSTSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRU1BQ19UWENfQUxMT0NUKCkJCWJmaW5fcmVhZDMyKEVNQUNfVFhDX0FMTE9DVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX1RYQ19BTExPQ1QodmFsKQkJYmZpbl93cml0ZTMyKEVNQUNfVFhDX0FMTE9DVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRU1BQ19UWENfRVE2NCgpCQliZmluX3JlYWQzMihFTUFDX1RYQ19FUTY0KQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfVFhDX0VRNjQodmFsKQkJYmZpbl93cml0ZTMyKEVNQUNfVFhDX0VRNjQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfVFhDX0xUMTI4KCkJCWJmaW5fcmVhZDMyKEVNQUNfVFhDX0xUMTI4KQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfVFhDX0xUMTI4KHZhbCkJCWJmaW5fd3JpdGUzMihFTUFDX1RYQ19MVDEyOCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRU1BQ19UWENfTFQyNTYoKQkJYmZpbl9yZWFkMzIoRU1BQ19UWENfTFQyNTYpCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19UWENfTFQyNTYodmFsKQkJYmZpbl93cml0ZTMyKEVNQUNfVFhDX0xUMjU2LCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FTUFDX1RYQ19MVDUxMigpCQliZmluX3JlYWQzMihFTUFDX1RYQ19MVDUxMikKKyNkZWZpbmUgYmZpbl93cml0ZV9FTUFDX1RYQ19MVDUxMih2YWwpCQliZmluX3dyaXRlMzIoRU1BQ19UWENfTFQ1MTIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfVFhDX0xUMTAyNCgpCQliZmluX3JlYWQzMihFTUFDX1RYQ19MVDEwMjQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19UWENfTFQxMDI0KHZhbCkJCWJmaW5fd3JpdGUzMihFTUFDX1RYQ19MVDEwMjQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfVFhDX0dFMTAyNCgpCQliZmluX3JlYWQzMihFTUFDX1RYQ19HRTEwMjQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRU1BQ19UWENfR0UxMDI0KHZhbCkJCWJmaW5fd3JpdGUzMihFTUFDX1RYQ19HRTEwMjQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VNQUNfVFhDX0FCT1JUKCkJCWJmaW5fcmVhZDMyKEVNQUNfVFhDX0FCT1JUKQorI2RlZmluZSBiZmluX3dyaXRlX0VNQUNfVFhDX0FCT1JUKHZhbCkJCWJmaW5fd3JpdGUzMihFTUFDX1RYQ19BQk9SVCwgdmFsKQorCisvKiBSZW1vdmFibGUgU3RvcmFnZSBJbnRlcmZhY2UgUmVnaXN0ZXJzICovCisKKyNkZWZpbmUgYmZpbl9yZWFkX1JTSV9QV1JfQ1RMKCkgICAgICAgIGJmaW5fcmVhZDE2KFJTSV9QV1JfQ09OVFJPTCkKKyNkZWZpbmUgYmZpbl93cml0ZV9SU0lfUFdSX0NUTCh2YWwpICAgIGJmaW5fd3JpdGUxNihSU0lfUFdSX0NPTlRST0wsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1JTSV9DTEtfQ1RMKCkJICAgICAgIGJmaW5fcmVhZDE2KFJTSV9DTEtfQ09OVFJPTCkKKyNkZWZpbmUgYmZpbl93cml0ZV9SU0lfQ0xLX0NUTCh2YWwpICAgIGJmaW5fd3JpdGUxNihSU0lfQ0xLX0NPTlRST0wsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1JTSV9BUkdVTUVOVCgpICAgICAgIGJmaW5fcmVhZDMyKFJTSV9BUkdVTUVOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9SU0lfQVJHVU1FTlQodmFsKSAgIGJmaW5fd3JpdGUzMihSU0lfQVJHVU1FTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1JTSV9DT01NQU5EKCkgICAgICAgIGJmaW5fcmVhZDE2KFJTSV9DT01NQU5EKQorI2RlZmluZSBiZmluX3dyaXRlX1JTSV9DT01NQU5EKHZhbCkgICAgYmZpbl93cml0ZTE2KFJTSV9DT01NQU5ELCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9SU0lfUkVTUF9DTUQoKSAgICAgICBiZmluX3JlYWQxNihSU0lfUkVTUF9DTUQpCisjZGVmaW5lIGJmaW5fd3JpdGVfUlNJX1JFU1BfQ01EKHZhbCkgICBiZmluX3dyaXRlMTYoUlNJX1JFU1BfQ01ELCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9SU0lfUkVTUE9OU0UwKCkgICAgICBiZmluX3JlYWQzMihSU0lfUkVTUE9OU0UwKQorI2RlZmluZSBiZmluX3dyaXRlX1JTSV9SRVNQT05TRTAodmFsKSAgYmZpbl93cml0ZTMyKFJTSV9SRVNQT05TRTAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1JTSV9SRVNQT05TRTEoKSAgICAgIGJmaW5fcmVhZDMyKFJTSV9SRVNQT05TRTEpCisjZGVmaW5lIGJmaW5fd3JpdGVfUlNJX1JFU1BPTlNFMSh2YWwpICBiZmluX3dyaXRlMzIoUlNJX1JFU1BPTlNFMSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUlNJX1JFU1BPTlNFMigpICAgICAgYmZpbl9yZWFkMzIoUlNJX1JFU1BPTlNFMikKKyNkZWZpbmUgYmZpbl93cml0ZV9SU0lfUkVTUE9OU0UyKHZhbCkgIGJmaW5fd3JpdGUzMihSU0lfUkVTUE9OU0UyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9SU0lfUkVTUE9OU0UzKCkgICAgICBiZmluX3JlYWQzMihSU0lfUkVTUE9OU0UzKQorI2RlZmluZSBiZmluX3dyaXRlX1JTSV9SRVNQT05TRTModmFsKSAgYmZpbl93cml0ZTMyKFJTSV9SRVNQT05TRTMsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1JTSV9EQVRBX1RJTUVSKCkgICAgIGJmaW5fcmVhZDMyKFJTSV9EQVRBX1RJTUVSKQorI2RlZmluZSBiZmluX3dyaXRlX1JTSV9EQVRBX1RJTUVSKHZhbCkgYmZpbl93cml0ZTMyKFJTSV9EQVRBX1RJTUVSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9SU0lfREFUQV9MR1RIKCkgICAgICBiZmluX3JlYWQxNihSU0lfREFUQV9MR1RIKQorI2RlZmluZSBiZmluX3dyaXRlX1JTSV9EQVRBX0xHVEgodmFsKSAgYmZpbl93cml0ZTE2KFJTSV9EQVRBX0xHVEgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1JTSV9EQVRBX0NUTCgpICAgICAgIGJmaW5fcmVhZDE2KFJTSV9EQVRBX0NPTlRST0wpCisjZGVmaW5lIGJmaW5fd3JpdGVfUlNJX0RBVEFfQ1RMKHZhbCkgICBiZmluX3dyaXRlMTYoUlNJX0RBVEFfQ09OVFJPTCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUlNJX0RBVEFfQ05UKCkgICAgICAgYmZpbl9yZWFkMTYoUlNJX0RBVEFfQ05UKQorI2RlZmluZSBiZmluX3dyaXRlX1JTSV9EQVRBX0NOVCh2YWwpICAgYmZpbl93cml0ZTE2KFJTSV9EQVRBX0NOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUlNJX1NUQVRVUygpICAgICAgICAgYmZpbl9yZWFkMzIoUlNJX1NUQVRVUykKKyNkZWZpbmUgYmZpbl93cml0ZV9SU0lfU1RBVFVTKHZhbCkgICAgIGJmaW5fd3JpdGUzMihSU0lfU1RBVFVTLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9SU0lfU1RBVFVTX0NMUigpICAgICBiZmluX3JlYWQxNihSU0lfU1RBVFVTQ0wpCisjZGVmaW5lIGJmaW5fd3JpdGVfUlNJX1NUQVRVU19DTFIodmFsKSBiZmluX3dyaXRlMTYoUlNJX1NUQVRVU0NMLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9SU0lfTUFTSzAoKSAgICAgICAgICBiZmluX3JlYWQzMihSU0lfTUFTSzApCisjZGVmaW5lIGJmaW5fd3JpdGVfUlNJX01BU0swKHZhbCkgICAgICBiZmluX3dyaXRlMzIoUlNJX01BU0swLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9SU0lfTUFTSzEoKSAgICAgICAgICBiZmluX3JlYWQzMihSU0lfTUFTSzEpCisjZGVmaW5lIGJmaW5fd3JpdGVfUlNJX01BU0sxKHZhbCkgICAgICBiZmluX3dyaXRlMzIoUlNJX01BU0sxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9SU0lfRklGT19DTlQoKSAgICAgICBiZmluX3JlYWQxNihSU0lfRklGT19DTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfUlNJX0ZJRk9fQ05UKHZhbCkgICBiZmluX3dyaXRlMTYoUlNJX0ZJRk9fQ05ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9SU0lfQ0VBVEFfQ1RMKCkgICAgICBiZmluX3JlYWQxNihSU0lfQ0VBVEFfQ09OVFJPTCkKKyNkZWZpbmUgYmZpbl93cml0ZV9SU0lfQ0VBVEFfQ1RMKHZhbCkgIGJmaW5fd3JpdGUxNihSU0lfQ0VBVEFfQ09OVFJPTCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUlNJX0ZJRk8oKSAgICAgICAgICAgYmZpbl9yZWFkMzIoUlNJX0ZJRk8pCisjZGVmaW5lIGJmaW5fd3JpdGVfUlNJX0ZJRk8odmFsKSAgICAgICBiZmluX3dyaXRlMzIoUlNJX0ZJRk8sIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1JTSV9FX1NUQVRVUygpICAgICAgIGJmaW5fcmVhZDE2KFJTSV9FU1RBVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9SU0lfRV9TVEFUVVModmFsKSAgIGJmaW5fd3JpdGUxNihSU0lfRVNUQVQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1JTSV9FX01BU0soKSAgICAgICAgIGJmaW5fcmVhZDE2KFJTSV9FTUFTSykKKyNkZWZpbmUgYmZpbl93cml0ZV9SU0lfRV9NQVNLKHZhbCkgICAgIGJmaW5fd3JpdGUxNihSU0lfRU1BU0ssIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1JTSV9DRkcoKSAgICAgICAgICAgIGJmaW5fcmVhZDE2KFJTSV9DT05GSUcpCisjZGVmaW5lIGJmaW5fd3JpdGVfUlNJX0NGRyh2YWwpICAgICAgICBiZmluX3dyaXRlMTYoUlNJX0NPTkZJRywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUlNJX1JEX1dBSVRfRU4oKSAgICAgYmZpbl9yZWFkMTYoUlNJX1JEX1dBSVRfRU4pCisjZGVmaW5lIGJmaW5fd3JpdGVfUlNJX1JEX1dBSVRfRU4odmFsKSBiZmluX3dyaXRlMTYoUlNJX1JEX1dBSVRfRU4sIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1JTSV9QSUQwKCkgICAgICAgICAgIGJmaW5fcmVhZDE2KFJTSV9QSUQwKQorI2RlZmluZSBiZmluX3dyaXRlX1JTSV9QSUQwKHZhbCkgICAgICAgYmZpbl93cml0ZTE2KFJTSV9QSUQwLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9SU0lfUElEMSgpICAgICAgICAgICBiZmluX3JlYWQxNihSU0lfUElEMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9SU0lfUElEMSh2YWwpICAgICAgIGJmaW5fd3JpdGUxNihSU0lfUElEMSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUlNJX1BJRDIoKSAgICAgICAgICAgYmZpbl9yZWFkMTYoUlNJX1BJRDIpCisjZGVmaW5lIGJmaW5fd3JpdGVfUlNJX1BJRDIodmFsKSAgICAgICBiZmluX3dyaXRlMTYoUlNJX1BJRDIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1JTSV9QSUQzKCkgICAgICAgICAgIGJmaW5fcmVhZDE2KFJTSV9QSUQzKQorI2RlZmluZSBiZmluX3dyaXRlX1JTSV9QSUQzKHZhbCkgICAgICAgYmZpbl93cml0ZTE2KFJTSV9QSUQzLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9SU0lfUElENCgpICAgICAgICAgICBiZmluX3JlYWQxNihSU0lfUElENCkKKyNkZWZpbmUgYmZpbl93cml0ZV9SU0lfUElENCh2YWwpICAgICAgIGJmaW5fd3JpdGUxNihSU0lfUElENCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUlNJX1BJRDUoKSAgICAgICAgICAgYmZpbl9yZWFkMTYoUlNJX1BJRDUpCisjZGVmaW5lIGJmaW5fd3JpdGVfUlNJX1BJRDUodmFsKSAgICAgICBiZmluX3dyaXRlMTYoUlNJX1BJRDUsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1JTSV9QSUQ2KCkgICAgICAgICAgIGJmaW5fcmVhZDE2KFJTSV9QSUQ2KQorI2RlZmluZSBiZmluX3dyaXRlX1JTSV9QSUQ2KHZhbCkgICAgICAgYmZpbl93cml0ZTE2KFJTSV9QSUQ2LCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9SU0lfUElENygpICAgICAgICAgICBiZmluX3JlYWQxNihSU0lfUElENykKKyNkZWZpbmUgYmZpbl93cml0ZV9SU0lfUElENyh2YWwpICAgICAgIGJmaW5fd3JpdGUxNihSU0lfUElENywgdmFsKQorCisKKyNlbmRpZiAvKiBfQ0RFRl9CRjUxOF9IICovCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvaW5jbHVkZS9tYWNoL2NkZWZCRjUxeF9iYXNlLmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvaW5jbHVkZS9tYWNoL2NkZWZCRjUxeF9iYXNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWUzZDQ3MwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9pbmNsdWRlL21hY2gvY2RlZkJGNTF4X2Jhc2UuaApAQCAtMCwwICsxLDEyMDggQEAKKy8qCisgKiBGaWxlOiAgICAgICAgIGluY2x1ZGUvYXNtLWJsYWNrZmluL21hY2gtYmY1MTgvY2RlZkJGNTF4X2Jhc2UuaAorICogQmFzZWQgb246CisgKiBBdXRob3I6CisgKgorICogQ3JlYXRlZDoKKyAqIERlc2NyaXB0aW9uOgorICoKKyAqIFJldjoKKyAqCisgKiBNb2RpZmllZDoKKyAqCisgKiBCdWdzOiAgICAgICAgIEVudGVyIGJ1Z3MgYXQgaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnLworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLgorICogSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqLworCisjaWZuZGVmIF9DREVGX0JGNTJYX0gKKyNkZWZpbmUgX0NERUZfQkY1MlhfSAorCisjaW5jbHVkZSA8YXNtL2JsYWNrZmluLmg+CisKKyNpbmNsdWRlICJkZWZCRjUxeF9iYXNlLmgiCisKKy8qIEluY2x1ZGUgY29yZSBzcGVjaWZpYyByZWdpc3RlciBwb2ludGVyIGRlZmluaXRpb25zIAkJCQkJCQkJKi8KKyNpbmNsdWRlIDxhc20vY2RlZl9MUEJsYWNrZmluLmg+CisKKy8qID09PT0gYmVnaW4gZnJvbSBjZGVmQkY1MzQuaCA9PT09ICovCisKKy8qIENsb2NrIGFuZCBTeXN0ZW0gQ29udHJvbAkoMHhGRkMwMDAwMCAtIDB4RkZDMDAwRkYpCQkJCQkJCQkqLworI2RlZmluZSBiZmluX3JlYWRfUExMX0NUTCgpCQkJYmZpbl9yZWFkMTYoUExMX0NUTCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BMTF9ESVYoKQkJCWJmaW5fcmVhZDE2KFBMTF9ESVYpCisjZGVmaW5lIGJmaW5fd3JpdGVfUExMX0RJVih2YWwpCQkJYmZpbl93cml0ZTE2KFBMTF9ESVYsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1ZSX0NUTCgpCQkJYmZpbl9yZWFkMTYoVlJfQ1RMKQorI2RlZmluZSBiZmluX3JlYWRfUExMX1NUQVQoKQkJCWJmaW5fcmVhZDE2KFBMTF9TVEFUKQorI2RlZmluZSBiZmluX3dyaXRlX1BMTF9TVEFUKHZhbCkJCWJmaW5fd3JpdGUxNihQTExfU1RBVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUExMX0xPQ0tDTlQoKQkJCWJmaW5fcmVhZDE2KFBMTF9MT0NLQ05UKQorI2RlZmluZSBiZmluX3dyaXRlX1BMTF9MT0NLQ05UKHZhbCkJCWJmaW5fd3JpdGUxNihQTExfTE9DS0NOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0hJUElEKCkJCQliZmluX3JlYWQzMihDSElQSUQpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0hJUElEKHZhbCkJCQliZmluX3dyaXRlMzIoQ0hJUElELCB2YWwpCisKKworLyogU3lzdGVtIEludGVycnVwdCBDb250cm9sbGVyICgweEZGQzAwMTAwIC0gMHhGRkMwMDFGRikJCQkJCQkJKi8KKyNkZWZpbmUgYmZpbl9yZWFkX1NXUlNUKCkJCQliZmluX3JlYWQxNihTV1JTVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9TV1JTVCh2YWwpCQkJYmZpbl93cml0ZTE2KFNXUlNULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TWVNDUigpCQkJYmZpbl9yZWFkMTYoU1lTQ1IpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1lTQ1IodmFsKQkJCWJmaW5fd3JpdGUxNihTWVNDUiwgdmFsKQorCisjZGVmaW5lIGJmaW5fcmVhZF9TSUNfUlZFQ1QoKQkJCWJmaW5fcmVhZDMyKFNJQ19SVkVDVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9TSUNfUlZFQ1QodmFsKQkJYmZpbl93cml0ZTMyKFNJQ19SVkVDVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU0lDX0lNQVNLMCgpCQkJYmZpbl9yZWFkMzIoU0lDX0lNQVNLMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9TSUNfSU1BU0swKHZhbCkJCWJmaW5fd3JpdGUzMihTSUNfSU1BU0swLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TSUNfSU1BU0soeCkJCQliZmluX3JlYWQzMihTSUNfSU1BU0swICsgKHggPDwgNikpCisjZGVmaW5lIGJmaW5fd3JpdGVfU0lDX0lNQVNLKHgsIHZhbCkJCWJmaW5fd3JpdGUzMigoU0lDX0lNQVNLMCArICh4IDw8IDYpKSwgdmFsKQorCisjZGVmaW5lIGJmaW5fcmVhZF9TSUNfSUFSMCgpCQkJYmZpbl9yZWFkMzIoU0lDX0lBUjApCisjZGVmaW5lIGJmaW5fd3JpdGVfU0lDX0lBUjAodmFsKQkJYmZpbl93cml0ZTMyKFNJQ19JQVIwLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TSUNfSUFSMSgpCQkJYmZpbl9yZWFkMzIoU0lDX0lBUjEpCisjZGVmaW5lIGJmaW5fd3JpdGVfU0lDX0lBUjEodmFsKQkJYmZpbl93cml0ZTMyKFNJQ19JQVIxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TSUNfSUFSMigpCQkJYmZpbl9yZWFkMzIoU0lDX0lBUjIpCisjZGVmaW5lIGJmaW5fd3JpdGVfU0lDX0lBUjIodmFsKQkJYmZpbl93cml0ZTMyKFNJQ19JQVIyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TSUNfSUFSMygpCQkJYmZpbl9yZWFkMzIoU0lDX0lBUjMpCisjZGVmaW5lIGJmaW5fd3JpdGVfU0lDX0lBUjModmFsKQkJYmZpbl93cml0ZTMyKFNJQ19JQVIzLCB2YWwpCisKKyNkZWZpbmUgYmZpbl9yZWFkX1NJQ19JU1IwKCkJCQliZmluX3JlYWQzMihTSUNfSVNSMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9TSUNfSVNSMCh2YWwpCQliZmluX3dyaXRlMzIoU0lDX0lTUjAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NJQ19JU1IoeCkJCQliZmluX3JlYWQzMihTSUNfSVNSMCArICh4IDw8IDYpKQorI2RlZmluZSBiZmluX3dyaXRlX1NJQ19JU1IoeCwgdmFsKQkJYmZpbl93cml0ZTMyKChTSUNfSVNSMCArICh4IDw8IDYpKSwgdmFsKQorCisjZGVmaW5lIGJmaW5fcmVhZF9TSUNfSVdSMCgpCQkJYmZpbl9yZWFkMzIoU0lDX0lXUjApCisjZGVmaW5lIGJmaW5fd3JpdGVfU0lDX0lXUjAodmFsKQkJYmZpbl93cml0ZTMyKFNJQ19JV1IwLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TSUNfSVdSKHgpCQkJYmZpbl9yZWFkMzIoU0lDX0lXUjAgKyAoeCA8PCA2KSkKKyNkZWZpbmUgYmZpbl93cml0ZV9TSUNfSVdSKHgsIHZhbCkJCWJmaW5fd3JpdGUzMigoU0lDX0lXUjAgKyAoeCA8PCA2KSksIHZhbCkKKworLyogU0lDIEFkZGl0aW9ucyB0byBBRFNQLUJGNTF4ICgweEZGQzAwMTRDIC0gMHhGRkMwMDE2MikgKi8KKworI2RlZmluZSBiZmluX3JlYWRfU0lDX0lNQVNLMSgpCQkJYmZpbl9yZWFkMzIoU0lDX0lNQVNLMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9TSUNfSU1BU0sxKHZhbCkJCWJmaW5fd3JpdGUzMihTSUNfSU1BU0sxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TSUNfSUFSNCgpCQkJYmZpbl9yZWFkMzIoU0lDX0lBUjQpCisjZGVmaW5lIGJmaW5fd3JpdGVfU0lDX0lBUjQodmFsKQkJYmZpbl93cml0ZTMyKFNJQ19JQVI0LCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TSUNfSUFSNSgpCQkJYmZpbl9yZWFkMzIoU0lDX0lBUjUpCisjZGVmaW5lIGJmaW5fd3JpdGVfU0lDX0lBUjUodmFsKQkJYmZpbl93cml0ZTMyKFNJQ19JQVI1LCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TSUNfSUFSNigpCQkJYmZpbl9yZWFkMzIoU0lDX0lBUjYpCisjZGVmaW5lIGJmaW5fd3JpdGVfU0lDX0lBUjYodmFsKQkJYmZpbl93cml0ZTMyKFNJQ19JQVI2LCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TSUNfSUFSNygpCQkJYmZpbl9yZWFkMzIoU0lDX0lBUjcpCisjZGVmaW5lIGJmaW5fd3JpdGVfU0lDX0lBUjcodmFsKQkJYmZpbl93cml0ZTMyKFNJQ19JQVI3LCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TSUNfSVNSMSgpCQkJYmZpbl9yZWFkMzIoU0lDX0lTUjEpCisjZGVmaW5lIGJmaW5fd3JpdGVfU0lDX0lTUjEodmFsKQkJYmZpbl93cml0ZTMyKFNJQ19JU1IxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TSUNfSVdSMSgpCQkJYmZpbl9yZWFkMzIoU0lDX0lXUjEpCisjZGVmaW5lIGJmaW5fd3JpdGVfU0lDX0lXUjEodmFsKQkJYmZpbl93cml0ZTMyKFNJQ19JV1IxLCB2YWwpCisKKy8qIFdhdGNoZG9nIFRpbWVyCQkoMHhGRkMwMDIwMCAtIDB4RkZDMDAyRkYpCQkJCQkJCQkJKi8KKyNkZWZpbmUgYmZpbl9yZWFkX1dET0dfQ1RMKCkJCQliZmluX3JlYWQxNihXRE9HX0NUTCkKKyNkZWZpbmUgYmZpbl93cml0ZV9XRE9HX0NUTCh2YWwpCQliZmluX3dyaXRlMTYoV0RPR19DVEwsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1dET0dfQ05UKCkJCQliZmluX3JlYWQzMihXRE9HX0NOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9XRE9HX0NOVCh2YWwpCQliZmluX3dyaXRlMzIoV0RPR19DTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1dET0dfU1RBVCgpCQkJYmZpbl9yZWFkMzIoV0RPR19TVEFUKQorI2RlZmluZSBiZmluX3dyaXRlX1dET0dfU1RBVCh2YWwpCQliZmluX3dyaXRlMzIoV0RPR19TVEFULCB2YWwpCisKKworLyogUmVhbCBUaW1lIENsb2NrCQkoMHhGRkMwMDMwMCAtIDB4RkZDMDAzRkYpCQkJCQkJCQkJKi8KKyNkZWZpbmUgYmZpbl9yZWFkX1JUQ19TVEFUKCkJCQliZmluX3JlYWQzMihSVENfU1RBVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9SVENfU1RBVCh2YWwpCQliZmluX3dyaXRlMzIoUlRDX1NUQVQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1JUQ19JQ1RMKCkJCQliZmluX3JlYWQxNihSVENfSUNUTCkKKyNkZWZpbmUgYmZpbl93cml0ZV9SVENfSUNUTCh2YWwpCQliZmluX3dyaXRlMTYoUlRDX0lDVEwsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1JUQ19JU1RBVCgpCQkJYmZpbl9yZWFkMTYoUlRDX0lTVEFUKQorI2RlZmluZSBiZmluX3dyaXRlX1JUQ19JU1RBVCh2YWwpCQliZmluX3dyaXRlMTYoUlRDX0lTVEFULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9SVENfU1dDTlQoKQkJCWJmaW5fcmVhZDE2KFJUQ19TV0NOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9SVENfU1dDTlQodmFsKQkJYmZpbl93cml0ZTE2KFJUQ19TV0NOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUlRDX0FMQVJNKCkJCQliZmluX3JlYWQzMihSVENfQUxBUk0pCisjZGVmaW5lIGJmaW5fd3JpdGVfUlRDX0FMQVJNKHZhbCkJCWJmaW5fd3JpdGUzMihSVENfQUxBUk0sIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1JUQ19GQVNUKCkJCQliZmluX3JlYWQxNihSVENfRkFTVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9SVENfRkFTVCh2YWwpCQliZmluX3dyaXRlMTYoUlRDX0ZBU1QsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1JUQ19QUkVOKCkJCQliZmluX3JlYWQxNihSVENfUFJFTikKKyNkZWZpbmUgYmZpbl93cml0ZV9SVENfUFJFTih2YWwpCQliZmluX3dyaXRlMTYoUlRDX1BSRU4sIHZhbCkKKworCisvKiBVQVJUMCBDb250cm9sbGVyCQkoMHhGRkMwMDQwMCAtIDB4RkZDMDA0RkYpCQkJCQkJCQkJKi8KKyNkZWZpbmUgYmZpbl9yZWFkX1VBUlQwX1RIUigpCQkJYmZpbl9yZWFkMTYoVUFSVDBfVEhSKQorI2RlZmluZSBiZmluX3dyaXRlX1VBUlQwX1RIUih2YWwpCQliZmluX3dyaXRlMTYoVUFSVDBfVEhSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9VQVJUMF9SQlIoKQkJCWJmaW5fcmVhZDE2KFVBUlQwX1JCUikKKyNkZWZpbmUgYmZpbl93cml0ZV9VQVJUMF9SQlIodmFsKQkJYmZpbl93cml0ZTE2KFVBUlQwX1JCUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVUFSVDBfRExMKCkJCQliZmluX3JlYWQxNihVQVJUMF9ETEwpCisjZGVmaW5lIGJmaW5fd3JpdGVfVUFSVDBfRExMKHZhbCkJCWJmaW5fd3JpdGUxNihVQVJUMF9ETEwsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1VBUlQwX0lFUigpCQkJYmZpbl9yZWFkMTYoVUFSVDBfSUVSKQorI2RlZmluZSBiZmluX3dyaXRlX1VBUlQwX0lFUih2YWwpCQliZmluX3dyaXRlMTYoVUFSVDBfSUVSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9VQVJUMF9ETEgoKQkJCWJmaW5fcmVhZDE2KFVBUlQwX0RMSCkKKyNkZWZpbmUgYmZpbl93cml0ZV9VQVJUMF9ETEgodmFsKQkJYmZpbl93cml0ZTE2KFVBUlQwX0RMSCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVUFSVDBfSUlSKCkJCQliZmluX3JlYWQxNihVQVJUMF9JSVIpCisjZGVmaW5lIGJmaW5fd3JpdGVfVUFSVDBfSUlSKHZhbCkJCWJmaW5fd3JpdGUxNihVQVJUMF9JSVIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1VBUlQwX0xDUigpCQkJYmZpbl9yZWFkMTYoVUFSVDBfTENSKQorI2RlZmluZSBiZmluX3dyaXRlX1VBUlQwX0xDUih2YWwpCQliZmluX3dyaXRlMTYoVUFSVDBfTENSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9VQVJUMF9NQ1IoKQkJCWJmaW5fcmVhZDE2KFVBUlQwX01DUikKKyNkZWZpbmUgYmZpbl93cml0ZV9VQVJUMF9NQ1IodmFsKQkJYmZpbl93cml0ZTE2KFVBUlQwX01DUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVUFSVDBfTFNSKCkJCQliZmluX3JlYWQxNihVQVJUMF9MU1IpCisjZGVmaW5lIGJmaW5fd3JpdGVfVUFSVDBfTFNSKHZhbCkJCWJmaW5fd3JpdGUxNihVQVJUMF9MU1IsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1VBUlQwX01TUigpCQkJYmZpbl9yZWFkMTYoVUFSVDBfTVNSKQorI2RlZmluZSBiZmluX3dyaXRlX1VBUlQwX01TUih2YWwpCQliZmluX3dyaXRlMTYoVUFSVDBfTVNSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9VQVJUMF9TQ1IoKQkJCWJmaW5fcmVhZDE2KFVBUlQwX1NDUikKKyNkZWZpbmUgYmZpbl93cml0ZV9VQVJUMF9TQ1IodmFsKQkJYmZpbl93cml0ZTE2KFVBUlQwX1NDUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVUFSVDBfR0NUTCgpCQkJYmZpbl9yZWFkMTYoVUFSVDBfR0NUTCkKKyNkZWZpbmUgYmZpbl93cml0ZV9VQVJUMF9HQ1RMKHZhbCkJCWJmaW5fd3JpdGUxNihVQVJUMF9HQ1RMLCB2YWwpCisKKworLyogU1BJIENvbnRyb2xsZXIJCSgweEZGQzAwNTAwIC0gMHhGRkMwMDVGRikJCQkJCQkJCQkqLworI2RlZmluZSBiZmluX3JlYWRfU1BJX0NUTCgpCQkJYmZpbl9yZWFkMTYoU1BJX0NUTCkKKyNkZWZpbmUgYmZpbl93cml0ZV9TUElfQ1RMKHZhbCkJCQliZmluX3dyaXRlMTYoU1BJX0NUTCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BJX0ZMRygpCQkJYmZpbl9yZWFkMTYoU1BJX0ZMRykKKyNkZWZpbmUgYmZpbl93cml0ZV9TUElfRkxHKHZhbCkJCQliZmluX3dyaXRlMTYoU1BJX0ZMRywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BJX1NUQVQoKQkJCWJmaW5fcmVhZDE2KFNQSV9TVEFUKQorI2RlZmluZSBiZmluX3dyaXRlX1NQSV9TVEFUKHZhbCkJCWJmaW5fd3JpdGUxNihTUElfU1RBVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BJX1REQlIoKQkJCWJmaW5fcmVhZDE2KFNQSV9UREJSKQorI2RlZmluZSBiZmluX3dyaXRlX1NQSV9UREJSKHZhbCkJCWJmaW5fd3JpdGUxNihTUElfVERCUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BJX1JEQlIoKQkJCWJmaW5fcmVhZDE2KFNQSV9SREJSKQorI2RlZmluZSBiZmluX3dyaXRlX1NQSV9SREJSKHZhbCkJCWJmaW5fd3JpdGUxNihTUElfUkRCUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BJX0JBVUQoKQkJCWJmaW5fcmVhZDE2KFNQSV9CQVVEKQorI2RlZmluZSBiZmluX3dyaXRlX1NQSV9CQVVEKHZhbCkJCWJmaW5fd3JpdGUxNihTUElfQkFVRCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BJX1NIQURPVygpCQkJYmZpbl9yZWFkMTYoU1BJX1NIQURPVykKKyNkZWZpbmUgYmZpbl93cml0ZV9TUElfU0hBRE9XKHZhbCkJCWJmaW5fd3JpdGUxNihTUElfU0hBRE9XLCB2YWwpCisKKworLyogVElNRVIwLTcgUmVnaXN0ZXJzCQkoMHhGRkMwMDYwMCAtIDB4RkZDMDA2RkYpCQkJCQkJCQkqLworI2RlZmluZSBiZmluX3JlYWRfVElNRVIwX0NPTkZJRygpCQliZmluX3JlYWQxNihUSU1FUjBfQ09ORklHKQorI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSMF9DT05GSUcodmFsKQkJYmZpbl93cml0ZTE2KFRJTUVSMF9DT05GSUcsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1RJTUVSMF9DT1VOVEVSKCkJCWJmaW5fcmVhZDMyKFRJTUVSMF9DT1VOVEVSKQorI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSMF9DT1VOVEVSKHZhbCkJCWJmaW5fd3JpdGUzMihUSU1FUjBfQ09VTlRFUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVElNRVIwX1BFUklPRCgpCQliZmluX3JlYWQzMihUSU1FUjBfUEVSSU9EKQorI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSMF9QRVJJT0QodmFsKQkJYmZpbl93cml0ZTMyKFRJTUVSMF9QRVJJT0QsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1RJTUVSMF9XSURUSCgpCQliZmluX3JlYWQzMihUSU1FUjBfV0lEVEgpCisjZGVmaW5lIGJmaW5fd3JpdGVfVElNRVIwX1dJRFRIKHZhbCkJCWJmaW5fd3JpdGUzMihUSU1FUjBfV0lEVEgsIHZhbCkKKworI2RlZmluZSBiZmluX3JlYWRfVElNRVIxX0NPTkZJRygpCQliZmluX3JlYWQxNihUSU1FUjFfQ09ORklHKQorI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSMV9DT05GSUcodmFsKQkJYmZpbl93cml0ZTE2KFRJTUVSMV9DT05GSUcsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1RJTUVSMV9DT1VOVEVSKCkJCWJmaW5fcmVhZDMyKFRJTUVSMV9DT1VOVEVSKQorI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSMV9DT1VOVEVSKHZhbCkJCWJmaW5fd3JpdGUzMihUSU1FUjFfQ09VTlRFUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVElNRVIxX1BFUklPRCgpCQliZmluX3JlYWQzMihUSU1FUjFfUEVSSU9EKQorI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSMV9QRVJJT0QodmFsKQkJYmZpbl93cml0ZTMyKFRJTUVSMV9QRVJJT0QsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1RJTUVSMV9XSURUSCgpCQliZmluX3JlYWQzMihUSU1FUjFfV0lEVEgpCisjZGVmaW5lIGJmaW5fd3JpdGVfVElNRVIxX1dJRFRIKHZhbCkJCWJmaW5fd3JpdGUzMihUSU1FUjFfV0lEVEgsIHZhbCkKKworI2RlZmluZSBiZmluX3JlYWRfVElNRVIyX0NPTkZJRygpCQliZmluX3JlYWQxNihUSU1FUjJfQ09ORklHKQorI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSMl9DT05GSUcodmFsKQkJYmZpbl93cml0ZTE2KFRJTUVSMl9DT05GSUcsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1RJTUVSMl9DT1VOVEVSKCkJCWJmaW5fcmVhZDMyKFRJTUVSMl9DT1VOVEVSKQorI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSMl9DT1VOVEVSKHZhbCkJCWJmaW5fd3JpdGUzMihUSU1FUjJfQ09VTlRFUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVElNRVIyX1BFUklPRCgpCQliZmluX3JlYWQzMihUSU1FUjJfUEVSSU9EKQorI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSMl9QRVJJT0QodmFsKQkJYmZpbl93cml0ZTMyKFRJTUVSMl9QRVJJT0QsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1RJTUVSMl9XSURUSCgpCQliZmluX3JlYWQzMihUSU1FUjJfV0lEVEgpCisjZGVmaW5lIGJmaW5fd3JpdGVfVElNRVIyX1dJRFRIKHZhbCkJCWJmaW5fd3JpdGUzMihUSU1FUjJfV0lEVEgsIHZhbCkKKworI2RlZmluZSBiZmluX3JlYWRfVElNRVIzX0NPTkZJRygpCQliZmluX3JlYWQxNihUSU1FUjNfQ09ORklHKQorI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSM19DT05GSUcodmFsKQkJYmZpbl93cml0ZTE2KFRJTUVSM19DT05GSUcsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1RJTUVSM19DT1VOVEVSKCkJCWJmaW5fcmVhZDMyKFRJTUVSM19DT1VOVEVSKQorI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSM19DT1VOVEVSKHZhbCkJCWJmaW5fd3JpdGUzMihUSU1FUjNfQ09VTlRFUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVElNRVIzX1BFUklPRCgpCQliZmluX3JlYWQzMihUSU1FUjNfUEVSSU9EKQorI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSM19QRVJJT0QodmFsKQkJYmZpbl93cml0ZTMyKFRJTUVSM19QRVJJT0QsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1RJTUVSM19XSURUSCgpCQliZmluX3JlYWQzMihUSU1FUjNfV0lEVEgpCisjZGVmaW5lIGJmaW5fd3JpdGVfVElNRVIzX1dJRFRIKHZhbCkJCWJmaW5fd3JpdGUzMihUSU1FUjNfV0lEVEgsIHZhbCkKKworI2RlZmluZSBiZmluX3JlYWRfVElNRVI0X0NPTkZJRygpCQliZmluX3JlYWQxNihUSU1FUjRfQ09ORklHKQorI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSNF9DT05GSUcodmFsKQkJYmZpbl93cml0ZTE2KFRJTUVSNF9DT05GSUcsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1RJTUVSNF9DT1VOVEVSKCkJCWJmaW5fcmVhZDMyKFRJTUVSNF9DT1VOVEVSKQorI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSNF9DT1VOVEVSKHZhbCkJCWJmaW5fd3JpdGUzMihUSU1FUjRfQ09VTlRFUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVElNRVI0X1BFUklPRCgpCQliZmluX3JlYWQzMihUSU1FUjRfUEVSSU9EKQorI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSNF9QRVJJT0QodmFsKQkJYmZpbl93cml0ZTMyKFRJTUVSNF9QRVJJT0QsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1RJTUVSNF9XSURUSCgpCQliZmluX3JlYWQzMihUSU1FUjRfV0lEVEgpCisjZGVmaW5lIGJmaW5fd3JpdGVfVElNRVI0X1dJRFRIKHZhbCkJCWJmaW5fd3JpdGUzMihUSU1FUjRfV0lEVEgsIHZhbCkKKworI2RlZmluZSBiZmluX3JlYWRfVElNRVI1X0NPTkZJRygpCQliZmluX3JlYWQxNihUSU1FUjVfQ09ORklHKQorI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSNV9DT05GSUcodmFsKQkJYmZpbl93cml0ZTE2KFRJTUVSNV9DT05GSUcsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1RJTUVSNV9DT1VOVEVSKCkJCWJmaW5fcmVhZDMyKFRJTUVSNV9DT1VOVEVSKQorI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSNV9DT1VOVEVSKHZhbCkJCWJmaW5fd3JpdGUzMihUSU1FUjVfQ09VTlRFUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVElNRVI1X1BFUklPRCgpCQliZmluX3JlYWQzMihUSU1FUjVfUEVSSU9EKQorI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSNV9QRVJJT0QodmFsKQkJYmZpbl93cml0ZTMyKFRJTUVSNV9QRVJJT0QsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1RJTUVSNV9XSURUSCgpCQliZmluX3JlYWQzMihUSU1FUjVfV0lEVEgpCisjZGVmaW5lIGJmaW5fd3JpdGVfVElNRVI1X1dJRFRIKHZhbCkJCWJmaW5fd3JpdGUzMihUSU1FUjVfV0lEVEgsIHZhbCkKKworI2RlZmluZSBiZmluX3JlYWRfVElNRVI2X0NPTkZJRygpCQliZmluX3JlYWQxNihUSU1FUjZfQ09ORklHKQorI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSNl9DT05GSUcodmFsKQkJYmZpbl93cml0ZTE2KFRJTUVSNl9DT05GSUcsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1RJTUVSNl9DT1VOVEVSKCkJCWJmaW5fcmVhZDMyKFRJTUVSNl9DT1VOVEVSKQorI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSNl9DT1VOVEVSKHZhbCkJCWJmaW5fd3JpdGUzMihUSU1FUjZfQ09VTlRFUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVElNRVI2X1BFUklPRCgpCQliZmluX3JlYWQzMihUSU1FUjZfUEVSSU9EKQorI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSNl9QRVJJT0QodmFsKQkJYmZpbl93cml0ZTMyKFRJTUVSNl9QRVJJT0QsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1RJTUVSNl9XSURUSCgpCQliZmluX3JlYWQzMihUSU1FUjZfV0lEVEgpCisjZGVmaW5lIGJmaW5fd3JpdGVfVElNRVI2X1dJRFRIKHZhbCkJCWJmaW5fd3JpdGUzMihUSU1FUjZfV0lEVEgsIHZhbCkKKworI2RlZmluZSBiZmluX3JlYWRfVElNRVI3X0NPTkZJRygpCQliZmluX3JlYWQxNihUSU1FUjdfQ09ORklHKQorI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSN19DT05GSUcodmFsKQkJYmZpbl93cml0ZTE2KFRJTUVSN19DT05GSUcsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1RJTUVSN19DT1VOVEVSKCkJCWJmaW5fcmVhZDMyKFRJTUVSN19DT1VOVEVSKQorI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSN19DT1VOVEVSKHZhbCkJCWJmaW5fd3JpdGUzMihUSU1FUjdfQ09VTlRFUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVElNRVI3X1BFUklPRCgpCQliZmluX3JlYWQzMihUSU1FUjdfUEVSSU9EKQorI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSN19QRVJJT0QodmFsKQkJYmZpbl93cml0ZTMyKFRJTUVSN19QRVJJT0QsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1RJTUVSN19XSURUSCgpCQliZmluX3JlYWQzMihUSU1FUjdfV0lEVEgpCisjZGVmaW5lIGJmaW5fd3JpdGVfVElNRVI3X1dJRFRIKHZhbCkJCWJmaW5fd3JpdGUzMihUSU1FUjdfV0lEVEgsIHZhbCkKKworI2RlZmluZSBiZmluX3JlYWRfVElNRVJfRU5BQkxFKCkJCWJmaW5fcmVhZDE2KFRJTUVSX0VOQUJMRSkKKyNkZWZpbmUgYmZpbl93cml0ZV9USU1FUl9FTkFCTEUodmFsKQkJYmZpbl93cml0ZTE2KFRJTUVSX0VOQUJMRSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVElNRVJfRElTQUJMRSgpCQliZmluX3JlYWQxNihUSU1FUl9ESVNBQkxFKQorI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSX0RJU0FCTEUodmFsKQkJYmZpbl93cml0ZTE2KFRJTUVSX0RJU0FCTEUsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1RJTUVSX1NUQVRVUygpCQliZmluX3JlYWQzMihUSU1FUl9TVEFUVVMpCisjZGVmaW5lIGJmaW5fd3JpdGVfVElNRVJfU1RBVFVTKHZhbCkJCWJmaW5fd3JpdGUzMihUSU1FUl9TVEFUVVMsIHZhbCkKKworCisvKiBHZW5lcmFsIFB1cnBvc2UgSS9PIFBvcnQgRiAoMHhGRkMwMDcwMCAtIDB4RkZDMDA3RkYpCQkJCQkJCQkqLworI2RlZmluZSBiZmluX3JlYWRfUE9SVEZJTygpCQkJYmZpbl9yZWFkMTYoUE9SVEZJTykKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JURklPKHZhbCkJCQliZmluX3dyaXRlMTYoUE9SVEZJTywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEZJT19DTEVBUigpCQliZmluX3JlYWQxNihQT1JURklPX0NMRUFSKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRGSU9fQ0xFQVIodmFsKQkJYmZpbl93cml0ZTE2KFBPUlRGSU9fQ0xFQVIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRGSU9fU0VUKCkJCQliZmluX3JlYWQxNihQT1JURklPX1NFVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JURklPX1NFVCh2YWwpCQliZmluX3dyaXRlMTYoUE9SVEZJT19TRVQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRGSU9fVE9HR0xFKCkJCWJmaW5fcmVhZDE2KFBPUlRGSU9fVE9HR0xFKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRGSU9fVE9HR0xFKHZhbCkJCWJmaW5fd3JpdGUxNihQT1JURklPX1RPR0dMRSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEZJT19NQVNLQSgpCQliZmluX3JlYWQxNihQT1JURklPX01BU0tBKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRGSU9fTUFTS0EodmFsKQkJYmZpbl93cml0ZTE2KFBPUlRGSU9fTUFTS0EsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRGSU9fTUFTS0FfQ0xFQVIoKQkJYmZpbl9yZWFkMTYoUE9SVEZJT19NQVNLQV9DTEVBUikKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JURklPX01BU0tBX0NMRUFSKHZhbCkJYmZpbl93cml0ZTE2KFBPUlRGSU9fTUFTS0FfQ0xFQVIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRGSU9fTUFTS0FfU0VUKCkJCWJmaW5fcmVhZDE2KFBPUlRGSU9fTUFTS0FfU0VUKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRGSU9fTUFTS0FfU0VUKHZhbCkJYmZpbl93cml0ZTE2KFBPUlRGSU9fTUFTS0FfU0VULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JURklPX01BU0tBX1RPR0dMRSgpCWJmaW5fcmVhZDE2KFBPUlRGSU9fTUFTS0FfVE9HR0xFKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRGSU9fTUFTS0FfVE9HR0xFKHZhbCkJYmZpbl93cml0ZTE2KFBPUlRGSU9fTUFTS0FfVE9HR0xFLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JURklPX01BU0tCKCkJCWJmaW5fcmVhZDE2KFBPUlRGSU9fTUFTS0IpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEZJT19NQVNLQih2YWwpCQliZmluX3dyaXRlMTYoUE9SVEZJT19NQVNLQiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEZJT19NQVNLQl9DTEVBUigpCQliZmluX3JlYWQxNihQT1JURklPX01BU0tCX0NMRUFSKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRGSU9fTUFTS0JfQ0xFQVIodmFsKQliZmluX3dyaXRlMTYoUE9SVEZJT19NQVNLQl9DTEVBUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEZJT19NQVNLQl9TRVQoKQkJYmZpbl9yZWFkMTYoUE9SVEZJT19NQVNLQl9TRVQpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEZJT19NQVNLQl9TRVQodmFsKQliZmluX3dyaXRlMTYoUE9SVEZJT19NQVNLQl9TRVQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRGSU9fTUFTS0JfVE9HR0xFKCkJYmZpbl9yZWFkMTYoUE9SVEZJT19NQVNLQl9UT0dHTEUpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEZJT19NQVNLQl9UT0dHTEUodmFsKQliZmluX3dyaXRlMTYoUE9SVEZJT19NQVNLQl9UT0dHTEUsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRGSU9fRElSKCkJCQliZmluX3JlYWQxNihQT1JURklPX0RJUikKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JURklPX0RJUih2YWwpCQliZmluX3dyaXRlMTYoUE9SVEZJT19ESVIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRGSU9fUE9MQVIoKQkJYmZpbl9yZWFkMTYoUE9SVEZJT19QT0xBUikKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JURklPX1BPTEFSKHZhbCkJCWJmaW5fd3JpdGUxNihQT1JURklPX1BPTEFSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JURklPX0VER0UoKQkJYmZpbl9yZWFkMTYoUE9SVEZJT19FREdFKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRGSU9fRURHRSh2YWwpCQliZmluX3dyaXRlMTYoUE9SVEZJT19FREdFLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JURklPX0JPVEgoKQkJYmZpbl9yZWFkMTYoUE9SVEZJT19CT1RIKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRGSU9fQk9USCh2YWwpCQliZmluX3dyaXRlMTYoUE9SVEZJT19CT1RILCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JURklPX0lORU4oKQkJYmZpbl9yZWFkMTYoUE9SVEZJT19JTkVOKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRGSU9fSU5FTih2YWwpCQliZmluX3dyaXRlMTYoUE9SVEZJT19JTkVOLCB2YWwpCisKKworLyogU1BPUlQwIENvbnRyb2xsZXIJCSgweEZGQzAwODAwIC0gMHhGRkMwMDhGRikJCQkJCQkJCSovCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDBfVENSMSgpCQkJYmZpbl9yZWFkMTYoU1BPUlQwX1RDUjEpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQwX1RDUjEodmFsKQkJYmZpbl93cml0ZTE2KFNQT1JUMF9UQ1IxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDBfVENSMigpCQkJYmZpbl9yZWFkMTYoU1BPUlQwX1RDUjIpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQwX1RDUjIodmFsKQkJYmZpbl93cml0ZTE2KFNQT1JUMF9UQ1IyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDBfVENMS0RJVigpCQliZmluX3JlYWQxNihTUE9SVDBfVENMS0RJVikKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDBfVENMS0RJVih2YWwpCQliZmluX3dyaXRlMTYoU1BPUlQwX1RDTEtESVYsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMF9URlNESVYoKQkJYmZpbl9yZWFkMTYoU1BPUlQwX1RGU0RJVikKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDBfVEZTRElWKHZhbCkJCWJmaW5fd3JpdGUxNihTUE9SVDBfVEZTRElWLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDBfVFgoKQkJCWJmaW5fcmVhZDMyKFNQT1JUMF9UWCkKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDBfVFgodmFsKQkJYmZpbl93cml0ZTMyKFNQT1JUMF9UWCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQwX1JYKCkJCQliZmluX3JlYWQzMihTUE9SVDBfUlgpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQwX1JYKHZhbCkJCWJmaW5fd3JpdGUzMihTUE9SVDBfUlgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMF9UWDMyKCkJCQliZmluX3JlYWQzMihTUE9SVDBfVFgzMikKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDBfVFgzMih2YWwpCQliZmluX3dyaXRlMzIoU1BPUlQwX1RYMzIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMF9SWDMyKCkJCQliZmluX3JlYWQzMihTUE9SVDBfUlgzMikKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDBfUlgzMih2YWwpCQliZmluX3dyaXRlMzIoU1BPUlQwX1JYMzIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMF9UWDE2KCkJCQliZmluX3JlYWQxNihTUE9SVDBfVFgxNikKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDBfVFgxNih2YWwpCQliZmluX3dyaXRlMTYoU1BPUlQwX1RYMTYsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMF9SWDE2KCkJCQliZmluX3JlYWQxNihTUE9SVDBfUlgxNikKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDBfUlgxNih2YWwpCQliZmluX3dyaXRlMTYoU1BPUlQwX1JYMTYsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMF9SQ1IxKCkJCQliZmluX3JlYWQxNihTUE9SVDBfUkNSMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDBfUkNSMSh2YWwpCQliZmluX3dyaXRlMTYoU1BPUlQwX1JDUjEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMF9SQ1IyKCkJCQliZmluX3JlYWQxNihTUE9SVDBfUkNSMikKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDBfUkNSMih2YWwpCQliZmluX3dyaXRlMTYoU1BPUlQwX1JDUjIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMF9SQ0xLRElWKCkJCWJmaW5fcmVhZDE2KFNQT1JUMF9SQ0xLRElWKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMF9SQ0xLRElWKHZhbCkJCWJmaW5fd3JpdGUxNihTUE9SVDBfUkNMS0RJViwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQwX1JGU0RJVigpCQliZmluX3JlYWQxNihTUE9SVDBfUkZTRElWKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMF9SRlNESVYodmFsKQkJYmZpbl93cml0ZTE2KFNQT1JUMF9SRlNESVYsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMF9TVEFUKCkJCQliZmluX3JlYWQxNihTUE9SVDBfU1RBVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDBfU1RBVCh2YWwpCQliZmluX3dyaXRlMTYoU1BPUlQwX1NUQVQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMF9DSE5MKCkJCQliZmluX3JlYWQxNihTUE9SVDBfQ0hOTCkKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDBfQ0hOTCh2YWwpCQliZmluX3dyaXRlMTYoU1BPUlQwX0NITkwsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMF9NQ01DMSgpCQliZmluX3JlYWQxNihTUE9SVDBfTUNNQzEpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQwX01DTUMxKHZhbCkJCWJmaW5fd3JpdGUxNihTUE9SVDBfTUNNQzEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMF9NQ01DMigpCQliZmluX3JlYWQxNihTUE9SVDBfTUNNQzIpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQwX01DTUMyKHZhbCkJCWJmaW5fd3JpdGUxNihTUE9SVDBfTUNNQzIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMF9NVENTMCgpCQliZmluX3JlYWQzMihTUE9SVDBfTVRDUzApCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQwX01UQ1MwKHZhbCkJCWJmaW5fd3JpdGUzMihTUE9SVDBfTVRDUzAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMF9NVENTMSgpCQliZmluX3JlYWQzMihTUE9SVDBfTVRDUzEpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQwX01UQ1MxKHZhbCkJCWJmaW5fd3JpdGUzMihTUE9SVDBfTVRDUzEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMF9NVENTMigpCQliZmluX3JlYWQzMihTUE9SVDBfTVRDUzIpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQwX01UQ1MyKHZhbCkJCWJmaW5fd3JpdGUzMihTUE9SVDBfTVRDUzIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMF9NVENTMygpCQliZmluX3JlYWQzMihTUE9SVDBfTVRDUzMpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQwX01UQ1MzKHZhbCkJCWJmaW5fd3JpdGUzMihTUE9SVDBfTVRDUzMsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMF9NUkNTMCgpCQliZmluX3JlYWQzMihTUE9SVDBfTVJDUzApCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQwX01SQ1MwKHZhbCkJCWJmaW5fd3JpdGUzMihTUE9SVDBfTVJDUzAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMF9NUkNTMSgpCQliZmluX3JlYWQzMihTUE9SVDBfTVJDUzEpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQwX01SQ1MxKHZhbCkJCWJmaW5fd3JpdGUzMihTUE9SVDBfTVJDUzEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMF9NUkNTMigpCQliZmluX3JlYWQzMihTUE9SVDBfTVJDUzIpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQwX01SQ1MyKHZhbCkJCWJmaW5fd3JpdGUzMihTUE9SVDBfTVJDUzIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMF9NUkNTMygpCQliZmluX3JlYWQzMihTUE9SVDBfTVJDUzMpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQwX01SQ1MzKHZhbCkJCWJmaW5fd3JpdGUzMihTUE9SVDBfTVJDUzMsIHZhbCkKKworCisvKiBTUE9SVDEgQ29udHJvbGxlcgkJKDB4RkZDMDA5MDAgLSAweEZGQzAwOUZGKQkJCQkJCQkJKi8KKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMV9UQ1IxKCkJCQliZmluX3JlYWQxNihTUE9SVDFfVENSMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDFfVENSMSh2YWwpCQliZmluX3dyaXRlMTYoU1BPUlQxX1RDUjEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMV9UQ1IyKCkJCQliZmluX3JlYWQxNihTUE9SVDFfVENSMikKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDFfVENSMih2YWwpCQliZmluX3dyaXRlMTYoU1BPUlQxX1RDUjIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMV9UQ0xLRElWKCkJCWJmaW5fcmVhZDE2KFNQT1JUMV9UQ0xLRElWKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMV9UQ0xLRElWKHZhbCkJCWJmaW5fd3JpdGUxNihTUE9SVDFfVENMS0RJViwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQxX1RGU0RJVigpCQliZmluX3JlYWQxNihTUE9SVDFfVEZTRElWKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMV9URlNESVYodmFsKQkJYmZpbl93cml0ZTE2KFNQT1JUMV9URlNESVYsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMV9UWCgpCQkJYmZpbl9yZWFkMzIoU1BPUlQxX1RYKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMV9UWCh2YWwpCQliZmluX3dyaXRlMzIoU1BPUlQxX1RYLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDFfUlgoKQkJCWJmaW5fcmVhZDMyKFNQT1JUMV9SWCkKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDFfUlgodmFsKQkJYmZpbl93cml0ZTMyKFNQT1JUMV9SWCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQxX1RYMzIoKQkJCWJmaW5fcmVhZDMyKFNQT1JUMV9UWDMyKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMV9UWDMyKHZhbCkJCWJmaW5fd3JpdGUzMihTUE9SVDFfVFgzMiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQxX1JYMzIoKQkJCWJmaW5fcmVhZDMyKFNQT1JUMV9SWDMyKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMV9SWDMyKHZhbCkJCWJmaW5fd3JpdGUzMihTUE9SVDFfUlgzMiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQxX1RYMTYoKQkJCWJmaW5fcmVhZDE2KFNQT1JUMV9UWDE2KQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMV9UWDE2KHZhbCkJCWJmaW5fd3JpdGUxNihTUE9SVDFfVFgxNiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQxX1JYMTYoKQkJCWJmaW5fcmVhZDE2KFNQT1JUMV9SWDE2KQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMV9SWDE2KHZhbCkJCWJmaW5fd3JpdGUxNihTUE9SVDFfUlgxNiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQxX1JDUjEoKQkJCWJmaW5fcmVhZDE2KFNQT1JUMV9SQ1IxKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMV9SQ1IxKHZhbCkJCWJmaW5fd3JpdGUxNihTUE9SVDFfUkNSMSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQxX1JDUjIoKQkJCWJmaW5fcmVhZDE2KFNQT1JUMV9SQ1IyKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMV9SQ1IyKHZhbCkJCWJmaW5fd3JpdGUxNihTUE9SVDFfUkNSMiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQxX1JDTEtESVYoKQkJYmZpbl9yZWFkMTYoU1BPUlQxX1JDTEtESVYpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQxX1JDTEtESVYodmFsKQkJYmZpbl93cml0ZTE2KFNQT1JUMV9SQ0xLRElWLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDFfUkZTRElWKCkJCWJmaW5fcmVhZDE2KFNQT1JUMV9SRlNESVYpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQxX1JGU0RJVih2YWwpCQliZmluX3dyaXRlMTYoU1BPUlQxX1JGU0RJViwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQxX1NUQVQoKQkJCWJmaW5fcmVhZDE2KFNQT1JUMV9TVEFUKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMV9TVEFUKHZhbCkJCWJmaW5fd3JpdGUxNihTUE9SVDFfU1RBVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQxX0NITkwoKQkJCWJmaW5fcmVhZDE2KFNQT1JUMV9DSE5MKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMV9DSE5MKHZhbCkJCWJmaW5fd3JpdGUxNihTUE9SVDFfQ0hOTCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQxX01DTUMxKCkJCWJmaW5fcmVhZDE2KFNQT1JUMV9NQ01DMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDFfTUNNQzEodmFsKQkJYmZpbl93cml0ZTE2KFNQT1JUMV9NQ01DMSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQxX01DTUMyKCkJCWJmaW5fcmVhZDE2KFNQT1JUMV9NQ01DMikKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDFfTUNNQzIodmFsKQkJYmZpbl93cml0ZTE2KFNQT1JUMV9NQ01DMiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQxX01UQ1MwKCkJCWJmaW5fcmVhZDMyKFNQT1JUMV9NVENTMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDFfTVRDUzAodmFsKQkJYmZpbl93cml0ZTMyKFNQT1JUMV9NVENTMCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQxX01UQ1MxKCkJCWJmaW5fcmVhZDMyKFNQT1JUMV9NVENTMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDFfTVRDUzEodmFsKQkJYmZpbl93cml0ZTMyKFNQT1JUMV9NVENTMSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQxX01UQ1MyKCkJCWJmaW5fcmVhZDMyKFNQT1JUMV9NVENTMikKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDFfTVRDUzIodmFsKQkJYmZpbl93cml0ZTMyKFNQT1JUMV9NVENTMiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQxX01UQ1MzKCkJCWJmaW5fcmVhZDMyKFNQT1JUMV9NVENTMykKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDFfTVRDUzModmFsKQkJYmZpbl93cml0ZTMyKFNQT1JUMV9NVENTMywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQxX01SQ1MwKCkJCWJmaW5fcmVhZDMyKFNQT1JUMV9NUkNTMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDFfTVJDUzAodmFsKQkJYmZpbl93cml0ZTMyKFNQT1JUMV9NUkNTMCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQxX01SQ1MxKCkJCWJmaW5fcmVhZDMyKFNQT1JUMV9NUkNTMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDFfTVJDUzEodmFsKQkJYmZpbl93cml0ZTMyKFNQT1JUMV9NUkNTMSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQxX01SQ1MyKCkJCWJmaW5fcmVhZDMyKFNQT1JUMV9NUkNTMikKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDFfTVJDUzIodmFsKQkJYmZpbl93cml0ZTMyKFNQT1JUMV9NUkNTMiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQxX01SQ1MzKCkJCWJmaW5fcmVhZDMyKFNQT1JUMV9NUkNTMykKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDFfTVJDUzModmFsKQkJYmZpbl93cml0ZTMyKFNQT1JUMV9NUkNTMywgdmFsKQorCisKKy8qIEV4dGVybmFsIEJ1cyBJbnRlcmZhY2UgVW5pdCAoMHhGRkMwMEEwMCAtIDB4RkZDMDBBRkYpCQkJCQkJCSovCisjZGVmaW5lIGJmaW5fcmVhZF9FQklVX0FNR0NUTCgpCQkJYmZpbl9yZWFkMTYoRUJJVV9BTUdDVEwpCisjZGVmaW5lIGJmaW5fd3JpdGVfRUJJVV9BTUdDVEwodmFsKQkJYmZpbl93cml0ZTE2KEVCSVVfQU1HQ1RMLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FQklVX0FNQkNUTDAoKQkJYmZpbl9yZWFkMzIoRUJJVV9BTUJDVEwwKQorI2RlZmluZSBiZmluX3dyaXRlX0VCSVVfQU1CQ1RMMCh2YWwpCQliZmluX3dyaXRlMzIoRUJJVV9BTUJDVEwwLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FQklVX0FNQkNUTDEoKQkJYmZpbl9yZWFkMzIoRUJJVV9BTUJDVEwxKQorI2RlZmluZSBiZmluX3dyaXRlX0VCSVVfQU1CQ1RMMSh2YWwpCQliZmluX3dyaXRlMzIoRUJJVV9BTUJDVEwxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FQklVX1NER0NUTCgpCQkJYmZpbl9yZWFkMzIoRUJJVV9TREdDVEwpCisjZGVmaW5lIGJmaW5fd3JpdGVfRUJJVV9TREdDVEwodmFsKQkJYmZpbl93cml0ZTMyKEVCSVVfU0RHQ1RMLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FQklVX1NEQkNUTCgpCQkJYmZpbl9yZWFkMTYoRUJJVV9TREJDVEwpCisjZGVmaW5lIGJmaW5fd3JpdGVfRUJJVV9TREJDVEwodmFsKQkJYmZpbl93cml0ZTE2KEVCSVVfU0RCQ1RMLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FQklVX1NEUlJDKCkJCQliZmluX3JlYWQxNihFQklVX1NEUlJDKQorI2RlZmluZSBiZmluX3dyaXRlX0VCSVVfU0RSUkModmFsKQkJYmZpbl93cml0ZTE2KEVCSVVfU0RSUkMsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VCSVVfU0RTVEFUKCkJCQliZmluX3JlYWQxNihFQklVX1NEU1RBVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9FQklVX1NEU1RBVCh2YWwpCQliZmluX3dyaXRlMTYoRUJJVV9TRFNUQVQsIHZhbCkKKworCisvKiBETUEgVHJhZmZpYyBDb250cm9sIFJlZ2lzdGVycwkJCQkJCQkJCQkJCQkqLworI2RlZmluZSBiZmluX3JlYWRfRE1BX1RDX1BFUigpCQkJYmZpbl9yZWFkMTYoRE1BX1RDX1BFUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUFfVENfUEVSKHZhbCkJCWJmaW5fd3JpdGUxNihETUFfVENfUEVSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUFfVENfQ05UKCkJCQliZmluX3JlYWQxNihETUFfVENfQ05UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQV9UQ19DTlQodmFsKQkJYmZpbl93cml0ZTE2KERNQV9UQ19DTlQsIHZhbCkKKworLyogQWx0ZXJuYXRlIGRlcHJlY2F0ZWQgcmVnaXN0ZXIgbmFtZXMgKGJlbG93KSBwcm92aWRlZCBmb3IgYmFja3dhcmRzIGNvZGUgY29tcGF0aWJpbGl0eSAqLworI2RlZmluZSBiZmluX3JlYWRfRE1BX1RDUEVSKCkJCQliZmluX3JlYWQxNihETUFfVENQRVIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BX1RDUEVSKHZhbCkJCWJmaW5fd3JpdGUxNihETUFfVENQRVIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQV9UQ0NOVCgpCQkJYmZpbl9yZWFkMTYoRE1BX1RDQ05UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQV9UQ0NOVCh2YWwpCQliZmluX3dyaXRlMTYoRE1BX1RDQ05ULCB2YWwpCisKKy8qIERNQSBDb250cm9sbGVyCQkJCQkJCQkJCQkJCQkJCQkqLworI2RlZmluZSBiZmluX3JlYWRfRE1BMF9DT05GSUcoKQkJCWJmaW5fcmVhZDE2KERNQTBfQ09ORklHKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTBfQ09ORklHKHZhbCkJCWJmaW5fd3JpdGUxNihETUEwX0NPTkZJRywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMF9ORVhUX0RFU0NfUFRSKCkJCWJmaW5fcmVhZDMyKERNQTBfTkVYVF9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUEwX05FWFRfREVTQ19QVFIodmFsKQliZmluX3dyaXRlMzIoRE1BMF9ORVhUX0RFU0NfUFRSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUEwX1NUQVJUX0FERFIoKQkJYmZpbl9yZWFkMzIoRE1BMF9TVEFSVF9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTBfU1RBUlRfQUREUih2YWwpCQliZmluX3dyaXRlMzIoRE1BMF9TVEFSVF9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUEwX1hfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BMF9YX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTBfWF9DT1VOVCh2YWwpCQliZmluX3dyaXRlMTYoRE1BMF9YX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUEwX1lfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BMF9ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTBfWV9DT1VOVCh2YWwpCQliZmluX3dyaXRlMTYoRE1BMF9ZX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUEwX1hfTU9ESUZZKCkJCWJmaW5fcmVhZDE2KERNQTBfWF9NT0RJRlkpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMF9YX01PRElGWSh2YWwpCQliZmluX3dyaXRlMTYoRE1BMF9YX01PRElGWSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMF9ZX01PRElGWSgpCQliZmluX3JlYWQxNihETUEwX1lfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTBfWV9NT0RJRlkodmFsKQkJYmZpbl93cml0ZTE2KERNQTBfWV9NT0RJRlksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTBfQ1VSUl9ERVNDX1BUUigpCQliZmluX3JlYWQzMihETUEwX0NVUlJfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMF9DVVJSX0RFU0NfUFRSKHZhbCkJYmZpbl93cml0ZTMyKERNQTBfQ1VSUl9ERVNDX1BUUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMF9DVVJSX0FERFIoKQkJYmZpbl9yZWFkMzIoRE1BMF9DVVJSX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMF9DVVJSX0FERFIodmFsKQkJYmZpbl93cml0ZTMyKERNQTBfQ1VSUl9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUEwX0NVUlJfWF9DT1VOVCgpCQliZmluX3JlYWQxNihETUEwX0NVUlJfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUEwX0NVUlJfWF9DT1VOVCh2YWwpCWJmaW5fd3JpdGUxNihETUEwX0NVUlJfWF9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMF9DVVJSX1lfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BMF9DVVJSX1lfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMF9DVVJSX1lfQ09VTlQodmFsKQliZmluX3dyaXRlMTYoRE1BMF9DVVJSX1lfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTBfSVJRX1NUQVRVUygpCQliZmluX3JlYWQxNihETUEwX0lSUV9TVEFUVVMpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMF9JUlFfU1RBVFVTKHZhbCkJCWJmaW5fd3JpdGUxNihETUEwX0lSUV9TVEFUVVMsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTBfUEVSSVBIRVJBTF9NQVAoKQkJYmZpbl9yZWFkMTYoRE1BMF9QRVJJUEhFUkFMX01BUCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUEwX1BFUklQSEVSQUxfTUFQKHZhbCkJYmZpbl93cml0ZTE2KERNQTBfUEVSSVBIRVJBTF9NQVAsIHZhbCkKKworI2RlZmluZSBiZmluX3JlYWRfRE1BMV9DT05GSUcoKQkJCWJmaW5fcmVhZDE2KERNQTFfQ09ORklHKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTFfQ09ORklHKHZhbCkJCWJmaW5fd3JpdGUxNihETUExX0NPTkZJRywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMV9ORVhUX0RFU0NfUFRSKCkJCWJmaW5fcmVhZDMyKERNQTFfTkVYVF9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExX05FWFRfREVTQ19QVFIodmFsKQliZmluX3dyaXRlMzIoRE1BMV9ORVhUX0RFU0NfUFRSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExX1NUQVJUX0FERFIoKQkJYmZpbl9yZWFkMzIoRE1BMV9TVEFSVF9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTFfU1RBUlRfQUREUih2YWwpCQliZmluX3dyaXRlMzIoRE1BMV9TVEFSVF9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExX1hfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BMV9YX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTFfWF9DT1VOVCh2YWwpCQliZmluX3dyaXRlMTYoRE1BMV9YX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExX1lfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BMV9ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTFfWV9DT1VOVCh2YWwpCQliZmluX3dyaXRlMTYoRE1BMV9ZX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExX1hfTU9ESUZZKCkJCWJmaW5fcmVhZDE2KERNQTFfWF9NT0RJRlkpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMV9YX01PRElGWSh2YWwpCQliZmluX3dyaXRlMTYoRE1BMV9YX01PRElGWSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMV9ZX01PRElGWSgpCQliZmluX3JlYWQxNihETUExX1lfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTFfWV9NT0RJRlkodmFsKQkJYmZpbl93cml0ZTE2KERNQTFfWV9NT0RJRlksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTFfQ1VSUl9ERVNDX1BUUigpCQliZmluX3JlYWQzMihETUExX0NVUlJfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMV9DVVJSX0RFU0NfUFRSKHZhbCkJYmZpbl93cml0ZTMyKERNQTFfQ1VSUl9ERVNDX1BUUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMV9DVVJSX0FERFIoKQkJYmZpbl9yZWFkMzIoRE1BMV9DVVJSX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMV9DVVJSX0FERFIodmFsKQkJYmZpbl93cml0ZTMyKERNQTFfQ1VSUl9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExX0NVUlJfWF9DT1VOVCgpCQliZmluX3JlYWQxNihETUExX0NVUlJfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExX0NVUlJfWF9DT1VOVCh2YWwpCWJmaW5fd3JpdGUxNihETUExX0NVUlJfWF9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMV9DVVJSX1lfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BMV9DVVJSX1lfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMV9DVVJSX1lfQ09VTlQodmFsKQliZmluX3dyaXRlMTYoRE1BMV9DVVJSX1lfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTFfSVJRX1NUQVRVUygpCQliZmluX3JlYWQxNihETUExX0lSUV9TVEFUVVMpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMV9JUlFfU1RBVFVTKHZhbCkJCWJmaW5fd3JpdGUxNihETUExX0lSUV9TVEFUVVMsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTFfUEVSSVBIRVJBTF9NQVAoKQkJYmZpbl9yZWFkMTYoRE1BMV9QRVJJUEhFUkFMX01BUCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExX1BFUklQSEVSQUxfTUFQKHZhbCkJYmZpbl93cml0ZTE2KERNQTFfUEVSSVBIRVJBTF9NQVAsIHZhbCkKKworI2RlZmluZSBiZmluX3JlYWRfRE1BMl9DT05GSUcoKQkJCWJmaW5fcmVhZDE2KERNQTJfQ09ORklHKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTJfQ09ORklHKHZhbCkJCWJmaW5fd3JpdGUxNihETUEyX0NPTkZJRywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMl9ORVhUX0RFU0NfUFRSKCkJCWJmaW5fcmVhZDMyKERNQTJfTkVYVF9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUEyX05FWFRfREVTQ19QVFIodmFsKQliZmluX3dyaXRlMzIoRE1BMl9ORVhUX0RFU0NfUFRSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUEyX1NUQVJUX0FERFIoKQkJYmZpbl9yZWFkMzIoRE1BMl9TVEFSVF9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTJfU1RBUlRfQUREUih2YWwpCQliZmluX3dyaXRlMzIoRE1BMl9TVEFSVF9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUEyX1hfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BMl9YX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTJfWF9DT1VOVCh2YWwpCQliZmluX3dyaXRlMTYoRE1BMl9YX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUEyX1lfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BMl9ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTJfWV9DT1VOVCh2YWwpCQliZmluX3dyaXRlMTYoRE1BMl9ZX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUEyX1hfTU9ESUZZKCkJCWJmaW5fcmVhZDE2KERNQTJfWF9NT0RJRlkpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMl9YX01PRElGWSh2YWwpCQliZmluX3dyaXRlMTYoRE1BMl9YX01PRElGWSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMl9ZX01PRElGWSgpCQliZmluX3JlYWQxNihETUEyX1lfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTJfWV9NT0RJRlkodmFsKQkJYmZpbl93cml0ZTE2KERNQTJfWV9NT0RJRlksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTJfQ1VSUl9ERVNDX1BUUigpCQliZmluX3JlYWQzMihETUEyX0NVUlJfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMl9DVVJSX0RFU0NfUFRSKHZhbCkJYmZpbl93cml0ZTMyKERNQTJfQ1VSUl9ERVNDX1BUUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMl9DVVJSX0FERFIoKQkJYmZpbl9yZWFkMzIoRE1BMl9DVVJSX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMl9DVVJSX0FERFIodmFsKQkJYmZpbl93cml0ZTMyKERNQTJfQ1VSUl9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUEyX0NVUlJfWF9DT1VOVCgpCQliZmluX3JlYWQxNihETUEyX0NVUlJfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUEyX0NVUlJfWF9DT1VOVCh2YWwpCWJmaW5fd3JpdGUxNihETUEyX0NVUlJfWF9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMl9DVVJSX1lfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BMl9DVVJSX1lfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMl9DVVJSX1lfQ09VTlQodmFsKQliZmluX3dyaXRlMTYoRE1BMl9DVVJSX1lfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTJfSVJRX1NUQVRVUygpCQliZmluX3JlYWQxNihETUEyX0lSUV9TVEFUVVMpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMl9JUlFfU1RBVFVTKHZhbCkJCWJmaW5fd3JpdGUxNihETUEyX0lSUV9TVEFUVVMsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTJfUEVSSVBIRVJBTF9NQVAoKQkJYmZpbl9yZWFkMTYoRE1BMl9QRVJJUEhFUkFMX01BUCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUEyX1BFUklQSEVSQUxfTUFQKHZhbCkJYmZpbl93cml0ZTE2KERNQTJfUEVSSVBIRVJBTF9NQVAsIHZhbCkKKworI2RlZmluZSBiZmluX3JlYWRfRE1BM19DT05GSUcoKQkJCWJmaW5fcmVhZDE2KERNQTNfQ09ORklHKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTNfQ09ORklHKHZhbCkJCWJmaW5fd3JpdGUxNihETUEzX0NPTkZJRywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BM19ORVhUX0RFU0NfUFRSKCkJCWJmaW5fcmVhZDMyKERNQTNfTkVYVF9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUEzX05FWFRfREVTQ19QVFIodmFsKQliZmluX3dyaXRlMzIoRE1BM19ORVhUX0RFU0NfUFRSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUEzX1NUQVJUX0FERFIoKQkJYmZpbl9yZWFkMzIoRE1BM19TVEFSVF9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTNfU1RBUlRfQUREUih2YWwpCQliZmluX3dyaXRlMzIoRE1BM19TVEFSVF9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUEzX1hfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BM19YX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTNfWF9DT1VOVCh2YWwpCQliZmluX3dyaXRlMTYoRE1BM19YX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUEzX1lfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BM19ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTNfWV9DT1VOVCh2YWwpCQliZmluX3dyaXRlMTYoRE1BM19ZX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUEzX1hfTU9ESUZZKCkJCWJmaW5fcmVhZDE2KERNQTNfWF9NT0RJRlkpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BM19YX01PRElGWSh2YWwpCQliZmluX3dyaXRlMTYoRE1BM19YX01PRElGWSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BM19ZX01PRElGWSgpCQliZmluX3JlYWQxNihETUEzX1lfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTNfWV9NT0RJRlkodmFsKQkJYmZpbl93cml0ZTE2KERNQTNfWV9NT0RJRlksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTNfQ1VSUl9ERVNDX1BUUigpCQliZmluX3JlYWQzMihETUEzX0NVUlJfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BM19DVVJSX0RFU0NfUFRSKHZhbCkJYmZpbl93cml0ZTMyKERNQTNfQ1VSUl9ERVNDX1BUUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BM19DVVJSX0FERFIoKQkJYmZpbl9yZWFkMzIoRE1BM19DVVJSX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BM19DVVJSX0FERFIodmFsKQkJYmZpbl93cml0ZTMyKERNQTNfQ1VSUl9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUEzX0NVUlJfWF9DT1VOVCgpCQliZmluX3JlYWQxNihETUEzX0NVUlJfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUEzX0NVUlJfWF9DT1VOVCh2YWwpCWJmaW5fd3JpdGUxNihETUEzX0NVUlJfWF9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BM19DVVJSX1lfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BM19DVVJSX1lfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BM19DVVJSX1lfQ09VTlQodmFsKQliZmluX3dyaXRlMTYoRE1BM19DVVJSX1lfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTNfSVJRX1NUQVRVUygpCQliZmluX3JlYWQxNihETUEzX0lSUV9TVEFUVVMpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BM19JUlFfU1RBVFVTKHZhbCkJCWJmaW5fd3JpdGUxNihETUEzX0lSUV9TVEFUVVMsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTNfUEVSSVBIRVJBTF9NQVAoKQkJYmZpbl9yZWFkMTYoRE1BM19QRVJJUEhFUkFMX01BUCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUEzX1BFUklQSEVSQUxfTUFQKHZhbCkJYmZpbl93cml0ZTE2KERNQTNfUEVSSVBIRVJBTF9NQVAsIHZhbCkKKworI2RlZmluZSBiZmluX3JlYWRfRE1BNF9DT05GSUcoKQkJCWJmaW5fcmVhZDE2KERNQTRfQ09ORklHKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTRfQ09ORklHKHZhbCkJCWJmaW5fd3JpdGUxNihETUE0X0NPTkZJRywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BNF9ORVhUX0RFU0NfUFRSKCkJCWJmaW5fcmVhZDMyKERNQTRfTkVYVF9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE0X05FWFRfREVTQ19QVFIodmFsKQliZmluX3dyaXRlMzIoRE1BNF9ORVhUX0RFU0NfUFRSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE0X1NUQVJUX0FERFIoKQkJYmZpbl9yZWFkMzIoRE1BNF9TVEFSVF9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTRfU1RBUlRfQUREUih2YWwpCQliZmluX3dyaXRlMzIoRE1BNF9TVEFSVF9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE0X1hfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BNF9YX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTRfWF9DT1VOVCh2YWwpCQliZmluX3dyaXRlMTYoRE1BNF9YX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE0X1lfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BNF9ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTRfWV9DT1VOVCh2YWwpCQliZmluX3dyaXRlMTYoRE1BNF9ZX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE0X1hfTU9ESUZZKCkJCWJmaW5fcmVhZDE2KERNQTRfWF9NT0RJRlkpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BNF9YX01PRElGWSh2YWwpCQliZmluX3dyaXRlMTYoRE1BNF9YX01PRElGWSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BNF9ZX01PRElGWSgpCQliZmluX3JlYWQxNihETUE0X1lfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTRfWV9NT0RJRlkodmFsKQkJYmZpbl93cml0ZTE2KERNQTRfWV9NT0RJRlksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTRfQ1VSUl9ERVNDX1BUUigpCQliZmluX3JlYWQzMihETUE0X0NVUlJfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BNF9DVVJSX0RFU0NfUFRSKHZhbCkJYmZpbl93cml0ZTMyKERNQTRfQ1VSUl9ERVNDX1BUUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BNF9DVVJSX0FERFIoKQkJYmZpbl9yZWFkMzIoRE1BNF9DVVJSX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BNF9DVVJSX0FERFIodmFsKQkJYmZpbl93cml0ZTMyKERNQTRfQ1VSUl9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE0X0NVUlJfWF9DT1VOVCgpCQliZmluX3JlYWQxNihETUE0X0NVUlJfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE0X0NVUlJfWF9DT1VOVCh2YWwpCWJmaW5fd3JpdGUxNihETUE0X0NVUlJfWF9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BNF9DVVJSX1lfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BNF9DVVJSX1lfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BNF9DVVJSX1lfQ09VTlQodmFsKQliZmluX3dyaXRlMTYoRE1BNF9DVVJSX1lfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTRfSVJRX1NUQVRVUygpCQliZmluX3JlYWQxNihETUE0X0lSUV9TVEFUVVMpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BNF9JUlFfU1RBVFVTKHZhbCkJCWJmaW5fd3JpdGUxNihETUE0X0lSUV9TVEFUVVMsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTRfUEVSSVBIRVJBTF9NQVAoKQkJYmZpbl9yZWFkMTYoRE1BNF9QRVJJUEhFUkFMX01BUCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE0X1BFUklQSEVSQUxfTUFQKHZhbCkJYmZpbl93cml0ZTE2KERNQTRfUEVSSVBIRVJBTF9NQVAsIHZhbCkKKworI2RlZmluZSBiZmluX3JlYWRfRE1BNV9DT05GSUcoKQkJCWJmaW5fcmVhZDE2KERNQTVfQ09ORklHKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTVfQ09ORklHKHZhbCkJCWJmaW5fd3JpdGUxNihETUE1X0NPTkZJRywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BNV9ORVhUX0RFU0NfUFRSKCkJCWJmaW5fcmVhZDMyKERNQTVfTkVYVF9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE1X05FWFRfREVTQ19QVFIodmFsKQliZmluX3dyaXRlMzIoRE1BNV9ORVhUX0RFU0NfUFRSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE1X1NUQVJUX0FERFIoKQkJYmZpbl9yZWFkMzIoRE1BNV9TVEFSVF9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTVfU1RBUlRfQUREUih2YWwpCQliZmluX3dyaXRlMzIoRE1BNV9TVEFSVF9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE1X1hfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BNV9YX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTVfWF9DT1VOVCh2YWwpCQliZmluX3dyaXRlMTYoRE1BNV9YX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE1X1lfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BNV9ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTVfWV9DT1VOVCh2YWwpCQliZmluX3dyaXRlMTYoRE1BNV9ZX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE1X1hfTU9ESUZZKCkJCWJmaW5fcmVhZDE2KERNQTVfWF9NT0RJRlkpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BNV9YX01PRElGWSh2YWwpCQliZmluX3dyaXRlMTYoRE1BNV9YX01PRElGWSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BNV9ZX01PRElGWSgpCQliZmluX3JlYWQxNihETUE1X1lfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTVfWV9NT0RJRlkodmFsKQkJYmZpbl93cml0ZTE2KERNQTVfWV9NT0RJRlksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTVfQ1VSUl9ERVNDX1BUUigpCQliZmluX3JlYWQzMihETUE1X0NVUlJfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BNV9DVVJSX0RFU0NfUFRSKHZhbCkJYmZpbl93cml0ZTMyKERNQTVfQ1VSUl9ERVNDX1BUUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BNV9DVVJSX0FERFIoKQkJYmZpbl9yZWFkMzIoRE1BNV9DVVJSX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BNV9DVVJSX0FERFIodmFsKQkJYmZpbl93cml0ZTMyKERNQTVfQ1VSUl9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE1X0NVUlJfWF9DT1VOVCgpCQliZmluX3JlYWQxNihETUE1X0NVUlJfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE1X0NVUlJfWF9DT1VOVCh2YWwpCWJmaW5fd3JpdGUxNihETUE1X0NVUlJfWF9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BNV9DVVJSX1lfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BNV9DVVJSX1lfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BNV9DVVJSX1lfQ09VTlQodmFsKQliZmluX3dyaXRlMTYoRE1BNV9DVVJSX1lfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTVfSVJRX1NUQVRVUygpCQliZmluX3JlYWQxNihETUE1X0lSUV9TVEFUVVMpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BNV9JUlFfU1RBVFVTKHZhbCkJCWJmaW5fd3JpdGUxNihETUE1X0lSUV9TVEFUVVMsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTVfUEVSSVBIRVJBTF9NQVAoKQkJYmZpbl9yZWFkMTYoRE1BNV9QRVJJUEhFUkFMX01BUCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE1X1BFUklQSEVSQUxfTUFQKHZhbCkJYmZpbl93cml0ZTE2KERNQTVfUEVSSVBIRVJBTF9NQVAsIHZhbCkKKworI2RlZmluZSBiZmluX3JlYWRfRE1BNl9DT05GSUcoKQkJCWJmaW5fcmVhZDE2KERNQTZfQ09ORklHKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTZfQ09ORklHKHZhbCkJCWJmaW5fd3JpdGUxNihETUE2X0NPTkZJRywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BNl9ORVhUX0RFU0NfUFRSKCkJCWJmaW5fcmVhZDMyKERNQTZfTkVYVF9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE2X05FWFRfREVTQ19QVFIodmFsKQliZmluX3dyaXRlMzIoRE1BNl9ORVhUX0RFU0NfUFRSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE2X1NUQVJUX0FERFIoKQkJYmZpbl9yZWFkMzIoRE1BNl9TVEFSVF9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTZfU1RBUlRfQUREUih2YWwpCQliZmluX3dyaXRlMzIoRE1BNl9TVEFSVF9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE2X1hfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BNl9YX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTZfWF9DT1VOVCh2YWwpCQliZmluX3dyaXRlMTYoRE1BNl9YX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE2X1lfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BNl9ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTZfWV9DT1VOVCh2YWwpCQliZmluX3dyaXRlMTYoRE1BNl9ZX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE2X1hfTU9ESUZZKCkJCWJmaW5fcmVhZDE2KERNQTZfWF9NT0RJRlkpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BNl9YX01PRElGWSh2YWwpCQliZmluX3dyaXRlMTYoRE1BNl9YX01PRElGWSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BNl9ZX01PRElGWSgpCQliZmluX3JlYWQxNihETUE2X1lfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTZfWV9NT0RJRlkodmFsKQkJYmZpbl93cml0ZTE2KERNQTZfWV9NT0RJRlksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTZfQ1VSUl9ERVNDX1BUUigpCQliZmluX3JlYWQzMihETUE2X0NVUlJfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BNl9DVVJSX0RFU0NfUFRSKHZhbCkJYmZpbl93cml0ZTMyKERNQTZfQ1VSUl9ERVNDX1BUUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BNl9DVVJSX0FERFIoKQkJYmZpbl9yZWFkMzIoRE1BNl9DVVJSX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BNl9DVVJSX0FERFIodmFsKQkJYmZpbl93cml0ZTMyKERNQTZfQ1VSUl9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE2X0NVUlJfWF9DT1VOVCgpCQliZmluX3JlYWQxNihETUE2X0NVUlJfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE2X0NVUlJfWF9DT1VOVCh2YWwpCWJmaW5fd3JpdGUxNihETUE2X0NVUlJfWF9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BNl9DVVJSX1lfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BNl9DVVJSX1lfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BNl9DVVJSX1lfQ09VTlQodmFsKQliZmluX3dyaXRlMTYoRE1BNl9DVVJSX1lfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTZfSVJRX1NUQVRVUygpCQliZmluX3JlYWQxNihETUE2X0lSUV9TVEFUVVMpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BNl9JUlFfU1RBVFVTKHZhbCkJCWJmaW5fd3JpdGUxNihETUE2X0lSUV9TVEFUVVMsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTZfUEVSSVBIRVJBTF9NQVAoKQkJYmZpbl9yZWFkMTYoRE1BNl9QRVJJUEhFUkFMX01BUCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE2X1BFUklQSEVSQUxfTUFQKHZhbCkJYmZpbl93cml0ZTE2KERNQTZfUEVSSVBIRVJBTF9NQVAsIHZhbCkKKworI2RlZmluZSBiZmluX3JlYWRfRE1BN19DT05GSUcoKQkJCWJmaW5fcmVhZDE2KERNQTdfQ09ORklHKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTdfQ09ORklHKHZhbCkJCWJmaW5fd3JpdGUxNihETUE3X0NPTkZJRywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BN19ORVhUX0RFU0NfUFRSKCkJCWJmaW5fcmVhZDMyKERNQTdfTkVYVF9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE3X05FWFRfREVTQ19QVFIodmFsKQliZmluX3dyaXRlMzIoRE1BN19ORVhUX0RFU0NfUFRSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE3X1NUQVJUX0FERFIoKQkJYmZpbl9yZWFkMzIoRE1BN19TVEFSVF9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTdfU1RBUlRfQUREUih2YWwpCQliZmluX3dyaXRlMzIoRE1BN19TVEFSVF9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE3X1hfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BN19YX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTdfWF9DT1VOVCh2YWwpCQliZmluX3dyaXRlMTYoRE1BN19YX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE3X1lfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BN19ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTdfWV9DT1VOVCh2YWwpCQliZmluX3dyaXRlMTYoRE1BN19ZX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE3X1hfTU9ESUZZKCkJCWJmaW5fcmVhZDE2KERNQTdfWF9NT0RJRlkpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BN19YX01PRElGWSh2YWwpCQliZmluX3dyaXRlMTYoRE1BN19YX01PRElGWSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BN19ZX01PRElGWSgpCQliZmluX3JlYWQxNihETUE3X1lfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTdfWV9NT0RJRlkodmFsKQkJYmZpbl93cml0ZTE2KERNQTdfWV9NT0RJRlksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTdfQ1VSUl9ERVNDX1BUUigpCQliZmluX3JlYWQzMihETUE3X0NVUlJfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BN19DVVJSX0RFU0NfUFRSKHZhbCkJYmZpbl93cml0ZTMyKERNQTdfQ1VSUl9ERVNDX1BUUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BN19DVVJSX0FERFIoKQkJYmZpbl9yZWFkMzIoRE1BN19DVVJSX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BN19DVVJSX0FERFIodmFsKQkJYmZpbl93cml0ZTMyKERNQTdfQ1VSUl9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE3X0NVUlJfWF9DT1VOVCgpCQliZmluX3JlYWQxNihETUE3X0NVUlJfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE3X0NVUlJfWF9DT1VOVCh2YWwpCWJmaW5fd3JpdGUxNihETUE3X0NVUlJfWF9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BN19DVVJSX1lfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BN19DVVJSX1lfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BN19DVVJSX1lfQ09VTlQodmFsKQliZmluX3dyaXRlMTYoRE1BN19DVVJSX1lfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTdfSVJRX1NUQVRVUygpCQliZmluX3JlYWQxNihETUE3X0lSUV9TVEFUVVMpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BN19JUlFfU1RBVFVTKHZhbCkJCWJmaW5fd3JpdGUxNihETUE3X0lSUV9TVEFUVVMsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTdfUEVSSVBIRVJBTF9NQVAoKQkJYmZpbl9yZWFkMTYoRE1BN19QRVJJUEhFUkFMX01BUCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE3X1BFUklQSEVSQUxfTUFQKHZhbCkJYmZpbl93cml0ZTE2KERNQTdfUEVSSVBIRVJBTF9NQVAsIHZhbCkKKworI2RlZmluZSBiZmluX3JlYWRfRE1BOF9DT05GSUcoKQkJCWJmaW5fcmVhZDE2KERNQThfQ09ORklHKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQThfQ09ORklHKHZhbCkJCWJmaW5fd3JpdGUxNihETUE4X0NPTkZJRywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BOF9ORVhUX0RFU0NfUFRSKCkJCWJmaW5fcmVhZDMyKERNQThfTkVYVF9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE4X05FWFRfREVTQ19QVFIodmFsKQliZmluX3dyaXRlMzIoRE1BOF9ORVhUX0RFU0NfUFRSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE4X1NUQVJUX0FERFIoKQkJYmZpbl9yZWFkMzIoRE1BOF9TVEFSVF9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQThfU1RBUlRfQUREUih2YWwpCQliZmluX3dyaXRlMzIoRE1BOF9TVEFSVF9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE4X1hfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BOF9YX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQThfWF9DT1VOVCh2YWwpCQliZmluX3dyaXRlMTYoRE1BOF9YX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE4X1lfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BOF9ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQThfWV9DT1VOVCh2YWwpCQliZmluX3dyaXRlMTYoRE1BOF9ZX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE4X1hfTU9ESUZZKCkJCWJmaW5fcmVhZDE2KERNQThfWF9NT0RJRlkpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BOF9YX01PRElGWSh2YWwpCQliZmluX3dyaXRlMTYoRE1BOF9YX01PRElGWSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BOF9ZX01PRElGWSgpCQliZmluX3JlYWQxNihETUE4X1lfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQThfWV9NT0RJRlkodmFsKQkJYmZpbl93cml0ZTE2KERNQThfWV9NT0RJRlksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQThfQ1VSUl9ERVNDX1BUUigpCQliZmluX3JlYWQzMihETUE4X0NVUlJfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BOF9DVVJSX0RFU0NfUFRSKHZhbCkJYmZpbl93cml0ZTMyKERNQThfQ1VSUl9ERVNDX1BUUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BOF9DVVJSX0FERFIoKQkJYmZpbl9yZWFkMzIoRE1BOF9DVVJSX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BOF9DVVJSX0FERFIodmFsKQkJYmZpbl93cml0ZTMyKERNQThfQ1VSUl9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE4X0NVUlJfWF9DT1VOVCgpCQliZmluX3JlYWQxNihETUE4X0NVUlJfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE4X0NVUlJfWF9DT1VOVCh2YWwpCWJmaW5fd3JpdGUxNihETUE4X0NVUlJfWF9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BOF9DVVJSX1lfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BOF9DVVJSX1lfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BOF9DVVJSX1lfQ09VTlQodmFsKQliZmluX3dyaXRlMTYoRE1BOF9DVVJSX1lfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQThfSVJRX1NUQVRVUygpCQliZmluX3JlYWQxNihETUE4X0lSUV9TVEFUVVMpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BOF9JUlFfU1RBVFVTKHZhbCkJCWJmaW5fd3JpdGUxNihETUE4X0lSUV9TVEFUVVMsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQThfUEVSSVBIRVJBTF9NQVAoKQkJYmZpbl9yZWFkMTYoRE1BOF9QRVJJUEhFUkFMX01BUCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE4X1BFUklQSEVSQUxfTUFQKHZhbCkJYmZpbl93cml0ZTE2KERNQThfUEVSSVBIRVJBTF9NQVAsIHZhbCkKKworI2RlZmluZSBiZmluX3JlYWRfRE1BOV9DT05GSUcoKQkJCWJmaW5fcmVhZDE2KERNQTlfQ09ORklHKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTlfQ09ORklHKHZhbCkJCWJmaW5fd3JpdGUxNihETUE5X0NPTkZJRywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BOV9ORVhUX0RFU0NfUFRSKCkJCWJmaW5fcmVhZDMyKERNQTlfTkVYVF9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE5X05FWFRfREVTQ19QVFIodmFsKQliZmluX3dyaXRlMzIoRE1BOV9ORVhUX0RFU0NfUFRSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE5X1NUQVJUX0FERFIoKQkJYmZpbl9yZWFkMzIoRE1BOV9TVEFSVF9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTlfU1RBUlRfQUREUih2YWwpCQliZmluX3dyaXRlMzIoRE1BOV9TVEFSVF9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE5X1hfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BOV9YX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTlfWF9DT1VOVCh2YWwpCQliZmluX3dyaXRlMTYoRE1BOV9YX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE5X1lfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BOV9ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTlfWV9DT1VOVCh2YWwpCQliZmluX3dyaXRlMTYoRE1BOV9ZX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE5X1hfTU9ESUZZKCkJCWJmaW5fcmVhZDE2KERNQTlfWF9NT0RJRlkpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BOV9YX01PRElGWSh2YWwpCQliZmluX3dyaXRlMTYoRE1BOV9YX01PRElGWSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BOV9ZX01PRElGWSgpCQliZmluX3JlYWQxNihETUE5X1lfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTlfWV9NT0RJRlkodmFsKQkJYmZpbl93cml0ZTE2KERNQTlfWV9NT0RJRlksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTlfQ1VSUl9ERVNDX1BUUigpCQliZmluX3JlYWQzMihETUE5X0NVUlJfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BOV9DVVJSX0RFU0NfUFRSKHZhbCkJYmZpbl93cml0ZTMyKERNQTlfQ1VSUl9ERVNDX1BUUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BOV9DVVJSX0FERFIoKQkJYmZpbl9yZWFkMzIoRE1BOV9DVVJSX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BOV9DVVJSX0FERFIodmFsKQkJYmZpbl93cml0ZTMyKERNQTlfQ1VSUl9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE5X0NVUlJfWF9DT1VOVCgpCQliZmluX3JlYWQxNihETUE5X0NVUlJfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE5X0NVUlJfWF9DT1VOVCh2YWwpCWJmaW5fd3JpdGUxNihETUE5X0NVUlJfWF9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BOV9DVVJSX1lfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BOV9DVVJSX1lfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BOV9DVVJSX1lfQ09VTlQodmFsKQliZmluX3dyaXRlMTYoRE1BOV9DVVJSX1lfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTlfSVJRX1NUQVRVUygpCQliZmluX3JlYWQxNihETUE5X0lSUV9TVEFUVVMpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BOV9JUlFfU1RBVFVTKHZhbCkJCWJmaW5fd3JpdGUxNihETUE5X0lSUV9TVEFUVVMsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTlfUEVSSVBIRVJBTF9NQVAoKQkJYmZpbl9yZWFkMTYoRE1BOV9QRVJJUEhFUkFMX01BUCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE5X1BFUklQSEVSQUxfTUFQKHZhbCkJYmZpbl93cml0ZTE2KERNQTlfUEVSSVBIRVJBTF9NQVAsIHZhbCkKKworI2RlZmluZSBiZmluX3JlYWRfRE1BMTBfQ09ORklHKCkJCWJmaW5fcmVhZDE2KERNQTEwX0NPTkZJRykKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExMF9DT05GSUcodmFsKQkJYmZpbl93cml0ZTE2KERNQTEwX0NPTkZJRywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTBfTkVYVF9ERVNDX1BUUigpCQliZmluX3JlYWQzMihETUExMF9ORVhUX0RFU0NfUFRSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTEwX05FWFRfREVTQ19QVFIodmFsKQliZmluX3dyaXRlMzIoRE1BMTBfTkVYVF9ERVNDX1BUUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTBfU1RBUlRfQUREUigpCQliZmluX3JlYWQzMihETUExMF9TVEFSVF9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTEwX1NUQVJUX0FERFIodmFsKQliZmluX3dyaXRlMzIoRE1BMTBfU1RBUlRfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTBfWF9DT1VOVCgpCQliZmluX3JlYWQxNihETUExMF9YX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTEwX1hfQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KERNQTEwX1hfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTEwX1lfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BMTBfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExMF9ZX0NPVU5UKHZhbCkJCWJmaW5fd3JpdGUxNihETUExMF9ZX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExMF9YX01PRElGWSgpCQliZmluX3JlYWQxNihETUExMF9YX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExMF9YX01PRElGWSh2YWwpCQliZmluX3dyaXRlMTYoRE1BMTBfWF9NT0RJRlksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTEwX1lfTU9ESUZZKCkJCWJmaW5fcmVhZDE2KERNQTEwX1lfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTEwX1lfTU9ESUZZKHZhbCkJCWJmaW5fd3JpdGUxNihETUExMF9ZX01PRElGWSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTBfQ1VSUl9ERVNDX1BUUigpCQliZmluX3JlYWQzMihETUExMF9DVVJSX0RFU0NfUFRSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTEwX0NVUlJfREVTQ19QVFIodmFsKQliZmluX3dyaXRlMzIoRE1BMTBfQ1VSUl9ERVNDX1BUUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTBfQ1VSUl9BRERSKCkJCWJmaW5fcmVhZDMyKERNQTEwX0NVUlJfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExMF9DVVJSX0FERFIodmFsKQkJYmZpbl93cml0ZTMyKERNQTEwX0NVUlJfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTBfQ1VSUl9YX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTEwX0NVUlJfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExMF9DVVJSX1hfQ09VTlQodmFsKQliZmluX3dyaXRlMTYoRE1BMTBfQ1VSUl9YX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExMF9DVVJSX1lfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BMTBfQ1VSUl9ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTEwX0NVUlJfWV9DT1VOVCh2YWwpCWJmaW5fd3JpdGUxNihETUExMF9DVVJSX1lfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTEwX0lSUV9TVEFUVVMoKQkJYmZpbl9yZWFkMTYoRE1BMTBfSVJRX1NUQVRVUykKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExMF9JUlFfU1RBVFVTKHZhbCkJYmZpbl93cml0ZTE2KERNQTEwX0lSUV9TVEFUVVMsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTEwX1BFUklQSEVSQUxfTUFQKCkJYmZpbl9yZWFkMTYoRE1BMTBfUEVSSVBIRVJBTF9NQVApCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTBfUEVSSVBIRVJBTF9NQVAodmFsKQliZmluX3dyaXRlMTYoRE1BMTBfUEVSSVBIRVJBTF9NQVAsIHZhbCkKKworI2RlZmluZSBiZmluX3JlYWRfRE1BMTFfQ09ORklHKCkJCWJmaW5fcmVhZDE2KERNQTExX0NPTkZJRykKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExMV9DT05GSUcodmFsKQkJYmZpbl93cml0ZTE2KERNQTExX0NPTkZJRywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTFfTkVYVF9ERVNDX1BUUigpCQliZmluX3JlYWQzMihETUExMV9ORVhUX0RFU0NfUFRSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTExX05FWFRfREVTQ19QVFIodmFsKQliZmluX3dyaXRlMzIoRE1BMTFfTkVYVF9ERVNDX1BUUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTFfU1RBUlRfQUREUigpCQliZmluX3JlYWQzMihETUExMV9TVEFSVF9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTExX1NUQVJUX0FERFIodmFsKQliZmluX3dyaXRlMzIoRE1BMTFfU1RBUlRfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTFfWF9DT1VOVCgpCQliZmluX3JlYWQxNihETUExMV9YX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTExX1hfQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KERNQTExX1hfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTExX1lfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BMTFfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExMV9ZX0NPVU5UKHZhbCkJCWJmaW5fd3JpdGUxNihETUExMV9ZX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExMV9YX01PRElGWSgpCQliZmluX3JlYWQxNihETUExMV9YX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExMV9YX01PRElGWSh2YWwpCQliZmluX3dyaXRlMTYoRE1BMTFfWF9NT0RJRlksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTExX1lfTU9ESUZZKCkJCWJmaW5fcmVhZDE2KERNQTExX1lfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTExX1lfTU9ESUZZKHZhbCkJCWJmaW5fd3JpdGUxNihETUExMV9ZX01PRElGWSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTFfQ1VSUl9ERVNDX1BUUigpCQliZmluX3JlYWQzMihETUExMV9DVVJSX0RFU0NfUFRSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTExX0NVUlJfREVTQ19QVFIodmFsKQliZmluX3dyaXRlMzIoRE1BMTFfQ1VSUl9ERVNDX1BUUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTFfQ1VSUl9BRERSKCkJCWJmaW5fcmVhZDMyKERNQTExX0NVUlJfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExMV9DVVJSX0FERFIodmFsKQkJYmZpbl93cml0ZTMyKERNQTExX0NVUlJfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTFfQ1VSUl9YX0NPVU5UKCkJCWJmaW5fcmVhZDE2KERNQTExX0NVUlJfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExMV9DVVJSX1hfQ09VTlQodmFsKQliZmluX3dyaXRlMTYoRE1BMTFfQ1VSUl9YX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExMV9DVVJSX1lfQ09VTlQoKQkJYmZpbl9yZWFkMTYoRE1BMTFfQ1VSUl9ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTExX0NVUlJfWV9DT1VOVCh2YWwpCWJmaW5fd3JpdGUxNihETUExMV9DVVJSX1lfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTExX0lSUV9TVEFUVVMoKQkJYmZpbl9yZWFkMTYoRE1BMTFfSVJRX1NUQVRVUykKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExMV9JUlFfU1RBVFVTKHZhbCkJYmZpbl93cml0ZTE2KERNQTExX0lSUV9TVEFUVVMsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTExX1BFUklQSEVSQUxfTUFQKCkJYmZpbl9yZWFkMTYoRE1BMTFfUEVSSVBIRVJBTF9NQVApCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTFfUEVSSVBIRVJBTF9NQVAodmFsKQliZmluX3dyaXRlMTYoRE1BMTFfUEVSSVBIRVJBTF9NQVAsIHZhbCkKKworI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMF9DT05GSUcoKQkJYmZpbl9yZWFkMTYoTURNQV9EMF9DT05GSUcpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMF9DT05GSUcodmFsKQkJYmZpbl93cml0ZTE2KE1ETUFfRDBfQ09ORklHLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QwX05FWFRfREVTQ19QVFIoKQliZmluX3JlYWQzMihNRE1BX0QwX05FWFRfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMF9ORVhUX0RFU0NfUFRSKHZhbCkJYmZpbl93cml0ZTMyKE1ETUFfRDBfTkVYVF9ERVNDX1BUUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMF9TVEFSVF9BRERSKCkJCWJmaW5fcmVhZDMyKE1ETUFfRDBfU1RBUlRfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QwX1NUQVJUX0FERFIodmFsKQliZmluX3dyaXRlMzIoTURNQV9EMF9TVEFSVF9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QwX1hfQ09VTlQoKQkJYmZpbl9yZWFkMTYoTURNQV9EMF9YX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDBfWF9DT1VOVCh2YWwpCQliZmluX3dyaXRlMTYoTURNQV9EMF9YX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QwX1lfQ09VTlQoKQkJYmZpbl9yZWFkMTYoTURNQV9EMF9ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDBfWV9DT1VOVCh2YWwpCQliZmluX3dyaXRlMTYoTURNQV9EMF9ZX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QwX1hfTU9ESUZZKCkJCWJmaW5fcmVhZDE2KE1ETUFfRDBfWF9NT0RJRlkpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMF9YX01PRElGWSh2YWwpCWJmaW5fd3JpdGUxNihNRE1BX0QwX1hfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QwX1lfTU9ESUZZKCkJCWJmaW5fcmVhZDE2KE1ETUFfRDBfWV9NT0RJRlkpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMF9ZX01PRElGWSh2YWwpCWJmaW5fd3JpdGUxNihNRE1BX0QwX1lfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QwX0NVUlJfREVTQ19QVFIoKQliZmluX3JlYWQzMihNRE1BX0QwX0NVUlJfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMF9DVVJSX0RFU0NfUFRSKHZhbCkJYmZpbl93cml0ZTMyKE1ETUFfRDBfQ1VSUl9ERVNDX1BUUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMF9DVVJSX0FERFIoKQkJYmZpbl9yZWFkMzIoTURNQV9EMF9DVVJSX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMF9DVVJSX0FERFIodmFsKQliZmluX3dyaXRlMzIoTURNQV9EMF9DVVJSX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDBfQ1VSUl9YX0NPVU5UKCkJYmZpbl9yZWFkMTYoTURNQV9EMF9DVVJSX1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMF9DVVJSX1hfQ09VTlQodmFsKQliZmluX3dyaXRlMTYoTURNQV9EMF9DVVJSX1hfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDBfQ1VSUl9ZX0NPVU5UKCkJYmZpbl9yZWFkMTYoTURNQV9EMF9DVVJSX1lfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMF9DVVJSX1lfQ09VTlQodmFsKQliZmluX3dyaXRlMTYoTURNQV9EMF9DVVJSX1lfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDBfSVJRX1NUQVRVUygpCQliZmluX3JlYWQxNihNRE1BX0QwX0lSUV9TVEFUVVMpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMF9JUlFfU1RBVFVTKHZhbCkJYmZpbl93cml0ZTE2KE1ETUFfRDBfSVJRX1NUQVRVUywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMF9QRVJJUEhFUkFMX01BUCgpCWJmaW5fcmVhZDE2KE1ETUFfRDBfUEVSSVBIRVJBTF9NQVApCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMF9QRVJJUEhFUkFMX01BUCh2YWwpCWJmaW5fd3JpdGUxNihNRE1BX0QwX1BFUklQSEVSQUxfTUFQLCB2YWwpCisKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzBfQ09ORklHKCkJCWJmaW5fcmVhZDE2KE1ETUFfUzBfQ09ORklHKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzBfQ09ORklHKHZhbCkJCWJmaW5fd3JpdGUxNihNRE1BX1MwX0NPTkZJRywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMF9ORVhUX0RFU0NfUFRSKCkJYmZpbl9yZWFkMzIoTURNQV9TMF9ORVhUX0RFU0NfUFRSKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzBfTkVYVF9ERVNDX1BUUih2YWwpCWJmaW5fd3JpdGUzMihNRE1BX1MwX05FWFRfREVTQ19QVFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzBfU1RBUlRfQUREUigpCQliZmluX3JlYWQzMihNRE1BX1MwX1NUQVJUX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMF9TVEFSVF9BRERSKHZhbCkJYmZpbl93cml0ZTMyKE1ETUFfUzBfU1RBUlRfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMF9YX0NPVU5UKCkJCWJmaW5fcmVhZDE2KE1ETUFfUzBfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MwX1hfQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KE1ETUFfUzBfWF9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMF9ZX0NPVU5UKCkJCWJmaW5fcmVhZDE2KE1ETUFfUzBfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MwX1lfQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KE1ETUFfUzBfWV9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMF9YX01PRElGWSgpCQliZmluX3JlYWQxNihNRE1BX1MwX1hfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzBfWF9NT0RJRlkodmFsKQliZmluX3dyaXRlMTYoTURNQV9TMF9YX01PRElGWSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMF9ZX01PRElGWSgpCQliZmluX3JlYWQxNihNRE1BX1MwX1lfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzBfWV9NT0RJRlkodmFsKQliZmluX3dyaXRlMTYoTURNQV9TMF9ZX01PRElGWSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMF9DVVJSX0RFU0NfUFRSKCkJYmZpbl9yZWFkMzIoTURNQV9TMF9DVVJSX0RFU0NfUFRSKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzBfQ1VSUl9ERVNDX1BUUih2YWwpCWJmaW5fd3JpdGUzMihNRE1BX1MwX0NVUlJfREVTQ19QVFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzBfQ1VSUl9BRERSKCkJCWJmaW5fcmVhZDMyKE1ETUFfUzBfQ1VSUl9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzBfQ1VSUl9BRERSKHZhbCkJYmZpbl93cml0ZTMyKE1ETUFfUzBfQ1VSUl9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MwX0NVUlJfWF9DT1VOVCgpCWJmaW5fcmVhZDE2KE1ETUFfUzBfQ1VSUl9YX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzBfQ1VSUl9YX0NPVU5UKHZhbCkJYmZpbl93cml0ZTE2KE1ETUFfUzBfQ1VSUl9YX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MwX0NVUlJfWV9DT1VOVCgpCWJmaW5fcmVhZDE2KE1ETUFfUzBfQ1VSUl9ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzBfQ1VSUl9ZX0NPVU5UKHZhbCkJYmZpbl93cml0ZTE2KE1ETUFfUzBfQ1VSUl9ZX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MwX0lSUV9TVEFUVVMoKQkJYmZpbl9yZWFkMTYoTURNQV9TMF9JUlFfU1RBVFVTKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzBfSVJRX1NUQVRVUyh2YWwpCWJmaW5fd3JpdGUxNihNRE1BX1MwX0lSUV9TVEFUVVMsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzBfUEVSSVBIRVJBTF9NQVAoKQliZmluX3JlYWQxNihNRE1BX1MwX1BFUklQSEVSQUxfTUFQKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzBfUEVSSVBIRVJBTF9NQVAodmFsKQliZmluX3dyaXRlMTYoTURNQV9TMF9QRVJJUEhFUkFMX01BUCwgdmFsKQorCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QxX0NPTkZJRygpCQliZmluX3JlYWQxNihNRE1BX0QxX0NPTkZJRykKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QxX0NPTkZJRyh2YWwpCQliZmluX3dyaXRlMTYoTURNQV9EMV9DT05GSUcsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDFfTkVYVF9ERVNDX1BUUigpCWJmaW5fcmVhZDMyKE1ETUFfRDFfTkVYVF9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QxX05FWFRfREVTQ19QVFIodmFsKQliZmluX3dyaXRlMzIoTURNQV9EMV9ORVhUX0RFU0NfUFRSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QxX1NUQVJUX0FERFIoKQkJYmZpbl9yZWFkMzIoTURNQV9EMV9TVEFSVF9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDFfU1RBUlRfQUREUih2YWwpCWJmaW5fd3JpdGUzMihNRE1BX0QxX1NUQVJUX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDFfWF9DT1VOVCgpCQliZmluX3JlYWQxNihNRE1BX0QxX1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMV9YX0NPVU5UKHZhbCkJCWJmaW5fd3JpdGUxNihNRE1BX0QxX1hfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDFfWV9DT1VOVCgpCQliZmluX3JlYWQxNihNRE1BX0QxX1lfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMV9ZX0NPVU5UKHZhbCkJCWJmaW5fd3JpdGUxNihNRE1BX0QxX1lfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDFfWF9NT0RJRlkoKQkJYmZpbl9yZWFkMTYoTURNQV9EMV9YX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QxX1hfTU9ESUZZKHZhbCkJYmZpbl93cml0ZTE2KE1ETUFfRDFfWF9NT0RJRlksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDFfWV9NT0RJRlkoKQkJYmZpbl9yZWFkMTYoTURNQV9EMV9ZX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QxX1lfTU9ESUZZKHZhbCkJYmZpbl93cml0ZTE2KE1ETUFfRDFfWV9NT0RJRlksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfRDFfQ1VSUl9ERVNDX1BUUigpCWJmaW5fcmVhZDMyKE1ETUFfRDFfQ1VSUl9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QxX0NVUlJfREVTQ19QVFIodmFsKQliZmluX3dyaXRlMzIoTURNQV9EMV9DVVJSX0RFU0NfUFRSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QxX0NVUlJfQUREUigpCQliZmluX3JlYWQzMihNRE1BX0QxX0NVUlJfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QxX0NVUlJfQUREUih2YWwpCWJmaW5fd3JpdGUzMihNRE1BX0QxX0NVUlJfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMV9DVVJSX1hfQ09VTlQoKQliZmluX3JlYWQxNihNRE1BX0QxX0NVUlJfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QxX0NVUlJfWF9DT1VOVCh2YWwpCWJmaW5fd3JpdGUxNihNRE1BX0QxX0NVUlJfWF9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMV9DVVJSX1lfQ09VTlQoKQliZmluX3JlYWQxNihNRE1BX0QxX0NVUlJfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QxX0NVUlJfWV9DT1VOVCh2YWwpCWJmaW5fd3JpdGUxNihNRE1BX0QxX0NVUlJfWV9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMV9JUlFfU1RBVFVTKCkJCWJmaW5fcmVhZDE2KE1ETUFfRDFfSVJRX1NUQVRVUykKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QxX0lSUV9TVEFUVVModmFsKQliZmluX3dyaXRlMTYoTURNQV9EMV9JUlFfU1RBVFVTLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX0QxX1BFUklQSEVSQUxfTUFQKCkJYmZpbl9yZWFkMTYoTURNQV9EMV9QRVJJUEhFUkFMX01BUCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QxX1BFUklQSEVSQUxfTUFQKHZhbCkJYmZpbl93cml0ZTE2KE1ETUFfRDFfUEVSSVBIRVJBTF9NQVAsIHZhbCkKKworI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMV9DT05GSUcoKQkJYmZpbl9yZWFkMTYoTURNQV9TMV9DT05GSUcpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMV9DT05GSUcodmFsKQkJYmZpbl93cml0ZTE2KE1ETUFfUzFfQ09ORklHLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MxX05FWFRfREVTQ19QVFIoKQliZmluX3JlYWQzMihNRE1BX1MxX05FWFRfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMV9ORVhUX0RFU0NfUFRSKHZhbCkJYmZpbl93cml0ZTMyKE1ETUFfUzFfTkVYVF9ERVNDX1BUUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMV9TVEFSVF9BRERSKCkJCWJmaW5fcmVhZDMyKE1ETUFfUzFfU1RBUlRfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MxX1NUQVJUX0FERFIodmFsKQliZmluX3dyaXRlMzIoTURNQV9TMV9TVEFSVF9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MxX1hfQ09VTlQoKQkJYmZpbl9yZWFkMTYoTURNQV9TMV9YX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzFfWF9DT1VOVCh2YWwpCQliZmluX3dyaXRlMTYoTURNQV9TMV9YX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MxX1lfQ09VTlQoKQkJYmZpbl9yZWFkMTYoTURNQV9TMV9ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzFfWV9DT1VOVCh2YWwpCQliZmluX3dyaXRlMTYoTURNQV9TMV9ZX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MxX1hfTU9ESUZZKCkJCWJmaW5fcmVhZDE2KE1ETUFfUzFfWF9NT0RJRlkpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMV9YX01PRElGWSh2YWwpCWJmaW5fd3JpdGUxNihNRE1BX1MxX1hfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MxX1lfTU9ESUZZKCkJCWJmaW5fcmVhZDE2KE1ETUFfUzFfWV9NT0RJRlkpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMV9ZX01PRElGWSh2YWwpCWJmaW5fd3JpdGUxNihNRE1BX1MxX1lfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MxX0NVUlJfREVTQ19QVFIoKQliZmluX3JlYWQzMihNRE1BX1MxX0NVUlJfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMV9DVVJSX0RFU0NfUFRSKHZhbCkJYmZpbl93cml0ZTMyKE1ETUFfUzFfQ1VSUl9ERVNDX1BUUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMV9DVVJSX0FERFIoKQkJYmZpbl9yZWFkMzIoTURNQV9TMV9DVVJSX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMV9DVVJSX0FERFIodmFsKQliZmluX3dyaXRlMzIoTURNQV9TMV9DVVJSX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzFfQ1VSUl9YX0NPVU5UKCkJYmZpbl9yZWFkMTYoTURNQV9TMV9DVVJSX1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMV9DVVJSX1hfQ09VTlQodmFsKQliZmluX3dyaXRlMTYoTURNQV9TMV9DVVJSX1hfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzFfQ1VSUl9ZX0NPVU5UKCkJYmZpbl9yZWFkMTYoTURNQV9TMV9DVVJSX1lfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMV9DVVJSX1lfQ09VTlQodmFsKQliZmluX3dyaXRlMTYoTURNQV9TMV9DVVJSX1lfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUFfUzFfSVJRX1NUQVRVUygpCQliZmluX3JlYWQxNihNRE1BX1MxX0lSUV9TVEFUVVMpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMV9JUlFfU1RBVFVTKHZhbCkJYmZpbl93cml0ZTE2KE1ETUFfUzFfSVJRX1NUQVRVUywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQV9TMV9QRVJJUEhFUkFMX01BUCgpCWJmaW5fcmVhZDE2KE1ETUFfUzFfUEVSSVBIRVJBTF9NQVApCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMV9QRVJJUEhFUkFMX01BUCh2YWwpCWJmaW5fd3JpdGUxNihNRE1BX1MxX1BFUklQSEVSQUxfTUFQLCB2YWwpCisKKworLyogUGFyYWxsZWwgUGVyaXBoZXJhbCBJbnRlcmZhY2UgKDB4RkZDMDEwMDAgLSAweEZGQzAxMEZGKQkJCQkJCQkqLworI2RlZmluZSBiZmluX3JlYWRfUFBJX0NPTlRST0woKQkJCWJmaW5fcmVhZDE2KFBQSV9DT05UUk9MKQorI2RlZmluZSBiZmluX3dyaXRlX1BQSV9DT05UUk9MKHZhbCkJCWJmaW5fd3JpdGUxNihQUElfQ09OVFJPTCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUFBJX1NUQVRVUygpCQkJYmZpbl9yZWFkMTYoUFBJX1NUQVRVUykKKyNkZWZpbmUgYmZpbl93cml0ZV9QUElfU1RBVFVTKHZhbCkJCWJmaW5fd3JpdGUxNihQUElfU1RBVFVTLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QUElfREVMQVkoKQkJCWJmaW5fcmVhZDE2KFBQSV9ERUxBWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9QUElfREVMQVkodmFsKQkJYmZpbl93cml0ZTE2KFBQSV9ERUxBWSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUFBJX0NPVU5UKCkJCQliZmluX3JlYWQxNihQUElfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfUFBJX0NPVU5UKHZhbCkJCWJmaW5fd3JpdGUxNihQUElfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BQSV9GUkFNRSgpCQkJYmZpbl9yZWFkMTYoUFBJX0ZSQU1FKQorI2RlZmluZSBiZmluX3dyaXRlX1BQSV9GUkFNRSh2YWwpCQliZmluX3dyaXRlMTYoUFBJX0ZSQU1FLCB2YWwpCisKKworLyogVHdvLVdpcmUgSW50ZXJmYWNlCQkoMHhGRkMwMTQwMCAtIDB4RkZDMDE0RkYpCQkJCQkJCQkqLworCisvKiBHZW5lcmFsIFB1cnBvc2UgSS9PIFBvcnQgRyAoMHhGRkMwMTUwMCAtIDB4RkZDMDE1RkYpCQkJCQkJCQkqLworI2RlZmluZSBiZmluX3JlYWRfUE9SVEdJTygpCQkJYmZpbl9yZWFkMTYoUE9SVEdJTykKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JUR0lPKHZhbCkJCQliZmluX3dyaXRlMTYoUE9SVEdJTywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEdJT19DTEVBUigpCQliZmluX3JlYWQxNihQT1JUR0lPX0NMRUFSKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRHSU9fQ0xFQVIodmFsKQkJYmZpbl93cml0ZTE2KFBPUlRHSU9fQ0xFQVIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRHSU9fU0VUKCkJCQliZmluX3JlYWQxNihQT1JUR0lPX1NFVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JUR0lPX1NFVCh2YWwpCQliZmluX3dyaXRlMTYoUE9SVEdJT19TRVQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRHSU9fVE9HR0xFKCkJCWJmaW5fcmVhZDE2KFBPUlRHSU9fVE9HR0xFKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRHSU9fVE9HR0xFKHZhbCkJCWJmaW5fd3JpdGUxNihQT1JUR0lPX1RPR0dMRSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEdJT19NQVNLQSgpCQliZmluX3JlYWQxNihQT1JUR0lPX01BU0tBKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRHSU9fTUFTS0EodmFsKQkJYmZpbl93cml0ZTE2KFBPUlRHSU9fTUFTS0EsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRHSU9fTUFTS0FfQ0xFQVIoKQkJYmZpbl9yZWFkMTYoUE9SVEdJT19NQVNLQV9DTEVBUikKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JUR0lPX01BU0tBX0NMRUFSKHZhbCkJYmZpbl93cml0ZTE2KFBPUlRHSU9fTUFTS0FfQ0xFQVIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRHSU9fTUFTS0FfU0VUKCkJCWJmaW5fcmVhZDE2KFBPUlRHSU9fTUFTS0FfU0VUKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRHSU9fTUFTS0FfU0VUKHZhbCkJYmZpbl93cml0ZTE2KFBPUlRHSU9fTUFTS0FfU0VULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JUR0lPX01BU0tBX1RPR0dMRSgpCWJmaW5fcmVhZDE2KFBPUlRHSU9fTUFTS0FfVE9HR0xFKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRHSU9fTUFTS0FfVE9HR0xFKHZhbCkJYmZpbl93cml0ZTE2KFBPUlRHSU9fTUFTS0FfVE9HR0xFLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JUR0lPX01BU0tCKCkJCWJmaW5fcmVhZDE2KFBPUlRHSU9fTUFTS0IpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEdJT19NQVNLQih2YWwpCQliZmluX3dyaXRlMTYoUE9SVEdJT19NQVNLQiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEdJT19NQVNLQl9DTEVBUigpCQliZmluX3JlYWQxNihQT1JUR0lPX01BU0tCX0NMRUFSKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRHSU9fTUFTS0JfQ0xFQVIodmFsKQliZmluX3dyaXRlMTYoUE9SVEdJT19NQVNLQl9DTEVBUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEdJT19NQVNLQl9TRVQoKQkJYmZpbl9yZWFkMTYoUE9SVEdJT19NQVNLQl9TRVQpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEdJT19NQVNLQl9TRVQodmFsKQliZmluX3dyaXRlMTYoUE9SVEdJT19NQVNLQl9TRVQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRHSU9fTUFTS0JfVE9HR0xFKCkJYmZpbl9yZWFkMTYoUE9SVEdJT19NQVNLQl9UT0dHTEUpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEdJT19NQVNLQl9UT0dHTEUodmFsKQliZmluX3dyaXRlMTYoUE9SVEdJT19NQVNLQl9UT0dHTEUsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRHSU9fRElSKCkJCQliZmluX3JlYWQxNihQT1JUR0lPX0RJUikKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JUR0lPX0RJUih2YWwpCQliZmluX3dyaXRlMTYoUE9SVEdJT19ESVIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRHSU9fUE9MQVIoKQkJYmZpbl9yZWFkMTYoUE9SVEdJT19QT0xBUikKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JUR0lPX1BPTEFSKHZhbCkJCWJmaW5fd3JpdGUxNihQT1JUR0lPX1BPTEFSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JUR0lPX0VER0UoKQkJYmZpbl9yZWFkMTYoUE9SVEdJT19FREdFKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRHSU9fRURHRSh2YWwpCQliZmluX3dyaXRlMTYoUE9SVEdJT19FREdFLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JUR0lPX0JPVEgoKQkJYmZpbl9yZWFkMTYoUE9SVEdJT19CT1RIKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRHSU9fQk9USCh2YWwpCQliZmluX3dyaXRlMTYoUE9SVEdJT19CT1RILCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JUR0lPX0lORU4oKQkJYmZpbl9yZWFkMTYoUE9SVEdJT19JTkVOKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRHSU9fSU5FTih2YWwpCQliZmluX3dyaXRlMTYoUE9SVEdJT19JTkVOLCB2YWwpCisKKworLyogR2VuZXJhbCBQdXJwb3NlIEkvTyBQb3J0IEggKDB4RkZDMDE3MDAgLSAweEZGQzAxN0ZGKQkJCQkJCQkJKi8KKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRISU8oKQkJCWJmaW5fcmVhZDE2KFBPUlRISU8pCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEhJTyh2YWwpCQkJYmZpbl93cml0ZTE2KFBPUlRISU8sIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRISU9fQ0xFQVIoKQkJYmZpbl9yZWFkMTYoUE9SVEhJT19DTEVBUikKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JUSElPX0NMRUFSKHZhbCkJCWJmaW5fd3JpdGUxNihQT1JUSElPX0NMRUFSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JUSElPX1NFVCgpCQkJYmZpbl9yZWFkMTYoUE9SVEhJT19TRVQpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEhJT19TRVQodmFsKQkJYmZpbl93cml0ZTE2KFBPUlRISU9fU0VULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JUSElPX1RPR0dMRSgpCQliZmluX3JlYWQxNihQT1JUSElPX1RPR0dMRSkKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JUSElPX1RPR0dMRSh2YWwpCQliZmluX3dyaXRlMTYoUE9SVEhJT19UT0dHTEUsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRISU9fTUFTS0EoKQkJYmZpbl9yZWFkMTYoUE9SVEhJT19NQVNLQSkKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JUSElPX01BU0tBKHZhbCkJCWJmaW5fd3JpdGUxNihQT1JUSElPX01BU0tBLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JUSElPX01BU0tBX0NMRUFSKCkJCWJmaW5fcmVhZDE2KFBPUlRISU9fTUFTS0FfQ0xFQVIpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEhJT19NQVNLQV9DTEVBUih2YWwpCWJmaW5fd3JpdGUxNihQT1JUSElPX01BU0tBX0NMRUFSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JUSElPX01BU0tBX1NFVCgpCQliZmluX3JlYWQxNihQT1JUSElPX01BU0tBX1NFVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JUSElPX01BU0tBX1NFVCh2YWwpCWJmaW5fd3JpdGUxNihQT1JUSElPX01BU0tBX1NFVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEhJT19NQVNLQV9UT0dHTEUoKQliZmluX3JlYWQxNihQT1JUSElPX01BU0tBX1RPR0dMRSkKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JUSElPX01BU0tBX1RPR0dMRSh2YWwpCWJmaW5fd3JpdGUxNihQT1JUSElPX01BU0tBX1RPR0dMRSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEhJT19NQVNLQigpCQliZmluX3JlYWQxNihQT1JUSElPX01BU0tCKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRISU9fTUFTS0IodmFsKQkJYmZpbl93cml0ZTE2KFBPUlRISU9fTUFTS0IsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRISU9fTUFTS0JfQ0xFQVIoKQkJYmZpbl9yZWFkMTYoUE9SVEhJT19NQVNLQl9DTEVBUikKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JUSElPX01BU0tCX0NMRUFSKHZhbCkJYmZpbl93cml0ZTE2KFBPUlRISU9fTUFTS0JfQ0xFQVIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRISU9fTUFTS0JfU0VUKCkJCWJmaW5fcmVhZDE2KFBPUlRISU9fTUFTS0JfU0VUKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRISU9fTUFTS0JfU0VUKHZhbCkJYmZpbl93cml0ZTE2KFBPUlRISU9fTUFTS0JfU0VULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JUSElPX01BU0tCX1RPR0dMRSgpCWJmaW5fcmVhZDE2KFBPUlRISU9fTUFTS0JfVE9HR0xFKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRISU9fTUFTS0JfVE9HR0xFKHZhbCkJYmZpbl93cml0ZTE2KFBPUlRISU9fTUFTS0JfVE9HR0xFLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JUSElPX0RJUigpCQkJYmZpbl9yZWFkMTYoUE9SVEhJT19ESVIpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEhJT19ESVIodmFsKQkJYmZpbl93cml0ZTE2KFBPUlRISU9fRElSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JUSElPX1BPTEFSKCkJCWJmaW5fcmVhZDE2KFBPUlRISU9fUE9MQVIpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEhJT19QT0xBUih2YWwpCQliZmluX3dyaXRlMTYoUE9SVEhJT19QT0xBUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEhJT19FREdFKCkJCWJmaW5fcmVhZDE2KFBPUlRISU9fRURHRSkKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JUSElPX0VER0UodmFsKQkJYmZpbl93cml0ZTE2KFBPUlRISU9fRURHRSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEhJT19CT1RIKCkJCWJmaW5fcmVhZDE2KFBPUlRISU9fQk9USCkKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JUSElPX0JPVEgodmFsKQkJYmZpbl93cml0ZTE2KFBPUlRISU9fQk9USCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEhJT19JTkVOKCkJCWJmaW5fcmVhZDE2KFBPUlRISU9fSU5FTikKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JUSElPX0lORU4odmFsKQkJYmZpbl93cml0ZTE2KFBPUlRISU9fSU5FTiwgdmFsKQorCisKKy8qIFVBUlQxIENvbnRyb2xsZXIJCSgweEZGQzAyMDAwIC0gMHhGRkMwMjBGRikJCQkJCQkJCSovCisjZGVmaW5lIGJmaW5fcmVhZF9VQVJUMV9USFIoKQkJCWJmaW5fcmVhZDE2KFVBUlQxX1RIUikKKyNkZWZpbmUgYmZpbl93cml0ZV9VQVJUMV9USFIodmFsKQkJYmZpbl93cml0ZTE2KFVBUlQxX1RIUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVUFSVDFfUkJSKCkJCQliZmluX3JlYWQxNihVQVJUMV9SQlIpCisjZGVmaW5lIGJmaW5fd3JpdGVfVUFSVDFfUkJSKHZhbCkJCWJmaW5fd3JpdGUxNihVQVJUMV9SQlIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1VBUlQxX0RMTCgpCQkJYmZpbl9yZWFkMTYoVUFSVDFfRExMKQorI2RlZmluZSBiZmluX3dyaXRlX1VBUlQxX0RMTCh2YWwpCQliZmluX3dyaXRlMTYoVUFSVDFfRExMLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9VQVJUMV9JRVIoKQkJCWJmaW5fcmVhZDE2KFVBUlQxX0lFUikKKyNkZWZpbmUgYmZpbl93cml0ZV9VQVJUMV9JRVIodmFsKQkJYmZpbl93cml0ZTE2KFVBUlQxX0lFUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVUFSVDFfRExIKCkJCQliZmluX3JlYWQxNihVQVJUMV9ETEgpCisjZGVmaW5lIGJmaW5fd3JpdGVfVUFSVDFfRExIKHZhbCkJCWJmaW5fd3JpdGUxNihVQVJUMV9ETEgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1VBUlQxX0lJUigpCQkJYmZpbl9yZWFkMTYoVUFSVDFfSUlSKQorI2RlZmluZSBiZmluX3dyaXRlX1VBUlQxX0lJUih2YWwpCQliZmluX3dyaXRlMTYoVUFSVDFfSUlSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9VQVJUMV9MQ1IoKQkJCWJmaW5fcmVhZDE2KFVBUlQxX0xDUikKKyNkZWZpbmUgYmZpbl93cml0ZV9VQVJUMV9MQ1IodmFsKQkJYmZpbl93cml0ZTE2KFVBUlQxX0xDUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVUFSVDFfTUNSKCkJCQliZmluX3JlYWQxNihVQVJUMV9NQ1IpCisjZGVmaW5lIGJmaW5fd3JpdGVfVUFSVDFfTUNSKHZhbCkJCWJmaW5fd3JpdGUxNihVQVJUMV9NQ1IsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1VBUlQxX0xTUigpCQkJYmZpbl9yZWFkMTYoVUFSVDFfTFNSKQorI2RlZmluZSBiZmluX3dyaXRlX1VBUlQxX0xTUih2YWwpCQliZmluX3dyaXRlMTYoVUFSVDFfTFNSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9VQVJUMV9NU1IoKQkJCWJmaW5fcmVhZDE2KFVBUlQxX01TUikKKyNkZWZpbmUgYmZpbl93cml0ZV9VQVJUMV9NU1IodmFsKQkJYmZpbl93cml0ZTE2KFVBUlQxX01TUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVUFSVDFfU0NSKCkJCQliZmluX3JlYWQxNihVQVJUMV9TQ1IpCisjZGVmaW5lIGJmaW5fd3JpdGVfVUFSVDFfU0NSKHZhbCkJCWJmaW5fd3JpdGUxNihVQVJUMV9TQ1IsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1VBUlQxX0dDVEwoKQkJCWJmaW5fcmVhZDE2KFVBUlQxX0dDVEwpCisjZGVmaW5lIGJmaW5fd3JpdGVfVUFSVDFfR0NUTCh2YWwpCQliZmluX3dyaXRlMTYoVUFSVDFfR0NUTCwgdmFsKQorCisvKiBPbWl0IENBTiByZWdpc3RlciBzZXRzIGZyb20gdGhlIGNkZWZCRjUzNC5oIChDQU4gaXMgbm90IGluIHRoZSBBRFNQLUJGNTF4IHByb2Nlc3NvcikgKi8KKworLyogUGluIENvbnRyb2wgUmVnaXN0ZXJzCSgweEZGQzAzMjAwIC0gMHhGRkMwMzJGRikJCQkJCQkJCSovCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JURl9GRVIoKQkJCWJmaW5fcmVhZDE2KFBPUlRGX0ZFUikKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JURl9GRVIodmFsKQkJYmZpbl93cml0ZTE2KFBPUlRGX0ZFUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEdfRkVSKCkJCQliZmluX3JlYWQxNihQT1JUR19GRVIpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEdfRkVSKHZhbCkJCWJmaW5fd3JpdGUxNihQT1JUR19GRVIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRIX0ZFUigpCQkJYmZpbl9yZWFkMTYoUE9SVEhfRkVSKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRIX0ZFUih2YWwpCQliZmluX3dyaXRlMTYoUE9SVEhfRkVSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JUX01VWCgpCQkJYmZpbl9yZWFkMTYoUE9SVF9NVVgpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVF9NVVgodmFsKQkJYmZpbl93cml0ZTE2KFBPUlRfTVVYLCB2YWwpCisKKworLyogSGFuZHNoYWtlIE1ETUEgUmVnaXN0ZXJzCSgweEZGQzAzMzAwIC0gMHhGRkMwMzNGRikJCQkJCQkJCSovCisjZGVmaW5lIGJmaW5fcmVhZF9ITURNQTBfQ09OVFJPTCgpCQliZmluX3JlYWQxNihITURNQTBfQ09OVFJPTCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ITURNQTBfQ09OVFJPTCh2YWwpCQliZmluX3dyaXRlMTYoSE1ETUEwX0NPTlRST0wsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0hNRE1BMF9FQ0lOSVQoKQkJYmZpbl9yZWFkMTYoSE1ETUEwX0VDSU5JVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ITURNQTBfRUNJTklUKHZhbCkJCWJmaW5fd3JpdGUxNihITURNQTBfRUNJTklULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ITURNQTBfQkNJTklUKCkJCWJmaW5fcmVhZDE2KEhNRE1BMF9CQ0lOSVQpCisjZGVmaW5lIGJmaW5fd3JpdGVfSE1ETUEwX0JDSU5JVCh2YWwpCQliZmluX3dyaXRlMTYoSE1ETUEwX0JDSU5JVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfSE1ETUEwX0VDVVJHRU5UKCkJCWJmaW5fcmVhZDE2KEhNRE1BMF9FQ1VSR0VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ITURNQTBfRUNVUkdFTlQodmFsKQkJYmZpbl93cml0ZTE2KEhNRE1BMF9FQ1VSR0VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfSE1ETUEwX0VDT1ZFUkZMT1coKQkJYmZpbl9yZWFkMTYoSE1ETUEwX0VDT1ZFUkZMT1cpCisjZGVmaW5lIGJmaW5fd3JpdGVfSE1ETUEwX0VDT1ZFUkZMT1codmFsKQliZmluX3dyaXRlMTYoSE1ETUEwX0VDT1ZFUkZMT1csIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0hNRE1BMF9FQ09VTlQoKQkJYmZpbl9yZWFkMTYoSE1ETUEwX0VDT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ITURNQTBfRUNPVU5UKHZhbCkJCWJmaW5fd3JpdGUxNihITURNQTBfRUNPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ITURNQTBfQkNPVU5UKCkJCWJmaW5fcmVhZDE2KEhNRE1BMF9CQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfSE1ETUEwX0JDT1VOVCh2YWwpCQliZmluX3dyaXRlMTYoSE1ETUEwX0JDT1VOVCwgdmFsKQorCisjZGVmaW5lIGJmaW5fcmVhZF9ITURNQTFfQ09OVFJPTCgpCQliZmluX3JlYWQxNihITURNQTFfQ09OVFJPTCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ITURNQTFfQ09OVFJPTCh2YWwpCQliZmluX3dyaXRlMTYoSE1ETUExX0NPTlRST0wsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0hNRE1BMV9FQ0lOSVQoKQkJYmZpbl9yZWFkMTYoSE1ETUExX0VDSU5JVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ITURNQTFfRUNJTklUKHZhbCkJCWJmaW5fd3JpdGUxNihITURNQTFfRUNJTklULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ITURNQTFfQkNJTklUKCkJCWJmaW5fcmVhZDE2KEhNRE1BMV9CQ0lOSVQpCisjZGVmaW5lIGJmaW5fd3JpdGVfSE1ETUExX0JDSU5JVCh2YWwpCQliZmluX3dyaXRlMTYoSE1ETUExX0JDSU5JVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfSE1ETUExX0VDVVJHRU5UKCkJCWJmaW5fcmVhZDE2KEhNRE1BMV9FQ1VSR0VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ITURNQTFfRUNVUkdFTlQodmFsKQkJYmZpbl93cml0ZTE2KEhNRE1BMV9FQ1VSR0VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfSE1ETUExX0VDT1ZFUkZMT1coKQkJYmZpbl9yZWFkMTYoSE1ETUExX0VDT1ZFUkZMT1cpCisjZGVmaW5lIGJmaW5fd3JpdGVfSE1ETUExX0VDT1ZFUkZMT1codmFsKQliZmluX3dyaXRlMTYoSE1ETUExX0VDT1ZFUkZMT1csIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0hNRE1BMV9FQ09VTlQoKQkJYmZpbl9yZWFkMTYoSE1ETUExX0VDT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ITURNQTFfRUNPVU5UKHZhbCkJCWJmaW5fd3JpdGUxNihITURNQTFfRUNPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ITURNQTFfQkNPVU5UKCkJCWJmaW5fcmVhZDE2KEhNRE1BMV9CQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfSE1ETUExX0JDT1VOVCh2YWwpCQliZmluX3dyaXRlMTYoSE1ETUExX0JDT1VOVCwgdmFsKQorCisvKiA9PT09IGVuZCBmcm9tIGNkZWZCRjUzNC5oID09PT0gKi8KKworLyogR1BJTyBQSU4gbXV4ICgweEZGQzAzMjEwIC0gT3hGRkMwMzI4OCkgKi8KKworI2RlZmluZSBiZmluX3JlYWRfUE9SVEZfTVVYKCkJCQliZmluX3JlYWQxNihQT1JURl9NVVgpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEZfTVVYKHZhbCkJCWJmaW5fd3JpdGUxNihQT1JURl9NVVgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRHX01VWCgpCQkJYmZpbl9yZWFkMTYoUE9SVEdfTVVYKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRHX01VWCh2YWwpCQliZmluX3dyaXRlMTYoUE9SVEdfTVVYLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JUSF9NVVgoKQkJCWJmaW5fcmVhZDE2KFBPUlRIX01VWCkKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JUSF9NVVgodmFsKQkJYmZpbl93cml0ZTE2KFBPUlRIX01VWCwgdmFsKQorCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JURl9EUklWRSgpCQkJYmZpbl9yZWFkMTYoUE9SVEZfRFJJVkUpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEZfRFJJVkUodmFsKQkJYmZpbl93cml0ZTE2KFBPUlRGX0RSSVZFLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JUR19EUklWRSgpCQkJYmZpbl9yZWFkMTYoUE9SVEdfRFJJVkUpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEdfRFJJVkUodmFsKQkJYmZpbl93cml0ZTE2KFBPUlRHX0RSSVZFLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JUSF9EUklWRSgpCQkJYmZpbl9yZWFkMTYoUE9SVEhfRFJJVkUpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEhfRFJJVkUodmFsKQkJYmZpbl93cml0ZTE2KFBPUlRIX0RSSVZFLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JURl9TTEVXKCkJCQliZmluX3JlYWQxNihQT1JURl9TTEVXKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRGX1NMRVcodmFsKQkJYmZpbl93cml0ZTE2KFBPUlRGX1NMRVcsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRHX1NMRVcoKQkJCWJmaW5fcmVhZDE2KFBPUlRHX1NMRVcpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEdfU0xFVyh2YWwpCQliZmluX3dyaXRlMTYoUE9SVEdfU0xFVywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEhfU0xFVygpCQkJYmZpbl9yZWFkMTYoUE9SVEhfU0xFVykKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JUSF9TTEVXKHZhbCkJCWJmaW5fd3JpdGUxNihQT1JUSF9TTEVXLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JURl9IWVNURVJJU0lTKCkJCWJmaW5fcmVhZDE2KFBPUlRGX0hZU1RFUklTSVMpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEZfSFlTVEVSSVNJUyh2YWwpCWJmaW5fd3JpdGUxNihQT1JURl9IWVNURVJJU0lTLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JUR19IWVNURVJJU0lTKCkJCWJmaW5fcmVhZDE2KFBPUlRHX0hZU1RFUklTSVMpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEdfSFlTVEVSSVNJUyh2YWwpCWJmaW5fd3JpdGUxNihQT1JUR19IWVNURVJJU0lTLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JUSF9IWVNURVJJU0lTKCkJCWJmaW5fcmVhZDE2KFBPUlRIX0hZU1RFUklTSVMpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEhfSFlTVEVSSVNJUyh2YWwpCWJmaW5fd3JpdGUxNihQT1JUSF9IWVNURVJJU0lTLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NSVNDUE9SVF9EUklWRSgpCQliZmluX3JlYWQxNihNSVNDUE9SVF9EUklWRSkKKyNkZWZpbmUgYmZpbl93cml0ZV9NSVNDUE9SVF9EUklWRSh2YWwpCQliZmluX3dyaXRlMTYoTUlTQ1BPUlRfRFJJVkUsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01JU0NQT1JUX1NMRVcoKQkJYmZpbl9yZWFkMTYoTUlTQ1BPUlRfU0xFVykKKyNkZWZpbmUgYmZpbl93cml0ZV9NSVNDUE9SVF9TTEVXKHZhbCkJCWJmaW5fd3JpdGUxNihNSVNDUE9SVF9TTEVXLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NSVNDUE9SVF9IWVNURVJJU0lTKCkJCWJmaW5fcmVhZDE2KE1JU0NQT1JUX0hZU1RFUklTSVMpCisjZGVmaW5lIGJmaW5fd3JpdGVfTUlTQ1BPUlRfSFlTVEVSSVNJUyh2YWwpCWJmaW5fd3JpdGUxNihNSVNDUE9SVF9IWVNURVJJU0lTLCB2YWwpCisKKy8qIEhPU1QgUG9ydCBSZWdpc3RlcnMgKi8KKworI2RlZmluZSBiZmluX3JlYWRfSE9TVF9DT05UUk9MKCkJCWJmaW5fcmVhZDE2KEhPU1RfQ09OVFJPTCkKKyNkZWZpbmUgYmZpbl93cml0ZV9IT1NUX0NPTlRST0wodmFsKQkJYmZpbl93cml0ZTE2KEhPU1RfQ09OVFJPTCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfSE9TVF9TVEFUVVMoKQkJCWJmaW5fcmVhZDE2KEhPU1RfU1RBVFVTKQorI2RlZmluZSBiZmluX3dyaXRlX0hPU1RfU1RBVFVTKHZhbCkJCWJmaW5fd3JpdGUxNihIT1NUX1NUQVRVUywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfSE9TVF9USU1FT1VUKCkJCWJmaW5fcmVhZDE2KEhPU1RfVElNRU9VVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9IT1NUX1RJTUVPVVQodmFsKQkJYmZpbl93cml0ZTE2KEhPU1RfVElNRU9VVCwgdmFsKQorCisvKiBDb3VudGVyIFJlZ2lzdGVycyAqLworCisjZGVmaW5lIGJmaW5fcmVhZF9DTlRfQ09ORklHKCkJCQliZmluX3JlYWQxNihDTlRfQ09ORklHKQorI2RlZmluZSBiZmluX3dyaXRlX0NOVF9DT05GSUcodmFsKQkJYmZpbl93cml0ZTE2KENOVF9DT05GSUcsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NOVF9JTUFTSygpCQkJYmZpbl9yZWFkMTYoQ05UX0lNQVNLKQorI2RlZmluZSBiZmluX3dyaXRlX0NOVF9JTUFTSyh2YWwpCQliZmluX3dyaXRlMTYoQ05UX0lNQVNLLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DTlRfU1RBVFVTKCkJCQliZmluX3JlYWQxNihDTlRfU1RBVFVTKQorI2RlZmluZSBiZmluX3dyaXRlX0NOVF9TVEFUVVModmFsKQkJYmZpbl93cml0ZTE2KENOVF9TVEFUVVMsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NOVF9DT01NQU5EKCkJCQliZmluX3JlYWQxNihDTlRfQ09NTUFORCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DTlRfQ09NTUFORCh2YWwpCQliZmluX3dyaXRlMTYoQ05UX0NPTU1BTkQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NOVF9ERUJPVU5DRSgpCQliZmluX3JlYWQxNihDTlRfREVCT1VOQ0UpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ05UX0RFQk9VTkNFKHZhbCkJCWJmaW5fd3JpdGUxNihDTlRfREVCT1VOQ0UsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NOVF9DT1VOVEVSKCkJCQliZmluX3JlYWQzMihDTlRfQ09VTlRFUikKKyNkZWZpbmUgYmZpbl93cml0ZV9DTlRfQ09VTlRFUih2YWwpCQliZmluX3dyaXRlMzIoQ05UX0NPVU5URVIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NOVF9NQVgoKQkJCWJmaW5fcmVhZDMyKENOVF9NQVgpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ05UX01BWCh2YWwpCQkJYmZpbl93cml0ZTMyKENOVF9NQVgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NOVF9NSU4oKQkJCWJmaW5fcmVhZDMyKENOVF9NSU4pCisjZGVmaW5lIGJmaW5fd3JpdGVfQ05UX01JTih2YWwpCQkJYmZpbl93cml0ZTMyKENOVF9NSU4sIHZhbCkKKworLyogT1RQL0ZVU0UgUmVnaXN0ZXJzICovCisKKyNkZWZpbmUgYmZpbl9yZWFkX09UUF9DT05UUk9MKCkJCQliZmluX3JlYWQxNihPVFBfQ09OVFJPTCkKKyNkZWZpbmUgYmZpbl93cml0ZV9PVFBfQ09OVFJPTCh2YWwpCQliZmluX3dyaXRlMTYoT1RQX0NPTlRST0wsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX09UUF9CRU4oKQkJCWJmaW5fcmVhZDE2KE9UUF9CRU4pCisjZGVmaW5lIGJmaW5fd3JpdGVfT1RQX0JFTih2YWwpCQkJYmZpbl93cml0ZTE2KE9UUF9CRU4sIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX09UUF9TVEFUVVMoKQkJCWJmaW5fcmVhZDE2KE9UUF9TVEFUVVMpCisjZGVmaW5lIGJmaW5fd3JpdGVfT1RQX1NUQVRVUyh2YWwpCQliZmluX3dyaXRlMTYoT1RQX1NUQVRVUywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfT1RQX1RJTUlORygpCQkJYmZpbl9yZWFkMzIoT1RQX1RJTUlORykKKyNkZWZpbmUgYmZpbl93cml0ZV9PVFBfVElNSU5HKHZhbCkJCWJmaW5fd3JpdGUzMihPVFBfVElNSU5HLCB2YWwpCisKKy8qIFNlY3VyaXR5IFJlZ2lzdGVycyAqLworCisjZGVmaW5lIGJmaW5fcmVhZF9TRUNVUkVfU1lTU1dUKCkJCWJmaW5fcmVhZDMyKFNFQ1VSRV9TWVNTV1QpCisjZGVmaW5lIGJmaW5fd3JpdGVfU0VDVVJFX1NZU1NXVCh2YWwpCQliZmluX3dyaXRlMzIoU0VDVVJFX1NZU1NXVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU0VDVVJFX0NPTlRST0woKQkJYmZpbl9yZWFkMTYoU0VDVVJFX0NPTlRST0wpCisjZGVmaW5lIGJmaW5fd3JpdGVfU0VDVVJFX0NPTlRST0wodmFsKQkJYmZpbl93cml0ZTE2KFNFQ1VSRV9DT05UUk9MLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TRUNVUkVfU1RBVFVTKCkJCWJmaW5fcmVhZDE2KFNFQ1VSRV9TVEFUVVMpCisjZGVmaW5lIGJmaW5fd3JpdGVfU0VDVVJFX1NUQVRVUyh2YWwpCQliZmluX3dyaXRlMTYoU0VDVVJFX1NUQVRVUywgdmFsKQorCisvKiBPVFAgUmVhZC9Xcml0ZSBEYXRhIEJ1ZmZlciBSZWdpc3RlcnMgKi8KKworI2RlZmluZSBiZmluX3JlYWRfT1RQX0RBVEEwKCkJCQliZmluX3JlYWQzMihPVFBfREFUQTApCisjZGVmaW5lIGJmaW5fd3JpdGVfT1RQX0RBVEEwKHZhbCkJCWJmaW5fd3JpdGUzMihPVFBfREFUQTAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX09UUF9EQVRBMSgpCQkJYmZpbl9yZWFkMzIoT1RQX0RBVEExKQorI2RlZmluZSBiZmluX3dyaXRlX09UUF9EQVRBMSh2YWwpCQliZmluX3dyaXRlMzIoT1RQX0RBVEExLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9PVFBfREFUQTIoKQkJCWJmaW5fcmVhZDMyKE9UUF9EQVRBMikKKyNkZWZpbmUgYmZpbl93cml0ZV9PVFBfREFUQTIodmFsKQkJYmZpbl93cml0ZTMyKE9UUF9EQVRBMiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfT1RQX0RBVEEzKCkJCQliZmluX3JlYWQzMihPVFBfREFUQTMpCisjZGVmaW5lIGJmaW5fd3JpdGVfT1RQX0RBVEEzKHZhbCkJCWJmaW5fd3JpdGUzMihPVFBfREFUQTMsIHZhbCkKKworLyogTkZDIFJlZ2lzdGVycyAqLworCisjZGVmaW5lIGJmaW5fcmVhZF9ORkNfQ1RMKCkJCQliZmluX3JlYWQxNihORkNfQ1RMKQorI2RlZmluZSBiZmluX3dyaXRlX05GQ19DVEwodmFsKQkJCWJmaW5fd3JpdGUxNihORkNfQ1RMLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ORkNfU1RBVCgpCQkJYmZpbl9yZWFkMTYoTkZDX1NUQVQpCisjZGVmaW5lIGJmaW5fd3JpdGVfTkZDX1NUQVQodmFsKQkJYmZpbl93cml0ZTE2KE5GQ19TVEFULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ORkNfSVJRU1RBVCgpCQkJYmZpbl9yZWFkMTYoTkZDX0lSUVNUQVQpCisjZGVmaW5lIGJmaW5fd3JpdGVfTkZDX0lSUVNUQVQodmFsKQkJYmZpbl93cml0ZTE2KE5GQ19JUlFTVEFULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ORkNfSVJRTUFTSygpCQkJYmZpbl9yZWFkMTYoTkZDX0lSUU1BU0spCisjZGVmaW5lIGJmaW5fd3JpdGVfTkZDX0lSUU1BU0sodmFsKQkJYmZpbl93cml0ZTE2KE5GQ19JUlFNQVNLLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ORkNfRUNDMCgpCQkJYmZpbl9yZWFkMTYoTkZDX0VDQzApCisjZGVmaW5lIGJmaW5fd3JpdGVfTkZDX0VDQzAodmFsKQkJYmZpbl93cml0ZTE2KE5GQ19FQ0MwLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ORkNfRUNDMSgpCQkJYmZpbl9yZWFkMTYoTkZDX0VDQzEpCisjZGVmaW5lIGJmaW5fd3JpdGVfTkZDX0VDQzEodmFsKQkJYmZpbl93cml0ZTE2KE5GQ19FQ0MxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ORkNfRUNDMigpCQkJYmZpbl9yZWFkMTYoTkZDX0VDQzIpCisjZGVmaW5lIGJmaW5fd3JpdGVfTkZDX0VDQzIodmFsKQkJYmZpbl93cml0ZTE2KE5GQ19FQ0MyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ORkNfRUNDMygpCQkJYmZpbl9yZWFkMTYoTkZDX0VDQzMpCisjZGVmaW5lIGJmaW5fd3JpdGVfTkZDX0VDQzModmFsKQkJYmZpbl93cml0ZTE2KE5GQ19FQ0MzLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ORkNfQ09VTlQoKQkJCWJmaW5fcmVhZDE2KE5GQ19DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ORkNfQ09VTlQodmFsKQkJYmZpbl93cml0ZTE2KE5GQ19DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTkZDX1JTVCgpCQkJYmZpbl9yZWFkMTYoTkZDX1JTVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ORkNfUlNUKHZhbCkJCQliZmluX3dyaXRlMTYoTkZDX1JTVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTkZDX1BHQ1RMKCkJCQliZmluX3JlYWQxNihORkNfUEdDVEwpCisjZGVmaW5lIGJmaW5fd3JpdGVfTkZDX1BHQ1RMKHZhbCkJCWJmaW5fd3JpdGUxNihORkNfUEdDVEwsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX05GQ19SRUFEKCkJCQliZmluX3JlYWQxNihORkNfUkVBRCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ORkNfUkVBRCh2YWwpCQliZmluX3dyaXRlMTYoTkZDX1JFQUQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX05GQ19BRERSKCkJCQliZmluX3JlYWQxNihORkNfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ORkNfQUREUih2YWwpCQliZmluX3dyaXRlMTYoTkZDX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX05GQ19DTUQoKQkJCWJmaW5fcmVhZDE2KE5GQ19DTUQpCisjZGVmaW5lIGJmaW5fd3JpdGVfTkZDX0NNRCh2YWwpCQkJYmZpbl93cml0ZTE2KE5GQ19DTUQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX05GQ19EQVRBX1dSKCkJCQliZmluX3JlYWQxNihORkNfREFUQV9XUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ORkNfREFUQV9XUih2YWwpCQliZmluX3dyaXRlMTYoTkZDX0RBVEFfV1IsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX05GQ19EQVRBX1JEKCkJCQliZmluX3JlYWQxNihORkNfREFUQV9SRCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ORkNfREFUQV9SRCh2YWwpCQliZmluX3dyaXRlMTYoTkZDX0RBVEFfUkQsIHZhbCkKKworLyogVGhlc2UgbmVlZCB0byBiZSBsYXN0IGR1ZSB0byB0aGUgY2RlZi9saW51eCBpbnRlci1kZXBlbmRlbmNpZXMgKi8KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisKKy8qIFdyaXRpbmcgdG8gUExMX0NUTCBpbml0aWF0ZXMgYSBQTEwgcmVsb2NrIHNlcXVlbmNlLiAqLworc3RhdGljIF9faW5saW5lX18gdm9pZCBiZmluX3dyaXRlX1BMTF9DVEwodW5zaWduZWQgaW50IHZhbCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzLCBpd3IwLCBpd3IxOworCisJaWYgKHZhbCA9PSBiZmluX3JlYWRfUExMX0NUTCgpKQorCQlyZXR1cm47CisKKwlsb2NhbF9pcnFfc2F2ZV9odyhmbGFncyk7CisJLyogRW5hYmxlIHRoZSBQTEwgV2FrZXVwIGJpdCBpbiBTSUMgSVdSICovCisJaXdyMCA9IGJmaW5fcmVhZDMyKFNJQ19JV1IwKTsKKwlpd3IxID0gYmZpbl9yZWFkMzIoU0lDX0lXUjEpOworCS8qIE9ubHkgYWxsb3cgUFBMIFdha2V1cCkgKi8KKwliZmluX3dyaXRlMzIoU0lDX0lXUjAsIElXUl9FTkFCTEUoMCkpOworCWJmaW5fd3JpdGUzMihTSUNfSVdSMSwgMCk7CisKKwliZmluX3dyaXRlMTYoUExMX0NUTCwgdmFsKTsKKwlTU1lOQygpOworCWFzbSgiSURMRTsiKTsKKworCWJmaW5fd3JpdGUzMihTSUNfSVdSMCwgaXdyMCk7CisJYmZpbl93cml0ZTMyKFNJQ19JV1IxLCBpd3IxKTsKKwlsb2NhbF9pcnFfcmVzdG9yZV9odyhmbGFncyk7Cit9CisKKy8qIFdyaXRpbmcgdG8gVlJfQ1RMIGluaXRpYXRlcyBhIFBMTCByZWxvY2sgc2VxdWVuY2UuICovCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIGJmaW5fd3JpdGVfVlJfQ1RMKHVuc2lnbmVkIGludCB2YWwpCit7CisJdW5zaWduZWQgbG9uZyBmbGFncywgaXdyMCwgaXdyMTsKKworCWlmICh2YWwgPT0gYmZpbl9yZWFkX1ZSX0NUTCgpKQorCQlyZXR1cm47CisKKwlsb2NhbF9pcnFfc2F2ZV9odyhmbGFncyk7CisJLyogRW5hYmxlIHRoZSBQTEwgV2FrZXVwIGJpdCBpbiBTSUMgSVdSICovCisJaXdyMCA9IGJmaW5fcmVhZDMyKFNJQ19JV1IwKTsKKwlpd3IxID0gYmZpbl9yZWFkMzIoU0lDX0lXUjEpOworCS8qIE9ubHkgYWxsb3cgUFBMIFdha2V1cCkgKi8KKwliZmluX3dyaXRlMzIoU0lDX0lXUjAsIElXUl9FTkFCTEUoMCkpOworCWJmaW5fd3JpdGUzMihTSUNfSVdSMSwgMCk7CisKKwliZmluX3dyaXRlMTYoVlJfQ1RMLCB2YWwpOworCVNTWU5DKCk7CisJYXNtKCJJRExFOyIpOworCisJYmZpbl93cml0ZTMyKFNJQ19JV1IwLCBpd3IwKTsKKwliZmluX3dyaXRlMzIoU0lDX0lXUjEsIGl3cjEpOworCWxvY2FsX2lycV9yZXN0b3JlX2h3KGZsYWdzKTsKK30KKworI2VuZGlmIC8qIF9DREVGX0JGNTJYX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9pbmNsdWRlL21hY2gvZGVmQkY1MTIuaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9pbmNsdWRlL21hY2gvZGVmQkY1MTIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTZjYTkwCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2luY2x1ZGUvbWFjaC9kZWZCRjUxMi5oCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgKiBGaWxlOiAgICAgICAgIGluY2x1ZGUvYXNtLWJsYWNrZmluL21hY2gtYmY1MTgvZGVmQkY1MTIuaAorICogQmFzZWQgb246CisgKiBBdXRob3I6CisgKgorICogQ3JlYXRlZDoKKyAqIERlc2NyaXB0aW9uOgorICoKKyAqIFJldjoKKyAqCisgKiBNb2RpZmllZDoKKyAqCisgKiBCdWdzOiAgICAgICAgIEVudGVyIGJ1Z3MgYXQgaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnLworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLgorICogSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqLworCisjaWZuZGVmIF9ERUZfQkY1MTJfSAorI2RlZmluZSBfREVGX0JGNTEyX0gKKworLyogSW5jbHVkZSBhbGwgQ29yZSByZWdpc3RlcnMgYW5kIGJpdCBkZWZpbml0aW9ucyAqLworI2luY2x1ZGUgPGFzbS9kZWZfTFBCbGFja2Zpbi5oPgorCisvKiBTWVNURU0gJiBNTVIgQUREUkVTUyBERUZJTklUSU9OUyBGT1IgQURTUC1CRjUxMiAqLworCisvKiBJbmNsdWRlIGRlZkJGNTF4X2Jhc2UuaCBmb3IgdGhlIHNldCBvZiAjZGVmaW5lcyB0aGF0IGFyZSBjb21tb24gdG8gYWxsIEFEU1AtQkY1MXggcHJvY2Vzc29ycyAqLworI2luY2x1ZGUgImRlZkJGNTF4X2Jhc2UuaCIKKworI2VuZGlmIC8qIF9ERUZfQkY1MTJfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2luY2x1ZGUvbWFjaC9kZWZCRjUxNC5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2luY2x1ZGUvbWFjaC9kZWZCRjUxNC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0M2YyOTEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvaW5jbHVkZS9tYWNoL2RlZkJGNTE0LmgKQEAgLTAsMCArMSwxMTMgQEAKKy8qCisgKiBGaWxlOiAgICAgICAgIGluY2x1ZGUvYXNtLWJsYWNrZmluL21hY2gtYmY1MTgvZGVmQkY1MTQuaAorICogQmFzZWQgb246CisgKiBBdXRob3I6CisgKgorICogQ3JlYXRlZDoKKyAqIERlc2NyaXB0aW9uOgorICoKKyAqIFJldjoKKyAqCisgKiBNb2RpZmllZDoKKyAqCisgKiBCdWdzOiAgICAgICAgIEVudGVyIGJ1Z3MgYXQgaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnLworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLgorICogSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqLworCisjaWZuZGVmIF9ERUZfQkY1MTRfSAorI2RlZmluZSBfREVGX0JGNTE0X0gKKworLyogSW5jbHVkZSBhbGwgQ29yZSByZWdpc3RlcnMgYW5kIGJpdCBkZWZpbml0aW9ucyAqLworI2luY2x1ZGUgPGFzbS9kZWZfTFBCbGFja2Zpbi5oPgorCisvKiBTWVNURU0gJiBNTVIgQUREUkVTUyBERUZJTklUSU9OUyBGT1IgQURTUC1CRjUxNCAqLworCisvKiBJbmNsdWRlIGRlZkJGNTF4X2Jhc2UuaCBmb3IgdGhlIHNldCBvZiAjZGVmaW5lcyB0aGF0IGFyZSBjb21tb24gdG8gYWxsIEFEU1AtQkY1MXggcHJvY2Vzc29ycyAqLworI2luY2x1ZGUgImRlZkJGNTF4X2Jhc2UuaCIKKworLyogVGhlIGZvbGxvd2luZyBhcmUgdGhlICNkZWZpbmVzIG5lZWRlZCBieSBBRFNQLUJGNTE0IHRoYXQgYXJlIG5vdCBpbiB0aGUgY29tbW9uIGhlYWRlciAqLworCisvKiBTREggUmVnaXN0ZXJzICovCisKKyNkZWZpbmUgU0RIX1BXUl9DVEwgICAgICAgICAgICAgICAgICAgIDB4RkZDMDM5MDAgLyogU0RIIFBvd2VyIENvbnRyb2wgKi8KKyNkZWZpbmUgU0RIX0NMS19DVEwgICAgICAgICAgICAgICAgICAgIDB4RkZDMDM5MDQgLyogU0RIIENsb2NrIENvbnRyb2wgKi8KKyNkZWZpbmUgU0RIX0FSR1VNRU5UICAgICAgICAgICAgICAgICAgIDB4RkZDMDM5MDggLyogU0RIIEFyZ3VtZW50ICovCisjZGVmaW5lIFNESF9DT01NQU5EICAgICAgICAgICAgICAgICAgICAweEZGQzAzOTBDIC8qIFNESCBDb21tYW5kICovCisjZGVmaW5lIFNESF9SRVNQX0NNRCAgICAgICAgICAgICAgICAgICAweEZGQzAzOTEwIC8qIFNESCBSZXNwb25zZSBDb21tYW5kICovCisjZGVmaW5lIFNESF9SRVNQT05TRTAgICAgICAgICAgICAgICAgICAweEZGQzAzOTE0IC8qIFNESCBSZXNwb25zZTAgKi8KKyNkZWZpbmUgU0RIX1JFU1BPTlNFMSAgICAgICAgICAgICAgICAgIDB4RkZDMDM5MTggLyogU0RIIFJlc3BvbnNlMSAqLworI2RlZmluZSBTREhfUkVTUE9OU0UyICAgICAgICAgICAgICAgICAgMHhGRkMwMzkxQyAvKiBTREggUmVzcG9uc2UyICovCisjZGVmaW5lIFNESF9SRVNQT05TRTMgICAgICAgICAgICAgICAgICAweEZGQzAzOTIwIC8qIFNESCBSZXNwb25zZTMgKi8KKyNkZWZpbmUgU0RIX0RBVEFfVElNRVIgICAgICAgICAgICAgICAgIDB4RkZDMDM5MjQgLyogU0RIIERhdGEgVGltZXIgKi8KKyNkZWZpbmUgU0RIX0RBVEFfTEdUSCAgICAgICAgICAgICAgICAgIDB4RkZDMDM5MjggLyogU0RIIERhdGEgTGVuZ3RoICovCisjZGVmaW5lIFNESF9EQVRBX0NUTCAgICAgICAgICAgICAgICAgICAweEZGQzAzOTJDIC8qIFNESCBEYXRhIENvbnRyb2wgKi8KKyNkZWZpbmUgU0RIX0RBVEFfQ05UICAgICAgICAgICAgICAgICAgIDB4RkZDMDM5MzAgLyogU0RIIERhdGEgQ291bnRlciAqLworI2RlZmluZSBTREhfU1RBVFVTICAgICAgICAgICAgICAgICAgICAgMHhGRkMwMzkzNCAvKiBTREggU3RhdHVzICovCisjZGVmaW5lIFNESF9TVEFUVVNfQ0xSICAgICAgICAgICAgICAgICAweEZGQzAzOTM4IC8qIFNESCBTdGF0dXMgQ2xlYXIgKi8KKyNkZWZpbmUgU0RIX01BU0swICAgICAgICAgICAgICAgICAgICAgIDB4RkZDMDM5M0MgLyogU0RIIEludGVycnVwdDAgTWFzayAqLworI2RlZmluZSBTREhfTUFTSzEgICAgICAgICAgICAgICAgICAgICAgMHhGRkMwMzk0MCAvKiBTREggSW50ZXJydXB0MSBNYXNrICovCisjZGVmaW5lIFNESF9GSUZPX0NOVCAgICAgICAgICAgICAgICAgICAweEZGQzAzOTQ4IC8qIFNESCBGSUZPIENvdW50ZXIgKi8KKyNkZWZpbmUgU0RIX0ZJRk8gICAgICAgICAgICAgICAgICAgICAgIDB4RkZDMDM5ODAgLyogU0RIIERhdGEgRklGTyAqLworI2RlZmluZSBTREhfRV9TVEFUVVMgICAgICAgICAgICAgICAgICAgMHhGRkMwMzlDMCAvKiBTREggRXhjZXB0aW9uIFN0YXR1cyAqLworI2RlZmluZSBTREhfRV9NQVNLICAgICAgICAgICAgICAgICAgICAgMHhGRkMwMzlDNCAvKiBTREggRXhjZXB0aW9uIE1hc2sgKi8KKyNkZWZpbmUgU0RIX0NGRyAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZDMDM5QzggLyogU0RIIENvbmZpZ3VyYXRpb24gKi8KKyNkZWZpbmUgU0RIX1JEX1dBSVRfRU4gICAgICAgICAgICAgICAgIDB4RkZDMDM5Q0MgLyogU0RIIFJlYWQgV2FpdCBFbmFibGUgKi8KKyNkZWZpbmUgU0RIX1BJRDAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZDMDM5RDAgLyogU0RIIFBlcmlwaGVyYWwgSWRlbnRpZmljYXRpb24wICovCisjZGVmaW5lIFNESF9QSUQxICAgICAgICAgICAgICAgICAgICAgICAweEZGQzAzOUQ0IC8qIFNESCBQZXJpcGhlcmFsIElkZW50aWZpY2F0aW9uMSAqLworI2RlZmluZSBTREhfUElEMiAgICAgICAgICAgICAgICAgICAgICAgMHhGRkMwMzlEOCAvKiBTREggUGVyaXBoZXJhbCBJZGVudGlmaWNhdGlvbjIgKi8KKyNkZWZpbmUgU0RIX1BJRDMgICAgICAgICAgICAgICAgICAgICAgIDB4RkZDMDM5REMgLyogU0RIIFBlcmlwaGVyYWwgSWRlbnRpZmljYXRpb24zICovCisjZGVmaW5lIFNESF9QSUQ0ICAgICAgICAgICAgICAgICAgICAgICAweEZGQzAzOUUwIC8qIFNESCBQZXJpcGhlcmFsIElkZW50aWZpY2F0aW9uNCAqLworI2RlZmluZSBTREhfUElENSAgICAgICAgICAgICAgICAgICAgICAgMHhGRkMwMzlFNCAvKiBTREggUGVyaXBoZXJhbCBJZGVudGlmaWNhdGlvbjUgKi8KKyNkZWZpbmUgU0RIX1BJRDYgICAgICAgICAgICAgICAgICAgICAgIDB4RkZDMDM5RTggLyogU0RIIFBlcmlwaGVyYWwgSWRlbnRpZmljYXRpb242ICovCisjZGVmaW5lIFNESF9QSUQ3ICAgICAgICAgICAgICAgICAgICAgICAweEZGQzAzOUVDIC8qIFNESCBQZXJpcGhlcmFsIElkZW50aWZpY2F0aW9uNyAqLworCisvKiBSZW1vdmFibGUgU3RvcmFnZSBJbnRlcmZhY2UgUmVnaXN0ZXJzICovCisKKyNkZWZpbmUgUlNJX1BXUl9DT05UUk9MICAgICAgICAgICAgICAgIDB4RkZDMDM4MDAgLyogUlNJIFBvd2VyIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUlNJX0NMS19DT05UUk9MICAgICAgICAgICAgICAgIDB4RkZDMDM4MDQgLyogUlNJIENsb2NrIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUlNJX0FSR1VNRU5UICAgICAgICAgICAgICAgICAgIDB4RkZDMDM4MDggLyogUlNJIEFyZ3VtZW50IFJlZ2lzdGVyICovCisjZGVmaW5lIFJTSV9DT01NQU5EICAgICAgICAgICAgICAgICAgICAweEZGQzAzODBDIC8qIFJTSSBDb21tYW5kIFJlZ2lzdGVyICovCisjZGVmaW5lIFJTSV9SRVNQX0NNRCAgICAgICAgICAgICAgICAgICAweEZGQzAzODEwIC8qIFJTSSBSZXNwb25zZSBDb21tYW5kIFJlZ2lzdGVyICovCisjZGVmaW5lIFJTSV9SRVNQT05TRTAgICAgICAgICAgICAgICAgICAweEZGQzAzODE0IC8qIFJTSSBSZXNwb25zZSBSZWdpc3RlciAqLworI2RlZmluZSBSU0lfUkVTUE9OU0UxICAgICAgICAgICAgICAgICAgMHhGRkMwMzgxOCAvKiBSU0kgUmVzcG9uc2UgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUlNJX1JFU1BPTlNFMiAgICAgICAgICAgICAgICAgIDB4RkZDMDM4MUMgLyogUlNJIFJlc3BvbnNlIFJlZ2lzdGVyICovCisjZGVmaW5lIFJTSV9SRVNQT05TRTMgICAgICAgICAgICAgICAgICAweEZGQzAzODIwIC8qIFJTSSBSZXNwb25zZSBSZWdpc3RlciAqLworI2RlZmluZSBSU0lfREFUQV9USU1FUiAgICAgICAgICAgICAgICAgMHhGRkMwMzgyNCAvKiBSU0kgRGF0YSBUaW1lciBSZWdpc3RlciAqLworI2RlZmluZSBSU0lfREFUQV9MR1RIICAgICAgICAgICAgICAgICAgMHhGRkMwMzgyOCAvKiBSU0kgRGF0YSBMZW5ndGggUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUlNJX0RBVEFfQ09OVFJPTCAgICAgICAgICAgICAgIDB4RkZDMDM4MkMgLyogUlNJIERhdGEgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZSBSU0lfREFUQV9DTlQgICAgICAgICAgICAgICAgICAgMHhGRkMwMzgzMCAvKiBSU0kgRGF0YSBDb3VudGVyIFJlZ2lzdGVyICovCisjZGVmaW5lIFJTSV9TVEFUVVMgICAgICAgICAgICAgICAgICAgICAweEZGQzAzODM0IC8qIFJTSSBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUlNJX1NUQVRVU0NMICAgICAgICAgICAgICAgICAgIDB4RkZDMDM4MzggLyogUlNJIFN0YXR1cyBDbGVhciBSZWdpc3RlciAqLworI2RlZmluZSBSU0lfTUFTSzAgICAgICAgICAgICAgICAgICAgICAgMHhGRkMwMzgzQyAvKiBSU0kgSW50ZXJydXB0IDAgTWFzayBSZWdpc3RlciAqLworI2RlZmluZSBSU0lfTUFTSzEgICAgICAgICAgICAgICAgICAgICAgMHhGRkMwMzg0MCAvKiBSU0kgSW50ZXJydXB0IDEgTWFzayBSZWdpc3RlciAqLworI2RlZmluZSBSU0lfRklGT19DTlQgICAgICAgICAgICAgICAgICAgMHhGRkMwMzg0OCAvKiBSU0kgRklGTyBDb3VudGVyIFJlZ2lzdGVyICovCisjZGVmaW5lIFJTSV9DRUFUQV9DT05UUk9MICAgICAgICAgICAgICAweEZGQzAzODRDIC8qIFJTSSBDRUFUQSBSZWdpc3RlciAqLworI2RlZmluZSBSU0lfRklGTyAgICAgICAgICAgICAgICAgICAgICAgMHhGRkMwMzg4MCAvKiBSU0kgRGF0YSBGSUZPIFJlZ2lzdGVyICovCisjZGVmaW5lIFJTSV9FU1RBVCAgICAgICAgICAgICAgICAgICAgICAweEZGQzAzOEMwIC8qIFJTSSBFeGNlcHRpb24gU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lIFJTSV9FTUFTSyAgICAgICAgICAgICAgICAgICAgICAweEZGQzAzOEM0IC8qIFJTSSBFeGNlcHRpb24gTWFzayBSZWdpc3RlciAqLworI2RlZmluZSBSU0lfQ09ORklHICAgICAgICAgICAgICAgICAgICAgMHhGRkMwMzhDOCAvKiBSU0kgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAqLworI2RlZmluZSBSU0lfUkRfV0FJVF9FTiAgICAgICAgICAgICAgICAgMHhGRkMwMzhDQyAvKiBSU0kgUmVhZCBXYWl0IEVuYWJsZSBSZWdpc3RlciAqLworI2RlZmluZSBSU0lfUElEMCAgICAgICAgICAgICAgICAgICAgICAgMHhGRkMwM0ZFMCAvKiBSU0kgUGVyaXBoZXJhbCBJRCBSZWdpc3RlciAwICovCisjZGVmaW5lIFJTSV9QSUQxICAgICAgICAgICAgICAgICAgICAgICAweEZGQzAzRkU0IC8qIFJTSSBQZXJpcGhlcmFsIElEIFJlZ2lzdGVyIDEgKi8KKyNkZWZpbmUgUlNJX1BJRDIgICAgICAgICAgICAgICAgICAgICAgIDB4RkZDMDNGRTggLyogUlNJIFBlcmlwaGVyYWwgSUQgUmVnaXN0ZXIgMiAqLworI2RlZmluZSBSU0lfUElEMyAgICAgICAgICAgICAgICAgICAgICAgMHhGRkMwM0ZFQyAvKiBSU0kgUGVyaXBoZXJhbCBJRCBSZWdpc3RlciAzICovCisjZGVmaW5lIFJTSV9QSUQ0ICAgICAgICAgICAgICAgICAgICAgICAweEZGQzAzRkYwIC8qIFJTSSBQZXJpcGhlcmFsIElEIFJlZ2lzdGVyIDQgKi8KKyNkZWZpbmUgUlNJX1BJRDUgICAgICAgICAgICAgICAgICAgICAgIDB4RkZDMDNGRjQgLyogUlNJIFBlcmlwaGVyYWwgSUQgUmVnaXN0ZXIgNSAqLworI2RlZmluZSBSU0lfUElENiAgICAgICAgICAgICAgICAgICAgICAgMHhGRkMwM0ZGOCAvKiBSU0kgUGVyaXBoZXJhbCBJRCBSZWdpc3RlciA2ICovCisjZGVmaW5lIFJTSV9QSUQ3ICAgICAgICAgICAgICAgICAgICAgICAweEZGQzAzRkZDIC8qIFJTSSBQZXJpcGhlcmFsIElEIFJlZ2lzdGVyIDcgKi8KKworI2VuZGlmIC8qIF9ERUZfQkY1MTRfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2luY2x1ZGUvbWFjaC9kZWZCRjUxNi5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2luY2x1ZGUvbWFjaC9kZWZCRjUxNi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0OWEyNjkKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvaW5jbHVkZS9tYWNoL2RlZkJGNTE2LmgKQEAgLTAsMCArMSw0OTAgQEAKKy8qCisgKiBGaWxlOiAgICAgICAgIGluY2x1ZGUvYXNtLWJsYWNrZmluL21hY2gtYmY1MTgvZGVmQkY1MTYuaAorICogQmFzZWQgb246CisgKiBBdXRob3I6CisgKgorICogQ3JlYXRlZDoKKyAqIERlc2NyaXB0aW9uOgorICoKKyAqIFJldjoKKyAqCisgKiBNb2RpZmllZDoKKyAqCisgKiBCdWdzOiAgICAgICAgIEVudGVyIGJ1Z3MgYXQgaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnLworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLgorICogSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqLworCisjaWZuZGVmIF9ERUZfQkY1MTZfSAorI2RlZmluZSBfREVGX0JGNTE2X0gKKworLyogSW5jbHVkZSBhbGwgQ29yZSByZWdpc3RlcnMgYW5kIGJpdCBkZWZpbml0aW9ucyAqLworI2luY2x1ZGUgPGFzbS9kZWZfTFBCbGFja2Zpbi5oPgorCisvKiBTWVNURU0gJiBNTVIgQUREUkVTUyBERUZJTklUSU9OUyBGT1IgQURTUC1CRjUxNiAqLworCisvKiBJbmNsdWRlIGRlZkJGNTF4X2Jhc2UuaCBmb3IgdGhlIHNldCBvZiAjZGVmaW5lcyB0aGF0IGFyZSBjb21tb24gdG8gYWxsIEFEU1AtQkY1MXggcHJvY2Vzc29ycyAqLworI2luY2x1ZGUgImRlZkJGNTF4X2Jhc2UuaCIKKworLyogVGhlIGZvbGxvd2luZyBhcmUgdGhlICNkZWZpbmVzIG5lZWRlZCBieSBBRFNQLUJGNTE2IHRoYXQgYXJlIG5vdCBpbiB0aGUgY29tbW9uIGhlYWRlciAqLworLyogMTAvMTAwIEV0aGVybmV0IENvbnRyb2xsZXIJKDB4RkZDMDMwMDAgLSAweEZGQzAzMUZGKSAqLworCisjZGVmaW5lIEVNQUNfT1BNT0RFICAgICAgICAgICAgIDB4RkZDMDMwMDAgICAgICAgLyogT3BlcmF0aW5nIE1vZGUgUmVnaXN0ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBFTUFDX0FERFJMTyAgICAgICAgICAgICAweEZGQzAzMDA0ICAgICAgIC8qIEFkZHJlc3MgTG93ICgzMiBMU0JzKSBSZWdpc3RlciAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRU1BQ19BRERSSEkgICAgICAgICAgICAgMHhGRkMwMzAwOCAgICAgICAvKiBBZGRyZXNzIEhpZ2ggKDE2IE1TQnMpIFJlZ2lzdGVyICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEVNQUNfSEFTSExPICAgICAgICAgICAgIDB4RkZDMDMwMEMgICAgICAgLyogTXVsdGljYXN0IEhhc2ggVGFibGUgTG93IChCaW5zIDMxLTApIFJlZ2lzdGVyICAgICAgICAqLworI2RlZmluZSBFTUFDX0hBU0hISSAgICAgICAgICAgICAweEZGQzAzMDEwICAgICAgIC8qIE11bHRpY2FzdCBIYXNoIFRhYmxlIEhpZ2ggKEJpbnMgNjMtMzIpIFJlZ2lzdGVyICAgICAgKi8KKyNkZWZpbmUgRU1BQ19TVEFBREQgICAgICAgICAgICAgMHhGRkMwMzAxNCAgICAgICAvKiBTdGF0aW9uIE1hbmFnZW1lbnQgQWRkcmVzcyBSZWdpc3RlciAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEVNQUNfU1RBREFUICAgICAgICAgICAgIDB4RkZDMDMwMTggICAgICAgLyogU3RhdGlvbiBNYW5hZ2VtZW50IERhdGEgUmVnaXN0ZXIgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBFTUFDX0ZMQyAgICAgICAgICAgICAgICAweEZGQzAzMDFDICAgICAgIC8qIEZsb3cgQ29udHJvbCBSZWdpc3RlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRU1BQ19WTEFOMSAgICAgICAgICAgICAgMHhGRkMwMzAyMCAgICAgICAvKiBWTEFOMSBUYWcgUmVnaXN0ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEVNQUNfVkxBTjIgICAgICAgICAgICAgIDB4RkZDMDMwMjQgICAgICAgLyogVkxBTjIgVGFnIFJlZ2lzdGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBFTUFDX1dLVVBfQ1RMICAgICAgICAgICAweEZGQzAzMDJDICAgICAgIC8qIFdha2UtVXAgQ29udHJvbC9TdGF0dXMgUmVnaXN0ZXIgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRU1BQ19XS1VQX0ZGTVNLMCAgICAgICAgMHhGRkMwMzAzMCAgICAgICAvKiBXYWtlLVVwIEZyYW1lIEZpbHRlciAwIEJ5dGUgTWFzayBSZWdpc3RlciAgICAgICAgICAgICovCisjZGVmaW5lIEVNQUNfV0tVUF9GRk1TSzEgICAgICAgIDB4RkZDMDMwMzQgICAgICAgLyogV2FrZS1VcCBGcmFtZSBGaWx0ZXIgMSBCeXRlIE1hc2sgUmVnaXN0ZXIgICAgICAgICAgICAqLworI2RlZmluZSBFTUFDX1dLVVBfRkZNU0syICAgICAgICAweEZGQzAzMDM4ICAgICAgIC8qIFdha2UtVXAgRnJhbWUgRmlsdGVyIDIgQnl0ZSBNYXNrIFJlZ2lzdGVyICAgICAgICAgICAgKi8KKyNkZWZpbmUgRU1BQ19XS1VQX0ZGTVNLMyAgICAgICAgMHhGRkMwMzAzQyAgICAgICAvKiBXYWtlLVVwIEZyYW1lIEZpbHRlciAzIEJ5dGUgTWFzayBSZWdpc3RlciAgICAgICAgICAgICovCisjZGVmaW5lIEVNQUNfV0tVUF9GRkNNRCAgICAgICAgIDB4RkZDMDMwNDAgICAgICAgLyogV2FrZS1VcCBGcmFtZSBGaWx0ZXIgQ29tbWFuZHMgUmVnaXN0ZXIgICAgICAgICAgICAgICAqLworI2RlZmluZSBFTUFDX1dLVVBfRkZPRkYgICAgICAgICAweEZGQzAzMDQ0ICAgICAgIC8qIFdha2UtVXAgRnJhbWUgRmlsdGVyIE9mZnNldHMgUmVnaXN0ZXIgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRU1BQ19XS1VQX0ZGQ1JDMCAgICAgICAgMHhGRkMwMzA0OCAgICAgICAvKiBXYWtlLVVwIEZyYW1lIEZpbHRlciAwLDEgQ1JDLTE2IFJlZ2lzdGVyICAgICAgICAgICAgICovCisjZGVmaW5lIEVNQUNfV0tVUF9GRkNSQzEgICAgICAgIDB4RkZDMDMwNEMgICAgICAgLyogV2FrZS1VcCBGcmFtZSBGaWx0ZXIgMiwzIENSQy0xNiBSZWdpc3RlciAgICAgICAgICAgICAqLworCisjZGVmaW5lIEVNQUNfU1lTQ1RMICAgICAgICAgICAgIDB4RkZDMDMwNjAgICAgICAgLyogRU1BQyBTeXN0ZW0gQ29udHJvbCBSZWdpc3RlciAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBFTUFDX1NZU1RBVCAgICAgICAgICAgICAweEZGQzAzMDY0ICAgICAgIC8qIEVNQUMgU3lzdGVtIFN0YXR1cyBSZWdpc3RlciAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRU1BQ19SWF9TVEFUICAgICAgICAgICAgMHhGRkMwMzA2OCAgICAgICAvKiBSWCBDdXJyZW50IEZyYW1lIFN0YXR1cyBSZWdpc3RlciAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEVNQUNfUlhfU1RLWSAgICAgICAgICAgIDB4RkZDMDMwNkMgICAgICAgLyogUlggU3RpY2t5IEZyYW1lIFN0YXR1cyBSZWdpc3RlciAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBFTUFDX1JYX0lSUUUgICAgICAgICAgICAweEZGQzAzMDcwICAgICAgIC8qIFJYIEZyYW1lIFN0YXR1cyBJbnRlcnJ1cHQgRW5hYmxlcyBSZWdpc3RlciAgICAgICAgICAgKi8KKyNkZWZpbmUgRU1BQ19UWF9TVEFUICAgICAgICAgICAgMHhGRkMwMzA3NCAgICAgICAvKiBUWCBDdXJyZW50IEZyYW1lIFN0YXR1cyBSZWdpc3RlciAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEVNQUNfVFhfU1RLWSAgICAgICAgICAgIDB4RkZDMDMwNzggICAgICAgLyogVFggU3RpY2t5IEZyYW1lIFN0YXR1cyBSZWdpc3RlciAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBFTUFDX1RYX0lSUUUgICAgICAgICAgICAweEZGQzAzMDdDICAgICAgIC8qIFRYIEZyYW1lIFN0YXR1cyBJbnRlcnJ1cHQgRW5hYmxlcyBSZWdpc3RlciAgICAgICAgICAgKi8KKworI2RlZmluZSBFTUFDX01NQ19DVEwgICAgICAgICAgICAweEZGQzAzMDgwICAgICAgIC8qIE1NQyBDb3VudGVyIENvbnRyb2wgUmVnaXN0ZXIgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRU1BQ19NTUNfUklSUVMgICAgICAgICAgMHhGRkMwMzA4NCAgICAgICAvKiBNTUMgUlggSW50ZXJydXB0IFN0YXR1cyBSZWdpc3RlciAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEVNQUNfTU1DX1JJUlFFICAgICAgICAgIDB4RkZDMDMwODggICAgICAgLyogTU1DIFJYIEludGVycnVwdCBFbmFibGVzIFJlZ2lzdGVyICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBFTUFDX01NQ19USVJRUyAgICAgICAgICAweEZGQzAzMDhDICAgICAgIC8qIE1NQyBUWCBJbnRlcnJ1cHQgU3RhdHVzIFJlZ2lzdGVyICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRU1BQ19NTUNfVElSUUUgICAgICAgICAgMHhGRkMwMzA5MCAgICAgICAvKiBNTUMgVFggSW50ZXJydXB0IEVuYWJsZXMgUmVnaXN0ZXIgICAgICAgICAgICAgICAgICAgICovCisKKyNkZWZpbmUgRU1BQ19SWENfT0sgICAgICAgICAgICAgMHhGRkMwMzEwMCAgICAgICAvKiBSWCBGcmFtZSBTdWNjZXNzZnVsIENvdW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEVNQUNfUlhDX0ZDUyAgICAgICAgICAgIDB4RkZDMDMxMDQgICAgICAgLyogUlggRnJhbWUgRkNTIEZhaWx1cmUgQ291bnQgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBFTUFDX1JYQ19BTElHTiAgICAgICAgICAweEZGQzAzMTA4ICAgICAgIC8qIFJYIEFsaWdubWVudCBFcnJvciBDb3VudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRU1BQ19SWENfT0NURVQgICAgICAgICAgMHhGRkMwMzEwQyAgICAgICAvKiBSWCBPY3RldHMgU3VjY2Vzc2Z1bGx5IFJlY2VpdmVkIENvdW50ICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEVNQUNfUlhDX0RNQU9WRiAgICAgICAgIDB4RkZDMDMxMTAgICAgICAgLyogSW50ZXJuYWwgTUFDIFN1YmxheWVyIEVycm9yIFJYIEZyYW1lIENvdW50ICAgICAgICAgICAqLworI2RlZmluZSBFTUFDX1JYQ19VTklDU1QgICAgICAgICAweEZGQzAzMTE0ICAgICAgIC8qIFVuaWNhc3QgUlggRnJhbWUgQ291bnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRU1BQ19SWENfTVVMVEkgICAgICAgICAgMHhGRkMwMzExOCAgICAgICAvKiBNdWx0aWNhc3QgUlggRnJhbWUgQ291bnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEVNQUNfUlhDX0JST0FEICAgICAgICAgIDB4RkZDMDMxMUMgICAgICAgLyogQnJvYWRjYXN0IFJYIEZyYW1lIENvdW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBFTUFDX1JYQ19MTkVSUkkgICAgICAgICAweEZGQzAzMTIwICAgICAgIC8qIFJYIEZyYW1lIEluIFJhbmdlIEVycm9yIENvdW50ICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRU1BQ19SWENfTE5FUlJPICAgICAgICAgMHhGRkMwMzEyNCAgICAgICAvKiBSWCBGcmFtZSBPdXQgT2YgUmFuZ2UgRXJyb3IgQ291bnQgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEVNQUNfUlhDX0xPTkcgICAgICAgICAgIDB4RkZDMDMxMjggICAgICAgLyogUlggRnJhbWUgVG9vIExvbmcgQ291bnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBFTUFDX1JYQ19NQUNDVEwgICAgICAgICAweEZGQzAzMTJDICAgICAgIC8qIE1BQyBDb250cm9sIFJYIEZyYW1lIENvdW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRU1BQ19SWENfT1BDT0RFICAgICAgICAgMHhGRkMwMzEzMCAgICAgICAvKiBVbnN1cHBvcnRlZCBPcC1Db2RlIFJYIEZyYW1lIENvdW50ICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEVNQUNfUlhDX1BBVVNFICAgICAgICAgIDB4RkZDMDMxMzQgICAgICAgLyogTUFDIENvbnRyb2wgUGF1c2UgUlggRnJhbWUgQ291bnQgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBFTUFDX1JYQ19BTExGUk0gICAgICAgICAweEZGQzAzMTM4ICAgICAgIC8qIE92ZXJhbGwgUlggRnJhbWUgQ291bnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRU1BQ19SWENfQUxMT0NUICAgICAgICAgMHhGRkMwMzEzQyAgICAgICAvKiBPdmVyYWxsIFJYIE9jdGV0IENvdW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEVNQUNfUlhDX1RZUEVEICAgICAgICAgIDB4RkZDMDMxNDAgICAgICAgLyogVHlwZS9MZW5ndGggQ29uc2lzdGVudCBSWCBGcmFtZSBDb3VudCAgICAgICAgICAgICAgICAqLworI2RlZmluZSBFTUFDX1JYQ19TSE9SVCAgICAgICAgICAweEZGQzAzMTQ0ICAgICAgIC8qIFJYIEZyYW1lIEZyYWdtZW50IENvdW50IC0gQnl0ZSBDb3VudCB4IDwgNjQgICAgICAgICAgKi8KKyNkZWZpbmUgRU1BQ19SWENfRVE2NCAgICAgICAgICAgMHhGRkMwMzE0OCAgICAgICAvKiBHb29kIFJYIEZyYW1lIENvdW50IC0gQnl0ZSBDb3VudCB4ID0gNjQgICAgICAgICAgICAgICovCisjZGVmaW5lIEVNQUNfUlhDX0xUMTI4ICAgICAgICAgIDB4RkZDMDMxNEMgICAgICAgLyogR29vZCBSWCBGcmFtZSBDb3VudCAtIEJ5dGUgQ291bnQgIDY0IDwgeCA8IDEyOCAgICAgICAqLworI2RlZmluZSBFTUFDX1JYQ19MVDI1NiAgICAgICAgICAweEZGQzAzMTUwICAgICAgIC8qIEdvb2QgUlggRnJhbWUgQ291bnQgLSBCeXRlIENvdW50IDEyOCA8PSB4IDwgMjU2ICAgICAgKi8KKyNkZWZpbmUgRU1BQ19SWENfTFQ1MTIgICAgICAgICAgMHhGRkMwMzE1NCAgICAgICAvKiBHb29kIFJYIEZyYW1lIENvdW50IC0gQnl0ZSBDb3VudCAyNTYgPD0geCA8IDUxMiAgICAgICovCisjZGVmaW5lIEVNQUNfUlhDX0xUMTAyNCAgICAgICAgIDB4RkZDMDMxNTggICAgICAgLyogR29vZCBSWCBGcmFtZSBDb3VudCAtIEJ5dGUgQ291bnQgNTEyIDw9IHggPCAxMDI0ICAgICAqLworI2RlZmluZSBFTUFDX1JYQ19HRTEwMjQgICAgICAgICAweEZGQzAzMTVDICAgICAgIC8qIEdvb2QgUlggRnJhbWUgQ291bnQgLSBCeXRlIENvdW50IHggPj0gMTAyNCAgICAgICAgICAgKi8KKworI2RlZmluZSBFTUFDX1RYQ19PSyAgICAgICAgICAgICAweEZGQzAzMTgwICAgICAgIC8qIFRYIEZyYW1lIFN1Y2Nlc3NmdWwgQ291bnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEVNQUNfVFhDXzFDT0wgICAgICAgICAgIDB4RkZDMDMxODQgICAgICAgLyogVFggRnJhbWVzIFN1Y2Nlc3NmdWwgQWZ0ZXIgU2luZ2xlIENvbGxpc2lvbiBDb3VudCAgICAgKi8KKyNkZWZpbmUgRU1BQ19UWENfR1QxQ09MICAgICAgICAgMHhGRkMwMzE4OCAgICAgICAvKiBUWCBGcmFtZXMgU3VjY2Vzc2Z1bCBBZnRlciBNdWx0aXBsZSBDb2xsaXNpb25zIENvdW50ICAqLworI2RlZmluZSBFTUFDX1RYQ19PQ1RFVCAgICAgICAgICAweEZGQzAzMThDICAgICAgIC8qIFRYIE9jdGV0cyBTdWNjZXNzZnVsbHkgUmVjZWl2ZWQgQ291bnQgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEVNQUNfVFhDX0RFRkVSICAgICAgICAgIDB4RkZDMDMxOTAgICAgICAgLyogVFggRnJhbWUgRGVsYXllZCBEdWUgVG8gQnVzeSBDb3VudCAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRU1BQ19UWENfTEFURUNMICAgICAgICAgMHhGRkMwMzE5NCAgICAgICAvKiBMYXRlIFRYIENvbGxpc2lvbnMgQ291bnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBFTUFDX1RYQ19YU19DT0wgICAgICAgICAweEZGQzAzMTk4ICAgICAgIC8qIFRYIEZyYW1lIEZhaWxlZCBEdWUgVG8gRXhjZXNzaXZlIENvbGxpc2lvbnMgQ291bnQgICAgICovCisjZGVmaW5lIEVNQUNfVFhDX0RNQVVORCAgICAgICAgIDB4RkZDMDMxOUMgICAgICAgLyogSW50ZXJuYWwgTUFDIFN1YmxheWVyIEVycm9yIFRYIEZyYW1lIENvdW50ICAgICAgICAgICAgKi8KKyNkZWZpbmUgRU1BQ19UWENfQ1JTRVJSICAgICAgICAgMHhGRkMwMzFBMCAgICAgICAvKiBDYXJyaWVyIFNlbnNlIERlYXNzZXJ0ZWQgRHVyaW5nIFRYIEZyYW1lIENvdW50ICAgICAgICAqLworI2RlZmluZSBFTUFDX1RYQ19VTklDU1QgICAgICAgICAweEZGQzAzMUE0ICAgICAgIC8qIFVuaWNhc3QgVFggRnJhbWUgQ291bnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEVNQUNfVFhDX01VTFRJICAgICAgICAgIDB4RkZDMDMxQTggICAgICAgLyogTXVsdGljYXN0IFRYIEZyYW1lIENvdW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRU1BQ19UWENfQlJPQUQgICAgICAgICAgMHhGRkMwMzFBQyAgICAgICAvKiBCcm9hZGNhc3QgVFggRnJhbWUgQ291bnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBFTUFDX1RYQ19YU19ERlIgICAgICAgICAweEZGQzAzMUIwICAgICAgIC8qIFRYIEZyYW1lcyBXaXRoIEV4Y2Vzc2l2ZSBEZWZlcnJhbCBDb3VudCAgICAgICAgICAgICAgICovCisjZGVmaW5lIEVNQUNfVFhDX01BQ0NUTCAgICAgICAgIDB4RkZDMDMxQjQgICAgICAgLyogTUFDIENvbnRyb2wgVFggRnJhbWUgQ291bnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRU1BQ19UWENfQUxMRlJNICAgICAgICAgMHhGRkMwMzFCOCAgICAgICAvKiBPdmVyYWxsIFRYIEZyYW1lIENvdW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBFTUFDX1RYQ19BTExPQ1QgICAgICAgICAweEZGQzAzMUJDICAgICAgIC8qIE92ZXJhbGwgVFggT2N0ZXQgQ291bnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEVNQUNfVFhDX0VRNjQgICAgICAgICAgIDB4RkZDMDMxQzAgICAgICAgLyogR29vZCBUWCBGcmFtZSBDb3VudCAtIEJ5dGUgQ291bnQgeCA9IDY0ICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRU1BQ19UWENfTFQxMjggICAgICAgICAgMHhGRkMwMzFDNCAgICAgICAvKiBHb29kIFRYIEZyYW1lIENvdW50IC0gQnl0ZSBDb3VudCAgNjQgPCB4IDwgMTI4ICAgICAgICAqLworI2RlZmluZSBFTUFDX1RYQ19MVDI1NiAgICAgICAgICAweEZGQzAzMUM4ICAgICAgIC8qIEdvb2QgVFggRnJhbWUgQ291bnQgLSBCeXRlIENvdW50IDEyOCA8PSB4IDwgMjU2ICAgICAgICovCisjZGVmaW5lIEVNQUNfVFhDX0xUNTEyICAgICAgICAgIDB4RkZDMDMxQ0MgICAgICAgLyogR29vZCBUWCBGcmFtZSBDb3VudCAtIEJ5dGUgQ291bnQgMjU2IDw9IHggPCA1MTIgICAgICAgKi8KKyNkZWZpbmUgRU1BQ19UWENfTFQxMDI0ICAgICAgICAgMHhGRkMwMzFEMCAgICAgICAvKiBHb29kIFRYIEZyYW1lIENvdW50IC0gQnl0ZSBDb3VudCA1MTIgPD0geCA8IDEwMjQgICAgICAqLworI2RlZmluZSBFTUFDX1RYQ19HRTEwMjQgICAgICAgICAweEZGQzAzMUQ0ICAgICAgIC8qIEdvb2QgVFggRnJhbWUgQ291bnQgLSBCeXRlIENvdW50IHggPj0gMTAyNCAgICAgICAgICAgICovCisjZGVmaW5lIEVNQUNfVFhDX0FCT1JUICAgICAgICAgIDB4RkZDMDMxRDggICAgICAgLyogVG90YWwgVFggRnJhbWVzIEFib3J0ZWQgQ291bnQgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworLyogTGlzdGluZyBmb3IgSUVFRS1TdXBwb3J0ZWQgQ291bnQgUmVnaXN0ZXJzICovCisKKyNkZWZpbmUgRnJhbWVzUmVjZWl2ZWRPSyAgICAgICAgICAgICAgICBFTUFDX1JYQ19PSyAgICAgICAgLyogUlggRnJhbWUgU3VjY2Vzc2Z1bCBDb3VudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBGcmFtZUNoZWNrU2VxdWVuY2VFcnJvcnMgICAgICAgIEVNQUNfUlhDX0ZDUyAgICAgICAvKiBSWCBGcmFtZSBGQ1MgRmFpbHVyZSBDb3VudCAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEFsaWdubWVudEVycm9ycyAgICAgICAgICAgICAgICAgRU1BQ19SWENfQUxJR04gICAgIC8qIFJYIEFsaWdubWVudCBFcnJvciBDb3VudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgT2N0ZXRzUmVjZWl2ZWRPSyAgICAgICAgICAgICAgICBFTUFDX1JYQ19PQ1RFVCAgICAgLyogUlggT2N0ZXRzIFN1Y2Nlc3NmdWxseSBSZWNlaXZlZCBDb3VudCAgICAgICAgICAgICAgICAqLworI2RlZmluZSBGcmFtZXNMb3N0RHVlVG9JbnRNQUNSY3ZFcnJvciAgIEVNQUNfUlhDX0RNQU9WRiAgICAvKiBJbnRlcm5hbCBNQUMgU3VibGF5ZXIgRXJyb3IgUlggRnJhbWUgQ291bnQgICAgICAgICAgICovCisjZGVmaW5lIFVuaWNhc3RGcmFtZXNSZWNlaXZlZE9LICAgICAgICAgRU1BQ19SWENfVU5JQ1NUICAgIC8qIFVuaWNhc3QgUlggRnJhbWUgQ291bnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTXVsdGljYXN0RnJhbWVzUmVjZWl2ZWRPSyAgICAgICBFTUFDX1JYQ19NVUxUSSAgICAgLyogTXVsdGljYXN0IFJYIEZyYW1lIENvdW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBCcm9hZGNhc3RGcmFtZXNSZWNlaXZlZE9LICAgICAgIEVNQUNfUlhDX0JST0FEICAgICAvKiBCcm9hZGNhc3QgUlggRnJhbWUgQ291bnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEluUmFuZ2VMZW5ndGhFcnJvcnMgICAgICAgICAgICAgRU1BQ19SWENfTE5FUlJJICAgIC8qIFJYIEZyYW1lIEluIFJhbmdlIEVycm9yIENvdW50ICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgT3V0T2ZSYW5nZUxlbmd0aEZpZWxkICAgICAgICAgICBFTUFDX1JYQ19MTkVSUk8gICAgLyogUlggRnJhbWUgT3V0IE9mIFJhbmdlIEVycm9yIENvdW50ICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBGcmFtZVRvb0xvbmdFcnJvcnMgICAgICAgICAgICAgIEVNQUNfUlhDX0xPTkcgICAgICAvKiBSWCBGcmFtZSBUb28gTG9uZyBDb3VudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIE1BQ0NvbnRyb2xGcmFtZXNSZWNlaXZlZCAgICAgICAgRU1BQ19SWENfTUFDQ1RMICAgIC8qIE1BQyBDb250cm9sIFJYIEZyYW1lIENvdW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVW5zdXBwb3J0ZWRPcGNvZGVzUmVjZWl2ZWQgICAgICBFTUFDX1JYQ19PUENPREUgICAgLyogVW5zdXBwb3J0ZWQgT3AtQ29kZSBSWCBGcmFtZSBDb3VudCAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBQQVVTRU1BQ0N0cmxGcmFtZXNSZWNlaXZlZCAgICAgIEVNQUNfUlhDX1BBVVNFICAgICAvKiBNQUMgQ29udHJvbCBQYXVzZSBSWCBGcmFtZSBDb3VudCAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEZyYW1lc1JlY2VpdmVkQWxsICAgICAgICAgICAgICAgRU1BQ19SWENfQUxMRlJNICAgIC8qIE92ZXJhbGwgUlggRnJhbWUgQ291bnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgT2N0ZXRzUmVjZWl2ZWRBbGwgICAgICAgICAgICAgICBFTUFDX1JYQ19BTExPQ1QgICAgLyogT3ZlcmFsbCBSWCBPY3RldCBDb3VudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBUeXBlZEZyYW1lc1JlY2VpdmVkICAgICAgICAgICAgIEVNQUNfUlhDX1RZUEVEICAgICAvKiBUeXBlL0xlbmd0aCBDb25zaXN0ZW50IFJYIEZyYW1lIENvdW50ICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEZyYW1lc0xlbkx0NjRSZWNlaXZlZCAgICAgICAgICAgRU1BQ19SWENfU0hPUlQgICAgIC8qIFJYIEZyYW1lIEZyYWdtZW50IENvdW50IC0gQnl0ZSBDb3VudCB4IDwgNjQgICAgICAgICAgKi8KKyNkZWZpbmUgRnJhbWVzTGVuRXE2NFJlY2VpdmVkICAgICAgICAgICBFTUFDX1JYQ19FUTY0ICAgICAgLyogR29vZCBSWCBGcmFtZSBDb3VudCAtIEJ5dGUgQ291bnQgeCA9IDY0ICAgICAgICAgICAgICAqLworI2RlZmluZSBGcmFtZXNMZW42NV8xMjdSZWNlaXZlZCAgICAgICAgIEVNQUNfUlhDX0xUMTI4ICAgICAvKiBHb29kIFJYIEZyYW1lIENvdW50IC0gQnl0ZSBDb3VudCAgNjQgPCB4IDwgMTI4ICAgICAgICovCisjZGVmaW5lIEZyYW1lc0xlbjEyOF8yNTVSZWNlaXZlZCAgICAgICAgRU1BQ19SWENfTFQyNTYgICAgIC8qIEdvb2QgUlggRnJhbWUgQ291bnQgLSBCeXRlIENvdW50IDEyOCA8PSB4IDwgMjU2ICAgICAgKi8KKyNkZWZpbmUgRnJhbWVzTGVuMjU2XzUxMVJlY2VpdmVkICAgICAgICBFTUFDX1JYQ19MVDUxMiAgICAgLyogR29vZCBSWCBGcmFtZSBDb3VudCAtIEJ5dGUgQ291bnQgMjU2IDw9IHggPCA1MTIgICAgICAqLworI2RlZmluZSBGcmFtZXNMZW41MTJfMTAyM1JlY2VpdmVkICAgICAgIEVNQUNfUlhDX0xUMTAyNCAgICAvKiBHb29kIFJYIEZyYW1lIENvdW50IC0gQnl0ZSBDb3VudCA1MTIgPD0geCA8IDEwMjQgICAgICovCisjZGVmaW5lIEZyYW1lc0xlbjEwMjRfTWF4UmVjZWl2ZWQgICAgICAgRU1BQ19SWENfR0UxMDI0ICAgIC8qIEdvb2QgUlggRnJhbWUgQ291bnQgLSBCeXRlIENvdW50IHggPj0gMTAyNCAgICAgICAgICAgKi8KKworI2RlZmluZSBGcmFtZXNUcmFuc21pdHRlZE9LICAgICAgICAgICAgIEVNQUNfVFhDX09LICAgICAgICAvKiBUWCBGcmFtZSBTdWNjZXNzZnVsIENvdW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFNpbmdsZUNvbGxpc2lvbkZyYW1lcyAgICAgICAgICAgRU1BQ19UWENfMUNPTCAgICAgIC8qIFRYIEZyYW1lcyBTdWNjZXNzZnVsIEFmdGVyIFNpbmdsZSBDb2xsaXNpb24gQ291bnQgICAgKi8KKyNkZWZpbmUgTXVsdGlwbGVDb2xsaXNpb25GcmFtZXMgICAgICAgICBFTUFDX1RYQ19HVDFDT0wgICAgLyogVFggRnJhbWVzIFN1Y2Nlc3NmdWwgQWZ0ZXIgTXVsdGlwbGUgQ29sbGlzaW9ucyBDb3VudCAqLworI2RlZmluZSBPY3RldHNUcmFuc21pdHRlZE9LICAgICAgICAgICAgIEVNQUNfVFhDX09DVEVUICAgICAvKiBUWCBPY3RldHMgU3VjY2Vzc2Z1bGx5IFJlY2VpdmVkIENvdW50ICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEZyYW1lc1dpdGhEZWZlcnJlZFhtaXNzaW9ucyAgICAgRU1BQ19UWENfREVGRVIgICAgIC8qIFRYIEZyYW1lIERlbGF5ZWQgRHVlIFRvIEJ1c3kgQ291bnQgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTGF0ZUNvbGxpc2lvbnMgICAgICAgICAgICAgICAgICBFTUFDX1RYQ19MQVRFQ0wgICAgLyogTGF0ZSBUWCBDb2xsaXNpb25zIENvdW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBGcmFtZXNBYm9ydGVkRHVlVG9YU0NvbGxzICAgICAgIEVNQUNfVFhDX1hTX0NPTCAgICAvKiBUWCBGcmFtZSBGYWlsZWQgRHVlIFRvIEV4Y2Vzc2l2ZSBDb2xsaXNpb25zIENvdW50ICAgICovCisjZGVmaW5lIEZyYW1lc0xvc3REdWVUb0ludE1hY1htaXRFcnJvciAgRU1BQ19UWENfRE1BVU5EICAgIC8qIEludGVybmFsIE1BQyBTdWJsYXllciBFcnJvciBUWCBGcmFtZSBDb3VudCAgICAgICAgICAgKi8KKyNkZWZpbmUgQ2FycmllclNlbnNlRXJyb3JzICAgICAgICAgICAgICBFTUFDX1RYQ19DUlNFUlIgICAgLyogQ2FycmllciBTZW5zZSBEZWFzc2VydGVkIER1cmluZyBUWCBGcmFtZSBDb3VudCAgICAgICAqLworI2RlZmluZSBVbmljYXN0RnJhbWVzWG1pdHRlZE9LICAgICAgICAgIEVNQUNfVFhDX1VOSUNTVCAgICAvKiBVbmljYXN0IFRYIEZyYW1lIENvdW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIE11bHRpY2FzdEZyYW1lc1htaXR0ZWRPSyAgICAgICAgRU1BQ19UWENfTVVMVEkgICAgIC8qIE11bHRpY2FzdCBUWCBGcmFtZSBDb3VudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQnJvYWRjYXN0RnJhbWVzWG1pdHRlZE9LICAgICAgICBFTUFDX1RYQ19CUk9BRCAgICAgLyogQnJvYWRjYXN0IFRYIEZyYW1lIENvdW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBGcmFtZXNXaXRoRXhjZXNzaXZlRGVmZXJyYWwgICAgIEVNQUNfVFhDX1hTX0RGUiAgICAvKiBUWCBGcmFtZXMgV2l0aCBFeGNlc3NpdmUgRGVmZXJyYWwgQ291bnQgICAgICAgICAgICAgICovCisjZGVmaW5lIE1BQ0NvbnRyb2xGcmFtZXNUcmFuc21pdHRlZCAgICAgRU1BQ19UWENfTUFDQ1RMICAgIC8qIE1BQyBDb250cm9sIFRYIEZyYW1lIENvdW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRnJhbWVzVHJhbnNtaXR0ZWRBbGwgICAgICAgICAgICBFTUFDX1RYQ19BTExGUk0gICAgLyogT3ZlcmFsbCBUWCBGcmFtZSBDb3VudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBPY3RldHNUcmFuc21pdHRlZEFsbCAgICAgICAgICAgIEVNQUNfVFhDX0FMTE9DVCAgICAvKiBPdmVyYWxsIFRYIE9jdGV0IENvdW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEZyYW1lc0xlbkVxNjRUcmFuc21pdHRlZCAgICAgICAgRU1BQ19UWENfRVE2NCAgICAgIC8qIEdvb2QgVFggRnJhbWUgQ291bnQgLSBCeXRlIENvdW50IHggPSA2NCAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRnJhbWVzTGVuNjVfMTI3VHJhbnNtaXR0ZWQgICAgICBFTUFDX1RYQ19MVDEyOCAgICAgLyogR29vZCBUWCBGcmFtZSBDb3VudCAtIEJ5dGUgQ291bnQgIDY0IDwgeCA8IDEyOCAgICAgICAqLworI2RlZmluZSBGcmFtZXNMZW4xMjhfMjU1VHJhbnNtaXR0ZWQgICAgIEVNQUNfVFhDX0xUMjU2ICAgICAvKiBHb29kIFRYIEZyYW1lIENvdW50IC0gQnl0ZSBDb3VudCAxMjggPD0geCA8IDI1NiAgICAgICovCisjZGVmaW5lIEZyYW1lc0xlbjI1Nl81MTFUcmFuc21pdHRlZCAgICAgRU1BQ19UWENfTFQ1MTIgICAgIC8qIEdvb2QgVFggRnJhbWUgQ291bnQgLSBCeXRlIENvdW50IDI1NiA8PSB4IDwgNTEyICAgICAgKi8KKyNkZWZpbmUgRnJhbWVzTGVuNTEyXzEwMjNUcmFuc21pdHRlZCAgICBFTUFDX1RYQ19MVDEwMjQgICAgLyogR29vZCBUWCBGcmFtZSBDb3VudCAtIEJ5dGUgQ291bnQgNTEyIDw9IHggPCAxMDI0ICAgICAqLworI2RlZmluZSBGcmFtZXNMZW4xMDI0X01heFRyYW5zbWl0dGVkICAgIEVNQUNfVFhDX0dFMTAyNCAgICAvKiBHb29kIFRYIEZyYW1lIENvdW50IC0gQnl0ZSBDb3VudCB4ID49IDEwMjQgICAgICAgICAgICovCisjZGVmaW5lIFR4QWJvcnRlZEZyYW1lcyAgICAgICAgICAgICAgICAgRU1BQ19UWENfQUJPUlQgICAgIC8qIFRvdGFsIFRYIEZyYW1lcyBBYm9ydGVkIENvdW50ICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKiBTeXN0ZW0gTU1SIFJlZ2lzdGVyIEJpdHMgQW5kIE1hY3JvcworKioKKyoqIERpc2NsYWltZXI6CUFsbCBtYWNyb3MgYXJlIGludGVuZGVkIHRvIG1ha2UgQyBhbmQgQXNzZW1ibHkgY29kZSBtb3JlIHJlYWRhYmxlLgorKioJCQkJVXNlIHRoZXNlIG1hY3JvcyBjYXJlZnVsbHksIGFzIGFueSB0aGF0IGRvIGxlZnQgc2hpZnRzIGZvciBmaWVsZAorKioJCQkJZGVwb3NpdGluZyB3aWxsIHJlc3VsdCBpbiB0aGUgbG93ZXIgb3JkZXIgYml0cyBiZWluZyBkZXN0cm95ZWQuICBBbnkKKyoqCQkJCW1hY3JvIHRoYXQgc2hpZnRzIGxlZnQgdG8gcHJvcGVybHkgcG9zaXRpb24gdGhlIGJpdC1maWVsZCBzaG91bGQgYmUKKyoqCQkJCXVzZWQgYXMgcGFydCBvZiBhbiBPUiB0byBpbml0aWFsaXplIGEgcmVnaXN0ZXIgYW5kIE5PVCBhcyBhIGR5bmFtaWMKKyoqCQkJCW1vZGlmaWVyIFVOTEVTUyB0aGUgbG93ZXIgb3JkZXIgYml0cyBhcmUgc2F2ZWQgYW5kIE9SZWQgYmFjayBpbiB3aGVuCisqKgkJCQl0aGUgbWFjcm8gaXMgdXNlZC4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogIEVUSEVSTkVUIDEwLzEwMCBDT05UUk9MTEVSIE1BU0tTICAqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIEVNQUNfT1BNT0RFIE1hc2tzICovCisKKyNkZWZpbmUJUkUgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEgICAgIC8qIFJlY2VpdmVyIEVuYWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCUFTVFAgICAgICAgICAgICAgICAweDAwMDAwMDAyICAgICAvKiBFbmFibGUgQXV0b21hdGljIFBhZCBTdHJpcHBpbmcgT24gUlggRnJhbWVzICAgICAgICAqLworI2RlZmluZQlIVSAgICAgICAgICAgICAgICAgMHgwMDAwMDAxMCAgICAgLyogSGFzaCBGaWx0ZXIgVW5pY2FzdCBBZGRyZXNzICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJSE0gICAgICAgICAgICAgICAgIDB4MDAwMDAwMjAgICAgIC8qIEhhc2ggRmlsdGVyIE11bHRpY2FzdCBBZGRyZXNzICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVBBTSAgICAgICAgICAgICAgICAweDAwMDAwMDQwICAgICAvKiBQYXNzLUFsbC1NdWx0aWNhc3QgTW9kZSBFbmFibGUgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlQUiAgICAgICAgICAgICAgICAgMHgwMDAwMDA4MCAgICAgLyogUHJvbWlzY3VvdXMgTW9kZSBFbmFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJSUZFICAgICAgICAgICAgICAgIDB4MDAwMDAxMDAgICAgIC8qIEludmVyc2UgRmlsdGVyaW5nIEVuYWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCURCRiAgICAgICAgICAgICAgICAweDAwMDAwMjAwICAgICAvKiBEaXNhYmxlIEJyb2FkY2FzdCBGcmFtZSBSZWNlcHRpb24gICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlQQkYgICAgICAgICAgICAgICAgMHgwMDAwMDQwMCAgICAgLyogUGFzcyBCYWQgRnJhbWVzIEVuYWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJUFNGICAgICAgICAgICAgICAgIDB4MDAwMDA4MDAgICAgIC8qIFBhc3MgU2hvcnQgRnJhbWVzIEVuYWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVJBRiAgICAgICAgICAgICAgICAweDAwMDAxMDAwICAgICAvKiBSZWNlaXZlLUFsbCBNb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlURSAgICAgICAgICAgICAgICAgMHgwMDAxMDAwMCAgICAgLyogVHJhbnNtaXR0ZXIgRW5hYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJRFRYUEFEICAgICAgICAgICAgIDB4MDAwMjAwMDAgICAgIC8qIERpc2FibGUgQXV0b21hdGljIFRYIFBhZGRpbmcgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCURUWENSQyAgICAgICAgICAgICAweDAwMDQwMDAwICAgICAvKiBEaXNhYmxlIEF1dG9tYXRpYyBUWCBDUkMgR2VuZXJhdGlvbiAgICAgICAgICAgICAgICAqLworI2RlZmluZQlEQyAgICAgICAgICAgICAgICAgMHgwMDA4MDAwMCAgICAgLyogRGVmZXJyYWwgQ2hlY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJQk9MTVQgICAgICAgICAgICAgIDB4MDAzMDAwMDAgICAgIC8qIEJhY2stT2ZmIExpbWl0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCUJPTE1UXzEwICAgICAgICAgICAweDAwMDAwMDAwICAgICAvKgkJMTAtYml0IHJhbmdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCUJPTE1UXzggICAgICAgICAgICAweDAwMTAwMDAwICAgICAvKgkJOC1iaXQgcmFuZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCUJPTE1UXzQgICAgICAgICAgICAweDAwMjAwMDAwICAgICAvKgkJNC1iaXQgcmFuZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCUJPTE1UXzEgICAgICAgICAgICAweDAwMzAwMDAwICAgICAvKgkJMS1iaXQgcmFuZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCURSVFkgICAgICAgICAgICAgICAweDAwNDAwMDAwICAgICAvKiBEaXNhYmxlIFRYIFJldHJ5IE9uIENvbGxpc2lvbiAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlMQ1RSRSAgICAgICAgICAgICAgMHgwMDgwMDAwMCAgICAgLyogRW5hYmxlIFRYIFJldHJ5IE9uIExhdGUgQ29sbGlzaW9uICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJUk1JSSAgICAgICAgICAgICAgIDB4MDEwMDAwMDAgICAgIC8qIFJNSUkvTUlJKiBNb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVJNSUlfMTAgICAgICAgICAgICAweDAyMDAwMDAwICAgICAvKiBTcGVlZCBTZWxlY3QgZm9yIFJNSUkgUG9ydCAoMTBNQml0LzEwME1CaXQqKSAgICAgICAqLworI2RlZmluZQlGRE1PREUgICAgICAgICAgICAgMHgwNDAwMDAwMCAgICAgLyogRHVwbGV4IE1vZGUgRW5hYmxlIChGdWxsL0hhbGYqKSAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJTEIgICAgICAgICAgICAgICAgIDB4MDgwMDAwMDAgICAgIC8qIEludGVybmFsIExvb3BiYWNrIEVuYWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCURSTyAgICAgICAgICAgICAgICAweDEwMDAwMDAwICAgICAvKiBEaXNhYmxlIFJlY2VpdmUgT3duIEZyYW1lcyAoSGFsZi1EdXBsZXggTW9kZSkgICAgICAqLworCisvKiBFTUFDX1NUQUFERCBNYXNrcyAqLworCisjZGVmaW5lCVNUQUJVU1kgICAgICAgICAgICAweDAwMDAwMDAxICAgICAvKiBJbml0aWF0ZSBTdGF0aW9uIE1ndCBSZWcgQWNjZXNzIC8gU1RBIEJ1c3kgU3RhdCAgICAqLworI2RlZmluZQlTVEFPUCAgICAgICAgICAgICAgMHgwMDAwMDAwMiAgICAgLyogU3RhdGlvbiBNYW5hZ2VtZW50IE9wZXJhdGlvbiBDb2RlIChXcml0ZS9SZWFkKikgICAgKi8KKyNkZWZpbmUJU1RBRElTUFJFICAgICAgICAgIDB4MDAwMDAwMDQgICAgIC8qIERpc2FibGUgUHJlYW1ibGUgR2VuZXJhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVNUQUlFICAgICAgICAgICAgICAweDAwMDAwMDA4ICAgICAvKiBTdGF0aW9uIE1ndC4gVHJhbnNmZXIgRG9uZSBJbnRlcnJ1cHQgRW5hYmxlICAgICAgICAqLworI2RlZmluZQlSRUdBRCAgICAgICAgICAgICAgMHgwMDAwMDdDMCAgICAgLyogU1RBIFJlZ2lzdGVyIEFkZHJlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJUEhZQUQgICAgICAgICAgICAgIDB4MDAwMEY4MDAgICAgIC8qIFBIWSBEZXZpY2UgQWRkcmVzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyNkZWZpbmUJU0VUX1JFR0FEKHgpICgoKHgpJjB4MUYpPDwgIDYgKSAgIC8qIFNldCBTVEEgUmVnaXN0ZXIgQWRkcmVzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVNFVF9QSFlBRCh4KSAoKCh4KSYweDFGKTw8IDExICkgICAvKiBTZXQgUEhZIERldmljZSBBZGRyZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisvKiBFTUFDX1NUQURBVCBNYXNrICovCisKKyNkZWZpbmUJU1RBREFUQSAgICAgICAgICAgIDB4MDAwMEZGRkYgICAgIC8qIFN0YXRpb24gTWFuYWdlbWVudCBEYXRhICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKy8qIEVNQUNfRkxDIE1hc2tzICovCisKKyNkZWZpbmUJRkxDQlVTWSAgICAgICAgICAgIDB4MDAwMDAwMDEgICAgIC8qIFNlbmQgRmxvdyBDdHJsIEZyYW1lIC8gRmxvdyBDdHJsIEJ1c3kgU3RhdHVzICAgICAgICovCisjZGVmaW5lCUZMQ0UgICAgICAgICAgICAgICAweDAwMDAwMDAyICAgICAvKiBGbG93IENvbnRyb2wgRW5hYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlQQ0YgICAgICAgICAgICAgICAgMHgwMDAwMDAwNCAgICAgLyogUGFzcyBDb250cm9sIEZyYW1lcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJQktQUlNFTiAgICAgICAgICAgIDB4MDAwMDAwMDggICAgIC8qIEVuYWJsZSBCYWNrcHJlc3N1cmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCUZMQ1BBVVNFICAgICAgICAgICAweEZGRkYwMDAwICAgICAvKiBQYXVzZSBUaW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisjZGVmaW5lCVNFVF9GTENQQVVTRSh4KSAoKCh4KSYweEZGRkYpPDwgMTYpIC8qIFNldCBQYXVzZSBUaW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisvKiBFTUFDX1dLVVBfQ1RMIE1hc2tzICovCisKKyNkZWZpbmUJQ0FQV0tGUk0gICAgICAgICAgIDB4MDAwMDAwMDEgICAgLyogQ2FwdHVyZSBXYWtlLVVwIEZyYW1lcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCU1QS0UgICAgICAgICAgICAgICAweDAwMDAwMDAyICAgIC8qIE1hZ2ljIFBhY2tldCBFbmFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlSV0tFICAgICAgICAgICAgICAgMHgwMDAwMDAwNCAgICAvKiBSZW1vdGUgV2FrZS1VcCBGcmFtZSBFbmFibGUgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJR1VXS0UgICAgICAgICAgICAgIDB4MDAwMDAwMDggICAgLyogR2xvYmFsIFVuaWNhc3QgV2FrZSBFbmFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCU1QS1MgICAgICAgICAgICAgICAweDAwMDAwMDIwICAgIC8qIE1hZ2ljIFBhY2tldCBSZWNlaXZlZCBTdGF0dXMgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlSV0tTICAgICAgICAgICAgICAgMHgwMDAwMEYwMCAgICAvKiBXYWtlLVVwIEZyYW1lIFJlY2VpdmVkIFN0YXR1cywgRmlsdGVycyAzOjAgICAgICAgICAgKi8KKworLyogRU1BQ19XS1VQX0ZGQ01EIE1hc2tzICovCisKKyNkZWZpbmUJV0YwX0UgICAgICAgICAgICAgIDB4MDAwMDAwMDEgICAgLyogRW5hYmxlIFdha2UtVXAgRmlsdGVyIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlXRjBfVCAgICAgICAgICAgICAgMHgwMDAwMDAwOCAgICAvKiBXYWtlLVVwIEZpbHRlciAwIEFkZHIgVHlwZSAoTXVsdGljYXN0L1VuaWNhc3QqKSAgICAgICovCisjZGVmaW5lCVdGMV9FICAgICAgICAgICAgICAweDAwMDAwMTAwICAgIC8qIEVuYWJsZSBXYWtlLVVwIEZpbHRlciAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJV0YxX1QgICAgICAgICAgICAgIDB4MDAwMDA4MDAgICAgLyogV2FrZS1VcCBGaWx0ZXIgMSBBZGRyIFR5cGUgKE11bHRpY2FzdC9VbmljYXN0KikgICAgICAqLworI2RlZmluZQlXRjJfRSAgICAgICAgICAgICAgMHgwMDAxMDAwMCAgICAvKiBFbmFibGUgV2FrZS1VcCBGaWx0ZXIgMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVdGMl9UICAgICAgICAgICAgICAweDAwMDgwMDAwICAgIC8qIFdha2UtVXAgRmlsdGVyIDIgQWRkciBUeXBlIChNdWx0aWNhc3QvVW5pY2FzdCopICAgICAgKi8KKyNkZWZpbmUJV0YzX0UgICAgICAgICAgICAgIDB4MDEwMDAwMDAgICAgLyogRW5hYmxlIFdha2UtVXAgRmlsdGVyIDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlXRjNfVCAgICAgICAgICAgICAgMHgwODAwMDAwMCAgICAvKiBXYWtlLVVwIEZpbHRlciAzIEFkZHIgVHlwZSAoTXVsdGljYXN0L1VuaWNhc3QqKSAgICAgICovCisKKy8qIEVNQUNfV0tVUF9GRk9GRiBNYXNrcyAqLworCisjZGVmaW5lCVdGMF9PRkYgICAgICAgICAgICAweDAwMDAwMEZGICAgIC8qIFdha2UtVXAgRmlsdGVyIDAgUGF0dGVybiBPZmZzZXQgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJV0YxX09GRiAgICAgICAgICAgIDB4MDAwMEZGMDAgICAgLyogV2FrZS1VcCBGaWx0ZXIgMSBQYXR0ZXJuIE9mZnNldCAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlXRjJfT0ZGICAgICAgICAgICAgMHgwMEZGMDAwMCAgICAvKiBXYWtlLVVwIEZpbHRlciAyIFBhdHRlcm4gT2Zmc2V0ICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVdGM19PRkYgICAgICAgICAgICAweEZGMDAwMDAwICAgIC8qIFdha2UtVXAgRmlsdGVyIDMgUGF0dGVybiBPZmZzZXQgICAgICAgICAgICAgICAgICAgICAgKi8KKworI2RlZmluZQlTRVRfV0YwX09GRih4KSAoKCh4KSYweEZGKTw8ICAwICkgLyogU2V0IFdha2UtVXAgRmlsdGVyIDAgQnl0ZSBPZmZzZXQgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVNFVF9XRjFfT0ZGKHgpICgoKHgpJjB4RkYpPDwgIDggKSAvKiBTZXQgV2FrZS1VcCBGaWx0ZXIgMSBCeXRlIE9mZnNldCAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJU0VUX1dGMl9PRkYoeCkgKCgoeCkmMHhGRik8PCAxNiApIC8qIFNldCBXYWtlLVVwIEZpbHRlciAyIEJ5dGUgT2Zmc2V0ICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlTRVRfV0YzX09GRih4KSAoKCh4KSYweEZGKTw8IDI0ICkgLyogU2V0IFdha2UtVXAgRmlsdGVyIDMgQnl0ZSBPZmZzZXQgICAgICAgICAgICAgICAgICAgICovCisvKiBTZXQgQUxMIE9mZnNldHMgKi8KKyNkZWZpbmUJU0VUX1dGX09GRlMoeDAseDEseDIseDMpIChTRVRfV0YwX09GRigoeDApKXxTRVRfV0YxX09GRigoeDEpKXxTRVRfV0YyX09GRigoeDIpKXxTRVRfV0YzX09GRigoeDMpKSkKKworLyogRU1BQ19XS1VQX0ZGQ1JDMCBNYXNrcyAqLworCisjZGVmaW5lCVdGMF9DUkMgICAgICAgICAgIDB4MDAwMEZGRkYgICAgLyogV2FrZS1VcCBGaWx0ZXIgMCBQYXR0ZXJuIENSQyAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVdGMV9DUkMgICAgICAgICAgIDB4RkZGRjAwMDAgICAgLyogV2FrZS1VcCBGaWx0ZXIgMSBQYXR0ZXJuIENSQyAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyNkZWZpbmUJU0VUX1dGMF9DUkMoeCkgKCgoeCkmMHhGRkZGKTw8ICAgMCApIC8qIFNldCBXYWtlLVVwIEZpbHRlciAwIFRhcmdldCBDUkMgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJU0VUX1dGMV9DUkMoeCkgKCgoeCkmMHhGRkZGKTw8ICAxNiApIC8qIFNldCBXYWtlLVVwIEZpbHRlciAxIFRhcmdldCBDUkMgICAgICAgICAgICAgICAgICAgKi8KKworLyogRU1BQ19XS1VQX0ZGQ1JDMSBNYXNrcyAqLworCisjZGVmaW5lCVdGMl9DUkMgICAgICAgICAgIDB4MDAwMEZGRkYgICAgLyogV2FrZS1VcCBGaWx0ZXIgMiBQYXR0ZXJuIENSQyAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVdGM19DUkMgICAgICAgICAgIDB4RkZGRjAwMDAgICAgLyogV2FrZS1VcCBGaWx0ZXIgMyBQYXR0ZXJuIENSQyAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyNkZWZpbmUJU0VUX1dGMl9DUkMoeCkgKCgoeCkmMHhGRkZGKTw8ICAgMCApIC8qIFNldCBXYWtlLVVwIEZpbHRlciAyIFRhcmdldCBDUkMgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJU0VUX1dGM19DUkMoeCkgKCgoeCkmMHhGRkZGKTw8ICAxNiApIC8qIFNldCBXYWtlLVVwIEZpbHRlciAzIFRhcmdldCBDUkMgICAgICAgICAgICAgICAgICAgKi8KKworLyogRU1BQ19TWVNDVEwgTWFza3MgKi8KKworI2RlZmluZQlQSFlJRSAgICAgICAgICAgICAweDAwMDAwMDAxICAgIC8qIFBIWV9JTlQgSW50ZXJydXB0IEVuYWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlSWERXQSAgICAgICAgICAgICAweDAwMDAwMDAyICAgIC8qIFJlY2VpdmUgRnJhbWUgRE1BIFdvcmQgQWxpZ25tZW50IChPZGQvRXZlbiopICAgICAgICAgICAqLworI2RlZmluZQlSWENLUyAgICAgICAgICAgICAweDAwMDAwMDA0ICAgIC8qIEVuYWJsZSBSWCBGcmFtZSBUQ1AvVURQIENoZWNrc3VtIENvbXB1dGF0aW9uICAgICAgICAgICAqLworI2RlZmluZQlUWERXQSAgICAgICAgICAgICAweDAwMDAwMDEwICAgIC8qIFRyYW5zbWl0IEZyYW1lIERNQSBXb3JkIEFsaWdubWVudCAoT2RkL0V2ZW4qKSAgICAgICAgICAqLworI2RlZmluZQlNRENESVYgICAgICAgICAgICAweDAwMDAzRjAwICAgIC8qIFNDTEs6TURDIENsb2NrIERpdmlzb3IgW01EQz1TQ0xLLygyKihOKzEpKV0gICAgICAgICAgICAqLworCisjZGVmaW5lCVNFVF9NRENESVYoeCkgKCgoeCkmMHgzRik8PCA4KSAgIC8qIFNldCBNREMgQ2xvY2sgRGl2aXNvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKy8qIEVNQUNfU1lTVEFUIE1hc2tzICovCisKKyNkZWZpbmUJUEhZSU5UICAgICAgICAgICAgMHgwMDAwMDAwMSAgICAvKiBQSFlfSU5UIEludGVycnVwdCBTdGF0dXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJTU1DSU5UICAgICAgICAgICAgMHgwMDAwMDAwMiAgICAvKiBNTUMgQ291bnRlciBJbnRlcnJ1cHQgU3RhdHVzICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJUlhGU0lOVCAgICAgICAgICAgMHgwMDAwMDAwNCAgICAvKiBSWCBGcmFtZS1TdGF0dXMgSW50ZXJydXB0IFN0YXR1cyAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJVFhGU0lOVCAgICAgICAgICAgMHgwMDAwMDAwOCAgICAvKiBUWCBGcmFtZS1TdGF0dXMgSW50ZXJydXB0IFN0YXR1cyAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJV0FLRURFVCAgICAgICAgICAgMHgwMDAwMDAxMCAgICAvKiBXYWtlLVVwIERldGVjdGVkIFN0YXR1cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJUlhETUFFUlIgICAgICAgICAgMHgwMDAwMDAyMCAgICAvKiBSWCBETUEgRGlyZWN0aW9uIEVycm9yIFN0YXR1cyAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJVFhETUFFUlIgICAgICAgICAgMHgwMDAwMDA0MCAgICAvKiBUWCBETUEgRGlyZWN0aW9uIEVycm9yIFN0YXR1cyAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJU1RNRE9ORSAgICAgICAgICAgMHgwMDAwMDA4MCAgICAvKiBTdGF0aW9uIE1ndC4gVHJhbnNmZXIgRG9uZSBJbnRlcnJ1cHQgU3RhdHVzICAgICAgICAgICAgKi8KKworLyogRU1BQ19SWF9TVEFULCBFTUFDX1JYX1NUS1ksIGFuZCBFTUFDX1JYX0lSUUUgTWFza3MgKi8KKworI2RlZmluZQlSWF9GUkxFTiAgICAgICAgICAweDAwMDAwN0ZGICAgIC8qIEZyYW1lIExlbmd0aCBJbiBCeXRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlSWF9DT01QICAgICAgICAgICAweDAwMDAxMDAwICAgIC8qIFJYIEZyYW1lIENvbXBsZXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlSWF9PSyAgICAgICAgICAgICAweDAwMDAyMDAwICAgIC8qIFJYIEZyYW1lIFJlY2VpdmVkIFdpdGggTm8gRXJyb3JzICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlSWF9MT05HICAgICAgICAgICAweDAwMDA0MDAwICAgIC8qIFJYIEZyYW1lIFRvbyBMb25nIEVycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlSWF9BTElHTiAgICAgICAgICAweDAwMDA4MDAwICAgIC8qIFJYIEZyYW1lIEFsaWdubWVudCBFcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlSWF9DUkMgICAgICAgICAgICAweDAwMDEwMDAwICAgIC8qIFJYIEZyYW1lIENSQyBFcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlSWF9MRU4gICAgICAgICAgICAweDAwMDIwMDAwICAgIC8qIFJYIEZyYW1lIExlbmd0aCBFcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlSWF9GUkFHICAgICAgICAgICAweDAwMDQwMDAwICAgIC8qIFJYIEZyYW1lIEZyYWdtZW50IEVycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlSWF9BRERSICAgICAgICAgICAweDAwMDgwMDAwICAgIC8qIFJYIEZyYW1lIEFkZHJlc3MgRmlsdGVyIEZhaWxlZCBFcnJvciAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlSWF9ETUFPICAgICAgICAgICAweDAwMTAwMDAwICAgIC8qIFJYIEZyYW1lIERNQSBPdmVycnVuIEVycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlSWF9QSFkgICAgICAgICAgICAweDAwMjAwMDAwICAgIC8qIFJYIEZyYW1lIFBIWSBFcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlSWF9MQVRFICAgICAgICAgICAweDAwNDAwMDAwICAgIC8qIFJYIEZyYW1lIExhdGUgQ29sbGlzaW9uIEVycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlSWF9SQU5HRSAgICAgICAgICAweDAwODAwMDAwICAgIC8qIFJYIEZyYW1lIExlbmd0aCBGaWVsZCBPdXQgb2YgUmFuZ2UgRXJyb3IgICAgICAgICAgICAgICAqLworI2RlZmluZQlSWF9NVUxUSSAgICAgICAgICAweDAxMDAwMDAwICAgIC8qIFJYIE11bHRpY2FzdCBGcmFtZSBJbmRpY2F0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlSWF9CUk9BRCAgICAgICAgICAweDAyMDAwMDAwICAgIC8qIFJYIEJyb2FkY2FzdCBGcmFtZSBJbmRpY2F0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlSWF9DVEwgICAgICAgICAgICAweDA0MDAwMDAwICAgIC8qIFJYIENvbnRyb2wgRnJhbWUgSW5kaWNhdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlSWF9VQ1RMICAgICAgICAgICAweDA4MDAwMDAwICAgIC8qIFVuc3VwcG9ydGVkIFJYIENvbnRyb2wgRnJhbWUgSW5kaWNhdG9yICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlSWF9UWVBFICAgICAgICAgICAweDEwMDAwMDAwICAgIC8qIFJYIFR5cGVkIEZyYW1lIEluZGljYXRvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlSWF9WTEFOMSAgICAgICAgICAweDIwMDAwMDAwICAgIC8qIFJYIFZMQU4xIEZyYW1lIEluZGljYXRvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlSWF9WTEFOMiAgICAgICAgICAweDQwMDAwMDAwICAgIC8qIFJYIFZMQU4yIEZyYW1lIEluZGljYXRvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlSWF9BQ0NFUFQgICAgICAgICAweDgwMDAwMDAwICAgIC8qIFJYIEZyYW1lIEFjY2VwdGVkIEluZGljYXRvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisvKiAgRU1BQ19UWF9TVEFULCBFTUFDX1RYX1NUS1ksIGFuZCBFTUFDX1RYX0lSUUUgTWFza3MgICovCisKKyNkZWZpbmUJVFhfQ09NUCAgICAgICAgICAgMHgwMDAwMDAwMSAgICAvKiBUWCBGcmFtZSBDb21wbGV0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJVFhfT0sgICAgICAgICAgICAgMHgwMDAwMDAwMiAgICAvKiBUWCBGcmFtZSBTZW50IFdpdGggTm8gRXJyb3JzICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJVFhfRUNPTEwgICAgICAgICAgMHgwMDAwMDAwNCAgICAvKiBUWCBGcmFtZSBFeGNlc3NpdmUgQ29sbGlzaW9uIEVycm9yICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJVFhfTEFURSAgICAgICAgICAgMHgwMDAwMDAwOCAgICAvKiBUWCBGcmFtZSBMYXRlIENvbGxpc2lvbiBFcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJVFhfRE1BVSAgICAgICAgICAgMHgwMDAwMDAxMCAgICAvKiBUWCBGcmFtZSBETUEgVW5kZXJydW4gRXJyb3IgKFNUQVQpICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJVFhfTUFDRSAgICAgICAgICAgMHgwMDAwMDAxMCAgICAvKiBJbnRlcm5hbCBNQUMgRXJyb3IgRGV0ZWN0ZWQgKFNUS1kgYW5kIElSUUUpICAgICAgICAgICAgKi8KKyNkZWZpbmUJVFhfRURFRkVSICAgICAgICAgMHgwMDAwMDAyMCAgICAvKiBUWCBGcmFtZSBFeGNlc3NpdmUgRGVmZXJyYWwgRXJyb3IgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJVFhfQlJPQUQgICAgICAgICAgMHgwMDAwMDA0MCAgICAvKiBUWCBCcm9hZGNhc3QgRnJhbWUgSW5kaWNhdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJVFhfTVVMVEkgICAgICAgICAgMHgwMDAwMDA4MCAgICAvKiBUWCBNdWx0aWNhc3QgRnJhbWUgSW5kaWNhdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJVFhfQ0NOVCAgICAgICAgICAgMHgwMDAwMEYwMCAgICAvKiBUWCBGcmFtZSBDb2xsaXNpb24gQ291bnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJVFhfREVGRVIgICAgICAgICAgMHgwMDAwMTAwMCAgICAvKiBUWCBGcmFtZSBEZWZlcnJlZCBJbmRpY2F0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJVFhfQ1JTICAgICAgICAgICAgMHgwMDAwMjAwMCAgICAvKiBUWCBGcmFtZSBDYXJyaWVyIFNlbnNlIE5vdCBBc3NlcnRlZCBFcnJvciAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJVFhfTE9TUyAgICAgICAgICAgMHgwMDAwNDAwMCAgICAvKiBUWCBGcmFtZSBDYXJyaWVyIExvc3QgRHVyaW5nIFRYIEVycm9yICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJVFhfUkVUUlkgICAgICAgICAgMHgwMDAwODAwMCAgICAvKiBUWCBGcmFtZSBTdWNjZXNzZnVsIEFmdGVyIFJldHJ5ICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJVFhfRlJMRU4gICAgICAgICAgMHgwN0ZGMDAwMCAgICAvKiBUWCBGcmFtZSBMZW5ndGggKEJ5dGVzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworLyogRU1BQ19NTUNfQ1RMIE1hc2tzICovCisjZGVmaW5lCVJTVEMgICAgICAgICAgICAgIDB4MDAwMDAwMDEgICAgLyogUmVzZXQgQWxsIENvdW50ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCUNST0xMICAgICAgICAgICAgIDB4MDAwMDAwMDIgICAgLyogQ291bnRlciBSb2xsLU92ZXIgRW5hYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCUNDT1IgICAgICAgICAgICAgIDB4MDAwMDAwMDQgICAgLyogQ291bnRlciBDbGVhci1Pbi1SZWFkIE1vZGUgRW5hYmxlICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCU1NQ0UgICAgICAgICAgICAgIDB4MDAwMDAwMDggICAgLyogRW5hYmxlIE1NQyBDb3VudGVyIE9wZXJhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKy8qIEVNQUNfTU1DX1JJUlFTIGFuZCBFTUFDX01NQ19SSVJRRSBNYXNrcyAqLworI2RlZmluZQlSWF9PS19DTlQgICAgICAgICAweDAwMDAwMDAxICAgIC8qIFJYIEZyYW1lcyBSZWNlaXZlZCBXaXRoIE5vIEVycm9ycyAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlSWF9GQ1NfQ05UICAgICAgICAweDAwMDAwMDAyICAgIC8qIFJYIEZyYW1lcyBXL0ZyYW1lIENoZWNrIFNlcXVlbmNlIEVycm9ycyAgICAgICAgICAgICAgICAqLworI2RlZmluZQlSWF9BTElHTl9DTlQgICAgICAweDAwMDAwMDA0ICAgIC8qIFJYIEZyYW1lcyBXaXRoIEFsaWdubWVudCBFcnJvcnMgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlSWF9PQ1RFVF9DTlQgICAgICAweDAwMDAwMDA4ICAgIC8qIFJYIE9jdGV0cyBSZWNlaXZlZCBPSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlSWF9MT1NUX0NOVCAgICAgICAweDAwMDAwMDEwICAgIC8qIFJYIEZyYW1lcyBMb3N0IER1ZSBUbyBJbnRlcm5hbCBNQUMgUlggRXJyb3IgICAgICAgICAgICAqLworI2RlZmluZQlSWF9VTklfQ05UICAgICAgICAweDAwMDAwMDIwICAgIC8qIFVuaWNhc3QgUlggRnJhbWVzIFJlY2VpdmVkIE9LICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlSWF9NVUxUSV9DTlQgICAgICAweDAwMDAwMDQwICAgIC8qIE11bHRpY2FzdCBSWCBGcmFtZXMgUmVjZWl2ZWQgT0sgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlSWF9CUk9BRF9DTlQgICAgICAweDAwMDAwMDgwICAgIC8qIEJyb2FkY2FzdCBSWCBGcmFtZXMgUmVjZWl2ZWQgT0sgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlSWF9JUkxfQ05UICAgICAgICAweDAwMDAwMTAwICAgIC8qIFJYIEZyYW1lcyBXaXRoIEluLVJhbmdlIExlbmd0aCBFcnJvcnMgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlSWF9PUkxfQ05UICAgICAgICAweDAwMDAwMjAwICAgIC8qIFJYIEZyYW1lcyBXaXRoIE91dC1PZi1SYW5nZSBMZW5ndGggRXJyb3JzICAgICAgICAgICAgICAqLworI2RlZmluZQlSWF9MT05HX0NOVCAgICAgICAweDAwMDAwNDAwICAgIC8qIFJYIEZyYW1lcyBXaXRoIEZyYW1lIFRvbyBMb25nIEVycm9ycyAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlSWF9NQUNDVExfQ05UICAgICAweDAwMDAwODAwICAgIC8qIE1BQyBDb250cm9sIFJYIEZyYW1lcyBSZWNlaXZlZCAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlSWF9PUENPREVfQ1RMICAgICAweDAwMDAxMDAwICAgIC8qIFVuc3VwcG9ydGVkIE9wLUNvZGUgUlggRnJhbWVzIFJlY2VpdmVkICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlSWF9QQVVTRV9DTlQgICAgICAweDAwMDAyMDAwICAgIC8qIFBBVVNFTUFDIENvbnRyb2wgUlggRnJhbWVzIFJlY2VpdmVkICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlSWF9BTExGX0NOVCAgICAgICAweDAwMDA0MDAwICAgIC8qIEFsbCBSWCBGcmFtZXMgUmVjZWl2ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlSWF9BTExPX0NOVCAgICAgICAweDAwMDA4MDAwICAgIC8qIEFsbCBSWCBPY3RldHMgUmVjZWl2ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlSWF9UWVBFRF9DTlQgICAgICAweDAwMDEwMDAwICAgIC8qIFR5cGVkIFJYIEZyYW1lcyBSZWNlaXZlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlSWF9TSE9SVF9DTlQgICAgICAweDAwMDIwMDAwICAgIC8qIFJYIEZyYW1lIEZyYWdtZW50cyAoPCA2NCBCeXRlcykgUmVjZWl2ZWQgICAgICAgICAgICAgICAqLworI2RlZmluZQlSWF9FUTY0X0NOVCAgICAgICAweDAwMDQwMDAwICAgIC8qIDY0LUJ5dGUgUlggRnJhbWVzIFJlY2VpdmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlSWF9MVDEyOF9DTlQgICAgICAweDAwMDgwMDAwICAgIC8qIDY1LTEyNy1CeXRlIFJYIEZyYW1lcyBSZWNlaXZlZCAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlSWF9MVDI1Nl9DTlQgICAgICAweDAwMTAwMDAwICAgIC8qIDEyOC0yNTUtQnl0ZSBSWCBGcmFtZXMgUmVjZWl2ZWQgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlSWF9MVDUxMl9DTlQgICAgICAweDAwMjAwMDAwICAgIC8qIDI1Ni01MTEtQnl0ZSBSWCBGcmFtZXMgUmVjZWl2ZWQgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlSWF9MVDEwMjRfQ05UICAgICAweDAwNDAwMDAwICAgIC8qIDUxMi0xMDIzLUJ5dGUgUlggRnJhbWVzIFJlY2VpdmVkICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlSWF9HRTEwMjRfQ05UICAgICAweDAwODAwMDAwICAgIC8qIDEwMjQtTWF4LUJ5dGUgUlggRnJhbWVzIFJlY2VpdmVkICAgICAgICAgICAgICAgICAgICAgICAqLworCisvKiBFTUFDX01NQ19USVJRUyBhbmQgRU1BQ19NTUNfVElSUUUgTWFza3MgICovCisKKyNkZWZpbmUJVFhfT0tfQ05UICAgICAgICAgMHgwMDAwMDAwMSAgICAvKiBUWCBGcmFtZXMgU2VudCBPSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJVFhfU0NPTExfQ05UICAgICAgMHgwMDAwMDAwMiAgICAvKiBUWCBGcmFtZXMgV2l0aCBTaW5nbGUgQ29sbGlzaW9ucyAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJVFhfTUNPTExfQ05UICAgICAgMHgwMDAwMDAwNCAgICAvKiBUWCBGcmFtZXMgV2l0aCBNdWx0aXBsZSBDb2xsaXNpb25zICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJVFhfT0NURVRfQ05UICAgICAgMHgwMDAwMDAwOCAgICAvKiBUWCBPY3RldHMgU2VudCBPSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJVFhfREVGRVJfQ05UICAgICAgMHgwMDAwMDAxMCAgICAvKiBUWCBGcmFtZXMgV2l0aCBEZWZlcnJlZCBUcmFuc21pc3Npb24gICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJVFhfTEFURV9DTlQgICAgICAgMHgwMDAwMDAyMCAgICAvKiBUWCBGcmFtZXMgV2l0aCBMYXRlIENvbGxpc2lvbnMgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJVFhfQUJPUlRDX0NOVCAgICAgMHgwMDAwMDA0MCAgICAvKiBUWCBGcmFtZXMgQWJvcnRlZCBEdWUgVG8gRXhjZXNzIENvbGxpc2lvbnMgICAgICAgICAgICAgKi8KKyNkZWZpbmUJVFhfTE9TVF9DTlQgICAgICAgMHgwMDAwMDA4MCAgICAvKiBUWCBGcmFtZXMgTG9zdCBEdWUgVG8gSW50ZXJuYWwgTUFDIFRYIEVycm9yICAgICAgICAgICAgKi8KKyNkZWZpbmUJVFhfQ1JTX0NOVCAgICAgICAgMHgwMDAwMDEwMCAgICAvKiBUWCBGcmFtZXMgV2l0aCBDYXJyaWVyIFNlbnNlIEVycm9ycyAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJVFhfVU5JX0NOVCAgICAgICAgMHgwMDAwMDIwMCAgICAvKiBVbmljYXN0IFRYIEZyYW1lcyBTZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJVFhfTVVMVElfQ05UICAgICAgMHgwMDAwMDQwMCAgICAvKiBNdWx0aWNhc3QgVFggRnJhbWVzIFNlbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJVFhfQlJPQURfQ05UICAgICAgMHgwMDAwMDgwMCAgICAvKiBCcm9hZGNhc3QgVFggRnJhbWVzIFNlbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJVFhfRVhERUZfQ1RMICAgICAgMHgwMDAwMTAwMCAgICAvKiBUWCBGcmFtZXMgV2l0aCBFeGNlc3NpdmUgRGVmZXJyYWwgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJVFhfTUFDQ1RMX0NOVCAgICAgMHgwMDAwMjAwMCAgICAvKiBNQUMgQ29udHJvbCBUWCBGcmFtZXMgU2VudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJVFhfQUxMRl9DTlQgICAgICAgMHgwMDAwNDAwMCAgICAvKiBBbGwgVFggRnJhbWVzIFNlbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJVFhfQUxMT19DTlQgICAgICAgMHgwMDAwODAwMCAgICAvKiBBbGwgVFggT2N0ZXRzIFNlbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJVFhfRVE2NF9DTlQgICAgICAgMHgwMDAxMDAwMCAgICAvKiA2NC1CeXRlIFRYIEZyYW1lcyBTZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJVFhfTFQxMjhfQ05UICAgICAgMHgwMDAyMDAwMCAgICAvKiA2NS0xMjctQnl0ZSBUWCBGcmFtZXMgU2VudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJVFhfTFQyNTZfQ05UICAgICAgMHgwMDA0MDAwMCAgICAvKiAxMjgtMjU1LUJ5dGUgVFggRnJhbWVzIFNlbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJVFhfTFQ1MTJfQ05UICAgICAgMHgwMDA4MDAwMCAgICAvKiAyNTYtNTExLUJ5dGUgVFggRnJhbWVzIFNlbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJVFhfTFQxMDI0X0NOVCAgICAgMHgwMDEwMDAwMCAgICAvKiA1MTItMTAyMy1CeXRlIFRYIEZyYW1lcyBTZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJVFhfR0UxMDI0X0NOVCAgICAgMHgwMDIwMDAwMCAgICAvKiAxMDI0LU1heC1CeXRlIFRYIEZyYW1lcyBTZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJVFhfQUJPUlRfQ05UICAgICAgMHgwMDQwMDAwMCAgICAvKiBUWCBGcmFtZXMgQWJvcnRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworLyogU0RIIFJlZ2lzdGVycyAqLworCisjZGVmaW5lIFNESF9QV1JfQ1RMICAgICAgICAgICAgICAgICAgICAweEZGQzAzOTAwIC8qIFNESCBQb3dlciBDb250cm9sICovCisjZGVmaW5lIFNESF9DTEtfQ1RMICAgICAgICAgICAgICAgICAgICAweEZGQzAzOTA0IC8qIFNESCBDbG9jayBDb250cm9sICovCisjZGVmaW5lIFNESF9BUkdVTUVOVCAgICAgICAgICAgICAgICAgICAweEZGQzAzOTA4IC8qIFNESCBBcmd1bWVudCAqLworI2RlZmluZSBTREhfQ09NTUFORCAgICAgICAgICAgICAgICAgICAgMHhGRkMwMzkwQyAvKiBTREggQ29tbWFuZCAqLworI2RlZmluZSBTREhfUkVTUF9DTUQgICAgICAgICAgICAgICAgICAgMHhGRkMwMzkxMCAvKiBTREggUmVzcG9uc2UgQ29tbWFuZCAqLworI2RlZmluZSBTREhfUkVTUE9OU0UwICAgICAgICAgICAgICAgICAgMHhGRkMwMzkxNCAvKiBTREggUmVzcG9uc2UwICovCisjZGVmaW5lIFNESF9SRVNQT05TRTEgICAgICAgICAgICAgICAgICAweEZGQzAzOTE4IC8qIFNESCBSZXNwb25zZTEgKi8KKyNkZWZpbmUgU0RIX1JFU1BPTlNFMiAgICAgICAgICAgICAgICAgIDB4RkZDMDM5MUMgLyogU0RIIFJlc3BvbnNlMiAqLworI2RlZmluZSBTREhfUkVTUE9OU0UzICAgICAgICAgICAgICAgICAgMHhGRkMwMzkyMCAvKiBTREggUmVzcG9uc2UzICovCisjZGVmaW5lIFNESF9EQVRBX1RJTUVSICAgICAgICAgICAgICAgICAweEZGQzAzOTI0IC8qIFNESCBEYXRhIFRpbWVyICovCisjZGVmaW5lIFNESF9EQVRBX0xHVEggICAgICAgICAgICAgICAgICAweEZGQzAzOTI4IC8qIFNESCBEYXRhIExlbmd0aCAqLworI2RlZmluZSBTREhfREFUQV9DVEwgICAgICAgICAgICAgICAgICAgMHhGRkMwMzkyQyAvKiBTREggRGF0YSBDb250cm9sICovCisjZGVmaW5lIFNESF9EQVRBX0NOVCAgICAgICAgICAgICAgICAgICAweEZGQzAzOTMwIC8qIFNESCBEYXRhIENvdW50ZXIgKi8KKyNkZWZpbmUgU0RIX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgIDB4RkZDMDM5MzQgLyogU0RIIFN0YXR1cyAqLworI2RlZmluZSBTREhfU1RBVFVTX0NMUiAgICAgICAgICAgICAgICAgMHhGRkMwMzkzOCAvKiBTREggU3RhdHVzIENsZWFyICovCisjZGVmaW5lIFNESF9NQVNLMCAgICAgICAgICAgICAgICAgICAgICAweEZGQzAzOTNDIC8qIFNESCBJbnRlcnJ1cHQwIE1hc2sgKi8KKyNkZWZpbmUgU0RIX01BU0sxICAgICAgICAgICAgICAgICAgICAgIDB4RkZDMDM5NDAgLyogU0RIIEludGVycnVwdDEgTWFzayAqLworI2RlZmluZSBTREhfRklGT19DTlQgICAgICAgICAgICAgICAgICAgMHhGRkMwMzk0OCAvKiBTREggRklGTyBDb3VudGVyICovCisjZGVmaW5lIFNESF9GSUZPICAgICAgICAgICAgICAgICAgICAgICAweEZGQzAzOTgwIC8qIFNESCBEYXRhIEZJRk8gKi8KKyNkZWZpbmUgU0RIX0VfU1RBVFVTICAgICAgICAgICAgICAgICAgIDB4RkZDMDM5QzAgLyogU0RIIEV4Y2VwdGlvbiBTdGF0dXMgKi8KKyNkZWZpbmUgU0RIX0VfTUFTSyAgICAgICAgICAgICAgICAgICAgIDB4RkZDMDM5QzQgLyogU0RIIEV4Y2VwdGlvbiBNYXNrICovCisjZGVmaW5lIFNESF9DRkcgICAgICAgICAgICAgICAgICAgICAgICAweEZGQzAzOUM4IC8qIFNESCBDb25maWd1cmF0aW9uICovCisjZGVmaW5lIFNESF9SRF9XQUlUX0VOICAgICAgICAgICAgICAgICAweEZGQzAzOUNDIC8qIFNESCBSZWFkIFdhaXQgRW5hYmxlICovCisjZGVmaW5lIFNESF9QSUQwICAgICAgICAgICAgICAgICAgICAgICAweEZGQzAzOUQwIC8qIFNESCBQZXJpcGhlcmFsIElkZW50aWZpY2F0aW9uMCAqLworI2RlZmluZSBTREhfUElEMSAgICAgICAgICAgICAgICAgICAgICAgMHhGRkMwMzlENCAvKiBTREggUGVyaXBoZXJhbCBJZGVudGlmaWNhdGlvbjEgKi8KKyNkZWZpbmUgU0RIX1BJRDIgICAgICAgICAgICAgICAgICAgICAgIDB4RkZDMDM5RDggLyogU0RIIFBlcmlwaGVyYWwgSWRlbnRpZmljYXRpb24yICovCisjZGVmaW5lIFNESF9QSUQzICAgICAgICAgICAgICAgICAgICAgICAweEZGQzAzOURDIC8qIFNESCBQZXJpcGhlcmFsIElkZW50aWZpY2F0aW9uMyAqLworI2RlZmluZSBTREhfUElENCAgICAgICAgICAgICAgICAgICAgICAgMHhGRkMwMzlFMCAvKiBTREggUGVyaXBoZXJhbCBJZGVudGlmaWNhdGlvbjQgKi8KKyNkZWZpbmUgU0RIX1BJRDUgICAgICAgICAgICAgICAgICAgICAgIDB4RkZDMDM5RTQgLyogU0RIIFBlcmlwaGVyYWwgSWRlbnRpZmljYXRpb241ICovCisjZGVmaW5lIFNESF9QSUQ2ICAgICAgICAgICAgICAgICAgICAgICAweEZGQzAzOUU4IC8qIFNESCBQZXJpcGhlcmFsIElkZW50aWZpY2F0aW9uNiAqLworI2RlZmluZSBTREhfUElENyAgICAgICAgICAgICAgICAgICAgICAgMHhGRkMwMzlFQyAvKiBTREggUGVyaXBoZXJhbCBJZGVudGlmaWNhdGlvbjcgKi8KKworLyogUmVtb3ZhYmxlIFN0b3JhZ2UgSW50ZXJmYWNlIFJlZ2lzdGVycyAqLworCisjZGVmaW5lIFJTSV9QV1JfQ09OVFJPTCAgICAgICAgICAgICAgICAweEZGQzAzODAwIC8qIFJTSSBQb3dlciBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lIFJTSV9DTEtfQ09OVFJPTCAgICAgICAgICAgICAgICAweEZGQzAzODA0IC8qIFJTSSBDbG9jayBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lIFJTSV9BUkdVTUVOVCAgICAgICAgICAgICAgICAgICAweEZGQzAzODA4IC8qIFJTSSBBcmd1bWVudCBSZWdpc3RlciAqLworI2RlZmluZSBSU0lfQ09NTUFORCAgICAgICAgICAgICAgICAgICAgMHhGRkMwMzgwQyAvKiBSU0kgQ29tbWFuZCBSZWdpc3RlciAqLworI2RlZmluZSBSU0lfUkVTUF9DTUQgICAgICAgICAgICAgICAgICAgMHhGRkMwMzgxMCAvKiBSU0kgUmVzcG9uc2UgQ29tbWFuZCBSZWdpc3RlciAqLworI2RlZmluZSBSU0lfUkVTUE9OU0UwICAgICAgICAgICAgICAgICAgMHhGRkMwMzgxNCAvKiBSU0kgUmVzcG9uc2UgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUlNJX1JFU1BPTlNFMSAgICAgICAgICAgICAgICAgIDB4RkZDMDM4MTggLyogUlNJIFJlc3BvbnNlIFJlZ2lzdGVyICovCisjZGVmaW5lIFJTSV9SRVNQT05TRTIgICAgICAgICAgICAgICAgICAweEZGQzAzODFDIC8qIFJTSSBSZXNwb25zZSBSZWdpc3RlciAqLworI2RlZmluZSBSU0lfUkVTUE9OU0UzICAgICAgICAgICAgICAgICAgMHhGRkMwMzgyMCAvKiBSU0kgUmVzcG9uc2UgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUlNJX0RBVEFfVElNRVIgICAgICAgICAgICAgICAgIDB4RkZDMDM4MjQgLyogUlNJIERhdGEgVGltZXIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUlNJX0RBVEFfTEdUSCAgICAgICAgICAgICAgICAgIDB4RkZDMDM4MjggLyogUlNJIERhdGEgTGVuZ3RoIFJlZ2lzdGVyICovCisjZGVmaW5lIFJTSV9EQVRBX0NPTlRST0wgICAgICAgICAgICAgICAweEZGQzAzODJDIC8qIFJTSSBEYXRhIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUlNJX0RBVEFfQ05UICAgICAgICAgICAgICAgICAgIDB4RkZDMDM4MzAgLyogUlNJIERhdGEgQ291bnRlciBSZWdpc3RlciAqLworI2RlZmluZSBSU0lfU1RBVFVTICAgICAgICAgICAgICAgICAgICAgMHhGRkMwMzgzNCAvKiBSU0kgU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lIFJTSV9TVEFUVVNDTCAgICAgICAgICAgICAgICAgICAweEZGQzAzODM4IC8qIFJTSSBTdGF0dXMgQ2xlYXIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUlNJX01BU0swICAgICAgICAgICAgICAgICAgICAgIDB4RkZDMDM4M0MgLyogUlNJIEludGVycnVwdCAwIE1hc2sgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUlNJX01BU0sxICAgICAgICAgICAgICAgICAgICAgIDB4RkZDMDM4NDAgLyogUlNJIEludGVycnVwdCAxIE1hc2sgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUlNJX0ZJRk9fQ05UICAgICAgICAgICAgICAgICAgIDB4RkZDMDM4NDggLyogUlNJIEZJRk8gQ291bnRlciBSZWdpc3RlciAqLworI2RlZmluZSBSU0lfQ0VBVEFfQ09OVFJPTCAgICAgICAgICAgICAgMHhGRkMwMzg0QyAvKiBSU0kgQ0VBVEEgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUlNJX0ZJRk8gICAgICAgICAgICAgICAgICAgICAgIDB4RkZDMDM4ODAgLyogUlNJIERhdGEgRklGTyBSZWdpc3RlciAqLworI2RlZmluZSBSU0lfRVNUQVQgICAgICAgICAgICAgICAgICAgICAgMHhGRkMwMzhDMCAvKiBSU0kgRXhjZXB0aW9uIFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZSBSU0lfRU1BU0sgICAgICAgICAgICAgICAgICAgICAgMHhGRkMwMzhDNCAvKiBSU0kgRXhjZXB0aW9uIE1hc2sgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUlNJX0NPTkZJRyAgICAgICAgICAgICAgICAgICAgIDB4RkZDMDM4QzggLyogUlNJIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUlNJX1JEX1dBSVRfRU4gICAgICAgICAgICAgICAgIDB4RkZDMDM4Q0MgLyogUlNJIFJlYWQgV2FpdCBFbmFibGUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUlNJX1BJRDAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZDMDNGRTAgLyogUlNJIFBlcmlwaGVyYWwgSUQgUmVnaXN0ZXIgMCAqLworI2RlZmluZSBSU0lfUElEMSAgICAgICAgICAgICAgICAgICAgICAgMHhGRkMwM0ZFNCAvKiBSU0kgUGVyaXBoZXJhbCBJRCBSZWdpc3RlciAxICovCisjZGVmaW5lIFJTSV9QSUQyICAgICAgICAgICAgICAgICAgICAgICAweEZGQzAzRkU4IC8qIFJTSSBQZXJpcGhlcmFsIElEIFJlZ2lzdGVyIDIgKi8KKyNkZWZpbmUgUlNJX1BJRDMgICAgICAgICAgICAgICAgICAgICAgIDB4RkZDMDNGRUMgLyogUlNJIFBlcmlwaGVyYWwgSUQgUmVnaXN0ZXIgMyAqLworI2RlZmluZSBSU0lfUElENCAgICAgICAgICAgICAgICAgICAgICAgMHhGRkMwM0ZGMCAvKiBSU0kgUGVyaXBoZXJhbCBJRCBSZWdpc3RlciA0ICovCisjZGVmaW5lIFJTSV9QSUQ1ICAgICAgICAgICAgICAgICAgICAgICAweEZGQzAzRkY0IC8qIFJTSSBQZXJpcGhlcmFsIElEIFJlZ2lzdGVyIDUgKi8KKyNkZWZpbmUgUlNJX1BJRDYgICAgICAgICAgICAgICAgICAgICAgIDB4RkZDMDNGRjggLyogUlNJIFBlcmlwaGVyYWwgSUQgUmVnaXN0ZXIgNiAqLworI2RlZmluZSBSU0lfUElENyAgICAgICAgICAgICAgICAgICAgICAgMHhGRkMwM0ZGQyAvKiBSU0kgUGVyaXBoZXJhbCBJRCBSZWdpc3RlciA3ICovCisKKyNlbmRpZiAvKiBfREVGX0JGNTE2X0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9pbmNsdWRlL21hY2gvZGVmQkY1MTguaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9pbmNsdWRlL21hY2gvZGVmQkY1MTguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTk4MmFiCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2luY2x1ZGUvbWFjaC9kZWZCRjUxOC5oCkBAIC0wLDAgKzEsNjUxIEBACisvKgorICogRmlsZTogICAgICAgICBpbmNsdWRlL2FzbS1ibGFja2Zpbi9tYWNoLWJmNTE4L2RlZkJGNTE4LmgKKyAqIEJhc2VkIG9uOgorICogQXV0aG9yOgorICoKKyAqIENyZWF0ZWQ6CisgKiBEZXNjcmlwdGlvbjoKKyAqCisgKiBSZXY6CisgKgorICogTW9kaWZpZWQ6CisgKgorICogQnVnczogICAgICAgICBFbnRlciBidWdzIGF0IGh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZy8KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4KKyAqIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKi8KKworI2lmbmRlZiBfREVGX0JGNTE4X0gKKyNkZWZpbmUgX0RFRl9CRjUxOF9ICisKKy8qIEluY2x1ZGUgYWxsIENvcmUgcmVnaXN0ZXJzIGFuZCBiaXQgZGVmaW5pdGlvbnMgKi8KKyNpbmNsdWRlIDxhc20vZGVmX0xQQmxhY2tmaW4uaD4KKworLyogU1lTVEVNICYgTU1SIEFERFJFU1MgREVGSU5JVElPTlMgRk9SIEFEU1AtQkY1MTggKi8KKworLyogSW5jbHVkZSBkZWZCRjUxeF9iYXNlLmggZm9yIHRoZSBzZXQgb2YgI2RlZmluZXMgdGhhdCBhcmUgY29tbW9uIHRvIGFsbCBBRFNQLUJGNTF4IHByb2Nlc3NvcnMgKi8KKyNpbmNsdWRlICJkZWZCRjUxeF9iYXNlLmgiCisKKy8qIFRoZSBmb2xsb3dpbmcgYXJlIHRoZSAjZGVmaW5lcyBuZWVkZWQgYnkgQURTUC1CRjUxOCB0aGF0IGFyZSBub3QgaW4gdGhlIGNvbW1vbiBoZWFkZXIgKi8KKy8qIDEwLzEwMCBFdGhlcm5ldCBDb250cm9sbGVyCSgweEZGQzAzMDAwIC0gMHhGRkMwMzFGRikgKi8KKworI2RlZmluZSBFTUFDX09QTU9ERSAgICAgICAgICAgICAweEZGQzAzMDAwICAgICAgIC8qIE9wZXJhdGluZyBNb2RlIFJlZ2lzdGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRU1BQ19BRERSTE8gICAgICAgICAgICAgMHhGRkMwMzAwNCAgICAgICAvKiBBZGRyZXNzIExvdyAoMzIgTFNCcykgUmVnaXN0ZXIgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEVNQUNfQUREUkhJICAgICAgICAgICAgIDB4RkZDMDMwMDggICAgICAgLyogQWRkcmVzcyBIaWdoICgxNiBNU0JzKSBSZWdpc3RlciAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBFTUFDX0hBU0hMTyAgICAgICAgICAgICAweEZGQzAzMDBDICAgICAgIC8qIE11bHRpY2FzdCBIYXNoIFRhYmxlIExvdyAoQmlucyAzMS0wKSBSZWdpc3RlciAgICAgICAgKi8KKyNkZWZpbmUgRU1BQ19IQVNISEkgICAgICAgICAgICAgMHhGRkMwMzAxMCAgICAgICAvKiBNdWx0aWNhc3QgSGFzaCBUYWJsZSBIaWdoIChCaW5zIDYzLTMyKSBSZWdpc3RlciAgICAgICovCisjZGVmaW5lIEVNQUNfU1RBQUREICAgICAgICAgICAgIDB4RkZDMDMwMTQgICAgICAgLyogU3RhdGlvbiBNYW5hZ2VtZW50IEFkZHJlc3MgUmVnaXN0ZXIgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBFTUFDX1NUQURBVCAgICAgICAgICAgICAweEZGQzAzMDE4ICAgICAgIC8qIFN0YXRpb24gTWFuYWdlbWVudCBEYXRhIFJlZ2lzdGVyICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRU1BQ19GTEMgICAgICAgICAgICAgICAgMHhGRkMwMzAxQyAgICAgICAvKiBGbG93IENvbnRyb2wgUmVnaXN0ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEVNQUNfVkxBTjEgICAgICAgICAgICAgIDB4RkZDMDMwMjAgICAgICAgLyogVkxBTjEgVGFnIFJlZ2lzdGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBFTUFDX1ZMQU4yICAgICAgICAgICAgICAweEZGQzAzMDI0ICAgICAgIC8qIFZMQU4yIFRhZyBSZWdpc3RlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRU1BQ19XS1VQX0NUTCAgICAgICAgICAgMHhGRkMwMzAyQyAgICAgICAvKiBXYWtlLVVwIENvbnRyb2wvU3RhdHVzIFJlZ2lzdGVyICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEVNQUNfV0tVUF9GRk1TSzAgICAgICAgIDB4RkZDMDMwMzAgICAgICAgLyogV2FrZS1VcCBGcmFtZSBGaWx0ZXIgMCBCeXRlIE1hc2sgUmVnaXN0ZXIgICAgICAgICAgICAqLworI2RlZmluZSBFTUFDX1dLVVBfRkZNU0sxICAgICAgICAweEZGQzAzMDM0ICAgICAgIC8qIFdha2UtVXAgRnJhbWUgRmlsdGVyIDEgQnl0ZSBNYXNrIFJlZ2lzdGVyICAgICAgICAgICAgKi8KKyNkZWZpbmUgRU1BQ19XS1VQX0ZGTVNLMiAgICAgICAgMHhGRkMwMzAzOCAgICAgICAvKiBXYWtlLVVwIEZyYW1lIEZpbHRlciAyIEJ5dGUgTWFzayBSZWdpc3RlciAgICAgICAgICAgICovCisjZGVmaW5lIEVNQUNfV0tVUF9GRk1TSzMgICAgICAgIDB4RkZDMDMwM0MgICAgICAgLyogV2FrZS1VcCBGcmFtZSBGaWx0ZXIgMyBCeXRlIE1hc2sgUmVnaXN0ZXIgICAgICAgICAgICAqLworI2RlZmluZSBFTUFDX1dLVVBfRkZDTUQgICAgICAgICAweEZGQzAzMDQwICAgICAgIC8qIFdha2UtVXAgRnJhbWUgRmlsdGVyIENvbW1hbmRzIFJlZ2lzdGVyICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRU1BQ19XS1VQX0ZGT0ZGICAgICAgICAgMHhGRkMwMzA0NCAgICAgICAvKiBXYWtlLVVwIEZyYW1lIEZpbHRlciBPZmZzZXRzIFJlZ2lzdGVyICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEVNQUNfV0tVUF9GRkNSQzAgICAgICAgIDB4RkZDMDMwNDggICAgICAgLyogV2FrZS1VcCBGcmFtZSBGaWx0ZXIgMCwxIENSQy0xNiBSZWdpc3RlciAgICAgICAgICAgICAqLworI2RlZmluZSBFTUFDX1dLVVBfRkZDUkMxICAgICAgICAweEZGQzAzMDRDICAgICAgIC8qIFdha2UtVXAgRnJhbWUgRmlsdGVyIDIsMyBDUkMtMTYgUmVnaXN0ZXIgICAgICAgICAgICAgKi8KKworI2RlZmluZSBFTUFDX1NZU0NUTCAgICAgICAgICAgICAweEZGQzAzMDYwICAgICAgIC8qIEVNQUMgU3lzdGVtIENvbnRyb2wgUmVnaXN0ZXIgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRU1BQ19TWVNUQVQgICAgICAgICAgICAgMHhGRkMwMzA2NCAgICAgICAvKiBFTUFDIFN5c3RlbSBTdGF0dXMgUmVnaXN0ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEVNQUNfUlhfU1RBVCAgICAgICAgICAgIDB4RkZDMDMwNjggICAgICAgLyogUlggQ3VycmVudCBGcmFtZSBTdGF0dXMgUmVnaXN0ZXIgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBFTUFDX1JYX1NUS1kgICAgICAgICAgICAweEZGQzAzMDZDICAgICAgIC8qIFJYIFN0aWNreSBGcmFtZSBTdGF0dXMgUmVnaXN0ZXIgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRU1BQ19SWF9JUlFFICAgICAgICAgICAgMHhGRkMwMzA3MCAgICAgICAvKiBSWCBGcmFtZSBTdGF0dXMgSW50ZXJydXB0IEVuYWJsZXMgUmVnaXN0ZXIgICAgICAgICAgICovCisjZGVmaW5lIEVNQUNfVFhfU1RBVCAgICAgICAgICAgIDB4RkZDMDMwNzQgICAgICAgLyogVFggQ3VycmVudCBGcmFtZSBTdGF0dXMgUmVnaXN0ZXIgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBFTUFDX1RYX1NUS1kgICAgICAgICAgICAweEZGQzAzMDc4ICAgICAgIC8qIFRYIFN0aWNreSBGcmFtZSBTdGF0dXMgUmVnaXN0ZXIgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRU1BQ19UWF9JUlFFICAgICAgICAgICAgMHhGRkMwMzA3QyAgICAgICAvKiBUWCBGcmFtZSBTdGF0dXMgSW50ZXJydXB0IEVuYWJsZXMgUmVnaXN0ZXIgICAgICAgICAgICovCisKKyNkZWZpbmUgRU1BQ19NTUNfQ1RMICAgICAgICAgICAgMHhGRkMwMzA4MCAgICAgICAvKiBNTUMgQ291bnRlciBDb250cm9sIFJlZ2lzdGVyICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEVNQUNfTU1DX1JJUlFTICAgICAgICAgIDB4RkZDMDMwODQgICAgICAgLyogTU1DIFJYIEludGVycnVwdCBTdGF0dXMgUmVnaXN0ZXIgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBFTUFDX01NQ19SSVJRRSAgICAgICAgICAweEZGQzAzMDg4ICAgICAgIC8qIE1NQyBSWCBJbnRlcnJ1cHQgRW5hYmxlcyBSZWdpc3RlciAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRU1BQ19NTUNfVElSUVMgICAgICAgICAgMHhGRkMwMzA4QyAgICAgICAvKiBNTUMgVFggSW50ZXJydXB0IFN0YXR1cyBSZWdpc3RlciAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEVNQUNfTU1DX1RJUlFFICAgICAgICAgIDB4RkZDMDMwOTAgICAgICAgLyogTU1DIFRYIEludGVycnVwdCBFbmFibGVzIFJlZ2lzdGVyICAgICAgICAgICAgICAgICAgICAqLworCisjZGVmaW5lIEVNQUNfUlhDX09LICAgICAgICAgICAgIDB4RkZDMDMxMDAgICAgICAgLyogUlggRnJhbWUgU3VjY2Vzc2Z1bCBDb3VudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBFTUFDX1JYQ19GQ1MgICAgICAgICAgICAweEZGQzAzMTA0ICAgICAgIC8qIFJYIEZyYW1lIEZDUyBGYWlsdXJlIENvdW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRU1BQ19SWENfQUxJR04gICAgICAgICAgMHhGRkMwMzEwOCAgICAgICAvKiBSWCBBbGlnbm1lbnQgRXJyb3IgQ291bnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEVNQUNfUlhDX09DVEVUICAgICAgICAgIDB4RkZDMDMxMEMgICAgICAgLyogUlggT2N0ZXRzIFN1Y2Nlc3NmdWxseSBSZWNlaXZlZCBDb3VudCAgICAgICAgICAgICAgICAqLworI2RlZmluZSBFTUFDX1JYQ19ETUFPVkYgICAgICAgICAweEZGQzAzMTEwICAgICAgIC8qIEludGVybmFsIE1BQyBTdWJsYXllciBFcnJvciBSWCBGcmFtZSBDb3VudCAgICAgICAgICAgKi8KKyNkZWZpbmUgRU1BQ19SWENfVU5JQ1NUICAgICAgICAgMHhGRkMwMzExNCAgICAgICAvKiBVbmljYXN0IFJYIEZyYW1lIENvdW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEVNQUNfUlhDX01VTFRJICAgICAgICAgIDB4RkZDMDMxMTggICAgICAgLyogTXVsdGljYXN0IFJYIEZyYW1lIENvdW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBFTUFDX1JYQ19CUk9BRCAgICAgICAgICAweEZGQzAzMTFDICAgICAgIC8qIEJyb2FkY2FzdCBSWCBGcmFtZSBDb3VudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRU1BQ19SWENfTE5FUlJJICAgICAgICAgMHhGRkMwMzEyMCAgICAgICAvKiBSWCBGcmFtZSBJbiBSYW5nZSBFcnJvciBDb3VudCAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEVNQUNfUlhDX0xORVJSTyAgICAgICAgIDB4RkZDMDMxMjQgICAgICAgLyogUlggRnJhbWUgT3V0IE9mIFJhbmdlIEVycm9yIENvdW50ICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBFTUFDX1JYQ19MT05HICAgICAgICAgICAweEZGQzAzMTI4ICAgICAgIC8qIFJYIEZyYW1lIFRvbyBMb25nIENvdW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRU1BQ19SWENfTUFDQ1RMICAgICAgICAgMHhGRkMwMzEyQyAgICAgICAvKiBNQUMgQ29udHJvbCBSWCBGcmFtZSBDb3VudCAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEVNQUNfUlhDX09QQ09ERSAgICAgICAgIDB4RkZDMDMxMzAgICAgICAgLyogVW5zdXBwb3J0ZWQgT3AtQ29kZSBSWCBGcmFtZSBDb3VudCAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBFTUFDX1JYQ19QQVVTRSAgICAgICAgICAweEZGQzAzMTM0ICAgICAgIC8qIE1BQyBDb250cm9sIFBhdXNlIFJYIEZyYW1lIENvdW50ICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRU1BQ19SWENfQUxMRlJNICAgICAgICAgMHhGRkMwMzEzOCAgICAgICAvKiBPdmVyYWxsIFJYIEZyYW1lIENvdW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEVNQUNfUlhDX0FMTE9DVCAgICAgICAgIDB4RkZDMDMxM0MgICAgICAgLyogT3ZlcmFsbCBSWCBPY3RldCBDb3VudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBFTUFDX1JYQ19UWVBFRCAgICAgICAgICAweEZGQzAzMTQwICAgICAgIC8qIFR5cGUvTGVuZ3RoIENvbnNpc3RlbnQgUlggRnJhbWUgQ291bnQgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRU1BQ19SWENfU0hPUlQgICAgICAgICAgMHhGRkMwMzE0NCAgICAgICAvKiBSWCBGcmFtZSBGcmFnbWVudCBDb3VudCAtIEJ5dGUgQ291bnQgeCA8IDY0ICAgICAgICAgICovCisjZGVmaW5lIEVNQUNfUlhDX0VRNjQgICAgICAgICAgIDB4RkZDMDMxNDggICAgICAgLyogR29vZCBSWCBGcmFtZSBDb3VudCAtIEJ5dGUgQ291bnQgeCA9IDY0ICAgICAgICAgICAgICAqLworI2RlZmluZSBFTUFDX1JYQ19MVDEyOCAgICAgICAgICAweEZGQzAzMTRDICAgICAgIC8qIEdvb2QgUlggRnJhbWUgQ291bnQgLSBCeXRlIENvdW50ICA2NCA8IHggPCAxMjggICAgICAgKi8KKyNkZWZpbmUgRU1BQ19SWENfTFQyNTYgICAgICAgICAgMHhGRkMwMzE1MCAgICAgICAvKiBHb29kIFJYIEZyYW1lIENvdW50IC0gQnl0ZSBDb3VudCAxMjggPD0geCA8IDI1NiAgICAgICovCisjZGVmaW5lIEVNQUNfUlhDX0xUNTEyICAgICAgICAgIDB4RkZDMDMxNTQgICAgICAgLyogR29vZCBSWCBGcmFtZSBDb3VudCAtIEJ5dGUgQ291bnQgMjU2IDw9IHggPCA1MTIgICAgICAqLworI2RlZmluZSBFTUFDX1JYQ19MVDEwMjQgICAgICAgICAweEZGQzAzMTU4ICAgICAgIC8qIEdvb2QgUlggRnJhbWUgQ291bnQgLSBCeXRlIENvdW50IDUxMiA8PSB4IDwgMTAyNCAgICAgKi8KKyNkZWZpbmUgRU1BQ19SWENfR0UxMDI0ICAgICAgICAgMHhGRkMwMzE1QyAgICAgICAvKiBHb29kIFJYIEZyYW1lIENvdW50IC0gQnl0ZSBDb3VudCB4ID49IDEwMjQgICAgICAgICAgICovCisKKyNkZWZpbmUgRU1BQ19UWENfT0sgICAgICAgICAgICAgMHhGRkMwMzE4MCAgICAgICAvKiBUWCBGcmFtZSBTdWNjZXNzZnVsIENvdW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBFTUFDX1RYQ18xQ09MICAgICAgICAgICAweEZGQzAzMTg0ICAgICAgIC8qIFRYIEZyYW1lcyBTdWNjZXNzZnVsIEFmdGVyIFNpbmdsZSBDb2xsaXNpb24gQ291bnQgICAgICovCisjZGVmaW5lIEVNQUNfVFhDX0dUMUNPTCAgICAgICAgIDB4RkZDMDMxODggICAgICAgLyogVFggRnJhbWVzIFN1Y2Nlc3NmdWwgQWZ0ZXIgTXVsdGlwbGUgQ29sbGlzaW9ucyBDb3VudCAgKi8KKyNkZWZpbmUgRU1BQ19UWENfT0NURVQgICAgICAgICAgMHhGRkMwMzE4QyAgICAgICAvKiBUWCBPY3RldHMgU3VjY2Vzc2Z1bGx5IFJlY2VpdmVkIENvdW50ICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBFTUFDX1RYQ19ERUZFUiAgICAgICAgICAweEZGQzAzMTkwICAgICAgIC8qIFRYIEZyYW1lIERlbGF5ZWQgRHVlIFRvIEJ1c3kgQ291bnQgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEVNQUNfVFhDX0xBVEVDTCAgICAgICAgIDB4RkZDMDMxOTQgICAgICAgLyogTGF0ZSBUWCBDb2xsaXNpb25zIENvdW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRU1BQ19UWENfWFNfQ09MICAgICAgICAgMHhGRkMwMzE5OCAgICAgICAvKiBUWCBGcmFtZSBGYWlsZWQgRHVlIFRvIEV4Y2Vzc2l2ZSBDb2xsaXNpb25zIENvdW50ICAgICAqLworI2RlZmluZSBFTUFDX1RYQ19ETUFVTkQgICAgICAgICAweEZGQzAzMTlDICAgICAgIC8qIEludGVybmFsIE1BQyBTdWJsYXllciBFcnJvciBUWCBGcmFtZSBDb3VudCAgICAgICAgICAgICovCisjZGVmaW5lIEVNQUNfVFhDX0NSU0VSUiAgICAgICAgIDB4RkZDMDMxQTAgICAgICAgLyogQ2FycmllciBTZW5zZSBEZWFzc2VydGVkIER1cmluZyBUWCBGcmFtZSBDb3VudCAgICAgICAgKi8KKyNkZWZpbmUgRU1BQ19UWENfVU5JQ1NUICAgICAgICAgMHhGRkMwMzFBNCAgICAgICAvKiBVbmljYXN0IFRYIEZyYW1lIENvdW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBFTUFDX1RYQ19NVUxUSSAgICAgICAgICAweEZGQzAzMUE4ICAgICAgIC8qIE11bHRpY2FzdCBUWCBGcmFtZSBDb3VudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEVNQUNfVFhDX0JST0FEICAgICAgICAgIDB4RkZDMDMxQUMgICAgICAgLyogQnJvYWRjYXN0IFRYIEZyYW1lIENvdW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRU1BQ19UWENfWFNfREZSICAgICAgICAgMHhGRkMwMzFCMCAgICAgICAvKiBUWCBGcmFtZXMgV2l0aCBFeGNlc3NpdmUgRGVmZXJyYWwgQ291bnQgICAgICAgICAgICAgICAqLworI2RlZmluZSBFTUFDX1RYQ19NQUNDVEwgICAgICAgICAweEZGQzAzMUI0ICAgICAgIC8qIE1BQyBDb250cm9sIFRYIEZyYW1lIENvdW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEVNQUNfVFhDX0FMTEZSTSAgICAgICAgIDB4RkZDMDMxQjggICAgICAgLyogT3ZlcmFsbCBUWCBGcmFtZSBDb3VudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRU1BQ19UWENfQUxMT0NUICAgICAgICAgMHhGRkMwMzFCQyAgICAgICAvKiBPdmVyYWxsIFRYIE9jdGV0IENvdW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBFTUFDX1RYQ19FUTY0ICAgICAgICAgICAweEZGQzAzMUMwICAgICAgIC8qIEdvb2QgVFggRnJhbWUgQ291bnQgLSBCeXRlIENvdW50IHggPSA2NCAgICAgICAgICAgICAgICovCisjZGVmaW5lIEVNQUNfVFhDX0xUMTI4ICAgICAgICAgIDB4RkZDMDMxQzQgICAgICAgLyogR29vZCBUWCBGcmFtZSBDb3VudCAtIEJ5dGUgQ291bnQgIDY0IDwgeCA8IDEyOCAgICAgICAgKi8KKyNkZWZpbmUgRU1BQ19UWENfTFQyNTYgICAgICAgICAgMHhGRkMwMzFDOCAgICAgICAvKiBHb29kIFRYIEZyYW1lIENvdW50IC0gQnl0ZSBDb3VudCAxMjggPD0geCA8IDI1NiAgICAgICAqLworI2RlZmluZSBFTUFDX1RYQ19MVDUxMiAgICAgICAgICAweEZGQzAzMUNDICAgICAgIC8qIEdvb2QgVFggRnJhbWUgQ291bnQgLSBCeXRlIENvdW50IDI1NiA8PSB4IDwgNTEyICAgICAgICovCisjZGVmaW5lIEVNQUNfVFhDX0xUMTAyNCAgICAgICAgIDB4RkZDMDMxRDAgICAgICAgLyogR29vZCBUWCBGcmFtZSBDb3VudCAtIEJ5dGUgQ291bnQgNTEyIDw9IHggPCAxMDI0ICAgICAgKi8KKyNkZWZpbmUgRU1BQ19UWENfR0UxMDI0ICAgICAgICAgMHhGRkMwMzFENCAgICAgICAvKiBHb29kIFRYIEZyYW1lIENvdW50IC0gQnl0ZSBDb3VudCB4ID49IDEwMjQgICAgICAgICAgICAqLworI2RlZmluZSBFTUFDX1RYQ19BQk9SVCAgICAgICAgICAweEZGQzAzMUQ4ICAgICAgIC8qIFRvdGFsIFRYIEZyYW1lcyBBYm9ydGVkIENvdW50ICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKy8qIExpc3RpbmcgZm9yIElFRUUtU3VwcG9ydGVkIENvdW50IFJlZ2lzdGVycyAqLworCisjZGVmaW5lIEZyYW1lc1JlY2VpdmVkT0sgICAgICAgICAgICAgICAgRU1BQ19SWENfT0sgICAgICAgIC8qIFJYIEZyYW1lIFN1Y2Nlc3NmdWwgQ291bnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRnJhbWVDaGVja1NlcXVlbmNlRXJyb3JzICAgICAgICBFTUFDX1JYQ19GQ1MgICAgICAgLyogUlggRnJhbWUgRkNTIEZhaWx1cmUgQ291bnQgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBBbGlnbm1lbnRFcnJvcnMgICAgICAgICAgICAgICAgIEVNQUNfUlhDX0FMSUdOICAgICAvKiBSWCBBbGlnbm1lbnQgRXJyb3IgQ291bnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIE9jdGV0c1JlY2VpdmVkT0sgICAgICAgICAgICAgICAgRU1BQ19SWENfT0NURVQgICAgIC8qIFJYIE9jdGV0cyBTdWNjZXNzZnVsbHkgUmVjZWl2ZWQgQ291bnQgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRnJhbWVzTG9zdER1ZVRvSW50TUFDUmN2RXJyb3IgICBFTUFDX1JYQ19ETUFPVkYgICAgLyogSW50ZXJuYWwgTUFDIFN1YmxheWVyIEVycm9yIFJYIEZyYW1lIENvdW50ICAgICAgICAgICAqLworI2RlZmluZSBVbmljYXN0RnJhbWVzUmVjZWl2ZWRPSyAgICAgICAgIEVNQUNfUlhDX1VOSUNTVCAgICAvKiBVbmljYXN0IFJYIEZyYW1lIENvdW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIE11bHRpY2FzdEZyYW1lc1JlY2VpdmVkT0sgICAgICAgRU1BQ19SWENfTVVMVEkgICAgIC8qIE11bHRpY2FzdCBSWCBGcmFtZSBDb3VudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQnJvYWRjYXN0RnJhbWVzUmVjZWl2ZWRPSyAgICAgICBFTUFDX1JYQ19CUk9BRCAgICAgLyogQnJvYWRjYXN0IFJYIEZyYW1lIENvdW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBJblJhbmdlTGVuZ3RoRXJyb3JzICAgICAgICAgICAgIEVNQUNfUlhDX0xORVJSSSAgICAvKiBSWCBGcmFtZSBJbiBSYW5nZSBFcnJvciBDb3VudCAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIE91dE9mUmFuZ2VMZW5ndGhGaWVsZCAgICAgICAgICAgRU1BQ19SWENfTE5FUlJPICAgIC8qIFJYIEZyYW1lIE91dCBPZiBSYW5nZSBFcnJvciBDb3VudCAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRnJhbWVUb29Mb25nRXJyb3JzICAgICAgICAgICAgICBFTUFDX1JYQ19MT05HICAgICAgLyogUlggRnJhbWUgVG9vIExvbmcgQ291bnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBNQUNDb250cm9sRnJhbWVzUmVjZWl2ZWQgICAgICAgIEVNQUNfUlhDX01BQ0NUTCAgICAvKiBNQUMgQ29udHJvbCBSWCBGcmFtZSBDb3VudCAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFVuc3VwcG9ydGVkT3Bjb2Rlc1JlY2VpdmVkICAgICAgRU1BQ19SWENfT1BDT0RFICAgIC8qIFVuc3VwcG9ydGVkIE9wLUNvZGUgUlggRnJhbWUgQ291bnQgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgUEFVU0VNQUNDdHJsRnJhbWVzUmVjZWl2ZWQgICAgICBFTUFDX1JYQ19QQVVTRSAgICAgLyogTUFDIENvbnRyb2wgUGF1c2UgUlggRnJhbWUgQ291bnQgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBGcmFtZXNSZWNlaXZlZEFsbCAgICAgICAgICAgICAgIEVNQUNfUlhDX0FMTEZSTSAgICAvKiBPdmVyYWxsIFJYIEZyYW1lIENvdW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIE9jdGV0c1JlY2VpdmVkQWxsICAgICAgICAgICAgICAgRU1BQ19SWENfQUxMT0NUICAgIC8qIE92ZXJhbGwgUlggT2N0ZXQgQ291bnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVHlwZWRGcmFtZXNSZWNlaXZlZCAgICAgICAgICAgICBFTUFDX1JYQ19UWVBFRCAgICAgLyogVHlwZS9MZW5ndGggQ29uc2lzdGVudCBSWCBGcmFtZSBDb3VudCAgICAgICAgICAgICAgICAqLworI2RlZmluZSBGcmFtZXNMZW5MdDY0UmVjZWl2ZWQgICAgICAgICAgIEVNQUNfUlhDX1NIT1JUICAgICAvKiBSWCBGcmFtZSBGcmFnbWVudCBDb3VudCAtIEJ5dGUgQ291bnQgeCA8IDY0ICAgICAgICAgICovCisjZGVmaW5lIEZyYW1lc0xlbkVxNjRSZWNlaXZlZCAgICAgICAgICAgRU1BQ19SWENfRVE2NCAgICAgIC8qIEdvb2QgUlggRnJhbWUgQ291bnQgLSBCeXRlIENvdW50IHggPSA2NCAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRnJhbWVzTGVuNjVfMTI3UmVjZWl2ZWQgICAgICAgICBFTUFDX1JYQ19MVDEyOCAgICAgLyogR29vZCBSWCBGcmFtZSBDb3VudCAtIEJ5dGUgQ291bnQgIDY0IDwgeCA8IDEyOCAgICAgICAqLworI2RlZmluZSBGcmFtZXNMZW4xMjhfMjU1UmVjZWl2ZWQgICAgICAgIEVNQUNfUlhDX0xUMjU2ICAgICAvKiBHb29kIFJYIEZyYW1lIENvdW50IC0gQnl0ZSBDb3VudCAxMjggPD0geCA8IDI1NiAgICAgICovCisjZGVmaW5lIEZyYW1lc0xlbjI1Nl81MTFSZWNlaXZlZCAgICAgICAgRU1BQ19SWENfTFQ1MTIgICAgIC8qIEdvb2QgUlggRnJhbWUgQ291bnQgLSBCeXRlIENvdW50IDI1NiA8PSB4IDwgNTEyICAgICAgKi8KKyNkZWZpbmUgRnJhbWVzTGVuNTEyXzEwMjNSZWNlaXZlZCAgICAgICBFTUFDX1JYQ19MVDEwMjQgICAgLyogR29vZCBSWCBGcmFtZSBDb3VudCAtIEJ5dGUgQ291bnQgNTEyIDw9IHggPCAxMDI0ICAgICAqLworI2RlZmluZSBGcmFtZXNMZW4xMDI0X01heFJlY2VpdmVkICAgICAgIEVNQUNfUlhDX0dFMTAyNCAgICAvKiBHb29kIFJYIEZyYW1lIENvdW50IC0gQnl0ZSBDb3VudCB4ID49IDEwMjQgICAgICAgICAgICovCisKKyNkZWZpbmUgRnJhbWVzVHJhbnNtaXR0ZWRPSyAgICAgICAgICAgICBFTUFDX1RYQ19PSyAgICAgICAgLyogVFggRnJhbWUgU3VjY2Vzc2Z1bCBDb3VudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBTaW5nbGVDb2xsaXNpb25GcmFtZXMgICAgICAgICAgIEVNQUNfVFhDXzFDT0wgICAgICAvKiBUWCBGcmFtZXMgU3VjY2Vzc2Z1bCBBZnRlciBTaW5nbGUgQ29sbGlzaW9uIENvdW50ICAgICovCisjZGVmaW5lIE11bHRpcGxlQ29sbGlzaW9uRnJhbWVzICAgICAgICAgRU1BQ19UWENfR1QxQ09MICAgIC8qIFRYIEZyYW1lcyBTdWNjZXNzZnVsIEFmdGVyIE11bHRpcGxlIENvbGxpc2lvbnMgQ291bnQgKi8KKyNkZWZpbmUgT2N0ZXRzVHJhbnNtaXR0ZWRPSyAgICAgICAgICAgICBFTUFDX1RYQ19PQ1RFVCAgICAgLyogVFggT2N0ZXRzIFN1Y2Nlc3NmdWxseSBSZWNlaXZlZCBDb3VudCAgICAgICAgICAgICAgICAqLworI2RlZmluZSBGcmFtZXNXaXRoRGVmZXJyZWRYbWlzc2lvbnMgICAgIEVNQUNfVFhDX0RFRkVSICAgICAvKiBUWCBGcmFtZSBEZWxheWVkIER1ZSBUbyBCdXN5IENvdW50ICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIExhdGVDb2xsaXNpb25zICAgICAgICAgICAgICAgICAgRU1BQ19UWENfTEFURUNMICAgIC8qIExhdGUgVFggQ29sbGlzaW9ucyBDb3VudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRnJhbWVzQWJvcnRlZER1ZVRvWFNDb2xscyAgICAgICBFTUFDX1RYQ19YU19DT0wgICAgLyogVFggRnJhbWUgRmFpbGVkIER1ZSBUbyBFeGNlc3NpdmUgQ29sbGlzaW9ucyBDb3VudCAgICAqLworI2RlZmluZSBGcmFtZXNMb3N0RHVlVG9JbnRNYWNYbWl0RXJyb3IgIEVNQUNfVFhDX0RNQVVORCAgICAvKiBJbnRlcm5hbCBNQUMgU3VibGF5ZXIgRXJyb3IgVFggRnJhbWUgQ291bnQgICAgICAgICAgICovCisjZGVmaW5lIENhcnJpZXJTZW5zZUVycm9ycyAgICAgICAgICAgICAgRU1BQ19UWENfQ1JTRVJSICAgIC8qIENhcnJpZXIgU2Vuc2UgRGVhc3NlcnRlZCBEdXJpbmcgVFggRnJhbWUgQ291bnQgICAgICAgKi8KKyNkZWZpbmUgVW5pY2FzdEZyYW1lc1htaXR0ZWRPSyAgICAgICAgICBFTUFDX1RYQ19VTklDU1QgICAgLyogVW5pY2FzdCBUWCBGcmFtZSBDb3VudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBNdWx0aWNhc3RGcmFtZXNYbWl0dGVkT0sgICAgICAgIEVNQUNfVFhDX01VTFRJICAgICAvKiBNdWx0aWNhc3QgVFggRnJhbWUgQ291bnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEJyb2FkY2FzdEZyYW1lc1htaXR0ZWRPSyAgICAgICAgRU1BQ19UWENfQlJPQUQgICAgIC8qIEJyb2FkY2FzdCBUWCBGcmFtZSBDb3VudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRnJhbWVzV2l0aEV4Y2Vzc2l2ZURlZmVycmFsICAgICBFTUFDX1RYQ19YU19ERlIgICAgLyogVFggRnJhbWVzIFdpdGggRXhjZXNzaXZlIERlZmVycmFsIENvdW50ICAgICAgICAgICAgICAqLworI2RlZmluZSBNQUNDb250cm9sRnJhbWVzVHJhbnNtaXR0ZWQgICAgIEVNQUNfVFhDX01BQ0NUTCAgICAvKiBNQUMgQ29udHJvbCBUWCBGcmFtZSBDb3VudCAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEZyYW1lc1RyYW5zbWl0dGVkQWxsICAgICAgICAgICAgRU1BQ19UWENfQUxMRlJNICAgIC8qIE92ZXJhbGwgVFggRnJhbWUgQ291bnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgT2N0ZXRzVHJhbnNtaXR0ZWRBbGwgICAgICAgICAgICBFTUFDX1RYQ19BTExPQ1QgICAgLyogT3ZlcmFsbCBUWCBPY3RldCBDb3VudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBGcmFtZXNMZW5FcTY0VHJhbnNtaXR0ZWQgICAgICAgIEVNQUNfVFhDX0VRNjQgICAgICAvKiBHb29kIFRYIEZyYW1lIENvdW50IC0gQnl0ZSBDb3VudCB4ID0gNjQgICAgICAgICAgICAgICovCisjZGVmaW5lIEZyYW1lc0xlbjY1XzEyN1RyYW5zbWl0dGVkICAgICAgRU1BQ19UWENfTFQxMjggICAgIC8qIEdvb2QgVFggRnJhbWUgQ291bnQgLSBCeXRlIENvdW50ICA2NCA8IHggPCAxMjggICAgICAgKi8KKyNkZWZpbmUgRnJhbWVzTGVuMTI4XzI1NVRyYW5zbWl0dGVkICAgICBFTUFDX1RYQ19MVDI1NiAgICAgLyogR29vZCBUWCBGcmFtZSBDb3VudCAtIEJ5dGUgQ291bnQgMTI4IDw9IHggPCAyNTYgICAgICAqLworI2RlZmluZSBGcmFtZXNMZW4yNTZfNTExVHJhbnNtaXR0ZWQgICAgIEVNQUNfVFhDX0xUNTEyICAgICAvKiBHb29kIFRYIEZyYW1lIENvdW50IC0gQnl0ZSBDb3VudCAyNTYgPD0geCA8IDUxMiAgICAgICovCisjZGVmaW5lIEZyYW1lc0xlbjUxMl8xMDIzVHJhbnNtaXR0ZWQgICAgRU1BQ19UWENfTFQxMDI0ICAgIC8qIEdvb2QgVFggRnJhbWUgQ291bnQgLSBCeXRlIENvdW50IDUxMiA8PSB4IDwgMTAyNCAgICAgKi8KKyNkZWZpbmUgRnJhbWVzTGVuMTAyNF9NYXhUcmFuc21pdHRlZCAgICBFTUFDX1RYQ19HRTEwMjQgICAgLyogR29vZCBUWCBGcmFtZSBDb3VudCAtIEJ5dGUgQ291bnQgeCA+PSAxMDI0ICAgICAgICAgICAqLworI2RlZmluZSBUeEFib3J0ZWRGcmFtZXMgICAgICAgICAgICAgICAgIEVNQUNfVFhDX0FCT1JUICAgICAvKiBUb3RhbCBUWCBGcmFtZXMgQWJvcnRlZCBDb3VudCAgICAgICAgICAgICAgICAgICAgICAgICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiogU3lzdGVtIE1NUiBSZWdpc3RlciBCaXRzIEFuZCBNYWNyb3MKKyoqCisqKiBEaXNjbGFpbWVyOglBbGwgbWFjcm9zIGFyZSBpbnRlbmRlZCB0byBtYWtlIEMgYW5kIEFzc2VtYmx5IGNvZGUgbW9yZSByZWFkYWJsZS4KKyoqCQkJCVVzZSB0aGVzZSBtYWNyb3MgY2FyZWZ1bGx5LCBhcyBhbnkgdGhhdCBkbyBsZWZ0IHNoaWZ0cyBmb3IgZmllbGQKKyoqCQkJCWRlcG9zaXRpbmcgd2lsbCByZXN1bHQgaW4gdGhlIGxvd2VyIG9yZGVyIGJpdHMgYmVpbmcgZGVzdHJveWVkLiAgQW55CisqKgkJCQltYWNybyB0aGF0IHNoaWZ0cyBsZWZ0IHRvIHByb3Blcmx5IHBvc2l0aW9uIHRoZSBiaXQtZmllbGQgc2hvdWxkIGJlCisqKgkJCQl1c2VkIGFzIHBhcnQgb2YgYW4gT1IgdG8gaW5pdGlhbGl6ZSBhIHJlZ2lzdGVyIGFuZCBOT1QgYXMgYSBkeW5hbWljCisqKgkJCQltb2RpZmllciBVTkxFU1MgdGhlIGxvd2VyIG9yZGVyIGJpdHMgYXJlIHNhdmVkIGFuZCBPUmVkIGJhY2sgaW4gd2hlbgorKioJCQkJdGhlIG1hY3JvIGlzIHVzZWQuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqICBFVEhFUk5FVCAxMC8xMDAgQ09OVFJPTExFUiBNQVNLUyAgKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBFTUFDX09QTU9ERSBNYXNrcyAqLworCisjZGVmaW5lCVJFICAgICAgICAgICAgICAgICAweDAwMDAwMDAxICAgICAvKiBSZWNlaXZlciBFbmFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlBU1RQICAgICAgICAgICAgICAgMHgwMDAwMDAwMiAgICAgLyogRW5hYmxlIEF1dG9tYXRpYyBQYWQgU3RyaXBwaW5nIE9uIFJYIEZyYW1lcyAgICAgICAgKi8KKyNkZWZpbmUJSFUgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTAgICAgIC8qIEhhc2ggRmlsdGVyIFVuaWNhc3QgQWRkcmVzcyAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCUhNICAgICAgICAgICAgICAgICAweDAwMDAwMDIwICAgICAvKiBIYXNoIEZpbHRlciBNdWx0aWNhc3QgQWRkcmVzcyAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlQQU0gICAgICAgICAgICAgICAgMHgwMDAwMDA0MCAgICAgLyogUGFzcy1BbGwtTXVsdGljYXN0IE1vZGUgRW5hYmxlICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJUFIgICAgICAgICAgICAgICAgIDB4MDAwMDAwODAgICAgIC8qIFByb21pc2N1b3VzIE1vZGUgRW5hYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCUlGRSAgICAgICAgICAgICAgICAweDAwMDAwMTAwICAgICAvKiBJbnZlcnNlIEZpbHRlcmluZyBFbmFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlEQkYgICAgICAgICAgICAgICAgMHgwMDAwMDIwMCAgICAgLyogRGlzYWJsZSBCcm9hZGNhc3QgRnJhbWUgUmVjZXB0aW9uICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJUEJGICAgICAgICAgICAgICAgIDB4MDAwMDA0MDAgICAgIC8qIFBhc3MgQmFkIEZyYW1lcyBFbmFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVBTRiAgICAgICAgICAgICAgICAweDAwMDAwODAwICAgICAvKiBQYXNzIFNob3J0IEZyYW1lcyBFbmFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlSQUYgICAgICAgICAgICAgICAgMHgwMDAwMTAwMCAgICAgLyogUmVjZWl2ZS1BbGwgTW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJVEUgICAgICAgICAgICAgICAgIDB4MDAwMTAwMDAgICAgIC8qIFRyYW5zbWl0dGVyIEVuYWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCURUWFBBRCAgICAgICAgICAgICAweDAwMDIwMDAwICAgICAvKiBEaXNhYmxlIEF1dG9tYXRpYyBUWCBQYWRkaW5nICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlEVFhDUkMgICAgICAgICAgICAgMHgwMDA0MDAwMCAgICAgLyogRGlzYWJsZSBBdXRvbWF0aWMgVFggQ1JDIEdlbmVyYXRpb24gICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJREMgICAgICAgICAgICAgICAgIDB4MDAwODAwMDAgICAgIC8qIERlZmVycmFsIENoZWNrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCUJPTE1UICAgICAgICAgICAgICAweDAwMzAwMDAwICAgICAvKiBCYWNrLU9mZiBMaW1pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlCT0xNVF8xMCAgICAgICAgICAgMHgwMDAwMDAwMCAgICAgLyoJCTEwLWJpdCByYW5nZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlCT0xNVF84ICAgICAgICAgICAgMHgwMDEwMDAwMCAgICAgLyoJCTgtYml0IHJhbmdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlCT0xNVF80ICAgICAgICAgICAgMHgwMDIwMDAwMCAgICAgLyoJCTQtYml0IHJhbmdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlCT0xNVF8xICAgICAgICAgICAgMHgwMDMwMDAwMCAgICAgLyoJCTEtYml0IHJhbmdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlEUlRZICAgICAgICAgICAgICAgMHgwMDQwMDAwMCAgICAgLyogRGlzYWJsZSBUWCBSZXRyeSBPbiBDb2xsaXNpb24gICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJTENUUkUgICAgICAgICAgICAgIDB4MDA4MDAwMDAgICAgIC8qIEVuYWJsZSBUWCBSZXRyeSBPbiBMYXRlIENvbGxpc2lvbiAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVJNSUkgICAgICAgICAgICAgICAweDAxMDAwMDAwICAgICAvKiBSTUlJL01JSSogTW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlSTUlJXzEwICAgICAgICAgICAgMHgwMjAwMDAwMCAgICAgLyogU3BlZWQgU2VsZWN0IGZvciBSTUlJIFBvcnQgKDEwTUJpdC8xMDBNQml0KikgICAgICAgKi8KKyNkZWZpbmUJRkRNT0RFICAgICAgICAgICAgIDB4MDQwMDAwMDAgICAgIC8qIER1cGxleCBNb2RlIEVuYWJsZSAoRnVsbC9IYWxmKikgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCUxCICAgICAgICAgICAgICAgICAweDA4MDAwMDAwICAgICAvKiBJbnRlcm5hbCBMb29wYmFjayBFbmFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlEUk8gICAgICAgICAgICAgICAgMHgxMDAwMDAwMCAgICAgLyogRGlzYWJsZSBSZWNlaXZlIE93biBGcmFtZXMgKEhhbGYtRHVwbGV4IE1vZGUpICAgICAgKi8KKworLyogRU1BQ19TVEFBREQgTWFza3MgKi8KKworI2RlZmluZQlTVEFCVVNZICAgICAgICAgICAgMHgwMDAwMDAwMSAgICAgLyogSW5pdGlhdGUgU3RhdGlvbiBNZ3QgUmVnIEFjY2VzcyAvIFNUQSBCdXN5IFN0YXQgICAgKi8KKyNkZWZpbmUJU1RBT1AgICAgICAgICAgICAgIDB4MDAwMDAwMDIgICAgIC8qIFN0YXRpb24gTWFuYWdlbWVudCBPcGVyYXRpb24gQ29kZSAoV3JpdGUvUmVhZCopICAgICovCisjZGVmaW5lCVNUQURJU1BSRSAgICAgICAgICAweDAwMDAwMDA0ICAgICAvKiBEaXNhYmxlIFByZWFtYmxlIEdlbmVyYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlTVEFJRSAgICAgICAgICAgICAgMHgwMDAwMDAwOCAgICAgLyogU3RhdGlvbiBNZ3QuIFRyYW5zZmVyIERvbmUgSW50ZXJydXB0IEVuYWJsZSAgICAgICAgKi8KKyNkZWZpbmUJUkVHQUQgICAgICAgICAgICAgIDB4MDAwMDA3QzAgICAgIC8qIFNUQSBSZWdpc3RlciBBZGRyZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVBIWUFEICAgICAgICAgICAgICAweDAwMDBGODAwICAgICAvKiBQSFkgRGV2aWNlIEFkZHJlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisjZGVmaW5lCVNFVF9SRUdBRCh4KSAoKCh4KSYweDFGKTw8ICA2ICkgICAvKiBTZXQgU1RBIFJlZ2lzdGVyIEFkZHJlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlTRVRfUEhZQUQoeCkgKCgoeCkmMHgxRik8PCAxMSApICAgLyogU2V0IFBIWSBEZXZpY2UgQWRkcmVzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworLyogRU1BQ19TVEFEQVQgTWFzayAqLworCisjZGVmaW5lCVNUQURBVEEgICAgICAgICAgICAweDAwMDBGRkZGICAgICAvKiBTdGF0aW9uIE1hbmFnZW1lbnQgRGF0YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisvKiBFTUFDX0ZMQyBNYXNrcyAqLworCisjZGVmaW5lCUZMQ0JVU1kgICAgICAgICAgICAweDAwMDAwMDAxICAgICAvKiBTZW5kIEZsb3cgQ3RybCBGcmFtZSAvIEZsb3cgQ3RybCBCdXN5IFN0YXR1cyAgICAgICAqLworI2RlZmluZQlGTENFICAgICAgICAgICAgICAgMHgwMDAwMDAwMiAgICAgLyogRmxvdyBDb250cm9sIEVuYWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJUENGICAgICAgICAgICAgICAgIDB4MDAwMDAwMDQgICAgIC8qIFBhc3MgQ29udHJvbCBGcmFtZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCUJLUFJTRU4gICAgICAgICAgICAweDAwMDAwMDA4ICAgICAvKiBFbmFibGUgQmFja3ByZXNzdXJlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlGTENQQVVTRSAgICAgICAgICAgMHhGRkZGMDAwMCAgICAgLyogUGF1c2UgVGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworI2RlZmluZQlTRVRfRkxDUEFVU0UoeCkgKCgoeCkmMHhGRkZGKTw8IDE2KSAvKiBTZXQgUGF1c2UgVGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworLyogRU1BQ19XS1VQX0NUTCBNYXNrcyAqLworCisjZGVmaW5lCUNBUFdLRlJNICAgICAgICAgICAweDAwMDAwMDAxICAgIC8qIENhcHR1cmUgV2FrZS1VcCBGcmFtZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlNUEtFICAgICAgICAgICAgICAgMHgwMDAwMDAwMiAgICAvKiBNYWdpYyBQYWNrZXQgRW5hYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJUldLRSAgICAgICAgICAgICAgIDB4MDAwMDAwMDQgICAgLyogUmVtb3RlIFdha2UtVXAgRnJhbWUgRW5hYmxlICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCUdVV0tFICAgICAgICAgICAgICAweDAwMDAwMDA4ICAgIC8qIEdsb2JhbCBVbmljYXN0IFdha2UgRW5hYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlNUEtTICAgICAgICAgICAgICAgMHgwMDAwMDAyMCAgICAvKiBNYWdpYyBQYWNrZXQgUmVjZWl2ZWQgU3RhdHVzICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJUldLUyAgICAgICAgICAgICAgIDB4MDAwMDBGMDAgICAgLyogV2FrZS1VcCBGcmFtZSBSZWNlaXZlZCBTdGF0dXMsIEZpbHRlcnMgMzowICAgICAgICAgICovCisKKy8qIEVNQUNfV0tVUF9GRkNNRCBNYXNrcyAqLworCisjZGVmaW5lCVdGMF9FICAgICAgICAgICAgICAweDAwMDAwMDAxICAgIC8qIEVuYWJsZSBXYWtlLVVwIEZpbHRlciAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJV0YwX1QgICAgICAgICAgICAgIDB4MDAwMDAwMDggICAgLyogV2FrZS1VcCBGaWx0ZXIgMCBBZGRyIFR5cGUgKE11bHRpY2FzdC9VbmljYXN0KikgICAgICAqLworI2RlZmluZQlXRjFfRSAgICAgICAgICAgICAgMHgwMDAwMDEwMCAgICAvKiBFbmFibGUgV2FrZS1VcCBGaWx0ZXIgMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVdGMV9UICAgICAgICAgICAgICAweDAwMDAwODAwICAgIC8qIFdha2UtVXAgRmlsdGVyIDEgQWRkciBUeXBlIChNdWx0aWNhc3QvVW5pY2FzdCopICAgICAgKi8KKyNkZWZpbmUJV0YyX0UgICAgICAgICAgICAgIDB4MDAwMTAwMDAgICAgLyogRW5hYmxlIFdha2UtVXAgRmlsdGVyIDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlXRjJfVCAgICAgICAgICAgICAgMHgwMDA4MDAwMCAgICAvKiBXYWtlLVVwIEZpbHRlciAyIEFkZHIgVHlwZSAoTXVsdGljYXN0L1VuaWNhc3QqKSAgICAgICovCisjZGVmaW5lCVdGM19FICAgICAgICAgICAgICAweDAxMDAwMDAwICAgIC8qIEVuYWJsZSBXYWtlLVVwIEZpbHRlciAzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJV0YzX1QgICAgICAgICAgICAgIDB4MDgwMDAwMDAgICAgLyogV2FrZS1VcCBGaWx0ZXIgMyBBZGRyIFR5cGUgKE11bHRpY2FzdC9VbmljYXN0KikgICAgICAqLworCisvKiBFTUFDX1dLVVBfRkZPRkYgTWFza3MgKi8KKworI2RlZmluZQlXRjBfT0ZGICAgICAgICAgICAgMHgwMDAwMDBGRiAgICAvKiBXYWtlLVVwIEZpbHRlciAwIFBhdHRlcm4gT2Zmc2V0ICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVdGMV9PRkYgICAgICAgICAgICAweDAwMDBGRjAwICAgIC8qIFdha2UtVXAgRmlsdGVyIDEgUGF0dGVybiBPZmZzZXQgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJV0YyX09GRiAgICAgICAgICAgIDB4MDBGRjAwMDAgICAgLyogV2FrZS1VcCBGaWx0ZXIgMiBQYXR0ZXJuIE9mZnNldCAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlXRjNfT0ZGICAgICAgICAgICAgMHhGRjAwMDAwMCAgICAvKiBXYWtlLVVwIEZpbHRlciAzIFBhdHRlcm4gT2Zmc2V0ICAgICAgICAgICAgICAgICAgICAgICovCisKKyNkZWZpbmUJU0VUX1dGMF9PRkYoeCkgKCgoeCkmMHhGRik8PCAgMCApIC8qIFNldCBXYWtlLVVwIEZpbHRlciAwIEJ5dGUgT2Zmc2V0ICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlTRVRfV0YxX09GRih4KSAoKCh4KSYweEZGKTw8ICA4ICkgLyogU2V0IFdha2UtVXAgRmlsdGVyIDEgQnl0ZSBPZmZzZXQgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVNFVF9XRjJfT0ZGKHgpICgoKHgpJjB4RkYpPDwgMTYgKSAvKiBTZXQgV2FrZS1VcCBGaWx0ZXIgMiBCeXRlIE9mZnNldCAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJU0VUX1dGM19PRkYoeCkgKCgoeCkmMHhGRik8PCAyNCApIC8qIFNldCBXYWtlLVVwIEZpbHRlciAzIEJ5dGUgT2Zmc2V0ICAgICAgICAgICAgICAgICAgICAqLworLyogU2V0IEFMTCBPZmZzZXRzICovCisjZGVmaW5lCVNFVF9XRl9PRkZTKHgwLHgxLHgyLHgzKSAoU0VUX1dGMF9PRkYoKHgwKSl8U0VUX1dGMV9PRkYoKHgxKSl8U0VUX1dGMl9PRkYoKHgyKSl8U0VUX1dGM19PRkYoKHgzKSkpCisKKy8qIEVNQUNfV0tVUF9GRkNSQzAgTWFza3MgKi8KKworI2RlZmluZQlXRjBfQ1JDICAgICAgICAgICAweDAwMDBGRkZGICAgIC8qIFdha2UtVXAgRmlsdGVyIDAgUGF0dGVybiBDUkMgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlXRjFfQ1JDICAgICAgICAgICAweEZGRkYwMDAwICAgIC8qIFdha2UtVXAgRmlsdGVyIDEgUGF0dGVybiBDUkMgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisjZGVmaW5lCVNFVF9XRjBfQ1JDKHgpICgoKHgpJjB4RkZGRik8PCAgIDAgKSAvKiBTZXQgV2FrZS1VcCBGaWx0ZXIgMCBUYXJnZXQgQ1JDICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVNFVF9XRjFfQ1JDKHgpICgoKHgpJjB4RkZGRik8PCAgMTYgKSAvKiBTZXQgV2FrZS1VcCBGaWx0ZXIgMSBUYXJnZXQgQ1JDICAgICAgICAgICAgICAgICAgICovCisKKy8qIEVNQUNfV0tVUF9GRkNSQzEgTWFza3MgKi8KKworI2RlZmluZQlXRjJfQ1JDICAgICAgICAgICAweDAwMDBGRkZGICAgIC8qIFdha2UtVXAgRmlsdGVyIDIgUGF0dGVybiBDUkMgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlXRjNfQ1JDICAgICAgICAgICAweEZGRkYwMDAwICAgIC8qIFdha2UtVXAgRmlsdGVyIDMgUGF0dGVybiBDUkMgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisjZGVmaW5lCVNFVF9XRjJfQ1JDKHgpICgoKHgpJjB4RkZGRik8PCAgIDAgKSAvKiBTZXQgV2FrZS1VcCBGaWx0ZXIgMiBUYXJnZXQgQ1JDICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVNFVF9XRjNfQ1JDKHgpICgoKHgpJjB4RkZGRik8PCAgMTYgKSAvKiBTZXQgV2FrZS1VcCBGaWx0ZXIgMyBUYXJnZXQgQ1JDICAgICAgICAgICAgICAgICAgICovCisKKy8qIEVNQUNfU1lTQ1RMIE1hc2tzICovCisKKyNkZWZpbmUJUEhZSUUgICAgICAgICAgICAgMHgwMDAwMDAwMSAgICAvKiBQSFlfSU5UIEludGVycnVwdCBFbmFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJUlhEV0EgICAgICAgICAgICAgMHgwMDAwMDAwMiAgICAvKiBSZWNlaXZlIEZyYW1lIERNQSBXb3JkIEFsaWdubWVudCAoT2RkL0V2ZW4qKSAgICAgICAgICAgKi8KKyNkZWZpbmUJUlhDS1MgICAgICAgICAgICAgMHgwMDAwMDAwNCAgICAvKiBFbmFibGUgUlggRnJhbWUgVENQL1VEUCBDaGVja3N1bSBDb21wdXRhdGlvbiAgICAgICAgICAgKi8KKyNkZWZpbmUJVFhEV0EgICAgICAgICAgICAgMHgwMDAwMDAxMCAgICAvKiBUcmFuc21pdCBGcmFtZSBETUEgV29yZCBBbGlnbm1lbnQgKE9kZC9FdmVuKikgICAgICAgICAgKi8KKyNkZWZpbmUJTURDRElWICAgICAgICAgICAgMHgwMDAwM0YwMCAgICAvKiBTQ0xLOk1EQyBDbG9jayBEaXZpc29yIFtNREM9U0NMSy8oMiooTisxKSldICAgICAgICAgICAgKi8KKworI2RlZmluZQlTRVRfTURDRElWKHgpICgoKHgpJjB4M0YpPDwgOCkgICAvKiBTZXQgTURDIENsb2NrIERpdmlzb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisvKiBFTUFDX1NZU1RBVCBNYXNrcyAqLworCisjZGVmaW5lCVBIWUlOVCAgICAgICAgICAgIDB4MDAwMDAwMDEgICAgLyogUEhZX0lOVCBJbnRlcnJ1cHQgU3RhdHVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCU1NQ0lOVCAgICAgICAgICAgIDB4MDAwMDAwMDIgICAgLyogTU1DIENvdW50ZXIgSW50ZXJydXB0IFN0YXR1cyAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVJYRlNJTlQgICAgICAgICAgIDB4MDAwMDAwMDQgICAgLyogUlggRnJhbWUtU3RhdHVzIEludGVycnVwdCBTdGF0dXMgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVRYRlNJTlQgICAgICAgICAgIDB4MDAwMDAwMDggICAgLyogVFggRnJhbWUtU3RhdHVzIEludGVycnVwdCBTdGF0dXMgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVdBS0VERVQgICAgICAgICAgIDB4MDAwMDAwMTAgICAgLyogV2FrZS1VcCBEZXRlY3RlZCBTdGF0dXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVJYRE1BRVJSICAgICAgICAgIDB4MDAwMDAwMjAgICAgLyogUlggRE1BIERpcmVjdGlvbiBFcnJvciBTdGF0dXMgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVRYRE1BRVJSICAgICAgICAgIDB4MDAwMDAwNDAgICAgLyogVFggRE1BIERpcmVjdGlvbiBFcnJvciBTdGF0dXMgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVNUTURPTkUgICAgICAgICAgIDB4MDAwMDAwODAgICAgLyogU3RhdGlvbiBNZ3QuIFRyYW5zZmVyIERvbmUgSW50ZXJydXB0IFN0YXR1cyAgICAgICAgICAgICovCisKKy8qIEVNQUNfUlhfU1RBVCwgRU1BQ19SWF9TVEtZLCBhbmQgRU1BQ19SWF9JUlFFIE1hc2tzICovCisKKyNkZWZpbmUJUlhfRlJMRU4gICAgICAgICAgMHgwMDAwMDdGRiAgICAvKiBGcmFtZSBMZW5ndGggSW4gQnl0ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJUlhfQ09NUCAgICAgICAgICAgMHgwMDAwMTAwMCAgICAvKiBSWCBGcmFtZSBDb21wbGV0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJUlhfT0sgICAgICAgICAgICAgMHgwMDAwMjAwMCAgICAvKiBSWCBGcmFtZSBSZWNlaXZlZCBXaXRoIE5vIEVycm9ycyAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJUlhfTE9ORyAgICAgICAgICAgMHgwMDAwNDAwMCAgICAvKiBSWCBGcmFtZSBUb28gTG9uZyBFcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJUlhfQUxJR04gICAgICAgICAgMHgwMDAwODAwMCAgICAvKiBSWCBGcmFtZSBBbGlnbm1lbnQgRXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJUlhfQ1JDICAgICAgICAgICAgMHgwMDAxMDAwMCAgICAvKiBSWCBGcmFtZSBDUkMgRXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJUlhfTEVOICAgICAgICAgICAgMHgwMDAyMDAwMCAgICAvKiBSWCBGcmFtZSBMZW5ndGggRXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJUlhfRlJBRyAgICAgICAgICAgMHgwMDA0MDAwMCAgICAvKiBSWCBGcmFtZSBGcmFnbWVudCBFcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJUlhfQUREUiAgICAgICAgICAgMHgwMDA4MDAwMCAgICAvKiBSWCBGcmFtZSBBZGRyZXNzIEZpbHRlciBGYWlsZWQgRXJyb3IgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJUlhfRE1BTyAgICAgICAgICAgMHgwMDEwMDAwMCAgICAvKiBSWCBGcmFtZSBETUEgT3ZlcnJ1biBFcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJUlhfUEhZICAgICAgICAgICAgMHgwMDIwMDAwMCAgICAvKiBSWCBGcmFtZSBQSFkgRXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJUlhfTEFURSAgICAgICAgICAgMHgwMDQwMDAwMCAgICAvKiBSWCBGcmFtZSBMYXRlIENvbGxpc2lvbiBFcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJUlhfUkFOR0UgICAgICAgICAgMHgwMDgwMDAwMCAgICAvKiBSWCBGcmFtZSBMZW5ndGggRmllbGQgT3V0IG9mIFJhbmdlIEVycm9yICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJUlhfTVVMVEkgICAgICAgICAgMHgwMTAwMDAwMCAgICAvKiBSWCBNdWx0aWNhc3QgRnJhbWUgSW5kaWNhdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJUlhfQlJPQUQgICAgICAgICAgMHgwMjAwMDAwMCAgICAvKiBSWCBCcm9hZGNhc3QgRnJhbWUgSW5kaWNhdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJUlhfQ1RMICAgICAgICAgICAgMHgwNDAwMDAwMCAgICAvKiBSWCBDb250cm9sIEZyYW1lIEluZGljYXRvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJUlhfVUNUTCAgICAgICAgICAgMHgwODAwMDAwMCAgICAvKiBVbnN1cHBvcnRlZCBSWCBDb250cm9sIEZyYW1lIEluZGljYXRvciAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJUlhfVFlQRSAgICAgICAgICAgMHgxMDAwMDAwMCAgICAvKiBSWCBUeXBlZCBGcmFtZSBJbmRpY2F0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJUlhfVkxBTjEgICAgICAgICAgMHgyMDAwMDAwMCAgICAvKiBSWCBWTEFOMSBGcmFtZSBJbmRpY2F0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJUlhfVkxBTjIgICAgICAgICAgMHg0MDAwMDAwMCAgICAvKiBSWCBWTEFOMiBGcmFtZSBJbmRpY2F0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJUlhfQUNDRVBUICAgICAgICAgMHg4MDAwMDAwMCAgICAvKiBSWCBGcmFtZSBBY2NlcHRlZCBJbmRpY2F0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworLyogIEVNQUNfVFhfU1RBVCwgRU1BQ19UWF9TVEtZLCBhbmQgRU1BQ19UWF9JUlFFIE1hc2tzICAqLworCisjZGVmaW5lCVRYX0NPTVAgICAgICAgICAgIDB4MDAwMDAwMDEgICAgLyogVFggRnJhbWUgQ29tcGxldGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVRYX09LICAgICAgICAgICAgIDB4MDAwMDAwMDIgICAgLyogVFggRnJhbWUgU2VudCBXaXRoIE5vIEVycm9ycyAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVRYX0VDT0xMICAgICAgICAgIDB4MDAwMDAwMDQgICAgLyogVFggRnJhbWUgRXhjZXNzaXZlIENvbGxpc2lvbiBFcnJvciAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVRYX0xBVEUgICAgICAgICAgIDB4MDAwMDAwMDggICAgLyogVFggRnJhbWUgTGF0ZSBDb2xsaXNpb24gRXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVRYX0RNQVUgICAgICAgICAgIDB4MDAwMDAwMTAgICAgLyogVFggRnJhbWUgRE1BIFVuZGVycnVuIEVycm9yIChTVEFUKSAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVRYX01BQ0UgICAgICAgICAgIDB4MDAwMDAwMTAgICAgLyogSW50ZXJuYWwgTUFDIEVycm9yIERldGVjdGVkIChTVEtZIGFuZCBJUlFFKSAgICAgICAgICAgICovCisjZGVmaW5lCVRYX0VERUZFUiAgICAgICAgIDB4MDAwMDAwMjAgICAgLyogVFggRnJhbWUgRXhjZXNzaXZlIERlZmVycmFsIEVycm9yICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVRYX0JST0FEICAgICAgICAgIDB4MDAwMDAwNDAgICAgLyogVFggQnJvYWRjYXN0IEZyYW1lIEluZGljYXRvciAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVRYX01VTFRJICAgICAgICAgIDB4MDAwMDAwODAgICAgLyogVFggTXVsdGljYXN0IEZyYW1lIEluZGljYXRvciAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVRYX0NDTlQgICAgICAgICAgIDB4MDAwMDBGMDAgICAgLyogVFggRnJhbWUgQ29sbGlzaW9uIENvdW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVRYX0RFRkVSICAgICAgICAgIDB4MDAwMDEwMDAgICAgLyogVFggRnJhbWUgRGVmZXJyZWQgSW5kaWNhdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVRYX0NSUyAgICAgICAgICAgIDB4MDAwMDIwMDAgICAgLyogVFggRnJhbWUgQ2FycmllciBTZW5zZSBOb3QgQXNzZXJ0ZWQgRXJyb3IgICAgICAgICAgICAgICovCisjZGVmaW5lCVRYX0xPU1MgICAgICAgICAgIDB4MDAwMDQwMDAgICAgLyogVFggRnJhbWUgQ2FycmllciBMb3N0IER1cmluZyBUWCBFcnJvciAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVRYX1JFVFJZICAgICAgICAgIDB4MDAwMDgwMDAgICAgLyogVFggRnJhbWUgU3VjY2Vzc2Z1bCBBZnRlciBSZXRyeSAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVRYX0ZSTEVOICAgICAgICAgIDB4MDdGRjAwMDAgICAgLyogVFggRnJhbWUgTGVuZ3RoIChCeXRlcykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKy8qIEVNQUNfTU1DX0NUTCBNYXNrcyAqLworI2RlZmluZQlSU1RDICAgICAgICAgICAgICAweDAwMDAwMDAxICAgIC8qIFJlc2V0IEFsbCBDb3VudGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlDUk9MTCAgICAgICAgICAgICAweDAwMDAwMDAyICAgIC8qIENvdW50ZXIgUm9sbC1PdmVyIEVuYWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlDQ09SICAgICAgICAgICAgICAweDAwMDAwMDA0ICAgIC8qIENvdW50ZXIgQ2xlYXItT24tUmVhZCBNb2RlIEVuYWJsZSAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZQlNTUNFICAgICAgICAgICAgICAweDAwMDAwMDA4ICAgIC8qIEVuYWJsZSBNTUMgQ291bnRlciBPcGVyYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisvKiBFTUFDX01NQ19SSVJRUyBhbmQgRU1BQ19NTUNfUklSUUUgTWFza3MgKi8KKyNkZWZpbmUJUlhfT0tfQ05UICAgICAgICAgMHgwMDAwMDAwMSAgICAvKiBSWCBGcmFtZXMgUmVjZWl2ZWQgV2l0aCBObyBFcnJvcnMgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJUlhfRkNTX0NOVCAgICAgICAgMHgwMDAwMDAwMiAgICAvKiBSWCBGcmFtZXMgVy9GcmFtZSBDaGVjayBTZXF1ZW5jZSBFcnJvcnMgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJUlhfQUxJR05fQ05UICAgICAgMHgwMDAwMDAwNCAgICAvKiBSWCBGcmFtZXMgV2l0aCBBbGlnbm1lbnQgRXJyb3JzICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJUlhfT0NURVRfQ05UICAgICAgMHgwMDAwMDAwOCAgICAvKiBSWCBPY3RldHMgUmVjZWl2ZWQgT0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJUlhfTE9TVF9DTlQgICAgICAgMHgwMDAwMDAxMCAgICAvKiBSWCBGcmFtZXMgTG9zdCBEdWUgVG8gSW50ZXJuYWwgTUFDIFJYIEVycm9yICAgICAgICAgICAgKi8KKyNkZWZpbmUJUlhfVU5JX0NOVCAgICAgICAgMHgwMDAwMDAyMCAgICAvKiBVbmljYXN0IFJYIEZyYW1lcyBSZWNlaXZlZCBPSyAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJUlhfTVVMVElfQ05UICAgICAgMHgwMDAwMDA0MCAgICAvKiBNdWx0aWNhc3QgUlggRnJhbWVzIFJlY2VpdmVkIE9LICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJUlhfQlJPQURfQ05UICAgICAgMHgwMDAwMDA4MCAgICAvKiBCcm9hZGNhc3QgUlggRnJhbWVzIFJlY2VpdmVkIE9LICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJUlhfSVJMX0NOVCAgICAgICAgMHgwMDAwMDEwMCAgICAvKiBSWCBGcmFtZXMgV2l0aCBJbi1SYW5nZSBMZW5ndGggRXJyb3JzICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJUlhfT1JMX0NOVCAgICAgICAgMHgwMDAwMDIwMCAgICAvKiBSWCBGcmFtZXMgV2l0aCBPdXQtT2YtUmFuZ2UgTGVuZ3RoIEVycm9ycyAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJUlhfTE9OR19DTlQgICAgICAgMHgwMDAwMDQwMCAgICAvKiBSWCBGcmFtZXMgV2l0aCBGcmFtZSBUb28gTG9uZyBFcnJvcnMgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJUlhfTUFDQ1RMX0NOVCAgICAgMHgwMDAwMDgwMCAgICAvKiBNQUMgQ29udHJvbCBSWCBGcmFtZXMgUmVjZWl2ZWQgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJUlhfT1BDT0RFX0NUTCAgICAgMHgwMDAwMTAwMCAgICAvKiBVbnN1cHBvcnRlZCBPcC1Db2RlIFJYIEZyYW1lcyBSZWNlaXZlZCAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJUlhfUEFVU0VfQ05UICAgICAgMHgwMDAwMjAwMCAgICAvKiBQQVVTRU1BQyBDb250cm9sIFJYIEZyYW1lcyBSZWNlaXZlZCAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJUlhfQUxMRl9DTlQgICAgICAgMHgwMDAwNDAwMCAgICAvKiBBbGwgUlggRnJhbWVzIFJlY2VpdmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJUlhfQUxMT19DTlQgICAgICAgMHgwMDAwODAwMCAgICAvKiBBbGwgUlggT2N0ZXRzIFJlY2VpdmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJUlhfVFlQRURfQ05UICAgICAgMHgwMDAxMDAwMCAgICAvKiBUeXBlZCBSWCBGcmFtZXMgUmVjZWl2ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJUlhfU0hPUlRfQ05UICAgICAgMHgwMDAyMDAwMCAgICAvKiBSWCBGcmFtZSBGcmFnbWVudHMgKDwgNjQgQnl0ZXMpIFJlY2VpdmVkICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJUlhfRVE2NF9DTlQgICAgICAgMHgwMDA0MDAwMCAgICAvKiA2NC1CeXRlIFJYIEZyYW1lcyBSZWNlaXZlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJUlhfTFQxMjhfQ05UICAgICAgMHgwMDA4MDAwMCAgICAvKiA2NS0xMjctQnl0ZSBSWCBGcmFtZXMgUmVjZWl2ZWQgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJUlhfTFQyNTZfQ05UICAgICAgMHgwMDEwMDAwMCAgICAvKiAxMjgtMjU1LUJ5dGUgUlggRnJhbWVzIFJlY2VpdmVkICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJUlhfTFQ1MTJfQ05UICAgICAgMHgwMDIwMDAwMCAgICAvKiAyNTYtNTExLUJ5dGUgUlggRnJhbWVzIFJlY2VpdmVkICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJUlhfTFQxMDI0X0NOVCAgICAgMHgwMDQwMDAwMCAgICAvKiA1MTItMTAyMy1CeXRlIFJYIEZyYW1lcyBSZWNlaXZlZCAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUJUlhfR0UxMDI0X0NOVCAgICAgMHgwMDgwMDAwMCAgICAvKiAxMDI0LU1heC1CeXRlIFJYIEZyYW1lcyBSZWNlaXZlZCAgICAgICAgICAgICAgICAgICAgICAgKi8KKworLyogRU1BQ19NTUNfVElSUVMgYW5kIEVNQUNfTU1DX1RJUlFFIE1hc2tzICAqLworCisjZGVmaW5lCVRYX09LX0NOVCAgICAgICAgIDB4MDAwMDAwMDEgICAgLyogVFggRnJhbWVzIFNlbnQgT0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVRYX1NDT0xMX0NOVCAgICAgIDB4MDAwMDAwMDIgICAgLyogVFggRnJhbWVzIFdpdGggU2luZ2xlIENvbGxpc2lvbnMgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVRYX01DT0xMX0NOVCAgICAgIDB4MDAwMDAwMDQgICAgLyogVFggRnJhbWVzIFdpdGggTXVsdGlwbGUgQ29sbGlzaW9ucyAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVRYX09DVEVUX0NOVCAgICAgIDB4MDAwMDAwMDggICAgLyogVFggT2N0ZXRzIFNlbnQgT0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVRYX0RFRkVSX0NOVCAgICAgIDB4MDAwMDAwMTAgICAgLyogVFggRnJhbWVzIFdpdGggRGVmZXJyZWQgVHJhbnNtaXNzaW9uICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVRYX0xBVEVfQ05UICAgICAgIDB4MDAwMDAwMjAgICAgLyogVFggRnJhbWVzIFdpdGggTGF0ZSBDb2xsaXNpb25zICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVRYX0FCT1JUQ19DTlQgICAgIDB4MDAwMDAwNDAgICAgLyogVFggRnJhbWVzIEFib3J0ZWQgRHVlIFRvIEV4Y2VzcyBDb2xsaXNpb25zICAgICAgICAgICAgICovCisjZGVmaW5lCVRYX0xPU1RfQ05UICAgICAgIDB4MDAwMDAwODAgICAgLyogVFggRnJhbWVzIExvc3QgRHVlIFRvIEludGVybmFsIE1BQyBUWCBFcnJvciAgICAgICAgICAgICovCisjZGVmaW5lCVRYX0NSU19DTlQgICAgICAgIDB4MDAwMDAxMDAgICAgLyogVFggRnJhbWVzIFdpdGggQ2FycmllciBTZW5zZSBFcnJvcnMgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVRYX1VOSV9DTlQgICAgICAgIDB4MDAwMDAyMDAgICAgLyogVW5pY2FzdCBUWCBGcmFtZXMgU2VudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVRYX01VTFRJX0NOVCAgICAgIDB4MDAwMDA0MDAgICAgLyogTXVsdGljYXN0IFRYIEZyYW1lcyBTZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVRYX0JST0FEX0NOVCAgICAgIDB4MDAwMDA4MDAgICAgLyogQnJvYWRjYXN0IFRYIEZyYW1lcyBTZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVRYX0VYREVGX0NUTCAgICAgIDB4MDAwMDEwMDAgICAgLyogVFggRnJhbWVzIFdpdGggRXhjZXNzaXZlIERlZmVycmFsICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVRYX01BQ0NUTF9DTlQgICAgIDB4MDAwMDIwMDAgICAgLyogTUFDIENvbnRyb2wgVFggRnJhbWVzIFNlbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVRYX0FMTEZfQ05UICAgICAgIDB4MDAwMDQwMDAgICAgLyogQWxsIFRYIEZyYW1lcyBTZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVRYX0FMTE9fQ05UICAgICAgIDB4MDAwMDgwMDAgICAgLyogQWxsIFRYIE9jdGV0cyBTZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVRYX0VRNjRfQ05UICAgICAgIDB4MDAwMTAwMDAgICAgLyogNjQtQnl0ZSBUWCBGcmFtZXMgU2VudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVRYX0xUMTI4X0NOVCAgICAgIDB4MDAwMjAwMDAgICAgLyogNjUtMTI3LUJ5dGUgVFggRnJhbWVzIFNlbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVRYX0xUMjU2X0NOVCAgICAgIDB4MDAwNDAwMDAgICAgLyogMTI4LTI1NS1CeXRlIFRYIEZyYW1lcyBTZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVRYX0xUNTEyX0NOVCAgICAgIDB4MDAwODAwMDAgICAgLyogMjU2LTUxMS1CeXRlIFRYIEZyYW1lcyBTZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVRYX0xUMTAyNF9DTlQgICAgIDB4MDAxMDAwMDAgICAgLyogNTEyLTEwMjMtQnl0ZSBUWCBGcmFtZXMgU2VudCAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVRYX0dFMTAyNF9DTlQgICAgIDB4MDAyMDAwMDAgICAgLyogMTAyNC1NYXgtQnl0ZSBUWCBGcmFtZXMgU2VudCAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lCVRYX0FCT1JUX0NOVCAgICAgIDB4MDA0MDAwMDAgICAgLyogVFggRnJhbWVzIEFib3J0ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKy8qIFNESCBSZWdpc3RlcnMgKi8KKworI2RlZmluZSBTREhfUFdSX0NUTCAgICAgICAgICAgICAgICAgICAgMHhGRkMwMzkwMCAvKiBTREggUG93ZXIgQ29udHJvbCAqLworI2RlZmluZSBTREhfQ0xLX0NUTCAgICAgICAgICAgICAgICAgICAgMHhGRkMwMzkwNCAvKiBTREggQ2xvY2sgQ29udHJvbCAqLworI2RlZmluZSBTREhfQVJHVU1FTlQgICAgICAgICAgICAgICAgICAgMHhGRkMwMzkwOCAvKiBTREggQXJndW1lbnQgKi8KKyNkZWZpbmUgU0RIX0NPTU1BTkQgICAgICAgICAgICAgICAgICAgIDB4RkZDMDM5MEMgLyogU0RIIENvbW1hbmQgKi8KKyNkZWZpbmUgU0RIX1JFU1BfQ01EICAgICAgICAgICAgICAgICAgIDB4RkZDMDM5MTAgLyogU0RIIFJlc3BvbnNlIENvbW1hbmQgKi8KKyNkZWZpbmUgU0RIX1JFU1BPTlNFMCAgICAgICAgICAgICAgICAgIDB4RkZDMDM5MTQgLyogU0RIIFJlc3BvbnNlMCAqLworI2RlZmluZSBTREhfUkVTUE9OU0UxICAgICAgICAgICAgICAgICAgMHhGRkMwMzkxOCAvKiBTREggUmVzcG9uc2UxICovCisjZGVmaW5lIFNESF9SRVNQT05TRTIgICAgICAgICAgICAgICAgICAweEZGQzAzOTFDIC8qIFNESCBSZXNwb25zZTIgKi8KKyNkZWZpbmUgU0RIX1JFU1BPTlNFMyAgICAgICAgICAgICAgICAgIDB4RkZDMDM5MjAgLyogU0RIIFJlc3BvbnNlMyAqLworI2RlZmluZSBTREhfREFUQV9USU1FUiAgICAgICAgICAgICAgICAgMHhGRkMwMzkyNCAvKiBTREggRGF0YSBUaW1lciAqLworI2RlZmluZSBTREhfREFUQV9MR1RIICAgICAgICAgICAgICAgICAgMHhGRkMwMzkyOCAvKiBTREggRGF0YSBMZW5ndGggKi8KKyNkZWZpbmUgU0RIX0RBVEFfQ1RMICAgICAgICAgICAgICAgICAgIDB4RkZDMDM5MkMgLyogU0RIIERhdGEgQ29udHJvbCAqLworI2RlZmluZSBTREhfREFUQV9DTlQgICAgICAgICAgICAgICAgICAgMHhGRkMwMzkzMCAvKiBTREggRGF0YSBDb3VudGVyICovCisjZGVmaW5lIFNESF9TVEFUVVMgICAgICAgICAgICAgICAgICAgICAweEZGQzAzOTM0IC8qIFNESCBTdGF0dXMgKi8KKyNkZWZpbmUgU0RIX1NUQVRVU19DTFIgICAgICAgICAgICAgICAgIDB4RkZDMDM5MzggLyogU0RIIFN0YXR1cyBDbGVhciAqLworI2RlZmluZSBTREhfTUFTSzAgICAgICAgICAgICAgICAgICAgICAgMHhGRkMwMzkzQyAvKiBTREggSW50ZXJydXB0MCBNYXNrICovCisjZGVmaW5lIFNESF9NQVNLMSAgICAgICAgICAgICAgICAgICAgICAweEZGQzAzOTQwIC8qIFNESCBJbnRlcnJ1cHQxIE1hc2sgKi8KKyNkZWZpbmUgU0RIX0ZJRk9fQ05UICAgICAgICAgICAgICAgICAgIDB4RkZDMDM5NDggLyogU0RIIEZJRk8gQ291bnRlciAqLworI2RlZmluZSBTREhfRklGTyAgICAgICAgICAgICAgICAgICAgICAgMHhGRkMwMzk4MCAvKiBTREggRGF0YSBGSUZPICovCisjZGVmaW5lIFNESF9FX1NUQVRVUyAgICAgICAgICAgICAgICAgICAweEZGQzAzOUMwIC8qIFNESCBFeGNlcHRpb24gU3RhdHVzICovCisjZGVmaW5lIFNESF9FX01BU0sgICAgICAgICAgICAgICAgICAgICAweEZGQzAzOUM0IC8qIFNESCBFeGNlcHRpb24gTWFzayAqLworI2RlZmluZSBTREhfQ0ZHICAgICAgICAgICAgICAgICAgICAgICAgMHhGRkMwMzlDOCAvKiBTREggQ29uZmlndXJhdGlvbiAqLworI2RlZmluZSBTREhfUkRfV0FJVF9FTiAgICAgICAgICAgICAgICAgMHhGRkMwMzlDQyAvKiBTREggUmVhZCBXYWl0IEVuYWJsZSAqLworI2RlZmluZSBTREhfUElEMCAgICAgICAgICAgICAgICAgICAgICAgMHhGRkMwMzlEMCAvKiBTREggUGVyaXBoZXJhbCBJZGVudGlmaWNhdGlvbjAgKi8KKyNkZWZpbmUgU0RIX1BJRDEgICAgICAgICAgICAgICAgICAgICAgIDB4RkZDMDM5RDQgLyogU0RIIFBlcmlwaGVyYWwgSWRlbnRpZmljYXRpb24xICovCisjZGVmaW5lIFNESF9QSUQyICAgICAgICAgICAgICAgICAgICAgICAweEZGQzAzOUQ4IC8qIFNESCBQZXJpcGhlcmFsIElkZW50aWZpY2F0aW9uMiAqLworI2RlZmluZSBTREhfUElEMyAgICAgICAgICAgICAgICAgICAgICAgMHhGRkMwMzlEQyAvKiBTREggUGVyaXBoZXJhbCBJZGVudGlmaWNhdGlvbjMgKi8KKyNkZWZpbmUgU0RIX1BJRDQgICAgICAgICAgICAgICAgICAgICAgIDB4RkZDMDM5RTAgLyogU0RIIFBlcmlwaGVyYWwgSWRlbnRpZmljYXRpb240ICovCisjZGVmaW5lIFNESF9QSUQ1ICAgICAgICAgICAgICAgICAgICAgICAweEZGQzAzOUU0IC8qIFNESCBQZXJpcGhlcmFsIElkZW50aWZpY2F0aW9uNSAqLworI2RlZmluZSBTREhfUElENiAgICAgICAgICAgICAgICAgICAgICAgMHhGRkMwMzlFOCAvKiBTREggUGVyaXBoZXJhbCBJZGVudGlmaWNhdGlvbjYgKi8KKyNkZWZpbmUgU0RIX1BJRDcgICAgICAgICAgICAgICAgICAgICAgIDB4RkZDMDM5RUMgLyogU0RIIFBlcmlwaGVyYWwgSWRlbnRpZmljYXRpb243ICovCisKKy8qIFJlbW92YWJsZSBTdG9yYWdlIEludGVyZmFjZSBSZWdpc3RlcnMgKi8KKworI2RlZmluZSBSU0lfUFdSX0NPTlRST0wgICAgICAgICAgICAgICAgMHhGRkMwMzgwMCAvKiBSU0kgUG93ZXIgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZSBSU0lfQ0xLX0NPTlRST0wgICAgICAgICAgICAgICAgMHhGRkMwMzgwNCAvKiBSU0kgQ2xvY2sgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZSBSU0lfQVJHVU1FTlQgICAgICAgICAgICAgICAgICAgMHhGRkMwMzgwOCAvKiBSU0kgQXJndW1lbnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUlNJX0NPTU1BTkQgICAgICAgICAgICAgICAgICAgIDB4RkZDMDM4MEMgLyogUlNJIENvbW1hbmQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUlNJX1JFU1BfQ01EICAgICAgICAgICAgICAgICAgIDB4RkZDMDM4MTAgLyogUlNJIFJlc3BvbnNlIENvbW1hbmQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUlNJX1JFU1BPTlNFMCAgICAgICAgICAgICAgICAgIDB4RkZDMDM4MTQgLyogUlNJIFJlc3BvbnNlIFJlZ2lzdGVyICovCisjZGVmaW5lIFJTSV9SRVNQT05TRTEgICAgICAgICAgICAgICAgICAweEZGQzAzODE4IC8qIFJTSSBSZXNwb25zZSBSZWdpc3RlciAqLworI2RlZmluZSBSU0lfUkVTUE9OU0UyICAgICAgICAgICAgICAgICAgMHhGRkMwMzgxQyAvKiBSU0kgUmVzcG9uc2UgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUlNJX1JFU1BPTlNFMyAgICAgICAgICAgICAgICAgIDB4RkZDMDM4MjAgLyogUlNJIFJlc3BvbnNlIFJlZ2lzdGVyICovCisjZGVmaW5lIFJTSV9EQVRBX1RJTUVSICAgICAgICAgICAgICAgICAweEZGQzAzODI0IC8qIFJTSSBEYXRhIFRpbWVyIFJlZ2lzdGVyICovCisjZGVmaW5lIFJTSV9EQVRBX0xHVEggICAgICAgICAgICAgICAgICAweEZGQzAzODI4IC8qIFJTSSBEYXRhIExlbmd0aCBSZWdpc3RlciAqLworI2RlZmluZSBSU0lfREFUQV9DT05UUk9MICAgICAgICAgICAgICAgMHhGRkMwMzgyQyAvKiBSU0kgRGF0YSBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lIFJTSV9EQVRBX0NOVCAgICAgICAgICAgICAgICAgICAweEZGQzAzODMwIC8qIFJTSSBEYXRhIENvdW50ZXIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUlNJX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgIDB4RkZDMDM4MzQgLyogUlNJIFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZSBSU0lfU1RBVFVTQ0wgICAgICAgICAgICAgICAgICAgMHhGRkMwMzgzOCAvKiBSU0kgU3RhdHVzIENsZWFyIFJlZ2lzdGVyICovCisjZGVmaW5lIFJTSV9NQVNLMCAgICAgICAgICAgICAgICAgICAgICAweEZGQzAzODNDIC8qIFJTSSBJbnRlcnJ1cHQgMCBNYXNrIFJlZ2lzdGVyICovCisjZGVmaW5lIFJTSV9NQVNLMSAgICAgICAgICAgICAgICAgICAgICAweEZGQzAzODQwIC8qIFJTSSBJbnRlcnJ1cHQgMSBNYXNrIFJlZ2lzdGVyICovCisjZGVmaW5lIFJTSV9GSUZPX0NOVCAgICAgICAgICAgICAgICAgICAweEZGQzAzODQ4IC8qIFJTSSBGSUZPIENvdW50ZXIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUlNJX0NFQVRBX0NPTlRST0wgICAgICAgICAgICAgIDB4RkZDMDM4NEMgLyogUlNJIENFQVRBIFJlZ2lzdGVyICovCisjZGVmaW5lIFJTSV9GSUZPICAgICAgICAgICAgICAgICAgICAgICAweEZGQzAzODgwIC8qIFJTSSBEYXRhIEZJRk8gUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUlNJX0VTVEFUICAgICAgICAgICAgICAgICAgICAgIDB4RkZDMDM4QzAgLyogUlNJIEV4Y2VwdGlvbiBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUlNJX0VNQVNLICAgICAgICAgICAgICAgICAgICAgIDB4RkZDMDM4QzQgLyogUlNJIEV4Y2VwdGlvbiBNYXNrIFJlZ2lzdGVyICovCisjZGVmaW5lIFJTSV9DT05GSUcgICAgICAgICAgICAgICAgICAgICAweEZGQzAzOEM4IC8qIFJTSSBDb25maWd1cmF0aW9uIFJlZ2lzdGVyICovCisjZGVmaW5lIFJTSV9SRF9XQUlUX0VOICAgICAgICAgICAgICAgICAweEZGQzAzOENDIC8qIFJTSSBSZWFkIFdhaXQgRW5hYmxlIFJlZ2lzdGVyICovCisjZGVmaW5lIFJTSV9QSUQwICAgICAgICAgICAgICAgICAgICAgICAweEZGQzAzRkUwIC8qIFJTSSBQZXJpcGhlcmFsIElEIFJlZ2lzdGVyIDAgKi8KKyNkZWZpbmUgUlNJX1BJRDEgICAgICAgICAgICAgICAgICAgICAgIDB4RkZDMDNGRTQgLyogUlNJIFBlcmlwaGVyYWwgSUQgUmVnaXN0ZXIgMSAqLworI2RlZmluZSBSU0lfUElEMiAgICAgICAgICAgICAgICAgICAgICAgMHhGRkMwM0ZFOCAvKiBSU0kgUGVyaXBoZXJhbCBJRCBSZWdpc3RlciAyICovCisjZGVmaW5lIFJTSV9QSUQzICAgICAgICAgICAgICAgICAgICAgICAweEZGQzAzRkVDIC8qIFJTSSBQZXJpcGhlcmFsIElEIFJlZ2lzdGVyIDMgKi8KKyNkZWZpbmUgUlNJX1BJRDQgICAgICAgICAgICAgICAgICAgICAgIDB4RkZDMDNGRjAgLyogUlNJIFBlcmlwaGVyYWwgSUQgUmVnaXN0ZXIgNCAqLworI2RlZmluZSBSU0lfUElENSAgICAgICAgICAgICAgICAgICAgICAgMHhGRkMwM0ZGNCAvKiBSU0kgUGVyaXBoZXJhbCBJRCBSZWdpc3RlciA1ICovCisjZGVmaW5lIFJTSV9QSUQ2ICAgICAgICAgICAgICAgICAgICAgICAweEZGQzAzRkY4IC8qIFJTSSBQZXJpcGhlcmFsIElEIFJlZ2lzdGVyIDYgKi8KKyNkZWZpbmUgUlNJX1BJRDcgICAgICAgICAgICAgICAgICAgICAgIDB4RkZDMDNGRkMgLyogUlNJIFBlcmlwaGVyYWwgSUQgUmVnaXN0ZXIgNyAqLworCisvKiBQVFAgVFNZTkMgUmVnaXN0ZXJzICovCisKKyNkZWZpbmUgRU1BQ19QVFBfQ1RMICAgICAgICAgICAgICAgICAgIDB4RkZDMDMwQTAgLyogUFRQIEJsb2NrIENvbnRyb2wgKi8KKyNkZWZpbmUgRU1BQ19QVFBfSUUgICAgICAgICAgICAgICAgICAgIDB4RkZDMDMwQTQgLyogUFRQIEJsb2NrIEludGVycnVwdCBFbmFibGUgKi8KKyNkZWZpbmUgRU1BQ19QVFBfSVNUQVQgICAgICAgICAgICAgICAgIDB4RkZDMDMwQTggLyogUFRQIEJsb2NrIEludGVycnVwdCBTdGF0dXMgKi8KKyNkZWZpbmUgRU1BQ19QVFBfRk9GRiAgICAgICAgICAgICAgICAgIDB4RkZDMDMwQUMgLyogUFRQIEZpbHRlciBvZmZzZXQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgRU1BQ19QVFBfRlYxICAgICAgICAgICAgICAgICAgIDB4RkZDMDMwQjAgLyogUFRQIEZpbHRlciBWYWx1ZSBSZWdpc3RlciAxICovCisjZGVmaW5lIEVNQUNfUFRQX0ZWMiAgICAgICAgICAgICAgICAgICAweEZGQzAzMEI0IC8qIFBUUCBGaWx0ZXIgVmFsdWUgUmVnaXN0ZXIgMiAqLworI2RlZmluZSBFTUFDX1BUUF9GVjMgICAgICAgICAgICAgICAgICAgMHhGRkMwMzBCOCAvKiBQVFAgRmlsdGVyIFZhbHVlIFJlZ2lzdGVyIDMgKi8KKyNkZWZpbmUgRU1BQ19QVFBfQURERU5EICAgICAgICAgICAgICAgIDB4RkZDMDMwQkMgLyogUFRQIEFkZGVuZCBmb3IgRnJlcXVlbmN5IENvbXBlbnNhdGlvbiAqLworI2RlZmluZSBFTUFDX1BUUF9BQ0NSICAgICAgICAgICAgICAgICAgMHhGRkMwMzBDMCAvKiBQVFAgQWNjdW11bGF0b3IgZm9yIEZyZXF1ZW5jeSBDb21wZW5zYXRpb24gKi8KKyNkZWZpbmUgRU1BQ19QVFBfT0ZGU0VUICAgICAgICAgICAgICAgIDB4RkZDMDMwQzQgLyogUFRQIFRpbWUgT2Zmc2V0IFJlZ2lzdGVyICovCisjZGVmaW5lIEVNQUNfUFRQX1RJTUVMTyAgICAgICAgICAgICAgICAweEZGQzAzMEM4IC8qIFBUUCBQcmVjaXNpb24gQ2xvY2sgVGltZSBMb3cgKi8KKyNkZWZpbmUgRU1BQ19QVFBfVElNRUhJICAgICAgICAgICAgICAgIDB4RkZDMDMwQ0MgLyogUFRQIFByZWNpc2lvbiBDbG9jayBUaW1lIEhpZ2ggKi8KKyNkZWZpbmUgRU1BQ19QVFBfUlhTTkFQTE8gICAgICAgICAgICAgIDB4RkZDMDMwRDAgLyogUFRQIFJlY2VpdmUgU25hcHNob3QgUmVnaXN0ZXIgTG93ICovCisjZGVmaW5lIEVNQUNfUFRQX1JYU05BUEhJICAgICAgICAgICAgICAweEZGQzAzMEQ0IC8qIFBUUCBSZWNlaXZlIFNuYXBzaG90IFJlZ2lzdGVyIEhpZ2ggKi8KKyNkZWZpbmUgRU1BQ19QVFBfVFhTTkFQTE8gICAgICAgICAgICAgIDB4RkZDMDMwRDggLyogUFRQIFRyYW5zbWl0IFNuYXBzaG90IFJlZ2lzdGVyIExvdyAqLworI2RlZmluZSBFTUFDX1BUUF9UWFNOQVBISSAgICAgICAgICAgICAgMHhGRkMwMzBEQyAvKiBQVFAgVHJhbnNtaXQgU25hcHNob3QgUmVnaXN0ZXIgSGlnaCAqLworI2RlZmluZSBFTUFDX1BUUF9BTEFSTUxPICAgICAgICAgICAgICAgMHhGRkMwMzBFMCAvKiBQVFAgQWxhcm0gdGltZSBMb3cgKi8KKyNkZWZpbmUgRU1BQ19QVFBfQUxBUk1ISSAgICAgICAgICAgICAgIDB4RkZDMDMwRTQgLyogUFRQIEFsYXJtIHRpbWUgSGlnaCAqLworI2RlZmluZSBFTUFDX1BUUF9JRF9PRkYgICAgICAgICAgICAgICAgMHhGRkMwMzBFOCAvKiBQVFAgQ2FwdHVyZSBJRCBvZmZzZXQgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgRU1BQ19QVFBfSURfU05BUCAgICAgICAgICAgICAgIDB4RkZDMDMwRUMgLyogUFRQIENhcHR1cmUgSUQgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgRU1BQ19QVFBfUFBTX1NUQVJUTE8gICAgICAgICAgIDB4RkZDMDMwRjAgLyogUFBTIFN0YXJ0IFRpbWUgTG93ICovCisjZGVmaW5lIEVNQUNfUFRQX1BQU19TVEFSVEhJICAgICAgICAgICAweEZGQzAzMEY0IC8qIFBQUyBTdGFydCBUaW1lIEhpZ2ggKi8KKyNkZWZpbmUgRU1BQ19QVFBfUFBTX1BFUklPRCAgICAgICAgICAgIDB4RkZDMDMwRjggLyogUFBTIENvdW50IFJlZ2lzdGVyICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qICAgICBTSU5HTEUgQklUIE1BQ1JPIFBBSVJTIChiaXQgbWFzayBhbmQgbmVnYXRlZCBvbmUpICAgICAgKi8KKy8qICAgICBhbmQgTVVMVEkgQklUIFJFQUQgTUFDUk9TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworLyogQml0IG1hc2tzIGZvciBTREhfQ09NTUFORCAqLworCisjZGVmaW5lICAgICAgICAgICAgICAgICAgIENNRF9JRFggIDB4M2YgICAgICAgLyogQ29tbWFuZCBJbmRleCAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICBDTURfUlNQICAweDQwICAgICAgIC8qIFJlc3BvbnNlICovCisjZGVmaW5lICAgICAgICAgICAgICAgICBDTURfTF9SU1AgIDB4ODAgICAgICAgLyogTG9uZyBSZXNwb25zZSAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgQ01EX0lOVF9FICAweDEwMCAgICAgIC8qIENvbW1hbmQgSW50ZXJydXB0ICovCisjZGVmaW5lICAgICAgICAgICAgICAgIENNRF9QRU5EX0UgIDB4MjAwICAgICAgLyogQ29tbWFuZCBQZW5kaW5nICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgQ01EX0UgIDB4NDAwICAgICAgLyogQ29tbWFuZCBFbmFibGUgKi8KKworLyogQml0IG1hc2tzIGZvciBTREhfUFdSX0NUTCAqLworCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICBQV1JfT04gIDB4MyAgICAgICAgLyogUG93ZXIgT24gKi8KKyNpZiAwCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICBUQkQgIDB4M2MgICAgICAgLyogVEJEICovCisjZW5kaWYKKyNkZWZpbmUgICAgICAgICAgICAgICAgIFNEX0NNRF9PRCAgMHg0MCAgICAgICAvKiBPcGVuIERyYWluIE91dHB1dCAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICBST0RfQ1RMICAweDgwICAgICAgIC8qIFJvZCBDb250cm9sICovCisKKy8qIEJpdCBtYXNrcyBmb3IgU0RIX0NMS19DVEwgKi8KKworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgQ0xLRElWICAweGZmICAgICAgIC8qIE1DX0NMSyBEaXZpc29yICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgQ0xLX0UgIDB4MTAwICAgICAgLyogTUNfQ0xLIEJ1cyBDbG9jayBFbmFibGUgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICBQV1JfU1ZfRSAgMHgyMDAgICAgICAvKiBQb3dlciBTYXZlIEVuYWJsZSAqLworI2RlZmluZSAgICAgICAgICAgICBDTEtESVZfQllQQVNTICAweDQwMCAgICAgIC8qIEJ5cGFzcyBEaXZpc29yICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgV0lERV9CVVMgIDB4ODAwICAgICAgLyogV2lkZSBCdXMgTW9kZSBFbmFibGUgKi8KKworLyogQml0IG1hc2tzIGZvciBTREhfUkVTUF9DTUQgKi8KKworI2RlZmluZSAgICAgICAgICAgICAgICAgIFJFU1BfQ01EICAweDNmICAgICAgIC8qIFJlc3BvbnNlIENvbW1hbmQgKi8KKworLyogQml0IG1hc2tzIGZvciBTREhfREFUQV9DVEwgKi8KKworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgIERUWF9FICAweDEgICAgICAgIC8qIERhdGEgVHJhbnNmZXIgRW5hYmxlICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgIERUWF9ESVIgIDB4MiAgICAgICAgLyogRGF0YSBUcmFuc2ZlciBEaXJlY3Rpb24gKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICBEVFhfTU9ERSAgMHg0ICAgICAgICAvKiBEYXRhIFRyYW5zZmVyIE1vZGUgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgIERUWF9ETUFfRSAgMHg4ICAgICAgICAvKiBEYXRhIFRyYW5zZmVyIERNQSBFbmFibGUgKi8KKyNkZWZpbmUgICAgICAgICAgICAgIERUWF9CTEtfTEdUSCAgMHhmMCAgICAgICAvKiBEYXRhIFRyYW5zZmVyIEJsb2NrIExlbmd0aCAqLworCisvKiBCaXQgbWFza3MgZm9yIFNESF9TVEFUVVMgKi8KKworI2RlZmluZSAgICAgICAgICAgICAgQ01EX0NSQ19GQUlMICAweDEgICAgICAgIC8qIENNRCBDUkMgRmFpbCAqLworI2RlZmluZSAgICAgICAgICAgICAgREFUX0NSQ19GQUlMICAweDIgICAgICAgIC8qIERhdGEgQ1JDIEZhaWwgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICBDTURfVElNRV9PVVQgIDB4NCAgICAgICAgLyogQ01EIFRpbWUgT3V0ICovCisjZGVmaW5lICAgICAgICAgICAgICAgREFUX1RJTUVfT1VUICAweDggICAgICAgIC8qIERhdGEgVGltZSBPdXQgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICBUWF9VTkRFUlJVTiAgMHgxMCAgICAgICAvKiBUcmFuc21pdCBVbmRlcnJ1biAqLworI2RlZmluZSAgICAgICAgICAgICAgICBSWF9PVkVSUlVOICAweDIwICAgICAgIC8qIFJlY2VpdmUgT3ZlcnJ1biAqLworI2RlZmluZSAgICAgICAgICAgICAgQ01EX1JFU1BfRU5EICAweDQwICAgICAgIC8qIENNRCBSZXNwb25zZSBFbmQgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICBDTURfU0VOVCAgMHg4MCAgICAgICAvKiBDTUQgU2VudCAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICBEQVRfRU5EICAweDEwMCAgICAgIC8qIERhdGEgRW5kICovCisjZGVmaW5lICAgICAgICAgICAgIFNUQVJUX0JJVF9FUlIgIDB4MjAwICAgICAgLyogU3RhcnQgQml0IEVycm9yICovCisjZGVmaW5lICAgICAgICAgICAgICAgREFUX0JMS19FTkQgIDB4NDAwICAgICAgLyogRGF0YSBCbG9jayBFbmQgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgQ01EX0FDVCAgMHg4MDAgICAgICAvKiBDTUQgQWN0aXZlICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICBUWF9BQ1QgIDB4MTAwMCAgICAgLyogVHJhbnNtaXQgQWN0aXZlICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICBSWF9BQ1QgIDB4MjAwMCAgICAgLyogUmVjZWl2ZSBBY3RpdmUgKi8KKyNkZWZpbmUgICAgICAgICAgICAgIFRYX0ZJRk9fU1RBVCAgMHg0MDAwICAgICAvKiBUcmFuc21pdCBGSUZPIFN0YXR1cyAqLworI2RlZmluZSAgICAgICAgICAgICAgUlhfRklGT19TVEFUICAweDgwMDAgICAgIC8qIFJlY2VpdmUgRklGTyBTdGF0dXMgKi8KKyNkZWZpbmUgICAgICAgICAgICAgIFRYX0ZJRk9fRlVMTCAgMHgxMDAwMCAgICAvKiBUcmFuc21pdCBGSUZPIEZ1bGwgKi8KKyNkZWZpbmUgICAgICAgICAgICAgIFJYX0ZJRk9fRlVMTCAgMHgyMDAwMCAgICAvKiBSZWNlaXZlIEZJRk8gRnVsbCAqLworI2RlZmluZSAgICAgICAgICAgICAgVFhfRklGT19aRVJPICAweDQwMDAwICAgIC8qIFRyYW5zbWl0IEZJRk8gRW1wdHkgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICBSWF9EQVRfWkVSTyAgMHg4MDAwMCAgICAvKiBSZWNlaXZlIEZJRk8gRW1wdHkgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgVFhfREFUX1JEWSAgMHgxMDAwMDAgICAvKiBUcmFuc21pdCBEYXRhIEF2YWlsYWJsZSAqLworI2RlZmluZSAgICAgICAgICAgICAgIFJYX0ZJRk9fUkRZICAweDIwMDAwMCAgIC8qIFJlY2VpdmUgRGF0YSBBdmFpbGFibGUgKi8KKworLyogQml0IG1hc2tzIGZvciBTREhfU1RBVFVTX0NMUiAqLworCisjZGVmaW5lICAgICAgICAgQ01EX0NSQ19GQUlMX1NUQVQgIDB4MSAgICAgICAgLyogQ01EIENSQyBGYWlsIFN0YXR1cyAqLworI2RlZmluZSAgICAgICAgIERBVF9DUkNfRkFJTF9TVEFUICAweDIgICAgICAgIC8qIERhdGEgQ1JDIEZhaWwgU3RhdHVzICovCisjZGVmaW5lICAgICAgICAgIENNRF9USU1FT1VUX1NUQVQgIDB4NCAgICAgICAgLyogQ01EIFRpbWUgT3V0IFN0YXR1cyAqLworI2RlZmluZSAgICAgICAgICBEQVRfVElNRU9VVF9TVEFUICAweDggICAgICAgIC8qIERhdGEgVGltZSBPdXQgc3RhdHVzICovCisjZGVmaW5lICAgICAgICAgIFRYX1VOREVSUlVOX1NUQVQgIDB4MTAgICAgICAgLyogVHJhbnNtaXQgVW5kZXJydW4gU3RhdHVzICovCisjZGVmaW5lICAgICAgICAgICBSWF9PVkVSUlVOX1NUQVQgIDB4MjAgICAgICAgLyogUmVjZWl2ZSBPdmVycnVuIFN0YXR1cyAqLworI2RlZmluZSAgICAgICAgIENNRF9SRVNQX0VORF9TVEFUICAweDQwICAgICAgIC8qIENNRCBSZXNwb25zZSBFbmQgU3RhdHVzICovCisjZGVmaW5lICAgICAgICAgICAgIENNRF9TRU5UX1NUQVQgIDB4ODAgICAgICAgLyogQ01EIFNlbnQgU3RhdHVzICovCisjZGVmaW5lICAgICAgICAgICAgICBEQVRfRU5EX1NUQVQgIDB4MTAwICAgICAgLyogRGF0YSBFbmQgU3RhdHVzICovCisjZGVmaW5lICAgICAgICBTVEFSVF9CSVRfRVJSX1NUQVQgIDB4MjAwICAgICAgLyogU3RhcnQgQml0IEVycm9yIFN0YXR1cyAqLworI2RlZmluZSAgICAgICAgICBEQVRfQkxLX0VORF9TVEFUICAweDQwMCAgICAgIC8qIERhdGEgQmxvY2sgRW5kIFN0YXR1cyAqLworCisvKiBCaXQgbWFza3MgZm9yIFNESF9NQVNLMCAqLworCisjZGVmaW5lICAgICAgICAgQ01EX0NSQ19GQUlMX01BU0sgIDB4MSAgICAgICAgLyogQ01EIENSQyBGYWlsIE1hc2sgKi8KKyNkZWZpbmUgICAgICAgICBEQVRfQ1JDX0ZBSUxfTUFTSyAgMHgyICAgICAgICAvKiBEYXRhIENSQyBGYWlsIE1hc2sgKi8KKyNkZWZpbmUgICAgICAgICAgQ01EX1RJTUVPVVRfTUFTSyAgMHg0ICAgICAgICAvKiBDTUQgVGltZSBPdXQgTWFzayAqLworI2RlZmluZSAgICAgICAgICBEQVRfVElNRU9VVF9NQVNLICAweDggICAgICAgIC8qIERhdGEgVGltZSBPdXQgTWFzayAqLworI2RlZmluZSAgICAgICAgICBUWF9VTkRFUlJVTl9NQVNLICAweDEwICAgICAgIC8qIFRyYW5zbWl0IFVuZGVycnVuIE1hc2sgKi8KKyNkZWZpbmUgICAgICAgICAgIFJYX09WRVJSVU5fTUFTSyAgMHgyMCAgICAgICAvKiBSZWNlaXZlIE92ZXJydW4gTWFzayAqLworI2RlZmluZSAgICAgICAgIENNRF9SRVNQX0VORF9NQVNLICAweDQwICAgICAgIC8qIENNRCBSZXNwb25zZSBFbmQgTWFzayAqLworI2RlZmluZSAgICAgICAgICAgICBDTURfU0VOVF9NQVNLICAweDgwICAgICAgIC8qIENNRCBTZW50IE1hc2sgKi8KKyNkZWZpbmUgICAgICAgICAgICAgIERBVF9FTkRfTUFTSyAgMHgxMDAgICAgICAvKiBEYXRhIEVuZCBNYXNrICovCisjZGVmaW5lICAgICAgICBTVEFSVF9CSVRfRVJSX01BU0sgIDB4MjAwICAgICAgLyogU3RhcnQgQml0IEVycm9yIE1hc2sgKi8KKyNkZWZpbmUgICAgICAgICAgREFUX0JMS19FTkRfTUFTSyAgMHg0MDAgICAgICAvKiBEYXRhIEJsb2NrIEVuZCBNYXNrICovCisjZGVmaW5lICAgICAgICAgICAgICBDTURfQUNUX01BU0sgIDB4ODAwICAgICAgLyogQ01EIEFjdGl2ZSBNYXNrICovCisjZGVmaW5lICAgICAgICAgICAgICAgVFhfQUNUX01BU0sgIDB4MTAwMCAgICAgLyogVHJhbnNtaXQgQWN0aXZlIE1hc2sgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICBSWF9BQ1RfTUFTSyAgMHgyMDAwICAgICAvKiBSZWNlaXZlIEFjdGl2ZSBNYXNrICovCisjZGVmaW5lICAgICAgICAgVFhfRklGT19TVEFUX01BU0sgIDB4NDAwMCAgICAgLyogVHJhbnNtaXQgRklGTyBTdGF0dXMgTWFzayAqLworI2RlZmluZSAgICAgICAgIFJYX0ZJRk9fU1RBVF9NQVNLICAweDgwMDAgICAgIC8qIFJlY2VpdmUgRklGTyBTdGF0dXMgTWFzayAqLworI2RlZmluZSAgICAgICAgIFRYX0ZJRk9fRlVMTF9NQVNLICAweDEwMDAwICAgIC8qIFRyYW5zbWl0IEZJRk8gRnVsbCBNYXNrICovCisjZGVmaW5lICAgICAgICAgUlhfRklGT19GVUxMX01BU0sgIDB4MjAwMDAgICAgLyogUmVjZWl2ZSBGSUZPIEZ1bGwgTWFzayAqLworI2RlZmluZSAgICAgICAgIFRYX0ZJRk9fWkVST19NQVNLICAweDQwMDAwICAgIC8qIFRyYW5zbWl0IEZJRk8gRW1wdHkgTWFzayAqLworI2RlZmluZSAgICAgICAgICBSWF9EQVRfWkVST19NQVNLICAweDgwMDAwICAgIC8qIFJlY2VpdmUgRklGTyBFbXB0eSBNYXNrICovCisjZGVmaW5lICAgICAgICAgICBUWF9EQVRfUkRZX01BU0sgIDB4MTAwMDAwICAgLyogVHJhbnNtaXQgRGF0YSBBdmFpbGFibGUgTWFzayAqLworI2RlZmluZSAgICAgICAgICBSWF9GSUZPX1JEWV9NQVNLICAweDIwMDAwMCAgIC8qIFJlY2VpdmUgRGF0YSBBdmFpbGFibGUgTWFzayAqLworCisvKiBCaXQgbWFza3MgZm9yIFNESF9GSUZPX0NOVCAqLworCisjZGVmaW5lICAgICAgICAgICAgICAgIEZJRk9fQ09VTlQgIDB4N2ZmZiAgICAgLyogRklGTyBDb3VudCAqLworCisvKiBCaXQgbWFza3MgZm9yIFNESF9FX1NUQVRVUyAqLworCisjZGVmaW5lICAgICAgICAgICAgICBTRElPX0lOVF9ERVQgIDB4MiAgICAgICAgLyogU0RJTyBJbnQgRGV0ZWN0ZWQgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICBTRF9DQVJEX0RFVCAgMHgxMCAgICAgICAvKiBTRCBDYXJkIERldGVjdCAqLworCisvKiBCaXQgbWFza3MgZm9yIFNESF9FX01BU0sgKi8KKworI2RlZmluZSAgICAgICAgICAgICAgICAgIFNESU9fTVNLICAweDIgICAgICAgIC8qIE1hc2sgU0RJTyBJbnQgRGV0ZWN0ZWQgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgU0NEX01TSyAgMHg0MCAgICAgICAvKiBNYXNrIENhcmQgRGV0ZWN0ICovCisKKy8qIEJpdCBtYXNrcyBmb3IgU0RIX0NGRyAqLworCisjZGVmaW5lICAgICAgICAgICAgICAgICAgIENMS1NfRU4gIDB4MSAgICAgICAgLyogQ2xvY2tzIEVuYWJsZSAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICBTRDRFICAweDQgICAgICAgIC8qIFNESU8gNC1CaXQgRW5hYmxlICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICBNV0UgIDB4OCAgICAgICAgLyogTW92aW5nIFdpbmRvdyBFbmFibGUgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgIFNEX1JTVCAgMHgxMCAgICAgICAvKiBTRE1NQyBSZXNldCAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgUFVQX1NEREFUICAweDIwICAgICAgIC8qIFB1bGwtdXAgU0RfREFUICovCisjZGVmaW5lICAgICAgICAgICAgICAgIFBVUF9TRERBVDMgIDB4NDAgICAgICAgLyogUHVsbC11cCBTRF9EQVQzICovCisjZGVmaW5lICAgICAgICAgICAgICAgICBQRF9TRERBVDMgIDB4ODAgICAgICAgLyogUHVsbC1kb3duIFNEX0RBVDMgKi8KKworLyogQml0IG1hc2tzIGZvciBTREhfUkRfV0FJVF9FTiAqLworCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICBSV1IgIDB4MSAgICAgICAgLyogUmVhZCBXYWl0IFJlcXVlc3QgKi8KKworI2VuZGlmIC8qIF9ERUZfQkY1MThfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2luY2x1ZGUvbWFjaC9kZWZCRjUxeF9iYXNlLmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvaW5jbHVkZS9tYWNoL2RlZkJGNTF4X2Jhc2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYmVjOGQxCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2luY2x1ZGUvbWFjaC9kZWZCRjUxeF9iYXNlLmgKQEAgLTAsMCArMSwxOTQwIEBACisvKgorICogRmlsZTogICAgICAgICBpbmNsdWRlL2FzbS1ibGFja2Zpbi9tYWNoLWJmNTE4L2RlZkJGNTF4X2Jhc2UuaAorICogQmFzZWQgb246CisgKiBBdXRob3I6CisgKgorICogQ3JlYXRlZDoKKyAqIERlc2NyaXB0aW9uOgorICoKKyAqIFJldjoKKyAqCisgKiBNb2RpZmllZDoKKyAqCisgKiBCdWdzOiAgICAgICAgIEVudGVyIGJ1Z3MgYXQgaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnLworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLgorICogSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqLworCisjaWZuZGVmIF9ERUZfQkY1MVhfSAorI2RlZmluZSBfREVGX0JGNTFYX0gKKworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworLyogICBTWVNURU0gJiBNTVIgQUREUkVTUyBERUZJTklUSU9OUyBDT01NT04gVE8gQUxMIEFEU1AtQkY1MXggICAgKi8KKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKy8qIENsb2NrIGFuZCBTeXN0ZW0gQ29udHJvbAkoMHhGRkMwMDAwMCAtIDB4RkZDMDAwRkYpCQkJCQkJCQkqLworI2RlZmluZSBQTExfQ1RMCQkJCTB4RkZDMDAwMDAJLyogUExMIENvbnRyb2wgUmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBQTExfRElWCQkJCTB4RkZDMDAwMDQJLyogUExMIERpdmlkZSBSZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIFZSX0NUTAkJCQkweEZGQzAwMDA4CS8qIFZvbHRhZ2UgUmVndWxhdG9yIENvbnRyb2wgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgUExMX1NUQVQJCQkweEZGQzAwMDBDCS8qIFBMTCBTdGF0dXMgUmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBQTExfTE9DS0NOVAkJCTB4RkZDMDAwMTAJLyogUExMIExvY2sgQ291bnQgUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIENISVBJRAkJCQkweEZGQzAwMDE0CS8qIERldmljZSBJRCBSZWdpc3RlciAqLworCisvKiBTeXN0ZW0gSW50ZXJydXB0IENvbnRyb2xsZXIgKDB4RkZDMDAxMDAgLSAweEZGQzAwMUZGKQkJCQkJCQkJKi8KKyNkZWZpbmUgU1dSU1QJCQkJMHhGRkMwMDEwMAkvKiBTb2Z0d2FyZSBSZXNldCBSZWdpc3RlcgkJCQkJKi8KKyNkZWZpbmUgU1lTQ1IJCQkJMHhGRkMwMDEwNAkvKiBTeXN0ZW0gQ29uZmlndXJhdGlvbiBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBTSUNfUlZFQ1QJCQkweEZGQzAwMTA4CS8qIEludGVycnVwdCBSZXNldCBWZWN0b3IgQWRkcmVzcyBSZWdpc3RlcgkJCSovCisKKyNkZWZpbmUgU0lDX0lNQVNLMAkJCTB4RkZDMDAxMEMJLyogSW50ZXJydXB0IE1hc2sgUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIFNJQ19JQVIwCQkJMHhGRkMwMDExMAkvKiBJbnRlcnJ1cHQgQXNzaWdubWVudCBSZWdpc3RlciAwCQkJCSovCisjZGVmaW5lIFNJQ19JQVIxCQkJMHhGRkMwMDExNAkvKiBJbnRlcnJ1cHQgQXNzaWdubWVudCBSZWdpc3RlciAxCQkJCSovCisjZGVmaW5lIFNJQ19JQVIyCQkJMHhGRkMwMDExOAkvKiBJbnRlcnJ1cHQgQXNzaWdubWVudCBSZWdpc3RlciAyCQkJCSovCisjZGVmaW5lIFNJQ19JQVIzCQkJMHhGRkMwMDExQwkvKiBJbnRlcnJ1cHQgQXNzaWdubWVudCBSZWdpc3RlciAzCQkJCSovCisjZGVmaW5lIFNJQ19JU1IwCQkJMHhGRkMwMDEyMAkvKiBJbnRlcnJ1cHQgU3RhdHVzIFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBTSUNfSVdSMAkJCTB4RkZDMDAxMjQJLyogSW50ZXJydXB0IFdha2V1cCBSZWdpc3RlcgkJCQkJKi8KKworLyogU0lDIEFkZGl0aW9ucyB0byBBRFNQLUJGNTF4ICgweEZGQzAwMTRDIC0gMHhGRkMwMDE2MikgKi8KKyNkZWZpbmUgU0lDX0lNQVNLMSAgICAgICAgICAgICAgICAgICAgICAweEZGQzAwMTRDICAgICAvKiBJbnRlcnJ1cHQgTWFzayByZWdpc3RlciBvZiBTSUMyICovCisjZGVmaW5lIFNJQ19JQVI0ICAgICAgICAgICAgICAgICAgICAgICAgMHhGRkMwMDE1MCAgICAgLyogSW50ZXJydXB0IEFzc2lnbm1lbnQgcmVnaXN0ZXI0ICovCisjZGVmaW5lIFNJQ19JQVI1ICAgICAgICAgICAgICAgICAgICAgICAgMHhGRkMwMDE1NCAgICAgLyogSW50ZXJydXB0IEFzc2lnbm1lbnQgcmVnaXN0ZXI1ICovCisjZGVmaW5lIFNJQ19JQVI2ICAgICAgICAgICAgICAgICAgICAgICAgMHhGRkMwMDE1OCAgICAgLyogSW50ZXJydXB0IEFzc2lnbm1lbnQgcmVnaXN0ZXI2ICovCisjZGVmaW5lIFNJQ19JQVI3ICAgICAgICAgICAgICAgICAgICAgICAgMHhGRkMwMDE1QyAgICAgLyogSW50ZXJydXB0IEFzc2lnbm1lbnQgcmVnaXN0ZXI3ICovCisjZGVmaW5lIFNJQ19JU1IxICAgICAgICAgICAgICAgICAgICAgICAgMHhGRkMwMDE2MCAgICAgLyogSW50ZXJydXB0IFN0YXR1ciByZWdpc3RlciAqLworI2RlZmluZSBTSUNfSVdSMSAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZDMDAxNjQgICAgIC8qIEludGVycnVwdCBXYWtldXAgcmVnaXN0ZXIgKi8KKworCisvKiBXYXRjaGRvZyBUaW1lcgkJCSgweEZGQzAwMjAwIC0gMHhGRkMwMDJGRikJCQkJCQkJCSovCisjZGVmaW5lIFdET0dfQ1RMCQkJMHhGRkMwMDIwMAkvKiBXYXRjaGRvZyBDb250cm9sIFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIFdET0dfQ05UCQkJMHhGRkMwMDIwNAkvKiBXYXRjaGRvZyBDb3VudCBSZWdpc3RlcgkJCQkJKi8KKyNkZWZpbmUgV0RPR19TVEFUCQkJMHhGRkMwMDIwOAkvKiBXYXRjaGRvZyBTdGF0dXMgUmVnaXN0ZXIJCQkJCSovCisKKworLyogUmVhbCBUaW1lIENsb2NrCQkoMHhGRkMwMDMwMCAtIDB4RkZDMDAzRkYpCQkJCQkJCQkJKi8KKyNkZWZpbmUgUlRDX1NUQVQJCQkweEZGQzAwMzAwCS8qIFJUQyBTdGF0dXMgUmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBSVENfSUNUTAkJCTB4RkZDMDAzMDQJLyogUlRDIEludGVycnVwdCBDb250cm9sIFJlZ2lzdGVyCQkJKi8KKyNkZWZpbmUgUlRDX0lTVEFUCQkJMHhGRkMwMDMwOAkvKiBSVEMgSW50ZXJydXB0IFN0YXR1cyBSZWdpc3RlcgkJCSovCisjZGVmaW5lIFJUQ19TV0NOVAkJCTB4RkZDMDAzMEMJLyogUlRDIFN0b3B3YXRjaCBDb3VudCBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBSVENfQUxBUk0JCQkweEZGQzAwMzEwCS8qIFJUQyBBbGFybSBUaW1lIFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBSVENfRkFTVAkJCTB4RkZDMDAzMTQJLyogUlRDIFByZXNjYWxlciBFbmFibGUgUmVnaXN0ZXIJCQkqLworI2RlZmluZSBSVENfUFJFTgkJCTB4RkZDMDAzMTQJLyogUlRDIFByZXNjYWxlciBFbmFibGUgQWx0ZXJuYXRlIE1hY3JvCQkqLworCisKKy8qIFVBUlQwIENvbnRyb2xsZXIJCSgweEZGQzAwNDAwIC0gMHhGRkMwMDRGRikJCQkJCQkJCQkqLworI2RlZmluZSBVQVJUMF9USFIJCQkweEZGQzAwNDAwCS8qIFRyYW5zbWl0IEhvbGRpbmcgcmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgVUFSVDBfUkJSCQkJMHhGRkMwMDQwMAkvKiBSZWNlaXZlIEJ1ZmZlciByZWdpc3RlcgkJCQkJKi8KKyNkZWZpbmUgVUFSVDBfRExMCQkJMHhGRkMwMDQwMAkvKiBEaXZpc29yIExhdGNoIChMb3ctQnl0ZSkJCQkJCSovCisjZGVmaW5lIFVBUlQwX0lFUgkJCTB4RkZDMDA0MDQJLyogSW50ZXJydXB0IEVuYWJsZSBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBVQVJUMF9ETEgJCQkweEZGQzAwNDA0CS8qIERpdmlzb3IgTGF0Y2ggKEhpZ2gtQnl0ZSkJCQkJKi8KKyNkZWZpbmUgVUFSVDBfSUlSCQkJMHhGRkMwMDQwOAkvKiBJbnRlcnJ1cHQgSWRlbnRpZmljYXRpb24gUmVnaXN0ZXIJCSovCisjZGVmaW5lIFVBUlQwX0xDUgkJCTB4RkZDMDA0MEMJLyogTGluZSBDb250cm9sIFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBVQVJUMF9NQ1IJCQkweEZGQzAwNDEwCS8qIE1vZGVtIENvbnRyb2wgUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIFVBUlQwX0xTUgkJCTB4RkZDMDA0MTQJLyogTGluZSBTdGF0dXMgUmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBVQVJUMF9NU1IJCQkweEZGQzAwNDE4CS8qIE1vZGVtIFN0YXR1cyBSZWdpc3RlcgkJCQkJKi8KKyNkZWZpbmUgVUFSVDBfU0NSCQkJMHhGRkMwMDQxQwkvKiBTQ1IgU2NyYXRjaCBSZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIFVBUlQwX0dDVEwJCQkweEZGQzAwNDI0CS8qIEdsb2JhbCBDb250cm9sIFJlZ2lzdGVyCQkJCQkqLworCisvKiBTUEkwIENvbnRyb2xsZXIJCQkoMHhGRkMwMDUwMCAtIDB4RkZDMDA1RkYpCQkJCQkJCSovCisjZGVmaW5lIFNQSTBfUkVHQkFTRQkJCTB4RkZDMDA1MDAKKyNkZWZpbmUgU1BJMF9DVEwJCQkweEZGQzAwNTAwCS8qIFNQSSBDb250cm9sIFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgU1BJMF9GTEcJCQkweEZGQzAwNTA0CS8qIFNQSSBGbGFnIHJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgU1BJMF9TVEFUCQkJMHhGRkMwMDUwOAkvKiBTUEkgU3RhdHVzIHJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgU1BJMF9UREJSCQkJMHhGRkMwMDUwQwkvKiBTUEkgVHJhbnNtaXQgRGF0YSBCdWZmZXIgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgU1BJMF9SREJSCQkJMHhGRkMwMDUxMAkvKiBTUEkgUmVjZWl2ZSBEYXRhIEJ1ZmZlciBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBTUEkwX0JBVUQJCQkweEZGQzAwNTE0CS8qIFNQSSBCYXVkIHJhdGUgUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIFNQSTBfU0hBRE9XCQkJMHhGRkMwMDUxOAkvKiBTUElfUkRCUiBTaGFkb3cgUmVnaXN0ZXIJCQkJCSovCisKKy8qIFNQSTEgQ29udHJvbGxlcgkJCSgweEZGQzAzNDAwIC0gMHhGRkMwMzRGRikJCQkJCQkJKi8KKyNkZWZpbmUgU1BJMV9SRUdCQVNFCQkJMHhGRkMwMzQwMAorI2RlZmluZSBTUEkxX0NUTAkJCTB4RkZDMDM0MDAJLyogU1BJIENvbnRyb2wgUmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBTUEkxX0ZMRwkJCTB4RkZDMDM0MDQJLyogU1BJIEZsYWcgcmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBTUEkxX1NUQVQJCQkweEZGQzAzNDA4CS8qIFNQSSBTdGF0dXMgcmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBTUEkxX1REQlIJCQkweEZGQzAzNDBDCS8qIFNQSSBUcmFuc21pdCBEYXRhIEJ1ZmZlciBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBTUEkxX1JEQlIJCQkweEZGQzAzNDEwCS8qIFNQSSBSZWNlaXZlIERhdGEgQnVmZmVyIFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIFNQSTFfQkFVRAkJCTB4RkZDMDM0MTQJLyogU1BJIEJhdWQgcmF0ZSBSZWdpc3RlcgkJCQkJKi8KKyNkZWZpbmUgU1BJMV9TSEFET1cJCQkweEZGQzAzNDE4CS8qIFNQSV9SREJSIFNoYWRvdyBSZWdpc3RlcgkJCQkJKi8KKworLyogVElNRVIwLTcgUmVnaXN0ZXJzCQkoMHhGRkMwMDYwMCAtIDB4RkZDMDA2RkYpCQkJCQkJCQkqLworI2RlZmluZSBUSU1FUjBfQ09ORklHCQkweEZGQzAwNjAwCS8qIFRpbWVyIDAgQ29uZmlndXJhdGlvbiBSZWdpc3RlcgkJCSovCisjZGVmaW5lIFRJTUVSMF9DT1VOVEVSCQkweEZGQzAwNjA0CS8qIFRpbWVyIDAgQ291bnRlciBSZWdpc3RlcgkJCQkJKi8KKyNkZWZpbmUgVElNRVIwX1BFUklPRAkJMHhGRkMwMDYwOAkvKiBUaW1lciAwIFBlcmlvZCBSZWdpc3RlcgkJCQkJKi8KKyNkZWZpbmUgVElNRVIwX1dJRFRICQkweEZGQzAwNjBDCS8qIFRpbWVyIDAgV2lkdGggUmVnaXN0ZXIJCQkJCSovCisKKyNkZWZpbmUgVElNRVIxX0NPTkZJRwkJMHhGRkMwMDYxMAkvKiBUaW1lciAxIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgIAkJCSovCisjZGVmaW5lIFRJTUVSMV9DT1VOVEVSCQkweEZGQzAwNjE0CS8qIFRpbWVyIDEgQ291bnRlciBSZWdpc3RlciAgICAgICAgCQkJKi8KKyNkZWZpbmUgVElNRVIxX1BFUklPRAkJMHhGRkMwMDYxOAkvKiBUaW1lciAxIFBlcmlvZCBSZWdpc3RlciAgICAgICAgIAkJCSovCisjZGVmaW5lIFRJTUVSMV9XSURUSAkJMHhGRkMwMDYxQwkvKiBUaW1lciAxIFdpZHRoIFJlZ2lzdGVyICAgICAgICAgIAkJCSovCisKKyNkZWZpbmUgVElNRVIyX0NPTkZJRwkJMHhGRkMwMDYyMAkvKiBUaW1lciAyIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgIAkJCSovCisjZGVmaW5lIFRJTUVSMl9DT1VOVEVSCQkweEZGQzAwNjI0CS8qIFRpbWVyIDIgQ291bnRlciBSZWdpc3RlciAgICAgICAgCQkJKi8KKyNkZWZpbmUgVElNRVIyX1BFUklPRAkJMHhGRkMwMDYyOAkvKiBUaW1lciAyIFBlcmlvZCBSZWdpc3RlciAgICAgICAgIAkJCSovCisjZGVmaW5lIFRJTUVSMl9XSURUSAkJMHhGRkMwMDYyQwkvKiBUaW1lciAyIFdpZHRoIFJlZ2lzdGVyICAgICAgICAgIAkJCSovCisKKyNkZWZpbmUgVElNRVIzX0NPTkZJRwkJMHhGRkMwMDYzMAkvKiBUaW1lciAzIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIJCQkqLworI2RlZmluZSBUSU1FUjNfQ09VTlRFUgkJMHhGRkMwMDYzNAkvKiBUaW1lciAzIENvdW50ZXIgUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIFRJTUVSM19QRVJJT0QJCTB4RkZDMDA2MzgJLyogVGltZXIgMyBQZXJpb2QgUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIFRJTUVSM19XSURUSAkJMHhGRkMwMDYzQwkvKiBUaW1lciAzIFdpZHRoIFJlZ2lzdGVyCQkJCQkqLworCisjZGVmaW5lIFRJTUVSNF9DT05GSUcJCTB4RkZDMDA2NDAJLyogVGltZXIgNCBDb25maWd1cmF0aW9uIFJlZ2lzdGVyICAJCQkqLworI2RlZmluZSBUSU1FUjRfQ09VTlRFUgkJMHhGRkMwMDY0NAkvKiBUaW1lciA0IENvdW50ZXIgUmVnaXN0ZXIgICAgICAgIAkJCSovCisjZGVmaW5lIFRJTUVSNF9QRVJJT0QJCTB4RkZDMDA2NDgJLyogVGltZXIgNCBQZXJpb2QgUmVnaXN0ZXIgICAgICAgICAJCQkqLworI2RlZmluZSBUSU1FUjRfV0lEVEgJCTB4RkZDMDA2NEMJLyogVGltZXIgNCBXaWR0aCBSZWdpc3RlciAgICAgICAgICAJCQkqLworCisjZGVmaW5lIFRJTUVSNV9DT05GSUcJCTB4RkZDMDA2NTAJLyogVGltZXIgNSBDb25maWd1cmF0aW9uIFJlZ2lzdGVyICAJCQkqLworI2RlZmluZSBUSU1FUjVfQ09VTlRFUgkJMHhGRkMwMDY1NAkvKiBUaW1lciA1IENvdW50ZXIgUmVnaXN0ZXIgICAgICAgIAkJCSovCisjZGVmaW5lIFRJTUVSNV9QRVJJT0QJCTB4RkZDMDA2NTgJLyogVGltZXIgNSBQZXJpb2QgUmVnaXN0ZXIgICAgICAgICAJCQkqLworI2RlZmluZSBUSU1FUjVfV0lEVEgJCTB4RkZDMDA2NUMJLyogVGltZXIgNSBXaWR0aCBSZWdpc3RlciAgICAgICAgICAJCQkqLworCisjZGVmaW5lIFRJTUVSNl9DT05GSUcJCTB4RkZDMDA2NjAJLyogVGltZXIgNiBDb25maWd1cmF0aW9uIFJlZ2lzdGVyICAJCQkqLworI2RlZmluZSBUSU1FUjZfQ09VTlRFUgkJMHhGRkMwMDY2NAkvKiBUaW1lciA2IENvdW50ZXIgUmVnaXN0ZXIgICAgICAgIAkJCSovCisjZGVmaW5lIFRJTUVSNl9QRVJJT0QJCTB4RkZDMDA2NjgJLyogVGltZXIgNiBQZXJpb2QgUmVnaXN0ZXIgICAgICAgICAJCQkqLworI2RlZmluZSBUSU1FUjZfV0lEVEgJCTB4RkZDMDA2NkMJLyogVGltZXIgNiBXaWR0aCBSZWdpc3RlciAgICAgICAgICAJCQkqLworCisjZGVmaW5lIFRJTUVSN19DT05GSUcJCTB4RkZDMDA2NzAJLyogVGltZXIgNyBDb25maWd1cmF0aW9uIFJlZ2lzdGVyICAJCQkqLworI2RlZmluZSBUSU1FUjdfQ09VTlRFUgkJMHhGRkMwMDY3NAkvKiBUaW1lciA3IENvdW50ZXIgUmVnaXN0ZXIgICAgICAgIAkJCSovCisjZGVmaW5lIFRJTUVSN19QRVJJT0QJCTB4RkZDMDA2NzgJLyogVGltZXIgNyBQZXJpb2QgUmVnaXN0ZXIgICAgICAgICAJCQkqLworI2RlZmluZSBUSU1FUjdfV0lEVEgJCTB4RkZDMDA2N0MJLyogVGltZXIgNyBXaWR0aCBSZWdpc3RlciAgICAgICAJCQkqLworCisjZGVmaW5lIFRJTUVSX0VOQUJMRQkJMHhGRkMwMDY4MAkvKiBUaW1lciBFbmFibGUgUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIFRJTUVSX0RJU0FCTEUJCTB4RkZDMDA2ODQJLyogVGltZXIgRGlzYWJsZSBSZWdpc3RlcgkJCQkJKi8KKyNkZWZpbmUgVElNRVJfU1RBVFVTCQkweEZGQzAwNjg4CS8qIFRpbWVyIFN0YXR1cyBSZWdpc3RlcgkJCQkJKi8KKworLyogR2VuZXJhbCBQdXJwb3NlIEkvTyBQb3J0IEYgKDB4RkZDMDA3MDAgLSAweEZGQzAwN0ZGKQkJCQkJCQkJCQkJCSovCisjZGVmaW5lIFBPUlRGSU8JCQkJCTB4RkZDMDA3MDAJLyogUG9ydCBGIEkvTyBQaW4gU3RhdGUgU3BlY2lmeSBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBQT1JURklPX0NMRUFSCQkJMHhGRkMwMDcwNAkvKiBQb3J0IEYgSS9PIFBlcmlwaGVyYWwgSW50ZXJydXB0IENsZWFyIFJlZ2lzdGVyCQkqLworI2RlZmluZSBQT1JURklPX1NFVAkJCQkweEZGQzAwNzA4CS8qIFBvcnQgRiBJL08gUGVyaXBoZXJhbCBJbnRlcnJ1cHQgU2V0IFJlZ2lzdGVyCQkJKi8KKyNkZWZpbmUgUE9SVEZJT19UT0dHTEUJCQkweEZGQzAwNzBDCS8qIFBvcnQgRiBJL08gUGluIFN0YXRlIFRvZ2dsZSBSZWdpc3RlcgkJCQkJKi8KKyNkZWZpbmUgUE9SVEZJT19NQVNLQQkJCTB4RkZDMDA3MTAJLyogUG9ydCBGIEkvTyBNYXNrIFN0YXRlIFNwZWNpZnkgSW50ZXJydXB0IEEgUmVnaXN0ZXIJKi8KKyNkZWZpbmUgUE9SVEZJT19NQVNLQV9DTEVBUgkJMHhGRkMwMDcxNAkvKiBQb3J0IEYgSS9PIE1hc2sgRGlzYWJsZSBJbnRlcnJ1cHQgQSBSZWdpc3RlcgkJCSovCisjZGVmaW5lIFBPUlRGSU9fTUFTS0FfU0VUCQkweEZGQzAwNzE4CS8qIFBvcnQgRiBJL08gTWFzayBFbmFibGUgSW50ZXJydXB0IEEgUmVnaXN0ZXIJCQkqLworI2RlZmluZSBQT1JURklPX01BU0tBX1RPR0dMRQkweEZGQzAwNzFDCS8qIFBvcnQgRiBJL08gTWFzayBUb2dnbGUgRW5hYmxlIEludGVycnVwdCBBIFJlZ2lzdGVyCSovCisjZGVmaW5lIFBPUlRGSU9fTUFTS0IJCQkweEZGQzAwNzIwCS8qIFBvcnQgRiBJL08gTWFzayBTdGF0ZSBTcGVjaWZ5IEludGVycnVwdCBCIFJlZ2lzdGVyCSovCisjZGVmaW5lIFBPUlRGSU9fTUFTS0JfQ0xFQVIJCTB4RkZDMDA3MjQJLyogUG9ydCBGIEkvTyBNYXNrIERpc2FibGUgSW50ZXJydXB0IEIgUmVnaXN0ZXIJCQkqLworI2RlZmluZSBQT1JURklPX01BU0tCX1NFVAkJMHhGRkMwMDcyOAkvKiBQb3J0IEYgSS9PIE1hc2sgRW5hYmxlIEludGVycnVwdCBCIFJlZ2lzdGVyCQkJKi8KKyNkZWZpbmUgUE9SVEZJT19NQVNLQl9UT0dHTEUJMHhGRkMwMDcyQwkvKiBQb3J0IEYgSS9PIE1hc2sgVG9nZ2xlIEVuYWJsZSBJbnRlcnJ1cHQgQiBSZWdpc3RlcgkqLworI2RlZmluZSBQT1JURklPX0RJUgkJCQkweEZGQzAwNzMwCS8qIFBvcnQgRiBJL08gRGlyZWN0aW9uIFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgUE9SVEZJT19QT0xBUgkJCTB4RkZDMDA3MzQJLyogUG9ydCBGIEkvTyBTb3VyY2UgUG9sYXJpdHkgUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIFBPUlRGSU9fRURHRQkJCTB4RkZDMDA3MzgJLyogUG9ydCBGIEkvTyBTb3VyY2UgU2Vuc2l0aXZpdHkgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgUE9SVEZJT19CT1RICQkJMHhGRkMwMDczQwkvKiBQb3J0IEYgSS9PIFNldCBvbiBCT1RIIEVkZ2VzIFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIFBPUlRGSU9fSU5FTgkJCTB4RkZDMDA3NDAJLyogUG9ydCBGIEkvTyBJbnB1dCBFbmFibGUgUmVnaXN0ZXIgCQkJCQkqLworCisvKiBTUE9SVDAgQ29udHJvbGxlcgkJKDB4RkZDMDA4MDAgLSAweEZGQzAwOEZGKQkJCQkJCQkJCQkqLworI2RlZmluZSBTUE9SVDBfVENSMQkJCTB4RkZDMDA4MDAJLyogU1BPUlQwIFRyYW5zbWl0IENvbmZpZ3VyYXRpb24gMSBSZWdpc3RlcgkJCSovCisjZGVmaW5lIFNQT1JUMF9UQ1IyCQkJMHhGRkMwMDgwNAkvKiBTUE9SVDAgVHJhbnNtaXQgQ29uZmlndXJhdGlvbiAyIFJlZ2lzdGVyCQkJKi8KKyNkZWZpbmUgU1BPUlQwX1RDTEtESVYJCTB4RkZDMDA4MDgJLyogU1BPUlQwIFRyYW5zbWl0IENsb2NrIERpdmlkZXIJCQkJCSovCisjZGVmaW5lIFNQT1JUMF9URlNESVYJCTB4RkZDMDA4MEMJLyogU1BPUlQwIFRyYW5zbWl0IEZyYW1lIFN5bmMgRGl2aWRlcgkJCQkqLworI2RlZmluZSBTUE9SVDBfVFgJCQkweEZGQzAwODEwCS8qIFNQT1JUMCBUWCBEYXRhIFJlZ2lzdGVyCQkJCQkJCSovCisjZGVmaW5lIFNQT1JUMF9SWAkJCTB4RkZDMDA4MTgJLyogU1BPUlQwIFJYIERhdGEgUmVnaXN0ZXIJCQkJCQkJKi8KKyNkZWZpbmUgU1BPUlQwX1JDUjEJCQkweEZGQzAwODIwCS8qIFNQT1JUMCBUcmFuc21pdCBDb25maWd1cmF0aW9uIDEgUmVnaXN0ZXIJCQkqLworI2RlZmluZSBTUE9SVDBfUkNSMgkJCTB4RkZDMDA4MjQJLyogU1BPUlQwIFRyYW5zbWl0IENvbmZpZ3VyYXRpb24gMiBSZWdpc3RlcgkJCSovCisjZGVmaW5lIFNQT1JUMF9SQ0xLRElWCQkweEZGQzAwODI4CS8qIFNQT1JUMCBSZWNlaXZlIENsb2NrIERpdmlkZXIJCQkJCQkqLworI2RlZmluZSBTUE9SVDBfUkZTRElWCQkweEZGQzAwODJDCS8qIFNQT1JUMCBSZWNlaXZlIEZyYW1lIFN5bmMgRGl2aWRlcgkJCQkqLworI2RlZmluZSBTUE9SVDBfU1RBVAkJCTB4RkZDMDA4MzAJLyogU1BPUlQwIFN0YXR1cyBSZWdpc3RlcgkJCQkJCQkqLworI2RlZmluZSBTUE9SVDBfQ0hOTAkJCTB4RkZDMDA4MzQJLyogU1BPUlQwIEN1cnJlbnQgQ2hhbm5lbCBSZWdpc3RlcgkJCQkJKi8KKyNkZWZpbmUgU1BPUlQwX01DTUMxCQkweEZGQzAwODM4CS8qIFNQT1JUMCBNdWx0aS1DaGFubmVsIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgMQkqLworI2RlZmluZSBTUE9SVDBfTUNNQzIJCTB4RkZDMDA4M0MJLyogU1BPUlQwIE11bHRpLUNoYW5uZWwgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAyCSovCisjZGVmaW5lIFNQT1JUMF9NVENTMAkJMHhGRkMwMDg0MAkvKiBTUE9SVDAgTXVsdGktQ2hhbm5lbCBUcmFuc21pdCBTZWxlY3QgUmVnaXN0ZXIgMAkqLworI2RlZmluZSBTUE9SVDBfTVRDUzEJCTB4RkZDMDA4NDQJLyogU1BPUlQwIE11bHRpLUNoYW5uZWwgVHJhbnNtaXQgU2VsZWN0IFJlZ2lzdGVyIDEJKi8KKyNkZWZpbmUgU1BPUlQwX01UQ1MyCQkweEZGQzAwODQ4CS8qIFNQT1JUMCBNdWx0aS1DaGFubmVsIFRyYW5zbWl0IFNlbGVjdCBSZWdpc3RlciAyCSovCisjZGVmaW5lIFNQT1JUMF9NVENTMwkJMHhGRkMwMDg0QwkvKiBTUE9SVDAgTXVsdGktQ2hhbm5lbCBUcmFuc21pdCBTZWxlY3QgUmVnaXN0ZXIgMwkqLworI2RlZmluZSBTUE9SVDBfTVJDUzAJCTB4RkZDMDA4NTAJLyogU1BPUlQwIE11bHRpLUNoYW5uZWwgUmVjZWl2ZSBTZWxlY3QgUmVnaXN0ZXIgMAkqLworI2RlZmluZSBTUE9SVDBfTVJDUzEJCTB4RkZDMDA4NTQJLyogU1BPUlQwIE11bHRpLUNoYW5uZWwgUmVjZWl2ZSBTZWxlY3QgUmVnaXN0ZXIgMQkqLworI2RlZmluZSBTUE9SVDBfTVJDUzIJCTB4RkZDMDA4NTgJLyogU1BPUlQwIE11bHRpLUNoYW5uZWwgUmVjZWl2ZSBTZWxlY3QgUmVnaXN0ZXIgMgkqLworI2RlZmluZSBTUE9SVDBfTVJDUzMJCTB4RkZDMDA4NUMJLyogU1BPUlQwIE11bHRpLUNoYW5uZWwgUmVjZWl2ZSBTZWxlY3QgUmVnaXN0ZXIgMwkqLworCisvKiBTUE9SVDEgQ29udHJvbGxlcgkJKDB4RkZDMDA5MDAgLSAweEZGQzAwOUZGKQkJCQkJCQkJCQkqLworI2RlZmluZSBTUE9SVDFfVENSMQkJCTB4RkZDMDA5MDAJLyogU1BPUlQxIFRyYW5zbWl0IENvbmZpZ3VyYXRpb24gMSBSZWdpc3RlcgkJCSovCisjZGVmaW5lIFNQT1JUMV9UQ1IyCQkJMHhGRkMwMDkwNAkvKiBTUE9SVDEgVHJhbnNtaXQgQ29uZmlndXJhdGlvbiAyIFJlZ2lzdGVyCQkJKi8KKyNkZWZpbmUgU1BPUlQxX1RDTEtESVYJCTB4RkZDMDA5MDgJLyogU1BPUlQxIFRyYW5zbWl0IENsb2NrIERpdmlkZXIJCQkJCSovCisjZGVmaW5lIFNQT1JUMV9URlNESVYJCTB4RkZDMDA5MEMJLyogU1BPUlQxIFRyYW5zbWl0IEZyYW1lIFN5bmMgRGl2aWRlcgkJCQkqLworI2RlZmluZSBTUE9SVDFfVFgJCQkweEZGQzAwOTEwCS8qIFNQT1JUMSBUWCBEYXRhIFJlZ2lzdGVyCQkJCQkJCSovCisjZGVmaW5lIFNQT1JUMV9SWAkJCTB4RkZDMDA5MTgJLyogU1BPUlQxIFJYIERhdGEgUmVnaXN0ZXIJCQkJCQkJKi8KKyNkZWZpbmUgU1BPUlQxX1JDUjEJCQkweEZGQzAwOTIwCS8qIFNQT1JUMSBUcmFuc21pdCBDb25maWd1cmF0aW9uIDEgUmVnaXN0ZXIJCQkqLworI2RlZmluZSBTUE9SVDFfUkNSMgkJCTB4RkZDMDA5MjQJLyogU1BPUlQxIFRyYW5zbWl0IENvbmZpZ3VyYXRpb24gMiBSZWdpc3RlcgkJCSovCisjZGVmaW5lIFNQT1JUMV9SQ0xLRElWCQkweEZGQzAwOTI4CS8qIFNQT1JUMSBSZWNlaXZlIENsb2NrIERpdmlkZXIJCQkJCQkqLworI2RlZmluZSBTUE9SVDFfUkZTRElWCQkweEZGQzAwOTJDCS8qIFNQT1JUMSBSZWNlaXZlIEZyYW1lIFN5bmMgRGl2aWRlcgkJCQkqLworI2RlZmluZSBTUE9SVDFfU1RBVAkJCTB4RkZDMDA5MzAJLyogU1BPUlQxIFN0YXR1cyBSZWdpc3RlcgkJCQkJCQkqLworI2RlZmluZSBTUE9SVDFfQ0hOTAkJCTB4RkZDMDA5MzQJLyogU1BPUlQxIEN1cnJlbnQgQ2hhbm5lbCBSZWdpc3RlcgkJCQkJKi8KKyNkZWZpbmUgU1BPUlQxX01DTUMxCQkweEZGQzAwOTM4CS8qIFNQT1JUMSBNdWx0aS1DaGFubmVsIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgMQkqLworI2RlZmluZSBTUE9SVDFfTUNNQzIJCTB4RkZDMDA5M0MJLyogU1BPUlQxIE11bHRpLUNoYW5uZWwgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAyCSovCisjZGVmaW5lIFNQT1JUMV9NVENTMAkJMHhGRkMwMDk0MAkvKiBTUE9SVDEgTXVsdGktQ2hhbm5lbCBUcmFuc21pdCBTZWxlY3QgUmVnaXN0ZXIgMAkqLworI2RlZmluZSBTUE9SVDFfTVRDUzEJCTB4RkZDMDA5NDQJLyogU1BPUlQxIE11bHRpLUNoYW5uZWwgVHJhbnNtaXQgU2VsZWN0IFJlZ2lzdGVyIDEJKi8KKyNkZWZpbmUgU1BPUlQxX01UQ1MyCQkweEZGQzAwOTQ4CS8qIFNQT1JUMSBNdWx0aS1DaGFubmVsIFRyYW5zbWl0IFNlbGVjdCBSZWdpc3RlciAyCSovCisjZGVmaW5lIFNQT1JUMV9NVENTMwkJMHhGRkMwMDk0QwkvKiBTUE9SVDEgTXVsdGktQ2hhbm5lbCBUcmFuc21pdCBTZWxlY3QgUmVnaXN0ZXIgMwkqLworI2RlZmluZSBTUE9SVDFfTVJDUzAJCTB4RkZDMDA5NTAJLyogU1BPUlQxIE11bHRpLUNoYW5uZWwgUmVjZWl2ZSBTZWxlY3QgUmVnaXN0ZXIgMAkqLworI2RlZmluZSBTUE9SVDFfTVJDUzEJCTB4RkZDMDA5NTQJLyogU1BPUlQxIE11bHRpLUNoYW5uZWwgUmVjZWl2ZSBTZWxlY3QgUmVnaXN0ZXIgMQkqLworI2RlZmluZSBTUE9SVDFfTVJDUzIJCTB4RkZDMDA5NTgJLyogU1BPUlQxIE11bHRpLUNoYW5uZWwgUmVjZWl2ZSBTZWxlY3QgUmVnaXN0ZXIgMgkqLworI2RlZmluZSBTUE9SVDFfTVJDUzMJCTB4RkZDMDA5NUMJLyogU1BPUlQxIE11bHRpLUNoYW5uZWwgUmVjZWl2ZSBTZWxlY3QgUmVnaXN0ZXIgMwkqLworCisvKiBFeHRlcm5hbCBCdXMgSW50ZXJmYWNlIFVuaXQgKDB4RkZDMDBBMDAgLSAweEZGQzAwQUZGKQkJCQkJCQkJKi8KKyNkZWZpbmUgRUJJVV9BTUdDVEwJCQkweEZGQzAwQTAwCS8qIEFzeW5jaHJvbm91cyBNZW1vcnkgR2xvYmFsIENvbnRyb2wgUmVnaXN0ZXIJKi8KKyNkZWZpbmUgRUJJVV9BTUJDVEwwCQkweEZGQzAwQTA0CS8qIEFzeW5jaHJvbm91cyBNZW1vcnkgQmFuayBDb250cm9sIFJlZ2lzdGVyIDAJKi8KKyNkZWZpbmUgRUJJVV9BTUJDVEwxCQkweEZGQzAwQTA4CS8qIEFzeW5jaHJvbm91cyBNZW1vcnkgQmFuayBDb250cm9sIFJlZ2lzdGVyIDEJKi8KKyNkZWZpbmUgRUJJVV9TREdDVEwJCQkweEZGQzAwQTEwCS8qIFNEUkFNIEdsb2JhbCBDb250cm9sIFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIEVCSVVfU0RCQ1RMCQkJMHhGRkMwMEExNAkvKiBTRFJBTSBCYW5rIENvbnRyb2wgUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIEVCSVVfU0RSUkMJCQkweEZGQzAwQTE4CS8qIFNEUkFNIFJlZnJlc2ggUmF0ZSBDb250cm9sIFJlZ2lzdGVyCQkJKi8KKyNkZWZpbmUgRUJJVV9TRFNUQVQJCQkweEZGQzAwQTFDCS8qIFNEUkFNIFN0YXR1cyBSZWdpc3RlcgkJCQkJCSovCisKKy8qIERNQSBUcmFmZmljIENvbnRyb2wgUmVnaXN0ZXJzCQkJCQkJCQkJCQkJCSovCisjZGVmaW5lIERNQV9UQ19QRVIJCQkweEZGQzAwQjBDCS8qIFRyYWZmaWMgQ29udHJvbCBQZXJpb2RzIFJlZ2lzdGVyCQkJKi8KKyNkZWZpbmUgRE1BX1RDX0NOVAkJCTB4RkZDMDBCMTAJLyogVHJhZmZpYyBDb250cm9sIEN1cnJlbnQgQ291bnRzIFJlZ2lzdGVyCSovCisKKy8qIEFsdGVybmF0ZSBkZXByZWNhdGVkIHJlZ2lzdGVyIG5hbWVzIChiZWxvdykgcHJvdmlkZWQgZm9yIGJhY2t3YXJkcyBjb2RlIGNvbXBhdGliaWxpdHkgKi8KKyNkZWZpbmUgRE1BX1RDUEVSCQkJMHhGRkMwMEIwQwkvKiBUcmFmZmljIENvbnRyb2wgUGVyaW9kcyBSZWdpc3RlcgkJCSovCisjZGVmaW5lIERNQV9UQ0NOVAkJCTB4RkZDMDBCMTAJLyogVHJhZmZpYyBDb250cm9sIEN1cnJlbnQgQ291bnRzIFJlZ2lzdGVyCSovCisKKy8qIERNQSBDb250cm9sbGVyICgweEZGQzAwQzAwIC0gMHhGRkMwMEZGRikJCQkJCQkJCQkJCQkJCQkqLworI2RlZmluZSBETUEwX05FWFRfREVTQ19QVFIJCTB4RkZDMDBDMDAJLyogRE1BIENoYW5uZWwgMCBOZXh0IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlcgkJKi8KKyNkZWZpbmUgRE1BMF9TVEFSVF9BRERSCQkJMHhGRkMwMEMwNAkvKiBETUEgQ2hhbm5lbCAwIFN0YXJ0IEFkZHJlc3MgUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIERNQTBfQ09ORklHCQkJCTB4RkZDMDBDMDgJLyogRE1BIENoYW5uZWwgMCBDb25maWd1cmF0aW9uIFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBETUEwX1hfQ09VTlQJCQkweEZGQzAwQzEwCS8qIERNQSBDaGFubmVsIDAgWCBDb3VudCBSZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIERNQTBfWF9NT0RJRlkJCQkweEZGQzAwQzE0CS8qIERNQSBDaGFubmVsIDAgWCBNb2RpZnkgUmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBETUEwX1lfQ09VTlQJCQkweEZGQzAwQzE4CS8qIERNQSBDaGFubmVsIDAgWSBDb3VudCBSZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIERNQTBfWV9NT0RJRlkJCQkweEZGQzAwQzFDCS8qIERNQSBDaGFubmVsIDAgWSBNb2RpZnkgUmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBETUEwX0NVUlJfREVTQ19QVFIJCTB4RkZDMDBDMjAJLyogRE1BIENoYW5uZWwgMCBDdXJyZW50IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlcgkqLworI2RlZmluZSBETUEwX0NVUlJfQUREUgkJCTB4RkZDMDBDMjQJLyogRE1BIENoYW5uZWwgMCBDdXJyZW50IEFkZHJlc3MgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgRE1BMF9JUlFfU1RBVFVTCQkJMHhGRkMwMEMyOAkvKiBETUEgQ2hhbm5lbCAwIEludGVycnVwdC9TdGF0dXMgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgRE1BMF9QRVJJUEhFUkFMX01BUAkJMHhGRkMwMEMyQwkvKiBETUEgQ2hhbm5lbCAwIFBlcmlwaGVyYWwgTWFwIFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIERNQTBfQ1VSUl9YX0NPVU5UCQkweEZGQzAwQzMwCS8qIERNQSBDaGFubmVsIDAgQ3VycmVudCBYIENvdW50IFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIERNQTBfQ1VSUl9ZX0NPVU5UCQkweEZGQzAwQzM4CS8qIERNQSBDaGFubmVsIDAgQ3VycmVudCBZIENvdW50IFJlZ2lzdGVyCQkJCSovCisKKyNkZWZpbmUgRE1BMV9ORVhUX0RFU0NfUFRSCQkweEZGQzAwQzQwCS8qIERNQSBDaGFubmVsIDEgTmV4dCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIJCSovCisjZGVmaW5lIERNQTFfU1RBUlRfQUREUgkJCTB4RkZDMDBDNDQJLyogRE1BIENoYW5uZWwgMSBTdGFydCBBZGRyZXNzIFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBETUExX0NPTkZJRwkJCQkweEZGQzAwQzQ4CS8qIERNQSBDaGFubmVsIDEgQ29uZmlndXJhdGlvbiBSZWdpc3RlcgkJCQkJKi8KKyNkZWZpbmUgRE1BMV9YX0NPVU5UCQkJMHhGRkMwMEM1MAkvKiBETUEgQ2hhbm5lbCAxIFggQ291bnQgUmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBETUExX1hfTU9ESUZZCQkJMHhGRkMwMEM1NAkvKiBETUEgQ2hhbm5lbCAxIFggTW9kaWZ5IFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgRE1BMV9ZX0NPVU5UCQkJMHhGRkMwMEM1OAkvKiBETUEgQ2hhbm5lbCAxIFkgQ291bnQgUmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBETUExX1lfTU9ESUZZCQkJMHhGRkMwMEM1QwkvKiBETUEgQ2hhbm5lbCAxIFkgTW9kaWZ5IFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgRE1BMV9DVVJSX0RFU0NfUFRSCQkweEZGQzAwQzYwCS8qIERNQSBDaGFubmVsIDEgQ3VycmVudCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIJKi8KKyNkZWZpbmUgRE1BMV9DVVJSX0FERFIJCQkweEZGQzAwQzY0CS8qIERNQSBDaGFubmVsIDEgQ3VycmVudCBBZGRyZXNzIFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIERNQTFfSVJRX1NUQVRVUwkJCTB4RkZDMDBDNjgJLyogRE1BIENoYW5uZWwgMSBJbnRlcnJ1cHQvU3RhdHVzIFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIERNQTFfUEVSSVBIRVJBTF9NQVAJCTB4RkZDMDBDNkMJLyogRE1BIENoYW5uZWwgMSBQZXJpcGhlcmFsIE1hcCBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBETUExX0NVUlJfWF9DT1VOVAkJMHhGRkMwMEM3MAkvKiBETUEgQ2hhbm5lbCAxIEN1cnJlbnQgWCBDb3VudCBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBETUExX0NVUlJfWV9DT1VOVAkJMHhGRkMwMEM3OAkvKiBETUEgQ2hhbm5lbCAxIEN1cnJlbnQgWSBDb3VudCBSZWdpc3RlcgkJCQkqLworCisjZGVmaW5lIERNQTJfTkVYVF9ERVNDX1BUUgkJMHhGRkMwMEM4MAkvKiBETUEgQ2hhbm5lbCAyIE5leHQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyCQkqLworI2RlZmluZSBETUEyX1NUQVJUX0FERFIJCQkweEZGQzAwQzg0CS8qIERNQSBDaGFubmVsIDIgU3RhcnQgQWRkcmVzcyBSZWdpc3RlcgkJCQkJKi8KKyNkZWZpbmUgRE1BMl9DT05GSUcJCQkJMHhGRkMwMEM4OAkvKiBETUEgQ2hhbm5lbCAyIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIERNQTJfWF9DT1VOVAkJCTB4RkZDMDBDOTAJLyogRE1BIENoYW5uZWwgMiBYIENvdW50IFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgRE1BMl9YX01PRElGWQkJCTB4RkZDMDBDOTQJLyogRE1BIENoYW5uZWwgMiBYIE1vZGlmeSBSZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIERNQTJfWV9DT1VOVAkJCTB4RkZDMDBDOTgJLyogRE1BIENoYW5uZWwgMiBZIENvdW50IFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgRE1BMl9ZX01PRElGWQkJCTB4RkZDMDBDOUMJLyogRE1BIENoYW5uZWwgMiBZIE1vZGlmeSBSZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIERNQTJfQ1VSUl9ERVNDX1BUUgkJMHhGRkMwMENBMAkvKiBETUEgQ2hhbm5lbCAyIEN1cnJlbnQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyCSovCisjZGVmaW5lIERNQTJfQ1VSUl9BRERSCQkJMHhGRkMwMENBNAkvKiBETUEgQ2hhbm5lbCAyIEN1cnJlbnQgQWRkcmVzcyBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBETUEyX0lSUV9TVEFUVVMJCQkweEZGQzAwQ0E4CS8qIERNQSBDaGFubmVsIDIgSW50ZXJydXB0L1N0YXR1cyBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBETUEyX1BFUklQSEVSQUxfTUFQCQkweEZGQzAwQ0FDCS8qIERNQSBDaGFubmVsIDIgUGVyaXBoZXJhbCBNYXAgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgRE1BMl9DVVJSX1hfQ09VTlQJCTB4RkZDMDBDQjAJLyogRE1BIENoYW5uZWwgMiBDdXJyZW50IFggQ291bnQgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgRE1BMl9DVVJSX1lfQ09VTlQJCTB4RkZDMDBDQjgJLyogRE1BIENoYW5uZWwgMiBDdXJyZW50IFkgQ291bnQgUmVnaXN0ZXIJCQkJKi8KKworI2RlZmluZSBETUEzX05FWFRfREVTQ19QVFIJCTB4RkZDMDBDQzAJLyogRE1BIENoYW5uZWwgMyBOZXh0IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlcgkJKi8KKyNkZWZpbmUgRE1BM19TVEFSVF9BRERSCQkJMHhGRkMwMENDNAkvKiBETUEgQ2hhbm5lbCAzIFN0YXJ0IEFkZHJlc3MgUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIERNQTNfQ09ORklHCQkJCTB4RkZDMDBDQzgJLyogRE1BIENoYW5uZWwgMyBDb25maWd1cmF0aW9uIFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBETUEzX1hfQ09VTlQJCQkweEZGQzAwQ0QwCS8qIERNQSBDaGFubmVsIDMgWCBDb3VudCBSZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIERNQTNfWF9NT0RJRlkJCQkweEZGQzAwQ0Q0CS8qIERNQSBDaGFubmVsIDMgWCBNb2RpZnkgUmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBETUEzX1lfQ09VTlQJCQkweEZGQzAwQ0Q4CS8qIERNQSBDaGFubmVsIDMgWSBDb3VudCBSZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIERNQTNfWV9NT0RJRlkJCQkweEZGQzAwQ0RDCS8qIERNQSBDaGFubmVsIDMgWSBNb2RpZnkgUmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBETUEzX0NVUlJfREVTQ19QVFIJCTB4RkZDMDBDRTAJLyogRE1BIENoYW5uZWwgMyBDdXJyZW50IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlcgkqLworI2RlZmluZSBETUEzX0NVUlJfQUREUgkJCTB4RkZDMDBDRTQJLyogRE1BIENoYW5uZWwgMyBDdXJyZW50IEFkZHJlc3MgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgRE1BM19JUlFfU1RBVFVTCQkJMHhGRkMwMENFOAkvKiBETUEgQ2hhbm5lbCAzIEludGVycnVwdC9TdGF0dXMgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgRE1BM19QRVJJUEhFUkFMX01BUAkJMHhGRkMwMENFQwkvKiBETUEgQ2hhbm5lbCAzIFBlcmlwaGVyYWwgTWFwIFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIERNQTNfQ1VSUl9YX0NPVU5UCQkweEZGQzAwQ0YwCS8qIERNQSBDaGFubmVsIDMgQ3VycmVudCBYIENvdW50IFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIERNQTNfQ1VSUl9ZX0NPVU5UCQkweEZGQzAwQ0Y4CS8qIERNQSBDaGFubmVsIDMgQ3VycmVudCBZIENvdW50IFJlZ2lzdGVyCQkJCSovCisKKyNkZWZpbmUgRE1BNF9ORVhUX0RFU0NfUFRSCQkweEZGQzAwRDAwCS8qIERNQSBDaGFubmVsIDQgTmV4dCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIJCSovCisjZGVmaW5lIERNQTRfU1RBUlRfQUREUgkJCTB4RkZDMDBEMDQJLyogRE1BIENoYW5uZWwgNCBTdGFydCBBZGRyZXNzIFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBETUE0X0NPTkZJRwkJCQkweEZGQzAwRDA4CS8qIERNQSBDaGFubmVsIDQgQ29uZmlndXJhdGlvbiBSZWdpc3RlcgkJCQkJKi8KKyNkZWZpbmUgRE1BNF9YX0NPVU5UCQkJMHhGRkMwMEQxMAkvKiBETUEgQ2hhbm5lbCA0IFggQ291bnQgUmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBETUE0X1hfTU9ESUZZCQkJMHhGRkMwMEQxNAkvKiBETUEgQ2hhbm5lbCA0IFggTW9kaWZ5IFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgRE1BNF9ZX0NPVU5UCQkJMHhGRkMwMEQxOAkvKiBETUEgQ2hhbm5lbCA0IFkgQ291bnQgUmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBETUE0X1lfTU9ESUZZCQkJMHhGRkMwMEQxQwkvKiBETUEgQ2hhbm5lbCA0IFkgTW9kaWZ5IFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgRE1BNF9DVVJSX0RFU0NfUFRSCQkweEZGQzAwRDIwCS8qIERNQSBDaGFubmVsIDQgQ3VycmVudCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIJKi8KKyNkZWZpbmUgRE1BNF9DVVJSX0FERFIJCQkweEZGQzAwRDI0CS8qIERNQSBDaGFubmVsIDQgQ3VycmVudCBBZGRyZXNzIFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIERNQTRfSVJRX1NUQVRVUwkJCTB4RkZDMDBEMjgJLyogRE1BIENoYW5uZWwgNCBJbnRlcnJ1cHQvU3RhdHVzIFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIERNQTRfUEVSSVBIRVJBTF9NQVAJCTB4RkZDMDBEMkMJLyogRE1BIENoYW5uZWwgNCBQZXJpcGhlcmFsIE1hcCBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBETUE0X0NVUlJfWF9DT1VOVAkJMHhGRkMwMEQzMAkvKiBETUEgQ2hhbm5lbCA0IEN1cnJlbnQgWCBDb3VudCBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBETUE0X0NVUlJfWV9DT1VOVAkJMHhGRkMwMEQzOAkvKiBETUEgQ2hhbm5lbCA0IEN1cnJlbnQgWSBDb3VudCBSZWdpc3RlcgkJCQkqLworCisjZGVmaW5lIERNQTVfTkVYVF9ERVNDX1BUUgkJMHhGRkMwMEQ0MAkvKiBETUEgQ2hhbm5lbCA1IE5leHQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyCQkqLworI2RlZmluZSBETUE1X1NUQVJUX0FERFIJCQkweEZGQzAwRDQ0CS8qIERNQSBDaGFubmVsIDUgU3RhcnQgQWRkcmVzcyBSZWdpc3RlcgkJCQkJKi8KKyNkZWZpbmUgRE1BNV9DT05GSUcJCQkJMHhGRkMwMEQ0OAkvKiBETUEgQ2hhbm5lbCA1IENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIERNQTVfWF9DT1VOVAkJCTB4RkZDMDBENTAJLyogRE1BIENoYW5uZWwgNSBYIENvdW50IFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgRE1BNV9YX01PRElGWQkJCTB4RkZDMDBENTQJLyogRE1BIENoYW5uZWwgNSBYIE1vZGlmeSBSZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIERNQTVfWV9DT1VOVAkJCTB4RkZDMDBENTgJLyogRE1BIENoYW5uZWwgNSBZIENvdW50IFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgRE1BNV9ZX01PRElGWQkJCTB4RkZDMDBENUMJLyogRE1BIENoYW5uZWwgNSBZIE1vZGlmeSBSZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIERNQTVfQ1VSUl9ERVNDX1BUUgkJMHhGRkMwMEQ2MAkvKiBETUEgQ2hhbm5lbCA1IEN1cnJlbnQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyCSovCisjZGVmaW5lIERNQTVfQ1VSUl9BRERSCQkJMHhGRkMwMEQ2NAkvKiBETUEgQ2hhbm5lbCA1IEN1cnJlbnQgQWRkcmVzcyBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBETUE1X0lSUV9TVEFUVVMJCQkweEZGQzAwRDY4CS8qIERNQSBDaGFubmVsIDUgSW50ZXJydXB0L1N0YXR1cyBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBETUE1X1BFUklQSEVSQUxfTUFQCQkweEZGQzAwRDZDCS8qIERNQSBDaGFubmVsIDUgUGVyaXBoZXJhbCBNYXAgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgRE1BNV9DVVJSX1hfQ09VTlQJCTB4RkZDMDBENzAJLyogRE1BIENoYW5uZWwgNSBDdXJyZW50IFggQ291bnQgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgRE1BNV9DVVJSX1lfQ09VTlQJCTB4RkZDMDBENzgJLyogRE1BIENoYW5uZWwgNSBDdXJyZW50IFkgQ291bnQgUmVnaXN0ZXIJCQkJKi8KKworI2RlZmluZSBETUE2X05FWFRfREVTQ19QVFIJCTB4RkZDMDBEODAJLyogRE1BIENoYW5uZWwgNiBOZXh0IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlcgkJKi8KKyNkZWZpbmUgRE1BNl9TVEFSVF9BRERSCQkJMHhGRkMwMEQ4NAkvKiBETUEgQ2hhbm5lbCA2IFN0YXJ0IEFkZHJlc3MgUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIERNQTZfQ09ORklHCQkJCTB4RkZDMDBEODgJLyogRE1BIENoYW5uZWwgNiBDb25maWd1cmF0aW9uIFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBETUE2X1hfQ09VTlQJCQkweEZGQzAwRDkwCS8qIERNQSBDaGFubmVsIDYgWCBDb3VudCBSZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIERNQTZfWF9NT0RJRlkJCQkweEZGQzAwRDk0CS8qIERNQSBDaGFubmVsIDYgWCBNb2RpZnkgUmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBETUE2X1lfQ09VTlQJCQkweEZGQzAwRDk4CS8qIERNQSBDaGFubmVsIDYgWSBDb3VudCBSZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIERNQTZfWV9NT0RJRlkJCQkweEZGQzAwRDlDCS8qIERNQSBDaGFubmVsIDYgWSBNb2RpZnkgUmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBETUE2X0NVUlJfREVTQ19QVFIJCTB4RkZDMDBEQTAJLyogRE1BIENoYW5uZWwgNiBDdXJyZW50IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlcgkqLworI2RlZmluZSBETUE2X0NVUlJfQUREUgkJCTB4RkZDMDBEQTQJLyogRE1BIENoYW5uZWwgNiBDdXJyZW50IEFkZHJlc3MgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgRE1BNl9JUlFfU1RBVFVTCQkJMHhGRkMwMERBOAkvKiBETUEgQ2hhbm5lbCA2IEludGVycnVwdC9TdGF0dXMgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgRE1BNl9QRVJJUEhFUkFMX01BUAkJMHhGRkMwMERBQwkvKiBETUEgQ2hhbm5lbCA2IFBlcmlwaGVyYWwgTWFwIFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIERNQTZfQ1VSUl9YX0NPVU5UCQkweEZGQzAwREIwCS8qIERNQSBDaGFubmVsIDYgQ3VycmVudCBYIENvdW50IFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIERNQTZfQ1VSUl9ZX0NPVU5UCQkweEZGQzAwREI4CS8qIERNQSBDaGFubmVsIDYgQ3VycmVudCBZIENvdW50IFJlZ2lzdGVyCQkJCSovCisKKyNkZWZpbmUgRE1BN19ORVhUX0RFU0NfUFRSCQkweEZGQzAwREMwCS8qIERNQSBDaGFubmVsIDcgTmV4dCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIJCSovCisjZGVmaW5lIERNQTdfU1RBUlRfQUREUgkJCTB4RkZDMDBEQzQJLyogRE1BIENoYW5uZWwgNyBTdGFydCBBZGRyZXNzIFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBETUE3X0NPTkZJRwkJCQkweEZGQzAwREM4CS8qIERNQSBDaGFubmVsIDcgQ29uZmlndXJhdGlvbiBSZWdpc3RlcgkJCQkJKi8KKyNkZWZpbmUgRE1BN19YX0NPVU5UCQkJMHhGRkMwMEREMAkvKiBETUEgQ2hhbm5lbCA3IFggQ291bnQgUmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBETUE3X1hfTU9ESUZZCQkJMHhGRkMwMERENAkvKiBETUEgQ2hhbm5lbCA3IFggTW9kaWZ5IFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgRE1BN19ZX0NPVU5UCQkJMHhGRkMwMEREOAkvKiBETUEgQ2hhbm5lbCA3IFkgQ291bnQgUmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBETUE3X1lfTU9ESUZZCQkJMHhGRkMwMEREQwkvKiBETUEgQ2hhbm5lbCA3IFkgTW9kaWZ5IFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgRE1BN19DVVJSX0RFU0NfUFRSCQkweEZGQzAwREUwCS8qIERNQSBDaGFubmVsIDcgQ3VycmVudCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIJKi8KKyNkZWZpbmUgRE1BN19DVVJSX0FERFIJCQkweEZGQzAwREU0CS8qIERNQSBDaGFubmVsIDcgQ3VycmVudCBBZGRyZXNzIFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIERNQTdfSVJRX1NUQVRVUwkJCTB4RkZDMDBERTgJLyogRE1BIENoYW5uZWwgNyBJbnRlcnJ1cHQvU3RhdHVzIFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIERNQTdfUEVSSVBIRVJBTF9NQVAJCTB4RkZDMDBERUMJLyogRE1BIENoYW5uZWwgNyBQZXJpcGhlcmFsIE1hcCBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBETUE3X0NVUlJfWF9DT1VOVAkJMHhGRkMwMERGMAkvKiBETUEgQ2hhbm5lbCA3IEN1cnJlbnQgWCBDb3VudCBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBETUE3X0NVUlJfWV9DT1VOVAkJMHhGRkMwMERGOAkvKiBETUEgQ2hhbm5lbCA3IEN1cnJlbnQgWSBDb3VudCBSZWdpc3RlcgkJCQkqLworCisjZGVmaW5lIERNQThfTkVYVF9ERVNDX1BUUgkJMHhGRkMwMEUwMAkvKiBETUEgQ2hhbm5lbCA4IE5leHQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyCQkqLworI2RlZmluZSBETUE4X1NUQVJUX0FERFIJCQkweEZGQzAwRTA0CS8qIERNQSBDaGFubmVsIDggU3RhcnQgQWRkcmVzcyBSZWdpc3RlcgkJCQkJKi8KKyNkZWZpbmUgRE1BOF9DT05GSUcJCQkJMHhGRkMwMEUwOAkvKiBETUEgQ2hhbm5lbCA4IENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIERNQThfWF9DT1VOVAkJCTB4RkZDMDBFMTAJLyogRE1BIENoYW5uZWwgOCBYIENvdW50IFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgRE1BOF9YX01PRElGWQkJCTB4RkZDMDBFMTQJLyogRE1BIENoYW5uZWwgOCBYIE1vZGlmeSBSZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIERNQThfWV9DT1VOVAkJCTB4RkZDMDBFMTgJLyogRE1BIENoYW5uZWwgOCBZIENvdW50IFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgRE1BOF9ZX01PRElGWQkJCTB4RkZDMDBFMUMJLyogRE1BIENoYW5uZWwgOCBZIE1vZGlmeSBSZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIERNQThfQ1VSUl9ERVNDX1BUUgkJMHhGRkMwMEUyMAkvKiBETUEgQ2hhbm5lbCA4IEN1cnJlbnQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyCSovCisjZGVmaW5lIERNQThfQ1VSUl9BRERSCQkJMHhGRkMwMEUyNAkvKiBETUEgQ2hhbm5lbCA4IEN1cnJlbnQgQWRkcmVzcyBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBETUE4X0lSUV9TVEFUVVMJCQkweEZGQzAwRTI4CS8qIERNQSBDaGFubmVsIDggSW50ZXJydXB0L1N0YXR1cyBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBETUE4X1BFUklQSEVSQUxfTUFQCQkweEZGQzAwRTJDCS8qIERNQSBDaGFubmVsIDggUGVyaXBoZXJhbCBNYXAgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgRE1BOF9DVVJSX1hfQ09VTlQJCTB4RkZDMDBFMzAJLyogRE1BIENoYW5uZWwgOCBDdXJyZW50IFggQ291bnQgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgRE1BOF9DVVJSX1lfQ09VTlQJCTB4RkZDMDBFMzgJLyogRE1BIENoYW5uZWwgOCBDdXJyZW50IFkgQ291bnQgUmVnaXN0ZXIJCQkJKi8KKworI2RlZmluZSBETUE5X05FWFRfREVTQ19QVFIJCTB4RkZDMDBFNDAJLyogRE1BIENoYW5uZWwgOSBOZXh0IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlcgkJKi8KKyNkZWZpbmUgRE1BOV9TVEFSVF9BRERSCQkJMHhGRkMwMEU0NAkvKiBETUEgQ2hhbm5lbCA5IFN0YXJ0IEFkZHJlc3MgUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIERNQTlfQ09ORklHCQkJCTB4RkZDMDBFNDgJLyogRE1BIENoYW5uZWwgOSBDb25maWd1cmF0aW9uIFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBETUE5X1hfQ09VTlQJCQkweEZGQzAwRTUwCS8qIERNQSBDaGFubmVsIDkgWCBDb3VudCBSZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIERNQTlfWF9NT0RJRlkJCQkweEZGQzAwRTU0CS8qIERNQSBDaGFubmVsIDkgWCBNb2RpZnkgUmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBETUE5X1lfQ09VTlQJCQkweEZGQzAwRTU4CS8qIERNQSBDaGFubmVsIDkgWSBDb3VudCBSZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIERNQTlfWV9NT0RJRlkJCQkweEZGQzAwRTVDCS8qIERNQSBDaGFubmVsIDkgWSBNb2RpZnkgUmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBETUE5X0NVUlJfREVTQ19QVFIJCTB4RkZDMDBFNjAJLyogRE1BIENoYW5uZWwgOSBDdXJyZW50IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlcgkqLworI2RlZmluZSBETUE5X0NVUlJfQUREUgkJCTB4RkZDMDBFNjQJLyogRE1BIENoYW5uZWwgOSBDdXJyZW50IEFkZHJlc3MgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgRE1BOV9JUlFfU1RBVFVTCQkJMHhGRkMwMEU2OAkvKiBETUEgQ2hhbm5lbCA5IEludGVycnVwdC9TdGF0dXMgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgRE1BOV9QRVJJUEhFUkFMX01BUAkJMHhGRkMwMEU2QwkvKiBETUEgQ2hhbm5lbCA5IFBlcmlwaGVyYWwgTWFwIFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIERNQTlfQ1VSUl9YX0NPVU5UCQkweEZGQzAwRTcwCS8qIERNQSBDaGFubmVsIDkgQ3VycmVudCBYIENvdW50IFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIERNQTlfQ1VSUl9ZX0NPVU5UCQkweEZGQzAwRTc4CS8qIERNQSBDaGFubmVsIDkgQ3VycmVudCBZIENvdW50IFJlZ2lzdGVyCQkJCSovCisKKyNkZWZpbmUgRE1BMTBfTkVYVF9ERVNDX1BUUgkJMHhGRkMwMEU4MAkvKiBETUEgQ2hhbm5lbCAxMCBOZXh0IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlcgkJKi8KKyNkZWZpbmUgRE1BMTBfU1RBUlRfQUREUgkJMHhGRkMwMEU4NAkvKiBETUEgQ2hhbm5lbCAxMCBTdGFydCBBZGRyZXNzIFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIERNQTEwX0NPTkZJRwkJCTB4RkZDMDBFODgJLyogRE1BIENoYW5uZWwgMTAgQ29uZmlndXJhdGlvbiBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBETUExMF9YX0NPVU5UCQkJMHhGRkMwMEU5MAkvKiBETUEgQ2hhbm5lbCAxMCBYIENvdW50IFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgRE1BMTBfWF9NT0RJRlkJCQkweEZGQzAwRTk0CS8qIERNQSBDaGFubmVsIDEwIFggTW9kaWZ5IFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgRE1BMTBfWV9DT1VOVAkJCTB4RkZDMDBFOTgJLyogRE1BIENoYW5uZWwgMTAgWSBDb3VudCBSZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIERNQTEwX1lfTU9ESUZZCQkJMHhGRkMwMEU5QwkvKiBETUEgQ2hhbm5lbCAxMCBZIE1vZGlmeSBSZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIERNQTEwX0NVUlJfREVTQ19QVFIJCTB4RkZDMDBFQTAJLyogRE1BIENoYW5uZWwgMTAgQ3VycmVudCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIJKi8KKyNkZWZpbmUgRE1BMTBfQ1VSUl9BRERSCQkJMHhGRkMwMEVBNAkvKiBETUEgQ2hhbm5lbCAxMCBDdXJyZW50IEFkZHJlc3MgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgRE1BMTBfSVJRX1NUQVRVUwkJMHhGRkMwMEVBOAkvKiBETUEgQ2hhbm5lbCAxMCBJbnRlcnJ1cHQvU3RhdHVzIFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIERNQTEwX1BFUklQSEVSQUxfTUFQCTB4RkZDMDBFQUMJLyogRE1BIENoYW5uZWwgMTAgUGVyaXBoZXJhbCBNYXAgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgRE1BMTBfQ1VSUl9YX0NPVU5UCQkweEZGQzAwRUIwCS8qIERNQSBDaGFubmVsIDEwIEN1cnJlbnQgWCBDb3VudCBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBETUExMF9DVVJSX1lfQ09VTlQJCTB4RkZDMDBFQjgJLyogRE1BIENoYW5uZWwgMTAgQ3VycmVudCBZIENvdW50IFJlZ2lzdGVyCQkJCSovCisKKyNkZWZpbmUgRE1BMTFfTkVYVF9ERVNDX1BUUgkJMHhGRkMwMEVDMAkvKiBETUEgQ2hhbm5lbCAxMSBOZXh0IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlcgkJKi8KKyNkZWZpbmUgRE1BMTFfU1RBUlRfQUREUgkJMHhGRkMwMEVDNAkvKiBETUEgQ2hhbm5lbCAxMSBTdGFydCBBZGRyZXNzIFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIERNQTExX0NPTkZJRwkJCTB4RkZDMDBFQzgJLyogRE1BIENoYW5uZWwgMTEgQ29uZmlndXJhdGlvbiBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBETUExMV9YX0NPVU5UCQkJMHhGRkMwMEVEMAkvKiBETUEgQ2hhbm5lbCAxMSBYIENvdW50IFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgRE1BMTFfWF9NT0RJRlkJCQkweEZGQzAwRUQ0CS8qIERNQSBDaGFubmVsIDExIFggTW9kaWZ5IFJlZ2lzdGVyCQkJCQkJKi8KKyNkZWZpbmUgRE1BMTFfWV9DT1VOVAkJCTB4RkZDMDBFRDgJLyogRE1BIENoYW5uZWwgMTEgWSBDb3VudCBSZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIERNQTExX1lfTU9ESUZZCQkJMHhGRkMwMEVEQwkvKiBETUEgQ2hhbm5lbCAxMSBZIE1vZGlmeSBSZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIERNQTExX0NVUlJfREVTQ19QVFIJCTB4RkZDMDBFRTAJLyogRE1BIENoYW5uZWwgMTEgQ3VycmVudCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIJKi8KKyNkZWZpbmUgRE1BMTFfQ1VSUl9BRERSCQkJMHhGRkMwMEVFNAkvKiBETUEgQ2hhbm5lbCAxMSBDdXJyZW50IEFkZHJlc3MgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgRE1BMTFfSVJRX1NUQVRVUwkJMHhGRkMwMEVFOAkvKiBETUEgQ2hhbm5lbCAxMSBJbnRlcnJ1cHQvU3RhdHVzIFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIERNQTExX1BFUklQSEVSQUxfTUFQCTB4RkZDMDBFRUMJLyogRE1BIENoYW5uZWwgMTEgUGVyaXBoZXJhbCBNYXAgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgRE1BMTFfQ1VSUl9YX0NPVU5UCQkweEZGQzAwRUYwCS8qIERNQSBDaGFubmVsIDExIEN1cnJlbnQgWCBDb3VudCBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBETUExMV9DVVJSX1lfQ09VTlQJCTB4RkZDMDBFRjgJLyogRE1BIENoYW5uZWwgMTEgQ3VycmVudCBZIENvdW50IFJlZ2lzdGVyCQkJCSovCisKKyNkZWZpbmUgTURNQV9EMF9ORVhUX0RFU0NfUFRSCTB4RkZDMDBGMDAJLyogTWVtRE1BIFN0cmVhbSAwIERlc3RpbmF0aW9uIE5leHQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyCQkqLworI2RlZmluZSBNRE1BX0QwX1NUQVJUX0FERFIJCTB4RkZDMDBGMDQJLyogTWVtRE1BIFN0cmVhbSAwIERlc3RpbmF0aW9uIFN0YXJ0IEFkZHJlc3MgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgTURNQV9EMF9DT05GSUcJCQkweEZGQzAwRjA4CS8qIE1lbURNQSBTdHJlYW0gMCBEZXN0aW5hdGlvbiBDb25maWd1cmF0aW9uIFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIE1ETUFfRDBfWF9DT1VOVAkJCTB4RkZDMDBGMTAJLyogTWVtRE1BIFN0cmVhbSAwIERlc3RpbmF0aW9uIFggQ291bnQgUmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBNRE1BX0QwX1hfTU9ESUZZCQkweEZGQzAwRjE0CS8qIE1lbURNQSBTdHJlYW0gMCBEZXN0aW5hdGlvbiBYIE1vZGlmeSBSZWdpc3RlcgkJCQkJKi8KKyNkZWZpbmUgTURNQV9EMF9ZX0NPVU5UCQkJMHhGRkMwMEYxOAkvKiBNZW1ETUEgU3RyZWFtIDAgRGVzdGluYXRpb24gWSBDb3VudCBSZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIE1ETUFfRDBfWV9NT0RJRlkJCTB4RkZDMDBGMUMJLyogTWVtRE1BIFN0cmVhbSAwIERlc3RpbmF0aW9uIFkgTW9kaWZ5IFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBNRE1BX0QwX0NVUlJfREVTQ19QVFIJMHhGRkMwMEYyMAkvKiBNZW1ETUEgU3RyZWFtIDAgRGVzdGluYXRpb24gQ3VycmVudCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIJKi8KKyNkZWZpbmUgTURNQV9EMF9DVVJSX0FERFIJCTB4RkZDMDBGMjQJLyogTWVtRE1BIFN0cmVhbSAwIERlc3RpbmF0aW9uIEN1cnJlbnQgQWRkcmVzcyBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBNRE1BX0QwX0lSUV9TVEFUVVMJCTB4RkZDMDBGMjgJLyogTWVtRE1BIFN0cmVhbSAwIERlc3RpbmF0aW9uIEludGVycnVwdC9TdGF0dXMgUmVnaXN0ZXIJCQkqLworI2RlZmluZSBNRE1BX0QwX1BFUklQSEVSQUxfTUFQCTB4RkZDMDBGMkMJLyogTWVtRE1BIFN0cmVhbSAwIERlc3RpbmF0aW9uIFBlcmlwaGVyYWwgTWFwIFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIE1ETUFfRDBfQ1VSUl9YX0NPVU5UCTB4RkZDMDBGMzAJLyogTWVtRE1BIFN0cmVhbSAwIERlc3RpbmF0aW9uIEN1cnJlbnQgWCBDb3VudCBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBNRE1BX0QwX0NVUlJfWV9DT1VOVAkweEZGQzAwRjM4CS8qIE1lbURNQSBTdHJlYW0gMCBEZXN0aW5hdGlvbiBDdXJyZW50IFkgQ291bnQgUmVnaXN0ZXIJCQkJKi8KKworI2RlZmluZSBNRE1BX1MwX05FWFRfREVTQ19QVFIJMHhGRkMwMEY0MAkvKiBNZW1ETUEgU3RyZWFtIDAgU291cmNlIE5leHQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyCQkJKi8KKyNkZWZpbmUgTURNQV9TMF9TVEFSVF9BRERSCQkweEZGQzAwRjQ0CS8qIE1lbURNQSBTdHJlYW0gMCBTb3VyY2UgU3RhcnQgQWRkcmVzcyBSZWdpc3RlcgkJCQkJKi8KKyNkZWZpbmUgTURNQV9TMF9DT05GSUcJCQkweEZGQzAwRjQ4CS8qIE1lbURNQSBTdHJlYW0gMCBTb3VyY2UgQ29uZmlndXJhdGlvbiBSZWdpc3RlcgkJCQkJKi8KKyNkZWZpbmUgTURNQV9TMF9YX0NPVU5UCQkJMHhGRkMwMEY1MAkvKiBNZW1ETUEgU3RyZWFtIDAgU291cmNlIFggQ291bnQgUmVnaXN0ZXIJCQkJCQkJKi8KKyNkZWZpbmUgTURNQV9TMF9YX01PRElGWQkJMHhGRkMwMEY1NAkvKiBNZW1ETUEgU3RyZWFtIDAgU291cmNlIFggTW9kaWZ5IFJlZ2lzdGVyCQkJCQkJCSovCisjZGVmaW5lIE1ETUFfUzBfWV9DT1VOVAkJCTB4RkZDMDBGNTgJLyogTWVtRE1BIFN0cmVhbSAwIFNvdXJjZSBZIENvdW50IFJlZ2lzdGVyCQkJCQkJCSovCisjZGVmaW5lIE1ETUFfUzBfWV9NT0RJRlkJCTB4RkZDMDBGNUMJLyogTWVtRE1BIFN0cmVhbSAwIFNvdXJjZSBZIE1vZGlmeSBSZWdpc3RlcgkJCQkJCQkqLworI2RlZmluZSBNRE1BX1MwX0NVUlJfREVTQ19QVFIJMHhGRkMwMEY2MAkvKiBNZW1ETUEgU3RyZWFtIDAgU291cmNlIEN1cnJlbnQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyCQkqLworI2RlZmluZSBNRE1BX1MwX0NVUlJfQUREUgkJMHhGRkMwMEY2NAkvKiBNZW1ETUEgU3RyZWFtIDAgU291cmNlIEN1cnJlbnQgQWRkcmVzcyBSZWdpc3RlcgkJCQkJKi8KKyNkZWZpbmUgTURNQV9TMF9JUlFfU1RBVFVTCQkweEZGQzAwRjY4CS8qIE1lbURNQSBTdHJlYW0gMCBTb3VyY2UgSW50ZXJydXB0L1N0YXR1cyBSZWdpc3RlcgkJCQkJKi8KKyNkZWZpbmUgTURNQV9TMF9QRVJJUEhFUkFMX01BUAkweEZGQzAwRjZDCS8qIE1lbURNQSBTdHJlYW0gMCBTb3VyY2UgUGVyaXBoZXJhbCBNYXAgUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIE1ETUFfUzBfQ1VSUl9YX0NPVU5UCTB4RkZDMDBGNzAJLyogTWVtRE1BIFN0cmVhbSAwIFNvdXJjZSBDdXJyZW50IFggQ291bnQgUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIE1ETUFfUzBfQ1VSUl9ZX0NPVU5UCTB4RkZDMDBGNzgJLyogTWVtRE1BIFN0cmVhbSAwIFNvdXJjZSBDdXJyZW50IFkgQ291bnQgUmVnaXN0ZXIJCQkJCSovCisKKyNkZWZpbmUgTURNQV9EMV9ORVhUX0RFU0NfUFRSCTB4RkZDMDBGODAJLyogTWVtRE1BIFN0cmVhbSAxIERlc3RpbmF0aW9uIE5leHQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyCQkqLworI2RlZmluZSBNRE1BX0QxX1NUQVJUX0FERFIJCTB4RkZDMDBGODQJLyogTWVtRE1BIFN0cmVhbSAxIERlc3RpbmF0aW9uIFN0YXJ0IEFkZHJlc3MgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgTURNQV9EMV9DT05GSUcJCQkweEZGQzAwRjg4CS8qIE1lbURNQSBTdHJlYW0gMSBEZXN0aW5hdGlvbiBDb25maWd1cmF0aW9uIFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIE1ETUFfRDFfWF9DT1VOVAkJCTB4RkZDMDBGOTAJLyogTWVtRE1BIFN0cmVhbSAxIERlc3RpbmF0aW9uIFggQ291bnQgUmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBNRE1BX0QxX1hfTU9ESUZZCQkweEZGQzAwRjk0CS8qIE1lbURNQSBTdHJlYW0gMSBEZXN0aW5hdGlvbiBYIE1vZGlmeSBSZWdpc3RlcgkJCQkJKi8KKyNkZWZpbmUgTURNQV9EMV9ZX0NPVU5UCQkJMHhGRkMwMEY5OAkvKiBNZW1ETUEgU3RyZWFtIDEgRGVzdGluYXRpb24gWSBDb3VudCBSZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIE1ETUFfRDFfWV9NT0RJRlkJCTB4RkZDMDBGOUMJLyogTWVtRE1BIFN0cmVhbSAxIERlc3RpbmF0aW9uIFkgTW9kaWZ5IFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBNRE1BX0QxX0NVUlJfREVTQ19QVFIJMHhGRkMwMEZBMAkvKiBNZW1ETUEgU3RyZWFtIDEgRGVzdGluYXRpb24gQ3VycmVudCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIJKi8KKyNkZWZpbmUgTURNQV9EMV9DVVJSX0FERFIJCTB4RkZDMDBGQTQJLyogTWVtRE1BIFN0cmVhbSAxIERlc3RpbmF0aW9uIEN1cnJlbnQgQWRkcmVzcyBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBNRE1BX0QxX0lSUV9TVEFUVVMJCTB4RkZDMDBGQTgJLyogTWVtRE1BIFN0cmVhbSAxIERlc3RpbmF0aW9uIEludGVycnVwdC9TdGF0dXMgUmVnaXN0ZXIJCQkqLworI2RlZmluZSBNRE1BX0QxX1BFUklQSEVSQUxfTUFQCTB4RkZDMDBGQUMJLyogTWVtRE1BIFN0cmVhbSAxIERlc3RpbmF0aW9uIFBlcmlwaGVyYWwgTWFwIFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIE1ETUFfRDFfQ1VSUl9YX0NPVU5UCTB4RkZDMDBGQjAJLyogTWVtRE1BIFN0cmVhbSAxIERlc3RpbmF0aW9uIEN1cnJlbnQgWCBDb3VudCBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBNRE1BX0QxX0NVUlJfWV9DT1VOVAkweEZGQzAwRkI4CS8qIE1lbURNQSBTdHJlYW0gMSBEZXN0aW5hdGlvbiBDdXJyZW50IFkgQ291bnQgUmVnaXN0ZXIJCQkJKi8KKworI2RlZmluZSBNRE1BX1MxX05FWFRfREVTQ19QVFIJMHhGRkMwMEZDMAkvKiBNZW1ETUEgU3RyZWFtIDEgU291cmNlIE5leHQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyCQkJKi8KKyNkZWZpbmUgTURNQV9TMV9TVEFSVF9BRERSCQkweEZGQzAwRkM0CS8qIE1lbURNQSBTdHJlYW0gMSBTb3VyY2UgU3RhcnQgQWRkcmVzcyBSZWdpc3RlcgkJCQkJKi8KKyNkZWZpbmUgTURNQV9TMV9DT05GSUcJCQkweEZGQzAwRkM4CS8qIE1lbURNQSBTdHJlYW0gMSBTb3VyY2UgQ29uZmlndXJhdGlvbiBSZWdpc3RlcgkJCQkJKi8KKyNkZWZpbmUgTURNQV9TMV9YX0NPVU5UCQkJMHhGRkMwMEZEMAkvKiBNZW1ETUEgU3RyZWFtIDEgU291cmNlIFggQ291bnQgUmVnaXN0ZXIJCQkJCQkJKi8KKyNkZWZpbmUgTURNQV9TMV9YX01PRElGWQkJMHhGRkMwMEZENAkvKiBNZW1ETUEgU3RyZWFtIDEgU291cmNlIFggTW9kaWZ5IFJlZ2lzdGVyCQkJCQkJCSovCisjZGVmaW5lIE1ETUFfUzFfWV9DT1VOVAkJCTB4RkZDMDBGRDgJLyogTWVtRE1BIFN0cmVhbSAxIFNvdXJjZSBZIENvdW50IFJlZ2lzdGVyCQkJCQkJCSovCisjZGVmaW5lIE1ETUFfUzFfWV9NT0RJRlkJCTB4RkZDMDBGREMJLyogTWVtRE1BIFN0cmVhbSAxIFNvdXJjZSBZIE1vZGlmeSBSZWdpc3RlcgkJCQkJCQkqLworI2RlZmluZSBNRE1BX1MxX0NVUlJfREVTQ19QVFIJMHhGRkMwMEZFMAkvKiBNZW1ETUEgU3RyZWFtIDEgU291cmNlIEN1cnJlbnQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyCQkqLworI2RlZmluZSBNRE1BX1MxX0NVUlJfQUREUgkJMHhGRkMwMEZFNAkvKiBNZW1ETUEgU3RyZWFtIDEgU291cmNlIEN1cnJlbnQgQWRkcmVzcyBSZWdpc3RlcgkJCQkJKi8KKyNkZWZpbmUgTURNQV9TMV9JUlFfU1RBVFVTCQkweEZGQzAwRkU4CS8qIE1lbURNQSBTdHJlYW0gMSBTb3VyY2UgSW50ZXJydXB0L1N0YXR1cyBSZWdpc3RlcgkJCQkJKi8KKyNkZWZpbmUgTURNQV9TMV9QRVJJUEhFUkFMX01BUAkweEZGQzAwRkVDCS8qIE1lbURNQSBTdHJlYW0gMSBTb3VyY2UgUGVyaXBoZXJhbCBNYXAgUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIE1ETUFfUzFfQ1VSUl9YX0NPVU5UCTB4RkZDMDBGRjAJLyogTWVtRE1BIFN0cmVhbSAxIFNvdXJjZSBDdXJyZW50IFggQ291bnQgUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIE1ETUFfUzFfQ1VSUl9ZX0NPVU5UCTB4RkZDMDBGRjgJLyogTWVtRE1BIFN0cmVhbSAxIFNvdXJjZSBDdXJyZW50IFkgQ291bnQgUmVnaXN0ZXIJCQkJCSovCisKKworLyogUGFyYWxsZWwgUGVyaXBoZXJhbCBJbnRlcmZhY2UgKDB4RkZDMDEwMDAgLSAweEZGQzAxMEZGKQkJCQkqLworI2RlZmluZSBQUElfQ09OVFJPTAkJCTB4RkZDMDEwMDAJLyogUFBJIENvbnRyb2wgUmVnaXN0ZXIJCQkqLworI2RlZmluZSBQUElfU1RBVFVTCQkJMHhGRkMwMTAwNAkvKiBQUEkgU3RhdHVzIFJlZ2lzdGVyCQkJKi8KKyNkZWZpbmUgUFBJX0NPVU5UCQkJMHhGRkMwMTAwOAkvKiBQUEkgVHJhbnNmZXIgQ291bnQgUmVnaXN0ZXIJKi8KKyNkZWZpbmUgUFBJX0RFTEFZCQkJMHhGRkMwMTAwQwkvKiBQUEkgRGVsYXkgQ291bnQgUmVnaXN0ZXIJCSovCisjZGVmaW5lIFBQSV9GUkFNRQkJCTB4RkZDMDEwMTAJLyogUFBJIEZyYW1lIExlbmd0aCBSZWdpc3RlcgkqLworCisKKy8qIFR3by1XaXJlIEludGVyZmFjZQkJKDB4RkZDMDE0MDAgLSAweEZGQzAxNEZGKQkJCQkJCQkJKi8KKyNkZWZpbmUgVFdJMF9SRUdCQVNFCQkJMHhGRkMwMTQwMAorI2RlZmluZSBUV0lfQ0xLRElWCQkJMHhGRkMwMTQwMAkvKiBTZXJpYWwgQ2xvY2sgRGl2aWRlciBSZWdpc3RlcgkJCSovCisjZGVmaW5lIFRXSV9DT05UUk9MCQkJMHhGRkMwMTQwNAkvKiBUV0kgQ29udHJvbCBSZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIFRXSV9TTEFWRV9DVEwJCTB4RkZDMDE0MDgJLyogU2xhdmUgTW9kZSBDb250cm9sIFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIFRXSV9TTEFWRV9TVEFUCQkweEZGQzAxNDBDCS8qIFNsYXZlIE1vZGUgU3RhdHVzIFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIFRXSV9TTEFWRV9BRERSCQkweEZGQzAxNDEwCS8qIFNsYXZlIE1vZGUgQWRkcmVzcyBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBUV0lfTUFTVEVSX0NUTAkJMHhGRkMwMTQxNAkvKiBNYXN0ZXIgTW9kZSBDb250cm9sIFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIFRXSV9NQVNURVJfU1RBVAkJMHhGRkMwMTQxOAkvKiBNYXN0ZXIgTW9kZSBTdGF0dXMgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgVFdJX01BU1RFUl9BRERSCQkweEZGQzAxNDFDCS8qIE1hc3RlciBNb2RlIEFkZHJlc3MgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgVFdJX0lOVF9TVEFUCQkweEZGQzAxNDIwCS8qIFRXSSBJbnRlcnJ1cHQgU3RhdHVzIFJlZ2lzdGVyCQkJKi8KKyNkZWZpbmUgVFdJX0lOVF9NQVNLCQkweEZGQzAxNDI0CS8qIFRXSSBNYXN0ZXIgSW50ZXJydXB0IE1hc2sgUmVnaXN0ZXIJCSovCisjZGVmaW5lIFRXSV9GSUZPX0NUTAkJMHhGRkMwMTQyOAkvKiBGSUZPIENvbnRyb2wgUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIFRXSV9GSUZPX1NUQVQJCTB4RkZDMDE0MkMJLyogRklGTyBTdGF0dXMgUmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBUV0lfWE1UX0RBVEE4CQkweEZGQzAxNDgwCS8qIEZJRk8gVHJhbnNtaXQgRGF0YSBTaW5nbGUgQnl0ZSBSZWdpc3RlcgkqLworI2RlZmluZSBUV0lfWE1UX0RBVEExNgkJMHhGRkMwMTQ4NAkvKiBGSUZPIFRyYW5zbWl0IERhdGEgRG91YmxlIEJ5dGUgUmVnaXN0ZXIJKi8KKyNkZWZpbmUgVFdJX1JDVl9EQVRBOAkJMHhGRkMwMTQ4OAkvKiBGSUZPIFJlY2VpdmUgRGF0YSBTaW5nbGUgQnl0ZSBSZWdpc3RlcgkqLworI2RlZmluZSBUV0lfUkNWX0RBVEExNgkJMHhGRkMwMTQ4QwkvKiBGSUZPIFJlY2VpdmUgRGF0YSBEb3VibGUgQnl0ZSBSZWdpc3RlcgkqLworCisKKy8qIEdlbmVyYWwgUHVycG9zZSBJL08gUG9ydCBHICgweEZGQzAxNTAwIC0gMHhGRkMwMTVGRikJCQkJCQkJCQkJCQkqLworI2RlZmluZSBQT1JUR0lPCQkJCQkweEZGQzAxNTAwCS8qIFBvcnQgRyBJL08gUGluIFN0YXRlIFNwZWNpZnkgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgUE9SVEdJT19DTEVBUgkJCTB4RkZDMDE1MDQJLyogUG9ydCBHIEkvTyBQZXJpcGhlcmFsIEludGVycnVwdCBDbGVhciBSZWdpc3RlcgkJKi8KKyNkZWZpbmUgUE9SVEdJT19TRVQJCQkJMHhGRkMwMTUwOAkvKiBQb3J0IEcgSS9PIFBlcmlwaGVyYWwgSW50ZXJydXB0IFNldCBSZWdpc3RlcgkJCSovCisjZGVmaW5lIFBPUlRHSU9fVE9HR0xFCQkJMHhGRkMwMTUwQwkvKiBQb3J0IEcgSS9PIFBpbiBTdGF0ZSBUb2dnbGUgUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIFBPUlRHSU9fTUFTS0EJCQkweEZGQzAxNTEwCS8qIFBvcnQgRyBJL08gTWFzayBTdGF0ZSBTcGVjaWZ5IEludGVycnVwdCBBIFJlZ2lzdGVyCSovCisjZGVmaW5lIFBPUlRHSU9fTUFTS0FfQ0xFQVIJCTB4RkZDMDE1MTQJLyogUG9ydCBHIEkvTyBNYXNrIERpc2FibGUgSW50ZXJydXB0IEEgUmVnaXN0ZXIJCQkqLworI2RlZmluZSBQT1JUR0lPX01BU0tBX1NFVAkJMHhGRkMwMTUxOAkvKiBQb3J0IEcgSS9PIE1hc2sgRW5hYmxlIEludGVycnVwdCBBIFJlZ2lzdGVyCQkJKi8KKyNkZWZpbmUgUE9SVEdJT19NQVNLQV9UT0dHTEUJMHhGRkMwMTUxQwkvKiBQb3J0IEcgSS9PIE1hc2sgVG9nZ2xlIEVuYWJsZSBJbnRlcnJ1cHQgQSBSZWdpc3RlcgkqLworI2RlZmluZSBQT1JUR0lPX01BU0tCCQkJMHhGRkMwMTUyMAkvKiBQb3J0IEcgSS9PIE1hc2sgU3RhdGUgU3BlY2lmeSBJbnRlcnJ1cHQgQiBSZWdpc3RlcgkqLworI2RlZmluZSBQT1JUR0lPX01BU0tCX0NMRUFSCQkweEZGQzAxNTI0CS8qIFBvcnQgRyBJL08gTWFzayBEaXNhYmxlIEludGVycnVwdCBCIFJlZ2lzdGVyCQkJKi8KKyNkZWZpbmUgUE9SVEdJT19NQVNLQl9TRVQJCTB4RkZDMDE1MjgJLyogUG9ydCBHIEkvTyBNYXNrIEVuYWJsZSBJbnRlcnJ1cHQgQiBSZWdpc3RlcgkJCSovCisjZGVmaW5lIFBPUlRHSU9fTUFTS0JfVE9HR0xFCTB4RkZDMDE1MkMJLyogUG9ydCBHIEkvTyBNYXNrIFRvZ2dsZSBFbmFibGUgSW50ZXJydXB0IEIgUmVnaXN0ZXIJKi8KKyNkZWZpbmUgUE9SVEdJT19ESVIJCQkJMHhGRkMwMTUzMAkvKiBQb3J0IEcgSS9PIERpcmVjdGlvbiBSZWdpc3RlcgkJCQkJCSovCisjZGVmaW5lIFBPUlRHSU9fUE9MQVIJCQkweEZGQzAxNTM0CS8qIFBvcnQgRyBJL08gU291cmNlIFBvbGFyaXR5IFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBQT1JUR0lPX0VER0UJCQkweEZGQzAxNTM4CS8qIFBvcnQgRyBJL08gU291cmNlIFNlbnNpdGl2aXR5IFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIFBPUlRHSU9fQk9USAkJCTB4RkZDMDE1M0MJLyogUG9ydCBHIEkvTyBTZXQgb24gQk9USCBFZGdlcyBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBQT1JUR0lPX0lORU4JCQkweEZGQzAxNTQwCS8qIFBvcnQgRyBJL08gSW5wdXQgRW5hYmxlIFJlZ2lzdGVyCQkJCQkJKi8KKworCisvKiBHZW5lcmFsIFB1cnBvc2UgSS9PIFBvcnQgSCAoMHhGRkMwMTcwMCAtIDB4RkZDMDE3RkYpCQkJCQkJCQkJCQkJKi8KKyNkZWZpbmUgUE9SVEhJTwkJCQkJMHhGRkMwMTcwMAkvKiBQb3J0IEggSS9PIFBpbiBTdGF0ZSBTcGVjaWZ5IFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIFBPUlRISU9fQ0xFQVIJCQkweEZGQzAxNzA0CS8qIFBvcnQgSCBJL08gUGVyaXBoZXJhbCBJbnRlcnJ1cHQgQ2xlYXIgUmVnaXN0ZXIJCSovCisjZGVmaW5lIFBPUlRISU9fU0VUCQkJCTB4RkZDMDE3MDgJLyogUG9ydCBIIEkvTyBQZXJpcGhlcmFsIEludGVycnVwdCBTZXQgUmVnaXN0ZXIJCQkqLworI2RlZmluZSBQT1JUSElPX1RPR0dMRQkJCTB4RkZDMDE3MEMJLyogUG9ydCBIIEkvTyBQaW4gU3RhdGUgVG9nZ2xlIFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBQT1JUSElPX01BU0tBCQkJMHhGRkMwMTcxMAkvKiBQb3J0IEggSS9PIE1hc2sgU3RhdGUgU3BlY2lmeSBJbnRlcnJ1cHQgQSBSZWdpc3RlcgkqLworI2RlZmluZSBQT1JUSElPX01BU0tBX0NMRUFSCQkweEZGQzAxNzE0CS8qIFBvcnQgSCBJL08gTWFzayBEaXNhYmxlIEludGVycnVwdCBBIFJlZ2lzdGVyCQkJKi8KKyNkZWZpbmUgUE9SVEhJT19NQVNLQV9TRVQJCTB4RkZDMDE3MTgJLyogUG9ydCBIIEkvTyBNYXNrIEVuYWJsZSBJbnRlcnJ1cHQgQSBSZWdpc3RlcgkJCSovCisjZGVmaW5lIFBPUlRISU9fTUFTS0FfVE9HR0xFCTB4RkZDMDE3MUMJLyogUG9ydCBIIEkvTyBNYXNrIFRvZ2dsZSBFbmFibGUgSW50ZXJydXB0IEEgUmVnaXN0ZXIJKi8KKyNkZWZpbmUgUE9SVEhJT19NQVNLQgkJCTB4RkZDMDE3MjAJLyogUG9ydCBIIEkvTyBNYXNrIFN0YXRlIFNwZWNpZnkgSW50ZXJydXB0IEIgUmVnaXN0ZXIJKi8KKyNkZWZpbmUgUE9SVEhJT19NQVNLQl9DTEVBUgkJMHhGRkMwMTcyNAkvKiBQb3J0IEggSS9PIE1hc2sgRGlzYWJsZSBJbnRlcnJ1cHQgQiBSZWdpc3RlcgkJCSovCisjZGVmaW5lIFBPUlRISU9fTUFTS0JfU0VUCQkweEZGQzAxNzI4CS8qIFBvcnQgSCBJL08gTWFzayBFbmFibGUgSW50ZXJydXB0IEIgUmVnaXN0ZXIJCQkqLworI2RlZmluZSBQT1JUSElPX01BU0tCX1RPR0dMRQkweEZGQzAxNzJDCS8qIFBvcnQgSCBJL08gTWFzayBUb2dnbGUgRW5hYmxlIEludGVycnVwdCBCIFJlZ2lzdGVyCSovCisjZGVmaW5lIFBPUlRISU9fRElSCQkJCTB4RkZDMDE3MzAJLyogUG9ydCBIIEkvTyBEaXJlY3Rpb24gUmVnaXN0ZXIJCQkJCQkqLworI2RlZmluZSBQT1JUSElPX1BPTEFSCQkJMHhGRkMwMTczNAkvKiBQb3J0IEggSS9PIFNvdXJjZSBQb2xhcml0eSBSZWdpc3RlcgkJCQkJKi8KKyNkZWZpbmUgUE9SVEhJT19FREdFCQkJMHhGRkMwMTczOAkvKiBQb3J0IEggSS9PIFNvdXJjZSBTZW5zaXRpdml0eSBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBQT1JUSElPX0JPVEgJCQkweEZGQzAxNzNDCS8qIFBvcnQgSCBJL08gU2V0IG9uIEJPVEggRWRnZXMgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgUE9SVEhJT19JTkVOCQkJMHhGRkMwMTc0MAkvKiBQb3J0IEggSS9PIElucHV0IEVuYWJsZSBSZWdpc3RlcgkJCQkJCSovCisKKworLyogVUFSVDEgQ29udHJvbGxlcgkJKDB4RkZDMDIwMDAgLSAweEZGQzAyMEZGKQkJCQkJCQkJKi8KKyNkZWZpbmUgVUFSVDFfVEhSCQkJMHhGRkMwMjAwMAkvKiBUcmFuc21pdCBIb2xkaW5nIHJlZ2lzdGVyCQkJKi8KKyNkZWZpbmUgVUFSVDFfUkJSCQkJMHhGRkMwMjAwMAkvKiBSZWNlaXZlIEJ1ZmZlciByZWdpc3RlcgkJCQkqLworI2RlZmluZSBVQVJUMV9ETEwJCQkweEZGQzAyMDAwCS8qIERpdmlzb3IgTGF0Y2ggKExvdy1CeXRlKQkJCQkqLworI2RlZmluZSBVQVJUMV9JRVIJCQkweEZGQzAyMDA0CS8qIEludGVycnVwdCBFbmFibGUgUmVnaXN0ZXIJCQkqLworI2RlZmluZSBVQVJUMV9ETEgJCQkweEZGQzAyMDA0CS8qIERpdmlzb3IgTGF0Y2ggKEhpZ2gtQnl0ZSkJCQkqLworI2RlZmluZSBVQVJUMV9JSVIJCQkweEZGQzAyMDA4CS8qIEludGVycnVwdCBJZGVudGlmaWNhdGlvbiBSZWdpc3RlcgkqLworI2RlZmluZSBVQVJUMV9MQ1IJCQkweEZGQzAyMDBDCS8qIExpbmUgQ29udHJvbCBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBVQVJUMV9NQ1IJCQkweEZGQzAyMDEwCS8qIE1vZGVtIENvbnRyb2wgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgVUFSVDFfTFNSCQkJMHhGRkMwMjAxNAkvKiBMaW5lIFN0YXR1cyBSZWdpc3RlcgkJCQkJKi8KKyNkZWZpbmUgVUFSVDFfTVNSCQkJMHhGRkMwMjAxOAkvKiBNb2RlbSBTdGF0dXMgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgVUFSVDFfU0NSCQkJMHhGRkMwMjAxQwkvKiBTQ1IgU2NyYXRjaCBSZWdpc3RlcgkJCQkJKi8KKyNkZWZpbmUgVUFSVDFfR0NUTAkJCTB4RkZDMDIwMjQJLyogR2xvYmFsIENvbnRyb2wgUmVnaXN0ZXIJCQkJKi8KKworCisvKiBQaW4gQ29udHJvbCBSZWdpc3RlcnMJKDB4RkZDMDMyMDAgLSAweEZGQzAzMkZGKQkJCQkJCQkJCQkJKi8KKyNkZWZpbmUgUE9SVEZfRkVSCQkJMHhGRkMwMzIwMAkvKiBQb3J0IEYgRnVuY3Rpb24gRW5hYmxlIFJlZ2lzdGVyIChBbHRlcm5hdGUvRmxhZyopCSovCisjZGVmaW5lIFBPUlRHX0ZFUgkJCTB4RkZDMDMyMDQJLyogUG9ydCBHIEZ1bmN0aW9uIEVuYWJsZSBSZWdpc3RlciAoQWx0ZXJuYXRlL0ZsYWcqKQkqLworI2RlZmluZSBQT1JUSF9GRVIJCQkweEZGQzAzMjA4CS8qIFBvcnQgSCBGdW5jdGlvbiBFbmFibGUgUmVnaXN0ZXIgKEFsdGVybmF0ZS9GbGFnKikJKi8KKyNkZWZpbmUgQkZJTl9QT1JUX01VWAkJCTB4RkZDMDMyMEMJLyogUG9ydCBNdWx0aXBsZXhlciBDb250cm9sIFJlZ2lzdGVyCQkJCQkqLworCisKKy8qIEhhbmRzaGFrZSBNRE1BIFJlZ2lzdGVycwkoMHhGRkMwMzMwMCAtIDB4RkZDMDMzRkYpCQkJCQkJCQkJCSovCisjZGVmaW5lIEhNRE1BMF9DT05UUk9MCQkweEZGQzAzMzAwCS8qIEhhbmRzaGFrZSBNRE1BMCBDb250cm9sIFJlZ2lzdGVyCQkJCQkqLworI2RlZmluZSBITURNQTBfRUNJTklUCQkweEZGQzAzMzA0CS8qIEhNRE1BMCBJbml0aWFsIEVkZ2UgQ291bnQgUmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgSE1ETUEwX0JDSU5JVAkJMHhGRkMwMzMwOAkvKiBITURNQTAgSW5pdGlhbCBCbG9jayBDb3VudCBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBITURNQTBfRUNVUkdFTlQJCTB4RkZDMDMzMEMJLyogSE1ETUEwIFVyZ2VudCBFZGdlIENvdW50IFRocmVzaGhvbGQgUmVnaXN0ZXIJCSovCisjZGVmaW5lIEhNRE1BMF9FQ09WRVJGTE9XCTB4RkZDMDMzMTAJLyogSE1ETUEwIEVkZ2UgQ291bnQgT3ZlcmZsb3cgSW50ZXJydXB0IFJlZ2lzdGVyCSovCisjZGVmaW5lIEhNRE1BMF9FQ09VTlQJCTB4RkZDMDMzMTQJLyogSE1ETUEwIEN1cnJlbnQgRWRnZSBDb3VudCBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBITURNQTBfQkNPVU5UCQkweEZGQzAzMzE4CS8qIEhNRE1BMCBDdXJyZW50IEJsb2NrIENvdW50IFJlZ2lzdGVyCQkJCSovCisKKyNkZWZpbmUgSE1ETUExX0NPTlRST0wJCTB4RkZDMDMzNDAJLyogSGFuZHNoYWtlIE1ETUExIENvbnRyb2wgUmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIEhNRE1BMV9FQ0lOSVQJCTB4RkZDMDMzNDQJLyogSE1ETUExIEluaXRpYWwgRWRnZSBDb3VudCBSZWdpc3RlcgkJCQkqLworI2RlZmluZSBITURNQTFfQkNJTklUCQkweEZGQzAzMzQ4CS8qIEhNRE1BMSBJbml0aWFsIEJsb2NrIENvdW50IFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIEhNRE1BMV9FQ1VSR0VOVAkJMHhGRkMwMzM0QwkvKiBITURNQTEgVXJnZW50IEVkZ2UgQ291bnQgVGhyZXNoaG9sZCBSZWdpc3RlcgkJKi8KKyNkZWZpbmUgSE1ETUExX0VDT1ZFUkZMT1cJMHhGRkMwMzM1MAkvKiBITURNQTEgRWRnZSBDb3VudCBPdmVyZmxvdyBJbnRlcnJ1cHQgUmVnaXN0ZXIJKi8KKyNkZWZpbmUgSE1ETUExX0VDT1VOVAkJMHhGRkMwMzM1NAkvKiBITURNQTEgQ3VycmVudCBFZGdlIENvdW50IFJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIEhNRE1BMV9CQ09VTlQJCTB4RkZDMDMzNTgJLyogSE1ETUExIEN1cnJlbnQgQmxvY2sgQ291bnQgUmVnaXN0ZXIJCQkJKi8KKworCisvKiBHUElPIFBJTiBtdXggKDB4RkZDMDMyMTAgLSBPeEZGQzAzMjg4KSAqLworI2RlZmluZSBQT1JURl9NVVggICAgICAgICAgICAgICAweEZGQzAzMjEwICAgICAgLyogUG9ydCBGIG11eCBjb250cm9sICovCisjZGVmaW5lIFBPUlRHX01VWCAgICAgICAgICAgICAgIDB4RkZDMDMyMTQgICAgICAvKiBQb3J0IEcgbXV4IGNvbnRyb2wgKi8KKyNkZWZpbmUgUE9SVEhfTVVYICAgICAgICAgICAgICAgMHhGRkMwMzIxOCAgICAgIC8qIFBvcnQgSCBtdXggY29udHJvbCAqLworI2RlZmluZSBQT1JURl9EUklWRSAgICAgICAgICAgICAweEZGQzAzMjIwICAgICAgLyogUG9ydCBGIGRyaXZlIHN0cmVuZ3RoIGNvbnRyb2wgKi8KKyNkZWZpbmUgUE9SVEdfRFJJVkUgICAgICAgICAgICAgMHhGRkMwMzIyNCAgICAgIC8qIFBvcnQgRyBkcml2ZSBzdHJlbmd0aCBjb250cm9sICovCisjZGVmaW5lIFBPUlRIX0RSSVZFICAgICAgICAgICAgIDB4RkZDMDMyMjggICAgICAvKiBQb3J0IEggZHJpdmUgc3RyZW5ndGggY29udHJvbCAqLworI2RlZmluZSBQT1JURl9TTEVXICAgICAgICAgICAgICAweEZGQzAzMjMwICAgICAgLyogUG9ydCBGIHNsZXcgY29udHJvbCAqLworI2RlZmluZSBQT1JUR19TTEVXICAgICAgICAgICAgICAweEZGQzAzMjM0ICAgICAgLyogUG9ydCBHIHNsZXcgY29udHJvbCAqLworI2RlZmluZSBQT1JUSF9TTEVXICAgICAgICAgICAgICAweEZGQzAzMjM4ICAgICAgLyogUG9ydCBIIHNsZXcgY29udHJvbCAqLworI2RlZmluZSBQT1JURl9IWVNURVJJU0lTICAgICAgICAweEZGQzAzMjQwICAgICAgLyogUG9ydCBGIFNjaG1pdHQgdHJpZ2dlciBjb250cm9sICovCisjZGVmaW5lIFBPUlRHX0hZU1RFUklTSVMgICAgICAgIDB4RkZDMDMyNDQgICAgICAvKiBQb3J0IEcgU2NobWl0dCB0cmlnZ2VyIGNvbnRyb2wgKi8KKyNkZWZpbmUgUE9SVEhfSFlTVEVSSVNJUyAgICAgICAgMHhGRkMwMzI0OCAgICAgIC8qIFBvcnQgSCBTY2htaXR0IHRyaWdnZXIgY29udHJvbCAqLworI2RlZmluZSBNSVNDUE9SVF9EUklWRSAgICAgICAgICAweEZGQzAzMjgwICAgICAgLyogTWlzYyBQb3J0IGRyaXZlIHN0cmVuZ3RoIGNvbnRyb2wgKi8KKyNkZWZpbmUgTUlTQ1BPUlRfU0xFVyAgICAgICAgICAgMHhGRkMwMzI4NCAgICAgIC8qIE1pc2MgUG9ydCBzbGV3IGNvbnRyb2wgKi8KKyNkZWZpbmUgTUlTQ1BPUlRfSFlTVEVSSVNJUyAgICAgMHhGRkMwMzI4OCAgICAgIC8qIE1pc2MgUG9ydCBTY2htaXR0IHRyaWdnZXIgY29udHJvbCAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiogU3lzdGVtIE1NUiBSZWdpc3RlciBCaXRzIEFuZCBNYWNyb3MKKyoqCisqKiBEaXNjbGFpbWVyOglBbGwgbWFjcm9zIGFyZSBpbnRlbmRlZCB0byBtYWtlIEMgYW5kIEFzc2VtYmx5IGNvZGUgbW9yZSByZWFkYWJsZS4KKyoqCQkJCVVzZSB0aGVzZSBtYWNyb3MgY2FyZWZ1bGx5LCBhcyBhbnkgdGhhdCBkbyBsZWZ0IHNoaWZ0cyBmb3IgZmllbGQKKyoqCQkJCWRlcG9zaXRpbmcgd2lsbCByZXN1bHQgaW4gdGhlIGxvd2VyIG9yZGVyIGJpdHMgYmVpbmcgZGVzdHJveWVkLiAgQW55CisqKgkJCQltYWNybyB0aGF0IHNoaWZ0cyBsZWZ0IHRvIHByb3Blcmx5IHBvc2l0aW9uIHRoZSBiaXQtZmllbGQgc2hvdWxkIGJlCisqKgkJCQl1c2VkIGFzIHBhcnQgb2YgYW4gT1IgdG8gaW5pdGlhbGl6ZSBhIHJlZ2lzdGVyIGFuZCBOT1QgYXMgYSBkeW5hbWljCisqKgkJCQltb2RpZmllciBVTkxFU1MgdGhlIGxvd2VyIG9yZGVyIGJpdHMgYXJlIHNhdmVkIGFuZCBPUmVkIGJhY2sgaW4gd2hlbgorKioJCQkJdGhlIG1hY3JvIGlzIHVzZWQuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyoqICoqKioqKioqKioqKioqKioqKioqKiBQTEwgQU5EIFJFU0VUIE1BU0tTICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBQTExfQ1RMIE1hc2tzCQkJCQkJCQkJCQkJCQkJCQkqLworI2RlZmluZSBERgkJCQkweDAwMDEJLyogMDogUExMID0gQ0xLSU4sIDE6IFBMTCA9IENMS0lOLzIJCQkJCSovCisjZGVmaW5lIFBMTF9PRkYJCQkweDAwMDIJLyogUExMIE5vdCBQb3dlcmVkCQkJCQkJCQkJKi8KKyNkZWZpbmUgU1RPUENLCQkJMHgwMDA4CS8qIENvcmUgQ2xvY2sgT2ZmCQkJCQkJCQkJKi8KKyNkZWZpbmUgUERXTgkJCTB4MDAyMAkvKiBFbnRlciBEZWVwIFNsZWVwIE1vZGUJCQkJCQkJKi8KKyNkZWZpbmUJSU5fREVMQVkJCTB4MDA0MAkvKiBBZGQgMjAwcHMgRGVsYXkgVG8gRUJJVSBJbnB1dCBMYXRjaGVzCQkJKi8KKyNkZWZpbmUJT1VUX0RFTEFZCQkweDAwODAJLyogQWRkIDIwMHBzIERlbGF5IFRvIEVCSVUgT3V0cHV0IFNpZ25hbHMJCQkqLworI2RlZmluZSBCWVBBU1MJCQkweDAxMDAJLyogQnlwYXNzIHRoZSBQTEwJCQkJCQkJCQkqLworI2RlZmluZQlNU0VMCQkJMHg3RTAwCS8qIE11bHRpcGxpZXIgU2VsZWN0IEZvciBDQ0xLL1ZDTyBGYWN0b3JzCQkJKi8KKy8qIFBMTF9DVEwgTWFjcm9zIChPbmx5IFVzZSBXaXRoIExvZ2ljIE9SIFdoaWxlIFNldHRpbmcgTG93ZXIgT3JkZXIgQml0cykJCQkqLworI2RlZmluZQlTRVRfTVNFTCh4KQkJKCgoeCkmMHgzRikgPDwgMHg5KQkvKiBTZXQgTVNFTCA9IDAtNjMgLS0+IFZDTyA9IENMS0lOKk1TRUwJCSovCisKKy8qIFBMTF9ESVYgTWFza3MJCQkJCQkJCQkJCQkJCSovCisjZGVmaW5lIFNTRUwJCQkweDAwMEYJLyogU3lzdGVtIFNlbGVjdAkJCQkJCSovCisjZGVmaW5lCUNTRUwJCQkweDAwMzAJLyogQ29yZSBTZWxlY3QJCQkJCQkJKi8KKyNkZWZpbmUgQ1NFTF9ESVYxCQkweDAwMDAJLyogCQlDQ0xLID0gVkNPIC8gMQkJCQkJKi8KKyNkZWZpbmUgQ1NFTF9ESVYyCQkweDAwMTAJLyogCQlDQ0xLID0gVkNPIC8gMgkJCQkJKi8KKyNkZWZpbmUJQ1NFTF9ESVY0CQkweDAwMjAJLyogCQlDQ0xLID0gVkNPIC8gNAkJCQkJKi8KKyNkZWZpbmUJQ1NFTF9ESVY4CQkweDAwMzAJLyogCQlDQ0xLID0gVkNPIC8gOAkJCQkJKi8KKy8qIFBMTF9ESVYgTWFjcm9zCQkJCQkJCQkJCQkJCQkqLworI2RlZmluZSBTRVRfU1NFTCh4KQkJKCh4KSYweEYpCQkvKiBTZXQgU1NFTCA9IDAtMTUgLS0+IFNDTEsgPSBWQ08vU1NFTAkqLworCisvKiBWUl9DVEwgTWFza3MJKi8KKyNkZWZpbmUJRlJFUQkJCTB4MzAwMAkvKiBTd2l0Y2hpbmcgT3NjaWxsYXRvciBGcmVxdWVuY3kgRm9yIFJlZ3VsYXRvcgkqLworI2RlZmluZQlISUJFUk5BVEUJCTB4MDAwMAkvKiAJCVBvd2VyZG93bi9CeXBhc3MgT24tQm9hcmQgUmVndWxhdGlvbgkqLworCisjZGVmaW5lCVZMRVYJCQkweDAwRjAJLyogSW50ZXJuYWwgVm9sdGFnZSBMZXZlbAkJCQkJKi8KKyNkZWZpbmUJVkxFVl8wODUgCQkweDAwNjAJLyogCQlWTEVWID0gMC44NSBWICgtNSUgLSArMTAlIEFjY3VyYWN5KQkqLworI2RlZmluZQlWTEVWXzA5MAkJMHgwMDcwCS8qIAkJVkxFViA9IDAuOTAgViAoLTUlIC0gKzEwJSBBY2N1cmFjeSkJKi8KKyNkZWZpbmUJVkxFVl8wOTUJCTB4MDA4MAkvKiAJCVZMRVYgPSAwLjk1IFYgKC01JSAtICsxMCUgQWNjdXJhY3kpCSovCisjZGVmaW5lCVZMRVZfMTAwCQkweDAwOTAJLyogCQlWTEVWID0gMS4wMCBWICgtNSUgLSArMTAlIEFjY3VyYWN5KQkqLworI2RlZmluZQlWTEVWXzEwNQkJMHgwMEEwCS8qIAkJVkxFViA9IDEuMDUgViAoLTUlIC0gKzEwJSBBY2N1cmFjeSkJKi8KKyNkZWZpbmUJVkxFVl8xMTAJCTB4MDBCMAkvKiAJCVZMRVYgPSAxLjEwIFYgKC01JSAtICsxMCUgQWNjdXJhY3kpCSovCisjZGVmaW5lCVZMRVZfMTE1CQkweDAwQzAJLyogCQlWTEVWID0gMS4xNSBWICgtNSUgLSArMTAlIEFjY3VyYWN5KQkqLworI2RlZmluZQlWTEVWXzEyMAkJMHgwMEQwCS8qIAkJVkxFViA9IDEuMjAgViAoLTUlIC0gKzEwJSBBY2N1cmFjeSkJKi8KKyNkZWZpbmUJVkxFVl8xMjUJCTB4MDBFMAkvKiAJCVZMRVYgPSAxLjI1IFYgKC01JSAtICsxMCUgQWNjdXJhY3kpCSovCisjZGVmaW5lCVZMRVZfMTMwCQkweDAwRjAJLyogCQlWTEVWID0gMS4zMCBWICgtNSUgLSArMTAlIEFjY3VyYWN5KQkqLworCisjZGVmaW5lCVdBS0UJCQkweDAxMDAJLyogRW5hYmxlIFJUQy9SZXNldCBXYWtldXAgRnJvbSBIaWJlcm5hdGUJKi8KKyNkZWZpbmUJVVNCV0UJCQkweDAyMDAJLyogRW5hYmxlIFVTQiBXYWtldXAgRnJvbSBIaWJlcm5hdGUJCQkqLworI2RlZmluZQlQSFlXRQkJCTB4MDQwMAkvKiBFbmFibGUgUEhZIFdha2V1cCBGcm9tIEhpYmVybmF0ZQkJCSovCisjZGVmaW5lCUNMS0JVRk9FCQkweDQwMDAJLyogQ0xLSU4gQnVmZmVyIE91dHB1dCBFbmFibGUgKi8KKyNkZWZpbmUJUEhZQ0xLT0UJCUNMS0JVRk9FCS8qIEFsdGVybmF0aXZlIGxlZ2FjeSBuYW1lIGZvciB0aGUgYWJvdmUgKi8KKyNkZWZpbmUJU0NLRUxPVwkJMHg4MDAwCS8qIEVuYWJsZSBEcml2ZSBDS0UgTG93IER1cmluZyBSZXNldAkJKi8KKworLyogUExMX1NUQVQgTWFza3MJCQkJCQkJCQkJCQkJCQkJCSovCisjZGVmaW5lIEFDVElWRV9QTExFTkFCTEVECTB4MDAwMQkvKiBQcm9jZXNzb3IgSW4gQWN0aXZlIE1vZGUgV2l0aCBQTEwgRW5hYmxlZAkqLworI2RlZmluZQlGVUxMX09OCQkJCTB4MDAwMgkvKiBQcm9jZXNzb3IgSW4gRnVsbCBPbiBNb2RlCQkJCQkqLworI2RlZmluZSBBQ1RJVkVfUExMRElTQUJMRUQJMHgwMDA0CS8qIFByb2Nlc3NvciBJbiBBY3RpdmUgTW9kZSBXaXRoIFBMTCBEaXNhYmxlZAkqLworI2RlZmluZQlQTExfTE9DS0VECQkJMHgwMDIwCS8qIFBMTF9MT0NLQ05UIEhhcyBCZWVuIFJlYWNoZWQJCQkJCSovCisKKy8qIENISVBJRCBNYXNrcyAqLworI2RlZmluZSBDSElQSURfVkVSU0lPTiAgICAgICAgIDB4RjAwMDAwMDAKKyNkZWZpbmUgQ0hJUElEX0ZBTUlMWSAgICAgICAgICAweDBGRkZGMDAwCisjZGVmaW5lIENISVBJRF9NQU5VRkFDVFVSRSAgICAgMHgwMDAwMEZGRQorCisvKiBTV1JTVCBNYXNrcwkJCQkJCQkJCQkJCQkJCQkJCSovCisjZGVmaW5lIFNZU1RFTV9SRVNFVAkJMHgwMDA3CS8qIEluaXRpYXRlcyBBIFN5c3RlbSBTb2Z0d2FyZSBSZXNldAkJCSovCisjZGVmaW5lCURPVUJMRV9GQVVMVAkJMHgwMDA4CS8qIENvcmUgRG91YmxlIEZhdWx0IENhdXNlcyBSZXNldAkJCQkqLworI2RlZmluZSBSRVNFVF9ET1VCTEUJCTB4MjAwMAkvKiBTVyBSZXNldCBHZW5lcmF0ZWQgQnkgQ29yZSBEb3VibGUtRmF1bHQJCSovCisjZGVmaW5lIFJFU0VUX1dET0cJCQkweDQwMDAJLyogU1cgUmVzZXQgR2VuZXJhdGVkIEJ5IFdhdGNoZG9nIFRpbWVyCQkJKi8KKyNkZWZpbmUgUkVTRVRfU09GVFdBUkUJCTB4ODAwMAkvKiBTVyBSZXNldCBPY2N1cnJlZCBTaW5jZSBMYXN0IFJlYWQgT2YgU1dSU1QJKi8KKworLyogU1lTQ1IgTWFza3MJCQkJCQkJCQkJCQkJCQkJCQkJCSovCisjZGVmaW5lIEJNT0RFCQkJCTB4MDAwNwkvKiBCb290IE1vZGUgLSBMYXRjaGVkIER1cmluZyBIVyBSZXNldCBGcm9tIE1vZGUgUGlucwkqLworI2RlZmluZQlOT0JPT1QJCQkJMHgwMDEwCS8qIEV4ZWN1dGUgRnJvbSBMMSBvciBBU1lOQyBCYW5rIDAgV2hlbiBCTU9ERSA9IDAJCSovCisKKworLyogKioqKioqKioqKioqKiAgU1lTVEVNIElOVEVSUlVQVCBDT05UUk9MTEVSIE1BU0tTICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBQZXJpcGhlcmFsIE1hc2tzIEZvciBTSUNfSVNSLCBTSUNfSVdSLCBTSUNfSU1BU0sJCQkJCQkJCQkJKi8KKworI2lmIDAKKyNkZWZpbmUgSVJRX1BMTF9XQUtFVVAJMHgwMDAwMDAwMQkvKiBQTEwgV2FrZXVwIEludGVycnVwdAkJCSAJCQkJCSovCisKKyNkZWZpbmUgSVJRX0VSUk9SMSAgICAgIDB4MDAwMDAwMDIgIC8qIEVycm9yIEludGVycnVwdCAoRE1BLCBETUFSeCBCbG9jaywgRE1BUnggT3ZlcmZsb3cpICovCisjZGVmaW5lIElSUV9FUlJPUjIgICAgICAweDAwMDAwMDA0ICAvKiBFcnJvciBJbnRlcnJ1cHQgKENBTiwgRXRoZXJuZXQsIFNQT1JUeCwgUFBJLCBTUEksIFVBUlR4KSAqLworI2RlZmluZSBJUlFfUlRDCQkJMHgwMDAwMDAwOAkvKiBSZWFsIFRpbWUgQ2xvY2sgSW50ZXJydXB0IAkJCQkJCSovCisjZGVmaW5lIElSUV9ETUEwCQkweDAwMDAwMDEwCS8qIERNQSBDaGFubmVsIDAgKFBQSSkgSW50ZXJydXB0IAkJCQkJKi8KKyNkZWZpbmUgSVJRX0RNQTMJCTB4MDAwMDAwMjAJLyogRE1BIENoYW5uZWwgMyAoU1BPUlQwIFJYKSBJbnRlcnJ1cHQgCQkJCSovCisjZGVmaW5lIElSUV9ETUE0CQkweDAwMDAwMDQwCS8qIERNQSBDaGFubmVsIDQgKFNQT1JUMCBUWCkgSW50ZXJydXB0IAkJCQkqLworI2RlZmluZSBJUlFfRE1BNQkJMHgwMDAwMDA4MAkvKiBETUEgQ2hhbm5lbCA1IChTUE9SVDEgUlgpIEludGVycnVwdCAJCQkJKi8KKworI2RlZmluZSBJUlFfRE1BNgkJMHgwMDAwMDEwMAkvKiBETUEgQ2hhbm5lbCA2IChTUE9SVDEgVFgpIEludGVycnVwdCAJCSAJCSovCisjZGVmaW5lIElSUV9UV0kJCQkweDAwMDAwMjAwCS8qIFRXSSBJbnRlcnJ1cHQJCQkJCQkJCQkqLworI2RlZmluZSBJUlFfRE1BNwkJMHgwMDAwMDQwMAkvKiBETUEgQ2hhbm5lbCA3IChTUEkpIEludGVycnVwdCAJCQkJCSovCisjZGVmaW5lIElSUV9ETUE4CQkweDAwMDAwODAwCS8qIERNQSBDaGFubmVsIDggKFVBUlQwIFJYKSBJbnRlcnJ1cHQgCQkJCSovCisjZGVmaW5lIElSUV9ETUE5CQkweDAwMDAxMDAwCS8qIERNQSBDaGFubmVsIDkgKFVBUlQwIFRYKSBJbnRlcnJ1cHQgCQkJCSovCisjZGVmaW5lIElSUV9ETUExMAkJMHgwMDAwMjAwMAkvKiBETUEgQ2hhbm5lbCAxMCAoVUFSVDEgUlgpIEludGVycnVwdCAJCQkJKi8KKyNkZWZpbmUgSVJRX0RNQTExCQkweDAwMDA0MDAwCS8qIERNQSBDaGFubmVsIDExIChVQVJUMSBUWCkgSW50ZXJydXB0IAkJCQkqLworI2RlZmluZSBJUlFfQ0FOX1JYCQkweDAwMDA4MDAwCS8qIENBTiBSZWNlaXZlIEludGVycnVwdCAJCQkJCQkJKi8KKworI2RlZmluZSBJUlFfQ0FOX1RYCQkweDAwMDEwMDAwCS8qIENBTiBUcmFuc21pdCBJbnRlcnJ1cHQgIAkJCQkJCQkqLworI2RlZmluZSBJUlFfRE1BMQkJMHgwMDAyMDAwMAkvKiBETUEgQ2hhbm5lbCAxIChFdGhlcm5ldCBSWCkgSW50ZXJydXB0IAkJCSovCisjZGVmaW5lIElSUV9QRkFfUE9SVEgJMHgwMDAyMDAwMAkvKiBQRiBQb3J0IEggKFBGNDc6MzIpIEludGVycnVwdCBBIAkJCQkJKi8KKyNkZWZpbmUgSVJRX0RNQTIJCTB4MDAwNDAwMDAJLyogRE1BIENoYW5uZWwgMiAoRXRoZXJuZXQgVFgpIEludGVycnVwdCAJCQkqLworI2RlZmluZSBJUlFfUEZCX1BPUlRICTB4MDAwNDAwMDAJLyogUEYgUG9ydCBIIChQRjQ3OjMyKSBJbnRlcnJ1cHQgQiAJCQkJCSovCisjZGVmaW5lIElSUV9USU1FUjAJCTB4MDAwODAwMDAJLyogVGltZXIgMCBJbnRlcnJ1cHQJCQkJCQkJCSovCisjZGVmaW5lIElSUV9USU1FUjEJCTB4MDAxMDAwMDAJLyogVGltZXIgMSBJbnRlcnJ1cHQgCQkJCQkJCQkqLworI2RlZmluZSBJUlFfVElNRVIyCQkweDAwMjAwMDAwCS8qIFRpbWVyIDIgSW50ZXJydXB0IAkJCQkJCQkJKi8KKyNkZWZpbmUgSVJRX1RJTUVSMwkJMHgwMDQwMDAwMAkvKiBUaW1lciAzIEludGVycnVwdCAJCQkJCQkJCSovCisjZGVmaW5lIElSUV9USU1FUjQJCTB4MDA4MDAwMDAJLyogVGltZXIgNCBJbnRlcnJ1cHQgCQkJCQkJCQkqLworCisjZGVmaW5lIElSUV9USU1FUjUJCTB4MDEwMDAwMDAJLyogVGltZXIgNSBJbnRlcnJ1cHQgCQkJCQkJCQkqLworI2RlZmluZSBJUlFfVElNRVI2CQkweDAyMDAwMDAwCS8qIFRpbWVyIDYgSW50ZXJydXB0IAkJCQkJCQkJKi8KKyNkZWZpbmUgSVJRX1RJTUVSNwkJMHgwNDAwMDAwMAkvKiBUaW1lciA3IEludGVycnVwdCAJCQkJCQkJCSovCisjZGVmaW5lIElSUV9QRkFfUE9SVEZHCTB4MDgwMDAwMDAJLyogUEYgUG9ydHMgRiZHIChQRjMxOjApIEludGVycnVwdCBBIAkJCQkqLworI2RlZmluZSBJUlFfUEZCX1BPUlRGCTB4ODAwMDAwMDAJLyogUEYgUG9ydCBGIChQRjE1OjApIEludGVycnVwdCBCIAkJCQkJKi8KKyNkZWZpbmUgSVJRX0RNQTEyCQkweDIwMDAwMDAwCS8qIERNQSBDaGFubmVscyAxMiAoTURNQTEgU291cmNlKSBSWCBJbnRlcnJ1cHQgCQkqLworI2RlZmluZSBJUlFfRE1BMTMJCTB4MjAwMDAwMDAJLyogRE1BIENoYW5uZWxzIDEzIChNRE1BMSBEZXN0aW5hdGlvbikgVFggSW50ZXJydXB0ICovCisjZGVmaW5lIElSUV9ETUExNAkJMHg0MDAwMDAwMAkvKiBETUEgQ2hhbm5lbHMgMTQgKE1ETUEwIFNvdXJjZSkgUlggSW50ZXJydXB0IAkJKi8KKyNkZWZpbmUgSVJRX0RNQTE1CQkweDQwMDAwMDAwCS8qIERNQSBDaGFubmVscyAxNSAoTURNQTAgRGVzdGluYXRpb24pIFRYIEludGVycnVwdCAqLworI2RlZmluZSBJUlFfV0RPRwkJMHg4MDAwMDAwMAkvKiBTb2Z0d2FyZSBXYXRjaGRvZyBUaW1lciBJbnRlcnJ1cHQgCQkJCSovCisjZGVmaW5lIElSUV9QRkJfUE9SVEcJMHgxMDAwMDAwMAkvKiBQRiBQb3J0IEcgKFBGMzE6MTYpIEludGVycnVwdCBCIAkJCQkJKi8KKyNlbmRpZgorCisvKiBTSUNfSUFSMCBNYWNyb3MJCQkJCQkJCQkJCQkJCQkqLworI2RlZmluZSBQMF9JVkcoeCkJCSgoKHgpJjB4RiktNykJCQkvKiBQZXJpcGhlcmFsICMwIGFzc2lnbmVkIElWRyAjeCAJKi8KKyNkZWZpbmUgUDFfSVZHKHgpCQkoKCh4KSYweEYpLTcpIDw8IDB4NAkvKiBQZXJpcGhlcmFsICMxIGFzc2lnbmVkIElWRyAjeCAJKi8KKyNkZWZpbmUgUDJfSVZHKHgpCQkoKCh4KSYweEYpLTcpIDw8IDB4OAkvKiBQZXJpcGhlcmFsICMyIGFzc2lnbmVkIElWRyAjeCAJKi8KKyNkZWZpbmUgUDNfSVZHKHgpCQkoKCh4KSYweEYpLTcpIDw8IDB4QwkvKiBQZXJpcGhlcmFsICMzIGFzc2lnbmVkIElWRyAjeAkqLworI2RlZmluZSBQNF9JVkcoeCkJCSgoKHgpJjB4RiktNykgPDwgMHgxMAkvKiBQZXJpcGhlcmFsICM0IGFzc2lnbmVkIElWRyAjeAkqLworI2RlZmluZSBQNV9JVkcoeCkJCSgoKHgpJjB4RiktNykgPDwgMHgxNAkvKiBQZXJpcGhlcmFsICM1IGFzc2lnbmVkIElWRyAjeAkqLworI2RlZmluZSBQNl9JVkcoeCkJCSgoKHgpJjB4RiktNykgPDwgMHgxOAkvKiBQZXJpcGhlcmFsICM2IGFzc2lnbmVkIElWRyAjeAkqLworI2RlZmluZSBQN19JVkcoeCkJCSgoKHgpJjB4RiktNykgPDwgMHgxQwkvKiBQZXJpcGhlcmFsICM3IGFzc2lnbmVkIElWRyAjeAkqLworCisvKiBTSUNfSUFSMSBNYWNyb3MJCQkJCQkJCQkJCQkJCQkqLworI2RlZmluZSBQOF9JVkcoeCkJCSgoKHgpJjB4RiktNykJCQkvKiBQZXJpcGhlcmFsICM4IGFzc2lnbmVkIElWRyAjeCAJKi8KKyNkZWZpbmUgUDlfSVZHKHgpCQkoKCh4KSYweEYpLTcpIDw8IDB4NAkvKiBQZXJpcGhlcmFsICM5IGFzc2lnbmVkIElWRyAjeCAJKi8KKyNkZWZpbmUgUDEwX0lWRyh4KQkJKCgoeCkmMHhGKS03KSA8PCAweDgJLyogUGVyaXBoZXJhbCAjMTAgYXNzaWduZWQgSVZHICN4CSovCisjZGVmaW5lIFAxMV9JVkcoeCkJCSgoKHgpJjB4RiktNykgPDwgMHhDCS8qIFBlcmlwaGVyYWwgIzExIGFzc2lnbmVkIElWRyAjeCAJKi8KKyNkZWZpbmUgUDEyX0lWRyh4KQkJKCgoeCkmMHhGKS03KSA8PCAweDEwCS8qIFBlcmlwaGVyYWwgIzEyIGFzc2lnbmVkIElWRyAjeAkqLworI2RlZmluZSBQMTNfSVZHKHgpCQkoKCh4KSYweEYpLTcpIDw8IDB4MTQJLyogUGVyaXBoZXJhbCAjMTMgYXNzaWduZWQgSVZHICN4CSovCisjZGVmaW5lIFAxNF9JVkcoeCkJCSgoKHgpJjB4RiktNykgPDwgMHgxOAkvKiBQZXJpcGhlcmFsICMxNCBhc3NpZ25lZCBJVkcgI3gJKi8KKyNkZWZpbmUgUDE1X0lWRyh4KQkJKCgoeCkmMHhGKS03KSA8PCAweDFDCS8qIFBlcmlwaGVyYWwgIzE1IGFzc2lnbmVkIElWRyAjeAkqLworCisvKiBTSUNfSUFSMiBNYWNyb3MJCQkJCQkJCQkJCQkJCQkqLworI2RlZmluZSBQMTZfSVZHKHgpCQkoKCh4KSYweEYpLTcpCQkJLyogUGVyaXBoZXJhbCAjMTYgYXNzaWduZWQgSVZHICN4CSovCisjZGVmaW5lIFAxN19JVkcoeCkJCSgoKHgpJjB4RiktNykgPDwgMHg0CS8qIFBlcmlwaGVyYWwgIzE3IGFzc2lnbmVkIElWRyAjeAkqLworI2RlZmluZSBQMThfSVZHKHgpCQkoKCh4KSYweEYpLTcpIDw8IDB4OAkvKiBQZXJpcGhlcmFsICMxOCBhc3NpZ25lZCBJVkcgI3gJKi8KKyNkZWZpbmUgUDE5X0lWRyh4KQkJKCgoeCkmMHhGKS03KSA8PCAweEMJLyogUGVyaXBoZXJhbCAjMTkgYXNzaWduZWQgSVZHICN4CSovCisjZGVmaW5lIFAyMF9JVkcoeCkJCSgoKHgpJjB4RiktNykgPDwgMHgxMAkvKiBQZXJpcGhlcmFsICMyMCBhc3NpZ25lZCBJVkcgI3gJKi8KKyNkZWZpbmUgUDIxX0lWRyh4KQkJKCgoeCkmMHhGKS03KSA8PCAweDE0CS8qIFBlcmlwaGVyYWwgIzIxIGFzc2lnbmVkIElWRyAjeAkqLworI2RlZmluZSBQMjJfSVZHKHgpCQkoKCh4KSYweEYpLTcpIDw8IDB4MTgJLyogUGVyaXBoZXJhbCAjMjIgYXNzaWduZWQgSVZHICN4CSovCisjZGVmaW5lIFAyM19JVkcoeCkJCSgoKHgpJjB4RiktNykgPDwgMHgxQwkvKiBQZXJpcGhlcmFsICMyMyBhc3NpZ25lZCBJVkcgI3gJKi8KKworLyogU0lDX0lBUjMgTWFjcm9zCQkJCQkJCQkJCQkJCQkJKi8KKyNkZWZpbmUgUDI0X0lWRyh4KQkJKCgoeCkmMHhGKS03KQkJCS8qIFBlcmlwaGVyYWwgIzI0IGFzc2lnbmVkIElWRyAjeAkqLworI2RlZmluZSBQMjVfSVZHKHgpCQkoKCh4KSYweEYpLTcpIDw8IDB4NAkvKiBQZXJpcGhlcmFsICMyNSBhc3NpZ25lZCBJVkcgI3gJKi8KKyNkZWZpbmUgUDI2X0lWRyh4KQkJKCgoeCkmMHhGKS03KSA8PCAweDgJLyogUGVyaXBoZXJhbCAjMjYgYXNzaWduZWQgSVZHICN4CSovCisjZGVmaW5lIFAyN19JVkcoeCkJCSgoKHgpJjB4RiktNykgPDwgMHhDCS8qIFBlcmlwaGVyYWwgIzI3IGFzc2lnbmVkIElWRyAjeAkqLworI2RlZmluZSBQMjhfSVZHKHgpCQkoKCh4KSYweEYpLTcpIDw8IDB4MTAJLyogUGVyaXBoZXJhbCAjMjggYXNzaWduZWQgSVZHICN4CSovCisjZGVmaW5lIFAyOV9JVkcoeCkJCSgoKHgpJjB4RiktNykgPDwgMHgxNAkvKiBQZXJpcGhlcmFsICMyOSBhc3NpZ25lZCBJVkcgI3gJKi8KKyNkZWZpbmUgUDMwX0lWRyh4KQkJKCgoeCkmMHhGKS03KSA8PCAweDE4CS8qIFBlcmlwaGVyYWwgIzMwIGFzc2lnbmVkIElWRyAjeAkqLworI2RlZmluZSBQMzFfSVZHKHgpCQkoKCh4KSYweEYpLTcpIDw8IDB4MUMJLyogUGVyaXBoZXJhbCAjMzEgYXNzaWduZWQgSVZHICN4CSovCisKKworLyogU0lDX0lNQVNLIE1hc2tzCQkJCQkJCQkJCQkJCQkJCQkJKi8KKyNkZWZpbmUgU0lDX1VOTUFTS19BTEwJMHgwMDAwMDAwMAkJCQkJLyogVW5tYXNrIGFsbCBwZXJpcGhlcmFsIGludGVycnVwdHMJKi8KKyNkZWZpbmUgU0lDX01BU0tfQUxMCTB4RkZGRkZGRkYJCQkJCS8qIE1hc2sgYWxsIHBlcmlwaGVyYWwgaW50ZXJydXB0cwkqLworI2RlZmluZSBTSUNfTUFTSyh4KQkJKDEgPDwgKCh4KSYweDFGKSkJCQkJCS8qIE1hc2sgUGVyaXBoZXJhbCAjeCBpbnRlcnJ1cHQJCSovCisjZGVmaW5lIFNJQ19VTk1BU0soeCkJKDB4RkZGRkZGRkYgXiAoMSA8PCAoKHgpJjB4MUYpKSkJLyogVW5tYXNrIFBlcmlwaGVyYWwgI3ggaW50ZXJydXB0CSovCisKKy8qIFNJQ19JV1IgTWFza3MJCQkJCQkJCQkJCQkJCQkJCQkqLworI2RlZmluZSBJV1JfRElTQUJMRV9BTEwJMHgwMDAwMDAwMAkJCQkJLyogV2FrZXVwIERpc2FibGUgYWxsIHBlcmlwaGVyYWxzCSovCisjZGVmaW5lIElXUl9FTkFCTEVfQUxMCTB4RkZGRkZGRkYJCQkJCS8qIFdha2V1cCBFbmFibGUgYWxsIHBlcmlwaGVyYWxzCSovCisjZGVmaW5lIElXUl9FTkFCTEUoeCkJKDEgPDwgKCh4KSYweDFGKSkJCQkJCS8qIFdha2V1cCBFbmFibGUgUGVyaXBoZXJhbCAjeAkJKi8KKyNkZWZpbmUgSVdSX0RJU0FCTEUoeCkJKDB4RkZGRkZGRkYgXiAoMSA8PCAoKHgpJjB4MUYpKSkgCS8qIFdha2V1cCBEaXNhYmxlIFBlcmlwaGVyYWwgI3gJCSovCisKKworLyogKioqKioqKioqIFdBVENIRE9HIFRJTUVSIE1BU0tTICoqKioqKioqKioqKioqKioqKioqICovCisKKy8qIFdhdGNoZG9nIFRpbWVyIFdET0dfQ1RMIFJlZ2lzdGVyIE1hc2tzICovCisKKyNkZWZpbmUgV0RFVih4KSAoKCh4KTw8MSkgJiAweDAwMDYpIC8qIGV2ZW50IGdlbmVyYXRlZCBvbiByb2xsIG92ZXIgKi8KKyNkZWZpbmUgV0RFVl9SRVNFVCAweDAwMDAgLyogZ2VuZXJhdGUgcmVzZXQgZXZlbnQgb24gcm9sbCBvdmVyICovCisjZGVmaW5lIFdERVZfTk1JIDB4MDAwMiAvKiBnZW5lcmF0ZSBOTUkgZXZlbnQgb24gcm9sbCBvdmVyICovCisjZGVmaW5lIFdERVZfR1BJIDB4MDAwNCAvKiBnZW5lcmF0ZSBHUCBJUlEgb24gcm9sbCBvdmVyICovCisjZGVmaW5lIFdERVZfTk9ORSAweDAwMDYgLyogbm8gZXZlbnQgb24gcm9sbCBvdmVyICovCisjZGVmaW5lIFdERU4gMHgwRkYwIC8qIGVuYWJsZSB3YXRjaGRvZyAqLworI2RlZmluZSBXRERJUyAweDBBRDAgLyogZGlzYWJsZSB3YXRjaGRvZyAqLworI2RlZmluZSBXRFJPIDB4ODAwMCAvKiB3YXRjaGRvZyByb2xsZWQgb3ZlciBsYXRjaCAqLworCisvKiBkZXByZWNpYXRlZCBXRE9HX0NUTCBSZWdpc3RlciBNYXNrcyBmb3IgbGVnYWN5IGNvZGUgKi8KKworCisjZGVmaW5lIElDVEwgV0RFVgorI2RlZmluZSBFTkFCTEVfUkVTRVQgV0RFVl9SRVNFVAorI2RlZmluZSBXRE9HX1JFU0VUIFdERVZfUkVTRVQKKyNkZWZpbmUgRU5BQkxFX05NSSBXREVWX05NSQorI2RlZmluZSBXRE9HX05NSSBXREVWX05NSQorI2RlZmluZSBFTkFCTEVfR1BJIFdERVZfR1BJCisjZGVmaW5lIFdET0dfR1BJIFdERVZfR1BJCisjZGVmaW5lIERJU0FCTEVfRVZUIFdERVZfTk9ORQorI2RlZmluZSBXRE9HX05PTkUgV0RFVl9OT05FCisKKyNkZWZpbmUgVE1SX0VOIFdERU4KKyNkZWZpbmUgVE1SX0RJUyBXRERJUworI2RlZmluZSBUUk8gV0RSTworI2RlZmluZSBJQ1RMX1AwIDB4MDEKKyAjZGVmaW5lIElDVExfUDEgMHgwMgorI2RlZmluZSBUUk9fUCAweDBGCisKKworCisvKiAqKioqKioqKioqKioqKiogIFJFQUwgVElNRSBDTE9DSyBNQVNLUyAgKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBSVENfU1RBVCBhbmQgUlRDX0FMQVJNIE1hc2tzCQkJCQkJCQkJCSovCisjZGVmaW5lCVJUQ19TRUMJCQkJMHgwMDAwMDAzRgkvKiBSZWFsLVRpbWUgQ2xvY2sgU2Vjb25kcwkqLworI2RlZmluZQlSVENfTUlOCQkJCTB4MDAwMDBGQzAJLyogUmVhbC1UaW1lIENsb2NrIE1pbnV0ZXMJKi8KKyNkZWZpbmUJUlRDX0hSCQkJCTB4MDAwMUYwMDAJLyogUmVhbC1UaW1lIENsb2NrIEhvdXJzCSovCisjZGVmaW5lCVJUQ19EQVkJCQkJMHhGRkZFMDAwMAkvKiBSZWFsLVRpbWUgQ2xvY2sgRGF5cwkJKi8KKworLyogUlRDX0FMQVJNIE1hY3JvCQkJej1kYXkJCXk9aHIJeD1taW4Jdz1zZWMJCSovCisjZGVmaW5lIFNFVF9BTEFSTSh6LHkseCx3KQkoKCgoeikmMHg3RkZGKTw8MHgxMSl8KCgoeSkmMHgxRik8PDB4Qyl8KCgoeCkmMHgzRik8PDB4Nil8KCh3KSYweDNGKSkKKworLyogUlRDX0lDVEwgYW5kIFJUQ19JU1RBVCBNYXNrcwkJCQkJCQkJCQkJCQkJCQkJCSovCisjZGVmaW5lCVNUT1BXQVRDSAkJCTB4MDAwMQkJLyogU3RvcHdhdGNoIEludGVycnVwdCBFbmFibGUJCQkJCQkJCSovCisjZGVmaW5lCUFMQVJNCQkJCTB4MDAwMgkJLyogQWxhcm0gSW50ZXJydXB0IEVuYWJsZQkJCQkJCQkJCSovCisjZGVmaW5lCVNFQ09ORAkJCQkweDAwMDQJCS8qIFNlY29uZHMgKDEgSHopIEludGVycnVwdCBFbmFibGUJCQkJCQkJKi8KKyNkZWZpbmUJTUlOVVRFCQkJCTB4MDAwOAkJLyogTWludXRlcyBJbnRlcnJ1cHQgRW5hYmxlCQkJCQkJCQkJKi8KKyNkZWZpbmUJSE9VUgkJCQkweDAwMTAJCS8qIEhvdXJzIEludGVycnVwdCBFbmFibGUJCQkJCQkJCQkqLworI2RlZmluZQlEQVkJCQkJCTB4MDAyMAkJLyogMjQgSG91cnMgKERheXMpIEludGVycnVwdCBFbmFibGUJCQkJCQkJKi8KKyNkZWZpbmUJREFZX0FMQVJNCQkJMHgwMDQwCQkvKiBEYXkgQWxhcm0gKERheSwgSG91ciwgTWludXRlLCBTZWNvbmQpIEludGVycnVwdCBFbmFibGUJKi8KKyNkZWZpbmUJV1JJVEVfUEVORElORwkJMHg0MDAwCQkvKiBXcml0ZSBQZW5kaW5nIFN0YXR1cwkJCQkJCQkJCQkqLworI2RlZmluZQlXUklURV9DT01QTEVURQkJMHg4MDAwCQkvKiBXcml0ZSBDb21wbGV0ZSBJbnRlcnJ1cHQgRW5hYmxlCQkJCQkJCSovCisKKy8qIFJUQ19GQVNUIC8gUlRDX1BSRU4gTWFzawkJCQkJCQkJCQkJCSovCisjZGVmaW5lIFBSRU4JCQkJMHgwMDAxCS8qIEVuYWJsZSBQcmVzY2FsZXIsIFJUQyBSdW5zIEAxIEh6CSovCisKKworLyogKioqKioqKioqKioqKiogVUFSVCBDT05UUk9MTEVSIE1BU0tTICoqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBVQVJUeF9MQ1IgTWFza3MJCQkJCQkJCQkJCQkqLworI2RlZmluZSBXTFMoeCkJCSgoKHgpLTUpICYgMHgwMykJLyogV29yZCBMZW5ndGggU2VsZWN0ICovCisjZGVmaW5lIFNUQgkJCTB4MDQJCQkJLyogU3RvcCBCaXRzCQkJKi8KKyNkZWZpbmUgUEVOCQkJMHgwOAkJCQkvKiBQYXJpdHkgRW5hYmxlCQkqLworI2RlZmluZSBFUFMJCQkweDEwCQkJCS8qIEV2ZW4gUGFyaXR5IFNlbGVjdAkqLworI2RlZmluZSBTVFAJCQkweDIwCQkJCS8qIFN0aWNrIFBhcml0eQkJCSovCisjZGVmaW5lIFNCCQkJMHg0MAkJCQkvKiBTZXQgQnJlYWsJCQkqLworI2RlZmluZSBETEFCCQkweDgwCQkJCS8qIERpdmlzb3IgTGF0Y2ggQWNjZXNzCSovCisKKy8qIFVBUlR4X01DUiBNYXNrCQkJCQkJCQkJCSovCisjZGVmaW5lIExPT1BfRU5BCTB4MTAJLyogTG9vcGJhY2sgTW9kZSBFbmFibGUgKi8KKyNkZWZpbmUgTE9PUF9FTkFfUAkweDA0CisKKy8qIFVBUlR4X0xTUiBNYXNrcwkJCQkJCQkJCQkqLworI2RlZmluZSBEUgkJCTB4MDEJLyogRGF0YSBSZWFkeQkJCQkqLworI2RlZmluZSBPRQkJCTB4MDIJLyogT3ZlcnJ1biBFcnJvcgkJCSovCisjZGVmaW5lIFBFCQkJMHgwNAkvKiBQYXJpdHkgRXJyb3IJCQkJKi8KKyNkZWZpbmUgRkUJCQkweDA4CS8qIEZyYW1pbmcgRXJyb3IJCQkqLworI2RlZmluZSBCSQkJCTB4MTAJLyogQnJlYWsgSW50ZXJydXB0CQkJKi8KKyNkZWZpbmUgVEhSRQkJMHgyMAkvKiBUSFIgRW1wdHkJCQkJKi8KKyNkZWZpbmUgVEVNVAkJMHg0MAkvKiBUU1IgYW5kIFVBUlRfVEhSIEVtcHR5CSovCisKKy8qIFVBUlR4X0lFUiBNYXNrcwkJCQkJCQkJCQkJCQkJCSovCisjZGVmaW5lIEVSQkZJCQkweDAxCQkvKiBFbmFibGUgUmVjZWl2ZSBCdWZmZXIgRnVsbCBJbnRlcnJ1cHQJCSovCisjZGVmaW5lIEVUQkVJCQkweDAyCQkvKiBFbmFibGUgVHJhbnNtaXQgQnVmZmVyIEVtcHR5IEludGVycnVwdAkqLworI2RlZmluZSBFTFNJCQkweDA0CQkvKiBFbmFibGUgUlggU3RhdHVzIEludGVycnVwdAkJCQkqLworCisvKiBVQVJUeF9JSVIgTWFza3MJCQkJCQkJCQkJCQkJCSovCisjZGVmaW5lIE5JTlQJCTB4MDEJCS8qIFBlbmRpbmcgSW50ZXJydXB0CQkJCQkqLworI2RlZmluZSBJSVJfVFhfUkVBRFkgICAgMHgwMgkJLyogVUFSVF9USFIgZW1wdHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgSUlSX1JYX1JFQURZICAgIDB4MDQJCS8qIFJlY2VpdmUgZGF0YSByZWFkeSAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIElJUl9MSU5FX0NIQU5HRSAweDA2CQkvKiBSZWNlaXZlIGxpbmUgc3RhdHVzICAgIAkJCSovCisjZGVmaW5lIElJUl9TVEFUVVMJMHgwNgkJLyogSGlnaGVzdCBQcmlvcml0eSBQZW5kaW5nIEludGVycnVwdAkqLworCisvKiBVQVJUeF9HQ1RMIE1hc2tzCQkJCQkJCQkJCQkJCSovCisjZGVmaW5lIFVDRU4JCTB4MDEJCS8qIEVuYWJsZSBVQVJUeCBDbG9ja3MJCQkJKi8KKyNkZWZpbmUgSVJFTgkJMHgwMgkJLyogRW5hYmxlIElyREEgTW9kZQkJCQkJKi8KKyNkZWZpbmUgVFBPTEMJCTB4MDQJCS8qIElyREEgVFggUG9sYXJpdHkgQ2hhbmdlCQkJKi8KKyNkZWZpbmUgUlBPTEMJCTB4MDgJCS8qIElyREEgUlggUG9sYXJpdHkgQ2hhbmdlCQkJKi8KKyNkZWZpbmUgRlBFCQkJMHgxMAkJLyogRm9yY2UgUGFyaXR5IEVycm9yIE9uIFRyYW5zbWl0CSovCisjZGVmaW5lIEZGRQkJCTB4MjAJCS8qIEZvcmNlIEZyYW1pbmcgRXJyb3IgT24gVHJhbnNtaXQJKi8KKworCisvKiAqKioqKioqKioqKiAgU0VSSUFMIFBFUklQSEVSQUwgSU5URVJGQUNFIChTUEkpIE1BU0tTICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogU1BJX0NUTCBNYXNrcwkJCQkJCQkJCQkJCQkJCQkJKi8KKyNkZWZpbmUJVElNT0QJCTB4MDAwMwkJLyogVHJhbnNmZXIgSW5pdGlhdGUgTW9kZQkJCQkJCQkqLworI2RlZmluZSBSREJSX0NPUkUJMHgwMDAwCQkvKiAJCVJEQlIgUmVhZCBJbml0aWF0ZXMsIElSUSBXaGVuIFJEQlIgRnVsbAkJKi8KKyNkZWZpbmUJVERCUl9DT1JFCTB4MDAwMQkJLyogCQlUREJSIFdyaXRlIEluaXRpYXRlcywgSVJRIFdoZW4gVERCUiBFbXB0eQkqLworI2RlZmluZSBSREJSX0RNQQkweDAwMDIJCS8qIAkJRE1BIFJlYWQsIERNQSBVbnRpbCBGSUZPIEVtcHR5CQkJCSovCisjZGVmaW5lIFREQlJfRE1BCTB4MDAwMwkJLyogCQlETUEgV3JpdGUsIERNQSBVbnRpbCBGSUZPIEZ1bGwJCQkJKi8KKyNkZWZpbmUgU1oJCQkweDAwMDQJCS8qIFNlbmQgWmVybyAoV2hlbiBUREJSIEVtcHR5LCBTZW5kIFplcm8vTGFzdCopCQkqLworI2RlZmluZSBHTQkJCTB4MDAwOAkJLyogR2V0IE1vcmUgKFdoZW4gUkRCUiBGdWxsLCBPdmVyd3JpdGUvRGlzY2FyZCopCSovCisjZGVmaW5lIFBTU0UJCTB4MDAxMAkJLyogU2xhdmUtU2VsZWN0IElucHV0IEVuYWJsZQkJCQkJCSovCisjZGVmaW5lIEVNSVNPCQkweDAwMjAJCS8qIEVuYWJsZSBNSVNPIEFzIE91dHB1dAkJCQkJCQkqLworI2RlZmluZSBTSVpFCQkweDAxMDAJCS8qIFNpemUgb2YgV29yZHMgKDE2LzgqIEJpdHMpCQkJCQkJKi8KKyNkZWZpbmUgTFNCRgkJMHgwMjAwCQkvKiBMU0IgRmlyc3QJCQkJCQkJCQkJKi8KKyNkZWZpbmUgQ1BIQQkJMHgwNDAwCQkvKiBDbG9jayBQaGFzZQkJCQkJCQkJCQkqLworI2RlZmluZSBDUE9MCQkweDA4MDAJCS8qIENsb2NrIFBvbGFyaXR5CQkJCQkJCQkJKi8KKyNkZWZpbmUgTVNUUgkJMHgxMDAwCQkvKiBNYXN0ZXIvU2xhdmUqCQkJCQkJCQkJKi8KKyNkZWZpbmUgV09NCQkJMHgyMDAwCQkvKiBXcml0ZSBPcGVuIERyYWluIE1hc3RlcgkJCQkJCQkqLworI2RlZmluZSBTUEUJCQkweDQwMDAJCS8qIFNQSSBFbmFibGUJCQkJCQkJCQkJKi8KKworLyogU1BJX0ZMRyBNYXNrcwkJCQkJCQkJCQkJCQkJCQkJKi8KKyNkZWZpbmUgRkxTMQkJMHgwMDAyCQkvKiBFbmFibGVzIFNQSV9GTE9VVDEgYXMgU1BJIFNsYXZlLVNlbGVjdCBPdXRwdXQJKi8KKyNkZWZpbmUgRkxTMgkJMHgwMDA0CQkvKiBFbmFibGVzIFNQSV9GTE9VVDIgYXMgU1BJIFNsYXZlLVNlbGVjdCBPdXRwdXQJKi8KKyNkZWZpbmUgRkxTMwkJMHgwMDA4CQkvKiBFbmFibGVzIFNQSV9GTE9VVDMgYXMgU1BJIFNsYXZlLVNlbGVjdCBPdXRwdXQJKi8KKyNkZWZpbmUgRkxTNAkJMHgwMDEwCQkvKiBFbmFibGVzIFNQSV9GTE9VVDQgYXMgU1BJIFNsYXZlLVNlbGVjdCBPdXRwdXQJKi8KKyNkZWZpbmUgRkxTNQkJMHgwMDIwCQkvKiBFbmFibGVzIFNQSV9GTE9VVDUgYXMgU1BJIFNsYXZlLVNlbGVjdCBPdXRwdXQJKi8KKyNkZWZpbmUgRkxTNgkJMHgwMDQwCQkvKiBFbmFibGVzIFNQSV9GTE9VVDYgYXMgU1BJIFNsYXZlLVNlbGVjdCBPdXRwdXQJKi8KKyNkZWZpbmUgRkxTNwkJMHgwMDgwCQkvKiBFbmFibGVzIFNQSV9GTE9VVDcgYXMgU1BJIFNsYXZlLVNlbGVjdCBPdXRwdXQJKi8KKyNkZWZpbmUgRkxHMQkJMHhGREZGCQkvKiBBY3RpdmF0ZXMgU1BJX0ZMT1VUMSAJCQkJCQkJKi8KKyNkZWZpbmUgRkxHMgkJMHhGQkZGCQkvKiBBY3RpdmF0ZXMgU1BJX0ZMT1VUMgkJCQkJCQkJKi8KKyNkZWZpbmUgRkxHMwkJMHhGN0ZGCQkvKiBBY3RpdmF0ZXMgU1BJX0ZMT1VUMwkJCQkJCQkJKi8KKyNkZWZpbmUgRkxHNAkJMHhFRkZGCQkvKiBBY3RpdmF0ZXMgU1BJX0ZMT1VUNAkJCQkJCQkJKi8KKyNkZWZpbmUgRkxHNQkJMHhERkZGCQkvKiBBY3RpdmF0ZXMgU1BJX0ZMT1VUNQkJCQkJCQkJKi8KKyNkZWZpbmUgRkxHNgkJMHhCRkZGCQkvKiBBY3RpdmF0ZXMgU1BJX0ZMT1VUNgkJCQkJCQkJKi8KKyNkZWZpbmUgRkxHNwkJMHg3RkZGCQkvKiBBY3RpdmF0ZXMgU1BJX0ZMT1VUNwkJCQkJCQkJKi8KKworLyogU1BJX1NUQVQgTWFza3MJCQkJCQkJCQkJCQkJCQkJCQkJCSovCisjZGVmaW5lIFNQSUYJCTB4MDAwMQkJLyogU1BJIEZpbmlzaGVkIChTaW5nbGUtV29yZCBUcmFuc2ZlciBDb21wbGV0ZSkJCQkJCSovCisjZGVmaW5lIE1PREYJCTB4MDAwMgkJLyogTW9kZSBGYXVsdCBFcnJvciAoQW5vdGhlciBEZXZpY2UgVHJpZWQgVG8gQmVjb21lIE1hc3RlcikJCSovCisjZGVmaW5lIFRYRQkJCTB4MDAwNAkJLyogVHJhbnNtaXNzaW9uIEVycm9yIChEYXRhIFNlbnQgV2l0aCBObyBOZXcgRGF0YSBJbiBUREJSKQkJKi8KKyNkZWZpbmUgVFhTCQkJMHgwMDA4CQkvKiBTUElfVERCUiBEYXRhIEJ1ZmZlciBTdGF0dXMgKEZ1bGwvRW1wdHkqKQkJCQkJKi8KKyNkZWZpbmUgUkJTWQkJMHgwMDEwCQkvKiBSZWNlaXZlIEVycm9yIChEYXRhIFJlY2VpdmVkIFdpdGggUkRCUiBGdWxsKQkJCQkJKi8KKyNkZWZpbmUgUlhTCQkJMHgwMDIwCQkvKiBTUElfUkRCUiBEYXRhIEJ1ZmZlciBTdGF0dXMgKEZ1bGwvRW1wdHkqKQkJCQkJKi8KKyNkZWZpbmUgVFhDT0wJCTB4MDA0MAkJLyogVHJhbnNtaXQgQ29sbGlzaW9uIEVycm9yIChDb3JydXB0IERhdGEgTWF5IEhhdmUgQmVlbiBTZW50KQkqLworCisKKy8qICAqKioqKioqKioqKioqKioqICBHRU5FUkFMIFBVUlBPU0UgVElNRVIgTUFTS1MgICoqKioqKioqKioqKioqKioqKioqKiovCisvKiBUSU1FUl9FTkFCTEUgTWFza3MJCQkJCQkJCQkJCQkJKi8KKyNkZWZpbmUgVElNRU4wCQkJMHgwMDAxCQkvKiBFbmFibGUgVGltZXIgMAkJCQkJKi8KKyNkZWZpbmUgVElNRU4xCQkJMHgwMDAyCQkvKiBFbmFibGUgVGltZXIgMQkJCQkJKi8KKyNkZWZpbmUgVElNRU4yCQkJMHgwMDA0CQkvKiBFbmFibGUgVGltZXIgMgkJCQkJKi8KKyNkZWZpbmUgVElNRU4zCQkJMHgwMDA4CQkvKiBFbmFibGUgVGltZXIgMwkJCQkJKi8KKyNkZWZpbmUgVElNRU40CQkJMHgwMDEwCQkvKiBFbmFibGUgVGltZXIgNAkJCQkJKi8KKyNkZWZpbmUgVElNRU41CQkJMHgwMDIwCQkvKiBFbmFibGUgVGltZXIgNQkJCQkJKi8KKyNkZWZpbmUgVElNRU42CQkJMHgwMDQwCQkvKiBFbmFibGUgVGltZXIgNgkJCQkJKi8KKyNkZWZpbmUgVElNRU43CQkJMHgwMDgwCQkvKiBFbmFibGUgVGltZXIgNwkJCQkJKi8KKworLyogVElNRVJfRElTQUJMRSBNYXNrcwkJCQkJCQkJCQkJCQkqLworI2RlZmluZSBUSU1ESVMwCQkJVElNRU4wCQkvKiBEaXNhYmxlIFRpbWVyIDAJCQkJCSovCisjZGVmaW5lIFRJTURJUzEJCQlUSU1FTjEJCS8qIERpc2FibGUgVGltZXIgMQkJCQkJKi8KKyNkZWZpbmUgVElNRElTMgkJCVRJTUVOMgkJLyogRGlzYWJsZSBUaW1lciAyCQkJCQkqLworI2RlZmluZSBUSU1ESVMzCQkJVElNRU4zCQkvKiBEaXNhYmxlIFRpbWVyIDMJCQkJCSovCisjZGVmaW5lIFRJTURJUzQJCQlUSU1FTjQJCS8qIERpc2FibGUgVGltZXIgNAkJCQkJKi8KKyNkZWZpbmUgVElNRElTNQkJCVRJTUVONQkJLyogRGlzYWJsZSBUaW1lciA1CQkJCQkqLworI2RlZmluZSBUSU1ESVM2CQkJVElNRU42CQkvKiBEaXNhYmxlIFRpbWVyIDYJCQkJCSovCisjZGVmaW5lIFRJTURJUzcJCQlUSU1FTjcJCS8qIERpc2FibGUgVGltZXIgNwkJCQkJKi8KKworLyogVElNRVJfU1RBVFVTIE1hc2tzCQkJCQkJCQkJCQkJCSovCisjZGVmaW5lIFRJTUlMMAkJCTB4MDAwMDAwMDEJLyogVGltZXIgMCBJbnRlcnJ1cHQJCQkJKi8KKyNkZWZpbmUgVElNSUwxCQkJMHgwMDAwMDAwMgkvKiBUaW1lciAxIEludGVycnVwdAkJCQkqLworI2RlZmluZSBUSU1JTDIJCQkweDAwMDAwMDA0CS8qIFRpbWVyIDIgSW50ZXJydXB0CQkJCSovCisjZGVmaW5lIFRJTUlMMwkJCTB4MDAwMDAwMDgJLyogVGltZXIgMyBJbnRlcnJ1cHQJCQkJKi8KKyNkZWZpbmUgVE9WRl9FUlIwCQkweDAwMDAwMDEwCS8qIFRpbWVyIDAgQ291bnRlciBPdmVyZmxvdwkJCSovCisjZGVmaW5lIFRPVkZfRVJSMQkJMHgwMDAwMDAyMAkvKiBUaW1lciAxIENvdW50ZXIgT3ZlcmZsb3cJCQkqLworI2RlZmluZSBUT1ZGX0VSUjIJCTB4MDAwMDAwNDAJLyogVGltZXIgMiBDb3VudGVyIE92ZXJmbG93CQkJKi8KKyNkZWZpbmUgVE9WRl9FUlIzCQkweDAwMDAwMDgwCS8qIFRpbWVyIDMgQ291bnRlciBPdmVyZmxvdwkJCSovCisjZGVmaW5lIFRSVU4wCQkJMHgwMDAwMTAwMAkvKiBUaW1lciAwIFNsYXZlIEVuYWJsZSBTdGF0dXMJCSovCisjZGVmaW5lIFRSVU4xCQkJMHgwMDAwMjAwMAkvKiBUaW1lciAxIFNsYXZlIEVuYWJsZSBTdGF0dXMJCSovCisjZGVmaW5lIFRSVU4yCQkJMHgwMDAwNDAwMAkvKiBUaW1lciAyIFNsYXZlIEVuYWJsZSBTdGF0dXMJCSovCisjZGVmaW5lIFRSVU4zCQkJMHgwMDAwODAwMAkvKiBUaW1lciAzIFNsYXZlIEVuYWJsZSBTdGF0dXMJCSovCisjZGVmaW5lIFRJTUlMNAkJCTB4MDAwMTAwMDAJLyogVGltZXIgNCBJbnRlcnJ1cHQJCQkJKi8KKyNkZWZpbmUgVElNSUw1CQkJMHgwMDAyMDAwMAkvKiBUaW1lciA1IEludGVycnVwdAkJCQkqLworI2RlZmluZSBUSU1JTDYJCQkweDAwMDQwMDAwCS8qIFRpbWVyIDYgSW50ZXJydXB0CQkJCSovCisjZGVmaW5lIFRJTUlMNwkJCTB4MDAwODAwMDAJLyogVGltZXIgNyBJbnRlcnJ1cHQJCQkJKi8KKyNkZWZpbmUgVE9WRl9FUlI0CQkweDAwMTAwMDAwCS8qIFRpbWVyIDQgQ291bnRlciBPdmVyZmxvdwkJCSovCisjZGVmaW5lIFRPVkZfRVJSNQkJMHgwMDIwMDAwMAkvKiBUaW1lciA1IENvdW50ZXIgT3ZlcmZsb3cJCQkqLworI2RlZmluZSBUT1ZGX0VSUjYJCTB4MDA0MDAwMDAJLyogVGltZXIgNiBDb3VudGVyIE92ZXJmbG93CQkJKi8KKyNkZWZpbmUgVE9WRl9FUlI3CQkweDAwODAwMDAwCS8qIFRpbWVyIDcgQ291bnRlciBPdmVyZmxvdwkJCSovCisjZGVmaW5lIFRSVU40CQkJMHgxMDAwMDAwMAkvKiBUaW1lciA0IFNsYXZlIEVuYWJsZSBTdGF0dXMJCSovCisjZGVmaW5lIFRSVU41CQkJMHgyMDAwMDAwMAkvKiBUaW1lciA1IFNsYXZlIEVuYWJsZSBTdGF0dXMJCSovCisjZGVmaW5lIFRSVU42CQkJMHg0MDAwMDAwMAkvKiBUaW1lciA2IFNsYXZlIEVuYWJsZSBTdGF0dXMJCSovCisjZGVmaW5lIFRSVU43CQkJMHg4MDAwMDAwMAkvKiBUaW1lciA3IFNsYXZlIEVuYWJsZSBTdGF0dXMJCSovCisKKy8qIEFsdGVybmF0ZSBEZXByZWNhdGVkIE1hY3JvcyBQcm92aWRlZCBGb3IgQmFja3dhcmRzIENvZGUgQ29tcGF0aWJpbGl0eSAqLworI2RlZmluZSBUT1ZMX0VSUjAgVE9WRl9FUlIwCisjZGVmaW5lIFRPVkxfRVJSMSBUT1ZGX0VSUjEKKyNkZWZpbmUgVE9WTF9FUlIyIFRPVkZfRVJSMgorI2RlZmluZSBUT1ZMX0VSUjMgVE9WRl9FUlIzCisjZGVmaW5lIFRPVkxfRVJSNCBUT1ZGX0VSUjQKKyNkZWZpbmUgVE9WTF9FUlI1IFRPVkZfRVJSNQorI2RlZmluZSBUT1ZMX0VSUjYgVE9WRl9FUlI2CisjZGVmaW5lIFRPVkxfRVJSNyBUT1ZGX0VSUjcKKworLyogVElNRVJ4X0NPTkZJRyBNYXNrcwkJCQkJCQkJCQkJCQkqLworI2RlZmluZSBQV01fT1VUCQkJMHgwMDAxCS8qIFB1bHNlLVdpZHRoIE1vZHVsYXRpb24gT3V0cHV0IE1vZGUJKi8KKyNkZWZpbmUgV0RUSF9DQVAJCTB4MDAwMgkvKiBXaWR0aCBDYXB0dXJlIElucHV0IE1vZGUJCQkJKi8KKyNkZWZpbmUgRVhUX0NMSwkJCTB4MDAwMwkvKiBFeHRlcm5hbCBDbG9jayBNb2RlCQkJCQkqLworI2RlZmluZSBQVUxTRV9ISQkJMHgwMDA0CS8qIEFjdGlvbiBQdWxzZSAoUG9zaXRpdmUvTmVnYXRpdmUqKQkqLworI2RlZmluZSBQRVJJT0RfQ05UCQkweDAwMDgJLyogUGVyaW9kIENvdW50CQkJCQkJCSovCisjZGVmaW5lIElSUV9FTkEJCQkweDAwMTAJLyogSW50ZXJydXB0IFJlcXVlc3QgRW5hYmxlCQkJCSovCisjZGVmaW5lIFRJTl9TRUwJCQkweDAwMjAJLyogVGltZXIgSW5wdXQgU2VsZWN0CQkJCQkqLworI2RlZmluZSBPVVRfRElTCQkJMHgwMDQwCS8qIE91dHB1dCBQYWQgRGlzYWJsZQkJCQkJKi8KKyNkZWZpbmUgQ0xLX1NFTAkJCTB4MDA4MAkvKiBUaW1lciBDbG9jayBTZWxlY3QJCQkJCSovCisjZGVmaW5lIFRPR0dMRV9ISQkJMHgwMTAwCS8qIFBXTV9PVVQgUFVMU0VfSEkgVG9nZ2xlIE1vZGUJCQkqLworI2RlZmluZSBFTVVfUlVOCQkJMHgwMjAwCS8qIEVtdWxhdGlvbiBCZWhhdmlvciBTZWxlY3QJCQkqLworI2RlZmluZSBFUlJfVFlQCQkJMHhDMDAwCS8qIEVycm9yIFR5cGUJCQkJCQkJKi8KKworCisvKiAqKioqKioqKioqKioqKioqKiogICBHUElPIFBPUlRTIEYsIEcsIEggTUFTS1MgICoqKioqKioqKioqKioqKioqKioqKioqLworLyogIEdlbmVyYWwgUHVycG9zZSBJTyAoMHhGRkMwMDcwMCAtIDB4RkZDMDA3RkYpICBNYXNrcyAJCQkJKi8KKy8qIFBvcnQgRiBNYXNrcyAJCQkJCQkJCQkJCQkJCSovCisjZGVmaW5lIFBGMAkJMHgwMDAxCisjZGVmaW5lIFBGMQkJMHgwMDAyCisjZGVmaW5lIFBGMgkJMHgwMDA0CisjZGVmaW5lIFBGMwkJMHgwMDA4CisjZGVmaW5lIFBGNAkJMHgwMDEwCisjZGVmaW5lIFBGNQkJMHgwMDIwCisjZGVmaW5lIFBGNgkJMHgwMDQwCisjZGVmaW5lIFBGNwkJMHgwMDgwCisjZGVmaW5lIFBGOAkJMHgwMTAwCisjZGVmaW5lIFBGOQkJMHgwMjAwCisjZGVmaW5lIFBGMTAJMHgwNDAwCisjZGVmaW5lIFBGMTEJMHgwODAwCisjZGVmaW5lIFBGMTIJMHgxMDAwCisjZGVmaW5lIFBGMTMJMHgyMDAwCisjZGVmaW5lIFBGMTQJMHg0MDAwCisjZGVmaW5lIFBGMTUJMHg4MDAwCisKKy8qIFBvcnQgRyBNYXNrcwkJCQkJCQkJCQkJCQkJCSovCisjZGVmaW5lIFBHMAkJMHgwMDAxCisjZGVmaW5lIFBHMQkJMHgwMDAyCisjZGVmaW5lIFBHMgkJMHgwMDA0CisjZGVmaW5lIFBHMwkJMHgwMDA4CisjZGVmaW5lIFBHNAkJMHgwMDEwCisjZGVmaW5lIFBHNQkJMHgwMDIwCisjZGVmaW5lIFBHNgkJMHgwMDQwCisjZGVmaW5lIFBHNwkJMHgwMDgwCisjZGVmaW5lIFBHOAkJMHgwMTAwCisjZGVmaW5lIFBHOQkJMHgwMjAwCisjZGVmaW5lIFBHMTAJMHgwNDAwCisjZGVmaW5lIFBHMTEJMHgwODAwCisjZGVmaW5lIFBHMTIJMHgxMDAwCisjZGVmaW5lIFBHMTMJMHgyMDAwCisjZGVmaW5lIFBHMTQJMHg0MDAwCisjZGVmaW5lIFBHMTUJMHg4MDAwCisKKy8qIFBvcnQgSCBNYXNrcwkJCQkJCQkJCQkJCQkJCSovCisjZGVmaW5lIFBIMAkJMHgwMDAxCisjZGVmaW5lIFBIMQkJMHgwMDAyCisjZGVmaW5lIFBIMgkJMHgwMDA0CisjZGVmaW5lIFBIMwkJMHgwMDA4CisjZGVmaW5lIFBINAkJMHgwMDEwCisjZGVmaW5lIFBINQkJMHgwMDIwCisjZGVmaW5lIFBINgkJMHgwMDQwCisjZGVmaW5lIFBINwkJMHgwMDgwCisKKworLyogKioqKioqKioqKioqKioqKioqKiAgU0VSSUFMIFBPUlQgTUFTS1MgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogU1BPUlR4X1RDUjEgTWFza3MJCQkJCQkJCQkJCQkJCQkqLworI2RlZmluZSBUU1BFTgkJMHgwMDAxCQkvKiBUcmFuc21pdCBFbmFibGUJCQkJCQkJCSovCisjZGVmaW5lIElUQ0xLCQkweDAwMDIJCS8qIEludGVybmFsIFRyYW5zbWl0IENsb2NrIFNlbGVjdAkJCQkqLworI2RlZmluZSBEVFlQRV9OT1JNCTB4MDAwNAkJLyogRGF0YSBGb3JtYXQgTm9ybWFsCQkJCQkJCSovCisjZGVmaW5lIERUWVBFX1VMQVcJMHgwMDA4CQkvKiBDb21wYW5kIFVzaW5nIHUtTGF3CQkJCQkJCSovCisjZGVmaW5lIERUWVBFX0FMQVcJMHgwMDBDCQkvKiBDb21wYW5kIFVzaW5nIEEtTGF3CQkJCQkJCSovCisjZGVmaW5lIFRMU0JJVAkJMHgwMDEwCQkvKiBUcmFuc21pdCBCaXQgT3JkZXIJCQkJCQkJKi8KKyNkZWZpbmUgSVRGUwkJMHgwMjAwCQkvKiBJbnRlcm5hbCBUcmFuc21pdCBGcmFtZSBTeW5jIFNlbGVjdAkJCSovCisjZGVmaW5lIFRGU1IJCTB4MDQwMAkJLyogVHJhbnNtaXQgRnJhbWUgU3luYyBSZXF1aXJlZCBTZWxlY3QJCQkqLworI2RlZmluZSBESVRGUwkJMHgwODAwCQkvKiBEYXRhLUluZGVwZW5kZW50IFRyYW5zbWl0IEZyYW1lIFN5bmMgU2VsZWN0CSovCisjZGVmaW5lIExURlMJCTB4MTAwMAkJLyogTG93IFRyYW5zbWl0IEZyYW1lIFN5bmMgU2VsZWN0CQkJCSovCisjZGVmaW5lIExBVEZTCQkweDIwMDAJCS8qIExhdGUgVHJhbnNtaXQgRnJhbWUgU3luYyBTZWxlY3QJCQkJKi8KKyNkZWZpbmUgVENLRkUJCTB4NDAwMAkJLyogQ2xvY2sgRmFsbGluZyBFZGdlIFNlbGVjdAkJCQkJKi8KKworLyogU1BPUlR4X1RDUjIgTWFza3MgYW5kIE1hY3JvCQkJCQkJCQkJCQkJCSovCisjZGVmaW5lIFNMRU4oeCkJCSgoeCkmMHgxRikJLyogU1BPUlQgVFggV29yZCBMZW5ndGggKDIgLSAzMSkJCQkJKi8KKyNkZWZpbmUgVFhTRQkJMHgwMTAwCQkvKiBUWCBTZWNvbmRhcnkgRW5hYmxlCQkJCQkJCSovCisjZGVmaW5lIFRTRlNFCQkweDAyMDAJCS8qIFRyYW5zbWl0IFN0ZXJlbyBGcmFtZSBTeW5jIEVuYWJsZQkJCSovCisjZGVmaW5lIFRSRlNUCQkweDA0MDAJCS8qIExlZnQvUmlnaHQgT3JkZXIgKDEgPSBSaWdodCBDaGFubmVsIDFzdCkJCSovCisKKy8qIFNQT1JUeF9SQ1IxIE1hc2tzCQkJCQkJCQkJCQkJCQkJKi8KKyNkZWZpbmUgUlNQRU4JCTB4MDAwMQkJLyogUmVjZWl2ZSBFbmFibGUgCQkJCQkJCQkqLworI2RlZmluZSBJUkNMSwkJMHgwMDAyCQkvKiBJbnRlcm5hbCBSZWNlaXZlIENsb2NrIFNlbGVjdCAJCQkJKi8KKyNkZWZpbmUgRFRZUEVfTk9STQkweDAwMDQJCS8qIERhdGEgRm9ybWF0IE5vcm1hbAkJCQkJCQkqLworI2RlZmluZSBEVFlQRV9VTEFXCTB4MDAwOAkJLyogQ29tcGFuZCBVc2luZyB1LUxhdwkJCQkJCQkqLworI2RlZmluZSBEVFlQRV9BTEFXCTB4MDAwQwkJLyogQ29tcGFuZCBVc2luZyBBLUxhdwkJCQkJCQkqLworI2RlZmluZSBSTFNCSVQJCTB4MDAxMAkJLyogUmVjZWl2ZSBCaXQgT3JkZXIJCQkJCQkJKi8KKyNkZWZpbmUgSVJGUwkJMHgwMjAwCQkvKiBJbnRlcm5hbCBSZWNlaXZlIEZyYW1lIFN5bmMgU2VsZWN0IAkJCSovCisjZGVmaW5lIFJGU1IJCTB4MDQwMAkJLyogUmVjZWl2ZSBGcmFtZSBTeW5jIFJlcXVpcmVkIFNlbGVjdCAJCQkqLworI2RlZmluZSBMUkZTCQkweDEwMDAJCS8qIExvdyBSZWNlaXZlIEZyYW1lIFN5bmMgU2VsZWN0IAkJCQkqLworI2RlZmluZSBMQVJGUwkJMHgyMDAwCQkvKiBMYXRlIFJlY2VpdmUgRnJhbWUgU3luYyBTZWxlY3QgCQkJCSovCisjZGVmaW5lIFJDS0ZFCQkweDQwMDAJCS8qIENsb2NrIEZhbGxpbmcgRWRnZSBTZWxlY3QgCQkJCQkqLworCisvKiBTUE9SVHhfUkNSMiBNYXNrcwkJCQkJCQkJCQkJCQkJCSovCisjZGVmaW5lIFNMRU4oeCkJCSgoeCkmMHgxRikJLyogU1BPUlQgUlggV29yZCBMZW5ndGggKDIgLSAzMSkJCQkJKi8KKyNkZWZpbmUgUlhTRQkJMHgwMTAwCQkvKiBSWCBTZWNvbmRhcnkgRW5hYmxlCQkJCQkJCSovCisjZGVmaW5lIFJTRlNFCQkweDAyMDAJCS8qIFJYIFN0ZXJlbyBGcmFtZSBTeW5jIEVuYWJsZQkJCQkJKi8KKyNkZWZpbmUgUlJGU1QJCTB4MDQwMAkJLyogUmlnaHQtRmlyc3QgRGF0YSBPcmRlciAJCQkJCQkqLworCisvKiBTUE9SVHhfU1RBVCBNYXNrcwkJCQkJCQkJCQkJCQkJCSovCisjZGVmaW5lIFJYTkUJCTB4MDAwMQkJLyogUmVjZWl2ZSBGSUZPIE5vdCBFbXB0eSBTdGF0dXMJCQkJKi8KKyNkZWZpbmUgUlVWRgkJMHgwMDAyCQkvKiBTdGlja3kgUmVjZWl2ZSBVbmRlcmZsb3cgU3RhdHVzCQkJCSovCisjZGVmaW5lIFJPVkYJCTB4MDAwNAkJLyogU3RpY2t5IFJlY2VpdmUgT3ZlcmZsb3cgU3RhdHVzCQkJCSovCisjZGVmaW5lIFRYRgkJCTB4MDAwOAkJLyogVHJhbnNtaXQgRklGTyBGdWxsIFN0YXR1cwkJCQkJKi8KKyNkZWZpbmUgVFVWRgkJMHgwMDEwCQkvKiBTdGlja3kgVHJhbnNtaXQgVW5kZXJmbG93IFN0YXR1cwkJCQkqLworI2RlZmluZSBUT1ZGCQkweDAwMjAJCS8qIFN0aWNreSBUcmFuc21pdCBPdmVyZmxvdyBTdGF0dXMJCQkJKi8KKyNkZWZpbmUgVFhIUkUJCTB4MDA0MAkJLyogVHJhbnNtaXQgSG9sZCBSZWdpc3RlciBFbXB0eQkJCQkJKi8KKworLyogU1BPUlR4X01DTUMxIE1hY3JvcwkJCQkJCQkJCQkJCQkJCSovCisjZGVmaW5lIFNQX1dPRkYoeCkJKCh4KSAmIDB4M0ZGKSAJLyogTXVsdGljaGFubmVsIFdpbmRvdyBPZmZzZXQgRmllbGQJCQkqLworCisvKiBPbmx5IHVzZSBXU0laRSBNYWNybyBXaXRoIExvZ2ljIE9SIFdoaWxlIFNldHRpbmcgTG93ZXIgT3JkZXIgQml0cwkJCQkJCSovCisjZGVmaW5lIFNQX1dTSVpFKHgpCSgoKCgoeCk+PjB4MyktMSkmMHhGKSA8PCAweEMpCS8qIE11bHRpY2hhbm5lbCBXaW5kb3cgU2l6ZSA9ICh4LzgpLTEJKi8KKworLyogU1BPUlR4X01DTUMyIE1hc2tzCQkJCQkJCQkJCQkJCQkJKi8KKyNkZWZpbmUgUkVDX0JZUEFTUwkweDAwMDAJCS8qIEJ5cGFzcyBNb2RlIChObyBDbG9jayBSZWNvdmVyeSkJCQkJKi8KKyNkZWZpbmUgUkVDXzJGUk9NNAkweDAwMDIJCS8qIFJlY292ZXIgMiBNSHogQ2xvY2sgZnJvbSA0IE1IeiBDbG9jawkJCSovCisjZGVmaW5lIFJFQ184RlJPTTE2CTB4MDAwMwkJLyogUmVjb3ZlciA4IE1IeiBDbG9jayBmcm9tIDE2IE1IeiBDbG9jawkJKi8KKyNkZWZpbmUgTUNEVFhQRQkJMHgwMDA0IAkJLyogTXVsdGljaGFubmVsIERNQSBUcmFuc21pdCBQYWNraW5nCQkJKi8KKyNkZWZpbmUgTUNEUlhQRQkJMHgwMDA4IAkJLyogTXVsdGljaGFubmVsIERNQSBSZWNlaXZlIFBhY2tpbmcJCQkJKi8KKyNkZWZpbmUgTUNNRU4JCTB4MDAxMCAJCS8qIE11bHRpY2hhbm5lbCBGcmFtZSBNb2RlIEVuYWJsZQkJCQkqLworI2RlZmluZSBGU0RSCQkweDAwODAgCQkvKiBNdWx0aWNoYW5uZWwgRnJhbWUgU3luYyB0byBEYXRhIFJlbGF0aW9uc2hpcAkqLworI2RlZmluZSBNRkRfMAkJMHgwMDAwCQkvKiBNdWx0aWNoYW5uZWwgRnJhbWUgRGVsYXkgPSAwCQkJCQkqLworI2RlZmluZSBNRkRfMQkJMHgxMDAwCQkvKiBNdWx0aWNoYW5uZWwgRnJhbWUgRGVsYXkgPSAxCQkJCQkqLworI2RlZmluZSBNRkRfMgkJMHgyMDAwCQkvKiBNdWx0aWNoYW5uZWwgRnJhbWUgRGVsYXkgPSAyCQkJCQkqLworI2RlZmluZSBNRkRfMwkJMHgzMDAwCQkvKiBNdWx0aWNoYW5uZWwgRnJhbWUgRGVsYXkgPSAzCQkJCQkqLworI2RlZmluZSBNRkRfNAkJMHg0MDAwCQkvKiBNdWx0aWNoYW5uZWwgRnJhbWUgRGVsYXkgPSA0CQkJCQkqLworI2RlZmluZSBNRkRfNQkJMHg1MDAwCQkvKiBNdWx0aWNoYW5uZWwgRnJhbWUgRGVsYXkgPSA1CQkJCQkqLworI2RlZmluZSBNRkRfNgkJMHg2MDAwCQkvKiBNdWx0aWNoYW5uZWwgRnJhbWUgRGVsYXkgPSA2CQkJCQkqLworI2RlZmluZSBNRkRfNwkJMHg3MDAwCQkvKiBNdWx0aWNoYW5uZWwgRnJhbWUgRGVsYXkgPSA3CQkJCQkqLworI2RlZmluZSBNRkRfOAkJMHg4MDAwCQkvKiBNdWx0aWNoYW5uZWwgRnJhbWUgRGVsYXkgPSA4CQkJCQkqLworI2RlZmluZSBNRkRfOQkJMHg5MDAwCQkvKiBNdWx0aWNoYW5uZWwgRnJhbWUgRGVsYXkgPSA5CQkJCQkqLworI2RlZmluZSBNRkRfMTAJCTB4QTAwMAkJLyogTXVsdGljaGFubmVsIEZyYW1lIERlbGF5ID0gMTAJCQkJKi8KKyNkZWZpbmUgTUZEXzExCQkweEIwMDAJCS8qIE11bHRpY2hhbm5lbCBGcmFtZSBEZWxheSA9IDExCQkJCSovCisjZGVmaW5lIE1GRF8xMgkJMHhDMDAwCQkvKiBNdWx0aWNoYW5uZWwgRnJhbWUgRGVsYXkgPSAxMgkJCQkqLworI2RlZmluZSBNRkRfMTMJCTB4RDAwMAkJLyogTXVsdGljaGFubmVsIEZyYW1lIERlbGF5ID0gMTMJCQkJKi8KKyNkZWZpbmUgTUZEXzE0CQkweEUwMDAJCS8qIE11bHRpY2hhbm5lbCBGcmFtZSBEZWxheSA9IDE0CQkJCSovCisjZGVmaW5lIE1GRF8xNQkJMHhGMDAwCQkvKiBNdWx0aWNoYW5uZWwgRnJhbWUgRGVsYXkgPSAxNQkJCQkqLworCisKKy8qICoqKioqKioqKioqKioqKioqKioqKiAgQVNZTkNIUk9OT1VTIE1FTU9SWSBDT05UUk9MTEVSIE1BU0tTICAqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogRUJJVV9BTUdDVEwgTWFza3MJCQkJCQkJCQkJCQkJCQkJCSovCisjZGVmaW5lIEFNQ0tFTgkJCTB4MDAwMQkJLyogRW5hYmxlIENMS09VVAkJCQkJCQkJCSovCisjZGVmaW5lCUFNQkVOX05PTkUJCTB4MDAwMAkJLyogQWxsIEJhbmtzIERpc2FibGVkCQkJCQkJCQkqLworI2RlZmluZSBBTUJFTl9CMAkJMHgwMDAyCQkvKiBFbmFibGUgQXN5bmMgTWVtb3J5IEJhbmsgMCBvbmx5CQkJCQkqLworI2RlZmluZSBBTUJFTl9CMF9CMQkJMHgwMDA0CQkvKiBFbmFibGUgQXN5bmMgTWVtb3J5IEJhbmtzIDAgJiAxIG9ubHkJCQkJKi8KKyNkZWZpbmUgQU1CRU5fQjBfQjFfQjIJMHgwMDA2CQkvKiBFbmFibGUgQXN5bmMgTWVtb3J5IEJhbmtzIDAsIDEsIGFuZCAyCQkJKi8KKyNkZWZpbmUgQU1CRU5fQUxMCQkweDAwMDgJCS8qIEVuYWJsZSBBc3luYyBNZW1vcnkgQmFua3MgKGFsbCkgMCwgMSwgMiwgYW5kIDMJKi8KKworLyogRUJJVV9BTUJDVEwwIE1hc2tzCQkJCQkJCQkJCQkJCQkJCQkqLworI2RlZmluZSBCMFJEWUVOCQkJMHgwMDAwMDAwMSAgLyogQmFuayAwIChCMCkgUkRZIEVuYWJsZQkJCQkJCQkqLworI2RlZmluZSBCMFJEWVBPTAkJMHgwMDAwMDAwMiAgLyogQjAgUkRZIEFjdGl2ZSBIaWdoCQkJCQkJCQkqLworI2RlZmluZSBCMFRUXzEJCQkweDAwMDAwMDA0ICAvKiBCMCBUcmFuc2l0aW9uIFRpbWUgKFJlYWQgdG8gV3JpdGUpID0gMSBjeWNsZQkJKi8KKyNkZWZpbmUgQjBUVF8yCQkJMHgwMDAwMDAwOCAgLyogQjAgVHJhbnNpdGlvbiBUaW1lIChSZWFkIHRvIFdyaXRlKSA9IDIgY3ljbGVzCSovCisjZGVmaW5lIEIwVFRfMwkJCTB4MDAwMDAwMEMgIC8qIEIwIFRyYW5zaXRpb24gVGltZSAoUmVhZCB0byBXcml0ZSkgPSAzIGN5Y2xlcwkqLworI2RlZmluZSBCMFRUXzQJCQkweDAwMDAwMDAwICAvKiBCMCBUcmFuc2l0aW9uIFRpbWUgKFJlYWQgdG8gV3JpdGUpID0gNCBjeWNsZXMJKi8KKyNkZWZpbmUgQjBTVF8xCQkJMHgwMDAwMDAxMCAgLyogQjAgU2V0dXAgVGltZSAoQU9FIHRvIFJlYWQvV3JpdGUpID0gMSBjeWNsZQkJKi8KKyNkZWZpbmUgQjBTVF8yCQkJMHgwMDAwMDAyMCAgLyogQjAgU2V0dXAgVGltZSAoQU9FIHRvIFJlYWQvV3JpdGUpID0gMiBjeWNsZXMJCSovCisjZGVmaW5lIEIwU1RfMwkJCTB4MDAwMDAwMzAgIC8qIEIwIFNldHVwIFRpbWUgKEFPRSB0byBSZWFkL1dyaXRlKSA9IDMgY3ljbGVzCQkqLworI2RlZmluZSBCMFNUXzQJCQkweDAwMDAwMDAwICAvKiBCMCBTZXR1cCBUaW1lIChBT0UgdG8gUmVhZC9Xcml0ZSkgPSA0IGN5Y2xlcwkJKi8KKyNkZWZpbmUgQjBIVF8xCQkJMHgwMDAwMDA0MCAgLyogQjAgSG9sZCBUaW1lICh+UmVhZC9Xcml0ZSB0byB+QU9FKSA9IDEgY3ljbGUJCSovCisjZGVmaW5lIEIwSFRfMgkJCTB4MDAwMDAwODAgIC8qIEIwIEhvbGQgVGltZSAoflJlYWQvV3JpdGUgdG8gfkFPRSkgPSAyIGN5Y2xlcwkqLworI2RlZmluZSBCMEhUXzMJCQkweDAwMDAwMEMwICAvKiBCMCBIb2xkIFRpbWUgKH5SZWFkL1dyaXRlIHRvIH5BT0UpID0gMyBjeWNsZXMJKi8KKyNkZWZpbmUgQjBIVF8wCQkJMHgwMDAwMDAwMCAgLyogQjAgSG9sZCBUaW1lICh+UmVhZC9Xcml0ZSB0byB+QU9FKSA9IDAgY3ljbGVzCSovCisjZGVmaW5lIEIwUkFUXzEJCQkweDAwMDAwMTAwICAvKiBCMCBSZWFkIEFjY2VzcyBUaW1lID0gMSBjeWNsZQkJCQkJKi8KKyNkZWZpbmUgQjBSQVRfMgkJCTB4MDAwMDAyMDAgIC8qIEIwIFJlYWQgQWNjZXNzIFRpbWUgPSAyIGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjBSQVRfMwkJCTB4MDAwMDAzMDAgIC8qIEIwIFJlYWQgQWNjZXNzIFRpbWUgPSAzIGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjBSQVRfNAkJCTB4MDAwMDA0MDAgIC8qIEIwIFJlYWQgQWNjZXNzIFRpbWUgPSA0IGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjBSQVRfNQkJCTB4MDAwMDA1MDAgIC8qIEIwIFJlYWQgQWNjZXNzIFRpbWUgPSA1IGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjBSQVRfNgkJCTB4MDAwMDA2MDAgIC8qIEIwIFJlYWQgQWNjZXNzIFRpbWUgPSA2IGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjBSQVRfNwkJCTB4MDAwMDA3MDAgIC8qIEIwIFJlYWQgQWNjZXNzIFRpbWUgPSA3IGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjBSQVRfOAkJCTB4MDAwMDA4MDAgIC8qIEIwIFJlYWQgQWNjZXNzIFRpbWUgPSA4IGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjBSQVRfOQkJCTB4MDAwMDA5MDAgIC8qIEIwIFJlYWQgQWNjZXNzIFRpbWUgPSA5IGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjBSQVRfMTAJCTB4MDAwMDBBMDAgIC8qIEIwIFJlYWQgQWNjZXNzIFRpbWUgPSAxMCBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIwUkFUXzExCQkweDAwMDAwQjAwICAvKiBCMCBSZWFkIEFjY2VzcyBUaW1lID0gMTEgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMFJBVF8xMgkJMHgwMDAwMEMwMCAgLyogQjAgUmVhZCBBY2Nlc3MgVGltZSA9IDEyIGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjBSQVRfMTMJCTB4MDAwMDBEMDAgIC8qIEIwIFJlYWQgQWNjZXNzIFRpbWUgPSAxMyBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIwUkFUXzE0CQkweDAwMDAwRTAwICAvKiBCMCBSZWFkIEFjY2VzcyBUaW1lID0gMTQgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMFJBVF8xNQkJMHgwMDAwMEYwMCAgLyogQjAgUmVhZCBBY2Nlc3MgVGltZSA9IDE1IGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjBXQVRfMQkJCTB4MDAwMDEwMDAgIC8qIEIwIFdyaXRlIEFjY2VzcyBUaW1lID0gMSBjeWNsZQkJCQkJKi8KKyNkZWZpbmUgQjBXQVRfMgkJCTB4MDAwMDIwMDAgIC8qIEIwIFdyaXRlIEFjY2VzcyBUaW1lID0gMiBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIwV0FUXzMJCQkweDAwMDAzMDAwICAvKiBCMCBXcml0ZSBBY2Nlc3MgVGltZSA9IDMgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMFdBVF80CQkJMHgwMDAwNDAwMCAgLyogQjAgV3JpdGUgQWNjZXNzIFRpbWUgPSA0IGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjBXQVRfNQkJCTB4MDAwMDUwMDAgIC8qIEIwIFdyaXRlIEFjY2VzcyBUaW1lID0gNSBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIwV0FUXzYJCQkweDAwMDA2MDAwICAvKiBCMCBXcml0ZSBBY2Nlc3MgVGltZSA9IDYgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMFdBVF83CQkJMHgwMDAwNzAwMCAgLyogQjAgV3JpdGUgQWNjZXNzIFRpbWUgPSA3IGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjBXQVRfOAkJCTB4MDAwMDgwMDAgIC8qIEIwIFdyaXRlIEFjY2VzcyBUaW1lID0gOCBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIwV0FUXzkJCQkweDAwMDA5MDAwICAvKiBCMCBXcml0ZSBBY2Nlc3MgVGltZSA9IDkgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMFdBVF8xMAkJMHgwMDAwQTAwMCAgLyogQjAgV3JpdGUgQWNjZXNzIFRpbWUgPSAxMCBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIwV0FUXzExCQkweDAwMDBCMDAwICAvKiBCMCBXcml0ZSBBY2Nlc3MgVGltZSA9IDExIGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjBXQVRfMTIJCTB4MDAwMEMwMDAgIC8qIEIwIFdyaXRlIEFjY2VzcyBUaW1lID0gMTIgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMFdBVF8xMwkJMHgwMDAwRDAwMCAgLyogQjAgV3JpdGUgQWNjZXNzIFRpbWUgPSAxMyBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIwV0FUXzE0CQkweDAwMDBFMDAwICAvKiBCMCBXcml0ZSBBY2Nlc3MgVGltZSA9IDE0IGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjBXQVRfMTUJCTB4MDAwMEYwMDAgIC8qIEIwIFdyaXRlIEFjY2VzcyBUaW1lID0gMTUgY3ljbGVzCQkJCQkqLworCisjZGVmaW5lIEIxUkRZRU4JCQkweDAwMDEwMDAwICAvKiBCYW5rIDEgKEIxKSBSRFkgRW5hYmxlICAgICAgICAgICAgICAgICAgICAgICAJKi8KKyNkZWZpbmUgQjFSRFlQT0wJCTB4MDAwMjAwMDAgIC8qIEIxIFJEWSBBY3RpdmUgSGlnaCAgICAgICAgICAgICAgICAgICAgICAgICAgIAkqLworI2RlZmluZSBCMVRUXzEJCQkweDAwMDQwMDAwICAvKiBCMSBUcmFuc2l0aW9uIFRpbWUgKFJlYWQgdG8gV3JpdGUpID0gMSBjeWNsZSAJKi8KKyNkZWZpbmUgQjFUVF8yCQkJMHgwMDA4MDAwMCAgLyogQjEgVHJhbnNpdGlvbiBUaW1lIChSZWFkIHRvIFdyaXRlKSA9IDIgY3ljbGVzCSovCisjZGVmaW5lIEIxVFRfMwkJCTB4MDAwQzAwMDAgIC8qIEIxIFRyYW5zaXRpb24gVGltZSAoUmVhZCB0byBXcml0ZSkgPSAzIGN5Y2xlcwkqLworI2RlZmluZSBCMVRUXzQJCQkweDAwMDAwMDAwICAvKiBCMSBUcmFuc2l0aW9uIFRpbWUgKFJlYWQgdG8gV3JpdGUpID0gNCBjeWNsZXMJKi8KKyNkZWZpbmUgQjFTVF8xCQkJMHgwMDEwMDAwMCAgLyogQjEgU2V0dXAgVGltZSAoQU9FIHRvIFJlYWQvV3JpdGUpID0gMSBjeWNsZSAgCSovCisjZGVmaW5lIEIxU1RfMgkJCTB4MDAyMDAwMDAgIC8qIEIxIFNldHVwIFRpbWUgKEFPRSB0byBSZWFkL1dyaXRlKSA9IDIgY3ljbGVzIAkqLworI2RlZmluZSBCMVNUXzMJCQkweDAwMzAwMDAwICAvKiBCMSBTZXR1cCBUaW1lIChBT0UgdG8gUmVhZC9Xcml0ZSkgPSAzIGN5Y2xlcyAJKi8KKyNkZWZpbmUgQjFTVF80CQkJMHgwMDAwMDAwMCAgLyogQjEgU2V0dXAgVGltZSAoQU9FIHRvIFJlYWQvV3JpdGUpID0gNCBjeWNsZXMgCSovCisjZGVmaW5lIEIxSFRfMQkJCTB4MDA0MDAwMDAgIC8qIEIxIEhvbGQgVGltZSAoflJlYWQvV3JpdGUgdG8gfkFPRSkgPSAxIGN5Y2xlIAkqLworI2RlZmluZSBCMUhUXzIJCQkweDAwODAwMDAwICAvKiBCMSBIb2xkIFRpbWUgKH5SZWFkL1dyaXRlIHRvIH5BT0UpID0gMiBjeWNsZXMJKi8KKyNkZWZpbmUgQjFIVF8zCQkJMHgwMEMwMDAwMCAgLyogQjEgSG9sZCBUaW1lICh+UmVhZC9Xcml0ZSB0byB+QU9FKSA9IDMgY3ljbGVzCSovCisjZGVmaW5lIEIxSFRfMAkJCTB4MDAwMDAwMDAgIC8qIEIxIEhvbGQgVGltZSAoflJlYWQvV3JpdGUgdG8gfkFPRSkgPSAwIGN5Y2xlcwkqLworI2RlZmluZSBCMVJBVF8xCQkJMHgwMTAwMDAwMCAgLyogQjEgUmVhZCBBY2Nlc3MgVGltZSA9IDEgY3ljbGUJCQkJCSovCisjZGVmaW5lIEIxUkFUXzIJCQkweDAyMDAwMDAwICAvKiBCMSBSZWFkIEFjY2VzcyBUaW1lID0gMiBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIxUkFUXzMJCQkweDAzMDAwMDAwICAvKiBCMSBSZWFkIEFjY2VzcyBUaW1lID0gMyBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIxUkFUXzQJCQkweDA0MDAwMDAwICAvKiBCMSBSZWFkIEFjY2VzcyBUaW1lID0gNCBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIxUkFUXzUJCQkweDA1MDAwMDAwICAvKiBCMSBSZWFkIEFjY2VzcyBUaW1lID0gNSBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIxUkFUXzYJCQkweDA2MDAwMDAwICAvKiBCMSBSZWFkIEFjY2VzcyBUaW1lID0gNiBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIxUkFUXzcJCQkweDA3MDAwMDAwICAvKiBCMSBSZWFkIEFjY2VzcyBUaW1lID0gNyBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIxUkFUXzgJCQkweDA4MDAwMDAwICAvKiBCMSBSZWFkIEFjY2VzcyBUaW1lID0gOCBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIxUkFUXzkJCQkweDA5MDAwMDAwICAvKiBCMSBSZWFkIEFjY2VzcyBUaW1lID0gOSBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIxUkFUXzEwCQkweDBBMDAwMDAwICAvKiBCMSBSZWFkIEFjY2VzcyBUaW1lID0gMTAgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMVJBVF8xMQkJMHgwQjAwMDAwMCAgLyogQjEgUmVhZCBBY2Nlc3MgVGltZSA9IDExIGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjFSQVRfMTIJCTB4MEMwMDAwMDAgIC8qIEIxIFJlYWQgQWNjZXNzIFRpbWUgPSAxMiBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIxUkFUXzEzCQkweDBEMDAwMDAwICAvKiBCMSBSZWFkIEFjY2VzcyBUaW1lID0gMTMgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMVJBVF8xNAkJMHgwRTAwMDAwMCAgLyogQjEgUmVhZCBBY2Nlc3MgVGltZSA9IDE0IGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjFSQVRfMTUJCTB4MEYwMDAwMDAgIC8qIEIxIFJlYWQgQWNjZXNzIFRpbWUgPSAxNSBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIxV0FUXzEJCQkweDEwMDAwMDAwICAvKiBCMSBXcml0ZSBBY2Nlc3MgVGltZSA9IDEgY3ljbGUJCQkJCSovCisjZGVmaW5lIEIxV0FUXzIJCQkweDIwMDAwMDAwICAvKiBCMSBXcml0ZSBBY2Nlc3MgVGltZSA9IDIgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMVdBVF8zCQkJMHgzMDAwMDAwMCAgLyogQjEgV3JpdGUgQWNjZXNzIFRpbWUgPSAzIGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjFXQVRfNAkJCTB4NDAwMDAwMDAgIC8qIEIxIFdyaXRlIEFjY2VzcyBUaW1lID0gNCBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIxV0FUXzUJCQkweDUwMDAwMDAwICAvKiBCMSBXcml0ZSBBY2Nlc3MgVGltZSA9IDUgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMVdBVF82CQkJMHg2MDAwMDAwMCAgLyogQjEgV3JpdGUgQWNjZXNzIFRpbWUgPSA2IGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjFXQVRfNwkJCTB4NzAwMDAwMDAgIC8qIEIxIFdyaXRlIEFjY2VzcyBUaW1lID0gNyBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIxV0FUXzgJCQkweDgwMDAwMDAwICAvKiBCMSBXcml0ZSBBY2Nlc3MgVGltZSA9IDggY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMVdBVF85CQkJMHg5MDAwMDAwMCAgLyogQjEgV3JpdGUgQWNjZXNzIFRpbWUgPSA5IGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjFXQVRfMTAJCTB4QTAwMDAwMDAgIC8qIEIxIFdyaXRlIEFjY2VzcyBUaW1lID0gMTAgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMVdBVF8xMQkJMHhCMDAwMDAwMCAgLyogQjEgV3JpdGUgQWNjZXNzIFRpbWUgPSAxMSBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIxV0FUXzEyCQkweEMwMDAwMDAwICAvKiBCMSBXcml0ZSBBY2Nlc3MgVGltZSA9IDEyIGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjFXQVRfMTMJCTB4RDAwMDAwMDAgIC8qIEIxIFdyaXRlIEFjY2VzcyBUaW1lID0gMTMgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMVdBVF8xNAkJMHhFMDAwMDAwMCAgLyogQjEgV3JpdGUgQWNjZXNzIFRpbWUgPSAxNCBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIxV0FUXzE1CQkweEYwMDAwMDAwICAvKiBCMSBXcml0ZSBBY2Nlc3MgVGltZSA9IDE1IGN5Y2xlcwkJCQkJKi8KKworLyogRUJJVV9BTUJDVEwxIE1hc2tzCQkJCQkJCQkJCQkJCQkJCQkqLworI2RlZmluZSBCMlJEWUVOCQkJMHgwMDAwMDAwMSAgLyogQmFuayAyIChCMikgUkRZIEVuYWJsZQkJCQkJCQkqLworI2RlZmluZSBCMlJEWVBPTAkJMHgwMDAwMDAwMiAgLyogQjIgUkRZIEFjdGl2ZSBIaWdoCQkJCQkJCQkqLworI2RlZmluZSBCMlRUXzEJCQkweDAwMDAwMDA0ICAvKiBCMiBUcmFuc2l0aW9uIFRpbWUgKFJlYWQgdG8gV3JpdGUpID0gMSBjeWNsZQkJKi8KKyNkZWZpbmUgQjJUVF8yCQkJMHgwMDAwMDAwOCAgLyogQjIgVHJhbnNpdGlvbiBUaW1lIChSZWFkIHRvIFdyaXRlKSA9IDIgY3ljbGVzCSovCisjZGVmaW5lIEIyVFRfMwkJCTB4MDAwMDAwMEMgIC8qIEIyIFRyYW5zaXRpb24gVGltZSAoUmVhZCB0byBXcml0ZSkgPSAzIGN5Y2xlcwkqLworI2RlZmluZSBCMlRUXzQJCQkweDAwMDAwMDAwICAvKiBCMiBUcmFuc2l0aW9uIFRpbWUgKFJlYWQgdG8gV3JpdGUpID0gNCBjeWNsZXMJKi8KKyNkZWZpbmUgQjJTVF8xCQkJMHgwMDAwMDAxMCAgLyogQjIgU2V0dXAgVGltZSAoQU9FIHRvIFJlYWQvV3JpdGUpID0gMSBjeWNsZQkJKi8KKyNkZWZpbmUgQjJTVF8yCQkJMHgwMDAwMDAyMCAgLyogQjIgU2V0dXAgVGltZSAoQU9FIHRvIFJlYWQvV3JpdGUpID0gMiBjeWNsZXMJCSovCisjZGVmaW5lIEIyU1RfMwkJCTB4MDAwMDAwMzAgIC8qIEIyIFNldHVwIFRpbWUgKEFPRSB0byBSZWFkL1dyaXRlKSA9IDMgY3ljbGVzCQkqLworI2RlZmluZSBCMlNUXzQJCQkweDAwMDAwMDAwICAvKiBCMiBTZXR1cCBUaW1lIChBT0UgdG8gUmVhZC9Xcml0ZSkgPSA0IGN5Y2xlcwkJKi8KKyNkZWZpbmUgQjJIVF8xCQkJMHgwMDAwMDA0MCAgLyogQjIgSG9sZCBUaW1lICh+UmVhZC9Xcml0ZSB0byB+QU9FKSA9IDEgY3ljbGUJCSovCisjZGVmaW5lIEIySFRfMgkJCTB4MDAwMDAwODAgIC8qIEIyIEhvbGQgVGltZSAoflJlYWQvV3JpdGUgdG8gfkFPRSkgPSAyIGN5Y2xlcwkqLworI2RlZmluZSBCMkhUXzMJCQkweDAwMDAwMEMwICAvKiBCMiBIb2xkIFRpbWUgKH5SZWFkL1dyaXRlIHRvIH5BT0UpID0gMyBjeWNsZXMJKi8KKyNkZWZpbmUgQjJIVF8wCQkJMHgwMDAwMDAwMCAgLyogQjIgSG9sZCBUaW1lICh+UmVhZC9Xcml0ZSB0byB+QU9FKSA9IDAgY3ljbGVzCSovCisjZGVmaW5lIEIyUkFUXzEJCQkweDAwMDAwMTAwICAvKiBCMiBSZWFkIEFjY2VzcyBUaW1lID0gMSBjeWNsZQkJCQkJKi8KKyNkZWZpbmUgQjJSQVRfMgkJCTB4MDAwMDAyMDAgIC8qIEIyIFJlYWQgQWNjZXNzIFRpbWUgPSAyIGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjJSQVRfMwkJCTB4MDAwMDAzMDAgIC8qIEIyIFJlYWQgQWNjZXNzIFRpbWUgPSAzIGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjJSQVRfNAkJCTB4MDAwMDA0MDAgIC8qIEIyIFJlYWQgQWNjZXNzIFRpbWUgPSA0IGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjJSQVRfNQkJCTB4MDAwMDA1MDAgIC8qIEIyIFJlYWQgQWNjZXNzIFRpbWUgPSA1IGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjJSQVRfNgkJCTB4MDAwMDA2MDAgIC8qIEIyIFJlYWQgQWNjZXNzIFRpbWUgPSA2IGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjJSQVRfNwkJCTB4MDAwMDA3MDAgIC8qIEIyIFJlYWQgQWNjZXNzIFRpbWUgPSA3IGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjJSQVRfOAkJCTB4MDAwMDA4MDAgIC8qIEIyIFJlYWQgQWNjZXNzIFRpbWUgPSA4IGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjJSQVRfOQkJCTB4MDAwMDA5MDAgIC8qIEIyIFJlYWQgQWNjZXNzIFRpbWUgPSA5IGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjJSQVRfMTAJCTB4MDAwMDBBMDAgIC8qIEIyIFJlYWQgQWNjZXNzIFRpbWUgPSAxMCBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIyUkFUXzExCQkweDAwMDAwQjAwICAvKiBCMiBSZWFkIEFjY2VzcyBUaW1lID0gMTEgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMlJBVF8xMgkJMHgwMDAwMEMwMCAgLyogQjIgUmVhZCBBY2Nlc3MgVGltZSA9IDEyIGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjJSQVRfMTMJCTB4MDAwMDBEMDAgIC8qIEIyIFJlYWQgQWNjZXNzIFRpbWUgPSAxMyBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIyUkFUXzE0CQkweDAwMDAwRTAwICAvKiBCMiBSZWFkIEFjY2VzcyBUaW1lID0gMTQgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMlJBVF8xNQkJMHgwMDAwMEYwMCAgLyogQjIgUmVhZCBBY2Nlc3MgVGltZSA9IDE1IGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjJXQVRfMQkJCTB4MDAwMDEwMDAgIC8qIEIyIFdyaXRlIEFjY2VzcyBUaW1lID0gMSBjeWNsZQkJCQkJKi8KKyNkZWZpbmUgQjJXQVRfMgkJCTB4MDAwMDIwMDAgIC8qIEIyIFdyaXRlIEFjY2VzcyBUaW1lID0gMiBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIyV0FUXzMJCQkweDAwMDAzMDAwICAvKiBCMiBXcml0ZSBBY2Nlc3MgVGltZSA9IDMgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMldBVF80CQkJMHgwMDAwNDAwMCAgLyogQjIgV3JpdGUgQWNjZXNzIFRpbWUgPSA0IGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjJXQVRfNQkJCTB4MDAwMDUwMDAgIC8qIEIyIFdyaXRlIEFjY2VzcyBUaW1lID0gNSBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIyV0FUXzYJCQkweDAwMDA2MDAwICAvKiBCMiBXcml0ZSBBY2Nlc3MgVGltZSA9IDYgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMldBVF83CQkJMHgwMDAwNzAwMCAgLyogQjIgV3JpdGUgQWNjZXNzIFRpbWUgPSA3IGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjJXQVRfOAkJCTB4MDAwMDgwMDAgIC8qIEIyIFdyaXRlIEFjY2VzcyBUaW1lID0gOCBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIyV0FUXzkJCQkweDAwMDA5MDAwICAvKiBCMiBXcml0ZSBBY2Nlc3MgVGltZSA9IDkgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMldBVF8xMAkJMHgwMDAwQTAwMCAgLyogQjIgV3JpdGUgQWNjZXNzIFRpbWUgPSAxMCBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIyV0FUXzExCQkweDAwMDBCMDAwICAvKiBCMiBXcml0ZSBBY2Nlc3MgVGltZSA9IDExIGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjJXQVRfMTIJCTB4MDAwMEMwMDAgIC8qIEIyIFdyaXRlIEFjY2VzcyBUaW1lID0gMTIgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCMldBVF8xMwkJMHgwMDAwRDAwMCAgLyogQjIgV3JpdGUgQWNjZXNzIFRpbWUgPSAxMyBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIyV0FUXzE0CQkweDAwMDBFMDAwICAvKiBCMiBXcml0ZSBBY2Nlc3MgVGltZSA9IDE0IGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjJXQVRfMTUJCTB4MDAwMEYwMDAgIC8qIEIyIFdyaXRlIEFjY2VzcyBUaW1lID0gMTUgY3ljbGVzCQkJCQkqLworCisjZGVmaW5lIEIzUkRZRU4JCQkweDAwMDEwMDAwICAvKiBCYW5rIDMgKEIzKSBSRFkgRW5hYmxlCQkJCQkJCSovCisjZGVmaW5lIEIzUkRZUE9MCQkweDAwMDIwMDAwICAvKiBCMyBSRFkgQWN0aXZlIEhpZ2gJCQkJCQkJCSovCisjZGVmaW5lIEIzVFRfMQkJCTB4MDAwNDAwMDAgIC8qIEIzIFRyYW5zaXRpb24gVGltZSAoUmVhZCB0byBXcml0ZSkgPSAxIGN5Y2xlCQkqLworI2RlZmluZSBCM1RUXzIJCQkweDAwMDgwMDAwICAvKiBCMyBUcmFuc2l0aW9uIFRpbWUgKFJlYWQgdG8gV3JpdGUpID0gMiBjeWNsZXMJKi8KKyNkZWZpbmUgQjNUVF8zCQkJMHgwMDBDMDAwMCAgLyogQjMgVHJhbnNpdGlvbiBUaW1lIChSZWFkIHRvIFdyaXRlKSA9IDMgY3ljbGVzCSovCisjZGVmaW5lIEIzVFRfNAkJCTB4MDAwMDAwMDAgIC8qIEIzIFRyYW5zaXRpb24gVGltZSAoUmVhZCB0byBXcml0ZSkgPSA0IGN5Y2xlcwkqLworI2RlZmluZSBCM1NUXzEJCQkweDAwMTAwMDAwICAvKiBCMyBTZXR1cCBUaW1lIChBT0UgdG8gUmVhZC9Xcml0ZSkgPSAxIGN5Y2xlCQkqLworI2RlZmluZSBCM1NUXzIJCQkweDAwMjAwMDAwICAvKiBCMyBTZXR1cCBUaW1lIChBT0UgdG8gUmVhZC9Xcml0ZSkgPSAyIGN5Y2xlcwkJKi8KKyNkZWZpbmUgQjNTVF8zCQkJMHgwMDMwMDAwMCAgLyogQjMgU2V0dXAgVGltZSAoQU9FIHRvIFJlYWQvV3JpdGUpID0gMyBjeWNsZXMJCSovCisjZGVmaW5lIEIzU1RfNAkJCTB4MDAwMDAwMDAgIC8qIEIzIFNldHVwIFRpbWUgKEFPRSB0byBSZWFkL1dyaXRlKSA9IDQgY3ljbGVzCQkqLworI2RlZmluZSBCM0hUXzEJCQkweDAwNDAwMDAwICAvKiBCMyBIb2xkIFRpbWUgKH5SZWFkL1dyaXRlIHRvIH5BT0UpID0gMSBjeWNsZQkJKi8KKyNkZWZpbmUgQjNIVF8yCQkJMHgwMDgwMDAwMCAgLyogQjMgSG9sZCBUaW1lICh+UmVhZC9Xcml0ZSB0byB+QU9FKSA9IDIgY3ljbGVzCSovCisjZGVmaW5lIEIzSFRfMwkJCTB4MDBDMDAwMDAgIC8qIEIzIEhvbGQgVGltZSAoflJlYWQvV3JpdGUgdG8gfkFPRSkgPSAzIGN5Y2xlcwkqLworI2RlZmluZSBCM0hUXzAJCQkweDAwMDAwMDAwICAvKiBCMyBIb2xkIFRpbWUgKH5SZWFkL1dyaXRlIHRvIH5BT0UpID0gMCBjeWNsZXMJKi8KKyNkZWZpbmUgQjNSQVRfMQkJCTB4MDEwMDAwMDAgIC8qIEIzIFJlYWQgQWNjZXNzIFRpbWUgPSAxIGN5Y2xlCQkJCQkqLworI2RlZmluZSBCM1JBVF8yCQkJMHgwMjAwMDAwMCAgLyogQjMgUmVhZCBBY2Nlc3MgVGltZSA9IDIgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCM1JBVF8zCQkJMHgwMzAwMDAwMCAgLyogQjMgUmVhZCBBY2Nlc3MgVGltZSA9IDMgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCM1JBVF80CQkJMHgwNDAwMDAwMCAgLyogQjMgUmVhZCBBY2Nlc3MgVGltZSA9IDQgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCM1JBVF81CQkJMHgwNTAwMDAwMCAgLyogQjMgUmVhZCBBY2Nlc3MgVGltZSA9IDUgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCM1JBVF82CQkJMHgwNjAwMDAwMCAgLyogQjMgUmVhZCBBY2Nlc3MgVGltZSA9IDYgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCM1JBVF83CQkJMHgwNzAwMDAwMCAgLyogQjMgUmVhZCBBY2Nlc3MgVGltZSA9IDcgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCM1JBVF84CQkJMHgwODAwMDAwMCAgLyogQjMgUmVhZCBBY2Nlc3MgVGltZSA9IDggY3ljbGVzCQkJCQkqLworI2RlZmluZSBCM1JBVF85CQkJMHgwOTAwMDAwMCAgLyogQjMgUmVhZCBBY2Nlc3MgVGltZSA9IDkgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCM1JBVF8xMAkJMHgwQTAwMDAwMCAgLyogQjMgUmVhZCBBY2Nlc3MgVGltZSA9IDEwIGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjNSQVRfMTEJCTB4MEIwMDAwMDAgIC8qIEIzIFJlYWQgQWNjZXNzIFRpbWUgPSAxMSBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIzUkFUXzEyCQkweDBDMDAwMDAwICAvKiBCMyBSZWFkIEFjY2VzcyBUaW1lID0gMTIgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCM1JBVF8xMwkJMHgwRDAwMDAwMCAgLyogQjMgUmVhZCBBY2Nlc3MgVGltZSA9IDEzIGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjNSQVRfMTQJCTB4MEUwMDAwMDAgIC8qIEIzIFJlYWQgQWNjZXNzIFRpbWUgPSAxNCBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIzUkFUXzE1CQkweDBGMDAwMDAwICAvKiBCMyBSZWFkIEFjY2VzcyBUaW1lID0gMTUgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCM1dBVF8xCQkJMHgxMDAwMDAwMCAgLyogQjMgV3JpdGUgQWNjZXNzIFRpbWUgPSAxIGN5Y2xlCQkJCQkqLworI2RlZmluZSBCM1dBVF8yCQkJMHgyMDAwMDAwMCAgLyogQjMgV3JpdGUgQWNjZXNzIFRpbWUgPSAyIGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjNXQVRfMwkJCTB4MzAwMDAwMDAgIC8qIEIzIFdyaXRlIEFjY2VzcyBUaW1lID0gMyBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIzV0FUXzQJCQkweDQwMDAwMDAwICAvKiBCMyBXcml0ZSBBY2Nlc3MgVGltZSA9IDQgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCM1dBVF81CQkJMHg1MDAwMDAwMCAgLyogQjMgV3JpdGUgQWNjZXNzIFRpbWUgPSA1IGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjNXQVRfNgkJCTB4NjAwMDAwMDAgIC8qIEIzIFdyaXRlIEFjY2VzcyBUaW1lID0gNiBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIzV0FUXzcJCQkweDcwMDAwMDAwICAvKiBCMyBXcml0ZSBBY2Nlc3MgVGltZSA9IDcgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCM1dBVF84CQkJMHg4MDAwMDAwMCAgLyogQjMgV3JpdGUgQWNjZXNzIFRpbWUgPSA4IGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjNXQVRfOQkJCTB4OTAwMDAwMDAgIC8qIEIzIFdyaXRlIEFjY2VzcyBUaW1lID0gOSBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIzV0FUXzEwCQkweEEwMDAwMDAwICAvKiBCMyBXcml0ZSBBY2Nlc3MgVGltZSA9IDEwIGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjNXQVRfMTEJCTB4QjAwMDAwMDAgIC8qIEIzIFdyaXRlIEFjY2VzcyBUaW1lID0gMTEgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCM1dBVF8xMgkJMHhDMDAwMDAwMCAgLyogQjMgV3JpdGUgQWNjZXNzIFRpbWUgPSAxMiBjeWNsZXMJCQkJCSovCisjZGVmaW5lIEIzV0FUXzEzCQkweEQwMDAwMDAwICAvKiBCMyBXcml0ZSBBY2Nlc3MgVGltZSA9IDEzIGN5Y2xlcwkJCQkJKi8KKyNkZWZpbmUgQjNXQVRfMTQJCTB4RTAwMDAwMDAgIC8qIEIzIFdyaXRlIEFjY2VzcyBUaW1lID0gMTQgY3ljbGVzCQkJCQkqLworI2RlZmluZSBCM1dBVF8xNQkJMHhGMDAwMDAwMCAgLyogQjMgV3JpdGUgQWNjZXNzIFRpbWUgPSAxNSBjeWNsZXMJCQkJCSovCisKKworLyogKioqKioqKioqKioqKioqKioqKioqKiAgU0RSQU0gQ09OVFJPTExFUiBNQVNLUyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEVCSVVfU0RHQ1RMIE1hc2tzCQkJCQkJCQkJCQkJCQkJCQkJCSovCisjZGVmaW5lIFNDVExFCQkJMHgwMDAwMDAwMQkvKiBFbmFibGUgU0RSQU0gU2lnbmFscwkJCQkJCQkJCQkqLworI2RlZmluZSBDTF8yCQkJMHgwMDAwMDAwOAkvKiBTRFJBTSBDQVMgTGF0ZW5jeSA9IDIgY3ljbGVzCQkJCQkJCQkqLworI2RlZmluZSBDTF8zCQkJMHgwMDAwMDAwQwkvKiBTRFJBTSBDQVMgTGF0ZW5jeSA9IDMgY3ljbGVzCQkJCQkJCQkqLworI2RlZmluZSBQQVNSX0FMTAkJMHgwMDAwMDAwMAkvKiBBbGwgNCBTRFJBTSBCYW5rcyBSZWZyZXNoZWQgSW4gU2VsZi1SZWZyZXNoCQkJCSovCisjZGVmaW5lIFBBU1JfQjBfQjEJCTB4MDAwMDAwMTAJLyogU0RSQU0gQmFua3MgMCBhbmQgMSBBcmUgUmVmcmVzaGVkIEluIFNlbGYtUmVmcmVzaAkJKi8KKyNkZWZpbmUgUEFTUl9CMAkJCTB4MDAwMDAwMjAJLyogT25seSBTRFJBTSBCYW5rIDAgSXMgUmVmcmVzaGVkIEluIFNlbGYtUmVmcmVzaAkJCSovCisjZGVmaW5lIFRSQVNfMQkJCTB4MDAwMDAwNDAJLyogU0RSQU0gdFJBUyA9IDEgY3ljbGUJCQkJCQkJCQkJKi8KKyNkZWZpbmUgVFJBU18yCQkJMHgwMDAwMDA4MAkvKiBTRFJBTSB0UkFTID0gMiBjeWNsZXMJCQkJCQkJCQkqLworI2RlZmluZSBUUkFTXzMJCQkweDAwMDAwMEMwCS8qIFNEUkFNIHRSQVMgPSAzIGN5Y2xlcwkJCQkJCQkJCSovCisjZGVmaW5lIFRSQVNfNAkJCTB4MDAwMDAxMDAJLyogU0RSQU0gdFJBUyA9IDQgY3ljbGVzCQkJCQkJCQkJKi8KKyNkZWZpbmUgVFJBU181CQkJMHgwMDAwMDE0MAkvKiBTRFJBTSB0UkFTID0gNSBjeWNsZXMJCQkJCQkJCQkqLworI2RlZmluZSBUUkFTXzYJCQkweDAwMDAwMTgwCS8qIFNEUkFNIHRSQVMgPSA2IGN5Y2xlcwkJCQkJCQkJCSovCisjZGVmaW5lIFRSQVNfNwkJCTB4MDAwMDAxQzAJLyogU0RSQU0gdFJBUyA9IDcgY3ljbGVzCQkJCQkJCQkJKi8KKyNkZWZpbmUgVFJBU184CQkJMHgwMDAwMDIwMAkvKiBTRFJBTSB0UkFTID0gOCBjeWNsZXMJCQkJCQkJCQkqLworI2RlZmluZSBUUkFTXzkJCQkweDAwMDAwMjQwCS8qIFNEUkFNIHRSQVMgPSA5IGN5Y2xlcwkJCQkJCQkJCSovCisjZGVmaW5lIFRSQVNfMTAJCQkweDAwMDAwMjgwCS8qIFNEUkFNIHRSQVMgPSAxMCBjeWNsZXMJCQkJCQkJCQkqLworI2RlZmluZSBUUkFTXzExCQkJMHgwMDAwMDJDMAkvKiBTRFJBTSB0UkFTID0gMTEgY3ljbGVzCQkJCQkJCQkJKi8KKyNkZWZpbmUgVFJBU18xMgkJCTB4MDAwMDAzMDAJLyogU0RSQU0gdFJBUyA9IDEyIGN5Y2xlcwkJCQkJCQkJCSovCisjZGVmaW5lIFRSQVNfMTMJCQkweDAwMDAwMzQwCS8qIFNEUkFNIHRSQVMgPSAxMyBjeWNsZXMJCQkJCQkJCQkqLworI2RlZmluZSBUUkFTXzE0CQkJMHgwMDAwMDM4MAkvKiBTRFJBTSB0UkFTID0gMTQgY3ljbGVzCQkJCQkJCQkJKi8KKyNkZWZpbmUgVFJBU18xNQkJCTB4MDAwMDAzQzAJLyogU0RSQU0gdFJBUyA9IDE1IGN5Y2xlcwkJCQkJCQkJCSovCisjZGVmaW5lIFRSUF8xCQkJMHgwMDAwMDgwMAkvKiBTRFJBTSB0UlAgPSAxIGN5Y2xlCQkJCQkJCQkJCSovCisjZGVmaW5lIFRSUF8yCQkJMHgwMDAwMTAwMAkvKiBTRFJBTSB0UlAgPSAyIGN5Y2xlcwkJCQkJCQkJCQkqLworI2RlZmluZSBUUlBfMwkJCTB4MDAwMDE4MDAJLyogU0RSQU0gdFJQID0gMyBjeWNsZXMJCQkJCQkJCQkJKi8KKyNkZWZpbmUgVFJQXzQJCQkweDAwMDAyMDAwCS8qIFNEUkFNIHRSUCA9IDQgY3ljbGVzCQkJCQkJCQkJCSovCisjZGVmaW5lIFRSUF81CQkJMHgwMDAwMjgwMAkvKiBTRFJBTSB0UlAgPSA1IGN5Y2xlcwkJCQkJCQkJCQkqLworI2RlZmluZSBUUlBfNgkJCTB4MDAwMDMwMDAJLyogU0RSQU0gdFJQID0gNiBjeWNsZXMJCQkJCQkJCQkJKi8KKyNkZWZpbmUgVFJQXzcJCQkweDAwMDAzODAwCS8qIFNEUkFNIHRSUCA9IDcgY3ljbGVzCQkJCQkJCQkJCSovCisjZGVmaW5lIFRSQ0RfMQkJCTB4MDAwMDgwMDAJLyogU0RSQU0gdFJDRCA9IDEgY3ljbGUJCQkJCQkJCQkJKi8KKyNkZWZpbmUgVFJDRF8yCQkJMHgwMDAxMDAwMAkvKiBTRFJBTSB0UkNEID0gMiBjeWNsZXMJCQkJCQkJCQkqLworI2RlZmluZSBUUkNEXzMJCQkweDAwMDE4MDAwCS8qIFNEUkFNIHRSQ0QgPSAzIGN5Y2xlcwkJCQkJCQkJCSovCisjZGVmaW5lIFRSQ0RfNAkJCTB4MDAwMjAwMDAJLyogU0RSQU0gdFJDRCA9IDQgY3ljbGVzCQkJCQkJCQkJKi8KKyNkZWZpbmUgVFJDRF81CQkJMHgwMDAyODAwMAkvKiBTRFJBTSB0UkNEID0gNSBjeWNsZXMJCQkJCQkJCQkqLworI2RlZmluZSBUUkNEXzYJCQkweDAwMDMwMDAwCS8qIFNEUkFNIHRSQ0QgPSA2IGN5Y2xlcwkJCQkJCQkJCSovCisjZGVmaW5lIFRSQ0RfNwkJCTB4MDAwMzgwMDAJLyogU0RSQU0gdFJDRCA9IDcgY3ljbGVzCQkJCQkJCQkJKi8KKyNkZWZpbmUgVFdSXzEJCQkweDAwMDgwMDAwCS8qIFNEUkFNIHRXUiA9IDEgY3ljbGUJCQkJCQkJCQkJKi8KKyNkZWZpbmUgVFdSXzIJCQkweDAwMTAwMDAwCS8qIFNEUkFNIHRXUiA9IDIgY3ljbGVzCQkJCQkJCQkJCSovCisjZGVmaW5lIFRXUl8zCQkJMHgwMDE4MDAwMAkvKiBTRFJBTSB0V1IgPSAzIGN5Y2xlcwkJCQkJCQkJCQkqLworI2RlZmluZSBQVVBTRAkJCTB4MDAyMDAwMDAJLyogUG93ZXItVXAgU3RhcnQgRGVsYXkgKDE1IFNDTEsgQ3ljbGVzIERlbGF5KQkJCQkqLworI2RlZmluZSBQU00JCQkJMHgwMDQwMDAwMAkvKiBQb3dlci1VcCBTZXF1ZW5jZSAoTW9kZSBSZWdpc3RlciBCZWZvcmUvQWZ0ZXIqIFJlZnJlc2gpCSovCisjZGVmaW5lIFBTUwkJCQkweDAwODAwMDAwCS8qIEVuYWJsZSBQb3dlci1VcCBTZXF1ZW5jZSBvbiBOZXh0IFNEUkFNIEFjY2VzcwkJCSovCisjZGVmaW5lIFNSRlMJCQkweDAxMDAwMDAwCS8qIEVuYWJsZSBTRFJBTSBTZWxmLVJlZnJlc2ggTW9kZQkJCQkJCQkqLworI2RlZmluZSBFQlVGRQkJCTB4MDIwMDAwMDAJLyogRW5hYmxlIEV4dGVybmFsIEJ1ZmZlcmluZyBUaW1pbmcJCQkJCQkJKi8KKyNkZWZpbmUgRkJCUlcJCQkweDA0MDAwMDAwCS8qIEVuYWJsZSBGYXN0IEJhY2stVG8tQmFjayBSZWFkIFRvIFdyaXRlCQkJCQkqLworI2RlZmluZSBFTVJFTgkJCTB4MTAwMDAwMDAJLyogRXh0ZW5kZWQgTW9kZSBSZWdpc3RlciBFbmFibGUJCQkJCQkJKi8KKyNkZWZpbmUgVENTUgkJCTB4MjAwMDAwMDAJLyogVGVtcC1Db21wZW5zYXRlZCBTZWxmLVJlZnJlc2ggVmFsdWUgKDg1LzQ1KiBEZWcgQykJCSovCisjZGVmaW5lIENEREJHCQkJMHg0MDAwMDAwMAkvKiBUcmlzdGF0ZSBTRFJBTSBDb250cm9scyBEdXJpbmcgQnVzIEdyYW50CQkJCQkqLworCisvKiBFQklVX1NEQkNUTCBNYXNrcwkJCQkJCQkJCQkJCQkJCQkJCSovCisjZGVmaW5lIEVCRQkJCQkweDAwMDEJCS8qIEVuYWJsZSBTRFJBTSBFeHRlcm5hbCBCYW5rCQkJCQkJCSovCisjZGVmaW5lIEVCU1pfMTYJCQkweDAwMDAJCS8qIFNEUkFNIEV4dGVybmFsIEJhbmsgU2l6ZSA9IDE2TUIJKi8KKyNkZWZpbmUgRUJTWl8zMgkJCTB4MDAwMgkJLyogU0RSQU0gRXh0ZXJuYWwgQmFuayBTaXplID0gMzJNQgkqLworI2RlZmluZSBFQlNaXzY0CQkJMHgwMDA0CQkvKiBTRFJBTSBFeHRlcm5hbCBCYW5rIFNpemUgPSA2NE1CCSovCisjZGVmaW5lIEVCU1pfMTI4CQkweDAwMDYJCS8qIFNEUkFNIEV4dGVybmFsIEJhbmsgU2l6ZSA9IDEyOE1CCQkqLworI2RlZmluZSBFQlNaXzI1NgkJMHgwMDA4CQkvKiBTRFJBTSBFeHRlcm5hbCBCYW5rIFNpemUgPSAyNTZNQiAJKi8KKyNkZWZpbmUgRUJTWl81MTIJCTB4MDAwQQkJLyogU0RSQU0gRXh0ZXJuYWwgQmFuayBTaXplID0gNTEyTUIJCSovCisjZGVmaW5lIEVCQ0FXXzgJCQkweDAwMDAJCS8qIFNEUkFNIEV4dGVybmFsIEJhbmsgQ29sdW1uIEFkZHJlc3MgV2lkdGggPSA4IEJpdHMJKi8KKyNkZWZpbmUgRUJDQVdfOQkJCTB4MDAxMAkJLyogU0RSQU0gRXh0ZXJuYWwgQmFuayBDb2x1bW4gQWRkcmVzcyBXaWR0aCA9IDkgQml0cwkqLworI2RlZmluZSBFQkNBV18xMAkJMHgwMDIwCQkvKiBTRFJBTSBFeHRlcm5hbCBCYW5rIENvbHVtbiBBZGRyZXNzIFdpZHRoID0gMTAgQml0cwkqLworI2RlZmluZSBFQkNBV18xMQkJMHgwMDMwCQkvKiBTRFJBTSBFeHRlcm5hbCBCYW5rIENvbHVtbiBBZGRyZXNzIFdpZHRoID0gMTEgQml0cwkqLworCisvKiBFQklVX1NEU1RBVCBNYXNrcwkJCQkJCQkJCQkJCQkJKi8KKyNkZWZpbmUgU0RDSQkJCTB4MDAwMQkJLyogU0RSQU0gQ29udHJvbGxlciBJZGxlIAkJCQkqLworI2RlZmluZSBTRFNSQQkJCTB4MDAwMgkJLyogU0RSQU0gU2VsZi1SZWZyZXNoIEFjdGl2ZQkJCSovCisjZGVmaW5lIFNEUFVBCQkJMHgwMDA0CQkvKiBTRFJBTSBQb3dlci1VcCBBY3RpdmUgCQkJCSovCisjZGVmaW5lIFNEUlMJCQkweDAwMDgJCS8qIFNEUkFNIFdpbGwgUG93ZXItVXAgT24gTmV4dCBBY2Nlc3MJKi8KKyNkZWZpbmUgU0RFQVNFCQkJMHgwMDEwCQkvKiBTRFJBTSBFQUIgU3RpY2t5IEVycm9yIFN0YXR1cwkJKi8KKyNkZWZpbmUgQkdTVEFUCQkJMHgwMDIwCQkvKiBCdXMgR3JhbnQgU3RhdHVzCQkJCQkJKi8KKworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKiAgRE1BIENPTlRST0xMRVIgTUFTS1MgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogRE1BeF9DT05GSUcsIE1ETUFfeXlfQ09ORklHIE1hc2tzCQkJCQkJCQkJCQkJKi8KKyNkZWZpbmUgRE1BRU4JCQkweDAwMDEJCS8qIERNQSBDaGFubmVsIEVuYWJsZQkJCQkJCQkqLworI2RlZmluZSBXTlIJCQkJMHgwMDAyCQkvKiBDaGFubmVsIERpcmVjdGlvbiAoVy9SKikJCQkJCQkqLworI2RlZmluZSBXRFNJWkVfOAkJMHgwMDAwCQkvKiBUcmFuc2ZlciBXb3JkIFNpemUgPSA4CQkJCQkJKi8KKyNkZWZpbmUgV0RTSVpFXzE2CQkweDAwMDQJCS8qIFRyYW5zZmVyIFdvcmQgU2l6ZSA9IDE2CQkJCQkJKi8KKyNkZWZpbmUgV0RTSVpFXzMyCQkweDAwMDgJCS8qIFRyYW5zZmVyIFdvcmQgU2l6ZSA9IDMyCQkJCQkJKi8KKyNkZWZpbmUgRE1BMkQJCQkweDAwMTAJCS8qIERNQSBNb2RlICgyRC8xRCopCQkJCQkJCSovCisjZGVmaW5lIFJFU1RBUlQJCQkweDAwMjAJCS8qIERNQSBCdWZmZXIgQ2xlYXIJCQkJCQkJCSovCisjZGVmaW5lIERJX1NFTAkJCTB4MDA0MAkJLyogRGF0YSBJbnRlcnJ1cHQgVGltaW5nIFNlbGVjdAkJCQkJKi8KKyNkZWZpbmUgRElfRU4JCQkweDAwODAJCS8qIERhdGEgSW50ZXJydXB0IEVuYWJsZQkJCQkJCSovCisjZGVmaW5lIE5EU0laRV8wCQkweDAwMDAJCS8qIE5leHQgRGVzY3JpcHRvciBTaXplID0gMCAoU3RvcC9BdXRvYnVmZmVyKQkqLworI2RlZmluZSBORFNJWkVfMQkJMHgwMTAwCQkvKiBOZXh0IERlc2NyaXB0b3IgU2l6ZSA9IDEJCQkJCQkqLworI2RlZmluZSBORFNJWkVfMgkJMHgwMjAwCQkvKiBOZXh0IERlc2NyaXB0b3IgU2l6ZSA9IDIJCQkJCQkqLworI2RlZmluZSBORFNJWkVfMwkJMHgwMzAwCQkvKiBOZXh0IERlc2NyaXB0b3IgU2l6ZSA9IDMJCQkJCQkqLworI2RlZmluZSBORFNJWkVfNAkJMHgwNDAwCQkvKiBOZXh0IERlc2NyaXB0b3IgU2l6ZSA9IDQJCQkJCQkqLworI2RlZmluZSBORFNJWkVfNQkJMHgwNTAwCQkvKiBOZXh0IERlc2NyaXB0b3IgU2l6ZSA9IDUJCQkJCQkqLworI2RlZmluZSBORFNJWkVfNgkJMHgwNjAwCQkvKiBOZXh0IERlc2NyaXB0b3IgU2l6ZSA9IDYJCQkJCQkqLworI2RlZmluZSBORFNJWkVfNwkJMHgwNzAwCQkvKiBOZXh0IERlc2NyaXB0b3IgU2l6ZSA9IDcJCQkJCQkqLworI2RlZmluZSBORFNJWkVfOAkJMHgwODAwCQkvKiBOZXh0IERlc2NyaXB0b3IgU2l6ZSA9IDgJCQkJCQkqLworI2RlZmluZSBORFNJWkVfOQkJMHgwOTAwCQkvKiBOZXh0IERlc2NyaXB0b3IgU2l6ZSA9IDkJCQkJCQkqLworI2RlZmluZSBORFNJWkUJICAgICAgICAJMHgwOTAwCS8qIE5leHQgRGVzY3JpcHRvciBTaXplICovCisjZGVmaW5lIERNQUZMT1cJICAgICAgICAJMHg3MDAwCS8qIEZsb3cgQ29udHJvbCAqLworI2RlZmluZSBETUFGTE9XX1NUT1AJCTB4MDAwMAkJLyogU3RvcCBNb2RlCQkJCQkJCQkJKi8KKyNkZWZpbmUgRE1BRkxPV19BVVRPCQkweDEwMDAJCS8qIEF1dG9idWZmZXIgTW9kZQkJCQkJCQkJKi8KKyNkZWZpbmUgRE1BRkxPV19BUlJBWQkJMHg0MDAwCQkvKiBEZXNjcmlwdG9yIEFycmF5IE1vZGUJCQkJCQkqLworI2RlZmluZSBETUFGTE9XX1NNQUxMCQkweDYwMDAJCS8qIFNtYWxsIE1vZGVsIERlc2NyaXB0b3IgTGlzdCBNb2RlCQkJCSovCisjZGVmaW5lIERNQUZMT1dfTEFSR0UJCTB4NzAwMAkJLyogTGFyZ2UgTW9kZWwgRGVzY3JpcHRvciBMaXN0IE1vZGUJCQkJKi8KKworLyogRE1BeF9QRVJJUEhFUkFMX01BUCwgTURNQV95eV9QRVJJUEhFUkFMX01BUCBNYXNrcwkJCQkJCQkJKi8KKyNkZWZpbmUgQ1RZUEUJCQkweDAwNDAJLyogRE1BIENoYW5uZWwgVHlwZSBJbmRpY2F0b3IgKE1lbW9yeS9QZXJpcGhlcmFsKikJKi8KKyNkZWZpbmUgUE1BUAkJCTB4RjAwMAkvKiBQZXJpcGhlcmFsIE1hcHBlZCBUbyBUaGlzIENoYW5uZWwJCQkJKi8KKyNkZWZpbmUgUE1BUF9QUEkJCTB4MDAwMAkvKiAJCVBQSSBQb3J0IERNQQkJCQkJCQkJKi8KKyNkZWZpbmUJUE1BUF9FTUFDUlgJCTB4MTAwMAkvKiAJCUV0aGVybmV0IFJlY2VpdmUgRE1BCQkJCQkJKi8KKyNkZWZpbmUgUE1BUF9FTUFDVFgJCTB4MjAwMAkvKiAJCUV0aGVybmV0IFRyYW5zbWl0IERNQQkJCQkJCSovCisjZGVmaW5lIFBNQVBfU1BPUlQwUlgJMHgzMDAwCS8qIAkJU1BPUlQwIFJlY2VpdmUgRE1BCQkJCQkJCSovCisjZGVmaW5lIFBNQVBfU1BPUlQwVFgJMHg0MDAwCS8qIAkJU1BPUlQwIFRyYW5zbWl0IERNQQkJCQkJCQkqLworI2RlZmluZSBQTUFQX1NQT1JUMVJYCTB4NTAwMAkvKiAJCVNQT1JUMSBSZWNlaXZlIERNQQkJCQkJCQkqLworI2RlZmluZSBQTUFQX1NQT1JUMVRYCTB4NjAwMAkvKiAJCVNQT1JUMSBUcmFuc21pdCBETUEJCQkJCQkJKi8KKyNkZWZpbmUgUE1BUF9TUEkJCTB4NzAwMAkvKiAJCVNQSSBQb3J0IERNQQkJCQkJCQkJKi8KKyNkZWZpbmUgUE1BUF9VQVJUMFJYCTB4ODAwMAkvKiAJCVVBUlQwIFBvcnQgUmVjZWl2ZSBETUEJCQkJCQkqLworI2RlZmluZSBQTUFQX1VBUlQwVFgJMHg5MDAwCS8qIAkJVUFSVDAgUG9ydCBUcmFuc21pdCBETUEJCQkJCQkqLworI2RlZmluZQlQTUFQX1VBUlQxUlgJMHhBMDAwCS8qIAkJVUFSVDEgUG9ydCBSZWNlaXZlIERNQQkJCQkJCSovCisjZGVmaW5lCVBNQVBfVUFSVDFUWAkweEIwMDAJLyogCQlVQVJUMSBQb3J0IFRyYW5zbWl0IERNQQkJCQkJCSovCisKKy8qIERNQXhfSVJRX1NUQVRVUywgTURNQV95eV9JUlFfU1RBVFVTIE1hc2tzCQkJCQkJKi8KKyNkZWZpbmUgRE1BX0RPTkUJCTB4MDAwMQkvKiBETUEgQ29tcGxldGlvbiBJbnRlcnJ1cHQgU3RhdHVzCSovCisjZGVmaW5lIERNQV9FUlIJCQkweDAwMDIJLyogRE1BIEVycm9yIEludGVycnVwdCBTdGF0dXMJCSovCisjZGVmaW5lIERGRVRDSAkJCTB4MDAwNAkvKiBETUEgRGVzY3JpcHRvciBGZXRjaCBJbmRpY2F0b3IJKi8KKyNkZWZpbmUgRE1BX1JVTgkJCTB4MDAwOAkvKiBETUEgQ2hhbm5lbCBSdW5uaW5nIEluZGljYXRvcgkqLworCisKKy8qICAqKioqKioqKioqKiogIFBBUkFMTEVMIFBFUklQSEVSQUwgSU5URVJGQUNFIChQUEkpIE1BU0tTICoqKioqKioqKioqKiovCisvKiAgUFBJX0NPTlRST0wgTWFza3MJCQkJCQkJCQkJCQkJKi8KKyNkZWZpbmUgUE9SVF9FTgkJCTB4MDAwMQkJLyogUFBJIFBvcnQgRW5hYmxlCQkJCQkqLworI2RlZmluZSBQT1JUX0RJUgkJMHgwMDAyCQkvKiBQUEkgUG9ydCBEaXJlY3Rpb24JCQkJKi8KKyNkZWZpbmUgWEZSX1RZUEUJCTB4MDAwQwkJLyogUFBJIFRyYW5zZmVyIFR5cGUJCQkJKi8KKyNkZWZpbmUgUE9SVF9DRkcJCTB4MDAzMAkJLyogUFBJIFBvcnQgQ29uZmlndXJhdGlvbgkJCSovCisjZGVmaW5lIEZMRF9TRUwJCQkweDAwNDAJCS8qIFBQSSBBY3RpdmUgRmllbGQgU2VsZWN0CQkJKi8KKyNkZWZpbmUgUEFDS19FTgkJCTB4MDA4MAkJLyogUFBJIFBhY2tpbmcgTW9kZQkJCQkJKi8KKyNkZWZpbmUgRE1BMzIJCQkweDAxMDAJCS8qIFBQSSAzMi1iaXQgRE1BIEVuYWJsZQkJCSovCisjZGVmaW5lIFNLSVBfRU4JCQkweDAyMDAJCS8qIFBQSSBTa2lwIEVsZW1lbnQgRW5hYmxlCQkJKi8KKyNkZWZpbmUgU0tJUF9FTwkJCTB4MDQwMAkJLyogUFBJIFNraXAgRXZlbi9PZGQgRWxlbWVudHMJCSovCisjZGVmaW5lIERMRU5fOAkJCTB4MDAwMAkJLyogRGF0YSBMZW5ndGggPSA4IEJpdHMJCQkJKi8KKyNkZWZpbmUgRExFTl8xMAkJCTB4MDgwMAkJLyogRGF0YSBMZW5ndGggPSAxMCBCaXRzCQkJKi8KKyNkZWZpbmUgRExFTl8xMQkJCTB4MTAwMAkJLyogRGF0YSBMZW5ndGggPSAxMSBCaXRzCQkJKi8KKyNkZWZpbmUgRExFTl8xMgkJCTB4MTgwMAkJLyogRGF0YSBMZW5ndGggPSAxMiBCaXRzCQkJKi8KKyNkZWZpbmUgRExFTl8xMwkJCTB4MjAwMAkJLyogRGF0YSBMZW5ndGggPSAxMyBCaXRzCQkJKi8KKyNkZWZpbmUgRExFTl8xNAkJCTB4MjgwMAkJLyogRGF0YSBMZW5ndGggPSAxNCBCaXRzCQkJKi8KKyNkZWZpbmUgRExFTl8xNQkJCTB4MzAwMAkJLyogRGF0YSBMZW5ndGggPSAxNSBCaXRzCQkJKi8KKyNkZWZpbmUgRExFTl8xNgkJCTB4MzgwMAkJLyogRGF0YSBMZW5ndGggPSAxNiBCaXRzCQkJKi8KKyNkZWZpbmUgRExFTkdUSAkJCTB4MzgwMAkJLyogUFBJIERhdGEgTGVuZ3RoICAqLworI2RlZmluZSBQT0xDCQkJMHg0MDAwCQkvKiBQUEkgQ2xvY2sgUG9sYXJpdHkJCQkJKi8KKyNkZWZpbmUgUE9MUwkJCTB4ODAwMAkJLyogUFBJIEZyYW1lIFN5bmMgUG9sYXJpdHkJCQkqLworCisvKiBQUElfU1RBVFVTIE1hc2tzCQkJCQkJCQkJCQkJCQkqLworI2RlZmluZSBGTEQJCQkJMHgwNDAwCQkvKiBGaWVsZCBJbmRpY2F0b3IJCQkJCSovCisjZGVmaW5lIEZUX0VSUgkJCTB4MDgwMAkJLyogRnJhbWUgVHJhY2sgRXJyb3IJCQkJKi8KKyNkZWZpbmUgT1ZSCQkJCTB4MTAwMAkJLyogRklGTyBPdmVyZmxvdyBFcnJvcgkJCQkqLworI2RlZmluZSBVTkRSCQkJMHgyMDAwCQkvKiBGSUZPIFVuZGVycnVuIEVycm9yCQkJCSovCisjZGVmaW5lIEVSUl9ERVQJCQkweDQwMDAJCS8qIEVycm9yIERldGVjdGVkIEluZGljYXRvcgkJCSovCisjZGVmaW5lIEVSUl9OQ09SCQkweDgwMDAJCS8qIEVycm9yIE5vdCBDb3JyZWN0ZWQgSW5kaWNhdG9yCSovCisKKworLyogICoqKioqKioqKioqKioqKioqKioqICBUV08tV0lSRSBJTlRFUkZBQ0UgKFRXSSkgTUFTS1MgICoqKioqKioqKioqKioqKioqKioqKioqLworLyogVFdJX0NMS0RJViBNYWNyb3MgKFVzZTogKnBUV0lfQ0xLRElWID0gQ0xLTE9XKHgpfENMS0hJKHkpOyAgKQkJCQkqLworI2RlZmluZQlDTEtMT1coeCkJKCh4KSAmIDB4RkYpCQkvKiBQZXJpb2RzIENsb2NrIElzIEhlbGQgTG93CQkJKi8KKyNkZWZpbmUgQ0xLSEkoeSkJKCgoeSkmMHhGRik8PDB4OCkJLyogUGVyaW9kcyBCZWZvcmUgTmV3IENsb2NrIExvdwkJCSovCisKKy8qIFRXSV9QUkVTQ0FMRSBNYXNrcwkJCQkJCQkJCQkJCQkJCSovCisjZGVmaW5lCVBSRVNDQUxFCTB4MDA3RgkJLyogU0NMS3MgUGVyIEludGVybmFsIFRpbWUgUmVmZXJlbmNlICgxME1IeikJKi8KKyNkZWZpbmUJVFdJX0VOQQkJMHgwMDgwCQkvKiBUV0kgRW5hYmxlCQkJCQkJCQkJKi8KKyNkZWZpbmUJU0NDQgkJMHgwMjAwCQkvKiBTQ0NCIENvbXBhdGliaWxpdHkgRW5hYmxlCQkJCQkqLworCisvKiBUV0lfU0xBVkVfQ1RSTCBNYXNrcwkJCQkJCQkJCQkJCQkJCSovCisjZGVmaW5lCVNFTgkJCTB4MDAwMQkJLyogU2xhdmUgRW5hYmxlCQkJCQkJCQkJKi8KKyNkZWZpbmUJU0FERF9MRU4JMHgwMDAyCQkvKiBTbGF2ZSBBZGRyZXNzIExlbmd0aAkJCQkJCQkqLworI2RlZmluZQlTVERWQUwJCTB4MDAwNAkJLyogU2xhdmUgVHJhbnNtaXQgRGF0YSBWYWxpZAkJCQkJKi8KKyNkZWZpbmUJTkFLCQkJMHgwMDA4CQkvKiBOQUsvQUNLKiBHZW5lcmF0ZWQgQXQgQ29uY2x1c2lvbiBPZiBUcmFuc2ZlciAqLworI2RlZmluZQlHRU4JCQkweDAwMTAJCS8qIEdlbmVyYWwgQ2FsbCBBZHJyZXNzIE1hdGNoaW5nIEVuYWJsZWQJCSovCisKKy8qIFRXSV9TTEFWRV9TVEFUIE1hc2tzCQkJCQkJCQkJCQkJCQkJKi8KKyNkZWZpbmUJU0RJUgkJMHgwMDAxCQkvKiBTbGF2ZSBUcmFuc2ZlciBEaXJlY3Rpb24gKFRyYW5zbWl0L1JlY2VpdmUqKQkqLworI2RlZmluZSBHQ0FMTAkJMHgwMDAyCQkvKiBHZW5lcmFsIENhbGwgSW5kaWNhdG9yCQkJCQkJKi8KKworLyogVFdJX01BU1RFUl9DVFJMIE1hc2tzCQkJCQkJCQkJCQkJCSovCisjZGVmaW5lCU1FTgkJCTB4MDAwMQkJLyogTWFzdGVyIE1vZGUgRW5hYmxlCQkJCQkJKi8KKyNkZWZpbmUJTUFERF9MRU4JMHgwMDAyCQkvKiBNYXN0ZXIgQWRkcmVzcyBMZW5ndGgJCQkJCSovCisjZGVmaW5lCU1ESVIJCTB4MDAwNAkJLyogTWFzdGVyIFRyYW5zbWl0IERpcmVjdGlvbiAoUlgvVFgqKQkJKi8KKyNkZWZpbmUJRkFTVAkJMHgwMDA4CQkvKiBVc2UgRmFzdCBNb2RlIFRpbWluZyBTcGVjcwkJCQkqLworI2RlZmluZQlTVE9QCQkweDAwMTAJCS8qIElzc3VlIFN0b3AgQ29uZGl0aW9uCQkJCQkJKi8KKyNkZWZpbmUJUlNUQVJUCQkweDAwMjAJCS8qIFJlcGVhdCBTdGFydCBvciBTdG9wKiBBdCBFbmQgT2YgVHJhbnNmZXIJKi8KKyNkZWZpbmUJRENOVAkJMHgzRkMwCQkvKiBEYXRhIEJ5dGVzIFRvIFRyYW5zZmVyCQkJCQkqLworI2RlZmluZQlTREFPVlIJCTB4NDAwMAkJLyogU2VyaWFsIERhdGEgT3ZlcnJpZGUJCQkJCQkqLworI2RlZmluZQlTQ0xPVlIJCTB4ODAwMAkJLyogU2VyaWFsIENsb2NrIE92ZXJyaWRlCQkJCQkqLworCisvKiBUV0lfTUFTVEVSX1NUQVQgTWFza3MJCQkJCQkJCQkJCQkJCSovCisjZGVmaW5lCU1QUk9HCQkweDAwMDEJCS8qIE1hc3RlciBUcmFuc2ZlciBJbiBQcm9ncmVzcwkJCQkJKi8KKyNkZWZpbmUJTE9TVEFSQgkJMHgwMDAyCQkvKiBMb3N0IEFyYml0cmF0aW9uIEluZGljYXRvciAoWGZlciBBYm9ydGVkKQkqLworI2RlZmluZQlBTkFLCQkweDAwMDQJCS8qIEFkZHJlc3MgTm90IEFja25vd2xlZGdlZAkJCQkJCSovCisjZGVmaW5lCUROQUsJCTB4MDAwOAkJLyogRGF0YSBOb3QgQWNrbm93bGVkZ2VkCQkJCQkJKi8KKyNkZWZpbmUJQlVGUkRFUlIJMHgwMDEwCQkvKiBCdWZmZXIgUmVhZCBFcnJvcgkJCQkJCQkqLworI2RlZmluZQlCVUZXUkVSUgkweDAwMjAJCS8qIEJ1ZmZlciBXcml0ZSBFcnJvcgkJCQkJCQkqLworI2RlZmluZQlTREFTRU4JCTB4MDA0MAkJLyogU2VyaWFsIERhdGEgU2Vuc2UJCQkJCQkJKi8KKyNkZWZpbmUJU0NMU0VOCQkweDAwODAJCS8qIFNlcmlhbCBDbG9jayBTZW5zZQkJCQkJCQkqLworI2RlZmluZQlCVVNCVVNZCQkweDAxMDAJCS8qIEJ1cyBCdXN5IEluZGljYXRvcgkJCQkJCQkqLworCisvKiBUV0lfSU5UX1NSQyBhbmQgVFdJX0lOVF9FTkFCTEUgTWFza3MJCQkJCQkqLworI2RlZmluZQlTSU5JVAkJMHgwMDAxCQkvKiBTbGF2ZSBUcmFuc2ZlciBJbml0aWF0ZWQJKi8KKyNkZWZpbmUJU0NPTVAJCTB4MDAwMgkJLyogU2xhdmUgVHJhbnNmZXIgQ29tcGxldGUJKi8KKyNkZWZpbmUJU0VSUgkJMHgwMDA0CQkvKiBTbGF2ZSBUcmFuc2ZlciBFcnJvcgkJKi8KKyNkZWZpbmUJU09WRgkJMHgwMDA4CQkvKiBTbGF2ZSBPdmVyZmxvdwkJCSovCisjZGVmaW5lCU1DT01QCQkweDAwMTAJCS8qIE1hc3RlciBUcmFuc2ZlciBDb21wbGV0ZQkqLworI2RlZmluZQlNRVJSCQkweDAwMjAJCS8qIE1hc3RlciBUcmFuc2ZlciBFcnJvcgkqLworI2RlZmluZQlYTVRTRVJWCQkweDAwNDAJCS8qIFRyYW5zbWl0IEZJRk8gU2VydmljZQkqLworI2RlZmluZQlSQ1ZTRVJWCQkweDAwODAJCS8qIFJlY2VpdmUgRklGTyBTZXJ2aWNlCQkqLworCisvKiBUV0lfRklGT19DVFJMIE1hc2tzCQkJCQkJCQkJCQkJKi8KKyNkZWZpbmUJWE1URkxVU0gJMHgwMDAxCQkvKiBUcmFuc21pdCBCdWZmZXIgRmx1c2gJCQkqLworI2RlZmluZQlSQ1ZGTFVTSAkweDAwMDIJCS8qIFJlY2VpdmUgQnVmZmVyIEZsdXNoCQkJCSovCisjZGVmaW5lCVhNVElOVExFTgkweDAwMDQJCS8qIFRyYW5zbWl0IEJ1ZmZlciBJbnRlcnJ1cHQgTGVuZ3RoCSovCisjZGVmaW5lCVJDVklOVExFTgkweDAwMDgJCS8qIFJlY2VpdmUgQnVmZmVyIEludGVycnVwdCBMZW5ndGgJKi8KKworLyogVFdJX0ZJRk9fU1RBVCBNYXNrcwkJCQkJCQkJCQkJCQkJCSovCisjZGVmaW5lCVhNVFNUQVQJCTB4MDAwMwkJLyogVHJhbnNtaXQgRklGTyBTdGF0dXMJCQkJCQkJKi8KKyNkZWZpbmUJWE1UX0VNUFRZCTB4MDAwMAkJLyogCQlUcmFuc21pdCBGSUZPIEVtcHR5CQkJCQkJKi8KKyNkZWZpbmUJWE1UX0hBTEYJMHgwMDAxCQkvKiAJCVRyYW5zbWl0IEZJRk8gSGFzIDEgQnl0ZSBUbyBXcml0ZQkJKi8KKyNkZWZpbmUJWE1UX0ZVTEwJMHgwMDAzCQkvKiAJCVRyYW5zbWl0IEZJRk8gRnVsbCAoMiBCeXRlcyBUbyBXcml0ZSkJKi8KKworI2RlZmluZQlSQ1ZTVEFUCQkweDAwMEMJCS8qIFJlY2VpdmUgRklGTyBTdGF0dXMJCQkJCQkJKi8KKyNkZWZpbmUJUkNWX0VNUFRZCTB4MDAwMAkJLyogCQlSZWNlaXZlIEZJRk8gRW1wdHkJCQkJCQkqLworI2RlZmluZQlSQ1ZfSEFMRgkweDAwMDQJCS8qIAkJUmVjZWl2ZSBGSUZPIEhhcyAxIEJ5dGUgVG8gUmVhZAkJCSovCisjZGVmaW5lCVJDVl9GVUxMCTB4MDAwQwkJLyogCQlSZWNlaXZlIEZJRk8gRnVsbCAoMiBCeXRlcyBUbyBSZWFkKQkJKi8KKworCisvKiAgKioqKioqKioqKioqKioqKioqKiAgUElOIENPTlRST0wgUkVHSVNURVIgTUFTS1MgICoqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFBPUlRfTVVYIE1hc2tzCQkJCQkJCQkJCQkJCQkJKi8KKyNkZWZpbmUJUEpTRQkJCTB4MDAwMQkJCS8qIFBvcnQgSiBTUEkvU1BPUlQgRW5hYmxlCQkJKi8KKyNkZWZpbmUJUEpTRV9TUE9SVAkJMHgwMDAwCQkJLyogCQlFbmFibGUgVEZTMC9EVDBQUkkJCQkqLworI2RlZmluZQlQSlNFX1NQSQkJMHgwMDAxCQkJLyogCQlFbmFibGUgU1BJX1NTRUwzOjIJCQkqLworCisjZGVmaW5lCVBKQ0UoeCkJCQkoKCh4KSYweDMpPDwxKQkvKiBQb3J0IEogQ0FOL1NQSS9TUE9SVCBFbmFibGUJCSovCisjZGVmaW5lCVBKQ0VfU1BPUlQJCTB4MDAwMAkJCS8qIAkJRW5hYmxlIERSMFNFQy9EVDBTRUMJCSovCisjZGVmaW5lCVBKQ0VfQ0FOCQkweDAwMDIJCQkvKiAJCUVuYWJsZSBDQU4gUlgvVFgJCQkqLworI2RlZmluZQlQSkNFX1NQSQkJMHgwMDA0CQkJLyogCQlFbmFibGUgU1BJX1NTRUw3CQkJKi8KKworI2RlZmluZQlQRkRFCQkJMHgwMDA4CQkJLyogUG9ydCBGIERNQSBSZXF1ZXN0IEVuYWJsZQkJKi8KKyNkZWZpbmUJUEZERV9VQVJUCQkweDAwMDAJCQkvKiAJCUVuYWJsZSBVQVJUMCBSWC9UWAkJCSovCisjZGVmaW5lCVBGREVfRE1BCQkweDAwMDgJCQkvKiAJCUVuYWJsZSBETUFSMTowCQkJCSovCisKKyNkZWZpbmUJUEZURQkJCTB4MDAxMAkJCS8qIFBvcnQgRiBUaW1lciBFbmFibGUJCQkJKi8KKyNkZWZpbmUJUEZURV9VQVJUCQkweDAwMDAJCQkvKgkJRW5hYmxlIFVBUlQxIFJYL1RYCQkJKi8KKyNkZWZpbmUJUEZURV9USU1FUgkJMHgwMDEwCQkJLyogCQlFbmFibGUgVE1SNzo2CQkJCSovCisKKyNkZWZpbmUJUEZTNkUJCQkweDAwMjAJCQkvKiBQb3J0IEYgU1BJIFNTRUwgNiBFbmFibGUJCQkqLworI2RlZmluZQlQRlM2RV9USU1FUgkJMHgwMDAwCQkJLyoJCUVuYWJsZSBUTVI1CQkJCQkqLworI2RlZmluZQlQRlM2RV9TUEkJCTB4MDAyMAkJCS8qIAkJRW5hYmxlIFNQSV9TU0VMNgkJCSovCisKKyNkZWZpbmUJUEZTNUUJCQkweDAwNDAJCQkvKiBQb3J0IEYgU1BJIFNTRUwgNSBFbmFibGUJCQkqLworI2RlZmluZQlQRlM1RV9USU1FUgkJMHgwMDAwCQkJLyoJCUVuYWJsZSBUTVI0CQkJCQkqLworI2RlZmluZQlQRlM1RV9TUEkJCTB4MDA0MAkJCS8qIAkJRW5hYmxlIFNQSV9TU0VMNQkJCSovCisKKyNkZWZpbmUJUEZTNEUJCQkweDAwODAJCQkvKiBQb3J0IEYgU1BJIFNTRUwgNCBFbmFibGUJCQkqLworI2RlZmluZQlQRlM0RV9USU1FUgkJMHgwMDAwCQkJLyoJCUVuYWJsZSBUTVIzCQkJCQkqLworI2RlZmluZQlQRlM0RV9TUEkJCTB4MDA4MAkJCS8qIAkJRW5hYmxlIFNQSV9TU0VMNAkJCSovCisKKyNkZWZpbmUJUEZGRQkJCTB4MDEwMAkJCS8qIFBvcnQgRiBQUEkgRnJhbWUgU3luYyBFbmFibGUJCSovCisjZGVmaW5lCVBGRkVfVElNRVIJCTB4MDAwMAkJCS8qIAkJRW5hYmxlIFRNUjIJCQkJCSovCisjZGVmaW5lCVBGRkVfUFBJCQkweDAxMDAJCQkvKiAJCUVuYWJsZSBQUEkgRlMzCQkJCSovCisKKyNkZWZpbmUJUEdTRQkJCTB4MDIwMAkJCS8qIFBvcnQgRyBTUE9SVDEgU2Vjb25kYXJ5IEVuYWJsZQkqLworI2RlZmluZQlQR1NFX1BQSQkJMHgwMDAwCQkJLyogCQlFbmFibGUgUFBJIEQ5OjgJCQkJKi8KKyNkZWZpbmUJUEdTRV9TUE9SVAkJMHgwMjAwCQkJLyogCQlFbmFibGUgRFIxU0VDL0RUMVNFQwkJKi8KKworI2RlZmluZQlQR1JFCQkJMHgwNDAwCQkJLyogUG9ydCBHIFNQT1JUMSBSZWNlaXZlIEVuYWJsZQkJKi8KKyNkZWZpbmUJUEdSRV9QUEkJCTB4MDAwMAkJCS8qIAkJRW5hYmxlIFBQSSBEMTI6MTAJCQkqLworI2RlZmluZQlQR1JFX1NQT1JUCQkweDA0MDAJCQkvKiAJCUVuYWJsZSBEUjFQUkkvUkZTMS9SU0NMSzEJKi8KKworI2RlZmluZQlQR1RFCQkJMHgwODAwCQkJLyogUG9ydCBHIFNQT1JUMSBUcmFuc21pdCBFbmFibGUJKi8KKyNkZWZpbmUJUEdURV9QUEkJCTB4MDAwMAkJCS8qIAkJRW5hYmxlIFBQSSBEMTU6MTMJCQkqLworI2RlZmluZQlQR1RFX1NQT1JUCQkweDA4MDAJCQkvKiAJCUVuYWJsZSBEVDFQUkkvVEZTMS9UU0NMSzEJKi8KKworCisvKiAgKioqKioqKioqKioqKioqKioqICBIQU5EU0hBS0UgRE1BIChIRE1BKSBNQVNLUyAgKioqKioqKioqKioqKioqKioqKioqLworLyogSERNQXhfQ1RMIE1hc2tzCQkJCQkJCQkJCQkJCQkqLworI2RlZmluZQlITURNQUVOCQkweDAwMDEJLyogRW5hYmxlIEhhbmRzaGFrZSBETUEgMC8xCQkJCQkqLworI2RlZmluZQlSRVAJCQkweDAwMDIJLyogSERNQSBSZXF1ZXN0IFBvbGFyaXR5CQkJCQkqLworI2RlZmluZQlVVEUJCQkweDAwMDQJLyogVXJnZW5jeSBUaHJlc2hvbGQgRW5hYmxlCQkJCQkqLworI2RlZmluZQlPSUUJCQkweDAwMTAJLyogT3ZlcmZsb3cgSW50ZXJydXB0IEVuYWJsZQkJCQkqLworI2RlZmluZQlCRElFCQkweDAwMjAJLyogQmxvY2sgRG9uZSBJbnRlcnJ1cHQgRW5hYmxlCQkJCSovCisjZGVmaW5lCU1CREkJCTB4MDA0MAkvKiBNYXNrIEJsb2NrIERvbmUgSVJRIElmIFBlbmRpbmcgRUNOVAkJKi8KKyNkZWZpbmUJRFJRCQkJMHgwMzAwCS8qIEhETUEgUmVxdWVzdCBUeXBlCQkJCQkJKi8KKyNkZWZpbmUJRFJRX05PTkUJMHgwMDAwCS8qIAkJTm8gUmVxdWVzdAkJCQkJCQkqLworI2RlZmluZQlEUlFfU0lOR0xFCTB4MDEwMAkvKiAJCUNoYW5uZWxzIFJlcXVlc3QgU2luZ2xlCQkJCSovCisjZGVmaW5lCURSUV9NVUxUSQkweDAyMDAJLyogCQlDaGFubmVscyBSZXF1ZXN0IE11bHRpIChEZWZhdWx0KQkqLworI2RlZmluZQlEUlFfVVJHRU5UCTB4MDMwMAkvKiAJCUNoYW5uZWxzIFJlcXVlc3QgTXVsdGkgVXJnZW50CQkqLworI2RlZmluZQlSQkMJCQkweDEwMDAJLyogUmVsb2FkIEJDTlQgV2l0aCBJQkNOVAkJCQkJKi8KKyNkZWZpbmUJUFMJCQkweDIwMDAJLyogSERNQSBQaW4gU3RhdHVzCQkJCQkJCSovCisjZGVmaW5lCU9JCQkJMHg0MDAwCS8qIE92ZXJmbG93IEludGVycnVwdCBHZW5lcmF0ZWQJCQkJKi8KKyNkZWZpbmUJQkRJCQkJMHg4MDAwCS8qIEJsb2NrIERvbmUgSW50ZXJydXB0IEdlbmVyYXRlZAkJCSovCisKKy8qIGVudHJ5IGFkZHJlc3NlcyBvZiB0aGUgdXNlci1jYWxsYWJsZSBCb290IFJPTSBmdW5jdGlvbnMgKi8KKworI2RlZmluZSBfQk9PVFJPTV9SRVNFVCAweEVGMDAwMDAwCisjZGVmaW5lIF9CT09UUk9NX0ZJTkFMX0lOSVQgMHhFRjAwMDAwMgorI2RlZmluZSBfQk9PVFJPTV9ET19NRU1PUllfRE1BIDB4RUYwMDAwMDYKKyNkZWZpbmUgX0JPT1RST01fQk9PVF9EWEVfRkxBU0ggMHhFRjAwMDAwOAorI2RlZmluZSBfQk9PVFJPTV9CT09UX0RYRV9TUEkgMHhFRjAwMDAwQQorI2RlZmluZSBfQk9PVFJPTV9CT09UX0RYRV9UV0kgMHhFRjAwMDAwQworI2RlZmluZSBfQk9PVFJPTV9HRVRfRFhFX0FERFJFU1NfRkxBU0ggMHhFRjAwMDAxMAorI2RlZmluZSBfQk9PVFJPTV9HRVRfRFhFX0FERFJFU1NfU1BJIDB4RUYwMDAwMTIKKyNkZWZpbmUgX0JPT1RST01fR0VUX0RYRV9BRERSRVNTX1RXSSAweEVGMDAwMDE0CisKKy8qIEFsdGVybmF0ZSBEZXByZWNhdGVkIE1hY3JvcyBQcm92aWRlZCBGb3IgQmFja3dhcmRzIENvZGUgQ29tcGF0aWJpbGl0eSAqLworI2RlZmluZQlQR0RFX1VBUlQgICBQRkRFX1VBUlQKKyNkZWZpbmUJUEdERV9ETUEgICAgUEZERV9ETUEKKyNkZWZpbmUJQ0tFTE9XCQlTQ0tFTE9XCisKKy8qIEhPU1QgUG9ydCBSZWdpc3RlcnMgKi8KKworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgIEhPU1RfQ09OVFJPTCAgMHhmZmMwMzQwMCAgIC8qIEhPU1QgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICBIT1NUX1NUQVRVUyAgMHhmZmMwMzQwNCAgIC8qIEhPU1QgU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgSE9TVF9USU1FT1VUICAweGZmYzAzNDA4ICAgLyogSE9TVCBBY2tub3dsZWRnZSBNb2RlIFRpbWVvdXQgUmVnaXN0ZXIgKi8KKworLyogQ291bnRlciBSZWdpc3RlcnMgKi8KKworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgQ05UX0NPTkZJRyAgMHhmZmMwMzUwMCAgIC8qIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgICBDTlRfSU1BU0sgIDB4ZmZjMDM1MDQgICAvKiBJbnRlcnJ1cHQgTWFzayBSZWdpc3RlciAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgQ05UX1NUQVRVUyAgMHhmZmMwMzUwOCAgIC8qIFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICBDTlRfQ09NTUFORCAgMHhmZmMwMzUwYyAgIC8qIENvbW1hbmQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICBDTlRfREVCT1VOQ0UgIDB4ZmZjMDM1MTAgICAvKiBEZWJvdW5jZSBSZWdpc3RlciAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICBDTlRfQ09VTlRFUiAgMHhmZmMwMzUxNCAgIC8qIENvdW50ZXIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgICAgIENOVF9NQVggIDB4ZmZjMDM1MTggICAvKiBNYXhpbWFsIENvdW50IFJlZ2lzdGVyICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICAgICBDTlRfTUlOICAweGZmYzAzNTFjICAgLyogTWluaW1hbCBDb3VudCBSZWdpc3RlciAqLworCisvKiBPVFAvRlVTRSBSZWdpc3RlcnMgKi8KKworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICBPVFBfQ09OVFJPTCAgMHhmZmMwMzYwMCAgIC8qIE9UUC9GdXNlIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgICAgIE9UUF9CRU4gIDB4ZmZjMDM2MDQgICAvKiBPVFAvRnVzZSBCeXRlIEVuYWJsZSAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgT1RQX1NUQVRVUyAgMHhmZmMwMzYwOCAgIC8qIE9UUC9GdXNlIFN0YXR1cyAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgT1RQX1RJTUlORyAgMHhmZmMwMzYwYyAgIC8qIE9UUC9GdXNlIEFjY2VzcyBUaW1pbmcgKi8KKworLyogU2VjdXJpdHkgUmVnaXN0ZXJzICovCisKKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgIFNFQ1VSRV9TWVNTV1QgIDB4ZmZjMDM2MjAgICAvKiBTZWN1cmUgU3lzdGVtIFN3aXRjaGVzICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgIFNFQ1VSRV9DT05UUk9MICAweGZmYzAzNjI0ICAgLyogU2VjdXJlIENvbnRyb2wgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgIFNFQ1VSRV9TVEFUVVMgIDB4ZmZjMDM2MjggICAvKiBTZWN1cmUgU3RhdHVzICovCisKKy8qIE9UUCBSZWFkL1dyaXRlIERhdGEgQnVmZmVyIFJlZ2lzdGVycyAqLworCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICAgT1RQX0RBVEEwICAweGZmYzAzNjgwICAgLyogT1RQL0Z1c2UgRGF0YSAoT1RQX0RBVEEwLTMpIGFjY2Vzc2VzIHRoZSBmdXNlIHJlYWQgd3JpdGUgYnVmZmVyICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICAgT1RQX0RBVEExICAweGZmYzAzNjg0ICAgLyogT1RQL0Z1c2UgRGF0YSAoT1RQX0RBVEEwLTMpIGFjY2Vzc2VzIHRoZSBmdXNlIHJlYWQgd3JpdGUgYnVmZmVyICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICAgT1RQX0RBVEEyICAweGZmYzAzNjg4ICAgLyogT1RQL0Z1c2UgRGF0YSAoT1RQX0RBVEEwLTMpIGFjY2Vzc2VzIHRoZSBmdXNlIHJlYWQgd3JpdGUgYnVmZmVyICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICAgT1RQX0RBVEEzICAweGZmYzAzNjhjICAgLyogT1RQL0Z1c2UgRGF0YSAoT1RQX0RBVEEwLTMpIGFjY2Vzc2VzIHRoZSBmdXNlIHJlYWQgd3JpdGUgYnVmZmVyICovCisKKy8qIE1vdG9yIENvbnRyb2wgUFdNIFJlZ2lzdGVycyAqLworCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICAgIFBXTV9DVFJMICAweGZmYzAzNzAwICAgLyogUFdNIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgICAgUFdNX1NUQVQgIDB4ZmZjMDM3MDQgICAvKiBQV00gU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICAgICAgUFdNX1RNICAweGZmYzAzNzA4ICAgLyogUFdNIFBlcmlvZCBSZWdpc3RlciAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgICAgIFBXTV9EVCAgMHhmZmMwMzcwYyAgIC8qIFBXTSBEZWFkIFRpbWUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgICAgUFdNX0dBVEUgIDB4ZmZjMDM3MTAgICAvKiBQV00gQ2hvcHBpbmcgQ29udHJvbCAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgICAgUFdNX0NIQSAgMHhmZmMwMzcxNCAgIC8qIFBXTSBDaGFubmVsIEEgRHV0eSBDb250cm9sICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICAgICBQV01fQ0hCICAweGZmYzAzNzE4ICAgLyogUFdNIENoYW5uZWwgQiBEdXR5IENvbnRyb2wgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgICAgIFBXTV9DSEMgIDB4ZmZjMDM3MWMgICAvKiBQV00gQ2hhbm5lbCBDIER1dHkgQ29udHJvbCAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgICAgUFdNX1NFRyAgMHhmZmMwMzcyMCAgIC8qIFBXTSBDcm9zc292ZXIgYW5kIE91dHB1dCBFbmFibGUgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgIFBXTV9TWU5DV1QgIDB4ZmZjMDM3MjQgICAvKiBQV00gU3luYyBQbHVzZSBXaWR0aCBDb250cm9sICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICAgIFBXTV9DSEFMICAweGZmYzAzNzI4ICAgLyogUFdNIENoYW5uZWwgQUwgRHV0eSBDb250cm9sIChTUiBtb2RlIG9ubHkpICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICAgIFBXTV9DSEJMICAweGZmYzAzNzJjICAgLyogUFdNIENoYW5uZWwgQkwgRHV0eSBDb250cm9sIChTUiBtb2RlIG9ubHkpICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICAgIFBXTV9DSENMICAweGZmYzAzNzMwICAgLyogUFdNIENoYW5uZWwgQ0wgRHV0eSBDb250cm9sIChTUiBtb2RlIG9ubHkpICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICAgICBQV01fTFNJICAweGZmYzAzNzM0ICAgLyogUFdNIExvdyBTaWRlIEludmVydCAoU1IgbW9kZSBvbmx5KSAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgIFBXTV9TVEFUMiAgMHhmZmMwMzczOCAgIC8qIFBXTSBTdGF0dXMgUmVnaXN0ZXIgMiAqLworCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qICAgICBTSU5HTEUgQklUIE1BQ1JPIFBBSVJTIChiaXQgbWFzayBhbmQgbmVnYXRlZCBvbmUpICAgICAgKi8KKy8qICAgICBhbmQgTVVMVEkgQklUIFJFQUQgTUFDUk9TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworLyogQml0IG1hc2tzIGZvciBIT1NUX0NPTlRST0wgKi8KKworI2RlZmluZSAgICAgICAgICAgICAgICAgICBIT1NUX0NOVFJfSE9TVF9FTiAgMHgxICAgICAgICAvKiBIb3N0IEVuYWJsZSAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgIEhPU1RfQ05UUl9uSE9TVF9FTiAgMHgwCisjZGVmaW5lICAgICAgICAgICAgICAgICAgSE9TVF9DTlRSX0hPU1RfRU5EICAweDIgICAgICAgIC8qIEhvc3QgRW5kaWFuZXNzICovCisjZGVmaW5lICAgICAgICAgICAgICAgICBIT1NUX0NOVFJfbkhPU1RfRU5EICAweDAKKyNkZWZpbmUgICAgICAgICAgICAgICAgIEhPU1RfQ05UUl9EQVRBX1NJWkUgIDB4NCAgICAgICAgLyogRGF0YSBTaXplICovCisjZGVmaW5lICAgICAgICAgICAgICAgIEhPU1RfQ05UUl9uREFUQV9TSVpFICAweDAKKyNkZWZpbmUgICAgICAgICAgICAgICAgICBIT1NUX0NOVFJfSE9TVF9SU1QgIDB4OCAgICAgICAgLyogSG9zdCBSZXNldCAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgSE9TVF9DTlRSX25IT1NUX1JTVCAgMHgwCisjZGVmaW5lICAgICAgICAgICAgICAgICAgSE9TVF9DTlRSX0hSRFlfT1ZSICAweDIwICAgICAgIC8qIEhvc3QgUmVhZHkgT3ZlcnJpZGUgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgIEhPU1RfQ05UUl9uSFJEWV9PVlIgIDB4MAorI2RlZmluZSAgICAgICAgICAgICAgICAgIEhPU1RfQ05UUl9JTlRfTU9ERSAgMHg0MCAgICAgICAvKiBJbnRlcnJ1cHQgTW9kZSAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgSE9TVF9DTlRSX25JTlRfTU9ERSAgMHgwCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgSE9TVF9DTlRSX0JUX0VOICAweDgwICAgICAgIC8qIEJ1cyBUaW1lb3V0IEVuYWJsZSAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICBIT1NUX0NOVFJfIG5CVF9FTiAgMHgwCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICBIT1NUX0NOVFJfRUhXICAweDEwMCAgICAgIC8qIEVuYWJsZSBIb3N0IFdyaXRlICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgIEhPU1RfQ05UUl9uRUhXICAweDAKKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgIEhPU1RfQ05UUl9FSFIgIDB4MjAwICAgICAgLyogRW5hYmxlIEhvc3QgUmVhZCAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICBIT1NUX0NOVFJfbkVIUiAgMHgwCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICBIT1NUX0NOVFJfQkRSICAweDQwMCAgICAgIC8qIEJ1cnN0IERNQSBSZXF1ZXN0cyAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICBIT1NUX0NOVFJfbkJEUiAgMHgwCisKKy8qIEJpdCBtYXNrcyBmb3IgSE9TVF9TVEFUVVMgKi8KKworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgIEhPU1RfU1RBVF9SRUFEWSAgMHgxICAgICAgICAvKiBETUEgUmVhZHkgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgIEhPU1RfU1RBVF9uUkVBRFkgIDB4MAorI2RlZmluZSAgICAgICAgICAgICAgICAgIEhPU1RfU1RBVF9GSUZPRlVMTCAgMHgyICAgICAgICAvKiBGSUZPIEZ1bGwgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgIEhPU1RfU1RBVF9uRklGT0ZVTEwgIDB4MAorI2RlZmluZSAgICAgICAgICAgICAgICAgSE9TVF9TVEFUX0ZJRk9FTVBUWSAgMHg0ICAgICAgICAvKiBGSUZPIEVtcHR5ICovCisjZGVmaW5lICAgICAgICAgICAgICAgIEhPU1RfU1RBVF9uRklGT0VNUFRZICAweDAKKyNkZWZpbmUgICAgICAgICAgICAgICAgICBIT1NUX1NUQVRfQ09NUExFVEUgIDB4OCAgICAgICAgLyogRE1BIENvbXBsZXRlICovCisjZGVmaW5lICAgICAgICAgICAgICAgICBIT1NUX1NUQVRfbkNPTVBMRVRFICAweDAKKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgSE9TVF9TVEFUX0hTSEsgIDB4MTAgICAgICAgLyogSG9zdCBIYW5kc2hha2UgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICBIT1NUX1NUQVRfbkhTSEsgIDB4MAorI2RlZmluZSAgICAgICAgICAgICAgICAgICBIT1NUX1NUQVRfVElNRU9VVCAgMHgyMCAgICAgICAvKiBIb3N0IFRpbWVvdXQgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICBIT1NUX1NUQVRfblRJTUVPVVQgIDB4MAorI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICBIT1NUX1NUQVRfSElSUSAgMHg0MCAgICAgICAvKiBIb3N0IEludGVycnVwdCBSZXF1ZXN0ICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgSE9TVF9TVEFUX25ISVJRICAweDAKKyNkZWZpbmUgICAgICAgICAgICAgICAgSE9TVF9TVEFUX0FMTE9XX0NORkcgIDB4ODAgICAgICAgLyogQWxsb3cgTmV3IENvbmZpZ3VyYXRpb24gKi8KKyNkZWZpbmUgICAgICAgICAgICAgICBIT1NUX1NUQVRfbkFMTE9XX0NORkcgIDB4MAorI2RlZmluZSAgICAgICAgICAgICAgICAgICBIT1NUX1NUQVRfRE1BX0RJUiAgMHgxMDAgICAgICAvKiBETUEgRGlyZWN0aW9uICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgSE9TVF9TVEFUX25ETUFfRElSICAweDAKKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgIEhPU1RfU1RBVF9CVEUgIDB4MjAwICAgICAgLyogQnVzIFRpbWVvdXQgRW5hYmxlZCAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICBIT1NUX1NUQVRfbkJURSAgMHgwCisjZGVmaW5lICAgICAgICAgICAgICAgSE9TVF9TVEFUX0hPU1RSRF9ET05FICAweDgwMDAgICAgIC8qIEhvc3QgUmVhZCBDb21wbGV0aW9uIEludGVycnVwdCAqLworI2RlZmluZSAgICAgICAgICAgICAgSE9TVF9TVEFUX25IT1NUUkRfRE9ORSAgMHgwCisKKy8qIEJpdCBtYXNrcyBmb3IgSE9TVF9USU1FT1VUICovCisKKyNkZWZpbmUgICAgICAgICAgICAgSE9TVF9DT1VOVF9USU1FT1VUICAweDdmZiAgICAgIC8qIEhvc3QgVGltZW91dCBjb3VudCAqLworCisvKiBCaXQgbWFza3MgZm9yIENOVF9DT05GSUcgKi8KKworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICBDTlRFICAweDEgICAgICAgIC8qIENvdW50ZXIgRW5hYmxlICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgbkNOVEUgIDB4MAorI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICBERUJFICAweDIgICAgICAgIC8qIERlYm91bmNlIEVuYWJsZSAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgIG5ERUJFICAweDAKKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgIENER0lOViAgMHgxMCAgICAgICAvKiBDREcgUGluIFBvbGFyaXR5IEludmVydCAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICBuQ0RHSU5WICAweDAKKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgIENVRElOViAgMHgyMCAgICAgICAvKiBDVUQgUGluIFBvbGFyaXR5IEludmVydCAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICBuQ1VESU5WICAweDAKKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgIENaTUlOViAgMHg0MCAgICAgICAvKiBDWk0gUGluIFBvbGFyaXR5IEludmVydCAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICBuQ1pNSU5WICAweDAKKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgQ05UTU9ERSAgMHg3MDAgICAgICAvKiBDb3VudGVyIE9wZXJhdGluZyBNb2RlICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgIFpNWkMgIDB4ODAwICAgICAgLyogQ1pNIFplcm9lcyBDb3VudGVyIEVuYWJsZSAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgIG5aTVpDICAweDAKKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgQk5ETU9ERSAgMHgzMDAwICAgICAvKiBCb3VuZGFyeSByZWdpc3RlciBNb2RlICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICBJTlBESVMgIDB4ODAwMCAgICAgLyogQ1VHIGFuZCBDREcgSW5wdXQgRGlzYWJsZSAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICBuSU5QRElTICAweDAKKworLyogQml0IG1hc2tzIGZvciBDTlRfSU1BU0sgKi8KKworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICBJQ0lFICAweDEgICAgICAgIC8qIElsbGVnYWwgR3JheS9CaW5hcnkgQ29kZSBJbnRlcnJ1cHQgRW5hYmxlICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgbklDSUUgIDB4MAorI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICBVQ0lFICAweDIgICAgICAgIC8qIFVwIGNvdW50IEludGVycnVwdCBFbmFibGUgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICBuVUNJRSAgMHgwCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgIERDSUUgIDB4NCAgICAgICAgLyogRG93biBjb3VudCBJbnRlcnJ1cHQgRW5hYmxlICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgbkRDSUUgIDB4MAorI2RlZmluZSAgICAgICAgICAgICAgICAgICAgTUlOQ0lFICAweDggICAgICAgIC8qIE1pbiBDb3VudCBJbnRlcnJ1cHQgRW5hYmxlICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgIG5NSU5DSUUgIDB4MAorI2RlZmluZSAgICAgICAgICAgICAgICAgICAgTUFYQ0lFICAweDEwICAgICAgIC8qIE1heCBDb3VudCBJbnRlcnJ1cHQgRW5hYmxlICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgIG5NQVhDSUUgIDB4MAorI2RlZmluZSAgICAgICAgICAgICAgICAgICBDT1YzMUlFICAweDIwICAgICAgIC8qIEJpdCAzMSBPdmVyZmxvdyBJbnRlcnJ1cHQgRW5hYmxlICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgbkNPVjMxSUUgIDB4MAorI2RlZmluZSAgICAgICAgICAgICAgICAgICBDT1YxNUlFICAweDQwICAgICAgIC8qIEJpdCAxNSBPdmVyZmxvdyBJbnRlcnJ1cHQgRW5hYmxlICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgbkNPVjE1SUUgIDB4MAorI2RlZmluZSAgICAgICAgICAgICAgICAgICBDWkVST0lFICAweDgwICAgICAgIC8qIENvdW50IHRvIFplcm8gSW50ZXJydXB0IEVuYWJsZSAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgIG5DWkVST0lFICAweDAKKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICBDWk1JRSAgMHgxMDAgICAgICAvKiBDWk0gUGluIEludGVycnVwdCBFbmFibGUgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgIG5DWk1JRSAgMHgwCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICBDWk1FSUUgIDB4MjAwICAgICAgLyogQ1pNIEVycm9yIEludGVycnVwdCBFbmFibGUgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgbkNaTUVJRSAgMHgwCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICBDWk1aSUUgIDB4NDAwICAgICAgLyogQ1pNIFplcm9lcyBDb3VudGVyIEludGVycnVwdCBFbmFibGUgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgbkNaTVpJRSAgMHgwCisKKy8qIEJpdCBtYXNrcyBmb3IgQ05UX1NUQVRVUyAqLworCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgIElDSUkgIDB4MSAgICAgICAgLyogSWxsZWdhbCBHcmF5L0JpbmFyeSBDb2RlIEludGVycnVwdCBJZGVudGlmaWVyICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgbklDSUkgIDB4MAorI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICBVQ0lJICAweDIgICAgICAgIC8qIFVwIGNvdW50IEludGVycnVwdCBJZGVudGlmaWVyICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgblVDSUkgIDB4MAorI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICBEQ0lJICAweDQgICAgICAgIC8qIERvd24gY291bnQgSW50ZXJydXB0IElkZW50aWZpZXIgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICBuRENJSSAgMHgwCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICBNSU5DSUkgIDB4OCAgICAgICAgLyogTWluIENvdW50IEludGVycnVwdCBJZGVudGlmaWVyICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgIG5NSU5DSUkgIDB4MAorI2RlZmluZSAgICAgICAgICAgICAgICAgICAgTUFYQ0lJICAweDEwICAgICAgIC8qIE1heCBDb3VudCBJbnRlcnJ1cHQgSWRlbnRpZmllciAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICBuTUFYQ0lJICAweDAKKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgQ09WMzFJSSAgMHgyMCAgICAgICAvKiBCaXQgMzEgT3ZlcmZsb3cgSW50ZXJydXB0IElkZW50aWZpZXIgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICBuQ09WMzFJSSAgMHgwCisjZGVmaW5lICAgICAgICAgICAgICAgICAgIENPVjE1SUkgIDB4NDAgICAgICAgLyogQml0IDE1IE92ZXJmbG93IEludGVycnVwdCBJZGVudGlmaWVyICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgbkNPVjE1SUkgIDB4MAorI2RlZmluZSAgICAgICAgICAgICAgICAgICBDWkVST0lJICAweDgwICAgICAgIC8qIENvdW50IHRvIFplcm8gSW50ZXJydXB0IElkZW50aWZpZXIgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICBuQ1pFUk9JSSAgMHgwCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgQ1pNSUkgIDB4MTAwICAgICAgLyogQ1pNIFBpbiBJbnRlcnJ1cHQgSWRlbnRpZmllciAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgbkNaTUlJICAweDAKKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgIENaTUVJSSAgMHgyMDAgICAgICAvKiBDWk0gRXJyb3IgSW50ZXJydXB0IElkZW50aWZpZXIgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgbkNaTUVJSSAgMHgwCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICBDWk1aSUkgIDB4NDAwICAgICAgLyogQ1pNIFplcm9lcyBDb3VudGVyIEludGVycnVwdCBJZGVudGlmaWVyICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgIG5DWk1aSUkgIDB4MAorCisvKiBCaXQgbWFza3MgZm9yIENOVF9DT01NQU5EICovCisKKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgIFcxTENOVCAgMHhmICAgICAgICAvKiBMb2FkIENvdW50ZXIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgIFcxTE1JTiAgMHhmMCAgICAgICAvKiBMb2FkIE1pbiBSZWdpc3RlciAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgVzFMTUFYICAweGYwMCAgICAgIC8qIExvYWQgTWF4IFJlZ2lzdGVyICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgVzFaTU9OQ0UgIDB4MTAwMCAgICAgLyogRW5hYmxlIENaTSBDbGVhciBDb3VudGVyIE9uY2UgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgIG5XMVpNT05DRSAgMHgwCisKKy8qIEJpdCBtYXNrcyBmb3IgQ05UX0RFQk9VTkNFICovCisKKyNkZWZpbmUgICAgICAgICAgICAgICAgIERQUkVTQ0FMRSAgMHhmICAgICAgICAvKiBMb2FkIENvdW50ZXIgUmVnaXN0ZXIgKi8KKworLyogQ05UX0NPTU1BTkQgYml0IGZpZWxkIG9wdGlvbnMgKi8KKworI2RlZmluZSBXMUxDTlRfWkVSTyAgIDB4MDAwMSAgIC8qIHdyaXRlIDEgdG8gbG9hZCBDTlRfQ09VTlRFUiB3aXRoIHplcm8gKi8KKyNkZWZpbmUgVzFMQ05UX01JTiAgICAweDAwMDQgICAvKiB3cml0ZSAxIHRvIGxvYWQgQ05UX0NPVU5URVIgZnJvbSBDTlRfTUlOICovCisjZGVmaW5lIFcxTENOVF9NQVggICAgMHgwMDA4ICAgLyogd3JpdGUgMSB0byBsb2FkIENOVF9DT1VOVEVSIGZyb20gQ05UX01BWCAqLworCisjZGVmaW5lIFcxTE1JTl9aRVJPICAgMHgwMDEwICAgLyogd3JpdGUgMSB0byBsb2FkIENOVF9NSU4gd2l0aCB6ZXJvICovCisjZGVmaW5lIFcxTE1JTl9DTlQgICAgMHgwMDIwICAgLyogd3JpdGUgMSB0byBsb2FkIENOVF9NSU4gZnJvbSBDTlRfQ09VTlRFUiAqLworI2RlZmluZSBXMUxNSU5fTUFYICAgIDB4MDA4MCAgIC8qIHdyaXRlIDEgdG8gbG9hZCBDTlRfTUlOIGZyb20gQ05UX01BWCAqLworCisjZGVmaW5lIFcxTE1BWF9aRVJPICAgMHgwMTAwICAgLyogd3JpdGUgMSB0byBsb2FkIENOVF9NQVggd2l0aCB6ZXJvICovCisjZGVmaW5lIFcxTE1BWF9DTlQgICAgMHgwMjAwICAgLyogd3JpdGUgMSB0byBsb2FkIENOVF9NQVggZnJvbSBDTlRfQ09VTlRFUiAqLworI2RlZmluZSBXMUxNQVhfTUlOICAgIDB4MDQwMCAgIC8qIHdyaXRlIDEgdG8gbG9hZCBDTlRfTUFYIGZyb20gQ05UX01JTiAqLworCisvKiBDTlRfQ09ORklHIGJpdCBmaWVsZCBvcHRpb25zICovCisKKyNkZWZpbmUgQ05UTU9ERV9RVUFERU5DICAweDAwMDAgIC8qIHF1YWRyYXR1cmUgZW5jb2RlciBtb2RlICovCisjZGVmaW5lIENOVE1PREVfQklORU5DICAgMHgwMTAwICAvKiBiaW5hcnkgZW5jb2RlciBtb2RlICovCisjZGVmaW5lIENOVE1PREVfVURDTlQgICAgMHgwMjAwICAvKiB1cC9kb3duIGNvdW50ZXIgbW9kZSAqLworI2RlZmluZSBDTlRNT0RFX0RJUkNOVCAgIDB4MDQwMCAgLyogZGlyZWN0aW9uIGNvdW50ZXIgbW9kZSAqLworI2RlZmluZSBDTlRNT0RFX0RJUlRNUiAgIDB4MDUwMCAgLyogZGlyZWN0aW9uIHRpbWVyIG1vZGUgKi8KKworI2RlZmluZSBCTkRNT0RFX0NPTVAgICAgIDB4MDAwMCAgLyogYm91bmRhcnkgY29tcGFyZSBtb2RlICovCisjZGVmaW5lIEJORE1PREVfWkVSTyAgICAgMHgxMDAwICAvKiBib3VuZGFyeSBjb21wYXJlIGFuZCB6ZXJvIG1vZGUgKi8KKyNkZWZpbmUgQk5ETU9ERV9DQVBUICAgICAweDIwMDAgIC8qIGJvdW5kYXJ5IGNhcHR1cmUgbW9kZSAqLworI2RlZmluZSBCTkRNT0RFX0FFWFQgICAgIDB4MzAwMCAgLyogYm91bmRhcnkgYXV0by1leHRlbmQgbW9kZSAqLworCisvKiBCaXQgbWFza3MgZm9yIE9UUF9DT05UUk9MICovCisKKyNkZWZpbmUgICAgICAgICAgICAgICAgRlVTRV9GQUREUiAgMHgxZmYgICAgICAvKiBPVFAvRnVzZSBBZGRyZXNzICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgIEZJRU4gIDB4ODAwICAgICAgLyogT1RQL0Z1c2UgSW50ZXJydXB0IEVuYWJsZSAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgIG5GSUVOICAweDAKKyNkZWZpbmUgICAgICAgICAgICAgICAgICBGVEVTVERFQyAgMHgxMDAwICAgICAvKiBPVFAvRnVzZSBUZXN0IERlY29kZXIgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgIG5GVEVTVERFQyAgMHgwCisjZGVmaW5lICAgICAgICAgICAgICAgICAgIEZXUlRFU1QgIDB4MjAwMCAgICAgLyogT1RQL0Z1c2UgV3JpdGUgVGVzdCAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgIG5GV1JURVNUICAweDAKKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICBGUkRFTiAgMHg0MDAwICAgICAvKiBPVFAvRnVzZSBSZWFkIEVuYWJsZSAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgbkZSREVOICAweDAKKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICBGV1JFTiAgMHg4MDAwICAgICAvKiBPVFAvRnVzZSBXcml0ZSBFbmFibGUgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgIG5GV1JFTiAgMHgwCisKKy8qIEJpdCBtYXNrcyBmb3IgT1RQX0JFTiAqLworCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgIEZCRU4gIDB4ZmZmZiAgICAgLyogT1RQL0Z1c2UgQnl0ZSBFbmFibGUgKi8KKworLyogQml0IG1hc2tzIGZvciBPVFBfU1RBVFVTICovCisKKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICBGQ09NUCAgMHgxICAgICAgICAvKiBPVFAvRnVzZSBBY2Nlc3MgQ29tcGxldGUgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgIG5GQ09NUCAgMHgwCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICBGRVJST1IgIDB4MiAgICAgICAgLyogT1RQL0Z1c2UgQWNjZXNzIEVycm9yICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgIG5GRVJST1IgIDB4MAorI2RlZmluZSAgICAgICAgICAgICAgICAgIE1NUkdMT0FEICAweDEwICAgICAgIC8qIE1lbW9yeSBNYXBwZWQgUmVnaXN0ZXIgR2Fza2V0IExvYWQgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgIG5NTVJHTE9BRCAgMHgwCisjZGVmaW5lICAgICAgICAgICAgICAgICAgTU1SR0xPQ0sgIDB4MjAgICAgICAgLyogTWVtb3J5IE1hcHBlZCBSZWdpc3RlciBHYXNrZXQgTG9jayAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgbk1NUkdMT0NLICAweDAKKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgIEZQR01FTiAgMHg0MCAgICAgICAvKiBPVFAvRnVzZSBQcm9ncmFtIEVuYWJsZSAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICBuRlBHTUVOICAweDAKKworLyogQml0IG1hc2tzIGZvciBPVFBfVElNSU5HICovCisKKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgVVNFQ0RJViAgMHhmZiAgICAgICAvKiBNaWNybyBTZWNvbmQgRGl2aWRlciAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICBSRUFEQUNDICAweDdmMDAgICAgIC8qIFJlYWQgQWNjZXNzIFRpbWUgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgQ1BVTVBSTCAgMHgzODAwMCAgICAvKiBDaGFyZ2UgUHVtcCBSZWxlYXNlIFRpbWUgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgQ1BVTVBTVSAgMHhjMDAwMCAgICAvKiBDaGFyZ2UgUHVtcCBTZXR1cCBUaW1lICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgIENQVU1QSEQgIDB4ZjAwMDAwICAgLyogQ2hhcmdlIFB1bXAgSG9sZCBUaW1lICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgIFBHTVRJTUUgIDB4ZmYwMDAwMDAgLyogUHJvZ3JhbSBUaW1lICovCisKKy8qIEJpdCBtYXNrcyBmb3IgU0VDVVJFX1NZU1NXVCAqLworCisjZGVmaW5lICAgICAgICAgICAgICAgICAgIEVNVURBQkwgIDB4MSAgICAgICAgLyogRW11bGF0aW9uIERpc2FibGUuICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgbkVNVURBQkwgIDB4MAorI2RlZmluZSAgICAgICAgICAgICAgICAgICBSU1REQUJMICAweDIgICAgICAgIC8qIFJlc2V0IERpc2FibGUgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICBuUlNUREFCTCAgMHgwCisjZGVmaW5lICAgICAgICAgICAgICAgICAgIEwxSURBQkwgIDB4MWMgICAgICAgLyogTDEgSW5zdHJ1Y3Rpb24gTWVtb3J5IERpc2FibGUuICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgTDFEQURBQkwgIDB4ZTAgICAgICAgLyogTDEgRGF0YSBCYW5rIEEgTWVtb3J5IERpc2FibGUuICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgTDFEQkRBQkwgIDB4NzAwICAgICAgLyogTDEgRGF0YSBCYW5rIEIgTWVtb3J5IERpc2FibGUuICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgIERNQTBPVlIgIDB4ODAwICAgICAgLyogRE1BMCBNZW1vcnkgQWNjZXNzIE92ZXJyaWRlICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgbkRNQTBPVlIgIDB4MAorI2RlZmluZSAgICAgICAgICAgICAgICAgICBETUExT1ZSICAweDEwMDAgICAgIC8qIERNQTEgTWVtb3J5IEFjY2VzcyBPdmVycmlkZSAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgIG5ETUExT1ZSICAweDAKKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgIEVNVU9WUiAgMHg0MDAwICAgICAvKiBFbXVsYXRpb24gT3ZlcnJpZGUgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgbkVNVU9WUiAgMHgwCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICBPVFBTRU4gIDB4ODAwMCAgICAgLyogT1RQIFNlY3JldHMgRW5hYmxlLiAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICBuT1RQU0VOICAweDAKKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgIEwyREFCTCAgMHg3MDAwMCAgICAvKiBMMiBNZW1vcnkgRGlzYWJsZS4gKi8KKworLyogQml0IG1hc2tzIGZvciBTRUNVUkVfQ09OVFJPTCAqLworCisjZGVmaW5lICAgICAgICAgICAgICAgICAgIFNFQ1VSRTAgIDB4MSAgICAgICAgLyogU0VDVVJFIDAgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICBuU0VDVVJFMCAgMHgwCisjZGVmaW5lICAgICAgICAgICAgICAgICAgIFNFQ1VSRTEgIDB4MiAgICAgICAgLyogU0VDVVJFIDEgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICBuU0VDVVJFMSAgMHgwCisjZGVmaW5lICAgICAgICAgICAgICAgICAgIFNFQ1VSRTIgIDB4NCAgICAgICAgLyogU0VDVVJFIDIgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICBuU0VDVVJFMiAgMHgwCisjZGVmaW5lICAgICAgICAgICAgICAgICAgIFNFQ1VSRTMgIDB4OCAgICAgICAgLyogU0VDVVJFIDMgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICBuU0VDVVJFMyAgMHgwCisKKy8qIEJpdCBtYXNrcyBmb3IgU0VDVVJFX1NUQVRVUyAqLworCisjZGVmaW5lICAgICAgICAgICAgICAgICAgIFNFQ01PREUgIDB4MyAgICAgICAgLyogU2VjdXJlZCBNb2RlIENvbnRyb2wgU3RhdGUgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgIE5NSSAgMHg0ICAgICAgICAvKiBOb24gTWFza2FibGUgSW50ZXJydXB0ICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgIG5OTUkgIDB4MAorI2RlZmluZSAgICAgICAgICAgICAgICAgICBBRlZBTElEICAweDggICAgICAgIC8qIEF1dGhlbnRpY2F0aW9uIEZpcm13YXJlIFZhbGlkICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgbkFGVkFMSUQgIDB4MAorI2RlZmluZSAgICAgICAgICAgICAgICAgICAgQUZFWElUICAweDEwICAgICAgIC8qIEF1dGhlbnRpY2F0aW9uIEZpcm13YXJlIEV4aXQgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgbkFGRVhJVCAgMHgwCisjZGVmaW5lICAgICAgICAgICAgICAgICAgIFNFQ1NUQVQgIDB4ZTAgICAgICAgLyogU2VjdXJlIFN0YXR1cyAqLworCisKKworI2VuZGlmIC8qIF9ERUZfQkY1MVhfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2luY2x1ZGUvbWFjaC9kbWEuaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9pbmNsdWRlL21hY2gvZG1hLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmJkMzNjMQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9pbmNsdWRlL21hY2gvZG1hLmgKQEAgLTAsMCArMSwzMyBAQAorLyogbWFjaC9kbWEuaCAtIGFyY2gtc3BlY2lmaWMgRE1BIGRlZmluZXMKKyAqCisgKiBDb3B5cmlnaHQgMjAwNC0yMDA4IEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCisgKi8KKworI2lmbmRlZiBfTUFDSF9ETUFfSF8KKyNkZWZpbmUgX01BQ0hfRE1BX0hfCisKKyNkZWZpbmUgTUFYX0RNQV9DSEFOTkVMUyAxNgorCisjZGVmaW5lIENIX1BQSSAJCQkwCS8qIFBQSSByZWNlaXZlL3RyYW5zbWl0ICovCisjZGVmaW5lIENIX0VNQUNfUlggCQkxCS8qIEV0aGVybmV0IE1BQyByZWNlaXZlICovCisjZGVmaW5lIENIX0VNQUNfVFggCQkyCS8qIEV0aGVybmV0IE1BQyB0cmFuc21pdCAqLworI2RlZmluZSBDSF9TUE9SVDBfUlggCQkzCS8qIFNQT1JUMCByZWNlaXZlICovCisjZGVmaW5lIENIX1NQT1JUMF9UWCAJCTQJLyogU1BPUlQwIHRyYW5zbWl0ICovCisjZGVmaW5lIENIX1JTSSAJCQk0CS8qIFJTSSAqLworI2RlZmluZSBDSF9TUE9SVDFfUlggCQk1CS8qIFNQT1JUMSByZWNlaXZlICovCisjZGVmaW5lIENIX1NQSTEgCQk1CS8qIFNQSTEgdHJhbnNtaXQvcmVjZWl2ZSAqLworI2RlZmluZSBDSF9TUE9SVDFfVFggCQk2CS8qIFNQT1JUMSB0cmFuc21pdCAqLworI2RlZmluZSBDSF9TUEkwIAkJNwkvKiBTUEkwIHRyYW5zbWl0L3JlY2VpdmUgKi8KKyNkZWZpbmUgQ0hfVUFSVDBfUlggCQk4CS8qIFVBUlQwIHJlY2VpdmUgKi8KKyNkZWZpbmUgQ0hfVUFSVDBfVFggCQk5CS8qIFVBUlQwIHRyYW5zbWl0ICovCisjZGVmaW5lIENIX1VBUlQxX1JYIAkJMTAJLyogVUFSVDEgcmVjZWl2ZSAqLworI2RlZmluZSBDSF9VQVJUMV9UWCAJCTExCS8qIFVBUlQxIHRyYW5zbWl0ICovCisKKyNkZWZpbmUgQ0hfTUVNX1NUUkVBTTBfU1JDIAkxMgkvKiBSWCAqLworI2RlZmluZSBDSF9NRU1fU1RSRUFNMF9ERVNUCTEzCS8qIFRYICovCisjZGVmaW5lIENIX01FTV9TVFJFQU0xX1NSQyAJMTQJLyogUlggKi8KKyNkZWZpbmUgQ0hfTUVNX1NUUkVBTTFfREVTVAkxNQkvKiBUWCAqLworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9pbmNsdWRlL21hY2gvZ3Bpby5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2luY2x1ZGUvbWFjaC9ncGlvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTc1NzY4MwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9pbmNsdWRlL21hY2gvZ3Bpby5oCkBAIC0wLDAgKzEsNjAgQEAKKy8qCisgKiBGaWxlOiBhcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvaW5jbHVkZS9tYWNoL2dwaW8uaAorICogQnVnczogRW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA4IEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KKyAqLworCisKKyNpZm5kZWYgX01BQ0hfR1BJT19IXworI2RlZmluZSBfTUFDSF9HUElPX0hfCisKKyNkZWZpbmUgTUFYX0JMQUNLRklOX0dQSU9TIDQwCisKKyNkZWZpbmUJR1BJT19QRjAJMAorI2RlZmluZQlHUElPX1BGMQkxCisjZGVmaW5lCUdQSU9fUEYyCTIKKyNkZWZpbmUJR1BJT19QRjMJMworI2RlZmluZQlHUElPX1BGNAk0CisjZGVmaW5lCUdQSU9fUEY1CTUKKyNkZWZpbmUJR1BJT19QRjYJNgorI2RlZmluZQlHUElPX1BGNwk3CisjZGVmaW5lCUdQSU9fUEY4CTgKKyNkZWZpbmUJR1BJT19QRjkJOQorI2RlZmluZQlHUElPX1BGMTAJMTAKKyNkZWZpbmUJR1BJT19QRjExCTExCisjZGVmaW5lCUdQSU9fUEYxMgkxMgorI2RlZmluZQlHUElPX1BGMTMJMTMKKyNkZWZpbmUJR1BJT19QRjE0CTE0CisjZGVmaW5lCUdQSU9fUEYxNQkxNQorI2RlZmluZQlHUElPX1BHMAkxNgorI2RlZmluZQlHUElPX1BHMQkxNworI2RlZmluZQlHUElPX1BHMgkxOAorI2RlZmluZQlHUElPX1BHMwkxOQorI2RlZmluZQlHUElPX1BHNAkyMAorI2RlZmluZQlHUElPX1BHNQkyMQorI2RlZmluZQlHUElPX1BHNgkyMgorI2RlZmluZQlHUElPX1BHNwkyMworI2RlZmluZQlHUElPX1BHOAkyNAorI2RlZmluZQlHUElPX1BHOQkyNQorI2RlZmluZQlHUElPX1BHMTAgICAgICAJMjYKKyNkZWZpbmUJR1BJT19QRzExICAgICAgCTI3CisjZGVmaW5lCUdQSU9fUEcxMiAgICAgIAkyOAorI2RlZmluZQlHUElPX1BHMTMgICAgICAJMjkKKyNkZWZpbmUJR1BJT19QRzE0ICAgICAgCTMwCisjZGVmaW5lCUdQSU9fUEcxNSAgICAgIAkzMQorI2RlZmluZQlHUElPX1BIMAkzMgorI2RlZmluZQlHUElPX1BIMQkzMworI2RlZmluZQlHUElPX1BIMgkzNAorI2RlZmluZQlHUElPX1BIMwkzNQorI2RlZmluZQlHUElPX1BINAkzNgorI2RlZmluZQlHUElPX1BINQkzNworI2RlZmluZQlHUElPX1BINgkzOAorI2RlZmluZQlHUElPX1BINwkzOQorCisjZGVmaW5lIFBPUlRfRiBHUElPX1BGMAorI2RlZmluZSBQT1JUX0cgR1BJT19QRzAKKyNkZWZpbmUgUE9SVF9IIEdQSU9fUEgwCisKKyNlbmRpZiAvKiBfTUFDSF9HUElPX0hfICovCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvaW5jbHVkZS9tYWNoL2lycS5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2luY2x1ZGUvbWFjaC9pcnEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZmYwZjA5Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2luY2x1ZGUvbWFjaC9pcnEuaApAQCAtMCwwICsxLDI2MCBAQAorLyoKKyAqIGZpbGU6CWluY2x1ZGUvYXNtLWJsYWNrZmluL21hY2gtYmY1MTgvaXJxLmgKKyAqIGJhc2VkIG9uOglpbmNsdWRlL2FzbS1ibGFja2Zpbi9tYWNoLWJmNTI3L2lycS5oCisgKiBhdXRob3I6CU1pY2hhZWwgSGVubmVyaWNoIChtaWNoYWVsLmhlbm5lcmljaEBhbmFsb2cuY29tKQorICoKKyAqIGNyZWF0ZWQ6CisgKiBkZXNjcmlwdGlvbjoKKyAqCXN5c3RlbSBtbXIgcmVnaXN0ZXIgbWFwCisgKiByZXY6CisgKgorICogbW9kaWZpZWQ6CisgKgorICoKKyAqIGJ1Z3M6ICAgICAgICAgZW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCisgKgorICogdGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgZ251IGdlbmVyYWwgcHVibGljIGxpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgZnJlZSBzb2Z0d2FyZSBmb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiB0aGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCB3aXRob3V0IGFueSB3YXJyYW50eTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBtZXJjaGFudGFiaWxpdHkgb3IgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuICBzZWUgdGhlCisgKiBnbnUgZ2VuZXJhbCBwdWJsaWMgbGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIHlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIGdudSBnZW5lcmFsIHB1YmxpYyBsaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIGNvcHlpbmcuCisgKiBpZiBub3QsIHdyaXRlIHRvIHRoZSBmcmVlIHNvZnR3YXJlIGZvdW5kYXRpb24sCisgKiA1OSB0ZW1wbGUgcGxhY2UgLSBzdWl0ZSAzMzAsIGJvc3RvbiwgbWEgMDIxMTEtMTMwNywgdXNhLgorICovCisKKyNpZm5kZWYgX0JGNTE4X0lSUV9IXworI2RlZmluZSBfQkY1MThfSVJRX0hfCisKKy8qCisgKiBJbnRlcnJ1cHQgc291cmNlIGRlZmluaXRpb25zCisJRXZlbnQgU291cmNlICAgIENvcmUgRXZlbnQgTmFtZQorCUNvcmUgICAgICAgIEVtdWxhdGlvbiAgICAgICAgICAgICAgICoqCisJRXZlbnRzICAgICAgICAgKGhpZ2hlc3QgcHJpb3JpdHkpICBFTVUgICAgICAgICAwCisJUmVzZXQgICAgICAgICAgICAgICAgICAgUlNUICAgICAgICAgMQorCU5NSSAgICAgICAgICAgICAgICAgICAgIE5NSSAgICAgICAgIDIKKwlFeGNlcHRpb24gICAgICAgICAgICAgICBFVlggICAgICAgICAzCisJUmVzZXJ2ZWQgICAgICAgICAgICAgICAgLS0gICAgICAgICAgNAorCUhhcmR3YXJlIEVycm9yICAgICAgICAgIElWSFcgICAgICAgIDUKKwlDb3JlIFRpbWVyICAgICAgICAgICAgICBJVlRNUiAgICAgICA2ICoKKworCS4uLi4uCisKKwkgU29mdHdhcmUgSW50ZXJydXB0IDEgICAgSVZHMTQgICAgICAgMzEKKwkgU29mdHdhcmUgSW50ZXJydXB0IDIgICAgLS0KKwkgKGxvd2VzdCBwcmlvcml0eSkgIElWRzE1ICAgICAgIDMyICoKKyovCisKKyNkZWZpbmUgTlJfUEVSSV9JTlRTICAgICgyICogMzIpCisKKy8qIFRoZSBBQlNUUkFDVCBJUlEgZGVmaW5pdGlvbnMgKi8KKy8qKiB0aGUgZmlyc3Qgc2V2ZW4gb2YgdGhlIGZvbGxvd2luZyBhcmUgZml4ZWQsIHRoZSByZXN0IHlvdSBjaGFuZ2UgaWYgeW91IG5lZWQgdG8gKiovCisjZGVmaW5lIElSUV9FTVUJCQkwCS8qIEVtdWxhdGlvbiAqLworI2RlZmluZSBJUlFfUlNUCQkJMQkvKiByZXNldCAqLworI2RlZmluZSBJUlFfTk1JCQkJMgkvKiBOb24gTWFza2FibGUgKi8KKyNkZWZpbmUgSVJRX0VWWAkJCTMJLyogRXhjZXB0aW9uICovCisjZGVmaW5lIElSUV9VTlVTRUQJCTQJLyogLSB1bnVzZWQgaW50ZXJydXB0ICovCisjZGVmaW5lIElSUV9IV0VSUgkJNQkvKiBIYXJkd2FyZSBFcnJvciAqLworI2RlZmluZSBJUlFfQ09SRVRNUgkJNgkvKiBDb3JlIHRpbWVyICovCisKKyNkZWZpbmUgQkZJTl9JUlEoeCkJCSgoeCkgKyA3KQorCisjZGVmaW5lIElSUV9QTExfV0FLRVVQCQlCRklOX0lSUSgwKQkvKiBQTEwgV2FrZXVwIEludGVycnVwdCAqLworI2RlZmluZSBJUlFfRE1BMF9FUlJPUgkJQkZJTl9JUlEoMSkJLyogRE1BIEVycm9yIDAgKGdlbmVyaWMpICovCisjZGVmaW5lIElSUV9ETUFSMF9CTEsJCUJGSU5fSVJRKDIpCS8qIERNQVIwIEJsb2NrIEludGVycnVwdCAqLworI2RlZmluZSBJUlFfRE1BUjFfQkxLCQlCRklOX0lSUSgzKQkvKiBETUFSMSBCbG9jayBJbnRlcnJ1cHQgKi8KKyNkZWZpbmUgSVJRX0RNQVIwX09WUgkJQkZJTl9JUlEoNCkJLyogRE1BUjAgT3ZlcmZsb3cgRXJyb3IgKi8KKyNkZWZpbmUgSVJRX0RNQVIxX09WUgkJQkZJTl9JUlEoNSkJLyogRE1BUjEgT3ZlcmZsb3cgRXJyb3IgKi8KKyNkZWZpbmUgSVJRX1BQSV9FUlJPUgkJQkZJTl9JUlEoNikJLyogUFBJIEVycm9yICovCisjZGVmaW5lIElSUV9NQUNfRVJST1IJCUJGSU5fSVJRKDcpCS8qIE1BQyBTdGF0dXMgKi8KKyNkZWZpbmUgSVJRX1NQT1JUMF9FUlJPUglCRklOX0lSUSg4KQkvKiBTUE9SVDAgU3RhdHVzICovCisjZGVmaW5lIElSUV9TUE9SVDFfRVJST1IJQkZJTl9JUlEoOSkJLyogU1BPUlQxIFN0YXR1cyAqLworI2RlZmluZSBJUlFfUFRQX0VSUk9SCQlCRklOX0lSUSgxMCkJLyogUFRQIEVycm9yIEludGVycnVwdCAqLworI2RlZmluZSBJUlFfVUFSVDBfRVJST1IJCUJGSU5fSVJRKDEyKQkvKiBVQVJUMCBTdGF0dXMgKi8KKyNkZWZpbmUgSVJRX1VBUlQxX0VSUk9SCQlCRklOX0lSUSgxMykJLyogVUFSVDEgU3RhdHVzICovCisjZGVmaW5lIElSUV9SVEMJCQlCRklOX0lSUSgxNCkJLyogUlRDICovCisjZGVmaW5lIElSUV9QUEkgICAgICAJCUJGSU5fSVJRKDE1KQkvKiBETUEgQ2hhbm5lbCAwIChQUEkpICovCisjZGVmaW5lIElSUV9TUE9SVDBfUlgJCUJGSU5fSVJRKDE2KQkvKiBETUEgMyBDaGFubmVsIChTUE9SVDAgUlgpICovCisjZGVmaW5lIElSUV9TUE9SVDBfVFgJCUJGSU5fSVJRKDE3KQkvKiBETUEgNCBDaGFubmVsIChTUE9SVDAgVFgpICovCisjZGVmaW5lIElSUV9SU0kJCQlCRklOX0lSUSgxNykJLyogRE1BIDQgQ2hhbm5lbCAoUlNJKSAqLworI2RlZmluZSBJUlFfU1BPUlQxX1JYCQlCRklOX0lSUSgxOCkJLyogRE1BIDUgQ2hhbm5lbCAoU1BPUlQxIFJYL1NQSSkgKi8KKyNkZWZpbmUgSVJRX1NQSTEJCUJGSU5fSVJRKDE4KQkvKiBETUEgNSBDaGFubmVsIChTUEkxKSAqLworI2RlZmluZSBJUlFfU1BPUlQxX1RYCQlCRklOX0lSUSgxOSkJLyogRE1BIDYgQ2hhbm5lbCAoU1BPUlQxIFRYKSAqLworI2RlZmluZSBJUlFfVFdJICAgICAgCQlCRklOX0lSUSgyMCkJLyogVFdJICovCisjZGVmaW5lIElSUV9TUEkwICAgICAJCUJGSU5fSVJRKDIxKQkvKiBETUEgNyBDaGFubmVsIChTUEkwKSAqLworI2RlZmluZSBJUlFfVUFSVDBfUlggCQlCRklOX0lSUSgyMikJLyogRE1BOCBDaGFubmVsIChVQVJUMCBSWCkgKi8KKyNkZWZpbmUgSVJRX1VBUlQwX1RYIAkJQkZJTl9JUlEoMjMpCS8qIERNQTkgQ2hhbm5lbCAoVUFSVDAgVFgpICovCisjZGVmaW5lIElSUV9VQVJUMV9SWCAJCUJGSU5fSVJRKDI0KQkvKiBETUExMCBDaGFubmVsIChVQVJUMSBSWCkgKi8KKyNkZWZpbmUgSVJRX1VBUlQxX1RYIAkJQkZJTl9JUlEoMjUpCS8qIERNQTExIENoYW5uZWwgKFVBUlQxIFRYKSAqLworI2RlZmluZSBJUlFfT1BUU0VDICAgCQlCRklOX0lSUSgyNikJLyogT1RQU0VDIEludGVycnVwdCAqLworI2RlZmluZSBJUlFfQ05UICAgCQlCRklOX0lSUSgyNykJLyogR1AgQ291bnRlciAqLworI2RlZmluZSBJUlFfTUFDX1JYICAgCQlCRklOX0lSUSgyOCkJLyogRE1BMSBDaGFubmVsIChNQUMgUlgpICovCisjZGVmaW5lIElSUV9QT1JUSF9JTlRBICAgCUJGSU5fSVJRKDI5KQkvKiBQb3J0IEggSW50ZXJydXB0IEEgKi8KKyNkZWZpbmUgSVJRX01BQ19UWAkJQkZJTl9JUlEoMzApCS8qIERNQTIgQ2hhbm5lbCAoTUFDIFRYKSAqLworI2RlZmluZSBJUlFfUE9SVEhfSU5UQgkJQkZJTl9JUlEoMzEpCS8qIFBvcnQgSCBJbnRlcnJ1cHQgQiAqLworI2RlZmluZSBJUlFfVElNRVIwCQlCRklOX0lSUSgzMikJLyogVGltZXIgMCAqLworI2RlZmluZSBJUlFfVElNRVIxCQlCRklOX0lSUSgzMykJLyogVGltZXIgMSAqLworI2RlZmluZSBJUlFfVElNRVIyCQlCRklOX0lSUSgzNCkJLyogVGltZXIgMiAqLworI2RlZmluZSBJUlFfVElNRVIzCQlCRklOX0lSUSgzNSkJLyogVGltZXIgMyAqLworI2RlZmluZSBJUlFfVElNRVI0CQlCRklOX0lSUSgzNikJLyogVGltZXIgNCAqLworI2RlZmluZSBJUlFfVElNRVI1CQlCRklOX0lSUSgzNykJLyogVGltZXIgNSAqLworI2RlZmluZSBJUlFfVElNRVI2CQlCRklOX0lSUSgzOCkJLyogVGltZXIgNiAqLworI2RlZmluZSBJUlFfVElNRVI3CQlCRklOX0lSUSgzOSkJLyogVGltZXIgNyAqLworI2RlZmluZSBJUlFfUE9SVEdfSU5UQQkJQkZJTl9JUlEoNDApCS8qIFBvcnQgRyBJbnRlcnJ1cHQgQSAqLworI2RlZmluZSBJUlFfUE9SVEdfSU5UQgkJQkZJTl9JUlEoNDEpCS8qIFBvcnQgRyBJbnRlcnJ1cHQgQiAqLworI2RlZmluZSBJUlFfTUVNX0RNQTAJCUJGSU5fSVJRKDQyKQkvKiBNRE1BIFN0cmVhbSAwICovCisjZGVmaW5lIElSUV9NRU1fRE1BMQkJQkZJTl9JUlEoNDMpCS8qIE1ETUEgU3RyZWFtIDEgKi8KKyNkZWZpbmUgSVJRX1dBVENICQlCRklOX0lSUSg0NCkJLyogU29mdHdhcmUgV2F0Y2hkb2cgVGltZXIgKi8KKyNkZWZpbmUgSVJRX1BPUlRGX0lOVEEJCUJGSU5fSVJRKDQ1KQkvKiBQb3J0IEYgSW50ZXJydXB0IEEgKi8KKyNkZWZpbmUgSVJRX1BPUlRGX0lOVEIJCUJGSU5fSVJRKDQ2KQkvKiBQb3J0IEYgSW50ZXJydXB0IEIgKi8KKyNkZWZpbmUgSVJRX1NQSTBfRVJST1IJCUJGSU5fSVJRKDQ3KQkvKiBTUEkwIFN0YXR1cyAqLworI2RlZmluZSBJUlFfU1BJMV9FUlJPUgkJQkZJTl9JUlEoNDgpCS8qIFNQSTEgRXJyb3IgKi8KKyNkZWZpbmUgSVJRX1JTSV9JTlQwCQlCRklOX0lSUSg1MSkJLyogUlNJIEludGVycnVwdDAgKi8KKyNkZWZpbmUgSVJRX1JTSV9JTlQxCQlCRklOX0lSUSg1MikJLyogUlNJIEludGVycnVwdDEgKi8KKyNkZWZpbmUgSVJRX1BXTV9UUklQCQlCRklOX0lSUSg1MykJLyogUFdNIFRyaXAgSW50ZXJydXB0ICovCisjZGVmaW5lIElSUV9QV01fU1lOQwkJQkZJTl9JUlEoNTQpCS8qIFBXTSBTeW5jIEludGVycnVwdCAqLworI2RlZmluZSBJUlFfUFRQX1NUQVQJCUJGSU5fSVJRKDU1KQkvKiBQVFAgU3RhdCBJbnRlcnJ1cHQgKi8KKworI2RlZmluZSBTWVNfSVJRUyAgICAgICAgCUJGSU5fSVJRKDYzKQkvKiA3MCAqLworCisjZGVmaW5lIElSUV9QRjAgICAgICAgICA3MQorI2RlZmluZSBJUlFfUEYxICAgICAgICAgNzIKKyNkZWZpbmUgSVJRX1BGMiAgICAgICAgIDczCisjZGVmaW5lIElSUV9QRjMgICAgICAgICA3NAorI2RlZmluZSBJUlFfUEY0ICAgICAgICAgNzUKKyNkZWZpbmUgSVJRX1BGNSAgICAgICAgIDc2CisjZGVmaW5lIElSUV9QRjYgICAgICAgICA3NworI2RlZmluZSBJUlFfUEY3ICAgICAgICAgNzgKKyNkZWZpbmUgSVJRX1BGOCAgICAgICAgIDc5CisjZGVmaW5lIElSUV9QRjkgICAgICAgICA4MAorI2RlZmluZSBJUlFfUEYxMCAgICAgICAgODEKKyNkZWZpbmUgSVJRX1BGMTEgICAgICAgIDgyCisjZGVmaW5lIElSUV9QRjEyICAgICAgICA4MworI2RlZmluZSBJUlFfUEYxMyAgICAgICAgODQKKyNkZWZpbmUgSVJRX1BGMTQgICAgICAgIDg1CisjZGVmaW5lIElSUV9QRjE1ICAgICAgICA4NgorCisjZGVmaW5lIElSUV9QRzAgICAgICAgICA4NworI2RlZmluZSBJUlFfUEcxICAgICAgICAgODgKKyNkZWZpbmUgSVJRX1BHMiAgICAgICAgIDg5CisjZGVmaW5lIElSUV9QRzMgICAgICAgICA5MAorI2RlZmluZSBJUlFfUEc0ICAgICAgICAgOTEKKyNkZWZpbmUgSVJRX1BHNSAgICAgICAgIDkyCisjZGVmaW5lIElSUV9QRzYgICAgICAgICA5MworI2RlZmluZSBJUlFfUEc3ICAgICAgICAgOTQKKyNkZWZpbmUgSVJRX1BHOCAgICAgICAgIDk1CisjZGVmaW5lIElSUV9QRzkgICAgICAgICA5NgorI2RlZmluZSBJUlFfUEcxMCAgICAgICAgOTcKKyNkZWZpbmUgSVJRX1BHMTEgICAgICAgIDk4CisjZGVmaW5lIElSUV9QRzEyICAgICAgICA5OQorI2RlZmluZSBJUlFfUEcxMyAgICAgICAgMTAwCisjZGVmaW5lIElSUV9QRzE0ICAgICAgICAxMDEKKyNkZWZpbmUgSVJRX1BHMTUgICAgICAgIDEwMgorCisjZGVmaW5lIElSUV9QSDAgICAgICAgICAxMDMKKyNkZWZpbmUgSVJRX1BIMSAgICAgICAgIDEwNAorI2RlZmluZSBJUlFfUEgyICAgICAgICAgMTA1CisjZGVmaW5lIElSUV9QSDMgICAgICAgICAxMDYKKyNkZWZpbmUgSVJRX1BINCAgICAgICAgIDEwNworI2RlZmluZSBJUlFfUEg1ICAgICAgICAgMTA4CisjZGVmaW5lIElSUV9QSDYgICAgICAgICAxMDkKKyNkZWZpbmUgSVJRX1BINyAgICAgICAgIDExMAorI2RlZmluZSBJUlFfUEg4ICAgICAgICAgMTExCisjZGVmaW5lIElSUV9QSDkgICAgICAgICAxMTIKKyNkZWZpbmUgSVJRX1BIMTAgICAgICAgIDExMworI2RlZmluZSBJUlFfUEgxMSAgICAgICAgMTE0CisjZGVmaW5lIElSUV9QSDEyICAgICAgICAxMTUKKyNkZWZpbmUgSVJRX1BIMTMgICAgICAgIDExNgorI2RlZmluZSBJUlFfUEgxNCAgICAgICAgMTE3CisjZGVmaW5lIElSUV9QSDE1ICAgICAgICAxMTgKKworI2RlZmluZSBHUElPX0lSUV9CQVNFCUlSUV9QRjAKKworI2RlZmluZSBOUl9JUlFTICAgICAoSVJRX1BIMTUgKyAxKQorCisjZGVmaW5lIElWRzcgICAgICAgICAgICA3CisjZGVmaW5lIElWRzggICAgICAgICAgICA4CisjZGVmaW5lIElWRzkgICAgICAgICAgICA5CisjZGVmaW5lIElWRzEwICAgICAgICAgICAxMAorI2RlZmluZSBJVkcxMSAgICAgICAgICAgMTEKKyNkZWZpbmUgSVZHMTIgICAgICAgICAgIDEyCisjZGVmaW5lIElWRzEzICAgICAgICAgICAxMworI2RlZmluZSBJVkcxNCAgICAgICAgICAgMTQKKyNkZWZpbmUgSVZHMTUgICAgICAgICAgIDE1CisKKy8qIElBUjAgQklUIEZJRUxEUyAqLworI2RlZmluZSBJUlFfUExMX1dBS0VVUF9QT1MJMAorI2RlZmluZSBJUlFfRE1BMF9FUlJPUl9QT1MJNAorI2RlZmluZSBJUlFfRE1BUjBfQkxLX1BPUyAJOAorI2RlZmluZSBJUlFfRE1BUjFfQkxLX1BPUyAJMTIKKyNkZWZpbmUgSVJRX0RNQVIwX09WUl9QT1MgCTE2CisjZGVmaW5lIElSUV9ETUFSMV9PVlJfUE9TIAkyMAorI2RlZmluZSBJUlFfUFBJX0VSUk9SX1BPUyAJMjQKKyNkZWZpbmUgSVJRX01BQ19FUlJPUl9QT1MgCTI4CisKKy8qIElBUjEgQklUIEZJRUxEUyAqLworI2RlZmluZSBJUlFfU1BPUlQwX0VSUk9SX1BPUwkwCisjZGVmaW5lIElSUV9TUE9SVDFfRVJST1JfUE9TCTQKKyNkZWZpbmUgSVJRX1BUUF9FUlJPUl9QT1MJOAorI2RlZmluZSBJUlFfVUFSVDBfRVJST1JfUE9TIAkxNgorI2RlZmluZSBJUlFfVUFSVDFfRVJST1JfUE9TIAkyMAorI2RlZmluZSBJUlFfUlRDX1BPUyAgICAgICAgIAkyNAorI2RlZmluZSBJUlFfUFBJX1BPUyAgICAgICAgIAkyOAorCisvKiBJQVIyIEJJVCBGSUVMRFMgKi8KKyNkZWZpbmUgSVJRX1NQT1JUMF9SWF9QT1MJMAorI2RlZmluZSBJUlFfU1BPUlQwX1RYX1BPUwk0CisjZGVmaW5lIElSUV9SU0lfUE9TCQk0CisjZGVmaW5lIElSUV9TUE9SVDFfUlhfUE9TCTgKKyNkZWZpbmUgSVJRX1NQSTFfUE9TCQk4CisjZGVmaW5lIElSUV9TUE9SVDFfVFhfUE9TCTEyCisjZGVmaW5lIElSUV9UV0lfUE9TICAgICAgCTE2CisjZGVmaW5lIElSUV9TUEkwX1BPUyAgICAgIAkyMAorI2RlZmluZSBJUlFfVUFSVDBfUlhfUE9TIAkyNAorI2RlZmluZSBJUlFfVUFSVDBfVFhfUE9TIAkyOAorCisvKiBJQVIzIEJJVCBGSUVMRFMgKi8KKyNkZWZpbmUgSVJRX1VBUlQxX1JYX1BPUyAgCTAKKyNkZWZpbmUgSVJRX1VBUlQxX1RYX1BPUyAgCTQKKyNkZWZpbmUgSVJRX09QVFNFQ19QT1MgICAgCTgKKyNkZWZpbmUgSVJRX0NOVF9QT1MgICAgICAgCTEyCisjZGVmaW5lIElSUV9NQUNfUlhfUE9TICAgIAkxNgorI2RlZmluZSBJUlFfUE9SVEhfSU5UQV9QT1MJMjAKKyNkZWZpbmUgSVJRX01BQ19UWF9QT1MgICAgCTI0CisjZGVmaW5lIElSUV9QT1JUSF9JTlRCX1BPUwkyOAorCisvKiBJQVI0IEJJVCBGSUVMRFMgKi8KKyNkZWZpbmUgSVJRX1RJTUVSMF9QT1MJCTAKKyNkZWZpbmUgSVJRX1RJTUVSMV9QT1MJCTQKKyNkZWZpbmUgSVJRX1RJTUVSMl9QT1MJCTgKKyNkZWZpbmUgSVJRX1RJTUVSM19QT1MJCTEyCisjZGVmaW5lIElSUV9USU1FUjRfUE9TCQkxNgorI2RlZmluZSBJUlFfVElNRVI1X1BPUwkJMjAKKyNkZWZpbmUgSVJRX1RJTUVSNl9QT1MJCTI0CisjZGVmaW5lIElSUV9USU1FUjdfUE9TCQkyOAorCisvKiBJQVI1IEJJVCBGSUVMRFMgKi8KKyNkZWZpbmUgSVJRX1BPUlRHX0lOVEFfUE9TCTAKKyNkZWZpbmUgSVJRX1BPUlRHX0lOVEJfUE9TCTQKKyNkZWZpbmUgSVJRX01FTV9ETUEwX1BPUyAgCTgKKyNkZWZpbmUgSVJRX01FTV9ETUExX1BPUyAgCTEyCisjZGVmaW5lIElSUV9XQVRDSF9QT1MgICAgIAkxNgorI2RlZmluZSBJUlFfUE9SVEZfSU5UQV9QT1MJMjAKKyNkZWZpbmUgSVJRX1BPUlRGX0lOVEJfUE9TCTI0CisjZGVmaW5lIElSUV9TUEkwX0VSUk9SX1BPUyAJMjgKKworLyogSUFSNiBCSVQgRklFTERTICovCisjZGVmaW5lIElSUV9TUEkxX0VSUk9SX1BPUyAgCTAKKyNkZWZpbmUgSVJRX1JTSV9JTlQwX1BPUyAgIAkxMgorI2RlZmluZSBJUlFfUlNJX0lOVDFfUE9TICAgCTE2CisjZGVmaW5lIElSUV9QV01fVFJJUF9QT1MgICAJMjAKKyNkZWZpbmUgSVJRX1BXTV9TWU5DX1BPUyAgIAkyNAorI2RlZmluZSBJUlFfUFRQX1NUQVRfUE9TICAgIAkyOAorCisjZW5kaWYJCQkJLyogX0JGNTE4X0lSUV9IXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2luY2x1ZGUvbWFjaC9tZW1fbWFwLmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvaW5jbHVkZS9tYWNoL21lbV9tYXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MmJjYzc4Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2luY2x1ZGUvbWFjaC9tZW1fbWFwLmgKQEAgLTAsMCArMSwxMDggQEAKKy8qCisgKiBmaWxlOiAgICAgICAgIGluY2x1ZGUvYXNtLWJsYWNrZmluL21hY2gtYmY1MTgvbWVtX21hcC5oCisgKiBiYXNlZCBvbjoJaW5jbHVkZS9hc20tYmxhY2tmaW4vbWFjaC1iZjUyNy9tZW1fbWFwLmgKKyAqIGF1dGhvcjoJQnJ5YW4gV3UgPGNvb2xvbmV5QGtlcm5lbC5vcmc+CisgKgorICogY3JlYXRlZDoKKyAqIGRlc2NyaXB0aW9uOgorICoJTWVtb3J5IE1BUCBDb21tb24gaGVhZGVyIGZpbGUgZm9yIGJsYWNrZmluIEJGNTE4LzYvNC8yIG9mIHByb2Nlc3NvcnMuCisgKiByZXY6CisgKgorICogbW9kaWZpZWQ6CisgKgorICogYnVnczogICAgICAgICBlbnRlciBidWdzIGF0IGh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZy8KKyAqCisgKiB0aGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBnbnUgZ2VuZXJhbCBwdWJsaWMgbGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBmcmVlIHNvZnR3YXJlIGZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIHRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IHdpdGhvdXQgYW55IHdhcnJhbnR5OyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIG1lcmNoYW50YWJpbGl0eSBvciBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gIHNlZSB0aGUKKyAqIGdudSBnZW5lcmFsIHB1YmxpYyBsaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogeW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgZ251IGdlbmVyYWwgcHVibGljIGxpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgY29weWluZy4KKyAqIGlmIG5vdCwgd3JpdGUgdG8gdGhlIGZyZWUgc29mdHdhcmUgZm91bmRhdGlvbiwKKyAqIDU5IHRlbXBsZSBwbGFjZSAtIHN1aXRlIDMzMCwgYm9zdG9uLCBtYSAwMjExMS0xMzA3LCB1c2EuCisgKi8KKworI2lmbmRlZiBfTUVNX01BUF81MThfSF8KKyNkZWZpbmUgX01FTV9NQVBfNTE4X0hfCisKKyNkZWZpbmUgQ09SRU1NUl9CQVNFICAgICAgICAgICAweEZGRTAwMDAwCS8qIENvcmUgTU1ScyAqLworI2RlZmluZSBTWVNNTVJfQkFTRSAgICAgICAgICAgIDB4RkZDMDAwMDAJLyogU3lzdGVtIE1NUnMgKi8KKworLyogQXN5bmMgTWVtb3J5IEJhbmtzICovCisjZGVmaW5lIEFTWU5DX0JBTkszX0JBU0UJMHgyMDMwMDAwMAkvKiBBc3luYyBCYW5rIDMgKi8KKyNkZWZpbmUgQVNZTkNfQkFOSzNfU0laRQkweDAwMTAwMDAwCS8qIDFNICovCisjZGVmaW5lIEFTWU5DX0JBTksyX0JBU0UJMHgyMDIwMDAwMAkvKiBBc3luYyBCYW5rIDIgKi8KKyNkZWZpbmUgQVNZTkNfQkFOSzJfU0laRQkweDAwMTAwMDAwCS8qIDFNICovCisjZGVmaW5lIEFTWU5DX0JBTksxX0JBU0UJMHgyMDEwMDAwMAkvKiBBc3luYyBCYW5rIDEgKi8KKyNkZWZpbmUgQVNZTkNfQkFOSzFfU0laRQkweDAwMTAwMDAwCS8qIDFNICovCisjZGVmaW5lIEFTWU5DX0JBTkswX0JBU0UJMHgyMDAwMDAwMAkvKiBBc3luYyBCYW5rIDAgKi8KKyNkZWZpbmUgQVNZTkNfQkFOSzBfU0laRQkweDAwMTAwMDAwCS8qIDFNICovCisKKy8qIEJvb3QgUk9NIE1lbW9yeSAqLworCisjZGVmaW5lIEJPT1RfUk9NX1NUQVJUCQkweEVGMDAwMDAwCisjZGVmaW5lIEJPT1RfUk9NX0xFTkdUSAkJMHg4MDAwCisKKy8qIExldmVsIDEgTWVtb3J5ICovCisKKy8qIE1lbW9yeSBNYXAgZm9yIEFEU1AtQkY1MTgvNi80LzIgcHJvY2Vzc29ycyAqLworCisjaWZkZWYgQ09ORklHX0JGSU5fSUNBQ0hFCisjZGVmaW5lIEJGSU5fSUNBQ0hFU0laRQkJKDE2ICogMTAyNCkKKyNlbHNlCisjZGVmaW5lIEJGSU5fSUNBQ0hFU0laRQkJKDApCisjZW5kaWYKKworI2RlZmluZSBMMV9DT0RFX1NUQVJUCQkweEZGQTAwMDAwCisjZGVmaW5lIEwxX0RBVEFfQV9TVEFSVAkJMHhGRjgwMDAwMAorI2RlZmluZSBMMV9EQVRBX0JfU1RBUlQJCTB4RkY5MDAwMDAKKworI2RlZmluZSBMMV9DT0RFX0xFTkdUSAkJMHhDMDAwCisKKyNpZmRlZiBDT05GSUdfQkZJTl9EQ0FDSEUKKworI2lmZGVmIENPTkZJR19CRklOX0RDQUNIRV9CQU5LQQorI2RlZmluZSBETUVNX0NOVFIgKEFDQUNIRV9CU1JBTSB8IEVORENQTEIgfCBQT1JUX1BSRUYwKQorI2RlZmluZSBMMV9EQVRBX0FfTEVOR1RICSgweDgwMDAgLSAweDQwMDApCisjZGVmaW5lIEwxX0RBVEFfQl9MRU5HVEgJMHg4MDAwCisjZGVmaW5lIEJGSU5fRENBQ0hFU0laRQkJKDE2ICogMTAyNCkKKyNkZWZpbmUgQkZJTl9EU1VQQkFOS1MJCTEKKyNlbHNlCisjZGVmaW5lIERNRU1fQ05UUiAoQUNBQ0hFX0JDQUNIRSB8IEVORENQTEIgfCBQT1JUX1BSRUYwKQorI2RlZmluZSBMMV9EQVRBX0FfTEVOR1RICSgweDgwMDAgLSAweDQwMDApCisjZGVmaW5lIEwxX0RBVEFfQl9MRU5HVEgJKDB4ODAwMCAtIDB4NDAwMCkKKyNkZWZpbmUgQkZJTl9EQ0FDSEVTSVpFCQkoMzIgKiAxMDI0KQorI2RlZmluZSBCRklOX0RTVVBCQU5LUwkJMgorI2VuZGlmCisKKyNlbHNlCisjZGVmaW5lIERNRU1fQ05UUiAoQVNSQU1fQlNSQU0gfCBFTkRDUExCIHwgUE9SVF9QUkVGMCkKKyNkZWZpbmUgTDFfREFUQV9BX0xFTkdUSAkweDgwMDAKKyNkZWZpbmUgTDFfREFUQV9CX0xFTkdUSAkweDgwMDAKKyNkZWZpbmUgQkZJTl9EQ0FDSEVTSVpFCQkwCisjZGVmaW5lIEJGSU5fRFNVUEJBTktTCQkwCisjZW5kaWYJCQkJLypDT05GSUdfQkZJTl9EQ0FDSEUgKi8KKworLyogTGV2ZWwgMiBNZW1vcnkgLSBub25lICovCisKKyNkZWZpbmUgTDJfU1RBUlQJMAorI2RlZmluZSBMMl9MRU5HVEgJMAorCisvKiBTY3JhdGNoIFBhZCBNZW1vcnkgKi8KKworI2RlZmluZSBMMV9TQ1JBVENIX1NUQVJUCTB4RkZCMDAwMDAKKyNkZWZpbmUgTDFfU0NSQVRDSF9MRU5HVEgJMHgxMDAwCisKKyNkZWZpbmUgR0VUX1BEQV9TQUZFKHByZWcpCQlcCisJcHJlZy5sID0gX2NwdV9wZGE7CQlcCisJcHJlZy5oID0gX2NwdV9wZGE7CisKKyNkZWZpbmUgR0VUX1BEQShwcmVnLCBkcmVnKQlHRVRfUERBX1NBRkUocHJlZykKKworI2VuZGlmCQkJCS8qIF9NRU1fTUFQXzUxOF9IXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2luY2x1ZGUvbWFjaC9wb3J0bXV4LmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvaW5jbHVkZS9tYWNoL3BvcnRtdXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzE2ZDU0Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTE4L2luY2x1ZGUvbWFjaC9wb3J0bXV4LmgKQEAgLTAsMCArMSwxODggQEAKKyNpZm5kZWYgX01BQ0hfUE9SVE1VWF9IXworI2RlZmluZSBfTUFDSF9QT1JUTVVYX0hfCisKKyNkZWZpbmUgTUFYX1JFU09VUkNFUyAJTUFYX0JMQUNLRklOX0dQSU9TCisKKy8qIEVNQUMgTUlJL1JNSUkgUG9ydCBNdXggKi8KKyNkZWZpbmUgUF9NSUkwX0VUeEQyCShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEYwKSB8IFBfRlVOQ1QoMCkpCisjZGVmaW5lIFBfTUlJMF9FUnhEMgkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BGMSkgfCBQX0ZVTkNUKDApKQorI2RlZmluZSBQX01JSTBfRVR4RDMJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRjIpIHwgUF9GVU5DVCgwKSkKKyNkZWZpbmUgUF9NSUkwX0VSeEQzCShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEYzKSB8IFBfRlVOQ1QoMCkpCisjZGVmaW5lIFBfTUlJMF9FUnhDTEsJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRjQpIHwgUF9GVU5DVCgwKSkKKyNkZWZpbmUgUF9NSUkwX0VSeERWCShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEY1KSB8IFBfRlVOQ1QoMCkpCisjZGVmaW5lIFBfTUlJMF9DT0wJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRjYpIHwgUF9GVU5DVCgwKSkKKworI2RlZmluZSBQX01JSTBfTURDCShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEY4KSB8IFBfRlVOQ1QoMCkpCisjZGVmaW5lIFBfTUlJMF9NRElPCShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEY5KSB8IFBfRlVOQ1QoMCkpCisjZGVmaW5lIFBfTUlJMF9FVHhEMAkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BGMTApIHwgUF9GVU5DVCgwKSkKKyNkZWZpbmUgUF9NSUkwX0VSeEQwCShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEYxMSkgfCBQX0ZVTkNUKDApKQorI2RlZmluZSBQX01JSTBfRVR4RDEJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRjEyKSB8IFBfRlVOQ1QoMCkpCisjZGVmaW5lIFBfTUlJMF9FUnhEMQkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BGMTMpIHwgUF9GVU5DVCgwKSkKKyNkZWZpbmUgUF9NSUkwX0VUeEVOCShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEYxNCkgfCBQX0ZVTkNUKDApKQorI2RlZmluZSBQX01JSTBfUEhZSU5UCShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEYxNSkgfCBQX0ZVTkNUKDApKQorI2RlZmluZSBQX01JSTBfQ1JTCShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEcwKSB8IFBfRlVOQ1QoMCkpCisjZGVmaW5lIFBfTUlJMF9FUnhFUgkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BHMSkgfCBQX0ZVTkNUKDApKQorI2RlZmluZSBQX01JSTBfVHhDTEsJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRzIpIHwgUF9GVU5DVCgwKSkKKworI2RlZmluZSBQX01JSTAge1wKKwlQX01JSTBfRVR4RDAsIFwKKwlQX01JSTBfRVR4RDEsIFwKKwlQX01JSTBfRVR4RDIsIFwKKwlQX01JSTBfRVR4RDMsIFwKKwlQX01JSTBfRVR4RU4sIFwKKwlQX01JSTBfVHhDTEssIFwKKwlQX01JSTBfUEhZSU5ULCBcCisJUF9NSUkwX0NPTCwgXAorCVBfTUlJMF9FUnhEMCwgXAorCVBfTUlJMF9FUnhEMSwgXAorCVBfTUlJMF9FUnhEMiwgXAorCVBfTUlJMF9FUnhEMywgXAorCVBfTUlJMF9FUnhEViwgXAorCVBfTUlJMF9FUnhDTEssIFwKKwlQX01JSTBfRVJ4RVIsIFwKKwlQX01JSTBfQ1JTLCBcCisJUF9NSUkwX01EQywgXAorCVBfTUlJMF9NRElPLCAwfQorCisjZGVmaW5lIFBfUk1JSTAge1wKKwlQX01JSTBfRVR4RDAsIFwKKwlQX01JSTBfRVR4RDEsIFwKKwlQX01JSTBfRVR4RU4sIFwKKwlQX01JSTBfRVJ4RDAsIFwKKwlQX01JSTBfRVJ4RDEsIFwKKwlQX01JSTBfRVJ4RVIsIFwKKwlQX01JSTBfVHhDTEssIFwKKwlQX01JSTBfUEhZSU5ULCBcCisJUF9NSUkwX0NSUywgXAorCVBfTUlJMF9NREMsIFwKKwlQX01JSTBfTURJTywgMH0KKworLyogUFBJIFBvcnQgTXV4ICovCisjZGVmaW5lIFBfUFBJMF9EMAkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BGMCkgfCBQX0ZVTkNUKDEpKQorI2RlZmluZSBQX1BQSTBfRDEJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRjEpIHwgUF9GVU5DVCgxKSkKKyNkZWZpbmUgUF9QUEkwX0QyCShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEYyKSB8IFBfRlVOQ1QoMSkpCisjZGVmaW5lIFBfUFBJMF9EMwkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BGMykgfCBQX0ZVTkNUKDEpKQorI2RlZmluZSBQX1BQSTBfRDQJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRjQpIHwgUF9GVU5DVCgxKSkKKyNkZWZpbmUgUF9QUEkwX0Q1CShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEY1KSB8IFBfRlVOQ1QoMSkpCisjZGVmaW5lIFBfUFBJMF9ENgkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BGNikgfCBQX0ZVTkNUKDEpKQorI2RlZmluZSBQX1BQSTBfRDcJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRjcpIHwgUF9GVU5DVCgxKSkKKyNkZWZpbmUgUF9QUEkwX0Q4CShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEY4KSB8IFBfRlVOQ1QoMSkpCisjZGVmaW5lIFBfUFBJMF9EOQkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BGOSkgfCBQX0ZVTkNUKDEpKQorI2RlZmluZSBQX1BQSTBfRDEwCShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEYxMCkgfCBQX0ZVTkNUKDEpKQorI2RlZmluZSBQX1BQSTBfRDExCShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEYxMSkgfCBQX0ZVTkNUKDEpKQorI2RlZmluZSBQX1BQSTBfRDEyCShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEYxMikgfCBQX0ZVTkNUKDEpKQorI2RlZmluZSBQX1BQSTBfRDEzCShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEYxMykgfCBQX0ZVTkNUKDEpKQorI2RlZmluZSBQX1BQSTBfRDE0CShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEYxNCkgfCBQX0ZVTkNUKDEpKQorI2RlZmluZSBQX1BQSTBfRDE1CShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEYxNSkgfCBQX0ZVTkNUKDEpKQorCisjZGVmaW5lIFBfUFBJMF9DTEsJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRzEyKSB8IFBfRlVOQ1QoMSkpCisjZGVmaW5lIFBfUFBJMF9GUzEJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRzEzKSB8IFBfRlVOQ1QoMSkpCisjZGVmaW5lIFBfUFBJMF9GUzIJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRzE0KSB8IFBfRlVOQ1QoMSkpCisjZGVmaW5lIFBfUFBJMF9GUzMJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRzE1KSB8IFBfRlVOQ1QoMSkpCisKKy8qIFNQSSBQb3J0IE11eCAqLworI2RlZmluZSBQX1NQSTBfU1MJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRzExKSB8IFBfRlVOQ1QoMCkpCisjZGVmaW5lIFBfU1BJMF9TQ0sJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRzEyKSB8IFBfRlVOQ1QoMCkpCisjZGVmaW5lIFBfU1BJMF9NSVNPCShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEcxMykgfCBQX0ZVTkNUKDApKQorI2RlZmluZSBQX1NQSTBfTU9TSQkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BHMTQpIHwgUF9GVU5DVCgwKSkKKworI2RlZmluZSBQX1NQSTBfU1NFTDEJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRjcpIHwgUF9GVU5DVCgwKSkKKyNkZWZpbmUgUF9TUEkwX1NTRUwyCShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEcxNSkgfCBQX0ZVTkNUKDApKQorI2RlZmluZSBQX1NQSTBfU1NFTDMJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QSDQpIHwgUF9GVU5DVCgyKSkKKyNkZWZpbmUgUF9TUEkwX1NTRUw0CShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEcxMCkgfCBQX0ZVTkNUKDIpKQorI2RlZmluZSBQX1NQSTBfU1NFTDUJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRzMpIHwgUF9GVU5DVCgyKSkKKworI2RlZmluZSBQX1NQSTFfU1MJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QSDApIHwgUF9GVU5DVCgxKSkKKyNkZWZpbmUgUF9TUEkxX1NDSwkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BIMSkgfCBQX0ZVTkNUKDEpKQorI2RlZmluZSBQX1NQSTFfTUlTTwkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BIMikgfCBQX0ZVTkNUKDEpKQorI2RlZmluZSBQX1NQSTFfTU9TSQkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BIMykgfCBQX0ZVTkNUKDEpKQorCisjZGVmaW5lIFBfU1BJMV9TU0VMMQkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BINikgfCBQX0ZVTkNUKDIpKQorI2RlZmluZSBQX1NQSTFfU1NFTDIJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRjApIHwgUF9GVU5DVCgyKSkKKyNkZWZpbmUgUF9TUEkxX1NTRUwzCShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEcwKSB8IFBfRlVOQ1QoMikpCisjZGVmaW5lIFBfU1BJMV9TU0VMNAkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BGOCkgfCBQX0ZVTkNUKDIpKQorI2RlZmluZSBQX1NQSTFfU1NFTDUJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRzExKSB8IFBfRlVOQ1QoMikpCisKKy8qIFNQT1JUIFBvcnQgTXV4ICovCisjZGVmaW5lIFBfU1BPUlQwX0RSUFJJCShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEczKSB8IFBfRlVOQ1QoMCkpCisjZGVmaW5lIFBfU1BPUlQwX1JTQ0xLCShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEc0KSB8IFBfRlVOQ1QoMCkpCisjZGVmaW5lIFBfU1BPUlQwX1JGUwkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BHNSkgfCBQX0ZVTkNUKDApKQorI2RlZmluZSBQX1NQT1JUMF9URlMJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRzYpIHwgUF9GVU5DVCgwKSkKKyNkZWZpbmUgUF9TUE9SVDBfRFRQUkkJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRzcpIHwgUF9GVU5DVCgwKSkKKyNkZWZpbmUgUF9TUE9SVDBfVFNDTEsJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRzgpIHwgUF9GVU5DVCgwKSkKKyNkZWZpbmUgUF9TUE9SVDBfRFRTRUMJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRzkpIHwgUF9GVU5DVCgwKSkKKyNkZWZpbmUgUF9TUE9SVDBfRFJTRUMJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRzEwKSB8IFBfRlVOQ1QoMCkpCisKKyNkZWZpbmUgUF9TUE9SVDFfRFJQUkkJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QSDApIHwgUF9GVU5DVCgwKSkKKyNkZWZpbmUgUF9TUE9SVDFfUkZTCShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEgxKSB8IFBfRlVOQ1QoMCkpCisjZGVmaW5lIFBfU1BPUlQxX1JTQ0xLCShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEgyKSB8IFBfRlVOQ1QoMCkpCisjZGVmaW5lIFBfU1BPUlQxX0RUUFJJCShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEgzKSB8IFBfRlVOQ1QoMCkpCisjZGVmaW5lIFBfU1BPUlQxX1RGUwkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BINCkgfCBQX0ZVTkNUKDApKQorI2RlZmluZSBQX1NQT1JUMV9UU0NMSwkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BINSkgfCBQX0ZVTkNUKDApKQorI2RlZmluZSBQX1NQT1JUMV9EVFNFQwkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BINikgfCBQX0ZVTkNUKDApKQorI2RlZmluZSBQX1NQT1JUMV9EUlNFQwkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BINykgfCBQX0ZVTkNUKDApKQorCisvKiBVQVJUIFBvcnQgTXV4ICovCisjZGVmaW5lIFBfVUFSVDBfVFgJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRzkpIHwgUF9GVU5DVCgxKSkKKyNkZWZpbmUgUF9VQVJUMF9SWAkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BHMTApIHwgUF9GVU5DVCgxKSkKKworI2RlZmluZSBQX1VBUlQxX1RYCShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEg2KSB8IFBfRlVOQ1QoMSkpCisjZGVmaW5lIFBfVUFSVDFfUlgJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QSDcpIHwgUF9GVU5DVCgxKSkKKworLyogVGltZXIgKi8KKyNkZWZpbmUgUF9UTVJDTEsJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRzUpIHwgUF9GVU5DVCgyKSkKKyNkZWZpbmUgUF9UTVIwCQkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BHNikgfCBQX0ZVTkNUKDIpKQorI2RlZmluZSBQX1RNUjEJCShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEc3KSB8IFBfRlVOQ1QoMikpCisjZGVmaW5lIFBfVE1SMgkJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRjkpIHwgUF9GVU5DVCgyKSkKKyNkZWZpbmUgUF9UTVIzCQkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BGMTApIHwgUF9GVU5DVCgyKSkKKyNkZWZpbmUgUF9UTVI0CQkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BHOSkgfCBQX0ZVTkNUKDIpKQorI2RlZmluZSBQX1RNUjUJCShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEc0KSB8IFBfRlVOQ1QoMikpCisjZGVmaW5lIFBfVE1SNgkJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRzgpIHwgUF9GVU5DVCgyKSkKKyNkZWZpbmUgUF9UTVI3CQkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BINykgfCBQX0ZVTkNUKDIpKQorCisvKiBETUEgKi8KKyNkZWZpbmUgUF9ETUFSMQkJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRzEpIHwgUF9GVU5DVCgxKSkKKyNkZWZpbmUgUF9ETUFSMAkJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRzIpIHwgUF9GVU5DVCgxKSkKKworLyogVFdJICovCisjZGVmaW5lIFBfVFdJMF9TQ0wJKFBfRE9OVENBUkUpCisjZGVmaW5lIFBfVFdJMF9TREEJKFBfRE9OVENBUkUpCisKKy8qIFBXTSAqLworI2RlZmluZSBQX1BXTTBfQUgJCShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEYxKSB8IFBfRlVOQ1QoMikpCisjZGVmaW5lIFBfUFdNMF9BTAkJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRjIpIHwgUF9GVU5DVCgyKSkKKyNkZWZpbmUgUF9QV00wX0JICQkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BGMykgfCBQX0ZVTkNUKDIpKQorI2RlZmluZSBQX1BXTTBfQkwJCShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEY0KSB8IFBfRlVOQ1QoMikpCisjZGVmaW5lIFBfUFdNMF9DSAkJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRjUpIHwgUF9GVU5DVCgyKSkKKyNkZWZpbmUgUF9QV00wX0NMCQkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BGNikgfCBQX0ZVTkNUKDIpKQorI2RlZmluZSBQX1BXTTBfU1lOQwkJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRjcpIHwgUF9GVU5DVCgyKSkKKworI2RlZmluZSBQX1BXTTFfQUgJCShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEYxMSkgfCBQX0ZVTkNUKDIpKQorI2RlZmluZSBQX1BXTTFfQUwJCShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEYxMikgfCBQX0ZVTkNUKDIpKQorI2RlZmluZSBQX1BXTTFfQkgJCShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEYxMykgfCBQX0ZVTkNUKDIpKQorI2RlZmluZSBQX1BXTTFfQkwJCShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEYxNCkgfCBQX0ZVTkNUKDIpKQorI2RlZmluZSBQX1BXTTFfQ0gJCShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEcxKSB8IFBfRlVOQ1QoMikpCisjZGVmaW5lIFBfUFdNMV9DTAkJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRzIpIHwgUF9GVU5DVCgyKSkKKyNkZWZpbmUgUF9QV00xX1NZTkMJCShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEYxNSkgfCBQX0ZVTkNUKDIpKQorCisjZGVmaW5lIFBfUFdNX1RSSVBCCQkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BHMTQpIHwgUF9GVU5DVCgyKSkKKworLyogUlNJICovCisjZGVmaW5lIFBfUlNJX0RBVEEwCQkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BHMykgfCBQX0ZVTkNUKDEpKQorI2RlZmluZSBQX1JTSV9EQVRBMQkJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRzQpIHwgUF9GVU5DVCgxKSkKKyNkZWZpbmUgUF9SU0lfREFUQTIJCShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEc1KSB8IFBfRlVOQ1QoMSkpCisjZGVmaW5lIFBfUlNJX0RBVEEzCQkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BHNikgfCBQX0ZVTkNUKDEpKQorI2RlZmluZSBQX1JTSV9EQVRBNAkJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QSDApIHwgUF9GVU5DVCgyKSkKKyNkZWZpbmUgUF9SU0lfREFUQTUJCShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEgxKSB8IFBfRlVOQ1QoMikpCisjZGVmaW5lIFBfUlNJX0RBVEE2CQkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BIMikgfCBQX0ZVTkNUKDIpKQorI2RlZmluZSBQX1JTSV9EQVRBNwkJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QSDMpIHwgUF9GVU5DVCgyKSkKKyNkZWZpbmUgUF9SU0lfQ01ECQkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BHNykgfCBQX0ZVTkNUKDEpKQorI2RlZmluZSBQX1JTSV9DTEsJCShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEc4KSB8IFBfRlVOQ1QoMSkpCisKKy8qIFBUUCAqLworI2RlZmluZSBQX1BUUF9QUFMJCShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEcxMikgfCBQX0ZVTkNUKDIpKQorI2RlZmluZSBQX1BUUF9DTEtPVVQJCShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEcxMykgfCBQX0ZVTkNUKDIpKQorCisjZGVmaW5lIFBfSFdBSVQJCShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEcwMDAwMDAwMDApIHwgUF9GVU5DVCgxKSkKKworI2VuZGlmCQkJCS8qIF9NQUNIX1BPUlRNVVhfSF8gKi8KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9pbnRzLXByaW9yaXR5LmMgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvaW50cy1wcmlvcml0eS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxNTFmZDUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MTgvaW50cy1wcmlvcml0eS5jCkBAIC0wLDAgKzEsOTkgQEAKKy8qCisgKiBGaWxlOiAgICAgICAgIGFyY2gvYmxhY2tmaW4vbWFjaC1iZjUxOC9pbnRzLXByaW9yaXR5LmMKKyAqIEJhc2VkIG9uOiAgICAgYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2ludHMtcHJpb3JpdHkuYworICogQXV0aG9yOiAgICAgICBCcnlhbiBXdSA8Y29vbG9uZXlAa2VybmVsLm9yZz4KKyAqCisgKiBDcmVhdGVkOgorICogRGVzY3JpcHRpb246ICBTZXQgdXAgdGhlIGludGVycnVwdCBwcmlvcml0aWVzCisgKgorICogTW9kaWZpZWQ6CisgKiAgICAgICAgICAgICAgIENvcHlyaWdodCAyMDA0LTIwMDcgQW5hbG9nIERldmljZXMgSW5jLgorICoKKyAqIEJ1Z3M6ICAgICAgICAgRW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCBzZWUgdGhlIGZpbGUgQ09QWUlORywgb3Igd3JpdGUKKyAqIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxhc20vYmxhY2tmaW4uaD4KKwordm9pZCBfX2luaXQgcHJvZ3JhbV9JQVIodm9pZCkKK3sKKwkvKiBQcm9ncmFtIHRoZSBJQVIwIFJlZ2lzdGVyIHdpdGggdGhlIGNvbmZpZ3VyZWQgcHJpb3JpdHkgKi8KKwliZmluX3dyaXRlX1NJQ19JQVIwKCgoQ09ORklHX0lSUV9QTExfV0FLRVVQIC0gNykgPDwgSVJRX1BMTF9XQUtFVVBfUE9TKSB8CisJCQkoKENPTkZJR19JUlFfRE1BMF9FUlJPUiAtIDcpIDw8IElSUV9ETUEwX0VSUk9SX1BPUykgfAorCQkJKChDT05GSUdfSVJRX0RNQVIwX0JMSyAtIDcpIDw8IElSUV9ETUFSMF9CTEtfUE9TKSB8CisJCQkoKENPTkZJR19JUlFfRE1BUjFfQkxLIC0gNykgPDwgSVJRX0RNQVIxX0JMS19QT1MpIHwKKwkJCSgoQ09ORklHX0lSUV9ETUFSMF9PVlIgLSA3KSA8PCBJUlFfRE1BUjBfT1ZSX1BPUykgfAorCQkJKChDT05GSUdfSVJRX0RNQVIxX09WUiAtIDcpIDw8IElSUV9ETUFSMV9PVlJfUE9TKSB8CisJCQkoKENPTkZJR19JUlFfUFBJX0VSUk9SIC0gNykgPDwgSVJRX1BQSV9FUlJPUl9QT1MpIHwKKwkJCSgoQ09ORklHX0lSUV9NQUNfRVJST1IgLSA3KSA8PCBJUlFfTUFDX0VSUk9SX1BPUykpOworCisKKwliZmluX3dyaXRlX1NJQ19JQVIxKCgoQ09ORklHX0lSUV9TUE9SVDBfRVJST1IgLSA3KSA8PCBJUlFfU1BPUlQwX0VSUk9SX1BPUykgfAorCQkJKChDT05GSUdfSVJRX1NQT1JUMV9FUlJPUiAtIDcpIDw8IElSUV9TUE9SVDFfRVJST1JfUE9TKSB8CisJCQkoKENPTkZJR19JUlFfUFRQX0VSUk9SIC0gNykgPDwgSVJRX1BUUF9FUlJPUl9QT1MpIHwKKwkJCSgoQ09ORklHX0lSUV9VQVJUMF9FUlJPUiAtIDcpIDw8IElSUV9VQVJUMF9FUlJPUl9QT1MpIHwKKwkJCSgoQ09ORklHX0lSUV9VQVJUMV9FUlJPUiAtIDcpIDw8IElSUV9VQVJUMV9FUlJPUl9QT1MpIHwKKwkJCSgoQ09ORklHX0lSUV9SVEMgLSA3KSA8PCBJUlFfUlRDX1BPUykgfAorCQkJKChDT05GSUdfSVJRX1BQSSAtIDcpIDw8IElSUV9QUElfUE9TKSk7CisKKwliZmluX3dyaXRlX1NJQ19JQVIyKCgoQ09ORklHX0lSUV9TUE9SVDBfUlggLSA3KSA8PCBJUlFfU1BPUlQwX1JYX1BPUykgfAorCQkJKChDT05GSUdfSVJRX1NQT1JUMF9UWCAtIDcpIDw8IElSUV9TUE9SVDBfVFhfUE9TKSB8CisJCQkoKENPTkZJR19JUlFfU1BPUlQxX1JYIC0gNykgPDwgSVJRX1NQT1JUMV9SWF9QT1MpIHwKKwkJCSgoQ09ORklHX0lSUV9TUE9SVDFfVFggLSA3KSA8PCBJUlFfU1BPUlQxX1RYX1BPUykgfAorCQkJKChDT05GSUdfSVJRX1RXSSAtIDcpIDw8IElSUV9UV0lfUE9TKSB8CisJCQkoKENPTkZJR19JUlFfU1BJMCAtIDcpIDw8IElSUV9TUEkwX1BPUykgfAorCQkJKChDT05GSUdfSVJRX1VBUlQwX1JYIC0gNykgPDwgSVJRX1VBUlQwX1JYX1BPUykgfAorCQkJKChDT05GSUdfSVJRX1VBUlQwX1RYIC0gNykgPDwgSVJRX1VBUlQwX1RYX1BPUykpOworCisJYmZpbl93cml0ZV9TSUNfSUFSMygoKENPTkZJR19JUlFfVUFSVDFfUlggLSA3KSA8PCBJUlFfVUFSVDFfUlhfUE9TKSB8CisJCQkoKENPTkZJR19JUlFfVUFSVDFfVFggLSA3KSA8PCBJUlFfVUFSVDFfVFhfUE9TKSB8CisJCQkoKENPTkZJR19JUlFfT1BUU0VDIC0gNykgPDwgSVJRX09QVFNFQ19QT1MpIHwKKwkJCSgoQ09ORklHX0lSUV9DTlQgLSA3KSA8PCBJUlFfQ05UX1BPUykgfAorCQkJKChDT05GSUdfSVJRX01BQ19SWCAtIDcpIDw8IElSUV9NQUNfUlhfUE9TKSB8CisJCQkoKENPTkZJR19JUlFfUE9SVEhfSU5UQSAtIDcpIDw8IElSUV9QT1JUSF9JTlRBX1BPUykgfAorCQkJKChDT05GSUdfSVJRX01BQ19UWCAtIDcpIDw8IElSUV9NQUNfVFhfUE9TKSB8CisJCQkoKENPTkZJR19JUlFfUE9SVEhfSU5UQiAtIDcpIDw8IElSUV9QT1JUSF9JTlRCX1BPUykpOworCisJYmZpbl93cml0ZV9TSUNfSUFSNCgoKENPTkZJR19JUlFfVElNRVIwIC0gNykgPDwgSVJRX1RJTUVSMF9QT1MpIHwKKwkJCSgoQ09ORklHX0lSUV9USU1FUjEgLSA3KSA8PCBJUlFfVElNRVIxX1BPUykgfAorCQkJKChDT05GSUdfSVJRX1RJTUVSMiAtIDcpIDw8IElSUV9USU1FUjJfUE9TKSB8CisJCQkoKENPTkZJR19JUlFfVElNRVIzIC0gNykgPDwgSVJRX1RJTUVSM19QT1MpIHwKKwkJCSgoQ09ORklHX0lSUV9USU1FUjQgLSA3KSA8PCBJUlFfVElNRVI0X1BPUykgfAorCQkJKChDT05GSUdfSVJRX1RJTUVSNSAtIDcpIDw8IElSUV9USU1FUjVfUE9TKSB8CisJCQkoKENPTkZJR19JUlFfVElNRVI2IC0gNykgPDwgSVJRX1RJTUVSNl9QT1MpIHwKKwkJCSgoQ09ORklHX0lSUV9USU1FUjcgLSA3KSA8PCBJUlFfVElNRVI3X1BPUykpOworCisJYmZpbl93cml0ZV9TSUNfSUFSNSgoKENPTkZJR19JUlFfUE9SVEdfSU5UQSAtIDcpIDw8IElSUV9QT1JUR19JTlRBX1BPUykgfAorCQkJKChDT05GSUdfSVJRX1BPUlRHX0lOVEIgLSA3KSA8PCBJUlFfUE9SVEdfSU5UQl9QT1MpIHwKKwkJCSgoQ09ORklHX0lSUV9NRU1fRE1BMCAtIDcpIDw8IElSUV9NRU1fRE1BMF9QT1MpIHwKKwkJCSgoQ09ORklHX0lSUV9NRU1fRE1BMSAtIDcpIDw8IElSUV9NRU1fRE1BMV9QT1MpIHwKKwkJCSgoQ09ORklHX0lSUV9XQVRDSCAtIDcpIDw8IElSUV9XQVRDSF9QT1MpIHwKKwkJCSgoQ09ORklHX0lSUV9QT1JURl9JTlRBIC0gNykgPDwgSVJRX1BPUlRGX0lOVEFfUE9TKSB8CisJCQkoKENPTkZJR19JUlFfUE9SVEZfSU5UQiAtIDcpIDw8IElSUV9QT1JURl9JTlRCX1BPUykgfAorCQkJKChDT05GSUdfSVJRX1NQSTBfRVJST1IgLSA3KSA8PCBJUlFfU1BJMF9FUlJPUl9QT1MpKTsKKworCWJmaW5fd3JpdGVfU0lDX0lBUjYoKChDT05GSUdfSVJRX1NQSTFfRVJST1IgLSA3KSA8PCBJUlFfU1BJMV9FUlJPUl9QT1MpIHwKKwkJCSgoQ09ORklHX0lSUV9SU0lfSU5UMCAtIDcpIDw8IElSUV9SU0lfSU5UMF9QT1MpIHwKKwkJCSgoQ09ORklHX0lSUV9SU0lfSU5UMSAtIDcpIDw8IElSUV9SU0lfSU5UMV9QT1MpIHwKKwkJCSgoQ09ORklHX0lSUV9QV01fVFJJUCAtIDcpIDw8IElSUV9QV01fVFJJUF9QT1MpIHwKKwkJCSgoQ09ORklHX0lSUV9QV01fU1lOQyAtIDcpIDw8IElSUV9QV01fU1lOQ19QT1MpIHwKKwkJCSgoQ09ORklHX0lSUV9QVFBfU1RBVCAtIDcpIDw8IElSUV9QVFBfU1RBVF9QT1MpKTsKKworCVNTWU5DKCk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvS2NvbmZpZyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9LY29uZmlnCmluZGV4IDNjZGU0YmUuLjg0MzhlYzYgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9LY29uZmlnCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9LY29uZmlnCkBAIC0xNjgsMjkgKzE2OCwyOSBAQAogY29uZmlnIElSUV9QT1JUSF9JTlRCCiAJaW50ICJJUlFfUE9SVEhfSU5UQiIKIAlkZWZhdWx0IDExCi1jb25maWcgSVJRX1RNUjAKLQlpbnQgIklSUV9UTVIwIgorY29uZmlnIElSUV9USU1FUjAKKwlpbnQgIklSUV9USU1FUjAiCisJZGVmYXVsdCA4Citjb25maWcgSVJRX1RJTUVSMQorCWludCAiSVJRX1RJTUVSMSIKIAlkZWZhdWx0IDEyCi1jb25maWcgSVJRX1RNUjEKLQlpbnQgIklSUV9UTVIxIgorY29uZmlnIElSUV9USU1FUjIKKwlpbnQgIklSUV9USU1FUjIiCiAJZGVmYXVsdCAxMgotY29uZmlnIElSUV9UTVIyCi0JaW50ICJJUlFfVE1SMiIKK2NvbmZpZyBJUlFfVElNRVIzCisJaW50ICJJUlFfVElNRVIzIgogCWRlZmF1bHQgMTIKLWNvbmZpZyBJUlFfVE1SMwotCWludCAiSVJRX1RNUjMiCitjb25maWcgSVJRX1RJTUVSNAorCWludCAiSVJRX1RJTUVSNCIKIAlkZWZhdWx0IDEyCi1jb25maWcgSVJRX1RNUjQKLQlpbnQgIklSUV9UTVI0IgorY29uZmlnIElSUV9USU1FUjUKKwlpbnQgIklSUV9USU1FUjUiCiAJZGVmYXVsdCAxMgotY29uZmlnIElSUV9UTVI1Ci0JaW50ICJJUlFfVE1SNSIKK2NvbmZpZyBJUlFfVElNRVI2CisJaW50ICJJUlFfVElNRVI2IgogCWRlZmF1bHQgMTIKLWNvbmZpZyBJUlFfVE1SNgotCWludCAiSVJRX1RNUjYiCi0JZGVmYXVsdCAxMgotY29uZmlnIElSUV9UTVI3Ci0JaW50ICJJUlFfVE1SNyIKK2NvbmZpZyBJUlFfVElNRVI3CisJaW50ICJJUlFfVElNRVI3IgogCWRlZmF1bHQgMTIKIGNvbmZpZyBJUlFfUE9SVEdfSU5UQQogCWludCAiSVJRX1BPUlRHX0lOVEEiCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvTWFrZWZpbGUgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvTWFrZWZpbGUKaW5kZXggNGVkZGI1OC4uNGE2Y2RhZiAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L01ha2VmaWxlCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9NYWtlZmlsZQpAQCAtMiw2ICsyLDQgQEAKICMgYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L01ha2VmaWxlCiAjCiAKLWV4dHJhLXkgOj0gaGVhZC5vCi0KIG9iai15IDo9IGludHMtcHJpb3JpdHkubyBkbWEubwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2JvYXJkcy9jbV9iZjUyNy5jIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2JvYXJkcy9jbV9iZjUyNy5jCmluZGV4IDllYTQ0MGIuLmEyYzM1NzggMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9ib2FyZHMvY21fYmY1MjcuYworKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvYm9hcmRzL2NtX2JmNTI3LmMKQEAgLTYxLDUxICs2MSw0MCBAQAogICogIERyaXZlciBuZWVkcyB0byBrbm93IGFkZHJlc3MsIGlycSBhbmQgZmxhZyBwaW4uCiAgKi8KIAotI2RlZmluZSBJU1AxNzYxX0JBU0UgICAgICAgMHgyMDNDMDAwMAotI2RlZmluZSBJU1AxNzYxX0lSUSAgICAgICAgSVJRX1BGNwotCiAjaWYgZGVmaW5lZChDT05GSUdfVVNCX0lTUDE3NjBfSENEKSB8fCBkZWZpbmVkKENPTkZJR19VU0JfSVNQMTc2MF9IQ0RfTU9EVUxFKQotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBiZmluX2lzcDE3NjFfcmVzb3VyY2VzW10gPSB7CisjaW5jbHVkZSA8bGludXgvdXNiL2lzcDE3NjAuaD4KK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYmZpbl9pc3AxNzYwX3Jlc291cmNlc1tdID0gewogCVswXSA9IHsKLQkJLm5hbWUJPSAiaXNwMTc2MS1yZWdzIiwKLQkJLnN0YXJ0ICA9IElTUDE3NjFfQkFTRSArIDB4MDAwMDAwMDAsCi0JCS5lbmQgICAgPSBJU1AxNzYxX0JBU0UgKyAweDAwMGZmZmZmLAorCQkuc3RhcnQgID0gMHgyMDNDMDAwMCwKKwkJLmVuZCAgICA9IDB4MjAzQzAwMDAgKyAweDAwMGZmZmZmLAogCQkuZmxhZ3MgID0gSU9SRVNPVVJDRV9NRU0sCiAJfSwKIAlbMV0gPSB7Ci0JCS5zdGFydCAgPSBJU1AxNzYxX0lSUSwKLQkJLmVuZCAgICA9IElTUDE3NjFfSVJRLAorCQkuc3RhcnQgID0gSVJRX1BGNywKKwkJLmVuZCAgICA9IElSUV9QRjcsCiAJCS5mbGFncyAgPSBJT1JFU09VUkNFX0lSUSwKIAl9LAogfTsKIAotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYmZpbl9pc3AxNzYxX2RldmljZSA9IHsKLQkubmFtZSAgICAgICAgICAgPSAiaXNwMTc2MSIsCitzdGF0aWMgc3RydWN0IGlzcDE3NjBfcGxhdGZvcm1fZGF0YSBpc3AxNzYwX3ByaXYgPSB7CisJLmlzX2lzcDE3NjEgPSAwLAorCS5wb3J0MV9kaXNhYmxlID0gMCwKKwkuYnVzX3dpZHRoXzE2ID0gMSwKKwkucG9ydDFfb3RnID0gMCwKKwkuYW5hbG9nX29jID0gMCwKKwkuZGFja19wb2xhcml0eV9oaWdoID0gMCwKKwkuZHJlcV9wb2xhcml0eV9oaWdoID0gMCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGJmaW5faXNwMTc2MF9kZXZpY2UgPSB7CisJLm5hbWUgICAgICAgICAgID0gImlzcDE3NjAtaGNkIiwKIAkuaWQgICAgICAgICAgICAgPSAwLAotCS5udW1fcmVzb3VyY2VzICA9IEFSUkFZX1NJWkUoYmZpbl9pc3AxNzYxX3Jlc291cmNlcyksCi0JLnJlc291cmNlICAgICAgID0gYmZpbl9pc3AxNzYxX3Jlc291cmNlcywKKwkuZGV2ID0geworCQkucGxhdGZvcm1fZGF0YSA9ICZpc3AxNzYwX3ByaXYsCisJfSwKKwkubnVtX3Jlc291cmNlcyAgPSBBUlJBWV9TSVpFKGJmaW5faXNwMTc2MF9yZXNvdXJjZXMpLAorCS5yZXNvdXJjZSAgICAgICA9IGJmaW5faXNwMTc2MF9yZXNvdXJjZXMsCiB9OwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqYmZpbl9pc3AxNzYxX2RldmljZXNbXSA9IHsKLQkmYmZpbl9pc3AxNzYxX2RldmljZSwKLX07Ci0KLWludCBfX2luaXQgYmZpbl9pc3AxNzYxX2luaXQodm9pZCkKLXsKLQl1bnNpZ25lZCBpbnQgbnVtX2RldmljZXMgPSBBUlJBWV9TSVpFKGJmaW5faXNwMTc2MV9kZXZpY2VzKTsKLQotCXByaW50ayhLRVJOX0lORk8gIiVzKCk6IHJlZ2lzdGVyaW5nIGRldmljZSByZXNvdXJjZXNcbiIsIF9fZnVuY19fKTsKLQlzZXRfaXJxX3R5cGUoSVNQMTc2MV9JUlEsIElSUUZfVFJJR0dFUl9GQUxMSU5HKTsKLQotCXJldHVybiBwbGF0Zm9ybV9hZGRfZGV2aWNlcyhiZmluX2lzcDE3NjFfZGV2aWNlcywgbnVtX2RldmljZXMpOwotfQotCi12b2lkIF9fZXhpdCBiZmluX2lzcDE3NjFfZXhpdCh2b2lkKQotewotCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKCZiZmluX2lzcDE3NjFfZGV2aWNlKTsKLX0KLQotYXJjaF9pbml0Y2FsbChiZmluX2lzcDE3NjFfaW5pdCk7CiAjZW5kaWYKIAogI2lmIGRlZmluZWQoQ09ORklHX1VTQl9NVVNCX0hEUkMpIHx8IGRlZmluZWQoQ09ORklHX1VTQl9NVVNCX0hEUkNfTU9EVUxFKQpAQCAtMTMyLDggKzEyMSw4IEBACiAJLmR5bl9maWZvCT0gMCwKIAkuc29mdF9jb24JPSAxLAogCS5kbWEJCT0gMSwKLQkubnVtX2Vwcwk9IDcsCi0JLmRtYV9jaGFubmVscwk9IDcsCisJLm51bV9lcHMJPSA4LAorCS5kbWFfY2hhbm5lbHMJPSA4LAogCS5ncGlvX3Zyc2VsCT0gR1BJT19QRjExLAogfTsKIApAQCAtNzI4LDMwICs3MTcsNTkgQEAKICNlbmRpZgogCiAjaWYgZGVmaW5lZChDT05GSUdfQkZJTl9TSVIpIHx8IGRlZmluZWQoQ09ORklHX0JGSU5fU0lSX01PRFVMRSkKLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYmZpbl9zaXJfcmVzb3VyY2VzW10gPSB7CiAjaWZkZWYgQ09ORklHX0JGSU5fU0lSMAorc3RhdGljIHN0cnVjdCByZXNvdXJjZSBiZmluX3NpcjBfcmVzb3VyY2VzW10gPSB7CiAJewogCQkuc3RhcnQgPSAweEZGQzAwNDAwLAogCQkuZW5kID0gMHhGRkMwMDRGRiwKIAkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCiAJfSwKKwl7CisJCS5zdGFydCA9IElSUV9VQVJUMF9SWCwKKwkJLmVuZCA9IElSUV9VQVJUMF9SWCsxLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorCXsKKwkJLnN0YXJ0ID0gQ0hfVUFSVDBfUlgsCisJCS5lbmQgPSBDSF9VQVJUMF9SWCsxLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0RNQSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYmZpbl9zaXIwX2RldmljZSA9IHsKKwkubmFtZSA9ICJiZmluX3NpciIsCisJLmlkID0gMCwKKwkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUoYmZpbl9zaXIwX3Jlc291cmNlcyksCisJLnJlc291cmNlID0gYmZpbl9zaXIwX3Jlc291cmNlcywKK307CiAjZW5kaWYKICNpZmRlZiBDT05GSUdfQkZJTl9TSVIxCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGJmaW5fc2lyMV9yZXNvdXJjZXNbXSA9IHsKIAl7CiAJCS5zdGFydCA9IDB4RkZDMDIwMDAsCiAJCS5lbmQgPSAweEZGQzAyMEZGLAogCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKIAl9LAotI2VuZGlmCisJeworCQkuc3RhcnQgPSBJUlFfVUFSVDFfUlgsCisJCS5lbmQgPSBJUlFfVUFSVDFfUlgrMSwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJfSwKKwl7CisJCS5zdGFydCA9IENIX1VBUlQxX1JYLAorCQkuZW5kID0gQ0hfVUFSVDFfUlgrMSwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9ETUEsCisJfSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGJmaW5fc2lyX2RldmljZSA9IHsKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGJmaW5fc2lyMV9kZXZpY2UgPSB7CiAJLm5hbWUgPSAiYmZpbl9zaXIiLAotCS5pZCA9IDAsCi0JLm51bV9yZXNvdXJjZXMgPSBBUlJBWV9TSVpFKGJmaW5fc2lyX3Jlc291cmNlcyksCi0JLnJlc291cmNlID0gYmZpbl9zaXJfcmVzb3VyY2VzLAorCS5pZCA9IDEsCisJLm51bV9yZXNvdXJjZXMgPSBBUlJBWV9TSVpFKGJmaW5fc2lyMV9yZXNvdXJjZXMpLAorCS5yZXNvdXJjZSA9IGJmaW5fc2lyMV9yZXNvdXJjZXMsCiB9OwogI2VuZGlmCisjZW5kaWYKIAogI2lmIGRlZmluZWQoQ09ORklHX0kyQ19CTEFDS0ZJTl9UV0kpIHx8IGRlZmluZWQoQ09ORklHX0kyQ19CTEFDS0ZJTl9UV0lfTU9EVUxFKQogc3RhdGljIHN0cnVjdCByZXNvdXJjZSBiZmluX3R3aTBfcmVzb3VyY2VbXSA9IHsKQEAgLTg4NSw2ICs5MDMsMTAgQEAKIAkmaXNwMTM2Ml9oY2RfZGV2aWNlLAogI2VuZGlmCiAKKyNpZiBkZWZpbmVkKENPTkZJR19VU0JfSVNQMTc2MF9IQ0QpIHx8IGRlZmluZWQoQ09ORklHX1VTQl9JU1AxNzYwX0hDRF9NT0RVTEUpCisJJmJmaW5faXNwMTc2MF9kZXZpY2UsCisjZW5kaWYKKwogI2lmIGRlZmluZWQoQ09ORklHX1VTQl9NVVNCX0hEUkMpIHx8IGRlZmluZWQoQ09ORklHX1VTQl9NVVNCX0hEUkNfTU9EVUxFKQogCSZtdXNiX2RldmljZSwKICNlbmRpZgpAQCAtOTE4LDcgKzk0MCwxMiBAQAogI2VuZGlmCiAKICNpZiBkZWZpbmVkKENPTkZJR19CRklOX1NJUikgfHwgZGVmaW5lZChDT05GSUdfQkZJTl9TSVJfTU9EVUxFKQotCSZiZmluX3Npcl9kZXZpY2UsCisjaWZkZWYgQ09ORklHX0JGSU5fU0lSMAorCSZiZmluX3NpcjBfZGV2aWNlLAorI2VuZGlmCisjaWZkZWYgQ09ORklHX0JGSU5fU0lSMQorCSZiZmluX3NpcjFfZGV2aWNlLAorI2VuZGlmCiAjZW5kaWYKIAogI2lmIGRlZmluZWQoQ09ORklHX0kyQ19CTEFDS0ZJTl9UV0kpIHx8IGRlZmluZWQoQ09ORklHX0kyQ19CTEFDS0ZJTl9UV0lfTU9EVUxFKQpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2JvYXJkcy9lemJyZC5jIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2JvYXJkcy9lemJyZC5jCmluZGV4IDM2Yzg3YjYuLjAzMTRiZDMgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9ib2FyZHMvZXpicmQuYworKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvYm9hcmRzL2V6YnJkLmMKQEAgLTUxLDcgKzUxLDcgQEAKIC8qCiAgKiBOYW1lIHRoZSBCb2FyZCBmb3IgdGhlIC9wcm9jL2NwdWluZm8KICAqLwotY29uc3QgY2hhciBiZmluX2JvYXJkX25hbWVbXSA9ICJCRjUyNi1FWkJSRCI7Citjb25zdCBjaGFyIGJmaW5fYm9hcmRfbmFtZVtdID0gIkFESSBCRjUyNi1FWkJSRCI7CiAKIC8qCiAgKiAgRHJpdmVyIG5lZWRzIHRvIGtub3cgYWRkcmVzcywgaXJxIGFuZCBmbGFnIHBpbi4KQEAgLTgxLDggKzgxLDggQEAKIAkuZHluX2ZpZm8JPSAwLAogCS5zb2Z0X2Nvbgk9IDEsCiAJLmRtYQkJPSAxLAotCS5udW1fZXBzCT0gNywKLQkuZG1hX2NoYW5uZWxzCT0gNywKKwkubnVtX2Vwcwk9IDgsCisJLmRtYV9jaGFubmVscwk9IDgsCiAJLmdwaW9fdnJzZWwJPSBHUElPX1BHMTMsCiB9OwogCkBAIC0yODgsNiArMjg4LDMwIEBACiB9OwogI2VuZGlmCiAKKyNpZiBkZWZpbmVkKENPTkZJR19UT1VDSFNDUkVFTl9BRDc4NzkpIHx8IGRlZmluZWQoQ09ORklHX1RPVUNIU0NSRUVOX0FENzg3OV9NT0RVTEUpCisjaW5jbHVkZSA8bGludXgvc3BpL2FkNzg3OS5oPgorc3RhdGljIGNvbnN0IHN0cnVjdCBhZDc4NzlfcGxhdGZvcm1fZGF0YSBiZmluX2FkNzg3OV90c19pbmZvID0geworCS5tb2RlbAkJCT0gNzg3OSwJLyogTW9kZWwgPSBBRDc4NzkgKi8KKwkueF9wbGF0ZV9vaG1zCQk9IDYyMCwJLyogNjIwIE9obSBmcm9tIHRoZSB0b3VjaCBkYXRhc2hlZXQgKi8KKwkucHJlc3N1cmVfbWF4CQk9IDEwMDAwLAorCS5wcmVzc3VyZV9taW4JCT0gMCwKKwkuZmlyc3RfY29udmVyc2lvbl9kZWxheSA9IDMsCS8qIHdhaXQgNTEydXMgYmVmb3JlIGRvIGEgZmlyc3QgY29udmVyc2lvbiAqLworCS5hY3F1aXNpdGlvbl90aW1lIAk9IDEsCS8qIDR1cyBhY3F1aXNpdGlvbiB0aW1lIHBlciBzYW1wbGUgKi8KKwkubWVkaWFuCQkJPSAyLAkvKiBkbyA4IG1lYXN1cmVtZW50cyAqLworCS5hdmVyYWdpbmcgCQk9IDEsCS8qIHRha2UgdGhlIGF2ZXJhZ2Ugb2YgNCBtaWRkbGUgc2FtcGxlcyAqLworCS5wZW5fZG93bl9hY2NfaW50ZXJ2YWwgCT0gMjU1LAkvKiA5LjQgbXMgKi8KKwkuZ3Bpb19vdXRwdXQJCT0gMSwJLyogY29uZmlndXJlIEFVWC9WQkFUL0dQSU8gYXMgR1BJTyBvdXRwdXQgKi8KKwkuZ3Bpb19kZWZhdWx0IAkJPSAxLAkvKiBEdXJpbmcgaW5pdGlhbGl6YXRpb24gc2V0IEdQSU8gPSBISUdIICovCit9OworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19UT1VDSFNDUkVFTl9BRDc4NzlfU1BJKSB8fCBkZWZpbmVkKENPTkZJR19UT1VDSFNDUkVFTl9BRDc4NzlfU1BJX01PRFVMRSkKK3N0YXRpYyBzdHJ1Y3QgYmZpbjV4eF9zcGlfY2hpcCBzcGlfYWQ3ODc5X2NoaXBfaW5mbyA9IHsKKwkuZW5hYmxlX2RtYSA9IDAsCisJLmJpdHNfcGVyX3dvcmQgPSAxNiwKK307CisjZW5kaWYKKwogI2lmIGRlZmluZWQoQ09ORklHX1NORF9TT0NfV004NzMxKSB8fCBkZWZpbmVkKENPTkZJR19TTkRfU09DX1dNODczMV9NT0RVTEUpIFwKIAkgJiYgZGVmaW5lZChDT05GSUdfU05EX1NPQ19XTTg3MzFfU1BJKQogc3RhdGljIHN0cnVjdCBiZmluNXh4X3NwaV9jaGlwIHNwaV93bTg3MzFfY2hpcF9pbmZvID0gewpAQCAtMzg2LDYgKzQxMCwxOCBAQAogCQkuY29udHJvbGxlcl9kYXRhID0gJnNwaV9hZDc4NzdfY2hpcF9pbmZvLAogCX0sCiAjZW5kaWYKKyNpZiBkZWZpbmVkKENPTkZJR19UT1VDSFNDUkVFTl9BRDc4NzlfU1BJKSB8fCBkZWZpbmVkKENPTkZJR19UT1VDSFNDUkVFTl9BRDc4NzlfU1BJX01PRFVMRSkKKwl7CisJCS5tb2RhbGlhcyA9ICJhZDc4NzkiLAorCQkucGxhdGZvcm1fZGF0YSA9ICZiZmluX2FkNzg3OV90c19pbmZvLAorCQkuaXJxID0gSVJRX1BHMCwKKwkJLm1heF9zcGVlZF9oeiA9IDUwMDAwMDAsICAgICAvKiBtYXggc3BpIGNsb2NrIChTQ0spIHNwZWVkIGluIEhaICovCisJCS5idXNfbnVtID0gMCwKKwkJLmNoaXBfc2VsZWN0ID0gNSwKKwkJLmNvbnRyb2xsZXJfZGF0YSA9ICZzcGlfYWQ3ODc5X2NoaXBfaW5mbywKKwkJLm1vZGUgPSBTUElfQ1BIQSB8IFNQSV9DUE9MLAorCX0sCisjZW5kaWYKICNpZiBkZWZpbmVkKENPTkZJR19TTkRfU09DX1dNODczMSkgfHwgZGVmaW5lZChDT05GSUdfU05EX1NPQ19XTTg3MzFfTU9EVUxFKSBcCiAJICYmIGRlZmluZWQoQ09ORklHX1NORF9TT0NfV004NzMxX1NQSSkKIAl7CkBAIC00NzgsMzAgKzUxNCw1OSBAQAogI2VuZGlmCiAKICNpZiBkZWZpbmVkKENPTkZJR19CRklOX1NJUikgfHwgZGVmaW5lZChDT05GSUdfQkZJTl9TSVJfTU9EVUxFKQotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBiZmluX3Npcl9yZXNvdXJjZXNbXSA9IHsKICNpZmRlZiBDT05GSUdfQkZJTl9TSVIwCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGJmaW5fc2lyMF9yZXNvdXJjZXNbXSA9IHsKIAl7CiAJCS5zdGFydCA9IDB4RkZDMDA0MDAsCiAJCS5lbmQgPSAweEZGQzAwNEZGLAogCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKIAl9LAorCXsKKwkJLnN0YXJ0ID0gSVJRX1VBUlQwX1JYLAorCQkuZW5kID0gSVJRX1VBUlQwX1JYKzEsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCX0sCisJeworCQkuc3RhcnQgPSBDSF9VQVJUMF9SWCwKKwkJLmVuZCA9IENIX1VBUlQwX1JYKzEsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfRE1BLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZmluX3NpcjBfZGV2aWNlID0geworCS5uYW1lID0gImJmaW5fc2lyIiwKKwkuaWQgPSAwLAorCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRShiZmluX3NpcjBfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UgPSBiZmluX3NpcjBfcmVzb3VyY2VzLAorfTsKICNlbmRpZgogI2lmZGVmIENPTkZJR19CRklOX1NJUjEKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYmZpbl9zaXIxX3Jlc291cmNlc1tdID0gewogCXsKIAkJLnN0YXJ0ID0gMHhGRkMwMjAwMCwKIAkJLmVuZCA9IDB4RkZDMDIwRkYsCiAJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAogCX0sCi0jZW5kaWYKKwl7CisJCS5zdGFydCA9IElSUV9VQVJUMV9SWCwKKwkJLmVuZCA9IElSUV9VQVJUMV9SWCsxLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorCXsKKwkJLnN0YXJ0ID0gQ0hfVUFSVDFfUlgsCisJCS5lbmQgPSBDSF9VQVJUMV9SWCsxLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0RNQSwKKwl9LAogfTsKIAotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYmZpbl9zaXJfZGV2aWNlID0geworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYmZpbl9zaXIxX2RldmljZSA9IHsKIAkubmFtZSA9ICJiZmluX3NpciIsCi0JLmlkID0gMCwKLQkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUoYmZpbl9zaXJfcmVzb3VyY2VzKSwKLQkucmVzb3VyY2UgPSBiZmluX3Npcl9yZXNvdXJjZXMsCisJLmlkID0gMSwKKwkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUoYmZpbl9zaXIxX3Jlc291cmNlcyksCisJLnJlc291cmNlID0gYmZpbl9zaXIxX3Jlc291cmNlcywKIH07CiAjZW5kaWYKKyNlbmRpZgogCiAjaWYgZGVmaW5lZChDT05GSUdfSTJDX0JMQUNLRklOX1RXSSkgfHwgZGVmaW5lZChDT05GSUdfSTJDX0JMQUNLRklOX1RXSV9NT0RVTEUpCiBzdGF0aWMgc3RydWN0IHJlc291cmNlIGJmaW5fdHdpMF9yZXNvdXJjZVtdID0gewpAQCAtNjcxLDcgKzczNiwxMiBAQAogI2VuZGlmCiAKICNpZiBkZWZpbmVkKENPTkZJR19CRklOX1NJUikgfHwgZGVmaW5lZChDT05GSUdfQkZJTl9TSVJfTU9EVUxFKQotCSZiZmluX3Npcl9kZXZpY2UsCisjaWZkZWYgQ09ORklHX0JGSU5fU0lSMAorCSZiZmluX3NpcjBfZGV2aWNlLAorI2VuZGlmCisjaWZkZWYgQ09ORklHX0JGSU5fU0lSMQorCSZiZmluX3NpcjFfZGV2aWNlLAorI2VuZGlmCiAjZW5kaWYKIAogI2lmIGRlZmluZWQoQ09ORklHX0kyQ19CTEFDS0ZJTl9UV0kpIHx8IGRlZmluZWQoQ09ORklHX0kyQ19CTEFDS0ZJTl9UV0lfTU9EVUxFKQpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2JvYXJkcy9lemtpdC5jIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2JvYXJkcy9lemtpdC5jCmluZGV4IDhlZTJiNzQuLjk0NTRmYjcgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9ib2FyZHMvZXpraXQuYworKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvYm9hcmRzL2V6a2l0LmMKQEAgLTU0LDU3ICs1NCw0NiBAQAogLyoKICAqIE5hbWUgdGhlIEJvYXJkIGZvciB0aGUgL3Byb2MvY3B1aW5mbwogICovCi1jb25zdCBjaGFyIGJmaW5fYm9hcmRfbmFtZVtdID0gIkFERFMtQkY1MjctRVpLSVQiOworY29uc3QgY2hhciBiZmluX2JvYXJkX25hbWVbXSA9ICJBREkgQkY1MjctRVpLSVQiOwogCiAvKgogICogIERyaXZlciBuZWVkcyB0byBrbm93IGFkZHJlc3MsIGlycSBhbmQgZmxhZyBwaW4uCiAgKi8KIAotI2RlZmluZSBJU1AxNzYxX0JBU0UgICAgICAgMHgyMDNDMDAwMAotI2RlZmluZSBJU1AxNzYxX0lSUSAgICAgICAgSVJRX1BGNwotCiAjaWYgZGVmaW5lZChDT05GSUdfVVNCX0lTUDE3NjBfSENEKSB8fCBkZWZpbmVkKENPTkZJR19VU0JfSVNQMTc2MF9IQ0RfTU9EVUxFKQotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBiZmluX2lzcDE3NjFfcmVzb3VyY2VzW10gPSB7CisjaW5jbHVkZSA8bGludXgvdXNiL2lzcDE3NjAuaD4KK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYmZpbl9pc3AxNzYwX3Jlc291cmNlc1tdID0gewogCVswXSA9IHsKLQkJLm5hbWUJPSAiaXNwMTc2MS1yZWdzIiwKLQkJLnN0YXJ0ICA9IElTUDE3NjFfQkFTRSArIDB4MDAwMDAwMDAsCi0JCS5lbmQgICAgPSBJU1AxNzYxX0JBU0UgKyAweDAwMGZmZmZmLAorCQkuc3RhcnQgID0gMHgyMDNDMDAwMCwKKwkJLmVuZCAgICA9IDB4MjAzQzAwMDAgKyAweDAwMGZmZmZmLAogCQkuZmxhZ3MgID0gSU9SRVNPVVJDRV9NRU0sCiAJfSwKIAlbMV0gPSB7Ci0JCS5zdGFydCAgPSBJU1AxNzYxX0lSUSwKLQkJLmVuZCAgICA9IElTUDE3NjFfSVJRLAorCQkuc3RhcnQgID0gSVJRX1BGNywKKwkJLmVuZCAgICA9IElSUV9QRjcsCiAJCS5mbGFncyAgPSBJT1JFU09VUkNFX0lSUSwKIAl9LAogfTsKIAotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYmZpbl9pc3AxNzYxX2RldmljZSA9IHsKLQkubmFtZSAgICAgICAgICAgPSAiaXNwMTc2MSIsCitzdGF0aWMgc3RydWN0IGlzcDE3NjBfcGxhdGZvcm1fZGF0YSBpc3AxNzYwX3ByaXYgPSB7CisJLmlzX2lzcDE3NjEgPSAwLAorCS5wb3J0MV9kaXNhYmxlID0gMCwKKwkuYnVzX3dpZHRoXzE2ID0gMSwKKwkucG9ydDFfb3RnID0gMCwKKwkuYW5hbG9nX29jID0gMCwKKwkuZGFja19wb2xhcml0eV9oaWdoID0gMCwKKwkuZHJlcV9wb2xhcml0eV9oaWdoID0gMCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGJmaW5faXNwMTc2MF9kZXZpY2UgPSB7CisJLm5hbWUgICAgICAgICAgID0gImlzcDE3NjAtaGNkIiwKIAkuaWQgICAgICAgICAgICAgPSAwLAotCS5udW1fcmVzb3VyY2VzICA9IEFSUkFZX1NJWkUoYmZpbl9pc3AxNzYxX3Jlc291cmNlcyksCi0JLnJlc291cmNlICAgICAgID0gYmZpbl9pc3AxNzYxX3Jlc291cmNlcywKKwkuZGV2ID0geworCQkucGxhdGZvcm1fZGF0YSA9ICZpc3AxNzYwX3ByaXYsCisJfSwKKwkubnVtX3Jlc291cmNlcyAgPSBBUlJBWV9TSVpFKGJmaW5faXNwMTc2MF9yZXNvdXJjZXMpLAorCS5yZXNvdXJjZSAgICAgICA9IGJmaW5faXNwMTc2MF9yZXNvdXJjZXMsCiB9OwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqYmZpbl9pc3AxNzYxX2RldmljZXNbXSA9IHsKLQkmYmZpbl9pc3AxNzYxX2RldmljZSwKLX07Ci0KLWludCBfX2luaXQgYmZpbl9pc3AxNzYxX2luaXQodm9pZCkKLXsKLQl1bnNpZ25lZCBpbnQgbnVtX2RldmljZXMgPSBBUlJBWV9TSVpFKGJmaW5faXNwMTc2MV9kZXZpY2VzKTsKLQotCXByaW50ayhLRVJOX0lORk8gIiVzKCk6IHJlZ2lzdGVyaW5nIGRldmljZSByZXNvdXJjZXNcbiIsIF9fZnVuY19fKTsKLQlzZXRfaXJxX3R5cGUoSVNQMTc2MV9JUlEsIElSUUZfVFJJR0dFUl9GQUxMSU5HKTsKLQotCXJldHVybiBwbGF0Zm9ybV9hZGRfZGV2aWNlcyhiZmluX2lzcDE3NjFfZGV2aWNlcywgbnVtX2RldmljZXMpOwotfQotCi12b2lkIF9fZXhpdCBiZmluX2lzcDE3NjFfZXhpdCh2b2lkKQotewotCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKCZiZmluX2lzcDE3NjFfZGV2aWNlKTsKLX0KLQotYXJjaF9pbml0Y2FsbChiZmluX2lzcDE3NjFfaW5pdCk7CiAjZW5kaWYKIAogI2lmIGRlZmluZWQoQ09ORklHX1VTQl9NVVNCX0hEUkMpIHx8IGRlZmluZWQoQ09ORklHX1VTQl9NVVNCX0hEUkNfTU9EVUxFKQpAQCAtMTMxLDggKzEyMCw4IEBACiAJLmR5bl9maWZvCT0gMCwKIAkuc29mdF9jb24JPSAxLAogCS5kbWEJCT0gMSwKLQkubnVtX2Vwcwk9IDcsCi0JLmRtYV9jaGFubmVscwk9IDcsCisJLm51bV9lcHMJPSA4LAorCS5kbWFfY2hhbm5lbHMJPSA4LAogCS5ncGlvX3Zyc2VsCT0gR1BJT19QRzEzLAogfTsKIApAQCAtNTE1LDEzICs1MDQsNiBAQAogfTsKICNlbmRpZgogCi0jaWYgZGVmaW5lZChDT05GSUdfU1BJX01NQykgfHwgZGVmaW5lZChDT05GSUdfU1BJX01NQ19NT0RVTEUpCi1zdGF0aWMgc3RydWN0IGJmaW41eHhfc3BpX2NoaXAgc3BpX21tY19jaGlwX2luZm8gPSB7Ci0JLmVuYWJsZV9kbWEgPSAxLAotCS5iaXRzX3Blcl93b3JkID0gOCwKLX07Ci0jZW5kaWYKLQogI2lmIGRlZmluZWQoQ09ORklHX1BCWCkKIHN0YXRpYyBzdHJ1Y3QgYmZpbjV4eF9zcGlfY2hpcCBzcGlfc2kzeHh4X2NoaXBfaW5mbyA9IHsKIAkuY3RsX3JlZwk9IDB4NCwgLyogc2VuZCB6ZXJvICovCkBAIC01NTIsNiArNTM0LDMwIEBACiB9OwogI2VuZGlmCiAKKyNpZiBkZWZpbmVkKENPTkZJR19UT1VDSFNDUkVFTl9BRDc4NzkpIHx8IGRlZmluZWQoQ09ORklHX1RPVUNIU0NSRUVOX0FENzg3OV9NT0RVTEUpCisjaW5jbHVkZSA8bGludXgvc3BpL2FkNzg3OS5oPgorc3RhdGljIGNvbnN0IHN0cnVjdCBhZDc4NzlfcGxhdGZvcm1fZGF0YSBiZmluX2FkNzg3OV90c19pbmZvID0geworCS5tb2RlbAkJCT0gNzg3OSwJLyogTW9kZWwgPSBBRDc4NzkgKi8KKwkueF9wbGF0ZV9vaG1zCQk9IDYyMCwJLyogNjIwIE9obSBmcm9tIHRoZSB0b3VjaCBkYXRhc2hlZXQgKi8KKwkucHJlc3N1cmVfbWF4CQk9IDEwMDAwLAorCS5wcmVzc3VyZV9taW4JCT0gMCwKKwkuZmlyc3RfY29udmVyc2lvbl9kZWxheSA9IDMsCS8qIHdhaXQgNTEydXMgYmVmb3JlIGRvIGEgZmlyc3QgY29udmVyc2lvbiAqLworCS5hY3F1aXNpdGlvbl90aW1lIAk9IDEsCS8qIDR1cyBhY3F1aXNpdGlvbiB0aW1lIHBlciBzYW1wbGUgKi8KKwkubWVkaWFuCQkJPSAyLAkvKiBkbyA4IG1lYXN1cmVtZW50cyAqLworCS5hdmVyYWdpbmcgCQk9IDEsCS8qIHRha2UgdGhlIGF2ZXJhZ2Ugb2YgNCBtaWRkbGUgc2FtcGxlcyAqLworCS5wZW5fZG93bl9hY2NfaW50ZXJ2YWwgCT0gMjU1LAkvKiA5LjQgbXMgKi8KKwkuZ3Bpb19vdXRwdXQJCT0gMSwJLyogY29uZmlndXJlIEFVWC9WQkFUL0dQSU8gYXMgR1BJTyBvdXRwdXQgKi8KKwkuZ3Bpb19kZWZhdWx0IAkJPSAxLAkvKiBEdXJpbmcgaW5pdGlhbGl6YXRpb24gc2V0IEdQSU8gPSBISUdIICovCit9OworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19UT1VDSFNDUkVFTl9BRDc4NzlfU1BJKSB8fCBkZWZpbmVkKENPTkZJR19UT1VDSFNDUkVFTl9BRDc4NzlfU1BJX01PRFVMRSkKK3N0YXRpYyBzdHJ1Y3QgYmZpbjV4eF9zcGlfY2hpcCBzcGlfYWQ3ODc5X2NoaXBfaW5mbyA9IHsKKwkuZW5hYmxlX2RtYSA9IDAsCisJLmJpdHNfcGVyX3dvcmQgPSAxNiwKK307CisjZW5kaWYKKwogI2lmIGRlZmluZWQoQ09ORklHX1NORF9TT0NfV004NzMxKSB8fCBkZWZpbmVkKENPTkZJR19TTkRfU09DX1dNODczMV9NT0RVTEUpIFwKIAkgJiYgZGVmaW5lZChDT05GSUdfU05EX1NPQ19XTTg3MzFfU1BJKQogc3RhdGljIHN0cnVjdCBiZmluNXh4X3NwaV9jaGlwIHNwaV93bTg3MzFfY2hpcF9pbmZvID0gewpAQCAtNjEzLDI2ICs2MTksNiBAQAogCQkuY29udHJvbGxlcl9kYXRhID0gJmFkOTk2MF9zcGlfY2hpcF9pbmZvLAogCX0sCiAjZW5kaWYKLSNpZiBkZWZpbmVkKENPTkZJR19TUElfTU1DKSB8fCBkZWZpbmVkKENPTkZJR19TUElfTU1DX01PRFVMRSkKLQl7Ci0JCS5tb2RhbGlhcyA9ICJzcGlfbW1jX2R1bW15IiwKLQkJLm1heF9zcGVlZF9oeiA9IDI1MDAwMDAwLCAgICAgLyogbWF4IHNwaSBjbG9jayAoU0NLKSBzcGVlZCBpbiBIWiAqLwotCQkuYnVzX251bSA9IDAsCi0JCS5jaGlwX3NlbGVjdCA9IDAsCi0JCS5wbGF0Zm9ybV9kYXRhID0gTlVMTCwKLQkJLmNvbnRyb2xsZXJfZGF0YSA9ICZzcGlfbW1jX2NoaXBfaW5mbywKLQkJLm1vZGUgPSBTUElfTU9ERV8zLAotCX0sCi0JewotCQkubW9kYWxpYXMgPSAic3BpX21tYyIsCi0JCS5tYXhfc3BlZWRfaHogPSAyNTAwMDAwMCwgICAgIC8qIG1heCBzcGkgY2xvY2sgKFNDSykgc3BlZWQgaW4gSFogKi8KLQkJLmJ1c19udW0gPSAwLAotCQkuY2hpcF9zZWxlY3QgPSBDT05GSUdfU1BJX01NQ19DU19DSEFOLAotCQkucGxhdGZvcm1fZGF0YSA9IE5VTEwsCi0JCS5jb250cm9sbGVyX2RhdGEgPSAmc3BpX21tY19jaGlwX2luZm8sCi0JCS5tb2RlID0gU1BJX01PREVfMywKLQl9LAotI2VuZGlmCiAjaWYgZGVmaW5lZChDT05GSUdfUEJYKQogCXsKIAkJLm1vZGFsaWFzID0gImZ4cy1zcGkiLApAQCAtNjYyLDYgKzY0OCwxOCBAQAogCQkuY29udHJvbGxlcl9kYXRhID0gJnNwaV9hZDc4NzdfY2hpcF9pbmZvLAogCX0sCiAjZW5kaWYKKyNpZiBkZWZpbmVkKENPTkZJR19UT1VDSFNDUkVFTl9BRDc4NzlfU1BJKSB8fCBkZWZpbmVkKENPTkZJR19UT1VDSFNDUkVFTl9BRDc4NzlfU1BJX01PRFVMRSkKKwl7CisJCS5tb2RhbGlhcyA9ICJhZDc4NzkiLAorCQkucGxhdGZvcm1fZGF0YSA9ICZiZmluX2FkNzg3OV90c19pbmZvLAorCQkuaXJxID0gSVJRX1BGOCwKKwkJLm1heF9zcGVlZF9oeiA9IDUwMDAwMDAsICAgICAvKiBtYXggc3BpIGNsb2NrIChTQ0spIHNwZWVkIGluIEhaICovCisJCS5idXNfbnVtID0gMCwKKwkJLmNoaXBfc2VsZWN0ID0gMywKKwkJLmNvbnRyb2xsZXJfZGF0YSA9ICZzcGlfYWQ3ODc5X2NoaXBfaW5mbywKKwkJLm1vZGUgPSBTUElfQ1BIQSB8IFNQSV9DUE9MLAorCX0sCisjZW5kaWYKICNpZiBkZWZpbmVkKENPTkZJR19TTkRfU09DX1dNODczMSkgfHwgZGVmaW5lZChDT05GSUdfU05EX1NPQ19XTTg3MzFfTU9EVUxFKSBcCiAJICYmIGRlZmluZWQoQ09ORklHX1NORF9TT0NfV004NzMxX1NQSSkKIAl7CkBAIC03NTYsMzAgKzc1NCw1OSBAQAogI2VuZGlmCiAKICNpZiBkZWZpbmVkKENPTkZJR19CRklOX1NJUikgfHwgZGVmaW5lZChDT05GSUdfQkZJTl9TSVJfTU9EVUxFKQotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBiZmluX3Npcl9yZXNvdXJjZXNbXSA9IHsKICNpZmRlZiBDT05GSUdfQkZJTl9TSVIwCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGJmaW5fc2lyMF9yZXNvdXJjZXNbXSA9IHsKIAl7CiAJCS5zdGFydCA9IDB4RkZDMDA0MDAsCiAJCS5lbmQgPSAweEZGQzAwNEZGLAogCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKIAl9LAorCXsKKwkJLnN0YXJ0ID0gSVJRX1VBUlQwX1JYLAorCQkuZW5kID0gSVJRX1VBUlQwX1JYKzEsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCX0sCisJeworCQkuc3RhcnQgPSBDSF9VQVJUMF9SWCwKKwkJLmVuZCA9IENIX1VBUlQwX1JYKzEsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfRE1BLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZmluX3NpcjBfZGV2aWNlID0geworCS5uYW1lID0gImJmaW5fc2lyIiwKKwkuaWQgPSAwLAorCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRShiZmluX3NpcjBfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UgPSBiZmluX3NpcjBfcmVzb3VyY2VzLAorfTsKICNlbmRpZgogI2lmZGVmIENPTkZJR19CRklOX1NJUjEKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYmZpbl9zaXIxX3Jlc291cmNlc1tdID0gewogCXsKIAkJLnN0YXJ0ID0gMHhGRkMwMjAwMCwKIAkJLmVuZCA9IDB4RkZDMDIwRkYsCiAJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAogCX0sCi0jZW5kaWYKKwl7CisJCS5zdGFydCA9IElSUV9VQVJUMV9SWCwKKwkJLmVuZCA9IElSUV9VQVJUMV9SWCsxLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorCXsKKwkJLnN0YXJ0ID0gQ0hfVUFSVDFfUlgsCisJCS5lbmQgPSBDSF9VQVJUMV9SWCsxLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0RNQSwKKwl9LAogfTsKIAotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYmZpbl9zaXJfZGV2aWNlID0geworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYmZpbl9zaXIxX2RldmljZSA9IHsKIAkubmFtZSA9ICJiZmluX3NpciIsCi0JLmlkID0gMCwKLQkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUoYmZpbl9zaXJfcmVzb3VyY2VzKSwKLQkucmVzb3VyY2UgPSBiZmluX3Npcl9yZXNvdXJjZXMsCisJLmlkID0gMSwKKwkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUoYmZpbl9zaXIxX3Jlc291cmNlcyksCisJLnJlc291cmNlID0gYmZpbl9zaXIxX3Jlc291cmNlcywKIH07CiAjZW5kaWYKKyNlbmRpZgogCiAjaWYgZGVmaW5lZChDT05GSUdfSTJDX0JMQUNLRklOX1RXSSkgfHwgZGVmaW5lZChDT05GSUdfSTJDX0JMQUNLRklOX1RXSV9NT0RVTEUpCiBzdGF0aWMgc3RydWN0IHJlc291cmNlIGJmaW5fdHdpMF9yZXNvdXJjZVtdID0gewpAQCAtOTQ0LDYgKzk3MSwxMCBAQAogCSZpc3AxMzYyX2hjZF9kZXZpY2UsCiAjZW5kaWYKIAorI2lmIGRlZmluZWQoQ09ORklHX1VTQl9JU1AxNzYwX0hDRCkgfHwgZGVmaW5lZChDT05GSUdfVVNCX0lTUDE3NjBfSENEX01PRFVMRSkKKwkmYmZpbl9pc3AxNzYwX2RldmljZSwKKyNlbmRpZgorCiAjaWYgZGVmaW5lZChDT05GSUdfVVNCX01VU0JfSERSQykgfHwgZGVmaW5lZChDT05GSUdfVVNCX01VU0JfSERSQ19NT0RVTEUpCiAJJm11c2JfZGV2aWNlLAogI2VuZGlmCkBAIC05ODUsNyArMTAxNiwxMiBAQAogI2VuZGlmCiAKICNpZiBkZWZpbmVkKENPTkZJR19CRklOX1NJUikgfHwgZGVmaW5lZChDT05GSUdfQkZJTl9TSVJfTU9EVUxFKQotCSZiZmluX3Npcl9kZXZpY2UsCisjaWZkZWYgQ09ORklHX0JGSU5fU0lSMAorCSZiZmluX3NpcjBfZGV2aWNlLAorI2VuZGlmCisjaWZkZWYgQ09ORklHX0JGSU5fU0lSMQorCSZiZmluX3NpcjFfZGV2aWNlLAorI2VuZGlmCiAjZW5kaWYKIAogI2lmIGRlZmluZWQoQ09ORklHX0kyQ19CTEFDS0ZJTl9UV0kpIHx8IGRlZmluZWQoQ09ORklHX0kyQ19CTEFDS0ZJTl9UV0lfTU9EVUxFKQpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2RtYS5jIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2RtYS5jCmluZGV4IGRmZDA4MGMuLjIzMTg3NzUgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9kbWEuYworKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvZG1hLmMKQEAgLTMxLDcgKzMxLDcgQEAKICNpbmNsdWRlIDxhc20vYmxhY2tmaW4uaD4KICNpbmNsdWRlIDxhc20vZG1hLmg+CiAKLXN0cnVjdCBkbWFfcmVnaXN0ZXIgKmRtYV9pb19iYXNlX2FkZHJbTUFYX0JMQUNLRklOX0RNQV9DSEFOTkVMXSA9IHsKK3N0cnVjdCBkbWFfcmVnaXN0ZXIgKmRtYV9pb19iYXNlX2FkZHJbTUFYX0RNQV9DSEFOTkVMU10gPSB7CiAJKHN0cnVjdCBkbWFfcmVnaXN0ZXIgKikgRE1BMF9ORVhUX0RFU0NfUFRSLAogCShzdHJ1Y3QgZG1hX3JlZ2lzdGVyICopIERNQTFfTkVYVF9ERVNDX1BUUiwKIAkoc3RydWN0IGRtYV9yZWdpc3RlciAqKSBETUEyX05FWFRfREVTQ19QVFIsCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvaGVhZC5TIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2hlYWQuUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGViMWRhOC4uMDAwMDAwMAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvaGVhZC5TCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLS8qCi0gKiBGaWxlOiAgICAgICAgIGFyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9oZWFkLlMKLSAqIEJhc2VkIG9uOiAgICAgYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2hlYWQuUwotICogQXV0aG9yOiAgICAgICBKZWZmIERpb25uZSA8amVmZkB1Y2xpbnV4Lm9yZz4gQ09QWVJJR0hUIDE5OTggRC4gSmVmZiBEaW9ubmUKLSAqCi0gKiBDcmVhdGVkOiAgICAgIDE5OTgKLSAqIERlc2NyaXB0aW9uOiAgU3RhcnR1cCBjb2RlIGZvciBCbGFja2ZpbiBCRjUzNwotICoKLSAqIE1vZGlmaWVkOgotICogICAgICAgICAgICAgICBDb3B5cmlnaHQgMjAwNC0yMDA3IEFuYWxvZyBEZXZpY2VzIEluYy4KLSAqCi0gKiBCdWdzOiAgICAgICAgIEVudGVyIGJ1Z3MgYXQgaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnLwotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIHRoZSBmaWxlIENPUFlJTkcsIG9yIHdyaXRlCi0gKiB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICogNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxhc20vYmxhY2tmaW4uaD4KLSNpZmRlZiBDT05GSUdfQkZJTl9LRVJORUxfQ0xPQ0sKLSNpbmNsdWRlIDxhc20vY2xvY2tzLmg+Ci0jaW5jbHVkZSA8bWFjaC9tZW1faW5pdC5oPgotI2VuZGlmCi0KLS5zZWN0aW9uIC5sMS50ZXh0Ci0jaWZkZWYgQ09ORklHX0JGSU5fS0VSTkVMX0NMT0NLCi1FTlRSWShfc3RhcnRfZG1hX2NvZGUpCi0KLQkvKiBFbmFibGUgUEhZIENMSyBidWZmZXIgb3V0cHV0ICovCi0JcDAuaCA9IGhpKFZSX0NUTCk7Ci0JcDAubCA9IGxvKFZSX0NUTCk7Ci0JcjAubCA9IHdbcDBdOwotCWJpdHNldChyMCwgMTQpOwotCXdbcDBdID0gcjAubDsKLQlzc3luYzsKLQotCXAwLmggPSBoaShTSUNfSVdSMCk7Ci0JcDAubCA9IGxvKFNJQ19JV1IwKTsKLQlyMC5sID0gMHgxOwotCXIwLmggPSAweDA7Ci0JW3AwXSA9IHIwOwotCVNTWU5DOwotCi0JLyoKLQkgKiAgU2V0IFBMTF9DVEwKLQkgKiAgIC0gWzE0OjA5XSA9IE1TRUxbNTowXSA6IENMS0lOIC8gVkNPIG11bHRpcGxpY2F0aW9uIGZhY3RvcnMKLQkgKiAgIC0gWzhdICAgICA9IEJZUEFTUyAgICA6IEJZUEFTUyB0aGUgUExMLCBydW4gQ0xLSU4gaW50byBDQ0xLL1NDTEsKLQkgKiAgIC0gWzddICAgICA9IG91dHB1dCBkZWxheSAoYWRkIDIwMHBzIG9mIGRlbGF5IHRvIG1lbSBzaWduYWxzKQotCSAqICAgLSBbNl0gICAgID0gaW5wdXQgZGVsYXkgKGFkZCAyMDBwcyBvZiBpbnB1dCBkZWxheSB0byBtZW0gc2lnbmFscykKLQkgKiAgIC0gWzVdICAgICA9IFBEV04gICAgICA6IDE9QWxsIENsb2NrcyBvZmYKLQkgKiAgIC0gWzNdICAgICA9IFNUT1BDSyAgICA6IDE9Q29yZSBDbG9jayBvZmYKLQkgKiAgIC0gWzFdICAgICA9IFBMTF9PRkYgICA6IDE9RGlzYWJsZSBQb3dlciB0byBQTEwKLQkgKiAgIC0gWzBdICAgICA9IERGICAgICAgICA6IDE9UGFzcyBDTEtJTi8yIHRvIFBMTCAvIDA9UGFzcyBDTEtJTiB0byBQTEwKLQkgKiAgIGFsbCBvdGhlciBiaXRzIHNldCB0byB6ZXJvCi0JICovCi0KLQlwMC5oID0gaGkoUExMX0xPQ0tDTlQpOwotCXAwLmwgPSBsbyhQTExfTE9DS0NOVCk7Ci0JcjAgPSAweDMwMChaKTsKLQl3W3AwXSA9IHIwLmw7Ci0Jc3N5bmM7Ci0KLQlQMi5IID0gaGkoRUJJVV9TREdDVEwpOwotCVAyLkwgPSBsbyhFQklVX1NER0NUTCk7Ci0JUjAgPSBbUDJdOwotCUJJVFNFVCAoUjAsIDI0KTsKLQlbUDJdID0gUjA7Ci0JU1NZTkM7Ci0KLQlyMCA9IENPTkZJR19WQ09fTVVMVCAmIDYzOyAgICAgICAvKiBMb2FkIHRoZSBWQ08gbXVsdGlwbGllciAgICAgICAgICovCi0JcjAgPSByMCA8PCA5OyAgICAgICAgICAgICAgICAgICAgLyogU2hpZnQgaXQgb3ZlciwgICAgICAgICAgICAgICAgICAqLwotCXIxID0gQ0xLSU5fSEFMRjsgICAgICAgICAgICAgICAgIC8qIERvIHdlIG5lZWQgdG8gZGl2aWRlIENMS0lOIGJ5IDI/Ki8KLQlyMCA9IHIxIHwgcjA7Ci0JcjEgPSBQTExfQllQQVNTOyAgICAgICAgICAgICAgICAgLyogQnlwYXNzIHRoZSBQTEw/ICAgICAgICAgICAgICAgICAqLwotCXIxID0gcjEgPDwgODsgICAgICAgICAgICAgICAgICAgIC8qIFNoaWZ0IGl0IG92ZXIgICAgICAgICAgICAgICAgICAgKi8KLQlyMCA9IHIxIHwgcjA7ICAgICAgICAgICAgICAgICAgICAvKiBhZGQgdGhlbSBhbGwgdG9nZXRoZXIgICAgICAgICAgICovCi0jaWZkZWYgQU5PTUFMWV8wNTAwMDI2NQotCUJJVFNFVChyMCwgMTUpOyAgICAgICAgICAgICAgICAgIC8qIEFkZCAyNTAgbVYgb2YgaHlzdGVyZXNpcyB0byBTUE9SVCBpbnB1dCBwaW5zICovCi0jZW5kaWYKLQotCXAwLmggPSBoaShQTExfQ1RMKTsKLQlwMC5sID0gbG8oUExMX0NUTCk7ICAgICAgICAgICAgICAvKiBMb2FkIHRoZSBhZGRyZXNzICAgICAgICAgICAgICAgICovCi0JY2xpIHIyOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGlzYWJsZSBpbnRlcnJ1cHRzICAgICAgICAgICAgICAqLwotCXNzeW5jOwotCXdbcDBdID0gcjAubDsgICAgICAgICAgICAgICAgICAgIC8qIFNldCB0aGUgdmFsdWUgICAgICAgICAgICAgICAgICAgKi8KLQlpZGxlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBXYWl0IGZvciB0aGUgUExMIHRvIHN0YWJsaXplICAgICovCi0Jc3RpIHIyOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRW5hYmxlIGludGVycnVwdHMgICAgICAgICAgICAgICAqLwotCi0uTGNoZWNrX2FnYWluOgotCXAwLmggPSBoaShQTExfU1RBVCk7Ci0JcDAubCA9IGxvKFBMTF9TVEFUKTsKLQlSMCA9IFdbUDBdKFopOwotCUNDID0gQklUVFNUKFIwLDUpOwotCWlmICEgQ0MganVtcCAuTGNoZWNrX2FnYWluOwotCi0JLyogQ29uZmlndXJlIFNDTEsgJiBDQ0xLIERpdmlkZXJzICovCi0JcjAgPSAoQ09ORklHX0NDTEtfQUNUX0RJViB8IENPTkZJR19TQ0xLX0RJVik7Ci0JcDAuaCA9IGhpKFBMTF9ESVYpOwotCXAwLmwgPSBsbyhQTExfRElWKTsKLQl3W3AwXSA9IHIwLmw7Ci0Jc3N5bmM7Ci0KLQlwMC5sID0gbG8oRUJJVV9TRFJSQyk7Ci0JcDAuaCA9IGhpKEVCSVVfU0RSUkMpOwotCXIwID0gbWVtX1NEUlJDOwotCXdbcDBdID0gcjAubDsKLQlzc3luYzsKLQotCVAyLkggPSBoaShFQklVX1NER0NUTCk7Ci0JUDIuTCA9IGxvKEVCSVVfU0RHQ1RMKTsKLQlSMCA9IFtQMl07Ci0JQklUQ0xSIChSMCwgMjQpOwotCXAwLmggPSBoaShFQklVX1NEU1RBVCk7Ci0JcDAubCA9IGxvKEVCSVVfU0RTVEFUKTsKLQlyMi5sID0gd1twMF07Ci0JY2MgPSBiaXR0c3QocjIsMyk7Ci0JaWYgIWNjIGp1bXAgLkxza2lwOwotCU5PUDsKLQlCSVRTRVQgKFIwLCAyMyk7Ci0uTHNraXA6Ci0JW1AyXSA9IFIwOwotCVNTWU5DOwotCi0JUjAuTCA9IGxvKG1lbV9TREdDVEwpOwotCVIwLkggPSBoaShtZW1fU0RHQ1RMKTsKLQlSMSA9IFtwMl07Ci0JUjEgPSBSMSB8IFIwOwotCVtQMl0gPSBSMTsKLQlTU1lOQzsKLQotCVJUUzsKLUVORFBST0MoX3N0YXJ0X2RtYV9jb2RlKQotI2VuZGlmIC8qIENPTkZJR19CRklOX0tFUk5FTF9DTE9DSyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2luY2x1ZGUvbWFjaC9hbm9tYWx5LmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvaW5jbHVkZS9tYWNoL2Fub21hbHkuaAppbmRleCA2MjM3M2U2Li4wMzVlOGQ4IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvaW5jbHVkZS9tYWNoL2Fub21hbHkuaAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvaW5jbHVkZS9tYWNoL2Fub21hbHkuaApAQCAtMjgsNyArMjgsNyBAQAogLyogTXVsdGktSXNzdWUgSW5zdHJ1Y3Rpb24gd2l0aCBkc3AzMnNoaWZ0aW1tIGluIHNsb3QxIGFuZCBQLXJlZyBTdG9yZSBpbiBzbG90MiBOb3QgU3VwcG9ydGVkICovCiAjZGVmaW5lIEFOT01BTFlfMDUwMDAwNzQgKDEpCiAvKiBETUFfUlVOIEJpdCBJcyBOb3QgVmFsaWQgYWZ0ZXIgYSBQZXJpcGhlcmFsIFJlY2VpdmUgQ2hhbm5lbCBETUEgU3RvcHMgKi8KLSNkZWZpbmUgQU5PTUFMWV8wNTAwMDExOSAoMSkKKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDExOSAoMSkJLyogbm90ZTogYnJva2VubmVzcyBpcyBub3RlZCBpbiBkb2N1bWVudGF0aW9uLCBub3QgYW5vbWFseSBzaGVldCAqLwogLyogUnguSCBDYW5ub3QgQmUgVXNlZCB0byBBY2Nlc3MgMTYtYml0IFN5c3RlbSBNTVIgUmVnaXN0ZXJzICovCiAjZGVmaW5lIEFOT01BTFlfMDUwMDAxMjIgKDEpCiAvKiBTcHVyaW91cyBIYXJkd2FyZSBFcnJvciBmcm9tIGFuIEFjY2VzcyBpbiB0aGUgU2hhZG93IG9mIGEgQ29uZGl0aW9uYWwgQnJhbmNoICovCkBAIC0zNyw4ICszNyw2IEBACiAjZGVmaW5lIEFOT01BTFlfMDUwMDAyNjUgKDEpCiAvKiBGYWxzZSBIYXJkd2FyZSBFcnJvcnMgQ2F1c2VkIGJ5IEZldGNoZXMgYXQgdGhlIEJvdW5kYXJ5IG9mIFJlc2VydmVkIE1lbW9yeSAqLwogI2RlZmluZSBBTk9NQUxZXzA1MDAwMzEwICgxKQotLyogRXJyb3JzIHdoZW4gU1NZTkMsIENTWU5DLCBvciBMb2FkcyB0byBMVCwgTEIgYW5kIExDIFJlZ2lzdGVycyBBcmUgSW50ZXJydXB0ZWQgKi8KLSNkZWZpbmUgQU5PTUFMWV8wNTAwMDMxMiAoQU5PTUFMWV9CRjUyNykKIC8qIFBQSSBJcyBMZXZlbC1TZW5zaXRpdmUgb24gRmlyc3QgVHJhbnNmZXIgSW4gU2luZ2xlIEZyYW1lIFN5bmMgTW9kZXMgKi8KICNkZWZpbmUgQU5PTUFMWV8wNTAwMDMxMyAoX19TSUxJQ09OX1JFVklTSU9OX18gPCAyKQogLyogSW5jb3JyZWN0IEFjY2VzcyBvZiBPVFBfU1RBVFVTIER1cmluZyBvdHBfd3JpdGUoKSBGdW5jdGlvbiAqLwpAQCAtMTUzLDYgKzE1MSwxMCBAQAogI2RlZmluZSBBTk9NQUxZXzA1MDAwNDMwIChBTk9NQUxZX0JGNTI3ICYmIF9fU0lMSUNPTl9SRVZJU0lPTl9fID4gMSkKIC8qIGJmcm9tX1N5c0NvbnRyb2woKSBEb2VzIE5vdCBDbGVhciBTSUNfSVdSMSBCZWZvcmUgRXhlY3V0aW5nIFBMTCBQcm9ncmFtbWluZyBTZXF1ZW5jZSAqLwogI2RlZmluZSBBTk9NQUxZXzA1MDAwNDMyIChBTk9NQUxZX0JGNTI2KQorLyogQ2VydGFpbiBTSUMgUmVnaXN0ZXJzIGFyZSBub3QgUmVzZXQgQWZ0ZXIgU29mdCBvciBDb3JlIERvdWJsZSBGYXVsdCBSZXNldCAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwNDM1ICgoQU5PTUFMWV9CRjUyNiAmJiBfX1NJTElDT05fUkVWSVNJT05fXyA8IDEpIHx8IEFOT01BTFlfQkY1MjcpCisvKiBJRkxVU0ggSW5zdHJ1Y3Rpb24gYXQgRW5kIG9mIEhhcmR3YXJlIExvb3AgQ2F1c2VzIEluZmluaXRlIFN0YWxsICovCisjZGVmaW5lIEFOT01BTFlfMDUwMDA0NDMgKDEpCiAKIC8qIEFub21hbGllcyB0aGF0IGRvbid0IGV4aXN0IG9uIHRoaXMgcHJvYyAqLwogI2RlZmluZSBBTk9NQUxZXzA1MDAwMTI1ICgwKQpAQCAtMTY4LDcgKzE3MCw5IEBACiAjZGVmaW5lIEFOT01BTFlfMDUwMDAyODUgKDApCiAjZGVmaW5lIEFOT01BTFlfMDUwMDAzMDcgKDApCiAjZGVmaW5lIEFOT01BTFlfMDUwMDAzMTEgKDApCisjZGVmaW5lIEFOT01BTFlfMDUwMDAzMTIgKDApCiAjZGVmaW5lIEFOT01BTFlfMDUwMDAzMjMgKDApCiAjZGVmaW5lIEFOT01BTFlfMDUwMDAzNjMgKDApCisjZGVmaW5lIEFOT01BTFlfMDUwMDA0MTIgKDApCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2luY2x1ZGUvbWFjaC9iZjUyNy5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2luY2x1ZGUvbWFjaC9iZjUyNy5oCmluZGV4IDE0NGYwOGQuLjM4MzJhYWIgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9pbmNsdWRlL21hY2gvYmY1MjcuaAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvaW5jbHVkZS9tYWNoL2JmNTI3LmgKQEAgLTExMCw3ICsxMTAsNyBAQAogCiAjaWZkZWYgQ09ORklHX0JGNTI3CiAjZGVmaW5lIENQVSAiQkY1MjciCi0jZGVmaW5lIENQVUlEIDB4MjdlNAorI2RlZmluZSBDUFVJRCAweDI3ZTAKICNlbmRpZgogI2lmZGVmIENPTkZJR19CRjUyNgogI2RlZmluZSBDUFUgIkJGNTI2IgpAQCAtMTE4LDcgKzExOCw3IEBACiAjZW5kaWYKICNpZmRlZiBDT05GSUdfQkY1MjUKICNkZWZpbmUgQ1BVICJCRjUyNSIKLSNkZWZpbmUgQ1BVSUQgMHgyN2U0CisjZGVmaW5lIENQVUlEIDB4MjdlMAogI2VuZGlmCiAjaWZkZWYgQ09ORklHX0JGNTI0CiAjZGVmaW5lIENQVSAiQkY1MjQiCkBAIC0xMjYsNyArMTI2LDcgQEAKICNlbmRpZgogI2lmZGVmIENPTkZJR19CRjUyMwogI2RlZmluZSBDUFUgIkJGNTIzIgotI2RlZmluZSBDUFVJRCAweDI3ZTQKKyNkZWZpbmUgQ1BVSUQgMHgyN2UwCiAjZW5kaWYKICNpZmRlZiBDT05GSUdfQkY1MjIKICNkZWZpbmUgQ1BVICJCRjUyMiIKQEAgLTEzNCw3ICsxMzQsNyBAQAogI2VuZGlmCiAKICNpZm5kZWYgQ1BVCi0jZXJyb3IgVW5rbm93biBDUFUgdHlwZSAtIFRoaXMga2VybmVsIGRvZXNuJ3Qgc2VlbSB0byBiZSBjb25maWd1cmVkIHByb3Blcmx5CisjZXJyb3IgIlVua25vd24gQ1BVIHR5cGUgLSBUaGlzIGtlcm5lbCBkb2Vzbid0IHNlZW0gdG8gYmUgY29uZmlndXJlZCBwcm9wZXJseSIKICNlbmRpZgogCiAjZW5kaWYJCQkJLyogX19NQUNIX0JGNTI3X0hfXyAgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9pbmNsdWRlL21hY2gvYmZpbl9zaXIuaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9pbmNsdWRlL21hY2gvYmZpbl9zaXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2ZkOGFkNC4uMDAwMDAwMAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvaW5jbHVkZS9tYWNoL2JmaW5fc2lyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNDIgKzAsMCBAQAotLyoKLSAqIEJsYWNrZmluIEluZnJhLXJlZCBEcml2ZXIKLSAqCi0gKiBDb3B5cmlnaHQgMjAwNi0yMDA4IEFuYWxvZyBEZXZpY2VzIEluYy4KLSAqCi0gKiBFbnRlciBidWdzIGF0IGh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZy8KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCi0gKgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9zZXJpYWwuaD4KLSNpbmNsdWRlIDxhc20vZG1hLmg+Ci0jaW5jbHVkZSA8YXNtL3BvcnRtdXguaD4KLQotI2RlZmluZSBTSVJfVUFSVF9HRVRfQ0hBUihwb3J0KSAgIGJmaW5fcmVhZDE2KChwb3J0KS0+bWVtYmFzZSArIE9GRlNFVF9SQlIpCi0jZGVmaW5lIFNJUl9VQVJUX0dFVF9ETEwocG9ydCkgICAgYmZpbl9yZWFkMTYoKHBvcnQpLT5tZW1iYXNlICsgT0ZGU0VUX0RMTCkKLSNkZWZpbmUgU0lSX1VBUlRfR0VUX0lFUihwb3J0KSAgICBiZmluX3JlYWQxNigocG9ydCktPm1lbWJhc2UgKyBPRkZTRVRfSUVSKQotI2RlZmluZSBTSVJfVUFSVF9HRVRfRExIKHBvcnQpICAgIGJmaW5fcmVhZDE2KChwb3J0KS0+bWVtYmFzZSArIE9GRlNFVF9ETEgpCi0jZGVmaW5lIFNJUl9VQVJUX0dFVF9JSVIocG9ydCkgICAgYmZpbl9yZWFkMTYoKHBvcnQpLT5tZW1iYXNlICsgT0ZGU0VUX0lJUikKLSNkZWZpbmUgU0lSX1VBUlRfR0VUX0xDUihwb3J0KSAgICBiZmluX3JlYWQxNigocG9ydCktPm1lbWJhc2UgKyBPRkZTRVRfTENSKQotI2RlZmluZSBTSVJfVUFSVF9HRVRfR0NUTChwb3J0KSAgIGJmaW5fcmVhZDE2KChwb3J0KS0+bWVtYmFzZSArIE9GRlNFVF9HQ1RMKQotCi0jZGVmaW5lIFNJUl9VQVJUX1BVVF9DSEFSKHBvcnQsIHYpIGJmaW5fd3JpdGUxNigoKHBvcnQpLT5tZW1iYXNlICsgT0ZGU0VUX1RIUiksIHYpCi0jZGVmaW5lIFNJUl9VQVJUX1BVVF9ETEwocG9ydCwgdikgIGJmaW5fd3JpdGUxNigoKHBvcnQpLT5tZW1iYXNlICsgT0ZGU0VUX0RMTCksIHYpCi0jZGVmaW5lIFNJUl9VQVJUX1BVVF9JRVIocG9ydCwgdikgIGJmaW5fd3JpdGUxNigoKHBvcnQpLT5tZW1iYXNlICsgT0ZGU0VUX0lFUiksIHYpCi0jZGVmaW5lIFNJUl9VQVJUX1BVVF9ETEgocG9ydCwgdikgIGJmaW5fd3JpdGUxNigoKHBvcnQpLT5tZW1iYXNlICsgT0ZGU0VUX0RMSCksIHYpCi0jZGVmaW5lIFNJUl9VQVJUX1BVVF9MQ1IocG9ydCwgdikgIGJmaW5fd3JpdGUxNigoKHBvcnQpLT5tZW1iYXNlICsgT0ZGU0VUX0xDUiksIHYpCi0jZGVmaW5lIFNJUl9VQVJUX1BVVF9HQ1RMKHBvcnQsIHYpIGJmaW5fd3JpdGUxNigoKHBvcnQpLT5tZW1iYXNlICsgT0ZGU0VUX0dDVEwpLCB2KQotCi0jaWZkZWYgQ09ORklHX1NJUl9CRklOX0RNQQotc3RydWN0IGRtYV9yeF9idWYgewotCWNoYXIgKmJ1ZjsKLQlpbnQgaGVhZDsKLQlpbnQgdGFpbDsKLQl9OwotI2VuZGlmIC8qIENPTkZJR19TSVJfQkZJTl9ETUEgKi8KLQotc3RydWN0IGJmaW5fc2lyX3BvcnQgewotCXVuc2lnbmVkIGNoYXIgX19pb21lbSAgICptZW1iYXNlOwotCXVuc2lnbmVkIGludCAgICAgICAgICAgIGlycTsKLQl1bnNpZ25lZCBpbnQgICAgICAgICAgICBsc3I7Ci0JdW5zaWduZWQgbG9uZyAgICAgICAgICAgY2xrOwotCXN0cnVjdCBuZXRfZGV2aWNlICAgICAgICpkZXY7Ci0jaWZkZWYgQ09ORklHX1NJUl9CRklOX0RNQQotCWludCAgICAgICAgICAgICAgICAgICAgIHR4X2RvbmU7Ci0Jc3RydWN0IGRtYV9yeF9idWYgICAgICAgcnhfZG1hX2J1ZjsKLQlzdHJ1Y3QgdGltZXJfbGlzdCAgICAgICByeF9kbWFfdGltZXI7Ci0JaW50ICAgICAgICAgICAgICAgICAgICAgcnhfZG1hX25yb3dzOwotI2VuZGlmIC8qIENPTkZJR19TSVJfQkZJTl9ETUEgKi8KLQl1bnNpZ25lZCBpbnQgICAgICAgICAgICB0eF9kbWFfY2hhbm5lbDsKLQl1bnNpZ25lZCBpbnQgICAgICAgICAgICByeF9kbWFfY2hhbm5lbDsKLX07Ci0KLXN0cnVjdCBiZmluX3Npcl9wb3J0IHNpcl9wb3J0c1tCRklOX1VBUlRfTlJfUE9SVFNdOwotCi1zdHJ1Y3QgYmZpbl9zaXJfcG9ydF9yZXMgewotCXVuc2lnbmVkIGxvbmcgICBiYXNlX2FkZHI7Ci0JaW50ICAgICAgICAgICAgIGlycTsKLQl1bnNpZ25lZCBpbnQgICAgcnhfZG1hX2NoYW5uZWw7Ci0JdW5zaWduZWQgaW50ICAgIHR4X2RtYV9jaGFubmVsOwotfTsKLQotc3RydWN0IGJmaW5fc2lyX3BvcnRfcmVzIGJmaW5fc2lyX3BvcnRfcmVzb3VyY2VbXSA9IHsKLSNpZmRlZiBDT05GSUdfQkZJTl9TSVIwCi0JewotCTB4RkZDMDA0MDAsCi0JSVJRX1VBUlQwX1JYLAotCUNIX1VBUlQwX1JYLAotCUNIX1VBUlQwX1RYLAotCX0sCi0jZW5kaWYKLSNpZmRlZiBDT05GSUdfQkZJTl9TSVIxCi0JewotCTB4RkZDMDIwMDAsCi0JSVJRX1VBUlQxX1JYLAotCUNIX1VBUlQxX1JYLAotCUNIX1VBUlQxX1RYLAotCX0sCi0jZW5kaWYKLX07Ci0KLWludCBucl9zaXJzID0gQVJSQVlfU0laRShiZmluX3Npcl9wb3J0X3Jlc291cmNlKTsKLQotc3RydWN0IGJmaW5fc2lyX3NlbGYgewotCXN0cnVjdCBiZmluX3Npcl9wb3J0ICAgICpzaXJfcG9ydDsKLQlzcGlubG9ja190ICAgICAgICAgICAgICBsb2NrOwotCXVuc2lnbmVkIGludCAgICAgICAgICAgIG9wZW47Ci0JaW50ICAgICAgICAgICAgICAgICAgICAgc3BlZWQ7Ci0JaW50ICAgICAgICAgICAgICAgICAgICAgbmV3c3BlZWQ7Ci0KLQlzdHJ1Y3Qgc2tfYnVmZiAgICAgICAgICAqdHhza2I7Ci0Jc3RydWN0IHNrX2J1ZmYgICAgICAgICAgKnJ4c2tiOwotCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOwotCXN0cnVjdCBkZXZpY2UgICAgICAgICAgICpkZXY7Ci0Jc3RydWN0IGlybGFwX2NiICAgICAgICAgKmlybGFwOwotCXN0cnVjdCBxb3NfaW5mbyAgICAgICAgIHFvczsKLQotCWlvYnVmZl90ICAgICAgICAgICAgICAgIHR4X2J1ZmY7Ci0JaW9idWZmX3QgICAgICAgICAgICAgICAgcnhfYnVmZjsKLQotCXN0cnVjdCB3b3JrX3N0cnVjdCAgICAgIHdvcms7Ci0JaW50ICAgICAgICAgICAgICAgICAgICAgbXR0OwotfTsKLQotc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgU0lSX1VBUlRfR0VUX0xTUihzdHJ1Y3QgYmZpbl9zaXJfcG9ydCAqcG9ydCkKLXsKLQl1bnNpZ25lZCBpbnQgbHNyID0gYmZpbl9yZWFkMTYocG9ydC0+bWVtYmFzZSArIE9GRlNFVF9MU1IpOwotCXBvcnQtPmxzciB8PSAobHNyICYgKEJJfEZFfFBFfE9FKSk7Ci0JcmV0dXJuIGxzciB8IHBvcnQtPmxzcjsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIFNJUl9VQVJUX0NMRUFSX0xTUihzdHJ1Y3QgYmZpbl9zaXJfcG9ydCAqcG9ydCkKLXsKLQlwb3J0LT5sc3IgPSAwOwotCWJmaW5fcmVhZDE2KHBvcnQtPm1lbWJhc2UgKyBPRkZTRVRfTFNSKTsKLX0KLQotI2RlZmluZSBEUklWRVJfTkFNRSAiYmZpbl9zaXIiCi0KLXN0YXRpYyBpbnQgYmZpbl9zaXJfaHdfaW5pdCh2b2lkKQotewotCWludCByZXQgPSAtRU5PREVWOwotI2lmZGVmIENPTkZJR19CRklOX1NJUjAKLQlyZXQgPSBwZXJpcGhlcmFsX3JlcXVlc3QoUF9VQVJUMF9UWCwgRFJJVkVSX05BTUUpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0JcmV0ID0gcGVyaXBoZXJhbF9yZXF1ZXN0KFBfVUFSVDBfUlgsIERSSVZFUl9OQU1FKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotI2VuZGlmCi0KLSNpZmRlZiBDT05GSUdfQkZJTl9TSVIxCi0JcmV0ID0gcGVyaXBoZXJhbF9yZXF1ZXN0KFBfVUFSVDFfVFgsIERSSVZFUl9OQU1FKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCXJldCA9IHBlcmlwaGVyYWxfcmVxdWVzdChQX1VBUlQxX1JYLCBEUklWRVJfTkFNRSk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLSNlbmRpZgotCXJldHVybiByZXQ7Ci19CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvaW5jbHVkZS9tYWNoL2NkZWZCRjUyeF9iYXNlLmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvaW5jbHVkZS9tYWNoL2NkZWZCRjUyeF9iYXNlLmgKaW5kZXggOWE4MTRiOS4uMWZlNzZkOCAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2luY2x1ZGUvbWFjaC9jZGVmQkY1MnhfYmFzZS5oCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9pbmNsdWRlL21hY2gvY2RlZkJGNTJ4X2Jhc2UuaApAQCAtMzEsNyArMzEsNiBAQAogI2lmbmRlZiBfQ0RFRl9CRjUyWF9ICiAjZGVmaW5lIF9DREVGX0JGNTJYX0gKIAotI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KICNpbmNsdWRlIDxhc20vYmxhY2tmaW4uaD4KIAogI2luY2x1ZGUgImRlZkJGNTJ4X2Jhc2UuaCIKQEAgLTQzLDU3ICs0Miw5IEBACiAKIC8qIENsb2NrIGFuZCBTeXN0ZW0gQ29udHJvbAkoMHhGRkMwMDAwMCAtIDB4RkZDMDAwRkYpCQkJCQkJCQkqLwogI2RlZmluZSBiZmluX3JlYWRfUExMX0NUTCgpCQkJYmZpbl9yZWFkMTYoUExMX0NUTCkKLS8qIFdyaXRpbmcgdG8gUExMX0NUTCBpbml0aWF0ZXMgYSBQTEwgcmVsb2NrIHNlcXVlbmNlLiAqLwotc3RhdGljIF9faW5saW5lX18gdm9pZCBiZmluX3dyaXRlX1BMTF9DVEwodW5zaWduZWQgaW50IHZhbCkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzLCBpd3IwLCBpd3IxOwotCi0JaWYgKHZhbCA9PSBiZmluX3JlYWRfUExMX0NUTCgpKQotCQlyZXR1cm47Ci0KLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0JLyogRW5hYmxlIHRoZSBQTEwgV2FrZXVwIGJpdCBpbiBTSUMgSVdSICovCi0JaXdyMCA9IGJmaW5fcmVhZDMyKFNJQ19JV1IwKTsKLQlpd3IxID0gYmZpbl9yZWFkMzIoU0lDX0lXUjEpOwotCS8qIE9ubHkgYWxsb3cgUFBMIFdha2V1cCkgKi8KLQliZmluX3dyaXRlMzIoU0lDX0lXUjAsIElXUl9FTkFCTEUoMCkpOwotCWJmaW5fd3JpdGUzMihTSUNfSVdSMSwgMCk7Ci0KLQliZmluX3dyaXRlMTYoUExMX0NUTCwgdmFsKTsKLQlTU1lOQygpOwotCWFzbSgiSURMRTsiKTsKLQotCWJmaW5fd3JpdGUzMihTSUNfSVdSMCwgaXdyMCk7Ci0JYmZpbl93cml0ZTMyKFNJQ19JV1IxLCBpd3IxKTsKLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci19CiAjZGVmaW5lIGJmaW5fcmVhZF9QTExfRElWKCkJCQliZmluX3JlYWQxNihQTExfRElWKQogI2RlZmluZSBiZmluX3dyaXRlX1BMTF9ESVYodmFsKQkJCWJmaW5fd3JpdGUxNihQTExfRElWLCB2YWwpCiAjZGVmaW5lIGJmaW5fcmVhZF9WUl9DVEwoKQkJCWJmaW5fcmVhZDE2KFZSX0NUTCkKLS8qIFdyaXRpbmcgdG8gVlJfQ1RMIGluaXRpYXRlcyBhIFBMTCByZWxvY2sgc2VxdWVuY2UuICovCi1zdGF0aWMgX19pbmxpbmVfXyB2b2lkIGJmaW5fd3JpdGVfVlJfQ1RMKHVuc2lnbmVkIGludCB2YWwpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFncywgaXdyMCwgaXdyMTsKLQotCWlmICh2YWwgPT0gYmZpbl9yZWFkX1ZSX0NUTCgpKQotCQlyZXR1cm47Ci0KLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0JLyogRW5hYmxlIHRoZSBQTEwgV2FrZXVwIGJpdCBpbiBTSUMgSVdSICovCi0JaXdyMCA9IGJmaW5fcmVhZDMyKFNJQ19JV1IwKTsKLQlpd3IxID0gYmZpbl9yZWFkMzIoU0lDX0lXUjEpOwotCS8qIE9ubHkgYWxsb3cgUFBMIFdha2V1cCkgKi8KLQliZmluX3dyaXRlMzIoU0lDX0lXUjAsIElXUl9FTkFCTEUoMCkpOwotCWJmaW5fd3JpdGUzMihTSUNfSVdSMSwgMCk7Ci0KLQliZmluX3dyaXRlMTYoVlJfQ1RMLCB2YWwpOwotCVNTWU5DKCk7Ci0JYXNtKCJJRExFOyIpOwotCi0JYmZpbl93cml0ZTMyKFNJQ19JV1IwLCBpd3IwKTsKLQliZmluX3dyaXRlMzIoU0lDX0lXUjEsIGl3cjEpOwotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLX0KICNkZWZpbmUgYmZpbl9yZWFkX1BMTF9TVEFUKCkJCQliZmluX3JlYWQxNihQTExfU1RBVCkKICNkZWZpbmUgYmZpbl93cml0ZV9QTExfU1RBVCh2YWwpCQliZmluX3dyaXRlMTYoUExMX1NUQVQsIHZhbCkKICNkZWZpbmUgYmZpbl9yZWFkX1BMTF9MT0NLQ05UKCkJCQliZmluX3JlYWQxNihQTExfTE9DS0NOVCkKQEAgLTEyMDEsNCArMTE1Miw1NyBAQAogI2RlZmluZSBiZmluX3JlYWRfTkZDX0RBVEFfUkQoKQkJCWJmaW5fcmVhZDE2KE5GQ19EQVRBX1JEKQogI2RlZmluZSBiZmluX3dyaXRlX05GQ19EQVRBX1JEKHZhbCkJCWJmaW5fd3JpdGUxNihORkNfREFUQV9SRCwgdmFsKQogCisvKiBUaGVzZSBuZWVkIHRvIGJlIGxhc3QgZHVlIHRvIHRoZSBjZGVmL2xpbnV4IGludGVyLWRlcGVuZGVuY2llcyAqLworI2luY2x1ZGUgPGFzbS9pcnEuaD4KKworLyogV3JpdGluZyB0byBQTExfQ1RMIGluaXRpYXRlcyBhIFBMTCByZWxvY2sgc2VxdWVuY2UuICovCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIGJmaW5fd3JpdGVfUExMX0NUTCh1bnNpZ25lZCBpbnQgdmFsKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIGl3cjAsIGl3cjE7CisKKwlpZiAodmFsID09IGJmaW5fcmVhZF9QTExfQ1RMKCkpCisJCXJldHVybjsKKworCWxvY2FsX2lycV9zYXZlX2h3KGZsYWdzKTsKKwkvKiBFbmFibGUgdGhlIFBMTCBXYWtldXAgYml0IGluIFNJQyBJV1IgKi8KKwlpd3IwID0gYmZpbl9yZWFkMzIoU0lDX0lXUjApOworCWl3cjEgPSBiZmluX3JlYWQzMihTSUNfSVdSMSk7CisJLyogT25seSBhbGxvdyBQUEwgV2FrZXVwKSAqLworCWJmaW5fd3JpdGUzMihTSUNfSVdSMCwgSVdSX0VOQUJMRSgwKSk7CisJYmZpbl93cml0ZTMyKFNJQ19JV1IxLCAwKTsKKworCWJmaW5fd3JpdGUxNihQTExfQ1RMLCB2YWwpOworCVNTWU5DKCk7CisJYXNtKCJJRExFOyIpOworCisJYmZpbl93cml0ZTMyKFNJQ19JV1IwLCBpd3IwKTsKKwliZmluX3dyaXRlMzIoU0lDX0lXUjEsIGl3cjEpOworCWxvY2FsX2lycV9yZXN0b3JlX2h3KGZsYWdzKTsKK30KKworLyogV3JpdGluZyB0byBWUl9DVEwgaW5pdGlhdGVzIGEgUExMIHJlbG9jayBzZXF1ZW5jZS4gKi8KK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgYmZpbl93cml0ZV9WUl9DVEwodW5zaWduZWQgaW50IHZhbCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzLCBpd3IwLCBpd3IxOworCisJaWYgKHZhbCA9PSBiZmluX3JlYWRfVlJfQ1RMKCkpCisJCXJldHVybjsKKworCWxvY2FsX2lycV9zYXZlX2h3KGZsYWdzKTsKKwkvKiBFbmFibGUgdGhlIFBMTCBXYWtldXAgYml0IGluIFNJQyBJV1IgKi8KKwlpd3IwID0gYmZpbl9yZWFkMzIoU0lDX0lXUjApOworCWl3cjEgPSBiZmluX3JlYWQzMihTSUNfSVdSMSk7CisJLyogT25seSBhbGxvdyBQUEwgV2FrZXVwKSAqLworCWJmaW5fd3JpdGUzMihTSUNfSVdSMCwgSVdSX0VOQUJMRSgwKSk7CisJYmZpbl93cml0ZTMyKFNJQ19JV1IxLCAwKTsKKworCWJmaW5fd3JpdGUxNihWUl9DVEwsIHZhbCk7CisJU1NZTkMoKTsKKwlhc20oIklETEU7Iik7CisKKwliZmluX3dyaXRlMzIoU0lDX0lXUjAsIGl3cjApOworCWJmaW5fd3JpdGUzMihTSUNfSVdSMSwgaXdyMSk7CisJbG9jYWxfaXJxX3Jlc3RvcmVfaHcoZmxhZ3MpOworfQorCiAjZW5kaWYgLyogX0NERUZfQkY1MlhfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2luY2x1ZGUvbWFjaC9kbWEuaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9pbmNsdWRlL21hY2gvZG1hLmgKaW5kZXggNDlkZDY5My4uZWIyODdkYSAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2luY2x1ZGUvbWFjaC9kbWEuaAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvaW5jbHVkZS9tYWNoL2RtYS5oCkBAIC0xLDM4ICsxLDE0IEBACi0vKgotICogZmlsZTogICAgICAgIGluY2x1ZGUvYXNtLWJsYWNrZmluL21hY2gtYmY1MjcvZG1hLmgKLSAqIGJhc2VkIG9uOglpbmNsdWRlL2FzbS1ibGFja2Zpbi9tYWNoLWJmNTM3L2RtYS5oCi0gKiBhdXRob3I6CU1pY2hhZWwgSGVubmVyaWNoIChtaWNoYWVsLmhlbm5lcmljaEBhbmFsb2cuY29tKQorLyogbWFjaC9kbWEuaCAtIGFyY2gtc3BlY2lmaWMgRE1BIGRlZmluZXMKICAqCi0gKiBjcmVhdGVkOgotICogZGVzY3JpcHRpb246Ci0gKglzeXN0ZW0gRE1BIG1hcAotICogcmV2OgorICogQ29weXJpZ2h0IDIwMDQtMjAwOCBBbmFsb2cgRGV2aWNlcyBJbmMuCiAgKgotICogbW9kaWZpZWQ6Ci0gKgotICoKLSAqIGJ1Z3M6ICAgICAgICAgZW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCi0gKgotICogdGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgZ251IGdlbmVyYWwgcHVibGljIGxpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgZnJlZSBzb2Z0d2FyZSBmb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gKiBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiB0aGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCB3aXRob3V0IGFueSB3YXJyYW50eTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBtZXJjaGFudGFiaWxpdHkgb3IgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuICBzZWUgdGhlCi0gKiBnbnUgZ2VuZXJhbCBwdWJsaWMgbGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIHlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIGdudSBnZW5lcmFsIHB1YmxpYyBsaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIGNvcHlpbmcuCi0gKiBpZiBub3QsIHdyaXRlIHRvIHRoZSBmcmVlIHNvZnR3YXJlIGZvdW5kYXRpb24sCi0gKiA1OSB0ZW1wbGUgcGxhY2UgLSBzdWl0ZSAzMzAsIGJvc3RvbiwgbWEgMDIxMTEtMTMwNywgdXNhLgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgogICovCiAKICNpZm5kZWYgX01BQ0hfRE1BX0hfCiAjZGVmaW5lIF9NQUNIX0RNQV9IXwogCi0jZGVmaW5lIE1BWF9CTEFDS0ZJTl9ETUFfQ0hBTk5FTCAxNgorI2RlZmluZSBNQVhfRE1BX0NIQU5ORUxTIDE2CiAKICNkZWZpbmUgQ0hfUFBJIAkJCTAJLyogUFBJIHJlY2VpdmUvdHJhbnNtaXQgb3IgTkZDICovCiAjZGVmaW5lIENIX0VNQUNfUlggCQkxCS8qIEV0aGVybmV0IE1BQyByZWNlaXZlIG9yIEhPU1REUCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2luY2x1ZGUvbWFjaC9ncGlvLmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvaW5jbHVkZS9tYWNoL2dwaW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNmI2ZWViCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2luY2x1ZGUvbWFjaC9ncGlvLmgKQEAgLTAsMCArMSw2OCBAQAorLyoKKyAqIEZpbGU6IGFyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9pbmNsdWRlL21hY2gvZ3Bpby5oCisgKiBCdWdzOiBFbnRlciBidWdzIGF0IGh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZy8KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggQW5hbG9nIERldmljZXMgSW5jLgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgorICovCisKKworI2lmbmRlZiBfTUFDSF9HUElPX0hfCisjZGVmaW5lIF9NQUNIX0dQSU9fSF8KKworI2RlZmluZSBNQVhfQkxBQ0tGSU5fR1BJT1MgNDgKKworI2RlZmluZQlHUElPX1BGMAkwCisjZGVmaW5lCUdQSU9fUEYxCTEKKyNkZWZpbmUJR1BJT19QRjIJMgorI2RlZmluZQlHUElPX1BGMwkzCisjZGVmaW5lCUdQSU9fUEY0CTQKKyNkZWZpbmUJR1BJT19QRjUJNQorI2RlZmluZQlHUElPX1BGNgk2CisjZGVmaW5lCUdQSU9fUEY3CTcKKyNkZWZpbmUJR1BJT19QRjgJOAorI2RlZmluZQlHUElPX1BGOQk5CisjZGVmaW5lCUdQSU9fUEYxMAkxMAorI2RlZmluZQlHUElPX1BGMTEJMTEKKyNkZWZpbmUJR1BJT19QRjEyCTEyCisjZGVmaW5lCUdQSU9fUEYxMwkxMworI2RlZmluZQlHUElPX1BGMTQJMTQKKyNkZWZpbmUJR1BJT19QRjE1CTE1CisjZGVmaW5lCUdQSU9fUEcwCTE2CisjZGVmaW5lCUdQSU9fUEcxCTE3CisjZGVmaW5lCUdQSU9fUEcyCTE4CisjZGVmaW5lCUdQSU9fUEczCTE5CisjZGVmaW5lCUdQSU9fUEc0CTIwCisjZGVmaW5lCUdQSU9fUEc1CTIxCisjZGVmaW5lCUdQSU9fUEc2CTIyCisjZGVmaW5lCUdQSU9fUEc3CTIzCisjZGVmaW5lCUdQSU9fUEc4CTI0CisjZGVmaW5lCUdQSU9fUEc5CTI1CisjZGVmaW5lCUdQSU9fUEcxMCAgICAgIAkyNgorI2RlZmluZQlHUElPX1BHMTEgICAgICAJMjcKKyNkZWZpbmUJR1BJT19QRzEyICAgICAgCTI4CisjZGVmaW5lCUdQSU9fUEcxMyAgICAgIAkyOQorI2RlZmluZQlHUElPX1BHMTQgICAgICAJMzAKKyNkZWZpbmUJR1BJT19QRzE1ICAgICAgCTMxCisjZGVmaW5lCUdQSU9fUEgwCTMyCisjZGVmaW5lCUdQSU9fUEgxCTMzCisjZGVmaW5lCUdQSU9fUEgyCTM0CisjZGVmaW5lCUdQSU9fUEgzCTM1CisjZGVmaW5lCUdQSU9fUEg0CTM2CisjZGVmaW5lCUdQSU9fUEg1CTM3CisjZGVmaW5lCUdQSU9fUEg2CTM4CisjZGVmaW5lCUdQSU9fUEg3CTM5CisjZGVmaW5lCUdQSU9fUEg4CTQwCisjZGVmaW5lCUdQSU9fUEg5CTQxCisjZGVmaW5lCUdQSU9fUEgxMCAgICAgIAk0MgorI2RlZmluZQlHUElPX1BIMTEgICAgICAJNDMKKyNkZWZpbmUJR1BJT19QSDEyICAgICAgCTQ0CisjZGVmaW5lCUdQSU9fUEgxMyAgICAgIAk0NQorI2RlZmluZQlHUElPX1BIMTQgICAgICAJNDYKKyNkZWZpbmUJR1BJT19QSDE1ICAgICAgCTQ3CisKKyNkZWZpbmUgUE9SVF9GIEdQSU9fUEYwCisjZGVmaW5lIFBPUlRfRyBHUElPX1BHMAorI2RlZmluZSBQT1JUX0ggR1BJT19QSDAKKworI2VuZGlmIC8qIF9NQUNIX0dQSU9fSF8gKi8KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9pbmNsdWRlL21hY2gvaXJxLmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvaW5jbHVkZS9tYWNoL2lycS5oCmluZGV4IDRlMmIzZjIuLjhlYTY2MGQgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9pbmNsdWRlL21hY2gvaXJxLmgKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2luY2x1ZGUvbWFjaC9pcnEuaApAQCAtOTYsMTQgKzk2LDE0IEBACiAjZGVmaW5lIElSUV9NQUNfVFgJCUJGSU5fSVJRKDMwKQkvKiBETUEyIENoYW5uZWwgKE1BQyBUWC9OQU5EKSAqLwogI2RlZmluZSBJUlFfTkZDCQkJQkZJTl9JUlEoMzApCS8qIERNQTIgQ2hhbm5lbCAoTUFDIFRYL05BTkQpICovCiAjZGVmaW5lIElSUV9QT1JUSF9JTlRCCQlCRklOX0lSUSgzMSkJLyogUG9ydCBIIEludGVycnVwdCBCICovCi0jZGVmaW5lIElSUV9UTVIwCQlCRklOX0lSUSgzMikJLyogVGltZXIgMCAqLwotI2RlZmluZSBJUlFfVE1SMQkJQkZJTl9JUlEoMzMpCS8qIFRpbWVyIDEgKi8KLSNkZWZpbmUgSVJRX1RNUjIJCUJGSU5fSVJRKDM0KQkvKiBUaW1lciAyICovCi0jZGVmaW5lIElSUV9UTVIzCQlCRklOX0lSUSgzNSkJLyogVGltZXIgMyAqLwotI2RlZmluZSBJUlFfVE1SNAkJQkZJTl9JUlEoMzYpCS8qIFRpbWVyIDQgKi8KLSNkZWZpbmUgSVJRX1RNUjUJCUJGSU5fSVJRKDM3KQkvKiBUaW1lciA1ICovCi0jZGVmaW5lIElSUV9UTVI2CQlCRklOX0lSUSgzOCkJLyogVGltZXIgNiAqLwotI2RlZmluZSBJUlFfVE1SNwkJQkZJTl9JUlEoMzkpCS8qIFRpbWVyIDcgKi8KKyNkZWZpbmUgSVJRX1RJTUVSMAkJQkZJTl9JUlEoMzIpCS8qIFRpbWVyIDAgKi8KKyNkZWZpbmUgSVJRX1RJTUVSMQkJQkZJTl9JUlEoMzMpCS8qIFRpbWVyIDEgKi8KKyNkZWZpbmUgSVJRX1RJTUVSMgkJQkZJTl9JUlEoMzQpCS8qIFRpbWVyIDIgKi8KKyNkZWZpbmUgSVJRX1RJTUVSMwkJQkZJTl9JUlEoMzUpCS8qIFRpbWVyIDMgKi8KKyNkZWZpbmUgSVJRX1RJTUVSNAkJQkZJTl9JUlEoMzYpCS8qIFRpbWVyIDQgKi8KKyNkZWZpbmUgSVJRX1RJTUVSNQkJQkZJTl9JUlEoMzcpCS8qIFRpbWVyIDUgKi8KKyNkZWZpbmUgSVJRX1RJTUVSNgkJQkZJTl9JUlEoMzgpCS8qIFRpbWVyIDYgKi8KKyNkZWZpbmUgSVJRX1RJTUVSNwkJQkZJTl9JUlEoMzkpCS8qIFRpbWVyIDcgKi8KICNkZWZpbmUgSVJRX1BPUlRHX0lOVEEJCUJGSU5fSVJRKDQwKQkvKiBQb3J0IEcgSW50ZXJydXB0IEEgKi8KICNkZWZpbmUgSVJRX1BPUlRHX0lOVEIJCUJGSU5fSVJRKDQxKQkvKiBQb3J0IEcgSW50ZXJydXB0IEIgKi8KICNkZWZpbmUgSVJRX01FTV9ETUEwCQlCRklOX0lSUSg0MikJLyogTURNQSBTdHJlYW0gMCAqLwpAQCAtMjI3LDE0ICsyMjcsMTQgQEAKICNkZWZpbmUgSVJRX1BPUlRIX0lOVEJfUE9TCTI4CiAKIC8qIElBUjQgQklUIEZJRUxEUyAqLwotI2RlZmluZSBJUlFfVE1SMF9QT1MJCTAKLSNkZWZpbmUgSVJRX1RNUjFfUE9TCQk0Ci0jZGVmaW5lIElSUV9UTVIyX1BPUwkJOAotI2RlZmluZSBJUlFfVE1SM19QT1MJCTEyCi0jZGVmaW5lIElSUV9UTVI0X1BPUwkJMTYKLSNkZWZpbmUgSVJRX1RNUjVfUE9TCQkyMAotI2RlZmluZSBJUlFfVE1SNl9QT1MJCTI0Ci0jZGVmaW5lIElSUV9UTVI3X1BPUwkJMjgKKyNkZWZpbmUgSVJRX1RJTUVSMF9QT1MJCTAKKyNkZWZpbmUgSVJRX1RJTUVSMV9QT1MJCTQKKyNkZWZpbmUgSVJRX1RJTUVSMl9QT1MJCTgKKyNkZWZpbmUgSVJRX1RJTUVSM19QT1MJCTEyCisjZGVmaW5lIElSUV9USU1FUjRfUE9TCQkxNgorI2RlZmluZSBJUlFfVElNRVI1X1BPUwkJMjAKKyNkZWZpbmUgSVJRX1RJTUVSNl9QT1MJCTI0CisjZGVmaW5lIElSUV9USU1FUjdfUE9TCQkyOAogCiAvKiBJQVI1IEJJVCBGSUVMRFMgKi8KICNkZWZpbmUgSVJRX1BPUlRHX0lOVEFfUE9TCTAKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9pbmNsdWRlL21hY2gvbWVtX2luaXQuaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9pbmNsdWRlL21hY2gvbWVtX2luaXQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2JlMDNmNC4uMDAwMDAwMAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvaW5jbHVkZS9tYWNoL21lbV9pbml0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMTAgKzAsMCBAQAotLyoKLSAqIEZpbGU6ICAgICAgICAgaW5jbHVkZS9hc20tYmxhY2tmaW4vbWFjaC1iZjUyNy9tZW1faW5pdC5oCi0gKiBCYXNlZCBvbjoKLSAqIEF1dGhvcjoKLSAqCi0gKiBDcmVhdGVkOgotICogRGVzY3JpcHRpb246Ci0gKgotICogUmV2OgotICoKLSAqIE1vZGlmaWVkOgotICogICAgICAgICAgICAgICBDb3B5cmlnaHQgMjAwNC0yMDA3IEFuYWxvZyBEZXZpY2VzIEluYy4KLSAqCi0gKiBCdWdzOiAgICAgICAgIEVudGVyIGJ1Z3MgYXQgaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnLwotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICogYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLgotICogSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLSAqLwotCi0jaWYgKENPTkZJR19NRU1fTVQ0OExDMTZNMTZBMlRHXzc1IHx8IENPTkZJR19NRU1fTVQ0OExDNjRNNEEyRkJfN0UgfHwgQ09ORklHX01FTV9NVDQ4TEMxNk04QTJUR183NSB8fCBDT05GSUdfTUVNX0dFTkVSSUNfQk9BUkQgfHwgQ09ORklHX01FTV9NVDQ4TEMzMk04QTJfNzUgfHwgQ09ORklHX01FTV9NVDQ4TEMzMk0xNkEyVEdfNzUpCi0jaWYgKENPTkZJR19TQ0xLX0haID4gMTE5NDAyOTg1KQotI2RlZmluZSBTRFJBTV90UlAgICAgICAgVFJQXzIKLSNkZWZpbmUgU0RSQU1fdFJQX251bSAgIDIKLSNkZWZpbmUgU0RSQU1fdFJBUyAgICAgIFRSQVNfNwotI2RlZmluZSBTRFJBTV90UkFTX251bSAgNwotI2RlZmluZSBTRFJBTV90UkNEICAgICAgVFJDRF8yCi0jZGVmaW5lIFNEUkFNX3RXUiAgICAgICBUV1JfMgotI2VuZGlmCi0jaWYgKENPTkZJR19TQ0xLX0haID4gMTA0NDc3NjEyKSAmJiAoQ09ORklHX1NDTEtfSFogPD0gMTE5NDAyOTg1KQotI2RlZmluZSBTRFJBTV90UlAgICAgICAgVFJQXzIKLSNkZWZpbmUgU0RSQU1fdFJQX251bSAgIDIKLSNkZWZpbmUgU0RSQU1fdFJBUyAgICAgIFRSQVNfNgotI2RlZmluZSBTRFJBTV90UkFTX251bSAgNgotI2RlZmluZSBTRFJBTV90UkNEICAgICAgVFJDRF8yCi0jZGVmaW5lIFNEUkFNX3RXUiAgICAgICBUV1JfMgotI2VuZGlmCi0jaWYgKENPTkZJR19TQ0xLX0haID4gODk1NTIyMzkpICYmIChDT05GSUdfU0NMS19IWiA8PSAxMDQ0Nzc2MTIpCi0jZGVmaW5lIFNEUkFNX3RSUCAgICAgICBUUlBfMgotI2RlZmluZSBTRFJBTV90UlBfbnVtICAgMgotI2RlZmluZSBTRFJBTV90UkFTICAgICAgVFJBU181Ci0jZGVmaW5lIFNEUkFNX3RSQVNfbnVtICA1Ci0jZGVmaW5lIFNEUkFNX3RSQ0QgICAgICBUUkNEXzIKLSNkZWZpbmUgU0RSQU1fdFdSICAgICAgIFRXUl8yCi0jZW5kaWYKLSNpZiAoQ09ORklHX1NDTEtfSFogPiA3NDYyNjg2NikgJiYgKENPTkZJR19TQ0xLX0haIDw9IDg5NTUyMjM5KQotI2RlZmluZSBTRFJBTV90UlAgICAgICAgVFJQXzIKLSNkZWZpbmUgU0RSQU1fdFJQX251bSAgIDIKLSNkZWZpbmUgU0RSQU1fdFJBUyAgICAgIFRSQVNfNAotI2RlZmluZSBTRFJBTV90UkFTX251bSAgNAotI2RlZmluZSBTRFJBTV90UkNEICAgICAgVFJDRF8yCi0jZGVmaW5lIFNEUkFNX3RXUiAgICAgICBUV1JfMgotI2VuZGlmCi0jaWYgKENPTkZJR19TQ0xLX0haID4gNjY2NjY2NjcpICYmIChDT05GSUdfU0NMS19IWiA8PSA3NDYyNjg2NikKLSNkZWZpbmUgU0RSQU1fdFJQICAgICAgIFRSUF8yCi0jZGVmaW5lIFNEUkFNX3RSUF9udW0gICAyCi0jZGVmaW5lIFNEUkFNX3RSQVMgICAgICBUUkFTXzMKLSNkZWZpbmUgU0RSQU1fdFJBU19udW0gIDMKLSNkZWZpbmUgU0RSQU1fdFJDRCAgICAgIFRSQ0RfMgotI2RlZmluZSBTRFJBTV90V1IgICAgICAgVFdSXzIKLSNlbmRpZgotI2lmIChDT05GSUdfU0NMS19IWiA+IDU5NzAxNDkzKSAmJiAoQ09ORklHX1NDTEtfSFogPD0gNjY2NjY2NjcpCi0jZGVmaW5lIFNEUkFNX3RSUCAgICAgICBUUlBfMQotI2RlZmluZSBTRFJBTV90UlBfbnVtICAgMQotI2RlZmluZSBTRFJBTV90UkFTICAgICAgVFJBU180Ci0jZGVmaW5lIFNEUkFNX3RSQVNfbnVtICAzCi0jZGVmaW5lIFNEUkFNX3RSQ0QgICAgICBUUkNEXzEKLSNkZWZpbmUgU0RSQU1fdFdSICAgICAgIFRXUl8yCi0jZW5kaWYKLSNpZiAoQ09ORklHX1NDTEtfSFogPiA0NDc3NjExOSkgJiYgKENPTkZJR19TQ0xLX0haIDw9IDU5NzAxNDkzKQotI2RlZmluZSBTRFJBTV90UlAgICAgICAgVFJQXzEKLSNkZWZpbmUgU0RSQU1fdFJQX251bSAgIDEKLSNkZWZpbmUgU0RSQU1fdFJBUyAgICAgIFRSQVNfMwotI2RlZmluZSBTRFJBTV90UkFTX251bSAgMwotI2RlZmluZSBTRFJBTV90UkNEICAgICAgVFJDRF8xCi0jZGVmaW5lIFNEUkFNX3RXUiAgICAgICBUV1JfMgotI2VuZGlmCi0jaWYgKENPTkZJR19TQ0xLX0haID4gMjk4NTA3NDYpICYmIChDT05GSUdfU0NMS19IWiA8PSA0NDc3NjExOSkKLSNkZWZpbmUgU0RSQU1fdFJQICAgICAgIFRSUF8xCi0jZGVmaW5lIFNEUkFNX3RSUF9udW0gICAxCi0jZGVmaW5lIFNEUkFNX3RSQVMgICAgICBUUkFTXzIKLSNkZWZpbmUgU0RSQU1fdFJBU19udW0gIDIKLSNkZWZpbmUgU0RSQU1fdFJDRCAgICAgIFRSQ0RfMQotI2RlZmluZSBTRFJBTV90V1IgICAgICAgVFdSXzIKLSNlbmRpZgotI2lmIChDT05GSUdfU0NMS19IWiA8PSAyOTg1MDc0NikKLSNkZWZpbmUgU0RSQU1fdFJQICAgICAgIFRSUF8xCi0jZGVmaW5lIFNEUkFNX3RSUF9udW0gICAxCi0jZGVmaW5lIFNEUkFNX3RSQVMgICAgICBUUkFTXzEKLSNkZWZpbmUgU0RSQU1fdFJBU19udW0gIDEKLSNkZWZpbmUgU0RSQU1fdFJDRCAgICAgIFRSQ0RfMQotI2RlZmluZSBTRFJBTV90V1IgICAgICAgVFdSXzIKLSNlbmRpZgotI2VuZGlmCi0KLSNpZiAoQ09ORklHX01FTV9NVDQ4TEMxNk0xNkEyVEdfNzUpCi0gIC8qU0RSQU0gSU5GT1JNQVRJT046ICovCi0jZGVmaW5lIFNEUkFNX1RyZWYgIDY0CQkvKiBSZWZyZXNoIHBlcmlvZCBpbiBtaWxsaXNlY29uZHMgICAqLwotI2RlZmluZSBTRFJBTV9OUkEgICA4MTkyCS8qIE51bWJlciBvZiByb3cgYWRkcmVzc2VzIGluIFNEUkFNICovCi0jZGVmaW5lIFNEUkFNX0NMICAgIENMXzMKLSNlbmRpZgotCi0jaWYgKENPTkZJR19NRU1fTVQ0OExDMTZNOEEyVEdfNzUpCi0gIC8qU0RSQU0gSU5GT1JNQVRJT046ICovCi0jZGVmaW5lIFNEUkFNX1RyZWYgIDY0CQkvKiBSZWZyZXNoIHBlcmlvZCBpbiBtaWxsaXNlY29uZHMgICAqLwotI2RlZmluZSBTRFJBTV9OUkEgICA0MDk2CS8qIE51bWJlciBvZiByb3cgYWRkcmVzc2VzIGluIFNEUkFNICovCi0jZGVmaW5lIFNEUkFNX0NMICAgIENMXzMKLSNlbmRpZgotCi0jaWYgKENPTkZJR19NRU1fTVQ0OExDMzJNOEEyXzc1KQotICAvKlNEUkFNIElORk9STUFUSU9OOiAqLwotI2RlZmluZSBTRFJBTV9UcmVmICA2NAkJLyogUmVmcmVzaCBwZXJpb2QgaW4gbWlsbGlzZWNvbmRzICAgKi8KLSNkZWZpbmUgU0RSQU1fTlJBICAgODE5MgkvKiBOdW1iZXIgb2Ygcm93IGFkZHJlc3NlcyBpbiBTRFJBTSAqLwotI2RlZmluZSBTRFJBTV9DTCAgICBDTF8zCi0jZW5kaWYKLQotI2lmIChDT05GSUdfTUVNX01UNDhMQzY0TTRBMkZCXzdFKQotICAvKlNEUkFNIElORk9STUFUSU9OOiAqLwotI2RlZmluZSBTRFJBTV9UcmVmICA2NAkJLyogUmVmcmVzaCBwZXJpb2QgaW4gbWlsbGlzZWNvbmRzICAgKi8KLSNkZWZpbmUgU0RSQU1fTlJBICAgODE5MgkvKiBOdW1iZXIgb2Ygcm93IGFkZHJlc3NlcyBpbiBTRFJBTSAqLwotI2RlZmluZSBTRFJBTV9DTCAgICBDTF8zCi0jZW5kaWYKLQotI2lmIChDT05GSUdfTUVNX0dFTkVSSUNfQk9BUkQpCi0gIC8qU0RSQU0gSU5GT1JNQVRJT046IE1vZGlmeSB0aGlzIGZvciB5b3VyIGJvYXJkICovCi0jZGVmaW5lIFNEUkFNX1RyZWYgIDY0CQkvKiBSZWZyZXNoIHBlcmlvZCBpbiBtaWxsaXNlY29uZHMgICAqLwotI2RlZmluZSBTRFJBTV9OUkEgICA4MTkyCS8qIE51bWJlciBvZiByb3cgYWRkcmVzc2VzIGluIFNEUkFNICovCi0jZGVmaW5lIFNEUkFNX0NMICAgIENMXzMKLSNlbmRpZgotCi0jaWYgKENPTkZJR19NRU1fTVQ0OExDMzJNMTZBMlRHXzc1KQotICAvKlNEUkFNIElORk9STUFUSU9OOiAqLwotI2RlZmluZSBTRFJBTV9UcmVmICA2NAkJLyogUmVmcmVzaCBwZXJpb2QgaW4gbWlsbGlzZWNvbmRzICAgKi8KLSNkZWZpbmUgU0RSQU1fTlJBICAgODE5MgkvKiBOdW1iZXIgb2Ygcm93IGFkZHJlc3NlcyBpbiBTRFJBTSAqLwotI2RlZmluZSBTRFJBTV9DTCAgICBDTF8zCi0jZW5kaWYKLQotLyogRXF1YXRpb24gZnJvbSBzZWN0aW9uIDE3IChwMTctNDYpIG9mIEJGNTMzIEhSTSAqLwotI2RlZmluZSBtZW1fU0RSUkMgICAgICAgKCgoQ09ORklHX1NDTEtfSFogLyAxMDAwKSAqIFNEUkFNX1RyZWYpIC8gU0RSQU1fTlJBKSAtIChTRFJBTV90UkFTX251bSArIFNEUkFNX3RSUF9udW0pCi0KLS8qIEVuYWJsZSBTQ0xLIE91dCAqLwotI2RlZmluZSBtZW1fU0RHQ1RMICAgICAgICAoU0NUTEUgfCBTRFJBTV9DTCB8IFNEUkFNX3RSQVMgfCBTRFJBTV90UlAgfCBTRFJBTV90UkNEIHwgU0RSQU1fdFdSIHwgUFNTKQotCi0jaWYgZGVmaW5lZCBDT05GSUdfQ0xLSU5fSEFMRgotI2RlZmluZSBDTEtJTl9IQUxGICAgICAgIDEKLSNlbHNlCi0jZGVmaW5lIENMS0lOX0hBTEYgICAgICAgMAotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIENPTkZJR19QTExfQllQQVNTCi0jZGVmaW5lIFBMTF9CWVBBU1MgICAgICAxCi0jZWxzZQotI2RlZmluZSBQTExfQllQQVNTICAgICAgIDAKLSNlbmRpZgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqQ3VycmVudGx5IE5vdCBCZWluZyBVc2VkICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVExfV0FUICAoKENPTkZJR19GTEFTSF9TUEVFRF9CV0FUICogNCkgLyAoNDAwMDAwMDAwMCAvIENPTkZJR19TQ0xLX0haKSkgKyAxCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMX1JBVCAgKChDT05GSUdfRkxBU0hfU1BFRURfQlJBVCAqIDQpIC8gKDQwMDAwMDAwMDAgLyBDT05GSUdfU0NMS19IWikpICsgMQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTF9IVCAgICgoQ09ORklHX0ZMQVNIX1NQRUVEX0JIVCAgKiA0KSAvICg0MDAwMDAwMDAwIC8gQ09ORklHX1NDTEtfSFopKQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTF9TVCAgICgoQ09ORklHX0ZMQVNIX1NQRUVEX0JTVCAgKiA0KSAvICg0MDAwMDAwMDAwIC8gQ09ORklHX1NDTEtfSFopKSArIDEKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVExfVFQgICAoKENPTkZJR19GTEFTSF9TUEVFRF9CVFQgICogNCkgLyAoNDAwMDAwMDAwMCAvIENPTkZJR19TQ0xLX0haKSkgKyAxCi0KLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfVFQgPiAzKQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfVFQgICBCMFRUXzQKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9UVCA9PSAzKQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfVFQgICBCMFRUXzMKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9UVCA9PSAyKQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfVFQgICBCMFRUXzIKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9UVCA8IDIpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9UVCAgIEIwVFRfMQotI2VuZGlmCi0KLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfU1QgPiAzKQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfU1QgICBCMFNUXzQKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9TVCA9PSAzKQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfU1QgICBCMFNUXzMKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9TVCA9PSAyKQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfU1QgICBCMFNUXzIKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9TVCA8IDIpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9TVCAgIEIwU1RfMQotI2VuZGlmCi0KLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfSFQgPiAyKQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfSFQgICBCMEhUXzMKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9IVCA9PSAyKQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfSFQgICBCMEhUXzIKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9IVCA9PSAxKQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfSFQgICBCMEhUXzEKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9IVCA9PSAwICYmIENPTkZJR19GTEFTSF9TUEVFRF9CSFQgPT0gMCkKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX0hUICAgQjBIVF8wCi0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfSFQgPT0gMCAmJiBDT05GSUdfRkxBU0hfU1BFRURfQkhUICE9IDApCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9IVCAgIEIwSFRfMQotI2VuZGlmCi0KLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfV0FUID4gMTQpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9XQVQgIEIwV0FUXzE1Ci0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfV0FUID09IDE0KQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfV0FUICBCMFdBVF8xNAotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1dBVCA9PSAxMykKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1dBVCAgQjBXQVRfMTMKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9XQVQgPT0gMTIpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9XQVQgIEIwV0FUXzEyCi0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfV0FUID09IDExKQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfV0FUICBCMFdBVF8xMQotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1dBVCA9PSAxMCkKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1dBVCAgQjBXQVRfMTAKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9XQVQgPT0gOSkKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1dBVCAgQjBXQVRfOQotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1dBVCA9PSA4KQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfV0FUICBCMFdBVF84Ci0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfV0FUID09IDcpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9XQVQgIEIwV0FUXzcKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9XQVQgPT0gNikKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1dBVCAgQjBXQVRfNgotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1dBVCA9PSA1KQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfV0FUICBCMFdBVF81Ci0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfV0FUID09IDQpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9XQVQgIEIwV0FUXzQKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9XQVQgPT0gMykKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1dBVCAgQjBXQVRfMwotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1dBVCA9PSAyKQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfV0FUICBCMFdBVF8yCi0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfV0FUID09IDEpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9XQVQgIEIwV0FUXzEKLSNlbmRpZgotCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1JBVCA+IDE0KQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfUkFUICBCMFJBVF8xNQotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1JBVCA9PSAxNCkKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1JBVCAgQjBSQVRfMTQKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9SQVQgPT0gMTMpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9SQVQgIEIwUkFUXzEzCi0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfUkFUID09IDEyKQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfUkFUICBCMFJBVF8xMgotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1JBVCA9PSAxMSkKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1JBVCAgQjBSQVRfMTEKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9SQVQgPT0gMTApCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9SQVQgIEIwUkFUXzEwCi0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfUkFUID09IDkpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9SQVQgIEIwUkFUXzkKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9SQVQgPT0gOCkKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1JBVCAgQjBSQVRfOAotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1JBVCA9PSA3KQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfUkFUICBCMFJBVF83Ci0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfUkFUID09IDYpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9SQVQgIEIwUkFUXzYKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9SQVQgPT0gNSkKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1JBVCAgQjBSQVRfNQotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1JBVCA9PSA0KQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfUkFUICBCMFJBVF80Ci0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfUkFUID09IDMpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9SQVQgIEIwUkFUXzMKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9SQVQgPT0gMikKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1JBVCAgQjBSQVRfMgotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1JBVCA9PSAxKQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfUkFUICBCMFJBVF8xCi0jZW5kaWYKLQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDAgIFwKLQkoZmxhc2hfRUJJVV9BTUJDVEwwX1dBVCB8IGZsYXNoX0VCSVVfQU1CQ1RMMF9SQVQgfCBmbGFzaF9FQklVX0FNQkNUTDBfSFQgfCBcCi0JIGZsYXNoX0VCSVVfQU1CQ1RMMF9TVCB8IGZsYXNoX0VCSVVfQU1CQ1RMMF9UVCB8IENPTkZJR19GTEFTSF9TUEVFRF9SRFlFTikKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9pbmNsdWRlL21hY2gvbWVtX21hcC5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2luY2x1ZGUvbWFjaC9tZW1fbWFwLmgKaW5kZXggZWY0NmRjOS4uMDE5ZTAwMSAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2luY2x1ZGUvbWFjaC9tZW1fbWFwLmgKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2luY2x1ZGUvbWFjaC9tZW1fbWFwLmgKQEAgLTk5LDQgKzk5LDEwIEBACiAjZGVmaW5lIEwxX1NDUkFUQ0hfU1RBUlQJMHhGRkIwMDAwMAogI2RlZmluZSBMMV9TQ1JBVENIX0xFTkdUSAkweDEwMDAKIAorI2RlZmluZSBHRVRfUERBX1NBRkUocHJlZykJCVwKKwlwcmVnLmwgPSBfY3B1X3BkYTsJCVwKKwlwcmVnLmggPSBfY3B1X3BkYTsKKworI2RlZmluZSBHRVRfUERBKHByZWcsIGRyZWcpCUdFVF9QREFfU0FGRShwcmVnKQorCiAjZW5kaWYJCQkJLyogX01FTV9NQVBfNTI3X0hfICovCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvaW50cy1wcmlvcml0eS5jIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2ludHMtcHJpb3JpdHkuYwppbmRleCA4YTIzNjc0Li5mOGM4YWNkIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvaW50cy1wcmlvcml0eS5jCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9pbnRzLXByaW9yaXR5LmMKQEAgLTY5LDE0ICs2OSwxNCBAQAogCQkJKChDT05GSUdfSVJRX01BQ19UWCAtIDcpIDw8IElSUV9NQUNfVFhfUE9TKSB8CiAJCQkoKENPTkZJR19JUlFfUE9SVEhfSU5UQiAtIDcpIDw8IElSUV9QT1JUSF9JTlRCX1BPUykpOwogCi0JYmZpbl93cml0ZV9TSUNfSUFSNCgoKENPTkZJR19JUlFfVE1SMCAtIDcpIDw8IElSUV9UTVIwX1BPUykgfAotCQkJKChDT05GSUdfSVJRX1RNUjEgLSA3KSA8PCBJUlFfVE1SMV9QT1MpIHwKLQkJCSgoQ09ORklHX0lSUV9UTVIyIC0gNykgPDwgSVJRX1RNUjJfUE9TKSB8Ci0JCQkoKENPTkZJR19JUlFfVE1SMyAtIDcpIDw8IElSUV9UTVIzX1BPUykgfAotCQkJKChDT05GSUdfSVJRX1RNUjQgLSA3KSA8PCBJUlFfVE1SNF9QT1MpIHwKLQkJCSgoQ09ORklHX0lSUV9UTVI1IC0gNykgPDwgSVJRX1RNUjVfUE9TKSB8Ci0JCQkoKENPTkZJR19JUlFfVE1SNiAtIDcpIDw8IElSUV9UTVI2X1BPUykgfAotCQkJKChDT05GSUdfSVJRX1RNUjcgLSA3KSA8PCBJUlFfVE1SN19QT1MpKTsKKwliZmluX3dyaXRlX1NJQ19JQVI0KCgoQ09ORklHX0lSUV9USU1FUjAgLSA3KSA8PCBJUlFfVElNRVIwX1BPUykgfAorCQkJKChDT05GSUdfSVJRX1RJTUVSMSAtIDcpIDw8IElSUV9USU1FUjFfUE9TKSB8CisJCQkoKENPTkZJR19JUlFfVElNRVIyIC0gNykgPDwgSVJRX1RJTUVSMl9QT1MpIHwKKwkJCSgoQ09ORklHX0lSUV9USU1FUjMgLSA3KSA8PCBJUlFfVElNRVIzX1BPUykgfAorCQkJKChDT05GSUdfSVJRX1RJTUVSNCAtIDcpIDw8IElSUV9USU1FUjRfUE9TKSB8CisJCQkoKENPTkZJR19JUlFfVElNRVI1IC0gNykgPDwgSVJRX1RJTUVSNV9QT1MpIHwKKwkJCSgoQ09ORklHX0lSUV9USU1FUjYgLSA3KSA8PCBJUlFfVElNRVI2X1BPUykgfAorCQkJKChDT05GSUdfSVJRX1RJTUVSNyAtIDcpIDw8IElSUV9USU1FUjdfUE9TKSk7CiAKIAliZmluX3dyaXRlX1NJQ19JQVI1KCgoQ09ORklHX0lSUV9QT1JUR19JTlRBIC0gNykgPDwgSVJRX1BPUlRHX0lOVEFfUE9TKSB8CiAJCQkoKENPTkZJR19JUlFfUE9SVEdfSU5UQiAtIDcpIDw8IElSUV9QT1JUR19JTlRCX1BPUykgfApkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL0tjb25maWcgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvS2NvbmZpZwppbmRleCA3NmJlYjc1Li4xNDQyN2RlIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvS2NvbmZpZworKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvS2NvbmZpZwpAQCAtNTksNyArNTksNyBAQAogCWRlZmF1bHQgMTAKIGNvbmZpZyBUSU1FUjAKIAlpbnQgIlRJTUVSMCIKLQlkZWZhdWx0IDExCisJZGVmYXVsdCA4CiBjb25maWcgVElNRVIxCiAJaW50ICJUSU1FUjEiCiAJZGVmYXVsdCAxMQpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL01ha2VmaWxlIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL01ha2VmaWxlCmluZGV4IGFhOWYyNjQuLjg3NDg0MGYgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9NYWtlZmlsZQorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvTWFrZWZpbGUKQEAgLTIsNiArMiw0IEBACiAjIGFyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9NYWtlZmlsZQogIwogCi1leHRyYS15IDo9IGhlYWQubwotCiBvYmoteSA6PSBpbnRzLXByaW9yaXR5Lm8gZG1hLm8KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9ib2FyZHMvSDg2MDYuYyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9ib2FyZHMvSDg2MDYuYwppbmRleCA3MmFjM2FjLi4wYzY2YmY0IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvYm9hcmRzL0g4NjA2LmMKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2JvYXJkcy9IODYwNi5jCkBAIC0zMTMsMjMgKzMxMywzMyBAQAogI2VuZGlmCiAKICNpZiBkZWZpbmVkKENPTkZJR19CRklOX1NJUikgfHwgZGVmaW5lZChDT05GSUdfQkZJTl9TSVJfTU9EVUxFKQotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBiZmluX3Npcl9yZXNvdXJjZXNbXSA9IHsKICNpZmRlZiBDT05GSUdfQkZJTl9TSVIwCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGJmaW5fc2lyMF9yZXNvdXJjZXNbXSA9IHsKIAl7CiAJCS5zdGFydCA9IDB4RkZDMDA0MDAsCiAJCS5lbmQgPSAweEZGQzAwNEZGLAogCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKIAl9LAotI2VuZGlmCisJeworCQkuc3RhcnQgPSBJUlFfVUFSVDBfUlgsCisJCS5lbmQgPSBJUlFfVUFSVDBfUlgrMSwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJfSwKKwl7CisJCS5zdGFydCA9IENIX1VBUlQwX1JYLAorCQkuZW5kID0gQ0hfVUFSVDBfUlgrMSwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9ETUEsCisJfSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGJmaW5fc2lyX2RldmljZSA9IHsKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGJmaW5fc2lyMF9kZXZpY2UgPSB7CiAJLm5hbWUgPSAiYmZpbl9zaXIiLAogCS5pZCA9IDAsCi0JLm51bV9yZXNvdXJjZXMgPSBBUlJBWV9TSVpFKGJmaW5fc2lyX3Jlc291cmNlcyksCi0JLnJlc291cmNlID0gYmZpbl9zaXJfcmVzb3VyY2VzLAorCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRShiZmluX3NpcjBfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UgPSBiZmluX3NpcjBfcmVzb3VyY2VzLAogfTsKICNlbmRpZgorI2VuZGlmCiAKICNpZiBkZWZpbmVkKENPTkZJR19TRVJJQUxfODI1MCkgfHwgZGVmaW5lZChDT05GSUdfU0VSSUFMXzgyNTBfTU9EVUxFKQogCkBAIC00MzEsNyArNDQxLDkgQEAKICNlbmRpZgogCiAjaWYgZGVmaW5lZChDT05GSUdfQkZJTl9TSVIpIHx8IGRlZmluZWQoQ09ORklHX0JGSU5fU0lSX01PRFVMRSkKLQkmYmZpbl9zaXJfZGV2aWNlLAorI2lmZGVmIENPTkZJR19CRklOX1NJUjAKKwkmYmZpbl9zaXIwX2RldmljZSwKKyNlbmRpZgogI2VuZGlmCiAKICNpZiBkZWZpbmVkKENPTkZJR19LRVlCT0FSRF9PUEVOQ09SRVMpIHx8IGRlZmluZWQoQ09ORklHX0tFWUJPQVJEX09QRU5DT1JFU19NT0RVTEUpCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvYm9hcmRzL2JsYWNrc3RhbXAuYyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9ib2FyZHMvYmxhY2tzdGFtcC5jCmluZGV4IGQwNjRkZWQuLjZlZTYwN2MgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9ib2FyZHMvYmxhY2tzdGFtcC5jCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9ib2FyZHMvYmxhY2tzdGFtcC5jCkBAIC0yMTIsMjMgKzIxMiwzMyBAQAogI2VuZGlmCiAKICNpZiBkZWZpbmVkKENPTkZJR19CRklOX1NJUikgfHwgZGVmaW5lZChDT05GSUdfQkZJTl9TSVJfTU9EVUxFKQotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBiZmluX3Npcl9yZXNvdXJjZXNbXSA9IHsKICNpZmRlZiBDT05GSUdfQkZJTl9TSVIwCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGJmaW5fc2lyMF9yZXNvdXJjZXNbXSA9IHsKIAl7CiAJCS5zdGFydCA9IDB4RkZDMDA0MDAsCiAJCS5lbmQgPSAweEZGQzAwNEZGLAogCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKIAl9LAotI2VuZGlmCisJeworCQkuc3RhcnQgPSBJUlFfVUFSVDBfUlgsCisJCS5lbmQgPSBJUlFfVUFSVDBfUlgrMSwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJfSwKKwl7CisJCS5zdGFydCA9IENIX1VBUlQwX1JYLAorCQkuZW5kID0gQ0hfVUFSVDBfUlgrMSwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9ETUEsCisJfSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGJmaW5fc2lyX2RldmljZSA9IHsKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGJmaW5fc2lyMF9kZXZpY2UgPSB7CiAJLm5hbWUgPSAiYmZpbl9zaXIiLAogCS5pZCA9IDAsCi0JLm51bV9yZXNvdXJjZXMgPSBBUlJBWV9TSVpFKGJmaW5fc2lyX3Jlc291cmNlcyksCi0JLnJlc291cmNlID0gYmZpbl9zaXJfcmVzb3VyY2VzLAorCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRShiZmluX3NpcjBfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UgPSBiZmluX3NpcjBfcmVzb3VyY2VzLAogfTsKICNlbmRpZgorI2VuZGlmCiAKICNpZiBkZWZpbmVkKENPTkZJR19TRVJJQUxfQkZJTl9TUE9SVCkgfHwgZGVmaW5lZChDT05GSUdfU0VSSUFMX0JGSU5fU1BPUlRfTU9EVUxFKQogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYmZpbl9zcG9ydDBfdWFydF9kZXZpY2UgPSB7CkBAIC0zNTMsNyArMzYzLDkgQEAKICNlbmRpZgogCiAjaWYgZGVmaW5lZChDT05GSUdfQkZJTl9TSVIpIHx8IGRlZmluZWQoQ09ORklHX0JGSU5fU0lSX01PRFVMRSkKLQkmYmZpbl9zaXJfZGV2aWNlLAorI2lmZGVmIENPTkZJR19CRklOX1NJUjAKKwkmYmZpbl9zaXIwX2RldmljZSwKKyNlbmRpZgogI2VuZGlmCiAKICNpZiBkZWZpbmVkKENPTkZJR19TRVJJQUxfQkZJTl9TUE9SVCkgfHwgZGVmaW5lZChDT05GSUdfU0VSSUFMX0JGSU5fU1BPUlRfTU9EVUxFKQpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2JvYXJkcy9jbV9iZjUzMy5jIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2JvYXJkcy9jbV9iZjUzMy5jCmluZGV4IDU3NTg0M2YuLmU3MDYxYzcgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9ib2FyZHMvY21fYmY1MzMuYworKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvYm9hcmRzL2NtX2JmNTMzLmMKQEAgLTIxOSw2ICsyMTksMTkgQEAKIH07CiAjZW5kaWYKIAorc3RhdGljIHN0cnVjdCByZXNvdXJjZSBiZmluX2dwaW9zX3Jlc291cmNlcyA9IHsKKwkuc3RhcnQgPSAwLAorCS5lbmQgICA9IE1BWF9CTEFDS0ZJTl9HUElPUyAtIDEsCisJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZmluX2dwaW9zX2RldmljZSA9IHsKKwkubmFtZSA9ICJzaW1wbGUtZ3BpbyIsCisJLmlkID0gLTEsCisJLm51bV9yZXNvdXJjZXMgPSAxLAorCS5yZXNvdXJjZSA9ICZiZmluX2dwaW9zX3Jlc291cmNlcywKK307CisKICNpZiBkZWZpbmVkKENPTkZJR19TRVJJQUxfQkZJTikgfHwgZGVmaW5lZChDT05GSUdfU0VSSUFMX0JGSU5fTU9EVUxFKQogc3RhdGljIHN0cnVjdCByZXNvdXJjZSBiZmluX3VhcnRfcmVzb3VyY2VzW10gPSB7CiAJewpAQCAtMjM3LDIzICsyNTAsMzMgQEAKICNlbmRpZgogCiAjaWYgZGVmaW5lZChDT05GSUdfQkZJTl9TSVIpIHx8IGRlZmluZWQoQ09ORklHX0JGSU5fU0lSX01PRFVMRSkKLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYmZpbl9zaXJfcmVzb3VyY2VzW10gPSB7CiAjaWZkZWYgQ09ORklHX0JGSU5fU0lSMAorc3RhdGljIHN0cnVjdCByZXNvdXJjZSBiZmluX3NpcjBfcmVzb3VyY2VzW10gPSB7CiAJewogCQkuc3RhcnQgPSAweEZGQzAwNDAwLAogCQkuZW5kID0gMHhGRkMwMDRGRiwKIAkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCiAJfSwKLSNlbmRpZgorCXsKKwkJLnN0YXJ0ID0gSVJRX1VBUlQwX1JYLAorCQkuZW5kID0gSVJRX1VBUlQwX1JYKzEsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCX0sCisJeworCQkuc3RhcnQgPSBDSF9VQVJUMF9SWCwKKwkJLmVuZCA9IENIX1VBUlQwX1JYKzEsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfRE1BLAorCX0sCiB9OwogCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZmluX3Npcl9kZXZpY2UgPSB7CitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZmluX3NpcjBfZGV2aWNlID0gewogCS5uYW1lID0gImJmaW5fc2lyIiwKIAkuaWQgPSAwLAotCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRShiZmluX3Npcl9yZXNvdXJjZXMpLAotCS5yZXNvdXJjZSA9IGJmaW5fc2lyX3Jlc291cmNlcywKKwkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUoYmZpbl9zaXIwX3Jlc291cmNlcyksCisJLnJlc291cmNlID0gYmZpbl9zaXIwX3Jlc291cmNlcywKIH07CiAjZW5kaWYKKyNlbmRpZgogCiAjaWYgZGVmaW5lZChDT05GSUdfU0VSSUFMX0JGSU5fU1BPUlQpIHx8IGRlZmluZWQoQ09ORklHX1NFUklBTF9CRklOX1NQT1JUX01PRFVMRSkKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGJmaW5fc3BvcnQwX3VhcnRfZGV2aWNlID0gewpAQCAtMzQyLDcgKzM2NSw5IEBACiAjZW5kaWYKIAogI2lmIGRlZmluZWQoQ09ORklHX0JGSU5fU0lSKSB8fCBkZWZpbmVkKENPTkZJR19CRklOX1NJUl9NT0RVTEUpCi0JJmJmaW5fc2lyX2RldmljZSwKKyNpZmRlZiBDT05GSUdfQkZJTl9TSVIwCisJJmJmaW5fc2lyMF9kZXZpY2UsCisjZW5kaWYKICNlbmRpZgogCiAjaWYgZGVmaW5lZChDT05GSUdfU0VSSUFMX0JGSU5fU1BPUlQpIHx8IGRlZmluZWQoQ09ORklHX1NFUklBTF9CRklOX1NQT1JUX01PRFVMRSkKQEAgLTM2NSw2ICszOTAsOCBAQAogI2lmIGRlZmluZWQoQ09ORklHX1NQSV9CRklOKSB8fCBkZWZpbmVkKENPTkZJR19TUElfQkZJTl9NT0RVTEUpCiAJJmJmaW5fc3BpMF9kZXZpY2UsCiAjZW5kaWYKKworCSZiZmluX2dwaW9zX2RldmljZSwKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IGNtX2JmNTMzX2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9ib2FyZHMvZXpraXQuYyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9ib2FyZHMvZXpraXQuYwppbmRleCBjYzJlN2VlLi4wOGNkMDk2IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvYm9hcmRzL2V6a2l0LmMKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2JvYXJkcy9lemtpdC5jCkBAIC00Niw3ICs0Niw3IEBACiAvKgogICogTmFtZSB0aGUgQm9hcmQgZm9yIHRoZSAvcHJvYy9jcHVpbmZvCiAgKi8KLWNvbnN0IGNoYXIgYmZpbl9ib2FyZF9uYW1lW10gPSAiQUREUy1CRjUzMy1FWktJVCI7Citjb25zdCBjaGFyIGJmaW5fYm9hcmRfbmFtZVtdID0gIkFESSBCRjUzMy1FWktJVCI7CiAKICNpZiBkZWZpbmVkKENPTkZJR19SVENfRFJWX0JGSU4pIHx8IGRlZmluZWQoQ09ORklHX1JUQ19EUlZfQkZJTl9NT0RVTEUpCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBydGNfZGV2aWNlID0gewpAQCAtMjM2LDIzICsyMzYsMzMgQEAKICNlbmRpZgogCiAjaWYgZGVmaW5lZChDT05GSUdfQkZJTl9TSVIpIHx8IGRlZmluZWQoQ09ORklHX0JGSU5fU0lSX01PRFVMRSkKLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYmZpbl9zaXJfcmVzb3VyY2VzW10gPSB7CiAjaWZkZWYgQ09ORklHX0JGSU5fU0lSMAorc3RhdGljIHN0cnVjdCByZXNvdXJjZSBiZmluX3NpcjBfcmVzb3VyY2VzW10gPSB7CiAJewogCQkuc3RhcnQgPSAweEZGQzAwNDAwLAogCQkuZW5kID0gMHhGRkMwMDRGRiwKIAkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCiAJfSwKLSNlbmRpZgorCXsKKwkJLnN0YXJ0ID0gSVJRX1VBUlQwX1JYLAorCQkuZW5kID0gSVJRX1VBUlQwX1JYKzEsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCX0sCisJeworCQkuc3RhcnQgPSBDSF9VQVJUMF9SWCwKKwkJLmVuZCA9IENIX1VBUlQwX1JYKzEsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfRE1BLAorCX0sCiB9OwogCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZmluX3Npcl9kZXZpY2UgPSB7CitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZmluX3NpcjBfZGV2aWNlID0gewogCS5uYW1lID0gImJmaW5fc2lyIiwKIAkuaWQgPSAwLAotCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRShiZmluX3Npcl9yZXNvdXJjZXMpLAotCS5yZXNvdXJjZSA9IGJmaW5fc2lyX3Jlc291cmNlcywKKwkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUoYmZpbl9zaXIwX3Jlc291cmNlcyksCisJLnJlc291cmNlID0gYmZpbl9zaXIwX3Jlc291cmNlcywKIH07CiAjZW5kaWYKKyNlbmRpZgogCiAjaWYgZGVmaW5lZChDT05GSUdfS0VZQk9BUkRfR1BJTykgfHwgZGVmaW5lZChDT05GSUdfS0VZQk9BUkRfR1BJT19NT0RVTEUpCiAjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KQEAgLTM2Myw3ICszNzMsOSBAQAogI2VuZGlmCiAKICNpZiBkZWZpbmVkKENPTkZJR19CRklOX1NJUikgfHwgZGVmaW5lZChDT05GSUdfQkZJTl9TSVJfTU9EVUxFKQotCSZiZmluX3Npcl9kZXZpY2UsCisjaWZkZWYgQ09ORklHX0JGSU5fU0lSMAorCSZiZmluX3NpcjBfZGV2aWNlLAorI2VuZGlmCiAjZW5kaWYKIAogI2lmIGRlZmluZWQoQ09ORklHX0tFWUJPQVJEX0dQSU8pIHx8IGRlZmluZWQoQ09ORklHX0tFWUJPQVJEX0dQSU9fTU9EVUxFKQpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2JvYXJkcy9nZW5lcmljX2JvYXJkLmMgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvYm9hcmRzL2dlbmVyaWNfYm9hcmQuYwppbmRleCA4MmIxZjZhLi45ODZlZWVjIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvYm9hcmRzL2dlbmVyaWNfYm9hcmQuYworKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvYm9hcmRzL2dlbmVyaWNfYm9hcmQuYwpAQCAtNzIsNiArNzIsMzUgQEAKIH07CiAjZW5kaWYKIAorI2lmIGRlZmluZWQoQ09ORklHX0JGSU5fU0lSKSB8fCBkZWZpbmVkKENPTkZJR19CRklOX1NJUl9NT0RVTEUpCisjaWZkZWYgQ09ORklHX0JGSU5fU0lSMAorc3RhdGljIHN0cnVjdCByZXNvdXJjZSBiZmluX3NpcjBfcmVzb3VyY2VzW10gPSB7CisJeworCQkuc3RhcnQgPSAweEZGQzAwNDAwLAorCQkuZW5kID0gMHhGRkMwMDRGRiwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwl7CisJCS5zdGFydCA9IElSUV9VQVJUMF9SWCwKKwkJLmVuZCA9IElSUV9VQVJUMF9SWCsxLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorCXsKKwkJLnN0YXJ0ID0gQ0hfVUFSVDBfUlgsCisJCS5lbmQgPSBDSF9VQVJUMF9SWCsxLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0RNQSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYmZpbl9zaXIwX2RldmljZSA9IHsKKwkubmFtZSA9ICJiZmluX3NpciIsCisJLmlkID0gMCwKKwkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUoYmZpbl9zaXIwX3Jlc291cmNlcyksCisJLnJlc291cmNlID0gYmZpbl9zaXIwX3Jlc291cmNlcywKK307CisjZW5kaWYKKyNlbmRpZgorCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZ2VuZXJpY19ib2FyZF9kZXZpY2VzW10gX19pbml0ZGF0YSA9IHsKICNpZiBkZWZpbmVkKENPTkZJR19SVENfRFJWX0JGSU4pIHx8IGRlZmluZWQoQ09ORklHX1JUQ19EUlZfQkZJTl9NT0RVTEUpCiAJJnJ0Y19kZXZpY2UsCkBAIC04MCw2ICsxMDksMTIgQEAKICNpZiBkZWZpbmVkKENPTkZJR19TTUM5MVgpIHx8IGRlZmluZWQoQ09ORklHX1NNQzkxWF9NT0RVTEUpCiAJJnNtYzkxeF9kZXZpY2UsCiAjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX0JGSU5fU0lSKSB8fCBkZWZpbmVkKENPTkZJR19CRklOX1NJUl9NT0RVTEUpCisjaWZkZWYgQ09ORklHX0JGSU5fU0lSMAorCSZiZmluX3NpcjBfZGV2aWNlLAorI2VuZGlmCisjZW5kaWYKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IGdlbmVyaWNfYm9hcmRfaW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2JvYXJkcy9pcDB4LmMgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvYm9hcmRzL2lwMHguYwppbmRleCA1ODY0ODkyLi5lMzBiMWI3IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvYm9hcmRzL2lwMHguYworKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvYm9hcmRzL2lwMHguYwpAQCAtMTk3LDIzICsxOTcsMzMgQEAKICNlbmRpZgogCiAjaWYgZGVmaW5lZChDT05GSUdfQkZJTl9TSVIpIHx8IGRlZmluZWQoQ09ORklHX0JGSU5fU0lSX01PRFVMRSkKLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYmZpbl9zaXJfcmVzb3VyY2VzW10gPSB7CiAjaWZkZWYgQ09ORklHX0JGSU5fU0lSMAorc3RhdGljIHN0cnVjdCByZXNvdXJjZSBiZmluX3NpcjBfcmVzb3VyY2VzW10gPSB7CiAJewogCQkuc3RhcnQgPSAweEZGQzAwNDAwLAogCQkuZW5kID0gMHhGRkMwMDRGRiwKIAkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCiAJfSwKLSNlbmRpZgorCXsKKwkJLnN0YXJ0ID0gSVJRX1VBUlQwX1JYLAorCQkuZW5kID0gSVJRX1VBUlQwX1JYKzEsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCX0sCisJeworCQkuc3RhcnQgPSBDSF9VQVJUMF9SWCwKKwkJLmVuZCA9IENIX1VBUlQwX1JYKzEsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfRE1BLAorCX0sCiB9OwogCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZmluX3Npcl9kZXZpY2UgPSB7CitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZmluX3NpcjBfZGV2aWNlID0gewogCS5uYW1lID0gImJmaW5fc2lyIiwKIAkuaWQgPSAwLAotCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRShiZmluX3Npcl9yZXNvdXJjZXMpLAotCS5yZXNvdXJjZSA9IGJmaW5fc2lyX3Jlc291cmNlcywKKwkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUoYmZpbl9zaXIwX3Jlc291cmNlcyksCisJLnJlc291cmNlID0gYmZpbl9zaXIwX3Jlc291cmNlcywKIH07CiAjZW5kaWYKKyNlbmRpZgogCiAjaWYgZGVmaW5lZChDT05GSUdfVVNCX0lTUDEzNjJfSENEKSB8fCBkZWZpbmVkKENPTkZJR19VU0JfSVNQMTM2Ml9IQ0RfTU9EVUxFKQogc3RhdGljIHN0cnVjdCByZXNvdXJjZSBpc3AxMzYyX2hjZF9yZXNvdXJjZXNbXSA9IHsKQEAgLTI3Miw3ICsyODIsOSBAQAogI2VuZGlmCiAKICNpZiBkZWZpbmVkKENPTkZJR19CRklOX1NJUikgfHwgZGVmaW5lZChDT05GSUdfQkZJTl9TSVJfTU9EVUxFKQotCSZiZmluX3Npcl9kZXZpY2UsCisjaWZkZWYgQ09ORklHX0JGSU5fU0lSMAorCSZiZmluX3NpcjBfZGV2aWNlLAorI2VuZGlmCiAjZW5kaWYKIAogI2lmIGRlZmluZWQoQ09ORklHX1VTQl9JU1AxMzYyX0hDRCkgfHwgZGVmaW5lZChDT05GSUdfVVNCX0lTUDEzNjJfSENEX01PRFVMRSkKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9ib2FyZHMvc3RhbXAuYyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9ib2FyZHMvc3RhbXAuYwppbmRleCAwNTBmZmNhLi4wN2Y5YWQxIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvYm9hcmRzL3N0YW1wLmMKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2JvYXJkcy9zdGFtcC5jCkBAIC00OSw3ICs0OSw3IEBACiAvKgogICogTmFtZSB0aGUgQm9hcmQgZm9yIHRoZSAvcHJvYy9jcHVpbmZvCiAgKi8KLWNvbnN0IGNoYXIgYmZpbl9ib2FyZF9uYW1lW10gPSAiQUREUy1CRjUzMy1TVEFNUCI7Citjb25zdCBjaGFyIGJmaW5fYm9hcmRfbmFtZVtdID0gIkFESSBCRjUzMy1TVEFNUCI7CiAKICNpZiBkZWZpbmVkKENPTkZJR19SVENfRFJWX0JGSU4pIHx8IGRlZmluZWQoQ09ORklHX1JUQ19EUlZfQkZJTl9NT0RVTEUpCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBydGNfZGV2aWNlID0gewpAQCAtMTE4LDcgKzExOCw3IEBACiAJCS5vZmZzZXQgPSAwLAogCX0sIHsKIAkJLm5hbWUgICA9ICJsaW51eCBrZXJuZWwobm9yKSIsCi0JCS5zaXplICAgPSAweEUwMDAwLAorCQkuc2l6ZSAgID0gMHgxODAwMDAsCiAJCS5vZmZzZXQgPSBNVERQQVJUX09GU19BUFBFTkQsCiAJfSwgewogCQkubmFtZSAgID0gImZpbGUgc3lzdGVtKG5vcikiLApAQCAtMTY5LDcgKzE2OSw3IEBACiAJCS5tYXNrX2ZsYWdzID0gTVREX0NBUF9ST00KIAl9LCB7CiAJCS5uYW1lID0gImxpbnV4IGtlcm5lbChzcGkpIiwKLQkJLnNpemUgPSAweGUwMDAwLAorCQkuc2l6ZSA9IDB4MTgwMDAwLAogCQkub2Zmc2V0ID0gTVREUEFSVF9PRlNfQVBQRU5ELAogCX0sIHsKIAkJLm5hbWUgPSAiZmlsZSBzeXN0ZW0oc3BpKSIsCkBAIC0yMTYsMTMgKzIxNiw2IEBACiB9OwogI2VuZGlmCiAKLSNpZiBkZWZpbmVkKENPTkZJR19TUElfTU1DKSB8fCBkZWZpbmVkKENPTkZJR19TUElfTU1DX01PRFVMRSkKLXN0YXRpYyBzdHJ1Y3QgYmZpbjV4eF9zcGlfY2hpcCBzcGlfbW1jX2NoaXBfaW5mbyA9IHsKLQkuZW5hYmxlX2RtYSA9IDEsCi0JLmJpdHNfcGVyX3dvcmQgPSA4LAotfTsKLSNlbmRpZgotCiAjaWYgZGVmaW5lZChDT05GSUdfU1BJX1NQSURFVikgfHwgZGVmaW5lZChDT05GSUdfU1BJX1NQSURFVl9NT0RVTEUpCiBzdGF0aWMgc3RydWN0IGJmaW41eHhfc3BpX2NoaXAgc3BpZGV2X2NoaXBfaW5mbyA9IHsKIAkuZW5hYmxlX2RtYSA9IDAsCkBAIC0yNjUsMjcgKzI1OCw2IEBACiAJfSwKICNlbmRpZgogCi0jaWYgZGVmaW5lZChDT05GSUdfU1BJX01NQykgfHwgZGVmaW5lZChDT05GSUdfU1BJX01NQ19NT0RVTEUpCi0JewotCQkubW9kYWxpYXMgPSAic3BpX21tY19kdW1teSIsCi0JCS5tYXhfc3BlZWRfaHogPSAyMDAwMDAwMCwgICAgIC8qIG1heCBzcGkgY2xvY2sgKFNDSykgc3BlZWQgaW4gSFogKi8KLQkJLmJ1c19udW0gPSAwLAotCQkuY2hpcF9zZWxlY3QgPSAwLAotCQkucGxhdGZvcm1fZGF0YSA9IE5VTEwsCi0JCS5jb250cm9sbGVyX2RhdGEgPSAmc3BpX21tY19jaGlwX2luZm8sCi0JCS5tb2RlID0gU1BJX01PREVfMywKLQl9LAotCXsKLQkJLm1vZGFsaWFzID0gInNwaV9tbWMiLAotCQkubWF4X3NwZWVkX2h6ID0gMjAwMDAwMDAsICAgICAvKiBtYXggc3BpIGNsb2NrIChTQ0spIHNwZWVkIGluIEhaICovCi0JCS5idXNfbnVtID0gMCwKLQkJLmNoaXBfc2VsZWN0ID0gQ09ORklHX1NQSV9NTUNfQ1NfQ0hBTiwKLQkJLnBsYXRmb3JtX2RhdGEgPSBOVUxMLAotCQkuY29udHJvbGxlcl9kYXRhID0gJnNwaV9tbWNfY2hpcF9pbmZvLAotCQkubW9kZSA9IFNQSV9NT0RFXzMsCi0JfSwKLSNlbmRpZgotCiAjaWYgZGVmaW5lZChDT05GSUdfUEJYKQogCXsKIAkJLm1vZGFsaWFzID0gImZ4cy1zcGkiLApAQCAtMzczLDIzICszNDUsMzMgQEAKICNlbmRpZgogCiAjaWYgZGVmaW5lZChDT05GSUdfQkZJTl9TSVIpIHx8IGRlZmluZWQoQ09ORklHX0JGSU5fU0lSX01PRFVMRSkKLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYmZpbl9zaXJfcmVzb3VyY2VzW10gPSB7CiAjaWZkZWYgQ09ORklHX0JGSU5fU0lSMAorc3RhdGljIHN0cnVjdCByZXNvdXJjZSBiZmluX3NpcjBfcmVzb3VyY2VzW10gPSB7CiAJewogCQkuc3RhcnQgPSAweEZGQzAwNDAwLAogCQkuZW5kID0gMHhGRkMwMDRGRiwKIAkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCiAJfSwKLSNlbmRpZgorCXsKKwkJLnN0YXJ0ID0gSVJRX1VBUlQwX1JYLAorCQkuZW5kID0gSVJRX1VBUlQwX1JYKzEsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCX0sCisJeworCQkuc3RhcnQgPSBDSF9VQVJUMF9SWCwKKwkJLmVuZCA9IENIX1VBUlQwX1JYKzEsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfRE1BLAorCX0sCiB9OwogCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZmluX3Npcl9kZXZpY2UgPSB7CitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZmluX3NpcjBfZGV2aWNlID0gewogCS5uYW1lID0gImJmaW5fc2lyIiwKIAkuaWQgPSAwLAotCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRShiZmluX3Npcl9yZXNvdXJjZXMpLAotCS5yZXNvdXJjZSA9IGJmaW5fc2lyX3Jlc291cmNlcywKKwkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUoYmZpbl9zaXIwX3Jlc291cmNlcyksCisJLnJlc291cmNlID0gYmZpbl9zaXIwX3Jlc291cmNlcywKIH07CiAjZW5kaWYKKyNlbmRpZgogCiAjaWYgZGVmaW5lZChDT05GSUdfU0VSSUFMX0JGSU5fU1BPUlQpIHx8IGRlZmluZWQoQ09ORklHX1NFUklBTF9CRklOX1NQT1JUX01PRFVMRSkKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGJmaW5fc3BvcnQwX3VhcnRfZGV2aWNlID0gewpAQCAtNTM3LDcgKzUxOSw5IEBACiAjZW5kaWYKIAogI2lmIGRlZmluZWQoQ09ORklHX0JGSU5fU0lSKSB8fCBkZWZpbmVkKENPTkZJR19CRklOX1NJUl9NT0RVTEUpCi0JJmJmaW5fc2lyX2RldmljZSwKKyNpZmRlZiBDT05GSUdfQkZJTl9TSVIwCisJJmJmaW5fc2lyMF9kZXZpY2UsCisjZW5kaWYKICNlbmRpZgogCiAjaWYgZGVmaW5lZChDT05GSUdfU0VSSUFMX0JGSU5fU1BPUlQpIHx8IGRlZmluZWQoQ09ORklHX1NFUklBTF9CRklOX1NQT1JUX01PRFVMRSkKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9kbWEuYyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9kbWEuYwppbmRleCAyODY1NWMxLi4wYTZlYjhmIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvZG1hLmMKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2RtYS5jCkBAIC0zMSw3ICszMSw3IEBACiAjaW5jbHVkZSA8YXNtL2JsYWNrZmluLmg+CiAjaW5jbHVkZSA8YXNtL2RtYS5oPgogCi1zdHJ1Y3QgZG1hX3JlZ2lzdGVyICpkbWFfaW9fYmFzZV9hZGRyW01BWF9CTEFDS0ZJTl9ETUFfQ0hBTk5FTF0gPSB7CitzdHJ1Y3QgZG1hX3JlZ2lzdGVyICpkbWFfaW9fYmFzZV9hZGRyW01BWF9ETUFfQ0hBTk5FTFNdID0gewogCShzdHJ1Y3QgZG1hX3JlZ2lzdGVyICopIERNQTBfTkVYVF9ERVNDX1BUUiwKIAkoc3RydWN0IGRtYV9yZWdpc3RlciAqKSBETUExX05FWFRfREVTQ19QVFIsCiAJKHN0cnVjdCBkbWFfcmVnaXN0ZXIgKikgRE1BMl9ORVhUX0RFU0NfUFRSLApkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2hlYWQuUyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9oZWFkLlMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmYzk1YWEuLjAwMDAwMDAKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2hlYWQuUworKysgL2Rldi9udWxsCkBAIC0xLDEzNyArMCwwIEBACi0vKgotICogRmlsZTogICAgICAgICBhcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvaGVhZC5TCi0gKiBCYXNlZCBvbjoKLSAqIEF1dGhvcjogICAgICAgSmVmZiBEaW9ubmUgPGplZmZAdWNsaW51eC5vcmc+IENPUFlSSUdIVCAxOTk4IEQuIEplZmYgRGlvbm5lCi0gKgotICogQ3JlYXRlZDogICAgICAxOTk4Ci0gKiBEZXNjcmlwdGlvbjogIGJmNTMzIHN0YXJ0dXAgZmlsZQotICoKLSAqIE1vZGlmaWVkOgotICogICAgICAgICAgICAgICBDb3B5cmlnaHQgMjAwNC0yMDA2IEFuYWxvZyBEZXZpY2VzIEluYy4KLSAqCi0gKiBCdWdzOiAgICAgICAgIEVudGVyIGJ1Z3MgYXQgaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnLwotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIHRoZSBmaWxlIENPUFlJTkcsIG9yIHdyaXRlCi0gKiB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICogNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxhc20vYmxhY2tmaW4uaD4KLSNpZmRlZiBDT05GSUdfQkZJTl9LRVJORUxfQ0xPQ0sKLSNpbmNsdWRlIDxhc20vY2xvY2tzLmg+Ci0jaW5jbHVkZSA8bWFjaC9tZW1faW5pdC5oPgotI2VuZGlmCi0KLS5zZWN0aW9uIC5sMS50ZXh0Ci0jaWZkZWYgQ09ORklHX0JGSU5fS0VSTkVMX0NMT0NLCi1FTlRSWShfc3RhcnRfZG1hX2NvZGUpCi0JcDAuaCA9IGhpKFNJQ19JV1IpOwotCXAwLmwgPSBsbyhTSUNfSVdSKTsKLQlyMC5sID0gMHgxOwotCXIwLmggPSAweDA7Ci0JW3AwXSA9IHIwOwotCVNTWU5DOwotCi0JLyoKLQkgKiAgU2V0IFBMTF9DVEwKLQkgKiAgIC0gWzE0OjA5XSA9IE1TRUxbNTowXSA6IENMS0lOIC8gVkNPIG11bHRpcGxpY2F0aW9uIGZhY3RvcnMKLQkgKiAgIC0gWzhdICAgICA9IEJZUEFTUyAgICA6IEJZUEFTUyB0aGUgUExMLCBydW4gQ0xLSU4gaW50byBDQ0xLL1NDTEsKLQkgKiAgIC0gWzddICAgICA9IG91dHB1dCBkZWxheSAoYWRkIDIwMHBzIG9mIGRlbGF5IHRvIG1lbSBzaWduYWxzKQotCSAqICAgLSBbNl0gICAgID0gaW5wdXQgZGVsYXkgKGFkZCAyMDBwcyBvZiBpbnB1dCBkZWxheSB0byBtZW0gc2lnbmFscykKLQkgKiAgIC0gWzVdICAgICA9IFBEV04gICAgICA6IDE9QWxsIENsb2NrcyBvZmYKLQkgKiAgIC0gWzNdICAgICA9IFNUT1BDSyAgICA6IDE9Q29yZSBDbG9jayBvZmYKLQkgKiAgIC0gWzFdICAgICA9IFBMTF9PRkYgICA6IDE9RGlzYWJsZSBQb3dlciB0byBQTEwKLQkgKiAgIC0gWzBdICAgICA9IERGICAgICAgICA6IDE9UGFzcyBDTEtJTi8yIHRvIFBMTCAvIDA9UGFzcyBDTEtJTiB0byBQTEwKLQkgKiAgIGFsbCBvdGhlciBiaXRzIHNldCB0byB6ZXJvCi0JICovCi0KLQlwMC5oID0gaGkoUExMX0xPQ0tDTlQpOwotCXAwLmwgPSBsbyhQTExfTE9DS0NOVCk7Ci0JcjAgPSAweDMwMChaKTsKLQl3W3AwXSA9IHIwLmw7Ci0Jc3N5bmM7Ci0KLQlQMi5IID0gaGkoRUJJVV9TREdDVEwpOwotCVAyLkwgPSBsbyhFQklVX1NER0NUTCk7Ci0JUjAgPSBbUDJdOwotCUJJVFNFVCAoUjAsIDI0KTsKLQlbUDJdID0gUjA7Ci0JU1NZTkM7Ci0KLQlyMCA9IENPTkZJR19WQ09fTVVMVCAmIDYzOyAgICAgICAvKiBMb2FkIHRoZSBWQ08gbXVsdGlwbGllciAgICAgICAgICovCi0JcjAgPSByMCA8PCA5OyAgICAgICAgICAgICAgICAgICAgLyogU2hpZnQgaXQgb3ZlciwgICAgICAgICAgICAgICAgICAqLwotCXIxID0gQ0xLSU5fSEFMRjsgICAgICAgICAgICAgICAgIC8qIERvIHdlIG5lZWQgdG8gZGl2aWRlIENMS0lOIGJ5IDI/Ki8KLQlyMCA9IHIxIHwgcjA7Ci0JcjEgPSBQTExfQllQQVNTOyAgICAgICAgICAgICAgICAgLyogQnlwYXNzIHRoZSBQTEw/ICAgICAgICAgICAgICAgICAqLwotCXIxID0gcjEgPDwgODsgICAgICAgICAgICAgICAgICAgIC8qIFNoaWZ0IGl0IG92ZXIgICAgICAgICAgICAgICAgICAgKi8KLQlyMCA9IHIxIHwgcjA7ICAgICAgICAgICAgICAgICAgICAvKiBhZGQgdGhlbSBhbGwgdG9nZXRoZXIgICAgICAgICAgICovCi0jaWZkZWYgQU5PTUFMWV8wNTAwMDI2NQotCUJJVFNFVChyMCwgMTUpOyAgICAgICAgICAgICAgICAgIC8qIEFkZCAyNTAgbVYgb2YgaHlzdGVyZXNpcyB0byBTUE9SVCBpbnB1dCBwaW5zICovCi0jZW5kaWYKLQotCXAwLmggPSBoaShQTExfQ1RMKTsKLQlwMC5sID0gbG8oUExMX0NUTCk7ICAgICAgICAgICAgICAvKiBMb2FkIHRoZSBhZGRyZXNzICAgICAgICAgICAgICAgICovCi0JY2xpIHIyOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGlzYWJsZSBpbnRlcnJ1cHRzICAgICAgICAgICAgICAqLwotCXNzeW5jOwotCXdbcDBdID0gcjAubDsgICAgICAgICAgICAgICAgICAgIC8qIFNldCB0aGUgdmFsdWUgICAgICAgICAgICAgICAgICAgKi8KLQlpZGxlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBXYWl0IGZvciB0aGUgUExMIHRvIHN0YWJsaXplICAgICovCi0Jc3RpIHIyOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRW5hYmxlIGludGVycnVwdHMgICAgICAgICAgICAgICAqLwotCi0uTGNoZWNrX2FnYWluOgotCXAwLmggPSBoaShQTExfU1RBVCk7Ci0JcDAubCA9IGxvKFBMTF9TVEFUKTsKLQlSMCA9IFdbUDBdKFopOwotCUNDID0gQklUVFNUKFIwLDUpOwotCWlmICEgQ0MganVtcCAuTGNoZWNrX2FnYWluOwotCi0JLyogQ29uZmlndXJlIFNDTEsgJiBDQ0xLIERpdmlkZXJzICovCi0JcjAgPSAoQ09ORklHX0NDTEtfQUNUX0RJViB8IENPTkZJR19TQ0xLX0RJVik7Ci0JcDAuaCA9IGhpKFBMTF9ESVYpOwotCXAwLmwgPSBsbyhQTExfRElWKTsKLQl3W3AwXSA9IHIwLmw7Ci0Jc3N5bmM7Ci0KLQlwMC5sID0gbG8oRUJJVV9TRFJSQyk7Ci0JcDAuaCA9IGhpKEVCSVVfU0RSUkMpOwotCXIwID0gbWVtX1NEUlJDOwotCXdbcDBdID0gcjAubDsKLQlzc3luYzsKLQotCVAyLkggPSBoaShFQklVX1NER0NUTCk7Ci0JUDIuTCA9IGxvKEVCSVVfU0RHQ1RMKTsKLQlSMCA9IFtQMl07Ci0JQklUQ0xSIChSMCwgMjQpOwotCXAwLmggPSBoaShFQklVX1NEU1RBVCk7Ci0JcDAubCA9IGxvKEVCSVVfU0RTVEFUKTsKLQlyMi5sID0gd1twMF07Ci0JY2MgPSBiaXR0c3QocjIsMyk7Ci0JaWYgIWNjIGp1bXAgLkxza2lwOwotCU5PUDsKLQlCSVRTRVQgKFIwLCAyMyk7Ci0uTHNraXA6Ci0JW1AyXSA9IFIwOwotCVNTWU5DOwotCi0JUjAuTCA9IGxvKG1lbV9TREdDVEwpOwotCVIwLkggPSBoaShtZW1fU0RHQ1RMKTsKLQlSMSA9IFtwMl07Ci0JUjEgPSBSMSB8IFIwOwotCVtQMl0gPSBSMTsKLQlTU1lOQzsKLQotCVJUUzsKLUVORFBST0MoX3N0YXJ0X2RtYV9jb2RlKQotI2VuZGlmIC8qIENPTkZJR19CRklOX0tFUk5FTF9DTE9DSyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2luY2x1ZGUvbWFjaC9hbm9tYWx5LmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvaW5jbHVkZS9tYWNoL2Fub21hbHkuaAppbmRleCBmNTQ0ZmM1Li4wZDNhMDM0IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvaW5jbHVkZS9tYWNoL2Fub21hbHkuaAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvaW5jbHVkZS9tYWNoL2Fub21hbHkuaApAQCAtNyw3ICs3LDcgQEAKICAqLwogCiAvKiBUaGlzIGZpbGUgc2hvdWxlIGJlIHVwIHRvIGRhdGUgd2l0aDoKLSAqICAtIFJldmlzaW9uIEQsIDA2LzE4LzIwMDg7IEFEU1AtQkY1MzEvQkY1MzIvQkY1MzMgQmxhY2tmaW4gUHJvY2Vzc29yIEFub21hbHkgTGlzdAorICogIC0gUmV2aXNpb24gRSwgMDkvMTgvMjAwODsgQURTUC1CRjUzMS9CRjUzMi9CRjUzMyBCbGFja2ZpbiBQcm9jZXNzb3IgQW5vbWFseSBMaXN0CiAgKi8KIAogI2lmbmRlZiBfTUFDSF9BTk9NQUxZX0hfCkBAIC0xOTQsNiArMTk0LDEyIEBACiAjZGVmaW5lIEFOT01BTFlfMDUwMDA0MDMgKDEpCiAvKiBTcGVjdWxhdGl2ZSBGZXRjaGVzIENhbiBDYXVzZSBVbmRlc2lyZWQgRXh0ZXJuYWwgRklGTyBPcGVyYXRpb25zICovCiAjZGVmaW5lIEFOT01BTFlfMDUwMDA0MTYgKDEpCisvKiBNdWx0aWNoYW5uZWwgU1BPUlQgQ2hhbm5lbCBNaXNhbGlnbm1lbnQgVW5kZXIgU3BlY2lmaWMgQ29uZmlndXJhdGlvbiAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwNDI1ICgxKQorLyogU3BlY3VsYXRpdmUgRmV0Y2hlcyBvZiBJbmRpcmVjdC1Qb2ludGVyIEluc3RydWN0aW9ucyBDYW4gQ2F1c2UgRmFsc2UgSGFyZHdhcmUgRXJyb3JzICovCisjZGVmaW5lIEFOT01BTFlfMDUwMDA0MjYgKDEpCisvKiBJRkxVU0ggSW5zdHJ1Y3Rpb24gYXQgRW5kIG9mIEhhcmR3YXJlIExvb3AgQ2F1c2VzIEluZmluaXRlIFN0YWxsICovCisjZGVmaW5lIEFOT01BTFlfMDUwMDA0NDMgKDEpCiAKIC8qIFRoZXNlIGFub21hbGllcyBoYXZlIGJlZW4gInBoYXNlZCIgb3V0IG9mIGFuYWxvZy5jb20gYW5vbWFseSBzaGVldHMgYW5kIGFyZQogICogaGVyZSB0byBzaG93IHJ1bm5pbmcgb24gb2xkZXIgc2lsaWNvbiBqdXN0IGlzbid0IGZlYXNpYmxlLgpAQCAtMjczLDUgKzI3OSw4IEBACiAjZGVmaW5lIEFOT01BTFlfMDUwMDAzMjMgKDApCiAjZGVmaW5lIEFOT01BTFlfMDUwMDAzNTMgKDEpCiAjZGVmaW5lIEFOT01BTFlfMDUwMDAzODYgKDEpCisjZGVmaW5lIEFOT01BTFlfMDUwMDA0MTIgKDApCisjZGVmaW5lIEFOT01BTFlfMDUwMDA0MzIgKDApCisjZGVmaW5lIEFOT01BTFlfMDUwMDA0MzUgKDApCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2luY2x1ZGUvbWFjaC9iZjUzMy5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2luY2x1ZGUvbWFjaC9iZjUzMy5oCmluZGV4IGRmYzhjMWEuLmNmNDQyN2MgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9pbmNsdWRlL21hY2gvYmY1MzMuaAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvaW5jbHVkZS9tYWNoL2JmNTMzLmgKQEAgLTE0NSw3ICsxNDUsNyBAQAogI2VuZGlmCiAjaWZkZWYgQ09ORklHX0JGNTMyCiAjZGVmaW5lIENQVSAiQkY1MzIiCi0jZGVmaW5lIENQVUlEIDB4Mjc1QQorI2RlZmluZSBDUFVJRCAweDI3YTUKICNlbmRpZgogI2lmZGVmIENPTkZJR19CRjUzMQogI2RlZmluZSBDUFUgIkJGNTMxIgpAQCAtMTUzLDcgKzE1Myw3IEBACiAjZW5kaWYKIAogI2lmbmRlZiBDUFUKLSNlcnJvciBVbmtub3duIENQVSB0eXBlIC0gVGhpcyBrZXJuZWwgZG9lc24ndCBzZWVtIHRvIGJlIGNvbmZpZ3VyZWQgcHJvcGVybHkKKyNlcnJvciAiVW5rbm93biBDUFUgdHlwZSAtIFRoaXMga2VybmVsIGRvZXNuJ3Qgc2VlbSB0byBiZSBjb25maWd1cmVkIHByb3Blcmx5IgogI2VuZGlmCiAKICNlbmRpZgkJCQkvKiBfX01BQ0hfQkY1MzNfSF9fICAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2luY2x1ZGUvbWFjaC9iZmluX3Npci5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2luY2x1ZGUvbWFjaC9iZmluX3Npci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YmI4N2U5Li4wMDAwMDAwCi0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9pbmNsdWRlL21hY2gvYmZpbl9zaXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi0vKgotICogQmxhY2tmaW4gSW5mcmEtcmVkIERyaXZlcgotICoKLSAqIENvcHlyaWdodCAyMDA2LTIwMDggQW5hbG9nIERldmljZXMgSW5jLgotICoKLSAqIEVudGVyIGJ1Z3MgYXQgaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnLwotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L3NlcmlhbC5oPgotI2luY2x1ZGUgPGFzbS9kbWEuaD4KLSNpbmNsdWRlIDxhc20vcG9ydG11eC5oPgotCi0jZGVmaW5lIFNJUl9VQVJUX0dFVF9DSEFSKHBvcnQpICAgYmZpbl9yZWFkMTYoKHBvcnQpLT5tZW1iYXNlICsgT0ZGU0VUX1JCUikKLSNkZWZpbmUgU0lSX1VBUlRfR0VUX0RMTChwb3J0KSAgICBiZmluX3JlYWQxNigocG9ydCktPm1lbWJhc2UgKyBPRkZTRVRfRExMKQotI2RlZmluZSBTSVJfVUFSVF9HRVRfSUVSKHBvcnQpICAgIGJmaW5fcmVhZDE2KChwb3J0KS0+bWVtYmFzZSArIE9GRlNFVF9JRVIpCi0jZGVmaW5lIFNJUl9VQVJUX0dFVF9ETEgocG9ydCkgICAgYmZpbl9yZWFkMTYoKHBvcnQpLT5tZW1iYXNlICsgT0ZGU0VUX0RMSCkKLSNkZWZpbmUgU0lSX1VBUlRfR0VUX0lJUihwb3J0KSAgICBiZmluX3JlYWQxNigocG9ydCktPm1lbWJhc2UgKyBPRkZTRVRfSUlSKQotI2RlZmluZSBTSVJfVUFSVF9HRVRfTENSKHBvcnQpICAgIGJmaW5fcmVhZDE2KChwb3J0KS0+bWVtYmFzZSArIE9GRlNFVF9MQ1IpCi0jZGVmaW5lIFNJUl9VQVJUX0dFVF9HQ1RMKHBvcnQpICAgYmZpbl9yZWFkMTYoKHBvcnQpLT5tZW1iYXNlICsgT0ZGU0VUX0dDVEwpCi0KLSNkZWZpbmUgU0lSX1VBUlRfUFVUX0NIQVIocG9ydCwgdikgYmZpbl93cml0ZTE2KCgocG9ydCktPm1lbWJhc2UgKyBPRkZTRVRfVEhSKSwgdikKLSNkZWZpbmUgU0lSX1VBUlRfUFVUX0RMTChwb3J0LCB2KSAgYmZpbl93cml0ZTE2KCgocG9ydCktPm1lbWJhc2UgKyBPRkZTRVRfRExMKSwgdikKLSNkZWZpbmUgU0lSX1VBUlRfUFVUX0lFUihwb3J0LCB2KSAgYmZpbl93cml0ZTE2KCgocG9ydCktPm1lbWJhc2UgKyBPRkZTRVRfSUVSKSwgdikKLSNkZWZpbmUgU0lSX1VBUlRfUFVUX0RMSChwb3J0LCB2KSAgYmZpbl93cml0ZTE2KCgocG9ydCktPm1lbWJhc2UgKyBPRkZTRVRfRExIKSwgdikKLSNkZWZpbmUgU0lSX1VBUlRfUFVUX0xDUihwb3J0LCB2KSAgYmZpbl93cml0ZTE2KCgocG9ydCktPm1lbWJhc2UgKyBPRkZTRVRfTENSKSwgdikKLSNkZWZpbmUgU0lSX1VBUlRfUFVUX0dDVEwocG9ydCwgdikgYmZpbl93cml0ZTE2KCgocG9ydCktPm1lbWJhc2UgKyBPRkZTRVRfR0NUTCksIHYpCi0KLSNpZmRlZiBDT05GSUdfU0lSX0JGSU5fRE1BCi1zdHJ1Y3QgZG1hX3J4X2J1ZiB7Ci0JY2hhciAqYnVmOwotCWludCBoZWFkOwotCWludCB0YWlsOwotCX07Ci0jZW5kaWYgLyogQ09ORklHX1NJUl9CRklOX0RNQSAqLwotCi1zdHJ1Y3QgYmZpbl9zaXJfcG9ydCB7Ci0JdW5zaWduZWQgY2hhciBfX2lvbWVtICAgKm1lbWJhc2U7Ci0JdW5zaWduZWQgaW50ICAgICAgICAgICAgaXJxOwotCXVuc2lnbmVkIGludCAgICAgICAgICAgIGxzcjsKLQl1bnNpZ25lZCBsb25nICAgICAgICAgICBjbGs7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgICAgICAgKmRldjsKLSNpZmRlZiBDT05GSUdfU0lSX0JGSU5fRE1BCi0JaW50ICAgICAgICAgICAgICAgICAgICAgdHhfZG9uZTsKLQlzdHJ1Y3QgZG1hX3J4X2J1ZiAgICAgICByeF9kbWFfYnVmOwotCXN0cnVjdCB0aW1lcl9saXN0ICAgICAgIHJ4X2RtYV90aW1lcjsKLQlpbnQgICAgICAgICAgICAgICAgICAgICByeF9kbWFfbnJvd3M7Ci0jZW5kaWYgLyogQ09ORklHX1NJUl9CRklOX0RNQSAqLwotCXVuc2lnbmVkIGludCAgICAgICAgICAgIHR4X2RtYV9jaGFubmVsOwotCXVuc2lnbmVkIGludCAgICAgICAgICAgIHJ4X2RtYV9jaGFubmVsOwotfTsKLQotc3RydWN0IGJmaW5fc2lyX3BvcnQgc2lyX3BvcnRzW0JGSU5fVUFSVF9OUl9QT1JUU107Ci0KLXN0cnVjdCBiZmluX3Npcl9wb3J0X3JlcyB7Ci0JdW5zaWduZWQgbG9uZyAgIGJhc2VfYWRkcjsKLQlpbnQgICAgICAgICAgICAgaXJxOwotCXVuc2lnbmVkIGludCAgICByeF9kbWFfY2hhbm5lbDsKLQl1bnNpZ25lZCBpbnQgICAgdHhfZG1hX2NoYW5uZWw7Ci19OwotCi1zdHJ1Y3QgYmZpbl9zaXJfcG9ydF9yZXMgYmZpbl9zaXJfcG9ydF9yZXNvdXJjZVtdID0gewotI2lmZGVmIENPTkZJR19CRklOX1NJUjAKLQl7Ci0JMHhGRkMwMDQwMCwKLQlJUlFfVUFSVF9SWCwKLQlDSF9VQVJUX1JYLAotCUNIX1VBUlRfVFgsCi0JfSwKLSNlbmRpZgotfTsKLQotaW50IG5yX3NpcnMgPSBBUlJBWV9TSVpFKGJmaW5fc2lyX3BvcnRfcmVzb3VyY2UpOwotCi1zdHJ1Y3QgYmZpbl9zaXJfc2VsZiB7Ci0Jc3RydWN0IGJmaW5fc2lyX3BvcnQgICAgKnNpcl9wb3J0OwotCXNwaW5sb2NrX3QgICAgICAgICAgICAgIGxvY2s7Ci0JdW5zaWduZWQgaW50ICAgICAgICAgICAgb3BlbjsKLQlpbnQgICAgICAgICAgICAgICAgICAgICBzcGVlZDsKLQlpbnQgICAgICAgICAgICAgICAgICAgICBuZXdzcGVlZDsKLQotCXN0cnVjdCBza19idWZmICAgICAgICAgICp0eHNrYjsKLQlzdHJ1Y3Qgc2tfYnVmZiAgICAgICAgICAqcnhza2I7Ci0Jc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7Ci0Jc3RydWN0IGRldmljZSAgICAgICAgICAgKmRldjsKLQlzdHJ1Y3QgaXJsYXBfY2IgICAgICAgICAqaXJsYXA7Ci0Jc3RydWN0IHFvc19pbmZvICAgICAgICAgcW9zOwotCi0JaW9idWZmX3QgICAgICAgICAgICAgICAgdHhfYnVmZjsKLQlpb2J1ZmZfdCAgICAgICAgICAgICAgICByeF9idWZmOwotCi0Jc3RydWN0IHdvcmtfc3RydWN0ICAgICAgd29yazsKLQlpbnQgICAgICAgICAgICAgICAgICAgICBtdHQ7Ci19OwotCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBTSVJfVUFSVF9HRVRfTFNSKHN0cnVjdCBiZmluX3Npcl9wb3J0ICpwb3J0KQotewotCXVuc2lnbmVkIGludCBsc3IgPSBiZmluX3JlYWQxNihwb3J0LT5tZW1iYXNlICsgT0ZGU0VUX0xTUik7Ci0JcG9ydC0+bHNyIHw9IChsc3IgJiAoQkl8RkV8UEV8T0UpKTsKLQlyZXR1cm4gbHNyIHwgcG9ydC0+bHNyOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgU0lSX1VBUlRfQ0xFQVJfTFNSKHN0cnVjdCBiZmluX3Npcl9wb3J0ICpwb3J0KQotewotCXBvcnQtPmxzciA9IDA7Ci0JYmZpbl9yZWFkMTYocG9ydC0+bWVtYmFzZSArIE9GRlNFVF9MU1IpOwotfQotCi0jZGVmaW5lIERSSVZFUl9OQU1FICJiZmluX3NpciIKLQotc3RhdGljIGludCBiZmluX3Npcl9od19pbml0KHZvaWQpCi17Ci0JaW50IHJldCA9IC1FTk9ERVY7Ci0jaWZkZWYgQ09ORklHX0JGSU5fU0lSMAotCXJldCA9IHBlcmlwaGVyYWxfcmVxdWVzdChQX1VBUlQwX1RYLCBEUklWRVJfTkFNRSk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQlyZXQgPSBwZXJpcGhlcmFsX3JlcXVlc3QoUF9VQVJUMF9SWCwgRFJJVkVSX05BTUUpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0jZW5kaWYKLQlyZXR1cm4gcmV0OwotfQpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2luY2x1ZGUvbWFjaC9ibGFja2Zpbi5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2luY2x1ZGUvbWFjaC9ibGFja2Zpbi5oCmluZGV4IGQ4MDk3MWIuLjA0NTE4NGYgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9pbmNsdWRlL21hY2gvYmxhY2tmaW4uaAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvaW5jbHVkZS9tYWNoL2JsYWNrZmluLmgKQEAgLTQ0LDYgKzQ0LDEzIEBACiAKICNkZWZpbmUgQkZJTl9VQVJUX05SX1BPUlRTICAgICAgMQogCisjZGVmaW5lIENIX1VBUlRfUlggQ0hfVUFSVDBfUlgKKyNkZWZpbmUgQ0hfVUFSVF9UWCBDSF9VQVJUMF9UWAorCisjZGVmaW5lIElSUV9VQVJUX0VSUk9SIElSUV9VQVJUMF9FUlJPUgorI2RlZmluZSBJUlFfVUFSVF9SWCAgICBJUlFfVUFSVDBfUlgKKyNkZWZpbmUgSVJRX1VBUlRfVFggICAgSVJRX1VBUlQwX1RYCisKICNkZWZpbmUgT0ZGU0VUX1RIUiAgICAgICAgICAgICAgMHgwMAkvKiBUcmFuc21pdCBIb2xkaW5nIHJlZ2lzdGVyICAgICAgICAgICAgKi8KICNkZWZpbmUgT0ZGU0VUX1JCUiAgICAgICAgICAgICAgMHgwMAkvKiBSZWNlaXZlIEJ1ZmZlciByZWdpc3RlciAgICAgICAgICAgICAgKi8KICNkZWZpbmUgT0ZGU0VUX0RMTCAgICAgICAgICAgICAgMHgwMAkvKiBEaXZpc29yIExhdGNoIChMb3ctQnl0ZSkgICAgICAgICAgICAgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9pbmNsdWRlL21hY2gvY2RlZkJGNTMyLmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvaW5jbHVkZS9tYWNoL2NkZWZCRjUzMi5oCmluZGV4IDNkODk3OGEuLmJiYzNjODMgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9pbmNsdWRlL21hY2gvY2RlZkJGNTMyLmgKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2luY2x1ZGUvbWFjaC9jZGVmQkY1MzIuaApAQCAtMzksMzEgKzM5LDggQEAKIC8qaW5jbHVkZSBjb3JlIHNwZWNpZmljIHJlZ2lzdGVyIHBvaW50ZXIgZGVmaW5pdGlvbnMqLwogI2luY2x1ZGUgPGFzbS9jZGVmX0xQQmxhY2tmaW4uaD4KIAotI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KLQogLyogQ2xvY2sgYW5kIFN5c3RlbSBDb250cm9sICgweEZGQzAgMDQwMC0weEZGQzAgMDdGRikgKi8KICNkZWZpbmUgYmZpbl9yZWFkX1BMTF9DVEwoKSAgICAgICAgICAgICAgICAgIGJmaW5fcmVhZDE2KFBMTF9DVEwpCi0vKiBXcml0aW5nIHRvIFBMTF9DVEwgaW5pdGlhdGVzIGEgUExMIHJlbG9jayBzZXF1ZW5jZS4gKi8KLXN0YXRpYyBfX2lubGluZV9fIHZvaWQgYmZpbl93cml0ZV9QTExfQ1RMKHVuc2lnbmVkIGludCB2YWwpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFncywgaXdyOwotCi0JaWYgKHZhbCA9PSBiZmluX3JlYWRfUExMX0NUTCgpKQotCQlyZXR1cm47Ci0KLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0JLyogRW5hYmxlIHRoZSBQTEwgV2FrZXVwIGJpdCBpbiBTSUMgSVdSICovCi0JaXdyID0gYmZpbl9yZWFkMzIoU0lDX0lXUik7Ci0JLyogT25seSBhbGxvdyBQUEwgV2FrZXVwKSAqLwotCWJmaW5fd3JpdGUzMihTSUNfSVdSLCBJV1JfRU5BQkxFKDApKTsKLQotCWJmaW5fd3JpdGUxNihQTExfQ1RMLCB2YWwpOwotCVNTWU5DKCk7Ci0JYXNtKCJJRExFOyIpOwotCi0JYmZpbl93cml0ZTMyKFNJQ19JV1IsIGl3cik7Ci0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotfQogI2RlZmluZSBiZmluX3JlYWRfUExMX1NUQVQoKSAgICAgICAgICAgICAgICAgYmZpbl9yZWFkMTYoUExMX1NUQVQpCiAjZGVmaW5lIGJmaW5fd3JpdGVfUExMX1NUQVQodmFsKSAgICAgICAgICAgICBiZmluX3dyaXRlMTYoUExMX1NUQVQsdmFsKQogI2RlZmluZSBiZmluX3JlYWRfUExMX0xPQ0tDTlQoKSAgICAgICAgICAgICAgYmZpbl9yZWFkMTYoUExMX0xPQ0tDTlQpCkBAIC03MiwyNyArNDksNiBAQAogI2RlZmluZSBiZmluX3JlYWRfUExMX0RJVigpICAgICAgICAgICAgICAgICAgYmZpbl9yZWFkMTYoUExMX0RJVikKICNkZWZpbmUgYmZpbl93cml0ZV9QTExfRElWKHZhbCkgICAgICAgICAgICAgIGJmaW5fd3JpdGUxNihQTExfRElWLHZhbCkKICNkZWZpbmUgYmZpbl9yZWFkX1ZSX0NUTCgpICAgICAgICAgICAgICAgICAgIGJmaW5fcmVhZDE2KFZSX0NUTCkKLS8qIFdyaXRpbmcgdG8gVlJfQ1RMIGluaXRpYXRlcyBhIFBMTCByZWxvY2sgc2VxdWVuY2UuICovCi1zdGF0aWMgX19pbmxpbmVfXyB2b2lkIGJmaW5fd3JpdGVfVlJfQ1RMKHVuc2lnbmVkIGludCB2YWwpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFncywgaXdyOwotCi0JaWYgKHZhbCA9PSBiZmluX3JlYWRfVlJfQ1RMKCkpCi0JCXJldHVybjsKLQotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQkvKiBFbmFibGUgdGhlIFBMTCBXYWtldXAgYml0IGluIFNJQyBJV1IgKi8KLQlpd3IgPSBiZmluX3JlYWQzMihTSUNfSVdSKTsKLQkvKiBPbmx5IGFsbG93IFBQTCBXYWtldXApICovCi0JYmZpbl93cml0ZTMyKFNJQ19JV1IsIElXUl9FTkFCTEUoMCkpOwotCi0JYmZpbl93cml0ZTE2KFZSX0NUTCwgdmFsKTsKLQlTU1lOQygpOwotCWFzbSgiSURMRTsiKTsKLQotCWJmaW5fd3JpdGUzMihTSUNfSVdSLCBpd3IpOwotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLX0KIAogLyogU3lzdGVtIEludGVycnVwdCBDb250cm9sbGVyICgweEZGQzAgMEMwMC0weEZGQzAgMEZGRikgKi8KICNkZWZpbmUgYmZpbl9yZWFkX1NXUlNUKCkgICAgICAgICAgICAgICAgICAgIGJmaW5fcmVhZDE2KFNXUlNUKQpAQCAtMTc4LDUwICsxMzQsNiBAQAogI2RlZmluZSBiZmluX3JlYWRfRklPX01BU0tCX1QoKSAgICAgICAgICAgICAgYmZpbl9yZWFkMTYoRklPX01BU0tCX1QpCiAjZGVmaW5lIGJmaW5fd3JpdGVfRklPX01BU0tCX1QodmFsKSAgICAgICAgICBiZmluX3dyaXRlMTYoRklPX01BU0tCX1QsdmFsKQogCi0KLSNpZiBBTk9NQUxZXzA1MDAwMzExCi0jZGVmaW5lIEJGSU5fV1JJVEVfRklPX0ZMQUcobmFtZSkgXAotc3RhdGljIF9faW5saW5lX18gdm9pZCBiZmluX3dyaXRlX0ZJT19GTEFHXyAjIyBuYW1lICh1bnNpZ25lZCBzaG9ydCB2YWwpXAote1wKLQl1bnNpZ25lZCBsb25nIGZsYWdzO1wKLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7XAotCWJmaW5fd3JpdGUxNihGSU9fRkxBR18gIyMgbmFtZSx2YWwpO1wKLQliZmluX3JlYWRfQ0hJUElEKCk7XAotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTtcCi19Ci1CRklOX1dSSVRFX0ZJT19GTEFHKEQpCi1CRklOX1dSSVRFX0ZJT19GTEFHKEMpCi1CRklOX1dSSVRFX0ZJT19GTEFHKFMpCi1CRklOX1dSSVRFX0ZJT19GTEFHKFQpCi0KLSNkZWZpbmUgQkZJTl9SRUFEX0ZJT19GTEFHKG5hbWUpIFwKLXN0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkIHNob3J0IGJmaW5fcmVhZF9GSU9fRkxBR18gIyMgbmFtZSAodm9pZClcCi17XAotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7XAotCXVuc2lnbmVkIHNob3J0IHJldDtcCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpO1wKLQlyZXQgPSBiZmluX3JlYWQxNihGSU9fRkxBR18gIyMgbmFtZSk7XAotCWJmaW5fcmVhZF9DSElQSUQoKTtcCi0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpO1wKLQlyZXR1cm4gcmV0O1wKLX0KLUJGSU5fUkVBRF9GSU9fRkxBRyhEKQotQkZJTl9SRUFEX0ZJT19GTEFHKEMpCi1CRklOX1JFQURfRklPX0ZMQUcoUykKLUJGSU5fUkVBRF9GSU9fRkxBRyhUKQotCi0jZWxzZQotI2RlZmluZSBiZmluX3dyaXRlX0ZJT19GTEFHX0QodmFsKSAgICAgICAgICAgYmZpbl93cml0ZTE2KEZJT19GTEFHX0QsdmFsKQotI2RlZmluZSBiZmluX3dyaXRlX0ZJT19GTEFHX0ModmFsKSAgICAgICAgICAgYmZpbl93cml0ZTE2KEZJT19GTEFHX0MsdmFsKQotI2RlZmluZSBiZmluX3dyaXRlX0ZJT19GTEFHX1ModmFsKSAgICAgICAgICAgYmZpbl93cml0ZTE2KEZJT19GTEFHX1MsdmFsKQotI2RlZmluZSBiZmluX3dyaXRlX0ZJT19GTEFHX1QodmFsKSAgICAgICAgICAgYmZpbl93cml0ZTE2KEZJT19GTEFHX1QsdmFsKQotI2RlZmluZSBiZmluX3JlYWRfRklPX0ZMQUdfVCgpICAgICAgICAgICAgICAgYmZpbl9yZWFkMTYoRklPX0ZMQUdfVCkKLSNkZWZpbmUgYmZpbl9yZWFkX0ZJT19GTEFHX0MoKSAgICAgICAgICAgICAgIGJmaW5fcmVhZDE2KEZJT19GTEFHX0MpCi0jZGVmaW5lIGJmaW5fcmVhZF9GSU9fRkxBR19TKCkgICAgICAgICAgICAgICBiZmluX3JlYWQxNihGSU9fRkxBR19TKQotI2RlZmluZSBiZmluX3JlYWRfRklPX0ZMQUdfRCgpICAgICAgICAgICAgICAgYmZpbl9yZWFkMTYoRklPX0ZMQUdfRCkKLSNlbmRpZgotCi0KIC8qIERNQSBDb250cm9sbGVyICovCiAjZGVmaW5lIGJmaW5fcmVhZF9ETUEwX0NPTkZJRygpICAgICAgICAgICAgICBiZmluX3JlYWQxNihETUEwX0NPTkZJRykKICNkZWZpbmUgYmZpbl93cml0ZV9ETUEwX0NPTkZJRyh2YWwpICAgICAgICAgIGJmaW5fd3JpdGUxNihETUEwX0NPTkZJRyx2YWwpCkBAIC03NjQsNCArNjc2LDkzIEBACiAjZGVmaW5lIGJmaW5fcmVhZF9QUElfRlJBTUUoKSAgICAgICAgICAgICAgICBiZmluX3JlYWQxNihQUElfRlJBTUUpCiAjZGVmaW5lIGJmaW5fd3JpdGVfUFBJX0ZSQU1FKHZhbCkgICAgICAgICAgICBiZmluX3dyaXRlMTYoUFBJX0ZSQU1FLHZhbCkKIAorLyogVGhlc2UgbmVlZCB0byBiZSBsYXN0IGR1ZSB0byB0aGUgY2RlZi9saW51eCBpbnRlci1kZXBlbmRlbmNpZXMgKi8KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisKKyNpZiBBTk9NQUxZXzA1MDAwMzExCisjZGVmaW5lIEJGSU5fV1JJVEVfRklPX0ZMQUcobmFtZSkgXAorc3RhdGljIGlubGluZSB2b2lkIGJmaW5fd3JpdGVfRklPX0ZMQUdfIyNuYW1lKHVuc2lnbmVkIHNob3J0IHZhbCkgXAoreyBcCisJdW5zaWduZWQgbG9uZyBmbGFnczsgXAorCWxvY2FsX2lycV9zYXZlX2h3KGZsYWdzKTsgXAorCWJmaW5fd3JpdGUxNihGSU9fRkxBR18jI25hbWUsIHZhbCk7IFwKKwliZmluX3JlYWRfQ0hJUElEKCk7IFwKKwlsb2NhbF9pcnFfcmVzdG9yZV9odyhmbGFncyk7IFwKK30KK0JGSU5fV1JJVEVfRklPX0ZMQUcoRCkKK0JGSU5fV1JJVEVfRklPX0ZMQUcoQykKK0JGSU5fV1JJVEVfRklPX0ZMQUcoUykKK0JGSU5fV1JJVEVfRklPX0ZMQUcoVCkKKworI2RlZmluZSBCRklOX1JFQURfRklPX0ZMQUcobmFtZSkgXAorc3RhdGljIGlubGluZSB1MTYgYmZpbl9yZWFkX0ZJT19GTEFHXyMjbmFtZSh2b2lkKSBcCit7IFwKKwl1bnNpZ25lZCBsb25nIGZsYWdzOyBcCisJdTE2IHJldDsgXAorCWxvY2FsX2lycV9zYXZlX2h3KGZsYWdzKTsgXAorCXJldCA9IGJmaW5fcmVhZDE2KEZJT19GTEFHXyMjbmFtZSk7IFwKKwliZmluX3JlYWRfQ0hJUElEKCk7IFwKKwlsb2NhbF9pcnFfcmVzdG9yZV9odyhmbGFncyk7IFwKKwlyZXR1cm4gcmV0OyBcCit9CitCRklOX1JFQURfRklPX0ZMQUcoRCkKK0JGSU5fUkVBRF9GSU9fRkxBRyhDKQorQkZJTl9SRUFEX0ZJT19GTEFHKFMpCitCRklOX1JFQURfRklPX0ZMQUcoVCkKKworI2Vsc2UKKyNkZWZpbmUgYmZpbl93cml0ZV9GSU9fRkxBR19EKHZhbCkgICAgICAgICAgIGJmaW5fd3JpdGUxNihGSU9fRkxBR19ELCB2YWwpCisjZGVmaW5lIGJmaW5fd3JpdGVfRklPX0ZMQUdfQyh2YWwpICAgICAgICAgICBiZmluX3dyaXRlMTYoRklPX0ZMQUdfQywgdmFsKQorI2RlZmluZSBiZmluX3dyaXRlX0ZJT19GTEFHX1ModmFsKSAgICAgICAgICAgYmZpbl93cml0ZTE2KEZJT19GTEFHX1MsIHZhbCkKKyNkZWZpbmUgYmZpbl93cml0ZV9GSU9fRkxBR19UKHZhbCkgICAgICAgICAgIGJmaW5fd3JpdGUxNihGSU9fRkxBR19ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9GSU9fRkxBR19UKCkgICAgICAgICAgICAgICBiZmluX3JlYWQxNihGSU9fRkxBR19UKQorI2RlZmluZSBiZmluX3JlYWRfRklPX0ZMQUdfQygpICAgICAgICAgICAgICAgYmZpbl9yZWFkMTYoRklPX0ZMQUdfQykKKyNkZWZpbmUgYmZpbl9yZWFkX0ZJT19GTEFHX1MoKSAgICAgICAgICAgICAgIGJmaW5fcmVhZDE2KEZJT19GTEFHX1MpCisjZGVmaW5lIGJmaW5fcmVhZF9GSU9fRkxBR19EKCkgICAgICAgICAgICAgICBiZmluX3JlYWQxNihGSU9fRkxBR19EKQorI2VuZGlmCisKKy8qIFdyaXRpbmcgdG8gUExMX0NUTCBpbml0aWF0ZXMgYSBQTEwgcmVsb2NrIHNlcXVlbmNlLiAqLworc3RhdGljIF9faW5saW5lX18gdm9pZCBiZmluX3dyaXRlX1BMTF9DVEwodW5zaWduZWQgaW50IHZhbCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzLCBpd3I7CisKKwlpZiAodmFsID09IGJmaW5fcmVhZF9QTExfQ1RMKCkpCisJCXJldHVybjsKKworCWxvY2FsX2lycV9zYXZlX2h3KGZsYWdzKTsKKwkvKiBFbmFibGUgdGhlIFBMTCBXYWtldXAgYml0IGluIFNJQyBJV1IgKi8KKwlpd3IgPSBiZmluX3JlYWQzMihTSUNfSVdSKTsKKwkvKiBPbmx5IGFsbG93IFBQTCBXYWtldXApICovCisJYmZpbl93cml0ZTMyKFNJQ19JV1IsIElXUl9FTkFCTEUoMCkpOworCisJYmZpbl93cml0ZTE2KFBMTF9DVEwsIHZhbCk7CisJU1NZTkMoKTsKKwlhc20oIklETEU7Iik7CisKKwliZmluX3dyaXRlMzIoU0lDX0lXUiwgaXdyKTsKKwlsb2NhbF9pcnFfcmVzdG9yZV9odyhmbGFncyk7Cit9CisKKy8qIFdyaXRpbmcgdG8gVlJfQ1RMIGluaXRpYXRlcyBhIFBMTCByZWxvY2sgc2VxdWVuY2UuICovCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIGJmaW5fd3JpdGVfVlJfQ1RMKHVuc2lnbmVkIGludCB2YWwpCit7CisJdW5zaWduZWQgbG9uZyBmbGFncywgaXdyOworCisJaWYgKHZhbCA9PSBiZmluX3JlYWRfVlJfQ1RMKCkpCisJCXJldHVybjsKKworCWxvY2FsX2lycV9zYXZlX2h3KGZsYWdzKTsKKwkvKiBFbmFibGUgdGhlIFBMTCBXYWtldXAgYml0IGluIFNJQyBJV1IgKi8KKwlpd3IgPSBiZmluX3JlYWQzMihTSUNfSVdSKTsKKwkvKiBPbmx5IGFsbG93IFBQTCBXYWtldXApICovCisJYmZpbl93cml0ZTMyKFNJQ19JV1IsIElXUl9FTkFCTEUoMCkpOworCisJYmZpbl93cml0ZTE2KFZSX0NUTCwgdmFsKTsKKwlTU1lOQygpOworCWFzbSgiSURMRTsiKTsKKworCWJmaW5fd3JpdGUzMihTSUNfSVdSLCBpd3IpOworCWxvY2FsX2lycV9yZXN0b3JlX2h3KGZsYWdzKTsKK30KKwogI2VuZGlmCQkJCS8qIF9DREVGX0JGNTMyX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9pbmNsdWRlL21hY2gvZG1hLmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvaW5jbHVkZS9tYWNoL2RtYS5oCmluZGV4IGJkOWQ1ZTkuLmZiMzQ5MzQgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9pbmNsdWRlL21hY2gvZG1hLmgKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2luY2x1ZGUvbWFjaC9kbWEuaApAQCAtMSw0MiArMSwxNCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICBCRi01MzMvMi8xIFNwZWNpZmljIERlY2xhcmF0aW9ucwotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBGaWxlOiAgICAgICAgIGluY2x1ZGUvYXNtLWJsYWNrZmluL21hY2gtYmY1MzMvZG1hLmgKLSAqIEJhc2VkIG9uOgotICogQXV0aG9yOgorLyogbWFjaC9kbWEuaCAtIGFyY2gtc3BlY2lmaWMgRE1BIGRlZmluZXMKICAqCi0gKiBDcmVhdGVkOgotICogRGVzY3JpcHRpb246CisgKiBDb3B5cmlnaHQgMjAwNC0yMDA4IEFuYWxvZyBEZXZpY2VzIEluYy4KICAqCi0gKiBSZXY6Ci0gKgotICogTW9kaWZpZWQ6Ci0gKgotICogQnVnczogICAgICAgICBFbnRlciBidWdzIGF0IGh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZy8KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAqIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4KLSAqIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCiAgKi8KIAogI2lmbmRlZiBfTUFDSF9ETUFfSF8KICNkZWZpbmUgX01BQ0hfRE1BX0hfCiAKLSNkZWZpbmUgTUFYX0JMQUNLRklOX0RNQV9DSEFOTkVMIDEyCisjZGVmaW5lIE1BWF9ETUFfQ0hBTk5FTFMgMTIKIAogI2RlZmluZSBDSF9QUEkgICAgICAgICAgMAogI2RlZmluZSBDSF9TUE9SVDBfUlggICAgMQpAQCAtNDQsOCArMTYsOCBAQAogI2RlZmluZSBDSF9TUE9SVDFfUlggICAgMwogI2RlZmluZSBDSF9TUE9SVDFfVFggICAgNAogI2RlZmluZSBDSF9TUEkgICAgICAgICAgNQotI2RlZmluZSBDSF9VQVJUX1JYICAgICAgNgotI2RlZmluZSBDSF9VQVJUX1RYICAgICAgNworI2RlZmluZSBDSF9VQVJUMF9SWCAgICAgNgorI2RlZmluZSBDSF9VQVJUMF9UWCAgICAgNwogI2RlZmluZSBDSF9NRU1fU1RSRUFNMF9ERVNUICAgICA4CSAvKiBUWCAqLwogI2RlZmluZSBDSF9NRU1fU1RSRUFNMF9TUkMgICAgICA5CSAvKiBSWCAqLwogI2RlZmluZSBDSF9NRU1fU1RSRUFNMV9ERVNUICAgICAxMAkgLyogVFggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9pbmNsdWRlL21hY2gvZ3Bpby5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2luY2x1ZGUvbWFjaC9ncGlvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQ1YzE3MAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9pbmNsdWRlL21hY2gvZ3Bpby5oCkBAIC0wLDAgKzEsMzQgQEAKKy8qCisgKiBGaWxlOiBhcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvaW5jbHVkZS9tYWNoL2dwaW8uaAorICogQnVnczogRW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA4IEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KKyAqLworCisKKyNpZm5kZWYgX01BQ0hfR1BJT19IXworI2RlZmluZSBfTUFDSF9HUElPX0hfCisKKyNkZWZpbmUgTUFYX0JMQUNLRklOX0dQSU9TIDE2CisKKyNkZWZpbmUJR1BJT19QRjAJMAorI2RlZmluZQlHUElPX1BGMQkxCisjZGVmaW5lCUdQSU9fUEYyCTIKKyNkZWZpbmUJR1BJT19QRjMJMworI2RlZmluZQlHUElPX1BGNAk0CisjZGVmaW5lCUdQSU9fUEY1CTUKKyNkZWZpbmUJR1BJT19QRjYJNgorI2RlZmluZQlHUElPX1BGNwk3CisjZGVmaW5lCUdQSU9fUEY4CTgKKyNkZWZpbmUJR1BJT19QRjkJOQorI2RlZmluZQlHUElPX1BGMTAJMTAKKyNkZWZpbmUJR1BJT19QRjExCTExCisjZGVmaW5lCUdQSU9fUEYxMgkxMgorI2RlZmluZQlHUElPX1BGMTMJMTMKKyNkZWZpbmUJR1BJT19QRjE0CTE0CisjZGVmaW5lCUdQSU9fUEYxNQkxNQorCisjZGVmaW5lIFBPUlRfRiBHUElPX1BGMAorCisjZW5kaWYgLyogX01BQ0hfR1BJT19IXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2luY2x1ZGUvbWFjaC9pcnEuaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9pbmNsdWRlL21hY2gvaXJxLmgKaW5kZXggNWFhMzhlNS4uZGIxZTM0NiAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2luY2x1ZGUvbWFjaC9pcnEuaAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvaW5jbHVkZS9tYWNoL2lycS5oCkBAIC05MCwxOSArOTAsMTkgQEAKICNkZWZpbmUJSVJRX1NQT1JUMF9FUlJPUgkxMAkvKlNQT1JUMCBFcnJvciBJbnRlcnJ1cHQgKi8KICNkZWZpbmUJSVJRX1NQT1JUMV9FUlJPUgkxMQkvKlNQT1JUMSBFcnJvciBJbnRlcnJ1cHQgKi8KICNkZWZpbmUJSVJRX1NQSV9FUlJPUgkJMTIJLypTUEkgRXJyb3IgSW50ZXJydXB0ICovCi0jZGVmaW5lCUlSUV9VQVJUX0VSUk9SCQkxMwkvKlVBUlQgRXJyb3IgSW50ZXJydXB0ICovCisjZGVmaW5lCUlSUV9VQVJUMF9FUlJPUgkJMTMJLypVQVJUIEVycm9yIEludGVycnVwdCAqLwogI2RlZmluZQlJUlFfUlRDCQkJMTQJLypSVEMgSW50ZXJydXB0ICovCiAjZGVmaW5lCUlSUV9QUEkJCQkxNQkvKkRNQTAgSW50ZXJydXB0IChQUEkpICovCiAjZGVmaW5lCUlSUV9TUE9SVDBfUlgJCTE2CS8qRE1BMSBJbnRlcnJ1cHQgKFNQT1JUMCBSWCkgKi8KICNkZWZpbmUJSVJRX1NQT1JUMF9UWAkJMTcJLypETUEyIEludGVycnVwdCAoU1BPUlQwIFRYKSAqLwogI2RlZmluZQlJUlFfU1BPUlQxX1JYCQkxOAkvKkRNQTMgSW50ZXJydXB0IChTUE9SVDEgUlgpICovCiAjZGVmaW5lCUlSUV9TUE9SVDFfVFgJCTE5CS8qRE1BNCBJbnRlcnJ1cHQgKFNQT1JUMSBUWCkgKi8KLSNkZWZpbmUgCUlSUV9TUEkJCQkyMAkvKkRNQTUgSW50ZXJydXB0IChTUEkpICovCi0jZGVmaW5lCUlSUV9VQVJUX1JYCQkyMQkvKkRNQTYgSW50ZXJydXB0IChVQVJUIFJYKSAqLwotI2RlZmluZQlJUlFfVUFSVF9UWAkJMjIJLypETUE3IEludGVycnVwdCAoVUFSVCBUWCkgKi8KLSNkZWZpbmUJSVJRX1RNUjAJCTIzCS8qVGltZXIgMCAqLwotI2RlZmluZQlJUlFfVE1SMQkJMjQJLypUaW1lciAxICovCi0jZGVmaW5lCUlSUV9UTVIyCQkyNQkvKlRpbWVyIDIgKi8KKyNkZWZpbmUJSVJRX1NQSQkJCTIwCS8qRE1BNSBJbnRlcnJ1cHQgKFNQSSkgKi8KKyNkZWZpbmUJSVJRX1VBUlQwX1JYCQkyMQkvKkRNQTYgSW50ZXJydXB0IChVQVJUIFJYKSAqLworI2RlZmluZQlJUlFfVUFSVDBfVFgJCTIyCS8qRE1BNyBJbnRlcnJ1cHQgKFVBUlQgVFgpICovCisjZGVmaW5lCUlSUV9USU1FUjAJCTIzCS8qVGltZXIgMCAqLworI2RlZmluZQlJUlFfVElNRVIxCQkyNAkvKlRpbWVyIDEgKi8KKyNkZWZpbmUJSVJRX1RJTUVSMgkJMjUJLypUaW1lciAyICovCiAjZGVmaW5lCUlSUV9QUk9HX0lOVEEJCTI2CS8qUHJvZ3JhbW1hYmxlIEZsYWdzIEEgKDgpICovCiAjZGVmaW5lCUlSUV9QUk9HX0lOVEIJCTI3CS8qUHJvZ3JhbW1hYmxlIEZsYWdzIEIgKDgpICovCiAjZGVmaW5lCUlSUV9NRU1fRE1BMAkJMjgJLypETUE4LzkgSW50ZXJydXB0IChNZW1vcnkgRE1BIFN0cmVhbSAwKSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2luY2x1ZGUvbWFjaC9tZW1faW5pdC5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2luY2x1ZGUvbWFjaC9tZW1faW5pdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDIwMzRiLi4wMDAwMDAwCi0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9pbmNsdWRlL21hY2gvbWVtX2luaXQuaAorKysgL2Rldi9udWxsCkBAIC0xLDI5NyArMCwwIEBACi0vKgotICogRmlsZTogICAgICAgICBpbmNsdWRlL2FzbS1ibGFja2Zpbi9tYWNoLWJmNTMzL21lbV9pbml0LmgKLSAqIEJhc2VkIG9uOgotICogQXV0aG9yOgotICoKLSAqIENyZWF0ZWQ6Ci0gKiBEZXNjcmlwdGlvbjoKLSAqCi0gKiBSZXY6Ci0gKgotICogTW9kaWZpZWQ6Ci0gKiAgICAgICAgICAgICAgIENvcHlyaWdodCAyMDA0LTIwMDYgQW5hbG9nIERldmljZXMgSW5jLgotICoKLSAqIEJ1Z3M6ICAgICAgICAgRW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gKiBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuCi0gKiBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotICovCi0KLSNpZiAoQ09ORklHX01FTV9NVDQ4TEMxNk0xNkEyVEdfNzUgfHwgQ09ORklHX01FTV9NVDQ4TEM2NE00QTJGQl83RSB8fCBcCi0gICAgIENPTkZJR19NRU1fTVQ0OExDMzJNMTZBMlRHXzc1IHx8IENPTkZJR19NRU1fR0VORVJJQ19CT0FSRCkKLSNpZiAoQ09ORklHX1NDTEtfSFogPiAxMTk0MDI5ODUpCi0jZGVmaW5lIFNEUkFNX3RSUCAgICAgICBUUlBfMgotI2RlZmluZSBTRFJBTV90UlBfbnVtICAgMgotI2RlZmluZSBTRFJBTV90UkFTICAgICAgVFJBU183Ci0jZGVmaW5lIFNEUkFNX3RSQVNfbnVtICA3Ci0jZGVmaW5lIFNEUkFNX3RSQ0QgICAgICBUUkNEXzIKLSNkZWZpbmUgU0RSQU1fdFdSICAgICAgIFRXUl8yCi0jZW5kaWYKLSNpZiAoQ09ORklHX1NDTEtfSFogPiAxMDQ0Nzc2MTIpICYmIChDT05GSUdfU0NMS19IWiA8PSAxMTk0MDI5ODUpCi0jZGVmaW5lIFNEUkFNX3RSUCAgICAgICBUUlBfMgotI2RlZmluZSBTRFJBTV90UlBfbnVtICAgMgotI2RlZmluZSBTRFJBTV90UkFTICAgICAgVFJBU182Ci0jZGVmaW5lIFNEUkFNX3RSQVNfbnVtICA2Ci0jZGVmaW5lIFNEUkFNX3RSQ0QgICAgICBUUkNEXzIKLSNkZWZpbmUgU0RSQU1fdFdSICAgICAgIFRXUl8yCi0jZW5kaWYKLSNpZiAoQ09ORklHX1NDTEtfSFogPiA4OTU1MjIzOSkgJiYgKENPTkZJR19TQ0xLX0haIDw9IDEwNDQ3NzYxMikKLSNkZWZpbmUgU0RSQU1fdFJQICAgICAgIFRSUF8yCi0jZGVmaW5lIFNEUkFNX3RSUF9udW0gICAyCi0jZGVmaW5lIFNEUkFNX3RSQVMgICAgICBUUkFTXzUKLSNkZWZpbmUgU0RSQU1fdFJBU19udW0gIDUKLSNkZWZpbmUgU0RSQU1fdFJDRCAgICAgIFRSQ0RfMgotI2RlZmluZSBTRFJBTV90V1IgICAgICAgVFdSXzIKLSNlbmRpZgotI2lmIChDT05GSUdfU0NMS19IWiA+IDc0NjI2ODY2KSAmJiAoQ09ORklHX1NDTEtfSFogPD0gODk1NTIyMzkpCi0jZGVmaW5lIFNEUkFNX3RSUCAgICAgICBUUlBfMgotI2RlZmluZSBTRFJBTV90UlBfbnVtICAgMgotI2RlZmluZSBTRFJBTV90UkFTICAgICAgVFJBU180Ci0jZGVmaW5lIFNEUkFNX3RSQVNfbnVtICA0Ci0jZGVmaW5lIFNEUkFNX3RSQ0QgICAgICBUUkNEXzIKLSNkZWZpbmUgU0RSQU1fdFdSICAgICAgIFRXUl8yCi0jZW5kaWYKLSNpZiAoQ09ORklHX1NDTEtfSFogPiA2NjY2NjY2NykgJiYgKENPTkZJR19TQ0xLX0haIDw9IDc0NjI2ODY2KQotI2RlZmluZSBTRFJBTV90UlAgICAgICAgVFJQXzIKLSNkZWZpbmUgU0RSQU1fdFJQX251bSAgIDIKLSNkZWZpbmUgU0RSQU1fdFJBUyAgICAgIFRSQVNfMwotI2RlZmluZSBTRFJBTV90UkFTX251bSAgMwotI2RlZmluZSBTRFJBTV90UkNEICAgICAgVFJDRF8yCi0jZGVmaW5lIFNEUkFNX3RXUiAgICAgICBUV1JfMgotI2VuZGlmCi0jaWYgKENPTkZJR19TQ0xLX0haID4gNTk3MDE0OTMpICYmIChDT05GSUdfU0NMS19IWiA8PSA2NjY2NjY2NykKLSNkZWZpbmUgU0RSQU1fdFJQICAgICAgIFRSUF8xCi0jZGVmaW5lIFNEUkFNX3RSUF9udW0gICAxCi0jZGVmaW5lIFNEUkFNX3RSQVMgICAgICBUUkFTXzQKLSNkZWZpbmUgU0RSQU1fdFJBU19udW0gIDMKLSNkZWZpbmUgU0RSQU1fdFJDRCAgICAgIFRSQ0RfMQotI2RlZmluZSBTRFJBTV90V1IgICAgICAgVFdSXzIKLSNlbmRpZgotI2lmIChDT05GSUdfU0NMS19IWiA+IDQ0Nzc2MTE5KSAmJiAoQ09ORklHX1NDTEtfSFogPD0gNTk3MDE0OTMpCi0jZGVmaW5lIFNEUkFNX3RSUCAgICAgICBUUlBfMQotI2RlZmluZSBTRFJBTV90UlBfbnVtICAgMQotI2RlZmluZSBTRFJBTV90UkFTICAgICAgVFJBU18zCi0jZGVmaW5lIFNEUkFNX3RSQVNfbnVtICAzCi0jZGVmaW5lIFNEUkFNX3RSQ0QgICAgICBUUkNEXzEKLSNkZWZpbmUgU0RSQU1fdFdSICAgICAgIFRXUl8yCi0jZW5kaWYKLSNpZiAoQ09ORklHX1NDTEtfSFogPiAyOTg1MDc0NikgJiYgKENPTkZJR19TQ0xLX0haIDw9IDQ0Nzc2MTE5KQotI2RlZmluZSBTRFJBTV90UlAgICAgICAgVFJQXzEKLSNkZWZpbmUgU0RSQU1fdFJQX251bSAgIDEKLSNkZWZpbmUgU0RSQU1fdFJBUyAgICAgIFRSQVNfMgotI2RlZmluZSBTRFJBTV90UkFTX251bSAgMgotI2RlZmluZSBTRFJBTV90UkNEICAgICAgVFJDRF8xCi0jZGVmaW5lIFNEUkFNX3RXUiAgICAgICBUV1JfMgotI2VuZGlmCi0jaWYgKENPTkZJR19TQ0xLX0haIDw9IDI5ODUwNzQ2KQotI2RlZmluZSBTRFJBTV90UlAgICAgICAgVFJQXzEKLSNkZWZpbmUgU0RSQU1fdFJQX251bSAgIDEKLSNkZWZpbmUgU0RSQU1fdFJBUyAgICAgIFRSQVNfMQotI2RlZmluZSBTRFJBTV90UkFTX251bSAgMQotI2RlZmluZSBTRFJBTV90UkNEICAgICAgVFJDRF8xCi0jZGVmaW5lIFNEUkFNX3RXUiAgICAgICBUV1JfMgotI2VuZGlmCi0jZW5kaWYKLQotI2lmIChDT05GSUdfTUVNX01UNDhMQzE2TTE2QTJUR183NSkKLSAgLypTRFJBTSBJTkZPUk1BVElPTjogKi8KLSNkZWZpbmUgU0RSQU1fVHJlZiAgNjQJCS8qIFJlZnJlc2ggcGVyaW9kIGluIG1pbGxpc2Vjb25kcyAgICovCi0jZGVmaW5lIFNEUkFNX05SQSAgIDgxOTIJLyogTnVtYmVyIG9mIHJvdyBhZGRyZXNzZXMgaW4gU0RSQU0gKi8KLSNkZWZpbmUgU0RSQU1fQ0wgICAgQ0xfMwotI2VuZGlmCi0KLSNpZiAoQ09ORklHX01FTV9NVDQ4TEM2NE00QTJGQl83RSkKLSAgLypTRFJBTSBJTkZPUk1BVElPTjogKi8KLSNkZWZpbmUgU0RSQU1fVHJlZiAgNjQJCS8qIFJlZnJlc2ggcGVyaW9kIGluIG1pbGxpc2Vjb25kcyAgICovCi0jZGVmaW5lIFNEUkFNX05SQSAgIDgxOTIJLyogTnVtYmVyIG9mIHJvdyBhZGRyZXNzZXMgaW4gU0RSQU0gKi8KLSNkZWZpbmUgU0RSQU1fQ0wgICAgQ0xfMwotI2VuZGlmCi0KLSNpZiAoQ09ORklHX01FTV9NVDQ4TEMzMk0xNkEyVEdfNzUpCi0gIC8qU0RSQU0gSU5GT1JNQVRJT046ICovCi0jZGVmaW5lIFNEUkFNX1RyZWYgIDY0CQkvKiBSZWZyZXNoIHBlcmlvZCBpbiBtaWxsaXNlY29uZHMgICAqLwotI2RlZmluZSBTRFJBTV9OUkEgICA4MTkyCS8qIE51bWJlciBvZiByb3cgYWRkcmVzc2VzIGluIFNEUkFNICovCi0jZGVmaW5lIFNEUkFNX0NMICAgIENMXzMKLSNlbmRpZgotCi0jaWYgKENPTkZJR19NRU1fR0VORVJJQ19CT0FSRCkKLSAgLypTRFJBTSBJTkZPUk1BVElPTjogTW9kaWZ5IHRoaXMgZm9yIHlvdXIgYm9hcmQgKi8KLSNkZWZpbmUgU0RSQU1fVHJlZiAgNjQJCS8qIFJlZnJlc2ggcGVyaW9kIGluIG1pbGxpc2Vjb25kcyAgICovCi0jZGVmaW5lIFNEUkFNX05SQSAgIDgxOTIJLyogTnVtYmVyIG9mIHJvdyBhZGRyZXNzZXMgaW4gU0RSQU0gKi8KLSNkZWZpbmUgU0RSQU1fQ0wgICAgQ0xfMwotI2VuZGlmCi0KLS8qIEVxdWF0aW9uIGZyb20gc2VjdGlvbiAxNyAocDE3LTQ2KSBvZiBCRjUzMyBIUk0gKi8KLSNkZWZpbmUgbWVtX1NEUlJDICAgICAgICgoKENPTkZJR19TQ0xLX0haIC8gMTAwMCkgKiBTRFJBTV9UcmVmKSAgLyBTRFJBTV9OUkEpIC0gKFNEUkFNX3RSQVNfbnVtICsgU0RSQU1fdFJQX251bSkKLQotLyogRW5hYmxlIFNDTEsgT3V0ICovCi0jZGVmaW5lIG1lbV9TREdDVEwgICAgICAgIChTQ1RMRSB8IFNEUkFNX0NMIHwgU0RSQU1fdFJBUyB8IFNEUkFNX3RSUCB8IFNEUkFNX3RSQ0QgfCBTRFJBTV90V1IgfCBQU1MpCi0KLSNpZiBkZWZpbmVkIENPTkZJR19DTEtJTl9IQUxGCi0jZGVmaW5lIENMS0lOX0hBTEYgICAgICAgMQotI2Vsc2UKLSNkZWZpbmUgQ0xLSU5fSEFMRiAgICAgICAwCi0jZW5kaWYKLQotI2lmIGRlZmluZWQgQ09ORklHX1BMTF9CWVBBU1MKLSNkZWZpbmUgUExMX0JZUEFTUyAgICAgIDEKLSNlbHNlCi0jZGVmaW5lIFBMTF9CWVBBU1MgICAgICAgMAotI2VuZGlmCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipDdXJyZW50bHkgTm90IEJlaW5nIFVzZWQgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTF9XQVQgICgoQ09ORklHX0ZMQVNIX1NQRUVEX0JXQVQgKiA0KSAvICg0MDAwMDAwMDAwIC8gQ09ORklHX1NDTEtfSFopKSArIDEKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVExfUkFUICAoKENPTkZJR19GTEFTSF9TUEVFRF9CUkFUICogNCkgLyAoNDAwMDAwMDAwMCAvIENPTkZJR19TQ0xLX0haKSkgKyAxCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMX0hUICAgKChDT05GSUdfRkxBU0hfU1BFRURfQkhUICAqIDQpIC8gKDQwMDAwMDAwMDAgLyBDT05GSUdfU0NMS19IWikpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMX1NUICAgKChDT05GSUdfRkxBU0hfU1BFRURfQlNUICAqIDQpIC8gKDQwMDAwMDAwMDAgLyBDT05GSUdfU0NMS19IWikpICsgMQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTF9UVCAgICgoQ09ORklHX0ZMQVNIX1NQRUVEX0JUVCAgKiA0KSAvICg0MDAwMDAwMDAwIC8gQ09ORklHX1NDTEtfSFopKSArIDEKLQotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9UVCA+IDMpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9UVCAgIEIwVFRfNAotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1RUID09IDMpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9UVCAgIEIwVFRfMwotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1RUID09IDIpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9UVCAgIEIwVFRfMgotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1RUIDwgMikKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1RUICAgQjBUVF8xCi0jZW5kaWYKLQotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9TVCA+IDMpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9TVCAgIEIwU1RfNAotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1NUID09IDMpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9TVCAgIEIwU1RfMwotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1NUID09IDIpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9TVCAgIEIwU1RfMgotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1NUIDwgMikKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1NUICAgQjBTVF8xCi0jZW5kaWYKLQotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9IVCA+IDIpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9IVCAgIEIwSFRfMwotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX0hUID09IDIpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9IVCAgIEIwSFRfMgotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX0hUID09IDEpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9IVCAgIEIwSFRfMQotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX0hUID09IDAgJiYgQ09ORklHX0ZMQVNIX1NQRUVEX0JIVCA9PSAwKQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfSFQgICBCMEhUXzAKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9IVCA9PSAwICYmIENPTkZJR19GTEFTSF9TUEVFRF9CSFQgIT0gMCkKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX0hUICAgQjBIVF8xCi0jZW5kaWYKLQotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9XQVQgPiAxNCkKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1dBVCAgQjBXQVRfMTUKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9XQVQgPT0gMTQpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9XQVQgIEIwV0FUXzE0Ci0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfV0FUID09IDEzKQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfV0FUICBCMFdBVF8xMwotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1dBVCA9PSAxMikKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1dBVCAgQjBXQVRfMTIKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9XQVQgPT0gMTEpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9XQVQgIEIwV0FUXzExCi0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfV0FUID09IDEwKQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfV0FUICBCMFdBVF8xMAotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1dBVCA9PSA5KQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfV0FUICBCMFdBVF85Ci0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfV0FUID09IDgpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9XQVQgIEIwV0FUXzgKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9XQVQgPT0gNykKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1dBVCAgQjBXQVRfNwotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1dBVCA9PSA2KQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfV0FUICBCMFdBVF82Ci0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfV0FUID09IDUpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9XQVQgIEIwV0FUXzUKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9XQVQgPT0gNCkKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1dBVCAgQjBXQVRfNAotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1dBVCA9PSAzKQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfV0FUICBCMFdBVF8zCi0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfV0FUID09IDIpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9XQVQgIEIwV0FUXzIKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9XQVQgPT0gMSkKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1dBVCAgQjBXQVRfMQotI2VuZGlmCi0KLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfUkFUID4gMTQpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9SQVQgIEIwUkFUXzE1Ci0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfUkFUID09IDE0KQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfUkFUICBCMFJBVF8xNAotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1JBVCA9PSAxMykKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1JBVCAgQjBSQVRfMTMKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9SQVQgPT0gMTIpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9SQVQgIEIwUkFUXzEyCi0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfUkFUID09IDExKQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfUkFUICBCMFJBVF8xMQotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1JBVCA9PSAxMCkKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1JBVCAgQjBSQVRfMTAKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9SQVQgPT0gOSkKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1JBVCAgQjBSQVRfOQotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1JBVCA9PSA4KQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfUkFUICBCMFJBVF84Ci0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfUkFUID09IDcpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9SQVQgIEIwUkFUXzcKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9SQVQgPT0gNikKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1JBVCAgQjBSQVRfNgotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1JBVCA9PSA1KQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfUkFUICBCMFJBVF81Ci0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfUkFUID09IDQpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9SQVQgIEIwUkFUXzQKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9SQVQgPT0gMykKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1JBVCAgQjBSQVRfMwotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1JBVCA9PSAyKQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfUkFUICBCMFJBVF8yCi0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfUkFUID09IDEpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9SQVQgIEIwUkFUXzEKLSNlbmRpZgotCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMCAgXAotCShmbGFzaF9FQklVX0FNQkNUTDBfV0FUIHwgZmxhc2hfRUJJVV9BTUJDVEwwX1JBVCB8IGZsYXNoX0VCSVVfQU1CQ1RMMF9IVCB8IFwKLQkgZmxhc2hfRUJJVV9BTUJDVEwwX1NUIHwgZmxhc2hfRUJJVV9BTUJDVEwwX1RUIHwgQ09ORklHX0ZMQVNIX1NQRUVEX1JEWUVOKQpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2luY2x1ZGUvbWFjaC9tZW1fbWFwLmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvaW5jbHVkZS9tYWNoL21lbV9tYXAuaAppbmRleCA1ODFmYzZlLi5mYzMzYjdjIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvaW5jbHVkZS9tYWNoL21lbV9tYXAuaAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvaW5jbHVkZS9tYWNoL21lbV9tYXAuaApAQCAtMTY4LDQgKzE2OCwxMCBAQAogI2RlZmluZSBMMV9TQ1JBVENIX1NUQVJUCTB4RkZCMDAwMDAKICNkZWZpbmUgTDFfU0NSQVRDSF9MRU5HVEgJMHgxMDAwCiAKKyNkZWZpbmUgR0VUX1BEQV9TQUZFKHByZWcpCQlcCisJcHJlZy5sID0gX2NwdV9wZGE7CQlcCisJcHJlZy5oID0gX2NwdV9wZGE7CisKKyNkZWZpbmUgR0VUX1BEQShwcmVnLCBkcmVnKQlHRVRfUERBX1NBRkUocHJlZykKKwogI2VuZGlmCQkJCS8qIF9NRU1fTUFQXzUzM19IXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L0tjb25maWcgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvS2NvbmZpZwppbmRleCA4MjU1Mzc0Li5iYmMwOGZkIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvS2NvbmZpZworKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvS2NvbmZpZwpAQCAtNjQsMjkgKzY0LDI5IEBACiBjb25maWcgSVJRX01BQ19UWAogCWludCAiSVJRX01BQ19UWCIKIAlkZWZhdWx0IDExCi1jb25maWcgSVJRX1RNUjAKLQlpbnQgIklSUV9UTVIwIgorY29uZmlnIElSUV9USU1FUjAKKwlpbnQgIklSUV9USU1FUjAiCisJZGVmYXVsdCA4Citjb25maWcgSVJRX1RJTUVSMQorCWludCAiSVJRX1RJTUVSMSIKIAlkZWZhdWx0IDEyCi1jb25maWcgSVJRX1RNUjEKLQlpbnQgIklSUV9UTVIxIgorY29uZmlnIElSUV9USU1FUjIKKwlpbnQgIklSUV9USU1FUjIiCiAJZGVmYXVsdCAxMgotY29uZmlnIElSUV9UTVIyCi0JaW50ICJJUlFfVE1SMiIKK2NvbmZpZyBJUlFfVElNRVIzCisJaW50ICJJUlFfVElNRVIzIgogCWRlZmF1bHQgMTIKLWNvbmZpZyBJUlFfVE1SMwotCWludCAiSVJRX1RNUjMiCitjb25maWcgSVJRX1RJTUVSNAorCWludCAiSVJRX1RJTUVSNCIKIAlkZWZhdWx0IDEyCi1jb25maWcgSVJRX1RNUjQKLQlpbnQgIklSUV9UTVI0IgorY29uZmlnIElSUV9USU1FUjUKKwlpbnQgIklSUV9USU1FUjUiCiAJZGVmYXVsdCAxMgotY29uZmlnIElSUV9UTVI1Ci0JaW50ICJJUlFfVE1SNSIKK2NvbmZpZyBJUlFfVElNRVI2CisJaW50ICJJUlFfVElNRVI2IgogCWRlZmF1bHQgMTIKLWNvbmZpZyBJUlFfVE1SNgotCWludCAiSVJRX1RNUjYiCi0JZGVmYXVsdCAxMgotY29uZmlnIElSUV9UTVI3Ci0JaW50ICJJUlFfVE1SNyIKK2NvbmZpZyBJUlFfVElNRVI3CisJaW50ICJJUlFfVElNRVI3IgogCWRlZmF1bHQgMTIKIGNvbmZpZyBJUlFfUFJPR19JTlRBCiAJaW50ICJJUlFfUFJPR19JTlRBIgpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L01ha2VmaWxlIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L01ha2VmaWxlCmluZGV4IDY4ZTU0NzguLjU2OTk0YjYgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9NYWtlZmlsZQorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvTWFrZWZpbGUKQEAgLTIsNiArMiw0IEBACiAjIGFyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9NYWtlZmlsZQogIwogCi1leHRyYS15IDo9IGhlYWQubwotCiBvYmoteSA6PSBpbnRzLXByaW9yaXR5Lm8gZG1hLm8KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9ib2FyZHMvY21fYmY1MzcuYyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9ib2FyZHMvY21fYmY1MzcuYwppbmRleCBkZGUxNDcyLi42YWM4ZTRkIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvYm9hcmRzL2NtX2JmNTM3LmMKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2JvYXJkcy9jbV9iZjUzNy5jCkBAIC0zMDgsNiArMzA4LDE5IEBACiB9OwogI2VuZGlmCiAKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYmZpbl9ncGlvc19yZXNvdXJjZXMgPSB7CisJLnN0YXJ0ID0gMCwKKwkuZW5kICAgPSBNQVhfQkxBQ0tGSU5fR1BJT1MgLSAxLAorCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYmZpbl9ncGlvc19kZXZpY2UgPSB7CisJLm5hbWUgPSAic2ltcGxlLWdwaW8iLAorCS5pZCA9IC0xLAorCS5udW1fcmVzb3VyY2VzID0gMSwKKwkucmVzb3VyY2UgPSAmYmZpbl9ncGlvc19yZXNvdXJjZXMsCit9OworCiAjaWYgZGVmaW5lZChDT05GSUdfTVREX0dQSU9fQUREUikgfHwgZGVmaW5lZChDT05GSUdfTVREX0dQSU9fQUREUl9NT0RVTEUpCiBzdGF0aWMgc3RydWN0IG10ZF9wYXJ0aXRpb24gY21fcGFydGl0aW9uc1tdID0gewogCXsKQEAgLTM3OSwzMCArMzkyLDU3IEBACiAjZW5kaWYKIAogI2lmIGRlZmluZWQoQ09ORklHX0JGSU5fU0lSKSB8fCBkZWZpbmVkKENPTkZJR19CRklOX1NJUl9NT0RVTEUpCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIGJmaW5fc2lyX3Jlc291cmNlc1tdID0gewogI2lmZGVmIENPTkZJR19CRklOX1NJUjAKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYmZpbl9zaXIwX3Jlc291cmNlc1tdID0gewogCXsKIAkJLnN0YXJ0ID0gMHhGRkMwMDQwMCwKIAkJLmVuZCA9IDB4RkZDMDA0RkYsCiAJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAogCX0sCisJeworCQkuc3RhcnQgPSBJUlFfVUFSVDBfUlgsCisJCS5lbmQgPSBJUlFfVUFSVDBfUlgrMSwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJfSwKKwl7CisJCS5zdGFydCA9IENIX1VBUlQwX1JYLAorCQkuZW5kID0gQ0hfVUFSVDBfUlgrMSwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9ETUEsCisJfSwKK307CitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZmluX3NpcjBfZGV2aWNlID0geworCS5uYW1lID0gImJmaW5fc2lyIiwKKwkuaWQgPSAwLAorCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRShiZmluX3NpcjBfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UgPSBiZmluX3NpcjBfcmVzb3VyY2VzLAorfTsKICNlbmRpZgogI2lmZGVmIENPTkZJR19CRklOX1NJUjEKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYmZpbl9zaXIxX3Jlc291cmNlc1tdID0gewogCXsKIAkJLnN0YXJ0ID0gMHhGRkMwMjAwMCwKIAkJLmVuZCA9IDB4RkZDMDIwRkYsCiAJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAogCX0sCi0jZW5kaWYKKwl7CisJCS5zdGFydCA9IElSUV9VQVJUMV9SWCwKKwkJLmVuZCA9IElSUV9VQVJUMV9SWCsxLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorCXsKKwkJLnN0YXJ0ID0gQ0hfVUFSVDFfUlgsCisJCS5lbmQgPSBDSF9VQVJUMV9SWCsxLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0RNQSwKKwl9LAogfTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYmZpbl9zaXJfZGV2aWNlID0geworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYmZpbl9zaXIxX2RldmljZSA9IHsKIAkubmFtZSA9ICJiZmluX3NpciIsCi0JLmlkID0gMCwKLQkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUoYmZpbl9zaXJfcmVzb3VyY2VzKSwKLQkucmVzb3VyY2UgPSBiZmluX3Npcl9yZXNvdXJjZXMsCisJLmlkID0gMSwKKwkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUoYmZpbl9zaXIxX3Jlc291cmNlcyksCisJLnJlc291cmNlID0gYmZpbl9zaXIxX3Jlc291cmNlcywKIH07CiAjZW5kaWYKKyNlbmRpZgogCiAjaWYgZGVmaW5lZChDT05GSUdfSTJDX0JMQUNLRklOX1RXSSkgfHwgZGVmaW5lZChDT05GSUdfSTJDX0JMQUNLRklOX1RXSV9NT0RVTEUpCiBzdGF0aWMgc3RydWN0IHJlc291cmNlIGJmaW5fdHdpMF9yZXNvdXJjZVtdID0gewpAQCAtNTI1LDcgKzU2NSwxMiBAQAogI2VuZGlmCiAKICNpZiBkZWZpbmVkKENPTkZJR19CRklOX1NJUikgfHwgZGVmaW5lZChDT05GSUdfQkZJTl9TSVJfTU9EVUxFKQotCSZiZmluX3Npcl9kZXZpY2UsCisjaWZkZWYgQ09ORklHX0JGSU5fU0lSMAorCSZiZmluX3NpcjBfZGV2aWNlLAorI2VuZGlmCisjaWZkZWYgQ09ORklHX0JGSU5fU0lSMQorCSZiZmluX3NpcjFfZGV2aWNlLAorI2VuZGlmCiAjZW5kaWYKIAogI2lmIGRlZmluZWQoQ09ORklHX0kyQ19CTEFDS0ZJTl9UV0kpIHx8IGRlZmluZWQoQ09ORklHX0kyQ19CTEFDS0ZJTl9UV0lfTU9EVUxFKQpAQCAtNTY0LDYgKzYwOSw4IEBACiAjaWYgZGVmaW5lZChDT05GSUdfTVREX0dQSU9fQUREUikgfHwgZGVmaW5lZChDT05GSUdfTVREX0dQSU9fQUREUl9NT0RVTEUpCiAJJmNtX2ZsYXNoX2RldmljZSwKICNlbmRpZgorCisJJmJmaW5fZ3Bpb3NfZGV2aWNlLAogfTsKIAogc3RhdGljIGludCBfX2luaXQgY21fYmY1MzdfaW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2JvYXJkcy9nZW5lcmljX2JvYXJkLmMgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvYm9hcmRzL2dlbmVyaWNfYm9hcmQuYwppbmRleCA3OGExM2Q1Li5kZDZlNmJmIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvYm9hcmRzL2dlbmVyaWNfYm9hcmQuYworKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvYm9hcmRzL2dlbmVyaWNfYm9hcmQuYwpAQCAtNTAsNTcgKzUwLDQ2IEBACiAvKgogICogTmFtZSB0aGUgQm9hcmQgZm9yIHRoZSAvcHJvYy9jcHVpbmZvCiAgKi8KLWNvbnN0IGNoYXIgYmZpbl9ib2FyZF9uYW1lW10gPSAiR0VORVJJQyBCb2FyZCI7Citjb25zdCBjaGFyIGJmaW5fYm9hcmRfbmFtZVtdID0gIlVOS05PV04gQk9BUkQiOwogCiAvKgogICogIERyaXZlciBuZWVkcyB0byBrbm93IGFkZHJlc3MsIGlycSBhbmQgZmxhZyBwaW4uCiAgKi8KIAotI2RlZmluZSBJU1AxNzYxX0JBU0UgICAgICAgMHgyMDNDMDAwMAotI2RlZmluZSBJU1AxNzYxX0lSUSAgICAgICAgSVJRX1BGNwotCiAjaWYgZGVmaW5lZChDT05GSUdfVVNCX0lTUDE3NjBfSENEKSB8fCBkZWZpbmVkKENPTkZJR19VU0JfSVNQMTc2MF9IQ0RfTU9EVUxFKQotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBiZmluX2lzcDE3NjFfcmVzb3VyY2VzW10gPSB7CisjaW5jbHVkZSA8bGludXgvdXNiL2lzcDE3NjAuaD4KK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYmZpbl9pc3AxNzYwX3Jlc291cmNlc1tdID0gewogCVswXSA9IHsKLQkJLm5hbWUJPSAiaXNwMTc2MS1yZWdzIiwKLQkJLnN0YXJ0ICA9IElTUDE3NjFfQkFTRSArIDB4MDAwMDAwMDAsCi0JCS5lbmQgICAgPSBJU1AxNzYxX0JBU0UgKyAweDAwMGZmZmZmLAorCQkuc3RhcnQgID0gMHgyMDNDMDAwMCwKKwkJLmVuZCAgICA9IDB4MjAzQzAwMDAgKyAweDAwMGZmZmZmLAogCQkuZmxhZ3MgID0gSU9SRVNPVVJDRV9NRU0sCiAJfSwKIAlbMV0gPSB7Ci0JCS5zdGFydCAgPSBJU1AxNzYxX0lSUSwKLQkJLmVuZCAgICA9IElTUDE3NjFfSVJRLAorCQkuc3RhcnQgID0gSVJRX1BGNywKKwkJLmVuZCAgICA9IElSUV9QRjcsCiAJCS5mbGFncyAgPSBJT1JFU09VUkNFX0lSUSwKIAl9LAogfTsKIAotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYmZpbl9pc3AxNzYxX2RldmljZSA9IHsKLQkubmFtZSAgICAgICAgICAgPSAiaXNwMTc2MSIsCitzdGF0aWMgc3RydWN0IGlzcDE3NjBfcGxhdGZvcm1fZGF0YSBpc3AxNzYwX3ByaXYgPSB7CisJLmlzX2lzcDE3NjEgPSAwLAorCS5wb3J0MV9kaXNhYmxlID0gMCwKKwkuYnVzX3dpZHRoXzE2ID0gMSwKKwkucG9ydDFfb3RnID0gMCwKKwkuYW5hbG9nX29jID0gMCwKKwkuZGFja19wb2xhcml0eV9oaWdoID0gMCwKKwkuZHJlcV9wb2xhcml0eV9oaWdoID0gMCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGJmaW5faXNwMTc2MF9kZXZpY2UgPSB7CisJLm5hbWUgICAgICAgICAgID0gImlzcDE3NjAtaGNkIiwKIAkuaWQgICAgICAgICAgICAgPSAwLAotCS5udW1fcmVzb3VyY2VzICA9IEFSUkFZX1NJWkUoYmZpbl9pc3AxNzYxX3Jlc291cmNlcyksCi0JLnJlc291cmNlICAgICAgID0gYmZpbl9pc3AxNzYxX3Jlc291cmNlcywKKwkuZGV2ID0geworCQkucGxhdGZvcm1fZGF0YSA9ICZpc3AxNzYwX3ByaXYsCisJfSwKKwkubnVtX3Jlc291cmNlcyAgPSBBUlJBWV9TSVpFKGJmaW5faXNwMTc2MF9yZXNvdXJjZXMpLAorCS5yZXNvdXJjZSAgICAgICA9IGJmaW5faXNwMTc2MF9yZXNvdXJjZXMsCiB9OwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqYmZpbl9pc3AxNzYxX2RldmljZXNbXSA9IHsKLQkmYmZpbl9pc3AxNzYxX2RldmljZSwKLX07Ci0KLWludCBfX2luaXQgYmZpbl9pc3AxNzYxX2luaXQodm9pZCkKLXsKLQl1bnNpZ25lZCBpbnQgbnVtX2RldmljZXMgPSBBUlJBWV9TSVpFKGJmaW5faXNwMTc2MV9kZXZpY2VzKTsKLQotCXByaW50ayhLRVJOX0lORk8gIiVzKCk6IHJlZ2lzdGVyaW5nIGRldmljZSByZXNvdXJjZXNcbiIsIF9fZnVuY19fKTsKLQlzZXRfaXJxX3R5cGUoSVNQMTc2MV9JUlEsIElSUUZfVFJJR0dFUl9GQUxMSU5HKTsKLQotCXJldHVybiBwbGF0Zm9ybV9hZGRfZGV2aWNlcyhiZmluX2lzcDE3NjFfZGV2aWNlcywgbnVtX2RldmljZXMpOwotfQotCi12b2lkIF9fZXhpdCBiZmluX2lzcDE3NjFfZXhpdCh2b2lkKQotewotCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKCZiZmluX2lzcDE3NjFfZGV2aWNlKTsKLX0KLQotYXJjaF9pbml0Y2FsbChiZmluX2lzcDE3NjFfaW5pdCk7CiAjZW5kaWYKIAogI2lmIGRlZmluZWQoQ09ORklHX0JGSU5fQ0ZQQ01DSUEpIHx8IGRlZmluZWQoQ09ORklHX0JGSU5fQ0ZQQ01DSUFfTU9EVUxFKQpAQCAtNTU5LDMwICs1NDgsNTkgQEAKICNlbmRpZgogCiAjaWYgZGVmaW5lZChDT05GSUdfQkZJTl9TSVIpIHx8IGRlZmluZWQoQ09ORklHX0JGSU5fU0lSX01PRFVMRSkKLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYmZpbl9zaXJfcmVzb3VyY2VzW10gPSB7CiAjaWZkZWYgQ09ORklHX0JGSU5fU0lSMAorc3RhdGljIHN0cnVjdCByZXNvdXJjZSBiZmluX3NpcjBfcmVzb3VyY2VzW10gPSB7CiAJewogCQkuc3RhcnQgPSAweEZGQzAwNDAwLAogCQkuZW5kID0gMHhGRkMwMDRGRiwKIAkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCiAJfSwKKwl7CisJCS5zdGFydCA9IElSUV9VQVJUMF9SWCwKKwkJLmVuZCA9IElSUV9VQVJUMF9SWCsxLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorCXsKKwkJLnN0YXJ0ID0gQ0hfVUFSVDBfUlgsCisJCS5lbmQgPSBDSF9VQVJUMF9SWCsxLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0RNQSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYmZpbl9zaXIwX2RldmljZSA9IHsKKwkubmFtZSA9ICJiZmluX3NpciIsCisJLmlkID0gMCwKKwkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUoYmZpbl9zaXIwX3Jlc291cmNlcyksCisJLnJlc291cmNlID0gYmZpbl9zaXIwX3Jlc291cmNlcywKK307CiAjZW5kaWYKICNpZmRlZiBDT05GSUdfQkZJTl9TSVIxCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGJmaW5fc2lyMV9yZXNvdXJjZXNbXSA9IHsKIAl7CiAJCS5zdGFydCA9IDB4RkZDMDIwMDAsCiAJCS5lbmQgPSAweEZGQzAyMEZGLAogCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKIAl9LAotI2VuZGlmCisJeworCQkuc3RhcnQgPSBJUlFfVUFSVDFfUlgsCisJCS5lbmQgPSBJUlFfVUFSVDFfUlgrMSwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJfSwKKwl7CisJCS5zdGFydCA9IENIX1VBUlQxX1JYLAorCQkuZW5kID0gQ0hfVUFSVDFfUlgrMSwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9ETUEsCisJfSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGJmaW5fc2lyX2RldmljZSA9IHsKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGJmaW5fc2lyMV9kZXZpY2UgPSB7CiAJLm5hbWUgPSAiYmZpbl9zaXIiLAotCS5pZCA9IDAsCi0JLm51bV9yZXNvdXJjZXMgPSBBUlJBWV9TSVpFKGJmaW5fc2lyX3Jlc291cmNlcyksCi0JLnJlc291cmNlID0gYmZpbl9zaXJfcmVzb3VyY2VzLAorCS5pZCA9IDEsCisJLm51bV9yZXNvdXJjZXMgPSBBUlJBWV9TSVpFKGJmaW5fc2lyMV9yZXNvdXJjZXMpLAorCS5yZXNvdXJjZSA9IGJmaW5fc2lyMV9yZXNvdXJjZXMsCiB9OwogI2VuZGlmCisjZW5kaWYKIAogI2lmIGRlZmluZWQoQ09ORklHX0kyQ19CTEFDS0ZJTl9UV0kpIHx8IGRlZmluZWQoQ09ORklHX0kyQ19CTEFDS0ZJTl9UV0lfTU9EVUxFKQogc3RhdGljIHN0cnVjdCByZXNvdXJjZSBiZmluX3R3aTBfcmVzb3VyY2VbXSA9IHsKQEAgLTY1MSw2ICs2NjksMTAgQEAKIAkmbmV0MjI3Ml9iZmluX2RldmljZSwKICNlbmRpZgogCisjaWYgZGVmaW5lZChDT05GSUdfVVNCX0lTUDE3NjBfSENEKSB8fCBkZWZpbmVkKENPTkZJR19VU0JfSVNQMTc2MF9IQ0RfTU9EVUxFKQorCSZiZmluX2lzcDE3NjBfZGV2aWNlLAorI2VuZGlmCisKICNpZiBkZWZpbmVkKENPTkZJR19TUElfQkZJTikgfHwgZGVmaW5lZChDT05GSUdfU1BJX0JGSU5fTU9EVUxFKQogCSZiZmluX3NwaTBfZGV2aWNlLAogI2VuZGlmCkBAIC02NjgsNyArNjkwLDEyIEBACiAjZW5kaWYKIAogI2lmIGRlZmluZWQoQ09ORklHX0JGSU5fU0lSKSB8fCBkZWZpbmVkKENPTkZJR19CRklOX1NJUl9NT0RVTEUpCi0JJmJmaW5fc2lyX2RldmljZSwKKyNpZmRlZiBDT05GSUdfQkZJTl9TSVIwCisJJmJmaW5fc2lyMF9kZXZpY2UsCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfQkZJTl9TSVIxCisJJmJmaW5fc2lyMV9kZXZpY2UsCisjZW5kaWYKICNlbmRpZgogCiAjaWYgZGVmaW5lZChDT05GSUdfSTJDX0JMQUNLRklOX1RXSSkgfHwgZGVmaW5lZChDT05GSUdfSTJDX0JMQUNLRklOX1RXSV9NT0RVTEUpCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvYm9hcmRzL21pbm90YXVyLmMgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvYm9hcmRzL21pbm90YXVyLmMKaW5kZXggNDhjNGNkMi4uYmI3OTUzNCAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2JvYXJkcy9taW5vdGF1ci5jCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9ib2FyZHMvbWlub3RhdXIuYwpAQCAtMjI2LDMwICsyMjYsNTkgQEAKICNlbmRpZgogCiAjaWYgZGVmaW5lZChDT05GSUdfQkZJTl9TSVIpIHx8IGRlZmluZWQoQ09ORklHX0JGSU5fU0lSX01PRFVMRSkKLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYmZpbl9zaXJfcmVzb3VyY2VzW10gPSB7CiAjaWZkZWYgQ09ORklHX0JGSU5fU0lSMAorc3RhdGljIHN0cnVjdCByZXNvdXJjZSBiZmluX3NpcjBfcmVzb3VyY2VzW10gPSB7CiAJewogCQkuc3RhcnQgPSAweEZGQzAwNDAwLAogCQkuZW5kID0gMHhGRkMwMDRGRiwKIAkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCiAJfSwKKwl7CisJCS5zdGFydCA9IElSUV9VQVJUMF9SWCwKKwkJLmVuZCA9IElSUV9VQVJUMF9SWCsxLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorCXsKKwkJLnN0YXJ0ID0gQ0hfVUFSVDBfUlgsCisJCS5lbmQgPSBDSF9VQVJUMF9SWCsxLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0RNQSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYmZpbl9zaXIwX2RldmljZSA9IHsKKwkubmFtZSA9ICJiZmluX3NpciIsCisJLmlkID0gMCwKKwkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUoYmZpbl9zaXIwX3Jlc291cmNlcyksCisJLnJlc291cmNlID0gYmZpbl9zaXIwX3Jlc291cmNlcywKK307CiAjZW5kaWYKICNpZmRlZiBDT05GSUdfQkZJTl9TSVIxCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGJmaW5fc2lyMV9yZXNvdXJjZXNbXSA9IHsKIAl7CiAJCS5zdGFydCA9IDB4RkZDMDIwMDAsCiAJCS5lbmQgPSAweEZGQzAyMEZGLAogCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKIAl9LAotI2VuZGlmCisJeworCQkuc3RhcnQgPSBJUlFfVUFSVDFfUlgsCisJCS5lbmQgPSBJUlFfVUFSVDFfUlgrMSwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJfSwKKwl7CisJCS5zdGFydCA9IENIX1VBUlQxX1JYLAorCQkuZW5kID0gQ0hfVUFSVDFfUlgrMSwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9ETUEsCisJfSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGJmaW5fc2lyX2RldmljZSA9IHsKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGJmaW5fc2lyMV9kZXZpY2UgPSB7CiAJLm5hbWUgPSAiYmZpbl9zaXIiLAotCS5pZCA9IDAsCi0JLm51bV9yZXNvdXJjZXMgPSBBUlJBWV9TSVpFKGJmaW5fc2lyX3Jlc291cmNlcyksCi0JLnJlc291cmNlID0gYmZpbl9zaXJfcmVzb3VyY2VzLAorCS5pZCA9IDEsCisJLm51bV9yZXNvdXJjZXMgPSBBUlJBWV9TSVpFKGJmaW5fc2lyMV9yZXNvdXJjZXMpLAorCS5yZXNvdXJjZSA9IGJmaW5fc2lyMV9yZXNvdXJjZXMsCiB9OwogI2VuZGlmCisjZW5kaWYKIAogI2lmIGRlZmluZWQoQ09ORklHX0kyQ19CTEFDS0ZJTl9UV0kpIHx8IGRlZmluZWQoQ09ORklHX0kyQ19CTEFDS0ZJTl9UV0lfTU9EVUxFKQogc3RhdGljIHN0cnVjdCByZXNvdXJjZSBiZmluX3R3aTBfcmVzb3VyY2VbXSA9IHsKQEAgLTMxMSw3ICszNDAsMTIgQEAKICNlbmRpZgogCiAjaWYgZGVmaW5lZChDT05GSUdfQkZJTl9TSVIpIHx8IGRlZmluZWQoQ09ORklHX0JGSU5fU0lSX01PRFVMRSkKLQkmYmZpbl9zaXJfZGV2aWNlLAorI2lmZGVmIENPTkZJR19CRklOX1NJUjAKKwkmYmZpbl9zaXIwX2RldmljZSwKKyNlbmRpZgorI2lmZGVmIENPTkZJR19CRklOX1NJUjEKKwkmYmZpbl9zaXIxX2RldmljZSwKKyNlbmRpZgogI2VuZGlmCiAKICNpZiBkZWZpbmVkKENPTkZJR19JMkNfQkxBQ0tGSU5fVFdJKSB8fCBkZWZpbmVkKENPTkZJR19JMkNfQkxBQ0tGSU5fVFdJX01PRFVMRSkKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9ib2FyZHMvcG5hdjEwLmMgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvYm9hcmRzL3BuYXYxMC5jCmluZGV4IGY5MTc0YzEuLjg5ZGU5NGYgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9ib2FyZHMvcG5hdjEwLmMKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2JvYXJkcy9wbmF2MTAuYwpAQCAtNDksNyArNDksNyBAQAogLyoKICAqIE5hbWUgdGhlIEJvYXJkIGZvciB0aGUgL3Byb2MvY3B1aW5mbwogICovCi1jb25zdCBjaGFyIGJmaW5fYm9hcmRfbmFtZVtdID0gIlBOQVYtMS4wIjsKK2NvbnN0IGNoYXIgYmZpbl9ib2FyZF9uYW1lW10gPSAiQURJIFBOQVYtMS4wIjsKIAogLyoKICAqICBEcml2ZXIgbmVlZHMgdG8ga25vdyBhZGRyZXNzLCBpcnEgYW5kIGZsYWcgcGluLgpAQCAtNDUzLDMwICs0NTMsNTkgQEAKICNlbmRpZgogCiAjaWYgZGVmaW5lZChDT05GSUdfQkZJTl9TSVIpIHx8IGRlZmluZWQoQ09ORklHX0JGSU5fU0lSX01PRFVMRSkKLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYmZpbl9zaXJfcmVzb3VyY2VzW10gPSB7CiAjaWZkZWYgQ09ORklHX0JGSU5fU0lSMAorc3RhdGljIHN0cnVjdCByZXNvdXJjZSBiZmluX3NpcjBfcmVzb3VyY2VzW10gPSB7CiAJewogCQkuc3RhcnQgPSAweEZGQzAwNDAwLAogCQkuZW5kID0gMHhGRkMwMDRGRiwKIAkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCiAJfSwKKwl7CisJCS5zdGFydCA9IElSUV9VQVJUMF9SWCwKKwkJLmVuZCA9IElSUV9VQVJUMF9SWCsxLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorCXsKKwkJLnN0YXJ0ID0gQ0hfVUFSVDBfUlgsCisJCS5lbmQgPSBDSF9VQVJUMF9SWCsxLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0RNQSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYmZpbl9zaXIwX2RldmljZSA9IHsKKwkubmFtZSA9ICJiZmluX3NpciIsCisJLmlkID0gMCwKKwkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUoYmZpbl9zaXIwX3Jlc291cmNlcyksCisJLnJlc291cmNlID0gYmZpbl9zaXIwX3Jlc291cmNlcywKK307CiAjZW5kaWYKICNpZmRlZiBDT05GSUdfQkZJTl9TSVIxCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGJmaW5fc2lyMV9yZXNvdXJjZXNbXSA9IHsKIAl7CiAJCS5zdGFydCA9IDB4RkZDMDIwMDAsCiAJCS5lbmQgPSAweEZGQzAyMEZGLAogCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKIAl9LAotI2VuZGlmCisJeworCQkuc3RhcnQgPSBJUlFfVUFSVDFfUlgsCisJCS5lbmQgPSBJUlFfVUFSVDFfUlgrMSwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJfSwKKwl7CisJCS5zdGFydCA9IENIX1VBUlQxX1JYLAorCQkuZW5kID0gQ0hfVUFSVDFfUlgrMSwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9ETUEsCisJfSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGJmaW5fc2lyX2RldmljZSA9IHsKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGJmaW5fc2lyMV9kZXZpY2UgPSB7CiAJLm5hbWUgPSAiYmZpbl9zaXIiLAotCS5pZCA9IDAsCi0JLm51bV9yZXNvdXJjZXMgPSBBUlJBWV9TSVpFKGJmaW5fc2lyX3Jlc291cmNlcyksCi0JLnJlc291cmNlID0gYmZpbl9zaXJfcmVzb3VyY2VzLAorCS5pZCA9IDEsCisJLm51bV9yZXNvdXJjZXMgPSBBUlJBWV9TSVpFKGJmaW5fc2lyMV9yZXNvdXJjZXMpLAorCS5yZXNvdXJjZSA9IGJmaW5fc2lyMV9yZXNvdXJjZXMsCiB9OwogI2VuZGlmCisjZW5kaWYKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnN0YW1wX2RldmljZXNbXSBfX2luaXRkYXRhID0gewogI2lmIGRlZmluZWQoQ09ORklHX0JGSU5fQ0ZQQ01DSUEpIHx8IGRlZmluZWQoQ09ORklHX0JGSU5fQ0ZQQ01DSUFfTU9EVUxFKQpAQCAtNTIwLDcgKzU0OSwxMiBAQAogI2VuZGlmCiAKICNpZiBkZWZpbmVkKENPTkZJR19CRklOX1NJUikgfHwgZGVmaW5lZChDT05GSUdfQkZJTl9TSVJfTU9EVUxFKQotCSZiZmluX3Npcl9kZXZpY2UsCisjaWZkZWYgQ09ORklHX0JGSU5fU0lSMAorCSZiZmluX3NpcjBfZGV2aWNlLAorI2VuZGlmCisjaWZkZWYgQ09ORklHX0JGSU5fU0lSMQorCSZiZmluX3NpcjFfZGV2aWNlLAorI2VuZGlmCiAjZW5kaWYKIH07CiAKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9ib2FyZHMvc3RhbXAuYyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9ib2FyZHMvc3RhbXAuYwppbmRleCA4ZDM5NDM5Li5kODEyZTI1IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvYm9hcmRzL3N0YW1wLmMKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2JvYXJkcy9zdGFtcC5jCkBAIC00Niw2ICs0Niw3IEBACiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CiAjaW5jbHVkZSA8bGludXgvdXNiL3NsODExLmg+CisjaW5jbHVkZSA8bGludXgvc3BpL21tY19zcGkuaD4KICNpbmNsdWRlIDxhc20vZG1hLmg+CiAjaW5jbHVkZSA8YXNtL2JmaW41eHhfc3BpLmg+CiAjaW5jbHVkZSA8YXNtL3JlYm9vdC5oPgpAQCAtNTUsNTcgKzU2LDQ2IEBACiAvKgogICogTmFtZSB0aGUgQm9hcmQgZm9yIHRoZSAvcHJvYy9jcHVpbmZvCiAgKi8KLWNvbnN0IGNoYXIgYmZpbl9ib2FyZF9uYW1lW10gPSAiQUREUy1CRjUzNy1TVEFNUCI7Citjb25zdCBjaGFyIGJmaW5fYm9hcmRfbmFtZVtdID0gIkFESSBCRjUzNy1TVEFNUCI7CiAKIC8qCiAgKiAgRHJpdmVyIG5lZWRzIHRvIGtub3cgYWRkcmVzcywgaXJxIGFuZCBmbGFnIHBpbi4KICAqLwogCi0jZGVmaW5lIElTUDE3NjFfQkFTRSAgICAgICAweDIwM0MwMDAwCi0jZGVmaW5lIElTUDE3NjFfSVJRICAgICAgICBJUlFfUEY3Ci0KICNpZiBkZWZpbmVkKENPTkZJR19VU0JfSVNQMTc2MF9IQ0QpIHx8IGRlZmluZWQoQ09ORklHX1VTQl9JU1AxNzYwX0hDRF9NT0RVTEUpCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIGJmaW5faXNwMTc2MV9yZXNvdXJjZXNbXSA9IHsKKyNpbmNsdWRlIDxsaW51eC91c2IvaXNwMTc2MC5oPgorc3RhdGljIHN0cnVjdCByZXNvdXJjZSBiZmluX2lzcDE3NjBfcmVzb3VyY2VzW10gPSB7CiAJWzBdID0gewotCQkubmFtZQk9ICJpc3AxNzYxLXJlZ3MiLAotCQkuc3RhcnQgID0gSVNQMTc2MV9CQVNFICsgMHgwMDAwMDAwMCwKLQkJLmVuZCAgICA9IElTUDE3NjFfQkFTRSArIDB4MDAwZmZmZmYsCisJCS5zdGFydCAgPSAweDIwM0MwMDAwLAorCQkuZW5kICAgID0gMHgyMDNDMDAwMCArIDB4MDAwZmZmZmYsCiAJCS5mbGFncyAgPSBJT1JFU09VUkNFX01FTSwKIAl9LAogCVsxXSA9IHsKLQkJLnN0YXJ0ICA9IElTUDE3NjFfSVJRLAotCQkuZW5kICAgID0gSVNQMTc2MV9JUlEsCi0JCS5mbGFncyAgPSBJT1JFU09VUkNFX0lSUSwKKwkJLnN0YXJ0ICA9IElSUV9QRjcsCisJCS5lbmQgICAgPSBJUlFfUEY3LAorCQkuZmxhZ3MgID0gSU9SRVNPVVJDRV9JUlEgfCBJT1JFU09VUkNFX0lSUV9MT1dMRVZFTCwKIAl9LAogfTsKIAotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYmZpbl9pc3AxNzYxX2RldmljZSA9IHsKLQkubmFtZSAgICAgICAgICAgPSAiaXNwMTc2MSIsCitzdGF0aWMgc3RydWN0IGlzcDE3NjBfcGxhdGZvcm1fZGF0YSBpc3AxNzYwX3ByaXYgPSB7CisJLmlzX2lzcDE3NjEgPSAwLAorCS5wb3J0MV9kaXNhYmxlID0gMCwKKwkuYnVzX3dpZHRoXzE2ID0gMSwKKwkucG9ydDFfb3RnID0gMCwKKwkuYW5hbG9nX29jID0gMCwKKwkuZGFja19wb2xhcml0eV9oaWdoID0gMCwKKwkuZHJlcV9wb2xhcml0eV9oaWdoID0gMCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGJmaW5faXNwMTc2MF9kZXZpY2UgPSB7CisJLm5hbWUgICAgICAgICAgID0gImlzcDE3NjAtaGNkIiwKIAkuaWQgICAgICAgICAgICAgPSAwLAotCS5udW1fcmVzb3VyY2VzICA9IEFSUkFZX1NJWkUoYmZpbl9pc3AxNzYxX3Jlc291cmNlcyksCi0JLnJlc291cmNlICAgICAgID0gYmZpbl9pc3AxNzYxX3Jlc291cmNlcywKKwkuZGV2ID0geworCQkucGxhdGZvcm1fZGF0YSA9ICZpc3AxNzYwX3ByaXYsCisJfSwKKwkubnVtX3Jlc291cmNlcyAgPSBBUlJBWV9TSVpFKGJmaW5faXNwMTc2MF9yZXNvdXJjZXMpLAorCS5yZXNvdXJjZSAgICAgICA9IGJmaW5faXNwMTc2MF9yZXNvdXJjZXMsCiB9OwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqYmZpbl9pc3AxNzYxX2RldmljZXNbXSA9IHsKLQkmYmZpbl9pc3AxNzYxX2RldmljZSwKLX07Ci0KLWludCBfX2luaXQgYmZpbl9pc3AxNzYxX2luaXQodm9pZCkKLXsKLQl1bnNpZ25lZCBpbnQgbnVtX2RldmljZXMgPSBBUlJBWV9TSVpFKGJmaW5faXNwMTc2MV9kZXZpY2VzKTsKLQotCXByaW50ayhLRVJOX0lORk8gIiVzKCk6IHJlZ2lzdGVyaW5nIGRldmljZSByZXNvdXJjZXNcbiIsIF9fZnVuY19fKTsKLQlzZXRfaXJxX3R5cGUoSVNQMTc2MV9JUlEsIElSUUZfVFJJR0dFUl9GQUxMSU5HKTsKLQotCXJldHVybiBwbGF0Zm9ybV9hZGRfZGV2aWNlcyhiZmluX2lzcDE3NjFfZGV2aWNlcywgbnVtX2RldmljZXMpOwotfQotCi12b2lkIF9fZXhpdCBiZmluX2lzcDE3NjFfZXhpdCh2b2lkKQotewotCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKCZiZmluX2lzcDE3NjFfZGV2aWNlKTsKLX0KLQotYXJjaF9pbml0Y2FsbChiZmluX2lzcDE3NjFfaW5pdCk7CiAjZW5kaWYKIAogI2lmIGRlZmluZWQoQ09ORklHX0tFWUJPQVJEX0dQSU8pIHx8IGRlZmluZWQoQ09ORklHX0tFWUJPQVJEX0dQSU9fTU9EVUxFKQpAQCAtNDQzLDExICs0MzMsMTEgQEAKIAkJLm9mZnNldCAgICAgPSAwLAogCX0sIHsKIAkJLm5hbWUgICAgICAgPSAibGludXgga2VybmVsKG5vcikiLAotCQkuc2l6ZSAgICAgICA9IDB4RTAwMDAsCisJCS5zaXplICAgICAgID0gMHgxODAwMDAsCiAJCS5vZmZzZXQgICAgID0gTVREUEFSVF9PRlNfQVBQRU5ELAogCX0sIHsKIAkJLm5hbWUgICAgICAgPSAiZmlsZSBzeXN0ZW0obm9yKSIsCi0JCS5zaXplICAgICAgID0gMHg0MDAwMDAgLSAweDQwMDAwIC0gMHhFMDAwMCAtIDB4MTAwMDAsCisJCS5zaXplICAgICAgID0gMHg0MDAwMDAgLSAweDQwMDAwIC0gMHgxODAwMDAgLSAweDEwMDAwLAogCQkub2Zmc2V0ICAgICA9IE1URFBBUlRfT0ZTX0FQUEVORCwKIAl9LCB7CiAJCS5uYW1lICAgICAgID0gIk1BQyBBZGRyZXNzKG5vcikiLApAQCAtNDkwLDcgKzQ4MCw3IEBACiAJCS5tYXNrX2ZsYWdzID0gTVREX0NBUF9ST00KIAl9LCB7CiAJCS5uYW1lID0gImxpbnV4IGtlcm5lbChzcGkpIiwKLQkJLnNpemUgPSAweGUwMDAwLAorCQkuc2l6ZSA9IDB4MTgwMDAwLAogCQkub2Zmc2V0ID0gTVREUEFSVF9PRlNfQVBQRU5ELAogCX0sIHsKIAkJLm5hbWUgPSAiZmlsZSBzeXN0ZW0oc3BpKSIsCkBAIC01MDMsNyArNDkzLDcgQEAKIAkubmFtZSA9ICJtMjVwODAiLAogCS5wYXJ0cyA9IGJmaW5fc3BpX2ZsYXNoX3BhcnRpdGlvbnMsCiAJLm5yX3BhcnRzID0gQVJSQVlfU0laRShiZmluX3NwaV9mbGFzaF9wYXJ0aXRpb25zKSwKLQkudHlwZSA9ICJtMjVwNjQiLAorCS8qIC50eXBlID0gIm0yNXA2NCIsICovCiB9OwogCiAvKiBTUEkgZmxhc2ggY2hpcCAobTI1cDY0KSAqLwpAQCAtNTM3LDkgKzUyNywyOSBAQAogfTsKICNlbmRpZgogCi0jaWYgZGVmaW5lZChDT05GSUdfU1BJX01NQykgfHwgZGVmaW5lZChDT05GSUdfU1BJX01NQ19NT0RVTEUpCi1zdGF0aWMgc3RydWN0IGJmaW41eHhfc3BpX2NoaXAgc3BpX21tY19jaGlwX2luZm8gPSB7Ci0JLmVuYWJsZV9kbWEgPSAxLAorI2lmIGRlZmluZWQoQ09ORklHX01NQ19TUEkpIHx8IGRlZmluZWQoQ09ORklHX01NQ19TUElfTU9EVUxFKQorI2RlZmluZSBNTUNfU1BJX0NBUkRfREVURUNUX0lOVCBJUlFfUEY1CisKK3N0YXRpYyBpbnQgYmZpbl9tbWNfc3BpX2luaXQoc3RydWN0IGRldmljZSAqZGV2LAorCWlycXJldHVybl90ICgqZGV0ZWN0X2ludCkoaW50LCB2b2lkICopLCB2b2lkICpkYXRhKQoreworCXJldHVybiByZXF1ZXN0X2lycShNTUNfU1BJX0NBUkRfREVURUNUX0lOVCwgZGV0ZWN0X2ludCwKKwkJSVJRRl9UUklHR0VSX0ZBTExJTkcsICJtbWMtc3BpLWRldGVjdCIsIGRhdGEpOworfQorCitzdGF0aWMgdm9pZCBiZmluX21tY19zcGlfZXhpdChzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEpCit7CisJZnJlZV9pcnEoTU1DX1NQSV9DQVJEX0RFVEVDVF9JTlQsIGRhdGEpOworfQorCitzdGF0aWMgc3RydWN0IG1tY19zcGlfcGxhdGZvcm1fZGF0YSBiZmluX21tY19zcGlfcGRhdGEgPSB7CisJLmluaXQgPSBiZmluX21tY19zcGlfaW5pdCwKKwkuZXhpdCA9IGJmaW5fbW1jX3NwaV9leGl0LAorCS5kZXRlY3RfZGVsYXkgPSAxMDAsIC8qIG1zZWNzICovCit9OworCitzdGF0aWMgc3RydWN0IGJmaW41eHhfc3BpX2NoaXAgIG1tY19zcGlfY2hpcF9pbmZvID0geworCS5lbmFibGVfZG1hID0gMCwKIAkuYml0c19wZXJfd29yZCA9IDgsCiB9OwogI2VuZGlmCkBAIC02MTMsNiArNjIzLDE0IEBACiB9OwogI2VuZGlmCiAKKyNpZiBkZWZpbmVkKENPTkZJR19FTkMyOEo2MCkgfHwgZGVmaW5lZChDT05GSUdfRU5DMjhKNjBfTU9EVUxFKQorc3RhdGljIHN0cnVjdCBiZmluNXh4X3NwaV9jaGlwIGVuYzI4ajYwX3NwaV9jaGlwX2luZm8gPSB7CisJLmVuYWJsZV9kbWEJPSAxLAorCS5iaXRzX3Blcl93b3JkCT0gOCwKKwkuY3NfZ3BpbyA9IEdQSU9fUEYxMCwKK307CisjZW5kaWYKKwogI2lmIGRlZmluZWQoQ09ORklHX01URF9EQVRBRkxBU0gpIFwKIAl8fCBkZWZpbmVkKENPTkZJR19NVERfREFUQUZMQVNIX01PRFVMRSkKIApAQCAtNjI0LDcgKzY0Miw3IEBACiAJCS5tYXNrX2ZsYWdzID0gTVREX0NBUF9ST00KIAl9LCB7CiAJCS5uYW1lID0gImxpbnV4IGtlcm5lbChzcGkpIiwKLQkJLnNpemUgPSAweGUwMDAwLAorCQkuc2l6ZSA9IDB4MTgwMDAwLAogCQkub2Zmc2V0ID0gTVREUEFSVF9PRlNfQVBQRU5ELAogCX0sIHsKIAkJLm5hbWUgPSAiZmlsZSBzeXN0ZW0oc3BpKSIsCkBAIC03MDMsMjMgKzcyMSwxNCBAQAogCQkuY29udHJvbGxlcl9kYXRhID0gJmFkOTk2MF9zcGlfY2hpcF9pbmZvLAogCX0sCiAjZW5kaWYKLSNpZiBkZWZpbmVkKENPTkZJR19TUElfTU1DKSB8fCBkZWZpbmVkKENPTkZJR19TUElfTU1DX01PRFVMRSkKKyNpZiBkZWZpbmVkKENPTkZJR19NTUNfU1BJKSB8fCBkZWZpbmVkKENPTkZJR19NTUNfU1BJX01PRFVMRSkKIAl7Ci0JCS5tb2RhbGlhcyA9ICJzcGlfbW1jX2R1bW15IiwKKwkJLm1vZGFsaWFzID0gIm1tY19zcGkiLAogCQkubWF4X3NwZWVkX2h6ID0gMjAwMDAwMDAsICAgICAvKiBtYXggc3BpIGNsb2NrIChTQ0spIHNwZWVkIGluIEhaICovCiAJCS5idXNfbnVtID0gMCwKLQkJLmNoaXBfc2VsZWN0ID0gMCwKLQkJLnBsYXRmb3JtX2RhdGEgPSBOVUxMLAotCQkuY29udHJvbGxlcl9kYXRhID0gJnNwaV9tbWNfY2hpcF9pbmZvLAotCQkubW9kZSA9IFNQSV9NT0RFXzMsCi0JfSwKLQl7Ci0JCS5tb2RhbGlhcyA9ICJzcGlfbW1jIiwKLQkJLm1heF9zcGVlZF9oeiA9IDIwMDAwMDAwLCAgICAgLyogbWF4IHNwaSBjbG9jayAoU0NLKSBzcGVlZCBpbiBIWiAqLwotCQkuYnVzX251bSA9IDAsCi0JCS5jaGlwX3NlbGVjdCA9IENPTkZJR19TUElfTU1DX0NTX0NIQU4sCi0JCS5wbGF0Zm9ybV9kYXRhID0gTlVMTCwKLQkJLmNvbnRyb2xsZXJfZGF0YSA9ICZzcGlfbW1jX2NoaXBfaW5mbywKKwkJLmNoaXBfc2VsZWN0ID0gNCwKKwkJLnBsYXRmb3JtX2RhdGEgPSAmYmZpbl9tbWNfc3BpX3BkYXRhLAorCQkuY29udHJvbGxlcl9kYXRhID0gJm1tY19zcGlfY2hpcF9pbmZvLAogCQkubW9kZSA9IFNQSV9NT0RFXzMsCiAJfSwKICNlbmRpZgpAQCAtNzgzLDYgKzc5MiwxNyBAQAogCQkubW9kZSA9IFNQSV9DUEhBIHwgU1BJX0NQT0wsCiAJfSwKICNlbmRpZgorI2lmIGRlZmluZWQoQ09ORklHX0VOQzI4SjYwKSB8fCBkZWZpbmVkKENPTkZJR19FTkMyOEo2MF9NT0RVTEUpCisJeworCQkubW9kYWxpYXMgPSAiZW5jMjhqNjAiLAorCQkubWF4X3NwZWVkX2h6ID0gMjAwMDAwMDAsICAgICAvKiBtYXggc3BpIGNsb2NrIChTQ0spIHNwZWVkIGluIEhaICovCisJCS5pcnEgPSBJUlFfUEY2LAorCQkuYnVzX251bSA9IDAsCisJCS5jaGlwX3NlbGVjdCA9IDAsCS8qIEdQSU8gY29udHJvbGxlZCBTU0VMICovCisJCS5jb250cm9sbGVyX2RhdGEgPSAmZW5jMjhqNjBfc3BpX2NoaXBfaW5mbywKKwkJLm1vZGUgPSBTUElfTU9ERV8wLAorCX0sCisjZW5kaWYKIH07CiAKICNpZiBkZWZpbmVkKENPTkZJR19TUElfQkZJTikgfHwgZGVmaW5lZChDT05GSUdfU1BJX0JGSU5fTU9EVUxFKQpAQCAtODg1LDMwICs5MDUsNTkgQEAKICNlbmRpZgogCiAjaWYgZGVmaW5lZChDT05GSUdfQkZJTl9TSVIpIHx8IGRlZmluZWQoQ09ORklHX0JGSU5fU0lSX01PRFVMRSkKLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYmZpbl9zaXJfcmVzb3VyY2VzW10gPSB7CiAjaWZkZWYgQ09ORklHX0JGSU5fU0lSMAorc3RhdGljIHN0cnVjdCByZXNvdXJjZSBiZmluX3NpcjBfcmVzb3VyY2VzW10gPSB7CiAJewogCQkuc3RhcnQgPSAweEZGQzAwNDAwLAogCQkuZW5kID0gMHhGRkMwMDRGRiwKIAkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCiAJfSwKKwl7CisJCS5zdGFydCA9IElSUV9VQVJUMF9SWCwKKwkJLmVuZCA9IElSUV9VQVJUMF9SWCsxLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorCXsKKwkJLnN0YXJ0ID0gQ0hfVUFSVDBfUlgsCisJCS5lbmQgPSBDSF9VQVJUMF9SWCsxLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0RNQSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYmZpbl9zaXIwX2RldmljZSA9IHsKKwkubmFtZSA9ICJiZmluX3NpciIsCisJLmlkID0gMCwKKwkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUoYmZpbl9zaXIwX3Jlc291cmNlcyksCisJLnJlc291cmNlID0gYmZpbl9zaXIwX3Jlc291cmNlcywKK307CiAjZW5kaWYKICNpZmRlZiBDT05GSUdfQkZJTl9TSVIxCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGJmaW5fc2lyMV9yZXNvdXJjZXNbXSA9IHsKIAl7CiAJCS5zdGFydCA9IDB4RkZDMDIwMDAsCiAJCS5lbmQgPSAweEZGQzAyMEZGLAogCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKIAl9LAotI2VuZGlmCisJeworCQkuc3RhcnQgPSBJUlFfVUFSVDFfUlgsCisJCS5lbmQgPSBJUlFfVUFSVDFfUlgrMSwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJfSwKKwl7CisJCS5zdGFydCA9IENIX1VBUlQxX1JYLAorCQkuZW5kID0gQ0hfVUFSVDFfUlgrMSwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9ETUEsCisJfSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGJmaW5fc2lyX2RldmljZSA9IHsKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGJmaW5fc2lyMV9kZXZpY2UgPSB7CiAJLm5hbWUgPSAiYmZpbl9zaXIiLAotCS5pZCA9IDAsCi0JLm51bV9yZXNvdXJjZXMgPSBBUlJBWV9TSVpFKGJmaW5fc2lyX3Jlc291cmNlcyksCi0JLnJlc291cmNlID0gYmZpbl9zaXJfcmVzb3VyY2VzLAorCS5pZCA9IDEsCisJLm51bV9yZXNvdXJjZXMgPSBBUlJBWV9TSVpFKGJmaW5fc2lyMV9yZXNvdXJjZXMpLAorCS5yZXNvdXJjZSA9IGJmaW5fc2lyMV9yZXNvdXJjZXMsCiB9OwogI2VuZGlmCisjZW5kaWYKIAogI2lmIGRlZmluZWQoQ09ORklHX0kyQ19CTEFDS0ZJTl9UV0kpIHx8IGRlZmluZWQoQ09ORklHX0kyQ19CTEFDS0ZJTl9UV0lfTU9EVUxFKQogc3RhdGljIHN0cnVjdCByZXNvdXJjZSBiZmluX3R3aTBfcmVzb3VyY2VbXSA9IHsKQEAgLTkzMiw2ICs5ODEsOTMgQEAKIH07CiAjZW5kaWYKIAorI2lmIGRlZmluZWQoQ09ORklHX0tFWUJPQVJEX0FEUDU1ODgpIHx8IGRlZmluZWQoQ09ORklHX0tFWUJPQVJEX0FEUDU1ODhfTU9EVUxFKQorI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CisjaW5jbHVkZSA8bGludXgvaTJjL2FkcDU1ODhfa2V5cy5oPgorc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IGFkcDU1ODhfa2V5bWFwW0FEUDU1ODhfS0VZTUFQU0laRV0gPSB7CisJWzBdCSA9IEtFWV9HUkFWRSwKKwlbMV0JID0gS0VZXzEsCisJWzJdCSA9IEtFWV8yLAorCVszXQkgPSBLRVlfMywKKwlbNF0JID0gS0VZXzQsCisJWzVdCSA9IEtFWV81LAorCVs2XQkgPSBLRVlfNiwKKwlbN10JID0gS0VZXzcsCisJWzhdCSA9IEtFWV84LAorCVs5XQkgPSBLRVlfOSwKKwlbMTBdCSA9IEtFWV8wLAorCVsxMV0JID0gS0VZX01JTlVTLAorCVsxMl0JID0gS0VZX0VRVUFMLAorCVsxM10JID0gS0VZX0JBQ0tTTEFTSCwKKwlbMTVdCSA9IEtFWV9LUDAsCisJWzE2XQkgPSBLRVlfUSwKKwlbMTddCSA9IEtFWV9XLAorCVsxOF0JID0gS0VZX0UsCisJWzE5XQkgPSBLRVlfUiwKKwlbMjBdCSA9IEtFWV9ULAorCVsyMV0JID0gS0VZX1ksCisJWzIyXQkgPSBLRVlfVSwKKwlbMjNdCSA9IEtFWV9JLAorCVsyNF0JID0gS0VZX08sCisJWzI1XQkgPSBLRVlfUCwKKwlbMjZdCSA9IEtFWV9MRUZUQlJBQ0UsCisJWzI3XQkgPSBLRVlfUklHSFRCUkFDRSwKKwlbMjldCSA9IEtFWV9LUDEsCisJWzMwXQkgPSBLRVlfS1AyLAorCVszMV0JID0gS0VZX0tQMywKKwlbMzJdCSA9IEtFWV9BLAorCVszM10JID0gS0VZX1MsCisJWzM0XQkgPSBLRVlfRCwKKwlbMzVdCSA9IEtFWV9GLAorCVszNl0JID0gS0VZX0csCisJWzM3XQkgPSBLRVlfSCwKKwlbMzhdCSA9IEtFWV9KLAorCVszOV0JID0gS0VZX0ssCisJWzQwXQkgPSBLRVlfTCwKKwlbNDFdCSA9IEtFWV9TRU1JQ09MT04sCisJWzQyXQkgPSBLRVlfQVBPU1RST1BIRSwKKwlbNDNdCSA9IEtFWV9CQUNLU0xBU0gsCisJWzQ1XQkgPSBLRVlfS1A0LAorCVs0Nl0JID0gS0VZX0tQNSwKKwlbNDddCSA9IEtFWV9LUDYsCisJWzQ4XQkgPSBLRVlfMTAyTkQsCisJWzQ5XQkgPSBLRVlfWiwKKwlbNTBdCSA9IEtFWV9YLAorCVs1MV0JID0gS0VZX0MsCisJWzUyXQkgPSBLRVlfViwKKwlbNTNdCSA9IEtFWV9CLAorCVs1NF0JID0gS0VZX04sCisJWzU1XQkgPSBLRVlfTSwKKwlbNTZdCSA9IEtFWV9DT01NQSwKKwlbNTddCSA9IEtFWV9ET1QsCisJWzU4XQkgPSBLRVlfU0xBU0gsCisJWzYwXQkgPSBLRVlfS1BET1QsCisJWzYxXQkgPSBLRVlfS1A3LAorCVs2Ml0JID0gS0VZX0tQOCwKKwlbNjNdCSA9IEtFWV9LUDksCisJWzY0XQkgPSBLRVlfU1BBQ0UsCisJWzY1XQkgPSBLRVlfQkFDS1NQQUNFLAorCVs2Nl0JID0gS0VZX1RBQiwKKwlbNjddCSA9IEtFWV9LUEVOVEVSLAorCVs2OF0JID0gS0VZX0VOVEVSLAorCVs2OV0JID0gS0VZX0VTQywKKwlbNzBdCSA9IEtFWV9ERUxFVEUsCisJWzc0XQkgPSBLRVlfS1BNSU5VUywKKwlbNzZdCSA9IEtFWV9VUCwKKwlbNzddCSA9IEtFWV9ET1dOLAorCVs3OF0JID0gS0VZX1JJR0hULAorCVs3OV0JID0gS0VZX0xFRlQsCit9OworCitzdGF0aWMgc3RydWN0IGFkcDU1ODhfa3BhZF9wbGF0Zm9ybV9kYXRhIGFkcDU1ODhfa3BhZF9kYXRhID0geworCS5yb3dzCQk9IDgsCisJLmNvbHMJCT0gMTAsCisJLmtleW1hcAkJPSBhZHA1NTg4X2tleW1hcCwKKwkua2V5bWFwc2l6ZQk9IEFSUkFZX1NJWkUoYWRwNTU4OF9rZXltYXApLAorCS5yZXBlYXQJCT0gMCwKK307CisjZW5kaWYKKwogI2lmZGVmIENPTkZJR19JMkNfQk9BUkRJTkZPCiBzdGF0aWMgc3RydWN0IGkyY19ib2FyZF9pbmZvIF9faW5pdGRhdGEgYmZpbl9pMmNfYm9hcmRfaW5mb1tdID0gewogI2lmIGRlZmluZWQoQ09ORklHX0pPWVNUSUNLX0FENzE0MikgfHwgZGVmaW5lZChDT05GSUdfSk9ZU1RJQ0tfQUQ3MTQyX01PRFVMRSkKQEAgLTk1OCw2ICsxMDk0LDEzIEBACiAJCS5wbGF0Zm9ybV9kYXRhID0gKHZvaWQgKikmYmZpbl9hZDc4NzlfdHNfaW5mbywKIAl9LAogI2VuZGlmCisjaWYgZGVmaW5lZChDT05GSUdfS0VZQk9BUkRfQURQNTU4OCkgfHwgZGVmaW5lZChDT05GSUdfS0VZQk9BUkRfQURQNTU4OF9NT0RVTEUpCisJeworCQlJMkNfQk9BUkRfSU5GTygiYWRwNTU4OC1rZXlzIiwgMHgzNCksCisJCS5pcnEgPSBJUlFfUEcwLAorCQkucGxhdGZvcm1fZGF0YSA9ICh2b2lkICopJmFkcDU1ODhfa3BhZF9kYXRhLAorCX0sCisjZW5kaWYKIH07CiAjZW5kaWYKIApAQCAtMTA1Nyw2ICsxMjAwLDEwIEBACiAJJmlzcDEzNjJfaGNkX2RldmljZSwKICNlbmRpZgogCisjaWYgZGVmaW5lZChDT05GSUdfVVNCX0lTUDE3NjBfSENEKSB8fCBkZWZpbmVkKENPTkZJR19VU0JfSVNQMTc2MF9IQ0RfTU9EVUxFKQorCSZiZmluX2lzcDE3NjBfZGV2aWNlLAorI2VuZGlmCisKICNpZiBkZWZpbmVkKENPTkZJR19TTUM5MVgpIHx8IGRlZmluZWQoQ09ORklHX1NNQzkxWF9NT0RVTEUpCiAJJnNtYzkxeF9kZXZpY2UsCiAjZW5kaWYKQEAgLTEwOTgsNyArMTI0NSwxMiBAQAogI2VuZGlmCiAKICNpZiBkZWZpbmVkKENPTkZJR19CRklOX1NJUikgfHwgZGVmaW5lZChDT05GSUdfQkZJTl9TSVJfTU9EVUxFKQotCSZiZmluX3Npcl9kZXZpY2UsCisjaWZkZWYgQ09ORklHX0JGSU5fU0lSMAorCSZiZmluX3NpcjBfZGV2aWNlLAorI2VuZGlmCisjaWZkZWYgQ09ORklHX0JGSU5fU0lSMQorCSZiZmluX3NpcjFfZGV2aWNlLAorI2VuZGlmCiAjZW5kaWYKIAogI2lmIGRlZmluZWQoQ09ORklHX0kyQ19CTEFDS0ZJTl9UV0kpIHx8IGRlZmluZWQoQ09ORklHX0kyQ19CTEFDS0ZJTl9UV0lfTU9EVUxFKQpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2JvYXJkcy90Y21fYmY1MzcuYyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9ib2FyZHMvdGNtX2JmNTM3LmMKaW5kZXggZDVmZjcwNS4uMmY0YjA2NiAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2JvYXJkcy90Y21fYmY1MzcuYworKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvYm9hcmRzL3RjbV9iZjUzNy5jCkBAIC0zMDgsNiArMzA4LDE5IEBACiB9OwogI2VuZGlmCiAKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYmZpbl9ncGlvc19yZXNvdXJjZXMgPSB7CisJLnN0YXJ0ID0gMCwKKwkuZW5kICAgPSBNQVhfQkxBQ0tGSU5fR1BJT1MgLSAxLAorCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYmZpbl9ncGlvc19kZXZpY2UgPSB7CisJLm5hbWUgPSAic2ltcGxlLWdwaW8iLAorCS5pZCA9IC0xLAorCS5udW1fcmVzb3VyY2VzID0gMSwKKwkucmVzb3VyY2UgPSAmYmZpbl9ncGlvc19yZXNvdXJjZXMsCit9OworCiAjaWYgZGVmaW5lZChDT05GSUdfTVREX0dQSU9fQUREUikgfHwgZGVmaW5lZChDT05GSUdfTVREX0dQSU9fQUREUl9NT0RVTEUpCiBzdGF0aWMgc3RydWN0IG10ZF9wYXJ0aXRpb24gY21fcGFydGl0aW9uc1tdID0gewogCXsKQEAgLTM3OSwzMCArMzkyLDU5IEBACiAjZW5kaWYKIAogI2lmIGRlZmluZWQoQ09ORklHX0JGSU5fU0lSKSB8fCBkZWZpbmVkKENPTkZJR19CRklOX1NJUl9NT0RVTEUpCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIGJmaW5fc2lyX3Jlc291cmNlc1tdID0gewogI2lmZGVmIENPTkZJR19CRklOX1NJUjAKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYmZpbl9zaXIwX3Jlc291cmNlc1tdID0gewogCXsKIAkJLnN0YXJ0ID0gMHhGRkMwMDQwMCwKIAkJLmVuZCA9IDB4RkZDMDA0RkYsCiAJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAogCX0sCisJeworCQkuc3RhcnQgPSBJUlFfVUFSVDBfUlgsCisJCS5lbmQgPSBJUlFfVUFSVDBfUlgrMSwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJfSwKKwl7CisJCS5zdGFydCA9IENIX1VBUlQwX1JYLAorCQkuZW5kID0gQ0hfVUFSVDBfUlgrMSwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9ETUEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGJmaW5fc2lyMF9kZXZpY2UgPSB7CisJLm5hbWUgPSAiYmZpbl9zaXIiLAorCS5pZCA9IDAsCisJLm51bV9yZXNvdXJjZXMgPSBBUlJBWV9TSVpFKGJmaW5fc2lyMF9yZXNvdXJjZXMpLAorCS5yZXNvdXJjZSA9IGJmaW5fc2lyMF9yZXNvdXJjZXMsCit9OwogI2VuZGlmCiAjaWZkZWYgQ09ORklHX0JGSU5fU0lSMQorc3RhdGljIHN0cnVjdCByZXNvdXJjZSBiZmluX3NpcjFfcmVzb3VyY2VzW10gPSB7CiAJewogCQkuc3RhcnQgPSAweEZGQzAyMDAwLAogCQkuZW5kID0gMHhGRkMwMjBGRiwKIAkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCiAJfSwKLSNlbmRpZgorCXsKKwkJLnN0YXJ0ID0gSVJRX1VBUlQxX1JYLAorCQkuZW5kID0gSVJRX1VBUlQxX1JYKzEsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCX0sCisJeworCQkuc3RhcnQgPSBDSF9VQVJUMV9SWCwKKwkJLmVuZCA9IENIX1VBUlQxX1JYKzEsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfRE1BLAorCX0sCiB9OwogCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZmluX3Npcl9kZXZpY2UgPSB7CitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZmluX3NpcjFfZGV2aWNlID0gewogCS5uYW1lID0gImJmaW5fc2lyIiwKLQkuaWQgPSAwLAotCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRShiZmluX3Npcl9yZXNvdXJjZXMpLAotCS5yZXNvdXJjZSA9IGJmaW5fc2lyX3Jlc291cmNlcywKKwkuaWQgPSAxLAorCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRShiZmluX3NpcjFfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UgPSBiZmluX3NpcjFfcmVzb3VyY2VzLAogfTsKICNlbmRpZgorI2VuZGlmCiAKICNpZiBkZWZpbmVkKENPTkZJR19JMkNfQkxBQ0tGSU5fVFdJKSB8fCBkZWZpbmVkKENPTkZJR19JMkNfQkxBQ0tGSU5fVFdJX01PRFVMRSkKIHN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYmZpbl90d2kwX3Jlc291cmNlW10gPSB7CkBAIC01MjUsNyArNTY3LDEyIEBACiAjZW5kaWYKIAogI2lmIGRlZmluZWQoQ09ORklHX0JGSU5fU0lSKSB8fCBkZWZpbmVkKENPTkZJR19CRklOX1NJUl9NT0RVTEUpCi0JJmJmaW5fc2lyX2RldmljZSwKKyNpZmRlZiBDT05GSUdfQkZJTl9TSVIwCisJJmJmaW5fc2lyMF9kZXZpY2UsCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfQkZJTl9TSVIxCisJJmJmaW5fc2lyMV9kZXZpY2UsCisjZW5kaWYKICNlbmRpZgogCiAjaWYgZGVmaW5lZChDT05GSUdfSTJDX0JMQUNLRklOX1RXSSkgfHwgZGVmaW5lZChDT05GSUdfSTJDX0JMQUNLRklOX1RXSV9NT0RVTEUpCkBAIC01NjQsNiArNjExLDggQEAKICNpZiBkZWZpbmVkKENPTkZJR19NVERfR1BJT19BRERSKSB8fCBkZWZpbmVkKENPTkZJR19NVERfR1BJT19BRERSX01PRFVMRSkKIAkmY21fZmxhc2hfZGV2aWNlLAogI2VuZGlmCisKKwkmYmZpbl9ncGlvc19kZXZpY2UsCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBjbV9iZjUzN19pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvZG1hLmMgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvZG1hLmMKaW5kZXggNGVkYjM2My4uODExODUwNSAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2RtYS5jCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9kbWEuYwpAQCAtMzEsNyArMzEsNyBAQAogI2luY2x1ZGUgPGFzbS9ibGFja2Zpbi5oPgogI2luY2x1ZGUgPGFzbS9kbWEuaD4KIAotc3RydWN0IGRtYV9yZWdpc3RlciAqZG1hX2lvX2Jhc2VfYWRkcltNQVhfQkxBQ0tGSU5fRE1BX0NIQU5ORUxdID0geworc3RydWN0IGRtYV9yZWdpc3RlciAqZG1hX2lvX2Jhc2VfYWRkcltNQVhfRE1BX0NIQU5ORUxTXSA9IHsKIAkoc3RydWN0IGRtYV9yZWdpc3RlciAqKSBETUEwX05FWFRfREVTQ19QVFIsCiAJKHN0cnVjdCBkbWFfcmVnaXN0ZXIgKikgRE1BMV9ORVhUX0RFU0NfUFRSLAogCShzdHJ1Y3QgZG1hX3JlZ2lzdGVyICopIERNQTJfTkVYVF9ERVNDX1BUUiwKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9oZWFkLlMgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvaGVhZC5TCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNWM5NGJmLi4wMDAwMDAwCi0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9oZWFkLlMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDYgKzAsMCBAQAotLyoKLSAqIEZpbGU6ICAgICAgICAgYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2hlYWQuUwotICogQmFzZWQgb246ICAgICBhcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvaGVhZC5TCi0gKiBBdXRob3I6ICAgICAgIEplZmYgRGlvbm5lIDxqZWZmQHVjbGludXgub3JnPiBDT1BZUklHSFQgMTk5OCBELiBKZWZmIERpb25uZQotICoKLSAqIENyZWF0ZWQ6ICAgICAgMTk5OAotICogRGVzY3JpcHRpb246ICBTdGFydHVwIGNvZGUgZm9yIEJsYWNrZmluIEJGNTM3Ci0gKgotICogTW9kaWZpZWQ6Ci0gKiAgICAgICAgICAgICAgIENvcHlyaWdodCAyMDA0LTIwMDYgQW5hbG9nIERldmljZXMgSW5jLgotICoKLSAqIEJ1Z3M6ICAgICAgICAgRW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCBzZWUgdGhlIGZpbGUgQ09QWUlORywgb3Igd3JpdGUKLSAqIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gKiA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotICovCi0KLSNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGFzbS9ibGFja2Zpbi5oPgotI2lmZGVmIENPTkZJR19CRklOX0tFUk5FTF9DTE9DSwotI2luY2x1ZGUgPGFzbS9jbG9ja3MuaD4KLSNpbmNsdWRlIDxtYWNoL21lbV9pbml0Lmg+Ci0jZW5kaWYKLQotLnNlY3Rpb24gLmwxLnRleHQKLSNpZmRlZiBDT05GSUdfQkZJTl9LRVJORUxfQ0xPQ0sKLUVOVFJZKF9zdGFydF9kbWFfY29kZSkKLQotCS8qIEVuYWJsZSBQSFkgQ0xLIGJ1ZmZlciBvdXRwdXQgKi8KLQlwMC5oID0gaGkoVlJfQ1RMKTsKLQlwMC5sID0gbG8oVlJfQ1RMKTsKLQlyMC5sID0gd1twMF07Ci0JYml0c2V0KHIwLCAxNCk7Ci0Jd1twMF0gPSByMC5sOwotCXNzeW5jOwotCi0JcDAuaCA9IGhpKFNJQ19JV1IpOwotCXAwLmwgPSBsbyhTSUNfSVdSKTsKLQlyMC5sID0gMHgxOwotCXIwLmggPSAweDA7Ci0JW3AwXSA9IHIwOwotCVNTWU5DOwotCi0JLyoKLQkgKiAgU2V0IFBMTF9DVEwKLQkgKiAgIC0gWzE0OjA5XSA9IE1TRUxbNTowXSA6IENMS0lOIC8gVkNPIG11bHRpcGxpY2F0aW9uIGZhY3RvcnMKLQkgKiAgIC0gWzhdICAgICA9IEJZUEFTUyAgICA6IEJZUEFTUyB0aGUgUExMLCBydW4gQ0xLSU4gaW50byBDQ0xLL1NDTEsKLQkgKiAgIC0gWzddICAgICA9IG91dHB1dCBkZWxheSAoYWRkIDIwMHBzIG9mIGRlbGF5IHRvIG1lbSBzaWduYWxzKQotCSAqICAgLSBbNl0gICAgID0gaW5wdXQgZGVsYXkgKGFkZCAyMDBwcyBvZiBpbnB1dCBkZWxheSB0byBtZW0gc2lnbmFscykKLQkgKiAgIC0gWzVdICAgICA9IFBEV04gICAgICA6IDE9QWxsIENsb2NrcyBvZmYKLQkgKiAgIC0gWzNdICAgICA9IFNUT1BDSyAgICA6IDE9Q29yZSBDbG9jayBvZmYKLQkgKiAgIC0gWzFdICAgICA9IFBMTF9PRkYgICA6IDE9RGlzYWJsZSBQb3dlciB0byBQTEwKLQkgKiAgIC0gWzBdICAgICA9IERGICAgICAgICA6IDE9UGFzcyBDTEtJTi8yIHRvIFBMTCAvIDA9UGFzcyBDTEtJTiB0byBQTEwKLQkgKiAgIGFsbCBvdGhlciBiaXRzIHNldCB0byB6ZXJvCi0JICovCi0KLQlwMC5oID0gaGkoUExMX0xPQ0tDTlQpOwotCXAwLmwgPSBsbyhQTExfTE9DS0NOVCk7Ci0JcjAgPSAweDMwMChaKTsKLQl3W3AwXSA9IHIwLmw7Ci0Jc3N5bmM7Ci0KLQlQMi5IID0gaGkoRUJJVV9TREdDVEwpOwotCVAyLkwgPSBsbyhFQklVX1NER0NUTCk7Ci0JUjAgPSBbUDJdOwotCUJJVFNFVCAoUjAsIDI0KTsKLQlbUDJdID0gUjA7Ci0JU1NZTkM7Ci0KLQlyMCA9IENPTkZJR19WQ09fTVVMVCAmIDYzOyAgICAgICAvKiBMb2FkIHRoZSBWQ08gbXVsdGlwbGllciAgICAgICAgICovCi0JcjAgPSByMCA8PCA5OyAgICAgICAgICAgICAgICAgICAgLyogU2hpZnQgaXQgb3ZlciwgICAgICAgICAgICAgICAgICAqLwotCXIxID0gQ0xLSU5fSEFMRjsgICAgICAgICAgICAgICAgIC8qIERvIHdlIG5lZWQgdG8gZGl2aWRlIENMS0lOIGJ5IDI/Ki8KLQlyMCA9IHIxIHwgcjA7Ci0JcjEgPSBQTExfQllQQVNTOyAgICAgICAgICAgICAgICAgLyogQnlwYXNzIHRoZSBQTEw/ICAgICAgICAgICAgICAgICAqLwotCXIxID0gcjEgPDwgODsgICAgICAgICAgICAgICAgICAgIC8qIFNoaWZ0IGl0IG92ZXIgICAgICAgICAgICAgICAgICAgKi8KLQlyMCA9IHIxIHwgcjA7ICAgICAgICAgICAgICAgICAgICAvKiBhZGQgdGhlbSBhbGwgdG9nZXRoZXIgICAgICAgICAgICovCi0jaWZkZWYgQU5PTUFMWV8wNTAwMDI2NQotCUJJVFNFVChyMCwgMTUpOyAgICAgICAgICAgICAgICAgIC8qIEFkZCAyNTAgbVYgb2YgaHlzdGVyZXNpcyB0byBTUE9SVCBpbnB1dCBwaW5zICovCi0jZW5kaWYKLQotCXAwLmggPSBoaShQTExfQ1RMKTsKLQlwMC5sID0gbG8oUExMX0NUTCk7ICAgICAgICAgICAgICAvKiBMb2FkIHRoZSBhZGRyZXNzICAgICAgICAgICAgICAgICovCi0JY2xpIHIyOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGlzYWJsZSBpbnRlcnJ1cHRzICAgICAgICAgICAgICAqLwotCXNzeW5jOwotCXdbcDBdID0gcjAubDsgICAgICAgICAgICAgICAgICAgIC8qIFNldCB0aGUgdmFsdWUgICAgICAgICAgICAgICAgICAgKi8KLQlpZGxlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBXYWl0IGZvciB0aGUgUExMIHRvIHN0YWJsaXplICAgICovCi0Jc3RpIHIyOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRW5hYmxlIGludGVycnVwdHMgICAgICAgICAgICAgICAqLwotCi0uTGNoZWNrX2FnYWluOgotCXAwLmggPSBoaShQTExfU1RBVCk7Ci0JcDAubCA9IGxvKFBMTF9TVEFUKTsKLQlSMCA9IFdbUDBdKFopOwotCUNDID0gQklUVFNUKFIwLDUpOwotCWlmICEgQ0MganVtcCAuTGNoZWNrX2FnYWluOwotCi0JLyogQ29uZmlndXJlIFNDTEsgJiBDQ0xLIERpdmlkZXJzICovCi0JcjAgPSAoQ09ORklHX0NDTEtfQUNUX0RJViB8IENPTkZJR19TQ0xLX0RJVik7Ci0JcDAuaCA9IGhpKFBMTF9ESVYpOwotCXAwLmwgPSBsbyhQTExfRElWKTsKLQl3W3AwXSA9IHIwLmw7Ci0Jc3N5bmM7Ci0KLQlwMC5sID0gbG8oRUJJVV9TRFJSQyk7Ci0JcDAuaCA9IGhpKEVCSVVfU0RSUkMpOwotCXIwID0gbWVtX1NEUlJDOwotCXdbcDBdID0gcjAubDsKLQlzc3luYzsKLQotCVAyLkggPSBoaShFQklVX1NER0NUTCk7Ci0JUDIuTCA9IGxvKEVCSVVfU0RHQ1RMKTsKLQlSMCA9IFtQMl07Ci0JQklUQ0xSIChSMCwgMjQpOwotCXAwLmggPSBoaShFQklVX1NEU1RBVCk7Ci0JcDAubCA9IGxvKEVCSVVfU0RTVEFUKTsKLQlyMi5sID0gd1twMF07Ci0JY2MgPSBiaXR0c3QocjIsMyk7Ci0JaWYgIWNjIGp1bXAgLkxza2lwOwotCU5PUDsKLQlCSVRTRVQgKFIwLCAyMyk7Ci0uTHNraXA6Ci0JW1AyXSA9IFIwOwotCVNTWU5DOwotCi0JUjAuTCA9IGxvKG1lbV9TREdDVEwpOwotCVIwLkggPSBoaShtZW1fU0RHQ1RMKTsKLQlSMSA9IFtwMl07Ci0JUjEgPSBSMSB8IFIwOwotCVtQMl0gPSBSMTsKLQlTU1lOQzsKLQotCVJUUzsKLUVORFBST0MoX3N0YXJ0X2RtYV9jb2RlKQotI2VuZGlmIC8qIENPTkZJR19CRklOX0tFUk5FTF9DTE9DSyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2luY2x1ZGUvbWFjaC9hbm9tYWx5LmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvaW5jbHVkZS9tYWNoL2Fub21hbHkuaAppbmRleCBjNjg5OTI0Li45Y2IzOTEyIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvaW5jbHVkZS9tYWNoL2Fub21hbHkuaAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvaW5jbHVkZS9tYWNoL2Fub21hbHkuaApAQCAtNyw3ICs3LDcgQEAKICAqLwogCiAvKiBUaGlzIGZpbGUgc2hvdWxlIGJlIHVwIHRvIGRhdGUgd2l0aDoKLSAqICAtIFJldmlzaW9uIEMsIDAyLzA4LzIwMDg7IEFEU1AtQkY1MzQvQURTUC1CRjUzNi9BRFNQLUJGNTM3IEJsYWNrZmluIFByb2Nlc3NvciBBbm9tYWx5IExpc3QKKyAqICAtIFJldmlzaW9uIEQsIDA5LzE4LzIwMDg7IEFEU1AtQkY1MzQvQURTUC1CRjUzNi9BRFNQLUJGNTM3IEJsYWNrZmluIFByb2Nlc3NvciBBbm9tYWx5IExpc3QKICAqLwogCiAjaWZuZGVmIF9NQUNIX0FOT01BTFlfSF8KQEAgLTE0OCw2ICsxNDgsMTQgQEAKICNkZWZpbmUgQU5PTUFMWV8wNTAwMDQwMiAoX19TSUxJQ09OX1JFVklTSU9OX18gPj0gNSkKIC8qIExldmVsLVNlbnNpdGl2ZSBFeHRlcm5hbCBHUElPIFdha2V1cHMgTWF5IENhdXNlIEluZGVmaW5pdGUgU3RhbGwgKi8KICNkZWZpbmUgQU5PTUFMWV8wNTAwMDQwMyAoMSkKKy8qIFNwZWN1bGF0aXZlIEZldGNoZXMgQ2FuIENhdXNlIFVuZGVzaXJlZCBFeHRlcm5hbCBGSUZPIE9wZXJhdGlvbnMgKi8KKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDQxNiAoMSkKKy8qIE11bHRpY2hhbm5lbCBTUE9SVCBDaGFubmVsIE1pc2FsaWdubWVudCBVbmRlciBTcGVjaWZpYyBDb25maWd1cmF0aW9uICovCisjZGVmaW5lIEFOT01BTFlfMDUwMDA0MjUgKDEpCisvKiBTcGVjdWxhdGl2ZSBGZXRjaGVzIG9mIEluZGlyZWN0LVBvaW50ZXIgSW5zdHJ1Y3Rpb25zIENhbiBDYXVzZSBGYWxzZSBIYXJkd2FyZSBFcnJvcnMgKi8KKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDQyNiAoMSkKKy8qIElGTFVTSCBJbnN0cnVjdGlvbiBhdCBFbmQgb2YgSGFyZHdhcmUgTG9vcCBDYXVzZXMgSW5maW5pdGUgU3RhbGwgKi8KKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDQ0MyAoMSkKIAogLyogQW5vbWFsaWVzIHRoYXQgZG9uJ3QgZXhpc3Qgb24gdGhpcyBwcm9jICovCiAjZGVmaW5lIEFOT01BTFlfMDUwMDAxMjUgKDApCkBAIC0xNjEsNSArMTY5LDggQEAKICNkZWZpbmUgQU5PTUFMWV8wNTAwMDM1MyAoMSkKICNkZWZpbmUgQU5PTUFMWV8wNTAwMDM2MyAoMCkKICNkZWZpbmUgQU5PTUFMWV8wNTAwMDM4NiAoMSkKKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDQxMiAoMCkKKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDQzMiAoMCkKKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDQzNSAoMCkKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvaW5jbHVkZS9tYWNoL2JmNTM3LmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvaW5jbHVkZS9tYWNoL2JmNTM3LmgKaW5kZXggMjRkNWM5ZC4uZjE5NGE4NCAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2luY2x1ZGUvbWFjaC9iZjUzNy5oCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9pbmNsdWRlL21hY2gvYmY1MzcuaApAQCAtMTMzLDcgKzEzMyw3IEBACiAjZW5kaWYKIAogI2lmbmRlZiBDUFUKLSNlcnJvciBVbmtub3duIENQVSB0eXBlIC0gVGhpcyBrZXJuZWwgZG9lc24ndCBzZWVtIHRvIGJlIGNvbmZpZ3VyZWQgcHJvcGVybHkKKyNlcnJvciAiVW5rbm93biBDUFUgdHlwZSAtIFRoaXMga2VybmVsIGRvZXNuJ3Qgc2VlbSB0byBiZSBjb25maWd1cmVkIHByb3Blcmx5IgogI2VuZGlmCiAKICNlbmRpZgkJCQkvKiBfX01BQ0hfQkY1MzdfSF9fICAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2luY2x1ZGUvbWFjaC9iZmluX3Npci5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2luY2x1ZGUvbWFjaC9iZmluX3Npci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZmQ4YWQ0Li4wMDAwMDAwCi0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9pbmNsdWRlL21hY2gvYmZpbl9zaXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDE0MiArMCwwIEBACi0vKgotICogQmxhY2tmaW4gSW5mcmEtcmVkIERyaXZlcgotICoKLSAqIENvcHlyaWdodCAyMDA2LTIwMDggQW5hbG9nIERldmljZXMgSW5jLgotICoKLSAqIEVudGVyIGJ1Z3MgYXQgaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnLwotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L3NlcmlhbC5oPgotI2luY2x1ZGUgPGFzbS9kbWEuaD4KLSNpbmNsdWRlIDxhc20vcG9ydG11eC5oPgotCi0jZGVmaW5lIFNJUl9VQVJUX0dFVF9DSEFSKHBvcnQpICAgYmZpbl9yZWFkMTYoKHBvcnQpLT5tZW1iYXNlICsgT0ZGU0VUX1JCUikKLSNkZWZpbmUgU0lSX1VBUlRfR0VUX0RMTChwb3J0KSAgICBiZmluX3JlYWQxNigocG9ydCktPm1lbWJhc2UgKyBPRkZTRVRfRExMKQotI2RlZmluZSBTSVJfVUFSVF9HRVRfSUVSKHBvcnQpICAgIGJmaW5fcmVhZDE2KChwb3J0KS0+bWVtYmFzZSArIE9GRlNFVF9JRVIpCi0jZGVmaW5lIFNJUl9VQVJUX0dFVF9ETEgocG9ydCkgICAgYmZpbl9yZWFkMTYoKHBvcnQpLT5tZW1iYXNlICsgT0ZGU0VUX0RMSCkKLSNkZWZpbmUgU0lSX1VBUlRfR0VUX0lJUihwb3J0KSAgICBiZmluX3JlYWQxNigocG9ydCktPm1lbWJhc2UgKyBPRkZTRVRfSUlSKQotI2RlZmluZSBTSVJfVUFSVF9HRVRfTENSKHBvcnQpICAgIGJmaW5fcmVhZDE2KChwb3J0KS0+bWVtYmFzZSArIE9GRlNFVF9MQ1IpCi0jZGVmaW5lIFNJUl9VQVJUX0dFVF9HQ1RMKHBvcnQpICAgYmZpbl9yZWFkMTYoKHBvcnQpLT5tZW1iYXNlICsgT0ZGU0VUX0dDVEwpCi0KLSNkZWZpbmUgU0lSX1VBUlRfUFVUX0NIQVIocG9ydCwgdikgYmZpbl93cml0ZTE2KCgocG9ydCktPm1lbWJhc2UgKyBPRkZTRVRfVEhSKSwgdikKLSNkZWZpbmUgU0lSX1VBUlRfUFVUX0RMTChwb3J0LCB2KSAgYmZpbl93cml0ZTE2KCgocG9ydCktPm1lbWJhc2UgKyBPRkZTRVRfRExMKSwgdikKLSNkZWZpbmUgU0lSX1VBUlRfUFVUX0lFUihwb3J0LCB2KSAgYmZpbl93cml0ZTE2KCgocG9ydCktPm1lbWJhc2UgKyBPRkZTRVRfSUVSKSwgdikKLSNkZWZpbmUgU0lSX1VBUlRfUFVUX0RMSChwb3J0LCB2KSAgYmZpbl93cml0ZTE2KCgocG9ydCktPm1lbWJhc2UgKyBPRkZTRVRfRExIKSwgdikKLSNkZWZpbmUgU0lSX1VBUlRfUFVUX0xDUihwb3J0LCB2KSAgYmZpbl93cml0ZTE2KCgocG9ydCktPm1lbWJhc2UgKyBPRkZTRVRfTENSKSwgdikKLSNkZWZpbmUgU0lSX1VBUlRfUFVUX0dDVEwocG9ydCwgdikgYmZpbl93cml0ZTE2KCgocG9ydCktPm1lbWJhc2UgKyBPRkZTRVRfR0NUTCksIHYpCi0KLSNpZmRlZiBDT05GSUdfU0lSX0JGSU5fRE1BCi1zdHJ1Y3QgZG1hX3J4X2J1ZiB7Ci0JY2hhciAqYnVmOwotCWludCBoZWFkOwotCWludCB0YWlsOwotCX07Ci0jZW5kaWYgLyogQ09ORklHX1NJUl9CRklOX0RNQSAqLwotCi1zdHJ1Y3QgYmZpbl9zaXJfcG9ydCB7Ci0JdW5zaWduZWQgY2hhciBfX2lvbWVtICAgKm1lbWJhc2U7Ci0JdW5zaWduZWQgaW50ICAgICAgICAgICAgaXJxOwotCXVuc2lnbmVkIGludCAgICAgICAgICAgIGxzcjsKLQl1bnNpZ25lZCBsb25nICAgICAgICAgICBjbGs7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgICAgICAgKmRldjsKLSNpZmRlZiBDT05GSUdfU0lSX0JGSU5fRE1BCi0JaW50ICAgICAgICAgICAgICAgICAgICAgdHhfZG9uZTsKLQlzdHJ1Y3QgZG1hX3J4X2J1ZiAgICAgICByeF9kbWFfYnVmOwotCXN0cnVjdCB0aW1lcl9saXN0ICAgICAgIHJ4X2RtYV90aW1lcjsKLQlpbnQgICAgICAgICAgICAgICAgICAgICByeF9kbWFfbnJvd3M7Ci0jZW5kaWYgLyogQ09ORklHX1NJUl9CRklOX0RNQSAqLwotCXVuc2lnbmVkIGludCAgICAgICAgICAgIHR4X2RtYV9jaGFubmVsOwotCXVuc2lnbmVkIGludCAgICAgICAgICAgIHJ4X2RtYV9jaGFubmVsOwotfTsKLQotc3RydWN0IGJmaW5fc2lyX3BvcnQgc2lyX3BvcnRzW0JGSU5fVUFSVF9OUl9QT1JUU107Ci0KLXN0cnVjdCBiZmluX3Npcl9wb3J0X3JlcyB7Ci0JdW5zaWduZWQgbG9uZyAgIGJhc2VfYWRkcjsKLQlpbnQgICAgICAgICAgICAgaXJxOwotCXVuc2lnbmVkIGludCAgICByeF9kbWFfY2hhbm5lbDsKLQl1bnNpZ25lZCBpbnQgICAgdHhfZG1hX2NoYW5uZWw7Ci19OwotCi1zdHJ1Y3QgYmZpbl9zaXJfcG9ydF9yZXMgYmZpbl9zaXJfcG9ydF9yZXNvdXJjZVtdID0gewotI2lmZGVmIENPTkZJR19CRklOX1NJUjAKLQl7Ci0JMHhGRkMwMDQwMCwKLQlJUlFfVUFSVDBfUlgsCi0JQ0hfVUFSVDBfUlgsCi0JQ0hfVUFSVDBfVFgsCi0JfSwKLSNlbmRpZgotI2lmZGVmIENPTkZJR19CRklOX1NJUjEKLQl7Ci0JMHhGRkMwMjAwMCwKLQlJUlFfVUFSVDFfUlgsCi0JQ0hfVUFSVDFfUlgsCi0JQ0hfVUFSVDFfVFgsCi0JfSwKLSNlbmRpZgotfTsKLQotaW50IG5yX3NpcnMgPSBBUlJBWV9TSVpFKGJmaW5fc2lyX3BvcnRfcmVzb3VyY2UpOwotCi1zdHJ1Y3QgYmZpbl9zaXJfc2VsZiB7Ci0Jc3RydWN0IGJmaW5fc2lyX3BvcnQgICAgKnNpcl9wb3J0OwotCXNwaW5sb2NrX3QgICAgICAgICAgICAgIGxvY2s7Ci0JdW5zaWduZWQgaW50ICAgICAgICAgICAgb3BlbjsKLQlpbnQgICAgICAgICAgICAgICAgICAgICBzcGVlZDsKLQlpbnQgICAgICAgICAgICAgICAgICAgICBuZXdzcGVlZDsKLQotCXN0cnVjdCBza19idWZmICAgICAgICAgICp0eHNrYjsKLQlzdHJ1Y3Qgc2tfYnVmZiAgICAgICAgICAqcnhza2I7Ci0Jc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7Ci0Jc3RydWN0IGRldmljZSAgICAgICAgICAgKmRldjsKLQlzdHJ1Y3QgaXJsYXBfY2IgICAgICAgICAqaXJsYXA7Ci0Jc3RydWN0IHFvc19pbmZvICAgICAgICAgcW9zOwotCi0JaW9idWZmX3QgICAgICAgICAgICAgICAgdHhfYnVmZjsKLQlpb2J1ZmZfdCAgICAgICAgICAgICAgICByeF9idWZmOwotCi0Jc3RydWN0IHdvcmtfc3RydWN0ICAgICAgd29yazsKLQlpbnQgICAgICAgICAgICAgICAgICAgICBtdHQ7Ci19OwotCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBTSVJfVUFSVF9HRVRfTFNSKHN0cnVjdCBiZmluX3Npcl9wb3J0ICpwb3J0KQotewotCXVuc2lnbmVkIGludCBsc3IgPSBiZmluX3JlYWQxNihwb3J0LT5tZW1iYXNlICsgT0ZGU0VUX0xTUik7Ci0JcG9ydC0+bHNyIHw9IChsc3IgJiAoQkl8RkV8UEV8T0UpKTsKLQlyZXR1cm4gbHNyIHwgcG9ydC0+bHNyOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgU0lSX1VBUlRfQ0xFQVJfTFNSKHN0cnVjdCBiZmluX3Npcl9wb3J0ICpwb3J0KQotewotCXBvcnQtPmxzciA9IDA7Ci0JYmZpbl9yZWFkMTYocG9ydC0+bWVtYmFzZSArIE9GRlNFVF9MU1IpOwotfQotCi0jZGVmaW5lIERSSVZFUl9OQU1FICJiZmluX3NpciIKLQotc3RhdGljIGludCBiZmluX3Npcl9od19pbml0KHZvaWQpCi17Ci0JaW50IHJldCA9IC1FTk9ERVY7Ci0jaWZkZWYgQ09ORklHX0JGSU5fU0lSMAotCXJldCA9IHBlcmlwaGVyYWxfcmVxdWVzdChQX1VBUlQwX1RYLCBEUklWRVJfTkFNRSk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQlyZXQgPSBwZXJpcGhlcmFsX3JlcXVlc3QoUF9VQVJUMF9SWCwgRFJJVkVSX05BTUUpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0jZW5kaWYKLQotI2lmZGVmIENPTkZJR19CRklOX1NJUjEKLQlyZXQgPSBwZXJpcGhlcmFsX3JlcXVlc3QoUF9VQVJUMV9UWCwgRFJJVkVSX05BTUUpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0JcmV0ID0gcGVyaXBoZXJhbF9yZXF1ZXN0KFBfVUFSVDFfUlgsIERSSVZFUl9OQU1FKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotI2VuZGlmCi0JcmV0dXJuIHJldDsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9pbmNsdWRlL21hY2gvYmxhY2tmaW4uaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9pbmNsdWRlL21hY2gvYmxhY2tmaW4uaAppbmRleCBjZmZjNzg2Li43ZDYwNjljIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvaW5jbHVkZS9tYWNoL2JsYWNrZmluLmgKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2luY2x1ZGUvbWFjaC9ibGFja2Zpbi5oCkBAIC04Miw3ICs4Miw3IEBACiAjZGVmaW5lIFNUQVRVU19QMQkweDAyCiAjZGVmaW5lIFNUQVRVU19QMAkweDAxCiAKLS8qIERNQSBDaGFubm5lbCAqLworLyogRE1BIENoYW5uZWwgKi8KICNkZWZpbmUgYmZpbl9yZWFkX0NIX1VBUlRfUlgoKSBiZmluX3JlYWRfQ0hfVUFSVDBfUlgoKQogI2RlZmluZSBiZmluX3dyaXRlX0NIX1VBUlRfUlgodmFsKSBiZmluX3dyaXRlX0NIX1VBUlQwX1JYKHZhbCkKICNkZWZpbmUgQ0hfVUFSVF9SWCBDSF9VQVJUMF9SWApkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2luY2x1ZGUvbWFjaC9jZGVmQkY1MzQuaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9pbmNsdWRlL21hY2gvY2RlZkJGNTM0LmgKaW5kZXggODhkNDkxYy4uNWY4YjVmOCAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2luY2x1ZGUvbWFjaC9jZGVmQkY1MzQuaAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvaW5jbHVkZS9tYWNoL2NkZWZCRjUzNC5oCkBAIC00MCw1NSArNDAsMTEgQEAKIC8qIEluY2x1ZGUgY29yZSBzcGVjaWZpYyByZWdpc3RlciBwb2ludGVyIGRlZmluaXRpb25zIAkJCQkJCQkJKi8KICNpbmNsdWRlIDxhc20vY2RlZl9MUEJsYWNrZmluLmg+CiAKLSNpbmNsdWRlIDxhc20vc3lzdGVtLmg+Ci0KIC8qIENsb2NrIGFuZCBTeXN0ZW0gQ29udHJvbAkoMHhGRkMwMDAwMCAtIDB4RkZDMDAwRkYpCQkJCQkJCQkqLwogI2RlZmluZSBiZmluX3JlYWRfUExMX0NUTCgpICAgICAgICAgICAgICAgICAgYmZpbl9yZWFkMTYoUExMX0NUTCkKLS8qIFdyaXRpbmcgdG8gUExMX0NUTCBpbml0aWF0ZXMgYSBQTEwgcmVsb2NrIHNlcXVlbmNlLiAqLwotc3RhdGljIF9faW5saW5lX18gdm9pZCBiZmluX3dyaXRlX1BMTF9DVEwodW5zaWduZWQgaW50IHZhbCkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzLCBpd3I7Ci0KLQlpZiAodmFsID09IGJmaW5fcmVhZF9QTExfQ1RMKCkpCi0JCXJldHVybjsKLQotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQkvKiBFbmFibGUgdGhlIFBMTCBXYWtldXAgYml0IGluIFNJQyBJV1IgKi8KLQlpd3IgPSBiZmluX3JlYWQzMihTSUNfSVdSKTsKLQkvKiBPbmx5IGFsbG93IFBQTCBXYWtldXApICovCi0JYmZpbl93cml0ZTMyKFNJQ19JV1IsIElXUl9FTkFCTEUoMCkpOwotCi0JYmZpbl93cml0ZTE2KFBMTF9DVEwsIHZhbCk7Ci0JU1NZTkMoKTsKLQlhc20oIklETEU7Iik7Ci0KLQliZmluX3dyaXRlMzIoU0lDX0lXUiwgaXdyKTsKLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci19CiAjZGVmaW5lIGJmaW5fcmVhZF9QTExfRElWKCkgICAgICAgICAgICAgICAgICBiZmluX3JlYWQxNihQTExfRElWKQogI2RlZmluZSBiZmluX3dyaXRlX1BMTF9ESVYodmFsKSAgICAgICAgICAgICAgYmZpbl93cml0ZTE2KFBMTF9ESVYsdmFsKQogI2RlZmluZSBiZmluX3JlYWRfVlJfQ1RMKCkgICAgICAgICAgICAgICAgICAgYmZpbl9yZWFkMTYoVlJfQ1RMKQotLyogV3JpdGluZyB0byBWUl9DVEwgaW5pdGlhdGVzIGEgUExMIHJlbG9jayBzZXF1ZW5jZS4gKi8KLXN0YXRpYyBfX2lubGluZV9fIHZvaWQgYmZpbl93cml0ZV9WUl9DVEwodW5zaWduZWQgaW50IHZhbCkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzLCBpd3I7Ci0KLQlpZiAodmFsID09IGJmaW5fcmVhZF9WUl9DVEwoKSkKLQkJcmV0dXJuOwotCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCS8qIEVuYWJsZSB0aGUgUExMIFdha2V1cCBiaXQgaW4gU0lDIElXUiAqLwotCWl3ciA9IGJmaW5fcmVhZDMyKFNJQ19JV1IpOwotCS8qIE9ubHkgYWxsb3cgUFBMIFdha2V1cCkgKi8KLQliZmluX3dyaXRlMzIoU0lDX0lXUiwgSVdSX0VOQUJMRSgwKSk7Ci0KLQliZmluX3dyaXRlMTYoVlJfQ1RMLCB2YWwpOwotCVNTWU5DKCk7Ci0JYXNtKCJJRExFOyIpOwotCi0JYmZpbl93cml0ZTMyKFNJQ19JV1IsIGl3cik7Ci0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotfQogI2RlZmluZSBiZmluX3JlYWRfUExMX1NUQVQoKSAgICAgICAgICAgICAgICAgYmZpbl9yZWFkMTYoUExMX1NUQVQpCiAjZGVmaW5lIGJmaW5fd3JpdGVfUExMX1NUQVQodmFsKSAgICAgICAgICAgICBiZmluX3dyaXRlMTYoUExMX1NUQVQsdmFsKQogI2RlZmluZSBiZmluX3JlYWRfUExMX0xPQ0tDTlQoKSAgICAgICAgICAgICAgYmZpbl9yZWFkMTYoUExMX0xPQ0tDTlQpCkBAIC0xODE2LDQgKzE3NzIsNTEgQEAKICNkZWZpbmUgYmZpbl9yZWFkX0hNRE1BMV9CQ09VTlQoKSAgICAgICAgICAgIGJmaW5fcmVhZDE2KEhNRE1BMV9CQ09VTlQpCiAjZGVmaW5lIGJmaW5fd3JpdGVfSE1ETUExX0JDT1VOVCh2YWwpICAgICAgICBiZmluX3dyaXRlMTYoSE1ETUExX0JDT1VOVCx2YWwpCiAKKy8qIFRoZXNlIG5lZWQgdG8gYmUgbGFzdCBkdWUgdG8gdGhlIGNkZWYvbGludXggaW50ZXItZGVwZW5kZW5jaWVzICovCisjaW5jbHVkZSA8YXNtL2lycS5oPgorCisvKiBXcml0aW5nIHRvIFBMTF9DVEwgaW5pdGlhdGVzIGEgUExMIHJlbG9jayBzZXF1ZW5jZS4gKi8KK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgYmZpbl93cml0ZV9QTExfQ1RMKHVuc2lnbmVkIGludCB2YWwpCit7CisJdW5zaWduZWQgbG9uZyBmbGFncywgaXdyOworCisJaWYgKHZhbCA9PSBiZmluX3JlYWRfUExMX0NUTCgpKQorCQlyZXR1cm47CisKKwlsb2NhbF9pcnFfc2F2ZV9odyhmbGFncyk7CisJLyogRW5hYmxlIHRoZSBQTEwgV2FrZXVwIGJpdCBpbiBTSUMgSVdSICovCisJaXdyID0gYmZpbl9yZWFkMzIoU0lDX0lXUik7CisJLyogT25seSBhbGxvdyBQUEwgV2FrZXVwKSAqLworCWJmaW5fd3JpdGUzMihTSUNfSVdSLCBJV1JfRU5BQkxFKDApKTsKKworCWJmaW5fd3JpdGUxNihQTExfQ1RMLCB2YWwpOworCVNTWU5DKCk7CisJYXNtKCJJRExFOyIpOworCisJYmZpbl93cml0ZTMyKFNJQ19JV1IsIGl3cik7CisJbG9jYWxfaXJxX3Jlc3RvcmVfaHcoZmxhZ3MpOworfQorCisvKiBXcml0aW5nIHRvIFZSX0NUTCBpbml0aWF0ZXMgYSBQTEwgcmVsb2NrIHNlcXVlbmNlLiAqLworc3RhdGljIF9faW5saW5lX18gdm9pZCBiZmluX3dyaXRlX1ZSX0NUTCh1bnNpZ25lZCBpbnQgdmFsKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIGl3cjsKKworCWlmICh2YWwgPT0gYmZpbl9yZWFkX1ZSX0NUTCgpKQorCQlyZXR1cm47CisKKwlsb2NhbF9pcnFfc2F2ZV9odyhmbGFncyk7CisJLyogRW5hYmxlIHRoZSBQTEwgV2FrZXVwIGJpdCBpbiBTSUMgSVdSICovCisJaXdyID0gYmZpbl9yZWFkMzIoU0lDX0lXUik7CisJLyogT25seSBhbGxvdyBQUEwgV2FrZXVwKSAqLworCWJmaW5fd3JpdGUzMihTSUNfSVdSLCBJV1JfRU5BQkxFKDApKTsKKworCWJmaW5fd3JpdGUxNihWUl9DVEwsIHZhbCk7CisJU1NZTkMoKTsKKwlhc20oIklETEU7Iik7CisKKwliZmluX3dyaXRlMzIoU0lDX0lXUiwgaXdyKTsKKwlsb2NhbF9pcnFfcmVzdG9yZV9odyhmbGFncyk7Cit9CisKICNlbmRpZgkJCQkvKiBfQ0RFRl9CRjUzNF9IICovCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvaW5jbHVkZS9tYWNoL2RtYS5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2luY2x1ZGUvbWFjaC9kbWEuaAppbmRleCA3YTk2NDA0Li41YWU4M2IxIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvaW5jbHVkZS9tYWNoL2RtYS5oCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9pbmNsdWRlL21hY2gvZG1hLmgKQEAgLTEsMzggKzEsMTQgQEAKLS8qCi0gKiBmaWxlOiAgICAgICAgIGluY2x1ZGUvYXNtLWJsYWNrZmluL21hY2gtYmY1MzcvZG1hLmgKLSAqIGJhc2VkIG9uOgotICogYXV0aG9yOgorLyogbWFjaC9kbWEuaCAtIGFyY2gtc3BlY2lmaWMgRE1BIGRlZmluZXMKICAqCi0gKiBjcmVhdGVkOgotICogZGVzY3JpcHRpb246Ci0gKglzeXN0ZW0gbW1yIHJlZ2lzdGVyIG1hcAotICogcmV2OgorICogQ29weXJpZ2h0IDIwMDQtMjAwOCBBbmFsb2cgRGV2aWNlcyBJbmMuCiAgKgotICogbW9kaWZpZWQ6Ci0gKgotICoKLSAqIGJ1Z3M6ICAgICAgICAgZW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCi0gKgotICogdGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgZ251IGdlbmVyYWwgcHVibGljIGxpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgZnJlZSBzb2Z0d2FyZSBmb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gKiBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiB0aGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCB3aXRob3V0IGFueSB3YXJyYW50eTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBtZXJjaGFudGFiaWxpdHkgb3IgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuICBzZWUgdGhlCi0gKiBnbnUgZ2VuZXJhbCBwdWJsaWMgbGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIHlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIGdudSBnZW5lcmFsIHB1YmxpYyBsaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIGNvcHlpbmcuCi0gKiBpZiBub3QsIHdyaXRlIHRvIHRoZSBmcmVlIHNvZnR3YXJlIGZvdW5kYXRpb24sCi0gKiA1OSB0ZW1wbGUgcGxhY2UgLSBzdWl0ZSAzMzAsIGJvc3RvbiwgbWEgMDIxMTEtMTMwNywgdXNhLgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgogICovCiAKICNpZm5kZWYgX01BQ0hfRE1BX0hfCiAjZGVmaW5lIF9NQUNIX0RNQV9IXwogCi0jZGVmaW5lIE1BWF9CTEFDS0ZJTl9ETUFfQ0hBTk5FTCAxNgorI2RlZmluZSBNQVhfRE1BX0NIQU5ORUxTIDE2CiAKICNkZWZpbmUgQ0hfUFBJIAkJCSAgICAwCiAjZGVmaW5lIENIX0VNQUNfUlggCQkgICAgMQpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2luY2x1ZGUvbWFjaC9ncGlvLmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvaW5jbHVkZS9tYWNoL2dwaW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzdhMzFlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2luY2x1ZGUvbWFjaC9ncGlvLmgKQEAgLTAsMCArMSw2OCBAQAorLyoKKyAqIEZpbGU6IGFyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9pbmNsdWRlL21hY2gvZ3Bpby5oCisgKiBCdWdzOiBFbnRlciBidWdzIGF0IGh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZy8KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggQW5hbG9nIERldmljZXMgSW5jLgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgorICovCisKKworI2lmbmRlZiBfTUFDSF9HUElPX0hfCisjZGVmaW5lIF9NQUNIX0dQSU9fSF8KKworI2RlZmluZSBNQVhfQkxBQ0tGSU5fR1BJT1MgNDgKKworI2RlZmluZQlHUElPX1BGMAkwCisjZGVmaW5lCUdQSU9fUEYxCTEKKyNkZWZpbmUJR1BJT19QRjIJMgorI2RlZmluZQlHUElPX1BGMwkzCisjZGVmaW5lCUdQSU9fUEY0CTQKKyNkZWZpbmUJR1BJT19QRjUJNQorI2RlZmluZQlHUElPX1BGNgk2CisjZGVmaW5lCUdQSU9fUEY3CTcKKyNkZWZpbmUJR1BJT19QRjgJOAorI2RlZmluZQlHUElPX1BGOQk5CisjZGVmaW5lCUdQSU9fUEYxMAkxMAorI2RlZmluZQlHUElPX1BGMTEJMTEKKyNkZWZpbmUJR1BJT19QRjEyCTEyCisjZGVmaW5lCUdQSU9fUEYxMwkxMworI2RlZmluZQlHUElPX1BGMTQJMTQKKyNkZWZpbmUJR1BJT19QRjE1CTE1CisjZGVmaW5lCUdQSU9fUEcwCTE2CisjZGVmaW5lCUdQSU9fUEcxCTE3CisjZGVmaW5lCUdQSU9fUEcyCTE4CisjZGVmaW5lCUdQSU9fUEczCTE5CisjZGVmaW5lCUdQSU9fUEc0CTIwCisjZGVmaW5lCUdQSU9fUEc1CTIxCisjZGVmaW5lCUdQSU9fUEc2CTIyCisjZGVmaW5lCUdQSU9fUEc3CTIzCisjZGVmaW5lCUdQSU9fUEc4CTI0CisjZGVmaW5lCUdQSU9fUEc5CTI1CisjZGVmaW5lCUdQSU9fUEcxMCAgICAgIAkyNgorI2RlZmluZQlHUElPX1BHMTEgICAgICAJMjcKKyNkZWZpbmUJR1BJT19QRzEyICAgICAgCTI4CisjZGVmaW5lCUdQSU9fUEcxMyAgICAgIAkyOQorI2RlZmluZQlHUElPX1BHMTQgICAgICAJMzAKKyNkZWZpbmUJR1BJT19QRzE1ICAgICAgCTMxCisjZGVmaW5lCUdQSU9fUEgwCTMyCisjZGVmaW5lCUdQSU9fUEgxCTMzCisjZGVmaW5lCUdQSU9fUEgyCTM0CisjZGVmaW5lCUdQSU9fUEgzCTM1CisjZGVmaW5lCUdQSU9fUEg0CTM2CisjZGVmaW5lCUdQSU9fUEg1CTM3CisjZGVmaW5lCUdQSU9fUEg2CTM4CisjZGVmaW5lCUdQSU9fUEg3CTM5CisjZGVmaW5lCUdQSU9fUEg4CTQwCisjZGVmaW5lCUdQSU9fUEg5CTQxCisjZGVmaW5lCUdQSU9fUEgxMCAgICAgIAk0MgorI2RlZmluZQlHUElPX1BIMTEgICAgICAJNDMKKyNkZWZpbmUJR1BJT19QSDEyICAgICAgCTQ0CisjZGVmaW5lCUdQSU9fUEgxMyAgICAgIAk0NQorI2RlZmluZQlHUElPX1BIMTQgICAgICAJNDYKKyNkZWZpbmUJR1BJT19QSDE1ICAgICAgCTQ3CisKKyNkZWZpbmUgUE9SVF9GIEdQSU9fUEYwCisjZGVmaW5lIFBPUlRfRyBHUElPX1BHMAorI2RlZmluZSBQT1JUX0ggR1BJT19QSDAKKworI2VuZGlmIC8qIF9NQUNIX0dQSU9fSF8gKi8KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9pbmNsdWRlL21hY2gvaXJxLmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvaW5jbHVkZS9tYWNoL2lycS5oCmluZGV4IDJlNjhhOGEuLmIyYTcxZDUgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9pbmNsdWRlL21hY2gvaXJxLmgKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2luY2x1ZGUvbWFjaC9pcnEuaApAQCAtODIsMTQgKzgyLDE0IEBACiAjZGVmaW5lIElSUV9DQU5fVFggICAgICAgICAgMjMJLypDQU4gVHJhbnNtaXQgSW50ZXJydXB0ICovCiAjZGVmaW5lIElSUV9NQUNfUlggICAgICAgICAgMjQJLypETUExIChFdGhlcm5ldCBSWCkgSW50ZXJydXB0ICovCiAjZGVmaW5lIElSUV9NQUNfVFggICAgICAgICAgMjUJLypETUEyIChFdGhlcm5ldCBUWCkgSW50ZXJydXB0ICovCi0jZGVmaW5lIElSUV9UTVIwICAgICAgICAgICAgMjYJLypUaW1lciAwICovCi0jZGVmaW5lIElSUV9UTVIxICAgICAgICAgICAgMjcJLypUaW1lciAxICovCi0jZGVmaW5lIElSUV9UTVIyICAgICAgICAgICAgMjgJLypUaW1lciAyICovCi0jZGVmaW5lIElSUV9UTVIzICAgICAgICAgICAgMjkJLypUaW1lciAzICovCi0jZGVmaW5lIElSUV9UTVI0ICAgICAgICAgICAgMzAJLypUaW1lciA0ICovCi0jZGVmaW5lIElSUV9UTVI1ICAgICAgICAgICAgMzEJLypUaW1lciA1ICovCi0jZGVmaW5lIElSUV9UTVI2ICAgICAgICAgICAgMzIJLypUaW1lciA2ICovCi0jZGVmaW5lIElSUV9UTVI3ICAgICAgICAgICAgMzMJLypUaW1lciA3ICovCisjZGVmaW5lIElSUV9USU1FUjAgICAgICAgICAgICAyNgkvKlRpbWVyIDAgKi8KKyNkZWZpbmUgSVJRX1RJTUVSMSAgICAgICAgICAgIDI3CS8qVGltZXIgMSAqLworI2RlZmluZSBJUlFfVElNRVIyICAgICAgICAgICAgMjgJLypUaW1lciAyICovCisjZGVmaW5lIElSUV9USU1FUjMgICAgICAgICAgICAyOQkvKlRpbWVyIDMgKi8KKyNkZWZpbmUgSVJRX1RJTUVSNCAgICAgICAgICAgIDMwCS8qVGltZXIgNCAqLworI2RlZmluZSBJUlFfVElNRVI1ICAgICAgICAgICAgMzEJLypUaW1lciA1ICovCisjZGVmaW5lIElSUV9USU1FUjYgICAgICAgICAgICAzMgkvKlRpbWVyIDYgKi8KKyNkZWZpbmUgSVJRX1RJTUVSNyAgICAgICAgICAgIDMzCS8qVGltZXIgNyAqLwogI2RlZmluZSBJUlFfUFJPR19JTlRBICAgICAgIDM0CS8qIFBGIFBvcnRzIEYmRyAoUEYxNTowKSBJbnRlcnJ1cHQgQSAqLwogI2RlZmluZSBJUlFfUE9SVEdfSU5UQiAgICAgIDM1CS8qIFBGIFBvcnQgRyAoUEYxNTowKSBJbnRlcnJ1cHQgQiAqLwogI2RlZmluZSBJUlFfTUVNX0RNQTAgICAgICAgIDM2CS8qKE1lbW9yeSBETUEgU3RyZWFtIDApICovCkBAIC0xOTUsMTYgKzE5NSwxNiBAQAogI2RlZmluZSBJUlFfQ0FOX1RYX1BPUyAgICAgIDAKICNkZWZpbmUgSVJRX01BQ19SWF9QT1MgICAgICA0CiAjZGVmaW5lIElSUV9NQUNfVFhfUE9TICAgICAgOAotI2RlZmluZSBJUlFfVE1SMF9QT1MgICAgICAgIDEyCi0jZGVmaW5lIElSUV9UTVIxX1BPUyAgICAgICAgMTYKLSNkZWZpbmUgSVJRX1RNUjJfUE9TICAgICAgICAyMAotI2RlZmluZSBJUlFfVE1SM19QT1MgICAgICAgIDI0Ci0jZGVmaW5lIElSUV9UTVI0X1BPUyAgICAgICAgMjgKKyNkZWZpbmUgSVJRX1RJTUVSMF9QT1MgICAgICAgIDEyCisjZGVmaW5lIElSUV9USU1FUjFfUE9TICAgICAgICAxNgorI2RlZmluZSBJUlFfVElNRVIyX1BPUyAgICAgICAgMjAKKyNkZWZpbmUgSVJRX1RJTUVSM19QT1MgICAgICAgIDI0CisjZGVmaW5lIElSUV9USU1FUjRfUE9TICAgICAgICAyOAogCiAvKiBJQVIzIEJJVCBGSUVMRFMqLwotI2RlZmluZSBJUlFfVE1SNV9QT1MgICAgICAgIDAKLSNkZWZpbmUgSVJRX1RNUjZfUE9TICAgICAgICA0Ci0jZGVmaW5lIElSUV9UTVI3X1BPUyAgICAgICAgOAorI2RlZmluZSBJUlFfVElNRVI1X1BPUyAgICAgICAgMAorI2RlZmluZSBJUlFfVElNRVI2X1BPUyAgICAgICAgNAorI2RlZmluZSBJUlFfVElNRVI3X1BPUyAgICAgICAgOAogI2RlZmluZSBJUlFfUFJPR19JTlRBX1BPUyAgIDEyCiAjZGVmaW5lIElSUV9QT1JUR19JTlRCX1BPUyAgIDE2CiAjZGVmaW5lIElSUV9NRU1fRE1BMF9QT1MgICAgMjAKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9pbmNsdWRlL21hY2gvbWVtX2luaXQuaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9pbmNsdWRlL21hY2gvbWVtX2luaXQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjY3Njk4Zi4uMDAwMDAwMAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvaW5jbHVkZS9tYWNoL21lbV9pbml0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMDMgKzAsMCBAQAotLyoKLSAqIEZpbGU6ICAgICAgICAgaW5jbHVkZS9hc20tYmxhY2tmaW4vbWFjaC1iZjUzNy9tZW1faW5pdC5oCi0gKiBCYXNlZCBvbjoKLSAqIEF1dGhvcjoKLSAqCi0gKiBDcmVhdGVkOgotICogRGVzY3JpcHRpb246Ci0gKgotICogUmV2OgotICoKLSAqIE1vZGlmaWVkOgotICogICAgICAgICAgICAgICBDb3B5cmlnaHQgMjAwNC0yMDA2IEFuYWxvZyBEZXZpY2VzIEluYy4KLSAqCi0gKiBCdWdzOiAgICAgICAgIEVudGVyIGJ1Z3MgYXQgaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnLwotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICogYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLgotICogSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLSAqLwotCi0jaWYgKENPTkZJR19NRU1fTVQ0OExDMTZNMTZBMlRHXzc1IHx8IENPTkZJR19NRU1fTVQ0OExDNjRNNEEyRkJfN0UgfHwgQ09ORklHX01FTV9NVDQ4TEMxNk04QTJUR183NSB8fCBDT05GSUdfTUVNX0dFTkVSSUNfQk9BUkQgfHwgQ09ORklHX01FTV9NVDQ4TEMzMk04QTJfNzUpCi0jaWYgKENPTkZJR19TQ0xLX0haID4gMTE5NDAyOTg1KQotI2RlZmluZSBTRFJBTV90UlAgICAgICAgVFJQXzIKLSNkZWZpbmUgU0RSQU1fdFJQX251bSAgIDIKLSNkZWZpbmUgU0RSQU1fdFJBUyAgICAgIFRSQVNfNwotI2RlZmluZSBTRFJBTV90UkFTX251bSAgNwotI2RlZmluZSBTRFJBTV90UkNEICAgICAgVFJDRF8yCi0jZGVmaW5lIFNEUkFNX3RXUiAgICAgICBUV1JfMgotI2VuZGlmCi0jaWYgKENPTkZJR19TQ0xLX0haID4gMTA0NDc3NjEyKSAmJiAoQ09ORklHX1NDTEtfSFogPD0gMTE5NDAyOTg1KQotI2RlZmluZSBTRFJBTV90UlAgICAgICAgVFJQXzIKLSNkZWZpbmUgU0RSQU1fdFJQX251bSAgIDIKLSNkZWZpbmUgU0RSQU1fdFJBUyAgICAgIFRSQVNfNgotI2RlZmluZSBTRFJBTV90UkFTX251bSAgNgotI2RlZmluZSBTRFJBTV90UkNEICAgICAgVFJDRF8yCi0jZGVmaW5lIFNEUkFNX3RXUiAgICAgICBUV1JfMgotI2VuZGlmCi0jaWYgKENPTkZJR19TQ0xLX0haID4gODk1NTIyMzkpICYmIChDT05GSUdfU0NMS19IWiA8PSAxMDQ0Nzc2MTIpCi0jZGVmaW5lIFNEUkFNX3RSUCAgICAgICBUUlBfMgotI2RlZmluZSBTRFJBTV90UlBfbnVtICAgMgotI2RlZmluZSBTRFJBTV90UkFTICAgICAgVFJBU181Ci0jZGVmaW5lIFNEUkFNX3RSQVNfbnVtICA1Ci0jZGVmaW5lIFNEUkFNX3RSQ0QgICAgICBUUkNEXzIKLSNkZWZpbmUgU0RSQU1fdFdSICAgICAgIFRXUl8yCi0jZW5kaWYKLSNpZiAoQ09ORklHX1NDTEtfSFogPiA3NDYyNjg2NikgJiYgKENPTkZJR19TQ0xLX0haIDw9IDg5NTUyMjM5KQotI2RlZmluZSBTRFJBTV90UlAgICAgICAgVFJQXzIKLSNkZWZpbmUgU0RSQU1fdFJQX251bSAgIDIKLSNkZWZpbmUgU0RSQU1fdFJBUyAgICAgIFRSQVNfNAotI2RlZmluZSBTRFJBTV90UkFTX251bSAgNAotI2RlZmluZSBTRFJBTV90UkNEICAgICAgVFJDRF8yCi0jZGVmaW5lIFNEUkFNX3RXUiAgICAgICBUV1JfMgotI2VuZGlmCi0jaWYgKENPTkZJR19TQ0xLX0haID4gNjY2NjY2NjcpICYmIChDT05GSUdfU0NMS19IWiA8PSA3NDYyNjg2NikKLSNkZWZpbmUgU0RSQU1fdFJQICAgICAgIFRSUF8yCi0jZGVmaW5lIFNEUkFNX3RSUF9udW0gICAyCi0jZGVmaW5lIFNEUkFNX3RSQVMgICAgICBUUkFTXzMKLSNkZWZpbmUgU0RSQU1fdFJBU19udW0gIDMKLSNkZWZpbmUgU0RSQU1fdFJDRCAgICAgIFRSQ0RfMgotI2RlZmluZSBTRFJBTV90V1IgICAgICAgVFdSXzIKLSNlbmRpZgotI2lmIChDT05GSUdfU0NMS19IWiA+IDU5NzAxNDkzKSAmJiAoQ09ORklHX1NDTEtfSFogPD0gNjY2NjY2NjcpCi0jZGVmaW5lIFNEUkFNX3RSUCAgICAgICBUUlBfMQotI2RlZmluZSBTRFJBTV90UlBfbnVtICAgMQotI2RlZmluZSBTRFJBTV90UkFTICAgICAgVFJBU180Ci0jZGVmaW5lIFNEUkFNX3RSQVNfbnVtICAzCi0jZGVmaW5lIFNEUkFNX3RSQ0QgICAgICBUUkNEXzEKLSNkZWZpbmUgU0RSQU1fdFdSICAgICAgIFRXUl8yCi0jZW5kaWYKLSNpZiAoQ09ORklHX1NDTEtfSFogPiA0NDc3NjExOSkgJiYgKENPTkZJR19TQ0xLX0haIDw9IDU5NzAxNDkzKQotI2RlZmluZSBTRFJBTV90UlAgICAgICAgVFJQXzEKLSNkZWZpbmUgU0RSQU1fdFJQX251bSAgIDEKLSNkZWZpbmUgU0RSQU1fdFJBUyAgICAgIFRSQVNfMwotI2RlZmluZSBTRFJBTV90UkFTX251bSAgMwotI2RlZmluZSBTRFJBTV90UkNEICAgICAgVFJDRF8xCi0jZGVmaW5lIFNEUkFNX3RXUiAgICAgICBUV1JfMgotI2VuZGlmCi0jaWYgKENPTkZJR19TQ0xLX0haID4gMjk4NTA3NDYpICYmIChDT05GSUdfU0NMS19IWiA8PSA0NDc3NjExOSkKLSNkZWZpbmUgU0RSQU1fdFJQICAgICAgIFRSUF8xCi0jZGVmaW5lIFNEUkFNX3RSUF9udW0gICAxCi0jZGVmaW5lIFNEUkFNX3RSQVMgICAgICBUUkFTXzIKLSNkZWZpbmUgU0RSQU1fdFJBU19udW0gIDIKLSNkZWZpbmUgU0RSQU1fdFJDRCAgICAgIFRSQ0RfMQotI2RlZmluZSBTRFJBTV90V1IgICAgICAgVFdSXzIKLSNlbmRpZgotI2lmIChDT05GSUdfU0NMS19IWiA8PSAyOTg1MDc0NikKLSNkZWZpbmUgU0RSQU1fdFJQICAgICAgIFRSUF8xCi0jZGVmaW5lIFNEUkFNX3RSUF9udW0gICAxCi0jZGVmaW5lIFNEUkFNX3RSQVMgICAgICBUUkFTXzEKLSNkZWZpbmUgU0RSQU1fdFJBU19udW0gIDEKLSNkZWZpbmUgU0RSQU1fdFJDRCAgICAgIFRSQ0RfMQotI2RlZmluZSBTRFJBTV90V1IgICAgICAgVFdSXzIKLSNlbmRpZgotI2VuZGlmCi0KLSNpZiAoQ09ORklHX01FTV9NVDQ4TEMxNk0xNkEyVEdfNzUpCi0gIC8qU0RSQU0gSU5GT1JNQVRJT046ICovCi0jZGVmaW5lIFNEUkFNX1RyZWYgIDY0CQkvKiBSZWZyZXNoIHBlcmlvZCBpbiBtaWxsaXNlY29uZHMgICAqLwotI2RlZmluZSBTRFJBTV9OUkEgICA4MTkyCS8qIE51bWJlciBvZiByb3cgYWRkcmVzc2VzIGluIFNEUkFNICovCi0jZGVmaW5lIFNEUkFNX0NMICAgIENMXzMKLSNlbmRpZgotCi0jaWYgKENPTkZJR19NRU1fTVQ0OExDMTZNOEEyVEdfNzUpCi0gIC8qU0RSQU0gSU5GT1JNQVRJT046ICovCi0jZGVmaW5lIFNEUkFNX1RyZWYgIDY0CQkvKiBSZWZyZXNoIHBlcmlvZCBpbiBtaWxsaXNlY29uZHMgICAqLwotI2RlZmluZSBTRFJBTV9OUkEgICA0MDk2CS8qIE51bWJlciBvZiByb3cgYWRkcmVzc2VzIGluIFNEUkFNICovCi0jZGVmaW5lIFNEUkFNX0NMICAgIENMXzMKLSNlbmRpZgotCi0jaWYgKENPTkZJR19NRU1fTVQ0OExDMzJNOEEyXzc1KQotICAvKlNEUkFNIElORk9STUFUSU9OOiAqLwotI2RlZmluZSBTRFJBTV9UcmVmICA2NAkJLyogUmVmcmVzaCBwZXJpb2QgaW4gbWlsbGlzZWNvbmRzICAgKi8KLSNkZWZpbmUgU0RSQU1fTlJBICAgODE5MgkvKiBOdW1iZXIgb2Ygcm93IGFkZHJlc3NlcyBpbiBTRFJBTSAqLwotI2RlZmluZSBTRFJBTV9DTCAgICBDTF8zCi0jZW5kaWYKLQotI2lmIChDT05GSUdfTUVNX01UNDhMQzY0TTRBMkZCXzdFKQotICAvKlNEUkFNIElORk9STUFUSU9OOiAqLwotI2RlZmluZSBTRFJBTV9UcmVmICA2NAkJLyogUmVmcmVzaCBwZXJpb2QgaW4gbWlsbGlzZWNvbmRzICAgKi8KLSNkZWZpbmUgU0RSQU1fTlJBICAgODE5MgkvKiBOdW1iZXIgb2Ygcm93IGFkZHJlc3NlcyBpbiBTRFJBTSAqLwotI2RlZmluZSBTRFJBTV9DTCAgICBDTF8zCi0jZW5kaWYKLQotI2lmIChDT05GSUdfTUVNX0dFTkVSSUNfQk9BUkQpCi0gIC8qU0RSQU0gSU5GT1JNQVRJT046IE1vZGlmeSB0aGlzIGZvciB5b3VyIGJvYXJkICovCi0jZGVmaW5lIFNEUkFNX1RyZWYgIDY0CQkvKiBSZWZyZXNoIHBlcmlvZCBpbiBtaWxsaXNlY29uZHMgICAqLwotI2RlZmluZSBTRFJBTV9OUkEgICA4MTkyCS8qIE51bWJlciBvZiByb3cgYWRkcmVzc2VzIGluIFNEUkFNICovCi0jZGVmaW5lIFNEUkFNX0NMICAgIENMXzMKLSNlbmRpZgotCi0vKiBFcXVhdGlvbiBmcm9tIHNlY3Rpb24gMTcgKHAxNy00Nikgb2YgQkY1MzMgSFJNICovCi0jZGVmaW5lIG1lbV9TRFJSQyAgICAgICAoKChDT05GSUdfU0NMS19IWiAvIDEwMDApICogU0RSQU1fVHJlZikgLyBTRFJBTV9OUkEpIC0gKFNEUkFNX3RSQVNfbnVtICsgU0RSQU1fdFJQX251bSkKLQotLyogRW5hYmxlIFNDTEsgT3V0ICovCi0jZGVmaW5lIG1lbV9TREdDVEwgICAgICAgIChTQ1RMRSB8IFNEUkFNX0NMIHwgU0RSQU1fdFJBUyB8IFNEUkFNX3RSUCB8IFNEUkFNX3RSQ0QgfCBTRFJBTV90V1IgfCBQU1MpCi0KLSNpZiBkZWZpbmVkIENPTkZJR19DTEtJTl9IQUxGCi0jZGVmaW5lIENMS0lOX0hBTEYgICAgICAgMQotI2Vsc2UKLSNkZWZpbmUgQ0xLSU5fSEFMRiAgICAgICAwCi0jZW5kaWYKLQotI2lmIGRlZmluZWQgQ09ORklHX1BMTF9CWVBBU1MKLSNkZWZpbmUgUExMX0JZUEFTUyAgICAgIDEKLSNlbHNlCi0jZGVmaW5lIFBMTF9CWVBBU1MgICAgICAgMAotI2VuZGlmCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipDdXJyZW50bHkgTm90IEJlaW5nIFVzZWQgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTF9XQVQgICgoQ09ORklHX0ZMQVNIX1NQRUVEX0JXQVQgKiA0KSAvICg0MDAwMDAwMDAwIC8gQ09ORklHX1NDTEtfSFopKSArIDEKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVExfUkFUICAoKENPTkZJR19GTEFTSF9TUEVFRF9CUkFUICogNCkgLyAoNDAwMDAwMDAwMCAvIENPTkZJR19TQ0xLX0haKSkgKyAxCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMX0hUICAgKChDT05GSUdfRkxBU0hfU1BFRURfQkhUICAqIDQpIC8gKDQwMDAwMDAwMDAgLyBDT05GSUdfU0NMS19IWikpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMX1NUICAgKChDT05GSUdfRkxBU0hfU1BFRURfQlNUICAqIDQpIC8gKDQwMDAwMDAwMDAgLyBDT05GSUdfU0NMS19IWikpICsgMQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTF9UVCAgICgoQ09ORklHX0ZMQVNIX1NQRUVEX0JUVCAgKiA0KSAvICg0MDAwMDAwMDAwIC8gQ09ORklHX1NDTEtfSFopKSArIDEKLQotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9UVCA+IDMpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9UVCAgIEIwVFRfNAotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1RUID09IDMpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9UVCAgIEIwVFRfMwotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1RUID09IDIpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9UVCAgIEIwVFRfMgotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1RUIDwgMikKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1RUICAgQjBUVF8xCi0jZW5kaWYKLQotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9TVCA+IDMpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9TVCAgIEIwU1RfNAotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1NUID09IDMpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9TVCAgIEIwU1RfMwotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1NUID09IDIpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9TVCAgIEIwU1RfMgotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1NUIDwgMikKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1NUICAgQjBTVF8xCi0jZW5kaWYKLQotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9IVCA+IDIpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9IVCAgIEIwSFRfMwotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX0hUID09IDIpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9IVCAgIEIwSFRfMgotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX0hUID09IDEpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9IVCAgIEIwSFRfMQotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX0hUID09IDAgJiYgQ09ORklHX0ZMQVNIX1NQRUVEX0JIVCA9PSAwKQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfSFQgICBCMEhUXzAKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9IVCA9PSAwICYmIENPTkZJR19GTEFTSF9TUEVFRF9CSFQgIT0gMCkKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX0hUICAgQjBIVF8xCi0jZW5kaWYKLQotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9XQVQgPiAxNCkKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1dBVCAgQjBXQVRfMTUKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9XQVQgPT0gMTQpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9XQVQgIEIwV0FUXzE0Ci0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfV0FUID09IDEzKQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfV0FUICBCMFdBVF8xMwotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1dBVCA9PSAxMikKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1dBVCAgQjBXQVRfMTIKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9XQVQgPT0gMTEpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9XQVQgIEIwV0FUXzExCi0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfV0FUID09IDEwKQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfV0FUICBCMFdBVF8xMAotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1dBVCA9PSA5KQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfV0FUICBCMFdBVF85Ci0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfV0FUID09IDgpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9XQVQgIEIwV0FUXzgKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9XQVQgPT0gNykKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1dBVCAgQjBXQVRfNwotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1dBVCA9PSA2KQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfV0FUICBCMFdBVF82Ci0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfV0FUID09IDUpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9XQVQgIEIwV0FUXzUKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9XQVQgPT0gNCkKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1dBVCAgQjBXQVRfNAotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1dBVCA9PSAzKQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfV0FUICBCMFdBVF8zCi0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfV0FUID09IDIpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9XQVQgIEIwV0FUXzIKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9XQVQgPT0gMSkKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1dBVCAgQjBXQVRfMQotI2VuZGlmCi0KLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfUkFUID4gMTQpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9SQVQgIEIwUkFUXzE1Ci0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfUkFUID09IDE0KQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfUkFUICBCMFJBVF8xNAotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1JBVCA9PSAxMykKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1JBVCAgQjBSQVRfMTMKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9SQVQgPT0gMTIpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9SQVQgIEIwUkFUXzEyCi0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfUkFUID09IDExKQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfUkFUICBCMFJBVF8xMQotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1JBVCA9PSAxMCkKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1JBVCAgQjBSQVRfMTAKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9SQVQgPT0gOSkKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1JBVCAgQjBSQVRfOQotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1JBVCA9PSA4KQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfUkFUICBCMFJBVF84Ci0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfUkFUID09IDcpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9SQVQgIEIwUkFUXzcKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9SQVQgPT0gNikKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1JBVCAgQjBSQVRfNgotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1JBVCA9PSA1KQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfUkFUICBCMFJBVF81Ci0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfUkFUID09IDQpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9SQVQgIEIwUkFUXzQKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9SQVQgPT0gMykKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1JBVCAgQjBSQVRfMwotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1JBVCA9PSAyKQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfUkFUICBCMFJBVF8yCi0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfUkFUID09IDEpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9SQVQgIEIwUkFUXzEKLSNlbmRpZgotCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMCAgXAotCShmbGFzaF9FQklVX0FNQkNUTDBfV0FUIHwgZmxhc2hfRUJJVV9BTUJDVEwwX1JBVCB8IGZsYXNoX0VCSVVfQU1CQ1RMMF9IVCB8IFwKLQkgZmxhc2hfRUJJVV9BTUJDVEwwX1NUIHwgZmxhc2hfRUJJVV9BTUJDVEwwX1RUIHwgQ09ORklHX0ZMQVNIX1NQRUVEX1JEWUVOKQpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2luY2x1ZGUvbWFjaC9tZW1fbWFwLmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvaW5jbHVkZS9tYWNoL21lbV9tYXAuaAppbmRleCA1MDc4YjY2Li5mOTAxMGM0YjQgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9pbmNsdWRlL21hY2gvbWVtX21hcC5oCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9pbmNsdWRlL21hY2gvbWVtX21hcC5oCkBAIC0xNzYsNCArMTc2LDEwIEBACiAjZGVmaW5lIEwxX1NDUkFUQ0hfU1RBUlQJMHhGRkIwMDAwMAogI2RlZmluZSBMMV9TQ1JBVENIX0xFTkdUSAkweDEwMDAKIAorI2RlZmluZSBHRVRfUERBX1NBRkUocHJlZykJCVwKKwlwcmVnLmwgPSBfY3B1X3BkYTsJCVwKKwlwcmVnLmggPSBfY3B1X3BkYTsKKworI2RlZmluZSBHRVRfUERBKHByZWcsIGRyZWcpCUdFVF9QREFfU0FGRShwcmVnKQorCiAjZW5kaWYJCQkJLyogX01FTV9NQVBfNTM3X0hfICovCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvaW50cy1wcmlvcml0eS5jIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2ludHMtcHJpb3JpdHkuYwppbmRleCBiMTMwMGIzLi41MWM0ODA4IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvaW50cy1wcmlvcml0eS5jCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9pbnRzLXByaW9yaXR5LmMKQEAgLTU1LDE1ICs1NSwxNSBAQAogCWJmaW5fd3JpdGVfU0lDX0lBUjIoKChDT05GSUdfSVJRX0NBTl9UWCAtIDcpIDw8IElSUV9DQU5fVFhfUE9TKSB8CiAJCQkgICAgKChDT05GSUdfSVJRX01BQ19SWCAtIDcpIDw8IElSUV9NQUNfUlhfUE9TKSB8CiAJCQkgICAgKChDT05GSUdfSVJRX01BQ19UWCAtIDcpIDw8IElSUV9NQUNfVFhfUE9TKSB8Ci0JCQkgICAgKChDT05GSUdfSVJRX1RNUjAgLSA3KSA8PCBJUlFfVE1SMF9QT1MpIHwKLQkJCSAgICAoKENPTkZJR19JUlFfVE1SMSAtIDcpIDw8IElSUV9UTVIxX1BPUykgfAotCQkJICAgICgoQ09ORklHX0lSUV9UTVIyIC0gNykgPDwgSVJRX1RNUjJfUE9TKSB8Ci0JCQkgICAgKChDT05GSUdfSVJRX1RNUjMgLSA3KSA8PCBJUlFfVE1SM19QT1MpIHwKLQkJCSAgICAoKENPTkZJR19JUlFfVE1SNCAtIDcpIDw8IElSUV9UTVI0X1BPUykpOworCQkJICAgICgoQ09ORklHX0lSUV9USU1FUjAgLSA3KSA8PCBJUlFfVElNRVIwX1BPUykgfAorCQkJICAgICgoQ09ORklHX0lSUV9USU1FUjEgLSA3KSA8PCBJUlFfVElNRVIxX1BPUykgfAorCQkJICAgICgoQ09ORklHX0lSUV9USU1FUjIgLSA3KSA8PCBJUlFfVElNRVIyX1BPUykgfAorCQkJICAgICgoQ09ORklHX0lSUV9USU1FUjMgLSA3KSA8PCBJUlFfVElNRVIzX1BPUykgfAorCQkJICAgICgoQ09ORklHX0lSUV9USU1FUjQgLSA3KSA8PCBJUlFfVElNRVI0X1BPUykpOwogCi0JYmZpbl93cml0ZV9TSUNfSUFSMygoKENPTkZJR19JUlFfVE1SNSAtIDcpIDw8IElSUV9UTVI1X1BPUykgfAotCQkJICAgICgoQ09ORklHX0lSUV9UTVI2IC0gNykgPDwgSVJRX1RNUjZfUE9TKSB8Ci0JCQkgICAgKChDT05GSUdfSVJRX1RNUjcgLSA3KSA8PCBJUlFfVE1SN19QT1MpIHwKKwliZmluX3dyaXRlX1NJQ19JQVIzKCgoQ09ORklHX0lSUV9USU1FUjUgLSA3KSA8PCBJUlFfVElNRVI1X1BPUykgfAorCQkJICAgICgoQ09ORklHX0lSUV9USU1FUjYgLSA3KSA8PCBJUlFfVElNRVI2X1BPUykgfAorCQkJICAgICgoQ09ORklHX0lSUV9USU1FUjcgLSA3KSA8PCBJUlFfVElNRVI3X1BPUykgfAogCQkJICAgICgoQ09ORklHX0lSUV9QUk9HX0lOVEEgLSA3KSA8PCBJUlFfUFJPR19JTlRBX1BPUykgfAogCQkJICAgICgoQ09ORklHX0lSUV9QT1JUR19JTlRCIC0gNykgPDwgSVJRX1BPUlRHX0lOVEJfUE9TKSB8CiAJCQkgICAgKChDT05GSUdfSVJRX01FTV9ETUEwIC0gNykgPDwgSVJRX01FTV9ETUEwX1BPUykgfApkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM4L0tjb25maWcgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzgvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDY4YzM1Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM4L0tjb25maWcKQEAgLTAsMCArMSwxNjQgQEAKK2lmIChCRjUzOCB8fCBCRjUzOSkKKworc291cmNlICJhcmNoL2JsYWNrZmluL21hY2gtYmY1MzgvYm9hcmRzL0tjb25maWciCisKK21lbnUgIkJGNTM4IFNwZWNpZmljIENvbmZpZ3VyYXRpb24iCisKK2NvbW1lbnQgIkludGVycnVwdCBQcmlvcml0eSBBc3NpZ25tZW50IgorbWVudSAiUHJpb3JpdHkiCisKK2NvbmZpZyBJUlFfUExMX1dBS0VVUAorCWludCAiSVJRX1BMTF9XQUtFVVAiCisJZGVmYXVsdCA3Citjb25maWcgSVJRX0RNQTBfRVJST1IKKwlpbnQgIklSUV9ETUEwX0VSUk9SIgorCWRlZmF1bHQgNworY29uZmlnIElSUV9QUElfRVJST1IKKwlpbnQgIklSUV9QUElfRVJST1IiCisJZGVmYXVsdCA3Citjb25maWcgSVJRX1NQT1JUMF9FUlJPUgorCWludCAiSVJRX1NQT1JUMF9FUlJPUiIKKwlkZWZhdWx0IDcKK2NvbmZpZyBJUlFfU1BPUlQxX0VSUk9SCisJaW50ICJJUlFfU1BPUlQxX0VSUk9SIgorCWRlZmF1bHQgNworY29uZmlnIElSUV9TUEkwX0VSUk9SCisJaW50ICJJUlFfU1BJMF9FUlJPUiIKKwlkZWZhdWx0IDcKK2NvbmZpZyBJUlFfVUFSVDBfRVJST1IKKwlpbnQgIklSUV9VQVJUMF9FUlJPUiIKKwlkZWZhdWx0IDcKK2NvbmZpZyBJUlFfUlRDCisJaW50ICJJUlFfUlRDIgorCWRlZmF1bHQgOAorY29uZmlnIElSUV9QUEkKKwlpbnQgIklSUV9QUEkiCisJZGVmYXVsdCA4Citjb25maWcgSVJRX1NQT1JUMF9SWAorCWludCAiSVJRX1NQT1JUMF9SWCIKKwlkZWZhdWx0IDkKK2NvbmZpZyBJUlFfU1BPUlQwX1RYCisJaW50ICJJUlFfU1BPUlQwX1RYIgorCWRlZmF1bHQgOQorY29uZmlnIElSUV9TUE9SVDFfUlgKKwlpbnQgIklSUV9TUE9SVDFfUlgiCisJZGVmYXVsdCA5Citjb25maWcgSVJRX1NQT1JUMV9UWAorCWludCAiSVJRX1NQT1JUMV9UWCIKKwlkZWZhdWx0IDkKK2NvbmZpZyBJUlFfU1BJMAorCWludCAiSVJRX1NQSTAiCisJZGVmYXVsdCAxMAorY29uZmlnIElSUV9VQVJUMF9SWAorCWludCAiSVJRX1VBUlQwX1JYIgorCWRlZmF1bHQgMTAKK2NvbmZpZyBJUlFfVUFSVDBfVFgKKwlpbnQgIklSUV9VQVJUMF9UWCIKKwlkZWZhdWx0IDEwCitjb25maWcgSVJRX1RJTUVSMAorCWludCAiSVJRX1RJTUVSMCIKKwlkZWZhdWx0IDgKK2NvbmZpZyBJUlFfVElNRVIxCisJaW50ICJJUlFfVElNRVIxIgorCWRlZmF1bHQgMTEKK2NvbmZpZyBJUlFfVElNRVIyCisJaW50ICJJUlFfVElNRVIyIgorCWRlZmF1bHQgMTEKK2NvbmZpZyBJUlFfUE9SVEZfSU5UQQorCWludCAiSVJRX1BPUlRGX0lOVEEiCisJZGVmYXVsdCAxMgorY29uZmlnIElSUV9QT1JURl9JTlRCCisJaW50ICJJUlFfUE9SVEZfSU5UQiIKKwlkZWZhdWx0IDEyCitjb25maWcgSVJRX01FTTBfRE1BMAorCWludCAiSVJRX01FTTBfRE1BMCIKKwlkZWZhdWx0IDEzCitjb25maWcgSVJRX01FTTBfRE1BMQorCWludCAiSVJRX01FTTBfRE1BMSIKKwlkZWZhdWx0IDEzCitjb25maWcgSVJRX1dBVENICisJaW50ICJJUlFfV0FUQ0giCisJZGVmYXVsdCAxMworY29uZmlnIElSUV9ETUExX0VSUk9SCisJaW50ICJJUlFfRE1BMV9FUlJPUiIKKwlkZWZhdWx0IDcKK2NvbmZpZyBJUlFfU1BPUlQyX0VSUk9SCisJaW50ICJJUlFfU1BPUlQyX0VSUk9SIgorCWRlZmF1bHQgNworY29uZmlnIElSUV9TUE9SVDNfRVJST1IKKwlpbnQgIklSUV9TUE9SVDNfRVJST1IiCisJZGVmYXVsdCA3Citjb25maWcgSVJRX1NQSTFfRVJST1IKKwlpbnQgIklSUV9TUEkxX0VSUk9SIgorCWRlZmF1bHQgNworY29uZmlnIElSUV9TUEkyX0VSUk9SCisJaW50ICJJUlFfU1BJMl9FUlJPUiIKKwlkZWZhdWx0IDcKK2NvbmZpZyBJUlFfVUFSVDFfRVJST1IKKwlpbnQgIklSUV9VQVJUMV9FUlJPUiIKKwlkZWZhdWx0IDcKK2NvbmZpZyBJUlFfVUFSVDJfRVJST1IKKwlpbnQgIklSUV9VQVJUMl9FUlJPUiIKKwlkZWZhdWx0IDcKK2NvbmZpZyBJUlFfQ0FOX0VSUk9SCisJaW50ICJJUlFfQ0FOX0VSUk9SIgorCWRlZmF1bHQgNworY29uZmlnIElSUV9TUE9SVDJfUlgKKwlpbnQgIklSUV9TUE9SVDJfUlgiCisJZGVmYXVsdCA5Citjb25maWcgSVJRX1NQT1JUMl9UWAorCWludCAiSVJRX1NQT1JUMl9UWCIKKwlkZWZhdWx0IDkKK2NvbmZpZyBJUlFfU1BPUlQzX1JYCisJaW50ICJJUlFfU1BPUlQzX1JYIgorCWRlZmF1bHQgOQorY29uZmlnIElSUV9TUE9SVDNfVFgKKwlpbnQgIklSUV9TUE9SVDNfVFgiCisJZGVmYXVsdCA5Citjb25maWcgSVJRX1NQSTEKKwlpbnQgIklSUV9TUEkxIgorCWRlZmF1bHQgMTAKK2NvbmZpZyBJUlFfU1BJMgorCWludCAiSVJRX1NQSTIiCisJZGVmYXVsdCAxMAorY29uZmlnIElSUV9VQVJUMV9SWAorCWludCAiSVJRX1VBUlQxX1JYIgorCWRlZmF1bHQgMTAKK2NvbmZpZyBJUlFfVUFSVDFfVFgKKwlpbnQgIklSUV9VQVJUMV9UWCIKKwlkZWZhdWx0IDEwCitjb25maWcgSVJRX1VBUlQyX1JYCisJaW50ICJJUlFfVUFSVDJfUlgiCisJZGVmYXVsdCAxMAorY29uZmlnIElSUV9VQVJUMl9UWAorCWludCAiSVJRX1VBUlQyX1RYIgorCWRlZmF1bHQgMTAKK2NvbmZpZyBJUlFfVFdJMAorCWludCAiSVJRX1RXSTAiCisJZGVmYXVsdCAxMQorY29uZmlnIElSUV9UV0kxCisJaW50ICJJUlFfVFdJMSIKKwlkZWZhdWx0IDExCitjb25maWcgSVJRX0NBTl9SWAorCWludCAiSVJRX0NBTl9SWCIKKwlkZWZhdWx0IDExCitjb25maWcgSVJRX0NBTl9UWAorCWludCAiSVJRX0NBTl9UWCIKKwlkZWZhdWx0IDExCitjb25maWcgSVJRX01FTTFfRE1BMAorCWludCAiSVJRX01FTTFfRE1BMCIKKwlkZWZhdWx0IDEzCitjb25maWcgSVJRX01FTTFfRE1BMQorCWludCAiSVJRX01FTTFfRE1BMSIKKwlkZWZhdWx0IDEzCisKKwloZWxwCisJICBFbnRlciB0aGUgcHJpb3JpdHkgbnVtYmVycyBiZXR3ZWVuIDctMTMgT05MWS4gIE90aGVycyBhcmUgUmVzZXJ2ZWQuCisJICBUaGlzIGFwcGxpZXMgdG8gYWxsIHRoZSBhYm92ZS4gIEl0IGlzIG5vdCByZWNvbW1lbmRlZCB0byBhc3NpZ24gdGhlCisJICBoaWdoZXN0IHByaW9yaXR5IG51bWJlciA3IHRvIFVBUlQgb3IgYW55IG90aGVyIGRldmljZS4KKworZW5kbWVudQorCitlbmRtZW51CisKK2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzgvTWFrZWZpbGUgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzgvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGNkMjcxOQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzOC9NYWtlZmlsZQpAQCAtMCwwICsxLDUgQEAKKyMKKyMgYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM4L01ha2VmaWxlCisjCisKK29iai15IDo9IGludHMtcHJpb3JpdHkubyBkbWEubwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM4L2JvYXJkcy9LY29uZmlnIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM4L2JvYXJkcy9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxNTI0OWIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzgvYm9hcmRzL0tjb25maWcKQEAgLTAsMCArMSwxMiBAQAorY2hvaWNlCisJcHJvbXB0ICJTeXN0ZW0gdHlwZSIKKwlkZWZhdWx0IEJGSU41MzhfRVpLSVQKKwloZWxwCisJICBTZWxlY3QgeW91ciBib2FyZCEKKworY29uZmlnIEJGSU41MzhfRVpLSVQKKwlib29sICJCRjUzOC1FWktJVCIKKwloZWxwCisJICBCRjUzOC1FWktJVC1MSVRFIGJvYXJkIHN1cHBvcnQuCisKK2VuZGNob2ljZQpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM4L2JvYXJkcy9NYWtlZmlsZSBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzOC9ib2FyZHMvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjE0M2IzMgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzOC9ib2FyZHMvTWFrZWZpbGUKQEAgLTAsMCArMSw1IEBACisjCisjIGFyY2gvYmxhY2tmaW4vbWFjaC1iZjUzOC9ib2FyZHMvTWFrZWZpbGUKKyMKKworb2JqLSQoQ09ORklHX0JGSU41MzhfRVpLSVQpICAgICAgICAgICAgKz0gZXpraXQubwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM4L2JvYXJkcy9lemtpdC5jIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM4L2JvYXJkcy9lemtpdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzN2NiOTMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzgvYm9hcmRzL2V6a2l0LmMKQEAgLTAsMCArMSw2MDYgQEAKKy8qCisgKiBGaWxlOiAgICAgICAgIGFyY2gvYmxhY2tmaW4vbWFjaC1iZjUzOC9ib2FyZHMvZXpraXQuYworICogQmFzZWQgb246ICAgICBhcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvYm9hcmRzL2V6a2l0LmMKKyAqIEF1dGhvcjogICAgICAgQWlkYW4gV2lsbGlhbXMgPGFpZGFuQG5pY3RhLmNvbS5hdT4KKyAqCisgKiBDcmVhdGVkOgorICogRGVzY3JpcHRpb246CisgKgorICogTW9kaWZpZWQ6CisgKiAgICAgICAgICAgICAgIENvcHlyaWdodCAyMDA1IE5hdGlvbmFsIElDVCBBdXN0cmFsaWEgKE5JQ1RBKQorICogICAgICAgICAgICAgICBDb3B5cmlnaHQgMjAwNC0yMDA4IEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqCisgKiBCdWdzOiAgICAgICAgIEVudGVyIGJ1Z3MgYXQgaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnLworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIHRoZSBmaWxlIENPUFlJTkcsIG9yIHdyaXRlCisgKiB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqLworCisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbXRkL210ZC5oPgorI2luY2x1ZGUgPGxpbnV4L210ZC9wYXJ0aXRpb25zLmg+CisjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaS9mbGFzaC5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGFzbS9iZmluNXh4X3NwaS5oPgorI2luY2x1ZGUgPGFzbS9kbWEuaD4KKyNpbmNsdWRlIDxhc20vZ3Bpby5oPgorI2luY2x1ZGUgPGFzbS9uYW5kLmg+CisjaW5jbHVkZSA8YXNtL3BvcnRtdXguaD4KKyNpbmNsdWRlIDxhc20vZHBtYy5oPgorI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CisKKy8qCisgKiBOYW1lIHRoZSBCb2FyZCBmb3IgdGhlIC9wcm9jL2NwdWluZm8KKyAqLworY29uc3QgY2hhciBiZmluX2JvYXJkX25hbWVbXSA9ICJBREkgQkY1MzgtRVpLSVQiOworCisvKgorICogIERyaXZlciBuZWVkcyB0byBrbm93IGFkZHJlc3MsIGlycSBhbmQgZmxhZyBwaW4uCisgKi8KKworCisjaWYgZGVmaW5lZChDT05GSUdfUlRDX0RSVl9CRklOKSB8fCBkZWZpbmVkKENPTkZJR19SVENfRFJWX0JGSU5fTU9EVUxFKQorc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgcnRjX2RldmljZSA9IHsKKwkubmFtZSA9ICJydGMtYmZpbiIsCisJLmlkICAgPSAtMSwKK307CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX1NFUklBTF9CRklOKSB8fCBkZWZpbmVkKENPTkZJR19TRVJJQUxfQkZJTl9NT0RVTEUpCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGJmaW5fdWFydF9yZXNvdXJjZXNbXSA9IHsKKyNpZmRlZiBDT05GSUdfU0VSSUFMX0JGSU5fVUFSVDAKKwl7CisJCS5zdGFydCA9IDB4RkZDMDA0MDAsCisJCS5lbmQgPSAweEZGQzAwNEZGLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKKwl9LAorI2VuZGlmCisjaWZkZWYgQ09ORklHX1NFUklBTF9CRklOX1VBUlQxCisJeworCQkuc3RhcnQgPSAweEZGQzAyMDAwLAorCQkuZW5kID0gMHhGRkMwMjBGRiwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKyNlbmRpZgorI2lmZGVmIENPTkZJR19TRVJJQUxfQkZJTl9VQVJUMgorCXsKKwkJLnN0YXJ0ID0gMHhGRkMwMjEwMCwKKwkJLmVuZCA9IDB4RkZDMDIxRkYsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisjZW5kaWYKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGJmaW5fdWFydF9kZXZpY2UgPSB7CisJLm5hbWUgPSAiYmZpbi11YXJ0IiwKKwkuaWQgPSAxLAorCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRShiZmluX3VhcnRfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UgPSBiZmluX3VhcnRfcmVzb3VyY2VzLAorfTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfQkZJTl9TSVIpIHx8IGRlZmluZWQoQ09ORklHX0JGSU5fU0lSX01PRFVMRSkKKyNpZmRlZiBDT05GSUdfQkZJTl9TSVIwCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGJmaW5fc2lyMF9yZXNvdXJjZXNbXSA9IHsKKwl7CisJCS5zdGFydCA9IDB4RkZDMDA0MDAsCisJCS5lbmQgPSAweEZGQzAwNEZGLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCXsKKwkJLnN0YXJ0ID0gSVJRX1VBUlQwX1JYLAorCQkuZW5kID0gSVJRX1VBUlQwX1JYKzEsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCX0sCisJeworCQkuc3RhcnQgPSBDSF9VQVJUMF9SWCwKKwkJLmVuZCA9IENIX1VBUlQwX1JYKzEsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfRE1BLAorCX0sCit9Oworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYmZpbl9zaXIwX2RldmljZSA9IHsKKwkubmFtZSA9ICJiZmluX3NpciIsCisJLmlkID0gMCwKKwkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUoYmZpbl9zaXIwX3Jlc291cmNlcyksCisJLnJlc291cmNlID0gYmZpbl9zaXIwX3Jlc291cmNlcywKK307CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfQkZJTl9TSVIxCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGJmaW5fc2lyMV9yZXNvdXJjZXNbXSA9IHsKKwl7CisJCS5zdGFydCA9IDB4RkZDMDIwMDAsCisJCS5lbmQgPSAweEZGQzAyMEZGLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCXsKKwkJLnN0YXJ0ID0gSVJRX1VBUlQxX1JYLAorCQkuZW5kID0gSVJRX1VBUlQxX1JYKzEsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCX0sCisJeworCQkuc3RhcnQgPSBDSF9VQVJUMV9SWCwKKwkJLmVuZCA9IENIX1VBUlQxX1JYKzEsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfRE1BLAorCX0sCit9Oworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYmZpbl9zaXIxX2RldmljZSA9IHsKKwkubmFtZSA9ICJiZmluX3NpciIsCisJLmlkID0gMSwKKwkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUoYmZpbl9zaXIxX3Jlc291cmNlcyksCisJLnJlc291cmNlID0gYmZpbl9zaXIxX3Jlc291cmNlcywKK307CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfQkZJTl9TSVIyCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGJmaW5fc2lyMl9yZXNvdXJjZXNbXSA9IHsKKwl7CisJCS5zdGFydCA9IDB4RkZDMDIxMDAsCisJCS5lbmQgPSAweEZGQzAyMUZGLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCXsKKwkJLnN0YXJ0ID0gSVJRX1VBUlQyX1JYLAorCQkuZW5kID0gSVJRX1VBUlQyX1JYKzEsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCX0sCisJeworCQkuc3RhcnQgPSBDSF9VQVJUMl9SWCwKKwkJLmVuZCA9IENIX1VBUlQyX1JYKzEsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfRE1BLAorCX0sCit9Oworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYmZpbl9zaXIyX2RldmljZSA9IHsKKwkubmFtZSA9ICJiZmluX3NpciIsCisJLmlkID0gMiwKKwkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUoYmZpbl9zaXIyX3Jlc291cmNlcyksCisJLnJlc291cmNlID0gYmZpbl9zaXIyX3Jlc291cmNlcywKK307CisjZW5kaWYKKyNlbmRpZgorCisvKgorICogIFVTQi1MQU4gRXpFeHRlbmRlciBib2FyZAorICogIERyaXZlciBuZWVkcyB0byBrbm93IGFkZHJlc3MsIGlycSBhbmQgZmxhZyBwaW4uCisgKi8KKyNpZiBkZWZpbmVkKENPTkZJR19TTUM5MVgpIHx8IGRlZmluZWQoQ09ORklHX1NNQzkxWF9NT0RVTEUpCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHNtYzkxeF9yZXNvdXJjZXNbXSA9IHsKKwl7CisJCS5uYW1lID0gInNtYzkxeC1yZWdzIiwKKwkJLnN0YXJ0ID0gMHgyMDMxMDMwMCwKKwkJLmVuZCA9IDB4MjAzMTAzMDAgKyAxNiwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCisJfSwgeworCQkuc3RhcnQgPSBJUlFfUEYwLAorCQkuZW5kID0gSVJRX1BGMCwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEgfCBJT1JFU09VUkNFX0lSUV9ISUdITEVWRUwsCisJfSwKK307CitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBzbWM5MXhfZGV2aWNlID0geworCS5uYW1lID0gInNtYzkxeCIsCisJLmlkID0gMCwKKwkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUoc21jOTF4X3Jlc291cmNlcyksCisJLnJlc291cmNlID0gc21jOTF4X3Jlc291cmNlcywKK307CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX1NQSV9CRklOKSB8fCBkZWZpbmVkKENPTkZJR19TUElfQkZJTl9NT0RVTEUpCisvKiBhbGwgU1BJIHBlcmlwaGVyYWxzIGluZm8gZ29lcyBoZXJlICovCisjaWYgZGVmaW5lZChDT05GSUdfTVREX00yNVA4MCkgXAorCXx8IGRlZmluZWQoQ09ORklHX01URF9NMjVQODBfTU9EVUxFKQorLyogU1BJIGZsYXNoIGNoaXAgKG0yNXAxNikgKi8KK3N0YXRpYyBzdHJ1Y3QgbXRkX3BhcnRpdGlvbiBiZmluX3NwaV9mbGFzaF9wYXJ0aXRpb25zW10gPSB7CisJeworCQkubmFtZSA9ICJib290bG9hZGVyKHNwaSkiLAorCQkuc2l6ZSA9IDB4MDAwNDAwMDAsCisJCS5vZmZzZXQgPSAwLAorCQkubWFza19mbGFncyA9IE1URF9DQVBfUk9NCisJfSwgeworCQkubmFtZSA9ICJsaW51eCBrZXJuZWwoc3BpKSIsCisJCS5zaXplID0gMHgxYzAwMDAsCisJCS5vZmZzZXQgPSAweDQwMDAwCisJfQorfTsKKworc3RhdGljIHN0cnVjdCBmbGFzaF9wbGF0Zm9ybV9kYXRhIGJmaW5fc3BpX2ZsYXNoX2RhdGEgPSB7CisJLm5hbWUgPSAibTI1cDgwIiwKKwkucGFydHMgPSBiZmluX3NwaV9mbGFzaF9wYXJ0aXRpb25zLAorCS5ucl9wYXJ0cyA9IEFSUkFZX1NJWkUoYmZpbl9zcGlfZmxhc2hfcGFydGl0aW9ucyksCisJLnR5cGUgPSAibTI1cDE2IiwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYmZpbjV4eF9zcGlfY2hpcCBzcGlfZmxhc2hfY2hpcF9pbmZvID0geworCS5lbmFibGVfZG1hID0gMCwgICAgICAgICAvKiB1c2UgZG1hIHRyYW5zZmVyIHdpdGggdGhpcyBjaGlwKi8KKwkuYml0c19wZXJfd29yZCA9IDgsCisJLmNzX2NoYW5nZV9wZXJfd29yZCA9IDAsCit9OworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19UT1VDSFNDUkVFTl9BRDc4NzkpIHx8IGRlZmluZWQoQ09ORklHX1RPVUNIU0NSRUVOX0FENzg3OV9NT0RVTEUpCisjaW5jbHVkZSA8bGludXgvc3BpL2FkNzg3OS5oPgorc3RhdGljIGNvbnN0IHN0cnVjdCBhZDc4NzlfcGxhdGZvcm1fZGF0YSBiZmluX2FkNzg3OV90c19pbmZvID0geworCS5tb2RlbAkJCT0gNzg3OSwJLyogTW9kZWwgPSBBRDc4NzkgKi8KKwkueF9wbGF0ZV9vaG1zCQk9IDYyMCwJLyogNjIwIE9obSBmcm9tIHRoZSB0b3VjaCBkYXRhc2hlZXQgKi8KKwkucHJlc3N1cmVfbWF4CQk9IDEwMDAwLAorCS5wcmVzc3VyZV9taW4JCT0gMCwKKwkuZmlyc3RfY29udmVyc2lvbl9kZWxheSA9IDMsCS8qIHdhaXQgNTEydXMgYmVmb3JlIGRvIGEgZmlyc3QgY29udmVyc2lvbiAqLworCS5hY3F1aXNpdGlvbl90aW1lIAk9IDEsCS8qIDR1cyBhY3F1aXNpdGlvbiB0aW1lIHBlciBzYW1wbGUgKi8KKwkubWVkaWFuCQkJPSAyLAkvKiBkbyA4IG1lYXN1cmVtZW50cyAqLworCS5hdmVyYWdpbmcgCQk9IDEsCS8qIHRha2UgdGhlIGF2ZXJhZ2Ugb2YgNCBtaWRkbGUgc2FtcGxlcyAqLworCS5wZW5fZG93bl9hY2NfaW50ZXJ2YWwgCT0gMjU1LAkvKiA5LjQgbXMgKi8KKwkuZ3Bpb19vdXRwdXQJCT0gMSwJLyogY29uZmlndXJlIEFVWC9WQkFUL0dQSU8gYXMgR1BJTyBvdXRwdXQgKi8KKwkuZ3Bpb19kZWZhdWx0IAkJPSAxLAkvKiBEdXJpbmcgaW5pdGlhbGl6YXRpb24gc2V0IEdQSU8gPSBISUdIICovCit9OworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19UT1VDSFNDUkVFTl9BRDc4NzlfU1BJKSB8fCBkZWZpbmVkKENPTkZJR19UT1VDSFNDUkVFTl9BRDc4NzlfU1BJX01PRFVMRSkKK3N0YXRpYyBzdHJ1Y3QgYmZpbjV4eF9zcGlfY2hpcCBzcGlfYWQ3ODc5X2NoaXBfaW5mbyA9IHsKKwkuZW5hYmxlX2RtYSA9IDAsCisJLmJpdHNfcGVyX3dvcmQgPSAxNiwKK307CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX0ZCX0JGSU5fTFEwMzVRMSkgfHwgZGVmaW5lZChDT05GSUdfRkJfQkZJTl9MUTAzNVExX01PRFVMRSkKKyNpbmNsdWRlIDxhc20vYmZpbi1scTAzNXExLmg+CisKK3N0YXRpYyBzdHJ1Y3QgYmZpbl9scTAzNXExZmJfZGlzcF9pbmZvIGJmaW5fbHEwMzVxMV9kYXRhID0geworCS5tb2RlID0gCUxRMDM1X05PUk0gfCBMUTAzNV9SR0IgfCBMUTAzNV9STCB8IExRMDM1X1RCLAorCS51c2VfYmwgPSAJMCwJLyogbGV0IHNvbWV0aGluZyBlbHNlIGNvbnRyb2wgdGhlIExDRCBCbGFja2xpZ2h0ICovCisJLmdwaW9fYmwgPQlHUElPX1BGNywKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYmZpbl9scTAzNXExX3Jlc291cmNlc1tdID0geworCXsKKwkJLnN0YXJ0ID0gSVJRX1BQSV9FUlJPUiwKKwkJLmVuZCA9IElSUV9QUElfRVJST1IsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZmluX2xxMDM1cTFfZGV2aWNlID0geworCS5uYW1lCQk9ICJiZmluLWxxMDM1cTEiLAorCS5pZAkJPSAtMSwKKwkubnVtX3Jlc291cmNlcyAJPSBBUlJBWV9TSVpFKGJmaW5fbHEwMzVxMV9yZXNvdXJjZXMpLAorCS5yZXNvdXJjZSAJPSBiZmluX2xxMDM1cTFfcmVzb3VyY2VzLAorCS5kZXYJCT0geworCQkucGxhdGZvcm1fZGF0YSA9ICZiZmluX2xxMDM1cTFfZGF0YSwKKwl9LAorfTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfU1BJX1NQSURFVikgfHwgZGVmaW5lZChDT05GSUdfU1BJX1NQSURFVl9NT0RVTEUpCitzdGF0aWMgc3RydWN0IGJmaW41eHhfc3BpX2NoaXAgc3BpZGV2X2NoaXBfaW5mbyA9IHsKKwkuZW5hYmxlX2RtYSA9IDAsCisJLmJpdHNfcGVyX3dvcmQgPSA4LAorfTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfRkJfQkZJTl9MUTAzNVExKSB8fCBkZWZpbmVkKENPTkZJR19GQl9CRklOX0xRMDM1UTFfTU9EVUxFKQorc3RhdGljIHN0cnVjdCBiZmluNXh4X3NwaV9jaGlwIGxxMDM1cTFfc3BpX2NoaXBfaW5mbyA9IHsKKwkuZW5hYmxlX2RtYQk9IDAsCisJLmJpdHNfcGVyX3dvcmQJPSA4LAorfTsKKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IHNwaV9ib2FyZF9pbmZvIGJmNTM4X3NwaV9ib2FyZF9pbmZvW10gX19pbml0ZGF0YSA9IHsKKyNpZiBkZWZpbmVkKENPTkZJR19NVERfTTI1UDgwKSBcCisJfHwgZGVmaW5lZChDT05GSUdfTVREX00yNVA4MF9NT0RVTEUpCisJeworCQkvKiB0aGUgbW9kYWxpYXMgbXVzdCBiZSB0aGUgc2FtZSBhcyBzcGkgZGV2aWNlIGRyaXZlciBuYW1lICovCisJCS5tb2RhbGlhcyA9ICJtMjVwODAiLCAvKiBOYW1lIG9mIHNwaV9kcml2ZXIgZm9yIHRoaXMgZGV2aWNlICovCisJCS5tYXhfc3BlZWRfaHogPSAyNTAwMDAwMCwgICAgIC8qIG1heCBzcGkgY2xvY2sgKFNDSykgc3BlZWQgaW4gSFogKi8KKwkJLmJ1c19udW0gPSAwLCAvKiBGcmFtZXdvcmsgYnVzIG51bWJlciAqLworCQkuY2hpcF9zZWxlY3QgPSAxLCAvKiBTUElfU1NFTDEqLworCQkucGxhdGZvcm1fZGF0YSA9ICZiZmluX3NwaV9mbGFzaF9kYXRhLAorCQkuY29udHJvbGxlcl9kYXRhID0gJnNwaV9mbGFzaF9jaGlwX2luZm8sCisJCS5tb2RlID0gU1BJX01PREVfMywKKwl9LAorI2VuZGlmCisjaWYgZGVmaW5lZChDT05GSUdfVE9VQ0hTQ1JFRU5fQUQ3ODc5X1NQSSkgfHwgZGVmaW5lZChDT05GSUdfVE9VQ0hTQ1JFRU5fQUQ3ODc5X1NQSV9NT0RVTEUpCisJeworCQkubW9kYWxpYXMgPSAiYWQ3ODc5IiwKKwkJLnBsYXRmb3JtX2RhdGEgPSAmYmZpbl9hZDc4NzlfdHNfaW5mbywKKwkJLmlycSA9IElSUV9QRjMsCisJCS5tYXhfc3BlZWRfaHogPSA1MDAwMDAwLCAgICAgLyogbWF4IHNwaSBjbG9jayAoU0NLKSBzcGVlZCBpbiBIWiAqLworCQkuYnVzX251bSA9IDAsCisJCS5jaGlwX3NlbGVjdCA9IDEsCisJCS5jb250cm9sbGVyX2RhdGEgPSAmc3BpX2FkNzg3OV9jaGlwX2luZm8sCisJCS5tb2RlID0gU1BJX0NQSEEgfCBTUElfQ1BPTCwKKwl9LAorI2VuZGlmCisjaWYgZGVmaW5lZChDT05GSUdfRkJfQkZJTl9MUTAzNVExKSB8fCBkZWZpbmVkKENPTkZJR19GQl9CRklOX0xRMDM1UTFfTU9EVUxFKQorCXsKKwkJLm1vZGFsaWFzID0gImJmaW4tbHEwMzVxMS1zcGkiLAorCQkubWF4X3NwZWVkX2h6ID0gMjAwMDAwMDAsICAgICAvKiBtYXggc3BpIGNsb2NrIChTQ0spIHNwZWVkIGluIEhaICovCisJCS5idXNfbnVtID0gMCwKKwkJLmNoaXBfc2VsZWN0ID0gMiwKKwkJLmNvbnRyb2xsZXJfZGF0YSA9ICZscTAzNXExX3NwaV9jaGlwX2luZm8sCisJCS5tb2RlID0gU1BJX0NQSEEgfCBTUElfQ1BPTCwKKwl9LAorI2VuZGlmCisjaWYgZGVmaW5lZChDT05GSUdfU1BJX1NQSURFVikgfHwgZGVmaW5lZChDT05GSUdfU1BJX1NQSURFVl9NT0RVTEUpCisJeworCQkubW9kYWxpYXMgPSAic3BpZGV2IiwKKwkJLm1heF9zcGVlZF9oeiA9IDMxMjUwMDAsICAgICAvKiBtYXggc3BpIGNsb2NrIChTQ0spIHNwZWVkIGluIEhaICovCisJCS5idXNfbnVtID0gMCwKKwkJLmNoaXBfc2VsZWN0ID0gMSwKKwkJLmNvbnRyb2xsZXJfZGF0YSA9ICZzcGlkZXZfY2hpcF9pbmZvLAorCX0sCisjZW5kaWYKK307CisKKy8qIFNQSSAoMCkgKi8KK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYmZpbl9zcGkwX3Jlc291cmNlW10gPSB7CisJWzBdID0geworCQkuc3RhcnQgPSBTUEkwX1JFR0JBU0UsCisJCS5lbmQgICA9IFNQSTBfUkVHQkFTRSArIDB4RkYsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzFdID0geworCQkuc3RhcnQgPSBDSF9TUEkwLAorCQkuZW5kICAgPSBDSF9TUEkwLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwl9Cit9OworCisvKiBTUEkgKDEpICovCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGJmaW5fc3BpMV9yZXNvdXJjZVtdID0geworCVswXSA9IHsKKwkJLnN0YXJ0ID0gU1BJMV9SRUdCQVNFLAorCQkuZW5kICAgPSBTUEkxX1JFR0JBU0UgKyAweEZGLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVsxXSA9IHsKKwkJLnN0YXJ0ID0gQ0hfU1BJMSwKKwkJLmVuZCAgID0gQ0hfU1BJMSwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJfQorfTsKKworLyogU1BJICgyKSAqLworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBiZmluX3NwaTJfcmVzb3VyY2VbXSA9IHsKKwlbMF0gPSB7CisJCS5zdGFydCA9IFNQSTJfUkVHQkFTRSwKKwkJLmVuZCAgID0gU1BJMl9SRUdCQVNFICsgMHhGRiwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMV0gPSB7CisJCS5zdGFydCA9IENIX1NQSTIsCisJCS5lbmQgICA9IENIX1NQSTIsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCX0KK307CisKKy8qIFNQSSBjb250cm9sbGVyIGRhdGEgKi8KK3N0YXRpYyBzdHJ1Y3QgYmZpbjV4eF9zcGlfbWFzdGVyIGJmNTM4X3NwaV9tYXN0ZXJfaW5mbzAgPSB7CisJLm51bV9jaGlwc2VsZWN0ID0gOCwKKwkuZW5hYmxlX2RtYSA9IDEsICAvKiBtYXN0ZXIgaGFzIHRoZSBhYmlsaXR5IHRvIGRvIGRtYSB0cmFuc2ZlciAqLworCS5waW5fcmVxID0ge1BfU1BJMF9TQ0ssIFBfU1BJMF9NSVNPLCBQX1NQSTBfTU9TSSwgMH0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZjUzOF9zcGlfbWFzdGVyMCA9IHsKKwkubmFtZSA9ICJiZmluLXNwaSIsCisJLmlkID0gMCwgLyogQnVzIG51bWJlciAqLworCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRShiZmluX3NwaTBfcmVzb3VyY2UpLAorCS5yZXNvdXJjZSA9IGJmaW5fc3BpMF9yZXNvdXJjZSwKKwkuZGV2ID0geworCQkucGxhdGZvcm1fZGF0YSA9ICZiZjUzOF9zcGlfbWFzdGVyX2luZm8wLCAvKiBQYXNzZWQgdG8gZHJpdmVyICovCisJCX0sCit9OworCitzdGF0aWMgc3RydWN0IGJmaW41eHhfc3BpX21hc3RlciBiZjUzOF9zcGlfbWFzdGVyX2luZm8xID0geworCS5udW1fY2hpcHNlbGVjdCA9IDgsCisJLmVuYWJsZV9kbWEgPSAxLCAgLyogbWFzdGVyIGhhcyB0aGUgYWJpbGl0eSB0byBkbyBkbWEgdHJhbnNmZXIgKi8KKwkucGluX3JlcSA9IHtQX1NQSTFfU0NLLCBQX1NQSTFfTUlTTywgUF9TUEkxX01PU0ksIDB9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYmY1Mzhfc3BpX21hc3RlcjEgPSB7CisJLm5hbWUgPSAiYmZpbi1zcGkiLAorCS5pZCA9IDEsIC8qIEJ1cyBudW1iZXIgKi8KKwkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUoYmZpbl9zcGkxX3Jlc291cmNlKSwKKwkucmVzb3VyY2UgPSBiZmluX3NwaTFfcmVzb3VyY2UsCisJLmRldiA9IHsKKwkJLnBsYXRmb3JtX2RhdGEgPSAmYmY1Mzhfc3BpX21hc3Rlcl9pbmZvMSwgLyogUGFzc2VkIHRvIGRyaXZlciAqLworCQl9LAorfTsKKworc3RhdGljIHN0cnVjdCBiZmluNXh4X3NwaV9tYXN0ZXIgYmY1Mzhfc3BpX21hc3Rlcl9pbmZvMiA9IHsKKwkubnVtX2NoaXBzZWxlY3QgPSA4LAorCS5lbmFibGVfZG1hID0gMSwgIC8qIG1hc3RlciBoYXMgdGhlIGFiaWxpdHkgdG8gZG8gZG1hIHRyYW5zZmVyICovCisJLnBpbl9yZXEgPSB7UF9TUEkyX1NDSywgUF9TUEkyX01JU08sIFBfU1BJMl9NT1NJLCAwfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGJmNTM4X3NwaV9tYXN0ZXIyID0geworCS5uYW1lID0gImJmaW4tc3BpIiwKKwkuaWQgPSAyLCAvKiBCdXMgbnVtYmVyICovCisJLm51bV9yZXNvdXJjZXMgPSBBUlJBWV9TSVpFKGJmaW5fc3BpMl9yZXNvdXJjZSksCisJLnJlc291cmNlID0gYmZpbl9zcGkyX3Jlc291cmNlLAorCS5kZXYgPSB7CisJCS5wbGF0Zm9ybV9kYXRhID0gJmJmNTM4X3NwaV9tYXN0ZXJfaW5mbzIsIC8qIFBhc3NlZCB0byBkcml2ZXIgKi8KKwkJfSwKK307CisKKyNlbmRpZiAgLyogc3BpIG1hc3RlciBhbmQgZGV2aWNlcyAqLworCisjaWYgZGVmaW5lZChDT05GSUdfSTJDX0JMQUNLRklOX1RXSSkgfHwgZGVmaW5lZChDT05GSUdfSTJDX0JMQUNLRklOX1RXSV9NT0RVTEUpCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGJmaW5fdHdpMF9yZXNvdXJjZVtdID0geworCVswXSA9IHsKKwkJLnN0YXJ0ID0gVFdJMF9SRUdCQVNFLAorCQkuZW5kICAgPSBUV0kwX1JFR0JBU0UgKyAweEZGLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVsxXSA9IHsKKwkJLnN0YXJ0ID0gSVJRX1RXSTAsCisJCS5lbmQgICA9IElSUV9UV0kwLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgaTJjX2JmaW5fdHdpMF9kZXZpY2UgPSB7CisJLm5hbWUgPSAiaTJjLWJmaW4tdHdpIiwKKwkuaWQgPSAwLAorCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRShiZmluX3R3aTBfcmVzb3VyY2UpLAorCS5yZXNvdXJjZSA9IGJmaW5fdHdpMF9yZXNvdXJjZSwKK307CisKKyNpZiAhZGVmaW5lZChDT05GSUdfQkY1NDIpCS8qIFRoZSBCRjU0MiBvbmx5IGhhcyAxIFRXSSAqLworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBiZmluX3R3aTFfcmVzb3VyY2VbXSA9IHsKKwlbMF0gPSB7CisJCS5zdGFydCA9IFRXSTFfUkVHQkFTRSwKKwkJLmVuZCAgID0gVFdJMV9SRUdCQVNFICsgMHhGRiwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMV0gPSB7CisJCS5zdGFydCA9IElSUV9UV0kxLAorCQkuZW5kICAgPSBJUlFfVFdJMSwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGkyY19iZmluX3R3aTFfZGV2aWNlID0geworCS5uYW1lID0gImkyYy1iZmluLXR3aSIsCisJLmlkID0gMSwKKwkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUoYmZpbl90d2kxX3Jlc291cmNlKSwKKwkucmVzb3VyY2UgPSBiZmluX3R3aTFfcmVzb3VyY2UsCit9OworI2VuZGlmCisjZW5kaWYKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBiZmluX2dwaW9zX3Jlc291cmNlcyA9IHsKKwkuc3RhcnQgPSAwLAorCS5lbmQgICA9IE1BWF9CTEFDS0ZJTl9HUElPUyAtIDEsCisJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZmluX2dwaW9zX2RldmljZSA9IHsKKwkubmFtZSA9ICJzaW1wbGUtZ3BpbyIsCisJLmlkID0gLTEsCisJLm51bV9yZXNvdXJjZXMgPSAxLAorCS5yZXNvdXJjZSA9ICZiZmluX2dwaW9zX3Jlc291cmNlcywKK307CisKKyNpZiBkZWZpbmVkKENPTkZJR19LRVlCT0FSRF9HUElPKSB8fCBkZWZpbmVkKENPTkZJR19LRVlCT0FSRF9HUElPX01PRFVMRSkKKyNpbmNsdWRlIDxsaW51eC9ncGlvX2tleXMuaD4KKworc3RhdGljIHN0cnVjdCBncGlvX2tleXNfYnV0dG9uIGJmaW5fZ3Bpb19rZXlzX3RhYmxlW10gPSB7CisJe0JUTl8wLCBHUElPX1BDNywgMSwgImdwaW8ta2V5czogQlROMCJ9LAorfTsKKworc3RhdGljIHN0cnVjdCBncGlvX2tleXNfcGxhdGZvcm1fZGF0YSBiZmluX2dwaW9fa2V5c19kYXRhID0geworCS5idXR0b25zICAgICAgICA9IGJmaW5fZ3Bpb19rZXlzX3RhYmxlLAorCS5uYnV0dG9ucyAgICAgICA9IEFSUkFZX1NJWkUoYmZpbl9ncGlvX2tleXNfdGFibGUpLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYmZpbl9kZXZpY2VfZ3Bpb2tleXMgPSB7CisJLm5hbWUgICAgICA9ICJncGlvLWtleXMiLAorCS5kZXYgPSB7CisJCS5wbGF0Zm9ybV9kYXRhID0gJmJmaW5fZ3Bpb19rZXlzX2RhdGEsCisJfSwKK307CisjZW5kaWYKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBjY2xrX3ZsZXZfZGF0YXNoZWV0W10gPQoreworLyoKKyAqIEludGVybmFsIFZMRVYgQkY1MzhTQkJDMTUzMworICoqKip0ZW1wb3JhcmlseSB1c2luZyB0aGVzZSB2YWx1ZXMgdW50aWwgZGF0YSBzaGVldCBpcyB1cGRhdGVkCisgKi8KKwlWUlBBSVIoVkxFVl8xMDAsIDE1MDAwMDAwMCksCisJVlJQQUlSKFZMRVZfMTAwLCAyNTAwMDAwMDApLAorCVZSUEFJUihWTEVWXzExMCwgMjc2MDAwMDAwKSwKKwlWUlBBSVIoVkxFVl8xMTUsIDMwMTAwMDAwMCksCisJVlJQQUlSKFZMRVZfMTIwLCA1MjUwMDAwMDApLAorCVZSUEFJUihWTEVWXzEyNSwgNTUwMDAwMDAwKSwKKwlWUlBBSVIoVkxFVl8xMzAsIDYwMDAwMDAwMCksCit9OworCitzdGF0aWMgc3RydWN0IGJmaW5fZHBtY19wbGF0Zm9ybV9kYXRhIGJmaW5fZG1wY192cmVnX2RhdGEgPSB7CisJLnR1cGxlX3RhYiA9IGNjbGtfdmxldl9kYXRhc2hlZXQsCisJLnRhYnNpemUgPSBBUlJBWV9TSVpFKGNjbGtfdmxldl9kYXRhc2hlZXQpLAorCS52cl9zZXR0bGluZ190aW1lID0gMjUgLyogdXMgKi8sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZmluX2RwbWMgPSB7CisJLm5hbWUgPSAiYmZpbiBkcG1jIiwKKwkuZGV2ID0geworCQkucGxhdGZvcm1fZGF0YSA9ICZiZmluX2RtcGNfdnJlZ19kYXRhLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqY21fYmY1MzhfZGV2aWNlc1tdIF9faW5pdGRhdGEgPSB7CisKKwkmYmZpbl9kcG1jLAorCisjaWYgZGVmaW5lZChDT05GSUdfUlRDX0RSVl9CRklOKSB8fCBkZWZpbmVkKENPTkZJR19SVENfRFJWX0JGSU5fTU9EVUxFKQorCSZydGNfZGV2aWNlLAorI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19TRVJJQUxfQkZJTikgfHwgZGVmaW5lZChDT05GSUdfU0VSSUFMX0JGSU5fTU9EVUxFKQorCSZiZmluX3VhcnRfZGV2aWNlLAorI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19TUElfQkZJTikgfHwgZGVmaW5lZChDT05GSUdfU1BJX0JGSU5fTU9EVUxFKQorCSZiZjUzOF9zcGlfbWFzdGVyMCwKKwkmYmY1Mzhfc3BpX21hc3RlcjEsCisJJmJmNTM4X3NwaV9tYXN0ZXIyLAorI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19JMkNfQkxBQ0tGSU5fVFdJKSB8fCBkZWZpbmVkKENPTkZJR19JMkNfQkxBQ0tGSU5fVFdJX01PRFVMRSkKKwkmaTJjX2JmaW5fdHdpMF9kZXZpY2UsCisJJmkyY19iZmluX3R3aTFfZGV2aWNlLAorI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19CRklOX1NJUikgfHwgZGVmaW5lZChDT05GSUdfQkZJTl9TSVJfTU9EVUxFKQorI2lmZGVmIENPTkZJR19CRklOX1NJUjAKKwkmYmZpbl9zaXIwX2RldmljZSwKKyNlbmRpZgorI2lmZGVmIENPTkZJR19CRklOX1NJUjEKKwkmYmZpbl9zaXIxX2RldmljZSwKKyNlbmRpZgorI2lmZGVmIENPTkZJR19CRklOX1NJUjIKKwkmYmZpbl9zaXIyX2RldmljZSwKKyNlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19TTUM5MVgpIHx8IGRlZmluZWQoQ09ORklHX1NNQzkxWF9NT0RVTEUpCisJJnNtYzkxeF9kZXZpY2UsCisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX0ZCX0JGSU5fTFEwMzVRMSkgfHwgZGVmaW5lZChDT05GSUdfRkJfQkZJTl9MUTAzNVExX01PRFVMRSkKKwkmYmZpbl9scTAzNXExX2RldmljZSwKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfS0VZQk9BUkRfR1BJTykgfHwgZGVmaW5lZChDT05GSUdfS0VZQk9BUkRfR1BJT19NT0RVTEUpCisJJmJmaW5fZGV2aWNlX2dwaW9rZXlzLAorI2VuZGlmCisKKwkmYmZpbl9ncGlvc19kZXZpY2UsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBlemtpdF9pbml0KHZvaWQpCit7CisJcHJpbnRrKEtFUk5fSU5GTyAiJXMoKTogcmVnaXN0ZXJpbmcgZGV2aWNlIHJlc291cmNlc1xuIiwgX19mdW5jX18pOworCXBsYXRmb3JtX2FkZF9kZXZpY2VzKGNtX2JmNTM4X2RldmljZXMsIEFSUkFZX1NJWkUoY21fYmY1MzhfZGV2aWNlcykpOworCisjaWYgZGVmaW5lZChDT05GSUdfU1BJX0JGSU4pIHx8IGRlZmluZWQoQ09ORklHX1NQSV9CRklOX01PRFVMRSkKKwlzcGlfcmVnaXN0ZXJfYm9hcmRfaW5mbyhiZjUzOF9zcGlfYm9hcmRfaW5mbywKKwkJCUFSUkFZX1NJWkUoYmY1Mzhfc3BpX2JvYXJkX2luZm8pKTsKKyNlbmRpZgorCisJcmV0dXJuIDA7Cit9CisKK2FyY2hfaW5pdGNhbGwoZXpraXRfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzgvZG1hLmMgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzgvZG1hLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDY4MzdmYgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzOC9kbWEuYwpAQCAtMCwwICsxLDE2MSBAQAorLyoKKyAqIEZpbGU6ICAgICAgICAgYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM4L2RtYS5jCisgKiBCYXNlZCBvbjoKKyAqIEF1dGhvcjoKKyAqCisgKiBDcmVhdGVkOgorICogRGVzY3JpcHRpb246ICBUaGlzIGZpbGUgY29udGFpbnMgdGhlIHNpbXBsZSBETUEgSW1wbGVtZW50YXRpb24gZm9yIEJsYWNrZmluCisgKgorICogTW9kaWZpZWQ6CisgKiAgICAgICAgICAgICAgIENvcHlyaWdodCAyMDA4IEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqCisgKiBCdWdzOiAgICAgICAgIEVudGVyIGJ1Z3MgYXQgaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnLworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIHRoZSBmaWxlIENPUFlJTkcsIG9yIHdyaXRlCisgKiB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8YXNtL2JsYWNrZmluLmg+CisjaW5jbHVkZSA8YXNtL2RtYS5oPgorCitzdHJ1Y3QgZG1hX3JlZ2lzdGVyICpkbWFfaW9fYmFzZV9hZGRyW01BWF9ETUFfQ0hBTk5FTFNdID0geworCShzdHJ1Y3QgZG1hX3JlZ2lzdGVyICopIERNQTBfTkVYVF9ERVNDX1BUUiwKKwkoc3RydWN0IGRtYV9yZWdpc3RlciAqKSBETUExX05FWFRfREVTQ19QVFIsCisJKHN0cnVjdCBkbWFfcmVnaXN0ZXIgKikgRE1BMl9ORVhUX0RFU0NfUFRSLAorCShzdHJ1Y3QgZG1hX3JlZ2lzdGVyICopIERNQTNfTkVYVF9ERVNDX1BUUiwKKwkoc3RydWN0IGRtYV9yZWdpc3RlciAqKSBETUE0X05FWFRfREVTQ19QVFIsCisJKHN0cnVjdCBkbWFfcmVnaXN0ZXIgKikgRE1BNV9ORVhUX0RFU0NfUFRSLAorCShzdHJ1Y3QgZG1hX3JlZ2lzdGVyICopIERNQTZfTkVYVF9ERVNDX1BUUiwKKwkoc3RydWN0IGRtYV9yZWdpc3RlciAqKSBETUE3X05FWFRfREVTQ19QVFIsCisJKHN0cnVjdCBkbWFfcmVnaXN0ZXIgKikgRE1BOF9ORVhUX0RFU0NfUFRSLAorCShzdHJ1Y3QgZG1hX3JlZ2lzdGVyICopIERNQTlfTkVYVF9ERVNDX1BUUiwKKwkoc3RydWN0IGRtYV9yZWdpc3RlciAqKSBETUExMF9ORVhUX0RFU0NfUFRSLAorCShzdHJ1Y3QgZG1hX3JlZ2lzdGVyICopIERNQTExX05FWFRfREVTQ19QVFIsCisJKHN0cnVjdCBkbWFfcmVnaXN0ZXIgKikgRE1BMTJfTkVYVF9ERVNDX1BUUiwKKwkoc3RydWN0IGRtYV9yZWdpc3RlciAqKSBETUExM19ORVhUX0RFU0NfUFRSLAorCShzdHJ1Y3QgZG1hX3JlZ2lzdGVyICopIERNQTE0X05FWFRfREVTQ19QVFIsCisJKHN0cnVjdCBkbWFfcmVnaXN0ZXIgKikgRE1BMTVfTkVYVF9ERVNDX1BUUiwKKwkoc3RydWN0IGRtYV9yZWdpc3RlciAqKSBETUExNl9ORVhUX0RFU0NfUFRSLAorCShzdHJ1Y3QgZG1hX3JlZ2lzdGVyICopIERNQTE3X05FWFRfREVTQ19QVFIsCisJKHN0cnVjdCBkbWFfcmVnaXN0ZXIgKikgRE1BMThfTkVYVF9ERVNDX1BUUiwKKwkoc3RydWN0IGRtYV9yZWdpc3RlciAqKSBETUExOV9ORVhUX0RFU0NfUFRSLAorCShzdHJ1Y3QgZG1hX3JlZ2lzdGVyICopIE1ETUEwX0QwX05FWFRfREVTQ19QVFIsCisJKHN0cnVjdCBkbWFfcmVnaXN0ZXIgKikgTURNQTBfUzBfTkVYVF9ERVNDX1BUUiwKKwkoc3RydWN0IGRtYV9yZWdpc3RlciAqKSBNRE1BMF9EMV9ORVhUX0RFU0NfUFRSLAorCShzdHJ1Y3QgZG1hX3JlZ2lzdGVyICopIE1ETUEwX1MxX05FWFRfREVTQ19QVFIsCisJKHN0cnVjdCBkbWFfcmVnaXN0ZXIgKikgTURNQTFfRDBfTkVYVF9ERVNDX1BUUiwKKwkoc3RydWN0IGRtYV9yZWdpc3RlciAqKSBNRE1BMV9TMF9ORVhUX0RFU0NfUFRSLAorCShzdHJ1Y3QgZG1hX3JlZ2lzdGVyICopIE1ETUExX0QxX05FWFRfREVTQ19QVFIsCisJKHN0cnVjdCBkbWFfcmVnaXN0ZXIgKikgTURNQTFfUzFfTkVYVF9ERVNDX1BUUiwKK307CitFWFBPUlRfU1lNQk9MKGRtYV9pb19iYXNlX2FkZHIpOworCitpbnQgY2hhbm5lbDJpcnEodW5zaWduZWQgaW50IGNoYW5uZWwpCit7CisJaW50IHJldF9pcnEgPSAtMTsKKworCXN3aXRjaCAoY2hhbm5lbCkgeworCWNhc2UgQ0hfUFBJOgorCQlyZXRfaXJxID0gSVJRX1BQSTsKKwkJYnJlYWs7CisKKwljYXNlIENIX1VBUlQwX1JYOgorCQlyZXRfaXJxID0gSVJRX1VBUlQwX1JYOworCQlicmVhazsKKworCWNhc2UgQ0hfVUFSVDBfVFg6CisJCXJldF9pcnEgPSBJUlFfVUFSVDBfVFg7CisJCWJyZWFrOworCisJY2FzZSBDSF9VQVJUMV9SWDoKKwkJcmV0X2lycSA9IElSUV9VQVJUMV9SWDsKKwkJYnJlYWs7CisKKwljYXNlIENIX1VBUlQxX1RYOgorCQlyZXRfaXJxID0gSVJRX1VBUlQxX1RYOworCQlicmVhazsKKworCWNhc2UgQ0hfVUFSVDJfUlg6CisJCXJldF9pcnEgPSBJUlFfVUFSVDJfUlg7CisJCWJyZWFrOworCisJY2FzZSBDSF9VQVJUMl9UWDoKKwkJcmV0X2lycSA9IElSUV9VQVJUMl9UWDsKKwkJYnJlYWs7CisKKwljYXNlIENIX1NQT1JUMF9SWDoKKwkJcmV0X2lycSA9IElSUV9TUE9SVDBfUlg7CisJCWJyZWFrOworCisJY2FzZSBDSF9TUE9SVDBfVFg6CisJCXJldF9pcnEgPSBJUlFfU1BPUlQwX1RYOworCQlicmVhazsKKworCWNhc2UgQ0hfU1BPUlQxX1JYOgorCQlyZXRfaXJxID0gSVJRX1NQT1JUMV9SWDsKKwkJYnJlYWs7CisKKwljYXNlIENIX1NQT1JUMV9UWDoKKwkJcmV0X2lycSA9IElSUV9TUE9SVDFfVFg7CisJCWJyZWFrOworCisJY2FzZSBDSF9TUE9SVDJfUlg6CisJCXJldF9pcnEgPSBJUlFfU1BPUlQyX1JYOworCQlicmVhazsKKworCWNhc2UgQ0hfU1BPUlQyX1RYOgorCQlyZXRfaXJxID0gSVJRX1NQT1JUMl9UWDsKKwkJYnJlYWs7CisKKwljYXNlIENIX1NQT1JUM19SWDoKKwkJcmV0X2lycSA9IElSUV9TUE9SVDNfUlg7CisJCWJyZWFrOworCisJY2FzZSBDSF9TUE9SVDNfVFg6CisJCXJldF9pcnEgPSBJUlFfU1BPUlQzX1RYOworCQlicmVhazsKKworCWNhc2UgQ0hfU1BJMDoKKwkJcmV0X2lycSA9IElSUV9TUEkwOworCQlicmVhazsKKworCWNhc2UgQ0hfU1BJMToKKwkJcmV0X2lycSA9IElSUV9TUEkxOworCQlicmVhazsKKworCWNhc2UgQ0hfU1BJMjoKKwkJcmV0X2lycSA9IElSUV9TUEkyOworCQlicmVhazsKKworCWNhc2UgQ0hfTUVNX1NUUkVBTTBfU1JDOgorCWNhc2UgQ0hfTUVNX1NUUkVBTTBfREVTVDoKKwkJcmV0X2lycSA9IElSUV9NRU0wX0RNQTA7CisJCWJyZWFrOworCWNhc2UgQ0hfTUVNX1NUUkVBTTFfU1JDOgorCWNhc2UgQ0hfTUVNX1NUUkVBTTFfREVTVDoKKwkJcmV0X2lycSA9IElSUV9NRU0wX0RNQTE7CisJCWJyZWFrOworCWNhc2UgQ0hfTUVNX1NUUkVBTTJfU1JDOgorCWNhc2UgQ0hfTUVNX1NUUkVBTTJfREVTVDoKKwkJcmV0X2lycSA9IElSUV9NRU0xX0RNQTA7CisJCWJyZWFrOworCWNhc2UgQ0hfTUVNX1NUUkVBTTNfU1JDOgorCWNhc2UgQ0hfTUVNX1NUUkVBTTNfREVTVDoKKwkJcmV0X2lycSA9IElSUV9NRU0xX0RNQTE7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gcmV0X2lycTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzOC9pbmNsdWRlL21hY2gvYW5vbWFseS5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM4L2luY2x1ZGUvbWFjaC9hbm9tYWx5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTEzMGI0ZgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzOC9pbmNsdWRlL21hY2gvYW5vbWFseS5oCkBAIC0wLDAgKzEsMTMyIEBACisvKgorICogRmlsZTogaW5jbHVkZS9hc20tYmxhY2tmaW4vbWFjaC1iZjUzOC9hbm9tYWx5LmgKKyAqIEJ1Z3M6IEVudGVyIGJ1Z3MgYXQgaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnLworICoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDA4IEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KKyAqLworCisvKiBUaGlzIGZpbGUgc2hvdWxlIGJlIHVwIHRvIGRhdGUgd2l0aDoKKyAqICAtIFJldmlzaW9uIEcsIDA5LzE4LzIwMDg7IEFEU1AtQkY1MzgvQkY1MzhGIEJsYWNrZmluIFByb2Nlc3NvciBBbm9tYWx5IExpc3QKKyAqICAtIFJldmlzaW9uIEwsIDA5LzE4LzIwMDg7IEFEU1AtQkY1MzkvQkY1MzlGIEJsYWNrZmluIFByb2Nlc3NvciBBbm9tYWx5IExpc3QKKyAqLworCisjaWZuZGVmIF9NQUNIX0FOT01BTFlfSF8KKyNkZWZpbmUgX01BQ0hfQU5PTUFMWV9IXworCisjaWYgX19TSUxJQ09OX1JFVklTSU9OX18gPCA0CisjIGVycm9yIHdpbGwgbm90IHdvcmsgb24gQkY1Mzggc2lsaWNvbiB2ZXJzaW9uIDAuMCwgMC4xLCAwLjIsIG9yIDAuMworI2VuZGlmCisKKy8qIE11bHRpLUlzc3VlIEluc3RydWN0aW9uIHdpdGggZHNwMzJzaGlmdGltbSBpbiBzbG90MSBhbmQgUC1yZWcgU3RvcmUgaW4gc2xvdDIgTm90IFN1cHBvcnRlZCAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwMDc0ICgxKQorLyogRE1BX1JVTiBCaXQgSXMgTm90IFZhbGlkIGFmdGVyIGEgUGVyaXBoZXJhbCBSZWNlaXZlIENoYW5uZWwgRE1BIFN0b3BzICovCisjZGVmaW5lIEFOT01BTFlfMDUwMDAxMTkgKDEpCisvKiBSeC5IIENhbm5vdCBCZSBVc2VkIHRvIEFjY2VzcyAxNi1iaXQgU3lzdGVtIE1NUiBSZWdpc3RlcnMgKi8KKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDEyMiAoMSkKKy8qIFBQSSBEYXRhIExlbmd0aHMgYmV0d2VlbiA4IGFuZCAxNiBEbyBOb3QgWmVybyBPdXQgVXBwZXIgQml0cyAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwMTY2ICgxKQorLyogUFBJX0NPVU5UIENhbm5vdCBCZSBQcm9ncmFtbWVkIHRvIDAgaW4gR2VuZXJhbCBQdXJwb3NlIFRYIG9yIFJYIE1vZGVzICovCisjZGVmaW5lIEFOT01BTFlfMDUwMDAxNzkgKDEpCisvKiBQUElfREVMQVkgTm90IEZ1bmN0aW9uYWwgaW4gUFBJIE1vZGVzIHdpdGggMCBGcmFtZSBTeW5jcyAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwMTgwICgxKQorLyogRmFsc2UgSS9PIFBpbiBJbnRlcnJ1cHRzIG9uIEVkZ2UtU2Vuc2l0aXZlIElucHV0cyBXaGVuIFBvbGFyaXR5IFNldHRpbmcgSXMgQ2hhbmdlZCAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwMTkzICgxKQorLyogQ3VycmVudCBETUEgQWRkcmVzcyBTaG93cyBXcm9uZyBWYWx1ZSBEdXJpbmcgQ2FycnkgRml4ICovCisjZGVmaW5lIEFOT01BTFlfMDUwMDAxOTkgKF9fU0lMSUNPTl9SRVZJU0lPTl9fIDwgNCkKKy8qIE5NSSBFdmVudCBhdCBCb290IFRpbWUgUmVzdWx0cyBpbiBVbnByZWRpY3RhYmxlIFN0YXRlICovCisjZGVmaW5lIEFOT01BTFlfMDUwMDAyMTkgKDEpCisvKiBTUEkgU2xhdmUgQm9vdCBNb2RlIE1vZGlmaWVzIFJlZ2lzdGVycyBmcm9tIFJlc2V0IFZhbHVlICovCisjZGVmaW5lIEFOT01BTFlfMDUwMDAyMjkgKDEpCisvKiBQUElfRlMzIElzIE5vdCBEcml2ZW4gaW4gMiBvciAzIEludGVybmFsIEZyYW1lIFN5bmMgVHJhbnNtaXQgTW9kZXMgKi8KKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDIzMyAoMSkKKy8qIElmIGktY2FjaGUgaXMgb24sIENTWU5DL1NTWU5DL0lETEUgYXJvdW5kIENoYW5nZSBvZiBDb250cm9sIGNhdXNlcyBmYWlsdXJlcyAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwMjQ0IChfX1NJTElDT05fUkVWSVNJT05fXyA8IDMpCisvKiBTcHVyaW91cyBIYXJkd2FyZSBFcnJvciBmcm9tIGFuIEFjY2VzcyBpbiB0aGUgU2hhZG93IG9mIGEgQ29uZGl0aW9uYWwgQnJhbmNoICovCisjZGVmaW5lIEFOT01BTFlfMDUwMDAyNDUgKDEpCisvKiBNYXhpbXVtIEV4dGVybmFsIENsb2NrIFNwZWVkIGZvciBUaW1lcnMgKi8KKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDI1MyAoMSkKKy8qIERDUExCX0ZBVUxUX0FERFIgTU1SIHJlZ2lzdGVyIG1heSBiZSBjb3JydXB0ZWQgKi8KKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDI2MSAoX19TSUxJQ09OX1JFVklTSU9OX18gPCAzKQorLyogSGlnaCBJL08gQWN0aXZpdHkgQ2F1c2VzIE91dHB1dCBWb2x0YWdlIG9mIEludGVybmFsIFZvbHRhZ2UgUmVndWxhdG9yIChWZGRpbnQpIHRvIERlY3JlYXNlICovCisjZGVmaW5lIEFOT01BTFlfMDUwMDAyNzAgKF9fU0lMSUNPTl9SRVZJU0lPTl9fIDwgNCkKKy8qIENlcnRhaW4gRGF0YSBDYWNoZSBXcml0ZXRocm91Z2ggTW9kZXMgRmFpbCBmb3IgVmRkaW50IDw9IDAuOVYgKi8KKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDI3MiAoMSkKKy8qIFdyaXRlcyB0byBTeW5jaHJvbm91cyBTRFJBTSBNZW1vcnkgTWF5IEJlIExvc3QgKi8KKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDI3MyAoX19TSUxJQ09OX1JFVklTSU9OX18gPCA0KQorLyogV3JpdGVzIHRvIGFuIEkvTyBEYXRhIFJlZ2lzdGVyIE9uZSBTQ0xLIEN5Y2xlIGFmdGVyIGFuIEVkZ2UgSXMgRGV0ZWN0ZWQgTWF5IENsZWFyIEludGVycnVwdCAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwMjc3IChfX1NJTElDT05fUkVWSVNJT05fXyA8IDQpCisvKiBEaXNhYmxpbmcgUGVyaXBoZXJhbHMgd2l0aCBETUEgUnVubmluZyBNYXkgQ2F1c2UgRE1BIFN5c3RlbSBJbnN0YWJpbGl0eSAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwMjc4IChfX1NJTElDT05fUkVWSVNJT05fXyA8IDQpCisvKiBGYWxzZSBIYXJkd2FyZSBFcnJvciBFeGNlcHRpb24gd2hlbiBJU1IgQ29udGV4dCBJcyBOb3QgUmVzdG9yZWQgKi8KKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDI4MSAoX19TSUxJQ09OX1JFVklTSU9OX18gPCA0KQorLyogTWVtb3J5IERNQSBDb3JydXB0aW9uIHdpdGggMzItQml0IERhdGEgYW5kIFRyYWZmaWMgQ29udHJvbCAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwMjgyIChfX1NJTElDT05fUkVWSVNJT05fXyA8IDQpCisvKiBTeXN0ZW0gTU1SIFdyaXRlIElzIFN0YWxsZWQgSW5kZWZpbml0ZWx5IHdoZW4gS2lsbGVkIGluIGEgUGFydGljdWxhciBTdGFnZSAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwMjgzIChfX1NJTElDT05fUkVWSVNJT05fXyA8IDQpCisvKiBTUE9SVHMgTWF5IFJlY2VpdmUgQmFkIERhdGEgSWYgRklGT3MgRmlsbCBVcCAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwMjg4IChfX1NJTElDT05fUkVWSVNJT05fXyA8IDQpCisvKiBSZWFkcyBmcm9tIENBTiBNYWlsYm94IGFuZCBBY2NlcHRhbmNlIE1hc2sgQXJlYSBDYW4gRmFpbCAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwMjkxIChfX1NJTElDT05fUkVWSVNJT05fXyA8IDQpCisvKiBIaWJlcm5hdGUgTGVha2FnZSBDdXJyZW50IElzIEhpZ2hlciBUaGFuIFNwZWNpZmllZCAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwMjkzIChfX1NJTElDT05fUkVWSVNJT05fXyA8IDQpCisvKiBUaW1lciBQaW4gTGltaXRhdGlvbnMgZm9yIFBQSSBUWCBNb2RlcyB3aXRoIEV4dGVybmFsIEZyYW1lIFN5bmNzICovCisjZGVmaW5lIEFOT01BTFlfMDUwMDAyOTQgKDEpCisvKiBNZW1vcnktVG8tTWVtb3J5IERNQSBTb3VyY2UvRGVzdGluYXRpb24gRGVzY3JpcHRvcnMgTXVzdCBCZSBpbiBTYW1lIE1lbW9yeSBTcGFjZSAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwMzAxIChfX1NJTElDT05fUkVWSVNJT05fXyA8IDQpCisvKiBTU1lOQ3MgQWZ0ZXIgV3JpdGVzIFRvIENBTi9ETUEgTU1SIFJlZ2lzdGVycyBBcmUgTm90IEFsd2F5cyBIYW5kbGVkIENvcnJlY3RseSAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwMzA0IChfX1NJTElDT05fUkVWSVNJT05fXyA8IDQpCisvKiBTQ0tFTE9XIEJpdCBEb2VzIE5vdCBNYWludGFpbiBTdGF0ZSBUaHJvdWdoIEhpYmVybmF0ZSAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwMzA3IChfX1NJTElDT05fUkVWSVNJT05fXyA8IDQpCisvKiBGYWxzZSBIYXJkd2FyZSBFcnJvcnMgQ2F1c2VkIGJ5IEZldGNoZXMgYXQgdGhlIEJvdW5kYXJ5IG9mIFJlc2VydmVkIE1lbW9yeSAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwMzEwICgxKQorLyogRXJyb3JzIHdoZW4gU1NZTkMsIENTWU5DLCBvciBMb2FkcyB0byBMVCwgTEIgYW5kIExDIFJlZ2lzdGVycyBBcmUgSW50ZXJydXB0ZWQgKi8KKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDMxMiAoX19TSUxJQ09OX1JFVklTSU9OX18gPCA1KQorLyogUFBJIElzIExldmVsLVNlbnNpdGl2ZSBvbiBGaXJzdCBUcmFuc2ZlciAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwMzEzIChfX1NJTElDT05fUkVWSVNJT05fXyA8IDQpCisvKiBLaWxsZWQgU3lzdGVtIE1NUiBXcml0ZSBDb21wbGV0ZXMgRXJyb25lb3VzbHkgb24gTmV4dCBTeXN0ZW0gTU1SIEFjY2VzcyAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwMzE1IChfX1NJTElDT05fUkVWSVNJT05fXyA8IDQpCisvKiBQRnggR2xpdGNoIG9uIFdyaXRlIHRvIEZJT19GTEFHX0Qgb3IgRklPX0ZMQUdfVCAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwMzE4IChfX1NJTElDT05fUkVWSVNJT05fXyA8IDQpCisvKiBSZWd1bGF0b3IgUHJvZ3JhbW1pbmcgQmxvY2tlZCB3aGVuIEhpYmVybmF0ZSBXYWtldXAgU291cmNlIFJlbWFpbnMgQWN0aXZlICovCisjZGVmaW5lIEFOT01BTFlfMDUwMDAzNTUgKF9fU0lMSUNPTl9SRVZJU0lPTl9fIDwgNSkKKy8qIFNlcmlhbCBQb3J0IChTUE9SVCkgTXVsdGljaGFubmVsIFRyYW5zbWl0IEZhaWx1cmUgd2hlbiBDaGFubmVsIDAgSXMgRGlzYWJsZWQgKi8KKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDM1NyAoX19TSUxJQ09OX1JFVklTSU9OX18gPCA1KQorLyogUFBJIFVuZGVyZmxvdyBFcnJvciBHb2VzIFVuZGV0ZWN0ZWQgaW4gSVRVLVIgNjU2IE1vZGUgKi8KKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDM2NiAoMSkKKy8qIFBvc3NpYmxlIFJFVFMgUmVnaXN0ZXIgQ29ycnVwdGlvbiB3aGVuIFN1YnJvdXRpbmUgSXMgdW5kZXIgNSBDeWNsZXMgaW4gRHVyYXRpb24gKi8KKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDM3MSAoX19TSUxJQ09OX1JFVklTSU9OX18gPCA1KQorLyogRW50ZXJpbmcgSGliZXJuYXRlIFN0YXRlIHdpdGggUGVyaXBoZXJhbCBXYWtldXBzIEVuYWJsZWQgRHJhd3MgRXhjZXNzIEN1cnJlbnQgKi8KKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDM3NCAoX19TSUxJQ09OX1JFVklTSU9OX18gPT0gNCkKKy8qIE5ldyBGZWF0dXJlOiBPcGVuLURyYWluIEdQSU8gT3V0cHV0cyBvbiBQQzEgYW5kIFBDNCAoTm90IEF2YWlsYWJsZSBvbiBPbGRlciBTaWxpY29uKSAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwMzc1IChfX1NJTElDT05fUkVWSVNJT05fXyA8IDQpCisvKiBTU1lOQyBTdGFsbHMgUHJvY2Vzc29yIHdoZW4gRXhlY3V0ZWQgZnJvbSBOb24tQ2FjaGVhYmxlIE1lbW9yeSAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwNDAyIChfX1NJTElDT05fUkVWSVNJT05fXyA8IDQpCisvKiBMZXZlbC1TZW5zaXRpdmUgRXh0ZXJuYWwgR1BJTyBXYWtldXBzIE1heSBDYXVzZSBJbmRlZmluaXRlIFN0YWxsICovCisjZGVmaW5lIEFOT01BTFlfMDUwMDA0MDMgKDEpCisvKiBTcGVjdWxhdGl2ZSBGZXRjaGVzIENhbiBDYXVzZSBVbmRlc2lyZWQgRXh0ZXJuYWwgRklGTyBPcGVyYXRpb25zICovCisjZGVmaW5lIEFOT01BTFlfMDUwMDA0MTYgKDEpCisvKiBNdWx0aWNoYW5uZWwgU1BPUlQgQ2hhbm5lbCBNaXNhbGlnbm1lbnQgVW5kZXIgU3BlY2lmaWMgQ29uZmlndXJhdGlvbiAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwNDI1ICgxKQorLyogU3BlY3VsYXRpdmUgRmV0Y2hlcyBvZiBJbmRpcmVjdC1Qb2ludGVyIEluc3RydWN0aW9ucyBDYW4gQ2F1c2UgRmFsc2UgSGFyZHdhcmUgRXJyb3JzICovCisjZGVmaW5lIEFOT01BTFlfMDUwMDA0MjYgKDEpCisvKiBTcGVjaWZpYyBHUElPIFBpbnMgTWF5IENoYW5nZSBTdGF0ZSB3aGVuIEVudGVyaW5nIEhpYmVybmF0ZSAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwNDM2IChfX1NJTElDT05fUkVWSVNJT05fXyA+IDMpCisvKiBJRkxVU0ggSW5zdHJ1Y3Rpb24gYXQgRW5kIG9mIEhhcmR3YXJlIExvb3AgQ2F1c2VzIEluZmluaXRlIFN0YWxsICovCisjZGVmaW5lIEFOT01BTFlfMDUwMDA0NDMgKDEpCisKKy8qIEFub21hbGllcyB0aGF0IGRvbid0IGV4aXN0IG9uIHRoaXMgcHJvYyAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwMTU4ICgwKQorI2RlZmluZSBBTk9NQUxZXzA1MDAwMTk4ICgwKQorI2RlZmluZSBBTk9NQUxZXzA1MDAwMjMwICgwKQorI2RlZmluZSBBTk9NQUxZXzA1MDAwMjYzICgwKQorI2RlZmluZSBBTk9NQUxZXzA1MDAwMzExICgwKQorI2RlZmluZSBBTk9NQUxZXzA1MDAwMzIzICgwKQorI2RlZmluZSBBTk9NQUxZXzA1MDAwMzUzICgxKQorI2RlZmluZSBBTk9NQUxZXzA1MDAwMzYzICgwKQorI2RlZmluZSBBTk9NQUxZXzA1MDAwMzg2ICgxKQorI2RlZmluZSBBTk9NQUxZXzA1MDAwNDEyICgwKQorI2RlZmluZSBBTk9NQUxZXzA1MDAwNDMyICgwKQorI2RlZmluZSBBTk9NQUxZXzA1MDAwNDM1ICgwKQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzOC9pbmNsdWRlL21hY2gvYmY1MzguaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzOC9pbmNsdWRlL21hY2gvYmY1MzguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzhhYmIzCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM4L2luY2x1ZGUvbWFjaC9iZjUzOC5oCkBAIC0wLDAgKzEsMTI0IEBACisvKgorICogRmlsZTogICAgICAgICBpbmNsdWRlL2FzbS1ibGFja2Zpbi9tYWNoLWJmNTM4L2JmNTM4LmgKKyAqIEJhc2VkIG9uOglpbmNsdWRlL2FzbS1ibGFja2Zpbi9tYWNoLWJmNTM3L2JmNTM3LmgKKyAqIEF1dGhvcjoJTWljaGFlbCBIZW5uZXJpY2ggKG1pY2hhZWwuaGVubmVyaWNoQGFuYWxvZy5jb20pCisgKgorICogQ3JlYXRlZDoKKyAqIERlc2NyaXB0aW9uOiAgU1lTVEVNIE1NUiBSRUdJU1RFUiBBTkQgTUVNT1JZIE1BUCBGT1IgQURTUC1CRjUyNworICoKKyAqIE1vZGlmaWVkOgorICogICAgICAgICAgICAgICBDb3B5cmlnaHQgMjAwNC0yMDA3IEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqCisgKiBCdWdzOiAgICAgICAgIEVudGVyIGJ1Z3MgYXQgaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnLworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIHRoZSBmaWxlIENPUFlJTkcsIG9yIHdyaXRlCisgKiB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqLworCisjaWZuZGVmIF9fTUFDSF9CRjUzOF9IX18KKyNkZWZpbmUgX19NQUNIX0JGNTM4X0hfXworCisjZGVmaW5lIE9GRlNFVF8oeCkgKCh4KSAmIDB4MDAwMEZGRkYpCisKKy8qc29tZSBtaXNjIGRlZmluZXMqLworI2RlZmluZSBJTUFTS19JVkcxNQkJMHg4MDAwCisjZGVmaW5lIElNQVNLX0lWRzE0CQkweDQwMDAKKyNkZWZpbmUgSU1BU0tfSVZHMTMJCTB4MjAwMAorI2RlZmluZSBJTUFTS19JVkcxMgkJMHgxMDAwCisKKyNkZWZpbmUgSU1BU0tfSVZHMTEJCTB4MDgwMAorI2RlZmluZSBJTUFTS19JVkcxMAkJMHgwNDAwCisjZGVmaW5lIElNQVNLX0lWRzkJCTB4MDIwMAorI2RlZmluZSBJTUFTS19JVkc4CQkweDAxMDAKKworI2RlZmluZSBJTUFTS19JVkc3CQkweDAwODAKKyNkZWZpbmUgSU1BU0tfSVZHVE1SCTB4MDA0MAorI2RlZmluZSBJTUFTS19JVkdIVwkJMHgwMDIwCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgQkZJTl9EU1VCQkFOS1MJNAorI2RlZmluZSBCRklOX0RXQVlTCQkyCisjZGVmaW5lIEJGSU5fRExJTkVTCQk2NAorI2RlZmluZSBCRklOX0lTVUJCQU5LUwk0CisjZGVmaW5lIEJGSU5fSVdBWVMJCTQKKyNkZWZpbmUgQkZJTl9JTElORVMJCTMyCisKKyNkZWZpbmUgV0FZMF9MCQkJMHgxCisjZGVmaW5lIFdBWTFfTAkJCTB4MgorI2RlZmluZSBXQVkwMV9MCQkJMHgzCisjZGVmaW5lIFdBWTJfTAkJCTB4NAorI2RlZmluZSBXQVkwMl9MCQkJMHg1CisjZGVmaW5lCVdBWTEyX0wJCQkweDYKKyNkZWZpbmUJV0FZMDEyX0wJCTB4NworCisjZGVmaW5lCVdBWTNfTAkJCTB4OAorI2RlZmluZQlXQVkwM19MCQkJMHg5CisjZGVmaW5lCVdBWTEzX0wJCQkweEEKKyNkZWZpbmUJV0FZMDEzX0wJCTB4QgorCisjZGVmaW5lCVdBWTMyX0wJCQkweEMKKyNkZWZpbmUJV0FZMzIwX0wJCTB4RAorI2RlZmluZQlXQVkzMjFfTAkJMHhFCisjZGVmaW5lCVdBWUFMTF9MCQkweEYKKworI2RlZmluZSBETUNfRU5BQkxFICgyPDwyKQkvKnllcywgMiwgbm90IDEgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBFQklVIFNldHRpbmdzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgQU1CQ1RMMFZBTAkoKENPTkZJR19CQU5LXzEgPDwgMTYpIHwgQ09ORklHX0JBTktfMCkKKyNkZWZpbmUgQU1CQ1RMMVZBTAkoKENPTkZJR19CQU5LXzMgPDwgMTYpIHwgQ09ORklHX0JBTktfMikKKworI2lmZGVmIENPTkZJR19DX0FNQkVOX0FMTAorI2RlZmluZSBWX0FNQkVOIEFNQkVOX0FMTAorI2VuZGlmCisjaWZkZWYgQ09ORklHX0NfQU1CRU4KKyNkZWZpbmUgVl9BTUJFTiAweDAKKyNlbmRpZgorI2lmZGVmIENPTkZJR19DX0FNQkVOX0IwCisjZGVmaW5lIFZfQU1CRU4gQU1CRU5fQjAKKyNlbmRpZgorI2lmZGVmIENPTkZJR19DX0FNQkVOX0IwX0IxCisjZGVmaW5lIFZfQU1CRU4gQU1CRU5fQjBfQjEKKyNlbmRpZgorI2lmZGVmIENPTkZJR19DX0FNQkVOX0IwX0IxX0IyCisjZGVmaW5lIFZfQU1CRU4gQU1CRU5fQjBfQjFfQjIKKyNlbmRpZgorI2lmZGVmIENPTkZJR19DX0FNQ0tFTgorI2RlZmluZSBWX0FNQ0tFTiBBTUNLRU4KKyNlbHNlCisjZGVmaW5lIFZfQU1DS0VOIDB4MAorI2VuZGlmCisjaWZkZWYgQ09ORklHX0NfQ0RQUklPCisjZGVmaW5lIFZfQ0RQUklPIDB4MTAwCisjZWxzZQorI2RlZmluZSBWX0NEUFJJTyAweDAKKyNlbmRpZgorCisjZGVmaW5lIEFNR0NUTFZBTAkoVl9BTUJFTiB8IFZfQU1DS0VOIHwgVl9DRFBSSU8pCisKKyNpZmRlZiBDT05GSUdfQkY1MzgKKyNkZWZpbmUgQ1BVICJCRjUzOCIKKyNkZWZpbmUgQ1BVSUQgMHgyN0M0CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfQkY1MzkKKyNkZWZpbmUgQ1BVICJCRjUzOSIKKyNkZWZpbmUgQ1BVSUQgMHgyN0M0CS8qIEZYSU1FOj8gKi8KKyNlbmRpZgorCisjaWZuZGVmIENQVQorI2Vycm9yICJVbmtub3duIENQVSB0eXBlIC0gVGhpcyBrZXJuZWwgZG9lc24ndCBzZWVtIHRvIGJlIGNvbmZpZ3VyZWQgcHJvcGVybHkiCisjZW5kaWYKKworI2VuZGlmCQkJCS8qIF9fTUFDSF9CRjUzOF9IX18gICovCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzgvaW5jbHVkZS9tYWNoL2JmaW5fc2VyaWFsXzV4eC5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM4L2luY2x1ZGUvbWFjaC9iZmluX3NlcmlhbF81eHguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDUwM2I2Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM4L2luY2x1ZGUvbWFjaC9iZmluX3NlcmlhbF81eHguaApAQCAtMCwwICsxLDE4MyBAQAorLyoKKyAqIGZpbGU6ICAgICAgICAgaW5jbHVkZS9hc20tYmxhY2tmaW4vbWFjaC1iZjUzOC9iZmluX3NlcmlhbF81eHguaAorICogYmFzZWQgb246CisgKiBhdXRob3I6CisgKgorICogY3JlYXRlZDoKKyAqIGRlc2NyaXB0aW9uOgorICoJYmxhY2tmaW4gc2VyaWFsIGRyaXZlciBoZWFkZXIgZmlsZXMKKyAqIHJldjoKKyAqCisgKiBtb2RpZmllZDoKKyAqCisgKgorICogYnVnczogICAgICAgICBlbnRlciBidWdzIGF0IGh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZy8KKyAqCisgKiB0aGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBnbnUgZ2VuZXJhbCBwdWJsaWMgbGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBmcmVlIHNvZnR3YXJlIGZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIHRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IHdpdGhvdXQgYW55IHdhcnJhbnR5OyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIG1lcmNoYW50YWJpbGl0eSBvciBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gIHNlZSB0aGUKKyAqIGdudSBnZW5lcmFsIHB1YmxpYyBsaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogeW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgZ251IGdlbmVyYWwgcHVibGljIGxpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgY29weWluZy4KKyAqIGlmIG5vdCwgd3JpdGUgdG8gdGhlIGZyZWUgc29mdHdhcmUgZm91bmRhdGlvbiwKKyAqIDU5IHRlbXBsZSBwbGFjZSAtIHN1aXRlIDMzMCwgYm9zdG9uLCBtYSAwMjExMS0xMzA3LCB1c2EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3NlcmlhbC5oPgorI2luY2x1ZGUgPGFzbS9kbWEuaD4KKyNpbmNsdWRlIDxhc20vcG9ydG11eC5oPgorCisjZGVmaW5lIFVBUlRfR0VUX0NIQVIodWFydCkgICAgIGJmaW5fcmVhZDE2KCgodWFydCktPnBvcnQubWVtYmFzZSArIE9GRlNFVF9SQlIpKQorI2RlZmluZSBVQVJUX0dFVF9ETEwodWFydCkJYmZpbl9yZWFkMTYoKCh1YXJ0KS0+cG9ydC5tZW1iYXNlICsgT0ZGU0VUX0RMTCkpCisjZGVmaW5lIFVBUlRfR0VUX0lFUih1YXJ0KSAgICAgIGJmaW5fcmVhZDE2KCgodWFydCktPnBvcnQubWVtYmFzZSArIE9GRlNFVF9JRVIpKQorI2RlZmluZSBVQVJUX0dFVF9ETEgodWFydCkJYmZpbl9yZWFkMTYoKCh1YXJ0KS0+cG9ydC5tZW1iYXNlICsgT0ZGU0VUX0RMSCkpCisjZGVmaW5lIFVBUlRfR0VUX0lJUih1YXJ0KSAgICAgIGJmaW5fcmVhZDE2KCgodWFydCktPnBvcnQubWVtYmFzZSArIE9GRlNFVF9JSVIpKQorI2RlZmluZSBVQVJUX0dFVF9MQ1IodWFydCkgICAgICBiZmluX3JlYWQxNigoKHVhcnQpLT5wb3J0Lm1lbWJhc2UgKyBPRkZTRVRfTENSKSkKKyNkZWZpbmUgVUFSVF9HRVRfR0NUTCh1YXJ0KSAgICAgYmZpbl9yZWFkMTYoKCh1YXJ0KS0+cG9ydC5tZW1iYXNlICsgT0ZGU0VUX0dDVEwpKQorCisjZGVmaW5lIFVBUlRfUFVUX0NIQVIodWFydCwgdikgICBiZmluX3dyaXRlMTYoKCh1YXJ0KS0+cG9ydC5tZW1iYXNlICsgT0ZGU0VUX1RIUiksIHYpCisjZGVmaW5lIFVBUlRfUFVUX0RMTCh1YXJ0LCB2KSAgICBiZmluX3dyaXRlMTYoKCh1YXJ0KS0+cG9ydC5tZW1iYXNlICsgT0ZGU0VUX0RMTCksIHYpCisjZGVmaW5lIFVBUlRfUFVUX0lFUih1YXJ0LCB2KSAgICBiZmluX3dyaXRlMTYoKCh1YXJ0KS0+cG9ydC5tZW1iYXNlICsgT0ZGU0VUX0lFUiksIHYpCisjZGVmaW5lIFVBUlRfU0VUX0lFUih1YXJ0LCB2KSAgICBVQVJUX1BVVF9JRVIodWFydCwgVUFSVF9HRVRfSUVSKHVhcnQpIHwgKHYpKQorI2RlZmluZSBVQVJUX0NMRUFSX0lFUih1YXJ0LCB2KSAgVUFSVF9QVVRfSUVSKHVhcnQsIFVBUlRfR0VUX0lFUih1YXJ0KSAmIH4odikpCisjZGVmaW5lIFVBUlRfUFVUX0RMSCh1YXJ0LCB2KSAgICBiZmluX3dyaXRlMTYoKCh1YXJ0KS0+cG9ydC5tZW1iYXNlICsgT0ZGU0VUX0RMSCksIHYpCisjZGVmaW5lIFVBUlRfUFVUX0xDUih1YXJ0LCB2KSAgICBiZmluX3dyaXRlMTYoKCh1YXJ0KS0+cG9ydC5tZW1iYXNlICsgT0ZGU0VUX0xDUiksIHYpCisjZGVmaW5lIFVBUlRfUFVUX0dDVEwodWFydCwgdikgICBiZmluX3dyaXRlMTYoKCh1YXJ0KS0+cG9ydC5tZW1iYXNlICsgT0ZGU0VUX0dDVEwpLCB2KQorCisjZGVmaW5lIFVBUlRfU0VUX0RMQUIodWFydCkgICAgIGRvIHsgVUFSVF9QVVRfTENSKHVhcnQsIFVBUlRfR0VUX0xDUih1YXJ0KSB8IERMQUIpOyBTU1lOQygpOyB9IHdoaWxlICgwKQorI2RlZmluZSBVQVJUX0NMRUFSX0RMQUIodWFydCkgICBkbyB7IFVBUlRfUFVUX0xDUih1YXJ0LCBVQVJUX0dFVF9MQ1IodWFydCkgJiB+RExBQik7IFNTWU5DKCk7IH0gd2hpbGUgKDApCisKKyNkZWZpbmUgVUFSVF9HRVRfQ1RTKHgpIGdwaW9fZ2V0X3ZhbHVlKHgtPmN0c19waW4pCisjZGVmaW5lIFVBUlRfU0VUX1JUUyh4KSBncGlvX3NldF92YWx1ZSh4LT5ydHNfcGluLCAxKQorI2RlZmluZSBVQVJUX0NMRUFSX1JUUyh4KSBncGlvX3NldF92YWx1ZSh4LT5ydHNfcGluLCAwKQorI2RlZmluZSBVQVJUX0VOQUJMRV9JTlRTKHgsIHYpIFVBUlRfUFVUX0lFUih4LCB2KQorI2RlZmluZSBVQVJUX0RJU0FCTEVfSU5UUyh4KSBVQVJUX1BVVF9JRVIoeCwgMCkKKworI2lmIGRlZmluZWQoQ09ORklHX0JGSU5fVUFSVDBfQ1RTUlRTKSB8fCBkZWZpbmVkKENPTkZJR19CRklOX1VBUlQxX0NUU1JUUykKKyMgZGVmaW5lIENPTkZJR19TRVJJQUxfQkZJTl9DVFNSVFMKKworIyBpZm5kZWYgQ09ORklHX1VBUlQwX0NUU19QSU4KKyMgIGRlZmluZSBDT05GSUdfVUFSVDBfQ1RTX1BJTiAtMQorIyBlbmRpZgorCisjIGlmbmRlZiBDT05GSUdfVUFSVDBfUlRTX1BJTgorIyAgZGVmaW5lIENPTkZJR19VQVJUMF9SVFNfUElOIC0xCisjIGVuZGlmCisKKyMgaWZuZGVmIENPTkZJR19VQVJUMV9DVFNfUElOCisjICBkZWZpbmUgQ09ORklHX1VBUlQxX0NUU19QSU4gLTEKKyMgZW5kaWYKKworIyBpZm5kZWYgQ09ORklHX1VBUlQxX1JUU19QSU4KKyMgIGRlZmluZSBDT05GSUdfVUFSVDFfUlRTX1BJTiAtMQorIyBlbmRpZgorI2VuZGlmCisKKyNkZWZpbmUgQkZJTl9VQVJUX1RYX0ZJRk9fU0laRQkyCisKKy8qCisgKiBUaGUgcGluIGNvbmZpZ3VyYXRpb24gaXMgZGlmZmVyZW50IGZyb20gc2NoZW1hdGljCisgKi8KK3N0cnVjdCBiZmluX3NlcmlhbF9wb3J0IHsKKwlzdHJ1Y3QgdWFydF9wb3J0CXBvcnQ7CisJdW5zaWduZWQgaW50CQlvbGRfc3RhdHVzOworCXVuc2lnbmVkIGludCBsc3I7CisjaWZkZWYgQ09ORklHX1NFUklBTF9CRklOX0RNQQorCWludAkJCXR4X2RvbmU7CisJaW50CQkJdHhfY291bnQ7CisJc3RydWN0IGNpcmNfYnVmCQlyeF9kbWFfYnVmOworCXN0cnVjdCB0aW1lcl9saXN0ICAgICAgIHJ4X2RtYV90aW1lcjsKKwlpbnQJCQlyeF9kbWFfbnJvd3M7CisJdW5zaWduZWQgaW50CQl0eF9kbWFfY2hhbm5lbDsKKwl1bnNpZ25lZCBpbnQJCXJ4X2RtYV9jaGFubmVsOworCXN0cnVjdCB3b3JrX3N0cnVjdAl0eF9kbWFfd29ya3F1ZXVlOworI2VuZGlmCisjaWZkZWYgQ09ORklHX1NFUklBTF9CRklOX0NUU1JUUworCXN0cnVjdCB0aW1lcl9saXN0CWN0c190aW1lcjsKKwlpbnQJCWN0c19waW47CisJaW50CQlydHNfcGluOworI2VuZGlmCit9OworCisvKiBUaGUgaGFyZHdhcmUgY2xlYXJzIHRoZSBMU1IgYml0cyB1cG9uIHJlYWQsIHNvIHdlIG5lZWQgdG8gY2FjaGUKKyAqIHNvbWUgb2YgdGhlIG1vcmUgZnVuIGJpdHMgaW4gc29mdHdhcmUgc28gdGhleSBkb24ndCBnZXQgbG9zdAorICogd2hlbiBjaGVja2luZyB0aGUgTFNSIGluIG90aGVyIGNvZGUgcGF0aHMgKFRYKS4KKyAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgVUFSVF9HRVRfTFNSKHN0cnVjdCBiZmluX3NlcmlhbF9wb3J0ICp1YXJ0KQoreworCXVuc2lnbmVkIGludCBsc3IgPSBiZmluX3JlYWQxNih1YXJ0LT5wb3J0Lm1lbWJhc2UgKyBPRkZTRVRfTFNSKTsKKwl1YXJ0LT5sc3IgfD0gKGxzciAmIChCSXxGRXxQRXxPRSkpOworCXJldHVybiBsc3IgfCB1YXJ0LT5sc3I7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBVQVJUX0NMRUFSX0xTUihzdHJ1Y3QgYmZpbl9zZXJpYWxfcG9ydCAqdWFydCkKK3sKKwl1YXJ0LT5sc3IgPSAwOworCWJmaW5fd3JpdGUxNih1YXJ0LT5wb3J0Lm1lbWJhc2UgKyBPRkZTRVRfTFNSLCAtMSk7Cit9CisKK3N0cnVjdCBiZmluX3NlcmlhbF9yZXMgeworCXVuc2lnbmVkIGxvbmcJdWFydF9iYXNlX2FkZHI7CisJaW50CQl1YXJ0X2lycTsKKyNpZmRlZiBDT05GSUdfU0VSSUFMX0JGSU5fRE1BCisJdW5zaWduZWQgaW50CXVhcnRfdHhfZG1hX2NoYW5uZWw7CisJdW5zaWduZWQgaW50CXVhcnRfcnhfZG1hX2NoYW5uZWw7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfU0VSSUFMX0JGSU5fQ1RTUlRTCisJaW50CXVhcnRfY3RzX3BpbjsKKwlpbnQJdWFydF9ydHNfcGluOworI2VuZGlmCit9OworCitzdHJ1Y3QgYmZpbl9zZXJpYWxfcmVzIGJmaW5fc2VyaWFsX3Jlc291cmNlW10gPSB7CisjaWZkZWYgQ09ORklHX1NFUklBTF9CRklOX1VBUlQwCisJeworCTB4RkZDMDA0MDAsCisJSVJRX1VBUlQwX1JYLAorI2lmZGVmIENPTkZJR19TRVJJQUxfQkZJTl9ETUEKKwlDSF9VQVJUMF9UWCwKKwlDSF9VQVJUMF9SWCwKKyNlbmRpZgorI2lmZGVmIENPTkZJR19CRklOX1VBUlQwX0NUU1JUUworCUNPTkZJR19VQVJUMF9DVFNfUElOLAorCUNPTkZJR19VQVJUMF9SVFNfUElOLAorI2VuZGlmCisJfSwKKyNlbmRpZgorI2lmZGVmIENPTkZJR19TRVJJQUxfQkZJTl9VQVJUMQorCXsKKwkweEZGQzAyMDAwLAorCUlSUV9VQVJUMV9SWCwKKyNpZmRlZiBDT05GSUdfU0VSSUFMX0JGSU5fRE1BCisJQ0hfVUFSVDFfVFgsCisJQ0hfVUFSVDFfUlgsCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfQkZJTl9VQVJUMV9DVFNSVFMKKwlDT05GSUdfVUFSVDFfQ1RTX1BJTiwKKwlDT05GSUdfVUFSVDFfUlRTX1BJTiwKKyNlbmRpZgorCX0sCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfU0VSSUFMX0JGSU5fVUFSVDIKKwl7CisJMHhGRkMwMjEwMCwKKwlJUlFfVUFSVDJfUlgsCisjaWZkZWYgQ09ORklHX1NFUklBTF9CRklOX0RNQQorCUNIX1VBUlQyX1RYLAorCUNIX1VBUlQyX1JYLAorI2VuZGlmCisjaWZkZWYgQ09ORklHX0JGSU5fVUFSVDJfQ1RTUlRTCisJQ09ORklHX1VBUlQyX0NUU19QSU4sCisJQ09ORklHX1VBUlQyX1JUU19QSU4sCisjZW5kaWYKKwl9LAorI2VuZGlmCit9OworCisjZGVmaW5lIERSSVZFUl9OQU1FICJiZmluLXVhcnQiCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzgvaW5jbHVkZS9tYWNoL2JsYWNrZmluLmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzgvaW5jbHVkZS9tYWNoL2JsYWNrZmluLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWEyNTM3MWE5Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM4L2luY2x1ZGUvbWFjaC9ibGFja2Zpbi5oCkBAIC0wLDAgKzEsMTAxIEBACisvKgorICogRmlsZTogICAgICAgICBpbmNsdWRlL2FzbS1ibGFja2Zpbi9tYWNoLWJmNTM4L2JsYWNrZmluLmgKKyAqIEJhc2VkIG9uOgorICogQXV0aG9yOgorICoKKyAqIENyZWF0ZWQ6CisgKiBEZXNjcmlwdGlvbjoKKyAqCisgKiBSZXY6CisgKgorICogTW9kaWZpZWQ6CisgKgorICoKKyAqIEJ1Z3M6ICAgICAgICAgRW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuCisgKiBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICovCisKKyNpZm5kZWYgX01BQ0hfQkxBQ0tGSU5fSF8KKyNkZWZpbmUgX01BQ0hfQkxBQ0tGSU5fSF8KKworI2RlZmluZSBCRjUzOF9GQU1JTFkKKworI2luY2x1ZGUgImJmNTM4LmgiCisjaW5jbHVkZSAibWVtX21hcC5oIgorI2luY2x1ZGUgImRlZkJGNTM5LmgiCisjaW5jbHVkZSAiYW5vbWFseS5oIgorCisKKyNpZiAhZGVmaW5lZChfX0FTU0VNQkxZX18pCisjaW5jbHVkZSAiY2RlZkJGNTM4LmgiCisKKyNpZiBkZWZpbmVkKENPTkZJR19CRjUzOSkKKyNpbmNsdWRlICJjZGVmQkY1MzkuaCIKKyNlbmRpZgorI2VuZGlmCisKKy8qIFVBUlRfSUlSIFJlZ2lzdGVyICovCisjZGVmaW5lIFNUQVRVUyh4KQkoKHggPDwgMSkgJiAweDA2KQorI2RlZmluZSBTVEFUVVNfUDEJMHgwMgorI2RlZmluZSBTVEFUVVNfUDAJMHgwMQorCisjZGVmaW5lIEJGSU5fVUFSVF9OUl9QT1JUUwkzCisKKyNkZWZpbmUgT0ZGU0VUX1RIUiAgICAgICAgICAgICAgMHgwMAkvKiBUcmFuc21pdCBIb2xkaW5nIHJlZ2lzdGVyICAgICAgICAgICAgKi8KKyNkZWZpbmUgT0ZGU0VUX1JCUiAgICAgICAgICAgICAgMHgwMAkvKiBSZWNlaXZlIEJ1ZmZlciByZWdpc3RlciAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgT0ZGU0VUX0RMTCAgICAgICAgICAgICAgMHgwMAkvKiBEaXZpc29yIExhdGNoIChMb3ctQnl0ZSkgICAgICAgICAgICAgKi8KKyNkZWZpbmUgT0ZGU0VUX0lFUiAgICAgICAgICAgICAgMHgwNAkvKiBJbnRlcnJ1cHQgRW5hYmxlIFJlZ2lzdGVyICAgICAgICAgICAgKi8KKyNkZWZpbmUgT0ZGU0VUX0RMSCAgICAgICAgICAgICAgMHgwNAkvKiBEaXZpc29yIExhdGNoIChIaWdoLUJ5dGUpICAgICAgICAgICAgKi8KKyNkZWZpbmUgT0ZGU0VUX0lJUiAgICAgICAgICAgICAgMHgwOAkvKiBJbnRlcnJ1cHQgSWRlbnRpZmljYXRpb24gUmVnaXN0ZXIgICAgKi8KKyNkZWZpbmUgT0ZGU0VUX0xDUiAgICAgICAgICAgICAgMHgwQwkvKiBMaW5lIENvbnRyb2wgUmVnaXN0ZXIgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgT0ZGU0VUX01DUiAgICAgICAgICAgICAgMHgxMAkvKiBNb2RlbSBDb250cm9sIFJlZ2lzdGVyICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgT0ZGU0VUX0xTUiAgICAgICAgICAgICAgMHgxNAkvKiBMaW5lIFN0YXR1cyBSZWdpc3RlciAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgT0ZGU0VUX01TUiAgICAgICAgICAgICAgMHgxOAkvKiBNb2RlbSBTdGF0dXMgUmVnaXN0ZXIgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgT0ZGU0VUX1NDUiAgICAgICAgICAgICAgMHgxQwkvKiBTQ1IgU2NyYXRjaCBSZWdpc3RlciAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgT0ZGU0VUX0dDVEwgICAgICAgICAgICAgMHgyNAkvKiBHbG9iYWwgQ29udHJvbCBSZWdpc3RlciAgICAgICAgICAgICAgKi8KKworCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMF9JUlFfU1RBVFVTCWJmaW5fd3JpdGVfTURNQTBfRDBfSVJRX1NUQVRVUworI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDBfU1RBUlRfQUREUiAgIGJmaW5fd3JpdGVfTURNQTBfRDBfU1RBUlRfQUREUgorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzBfU1RBUlRfQUREUiAgIGJmaW5fd3JpdGVfTURNQTBfUzBfU1RBUlRfQUREUgorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDBfWF9DT1VOVCAgICAgIGJmaW5fd3JpdGVfTURNQTBfRDBfWF9DT1VOVAorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzBfWF9DT1VOVCAgICAgIGJmaW5fd3JpdGVfTURNQTBfUzBfWF9DT1VOVAorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDBfWV9DT1VOVCAgICAgIGJmaW5fd3JpdGVfTURNQTBfRDBfWV9DT1VOVAorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzBfWV9DT1VOVCAgICAgIGJmaW5fd3JpdGVfTURNQTBfUzBfWV9DT1VOVAorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDBfWF9NT0RJRlkgICAgIGJmaW5fd3JpdGVfTURNQTBfRDBfWF9NT0RJRlkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MwX1hfTU9ESUZZICAgICBiZmluX3dyaXRlX01ETUEwX1MwX1hfTU9ESUZZCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9EMF9ZX01PRElGWSAgICAgYmZpbl93cml0ZV9NRE1BMF9EMF9ZX01PRElGWQorI2RlZmluZSBiZmluX3dyaXRlX01ETUFfUzBfWV9NT0RJRlkgICAgIGJmaW5fd3JpdGVfTURNQTBfUzBfWV9NT0RJRlkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX1MwX0NPTkZJRyAgICAgICBiZmluX3dyaXRlX01ETUEwX1MwX0NPTkZJRworI2RlZmluZSBiZmluX3dyaXRlX01ETUFfRDBfQ09ORklHICAgICAgIGJmaW5fd3JpdGVfTURNQTBfRDBfQ09ORklHCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BX1MwX0NPTkZJRyAgICAgICAgYmZpbl9yZWFkX01ETUEwX1MwX0NPTkZJRworI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMF9JUlFfU1RBVFVTICAgIGJmaW5fcmVhZF9NRE1BMF9EMF9JUlFfU1RBVFVTCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQV9TMF9JUlFfU1RBVFVTICAgYmZpbl93cml0ZV9NRE1BMF9TMF9JUlFfU1RBVFVTCisKKworLyogRFBNQyovCisjZGVmaW5lIGJmaW5fcmVhZF9TVE9QQ0tfT0ZGKCkgYmZpbl9yZWFkX1NUT1BDSygpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1RPUENLX09GRih2YWwpIGJmaW5fd3JpdGVfU1RPUENLKHZhbCkKKyNkZWZpbmUgU1RPUENLX09GRiBTVE9QQ0sKKworLyogUExMX0RJViBNYXNrcwkJCQkJCQkJCQkJCQkqLworI2RlZmluZSBDQ0xLX0RJVjEgQ1NFTF9ESVYxCS8qICAgICAgICAgIENDTEsgPSBWQ08gLyAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIENDTEtfRElWMiBDU0VMX0RJVjIJLyogICAgICAgICAgQ0NMSyA9IFZDTyAvIDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ0NMS19ESVY0IENTRUxfRElWNAkvKiAgICAgICAgICBDQ0xLID0gVkNPIC8gNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBDQ0xLX0RJVjggQ1NFTF9ESVY4CS8qICAgICAgICAgIENDTEsgPSBWQ08gLyA4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM4L2luY2x1ZGUvbWFjaC9jZGVmQkY1MzguaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzOC9pbmNsdWRlL21hY2gvY2RlZkJGNTM4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQxNzI1YgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzOC9pbmNsdWRlL21hY2gvY2RlZkJGNTM4LmgKQEAgLTAsMCArMSwyMTA4IEBACisvKgorICogRmlsZTogICAgICAgICBpbmNsdWRlL2FzbS1ibGFja2Zpbi9tYWNoLWJmNTM4L2NkZWZCRjUzOC5oCisgKiBCYXNlZCBvbjoKKyAqIEF1dGhvcjoKKyAqCisgKiBDcmVhdGVkOgorICogRGVzY3JpcHRpb246CisgKgorICogUmV2OgorICoKKyAqIE1vZGlmaWVkOgorICoKKyAqIEJ1Z3M6ICAgICAgICAgRW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuCisgKiBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICovCisKKyNpZm5kZWYgX0NERUZfQkY1MzhfSAorI2RlZmluZSBfQ0RFRl9CRjUzOF9ICisKKyNpbmNsdWRlIDxhc20vYmxhY2tmaW4uaD4KKworLyppbmNsdWRlIGFsbCBDb3JlIHJlZ2lzdGVycyBhbmQgYml0IGRlZmluaXRpb25zKi8KKyNpbmNsdWRlICJkZWZCRjUzOS5oIgorCisvKmluY2x1ZGUgY29yZSBzcGVjaWZpYyByZWdpc3RlciBwb2ludGVyIGRlZmluaXRpb25zKi8KKyNpbmNsdWRlIDxhc20vY2RlZl9MUEJsYWNrZmluLmg+CisKKyNkZWZpbmUgYmZpbl93cml0ZVBUUihhZGRyLCB2YWwpIGJmaW5fd3JpdGUzMihhZGRyLCB2YWwpCisKKyNkZWZpbmUgYmZpbl9yZWFkX1BMTF9DVEwoKSAgICAgICAgICAgIGJmaW5fcmVhZDE2KFBMTF9DVEwpCisjZGVmaW5lIGJmaW5fcmVhZF9QTExfRElWKCkgICAgICAgICAgICBiZmluX3JlYWQxNihQTExfRElWKQorI2RlZmluZSBiZmluX3dyaXRlX1BMTF9ESVYodmFsKSAgICAgICAgYmZpbl93cml0ZTE2KFBMTF9ESVYsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1ZSX0NUTCgpICAgICAgICAgICAgIGJmaW5fcmVhZDE2KFZSX0NUTCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BMTF9TVEFUKCkgICAgICAgICAgIGJmaW5fcmVhZDE2KFBMTF9TVEFUKQorI2RlZmluZSBiZmluX3dyaXRlX1BMTF9TVEFUKHZhbCkgICAgICAgYmZpbl93cml0ZTE2KFBMTF9TVEFULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QTExfTE9DS0NOVCgpICAgICAgICBiZmluX3JlYWQxNihQTExfTE9DS0NOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9QTExfTE9DS0NOVCh2YWwpICAgIGJmaW5fd3JpdGUxNihQTExfTE9DS0NOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0hJUElEKCkgICAgICAgICAgICAgYmZpbl9yZWFkMzIoQ0hJUElEKQorI2RlZmluZSBiZmluX3dyaXRlX0NISVBJRCh2YWwpICAgICAgICAgYmZpbl93cml0ZTMyKENISVBJRCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1dSU1QoKSAgICAgICAgICAgICAgYmZpbl9yZWFkMTYoU1dSU1QpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1dSU1QodmFsKSAgICAgICAgICBiZmluX3dyaXRlMTYoU1dSU1QsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NZU0NSKCkgICAgICAgICAgICAgIGJmaW5fcmVhZDE2KFNZU0NSKQorI2RlZmluZSBiZmluX3dyaXRlX1NZU0NSKHZhbCkgICAgICAgICAgYmZpbl93cml0ZTE2KFNZU0NSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TSUNfUlZFQ1QoKSAgICAgICAgICBiZmluX3JlYWRQVFIoU0lDX1JWRUNUKQorI2RlZmluZSBiZmluX3dyaXRlX1NJQ19SVkVDVCh2YWwpICAgICAgYmZpbl93cml0ZVBUUihTSUNfUlZFQ1QsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NJQ19JTUFTSzAoKSAgICAgICAgIGJmaW5fcmVhZDMyKFNJQ19JTUFTSzApCisjZGVmaW5lIGJmaW5fd3JpdGVfU0lDX0lNQVNLMCh2YWwpICAgICBiZmluX3dyaXRlMzIoU0lDX0lNQVNLMCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU0lDX0lNQVNLMSgpICAgICAgICAgYmZpbl9yZWFkMzIoU0lDX0lNQVNLMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9TSUNfSU1BU0sxKHZhbCkgICAgIGJmaW5fd3JpdGUzMihTSUNfSU1BU0sxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TSUNfSU1BU0soeCkJICAgICAgIGJmaW5fcmVhZDMyKFNJQ19JTUFTSzAgKyB4ICogKFNJQ19JTUFTSzEgLSBTSUNfSU1BU0swKSkKKyNkZWZpbmUgYmZpbl93cml0ZV9TSUNfSU1BU0soeCwgdmFsKSAgIGJmaW5fd3JpdGUzMihTSUNfSU1BU0swICsgeCAqIChTSUNfSU1BU0sxIC0gU0lDX0lNQVNLMCksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NJQ19JU1IwKCkgICAgICAgICAgIGJmaW5fcmVhZDMyKFNJQ19JU1IwKQorI2RlZmluZSBiZmluX3dyaXRlX1NJQ19JU1IwKHZhbCkgICAgICAgYmZpbl93cml0ZTMyKFNJQ19JU1IwLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TSUNfSVNSMSgpICAgICAgICAgICBiZmluX3JlYWQzMihTSUNfSVNSMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9TSUNfSVNSMSh2YWwpICAgICAgIGJmaW5fd3JpdGUzMihTSUNfSVNSMSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU0lDX0lTUih4KQkgICAgICAgYmZpbl9yZWFkMzIoU0lDX0lTUjAgKyB4ICogKFNJQ19JU1IxIC0gU0lDX0lTUjApKQorI2RlZmluZSBiZmluX3dyaXRlX1NJQ19JU1IoeCwgdmFsKSAgICAgYmZpbl93cml0ZTMyKFNJQ19JU1IwICsgeCAqIChTSUNfSVNSMSAtIFNJQ19JU1IwKSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU0lDX0lXUjAoKSAgICAgICAgICAgYmZpbl9yZWFkMzIoU0lDX0lXUjApCisjZGVmaW5lIGJmaW5fd3JpdGVfU0lDX0lXUjAodmFsKSAgICAgICBiZmluX3dyaXRlMzIoU0lDX0lXUjAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NJQ19JV1IxKCkgICAgICAgICAgIGJmaW5fcmVhZDMyKFNJQ19JV1IxKQorI2RlZmluZSBiZmluX3dyaXRlX1NJQ19JV1IxKHZhbCkgICAgICAgYmZpbl93cml0ZTMyKFNJQ19JV1IxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TSUNfSVdSKHgpCSAgICAgICBiZmluX3JlYWQzMihTSUNfSVdSMCArIHggKiAoU0lDX0lXUjEgLSBTSUNfSVdSMCkpCisjZGVmaW5lIGJmaW5fd3JpdGVfU0lDX0lXUih4LCB2YWwpICAgICBiZmluX3dyaXRlMzIoKFNJQ19JV1IwICsgeCAqIChTSUNfSVdSMSAtIFNJQ19JV1IwKSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU0lDX0lBUjAoKSAgICAgICAgICAgYmZpbl9yZWFkMzIoU0lDX0lBUjApCisjZGVmaW5lIGJmaW5fd3JpdGVfU0lDX0lBUjAodmFsKSAgICAgICBiZmluX3dyaXRlMzIoU0lDX0lBUjAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NJQ19JQVIxKCkgICAgICAgICAgIGJmaW5fcmVhZDMyKFNJQ19JQVIxKQorI2RlZmluZSBiZmluX3dyaXRlX1NJQ19JQVIxKHZhbCkgICAgICAgYmZpbl93cml0ZTMyKFNJQ19JQVIxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TSUNfSUFSMigpICAgICAgICAgICBiZmluX3JlYWQzMihTSUNfSUFSMikKKyNkZWZpbmUgYmZpbl93cml0ZV9TSUNfSUFSMih2YWwpICAgICAgIGJmaW5fd3JpdGUzMihTSUNfSUFSMiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU0lDX0lBUjMoKSAgICAgICAgICAgYmZpbl9yZWFkMzIoU0lDX0lBUjMpCisjZGVmaW5lIGJmaW5fd3JpdGVfU0lDX0lBUjModmFsKSAgICAgICBiZmluX3dyaXRlMzIoU0lDX0lBUjMsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NJQ19JQVI0KCkgICAgICAgICAgIGJmaW5fcmVhZDMyKFNJQ19JQVI0KQorI2RlZmluZSBiZmluX3dyaXRlX1NJQ19JQVI0KHZhbCkgICAgICAgYmZpbl93cml0ZTMyKFNJQ19JQVI0LCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TSUNfSUFSNSgpICAgICAgICAgICBiZmluX3JlYWQzMihTSUNfSUFSNSkKKyNkZWZpbmUgYmZpbl93cml0ZV9TSUNfSUFSNSh2YWwpICAgICAgIGJmaW5fd3JpdGUzMihTSUNfSUFSNSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU0lDX0lBUjYoKSAgICAgICAgICAgYmZpbl9yZWFkMzIoU0lDX0lBUjYpCisjZGVmaW5lIGJmaW5fd3JpdGVfU0lDX0lBUjYodmFsKSAgICAgICBiZmluX3dyaXRlMzIoU0lDX0lBUjYsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1dET0dfQ1RMKCkgICAgICAgICAgIGJmaW5fcmVhZDE2KFdET0dfQ1RMKQorI2RlZmluZSBiZmluX3dyaXRlX1dET0dfQ1RMKHZhbCkgICAgICAgYmZpbl93cml0ZTE2KFdET0dfQ1RMLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9XRE9HX0NOVCgpICAgICAgICAgICBiZmluX3JlYWQzMihXRE9HX0NOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9XRE9HX0NOVCh2YWwpICAgICAgIGJmaW5fd3JpdGUzMihXRE9HX0NOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfV0RPR19TVEFUKCkgICAgICAgICAgYmZpbl9yZWFkMzIoV0RPR19TVEFUKQorI2RlZmluZSBiZmluX3dyaXRlX1dET0dfU1RBVCh2YWwpICAgICAgYmZpbl93cml0ZTMyKFdET0dfU1RBVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUlRDX1NUQVQoKSAgICAgICAgICAgYmZpbl9yZWFkMzIoUlRDX1NUQVQpCisjZGVmaW5lIGJmaW5fd3JpdGVfUlRDX1NUQVQodmFsKSAgICAgICBiZmluX3dyaXRlMzIoUlRDX1NUQVQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1JUQ19JQ1RMKCkgICAgICAgICAgIGJmaW5fcmVhZDE2KFJUQ19JQ1RMKQorI2RlZmluZSBiZmluX3dyaXRlX1JUQ19JQ1RMKHZhbCkgICAgICAgYmZpbl93cml0ZTE2KFJUQ19JQ1RMLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9SVENfSVNUQVQoKSAgICAgICAgICBiZmluX3JlYWQxNihSVENfSVNUQVQpCisjZGVmaW5lIGJmaW5fd3JpdGVfUlRDX0lTVEFUKHZhbCkgICAgICBiZmluX3dyaXRlMTYoUlRDX0lTVEFULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9SVENfU1dDTlQoKSAgICAgICAgICBiZmluX3JlYWQxNihSVENfU1dDTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfUlRDX1NXQ05UKHZhbCkgICAgICBiZmluX3dyaXRlMTYoUlRDX1NXQ05ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9SVENfQUxBUk0oKSAgICAgICAgICBiZmluX3JlYWQzMihSVENfQUxBUk0pCisjZGVmaW5lIGJmaW5fd3JpdGVfUlRDX0FMQVJNKHZhbCkgICAgICBiZmluX3dyaXRlMzIoUlRDX0FMQVJNLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9SVENfUFJFTigpICAgICAgICAgICBiZmluX3JlYWQxNihSVENfUFJFTikKKyNkZWZpbmUgYmZpbl93cml0ZV9SVENfUFJFTih2YWwpICAgICAgIGJmaW5fd3JpdGUxNihSVENfUFJFTiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVUFSVDBfVEhSKCkgICAgICAgICAgYmZpbl9yZWFkMTYoVUFSVDBfVEhSKQorI2RlZmluZSBiZmluX3dyaXRlX1VBUlQwX1RIUih2YWwpICAgICAgYmZpbl93cml0ZTE2KFVBUlQwX1RIUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVUFSVDBfUkJSKCkgICAgICAgICAgYmZpbl9yZWFkMTYoVUFSVDBfUkJSKQorI2RlZmluZSBiZmluX3dyaXRlX1VBUlQwX1JCUih2YWwpICAgICAgYmZpbl93cml0ZTE2KFVBUlQwX1JCUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVUFSVDBfRExMKCkgICAgICAgICAgYmZpbl9yZWFkMTYoVUFSVDBfRExMKQorI2RlZmluZSBiZmluX3dyaXRlX1VBUlQwX0RMTCh2YWwpICAgICAgYmZpbl93cml0ZTE2KFVBUlQwX0RMTCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVUFSVDBfRExIKCkgICAgICAgICAgYmZpbl9yZWFkMTYoVUFSVDBfRExIKQorI2RlZmluZSBiZmluX3dyaXRlX1VBUlQwX0RMSCh2YWwpICAgICAgYmZpbl93cml0ZTE2KFVBUlQwX0RMSCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVUFSVDBfSUVSKCkgICAgICAgICAgYmZpbl9yZWFkMTYoVUFSVDBfSUVSKQorI2RlZmluZSBiZmluX3dyaXRlX1VBUlQwX0lFUih2YWwpICAgICAgYmZpbl93cml0ZTE2KFVBUlQwX0lFUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVUFSVDBfSUlSKCkgICAgICAgICAgYmZpbl9yZWFkMTYoVUFSVDBfSUlSKQorI2RlZmluZSBiZmluX3dyaXRlX1VBUlQwX0lJUih2YWwpICAgICAgYmZpbl93cml0ZTE2KFVBUlQwX0lJUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVUFSVDBfTENSKCkgICAgICAgICAgYmZpbl9yZWFkMTYoVUFSVDBfTENSKQorI2RlZmluZSBiZmluX3dyaXRlX1VBUlQwX0xDUih2YWwpICAgICAgYmZpbl93cml0ZTE2KFVBUlQwX0xDUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVUFSVDBfTUNSKCkgICAgICAgICAgYmZpbl9yZWFkMTYoVUFSVDBfTUNSKQorI2RlZmluZSBiZmluX3dyaXRlX1VBUlQwX01DUih2YWwpICAgICAgYmZpbl93cml0ZTE2KFVBUlQwX01DUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVUFSVDBfTFNSKCkgICAgICAgICAgYmZpbl9yZWFkMTYoVUFSVDBfTFNSKQorI2RlZmluZSBiZmluX3dyaXRlX1VBUlQwX0xTUih2YWwpICAgICAgYmZpbl93cml0ZTE2KFVBUlQwX0xTUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVUFSVDBfU0NSKCkgICAgICAgICAgYmZpbl9yZWFkMTYoVUFSVDBfU0NSKQorI2RlZmluZSBiZmluX3dyaXRlX1VBUlQwX1NDUih2YWwpICAgICAgYmZpbl93cml0ZTE2KFVBUlQwX1NDUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVUFSVDBfR0NUTCgpICAgICAgICAgYmZpbl9yZWFkMTYoVUFSVDBfR0NUTCkKKyNkZWZpbmUgYmZpbl93cml0ZV9VQVJUMF9HQ1RMKHZhbCkgICAgIGJmaW5fd3JpdGUxNihVQVJUMF9HQ1RMLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9VQVJUMV9USFIoKSAgICAgICAgICBiZmluX3JlYWQxNihVQVJUMV9USFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfVUFSVDFfVEhSKHZhbCkgICAgICBiZmluX3dyaXRlMTYoVUFSVDFfVEhSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9VQVJUMV9SQlIoKSAgICAgICAgICBiZmluX3JlYWQxNihVQVJUMV9SQlIpCisjZGVmaW5lIGJmaW5fd3JpdGVfVUFSVDFfUkJSKHZhbCkgICAgICBiZmluX3dyaXRlMTYoVUFSVDFfUkJSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9VQVJUMV9ETEwoKSAgICAgICAgICBiZmluX3JlYWQxNihVQVJUMV9ETEwpCisjZGVmaW5lIGJmaW5fd3JpdGVfVUFSVDFfRExMKHZhbCkgICAgICBiZmluX3dyaXRlMTYoVUFSVDFfRExMLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9VQVJUMV9ETEgoKSAgICAgICAgICBiZmluX3JlYWQxNihVQVJUMV9ETEgpCisjZGVmaW5lIGJmaW5fd3JpdGVfVUFSVDFfRExIKHZhbCkgICAgICBiZmluX3dyaXRlMTYoVUFSVDFfRExILCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9VQVJUMV9JRVIoKSAgICAgICAgICBiZmluX3JlYWQxNihVQVJUMV9JRVIpCisjZGVmaW5lIGJmaW5fd3JpdGVfVUFSVDFfSUVSKHZhbCkgICAgICBiZmluX3dyaXRlMTYoVUFSVDFfSUVSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9VQVJUMV9JSVIoKSAgICAgICAgICBiZmluX3JlYWQxNihVQVJUMV9JSVIpCisjZGVmaW5lIGJmaW5fd3JpdGVfVUFSVDFfSUlSKHZhbCkgICAgICBiZmluX3dyaXRlMTYoVUFSVDFfSUlSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9VQVJUMV9MQ1IoKSAgICAgICAgICBiZmluX3JlYWQxNihVQVJUMV9MQ1IpCisjZGVmaW5lIGJmaW5fd3JpdGVfVUFSVDFfTENSKHZhbCkgICAgICBiZmluX3dyaXRlMTYoVUFSVDFfTENSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9VQVJUMV9NQ1IoKSAgICAgICAgICBiZmluX3JlYWQxNihVQVJUMV9NQ1IpCisjZGVmaW5lIGJmaW5fd3JpdGVfVUFSVDFfTUNSKHZhbCkgICAgICBiZmluX3dyaXRlMTYoVUFSVDFfTUNSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9VQVJUMV9MU1IoKSAgICAgICAgICBiZmluX3JlYWQxNihVQVJUMV9MU1IpCisjZGVmaW5lIGJmaW5fd3JpdGVfVUFSVDFfTFNSKHZhbCkgICAgICBiZmluX3dyaXRlMTYoVUFSVDFfTFNSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9VQVJUMV9TQ1IoKSAgICAgICAgICBiZmluX3JlYWQxNihVQVJUMV9TQ1IpCisjZGVmaW5lIGJmaW5fd3JpdGVfVUFSVDFfU0NSKHZhbCkgICAgICBiZmluX3dyaXRlMTYoVUFSVDFfU0NSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9VQVJUMV9HQ1RMKCkgICAgICAgICBiZmluX3JlYWQxNihVQVJUMV9HQ1RMKQorI2RlZmluZSBiZmluX3dyaXRlX1VBUlQxX0dDVEwodmFsKSAgICAgYmZpbl93cml0ZTE2KFVBUlQxX0dDVEwsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1VBUlQyX1RIUigpICAgICAgICAgIGJmaW5fcmVhZDE2KFVBUlQyX1RIUikKKyNkZWZpbmUgYmZpbl93cml0ZV9VQVJUMl9USFIodmFsKSAgICAgIGJmaW5fd3JpdGUxNihVQVJUMl9USFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1VBUlQyX1JCUigpICAgICAgICAgIGJmaW5fcmVhZDE2KFVBUlQyX1JCUikKKyNkZWZpbmUgYmZpbl93cml0ZV9VQVJUMl9SQlIodmFsKSAgICAgIGJmaW5fd3JpdGUxNihVQVJUMl9SQlIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1VBUlQyX0RMTCgpICAgICAgICAgIGJmaW5fcmVhZDE2KFVBUlQyX0RMTCkKKyNkZWZpbmUgYmZpbl93cml0ZV9VQVJUMl9ETEwodmFsKSAgICAgIGJmaW5fd3JpdGUxNihVQVJUMl9ETEwsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1VBUlQyX0RMSCgpICAgICAgICAgIGJmaW5fcmVhZDE2KFVBUlQyX0RMSCkKKyNkZWZpbmUgYmZpbl93cml0ZV9VQVJUMl9ETEgodmFsKSAgICAgIGJmaW5fd3JpdGUxNihVQVJUMl9ETEgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1VBUlQyX0lFUigpICAgICAgICAgIGJmaW5fcmVhZDE2KFVBUlQyX0lFUikKKyNkZWZpbmUgYmZpbl93cml0ZV9VQVJUMl9JRVIodmFsKSAgICAgIGJmaW5fd3JpdGUxNihVQVJUMl9JRVIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1VBUlQyX0lJUigpICAgICAgICAgIGJmaW5fcmVhZDE2KFVBUlQyX0lJUikKKyNkZWZpbmUgYmZpbl93cml0ZV9VQVJUMl9JSVIodmFsKSAgICAgIGJmaW5fd3JpdGUxNihVQVJUMl9JSVIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1VBUlQyX0xDUigpICAgICAgICAgIGJmaW5fcmVhZDE2KFVBUlQyX0xDUikKKyNkZWZpbmUgYmZpbl93cml0ZV9VQVJUMl9MQ1IodmFsKSAgICAgIGJmaW5fd3JpdGUxNihVQVJUMl9MQ1IsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1VBUlQyX01DUigpICAgICAgICAgIGJmaW5fcmVhZDE2KFVBUlQyX01DUikKKyNkZWZpbmUgYmZpbl93cml0ZV9VQVJUMl9NQ1IodmFsKSAgICAgIGJmaW5fd3JpdGUxNihVQVJUMl9NQ1IsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1VBUlQyX0xTUigpICAgICAgICAgIGJmaW5fcmVhZDE2KFVBUlQyX0xTUikKKyNkZWZpbmUgYmZpbl93cml0ZV9VQVJUMl9MU1IodmFsKSAgICAgIGJmaW5fd3JpdGUxNihVQVJUMl9MU1IsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1VBUlQyX1NDUigpICAgICAgICAgIGJmaW5fcmVhZDE2KFVBUlQyX1NDUikKKyNkZWZpbmUgYmZpbl93cml0ZV9VQVJUMl9TQ1IodmFsKSAgICAgIGJmaW5fd3JpdGUxNihVQVJUMl9TQ1IsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1VBUlQyX0dDVEwoKSAgICAgICAgIGJmaW5fcmVhZDE2KFVBUlQyX0dDVEwpCisjZGVmaW5lIGJmaW5fd3JpdGVfVUFSVDJfR0NUTCh2YWwpICAgICBiZmluX3dyaXRlMTYoVUFSVDJfR0NUTCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BJMF9DVEwoKSAgICAgICAgICAgYmZpbl9yZWFkMTYoU1BJMF9DVEwpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BJMF9DVEwodmFsKSAgICAgICBiZmluX3dyaXRlMTYoU1BJMF9DVEwsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQSTBfRkxHKCkgICAgICAgICAgIGJmaW5fcmVhZDE2KFNQSTBfRkxHKQorI2RlZmluZSBiZmluX3dyaXRlX1NQSTBfRkxHKHZhbCkgICAgICAgYmZpbl93cml0ZTE2KFNQSTBfRkxHLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUEkwX1NUQVQoKSAgICAgICAgICBiZmluX3JlYWQxNihTUEkwX1NUQVQpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BJMF9TVEFUKHZhbCkgICAgICBiZmluX3dyaXRlMTYoU1BJMF9TVEFULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUEkwX1REQlIoKSAgICAgICAgICBiZmluX3JlYWQxNihTUEkwX1REQlIpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BJMF9UREJSKHZhbCkgICAgICBiZmluX3dyaXRlMTYoU1BJMF9UREJSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUEkwX1JEQlIoKSAgICAgICAgICBiZmluX3JlYWQxNihTUEkwX1JEQlIpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BJMF9SREJSKHZhbCkgICAgICBiZmluX3dyaXRlMTYoU1BJMF9SREJSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUEkwX0JBVUQoKSAgICAgICAgICBiZmluX3JlYWQxNihTUEkwX0JBVUQpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BJMF9CQVVEKHZhbCkgICAgICBiZmluX3dyaXRlMTYoU1BJMF9CQVVELCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUEkwX1NIQURPVygpICAgICAgICBiZmluX3JlYWQxNihTUEkwX1NIQURPVykKKyNkZWZpbmUgYmZpbl93cml0ZV9TUEkwX1NIQURPVyh2YWwpICAgIGJmaW5fd3JpdGUxNihTUEkwX1NIQURPVywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BJMV9DVEwoKSAgICAgICAgICAgYmZpbl9yZWFkMTYoU1BJMV9DVEwpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BJMV9DVEwodmFsKSAgICAgICBiZmluX3dyaXRlMTYoU1BJMV9DVEwsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQSTFfRkxHKCkgICAgICAgICAgIGJmaW5fcmVhZDE2KFNQSTFfRkxHKQorI2RlZmluZSBiZmluX3dyaXRlX1NQSTFfRkxHKHZhbCkgICAgICAgYmZpbl93cml0ZTE2KFNQSTFfRkxHLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUEkxX1NUQVQoKSAgICAgICAgICBiZmluX3JlYWQxNihTUEkxX1NUQVQpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BJMV9TVEFUKHZhbCkgICAgICBiZmluX3dyaXRlMTYoU1BJMV9TVEFULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUEkxX1REQlIoKSAgICAgICAgICBiZmluX3JlYWQxNihTUEkxX1REQlIpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BJMV9UREJSKHZhbCkgICAgICBiZmluX3dyaXRlMTYoU1BJMV9UREJSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUEkxX1JEQlIoKSAgICAgICAgICBiZmluX3JlYWQxNihTUEkxX1JEQlIpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BJMV9SREJSKHZhbCkgICAgICBiZmluX3dyaXRlMTYoU1BJMV9SREJSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUEkxX0JBVUQoKSAgICAgICAgICBiZmluX3JlYWQxNihTUEkxX0JBVUQpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BJMV9CQVVEKHZhbCkgICAgICBiZmluX3dyaXRlMTYoU1BJMV9CQVVELCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUEkxX1NIQURPVygpICAgICAgICBiZmluX3JlYWQxNihTUEkxX1NIQURPVykKKyNkZWZpbmUgYmZpbl93cml0ZV9TUEkxX1NIQURPVyh2YWwpICAgIGJmaW5fd3JpdGUxNihTUEkxX1NIQURPVywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BJMl9DVEwoKSAgICAgICAgICAgYmZpbl9yZWFkMTYoU1BJMl9DVEwpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BJMl9DVEwodmFsKSAgICAgICBiZmluX3dyaXRlMTYoU1BJMl9DVEwsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQSTJfRkxHKCkgICAgICAgICAgIGJmaW5fcmVhZDE2KFNQSTJfRkxHKQorI2RlZmluZSBiZmluX3dyaXRlX1NQSTJfRkxHKHZhbCkgICAgICAgYmZpbl93cml0ZTE2KFNQSTJfRkxHLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUEkyX1NUQVQoKSAgICAgICAgICBiZmluX3JlYWQxNihTUEkyX1NUQVQpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BJMl9TVEFUKHZhbCkgICAgICBiZmluX3dyaXRlMTYoU1BJMl9TVEFULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUEkyX1REQlIoKSAgICAgICAgICBiZmluX3JlYWQxNihTUEkyX1REQlIpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BJMl9UREJSKHZhbCkgICAgICBiZmluX3dyaXRlMTYoU1BJMl9UREJSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUEkyX1JEQlIoKSAgICAgICAgICBiZmluX3JlYWQxNihTUEkyX1JEQlIpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BJMl9SREJSKHZhbCkgICAgICBiZmluX3dyaXRlMTYoU1BJMl9SREJSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUEkyX0JBVUQoKSAgICAgICAgICBiZmluX3JlYWQxNihTUEkyX0JBVUQpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BJMl9CQVVEKHZhbCkgICAgICBiZmluX3dyaXRlMTYoU1BJMl9CQVVELCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUEkyX1NIQURPVygpICAgICAgICBiZmluX3JlYWQxNihTUEkyX1NIQURPVykKKyNkZWZpbmUgYmZpbl93cml0ZV9TUEkyX1NIQURPVyh2YWwpICAgIGJmaW5fd3JpdGUxNihTUEkyX1NIQURPVywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVElNRVIwX0NPTkZJRygpICAgICAgYmZpbl9yZWFkMTYoVElNRVIwX0NPTkZJRykKKyNkZWZpbmUgYmZpbl93cml0ZV9USU1FUjBfQ09ORklHKHZhbCkgIGJmaW5fd3JpdGUxNihUSU1FUjBfQ09ORklHLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9USU1FUjBfQ09VTlRFUigpICAgICBiZmluX3JlYWQzMihUSU1FUjBfQ09VTlRFUikKKyNkZWZpbmUgYmZpbl93cml0ZV9USU1FUjBfQ09VTlRFUih2YWwpIGJmaW5fd3JpdGUzMihUSU1FUjBfQ09VTlRFUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVElNRVIwX1BFUklPRCgpICAgICAgYmZpbl9yZWFkMzIoVElNRVIwX1BFUklPRCkKKyNkZWZpbmUgYmZpbl93cml0ZV9USU1FUjBfUEVSSU9EKHZhbCkgIGJmaW5fd3JpdGUzMihUSU1FUjBfUEVSSU9ELCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9USU1FUjBfV0lEVEgoKSAgICAgICBiZmluX3JlYWQzMihUSU1FUjBfV0lEVEgpCisjZGVmaW5lIGJmaW5fd3JpdGVfVElNRVIwX1dJRFRIKHZhbCkgICBiZmluX3dyaXRlMzIoVElNRVIwX1dJRFRILCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9USU1FUjFfQ09ORklHKCkgICAgICBiZmluX3JlYWQxNihUSU1FUjFfQ09ORklHKQorI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSMV9DT05GSUcodmFsKSAgYmZpbl93cml0ZTE2KFRJTUVSMV9DT05GSUcsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1RJTUVSMV9DT1VOVEVSKCkgICAgIGJmaW5fcmVhZDMyKFRJTUVSMV9DT1VOVEVSKQorI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSMV9DT1VOVEVSKHZhbCkgYmZpbl93cml0ZTMyKFRJTUVSMV9DT1VOVEVSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9USU1FUjFfUEVSSU9EKCkgICAgICBiZmluX3JlYWQzMihUSU1FUjFfUEVSSU9EKQorI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSMV9QRVJJT0QodmFsKSAgYmZpbl93cml0ZTMyKFRJTUVSMV9QRVJJT0QsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1RJTUVSMV9XSURUSCgpICAgICAgIGJmaW5fcmVhZDMyKFRJTUVSMV9XSURUSCkKKyNkZWZpbmUgYmZpbl93cml0ZV9USU1FUjFfV0lEVEgodmFsKSAgIGJmaW5fd3JpdGUzMihUSU1FUjFfV0lEVEgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1RJTUVSMl9DT05GSUcoKSAgICAgIGJmaW5fcmVhZDE2KFRJTUVSMl9DT05GSUcpCisjZGVmaW5lIGJmaW5fd3JpdGVfVElNRVIyX0NPTkZJRyh2YWwpICBiZmluX3dyaXRlMTYoVElNRVIyX0NPTkZJRywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVElNRVIyX0NPVU5URVIoKSAgICAgYmZpbl9yZWFkMzIoVElNRVIyX0NPVU5URVIpCisjZGVmaW5lIGJmaW5fd3JpdGVfVElNRVIyX0NPVU5URVIodmFsKSBiZmluX3dyaXRlMzIoVElNRVIyX0NPVU5URVIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1RJTUVSMl9QRVJJT0QoKSAgICAgIGJmaW5fcmVhZDMyKFRJTUVSMl9QRVJJT0QpCisjZGVmaW5lIGJmaW5fd3JpdGVfVElNRVIyX1BFUklPRCh2YWwpICBiZmluX3dyaXRlMzIoVElNRVIyX1BFUklPRCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVElNRVIyX1dJRFRIKCkgICAgICAgYmZpbl9yZWFkMzIoVElNRVIyX1dJRFRIKQorI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSMl9XSURUSCh2YWwpICAgYmZpbl93cml0ZTMyKFRJTUVSMl9XSURUSCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVElNRVJfRU5BQkxFKCkgICAgICAgYmZpbl9yZWFkMTYoVElNRVJfRU5BQkxFKQorI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSX0VOQUJMRSh2YWwpICAgYmZpbl93cml0ZTE2KFRJTUVSX0VOQUJMRSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVElNRVJfRElTQUJMRSgpICAgICAgYmZpbl9yZWFkMTYoVElNRVJfRElTQUJMRSkKKyNkZWZpbmUgYmZpbl93cml0ZV9USU1FUl9ESVNBQkxFKHZhbCkgIGJmaW5fd3JpdGUxNihUSU1FUl9ESVNBQkxFLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9USU1FUl9TVEFUVVMoKSAgICAgICBiZmluX3JlYWQxNihUSU1FUl9TVEFUVVMpCisjZGVmaW5lIGJmaW5fd3JpdGVfVElNRVJfU1RBVFVTKHZhbCkgICBiZmluX3dyaXRlMTYoVElNRVJfU1RBVFVTLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDBfVENSMSgpICAgICAgICBiZmluX3JlYWQxNihTUE9SVDBfVENSMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDBfVENSMSh2YWwpICAgIGJmaW5fd3JpdGUxNihTUE9SVDBfVENSMSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQwX1RDUjIoKSAgICAgICAgYmZpbl9yZWFkMTYoU1BPUlQwX1RDUjIpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQwX1RDUjIodmFsKSAgICBiZmluX3dyaXRlMTYoU1BPUlQwX1RDUjIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMF9UQ0xLRElWKCkgICAgIGJmaW5fcmVhZDE2KFNQT1JUMF9UQ0xLRElWKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMF9UQ0xLRElWKHZhbCkgYmZpbl93cml0ZTE2KFNQT1JUMF9UQ0xLRElWLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDBfVEZTRElWKCkgICAgICBiZmluX3JlYWQxNihTUE9SVDBfVEZTRElWKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMF9URlNESVYodmFsKSAgYmZpbl93cml0ZTE2KFNQT1JUMF9URlNESVYsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMF9UWCgpICAgICAgICAgIGJmaW5fcmVhZDMyKFNQT1JUMF9UWCkKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDBfVFgodmFsKSAgICAgIGJmaW5fd3JpdGUzMihTUE9SVDBfVFgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMF9SWCgpICAgICAgICAgIGJmaW5fcmVhZDMyKFNQT1JUMF9SWCkKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDBfUlgodmFsKSAgICAgIGJmaW5fd3JpdGUzMihTUE9SVDBfUlgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMF9SQ1IxKCkgICAgICAgIGJmaW5fcmVhZDE2KFNQT1JUMF9SQ1IxKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMF9SQ1IxKHZhbCkgICAgYmZpbl93cml0ZTE2KFNQT1JUMF9SQ1IxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDBfUkNSMigpICAgICAgICBiZmluX3JlYWQxNihTUE9SVDBfUkNSMikKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDBfUkNSMih2YWwpICAgIGJmaW5fd3JpdGUxNihTUE9SVDBfUkNSMiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQwX1JDTEtESVYoKSAgICAgYmZpbl9yZWFkMTYoU1BPUlQwX1JDTEtESVYpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQwX1JDTEtESVYodmFsKSBiZmluX3dyaXRlMTYoU1BPUlQwX1JDTEtESVYsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMF9SRlNESVYoKSAgICAgIGJmaW5fcmVhZDE2KFNQT1JUMF9SRlNESVYpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQwX1JGU0RJVih2YWwpICBiZmluX3dyaXRlMTYoU1BPUlQwX1JGU0RJViwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQwX1NUQVQoKSAgICAgICAgYmZpbl9yZWFkMTYoU1BPUlQwX1NUQVQpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQwX1NUQVQodmFsKSAgICBiZmluX3dyaXRlMTYoU1BPUlQwX1NUQVQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMF9DSE5MKCkgICAgICAgIGJmaW5fcmVhZDE2KFNQT1JUMF9DSE5MKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMF9DSE5MKHZhbCkgICAgYmZpbl93cml0ZTE2KFNQT1JUMF9DSE5MLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDBfTUNNQzEoKSAgICAgICBiZmluX3JlYWQxNihTUE9SVDBfTUNNQzEpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQwX01DTUMxKHZhbCkgICBiZmluX3dyaXRlMTYoU1BPUlQwX01DTUMxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDBfTUNNQzIoKSAgICAgICBiZmluX3JlYWQxNihTUE9SVDBfTUNNQzIpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQwX01DTUMyKHZhbCkgICBiZmluX3dyaXRlMTYoU1BPUlQwX01DTUMyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDBfTVRDUzAoKSAgICAgICBiZmluX3JlYWQzMihTUE9SVDBfTVRDUzApCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQwX01UQ1MwKHZhbCkgICBiZmluX3dyaXRlMzIoU1BPUlQwX01UQ1MwLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDBfTVRDUzEoKSAgICAgICBiZmluX3JlYWQzMihTUE9SVDBfTVRDUzEpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQwX01UQ1MxKHZhbCkgICBiZmluX3dyaXRlMzIoU1BPUlQwX01UQ1MxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDBfTVRDUzIoKSAgICAgICBiZmluX3JlYWQzMihTUE9SVDBfTVRDUzIpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQwX01UQ1MyKHZhbCkgICBiZmluX3dyaXRlMzIoU1BPUlQwX01UQ1MyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDBfTVRDUzMoKSAgICAgICBiZmluX3JlYWQzMihTUE9SVDBfTVRDUzMpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQwX01UQ1MzKHZhbCkgICBiZmluX3dyaXRlMzIoU1BPUlQwX01UQ1MzLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDBfTVJDUzAoKSAgICAgICBiZmluX3JlYWQzMihTUE9SVDBfTVJDUzApCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQwX01SQ1MwKHZhbCkgICBiZmluX3dyaXRlMzIoU1BPUlQwX01SQ1MwLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDBfTVJDUzEoKSAgICAgICBiZmluX3JlYWQzMihTUE9SVDBfTVJDUzEpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQwX01SQ1MxKHZhbCkgICBiZmluX3dyaXRlMzIoU1BPUlQwX01SQ1MxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDBfTVJDUzIoKSAgICAgICBiZmluX3JlYWQzMihTUE9SVDBfTVJDUzIpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQwX01SQ1MyKHZhbCkgICBiZmluX3dyaXRlMzIoU1BPUlQwX01SQ1MyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDBfTVJDUzMoKSAgICAgICBiZmluX3JlYWQzMihTUE9SVDBfTVJDUzMpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQwX01SQ1MzKHZhbCkgICBiZmluX3dyaXRlMzIoU1BPUlQwX01SQ1MzLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDFfVENSMSgpICAgICAgICBiZmluX3JlYWQxNihTUE9SVDFfVENSMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDFfVENSMSh2YWwpICAgIGJmaW5fd3JpdGUxNihTUE9SVDFfVENSMSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQxX1RDUjIoKSAgICAgICAgYmZpbl9yZWFkMTYoU1BPUlQxX1RDUjIpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQxX1RDUjIodmFsKSAgICBiZmluX3dyaXRlMTYoU1BPUlQxX1RDUjIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMV9UQ0xLRElWKCkgICAgIGJmaW5fcmVhZDE2KFNQT1JUMV9UQ0xLRElWKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMV9UQ0xLRElWKHZhbCkgYmZpbl93cml0ZTE2KFNQT1JUMV9UQ0xLRElWLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDFfVEZTRElWKCkgICAgICBiZmluX3JlYWQxNihTUE9SVDFfVEZTRElWKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMV9URlNESVYodmFsKSAgYmZpbl93cml0ZTE2KFNQT1JUMV9URlNESVYsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMV9UWCgpICAgICAgICAgIGJmaW5fcmVhZDMyKFNQT1JUMV9UWCkKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDFfVFgodmFsKSAgICAgIGJmaW5fd3JpdGUzMihTUE9SVDFfVFgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMV9SWCgpICAgICAgICAgIGJmaW5fcmVhZDMyKFNQT1JUMV9SWCkKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDFfUlgodmFsKSAgICAgIGJmaW5fd3JpdGUzMihTUE9SVDFfUlgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMV9SQ1IxKCkgICAgICAgIGJmaW5fcmVhZDE2KFNQT1JUMV9SQ1IxKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMV9SQ1IxKHZhbCkgICAgYmZpbl93cml0ZTE2KFNQT1JUMV9SQ1IxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDFfUkNSMigpICAgICAgICBiZmluX3JlYWQxNihTUE9SVDFfUkNSMikKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDFfUkNSMih2YWwpICAgIGJmaW5fd3JpdGUxNihTUE9SVDFfUkNSMiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQxX1JDTEtESVYoKSAgICAgYmZpbl9yZWFkMTYoU1BPUlQxX1JDTEtESVYpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQxX1JDTEtESVYodmFsKSBiZmluX3dyaXRlMTYoU1BPUlQxX1JDTEtESVYsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMV9SRlNESVYoKSAgICAgIGJmaW5fcmVhZDE2KFNQT1JUMV9SRlNESVYpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQxX1JGU0RJVih2YWwpICBiZmluX3dyaXRlMTYoU1BPUlQxX1JGU0RJViwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQxX1NUQVQoKSAgICAgICAgYmZpbl9yZWFkMTYoU1BPUlQxX1NUQVQpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQxX1NUQVQodmFsKSAgICBiZmluX3dyaXRlMTYoU1BPUlQxX1NUQVQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMV9DSE5MKCkgICAgICAgIGJmaW5fcmVhZDE2KFNQT1JUMV9DSE5MKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMV9DSE5MKHZhbCkgICAgYmZpbl93cml0ZTE2KFNQT1JUMV9DSE5MLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDFfTUNNQzEoKSAgICAgICBiZmluX3JlYWQxNihTUE9SVDFfTUNNQzEpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQxX01DTUMxKHZhbCkgICBiZmluX3dyaXRlMTYoU1BPUlQxX01DTUMxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDFfTUNNQzIoKSAgICAgICBiZmluX3JlYWQxNihTUE9SVDFfTUNNQzIpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQxX01DTUMyKHZhbCkgICBiZmluX3dyaXRlMTYoU1BPUlQxX01DTUMyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDFfTVRDUzAoKSAgICAgICBiZmluX3JlYWQzMihTUE9SVDFfTVRDUzApCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQxX01UQ1MwKHZhbCkgICBiZmluX3dyaXRlMzIoU1BPUlQxX01UQ1MwLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDFfTVRDUzEoKSAgICAgICBiZmluX3JlYWQzMihTUE9SVDFfTVRDUzEpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQxX01UQ1MxKHZhbCkgICBiZmluX3dyaXRlMzIoU1BPUlQxX01UQ1MxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDFfTVRDUzIoKSAgICAgICBiZmluX3JlYWQzMihTUE9SVDFfTVRDUzIpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQxX01UQ1MyKHZhbCkgICBiZmluX3dyaXRlMzIoU1BPUlQxX01UQ1MyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDFfTVRDUzMoKSAgICAgICBiZmluX3JlYWQzMihTUE9SVDFfTVRDUzMpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQxX01UQ1MzKHZhbCkgICBiZmluX3dyaXRlMzIoU1BPUlQxX01UQ1MzLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDFfTVJDUzAoKSAgICAgICBiZmluX3JlYWQzMihTUE9SVDFfTVJDUzApCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQxX01SQ1MwKHZhbCkgICBiZmluX3dyaXRlMzIoU1BPUlQxX01SQ1MwLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDFfTVJDUzEoKSAgICAgICBiZmluX3JlYWQzMihTUE9SVDFfTVJDUzEpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQxX01SQ1MxKHZhbCkgICBiZmluX3dyaXRlMzIoU1BPUlQxX01SQ1MxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDFfTVJDUzIoKSAgICAgICBiZmluX3JlYWQzMihTUE9SVDFfTVJDUzIpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQxX01SQ1MyKHZhbCkgICBiZmluX3dyaXRlMzIoU1BPUlQxX01SQ1MyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDFfTVJDUzMoKSAgICAgICBiZmluX3JlYWQzMihTUE9SVDFfTVJDUzMpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQxX01SQ1MzKHZhbCkgICBiZmluX3dyaXRlMzIoU1BPUlQxX01SQ1MzLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDJfVENSMSgpICAgICAgICBiZmluX3JlYWQxNihTUE9SVDJfVENSMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDJfVENSMSh2YWwpICAgIGJmaW5fd3JpdGUxNihTUE9SVDJfVENSMSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQyX1RDUjIoKSAgICAgICAgYmZpbl9yZWFkMTYoU1BPUlQyX1RDUjIpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQyX1RDUjIodmFsKSAgICBiZmluX3dyaXRlMTYoU1BPUlQyX1RDUjIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMl9UQ0xLRElWKCkgICAgIGJmaW5fcmVhZDE2KFNQT1JUMl9UQ0xLRElWKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMl9UQ0xLRElWKHZhbCkgYmZpbl93cml0ZTE2KFNQT1JUMl9UQ0xLRElWLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDJfVEZTRElWKCkgICAgICBiZmluX3JlYWQxNihTUE9SVDJfVEZTRElWKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMl9URlNESVYodmFsKSAgYmZpbl93cml0ZTE2KFNQT1JUMl9URlNESVYsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMl9UWCgpICAgICAgICAgIGJmaW5fcmVhZDMyKFNQT1JUMl9UWCkKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDJfVFgodmFsKSAgICAgIGJmaW5fd3JpdGUzMihTUE9SVDJfVFgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMl9SWCgpICAgICAgICAgIGJmaW5fcmVhZDMyKFNQT1JUMl9SWCkKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDJfUlgodmFsKSAgICAgIGJmaW5fd3JpdGUzMihTUE9SVDJfUlgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMl9SQ1IxKCkgICAgICAgIGJmaW5fcmVhZDE2KFNQT1JUMl9SQ1IxKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMl9SQ1IxKHZhbCkgICAgYmZpbl93cml0ZTE2KFNQT1JUMl9SQ1IxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDJfUkNSMigpICAgICAgICBiZmluX3JlYWQxNihTUE9SVDJfUkNSMikKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDJfUkNSMih2YWwpICAgIGJmaW5fd3JpdGUxNihTUE9SVDJfUkNSMiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQyX1JDTEtESVYoKSAgICAgYmZpbl9yZWFkMTYoU1BPUlQyX1JDTEtESVYpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQyX1JDTEtESVYodmFsKSBiZmluX3dyaXRlMTYoU1BPUlQyX1JDTEtESVYsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMl9SRlNESVYoKSAgICAgIGJmaW5fcmVhZDE2KFNQT1JUMl9SRlNESVYpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQyX1JGU0RJVih2YWwpICBiZmluX3dyaXRlMTYoU1BPUlQyX1JGU0RJViwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQyX1NUQVQoKSAgICAgICAgYmZpbl9yZWFkMTYoU1BPUlQyX1NUQVQpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQyX1NUQVQodmFsKSAgICBiZmluX3dyaXRlMTYoU1BPUlQyX1NUQVQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMl9DSE5MKCkgICAgICAgIGJmaW5fcmVhZDE2KFNQT1JUMl9DSE5MKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMl9DSE5MKHZhbCkgICAgYmZpbl93cml0ZTE2KFNQT1JUMl9DSE5MLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDJfTUNNQzEoKSAgICAgICBiZmluX3JlYWQxNihTUE9SVDJfTUNNQzEpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQyX01DTUMxKHZhbCkgICBiZmluX3dyaXRlMTYoU1BPUlQyX01DTUMxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDJfTUNNQzIoKSAgICAgICBiZmluX3JlYWQxNihTUE9SVDJfTUNNQzIpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQyX01DTUMyKHZhbCkgICBiZmluX3dyaXRlMTYoU1BPUlQyX01DTUMyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDJfTVRDUzAoKSAgICAgICBiZmluX3JlYWQzMihTUE9SVDJfTVRDUzApCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQyX01UQ1MwKHZhbCkgICBiZmluX3dyaXRlMzIoU1BPUlQyX01UQ1MwLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDJfTVRDUzEoKSAgICAgICBiZmluX3JlYWQzMihTUE9SVDJfTVRDUzEpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQyX01UQ1MxKHZhbCkgICBiZmluX3dyaXRlMzIoU1BPUlQyX01UQ1MxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDJfTVRDUzIoKSAgICAgICBiZmluX3JlYWQzMihTUE9SVDJfTVRDUzIpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQyX01UQ1MyKHZhbCkgICBiZmluX3dyaXRlMzIoU1BPUlQyX01UQ1MyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDJfTVRDUzMoKSAgICAgICBiZmluX3JlYWQzMihTUE9SVDJfTVRDUzMpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQyX01UQ1MzKHZhbCkgICBiZmluX3dyaXRlMzIoU1BPUlQyX01UQ1MzLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDJfTVJDUzAoKSAgICAgICBiZmluX3JlYWQzMihTUE9SVDJfTVJDUzApCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQyX01SQ1MwKHZhbCkgICBiZmluX3dyaXRlMzIoU1BPUlQyX01SQ1MwLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDJfTVJDUzEoKSAgICAgICBiZmluX3JlYWQzMihTUE9SVDJfTVJDUzEpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQyX01SQ1MxKHZhbCkgICBiZmluX3dyaXRlMzIoU1BPUlQyX01SQ1MxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDJfTVJDUzIoKSAgICAgICBiZmluX3JlYWQzMihTUE9SVDJfTVJDUzIpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQyX01SQ1MyKHZhbCkgICBiZmluX3dyaXRlMzIoU1BPUlQyX01SQ1MyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDJfTVJDUzMoKSAgICAgICBiZmluX3JlYWQzMihTUE9SVDJfTVJDUzMpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQyX01SQ1MzKHZhbCkgICBiZmluX3dyaXRlMzIoU1BPUlQyX01SQ1MzLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDNfVENSMSgpICAgICAgICBiZmluX3JlYWQxNihTUE9SVDNfVENSMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDNfVENSMSh2YWwpICAgIGJmaW5fd3JpdGUxNihTUE9SVDNfVENSMSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQzX1RDUjIoKSAgICAgICAgYmZpbl9yZWFkMTYoU1BPUlQzX1RDUjIpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQzX1RDUjIodmFsKSAgICBiZmluX3dyaXRlMTYoU1BPUlQzX1RDUjIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUM19UQ0xLRElWKCkgICAgIGJmaW5fcmVhZDE2KFNQT1JUM19UQ0xLRElWKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUM19UQ0xLRElWKHZhbCkgYmZpbl93cml0ZTE2KFNQT1JUM19UQ0xLRElWLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDNfVEZTRElWKCkgICAgICBiZmluX3JlYWQxNihTUE9SVDNfVEZTRElWKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUM19URlNESVYodmFsKSAgYmZpbl93cml0ZTE2KFNQT1JUM19URlNESVYsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUM19UWCgpICAgICAgICAgIGJmaW5fcmVhZDMyKFNQT1JUM19UWCkKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDNfVFgodmFsKSAgICAgIGJmaW5fd3JpdGUzMihTUE9SVDNfVFgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUM19SWCgpICAgICAgICAgIGJmaW5fcmVhZDMyKFNQT1JUM19SWCkKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDNfUlgodmFsKSAgICAgIGJmaW5fd3JpdGUzMihTUE9SVDNfUlgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUM19SQ1IxKCkgICAgICAgIGJmaW5fcmVhZDE2KFNQT1JUM19SQ1IxKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUM19SQ1IxKHZhbCkgICAgYmZpbl93cml0ZTE2KFNQT1JUM19SQ1IxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDNfUkNSMigpICAgICAgICBiZmluX3JlYWQxNihTUE9SVDNfUkNSMikKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDNfUkNSMih2YWwpICAgIGJmaW5fd3JpdGUxNihTUE9SVDNfUkNSMiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQzX1JDTEtESVYoKSAgICAgYmZpbl9yZWFkMTYoU1BPUlQzX1JDTEtESVYpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQzX1JDTEtESVYodmFsKSBiZmluX3dyaXRlMTYoU1BPUlQzX1JDTEtESVYsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUM19SRlNESVYoKSAgICAgIGJmaW5fcmVhZDE2KFNQT1JUM19SRlNESVYpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQzX1JGU0RJVih2YWwpICBiZmluX3dyaXRlMTYoU1BPUlQzX1JGU0RJViwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQzX1NUQVQoKSAgICAgICAgYmZpbl9yZWFkMTYoU1BPUlQzX1NUQVQpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQzX1NUQVQodmFsKSAgICBiZmluX3dyaXRlMTYoU1BPUlQzX1NUQVQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUM19DSE5MKCkgICAgICAgIGJmaW5fcmVhZDE2KFNQT1JUM19DSE5MKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUM19DSE5MKHZhbCkgICAgYmZpbl93cml0ZTE2KFNQT1JUM19DSE5MLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDNfTUNNQzEoKSAgICAgICBiZmluX3JlYWQxNihTUE9SVDNfTUNNQzEpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQzX01DTUMxKHZhbCkgICBiZmluX3dyaXRlMTYoU1BPUlQzX01DTUMxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDNfTUNNQzIoKSAgICAgICBiZmluX3JlYWQxNihTUE9SVDNfTUNNQzIpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQzX01DTUMyKHZhbCkgICBiZmluX3dyaXRlMTYoU1BPUlQzX01DTUMyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDNfTVRDUzAoKSAgICAgICBiZmluX3JlYWQzMihTUE9SVDNfTVRDUzApCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQzX01UQ1MwKHZhbCkgICBiZmluX3dyaXRlMzIoU1BPUlQzX01UQ1MwLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDNfTVRDUzEoKSAgICAgICBiZmluX3JlYWQzMihTUE9SVDNfTVRDUzEpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQzX01UQ1MxKHZhbCkgICBiZmluX3dyaXRlMzIoU1BPUlQzX01UQ1MxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDNfTVRDUzIoKSAgICAgICBiZmluX3JlYWQzMihTUE9SVDNfTVRDUzIpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQzX01UQ1MyKHZhbCkgICBiZmluX3dyaXRlMzIoU1BPUlQzX01UQ1MyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDNfTVRDUzMoKSAgICAgICBiZmluX3JlYWQzMihTUE9SVDNfTVRDUzMpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQzX01UQ1MzKHZhbCkgICBiZmluX3dyaXRlMzIoU1BPUlQzX01UQ1MzLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDNfTVJDUzAoKSAgICAgICBiZmluX3JlYWQzMihTUE9SVDNfTVJDUzApCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQzX01SQ1MwKHZhbCkgICBiZmluX3dyaXRlMzIoU1BPUlQzX01SQ1MwLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDNfTVJDUzEoKSAgICAgICBiZmluX3JlYWQzMihTUE9SVDNfTVJDUzEpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQzX01SQ1MxKHZhbCkgICBiZmluX3dyaXRlMzIoU1BPUlQzX01SQ1MxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDNfTVJDUzIoKSAgICAgICBiZmluX3JlYWQzMihTUE9SVDNfTVJDUzIpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQzX01SQ1MyKHZhbCkgICBiZmluX3dyaXRlMzIoU1BPUlQzX01SQ1MyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDNfTVJDUzMoKSAgICAgICBiZmluX3JlYWQzMihTUE9SVDNfTVJDUzMpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQzX01SQ1MzKHZhbCkgICBiZmluX3dyaXRlMzIoU1BPUlQzX01SQ1MzLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JURklPKCkgICAgICAgICAgICBiZmluX3JlYWQxNihQT1JURklPKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRGSU8odmFsKSAgICAgICAgYmZpbl93cml0ZTE2KFBPUlRGSU8sIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRGSU9fQ0xFQVIoKSAgICAgIGJmaW5fcmVhZDE2KFBPUlRGSU9fQ0xFQVIpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEZJT19DTEVBUih2YWwpICBiZmluX3dyaXRlMTYoUE9SVEZJT19DTEVBUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEZJT19TRVQoKSAgICAgICAgYmZpbl9yZWFkMTYoUE9SVEZJT19TRVQpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEZJT19TRVQodmFsKSAgICBiZmluX3dyaXRlMTYoUE9SVEZJT19TRVQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRGSU9fVE9HR0xFKCkgICAgIGJmaW5fcmVhZDE2KFBPUlRGSU9fVE9HR0xFKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRGSU9fVE9HR0xFKHZhbCkgYmZpbl93cml0ZTE2KFBPUlRGSU9fVE9HR0xFLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JURklPX01BU0tBKCkgICAgICBiZmluX3JlYWQxNihQT1JURklPX01BU0tBKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRGSU9fTUFTS0EodmFsKSAgYmZpbl93cml0ZTE2KFBPUlRGSU9fTUFTS0EsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRGSU9fTUFTS0FfQ0xFQVIoKSBiZmluX3JlYWQxNihQT1JURklPX01BU0tBX0NMRUFSKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRGSU9fTUFTS0FfQ0xFQVIodmFsKSBiZmluX3dyaXRlMTYoUE9SVEZJT19NQVNLQV9DTEVBUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEZJT19NQVNLQV9TRVQoKSAgYmZpbl9yZWFkMTYoUE9SVEZJT19NQVNLQV9TRVQpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEZJT19NQVNLQV9TRVQodmFsKSBiZmluX3dyaXRlMTYoUE9SVEZJT19NQVNLQV9TRVQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRGSU9fTUFTS0FfVE9HR0xFKCkgYmZpbl9yZWFkMTYoUE9SVEZJT19NQVNLQV9UT0dHTEUpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEZJT19NQVNLQV9UT0dHTEUodmFsKSBiZmluX3dyaXRlMTYoUE9SVEZJT19NQVNLQV9UT0dHTEUsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRGSU9fTUFTS0IoKSAgICAgIGJmaW5fcmVhZDE2KFBPUlRGSU9fTUFTS0IpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEZJT19NQVNLQih2YWwpICBiZmluX3dyaXRlMTYoUE9SVEZJT19NQVNLQiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEZJT19NQVNLQl9DTEVBUigpIGJmaW5fcmVhZDE2KFBPUlRGSU9fTUFTS0JfQ0xFQVIpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEZJT19NQVNLQl9DTEVBUih2YWwpIGJmaW5fd3JpdGUxNihQT1JURklPX01BU0tCX0NMRUFSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JURklPX01BU0tCX1NFVCgpICBiZmluX3JlYWQxNihQT1JURklPX01BU0tCX1NFVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JURklPX01BU0tCX1NFVCh2YWwpIGJmaW5fd3JpdGUxNihQT1JURklPX01BU0tCX1NFVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEZJT19NQVNLQl9UT0dHTEUoKSBiZmluX3JlYWQxNihQT1JURklPX01BU0tCX1RPR0dMRSkKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JURklPX01BU0tCX1RPR0dMRSh2YWwpIGJmaW5fd3JpdGUxNihQT1JURklPX01BU0tCX1RPR0dMRSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEZJT19ESVIoKSAgICAgICAgYmZpbl9yZWFkMTYoUE9SVEZJT19ESVIpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEZJT19ESVIodmFsKSAgICBiZmluX3dyaXRlMTYoUE9SVEZJT19ESVIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRGSU9fUE9MQVIoKSAgICAgIGJmaW5fcmVhZDE2KFBPUlRGSU9fUE9MQVIpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEZJT19QT0xBUih2YWwpICBiZmluX3dyaXRlMTYoUE9SVEZJT19QT0xBUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEZJT19FREdFKCkgICAgICAgYmZpbl9yZWFkMTYoUE9SVEZJT19FREdFKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRGSU9fRURHRSh2YWwpICAgYmZpbl93cml0ZTE2KFBPUlRGSU9fRURHRSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEZJT19CT1RIKCkgICAgICAgYmZpbl9yZWFkMTYoUE9SVEZJT19CT1RIKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRGSU9fQk9USCh2YWwpICAgYmZpbl93cml0ZTE2KFBPUlRGSU9fQk9USCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEZJT19JTkVOKCkgICAgICAgYmZpbl9yZWFkMTYoUE9SVEZJT19JTkVOKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRGSU9fSU5FTih2YWwpICAgYmZpbl93cml0ZTE2KFBPUlRGSU9fSU5FTiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVENJT19GRVIoKSAgICAgICAgYmZpbl9yZWFkMTYoUE9SVENJT19GRVIpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVENJT19GRVIodmFsKSAgICBiZmluX3dyaXRlMTYoUE9SVENJT19GRVIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRDSU8oKSAgICAgICAgICAgIGJmaW5fcmVhZDE2KFBPUlRDSU8pCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVENJTyh2YWwpICAgICAgICBiZmluX3dyaXRlMTYoUE9SVENJTywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVENJT19DTEVBUigpICAgICAgYmZpbl9yZWFkMTYoUE9SVENJT19DTEVBUikKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JUQ0lPX0NMRUFSKHZhbCkgIGJmaW5fd3JpdGUxNihQT1JUQ0lPX0NMRUFSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JUQ0lPX1NFVCgpICAgICAgICBiZmluX3JlYWQxNihQT1JUQ0lPX1NFVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JUQ0lPX1NFVCh2YWwpICAgIGJmaW5fd3JpdGUxNihQT1JUQ0lPX1NFVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVENJT19UT0dHTEUoKSAgICAgYmZpbl9yZWFkMTYoUE9SVENJT19UT0dHTEUpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVENJT19UT0dHTEUodmFsKSBiZmluX3dyaXRlMTYoUE9SVENJT19UT0dHTEUsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRDSU9fRElSKCkgICAgICAgIGJmaW5fcmVhZDE2KFBPUlRDSU9fRElSKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRDSU9fRElSKHZhbCkgICAgYmZpbl93cml0ZTE2KFBPUlRDSU9fRElSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JUQ0lPX0lORU4oKSAgICAgICBiZmluX3JlYWQxNihQT1JUQ0lPX0lORU4pCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVENJT19JTkVOKHZhbCkgICBiZmluX3dyaXRlMTYoUE9SVENJT19JTkVOLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JURElPX0ZFUigpICAgICAgICBiZmluX3JlYWQxNihQT1JURElPX0ZFUikKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JURElPX0ZFUih2YWwpICAgIGJmaW5fd3JpdGUxNihQT1JURElPX0ZFUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVERJTygpICAgICAgICAgICAgYmZpbl9yZWFkMTYoUE9SVERJTykKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JURElPKHZhbCkgICAgICAgIGJmaW5fd3JpdGUxNihQT1JURElPLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JURElPX0NMRUFSKCkgICAgICBiZmluX3JlYWQxNihQT1JURElPX0NMRUFSKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRESU9fQ0xFQVIodmFsKSAgYmZpbl93cml0ZTE2KFBPUlRESU9fQ0xFQVIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRESU9fU0VUKCkgICAgICAgIGJmaW5fcmVhZDE2KFBPUlRESU9fU0VUKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRESU9fU0VUKHZhbCkgICAgYmZpbl93cml0ZTE2KFBPUlRESU9fU0VULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JURElPX1RPR0dMRSgpICAgICBiZmluX3JlYWQxNihQT1JURElPX1RPR0dMRSkKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JURElPX1RPR0dMRSh2YWwpIGJmaW5fd3JpdGUxNihQT1JURElPX1RPR0dMRSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVERJT19ESVIoKSAgICAgICAgYmZpbl9yZWFkMTYoUE9SVERJT19ESVIpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVERJT19ESVIodmFsKSAgICBiZmluX3dyaXRlMTYoUE9SVERJT19ESVIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRESU9fSU5FTigpICAgICAgIGJmaW5fcmVhZDE2KFBPUlRESU9fSU5FTikKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JURElPX0lORU4odmFsKSAgIGJmaW5fd3JpdGUxNihQT1JURElPX0lORU4sIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRFSU9fRkVSKCkgICAgICAgIGJmaW5fcmVhZDE2KFBPUlRFSU9fRkVSKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRFSU9fRkVSKHZhbCkgICAgYmZpbl93cml0ZTE2KFBPUlRFSU9fRkVSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JURUlPKCkgICAgICAgICAgICBiZmluX3JlYWQxNihQT1JURUlPKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRFSU8odmFsKSAgICAgICAgYmZpbl93cml0ZTE2KFBPUlRFSU8sIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRFSU9fQ0xFQVIoKSAgICAgIGJmaW5fcmVhZDE2KFBPUlRFSU9fQ0xFQVIpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEVJT19DTEVBUih2YWwpICBiZmluX3dyaXRlMTYoUE9SVEVJT19DTEVBUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEVJT19TRVQoKSAgICAgICAgYmZpbl9yZWFkMTYoUE9SVEVJT19TRVQpCisjZGVmaW5lIGJmaW5fd3JpdGVfUE9SVEVJT19TRVQodmFsKSAgICBiZmluX3dyaXRlMTYoUE9SVEVJT19TRVQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BPUlRFSU9fVE9HR0xFKCkgICAgIGJmaW5fcmVhZDE2KFBPUlRFSU9fVE9HR0xFKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRFSU9fVE9HR0xFKHZhbCkgYmZpbl93cml0ZTE2KFBPUlRFSU9fVE9HR0xFLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QT1JURUlPX0RJUigpICAgICAgICBiZmluX3JlYWQxNihQT1JURUlPX0RJUikKKyNkZWZpbmUgYmZpbl93cml0ZV9QT1JURUlPX0RJUih2YWwpICAgIGJmaW5fd3JpdGUxNihQT1JURUlPX0RJUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUE9SVEVJT19JTkVOKCkgICAgICAgYmZpbl9yZWFkMTYoUE9SVEVJT19JTkVOKQorI2RlZmluZSBiZmluX3dyaXRlX1BPUlRFSU9fSU5FTih2YWwpICAgYmZpbl93cml0ZTE2KFBPUlRFSU9fSU5FTiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRUJJVV9BTUdDVEwoKSAgICAgICAgYmZpbl9yZWFkMTYoRUJJVV9BTUdDVEwpCisjZGVmaW5lIGJmaW5fd3JpdGVfRUJJVV9BTUdDVEwodmFsKSAgICBiZmluX3dyaXRlMTYoRUJJVV9BTUdDVEwsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VCSVVfQU1CQ1RMMCgpICAgICAgIGJmaW5fcmVhZDMyKEVCSVVfQU1CQ1RMMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9FQklVX0FNQkNUTDAodmFsKSAgIGJmaW5fd3JpdGUzMihFQklVX0FNQkNUTDAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VCSVVfQU1CQ1RMMSgpICAgICAgIGJmaW5fcmVhZDMyKEVCSVVfQU1CQ1RMMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9FQklVX0FNQkNUTDEodmFsKSAgIGJmaW5fd3JpdGUzMihFQklVX0FNQkNUTDEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VCSVVfU0RHQ1RMKCkgICAgICAgIGJmaW5fcmVhZDMyKEVCSVVfU0RHQ1RMKQorI2RlZmluZSBiZmluX3dyaXRlX0VCSVVfU0RHQ1RMKHZhbCkgICAgYmZpbl93cml0ZTMyKEVCSVVfU0RHQ1RMLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FQklVX1NEQkNUTCgpICAgICAgICBiZmluX3JlYWQxNihFQklVX1NEQkNUTCkKKyNkZWZpbmUgYmZpbl93cml0ZV9FQklVX1NEQkNUTCh2YWwpICAgIGJmaW5fd3JpdGUxNihFQklVX1NEQkNUTCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRUJJVV9TRFJSQygpICAgICAgICAgYmZpbl9yZWFkMTYoRUJJVV9TRFJSQykKKyNkZWZpbmUgYmZpbl93cml0ZV9FQklVX1NEUlJDKHZhbCkgICAgIGJmaW5fd3JpdGUxNihFQklVX1NEUlJDLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FQklVX1NEU1RBVCgpICAgICAgICBiZmluX3JlYWQxNihFQklVX1NEU1RBVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9FQklVX1NEU1RBVCh2YWwpICAgIGJmaW5fd3JpdGUxNihFQklVX1NEU1RBVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMF9UQ19QRVIoKSAgICAgICAgYmZpbl9yZWFkMTYoRE1BMF9UQ19QRVIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMF9UQ19QRVIodmFsKSAgICBiZmluX3dyaXRlMTYoRE1BMF9UQ19QRVIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTBfVENfQ05UKCkgICAgICAgIGJmaW5fcmVhZDE2KERNQTBfVENfQ05UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTBfVENfQ05UKHZhbCkgICAgYmZpbl93cml0ZTE2KERNQTBfVENfQ05ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUEwX05FWFRfREVTQ19QVFIoKSBiZmluX3JlYWRQVFIoRE1BMF9ORVhUX0RFU0NfUFRSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTBfTkVYVF9ERVNDX1BUUih2YWwpIGJmaW5fd3JpdGVQVFIoRE1BMF9ORVhUX0RFU0NfUFRSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUEwX1NUQVJUX0FERFIoKSAgICBiZmluX3JlYWRQVFIoRE1BMF9TVEFSVF9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTBfU1RBUlRfQUREUih2YWwpIGJmaW5fd3JpdGVQVFIoRE1BMF9TVEFSVF9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUEwX0NPTkZJRygpICAgICAgICBiZmluX3JlYWQxNihETUEwX0NPTkZJRykKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUEwX0NPTkZJRyh2YWwpICAgIGJmaW5fd3JpdGUxNihETUEwX0NPTkZJRywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMF9YX0NPVU5UKCkgICAgICAgYmZpbl9yZWFkMTYoRE1BMF9YX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTBfWF9DT1VOVCh2YWwpICAgYmZpbl93cml0ZTE2KERNQTBfWF9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMF9YX01PRElGWSgpICAgICAgYmZpbl9yZWFkMTYoRE1BMF9YX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUEwX1hfTU9ESUZZKHZhbCkgIGJmaW5fd3JpdGUxNihETUEwX1hfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUEwX1lfQ09VTlQoKSAgICAgICBiZmluX3JlYWQxNihETUEwX1lfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMF9ZX0NPVU5UKHZhbCkgICBiZmluX3dyaXRlMTYoRE1BMF9ZX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUEwX1lfTU9ESUZZKCkgICAgICBiZmluX3JlYWQxNihETUEwX1lfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTBfWV9NT0RJRlkodmFsKSAgYmZpbl93cml0ZTE2KERNQTBfWV9NT0RJRlksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTBfQ1VSUl9ERVNDX1BUUigpIGJmaW5fcmVhZFBUUihETUEwX0NVUlJfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMF9DVVJSX0RFU0NfUFRSKHZhbCkgYmZpbl93cml0ZVBUUihETUEwX0NVUlJfREVTQ19QVFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTBfQ1VSUl9BRERSKCkgICAgIGJmaW5fcmVhZFBUUihETUEwX0NVUlJfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUEwX0NVUlJfQUREUih2YWwpIGJmaW5fd3JpdGVQVFIoRE1BMF9DVVJSX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTBfSVJRX1NUQVRVUygpICAgIGJmaW5fcmVhZDE2KERNQTBfSVJRX1NUQVRVUykKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUEwX0lSUV9TVEFUVVModmFsKSBiZmluX3dyaXRlMTYoRE1BMF9JUlFfU1RBVFVTLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUEwX1BFUklQSEVSQUxfTUFQKCkgYmZpbl9yZWFkMTYoRE1BMF9QRVJJUEhFUkFMX01BUCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUEwX1BFUklQSEVSQUxfTUFQKHZhbCkgYmZpbl93cml0ZTE2KERNQTBfUEVSSVBIRVJBTF9NQVAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTBfQ1VSUl9YX0NPVU5UKCkgIGJmaW5fcmVhZDE2KERNQTBfQ1VSUl9YX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTBfQ1VSUl9YX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KERNQTBfQ1VSUl9YX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUEwX0NVUlJfWV9DT1VOVCgpICBiZmluX3JlYWQxNihETUEwX0NVUlJfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUEwX0NVUlJfWV9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihETUEwX0NVUlJfWV9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMV9ORVhUX0RFU0NfUFRSKCkgYmZpbl9yZWFkUFRSKERNQTFfTkVYVF9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExX05FWFRfREVTQ19QVFIodmFsKSBiZmluX3dyaXRlUFRSKERNQTFfTkVYVF9ERVNDX1BUUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMV9TVEFSVF9BRERSKCkgICAgYmZpbl9yZWFkUFRSKERNQTFfU1RBUlRfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExX1NUQVJUX0FERFIodmFsKSBiZmluX3dyaXRlUFRSKERNQTFfU1RBUlRfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMV9DT05GSUcoKSAgICAgICAgYmZpbl9yZWFkMTYoRE1BMV9DT05GSUcpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMV9DT05GSUcodmFsKSAgICBiZmluX3dyaXRlMTYoRE1BMV9DT05GSUcsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTFfWF9DT1VOVCgpICAgICAgIGJmaW5fcmVhZDE2KERNQTFfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExX1hfQ09VTlQodmFsKSAgIGJmaW5fd3JpdGUxNihETUExX1hfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTFfWF9NT0RJRlkoKSAgICAgIGJmaW5fcmVhZDE2KERNQTFfWF9NT0RJRlkpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMV9YX01PRElGWSh2YWwpICBiZmluX3dyaXRlMTYoRE1BMV9YX01PRElGWSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMV9ZX0NPVU5UKCkgICAgICAgYmZpbl9yZWFkMTYoRE1BMV9ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTFfWV9DT1VOVCh2YWwpICAgYmZpbl93cml0ZTE2KERNQTFfWV9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMV9ZX01PRElGWSgpICAgICAgYmZpbl9yZWFkMTYoRE1BMV9ZX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExX1lfTU9ESUZZKHZhbCkgIGJmaW5fd3JpdGUxNihETUExX1lfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExX0NVUlJfREVTQ19QVFIoKSBiZmluX3JlYWRQVFIoRE1BMV9DVVJSX0RFU0NfUFRSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTFfQ1VSUl9ERVNDX1BUUih2YWwpIGJmaW5fd3JpdGVQVFIoRE1BMV9DVVJSX0RFU0NfUFRSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExX0NVUlJfQUREUigpICAgICBiZmluX3JlYWRQVFIoRE1BMV9DVVJSX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMV9DVVJSX0FERFIodmFsKSBiZmluX3dyaXRlUFRSKERNQTFfQ1VSUl9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExX0lSUV9TVEFUVVMoKSAgICBiZmluX3JlYWQxNihETUExX0lSUV9TVEFUVVMpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMV9JUlFfU1RBVFVTKHZhbCkgYmZpbl93cml0ZTE2KERNQTFfSVJRX1NUQVRVUywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMV9QRVJJUEhFUkFMX01BUCgpIGJmaW5fcmVhZDE2KERNQTFfUEVSSVBIRVJBTF9NQVApCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMV9QRVJJUEhFUkFMX01BUCh2YWwpIGJmaW5fd3JpdGUxNihETUExX1BFUklQSEVSQUxfTUFQLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExX0NVUlJfWF9DT1VOVCgpICBiZmluX3JlYWQxNihETUExX0NVUlJfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExX0NVUlJfWF9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihETUExX0NVUlJfWF9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMV9DVVJSX1lfQ09VTlQoKSAgYmZpbl9yZWFkMTYoRE1BMV9DVVJSX1lfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMV9DVVJSX1lfQ09VTlQodmFsKSBiZmluX3dyaXRlMTYoRE1BMV9DVVJSX1lfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTJfTkVYVF9ERVNDX1BUUigpIGJmaW5fcmVhZFBUUihETUEyX05FWFRfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMl9ORVhUX0RFU0NfUFRSKHZhbCkgYmZpbl93cml0ZVBUUihETUEyX05FWFRfREVTQ19QVFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTJfU1RBUlRfQUREUigpICAgIGJmaW5fcmVhZFBUUihETUEyX1NUQVJUX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMl9TVEFSVF9BRERSKHZhbCkgYmZpbl93cml0ZVBUUihETUEyX1NUQVJUX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTJfQ09ORklHKCkgICAgICAgIGJmaW5fcmVhZDE2KERNQTJfQ09ORklHKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTJfQ09ORklHKHZhbCkgICAgYmZpbl93cml0ZTE2KERNQTJfQ09ORklHLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUEyX1hfQ09VTlQoKSAgICAgICBiZmluX3JlYWQxNihETUEyX1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMl9YX0NPVU5UKHZhbCkgICBiZmluX3dyaXRlMTYoRE1BMl9YX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUEyX1hfTU9ESUZZKCkgICAgICBiZmluX3JlYWQxNihETUEyX1hfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTJfWF9NT0RJRlkodmFsKSAgYmZpbl93cml0ZTE2KERNQTJfWF9NT0RJRlksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTJfWV9DT1VOVCgpICAgICAgIGJmaW5fcmVhZDE2KERNQTJfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUEyX1lfQ09VTlQodmFsKSAgIGJmaW5fd3JpdGUxNihETUEyX1lfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTJfWV9NT0RJRlkoKSAgICAgIGJmaW5fcmVhZDE2KERNQTJfWV9NT0RJRlkpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMl9ZX01PRElGWSh2YWwpICBiZmluX3dyaXRlMTYoRE1BMl9ZX01PRElGWSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMl9DVVJSX0RFU0NfUFRSKCkgYmZpbl9yZWFkUFRSKERNQTJfQ1VSUl9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUEyX0NVUlJfREVTQ19QVFIodmFsKSBiZmluX3dyaXRlUFRSKERNQTJfQ1VSUl9ERVNDX1BUUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMl9DVVJSX0FERFIoKSAgICAgYmZpbl9yZWFkUFRSKERNQTJfQ1VSUl9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTJfQ1VSUl9BRERSKHZhbCkgYmZpbl93cml0ZVBUUihETUEyX0NVUlJfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMl9JUlFfU1RBVFVTKCkgICAgYmZpbl9yZWFkMTYoRE1BMl9JUlFfU1RBVFVTKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTJfSVJRX1NUQVRVUyh2YWwpIGJmaW5fd3JpdGUxNihETUEyX0lSUV9TVEFUVVMsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTJfUEVSSVBIRVJBTF9NQVAoKSBiZmluX3JlYWQxNihETUEyX1BFUklQSEVSQUxfTUFQKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTJfUEVSSVBIRVJBTF9NQVAodmFsKSBiZmluX3dyaXRlMTYoRE1BMl9QRVJJUEhFUkFMX01BUCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMl9DVVJSX1hfQ09VTlQoKSAgYmZpbl9yZWFkMTYoRE1BMl9DVVJSX1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMl9DVVJSX1hfQ09VTlQodmFsKSBiZmluX3dyaXRlMTYoRE1BMl9DVVJSX1hfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTJfQ1VSUl9ZX0NPVU5UKCkgIGJmaW5fcmVhZDE2KERNQTJfQ1VSUl9ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTJfQ1VSUl9ZX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KERNQTJfQ1VSUl9ZX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUEzX05FWFRfREVTQ19QVFIoKSBiZmluX3JlYWRQVFIoRE1BM19ORVhUX0RFU0NfUFRSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTNfTkVYVF9ERVNDX1BUUih2YWwpIGJmaW5fd3JpdGVQVFIoRE1BM19ORVhUX0RFU0NfUFRSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUEzX1NUQVJUX0FERFIoKSAgICBiZmluX3JlYWRQVFIoRE1BM19TVEFSVF9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTNfU1RBUlRfQUREUih2YWwpIGJmaW5fd3JpdGVQVFIoRE1BM19TVEFSVF9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUEzX0NPTkZJRygpICAgICAgICBiZmluX3JlYWQxNihETUEzX0NPTkZJRykKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUEzX0NPTkZJRyh2YWwpICAgIGJmaW5fd3JpdGUxNihETUEzX0NPTkZJRywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BM19YX0NPVU5UKCkgICAgICAgYmZpbl9yZWFkMTYoRE1BM19YX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTNfWF9DT1VOVCh2YWwpICAgYmZpbl93cml0ZTE2KERNQTNfWF9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BM19YX01PRElGWSgpICAgICAgYmZpbl9yZWFkMTYoRE1BM19YX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUEzX1hfTU9ESUZZKHZhbCkgIGJmaW5fd3JpdGUxNihETUEzX1hfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUEzX1lfQ09VTlQoKSAgICAgICBiZmluX3JlYWQxNihETUEzX1lfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BM19ZX0NPVU5UKHZhbCkgICBiZmluX3dyaXRlMTYoRE1BM19ZX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUEzX1lfTU9ESUZZKCkgICAgICBiZmluX3JlYWQxNihETUEzX1lfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTNfWV9NT0RJRlkodmFsKSAgYmZpbl93cml0ZTE2KERNQTNfWV9NT0RJRlksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTNfQ1VSUl9ERVNDX1BUUigpIGJmaW5fcmVhZFBUUihETUEzX0NVUlJfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BM19DVVJSX0RFU0NfUFRSKHZhbCkgYmZpbl93cml0ZVBUUihETUEzX0NVUlJfREVTQ19QVFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTNfQ1VSUl9BRERSKCkgICAgIGJmaW5fcmVhZFBUUihETUEzX0NVUlJfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUEzX0NVUlJfQUREUih2YWwpIGJmaW5fd3JpdGVQVFIoRE1BM19DVVJSX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTNfSVJRX1NUQVRVUygpICAgIGJmaW5fcmVhZDE2KERNQTNfSVJRX1NUQVRVUykKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUEzX0lSUV9TVEFUVVModmFsKSBiZmluX3dyaXRlMTYoRE1BM19JUlFfU1RBVFVTLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUEzX1BFUklQSEVSQUxfTUFQKCkgYmZpbl9yZWFkMTYoRE1BM19QRVJJUEhFUkFMX01BUCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUEzX1BFUklQSEVSQUxfTUFQKHZhbCkgYmZpbl93cml0ZTE2KERNQTNfUEVSSVBIRVJBTF9NQVAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTNfQ1VSUl9YX0NPVU5UKCkgIGJmaW5fcmVhZDE2KERNQTNfQ1VSUl9YX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTNfQ1VSUl9YX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KERNQTNfQ1VSUl9YX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUEzX0NVUlJfWV9DT1VOVCgpICBiZmluX3JlYWQxNihETUEzX0NVUlJfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUEzX0NVUlJfWV9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihETUEzX0NVUlJfWV9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BNF9ORVhUX0RFU0NfUFRSKCkgYmZpbl9yZWFkUFRSKERNQTRfTkVYVF9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE0X05FWFRfREVTQ19QVFIodmFsKSBiZmluX3dyaXRlUFRSKERNQTRfTkVYVF9ERVNDX1BUUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BNF9TVEFSVF9BRERSKCkgICAgYmZpbl9yZWFkUFRSKERNQTRfU1RBUlRfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE0X1NUQVJUX0FERFIodmFsKSBiZmluX3dyaXRlUFRSKERNQTRfU1RBUlRfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BNF9DT05GSUcoKSAgICAgICAgYmZpbl9yZWFkMTYoRE1BNF9DT05GSUcpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BNF9DT05GSUcodmFsKSAgICBiZmluX3dyaXRlMTYoRE1BNF9DT05GSUcsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTRfWF9DT1VOVCgpICAgICAgIGJmaW5fcmVhZDE2KERNQTRfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE0X1hfQ09VTlQodmFsKSAgIGJmaW5fd3JpdGUxNihETUE0X1hfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTRfWF9NT0RJRlkoKSAgICAgIGJmaW5fcmVhZDE2KERNQTRfWF9NT0RJRlkpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BNF9YX01PRElGWSh2YWwpICBiZmluX3dyaXRlMTYoRE1BNF9YX01PRElGWSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BNF9ZX0NPVU5UKCkgICAgICAgYmZpbl9yZWFkMTYoRE1BNF9ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTRfWV9DT1VOVCh2YWwpICAgYmZpbl93cml0ZTE2KERNQTRfWV9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BNF9ZX01PRElGWSgpICAgICAgYmZpbl9yZWFkMTYoRE1BNF9ZX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE0X1lfTU9ESUZZKHZhbCkgIGJmaW5fd3JpdGUxNihETUE0X1lfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE0X0NVUlJfREVTQ19QVFIoKSBiZmluX3JlYWRQVFIoRE1BNF9DVVJSX0RFU0NfUFRSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTRfQ1VSUl9ERVNDX1BUUih2YWwpIGJmaW5fd3JpdGVQVFIoRE1BNF9DVVJSX0RFU0NfUFRSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE0X0NVUlJfQUREUigpICAgICBiZmluX3JlYWRQVFIoRE1BNF9DVVJSX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BNF9DVVJSX0FERFIodmFsKSBiZmluX3dyaXRlUFRSKERNQTRfQ1VSUl9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE0X0lSUV9TVEFUVVMoKSAgICBiZmluX3JlYWQxNihETUE0X0lSUV9TVEFUVVMpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BNF9JUlFfU1RBVFVTKHZhbCkgYmZpbl93cml0ZTE2KERNQTRfSVJRX1NUQVRVUywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BNF9QRVJJUEhFUkFMX01BUCgpIGJmaW5fcmVhZDE2KERNQTRfUEVSSVBIRVJBTF9NQVApCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BNF9QRVJJUEhFUkFMX01BUCh2YWwpIGJmaW5fd3JpdGUxNihETUE0X1BFUklQSEVSQUxfTUFQLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE0X0NVUlJfWF9DT1VOVCgpICBiZmluX3JlYWQxNihETUE0X0NVUlJfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE0X0NVUlJfWF9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihETUE0X0NVUlJfWF9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BNF9DVVJSX1lfQ09VTlQoKSAgYmZpbl9yZWFkMTYoRE1BNF9DVVJSX1lfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BNF9DVVJSX1lfQ09VTlQodmFsKSBiZmluX3dyaXRlMTYoRE1BNF9DVVJSX1lfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTVfTkVYVF9ERVNDX1BUUigpIGJmaW5fcmVhZFBUUihETUE1X05FWFRfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BNV9ORVhUX0RFU0NfUFRSKHZhbCkgYmZpbl93cml0ZVBUUihETUE1X05FWFRfREVTQ19QVFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTVfU1RBUlRfQUREUigpICAgIGJmaW5fcmVhZFBUUihETUE1X1NUQVJUX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BNV9TVEFSVF9BRERSKHZhbCkgYmZpbl93cml0ZVBUUihETUE1X1NUQVJUX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTVfQ09ORklHKCkgICAgICAgIGJmaW5fcmVhZDE2KERNQTVfQ09ORklHKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTVfQ09ORklHKHZhbCkgICAgYmZpbl93cml0ZTE2KERNQTVfQ09ORklHLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE1X1hfQ09VTlQoKSAgICAgICBiZmluX3JlYWQxNihETUE1X1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BNV9YX0NPVU5UKHZhbCkgICBiZmluX3dyaXRlMTYoRE1BNV9YX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE1X1hfTU9ESUZZKCkgICAgICBiZmluX3JlYWQxNihETUE1X1hfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTVfWF9NT0RJRlkodmFsKSAgYmZpbl93cml0ZTE2KERNQTVfWF9NT0RJRlksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTVfWV9DT1VOVCgpICAgICAgIGJmaW5fcmVhZDE2KERNQTVfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE1X1lfQ09VTlQodmFsKSAgIGJmaW5fd3JpdGUxNihETUE1X1lfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTVfWV9NT0RJRlkoKSAgICAgIGJmaW5fcmVhZDE2KERNQTVfWV9NT0RJRlkpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BNV9ZX01PRElGWSh2YWwpICBiZmluX3dyaXRlMTYoRE1BNV9ZX01PRElGWSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BNV9DVVJSX0RFU0NfUFRSKCkgYmZpbl9yZWFkUFRSKERNQTVfQ1VSUl9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE1X0NVUlJfREVTQ19QVFIodmFsKSBiZmluX3dyaXRlUFRSKERNQTVfQ1VSUl9ERVNDX1BUUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BNV9DVVJSX0FERFIoKSAgICAgYmZpbl9yZWFkUFRSKERNQTVfQ1VSUl9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTVfQ1VSUl9BRERSKHZhbCkgYmZpbl93cml0ZVBUUihETUE1X0NVUlJfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BNV9JUlFfU1RBVFVTKCkgICAgYmZpbl9yZWFkMTYoRE1BNV9JUlFfU1RBVFVTKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTVfSVJRX1NUQVRVUyh2YWwpIGJmaW5fd3JpdGUxNihETUE1X0lSUV9TVEFUVVMsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTVfUEVSSVBIRVJBTF9NQVAoKSBiZmluX3JlYWQxNihETUE1X1BFUklQSEVSQUxfTUFQKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTVfUEVSSVBIRVJBTF9NQVAodmFsKSBiZmluX3dyaXRlMTYoRE1BNV9QRVJJUEhFUkFMX01BUCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BNV9DVVJSX1hfQ09VTlQoKSAgYmZpbl9yZWFkMTYoRE1BNV9DVVJSX1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BNV9DVVJSX1hfQ09VTlQodmFsKSBiZmluX3dyaXRlMTYoRE1BNV9DVVJSX1hfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTVfQ1VSUl9ZX0NPVU5UKCkgIGJmaW5fcmVhZDE2KERNQTVfQ1VSUl9ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTVfQ1VSUl9ZX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KERNQTVfQ1VSUl9ZX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE2X05FWFRfREVTQ19QVFIoKSBiZmluX3JlYWRQVFIoRE1BNl9ORVhUX0RFU0NfUFRSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTZfTkVYVF9ERVNDX1BUUih2YWwpIGJmaW5fd3JpdGVQVFIoRE1BNl9ORVhUX0RFU0NfUFRSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE2X1NUQVJUX0FERFIoKSAgICBiZmluX3JlYWRQVFIoRE1BNl9TVEFSVF9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTZfU1RBUlRfQUREUih2YWwpIGJmaW5fd3JpdGVQVFIoRE1BNl9TVEFSVF9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE2X0NPTkZJRygpICAgICAgICBiZmluX3JlYWQxNihETUE2X0NPTkZJRykKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE2X0NPTkZJRyh2YWwpICAgIGJmaW5fd3JpdGUxNihETUE2X0NPTkZJRywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BNl9YX0NPVU5UKCkgICAgICAgYmZpbl9yZWFkMTYoRE1BNl9YX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTZfWF9DT1VOVCh2YWwpICAgYmZpbl93cml0ZTE2KERNQTZfWF9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BNl9YX01PRElGWSgpICAgICAgYmZpbl9yZWFkMTYoRE1BNl9YX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE2X1hfTU9ESUZZKHZhbCkgIGJmaW5fd3JpdGUxNihETUE2X1hfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE2X1lfQ09VTlQoKSAgICAgICBiZmluX3JlYWQxNihETUE2X1lfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BNl9ZX0NPVU5UKHZhbCkgICBiZmluX3dyaXRlMTYoRE1BNl9ZX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE2X1lfTU9ESUZZKCkgICAgICBiZmluX3JlYWQxNihETUE2X1lfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTZfWV9NT0RJRlkodmFsKSAgYmZpbl93cml0ZTE2KERNQTZfWV9NT0RJRlksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTZfQ1VSUl9ERVNDX1BUUigpIGJmaW5fcmVhZFBUUihETUE2X0NVUlJfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BNl9DVVJSX0RFU0NfUFRSKHZhbCkgYmZpbl93cml0ZVBUUihETUE2X0NVUlJfREVTQ19QVFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTZfQ1VSUl9BRERSKCkgICAgIGJmaW5fcmVhZFBUUihETUE2X0NVUlJfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE2X0NVUlJfQUREUih2YWwpIGJmaW5fd3JpdGVQVFIoRE1BNl9DVVJSX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTZfSVJRX1NUQVRVUygpICAgIGJmaW5fcmVhZDE2KERNQTZfSVJRX1NUQVRVUykKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE2X0lSUV9TVEFUVVModmFsKSBiZmluX3dyaXRlMTYoRE1BNl9JUlFfU1RBVFVTLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE2X1BFUklQSEVSQUxfTUFQKCkgYmZpbl9yZWFkMTYoRE1BNl9QRVJJUEhFUkFMX01BUCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE2X1BFUklQSEVSQUxfTUFQKHZhbCkgYmZpbl93cml0ZTE2KERNQTZfUEVSSVBIRVJBTF9NQVAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTZfQ1VSUl9YX0NPVU5UKCkgIGJmaW5fcmVhZDE2KERNQTZfQ1VSUl9YX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTZfQ1VSUl9YX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KERNQTZfQ1VSUl9YX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE2X0NVUlJfWV9DT1VOVCgpICBiZmluX3JlYWQxNihETUE2X0NVUlJfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE2X0NVUlJfWV9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihETUE2X0NVUlJfWV9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BN19ORVhUX0RFU0NfUFRSKCkgYmZpbl9yZWFkUFRSKERNQTdfTkVYVF9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE3X05FWFRfREVTQ19QVFIodmFsKSBiZmluX3dyaXRlUFRSKERNQTdfTkVYVF9ERVNDX1BUUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BN19TVEFSVF9BRERSKCkgICAgYmZpbl9yZWFkUFRSKERNQTdfU1RBUlRfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE3X1NUQVJUX0FERFIodmFsKSBiZmluX3dyaXRlUFRSKERNQTdfU1RBUlRfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BN19DT05GSUcoKSAgICAgICAgYmZpbl9yZWFkMTYoRE1BN19DT05GSUcpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BN19DT05GSUcodmFsKSAgICBiZmluX3dyaXRlMTYoRE1BN19DT05GSUcsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTdfWF9DT1VOVCgpICAgICAgIGJmaW5fcmVhZDE2KERNQTdfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE3X1hfQ09VTlQodmFsKSAgIGJmaW5fd3JpdGUxNihETUE3X1hfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTdfWF9NT0RJRlkoKSAgICAgIGJmaW5fcmVhZDE2KERNQTdfWF9NT0RJRlkpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BN19YX01PRElGWSh2YWwpICBiZmluX3dyaXRlMTYoRE1BN19YX01PRElGWSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BN19ZX0NPVU5UKCkgICAgICAgYmZpbl9yZWFkMTYoRE1BN19ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTdfWV9DT1VOVCh2YWwpICAgYmZpbl93cml0ZTE2KERNQTdfWV9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BN19ZX01PRElGWSgpICAgICAgYmZpbl9yZWFkMTYoRE1BN19ZX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE3X1lfTU9ESUZZKHZhbCkgIGJmaW5fd3JpdGUxNihETUE3X1lfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE3X0NVUlJfREVTQ19QVFIoKSBiZmluX3JlYWRQVFIoRE1BN19DVVJSX0RFU0NfUFRSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTdfQ1VSUl9ERVNDX1BUUih2YWwpIGJmaW5fd3JpdGVQVFIoRE1BN19DVVJSX0RFU0NfUFRSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE3X0NVUlJfQUREUigpICAgICBiZmluX3JlYWRQVFIoRE1BN19DVVJSX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BN19DVVJSX0FERFIodmFsKSBiZmluX3dyaXRlUFRSKERNQTdfQ1VSUl9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE3X0lSUV9TVEFUVVMoKSAgICBiZmluX3JlYWQxNihETUE3X0lSUV9TVEFUVVMpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BN19JUlFfU1RBVFVTKHZhbCkgYmZpbl93cml0ZTE2KERNQTdfSVJRX1NUQVRVUywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BN19QRVJJUEhFUkFMX01BUCgpIGJmaW5fcmVhZDE2KERNQTdfUEVSSVBIRVJBTF9NQVApCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BN19QRVJJUEhFUkFMX01BUCh2YWwpIGJmaW5fd3JpdGUxNihETUE3X1BFUklQSEVSQUxfTUFQLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE3X0NVUlJfWF9DT1VOVCgpICBiZmluX3JlYWQxNihETUE3X0NVUlJfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE3X0NVUlJfWF9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihETUE3X0NVUlJfWF9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BN19DVVJSX1lfQ09VTlQoKSAgYmZpbl9yZWFkMTYoRE1BN19DVVJSX1lfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BN19DVVJSX1lfQ09VTlQodmFsKSBiZmluX3dyaXRlMTYoRE1BN19DVVJSX1lfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTFfVENfUEVSKCkgICAgICAgIGJmaW5fcmVhZDE2KERNQTFfVENfUEVSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTFfVENfUEVSKHZhbCkgICAgYmZpbl93cml0ZTE2KERNQTFfVENfUEVSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExX1RDX0NOVCgpICAgICAgICBiZmluX3JlYWQxNihETUExX1RDX0NOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExX1RDX0NOVCh2YWwpICAgIGJmaW5fd3JpdGUxNihETUExX1RDX0NOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BOF9ORVhUX0RFU0NfUFRSKCkgYmZpbl9yZWFkUFRSKERNQThfTkVYVF9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE4X05FWFRfREVTQ19QVFIodmFsKSBiZmluX3dyaXRlUFRSKERNQThfTkVYVF9ERVNDX1BUUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BOF9TVEFSVF9BRERSKCkgICAgYmZpbl9yZWFkUFRSKERNQThfU1RBUlRfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE4X1NUQVJUX0FERFIodmFsKSBiZmluX3dyaXRlUFRSKERNQThfU1RBUlRfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BOF9DT05GSUcoKSAgICAgICAgYmZpbl9yZWFkMTYoRE1BOF9DT05GSUcpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BOF9DT05GSUcodmFsKSAgICBiZmluX3dyaXRlMTYoRE1BOF9DT05GSUcsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQThfWF9DT1VOVCgpICAgICAgIGJmaW5fcmVhZDE2KERNQThfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE4X1hfQ09VTlQodmFsKSAgIGJmaW5fd3JpdGUxNihETUE4X1hfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQThfWF9NT0RJRlkoKSAgICAgIGJmaW5fcmVhZDE2KERNQThfWF9NT0RJRlkpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BOF9YX01PRElGWSh2YWwpICBiZmluX3dyaXRlMTYoRE1BOF9YX01PRElGWSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BOF9ZX0NPVU5UKCkgICAgICAgYmZpbl9yZWFkMTYoRE1BOF9ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQThfWV9DT1VOVCh2YWwpICAgYmZpbl93cml0ZTE2KERNQThfWV9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BOF9ZX01PRElGWSgpICAgICAgYmZpbl9yZWFkMTYoRE1BOF9ZX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE4X1lfTU9ESUZZKHZhbCkgIGJmaW5fd3JpdGUxNihETUE4X1lfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE4X0NVUlJfREVTQ19QVFIoKSBiZmluX3JlYWRQVFIoRE1BOF9DVVJSX0RFU0NfUFRSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQThfQ1VSUl9ERVNDX1BUUih2YWwpIGJmaW5fd3JpdGVQVFIoRE1BOF9DVVJSX0RFU0NfUFRSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE4X0NVUlJfQUREUigpICAgICBiZmluX3JlYWRQVFIoRE1BOF9DVVJSX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BOF9DVVJSX0FERFIodmFsKSBiZmluX3dyaXRlUFRSKERNQThfQ1VSUl9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE4X0lSUV9TVEFUVVMoKSAgICBiZmluX3JlYWQxNihETUE4X0lSUV9TVEFUVVMpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BOF9JUlFfU1RBVFVTKHZhbCkgYmZpbl93cml0ZTE2KERNQThfSVJRX1NUQVRVUywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BOF9QRVJJUEhFUkFMX01BUCgpIGJmaW5fcmVhZDE2KERNQThfUEVSSVBIRVJBTF9NQVApCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BOF9QRVJJUEhFUkFMX01BUCh2YWwpIGJmaW5fd3JpdGUxNihETUE4X1BFUklQSEVSQUxfTUFQLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE4X0NVUlJfWF9DT1VOVCgpICBiZmluX3JlYWQxNihETUE4X0NVUlJfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE4X0NVUlJfWF9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihETUE4X0NVUlJfWF9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BOF9DVVJSX1lfQ09VTlQoKSAgYmZpbl9yZWFkMTYoRE1BOF9DVVJSX1lfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BOF9DVVJSX1lfQ09VTlQodmFsKSBiZmluX3dyaXRlMTYoRE1BOF9DVVJSX1lfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTlfTkVYVF9ERVNDX1BUUigpIGJmaW5fcmVhZFBUUihETUE5X05FWFRfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BOV9ORVhUX0RFU0NfUFRSKHZhbCkgYmZpbl93cml0ZVBUUihETUE5X05FWFRfREVTQ19QVFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTlfU1RBUlRfQUREUigpICAgIGJmaW5fcmVhZFBUUihETUE5X1NUQVJUX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BOV9TVEFSVF9BRERSKHZhbCkgYmZpbl93cml0ZVBUUihETUE5X1NUQVJUX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTlfQ09ORklHKCkgICAgICAgIGJmaW5fcmVhZDE2KERNQTlfQ09ORklHKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTlfQ09ORklHKHZhbCkgICAgYmZpbl93cml0ZTE2KERNQTlfQ09ORklHLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE5X1hfQ09VTlQoKSAgICAgICBiZmluX3JlYWQxNihETUE5X1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BOV9YX0NPVU5UKHZhbCkgICBiZmluX3dyaXRlMTYoRE1BOV9YX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUE5X1hfTU9ESUZZKCkgICAgICBiZmluX3JlYWQxNihETUE5X1hfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTlfWF9NT0RJRlkodmFsKSAgYmZpbl93cml0ZTE2KERNQTlfWF9NT0RJRlksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTlfWV9DT1VOVCgpICAgICAgIGJmaW5fcmVhZDE2KERNQTlfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE5X1lfQ09VTlQodmFsKSAgIGJmaW5fd3JpdGUxNihETUE5X1lfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTlfWV9NT0RJRlkoKSAgICAgIGJmaW5fcmVhZDE2KERNQTlfWV9NT0RJRlkpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BOV9ZX01PRElGWSh2YWwpICBiZmluX3dyaXRlMTYoRE1BOV9ZX01PRElGWSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BOV9DVVJSX0RFU0NfUFRSKCkgYmZpbl9yZWFkUFRSKERNQTlfQ1VSUl9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUE5X0NVUlJfREVTQ19QVFIodmFsKSBiZmluX3dyaXRlUFRSKERNQTlfQ1VSUl9ERVNDX1BUUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BOV9DVVJSX0FERFIoKSAgICAgYmZpbl9yZWFkUFRSKERNQTlfQ1VSUl9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTlfQ1VSUl9BRERSKHZhbCkgYmZpbl93cml0ZVBUUihETUE5X0NVUlJfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BOV9JUlFfU1RBVFVTKCkgICAgYmZpbl9yZWFkMTYoRE1BOV9JUlFfU1RBVFVTKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTlfSVJRX1NUQVRVUyh2YWwpIGJmaW5fd3JpdGUxNihETUE5X0lSUV9TVEFUVVMsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTlfUEVSSVBIRVJBTF9NQVAoKSBiZmluX3JlYWQxNihETUE5X1BFUklQSEVSQUxfTUFQKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTlfUEVSSVBIRVJBTF9NQVAodmFsKSBiZmluX3dyaXRlMTYoRE1BOV9QRVJJUEhFUkFMX01BUCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BOV9DVVJSX1hfQ09VTlQoKSAgYmZpbl9yZWFkMTYoRE1BOV9DVVJSX1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BOV9DVVJSX1hfQ09VTlQodmFsKSBiZmluX3dyaXRlMTYoRE1BOV9DVVJSX1hfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTlfQ1VSUl9ZX0NPVU5UKCkgIGJmaW5fcmVhZDE2KERNQTlfQ1VSUl9ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTlfQ1VSUl9ZX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KERNQTlfQ1VSUl9ZX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExMF9ORVhUX0RFU0NfUFRSKCkgYmZpbl9yZWFkUFRSKERNQTEwX05FWFRfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTBfTkVYVF9ERVNDX1BUUih2YWwpIGJmaW5fd3JpdGVQVFIoRE1BMTBfTkVYVF9ERVNDX1BUUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTBfU1RBUlRfQUREUigpICAgYmZpbl9yZWFkUFRSKERNQTEwX1NUQVJUX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTBfU1RBUlRfQUREUih2YWwpIGJmaW5fd3JpdGVQVFIoRE1BMTBfU1RBUlRfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTBfQ09ORklHKCkgICAgICAgYmZpbl9yZWFkMTYoRE1BMTBfQ09ORklHKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTEwX0NPTkZJRyh2YWwpICAgYmZpbl93cml0ZTE2KERNQTEwX0NPTkZJRywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTBfWF9DT1VOVCgpICAgICAgYmZpbl9yZWFkMTYoRE1BMTBfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExMF9YX0NPVU5UKHZhbCkgIGJmaW5fd3JpdGUxNihETUExMF9YX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExMF9YX01PRElGWSgpICAgICBiZmluX3JlYWQxNihETUExMF9YX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExMF9YX01PRElGWSh2YWwpIGJmaW5fd3JpdGUxNihETUExMF9YX01PRElGWSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTBfWV9DT1VOVCgpICAgICAgYmZpbl9yZWFkMTYoRE1BMTBfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExMF9ZX0NPVU5UKHZhbCkgIGJmaW5fd3JpdGUxNihETUExMF9ZX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExMF9ZX01PRElGWSgpICAgICBiZmluX3JlYWQxNihETUExMF9ZX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExMF9ZX01PRElGWSh2YWwpIGJmaW5fd3JpdGUxNihETUExMF9ZX01PRElGWSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTBfQ1VSUl9ERVNDX1BUUigpIGJmaW5fcmVhZFBUUihETUExMF9DVVJSX0RFU0NfUFRSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTEwX0NVUlJfREVTQ19QVFIodmFsKSBiZmluX3dyaXRlUFRSKERNQTEwX0NVUlJfREVTQ19QVFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTEwX0NVUlJfQUREUigpICAgIGJmaW5fcmVhZFBUUihETUExMF9DVVJSX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTBfQ1VSUl9BRERSKHZhbCkgYmZpbl93cml0ZVBUUihETUExMF9DVVJSX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTEwX0lSUV9TVEFUVVMoKSAgIGJmaW5fcmVhZDE2KERNQTEwX0lSUV9TVEFUVVMpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTBfSVJRX1NUQVRVUyh2YWwpIGJmaW5fd3JpdGUxNihETUExMF9JUlFfU1RBVFVTLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExMF9QRVJJUEhFUkFMX01BUCgpIGJmaW5fcmVhZDE2KERNQTEwX1BFUklQSEVSQUxfTUFQKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTEwX1BFUklQSEVSQUxfTUFQKHZhbCkgYmZpbl93cml0ZTE2KERNQTEwX1BFUklQSEVSQUxfTUFQLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExMF9DVVJSX1hfQ09VTlQoKSBiZmluX3JlYWQxNihETUExMF9DVVJSX1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTBfQ1VSUl9YX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KERNQTEwX0NVUlJfWF9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTBfQ1VSUl9ZX0NPVU5UKCkgYmZpbl9yZWFkMTYoRE1BMTBfQ1VSUl9ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTEwX0NVUlJfWV9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihETUExMF9DVVJSX1lfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTExX05FWFRfREVTQ19QVFIoKSBiZmluX3JlYWRQVFIoRE1BMTFfTkVYVF9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExMV9ORVhUX0RFU0NfUFRSKHZhbCkgYmZpbl93cml0ZVBUUihETUExMV9ORVhUX0RFU0NfUFRSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExMV9TVEFSVF9BRERSKCkgICBiZmluX3JlYWRQVFIoRE1BMTFfU1RBUlRfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExMV9TVEFSVF9BRERSKHZhbCkgYmZpbl93cml0ZVBUUihETUExMV9TVEFSVF9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExMV9DT05GSUcoKSAgICAgICBiZmluX3JlYWQxNihETUExMV9DT05GSUcpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTFfQ09ORklHKHZhbCkgICBiZmluX3dyaXRlMTYoRE1BMTFfQ09ORklHLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExMV9YX0NPVU5UKCkgICAgICBiZmluX3JlYWQxNihETUExMV9YX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTExX1hfQ09VTlQodmFsKSAgYmZpbl93cml0ZTE2KERNQTExX1hfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTExX1hfTU9ESUZZKCkgICAgIGJmaW5fcmVhZDE2KERNQTExX1hfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTExX1hfTU9ESUZZKHZhbCkgYmZpbl93cml0ZTE2KERNQTExX1hfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExMV9ZX0NPVU5UKCkgICAgICBiZmluX3JlYWQxNihETUExMV9ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTExX1lfQ09VTlQodmFsKSAgYmZpbl93cml0ZTE2KERNQTExX1lfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTExX1lfTU9ESUZZKCkgICAgIGJmaW5fcmVhZDE2KERNQTExX1lfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTExX1lfTU9ESUZZKHZhbCkgYmZpbl93cml0ZTE2KERNQTExX1lfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExMV9DVVJSX0RFU0NfUFRSKCkgYmZpbl9yZWFkUFRSKERNQTExX0NVUlJfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTFfQ1VSUl9ERVNDX1BUUih2YWwpIGJmaW5fd3JpdGVQVFIoRE1BMTFfQ1VSUl9ERVNDX1BUUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTFfQ1VSUl9BRERSKCkgICAgYmZpbl9yZWFkUFRSKERNQTExX0NVUlJfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExMV9DVVJSX0FERFIodmFsKSBiZmluX3dyaXRlUFRSKERNQTExX0NVUlJfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTFfSVJRX1NUQVRVUygpICAgYmZpbl9yZWFkMTYoRE1BMTFfSVJRX1NUQVRVUykKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExMV9JUlFfU1RBVFVTKHZhbCkgYmZpbl93cml0ZTE2KERNQTExX0lSUV9TVEFUVVMsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTExX1BFUklQSEVSQUxfTUFQKCkgYmZpbl9yZWFkMTYoRE1BMTFfUEVSSVBIRVJBTF9NQVApCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTFfUEVSSVBIRVJBTF9NQVAodmFsKSBiZmluX3dyaXRlMTYoRE1BMTFfUEVSSVBIRVJBTF9NQVAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTExX0NVUlJfWF9DT1VOVCgpIGJmaW5fcmVhZDE2KERNQTExX0NVUlJfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExMV9DVVJSX1hfQ09VTlQodmFsKSBiZmluX3dyaXRlMTYoRE1BMTFfQ1VSUl9YX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExMV9DVVJSX1lfQ09VTlQoKSBiZmluX3JlYWQxNihETUExMV9DVVJSX1lfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTFfQ1VSUl9ZX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KERNQTExX0NVUlJfWV9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTJfTkVYVF9ERVNDX1BUUigpIGJmaW5fcmVhZFBUUihETUExMl9ORVhUX0RFU0NfUFRSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTEyX05FWFRfREVTQ19QVFIodmFsKSBiZmluX3dyaXRlUFRSKERNQTEyX05FWFRfREVTQ19QVFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTEyX1NUQVJUX0FERFIoKSAgIGJmaW5fcmVhZFBUUihETUExMl9TVEFSVF9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTEyX1NUQVJUX0FERFIodmFsKSBiZmluX3dyaXRlUFRSKERNQTEyX1NUQVJUX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTEyX0NPTkZJRygpICAgICAgIGJmaW5fcmVhZDE2KERNQTEyX0NPTkZJRykKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExMl9DT05GSUcodmFsKSAgIGJmaW5fd3JpdGUxNihETUExMl9DT05GSUcsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTEyX1hfQ09VTlQoKSAgICAgIGJmaW5fcmVhZDE2KERNQTEyX1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTJfWF9DT1VOVCh2YWwpICBiZmluX3dyaXRlMTYoRE1BMTJfWF9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTJfWF9NT0RJRlkoKSAgICAgYmZpbl9yZWFkMTYoRE1BMTJfWF9NT0RJRlkpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTJfWF9NT0RJRlkodmFsKSBiZmluX3dyaXRlMTYoRE1BMTJfWF9NT0RJRlksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTEyX1lfQ09VTlQoKSAgICAgIGJmaW5fcmVhZDE2KERNQTEyX1lfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTJfWV9DT1VOVCh2YWwpICBiZmluX3dyaXRlMTYoRE1BMTJfWV9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTJfWV9NT0RJRlkoKSAgICAgYmZpbl9yZWFkMTYoRE1BMTJfWV9NT0RJRlkpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTJfWV9NT0RJRlkodmFsKSBiZmluX3dyaXRlMTYoRE1BMTJfWV9NT0RJRlksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTEyX0NVUlJfREVTQ19QVFIoKSBiZmluX3JlYWRQVFIoRE1BMTJfQ1VSUl9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExMl9DVVJSX0RFU0NfUFRSKHZhbCkgYmZpbl93cml0ZVBUUihETUExMl9DVVJSX0RFU0NfUFRSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExMl9DVVJSX0FERFIoKSAgICBiZmluX3JlYWRQVFIoRE1BMTJfQ1VSUl9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTEyX0NVUlJfQUREUih2YWwpIGJmaW5fd3JpdGVQVFIoRE1BMTJfQ1VSUl9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExMl9JUlFfU1RBVFVTKCkgICBiZmluX3JlYWQxNihETUExMl9JUlFfU1RBVFVTKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTEyX0lSUV9TVEFUVVModmFsKSBiZmluX3dyaXRlMTYoRE1BMTJfSVJRX1NUQVRVUywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTJfUEVSSVBIRVJBTF9NQVAoKSBiZmluX3JlYWQxNihETUExMl9QRVJJUEhFUkFMX01BUCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExMl9QRVJJUEhFUkFMX01BUCh2YWwpIGJmaW5fd3JpdGUxNihETUExMl9QRVJJUEhFUkFMX01BUCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTJfQ1VSUl9YX0NPVU5UKCkgYmZpbl9yZWFkMTYoRE1BMTJfQ1VSUl9YX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTEyX0NVUlJfWF9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihETUExMl9DVVJSX1hfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTEyX0NVUlJfWV9DT1VOVCgpIGJmaW5fcmVhZDE2KERNQTEyX0NVUlJfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExMl9DVVJSX1lfQ09VTlQodmFsKSBiZmluX3dyaXRlMTYoRE1BMTJfQ1VSUl9ZX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExM19ORVhUX0RFU0NfUFRSKCkgYmZpbl9yZWFkUFRSKERNQTEzX05FWFRfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTNfTkVYVF9ERVNDX1BUUih2YWwpIGJmaW5fd3JpdGVQVFIoRE1BMTNfTkVYVF9ERVNDX1BUUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTNfU1RBUlRfQUREUigpICAgYmZpbl9yZWFkUFRSKERNQTEzX1NUQVJUX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTNfU1RBUlRfQUREUih2YWwpIGJmaW5fd3JpdGVQVFIoRE1BMTNfU1RBUlRfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTNfQ09ORklHKCkgICAgICAgYmZpbl9yZWFkMTYoRE1BMTNfQ09ORklHKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTEzX0NPTkZJRyh2YWwpICAgYmZpbl93cml0ZTE2KERNQTEzX0NPTkZJRywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTNfWF9DT1VOVCgpICAgICAgYmZpbl9yZWFkMTYoRE1BMTNfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExM19YX0NPVU5UKHZhbCkgIGJmaW5fd3JpdGUxNihETUExM19YX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExM19YX01PRElGWSgpICAgICBiZmluX3JlYWQxNihETUExM19YX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExM19YX01PRElGWSh2YWwpIGJmaW5fd3JpdGUxNihETUExM19YX01PRElGWSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTNfWV9DT1VOVCgpICAgICAgYmZpbl9yZWFkMTYoRE1BMTNfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExM19ZX0NPVU5UKHZhbCkgIGJmaW5fd3JpdGUxNihETUExM19ZX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExM19ZX01PRElGWSgpICAgICBiZmluX3JlYWQxNihETUExM19ZX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExM19ZX01PRElGWSh2YWwpIGJmaW5fd3JpdGUxNihETUExM19ZX01PRElGWSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTNfQ1VSUl9ERVNDX1BUUigpIGJmaW5fcmVhZFBUUihETUExM19DVVJSX0RFU0NfUFRSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTEzX0NVUlJfREVTQ19QVFIodmFsKSBiZmluX3dyaXRlUFRSKERNQTEzX0NVUlJfREVTQ19QVFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTEzX0NVUlJfQUREUigpICAgIGJmaW5fcmVhZFBUUihETUExM19DVVJSX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTNfQ1VSUl9BRERSKHZhbCkgYmZpbl93cml0ZVBUUihETUExM19DVVJSX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTEzX0lSUV9TVEFUVVMoKSAgIGJmaW5fcmVhZDE2KERNQTEzX0lSUV9TVEFUVVMpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTNfSVJRX1NUQVRVUyh2YWwpIGJmaW5fd3JpdGUxNihETUExM19JUlFfU1RBVFVTLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExM19QRVJJUEhFUkFMX01BUCgpIGJmaW5fcmVhZDE2KERNQTEzX1BFUklQSEVSQUxfTUFQKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTEzX1BFUklQSEVSQUxfTUFQKHZhbCkgYmZpbl93cml0ZTE2KERNQTEzX1BFUklQSEVSQUxfTUFQLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExM19DVVJSX1hfQ09VTlQoKSBiZmluX3JlYWQxNihETUExM19DVVJSX1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTNfQ1VSUl9YX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KERNQTEzX0NVUlJfWF9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTNfQ1VSUl9ZX0NPVU5UKCkgYmZpbl9yZWFkMTYoRE1BMTNfQ1VSUl9ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTEzX0NVUlJfWV9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihETUExM19DVVJSX1lfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTE0X05FWFRfREVTQ19QVFIoKSBiZmluX3JlYWRQVFIoRE1BMTRfTkVYVF9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExNF9ORVhUX0RFU0NfUFRSKHZhbCkgYmZpbl93cml0ZVBUUihETUExNF9ORVhUX0RFU0NfUFRSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExNF9TVEFSVF9BRERSKCkgICBiZmluX3JlYWRQVFIoRE1BMTRfU1RBUlRfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExNF9TVEFSVF9BRERSKHZhbCkgYmZpbl93cml0ZVBUUihETUExNF9TVEFSVF9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExNF9DT05GSUcoKSAgICAgICBiZmluX3JlYWQxNihETUExNF9DT05GSUcpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTRfQ09ORklHKHZhbCkgICBiZmluX3dyaXRlMTYoRE1BMTRfQ09ORklHLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExNF9YX0NPVU5UKCkgICAgICBiZmluX3JlYWQxNihETUExNF9YX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTE0X1hfQ09VTlQodmFsKSAgYmZpbl93cml0ZTE2KERNQTE0X1hfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTE0X1hfTU9ESUZZKCkgICAgIGJmaW5fcmVhZDE2KERNQTE0X1hfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTE0X1hfTU9ESUZZKHZhbCkgYmZpbl93cml0ZTE2KERNQTE0X1hfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExNF9ZX0NPVU5UKCkgICAgICBiZmluX3JlYWQxNihETUExNF9ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTE0X1lfQ09VTlQodmFsKSAgYmZpbl93cml0ZTE2KERNQTE0X1lfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTE0X1lfTU9ESUZZKCkgICAgIGJmaW5fcmVhZDE2KERNQTE0X1lfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTE0X1lfTU9ESUZZKHZhbCkgYmZpbl93cml0ZTE2KERNQTE0X1lfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExNF9DVVJSX0RFU0NfUFRSKCkgYmZpbl9yZWFkUFRSKERNQTE0X0NVUlJfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTRfQ1VSUl9ERVNDX1BUUih2YWwpIGJmaW5fd3JpdGVQVFIoRE1BMTRfQ1VSUl9ERVNDX1BUUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTRfQ1VSUl9BRERSKCkgICAgYmZpbl9yZWFkUFRSKERNQTE0X0NVUlJfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExNF9DVVJSX0FERFIodmFsKSBiZmluX3dyaXRlUFRSKERNQTE0X0NVUlJfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTRfSVJRX1NUQVRVUygpICAgYmZpbl9yZWFkMTYoRE1BMTRfSVJRX1NUQVRVUykKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExNF9JUlFfU1RBVFVTKHZhbCkgYmZpbl93cml0ZTE2KERNQTE0X0lSUV9TVEFUVVMsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTE0X1BFUklQSEVSQUxfTUFQKCkgYmZpbl9yZWFkMTYoRE1BMTRfUEVSSVBIRVJBTF9NQVApCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTRfUEVSSVBIRVJBTF9NQVAodmFsKSBiZmluX3dyaXRlMTYoRE1BMTRfUEVSSVBIRVJBTF9NQVAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTE0X0NVUlJfWF9DT1VOVCgpIGJmaW5fcmVhZDE2KERNQTE0X0NVUlJfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExNF9DVVJSX1hfQ09VTlQodmFsKSBiZmluX3dyaXRlMTYoRE1BMTRfQ1VSUl9YX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExNF9DVVJSX1lfQ09VTlQoKSBiZmluX3JlYWQxNihETUExNF9DVVJSX1lfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTRfQ1VSUl9ZX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KERNQTE0X0NVUlJfWV9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTVfTkVYVF9ERVNDX1BUUigpIGJmaW5fcmVhZFBUUihETUExNV9ORVhUX0RFU0NfUFRSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTE1X05FWFRfREVTQ19QVFIodmFsKSBiZmluX3dyaXRlUFRSKERNQTE1X05FWFRfREVTQ19QVFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTE1X1NUQVJUX0FERFIoKSAgIGJmaW5fcmVhZFBUUihETUExNV9TVEFSVF9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTE1X1NUQVJUX0FERFIodmFsKSBiZmluX3dyaXRlUFRSKERNQTE1X1NUQVJUX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTE1X0NPTkZJRygpICAgICAgIGJmaW5fcmVhZDE2KERNQTE1X0NPTkZJRykKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExNV9DT05GSUcodmFsKSAgIGJmaW5fd3JpdGUxNihETUExNV9DT05GSUcsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTE1X1hfQ09VTlQoKSAgICAgIGJmaW5fcmVhZDE2KERNQTE1X1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTVfWF9DT1VOVCh2YWwpICBiZmluX3dyaXRlMTYoRE1BMTVfWF9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTVfWF9NT0RJRlkoKSAgICAgYmZpbl9yZWFkMTYoRE1BMTVfWF9NT0RJRlkpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTVfWF9NT0RJRlkodmFsKSBiZmluX3dyaXRlMTYoRE1BMTVfWF9NT0RJRlksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTE1X1lfQ09VTlQoKSAgICAgIGJmaW5fcmVhZDE2KERNQTE1X1lfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTVfWV9DT1VOVCh2YWwpICBiZmluX3dyaXRlMTYoRE1BMTVfWV9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTVfWV9NT0RJRlkoKSAgICAgYmZpbl9yZWFkMTYoRE1BMTVfWV9NT0RJRlkpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTVfWV9NT0RJRlkodmFsKSBiZmluX3dyaXRlMTYoRE1BMTVfWV9NT0RJRlksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTE1X0NVUlJfREVTQ19QVFIoKSBiZmluX3JlYWRQVFIoRE1BMTVfQ1VSUl9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExNV9DVVJSX0RFU0NfUFRSKHZhbCkgYmZpbl93cml0ZVBUUihETUExNV9DVVJSX0RFU0NfUFRSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExNV9DVVJSX0FERFIoKSAgICBiZmluX3JlYWRQVFIoRE1BMTVfQ1VSUl9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTE1X0NVUlJfQUREUih2YWwpIGJmaW5fd3JpdGVQVFIoRE1BMTVfQ1VSUl9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExNV9JUlFfU1RBVFVTKCkgICBiZmluX3JlYWQxNihETUExNV9JUlFfU1RBVFVTKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTE1X0lSUV9TVEFUVVModmFsKSBiZmluX3dyaXRlMTYoRE1BMTVfSVJRX1NUQVRVUywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTVfUEVSSVBIRVJBTF9NQVAoKSBiZmluX3JlYWQxNihETUExNV9QRVJJUEhFUkFMX01BUCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExNV9QRVJJUEhFUkFMX01BUCh2YWwpIGJmaW5fd3JpdGUxNihETUExNV9QRVJJUEhFUkFMX01BUCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTVfQ1VSUl9YX0NPVU5UKCkgYmZpbl9yZWFkMTYoRE1BMTVfQ1VSUl9YX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTE1X0NVUlJfWF9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihETUExNV9DVVJSX1hfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTE1X0NVUlJfWV9DT1VOVCgpIGJmaW5fcmVhZDE2KERNQTE1X0NVUlJfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExNV9DVVJSX1lfQ09VTlQodmFsKSBiZmluX3dyaXRlMTYoRE1BMTVfQ1VSUl9ZX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExNl9ORVhUX0RFU0NfUFRSKCkgYmZpbl9yZWFkUFRSKERNQTE2X05FWFRfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTZfTkVYVF9ERVNDX1BUUih2YWwpIGJmaW5fd3JpdGVQVFIoRE1BMTZfTkVYVF9ERVNDX1BUUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTZfU1RBUlRfQUREUigpICAgYmZpbl9yZWFkUFRSKERNQTE2X1NUQVJUX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTZfU1RBUlRfQUREUih2YWwpIGJmaW5fd3JpdGVQVFIoRE1BMTZfU1RBUlRfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTZfQ09ORklHKCkgICAgICAgYmZpbl9yZWFkMTYoRE1BMTZfQ09ORklHKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTE2X0NPTkZJRyh2YWwpICAgYmZpbl93cml0ZTE2KERNQTE2X0NPTkZJRywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTZfWF9DT1VOVCgpICAgICAgYmZpbl9yZWFkMTYoRE1BMTZfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExNl9YX0NPVU5UKHZhbCkgIGJmaW5fd3JpdGUxNihETUExNl9YX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExNl9YX01PRElGWSgpICAgICBiZmluX3JlYWQxNihETUExNl9YX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExNl9YX01PRElGWSh2YWwpIGJmaW5fd3JpdGUxNihETUExNl9YX01PRElGWSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTZfWV9DT1VOVCgpICAgICAgYmZpbl9yZWFkMTYoRE1BMTZfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExNl9ZX0NPVU5UKHZhbCkgIGJmaW5fd3JpdGUxNihETUExNl9ZX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExNl9ZX01PRElGWSgpICAgICBiZmluX3JlYWQxNihETUExNl9ZX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExNl9ZX01PRElGWSh2YWwpIGJmaW5fd3JpdGUxNihETUExNl9ZX01PRElGWSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTZfQ1VSUl9ERVNDX1BUUigpIGJmaW5fcmVhZFBUUihETUExNl9DVVJSX0RFU0NfUFRSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTE2X0NVUlJfREVTQ19QVFIodmFsKSBiZmluX3dyaXRlUFRSKERNQTE2X0NVUlJfREVTQ19QVFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTE2X0NVUlJfQUREUigpICAgIGJmaW5fcmVhZFBUUihETUExNl9DVVJSX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTZfQ1VSUl9BRERSKHZhbCkgYmZpbl93cml0ZVBUUihETUExNl9DVVJSX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTE2X0lSUV9TVEFUVVMoKSAgIGJmaW5fcmVhZDE2KERNQTE2X0lSUV9TVEFUVVMpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTZfSVJRX1NUQVRVUyh2YWwpIGJmaW5fd3JpdGUxNihETUExNl9JUlFfU1RBVFVTLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExNl9QRVJJUEhFUkFMX01BUCgpIGJmaW5fcmVhZDE2KERNQTE2X1BFUklQSEVSQUxfTUFQKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTE2X1BFUklQSEVSQUxfTUFQKHZhbCkgYmZpbl93cml0ZTE2KERNQTE2X1BFUklQSEVSQUxfTUFQLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExNl9DVVJSX1hfQ09VTlQoKSBiZmluX3JlYWQxNihETUExNl9DVVJSX1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTZfQ1VSUl9YX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KERNQTE2X0NVUlJfWF9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTZfQ1VSUl9ZX0NPVU5UKCkgYmZpbl9yZWFkMTYoRE1BMTZfQ1VSUl9ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTE2X0NVUlJfWV9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihETUExNl9DVVJSX1lfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTE3X05FWFRfREVTQ19QVFIoKSBiZmluX3JlYWRQVFIoRE1BMTdfTkVYVF9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExN19ORVhUX0RFU0NfUFRSKHZhbCkgYmZpbl93cml0ZVBUUihETUExN19ORVhUX0RFU0NfUFRSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExN19TVEFSVF9BRERSKCkgICBiZmluX3JlYWRQVFIoRE1BMTdfU1RBUlRfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExN19TVEFSVF9BRERSKHZhbCkgYmZpbl93cml0ZVBUUihETUExN19TVEFSVF9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExN19DT05GSUcoKSAgICAgICBiZmluX3JlYWQxNihETUExN19DT05GSUcpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTdfQ09ORklHKHZhbCkgICBiZmluX3dyaXRlMTYoRE1BMTdfQ09ORklHLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExN19YX0NPVU5UKCkgICAgICBiZmluX3JlYWQxNihETUExN19YX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTE3X1hfQ09VTlQodmFsKSAgYmZpbl93cml0ZTE2KERNQTE3X1hfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTE3X1hfTU9ESUZZKCkgICAgIGJmaW5fcmVhZDE2KERNQTE3X1hfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTE3X1hfTU9ESUZZKHZhbCkgYmZpbl93cml0ZTE2KERNQTE3X1hfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExN19ZX0NPVU5UKCkgICAgICBiZmluX3JlYWQxNihETUExN19ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTE3X1lfQ09VTlQodmFsKSAgYmZpbl93cml0ZTE2KERNQTE3X1lfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTE3X1lfTU9ESUZZKCkgICAgIGJmaW5fcmVhZDE2KERNQTE3X1lfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTE3X1lfTU9ESUZZKHZhbCkgYmZpbl93cml0ZTE2KERNQTE3X1lfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExN19DVVJSX0RFU0NfUFRSKCkgYmZpbl9yZWFkUFRSKERNQTE3X0NVUlJfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTdfQ1VSUl9ERVNDX1BUUih2YWwpIGJmaW5fd3JpdGVQVFIoRE1BMTdfQ1VSUl9ERVNDX1BUUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTdfQ1VSUl9BRERSKCkgICAgYmZpbl9yZWFkUFRSKERNQTE3X0NVUlJfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExN19DVVJSX0FERFIodmFsKSBiZmluX3dyaXRlUFRSKERNQTE3X0NVUlJfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTdfSVJRX1NUQVRVUygpICAgYmZpbl9yZWFkMTYoRE1BMTdfSVJRX1NUQVRVUykKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExN19JUlFfU1RBVFVTKHZhbCkgYmZpbl93cml0ZTE2KERNQTE3X0lSUV9TVEFUVVMsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTE3X1BFUklQSEVSQUxfTUFQKCkgYmZpbl9yZWFkMTYoRE1BMTdfUEVSSVBIRVJBTF9NQVApCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTdfUEVSSVBIRVJBTF9NQVAodmFsKSBiZmluX3dyaXRlMTYoRE1BMTdfUEVSSVBIRVJBTF9NQVAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTE3X0NVUlJfWF9DT1VOVCgpIGJmaW5fcmVhZDE2KERNQTE3X0NVUlJfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExN19DVVJSX1hfQ09VTlQodmFsKSBiZmluX3dyaXRlMTYoRE1BMTdfQ1VSUl9YX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExN19DVVJSX1lfQ09VTlQoKSBiZmluX3JlYWQxNihETUExN19DVVJSX1lfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTdfQ1VSUl9ZX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KERNQTE3X0NVUlJfWV9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMThfTkVYVF9ERVNDX1BUUigpIGJmaW5fcmVhZFBUUihETUExOF9ORVhUX0RFU0NfUFRSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTE4X05FWFRfREVTQ19QVFIodmFsKSBiZmluX3dyaXRlUFRSKERNQTE4X05FWFRfREVTQ19QVFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTE4X1NUQVJUX0FERFIoKSAgIGJmaW5fcmVhZFBUUihETUExOF9TVEFSVF9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTE4X1NUQVJUX0FERFIodmFsKSBiZmluX3dyaXRlUFRSKERNQTE4X1NUQVJUX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTE4X0NPTkZJRygpICAgICAgIGJmaW5fcmVhZDE2KERNQTE4X0NPTkZJRykKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExOF9DT05GSUcodmFsKSAgIGJmaW5fd3JpdGUxNihETUExOF9DT05GSUcsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTE4X1hfQ09VTlQoKSAgICAgIGJmaW5fcmVhZDE2KERNQTE4X1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMThfWF9DT1VOVCh2YWwpICBiZmluX3dyaXRlMTYoRE1BMThfWF9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMThfWF9NT0RJRlkoKSAgICAgYmZpbl9yZWFkMTYoRE1BMThfWF9NT0RJRlkpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMThfWF9NT0RJRlkodmFsKSBiZmluX3dyaXRlMTYoRE1BMThfWF9NT0RJRlksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTE4X1lfQ09VTlQoKSAgICAgIGJmaW5fcmVhZDE2KERNQTE4X1lfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMThfWV9DT1VOVCh2YWwpICBiZmluX3dyaXRlMTYoRE1BMThfWV9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMThfWV9NT0RJRlkoKSAgICAgYmZpbl9yZWFkMTYoRE1BMThfWV9NT0RJRlkpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMThfWV9NT0RJRlkodmFsKSBiZmluX3dyaXRlMTYoRE1BMThfWV9NT0RJRlksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTE4X0NVUlJfREVTQ19QVFIoKSBiZmluX3JlYWRQVFIoRE1BMThfQ1VSUl9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExOF9DVVJSX0RFU0NfUFRSKHZhbCkgYmZpbl93cml0ZVBUUihETUExOF9DVVJSX0RFU0NfUFRSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExOF9DVVJSX0FERFIoKSAgICBiZmluX3JlYWRQVFIoRE1BMThfQ1VSUl9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTE4X0NVUlJfQUREUih2YWwpIGJmaW5fd3JpdGVQVFIoRE1BMThfQ1VSUl9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExOF9JUlFfU1RBVFVTKCkgICBiZmluX3JlYWQxNihETUExOF9JUlFfU1RBVFVTKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTE4X0lSUV9TVEFUVVModmFsKSBiZmluX3dyaXRlMTYoRE1BMThfSVJRX1NUQVRVUywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMThfUEVSSVBIRVJBTF9NQVAoKSBiZmluX3JlYWQxNihETUExOF9QRVJJUEhFUkFMX01BUCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExOF9QRVJJUEhFUkFMX01BUCh2YWwpIGJmaW5fd3JpdGUxNihETUExOF9QRVJJUEhFUkFMX01BUCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMThfQ1VSUl9YX0NPVU5UKCkgYmZpbl9yZWFkMTYoRE1BMThfQ1VSUl9YX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTE4X0NVUlJfWF9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihETUExOF9DVVJSX1hfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTE4X0NVUlJfWV9DT1VOVCgpIGJmaW5fcmVhZDE2KERNQTE4X0NVUlJfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExOF9DVVJSX1lfQ09VTlQodmFsKSBiZmluX3dyaXRlMTYoRE1BMThfQ1VSUl9ZX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExOV9ORVhUX0RFU0NfUFRSKCkgYmZpbl9yZWFkUFRSKERNQTE5X05FWFRfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTlfTkVYVF9ERVNDX1BUUih2YWwpIGJmaW5fd3JpdGVQVFIoRE1BMTlfTkVYVF9ERVNDX1BUUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTlfU1RBUlRfQUREUigpICAgYmZpbl9yZWFkUFRSKERNQTE5X1NUQVJUX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTlfU1RBUlRfQUREUih2YWwpIGJmaW5fd3JpdGVQVFIoRE1BMTlfU1RBUlRfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTlfQ09ORklHKCkgICAgICAgYmZpbl9yZWFkMTYoRE1BMTlfQ09ORklHKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTE5X0NPTkZJRyh2YWwpICAgYmZpbl93cml0ZTE2KERNQTE5X0NPTkZJRywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTlfWF9DT1VOVCgpICAgICAgYmZpbl9yZWFkMTYoRE1BMTlfWF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExOV9YX0NPVU5UKHZhbCkgIGJmaW5fd3JpdGUxNihETUExOV9YX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExOV9YX01PRElGWSgpICAgICBiZmluX3JlYWQxNihETUExOV9YX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExOV9YX01PRElGWSh2YWwpIGJmaW5fd3JpdGUxNihETUExOV9YX01PRElGWSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTlfWV9DT1VOVCgpICAgICAgYmZpbl9yZWFkMTYoRE1BMTlfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExOV9ZX0NPVU5UKHZhbCkgIGJmaW5fd3JpdGUxNihETUExOV9ZX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExOV9ZX01PRElGWSgpICAgICBiZmluX3JlYWQxNihETUExOV9ZX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9ETUExOV9ZX01PRElGWSh2YWwpIGJmaW5fd3JpdGUxNihETUExOV9ZX01PRElGWSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTlfQ1VSUl9ERVNDX1BUUigpIGJmaW5fcmVhZFBUUihETUExOV9DVVJSX0RFU0NfUFRSKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTE5X0NVUlJfREVTQ19QVFIodmFsKSBiZmluX3dyaXRlUFRSKERNQTE5X0NVUlJfREVTQ19QVFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTE5X0NVUlJfQUREUigpICAgIGJmaW5fcmVhZFBUUihETUExOV9DVVJSX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTlfQ1VSUl9BRERSKHZhbCkgYmZpbl93cml0ZVBUUihETUExOV9DVVJSX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0RNQTE5X0lSUV9TVEFUVVMoKSAgIGJmaW5fcmVhZDE2KERNQTE5X0lSUV9TVEFUVVMpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTlfSVJRX1NUQVRVUyh2YWwpIGJmaW5fd3JpdGUxNihETUExOV9JUlFfU1RBVFVTLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExOV9QRVJJUEhFUkFMX01BUCgpIGJmaW5fcmVhZDE2KERNQTE5X1BFUklQSEVSQUxfTUFQKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTE5X1BFUklQSEVSQUxfTUFQKHZhbCkgYmZpbl93cml0ZTE2KERNQTE5X1BFUklQSEVSQUxfTUFQLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ETUExOV9DVVJSX1hfQ09VTlQoKSBiZmluX3JlYWQxNihETUExOV9DVVJSX1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfRE1BMTlfQ1VSUl9YX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KERNQTE5X0NVUlJfWF9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRE1BMTlfQ1VSUl9ZX0NPVU5UKCkgYmZpbl9yZWFkMTYoRE1BMTlfQ1VSUl9ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0RNQTE5X0NVUlJfWV9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihETUExOV9DVVJSX1lfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUEwX0QwX05FWFRfREVTQ19QVFIoKSBiZmluX3JlYWRQVFIoTURNQTBfRDBfTkVYVF9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMF9EMF9ORVhUX0RFU0NfUFRSKHZhbCkgYmZpbl93cml0ZVBUUihNRE1BMF9EMF9ORVhUX0RFU0NfUFRSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BMF9EMF9TVEFSVF9BRERSKCkgYmZpbl9yZWFkUFRSKE1ETUEwX0QwX1NUQVJUX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQTBfRDBfU1RBUlRfQUREUih2YWwpIGJmaW5fd3JpdGVQVFIoTURNQTBfRDBfU1RBUlRfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQTBfRDBfQ09ORklHKCkgICAgYmZpbl9yZWFkMTYoTURNQTBfRDBfQ09ORklHKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUEwX0QwX0NPTkZJRyh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMF9EMF9DT05GSUcsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUEwX0QwX1hfQ09VTlQoKSAgIGJmaW5fcmVhZDE2KE1ETUEwX0QwX1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQTBfRDBfWF9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMF9EMF9YX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BMF9EMF9YX01PRElGWSgpICBiZmluX3JlYWQxNihNRE1BMF9EMF9YX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMF9EMF9YX01PRElGWSh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMF9EMF9YX01PRElGWSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQTBfRDBfWV9DT1VOVCgpICAgYmZpbl9yZWFkMTYoTURNQTBfRDBfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMF9EMF9ZX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KE1ETUEwX0QwX1lfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUEwX0QwX1lfTU9ESUZZKCkgIGJmaW5fcmVhZDE2KE1ETUEwX0QwX1lfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUEwX0QwX1lfTU9ESUZZKHZhbCkgYmZpbl93cml0ZTE2KE1ETUEwX0QwX1lfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BMF9EMF9DVVJSX0RFU0NfUFRSKCkgYmZpbl9yZWFkUFRSKE1ETUEwX0QwX0NVUlJfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQTBfRDBfQ1VSUl9ERVNDX1BUUih2YWwpIGJmaW5fd3JpdGVQVFIoTURNQTBfRDBfQ1VSUl9ERVNDX1BUUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQTBfRDBfQ1VSUl9BRERSKCkgYmZpbl9yZWFkUFRSKE1ETUEwX0QwX0NVUlJfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMF9EMF9DVVJSX0FERFIodmFsKSBiZmluX3dyaXRlUFRSKE1ETUEwX0QwX0NVUlJfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQTBfRDBfSVJRX1NUQVRVUygpIGJmaW5fcmVhZDE2KE1ETUEwX0QwX0lSUV9TVEFUVVMpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQTBfRDBfSVJRX1NUQVRVUyh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMF9EMF9JUlFfU1RBVFVTLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BMF9EMF9QRVJJUEhFUkFMX01BUCgpIGJmaW5fcmVhZDE2KE1ETUEwX0QwX1BFUklQSEVSQUxfTUFQKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUEwX0QwX1BFUklQSEVSQUxfTUFQKHZhbCkgYmZpbl93cml0ZTE2KE1ETUEwX0QwX1BFUklQSEVSQUxfTUFQLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BMF9EMF9DVVJSX1hfQ09VTlQoKSBiZmluX3JlYWQxNihNRE1BMF9EMF9DVVJSX1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQTBfRDBfQ1VSUl9YX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KE1ETUEwX0QwX0NVUlJfWF9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQTBfRDBfQ1VSUl9ZX0NPVU5UKCkgYmZpbl9yZWFkMTYoTURNQTBfRDBfQ1VSUl9ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUEwX0QwX0NVUlJfWV9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMF9EMF9DVVJSX1lfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUEwX1MwX05FWFRfREVTQ19QVFIoKSBiZmluX3JlYWRQVFIoTURNQTBfUzBfTkVYVF9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMF9TMF9ORVhUX0RFU0NfUFRSKHZhbCkgYmZpbl93cml0ZVBUUihNRE1BMF9TMF9ORVhUX0RFU0NfUFRSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BMF9TMF9TVEFSVF9BRERSKCkgYmZpbl9yZWFkUFRSKE1ETUEwX1MwX1NUQVJUX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQTBfUzBfU1RBUlRfQUREUih2YWwpIGJmaW5fd3JpdGVQVFIoTURNQTBfUzBfU1RBUlRfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQTBfUzBfQ09ORklHKCkgICAgYmZpbl9yZWFkMTYoTURNQTBfUzBfQ09ORklHKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUEwX1MwX0NPTkZJRyh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMF9TMF9DT05GSUcsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUEwX1MwX1hfQ09VTlQoKSAgIGJmaW5fcmVhZDE2KE1ETUEwX1MwX1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQTBfUzBfWF9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMF9TMF9YX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BMF9TMF9YX01PRElGWSgpICBiZmluX3JlYWQxNihNRE1BMF9TMF9YX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMF9TMF9YX01PRElGWSh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMF9TMF9YX01PRElGWSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQTBfUzBfWV9DT1VOVCgpICAgYmZpbl9yZWFkMTYoTURNQTBfUzBfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMF9TMF9ZX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KE1ETUEwX1MwX1lfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUEwX1MwX1lfTU9ESUZZKCkgIGJmaW5fcmVhZDE2KE1ETUEwX1MwX1lfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUEwX1MwX1lfTU9ESUZZKHZhbCkgYmZpbl93cml0ZTE2KE1ETUEwX1MwX1lfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BMF9TMF9DVVJSX0RFU0NfUFRSKCkgYmZpbl9yZWFkUFRSKE1ETUEwX1MwX0NVUlJfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQTBfUzBfQ1VSUl9ERVNDX1BUUih2YWwpIGJmaW5fd3JpdGVQVFIoTURNQTBfUzBfQ1VSUl9ERVNDX1BUUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQTBfUzBfQ1VSUl9BRERSKCkgYmZpbl9yZWFkUFRSKE1ETUEwX1MwX0NVUlJfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMF9TMF9DVVJSX0FERFIodmFsKSBiZmluX3dyaXRlUFRSKE1ETUEwX1MwX0NVUlJfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQTBfUzBfSVJRX1NUQVRVUygpIGJmaW5fcmVhZDE2KE1ETUEwX1MwX0lSUV9TVEFUVVMpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQTBfUzBfSVJRX1NUQVRVUyh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMF9TMF9JUlFfU1RBVFVTLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BMF9TMF9QRVJJUEhFUkFMX01BUCgpIGJmaW5fcmVhZDE2KE1ETUEwX1MwX1BFUklQSEVSQUxfTUFQKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUEwX1MwX1BFUklQSEVSQUxfTUFQKHZhbCkgYmZpbl93cml0ZTE2KE1ETUEwX1MwX1BFUklQSEVSQUxfTUFQLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BMF9TMF9DVVJSX1hfQ09VTlQoKSBiZmluX3JlYWQxNihNRE1BMF9TMF9DVVJSX1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQTBfUzBfQ1VSUl9YX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KE1ETUEwX1MwX0NVUlJfWF9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQTBfUzBfQ1VSUl9ZX0NPVU5UKCkgYmZpbl9yZWFkMTYoTURNQTBfUzBfQ1VSUl9ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUEwX1MwX0NVUlJfWV9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMF9TMF9DVVJSX1lfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUEwX0QxX05FWFRfREVTQ19QVFIoKSBiZmluX3JlYWRQVFIoTURNQTBfRDFfTkVYVF9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMF9EMV9ORVhUX0RFU0NfUFRSKHZhbCkgYmZpbl93cml0ZVBUUihNRE1BMF9EMV9ORVhUX0RFU0NfUFRSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BMF9EMV9TVEFSVF9BRERSKCkgYmZpbl9yZWFkUFRSKE1ETUEwX0QxX1NUQVJUX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQTBfRDFfU1RBUlRfQUREUih2YWwpIGJmaW5fd3JpdGVQVFIoTURNQTBfRDFfU1RBUlRfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQTBfRDFfQ09ORklHKCkgICAgYmZpbl9yZWFkMTYoTURNQTBfRDFfQ09ORklHKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUEwX0QxX0NPTkZJRyh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMF9EMV9DT05GSUcsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUEwX0QxX1hfQ09VTlQoKSAgIGJmaW5fcmVhZDE2KE1ETUEwX0QxX1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQTBfRDFfWF9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMF9EMV9YX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BMF9EMV9YX01PRElGWSgpICBiZmluX3JlYWQxNihNRE1BMF9EMV9YX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMF9EMV9YX01PRElGWSh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMF9EMV9YX01PRElGWSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQTBfRDFfWV9DT1VOVCgpICAgYmZpbl9yZWFkMTYoTURNQTBfRDFfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMF9EMV9ZX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KE1ETUEwX0QxX1lfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUEwX0QxX1lfTU9ESUZZKCkgIGJmaW5fcmVhZDE2KE1ETUEwX0QxX1lfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUEwX0QxX1lfTU9ESUZZKHZhbCkgYmZpbl93cml0ZTE2KE1ETUEwX0QxX1lfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BMF9EMV9DVVJSX0RFU0NfUFRSKCkgYmZpbl9yZWFkUFRSKE1ETUEwX0QxX0NVUlJfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQTBfRDFfQ1VSUl9ERVNDX1BUUih2YWwpIGJmaW5fd3JpdGVQVFIoTURNQTBfRDFfQ1VSUl9ERVNDX1BUUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQTBfRDFfQ1VSUl9BRERSKCkgYmZpbl9yZWFkUFRSKE1ETUEwX0QxX0NVUlJfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMF9EMV9DVVJSX0FERFIodmFsKSBiZmluX3dyaXRlUFRSKE1ETUEwX0QxX0NVUlJfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQTBfRDFfSVJRX1NUQVRVUygpIGJmaW5fcmVhZDE2KE1ETUEwX0QxX0lSUV9TVEFUVVMpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQTBfRDFfSVJRX1NUQVRVUyh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMF9EMV9JUlFfU1RBVFVTLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BMF9EMV9QRVJJUEhFUkFMX01BUCgpIGJmaW5fcmVhZDE2KE1ETUEwX0QxX1BFUklQSEVSQUxfTUFQKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUEwX0QxX1BFUklQSEVSQUxfTUFQKHZhbCkgYmZpbl93cml0ZTE2KE1ETUEwX0QxX1BFUklQSEVSQUxfTUFQLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BMF9EMV9DVVJSX1hfQ09VTlQoKSBiZmluX3JlYWQxNihNRE1BMF9EMV9DVVJSX1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQTBfRDFfQ1VSUl9YX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KE1ETUEwX0QxX0NVUlJfWF9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQTBfRDFfQ1VSUl9ZX0NPVU5UKCkgYmZpbl9yZWFkMTYoTURNQTBfRDFfQ1VSUl9ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUEwX0QxX0NVUlJfWV9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMF9EMV9DVVJSX1lfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUEwX1MxX05FWFRfREVTQ19QVFIoKSBiZmluX3JlYWRQVFIoTURNQTBfUzFfTkVYVF9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMF9TMV9ORVhUX0RFU0NfUFRSKHZhbCkgYmZpbl93cml0ZVBUUihNRE1BMF9TMV9ORVhUX0RFU0NfUFRSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BMF9TMV9TVEFSVF9BRERSKCkgYmZpbl9yZWFkUFRSKE1ETUEwX1MxX1NUQVJUX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQTBfUzFfU1RBUlRfQUREUih2YWwpIGJmaW5fd3JpdGVQVFIoTURNQTBfUzFfU1RBUlRfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQTBfUzFfQ09ORklHKCkgICAgYmZpbl9yZWFkMTYoTURNQTBfUzFfQ09ORklHKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUEwX1MxX0NPTkZJRyh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMF9TMV9DT05GSUcsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUEwX1MxX1hfQ09VTlQoKSAgIGJmaW5fcmVhZDE2KE1ETUEwX1MxX1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQTBfUzFfWF9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMF9TMV9YX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BMF9TMV9YX01PRElGWSgpICBiZmluX3JlYWQxNihNRE1BMF9TMV9YX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMF9TMV9YX01PRElGWSh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMF9TMV9YX01PRElGWSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQTBfUzFfWV9DT1VOVCgpICAgYmZpbl9yZWFkMTYoTURNQTBfUzFfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMF9TMV9ZX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KE1ETUEwX1MxX1lfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUEwX1MxX1lfTU9ESUZZKCkgIGJmaW5fcmVhZDE2KE1ETUEwX1MxX1lfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUEwX1MxX1lfTU9ESUZZKHZhbCkgYmZpbl93cml0ZTE2KE1ETUEwX1MxX1lfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BMF9TMV9DVVJSX0RFU0NfUFRSKCkgYmZpbl9yZWFkUFRSKE1ETUEwX1MxX0NVUlJfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQTBfUzFfQ1VSUl9ERVNDX1BUUih2YWwpIGJmaW5fd3JpdGVQVFIoTURNQTBfUzFfQ1VSUl9ERVNDX1BUUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQTBfUzFfQ1VSUl9BRERSKCkgYmZpbl9yZWFkUFRSKE1ETUEwX1MxX0NVUlJfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMF9TMV9DVVJSX0FERFIodmFsKSBiZmluX3dyaXRlUFRSKE1ETUEwX1MxX0NVUlJfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQTBfUzFfSVJRX1NUQVRVUygpIGJmaW5fcmVhZDE2KE1ETUEwX1MxX0lSUV9TVEFUVVMpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQTBfUzFfSVJRX1NUQVRVUyh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMF9TMV9JUlFfU1RBVFVTLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BMF9TMV9QRVJJUEhFUkFMX01BUCgpIGJmaW5fcmVhZDE2KE1ETUEwX1MxX1BFUklQSEVSQUxfTUFQKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUEwX1MxX1BFUklQSEVSQUxfTUFQKHZhbCkgYmZpbl93cml0ZTE2KE1ETUEwX1MxX1BFUklQSEVSQUxfTUFQLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BMF9TMV9DVVJSX1hfQ09VTlQoKSBiZmluX3JlYWQxNihNRE1BMF9TMV9DVVJSX1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQTBfUzFfQ1VSUl9YX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KE1ETUEwX1MxX0NVUlJfWF9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQTBfUzFfQ1VSUl9ZX0NPVU5UKCkgYmZpbl9yZWFkMTYoTURNQTBfUzFfQ1VSUl9ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUEwX1MxX0NVUlJfWV9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMF9TMV9DVVJSX1lfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUExX0QwX05FWFRfREVTQ19QVFIoKSBiZmluX3JlYWRQVFIoTURNQTFfRDBfTkVYVF9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMV9EMF9ORVhUX0RFU0NfUFRSKHZhbCkgYmZpbl93cml0ZVBUUihNRE1BMV9EMF9ORVhUX0RFU0NfUFRSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BMV9EMF9TVEFSVF9BRERSKCkgYmZpbl9yZWFkUFRSKE1ETUExX0QwX1NUQVJUX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQTFfRDBfU1RBUlRfQUREUih2YWwpIGJmaW5fd3JpdGVQVFIoTURNQTFfRDBfU1RBUlRfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQTFfRDBfQ09ORklHKCkgICAgYmZpbl9yZWFkMTYoTURNQTFfRDBfQ09ORklHKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUExX0QwX0NPTkZJRyh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMV9EMF9DT05GSUcsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUExX0QwX1hfQ09VTlQoKSAgIGJmaW5fcmVhZDE2KE1ETUExX0QwX1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQTFfRDBfWF9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMV9EMF9YX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BMV9EMF9YX01PRElGWSgpICBiZmluX3JlYWQxNihNRE1BMV9EMF9YX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMV9EMF9YX01PRElGWSh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMV9EMF9YX01PRElGWSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQTFfRDBfWV9DT1VOVCgpICAgYmZpbl9yZWFkMTYoTURNQTFfRDBfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMV9EMF9ZX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KE1ETUExX0QwX1lfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUExX0QwX1lfTU9ESUZZKCkgIGJmaW5fcmVhZDE2KE1ETUExX0QwX1lfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUExX0QwX1lfTU9ESUZZKHZhbCkgYmZpbl93cml0ZTE2KE1ETUExX0QwX1lfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BMV9EMF9DVVJSX0RFU0NfUFRSKCkgYmZpbl9yZWFkUFRSKE1ETUExX0QwX0NVUlJfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQTFfRDBfQ1VSUl9ERVNDX1BUUih2YWwpIGJmaW5fd3JpdGVQVFIoTURNQTFfRDBfQ1VSUl9ERVNDX1BUUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQTFfRDBfQ1VSUl9BRERSKCkgYmZpbl9yZWFkUFRSKE1ETUExX0QwX0NVUlJfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMV9EMF9DVVJSX0FERFIodmFsKSBiZmluX3dyaXRlUFRSKE1ETUExX0QwX0NVUlJfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQTFfRDBfSVJRX1NUQVRVUygpIGJmaW5fcmVhZDE2KE1ETUExX0QwX0lSUV9TVEFUVVMpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQTFfRDBfSVJRX1NUQVRVUyh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMV9EMF9JUlFfU1RBVFVTLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BMV9EMF9QRVJJUEhFUkFMX01BUCgpIGJmaW5fcmVhZDE2KE1ETUExX0QwX1BFUklQSEVSQUxfTUFQKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUExX0QwX1BFUklQSEVSQUxfTUFQKHZhbCkgYmZpbl93cml0ZTE2KE1ETUExX0QwX1BFUklQSEVSQUxfTUFQLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BMV9EMF9DVVJSX1hfQ09VTlQoKSBiZmluX3JlYWQxNihNRE1BMV9EMF9DVVJSX1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQTFfRDBfQ1VSUl9YX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KE1ETUExX0QwX0NVUlJfWF9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQTFfRDBfQ1VSUl9ZX0NPVU5UKCkgYmZpbl9yZWFkMTYoTURNQTFfRDBfQ1VSUl9ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUExX0QwX0NVUlJfWV9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMV9EMF9DVVJSX1lfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUExX1MwX05FWFRfREVTQ19QVFIoKSBiZmluX3JlYWRQVFIoTURNQTFfUzBfTkVYVF9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMV9TMF9ORVhUX0RFU0NfUFRSKHZhbCkgYmZpbl93cml0ZVBUUihNRE1BMV9TMF9ORVhUX0RFU0NfUFRSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BMV9TMF9TVEFSVF9BRERSKCkgYmZpbl9yZWFkUFRSKE1ETUExX1MwX1NUQVJUX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQTFfUzBfU1RBUlRfQUREUih2YWwpIGJmaW5fd3JpdGVQVFIoTURNQTFfUzBfU1RBUlRfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQTFfUzBfQ09ORklHKCkgICAgYmZpbl9yZWFkMTYoTURNQTFfUzBfQ09ORklHKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUExX1MwX0NPTkZJRyh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMV9TMF9DT05GSUcsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUExX1MwX1hfQ09VTlQoKSAgIGJmaW5fcmVhZDE2KE1ETUExX1MwX1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQTFfUzBfWF9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMV9TMF9YX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BMV9TMF9YX01PRElGWSgpICBiZmluX3JlYWQxNihNRE1BMV9TMF9YX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMV9TMF9YX01PRElGWSh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMV9TMF9YX01PRElGWSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQTFfUzBfWV9DT1VOVCgpICAgYmZpbl9yZWFkMTYoTURNQTFfUzBfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMV9TMF9ZX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KE1ETUExX1MwX1lfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUExX1MwX1lfTU9ESUZZKCkgIGJmaW5fcmVhZDE2KE1ETUExX1MwX1lfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUExX1MwX1lfTU9ESUZZKHZhbCkgYmZpbl93cml0ZTE2KE1ETUExX1MwX1lfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BMV9TMF9DVVJSX0RFU0NfUFRSKCkgYmZpbl9yZWFkUFRSKE1ETUExX1MwX0NVUlJfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQTFfUzBfQ1VSUl9ERVNDX1BUUih2YWwpIGJmaW5fd3JpdGVQVFIoTURNQTFfUzBfQ1VSUl9ERVNDX1BUUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQTFfUzBfQ1VSUl9BRERSKCkgYmZpbl9yZWFkUFRSKE1ETUExX1MwX0NVUlJfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMV9TMF9DVVJSX0FERFIodmFsKSBiZmluX3dyaXRlUFRSKE1ETUExX1MwX0NVUlJfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQTFfUzBfSVJRX1NUQVRVUygpIGJmaW5fcmVhZDE2KE1ETUExX1MwX0lSUV9TVEFUVVMpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQTFfUzBfSVJRX1NUQVRVUyh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMV9TMF9JUlFfU1RBVFVTLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BMV9TMF9QRVJJUEhFUkFMX01BUCgpIGJmaW5fcmVhZDE2KE1ETUExX1MwX1BFUklQSEVSQUxfTUFQKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUExX1MwX1BFUklQSEVSQUxfTUFQKHZhbCkgYmZpbl93cml0ZTE2KE1ETUExX1MwX1BFUklQSEVSQUxfTUFQLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BMV9TMF9DVVJSX1hfQ09VTlQoKSBiZmluX3JlYWQxNihNRE1BMV9TMF9DVVJSX1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQTFfUzBfQ1VSUl9YX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KE1ETUExX1MwX0NVUlJfWF9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQTFfUzBfQ1VSUl9ZX0NPVU5UKCkgYmZpbl9yZWFkMTYoTURNQTFfUzBfQ1VSUl9ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUExX1MwX0NVUlJfWV9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMV9TMF9DVVJSX1lfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUExX0QxX05FWFRfREVTQ19QVFIoKSBiZmluX3JlYWRQVFIoTURNQTFfRDFfTkVYVF9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMV9EMV9ORVhUX0RFU0NfUFRSKHZhbCkgYmZpbl93cml0ZVBUUihNRE1BMV9EMV9ORVhUX0RFU0NfUFRSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BMV9EMV9TVEFSVF9BRERSKCkgYmZpbl9yZWFkUFRSKE1ETUExX0QxX1NUQVJUX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQTFfRDFfU1RBUlRfQUREUih2YWwpIGJmaW5fd3JpdGVQVFIoTURNQTFfRDFfU1RBUlRfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQTFfRDFfQ09ORklHKCkgICAgYmZpbl9yZWFkMTYoTURNQTFfRDFfQ09ORklHKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUExX0QxX0NPTkZJRyh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMV9EMV9DT05GSUcsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUExX0QxX1hfQ09VTlQoKSAgIGJmaW5fcmVhZDE2KE1ETUExX0QxX1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQTFfRDFfWF9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMV9EMV9YX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BMV9EMV9YX01PRElGWSgpICBiZmluX3JlYWQxNihNRE1BMV9EMV9YX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMV9EMV9YX01PRElGWSh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMV9EMV9YX01PRElGWSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQTFfRDFfWV9DT1VOVCgpICAgYmZpbl9yZWFkMTYoTURNQTFfRDFfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMV9EMV9ZX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KE1ETUExX0QxX1lfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUExX0QxX1lfTU9ESUZZKCkgIGJmaW5fcmVhZDE2KE1ETUExX0QxX1lfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUExX0QxX1lfTU9ESUZZKHZhbCkgYmZpbl93cml0ZTE2KE1ETUExX0QxX1lfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BMV9EMV9DVVJSX0RFU0NfUFRSKCkgYmZpbl9yZWFkUFRSKE1ETUExX0QxX0NVUlJfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQTFfRDFfQ1VSUl9ERVNDX1BUUih2YWwpIGJmaW5fd3JpdGVQVFIoTURNQTFfRDFfQ1VSUl9ERVNDX1BUUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQTFfRDFfQ1VSUl9BRERSKCkgYmZpbl9yZWFkUFRSKE1ETUExX0QxX0NVUlJfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMV9EMV9DVVJSX0FERFIodmFsKSBiZmluX3dyaXRlUFRSKE1ETUExX0QxX0NVUlJfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQTFfRDFfSVJRX1NUQVRVUygpIGJmaW5fcmVhZDE2KE1ETUExX0QxX0lSUV9TVEFUVVMpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQTFfRDFfSVJRX1NUQVRVUyh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMV9EMV9JUlFfU1RBVFVTLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BMV9EMV9QRVJJUEhFUkFMX01BUCgpIGJmaW5fcmVhZDE2KE1ETUExX0QxX1BFUklQSEVSQUxfTUFQKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUExX0QxX1BFUklQSEVSQUxfTUFQKHZhbCkgYmZpbl93cml0ZTE2KE1ETUExX0QxX1BFUklQSEVSQUxfTUFQLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BMV9EMV9DVVJSX1hfQ09VTlQoKSBiZmluX3JlYWQxNihNRE1BMV9EMV9DVVJSX1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQTFfRDFfQ1VSUl9YX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KE1ETUExX0QxX0NVUlJfWF9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQTFfRDFfQ1VSUl9ZX0NPVU5UKCkgYmZpbl9yZWFkMTYoTURNQTFfRDFfQ1VSUl9ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUExX0QxX0NVUlJfWV9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMV9EMV9DVVJSX1lfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUExX1MxX05FWFRfREVTQ19QVFIoKSBiZmluX3JlYWRQVFIoTURNQTFfUzFfTkVYVF9ERVNDX1BUUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMV9TMV9ORVhUX0RFU0NfUFRSKHZhbCkgYmZpbl93cml0ZVBUUihNRE1BMV9TMV9ORVhUX0RFU0NfUFRSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BMV9TMV9TVEFSVF9BRERSKCkgYmZpbl9yZWFkUFRSKE1ETUExX1MxX1NUQVJUX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQTFfUzFfU1RBUlRfQUREUih2YWwpIGJmaW5fd3JpdGVQVFIoTURNQTFfUzFfU1RBUlRfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQTFfUzFfQ09ORklHKCkgICAgYmZpbl9yZWFkMTYoTURNQTFfUzFfQ09ORklHKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUExX1MxX0NPTkZJRyh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMV9TMV9DT05GSUcsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUExX1MxX1hfQ09VTlQoKSAgIGJmaW5fcmVhZDE2KE1ETUExX1MxX1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQTFfUzFfWF9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMV9TMV9YX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BMV9TMV9YX01PRElGWSgpICBiZmluX3JlYWQxNihNRE1BMV9TMV9YX01PRElGWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMV9TMV9YX01PRElGWSh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMV9TMV9YX01PRElGWSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQTFfUzFfWV9DT1VOVCgpICAgYmZpbl9yZWFkMTYoTURNQTFfUzFfWV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMV9TMV9ZX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KE1ETUExX1MxX1lfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01ETUExX1MxX1lfTU9ESUZZKCkgIGJmaW5fcmVhZDE2KE1ETUExX1MxX1lfTU9ESUZZKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUExX1MxX1lfTU9ESUZZKHZhbCkgYmZpbl93cml0ZTE2KE1ETUExX1MxX1lfTU9ESUZZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BMV9TMV9DVVJSX0RFU0NfUFRSKCkgYmZpbl9yZWFkUFRSKE1ETUExX1MxX0NVUlJfREVTQ19QVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQTFfUzFfQ1VSUl9ERVNDX1BUUih2YWwpIGJmaW5fd3JpdGVQVFIoTURNQTFfUzFfQ1VSUl9ERVNDX1BUUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQTFfUzFfQ1VSUl9BRERSKCkgYmZpbl9yZWFkUFRSKE1ETUExX1MxX0NVUlJfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NRE1BMV9TMV9DVVJSX0FERFIodmFsKSBiZmluX3dyaXRlUFRSKE1ETUExX1MxX0NVUlJfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQTFfUzFfSVJRX1NUQVRVUygpIGJmaW5fcmVhZDE2KE1ETUExX1MxX0lSUV9TVEFUVVMpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQTFfUzFfSVJRX1NUQVRVUyh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMV9TMV9JUlFfU1RBVFVTLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BMV9TMV9QRVJJUEhFUkFMX01BUCgpIGJmaW5fcmVhZDE2KE1ETUExX1MxX1BFUklQSEVSQUxfTUFQKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUExX1MxX1BFUklQSEVSQUxfTUFQKHZhbCkgYmZpbl93cml0ZTE2KE1ETUExX1MxX1BFUklQSEVSQUxfTUFQLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NRE1BMV9TMV9DVVJSX1hfQ09VTlQoKSBiZmluX3JlYWQxNihNRE1BMV9TMV9DVVJSX1hfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfTURNQTFfUzFfQ1VSUl9YX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KE1ETUExX1MxX0NVUlJfWF9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTURNQTFfUzFfQ1VSUl9ZX0NPVU5UKCkgYmZpbl9yZWFkMTYoTURNQTFfUzFfQ1VSUl9ZX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX01ETUExX1MxX0NVUlJfWV9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihNRE1BMV9TMV9DVVJSX1lfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BQSV9DT05UUk9MKCkgICAgICAgIGJmaW5fcmVhZDE2KFBQSV9DT05UUk9MKQorI2RlZmluZSBiZmluX3dyaXRlX1BQSV9DT05UUk9MKHZhbCkgICAgYmZpbl93cml0ZTE2KFBQSV9DT05UUk9MLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QUElfU1RBVFVTKCkgICAgICAgICBiZmluX3JlYWQxNihQUElfU1RBVFVTKQorI2RlZmluZSBiZmluX3dyaXRlX1BQSV9TVEFUVVModmFsKSAgICAgYmZpbl93cml0ZTE2KFBQSV9TVEFUVVMsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BQSV9ERUxBWSgpICAgICAgICAgIGJmaW5fcmVhZDE2KFBQSV9ERUxBWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9QUElfREVMQVkodmFsKSAgICAgIGJmaW5fd3JpdGUxNihQUElfREVMQVksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BQSV9DT1VOVCgpICAgICAgICAgIGJmaW5fcmVhZDE2KFBQSV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9QUElfQ09VTlQodmFsKSAgICAgIGJmaW5fd3JpdGUxNihQUElfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BQSV9GUkFNRSgpICAgICAgICAgIGJmaW5fcmVhZDE2KFBQSV9GUkFNRSkKKyNkZWZpbmUgYmZpbl93cml0ZV9QUElfRlJBTUUodmFsKSAgICAgIGJmaW5fd3JpdGUxNihQUElfRlJBTUUsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1RXSTBfQ0xLRElWKCkgICAgICAgIGJmaW5fcmVhZDE2KFRXSTBfQ0xLRElWKQorI2RlZmluZSBiZmluX3dyaXRlX1RXSTBfQ0xLRElWKHZhbCkgICAgYmZpbl93cml0ZTE2KFRXSTBfQ0xLRElWLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9UV0kwX0NPTlRST0woKSAgICAgICBiZmluX3JlYWQxNihUV0kwX0NPTlRST0wpCisjZGVmaW5lIGJmaW5fd3JpdGVfVFdJMF9DT05UUk9MKHZhbCkgICBiZmluX3dyaXRlMTYoVFdJMF9DT05UUk9MLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9UV0kwX1NMQVZFX0NUUkwoKSAgICBiZmluX3JlYWQxNihUV0kwX1NMQVZFX0NUUkwpCisjZGVmaW5lIGJmaW5fd3JpdGVfVFdJMF9TTEFWRV9DVFJMKHZhbCkgYmZpbl93cml0ZTE2KFRXSTBfU0xBVkVfQ1RSTCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVFdJMF9TTEFWRV9TVEFUKCkgICAgYmZpbl9yZWFkMTYoVFdJMF9TTEFWRV9TVEFUKQorI2RlZmluZSBiZmluX3dyaXRlX1RXSTBfU0xBVkVfU1RBVCh2YWwpIGJmaW5fd3JpdGUxNihUV0kwX1NMQVZFX1NUQVQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1RXSTBfU0xBVkVfQUREUigpICAgIGJmaW5fcmVhZDE2KFRXSTBfU0xBVkVfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9UV0kwX1NMQVZFX0FERFIodmFsKSBiZmluX3dyaXRlMTYoVFdJMF9TTEFWRV9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9UV0kwX01BU1RFUl9DVEwoKSAgICBiZmluX3JlYWQxNihUV0kwX01BU1RFUl9DVEwpCisjZGVmaW5lIGJmaW5fd3JpdGVfVFdJMF9NQVNURVJfQ1RMKHZhbCkgYmZpbl93cml0ZTE2KFRXSTBfTUFTVEVSX0NUTCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVFdJMF9NQVNURVJfU1RBVCgpICAgYmZpbl9yZWFkMTYoVFdJMF9NQVNURVJfU1RBVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9UV0kwX01BU1RFUl9TVEFUKHZhbCkgYmZpbl93cml0ZTE2KFRXSTBfTUFTVEVSX1NUQVQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1RXSTBfTUFTVEVSX0FERFIoKSAgIGJmaW5fcmVhZDE2KFRXSTBfTUFTVEVSX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfVFdJMF9NQVNURVJfQUREUih2YWwpIGJmaW5fd3JpdGUxNihUV0kwX01BU1RFUl9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9UV0kwX0lOVF9TVEFUKCkgICAgICBiZmluX3JlYWQxNihUV0kwX0lOVF9TVEFUKQorI2RlZmluZSBiZmluX3dyaXRlX1RXSTBfSU5UX1NUQVQodmFsKSAgYmZpbl93cml0ZTE2KFRXSTBfSU5UX1NUQVQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1RXSTBfSU5UX01BU0soKSAgICAgIGJmaW5fcmVhZDE2KFRXSTBfSU5UX01BU0spCisjZGVmaW5lIGJmaW5fd3JpdGVfVFdJMF9JTlRfTUFTSyh2YWwpICBiZmluX3dyaXRlMTYoVFdJMF9JTlRfTUFTSywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVFdJMF9GSUZPX0NUTCgpICAgICAgYmZpbl9yZWFkMTYoVFdJMF9GSUZPX0NUTCkKKyNkZWZpbmUgYmZpbl93cml0ZV9UV0kwX0ZJRk9fQ1RMKHZhbCkgIGJmaW5fd3JpdGUxNihUV0kwX0ZJRk9fQ1RMLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9UV0kwX0ZJRk9fU1RBVCgpICAgICBiZmluX3JlYWQxNihUV0kwX0ZJRk9fU1RBVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9UV0kwX0ZJRk9fU1RBVCh2YWwpIGJmaW5fd3JpdGUxNihUV0kwX0ZJRk9fU1RBVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVFdJMF9YTVRfREFUQTgoKSAgICAgYmZpbl9yZWFkMTYoVFdJMF9YTVRfREFUQTgpCisjZGVmaW5lIGJmaW5fd3JpdGVfVFdJMF9YTVRfREFUQTgodmFsKSBiZmluX3dyaXRlMTYoVFdJMF9YTVRfREFUQTgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1RXSTBfWE1UX0RBVEExNigpICAgIGJmaW5fcmVhZDE2KFRXSTBfWE1UX0RBVEExNikKKyNkZWZpbmUgYmZpbl93cml0ZV9UV0kwX1hNVF9EQVRBMTYodmFsKSBiZmluX3dyaXRlMTYoVFdJMF9YTVRfREFUQTE2LCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9UV0kwX1JDVl9EQVRBOCgpICAgICBiZmluX3JlYWQxNihUV0kwX1JDVl9EQVRBOCkKKyNkZWZpbmUgYmZpbl93cml0ZV9UV0kwX1JDVl9EQVRBOCh2YWwpIGJmaW5fd3JpdGUxNihUV0kwX1JDVl9EQVRBOCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVFdJMF9SQ1ZfREFUQTE2KCkgICAgYmZpbl9yZWFkMTYoVFdJMF9SQ1ZfREFUQTE2KQorI2RlZmluZSBiZmluX3dyaXRlX1RXSTBfUkNWX0RBVEExNih2YWwpIGJmaW5fd3JpdGUxNihUV0kwX1JDVl9EQVRBMTYsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1RXSTFfQ0xLRElWKCkgICAgICAgIGJmaW5fcmVhZDE2KFRXSTFfQ0xLRElWKQorI2RlZmluZSBiZmluX3dyaXRlX1RXSTFfQ0xLRElWKHZhbCkgICAgYmZpbl93cml0ZTE2KFRXSTFfQ0xLRElWLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9UV0kxX0NPTlRST0woKSAgICAgICBiZmluX3JlYWQxNihUV0kxX0NPTlRST0wpCisjZGVmaW5lIGJmaW5fd3JpdGVfVFdJMV9DT05UUk9MKHZhbCkgICBiZmluX3dyaXRlMTYoVFdJMV9DT05UUk9MLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9UV0kxX1NMQVZFX0NUUkwoKSAgICBiZmluX3JlYWQxNihUV0kxX1NMQVZFX0NUUkwpCisjZGVmaW5lIGJmaW5fd3JpdGVfVFdJMV9TTEFWRV9DVFJMKHZhbCkgYmZpbl93cml0ZTE2KFRXSTFfU0xBVkVfQ1RSTCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVFdJMV9TTEFWRV9TVEFUKCkgICAgYmZpbl9yZWFkMTYoVFdJMV9TTEFWRV9TVEFUKQorI2RlZmluZSBiZmluX3dyaXRlX1RXSTFfU0xBVkVfU1RBVCh2YWwpIGJmaW5fd3JpdGUxNihUV0kxX1NMQVZFX1NUQVQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1RXSTFfU0xBVkVfQUREUigpICAgIGJmaW5fcmVhZDE2KFRXSTFfU0xBVkVfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9UV0kxX1NMQVZFX0FERFIodmFsKSBiZmluX3dyaXRlMTYoVFdJMV9TTEFWRV9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9UV0kxX01BU1RFUl9DVEwoKSAgICBiZmluX3JlYWQxNihUV0kxX01BU1RFUl9DVEwpCisjZGVmaW5lIGJmaW5fd3JpdGVfVFdJMV9NQVNURVJfQ1RMKHZhbCkgYmZpbl93cml0ZTE2KFRXSTFfTUFTVEVSX0NUTCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVFdJMV9NQVNURVJfU1RBVCgpICAgYmZpbl9yZWFkMTYoVFdJMV9NQVNURVJfU1RBVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9UV0kxX01BU1RFUl9TVEFUKHZhbCkgYmZpbl93cml0ZTE2KFRXSTFfTUFTVEVSX1NUQVQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1RXSTFfTUFTVEVSX0FERFIoKSAgIGJmaW5fcmVhZDE2KFRXSTFfTUFTVEVSX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfVFdJMV9NQVNURVJfQUREUih2YWwpIGJmaW5fd3JpdGUxNihUV0kxX01BU1RFUl9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9UV0kxX0lOVF9TVEFUKCkgICAgICBiZmluX3JlYWQxNihUV0kxX0lOVF9TVEFUKQorI2RlZmluZSBiZmluX3dyaXRlX1RXSTFfSU5UX1NUQVQodmFsKSAgYmZpbl93cml0ZTE2KFRXSTFfSU5UX1NUQVQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1RXSTFfSU5UX01BU0soKSAgICAgIGJmaW5fcmVhZDE2KFRXSTFfSU5UX01BU0spCisjZGVmaW5lIGJmaW5fd3JpdGVfVFdJMV9JTlRfTUFTSyh2YWwpICBiZmluX3dyaXRlMTYoVFdJMV9JTlRfTUFTSywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVFdJMV9GSUZPX0NUTCgpICAgICAgYmZpbl9yZWFkMTYoVFdJMV9GSUZPX0NUTCkKKyNkZWZpbmUgYmZpbl93cml0ZV9UV0kxX0ZJRk9fQ1RMKHZhbCkgIGJmaW5fd3JpdGUxNihUV0kxX0ZJRk9fQ1RMLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9UV0kxX0ZJRk9fU1RBVCgpICAgICBiZmluX3JlYWQxNihUV0kxX0ZJRk9fU1RBVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9UV0kxX0ZJRk9fU1RBVCh2YWwpIGJmaW5fd3JpdGUxNihUV0kxX0ZJRk9fU1RBVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVFdJMV9YTVRfREFUQTgoKSAgICAgYmZpbl9yZWFkMTYoVFdJMV9YTVRfREFUQTgpCisjZGVmaW5lIGJmaW5fd3JpdGVfVFdJMV9YTVRfREFUQTgodmFsKSBiZmluX3dyaXRlMTYoVFdJMV9YTVRfREFUQTgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1RXSTFfWE1UX0RBVEExNigpICAgIGJmaW5fcmVhZDE2KFRXSTFfWE1UX0RBVEExNikKKyNkZWZpbmUgYmZpbl93cml0ZV9UV0kxX1hNVF9EQVRBMTYodmFsKSBiZmluX3dyaXRlMTYoVFdJMV9YTVRfREFUQTE2LCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9UV0kxX1JDVl9EQVRBOCgpICAgICBiZmluX3JlYWQxNihUV0kxX1JDVl9EQVRBOCkKKyNkZWZpbmUgYmZpbl93cml0ZV9UV0kxX1JDVl9EQVRBOCh2YWwpIGJmaW5fd3JpdGUxNihUV0kxX1JDVl9EQVRBOCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVFdJMV9SQ1ZfREFUQTE2KCkgICAgYmZpbl9yZWFkMTYoVFdJMV9SQ1ZfREFUQTE2KQorI2RlZmluZSBiZmluX3dyaXRlX1RXSTFfUkNWX0RBVEExNih2YWwpIGJmaW5fd3JpdGUxNihUV0kxX1JDVl9EQVRBMTYsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQzEoKSAgICAgICAgICAgIGJmaW5fcmVhZDE2KENBTl9NQzEpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01DMSh2YWwpICAgICAgICBiZmluX3dyaXRlMTYoQ0FOX01DMSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01EMSgpICAgICAgICAgICAgYmZpbl9yZWFkMTYoQ0FOX01EMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUQxKHZhbCkgICAgICAgIGJmaW5fd3JpdGUxNihDQU5fTUQxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fVFJTMSgpICAgICAgICAgICBiZmluX3JlYWQxNihDQU5fVFJTMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fVFJTMSh2YWwpICAgICAgIGJmaW5fd3JpdGUxNihDQU5fVFJTMSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX1RSUjEoKSAgICAgICAgICAgYmZpbl9yZWFkMTYoQ0FOX1RSUjEpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX1RSUjEodmFsKSAgICAgICBiZmluX3dyaXRlMTYoQ0FOX1RSUjEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9UQTEoKSAgICAgICAgICAgIGJmaW5fcmVhZDE2KENBTl9UQTEpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX1RBMSh2YWwpICAgICAgICBiZmluX3dyaXRlMTYoQ0FOX1RBMSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX0FBMSgpICAgICAgICAgICAgYmZpbl9yZWFkMTYoQ0FOX0FBMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fQUExKHZhbCkgICAgICAgIGJmaW5fd3JpdGUxNihDQU5fQUExLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fUk1QMSgpICAgICAgICAgICBiZmluX3JlYWQxNihDQU5fUk1QMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fUk1QMSh2YWwpICAgICAgIGJmaW5fd3JpdGUxNihDQU5fUk1QMSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX1JNTDEoKSAgICAgICAgICAgYmZpbl9yZWFkMTYoQ0FOX1JNTDEpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX1JNTDEodmFsKSAgICAgICBiZmluX3dyaXRlMTYoQ0FOX1JNTDEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQlRJRjEoKSAgICAgICAgIGJmaW5fcmVhZDE2KENBTl9NQlRJRjEpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CVElGMSh2YWwpICAgICBiZmluX3dyaXRlMTYoQ0FOX01CVElGMSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CUklGMSgpICAgICAgICAgYmZpbl9yZWFkMTYoQ0FOX01CUklGMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUJSSUYxKHZhbCkgICAgIGJmaW5fd3JpdGUxNihDQU5fTUJSSUYxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUJJTTEoKSAgICAgICAgICBiZmluX3JlYWQxNihDQU5fTUJJTTEpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CSU0xKHZhbCkgICAgICBiZmluX3dyaXRlMTYoQ0FOX01CSU0xLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fUkZIMSgpICAgICAgICAgICBiZmluX3JlYWQxNihDQU5fUkZIMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fUkZIMSh2YWwpICAgICAgIGJmaW5fd3JpdGUxNihDQU5fUkZIMSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX09QU1MxKCkgICAgICAgICAgYmZpbl9yZWFkMTYoQ0FOX09QU1MxKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9PUFNTMSh2YWwpICAgICAgYmZpbl93cml0ZTE2KENBTl9PUFNTMSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01DMigpICAgICAgICAgICAgYmZpbl9yZWFkMTYoQ0FOX01DMikKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUMyKHZhbCkgICAgICAgIGJmaW5fd3JpdGUxNihDQU5fTUMyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUQyKCkgICAgICAgICAgICBiZmluX3JlYWQxNihDQU5fTUQyKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NRDIodmFsKSAgICAgICAgYmZpbl93cml0ZTE2KENBTl9NRDIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9UUlMyKCkgICAgICAgICAgIGJmaW5fcmVhZDE2KENBTl9UUlMyKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9UUlMyKHZhbCkgICAgICAgYmZpbl93cml0ZTE2KENBTl9UUlMyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fVFJSMigpICAgICAgICAgICBiZmluX3JlYWQxNihDQU5fVFJSMikKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fVFJSMih2YWwpICAgICAgIGJmaW5fd3JpdGUxNihDQU5fVFJSMiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX1RBMigpICAgICAgICAgICAgYmZpbl9yZWFkMTYoQ0FOX1RBMikKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fVEEyKHZhbCkgICAgICAgIGJmaW5fd3JpdGUxNihDQU5fVEEyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fQUEyKCkgICAgICAgICAgICBiZmluX3JlYWQxNihDQU5fQUEyKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9BQTIodmFsKSAgICAgICAgYmZpbl93cml0ZTE2KENBTl9BQTIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9STVAyKCkgICAgICAgICAgIGJmaW5fcmVhZDE2KENBTl9STVAyKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9STVAyKHZhbCkgICAgICAgYmZpbl93cml0ZTE2KENBTl9STVAyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fUk1MMigpICAgICAgICAgICBiZmluX3JlYWQxNihDQU5fUk1MMikKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fUk1MMih2YWwpICAgICAgIGJmaW5fd3JpdGUxNihDQU5fUk1MMiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CVElGMigpICAgICAgICAgYmZpbl9yZWFkMTYoQ0FOX01CVElGMikKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUJUSUYyKHZhbCkgICAgIGJmaW5fd3JpdGUxNihDQU5fTUJUSUYyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUJSSUYyKCkgICAgICAgICBiZmluX3JlYWQxNihDQU5fTUJSSUYyKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQlJJRjIodmFsKSAgICAgYmZpbl93cml0ZTE2KENBTl9NQlJJRjIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQklNMigpICAgICAgICAgIGJmaW5fcmVhZDE2KENBTl9NQklNMikKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUJJTTIodmFsKSAgICAgIGJmaW5fd3JpdGUxNihDQU5fTUJJTTIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9SRkgyKCkgICAgICAgICAgIGJmaW5fcmVhZDE2KENBTl9SRkgyKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9SRkgyKHZhbCkgICAgICAgYmZpbl93cml0ZTE2KENBTl9SRkgyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fT1BTUzIoKSAgICAgICAgICBiZmluX3JlYWQxNihDQU5fT1BTUzIpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX09QU1MyKHZhbCkgICAgICBiZmluX3dyaXRlMTYoQ0FOX09QU1MyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fQ0xPQ0soKSAgICAgICAgICBiZmluX3JlYWQxNihDQU5fQ0xPQ0spCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX0NMT0NLKHZhbCkgICAgICBiZmluX3dyaXRlMTYoQ0FOX0NMT0NLLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fVElNSU5HKCkgICAgICAgICBiZmluX3JlYWQxNihDQU5fVElNSU5HKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9USU1JTkcodmFsKSAgICAgYmZpbl93cml0ZTE2KENBTl9USU1JTkcsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9ERUJVRygpICAgICAgICAgIGJmaW5fcmVhZDE2KENBTl9ERUJVRykKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fREVCVUcodmFsKSAgICAgIGJmaW5fd3JpdGUxNihDQU5fREVCVUcsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9TVEFUVVMoKSAgICAgICAgIGJmaW5fcmVhZDE2KENBTl9TVEFUVVMpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX1NUQVRVUyh2YWwpICAgICBiZmluX3dyaXRlMTYoQ0FOX1NUQVRVUywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX0NFQygpICAgICAgICAgICAgYmZpbl9yZWFkMTYoQ0FOX0NFQykKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fQ0VDKHZhbCkgICAgICAgIGJmaW5fd3JpdGUxNihDQU5fQ0VDLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fR0lTKCkgICAgICAgICAgICBiZmluX3JlYWQxNihDQU5fR0lTKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9HSVModmFsKSAgICAgICAgYmZpbl93cml0ZTE2KENBTl9HSVMsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9HSU0oKSAgICAgICAgICAgIGJmaW5fcmVhZDE2KENBTl9HSU0pCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX0dJTSh2YWwpICAgICAgICBiZmluX3dyaXRlMTYoQ0FOX0dJTSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX0dJRigpICAgICAgICAgICAgYmZpbl9yZWFkMTYoQ0FOX0dJRikKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fR0lGKHZhbCkgICAgICAgIGJmaW5fd3JpdGUxNihDQU5fR0lGLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fQ09OVFJPTCgpICAgICAgICBiZmluX3JlYWQxNihDQU5fQ09OVFJPTCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fQ09OVFJPTCh2YWwpICAgIGJmaW5fd3JpdGUxNihDQU5fQ09OVFJPTCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX0lOVFIoKSAgICAgICAgICAgYmZpbl9yZWFkMTYoQ0FOX0lOVFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX0lOVFIodmFsKSAgICAgICBiZmluX3dyaXRlMTYoQ0FOX0lOVFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9WRVJTSU9OKCkgICAgICAgIGJmaW5fcmVhZDE2KENBTl9WRVJTSU9OKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9WRVJTSU9OKHZhbCkgICAgYmZpbl93cml0ZTE2KENBTl9WRVJTSU9OLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUJURCgpICAgICAgICAgICBiZmluX3JlYWQxNihDQU5fTUJURCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUJURCh2YWwpICAgICAgIGJmaW5fd3JpdGUxNihDQU5fTUJURCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX0VXUigpICAgICAgICAgICAgYmZpbl9yZWFkMTYoQ0FOX0VXUikKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fRVdSKHZhbCkgICAgICAgIGJmaW5fd3JpdGUxNihDQU5fRVdSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fRVNSKCkgICAgICAgICAgICBiZmluX3JlYWQxNihDQU5fRVNSKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9FU1IodmFsKSAgICAgICAgYmZpbl93cml0ZTE2KENBTl9FU1IsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9VQ1JFRygpICAgICAgICAgIGJmaW5fcmVhZDE2KENBTl9VQ1JFRykKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fVUNSRUcodmFsKSAgICAgIGJmaW5fd3JpdGUxNihDQU5fVUNSRUcsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9VQ0NOVCgpICAgICAgICAgIGJmaW5fcmVhZDE2KENBTl9VQ0NOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fVUNDTlQodmFsKSAgICAgIGJmaW5fd3JpdGUxNihDQU5fVUNDTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9VQ1JDKCkgICAgICAgICAgIGJmaW5fcmVhZDE2KENBTl9VQ1JDKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9VQ1JDKHZhbCkgICAgICAgYmZpbl93cml0ZTE2KENBTl9VQ1JDLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fVUNDTkYoKSAgICAgICAgICBiZmluX3JlYWQxNihDQU5fVUNDTkYpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX1VDQ05GKHZhbCkgICAgICBiZmluX3dyaXRlMTYoQ0FOX1VDQ05GLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fVkVSU0lPTjIoKSAgICAgICBiZmluX3JlYWQxNihDQU5fVkVSU0lPTjIpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX1ZFUlNJT04yKHZhbCkgICBiZmluX3dyaXRlMTYoQ0FOX1ZFUlNJT04yLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fQU0wMEwoKSAgICAgICAgICBiZmluX3JlYWQxNihDQU5fQU0wMEwpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX0FNMDBMKHZhbCkgICAgICBiZmluX3dyaXRlMTYoQ0FOX0FNMDBMLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fQU0wMEgoKSAgICAgICAgICBiZmluX3JlYWQxNihDQU5fQU0wMEgpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX0FNMDBIKHZhbCkgICAgICBiZmluX3dyaXRlMTYoQ0FOX0FNMDBILCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fQU0wMUwoKSAgICAgICAgICBiZmluX3JlYWQxNihDQU5fQU0wMUwpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX0FNMDFMKHZhbCkgICAgICBiZmluX3dyaXRlMTYoQ0FOX0FNMDFMLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fQU0wMUgoKSAgICAgICAgICBiZmluX3JlYWQxNihDQU5fQU0wMUgpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX0FNMDFIKHZhbCkgICAgICBiZmluX3dyaXRlMTYoQ0FOX0FNMDFILCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fQU0wMkwoKSAgICAgICAgICBiZmluX3JlYWQxNihDQU5fQU0wMkwpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX0FNMDJMKHZhbCkgICAgICBiZmluX3dyaXRlMTYoQ0FOX0FNMDJMLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fQU0wMkgoKSAgICAgICAgICBiZmluX3JlYWQxNihDQU5fQU0wMkgpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX0FNMDJIKHZhbCkgICAgICBiZmluX3dyaXRlMTYoQ0FOX0FNMDJILCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fQU0wM0woKSAgICAgICAgICBiZmluX3JlYWQxNihDQU5fQU0wM0wpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX0FNMDNMKHZhbCkgICAgICBiZmluX3dyaXRlMTYoQ0FOX0FNMDNMLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fQU0wM0goKSAgICAgICAgICBiZmluX3JlYWQxNihDQU5fQU0wM0gpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX0FNMDNIKHZhbCkgICAgICBiZmluX3dyaXRlMTYoQ0FOX0FNMDNILCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fQU0wNEwoKSAgICAgICAgICBiZmluX3JlYWQxNihDQU5fQU0wNEwpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX0FNMDRMKHZhbCkgICAgICBiZmluX3dyaXRlMTYoQ0FOX0FNMDRMLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fQU0wNEgoKSAgICAgICAgICBiZmluX3JlYWQxNihDQU5fQU0wNEgpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX0FNMDRIKHZhbCkgICAgICBiZmluX3dyaXRlMTYoQ0FOX0FNMDRILCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fQU0wNUwoKSAgICAgICAgICBiZmluX3JlYWQxNihDQU5fQU0wNUwpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX0FNMDVMKHZhbCkgICAgICBiZmluX3dyaXRlMTYoQ0FOX0FNMDVMLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fQU0wNUgoKSAgICAgICAgICBiZmluX3JlYWQxNihDQU5fQU0wNUgpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX0FNMDVIKHZhbCkgICAgICBiZmluX3dyaXRlMTYoQ0FOX0FNMDVILCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fQU0wNkwoKSAgICAgICAgICBiZmluX3JlYWQxNihDQU5fQU0wNkwpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX0FNMDZMKHZhbCkgICAgICBiZmluX3dyaXRlMTYoQ0FOX0FNMDZMLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fQU0wNkgoKSAgICAgICAgICBiZmluX3JlYWQxNihDQU5fQU0wNkgpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX0FNMDZIKHZhbCkgICAgICBiZmluX3dyaXRlMTYoQ0FOX0FNMDZILCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fQU0wN0woKSAgICAgICAgICBiZmluX3JlYWQxNihDQU5fQU0wN0wpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX0FNMDdMKHZhbCkgICAgICBiZmluX3dyaXRlMTYoQ0FOX0FNMDdMLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fQU0wN0goKSAgICAgICAgICBiZmluX3JlYWQxNihDQU5fQU0wN0gpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX0FNMDdIKHZhbCkgICAgICBiZmluX3dyaXRlMTYoQ0FOX0FNMDdILCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fQU0wOEwoKSAgICAgICAgICBiZmluX3JlYWQxNihDQU5fQU0wOEwpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX0FNMDhMKHZhbCkgICAgICBiZmluX3dyaXRlMTYoQ0FOX0FNMDhMLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fQU0wOEgoKSAgICAgICAgICBiZmluX3JlYWQxNihDQU5fQU0wOEgpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX0FNMDhIKHZhbCkgICAgICBiZmluX3dyaXRlMTYoQ0FOX0FNMDhILCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fQU0wOUwoKSAgICAgICAgICBiZmluX3JlYWQxNihDQU5fQU0wOUwpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX0FNMDlMKHZhbCkgICAgICBiZmluX3dyaXRlMTYoQ0FOX0FNMDlMLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fQU0wOUgoKSAgICAgICAgICBiZmluX3JlYWQxNihDQU5fQU0wOUgpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX0FNMDlIKHZhbCkgICAgICBiZmluX3dyaXRlMTYoQ0FOX0FNMDlILCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fQU0xMEwoKSAgICAgICAgICBiZmluX3JlYWQxNihDQU5fQU0xMEwpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX0FNMTBMKHZhbCkgICAgICBiZmluX3dyaXRlMTYoQ0FOX0FNMTBMLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fQU0xMEgoKSAgICAgICAgICBiZmluX3JlYWQxNihDQU5fQU0xMEgpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX0FNMTBIKHZhbCkgICAgICBiZmluX3dyaXRlMTYoQ0FOX0FNMTBILCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fQU0xMUwoKSAgICAgICAgICBiZmluX3JlYWQxNihDQU5fQU0xMUwpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX0FNMTFMKHZhbCkgICAgICBiZmluX3dyaXRlMTYoQ0FOX0FNMTFMLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fQU0xMUgoKSAgICAgICAgICBiZmluX3JlYWQxNihDQU5fQU0xMUgpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX0FNMTFIKHZhbCkgICAgICBiZmluX3dyaXRlMTYoQ0FOX0FNMTFILCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fQU0xMkwoKSAgICAgICAgICBiZmluX3JlYWQxNihDQU5fQU0xMkwpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX0FNMTJMKHZhbCkgICAgICBiZmluX3dyaXRlMTYoQ0FOX0FNMTJMLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fQU0xMkgoKSAgICAgICAgICBiZmluX3JlYWQxNihDQU5fQU0xMkgpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX0FNMTJIKHZhbCkgICAgICBiZmluX3dyaXRlMTYoQ0FOX0FNMTJILCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fQU0xM0woKSAgICAgICAgICBiZmluX3JlYWQxNihDQU5fQU0xM0wpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX0FNMTNMKHZhbCkgICAgICBiZmluX3dyaXRlMTYoQ0FOX0FNMTNMLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fQU0xM0goKSAgICAgICAgICBiZmluX3JlYWQxNihDQU5fQU0xM0gpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX0FNMTNIKHZhbCkgICAgICBiZmluX3dyaXRlMTYoQ0FOX0FNMTNILCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fQU0xNEwoKSAgICAgICAgICBiZmluX3JlYWQxNihDQU5fQU0xNEwpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX0FNMTRMKHZhbCkgICAgICBiZmluX3dyaXRlMTYoQ0FOX0FNMTRMLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fQU0xNEgoKSAgICAgICAgICBiZmluX3JlYWQxNihDQU5fQU0xNEgpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX0FNMTRIKHZhbCkgICAgICBiZmluX3dyaXRlMTYoQ0FOX0FNMTRILCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fQU0xNUwoKSAgICAgICAgICBiZmluX3JlYWQxNihDQU5fQU0xNUwpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX0FNMTVMKHZhbCkgICAgICBiZmluX3dyaXRlMTYoQ0FOX0FNMTVMLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fQU0xNUgoKSAgICAgICAgICBiZmluX3JlYWQxNihDQU5fQU0xNUgpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX0FNMTVIKHZhbCkgICAgICBiZmluX3dyaXRlMTYoQ0FOX0FNMTVILCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fQU0xNkwoKSAgICAgICAgICBiZmluX3JlYWQxNihDQU5fQU0xNkwpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX0FNMTZMKHZhbCkgICAgICBiZmluX3dyaXRlMTYoQ0FOX0FNMTZMLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fQU0xNkgoKSAgICAgICAgICBiZmluX3JlYWQxNihDQU5fQU0xNkgpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX0FNMTZIKHZhbCkgICAgICBiZmluX3dyaXRlMTYoQ0FOX0FNMTZILCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fQU0xN0woKSAgICAgICAgICBiZmluX3JlYWQxNihDQU5fQU0xN0wpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX0FNMTdMKHZhbCkgICAgICBiZmluX3dyaXRlMTYoQ0FOX0FNMTdMLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fQU0xN0goKSAgICAgICAgICBiZmluX3JlYWQxNihDQU5fQU0xN0gpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX0FNMTdIKHZhbCkgICAgICBiZmluX3dyaXRlMTYoQ0FOX0FNMTdILCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fQU0xOEwoKSAgICAgICAgICBiZmluX3JlYWQxNihDQU5fQU0xOEwpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX0FNMThMKHZhbCkgICAgICBiZmluX3dyaXRlMTYoQ0FOX0FNMThMLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fQU0xOEgoKSAgICAgICAgICBiZmluX3JlYWQxNihDQU5fQU0xOEgpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX0FNMThIKHZhbCkgICAgICBiZmluX3dyaXRlMTYoQ0FOX0FNMThILCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fQU0xOUwoKSAgICAgICAgICBiZmluX3JlYWQxNihDQU5fQU0xOUwpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX0FNMTlMKHZhbCkgICAgICBiZmluX3dyaXRlMTYoQ0FOX0FNMTlMLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fQU0xOUgoKSAgICAgICAgICBiZmluX3JlYWQxNihDQU5fQU0xOUgpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX0FNMTlIKHZhbCkgICAgICBiZmluX3dyaXRlMTYoQ0FOX0FNMTlILCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fQU0yMEwoKSAgICAgICAgICBiZmluX3JlYWQxNihDQU5fQU0yMEwpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX0FNMjBMKHZhbCkgICAgICBiZmluX3dyaXRlMTYoQ0FOX0FNMjBMLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fQU0yMEgoKSAgICAgICAgICBiZmluX3JlYWQxNihDQU5fQU0yMEgpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX0FNMjBIKHZhbCkgICAgICBiZmluX3dyaXRlMTYoQ0FOX0FNMjBILCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fQU0yMUwoKSAgICAgICAgICBiZmluX3JlYWQxNihDQU5fQU0yMUwpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX0FNMjFMKHZhbCkgICAgICBiZmluX3dyaXRlMTYoQ0FOX0FNMjFMLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fQU0yMUgoKSAgICAgICAgICBiZmluX3JlYWQxNihDQU5fQU0yMUgpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX0FNMjFIKHZhbCkgICAgICBiZmluX3dyaXRlMTYoQ0FOX0FNMjFILCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fQU0yMkwoKSAgICAgICAgICBiZmluX3JlYWQxNihDQU5fQU0yMkwpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX0FNMjJMKHZhbCkgICAgICBiZmluX3dyaXRlMTYoQ0FOX0FNMjJMLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fQU0yMkgoKSAgICAgICAgICBiZmluX3JlYWQxNihDQU5fQU0yMkgpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX0FNMjJIKHZhbCkgICAgICBiZmluX3dyaXRlMTYoQ0FOX0FNMjJILCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fQU0yM0woKSAgICAgICAgICBiZmluX3JlYWQxNihDQU5fQU0yM0wpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX0FNMjNMKHZhbCkgICAgICBiZmluX3dyaXRlMTYoQ0FOX0FNMjNMLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fQU0yM0goKSAgICAgICAgICBiZmluX3JlYWQxNihDQU5fQU0yM0gpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX0FNMjNIKHZhbCkgICAgICBiZmluX3dyaXRlMTYoQ0FOX0FNMjNILCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fQU0yNEwoKSAgICAgICAgICBiZmluX3JlYWQxNihDQU5fQU0yNEwpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX0FNMjRMKHZhbCkgICAgICBiZmluX3dyaXRlMTYoQ0FOX0FNMjRMLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fQU0yNEgoKSAgICAgICAgICBiZmluX3JlYWQxNihDQU5fQU0yNEgpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX0FNMjRIKHZhbCkgICAgICBiZmluX3dyaXRlMTYoQ0FOX0FNMjRILCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fQU0yNUwoKSAgICAgICAgICBiZmluX3JlYWQxNihDQU5fQU0yNUwpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX0FNMjVMKHZhbCkgICAgICBiZmluX3dyaXRlMTYoQ0FOX0FNMjVMLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fQU0yNUgoKSAgICAgICAgICBiZmluX3JlYWQxNihDQU5fQU0yNUgpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX0FNMjVIKHZhbCkgICAgICBiZmluX3dyaXRlMTYoQ0FOX0FNMjVILCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fQU0yNkwoKSAgICAgICAgICBiZmluX3JlYWQxNihDQU5fQU0yNkwpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX0FNMjZMKHZhbCkgICAgICBiZmluX3dyaXRlMTYoQ0FOX0FNMjZMLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fQU0yNkgoKSAgICAgICAgICBiZmluX3JlYWQxNihDQU5fQU0yNkgpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX0FNMjZIKHZhbCkgICAgICBiZmluX3dyaXRlMTYoQ0FOX0FNMjZILCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fQU0yN0woKSAgICAgICAgICBiZmluX3JlYWQxNihDQU5fQU0yN0wpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX0FNMjdMKHZhbCkgICAgICBiZmluX3dyaXRlMTYoQ0FOX0FNMjdMLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fQU0yN0goKSAgICAgICAgICBiZmluX3JlYWQxNihDQU5fQU0yN0gpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX0FNMjdIKHZhbCkgICAgICBiZmluX3dyaXRlMTYoQ0FOX0FNMjdILCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fQU0yOEwoKSAgICAgICAgICBiZmluX3JlYWQxNihDQU5fQU0yOEwpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX0FNMjhMKHZhbCkgICAgICBiZmluX3dyaXRlMTYoQ0FOX0FNMjhMLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fQU0yOEgoKSAgICAgICAgICBiZmluX3JlYWQxNihDQU5fQU0yOEgpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX0FNMjhIKHZhbCkgICAgICBiZmluX3dyaXRlMTYoQ0FOX0FNMjhILCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fQU0yOUwoKSAgICAgICAgICBiZmluX3JlYWQxNihDQU5fQU0yOUwpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX0FNMjlMKHZhbCkgICAgICBiZmluX3dyaXRlMTYoQ0FOX0FNMjlMLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fQU0yOUgoKSAgICAgICAgICBiZmluX3JlYWQxNihDQU5fQU0yOUgpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX0FNMjlIKHZhbCkgICAgICBiZmluX3dyaXRlMTYoQ0FOX0FNMjlILCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fQU0zMEwoKSAgICAgICAgICBiZmluX3JlYWQxNihDQU5fQU0zMEwpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX0FNMzBMKHZhbCkgICAgICBiZmluX3dyaXRlMTYoQ0FOX0FNMzBMLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fQU0zMEgoKSAgICAgICAgICBiZmluX3JlYWQxNihDQU5fQU0zMEgpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX0FNMzBIKHZhbCkgICAgICBiZmluX3dyaXRlMTYoQ0FOX0FNMzBILCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fQU0zMUwoKSAgICAgICAgICBiZmluX3JlYWQxNihDQU5fQU0zMUwpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX0FNMzFMKHZhbCkgICAgICBiZmluX3dyaXRlMTYoQ0FOX0FNMzFMLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fQU0zMUgoKSAgICAgICAgICBiZmluX3JlYWQxNihDQU5fQU0zMUgpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX0FNMzFIKHZhbCkgICAgICBiZmluX3dyaXRlMTYoQ0FOX0FNMzFILCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIwMF9EQVRBMCgpICAgICBiZmluX3JlYWQxNihDQU5fTUIwMF9EQVRBMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIwMF9EQVRBMCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIwMF9EQVRBMCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMDBfREFUQTEoKSAgICAgYmZpbl9yZWFkMTYoQ0FOX01CMDBfREFUQTEpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMDBfREFUQTEodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMDBfREFUQTEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjAwX0RBVEEyKCkgICAgIGJmaW5fcmVhZDE2KENBTl9NQjAwX0RBVEEyKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjAwX0RBVEEyKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjAwX0RBVEEyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIwMF9EQVRBMygpICAgICBiZmluX3JlYWQxNihDQU5fTUIwMF9EQVRBMykKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIwMF9EQVRBMyh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIwMF9EQVRBMywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMDBfTEVOR1RIKCkgICAgYmZpbl9yZWFkMTYoQ0FOX01CMDBfTEVOR1RIKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjAwX0xFTkdUSCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIwMF9MRU5HVEgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjAwX1RJTUVTVEFNUCgpIGJmaW5fcmVhZDE2KENBTl9NQjAwX1RJTUVTVEFNUCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIwMF9USU1FU1RBTVAodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMDBfVElNRVNUQU1QLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIwMF9JRDAoKSAgICAgICBiZmluX3JlYWQxNihDQU5fTUIwMF9JRDApCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMDBfSUQwKHZhbCkgICBiZmluX3dyaXRlMTYoQ0FOX01CMDBfSUQwLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIwMF9JRDEoKSAgICAgICBiZmluX3JlYWQxNihDQU5fTUIwMF9JRDEpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMDBfSUQxKHZhbCkgICBiZmluX3dyaXRlMTYoQ0FOX01CMDBfSUQxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIwMV9EQVRBMCgpICAgICBiZmluX3JlYWQxNihDQU5fTUIwMV9EQVRBMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIwMV9EQVRBMCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIwMV9EQVRBMCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMDFfREFUQTEoKSAgICAgYmZpbl9yZWFkMTYoQ0FOX01CMDFfREFUQTEpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMDFfREFUQTEodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMDFfREFUQTEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjAxX0RBVEEyKCkgICAgIGJmaW5fcmVhZDE2KENBTl9NQjAxX0RBVEEyKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjAxX0RBVEEyKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjAxX0RBVEEyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIwMV9EQVRBMygpICAgICBiZmluX3JlYWQxNihDQU5fTUIwMV9EQVRBMykKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIwMV9EQVRBMyh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIwMV9EQVRBMywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMDFfTEVOR1RIKCkgICAgYmZpbl9yZWFkMTYoQ0FOX01CMDFfTEVOR1RIKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjAxX0xFTkdUSCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIwMV9MRU5HVEgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjAxX1RJTUVTVEFNUCgpIGJmaW5fcmVhZDE2KENBTl9NQjAxX1RJTUVTVEFNUCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIwMV9USU1FU1RBTVAodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMDFfVElNRVNUQU1QLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIwMV9JRDAoKSAgICAgICBiZmluX3JlYWQxNihDQU5fTUIwMV9JRDApCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMDFfSUQwKHZhbCkgICBiZmluX3dyaXRlMTYoQ0FOX01CMDFfSUQwLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIwMV9JRDEoKSAgICAgICBiZmluX3JlYWQxNihDQU5fTUIwMV9JRDEpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMDFfSUQxKHZhbCkgICBiZmluX3dyaXRlMTYoQ0FOX01CMDFfSUQxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIwMl9EQVRBMCgpICAgICBiZmluX3JlYWQxNihDQU5fTUIwMl9EQVRBMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIwMl9EQVRBMCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIwMl9EQVRBMCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMDJfREFUQTEoKSAgICAgYmZpbl9yZWFkMTYoQ0FOX01CMDJfREFUQTEpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMDJfREFUQTEodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMDJfREFUQTEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjAyX0RBVEEyKCkgICAgIGJmaW5fcmVhZDE2KENBTl9NQjAyX0RBVEEyKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjAyX0RBVEEyKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjAyX0RBVEEyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIwMl9EQVRBMygpICAgICBiZmluX3JlYWQxNihDQU5fTUIwMl9EQVRBMykKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIwMl9EQVRBMyh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIwMl9EQVRBMywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMDJfTEVOR1RIKCkgICAgYmZpbl9yZWFkMTYoQ0FOX01CMDJfTEVOR1RIKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjAyX0xFTkdUSCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIwMl9MRU5HVEgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjAyX1RJTUVTVEFNUCgpIGJmaW5fcmVhZDE2KENBTl9NQjAyX1RJTUVTVEFNUCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIwMl9USU1FU1RBTVAodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMDJfVElNRVNUQU1QLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIwMl9JRDAoKSAgICAgICBiZmluX3JlYWQxNihDQU5fTUIwMl9JRDApCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMDJfSUQwKHZhbCkgICBiZmluX3dyaXRlMTYoQ0FOX01CMDJfSUQwLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIwMl9JRDEoKSAgICAgICBiZmluX3JlYWQxNihDQU5fTUIwMl9JRDEpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMDJfSUQxKHZhbCkgICBiZmluX3dyaXRlMTYoQ0FOX01CMDJfSUQxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIwM19EQVRBMCgpICAgICBiZmluX3JlYWQxNihDQU5fTUIwM19EQVRBMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIwM19EQVRBMCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIwM19EQVRBMCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMDNfREFUQTEoKSAgICAgYmZpbl9yZWFkMTYoQ0FOX01CMDNfREFUQTEpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMDNfREFUQTEodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMDNfREFUQTEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjAzX0RBVEEyKCkgICAgIGJmaW5fcmVhZDE2KENBTl9NQjAzX0RBVEEyKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjAzX0RBVEEyKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjAzX0RBVEEyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIwM19EQVRBMygpICAgICBiZmluX3JlYWQxNihDQU5fTUIwM19EQVRBMykKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIwM19EQVRBMyh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIwM19EQVRBMywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMDNfTEVOR1RIKCkgICAgYmZpbl9yZWFkMTYoQ0FOX01CMDNfTEVOR1RIKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjAzX0xFTkdUSCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIwM19MRU5HVEgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjAzX1RJTUVTVEFNUCgpIGJmaW5fcmVhZDE2KENBTl9NQjAzX1RJTUVTVEFNUCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIwM19USU1FU1RBTVAodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMDNfVElNRVNUQU1QLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIwM19JRDAoKSAgICAgICBiZmluX3JlYWQxNihDQU5fTUIwM19JRDApCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMDNfSUQwKHZhbCkgICBiZmluX3dyaXRlMTYoQ0FOX01CMDNfSUQwLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIwM19JRDEoKSAgICAgICBiZmluX3JlYWQxNihDQU5fTUIwM19JRDEpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMDNfSUQxKHZhbCkgICBiZmluX3dyaXRlMTYoQ0FOX01CMDNfSUQxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIwNF9EQVRBMCgpICAgICBiZmluX3JlYWQxNihDQU5fTUIwNF9EQVRBMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIwNF9EQVRBMCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIwNF9EQVRBMCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMDRfREFUQTEoKSAgICAgYmZpbl9yZWFkMTYoQ0FOX01CMDRfREFUQTEpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMDRfREFUQTEodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMDRfREFUQTEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjA0X0RBVEEyKCkgICAgIGJmaW5fcmVhZDE2KENBTl9NQjA0X0RBVEEyKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjA0X0RBVEEyKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjA0X0RBVEEyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIwNF9EQVRBMygpICAgICBiZmluX3JlYWQxNihDQU5fTUIwNF9EQVRBMykKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIwNF9EQVRBMyh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIwNF9EQVRBMywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMDRfTEVOR1RIKCkgICAgYmZpbl9yZWFkMTYoQ0FOX01CMDRfTEVOR1RIKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjA0X0xFTkdUSCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIwNF9MRU5HVEgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjA0X1RJTUVTVEFNUCgpIGJmaW5fcmVhZDE2KENBTl9NQjA0X1RJTUVTVEFNUCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIwNF9USU1FU1RBTVAodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMDRfVElNRVNUQU1QLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIwNF9JRDAoKSAgICAgICBiZmluX3JlYWQxNihDQU5fTUIwNF9JRDApCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMDRfSUQwKHZhbCkgICBiZmluX3dyaXRlMTYoQ0FOX01CMDRfSUQwLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIwNF9JRDEoKSAgICAgICBiZmluX3JlYWQxNihDQU5fTUIwNF9JRDEpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMDRfSUQxKHZhbCkgICBiZmluX3dyaXRlMTYoQ0FOX01CMDRfSUQxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIwNV9EQVRBMCgpICAgICBiZmluX3JlYWQxNihDQU5fTUIwNV9EQVRBMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIwNV9EQVRBMCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIwNV9EQVRBMCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMDVfREFUQTEoKSAgICAgYmZpbl9yZWFkMTYoQ0FOX01CMDVfREFUQTEpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMDVfREFUQTEodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMDVfREFUQTEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjA1X0RBVEEyKCkgICAgIGJmaW5fcmVhZDE2KENBTl9NQjA1X0RBVEEyKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjA1X0RBVEEyKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjA1X0RBVEEyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIwNV9EQVRBMygpICAgICBiZmluX3JlYWQxNihDQU5fTUIwNV9EQVRBMykKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIwNV9EQVRBMyh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIwNV9EQVRBMywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMDVfTEVOR1RIKCkgICAgYmZpbl9yZWFkMTYoQ0FOX01CMDVfTEVOR1RIKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjA1X0xFTkdUSCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIwNV9MRU5HVEgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjA1X1RJTUVTVEFNUCgpIGJmaW5fcmVhZDE2KENBTl9NQjA1X1RJTUVTVEFNUCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIwNV9USU1FU1RBTVAodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMDVfVElNRVNUQU1QLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIwNV9JRDAoKSAgICAgICBiZmluX3JlYWQxNihDQU5fTUIwNV9JRDApCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMDVfSUQwKHZhbCkgICBiZmluX3dyaXRlMTYoQ0FOX01CMDVfSUQwLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIwNV9JRDEoKSAgICAgICBiZmluX3JlYWQxNihDQU5fTUIwNV9JRDEpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMDVfSUQxKHZhbCkgICBiZmluX3dyaXRlMTYoQ0FOX01CMDVfSUQxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIwNl9EQVRBMCgpICAgICBiZmluX3JlYWQxNihDQU5fTUIwNl9EQVRBMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIwNl9EQVRBMCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIwNl9EQVRBMCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMDZfREFUQTEoKSAgICAgYmZpbl9yZWFkMTYoQ0FOX01CMDZfREFUQTEpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMDZfREFUQTEodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMDZfREFUQTEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjA2X0RBVEEyKCkgICAgIGJmaW5fcmVhZDE2KENBTl9NQjA2X0RBVEEyKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjA2X0RBVEEyKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjA2X0RBVEEyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIwNl9EQVRBMygpICAgICBiZmluX3JlYWQxNihDQU5fTUIwNl9EQVRBMykKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIwNl9EQVRBMyh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIwNl9EQVRBMywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMDZfTEVOR1RIKCkgICAgYmZpbl9yZWFkMTYoQ0FOX01CMDZfTEVOR1RIKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjA2X0xFTkdUSCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIwNl9MRU5HVEgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjA2X1RJTUVTVEFNUCgpIGJmaW5fcmVhZDE2KENBTl9NQjA2X1RJTUVTVEFNUCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIwNl9USU1FU1RBTVAodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMDZfVElNRVNUQU1QLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIwNl9JRDAoKSAgICAgICBiZmluX3JlYWQxNihDQU5fTUIwNl9JRDApCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMDZfSUQwKHZhbCkgICBiZmluX3dyaXRlMTYoQ0FOX01CMDZfSUQwLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIwNl9JRDEoKSAgICAgICBiZmluX3JlYWQxNihDQU5fTUIwNl9JRDEpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMDZfSUQxKHZhbCkgICBiZmluX3dyaXRlMTYoQ0FOX01CMDZfSUQxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIwN19EQVRBMCgpICAgICBiZmluX3JlYWQxNihDQU5fTUIwN19EQVRBMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIwN19EQVRBMCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIwN19EQVRBMCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMDdfREFUQTEoKSAgICAgYmZpbl9yZWFkMTYoQ0FOX01CMDdfREFUQTEpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMDdfREFUQTEodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMDdfREFUQTEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjA3X0RBVEEyKCkgICAgIGJmaW5fcmVhZDE2KENBTl9NQjA3X0RBVEEyKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjA3X0RBVEEyKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjA3X0RBVEEyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIwN19EQVRBMygpICAgICBiZmluX3JlYWQxNihDQU5fTUIwN19EQVRBMykKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIwN19EQVRBMyh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIwN19EQVRBMywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMDdfTEVOR1RIKCkgICAgYmZpbl9yZWFkMTYoQ0FOX01CMDdfTEVOR1RIKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjA3X0xFTkdUSCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIwN19MRU5HVEgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjA3X1RJTUVTVEFNUCgpIGJmaW5fcmVhZDE2KENBTl9NQjA3X1RJTUVTVEFNUCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIwN19USU1FU1RBTVAodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMDdfVElNRVNUQU1QLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIwN19JRDAoKSAgICAgICBiZmluX3JlYWQxNihDQU5fTUIwN19JRDApCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMDdfSUQwKHZhbCkgICBiZmluX3dyaXRlMTYoQ0FOX01CMDdfSUQwLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIwN19JRDEoKSAgICAgICBiZmluX3JlYWQxNihDQU5fTUIwN19JRDEpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMDdfSUQxKHZhbCkgICBiZmluX3dyaXRlMTYoQ0FOX01CMDdfSUQxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIwOF9EQVRBMCgpICAgICBiZmluX3JlYWQxNihDQU5fTUIwOF9EQVRBMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIwOF9EQVRBMCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIwOF9EQVRBMCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMDhfREFUQTEoKSAgICAgYmZpbl9yZWFkMTYoQ0FOX01CMDhfREFUQTEpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMDhfREFUQTEodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMDhfREFUQTEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjA4X0RBVEEyKCkgICAgIGJmaW5fcmVhZDE2KENBTl9NQjA4X0RBVEEyKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjA4X0RBVEEyKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjA4X0RBVEEyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIwOF9EQVRBMygpICAgICBiZmluX3JlYWQxNihDQU5fTUIwOF9EQVRBMykKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIwOF9EQVRBMyh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIwOF9EQVRBMywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMDhfTEVOR1RIKCkgICAgYmZpbl9yZWFkMTYoQ0FOX01CMDhfTEVOR1RIKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjA4X0xFTkdUSCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIwOF9MRU5HVEgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjA4X1RJTUVTVEFNUCgpIGJmaW5fcmVhZDE2KENBTl9NQjA4X1RJTUVTVEFNUCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIwOF9USU1FU1RBTVAodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMDhfVElNRVNUQU1QLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIwOF9JRDAoKSAgICAgICBiZmluX3JlYWQxNihDQU5fTUIwOF9JRDApCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMDhfSUQwKHZhbCkgICBiZmluX3dyaXRlMTYoQ0FOX01CMDhfSUQwLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIwOF9JRDEoKSAgICAgICBiZmluX3JlYWQxNihDQU5fTUIwOF9JRDEpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMDhfSUQxKHZhbCkgICBiZmluX3dyaXRlMTYoQ0FOX01CMDhfSUQxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIwOV9EQVRBMCgpICAgICBiZmluX3JlYWQxNihDQU5fTUIwOV9EQVRBMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIwOV9EQVRBMCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIwOV9EQVRBMCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMDlfREFUQTEoKSAgICAgYmZpbl9yZWFkMTYoQ0FOX01CMDlfREFUQTEpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMDlfREFUQTEodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMDlfREFUQTEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjA5X0RBVEEyKCkgICAgIGJmaW5fcmVhZDE2KENBTl9NQjA5X0RBVEEyKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjA5X0RBVEEyKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjA5X0RBVEEyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIwOV9EQVRBMygpICAgICBiZmluX3JlYWQxNihDQU5fTUIwOV9EQVRBMykKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIwOV9EQVRBMyh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIwOV9EQVRBMywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMDlfTEVOR1RIKCkgICAgYmZpbl9yZWFkMTYoQ0FOX01CMDlfTEVOR1RIKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjA5X0xFTkdUSCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIwOV9MRU5HVEgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjA5X1RJTUVTVEFNUCgpIGJmaW5fcmVhZDE2KENBTl9NQjA5X1RJTUVTVEFNUCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIwOV9USU1FU1RBTVAodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMDlfVElNRVNUQU1QLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIwOV9JRDAoKSAgICAgICBiZmluX3JlYWQxNihDQU5fTUIwOV9JRDApCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMDlfSUQwKHZhbCkgICBiZmluX3dyaXRlMTYoQ0FOX01CMDlfSUQwLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIwOV9JRDEoKSAgICAgICBiZmluX3JlYWQxNihDQU5fTUIwOV9JRDEpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMDlfSUQxKHZhbCkgICBiZmluX3dyaXRlMTYoQ0FOX01CMDlfSUQxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIxMF9EQVRBMCgpICAgICBiZmluX3JlYWQxNihDQU5fTUIxMF9EQVRBMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIxMF9EQVRBMCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIxMF9EQVRBMCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMTBfREFUQTEoKSAgICAgYmZpbl9yZWFkMTYoQ0FOX01CMTBfREFUQTEpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMTBfREFUQTEodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMTBfREFUQTEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjEwX0RBVEEyKCkgICAgIGJmaW5fcmVhZDE2KENBTl9NQjEwX0RBVEEyKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjEwX0RBVEEyKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjEwX0RBVEEyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIxMF9EQVRBMygpICAgICBiZmluX3JlYWQxNihDQU5fTUIxMF9EQVRBMykKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIxMF9EQVRBMyh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIxMF9EQVRBMywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMTBfTEVOR1RIKCkgICAgYmZpbl9yZWFkMTYoQ0FOX01CMTBfTEVOR1RIKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjEwX0xFTkdUSCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIxMF9MRU5HVEgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjEwX1RJTUVTVEFNUCgpIGJmaW5fcmVhZDE2KENBTl9NQjEwX1RJTUVTVEFNUCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIxMF9USU1FU1RBTVAodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMTBfVElNRVNUQU1QLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIxMF9JRDAoKSAgICAgICBiZmluX3JlYWQxNihDQU5fTUIxMF9JRDApCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMTBfSUQwKHZhbCkgICBiZmluX3dyaXRlMTYoQ0FOX01CMTBfSUQwLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIxMF9JRDEoKSAgICAgICBiZmluX3JlYWQxNihDQU5fTUIxMF9JRDEpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMTBfSUQxKHZhbCkgICBiZmluX3dyaXRlMTYoQ0FOX01CMTBfSUQxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIxMV9EQVRBMCgpICAgICBiZmluX3JlYWQxNihDQU5fTUIxMV9EQVRBMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIxMV9EQVRBMCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIxMV9EQVRBMCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMTFfREFUQTEoKSAgICAgYmZpbl9yZWFkMTYoQ0FOX01CMTFfREFUQTEpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMTFfREFUQTEodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMTFfREFUQTEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjExX0RBVEEyKCkgICAgIGJmaW5fcmVhZDE2KENBTl9NQjExX0RBVEEyKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjExX0RBVEEyKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjExX0RBVEEyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIxMV9EQVRBMygpICAgICBiZmluX3JlYWQxNihDQU5fTUIxMV9EQVRBMykKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIxMV9EQVRBMyh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIxMV9EQVRBMywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMTFfTEVOR1RIKCkgICAgYmZpbl9yZWFkMTYoQ0FOX01CMTFfTEVOR1RIKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjExX0xFTkdUSCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIxMV9MRU5HVEgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjExX1RJTUVTVEFNUCgpIGJmaW5fcmVhZDE2KENBTl9NQjExX1RJTUVTVEFNUCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIxMV9USU1FU1RBTVAodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMTFfVElNRVNUQU1QLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIxMV9JRDAoKSAgICAgICBiZmluX3JlYWQxNihDQU5fTUIxMV9JRDApCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMTFfSUQwKHZhbCkgICBiZmluX3dyaXRlMTYoQ0FOX01CMTFfSUQwLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIxMV9JRDEoKSAgICAgICBiZmluX3JlYWQxNihDQU5fTUIxMV9JRDEpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMTFfSUQxKHZhbCkgICBiZmluX3dyaXRlMTYoQ0FOX01CMTFfSUQxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIxMl9EQVRBMCgpICAgICBiZmluX3JlYWQxNihDQU5fTUIxMl9EQVRBMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIxMl9EQVRBMCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIxMl9EQVRBMCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMTJfREFUQTEoKSAgICAgYmZpbl9yZWFkMTYoQ0FOX01CMTJfREFUQTEpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMTJfREFUQTEodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMTJfREFUQTEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjEyX0RBVEEyKCkgICAgIGJmaW5fcmVhZDE2KENBTl9NQjEyX0RBVEEyKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjEyX0RBVEEyKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjEyX0RBVEEyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIxMl9EQVRBMygpICAgICBiZmluX3JlYWQxNihDQU5fTUIxMl9EQVRBMykKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIxMl9EQVRBMyh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIxMl9EQVRBMywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMTJfTEVOR1RIKCkgICAgYmZpbl9yZWFkMTYoQ0FOX01CMTJfTEVOR1RIKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjEyX0xFTkdUSCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIxMl9MRU5HVEgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjEyX1RJTUVTVEFNUCgpIGJmaW5fcmVhZDE2KENBTl9NQjEyX1RJTUVTVEFNUCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIxMl9USU1FU1RBTVAodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMTJfVElNRVNUQU1QLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIxMl9JRDAoKSAgICAgICBiZmluX3JlYWQxNihDQU5fTUIxMl9JRDApCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMTJfSUQwKHZhbCkgICBiZmluX3dyaXRlMTYoQ0FOX01CMTJfSUQwLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIxMl9JRDEoKSAgICAgICBiZmluX3JlYWQxNihDQU5fTUIxMl9JRDEpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMTJfSUQxKHZhbCkgICBiZmluX3dyaXRlMTYoQ0FOX01CMTJfSUQxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIxM19EQVRBMCgpICAgICBiZmluX3JlYWQxNihDQU5fTUIxM19EQVRBMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIxM19EQVRBMCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIxM19EQVRBMCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMTNfREFUQTEoKSAgICAgYmZpbl9yZWFkMTYoQ0FOX01CMTNfREFUQTEpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMTNfREFUQTEodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMTNfREFUQTEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjEzX0RBVEEyKCkgICAgIGJmaW5fcmVhZDE2KENBTl9NQjEzX0RBVEEyKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjEzX0RBVEEyKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjEzX0RBVEEyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIxM19EQVRBMygpICAgICBiZmluX3JlYWQxNihDQU5fTUIxM19EQVRBMykKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIxM19EQVRBMyh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIxM19EQVRBMywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMTNfTEVOR1RIKCkgICAgYmZpbl9yZWFkMTYoQ0FOX01CMTNfTEVOR1RIKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjEzX0xFTkdUSCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIxM19MRU5HVEgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjEzX1RJTUVTVEFNUCgpIGJmaW5fcmVhZDE2KENBTl9NQjEzX1RJTUVTVEFNUCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIxM19USU1FU1RBTVAodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMTNfVElNRVNUQU1QLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIxM19JRDAoKSAgICAgICBiZmluX3JlYWQxNihDQU5fTUIxM19JRDApCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMTNfSUQwKHZhbCkgICBiZmluX3dyaXRlMTYoQ0FOX01CMTNfSUQwLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIxM19JRDEoKSAgICAgICBiZmluX3JlYWQxNihDQU5fTUIxM19JRDEpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMTNfSUQxKHZhbCkgICBiZmluX3dyaXRlMTYoQ0FOX01CMTNfSUQxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIxNF9EQVRBMCgpICAgICBiZmluX3JlYWQxNihDQU5fTUIxNF9EQVRBMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIxNF9EQVRBMCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIxNF9EQVRBMCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMTRfREFUQTEoKSAgICAgYmZpbl9yZWFkMTYoQ0FOX01CMTRfREFUQTEpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMTRfREFUQTEodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMTRfREFUQTEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjE0X0RBVEEyKCkgICAgIGJmaW5fcmVhZDE2KENBTl9NQjE0X0RBVEEyKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjE0X0RBVEEyKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjE0X0RBVEEyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIxNF9EQVRBMygpICAgICBiZmluX3JlYWQxNihDQU5fTUIxNF9EQVRBMykKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIxNF9EQVRBMyh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIxNF9EQVRBMywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMTRfTEVOR1RIKCkgICAgYmZpbl9yZWFkMTYoQ0FOX01CMTRfTEVOR1RIKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjE0X0xFTkdUSCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIxNF9MRU5HVEgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjE0X1RJTUVTVEFNUCgpIGJmaW5fcmVhZDE2KENBTl9NQjE0X1RJTUVTVEFNUCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIxNF9USU1FU1RBTVAodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMTRfVElNRVNUQU1QLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIxNF9JRDAoKSAgICAgICBiZmluX3JlYWQxNihDQU5fTUIxNF9JRDApCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMTRfSUQwKHZhbCkgICBiZmluX3dyaXRlMTYoQ0FOX01CMTRfSUQwLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIxNF9JRDEoKSAgICAgICBiZmluX3JlYWQxNihDQU5fTUIxNF9JRDEpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMTRfSUQxKHZhbCkgICBiZmluX3dyaXRlMTYoQ0FOX01CMTRfSUQxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIxNV9EQVRBMCgpICAgICBiZmluX3JlYWQxNihDQU5fTUIxNV9EQVRBMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIxNV9EQVRBMCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIxNV9EQVRBMCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMTVfREFUQTEoKSAgICAgYmZpbl9yZWFkMTYoQ0FOX01CMTVfREFUQTEpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMTVfREFUQTEodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMTVfREFUQTEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjE1X0RBVEEyKCkgICAgIGJmaW5fcmVhZDE2KENBTl9NQjE1X0RBVEEyKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjE1X0RBVEEyKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjE1X0RBVEEyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIxNV9EQVRBMygpICAgICBiZmluX3JlYWQxNihDQU5fTUIxNV9EQVRBMykKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIxNV9EQVRBMyh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIxNV9EQVRBMywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMTVfTEVOR1RIKCkgICAgYmZpbl9yZWFkMTYoQ0FOX01CMTVfTEVOR1RIKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjE1X0xFTkdUSCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIxNV9MRU5HVEgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjE1X1RJTUVTVEFNUCgpIGJmaW5fcmVhZDE2KENBTl9NQjE1X1RJTUVTVEFNUCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIxNV9USU1FU1RBTVAodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMTVfVElNRVNUQU1QLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIxNV9JRDAoKSAgICAgICBiZmluX3JlYWQxNihDQU5fTUIxNV9JRDApCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMTVfSUQwKHZhbCkgICBiZmluX3dyaXRlMTYoQ0FOX01CMTVfSUQwLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIxNV9JRDEoKSAgICAgICBiZmluX3JlYWQxNihDQU5fTUIxNV9JRDEpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMTVfSUQxKHZhbCkgICBiZmluX3dyaXRlMTYoQ0FOX01CMTVfSUQxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIxNl9EQVRBMCgpICAgICBiZmluX3JlYWQxNihDQU5fTUIxNl9EQVRBMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIxNl9EQVRBMCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIxNl9EQVRBMCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMTZfREFUQTEoKSAgICAgYmZpbl9yZWFkMTYoQ0FOX01CMTZfREFUQTEpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMTZfREFUQTEodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMTZfREFUQTEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjE2X0RBVEEyKCkgICAgIGJmaW5fcmVhZDE2KENBTl9NQjE2X0RBVEEyKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjE2X0RBVEEyKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjE2X0RBVEEyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIxNl9EQVRBMygpICAgICBiZmluX3JlYWQxNihDQU5fTUIxNl9EQVRBMykKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIxNl9EQVRBMyh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIxNl9EQVRBMywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMTZfTEVOR1RIKCkgICAgYmZpbl9yZWFkMTYoQ0FOX01CMTZfTEVOR1RIKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjE2X0xFTkdUSCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIxNl9MRU5HVEgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjE2X1RJTUVTVEFNUCgpIGJmaW5fcmVhZDE2KENBTl9NQjE2X1RJTUVTVEFNUCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIxNl9USU1FU1RBTVAodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMTZfVElNRVNUQU1QLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIxNl9JRDAoKSAgICAgICBiZmluX3JlYWQxNihDQU5fTUIxNl9JRDApCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMTZfSUQwKHZhbCkgICBiZmluX3dyaXRlMTYoQ0FOX01CMTZfSUQwLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIxNl9JRDEoKSAgICAgICBiZmluX3JlYWQxNihDQU5fTUIxNl9JRDEpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMTZfSUQxKHZhbCkgICBiZmluX3dyaXRlMTYoQ0FOX01CMTZfSUQxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIxN19EQVRBMCgpICAgICBiZmluX3JlYWQxNihDQU5fTUIxN19EQVRBMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIxN19EQVRBMCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIxN19EQVRBMCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMTdfREFUQTEoKSAgICAgYmZpbl9yZWFkMTYoQ0FOX01CMTdfREFUQTEpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMTdfREFUQTEodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMTdfREFUQTEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjE3X0RBVEEyKCkgICAgIGJmaW5fcmVhZDE2KENBTl9NQjE3X0RBVEEyKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjE3X0RBVEEyKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjE3X0RBVEEyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIxN19EQVRBMygpICAgICBiZmluX3JlYWQxNihDQU5fTUIxN19EQVRBMykKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIxN19EQVRBMyh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIxN19EQVRBMywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMTdfTEVOR1RIKCkgICAgYmZpbl9yZWFkMTYoQ0FOX01CMTdfTEVOR1RIKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjE3X0xFTkdUSCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIxN19MRU5HVEgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjE3X1RJTUVTVEFNUCgpIGJmaW5fcmVhZDE2KENBTl9NQjE3X1RJTUVTVEFNUCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIxN19USU1FU1RBTVAodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMTdfVElNRVNUQU1QLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIxN19JRDAoKSAgICAgICBiZmluX3JlYWQxNihDQU5fTUIxN19JRDApCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMTdfSUQwKHZhbCkgICBiZmluX3dyaXRlMTYoQ0FOX01CMTdfSUQwLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIxN19JRDEoKSAgICAgICBiZmluX3JlYWQxNihDQU5fTUIxN19JRDEpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMTdfSUQxKHZhbCkgICBiZmluX3dyaXRlMTYoQ0FOX01CMTdfSUQxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIxOF9EQVRBMCgpICAgICBiZmluX3JlYWQxNihDQU5fTUIxOF9EQVRBMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIxOF9EQVRBMCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIxOF9EQVRBMCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMThfREFUQTEoKSAgICAgYmZpbl9yZWFkMTYoQ0FOX01CMThfREFUQTEpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMThfREFUQTEodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMThfREFUQTEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjE4X0RBVEEyKCkgICAgIGJmaW5fcmVhZDE2KENBTl9NQjE4X0RBVEEyKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjE4X0RBVEEyKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjE4X0RBVEEyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIxOF9EQVRBMygpICAgICBiZmluX3JlYWQxNihDQU5fTUIxOF9EQVRBMykKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIxOF9EQVRBMyh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIxOF9EQVRBMywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMThfTEVOR1RIKCkgICAgYmZpbl9yZWFkMTYoQ0FOX01CMThfTEVOR1RIKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjE4X0xFTkdUSCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIxOF9MRU5HVEgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjE4X1RJTUVTVEFNUCgpIGJmaW5fcmVhZDE2KENBTl9NQjE4X1RJTUVTVEFNUCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIxOF9USU1FU1RBTVAodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMThfVElNRVNUQU1QLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIxOF9JRDAoKSAgICAgICBiZmluX3JlYWQxNihDQU5fTUIxOF9JRDApCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMThfSUQwKHZhbCkgICBiZmluX3dyaXRlMTYoQ0FOX01CMThfSUQwLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIxOF9JRDEoKSAgICAgICBiZmluX3JlYWQxNihDQU5fTUIxOF9JRDEpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMThfSUQxKHZhbCkgICBiZmluX3dyaXRlMTYoQ0FOX01CMThfSUQxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIxOV9EQVRBMCgpICAgICBiZmluX3JlYWQxNihDQU5fTUIxOV9EQVRBMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIxOV9EQVRBMCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIxOV9EQVRBMCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMTlfREFUQTEoKSAgICAgYmZpbl9yZWFkMTYoQ0FOX01CMTlfREFUQTEpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMTlfREFUQTEodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMTlfREFUQTEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjE5X0RBVEEyKCkgICAgIGJmaW5fcmVhZDE2KENBTl9NQjE5X0RBVEEyKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjE5X0RBVEEyKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjE5X0RBVEEyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIxOV9EQVRBMygpICAgICBiZmluX3JlYWQxNihDQU5fTUIxOV9EQVRBMykKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIxOV9EQVRBMyh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIxOV9EQVRBMywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMTlfTEVOR1RIKCkgICAgYmZpbl9yZWFkMTYoQ0FOX01CMTlfTEVOR1RIKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjE5X0xFTkdUSCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIxOV9MRU5HVEgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjE5X1RJTUVTVEFNUCgpIGJmaW5fcmVhZDE2KENBTl9NQjE5X1RJTUVTVEFNUCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIxOV9USU1FU1RBTVAodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMTlfVElNRVNUQU1QLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIxOV9JRDAoKSAgICAgICBiZmluX3JlYWQxNihDQU5fTUIxOV9JRDApCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMTlfSUQwKHZhbCkgICBiZmluX3dyaXRlMTYoQ0FOX01CMTlfSUQwLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIxOV9JRDEoKSAgICAgICBiZmluX3JlYWQxNihDQU5fTUIxOV9JRDEpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMTlfSUQxKHZhbCkgICBiZmluX3dyaXRlMTYoQ0FOX01CMTlfSUQxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIyMF9EQVRBMCgpICAgICBiZmluX3JlYWQxNihDQU5fTUIyMF9EQVRBMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIyMF9EQVRBMCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIyMF9EQVRBMCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMjBfREFUQTEoKSAgICAgYmZpbl9yZWFkMTYoQ0FOX01CMjBfREFUQTEpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMjBfREFUQTEodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMjBfREFUQTEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjIwX0RBVEEyKCkgICAgIGJmaW5fcmVhZDE2KENBTl9NQjIwX0RBVEEyKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjIwX0RBVEEyKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjIwX0RBVEEyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIyMF9EQVRBMygpICAgICBiZmluX3JlYWQxNihDQU5fTUIyMF9EQVRBMykKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIyMF9EQVRBMyh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIyMF9EQVRBMywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMjBfTEVOR1RIKCkgICAgYmZpbl9yZWFkMTYoQ0FOX01CMjBfTEVOR1RIKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjIwX0xFTkdUSCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIyMF9MRU5HVEgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjIwX1RJTUVTVEFNUCgpIGJmaW5fcmVhZDE2KENBTl9NQjIwX1RJTUVTVEFNUCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIyMF9USU1FU1RBTVAodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMjBfVElNRVNUQU1QLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIyMF9JRDAoKSAgICAgICBiZmluX3JlYWQxNihDQU5fTUIyMF9JRDApCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMjBfSUQwKHZhbCkgICBiZmluX3dyaXRlMTYoQ0FOX01CMjBfSUQwLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIyMF9JRDEoKSAgICAgICBiZmluX3JlYWQxNihDQU5fTUIyMF9JRDEpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMjBfSUQxKHZhbCkgICBiZmluX3dyaXRlMTYoQ0FOX01CMjBfSUQxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIyMV9EQVRBMCgpICAgICBiZmluX3JlYWQxNihDQU5fTUIyMV9EQVRBMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIyMV9EQVRBMCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIyMV9EQVRBMCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMjFfREFUQTEoKSAgICAgYmZpbl9yZWFkMTYoQ0FOX01CMjFfREFUQTEpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMjFfREFUQTEodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMjFfREFUQTEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjIxX0RBVEEyKCkgICAgIGJmaW5fcmVhZDE2KENBTl9NQjIxX0RBVEEyKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjIxX0RBVEEyKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjIxX0RBVEEyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIyMV9EQVRBMygpICAgICBiZmluX3JlYWQxNihDQU5fTUIyMV9EQVRBMykKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIyMV9EQVRBMyh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIyMV9EQVRBMywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMjFfTEVOR1RIKCkgICAgYmZpbl9yZWFkMTYoQ0FOX01CMjFfTEVOR1RIKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjIxX0xFTkdUSCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIyMV9MRU5HVEgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjIxX1RJTUVTVEFNUCgpIGJmaW5fcmVhZDE2KENBTl9NQjIxX1RJTUVTVEFNUCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIyMV9USU1FU1RBTVAodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMjFfVElNRVNUQU1QLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIyMV9JRDAoKSAgICAgICBiZmluX3JlYWQxNihDQU5fTUIyMV9JRDApCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMjFfSUQwKHZhbCkgICBiZmluX3dyaXRlMTYoQ0FOX01CMjFfSUQwLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIyMV9JRDEoKSAgICAgICBiZmluX3JlYWQxNihDQU5fTUIyMV9JRDEpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMjFfSUQxKHZhbCkgICBiZmluX3dyaXRlMTYoQ0FOX01CMjFfSUQxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIyMl9EQVRBMCgpICAgICBiZmluX3JlYWQxNihDQU5fTUIyMl9EQVRBMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIyMl9EQVRBMCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIyMl9EQVRBMCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMjJfREFUQTEoKSAgICAgYmZpbl9yZWFkMTYoQ0FOX01CMjJfREFUQTEpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMjJfREFUQTEodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMjJfREFUQTEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjIyX0RBVEEyKCkgICAgIGJmaW5fcmVhZDE2KENBTl9NQjIyX0RBVEEyKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjIyX0RBVEEyKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjIyX0RBVEEyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIyMl9EQVRBMygpICAgICBiZmluX3JlYWQxNihDQU5fTUIyMl9EQVRBMykKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIyMl9EQVRBMyh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIyMl9EQVRBMywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMjJfTEVOR1RIKCkgICAgYmZpbl9yZWFkMTYoQ0FOX01CMjJfTEVOR1RIKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjIyX0xFTkdUSCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIyMl9MRU5HVEgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjIyX1RJTUVTVEFNUCgpIGJmaW5fcmVhZDE2KENBTl9NQjIyX1RJTUVTVEFNUCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIyMl9USU1FU1RBTVAodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMjJfVElNRVNUQU1QLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIyMl9JRDAoKSAgICAgICBiZmluX3JlYWQxNihDQU5fTUIyMl9JRDApCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMjJfSUQwKHZhbCkgICBiZmluX3dyaXRlMTYoQ0FOX01CMjJfSUQwLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIyMl9JRDEoKSAgICAgICBiZmluX3JlYWQxNihDQU5fTUIyMl9JRDEpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMjJfSUQxKHZhbCkgICBiZmluX3dyaXRlMTYoQ0FOX01CMjJfSUQxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIyM19EQVRBMCgpICAgICBiZmluX3JlYWQxNihDQU5fTUIyM19EQVRBMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIyM19EQVRBMCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIyM19EQVRBMCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMjNfREFUQTEoKSAgICAgYmZpbl9yZWFkMTYoQ0FOX01CMjNfREFUQTEpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMjNfREFUQTEodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMjNfREFUQTEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjIzX0RBVEEyKCkgICAgIGJmaW5fcmVhZDE2KENBTl9NQjIzX0RBVEEyKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjIzX0RBVEEyKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjIzX0RBVEEyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIyM19EQVRBMygpICAgICBiZmluX3JlYWQxNihDQU5fTUIyM19EQVRBMykKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIyM19EQVRBMyh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIyM19EQVRBMywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMjNfTEVOR1RIKCkgICAgYmZpbl9yZWFkMTYoQ0FOX01CMjNfTEVOR1RIKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjIzX0xFTkdUSCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIyM19MRU5HVEgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjIzX1RJTUVTVEFNUCgpIGJmaW5fcmVhZDE2KENBTl9NQjIzX1RJTUVTVEFNUCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIyM19USU1FU1RBTVAodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMjNfVElNRVNUQU1QLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIyM19JRDAoKSAgICAgICBiZmluX3JlYWQxNihDQU5fTUIyM19JRDApCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMjNfSUQwKHZhbCkgICBiZmluX3dyaXRlMTYoQ0FOX01CMjNfSUQwLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIyM19JRDEoKSAgICAgICBiZmluX3JlYWQxNihDQU5fTUIyM19JRDEpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMjNfSUQxKHZhbCkgICBiZmluX3dyaXRlMTYoQ0FOX01CMjNfSUQxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIyNF9EQVRBMCgpICAgICBiZmluX3JlYWQxNihDQU5fTUIyNF9EQVRBMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIyNF9EQVRBMCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIyNF9EQVRBMCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMjRfREFUQTEoKSAgICAgYmZpbl9yZWFkMTYoQ0FOX01CMjRfREFUQTEpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMjRfREFUQTEodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMjRfREFUQTEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjI0X0RBVEEyKCkgICAgIGJmaW5fcmVhZDE2KENBTl9NQjI0X0RBVEEyKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjI0X0RBVEEyKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjI0X0RBVEEyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIyNF9EQVRBMygpICAgICBiZmluX3JlYWQxNihDQU5fTUIyNF9EQVRBMykKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIyNF9EQVRBMyh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIyNF9EQVRBMywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMjRfTEVOR1RIKCkgICAgYmZpbl9yZWFkMTYoQ0FOX01CMjRfTEVOR1RIKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjI0X0xFTkdUSCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIyNF9MRU5HVEgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjI0X1RJTUVTVEFNUCgpIGJmaW5fcmVhZDE2KENBTl9NQjI0X1RJTUVTVEFNUCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIyNF9USU1FU1RBTVAodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMjRfVElNRVNUQU1QLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIyNF9JRDAoKSAgICAgICBiZmluX3JlYWQxNihDQU5fTUIyNF9JRDApCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMjRfSUQwKHZhbCkgICBiZmluX3dyaXRlMTYoQ0FOX01CMjRfSUQwLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIyNF9JRDEoKSAgICAgICBiZmluX3JlYWQxNihDQU5fTUIyNF9JRDEpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMjRfSUQxKHZhbCkgICBiZmluX3dyaXRlMTYoQ0FOX01CMjRfSUQxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIyNV9EQVRBMCgpICAgICBiZmluX3JlYWQxNihDQU5fTUIyNV9EQVRBMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIyNV9EQVRBMCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIyNV9EQVRBMCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMjVfREFUQTEoKSAgICAgYmZpbl9yZWFkMTYoQ0FOX01CMjVfREFUQTEpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMjVfREFUQTEodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMjVfREFUQTEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjI1X0RBVEEyKCkgICAgIGJmaW5fcmVhZDE2KENBTl9NQjI1X0RBVEEyKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjI1X0RBVEEyKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjI1X0RBVEEyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIyNV9EQVRBMygpICAgICBiZmluX3JlYWQxNihDQU5fTUIyNV9EQVRBMykKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIyNV9EQVRBMyh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIyNV9EQVRBMywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMjVfTEVOR1RIKCkgICAgYmZpbl9yZWFkMTYoQ0FOX01CMjVfTEVOR1RIKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjI1X0xFTkdUSCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIyNV9MRU5HVEgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjI1X1RJTUVTVEFNUCgpIGJmaW5fcmVhZDE2KENBTl9NQjI1X1RJTUVTVEFNUCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIyNV9USU1FU1RBTVAodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMjVfVElNRVNUQU1QLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIyNV9JRDAoKSAgICAgICBiZmluX3JlYWQxNihDQU5fTUIyNV9JRDApCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMjVfSUQwKHZhbCkgICBiZmluX3dyaXRlMTYoQ0FOX01CMjVfSUQwLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIyNV9JRDEoKSAgICAgICBiZmluX3JlYWQxNihDQU5fTUIyNV9JRDEpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMjVfSUQxKHZhbCkgICBiZmluX3dyaXRlMTYoQ0FOX01CMjVfSUQxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIyNl9EQVRBMCgpICAgICBiZmluX3JlYWQxNihDQU5fTUIyNl9EQVRBMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIyNl9EQVRBMCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIyNl9EQVRBMCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMjZfREFUQTEoKSAgICAgYmZpbl9yZWFkMTYoQ0FOX01CMjZfREFUQTEpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMjZfREFUQTEodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMjZfREFUQTEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjI2X0RBVEEyKCkgICAgIGJmaW5fcmVhZDE2KENBTl9NQjI2X0RBVEEyKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjI2X0RBVEEyKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjI2X0RBVEEyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIyNl9EQVRBMygpICAgICBiZmluX3JlYWQxNihDQU5fTUIyNl9EQVRBMykKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIyNl9EQVRBMyh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIyNl9EQVRBMywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMjZfTEVOR1RIKCkgICAgYmZpbl9yZWFkMTYoQ0FOX01CMjZfTEVOR1RIKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjI2X0xFTkdUSCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIyNl9MRU5HVEgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjI2X1RJTUVTVEFNUCgpIGJmaW5fcmVhZDE2KENBTl9NQjI2X1RJTUVTVEFNUCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIyNl9USU1FU1RBTVAodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMjZfVElNRVNUQU1QLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIyNl9JRDAoKSAgICAgICBiZmluX3JlYWQxNihDQU5fTUIyNl9JRDApCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMjZfSUQwKHZhbCkgICBiZmluX3dyaXRlMTYoQ0FOX01CMjZfSUQwLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIyNl9JRDEoKSAgICAgICBiZmluX3JlYWQxNihDQU5fTUIyNl9JRDEpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMjZfSUQxKHZhbCkgICBiZmluX3dyaXRlMTYoQ0FOX01CMjZfSUQxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIyN19EQVRBMCgpICAgICBiZmluX3JlYWQxNihDQU5fTUIyN19EQVRBMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIyN19EQVRBMCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIyN19EQVRBMCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMjdfREFUQTEoKSAgICAgYmZpbl9yZWFkMTYoQ0FOX01CMjdfREFUQTEpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMjdfREFUQTEodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMjdfREFUQTEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjI3X0RBVEEyKCkgICAgIGJmaW5fcmVhZDE2KENBTl9NQjI3X0RBVEEyKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjI3X0RBVEEyKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjI3X0RBVEEyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIyN19EQVRBMygpICAgICBiZmluX3JlYWQxNihDQU5fTUIyN19EQVRBMykKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIyN19EQVRBMyh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIyN19EQVRBMywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMjdfTEVOR1RIKCkgICAgYmZpbl9yZWFkMTYoQ0FOX01CMjdfTEVOR1RIKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjI3X0xFTkdUSCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIyN19MRU5HVEgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjI3X1RJTUVTVEFNUCgpIGJmaW5fcmVhZDE2KENBTl9NQjI3X1RJTUVTVEFNUCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIyN19USU1FU1RBTVAodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMjdfVElNRVNUQU1QLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIyN19JRDAoKSAgICAgICBiZmluX3JlYWQxNihDQU5fTUIyN19JRDApCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMjdfSUQwKHZhbCkgICBiZmluX3dyaXRlMTYoQ0FOX01CMjdfSUQwLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIyN19JRDEoKSAgICAgICBiZmluX3JlYWQxNihDQU5fTUIyN19JRDEpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMjdfSUQxKHZhbCkgICBiZmluX3dyaXRlMTYoQ0FOX01CMjdfSUQxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIyOF9EQVRBMCgpICAgICBiZmluX3JlYWQxNihDQU5fTUIyOF9EQVRBMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIyOF9EQVRBMCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIyOF9EQVRBMCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMjhfREFUQTEoKSAgICAgYmZpbl9yZWFkMTYoQ0FOX01CMjhfREFUQTEpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMjhfREFUQTEodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMjhfREFUQTEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjI4X0RBVEEyKCkgICAgIGJmaW5fcmVhZDE2KENBTl9NQjI4X0RBVEEyKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjI4X0RBVEEyKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjI4X0RBVEEyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIyOF9EQVRBMygpICAgICBiZmluX3JlYWQxNihDQU5fTUIyOF9EQVRBMykKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIyOF9EQVRBMyh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIyOF9EQVRBMywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMjhfTEVOR1RIKCkgICAgYmZpbl9yZWFkMTYoQ0FOX01CMjhfTEVOR1RIKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjI4X0xFTkdUSCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIyOF9MRU5HVEgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjI4X1RJTUVTVEFNUCgpIGJmaW5fcmVhZDE2KENBTl9NQjI4X1RJTUVTVEFNUCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIyOF9USU1FU1RBTVAodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMjhfVElNRVNUQU1QLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIyOF9JRDAoKSAgICAgICBiZmluX3JlYWQxNihDQU5fTUIyOF9JRDApCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMjhfSUQwKHZhbCkgICBiZmluX3dyaXRlMTYoQ0FOX01CMjhfSUQwLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIyOF9JRDEoKSAgICAgICBiZmluX3JlYWQxNihDQU5fTUIyOF9JRDEpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMjhfSUQxKHZhbCkgICBiZmluX3dyaXRlMTYoQ0FOX01CMjhfSUQxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIyOV9EQVRBMCgpICAgICBiZmluX3JlYWQxNihDQU5fTUIyOV9EQVRBMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIyOV9EQVRBMCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIyOV9EQVRBMCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMjlfREFUQTEoKSAgICAgYmZpbl9yZWFkMTYoQ0FOX01CMjlfREFUQTEpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMjlfREFUQTEodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMjlfREFUQTEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjI5X0RBVEEyKCkgICAgIGJmaW5fcmVhZDE2KENBTl9NQjI5X0RBVEEyKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjI5X0RBVEEyKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjI5X0RBVEEyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIyOV9EQVRBMygpICAgICBiZmluX3JlYWQxNihDQU5fTUIyOV9EQVRBMykKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIyOV9EQVRBMyh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIyOV9EQVRBMywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMjlfTEVOR1RIKCkgICAgYmZpbl9yZWFkMTYoQ0FOX01CMjlfTEVOR1RIKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjI5X0xFTkdUSCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIyOV9MRU5HVEgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjI5X1RJTUVTVEFNUCgpIGJmaW5fcmVhZDE2KENBTl9NQjI5X1RJTUVTVEFNUCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIyOV9USU1FU1RBTVAodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMjlfVElNRVNUQU1QLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIyOV9JRDAoKSAgICAgICBiZmluX3JlYWQxNihDQU5fTUIyOV9JRDApCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMjlfSUQwKHZhbCkgICBiZmluX3dyaXRlMTYoQ0FOX01CMjlfSUQwLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIyOV9JRDEoKSAgICAgICBiZmluX3JlYWQxNihDQU5fTUIyOV9JRDEpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMjlfSUQxKHZhbCkgICBiZmluX3dyaXRlMTYoQ0FOX01CMjlfSUQxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIzMF9EQVRBMCgpICAgICBiZmluX3JlYWQxNihDQU5fTUIzMF9EQVRBMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIzMF9EQVRBMCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIzMF9EQVRBMCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMzBfREFUQTEoKSAgICAgYmZpbl9yZWFkMTYoQ0FOX01CMzBfREFUQTEpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMzBfREFUQTEodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMzBfREFUQTEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjMwX0RBVEEyKCkgICAgIGJmaW5fcmVhZDE2KENBTl9NQjMwX0RBVEEyKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjMwX0RBVEEyKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjMwX0RBVEEyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIzMF9EQVRBMygpICAgICBiZmluX3JlYWQxNihDQU5fTUIzMF9EQVRBMykKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIzMF9EQVRBMyh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIzMF9EQVRBMywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMzBfTEVOR1RIKCkgICAgYmZpbl9yZWFkMTYoQ0FOX01CMzBfTEVOR1RIKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjMwX0xFTkdUSCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIzMF9MRU5HVEgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjMwX1RJTUVTVEFNUCgpIGJmaW5fcmVhZDE2KENBTl9NQjMwX1RJTUVTVEFNUCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIzMF9USU1FU1RBTVAodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMzBfVElNRVNUQU1QLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIzMF9JRDAoKSAgICAgICBiZmluX3JlYWQxNihDQU5fTUIzMF9JRDApCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMzBfSUQwKHZhbCkgICBiZmluX3dyaXRlMTYoQ0FOX01CMzBfSUQwLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIzMF9JRDEoKSAgICAgICBiZmluX3JlYWQxNihDQU5fTUIzMF9JRDEpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMzBfSUQxKHZhbCkgICBiZmluX3dyaXRlMTYoQ0FOX01CMzBfSUQxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIzMV9EQVRBMCgpICAgICBiZmluX3JlYWQxNihDQU5fTUIzMV9EQVRBMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIzMV9EQVRBMCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIzMV9EQVRBMCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMzFfREFUQTEoKSAgICAgYmZpbl9yZWFkMTYoQ0FOX01CMzFfREFUQTEpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMzFfREFUQTEodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMzFfREFUQTEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjMxX0RBVEEyKCkgICAgIGJmaW5fcmVhZDE2KENBTl9NQjMxX0RBVEEyKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjMxX0RBVEEyKHZhbCkgYmZpbl93cml0ZTE2KENBTl9NQjMxX0RBVEEyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIzMV9EQVRBMygpICAgICBiZmluX3JlYWQxNihDQU5fTUIzMV9EQVRBMykKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIzMV9EQVRBMyh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIzMV9EQVRBMywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQ0FOX01CMzFfTEVOR1RIKCkgICAgYmZpbl9yZWFkMTYoQ0FOX01CMzFfTEVOR1RIKQorI2RlZmluZSBiZmluX3dyaXRlX0NBTl9NQjMxX0xFTkdUSCh2YWwpIGJmaW5fd3JpdGUxNihDQU5fTUIzMV9MRU5HVEgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0NBTl9NQjMxX1RJTUVTVEFNUCgpIGJmaW5fcmVhZDE2KENBTl9NQjMxX1RJTUVTVEFNUCkKKyNkZWZpbmUgYmZpbl93cml0ZV9DQU5fTUIzMV9USU1FU1RBTVAodmFsKSBiZmluX3dyaXRlMTYoQ0FOX01CMzFfVElNRVNUQU1QLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIzMV9JRDAoKSAgICAgICBiZmluX3JlYWQxNihDQU5fTUIzMV9JRDApCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMzFfSUQwKHZhbCkgICBiZmluX3dyaXRlMTYoQ0FOX01CMzFfSUQwLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9DQU5fTUIzMV9JRDEoKSAgICAgICBiZmluX3JlYWQxNihDQU5fTUIzMV9JRDEpCisjZGVmaW5lIGJmaW5fd3JpdGVfQ0FOX01CMzFfSUQxKHZhbCkgICBiZmluX3dyaXRlMTYoQ0FOX01CMzFfSUQxLCB2YWwpCisKKy8qIFRoZXNlIG5lZWQgdG8gYmUgbGFzdCBkdWUgdG8gdGhlIGNkZWYvbGludXggaW50ZXItZGVwZW5kZW5jaWVzICovCisjaW5jbHVkZSA8YXNtL2lycS5oPgorCisvKiBXcml0aW5nIHRvIFBMTF9DVEwgaW5pdGlhdGVzIGEgUExMIHJlbG9jayBzZXF1ZW5jZS4gKi8KK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgYmZpbl93cml0ZV9QTExfQ1RMKHVuc2lnbmVkIGludCB2YWwpCit7CisJdW5zaWduZWQgbG9uZyBmbGFncywgaXdyMCwgaXdyMTsKKworCWlmICh2YWwgPT0gYmZpbl9yZWFkX1BMTF9DVEwoKSkKKwkJcmV0dXJuOworCisJbG9jYWxfaXJxX3NhdmVfaHcoZmxhZ3MpOworCS8qIEVuYWJsZSB0aGUgUExMIFdha2V1cCBiaXQgaW4gU0lDIElXUiAqLworCWl3cjAgPSBiZmluX3JlYWQzMihTSUNfSVdSMCk7CisJaXdyMSA9IGJmaW5fcmVhZDMyKFNJQ19JV1IxKTsKKwkvKiBPbmx5IGFsbG93IFBQTCBXYWtldXApICovCisJYmZpbl93cml0ZTMyKFNJQ19JV1IwLCBJV1JfRU5BQkxFKDApKTsKKwliZmluX3dyaXRlMzIoU0lDX0lXUjEsIDApOworCisJYmZpbl93cml0ZTE2KFBMTF9DVEwsIHZhbCk7CisJU1NZTkMoKTsKKwlhc20oIklETEU7Iik7CisKKwliZmluX3dyaXRlMzIoU0lDX0lXUjAsIGl3cjApOworCWJmaW5fd3JpdGUzMihTSUNfSVdSMSwgaXdyMSk7CisJbG9jYWxfaXJxX3Jlc3RvcmVfaHcoZmxhZ3MpOworfQorCisvKiBXcml0aW5nIHRvIFZSX0NUTCBpbml0aWF0ZXMgYSBQTEwgcmVsb2NrIHNlcXVlbmNlLiAqLworc3RhdGljIF9faW5saW5lX18gdm9pZCBiZmluX3dyaXRlX1ZSX0NUTCh1bnNpZ25lZCBpbnQgdmFsKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIGl3cjAsIGl3cjE7CisKKwlpZiAodmFsID09IGJmaW5fcmVhZF9WUl9DVEwoKSkKKwkJcmV0dXJuOworCisJbG9jYWxfaXJxX3NhdmVfaHcoZmxhZ3MpOworCS8qIEVuYWJsZSB0aGUgUExMIFdha2V1cCBiaXQgaW4gU0lDIElXUiAqLworCWl3cjAgPSBiZmluX3JlYWQzMihTSUNfSVdSMCk7CisJaXdyMSA9IGJmaW5fcmVhZDMyKFNJQ19JV1IxKTsKKwkvKiBPbmx5IGFsbG93IFBQTCBXYWtldXApICovCisJYmZpbl93cml0ZTMyKFNJQ19JV1IwLCBJV1JfRU5BQkxFKDApKTsKKwliZmluX3dyaXRlMzIoU0lDX0lXUjEsIDApOworCisJYmZpbl93cml0ZTE2KFZSX0NUTCwgdmFsKTsKKwlTU1lOQygpOworCWFzbSgiSURMRTsiKTsKKworCWJmaW5fd3JpdGUzMihTSUNfSVdSMCwgaXdyMCk7CisJYmZpbl93cml0ZTMyKFNJQ19JV1IxLCBpd3IxKTsKKwlsb2NhbF9pcnFfcmVzdG9yZV9odyhmbGFncyk7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM4L2luY2x1ZGUvbWFjaC9jZGVmQkY1MzkuaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzOC9pbmNsdWRlL21hY2gvY2RlZkJGNTM5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTk4YzRiYgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzOC9pbmNsdWRlL21hY2gvY2RlZkJGNTM5LmgKQEAgLTAsMCArMSwyNDAgQEAKKy8qIERPIE5PVCBFRElUIFRISVMgRklMRQorICogQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgZ2VuZXJhdGUtY2RlZi1oZWFkZXJzLnhzbAorICogRE8gTk9UIEVESVQgVEhJUyBGSUxFCisgKi8KKworI2lmbmRlZiBfQ0RFRl9CRjUzOV9ICisjZGVmaW5lIF9DREVGX0JGNTM5X0gKKworLyogSW5jbHVkZSBNTVJzIENvbW1vbiB0byBCRjUzOCAJCQkJCQkJCSovCisjaW5jbHVkZSAiY2RlZkJGNTM4LmgiCisKKworI2RlZmluZSBiZmluX3JlYWRfTVhWUl9DT05GSUcoKSAgICAgICAgYmZpbl9yZWFkMTYoTVhWUl9DT05GSUcpCisjZGVmaW5lIGJmaW5fd3JpdGVfTVhWUl9DT05GSUcodmFsKSAgICBiZmluX3dyaXRlMTYoTVhWUl9DT05GSUcsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01YVlJfUExMX0NUTF8wKCkgICAgIGJmaW5fcmVhZDMyKE1YVlJfUExMX0NUTF8wKQorI2RlZmluZSBiZmluX3dyaXRlX01YVlJfUExMX0NUTF8wKHZhbCkgYmZpbl93cml0ZTMyKE1YVlJfUExMX0NUTF8wLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NWFZSX1NUQVRFXzAoKSAgICAgICBiZmluX3JlYWQzMihNWFZSX1NUQVRFXzApCisjZGVmaW5lIGJmaW5fd3JpdGVfTVhWUl9TVEFURV8wKHZhbCkgICBiZmluX3dyaXRlMzIoTVhWUl9TVEFURV8wLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NWFZSX1NUQVRFXzEoKSAgICAgICBiZmluX3JlYWQzMihNWFZSX1NUQVRFXzEpCisjZGVmaW5lIGJmaW5fd3JpdGVfTVhWUl9TVEFURV8xKHZhbCkgICBiZmluX3dyaXRlMzIoTVhWUl9TVEFURV8xLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NWFZSX0lOVF9TVEFUXzAoKSAgICBiZmluX3JlYWQzMihNWFZSX0lOVF9TVEFUXzApCisjZGVmaW5lIGJmaW5fd3JpdGVfTVhWUl9JTlRfU1RBVF8wKHZhbCkgYmZpbl93cml0ZTMyKE1YVlJfSU5UX1NUQVRfMCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTVhWUl9JTlRfU1RBVF8xKCkgICAgYmZpbl9yZWFkMzIoTVhWUl9JTlRfU1RBVF8xKQorI2RlZmluZSBiZmluX3dyaXRlX01YVlJfSU5UX1NUQVRfMSh2YWwpIGJmaW5fd3JpdGUzMihNWFZSX0lOVF9TVEFUXzEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01YVlJfSU5UX0VOXzAoKSAgICAgIGJmaW5fcmVhZDMyKE1YVlJfSU5UX0VOXzApCisjZGVmaW5lIGJmaW5fd3JpdGVfTVhWUl9JTlRfRU5fMCh2YWwpICBiZmluX3dyaXRlMzIoTVhWUl9JTlRfRU5fMCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTVhWUl9JTlRfRU5fMSgpICAgICAgYmZpbl9yZWFkMzIoTVhWUl9JTlRfRU5fMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9NWFZSX0lOVF9FTl8xKHZhbCkgIGJmaW5fd3JpdGUzMihNWFZSX0lOVF9FTl8xLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NWFZSX1BPU0lUSU9OKCkgICAgICBiZmluX3JlYWQxNihNWFZSX1BPU0lUSU9OKQorI2RlZmluZSBiZmluX3dyaXRlX01YVlJfUE9TSVRJT04odmFsKSAgYmZpbl93cml0ZTE2KE1YVlJfUE9TSVRJT04sIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01YVlJfTUFYX1BPU0lUSU9OKCkgIGJmaW5fcmVhZDE2KE1YVlJfTUFYX1BPU0lUSU9OKQorI2RlZmluZSBiZmluX3dyaXRlX01YVlJfTUFYX1BPU0lUSU9OKHZhbCkgYmZpbl93cml0ZTE2KE1YVlJfTUFYX1BPU0lUSU9OLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NWFZSX0RFTEFZKCkgICAgICAgICBiZmluX3JlYWQxNihNWFZSX0RFTEFZKQorI2RlZmluZSBiZmluX3dyaXRlX01YVlJfREVMQVkodmFsKSAgICAgYmZpbl93cml0ZTE2KE1YVlJfREVMQVksIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01YVlJfTUFYX0RFTEFZKCkgICAgIGJmaW5fcmVhZDE2KE1YVlJfTUFYX0RFTEFZKQorI2RlZmluZSBiZmluX3dyaXRlX01YVlJfTUFYX0RFTEFZKHZhbCkgYmZpbl93cml0ZTE2KE1YVlJfTUFYX0RFTEFZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NWFZSX0xBRERSKCkgICAgICAgICBiZmluX3JlYWQzMihNWFZSX0xBRERSKQorI2RlZmluZSBiZmluX3dyaXRlX01YVlJfTEFERFIodmFsKSAgICAgYmZpbl93cml0ZTMyKE1YVlJfTEFERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01YVlJfR0FERFIoKSAgICAgICAgIGJmaW5fcmVhZDE2KE1YVlJfR0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfTVhWUl9HQUREUih2YWwpICAgICBiZmluX3dyaXRlMTYoTVhWUl9HQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTVhWUl9BQUREUigpICAgICAgICAgYmZpbl9yZWFkMzIoTVhWUl9BQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NWFZSX0FBRERSKHZhbCkgICAgIGJmaW5fd3JpdGUzMihNWFZSX0FBRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NWFZSX0FMTE9DXzAoKSAgICAgICBiZmluX3JlYWQzMihNWFZSX0FMTE9DXzApCisjZGVmaW5lIGJmaW5fd3JpdGVfTVhWUl9BTExPQ18wKHZhbCkgICBiZmluX3dyaXRlMzIoTVhWUl9BTExPQ18wLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NWFZSX0FMTE9DXzEoKSAgICAgICBiZmluX3JlYWQzMihNWFZSX0FMTE9DXzEpCisjZGVmaW5lIGJmaW5fd3JpdGVfTVhWUl9BTExPQ18xKHZhbCkgICBiZmluX3dyaXRlMzIoTVhWUl9BTExPQ18xLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NWFZSX0FMTE9DXzIoKSAgICAgICBiZmluX3JlYWQzMihNWFZSX0FMTE9DXzIpCisjZGVmaW5lIGJmaW5fd3JpdGVfTVhWUl9BTExPQ18yKHZhbCkgICBiZmluX3dyaXRlMzIoTVhWUl9BTExPQ18yLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NWFZSX0FMTE9DXzMoKSAgICAgICBiZmluX3JlYWQzMihNWFZSX0FMTE9DXzMpCisjZGVmaW5lIGJmaW5fd3JpdGVfTVhWUl9BTExPQ18zKHZhbCkgICBiZmluX3dyaXRlMzIoTVhWUl9BTExPQ18zLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NWFZSX0FMTE9DXzQoKSAgICAgICBiZmluX3JlYWQzMihNWFZSX0FMTE9DXzQpCisjZGVmaW5lIGJmaW5fd3JpdGVfTVhWUl9BTExPQ180KHZhbCkgICBiZmluX3dyaXRlMzIoTVhWUl9BTExPQ180LCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NWFZSX0FMTE9DXzUoKSAgICAgICBiZmluX3JlYWQzMihNWFZSX0FMTE9DXzUpCisjZGVmaW5lIGJmaW5fd3JpdGVfTVhWUl9BTExPQ181KHZhbCkgICBiZmluX3dyaXRlMzIoTVhWUl9BTExPQ181LCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NWFZSX0FMTE9DXzYoKSAgICAgICBiZmluX3JlYWQzMihNWFZSX0FMTE9DXzYpCisjZGVmaW5lIGJmaW5fd3JpdGVfTVhWUl9BTExPQ182KHZhbCkgICBiZmluX3dyaXRlMzIoTVhWUl9BTExPQ182LCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NWFZSX0FMTE9DXzcoKSAgICAgICBiZmluX3JlYWQzMihNWFZSX0FMTE9DXzcpCisjZGVmaW5lIGJmaW5fd3JpdGVfTVhWUl9BTExPQ183KHZhbCkgICBiZmluX3dyaXRlMzIoTVhWUl9BTExPQ183LCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NWFZSX0FMTE9DXzgoKSAgICAgICBiZmluX3JlYWQzMihNWFZSX0FMTE9DXzgpCisjZGVmaW5lIGJmaW5fd3JpdGVfTVhWUl9BTExPQ184KHZhbCkgICBiZmluX3dyaXRlMzIoTVhWUl9BTExPQ184LCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NWFZSX0FMTE9DXzkoKSAgICAgICBiZmluX3JlYWQzMihNWFZSX0FMTE9DXzkpCisjZGVmaW5lIGJmaW5fd3JpdGVfTVhWUl9BTExPQ185KHZhbCkgICBiZmluX3dyaXRlMzIoTVhWUl9BTExPQ185LCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NWFZSX0FMTE9DXzEwKCkgICAgICBiZmluX3JlYWQzMihNWFZSX0FMTE9DXzEwKQorI2RlZmluZSBiZmluX3dyaXRlX01YVlJfQUxMT0NfMTAodmFsKSAgYmZpbl93cml0ZTMyKE1YVlJfQUxMT0NfMTAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01YVlJfQUxMT0NfMTEoKSAgICAgIGJmaW5fcmVhZDMyKE1YVlJfQUxMT0NfMTEpCisjZGVmaW5lIGJmaW5fd3JpdGVfTVhWUl9BTExPQ18xMSh2YWwpICBiZmluX3dyaXRlMzIoTVhWUl9BTExPQ18xMSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTVhWUl9BTExPQ18xMigpICAgICAgYmZpbl9yZWFkMzIoTVhWUl9BTExPQ18xMikKKyNkZWZpbmUgYmZpbl93cml0ZV9NWFZSX0FMTE9DXzEyKHZhbCkgIGJmaW5fd3JpdGUzMihNWFZSX0FMTE9DXzEyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NWFZSX0FMTE9DXzEzKCkgICAgICBiZmluX3JlYWQzMihNWFZSX0FMTE9DXzEzKQorI2RlZmluZSBiZmluX3dyaXRlX01YVlJfQUxMT0NfMTModmFsKSAgYmZpbl93cml0ZTMyKE1YVlJfQUxMT0NfMTMsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01YVlJfQUxMT0NfMTQoKSAgICAgIGJmaW5fcmVhZDMyKE1YVlJfQUxMT0NfMTQpCisjZGVmaW5lIGJmaW5fd3JpdGVfTVhWUl9BTExPQ18xNCh2YWwpICBiZmluX3dyaXRlMzIoTVhWUl9BTExPQ18xNCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTVhWUl9TWU5DX0xDSEFOXzAoKSAgYmZpbl9yZWFkMzIoTVhWUl9TWU5DX0xDSEFOXzApCisjZGVmaW5lIGJmaW5fd3JpdGVfTVhWUl9TWU5DX0xDSEFOXzAodmFsKSBiZmluX3dyaXRlMzIoTVhWUl9TWU5DX0xDSEFOXzAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01YVlJfU1lOQ19MQ0hBTl8xKCkgIGJmaW5fcmVhZDMyKE1YVlJfU1lOQ19MQ0hBTl8xKQorI2RlZmluZSBiZmluX3dyaXRlX01YVlJfU1lOQ19MQ0hBTl8xKHZhbCkgYmZpbl93cml0ZTMyKE1YVlJfU1lOQ19MQ0hBTl8xLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NWFZSX1NZTkNfTENIQU5fMigpICBiZmluX3JlYWQzMihNWFZSX1NZTkNfTENIQU5fMikKKyNkZWZpbmUgYmZpbl93cml0ZV9NWFZSX1NZTkNfTENIQU5fMih2YWwpIGJmaW5fd3JpdGUzMihNWFZSX1NZTkNfTENIQU5fMiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTVhWUl9TWU5DX0xDSEFOXzMoKSAgYmZpbl9yZWFkMzIoTVhWUl9TWU5DX0xDSEFOXzMpCisjZGVmaW5lIGJmaW5fd3JpdGVfTVhWUl9TWU5DX0xDSEFOXzModmFsKSBiZmluX3dyaXRlMzIoTVhWUl9TWU5DX0xDSEFOXzMsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01YVlJfU1lOQ19MQ0hBTl80KCkgIGJmaW5fcmVhZDMyKE1YVlJfU1lOQ19MQ0hBTl80KQorI2RlZmluZSBiZmluX3dyaXRlX01YVlJfU1lOQ19MQ0hBTl80KHZhbCkgYmZpbl93cml0ZTMyKE1YVlJfU1lOQ19MQ0hBTl80LCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NWFZSX1NZTkNfTENIQU5fNSgpICBiZmluX3JlYWQzMihNWFZSX1NZTkNfTENIQU5fNSkKKyNkZWZpbmUgYmZpbl93cml0ZV9NWFZSX1NZTkNfTENIQU5fNSh2YWwpIGJmaW5fd3JpdGUzMihNWFZSX1NZTkNfTENIQU5fNSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTVhWUl9TWU5DX0xDSEFOXzYoKSAgYmZpbl9yZWFkMzIoTVhWUl9TWU5DX0xDSEFOXzYpCisjZGVmaW5lIGJmaW5fd3JpdGVfTVhWUl9TWU5DX0xDSEFOXzYodmFsKSBiZmluX3dyaXRlMzIoTVhWUl9TWU5DX0xDSEFOXzYsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01YVlJfU1lOQ19MQ0hBTl83KCkgIGJmaW5fcmVhZDMyKE1YVlJfU1lOQ19MQ0hBTl83KQorI2RlZmluZSBiZmluX3dyaXRlX01YVlJfU1lOQ19MQ0hBTl83KHZhbCkgYmZpbl93cml0ZTMyKE1YVlJfU1lOQ19MQ0hBTl83LCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NWFZSX0RNQTBfQ09ORklHKCkgICBiZmluX3JlYWQzMihNWFZSX0RNQTBfQ09ORklHKQorI2RlZmluZSBiZmluX3dyaXRlX01YVlJfRE1BMF9DT05GSUcodmFsKSBiZmluX3dyaXRlMzIoTVhWUl9ETUEwX0NPTkZJRywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTVhWUl9ETUEwX1NUQVJUX0FERFIoKSBiZmluX3JlYWRQVFIoTVhWUl9ETUEwX1NUQVJUX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfTVhWUl9ETUEwX1NUQVJUX0FERFIodmFsKSBiZmluX3dyaXRlUFRSKE1YVlJfRE1BMF9TVEFSVF9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NWFZSX0RNQTBfQ09VTlQoKSAgICBiZmluX3JlYWQxNihNWFZSX0RNQTBfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfTVhWUl9ETUEwX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KE1YVlJfRE1BMF9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTVhWUl9ETUEwX0NVUlJfQUREUigpIGJmaW5fcmVhZFBUUihNWFZSX0RNQTBfQ1VSUl9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX01YVlJfRE1BMF9DVVJSX0FERFIodmFsKSBiZmluX3dyaXRlUFRSKE1YVlJfRE1BMF9DVVJSX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01YVlJfRE1BMF9DVVJSX0NPVU5UKCkgYmZpbl9yZWFkMTYoTVhWUl9ETUEwX0NVUlJfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfTVhWUl9ETUEwX0NVUlJfQ09VTlQodmFsKSBiZmluX3dyaXRlMTYoTVhWUl9ETUEwX0NVUlJfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01YVlJfRE1BMV9DT05GSUcoKSAgIGJmaW5fcmVhZDMyKE1YVlJfRE1BMV9DT05GSUcpCisjZGVmaW5lIGJmaW5fd3JpdGVfTVhWUl9ETUExX0NPTkZJRyh2YWwpIGJmaW5fd3JpdGUzMihNWFZSX0RNQTFfQ09ORklHLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NWFZSX0RNQTFfU1RBUlRfQUREUigpIGJmaW5fcmVhZFBUUihNWFZSX0RNQTFfU1RBUlRfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NWFZSX0RNQTFfU1RBUlRfQUREUih2YWwpIGJmaW5fd3JpdGVQVFIoTVhWUl9ETUExX1NUQVJUX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01YVlJfRE1BMV9DT1VOVCgpICAgIGJmaW5fcmVhZDE2KE1YVlJfRE1BMV9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NWFZSX0RNQTFfQ09VTlQodmFsKSBiZmluX3dyaXRlMTYoTVhWUl9ETUExX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NWFZSX0RNQTFfQ1VSUl9BRERSKCkgYmZpbl9yZWFkUFRSKE1YVlJfRE1BMV9DVVJSX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfTVhWUl9ETUExX0NVUlJfQUREUih2YWwpIGJmaW5fd3JpdGVQVFIoTVhWUl9ETUExX0NVUlJfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTVhWUl9ETUExX0NVUlJfQ09VTlQoKSBiZmluX3JlYWQxNihNWFZSX0RNQTFfQ1VSUl9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NWFZSX0RNQTFfQ1VSUl9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihNWFZSX0RNQTFfQ1VSUl9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTVhWUl9ETUEyX0NPTkZJRygpICAgYmZpbl9yZWFkMzIoTVhWUl9ETUEyX0NPTkZJRykKKyNkZWZpbmUgYmZpbl93cml0ZV9NWFZSX0RNQTJfQ09ORklHKHZhbCkgYmZpbl93cml0ZTMyKE1YVlJfRE1BMl9DT05GSUcsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01YVlJfRE1BMl9TVEFSVF9BRERSKCkgYmZpbl9yZWFkUFRSKE1YVlJfRE1BMl9TVEFSVF9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX01YVlJfRE1BMl9TVEFSVF9BRERSKHZhbCkgYmZpbl93cml0ZVBUUihNWFZSX0RNQTJfU1RBUlRfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTVhWUl9ETUEyX0NPVU5UKCkgICAgYmZpbl9yZWFkMTYoTVhWUl9ETUEyX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX01YVlJfRE1BMl9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihNWFZSX0RNQTJfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01YVlJfRE1BMl9DVVJSX0FERFIoKSBiZmluX3JlYWRQVFIoTVhWUl9ETUEyX0NVUlJfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NWFZSX0RNQTJfQ1VSUl9BRERSKHZhbCkgYmZpbl93cml0ZVBUUihNWFZSX0RNQTJfQ1VSUl9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NWFZSX0RNQTJfQ1VSUl9DT1VOVCgpIGJmaW5fcmVhZDE2KE1YVlJfRE1BMl9DVVJSX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX01YVlJfRE1BMl9DVVJSX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KE1YVlJfRE1BMl9DVVJSX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NWFZSX0RNQTNfQ09ORklHKCkgICBiZmluX3JlYWQzMihNWFZSX0RNQTNfQ09ORklHKQorI2RlZmluZSBiZmluX3dyaXRlX01YVlJfRE1BM19DT05GSUcodmFsKSBiZmluX3dyaXRlMzIoTVhWUl9ETUEzX0NPTkZJRywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTVhWUl9ETUEzX1NUQVJUX0FERFIoKSBiZmluX3JlYWRQVFIoTVhWUl9ETUEzX1NUQVJUX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfTVhWUl9ETUEzX1NUQVJUX0FERFIodmFsKSBiZmluX3dyaXRlUFRSKE1YVlJfRE1BM19TVEFSVF9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NWFZSX0RNQTNfQ09VTlQoKSAgICBiZmluX3JlYWQxNihNWFZSX0RNQTNfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfTVhWUl9ETUEzX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KE1YVlJfRE1BM19DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTVhWUl9ETUEzX0NVUlJfQUREUigpIGJmaW5fcmVhZFBUUihNWFZSX0RNQTNfQ1VSUl9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX01YVlJfRE1BM19DVVJSX0FERFIodmFsKSBiZmluX3dyaXRlUFRSKE1YVlJfRE1BM19DVVJSX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01YVlJfRE1BM19DVVJSX0NPVU5UKCkgYmZpbl9yZWFkMTYoTVhWUl9ETUEzX0NVUlJfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfTVhWUl9ETUEzX0NVUlJfQ09VTlQodmFsKSBiZmluX3dyaXRlMTYoTVhWUl9ETUEzX0NVUlJfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01YVlJfRE1BNF9DT05GSUcoKSAgIGJmaW5fcmVhZDMyKE1YVlJfRE1BNF9DT05GSUcpCisjZGVmaW5lIGJmaW5fd3JpdGVfTVhWUl9ETUE0X0NPTkZJRyh2YWwpIGJmaW5fd3JpdGUzMihNWFZSX0RNQTRfQ09ORklHLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NWFZSX0RNQTRfU1RBUlRfQUREUigpIGJmaW5fcmVhZFBUUihNWFZSX0RNQTRfU1RBUlRfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NWFZSX0RNQTRfU1RBUlRfQUREUih2YWwpIGJmaW5fd3JpdGVQVFIoTVhWUl9ETUE0X1NUQVJUX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01YVlJfRE1BNF9DT1VOVCgpICAgIGJmaW5fcmVhZDE2KE1YVlJfRE1BNF9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NWFZSX0RNQTRfQ09VTlQodmFsKSBiZmluX3dyaXRlMTYoTVhWUl9ETUE0X0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NWFZSX0RNQTRfQ1VSUl9BRERSKCkgYmZpbl9yZWFkUFRSKE1YVlJfRE1BNF9DVVJSX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfTVhWUl9ETUE0X0NVUlJfQUREUih2YWwpIGJmaW5fd3JpdGVQVFIoTVhWUl9ETUE0X0NVUlJfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTVhWUl9ETUE0X0NVUlJfQ09VTlQoKSBiZmluX3JlYWQxNihNWFZSX0RNQTRfQ1VSUl9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NWFZSX0RNQTRfQ1VSUl9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihNWFZSX0RNQTRfQ1VSUl9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTVhWUl9ETUE1X0NPTkZJRygpICAgYmZpbl9yZWFkMzIoTVhWUl9ETUE1X0NPTkZJRykKKyNkZWZpbmUgYmZpbl93cml0ZV9NWFZSX0RNQTVfQ09ORklHKHZhbCkgYmZpbl93cml0ZTMyKE1YVlJfRE1BNV9DT05GSUcsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01YVlJfRE1BNV9TVEFSVF9BRERSKCkgYmZpbl9yZWFkUFRSKE1YVlJfRE1BNV9TVEFSVF9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX01YVlJfRE1BNV9TVEFSVF9BRERSKHZhbCkgYmZpbl93cml0ZVBUUihNWFZSX0RNQTVfU1RBUlRfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTVhWUl9ETUE1X0NPVU5UKCkgICAgYmZpbl9yZWFkMTYoTVhWUl9ETUE1X0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX01YVlJfRE1BNV9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihNWFZSX0RNQTVfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01YVlJfRE1BNV9DVVJSX0FERFIoKSBiZmluX3JlYWRQVFIoTVhWUl9ETUE1X0NVUlJfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NWFZSX0RNQTVfQ1VSUl9BRERSKHZhbCkgYmZpbl93cml0ZVBUUihNWFZSX0RNQTVfQ1VSUl9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NWFZSX0RNQTVfQ1VSUl9DT1VOVCgpIGJmaW5fcmVhZDE2KE1YVlJfRE1BNV9DVVJSX0NPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX01YVlJfRE1BNV9DVVJSX0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KE1YVlJfRE1BNV9DVVJSX0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NWFZSX0RNQTZfQ09ORklHKCkgICBiZmluX3JlYWQzMihNWFZSX0RNQTZfQ09ORklHKQorI2RlZmluZSBiZmluX3dyaXRlX01YVlJfRE1BNl9DT05GSUcodmFsKSBiZmluX3dyaXRlMzIoTVhWUl9ETUE2X0NPTkZJRywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTVhWUl9ETUE2X1NUQVJUX0FERFIoKSBiZmluX3JlYWRQVFIoTVhWUl9ETUE2X1NUQVJUX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfTVhWUl9ETUE2X1NUQVJUX0FERFIodmFsKSBiZmluX3dyaXRlUFRSKE1YVlJfRE1BNl9TVEFSVF9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NWFZSX0RNQTZfQ09VTlQoKSAgICBiZmluX3JlYWQxNihNWFZSX0RNQTZfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfTVhWUl9ETUE2X0NPVU5UKHZhbCkgYmZpbl93cml0ZTE2KE1YVlJfRE1BNl9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTVhWUl9ETUE2X0NVUlJfQUREUigpIGJmaW5fcmVhZFBUUihNWFZSX0RNQTZfQ1VSUl9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX01YVlJfRE1BNl9DVVJSX0FERFIodmFsKSBiZmluX3dyaXRlUFRSKE1YVlJfRE1BNl9DVVJSX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01YVlJfRE1BNl9DVVJSX0NPVU5UKCkgYmZpbl9yZWFkMTYoTVhWUl9ETUE2X0NVUlJfQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfTVhWUl9ETUE2X0NVUlJfQ09VTlQodmFsKSBiZmluX3dyaXRlMTYoTVhWUl9ETUE2X0NVUlJfQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01YVlJfRE1BN19DT05GSUcoKSAgIGJmaW5fcmVhZDMyKE1YVlJfRE1BN19DT05GSUcpCisjZGVmaW5lIGJmaW5fd3JpdGVfTVhWUl9ETUE3X0NPTkZJRyh2YWwpIGJmaW5fd3JpdGUzMihNWFZSX0RNQTdfQ09ORklHLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NWFZSX0RNQTdfU1RBUlRfQUREUigpIGJmaW5fcmVhZFBUUihNWFZSX0RNQTdfU1RBUlRfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NWFZSX0RNQTdfU1RBUlRfQUREUih2YWwpIGJmaW5fd3JpdGVQVFIoTVhWUl9ETUE3X1NUQVJUX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01YVlJfRE1BN19DT1VOVCgpICAgIGJmaW5fcmVhZDE2KE1YVlJfRE1BN19DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NWFZSX0RNQTdfQ09VTlQodmFsKSBiZmluX3dyaXRlMTYoTVhWUl9ETUE3X0NPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NWFZSX0RNQTdfQ1VSUl9BRERSKCkgYmZpbl9yZWFkUFRSKE1YVlJfRE1BN19DVVJSX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfTVhWUl9ETUE3X0NVUlJfQUREUih2YWwpIGJmaW5fd3JpdGVQVFIoTVhWUl9ETUE3X0NVUlJfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTVhWUl9ETUE3X0NVUlJfQ09VTlQoKSBiZmluX3JlYWQxNihNWFZSX0RNQTdfQ1VSUl9DT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NWFZSX0RNQTdfQ1VSUl9DT1VOVCh2YWwpIGJmaW5fd3JpdGUxNihNWFZSX0RNQTdfQ1VSUl9DT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTVhWUl9BUF9DVEwoKSAgICAgICAgYmZpbl9yZWFkMTYoTVhWUl9BUF9DVEwpCisjZGVmaW5lIGJmaW5fd3JpdGVfTVhWUl9BUF9DVEwodmFsKSAgICBiZmluX3dyaXRlMTYoTVhWUl9BUF9DVEwsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01YVlJfQVBSQl9TVEFSVF9BRERSKCkgYmZpbl9yZWFkUFRSKE1YVlJfQVBSQl9TVEFSVF9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX01YVlJfQVBSQl9TVEFSVF9BRERSKHZhbCkgYmZpbl93cml0ZVBUUihNWFZSX0FQUkJfU1RBUlRfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTVhWUl9BUFJCX0NVUlJfQUREUigpIGJmaW5fcmVhZFBUUihNWFZSX0FQUkJfQ1VSUl9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX01YVlJfQVBSQl9DVVJSX0FERFIodmFsKSBiZmluX3dyaXRlUFRSKE1YVlJfQVBSQl9DVVJSX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01YVlJfQVBUQl9TVEFSVF9BRERSKCkgYmZpbl9yZWFkUFRSKE1YVlJfQVBUQl9TVEFSVF9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX01YVlJfQVBUQl9TVEFSVF9BRERSKHZhbCkgYmZpbl93cml0ZVBUUihNWFZSX0FQVEJfU1RBUlRfQUREUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTVhWUl9BUFRCX0NVUlJfQUREUigpIGJmaW5fcmVhZFBUUihNWFZSX0FQVEJfQ1VSUl9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX01YVlJfQVBUQl9DVVJSX0FERFIodmFsKSBiZmluX3dyaXRlUFRSKE1YVlJfQVBUQl9DVVJSX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01YVlJfQ01fQ1RMKCkgICAgICAgIGJmaW5fcmVhZDMyKE1YVlJfQ01fQ1RMKQorI2RlZmluZSBiZmluX3dyaXRlX01YVlJfQ01fQ1RMKHZhbCkgICAgYmZpbl93cml0ZTMyKE1YVlJfQ01fQ1RMLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NWFZSX0NNUkJfU1RBUlRfQUREUigpIGJmaW5fcmVhZFBUUihNWFZSX0NNUkJfU1RBUlRfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NWFZSX0NNUkJfU1RBUlRfQUREUih2YWwpIGJmaW5fd3JpdGVQVFIoTVhWUl9DTVJCX1NUQVJUX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01YVlJfQ01SQl9DVVJSX0FERFIoKSBiZmluX3JlYWRQVFIoTVhWUl9DTVJCX0NVUlJfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NWFZSX0NNUkJfQ1VSUl9BRERSKHZhbCkgYmZpbl93cml0ZVBUUihNWFZSX0NNUkJfQ1VSUl9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NWFZSX0NNVEJfU1RBUlRfQUREUigpIGJmaW5fcmVhZFBUUihNWFZSX0NNVEJfU1RBUlRfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NWFZSX0NNVEJfU1RBUlRfQUREUih2YWwpIGJmaW5fd3JpdGVQVFIoTVhWUl9DTVRCX1NUQVJUX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01YVlJfQ01UQl9DVVJSX0FERFIoKSBiZmluX3JlYWRQVFIoTVhWUl9DTVRCX0NVUlJfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NWFZSX0NNVEJfQ1VSUl9BRERSKHZhbCkgYmZpbl93cml0ZVBUUihNWFZSX0NNVEJfQ1VSUl9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NWFZSX1JSREJfU1RBUlRfQUREUigpIGJmaW5fcmVhZFBUUihNWFZSX1JSREJfU1RBUlRfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NWFZSX1JSREJfU1RBUlRfQUREUih2YWwpIGJmaW5fd3JpdGVQVFIoTVhWUl9SUkRCX1NUQVJUX0FERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01YVlJfUlJEQl9DVVJSX0FERFIoKSBiZmluX3JlYWRQVFIoTVhWUl9SUkRCX0NVUlJfQUREUikKKyNkZWZpbmUgYmZpbl93cml0ZV9NWFZSX1JSREJfQ1VSUl9BRERSKHZhbCkgYmZpbl93cml0ZVBUUihNWFZSX1JSREJfQ1VSUl9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NWFZSX1BBVF9EQVRBXzAoKSAgICBiZmluX3JlYWQzMihNWFZSX1BBVF9EQVRBXzApCisjZGVmaW5lIGJmaW5fd3JpdGVfTVhWUl9QQVRfREFUQV8wKHZhbCkgYmZpbl93cml0ZTMyKE1YVlJfUEFUX0RBVEFfMCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTVhWUl9QQVRfRU5fMCgpICAgICAgYmZpbl9yZWFkMzIoTVhWUl9QQVRfRU5fMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NWFZSX1BBVF9FTl8wKHZhbCkgIGJmaW5fd3JpdGUzMihNWFZSX1BBVF9FTl8wLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NWFZSX1BBVF9EQVRBXzEoKSAgICBiZmluX3JlYWQzMihNWFZSX1BBVF9EQVRBXzEpCisjZGVmaW5lIGJmaW5fd3JpdGVfTVhWUl9QQVRfREFUQV8xKHZhbCkgYmZpbl93cml0ZTMyKE1YVlJfUEFUX0RBVEFfMSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTVhWUl9QQVRfRU5fMSgpICAgICAgYmZpbl9yZWFkMzIoTVhWUl9QQVRfRU5fMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9NWFZSX1BBVF9FTl8xKHZhbCkgIGJmaW5fd3JpdGUzMihNWFZSX1BBVF9FTl8xLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NWFZSX0ZSQU1FX0NOVF8wKCkgICBiZmluX3JlYWQxNihNWFZSX0ZSQU1FX0NOVF8wKQorI2RlZmluZSBiZmluX3dyaXRlX01YVlJfRlJBTUVfQ05UXzAodmFsKSBiZmluX3dyaXRlMTYoTVhWUl9GUkFNRV9DTlRfMCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTVhWUl9GUkFNRV9DTlRfMSgpICAgYmZpbl9yZWFkMTYoTVhWUl9GUkFNRV9DTlRfMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9NWFZSX0ZSQU1FX0NOVF8xKHZhbCkgYmZpbl93cml0ZTE2KE1YVlJfRlJBTUVfQ05UXzEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01YVlJfUk9VVElOR18wKCkgICAgIGJmaW5fcmVhZDMyKE1YVlJfUk9VVElOR18wKQorI2RlZmluZSBiZmluX3dyaXRlX01YVlJfUk9VVElOR18wKHZhbCkgYmZpbl93cml0ZTMyKE1YVlJfUk9VVElOR18wLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NWFZSX1JPVVRJTkdfMSgpICAgICBiZmluX3JlYWQzMihNWFZSX1JPVVRJTkdfMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9NWFZSX1JPVVRJTkdfMSh2YWwpIGJmaW5fd3JpdGUzMihNWFZSX1JPVVRJTkdfMSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTVhWUl9ST1VUSU5HXzIoKSAgICAgYmZpbl9yZWFkMzIoTVhWUl9ST1VUSU5HXzIpCisjZGVmaW5lIGJmaW5fd3JpdGVfTVhWUl9ST1VUSU5HXzIodmFsKSBiZmluX3dyaXRlMzIoTVhWUl9ST1VUSU5HXzIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01YVlJfUk9VVElOR18zKCkgICAgIGJmaW5fcmVhZDMyKE1YVlJfUk9VVElOR18zKQorI2RlZmluZSBiZmluX3dyaXRlX01YVlJfUk9VVElOR18zKHZhbCkgYmZpbl93cml0ZTMyKE1YVlJfUk9VVElOR18zLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NWFZSX1JPVVRJTkdfNCgpICAgICBiZmluX3JlYWQzMihNWFZSX1JPVVRJTkdfNCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NWFZSX1JPVVRJTkdfNCh2YWwpIGJmaW5fd3JpdGUzMihNWFZSX1JPVVRJTkdfNCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTVhWUl9ST1VUSU5HXzUoKSAgICAgYmZpbl9yZWFkMzIoTVhWUl9ST1VUSU5HXzUpCisjZGVmaW5lIGJmaW5fd3JpdGVfTVhWUl9ST1VUSU5HXzUodmFsKSBiZmluX3dyaXRlMzIoTVhWUl9ST1VUSU5HXzUsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01YVlJfUk9VVElOR182KCkgICAgIGJmaW5fcmVhZDMyKE1YVlJfUk9VVElOR182KQorI2RlZmluZSBiZmluX3dyaXRlX01YVlJfUk9VVElOR182KHZhbCkgYmZpbl93cml0ZTMyKE1YVlJfUk9VVElOR182LCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NWFZSX1JPVVRJTkdfNygpICAgICBiZmluX3JlYWQzMihNWFZSX1JPVVRJTkdfNykKKyNkZWZpbmUgYmZpbl93cml0ZV9NWFZSX1JPVVRJTkdfNyh2YWwpIGJmaW5fd3JpdGUzMihNWFZSX1JPVVRJTkdfNywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTVhWUl9ST1VUSU5HXzgoKSAgICAgYmZpbl9yZWFkMzIoTVhWUl9ST1VUSU5HXzgpCisjZGVmaW5lIGJmaW5fd3JpdGVfTVhWUl9ST1VUSU5HXzgodmFsKSBiZmluX3dyaXRlMzIoTVhWUl9ST1VUSU5HXzgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01YVlJfUk9VVElOR185KCkgICAgIGJmaW5fcmVhZDMyKE1YVlJfUk9VVElOR185KQorI2RlZmluZSBiZmluX3dyaXRlX01YVlJfUk9VVElOR185KHZhbCkgYmZpbl93cml0ZTMyKE1YVlJfUk9VVElOR185LCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NWFZSX1JPVVRJTkdfMTAoKSAgICBiZmluX3JlYWQzMihNWFZSX1JPVVRJTkdfMTApCisjZGVmaW5lIGJmaW5fd3JpdGVfTVhWUl9ST1VUSU5HXzEwKHZhbCkgYmZpbl93cml0ZTMyKE1YVlJfUk9VVElOR18xMCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTVhWUl9ST1VUSU5HXzExKCkgICAgYmZpbl9yZWFkMzIoTVhWUl9ST1VUSU5HXzExKQorI2RlZmluZSBiZmluX3dyaXRlX01YVlJfUk9VVElOR18xMSh2YWwpIGJmaW5fd3JpdGUzMihNWFZSX1JPVVRJTkdfMTEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01YVlJfUk9VVElOR18xMigpICAgIGJmaW5fcmVhZDMyKE1YVlJfUk9VVElOR18xMikKKyNkZWZpbmUgYmZpbl93cml0ZV9NWFZSX1JPVVRJTkdfMTIodmFsKSBiZmluX3dyaXRlMzIoTVhWUl9ST1VUSU5HXzEyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NWFZSX1JPVVRJTkdfMTMoKSAgICBiZmluX3JlYWQzMihNWFZSX1JPVVRJTkdfMTMpCisjZGVmaW5lIGJmaW5fd3JpdGVfTVhWUl9ST1VUSU5HXzEzKHZhbCkgYmZpbl93cml0ZTMyKE1YVlJfUk9VVElOR18xMywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfTVhWUl9ST1VUSU5HXzE0KCkgICAgYmZpbl9yZWFkMzIoTVhWUl9ST1VUSU5HXzE0KQorI2RlZmluZSBiZmluX3dyaXRlX01YVlJfUk9VVElOR18xNCh2YWwpIGJmaW5fd3JpdGUzMihNWFZSX1JPVVRJTkdfMTQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX01YVlJfUExMX0NUTF8xKCkgICAgIGJmaW5fcmVhZDMyKE1YVlJfUExMX0NUTF8xKQorI2RlZmluZSBiZmluX3dyaXRlX01YVlJfUExMX0NUTF8xKHZhbCkgYmZpbl93cml0ZTMyKE1YVlJfUExMX0NUTF8xLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9NWFZSX0JMT0NLX0NOVCgpICAgICBiZmluX3JlYWQxNihNWFZSX0JMT0NLX0NOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9NWFZSX0JMT0NLX0NOVCh2YWwpIGJmaW5fd3JpdGUxNihNWFZSX0JMT0NLX0NOVCwgdmFsKQorCisjZW5kaWYgLyogX0NERUZfQkY1MzlfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM4L2luY2x1ZGUvbWFjaC9kZWZCRjUzOS5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM4L2luY2x1ZGUvbWFjaC9kZWZCRjUzOS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhZGJmY2MKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzgvaW5jbHVkZS9tYWNoL2RlZkJGNTM5LmgKQEAgLTAsMCArMSw0MjQzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgUHVibGljCisgKiBMaWNlbnNlLiBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogTm9uLUdQTCBMaWNlbnNlIGFsc28gYXZhaWxhYmxlIGFzIHBhcnQgb2YgVmlzdWFsRFNQKysKKyAqIGh0dHA6Ly93d3cuYW5hbG9nLmNvbS9wcm9jZXNzb3JzL3Jlc291cmNlcy9jcm9zc2NvcmUvdmlzdWFsRHNwRGV2U29mdHdhcmUuaHRtbAorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMS0yMDA1IEFuYWxvZyBEZXZpY2VzLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQKKyAqCisgKiBUaGlzIGZpbGUgdW5kZXIgc291cmNlIGNvZGUgY29udHJvbCwgcGxlYXNlIHNlbmQgYnVncyBvciBjaGFuZ2VzIHRvOgorICogZHNwdG9vbHMuc3VwcG9ydEBhbmFsb2cuY29tCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBGaWxlOiAgICAgICAgIGluY2x1ZGUvYXNtLWJsYWNrZmluL21hY2gtYmY1MzgvZGVmQkY1MzkuaAorICogQmFzZWQgb246CisgKiBBdXRob3I6CisgKgorICogQ3JlYXRlZDoKKyAqIERlc2NyaXB0aW9uOgorICoKKyAqIFJldjoKKyAqCisgKiBNb2RpZmllZDoKKyAqCisgKiBCdWdzOiAgICAgICAgIEVudGVyIGJ1Z3MgYXQgaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnLworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLgorICogSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqLworLyogU1lTVEVNICYgTU0gUkVHSVNURVIgQklUICYgQUREUkVTUyBERUZJTklUSU9OUyBGT1IgQURTUC1CRjUzOC85ICovCisKKyNpZm5kZWYgX0RFRl9CRjUzOV9ICisjZGVmaW5lIF9ERUZfQkY1MzlfSAorCisvKiBpbmNsdWRlIGFsbCBDb3JlIHJlZ2lzdGVycyBhbmQgYml0IGRlZmluaXRpb25zICovCisjaW5jbHVkZSA8YXNtL2RlZl9MUEJsYWNrZmluLmg+CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiBTeXN0ZW0gTU1SIFJlZ2lzdGVyIE1hcCAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiBDbG9jay9SZWd1bGF0b3IgQ29udHJvbCAoMHhGRkMwMDAwMCAtIDB4RkZDMDAwRkYpICovCisjZGVmaW5lCVBMTF9DVEwJCQkweEZGQzAwMDAwCS8qIFBMTCBDb250cm9sIHJlZ2lzdGVyICgxNi1iaXQpICovCisjZGVmaW5lCVBMTF9ESVYJCQkweEZGQzAwMDA0CS8qIFBMTCBEaXZpZGUgUmVnaXN0ZXIgKDE2LWJpdCkgKi8KKyNkZWZpbmUJVlJfQ1RMCQkJMHhGRkMwMDAwOAkvKiBWb2x0YWdlIFJlZ3VsYXRvciBDb250cm9sIFJlZ2lzdGVyICgxNi1iaXQpICovCisjZGVmaW5lCVBMTF9TVEFUCQkweEZGQzAwMDBDCS8qIFBMTCBTdGF0dXMgcmVnaXN0ZXIgKDE2LWJpdCkgKi8KKyNkZWZpbmUJUExMX0xPQ0tDTlQJCTB4RkZDMDAwMTAJLyogUExMIExvY2sJQ291bnQgcmVnaXN0ZXIgKDE2LWJpdCkgKi8KKyNkZWZpbmUJQ0hJUElECQkJMHhGRkMwMDAxNAkvKiBDaGlwCUlEIFJlZ2lzdGVyICovCisKKy8qIENISVBJRCBNYXNrcyAqLworI2RlZmluZSBDSElQSURfVkVSU0lPTiAgICAgICAgIDB4RjAwMDAwMDAKKyNkZWZpbmUgQ0hJUElEX0ZBTUlMWSAgICAgICAgICAweDBGRkZGMDAwCisjZGVmaW5lIENISVBJRF9NQU5VRkFDVFVSRSAgICAgMHgwMDAwMEZGRQorCisvKiBTeXN0ZW0gSW50ZXJydXB0IENvbnRyb2xsZXIgKDB4RkZDMDAxMDAgLSAweEZGQzAwMUZGKSAqLworI2RlZmluZQlTV1JTVAkJCTB4RkZDMDAxMDAgIC8qIFNvZnR3YXJlCVJlc2V0IFJlZ2lzdGVyICgxNi1iaXQpICovCisjZGVmaW5lCVNZU0NSCQkJMHhGRkMwMDEwNCAgLyogU3lzdGVtIENvbmZpZ3VyYXRpb24gcmVnaXN0ZSAqLworI2RlZmluZQlTSUNfSU1BU0swCQkweEZGQzAwMTBDICAvKiBJbnRlcnJ1cHQgTWFzayBSZWdpc3RlciAqLworI2RlZmluZQlTSUNfSUFSMAkJMHhGRkMwMDExMCAgLyogSW50ZXJydXB0IEFzc2lnbm1lbnQgUmVnaXN0ZXIgMCAqLworI2RlZmluZQlTSUNfSUFSMQkJMHhGRkMwMDExNCAgLyogSW50ZXJydXB0IEFzc2lnbm1lbnQgUmVnaXN0ZXIgMSAqLworI2RlZmluZQlTSUNfSUFSMgkJMHhGRkMwMDExOCAgLyogSW50ZXJydXB0IEFzc2lnbm1lbnQgUmVnaXN0ZXIgMiAqLworI2RlZmluZQlTSUNfSUFSMwkJCTB4RkZDMDAxMUMJLyogSW50ZXJydXB0IEFzc2lnbm1lbnQJUmVnaXN0ZXIgMyAqLworI2RlZmluZQlTSUNfSVNSMAkJCTB4RkZDMDAxMjAgIC8qIEludGVycnVwdCBTdGF0dXMJUmVnaXN0ZXIgKi8KKyNkZWZpbmUJU0lDX0lXUjAJCQkweEZGQzAwMTI0ICAvKiBJbnRlcnJ1cHQgV2FrZXVwCVJlZ2lzdGVyICovCisjZGVmaW5lCVNJQ19JTUFTSzEJCQkweEZGQzAwMTI4CS8qIEludGVycnVwdCBNYXNrIFJlZ2lzdGVyIDEgKi8KKyNkZWZpbmUJU0lDX0lTUjEJCQkweEZGQzAwMTJDCS8qIEludGVycnVwdCBTdGF0dXMgUmVnaXN0ZXIgMSAqLworI2RlZmluZQlTSUNfSVdSMQkJCTB4RkZDMDAxMzAJLyogSW50ZXJydXB0IFdha2V1cCBSZWdpc3RlciAxICovCisjZGVmaW5lCVNJQ19JQVI0CQkJMHhGRkMwMDEzNAkvKiBJbnRlcnJ1cHQgQXNzaWdubWVudAlSZWdpc3RlciA0ICovCisjZGVmaW5lCVNJQ19JQVI1CQkJMHhGRkMwMDEzOAkvKiBJbnRlcnJ1cHQgQXNzaWdubWVudAlSZWdpc3RlciA1ICovCisjZGVmaW5lCVNJQ19JQVI2CQkJMHhGRkMwMDEzQwkvKiBJbnRlcnJ1cHQgQXNzaWdubWVudAlSZWdpc3RlciA2ICovCisKKworLyogV2F0Y2hkb2cgVGltZXIgKDB4RkZDMDAyMDAgLQkweEZGQzAwMkZGKSAqLworI2RlZmluZQlXRE9HX0NUTAkweEZGQzAwMjAwICAvKiBXYXRjaGRvZwlDb250cm9sCVJlZ2lzdGVyICovCisjZGVmaW5lCVdET0dfQ05UCTB4RkZDMDAyMDQgIC8qIFdhdGNoZG9nCUNvdW50IFJlZ2lzdGVyICovCisjZGVmaW5lCVdET0dfU1RBVAkweEZGQzAwMjA4ICAvKiBXYXRjaGRvZwlTdGF0dXMgUmVnaXN0ZXIgKi8KKworCisvKiBSZWFsCVRpbWUgQ2xvY2sgKDB4RkZDMDAzMDAgLSAweEZGQzAwM0ZGKSAqLworI2RlZmluZQlSVENfU1RBVAkweEZGQzAwMzAwICAvKiBSVEMgU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lCVJUQ19JQ1RMCTB4RkZDMDAzMDQgIC8qIFJUQyBJbnRlcnJ1cHQgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZQlSVENfSVNUQVQJMHhGRkMwMDMwOCAgLyogUlRDIEludGVycnVwdCBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJUlRDX1NXQ05UCTB4RkZDMDAzMEMgIC8qIFJUQyBTdG9wd2F0Y2ggQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJUlRDX0FMQVJNCTB4RkZDMDAzMTAgIC8qIFJUQyBBbGFybSBUaW1lIFJlZ2lzdGVyICovCisjZGVmaW5lCVJUQ19GQVNUCTB4RkZDMDAzMTQgIC8qIFJUQyBQcmVzY2FsZXIgRW5hYmxlIFJlZ2lzdGVyICovCisjZGVmaW5lCVJUQ19QUkVOCQkweEZGQzAwMzE0ICAvKiBSVEMgUHJlc2NhbGVyIEVuYWJsZSBSZWdpc3RlciAoYWx0ZXJuYXRlCW1hY3JvKSAqLworCisKKy8qIFVBUlQwIENvbnRyb2xsZXIgKDB4RkZDMDA0MDAJLSAweEZGQzAwNEZGKSAqLworI2RlZmluZQlVQVJUMF9USFIJICAgICAgMHhGRkMwMDQwMCAgLyogVHJhbnNtaXQgSG9sZGluZyByZWdpc3RlciAqLworI2RlZmluZQlVQVJUMF9SQlIJICAgICAgMHhGRkMwMDQwMCAgLyogUmVjZWl2ZSBCdWZmZXIgcmVnaXN0ZXIgKi8KKyNkZWZpbmUJVUFSVDBfRExMCSAgICAgIDB4RkZDMDA0MDAgIC8qIERpdmlzb3IgTGF0Y2ggKExvdy1CeXRlKSAqLworI2RlZmluZQlVQVJUMF9JRVIJICAgICAgMHhGRkMwMDQwNCAgLyogSW50ZXJydXB0IEVuYWJsZSBSZWdpc3RlciAqLworI2RlZmluZQlVQVJUMF9ETEgJICAgICAgMHhGRkMwMDQwNCAgLyogRGl2aXNvciBMYXRjaCAoSGlnaC1CeXRlKSAqLworI2RlZmluZQlVQVJUMF9JSVIJICAgICAgMHhGRkMwMDQwOCAgLyogSW50ZXJydXB0IElkZW50aWZpY2F0aW9uIFJlZ2lzdGVyICovCisjZGVmaW5lCVVBUlQwX0xDUgkgICAgICAweEZGQzAwNDBDICAvKiBMaW5lIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJVUFSVDBfTUNSCQkJIDB4RkZDMDA0MTAgIC8qCU1vZGVtIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJVUFSVDBfTFNSCSAgICAgIDB4RkZDMDA0MTQgIC8qIExpbmUgU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lCVVBUlQwX1NDUgkgICAgICAweEZGQzAwNDFDICAvKiBTQ1IgU2NyYXRjaCBSZWdpc3RlciAqLworI2RlZmluZQlVQVJUMF9HQ1RMCQkgICAgIDB4RkZDMDA0MjQJIC8qIEdsb2JhbCBDb250cm9sIFJlZ2lzdGVyICovCisKKworLyogU1BJMAlDb250cm9sbGVyICgweEZGQzAwNTAwIC0gMHhGRkMwMDVGRikgKi8KKworI2RlZmluZQlTUEkwX0NUTAkJCTB4RkZDMDA1MDAgIC8qIFNQSTAgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZQlTUEkwX0ZMRwkJCTB4RkZDMDA1MDQgIC8qIFNQSTAgRmxhZyByZWdpc3RlciAqLworI2RlZmluZQlTUEkwX1NUQVQJCQkweEZGQzAwNTA4ICAvKiBTUEkwIFN0YXR1cyByZWdpc3RlciAqLworI2RlZmluZQlTUEkwX1REQlIJCQkweEZGQzAwNTBDICAvKiBTUEkwIFRyYW5zbWl0IERhdGEgQnVmZmVyIFJlZ2lzdGVyICovCisjZGVmaW5lCVNQSTBfUkRCUgkJCTB4RkZDMDA1MTAgIC8qIFNQSTAgUmVjZWl2ZSBEYXRhIEJ1ZmZlcglSZWdpc3RlciAqLworI2RlZmluZQlTUEkwX0JBVUQJCQkweEZGQzAwNTE0ICAvKiBTUEkwIEJhdWQgcmF0ZSBSZWdpc3RlciAqLworI2RlZmluZQlTUEkwX1NIQURPVwkJCTB4RkZDMDA1MTggIC8qIFNQSTBfUkRCUiBTaGFkb3cJUmVnaXN0ZXIgKi8KKyNkZWZpbmUgU1BJMF9SRUdCQVNFCQkJU1BJMF9DVEwKKworCisvKiBUSU1FUiAwLCAxLCAyIFJlZ2lzdGVycyAoMHhGRkMwMDYwMCAtIDB4RkZDMDA2RkYpICovCisjZGVmaW5lCVRJTUVSMF9DT05GSUcJCQkweEZGQzAwNjAwICAgICAvKiBUaW1lcgkwIENvbmZpZ3VyYXRpb24JUmVnaXN0ZXIgKi8KKyNkZWZpbmUJVElNRVIwX0NPVU5URVIJCQkJMHhGRkMwMDYwNCAgICAgLyogVGltZXIJMCBDb3VudGVyIFJlZ2lzdGVyICovCisjZGVmaW5lCVRJTUVSMF9QRVJJT0QJCQkweEZGQzAwNjA4ICAgICAvKiBUaW1lcgkwIFBlcmlvZCBSZWdpc3RlciAqLworI2RlZmluZQlUSU1FUjBfV0lEVEgJCQkweEZGQzAwNjBDICAgICAvKiBUaW1lcgkwIFdpZHRoCVJlZ2lzdGVyICovCisKKyNkZWZpbmUJVElNRVIxX0NPTkZJRwkJCTB4RkZDMDA2MTAJLyogIFRpbWVyIDEgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAgICovCisjZGVmaW5lCVRJTUVSMV9DT1VOVEVSCQkJMHhGRkMwMDYxNAkvKiAgVGltZXIgMSBDb3VudGVyIFJlZ2lzdGVyCSAgICAgKi8KKyNkZWZpbmUJVElNRVIxX1BFUklPRAkJCTB4RkZDMDA2MTgJLyogIFRpbWVyIDEgUGVyaW9kIFJlZ2lzdGVyCSAgICAgKi8KKyNkZWZpbmUJVElNRVIxX1dJRFRICQkJMHhGRkMwMDYxQwkvKiAgVGltZXIgMSBXaWR0aCBSZWdpc3RlcgkgICAgICovCisKKyNkZWZpbmUJVElNRVIyX0NPTkZJRwkJCTB4RkZDMDA2MjAJLyogVGltZXIgMiBDb25maWd1cmF0aW9uIFJlZ2lzdGVyICAgKi8KKyNkZWZpbmUJVElNRVIyX0NPVU5URVIJCQkweEZGQzAwNjI0CS8qIFRpbWVyIDIgQ291bnRlciBSZWdpc3RlcgkgICAgKi8KKyNkZWZpbmUJVElNRVIyX1BFUklPRAkJCTB4RkZDMDA2MjgJLyogVGltZXIgMiBQZXJpb2QgUmVnaXN0ZXIJICAgICovCisjZGVmaW5lCVRJTUVSMl9XSURUSAkJCTB4RkZDMDA2MkMJLyogVGltZXIgMiBXaWR0aCBSZWdpc3RlcgkgICAgKi8KKworI2RlZmluZQlUSU1FUl9FTkFCTEUJCQkJMHhGRkMwMDY0MAkvKiBUaW1lciBFbmFibGUJUmVnaXN0ZXIgKi8KKyNkZWZpbmUJVElNRVJfRElTQUJMRQkJCQkweEZGQzAwNjQ0CS8qIFRpbWVyIERpc2FibGUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJVElNRVJfU1RBVFVTCQkJCTB4RkZDMDA2NDgJLyogVGltZXIgU3RhdHVzCVJlZ2lzdGVyICovCisKKworLyogUHJvZ3JhbW1hYmxlCUZsYWdzICgweEZGQzAwNzAwIC0gMHhGRkMwMDdGRikgKi8KKyNkZWZpbmUJRklPX0ZMQUdfRAkJCQkweEZGQzAwNzAwICAvKiBGbGFnIE1hc2sgdG8gZGlyZWN0bHkgc3BlY2lmeSBzdGF0ZSBvZiBwaW5zICovCisjZGVmaW5lCUZJT19GTEFHX0MJCQkweEZGQzAwNzA0ICAvKiBQZXJpcGhlcmFsIEludGVycnVwdCBGbGFnIFJlZ2lzdGVyIChjbGVhcikgKi8KKyNkZWZpbmUJRklPX0ZMQUdfUwkJCTB4RkZDMDA3MDggIC8qIFBlcmlwaGVyYWwgSW50ZXJydXB0IEZsYWcgUmVnaXN0ZXIgKHNldCkgKi8KKyNkZWZpbmUJRklPX0ZMQUdfVAkJCQkJMHhGRkMwMDcwQyAgLyogRmxhZyBNYXNrIHRvIGRpcmVjdGx5IHRvZ2dsZSBzdGF0ZSBvZiBwaW5zICovCisjZGVmaW5lCUZJT19NQVNLQV9ECQkJMHhGRkMwMDcxMCAgLyogRmxhZyBNYXNrIEludGVycnVwdCBBIFJlZ2lzdGVyIChzZXQgZGlyZWN0bHkpICovCisjZGVmaW5lCUZJT19NQVNLQV9DCQkJMHhGRkMwMDcxNCAgLyogRmxhZyBNYXNrIEludGVycnVwdCBBIFJlZ2lzdGVyIChjbGVhcikgKi8KKyNkZWZpbmUJRklPX01BU0tBX1MJCQkweEZGQzAwNzE4ICAvKiBGbGFnIE1hc2sgSW50ZXJydXB0IEEgUmVnaXN0ZXIgKHNldCkgKi8KKyNkZWZpbmUJRklPX01BU0tBX1QJCQkweEZGQzAwNzFDICAvKiBGbGFnIE1hc2sgSW50ZXJydXB0IEEgUmVnaXN0ZXIgKHRvZ2dsZSkgKi8KKyNkZWZpbmUJRklPX01BU0tCX0QJCQkweEZGQzAwNzIwICAvKiBGbGFnIE1hc2sgSW50ZXJydXB0IEIgUmVnaXN0ZXIgKHNldCBkaXJlY3RseSkgKi8KKyNkZWZpbmUJRklPX01BU0tCX0MJCQkweEZGQzAwNzI0ICAvKiBGbGFnIE1hc2sgSW50ZXJydXB0IEIgUmVnaXN0ZXIgKGNsZWFyKSAqLworI2RlZmluZQlGSU9fTUFTS0JfUwkJCTB4RkZDMDA3MjggIC8qIEZsYWcgTWFzayBJbnRlcnJ1cHQgQiBSZWdpc3RlciAoc2V0KSAqLworI2RlZmluZQlGSU9fTUFTS0JfVAkJCTB4RkZDMDA3MkMgIC8qIEZsYWcgTWFzayBJbnRlcnJ1cHQgQiBSZWdpc3RlciAodG9nZ2xlKSAqLworI2RlZmluZQlGSU9fRElSCQkJCTB4RkZDMDA3MzAgIC8qIFBlcmlwaGVyYWwgRmxhZyBEaXJlY3Rpb24gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRklPX1BPTEFSCQkJMHhGRkMwMDczNCAgLyogRmxhZyBTb3VyY2UgUG9sYXJpdHkgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRklPX0VER0UJCQkweEZGQzAwNzM4ICAvKiBGbGFnIFNvdXJjZSBTZW5zaXRpdml0eSBSZWdpc3RlciAqLworI2RlZmluZQlGSU9fQk9USAkJCTB4RkZDMDA3M0MgIC8qIEZsYWcgU2V0CW9uIEJPVEgJRWRnZXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRklPX0lORU4JCQkJCTB4RkZDMDA3NDAgIC8qIEZsYWcgSW5wdXQgRW5hYmxlIFJlZ2lzdGVyICAqLworCisKKy8qIFNQT1JUMCBDb250cm9sbGVyICgweEZGQzAwODAwIC0gMHhGRkMwMDhGRikgKi8KKyNkZWZpbmUJU1BPUlQwX1RDUjEJCQkJMHhGRkMwMDgwMCAgLyogU1BPUlQwIFRyYW5zbWl0IENvbmZpZ3VyYXRpb24gMSBSZWdpc3RlciAqLworI2RlZmluZQlTUE9SVDBfVENSMgkJCQkweEZGQzAwODA0ICAvKiBTUE9SVDAgVHJhbnNtaXQgQ29uZmlndXJhdGlvbiAyIFJlZ2lzdGVyICovCisjZGVmaW5lCVNQT1JUMF9UQ0xLRElWCQkJMHhGRkMwMDgwOCAgLyogU1BPUlQwIFRyYW5zbWl0IENsb2NrIERpdmlkZXIgKi8KKyNkZWZpbmUJU1BPUlQwX1RGU0RJVgkJCTB4RkZDMDA4MEMgIC8qIFNQT1JUMCBUcmFuc21pdCBGcmFtZSBTeW5jIERpdmlkZXIgKi8KKyNkZWZpbmUJU1BPUlQwX1RYCQkJMHhGRkMwMDgxMCAgLyogU1BPUlQwIFRYIERhdGEgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJU1BPUlQwX1JYCQkJMHhGRkMwMDgxOCAgLyogU1BPUlQwIFJYIERhdGEgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJU1BPUlQwX1JDUjEJCQkJMHhGRkMwMDgyMCAgLyogU1BPUlQwIFRyYW5zbWl0IENvbmZpZ3VyYXRpb24gMSBSZWdpc3RlciAqLworI2RlZmluZQlTUE9SVDBfUkNSMgkJCQkweEZGQzAwODI0ICAvKiBTUE9SVDAgVHJhbnNtaXQgQ29uZmlndXJhdGlvbiAyIFJlZ2lzdGVyICovCisjZGVmaW5lCVNQT1JUMF9SQ0xLRElWCQkJMHhGRkMwMDgyOCAgLyogU1BPUlQwIFJlY2VpdmUgQ2xvY2sgRGl2aWRlciAqLworI2RlZmluZQlTUE9SVDBfUkZTRElWCQkJMHhGRkMwMDgyQyAgLyogU1BPUlQwIFJlY2VpdmUgRnJhbWUgU3luYyBEaXZpZGVyICovCisjZGVmaW5lCVNQT1JUMF9TVEFUCQkJMHhGRkMwMDgzMCAgLyogU1BPUlQwIFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZQlTUE9SVDBfQ0hOTAkJCTB4RkZDMDA4MzQgIC8qIFNQT1JUMCBDdXJyZW50IENoYW5uZWwgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJU1BPUlQwX01DTUMxCQkJMHhGRkMwMDgzOCAgLyogU1BPUlQwIE11bHRpLUNoYW5uZWwgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAxICovCisjZGVmaW5lCVNQT1JUMF9NQ01DMgkJCTB4RkZDMDA4M0MgIC8qIFNQT1JUMCBNdWx0aS1DaGFubmVsIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgMiAqLworI2RlZmluZQlTUE9SVDBfTVRDUzAJCQkweEZGQzAwODQwICAvKiBTUE9SVDAgTXVsdGktQ2hhbm5lbCBUcmFuc21pdCBTZWxlY3QgUmVnaXN0ZXIgMCAqLworI2RlZmluZQlTUE9SVDBfTVRDUzEJCQkweEZGQzAwODQ0ICAvKiBTUE9SVDAgTXVsdGktQ2hhbm5lbCBUcmFuc21pdCBTZWxlY3QgUmVnaXN0ZXIgMSAqLworI2RlZmluZQlTUE9SVDBfTVRDUzIJCQkweEZGQzAwODQ4ICAvKiBTUE9SVDAgTXVsdGktQ2hhbm5lbCBUcmFuc21pdCBTZWxlY3QgUmVnaXN0ZXIgMiAqLworI2RlZmluZQlTUE9SVDBfTVRDUzMJCQkweEZGQzAwODRDICAvKiBTUE9SVDAgTXVsdGktQ2hhbm5lbCBUcmFuc21pdCBTZWxlY3QgUmVnaXN0ZXIgMyAqLworI2RlZmluZQlTUE9SVDBfTVJDUzAJCQkweEZGQzAwODUwICAvKiBTUE9SVDAgTXVsdGktQ2hhbm5lbCBSZWNlaXZlIFNlbGVjdCBSZWdpc3RlciAwICovCisjZGVmaW5lCVNQT1JUMF9NUkNTMQkJCTB4RkZDMDA4NTQgIC8qIFNQT1JUMCBNdWx0aS1DaGFubmVsIFJlY2VpdmUgU2VsZWN0IFJlZ2lzdGVyIDEgKi8KKyNkZWZpbmUJU1BPUlQwX01SQ1MyCQkJMHhGRkMwMDg1OCAgLyogU1BPUlQwIE11bHRpLUNoYW5uZWwgUmVjZWl2ZSBTZWxlY3QgUmVnaXN0ZXIgMiAqLworI2RlZmluZQlTUE9SVDBfTVJDUzMJCQkweEZGQzAwODVDICAvKiBTUE9SVDAgTXVsdGktQ2hhbm5lbCBSZWNlaXZlIFNlbGVjdCBSZWdpc3RlciAzICovCisKKworLyogU1BPUlQxIENvbnRyb2xsZXIgKDB4RkZDMDA5MDAgLSAweEZGQzAwOUZGKSAqLworI2RlZmluZQlTUE9SVDFfVENSMQkJCQkweEZGQzAwOTAwICAvKiBTUE9SVDEgVHJhbnNtaXQgQ29uZmlndXJhdGlvbiAxIFJlZ2lzdGVyICovCisjZGVmaW5lCVNQT1JUMV9UQ1IyCQkJCTB4RkZDMDA5MDQgIC8qIFNQT1JUMSBUcmFuc21pdCBDb25maWd1cmF0aW9uIDIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJU1BPUlQxX1RDTEtESVYJCQkweEZGQzAwOTA4ICAvKiBTUE9SVDEgVHJhbnNtaXQgQ2xvY2sgRGl2aWRlciAqLworI2RlZmluZQlTUE9SVDFfVEZTRElWCQkJMHhGRkMwMDkwQyAgLyogU1BPUlQxIFRyYW5zbWl0IEZyYW1lIFN5bmMgRGl2aWRlciAqLworI2RlZmluZQlTUE9SVDFfVFgJCQkweEZGQzAwOTEwICAvKiBTUE9SVDEgVFggRGF0YSBSZWdpc3RlciAqLworI2RlZmluZQlTUE9SVDFfUlgJCQkweEZGQzAwOTE4ICAvKiBTUE9SVDEgUlggRGF0YSBSZWdpc3RlciAqLworI2RlZmluZQlTUE9SVDFfUkNSMQkJCQkweEZGQzAwOTIwICAvKiBTUE9SVDEgVHJhbnNtaXQgQ29uZmlndXJhdGlvbiAxIFJlZ2lzdGVyICovCisjZGVmaW5lCVNQT1JUMV9SQ1IyCQkJCTB4RkZDMDA5MjQgIC8qIFNQT1JUMSBUcmFuc21pdCBDb25maWd1cmF0aW9uIDIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJU1BPUlQxX1JDTEtESVYJCQkweEZGQzAwOTI4ICAvKiBTUE9SVDEgUmVjZWl2ZSBDbG9jayBEaXZpZGVyICovCisjZGVmaW5lCVNQT1JUMV9SRlNESVYJCQkweEZGQzAwOTJDICAvKiBTUE9SVDEgUmVjZWl2ZSBGcmFtZSBTeW5jIERpdmlkZXIgKi8KKyNkZWZpbmUJU1BPUlQxX1NUQVQJCQkweEZGQzAwOTMwICAvKiBTUE9SVDEgU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lCVNQT1JUMV9DSE5MCQkJMHhGRkMwMDkzNCAgLyogU1BPUlQxIEN1cnJlbnQgQ2hhbm5lbCBSZWdpc3RlciAqLworI2RlZmluZQlTUE9SVDFfTUNNQzEJCQkweEZGQzAwOTM4ICAvKiBTUE9SVDEgTXVsdGktQ2hhbm5lbCBDb25maWd1cmF0aW9uIFJlZ2lzdGVyIDEgKi8KKyNkZWZpbmUJU1BPUlQxX01DTUMyCQkJMHhGRkMwMDkzQyAgLyogU1BPUlQxIE11bHRpLUNoYW5uZWwgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAyICovCisjZGVmaW5lCVNQT1JUMV9NVENTMAkJCTB4RkZDMDA5NDAgIC8qIFNQT1JUMSBNdWx0aS1DaGFubmVsIFRyYW5zbWl0IFNlbGVjdCBSZWdpc3RlciAwICovCisjZGVmaW5lCVNQT1JUMV9NVENTMQkJCTB4RkZDMDA5NDQgIC8qIFNQT1JUMSBNdWx0aS1DaGFubmVsIFRyYW5zbWl0IFNlbGVjdCBSZWdpc3RlciAxICovCisjZGVmaW5lCVNQT1JUMV9NVENTMgkJCTB4RkZDMDA5NDggIC8qIFNQT1JUMSBNdWx0aS1DaGFubmVsIFRyYW5zbWl0IFNlbGVjdCBSZWdpc3RlciAyICovCisjZGVmaW5lCVNQT1JUMV9NVENTMwkJCTB4RkZDMDA5NEMgIC8qIFNQT1JUMSBNdWx0aS1DaGFubmVsIFRyYW5zbWl0IFNlbGVjdCBSZWdpc3RlciAzICovCisjZGVmaW5lCVNQT1JUMV9NUkNTMAkJCTB4RkZDMDA5NTAgIC8qIFNQT1JUMSBNdWx0aS1DaGFubmVsIFJlY2VpdmUgU2VsZWN0IFJlZ2lzdGVyIDAgKi8KKyNkZWZpbmUJU1BPUlQxX01SQ1MxCQkJMHhGRkMwMDk1NCAgLyogU1BPUlQxIE11bHRpLUNoYW5uZWwgUmVjZWl2ZSBTZWxlY3QgUmVnaXN0ZXIgMSAqLworI2RlZmluZQlTUE9SVDFfTVJDUzIJCQkweEZGQzAwOTU4ICAvKiBTUE9SVDEgTXVsdGktQ2hhbm5lbCBSZWNlaXZlIFNlbGVjdCBSZWdpc3RlciAyICovCisjZGVmaW5lCVNQT1JUMV9NUkNTMwkJCTB4RkZDMDA5NUMgIC8qIFNQT1JUMSBNdWx0aS1DaGFubmVsIFJlY2VpdmUgU2VsZWN0IFJlZ2lzdGVyIDMgKi8KKworCisvKiBFeHRlcm5hbCBCdXMJSW50ZXJmYWNlIFVuaXQgKDB4RkZDMDBBMDAgLSAweEZGQzAwQUZGKSAqLworLyogQXN5bmNocm9ub3VzCU1lbW9yeSBDb250cm9sbGVyICAqLworI2RlZmluZQlFQklVX0FNR0NUTAkJCTB4RkZDMDBBMDAgIC8qIEFzeW5jaHJvbm91cyBNZW1vcnkgR2xvYmFsIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRUJJVV9BTUJDVEwwCQkweEZGQzAwQTA0ICAvKiBBc3luY2hyb25vdXMgTWVtb3J5IEJhbmsJQ29udHJvbAlSZWdpc3RlciAwICovCisjZGVmaW5lCUVCSVVfQU1CQ1RMMQkJMHhGRkMwMEEwOCAgLyogQXN5bmNocm9ub3VzIE1lbW9yeSBCYW5rCUNvbnRyb2wJUmVnaXN0ZXIgMSAqLworCisvKiBTRFJBTSBDb250cm9sbGVyICovCisjZGVmaW5lCUVCSVVfU0RHQ1RMCQkJMHhGRkMwMEExMCAgLyogU0RSQU0gR2xvYmFsIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRUJJVV9TREJDVEwJCQkweEZGQzAwQTE0ICAvKiBTRFJBTSBCYW5rIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRUJJVV9TRFJSQwkJCTB4RkZDMDBBMTggIC8qIFNEUkFNIFJlZnJlc2ggUmF0ZSBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lCUVCSVVfU0RTVEFUCQkJMHhGRkMwMEExQyAgLyogU0RSQU0gU3RhdHVzIFJlZ2lzdGVyICovCisKKworCisvKiBETUEgQ29udHJvbGxlciAwIFRyYWZmaWMgQ29udHJvbCBSZWdpc3RlcnMgKDB4RkZDMDBCMDAgLSAweEZGQzAwQkZGKSAqLworCisjZGVmaW5lCURNQUMwX1RDX1BFUgkJCTB4RkZDMDBCMEMJLyogRE1BIENvbnRyb2xsZXIgMCBUcmFmZmljIENvbnRyb2wgUGVyaW9kcyBSZWdpc3RlciAqLworI2RlZmluZQlETUFDMF9UQ19DTlQJCQkweEZGQzAwQjEwCS8qIERNQSBDb250cm9sbGVyIDAgVHJhZmZpYyBDb250cm9sIEN1cnJlbnQgQ291bnRzIFJlZ2lzdGVyICovCisKKy8qIEFsdGVybmF0ZSBkZXByZWNhdGVkCXJlZ2lzdGVyIG5hbWVzIChiZWxvdykgcHJvdmlkZWQJZm9yIGJhY2t3YXJkcyBjb2RlIGNvbXBhdGliaWxpdHkgKi8KKyNkZWZpbmUJRE1BMF9UQ1BFUgkJCURNQUMwX1RDX1BFUgorI2RlZmluZQlETUEwX1RDQ05UCQkJRE1BQzBfVENfQ05UCisKKworLyogRE1BIENvbnRyb2xsZXIgMCAoMHhGRkMwMEMwMAktIDB4RkZDMDBGRkYpCQkJCQkJCSAqLworCisjZGVmaW5lCURNQTBfTkVYVF9ERVNDX1BUUgkJMHhGRkMwMEMwMAkvKiBETUEgQ2hhbm5lbCAwIE5leHQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTBfU1RBUlRfQUREUgkJCTB4RkZDMDBDMDQJLyogRE1BIENoYW5uZWwgMCBTdGFydCBBZGRyZXNzIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTBfQ09ORklHCQkJCTB4RkZDMDBDMDgJLyogRE1BIENoYW5uZWwgMCBDb25maWd1cmF0aW9uIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTBfWF9DT1VOVAkJCTB4RkZDMDBDMTAJLyogRE1BIENoYW5uZWwgMCBYIENvdW50IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTBfWF9NT0RJRlkJCQkweEZGQzAwQzE0CS8qIERNQSBDaGFubmVsIDAgWCBNb2RpZnkgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMF9ZX0NPVU5UCQkJMHhGRkMwMEMxOAkvKiBETUEgQ2hhbm5lbCAwIFkgQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMF9ZX01PRElGWQkJCTB4RkZDMDBDMUMJLyogRE1BIENoYW5uZWwgMCBZIE1vZGlmeSBSZWdpc3RlciAqLworI2RlZmluZQlETUEwX0NVUlJfREVTQ19QVFIJCTB4RkZDMDBDMjAJLyogRE1BIENoYW5uZWwgMCBDdXJyZW50IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlciAqLworI2RlZmluZQlETUEwX0NVUlJfQUREUgkJCTB4RkZDMDBDMjQJLyogRE1BIENoYW5uZWwgMCBDdXJyZW50IEFkZHJlc3MgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMF9JUlFfU1RBVFVTCQkJMHhGRkMwMEMyOAkvKiBETUEgQ2hhbm5lbCAwIEludGVycnVwdC9TdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMF9QRVJJUEhFUkFMX01BUAkJMHhGRkMwMEMyQwkvKiBETUEgQ2hhbm5lbCAwIFBlcmlwaGVyYWwgTWFwCVJlZ2lzdGVyICovCisjZGVmaW5lCURNQTBfQ1VSUl9YX0NPVU5UCQkweEZGQzAwQzMwCS8qIERNQSBDaGFubmVsIDAgQ3VycmVudCBYIENvdW50IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTBfQ1VSUl9ZX0NPVU5UCQkweEZGQzAwQzM4CS8qIERNQSBDaGFubmVsIDAgQ3VycmVudCBZIENvdW50IFJlZ2lzdGVyICovCisKKyNkZWZpbmUJRE1BMV9ORVhUX0RFU0NfUFRSCQkweEZGQzAwQzQwCS8qIERNQSBDaGFubmVsIDEgTmV4dCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMV9TVEFSVF9BRERSCQkJMHhGRkMwMEM0NAkvKiBETUEgQ2hhbm5lbCAxIFN0YXJ0IEFkZHJlc3MgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMV9DT05GSUcJCQkJMHhGRkMwMEM0OAkvKiBETUEgQ2hhbm5lbCAxIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMV9YX0NPVU5UCQkJMHhGRkMwMEM1MAkvKiBETUEgQ2hhbm5lbCAxIFggQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMV9YX01PRElGWQkJCTB4RkZDMDBDNTQJLyogRE1BIENoYW5uZWwgMSBYIE1vZGlmeSBSZWdpc3RlciAqLworI2RlZmluZQlETUExX1lfQ09VTlQJCQkweEZGQzAwQzU4CS8qIERNQSBDaGFubmVsIDEgWSBDb3VudCBSZWdpc3RlciAqLworI2RlZmluZQlETUExX1lfTU9ESUZZCQkJMHhGRkMwMEM1QwkvKiBETUEgQ2hhbm5lbCAxIFkgTW9kaWZ5IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTFfQ1VSUl9ERVNDX1BUUgkJMHhGRkMwMEM2MAkvKiBETUEgQ2hhbm5lbCAxIEN1cnJlbnQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTFfQ1VSUl9BRERSCQkJMHhGRkMwMEM2NAkvKiBETUEgQ2hhbm5lbCAxIEN1cnJlbnQgQWRkcmVzcyBSZWdpc3RlciAqLworI2RlZmluZQlETUExX0lSUV9TVEFUVVMJCQkweEZGQzAwQzY4CS8qIERNQSBDaGFubmVsIDEgSW50ZXJydXB0L1N0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZQlETUExX1BFUklQSEVSQUxfTUFQCQkweEZGQzAwQzZDCS8qIERNQSBDaGFubmVsIDEgUGVyaXBoZXJhbCBNYXAJUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMV9DVVJSX1hfQ09VTlQJCTB4RkZDMDBDNzAJLyogRE1BIENoYW5uZWwgMSBDdXJyZW50IFggQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMV9DVVJSX1lfQ09VTlQJCTB4RkZDMDBDNzgJLyogRE1BIENoYW5uZWwgMSBDdXJyZW50IFkgQ291bnQgUmVnaXN0ZXIgKi8KKworI2RlZmluZQlETUEyX05FWFRfREVTQ19QVFIJCTB4RkZDMDBDODAJLyogRE1BIENoYW5uZWwgMiBOZXh0IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlciAqLworI2RlZmluZQlETUEyX1NUQVJUX0FERFIJCQkweEZGQzAwQzg0CS8qIERNQSBDaGFubmVsIDIgU3RhcnQgQWRkcmVzcyBSZWdpc3RlciAqLworI2RlZmluZQlETUEyX0NPTkZJRwkJCQkweEZGQzAwQzg4CS8qIERNQSBDaGFubmVsIDIgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAqLworI2RlZmluZQlETUEyX1hfQ09VTlQJCQkweEZGQzAwQzkwCS8qIERNQSBDaGFubmVsIDIgWCBDb3VudCBSZWdpc3RlciAqLworI2RlZmluZQlETUEyX1hfTU9ESUZZCQkJMHhGRkMwMEM5NAkvKiBETUEgQ2hhbm5lbCAyIFggTW9kaWZ5IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTJfWV9DT1VOVAkJCTB4RkZDMDBDOTgJLyogRE1BIENoYW5uZWwgMiBZIENvdW50IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTJfWV9NT0RJRlkJCQkweEZGQzAwQzlDCS8qIERNQSBDaGFubmVsIDIgWSBNb2RpZnkgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMl9DVVJSX0RFU0NfUFRSCQkweEZGQzAwQ0EwCS8qIERNQSBDaGFubmVsIDIgQ3VycmVudCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMl9DVVJSX0FERFIJCQkweEZGQzAwQ0E0CS8qIERNQSBDaGFubmVsIDIgQ3VycmVudCBBZGRyZXNzIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTJfSVJRX1NUQVRVUwkJCTB4RkZDMDBDQTgJLyogRE1BIENoYW5uZWwgMiBJbnRlcnJ1cHQvU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTJfUEVSSVBIRVJBTF9NQVAJCTB4RkZDMDBDQUMJLyogRE1BIENoYW5uZWwgMiBQZXJpcGhlcmFsIE1hcAlSZWdpc3RlciAqLworI2RlZmluZQlETUEyX0NVUlJfWF9DT1VOVAkJMHhGRkMwMENCMAkvKiBETUEgQ2hhbm5lbCAyIEN1cnJlbnQgWCBDb3VudCBSZWdpc3RlciAqLworI2RlZmluZQlETUEyX0NVUlJfWV9DT1VOVAkJMHhGRkMwMENCOAkvKiBETUEgQ2hhbm5lbCAyIEN1cnJlbnQgWSBDb3VudCBSZWdpc3RlciAqLworCisjZGVmaW5lCURNQTNfTkVYVF9ERVNDX1BUUgkJMHhGRkMwMENDMAkvKiBETUEgQ2hhbm5lbCAzIE5leHQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTNfU1RBUlRfQUREUgkJCTB4RkZDMDBDQzQJLyogRE1BIENoYW5uZWwgMyBTdGFydCBBZGRyZXNzIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTNfQ09ORklHCQkJCTB4RkZDMDBDQzgJLyogRE1BIENoYW5uZWwgMyBDb25maWd1cmF0aW9uIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTNfWF9DT1VOVAkJCTB4RkZDMDBDRDAJLyogRE1BIENoYW5uZWwgMyBYIENvdW50IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTNfWF9NT0RJRlkJCQkweEZGQzAwQ0Q0CS8qIERNQSBDaGFubmVsIDMgWCBNb2RpZnkgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BM19ZX0NPVU5UCQkJMHhGRkMwMENEOAkvKiBETUEgQ2hhbm5lbCAzIFkgQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BM19ZX01PRElGWQkJCTB4RkZDMDBDREMJLyogRE1BIENoYW5uZWwgMyBZIE1vZGlmeSBSZWdpc3RlciAqLworI2RlZmluZQlETUEzX0NVUlJfREVTQ19QVFIJCTB4RkZDMDBDRTAJLyogRE1BIENoYW5uZWwgMyBDdXJyZW50IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlciAqLworI2RlZmluZQlETUEzX0NVUlJfQUREUgkJCTB4RkZDMDBDRTQJLyogRE1BIENoYW5uZWwgMyBDdXJyZW50IEFkZHJlc3MgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BM19JUlFfU1RBVFVTCQkJMHhGRkMwMENFOAkvKiBETUEgQ2hhbm5lbCAzIEludGVycnVwdC9TdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BM19QRVJJUEhFUkFMX01BUAkJMHhGRkMwMENFQwkvKiBETUEgQ2hhbm5lbCAzIFBlcmlwaGVyYWwgTWFwCVJlZ2lzdGVyICovCisjZGVmaW5lCURNQTNfQ1VSUl9YX0NPVU5UCQkweEZGQzAwQ0YwCS8qIERNQSBDaGFubmVsIDMgQ3VycmVudCBYIENvdW50IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTNfQ1VSUl9ZX0NPVU5UCQkweEZGQzAwQ0Y4CS8qIERNQSBDaGFubmVsIDMgQ3VycmVudCBZIENvdW50IFJlZ2lzdGVyICovCisKKyNkZWZpbmUJRE1BNF9ORVhUX0RFU0NfUFRSCQkweEZGQzAwRDAwCS8qIERNQSBDaGFubmVsIDQgTmV4dCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BNF9TVEFSVF9BRERSCQkJMHhGRkMwMEQwNAkvKiBETUEgQ2hhbm5lbCA0IFN0YXJ0IEFkZHJlc3MgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BNF9DT05GSUcJCQkJMHhGRkMwMEQwOAkvKiBETUEgQ2hhbm5lbCA0IENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BNF9YX0NPVU5UCQkJMHhGRkMwMEQxMAkvKiBETUEgQ2hhbm5lbCA0IFggQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BNF9YX01PRElGWQkJCTB4RkZDMDBEMTQJLyogRE1BIENoYW5uZWwgNCBYIE1vZGlmeSBSZWdpc3RlciAqLworI2RlZmluZQlETUE0X1lfQ09VTlQJCQkweEZGQzAwRDE4CS8qIERNQSBDaGFubmVsIDQgWSBDb3VudCBSZWdpc3RlciAqLworI2RlZmluZQlETUE0X1lfTU9ESUZZCQkJMHhGRkMwMEQxQwkvKiBETUEgQ2hhbm5lbCA0IFkgTW9kaWZ5IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTRfQ1VSUl9ERVNDX1BUUgkJMHhGRkMwMEQyMAkvKiBETUEgQ2hhbm5lbCA0IEN1cnJlbnQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTRfQ1VSUl9BRERSCQkJMHhGRkMwMEQyNAkvKiBETUEgQ2hhbm5lbCA0IEN1cnJlbnQgQWRkcmVzcyBSZWdpc3RlciAqLworI2RlZmluZQlETUE0X0lSUV9TVEFUVVMJCQkweEZGQzAwRDI4CS8qIERNQSBDaGFubmVsIDQgSW50ZXJydXB0L1N0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZQlETUE0X1BFUklQSEVSQUxfTUFQCQkweEZGQzAwRDJDCS8qIERNQSBDaGFubmVsIDQgUGVyaXBoZXJhbCBNYXAJUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BNF9DVVJSX1hfQ09VTlQJCTB4RkZDMDBEMzAJLyogRE1BIENoYW5uZWwgNCBDdXJyZW50IFggQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BNF9DVVJSX1lfQ09VTlQJCTB4RkZDMDBEMzgJLyogRE1BIENoYW5uZWwgNCBDdXJyZW50IFkgQ291bnQgUmVnaXN0ZXIgKi8KKworI2RlZmluZQlETUE1X05FWFRfREVTQ19QVFIJCTB4RkZDMDBENDAJLyogRE1BIENoYW5uZWwgNSBOZXh0IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlciAqLworI2RlZmluZQlETUE1X1NUQVJUX0FERFIJCQkweEZGQzAwRDQ0CS8qIERNQSBDaGFubmVsIDUgU3RhcnQgQWRkcmVzcyBSZWdpc3RlciAqLworI2RlZmluZQlETUE1X0NPTkZJRwkJCQkweEZGQzAwRDQ4CS8qIERNQSBDaGFubmVsIDUgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAqLworI2RlZmluZQlETUE1X1hfQ09VTlQJCQkweEZGQzAwRDUwCS8qIERNQSBDaGFubmVsIDUgWCBDb3VudCBSZWdpc3RlciAqLworI2RlZmluZQlETUE1X1hfTU9ESUZZCQkJMHhGRkMwMEQ1NAkvKiBETUEgQ2hhbm5lbCA1IFggTW9kaWZ5IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTVfWV9DT1VOVAkJCTB4RkZDMDBENTgJLyogRE1BIENoYW5uZWwgNSBZIENvdW50IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTVfWV9NT0RJRlkJCQkweEZGQzAwRDVDCS8qIERNQSBDaGFubmVsIDUgWSBNb2RpZnkgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BNV9DVVJSX0RFU0NfUFRSCQkweEZGQzAwRDYwCS8qIERNQSBDaGFubmVsIDUgQ3VycmVudCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BNV9DVVJSX0FERFIJCQkweEZGQzAwRDY0CS8qIERNQSBDaGFubmVsIDUgQ3VycmVudCBBZGRyZXNzIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTVfSVJRX1NUQVRVUwkJCTB4RkZDMDBENjgJLyogRE1BIENoYW5uZWwgNSBJbnRlcnJ1cHQvU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTVfUEVSSVBIRVJBTF9NQVAJCTB4RkZDMDBENkMJLyogRE1BIENoYW5uZWwgNSBQZXJpcGhlcmFsIE1hcAlSZWdpc3RlciAqLworI2RlZmluZQlETUE1X0NVUlJfWF9DT1VOVAkJMHhGRkMwMEQ3MAkvKiBETUEgQ2hhbm5lbCA1IEN1cnJlbnQgWCBDb3VudCBSZWdpc3RlciAqLworI2RlZmluZQlETUE1X0NVUlJfWV9DT1VOVAkJMHhGRkMwMEQ3OAkvKiBETUEgQ2hhbm5lbCA1IEN1cnJlbnQgWSBDb3VudCBSZWdpc3RlciAqLworCisjZGVmaW5lCURNQTZfTkVYVF9ERVNDX1BUUgkJMHhGRkMwMEQ4MAkvKiBETUEgQ2hhbm5lbCA2IE5leHQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTZfU1RBUlRfQUREUgkJCTB4RkZDMDBEODQJLyogRE1BIENoYW5uZWwgNiBTdGFydCBBZGRyZXNzIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTZfQ09ORklHCQkJCTB4RkZDMDBEODgJLyogRE1BIENoYW5uZWwgNiBDb25maWd1cmF0aW9uIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTZfWF9DT1VOVAkJCTB4RkZDMDBEOTAJLyogRE1BIENoYW5uZWwgNiBYIENvdW50IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTZfWF9NT0RJRlkJCQkweEZGQzAwRDk0CS8qIERNQSBDaGFubmVsIDYgWCBNb2RpZnkgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BNl9ZX0NPVU5UCQkJMHhGRkMwMEQ5OAkvKiBETUEgQ2hhbm5lbCA2IFkgQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BNl9ZX01PRElGWQkJCTB4RkZDMDBEOUMJLyogRE1BIENoYW5uZWwgNiBZIE1vZGlmeSBSZWdpc3RlciAqLworI2RlZmluZQlETUE2X0NVUlJfREVTQ19QVFIJCTB4RkZDMDBEQTAJLyogRE1BIENoYW5uZWwgNiBDdXJyZW50IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlciAqLworI2RlZmluZQlETUE2X0NVUlJfQUREUgkJCTB4RkZDMDBEQTQJLyogRE1BIENoYW5uZWwgNiBDdXJyZW50IEFkZHJlc3MgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BNl9JUlFfU1RBVFVTCQkJMHhGRkMwMERBOAkvKiBETUEgQ2hhbm5lbCA2IEludGVycnVwdC9TdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BNl9QRVJJUEhFUkFMX01BUAkJMHhGRkMwMERBQwkvKiBETUEgQ2hhbm5lbCA2IFBlcmlwaGVyYWwgTWFwCVJlZ2lzdGVyICovCisjZGVmaW5lCURNQTZfQ1VSUl9YX0NPVU5UCQkweEZGQzAwREIwCS8qIERNQSBDaGFubmVsIDYgQ3VycmVudCBYIENvdW50IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTZfQ1VSUl9ZX0NPVU5UCQkweEZGQzAwREI4CS8qIERNQSBDaGFubmVsIDYgQ3VycmVudCBZIENvdW50IFJlZ2lzdGVyICovCisKKyNkZWZpbmUJRE1BN19ORVhUX0RFU0NfUFRSCQkweEZGQzAwREMwCS8qIERNQSBDaGFubmVsIDcgTmV4dCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BN19TVEFSVF9BRERSCQkJMHhGRkMwMERDNAkvKiBETUEgQ2hhbm5lbCA3IFN0YXJ0IEFkZHJlc3MgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BN19DT05GSUcJCQkJMHhGRkMwMERDOAkvKiBETUEgQ2hhbm5lbCA3IENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BN19YX0NPVU5UCQkJMHhGRkMwMEREMAkvKiBETUEgQ2hhbm5lbCA3IFggQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BN19YX01PRElGWQkJCTB4RkZDMDBERDQJLyogRE1BIENoYW5uZWwgNyBYIE1vZGlmeSBSZWdpc3RlciAqLworI2RlZmluZQlETUE3X1lfQ09VTlQJCQkweEZGQzAwREQ4CS8qIERNQSBDaGFubmVsIDcgWSBDb3VudCBSZWdpc3RlciAqLworI2RlZmluZQlETUE3X1lfTU9ESUZZCQkJMHhGRkMwMEREQwkvKiBETUEgQ2hhbm5lbCA3IFkgTW9kaWZ5IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTdfQ1VSUl9ERVNDX1BUUgkJMHhGRkMwMERFMAkvKiBETUEgQ2hhbm5lbCA3IEN1cnJlbnQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTdfQ1VSUl9BRERSCQkJMHhGRkMwMERFNAkvKiBETUEgQ2hhbm5lbCA3IEN1cnJlbnQgQWRkcmVzcyBSZWdpc3RlciAqLworI2RlZmluZQlETUE3X0lSUV9TVEFUVVMJCQkweEZGQzAwREU4CS8qIERNQSBDaGFubmVsIDcgSW50ZXJydXB0L1N0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZQlETUE3X1BFUklQSEVSQUxfTUFQCQkweEZGQzAwREVDCS8qIERNQSBDaGFubmVsIDcgUGVyaXBoZXJhbCBNYXAJUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BN19DVVJSX1hfQ09VTlQJCTB4RkZDMDBERjAJLyogRE1BIENoYW5uZWwgNyBDdXJyZW50IFggQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BN19DVVJSX1lfQ09VTlQJCTB4RkZDMDBERjgJLyogRE1BIENoYW5uZWwgNyBDdXJyZW50IFkgQ291bnQgUmVnaXN0ZXIgKi8KKworI2RlZmluZQlNRE1BMF9EMF9ORVhUX0RFU0NfUFRSCTB4RkZDMDBFMDAJLyogTWVtRE1BMCBTdHJlYW0gMCBEZXN0aW5hdGlvbglOZXh0IERlc2NyaXB0b3IJUG9pbnRlcglSZWdpc3RlciAqLworI2RlZmluZQlNRE1BMF9EMF9TVEFSVF9BRERSCQkweEZGQzAwRTA0CS8qIE1lbURNQTAgU3RyZWFtIDAgRGVzdGluYXRpb24JU3RhcnQgQWRkcmVzcyBSZWdpc3RlciAqLworI2RlZmluZQlNRE1BMF9EMF9DT05GSUcJCQkweEZGQzAwRTA4CS8qIE1lbURNQTAgU3RyZWFtIDAgRGVzdGluYXRpb24JQ29uZmlndXJhdGlvbiBSZWdpc3RlciAqLworI2RlZmluZQlNRE1BMF9EMF9YX0NPVU5UCQkweEZGQzAwRTEwCS8qIE1lbURNQTAgU3RyZWFtIDAgRGVzdGluYXRpb24JWCBDb3VudAlSZWdpc3RlciAqLworI2RlZmluZQlNRE1BMF9EMF9YX01PRElGWQkJMHhGRkMwMEUxNAkvKiBNZW1ETUEwIFN0cmVhbSAwIERlc3RpbmF0aW9uCVggTW9kaWZ5IFJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUEwX0QwX1lfQ09VTlQJCTB4RkZDMDBFMTgJLyogTWVtRE1BMCBTdHJlYW0gMCBEZXN0aW5hdGlvbglZIENvdW50CVJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUEwX0QwX1lfTU9ESUZZCQkweEZGQzAwRTFDCS8qIE1lbURNQTAgU3RyZWFtIDAgRGVzdGluYXRpb24JWSBNb2RpZnkgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQTBfRDBfQ1VSUl9ERVNDX1BUUgkweEZGQzAwRTIwCS8qIE1lbURNQTAgU3RyZWFtIDAgRGVzdGluYXRpb24JQ3VycmVudAlEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQTBfRDBfQ1VSUl9BRERSCQkweEZGQzAwRTI0CS8qIE1lbURNQTAgU3RyZWFtIDAgRGVzdGluYXRpb24JQ3VycmVudAlBZGRyZXNzCVJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUEwX0QwX0lSUV9TVEFUVVMJCTB4RkZDMDBFMjgJLyogTWVtRE1BMCBTdHJlYW0gMCBEZXN0aW5hdGlvbglJbnRlcnJ1cHQvU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUEwX0QwX1BFUklQSEVSQUxfTUFQCTB4RkZDMDBFMkMJLyogTWVtRE1BMCBTdHJlYW0gMCBEZXN0aW5hdGlvbglQZXJpcGhlcmFsIE1hcCBSZWdpc3RlciAqLworI2RlZmluZQlNRE1BMF9EMF9DVVJSX1hfQ09VTlQJMHhGRkMwMEUzMAkvKiBNZW1ETUEwIFN0cmVhbSAwIERlc3RpbmF0aW9uCUN1cnJlbnQJWCBDb3VudAlSZWdpc3RlciAqLworI2RlZmluZQlNRE1BMF9EMF9DVVJSX1lfQ09VTlQJMHhGRkMwMEUzOAkvKiBNZW1ETUEwIFN0cmVhbSAwIERlc3RpbmF0aW9uCUN1cnJlbnQJWSBDb3VudAlSZWdpc3RlciAqLworCisjZGVmaW5lCU1ETUEwX1MwX05FWFRfREVTQ19QVFIJMHhGRkMwMEU0MAkvKiBNZW1ETUEwIFN0cmVhbSAwIFNvdXJjZSBOZXh0CURlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlciAqLworI2RlZmluZQlNRE1BMF9TMF9TVEFSVF9BRERSCQkweEZGQzAwRTQ0CS8qIE1lbURNQTAgU3RyZWFtIDAgU291cmNlIFN0YXJ0IEFkZHJlc3MgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQTBfUzBfQ09ORklHCQkJMHhGRkMwMEU0OAkvKiBNZW1ETUEwIFN0cmVhbSAwIFNvdXJjZSBDb25maWd1cmF0aW9uIFJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUEwX1MwX1hfQ09VTlQJCTB4RkZDMDBFNTAJLyogTWVtRE1BMCBTdHJlYW0gMCBTb3VyY2UgWCBDb3VudCBSZWdpc3RlciAqLworI2RlZmluZQlNRE1BMF9TMF9YX01PRElGWQkJMHhGRkMwMEU1NAkvKiBNZW1ETUEwIFN0cmVhbSAwIFNvdXJjZSBYIE1vZGlmeSBSZWdpc3RlciAqLworI2RlZmluZQlNRE1BMF9TMF9ZX0NPVU5UCQkweEZGQzAwRTU4CS8qIE1lbURNQTAgU3RyZWFtIDAgU291cmNlIFkgQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQTBfUzBfWV9NT0RJRlkJCTB4RkZDMDBFNUMJLyogTWVtRE1BMCBTdHJlYW0gMCBTb3VyY2UgWSBNb2RpZnkgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQTBfUzBfQ1VSUl9ERVNDX1BUUgkweEZGQzAwRTYwCS8qIE1lbURNQTAgU3RyZWFtIDAgU291cmNlIEN1cnJlbnQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUEwX1MwX0NVUlJfQUREUgkJMHhGRkMwMEU2NAkvKiBNZW1ETUEwIFN0cmVhbSAwIFNvdXJjZSBDdXJyZW50IEFkZHJlc3MgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQTBfUzBfSVJRX1NUQVRVUwkJMHhGRkMwMEU2OAkvKiBNZW1ETUEwIFN0cmVhbSAwIFNvdXJjZSBJbnRlcnJ1cHQvU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUEwX1MwX1BFUklQSEVSQUxfTUFQCTB4RkZDMDBFNkMJLyogTWVtRE1BMCBTdHJlYW0gMCBTb3VyY2UgUGVyaXBoZXJhbCBNYXAgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQTBfUzBfQ1VSUl9YX0NPVU5UCTB4RkZDMDBFNzAJLyogTWVtRE1BMCBTdHJlYW0gMCBTb3VyY2UgQ3VycmVudCBYIENvdW50IFJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUEwX1MwX0NVUlJfWV9DT1VOVAkweEZGQzAwRTc4CS8qIE1lbURNQTAgU3RyZWFtIDAgU291cmNlIEN1cnJlbnQgWSBDb3VudCBSZWdpc3RlciAqLworCisjZGVmaW5lCU1ETUEwX0QxX05FWFRfREVTQ19QVFIJMHhGRkMwMEU4MAkvKiBNZW1ETUEwIFN0cmVhbSAxIERlc3RpbmF0aW9uCU5leHQgRGVzY3JpcHRvcglQb2ludGVyCVJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUEwX0QxX1NUQVJUX0FERFIJCTB4RkZDMDBFODQJLyogTWVtRE1BMCBTdHJlYW0gMSBEZXN0aW5hdGlvbglTdGFydCBBZGRyZXNzIFJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUEwX0QxX0NPTkZJRwkJCTB4RkZDMDBFODgJLyogTWVtRE1BMCBTdHJlYW0gMSBEZXN0aW5hdGlvbglDb25maWd1cmF0aW9uIFJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUEwX0QxX1hfQ09VTlQJCTB4RkZDMDBFOTAJLyogTWVtRE1BMCBTdHJlYW0gMSBEZXN0aW5hdGlvbglYIENvdW50CVJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUEwX0QxX1hfTU9ESUZZCQkweEZGQzAwRTk0CS8qIE1lbURNQTAgU3RyZWFtIDEgRGVzdGluYXRpb24JWCBNb2RpZnkgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQTBfRDFfWV9DT1VOVAkJMHhGRkMwMEU5OAkvKiBNZW1ETUEwIFN0cmVhbSAxIERlc3RpbmF0aW9uCVkgQ291bnQJUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQTBfRDFfWV9NT0RJRlkJCTB4RkZDMDBFOUMJLyogTWVtRE1BMCBTdHJlYW0gMSBEZXN0aW5hdGlvbglZIE1vZGlmeSBSZWdpc3RlciAqLworI2RlZmluZQlNRE1BMF9EMV9DVVJSX0RFU0NfUFRSCTB4RkZDMDBFQTAJLyogTWVtRE1BMCBTdHJlYW0gMSBEZXN0aW5hdGlvbglDdXJyZW50CURlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlciAqLworI2RlZmluZQlNRE1BMF9EMV9DVVJSX0FERFIJCTB4RkZDMDBFQTQJLyogTWVtRE1BMCBTdHJlYW0gMSBEZXN0aW5hdGlvbglDdXJyZW50CUFkZHJlc3MJUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQTBfRDFfSVJRX1NUQVRVUwkJMHhGRkMwMEVBOAkvKiBNZW1ETUEwIFN0cmVhbSAxIERlc3RpbmF0aW9uCUludGVycnVwdC9TdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQTBfRDFfUEVSSVBIRVJBTF9NQVAJMHhGRkMwMEVBQwkvKiBNZW1ETUEwIFN0cmVhbSAxIERlc3RpbmF0aW9uCVBlcmlwaGVyYWwgTWFwIFJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUEwX0QxX0NVUlJfWF9DT1VOVAkweEZGQzAwRUIwCS8qIE1lbURNQTAgU3RyZWFtIDEgRGVzdGluYXRpb24JQ3VycmVudAlYIENvdW50CVJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUEwX0QxX0NVUlJfWV9DT1VOVAkweEZGQzAwRUI4CS8qIE1lbURNQTAgU3RyZWFtIDEgRGVzdGluYXRpb24JQ3VycmVudAlZIENvdW50CVJlZ2lzdGVyICovCisKKyNkZWZpbmUJTURNQTBfUzFfTkVYVF9ERVNDX1BUUgkweEZGQzAwRUMwCS8qIE1lbURNQTAgU3RyZWFtIDEgU291cmNlIE5leHQJRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUEwX1MxX1NUQVJUX0FERFIJCTB4RkZDMDBFQzQJLyogTWVtRE1BMCBTdHJlYW0gMSBTb3VyY2UgU3RhcnQgQWRkcmVzcyBSZWdpc3RlciAqLworI2RlZmluZQlNRE1BMF9TMV9DT05GSUcJCQkweEZGQzAwRUM4CS8qIE1lbURNQTAgU3RyZWFtIDEgU291cmNlIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQTBfUzFfWF9DT1VOVAkJMHhGRkMwMEVEMAkvKiBNZW1ETUEwIFN0cmVhbSAxIFNvdXJjZSBYIENvdW50IFJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUEwX1MxX1hfTU9ESUZZCQkweEZGQzAwRUQ0CS8qIE1lbURNQTAgU3RyZWFtIDEgU291cmNlIFggTW9kaWZ5IFJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUEwX1MxX1lfQ09VTlQJCTB4RkZDMDBFRDgJLyogTWVtRE1BMCBTdHJlYW0gMSBTb3VyY2UgWSBDb3VudCBSZWdpc3RlciAqLworI2RlZmluZQlNRE1BMF9TMV9ZX01PRElGWQkJMHhGRkMwMEVEQwkvKiBNZW1ETUEwIFN0cmVhbSAxIFNvdXJjZSBZIE1vZGlmeSBSZWdpc3RlciAqLworI2RlZmluZQlNRE1BMF9TMV9DVVJSX0RFU0NfUFRSCTB4RkZDMDBFRTAJLyogTWVtRE1BMCBTdHJlYW0gMSBTb3VyY2UgQ3VycmVudCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQTBfUzFfQ1VSUl9BRERSCQkweEZGQzAwRUU0CS8qIE1lbURNQTAgU3RyZWFtIDEgU291cmNlIEN1cnJlbnQgQWRkcmVzcyBSZWdpc3RlciAqLworI2RlZmluZQlNRE1BMF9TMV9JUlFfU1RBVFVTCQkweEZGQzAwRUU4CS8qIE1lbURNQTAgU3RyZWFtIDEgU291cmNlIEludGVycnVwdC9TdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQTBfUzFfUEVSSVBIRVJBTF9NQVAJMHhGRkMwMEVFQwkvKiBNZW1ETUEwIFN0cmVhbSAxIFNvdXJjZSBQZXJpcGhlcmFsIE1hcCBSZWdpc3RlciAqLworI2RlZmluZQlNRE1BMF9TMV9DVVJSX1hfQ09VTlQJMHhGRkMwMEVGMAkvKiBNZW1ETUEwIFN0cmVhbSAxIFNvdXJjZSBDdXJyZW50IFggQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQTBfUzFfQ1VSUl9ZX0NPVU5UCTB4RkZDMDBFRjgJLyogTWVtRE1BMCBTdHJlYW0gMSBTb3VyY2UgQ3VycmVudCBZIENvdW50IFJlZ2lzdGVyICovCisKKworLyogUGFyYWxsZWwgUGVyaXBoZXJhbCBJbnRlcmZhY2UgKFBQSSkgKDB4RkZDMDEwMDAgLSAweEZGQzAxMEZGKSAqLworI2RlZmluZQlQUElfQ09OVFJPTAkJCTB4RkZDMDEwMDAJLyogUFBJIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJUFBJX1NUQVRVUwkJCTB4RkZDMDEwMDQJLyogUFBJIFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZQlQUElfQ09VTlQJCQkweEZGQzAxMDA4CS8qIFBQSSBUcmFuc2ZlcglDb3VudCBSZWdpc3RlciAqLworI2RlZmluZQlQUElfREVMQVkJCQkweEZGQzAxMDBDCS8qIFBQSSBEZWxheSBDb3VudCBSZWdpc3RlciAqLworI2RlZmluZQlQUElfRlJBTUUJCQkweEZGQzAxMDEwCS8qIFBQSSBGcmFtZSBMZW5ndGggUmVnaXN0ZXIgKi8KKworCisvKiBUd28tV2lyZSBJbnRlcmZhY2UgMAkoMHhGRkMwMTQwMCAtIDB4RkZDMDE0RkYpCQkJICovCisjZGVmaW5lCVRXSTBfQ0xLRElWCQkJMHhGRkMwMTQwMAkvKiBTZXJpYWwgQ2xvY2sJRGl2aWRlcglSZWdpc3RlciAqLworI2RlZmluZQlUV0kwX0NPTlRST0wJCTB4RkZDMDE0MDQJLyogVFdJMAlNYXN0ZXIgSW50ZXJuYWwJVGltZSBSZWZlcmVuY2UgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJVFdJMF9TTEFWRV9DVFJMCQkweEZGQzAxNDA4CS8qIFNsYXZlIE1vZGUgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZQlUV0kwX1NMQVZFX1NUQVQJCTB4RkZDMDE0MEMJLyogU2xhdmUgTW9kZSBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJVFdJMF9TTEFWRV9BRERSCQkweEZGQzAxNDEwCS8qIFNsYXZlIE1vZGUgQWRkcmVzcyBSZWdpc3RlciAqLworI2RlZmluZQlUV0kwX01BU1RFUl9DVFJMCTB4RkZDMDE0MTQJLyogTWFzdGVyIE1vZGUgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZQlUV0kwX01BU1RFUl9TVEFUCTB4RkZDMDE0MTgJLyogTWFzdGVyIE1vZGUgU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lCVRXSTBfTUFTVEVSX0FERFIJMHhGRkMwMTQxQwkvKiBNYXN0ZXIgTW9kZSBBZGRyZXNzIFJlZ2lzdGVyICovCisjZGVmaW5lCVRXSTBfSU5UX1NUQVQJCTB4RkZDMDE0MjAJLyogVFdJMAlNYXN0ZXIgSW50ZXJydXB0IFJlZ2lzdGVyICovCisjZGVmaW5lCVRXSTBfSU5UX01BU0sJCTB4RkZDMDE0MjQJLyogVFdJMAlNYXN0ZXIgSW50ZXJydXB0IE1hc2sgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJVFdJMF9GSUZPX0NUUkwJCTB4RkZDMDE0MjgJLyogRklGTwlDb250cm9sCVJlZ2lzdGVyICovCisjZGVmaW5lCVRXSTBfRklGT19TVEFUCQkweEZGQzAxNDJDCS8qIEZJRk8JU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lCVRXSTBfWE1UX0RBVEE4CQkweEZGQzAxNDgwCS8qIEZJRk8JVHJhbnNtaXQgRGF0YSBTaW5nbGUgQnl0ZSBSZWdpc3RlciAqLworI2RlZmluZQlUV0kwX1hNVF9EQVRBMTYJCTB4RkZDMDE0ODQJLyogRklGTwlUcmFuc21pdCBEYXRhIERvdWJsZSBCeXRlIFJlZ2lzdGVyICovCisjZGVmaW5lCVRXSTBfUkNWX0RBVEE4CQkweEZGQzAxNDg4CS8qIEZJRk8JUmVjZWl2ZQlEYXRhIFNpbmdsZSBCeXRlIFJlZ2lzdGVyICovCisjZGVmaW5lCVRXSTBfUkNWX0RBVEExNgkJMHhGRkMwMTQ4QwkvKiBGSUZPCVJlY2VpdmUJRGF0YSBEb3VibGUgQnl0ZSBSZWdpc3RlciAqLworCisjZGVmaW5lIFRXSTBfUkVHQkFTRQkJVFdJMF9DTEtESVYKKworLyogdGhlIGZvbGxvd2luZyBhcmUgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5ICovCisjZGVmaW5lCVRXSTBfUFJFU0NBTEUJIFRXSTBfQ09OVFJPTAorI2RlZmluZQlUV0kwX0lOVF9TUkMJIFRXSTBfSU5UX1NUQVQKKyNkZWZpbmUJVFdJMF9JTlRfRU5BQkxFCSBUV0kwX0lOVF9NQVNLCisKKworLyogR2VuZXJhbC1QdXJwb3NlIFBvcnRzICAoMHhGRkMwMTUwMCAtCTB4RkZDMDE1RkYpCSAqLworCisvKiBHUElPCVBvcnQgQyBSZWdpc3RlcglOYW1lcyAqLworI2RlZmluZQlHUElPX0NfQ05GRwkJCTB4RkZDMDE1MDAJLyogR1BJTwlQaW4gUG9ydCBDIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJR1BJT19DX0QJCQkweEZGQzAxNTEwCS8qIEdQSU8JUGluIFBvcnQgQyBEYXRhCVJlZ2lzdGVyICovCisjZGVmaW5lCUdQSU9fQ19DCQkJMHhGRkMwMTUyMAkvKiBDbGVhciBHUElPIFBpbiBQb3J0IEMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJR1BJT19DX1MJCQkweEZGQzAxNTMwCS8qIFNldCBHUElPIFBpbglQb3J0IEMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJR1BJT19DX1QJCQkweEZGQzAxNTQwCS8qIFRvZ2dsZSBHUElPIFBpbiBQb3J0CUMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJR1BJT19DX0RJUgkJCTB4RkZDMDE1NTAJLyogR1BJTwlQaW4gUG9ydCBDIERpcmVjdGlvbiBSZWdpc3RlciAqLworI2RlZmluZQlHUElPX0NfSU5FTgkJCTB4RkZDMDE1NjAJLyogR1BJTwlQaW4gUG9ydCBDIElucHV0IEVuYWJsZQlSZWdpc3RlciAqLworCisvKiBHUElPCVBvcnQgRCBSZWdpc3RlcglOYW1lcyAqLworI2RlZmluZQlHUElPX0RfQ05GRwkJCTB4RkZDMDE1MDQJLyogR1BJTwlQaW4gUG9ydCBEIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJR1BJT19EX0QJCQkweEZGQzAxNTE0CS8qIEdQSU8JUGluIFBvcnQgRCBEYXRhCVJlZ2lzdGVyICovCisjZGVmaW5lCUdQSU9fRF9DCQkJMHhGRkMwMTUyNAkvKiBDbGVhciBHUElPIFBpbiBQb3J0IEQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJR1BJT19EX1MJCQkweEZGQzAxNTM0CS8qIFNldCBHUElPIFBpbglQb3J0IEQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJR1BJT19EX1QJCQkweEZGQzAxNTQ0CS8qIFRvZ2dsZSBHUElPIFBpbiBQb3J0CUQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJR1BJT19EX0RJUgkJCTB4RkZDMDE1NTQJLyogR1BJTwlQaW4gUG9ydCBEIERpcmVjdGlvbiBSZWdpc3RlciAqLworI2RlZmluZQlHUElPX0RfSU5FTgkJCTB4RkZDMDE1NjQJLyogR1BJTwlQaW4gUG9ydCBEIElucHV0IEVuYWJsZQlSZWdpc3RlciAqLworCisvKiBHUElPCVBvcnQgRSBSZWdpc3RlcglOYW1lcyAqLworI2RlZmluZQlHUElPX0VfQ05GRwkJCTB4RkZDMDE1MDgJLyogR1BJTwlQaW4gUG9ydCBFIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJR1BJT19FX0QJCQkweEZGQzAxNTE4CS8qIEdQSU8JUGluIFBvcnQgRSBEYXRhCVJlZ2lzdGVyICovCisjZGVmaW5lCUdQSU9fRV9DCQkJMHhGRkMwMTUyOAkvKiBDbGVhciBHUElPIFBpbiBQb3J0IEUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJR1BJT19FX1MJCQkweEZGQzAxNTM4CS8qIFNldCBHUElPIFBpbglQb3J0IEUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJR1BJT19FX1QJCQkweEZGQzAxNTQ4CS8qIFRvZ2dsZSBHUElPIFBpbiBQb3J0CUUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJR1BJT19FX0RJUgkJCTB4RkZDMDE1NTgJLyogR1BJTwlQaW4gUG9ydCBFIERpcmVjdGlvbiBSZWdpc3RlciAqLworI2RlZmluZQlHUElPX0VfSU5FTgkJCTB4RkZDMDE1NjgJLyogR1BJTwlQaW4gUG9ydCBFIElucHV0IEVuYWJsZQlSZWdpc3RlciAqLworCisvKiBETUEgQ29udHJvbGxlciAxIFRyYWZmaWMgQ29udHJvbCBSZWdpc3RlcnMgKDB4RkZDMDFCMDAgLSAweEZGQzAxQkZGKSAqLworCisjZGVmaW5lCURNQUMxX1RDX1BFUgkJCTB4RkZDMDFCMEMJLyogRE1BIENvbnRyb2xsZXIgMSBUcmFmZmljIENvbnRyb2wgUGVyaW9kcyBSZWdpc3RlciAqLworI2RlZmluZQlETUFDMV9UQ19DTlQJCQkweEZGQzAxQjEwCS8qIERNQSBDb250cm9sbGVyIDEgVHJhZmZpYyBDb250cm9sIEN1cnJlbnQgQ291bnRzIFJlZ2lzdGVyICovCisKKy8qIEFsdGVybmF0ZSBkZXByZWNhdGVkCXJlZ2lzdGVyIG5hbWVzIChiZWxvdykgcHJvdmlkZWQJZm9yIGJhY2t3YXJkcyBjb2RlIGNvbXBhdGliaWxpdHkgKi8KKyNkZWZpbmUJRE1BMV9UQ1BFUgkJCURNQUMxX1RDX1BFUgorI2RlZmluZQlETUExX1RDQ05UCQkJRE1BQzFfVENfQ05UCisKKworLyogRE1BIENvbnRyb2xsZXIgMSAoMHhGRkMwMUMwMAktIDB4RkZDMDFGRkYpCQkJCQkJCSAqLworI2RlZmluZQlETUE4X05FWFRfREVTQ19QVFIJCTB4RkZDMDFDMDAJLyogRE1BIENoYW5uZWwgOCBOZXh0IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlciAqLworI2RlZmluZQlETUE4X1NUQVJUX0FERFIJCQkweEZGQzAxQzA0CS8qIERNQSBDaGFubmVsIDggU3RhcnQgQWRkcmVzcyBSZWdpc3RlciAqLworI2RlZmluZQlETUE4X0NPTkZJRwkJCQkweEZGQzAxQzA4CS8qIERNQSBDaGFubmVsIDggQ29uZmlndXJhdGlvbiBSZWdpc3RlciAqLworI2RlZmluZQlETUE4X1hfQ09VTlQJCQkweEZGQzAxQzEwCS8qIERNQSBDaGFubmVsIDggWCBDb3VudCBSZWdpc3RlciAqLworI2RlZmluZQlETUE4X1hfTU9ESUZZCQkJMHhGRkMwMUMxNAkvKiBETUEgQ2hhbm5lbCA4IFggTW9kaWZ5IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQThfWV9DT1VOVAkJCTB4RkZDMDFDMTgJLyogRE1BIENoYW5uZWwgOCBZIENvdW50IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQThfWV9NT0RJRlkJCQkweEZGQzAxQzFDCS8qIERNQSBDaGFubmVsIDggWSBNb2RpZnkgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BOF9DVVJSX0RFU0NfUFRSCQkweEZGQzAxQzIwCS8qIERNQSBDaGFubmVsIDggQ3VycmVudCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BOF9DVVJSX0FERFIJCQkweEZGQzAxQzI0CS8qIERNQSBDaGFubmVsIDggQ3VycmVudCBBZGRyZXNzIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQThfSVJRX1NUQVRVUwkJCTB4RkZDMDFDMjgJLyogRE1BIENoYW5uZWwgOCBJbnRlcnJ1cHQvU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQThfUEVSSVBIRVJBTF9NQVAJCTB4RkZDMDFDMkMJLyogRE1BIENoYW5uZWwgOCBQZXJpcGhlcmFsIE1hcAlSZWdpc3RlciAqLworI2RlZmluZQlETUE4X0NVUlJfWF9DT1VOVAkJMHhGRkMwMUMzMAkvKiBETUEgQ2hhbm5lbCA4IEN1cnJlbnQgWCBDb3VudCBSZWdpc3RlciAqLworI2RlZmluZQlETUE4X0NVUlJfWV9DT1VOVAkJMHhGRkMwMUMzOAkvKiBETUEgQ2hhbm5lbCA4IEN1cnJlbnQgWSBDb3VudCBSZWdpc3RlciAqLworCisjZGVmaW5lCURNQTlfTkVYVF9ERVNDX1BUUgkJMHhGRkMwMUM0MAkvKiBETUEgQ2hhbm5lbCA5IE5leHQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTlfU1RBUlRfQUREUgkJCTB4RkZDMDFDNDQJLyogRE1BIENoYW5uZWwgOSBTdGFydCBBZGRyZXNzIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTlfQ09ORklHCQkJCTB4RkZDMDFDNDgJLyogRE1BIENoYW5uZWwgOSBDb25maWd1cmF0aW9uIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTlfWF9DT1VOVAkJCTB4RkZDMDFDNTAJLyogRE1BIENoYW5uZWwgOSBYIENvdW50IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTlfWF9NT0RJRlkJCQkweEZGQzAxQzU0CS8qIERNQSBDaGFubmVsIDkgWCBNb2RpZnkgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BOV9ZX0NPVU5UCQkJMHhGRkMwMUM1OAkvKiBETUEgQ2hhbm5lbCA5IFkgQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BOV9ZX01PRElGWQkJCTB4RkZDMDFDNUMJLyogRE1BIENoYW5uZWwgOSBZIE1vZGlmeSBSZWdpc3RlciAqLworI2RlZmluZQlETUE5X0NVUlJfREVTQ19QVFIJCTB4RkZDMDFDNjAJLyogRE1BIENoYW5uZWwgOSBDdXJyZW50IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlciAqLworI2RlZmluZQlETUE5X0NVUlJfQUREUgkJCTB4RkZDMDFDNjQJLyogRE1BIENoYW5uZWwgOSBDdXJyZW50IEFkZHJlc3MgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BOV9JUlFfU1RBVFVTCQkJMHhGRkMwMUM2OAkvKiBETUEgQ2hhbm5lbCA5IEludGVycnVwdC9TdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BOV9QRVJJUEhFUkFMX01BUAkJMHhGRkMwMUM2QwkvKiBETUEgQ2hhbm5lbCA5IFBlcmlwaGVyYWwgTWFwCVJlZ2lzdGVyICovCisjZGVmaW5lCURNQTlfQ1VSUl9YX0NPVU5UCQkweEZGQzAxQzcwCS8qIERNQSBDaGFubmVsIDkgQ3VycmVudCBYIENvdW50IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTlfQ1VSUl9ZX0NPVU5UCQkweEZGQzAxQzc4CS8qIERNQSBDaGFubmVsIDkgQ3VycmVudCBZIENvdW50IFJlZ2lzdGVyICovCisKKyNkZWZpbmUJRE1BMTBfTkVYVF9ERVNDX1BUUgkJMHhGRkMwMUM4MAkvKiBETUEgQ2hhbm5lbCAxMCBOZXh0IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlciAqLworI2RlZmluZQlETUExMF9TVEFSVF9BRERSCQkweEZGQzAxQzg0CS8qIERNQSBDaGFubmVsIDEwIFN0YXJ0CUFkZHJlc3MJUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTBfQ09ORklHCQkJMHhGRkMwMUM4OAkvKiBETUEgQ2hhbm5lbCAxMCBDb25maWd1cmF0aW9uCVJlZ2lzdGVyICovCisjZGVmaW5lCURNQTEwX1hfQ09VTlQJCQkweEZGQzAxQzkwCS8qIERNQSBDaGFubmVsIDEwIFggQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTBfWF9NT0RJRlkJCQkweEZGQzAxQzk0CS8qIERNQSBDaGFubmVsIDEwIFggTW9kaWZ5IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTEwX1lfQ09VTlQJCQkweEZGQzAxQzk4CS8qIERNQSBDaGFubmVsIDEwIFkgQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTBfWV9NT0RJRlkJCQkweEZGQzAxQzlDCS8qIERNQSBDaGFubmVsIDEwIFkgTW9kaWZ5IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTEwX0NVUlJfREVTQ19QVFIJCTB4RkZDMDFDQTAJLyogRE1BIENoYW5uZWwgMTAgQ3VycmVudCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTBfQ1VSUl9BRERSCQkJMHhGRkMwMUNBNAkvKiBETUEgQ2hhbm5lbCAxMCBDdXJyZW50IEFkZHJlc3MgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTBfSVJRX1NUQVRVUwkJMHhGRkMwMUNBOAkvKiBETUEgQ2hhbm5lbCAxMCBJbnRlcnJ1cHQvU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTEwX1BFUklQSEVSQUxfTUFQCTB4RkZDMDFDQUMJLyogRE1BIENoYW5uZWwgMTAgUGVyaXBoZXJhbCBNYXAgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTBfQ1VSUl9YX0NPVU5UCQkweEZGQzAxQ0IwCS8qIERNQSBDaGFubmVsIDEwIEN1cnJlbnQgWCBDb3VudCBSZWdpc3RlciAqLworI2RlZmluZQlETUExMF9DVVJSX1lfQ09VTlQJCTB4RkZDMDFDQjgJLyogRE1BIENoYW5uZWwgMTAgQ3VycmVudCBZIENvdW50IFJlZ2lzdGVyICovCisKKyNkZWZpbmUJRE1BMTFfTkVYVF9ERVNDX1BUUgkJMHhGRkMwMUNDMAkvKiBETUEgQ2hhbm5lbCAxMSBOZXh0IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlciAqLworI2RlZmluZQlETUExMV9TVEFSVF9BRERSCQkweEZGQzAxQ0M0CS8qIERNQSBDaGFubmVsIDExIFN0YXJ0CUFkZHJlc3MJUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTFfQ09ORklHCQkJMHhGRkMwMUNDOAkvKiBETUEgQ2hhbm5lbCAxMSBDb25maWd1cmF0aW9uCVJlZ2lzdGVyICovCisjZGVmaW5lCURNQTExX1hfQ09VTlQJCQkweEZGQzAxQ0QwCS8qIERNQSBDaGFubmVsIDExIFggQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTFfWF9NT0RJRlkJCQkweEZGQzAxQ0Q0CS8qIERNQSBDaGFubmVsIDExIFggTW9kaWZ5IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTExX1lfQ09VTlQJCQkweEZGQzAxQ0Q4CS8qIERNQSBDaGFubmVsIDExIFkgQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTFfWV9NT0RJRlkJCQkweEZGQzAxQ0RDCS8qIERNQSBDaGFubmVsIDExIFkgTW9kaWZ5IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTExX0NVUlJfREVTQ19QVFIJCTB4RkZDMDFDRTAJLyogRE1BIENoYW5uZWwgMTEgQ3VycmVudCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTFfQ1VSUl9BRERSCQkJMHhGRkMwMUNFNAkvKiBETUEgQ2hhbm5lbCAxMSBDdXJyZW50IEFkZHJlc3MgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTFfSVJRX1NUQVRVUwkJMHhGRkMwMUNFOAkvKiBETUEgQ2hhbm5lbCAxMSBJbnRlcnJ1cHQvU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTExX1BFUklQSEVSQUxfTUFQCTB4RkZDMDFDRUMJLyogRE1BIENoYW5uZWwgMTEgUGVyaXBoZXJhbCBNYXAgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTFfQ1VSUl9YX0NPVU5UCQkweEZGQzAxQ0YwCS8qIERNQSBDaGFubmVsIDExIEN1cnJlbnQgWCBDb3VudCBSZWdpc3RlciAqLworI2RlZmluZQlETUExMV9DVVJSX1lfQ09VTlQJCTB4RkZDMDFDRjgJLyogRE1BIENoYW5uZWwgMTEgQ3VycmVudCBZIENvdW50IFJlZ2lzdGVyICovCisKKyNkZWZpbmUJRE1BMTJfTkVYVF9ERVNDX1BUUgkJMHhGRkMwMUQwMAkvKiBETUEgQ2hhbm5lbCAxMiBOZXh0IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlciAqLworI2RlZmluZQlETUExMl9TVEFSVF9BRERSCQkweEZGQzAxRDA0CS8qIERNQSBDaGFubmVsIDEyIFN0YXJ0CUFkZHJlc3MJUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTJfQ09ORklHCQkJMHhGRkMwMUQwOAkvKiBETUEgQ2hhbm5lbCAxMiBDb25maWd1cmF0aW9uCVJlZ2lzdGVyICovCisjZGVmaW5lCURNQTEyX1hfQ09VTlQJCQkweEZGQzAxRDEwCS8qIERNQSBDaGFubmVsIDEyIFggQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTJfWF9NT0RJRlkJCQkweEZGQzAxRDE0CS8qIERNQSBDaGFubmVsIDEyIFggTW9kaWZ5IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTEyX1lfQ09VTlQJCQkweEZGQzAxRDE4CS8qIERNQSBDaGFubmVsIDEyIFkgQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTJfWV9NT0RJRlkJCQkweEZGQzAxRDFDCS8qIERNQSBDaGFubmVsIDEyIFkgTW9kaWZ5IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTEyX0NVUlJfREVTQ19QVFIJCTB4RkZDMDFEMjAJLyogRE1BIENoYW5uZWwgMTIgQ3VycmVudCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTJfQ1VSUl9BRERSCQkJMHhGRkMwMUQyNAkvKiBETUEgQ2hhbm5lbCAxMiBDdXJyZW50IEFkZHJlc3MgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTJfSVJRX1NUQVRVUwkJMHhGRkMwMUQyOAkvKiBETUEgQ2hhbm5lbCAxMiBJbnRlcnJ1cHQvU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTEyX1BFUklQSEVSQUxfTUFQCTB4RkZDMDFEMkMJLyogRE1BIENoYW5uZWwgMTIgUGVyaXBoZXJhbCBNYXAgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTJfQ1VSUl9YX0NPVU5UCQkweEZGQzAxRDMwCS8qIERNQSBDaGFubmVsIDEyIEN1cnJlbnQgWCBDb3VudCBSZWdpc3RlciAqLworI2RlZmluZQlETUExMl9DVVJSX1lfQ09VTlQJCTB4RkZDMDFEMzgJLyogRE1BIENoYW5uZWwgMTIgQ3VycmVudCBZIENvdW50IFJlZ2lzdGVyICovCisKKyNkZWZpbmUJRE1BMTNfTkVYVF9ERVNDX1BUUgkJMHhGRkMwMUQ0MAkvKiBETUEgQ2hhbm5lbCAxMyBOZXh0IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlciAqLworI2RlZmluZQlETUExM19TVEFSVF9BRERSCQkweEZGQzAxRDQ0CS8qIERNQSBDaGFubmVsIDEzIFN0YXJ0CUFkZHJlc3MJUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTNfQ09ORklHCQkJMHhGRkMwMUQ0OAkvKiBETUEgQ2hhbm5lbCAxMyBDb25maWd1cmF0aW9uCVJlZ2lzdGVyICovCisjZGVmaW5lCURNQTEzX1hfQ09VTlQJCQkweEZGQzAxRDUwCS8qIERNQSBDaGFubmVsIDEzIFggQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTNfWF9NT0RJRlkJCQkweEZGQzAxRDU0CS8qIERNQSBDaGFubmVsIDEzIFggTW9kaWZ5IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTEzX1lfQ09VTlQJCQkweEZGQzAxRDU4CS8qIERNQSBDaGFubmVsIDEzIFkgQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTNfWV9NT0RJRlkJCQkweEZGQzAxRDVDCS8qIERNQSBDaGFubmVsIDEzIFkgTW9kaWZ5IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTEzX0NVUlJfREVTQ19QVFIJCTB4RkZDMDFENjAJLyogRE1BIENoYW5uZWwgMTMgQ3VycmVudCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTNfQ1VSUl9BRERSCQkJMHhGRkMwMUQ2NAkvKiBETUEgQ2hhbm5lbCAxMyBDdXJyZW50IEFkZHJlc3MgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTNfSVJRX1NUQVRVUwkJMHhGRkMwMUQ2OAkvKiBETUEgQ2hhbm5lbCAxMyBJbnRlcnJ1cHQvU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTEzX1BFUklQSEVSQUxfTUFQCTB4RkZDMDFENkMJLyogRE1BIENoYW5uZWwgMTMgUGVyaXBoZXJhbCBNYXAgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTNfQ1VSUl9YX0NPVU5UCQkweEZGQzAxRDcwCS8qIERNQSBDaGFubmVsIDEzIEN1cnJlbnQgWCBDb3VudCBSZWdpc3RlciAqLworI2RlZmluZQlETUExM19DVVJSX1lfQ09VTlQJCTB4RkZDMDFENzgJLyogRE1BIENoYW5uZWwgMTMgQ3VycmVudCBZIENvdW50IFJlZ2lzdGVyICovCisKKyNkZWZpbmUJRE1BMTRfTkVYVF9ERVNDX1BUUgkJMHhGRkMwMUQ4MAkvKiBETUEgQ2hhbm5lbCAxNCBOZXh0IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlciAqLworI2RlZmluZQlETUExNF9TVEFSVF9BRERSCQkweEZGQzAxRDg0CS8qIERNQSBDaGFubmVsIDE0IFN0YXJ0CUFkZHJlc3MJUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTRfQ09ORklHCQkJMHhGRkMwMUQ4OAkvKiBETUEgQ2hhbm5lbCAxNCBDb25maWd1cmF0aW9uCVJlZ2lzdGVyICovCisjZGVmaW5lCURNQTE0X1hfQ09VTlQJCQkweEZGQzAxRDkwCS8qIERNQSBDaGFubmVsIDE0IFggQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTRfWF9NT0RJRlkJCQkweEZGQzAxRDk0CS8qIERNQSBDaGFubmVsIDE0IFggTW9kaWZ5IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTE0X1lfQ09VTlQJCQkweEZGQzAxRDk4CS8qIERNQSBDaGFubmVsIDE0IFkgQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTRfWV9NT0RJRlkJCQkweEZGQzAxRDlDCS8qIERNQSBDaGFubmVsIDE0IFkgTW9kaWZ5IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTE0X0NVUlJfREVTQ19QVFIJCTB4RkZDMDFEQTAJLyogRE1BIENoYW5uZWwgMTQgQ3VycmVudCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTRfQ1VSUl9BRERSCQkJMHhGRkMwMURBNAkvKiBETUEgQ2hhbm5lbCAxNCBDdXJyZW50IEFkZHJlc3MgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTRfSVJRX1NUQVRVUwkJMHhGRkMwMURBOAkvKiBETUEgQ2hhbm5lbCAxNCBJbnRlcnJ1cHQvU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTE0X1BFUklQSEVSQUxfTUFQCTB4RkZDMDFEQUMJLyogRE1BIENoYW5uZWwgMTQgUGVyaXBoZXJhbCBNYXAgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTRfQ1VSUl9YX0NPVU5UCQkweEZGQzAxREIwCS8qIERNQSBDaGFubmVsIDE0IEN1cnJlbnQgWCBDb3VudCBSZWdpc3RlciAqLworI2RlZmluZQlETUExNF9DVVJSX1lfQ09VTlQJCTB4RkZDMDFEQjgJLyogRE1BIENoYW5uZWwgMTQgQ3VycmVudCBZIENvdW50IFJlZ2lzdGVyICovCisKKyNkZWZpbmUJRE1BMTVfTkVYVF9ERVNDX1BUUgkJMHhGRkMwMURDMAkvKiBETUEgQ2hhbm5lbCAxNSBOZXh0IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlciAqLworI2RlZmluZQlETUExNV9TVEFSVF9BRERSCQkweEZGQzAxREM0CS8qIERNQSBDaGFubmVsIDE1IFN0YXJ0CUFkZHJlc3MJUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTVfQ09ORklHCQkJMHhGRkMwMURDOAkvKiBETUEgQ2hhbm5lbCAxNSBDb25maWd1cmF0aW9uCVJlZ2lzdGVyICovCisjZGVmaW5lCURNQTE1X1hfQ09VTlQJCQkweEZGQzAxREQwCS8qIERNQSBDaGFubmVsIDE1IFggQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTVfWF9NT0RJRlkJCQkweEZGQzAxREQ0CS8qIERNQSBDaGFubmVsIDE1IFggTW9kaWZ5IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTE1X1lfQ09VTlQJCQkweEZGQzAxREQ4CS8qIERNQSBDaGFubmVsIDE1IFkgQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTVfWV9NT0RJRlkJCQkweEZGQzAxRERDCS8qIERNQSBDaGFubmVsIDE1IFkgTW9kaWZ5IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTE1X0NVUlJfREVTQ19QVFIJCTB4RkZDMDFERTAJLyogRE1BIENoYW5uZWwgMTUgQ3VycmVudCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTVfQ1VSUl9BRERSCQkJMHhGRkMwMURFNAkvKiBETUEgQ2hhbm5lbCAxNSBDdXJyZW50IEFkZHJlc3MgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTVfSVJRX1NUQVRVUwkJMHhGRkMwMURFOAkvKiBETUEgQ2hhbm5lbCAxNSBJbnRlcnJ1cHQvU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTE1X1BFUklQSEVSQUxfTUFQCTB4RkZDMDFERUMJLyogRE1BIENoYW5uZWwgMTUgUGVyaXBoZXJhbCBNYXAgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTVfQ1VSUl9YX0NPVU5UCQkweEZGQzAxREYwCS8qIERNQSBDaGFubmVsIDE1IEN1cnJlbnQgWCBDb3VudCBSZWdpc3RlciAqLworI2RlZmluZQlETUExNV9DVVJSX1lfQ09VTlQJCTB4RkZDMDFERjgJLyogRE1BIENoYW5uZWwgMTUgQ3VycmVudCBZIENvdW50IFJlZ2lzdGVyICovCisKKyNkZWZpbmUJRE1BMTZfTkVYVF9ERVNDX1BUUgkJMHhGRkMwMUUwMAkvKiBETUEgQ2hhbm5lbCAxNiBOZXh0IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlciAqLworI2RlZmluZQlETUExNl9TVEFSVF9BRERSCQkweEZGQzAxRTA0CS8qIERNQSBDaGFubmVsIDE2IFN0YXJ0CUFkZHJlc3MJUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTZfQ09ORklHCQkJMHhGRkMwMUUwOAkvKiBETUEgQ2hhbm5lbCAxNiBDb25maWd1cmF0aW9uCVJlZ2lzdGVyICovCisjZGVmaW5lCURNQTE2X1hfQ09VTlQJCQkweEZGQzAxRTEwCS8qIERNQSBDaGFubmVsIDE2IFggQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTZfWF9NT0RJRlkJCQkweEZGQzAxRTE0CS8qIERNQSBDaGFubmVsIDE2IFggTW9kaWZ5IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTE2X1lfQ09VTlQJCQkweEZGQzAxRTE4CS8qIERNQSBDaGFubmVsIDE2IFkgQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTZfWV9NT0RJRlkJCQkweEZGQzAxRTFDCS8qIERNQSBDaGFubmVsIDE2IFkgTW9kaWZ5IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTE2X0NVUlJfREVTQ19QVFIJCTB4RkZDMDFFMjAJLyogRE1BIENoYW5uZWwgMTYgQ3VycmVudCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTZfQ1VSUl9BRERSCQkJMHhGRkMwMUUyNAkvKiBETUEgQ2hhbm5lbCAxNiBDdXJyZW50IEFkZHJlc3MgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTZfSVJRX1NUQVRVUwkJMHhGRkMwMUUyOAkvKiBETUEgQ2hhbm5lbCAxNiBJbnRlcnJ1cHQvU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTE2X1BFUklQSEVSQUxfTUFQCTB4RkZDMDFFMkMJLyogRE1BIENoYW5uZWwgMTYgUGVyaXBoZXJhbCBNYXAgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTZfQ1VSUl9YX0NPVU5UCQkweEZGQzAxRTMwCS8qIERNQSBDaGFubmVsIDE2IEN1cnJlbnQgWCBDb3VudCBSZWdpc3RlciAqLworI2RlZmluZQlETUExNl9DVVJSX1lfQ09VTlQJCTB4RkZDMDFFMzgJLyogRE1BIENoYW5uZWwgMTYgQ3VycmVudCBZIENvdW50IFJlZ2lzdGVyICovCisKKyNkZWZpbmUJRE1BMTdfTkVYVF9ERVNDX1BUUgkJMHhGRkMwMUU0MAkvKiBETUEgQ2hhbm5lbCAxNyBOZXh0IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlciAqLworI2RlZmluZQlETUExN19TVEFSVF9BRERSCQkweEZGQzAxRTQ0CS8qIERNQSBDaGFubmVsIDE3IFN0YXJ0CUFkZHJlc3MJUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTdfQ09ORklHCQkJMHhGRkMwMUU0OAkvKiBETUEgQ2hhbm5lbCAxNyBDb25maWd1cmF0aW9uCVJlZ2lzdGVyICovCisjZGVmaW5lCURNQTE3X1hfQ09VTlQJCQkweEZGQzAxRTUwCS8qIERNQSBDaGFubmVsIDE3IFggQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTdfWF9NT0RJRlkJCQkweEZGQzAxRTU0CS8qIERNQSBDaGFubmVsIDE3IFggTW9kaWZ5IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTE3X1lfQ09VTlQJCQkweEZGQzAxRTU4CS8qIERNQSBDaGFubmVsIDE3IFkgQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTdfWV9NT0RJRlkJCQkweEZGQzAxRTVDCS8qIERNQSBDaGFubmVsIDE3IFkgTW9kaWZ5IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTE3X0NVUlJfREVTQ19QVFIJCTB4RkZDMDFFNjAJLyogRE1BIENoYW5uZWwgMTcgQ3VycmVudCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTdfQ1VSUl9BRERSCQkJMHhGRkMwMUU2NAkvKiBETUEgQ2hhbm5lbCAxNyBDdXJyZW50IEFkZHJlc3MgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTdfSVJRX1NUQVRVUwkJMHhGRkMwMUU2OAkvKiBETUEgQ2hhbm5lbCAxNyBJbnRlcnJ1cHQvU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTE3X1BFUklQSEVSQUxfTUFQCTB4RkZDMDFFNkMJLyogRE1BIENoYW5uZWwgMTcgUGVyaXBoZXJhbCBNYXAgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTdfQ1VSUl9YX0NPVU5UCQkweEZGQzAxRTcwCS8qIERNQSBDaGFubmVsIDE3IEN1cnJlbnQgWCBDb3VudCBSZWdpc3RlciAqLworI2RlZmluZQlETUExN19DVVJSX1lfQ09VTlQJCTB4RkZDMDFFNzgJLyogRE1BIENoYW5uZWwgMTcgQ3VycmVudCBZIENvdW50IFJlZ2lzdGVyICovCisKKyNkZWZpbmUJRE1BMThfTkVYVF9ERVNDX1BUUgkJMHhGRkMwMUU4MAkvKiBETUEgQ2hhbm5lbCAxOCBOZXh0IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlciAqLworI2RlZmluZQlETUExOF9TVEFSVF9BRERSCQkweEZGQzAxRTg0CS8qIERNQSBDaGFubmVsIDE4IFN0YXJ0CUFkZHJlc3MJUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMThfQ09ORklHCQkJMHhGRkMwMUU4OAkvKiBETUEgQ2hhbm5lbCAxOCBDb25maWd1cmF0aW9uCVJlZ2lzdGVyICovCisjZGVmaW5lCURNQTE4X1hfQ09VTlQJCQkweEZGQzAxRTkwCS8qIERNQSBDaGFubmVsIDE4IFggQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMThfWF9NT0RJRlkJCQkweEZGQzAxRTk0CS8qIERNQSBDaGFubmVsIDE4IFggTW9kaWZ5IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTE4X1lfQ09VTlQJCQkweEZGQzAxRTk4CS8qIERNQSBDaGFubmVsIDE4IFkgQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMThfWV9NT0RJRlkJCQkweEZGQzAxRTlDCS8qIERNQSBDaGFubmVsIDE4IFkgTW9kaWZ5IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTE4X0NVUlJfREVTQ19QVFIJCTB4RkZDMDFFQTAJLyogRE1BIENoYW5uZWwgMTggQ3VycmVudCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMThfQ1VSUl9BRERSCQkJMHhGRkMwMUVBNAkvKiBETUEgQ2hhbm5lbCAxOCBDdXJyZW50IEFkZHJlc3MgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMThfSVJRX1NUQVRVUwkJMHhGRkMwMUVBOAkvKiBETUEgQ2hhbm5lbCAxOCBJbnRlcnJ1cHQvU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTE4X1BFUklQSEVSQUxfTUFQCTB4RkZDMDFFQUMJLyogRE1BIENoYW5uZWwgMTggUGVyaXBoZXJhbCBNYXAgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMThfQ1VSUl9YX0NPVU5UCQkweEZGQzAxRUIwCS8qIERNQSBDaGFubmVsIDE4IEN1cnJlbnQgWCBDb3VudCBSZWdpc3RlciAqLworI2RlZmluZQlETUExOF9DVVJSX1lfQ09VTlQJCTB4RkZDMDFFQjgJLyogRE1BIENoYW5uZWwgMTggQ3VycmVudCBZIENvdW50IFJlZ2lzdGVyICovCisKKyNkZWZpbmUJRE1BMTlfTkVYVF9ERVNDX1BUUgkJMHhGRkMwMUVDMAkvKiBETUEgQ2hhbm5lbCAxOSBOZXh0IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlciAqLworI2RlZmluZQlETUExOV9TVEFSVF9BRERSCQkweEZGQzAxRUM0CS8qIERNQSBDaGFubmVsIDE5IFN0YXJ0CUFkZHJlc3MJUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTlfQ09ORklHCQkJMHhGRkMwMUVDOAkvKiBETUEgQ2hhbm5lbCAxOSBDb25maWd1cmF0aW9uCVJlZ2lzdGVyICovCisjZGVmaW5lCURNQTE5X1hfQ09VTlQJCQkweEZGQzAxRUQwCS8qIERNQSBDaGFubmVsIDE5IFggQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTlfWF9NT0RJRlkJCQkweEZGQzAxRUQ0CS8qIERNQSBDaGFubmVsIDE5IFggTW9kaWZ5IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTE5X1lfQ09VTlQJCQkweEZGQzAxRUQ4CS8qIERNQSBDaGFubmVsIDE5IFkgQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTlfWV9NT0RJRlkJCQkweEZGQzAxRURDCS8qIERNQSBDaGFubmVsIDE5IFkgTW9kaWZ5IFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTE5X0NVUlJfREVTQ19QVFIJCTB4RkZDMDFFRTAJLyogRE1BIENoYW5uZWwgMTkgQ3VycmVudCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTlfQ1VSUl9BRERSCQkJMHhGRkMwMUVFNAkvKiBETUEgQ2hhbm5lbCAxOSBDdXJyZW50IEFkZHJlc3MgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTlfSVJRX1NUQVRVUwkJMHhGRkMwMUVFOAkvKiBETUEgQ2hhbm5lbCAxOSBJbnRlcnJ1cHQvU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lCURNQTE5X1BFUklQSEVSQUxfTUFQCTB4RkZDMDFFRUMJLyogRE1BIENoYW5uZWwgMTkgUGVyaXBoZXJhbCBNYXAgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE1BMTlfQ1VSUl9YX0NPVU5UCQkweEZGQzAxRUYwCS8qIERNQSBDaGFubmVsIDE5IEN1cnJlbnQgWCBDb3VudCBSZWdpc3RlciAqLworI2RlZmluZQlETUExOV9DVVJSX1lfQ09VTlQJCTB4RkZDMDFFRjgJLyogRE1BIENoYW5uZWwgMTkgQ3VycmVudCBZIENvdW50IFJlZ2lzdGVyICovCisKKyNkZWZpbmUJTURNQTFfRDBfTkVYVF9ERVNDX1BUUgkweEZGQzAxRjAwCS8qIE1lbURNQTEgU3RyZWFtIDAgRGVzdGluYXRpb24JTmV4dCBEZXNjcmlwdG9yCVBvaW50ZXIJUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQTFfRDBfU1RBUlRfQUREUgkJMHhGRkMwMUYwNAkvKiBNZW1ETUExIFN0cmVhbSAwIERlc3RpbmF0aW9uCVN0YXJ0IEFkZHJlc3MgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQTFfRDBfQ09ORklHCQkJMHhGRkMwMUYwOAkvKiBNZW1ETUExIFN0cmVhbSAwIERlc3RpbmF0aW9uCUNvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQTFfRDBfWF9DT1VOVAkJMHhGRkMwMUYxMAkvKiBNZW1ETUExIFN0cmVhbSAwIERlc3RpbmF0aW9uCVggQ291bnQJUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQTFfRDBfWF9NT0RJRlkJCTB4RkZDMDFGMTQJLyogTWVtRE1BMSBTdHJlYW0gMCBEZXN0aW5hdGlvbglYIE1vZGlmeSBSZWdpc3RlciAqLworI2RlZmluZQlNRE1BMV9EMF9ZX0NPVU5UCQkweEZGQzAxRjE4CS8qIE1lbURNQTEgU3RyZWFtIDAgRGVzdGluYXRpb24JWSBDb3VudAlSZWdpc3RlciAqLworI2RlZmluZQlNRE1BMV9EMF9ZX01PRElGWQkJMHhGRkMwMUYxQwkvKiBNZW1ETUExIFN0cmVhbSAwIERlc3RpbmF0aW9uCVkgTW9kaWZ5IFJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUExX0QwX0NVUlJfREVTQ19QVFIJMHhGRkMwMUYyMAkvKiBNZW1ETUExIFN0cmVhbSAwIERlc3RpbmF0aW9uCUN1cnJlbnQJRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUExX0QwX0NVUlJfQUREUgkJMHhGRkMwMUYyNAkvKiBNZW1ETUExIFN0cmVhbSAwIERlc3RpbmF0aW9uCUN1cnJlbnQJQWRkcmVzcwlSZWdpc3RlciAqLworI2RlZmluZQlNRE1BMV9EMF9JUlFfU1RBVFVTCQkweEZGQzAxRjI4CS8qIE1lbURNQTEgU3RyZWFtIDAgRGVzdGluYXRpb24JSW50ZXJydXB0L1N0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZQlNRE1BMV9EMF9QRVJJUEhFUkFMX01BUAkweEZGQzAxRjJDCS8qIE1lbURNQTEgU3RyZWFtIDAgRGVzdGluYXRpb24JUGVyaXBoZXJhbCBNYXAgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQTFfRDBfQ1VSUl9YX0NPVU5UCTB4RkZDMDFGMzAJLyogTWVtRE1BMSBTdHJlYW0gMCBEZXN0aW5hdGlvbglDdXJyZW50CVggQ291bnQJUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQTFfRDBfQ1VSUl9ZX0NPVU5UCTB4RkZDMDFGMzgJLyogTWVtRE1BMSBTdHJlYW0gMCBEZXN0aW5hdGlvbglDdXJyZW50CVkgQ291bnQJUmVnaXN0ZXIgKi8KKworI2RlZmluZQlNRE1BMV9TMF9ORVhUX0RFU0NfUFRSCTB4RkZDMDFGNDAJLyogTWVtRE1BMSBTdHJlYW0gMCBTb3VyY2UgTmV4dAlEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQTFfUzBfU1RBUlRfQUREUgkJMHhGRkMwMUY0NAkvKiBNZW1ETUExIFN0cmVhbSAwIFNvdXJjZSBTdGFydCBBZGRyZXNzIFJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUExX1MwX0NPTkZJRwkJCTB4RkZDMDFGNDgJLyogTWVtRE1BMSBTdHJlYW0gMCBTb3VyY2UgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAqLworI2RlZmluZQlNRE1BMV9TMF9YX0NPVU5UCQkweEZGQzAxRjUwCS8qIE1lbURNQTEgU3RyZWFtIDAgU291cmNlIFggQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQTFfUzBfWF9NT0RJRlkJCTB4RkZDMDFGNTQJLyogTWVtRE1BMSBTdHJlYW0gMCBTb3VyY2UgWCBNb2RpZnkgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQTFfUzBfWV9DT1VOVAkJMHhGRkMwMUY1OAkvKiBNZW1ETUExIFN0cmVhbSAwIFNvdXJjZSBZIENvdW50IFJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUExX1MwX1lfTU9ESUZZCQkweEZGQzAxRjVDCS8qIE1lbURNQTEgU3RyZWFtIDAgU291cmNlIFkgTW9kaWZ5IFJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUExX1MwX0NVUlJfREVTQ19QVFIJMHhGRkMwMUY2MAkvKiBNZW1ETUExIFN0cmVhbSAwIFNvdXJjZSBDdXJyZW50IERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlciAqLworI2RlZmluZQlNRE1BMV9TMF9DVVJSX0FERFIJCTB4RkZDMDFGNjQJLyogTWVtRE1BMSBTdHJlYW0gMCBTb3VyY2UgQ3VycmVudCBBZGRyZXNzIFJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUExX1MwX0lSUV9TVEFUVVMJCTB4RkZDMDFGNjgJLyogTWVtRE1BMSBTdHJlYW0gMCBTb3VyY2UgSW50ZXJydXB0L1N0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZQlNRE1BMV9TMF9QRVJJUEhFUkFMX01BUAkweEZGQzAxRjZDCS8qIE1lbURNQTEgU3RyZWFtIDAgU291cmNlIFBlcmlwaGVyYWwgTWFwIFJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUExX1MwX0NVUlJfWF9DT1VOVAkweEZGQzAxRjcwCS8qIE1lbURNQTEgU3RyZWFtIDAgU291cmNlIEN1cnJlbnQgWCBDb3VudCBSZWdpc3RlciAqLworI2RlZmluZQlNRE1BMV9TMF9DVVJSX1lfQ09VTlQJMHhGRkMwMUY3OAkvKiBNZW1ETUExIFN0cmVhbSAwIFNvdXJjZSBDdXJyZW50IFkgQ291bnQgUmVnaXN0ZXIgKi8KKworI2RlZmluZQlNRE1BMV9EMV9ORVhUX0RFU0NfUFRSCTB4RkZDMDFGODAJLyogTWVtRE1BMSBTdHJlYW0gMSBEZXN0aW5hdGlvbglOZXh0IERlc2NyaXB0b3IJUG9pbnRlcglSZWdpc3RlciAqLworI2RlZmluZQlNRE1BMV9EMV9TVEFSVF9BRERSCQkweEZGQzAxRjg0CS8qIE1lbURNQTEgU3RyZWFtIDEgRGVzdGluYXRpb24JU3RhcnQgQWRkcmVzcyBSZWdpc3RlciAqLworI2RlZmluZQlNRE1BMV9EMV9DT05GSUcJCQkweEZGQzAxRjg4CS8qIE1lbURNQTEgU3RyZWFtIDEgRGVzdGluYXRpb24JQ29uZmlndXJhdGlvbiBSZWdpc3RlciAqLworI2RlZmluZQlNRE1BMV9EMV9YX0NPVU5UCQkweEZGQzAxRjkwCS8qIE1lbURNQTEgU3RyZWFtIDEgRGVzdGluYXRpb24JWCBDb3VudAlSZWdpc3RlciAqLworI2RlZmluZQlNRE1BMV9EMV9YX01PRElGWQkJMHhGRkMwMUY5NAkvKiBNZW1ETUExIFN0cmVhbSAxIERlc3RpbmF0aW9uCVggTW9kaWZ5IFJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUExX0QxX1lfQ09VTlQJCTB4RkZDMDFGOTgJLyogTWVtRE1BMSBTdHJlYW0gMSBEZXN0aW5hdGlvbglZIENvdW50CVJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUExX0QxX1lfTU9ESUZZCQkweEZGQzAxRjlDCS8qIE1lbURNQTEgU3RyZWFtIDEgRGVzdGluYXRpb24JWSBNb2RpZnkgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQTFfRDFfQ1VSUl9ERVNDX1BUUgkweEZGQzAxRkEwCS8qIE1lbURNQTEgU3RyZWFtIDEgRGVzdGluYXRpb24JQ3VycmVudAlEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQTFfRDFfQ1VSUl9BRERSCQkweEZGQzAxRkE0CS8qIE1lbURNQTEgU3RyZWFtIDEgRGVzdGluYXRpb24JQ3VycmVudAlBZGRyZXNzCVJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUExX0QxX0lSUV9TVEFUVVMJCTB4RkZDMDFGQTgJLyogTWVtRE1BMSBTdHJlYW0gMSBEZXN0aW5hdGlvbglJbnRlcnJ1cHQvU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUExX0QxX1BFUklQSEVSQUxfTUFQCTB4RkZDMDFGQUMJLyogTWVtRE1BMSBTdHJlYW0gMSBEZXN0aW5hdGlvbglQZXJpcGhlcmFsIE1hcCBSZWdpc3RlciAqLworI2RlZmluZQlNRE1BMV9EMV9DVVJSX1hfQ09VTlQJMHhGRkMwMUZCMAkvKiBNZW1ETUExIFN0cmVhbSAxIERlc3RpbmF0aW9uCUN1cnJlbnQJWCBDb3VudAlSZWdpc3RlciAqLworI2RlZmluZQlNRE1BMV9EMV9DVVJSX1lfQ09VTlQJMHhGRkMwMUZCOAkvKiBNZW1ETUExIFN0cmVhbSAxIERlc3RpbmF0aW9uCUN1cnJlbnQJWSBDb3VudAlSZWdpc3RlciAqLworCisjZGVmaW5lCU1ETUExX1MxX05FWFRfREVTQ19QVFIJMHhGRkMwMUZDMAkvKiBNZW1ETUExIFN0cmVhbSAxIFNvdXJjZSBOZXh0CURlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlciAqLworI2RlZmluZQlNRE1BMV9TMV9TVEFSVF9BRERSCQkweEZGQzAxRkM0CS8qIE1lbURNQTEgU3RyZWFtIDEgU291cmNlIFN0YXJ0IEFkZHJlc3MgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQTFfUzFfQ09ORklHCQkJMHhGRkMwMUZDOAkvKiBNZW1ETUExIFN0cmVhbSAxIFNvdXJjZSBDb25maWd1cmF0aW9uIFJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUExX1MxX1hfQ09VTlQJCTB4RkZDMDFGRDAJLyogTWVtRE1BMSBTdHJlYW0gMSBTb3VyY2UgWCBDb3VudCBSZWdpc3RlciAqLworI2RlZmluZQlNRE1BMV9TMV9YX01PRElGWQkJMHhGRkMwMUZENAkvKiBNZW1ETUExIFN0cmVhbSAxIFNvdXJjZSBYIE1vZGlmeSBSZWdpc3RlciAqLworI2RlZmluZQlNRE1BMV9TMV9ZX0NPVU5UCQkweEZGQzAxRkQ4CS8qIE1lbURNQTEgU3RyZWFtIDEgU291cmNlIFkgQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQTFfUzFfWV9NT0RJRlkJCTB4RkZDMDFGREMJLyogTWVtRE1BMSBTdHJlYW0gMSBTb3VyY2UgWSBNb2RpZnkgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQTFfUzFfQ1VSUl9ERVNDX1BUUgkweEZGQzAxRkUwCS8qIE1lbURNQTEgU3RyZWFtIDEgU291cmNlIEN1cnJlbnQgRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUExX1MxX0NVUlJfQUREUgkJMHhGRkMwMUZFNAkvKiBNZW1ETUExIFN0cmVhbSAxIFNvdXJjZSBDdXJyZW50IEFkZHJlc3MgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQTFfUzFfSVJRX1NUQVRVUwkJMHhGRkMwMUZFOAkvKiBNZW1ETUExIFN0cmVhbSAxIFNvdXJjZSBJbnRlcnJ1cHQvU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUExX1MxX1BFUklQSEVSQUxfTUFQCTB4RkZDMDFGRUMJLyogTWVtRE1BMSBTdHJlYW0gMSBTb3VyY2UgUGVyaXBoZXJhbCBNYXAgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTURNQTFfUzFfQ1VSUl9YX0NPVU5UCTB4RkZDMDFGRjAJLyogTWVtRE1BMSBTdHJlYW0gMSBTb3VyY2UgQ3VycmVudCBYIENvdW50IFJlZ2lzdGVyICovCisjZGVmaW5lCU1ETUExX1MxX0NVUlJfWV9DT1VOVAkweEZGQzAxRkY4CS8qIE1lbURNQTEgU3RyZWFtIDEgU291cmNlIEN1cnJlbnQgWSBDb3VudCBSZWdpc3RlciAqLworCisKKy8qIFVBUlQxIENvbnRyb2xsZXIJCSgweEZGQzAyMDAwIC0gMHhGRkMwMjBGRikJICovCisjZGVmaW5lCVVBUlQxX1RIUgkJCTB4RkZDMDIwMDAJLyogVHJhbnNtaXQgSG9sZGluZyByZWdpc3RlciAqLworI2RlZmluZQlVQVJUMV9SQlIJCQkweEZGQzAyMDAwCS8qIFJlY2VpdmUgQnVmZmVyIHJlZ2lzdGVyICovCisjZGVmaW5lCVVBUlQxX0RMTAkJCTB4RkZDMDIwMDAJLyogRGl2aXNvciBMYXRjaCAoTG93LUJ5dGUpICovCisjZGVmaW5lCVVBUlQxX0lFUgkJCTB4RkZDMDIwMDQJLyogSW50ZXJydXB0IEVuYWJsZSBSZWdpc3RlciAqLworI2RlZmluZQlVQVJUMV9ETEgJCQkweEZGQzAyMDA0CS8qIERpdmlzb3IgTGF0Y2ggKEhpZ2gtQnl0ZSkgKi8KKyNkZWZpbmUJVUFSVDFfSUlSCQkJMHhGRkMwMjAwOAkvKiBJbnRlcnJ1cHQgSWRlbnRpZmljYXRpb24gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJVUFSVDFfTENSCQkJMHhGRkMwMjAwQwkvKiBMaW5lCUNvbnRyb2wJUmVnaXN0ZXIgKi8KKyNkZWZpbmUJVUFSVDFfTUNSCQkJMHhGRkMwMjAxMAkvKiBNb2RlbSBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lCVVBUlQxX0xTUgkJCTB4RkZDMDIwMTQJLyogTGluZQlTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJVUFSVDFfU0NSCQkJMHhGRkMwMjAxQwkvKiBTQ1IgU2NyYXRjaCBSZWdpc3RlciAqLworI2RlZmluZQlVQVJUMV9HQ1RMCQkJMHhGRkMwMjAyNAkvKiBHbG9iYWwgQ29udHJvbCBSZWdpc3RlciAqLworCisKKy8qIFVBUlQyIENvbnRyb2xsZXIJCSgweEZGQzAyMTAwIC0gMHhGRkMwMjFGRikJICovCisjZGVmaW5lCVVBUlQyX1RIUgkJCTB4RkZDMDIxMDAJLyogVHJhbnNtaXQgSG9sZGluZyByZWdpc3RlciAqLworI2RlZmluZQlVQVJUMl9SQlIJCQkweEZGQzAyMTAwCS8qIFJlY2VpdmUgQnVmZmVyIHJlZ2lzdGVyICovCisjZGVmaW5lCVVBUlQyX0RMTAkJCTB4RkZDMDIxMDAJLyogRGl2aXNvciBMYXRjaCAoTG93LUJ5dGUpICovCisjZGVmaW5lCVVBUlQyX0lFUgkJCTB4RkZDMDIxMDQJLyogSW50ZXJydXB0IEVuYWJsZSBSZWdpc3RlciAqLworI2RlZmluZQlVQVJUMl9ETEgJCQkweEZGQzAyMTA0CS8qIERpdmlzb3IgTGF0Y2ggKEhpZ2gtQnl0ZSkgKi8KKyNkZWZpbmUJVUFSVDJfSUlSCQkJMHhGRkMwMjEwOAkvKiBJbnRlcnJ1cHQgSWRlbnRpZmljYXRpb24gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJVUFSVDJfTENSCQkJMHhGRkMwMjEwQwkvKiBMaW5lCUNvbnRyb2wJUmVnaXN0ZXIgKi8KKyNkZWZpbmUJVUFSVDJfTUNSCQkJMHhGRkMwMjExMAkvKiBNb2RlbSBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lCVVBUlQyX0xTUgkJCTB4RkZDMDIxMTQJLyogTGluZQlTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJVUFSVDJfU0NSCQkJMHhGRkMwMjExQwkvKiBTQ1IgU2NyYXRjaCBSZWdpc3RlciAqLworI2RlZmluZQlVQVJUMl9HQ1RMCQkJMHhGRkMwMjEyNAkvKiBHbG9iYWwgQ29udHJvbCBSZWdpc3RlciAqLworCisKKy8qIFR3by1XaXJlIEludGVyZmFjZSAxCSgweEZGQzAyMjAwIC0gMHhGRkMwMjJGRikJCQkgKi8KKyNkZWZpbmUJVFdJMV9DTEtESVYJCQkweEZGQzAyMjAwCS8qIFNlcmlhbCBDbG9jawlEaXZpZGVyCVJlZ2lzdGVyICovCisjZGVmaW5lCVRXSTFfQ09OVFJPTAkJMHhGRkMwMjIwNAkvKiBUV0kxCU1hc3RlciBJbnRlcm5hbAlUaW1lIFJlZmVyZW5jZSBSZWdpc3RlciAqLworI2RlZmluZQlUV0kxX1NMQVZFX0NUUkwJCTB4RkZDMDIyMDgJLyogU2xhdmUgTW9kZSBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lCVRXSTFfU0xBVkVfU1RBVAkJMHhGRkMwMjIwQwkvKiBTbGF2ZSBNb2RlIFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZQlUV0kxX1NMQVZFX0FERFIJCTB4RkZDMDIyMTAJLyogU2xhdmUgTW9kZSBBZGRyZXNzIFJlZ2lzdGVyICovCisjZGVmaW5lCVRXSTFfTUFTVEVSX0NUUkwJMHhGRkMwMjIxNAkvKiBNYXN0ZXIgTW9kZSBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lCVRXSTFfTUFTVEVSX1NUQVQJMHhGRkMwMjIxOAkvKiBNYXN0ZXIgTW9kZSBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJVFdJMV9NQVNURVJfQUREUgkweEZGQzAyMjFDCS8qIE1hc3RlciBNb2RlIEFkZHJlc3MgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJVFdJMV9JTlRfU1RBVAkJMHhGRkMwMjIyMAkvKiBUV0kxCU1hc3RlciBJbnRlcnJ1cHQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJVFdJMV9JTlRfTUFTSwkJMHhGRkMwMjIyNAkvKiBUV0kxCU1hc3RlciBJbnRlcnJ1cHQgTWFzayBSZWdpc3RlciAqLworI2RlZmluZQlUV0kxX0ZJRk9fQ1RSTAkJMHhGRkMwMjIyOAkvKiBGSUZPCUNvbnRyb2wJUmVnaXN0ZXIgKi8KKyNkZWZpbmUJVFdJMV9GSUZPX1NUQVQJCTB4RkZDMDIyMkMJLyogRklGTwlTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJVFdJMV9YTVRfREFUQTgJCTB4RkZDMDIyODAJLyogRklGTwlUcmFuc21pdCBEYXRhIFNpbmdsZSBCeXRlIFJlZ2lzdGVyICovCisjZGVmaW5lCVRXSTFfWE1UX0RBVEExNgkJMHhGRkMwMjI4NAkvKiBGSUZPCVRyYW5zbWl0IERhdGEgRG91YmxlIEJ5dGUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJVFdJMV9SQ1ZfREFUQTgJCTB4RkZDMDIyODgJLyogRklGTwlSZWNlaXZlCURhdGEgU2luZ2xlIEJ5dGUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJVFdJMV9SQ1ZfREFUQTE2CQkweEZGQzAyMjhDCS8qIEZJRk8JUmVjZWl2ZQlEYXRhIERvdWJsZSBCeXRlIFJlZ2lzdGVyICovCisjZGVmaW5lIFRXSTFfUkVHQkFTRQkJVFdJMV9DTEtESVYKKworCisvKiB0aGUgZm9sbG93aW5nIGFyZSBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgKi8KKyNkZWZpbmUJVFdJMV9QUkVTQ0FMRQkgIFRXSTFfQ09OVFJPTAorI2RlZmluZQlUV0kxX0lOVF9TUkMJICBUV0kxX0lOVF9TVEFUCisjZGVmaW5lCVRXSTFfSU5UX0VOQUJMRQkgIFRXSTFfSU5UX01BU0sKKworCisvKiBTUEkxCUNvbnRyb2xsZXIJCSgweEZGQzAyMzAwIC0gMHhGRkMwMjNGRikJICovCisjZGVmaW5lCVNQSTFfQ1RMCQkJMHhGRkMwMjMwMCAgLyogU1BJMSBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lCVNQSTFfRkxHCQkJMHhGRkMwMjMwNCAgLyogU1BJMSBGbGFnIHJlZ2lzdGVyICovCisjZGVmaW5lCVNQSTFfU1RBVAkJCTB4RkZDMDIzMDggIC8qIFNQSTEgU3RhdHVzIHJlZ2lzdGVyICovCisjZGVmaW5lCVNQSTFfVERCUgkJCTB4RkZDMDIzMEMgIC8qIFNQSTEgVHJhbnNtaXQgRGF0YSBCdWZmZXIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJU1BJMV9SREJSCQkJMHhGRkMwMjMxMCAgLyogU1BJMSBSZWNlaXZlIERhdGEgQnVmZmVyCVJlZ2lzdGVyICovCisjZGVmaW5lCVNQSTFfQkFVRAkJCTB4RkZDMDIzMTQgIC8qIFNQSTEgQmF1ZCByYXRlIFJlZ2lzdGVyICovCisjZGVmaW5lCVNQSTFfU0hBRE9XCQkJMHhGRkMwMjMxOCAgLyogU1BJMV9SREJSIFNoYWRvdwlSZWdpc3RlciAqLworI2RlZmluZSBTUEkxX1JFR0JBU0UJCQlTUEkxX0NUTAorCisvKiBTUEkyCUNvbnRyb2xsZXIJCSgweEZGQzAyNDAwIC0gMHhGRkMwMjRGRikJICovCisjZGVmaW5lCVNQSTJfQ1RMCQkJMHhGRkMwMjQwMCAgLyogU1BJMiBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lCVNQSTJfRkxHCQkJMHhGRkMwMjQwNCAgLyogU1BJMiBGbGFnIHJlZ2lzdGVyICovCisjZGVmaW5lCVNQSTJfU1RBVAkJCTB4RkZDMDI0MDggIC8qIFNQSTIgU3RhdHVzIHJlZ2lzdGVyICovCisjZGVmaW5lCVNQSTJfVERCUgkJCTB4RkZDMDI0MEMgIC8qIFNQSTIgVHJhbnNtaXQgRGF0YSBCdWZmZXIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJU1BJMl9SREJSCQkJMHhGRkMwMjQxMCAgLyogU1BJMiBSZWNlaXZlIERhdGEgQnVmZmVyCVJlZ2lzdGVyICovCisjZGVmaW5lCVNQSTJfQkFVRAkJCTB4RkZDMDI0MTQgIC8qIFNQSTIgQmF1ZCByYXRlIFJlZ2lzdGVyICovCisjZGVmaW5lCVNQSTJfU0hBRE9XCQkJMHhGRkMwMjQxOCAgLyogU1BJMl9SREJSIFNoYWRvdwlSZWdpc3RlciAqLworI2RlZmluZSBTUEkyX1JFR0JBU0UJCQlTUEkyX0NUTAorCisvKiBTUE9SVDIgQ29udHJvbGxlcgkJKDB4RkZDMDI1MDAgLSAweEZGQzAyNUZGKQkJCSAqLworI2RlZmluZQlTUE9SVDJfVENSMQkJCTB4RkZDMDI1MDAJLyogU1BPUlQyIFRyYW5zbWl0IENvbmZpZ3VyYXRpb24gMSBSZWdpc3RlciAqLworI2RlZmluZQlTUE9SVDJfVENSMgkJCTB4RkZDMDI1MDQJLyogU1BPUlQyIFRyYW5zbWl0IENvbmZpZ3VyYXRpb24gMiBSZWdpc3RlciAqLworI2RlZmluZQlTUE9SVDJfVENMS0RJVgkJMHhGRkMwMjUwOAkvKiBTUE9SVDIgVHJhbnNtaXQgQ2xvY2sgRGl2aWRlciAqLworI2RlZmluZQlTUE9SVDJfVEZTRElWCQkweEZGQzAyNTBDCS8qIFNQT1JUMiBUcmFuc21pdCBGcmFtZSBTeW5jIERpdmlkZXIgKi8KKyNkZWZpbmUJU1BPUlQyX1RYCQkJMHhGRkMwMjUxMAkvKiBTUE9SVDIgVFggRGF0YSBSZWdpc3RlciAqLworI2RlZmluZQlTUE9SVDJfUlgJCQkweEZGQzAyNTE4CS8qIFNQT1JUMiBSWCBEYXRhIFJlZ2lzdGVyICovCisjZGVmaW5lCVNQT1JUMl9SQ1IxCQkJMHhGRkMwMjUyMAkvKiBTUE9SVDIgVHJhbnNtaXQgQ29uZmlndXJhdGlvbiAxIFJlZ2lzdGVyICovCisjZGVmaW5lCVNQT1JUMl9SQ1IyCQkJMHhGRkMwMjUyNAkvKiBTUE9SVDIgVHJhbnNtaXQgQ29uZmlndXJhdGlvbiAyIFJlZ2lzdGVyICovCisjZGVmaW5lCVNQT1JUMl9SQ0xLRElWCQkweEZGQzAyNTI4CS8qIFNQT1JUMiBSZWNlaXZlIENsb2NrCURpdmlkZXIgKi8KKyNkZWZpbmUJU1BPUlQyX1JGU0RJVgkJMHhGRkMwMjUyQwkvKiBTUE9SVDIgUmVjZWl2ZSBGcmFtZQlTeW5jIERpdmlkZXIgKi8KKyNkZWZpbmUJU1BPUlQyX1NUQVQJCQkweEZGQzAyNTMwCS8qIFNQT1JUMiBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJU1BPUlQyX0NITkwJCQkweEZGQzAyNTM0CS8qIFNQT1JUMiBDdXJyZW50IENoYW5uZWwgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJU1BPUlQyX01DTUMxCQkweEZGQzAyNTM4CS8qIFNQT1JUMiBNdWx0aS1DaGFubmVsCUNvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgMSAqLworI2RlZmluZQlTUE9SVDJfTUNNQzIJCTB4RkZDMDI1M0MJLyogU1BPUlQyIE11bHRpLUNoYW5uZWwJQ29uZmlndXJhdGlvbiBSZWdpc3RlciAyICovCisjZGVmaW5lCVNQT1JUMl9NVENTMAkJMHhGRkMwMjU0MAkvKiBTUE9SVDIgTXVsdGktQ2hhbm5lbAlUcmFuc21pdCBTZWxlY3QJUmVnaXN0ZXIgMCAqLworI2RlZmluZQlTUE9SVDJfTVRDUzEJCTB4RkZDMDI1NDQJLyogU1BPUlQyIE11bHRpLUNoYW5uZWwJVHJhbnNtaXQgU2VsZWN0CVJlZ2lzdGVyIDEgKi8KKyNkZWZpbmUJU1BPUlQyX01UQ1MyCQkweEZGQzAyNTQ4CS8qIFNQT1JUMiBNdWx0aS1DaGFubmVsCVRyYW5zbWl0IFNlbGVjdAlSZWdpc3RlciAyICovCisjZGVmaW5lCVNQT1JUMl9NVENTMwkJMHhGRkMwMjU0QwkvKiBTUE9SVDIgTXVsdGktQ2hhbm5lbAlUcmFuc21pdCBTZWxlY3QJUmVnaXN0ZXIgMyAqLworI2RlZmluZQlTUE9SVDJfTVJDUzAJCTB4RkZDMDI1NTAJLyogU1BPUlQyIE11bHRpLUNoYW5uZWwJUmVjZWl2ZQlTZWxlY3QgUmVnaXN0ZXIJMCAqLworI2RlZmluZQlTUE9SVDJfTVJDUzEJCTB4RkZDMDI1NTQJLyogU1BPUlQyIE11bHRpLUNoYW5uZWwJUmVjZWl2ZQlTZWxlY3QgUmVnaXN0ZXIJMSAqLworI2RlZmluZQlTUE9SVDJfTVJDUzIJCTB4RkZDMDI1NTgJLyogU1BPUlQyIE11bHRpLUNoYW5uZWwJUmVjZWl2ZQlTZWxlY3QgUmVnaXN0ZXIJMiAqLworI2RlZmluZQlTUE9SVDJfTVJDUzMJCTB4RkZDMDI1NUMJLyogU1BPUlQyIE11bHRpLUNoYW5uZWwJUmVjZWl2ZQlTZWxlY3QgUmVnaXN0ZXIJMyAqLworCisKKy8qIFNQT1JUMyBDb250cm9sbGVyCQkoMHhGRkMwMjYwMCAtIDB4RkZDMDI2RkYpCQkJICovCisjZGVmaW5lCVNQT1JUM19UQ1IxCQkJMHhGRkMwMjYwMAkvKiBTUE9SVDMgVHJhbnNtaXQgQ29uZmlndXJhdGlvbiAxIFJlZ2lzdGVyICovCisjZGVmaW5lCVNQT1JUM19UQ1IyCQkJMHhGRkMwMjYwNAkvKiBTUE9SVDMgVHJhbnNtaXQgQ29uZmlndXJhdGlvbiAyIFJlZ2lzdGVyICovCisjZGVmaW5lCVNQT1JUM19UQ0xLRElWCQkweEZGQzAyNjA4CS8qIFNQT1JUMyBUcmFuc21pdCBDbG9jayBEaXZpZGVyICovCisjZGVmaW5lCVNQT1JUM19URlNESVYJCTB4RkZDMDI2MEMJLyogU1BPUlQzIFRyYW5zbWl0IEZyYW1lIFN5bmMgRGl2aWRlciAqLworI2RlZmluZQlTUE9SVDNfVFgJCQkweEZGQzAyNjEwCS8qIFNQT1JUMyBUWCBEYXRhIFJlZ2lzdGVyICovCisjZGVmaW5lCVNQT1JUM19SWAkJCTB4RkZDMDI2MTgJLyogU1BPUlQzIFJYIERhdGEgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJU1BPUlQzX1JDUjEJCQkweEZGQzAyNjIwCS8qIFNQT1JUMyBUcmFuc21pdCBDb25maWd1cmF0aW9uIDEgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJU1BPUlQzX1JDUjIJCQkweEZGQzAyNjI0CS8qIFNQT1JUMyBUcmFuc21pdCBDb25maWd1cmF0aW9uIDIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJU1BPUlQzX1JDTEtESVYJCTB4RkZDMDI2MjgJLyogU1BPUlQzIFJlY2VpdmUgQ2xvY2sJRGl2aWRlciAqLworI2RlZmluZQlTUE9SVDNfUkZTRElWCQkweEZGQzAyNjJDCS8qIFNQT1JUMyBSZWNlaXZlIEZyYW1lCVN5bmMgRGl2aWRlciAqLworI2RlZmluZQlTUE9SVDNfU1RBVAkJCTB4RkZDMDI2MzAJLyogU1BPUlQzIFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZQlTUE9SVDNfQ0hOTAkJCTB4RkZDMDI2MzQJLyogU1BPUlQzIEN1cnJlbnQgQ2hhbm5lbCBSZWdpc3RlciAqLworI2RlZmluZQlTUE9SVDNfTUNNQzEJCTB4RkZDMDI2MzgJLyogU1BPUlQzIE11bHRpLUNoYW5uZWwJQ29uZmlndXJhdGlvbiBSZWdpc3RlciAxICovCisjZGVmaW5lCVNQT1JUM19NQ01DMgkJMHhGRkMwMjYzQwkvKiBTUE9SVDMgTXVsdGktQ2hhbm5lbAlDb25maWd1cmF0aW9uIFJlZ2lzdGVyIDIgKi8KKyNkZWZpbmUJU1BPUlQzX01UQ1MwCQkweEZGQzAyNjQwCS8qIFNQT1JUMyBNdWx0aS1DaGFubmVsCVRyYW5zbWl0IFNlbGVjdAlSZWdpc3RlciAwICovCisjZGVmaW5lCVNQT1JUM19NVENTMQkJMHhGRkMwMjY0NAkvKiBTUE9SVDMgTXVsdGktQ2hhbm5lbAlUcmFuc21pdCBTZWxlY3QJUmVnaXN0ZXIgMSAqLworI2RlZmluZQlTUE9SVDNfTVRDUzIJCTB4RkZDMDI2NDgJLyogU1BPUlQzIE11bHRpLUNoYW5uZWwJVHJhbnNtaXQgU2VsZWN0CVJlZ2lzdGVyIDIgKi8KKyNkZWZpbmUJU1BPUlQzX01UQ1MzCQkweEZGQzAyNjRDCS8qIFNQT1JUMyBNdWx0aS1DaGFubmVsCVRyYW5zbWl0IFNlbGVjdAlSZWdpc3RlciAzICovCisjZGVmaW5lCVNQT1JUM19NUkNTMAkJMHhGRkMwMjY1MAkvKiBTUE9SVDMgTXVsdGktQ2hhbm5lbAlSZWNlaXZlCVNlbGVjdCBSZWdpc3RlcgkwICovCisjZGVmaW5lCVNQT1JUM19NUkNTMQkJMHhGRkMwMjY1NAkvKiBTUE9SVDMgTXVsdGktQ2hhbm5lbAlSZWNlaXZlCVNlbGVjdCBSZWdpc3RlcgkxICovCisjZGVmaW5lCVNQT1JUM19NUkNTMgkJMHhGRkMwMjY1OAkvKiBTUE9SVDMgTXVsdGktQ2hhbm5lbAlSZWNlaXZlCVNlbGVjdCBSZWdpc3RlcgkyICovCisjZGVmaW5lCVNQT1JUM19NUkNTMwkJMHhGRkMwMjY1QwkvKiBTUE9SVDMgTXVsdGktQ2hhbm5lbAlSZWNlaXZlCVNlbGVjdCBSZWdpc3RlcgkzICovCisKKworLyogTWVkaWEgVHJhbnNjZWl2ZXIgKE1YVlIpICAgKDB4RkZDMDI3MDAgLSAweEZGQzAyOEZGKSAqLworCisjZGVmaW5lCU1YVlJfQ09ORklHCSAgICAgIDB4RkZDMDI3MDAgIC8qIE1YVlIgQ29uZmlndXJhdGlvbglSZWdpc3RlciAqLworI2RlZmluZQlNWFZSX1BMTF9DVExfMAkgICAgICAweEZGQzAyNzA0ICAvKiBNWFZSIFBoYXNlCUxvY2sgTG9vcCBDb250cm9sIFJlZ2lzdGVyIDAgKi8KKworI2RlZmluZQlNWFZSX1NUQVRFXzAJICAgICAgMHhGRkMwMjcwOCAgLyogTVhWUiBTdGF0ZQlSZWdpc3RlciAwICovCisjZGVmaW5lCU1YVlJfU1RBVEVfMQkgICAgICAweEZGQzAyNzBDICAvKiBNWFZSIFN0YXRlCVJlZ2lzdGVyIDEgKi8KKworI2RlZmluZQlNWFZSX0lOVF9TVEFUXzAJICAgICAgMHhGRkMwMjcxMCAgLyogTVhWUiBJbnRlcnJ1cHQgU3RhdHVzIFJlZ2lzdGVyIDAgKi8KKyNkZWZpbmUJTVhWUl9JTlRfU1RBVF8xCSAgICAgIDB4RkZDMDI3MTQgIC8qIE1YVlIgSW50ZXJydXB0IFN0YXR1cyBSZWdpc3RlciAxICovCisKKyNkZWZpbmUJTVhWUl9JTlRfRU5fMAkgICAgICAweEZGQzAyNzE4ICAvKiBNWFZSIEludGVycnVwdCBFbmFibGUgUmVnaXN0ZXIgMCAqLworI2RlZmluZQlNWFZSX0lOVF9FTl8xCSAgICAgIDB4RkZDMDI3MUMgIC8qIE1YVlIgSW50ZXJydXB0IEVuYWJsZSBSZWdpc3RlciAxICovCisKKyNkZWZpbmUJTVhWUl9QT1NJVElPTgkgICAgICAweEZGQzAyNzIwICAvKiBNWFZSIE5vZGUgUG9zaXRpb24JUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTVhWUl9NQVhfUE9TSVRJT04gICAgIDB4RkZDMDI3MjQgIC8qIE1YVlIgTWF4aW11bSBOb2RlIFBvc2l0aW9uCVJlZ2lzdGVyICovCisKKyNkZWZpbmUJTVhWUl9ERUxBWQkgICAgICAweEZGQzAyNzI4ICAvKiBNWFZSIE5vZGUgRnJhbWUgRGVsYXkgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTVhWUl9NQVhfREVMQVkJICAgICAgMHhGRkMwMjcyQyAgLyogTVhWUiBNYXhpbXVtIE5vZGUgRnJhbWUgRGVsYXkgUmVnaXN0ZXIgKi8KKworI2RlZmluZQlNWFZSX0xBRERSCSAgICAgIDB4RkZDMDI3MzAgIC8qIE1YVlIgTG9naWNhbCBBZGRyZXNzIFJlZ2lzdGVyICovCisjZGVmaW5lCU1YVlJfR0FERFIJICAgICAgMHhGRkMwMjczNCAgLyogTVhWUiBHcm91cAlBZGRyZXNzCVJlZ2lzdGVyICovCisjZGVmaW5lCU1YVlJfQUFERFIJICAgICAgMHhGRkMwMjczOCAgLyogTVhWUiBBbHRlcm5hdGUgQWRkcmVzcyBSZWdpc3RlciAqLworCisjZGVmaW5lCU1YVlJfQUxMT0NfMAkgICAgICAweEZGQzAyNzNDICAvKiBNWFZSIEFsbG9jYXRpb24gVGFibGUgUmVnaXN0ZXIgMCAqLworI2RlZmluZQlNWFZSX0FMTE9DXzEJICAgICAgMHhGRkMwMjc0MCAgLyogTVhWUiBBbGxvY2F0aW9uIFRhYmxlIFJlZ2lzdGVyIDEgKi8KKyNkZWZpbmUJTVhWUl9BTExPQ18yCSAgICAgIDB4RkZDMDI3NDQgIC8qIE1YVlIgQWxsb2NhdGlvbiBUYWJsZSBSZWdpc3RlciAyICovCisjZGVmaW5lCU1YVlJfQUxMT0NfMwkgICAgICAweEZGQzAyNzQ4ICAvKiBNWFZSIEFsbG9jYXRpb24gVGFibGUgUmVnaXN0ZXIgMyAqLworI2RlZmluZQlNWFZSX0FMTE9DXzQJICAgICAgMHhGRkMwMjc0QyAgLyogTVhWUiBBbGxvY2F0aW9uIFRhYmxlIFJlZ2lzdGVyIDQgKi8KKyNkZWZpbmUJTVhWUl9BTExPQ181CSAgICAgIDB4RkZDMDI3NTAgIC8qIE1YVlIgQWxsb2NhdGlvbiBUYWJsZSBSZWdpc3RlciA1ICovCisjZGVmaW5lCU1YVlJfQUxMT0NfNgkgICAgICAweEZGQzAyNzU0ICAvKiBNWFZSIEFsbG9jYXRpb24gVGFibGUgUmVnaXN0ZXIgNiAqLworI2RlZmluZQlNWFZSX0FMTE9DXzcJICAgICAgMHhGRkMwMjc1OCAgLyogTVhWUiBBbGxvY2F0aW9uIFRhYmxlIFJlZ2lzdGVyIDcgKi8KKyNkZWZpbmUJTVhWUl9BTExPQ184CSAgICAgIDB4RkZDMDI3NUMgIC8qIE1YVlIgQWxsb2NhdGlvbiBUYWJsZSBSZWdpc3RlciA4ICovCisjZGVmaW5lCU1YVlJfQUxMT0NfOQkgICAgICAweEZGQzAyNzYwICAvKiBNWFZSIEFsbG9jYXRpb24gVGFibGUgUmVnaXN0ZXIgOSAqLworI2RlZmluZQlNWFZSX0FMTE9DXzEwCSAgICAgIDB4RkZDMDI3NjQgIC8qIE1YVlIgQWxsb2NhdGlvbiBUYWJsZSBSZWdpc3RlciAxMCAqLworI2RlZmluZQlNWFZSX0FMTE9DXzExCSAgICAgIDB4RkZDMDI3NjggIC8qIE1YVlIgQWxsb2NhdGlvbiBUYWJsZSBSZWdpc3RlciAxMSAqLworI2RlZmluZQlNWFZSX0FMTE9DXzEyCSAgICAgIDB4RkZDMDI3NkMgIC8qIE1YVlIgQWxsb2NhdGlvbiBUYWJsZSBSZWdpc3RlciAxMiAqLworI2RlZmluZQlNWFZSX0FMTE9DXzEzCSAgICAgIDB4RkZDMDI3NzAgIC8qIE1YVlIgQWxsb2NhdGlvbiBUYWJsZSBSZWdpc3RlciAxMyAqLworI2RlZmluZQlNWFZSX0FMTE9DXzE0CSAgICAgIDB4RkZDMDI3NzQgIC8qIE1YVlIgQWxsb2NhdGlvbiBUYWJsZSBSZWdpc3RlciAxNCAqLworCisjZGVmaW5lCU1YVlJfU1lOQ19MQ0hBTl8wICAgICAweEZGQzAyNzc4ICAvKiBNWFZSIFN5bmMgRGF0YSBMb2dpY2FsIENoYW5uZWwgQXNzaWduIFJlZ2lzdGVyIDAgKi8KKyNkZWZpbmUJTVhWUl9TWU5DX0xDSEFOXzEgICAgIDB4RkZDMDI3N0MgIC8qIE1YVlIgU3luYyBEYXRhIExvZ2ljYWwgQ2hhbm5lbCBBc3NpZ24gUmVnaXN0ZXIgMSAqLworI2RlZmluZQlNWFZSX1NZTkNfTENIQU5fMiAgICAgMHhGRkMwMjc4MCAgLyogTVhWUiBTeW5jIERhdGEgTG9naWNhbCBDaGFubmVsIEFzc2lnbiBSZWdpc3RlciAyICovCisjZGVmaW5lCU1YVlJfU1lOQ19MQ0hBTl8zICAgICAweEZGQzAyNzg0ICAvKiBNWFZSIFN5bmMgRGF0YSBMb2dpY2FsIENoYW5uZWwgQXNzaWduIFJlZ2lzdGVyIDMgKi8KKyNkZWZpbmUJTVhWUl9TWU5DX0xDSEFOXzQgICAgIDB4RkZDMDI3ODggIC8qIE1YVlIgU3luYyBEYXRhIExvZ2ljYWwgQ2hhbm5lbCBBc3NpZ24gUmVnaXN0ZXIgNCAqLworI2RlZmluZQlNWFZSX1NZTkNfTENIQU5fNSAgICAgMHhGRkMwMjc4QyAgLyogTVhWUiBTeW5jIERhdGEgTG9naWNhbCBDaGFubmVsIEFzc2lnbiBSZWdpc3RlciA1ICovCisjZGVmaW5lCU1YVlJfU1lOQ19MQ0hBTl82ICAgICAweEZGQzAyNzkwICAvKiBNWFZSIFN5bmMgRGF0YSBMb2dpY2FsIENoYW5uZWwgQXNzaWduIFJlZ2lzdGVyIDYgKi8KKyNkZWZpbmUJTVhWUl9TWU5DX0xDSEFOXzcgICAgIDB4RkZDMDI3OTQgIC8qIE1YVlIgU3luYyBEYXRhIExvZ2ljYWwgQ2hhbm5lbCBBc3NpZ24gUmVnaXN0ZXIgNyAqLworCisjZGVmaW5lCU1YVlJfRE1BMF9DT05GSUcgICAgICAweEZGQzAyNzk4ICAvKiBNWFZSIFN5bmMgRGF0YSBETUEwIENvbmZpZwlSZWdpc3RlciAqLworI2RlZmluZQlNWFZSX0RNQTBfU1RBUlRfQUREUiAgMHhGRkMwMjc5QyAgLyogTVhWUiBTeW5jIERhdGEgRE1BMCBTdGFydCBBZGRyZXNzIFJlZ2lzdGVyICovCisjZGVmaW5lCU1YVlJfRE1BMF9DT1VOVAkgICAgICAweEZGQzAyN0EwICAvKiBNWFZSIFN5bmMgRGF0YSBETUEwIExvb3AgQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTVhWUl9ETUEwX0NVUlJfQUREUiAgIDB4RkZDMDI3QTQgIC8qIE1YVlIgU3luYyBEYXRhIERNQTAgQ3VycmVudCBBZGRyZXNzIFJlZ2lzdGVyICovCisjZGVmaW5lCU1YVlJfRE1BMF9DVVJSX0NPVU5UICAweEZGQzAyN0E4ICAvKiBNWFZSIFN5bmMgRGF0YSBETUEwIEN1cnJlbnQgTG9vcCBDb3VudCBSZWdpc3RlciAqLworCisjZGVmaW5lCU1YVlJfRE1BMV9DT05GSUcgICAgICAweEZGQzAyN0FDICAvKiBNWFZSIFN5bmMgRGF0YSBETUExIENvbmZpZwlSZWdpc3RlciAqLworI2RlZmluZQlNWFZSX0RNQTFfU1RBUlRfQUREUiAgMHhGRkMwMjdCMCAgLyogTVhWUiBTeW5jIERhdGEgRE1BMSBTdGFydCBBZGRyZXNzIFJlZ2lzdGVyICovCisjZGVmaW5lCU1YVlJfRE1BMV9DT1VOVAkgICAgICAweEZGQzAyN0I0ICAvKiBNWFZSIFN5bmMgRGF0YSBETUExIExvb3AgQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTVhWUl9ETUExX0NVUlJfQUREUiAgIDB4RkZDMDI3QjggIC8qIE1YVlIgU3luYyBEYXRhIERNQTEgQ3VycmVudCBBZGRyZXNzIFJlZ2lzdGVyICovCisjZGVmaW5lCU1YVlJfRE1BMV9DVVJSX0NPVU5UICAweEZGQzAyN0JDICAvKiBNWFZSIFN5bmMgRGF0YSBETUExIEN1cnJlbnQgTG9vcCBDb3VudCBSZWdpc3RlciAqLworCisjZGVmaW5lCU1YVlJfRE1BMl9DT05GSUcgICAgICAweEZGQzAyN0MwICAvKiBNWFZSIFN5bmMgRGF0YSBETUEyIENvbmZpZwlSZWdpc3RlciAqLworI2RlZmluZQlNWFZSX0RNQTJfU1RBUlRfQUREUiAgMHhGRkMwMjdDNCAgLyogTVhWUiBTeW5jIERhdGEgRE1BMiBTdGFydCBBZGRyZXNzIFJlZ2lzdGVyICovCisjZGVmaW5lCU1YVlJfRE1BMl9DT1VOVAkgICAgICAweEZGQzAyN0M4ICAvKiBNWFZSIFN5bmMgRGF0YSBETUEyIExvb3AgQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTVhWUl9ETUEyX0NVUlJfQUREUiAgIDB4RkZDMDI3Q0MgIC8qIE1YVlIgU3luYyBEYXRhIERNQTIgQ3VycmVudCBBZGRyZXNzIFJlZ2lzdGVyICovCisjZGVmaW5lCU1YVlJfRE1BMl9DVVJSX0NPVU5UICAweEZGQzAyN0QwICAvKiBNWFZSIFN5bmMgRGF0YSBETUEyIEN1cnJlbnQgTG9vcCBDb3VudCBSZWdpc3RlciAqLworCisjZGVmaW5lCU1YVlJfRE1BM19DT05GSUcgICAgICAweEZGQzAyN0Q0ICAvKiBNWFZSIFN5bmMgRGF0YSBETUEzIENvbmZpZwlSZWdpc3RlciAqLworI2RlZmluZQlNWFZSX0RNQTNfU1RBUlRfQUREUiAgMHhGRkMwMjdEOCAgLyogTVhWUiBTeW5jIERhdGEgRE1BMyBTdGFydCBBZGRyZXNzIFJlZ2lzdGVyICovCisjZGVmaW5lCU1YVlJfRE1BM19DT1VOVAkgICAgICAweEZGQzAyN0RDICAvKiBNWFZSIFN5bmMgRGF0YSBETUEzIExvb3AgQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTVhWUl9ETUEzX0NVUlJfQUREUiAgIDB4RkZDMDI3RTAgIC8qIE1YVlIgU3luYyBEYXRhIERNQTMgQ3VycmVudCBBZGRyZXNzIFJlZ2lzdGVyICovCisjZGVmaW5lCU1YVlJfRE1BM19DVVJSX0NPVU5UICAweEZGQzAyN0U0ICAvKiBNWFZSIFN5bmMgRGF0YSBETUEzIEN1cnJlbnQgTG9vcCBDb3VudCBSZWdpc3RlciAqLworCisjZGVmaW5lCU1YVlJfRE1BNF9DT05GSUcgICAgICAweEZGQzAyN0U4ICAvKiBNWFZSIFN5bmMgRGF0YSBETUE0IENvbmZpZwlSZWdpc3RlciAqLworI2RlZmluZQlNWFZSX0RNQTRfU1RBUlRfQUREUiAgMHhGRkMwMjdFQyAgLyogTVhWUiBTeW5jIERhdGEgRE1BNCBTdGFydCBBZGRyZXNzIFJlZ2lzdGVyICovCisjZGVmaW5lCU1YVlJfRE1BNF9DT1VOVAkgICAgICAweEZGQzAyN0YwICAvKiBNWFZSIFN5bmMgRGF0YSBETUE0IExvb3AgQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTVhWUl9ETUE0X0NVUlJfQUREUiAgIDB4RkZDMDI3RjQgIC8qIE1YVlIgU3luYyBEYXRhIERNQTQgQ3VycmVudCBBZGRyZXNzIFJlZ2lzdGVyICovCisjZGVmaW5lCU1YVlJfRE1BNF9DVVJSX0NPVU5UICAweEZGQzAyN0Y4ICAvKiBNWFZSIFN5bmMgRGF0YSBETUE0IEN1cnJlbnQgTG9vcCBDb3VudCBSZWdpc3RlciAqLworCisjZGVmaW5lCU1YVlJfRE1BNV9DT05GSUcgICAgICAweEZGQzAyN0ZDICAvKiBNWFZSIFN5bmMgRGF0YSBETUE1IENvbmZpZwlSZWdpc3RlciAqLworI2RlZmluZQlNWFZSX0RNQTVfU1RBUlRfQUREUiAgMHhGRkMwMjgwMCAgLyogTVhWUiBTeW5jIERhdGEgRE1BNSBTdGFydCBBZGRyZXNzIFJlZ2lzdGVyICovCisjZGVmaW5lCU1YVlJfRE1BNV9DT1VOVAkgICAgICAweEZGQzAyODA0ICAvKiBNWFZSIFN5bmMgRGF0YSBETUE1IExvb3AgQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTVhWUl9ETUE1X0NVUlJfQUREUiAgIDB4RkZDMDI4MDggIC8qIE1YVlIgU3luYyBEYXRhIERNQTUgQ3VycmVudCBBZGRyZXNzIFJlZ2lzdGVyICovCisjZGVmaW5lCU1YVlJfRE1BNV9DVVJSX0NPVU5UICAweEZGQzAyODBDICAvKiBNWFZSIFN5bmMgRGF0YSBETUE1IEN1cnJlbnQgTG9vcCBDb3VudCBSZWdpc3RlciAqLworCisjZGVmaW5lCU1YVlJfRE1BNl9DT05GSUcgICAgICAweEZGQzAyODEwICAvKiBNWFZSIFN5bmMgRGF0YSBETUE2IENvbmZpZwlSZWdpc3RlciAqLworI2RlZmluZQlNWFZSX0RNQTZfU1RBUlRfQUREUiAgMHhGRkMwMjgxNCAgLyogTVhWUiBTeW5jIERhdGEgRE1BNiBTdGFydCBBZGRyZXNzIFJlZ2lzdGVyICovCisjZGVmaW5lCU1YVlJfRE1BNl9DT1VOVAkgICAgICAweEZGQzAyODE4ICAvKiBNWFZSIFN5bmMgRGF0YSBETUE2IExvb3AgQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTVhWUl9ETUE2X0NVUlJfQUREUiAgIDB4RkZDMDI4MUMgIC8qIE1YVlIgU3luYyBEYXRhIERNQTYgQ3VycmVudCBBZGRyZXNzIFJlZ2lzdGVyICovCisjZGVmaW5lCU1YVlJfRE1BNl9DVVJSX0NPVU5UICAweEZGQzAyODIwICAvKiBNWFZSIFN5bmMgRGF0YSBETUE2IEN1cnJlbnQgTG9vcCBDb3VudCBSZWdpc3RlciAqLworCisjZGVmaW5lCU1YVlJfRE1BN19DT05GSUcgICAgICAweEZGQzAyODI0ICAvKiBNWFZSIFN5bmMgRGF0YSBETUE3IENvbmZpZwlSZWdpc3RlciAqLworI2RlZmluZQlNWFZSX0RNQTdfU1RBUlRfQUREUiAgMHhGRkMwMjgyOCAgLyogTVhWUiBTeW5jIERhdGEgRE1BNyBTdGFydCBBZGRyZXNzIFJlZ2lzdGVyICovCisjZGVmaW5lCU1YVlJfRE1BN19DT1VOVAkgICAgICAweEZGQzAyODJDICAvKiBNWFZSIFN5bmMgRGF0YSBETUE3IExvb3AgQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTVhWUl9ETUE3X0NVUlJfQUREUiAgIDB4RkZDMDI4MzAgIC8qIE1YVlIgU3luYyBEYXRhIERNQTcgQ3VycmVudCBBZGRyZXNzIFJlZ2lzdGVyICovCisjZGVmaW5lCU1YVlJfRE1BN19DVVJSX0NPVU5UICAweEZGQzAyODM0ICAvKiBNWFZSIFN5bmMgRGF0YSBETUE3IEN1cnJlbnQgTG9vcCBDb3VudCBSZWdpc3RlciAqLworCisjZGVmaW5lCU1YVlJfQVBfQ1RMCSAgICAgIDB4RkZDMDI4MzggIC8qIE1YVlIgQXN5bmMJUGFja2V0IENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTVhWUl9BUFJCX1NUQVJUX0FERFIgIDB4RkZDMDI4M0MgIC8qIE1YVlIgQXN5bmMJUGFja2V0IFJYIEJ1ZmZlciBTdGFydCBBZGRyIFJlZ2lzdGVyICovCisjZGVmaW5lCU1YVlJfQVBSQl9DVVJSX0FERFIgICAweEZGQzAyODQwICAvKiBNWFZSIEFzeW5jCVBhY2tldCBSWCBCdWZmZXIgQ3VycmVudCBBZGRyIFJlZ2lzdGVyICovCisjZGVmaW5lCU1YVlJfQVBUQl9TVEFSVF9BRERSICAweEZGQzAyODQ0ICAvKiBNWFZSIEFzeW5jCVBhY2tldCBUWCBCdWZmZXIgU3RhcnQgQWRkciBSZWdpc3RlciAqLworI2RlZmluZQlNWFZSX0FQVEJfQ1VSUl9BRERSICAgMHhGRkMwMjg0OCAgLyogTVhWUiBBc3luYwlQYWNrZXQgVFggQnVmZmVyIEN1cnJlbnQgQWRkciBSZWdpc3RlciAqLworCisjZGVmaW5lCU1YVlJfQ01fQ1RMCSAgICAgIDB4RkZDMDI4NEMgIC8qIE1YVlIgQ29udHJvbCBNZXNzYWdlIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTVhWUl9DTVJCX1NUQVJUX0FERFIgIDB4RkZDMDI4NTAgIC8qIE1YVlIgQ29udHJvbCBNZXNzYWdlIFJYIEJ1ZmZlciBTdGFydCBBZGRyIFJlZ2lzdGVyICovCisjZGVmaW5lCU1YVlJfQ01SQl9DVVJSX0FERFIgICAweEZGQzAyODU0ICAvKiBNWFZSIENvbnRyb2wgTWVzc2FnZSBSWCBCdWZmZXIgQ3VycmVudCBBZGRyZXNzICovCisjZGVmaW5lCU1YVlJfQ01UQl9TVEFSVF9BRERSICAweEZGQzAyODU4ICAvKiBNWFZSIENvbnRyb2wgTWVzc2FnZSBUWCBCdWZmZXIgU3RhcnQgQWRkciBSZWdpc3RlciAqLworI2RlZmluZQlNWFZSX0NNVEJfQ1VSUl9BRERSICAgMHhGRkMwMjg1QyAgLyogTVhWUiBDb250cm9sIE1lc3NhZ2UgVFggQnVmZmVyIEN1cnJlbnQgQWRkcmVzcyAqLworCisjZGVmaW5lCU1YVlJfUlJEQl9TVEFSVF9BRERSICAweEZGQzAyODYwICAvKiBNWFZSIFJlbW90ZSBSZWFkIEJ1ZmZlciBTdGFydCBBZGRyCVJlZ2lzdGVyICovCisjZGVmaW5lCU1YVlJfUlJEQl9DVVJSX0FERFIgICAweEZGQzAyODY0ICAvKiBNWFZSIFJlbW90ZSBSZWFkIEJ1ZmZlciBDdXJyZW50IEFkZHIgUmVnaXN0ZXIgKi8KKworI2RlZmluZQlNWFZSX1BBVF9EQVRBXzAJICAgICAgMHhGRkMwMjg2OCAgLyogTVhWUiBQYXR0ZXJuIERhdGEgUmVnaXN0ZXIJMCAqLworI2RlZmluZQlNWFZSX1BBVF9FTl8wCSAgICAgIDB4RkZDMDI4NkMgIC8qIE1YVlIgUGF0dGVybiBFbmFibGUgUmVnaXN0ZXIgMCAqLworI2RlZmluZQlNWFZSX1BBVF9EQVRBXzEJICAgICAgMHhGRkMwMjg3MCAgLyogTVhWUiBQYXR0ZXJuIERhdGEgUmVnaXN0ZXIJMSAqLworI2RlZmluZQlNWFZSX1BBVF9FTl8xCSAgICAgIDB4RkZDMDI4NzQgIC8qIE1YVlIgUGF0dGVybiBFbmFibGUgUmVnaXN0ZXIgMSAqLworCisjZGVmaW5lCU1YVlJfRlJBTUVfQ05UXzAgICAgICAweEZGQzAyODc4ICAvKiBNWFZSIEZyYW1lCUNvdW50ZXIJMCAqLworI2RlZmluZQlNWFZSX0ZSQU1FX0NOVF8xICAgICAgMHhGRkMwMjg3QyAgLyogTVhWUiBGcmFtZQlDb3VudGVyCTEgKi8KKworI2RlZmluZQlNWFZSX1JPVVRJTkdfMAkgICAgICAweEZGQzAyODgwICAvKiBNWFZSIFJvdXRpbmcgVGFibGUJUmVnaXN0ZXIgMCAqLworI2RlZmluZQlNWFZSX1JPVVRJTkdfMQkgICAgICAweEZGQzAyODg0ICAvKiBNWFZSIFJvdXRpbmcgVGFibGUJUmVnaXN0ZXIgMSAqLworI2RlZmluZQlNWFZSX1JPVVRJTkdfMgkgICAgICAweEZGQzAyODg4ICAvKiBNWFZSIFJvdXRpbmcgVGFibGUJUmVnaXN0ZXIgMiAqLworI2RlZmluZQlNWFZSX1JPVVRJTkdfMwkgICAgICAweEZGQzAyODhDICAvKiBNWFZSIFJvdXRpbmcgVGFibGUJUmVnaXN0ZXIgMyAqLworI2RlZmluZQlNWFZSX1JPVVRJTkdfNAkgICAgICAweEZGQzAyODkwICAvKiBNWFZSIFJvdXRpbmcgVGFibGUJUmVnaXN0ZXIgNCAqLworI2RlZmluZQlNWFZSX1JPVVRJTkdfNQkgICAgICAweEZGQzAyODk0ICAvKiBNWFZSIFJvdXRpbmcgVGFibGUJUmVnaXN0ZXIgNSAqLworI2RlZmluZQlNWFZSX1JPVVRJTkdfNgkgICAgICAweEZGQzAyODk4ICAvKiBNWFZSIFJvdXRpbmcgVGFibGUJUmVnaXN0ZXIgNiAqLworI2RlZmluZQlNWFZSX1JPVVRJTkdfNwkgICAgICAweEZGQzAyODlDICAvKiBNWFZSIFJvdXRpbmcgVGFibGUJUmVnaXN0ZXIgNyAqLworI2RlZmluZQlNWFZSX1JPVVRJTkdfOAkgICAgICAweEZGQzAyOEEwICAvKiBNWFZSIFJvdXRpbmcgVGFibGUJUmVnaXN0ZXIgOCAqLworI2RlZmluZQlNWFZSX1JPVVRJTkdfOQkgICAgICAweEZGQzAyOEE0ICAvKiBNWFZSIFJvdXRpbmcgVGFibGUJUmVnaXN0ZXIgOSAqLworI2RlZmluZQlNWFZSX1JPVVRJTkdfMTAJICAgICAgMHhGRkMwMjhBOCAgLyogTVhWUiBSb3V0aW5nIFRhYmxlCVJlZ2lzdGVyIDEwICovCisjZGVmaW5lCU1YVlJfUk9VVElOR18xMQkgICAgICAweEZGQzAyOEFDICAvKiBNWFZSIFJvdXRpbmcgVGFibGUJUmVnaXN0ZXIgMTEgKi8KKyNkZWZpbmUJTVhWUl9ST1VUSU5HXzEyCSAgICAgIDB4RkZDMDI4QjAgIC8qIE1YVlIgUm91dGluZyBUYWJsZQlSZWdpc3RlciAxMiAqLworI2RlZmluZQlNWFZSX1JPVVRJTkdfMTMJICAgICAgMHhGRkMwMjhCNCAgLyogTVhWUiBSb3V0aW5nIFRhYmxlCVJlZ2lzdGVyIDEzICovCisjZGVmaW5lCU1YVlJfUk9VVElOR18xNAkgICAgICAweEZGQzAyOEI4ICAvKiBNWFZSIFJvdXRpbmcgVGFibGUJUmVnaXN0ZXIgMTQgKi8KKworI2RlZmluZQlNWFZSX1BMTF9DVExfMQkgICAgICAweEZGQzAyOEJDICAvKiBNWFZSIFBoYXNlCUxvY2sgTG9vcCBDb250cm9sIFJlZ2lzdGVyIDEgKi8KKyNkZWZpbmUJTVhWUl9CTE9DS19DTlQJICAgICAgMHhGRkMwMjhDMCAgLyogTVhWUiBCbG9jawlDb3VudGVyICovCisjZGVmaW5lCU1YVlJfUExMX0NUTF8yCSAgICAgIDB4RkZDMDI4QzQgIC8qIE1YVlIgUGhhc2UJTG9jayBMb29wIENvbnRyb2wgUmVnaXN0ZXIgMiAqLworCisKKy8qIENBTiBDb250cm9sbGVyCQkoMHhGRkMwMkEwMCAtIDB4RkZDMDJGRkYpCQkJCSAqLworLyogRm9yIE1haWxib3hlcyAwLTE1CQkJCQkJCQkJCQkgKi8KKyNkZWZpbmUJQ0FOX01DMQkJCQkweEZGQzAyQTAwCS8qIE1haWxib3ggY29uZmlnIHJlZyAxCSAqLworI2RlZmluZQlDQU5fTUQxCQkJCTB4RkZDMDJBMDQJLyogTWFpbGJveCBkaXJlY3Rpb24gcmVnIDEgKi8KKyNkZWZpbmUJQ0FOX1RSUzEJCQkweEZGQzAyQTA4CS8qIFRyYW5zbWl0IFJlcXVlc3QgU2V0CXJlZyAxICovCisjZGVmaW5lCUNBTl9UUlIxCQkJMHhGRkMwMkEwQwkvKiBUcmFuc21pdCBSZXF1ZXN0IFJlc2V0IHJlZyAxICovCisjZGVmaW5lCUNBTl9UQTEJCQkJMHhGRkMwMkExMAkvKiBUcmFuc21pdCBBY2tub3dsZWRnZQlyZWcgMSAqLworI2RlZmluZQlDQU5fQUExCQkJCTB4RkZDMDJBMTQJLyogVHJhbnNtaXQgQWJvcnQgQWNrbm93bGVkZ2UgcmVnIDEgKi8KKyNkZWZpbmUJQ0FOX1JNUDEJCQkweEZGQzAyQTE4CS8qIFJlY2VpdmUgTWVzc2FnZSBQZW5kaW5nIHJlZyAxICovCisjZGVmaW5lCUNBTl9STUwxCQkJMHhGRkMwMkExQwkvKiBSZWNlaXZlIE1lc3NhZ2UgTG9zdAlyZWcgMSAqLworI2RlZmluZQlDQU5fTUJUSUYxCQkJMHhGRkMwMkEyMAkvKiBNYWlsYm94IFRyYW5zbWl0IEludGVycnVwdCBGbGFnIHJlZyAxICovCisjZGVmaW5lCUNBTl9NQlJJRjEJCQkweEZGQzAyQTI0CS8qIE1haWxib3ggUmVjZWl2ZSAgSW50ZXJydXB0IEZsYWcgcmVnIDEgKi8KKyNkZWZpbmUJQ0FOX01CSU0xCQkJMHhGRkMwMkEyOAkvKiBNYWlsYm94IEludGVycnVwdCBNYXNrIHJlZyAxICovCisjZGVmaW5lCUNBTl9SRkgxCQkJMHhGRkMwMkEyQwkvKiBSZW1vdGUgRnJhbWUJSGFuZGxpbmcgcmVnIDEgKi8KKyNkZWZpbmUJQ0FOX09QU1MxCQkJMHhGRkMwMkEzMAkvKiBPdmVyd3JpdGUgUHJvdGVjdGlvbglTaW5nbGUgU2hvdCBYbWlzc2lvbiByZWcgMSAqLworCisvKiBGb3IgTWFpbGJveGVzIDE2LTMxCQkJCQkJCQkJCQkgKi8KKyNkZWZpbmUJQ0FOX01DMgkJCQkweEZGQzAyQTQwCS8qIE1haWxib3ggY29uZmlnIHJlZyAyCSAqLworI2RlZmluZQlDQU5fTUQyCQkJCTB4RkZDMDJBNDQJLyogTWFpbGJveCBkaXJlY3Rpb24gcmVnIDIgKi8KKyNkZWZpbmUJQ0FOX1RSUzIJCQkweEZGQzAyQTQ4CS8qIFRyYW5zbWl0IFJlcXVlc3QgU2V0CXJlZyAyICovCisjZGVmaW5lCUNBTl9UUlIyCQkJMHhGRkMwMkE0QwkvKiBUcmFuc21pdCBSZXF1ZXN0IFJlc2V0IHJlZyAyICovCisjZGVmaW5lCUNBTl9UQTIJCQkJMHhGRkMwMkE1MAkvKiBUcmFuc21pdCBBY2tub3dsZWRnZQlyZWcgMiAqLworI2RlZmluZQlDQU5fQUEyCQkJCTB4RkZDMDJBNTQJLyogVHJhbnNtaXQgQWJvcnQgQWNrbm93bGVkZ2UgcmVnIDIgKi8KKyNkZWZpbmUJQ0FOX1JNUDIJCQkweEZGQzAyQTU4CS8qIFJlY2VpdmUgTWVzc2FnZSBQZW5kaW5nIHJlZyAyICovCisjZGVmaW5lCUNBTl9STUwyCQkJMHhGRkMwMkE1QwkvKiBSZWNlaXZlIE1lc3NhZ2UgTG9zdAlyZWcgMiAqLworI2RlZmluZQlDQU5fTUJUSUYyCQkJMHhGRkMwMkE2MAkvKiBNYWlsYm94IFRyYW5zbWl0IEludGVycnVwdCBGbGFnIHJlZyAyICovCisjZGVmaW5lCUNBTl9NQlJJRjIJCQkweEZGQzAyQTY0CS8qIE1haWxib3ggUmVjZWl2ZSAgSW50ZXJydXB0IEZsYWcgcmVnIDIgKi8KKyNkZWZpbmUJQ0FOX01CSU0yCQkJMHhGRkMwMkE2OAkvKiBNYWlsYm94IEludGVycnVwdCBNYXNrIHJlZyAyICovCisjZGVmaW5lCUNBTl9SRkgyCQkJMHhGRkMwMkE2QwkvKiBSZW1vdGUgRnJhbWUJSGFuZGxpbmcgcmVnIDIgKi8KKyNkZWZpbmUJQ0FOX09QU1MyCQkJMHhGRkMwMkE3MAkvKiBPdmVyd3JpdGUgUHJvdGVjdGlvbglTaW5nbGUgU2hvdCBYbWlzc2lvbiByZWcgMiAqLworCisjZGVmaW5lCUNBTl9DTE9DSwkJCTB4RkZDMDJBODAJLyogQml0IFRpbWluZyBDb25maWd1cmF0aW9uIHJlZ2lzdGVyIDAgKi8KKyNkZWZpbmUJQ0FOX1RJTUlORwkJCTB4RkZDMDJBODQJLyogQml0IFRpbWluZyBDb25maWd1cmF0aW9uIHJlZ2lzdGVyIDEgKi8KKworI2RlZmluZQlDQU5fREVCVUcJCQkweEZGQzAyQTg4CS8qIERlYnVnIFJlZ2lzdGVyCQkgKi8KKy8qIHRoZSBmb2xsb3dpbmcgaXMgZm9yCWJhY2t3YXJkcyBjb21wYXRpYmlsaXR5ICovCisjZGVmaW5lCUNBTl9DTkYJCSBDQU5fREVCVUcKKworI2RlZmluZQlDQU5fU1RBVFVTCQkJMHhGRkMwMkE4QwkvKiBHbG9iYWwgU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9DRUMJCQkJMHhGRkMwMkE5MAkvKiBFcnJvciBDb3VudGVyIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9HSVMJCQkJMHhGRkMwMkE5NAkvKiBHbG9iYWwgSW50ZXJydXB0IFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fR0lNCQkJCTB4RkZDMDJBOTgJLyogR2xvYmFsIEludGVycnVwdCBNYXNrIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9HSUYJCQkJMHhGRkMwMkE5QwkvKiBHbG9iYWwgSW50ZXJydXB0IEZsYWcgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX0NPTlRST0wJCQkweEZGQzAyQUEwCS8qIE1hc3RlciBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9JTlRSCQkJMHhGRkMwMkFBNAkvKiBJbnRlcnJ1cHQgUGVuZGluZyBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUJURAkJCTB4RkZDMDJBQUMJLyogTWFpbGJveCBUZW1wb3JhcnkgRGlzYWJsZSBGZWF0dXJlICovCisjZGVmaW5lCUNBTl9FV1IJCQkJMHhGRkMwMkFCMAkvKiBQcm9ncmFtbWFibGUJV2FybmluZwlMZXZlbCAqLworI2RlZmluZQlDQU5fRVNSCQkJCTB4RkZDMDJBQjQJLyogRXJyb3IgU3RhdHVzCVJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9VQ0NOVAkJCTB4RkZDMDJBQzQJLyogVW5pdmVyc2FsIENvdW50ZXIJICovCisjZGVmaW5lCUNBTl9VQ1JDCQkJMHhGRkMwMkFDOAkvKiBVbml2ZXJzYWwgQ291bnRlciBSZWxvYWQvQ2FwdHVyZSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fVUNDTkYJCQkweEZGQzAyQUNDCS8qIFVuaXZlcnNhbCBDb3VudGVyIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgKi8KKworLyogTWFpbGJveCBBY2NlcHRhbmNlIE1hc2tzCQkJCQkgKi8KKyNkZWZpbmUJQ0FOX0FNMDBMCQkJMHhGRkMwMkIwMAkvKiBNYWlsYm94IDAgTG93IEFjY2VwdGFuY2UgTWFzayAqLworI2RlZmluZQlDQU5fQU0wMEgJCQkweEZGQzAyQjA0CS8qIE1haWxib3ggMCBIaWdoIEFjY2VwdGFuY2UgTWFzayAqLworI2RlZmluZQlDQU5fQU0wMUwJCQkweEZGQzAyQjA4CS8qIE1haWxib3ggMSBMb3cgQWNjZXB0YW5jZSBNYXNrICovCisjZGVmaW5lCUNBTl9BTTAxSAkJCTB4RkZDMDJCMEMJLyogTWFpbGJveCAxIEhpZ2ggQWNjZXB0YW5jZSBNYXNrICovCisjZGVmaW5lCUNBTl9BTTAyTAkJCTB4RkZDMDJCMTAJLyogTWFpbGJveCAyIExvdyBBY2NlcHRhbmNlIE1hc2sgKi8KKyNkZWZpbmUJQ0FOX0FNMDJICQkJMHhGRkMwMkIxNAkvKiBNYWlsYm94IDIgSGlnaCBBY2NlcHRhbmNlIE1hc2sgKi8KKyNkZWZpbmUJQ0FOX0FNMDNMCQkJMHhGRkMwMkIxOAkvKiBNYWlsYm94IDMgTG93IEFjY2VwdGFuY2UgTWFzayAqLworI2RlZmluZQlDQU5fQU0wM0gJCQkweEZGQzAyQjFDCS8qIE1haWxib3ggMyBIaWdoIEFjY2VwdGFuY2UgTWFzayAqLworI2RlZmluZQlDQU5fQU0wNEwJCQkweEZGQzAyQjIwCS8qIE1haWxib3ggNCBMb3cgQWNjZXB0YW5jZSBNYXNrICovCisjZGVmaW5lCUNBTl9BTTA0SAkJCTB4RkZDMDJCMjQJLyogTWFpbGJveCA0IEhpZ2ggQWNjZXB0YW5jZSBNYXNrICovCisjZGVmaW5lCUNBTl9BTTA1TAkJCTB4RkZDMDJCMjgJLyogTWFpbGJveCA1IExvdyBBY2NlcHRhbmNlIE1hc2sgKi8KKyNkZWZpbmUJQ0FOX0FNMDVICQkJMHhGRkMwMkIyQwkvKiBNYWlsYm94IDUgSGlnaCBBY2NlcHRhbmNlIE1hc2sgKi8KKyNkZWZpbmUJQ0FOX0FNMDZMCQkJMHhGRkMwMkIzMAkvKiBNYWlsYm94IDYgTG93IEFjY2VwdGFuY2UgTWFzayAqLworI2RlZmluZQlDQU5fQU0wNkgJCQkweEZGQzAyQjM0CS8qIE1haWxib3ggNiBIaWdoIEFjY2VwdGFuY2UgTWFzayAqLworI2RlZmluZQlDQU5fQU0wN0wJCQkweEZGQzAyQjM4CS8qIE1haWxib3ggNyBMb3cgQWNjZXB0YW5jZSBNYXNrICovCisjZGVmaW5lCUNBTl9BTTA3SAkJCTB4RkZDMDJCM0MJLyogTWFpbGJveCA3IEhpZ2ggQWNjZXB0YW5jZSBNYXNrICovCisjZGVmaW5lCUNBTl9BTTA4TAkJCTB4RkZDMDJCNDAJLyogTWFpbGJveCA4IExvdyBBY2NlcHRhbmNlIE1hc2sgKi8KKyNkZWZpbmUJQ0FOX0FNMDhICQkJMHhGRkMwMkI0NAkvKiBNYWlsYm94IDggSGlnaCBBY2NlcHRhbmNlIE1hc2sgKi8KKyNkZWZpbmUJQ0FOX0FNMDlMCQkJMHhGRkMwMkI0OAkvKiBNYWlsYm94IDkgTG93IEFjY2VwdGFuY2UgTWFzayAqLworI2RlZmluZQlDQU5fQU0wOUgJCQkweEZGQzAyQjRDCS8qIE1haWxib3ggOSBIaWdoIEFjY2VwdGFuY2UgTWFzayAqLworI2RlZmluZQlDQU5fQU0xMEwJCQkweEZGQzAyQjUwCS8qIE1haWxib3ggMTAgTG93IEFjY2VwdGFuY2UgTWFzayAqLworI2RlZmluZQlDQU5fQU0xMEgJCQkweEZGQzAyQjU0CS8qIE1haWxib3ggMTAgSGlnaCBBY2NlcHRhbmNlIE1hc2sgKi8KKyNkZWZpbmUJQ0FOX0FNMTFMCQkJMHhGRkMwMkI1OAkvKiBNYWlsYm94IDExIExvdyBBY2NlcHRhbmNlIE1hc2sgKi8KKyNkZWZpbmUJQ0FOX0FNMTFICQkJMHhGRkMwMkI1QwkvKiBNYWlsYm94IDExIEhpZ2ggQWNjZXB0YW5jZSBNYXNrICovCisjZGVmaW5lCUNBTl9BTTEyTAkJCTB4RkZDMDJCNjAJLyogTWFpbGJveCAxMiBMb3cgQWNjZXB0YW5jZSBNYXNrICovCisjZGVmaW5lCUNBTl9BTTEySAkJCTB4RkZDMDJCNjQJLyogTWFpbGJveCAxMiBIaWdoIEFjY2VwdGFuY2UgTWFzayAqLworI2RlZmluZQlDQU5fQU0xM0wJCQkweEZGQzAyQjY4CS8qIE1haWxib3ggMTMgTG93IEFjY2VwdGFuY2UgTWFzayAqLworI2RlZmluZQlDQU5fQU0xM0gJCQkweEZGQzAyQjZDCS8qIE1haWxib3ggMTMgSGlnaCBBY2NlcHRhbmNlIE1hc2sgKi8KKyNkZWZpbmUJQ0FOX0FNMTRMCQkJMHhGRkMwMkI3MAkvKiBNYWlsYm94IDE0IExvdyBBY2NlcHRhbmNlIE1hc2sgKi8KKyNkZWZpbmUJQ0FOX0FNMTRICQkJMHhGRkMwMkI3NAkvKiBNYWlsYm94IDE0IEhpZ2ggQWNjZXB0YW5jZSBNYXNrICovCisjZGVmaW5lCUNBTl9BTTE1TAkJCTB4RkZDMDJCNzgJLyogTWFpbGJveCAxNSBMb3cgQWNjZXB0YW5jZSBNYXNrICovCisjZGVmaW5lCUNBTl9BTTE1SAkJCTB4RkZDMDJCN0MJLyogTWFpbGJveCAxNSBIaWdoIEFjY2VwdGFuY2UgTWFzayAqLworCisjZGVmaW5lCUNBTl9BTTE2TAkJCTB4RkZDMDJCODAJLyogTWFpbGJveCAxNiBMb3cgQWNjZXB0YW5jZSBNYXNrICovCisjZGVmaW5lCUNBTl9BTTE2SAkJCTB4RkZDMDJCODQJLyogTWFpbGJveCAxNiBIaWdoIEFjY2VwdGFuY2UgTWFzayAqLworI2RlZmluZQlDQU5fQU0xN0wJCQkweEZGQzAyQjg4CS8qIE1haWxib3ggMTcgTG93IEFjY2VwdGFuY2UgTWFzayAqLworI2RlZmluZQlDQU5fQU0xN0gJCQkweEZGQzAyQjhDCS8qIE1haWxib3ggMTcgSGlnaCBBY2NlcHRhbmNlIE1hc2sgKi8KKyNkZWZpbmUJQ0FOX0FNMThMCQkJMHhGRkMwMkI5MAkvKiBNYWlsYm94IDE4IExvdyBBY2NlcHRhbmNlIE1hc2sgKi8KKyNkZWZpbmUJQ0FOX0FNMThICQkJMHhGRkMwMkI5NAkvKiBNYWlsYm94IDE4IEhpZ2ggQWNjZXB0YW5jZSBNYXNrICovCisjZGVmaW5lCUNBTl9BTTE5TAkJCTB4RkZDMDJCOTgJLyogTWFpbGJveCAxOSBMb3cgQWNjZXB0YW5jZSBNYXNrICovCisjZGVmaW5lCUNBTl9BTTE5SAkJCTB4RkZDMDJCOUMJLyogTWFpbGJveCAxOSBIaWdoIEFjY2VwdGFuY2UgTWFzayAqLworI2RlZmluZQlDQU5fQU0yMEwJCQkweEZGQzAyQkEwCS8qIE1haWxib3ggMjAgTG93IEFjY2VwdGFuY2UgTWFzayAqLworI2RlZmluZQlDQU5fQU0yMEgJCQkweEZGQzAyQkE0CS8qIE1haWxib3ggMjAgSGlnaCBBY2NlcHRhbmNlIE1hc2sgKi8KKyNkZWZpbmUJQ0FOX0FNMjFMCQkJMHhGRkMwMkJBOAkvKiBNYWlsYm94IDIxIExvdyBBY2NlcHRhbmNlIE1hc2sgKi8KKyNkZWZpbmUJQ0FOX0FNMjFICQkJMHhGRkMwMkJBQwkvKiBNYWlsYm94IDIxIEhpZ2ggQWNjZXB0YW5jZSBNYXNrICovCisjZGVmaW5lCUNBTl9BTTIyTAkJCTB4RkZDMDJCQjAJLyogTWFpbGJveCAyMiBMb3cgQWNjZXB0YW5jZSBNYXNrICovCisjZGVmaW5lCUNBTl9BTTIySAkJCTB4RkZDMDJCQjQJLyogTWFpbGJveCAyMiBIaWdoIEFjY2VwdGFuY2UgTWFzayAqLworI2RlZmluZQlDQU5fQU0yM0wJCQkweEZGQzAyQkI4CS8qIE1haWxib3ggMjMgTG93IEFjY2VwdGFuY2UgTWFzayAqLworI2RlZmluZQlDQU5fQU0yM0gJCQkweEZGQzAyQkJDCS8qIE1haWxib3ggMjMgSGlnaCBBY2NlcHRhbmNlIE1hc2sgKi8KKyNkZWZpbmUJQ0FOX0FNMjRMCQkJMHhGRkMwMkJDMAkvKiBNYWlsYm94IDI0IExvdyBBY2NlcHRhbmNlIE1hc2sgKi8KKyNkZWZpbmUJQ0FOX0FNMjRICQkJMHhGRkMwMkJDNAkvKiBNYWlsYm94IDI0IEhpZ2ggQWNjZXB0YW5jZSBNYXNrICovCisjZGVmaW5lCUNBTl9BTTI1TAkJCTB4RkZDMDJCQzgJLyogTWFpbGJveCAyNSBMb3cgQWNjZXB0YW5jZSBNYXNrICovCisjZGVmaW5lCUNBTl9BTTI1SAkJCTB4RkZDMDJCQ0MJLyogTWFpbGJveCAyNSBIaWdoIEFjY2VwdGFuY2UgTWFzayAqLworI2RlZmluZQlDQU5fQU0yNkwJCQkweEZGQzAyQkQwCS8qIE1haWxib3ggMjYgTG93IEFjY2VwdGFuY2UgTWFzayAqLworI2RlZmluZQlDQU5fQU0yNkgJCQkweEZGQzAyQkQ0CS8qIE1haWxib3ggMjYgSGlnaCBBY2NlcHRhbmNlIE1hc2sgKi8KKyNkZWZpbmUJQ0FOX0FNMjdMCQkJMHhGRkMwMkJEOAkvKiBNYWlsYm94IDI3IExvdyBBY2NlcHRhbmNlIE1hc2sgKi8KKyNkZWZpbmUJQ0FOX0FNMjdICQkJMHhGRkMwMkJEQwkvKiBNYWlsYm94IDI3IEhpZ2ggQWNjZXB0YW5jZSBNYXNrICovCisjZGVmaW5lCUNBTl9BTTI4TAkJCTB4RkZDMDJCRTAJLyogTWFpbGJveCAyOCBMb3cgQWNjZXB0YW5jZSBNYXNrICovCisjZGVmaW5lCUNBTl9BTTI4SAkJCTB4RkZDMDJCRTQJLyogTWFpbGJveCAyOCBIaWdoIEFjY2VwdGFuY2UgTWFzayAqLworI2RlZmluZQlDQU5fQU0yOUwJCQkweEZGQzAyQkU4CS8qIE1haWxib3ggMjkgTG93IEFjY2VwdGFuY2UgTWFzayAqLworI2RlZmluZQlDQU5fQU0yOUgJCQkweEZGQzAyQkVDCS8qIE1haWxib3ggMjkgSGlnaCBBY2NlcHRhbmNlIE1hc2sgKi8KKyNkZWZpbmUJQ0FOX0FNMzBMCQkJMHhGRkMwMkJGMAkvKiBNYWlsYm94IDMwIExvdyBBY2NlcHRhbmNlIE1hc2sgKi8KKyNkZWZpbmUJQ0FOX0FNMzBICQkJMHhGRkMwMkJGNAkvKiBNYWlsYm94IDMwIEhpZ2ggQWNjZXB0YW5jZSBNYXNrICovCisjZGVmaW5lCUNBTl9BTTMxTAkJCTB4RkZDMDJCRjgJLyogTWFpbGJveCAzMSBMb3cgQWNjZXB0YW5jZSBNYXNrICovCisjZGVmaW5lCUNBTl9BTTMxSAkJCTB4RkZDMDJCRkMJLyogTWFpbGJveCAzMSBIaWdoIEFjY2VwdGFuY2UgTWFzayAqLworCisvKiBDQU4gQWNjZXB0YW5jZSBNYXNrIE1hY3JvcyAqLworI2RlZmluZQlDQU5fQU1fTCh4KQkJCShDQU5fQU0wMEwrKCh4KSoweDgpKQorI2RlZmluZQlDQU5fQU1fSCh4KQkJCShDQU5fQU0wMEgrKCh4KSoweDgpKQorCisvKiBNYWlsYm94IFJlZ2lzdGVycwkJCQkJCQkJCSAqLworI2RlZmluZQlDQU5fTUIwMF9EQVRBMAkJMHhGRkMwMkMwMAkvKiBNYWlsYm94IDAgRGF0YSBXb3JkIDAgWzE1OjBdCVJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjAwX0RBVEExCQkweEZGQzAyQzA0CS8qIE1haWxib3ggMCBEYXRhIFdvcmQgMSBbMzE6MTZdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjAwX0RBVEEyCQkweEZGQzAyQzA4CS8qIE1haWxib3ggMCBEYXRhIFdvcmQgMiBbNDc6MzJdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjAwX0RBVEEzCQkweEZGQzAyQzBDCS8qIE1haWxib3ggMCBEYXRhIFdvcmQgMyBbNjM6NDhdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjAwX0xFTkdUSAkJMHhGRkMwMkMxMAkvKiBNYWlsYm94IDAgRGF0YSBMZW5ndGggQ29kZSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIwMF9USU1FU1RBTVAJMHhGRkMwMkMxNAkvKiBNYWlsYm94IDAgVGltZSBTdGFtcAlWYWx1ZSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIwMF9JRDAJCTB4RkZDMDJDMTgJLyogTWFpbGJveCAwIElkZW50aWZpZXIJTG93IFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjAwX0lEMQkJMHhGRkMwMkMxQwkvKiBNYWlsYm94IDAgSWRlbnRpZmllcglIaWdoIFJlZ2lzdGVyICovCisKKyNkZWZpbmUJQ0FOX01CMDFfREFUQTAJCTB4RkZDMDJDMjAJLyogTWFpbGJveCAxIERhdGEgV29yZCAwIFsxNTowXQlSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIwMV9EQVRBMQkJMHhGRkMwMkMyNAkvKiBNYWlsYm94IDEgRGF0YSBXb3JkIDEgWzMxOjE2XSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIwMV9EQVRBMgkJMHhGRkMwMkMyOAkvKiBNYWlsYm94IDEgRGF0YSBXb3JkIDIgWzQ3OjMyXSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIwMV9EQVRBMwkJMHhGRkMwMkMyQwkvKiBNYWlsYm94IDEgRGF0YSBXb3JkIDMgWzYzOjQ4XSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIwMV9MRU5HVEgJCTB4RkZDMDJDMzAJLyogTWFpbGJveCAxIERhdGEgTGVuZ3RoIENvZGUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMDFfVElNRVNUQU1QCTB4RkZDMDJDMzQJLyogTWFpbGJveCAxIFRpbWUgU3RhbXAJVmFsdWUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMDFfSUQwCQkweEZGQzAyQzM4CS8qIE1haWxib3ggMSBJZGVudGlmaWVyCUxvdyBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIwMV9JRDEJCTB4RkZDMDJDM0MJLyogTWFpbGJveCAxIElkZW50aWZpZXIJSGlnaCBSZWdpc3RlciAqLworCisjZGVmaW5lCUNBTl9NQjAyX0RBVEEwCQkweEZGQzAyQzQwCS8qIE1haWxib3ggMiBEYXRhIFdvcmQgMCBbMTU6MF0JUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMDJfREFUQTEJCTB4RkZDMDJDNDQJLyogTWFpbGJveCAyIERhdGEgV29yZCAxIFszMToxNl0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMDJfREFUQTIJCTB4RkZDMDJDNDgJLyogTWFpbGJveCAyIERhdGEgV29yZCAyIFs0NzozMl0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMDJfREFUQTMJCTB4RkZDMDJDNEMJLyogTWFpbGJveCAyIERhdGEgV29yZCAzIFs2Mzo0OF0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMDJfTEVOR1RICQkweEZGQzAyQzUwCS8qIE1haWxib3ggMiBEYXRhIExlbmd0aCBDb2RlIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjAyX1RJTUVTVEFNUAkweEZGQzAyQzU0CS8qIE1haWxib3ggMiBUaW1lIFN0YW1wCVZhbHVlIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjAyX0lEMAkJMHhGRkMwMkM1OAkvKiBNYWlsYm94IDIgSWRlbnRpZmllcglMb3cgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMDJfSUQxCQkweEZGQzAyQzVDCS8qIE1haWxib3ggMiBJZGVudGlmaWVyCUhpZ2ggUmVnaXN0ZXIgKi8KKworI2RlZmluZQlDQU5fTUIwM19EQVRBMAkJMHhGRkMwMkM2MAkvKiBNYWlsYm94IDMgRGF0YSBXb3JkIDAgWzE1OjBdCVJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjAzX0RBVEExCQkweEZGQzAyQzY0CS8qIE1haWxib3ggMyBEYXRhIFdvcmQgMSBbMzE6MTZdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjAzX0RBVEEyCQkweEZGQzAyQzY4CS8qIE1haWxib3ggMyBEYXRhIFdvcmQgMiBbNDc6MzJdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjAzX0RBVEEzCQkweEZGQzAyQzZDCS8qIE1haWxib3ggMyBEYXRhIFdvcmQgMyBbNjM6NDhdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjAzX0xFTkdUSAkJMHhGRkMwMkM3MAkvKiBNYWlsYm94IDMgRGF0YSBMZW5ndGggQ29kZSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIwM19USU1FU1RBTVAJMHhGRkMwMkM3NAkvKiBNYWlsYm94IDMgVGltZSBTdGFtcAlWYWx1ZSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIwM19JRDAJCTB4RkZDMDJDNzgJLyogTWFpbGJveCAzIElkZW50aWZpZXIJTG93IFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjAzX0lEMQkJMHhGRkMwMkM3QwkvKiBNYWlsYm94IDMgSWRlbnRpZmllcglIaWdoIFJlZ2lzdGVyICovCisKKyNkZWZpbmUJQ0FOX01CMDRfREFUQTAJCTB4RkZDMDJDODAJLyogTWFpbGJveCA0IERhdGEgV29yZCAwIFsxNTowXQlSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIwNF9EQVRBMQkJMHhGRkMwMkM4NAkvKiBNYWlsYm94IDQgRGF0YSBXb3JkIDEgWzMxOjE2XSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIwNF9EQVRBMgkJMHhGRkMwMkM4OAkvKiBNYWlsYm94IDQgRGF0YSBXb3JkIDIgWzQ3OjMyXSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIwNF9EQVRBMwkJMHhGRkMwMkM4QwkvKiBNYWlsYm94IDQgRGF0YSBXb3JkIDMgWzYzOjQ4XSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIwNF9MRU5HVEgJCTB4RkZDMDJDOTAJLyogTWFpbGJveCA0IERhdGEgTGVuZ3RoIENvZGUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMDRfVElNRVNUQU1QCTB4RkZDMDJDOTQJLyogTWFpbGJveCA0IFRpbWUgU3RhbXAJVmFsdWUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMDRfSUQwCQkweEZGQzAyQzk4CS8qIE1haWxib3ggNCBJZGVudGlmaWVyCUxvdyBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIwNF9JRDEJCTB4RkZDMDJDOUMJLyogTWFpbGJveCA0IElkZW50aWZpZXIJSGlnaCBSZWdpc3RlciAqLworCisjZGVmaW5lCUNBTl9NQjA1X0RBVEEwCQkweEZGQzAyQ0EwCS8qIE1haWxib3ggNSBEYXRhIFdvcmQgMCBbMTU6MF0JUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMDVfREFUQTEJCTB4RkZDMDJDQTQJLyogTWFpbGJveCA1IERhdGEgV29yZCAxIFszMToxNl0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMDVfREFUQTIJCTB4RkZDMDJDQTgJLyogTWFpbGJveCA1IERhdGEgV29yZCAyIFs0NzozMl0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMDVfREFUQTMJCTB4RkZDMDJDQUMJLyogTWFpbGJveCA1IERhdGEgV29yZCAzIFs2Mzo0OF0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMDVfTEVOR1RICQkweEZGQzAyQ0IwCS8qIE1haWxib3ggNSBEYXRhIExlbmd0aCBDb2RlIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjA1X1RJTUVTVEFNUAkweEZGQzAyQ0I0CS8qIE1haWxib3ggNSBUaW1lIFN0YW1wCVZhbHVlIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjA1X0lEMAkJMHhGRkMwMkNCOAkvKiBNYWlsYm94IDUgSWRlbnRpZmllcglMb3cgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMDVfSUQxCQkweEZGQzAyQ0JDCS8qIE1haWxib3ggNSBJZGVudGlmaWVyCUhpZ2ggUmVnaXN0ZXIgKi8KKworI2RlZmluZQlDQU5fTUIwNl9EQVRBMAkJMHhGRkMwMkNDMAkvKiBNYWlsYm94IDYgRGF0YSBXb3JkIDAgWzE1OjBdCVJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjA2X0RBVEExCQkweEZGQzAyQ0M0CS8qIE1haWxib3ggNiBEYXRhIFdvcmQgMSBbMzE6MTZdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjA2X0RBVEEyCQkweEZGQzAyQ0M4CS8qIE1haWxib3ggNiBEYXRhIFdvcmQgMiBbNDc6MzJdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjA2X0RBVEEzCQkweEZGQzAyQ0NDCS8qIE1haWxib3ggNiBEYXRhIFdvcmQgMyBbNjM6NDhdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjA2X0xFTkdUSAkJMHhGRkMwMkNEMAkvKiBNYWlsYm94IDYgRGF0YSBMZW5ndGggQ29kZSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIwNl9USU1FU1RBTVAJMHhGRkMwMkNENAkvKiBNYWlsYm94IDYgVGltZSBTdGFtcAlWYWx1ZSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIwNl9JRDAJCTB4RkZDMDJDRDgJLyogTWFpbGJveCA2IElkZW50aWZpZXIJTG93IFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjA2X0lEMQkJMHhGRkMwMkNEQwkvKiBNYWlsYm94IDYgSWRlbnRpZmllcglIaWdoIFJlZ2lzdGVyICovCisKKyNkZWZpbmUJQ0FOX01CMDdfREFUQTAJCTB4RkZDMDJDRTAJLyogTWFpbGJveCA3IERhdGEgV29yZCAwIFsxNTowXQlSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIwN19EQVRBMQkJMHhGRkMwMkNFNAkvKiBNYWlsYm94IDcgRGF0YSBXb3JkIDEgWzMxOjE2XSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIwN19EQVRBMgkJMHhGRkMwMkNFOAkvKiBNYWlsYm94IDcgRGF0YSBXb3JkIDIgWzQ3OjMyXSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIwN19EQVRBMwkJMHhGRkMwMkNFQwkvKiBNYWlsYm94IDcgRGF0YSBXb3JkIDMgWzYzOjQ4XSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIwN19MRU5HVEgJCTB4RkZDMDJDRjAJLyogTWFpbGJveCA3IERhdGEgTGVuZ3RoIENvZGUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMDdfVElNRVNUQU1QCTB4RkZDMDJDRjQJLyogTWFpbGJveCA3IFRpbWUgU3RhbXAJVmFsdWUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMDdfSUQwCQkweEZGQzAyQ0Y4CS8qIE1haWxib3ggNyBJZGVudGlmaWVyCUxvdyBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIwN19JRDEJCTB4RkZDMDJDRkMJLyogTWFpbGJveCA3IElkZW50aWZpZXIJSGlnaCBSZWdpc3RlciAqLworCisjZGVmaW5lCUNBTl9NQjA4X0RBVEEwCQkweEZGQzAyRDAwCS8qIE1haWxib3ggOCBEYXRhIFdvcmQgMCBbMTU6MF0JUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMDhfREFUQTEJCTB4RkZDMDJEMDQJLyogTWFpbGJveCA4IERhdGEgV29yZCAxIFszMToxNl0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMDhfREFUQTIJCTB4RkZDMDJEMDgJLyogTWFpbGJveCA4IERhdGEgV29yZCAyIFs0NzozMl0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMDhfREFUQTMJCTB4RkZDMDJEMEMJLyogTWFpbGJveCA4IERhdGEgV29yZCAzIFs2Mzo0OF0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMDhfTEVOR1RICQkweEZGQzAyRDEwCS8qIE1haWxib3ggOCBEYXRhIExlbmd0aCBDb2RlIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjA4X1RJTUVTVEFNUAkweEZGQzAyRDE0CS8qIE1haWxib3ggOCBUaW1lIFN0YW1wCVZhbHVlIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjA4X0lEMAkJMHhGRkMwMkQxOAkvKiBNYWlsYm94IDggSWRlbnRpZmllcglMb3cgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMDhfSUQxCQkweEZGQzAyRDFDCS8qIE1haWxib3ggOCBJZGVudGlmaWVyCUhpZ2ggUmVnaXN0ZXIgKi8KKworI2RlZmluZQlDQU5fTUIwOV9EQVRBMAkJMHhGRkMwMkQyMAkvKiBNYWlsYm94IDkgRGF0YSBXb3JkIDAgWzE1OjBdCVJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjA5X0RBVEExCQkweEZGQzAyRDI0CS8qIE1haWxib3ggOSBEYXRhIFdvcmQgMSBbMzE6MTZdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjA5X0RBVEEyCQkweEZGQzAyRDI4CS8qIE1haWxib3ggOSBEYXRhIFdvcmQgMiBbNDc6MzJdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjA5X0RBVEEzCQkweEZGQzAyRDJDCS8qIE1haWxib3ggOSBEYXRhIFdvcmQgMyBbNjM6NDhdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjA5X0xFTkdUSAkJMHhGRkMwMkQzMAkvKiBNYWlsYm94IDkgRGF0YSBMZW5ndGggQ29kZSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIwOV9USU1FU1RBTVAJMHhGRkMwMkQzNAkvKiBNYWlsYm94IDkgVGltZSBTdGFtcAlWYWx1ZSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIwOV9JRDAJCTB4RkZDMDJEMzgJLyogTWFpbGJveCA5IElkZW50aWZpZXIJTG93IFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjA5X0lEMQkJMHhGRkMwMkQzQwkvKiBNYWlsYm94IDkgSWRlbnRpZmllcglIaWdoIFJlZ2lzdGVyICovCisKKyNkZWZpbmUJQ0FOX01CMTBfREFUQTAJCTB4RkZDMDJENDAJLyogTWFpbGJveCAxMCBEYXRhIFdvcmQJMCBbMTU6MF0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMTBfREFUQTEJCTB4RkZDMDJENDQJLyogTWFpbGJveCAxMCBEYXRhIFdvcmQJMSBbMzE6MTZdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjEwX0RBVEEyCQkweEZGQzAyRDQ4CS8qIE1haWxib3ggMTAgRGF0YSBXb3JkCTIgWzQ3OjMyXSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIxMF9EQVRBMwkJMHhGRkMwMkQ0QwkvKiBNYWlsYm94IDEwIERhdGEgV29yZAkzIFs2Mzo0OF0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMTBfTEVOR1RICQkweEZGQzAyRDUwCS8qIE1haWxib3ggMTAgRGF0YSBMZW5ndGggQ29kZSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIxMF9USU1FU1RBTVAJMHhGRkMwMkQ1NAkvKiBNYWlsYm94IDEwIFRpbWUgU3RhbXAgVmFsdWUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMTBfSUQwCQkweEZGQzAyRDU4CS8qIE1haWxib3ggMTAgSWRlbnRpZmllciBMb3cgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMTBfSUQxCQkweEZGQzAyRDVDCS8qIE1haWxib3ggMTAgSWRlbnRpZmllciBIaWdoIFJlZ2lzdGVyICovCisKKyNkZWZpbmUJQ0FOX01CMTFfREFUQTAJCTB4RkZDMDJENjAJLyogTWFpbGJveCAxMSBEYXRhIFdvcmQJMCBbMTU6MF0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMTFfREFUQTEJCTB4RkZDMDJENjQJLyogTWFpbGJveCAxMSBEYXRhIFdvcmQJMSBbMzE6MTZdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjExX0RBVEEyCQkweEZGQzAyRDY4CS8qIE1haWxib3ggMTEgRGF0YSBXb3JkCTIgWzQ3OjMyXSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIxMV9EQVRBMwkJMHhGRkMwMkQ2QwkvKiBNYWlsYm94IDExIERhdGEgV29yZAkzIFs2Mzo0OF0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMTFfTEVOR1RICQkweEZGQzAyRDcwCS8qIE1haWxib3ggMTEgRGF0YSBMZW5ndGggQ29kZSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIxMV9USU1FU1RBTVAJMHhGRkMwMkQ3NAkvKiBNYWlsYm94IDExIFRpbWUgU3RhbXAgVmFsdWUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMTFfSUQwCQkweEZGQzAyRDc4CS8qIE1haWxib3ggMTEgSWRlbnRpZmllciBMb3cgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMTFfSUQxCQkweEZGQzAyRDdDCS8qIE1haWxib3ggMTEgSWRlbnRpZmllciBIaWdoIFJlZ2lzdGVyICovCisKKyNkZWZpbmUJQ0FOX01CMTJfREFUQTAJCTB4RkZDMDJEODAJLyogTWFpbGJveCAxMiBEYXRhIFdvcmQJMCBbMTU6MF0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMTJfREFUQTEJCTB4RkZDMDJEODQJLyogTWFpbGJveCAxMiBEYXRhIFdvcmQJMSBbMzE6MTZdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjEyX0RBVEEyCQkweEZGQzAyRDg4CS8qIE1haWxib3ggMTIgRGF0YSBXb3JkCTIgWzQ3OjMyXSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIxMl9EQVRBMwkJMHhGRkMwMkQ4QwkvKiBNYWlsYm94IDEyIERhdGEgV29yZAkzIFs2Mzo0OF0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMTJfTEVOR1RICQkweEZGQzAyRDkwCS8qIE1haWxib3ggMTIgRGF0YSBMZW5ndGggQ29kZSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIxMl9USU1FU1RBTVAJMHhGRkMwMkQ5NAkvKiBNYWlsYm94IDEyIFRpbWUgU3RhbXAgVmFsdWUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMTJfSUQwCQkweEZGQzAyRDk4CS8qIE1haWxib3ggMTIgSWRlbnRpZmllciBMb3cgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMTJfSUQxCQkweEZGQzAyRDlDCS8qIE1haWxib3ggMTIgSWRlbnRpZmllciBIaWdoIFJlZ2lzdGVyICovCisKKyNkZWZpbmUJQ0FOX01CMTNfREFUQTAJCTB4RkZDMDJEQTAJLyogTWFpbGJveCAxMyBEYXRhIFdvcmQJMCBbMTU6MF0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMTNfREFUQTEJCTB4RkZDMDJEQTQJLyogTWFpbGJveCAxMyBEYXRhIFdvcmQJMSBbMzE6MTZdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjEzX0RBVEEyCQkweEZGQzAyREE4CS8qIE1haWxib3ggMTMgRGF0YSBXb3JkCTIgWzQ3OjMyXSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIxM19EQVRBMwkJMHhGRkMwMkRBQwkvKiBNYWlsYm94IDEzIERhdGEgV29yZAkzIFs2Mzo0OF0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMTNfTEVOR1RICQkweEZGQzAyREIwCS8qIE1haWxib3ggMTMgRGF0YSBMZW5ndGggQ29kZSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIxM19USU1FU1RBTVAJMHhGRkMwMkRCNAkvKiBNYWlsYm94IDEzIFRpbWUgU3RhbXAgVmFsdWUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMTNfSUQwCQkweEZGQzAyREI4CS8qIE1haWxib3ggMTMgSWRlbnRpZmllciBMb3cgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMTNfSUQxCQkweEZGQzAyREJDCS8qIE1haWxib3ggMTMgSWRlbnRpZmllciBIaWdoIFJlZ2lzdGVyICovCisKKyNkZWZpbmUJQ0FOX01CMTRfREFUQTAJCTB4RkZDMDJEQzAJLyogTWFpbGJveCAxNCBEYXRhIFdvcmQJMCBbMTU6MF0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMTRfREFUQTEJCTB4RkZDMDJEQzQJLyogTWFpbGJveCAxNCBEYXRhIFdvcmQJMSBbMzE6MTZdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjE0X0RBVEEyCQkweEZGQzAyREM4CS8qIE1haWxib3ggMTQgRGF0YSBXb3JkCTIgWzQ3OjMyXSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIxNF9EQVRBMwkJMHhGRkMwMkRDQwkvKiBNYWlsYm94IDE0IERhdGEgV29yZAkzIFs2Mzo0OF0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMTRfTEVOR1RICQkweEZGQzAyREQwCS8qIE1haWxib3ggMTQgRGF0YSBMZW5ndGggQ29kZSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIxNF9USU1FU1RBTVAJMHhGRkMwMkRENAkvKiBNYWlsYm94IDE0IFRpbWUgU3RhbXAgVmFsdWUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMTRfSUQwCQkweEZGQzAyREQ4CS8qIE1haWxib3ggMTQgSWRlbnRpZmllciBMb3cgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMTRfSUQxCQkweEZGQzAyRERDCS8qIE1haWxib3ggMTQgSWRlbnRpZmllciBIaWdoIFJlZ2lzdGVyICovCisKKyNkZWZpbmUJQ0FOX01CMTVfREFUQTAJCTB4RkZDMDJERTAJLyogTWFpbGJveCAxNSBEYXRhIFdvcmQJMCBbMTU6MF0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMTVfREFUQTEJCTB4RkZDMDJERTQJLyogTWFpbGJveCAxNSBEYXRhIFdvcmQJMSBbMzE6MTZdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjE1X0RBVEEyCQkweEZGQzAyREU4CS8qIE1haWxib3ggMTUgRGF0YSBXb3JkCTIgWzQ3OjMyXSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIxNV9EQVRBMwkJMHhGRkMwMkRFQwkvKiBNYWlsYm94IDE1IERhdGEgV29yZAkzIFs2Mzo0OF0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMTVfTEVOR1RICQkweEZGQzAyREYwCS8qIE1haWxib3ggMTUgRGF0YSBMZW5ndGggQ29kZSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIxNV9USU1FU1RBTVAJMHhGRkMwMkRGNAkvKiBNYWlsYm94IDE1IFRpbWUgU3RhbXAgVmFsdWUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMTVfSUQwCQkweEZGQzAyREY4CS8qIE1haWxib3ggMTUgSWRlbnRpZmllciBMb3cgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMTVfSUQxCQkweEZGQzAyREZDCS8qIE1haWxib3ggMTUgSWRlbnRpZmllciBIaWdoIFJlZ2lzdGVyICovCisKKyNkZWZpbmUJQ0FOX01CMTZfREFUQTAJCTB4RkZDMDJFMDAJLyogTWFpbGJveCAxNiBEYXRhIFdvcmQJMCBbMTU6MF0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMTZfREFUQTEJCTB4RkZDMDJFMDQJLyogTWFpbGJveCAxNiBEYXRhIFdvcmQJMSBbMzE6MTZdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjE2X0RBVEEyCQkweEZGQzAyRTA4CS8qIE1haWxib3ggMTYgRGF0YSBXb3JkCTIgWzQ3OjMyXSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIxNl9EQVRBMwkJMHhGRkMwMkUwQwkvKiBNYWlsYm94IDE2IERhdGEgV29yZAkzIFs2Mzo0OF0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMTZfTEVOR1RICQkweEZGQzAyRTEwCS8qIE1haWxib3ggMTYgRGF0YSBMZW5ndGggQ29kZSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIxNl9USU1FU1RBTVAJMHhGRkMwMkUxNAkvKiBNYWlsYm94IDE2IFRpbWUgU3RhbXAgVmFsdWUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMTZfSUQwCQkweEZGQzAyRTE4CS8qIE1haWxib3ggMTYgSWRlbnRpZmllciBMb3cgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMTZfSUQxCQkweEZGQzAyRTFDCS8qIE1haWxib3ggMTYgSWRlbnRpZmllciBIaWdoIFJlZ2lzdGVyICovCisKKyNkZWZpbmUJQ0FOX01CMTdfREFUQTAJCTB4RkZDMDJFMjAJLyogTWFpbGJveCAxNyBEYXRhIFdvcmQJMCBbMTU6MF0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMTdfREFUQTEJCTB4RkZDMDJFMjQJLyogTWFpbGJveCAxNyBEYXRhIFdvcmQJMSBbMzE6MTZdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjE3X0RBVEEyCQkweEZGQzAyRTI4CS8qIE1haWxib3ggMTcgRGF0YSBXb3JkCTIgWzQ3OjMyXSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIxN19EQVRBMwkJMHhGRkMwMkUyQwkvKiBNYWlsYm94IDE3IERhdGEgV29yZAkzIFs2Mzo0OF0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMTdfTEVOR1RICQkweEZGQzAyRTMwCS8qIE1haWxib3ggMTcgRGF0YSBMZW5ndGggQ29kZSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIxN19USU1FU1RBTVAJMHhGRkMwMkUzNAkvKiBNYWlsYm94IDE3IFRpbWUgU3RhbXAgVmFsdWUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMTdfSUQwCQkweEZGQzAyRTM4CS8qIE1haWxib3ggMTcgSWRlbnRpZmllciBMb3cgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMTdfSUQxCQkweEZGQzAyRTNDCS8qIE1haWxib3ggMTcgSWRlbnRpZmllciBIaWdoIFJlZ2lzdGVyICovCisKKyNkZWZpbmUJQ0FOX01CMThfREFUQTAJCTB4RkZDMDJFNDAJLyogTWFpbGJveCAxOCBEYXRhIFdvcmQJMCBbMTU6MF0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMThfREFUQTEJCTB4RkZDMDJFNDQJLyogTWFpbGJveCAxOCBEYXRhIFdvcmQJMSBbMzE6MTZdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjE4X0RBVEEyCQkweEZGQzAyRTQ4CS8qIE1haWxib3ggMTggRGF0YSBXb3JkCTIgWzQ3OjMyXSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIxOF9EQVRBMwkJMHhGRkMwMkU0QwkvKiBNYWlsYm94IDE4IERhdGEgV29yZAkzIFs2Mzo0OF0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMThfTEVOR1RICQkweEZGQzAyRTUwCS8qIE1haWxib3ggMTggRGF0YSBMZW5ndGggQ29kZSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIxOF9USU1FU1RBTVAJMHhGRkMwMkU1NAkvKiBNYWlsYm94IDE4IFRpbWUgU3RhbXAgVmFsdWUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMThfSUQwCQkweEZGQzAyRTU4CS8qIE1haWxib3ggMTggSWRlbnRpZmllciBMb3cgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMThfSUQxCQkweEZGQzAyRTVDCS8qIE1haWxib3ggMTggSWRlbnRpZmllciBIaWdoIFJlZ2lzdGVyICovCisKKyNkZWZpbmUJQ0FOX01CMTlfREFUQTAJCTB4RkZDMDJFNjAJLyogTWFpbGJveCAxOSBEYXRhIFdvcmQJMCBbMTU6MF0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMTlfREFUQTEJCTB4RkZDMDJFNjQJLyogTWFpbGJveCAxOSBEYXRhIFdvcmQJMSBbMzE6MTZdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjE5X0RBVEEyCQkweEZGQzAyRTY4CS8qIE1haWxib3ggMTkgRGF0YSBXb3JkCTIgWzQ3OjMyXSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIxOV9EQVRBMwkJMHhGRkMwMkU2QwkvKiBNYWlsYm94IDE5IERhdGEgV29yZAkzIFs2Mzo0OF0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMTlfTEVOR1RICQkweEZGQzAyRTcwCS8qIE1haWxib3ggMTkgRGF0YSBMZW5ndGggQ29kZSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIxOV9USU1FU1RBTVAJMHhGRkMwMkU3NAkvKiBNYWlsYm94IDE5IFRpbWUgU3RhbXAgVmFsdWUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMTlfSUQwCQkweEZGQzAyRTc4CS8qIE1haWxib3ggMTkgSWRlbnRpZmllciBMb3cgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMTlfSUQxCQkweEZGQzAyRTdDCS8qIE1haWxib3ggMTkgSWRlbnRpZmllciBIaWdoIFJlZ2lzdGVyICovCisKKyNkZWZpbmUJQ0FOX01CMjBfREFUQTAJCTB4RkZDMDJFODAJLyogTWFpbGJveCAyMCBEYXRhIFdvcmQJMCBbMTU6MF0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMjBfREFUQTEJCTB4RkZDMDJFODQJLyogTWFpbGJveCAyMCBEYXRhIFdvcmQJMSBbMzE6MTZdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjIwX0RBVEEyCQkweEZGQzAyRTg4CS8qIE1haWxib3ggMjAgRGF0YSBXb3JkCTIgWzQ3OjMyXSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIyMF9EQVRBMwkJMHhGRkMwMkU4QwkvKiBNYWlsYm94IDIwIERhdGEgV29yZAkzIFs2Mzo0OF0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMjBfTEVOR1RICQkweEZGQzAyRTkwCS8qIE1haWxib3ggMjAgRGF0YSBMZW5ndGggQ29kZSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIyMF9USU1FU1RBTVAJMHhGRkMwMkU5NAkvKiBNYWlsYm94IDIwIFRpbWUgU3RhbXAgVmFsdWUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMjBfSUQwCQkweEZGQzAyRTk4CS8qIE1haWxib3ggMjAgSWRlbnRpZmllciBMb3cgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMjBfSUQxCQkweEZGQzAyRTlDCS8qIE1haWxib3ggMjAgSWRlbnRpZmllciBIaWdoIFJlZ2lzdGVyICovCisKKyNkZWZpbmUJQ0FOX01CMjFfREFUQTAJCTB4RkZDMDJFQTAJLyogTWFpbGJveCAyMSBEYXRhIFdvcmQJMCBbMTU6MF0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMjFfREFUQTEJCTB4RkZDMDJFQTQJLyogTWFpbGJveCAyMSBEYXRhIFdvcmQJMSBbMzE6MTZdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjIxX0RBVEEyCQkweEZGQzAyRUE4CS8qIE1haWxib3ggMjEgRGF0YSBXb3JkCTIgWzQ3OjMyXSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIyMV9EQVRBMwkJMHhGRkMwMkVBQwkvKiBNYWlsYm94IDIxIERhdGEgV29yZAkzIFs2Mzo0OF0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMjFfTEVOR1RICQkweEZGQzAyRUIwCS8qIE1haWxib3ggMjEgRGF0YSBMZW5ndGggQ29kZSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIyMV9USU1FU1RBTVAJMHhGRkMwMkVCNAkvKiBNYWlsYm94IDIxIFRpbWUgU3RhbXAgVmFsdWUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMjFfSUQwCQkweEZGQzAyRUI4CS8qIE1haWxib3ggMjEgSWRlbnRpZmllciBMb3cgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMjFfSUQxCQkweEZGQzAyRUJDCS8qIE1haWxib3ggMjEgSWRlbnRpZmllciBIaWdoIFJlZ2lzdGVyICovCisKKyNkZWZpbmUJQ0FOX01CMjJfREFUQTAJCTB4RkZDMDJFQzAJLyogTWFpbGJveCAyMiBEYXRhIFdvcmQJMCBbMTU6MF0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMjJfREFUQTEJCTB4RkZDMDJFQzQJLyogTWFpbGJveCAyMiBEYXRhIFdvcmQJMSBbMzE6MTZdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjIyX0RBVEEyCQkweEZGQzAyRUM4CS8qIE1haWxib3ggMjIgRGF0YSBXb3JkCTIgWzQ3OjMyXSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIyMl9EQVRBMwkJMHhGRkMwMkVDQwkvKiBNYWlsYm94IDIyIERhdGEgV29yZAkzIFs2Mzo0OF0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMjJfTEVOR1RICQkweEZGQzAyRUQwCS8qIE1haWxib3ggMjIgRGF0YSBMZW5ndGggQ29kZSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIyMl9USU1FU1RBTVAJMHhGRkMwMkVENAkvKiBNYWlsYm94IDIyIFRpbWUgU3RhbXAgVmFsdWUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMjJfSUQwCQkweEZGQzAyRUQ4CS8qIE1haWxib3ggMjIgSWRlbnRpZmllciBMb3cgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMjJfSUQxCQkweEZGQzAyRURDCS8qIE1haWxib3ggMjIgSWRlbnRpZmllciBIaWdoIFJlZ2lzdGVyICovCisKKyNkZWZpbmUJQ0FOX01CMjNfREFUQTAJCTB4RkZDMDJFRTAJLyogTWFpbGJveCAyMyBEYXRhIFdvcmQJMCBbMTU6MF0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMjNfREFUQTEJCTB4RkZDMDJFRTQJLyogTWFpbGJveCAyMyBEYXRhIFdvcmQJMSBbMzE6MTZdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjIzX0RBVEEyCQkweEZGQzAyRUU4CS8qIE1haWxib3ggMjMgRGF0YSBXb3JkCTIgWzQ3OjMyXSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIyM19EQVRBMwkJMHhGRkMwMkVFQwkvKiBNYWlsYm94IDIzIERhdGEgV29yZAkzIFs2Mzo0OF0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMjNfTEVOR1RICQkweEZGQzAyRUYwCS8qIE1haWxib3ggMjMgRGF0YSBMZW5ndGggQ29kZSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIyM19USU1FU1RBTVAJMHhGRkMwMkVGNAkvKiBNYWlsYm94IDIzIFRpbWUgU3RhbXAgVmFsdWUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMjNfSUQwCQkweEZGQzAyRUY4CS8qIE1haWxib3ggMjMgSWRlbnRpZmllciBMb3cgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMjNfSUQxCQkweEZGQzAyRUZDCS8qIE1haWxib3ggMjMgSWRlbnRpZmllciBIaWdoIFJlZ2lzdGVyICovCisKKyNkZWZpbmUJQ0FOX01CMjRfREFUQTAJCTB4RkZDMDJGMDAJLyogTWFpbGJveCAyNCBEYXRhIFdvcmQJMCBbMTU6MF0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMjRfREFUQTEJCTB4RkZDMDJGMDQJLyogTWFpbGJveCAyNCBEYXRhIFdvcmQJMSBbMzE6MTZdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjI0X0RBVEEyCQkweEZGQzAyRjA4CS8qIE1haWxib3ggMjQgRGF0YSBXb3JkCTIgWzQ3OjMyXSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIyNF9EQVRBMwkJMHhGRkMwMkYwQwkvKiBNYWlsYm94IDI0IERhdGEgV29yZAkzIFs2Mzo0OF0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMjRfTEVOR1RICQkweEZGQzAyRjEwCS8qIE1haWxib3ggMjQgRGF0YSBMZW5ndGggQ29kZSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIyNF9USU1FU1RBTVAJMHhGRkMwMkYxNAkvKiBNYWlsYm94IDI0IFRpbWUgU3RhbXAgVmFsdWUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMjRfSUQwCQkweEZGQzAyRjE4CS8qIE1haWxib3ggMjQgSWRlbnRpZmllciBMb3cgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMjRfSUQxCQkweEZGQzAyRjFDCS8qIE1haWxib3ggMjQgSWRlbnRpZmllciBIaWdoIFJlZ2lzdGVyICovCisKKyNkZWZpbmUJQ0FOX01CMjVfREFUQTAJCTB4RkZDMDJGMjAJLyogTWFpbGJveCAyNSBEYXRhIFdvcmQJMCBbMTU6MF0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMjVfREFUQTEJCTB4RkZDMDJGMjQJLyogTWFpbGJveCAyNSBEYXRhIFdvcmQJMSBbMzE6MTZdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjI1X0RBVEEyCQkweEZGQzAyRjI4CS8qIE1haWxib3ggMjUgRGF0YSBXb3JkCTIgWzQ3OjMyXSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIyNV9EQVRBMwkJMHhGRkMwMkYyQwkvKiBNYWlsYm94IDI1IERhdGEgV29yZAkzIFs2Mzo0OF0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMjVfTEVOR1RICQkweEZGQzAyRjMwCS8qIE1haWxib3ggMjUgRGF0YSBMZW5ndGggQ29kZSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIyNV9USU1FU1RBTVAJMHhGRkMwMkYzNAkvKiBNYWlsYm94IDI1IFRpbWUgU3RhbXAgVmFsdWUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMjVfSUQwCQkweEZGQzAyRjM4CS8qIE1haWxib3ggMjUgSWRlbnRpZmllciBMb3cgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMjVfSUQxCQkweEZGQzAyRjNDCS8qIE1haWxib3ggMjUgSWRlbnRpZmllciBIaWdoIFJlZ2lzdGVyICovCisKKyNkZWZpbmUJQ0FOX01CMjZfREFUQTAJCTB4RkZDMDJGNDAJLyogTWFpbGJveCAyNiBEYXRhIFdvcmQJMCBbMTU6MF0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMjZfREFUQTEJCTB4RkZDMDJGNDQJLyogTWFpbGJveCAyNiBEYXRhIFdvcmQJMSBbMzE6MTZdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjI2X0RBVEEyCQkweEZGQzAyRjQ4CS8qIE1haWxib3ggMjYgRGF0YSBXb3JkCTIgWzQ3OjMyXSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIyNl9EQVRBMwkJMHhGRkMwMkY0QwkvKiBNYWlsYm94IDI2IERhdGEgV29yZAkzIFs2Mzo0OF0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMjZfTEVOR1RICQkweEZGQzAyRjUwCS8qIE1haWxib3ggMjYgRGF0YSBMZW5ndGggQ29kZSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIyNl9USU1FU1RBTVAJMHhGRkMwMkY1NAkvKiBNYWlsYm94IDI2IFRpbWUgU3RhbXAgVmFsdWUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMjZfSUQwCQkweEZGQzAyRjU4CS8qIE1haWxib3ggMjYgSWRlbnRpZmllciBMb3cgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMjZfSUQxCQkweEZGQzAyRjVDCS8qIE1haWxib3ggMjYgSWRlbnRpZmllciBIaWdoIFJlZ2lzdGVyICovCisKKyNkZWZpbmUJQ0FOX01CMjdfREFUQTAJCTB4RkZDMDJGNjAJLyogTWFpbGJveCAyNyBEYXRhIFdvcmQJMCBbMTU6MF0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMjdfREFUQTEJCTB4RkZDMDJGNjQJLyogTWFpbGJveCAyNyBEYXRhIFdvcmQJMSBbMzE6MTZdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjI3X0RBVEEyCQkweEZGQzAyRjY4CS8qIE1haWxib3ggMjcgRGF0YSBXb3JkCTIgWzQ3OjMyXSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIyN19EQVRBMwkJMHhGRkMwMkY2QwkvKiBNYWlsYm94IDI3IERhdGEgV29yZAkzIFs2Mzo0OF0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMjdfTEVOR1RICQkweEZGQzAyRjcwCS8qIE1haWxib3ggMjcgRGF0YSBMZW5ndGggQ29kZSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIyN19USU1FU1RBTVAJMHhGRkMwMkY3NAkvKiBNYWlsYm94IDI3IFRpbWUgU3RhbXAgVmFsdWUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMjdfSUQwCQkweEZGQzAyRjc4CS8qIE1haWxib3ggMjcgSWRlbnRpZmllciBMb3cgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMjdfSUQxCQkweEZGQzAyRjdDCS8qIE1haWxib3ggMjcgSWRlbnRpZmllciBIaWdoIFJlZ2lzdGVyICovCisKKyNkZWZpbmUJQ0FOX01CMjhfREFUQTAJCTB4RkZDMDJGODAJLyogTWFpbGJveCAyOCBEYXRhIFdvcmQJMCBbMTU6MF0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMjhfREFUQTEJCTB4RkZDMDJGODQJLyogTWFpbGJveCAyOCBEYXRhIFdvcmQJMSBbMzE6MTZdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjI4X0RBVEEyCQkweEZGQzAyRjg4CS8qIE1haWxib3ggMjggRGF0YSBXb3JkCTIgWzQ3OjMyXSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIyOF9EQVRBMwkJMHhGRkMwMkY4QwkvKiBNYWlsYm94IDI4IERhdGEgV29yZAkzIFs2Mzo0OF0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMjhfTEVOR1RICQkweEZGQzAyRjkwCS8qIE1haWxib3ggMjggRGF0YSBMZW5ndGggQ29kZSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIyOF9USU1FU1RBTVAJMHhGRkMwMkY5NAkvKiBNYWlsYm94IDI4IFRpbWUgU3RhbXAgVmFsdWUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMjhfSUQwCQkweEZGQzAyRjk4CS8qIE1haWxib3ggMjggSWRlbnRpZmllciBMb3cgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMjhfSUQxCQkweEZGQzAyRjlDCS8qIE1haWxib3ggMjggSWRlbnRpZmllciBIaWdoIFJlZ2lzdGVyICovCisKKyNkZWZpbmUJQ0FOX01CMjlfREFUQTAJCTB4RkZDMDJGQTAJLyogTWFpbGJveCAyOSBEYXRhIFdvcmQJMCBbMTU6MF0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMjlfREFUQTEJCTB4RkZDMDJGQTQJLyogTWFpbGJveCAyOSBEYXRhIFdvcmQJMSBbMzE6MTZdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjI5X0RBVEEyCQkweEZGQzAyRkE4CS8qIE1haWxib3ggMjkgRGF0YSBXb3JkCTIgWzQ3OjMyXSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIyOV9EQVRBMwkJMHhGRkMwMkZBQwkvKiBNYWlsYm94IDI5IERhdGEgV29yZAkzIFs2Mzo0OF0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMjlfTEVOR1RICQkweEZGQzAyRkIwCS8qIE1haWxib3ggMjkgRGF0YSBMZW5ndGggQ29kZSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIyOV9USU1FU1RBTVAJMHhGRkMwMkZCNAkvKiBNYWlsYm94IDI5IFRpbWUgU3RhbXAgVmFsdWUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMjlfSUQwCQkweEZGQzAyRkI4CS8qIE1haWxib3ggMjkgSWRlbnRpZmllciBMb3cgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMjlfSUQxCQkweEZGQzAyRkJDCS8qIE1haWxib3ggMjkgSWRlbnRpZmllciBIaWdoIFJlZ2lzdGVyICovCisKKyNkZWZpbmUJQ0FOX01CMzBfREFUQTAJCTB4RkZDMDJGQzAJLyogTWFpbGJveCAzMCBEYXRhIFdvcmQJMCBbMTU6MF0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMzBfREFUQTEJCTB4RkZDMDJGQzQJLyogTWFpbGJveCAzMCBEYXRhIFdvcmQJMSBbMzE6MTZdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjMwX0RBVEEyCQkweEZGQzAyRkM4CS8qIE1haWxib3ggMzAgRGF0YSBXb3JkCTIgWzQ3OjMyXSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIzMF9EQVRBMwkJMHhGRkMwMkZDQwkvKiBNYWlsYm94IDMwIERhdGEgV29yZAkzIFs2Mzo0OF0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMzBfTEVOR1RICQkweEZGQzAyRkQwCS8qIE1haWxib3ggMzAgRGF0YSBMZW5ndGggQ29kZSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIzMF9USU1FU1RBTVAJMHhGRkMwMkZENAkvKiBNYWlsYm94IDMwIFRpbWUgU3RhbXAgVmFsdWUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMzBfSUQwCQkweEZGQzAyRkQ4CS8qIE1haWxib3ggMzAgSWRlbnRpZmllciBMb3cgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMzBfSUQxCQkweEZGQzAyRkRDCS8qIE1haWxib3ggMzAgSWRlbnRpZmllciBIaWdoIFJlZ2lzdGVyICovCisKKyNkZWZpbmUJQ0FOX01CMzFfREFUQTAJCTB4RkZDMDJGRTAJLyogTWFpbGJveCAzMSBEYXRhIFdvcmQJMCBbMTU6MF0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMzFfREFUQTEJCTB4RkZDMDJGRTQJLyogTWFpbGJveCAzMSBEYXRhIFdvcmQJMSBbMzE6MTZdIFJlZ2lzdGVyICovCisjZGVmaW5lCUNBTl9NQjMxX0RBVEEyCQkweEZGQzAyRkU4CS8qIE1haWxib3ggMzEgRGF0YSBXb3JkCTIgWzQ3OjMyXSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIzMV9EQVRBMwkJMHhGRkMwMkZFQwkvKiBNYWlsYm94IDMxIERhdGEgV29yZAkzIFs2Mzo0OF0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMzFfTEVOR1RICQkweEZGQzAyRkYwCS8qIE1haWxib3ggMzEgRGF0YSBMZW5ndGggQ29kZSBSZWdpc3RlciAqLworI2RlZmluZQlDQU5fTUIzMV9USU1FU1RBTVAJMHhGRkMwMkZGNAkvKiBNYWlsYm94IDMxIFRpbWUgU3RhbXAgVmFsdWUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMzFfSUQwCQkweEZGQzAyRkY4CS8qIE1haWxib3ggMzEgSWRlbnRpZmllciBMb3cgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQ0FOX01CMzFfSUQxCQkweEZGQzAyRkZDCS8qIE1haWxib3ggMzEgSWRlbnRpZmllciBIaWdoIFJlZ2lzdGVyICovCisKKy8qIENBTiBNYWlsYm94IEFyZWEgTWFjcm9zICovCisjZGVmaW5lCUNBTl9NQl9JRDEoeCkJCShDQU5fTUIwMF9JRDErKCh4KSoweDIwKSkKKyNkZWZpbmUJQ0FOX01CX0lEMCh4KQkJKENBTl9NQjAwX0lEMCsoKHgpKjB4MjApKQorI2RlZmluZQlDQU5fTUJfVElNRVNUQU1QKHgpCShDQU5fTUIwMF9USU1FU1RBTVArKCh4KSoweDIwKSkKKyNkZWZpbmUJQ0FOX01CX0xFTkdUSCh4KQkoQ0FOX01CMDBfTEVOR1RIKygoeCkqMHgyMCkpCisjZGVmaW5lCUNBTl9NQl9EQVRBMyh4KQkJKENBTl9NQjAwX0RBVEEzKygoeCkqMHgyMCkpCisjZGVmaW5lCUNBTl9NQl9EQVRBMih4KQkJKENBTl9NQjAwX0RBVEEyKygoeCkqMHgyMCkpCisjZGVmaW5lCUNBTl9NQl9EQVRBMSh4KQkJKENBTl9NQjAwX0RBVEExKygoeCkqMHgyMCkpCisjZGVmaW5lCUNBTl9NQl9EQVRBMCh4KQkJKENBTl9NQjAwX0RBVEEwKygoeCkqMHgyMCkpCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiBTeXN0ZW0gTU1SIFJlZ2lzdGVyIEJpdHMgYW5kCU1hY3JvcyAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworLyogKioqKioqKioqKioqKioqKioqKioqIFBMTCBBTkQgUkVTRVQgTUFTS1MgKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiBQTExfQ1RMIE1hc2tzICovCisjZGVmaW5lCVBMTF9DTEtJTgkJCTB4MDAwMAkvKiBQYXNzCUNMS0lOIHRvIFBMTCAqLworI2RlZmluZQlQTExfQ0xLSU5fRElWMgkJMHgwMDAxCS8qIFBhc3MJQ0xLSU4vMgl0byBQTEwgKi8KKyNkZWZpbmUJREYJCQkJCTB4MDAwMQkgLyogMDogUExMID0gQ0xLSU4sIDE6IFBMTCA9IENMS0lOLzIgKi8KKyNkZWZpbmUJUExMX09GRgkJCQkweDAwMDIJLyogU2h1dAlvZmYgUExMCWNsb2NrcyAqLworCisjZGVmaW5lCVNUT1BDSwkJCQkweDAwMDgJLyogQ29yZQlDbG9jayBPZmYJCSAqLworI2RlZmluZQlQRFdOCQkJCTB4MDAyMAkvKiBQdXQgdGhlIFBMTCBpbiBhIERlZXAgU2xlZXAgc3RhdGUgKi8KKyNkZWZpbmUJSU5fREVMQVkJCQkweDAwMTQJLyogRUJJVQlJbnB1dCBEZWxheSBTZWxlY3QgKi8KKyNkZWZpbmUJT1VUX0RFTEFZCQkJMHgwMEMwCS8qIEVCSVUJT3V0cHV0IERlbGF5IFNlbGVjdCAqLworI2RlZmluZQlCWVBBU1MJCQkJMHgwMTAwCS8qIEJ5cGFzcyB0aGUgUExMICovCisjZGVmaW5lCU1TRUwJCQkweDdFMDAJLyogTXVsdGlwbGllciBTZWxlY3QgRm9yIENDTEsvVkNPIEZhY3RvcnMgKi8KKworLyogUExMX0NUTCBNYWNyb3MJCQkJICovCisjaWZkZWYgX01JU1JBX1JVTEVTCisjZGVmaW5lCVNFVF9NU0VMKHgpCQkoKCh4KSYweDNGdSkgPDwJMHg5KQkvKiBTZXQgTVNFTCA9IDAtNjMgLS0+IFZDTyA9IENMS0lOKk1TRUwgKi8KKyNkZWZpbmUJU0VUX09VVF9ERUxBWSh4KQkoKCh4KSYweDAzdSkgPDwJMHg2KQorI2RlZmluZQlTRVRfSU5fREVMQVkoeCkJCSgoKCh4KSYweDAydSkgPDwgMHgzKSB8CSgoKHgpJjB4MDF1KSA8PAkweDIpKQorI2Vsc2UKKyNkZWZpbmUJU0VUX01TRUwoeCkJCSgoKHgpJjB4M0YpIDw8IDB4OSkJLyogU2V0IE1TRUwgPSAwLTYzIC0tPiBWQ08gPSBDTEtJTipNU0VMICovCisjZGVmaW5lCVNFVF9PVVRfREVMQVkoeCkJKCgoeCkmMHgwMykgPDwgMHg2KQorI2RlZmluZQlTRVRfSU5fREVMQVkoeCkJCSgoKCh4KSYweDAyKSA8PAkweDMpIHwgKCgoeCkmMHgwMSkgPDwgMHgyKSkKKyNlbmRpZiAvKiBfTUlTUkFfUlVMRVMgKi8KKworLyogUExMX0RJViBNYXNrcyAqLworI2RlZmluZQlTU0VMCQkJCTB4MDAwRgkvKiBTeXN0ZW0gU2VsZWN0ICovCisjZGVmaW5lCUNTRUwJCQkJMHgwMDMwCS8qIENvcmUJU2VsZWN0ICovCisjZGVmaW5lCUNTRUxfRElWMQkJMHgwMDAwCS8qCQlDQ0xLID0gVkNPIC8gMSAqLworI2RlZmluZQlDU0VMX0RJVjIJCTB4MDAxMAkvKgkJQ0NMSyA9IFZDTyAvIDIgKi8KKyNkZWZpbmUJQ1NFTF9ESVY0CQkweDAwMjAJLyoJCUNDTEsgPSBWQ08gLyA0ICovCisjZGVmaW5lCUNTRUxfRElWOAkJMHgwMDMwCS8qCQlDQ0xLID0gVkNPIC8gOCAqLworCisjZGVmaW5lCVNDTEtfRElWKHgpCQkJKHgpCQkvKiBTQ0xLCT0gVkNPIC8JeCAqLworCisvKiBQTExfRElWIE1hY3JvcwkJCQkJCQkgKi8KKyNpZmRlZiBfTUlTUkFfUlVMRVMKKyNkZWZpbmUJU0VUX1NTRUwoeCkJCQkoKHgpJjB4RnUpCS8qIFNldCBTU0VMID0gMC0xNSAtLT4gU0NMSyA9IFZDTy9TU0VMICovCisjZWxzZQorI2RlZmluZQlTRVRfU1NFTCh4KQkJCSgoeCkmMHhGKQkvKiBTZXQgU1NFTCA9IDAtMTUgLS0+IFNDTEsgPSBWQ08vU1NFTCAqLworI2VuZGlmIC8qIF9NSVNSQV9SVUxFUyAqLworCisvKiBQTExfU1RBVCBNYXNrcwkJCQkJCQkJCQkgKi8KKyNkZWZpbmUJQUNUSVZFX1BMTEVOQUJMRUQJMHgwMDAxCS8qIFByb2Nlc3NvciBJbglBY3RpdmUgTW9kZSBXaXRoIFBMTCBFbmFibGVkICovCisjZGVmaW5lCUZVTExfT04JCQkJMHgwMDAyCS8qIFByb2Nlc3NvciBJbglGdWxsIE9uCU1vZGUgKi8KKyNkZWZpbmUJQUNUSVZFX1BMTERJU0FCTEVECTB4MDAwNAkvKiBQcm9jZXNzb3IgSW4JQWN0aXZlIE1vZGUgV2l0aCBQTEwgRGlzYWJsZWQgKi8KKyNkZWZpbmUJUExMX0xPQ0tFRAkJCTB4MDAyMAkvKiBQTExfTE9DS0NOVCBIYXMgQmVlbglSZWFjaGVkICovCisKKy8qIFZSX0NUTCBNYXNrcwkJCQkJCQkJCQkgKi8KKyNkZWZpbmUJRlJFUQkJCTB4MDAwMwkvKiBTd2l0Y2hpbmcgT3NjaWxsYXRvcglGcmVxdWVuY3kgRm9yIFJlZ3VsYXRvciAqLworI2RlZmluZQlISUJFUk5BVEUJCTB4MDAwMAkvKgkJUG93ZXJkb3duL0J5cGFzcyBPbi1Cb2FyZCBSZWd1bGF0aW9uICovCisjZGVmaW5lCUZSRVFfMzMzCQkweDAwMDEJLyoJCVN3aXRjaGluZyBGcmVxdWVuY3kgSXMgMzMzIGtIeiAqLworI2RlZmluZQlGUkVRXzY2NwkJMHgwMDAyCS8qCQlTd2l0Y2hpbmcgRnJlcXVlbmN5IElzIDY2NyBrSHogKi8KKyNkZWZpbmUJRlJFUV8xMDAwCQkweDAwMDMJLyoJCVN3aXRjaGluZyBGcmVxdWVuY3kgSXMgMSBNSHogKi8KKworI2RlZmluZQlHQUlOCQkJMHgwMDBDCS8qIFZvbHRhZ2UgTGV2ZWwgR2FpbiAqLworI2RlZmluZQlHQUlOXzUJCQkweDAwMDAJLyoJCUdBSU4gPSA1ICovCisjZGVmaW5lCUdBSU5fMTAJCQkweDAwMDQJLyoJCUdBSU4gPSAxMCAqLworI2RlZmluZQlHQUlOXzIwCQkJMHgwMDA4CS8qCQlHQUlOID0gMjAgKi8KKyNkZWZpbmUJR0FJTl81MAkJCTB4MDAwQwkvKgkJR0FJTiA9IDUwICovCisKKyNkZWZpbmUJVkxFVgkJCTB4MDBGMAkvKiBJbnRlcm5hbCBWb2x0YWdlIExldmVsIC0gT25seSBQcm9ncmFtIFZhbHVlcwlXaXRoaW4gU3BlY2lmaWNhdGlvbnMgKi8KKyNkZWZpbmUJVkxFVl8xMDAJCTB4MDA5MAkvKglWTEVWID0gMS4wMCBWIChTZWUgRGF0YXNoZWV0IGZvciBSZWd1bGF0b3IgVG9sZXJhbmNlKSAqLworI2RlZmluZQlWTEVWXzEwNQkJMHgwMEEwCS8qCVZMRVYgPSAxLjA1IFYgKFNlZSBEYXRhc2hlZXQgZm9yIFJlZ3VsYXRvciBUb2xlcmFuY2UpICovCisjZGVmaW5lCVZMRVZfMTEwCQkweDAwQjAJLyoJVkxFViA9IDEuMTAgViAoU2VlIERhdGFzaGVldCBmb3IgUmVndWxhdG9yIFRvbGVyYW5jZSkgKi8KKyNkZWZpbmUJVkxFVl8xMTUJCTB4MDBDMAkvKglWTEVWID0gMS4xNSBWIChTZWUgRGF0YXNoZWV0IGZvciBSZWd1bGF0b3IgVG9sZXJhbmNlKSAqLworI2RlZmluZQlWTEVWXzEyMAkJMHgwMEQwCS8qCVZMRVYgPSAxLjIwIFYgKFNlZSBEYXRhc2hlZXQgZm9yIFJlZ3VsYXRvciBUb2xlcmFuY2UpICovCisjZGVmaW5lCVZMRVZfMTI1CQkweDAwRTAJLyoJVkxFViA9IDEuMjUgViAoU2VlIERhdGFzaGVldCBmb3IgUmVndWxhdG9yIFRvbGVyYW5jZSkgKi8KKyNkZWZpbmUJVkxFVl8xMzAJCTB4MDBGMAkvKglWTEVWID0gMS4zMCBWIChTZWUgRGF0YXNoZWV0IGZvciBSZWd1bGF0b3IgVG9sZXJhbmNlKSAqLworCisjZGVmaW5lCVdBS0UJCQkweDAxMDAJLyogRW5hYmxlIFJUQy9SZXNldCBXYWtldXAgRnJvbQlIaWJlcm5hdGUgKi8KKyNkZWZpbmUJQ0FOV0UJCQkweDAyMDAJLyogRW5hYmxlIENBTiBXYWtldXAgRnJvbSBIaWJlcm5hdGUgKi8KKyNkZWZpbmUJTVhWUldFCQkJMHgwNDAwCS8qIEVuYWJsZSBNWFZSIFdha2V1cCBGcm9tIEhpYmVybmF0ZSAqLworI2RlZmluZQlTQ0tFTE9XCQkJMHg4MDAwCS8qIERvIE5vdCBEcml2ZQlTQ0tFIEhpZ2ggRHVyaW5nIFJlc2V0IEFmdGVyIEhpYmVybmF0ZSAqLworCisvKiBTV1JTVCBNYXNrICovCisjZGVmaW5lCVNZU1RFTV9SRVNFVAkweDAwMDcJLyogSW5pdGlhdGVzIEEgU3lzdGVtIFNvZnR3YXJlIFJlc2V0ICovCisjZGVmaW5lCURPVUJMRV9GQVVMVAkweDAwMDgJLyogQ29yZQlEb3VibGUgRmF1bHQgQ2F1c2VzIFJlc2V0ICovCisjZGVmaW5lCVJFU0VUX0RPVUJMRQkweDIwMDAJLyogU1cgUmVzZXQgR2VuZXJhdGVkIEJ5IENvcmUgRG91YmxlLUZhdWx0ICovCisjZGVmaW5lCVJFU0VUX1dET0cJCTB4NDAwMAkvKiBTVyBSZXNldCBHZW5lcmF0ZWQgQnkgV2F0Y2hkb2cgVGltZXIgKi8KKyNkZWZpbmUJUkVTRVRfU09GVFdBUkUJMHg4MDAwCS8qIFNXIFJlc2V0IE9jY3VycmVkIFNpbmNlIExhc3QJUmVhZCBPZglTV1JTVCAqLworCisvKiBTWVNDUiBNYXNrcwkJCQkJCQkJCQkJCQkgKi8KKyNkZWZpbmUJQk1PREUJCQkweDAwMDYJLyogQm9vdAlNb2RlIC0gTGF0Y2hlZCBEdXJpbmcgSFcgUmVzZXQgRnJvbSBNb2RlIFBpbnMgKi8KKyNkZWZpbmUJTk9CT09UCQkJMHgwMDEwCS8qIEV4ZWN1dGUgRnJvbQlMMSBvciBBU1lOQyBCYW5rIDAgV2hlbglCTU9ERSA9CTAgKi8KKworCisvKiAqKioqKioqKioqKioqICBTWVNURU0gSU5URVJSVVBUIENPTlRST0xMRVIgTUFTS1MgKioqKioqKioqKioqKioqKiogKi8KKworLyogUGVyaXBoZXJhbCBNYXNrcyBGb3IJU0lDMF9JU1IsIFNJQzBfSVdSLCBTSUMwX0lNQVNLICovCisjZGVmaW5lCVBMTF9XQUtFVVBfSVJRCQkweDAwMDAwMDAxCS8qIFBMTCBXYWtldXAgSW50ZXJydXB0CVJlcXVlc3QgKi8KKyNkZWZpbmUJRE1BQzBfRVJSX0lSUQkJMHgwMDAwMDAwMgkvKiBETUEgQ29udHJvbGxlciAwIEVycm9yIEludGVycnVwdCBSZXF1ZXN0ICovCisjZGVmaW5lCVBQSV9FUlJfSVJRCQkweDAwMDAwMDA0CS8qIFBQSSBFcnJvciBJbnRlcnJ1cHQgUmVxdWVzdCAqLworI2RlZmluZQlTUE9SVDBfRVJSX0lSUQkJMHgwMDAwMDAwOAkvKiBTUE9SVDAgRXJyb3IJSW50ZXJydXB0IFJlcXVlc3QgKi8KKyNkZWZpbmUJU1BPUlQxX0VSUl9JUlEJCTB4MDAwMDAwMTAJLyogU1BPUlQxIEVycm9yCUludGVycnVwdCBSZXF1ZXN0ICovCisjZGVmaW5lCVNQSTBfRVJSX0lSUQkJMHgwMDAwMDAyMAkvKiBTUEkwCUVycm9yIEludGVycnVwdAlSZXF1ZXN0ICovCisjZGVmaW5lCVVBUlQwX0VSUl9JUlEJCTB4MDAwMDAwNDAJLyogVUFSVDAgRXJyb3IgSW50ZXJydXB0IFJlcXVlc3QgKi8KKyNkZWZpbmUJUlRDX0lSUQkJCTB4MDAwMDAwODAJLyogUmVhbC1UaW1lIENsb2NrIEludGVycnVwdCBSZXF1ZXN0ICovCisjZGVmaW5lCURNQTBfSVJRCQkweDAwMDAwMTAwCS8qIERNQSBDaGFubmVsIDAgKFBQSSkgSW50ZXJydXB0IFJlcXVlc3QgKi8KKyNkZWZpbmUJRE1BMV9JUlEJCTB4MDAwMDAyMDAJLyogRE1BIENoYW5uZWwgMSAoU1BPUlQwIFJYKSBJbnRlcnJ1cHQgUmVxdWVzdCAqLworI2RlZmluZQlETUEyX0lSUQkJMHgwMDAwMDQwMAkvKiBETUEgQ2hhbm5lbCAyIChTUE9SVDAgVFgpIEludGVycnVwdCBSZXF1ZXN0ICovCisjZGVmaW5lCURNQTNfSVJRCQkweDAwMDAwODAwCS8qIERNQSBDaGFubmVsIDMgKFNQT1JUMSBSWCkgSW50ZXJydXB0IFJlcXVlc3QgKi8KKyNkZWZpbmUJRE1BNF9JUlEJCTB4MDAwMDEwMDAJLyogRE1BIENoYW5uZWwgNCAoU1BPUlQxIFRYKSBJbnRlcnJ1cHQgUmVxdWVzdCAqLworI2RlZmluZQlETUE1X0lSUQkJMHgwMDAwMjAwMAkvKiBETUEgQ2hhbm5lbCA1IChTUEkpIEludGVycnVwdCBSZXF1ZXN0ICovCisjZGVmaW5lCURNQTZfSVJRCQkweDAwMDA0MDAwCS8qIERNQSBDaGFubmVsIDYgKFVBUlQgUlgpIEludGVycnVwdCBSZXF1ZXN0ICovCisjZGVmaW5lCURNQTdfSVJRCQkweDAwMDA4MDAwCS8qIERNQSBDaGFubmVsIDcgKFVBUlQgVFgpIEludGVycnVwdCBSZXF1ZXN0ICovCisjZGVmaW5lCVRJTUVSMF9JUlEJCTB4MDAwMTAwMDAJLyogVGltZXIgMCBJbnRlcnJ1cHQgUmVxdWVzdCAqLworI2RlZmluZQlUSU1FUjFfSVJRCQkweDAwMDIwMDAwCS8qIFRpbWVyIDEgSW50ZXJydXB0IFJlcXVlc3QgKi8KKyNkZWZpbmUJVElNRVIyX0lSUQkJMHgwMDA0MDAwMAkvKiBUaW1lciAyIEludGVycnVwdCBSZXF1ZXN0ICovCisjZGVmaW5lCVBGQV9JUlEJCQkweDAwMDgwMDAwCS8qIFByb2dyYW1tYWJsZQlGbGFnIEludGVycnVwdCBSZXF1ZXN0IEEgKi8KKyNkZWZpbmUJUEZCX0lSUQkJCTB4MDAxMDAwMDAJLyogUHJvZ3JhbW1hYmxlCUZsYWcgSW50ZXJydXB0IFJlcXVlc3QgQiAqLworI2RlZmluZQlNRE1BMF8wX0lSUQkJMHgwMDIwMDAwMAkvKiBNZW1ETUEwIFN0cmVhbSAwIEludGVycnVwdCBSZXF1ZXN0ICovCisjZGVmaW5lCU1ETUEwXzFfSVJRCQkweDAwNDAwMDAwCS8qIE1lbURNQTAgU3RyZWFtIDEgSW50ZXJydXB0IFJlcXVlc3QgKi8KKyNkZWZpbmUJV0RPR19JUlEJCTB4MDA4MDAwMDAJLyogU29mdHdhcmUgV2F0Y2hkb2cgVGltZXIgSW50ZXJydXB0IFJlcXVlc3QgKi8KKyNkZWZpbmUJRE1BQzFfRVJSX0lSUQkJMHgwMTAwMDAwMAkvKiBETUEgQ29udHJvbGxlciAxIEVycm9yIEludGVycnVwdCBSZXF1ZXN0ICovCisjZGVmaW5lCVNQT1JUMl9FUlJfSVJRCQkweDAyMDAwMDAwCS8qIFNQT1JUMiBFcnJvcglJbnRlcnJ1cHQgUmVxdWVzdCAqLworI2RlZmluZQlTUE9SVDNfRVJSX0lSUQkJMHgwNDAwMDAwMAkvKiBTUE9SVDMgRXJyb3IJSW50ZXJydXB0IFJlcXVlc3QgKi8KKyNkZWZpbmUJTVhWUl9TRF9JUlEJCTB4MDgwMDAwMDAJLyogTVhWUglTeW5jaHJvbm91cyBEYXRhIEludGVycnVwdCBSZXF1ZXN0ICovCisjZGVmaW5lCVNQSTFfRVJSX0lSUQkJMHgxMDAwMDAwMAkvKiBTUEkxCUVycm9yIEludGVycnVwdAlSZXF1ZXN0ICovCisjZGVmaW5lCVNQSTJfRVJSX0lSUQkJMHgyMDAwMDAwMAkvKiBTUEkyCUVycm9yIEludGVycnVwdAlSZXF1ZXN0ICovCisjZGVmaW5lCVVBUlQxX0VSUl9JUlEJCTB4NDAwMDAwMDAJLyogVUFSVDEgRXJyb3IgSW50ZXJydXB0IFJlcXVlc3QgKi8KKyNkZWZpbmUJVUFSVDJfRVJSX0lSUQkJMHg4MDAwMDAwMAkvKiBVQVJUMiBFcnJvciBJbnRlcnJ1cHQgUmVxdWVzdCAqLworCisvKiB0aGUgZm9sbG93aW5nIGFyZSBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgKi8KKyNkZWZpbmUJRE1BMF9FUlJfSVJRCQlETUFDMF9FUlJfSVJRCisjZGVmaW5lCURNQTFfRVJSX0lSUQkJRE1BQzFfRVJSX0lSUQorCisKKy8qIFBlcmlwaGVyYWwgTWFza3MgRm9yCVNJQ19JU1IxLCBTSUNfSVdSMSwgU0lDX0lNQVNLMQkgKi8KKyNkZWZpbmUJQ0FOX0VSUl9JUlEJCQkweDAwMDAwMDAxCS8qIENBTiBFcnJvciBJbnRlcnJ1cHQgUmVxdWVzdCAqLworI2RlZmluZQlETUE4X0lSUQkJCTB4MDAwMDAwMDIJLyogRE1BIENoYW5uZWwgOCAoU1BPUlQyIFJYKSBJbnRlcnJ1cHQgUmVxdWVzdCAqLworI2RlZmluZQlETUE5X0lSUQkJCTB4MDAwMDAwMDQJLyogRE1BIENoYW5uZWwgOSAoU1BPUlQyIFRYKSBJbnRlcnJ1cHQgUmVxdWVzdCAqLworI2RlZmluZQlETUExMF9JUlEJCQkweDAwMDAwMDA4CS8qIERNQSBDaGFubmVsIDEwIChTUE9SVDMgUlgpIEludGVycnVwdAlSZXF1ZXN0ICovCisjZGVmaW5lCURNQTExX0lSUQkJCTB4MDAwMDAwMTAJLyogRE1BIENoYW5uZWwgMTEgKFNQT1JUMyBUWCkgSW50ZXJydXB0CVJlcXVlc3QgKi8KKyNkZWZpbmUJRE1BMTJfSVJRCQkJMHgwMDAwMDAyMAkvKiBETUEgQ2hhbm5lbCAxMiBJbnRlcnJ1cHQgUmVxdWVzdCAqLworI2RlZmluZQlETUExM19JUlEJCQkweDAwMDAwMDQwCS8qIERNQSBDaGFubmVsIDEzIEludGVycnVwdCBSZXF1ZXN0ICovCisjZGVmaW5lCURNQTE0X0lSUQkJCTB4MDAwMDAwODAJLyogRE1BIENoYW5uZWwgMTQgKFNQSTEpIEludGVycnVwdCBSZXF1ZXN0ICovCisjZGVmaW5lCURNQTE1X0lSUQkJCTB4MDAwMDAxMDAJLyogRE1BIENoYW5uZWwgMTUgKFNQSTIpIEludGVycnVwdCBSZXF1ZXN0ICovCisjZGVmaW5lCURNQTE2X0lSUQkJCTB4MDAwMDAyMDAJLyogRE1BIENoYW5uZWwgMTYgKFVBUlQxIFJYKSBJbnRlcnJ1cHQgUmVxdWVzdCAqLworI2RlZmluZQlETUExN19JUlEJCQkweDAwMDAwNDAwCS8qIERNQSBDaGFubmVsIDE3IChVQVJUMSBUWCkgSW50ZXJydXB0IFJlcXVlc3QgKi8KKyNkZWZpbmUJRE1BMThfSVJRCQkJMHgwMDAwMDgwMAkvKiBETUEgQ2hhbm5lbCAxOCAoVUFSVDIgUlgpIEludGVycnVwdCBSZXF1ZXN0ICovCisjZGVmaW5lCURNQTE5X0lSUQkJCTB4MDAwMDEwMDAJLyogRE1BIENoYW5uZWwgMTkgKFVBUlQyIFRYKSBJbnRlcnJ1cHQgUmVxdWVzdCAqLworI2RlZmluZQlUV0kwX0lSUQkJCTB4MDAwMDIwMDAJLyogVFdJMAlJbnRlcnJ1cHQgUmVxdWVzdCAqLworI2RlZmluZQlUV0kxX0lSUQkJCTB4MDAwMDQwMDAJLyogVFdJMQlJbnRlcnJ1cHQgUmVxdWVzdCAqLworI2RlZmluZQlDQU5fUlhfSVJRCQkJMHgwMDAwODAwMAkvKiBDQU4gUmVjZWl2ZSBJbnRlcnJ1cHQgUmVxdWVzdCAqLworI2RlZmluZQlDQU5fVFhfSVJRCQkJMHgwMDAxMDAwMAkvKiBDQU4gVHJhbnNtaXQJSW50ZXJydXB0IFJlcXVlc3QgKi8KKyNkZWZpbmUJTURNQTFfMF9JUlEJCQkweDAwMDIwMDAwCS8qIE1lbURNQTEgU3RyZWFtIDAgSW50ZXJydXB0IFJlcXVlc3QgKi8KKyNkZWZpbmUJTURNQTFfMV9JUlEJCQkweDAwMDQwMDAwCS8qIE1lbURNQTEgU3RyZWFtIDEgSW50ZXJydXB0IFJlcXVlc3QgKi8KKyNkZWZpbmUJTVhWUl9TVEFUX0lSUQkJCTB4MDAwODAwMDAJLyogTVhWUglTdGF0dXMgSW50ZXJydXB0IFJlcXVlc3QgKi8KKyNkZWZpbmUJTVhWUl9DTV9JUlEJCQkweDAwMTAwMDAwCS8qIE1YVlIJQ29udHJvbAlNZXNzYWdlCUludGVycnVwdCBSZXF1ZXN0ICovCisjZGVmaW5lCU1YVlJfQVBfSVJRCQkJMHgwMDIwMDAwMAkvKiBNWFZSCUFzeW5jaHJvbm91cyBQYWNrZXQgSW50ZXJydXB0ICovCisKKy8qIHRoZSBmb2xsb3dpbmcgYXJlIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSAqLworI2RlZmluZQlNRE1BMF9JUlEJCU1ETUExXzBfSVJRCisjZGVmaW5lCU1ETUExX0lSUQkJTURNQTFfMV9JUlEKKworI2lmZGVmIF9NSVNSQV9SVUxFUworI2RlZmluZQlfTUYxNSAweEZ1CisjZGVmaW5lCV9NRjcgN3UKKyNlbHNlCisjZGVmaW5lCV9NRjE1IDB4RgorI2RlZmluZQlfTUY3IDcKKyNlbmRpZiAvKiBfTUlTUkFfUlVMRVMgKi8KKworLyogU0lDX0lNQVNLeCBNYXNrcwkJCQkJCQkJCQkJICovCisjZGVmaW5lCVNJQ19VTk1BU0tfQUxMCTB4MDAwMDAwMDAJCQkJCS8qIFVubWFzayBhbGwgcGVyaXBoZXJhbCBpbnRlcnJ1cHRzICovCisjZGVmaW5lCVNJQ19NQVNLX0FMTAkweEZGRkZGRkZGCQkJCQkvKiBNYXNrCWFsbCBwZXJpcGhlcmFsIGludGVycnVwdHMgKi8KKyNpZmRlZiBfTUlTUkFfUlVMRVMKKyNkZWZpbmUJU0lDX01BU0soeCkJCSgxIDw8ICgoeCkmMHgxRnUpKQkJCQkJLyogTWFzawlQZXJpcGhlcmFsICN4IGludGVycnVwdCAqLworI2RlZmluZQlTSUNfVU5NQVNLKHgpCSgweEZGRkZGRkZGdSBeICgxIDw8ICgoeCkmMHgxRnUpKSkJLyogVW5tYXNrIFBlcmlwaGVyYWwgI3gJaW50ZXJydXB0ICovCisjZWxzZQorI2RlZmluZQlTSUNfTUFTSyh4KQkJKDEgPDwgKCh4KSYweDFGKSkJCQkJCS8qIE1hc2sJUGVyaXBoZXJhbCAjeCBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUJU0lDX1VOTUFTSyh4KQkoMHhGRkZGRkZGRiBeICgxIDw8ICgoeCkmMHgxRikpKQkvKiBVbm1hc2sgUGVyaXBoZXJhbCAjeAlpbnRlcnJ1cHQgKi8KKyNlbmRpZiAvKiBfTUlTUkFfUlVMRVMgKi8KKworLyogU0lDX0lXUnggTWFza3MJCQkJCQkJCQkJCSAqLworI2RlZmluZQlJV1JfRElTQUJMRV9BTEwJMHgwMDAwMDAwMAkJCQkJLyogV2FrZXVwIERpc2FibGUgYWxsIHBlcmlwaGVyYWxzICovCisjZGVmaW5lCUlXUl9FTkFCTEVfQUxMCTB4RkZGRkZGRkYJCQkJCS8qIFdha2V1cCBFbmFibGUgYWxsIHBlcmlwaGVyYWxzICovCisjaWZkZWYgX01JU1JBX1JVTEVTCisjZGVmaW5lCUlXUl9FTkFCTEUoeCkJKDEgPDwgKCh4KSYweDFGdSkpCQkJCQkvKiBXYWtldXAgRW5hYmxlIFBlcmlwaGVyYWwgI3ggKi8KKyNkZWZpbmUJSVdSX0RJU0FCTEUoeCkJKDB4RkZGRkZGRkZ1IF4gKDEgPDwgKCh4KSYweDFGdSkpKQkvKiBXYWtldXAgRGlzYWJsZSBQZXJpcGhlcmFsICN4ICovCisjZWxzZQorI2RlZmluZQlJV1JfRU5BQkxFKHgpCSgxIDw8ICgoeCkmMHgxRikpCQkJCQkvKiBXYWtldXAgRW5hYmxlIFBlcmlwaGVyYWwgI3ggKi8KKyNkZWZpbmUJSVdSX0RJU0FCTEUoeCkJKDB4RkZGRkZGRkYgXiAoMSA8PCAoKHgpJjB4MUYpKSkJLyogV2FrZXVwIERpc2FibGUgUGVyaXBoZXJhbCAjeCAqLworI2VuZGlmIC8qIF9NSVNSQV9SVUxFUyAqLworCisKKy8qICoqKioqKioqKiBXQVRDSERPRyBUSU1FUiBNQVNLUyAqKioqKioqKioqKioqKioqKioqKiAqLworLyogV2F0Y2hkb2cgVGltZXIgV0RPR19DVEwgUmVnaXN0ZXIgTWFza3MgKi8KKyNpZmRlZiBfTUlTUkFfUlVMRVMKKyNkZWZpbmUJV0RFVih4KQkJCSgoKHgpPDwxKSAmIDB4MDAwNnUpCS8qIGV2ZW50IGdlbmVyYXRlZCBvbiByb2xsIG92ZXIgKi8KKyNlbHNlCisjZGVmaW5lCVdERVYoeCkJCQkoKCh4KTw8MSkgJiAweDAwMDYpCS8qIGV2ZW50IGdlbmVyYXRlZCBvbiByb2xsIG92ZXIgKi8KKyNlbmRpZiAvKiBfTUlTUkFfUlVMRVMgKi8KKyNkZWZpbmUJV0RFVl9SRVNFVAkJMHgwMDAwCQkJCS8qIGdlbmVyYXRlIHJlc2V0IGV2ZW50CW9uIHJvbGwJb3ZlciAqLworI2RlZmluZQlXREVWX05NSQkJMHgwMDAyCQkJCS8qIGdlbmVyYXRlIE5NSQlldmVudCBvbiByb2xsIG92ZXIgKi8KKyNkZWZpbmUJV0RFVl9HUEkJCTB4MDAwNAkJCQkvKiBnZW5lcmF0ZSBHUCBJUlEgb24gcm9sbCBvdmVyICovCisjZGVmaW5lCVdERVZfTk9ORQkJMHgwMDA2CQkJCS8qIG5vIGV2ZW50IG9uIHJvbGwgb3ZlciAqLworI2RlZmluZQlXREVOCQkJMHgwRkYwCQkJCS8qIGVuYWJsZSB3YXRjaGRvZyAqLworI2RlZmluZQlXRERJUwkJCTB4MEFEMAkJCQkvKiBkaXNhYmxlIHdhdGNoZG9nICovCisjZGVmaW5lCVdEUk8JCQkweDgwMDAJCQkJLyogd2F0Y2hkb2cgcm9sbGVkIG92ZXIJbGF0Y2ggKi8KKworLyogZGVwcmVjYXRlZCBXRE9HX0NUTCBSZWdpc3RlcglNYXNrcyBmb3IgbGVnYWN5IGNvZGUgKi8KKyNkZWZpbmUJSUNUTCBXREVWCisjZGVmaW5lCUVOQUJMRV9SRVNFVAlXREVWX1JFU0VUCisjZGVmaW5lCVdET0dfUkVTRVQJCVdERVZfUkVTRVQKKyNkZWZpbmUJRU5BQkxFX05NSQkJV0RFVl9OTUkKKyNkZWZpbmUJV0RPR19OTUkJCVdERVZfTk1JCisjZGVmaW5lCUVOQUJMRV9HUEkJCVdERVZfR1BJCisjZGVmaW5lCVdET0dfR1BJCQlXREVWX0dQSQorI2RlZmluZQlESVNBQkxFX0VWVAlXREVWX05PTkUKKyNkZWZpbmUJV0RPR19OT05FCQlXREVWX05PTkUKKworI2RlZmluZQlUTVJfRU4JCQlXREVOCisjZGVmaW5lCVdET0dfRElTQUJMRQkJV0RESVMKKyNkZWZpbmUJVFJPCQkJV0RSTworCisjZGVmaW5lCUlDVExfUDAJCQkweDAxCisjZGVmaW5lCUlDVExfUDEJCQkweDAyCisjZGVmaW5lCVRST19QCQkJMHgwRgorCisKKy8qICoqKioqKioqKioqKioqKiAgUkVBTCBUSU1FIENMT0NLIE1BU0tTICAqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFJUQ19TVEFUIGFuZAlSVENfQUxBUk0gcmVnaXN0ZXIgKi8KKyNkZWZpbmUJUlRTRUMJCTB4MDAwMDAwM0YJLyogUmVhbC1UaW1lIENsb2NrIFNlY29uZHMgKi8KKyNkZWZpbmUJUlRNSU4JCTB4MDAwMDBGQzAJLyogUmVhbC1UaW1lIENsb2NrIE1pbnV0ZXMgKi8KKyNkZWZpbmUJUlRIUgkJMHgwMDAxRjAwMAkvKiBSZWFsLVRpbWUgQ2xvY2sgSG91cnMgKi8KKyNkZWZpbmUJUlREQVkJCTB4RkZGRTAwMDAJLyogUmVhbC1UaW1lIENsb2NrIERheXMgKi8KKworLyogUlRDX0lDVEwgcmVnaXN0ZXIgKi8KKyNkZWZpbmUJU1dJRQkJMHgwMDAxCQkvKiBTdG9wd2F0Y2ggSW50ZXJydXB0IEVuYWJsZSAqLworI2RlZmluZQlBSUUJCQkweDAwMDIJCS8qIEFsYXJtIEludGVycnVwdCBFbmFibGUgKi8KKyNkZWZpbmUJU0lFCQkJMHgwMDA0CQkvKiBTZWNvbmRzICgxIEh6KSBJbnRlcnJ1cHQgRW5hYmxlICovCisjZGVmaW5lCU1JRQkJCTB4MDAwOAkJLyogTWludXRlcyBJbnRlcnJ1cHQgRW5hYmxlICovCisjZGVmaW5lCUhJRQkJCTB4MDAxMAkJLyogSG91cnMgSW50ZXJydXB0IEVuYWJsZSAqLworI2RlZmluZQlESUUJCQkweDAwMjAJCS8qIDI0IEhvdXJzIChEYXlzKSBJbnRlcnJ1cHQgRW5hYmxlICovCisjZGVmaW5lCURBSUUJCTB4MDA0MAkJLyogRGF5IEFsYXJtIChEYXksIEhvdXIsIE1pbnV0ZSwgU2Vjb25kKSBJbnRlcnJ1cHQgRW5hYmxlICovCisjZGVmaW5lCVdDSUUJCTB4ODAwMAkJLyogV3JpdGUgQ29tcGxldGUgSW50ZXJydXB0IEVuYWJsZSAqLworCisvKiBSVENfSVNUQVQgcmVnaXN0ZXIgKi8KKyNkZWZpbmUJU1dFRgkJMHgwMDAxCQkvKiBTdG9wd2F0Y2ggRXZlbnQgRmxhZyAqLworI2RlZmluZQlBRUYJCQkweDAwMDIJCS8qIEFsYXJtIEV2ZW50IEZsYWcgKi8KKyNkZWZpbmUJU0VGCQkJMHgwMDA0CQkvKiBTZWNvbmRzICgxIEh6KSBFdmVudAlGbGFnICovCisjZGVmaW5lCU1FRgkJCTB4MDAwOAkJLyogTWludXRlcyBFdmVudCBGbGFnICovCisjZGVmaW5lCUhFRgkJCTB4MDAxMAkJLyogSG91cnMgRXZlbnQgRmxhZyAqLworI2RlZmluZQlERUYJCQkweDAwMjAJCS8qIDI0IEhvdXJzIChEYXlzKSBFdmVudCBGbGFnICovCisjZGVmaW5lCURBRUYJCTB4MDA0MAkJLyogRGF5IEFsYXJtIChEYXksIEhvdXIsIE1pbnV0ZSwgU2Vjb25kKSBFdmVudCBGbGFnICovCisjZGVmaW5lCVdQUwkJCTB4NDAwMAkJLyogV3JpdGUgUGVuZGluZyBTdGF0dXMJKFJPKSAqLworI2RlZmluZQlXQ09NCQkweDgwMDAJCS8qIFdyaXRlIENvbXBsZXRlICovCisKKy8qIFJUQ19GQVNUIE1hc2sgKFJUQ19QUkVOIE1hc2spICovCisjZGVmaW5lCUVOQUJMRV9QUkVTQ0FMRQkgICAgIDB4MDAwMDAwMDEJIC8qIEVuYWJsZSBwcmVzY2FsZXIgc28JUlRDIHJ1bnMgYXQgMSBIeiAqLworI2RlZmluZQlQUkVOCQkgICAgIDB4MDAwMDAwMDEKKwkJLyogKiogTXVzdCBiZSBzZXQgYWZ0ZXIJcG93ZXItdXAgZm9yIHByb3BlciBvcGVyYXRpb24gb2YgUlRDICovCisKKy8qIERlcHJlY2F0ZWQgUlRDX1NUQVQgYW5kIFJUQ19BTEFSTSBNYXNrcwkJCSAqLworI2RlZmluZQlSVENfU0VDCQkJUlRTRUMJLyogUmVhbC1UaW1lIENsb2NrIFNlY29uZHMgKi8KKyNkZWZpbmUJUlRDX01JTgkJCVJUTUlOCS8qIFJlYWwtVGltZSBDbG9jayBNaW51dGVzICovCisjZGVmaW5lCVJUQ19IUgkJCVJUSFIJLyogUmVhbC1UaW1lIENsb2NrIEhvdXJzICovCisjZGVmaW5lCVJUQ19EQVkJCQlSVERBWQkvKiBSZWFsLVRpbWUgQ2xvY2sgRGF5cyAqLworCisvKiBEZXByZWNhdGVkIFJUQ19JQ1RML1JUQ19JU1RBVCBNYXNrcwkJCQkJCQkJCQkJICovCisjZGVmaW5lCVNUT1BXQVRDSAkJU1dJRQkJLyogU3RvcHdhdGNoIEludGVycnVwdCBFbmFibGUJICovCisjZGVmaW5lCUFMQVJNCQkJQUlFCQkvKiBBbGFybSBJbnRlcnJ1cHQgRW5hYmxlCQkgKi8KKyNkZWZpbmUJU0VDT05ECQkJU0lFCQkvKiBTZWNvbmRzICgxIEh6KSBJbnRlcnJ1cHQgRW5hYmxlICovCisjZGVmaW5lCU1JTlVURQkJCU1JRQkJLyogTWludXRlcyBJbnRlcnJ1cHQgRW5hYmxlCQkgKi8KKyNkZWZpbmUJSE9VUgkJCUhJRQkJLyogSG91cnMgSW50ZXJydXB0IEVuYWJsZQkJICovCisjZGVmaW5lCURBWQkJCQlESUUJCS8qIDI0IEhvdXJzIChEYXlzKSBJbnRlcnJ1cHQgRW5hYmxlICovCisjZGVmaW5lCURBWV9BTEFSTQkJREFJRQkJLyogRGF5IEFsYXJtIChEYXksIEhvdXIsIE1pbnV0ZSwgU2Vjb25kKSBJbnRlcnJ1cHQgRW5hYmxlICovCisjZGVmaW5lCVdSSVRFX0NPTVBMRVRFCVdDSUUJCS8qIFdyaXRlIENvbXBsZXRlIEludGVycnVwdCBFbmFibGUgKi8KKworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBVQVJUIENPTlRST0xMRVIgTUFTS1MgKioqKioqKioqKioqKioqKioqKioqKiAqLworLyogVUFSVHhfTENSIFJlZ2lzdGVyICovCisjaWZkZWYgX01JU1JBX1JVTEVTCisjZGVmaW5lCVdMUyh4KQkJKCgoeCktNXUpICYgMHgwM3UpCS8qIFdvcmQJTGVuZ3RoIFNlbGVjdCAqLworI2Vsc2UKKyNkZWZpbmUJV0xTKHgpCQkoKCh4KS01KSAmIDB4MDMpCS8qIFdvcmQJTGVuZ3RoIFNlbGVjdCAqLworI2VuZGlmIC8qIF9NSVNSQV9SVUxFUyAqLworI2RlZmluZQlTVEIJCQkweDA0CQkJCS8qIFN0b3AJQml0cyAqLworI2RlZmluZQlQRU4JCQkweDA4CQkJCS8qIFBhcml0eSBFbmFibGUgKi8KKyNkZWZpbmUJRVBTCQkJMHgxMAkJCQkvKiBFdmVuCVBhcml0eSBTZWxlY3QgKi8KKyNkZWZpbmUJU1RQCQkJMHgyMAkJCQkvKiBTdGljayBQYXJpdHkgKi8KKyNkZWZpbmUJU0IJCQkweDQwCQkJCS8qIFNldCBCcmVhayAqLworI2RlZmluZQlETEFCCQkweDgwCQkJCS8qIERpdmlzb3IgTGF0Y2ggQWNjZXNzICovCisKKyNkZWZpbmUJRExBQl9QCQkweDA3CisjZGVmaW5lCVNCX1AJCTB4MDYKKyNkZWZpbmUJU1RQX1AJCTB4MDUKKyNkZWZpbmUJRVBTX1AJCTB4MDQKKyNkZWZpbmUJUEVOX1AJCTB4MDMKKyNkZWZpbmUJU1RCX1AJCTB4MDIKKyNkZWZpbmUJV0xTX1AxCQkweDAxCisjZGVmaW5lCVdMU19QMAkJMHgwMAorCisvKiBVQVJUeF9NQ1IgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJTE9PUF9FTkEJMHgxMAkvKiBMb29wYmFjayBNb2RlIEVuYWJsZSAqLworI2RlZmluZQlMT09QX0VOQV9QCTB4MDQKKy8qIERlcHJlY2F0ZWQgVUFSVHhfTUNSCU1hc2sJCQkgKi8KKworLyogVUFSVHhfTFNSIFJlZ2lzdGVyICovCisjZGVmaW5lCURSCQkJMHgwMQkvKiBEYXRhCVJlYWR5ICovCisjZGVmaW5lCU9FCQkJMHgwMgkvKiBPdmVycnVuIEVycm9yICovCisjZGVmaW5lCVBFCQkJMHgwNAkvKiBQYXJpdHkgRXJyb3IgKi8KKyNkZWZpbmUJRkUJCQkweDA4CS8qIEZyYW1pbmcgRXJyb3IgKi8KKyNkZWZpbmUJQkkJCQkweDEwCS8qIEJyZWFrIEludGVycnVwdCAqLworI2RlZmluZQlUSFJFCQkweDIwCS8qIFRIUiBFbXB0eSAqLworI2RlZmluZQlURU1UCQkweDQwCS8qIFRTUiBhbmQgVUFSVF9USFIgRW1wdHkgKi8KKworI2RlZmluZQlURU1QX1AJCTB4MDYKKyNkZWZpbmUJVEhSRV9QCQkweDA1CisjZGVmaW5lCUJJX1AJCTB4MDQKKyNkZWZpbmUJRkVfUAkJMHgwMworI2RlZmluZQlQRV9QCQkweDAyCisjZGVmaW5lCU9FX1AJCTB4MDEKKyNkZWZpbmUJRFJfUAkJMHgwMAorCisvKiBVQVJUeF9JRVIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJRVJCRkkJCTB4MDEJCS8qIEVuYWJsZSBSZWNlaXZlIEJ1ZmZlciBGdWxsIEludGVycnVwdCAqLworI2RlZmluZQlFVEJFSQkJMHgwMgkJLyogRW5hYmxlIFRyYW5zbWl0IEJ1ZmZlciBFbXB0eQlJbnRlcnJ1cHQgKi8KKyNkZWZpbmUJRUxTSQkJMHgwNAkJLyogRW5hYmxlIFJYIFN0YXR1cyBJbnRlcnJ1cHQgKi8KKworI2RlZmluZQlFTFNJX1AJCTB4MDIKKyNkZWZpbmUJRVRCRUlfUAkJMHgwMQorI2RlZmluZQlFUkJGSV9QCQkweDAwCisKKy8qIFVBUlR4X0lJUiBSZWdpc3RlciAqLworI2RlZmluZQlOSU5UCQkweDAxCisjZGVmaW5lCVNUQVRVU19QMQkweDAyCisjZGVmaW5lCVNUQVRVU19QMAkweDAxCisjZGVmaW5lCU5JTlRfUAkJMHgwMAorCisvKiBVQVJUeF9HQ1RMIFJlZ2lzdGVyICovCisjZGVmaW5lCVVDRU4JCTB4MDEJCS8qIEVuYWJsZSBVQVJUeAlDbG9ja3MgKi8KKyNkZWZpbmUJSVJFTgkJMHgwMgkJLyogRW5hYmxlIElyREEgTW9kZSAqLworI2RlZmluZQlUUE9MQwkJMHgwNAkJLyogSXJEQQlUWCBQb2xhcml0eSBDaGFuZ2UgKi8KKyNkZWZpbmUJUlBPTEMJCTB4MDgJCS8qIElyREEJUlggUG9sYXJpdHkgQ2hhbmdlICovCisjZGVmaW5lCUZQRQkJCTB4MTAJCS8qIEZvcmNlIFBhcml0eQlFcnJvciBPbiBUcmFuc21pdCAqLworI2RlZmluZQlGRkUJCQkweDIwCQkvKiBGb3JjZSBGcmFtaW5nIEVycm9yIE9uIFRyYW5zbWl0ICovCisKKyNkZWZpbmUJRkZFX1AJCTB4MDUKKyNkZWZpbmUJRlBFX1AJCTB4MDQKKyNkZWZpbmUJUlBPTENfUAkJMHgwMworI2RlZmluZQlUUE9MQ19QCQkweDAyCisjZGVmaW5lCUlSRU5fUAkJMHgwMQorI2RlZmluZQlVQ0VOX1AJCTB4MDAKKworCisvKiAqKioqKioqKioqICBTRVJJQUwgUE9SVCBNQVNLUyAgKioqKioqKioqKioqKioqKioqKioqKiAqLworLyogU1BPUlR4X1RDUjEgTWFza3MgKi8KKyNkZWZpbmUJVFNQRU4JCTB4MDAwMQkvKiBUWCBlbmFibGUgICovCisjZGVmaW5lCUlUQ0xLCQkweDAwMDIJLyogSW50ZXJuYWwgVFggQ2xvY2sgU2VsZWN0ICAqLworI2RlZmluZQlURFRZUEUJCTB4MDAwQwkvKiBUWCBEYXRhIEZvcm1hdHRpbmcgU2VsZWN0ICovCisjZGVmaW5lCURUWVBFX05PUk0JMHgwMDAwCQkvKiBEYXRhCUZvcm1hdCBOb3JtYWwgKi8KKyNkZWZpbmUJRFRZUEVfVUxBVwkweDAwMDgJCS8qIENvbXBhbmQgVXNpbmcgdS1MYXcgKi8KKyNkZWZpbmUJRFRZUEVfQUxBVwkweDAwMEMJCS8qIENvbXBhbmQgVXNpbmcgQS1MYXcgKi8KKyNkZWZpbmUJVExTQklUCQkweDAwMTAJLyogVFggQml0IE9yZGVyICovCisjZGVmaW5lCUlURlMJCTB4MDIwMAkvKiBJbnRlcm5hbCBUWCBGcmFtZSBTeW5jIFNlbGVjdCAgKi8KKyNkZWZpbmUJVEZTUgkJMHgwNDAwCS8qIFRYIEZyYW1lIFN5bmMgUmVxdWlyZWQgU2VsZWN0ICAqLworI2RlZmluZQlESVRGUwkJMHgwODAwCS8qIERhdGEJSW5kZXBlbmRlbnQgVFggRnJhbWUgU3luYyBTZWxlY3QgICovCisjZGVmaW5lCUxURlMJCTB4MTAwMAkvKiBMb3cgVFggRnJhbWUJU3luYyBTZWxlY3QgICovCisjZGVmaW5lCUxBVEZTCQkweDIwMDAJLyogTGF0ZQlUWCBGcmFtZSBTeW5jIFNlbGVjdCAgKi8KKyNkZWZpbmUJVENLRkUJCTB4NDAwMAkvKiBUWCBDbG9jayBGYWxsaW5nIEVkZ2UgU2VsZWN0ICovCisvKiBTUE9SVHhfUkNSMSBEZXByZWNhdGVkIE1hc2tzCQkJCQkJCQkgKi8KKyNkZWZpbmUJVFVMQVcJCURUWVBFX1VMQVcJCS8qIENvbXBhbmQgVXNpbmcgdS1MYXcgKi8KKyNkZWZpbmUJVEFMQVcJCURUWVBFX0FMQVcJCQkvKiBDb21wYW5kIFVzaW5nIEEtTGF3ICovCisKKy8qIFNQT1JUeF9UQ1IyIE1hc2tzICovCisjaWZkZWYgX01JU1JBX1JVTEVTCisjZGVmaW5lCVNMRU4oeCkJCSgoeCkmMHgxRnUpCS8qIFNQT1JUIFRYIFdvcmQgTGVuZ3RoCSgyIC0gMzEpICovCisjZWxzZQorI2RlZmluZQlTTEVOKHgpCQkoKHgpJjB4MUYpCS8qIFNQT1JUIFRYIFdvcmQgTGVuZ3RoCSgyIC0gMzEpICovCisjZW5kaWYgLyogX01JU1JBX1JVTEVTICovCisjZGVmaW5lCVRYU0UJCTB4MDEwMAkvKlRYIFNlY29uZGFyeSBFbmFibGUgKi8KKyNkZWZpbmUJVFNGU0UJCTB4MDIwMAkvKlRYIFN0ZXJlbyBGcmFtZSBTeW5jIEVuYWJsZSAqLworI2RlZmluZQlUUkZTVAkJMHgwNDAwCS8qVFggUmlnaHQtRmlyc3QgRGF0YSBPcmRlciAgKi8KKworLyogU1BPUlR4X1JDUjEgTWFza3MgKi8KKyNkZWZpbmUJUlNQRU4JCTB4MDAwMQkvKiBSWCBlbmFibGUgICovCisjZGVmaW5lCUlSQ0xLCQkweDAwMDIJLyogSW50ZXJuYWwgUlggQ2xvY2sgU2VsZWN0ICAqLworI2RlZmluZQlSRFRZUEUJCTB4MDAwQwkvKiBSWCBEYXRhIEZvcm1hdHRpbmcgU2VsZWN0ICovCisjZGVmaW5lCURUWVBFX05PUk0JMHgwMDAwCQkvKiBubyBjb21wYW5kaW5nICovCisjZGVmaW5lCURUWVBFX1VMQVcJMHgwMDA4CQkvKiBDb21wYW5kIFVzaW5nIHUtTGF3ICovCisjZGVmaW5lCURUWVBFX0FMQVcJMHgwMDBDCQkvKiBDb21wYW5kIFVzaW5nIEEtTGF3ICovCisjZGVmaW5lCVJMU0JJVAkJMHgwMDEwCS8qIFJYIEJpdCBPcmRlciAqLworI2RlZmluZQlJUkZTCQkweDAyMDAJLyogSW50ZXJuYWwgUlggRnJhbWUgU3luYyBTZWxlY3QgICovCisjZGVmaW5lCVJGU1IJCTB4MDQwMAkvKiBSWCBGcmFtZSBTeW5jIFJlcXVpcmVkIFNlbGVjdCAgKi8KKyNkZWZpbmUJTFJGUwkJMHgxMDAwCS8qIExvdyBSWCBGcmFtZQlTeW5jIFNlbGVjdCAgKi8KKyNkZWZpbmUJTEFSRlMJCTB4MjAwMAkvKiBMYXRlCVJYIEZyYW1lIFN5bmMgU2VsZWN0ICAqLworI2RlZmluZQlSQ0tGRQkJMHg0MDAwCS8qIFJYIENsb2NrIEZhbGxpbmcgRWRnZSBTZWxlY3QgKi8KKy8qIFNQT1JUeF9SQ1IxIERlcHJlY2F0ZWQgTWFza3MJCQkJCQkJCSAqLworI2RlZmluZQlSVUxBVwkJRFRZUEVfVUxBVwkJLyogQ29tcGFuZCBVc2luZyB1LUxhdyAqLworI2RlZmluZQlSQUxBVwkJRFRZUEVfQUxBVwkJCS8qIENvbXBhbmQgVXNpbmcgQS1MYXcgKi8KKworLyogU1BPUlR4X1JDUjIgTWFza3MgKi8KKyNpZmRlZiBfTUlTUkFfUlVMRVMKKyNkZWZpbmUJU0xFTih4KQkJKCh4KSYweDFGdSkJLyogU1BPUlQgUlggV29yZCBMZW5ndGgJKDIgLSAzMSkgKi8KKyNlbHNlCisjZGVmaW5lCVNMRU4oeCkJCSgoeCkmMHgxRikJLyogU1BPUlQgUlggV29yZCBMZW5ndGgJKDIgLSAzMSkgKi8KKyNlbmRpZiAvKiBfTUlTUkFfUlVMRVMgKi8KKyNkZWZpbmUJUlhTRQkJMHgwMTAwCS8qUlggU2Vjb25kYXJ5IEVuYWJsZSAqLworI2RlZmluZQlSU0ZTRQkJMHgwMjAwCS8qUlggU3RlcmVvIEZyYW1lIFN5bmMgRW5hYmxlICovCisjZGVmaW5lCVJSRlNUCQkweDA0MDAJLypSaWdodC1GaXJzdCBEYXRhIE9yZGVyICAqLworCisvKlNQT1JUeF9TVEFUIE1hc2tzICovCisjZGVmaW5lCVJYTkUJCTB4MDAwMQkJLypSWCBGSUZPIE5vdCBFbXB0eSBTdGF0dXMgKi8KKyNkZWZpbmUJUlVWRgkJMHgwMDAyCQkvKlJYIFVuZGVyZmxvdyBTdGF0dXMgKi8KKyNkZWZpbmUJUk9WRgkJMHgwMDA0CQkvKlJYIE92ZXJmbG93IFN0YXR1cyAqLworI2RlZmluZQlUWEYJCQkweDAwMDgJCS8qVFggRklGTyBGdWxsIFN0YXR1cyAqLworI2RlZmluZQlUVVZGCQkweDAwMTAJCS8qVFggVW5kZXJmbG93IFN0YXR1cyAqLworI2RlZmluZQlUT1ZGCQkweDAwMjAJCS8qVFggT3ZlcmZsb3cgU3RhdHVzICovCisjZGVmaW5lCVRYSFJFCQkweDAwNDAJCS8qVFggSG9sZCBSZWdpc3RlciBFbXB0eSAqLworCisvKlNQT1JUeF9NQ01DMSBNYXNrcyAqLworI2RlZmluZQlXT0ZGCQkJMHgwMDAwMDNGRgkvKk11bHRpY2hhbm5lbCBXaW5kb3cgT2Zmc2V0IEZpZWxkICovCisvKiBTUE9SVHhfTUNNQzEJTWFjcm9zCQkJCQkJCQkgKi8KKyNpZmRlZiBfTUlTUkFfUlVMRVMKKyNkZWZpbmUJU0VUX1dPRkYoeCkJCSgoeCkgJiAweDNGRnUpCS8qIE11bHRpY2hhbm5lbAlXaW5kb3cgT2Zmc2V0IEZpZWxkICovCisvKiBPbmx5CXVzZSBTRVRfV1NJWkUgTWFjcm8gV2l0aCBMb2dpYyBPUiBXaGlsZQlTZXR0aW5nCUxvd2VyIE9yZGVyIEJpdHMgKi8KKyNkZWZpbmUJU0VUX1dTSVpFKHgpCSgoKCgoeCk+PjB4MyktMXUpJjB4RnUpCTw8IDB4QykJLyogTXVsdGljaGFubmVsCVdpbmRvdyBTaXplID0gKHgvOCktMSAqLworI2Vsc2UKKyNkZWZpbmUJU0VUX1dPRkYoeCkJCSgoeCkgJiAweDNGRikJLyogTXVsdGljaGFubmVsCVdpbmRvdyBPZmZzZXQgRmllbGQgKi8KKy8qIE9ubHkJdXNlIFNFVF9XU0laRSBNYWNybyBXaXRoIExvZ2ljIE9SIFdoaWxlCVNldHRpbmcJTG93ZXIgT3JkZXIgQml0cyAqLworI2RlZmluZQlTRVRfV1NJWkUoeCkJKCgoKCh4KT4+MHgzKS0xKSYweEYpIDw8IDB4QykJLyogTXVsdGljaGFubmVsCVdpbmRvdyBTaXplID0gKHgvOCktMSAqLworI2VuZGlmIC8qIF9NSVNSQV9SVUxFUyAqLworCisKKy8qU1BPUlR4X01DTUMyIE1hc2tzICovCisjZGVmaW5lCU1DQ1JNCQkweDAwMDMJLypNdWx0aWNoYW5uZWwgQ2xvY2sgUmVjb3ZlcnkgTW9kZSAqLworI2RlZmluZQlSRUNfQllQQVNTCTB4MDAwMAkJLyogQnlwYXNzIE1vZGUgKE5vIENsb2NrIFJlY292ZXJ5KSAqLworI2RlZmluZQlSRUNfMkZST000CTB4MDAwMgkJLyogUmVjb3ZlciAyIE1IeiBDbG9jayBmcm9tIDQgTUh6IENsb2NrICovCisjZGVmaW5lCVJFQ184RlJPTTE2CTB4MDAwMwkJLyogUmVjb3ZlciA4IE1IeiBDbG9jayBmcm9tIDE2IE1IeiBDbG9jayAqLworI2RlZmluZQlNQ0RUWFBFCQkweDAwMDQJLypNdWx0aWNoYW5uZWwgRE1BIFRyYW5zbWl0IFBhY2tpbmcgKi8KKyNkZWZpbmUJTUNEUlhQRQkJMHgwMDA4CS8qTXVsdGljaGFubmVsIERNQSBSZWNlaXZlIFBhY2tpbmcgKi8KKyNkZWZpbmUJTUNNRU4JCTB4MDAxMAkvKk11bHRpY2hhbm5lbCBGcmFtZSBNb2RlIEVuYWJsZSAqLworI2RlZmluZQlGU0RSCQkweDAwODAJLypNdWx0aWNoYW5uZWwgRnJhbWUgU3luYyB0byBEYXRhIFJlbGF0aW9uc2hpcCAqLworI2RlZmluZQlNRkQJCQkweEYwMDAJLypNdWx0aWNoYW5uZWwgRnJhbWUgRGVsYXkgICAgKi8KKyNkZWZpbmUJTUZEXzAJCTB4MDAwMAkJLyogTXVsdGljaGFubmVsCUZyYW1lIERlbGF5ID0gMCAqLworI2RlZmluZQlNRkRfMQkJMHgxMDAwCQkvKiBNdWx0aWNoYW5uZWwJRnJhbWUgRGVsYXkgPSAxICovCisjZGVmaW5lCU1GRF8yCQkweDIwMDAJCS8qIE11bHRpY2hhbm5lbAlGcmFtZSBEZWxheSA9IDIgKi8KKyNkZWZpbmUJTUZEXzMJCTB4MzAwMAkJLyogTXVsdGljaGFubmVsCUZyYW1lIERlbGF5ID0gMyAqLworI2RlZmluZQlNRkRfNAkJMHg0MDAwCQkvKiBNdWx0aWNoYW5uZWwJRnJhbWUgRGVsYXkgPSA0ICovCisjZGVmaW5lCU1GRF81CQkweDUwMDAJCS8qIE11bHRpY2hhbm5lbAlGcmFtZSBEZWxheSA9IDUgKi8KKyNkZWZpbmUJTUZEXzYJCTB4NjAwMAkJLyogTXVsdGljaGFubmVsCUZyYW1lIERlbGF5ID0gNiAqLworI2RlZmluZQlNRkRfNwkJMHg3MDAwCQkvKiBNdWx0aWNoYW5uZWwJRnJhbWUgRGVsYXkgPSA3ICovCisjZGVmaW5lCU1GRF84CQkweDgwMDAJCS8qIE11bHRpY2hhbm5lbAlGcmFtZSBEZWxheSA9IDggKi8KKyNkZWZpbmUJTUZEXzkJCTB4OTAwMAkJLyogTXVsdGljaGFubmVsCUZyYW1lIERlbGF5ID0gOSAqLworI2RlZmluZQlNRkRfMTAJCTB4QTAwMAkJLyogTXVsdGljaGFubmVsCUZyYW1lIERlbGF5ID0gMTAgKi8KKyNkZWZpbmUJTUZEXzExCQkweEIwMDAJCS8qIE11bHRpY2hhbm5lbAlGcmFtZSBEZWxheSA9IDExICovCisjZGVmaW5lCU1GRF8xMgkJMHhDMDAwCQkvKiBNdWx0aWNoYW5uZWwJRnJhbWUgRGVsYXkgPSAxMiAqLworI2RlZmluZQlNRkRfMTMJCTB4RDAwMAkJLyogTXVsdGljaGFubmVsCUZyYW1lIERlbGF5ID0gMTMgKi8KKyNkZWZpbmUJTUZEXzE0CQkweEUwMDAJCS8qIE11bHRpY2hhbm5lbAlGcmFtZSBEZWxheSA9IDE0ICovCisjZGVmaW5lCU1GRF8xNQkJMHhGMDAwCQkvKiBNdWx0aWNoYW5uZWwJRnJhbWUgRGVsYXkgPSAxNSAqLworCisKKy8qICAqKioqKioqKiogIFBBUkFMTEVMCVBFUklQSEVSQUwgSU5URVJGQUNFIChQUEkpIE1BU0tTICoqKioqKioqKioqKioqKiogICAqLworLyogIFBQSV9DT05UUk9MCU1hc2tzCSAgICAgICovCisjZGVmaW5lCVBPUlRfRU4JCTB4MDAwMQkvKiBQUEkgUG9ydCBFbmFibGUgICovCisjZGVmaW5lCVBPUlRfRElSCTB4MDAwMgkvKiBQUEkgUG9ydCBEaXJlY3Rpb24JICAgICovCisjZGVmaW5lCVhGUl9UWVBFCTB4MDAwQwkvKiBQUEkgVHJhbnNmZXIJVHlwZSAgKi8KKyNkZWZpbmUJUE9SVF9DRkcJMHgwMDMwCS8qIFBQSSBQb3J0IENvbmZpZ3VyYXRpb24gKi8KKyNkZWZpbmUJRkxEX1NFTAkJMHgwMDQwCS8qIFBQSSBBY3RpdmUgRmllbGQgU2VsZWN0ICovCisjZGVmaW5lCVBBQ0tfRU4JCTB4MDA4MAkvKiBQUEkgUGFja2luZyBNb2RlICovCisvKiBwcmV2aW91cyB2ZXJzaW9ucyBvZglkZWZCRjUzOS5oIGVycm9uZW91c2x5IGluY2x1ZGVkCURNQTMyIChQUEkgMzItYml0IERNQSBFbmFibGUpICovCisjZGVmaW5lCVNLSVBfRU4JCTB4MDIwMAkvKiBQUEkgU2tpcCBFbGVtZW50IEVuYWJsZSAqLworI2RlZmluZQlTS0lQX0VPCQkweDA0MDAJLyogUFBJIFNraXAgRXZlbi9PZGQgRWxlbWVudHMgKi8KKyNkZWZpbmUJRExFTkdUSAkJMHgzODAwCS8qIFBQSSBEYXRhIExlbmd0aCAgKi8KKyNkZWZpbmUJRExFTl84CQkweDAJICAgICAvKglQUEkgRGF0YSBMZW5ndGgJbWFzayBmb3IgRExFTj04ICovCisjZGVmaW5lCURMRU5fMTAJCTB4MDgwMAkJLyogRGF0YQlMZW5ndGggPSAxMCBCaXRzICovCisjZGVmaW5lCURMRU5fMTEJCTB4MTAwMAkJLyogRGF0YQlMZW5ndGggPSAxMSBCaXRzICovCisjZGVmaW5lCURMRU5fMTIJCTB4MTgwMAkJLyogRGF0YQlMZW5ndGggPSAxMiBCaXRzICovCisjZGVmaW5lCURMRU5fMTMJCTB4MjAwMAkJLyogRGF0YQlMZW5ndGggPSAxMyBCaXRzICovCisjZGVmaW5lCURMRU5fMTQJCTB4MjgwMAkJLyogRGF0YQlMZW5ndGggPSAxNCBCaXRzICovCisjZGVmaW5lCURMRU5fMTUJCTB4MzAwMAkJLyogRGF0YQlMZW5ndGggPSAxNSBCaXRzICovCisjZGVmaW5lCURMRU5fMTYJCTB4MzgwMAkJLyogRGF0YQlMZW5ndGggPSAxNiBCaXRzICovCisjaWZkZWYgX01JU1JBX1JVTEVTCisjZGVmaW5lCURMRU4oeCkJCSgoKCh4KS05dSkgJiAweDA3dSkgPDwgMTEpICAvKiBQUEkgRGF0YQlMZW5ndGggKG9ubHkgd29ya3MgZm9yIHg9MTAtLT54PTE2KSAqLworI2Vsc2UKKyNkZWZpbmUJRExFTih4KQkJKCgoKHgpLTkpICYgMHgwNykgPDwgMTEpICAvKiBQUEkgRGF0YSBMZW5ndGggKG9ubHkgd29ya3MgZm9yIHg9MTAtLT54PTE2KSAqLworI2VuZGlmIC8qIF9NSVNSQV9SVUxFUyAqLworI2RlZmluZQlQT0wJCQkweEMwMDAJLyogUFBJIFNpZ25hbCBQb2xhcml0aWVzICAgICAgICovCisjZGVmaW5lCVBPTEMJCTB4NDAwMAkJLyogUFBJIENsb2NrIFBvbGFyaXR5ICovCisjZGVmaW5lCVBPTFMJCTB4ODAwMAkJLyogUFBJIEZyYW1lIFN5bmMgUG9sYXJpdHkgKi8KKworCisvKiBQUElfU1RBVFVTIE1hc2tzCQkJCQkgICAgICovCisjZGVmaW5lCUZMRAkJCTB4MDQwMAkvKiBGaWVsZCBJbmRpY2F0b3IgICAqLworI2RlZmluZQlGVF9FUlIJCTB4MDgwMAkvKiBGcmFtZSBUcmFjayBFcnJvciAqLworI2RlZmluZQlPVlIJCQkweDEwMDAJLyogRklGTwlPdmVyZmxvdyBFcnJvciAqLworI2RlZmluZQlVTkRSCQkweDIwMDAJLyogRklGTwlVbmRlcnJ1biBFcnJvciAqLworI2RlZmluZQlFUlJfREVUCQkweDQwMDAJLyogRXJyb3IgRGV0ZWN0ZWQgSW5kaWNhdG9yICovCisjZGVmaW5lCUVSUl9OQ09SCTB4ODAwMAkvKiBFcnJvciBOb3QgQ29ycmVjdGVkIEluZGljYXRvciAqLworCisKKy8qICoqKioqKioqKiogIERNQSBDT05UUk9MTEVSIE1BU0tTICAqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIERNQXhfQ09ORklHLAlNRE1BX3l5X0NPTkZJRyBNYXNrcyAqLworI2RlZmluZQlETUFFTgkJMHgwMDAxCS8qIENoYW5uZWwgRW5hYmxlICovCisjZGVmaW5lCVdOUgkJCTB4MDAwMgkvKiBDaGFubmVsIERpcmVjdGlvbiAoVy9SKikgKi8KKyNkZWZpbmUJV0RTSVpFXzgJMHgwMDAwCS8qIFdvcmQJU2l6ZSA4IGJpdHMgKi8KKyNkZWZpbmUJV0RTSVpFXzE2CTB4MDAwNAkvKiBXb3JkCVNpemUgMTYJYml0cyAqLworI2RlZmluZQlXRFNJWkVfMzIJMHgwMDA4CS8qIFdvcmQJU2l6ZSAzMgliaXRzICovCisjZGVmaW5lCURNQTJECQkweDAwMTAJLyogMkQvMUQqIE1vZGUgKi8KKyNkZWZpbmUJUkVTVEFSVAkJMHgwMDIwCS8qIFJlc3RhcnQgKi8KKyNkZWZpbmUJRElfU0VMCQkweDAwNDAJLyogRGF0YQlJbnRlcnJ1cHQgU2VsZWN0ICovCisjZGVmaW5lCURJX0VOCQkweDAwODAJLyogRGF0YQlJbnRlcnJ1cHQgRW5hYmxlICovCisjZGVmaW5lCU5EU0laRQkJMHgwOTAwCS8qIE5leHQJRGVzY3JpcHRvciBTaXplICovCisjZGVmaW5lCU5EU0laRV8wCTB4MDAwMAkvKiBOZXh0CURlc2NyaXB0b3IgU2l6ZQk9IDAgKFN0b3AvQXV0b2J1ZmZlcikgKi8KKyNkZWZpbmUJTkRTSVpFXzEJMHgwMTAwCS8qIE5leHQJRGVzY3JpcHRvciBTaXplCT0gMSAqLworI2RlZmluZQlORFNJWkVfMgkweDAyMDAJLyogTmV4dAlEZXNjcmlwdG9yIFNpemUJPSAyICovCisjZGVmaW5lCU5EU0laRV8zCTB4MDMwMAkvKiBOZXh0CURlc2NyaXB0b3IgU2l6ZQk9IDMgKi8KKyNkZWZpbmUJTkRTSVpFXzQJMHgwNDAwCS8qIE5leHQJRGVzY3JpcHRvciBTaXplCT0gNCAqLworI2RlZmluZQlORFNJWkVfNQkweDA1MDAJLyogTmV4dAlEZXNjcmlwdG9yIFNpemUJPSA1ICovCisjZGVmaW5lCU5EU0laRV82CTB4MDYwMAkvKiBOZXh0CURlc2NyaXB0b3IgU2l6ZQk9IDYgKi8KKyNkZWZpbmUJTkRTSVpFXzcJMHgwNzAwCS8qIE5leHQJRGVzY3JpcHRvciBTaXplCT0gNyAqLworI2RlZmluZQlORFNJWkVfOAkweDA4MDAJLyogTmV4dAlEZXNjcmlwdG9yIFNpemUJPSA4ICovCisjZGVmaW5lCU5EU0laRV85CTB4MDkwMAkvKiBOZXh0CURlc2NyaXB0b3IgU2l6ZQk9IDkgKi8KKworI2RlZmluZSBETUFGTE9XCQkJMHg3MDAwCS8qIEZsb3cgQ29udHJvbCAqLworI2RlZmluZSBETUFGTE9XX1NUT1AJCTB4MDAwMAkvKiBTdG9wIE1vZGUgKi8KKyNkZWZpbmUgRE1BRkxPV19BVVRPCQkweDEwMDAJLyogQXV0b2J1ZmZlciBNb2RlICovCisjZGVmaW5lIERNQUZMT1dfQVJSQVkJCTB4NDAwMAkvKiBEZXNjcmlwdG9yIEFycmF5IE1vZGUgKi8KKyNkZWZpbmUgRE1BRkxPV19TTUFMTAkJMHg2MDAwCS8qIFNtYWxsIE1vZGVsIERlc2NyaXB0b3IgTGlzdCBNb2RlICovCisjZGVmaW5lIERNQUZMT1dfTEFSR0UJCTB4NzAwMAkvKiBMYXJnZSBNb2RlbCBEZXNjcmlwdG9yIExpc3QgTW9kZSAqLworCisjZGVmaW5lCURNQUVOX1AJCTB4MAkJLyogQ2hhbm5lbCBFbmFibGUgKi8KKyNkZWZpbmUJV05SX1AJCTB4MQkJLyogQ2hhbm5lbCBEaXJlY3Rpb24gKFcvUiopICovCisjZGVmaW5lCURNQTJEX1AJCTB4NAkJLyogMkQvMUQqIE1vZGUgKi8KKyNkZWZpbmUJUkVTVEFSVF9QCTB4NQkJLyogUmVzdGFydCAqLworI2RlZmluZQlESV9TRUxfUAkweDYJCS8qIERhdGEJSW50ZXJydXB0IFNlbGVjdCAqLworI2RlZmluZQlESV9FTl9QCQkweDcJCS8qIERhdGEJSW50ZXJydXB0IEVuYWJsZSAqLworCisvKiBETUF4X0lSUV9TVEFUVVMsIE1ETUFfeXlfSVJRX1NUQVRVUyBNYXNrcyAqLworI2RlZmluZQlETUFfRE9ORQkweDAwMDEJLyogRE1BIERvbmUgSW5kaWNhdG9yICovCisjZGVmaW5lCURNQV9FUlIJCTB4MDAwMgkvKiBETUEgRXJyb3IgSW5kaWNhdG9yICovCisjZGVmaW5lCURGRVRDSAkJMHgwMDA0CS8qIERlc2NyaXB0b3IgRmV0Y2ggSW5kaWNhdG9yICovCisjZGVmaW5lCURNQV9SVU4JCTB4MDAwOAkvKiBETUEgUnVubmluZyBJbmRpY2F0b3IgKi8KKworI2RlZmluZQlETUFfRE9ORV9QCTB4MAkJLyogRE1BIERvbmUgSW5kaWNhdG9yICovCisjZGVmaW5lCURNQV9FUlJfUAkweDEJCS8qIERNQSBFcnJvciBJbmRpY2F0b3IgKi8KKyNkZWZpbmUJREZFVENIX1AJMHgyCQkvKiBEZXNjcmlwdG9yIEZldGNoIEluZGljYXRvciAqLworI2RlZmluZQlETUFfUlVOX1AJMHgzCQkvKiBETUEgUnVubmluZyBJbmRpY2F0b3IgKi8KKworLyogRE1BeF9QRVJJUEhFUkFMX01BUCwJTURNQV95eV9QRVJJUEhFUkFMX01BUCBNYXNrcyAqLworCisjZGVmaW5lCUNUWVBFCQkJMHgwMDQwCS8qIERNQSBDaGFubmVsIFR5cGUgSW5kaWNhdG9yICovCisjZGVmaW5lCUNUWVBFX1AJCQkweDYJCS8qIERNQSBDaGFubmVsIFR5cGUgSW5kaWNhdG9yIEJJVCBQT1NJVElPTiAqLworI2RlZmluZQlQQ0FQOAkJCTB4MDA4MAkvKiBETUEgOC1iaXQgT3BlcmF0aW9uIEluZGljYXRvciAgICovCisjZGVmaW5lCVBDQVAxNgkJCTB4MDEwMAkvKiBETUEgMTYtYml0IE9wZXJhdGlvbglJbmRpY2F0b3IgKi8KKyNkZWZpbmUJUENBUDMyCQkJMHgwMjAwCS8qIERNQSAzMi1iaXQgT3BlcmF0aW9uCUluZGljYXRvciAqLworI2RlZmluZQlQQ0FQV1IJCQkweDA0MDAJLyogRE1BIFdyaXRlIE9wZXJhdGlvbiBJbmRpY2F0b3IgKi8KKyNkZWZpbmUJUENBUFJECQkJMHgwODAwCS8qIERNQSBSZWFkIE9wZXJhdGlvbiBJbmRpY2F0b3IgKi8KKyNkZWZpbmUJUE1BUAkJCTB4RjAwMAkvKiBETUEgUGVyaXBoZXJhbCBNYXAgRmllbGQgKi8KKworLyogUE1BUAlFbmNvZGluZ3MgRm9yIERNQSBDb250cm9sbGVyIDAgKi8KKyNkZWZpbmUJUE1BUF9QUEkJCTB4MDAwMAkvKiBQTUFQCVBQSSBQb3J0IERNQSAqLworI2RlZmluZQlQTUFQX1NQT1JUMFJYCTB4MTAwMAkvKiBQTUFQCVNQT1JUMCBSZWNlaXZlIERNQSAqLworI2RlZmluZQlQTUFQX1NQT1JUMFRYCTB4MjAwMAkvKiBQTUFQCVNQT1JUMCBUcmFuc21pdAlETUEgKi8KKyNkZWZpbmUJUE1BUF9TUE9SVDFSWAkweDMwMDAJLyogUE1BUAlTUE9SVDEgUmVjZWl2ZSBETUEgKi8KKyNkZWZpbmUJUE1BUF9TUE9SVDFUWAkweDQwMDAJLyogUE1BUAlTUE9SVDEgVHJhbnNtaXQJRE1BICovCisjZGVmaW5lCVBNQVBfU1BJMAkJMHg1MDAwCS8qIFBNQVAJU1BJIERNQSAqLworI2RlZmluZQlQTUFQX1VBUlQwUlgJCTB4NjAwMAkvKiBQTUFQCVVBUlQgUmVjZWl2ZSBETUEgKi8KKyNkZWZpbmUJUE1BUF9VQVJUMFRYCQkweDcwMDAJLyogUE1BUAlVQVJUIFRyYW5zbWl0IERNQSAqLworCisvKiBQTUFQCUVuY29kaW5ncyBGb3IgRE1BIENvbnRyb2xsZXIgMSAqLworI2RlZmluZQlQTUFQX1NQT1JUMlJYCSAgICAweDAwMDAgIC8qIFBNQVAgU1BPUlQyIFJlY2VpdmUgRE1BICovCisjZGVmaW5lCVBNQVBfU1BPUlQyVFgJICAgIDB4MTAwMCAgLyogUE1BUCBTUE9SVDIgVHJhbnNtaXQgRE1BICovCisjZGVmaW5lCVBNQVBfU1BPUlQzUlgJICAgIDB4MjAwMCAgLyogUE1BUCBTUE9SVDMgUmVjZWl2ZSBETUEgKi8KKyNkZWZpbmUJUE1BUF9TUE9SVDNUWAkgICAgMHgzMDAwICAvKiBQTUFQIFNQT1JUMyBUcmFuc21pdCBETUEgKi8KKyNkZWZpbmUJUE1BUF9TUEkxCSAgICAweDYwMDAgIC8qIFBNQVAgU1BJMSBETUEgKi8KKyNkZWZpbmUJUE1BUF9TUEkyCSAgICAweDcwMDAgIC8qIFBNQVAgU1BJMiBETUEgKi8KKyNkZWZpbmUJUE1BUF9VQVJUMVJYCSAgICAweDgwMDAgIC8qIFBNQVAgVUFSVDEgUmVjZWl2ZSBETUEgKi8KKyNkZWZpbmUJUE1BUF9VQVJUMVRYCSAgICAweDkwMDAgIC8qIFBNQVAgVUFSVDEgVHJhbnNtaXQgRE1BICovCisjZGVmaW5lCVBNQVBfVUFSVDJSWAkgICAgMHhBMDAwICAvKiBQTUFQIFVBUlQyIFJlY2VpdmUgRE1BICovCisjZGVmaW5lCVBNQVBfVUFSVDJUWAkgICAgMHhCMDAwICAvKiBQTUFQIFVBUlQyIFRyYW5zbWl0IERNQSAqLworCisKKy8qICAqKioqKioqKioqKioqICBHRU5FUkFMIFBVUlBPU0UgVElNRVIgTUFTS1MJKioqKioqKioqKioqKioqKioqKiogKi8KKy8qIFBXTSBUaW1lciBiaXQgZGVmaW5pdGlvbnMgKi8KKy8qIFRJTUVSX0VOQUJMRQlSZWdpc3RlciAqLworI2RlZmluZQlUSU1FTjAJCQkweDAwMDEJLyogRW5hYmxlIFRpbWVyCTAgKi8KKyNkZWZpbmUJVElNRU4xCQkJMHgwMDAyCS8qIEVuYWJsZSBUaW1lcgkxICovCisjZGVmaW5lCVRJTUVOMgkJCTB4MDAwNAkvKiBFbmFibGUgVGltZXIJMiAqLworCisjZGVmaW5lCVRJTUVOMF9QCQkweDAwCisjZGVmaW5lCVRJTUVOMV9QCQkweDAxCisjZGVmaW5lCVRJTUVOMl9QCQkweDAyCisKKy8qIFRJTUVSX0RJU0FCTEUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJVElNRElTMAkJCTB4MDAwMQkvKiBEaXNhYmxlIFRpbWVyIDAgKi8KKyNkZWZpbmUJVElNRElTMQkJCTB4MDAwMgkvKiBEaXNhYmxlIFRpbWVyIDEgKi8KKyNkZWZpbmUJVElNRElTMgkJCTB4MDAwNAkvKiBEaXNhYmxlIFRpbWVyIDIgKi8KKworI2RlZmluZQlUSU1ESVMwX1AJCTB4MDAKKyNkZWZpbmUJVElNRElTMV9QCQkweDAxCisjZGVmaW5lCVRJTURJUzJfUAkJMHgwMgorCisvKiBUSU1FUl9TVEFUVVMJUmVnaXN0ZXIgKi8KKyNkZWZpbmUJVElNSUwwCQkJMHgwMDAxCS8qIFRpbWVyIDAgSW50ZXJydXB0ICovCisjZGVmaW5lCVRJTUlMMQkJCTB4MDAwMgkvKiBUaW1lciAxIEludGVycnVwdCAqLworI2RlZmluZQlUSU1JTDIJCQkweDAwMDQJLyogVGltZXIgMiBJbnRlcnJ1cHQgKi8KKyNkZWZpbmUJVE9WRl9FUlIwCQkweDAwMTAJLyogVGltZXIgMCBDb3VudGVyIE92ZXJmbG93ICovCisjZGVmaW5lCVRPVkZfRVJSMQkJMHgwMDIwCS8qIFRpbWVyIDEgQ291bnRlciBPdmVyZmxvdyAqLworI2RlZmluZQlUT1ZGX0VSUjIJCTB4MDA0MAkvKiBUaW1lciAyIENvdW50ZXIgT3ZlcmZsb3cgKi8KKyNkZWZpbmUJVFJVTjAJCQkweDEwMDAJLyogVGltZXIgMCBTbGF2ZSBFbmFibGUJU3RhdHVzICovCisjZGVmaW5lCVRSVU4xCQkJMHgyMDAwCS8qIFRpbWVyIDEgU2xhdmUgRW5hYmxlCVN0YXR1cyAqLworI2RlZmluZQlUUlVOMgkJCTB4NDAwMAkvKiBUaW1lciAyIFNsYXZlIEVuYWJsZQlTdGF0dXMgKi8KKworI2RlZmluZQlUSU1JTDBfUAkJMHgwMAorI2RlZmluZQlUSU1JTDFfUAkJMHgwMQorI2RlZmluZQlUSU1JTDJfUAkJMHgwMgorI2RlZmluZQlUT1ZGX0VSUjBfUAkJMHgwNAorI2RlZmluZQlUT1ZGX0VSUjFfUAkJMHgwNQorI2RlZmluZQlUT1ZGX0VSUjJfUAkJMHgwNgorI2RlZmluZQlUUlVOMF9QCQkJMHgwQworI2RlZmluZQlUUlVOMV9QCQkJMHgwRAorI2RlZmluZQlUUlVOMl9QCQkJMHgwRQorCisvKiBBbHRlcm5hdGUgRGVwcmVjYXRlZAlNYWNyb3MgUHJvdmlkZWQJRm9yIEJhY2t3YXJkcyBDb2RlIENvbXBhdGliaWxpdHkgKi8KKyNkZWZpbmUJVE9WTF9FUlIwCQlUT1ZGX0VSUjAKKyNkZWZpbmUJVE9WTF9FUlIxCQlUT1ZGX0VSUjEKKyNkZWZpbmUJVE9WTF9FUlIyCQlUT1ZGX0VSUjIKKyNkZWZpbmUJVE9WTF9FUlIwX1AJCVRPVkZfRVJSMF9QCisjZGVmaW5lCVRPVkxfRVJSMV9QCVRPVkZfRVJSMV9QCisjZGVmaW5lCVRPVkxfRVJSMl9QCVRPVkZfRVJSMl9QCisKKy8qIFRJTUVSeF9DT05GSUcgUmVnaXN0ZXJzICovCisjZGVmaW5lCVBXTV9PVVQJCQkweDAwMDEKKyNkZWZpbmUJV0RUSF9DQVAJCTB4MDAwMgorI2RlZmluZQlFWFRfQ0xLCQkJMHgwMDAzCisjZGVmaW5lCVBVTFNFX0hJCQkweDAwMDQKKyNkZWZpbmUJUEVSSU9EX0NOVAkJMHgwMDA4CisjZGVmaW5lCUlSUV9FTkEJCQkweDAwMTAKKyNkZWZpbmUJVElOX1NFTAkJCTB4MDAyMAorI2RlZmluZQlPVVRfRElTCQkJMHgwMDQwCisjZGVmaW5lCUNMS19TRUwJCQkweDAwODAKKyNkZWZpbmUJVE9HR0xFX0hJCQkweDAxMDAKKyNkZWZpbmUJRU1VX1JVTgkJCTB4MDIwMAorI2lmZGVmIF9NSVNSQV9SVUxFUworI2RlZmluZQlFUlJfVFlQKHgpCQkoKCh4KSAmCTB4MDN1KSA8PCAxNCkKKyNlbHNlCisjZGVmaW5lCUVSUl9UWVAoeCkJCSgoKHgpICYJMHgwMykgPDwgMTQpCisjZW5kaWYgLyogX01JU1JBX1JVTEVTICovCisKKyNkZWZpbmUJVE1PREVfUDAJCTB4MDAKKyNkZWZpbmUJVE1PREVfUDEJCTB4MDEKKyNkZWZpbmUJUFVMU0VfSElfUAkJMHgwMgorI2RlZmluZQlQRVJJT0RfQ05UX1AJMHgwMworI2RlZmluZQlJUlFfRU5BX1AJCTB4MDQKKyNkZWZpbmUJVElOX1NFTF9QCQkweDA1CisjZGVmaW5lCU9VVF9ESVNfUAkJMHgwNgorI2RlZmluZQlDTEtfU0VMX1AJCTB4MDcKKyNkZWZpbmUJVE9HR0xFX0hJX1AJCTB4MDgKKyNkZWZpbmUJRU1VX1JVTl9QCQkweDA5CisjZGVmaW5lCUVSUl9UWVBfUDAJCTB4MEUKKyNkZWZpbmUJRVJSX1RZUF9QMQkJMHgwRgorCisKKy8qLyAqKioqKioqKioqKioqKioqKioJIEdFTkVSQUwtUFVSUE9TRSBJL08gICoqKioqKioqKioqKioqKioqKioqKiAqLworLyogIEZsYWcgSS9PIChGSU9fKSBNYXNrcyAqLworI2RlZmluZQlQRjAJCQkweDAwMDEKKyNkZWZpbmUJUEYxCQkJMHgwMDAyCisjZGVmaW5lCVBGMgkJCTB4MDAwNAorI2RlZmluZQlQRjMJCQkweDAwMDgKKyNkZWZpbmUJUEY0CQkJMHgwMDEwCisjZGVmaW5lCVBGNQkJCTB4MDAyMAorI2RlZmluZQlQRjYJCQkweDAwNDAKKyNkZWZpbmUJUEY3CQkJMHgwMDgwCisjZGVmaW5lCVBGOAkJCTB4MDEwMAorI2RlZmluZQlQRjkJCQkweDAyMDAKKyNkZWZpbmUJUEYxMAkJMHgwNDAwCisjZGVmaW5lCVBGMTEJCTB4MDgwMAorI2RlZmluZQlQRjEyCQkweDEwMDAKKyNkZWZpbmUJUEYxMwkJMHgyMDAwCisjZGVmaW5lCVBGMTQJCTB4NDAwMAorI2RlZmluZQlQRjE1CQkweDgwMDAKKworLyogIFBPUlQgRiBCSVQgUE9TSVRJT05TICovCisjZGVmaW5lCVBGMF9QCQkweDAKKyNkZWZpbmUJUEYxX1AJCTB4MQorI2RlZmluZQlQRjJfUAkJMHgyCisjZGVmaW5lCVBGM19QCQkweDMKKyNkZWZpbmUJUEY0X1AJCTB4NAorI2RlZmluZQlQRjVfUAkJMHg1CisjZGVmaW5lCVBGNl9QCQkweDYKKyNkZWZpbmUJUEY3X1AJCTB4NworI2RlZmluZQlQRjhfUAkJMHg4CisjZGVmaW5lCVBGOV9QCQkweDkKKyNkZWZpbmUJUEYxMF9QCQkweEEKKyNkZWZpbmUJUEYxMV9QCQkweEIKKyNkZWZpbmUJUEYxMl9QCQkweEMKKyNkZWZpbmUJUEYxM19QCQkweEQKKyNkZWZpbmUJUEYxNF9QCQkweEUKKyNkZWZpbmUJUEYxNV9QCQkweEYKKworCisvKioqKioqKioqKioqKioqKioqKiAgIEdQSU8gTUFTS1MgICoqKioqKioqKioqKioqKioqKioqKi8KKy8qIFBvcnQJQyBNYXNrcyAqLworI2RlZmluZQlQQzAJCTB4MDAwMQorI2RlZmluZQlQQzEJCTB4MDAwMgorI2RlZmluZQlQQzQJCTB4MDAxMAorI2RlZmluZQlQQzUJCTB4MDAyMAorI2RlZmluZQlQQzYJCTB4MDA0MAorI2RlZmluZQlQQzcJCTB4MDA4MAorI2RlZmluZQlQQzgJCTB4MDEwMAorI2RlZmluZQlQQzkJCTB4MDIwMAorLyogUG9ydAlDIEJpdCBQb3NpdGlvbnMgKi8KKyNkZWZpbmUJUEMwX1AJMHgwCisjZGVmaW5lCVBDMV9QCTB4MQorI2RlZmluZQlQQzRfUAkweDQKKyNkZWZpbmUJUEM1X1AJMHg1CisjZGVmaW5lCVBDNl9QCTB4NgorI2RlZmluZQlQQzdfUAkweDcKKyNkZWZpbmUJUEM4X1AJMHg4CisjZGVmaW5lCVBDOV9QCTB4OQorCisvKiBQb3J0CUQgKi8KKyNkZWZpbmUJUEQwCQkweDAwMDEKKyNkZWZpbmUJUEQxCQkweDAwMDIKKyNkZWZpbmUJUEQyCQkweDAwMDQKKyNkZWZpbmUJUEQzCQkweDAwMDgKKyNkZWZpbmUJUEQ0CQkweDAwMTAKKyNkZWZpbmUJUEQ1CQkweDAwMjAKKyNkZWZpbmUJUEQ2CQkweDAwNDAKKyNkZWZpbmUJUEQ3CQkweDAwODAKKyNkZWZpbmUJUEQ4CQkweDAxMDAKKyNkZWZpbmUJUEQ5CQkweDAyMDAKKyNkZWZpbmUJUEQxMAkweDA0MDAKKyNkZWZpbmUJUEQxMQkweDA4MDAKKyNkZWZpbmUJUEQxMgkweDEwMDAKKyNkZWZpbmUJUEQxMwkweDIwMDAKKyNkZWZpbmUJUEQxNAkweDQwMDAKKyNkZWZpbmUJUEQxNQkweDgwMDAKKy8qIFBvcnQJRCBCaXQgUG9zaXRpb25zICovCisjZGVmaW5lCVBEMF9QCTB4MAorI2RlZmluZQlQRDFfUAkweDEKKyNkZWZpbmUJUEQyX1AJMHgyCisjZGVmaW5lCVBEM19QCTB4MworI2RlZmluZQlQRDRfUAkweDQKKyNkZWZpbmUJUEQ1X1AJMHg1CisjZGVmaW5lCVBENl9QCTB4NgorI2RlZmluZQlQRDdfUAkweDcKKyNkZWZpbmUJUEQ4X1AJMHg4CisjZGVmaW5lCVBEOV9QCTB4OQorI2RlZmluZQlQRDEwX1AJMHhBCisjZGVmaW5lCVBEMTFfUAkweEIKKyNkZWZpbmUJUEQxMl9QCTB4QworI2RlZmluZQlQRDEzX1AJMHhECisjZGVmaW5lCVBEMTRfUAkweEUKKyNkZWZpbmUJUEQxNV9QCTB4RgorCisvKiBQb3J0CUUgKi8KKyNkZWZpbmUJUEUwCQkweDAwMDEKKyNkZWZpbmUJUEUxCQkweDAwMDIKKyNkZWZpbmUJUEUyCQkweDAwMDQKKyNkZWZpbmUJUEUzCQkweDAwMDgKKyNkZWZpbmUJUEU0CQkweDAwMTAKKyNkZWZpbmUJUEU1CQkweDAwMjAKKyNkZWZpbmUJUEU2CQkweDAwNDAKKyNkZWZpbmUJUEU3CQkweDAwODAKKyNkZWZpbmUJUEU4CQkweDAxMDAKKyNkZWZpbmUJUEU5CQkweDAyMDAKKyNkZWZpbmUJUEUxMAkweDA0MDAKKyNkZWZpbmUJUEUxMQkweDA4MDAKKyNkZWZpbmUJUEUxMgkweDEwMDAKKyNkZWZpbmUJUEUxMwkweDIwMDAKKyNkZWZpbmUJUEUxNAkweDQwMDAKKyNkZWZpbmUJUEUxNQkweDgwMDAKKy8qIFBvcnQJRSBCaXQgUG9zaXRpb25zICovCisjZGVmaW5lCVBFMF9QCTB4MAorI2RlZmluZQlQRTFfUAkweDEKKyNkZWZpbmUJUEUyX1AJMHgyCisjZGVmaW5lCVBFM19QCTB4MworI2RlZmluZQlQRTRfUAkweDQKKyNkZWZpbmUJUEU1X1AJMHg1CisjZGVmaW5lCVBFNl9QCTB4NgorI2RlZmluZQlQRTdfUAkweDcKKyNkZWZpbmUJUEU4X1AJMHg4CisjZGVmaW5lCVBFOV9QCTB4OQorI2RlZmluZQlQRTEwX1AJMHhBCisjZGVmaW5lCVBFMTFfUAkweEIKKyNkZWZpbmUJUEUxMl9QCTB4QworI2RlZmluZQlQRTEzX1AJMHhECisjZGVmaW5lCVBFMTRfUAkweEUKKyNkZWZpbmUJUEUxNV9QCTB4RgorCisKKy8qICoqKioqKioqKioqCVNFUklBTCBQRVJJUEhFUkFMIElOVEVSRkFDRSAoU1BJKSBNQVNLUwkgKioqKioqKioqKioqKioqKiAqLworLyogU1BJeF9DVEwgTWFza3MgKi8KKyNkZWZpbmUJVElNT0QJCTB4MDAwMwkJLyogVHJhbnNmZXIgSW5pdGlhdGUgTW9kZSAqLworI2RlZmluZQlSREJSX0NPUkUJMHgwMDAwCQkvKgkJUkRCUiBSZWFkIEluaXRpYXRlcywgSVJRIFdoZW4gUkRCUiBGdWxsICovCisjZGVmaW5lCVREQlJfQ09SRQkweDAwMDEJCS8qCQlUREJSIFdyaXRlIEluaXRpYXRlcywgSVJRIFdoZW4gVERCUiBFbXB0eSAqLworI2RlZmluZQlSREJSX0RNQQkweDAwMDIJCS8qCQlETUEgUmVhZCwgRE1BIFVudGlsIEZJRk8gRW1wdHkgKi8KKyNkZWZpbmUJVERCUl9ETUEJMHgwMDAzCQkvKgkJRE1BIFdyaXRlLCBETUEgVW50aWwgRklGTyBGdWxsICovCisjZGVmaW5lCVNaCQkJMHgwMDA0CQkvKiBTZW5kCVplcm8gKFdoZW4gVERCUglFbXB0eSwgU2VuZCBaZXJvL0xhc3QqKSAqLworI2RlZmluZQlHTQkJCTB4MDAwOAkJLyogR2V0IE1vcmUgKFdoZW4gUkRCUiBGdWxsLCBPdmVyd3JpdGUvRGlzY2FyZCopICovCisjZGVmaW5lCVBTU0UJCTB4MDAxMAkJLyogU2xhdmUtU2VsZWN0CUlucHV0IEVuYWJsZSAqLworI2RlZmluZQlFTUlTTwkJMHgwMDIwCQkvKiBFbmFibGUgTUlTTyBBcyBPdXRwdXQgKi8KKyNkZWZpbmUJU0laRQkJMHgwMTAwCQkvKiBTaXplCW9mIFdvcmRzICgxNi84KglCaXRzKSAqLworI2RlZmluZQlMU0JGCQkweDAyMDAJCS8qIExTQiBGaXJzdAkJCSAqLworI2RlZmluZQlDUEhBCQkweDA0MDAJCS8qIENsb2NrIFBoYXNlCQkJICovCisjZGVmaW5lCUNQT0wJCTB4MDgwMAkJLyogQ2xvY2sgUG9sYXJpdHkJCSAqLworI2RlZmluZQlNU1RSCQkweDEwMDAJCS8qIE1hc3Rlci9TbGF2ZSoJCSAqLworI2RlZmluZQlXT00JCQkweDIwMDAJCS8qIFdyaXRlIE9wZW4gRHJhaW4gTWFzdGVyICovCisjZGVmaW5lCVNQRQkJCTB4NDAwMAkJLyogU1BJIEVuYWJsZQkJCSAqLworCisvKiBTUEl4X0ZMRyBNYXNrcyAqLworI2RlZmluZQlGTFMxCTB4MDAwMgkvKiBFbmFibGVzICg9MSkJU1BJX0ZMT1VUMSBhcyBmbGFnIG91dHB1dCBmb3IgU1BJIFNsYXZlLXNlbGVjdCAqLworI2RlZmluZQlGTFMyCTB4MDAwNAkvKiBFbmFibGVzICg9MSkJU1BJX0ZMT1VUMiBhcyBmbGFnIG91dHB1dCBmb3IgU1BJIFNsYXZlLXNlbGVjdCAqLworI2RlZmluZQlGTFMzCTB4MDAwOAkvKiBFbmFibGVzICg9MSkJU1BJX0ZMT1VUMyBhcyBmbGFnIG91dHB1dCBmb3IgU1BJIFNsYXZlLXNlbGVjdCAqLworI2RlZmluZQlGTFM0CTB4MDAxMAkvKiBFbmFibGVzICg9MSkJU1BJX0ZMT1VUNCBhcyBmbGFnIG91dHB1dCBmb3IgU1BJIFNsYXZlLXNlbGVjdCAqLworI2RlZmluZQlGTFM1CTB4MDAyMAkvKiBFbmFibGVzICg9MSkJU1BJX0ZMT1VUNSBhcyBmbGFnIG91dHB1dCBmb3IgU1BJIFNsYXZlLXNlbGVjdCAqLworI2RlZmluZQlGTFM2CTB4MDA0MAkvKiBFbmFibGVzICg9MSkJU1BJX0ZMT1VUNiBhcyBmbGFnIG91dHB1dCBmb3IgU1BJIFNsYXZlLXNlbGVjdCAqLworI2RlZmluZQlGTFM3CTB4MDA4MAkvKiBFbmFibGVzICg9MSkJU1BJX0ZMT1VUNyBhcyBmbGFnIG91dHB1dCBmb3IgU1BJIFNsYXZlLXNlbGVjdCAqLworCisjZGVmaW5lCUZMRzEJMHgwMjAwCS8qIEFjdGl2YXRlcyAoPTApIFNQSV9GTE9VVDEgYXMJZmxhZyBvdXRwdXQgZm9yCVNQSSBTbGF2ZS1zZWxlY3QgICovCisjZGVmaW5lCUZMRzIJMHgwNDAwCS8qIEFjdGl2YXRlcyAoPTApIFNQSV9GTE9VVDIgYXMJZmxhZyBvdXRwdXQgZm9yCVNQSSBTbGF2ZS1zZWxlY3QgKi8KKyNkZWZpbmUJRkxHMwkweDA4MDAJLyogQWN0aXZhdGVzICg9MCkgU1BJX0ZMT1VUMyBhcwlmbGFnIG91dHB1dCBmb3IJU1BJIFNsYXZlLXNlbGVjdCAgKi8KKyNkZWZpbmUJRkxHNAkweDEwMDAJLyogQWN0aXZhdGVzICg9MCkgU1BJX0ZMT1VUNCBhcwlmbGFnIG91dHB1dCBmb3IJU1BJIFNsYXZlLXNlbGVjdCAgKi8KKyNkZWZpbmUJRkxHNQkweDIwMDAJLyogQWN0aXZhdGVzICg9MCkgU1BJX0ZMT1VUNSBhcwlmbGFnIG91dHB1dCBmb3IJU1BJIFNsYXZlLXNlbGVjdCAgKi8KKyNkZWZpbmUJRkxHNgkweDQwMDAJLyogQWN0aXZhdGVzICg9MCkgU1BJX0ZMT1VUNiBhcwlmbGFnIG91dHB1dCBmb3IJU1BJIFNsYXZlLXNlbGVjdCAgKi8KKyNkZWZpbmUJRkxHNwkweDgwMDAJLyogQWN0aXZhdGVzICg9MCkgU1BJX0ZMT1VUNyBhcwlmbGFnIG91dHB1dCBmb3IJU1BJIFNsYXZlLXNlbGVjdCAqLworCisvKiBTUEl4X0ZMRyBCaXQJUG9zaXRpb25zICovCisjZGVmaW5lCUZMUzFfUAkweDAwMDEJLyogRW5hYmxlcyAoPTEpCVNQSV9GTE9VVDEgYXMgZmxhZyBvdXRwdXQgZm9yIFNQSSBTbGF2ZS1zZWxlY3QgKi8KKyNkZWZpbmUJRkxTMl9QCTB4MDAwMgkvKiBFbmFibGVzICg9MSkJU1BJX0ZMT1VUMiBhcyBmbGFnIG91dHB1dCBmb3IgU1BJIFNsYXZlLXNlbGVjdCAqLworI2RlZmluZQlGTFMzX1AJMHgwMDAzCS8qIEVuYWJsZXMgKD0xKQlTUElfRkxPVVQzIGFzIGZsYWcgb3V0cHV0IGZvciBTUEkgU2xhdmUtc2VsZWN0ICovCisjZGVmaW5lCUZMUzRfUAkweDAwMDQJLyogRW5hYmxlcyAoPTEpCVNQSV9GTE9VVDQgYXMgZmxhZyBvdXRwdXQgZm9yIFNQSSBTbGF2ZS1zZWxlY3QgKi8KKyNkZWZpbmUJRkxTNV9QCTB4MDAwNQkvKiBFbmFibGVzICg9MSkJU1BJX0ZMT1VUNSBhcyBmbGFnIG91dHB1dCBmb3IgU1BJIFNsYXZlLXNlbGVjdCAqLworI2RlZmluZQlGTFM2X1AJMHgwMDA2CS8qIEVuYWJsZXMgKD0xKQlTUElfRkxPVVQ2IGFzIGZsYWcgb3V0cHV0IGZvciBTUEkgU2xhdmUtc2VsZWN0ICovCisjZGVmaW5lCUZMUzdfUAkweDAwMDcJLyogRW5hYmxlcyAoPTEpCVNQSV9GTE9VVDcgYXMgZmxhZyBvdXRwdXQgZm9yIFNQSSBTbGF2ZS1zZWxlY3QgKi8KKyNkZWZpbmUJRkxHMV9QCTB4MDAwOQkvKiBBY3RpdmF0ZXMgKD0wKSBTUElfRkxPVVQxIGFzCWZsYWcgb3V0cHV0IGZvcglTUEkgU2xhdmUtc2VsZWN0ICAqLworI2RlZmluZQlGTEcyX1AJMHgwMDBBCS8qIEFjdGl2YXRlcyAoPTApIFNQSV9GTE9VVDIgYXMJZmxhZyBvdXRwdXQgZm9yCVNQSSBTbGF2ZS1zZWxlY3QgKi8KKyNkZWZpbmUJRkxHM19QCTB4MDAwQgkvKiBBY3RpdmF0ZXMgKD0wKSBTUElfRkxPVVQzIGFzCWZsYWcgb3V0cHV0IGZvcglTUEkgU2xhdmUtc2VsZWN0ICAqLworI2RlZmluZQlGTEc0X1AJMHgwMDBDCS8qIEFjdGl2YXRlcyAoPTApIFNQSV9GTE9VVDQgYXMJZmxhZyBvdXRwdXQgZm9yCVNQSSBTbGF2ZS1zZWxlY3QgICovCisjZGVmaW5lCUZMRzVfUAkweDAwMEQJLyogQWN0aXZhdGVzICg9MCkgU1BJX0ZMT1VUNSBhcwlmbGFnIG91dHB1dCBmb3IJU1BJIFNsYXZlLXNlbGVjdCAgKi8KKyNkZWZpbmUJRkxHNl9QCTB4MDAwRQkvKiBBY3RpdmF0ZXMgKD0wKSBTUElfRkxPVVQ2IGFzCWZsYWcgb3V0cHV0IGZvcglTUEkgU2xhdmUtc2VsZWN0ICAqLworI2RlZmluZQlGTEc3X1AJMHgwMDBGCS8qIEFjdGl2YXRlcyAoPTApIFNQSV9GTE9VVDcgYXMJZmxhZyBvdXRwdXQgZm9yCVNQSSBTbGF2ZS1zZWxlY3QgKi8KKworLyogU1BJeF9TVEFUIE1hc2tzICovCisjZGVmaW5lCVNQSUYJMHgwMDAxCS8qIFNldCAoPTEpIHdoZW4gU1BJIHNpbmdsZS13b3JkIHRyYW5zZmVyIGNvbXBsZXRlICovCisjZGVmaW5lCU1PREYJMHgwMDAyCS8qIFNldCAoPTEpIGluIGEgbWFzdGVyCWRldmljZSB3aGVuIHNvbWUgb3RoZXIgZGV2aWNlIHRyaWVzIHRvIGJlY29tZSBtYXN0ZXIgKi8KKyNkZWZpbmUJVFhFCQkweDAwMDQJLyogU2V0ICg9MSkgd2hlbiB0cmFuc21pc3Npb24gb2NjdXJzIHdpdGggbm8gbmV3IGRhdGEgaW4gU1BJX1REQlIgKi8KKyNkZWZpbmUJVFhTCQkweDAwMDgJLyogU1BJX1REQlIgRGF0YSBCdWZmZXIJU3RhdHVzICgwPUVtcHR5LCAxPUZ1bGwpICovCisjZGVmaW5lCVJCU1kJMHgwMDEwCS8qIFNldCAoPTEpIHdoZW4gZGF0YSBpcyByZWNlaXZlZCB3aXRoIFJEQlIgZnVsbCAqLworI2RlZmluZQlSWFMJCTB4MDAyMAkvKiBTUElfUkRCUiBEYXRhIEJ1ZmZlcglTdGF0dXMgKDA9RW1wdHksIDE9RnVsbCkgICovCisjZGVmaW5lCVRYQ09MCTB4MDA0MAkvKiBXaGVuCXNldCAoPTEpLCBjb3JydXB0IGRhdGEgbWF5IGhhdmUJYmVlbiB0cmFuc21pdHRlZCAgKi8KKworLyogU1BJeF9GTEcgTWFza3MJCQkJCQkJCQkJICovCisjZGVmaW5lCUZMRzFFCTB4RkRGRgkJLyogQWN0aXZhdGVzIFNQSV9GTE9VVDEJICovCisjZGVmaW5lCUZMRzJFCTB4RkJGRgkJLyogQWN0aXZhdGVzIFNQSV9GTE9VVDIJICovCisjZGVmaW5lCUZMRzNFCTB4RjdGRgkJLyogQWN0aXZhdGVzIFNQSV9GTE9VVDMJICovCisjZGVmaW5lCUZMRzRFCTB4RUZGRgkJLyogQWN0aXZhdGVzIFNQSV9GTE9VVDQJICovCisjZGVmaW5lCUZMRzVFCTB4REZGRgkJLyogQWN0aXZhdGVzIFNQSV9GTE9VVDUJICovCisjZGVmaW5lCUZMRzZFCTB4QkZGRgkJLyogQWN0aXZhdGVzIFNQSV9GTE9VVDYJICovCisjZGVmaW5lCUZMRzdFCTB4N0ZGRgkJLyogQWN0aXZhdGVzIFNQSV9GTE9VVDcJICovCisKKworLyogKioqKioqKioqKioqKioqKioqKioqICBBU1lOQ0hST05PVVMgTUVNT1JZIENPTlRST0xMRVIgTUFTS1MJKioqKioqKioqKioqKiAqLworLyogRUJJVV9BTUdDVEwgTWFza3MgKi8KKyNkZWZpbmUJQU1DS0VOCQkweDAwMDEJLyogRW5hYmxlIENMS09VVCAqLworI2RlZmluZQlBTUJFTl9OT05FCTB4MDAwMAkvKiBBbGwgQmFua3MgRGlzYWJsZWQgKi8KKyNkZWZpbmUJQU1CRU5fQjAJMHgwMDAyCS8qIEVuYWJsZSBBc3luY2hyb25vdXMgTWVtb3J5IEJhbmsgMCBvbmx5ICovCisjZGVmaW5lCUFNQkVOX0IwX0IxCTB4MDAwNAkvKiBFbmFibGUgQXN5bmNocm9ub3VzIE1lbW9yeSBCYW5rcyAwICYJMSBvbmx5ICovCisjZGVmaW5lCUFNQkVOX0IwX0IxX0IyCTB4MDAwNgkvKiBFbmFibGUgQXN5bmNocm9ub3VzIE1lbW9yeSBCYW5rcyAwLCAxLCBhbmQgMiAqLworI2RlZmluZQlBTUJFTl9BTEwJMHgwMDA4CS8qIEVuYWJsZSBBc3luY2hyb25vdXMgTWVtb3J5IEJhbmtzIChhbGwpIDAsIDEsCTIsIGFuZCAzICovCisjZGVmaW5lCUNEUFJJTwkJMHgwMTAwCS8qIERNQSBoYXMgcHJpb3JpdHkgb3ZlciBjb3JlIGZvciBmb3IgZXh0ZXJuYWwgYWNjZXNzZXMgKi8KKworLyogRUJJVV9BTUdDVEwgQml0IFBvc2l0aW9ucyAqLworI2RlZmluZQlBTUNLRU5fUAkJMHgwMDAwCS8qIEVuYWJsZSBDTEtPVVQgKi8KKyNkZWZpbmUJQU1CRU5fUDAJCTB4MDAwMQkvKiBBc3luY2hyb25vdXMJTWVtb3J5IEVuYWJsZSwgMDAwIC0gYmFua3MgMC0zIGRpc2FibGVkLCAwMDEgLSBCYW5rIDAgZW5hYmxlZCAqLworI2RlZmluZQlBTUJFTl9QMQkJMHgwMDAyCS8qIEFzeW5jaHJvbm91cwlNZW1vcnkgRW5hYmxlLCAwMTAgLSBiYW5rcyAwJjEgZW5hYmxlZCwJIDAxMSAtIGJhbmtzIDAtMyBlbmFibGVkICovCisjZGVmaW5lCUFNQkVOX1AyCQkweDAwMDMJLyogQXN5bmNocm9ub3VzCU1lbW9yeSBFbmFibGUsIDF4eCAtIEFsbCBiYW5rcyAoYmFuayAwLAkxLCAyLCBhbmQgMykgZW5hYmxlZCAqLworCisvKiBFQklVX0FNQkNUTDAJTWFza3MgKi8KKyNkZWZpbmUJQjBSRFlFTgkJCTB4MDAwMDAwMDEgIC8qIEJhbmsgMCBSRFkgRW5hYmxlLCAwPWRpc2FibGUsIDE9ZW5hYmxlICovCisjZGVmaW5lCUIwUkRZUE9MCQkweDAwMDAwMDAyICAvKiBCYW5rIDAgUkRZIEFjdGl2ZSBoaWdoLCAwPWFjdGl2ZQlsb3csIDE9YWN0aXZlIGhpZ2ggKi8KKyNkZWZpbmUJQjBUVF8xCQkJMHgwMDAwMDAwNCAgLyogQmFuayAwIFRyYW5zaXRpb24gVGltZSBmcm9tIFJlYWQJdG8gV3JpdGUgPSAxIGN5Y2xlICovCisjZGVmaW5lCUIwVFRfMgkJCTB4MDAwMDAwMDggIC8qIEJhbmsgMCBUcmFuc2l0aW9uIFRpbWUgZnJvbSBSZWFkCXRvIFdyaXRlID0gMiBjeWNsZXMgKi8KKyNkZWZpbmUJQjBUVF8zCQkJMHgwMDAwMDAwQyAgLyogQmFuayAwIFRyYW5zaXRpb24gVGltZSBmcm9tIFJlYWQJdG8gV3JpdGUgPSAzIGN5Y2xlcyAqLworI2RlZmluZQlCMFRUXzQJCQkweDAwMDAwMDAwICAvKiBCYW5rIDAgVHJhbnNpdGlvbiBUaW1lIGZyb20gUmVhZAl0byBXcml0ZSA9IDQgY3ljbGVzICovCisjZGVmaW5lCUIwU1RfMQkJCTB4MDAwMDAwMTAgIC8qIEJhbmsgMCBTZXR1cCBUaW1lIGZyb20gQU9FIGFzc2VydGVkIHRvIFJlYWQvV3JpdGUgYXNzZXJ0ZWQ9MSBjeWNsZSAqLworI2RlZmluZQlCMFNUXzIJCQkweDAwMDAwMDIwICAvKiBCYW5rIDAgU2V0dXAgVGltZSBmcm9tIEFPRSBhc3NlcnRlZCB0byBSZWFkL1dyaXRlIGFzc2VydGVkPTIgY3ljbGVzICovCisjZGVmaW5lCUIwU1RfMwkJCTB4MDAwMDAwMzAgIC8qIEJhbmsgMCBTZXR1cCBUaW1lIGZyb20gQU9FIGFzc2VydGVkIHRvIFJlYWQvV3JpdGUgYXNzZXJ0ZWQ9MyBjeWNsZXMgKi8KKyNkZWZpbmUJQjBTVF80CQkJMHgwMDAwMDAwMCAgLyogQmFuayAwIFNldHVwIFRpbWUgZnJvbSBBT0UgYXNzZXJ0ZWQgdG8gUmVhZC9Xcml0ZSBhc3NlcnRlZD00IGN5Y2xlcyAqLworI2RlZmluZQlCMEhUXzEJCQkweDAwMDAwMDQwICAvKiBCYW5rIDAgSG9sZCBUaW1lCWZyb20gUmVhZC9Xcml0ZQlkZWFzc2VydGVkIHRvIEFPRSBkZWFzc2VydGVkID0gMSBjeWNsZSAqLworI2RlZmluZQlCMEhUXzIJCQkweDAwMDAwMDgwICAvKiBCYW5rIDAgSG9sZCBUaW1lCWZyb20gUmVhZC9Xcml0ZQlkZWFzc2VydGVkIHRvIEFPRSBkZWFzc2VydGVkID0gMiBjeWNsZXMgKi8KKyNkZWZpbmUJQjBIVF8zCQkJMHgwMDAwMDBDMCAgLyogQmFuayAwIEhvbGQgVGltZQlmcm9tIFJlYWQvV3JpdGUJZGVhc3NlcnRlZCB0byBBT0UgZGVhc3NlcnRlZCA9IDMgY3ljbGVzICovCisjZGVmaW5lCUIwSFRfMAkJCTB4MDAwMDAwMDAgIC8qIEJhbmsgMCBIb2xkIFRpbWUJZnJvbSBSZWFkL1dyaXRlCWRlYXNzZXJ0ZWQgdG8gQU9FIGRlYXNzZXJ0ZWQgPSAwIGN5Y2xlcyAqLworI2RlZmluZQlCMFJBVF8xCQkJMHgwMDAwMDEwMCAgLyogQmFuayAwIFJlYWQgQWNjZXNzIFRpbWUgPSAxIGN5Y2xlICovCisjZGVmaW5lCUIwUkFUXzIJCQkweDAwMDAwMjAwICAvKiBCYW5rIDAgUmVhZCBBY2Nlc3MgVGltZSA9IDIgY3ljbGVzICovCisjZGVmaW5lCUIwUkFUXzMJCQkweDAwMDAwMzAwICAvKiBCYW5rIDAgUmVhZCBBY2Nlc3MgVGltZSA9IDMgY3ljbGVzICovCisjZGVmaW5lCUIwUkFUXzQJCQkweDAwMDAwNDAwICAvKiBCYW5rIDAgUmVhZCBBY2Nlc3MgVGltZSA9IDQgY3ljbGVzICovCisjZGVmaW5lCUIwUkFUXzUJCQkweDAwMDAwNTAwICAvKiBCYW5rIDAgUmVhZCBBY2Nlc3MgVGltZSA9IDUgY3ljbGVzICovCisjZGVmaW5lCUIwUkFUXzYJCQkweDAwMDAwNjAwICAvKiBCYW5rIDAgUmVhZCBBY2Nlc3MgVGltZSA9IDYgY3ljbGVzICovCisjZGVmaW5lCUIwUkFUXzcJCQkweDAwMDAwNzAwICAvKiBCYW5rIDAgUmVhZCBBY2Nlc3MgVGltZSA9IDcgY3ljbGVzICovCisjZGVmaW5lCUIwUkFUXzgJCQkweDAwMDAwODAwICAvKiBCYW5rIDAgUmVhZCBBY2Nlc3MgVGltZSA9IDggY3ljbGVzICovCisjZGVmaW5lCUIwUkFUXzkJCQkweDAwMDAwOTAwICAvKiBCYW5rIDAgUmVhZCBBY2Nlc3MgVGltZSA9IDkgY3ljbGVzICovCisjZGVmaW5lCUIwUkFUXzEwCQkweDAwMDAwQTAwICAvKiBCYW5rIDAgUmVhZCBBY2Nlc3MgVGltZSA9IDEwIGN5Y2xlcyAqLworI2RlZmluZQlCMFJBVF8xMQkJMHgwMDAwMEIwMCAgLyogQmFuayAwIFJlYWQgQWNjZXNzIFRpbWUgPSAxMSBjeWNsZXMgKi8KKyNkZWZpbmUJQjBSQVRfMTIJCTB4MDAwMDBDMDAgIC8qIEJhbmsgMCBSZWFkIEFjY2VzcyBUaW1lID0gMTIgY3ljbGVzICovCisjZGVmaW5lCUIwUkFUXzEzCQkweDAwMDAwRDAwICAvKiBCYW5rIDAgUmVhZCBBY2Nlc3MgVGltZSA9IDEzIGN5Y2xlcyAqLworI2RlZmluZQlCMFJBVF8xNAkJMHgwMDAwMEUwMCAgLyogQmFuayAwIFJlYWQgQWNjZXNzIFRpbWUgPSAxNCBjeWNsZXMgKi8KKyNkZWZpbmUJQjBSQVRfMTUJCTB4MDAwMDBGMDAgIC8qIEJhbmsgMCBSZWFkIEFjY2VzcyBUaW1lID0gMTUgY3ljbGVzICovCisjZGVmaW5lCUIwV0FUXzEJCQkweDAwMDAxMDAwICAvKiBCYW5rIDAgV3JpdGUgQWNjZXNzIFRpbWUJPSAxIGN5Y2xlICovCisjZGVmaW5lCUIwV0FUXzIJCQkweDAwMDAyMDAwICAvKiBCYW5rIDAgV3JpdGUgQWNjZXNzIFRpbWUJPSAyIGN5Y2xlcyAqLworI2RlZmluZQlCMFdBVF8zCQkJMHgwMDAwMzAwMCAgLyogQmFuayAwIFdyaXRlIEFjY2VzcyBUaW1lCT0gMyBjeWNsZXMgKi8KKyNkZWZpbmUJQjBXQVRfNAkJCTB4MDAwMDQwMDAgIC8qIEJhbmsgMCBXcml0ZSBBY2Nlc3MgVGltZQk9IDQgY3ljbGVzICovCisjZGVmaW5lCUIwV0FUXzUJCQkweDAwMDA1MDAwICAvKiBCYW5rIDAgV3JpdGUgQWNjZXNzIFRpbWUJPSA1IGN5Y2xlcyAqLworI2RlZmluZQlCMFdBVF82CQkJMHgwMDAwNjAwMCAgLyogQmFuayAwIFdyaXRlIEFjY2VzcyBUaW1lCT0gNiBjeWNsZXMgKi8KKyNkZWZpbmUJQjBXQVRfNwkJCTB4MDAwMDcwMDAgIC8qIEJhbmsgMCBXcml0ZSBBY2Nlc3MgVGltZQk9IDcgY3ljbGVzICovCisjZGVmaW5lCUIwV0FUXzgJCQkweDAwMDA4MDAwICAvKiBCYW5rIDAgV3JpdGUgQWNjZXNzIFRpbWUJPSA4IGN5Y2xlcyAqLworI2RlZmluZQlCMFdBVF85CQkJMHgwMDAwOTAwMCAgLyogQmFuayAwIFdyaXRlIEFjY2VzcyBUaW1lCT0gOSBjeWNsZXMgKi8KKyNkZWZpbmUJQjBXQVRfMTAJCTB4MDAwMEEwMDAgIC8qIEJhbmsgMCBXcml0ZSBBY2Nlc3MgVGltZQk9IDEwIGN5Y2xlcyAqLworI2RlZmluZQlCMFdBVF8xMQkJMHgwMDAwQjAwMCAgLyogQmFuayAwIFdyaXRlIEFjY2VzcyBUaW1lCT0gMTEgY3ljbGVzICovCisjZGVmaW5lCUIwV0FUXzEyCQkweDAwMDBDMDAwICAvKiBCYW5rIDAgV3JpdGUgQWNjZXNzIFRpbWUJPSAxMiBjeWNsZXMgKi8KKyNkZWZpbmUJQjBXQVRfMTMJCTB4MDAwMEQwMDAgIC8qIEJhbmsgMCBXcml0ZSBBY2Nlc3MgVGltZQk9IDEzIGN5Y2xlcyAqLworI2RlZmluZQlCMFdBVF8xNAkJMHgwMDAwRTAwMCAgLyogQmFuayAwIFdyaXRlIEFjY2VzcyBUaW1lCT0gMTQgY3ljbGVzICovCisjZGVmaW5lCUIwV0FUXzE1CQkweDAwMDBGMDAwICAvKiBCYW5rIDAgV3JpdGUgQWNjZXNzIFRpbWUJPSAxNSBjeWNsZXMgKi8KKyNkZWZpbmUJQjFSRFlFTgkJCTB4MDAwMTAwMDAgIC8qIEJhbmsgMSBSRFkgZW5hYmxlLCAwPWRpc2FibGUsIDE9ZW5hYmxlICovCisjZGVmaW5lCUIxUkRZUE9MCQkweDAwMDIwMDAwICAvKiBCYW5rIDEgUkRZIEFjdGl2ZSBoaWdoLCAwPWFjdGl2ZQlsb3csIDE9YWN0aXZlIGhpZ2ggKi8KKyNkZWZpbmUJQjFUVF8xCQkJMHgwMDA0MDAwMCAgLyogQmFuayAxIFRyYW5zaXRpb24gVGltZSBmcm9tIFJlYWQJdG8gV3JpdGUgPSAxIGN5Y2xlICovCisjZGVmaW5lCUIxVFRfMgkJCTB4MDAwODAwMDAgIC8qIEJhbmsgMSBUcmFuc2l0aW9uIFRpbWUgZnJvbSBSZWFkCXRvIFdyaXRlID0gMiBjeWNsZXMgKi8KKyNkZWZpbmUJQjFUVF8zCQkJMHgwMDBDMDAwMCAgLyogQmFuayAxIFRyYW5zaXRpb24gVGltZSBmcm9tIFJlYWQJdG8gV3JpdGUgPSAzIGN5Y2xlcyAqLworI2RlZmluZQlCMVRUXzQJCQkweDAwMDAwMDAwICAvKiBCYW5rIDEgVHJhbnNpdGlvbiBUaW1lIGZyb20gUmVhZAl0byBXcml0ZSA9IDQgY3ljbGVzICovCisjZGVmaW5lCUIxU1RfMQkJCTB4MDAxMDAwMDAgIC8qIEJhbmsgMSBTZXR1cCBUaW1lIGZyb20gQU9FIGFzc2VydGVkIHRvIFJlYWQgb3IgV3JpdGUgYXNzZXJ0ZWQgPSAxIGN5Y2xlICovCisjZGVmaW5lCUIxU1RfMgkJCTB4MDAyMDAwMDAgIC8qIEJhbmsgMSBTZXR1cCBUaW1lIGZyb20gQU9FIGFzc2VydGVkIHRvIFJlYWQgb3IgV3JpdGUgYXNzZXJ0ZWQgPSAyIGN5Y2xlcyAqLworI2RlZmluZQlCMVNUXzMJCQkweDAwMzAwMDAwICAvKiBCYW5rIDEgU2V0dXAgVGltZSBmcm9tIEFPRSBhc3NlcnRlZCB0byBSZWFkIG9yIFdyaXRlIGFzc2VydGVkID0gMyBjeWNsZXMgKi8KKyNkZWZpbmUJQjFTVF80CQkJMHgwMDAwMDAwMCAgLyogQmFuayAxIFNldHVwIFRpbWUgZnJvbSBBT0UgYXNzZXJ0ZWQgdG8gUmVhZCBvciBXcml0ZSBhc3NlcnRlZCA9IDQgY3ljbGVzICovCisjZGVmaW5lCUIxSFRfMQkJCTB4MDA0MDAwMDAgIC8qIEJhbmsgMSBIb2xkIFRpbWUJZnJvbSBSZWFkIG9yIFdyaXRlIGRlYXNzZXJ0ZWQgdG8gQU9FIGRlYXNzZXJ0ZWQJPSAxIGN5Y2xlICovCisjZGVmaW5lCUIxSFRfMgkJCTB4MDA4MDAwMDAgIC8qIEJhbmsgMSBIb2xkIFRpbWUJZnJvbSBSZWFkIG9yIFdyaXRlIGRlYXNzZXJ0ZWQgdG8gQU9FIGRlYXNzZXJ0ZWQJPSAyIGN5Y2xlcyAqLworI2RlZmluZQlCMUhUXzMJCQkweDAwQzAwMDAwICAvKiBCYW5rIDEgSG9sZCBUaW1lCWZyb20gUmVhZCBvciBXcml0ZSBkZWFzc2VydGVkIHRvIEFPRSBkZWFzc2VydGVkCT0gMyBjeWNsZXMgKi8KKyNkZWZpbmUJQjFIVF8wCQkJMHgwMDAwMDAwMCAgLyogQmFuayAxIEhvbGQgVGltZQlmcm9tIFJlYWQgb3IgV3JpdGUgZGVhc3NlcnRlZCB0byBBT0UgZGVhc3NlcnRlZAk9IDAgY3ljbGVzICovCisjZGVmaW5lCUIxUkFUXzEJCQkweDAxMDAwMDAwICAvKiBCYW5rIDEgUmVhZCBBY2Nlc3MgVGltZSA9IDEgY3ljbGUgKi8KKyNkZWZpbmUJQjFSQVRfMgkJCTB4MDIwMDAwMDAgIC8qIEJhbmsgMSBSZWFkIEFjY2VzcyBUaW1lID0gMiBjeWNsZXMgKi8KKyNkZWZpbmUJQjFSQVRfMwkJCTB4MDMwMDAwMDAgIC8qIEJhbmsgMSBSZWFkIEFjY2VzcyBUaW1lID0gMyBjeWNsZXMgKi8KKyNkZWZpbmUJQjFSQVRfNAkJCTB4MDQwMDAwMDAgIC8qIEJhbmsgMSBSZWFkIEFjY2VzcyBUaW1lID0gNCBjeWNsZXMgKi8KKyNkZWZpbmUJQjFSQVRfNQkJCTB4MDUwMDAwMDAgIC8qIEJhbmsgMSBSZWFkIEFjY2VzcyBUaW1lID0gNSBjeWNsZXMgKi8KKyNkZWZpbmUJQjFSQVRfNgkJCTB4MDYwMDAwMDAgIC8qIEJhbmsgMSBSZWFkIEFjY2VzcyBUaW1lID0gNiBjeWNsZXMgKi8KKyNkZWZpbmUJQjFSQVRfNwkJCTB4MDcwMDAwMDAgIC8qIEJhbmsgMSBSZWFkIEFjY2VzcyBUaW1lID0gNyBjeWNsZXMgKi8KKyNkZWZpbmUJQjFSQVRfOAkJCTB4MDgwMDAwMDAgIC8qIEJhbmsgMSBSZWFkIEFjY2VzcyBUaW1lID0gOCBjeWNsZXMgKi8KKyNkZWZpbmUJQjFSQVRfOQkJCTB4MDkwMDAwMDAgIC8qIEJhbmsgMSBSZWFkIEFjY2VzcyBUaW1lID0gOSBjeWNsZXMgKi8KKyNkZWZpbmUJQjFSQVRfMTAJCTB4MEEwMDAwMDAgIC8qIEJhbmsgMSBSZWFkIEFjY2VzcyBUaW1lID0gMTAgY3ljbGVzICovCisjZGVmaW5lCUIxUkFUXzExCQkweDBCMDAwMDAwICAvKiBCYW5rIDEgUmVhZCBBY2Nlc3MgVGltZSA9IDExIGN5Y2xlcyAqLworI2RlZmluZQlCMVJBVF8xMgkJMHgwQzAwMDAwMCAgLyogQmFuayAxIFJlYWQgQWNjZXNzIFRpbWUgPSAxMiBjeWNsZXMgKi8KKyNkZWZpbmUJQjFSQVRfMTMJCTB4MEQwMDAwMDAgIC8qIEJhbmsgMSBSZWFkIEFjY2VzcyBUaW1lID0gMTMgY3ljbGVzICovCisjZGVmaW5lCUIxUkFUXzE0CQkweDBFMDAwMDAwICAvKiBCYW5rIDEgUmVhZCBBY2Nlc3MgVGltZSA9IDE0IGN5Y2xlcyAqLworI2RlZmluZQlCMVJBVF8xNQkJMHgwRjAwMDAwMCAgLyogQmFuayAxIFJlYWQgQWNjZXNzIFRpbWUgPSAxNSBjeWNsZXMgKi8KKyNkZWZpbmUJQjFXQVRfMQkJCTB4MTAwMDAwMDAgLyogQmFuayAxIFdyaXRlIEFjY2VzcyBUaW1lID0gMSBjeWNsZSAqLworI2RlZmluZQlCMVdBVF8yCQkJMHgyMDAwMDAwMCAgLyogQmFuayAxIFdyaXRlIEFjY2VzcyBUaW1lCT0gMiBjeWNsZXMgKi8KKyNkZWZpbmUJQjFXQVRfMwkJCTB4MzAwMDAwMDAgIC8qIEJhbmsgMSBXcml0ZSBBY2Nlc3MgVGltZQk9IDMgY3ljbGVzICovCisjZGVmaW5lCUIxV0FUXzQJCQkweDQwMDAwMDAwICAvKiBCYW5rIDEgV3JpdGUgQWNjZXNzIFRpbWUJPSA0IGN5Y2xlcyAqLworI2RlZmluZQlCMVdBVF81CQkJMHg1MDAwMDAwMCAgLyogQmFuayAxIFdyaXRlIEFjY2VzcyBUaW1lCT0gNSBjeWNsZXMgKi8KKyNkZWZpbmUJQjFXQVRfNgkJCTB4NjAwMDAwMDAgIC8qIEJhbmsgMSBXcml0ZSBBY2Nlc3MgVGltZQk9IDYgY3ljbGVzICovCisjZGVmaW5lCUIxV0FUXzcJCQkweDcwMDAwMDAwICAvKiBCYW5rIDEgV3JpdGUgQWNjZXNzIFRpbWUJPSA3IGN5Y2xlcyAqLworI2RlZmluZQlCMVdBVF84CQkJMHg4MDAwMDAwMCAgLyogQmFuayAxIFdyaXRlIEFjY2VzcyBUaW1lCT0gOCBjeWNsZXMgKi8KKyNkZWZpbmUJQjFXQVRfOQkJCTB4OTAwMDAwMDAgIC8qIEJhbmsgMSBXcml0ZSBBY2Nlc3MgVGltZQk9IDkgY3ljbGVzICovCisjZGVmaW5lCUIxV0FUXzEwCQkweEEwMDAwMDAwICAvKiBCYW5rIDEgV3JpdGUgQWNjZXNzIFRpbWUJPSAxMCBjeWNsZXMgKi8KKyNkZWZpbmUJQjFXQVRfMTEJCTB4QjAwMDAwMDAgIC8qIEJhbmsgMSBXcml0ZSBBY2Nlc3MgVGltZQk9IDExIGN5Y2xlcyAqLworI2RlZmluZQlCMVdBVF8xMgkJMHhDMDAwMDAwMCAgLyogQmFuayAxIFdyaXRlIEFjY2VzcyBUaW1lCT0gMTIgY3ljbGVzICovCisjZGVmaW5lCUIxV0FUXzEzCQkweEQwMDAwMDAwICAvKiBCYW5rIDEgV3JpdGUgQWNjZXNzIFRpbWUJPSAxMyBjeWNsZXMgKi8KKyNkZWZpbmUJQjFXQVRfMTQJCTB4RTAwMDAwMDAgIC8qIEJhbmsgMSBXcml0ZSBBY2Nlc3MgVGltZQk9IDE0IGN5Y2xlcyAqLworI2RlZmluZQlCMVdBVF8xNQkJMHhGMDAwMDAwMCAgLyogQmFuayAxIFdyaXRlIEFjY2VzcyBUaW1lCT0gMTUgY3ljbGVzICovCisKKy8qIEVCSVVfQU1CQ1RMMQlNYXNrcyAqLworI2RlZmluZQlCMlJEWUVOCQkJMHgwMDAwMDAwMSAgLyogQmFuayAyIFJEWSBFbmFibGUsIDA9ZGlzYWJsZSwgMT1lbmFibGUgKi8KKyNkZWZpbmUJQjJSRFlQT0wJCTB4MDAwMDAwMDIgIC8qIEJhbmsgMiBSRFkgQWN0aXZlIGhpZ2gsIDA9YWN0aXZlCWxvdywgMT1hY3RpdmUgaGlnaCAqLworI2RlZmluZQlCMlRUXzEJCQkweDAwMDAwMDA0ICAvKiBCYW5rIDIgVHJhbnNpdGlvbiBUaW1lIGZyb20gUmVhZAl0byBXcml0ZSA9IDEgY3ljbGUgKi8KKyNkZWZpbmUJQjJUVF8yCQkJMHgwMDAwMDAwOCAgLyogQmFuayAyIFRyYW5zaXRpb24gVGltZSBmcm9tIFJlYWQJdG8gV3JpdGUgPSAyIGN5Y2xlcyAqLworI2RlZmluZQlCMlRUXzMJCQkweDAwMDAwMDBDICAvKiBCYW5rIDIgVHJhbnNpdGlvbiBUaW1lIGZyb20gUmVhZAl0byBXcml0ZSA9IDMgY3ljbGVzICovCisjZGVmaW5lCUIyVFRfNAkJCTB4MDAwMDAwMDAgIC8qIEJhbmsgMiBUcmFuc2l0aW9uIFRpbWUgZnJvbSBSZWFkCXRvIFdyaXRlID0gNCBjeWNsZXMgKi8KKyNkZWZpbmUJQjJTVF8xCQkJMHgwMDAwMDAxMCAgLyogQmFuayAyIFNldHVwIFRpbWUgZnJvbSBBT0UgYXNzZXJ0ZWQgdG8gUmVhZCBvciBXcml0ZSBhc3NlcnRlZCA9IDEgY3ljbGUgKi8KKyNkZWZpbmUJQjJTVF8yCQkJMHgwMDAwMDAyMCAgLyogQmFuayAyIFNldHVwIFRpbWUgZnJvbSBBT0UgYXNzZXJ0ZWQgdG8gUmVhZCBvciBXcml0ZSBhc3NlcnRlZCA9IDIgY3ljbGVzICovCisjZGVmaW5lCUIyU1RfMwkJCTB4MDAwMDAwMzAgIC8qIEJhbmsgMiBTZXR1cCBUaW1lIGZyb20gQU9FIGFzc2VydGVkIHRvIFJlYWQgb3IgV3JpdGUgYXNzZXJ0ZWQgPSAzIGN5Y2xlcyAqLworI2RlZmluZQlCMlNUXzQJCQkweDAwMDAwMDAwICAvKiBCYW5rIDIgU2V0dXAgVGltZSBmcm9tIEFPRSBhc3NlcnRlZCB0byBSZWFkIG9yIFdyaXRlIGFzc2VydGVkID0gNCBjeWNsZXMgKi8KKyNkZWZpbmUJQjJIVF8xCQkJMHgwMDAwMDA0MCAgLyogQmFuayAyIEhvbGQgVGltZQlmcm9tIFJlYWQgb3IgV3JpdGUgZGVhc3NlcnRlZCB0byBBT0UgZGVhc3NlcnRlZAk9IDEgY3ljbGUgKi8KKyNkZWZpbmUJQjJIVF8yCQkJMHgwMDAwMDA4MCAgLyogQmFuayAyIEhvbGQgVGltZQlmcm9tIFJlYWQgb3IgV3JpdGUgZGVhc3NlcnRlZCB0byBBT0UgZGVhc3NlcnRlZAk9IDIgY3ljbGVzICovCisjZGVmaW5lCUIySFRfMwkJCTB4MDAwMDAwQzAgIC8qIEJhbmsgMiBIb2xkIFRpbWUJZnJvbSBSZWFkIG9yIFdyaXRlIGRlYXNzZXJ0ZWQgdG8gQU9FIGRlYXNzZXJ0ZWQJPSAzIGN5Y2xlcyAqLworI2RlZmluZQlCMkhUXzAJCQkweDAwMDAwMDAwICAvKiBCYW5rIDIgSG9sZCBUaW1lCWZyb20gUmVhZCBvciBXcml0ZSBkZWFzc2VydGVkIHRvIEFPRSBkZWFzc2VydGVkCT0gMCBjeWNsZXMgKi8KKyNkZWZpbmUJQjJSQVRfMQkJCTB4MDAwMDAxMDAgIC8qIEJhbmsgMiBSZWFkIEFjY2VzcyBUaW1lID0gMSBjeWNsZSAqLworI2RlZmluZQlCMlJBVF8yCQkJMHgwMDAwMDIwMCAgLyogQmFuayAyIFJlYWQgQWNjZXNzIFRpbWUgPSAyIGN5Y2xlcyAqLworI2RlZmluZQlCMlJBVF8zCQkJMHgwMDAwMDMwMCAgLyogQmFuayAyIFJlYWQgQWNjZXNzIFRpbWUgPSAzIGN5Y2xlcyAqLworI2RlZmluZQlCMlJBVF80CQkJMHgwMDAwMDQwMCAgLyogQmFuayAyIFJlYWQgQWNjZXNzIFRpbWUgPSA0IGN5Y2xlcyAqLworI2RlZmluZQlCMlJBVF81CQkJMHgwMDAwMDUwMCAgLyogQmFuayAyIFJlYWQgQWNjZXNzIFRpbWUgPSA1IGN5Y2xlcyAqLworI2RlZmluZQlCMlJBVF82CQkJMHgwMDAwMDYwMCAgLyogQmFuayAyIFJlYWQgQWNjZXNzIFRpbWUgPSA2IGN5Y2xlcyAqLworI2RlZmluZQlCMlJBVF83CQkJMHgwMDAwMDcwMCAgLyogQmFuayAyIFJlYWQgQWNjZXNzIFRpbWUgPSA3IGN5Y2xlcyAqLworI2RlZmluZQlCMlJBVF84CQkJMHgwMDAwMDgwMCAgLyogQmFuayAyIFJlYWQgQWNjZXNzIFRpbWUgPSA4IGN5Y2xlcyAqLworI2RlZmluZQlCMlJBVF85CQkJMHgwMDAwMDkwMCAgLyogQmFuayAyIFJlYWQgQWNjZXNzIFRpbWUgPSA5IGN5Y2xlcyAqLworI2RlZmluZQlCMlJBVF8xMAkJMHgwMDAwMEEwMCAgLyogQmFuayAyIFJlYWQgQWNjZXNzIFRpbWUgPSAxMCBjeWNsZXMgKi8KKyNkZWZpbmUJQjJSQVRfMTEJCTB4MDAwMDBCMDAgIC8qIEJhbmsgMiBSZWFkIEFjY2VzcyBUaW1lID0gMTEgY3ljbGVzICovCisjZGVmaW5lCUIyUkFUXzEyCQkweDAwMDAwQzAwICAvKiBCYW5rIDIgUmVhZCBBY2Nlc3MgVGltZSA9IDEyIGN5Y2xlcyAqLworI2RlZmluZQlCMlJBVF8xMwkJMHgwMDAwMEQwMCAgLyogQmFuayAyIFJlYWQgQWNjZXNzIFRpbWUgPSAxMyBjeWNsZXMgKi8KKyNkZWZpbmUJQjJSQVRfMTQJCTB4MDAwMDBFMDAgIC8qIEJhbmsgMiBSZWFkIEFjY2VzcyBUaW1lID0gMTQgY3ljbGVzICovCisjZGVmaW5lCUIyUkFUXzE1CQkweDAwMDAwRjAwICAvKiBCYW5rIDIgUmVhZCBBY2Nlc3MgVGltZSA9IDE1IGN5Y2xlcyAqLworI2RlZmluZQlCMldBVF8xCQkJMHgwMDAwMTAwMCAgLyogQmFuayAyIFdyaXRlIEFjY2VzcyBUaW1lCT0gMSBjeWNsZSAqLworI2RlZmluZQlCMldBVF8yCQkJMHgwMDAwMjAwMCAgLyogQmFuayAyIFdyaXRlIEFjY2VzcyBUaW1lCT0gMiBjeWNsZXMgKi8KKyNkZWZpbmUJQjJXQVRfMwkJCTB4MDAwMDMwMDAgIC8qIEJhbmsgMiBXcml0ZSBBY2Nlc3MgVGltZQk9IDMgY3ljbGVzICovCisjZGVmaW5lCUIyV0FUXzQJCQkweDAwMDA0MDAwICAvKiBCYW5rIDIgV3JpdGUgQWNjZXNzIFRpbWUJPSA0IGN5Y2xlcyAqLworI2RlZmluZQlCMldBVF81CQkJMHgwMDAwNTAwMCAgLyogQmFuayAyIFdyaXRlIEFjY2VzcyBUaW1lCT0gNSBjeWNsZXMgKi8KKyNkZWZpbmUJQjJXQVRfNgkJCTB4MDAwMDYwMDAgIC8qIEJhbmsgMiBXcml0ZSBBY2Nlc3MgVGltZQk9IDYgY3ljbGVzICovCisjZGVmaW5lCUIyV0FUXzcJCQkweDAwMDA3MDAwICAvKiBCYW5rIDIgV3JpdGUgQWNjZXNzIFRpbWUJPSA3IGN5Y2xlcyAqLworI2RlZmluZQlCMldBVF84CQkJMHgwMDAwODAwMCAgLyogQmFuayAyIFdyaXRlIEFjY2VzcyBUaW1lCT0gOCBjeWNsZXMgKi8KKyNkZWZpbmUJQjJXQVRfOQkJCTB4MDAwMDkwMDAgIC8qIEJhbmsgMiBXcml0ZSBBY2Nlc3MgVGltZQk9IDkgY3ljbGVzICovCisjZGVmaW5lCUIyV0FUXzEwCQkweDAwMDBBMDAwICAvKiBCYW5rIDIgV3JpdGUgQWNjZXNzIFRpbWUJPSAxMCBjeWNsZXMgKi8KKyNkZWZpbmUJQjJXQVRfMTEJCTB4MDAwMEIwMDAgIC8qIEJhbmsgMiBXcml0ZSBBY2Nlc3MgVGltZQk9IDExIGN5Y2xlcyAqLworI2RlZmluZQlCMldBVF8xMgkJMHgwMDAwQzAwMCAgLyogQmFuayAyIFdyaXRlIEFjY2VzcyBUaW1lCT0gMTIgY3ljbGVzICovCisjZGVmaW5lCUIyV0FUXzEzCQkweDAwMDBEMDAwICAvKiBCYW5rIDIgV3JpdGUgQWNjZXNzIFRpbWUJPSAxMyBjeWNsZXMgKi8KKyNkZWZpbmUJQjJXQVRfMTQJCTB4MDAwMEUwMDAgIC8qIEJhbmsgMiBXcml0ZSBBY2Nlc3MgVGltZQk9IDE0IGN5Y2xlcyAqLworI2RlZmluZQlCMldBVF8xNQkJMHgwMDAwRjAwMCAgLyogQmFuayAyIFdyaXRlIEFjY2VzcyBUaW1lCT0gMTUgY3ljbGVzICovCisjZGVmaW5lCUIzUkRZRU4JCQkweDAwMDEwMDAwICAvKiBCYW5rIDMgUkRZIGVuYWJsZSwgMD1kaXNhYmxlLCAxPWVuYWJsZSAqLworI2RlZmluZQlCM1JEWVBPTAkJMHgwMDAyMDAwMCAgLyogQmFuayAzIFJEWSBBY3RpdmUgaGlnaCwgMD1hY3RpdmUJbG93LCAxPWFjdGl2ZSBoaWdoICovCisjZGVmaW5lCUIzVFRfMQkJCTB4MDAwNDAwMDAgIC8qIEJhbmsgMyBUcmFuc2l0aW9uIFRpbWUgZnJvbSBSZWFkCXRvIFdyaXRlID0gMSBjeWNsZSAqLworI2RlZmluZQlCM1RUXzIJCQkweDAwMDgwMDAwICAvKiBCYW5rIDMgVHJhbnNpdGlvbiBUaW1lIGZyb20gUmVhZAl0byBXcml0ZSA9IDIgY3ljbGVzICovCisjZGVmaW5lCUIzVFRfMwkJCTB4MDAwQzAwMDAgIC8qIEJhbmsgMyBUcmFuc2l0aW9uIFRpbWUgZnJvbSBSZWFkCXRvIFdyaXRlID0gMyBjeWNsZXMgKi8KKyNkZWZpbmUJQjNUVF80CQkJMHgwMDAwMDAwMCAgLyogQmFuayAzIFRyYW5zaXRpb24gVGltZSBmcm9tIFJlYWQJdG8gV3JpdGUgPSA0IGN5Y2xlcyAqLworI2RlZmluZQlCM1NUXzEJCQkweDAwMTAwMDAwICAvKiBCYW5rIDMgU2V0dXAgVGltZSBmcm9tIEFPRSBhc3NlcnRlZCB0byBSZWFkIG9yIFdyaXRlIGFzc2VydGVkID0gMSBjeWNsZSAqLworI2RlZmluZQlCM1NUXzIJCQkweDAwMjAwMDAwICAvKiBCYW5rIDMgU2V0dXAgVGltZSBmcm9tIEFPRSBhc3NlcnRlZCB0byBSZWFkIG9yIFdyaXRlIGFzc2VydGVkID0gMiBjeWNsZXMgKi8KKyNkZWZpbmUJQjNTVF8zCQkJMHgwMDMwMDAwMCAgLyogQmFuayAzIFNldHVwIFRpbWUgZnJvbSBBT0UgYXNzZXJ0ZWQgdG8gUmVhZCBvciBXcml0ZSBhc3NlcnRlZCA9IDMgY3ljbGVzICovCisjZGVmaW5lCUIzU1RfNAkJCTB4MDAwMDAwMDAgIC8qIEJhbmsgMyBTZXR1cCBUaW1lIGZyb20gQU9FIGFzc2VydGVkIHRvIFJlYWQgb3IgV3JpdGUgYXNzZXJ0ZWQgPSA0IGN5Y2xlcyAqLworI2RlZmluZQlCM0hUXzEJCQkweDAwNDAwMDAwICAvKiBCYW5rIDMgSG9sZCBUaW1lCWZyb20gUmVhZCBvciBXcml0ZSBkZWFzc2VydGVkIHRvIEFPRSBkZWFzc2VydGVkCT0gMSBjeWNsZSAqLworI2RlZmluZQlCM0hUXzIJCQkweDAwODAwMDAwICAvKiBCYW5rIDMgSG9sZCBUaW1lCWZyb20gUmVhZCBvciBXcml0ZSBkZWFzc2VydGVkIHRvIEFPRSBkZWFzc2VydGVkCT0gMiBjeWNsZXMgKi8KKyNkZWZpbmUJQjNIVF8zCQkJMHgwMEMwMDAwMCAgLyogQmFuayAzIEhvbGQgVGltZQlmcm9tIFJlYWQgb3IgV3JpdGUgZGVhc3NlcnRlZCB0byBBT0UgZGVhc3NlcnRlZAk9IDMgY3ljbGVzICovCisjZGVmaW5lCUIzSFRfMAkJCTB4MDAwMDAwMDAgIC8qIEJhbmsgMyBIb2xkIFRpbWUJZnJvbSBSZWFkIG9yIFdyaXRlIGRlYXNzZXJ0ZWQgdG8gQU9FIGRlYXNzZXJ0ZWQJPSAwIGN5Y2xlcyAqLworI2RlZmluZQlCM1JBVF8xCQkJMHgwMTAwMDAwMCAvKiBCYW5rIDMgUmVhZCBBY2Nlc3MgVGltZSA9CTEgY3ljbGUgKi8KKyNkZWZpbmUJQjNSQVRfMgkJCTB4MDIwMDAwMDAgIC8qIEJhbmsgMyBSZWFkIEFjY2VzcyBUaW1lID0gMiBjeWNsZXMgKi8KKyNkZWZpbmUJQjNSQVRfMwkJCTB4MDMwMDAwMDAgIC8qIEJhbmsgMyBSZWFkIEFjY2VzcyBUaW1lID0gMyBjeWNsZXMgKi8KKyNkZWZpbmUJQjNSQVRfNAkJCTB4MDQwMDAwMDAgIC8qIEJhbmsgMyBSZWFkIEFjY2VzcyBUaW1lID0gNCBjeWNsZXMgKi8KKyNkZWZpbmUJQjNSQVRfNQkJCTB4MDUwMDAwMDAgIC8qIEJhbmsgMyBSZWFkIEFjY2VzcyBUaW1lID0gNSBjeWNsZXMgKi8KKyNkZWZpbmUJQjNSQVRfNgkJCTB4MDYwMDAwMDAgIC8qIEJhbmsgMyBSZWFkIEFjY2VzcyBUaW1lID0gNiBjeWNsZXMgKi8KKyNkZWZpbmUJQjNSQVRfNwkJCTB4MDcwMDAwMDAgIC8qIEJhbmsgMyBSZWFkIEFjY2VzcyBUaW1lID0gNyBjeWNsZXMgKi8KKyNkZWZpbmUJQjNSQVRfOAkJCTB4MDgwMDAwMDAgIC8qIEJhbmsgMyBSZWFkIEFjY2VzcyBUaW1lID0gOCBjeWNsZXMgKi8KKyNkZWZpbmUJQjNSQVRfOQkJCTB4MDkwMDAwMDAgIC8qIEJhbmsgMyBSZWFkIEFjY2VzcyBUaW1lID0gOSBjeWNsZXMgKi8KKyNkZWZpbmUJQjNSQVRfMTAJCTB4MEEwMDAwMDAgIC8qIEJhbmsgMyBSZWFkIEFjY2VzcyBUaW1lID0gMTAgY3ljbGVzICovCisjZGVmaW5lCUIzUkFUXzExCQkweDBCMDAwMDAwICAvKiBCYW5rIDMgUmVhZCBBY2Nlc3MgVGltZSA9IDExIGN5Y2xlcyAqLworI2RlZmluZQlCM1JBVF8xMgkJMHgwQzAwMDAwMCAgLyogQmFuayAzIFJlYWQgQWNjZXNzIFRpbWUgPSAxMiBjeWNsZXMgKi8KKyNkZWZpbmUJQjNSQVRfMTMJCTB4MEQwMDAwMDAgIC8qIEJhbmsgMyBSZWFkIEFjY2VzcyBUaW1lID0gMTMgY3ljbGVzICovCisjZGVmaW5lCUIzUkFUXzE0CQkweDBFMDAwMDAwICAvKiBCYW5rIDMgUmVhZCBBY2Nlc3MgVGltZSA9IDE0IGN5Y2xlcyAqLworI2RlZmluZQlCM1JBVF8xNQkJMHgwRjAwMDAwMCAgLyogQmFuayAzIFJlYWQgQWNjZXNzIFRpbWUgPSAxNSBjeWNsZXMgKi8KKyNkZWZpbmUJQjNXQVRfMQkJCTB4MTAwMDAwMDAgLyogQmFuayAzIFdyaXRlIEFjY2VzcyBUaW1lID0gMSBjeWNsZSAqLworI2RlZmluZQlCM1dBVF8yCQkJMHgyMDAwMDAwMCAgLyogQmFuayAzIFdyaXRlIEFjY2VzcyBUaW1lCT0gMiBjeWNsZXMgKi8KKyNkZWZpbmUJQjNXQVRfMwkJCTB4MzAwMDAwMDAgIC8qIEJhbmsgMyBXcml0ZSBBY2Nlc3MgVGltZQk9IDMgY3ljbGVzICovCisjZGVmaW5lCUIzV0FUXzQJCQkweDQwMDAwMDAwICAvKiBCYW5rIDMgV3JpdGUgQWNjZXNzIFRpbWUJPSA0IGN5Y2xlcyAqLworI2RlZmluZQlCM1dBVF81CQkJMHg1MDAwMDAwMCAgLyogQmFuayAzIFdyaXRlIEFjY2VzcyBUaW1lCT0gNSBjeWNsZXMgKi8KKyNkZWZpbmUJQjNXQVRfNgkJCTB4NjAwMDAwMDAgIC8qIEJhbmsgMyBXcml0ZSBBY2Nlc3MgVGltZQk9IDYgY3ljbGVzICovCisjZGVmaW5lCUIzV0FUXzcJCQkweDcwMDAwMDAwICAvKiBCYW5rIDMgV3JpdGUgQWNjZXNzIFRpbWUJPSA3IGN5Y2xlcyAqLworI2RlZmluZQlCM1dBVF84CQkJMHg4MDAwMDAwMCAgLyogQmFuayAzIFdyaXRlIEFjY2VzcyBUaW1lCT0gOCBjeWNsZXMgKi8KKyNkZWZpbmUJQjNXQVRfOQkJCTB4OTAwMDAwMDAgIC8qIEJhbmsgMyBXcml0ZSBBY2Nlc3MgVGltZQk9IDkgY3ljbGVzICovCisjZGVmaW5lCUIzV0FUXzEwCQkweEEwMDAwMDAwICAvKiBCYW5rIDMgV3JpdGUgQWNjZXNzIFRpbWUJPSAxMCBjeWNsZXMgKi8KKyNkZWZpbmUJQjNXQVRfMTEJCTB4QjAwMDAwMDAgIC8qIEJhbmsgMyBXcml0ZSBBY2Nlc3MgVGltZQk9IDExIGN5Y2xlcyAqLworI2RlZmluZQlCM1dBVF8xMgkJMHhDMDAwMDAwMCAgLyogQmFuayAzIFdyaXRlIEFjY2VzcyBUaW1lCT0gMTIgY3ljbGVzICovCisjZGVmaW5lCUIzV0FUXzEzCQkweEQwMDAwMDAwICAvKiBCYW5rIDMgV3JpdGUgQWNjZXNzIFRpbWUJPSAxMyBjeWNsZXMgKi8KKyNkZWZpbmUJQjNXQVRfMTQJCTB4RTAwMDAwMDAgIC8qIEJhbmsgMyBXcml0ZSBBY2Nlc3MgVGltZQk9IDE0IGN5Y2xlcyAqLworI2RlZmluZQlCM1dBVF8xNQkJMHhGMDAwMDAwMCAgLyogQmFuayAzIFdyaXRlIEFjY2VzcyBUaW1lCT0gMTUgY3ljbGVzICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKiogIFNEUkFNIENPTlRST0xMRVIgTUFTS1MgICoqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworLyogRUJJVV9TREdDVEwgTWFza3MgKi8KKyNkZWZpbmUJU0NUTEUJCQkweDAwMDAwMDAxIC8qIEVuYWJsZSBTQ0xLWzBdLCAvU1JBUywgL1NDQVMsIC9TV0UsIFNEUU1bMzowXSAqLworI2RlZmluZQlDTF8yCQkJMHgwMDAwMDAwOCAvKiBTRFJBTSBDQVMJbGF0ZW5jeQk9IDIgY3ljbGVzICovCisjZGVmaW5lCUNMXzMJCQkweDAwMDAwMDBDIC8qIFNEUkFNIENBUwlsYXRlbmN5CT0gMyBjeWNsZXMgKi8KKyNkZWZpbmUJUEZFCQkJCTB4MDAwMDAwMTAgLyogRW5hYmxlIFNEUkFNIHByZWZldGNoICovCisjZGVmaW5lCVBGUAkJCQkweDAwMDAwMDIwIC8qIFByZWZldGNoIGhhcyBwcmlvcml0eSBvdmVyIEFNQyByZXF1ZXN0cyAqLworI2RlZmluZQlQQVNSX0FMTAkJMHgwMDAwMDAwMAkvKiBBbGwgNCBTRFJBTSBCYW5rcyBSZWZyZXNoZWQgSW4gU2VsZi1SZWZyZXNoICovCisjZGVmaW5lCVBBU1JfQjBfQjEJCTB4MDAwMDAwMTAJLyogU0RSQU0gQmFua3MgMCBhbmQgMSBBcmUgUmVmcmVzaGVkIEluCVNlbGYtUmVmcmVzaCAqLworI2RlZmluZQlQQVNSX0IwCQkJMHgwMDAwMDAyMAkvKiBPbmx5CVNEUkFNIEJhbmsgMCBJcwlSZWZyZXNoZWQgSW4gU2VsZi1SZWZyZXNoICovCisjZGVmaW5lCVRSQVNfMQkJCTB4MDAwMDAwNDAgLyogU0RSQU0gdFJBUyA9IDEgY3ljbGUgKi8KKyNkZWZpbmUJVFJBU18yCQkJMHgwMDAwMDA4MCAvKiBTRFJBTSB0UkFTID0gMiBjeWNsZXMgKi8KKyNkZWZpbmUJVFJBU18zCQkJMHgwMDAwMDBDMCAvKiBTRFJBTSB0UkFTID0gMyBjeWNsZXMgKi8KKyNkZWZpbmUJVFJBU180CQkJMHgwMDAwMDEwMCAvKiBTRFJBTSB0UkFTID0gNCBjeWNsZXMgKi8KKyNkZWZpbmUJVFJBU181CQkJMHgwMDAwMDE0MCAvKiBTRFJBTSB0UkFTID0gNSBjeWNsZXMgKi8KKyNkZWZpbmUJVFJBU182CQkJMHgwMDAwMDE4MCAvKiBTRFJBTSB0UkFTID0gNiBjeWNsZXMgKi8KKyNkZWZpbmUJVFJBU183CQkJMHgwMDAwMDFDMCAvKiBTRFJBTSB0UkFTID0gNyBjeWNsZXMgKi8KKyNkZWZpbmUJVFJBU184CQkJMHgwMDAwMDIwMCAvKiBTRFJBTSB0UkFTID0gOCBjeWNsZXMgKi8KKyNkZWZpbmUJVFJBU185CQkJMHgwMDAwMDI0MCAvKiBTRFJBTSB0UkFTID0gOSBjeWNsZXMgKi8KKyNkZWZpbmUJVFJBU18xMAkJCTB4MDAwMDAyODAgLyogU0RSQU0gdFJBUyA9IDEwIGN5Y2xlcyAqLworI2RlZmluZQlUUkFTXzExCQkJMHgwMDAwMDJDMCAvKiBTRFJBTSB0UkFTID0gMTEgY3ljbGVzICovCisjZGVmaW5lCVRSQVNfMTIJCQkweDAwMDAwMzAwIC8qIFNEUkFNIHRSQVMgPSAxMiBjeWNsZXMgKi8KKyNkZWZpbmUJVFJBU18xMwkJCTB4MDAwMDAzNDAgLyogU0RSQU0gdFJBUyA9IDEzIGN5Y2xlcyAqLworI2RlZmluZQlUUkFTXzE0CQkJMHgwMDAwMDM4MCAvKiBTRFJBTSB0UkFTID0gMTQgY3ljbGVzICovCisjZGVmaW5lCVRSQVNfMTUJCQkweDAwMDAwM0MwIC8qIFNEUkFNIHRSQVMgPSAxNSBjeWNsZXMgKi8KKyNkZWZpbmUJVFJQXzEJCQkweDAwMDAwODAwIC8qIFNEUkFNIHRSUAk9IDEgY3ljbGUgKi8KKyNkZWZpbmUJVFJQXzIJCQkweDAwMDAxMDAwIC8qIFNEUkFNIHRSUAk9IDIgY3ljbGVzICovCisjZGVmaW5lCVRSUF8zCQkJMHgwMDAwMTgwMCAvKiBTRFJBTSB0UlAJPSAzIGN5Y2xlcyAqLworI2RlZmluZQlUUlBfNAkJCTB4MDAwMDIwMDAgLyogU0RSQU0gdFJQCT0gNCBjeWNsZXMgKi8KKyNkZWZpbmUJVFJQXzUJCQkweDAwMDAyODAwIC8qIFNEUkFNIHRSUAk9IDUgY3ljbGVzICovCisjZGVmaW5lCVRSUF82CQkJMHgwMDAwMzAwMCAvKiBTRFJBTSB0UlAJPSA2IGN5Y2xlcyAqLworI2RlZmluZQlUUlBfNwkJCTB4MDAwMDM4MDAgLyogU0RSQU0gdFJQCT0gNyBjeWNsZXMgKi8KKyNkZWZpbmUJVFJDRF8xCQkJMHgwMDAwODAwMCAvKiBTRFJBTSB0UkNEID0gMSBjeWNsZSAqLworI2RlZmluZQlUUkNEXzIJCQkweDAwMDEwMDAwIC8qIFNEUkFNIHRSQ0QgPSAyIGN5Y2xlcyAqLworI2RlZmluZQlUUkNEXzMJCQkweDAwMDE4MDAwIC8qIFNEUkFNIHRSQ0QgPSAzIGN5Y2xlcyAqLworI2RlZmluZQlUUkNEXzQJCQkweDAwMDIwMDAwIC8qIFNEUkFNIHRSQ0QgPSA0IGN5Y2xlcyAqLworI2RlZmluZQlUUkNEXzUJCQkweDAwMDI4MDAwIC8qIFNEUkFNIHRSQ0QgPSA1IGN5Y2xlcyAqLworI2RlZmluZQlUUkNEXzYJCQkweDAwMDMwMDAwIC8qIFNEUkFNIHRSQ0QgPSA2IGN5Y2xlcyAqLworI2RlZmluZQlUUkNEXzcJCQkweDAwMDM4MDAwIC8qIFNEUkFNIHRSQ0QgPSA3IGN5Y2xlcyAqLworI2RlZmluZQlUV1JfMQkJCTB4MDAwODAwMDAgLyogU0RSQU0gdFdSCT0gMSBjeWNsZSAqLworI2RlZmluZQlUV1JfMgkJCTB4MDAxMDAwMDAgLyogU0RSQU0gdFdSCT0gMiBjeWNsZXMgKi8KKyNkZWZpbmUJVFdSXzMJCQkweDAwMTgwMDAwIC8qIFNEUkFNIHRXUgk9IDMgY3ljbGVzICovCisjZGVmaW5lCVBVUFNECQkJMHgwMDIwMDAwMCAvKlBvd2VyLXVwIHN0YXJ0IGRlbGF5ICovCisjZGVmaW5lCVBTTQkJCQkweDAwNDAwMDAwIC8qIFNEUkFNIHBvd2VyLXVwIHNlcXVlbmNlID0JUHJlY2hhcmdlLCBtb2RlCXJlZ2lzdGVyIHNldCwgOAlDQlIgcmVmcmVzaCBjeWNsZXMgKi8KKyNkZWZpbmUJUFNTCQkJCTB4MDA4MDAwMDAgLyogZW5hYmxlIFNEUkFNIHBvd2VyLXVwIHNlcXVlbmNlIG9uCW5leHQgU0RSQU0gYWNjZXNzICovCisjZGVmaW5lCVNSRlMJCQkweDAxMDAwMDAwIC8qIFN0YXJ0IFNEUkFNIHNlbGYtcmVmcmVzaCBtb2RlICovCisjZGVmaW5lCUVCVUZFCQkJMHgwMjAwMDAwMCAvKiBFbmFibGUgZXh0ZXJuYWwgYnVmZmVyaW5nCXRpbWluZyAqLworI2RlZmluZQlGQkJSVwkJCTB4MDQwMDAwMDAgLyogRmFzdCBiYWNrLXRvLWJhY2sJcmVhZCB3cml0ZSBlbmFibGUgKi8KKyNkZWZpbmUJRU1SRU4JCQkweDEwMDAwMDAwIC8qIEV4dGVuZGVkIG1vZGUgcmVnaXN0ZXIgZW5hYmxlICovCisjZGVmaW5lCVRDU1IJCQkweDIwMDAwMDAwIC8qIFRlbXAgY29tcGVuc2F0ZWQgc2VsZiByZWZyZXNoIHZhbHVlIDg1IGRlZyBDICovCisjZGVmaW5lCUNEREJHCQkJMHg0MDAwMDAwMCAvKiBUcmlzdGF0ZSBTRFJBTSBjb250cm9scyBkdXJpbmcgYnVzIGdyYW50ICovCisKKy8qIEVCSVVfU0RCQ1RMIE1hc2tzICovCisjZGVmaW5lCUVCRQkJCQkweDAwMDAwMDAxIC8qIEVuYWJsZSBTRFJBTSBleHRlcm5hbCBiYW5rICovCisjZGVmaW5lCUVCU1pfMTYJCQkweDAwMDAwMDAwIC8qIFNEUkFNIGV4dGVybmFsIGJhbmsgc2l6ZSA9IDE2TUIgKi8KKyNkZWZpbmUJRUJTWl8zMgkJCTB4MDAwMDAwMDIgLyogU0RSQU0gZXh0ZXJuYWwgYmFuayBzaXplID0gMzJNQiAqLworI2RlZmluZQlFQlNaXzY0CQkJMHgwMDAwMDAwNCAvKiBTRFJBTSBleHRlcm5hbCBiYW5rIHNpemUgPSA2NE1CICovCisjZGVmaW5lCUVCU1pfMTI4CQkweDAwMDAwMDA2IC8qIFNEUkFNIGV4dGVybmFsIGJhbmsgc2l6ZSA9IDEyOE1CICovCisjZGVmaW5lCUVCU1pfMjU2CQkweDAwMDAwMDA4IC8qIFNEUkFNIEV4dGVybmFsIEJhbmsgU2l6ZSA9IDI1Nk1CICovCisjZGVmaW5lCUVCU1pfNTEyCQkweDAwMDAwMDBBIC8qIFNEUkFNIEV4dGVybmFsIEJhbmsgU2l6ZSA9IDUxMk1CICovCisjZGVmaW5lCUVCQ0FXXzgJCQkweDAwMDAwMDAwIC8qIFNEUkFNIGV4dGVybmFsIGJhbmsgY29sdW1uIGFkZHJlc3Mgd2lkdGggPSA4IGJpdHMgKi8KKyNkZWZpbmUJRUJDQVdfOQkJCTB4MDAwMDAwMTAgLyogU0RSQU0gZXh0ZXJuYWwgYmFuayBjb2x1bW4gYWRkcmVzcyB3aWR0aCA9IDkgYml0cyAqLworI2RlZmluZQlFQkNBV18xMAkJMHgwMDAwMDAyMCAvKiBTRFJBTSBleHRlcm5hbCBiYW5rIGNvbHVtbiBhZGRyZXNzIHdpZHRoID0gOSBiaXRzICovCisjZGVmaW5lCUVCQ0FXXzExCQkweDAwMDAwMDMwIC8qIFNEUkFNIGV4dGVybmFsIGJhbmsgY29sdW1uIGFkZHJlc3Mgd2lkdGggPSA5IGJpdHMgKi8KKworLyogRUJJVV9TRFNUQVQgTWFza3MgKi8KKyNkZWZpbmUJU0RDSQkJCTB4MDAwMDAwMDEgLyogU0RSQU0gY29udHJvbGxlciBpcyBpZGxlICovCisjZGVmaW5lCVNEU1JBCQkJMHgwMDAwMDAwMiAvKiBTRFJBTSBTRFJBTSBzZWxmIHJlZnJlc2ggaXMgYWN0aXZlICovCisjZGVmaW5lCVNEUFVBCQkJMHgwMDAwMDAwNCAvKiBTRFJBTSBwb3dlciB1cCBhY3RpdmUgICovCisjZGVmaW5lCVNEUlMJCQkweDAwMDAwMDA4IC8qIFNEUkFNIGlzIGluIHJlc2V0CXN0YXRlICovCisjZGVmaW5lCVNERUFTRQkJCTB4MDAwMDAwMTAgLyogU0RSQU0gRUFCCXN0aWNreSBlcnJvciBzdGF0dXMgLSBXMUMgKi8KKyNkZWZpbmUJQkdTVEFUCQkJMHgwMDAwMDAyMCAvKiBCdXMgZ3JhbnRlZCAqLworCisKKy8qICAqKioqKioqKioqKioqKioqKioqKiAgVFdPLVdJUkUgSU5URVJGQUNFIChUV0l4KSBNQVNLUyAgKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBUV0l4X0NMS0RJViBNYWNyb3MgKFVzZTogKnBUV0l4X0NMS0RJViA9IENMS0xPVyh4KXxDTEtISSh5KTsJICkgKi8KKyNpZmRlZiBfTUlTUkFfUlVMRVMKKyNkZWZpbmUJQ0xLTE9XKHgpCSgoeCkgJiAweEZGdSkJCS8qIFBlcmlvZHMgQ2xvY2sgSXMgSGVsZCBMb3cgKi8KKyNkZWZpbmUJQ0xLSEkoeSkJKCgoeSkmMHhGRnUpPDwweDgpCS8qIFBlcmlvZHMgQmVmb3JlIE5ldyBDbG9jayBMb3cgKi8KKyNlbHNlCisjZGVmaW5lCUNMS0xPVyh4KQkoKHgpICYgMHhGRikJCS8qIFBlcmlvZHMgQ2xvY2sgSXMgSGVsZCBMb3cgKi8KKyNkZWZpbmUJQ0xLSEkoeSkJKCgoeSkmMHhGRik8PDB4OCkJLyogUGVyaW9kcyBCZWZvcmUgTmV3IENsb2NrIExvdyAqLworI2VuZGlmIC8qIF9NSVNSQV9SVUxFUyAqLworCisvKiBUV0l4X1BSRVNDQUxFIE1hc2tzCQkJCQkJCQkgKi8KKyNkZWZpbmUJUFJFU0NBTEUJMHgwMDdGCQkvKiBTQ0xLcyBQZXIgSW50ZXJuYWwgVGltZSBSZWZlcmVuY2UgKDEwTUh6KSAqLworI2RlZmluZQlUV0lfRU5BCQkweDAwODAJCS8qIFRXSSBFbmFibGUJCSAqLworI2RlZmluZQlTQ0NCCQkweDAyMDAJCS8qIFNDQ0IJQ29tcGF0aWJpbGl0eSBFbmFibGUgKi8KKworLyogVFdJeF9TTEFWRV9DVFJMIE1hc2tzCQkJCQkJCQkgKi8KKyNkZWZpbmUJU0VOCQkJMHgwMDAxCQkvKiBTbGF2ZSBFbmFibGUJCSAqLworI2RlZmluZQlTQUREX0xFTgkweDAwMDIJCS8qIFNsYXZlIEFkZHJlc3MgTGVuZ3RoICovCisjZGVmaW5lCVNURFZBTAkJMHgwMDA0CQkvKiBTbGF2ZSBUcmFuc21pdCBEYXRhIFZhbGlkICovCisjZGVmaW5lCU5BSwkJCTB4MDAwOAkJLyogTkFLL0FDSyogR2VuZXJhdGVkIEF0IENvbmNsdXNpb24gT2YgVHJhbnNmZXIgKi8KKyNkZWZpbmUJR0VOCQkJMHgwMDEwCQkvKiBHZW5lcmFsIENhbGwJQWRycmVzcwlNYXRjaGluZyBFbmFibGVkICovCisKKy8qIFRXSXhfU0xBVkVfU1RBVCBNYXNrcwkJCQkJCQkJICovCisjZGVmaW5lCVNESVIJCTB4MDAwMQkJLyogU2xhdmUgVHJhbnNmZXIgRGlyZWN0aW9uIChUcmFuc21pdC9SZWNlaXZlKikgKi8KKyNkZWZpbmUJR0NBTEwJCTB4MDAwMgkJLyogR2VuZXJhbCBDYWxsCUluZGljYXRvciAqLworCisvKiBUV0l4X01BU1RFUl9DVFJMIE1hc2tzCQkJCQkJICovCisjZGVmaW5lCU1FTgkJCTB4MDAwMQkJLyogTWFzdGVyIE1vZGUgRW5hYmxlICovCisjZGVmaW5lCU1BRERfTEVOCTB4MDAwMgkJLyogTWFzdGVyIEFkZHJlc3MgTGVuZ3RoICovCisjZGVmaW5lCU1ESVIJCTB4MDAwNAkJLyogTWFzdGVyIFRyYW5zbWl0IERpcmVjdGlvbiAoUlgvVFgqKSAqLworI2RlZmluZQlGQVNUCQkweDAwMDgJCS8qIFVzZSBGYXN0IE1vZGUgVGltaW5nCVNwZWNzICovCisjZGVmaW5lCVNUT1AJCTB4MDAxMAkJLyogSXNzdWUgU3RvcCBDb25kaXRpb24gKi8KKyNkZWZpbmUJUlNUQVJUCQkweDAwMjAJCS8qIFJlcGVhdCBTdGFydAlvciBTdG9wKiBBdCBFbmQJT2YgVHJhbnNmZXIgKi8KKyNkZWZpbmUJRENOVAkJMHgzRkMwCQkvKiBEYXRhCUJ5dGVzIFRvIFRyYW5zZmVyICovCisjZGVmaW5lCVNEQU9WUgkJMHg0MDAwCQkvKiBTZXJpYWwgRGF0YSBPdmVycmlkZSAqLworI2RlZmluZQlTQ0xPVlIJCTB4ODAwMAkJLyogU2VyaWFsIENsb2NrCU92ZXJyaWRlICovCisKKy8qIFRXSXhfTUFTVEVSX1NUQVQgTWFza3MJCQkJCQkJICovCisjZGVmaW5lCU1QUk9HCQkweDAwMDEJCS8qIE1hc3RlciBUcmFuc2ZlciBJbiBQcm9ncmVzcyAqLworI2RlZmluZQlMT1NUQVJCCQkweDAwMDIJCS8qIExvc3QJQXJiaXRyYXRpb24gSW5kaWNhdG9yIChYZmVyIEFib3J0ZWQpICovCisjZGVmaW5lCUFOQUsJCTB4MDAwNAkJLyogQWRkcmVzcyBOb3QgQWNrbm93bGVkZ2VkICovCisjZGVmaW5lCUROQUsJCTB4MDAwOAkJLyogRGF0YQlOb3QgQWNrbm93bGVkZ2VkICovCisjZGVmaW5lCUJVRlJERVJSCTB4MDAxMAkJLyogQnVmZmVyIFJlYWQgRXJyb3IgKi8KKyNkZWZpbmUJQlVGV1JFUlIJMHgwMDIwCQkvKiBCdWZmZXIgV3JpdGUJRXJyb3IgKi8KKyNkZWZpbmUJU0RBU0VOCQkweDAwNDAJCS8qIFNlcmlhbCBEYXRhIFNlbnNlICovCisjZGVmaW5lCVNDTFNFTgkJMHgwMDgwCQkvKiBTZXJpYWwgQ2xvY2sJU2Vuc2UgKi8KKyNkZWZpbmUJQlVTQlVTWQkJMHgwMTAwCQkvKiBCdXMgQnVzeSBJbmRpY2F0b3IgKi8KKworLyogVFdJeF9JTlRfU1JDCWFuZCBUV0l4X0lOVF9FTkFCTEUgTWFza3MgKi8KKyNkZWZpbmUJU0lOSVQJCTB4MDAwMQkJLyogU2xhdmUgVHJhbnNmZXIgSW5pdGlhdGVkICovCisjZGVmaW5lCVNDT01QCQkweDAwMDIJCS8qIFNsYXZlIFRyYW5zZmVyIENvbXBsZXRlICovCisjZGVmaW5lCVNFUlIJCTB4MDAwNAkJLyogU2xhdmUgVHJhbnNmZXIgRXJyb3IgKi8KKyNkZWZpbmUJU09WRgkJMHgwMDA4CQkvKiBTbGF2ZSBPdmVyZmxvdyAqLworI2RlZmluZQlNQ09NUAkJMHgwMDEwCQkvKiBNYXN0ZXIgVHJhbnNmZXIgQ29tcGxldGUgKi8KKyNkZWZpbmUJTUVSUgkJMHgwMDIwCQkvKiBNYXN0ZXIgVHJhbnNmZXIgRXJyb3IgKi8KKyNkZWZpbmUJWE1UU0VSVgkJMHgwMDQwCQkvKiBUcmFuc21pdCBGSUZPIFNlcnZpY2UgKi8KKyNkZWZpbmUJUkNWU0VSVgkJMHgwMDgwCQkvKiBSZWNlaXZlIEZJRk8JU2VydmljZSAqLworCisvKiBUV0l4X0ZJRk9fQ1RSTCBNYXNrcwkJCQkJICovCisjZGVmaW5lCVhNVEZMVVNICTB4MDAwMQkJLyogVHJhbnNtaXQgQnVmZmVyIEZsdXNoICovCisjZGVmaW5lCVJDVkZMVVNICTB4MDAwMgkJLyogUmVjZWl2ZSBCdWZmZXIgRmx1c2ggKi8KKyNkZWZpbmUJWE1USU5UTEVOCTB4MDAwNAkJLyogVHJhbnNtaXQgQnVmZmVyIEludGVycnVwdCBMZW5ndGggKi8KKyNkZWZpbmUJUkNWSU5UTEVOCTB4MDAwOAkJLyogUmVjZWl2ZSBCdWZmZXIgSW50ZXJydXB0IExlbmd0aCAqLworCisvKiBUV0l4X0ZJRk9fU1RBVCBNYXNrcwkJCQkJCQkJICovCisjZGVmaW5lCVhNVFNUQVQJCTB4MDAwMwkJLyogVHJhbnNtaXQgRklGTyBTdGF0dXMgKi8KKyNkZWZpbmUJWE1UX0VNUFRZCTB4MDAwMAkJLyoJCVRyYW5zbWl0IEZJRk8gRW1wdHkgKi8KKyNkZWZpbmUJWE1UX0hBTEYJMHgwMDAxCQkvKgkJVHJhbnNtaXQgRklGTyBIYXMgMSBCeXRlIFRvIFdyaXRlICovCisjZGVmaW5lCVhNVF9GVUxMCTB4MDAwMwkJLyoJCVRyYW5zbWl0IEZJRk8gRnVsbCAoMiBCeXRlcyBUbyBXcml0ZSkgKi8KKworI2RlZmluZQlSQ1ZTVEFUCQkweDAwMEMJCS8qIFJlY2VpdmUgRklGTwlTdGF0dXMgKi8KKyNkZWZpbmUJUkNWX0VNUFRZCTB4MDAwMAkJLyoJCVJlY2VpdmUJRklGTyBFbXB0eSAqLworI2RlZmluZQlSQ1ZfSEFMRgkweDAwMDQJCS8qCQlSZWNlaXZlCUZJRk8gSGFzIDEgQnl0ZQlUbyBSZWFkICovCisjZGVmaW5lCVJDVl9GVUxMCTB4MDAwQwkJLyoJCVJlY2VpdmUJRklGTyBGdWxsICgyIEJ5dGVzIFRvIFJlYWQpICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBNWFZSCU1BU0tTICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIE1YVlJfQ09ORklHIE1hc2tzICovCisKKyNkZWZpbmUJTVhWUkVOCSAgMHgwMDAwMDAwMWx1CisjZGVmaW5lCU1NU00JICAweDAwMDAwMDAybHUKKyNkZWZpbmUJQUNUSVZFCSAgMHgwMDAwMDAwNGx1CisjZGVmaW5lCVNERUxBWQkgIDB4MDAwMDAwMDhsdQorI2RlZmluZQlOQ01SWEVOCSAgMHgwMDAwMDAxMGx1CisjZGVmaW5lCVJXUlJYRU4JICAweDAwMDAwMDIwbHUKKyNkZWZpbmUJTVRYRU4JICAweDAwMDAwMDQwbHUKKyNkZWZpbmUJTVRYT04JICAweDAwMDAwMDgwbHUgLypsZWdhY3kqLworI2RlZmluZQlNVFhPTkIJICAweDAwMDAwMDgwbHUKKyNkZWZpbmUJRVBBUklUWQkgIDB4MDAwMDAxMDBsdQorI2RlZmluZQlNU0IJICAweDAwMDAxRTAwbHUKKyNkZWZpbmUJQVBSWEVOCSAgMHgwMDAwMjAwMGx1CisjZGVmaW5lCVdBS0VVUAkgIDB4MDAwMDQwMDBsdQorI2RlZmluZQlMTUVDSAkgIDB4MDAwMDgwMDBsdQorCisjaWZkZWYgX01JU1JBX1JVTEVTCisjZGVmaW5lCVNFVF9NU0IoeCkgICAgICgoKHgpJjB4RnUpIDw8IDB4OSkKKyNlbHNlCisjZGVmaW5lCVNFVF9NU0IoeCkgICAgICgoKHgpJjB4RikgPDwgMHg5KQorI2VuZGlmIC8qIF9NSVNSQV9SVUxFUyAqLworCisKKy8qIE1YVlJfUExMX0NUTF8wIE1hc2tzICovCisKKyNkZWZpbmUJTVhUQUxDRU4gIDB4MDAwMDAwMDFsdQorI2RlZmluZQlNWFRBTEZFTiAgMHgwMDAwMDAwMmx1CisjZGVmaW5lCU1QTExNUwkgIDB4MDAwMDAwMDhsdQorI2RlZmluZQlNWFRBTE1VTCAgMHgwMDAwMDAzMGx1CisjZGVmaW5lCU1QTExFTgkgIDB4MDAwMDAwNDBsdQorI2RlZmluZQlNUExMRU4wCSAgMHgwMDAwMDA0MGx1IC8qIGxlZ2FjeSAqLworI2RlZmluZQlNUExMRU4xCSAgMHgwMDAwMDA4MGx1IC8qIGxlZ2FjeSAqLworI2RlZmluZQlNTUNMS0VOCSAgMHgwMDAwMDEwMGx1CisjZGVmaW5lCU1NQ0xLTVVMICAweDAwMDAxRTAwbHUKKyNkZWZpbmUJTVBMTFJTVEIgIDB4MDAwMDIwMDBsdQorI2RlZmluZQlNUExMUlNUQjAgMHgwMDAwMjAwMGx1IC8qIGxlZ2FjeSAqLworI2RlZmluZQlNUExMUlNUQjEgMHgwMDAwNDAwMGx1IC8qIGxlZ2FjeSAqLworI2RlZmluZQlNQkNMS0VOCSAgMHgwMDAxMDAwMGx1CisjZGVmaW5lCU1CQ0xLRElWICAweDAwMUUwMDAwbHUKKyNkZWZpbmUJTVBMTENEUgkgIDB4MDAyMDAwMDBsdQorI2RlZmluZQlNUExMQ0RSMCAgMHgwMDIwMDAwMGx1IC8qIGxlZ2FjeSAqLworI2RlZmluZQlNUExMQ0RSMSAgMHgwMDQwMDAwMGx1IC8qIGxlZ2FjeSAqLworI2RlZmluZQlJTlZSWAkgIDB4MDA4MDAwMDBsdQorI2RlZmluZQlNRlNFTgkgIDB4MDEwMDAwMDBsdQorI2RlZmluZQlNRlNESVYJICAweDFFMDAwMDAwbHUKKyNkZWZpbmUJTUZTU0VMCSAgMHg2MDAwMDAwMGx1CisjZGVmaW5lCU1GU1NZTkMJICAweDgwMDAwMDAwbHUKKworI2RlZmluZQlNWFRBTE1VTF8yNTZGUwkgMHgwMDAwMDAwMGx1IC8qIGxlZ2FjeSAqLworI2RlZmluZQlNWFRBTE1VTF8zODRGUwkgMHgwMDAwMDAxMGx1IC8qIGxlZ2FjeSAqLworI2RlZmluZQlNWFRBTE1VTF81MTJGUwkgMHgwMDAwMDAyMGx1IC8qIGxlZ2FjeSAqLworI2RlZmluZQlNWFRBTE1VTF8xMDI0RlMJIDB4MDAwMDAwMzBsdQorCisjZGVmaW5lCU1NQ0xLTVVMXzEwMjRGUwkgMHgwMDAwMDAwMGx1CisjZGVmaW5lCU1NQ0xLTVVMXzUxMkZTCSAweDAwMDAwMjAwbHUKKyNkZWZpbmUJTU1DTEtNVUxfMjU2RlMJIDB4MDAwMDA0MDBsdQorI2RlZmluZQlNTUNMS01VTF8xMjhGUwkgMHgwMDAwMDYwMGx1CisjZGVmaW5lCU1NQ0xLTVVMXzY0RlMJIDB4MDAwMDA4MDBsdQorI2RlZmluZQlNTUNMS01VTF8zMkZTCSAweDAwMDAwQTAwbHUKKyNkZWZpbmUJTU1DTEtNVUxfMTZGUwkgMHgwMDAwMEMwMGx1CisjZGVmaW5lCU1NQ0xLTVVMXzhGUwkgMHgwMDAwMEUwMGx1CisjZGVmaW5lCU1NQ0xLTVVMXzRGUwkgMHgwMDAwMTAwMGx1CisjZGVmaW5lCU1NQ0xLTVVMXzJGUwkgMHgwMDAwMTIwMGx1CisjZGVmaW5lCU1NQ0xLTVVMXzFGUwkgMHgwMDAwMTQwMGx1CisjZGVmaW5lCU1NQ0xLTVVMXzE1MzZGUwkgMHgwMDAwMUEwMGx1CisjZGVmaW5lCU1NQ0xLTVVMXzc2OEZTCSAweDAwMDAxQzAwbHUKKyNkZWZpbmUJTU1DTEtNVUxfMzg0RlMJIDB4MDAwMDFFMDBsdQorCisjZGVmaW5lCU1CQ0xLRElWX0RJVjIJIDB4MDAwMjAwMDBsdQorI2RlZmluZQlNQkNMS0RJVl9ESVY0CSAweDAwMDQwMDAwbHUKKyNkZWZpbmUJTUJDTEtESVZfRElWOAkgMHgwMDA2MDAwMGx1CisjZGVmaW5lCU1CQ0xLRElWX0RJVjE2CSAweDAwMDgwMDAwbHUKKyNkZWZpbmUJTUJDTEtESVZfRElWMzIJIDB4MDAwQTAwMDBsdQorI2RlZmluZQlNQkNMS0RJVl9ESVY2NAkgMHgwMDBDMDAwMGx1CisjZGVmaW5lCU1CQ0xLRElWX0RJVjEyOAkgMHgwMDBFMDAwMGx1CisjZGVmaW5lCU1CQ0xLRElWX0RJVjI1NgkgMHgwMDEwMDAwMGx1CisjZGVmaW5lCU1CQ0xLRElWX0RJVjUxMgkgMHgwMDEyMDAwMGx1CisjZGVmaW5lCU1CQ0xLRElWX0RJVjEwMjQgMHgwMDE0MDAwMGx1CisKKyNkZWZpbmUJTUZTRElWX0RJVjIJIDB4MDIwMDAwMDBsdQorI2RlZmluZQlNRlNESVZfRElWNAkgMHgwNDAwMDAwMGx1CisjZGVmaW5lCU1GU0RJVl9ESVY4CSAweDA2MDAwMDAwbHUKKyNkZWZpbmUJTUZTRElWX0RJVjE2CSAweDA4MDAwMDAwbHUKKyNkZWZpbmUJTUZTRElWX0RJVjMyCSAweDBBMDAwMDAwbHUKKyNkZWZpbmUJTUZTRElWX0RJVjY0CSAweDBDMDAwMDAwbHUKKyNkZWZpbmUJTUZTRElWX0RJVjEyOAkgMHgwRTAwMDAwMGx1CisjZGVmaW5lCU1GU0RJVl9ESVYyNTYJIDB4MTAwMDAwMDBsdQorI2RlZmluZQlNRlNESVZfRElWNTEyCSAweDEyMDAwMDAwbHUKKyNkZWZpbmUJTUZTRElWX0RJVjEwMjQJIDB4MTQwMDAwMDBsdQorCisjZGVmaW5lCU1GU1NFTF9DTE9DSwkgMHgwMDAwMDAwMGx1CisjZGVmaW5lCU1GU1NFTF9QVUxTRV9ISQkgMHgyMDAwMDAwMGx1CisjZGVmaW5lCU1GU1NFTF9QVUxTRV9MTwkgMHg0MDAwMDAwMGx1CisKKworLyogTVhWUl9QTExfQ1RMXzEgTWFza3MgKi8KKworI2RlZmluZQlNU1RPCSAgIDB4MDAwMDAwMDFsdQorI2RlZmluZQlNU1RPMAkgICAweDAwMDAwMDAxbHUJLyogbGVnYWN5ICovCisjZGVmaW5lCU1IT0dHRAkgICAweDAwMDAwMDA0bHUKKyNkZWZpbmUJTUhPR0dEMAkgICAweDAwMDAwMDA0bHUJLyogbGVnYWN5ICovCisjZGVmaW5lCU1IT0dHRDEJICAgMHgwMDAwMDAwOGx1CS8qIGxlZ2FjeSAqLworI2RlZmluZQlNU0hBUEVSRU4gIDB4MDAwMDAwMTBsdQorI2RlZmluZQlNU0hBUEVSRU4wIDB4MDAwMDAwMTBsdQkvKiBsZWdhY3kgKi8KKyNkZWZpbmUJTVNIQVBFUkVOMSAweDAwMDAwMDIwbHUJLyogbGVnYWN5ICovCisjZGVmaW5lCU1QTExDTlRFTiAgMHgwMDAwODAwMGx1CisjZGVmaW5lCU1QTExDTlQJICAgMHhGRkZGMDAwMGx1CisKKyNpZmRlZiBfTUlTUkFfUlVMRVMKKyNkZWZpbmUJU0VUX01QTExDTlQoeCkJICAgKCgoeCkmMHhGRkZGdSkgPDwgMHgxMCkKKyNlbHNlCisjZGVmaW5lCVNFVF9NUExMQ05UKHgpCSAgICgoKHgpJjB4RkZGRikgPDwgMHgxMCkKKyNlbmRpZiAvKiBfTUlTUkFfUlVMRVMgKi8KKworCisvKiBNWFZSX1BMTF9DVExfMiBNYXNrcyAqLworCisjZGVmaW5lCU1TSEFQRVJTRUwgMHgwMDAwMDAwN2x1CisjZGVmaW5lCU1DUFNFTAkgICAweDAwMDAwMEUwbHUKKworLyogTVhWUl9JTlRfU1RBVF8wIE1hc2tzICovCisKKyNkZWZpbmUJTkkyQSAgMHgwMDAwMDAwMWx1CisjZGVmaW5lCU5BMkkgIDB4MDAwMDAwMDJsdQorI2RlZmluZQlTQlUyTCAweDAwMDAwMDA0bHUKKyNkZWZpbmUJU0JMMlUgMHgwMDAwMDAwOGx1CisjZGVmaW5lCVBSVSAgIDB4MDAwMDAwMTBsdQorI2RlZmluZQlNUFJVICAweDAwMDAwMDIwbHUKKyNkZWZpbmUJRFJVICAgMHgwMDAwMDA0MGx1CisjZGVmaW5lCU1EUlUgIDB4MDAwMDAwODBsdQorI2RlZmluZQlTQlUgICAweDAwMDAwMTAwbHUKKyNkZWZpbmUJQVRVICAgMHgwMDAwMDIwMGx1CisjZGVmaW5lCUZDWjAgIDB4MDAwMDA0MDBsdQorI2RlZmluZQlGQ1oxICAweDAwMDAwODAwbHUKKyNkZWZpbmUJUEVSUiAgMHgwMDAwMTAwMGx1CisjZGVmaW5lCU1IMkwgIDB4MDAwMDIwMDBsdQorI2RlZmluZQlNTDJIICAweDAwMDA0MDAwbHUKKyNkZWZpbmUJV1VQICAgMHgwMDAwODAwMGx1CisjZGVmaW5lCUZVMkwgIDB4MDAwMTAwMDBsdQorI2RlZmluZQlGTDJVICAweDAwMDIwMDAwbHUKKyNkZWZpbmUJQlUyTCAgMHgwMDA0MDAwMGx1CisjZGVmaW5lCUJMMlUgIDB4MDAwODAwMDBsdQorI2RlZmluZQlQQ1ogICAweDAwNDAwMDAwbHUKKyNkZWZpbmUJRkVSUiAgMHgwMDgwMDAwMGx1CisjZGVmaW5lCUNNUiAgIDB4MDEwMDAwMDBsdQorI2RlZmluZQlDTVJPRiAweDAyMDAwMDAwbHUKKyNkZWZpbmUJQ01UUyAgMHgwNDAwMDAwMGx1CisjZGVmaW5lCUNNVEMgIDB4MDgwMDAwMDBsdQorI2RlZmluZQlSV1JDICAweDEwMDAwMDAwbHUKKyNkZWZpbmUJQkNaICAgMHgyMDAwMDAwMGx1CisjZGVmaW5lCUJNRVJSIDB4NDAwMDAwMDBsdQorI2RlZmluZQlERVJSICAweDgwMDAwMDAwbHUKKworCisvKiBNWFZSX0lOVF9FTl8wIE1hc2tzICovCisKKyNkZWZpbmUJTkkyQUVOCU5JMkEKKyNkZWZpbmUJTkEySUVOCU5BMkkKKyNkZWZpbmUJU0JVMkxFTglTQlUyTAorI2RlZmluZQlTQkwyVUVOCVNCTDJVCisjZGVmaW5lCVBSVUVOCVBSVQorI2RlZmluZQlNUFJVRU4JTVBSVQorI2RlZmluZQlEUlVFTglEUlUKKyNkZWZpbmUJTURSVUVOCU1EUlUKKyNkZWZpbmUJU0JVRU4JU0JVCisjZGVmaW5lCUFUVUVOCUFUVQorI2RlZmluZQlGQ1owRU4JRkNaMAorI2RlZmluZQlGQ1oxRU4JRkNaMQorI2RlZmluZQlQRVJSRU4JUEVSUgorI2RlZmluZQlNSDJMRU4JTUgyTAorI2RlZmluZQlNTDJIRU4JTUwySAorI2RlZmluZQlXVVBFTglXVVAKKyNkZWZpbmUJRlUyTEVOCUZVMkwKKyNkZWZpbmUJRkwyVUVOCUZMMlUKKyNkZWZpbmUJQlUyTEVOCUJVMkwKKyNkZWZpbmUJQkwyVUVOCUJMMlUKKyNkZWZpbmUJUENaRU4JUENaCisjZGVmaW5lCUZFUlJFTglGRVJSCisjZGVmaW5lCUNNUkVOCUNNUgorI2RlZmluZQlDTVJPRkVOCUNNUk9GCisjZGVmaW5lCUNNVFNFTglDTVRTCisjZGVmaW5lCUNNVENFTglDTVRDCisjZGVmaW5lCVJXUkNFTglSV1JDCisjZGVmaW5lCUJDWkVOCUJDWgorI2RlZmluZQlCTUVSUkVOCUJNRVJSCisjZGVmaW5lCURFUlJFTglERVJSCisKKworLyogTVhWUl9JTlRfU1RBVF8xIE1hc2tzICovCisKKyNkZWZpbmUJQVBSICAgMHgwMDAwMDAwNGx1CisjZGVmaW5lCUFQUk9GIDB4MDAwMDAwMDhsdQorI2RlZmluZQlBUFRTICAweDAwMDAwMDQwbHUKKyNkZWZpbmUJQVBUQyAgMHgwMDAwMDA4MGx1CisjZGVmaW5lCUFQUkNFIDB4MDAwMDA0MDBsdQorI2RlZmluZQlBUFJQRSAweDAwMDAwODAwbHUKKworI2RlZmluZQlIRE9ORTAgMHgwMDAwMDAwMWx1CisjZGVmaW5lCURPTkUwICAweDAwMDAwMDAybHUKKyNkZWZpbmUJSERPTkUxIDB4MDAwMDAwMTBsdQorI2RlZmluZQlET05FMSAgMHgwMDAwMDAyMGx1CisjZGVmaW5lCUhET05FMiAweDAwMDAwMTAwbHUKKyNkZWZpbmUJRE9ORTIgIDB4MDAwMDAyMDBsdQorI2RlZmluZQlIRE9ORTMgMHgwMDAwMTAwMGx1CisjZGVmaW5lCURPTkUzICAweDAwMDAyMDAwbHUKKyNkZWZpbmUJSERPTkU0IDB4MDAwMTAwMDBsdQorI2RlZmluZQlET05FNCAgMHgwMDAyMDAwMGx1CisjZGVmaW5lCUhET05FNSAweDAwMTAwMDAwbHUKKyNkZWZpbmUJRE9ORTUgIDB4MDAyMDAwMDBsdQorI2RlZmluZQlIRE9ORTYgMHgwMTAwMDAwMGx1CisjZGVmaW5lCURPTkU2ICAweDAyMDAwMDAwbHUKKyNkZWZpbmUJSERPTkU3IDB4MTAwMDAwMDBsdQorI2RlZmluZQlET05FNyAgMHgyMDAwMDAwMGx1CisKKyNkZWZpbmUJRE9ORVgoeCkgKDB4MDAwMDAwMDIgPDwJKDQgKiAoeCkpKQorI2RlZmluZQlIRE9ORVgoeCkgKDB4MDAwMDAwMDEgPDwgKDQgKiAoeCkpKQorCisKKy8qIE1YVlJfSU5UX0VOXzEgTWFza3MgKi8KKworI2RlZmluZQlBUFJFTglBUFIKKyNkZWZpbmUJQVBST0ZFTglBUFJPRgorI2RlZmluZQlBUFRTRU4JQVBUUworI2RlZmluZQlBUFRDRU4JQVBUQworI2RlZmluZQlBUFJDRUVOCUFQUkNFCisjZGVmaW5lCUFQUlBFRU4JQVBSUEUKKworI2RlZmluZQlIRE9ORUVOMCBIRE9ORTAKKyNkZWZpbmUJRE9ORUVOMAkgRE9ORTAKKyNkZWZpbmUJSERPTkVFTjEgSERPTkUxCisjZGVmaW5lCURPTkVFTjEJIERPTkUxCisjZGVmaW5lCUhET05FRU4yIEhET05FMgorI2RlZmluZQlET05FRU4yCSBET05FMgorI2RlZmluZQlIRE9ORUVOMyBIRE9ORTMKKyNkZWZpbmUJRE9ORUVOMwkgRE9ORTMKKyNkZWZpbmUJSERPTkVFTjQgSERPTkU0CisjZGVmaW5lCURPTkVFTjQJIERPTkU0CisjZGVmaW5lCUhET05FRU41IEhET05FNQorI2RlZmluZQlET05FRU41CSBET05FNQorI2RlZmluZQlIRE9ORUVONiBIRE9ORTYKKyNkZWZpbmUJRE9ORUVONgkgRE9ORTYKKyNkZWZpbmUJSERPTkVFTjcgSERPTkU3CisjZGVmaW5lCURPTkVFTjcJIERPTkU3CisKKyNkZWZpbmUJRE9ORUVOWCh4KSAoMHgwMDAwMDAwMiA8PCAoNCAqICh4KSkpCisjZGVmaW5lCUhET05FRU5YKHgpICgweDAwMDAwMDAxCTw8ICg0ICoJKHgpKSkKKworCisvKiBNWFZSX1NUQVRFXzAJTWFza3MgKi8KKworI2RlZmluZQlOQUNUCSAweDAwMDAwMDAxbHUKKyNkZWZpbmUJU0JMT0NLCSAweDAwMDAwMDAybHUKKyNkZWZpbmUJUEZETE9DSwkgMHgwMDAwMDAwNGx1CisjZGVmaW5lCVBGRExPQ0swIDB4MDAwMDAwMDRsdSAvKiBsZWdhY3kgKi8KKyNkZWZpbmUJUERECSAweDAwMDAwMDA4bHUKKyNkZWZpbmUJUEREMAkgMHgwMDAwMDAwOGx1IC8qIGxlZ2FjeSAqLworI2RlZmluZQlQVkNPCSAweDAwMDAwMDEwbHUKKyNkZWZpbmUJUFZDTzAJIDB4MDAwMDAwMTBsdSAvKiBsZWdhY3kgKi8KKyNkZWZpbmUJUEZETE9DSzEgMHgwMDAwMDAyMGx1IC8qIGxlZ2FjeSAqLworI2RlZmluZQlQREQxCSAweDAwMDAwMDQwbHUgLyogbGVnYWN5ICovCisjZGVmaW5lCVBWQ08xCSAweDAwMDAwMDgwbHUgLyogbGVnYWN5ICovCisjZGVmaW5lCUFQQlNZCSAweDAwMDAwMTAwbHUKKyNkZWZpbmUJQVBBUkIJIDB4MDAwMDAyMDBsdQorI2RlZmluZQlBUFRYCSAweDAwMDAwNDAwbHUKKyNkZWZpbmUJQVBSWAkgMHgwMDAwMDgwMGx1CisjZGVmaW5lCUNNQlNZCSAweDAwMDAxMDAwbHUKKyNkZWZpbmUJQ01BUkIJIDB4MDAwMDIwMDBsdQorI2RlZmluZQlDTVRYCSAweDAwMDA0MDAwbHUKKyNkZWZpbmUJQ01SWAkgMHgwMDAwODAwMGx1CisjZGVmaW5lCU1SWE9OQgkgMHgwMDAxMDAwMGx1CisjZGVmaW5lCVJHU0lQCSAweDAwMDIwMDAwbHUKKyNkZWZpbmUJREFMSVAJIDB4MDAwNDAwMDBsdQorI2RlZmluZQlBTElQCSAweDAwMDgwMDAwbHUKKyNkZWZpbmUJUlJESVAJIDB4MDAxMDAwMDBsdQorI2RlZmluZQlSV1JJUAkgMHgwMDIwMDAwMGx1CisjZGVmaW5lCUZMT0NLCSAweDAwNDAwMDAwbHUKKyNkZWZpbmUJQkxPQ0sJIDB4MDA4MDAwMDBsdQorI2RlZmluZQlSU0IJIDB4MEYwMDAwMDBsdQorI2RlZmluZQlERVJSTlVNCSAweEYwMDAwMDAwbHUKKworCisvKiBNWFZSX1NUQVRFXzEJTWFza3MgKi8KKworI2RlZmluZQlTVFhOVU1CCSAgICAweDAwMDAwMDBGbHUKKyNkZWZpbmUJU1JYTlVNQgkgICAgMHgwMDAwMDBGMGx1CisjZGVmaW5lCUFQQ09OVAkgICAgMHgwMDAwMDEwMGx1CisjZGVmaW5lCURNQUFDVElWRVggIDB4MDBGRjAwMDBsdQorI2RlZmluZQlETUFBQ1RJVkUwICAweDAwMDEwMDAwbHUKKyNkZWZpbmUJRE1BQUNUSVZFMSAgMHgwMDAyMDAwMGx1CisjZGVmaW5lCURNQUFDVElWRTIgIDB4MDAwNDAwMDBsdQorI2RlZmluZQlETUFBQ1RJVkUzICAweDAwMDgwMDAwbHUKKyNkZWZpbmUJRE1BQUNUSVZFNCAgMHgwMDEwMDAwMGx1CisjZGVmaW5lCURNQUFDVElWRTUgIDB4MDAyMDAwMDBsdQorI2RlZmluZQlETUFBQ1RJVkU2ICAweDAwNDAwMDAwbHUKKyNkZWZpbmUJRE1BQUNUSVZFNyAgMHgwMDgwMDAwMGx1CisjZGVmaW5lCURNQVBNRU5YICAgIDB4RkYwMDAwMDBsdQorI2RlZmluZQlETUFQTUVOMCAgICAweDAxMDAwMDAwbHUKKyNkZWZpbmUJRE1BUE1FTjEgICAgMHgwMjAwMDAwMGx1CisjZGVmaW5lCURNQVBNRU4yICAgIDB4MDQwMDAwMDBsdQorI2RlZmluZQlETUFQTUVOMyAgICAweDA4MDAwMDAwbHUKKyNkZWZpbmUJRE1BUE1FTjQgICAgMHgxMDAwMDAwMGx1CisjZGVmaW5lCURNQVBNRU41ICAgIDB4MjAwMDAwMDBsdQorI2RlZmluZQlETUFQTUVONiAgICAweDQwMDAwMDAwbHUKKyNkZWZpbmUJRE1BUE1FTjcgICAgMHg4MDAwMDAwMGx1CisKKworLyogTVhWUl9QT1NJVElPTiBNYXNrcyAqLworCisjZGVmaW5lCVBWQUxJRAkgICAgIDB4ODAwMAorI2RlZmluZQlQT1NJVElPTiAgICAgMHgwMDNGCisKKworLyogTVhWUl9NQVhfUE9TSVRJT04gTWFza3MgKi8KKworI2RlZmluZQlNUFZBTElECSAgICAgMHg4MDAwCisjZGVmaW5lCU1QT1NJVElPTiAgICAweDAwM0YKKworCisvKiBNWFZSX0RFTEFZIE1hc2tzICovCisKKyNkZWZpbmUJRFZBTElECSAgICAgMHg4MDAwCisjZGVmaW5lCURFTEFZCSAgICAgMHgwMDNGCisKKworLyogTVhWUl9NQVhfREVMQVkgTWFza3MgKi8KKworI2RlZmluZQlNRFZBTElECSAgICAgMHg4MDAwCisjZGVmaW5lCU1ERUxBWQkgICAgIDB4MDAzRgorCisKKy8qIE1YVlJfTEFERFIgTWFza3MgKi8KKworI2RlZmluZQlMVkFMSUQJICAgICAweDgwMDAwMDAwbHUKKyNkZWZpbmUJTEFERFIJICAgICAweDAwMDBGRkZGbHUKKworCisvKiBNWFZSX0dBRERSIE1hc2tzICovCisKKyNkZWZpbmUJR1ZBTElECSAgICAgMHg4MDAwCisjZGVmaW5lCUdBRERSTAkgICAgIDB4MDBGRgorCisKKy8qIE1YVlJfQUFERFIgTWFza3MgKi8KKworI2RlZmluZQlBVkFMSUQJICAgICAweDgwMDAwMDAwbHUKKyNkZWZpbmUJQUFERFIJICAgICAweDAwMDBGRkZGbHUKKworCisvKiBNWFZSX0FMTE9DXzAJTWFza3MgKi8KKworI2RlZmluZQlDSVUwCSAgICAgMHgwMDAwMDA4MGx1CisjZGVmaW5lCUNJVTEJICAgICAweDAwMDA4MDAwbHUKKyNkZWZpbmUJQ0lVMgkgICAgIDB4MDA4MDAwMDBsdQorI2RlZmluZQlDSVUzCSAgICAgMHg4MDAwMDAwMGx1CisKKyNkZWZpbmUJQ0wwCSAgICAgMHgwMDAwMDA3Rmx1CisjZGVmaW5lCUNMMQkgICAgIDB4MDAwMDdGMDBsdQorI2RlZmluZQlDTDIJICAgICAweDAwN0YwMDAwbHUKKyNkZWZpbmUJQ0wzCSAgICAgMHg3RjAwMDAwMGx1CisKKworLyogTVhWUl9BTExPQ18xCU1hc2tzICovCisKKyNkZWZpbmUJQ0lVNAkgICAgIDB4MDAwMDAwODBsdQorI2RlZmluZQlDSVU1CSAgICAgMHgwMDAwODAwMGx1CisjZGVmaW5lCUNJVTYJICAgICAweDAwODAwMDAwbHUKKyNkZWZpbmUJQ0lVNwkgICAgIDB4ODAwMDAwMDBsdQorCisjZGVmaW5lCUNMNAkgICAgIDB4MDAwMDAwN0ZsdQorI2RlZmluZQlDTDUJICAgICAweDAwMDA3RjAwbHUKKyNkZWZpbmUJQ0w2CSAgICAgMHgwMDdGMDAwMGx1CisjZGVmaW5lCUNMNwkgICAgIDB4N0YwMDAwMDBsdQorCisKKy8qIE1YVlJfQUxMT0NfMglNYXNrcyAqLworCisjZGVmaW5lCUNJVTgJICAgICAweDAwMDAwMDgwbHUKKyNkZWZpbmUJQ0lVOQkgICAgIDB4MDAwMDgwMDBsdQorI2RlZmluZQlDSVUxMAkgICAgIDB4MDA4MDAwMDBsdQorI2RlZmluZQlDSVUxMQkgICAgIDB4ODAwMDAwMDBsdQorCisjZGVmaW5lCUNMOAkgICAgIDB4MDAwMDAwN0ZsdQorI2RlZmluZQlDTDkJICAgICAweDAwMDA3RjAwbHUKKyNkZWZpbmUJQ0wxMAkgICAgIDB4MDA3RjAwMDBsdQorI2RlZmluZQlDTDExCSAgICAgMHg3RjAwMDAwMGx1CisKKworLyogTVhWUl9BTExPQ18zCU1hc2tzICovCisKKyNkZWZpbmUJQ0lVMTIJICAgICAweDAwMDAwMDgwbHUKKyNkZWZpbmUJQ0lVMTMJICAgICAweDAwMDA4MDAwbHUKKyNkZWZpbmUJQ0lVMTQJICAgICAweDAwODAwMDAwbHUKKyNkZWZpbmUJQ0lVMTUJICAgICAweDgwMDAwMDAwbHUKKworI2RlZmluZQlDTDEyCSAgICAgMHgwMDAwMDA3Rmx1CisjZGVmaW5lCUNMMTMJICAgICAweDAwMDA3RjAwbHUKKyNkZWZpbmUJQ0wxNAkgICAgIDB4MDA3RjAwMDBsdQorI2RlZmluZQlDTDE1CSAgICAgMHg3RjAwMDAwMGx1CisKKworLyogTVhWUl9BTExPQ180CU1hc2tzICovCisKKyNkZWZpbmUJQ0lVMTYJICAgICAweDAwMDAwMDgwbHUKKyNkZWZpbmUJQ0lVMTcJICAgICAweDAwMDA4MDAwbHUKKyNkZWZpbmUJQ0lVMTgJICAgICAweDAwODAwMDAwbHUKKyNkZWZpbmUJQ0lVMTkJICAgICAweDgwMDAwMDAwbHUKKworI2RlZmluZQlDTDE2CSAgICAgMHgwMDAwMDA3Rmx1CisjZGVmaW5lCUNMMTcJICAgICAweDAwMDA3RjAwbHUKKyNkZWZpbmUJQ0wxOAkgICAgIDB4MDA3RjAwMDBsdQorI2RlZmluZQlDTDE5CSAgICAgMHg3RjAwMDAwMGx1CisKKworLyogTVhWUl9BTExPQ181CU1hc2tzICovCisKKyNkZWZpbmUJQ0lVMjAJICAgICAweDAwMDAwMDgwbHUKKyNkZWZpbmUJQ0lVMjEJICAgICAweDAwMDA4MDAwbHUKKyNkZWZpbmUJQ0lVMjIJICAgICAweDAwODAwMDAwbHUKKyNkZWZpbmUJQ0lVMjMJICAgICAweDgwMDAwMDAwbHUKKworI2RlZmluZQlDTDIwCSAgICAgMHgwMDAwMDA3Rmx1CisjZGVmaW5lCUNMMjEJICAgICAweDAwMDA3RjAwbHUKKyNkZWZpbmUJQ0wyMgkgICAgIDB4MDA3RjAwMDBsdQorI2RlZmluZQlDTDIzCSAgICAgMHg3RjAwMDAwMGx1CisKKworLyogTVhWUl9BTExPQ182CU1hc2tzICovCisKKyNkZWZpbmUJQ0lVMjQJICAgICAweDAwMDAwMDgwbHUKKyNkZWZpbmUJQ0lVMjUJICAgICAweDAwMDA4MDAwbHUKKyNkZWZpbmUJQ0lVMjYJICAgICAweDAwODAwMDAwbHUKKyNkZWZpbmUJQ0lVMjcJICAgICAweDgwMDAwMDAwbHUKKworI2RlZmluZQlDTDI0CSAgICAgMHgwMDAwMDA3Rmx1CisjZGVmaW5lCUNMMjUJICAgICAweDAwMDA3RjAwbHUKKyNkZWZpbmUJQ0wyNgkgICAgIDB4MDA3RjAwMDBsdQorI2RlZmluZQlDTDI3CSAgICAgMHg3RjAwMDAwMGx1CisKKworLyogTVhWUl9BTExPQ183CU1hc2tzICovCisKKyNkZWZpbmUJQ0lVMjgJICAgICAweDAwMDAwMDgwbHUKKyNkZWZpbmUJQ0lVMjkJICAgICAweDAwMDA4MDAwbHUKKyNkZWZpbmUJQ0lVMzAJICAgICAweDAwODAwMDAwbHUKKyNkZWZpbmUJQ0lVMzEJICAgICAweDgwMDAwMDAwbHUKKworI2RlZmluZQlDTDI4CSAgICAgMHgwMDAwMDA3Rmx1CisjZGVmaW5lCUNMMjkJICAgICAweDAwMDA3RjAwbHUKKyNkZWZpbmUJQ0wzMAkgICAgIDB4MDA3RjAwMDBsdQorI2RlZmluZQlDTDMxCSAgICAgMHg3RjAwMDAwMGx1CisKKworLyogTVhWUl9BTExPQ184CU1hc2tzICovCisKKyNkZWZpbmUJQ0lVMzIJICAgICAweDAwMDAwMDgwbHUKKyNkZWZpbmUJQ0lVMzMJICAgICAweDAwMDA4MDAwbHUKKyNkZWZpbmUJQ0lVMzQJICAgICAweDAwODAwMDAwbHUKKyNkZWZpbmUJQ0lVMzUJICAgICAweDgwMDAwMDAwbHUKKworI2RlZmluZQlDTDMyCSAgICAgMHgwMDAwMDA3Rmx1CisjZGVmaW5lCUNMMzMJICAgICAweDAwMDA3RjAwbHUKKyNkZWZpbmUJQ0wzNAkgICAgIDB4MDA3RjAwMDBsdQorI2RlZmluZQlDTDM1CSAgICAgMHg3RjAwMDAwMGx1CisKKworLyogTVhWUl9BTExPQ185CU1hc2tzICovCisKKyNkZWZpbmUJQ0lVMzYJICAgICAweDAwMDAwMDgwbHUKKyNkZWZpbmUJQ0lVMzcJICAgICAweDAwMDA4MDAwbHUKKyNkZWZpbmUJQ0lVMzgJICAgICAweDAwODAwMDAwbHUKKyNkZWZpbmUJQ0lVMzkJICAgICAweDgwMDAwMDAwbHUKKworI2RlZmluZQlDTDM2CSAgICAgMHgwMDAwMDA3Rmx1CisjZGVmaW5lCUNMMzcJICAgICAweDAwMDA3RjAwbHUKKyNkZWZpbmUJQ0wzOAkgICAgIDB4MDA3RjAwMDBsdQorI2RlZmluZQlDTDM5CSAgICAgMHg3RjAwMDAwMGx1CisKKworLyogTVhWUl9BTExPQ18xMCBNYXNrcyAqLworCisjZGVmaW5lCUNJVTQwCSAgICAgMHgwMDAwMDA4MGx1CisjZGVmaW5lCUNJVTQxCSAgICAgMHgwMDAwODAwMGx1CisjZGVmaW5lCUNJVTQyCSAgICAgMHgwMDgwMDAwMGx1CisjZGVmaW5lCUNJVTQzCSAgICAgMHg4MDAwMDAwMGx1CisKKyNkZWZpbmUJQ0w0MAkgICAgIDB4MDAwMDAwN0ZsdQorI2RlZmluZQlDTDQxCSAgICAgMHgwMDAwN0YwMGx1CisjZGVmaW5lCUNMNDIJICAgICAweDAwN0YwMDAwbHUKKyNkZWZpbmUJQ0w0MwkgICAgIDB4N0YwMDAwMDBsdQorCisKKy8qIE1YVlJfQUxMT0NfMTEgTWFza3MgKi8KKworI2RlZmluZQlDSVU0NAkgICAgIDB4MDAwMDAwODBsdQorI2RlZmluZQlDSVU0NQkgICAgIDB4MDAwMDgwMDBsdQorI2RlZmluZQlDSVU0NgkgICAgIDB4MDA4MDAwMDBsdQorI2RlZmluZQlDSVU0NwkgICAgIDB4ODAwMDAwMDBsdQorCisjZGVmaW5lCUNMNDQJICAgICAweDAwMDAwMDdGbHUKKyNkZWZpbmUJQ0w0NQkgICAgIDB4MDAwMDdGMDBsdQorI2RlZmluZQlDTDQ2CSAgICAgMHgwMDdGMDAwMGx1CisjZGVmaW5lCUNMNDcJICAgICAweDdGMDAwMDAwbHUKKworCisvKiBNWFZSX0FMTE9DXzEyIE1hc2tzICovCisKKyNkZWZpbmUJQ0lVNDgJICAgICAweDAwMDAwMDgwbHUKKyNkZWZpbmUJQ0lVNDkJICAgICAweDAwMDA4MDAwbHUKKyNkZWZpbmUJQ0lVNTAJICAgICAweDAwODAwMDAwbHUKKyNkZWZpbmUJQ0lVNTEJICAgICAweDgwMDAwMDAwbHUKKworI2RlZmluZQlDTDQ4CSAgICAgMHgwMDAwMDA3Rmx1CisjZGVmaW5lCUNMNDkJICAgICAweDAwMDA3RjAwbHUKKyNkZWZpbmUJQ0w1MAkgICAgIDB4MDA3RjAwMDBsdQorI2RlZmluZQlDTDUxCSAgICAgMHg3RjAwMDAwMGx1CisKKworLyogTVhWUl9BTExPQ18xMyBNYXNrcyAqLworCisjZGVmaW5lCUNJVTUyCSAgICAgMHgwMDAwMDA4MGx1CisjZGVmaW5lCUNJVTUzCSAgICAgMHgwMDAwODAwMGx1CisjZGVmaW5lCUNJVTU0CSAgICAgMHgwMDgwMDAwMGx1CisjZGVmaW5lCUNJVTU1CSAgICAgMHg4MDAwMDAwMGx1CisKKyNkZWZpbmUJQ0w1MgkgICAgIDB4MDAwMDAwN0ZsdQorI2RlZmluZQlDTDUzCSAgICAgMHgwMDAwN0YwMGx1CisjZGVmaW5lCUNMNTQJICAgICAweDAwN0YwMDAwbHUKKyNkZWZpbmUJQ0w1NQkgICAgIDB4N0YwMDAwMDBsdQorCisKKy8qIE1YVlJfQUxMT0NfMTQgTWFza3MgKi8KKworI2RlZmluZQlDSVU1NgkgICAgIDB4MDAwMDAwODBsdQorI2RlZmluZQlDSVU1NwkgICAgIDB4MDAwMDgwMDBsdQorI2RlZmluZQlDSVU1OAkgICAgIDB4MDA4MDAwMDBsdQorI2RlZmluZQlDSVU1OQkgICAgIDB4ODAwMDAwMDBsdQorCisjZGVmaW5lCUNMNTYJICAgICAweDAwMDAwMDdGbHUKKyNkZWZpbmUJQ0w1NwkgICAgIDB4MDAwMDdGMDBsdQorI2RlZmluZQlDTDU4CSAgICAgMHgwMDdGMDAwMGx1CisjZGVmaW5lCUNMNTkJICAgICAweDdGMDAwMDAwbHUKKworCisvKiBNWFZSX1NZTkNfTENIQU5fMCBNYXNrcyAqLworCisjZGVmaW5lCUxDSEFOUEMwICAgICAweDAwMDAwMDBGbHUKKyNkZWZpbmUJTENIQU5QQzEgICAgIDB4MDAwMDAwRjBsdQorI2RlZmluZQlMQ0hBTlBDMiAgICAgMHgwMDAwMEYwMGx1CisjZGVmaW5lCUxDSEFOUEMzICAgICAweDAwMDBGMDAwbHUKKyNkZWZpbmUJTENIQU5QQzQgICAgIDB4MDAwRjAwMDBsdQorI2RlZmluZQlMQ0hBTlBDNSAgICAgMHgwMEYwMDAwMGx1CisjZGVmaW5lCUxDSEFOUEM2ICAgICAweDBGMDAwMDAwbHUKKyNkZWZpbmUJTENIQU5QQzcgICAgIDB4RjAwMDAwMDBsdQorCisKKy8qIE1YVlJfU1lOQ19MQ0hBTl8xIE1hc2tzICovCisKKyNkZWZpbmUJTENIQU5QQzggICAgIDB4MDAwMDAwMEZsdQorI2RlZmluZQlMQ0hBTlBDOSAgICAgMHgwMDAwMDBGMGx1CisjZGVmaW5lCUxDSEFOUEMxMCAgICAweDAwMDAwRjAwbHUKKyNkZWZpbmUJTENIQU5QQzExICAgIDB4MDAwMEYwMDBsdQorI2RlZmluZQlMQ0hBTlBDMTIgICAgMHgwMDBGMDAwMGx1CisjZGVmaW5lCUxDSEFOUEMxMyAgICAweDAwRjAwMDAwbHUKKyNkZWZpbmUJTENIQU5QQzE0ICAgIDB4MEYwMDAwMDBsdQorI2RlZmluZQlMQ0hBTlBDMTUgICAgMHhGMDAwMDAwMGx1CisKKworLyogTVhWUl9TWU5DX0xDSEFOXzIgTWFza3MgKi8KKworI2RlZmluZQlMQ0hBTlBDMTYgICAgMHgwMDAwMDAwRmx1CisjZGVmaW5lCUxDSEFOUEMxNyAgICAweDAwMDAwMEYwbHUKKyNkZWZpbmUJTENIQU5QQzE4ICAgIDB4MDAwMDBGMDBsdQorI2RlZmluZQlMQ0hBTlBDMTkgICAgMHgwMDAwRjAwMGx1CisjZGVmaW5lCUxDSEFOUEMyMCAgICAweDAwMEYwMDAwbHUKKyNkZWZpbmUJTENIQU5QQzIxICAgIDB4MDBGMDAwMDBsdQorI2RlZmluZQlMQ0hBTlBDMjIgICAgMHgwRjAwMDAwMGx1CisjZGVmaW5lCUxDSEFOUEMyMyAgICAweEYwMDAwMDAwbHUKKworCisvKiBNWFZSX1NZTkNfTENIQU5fMyBNYXNrcyAqLworCisjZGVmaW5lCUxDSEFOUEMyNCAgICAweDAwMDAwMDBGbHUKKyNkZWZpbmUJTENIQU5QQzI1ICAgIDB4MDAwMDAwRjBsdQorI2RlZmluZQlMQ0hBTlBDMjYgICAgMHgwMDAwMEYwMGx1CisjZGVmaW5lCUxDSEFOUEMyNyAgICAweDAwMDBGMDAwbHUKKyNkZWZpbmUJTENIQU5QQzI4ICAgIDB4MDAwRjAwMDBsdQorI2RlZmluZQlMQ0hBTlBDMjkgICAgMHgwMEYwMDAwMGx1CisjZGVmaW5lCUxDSEFOUEMzMCAgICAweDBGMDAwMDAwbHUKKyNkZWZpbmUJTENIQU5QQzMxICAgIDB4RjAwMDAwMDBsdQorCisKKy8qIE1YVlJfU1lOQ19MQ0hBTl80IE1hc2tzICovCisKKyNkZWZpbmUJTENIQU5QQzMyICAgIDB4MDAwMDAwMEZsdQorI2RlZmluZQlMQ0hBTlBDMzMgICAgMHgwMDAwMDBGMGx1CisjZGVmaW5lCUxDSEFOUEMzNCAgICAweDAwMDAwRjAwbHUKKyNkZWZpbmUJTENIQU5QQzM1ICAgIDB4MDAwMEYwMDBsdQorI2RlZmluZQlMQ0hBTlBDMzYgICAgMHgwMDBGMDAwMGx1CisjZGVmaW5lCUxDSEFOUEMzNyAgICAweDAwRjAwMDAwbHUKKyNkZWZpbmUJTENIQU5QQzM4ICAgIDB4MEYwMDAwMDBsdQorI2RlZmluZQlMQ0hBTlBDMzkgICAgMHhGMDAwMDAwMGx1CisKKworLyogTVhWUl9TWU5DX0xDSEFOXzUgTWFza3MgKi8KKworI2RlZmluZQlMQ0hBTlBDNDAgICAgMHgwMDAwMDAwRmx1CisjZGVmaW5lCUxDSEFOUEM0MSAgICAweDAwMDAwMEYwbHUKKyNkZWZpbmUJTENIQU5QQzQyICAgIDB4MDAwMDBGMDBsdQorI2RlZmluZQlMQ0hBTlBDNDMgICAgMHgwMDAwRjAwMGx1CisjZGVmaW5lCUxDSEFOUEM0NCAgICAweDAwMEYwMDAwbHUKKyNkZWZpbmUJTENIQU5QQzQ1ICAgIDB4MDBGMDAwMDBsdQorI2RlZmluZQlMQ0hBTlBDNDYgICAgMHgwRjAwMDAwMGx1CisjZGVmaW5lCUxDSEFOUEM0NyAgICAweEYwMDAwMDAwbHUKKworCisvKiBNWFZSX1NZTkNfTENIQU5fNiBNYXNrcyAqLworCisjZGVmaW5lCUxDSEFOUEM0OCAgICAweDAwMDAwMDBGbHUKKyNkZWZpbmUJTENIQU5QQzQ5ICAgIDB4MDAwMDAwRjBsdQorI2RlZmluZQlMQ0hBTlBDNTAgICAgMHgwMDAwMEYwMGx1CisjZGVmaW5lCUxDSEFOUEM1MSAgICAweDAwMDBGMDAwbHUKKyNkZWZpbmUJTENIQU5QQzUyICAgIDB4MDAwRjAwMDBsdQorI2RlZmluZQlMQ0hBTlBDNTMgICAgMHgwMEYwMDAwMGx1CisjZGVmaW5lCUxDSEFOUEM1NCAgICAweDBGMDAwMDAwbHUKKyNkZWZpbmUJTENIQU5QQzU1ICAgIDB4RjAwMDAwMDBsdQorCisKKy8qIE1YVlJfU1lOQ19MQ0hBTl83IE1hc2tzICovCisKKyNkZWZpbmUJTENIQU5QQzU2ICAgIDB4MDAwMDAwMEZsdQorI2RlZmluZQlMQ0hBTlBDNTcgICAgMHgwMDAwMDBGMGx1CisjZGVmaW5lCUxDSEFOUEM1OCAgICAweDAwMDAwRjAwbHUKKyNkZWZpbmUJTENIQU5QQzU5ICAgIDB4MDAwMEYwMDBsdQorCisKKy8qIE1YVlJfRE1BeF9DT05GSUcgTWFza3MgKi8KKworI2RlZmluZQlNRE1BRU4JICAgIDB4MDAwMDAwMDFsdQorI2RlZmluZQlERAkgICAgMHgwMDAwMDAwMmx1CisjZGVmaW5lCUxDSEFOCSAgICAweDAwMDAwM0MwbHUKKyNkZWZpbmUJQklUU1dBUEVOICAgMHgwMDAwMDQwMGx1CisjZGVmaW5lCUJZU1dBUEVOICAgIDB4MDAwMDA4MDBsdQorI2RlZmluZQlNRkxPVwkgICAgMHgwMDAwNzAwMGx1CisjZGVmaW5lCUZJWEVEUE0JICAgIDB4MDAwODAwMDBsdQorI2RlZmluZQlTVEFSVFBBVCAgICAweDAwMzAwMDAwbHUKKyNkZWZpbmUJU1RPUFBBVAkgICAgMHgwMEMwMDAwMGx1CisjZGVmaW5lCUNPVU5UUE9TICAgIDB4MUMwMDAwMDBsdQorCisjZGVmaW5lCUREX1RYCSAgICAweDAwMDAwMDAwbHUKKyNkZWZpbmUJRERfUlgJICAgIDB4MDAwMDAwMDJsdQorCisjZGVmaW5lCUxDSEFOXzAJICAgIDB4MDAwMDAwMDBsdQorI2RlZmluZQlMQ0hBTl8xCSAgICAweDAwMDAwMDQwbHUKKyNkZWZpbmUJTENIQU5fMgkgICAgMHgwMDAwMDA4MGx1CisjZGVmaW5lCUxDSEFOXzMJICAgIDB4MDAwMDAwQzBsdQorI2RlZmluZQlMQ0hBTl80CSAgICAweDAwMDAwMTAwbHUKKyNkZWZpbmUJTENIQU5fNQkgICAgMHgwMDAwMDE0MGx1CisjZGVmaW5lCUxDSEFOXzYJICAgIDB4MDAwMDAxODBsdQorI2RlZmluZQlMQ0hBTl83CSAgICAweDAwMDAwMUMwbHUKKworI2RlZmluZQlNRkxPV19TVE9QICAweDAwMDAwMDAwbHUKKyNkZWZpbmUJTUZMT1dfQVVUTyAgMHgwMDAwMTAwMGx1CisjZGVmaW5lCU1GTE9XX1BWQyAgIDB4MDAwMDIwMDBsdQorI2RlZmluZQlNRkxPV19QU1MgICAweDAwMDAzMDAwbHUKKyNkZWZpbmUJTUZMT1dfUEZDICAgMHgwMDAwNDAwMGx1CisKKyNkZWZpbmUJU1RBUlRQQVRfMCAgMHgwMDAwMDAwMGx1CisjZGVmaW5lCVNUQVJUUEFUXzEgIDB4MDAxMDAwMDBsdQorCisjZGVmaW5lCVNUT1BQQVRfMCAgIDB4MDAwMDAwMDBsdQorI2RlZmluZQlTVE9QUEFUXzEgICAweDAwNDAwMDAwbHUKKworI2RlZmluZQlDT1VOVFBPU18wICAweDAwMDAwMDAwbHUKKyNkZWZpbmUJQ09VTlRQT1NfMSAgMHgwNDAwMDAwMGx1CisjZGVmaW5lCUNPVU5UUE9TXzIgIDB4MDgwMDAwMDBsdQorI2RlZmluZQlDT1VOVFBPU18zICAweDBDMDAwMDAwbHUKKyNkZWZpbmUJQ09VTlRQT1NfNCAgMHgxMDAwMDAwMGx1CisjZGVmaW5lCUNPVU5UUE9TXzUgIDB4MTQwMDAwMDBsdQorI2RlZmluZQlDT1VOVFBPU182ICAweDE4MDAwMDAwbHUKKyNkZWZpbmUJQ09VTlRQT1NfNyAgMHgxQzAwMDAwMGx1CisKKworLyogTVhWUl9BUF9DVEwgTWFza3MgKi8KKworI2RlZmluZQlTVEFSVEFQCSAgIDB4MDAwMDAwMDFsdQorI2RlZmluZQlDQU5DRUxBUCAgIDB4MDAwMDAwMDJsdQorI2RlZmluZQlSRVNFVEFQCSAgIDB4MDAwMDAwMDRsdQorI2RlZmluZQlBUFJCRTAJICAgMHgwMDAwNDAwMGx1CisjZGVmaW5lCUFQUkJFMQkgICAweDAwMDA4MDAwbHUKKyNkZWZpbmUJQVBSQkVYCSAgIDB4MDAwMEMwMDBsdQorCisKKy8qIE1YVlJfQ01fQ1RMIE1hc2tzICovCisKKyNkZWZpbmUJU1RBUlRDTQkgICAweDAwMDAwMDAxbHUKKyNkZWZpbmUJQ0FOQ0VMQ00gICAweDAwMDAwMDAybHUKKyNkZWZpbmUJQ01SQkVYCSAgIDB4RkZGRjAwMDBsdQorI2RlZmluZQlDTVJCRTAJICAgMHgwMDAxMDAwMGx1CisjZGVmaW5lCUNNUkJFMQkgICAweDAwMDIwMDAwbHUKKyNkZWZpbmUJQ01SQkUyCSAgIDB4MDAwNDAwMDBsdQorI2RlZmluZQlDTVJCRTMJICAgMHgwMDA4MDAwMGx1CisjZGVmaW5lCUNNUkJFNAkgICAweDAwMTAwMDAwbHUKKyNkZWZpbmUJQ01SQkU1CSAgIDB4MDAyMDAwMDBsdQorI2RlZmluZQlDTVJCRTYJICAgMHgwMDQwMDAwMGx1CisjZGVmaW5lCUNNUkJFNwkgICAweDAwODAwMDAwbHUKKyNkZWZpbmUJQ01SQkU4CSAgIDB4MDEwMDAwMDBsdQorI2RlZmluZQlDTVJCRTkJICAgMHgwMjAwMDAwMGx1CisjZGVmaW5lCUNNUkJFMTAJICAgMHgwNDAwMDAwMGx1CisjZGVmaW5lCUNNUkJFMTEJICAgMHgwODAwMDAwMGx1CisjZGVmaW5lCUNNUkJFMTIJICAgMHgxMDAwMDAwMGx1CisjZGVmaW5lCUNNUkJFMTMJICAgMHgyMDAwMDAwMGx1CisjZGVmaW5lCUNNUkJFMTQJICAgMHg0MDAwMDAwMGx1CisjZGVmaW5lCUNNUkJFMTUJICAgMHg4MDAwMDAwMGx1CisKKworLyogTVhWUl9QQVRfREFUQV94IE1hc2tzICovCisKKyNkZWZpbmUJTUFUQ0hfREFUQV8wIDB4MDAwMDAwRkZsdQorI2RlZmluZQlNQVRDSF9EQVRBXzEgMHgwMDAwRkYwMGx1CisjZGVmaW5lCU1BVENIX0RBVEFfMiAweDAwRkYwMDAwbHUKKyNkZWZpbmUJTUFUQ0hfREFUQV8zIDB4RkYwMDAwMDBsdQorCisKKworLyogTVhWUl9QQVRfRU5feCBNYXNrcyAqLworCisjZGVmaW5lCU1BVENIX0VOXzBfMCAweDAwMDAwMDAxbHUKKyNkZWZpbmUJTUFUQ0hfRU5fMF8xIDB4MDAwMDAwMDJsdQorI2RlZmluZQlNQVRDSF9FTl8wXzIgMHgwMDAwMDAwNGx1CisjZGVmaW5lCU1BVENIX0VOXzBfMyAweDAwMDAwMDA4bHUKKyNkZWZpbmUJTUFUQ0hfRU5fMF80IDB4MDAwMDAwMTBsdQorI2RlZmluZQlNQVRDSF9FTl8wXzUgMHgwMDAwMDAyMGx1CisjZGVmaW5lCU1BVENIX0VOXzBfNiAweDAwMDAwMDQwbHUKKyNkZWZpbmUJTUFUQ0hfRU5fMF83IDB4MDAwMDAwODBsdQorCisjZGVmaW5lCU1BVENIX0VOXzFfMCAweDAwMDAwMTAwbHUKKyNkZWZpbmUJTUFUQ0hfRU5fMV8xIDB4MDAwMDAyMDBsdQorI2RlZmluZQlNQVRDSF9FTl8xXzIgMHgwMDAwMDQwMGx1CisjZGVmaW5lCU1BVENIX0VOXzFfMyAweDAwMDAwODAwbHUKKyNkZWZpbmUJTUFUQ0hfRU5fMV80IDB4MDAwMDEwMDBsdQorI2RlZmluZQlNQVRDSF9FTl8xXzUgMHgwMDAwMjAwMGx1CisjZGVmaW5lCU1BVENIX0VOXzFfNiAweDAwMDA0MDAwbHUKKyNkZWZpbmUJTUFUQ0hfRU5fMV83IDB4MDAwMDgwMDBsdQorCisjZGVmaW5lCU1BVENIX0VOXzJfMCAweDAwMDEwMDAwbHUKKyNkZWZpbmUJTUFUQ0hfRU5fMl8xIDB4MDAwMjAwMDBsdQorI2RlZmluZQlNQVRDSF9FTl8yXzIgMHgwMDA0MDAwMGx1CisjZGVmaW5lCU1BVENIX0VOXzJfMyAweDAwMDgwMDAwbHUKKyNkZWZpbmUJTUFUQ0hfRU5fMl80IDB4MDAxMDAwMDBsdQorI2RlZmluZQlNQVRDSF9FTl8yXzUgMHgwMDIwMDAwMGx1CisjZGVmaW5lCU1BVENIX0VOXzJfNiAweDAwNDAwMDAwbHUKKyNkZWZpbmUJTUFUQ0hfRU5fMl83IDB4MDA4MDAwMDBsdQorCisjZGVmaW5lCU1BVENIX0VOXzNfMCAweDAxMDAwMDAwbHUKKyNkZWZpbmUJTUFUQ0hfRU5fM18xIDB4MDIwMDAwMDBsdQorI2RlZmluZQlNQVRDSF9FTl8zXzIgMHgwNDAwMDAwMGx1CisjZGVmaW5lCU1BVENIX0VOXzNfMyAweDA4MDAwMDAwbHUKKyNkZWZpbmUJTUFUQ0hfRU5fM180IDB4MTAwMDAwMDBsdQorI2RlZmluZQlNQVRDSF9FTl8zXzUgMHgyMDAwMDAwMGx1CisjZGVmaW5lCU1BVENIX0VOXzNfNiAweDQwMDAwMDAwbHUKKyNkZWZpbmUJTUFUQ0hfRU5fM183IDB4ODAwMDAwMDBsdQorCisKKy8qIE1YVlJfUk9VVElOR18wIE1hc2tzICovCisKKyNkZWZpbmUJTVVURV9DSDAJMHgwMDAwMDA4MGx1CisjZGVmaW5lCU1VVEVfQ0gxCTB4MDAwMDgwMDBsdQorI2RlZmluZQlNVVRFX0NIMgkweDAwODAwMDAwbHUKKyNkZWZpbmUJTVVURV9DSDMJMHg4MDAwMDAwMGx1CisKKyNkZWZpbmUJVFhfQ0gwCQkweDAwMDAwMDdGbHUKKyNkZWZpbmUJVFhfQ0gxCQkweDAwMDA3RjAwbHUKKyNkZWZpbmUJVFhfQ0gyCQkweDAwN0YwMDAwbHUKKyNkZWZpbmUJVFhfQ0gzCQkweDdGMDAwMDAwbHUKKworCisvKiBNWFZSX1JPVVRJTkdfMSBNYXNrcyAqLworCisjZGVmaW5lCU1VVEVfQ0g0CTB4MDAwMDAwODBsdQorI2RlZmluZQlNVVRFX0NINQkweDAwMDA4MDAwbHUKKyNkZWZpbmUJTVVURV9DSDYJMHgwMDgwMDAwMGx1CisjZGVmaW5lCU1VVEVfQ0g3CTB4ODAwMDAwMDBsdQorCisjZGVmaW5lCVRYX0NINAkJMHgwMDAwMDA3Rmx1CisjZGVmaW5lCVRYX0NINQkJMHgwMDAwN0YwMGx1CisjZGVmaW5lCVRYX0NINgkJMHgwMDdGMDAwMGx1CisjZGVmaW5lCVRYX0NINwkJMHg3RjAwMDAwMGx1CisKKworLyogTVhWUl9ST1VUSU5HXzIgTWFza3MgKi8KKworI2RlZmluZQlNVVRFX0NIOAkweDAwMDAwMDgwbHUKKyNkZWZpbmUJTVVURV9DSDkJMHgwMDAwODAwMGx1CisjZGVmaW5lCU1VVEVfQ0gxMAkweDAwODAwMDAwbHUKKyNkZWZpbmUJTVVURV9DSDExCTB4ODAwMDAwMDBsdQorCisjZGVmaW5lCVRYX0NIOAkJMHgwMDAwMDA3Rmx1CisjZGVmaW5lCVRYX0NIOQkJMHgwMDAwN0YwMGx1CisjZGVmaW5lCVRYX0NIMTAJCTB4MDA3RjAwMDBsdQorI2RlZmluZQlUWF9DSDExCQkweDdGMDAwMDAwbHUKKworLyogTVhWUl9ST1VUSU5HXzMgTWFza3MgKi8KKworI2RlZmluZQlNVVRFX0NIMTIJMHgwMDAwMDA4MGx1CisjZGVmaW5lCU1VVEVfQ0gxMwkweDAwMDA4MDAwbHUKKyNkZWZpbmUJTVVURV9DSDE0CTB4MDA4MDAwMDBsdQorI2RlZmluZQlNVVRFX0NIMTUJMHg4MDAwMDAwMGx1CisKKyNkZWZpbmUJVFhfQ0gxMgkJMHgwMDAwMDA3Rmx1CisjZGVmaW5lCVRYX0NIMTMJCTB4MDAwMDdGMDBsdQorI2RlZmluZQlUWF9DSDE0CQkweDAwN0YwMDAwbHUKKyNkZWZpbmUJVFhfQ0gxNQkJMHg3RjAwMDAwMGx1CisKKworLyogTVhWUl9ST1VUSU5HXzQgTWFza3MgKi8KKworI2RlZmluZQlNVVRFX0NIMTYJMHgwMDAwMDA4MGx1CisjZGVmaW5lCU1VVEVfQ0gxNwkweDAwMDA4MDAwbHUKKyNkZWZpbmUJTVVURV9DSDE4CTB4MDA4MDAwMDBsdQorI2RlZmluZQlNVVRFX0NIMTkJMHg4MDAwMDAwMGx1CisKKyNkZWZpbmUJVFhfQ0gxNgkJMHgwMDAwMDA3Rmx1CisjZGVmaW5lCVRYX0NIMTcJCTB4MDAwMDdGMDBsdQorI2RlZmluZQlUWF9DSDE4CQkweDAwN0YwMDAwbHUKKyNkZWZpbmUJVFhfQ0gxOQkJMHg3RjAwMDAwMGx1CisKKworLyogTVhWUl9ST1VUSU5HXzUgTWFza3MgKi8KKworI2RlZmluZQlNVVRFX0NIMjAJMHgwMDAwMDA4MGx1CisjZGVmaW5lCU1VVEVfQ0gyMQkweDAwMDA4MDAwbHUKKyNkZWZpbmUJTVVURV9DSDIyCTB4MDA4MDAwMDBsdQorI2RlZmluZQlNVVRFX0NIMjMJMHg4MDAwMDAwMGx1CisKKyNkZWZpbmUJVFhfQ0gyMAkJMHgwMDAwMDA3Rmx1CisjZGVmaW5lCVRYX0NIMjEJCTB4MDAwMDdGMDBsdQorI2RlZmluZQlUWF9DSDIyCQkweDAwN0YwMDAwbHUKKyNkZWZpbmUJVFhfQ0gyMwkJMHg3RjAwMDAwMGx1CisKKworLyogTVhWUl9ST1VUSU5HXzYgTWFza3MgKi8KKworI2RlZmluZQlNVVRFX0NIMjQJMHgwMDAwMDA4MGx1CisjZGVmaW5lCU1VVEVfQ0gyNQkweDAwMDA4MDAwbHUKKyNkZWZpbmUJTVVURV9DSDI2CTB4MDA4MDAwMDBsdQorI2RlZmluZQlNVVRFX0NIMjcJMHg4MDAwMDAwMGx1CisKKyNkZWZpbmUJVFhfQ0gyNAkJMHgwMDAwMDA3Rmx1CisjZGVmaW5lCVRYX0NIMjUJCTB4MDAwMDdGMDBsdQorI2RlZmluZQlUWF9DSDI2CQkweDAwN0YwMDAwbHUKKyNkZWZpbmUJVFhfQ0gyNwkJMHg3RjAwMDAwMGx1CisKKworLyogTVhWUl9ST1VUSU5HXzcgTWFza3MgKi8KKworI2RlZmluZQlNVVRFX0NIMjgJMHgwMDAwMDA4MGx1CisjZGVmaW5lCU1VVEVfQ0gyOQkweDAwMDA4MDAwbHUKKyNkZWZpbmUJTVVURV9DSDMwCTB4MDA4MDAwMDBsdQorI2RlZmluZQlNVVRFX0NIMzEJMHg4MDAwMDAwMGx1CisKKyNkZWZpbmUJVFhfQ0gyOAkJMHgwMDAwMDA3Rmx1CisjZGVmaW5lCVRYX0NIMjkJCTB4MDAwMDdGMDBsdQorI2RlZmluZQlUWF9DSDMwCQkweDAwN0YwMDAwbHUKKyNkZWZpbmUJVFhfQ0gzMQkJMHg3RjAwMDAwMGx1CisKKworLyogTVhWUl9ST1VUSU5HXzggTWFza3MgKi8KKworI2RlZmluZQlNVVRFX0NIMzIJMHgwMDAwMDA4MGx1CisjZGVmaW5lCU1VVEVfQ0gzMwkweDAwMDA4MDAwbHUKKyNkZWZpbmUJTVVURV9DSDM0CTB4MDA4MDAwMDBsdQorI2RlZmluZQlNVVRFX0NIMzUJMHg4MDAwMDAwMGx1CisKKyNkZWZpbmUJVFhfQ0gzMgkJMHgwMDAwMDA3Rmx1CisjZGVmaW5lCVRYX0NIMzMJCTB4MDAwMDdGMDBsdQorI2RlZmluZQlUWF9DSDM0CQkweDAwN0YwMDAwbHUKKyNkZWZpbmUJVFhfQ0gzNQkJMHg3RjAwMDAwMGx1CisKKworLyogTVhWUl9ST1VUSU5HXzkgTWFza3MgKi8KKworI2RlZmluZQlNVVRFX0NIMzYJMHgwMDAwMDA4MGx1CisjZGVmaW5lCU1VVEVfQ0gzNwkweDAwMDA4MDAwbHUKKyNkZWZpbmUJTVVURV9DSDM4CTB4MDA4MDAwMDBsdQorI2RlZmluZQlNVVRFX0NIMzkJMHg4MDAwMDAwMGx1CisKKyNkZWZpbmUJVFhfQ0gzNgkJMHgwMDAwMDA3Rmx1CisjZGVmaW5lCVRYX0NIMzcJCTB4MDAwMDdGMDBsdQorI2RlZmluZQlUWF9DSDM4CQkweDAwN0YwMDAwbHUKKyNkZWZpbmUJVFhfQ0gzOQkJMHg3RjAwMDAwMGx1CisKKworLyogTVhWUl9ST1VUSU5HXzEwIE1hc2tzICovCisKKyNkZWZpbmUJTVVURV9DSDQwCTB4MDAwMDAwODBsdQorI2RlZmluZQlNVVRFX0NINDEJMHgwMDAwODAwMGx1CisjZGVmaW5lCU1VVEVfQ0g0MgkweDAwODAwMDAwbHUKKyNkZWZpbmUJTVVURV9DSDQzCTB4ODAwMDAwMDBsdQorCisjZGVmaW5lCVRYX0NINDAJCTB4MDAwMDAwN0ZsdQorI2RlZmluZQlUWF9DSDQxCQkweDAwMDA3RjAwbHUKKyNkZWZpbmUJVFhfQ0g0MgkJMHgwMDdGMDAwMGx1CisjZGVmaW5lCVRYX0NINDMJCTB4N0YwMDAwMDBsdQorCisKKy8qIE1YVlJfUk9VVElOR18xMSBNYXNrcyAqLworCisjZGVmaW5lCU1VVEVfQ0g0NAkweDAwMDAwMDgwbHUKKyNkZWZpbmUJTVVURV9DSDQ1CTB4MDAwMDgwMDBsdQorI2RlZmluZQlNVVRFX0NINDYJMHgwMDgwMDAwMGx1CisjZGVmaW5lCU1VVEVfQ0g0NwkweDgwMDAwMDAwbHUKKworI2RlZmluZQlUWF9DSDQ0CQkweDAwMDAwMDdGbHUKKyNkZWZpbmUJVFhfQ0g0NQkJMHgwMDAwN0YwMGx1CisjZGVmaW5lCVRYX0NINDYJCTB4MDA3RjAwMDBsdQorI2RlZmluZQlUWF9DSDQ3CQkweDdGMDAwMDAwbHUKKworCisvKiBNWFZSX1JPVVRJTkdfMTIgTWFza3MgKi8KKworI2RlZmluZQlNVVRFX0NINDgJMHgwMDAwMDA4MGx1CisjZGVmaW5lCU1VVEVfQ0g0OQkweDAwMDA4MDAwbHUKKyNkZWZpbmUJTVVURV9DSDUwCTB4MDA4MDAwMDBsdQorI2RlZmluZQlNVVRFX0NINTEJMHg4MDAwMDAwMGx1CisKKyNkZWZpbmUJVFhfQ0g0OAkJMHgwMDAwMDA3Rmx1CisjZGVmaW5lCVRYX0NINDkJCTB4MDAwMDdGMDBsdQorI2RlZmluZQlUWF9DSDUwCQkweDAwN0YwMDAwbHUKKyNkZWZpbmUJVFhfQ0g1MQkJMHg3RjAwMDAwMGx1CisKKworLyogTVhWUl9ST1VUSU5HXzEzIE1hc2tzICovCisKKyNkZWZpbmUJTVVURV9DSDUyCTB4MDAwMDAwODBsdQorI2RlZmluZQlNVVRFX0NINTMJMHgwMDAwODAwMGx1CisjZGVmaW5lCU1VVEVfQ0g1NAkweDAwODAwMDAwbHUKKyNkZWZpbmUJTVVURV9DSDU1CTB4ODAwMDAwMDBsdQorCisjZGVmaW5lCVRYX0NINTIJCTB4MDAwMDAwN0ZsdQorI2RlZmluZQlUWF9DSDUzCQkweDAwMDA3RjAwbHUKKyNkZWZpbmUJVFhfQ0g1NAkJMHgwMDdGMDAwMGx1CisjZGVmaW5lCVRYX0NINTUJCTB4N0YwMDAwMDBsdQorCisKKy8qIE1YVlJfUk9VVElOR18xNCBNYXNrcyAqLworCisjZGVmaW5lCU1VVEVfQ0g1NgkweDAwMDAwMDgwbHUKKyNkZWZpbmUJTVVURV9DSDU3CTB4MDAwMDgwMDBsdQorI2RlZmluZQlNVVRFX0NINTgJMHgwMDgwMDAwMGx1CisjZGVmaW5lCU1VVEVfQ0g1OQkweDgwMDAwMDAwbHUKKworI2RlZmluZQlUWF9DSDU2CQkweDAwMDAwMDdGbHUKKyNkZWZpbmUJVFhfQ0g1NwkJMHgwMDAwN0YwMGx1CisjZGVmaW5lCVRYX0NINTgJCTB4MDA3RjAwMDBsdQorI2RlZmluZQlUWF9DSDU5CQkweDdGMDAwMDAwbHUKKworCisvKiBDb250cm9sIE1lc3NhZ2UgUmVjZWl2ZSBCdWZmZXIgKENNUkIpIEFkZHJlc3MgT2Zmc2V0cyAqLworCisjZGVmaW5lCUNNUkJfU1RSSURFCSAgMHgwMDAwMDAxNmx1CisKKyNkZWZpbmUJQ01SQl9EU1RfT0ZGU0VUCSAgMHgwMDAwMDAwMGx1CisjZGVmaW5lCUNNUkJfU1JDX09GRlNFVAkgIDB4MDAwMDAwMDJsdQorI2RlZmluZQlDTVJCX0RBVEFfT0ZGU0VUICAweDAwMDAwMDA1bHUKKworCisvKiBDb250cm9sIE1lc3NhZ2UgVHJhbnNtaXQgQnVmZmVyIChDTVRCKSBBZGRyZXNzIE9mZnNldHMgKi8KKworI2RlZmluZQlDTVRCX1BSSU9fT0ZGU0VUICAgIDB4MDAwMDAwMDBsdQorI2RlZmluZQlDTVRCX0RTVF9PRkZTRVQJICAgIDB4MDAwMDAwMDJsdQorI2RlZmluZQlDTVRCX1NSQ19PRkZTRVQJICAgIDB4MDAwMDAwMDRsdQorI2RlZmluZQlDTVRCX1RZUEVfT0ZGU0VUICAgIDB4MDAwMDAwMDZsdQorI2RlZmluZQlDTVRCX0RBVEFfT0ZGU0VUICAgIDB4MDAwMDAwMDdsdQorCisjZGVmaW5lCUNNVEJfQU5TV0VSX09GRlNFVCAgMHgwMDAwMDAwQWx1CisKKyNkZWZpbmUJQ01UQl9TVEFUX05fT0ZGU0VUICAweDAwMDAwMDE4bHUKKyNkZWZpbmUJQ01UQl9TVEFUX0FfT0ZGU0VUICAweDAwMDAwMDE2bHUKKyNkZWZpbmUJQ01UQl9TVEFUX0RfT0ZGU0VUICAweDAwMDAwMDBFbHUKKyNkZWZpbmUJQ01UQl9TVEFUX1JfT0ZGU0VUICAweDAwMDAwMDE0bHUKKyNkZWZpbmUJQ01UQl9TVEFUX1dfT0ZGU0VUICAweDAwMDAwMDE0bHUKKyNkZWZpbmUJQ01UQl9TVEFUX0dfT0ZGU0VUICAweDAwMDAwMDE0bHUKKworCisvKiBBc3luY2hyb25vdXMJUGFja2V0IFJlY2VpdmUgQnVmZmVyIChBUFJCKSBBZGRyZXNzIE9mZnNldHMgKi8KKworI2RlZmluZQlBUFJCX1NUUklERQkgIDB4MDAwMDA0MDBsdQorCisjZGVmaW5lCUFQUkJfRFNUX09GRlNFVAkgIDB4MDAwMDAwMDBsdQorI2RlZmluZQlBUFJCX0xFTl9PRkZTRVQJICAweDAwMDAwMDAybHUKKyNkZWZpbmUJQVBSQl9TUkNfT0ZGU0VUCSAgMHgwMDAwMDAwNGx1CisjZGVmaW5lCUFQUkJfREFUQV9PRkZTRVQgIDB4MDAwMDAwMDZsdQorCisKKy8qIEFzeW5jaHJvbm91cwlQYWNrZXQgVHJhbnNtaXQJQnVmZmVyIChBUFRCKSBBZGRyZXNzIE9mZnNldHMgKi8KKworI2RlZmluZQlBUFRCX1BSSU9fT0ZGU0VUICAweDAwMDAwMDAwbHUKKyNkZWZpbmUJQVBUQl9EU1RfT0ZGU0VUCSAgMHgwMDAwMDAwMmx1CisjZGVmaW5lCUFQVEJfTEVOX09GRlNFVAkgIDB4MDAwMDAwMDRsdQorI2RlZmluZQlBUFRCX1NSQ19PRkZTRVQJICAweDAwMDAwMDA2bHUKKyNkZWZpbmUJQVBUQl9EQVRBX09GRlNFVCAgMHgwMDAwMDAwOGx1CisKKworLyogUmVtb3RlIFJlYWQgQnVmZmVyIChSUkRCKSBBZGRyZXNzIE9mZnNldHMgKi8KKworI2RlZmluZQlSUkRCX1dBRERSX09GRlNFVCAweDAwMDAwMTAwbHUKKyNkZWZpbmUJUlJEQl9XTEVOX09GRlNFVCAgMHgwMDAwMDEwMWx1CisKKworCisvKiAqKioqKioqKioqKioJIENPTlRST0xMRVIgQVJFQSBORVRXT1JLIChDQU4pIE1BU0tTICAqKioqKioqKioqKioqKiovCisvKiBDQU5fQ09OVFJPTCBNYXNrcwkJCQkJICovCisjZGVmaW5lCVNSUwkJCTB4MDAwMQkvKiBTb2Z0d2FyZSBSZXNldCAqLworI2RlZmluZQlETk0JCQkweDAwMDIJLyogRGV2aWNlIE5ldCBNb2RlICovCisjZGVmaW5lCUFCTwkJCTB4MDAwNAkvKiBBdXRvLUJ1cyBPbiBFbmFibGUgKi8KKyNkZWZpbmUJV0JBCQkJMHgwMDEwCS8qIFdha2UtVXAgT24gQ0FOIEJ1cyBBY3Rpdml0eSBFbmFibGUgKi8KKyNkZWZpbmUJU01SCQkJMHgwMDIwCS8qIFNsZWVwIE1vZGUgUmVxdWVzdCAqLworI2RlZmluZQlDU1IJCQkweDAwNDAJLyogQ0FOIFN1c3BlbmQgTW9kZSBSZXF1ZXN0ICovCisjZGVmaW5lCUNDUgkJCTB4MDA4MAkvKiBDQU4gQ29uZmlndXJhdGlvbiBNb2RlIFJlcXVlc3QgKi8KKworLyogQ0FOX1NUQVRVUyBNYXNrcwkJCQkJICovCisjZGVmaW5lCVdUCQkJMHgwMDAxCS8qIFRYIFdhcm5pbmcgRmxhZyAqLworI2RlZmluZQlXUgkJCTB4MDAwMgkvKiBSWCBXYXJuaW5nIEZsYWcgKi8KKyNkZWZpbmUJRVAJCQkweDAwMDQJLyogRXJyb3IgUGFzc2l2ZSBNb2RlICovCisjZGVmaW5lCUVCTwkJCTB4MDAwOAkvKiBFcnJvciBCdXMgT2ZmIE1vZGUgKi8KKyNkZWZpbmUJQ1NBCQkJMHgwMDQwCS8qIFN1c3BlbmQgTW9kZQlBY2tub3dsZWRnZSAqLworI2RlZmluZQlDQ0EJCQkweDAwODAJLyogQ29uZmlndXJhdGlvbiBNb2RlIEFja25vd2xlZGdlICovCisjZGVmaW5lCU1CUFRSCQkweDFGMDAJLyogTWFpbGJveCBQb2ludGVyICovCisjZGVmaW5lCVRSTQkJCTB4NDAwMAkvKiBUcmFuc21pdCBNb2RlICovCisjZGVmaW5lCVJFQwkJCTB4ODAwMAkvKiBSZWNlaXZlIE1vZGUgKi8KKworLyogQ0FOX0NMT0NLIE1hc2tzCQkgKi8KKyNkZWZpbmUJQlJQCQkJMHgwM0ZGCS8qIEJpdC1SYXRlIFByZS1TY2FsZXIgKi8KKworLyogQ0FOX1RJTUlORyBNYXNrcwkJCQkgKi8KKyNkZWZpbmUJVFNFRzEJCTB4MDAwRgkvKiBUaW1lCVNlZ21lbnQJMSAqLworI2RlZmluZQlUU0VHMgkJMHgwMDcwCS8qIFRpbWUJU2VnbWVudAkyICovCisjZGVmaW5lCVNBTQkJCTB4MDA4MAkvKiBTYW1wbGluZyAqLworI2RlZmluZQlTSlcJCQkweDAzMDAJLyogU3luY2hyb25pemF0aW9uIEp1bXAJV2lkdGggKi8KKworLyogQ0FOX0RFQlVHIE1hc2tzCQkJCSAqLworI2RlZmluZQlERUMJCQkweDAwMDEJLyogRGlzYWJsZSBDQU4gRXJyb3IgQ291bnRlcnMgKi8KKyNkZWZpbmUJRFJJCQkJMHgwMDAyCS8qIERpc2FibGUgQ0FOIFJYIElucHV0ICovCisjZGVmaW5lCURUTwkJCTB4MDAwNAkvKiBEaXNhYmxlIENBTiBUWCBPdXRwdXQgKi8KKyNkZWZpbmUJRElMCQkJMHgwMDA4CS8qIERpc2FibGUgQ0FOIEludGVybmFsCUxvb3AgKi8KKyNkZWZpbmUJTUFBCQkJMHgwMDEwCS8qIE1vZGUJQXV0by1BY2tub3dsZWRnZSBFbmFibGUgKi8KKyNkZWZpbmUJTVJCCQkJMHgwMDIwCS8qIE1vZGUJUmVhZCBCYWNrIEVuYWJsZSAqLworI2RlZmluZQlDREUJCQkweDgwMDAJLyogQ0FOIERlYnVnIEVuYWJsZSAqLworCisvKiBDQU5fQ0VDIE1hc2tzCQkJICovCisjZGVmaW5lCVJYRUNOVAkJMHgwMEZGCS8qIFJlY2VpdmUgRXJyb3IgQ291bnRlciAqLworI2RlZmluZQlUWEVDTlQJCTB4RkYwMAkvKiBUcmFuc21pdCBFcnJvciBDb3VudGVyICovCisKKy8qIENBTl9JTlRSIE1hc2tzCQkJCSAqLworI2RlZmluZQlNQlJJUlEJMHgwMDAxCS8qIE1haWxib3ggUmVjZWl2ZSBJbnRlcnJ1cHQgKi8KKyNkZWZpbmUJTUJSSUYJCU1CUklSUQkvKiBsZWdhY3kgKi8KKyNkZWZpbmUJTUJUSVJRCTB4MDAwMgkvKiBNYWlsYm94IFRyYW5zbWl0IEludGVycnVwdCAqLworI2RlZmluZQlNQlRJRgkJTUJUSVJRCS8qIGxlZ2FjeSAqLworI2RlZmluZQlHSVJRCQkweDAwMDQJLyogR2xvYmFsIEludGVycnVwdCAqLworI2RlZmluZQlTTUFDSwkJMHgwMDA4CS8qIFNsZWVwIE1vZGUgQWNrbm93bGVkZ2UgKi8KKyNkZWZpbmUJQ0FOVFgJCTB4MDA0MAkvKiBDQU4gVFggQnVzIFZhbHVlICovCisjZGVmaW5lCUNBTlJYCQkweDAwODAJLyogQ0FOIFJYIEJ1cyBWYWx1ZSAqLworCisvKiBDQU5fTUJ4eF9JRDEJYW5kIENBTl9NQnh4X0lEMCBNYXNrcwkJCSAqLworI2RlZmluZQlERkMJCQkweEZGRkYJLyogRGF0YQlGaWx0ZXJpbmcgQ29kZSAoSWYgRW5hYmxlZCkgKElEMCkgKi8KKyNkZWZpbmUJRVhUSURfTE8JMHhGRkZGCS8qIExvd2VyIDE2IEJpdHMgb2YgRXh0ZW5kZWQgSWRlbnRpZmllcgkoSUQwKSAqLworI2RlZmluZQlFWFRJRF9ISQkweDAwMDMJLyogVXBwZXIgMiBCaXRzCW9mIEV4dGVuZGVkIElkZW50aWZpZXIgKElEMSkgKi8KKyNkZWZpbmUJQkFTRUlECQkweDFGRkMJLyogQmFzZQlJZGVudGlmaWVyCSAqLworI2RlZmluZQlJREUJCQkweDIwMDAJLyogSWRlbnRpZmllciBFeHRlbnNpb24gKi8KKyNkZWZpbmUJUlRSCQkJMHg0MDAwCS8qIFJlbW90ZSBGcmFtZQlUcmFuc21pc3Npb24gUmVxdWVzdCAqLworI2RlZmluZQlBTUUJCQkweDgwMDAJLyogQWNjZXB0YW5jZSBNYXNrIEVuYWJsZSAqLworCisvKiBDQU5fTUJ4eF9USU1FU1RBTVAgTWFza3MgKi8KKyNkZWZpbmUJVFNWCQkJMHhGRkZGCS8qIFRpbWVzdGFtcCAqLworCisvKiBDQU5fTUJ4eF9MRU5HVEggTWFza3MgKi8KKyNkZWZpbmUJRExDCQkJMHgwMDBGCS8qIERhdGEJTGVuZ3RoIENvZGUgKi8KKworLyogQ0FOX0FNeHhIIGFuZCBDQU5fQU14eEwgTWFza3MJCQkJCSAqLworI2RlZmluZQlERk0JCQkweEZGRkYJLyogRGF0YQlGaWVsZCBNYXNrIChJZiBFbmFibGVkKQkoQ0FOX0FNeHhMKSAqLworI2RlZmluZQlFWFRJRF9MTwkweEZGRkYJLyogTG93ZXIgMTYgQml0cyBvZiBFeHRlbmRlZCBJZGVudGlmaWVyCShDQU5fQU14eEwpICovCisjZGVmaW5lCUVYVElEX0hJCTB4MDAwMwkvKiBVcHBlciAyIEJpdHMJb2YgRXh0ZW5kZWQgSWRlbnRpZmllciAoQ0FOX0FNeHhIKSAqLworI2RlZmluZQlCQVNFSUQJCTB4MUZGQwkvKiBCYXNlCUlkZW50aWZpZXIJCSAqLworI2RlZmluZQlBTUlERQkJMHgyMDAwCS8qIEFjY2VwdGFuY2UgTWFzayBJRCBFeHRlbnNpb24JRW5hYmxlICovCisjZGVmaW5lCUZNRAkJCTB4NDAwMAkvKiBGdWxsCU1hc2sgRGF0YSBGaWVsZAlFbmFibGUgKi8KKyNkZWZpbmUJRkRGCQkJMHg4MDAwCS8qIEZpbHRlciBPbiBEYXRhIEZpZWxkCUVuYWJsZSAqLworCisvKiBDQU5fTUMxIE1hc2tzCQkgKi8KKyNkZWZpbmUJTUMwCQkJMHgwMDAxCS8qIEVuYWJsZSBNYWlsYm94IDAgKi8KKyNkZWZpbmUJTUMxCQkJMHgwMDAyCS8qIEVuYWJsZSBNYWlsYm94IDEgKi8KKyNkZWZpbmUJTUMyCQkJMHgwMDA0CS8qIEVuYWJsZSBNYWlsYm94IDIgKi8KKyNkZWZpbmUJTUMzCQkJMHgwMDA4CS8qIEVuYWJsZSBNYWlsYm94IDMgKi8KKyNkZWZpbmUJTUM0CQkJMHgwMDEwCS8qIEVuYWJsZSBNYWlsYm94IDQgKi8KKyNkZWZpbmUJTUM1CQkJMHgwMDIwCS8qIEVuYWJsZSBNYWlsYm94IDUgKi8KKyNkZWZpbmUJTUM2CQkJMHgwMDQwCS8qIEVuYWJsZSBNYWlsYm94IDYgKi8KKyNkZWZpbmUJTUM3CQkJMHgwMDgwCS8qIEVuYWJsZSBNYWlsYm94IDcgKi8KKyNkZWZpbmUJTUM4CQkJMHgwMTAwCS8qIEVuYWJsZSBNYWlsYm94IDggKi8KKyNkZWZpbmUJTUM5CQkJMHgwMjAwCS8qIEVuYWJsZSBNYWlsYm94IDkgKi8KKyNkZWZpbmUJTUMxMAkJMHgwNDAwCS8qIEVuYWJsZSBNYWlsYm94IDEwICovCisjZGVmaW5lCU1DMTEJCTB4MDgwMAkvKiBFbmFibGUgTWFpbGJveCAxMSAqLworI2RlZmluZQlNQzEyCQkweDEwMDAJLyogRW5hYmxlIE1haWxib3ggMTIgKi8KKyNkZWZpbmUJTUMxMwkJMHgyMDAwCS8qIEVuYWJsZSBNYWlsYm94IDEzICovCisjZGVmaW5lCU1DMTQJCTB4NDAwMAkvKiBFbmFibGUgTWFpbGJveCAxNCAqLworI2RlZmluZQlNQzE1CQkweDgwMDAJLyogRW5hYmxlIE1haWxib3ggMTUgKi8KKworLyogQ0FOX01DMiBNYXNrcwkJICovCisjZGVmaW5lCU1DMTYJCTB4MDAwMQkvKiBFbmFibGUgTWFpbGJveCAxNiAqLworI2RlZmluZQlNQzE3CQkweDAwMDIJLyogRW5hYmxlIE1haWxib3ggMTcgKi8KKyNkZWZpbmUJTUMxOAkJMHgwMDA0CS8qIEVuYWJsZSBNYWlsYm94IDE4ICovCisjZGVmaW5lCU1DMTkJCTB4MDAwOAkvKiBFbmFibGUgTWFpbGJveCAxOSAqLworI2RlZmluZQlNQzIwCQkweDAwMTAJLyogRW5hYmxlIE1haWxib3ggMjAgKi8KKyNkZWZpbmUJTUMyMQkJMHgwMDIwCS8qIEVuYWJsZSBNYWlsYm94IDIxICovCisjZGVmaW5lCU1DMjIJCTB4MDA0MAkvKiBFbmFibGUgTWFpbGJveCAyMiAqLworI2RlZmluZQlNQzIzCQkweDAwODAJLyogRW5hYmxlIE1haWxib3ggMjMgKi8KKyNkZWZpbmUJTUMyNAkJMHgwMTAwCS8qIEVuYWJsZSBNYWlsYm94IDI0ICovCisjZGVmaW5lCU1DMjUJCTB4MDIwMAkvKiBFbmFibGUgTWFpbGJveCAyNSAqLworI2RlZmluZQlNQzI2CQkweDA0MDAJLyogRW5hYmxlIE1haWxib3ggMjYgKi8KKyNkZWZpbmUJTUMyNwkJMHgwODAwCS8qIEVuYWJsZSBNYWlsYm94IDI3ICovCisjZGVmaW5lCU1DMjgJCTB4MTAwMAkvKiBFbmFibGUgTWFpbGJveCAyOCAqLworI2RlZmluZQlNQzI5CQkweDIwMDAJLyogRW5hYmxlIE1haWxib3ggMjkgKi8KKyNkZWZpbmUJTUMzMAkJMHg0MDAwCS8qIEVuYWJsZSBNYWlsYm94IDMwICovCisjZGVmaW5lCU1DMzEJCTB4ODAwMAkvKiBFbmFibGUgTWFpbGJveCAzMSAqLworCisvKiBDQU5fTUQxIE1hc2tzCQkJCQkgKi8KKyNkZWZpbmUJTUQwCQkJMHgwMDAxCS8qIEVuYWJsZSBNYWlsYm94IDAgRm9yCVJlY2VpdmUgKi8KKyNkZWZpbmUJTUQxCQkJMHgwMDAyCS8qIEVuYWJsZSBNYWlsYm94IDEgRm9yCVJlY2VpdmUgKi8KKyNkZWZpbmUJTUQyCQkJMHgwMDA0CS8qIEVuYWJsZSBNYWlsYm94IDIgRm9yCVJlY2VpdmUgKi8KKyNkZWZpbmUJTUQzCQkJMHgwMDA4CS8qIEVuYWJsZSBNYWlsYm94IDMgRm9yCVJlY2VpdmUgKi8KKyNkZWZpbmUJTUQ0CQkJMHgwMDEwCS8qIEVuYWJsZSBNYWlsYm94IDQgRm9yCVJlY2VpdmUgKi8KKyNkZWZpbmUJTUQ1CQkJMHgwMDIwCS8qIEVuYWJsZSBNYWlsYm94IDUgRm9yCVJlY2VpdmUgKi8KKyNkZWZpbmUJTUQ2CQkJMHgwMDQwCS8qIEVuYWJsZSBNYWlsYm94IDYgRm9yCVJlY2VpdmUgKi8KKyNkZWZpbmUJTUQ3CQkJMHgwMDgwCS8qIEVuYWJsZSBNYWlsYm94IDcgRm9yCVJlY2VpdmUgKi8KKyNkZWZpbmUJTUQ4CQkJMHgwMTAwCS8qIEVuYWJsZSBNYWlsYm94IDggRm9yCVJlY2VpdmUgKi8KKyNkZWZpbmUJTUQ5CQkJMHgwMjAwCS8qIEVuYWJsZSBNYWlsYm94IDkgRm9yCVJlY2VpdmUgKi8KKyNkZWZpbmUJTUQxMAkJMHgwNDAwCS8qIEVuYWJsZSBNYWlsYm94IDEwIEZvciBSZWNlaXZlICovCisjZGVmaW5lCU1EMTEJCTB4MDgwMAkvKiBFbmFibGUgTWFpbGJveCAxMSBGb3IgUmVjZWl2ZSAqLworI2RlZmluZQlNRDEyCQkweDEwMDAJLyogRW5hYmxlIE1haWxib3ggMTIgRm9yIFJlY2VpdmUgKi8KKyNkZWZpbmUJTUQxMwkJMHgyMDAwCS8qIEVuYWJsZSBNYWlsYm94IDEzIEZvciBSZWNlaXZlICovCisjZGVmaW5lCU1EMTQJCTB4NDAwMAkvKiBFbmFibGUgTWFpbGJveCAxNCBGb3IgUmVjZWl2ZSAqLworI2RlZmluZQlNRDE1CQkweDgwMDAJLyogRW5hYmxlIE1haWxib3ggMTUgRm9yIFJlY2VpdmUgKi8KKworLyogQ0FOX01EMiBNYXNrcwkJCQkJICovCisjZGVmaW5lCU1EMTYJCTB4MDAwMQkvKiBFbmFibGUgTWFpbGJveCAxNiBGb3IgUmVjZWl2ZSAqLworI2RlZmluZQlNRDE3CQkweDAwMDIJLyogRW5hYmxlIE1haWxib3ggMTcgRm9yIFJlY2VpdmUgKi8KKyNkZWZpbmUJTUQxOAkJMHgwMDA0CS8qIEVuYWJsZSBNYWlsYm94IDE4IEZvciBSZWNlaXZlICovCisjZGVmaW5lCU1EMTkJCTB4MDAwOAkvKiBFbmFibGUgTWFpbGJveCAxOSBGb3IgUmVjZWl2ZSAqLworI2RlZmluZQlNRDIwCQkweDAwMTAJLyogRW5hYmxlIE1haWxib3ggMjAgRm9yIFJlY2VpdmUgKi8KKyNkZWZpbmUJTUQyMQkJMHgwMDIwCS8qIEVuYWJsZSBNYWlsYm94IDIxIEZvciBSZWNlaXZlICovCisjZGVmaW5lCU1EMjIJCTB4MDA0MAkvKiBFbmFibGUgTWFpbGJveCAyMiBGb3IgUmVjZWl2ZSAqLworI2RlZmluZQlNRDIzCQkweDAwODAJLyogRW5hYmxlIE1haWxib3ggMjMgRm9yIFJlY2VpdmUgKi8KKyNkZWZpbmUJTUQyNAkJMHgwMTAwCS8qIEVuYWJsZSBNYWlsYm94IDI0IEZvciBSZWNlaXZlICovCisjZGVmaW5lCU1EMjUJCTB4MDIwMAkvKiBFbmFibGUgTWFpbGJveCAyNSBGb3IgUmVjZWl2ZSAqLworI2RlZmluZQlNRDI2CQkweDA0MDAJLyogRW5hYmxlIE1haWxib3ggMjYgRm9yIFJlY2VpdmUgKi8KKyNkZWZpbmUJTUQyNwkJMHgwODAwCS8qIEVuYWJsZSBNYWlsYm94IDI3IEZvciBSZWNlaXZlICovCisjZGVmaW5lCU1EMjgJCTB4MTAwMAkvKiBFbmFibGUgTWFpbGJveCAyOCBGb3IgUmVjZWl2ZSAqLworI2RlZmluZQlNRDI5CQkweDIwMDAJLyogRW5hYmxlIE1haWxib3ggMjkgRm9yIFJlY2VpdmUgKi8KKyNkZWZpbmUJTUQzMAkJMHg0MDAwCS8qIEVuYWJsZSBNYWlsYm94IDMwIEZvciBSZWNlaXZlICovCisjZGVmaW5lCU1EMzEJCTB4ODAwMAkvKiBFbmFibGUgTWFpbGJveCAzMSBGb3IgUmVjZWl2ZSAqLworCisvKiBDQU5fUk1QMSBNYXNrcwkJCQkJICovCisjZGVmaW5lCVJNUDAJCTB4MDAwMQkvKiBSWCBNZXNzYWdlIFBlbmRpbmcgSW4gTWFpbGJveCAwICovCisjZGVmaW5lCVJNUDEJCTB4MDAwMgkvKiBSWCBNZXNzYWdlIFBlbmRpbmcgSW4gTWFpbGJveCAxICovCisjZGVmaW5lCVJNUDIJCTB4MDAwNAkvKiBSWCBNZXNzYWdlIFBlbmRpbmcgSW4gTWFpbGJveCAyICovCisjZGVmaW5lCVJNUDMJCTB4MDAwOAkvKiBSWCBNZXNzYWdlIFBlbmRpbmcgSW4gTWFpbGJveCAzICovCisjZGVmaW5lCVJNUDQJCTB4MDAxMAkvKiBSWCBNZXNzYWdlIFBlbmRpbmcgSW4gTWFpbGJveCA0ICovCisjZGVmaW5lCVJNUDUJCTB4MDAyMAkvKiBSWCBNZXNzYWdlIFBlbmRpbmcgSW4gTWFpbGJveCA1ICovCisjZGVmaW5lCVJNUDYJCTB4MDA0MAkvKiBSWCBNZXNzYWdlIFBlbmRpbmcgSW4gTWFpbGJveCA2ICovCisjZGVmaW5lCVJNUDcJCTB4MDA4MAkvKiBSWCBNZXNzYWdlIFBlbmRpbmcgSW4gTWFpbGJveCA3ICovCisjZGVmaW5lCVJNUDgJCTB4MDEwMAkvKiBSWCBNZXNzYWdlIFBlbmRpbmcgSW4gTWFpbGJveCA4ICovCisjZGVmaW5lCVJNUDkJCTB4MDIwMAkvKiBSWCBNZXNzYWdlIFBlbmRpbmcgSW4gTWFpbGJveCA5ICovCisjZGVmaW5lCVJNUDEwCQkweDA0MDAJLyogUlggTWVzc2FnZSBQZW5kaW5nIEluIE1haWxib3ggMTAgKi8KKyNkZWZpbmUJUk1QMTEJCTB4MDgwMAkvKiBSWCBNZXNzYWdlIFBlbmRpbmcgSW4gTWFpbGJveCAxMSAqLworI2RlZmluZQlSTVAxMgkJMHgxMDAwCS8qIFJYIE1lc3NhZ2UgUGVuZGluZyBJbiBNYWlsYm94IDEyICovCisjZGVmaW5lCVJNUDEzCQkweDIwMDAJLyogUlggTWVzc2FnZSBQZW5kaW5nIEluIE1haWxib3ggMTMgKi8KKyNkZWZpbmUJUk1QMTQJCTB4NDAwMAkvKiBSWCBNZXNzYWdlIFBlbmRpbmcgSW4gTWFpbGJveCAxNCAqLworI2RlZmluZQlSTVAxNQkJMHg4MDAwCS8qIFJYIE1lc3NhZ2UgUGVuZGluZyBJbiBNYWlsYm94IDE1ICovCisKKy8qIENBTl9STVAyIE1hc2tzCQkJCQkgKi8KKyNkZWZpbmUJUk1QMTYJCTB4MDAwMQkvKiBSWCBNZXNzYWdlIFBlbmRpbmcgSW4gTWFpbGJveCAxNiAqLworI2RlZmluZQlSTVAxNwkJMHgwMDAyCS8qIFJYIE1lc3NhZ2UgUGVuZGluZyBJbiBNYWlsYm94IDE3ICovCisjZGVmaW5lCVJNUDE4CQkweDAwMDQJLyogUlggTWVzc2FnZSBQZW5kaW5nIEluIE1haWxib3ggMTggKi8KKyNkZWZpbmUJUk1QMTkJCTB4MDAwOAkvKiBSWCBNZXNzYWdlIFBlbmRpbmcgSW4gTWFpbGJveCAxOSAqLworI2RlZmluZQlSTVAyMAkJMHgwMDEwCS8qIFJYIE1lc3NhZ2UgUGVuZGluZyBJbiBNYWlsYm94IDIwICovCisjZGVmaW5lCVJNUDIxCQkweDAwMjAJLyogUlggTWVzc2FnZSBQZW5kaW5nIEluIE1haWxib3ggMjEgKi8KKyNkZWZpbmUJUk1QMjIJCTB4MDA0MAkvKiBSWCBNZXNzYWdlIFBlbmRpbmcgSW4gTWFpbGJveCAyMiAqLworI2RlZmluZQlSTVAyMwkJMHgwMDgwCS8qIFJYIE1lc3NhZ2UgUGVuZGluZyBJbiBNYWlsYm94IDIzICovCisjZGVmaW5lCVJNUDI0CQkweDAxMDAJLyogUlggTWVzc2FnZSBQZW5kaW5nIEluIE1haWxib3ggMjQgKi8KKyNkZWZpbmUJUk1QMjUJCTB4MDIwMAkvKiBSWCBNZXNzYWdlIFBlbmRpbmcgSW4gTWFpbGJveCAyNSAqLworI2RlZmluZQlSTVAyNgkJMHgwNDAwCS8qIFJYIE1lc3NhZ2UgUGVuZGluZyBJbiBNYWlsYm94IDI2ICovCisjZGVmaW5lCVJNUDI3CQkweDA4MDAJLyogUlggTWVzc2FnZSBQZW5kaW5nIEluIE1haWxib3ggMjcgKi8KKyNkZWZpbmUJUk1QMjgJCTB4MTAwMAkvKiBSWCBNZXNzYWdlIFBlbmRpbmcgSW4gTWFpbGJveCAyOCAqLworI2RlZmluZQlSTVAyOQkJMHgyMDAwCS8qIFJYIE1lc3NhZ2UgUGVuZGluZyBJbiBNYWlsYm94IDI5ICovCisjZGVmaW5lCVJNUDMwCQkweDQwMDAJLyogUlggTWVzc2FnZSBQZW5kaW5nIEluIE1haWxib3ggMzAgKi8KKyNkZWZpbmUJUk1QMzEJCTB4ODAwMAkvKiBSWCBNZXNzYWdlIFBlbmRpbmcgSW4gTWFpbGJveCAzMSAqLworCisvKiBDQU5fUk1MMSBNYXNrcwkJCQkJICovCisjZGVmaW5lCVJNTDAJCTB4MDAwMQkvKiBSWCBNZXNzYWdlIExvc3QgSW4gTWFpbGJveCAwICovCisjZGVmaW5lCVJNTDEJCTB4MDAwMgkvKiBSWCBNZXNzYWdlIExvc3QgSW4gTWFpbGJveCAxICovCisjZGVmaW5lCVJNTDIJCTB4MDAwNAkvKiBSWCBNZXNzYWdlIExvc3QgSW4gTWFpbGJveCAyICovCisjZGVmaW5lCVJNTDMJCTB4MDAwOAkvKiBSWCBNZXNzYWdlIExvc3QgSW4gTWFpbGJveCAzICovCisjZGVmaW5lCVJNTDQJCTB4MDAxMAkvKiBSWCBNZXNzYWdlIExvc3QgSW4gTWFpbGJveCA0ICovCisjZGVmaW5lCVJNTDUJCTB4MDAyMAkvKiBSWCBNZXNzYWdlIExvc3QgSW4gTWFpbGJveCA1ICovCisjZGVmaW5lCVJNTDYJCTB4MDA0MAkvKiBSWCBNZXNzYWdlIExvc3QgSW4gTWFpbGJveCA2ICovCisjZGVmaW5lCVJNTDcJCTB4MDA4MAkvKiBSWCBNZXNzYWdlIExvc3QgSW4gTWFpbGJveCA3ICovCisjZGVmaW5lCVJNTDgJCTB4MDEwMAkvKiBSWCBNZXNzYWdlIExvc3QgSW4gTWFpbGJveCA4ICovCisjZGVmaW5lCVJNTDkJCTB4MDIwMAkvKiBSWCBNZXNzYWdlIExvc3QgSW4gTWFpbGJveCA5ICovCisjZGVmaW5lCVJNTDEwCQkweDA0MDAJLyogUlggTWVzc2FnZSBMb3N0IEluIE1haWxib3ggMTAgKi8KKyNkZWZpbmUJUk1MMTEJCTB4MDgwMAkvKiBSWCBNZXNzYWdlIExvc3QgSW4gTWFpbGJveCAxMSAqLworI2RlZmluZQlSTUwxMgkJMHgxMDAwCS8qIFJYIE1lc3NhZ2UgTG9zdCBJbiBNYWlsYm94IDEyICovCisjZGVmaW5lCVJNTDEzCQkweDIwMDAJLyogUlggTWVzc2FnZSBMb3N0IEluIE1haWxib3ggMTMgKi8KKyNkZWZpbmUJUk1MMTQJCTB4NDAwMAkvKiBSWCBNZXNzYWdlIExvc3QgSW4gTWFpbGJveCAxNCAqLworI2RlZmluZQlSTUwxNQkJMHg4MDAwCS8qIFJYIE1lc3NhZ2UgTG9zdCBJbiBNYWlsYm94IDE1ICovCisKKy8qIENBTl9STUwyIE1hc2tzCQkJCQkgKi8KKyNkZWZpbmUJUk1MMTYJCTB4MDAwMQkvKiBSWCBNZXNzYWdlIExvc3QgSW4gTWFpbGJveCAxNiAqLworI2RlZmluZQlSTUwxNwkJMHgwMDAyCS8qIFJYIE1lc3NhZ2UgTG9zdCBJbiBNYWlsYm94IDE3ICovCisjZGVmaW5lCVJNTDE4CQkweDAwMDQJLyogUlggTWVzc2FnZSBMb3N0IEluIE1haWxib3ggMTggKi8KKyNkZWZpbmUJUk1MMTkJCTB4MDAwOAkvKiBSWCBNZXNzYWdlIExvc3QgSW4gTWFpbGJveCAxOSAqLworI2RlZmluZQlSTUwyMAkJMHgwMDEwCS8qIFJYIE1lc3NhZ2UgTG9zdCBJbiBNYWlsYm94IDIwICovCisjZGVmaW5lCVJNTDIxCQkweDAwMjAJLyogUlggTWVzc2FnZSBMb3N0IEluIE1haWxib3ggMjEgKi8KKyNkZWZpbmUJUk1MMjIJCTB4MDA0MAkvKiBSWCBNZXNzYWdlIExvc3QgSW4gTWFpbGJveCAyMiAqLworI2RlZmluZQlSTUwyMwkJMHgwMDgwCS8qIFJYIE1lc3NhZ2UgTG9zdCBJbiBNYWlsYm94IDIzICovCisjZGVmaW5lCVJNTDI0CQkweDAxMDAJLyogUlggTWVzc2FnZSBMb3N0IEluIE1haWxib3ggMjQgKi8KKyNkZWZpbmUJUk1MMjUJCTB4MDIwMAkvKiBSWCBNZXNzYWdlIExvc3QgSW4gTWFpbGJveCAyNSAqLworI2RlZmluZQlSTUwyNgkJMHgwNDAwCS8qIFJYIE1lc3NhZ2UgTG9zdCBJbiBNYWlsYm94IDI2ICovCisjZGVmaW5lCVJNTDI3CQkweDA4MDAJLyogUlggTWVzc2FnZSBMb3N0IEluIE1haWxib3ggMjcgKi8KKyNkZWZpbmUJUk1MMjgJCTB4MTAwMAkvKiBSWCBNZXNzYWdlIExvc3QgSW4gTWFpbGJveCAyOCAqLworI2RlZmluZQlSTUwyOQkJMHgyMDAwCS8qIFJYIE1lc3NhZ2UgTG9zdCBJbiBNYWlsYm94IDI5ICovCisjZGVmaW5lCVJNTDMwCQkweDQwMDAJLyogUlggTWVzc2FnZSBMb3N0IEluIE1haWxib3ggMzAgKi8KKyNkZWZpbmUJUk1MMzEJCTB4ODAwMAkvKiBSWCBNZXNzYWdlIExvc3QgSW4gTWFpbGJveCAzMSAqLworCisvKiBDQU5fT1BTUzEgTWFza3MJCQkJCQkJCQkJCQkJICovCisjZGVmaW5lCU9QU1MwCQkweDAwMDEJLyogRW5hYmxlIFJYIE92ZXJ3cml0ZSBQcm90ZWN0aW9uIG9yIFRYCVNpbmdsZS1TaG90IEZvcglNYWlsYm94CTAgKi8KKyNkZWZpbmUJT1BTUzEJCTB4MDAwMgkvKiBFbmFibGUgUlggT3ZlcndyaXRlIFByb3RlY3Rpb24gb3IgVFgJU2luZ2xlLVNob3QgRm9yCU1haWxib3gJMSAqLworI2RlZmluZQlPUFNTMgkJMHgwMDA0CS8qIEVuYWJsZSBSWCBPdmVyd3JpdGUgUHJvdGVjdGlvbiBvciBUWAlTaW5nbGUtU2hvdCBGb3IJTWFpbGJveAkyICovCisjZGVmaW5lCU9QU1MzCQkweDAwMDgJLyogRW5hYmxlIFJYIE92ZXJ3cml0ZSBQcm90ZWN0aW9uIG9yIFRYCVNpbmdsZS1TaG90IEZvcglNYWlsYm94CTMgKi8KKyNkZWZpbmUJT1BTUzQJCTB4MDAxMAkvKiBFbmFibGUgUlggT3ZlcndyaXRlIFByb3RlY3Rpb24gb3IgVFgJU2luZ2xlLVNob3QgRm9yCU1haWxib3gJNCAqLworI2RlZmluZQlPUFNTNQkJMHgwMDIwCS8qIEVuYWJsZSBSWCBPdmVyd3JpdGUgUHJvdGVjdGlvbiBvciBUWAlTaW5nbGUtU2hvdCBGb3IJTWFpbGJveAk1ICovCisjZGVmaW5lCU9QU1M2CQkweDAwNDAJLyogRW5hYmxlIFJYIE92ZXJ3cml0ZSBQcm90ZWN0aW9uIG9yIFRYCVNpbmdsZS1TaG90IEZvcglNYWlsYm94CTYgKi8KKyNkZWZpbmUJT1BTUzcJCTB4MDA4MAkvKiBFbmFibGUgUlggT3ZlcndyaXRlIFByb3RlY3Rpb24gb3IgVFgJU2luZ2xlLVNob3QgRm9yCU1haWxib3gJNyAqLworI2RlZmluZQlPUFNTOAkJMHgwMTAwCS8qIEVuYWJsZSBSWCBPdmVyd3JpdGUgUHJvdGVjdGlvbiBvciBUWAlTaW5nbGUtU2hvdCBGb3IJTWFpbGJveAk4ICovCisjZGVmaW5lCU9QU1M5CQkweDAyMDAJLyogRW5hYmxlIFJYIE92ZXJ3cml0ZSBQcm90ZWN0aW9uIG9yIFRYCVNpbmdsZS1TaG90IEZvcglNYWlsYm94CTkgKi8KKyNkZWZpbmUJT1BTUzEwCQkweDA0MDAJLyogRW5hYmxlIFJYIE92ZXJ3cml0ZSBQcm90ZWN0aW9uIG9yIFRYCVNpbmdsZS1TaG90IEZvcglNYWlsYm94CTEwICovCisjZGVmaW5lCU9QU1MxMQkJMHgwODAwCS8qIEVuYWJsZSBSWCBPdmVyd3JpdGUgUHJvdGVjdGlvbiBvciBUWAlTaW5nbGUtU2hvdCBGb3IJTWFpbGJveAkxMSAqLworI2RlZmluZQlPUFNTMTIJCTB4MTAwMAkvKiBFbmFibGUgUlggT3ZlcndyaXRlIFByb3RlY3Rpb24gb3IgVFgJU2luZ2xlLVNob3QgRm9yCU1haWxib3gJMTIgKi8KKyNkZWZpbmUJT1BTUzEzCQkweDIwMDAJLyogRW5hYmxlIFJYIE92ZXJ3cml0ZSBQcm90ZWN0aW9uIG9yIFRYCVNpbmdsZS1TaG90IEZvcglNYWlsYm94CTEzICovCisjZGVmaW5lCU9QU1MxNAkJMHg0MDAwCS8qIEVuYWJsZSBSWCBPdmVyd3JpdGUgUHJvdGVjdGlvbiBvciBUWAlTaW5nbGUtU2hvdCBGb3IJTWFpbGJveAkxNCAqLworI2RlZmluZQlPUFNTMTUJCTB4ODAwMAkvKiBFbmFibGUgUlggT3ZlcndyaXRlIFByb3RlY3Rpb24gb3IgVFgJU2luZ2xlLVNob3QgRm9yCU1haWxib3gJMTUgKi8KKworLyogQ0FOX09QU1MyIE1hc2tzCQkJCQkJCQkJCQkJCSAqLworI2RlZmluZQlPUFNTMTYJCTB4MDAwMQkvKiBFbmFibGUgUlggT3ZlcndyaXRlIFByb3RlY3Rpb24gb3IgVFgJU2luZ2xlLVNob3QgRm9yCU1haWxib3gJMTYgKi8KKyNkZWZpbmUJT1BTUzE3CQkweDAwMDIJLyogRW5hYmxlIFJYIE92ZXJ3cml0ZSBQcm90ZWN0aW9uIG9yIFRYCVNpbmdsZS1TaG90IEZvcglNYWlsYm94CTE3ICovCisjZGVmaW5lCU9QU1MxOAkJMHgwMDA0CS8qIEVuYWJsZSBSWCBPdmVyd3JpdGUgUHJvdGVjdGlvbiBvciBUWAlTaW5nbGUtU2hvdCBGb3IJTWFpbGJveAkxOCAqLworI2RlZmluZQlPUFNTMTkJCTB4MDAwOAkvKiBFbmFibGUgUlggT3ZlcndyaXRlIFByb3RlY3Rpb24gb3IgVFgJU2luZ2xlLVNob3QgRm9yCU1haWxib3gJMTkgKi8KKyNkZWZpbmUJT1BTUzIwCQkweDAwMTAJLyogRW5hYmxlIFJYIE92ZXJ3cml0ZSBQcm90ZWN0aW9uIG9yIFRYCVNpbmdsZS1TaG90IEZvcglNYWlsYm94CTIwICovCisjZGVmaW5lCU9QU1MyMQkJMHgwMDIwCS8qIEVuYWJsZSBSWCBPdmVyd3JpdGUgUHJvdGVjdGlvbiBvciBUWAlTaW5nbGUtU2hvdCBGb3IJTWFpbGJveAkyMSAqLworI2RlZmluZQlPUFNTMjIJCTB4MDA0MAkvKiBFbmFibGUgUlggT3ZlcndyaXRlIFByb3RlY3Rpb24gb3IgVFgJU2luZ2xlLVNob3QgRm9yCU1haWxib3gJMjIgKi8KKyNkZWZpbmUJT1BTUzIzCQkweDAwODAJLyogRW5hYmxlIFJYIE92ZXJ3cml0ZSBQcm90ZWN0aW9uIG9yIFRYCVNpbmdsZS1TaG90IEZvcglNYWlsYm94CTIzICovCisjZGVmaW5lCU9QU1MyNAkJMHgwMTAwCS8qIEVuYWJsZSBSWCBPdmVyd3JpdGUgUHJvdGVjdGlvbiBvciBUWAlTaW5nbGUtU2hvdCBGb3IJTWFpbGJveAkyNCAqLworI2RlZmluZQlPUFNTMjUJCTB4MDIwMAkvKiBFbmFibGUgUlggT3ZlcndyaXRlIFByb3RlY3Rpb24gb3IgVFgJU2luZ2xlLVNob3QgRm9yCU1haWxib3gJMjUgKi8KKyNkZWZpbmUJT1BTUzI2CQkweDA0MDAJLyogRW5hYmxlIFJYIE92ZXJ3cml0ZSBQcm90ZWN0aW9uIG9yIFRYCVNpbmdsZS1TaG90IEZvcglNYWlsYm94CTI2ICovCisjZGVmaW5lCU9QU1MyNwkJMHgwODAwCS8qIEVuYWJsZSBSWCBPdmVyd3JpdGUgUHJvdGVjdGlvbiBvciBUWAlTaW5nbGUtU2hvdCBGb3IJTWFpbGJveAkyNyAqLworI2RlZmluZQlPUFNTMjgJCTB4MTAwMAkvKiBFbmFibGUgUlggT3ZlcndyaXRlIFByb3RlY3Rpb24gb3IgVFgJU2luZ2xlLVNob3QgRm9yCU1haWxib3gJMjggKi8KKyNkZWZpbmUJT1BTUzI5CQkweDIwMDAJLyogRW5hYmxlIFJYIE92ZXJ3cml0ZSBQcm90ZWN0aW9uIG9yIFRYCVNpbmdsZS1TaG90IEZvcglNYWlsYm94CTI5ICovCisjZGVmaW5lCU9QU1MzMAkJMHg0MDAwCS8qIEVuYWJsZSBSWCBPdmVyd3JpdGUgUHJvdGVjdGlvbiBvciBUWAlTaW5nbGUtU2hvdCBGb3IJTWFpbGJveAkzMCAqLworI2RlZmluZQlPUFNTMzEJCTB4ODAwMAkvKiBFbmFibGUgUlggT3ZlcndyaXRlIFByb3RlY3Rpb24gb3IgVFgJU2luZ2xlLVNob3QgRm9yCU1haWxib3gJMzEgKi8KKworLyogQ0FOX1RSUjEgTWFza3MJCQkJCQkJICovCisjZGVmaW5lCVRSUjAJCTB4MDAwMQkvKiBEZW55CUJ1dCBEb24ndCBMb2NrIEFjY2VzcyBUbyBNYWlsYm94IDAgKi8KKyNkZWZpbmUJVFJSMQkJMHgwMDAyCS8qIERlbnkJQnV0IERvbid0IExvY2sgQWNjZXNzIFRvIE1haWxib3ggMSAqLworI2RlZmluZQlUUlIyCQkweDAwMDQJLyogRGVueQlCdXQgRG9uJ3QgTG9jayBBY2Nlc3MgVG8gTWFpbGJveCAyICovCisjZGVmaW5lCVRSUjMJCTB4MDAwOAkvKiBEZW55CUJ1dCBEb24ndCBMb2NrIEFjY2VzcyBUbyBNYWlsYm94IDMgKi8KKyNkZWZpbmUJVFJSNAkJMHgwMDEwCS8qIERlbnkJQnV0IERvbid0IExvY2sgQWNjZXNzIFRvIE1haWxib3ggNCAqLworI2RlZmluZQlUUlI1CQkweDAwMjAJLyogRGVueQlCdXQgRG9uJ3QgTG9jayBBY2Nlc3MgVG8gTWFpbGJveCA1ICovCisjZGVmaW5lCVRSUjYJCTB4MDA0MAkvKiBEZW55CUJ1dCBEb24ndCBMb2NrIEFjY2VzcyBUbyBNYWlsYm94IDYgKi8KKyNkZWZpbmUJVFJSNwkJMHgwMDgwCS8qIERlbnkJQnV0IERvbid0IExvY2sgQWNjZXNzIFRvIE1haWxib3ggNyAqLworI2RlZmluZQlUUlI4CQkweDAxMDAJLyogRGVueQlCdXQgRG9uJ3QgTG9jayBBY2Nlc3MgVG8gTWFpbGJveCA4ICovCisjZGVmaW5lCVRSUjkJCTB4MDIwMAkvKiBEZW55CUJ1dCBEb24ndCBMb2NrIEFjY2VzcyBUbyBNYWlsYm94IDkgKi8KKyNkZWZpbmUJVFJSMTAJCTB4MDQwMAkvKiBEZW55CUJ1dCBEb24ndCBMb2NrIEFjY2VzcyBUbyBNYWlsYm94IDEwICovCisjZGVmaW5lCVRSUjExCQkweDA4MDAJLyogRGVueQlCdXQgRG9uJ3QgTG9jayBBY2Nlc3MgVG8gTWFpbGJveCAxMSAqLworI2RlZmluZQlUUlIxMgkJMHgxMDAwCS8qIERlbnkJQnV0IERvbid0IExvY2sgQWNjZXNzIFRvIE1haWxib3ggMTIgKi8KKyNkZWZpbmUJVFJSMTMJCTB4MjAwMAkvKiBEZW55CUJ1dCBEb24ndCBMb2NrIEFjY2VzcyBUbyBNYWlsYm94IDEzICovCisjZGVmaW5lCVRSUjE0CQkweDQwMDAJLyogRGVueQlCdXQgRG9uJ3QgTG9jayBBY2Nlc3MgVG8gTWFpbGJveCAxNCAqLworI2RlZmluZQlUUlIxNQkJMHg4MDAwCS8qIERlbnkJQnV0IERvbid0IExvY2sgQWNjZXNzIFRvIE1haWxib3ggMTUgKi8KKworLyogQ0FOX1RSUjIgTWFza3MJCQkJCQkJICovCisjZGVmaW5lCVRSUjE2CQkweDAwMDEJLyogRGVueQlCdXQgRG9uJ3QgTG9jayBBY2Nlc3MgVG8gTWFpbGJveCAxNiAqLworI2RlZmluZQlUUlIxNwkJMHgwMDAyCS8qIERlbnkJQnV0IERvbid0IExvY2sgQWNjZXNzIFRvIE1haWxib3ggMTcgKi8KKyNkZWZpbmUJVFJSMTgJCTB4MDAwNAkvKiBEZW55CUJ1dCBEb24ndCBMb2NrIEFjY2VzcyBUbyBNYWlsYm94IDE4ICovCisjZGVmaW5lCVRSUjE5CQkweDAwMDgJLyogRGVueQlCdXQgRG9uJ3QgTG9jayBBY2Nlc3MgVG8gTWFpbGJveCAxOSAqLworI2RlZmluZQlUUlIyMAkJMHgwMDEwCS8qIERlbnkJQnV0IERvbid0IExvY2sgQWNjZXNzIFRvIE1haWxib3ggMjAgKi8KKyNkZWZpbmUJVFJSMjEJCTB4MDAyMAkvKiBEZW55CUJ1dCBEb24ndCBMb2NrIEFjY2VzcyBUbyBNYWlsYm94IDIxICovCisjZGVmaW5lCVRSUjIyCQkweDAwNDAJLyogRGVueQlCdXQgRG9uJ3QgTG9jayBBY2Nlc3MgVG8gTWFpbGJveCAyMiAqLworI2RlZmluZQlUUlIyMwkJMHgwMDgwCS8qIERlbnkJQnV0IERvbid0IExvY2sgQWNjZXNzIFRvIE1haWxib3ggMjMgKi8KKyNkZWZpbmUJVFJSMjQJCTB4MDEwMAkvKiBEZW55CUJ1dCBEb24ndCBMb2NrIEFjY2VzcyBUbyBNYWlsYm94IDI0ICovCisjZGVmaW5lCVRSUjI1CQkweDAyMDAJLyogRGVueQlCdXQgRG9uJ3QgTG9jayBBY2Nlc3MgVG8gTWFpbGJveCAyNSAqLworI2RlZmluZQlUUlIyNgkJMHgwNDAwCS8qIERlbnkJQnV0IERvbid0IExvY2sgQWNjZXNzIFRvIE1haWxib3ggMjYgKi8KKyNkZWZpbmUJVFJSMjcJCTB4MDgwMAkvKiBEZW55CUJ1dCBEb24ndCBMb2NrIEFjY2VzcyBUbyBNYWlsYm94IDI3ICovCisjZGVmaW5lCVRSUjI4CQkweDEwMDAJLyogRGVueQlCdXQgRG9uJ3QgTG9jayBBY2Nlc3MgVG8gTWFpbGJveCAyOCAqLworI2RlZmluZQlUUlIyOQkJMHgyMDAwCS8qIERlbnkJQnV0IERvbid0IExvY2sgQWNjZXNzIFRvIE1haWxib3ggMjkgKi8KKyNkZWZpbmUJVFJSMzAJCTB4NDAwMAkvKiBEZW55CUJ1dCBEb24ndCBMb2NrIEFjY2VzcyBUbyBNYWlsYm94IDMwICovCisjZGVmaW5lCVRSUjMxCQkweDgwMDAJLyogRGVueQlCdXQgRG9uJ3QgTG9jayBBY2Nlc3MgVG8gTWFpbGJveCAzMSAqLworCisvKiBDQU5fVFJTMSBNYXNrcwkJCQkJCSAqLworI2RlZmluZQlUUlMwCQkweDAwMDEJLyogUmVtb3RlIEZyYW1lCVJlcXVlc3QJRm9yIE1haWxib3ggMCAqLworI2RlZmluZQlUUlMxCQkweDAwMDIJLyogUmVtb3RlIEZyYW1lCVJlcXVlc3QJRm9yIE1haWxib3ggMSAqLworI2RlZmluZQlUUlMyCQkweDAwMDQJLyogUmVtb3RlIEZyYW1lCVJlcXVlc3QJRm9yIE1haWxib3ggMiAqLworI2RlZmluZQlUUlMzCQkweDAwMDgJLyogUmVtb3RlIEZyYW1lCVJlcXVlc3QJRm9yIE1haWxib3ggMyAqLworI2RlZmluZQlUUlM0CQkweDAwMTAJLyogUmVtb3RlIEZyYW1lCVJlcXVlc3QJRm9yIE1haWxib3ggNCAqLworI2RlZmluZQlUUlM1CQkweDAwMjAJLyogUmVtb3RlIEZyYW1lCVJlcXVlc3QJRm9yIE1haWxib3ggNSAqLworI2RlZmluZQlUUlM2CQkweDAwNDAJLyogUmVtb3RlIEZyYW1lCVJlcXVlc3QJRm9yIE1haWxib3ggNiAqLworI2RlZmluZQlUUlM3CQkweDAwODAJLyogUmVtb3RlIEZyYW1lCVJlcXVlc3QJRm9yIE1haWxib3ggNyAqLworI2RlZmluZQlUUlM4CQkweDAxMDAJLyogUmVtb3RlIEZyYW1lCVJlcXVlc3QJRm9yIE1haWxib3ggOCAqLworI2RlZmluZQlUUlM5CQkweDAyMDAJLyogUmVtb3RlIEZyYW1lCVJlcXVlc3QJRm9yIE1haWxib3ggOSAqLworI2RlZmluZQlUUlMxMAkJMHgwNDAwCS8qIFJlbW90ZSBGcmFtZQlSZXF1ZXN0CUZvciBNYWlsYm94IDEwICovCisjZGVmaW5lCVRSUzExCQkweDA4MDAJLyogUmVtb3RlIEZyYW1lCVJlcXVlc3QJRm9yIE1haWxib3ggMTEgKi8KKyNkZWZpbmUJVFJTMTIJCTB4MTAwMAkvKiBSZW1vdGUgRnJhbWUJUmVxdWVzdAlGb3IgTWFpbGJveCAxMiAqLworI2RlZmluZQlUUlMxMwkJMHgyMDAwCS8qIFJlbW90ZSBGcmFtZQlSZXF1ZXN0CUZvciBNYWlsYm94IDEzICovCisjZGVmaW5lCVRSUzE0CQkweDQwMDAJLyogUmVtb3RlIEZyYW1lCVJlcXVlc3QJRm9yIE1haWxib3ggMTQgKi8KKyNkZWZpbmUJVFJTMTUJCTB4ODAwMAkvKiBSZW1vdGUgRnJhbWUJUmVxdWVzdAlGb3IgTWFpbGJveCAxNSAqLworCisvKiBDQU5fVFJTMiBNYXNrcwkJCQkJCSAqLworI2RlZmluZQlUUlMxNgkJMHgwMDAxCS8qIFJlbW90ZSBGcmFtZQlSZXF1ZXN0CUZvciBNYWlsYm94IDE2ICovCisjZGVmaW5lCVRSUzE3CQkweDAwMDIJLyogUmVtb3RlIEZyYW1lCVJlcXVlc3QJRm9yIE1haWxib3ggMTcgKi8KKyNkZWZpbmUJVFJTMTgJCTB4MDAwNAkvKiBSZW1vdGUgRnJhbWUJUmVxdWVzdAlGb3IgTWFpbGJveCAxOCAqLworI2RlZmluZQlUUlMxOQkJMHgwMDA4CS8qIFJlbW90ZSBGcmFtZQlSZXF1ZXN0CUZvciBNYWlsYm94IDE5ICovCisjZGVmaW5lCVRSUzIwCQkweDAwMTAJLyogUmVtb3RlIEZyYW1lCVJlcXVlc3QJRm9yIE1haWxib3ggMjAgKi8KKyNkZWZpbmUJVFJTMjEJCTB4MDAyMAkvKiBSZW1vdGUgRnJhbWUJUmVxdWVzdAlGb3IgTWFpbGJveCAyMSAqLworI2RlZmluZQlUUlMyMgkJMHgwMDQwCS8qIFJlbW90ZSBGcmFtZQlSZXF1ZXN0CUZvciBNYWlsYm94IDIyICovCisjZGVmaW5lCVRSUzIzCQkweDAwODAJLyogUmVtb3RlIEZyYW1lCVJlcXVlc3QJRm9yIE1haWxib3ggMjMgKi8KKyNkZWZpbmUJVFJTMjQJCTB4MDEwMAkvKiBSZW1vdGUgRnJhbWUJUmVxdWVzdAlGb3IgTWFpbGJveCAyNCAqLworI2RlZmluZQlUUlMyNQkJMHgwMjAwCS8qIFJlbW90ZSBGcmFtZQlSZXF1ZXN0CUZvciBNYWlsYm94IDI1ICovCisjZGVmaW5lCVRSUzI2CQkweDA0MDAJLyogUmVtb3RlIEZyYW1lCVJlcXVlc3QJRm9yIE1haWxib3ggMjYgKi8KKyNkZWZpbmUJVFJTMjcJCTB4MDgwMAkvKiBSZW1vdGUgRnJhbWUJUmVxdWVzdAlGb3IgTWFpbGJveCAyNyAqLworI2RlZmluZQlUUlMyOAkJMHgxMDAwCS8qIFJlbW90ZSBGcmFtZQlSZXF1ZXN0CUZvciBNYWlsYm94IDI4ICovCisjZGVmaW5lCVRSUzI5CQkweDIwMDAJLyogUmVtb3RlIEZyYW1lCVJlcXVlc3QJRm9yIE1haWxib3ggMjkgKi8KKyNkZWZpbmUJVFJTMzAJCTB4NDAwMAkvKiBSZW1vdGUgRnJhbWUJUmVxdWVzdAlGb3IgTWFpbGJveCAzMCAqLworI2RlZmluZQlUUlMzMQkJMHg4MDAwCS8qIFJlbW90ZSBGcmFtZQlSZXF1ZXN0CUZvciBNYWlsYm94IDMxICovCisKKy8qIENBTl9BQTEgTWFza3MJCQkJCSAqLworI2RlZmluZQlBQTAJCQkweDAwMDEJLyogQWJvcnRlZCBNZXNzYWdlIEluIE1haWxib3ggMCAqLworI2RlZmluZQlBQTEJCQkweDAwMDIJLyogQWJvcnRlZCBNZXNzYWdlIEluIE1haWxib3ggMSAqLworI2RlZmluZQlBQTIJCQkweDAwMDQJLyogQWJvcnRlZCBNZXNzYWdlIEluIE1haWxib3ggMiAqLworI2RlZmluZQlBQTMJCQkweDAwMDgJLyogQWJvcnRlZCBNZXNzYWdlIEluIE1haWxib3ggMyAqLworI2RlZmluZQlBQTQJCQkweDAwMTAJLyogQWJvcnRlZCBNZXNzYWdlIEluIE1haWxib3ggNCAqLworI2RlZmluZQlBQTUJCQkweDAwMjAJLyogQWJvcnRlZCBNZXNzYWdlIEluIE1haWxib3ggNSAqLworI2RlZmluZQlBQTYJCQkweDAwNDAJLyogQWJvcnRlZCBNZXNzYWdlIEluIE1haWxib3ggNiAqLworI2RlZmluZQlBQTcJCQkweDAwODAJLyogQWJvcnRlZCBNZXNzYWdlIEluIE1haWxib3ggNyAqLworI2RlZmluZQlBQTgJCQkweDAxMDAJLyogQWJvcnRlZCBNZXNzYWdlIEluIE1haWxib3ggOCAqLworI2RlZmluZQlBQTkJCQkweDAyMDAJLyogQWJvcnRlZCBNZXNzYWdlIEluIE1haWxib3ggOSAqLworI2RlZmluZQlBQTEwCQkweDA0MDAJLyogQWJvcnRlZCBNZXNzYWdlIEluIE1haWxib3ggMTAgKi8KKyNkZWZpbmUJQUExMQkJMHgwODAwCS8qIEFib3J0ZWQgTWVzc2FnZSBJbiBNYWlsYm94IDExICovCisjZGVmaW5lCUFBMTIJCTB4MTAwMAkvKiBBYm9ydGVkIE1lc3NhZ2UgSW4gTWFpbGJveCAxMiAqLworI2RlZmluZQlBQTEzCQkweDIwMDAJLyogQWJvcnRlZCBNZXNzYWdlIEluIE1haWxib3ggMTMgKi8KKyNkZWZpbmUJQUExNAkJMHg0MDAwCS8qIEFib3J0ZWQgTWVzc2FnZSBJbiBNYWlsYm94IDE0ICovCisjZGVmaW5lCUFBMTUJCTB4ODAwMAkvKiBBYm9ydGVkIE1lc3NhZ2UgSW4gTWFpbGJveCAxNSAqLworCisvKiBDQU5fQUEyIE1hc2tzCQkJCQkgKi8KKyNkZWZpbmUJQUExNgkJMHgwMDAxCS8qIEFib3J0ZWQgTWVzc2FnZSBJbiBNYWlsYm94IDE2ICovCisjZGVmaW5lCUFBMTcJCTB4MDAwMgkvKiBBYm9ydGVkIE1lc3NhZ2UgSW4gTWFpbGJveCAxNyAqLworI2RlZmluZQlBQTE4CQkweDAwMDQJLyogQWJvcnRlZCBNZXNzYWdlIEluIE1haWxib3ggMTggKi8KKyNkZWZpbmUJQUExOQkJMHgwMDA4CS8qIEFib3J0ZWQgTWVzc2FnZSBJbiBNYWlsYm94IDE5ICovCisjZGVmaW5lCUFBMjAJCTB4MDAxMAkvKiBBYm9ydGVkIE1lc3NhZ2UgSW4gTWFpbGJveCAyMCAqLworI2RlZmluZQlBQTIxCQkweDAwMjAJLyogQWJvcnRlZCBNZXNzYWdlIEluIE1haWxib3ggMjEgKi8KKyNkZWZpbmUJQUEyMgkJMHgwMDQwCS8qIEFib3J0ZWQgTWVzc2FnZSBJbiBNYWlsYm94IDIyICovCisjZGVmaW5lCUFBMjMJCTB4MDA4MAkvKiBBYm9ydGVkIE1lc3NhZ2UgSW4gTWFpbGJveCAyMyAqLworI2RlZmluZQlBQTI0CQkweDAxMDAJLyogQWJvcnRlZCBNZXNzYWdlIEluIE1haWxib3ggMjQgKi8KKyNkZWZpbmUJQUEyNQkJMHgwMjAwCS8qIEFib3J0ZWQgTWVzc2FnZSBJbiBNYWlsYm94IDI1ICovCisjZGVmaW5lCUFBMjYJCTB4MDQwMAkvKiBBYm9ydGVkIE1lc3NhZ2UgSW4gTWFpbGJveCAyNiAqLworI2RlZmluZQlBQTI3CQkweDA4MDAJLyogQWJvcnRlZCBNZXNzYWdlIEluIE1haWxib3ggMjcgKi8KKyNkZWZpbmUJQUEyOAkJMHgxMDAwCS8qIEFib3J0ZWQgTWVzc2FnZSBJbiBNYWlsYm94IDI4ICovCisjZGVmaW5lCUFBMjkJCTB4MjAwMAkvKiBBYm9ydGVkIE1lc3NhZ2UgSW4gTWFpbGJveCAyOSAqLworI2RlZmluZQlBQTMwCQkweDQwMDAJLyogQWJvcnRlZCBNZXNzYWdlIEluIE1haWxib3ggMzAgKi8KKyNkZWZpbmUJQUEzMQkJMHg4MDAwCS8qIEFib3J0ZWQgTWVzc2FnZSBJbiBNYWlsYm94IDMxICovCisKKy8qIENBTl9UQTEgTWFza3MJCQkJCQkgKi8KKyNkZWZpbmUJVEEwCQkJMHgwMDAxCS8qIFRyYW5zbWl0IFN1Y2Nlc3NmdWwgRnJvbSBNYWlsYm94IDAgKi8KKyNkZWZpbmUJVEExCQkJMHgwMDAyCS8qIFRyYW5zbWl0IFN1Y2Nlc3NmdWwgRnJvbSBNYWlsYm94IDEgKi8KKyNkZWZpbmUJVEEyCQkJMHgwMDA0CS8qIFRyYW5zbWl0IFN1Y2Nlc3NmdWwgRnJvbSBNYWlsYm94IDIgKi8KKyNkZWZpbmUJVEEzCQkJMHgwMDA4CS8qIFRyYW5zbWl0IFN1Y2Nlc3NmdWwgRnJvbSBNYWlsYm94IDMgKi8KKyNkZWZpbmUJVEE0CQkJMHgwMDEwCS8qIFRyYW5zbWl0IFN1Y2Nlc3NmdWwgRnJvbSBNYWlsYm94IDQgKi8KKyNkZWZpbmUJVEE1CQkJMHgwMDIwCS8qIFRyYW5zbWl0IFN1Y2Nlc3NmdWwgRnJvbSBNYWlsYm94IDUgKi8KKyNkZWZpbmUJVEE2CQkJMHgwMDQwCS8qIFRyYW5zbWl0IFN1Y2Nlc3NmdWwgRnJvbSBNYWlsYm94IDYgKi8KKyNkZWZpbmUJVEE3CQkJMHgwMDgwCS8qIFRyYW5zbWl0IFN1Y2Nlc3NmdWwgRnJvbSBNYWlsYm94IDcgKi8KKyNkZWZpbmUJVEE4CQkJMHgwMTAwCS8qIFRyYW5zbWl0IFN1Y2Nlc3NmdWwgRnJvbSBNYWlsYm94IDggKi8KKyNkZWZpbmUJVEE5CQkJMHgwMjAwCS8qIFRyYW5zbWl0IFN1Y2Nlc3NmdWwgRnJvbSBNYWlsYm94IDkgKi8KKyNkZWZpbmUJVEExMAkJMHgwNDAwCS8qIFRyYW5zbWl0IFN1Y2Nlc3NmdWwgRnJvbSBNYWlsYm94IDEwICovCisjZGVmaW5lCVRBMTEJCTB4MDgwMAkvKiBUcmFuc21pdCBTdWNjZXNzZnVsIEZyb20gTWFpbGJveCAxMSAqLworI2RlZmluZQlUQTEyCQkweDEwMDAJLyogVHJhbnNtaXQgU3VjY2Vzc2Z1bCBGcm9tIE1haWxib3ggMTIgKi8KKyNkZWZpbmUJVEExMwkJMHgyMDAwCS8qIFRyYW5zbWl0IFN1Y2Nlc3NmdWwgRnJvbSBNYWlsYm94IDEzICovCisjZGVmaW5lCVRBMTQJCTB4NDAwMAkvKiBUcmFuc21pdCBTdWNjZXNzZnVsIEZyb20gTWFpbGJveCAxNCAqLworI2RlZmluZQlUQTE1CQkweDgwMDAJLyogVHJhbnNtaXQgU3VjY2Vzc2Z1bCBGcm9tIE1haWxib3ggMTUgKi8KKworLyogQ0FOX1RBMiBNYXNrcwkJCQkJCSAqLworI2RlZmluZQlUQTE2CQkweDAwMDEJLyogVHJhbnNtaXQgU3VjY2Vzc2Z1bCBGcm9tIE1haWxib3ggMTYgKi8KKyNkZWZpbmUJVEExNwkJMHgwMDAyCS8qIFRyYW5zbWl0IFN1Y2Nlc3NmdWwgRnJvbSBNYWlsYm94IDE3ICovCisjZGVmaW5lCVRBMTgJCTB4MDAwNAkvKiBUcmFuc21pdCBTdWNjZXNzZnVsIEZyb20gTWFpbGJveCAxOCAqLworI2RlZmluZQlUQTE5CQkweDAwMDgJLyogVHJhbnNtaXQgU3VjY2Vzc2Z1bCBGcm9tIE1haWxib3ggMTkgKi8KKyNkZWZpbmUJVEEyMAkJMHgwMDEwCS8qIFRyYW5zbWl0IFN1Y2Nlc3NmdWwgRnJvbSBNYWlsYm94IDIwICovCisjZGVmaW5lCVRBMjEJCTB4MDAyMAkvKiBUcmFuc21pdCBTdWNjZXNzZnVsIEZyb20gTWFpbGJveCAyMSAqLworI2RlZmluZQlUQTIyCQkweDAwNDAJLyogVHJhbnNtaXQgU3VjY2Vzc2Z1bCBGcm9tIE1haWxib3ggMjIgKi8KKyNkZWZpbmUJVEEyMwkJMHgwMDgwCS8qIFRyYW5zbWl0IFN1Y2Nlc3NmdWwgRnJvbSBNYWlsYm94IDIzICovCisjZGVmaW5lCVRBMjQJCTB4MDEwMAkvKiBUcmFuc21pdCBTdWNjZXNzZnVsIEZyb20gTWFpbGJveCAyNCAqLworI2RlZmluZQlUQTI1CQkweDAyMDAJLyogVHJhbnNtaXQgU3VjY2Vzc2Z1bCBGcm9tIE1haWxib3ggMjUgKi8KKyNkZWZpbmUJVEEyNgkJMHgwNDAwCS8qIFRyYW5zbWl0IFN1Y2Nlc3NmdWwgRnJvbSBNYWlsYm94IDI2ICovCisjZGVmaW5lCVRBMjcJCTB4MDgwMAkvKiBUcmFuc21pdCBTdWNjZXNzZnVsIEZyb20gTWFpbGJveCAyNyAqLworI2RlZmluZQlUQTI4CQkweDEwMDAJLyogVHJhbnNtaXQgU3VjY2Vzc2Z1bCBGcm9tIE1haWxib3ggMjggKi8KKyNkZWZpbmUJVEEyOQkJMHgyMDAwCS8qIFRyYW5zbWl0IFN1Y2Nlc3NmdWwgRnJvbSBNYWlsYm94IDI5ICovCisjZGVmaW5lCVRBMzAJCTB4NDAwMAkvKiBUcmFuc21pdCBTdWNjZXNzZnVsIEZyb20gTWFpbGJveCAzMCAqLworI2RlZmluZQlUQTMxCQkweDgwMDAJLyogVHJhbnNtaXQgU3VjY2Vzc2Z1bCBGcm9tIE1haWxib3ggMzEgKi8KKworLyogQ0FOX01CVEQgTWFza3MJCQkJCSAqLworI2RlZmluZQlURFBUUgkJMHgwMDFGCS8qIE1haWxib3ggVG8gVGVtcG9yYXJpbHkgRGlzYWJsZSAqLworI2RlZmluZQlUREEJCQkweDAwNDAJLyogVGVtcG9yYXJ5IERpc2FibGUgQWNrbm93bGVkZ2UgKi8KKyNkZWZpbmUJVERSCQkJMHgwMDgwCS8qIFRlbXBvcmFyeSBEaXNhYmxlIFJlcXVlc3QgKi8KKworLyogQ0FOX1JGSDEgTWFza3MJCQkJCQkJCQkJCSAqLworI2RlZmluZQlSRkgwCQkweDAwMDEJLyogRW5hYmxlIEF1dG9tYXRpYyBSZW1vdGUgRnJhbWUgSGFuZGxpbmcgRm9yIE1haWxib3ggMCAqLworI2RlZmluZQlSRkgxCQkweDAwMDIJLyogRW5hYmxlIEF1dG9tYXRpYyBSZW1vdGUgRnJhbWUgSGFuZGxpbmcgRm9yIE1haWxib3ggMSAqLworI2RlZmluZQlSRkgyCQkweDAwMDQJLyogRW5hYmxlIEF1dG9tYXRpYyBSZW1vdGUgRnJhbWUgSGFuZGxpbmcgRm9yIE1haWxib3ggMiAqLworI2RlZmluZQlSRkgzCQkweDAwMDgJLyogRW5hYmxlIEF1dG9tYXRpYyBSZW1vdGUgRnJhbWUgSGFuZGxpbmcgRm9yIE1haWxib3ggMyAqLworI2RlZmluZQlSRkg0CQkweDAwMTAJLyogRW5hYmxlIEF1dG9tYXRpYyBSZW1vdGUgRnJhbWUgSGFuZGxpbmcgRm9yIE1haWxib3ggNCAqLworI2RlZmluZQlSRkg1CQkweDAwMjAJLyogRW5hYmxlIEF1dG9tYXRpYyBSZW1vdGUgRnJhbWUgSGFuZGxpbmcgRm9yIE1haWxib3ggNSAqLworI2RlZmluZQlSRkg2CQkweDAwNDAJLyogRW5hYmxlIEF1dG9tYXRpYyBSZW1vdGUgRnJhbWUgSGFuZGxpbmcgRm9yIE1haWxib3ggNiAqLworI2RlZmluZQlSRkg3CQkweDAwODAJLyogRW5hYmxlIEF1dG9tYXRpYyBSZW1vdGUgRnJhbWUgSGFuZGxpbmcgRm9yIE1haWxib3ggNyAqLworI2RlZmluZQlSRkg4CQkweDAxMDAJLyogRW5hYmxlIEF1dG9tYXRpYyBSZW1vdGUgRnJhbWUgSGFuZGxpbmcgRm9yIE1haWxib3ggOCAqLworI2RlZmluZQlSRkg5CQkweDAyMDAJLyogRW5hYmxlIEF1dG9tYXRpYyBSZW1vdGUgRnJhbWUgSGFuZGxpbmcgRm9yIE1haWxib3ggOSAqLworI2RlZmluZQlSRkgxMAkJMHgwNDAwCS8qIEVuYWJsZSBBdXRvbWF0aWMgUmVtb3RlIEZyYW1lIEhhbmRsaW5nIEZvciBNYWlsYm94IDEwICovCisjZGVmaW5lCVJGSDExCQkweDA4MDAJLyogRW5hYmxlIEF1dG9tYXRpYyBSZW1vdGUgRnJhbWUgSGFuZGxpbmcgRm9yIE1haWxib3ggMTEgKi8KKyNkZWZpbmUJUkZIMTIJCTB4MTAwMAkvKiBFbmFibGUgQXV0b21hdGljIFJlbW90ZSBGcmFtZSBIYW5kbGluZyBGb3IgTWFpbGJveCAxMiAqLworI2RlZmluZQlSRkgxMwkJMHgyMDAwCS8qIEVuYWJsZSBBdXRvbWF0aWMgUmVtb3RlIEZyYW1lIEhhbmRsaW5nIEZvciBNYWlsYm94IDEzICovCisjZGVmaW5lCVJGSDE0CQkweDQwMDAJLyogRW5hYmxlIEF1dG9tYXRpYyBSZW1vdGUgRnJhbWUgSGFuZGxpbmcgRm9yIE1haWxib3ggMTQgKi8KKyNkZWZpbmUJUkZIMTUJCTB4ODAwMAkvKiBFbmFibGUgQXV0b21hdGljIFJlbW90ZSBGcmFtZSBIYW5kbGluZyBGb3IgTWFpbGJveCAxNSAqLworCisvKiBDQU5fUkZIMiBNYXNrcwkJCQkJCQkJCQkJICovCisjZGVmaW5lCVJGSDE2CQkweDAwMDEJLyogRW5hYmxlIEF1dG9tYXRpYyBSZW1vdGUgRnJhbWUgSGFuZGxpbmcgRm9yIE1haWxib3ggMTYgKi8KKyNkZWZpbmUJUkZIMTcJCTB4MDAwMgkvKiBFbmFibGUgQXV0b21hdGljIFJlbW90ZSBGcmFtZSBIYW5kbGluZyBGb3IgTWFpbGJveCAxNyAqLworI2RlZmluZQlSRkgxOAkJMHgwMDA0CS8qIEVuYWJsZSBBdXRvbWF0aWMgUmVtb3RlIEZyYW1lIEhhbmRsaW5nIEZvciBNYWlsYm94IDE4ICovCisjZGVmaW5lCVJGSDE5CQkweDAwMDgJLyogRW5hYmxlIEF1dG9tYXRpYyBSZW1vdGUgRnJhbWUgSGFuZGxpbmcgRm9yIE1haWxib3ggMTkgKi8KKyNkZWZpbmUJUkZIMjAJCTB4MDAxMAkvKiBFbmFibGUgQXV0b21hdGljIFJlbW90ZSBGcmFtZSBIYW5kbGluZyBGb3IgTWFpbGJveCAyMCAqLworI2RlZmluZQlSRkgyMQkJMHgwMDIwCS8qIEVuYWJsZSBBdXRvbWF0aWMgUmVtb3RlIEZyYW1lIEhhbmRsaW5nIEZvciBNYWlsYm94IDIxICovCisjZGVmaW5lCVJGSDIyCQkweDAwNDAJLyogRW5hYmxlIEF1dG9tYXRpYyBSZW1vdGUgRnJhbWUgSGFuZGxpbmcgRm9yIE1haWxib3ggMjIgKi8KKyNkZWZpbmUJUkZIMjMJCTB4MDA4MAkvKiBFbmFibGUgQXV0b21hdGljIFJlbW90ZSBGcmFtZSBIYW5kbGluZyBGb3IgTWFpbGJveCAyMyAqLworI2RlZmluZQlSRkgyNAkJMHgwMTAwCS8qIEVuYWJsZSBBdXRvbWF0aWMgUmVtb3RlIEZyYW1lIEhhbmRsaW5nIEZvciBNYWlsYm94IDI0ICovCisjZGVmaW5lCVJGSDI1CQkweDAyMDAJLyogRW5hYmxlIEF1dG9tYXRpYyBSZW1vdGUgRnJhbWUgSGFuZGxpbmcgRm9yIE1haWxib3ggMjUgKi8KKyNkZWZpbmUJUkZIMjYJCTB4MDQwMAkvKiBFbmFibGUgQXV0b21hdGljIFJlbW90ZSBGcmFtZSBIYW5kbGluZyBGb3IgTWFpbGJveCAyNiAqLworI2RlZmluZQlSRkgyNwkJMHgwODAwCS8qIEVuYWJsZSBBdXRvbWF0aWMgUmVtb3RlIEZyYW1lIEhhbmRsaW5nIEZvciBNYWlsYm94IDI3ICovCisjZGVmaW5lCVJGSDI4CQkweDEwMDAJLyogRW5hYmxlIEF1dG9tYXRpYyBSZW1vdGUgRnJhbWUgSGFuZGxpbmcgRm9yIE1haWxib3ggMjggKi8KKyNkZWZpbmUJUkZIMjkJCTB4MjAwMAkvKiBFbmFibGUgQXV0b21hdGljIFJlbW90ZSBGcmFtZSBIYW5kbGluZyBGb3IgTWFpbGJveCAyOSAqLworI2RlZmluZQlSRkgzMAkJMHg0MDAwCS8qIEVuYWJsZSBBdXRvbWF0aWMgUmVtb3RlIEZyYW1lIEhhbmRsaW5nIEZvciBNYWlsYm94IDMwICovCisjZGVmaW5lCVJGSDMxCQkweDgwMDAJLyogRW5hYmxlIEF1dG9tYXRpYyBSZW1vdGUgRnJhbWUgSGFuZGxpbmcgRm9yIE1haWxib3ggMzEgKi8KKworLyogQ0FOX01CVElGMSBNYXNrcwkJCQkJCSAqLworI2RlZmluZQlNQlRJRjAJCTB4MDAwMQkvKiBUWCBJbnRlcnJ1cHQJQWN0aXZlIEluIE1haWxib3ggMCAqLworI2RlZmluZQlNQlRJRjEJCTB4MDAwMgkvKiBUWCBJbnRlcnJ1cHQJQWN0aXZlIEluIE1haWxib3ggMSAqLworI2RlZmluZQlNQlRJRjIJCTB4MDAwNAkvKiBUWCBJbnRlcnJ1cHQJQWN0aXZlIEluIE1haWxib3ggMiAqLworI2RlZmluZQlNQlRJRjMJCTB4MDAwOAkvKiBUWCBJbnRlcnJ1cHQJQWN0aXZlIEluIE1haWxib3ggMyAqLworI2RlZmluZQlNQlRJRjQJCTB4MDAxMAkvKiBUWCBJbnRlcnJ1cHQJQWN0aXZlIEluIE1haWxib3ggNCAqLworI2RlZmluZQlNQlRJRjUJCTB4MDAyMAkvKiBUWCBJbnRlcnJ1cHQJQWN0aXZlIEluIE1haWxib3ggNSAqLworI2RlZmluZQlNQlRJRjYJCTB4MDA0MAkvKiBUWCBJbnRlcnJ1cHQJQWN0aXZlIEluIE1haWxib3ggNiAqLworI2RlZmluZQlNQlRJRjcJCTB4MDA4MAkvKiBUWCBJbnRlcnJ1cHQJQWN0aXZlIEluIE1haWxib3ggNyAqLworI2RlZmluZQlNQlRJRjgJCTB4MDEwMAkvKiBUWCBJbnRlcnJ1cHQJQWN0aXZlIEluIE1haWxib3ggOCAqLworI2RlZmluZQlNQlRJRjkJCTB4MDIwMAkvKiBUWCBJbnRlcnJ1cHQJQWN0aXZlIEluIE1haWxib3ggOSAqLworI2RlZmluZQlNQlRJRjEwCQkweDA0MDAJLyogVFggSW50ZXJydXB0CUFjdGl2ZSBJbiBNYWlsYm94IDEwICovCisjZGVmaW5lCU1CVElGMTEJCTB4MDgwMAkvKiBUWCBJbnRlcnJ1cHQJQWN0aXZlIEluIE1haWxib3ggMTEgKi8KKyNkZWZpbmUJTUJUSUYxMgkJMHgxMDAwCS8qIFRYIEludGVycnVwdAlBY3RpdmUgSW4gTWFpbGJveCAxMiAqLworI2RlZmluZQlNQlRJRjEzCQkweDIwMDAJLyogVFggSW50ZXJydXB0CUFjdGl2ZSBJbiBNYWlsYm94IDEzICovCisjZGVmaW5lCU1CVElGMTQJCTB4NDAwMAkvKiBUWCBJbnRlcnJ1cHQJQWN0aXZlIEluIE1haWxib3ggMTQgKi8KKyNkZWZpbmUJTUJUSUYxNQkJMHg4MDAwCS8qIFRYIEludGVycnVwdAlBY3RpdmUgSW4gTWFpbGJveCAxNSAqLworCisvKiBDQU5fTUJUSUYyIE1hc2tzCQkJCQkJICovCisjZGVmaW5lCU1CVElGMTYJCTB4MDAwMQkvKiBUWCBJbnRlcnJ1cHQJQWN0aXZlIEluIE1haWxib3ggMTYgKi8KKyNkZWZpbmUJTUJUSUYxNwkJMHgwMDAyCS8qIFRYIEludGVycnVwdAlBY3RpdmUgSW4gTWFpbGJveCAxNyAqLworI2RlZmluZQlNQlRJRjE4CQkweDAwMDQJLyogVFggSW50ZXJydXB0CUFjdGl2ZSBJbiBNYWlsYm94IDE4ICovCisjZGVmaW5lCU1CVElGMTkJCTB4MDAwOAkvKiBUWCBJbnRlcnJ1cHQJQWN0aXZlIEluIE1haWxib3ggMTkgKi8KKyNkZWZpbmUJTUJUSUYyMAkJMHgwMDEwCS8qIFRYIEludGVycnVwdAlBY3RpdmUgSW4gTWFpbGJveCAyMCAqLworI2RlZmluZQlNQlRJRjIxCQkweDAwMjAJLyogVFggSW50ZXJydXB0CUFjdGl2ZSBJbiBNYWlsYm94IDIxICovCisjZGVmaW5lCU1CVElGMjIJCTB4MDA0MAkvKiBUWCBJbnRlcnJ1cHQJQWN0aXZlIEluIE1haWxib3ggMjIgKi8KKyNkZWZpbmUJTUJUSUYyMwkJMHgwMDgwCS8qIFRYIEludGVycnVwdAlBY3RpdmUgSW4gTWFpbGJveCAyMyAqLworI2RlZmluZQlNQlRJRjI0CQkweDAxMDAJLyogVFggSW50ZXJydXB0CUFjdGl2ZSBJbiBNYWlsYm94IDI0ICovCisjZGVmaW5lCU1CVElGMjUJCTB4MDIwMAkvKiBUWCBJbnRlcnJ1cHQJQWN0aXZlIEluIE1haWxib3ggMjUgKi8KKyNkZWZpbmUJTUJUSUYyNgkJMHgwNDAwCS8qIFRYIEludGVycnVwdAlBY3RpdmUgSW4gTWFpbGJveCAyNiAqLworI2RlZmluZQlNQlRJRjI3CQkweDA4MDAJLyogVFggSW50ZXJydXB0CUFjdGl2ZSBJbiBNYWlsYm94IDI3ICovCisjZGVmaW5lCU1CVElGMjgJCTB4MTAwMAkvKiBUWCBJbnRlcnJ1cHQJQWN0aXZlIEluIE1haWxib3ggMjggKi8KKyNkZWZpbmUJTUJUSUYyOQkJMHgyMDAwCS8qIFRYIEludGVycnVwdAlBY3RpdmUgSW4gTWFpbGJveCAyOSAqLworI2RlZmluZQlNQlRJRjMwCQkweDQwMDAJLyogVFggSW50ZXJydXB0CUFjdGl2ZSBJbiBNYWlsYm94IDMwICovCisjZGVmaW5lCU1CVElGMzEJCTB4ODAwMAkvKiBUWCBJbnRlcnJ1cHQJQWN0aXZlIEluIE1haWxib3ggMzEgKi8KKworLyogQ0FOX01CUklGMSBNYXNrcwkJCQkJCSAqLworI2RlZmluZQlNQlJJRjAJCTB4MDAwMQkvKiBSWCBJbnRlcnJ1cHQJQWN0aXZlIEluIE1haWxib3ggMCAqLworI2RlZmluZQlNQlJJRjEJCTB4MDAwMgkvKiBSWCBJbnRlcnJ1cHQJQWN0aXZlIEluIE1haWxib3ggMSAqLworI2RlZmluZQlNQlJJRjIJCTB4MDAwNAkvKiBSWCBJbnRlcnJ1cHQJQWN0aXZlIEluIE1haWxib3ggMiAqLworI2RlZmluZQlNQlJJRjMJCTB4MDAwOAkvKiBSWCBJbnRlcnJ1cHQJQWN0aXZlIEluIE1haWxib3ggMyAqLworI2RlZmluZQlNQlJJRjQJCTB4MDAxMAkvKiBSWCBJbnRlcnJ1cHQJQWN0aXZlIEluIE1haWxib3ggNCAqLworI2RlZmluZQlNQlJJRjUJCTB4MDAyMAkvKiBSWCBJbnRlcnJ1cHQJQWN0aXZlIEluIE1haWxib3ggNSAqLworI2RlZmluZQlNQlJJRjYJCTB4MDA0MAkvKiBSWCBJbnRlcnJ1cHQJQWN0aXZlIEluIE1haWxib3ggNiAqLworI2RlZmluZQlNQlJJRjcJCTB4MDA4MAkvKiBSWCBJbnRlcnJ1cHQJQWN0aXZlIEluIE1haWxib3ggNyAqLworI2RlZmluZQlNQlJJRjgJCTB4MDEwMAkvKiBSWCBJbnRlcnJ1cHQJQWN0aXZlIEluIE1haWxib3ggOCAqLworI2RlZmluZQlNQlJJRjkJCTB4MDIwMAkvKiBSWCBJbnRlcnJ1cHQJQWN0aXZlIEluIE1haWxib3ggOSAqLworI2RlZmluZQlNQlJJRjEwCQkweDA0MDAJLyogUlggSW50ZXJydXB0CUFjdGl2ZSBJbiBNYWlsYm94IDEwICovCisjZGVmaW5lCU1CUklGMTEJCTB4MDgwMAkvKiBSWCBJbnRlcnJ1cHQJQWN0aXZlIEluIE1haWxib3ggMTEgKi8KKyNkZWZpbmUJTUJSSUYxMgkJMHgxMDAwCS8qIFJYIEludGVycnVwdAlBY3RpdmUgSW4gTWFpbGJveCAxMiAqLworI2RlZmluZQlNQlJJRjEzCQkweDIwMDAJLyogUlggSW50ZXJydXB0CUFjdGl2ZSBJbiBNYWlsYm94IDEzICovCisjZGVmaW5lCU1CUklGMTQJCTB4NDAwMAkvKiBSWCBJbnRlcnJ1cHQJQWN0aXZlIEluIE1haWxib3ggMTQgKi8KKyNkZWZpbmUJTUJSSUYxNQkJMHg4MDAwCS8qIFJYIEludGVycnVwdAlBY3RpdmUgSW4gTWFpbGJveCAxNSAqLworCisvKiBDQU5fTUJSSUYyIE1hc2tzCQkJCQkJICovCisjZGVmaW5lCU1CUklGMTYJCTB4MDAwMQkvKiBSWCBJbnRlcnJ1cHQJQWN0aXZlIEluIE1haWxib3ggMTYgKi8KKyNkZWZpbmUJTUJSSUYxNwkJMHgwMDAyCS8qIFJYIEludGVycnVwdAlBY3RpdmUgSW4gTWFpbGJveCAxNyAqLworI2RlZmluZQlNQlJJRjE4CQkweDAwMDQJLyogUlggSW50ZXJydXB0CUFjdGl2ZSBJbiBNYWlsYm94IDE4ICovCisjZGVmaW5lCU1CUklGMTkJCTB4MDAwOAkvKiBSWCBJbnRlcnJ1cHQJQWN0aXZlIEluIE1haWxib3ggMTkgKi8KKyNkZWZpbmUJTUJSSUYyMAkJMHgwMDEwCS8qIFJYIEludGVycnVwdAlBY3RpdmUgSW4gTWFpbGJveCAyMCAqLworI2RlZmluZQlNQlJJRjIxCQkweDAwMjAJLyogUlggSW50ZXJydXB0CUFjdGl2ZSBJbiBNYWlsYm94IDIxICovCisjZGVmaW5lCU1CUklGMjIJCTB4MDA0MAkvKiBSWCBJbnRlcnJ1cHQJQWN0aXZlIEluIE1haWxib3ggMjIgKi8KKyNkZWZpbmUJTUJSSUYyMwkJMHgwMDgwCS8qIFJYIEludGVycnVwdAlBY3RpdmUgSW4gTWFpbGJveCAyMyAqLworI2RlZmluZQlNQlJJRjI0CQkweDAxMDAJLyogUlggSW50ZXJydXB0CUFjdGl2ZSBJbiBNYWlsYm94IDI0ICovCisjZGVmaW5lCU1CUklGMjUJCTB4MDIwMAkvKiBSWCBJbnRlcnJ1cHQJQWN0aXZlIEluIE1haWxib3ggMjUgKi8KKyNkZWZpbmUJTUJSSUYyNgkJMHgwNDAwCS8qIFJYIEludGVycnVwdAlBY3RpdmUgSW4gTWFpbGJveCAyNiAqLworI2RlZmluZQlNQlJJRjI3CQkweDA4MDAJLyogUlggSW50ZXJydXB0CUFjdGl2ZSBJbiBNYWlsYm94IDI3ICovCisjZGVmaW5lCU1CUklGMjgJCTB4MTAwMAkvKiBSWCBJbnRlcnJ1cHQJQWN0aXZlIEluIE1haWxib3ggMjggKi8KKyNkZWZpbmUJTUJSSUYyOQkJMHgyMDAwCS8qIFJYIEludGVycnVwdAlBY3RpdmUgSW4gTWFpbGJveCAyOSAqLworI2RlZmluZQlNQlJJRjMwCQkweDQwMDAJLyogUlggSW50ZXJydXB0CUFjdGl2ZSBJbiBNYWlsYm94IDMwICovCisjZGVmaW5lCU1CUklGMzEJCTB4ODAwMAkvKiBSWCBJbnRlcnJ1cHQJQWN0aXZlIEluIE1haWxib3ggMzEgKi8KKworLyogQ0FOX01CSU0xIE1hc2tzCQkJCQkgKi8KKyNkZWZpbmUJTUJJTTAJCTB4MDAwMQkvKiBFbmFibGUgSW50ZXJydXB0IEZvcglNYWlsYm94CTAgKi8KKyNkZWZpbmUJTUJJTTEJCTB4MDAwMgkvKiBFbmFibGUgSW50ZXJydXB0IEZvcglNYWlsYm94CTEgKi8KKyNkZWZpbmUJTUJJTTIJCTB4MDAwNAkvKiBFbmFibGUgSW50ZXJydXB0IEZvcglNYWlsYm94CTIgKi8KKyNkZWZpbmUJTUJJTTMJCTB4MDAwOAkvKiBFbmFibGUgSW50ZXJydXB0IEZvcglNYWlsYm94CTMgKi8KKyNkZWZpbmUJTUJJTTQJCTB4MDAxMAkvKiBFbmFibGUgSW50ZXJydXB0IEZvcglNYWlsYm94CTQgKi8KKyNkZWZpbmUJTUJJTTUJCTB4MDAyMAkvKiBFbmFibGUgSW50ZXJydXB0IEZvcglNYWlsYm94CTUgKi8KKyNkZWZpbmUJTUJJTTYJCTB4MDA0MAkvKiBFbmFibGUgSW50ZXJydXB0IEZvcglNYWlsYm94CTYgKi8KKyNkZWZpbmUJTUJJTTcJCTB4MDA4MAkvKiBFbmFibGUgSW50ZXJydXB0IEZvcglNYWlsYm94CTcgKi8KKyNkZWZpbmUJTUJJTTgJCTB4MDEwMAkvKiBFbmFibGUgSW50ZXJydXB0IEZvcglNYWlsYm94CTggKi8KKyNkZWZpbmUJTUJJTTkJCTB4MDIwMAkvKiBFbmFibGUgSW50ZXJydXB0IEZvcglNYWlsYm94CTkgKi8KKyNkZWZpbmUJTUJJTTEwCQkweDA0MDAJLyogRW5hYmxlIEludGVycnVwdCBGb3IJTWFpbGJveAkxMCAqLworI2RlZmluZQlNQklNMTEJCTB4MDgwMAkvKiBFbmFibGUgSW50ZXJydXB0IEZvcglNYWlsYm94CTExICovCisjZGVmaW5lCU1CSU0xMgkJMHgxMDAwCS8qIEVuYWJsZSBJbnRlcnJ1cHQgRm9yCU1haWxib3gJMTIgKi8KKyNkZWZpbmUJTUJJTTEzCQkweDIwMDAJLyogRW5hYmxlIEludGVycnVwdCBGb3IJTWFpbGJveAkxMyAqLworI2RlZmluZQlNQklNMTQJCTB4NDAwMAkvKiBFbmFibGUgSW50ZXJydXB0IEZvcglNYWlsYm94CTE0ICovCisjZGVmaW5lCU1CSU0xNQkJMHg4MDAwCS8qIEVuYWJsZSBJbnRlcnJ1cHQgRm9yCU1haWxib3gJMTUgKi8KKworLyogQ0FOX01CSU0yIE1hc2tzCQkJCQkgKi8KKyNkZWZpbmUJTUJJTTE2CQkweDAwMDEJLyogRW5hYmxlIEludGVycnVwdCBGb3IJTWFpbGJveAkxNiAqLworI2RlZmluZQlNQklNMTcJCTB4MDAwMgkvKiBFbmFibGUgSW50ZXJydXB0IEZvcglNYWlsYm94CTE3ICovCisjZGVmaW5lCU1CSU0xOAkJMHgwMDA0CS8qIEVuYWJsZSBJbnRlcnJ1cHQgRm9yCU1haWxib3gJMTggKi8KKyNkZWZpbmUJTUJJTTE5CQkweDAwMDgJLyogRW5hYmxlIEludGVycnVwdCBGb3IJTWFpbGJveAkxOSAqLworI2RlZmluZQlNQklNMjAJCTB4MDAxMAkvKiBFbmFibGUgSW50ZXJydXB0IEZvcglNYWlsYm94CTIwICovCisjZGVmaW5lCU1CSU0yMQkJMHgwMDIwCS8qIEVuYWJsZSBJbnRlcnJ1cHQgRm9yCU1haWxib3gJMjEgKi8KKyNkZWZpbmUJTUJJTTIyCQkweDAwNDAJLyogRW5hYmxlIEludGVycnVwdCBGb3IJTWFpbGJveAkyMiAqLworI2RlZmluZQlNQklNMjMJCTB4MDA4MAkvKiBFbmFibGUgSW50ZXJydXB0IEZvcglNYWlsYm94CTIzICovCisjZGVmaW5lCU1CSU0yNAkJMHgwMTAwCS8qIEVuYWJsZSBJbnRlcnJ1cHQgRm9yCU1haWxib3gJMjQgKi8KKyNkZWZpbmUJTUJJTTI1CQkweDAyMDAJLyogRW5hYmxlIEludGVycnVwdCBGb3IJTWFpbGJveAkyNSAqLworI2RlZmluZQlNQklNMjYJCTB4MDQwMAkvKiBFbmFibGUgSW50ZXJydXB0IEZvcglNYWlsYm94CTI2ICovCisjZGVmaW5lCU1CSU0yNwkJMHgwODAwCS8qIEVuYWJsZSBJbnRlcnJ1cHQgRm9yCU1haWxib3gJMjcgKi8KKyNkZWZpbmUJTUJJTTI4CQkweDEwMDAJLyogRW5hYmxlIEludGVycnVwdCBGb3IJTWFpbGJveAkyOCAqLworI2RlZmluZQlNQklNMjkJCTB4MjAwMAkvKiBFbmFibGUgSW50ZXJydXB0IEZvcglNYWlsYm94CTI5ICovCisjZGVmaW5lCU1CSU0zMAkJMHg0MDAwCS8qIEVuYWJsZSBJbnRlcnJ1cHQgRm9yCU1haWxib3gJMzAgKi8KKyNkZWZpbmUJTUJJTTMxCQkweDgwMDAJLyogRW5hYmxlIEludGVycnVwdCBGb3IJTWFpbGJveAkzMSAqLworCisvKiBDQU5fR0lNIE1hc2tzCQkJCQkJCQkJICovCisjZGVmaW5lCUVXVElNCQkweDAwMDEJLyogRW5hYmxlIFRYIEVycm9yIENvdW50IEludGVycnVwdCAqLworI2RlZmluZQlFV1JJTQkJMHgwMDAyCS8qIEVuYWJsZSBSWCBFcnJvciBDb3VudCBJbnRlcnJ1cHQgKi8KKyNkZWZpbmUJRVBJTQkJMHgwMDA0CS8qIEVuYWJsZSBFcnJvci1QYXNzaXZlCU1vZGUgSW50ZXJydXB0ICovCisjZGVmaW5lCUJPSU0JCTB4MDAwOAkvKiBFbmFibGUgQnVzIE9mZiBJbnRlcnJ1cHQgKi8KKyNkZWZpbmUJV1VJTQkJMHgwMDEwCS8qIEVuYWJsZSBXYWtlLVVwIEludGVycnVwdCAqLworI2RlZmluZQlVSUFJTQkJMHgwMDIwCS8qIEVuYWJsZSBBY2Nlc3MgVG8gVW5pbXBsZW1lbnRlZCBBZGRyZXNzIEludGVycnVwdCAqLworI2RlZmluZQlBQUlNCQkweDAwNDAJLyogRW5hYmxlIEFib3J0CUFja25vd2xlZGdlIEludGVycnVwdCAqLworI2RlZmluZQlSTUxJTQkJMHgwMDgwCS8qIEVuYWJsZSBSWCBNZXNzYWdlIExvc3QgSW50ZXJydXB0ICovCisjZGVmaW5lCVVDRUlNCQkweDAxMDAJLyogRW5hYmxlIFVuaXZlcnNhbCBDb3VudGVyIE92ZXJmbG93IEludGVycnVwdCAqLworI2RlZmluZQlFWFRJTQkJMHgwMjAwCS8qIEVuYWJsZSBFeHRlcm5hbCBUcmlnZ2VyIE91dHB1dCBJbnRlcnJ1cHQgKi8KKyNkZWZpbmUJQURJTQkJMHgwNDAwCS8qIEVuYWJsZSBBY2Nlc3MgRGVuaWVkCUludGVycnVwdCAqLworCisvKiBDQU5fR0lTIE1hc2tzCQkJCQkJCQkgKi8KKyNkZWZpbmUJRVdUSVMJCTB4MDAwMQkvKiBUWCBFcnJvciBDb3VudCBJUlEgU3RhdHVzICovCisjZGVmaW5lCUVXUklTCQkweDAwMDIJLyogUlggRXJyb3IgQ291bnQgSVJRIFN0YXR1cyAqLworI2RlZmluZQlFUElTCQkweDAwMDQJLyogRXJyb3ItUGFzc2l2ZSBNb2RlIElSUSBTdGF0dXMgKi8KKyNkZWZpbmUJQk9JUwkJMHgwMDA4CS8qIEJ1cyBPZmYgSVJRIFN0YXR1cyAqLworI2RlZmluZQlXVUlTCQkweDAwMTAJLyogV2FrZS1VcCBJUlEgU3RhdHVzICovCisjZGVmaW5lCVVJQUlTCQkweDAwMjAJLyogQWNjZXNzIFRvIFVuaW1wbGVtZW50ZWQgQWRkcmVzcyBJUlEgU3RhdHVzICovCisjZGVmaW5lCUFBSVMJCTB4MDA0MAkvKiBBYm9ydCBBY2tub3dsZWRnZSBJUlEgU3RhdHVzICovCisjZGVmaW5lCVJNTElTCQkweDAwODAJLyogUlggTWVzc2FnZSBMb3N0IElSUSBTdGF0dXMgKi8KKyNkZWZpbmUJVUNFSVMJCTB4MDEwMAkvKiBVbml2ZXJzYWwgQ291bnRlciBPdmVyZmxvdyBJUlEgU3RhdHVzICovCisjZGVmaW5lCUVYVElTCQkweDAyMDAJLyogRXh0ZXJuYWwgVHJpZ2dlciBPdXRwdXQgSVJRIFN0YXR1cyAqLworI2RlZmluZQlBRElTCQkweDA0MDAJLyogQWNjZXNzIERlbmllZCBJUlEgU3RhdHVzICovCisKKy8qIENBTl9HSUYgTWFza3MJCQkJCQkJCSAqLworI2RlZmluZQlFV1RJRgkJMHgwMDAxCS8qIFRYIEVycm9yIENvdW50IElSUSBGbGFnICovCisjZGVmaW5lCUVXUklGCQkweDAwMDIJLyogUlggRXJyb3IgQ291bnQgSVJRIEZsYWcgKi8KKyNkZWZpbmUJRVBJRgkJMHgwMDA0CS8qIEVycm9yLVBhc3NpdmUgTW9kZSBJUlEgRmxhZyAqLworI2RlZmluZQlCT0lGCQkweDAwMDgJLyogQnVzIE9mZiBJUlEgRmxhZwkgKi8KKyNkZWZpbmUJV1VJRgkJMHgwMDEwCS8qIFdha2UtVXAgSVJRIEZsYWcJICovCisjZGVmaW5lCVVJQUlGCQkweDAwMjAJLyogQWNjZXNzIFRvIFVuaW1wbGVtZW50ZWQgQWRkcmVzcyBJUlEgRmxhZyAqLworI2RlZmluZQlBQUlGCQkweDAwNDAJLyogQWJvcnQgQWNrbm93bGVkZ2UgSVJRIEZsYWcgKi8KKyNkZWZpbmUJUk1MSUYJCTB4MDA4MAkvKiBSWCBNZXNzYWdlIExvc3QgSVJRIEZsYWcgKi8KKyNkZWZpbmUJVUNFSUYJCTB4MDEwMAkvKiBVbml2ZXJzYWwgQ291bnRlciBPdmVyZmxvdyBJUlEgRmxhZyAqLworI2RlZmluZQlFWFRJRgkJMHgwMjAwCS8qIEV4dGVybmFsIFRyaWdnZXIgT3V0cHV0IElSUSBGbGFnICovCisjZGVmaW5lCUFESUYJCTB4MDQwMAkvKiBBY2Nlc3MgRGVuaWVkIElSUSBGbGFnICovCisKKy8qIENBTl9VQ0NORiBNYXNrcwkJCQkJCQkJICovCisjZGVmaW5lCVVDQ05GCQkweDAwMEYJLyogVW5pdmVyc2FsIENvdW50ZXIgTW9kZSAqLworI2RlZmluZQlVQ19TVEFNUAkweDAwMDEJLyoJCVRpbWVzdGFtcCBNb2RlICovCisjZGVmaW5lCVVDX1dET0cJCTB4MDAwMgkvKgkJV2F0Y2hkb2cgTW9kZSAqLworI2RlZmluZQlVQ19BVVRPVFgJMHgwMDAzCS8qCQlBdXRvLVRyYW5zbWl0IE1vZGUgKi8KKyNkZWZpbmUJVUNfRVJST1IJMHgwMDA2CS8qCQlDQU4gRXJyb3IgRnJhbWUJQ291bnQgKi8KKyNkZWZpbmUJVUNfT1ZFUgkJMHgwMDA3CS8qCQlDQU4gT3ZlcmxvYWQgRnJhbWUgQ291bnQgKi8KKyNkZWZpbmUJVUNfTE9TVAkJMHgwMDA4CS8qCQlBcmJpdHJhdGlvbiBMb3N0IER1cmluZwlUWCBDb3VudCAqLworI2RlZmluZQlVQ19BQQkJMHgwMDA5CS8qCQlUWCBBYm9ydCBDb3VudCAqLworI2RlZmluZQlVQ19UQQkJMHgwMDBBCS8qCQlUWCBTdWNjZXNzZnVsIENvdW50ICovCisjZGVmaW5lCVVDX1JFSkVDVAkweDAwMEIJLyoJCVJYIE1lc3NhZ2UgUmVqZWN0ZWQgQ291bnQgKi8KKyNkZWZpbmUJVUNfUk1MCQkweDAwMEMJLyoJCVJYIE1lc3NhZ2UgTG9zdAlDb3VudCAqLworI2RlZmluZQlVQ19SWAkJMHgwMDBECS8qCQlUb3RhbCBTdWNjZXNzZnVsIFJYIE1lc3NhZ2VzIENvdW50ICovCisjZGVmaW5lCVVDX1JNUAkJMHgwMDBFCS8qCQlTdWNjZXNzZnVsIFJYIFcvTWF0Y2hpbmcgSUQgQ291bnQgKi8KKyNkZWZpbmUJVUNfQUxMCQkweDAwMEYJLyoJCUNvcnJlY3QJTWVzc2FnZQlPbiBDQU4gQnVzIExpbmUJQ291bnQgKi8KKyNkZWZpbmUJVUNSQwkJMHgwMDIwCS8qIFVuaXZlcnNhbCBDb3VudGVyIFJlbG9hZC9DbGVhciAqLworI2RlZmluZQlVQ0NUCQkweDAwNDAJLyogVW5pdmVyc2FsIENvdW50ZXIgQ0FOIFRyaWdnZXIgKi8KKyNkZWZpbmUJVUNFCQkJMHgwMDgwCS8qIFVuaXZlcnNhbCBDb3VudGVyIEVuYWJsZSAqLworCisvKiBDQU5fRVNSIE1hc2tzCQkJICovCisjZGVmaW5lCUFDS0UJCTB4MDAwNAkvKiBBY2tub3dsZWRnZSBFcnJvciAqLworI2RlZmluZQlTRVIJCQkweDAwMDgJLyogU3R1ZmYgRXJyb3IgKi8KKyNkZWZpbmUJQ1JDRQkJMHgwMDEwCS8qIENSQyBFcnJvciAqLworI2RlZmluZQlTQTAJCQkweDAwMjAJLyogU3R1Y2sgQXQgRG9taW5hbnQgRXJyb3IgKi8KKyNkZWZpbmUJQkVGCQkJMHgwMDQwCS8qIEJpdCBFcnJvciBGbGFnICovCisjZGVmaW5lCUZFUgkJCTB4MDA4MAkvKiBGb3JtCUVycm9yIEZsYWcgKi8KKworLyogQ0FOX0VXUiBNYXNrcwkJCQkJICovCisjZGVmaW5lCUVXTFJFQwkJMHgwMEZGCS8qIFJYIEVycm9yIENvdW50IExpbWl0CShGb3IgRVdSSVMpICovCisjZGVmaW5lCUVXTFRFQwkJMHhGRjAwCS8qIFRYIEVycm9yIENvdW50IExpbWl0CShGb3IgRVdUSVMpICovCisKKyNlbmRpZiAvKiBfREVGX0JGNTM5X0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzOC9pbmNsdWRlL21hY2gvZG1hLmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzgvaW5jbHVkZS9tYWNoL2RtYS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViMDVjYWMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzgvaW5jbHVkZS9tYWNoL2RtYS5oCkBAIC0wLDAgKzEsNDEgQEAKKy8qIG1hY2gvZG1hLmggLSBhcmNoLXNwZWNpZmljIERNQSBkZWZpbmVzCisgKgorICogQ29weXJpZ2h0IDIwMDQtMjAwOCBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgorICovCisKKyNpZm5kZWYgX01BQ0hfRE1BX0hfCisjZGVmaW5lIF9NQUNIX0RNQV9IXworCisjZGVmaW5lIENIX1BQSQkJCTAKKyNkZWZpbmUgQ0hfU1BPUlQwX1JYCQkxCisjZGVmaW5lIENIX1NQT1JUMF9UWAkJMgorI2RlZmluZSBDSF9TUE9SVDFfUlgJCTMKKyNkZWZpbmUgQ0hfU1BPUlQxX1RYCQk0CisjZGVmaW5lIENIX1NQSTAJCQk1CisjZGVmaW5lIENIX1VBUlQwX1JYCQk2CisjZGVmaW5lIENIX1VBUlQwX1RYCQk3CisjZGVmaW5lIENIX1NQT1JUMl9SWAkJOAorI2RlZmluZSBDSF9TUE9SVDJfVFgJCTkKKyNkZWZpbmUgQ0hfU1BPUlQzX1JYCQkxMAorI2RlZmluZSBDSF9TUE9SVDNfVFgJCTExCisjZGVmaW5lIENIX1NQSTEJCQkxNAorI2RlZmluZSBDSF9TUEkyCQkJMTUKKyNkZWZpbmUgQ0hfVUFSVDFfUlgJCTE2CisjZGVmaW5lIENIX1VBUlQxX1RYCQkxNworI2RlZmluZSBDSF9VQVJUMl9SWAkJMTgKKyNkZWZpbmUgQ0hfVUFSVDJfVFgJCTE5CisKKyNkZWZpbmUgQ0hfTUVNX1NUUkVBTTBfREVTVAkyMAorI2RlZmluZSBDSF9NRU1fU1RSRUFNMF9TUkMJMjEKKyNkZWZpbmUgQ0hfTUVNX1NUUkVBTTFfREVTVAkyMgorI2RlZmluZSBDSF9NRU1fU1RSRUFNMV9TUkMJMjMKKyNkZWZpbmUgQ0hfTUVNX1NUUkVBTTJfREVTVAkyNAorI2RlZmluZSBDSF9NRU1fU1RSRUFNMl9TUkMJMjUKKyNkZWZpbmUgQ0hfTUVNX1NUUkVBTTNfREVTVAkyNgorI2RlZmluZSBDSF9NRU1fU1RSRUFNM19TUkMJMjcKKworI2RlZmluZSBNQVhfRE1BX0NIQU5ORUxTIDI4CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM4L2luY2x1ZGUvbWFjaC9ncGlvLmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzgvaW5jbHVkZS9tYWNoL2dwaW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMGY0ZjcyCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM4L2luY2x1ZGUvbWFjaC9ncGlvLmgKQEAgLTAsMCArMSw3OSBAQAorLyoKKyAqIEZpbGU6IGFyY2gvYmxhY2tmaW4vbWFjaC1iZjUzOC9pbmNsdWRlL21hY2gvZ3Bpby5oCisgKiBCdWdzOiBFbnRlciBidWdzIGF0IGh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZy8KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggQW5hbG9nIERldmljZXMgSW5jLgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgorICovCisKKworI2lmbmRlZiBfTUFDSF9HUElPX0hfCisjZGVmaW5lIF9NQUNIX0dQSU9fSF8KKworCS8qIEZJWE1FOgorCSAqIEZvciBub3cgb25seSBzdXBwb3J0IFBPUlRGIEdQSU9zLgorCSAqIFBPUlQgQyxEIGFuZCBFIGFyZSBmb3IgcGVyaXBoZXJhbCB1c2FnZSBvbmx5CisJICovCisjZGVmaW5lIE1BWF9CTEFDS0ZJTl9HUElPUyAxNgorCisjZGVmaW5lCUdQSU9fUEYwCTAJLyogUEYgKi8KKyNkZWZpbmUJR1BJT19QRjEJMQorI2RlZmluZQlHUElPX1BGMgkyCisjZGVmaW5lCUdQSU9fUEYzCTMKKyNkZWZpbmUJR1BJT19QRjQJNAorI2RlZmluZQlHUElPX1BGNQk1CisjZGVmaW5lCUdQSU9fUEY2CTYKKyNkZWZpbmUJR1BJT19QRjcJNworI2RlZmluZQlHUElPX1BGOAk4CisjZGVmaW5lCUdQSU9fUEY5CTkKKyNkZWZpbmUJR1BJT19QRjEwCTEwCisjZGVmaW5lCUdQSU9fUEYxMQkxMQorI2RlZmluZQlHUElPX1BGMTIJMTIKKyNkZWZpbmUJR1BJT19QRjEzCTEzCisjZGVmaW5lCUdQSU9fUEYxNAkxNAorI2RlZmluZQlHUElPX1BGMTUJMTUKKyNkZWZpbmUJR1BJT19QQzAJMTYJLyogUEMgKi8KKyNkZWZpbmUJR1BJT19QQzEJMTcKKyNkZWZpbmUJR1BJT19QQzQJMjAKKyNkZWZpbmUJR1BJT19QQzUJMjEKKyNkZWZpbmUJR1BJT19QQzYJMjIKKyNkZWZpbmUJR1BJT19QQzcJMjMKKyNkZWZpbmUJR1BJT19QQzgJMjQKKyNkZWZpbmUJR1BJT19QQzkJMjUKKyNkZWZpbmUJR1BJT19QRDAJMzIJLyogUEQgKi8KKyNkZWZpbmUJR1BJT19QRDEJMzMKKyNkZWZpbmUJR1BJT19QRDIJMzQKKyNkZWZpbmUJR1BJT19QRDMJMzUKKyNkZWZpbmUJR1BJT19QRDQJMzYKKyNkZWZpbmUJR1BJT19QRDUJMzcKKyNkZWZpbmUJR1BJT19QRDYJMzgKKyNkZWZpbmUJR1BJT19QRDcJMzkKKyNkZWZpbmUJR1BJT19QRDgJNDAKKyNkZWZpbmUJR1BJT19QRDkJNDEKKyNkZWZpbmUJR1BJT19QRDEwICAgICAgCTQyCisjZGVmaW5lCUdQSU9fUEQxMSAgICAgIAk0MworI2RlZmluZQlHUElPX1BEMTIgICAgICAJNDQKKyNkZWZpbmUJR1BJT19QRDEzICAgICAgCTQ1CisjZGVmaW5lCUdQSU9fUEUwCTQ4CS8qIFBFICovCisjZGVmaW5lCUdQSU9fUEUxCTQ5CisjZGVmaW5lCUdQSU9fUEUyCTUwCisjZGVmaW5lCUdQSU9fUEUzCTUxCisjZGVmaW5lCUdQSU9fUEU0CTUyCisjZGVmaW5lCUdQSU9fUEU1CTUzCisjZGVmaW5lCUdQSU9fUEU2CTU0CisjZGVmaW5lCUdQSU9fUEU3CTU1CisjZGVmaW5lCUdQSU9fUEU4CTU2CisjZGVmaW5lCUdQSU9fUEU5CTU3CisjZGVmaW5lCUdQSU9fUEUxMCAgICAgIAk1OAorI2RlZmluZQlHUElPX1BFMTEgICAgICAJNTkKKyNkZWZpbmUJR1BJT19QRTEyICAgICAgCTYwCisjZGVmaW5lCUdQSU9fUEUxMyAgICAgIAk2MQorI2RlZmluZQlHUElPX1BFMTQgICAgICAJNjIKKyNkZWZpbmUJR1BJT19QRTE1ICAgICAgCTYzCisKKyNkZWZpbmUgUE9SVF9GIEdQSU9fUEYwCisjZGVmaW5lIFBPUlRfQyBHUElPX1BDMAorI2RlZmluZSBQT1JUX0QgR1BJT19QRDAKKyNkZWZpbmUgUE9SVF9FIEdQSU9fUEUwCisKKyNlbmRpZiAvKiBfTUFDSF9HUElPX0hfICovCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzgvaW5jbHVkZS9tYWNoL2lycS5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM4L2luY2x1ZGUvbWFjaC9pcnEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZGM4N2ZlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM4L2luY2x1ZGUvbWFjaC9pcnEuaApAQCAtMCwwICsxLDIxMSBAQAorLyoKKyAqIGZpbGU6CWluY2x1ZGUvYXNtLWJsYWNrZmluL21hY2gtYmY1MzgvaXJxLmgKKyAqIGJhc2VkIG9uOglpbmNsdWRlL2FzbS1ibGFja2Zpbi9tYWNoLWJmNTM3L2lycS5oCisgKiBhdXRob3I6CU1pY2hhZWwgSGVubmVyaWNoIChtaWNoYWVsLmhlbm5lcmljaEBhbmFsb2cuY29tKQorICoKKyAqIGNyZWF0ZWQ6CisgKiBkZXNjcmlwdGlvbjoKKyAqCXN5c3RlbSBtbXIgcmVnaXN0ZXIgbWFwCisgKiByZXY6CisgKgorICogbW9kaWZpZWQ6CisgKgorICoKKyAqIGJ1Z3M6ICAgICAgICAgZW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCisgKgorICogdGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgZ251IGdlbmVyYWwgcHVibGljIGxpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgZnJlZSBzb2Z0d2FyZSBmb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiB0aGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCB3aXRob3V0IGFueSB3YXJyYW50eTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBtZXJjaGFudGFiaWxpdHkgb3IgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuICBzZWUgdGhlCisgKiBnbnUgZ2VuZXJhbCBwdWJsaWMgbGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIHlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIGdudSBnZW5lcmFsIHB1YmxpYyBsaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIGNvcHlpbmcuCisgKiBpZiBub3QsIHdyaXRlIHRvIHRoZSBmcmVlIHNvZnR3YXJlIGZvdW5kYXRpb24sCisgKiA1OSB0ZW1wbGUgcGxhY2UgLSBzdWl0ZSAzMzAsIGJvc3RvbiwgbWEgMDIxMTEtMTMwNywgdXNhLgorICovCisKKyNpZm5kZWYgX0JGNTM4X0lSUV9IXworI2RlZmluZSBfQkY1MzhfSVJRX0hfCisKKy8qCisgKiBJbnRlcnJ1cHQgc291cmNlIGRlZmluaXRpb25zCisJRXZlbnQgU291cmNlICAgIENvcmUgRXZlbnQgTmFtZQorCUNvcmUgICAgICAgIEVtdWxhdGlvbiAgICAgICAgICAgICAgICoqCisJRXZlbnRzICAgICAgICAgKGhpZ2hlc3QgcHJpb3JpdHkpICBFTVUgICAgICAgICAwCisJUmVzZXQgICAgICAgICAgICAgICAgICAgUlNUICAgICAgICAgMQorCU5NSSAgICAgICAgICAgICAgICAgICAgIE5NSSAgICAgICAgIDIKKwlFeGNlcHRpb24gICAgICAgICAgICAgICBFVlggICAgICAgICAzCisJUmVzZXJ2ZWQgICAgICAgICAgICAgICAgLS0gICAgICAgICAgNAorCUhhcmR3YXJlIEVycm9yICAgICAgICAgIElWSFcgICAgICAgIDUKKwlDb3JlIFRpbWVyICAgICAgICAgICAgICBJVlRNUiAgICAgICA2ICoKKworCS4uLi4uCisKKwkgU29mdHdhcmUgSW50ZXJydXB0IDEgICAgSVZHMTQgICAgICAgMzEKKwkgU29mdHdhcmUgSW50ZXJydXB0IDIgICAgLS0KKwkgKGxvd2VzdCBwcmlvcml0eSkgIElWRzE1ICAgICAgIDMyICoKKyovCisKKyNkZWZpbmUgTlJfUEVSSV9JTlRTICAgICgyICogMzIpCisKKy8qIFRoZSBBQlNUUkFDVCBJUlEgZGVmaW5pdGlvbnMgKi8KKy8qKiB0aGUgZmlyc3Qgc2V2ZW4gb2YgdGhlIGZvbGxvd2luZyBhcmUgZml4ZWQsIHRoZSByZXN0IHlvdSBjaGFuZ2UgaWYgeW91IG5lZWQgdG8gKiovCisjZGVmaW5lIElSUV9FTVUJCQkwCS8qIEVtdWxhdGlvbiAqLworI2RlZmluZSBJUlFfUlNUCQkJMQkvKiByZXNldCAqLworI2RlZmluZSBJUlFfTk1JCQkJMgkvKiBOb24gTWFza2FibGUgKi8KKyNkZWZpbmUgSVJRX0VWWAkJCTMJLyogRXhjZXB0aW9uICovCisjZGVmaW5lIElSUV9VTlVTRUQJCTQJLyogLSB1bnVzZWQgaW50ZXJydXB0ICovCisjZGVmaW5lIElSUV9IV0VSUgkJNQkvKiBIYXJkd2FyZSBFcnJvciAqLworI2RlZmluZSBJUlFfQ09SRVRNUgkJNgkvKiBDb3JlIHRpbWVyICovCisKKyNkZWZpbmUgQkZJTl9JUlEoeCkJCSgoeCkgKyA3KQorCisjZGVmaW5lIElSUV9QTExfV0FLRVVQCQlCRklOX0lSUSgwKQkvKiBQTEwgV2FrZXVwIEludGVycnVwdCAqLworI2RlZmluZSBJUlFfRE1BMF9FUlJPUgkJQkZJTl9JUlEoMSkJLyogRE1BIEVycm9yIDAgKGdlbmVyaWMpICovCisjZGVmaW5lIElSUV9QUElfRVJST1IJCUJGSU5fSVJRKDIpCS8qIFBQSSBFcnJvciAqLworI2RlZmluZSBJUlFfU1BPUlQwX0VSUk9SCUJGSU5fSVJRKDMpCS8qIFNQT1JUMCBTdGF0dXMgKi8KKyNkZWZpbmUgSVJRX1NQT1JUMV9FUlJPUglCRklOX0lSUSg0KQkvKiBTUE9SVDEgU3RhdHVzICovCisjZGVmaW5lIElSUV9TUEkwX0VSUk9SCQlCRklOX0lSUSg1KQkvKiBTUEkwIFN0YXR1cyAqLworI2RlZmluZSBJUlFfVUFSVDBfRVJST1IJCUJGSU5fSVJRKDYpCS8qIFVBUlQwIFN0YXR1cyAqLworI2RlZmluZSBJUlFfUlRDCQkJQkZJTl9JUlEoNykJLyogUlRDICovCisjZGVmaW5lIElSUV9QUEkJCQlCRklOX0lSUSg4KQkvKiBETUEgQ2hhbm5lbCAwIChQUEkpICovCisjZGVmaW5lIElSUV9TUE9SVDBfUlgJCUJGSU5fSVJRKDkpCS8qIERNQSAxIENoYW5uZWwgKFNQT1JUMCBSWCkgKi8KKyNkZWZpbmUgSVJRX1NQT1JUMF9UWAkJQkZJTl9JUlEoMTApCS8qIERNQSAyIENoYW5uZWwgKFNQT1JUMCBUWCkgKi8KKyNkZWZpbmUgSVJRX1NQT1JUMV9SWAkJQkZJTl9JUlEoMTEpCS8qIERNQSAzIENoYW5uZWwgKFNQT1JUMSBSWCkgKi8KKyNkZWZpbmUgSVJRX1NQT1JUMV9UWAkJQkZJTl9JUlEoMTIpCS8qIERNQSA0IENoYW5uZWwgKFNQT1JUMSBUWCkgKi8KKyNkZWZpbmUgSVJRX1NQSTAJCUJGSU5fSVJRKDEzKQkvKiBETUEgNSBDaGFubmVsIChTUEkwKSAqLworI2RlZmluZSBJUlFfVUFSVDBfUlgJCUJGSU5fSVJRKDE0KQkvKiBETUEgNiBDaGFubmVsIChVQVJUMCBSWCkgKi8KKyNkZWZpbmUgSVJRX1VBUlQwX1RYCQlCRklOX0lSUSgxNSkJLyogRE1BIDcgQ2hhbm5lbCAoVUFSVDAgVFgpICovCisjZGVmaW5lIElSUV9USU1FUjAJCUJGSU5fSVJRKDE2KQkvKiBUaW1lciAwICovCisjZGVmaW5lIElSUV9USU1FUjEJCUJGSU5fSVJRKDE3KQkvKiBUaW1lciAxICovCisjZGVmaW5lIElSUV9USU1FUjIJCUJGSU5fSVJRKDE4KQkvKiBUaW1lciAyICovCisjZGVmaW5lIElSUV9QT1JURl9JTlRBCQlCRklOX0lSUSgxOSkJLyogUG9ydCBGIEludGVycnVwdCBBICovCisjZGVmaW5lIElSUV9QT1JURl9JTlRCCQlCRklOX0lSUSgyMCkJLyogUG9ydCBGIEludGVycnVwdCBCICovCisjZGVmaW5lIElSUV9NRU0wX0RNQTAJCUJGSU5fSVJRKDIxKQkvKiBNRE1BMCBTdHJlYW0gMCAqLworI2RlZmluZSBJUlFfTUVNMF9ETUExCQlCRklOX0lSUSgyMikJLyogTURNQTAgU3RyZWFtIDEgKi8KKyNkZWZpbmUgSVJRX1dBVENICQlCRklOX0lSUSgyMykJLyogU29mdHdhcmUgV2F0Y2hkb2cgVGltZXIgKi8KKyNkZWZpbmUgSVJRX0RNQTFfRVJST1IJCUJGSU5fSVJRKDI0KQkvKiBETUEgRXJyb3IgMSAoZ2VuZXJpYykgKi8KKyNkZWZpbmUgSVJRX1NQT1JUMl9FUlJPUglCRklOX0lSUSgyNSkJLyogU1BPUlQyIFN0YXR1cyAqLworI2RlZmluZSBJUlFfU1BPUlQzX0VSUk9SCUJGSU5fSVJRKDI2KQkvKiBTUE9SVDMgU3RhdHVzICovCisjZGVmaW5lIElSUV9TUEkxX0VSUk9SCQlCRklOX0lSUSgyOCkJLyogU1BJMSBTdGF0dXMgKi8KKyNkZWZpbmUgSVJRX1NQSTJfRVJST1IJCUJGSU5fSVJRKDI5KQkvKiBTUEkyIFN0YXR1cyAqLworI2RlZmluZSBJUlFfVUFSVDFfRVJST1IJCUJGSU5fSVJRKDMwKQkvKiBVQVJUMSBTdGF0dXMgKi8KKyNkZWZpbmUgSVJRX1VBUlQyX0VSUk9SCQlCRklOX0lSUSgzMSkJLyogVUFSVDIgU3RhdHVzICovCisjZGVmaW5lIElSUV9DQU5fRVJST1IJCUJGSU5fSVJRKDMyKQkvKiBDQU4gU3RhdHVzIChFcnJvcikgSW50ZXJydXB0ICovCisjZGVmaW5lIElSUV9TUE9SVDJfUlgJCUJGSU5fSVJRKDMzKQkvKiBETUEgOCBDaGFubmVsIChTUE9SVDIgUlgpICovCisjZGVmaW5lIElSUV9TUE9SVDJfVFgJCUJGSU5fSVJRKDM0KQkvKiBETUEgOSBDaGFubmVsIChTUE9SVDIgVFgpICovCisjZGVmaW5lIElSUV9TUE9SVDNfUlgJCUJGSU5fSVJRKDM1KQkvKiBETUEgMTAgQ2hhbm5lbCAoU1BPUlQzIFJYKSAqLworI2RlZmluZSBJUlFfU1BPUlQzX1RYCQlCRklOX0lSUSgzNikJLyogRE1BIDExIENoYW5uZWwgKFNQT1JUMyBUWCkgKi8KKyNkZWZpbmUgSVJRX1NQSTEJCUJGSU5fSVJRKDM5KQkvKiBETUEgMTQgQ2hhbm5lbCAoU1BJMSkgKi8KKyNkZWZpbmUgSVJRX1NQSTIJCUJGSU5fSVJRKDQwKQkvKiBETUEgMTUgQ2hhbm5lbCAoU1BJMikgKi8KKyNkZWZpbmUgSVJRX1VBUlQxX1JYCQlCRklOX0lSUSg0MSkJLyogRE1BIDE2IENoYW5uZWwgKFVBUlQxIFJYKSAqLworI2RlZmluZSBJUlFfVUFSVDFfVFgJCUJGSU5fSVJRKDQyKQkvKiBETUEgMTcgQ2hhbm5lbCAoVUFSVDEgVFgpICovCisjZGVmaW5lIElSUV9VQVJUMl9SWAkJQkZJTl9JUlEoNDMpCS8qIERNQSAxOCBDaGFubmVsIChVQVJUMiBSWCkgKi8KKyNkZWZpbmUgSVJRX1VBUlQyX1RYCQlCRklOX0lSUSg0NCkJLyogRE1BIDE5IENoYW5uZWwgKFVBUlQyIFRYKSAqLworI2RlZmluZSBJUlFfVFdJMAkJQkZJTl9JUlEoNDUpCS8qIFRXSTAgKi8KKyNkZWZpbmUgSVJRX1RXSTEJCUJGSU5fSVJRKDQ2KQkvKiBUV0kxICovCisjZGVmaW5lIElSUV9DQU5fUlgJCUJGSU5fSVJRKDQ3KQkvKiBDQU4gUmVjZWl2ZSBJbnRlcnJ1cHQgKi8KKyNkZWZpbmUgSVJRX0NBTl9UWAkJQkZJTl9JUlEoNDgpCS8qIENBTiBUcmFuc21pdCBJbnRlcnJ1cHQgKi8KKyNkZWZpbmUgSVJRX01FTTFfRE1BMAkJQkZJTl9JUlEoNDkpCS8qIE1ETUExIFN0cmVhbSAwICovCisjZGVmaW5lIElSUV9NRU0xX0RNQTEJCUJGSU5fSVJRKDUwKQkvKiBNRE1BMSBTdHJlYW0gMSAqLworCisjZGVmaW5lIFNZU19JUlFTCQlCRklOX0lSUSg2MykJLyogNzAgKi8KKworI2RlZmluZSBJUlFfUEYwICAgICAgICAgNzEKKyNkZWZpbmUgSVJRX1BGMSAgICAgICAgIDcyCisjZGVmaW5lIElSUV9QRjIgICAgICAgICA3MworI2RlZmluZSBJUlFfUEYzICAgICAgICAgNzQKKyNkZWZpbmUgSVJRX1BGNCAgICAgICAgIDc1CisjZGVmaW5lIElSUV9QRjUgICAgICAgICA3NgorI2RlZmluZSBJUlFfUEY2ICAgICAgICAgNzcKKyNkZWZpbmUgSVJRX1BGNyAgICAgICAgIDc4CisjZGVmaW5lIElSUV9QRjggICAgICAgICA3OQorI2RlZmluZSBJUlFfUEY5ICAgICAgICAgODAKKyNkZWZpbmUgSVJRX1BGMTAgICAgICAgIDgxCisjZGVmaW5lIElSUV9QRjExICAgICAgICA4MgorI2RlZmluZSBJUlFfUEYxMiAgICAgICAgODMKKyNkZWZpbmUgSVJRX1BGMTMgICAgICAgIDg0CisjZGVmaW5lIElSUV9QRjE0ICAgICAgICA4NQorI2RlZmluZSBJUlFfUEYxNSAgICAgICAgODYKKworI2RlZmluZSBHUElPX0lSUV9CQVNFCUlSUV9QRjAKKworI2RlZmluZSBOUl9JUlFTICAgICAoSVJRX1BGMTUrMSkKKworI2RlZmluZSBJVkc3ICAgICAgICAgICAgNworI2RlZmluZSBJVkc4ICAgICAgICAgICAgOAorI2RlZmluZSBJVkc5ICAgICAgICAgICAgOQorI2RlZmluZSBJVkcxMCAgICAgICAgICAgMTAKKyNkZWZpbmUgSVZHMTEgICAgICAgICAgIDExCisjZGVmaW5lIElWRzEyICAgICAgICAgICAxMgorI2RlZmluZSBJVkcxMyAgICAgICAgICAgMTMKKyNkZWZpbmUgSVZHMTQgICAgICAgICAgIDE0CisjZGVmaW5lIElWRzE1ICAgICAgICAgICAxNQorCisvKiBJQVIwIEJJVCBGSUVMRFMgKi8KKyNkZWZpbmUgSVJRX1BMTF9XQUtFVVBfUE9TCTAKKyNkZWZpbmUgSVJRX0RNQTBfRVJST1JfUE9TCTQKKyNkZWZpbmUgSVJRX1BQSV9FUlJPUl9QT1MJOAorI2RlZmluZSBJUlFfU1BPUlQwX0VSUk9SX1BPUwkxMgorI2RlZmluZSBJUlFfU1BPUlQxX0VSUk9SX1BPUwkxNgorI2RlZmluZSBJUlFfU1BJMF9FUlJPUl9QT1MJMjAKKyNkZWZpbmUgSVJRX1VBUlQwX0VSUk9SX1BPUwkyNAorI2RlZmluZSBJUlFfUlRDX1BPUwkJMjgKKworLyogSUFSMSBCSVQgRklFTERTICovCisjZGVmaW5lIElSUV9QUElfUE9TCQkwCisjZGVmaW5lIElSUV9TUE9SVDBfUlhfUE9TCTQKKyNkZWZpbmUgSVJRX1NQT1JUMF9UWF9QT1MJOAorI2RlZmluZSBJUlFfU1BPUlQxX1JYX1BPUwkxMgorI2RlZmluZSBJUlFfU1BPUlQxX1RYX1BPUwkxNgorI2RlZmluZSBJUlFfU1BJMF9QT1MJCTIwCisjZGVmaW5lIElSUV9VQVJUMF9SWF9QT1MJMjQKKyNkZWZpbmUgSVJRX1VBUlQwX1RYX1BPUwkyOAorCisvKiBJQVIyIEJJVCBGSUVMRFMgKi8KKyNkZWZpbmUgSVJRX1RJTUVSMF9QT1MJCTAKKyNkZWZpbmUgSVJRX1RJTUVSMV9QT1MJCTQKKyNkZWZpbmUgSVJRX1RJTUVSMl9QT1MJCTgKKyNkZWZpbmUgSVJRX1BPUlRGX0lOVEFfUE9TCTEyCisjZGVmaW5lIElSUV9QT1JURl9JTlRCX1BPUwkxNgorI2RlZmluZSBJUlFfTUVNMF9ETUEwX1BPUwkyMAorI2RlZmluZSBJUlFfTUVNMF9ETUExX1BPUwkyNAorI2RlZmluZSBJUlFfV0FUQ0hfUE9TCQkyOAorCisvKiBJQVIzIEJJVCBGSUVMRFMgKi8KKyNkZWZpbmUgSVJRX0RNQTFfRVJST1JfUE9TCTAKKyNkZWZpbmUgSVJRX1NQT1JUMl9FUlJPUl9QT1MJNAorI2RlZmluZSBJUlFfU1BPUlQzX0VSUk9SX1BPUwk4CisjZGVmaW5lIElSUV9TUEkxX0VSUk9SX1BPUwkxNgorI2RlZmluZSBJUlFfU1BJMl9FUlJPUl9QT1MJMjAKKyNkZWZpbmUgSVJRX1VBUlQxX0VSUk9SX1BPUwkyNAorI2RlZmluZSBJUlFfVUFSVDJfRVJST1JfUE9TCTI4CisKKy8qIElBUjQgQklUIEZJRUxEUyAqLworI2RlZmluZSBJUlFfQ0FOX0VSUk9SX1BPUwkwCisjZGVmaW5lIElSUV9TUE9SVDJfUlhfUE9TCTQKKyNkZWZpbmUgSVJRX1NQT1JUMl9UWF9QT1MJOAorI2RlZmluZSBJUlFfU1BPUlQzX1JYX1BPUwkxMgorI2RlZmluZSBJUlFfU1BPUlQzX1RYX1BPUwkxNgorI2RlZmluZSBJUlFfU1BJMV9QT1MJCTI4CisKKy8qIElBUjUgQklUIEZJRUxEUyAqLworI2RlZmluZSBJUlFfU1BJMl9QT1MJCTAKKyNkZWZpbmUgSVJRX1VBUlQxX1JYX1BPUwk0CisjZGVmaW5lIElSUV9VQVJUMV9UWF9QT1MJOAorI2RlZmluZSBJUlFfVUFSVDJfUlhfUE9TCTEyCisjZGVmaW5lIElSUV9VQVJUMl9UWF9QT1MJMTYKKyNkZWZpbmUgSVJRX1RXSTBfUE9TCQkyMAorI2RlZmluZSBJUlFfVFdJMV9QT1MJCTI0CisjZGVmaW5lIElSUV9DQU5fUlhfUE9TCQkyOAorCisvKiBJQVI2IEJJVCBGSUVMRFMgKi8KKyNkZWZpbmUgSVJRX0NBTl9UWF9QT1MJCTAKKyNkZWZpbmUgSVJRX01FTTFfRE1BMF9QT1MJNAorI2RlZmluZSBJUlFfTUVNMV9ETUExX1BPUwk4CisjZW5kaWYJCQkJLyogX0JGNTM4X0lSUV9IXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM4L2luY2x1ZGUvbWFjaC9tZW1fbWFwLmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzgvaW5jbHVkZS9tYWNoL21lbV9tYXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjgxMTk2Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM4L2luY2x1ZGUvbWFjaC9tZW1fbWFwLmgKQEAgLTAsMCArMSwxMTMgQEAKKy8qCisgKiBGaWxlOiAgICAgICAgIGluY2x1ZGUvYXNtLWJsYWNrZmluL21hY2gtYmY1MzgvbWVtX21hcC5oCisgKiBCYXNlZCBvbjoKKyAqIEF1dGhvcjoKKyAqCisgKiBDcmVhdGVkOgorICogRGVzY3JpcHRpb246CisgKgorICogUmV2OgorICoKKyAqIE1vZGlmaWVkOgorICoKKyAqIEJ1Z3M6ICAgICAgICAgRW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuCisgKiBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICovCisKKyNpZm5kZWYgX01FTV9NQVBfNTM4X0hfCisjZGVmaW5lIF9NRU1fTUFQXzUzOF9IXworCisjZGVmaW5lIENPUkVNTVJfQkFTRSAgICAgICAgICAgMHhGRkUwMDAwMAkgLyogQ29yZSBNTVJzICovCisjZGVmaW5lIFNZU01NUl9CQVNFICAgICAgICAgICAgMHhGRkMwMDAwMAkgLyogU3lzdGVtIE1NUnMgKi8KKworLyogQXN5bmMgTWVtb3J5IEJhbmtzICovCisjZGVmaW5lIEFTWU5DX0JBTkszX0JBU0UJMHgyMDMwMDAwMAkgLyogQXN5bmMgQmFuayAzICovCisjZGVmaW5lIEFTWU5DX0JBTkszX1NJWkUJMHgwMDEwMDAwMAkvKiAxTSAqLworI2RlZmluZSBBU1lOQ19CQU5LMl9CQVNFCTB4MjAyMDAwMDAJIC8qIEFzeW5jIEJhbmsgMiAqLworI2RlZmluZSBBU1lOQ19CQU5LMl9TSVpFCTB4MDAxMDAwMDAJLyogMU0gKi8KKyNkZWZpbmUgQVNZTkNfQkFOSzFfQkFTRQkweDIwMTAwMDAwCSAvKiBBc3luYyBCYW5rIDEgKi8KKyNkZWZpbmUgQVNZTkNfQkFOSzFfU0laRQkweDAwMTAwMDAwCS8qIDFNICovCisjZGVmaW5lIEFTWU5DX0JBTkswX0JBU0UJMHgyMDAwMDAwMAkgLyogQXN5bmMgQmFuayAwICovCisjZGVmaW5lIEFTWU5DX0JBTkswX1NJWkUJMHgwMDEwMDAwMAkvKiAxTSAqLworCisvKiBCb290IFJPTSBNZW1vcnkgKi8KKworI2RlZmluZSBCT09UX1JPTV9TVEFSVAkJMHhFRjAwMDAwMAorI2RlZmluZSBCT09UX1JPTV9MRU5HVEgJCTB4NDAwCisKKy8qIExldmVsIDEgTWVtb3J5ICovCisKKyNpZmRlZiBDT05GSUdfQkZJTl9JQ0FDSEUKKyNkZWZpbmUgQkZJTl9JQ0FDSEVTSVpFCSgxNioxMDI0KQorI2Vsc2UKKyNkZWZpbmUgQkZJTl9JQ0FDSEVTSVpFCSgwKjEwMjQpCisjZW5kaWYKKworLyogTWVtb3J5IE1hcCBmb3IgQURTUC1CRjUzOC85IHByb2Nlc3NvcnMgKi8KKworI2RlZmluZSBMMV9DT0RFX1NUQVJUICAgICAgIDB4RkZBMDAwMDAKKyNkZWZpbmUgTDFfREFUQV9BX1NUQVJUICAgICAweEZGODAwMDAwCisjZGVmaW5lIEwxX0RBVEFfQl9TVEFSVCAgICAgMHhGRjkwMDAwMAorCisjaWZkZWYgQ09ORklHX0JGSU5fSUNBQ0hFCisjZGVmaW5lIEwxX0NPREVfTEVOR1RIICAgICAgKDB4MTQwMDAgLSAweDQwMDApCisjZWxzZQorI2RlZmluZSBMMV9DT0RFX0xFTkdUSCAgICAgIDB4MTQwMDAKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0JGSU5fRENBQ0hFCisKKyNpZmRlZiBDT05GSUdfQkZJTl9EQ0FDSEVfQkFOS0EKKyNkZWZpbmUgRE1FTV9DTlRSIChBQ0FDSEVfQlNSQU0gfCBFTkRDUExCIHwgUE9SVF9QUkVGMCkKKyNkZWZpbmUgTDFfREFUQV9BX0xFTkdUSCAgICAgICgweDgwMDAgLSAweDQwMDApCisjZGVmaW5lIEwxX0RBVEFfQl9MRU5HVEggICAgICAweDgwMDAKKyNkZWZpbmUgQkZJTl9EQ0FDSEVTSVpFCSgxNioxMDI0KQorI2RlZmluZSBCRklOX0RTVVBCQU5LUwkxCisjZWxzZQorI2RlZmluZSBETUVNX0NOVFIgKEFDQUNIRV9CQ0FDSEUgfCBFTkRDUExCIHwgUE9SVF9QUkVGMCkKKyNkZWZpbmUgTDFfREFUQV9BX0xFTkdUSCAgICAgICgweDgwMDAgLSAweDQwMDApCisjZGVmaW5lIEwxX0RBVEFfQl9MRU5HVEggICAgICAoMHg4MDAwIC0gMHg0MDAwKQorI2RlZmluZSBCRklOX0RDQUNIRVNJWkUJKDMyKjEwMjQpCisjZGVmaW5lIEJGSU5fRFNVUEJBTktTCTIKKyNlbmRpZgorCisjZWxzZQorI2RlZmluZSBETUVNX0NOVFIgKEFTUkFNX0JTUkFNIHwgRU5EQ1BMQiB8IFBPUlRfUFJFRjApCisjZGVmaW5lIEwxX0RBVEFfQV9MRU5HVEggICAgICAweDgwMDAKKyNkZWZpbmUgTDFfREFUQV9CX0xFTkdUSCAgICAgIDB4ODAwMAorI2RlZmluZSBCRklOX0RDQUNIRVNJWkUJKDAqMTAyNCkKKyNkZWZpbmUgQkZJTl9EU1VQQkFOS1MJMAorI2VuZGlmIC8qQ09ORklHX0JGSU5fRENBQ0hFKi8KKworCisvKiBMZXZlbCAyIE1lbW9yeSAtIG5vbmUgKi8KKworI2RlZmluZSBMMl9TVEFSVAkwCisjZGVmaW5lIEwyX0xFTkdUSAkwCisKKy8qIFNjcmF0Y2ggUGFkIE1lbW9yeSAqLworCisjZGVmaW5lIEwxX1NDUkFUQ0hfU1RBUlQJMHhGRkIwMDAwMAorI2RlZmluZSBMMV9TQ1JBVENIX0xFTkdUSAkweDEwMDAKKworI2RlZmluZSBHRVRfUERBX1NBRkUocHJlZykJCVwKKwlwcmVnLmwgPSBfY3B1X3BkYTsJCVwKKwlwcmVnLmggPSBfY3B1X3BkYTsKKworI2RlZmluZSBHRVRfUERBKHByZWcsIGRyZWcpCUdFVF9QREFfU0FGRShwcmVnKQorCisjZW5kaWYJCQkJLyogX01FTV9NQVBfNTM4X0hfICovCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzgvaW5jbHVkZS9tYWNoL3BvcnRtdXguaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzOC9pbmNsdWRlL21hY2gvcG9ydG11eC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlMDMxYjUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzgvaW5jbHVkZS9tYWNoL3BvcnRtdXguaApAQCAtMCwwICsxLDEwNiBAQAorI2lmbmRlZiBfTUFDSF9QT1JUTVVYX0hfCisjZGVmaW5lIF9NQUNIX1BPUlRNVVhfSF8KKworI2RlZmluZSBNQVhfUkVTT1VSQ0VTCU1BWF9CTEFDS0ZJTl9HUElPUworCisjZGVmaW5lIFBfVE1SMgkJKFBfRE9OVENBUkUpCisjZGVmaW5lIFBfVE1SMQkJKFBfRE9OVENBUkUpCisjZGVmaW5lIFBfVE1SMAkJKFBfRE9OVENBUkUpCisjZGVmaW5lIFBfVE1SQ0xLCShQX0RPTlRDQVJFKQorI2RlZmluZSBQX1BQSTBfQ0xLCShQX0RPTlRDQVJFKQorI2RlZmluZSBQX1BQSTBfRlMxCShQX0RPTlRDQVJFKQorI2RlZmluZSBQX1BQSTBfRlMyCShQX0RPTlRDQVJFKQorCisjZGVmaW5lIFBfVFdJMF9TQ0wJKFBfRE9OVENBUkUpCisjZGVmaW5lIFBfVFdJMF9TREEJKFBfRE9OVENBUkUpCisjZGVmaW5lIFBfVFdJMV9TQ0wJKFBfRE9OVENBUkUpCisjZGVmaW5lIFBfVFdJMV9TREEJKFBfRE9OVENBUkUpCisKKyNkZWZpbmUgUF9TUE9SVDFfVFNDTEsJKFBfRE9OVENBUkUpCisjZGVmaW5lIFBfU1BPUlQxX1JTQ0xLCShQX0RPTlRDQVJFKQorI2RlZmluZSBQX1NQT1JUMF9UU0NMSwkoUF9ET05UQ0FSRSkKKyNkZWZpbmUgUF9TUE9SVDBfUlNDTEsJKFBfRE9OVENBUkUpCisjZGVmaW5lIFBfU1BPUlQxX0RSU0VDCShQX0RPTlRDQVJFKQorI2RlZmluZSBQX1NQT1JUMV9SRlMJKFBfRE9OVENBUkUpCisjZGVmaW5lIFBfU1BPUlQxX0RUUFJJCShQX0RPTlRDQVJFKQorI2RlZmluZSBQX1NQT1JUMV9EVFNFQwkoUF9ET05UQ0FSRSkKKyNkZWZpbmUgUF9TUE9SVDFfVEZTCShQX0RPTlRDQVJFKQorI2RlZmluZSBQX1NQT1JUMV9EUlBSSQkoUF9ET05UQ0FSRSkKKyNkZWZpbmUgUF9TUE9SVDBfRFJTRUMJKFBfRE9OVENBUkUpCisjZGVmaW5lIFBfU1BPUlQwX1JGUwkoUF9ET05UQ0FSRSkKKyNkZWZpbmUgUF9TUE9SVDBfRFRQUkkJKFBfRE9OVENBUkUpCisjZGVmaW5lIFBfU1BPUlQwX0RUU0VDCShQX0RPTlRDQVJFKQorI2RlZmluZSBQX1NQT1JUMF9URlMJKFBfRE9OVENBUkUpCisjZGVmaW5lIFBfU1BPUlQwX0RSUFJJCShQX0RPTlRDQVJFKQorCisjZGVmaW5lIFBfVUFSVDBfUlgJKFBfRE9OVENBUkUpCisjZGVmaW5lIFBfVUFSVDBfVFgJKFBfRE9OVENBUkUpCisKKyNkZWZpbmUgUF9TUEkwX01PU0kJKFBfRE9OVENBUkUpCisjZGVmaW5lIFBfU1BJMF9NSVNPCShQX0RPTlRDQVJFKQorI2RlZmluZSBQX1NQSTBfU0NLCShQX0RPTlRDQVJFKQorCisjZGVmaW5lIFBfUFBJMF9EMAkoUF9ET05UQ0FSRSkKKyNkZWZpbmUgUF9QUEkwX0QxCShQX0RPTlRDQVJFKQorI2RlZmluZSBQX1BQSTBfRDIJKFBfRE9OVENBUkUpCisjZGVmaW5lIFBfUFBJMF9EMwkoUF9ET05UQ0FSRSkKKworI2RlZmluZSBQX0NBTjBfVFgJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QQzApKQorI2RlZmluZSBQX0NBTjBfUlgJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QQzEpKQorCisjZGVmaW5lIFBfU1BJMV9NT1NJCShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEQwKSkKKyNkZWZpbmUgUF9TUEkxX01JU08JKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRDEpKQorI2RlZmluZSBQX1NQSTFfU0NLCShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEQyKSkKKyNkZWZpbmUgUF9TUEkxX1NTCShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEQzKSkKKyNkZWZpbmUgUF9TUEkxX1NTRUwxCShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEQ0KSkKKyNkZWZpbmUgUF9TUEkyX01PU0kJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRDUpKQorI2RlZmluZSBQX1NQSTJfTUlTTwkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BENikpCisjZGVmaW5lIFBfU1BJMl9TQ0sJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRDcpKQorI2RlZmluZSBQX1NQSTJfU1MJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRDgpKQorI2RlZmluZSBQX1NQSTJfU1NFTDEJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRDkpKQorI2RlZmluZSBQX1VBUlQxX1JYCShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEQxMCkpCisjZGVmaW5lIFBfVUFSVDFfVFgJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRDExKSkKKyNkZWZpbmUgUF9VQVJUMl9SWAkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BEMTIpKQorI2RlZmluZSBQX1VBUlQyX1RYCShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEQxMykpCisKKyNkZWZpbmUgUF9TUE9SVDJfUlNDTEsJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRTApKQorI2RlZmluZSBQX1NQT1JUMl9SRlMJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRTEpKQorI2RlZmluZSBQX1NQT1JUMl9EUlBSSQkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BFMikpCisjZGVmaW5lIFBfU1BPUlQyX0RSU0VDCShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEUzKSkKKyNkZWZpbmUgUF9TUE9SVDJfVFNDTEsJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRTQpKQorI2RlZmluZSBQX1NQT1JUMl9URlMJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRTUpKQorI2RlZmluZSBQX1NQT1JUMl9EVFBSSQkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BFNikpCisjZGVmaW5lIFBfU1BPUlQyX0RUU0VDCShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEU3KSkKKyNkZWZpbmUgUF9TUE9SVDNfUlNDTEsJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRTgpKQorI2RlZmluZSBQX1NQT1JUM19SRlMJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRTkpKQorI2RlZmluZSBQX1NQT1JUM19EUlBSSQkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BFMTApKQorI2RlZmluZSBQX1NQT1JUM19EUlNFQwkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BFMTEpKQorI2RlZmluZSBQX1NQT1JUM19UU0NMSwkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BFMTIpKQorI2RlZmluZSBQX1NQT1JUM19URlMJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRTEzKSkKKyNkZWZpbmUgUF9TUE9SVDNfRFRQUkkJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRTE0KSkKKyNkZWZpbmUgUF9TUE9SVDNfRFRTRUMJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRTE1KSkKKworI2RlZmluZSBQX1BQSTBfRlMzCShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEYzKSkKKyNkZWZpbmUgUF9QUEkwX0QxNQkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BGNCkpCisjZGVmaW5lIFBfUFBJMF9EMTQJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRjUpKQorI2RlZmluZSBQX1BQSTBfRDEzCShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEY2KSkKKyNkZWZpbmUgUF9QUEkwX0QxMgkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BGNykpCisjZGVmaW5lIFBfUFBJMF9EMTEJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRjgpKQorI2RlZmluZSBQX1BQSTBfRDEwCShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEY5KSkKKyNkZWZpbmUgUF9QUEkwX0Q5CShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEYxMCkpCisjZGVmaW5lIFBfUFBJMF9EOAkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BGMTEpKQorCisjZGVmaW5lIFBfUFBJMF9ENAkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BGMTUpKQorI2RlZmluZSBQX1BQSTBfRDUJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRjE0KSkKKyNkZWZpbmUgUF9QUEkwX0Q2CShQX0RFRklORUQgfCBQX0lERU5UKEdQSU9fUEYxMykpCisjZGVmaW5lIFBfUFBJMF9ENwkoUF9ERUZJTkVEIHwgUF9JREVOVChHUElPX1BGMTIpKQorI2RlZmluZSBQX1NQSTBfU1NFTDcJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRjcpKQorI2RlZmluZSBQX1NQSTBfU1NFTDYJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRjYpKQorI2RlZmluZSBQX1NQSTBfU1NFTDUJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRjUpKQorI2RlZmluZSBQX1NQSTBfU1NFTDQJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRjQpKQorI2RlZmluZSBQX1NQSTBfU1NFTDMJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRjMpKQorI2RlZmluZSBQX1NQSTBfU1NFTDIJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRjIpKQorI2RlZmluZSBQX1NQSTBfU1NFTDEJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRjEpKQorI2RlZmluZSBQX1NQSTBfU1MJKFBfREVGSU5FRCB8IFBfSURFTlQoR1BJT19QRjApKQorCisjZW5kaWYgLyogX01BQ0hfUE9SVE1VWF9IXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM4L2ludHMtcHJpb3JpdHkuYyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzOC9pbnRzLXByaW9yaXR5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzBkMTdlNQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzOC9pbnRzLXByaW9yaXR5LmMKQEAgLTAsMCArMSw5NCBAQAorLyoKKyAqIEZpbGU6ICAgICAgICAgYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM4L2ludHMtcHJpb3JpdHkuYworICogQmFzZWQgb246ICAgICBhcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvaW50cy1wcmlvcml0eS5jCisgKiBBdXRob3I6ICAgICAgIE1pY2hhZWwgSGVubmVyaWNoCisgKgorICogQ3JlYXRlZDoKKyAqIERlc2NyaXB0aW9uOiAgU2V0IHVwIHRoZSBpbnRlcnJ1cHQgcHJpb3JpdGllcworICoKKyAqIE1vZGlmaWVkOgorICogICAgICAgICAgICAgICBDb3B5cmlnaHQgMjAwOCBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKgorICogQnVnczogICAgICAgICBFbnRlciBidWdzIGF0IGh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZy8KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSB0aGUgZmlsZSBDT1BZSU5HLCBvciB3cml0ZQorICogdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGFzbS9ibGFja2Zpbi5oPgorCit2b2lkIF9faW5pdCBwcm9ncmFtX0lBUih2b2lkKQoreworCisJLyogUHJvZ3JhbSB0aGUgSUFSMCBSZWdpc3RlciB3aXRoIHRoZSBjb25maWd1cmVkIHByaW9yaXR5ICovCisJYmZpbl93cml0ZV9TSUNfSUFSMCgoKENPTkZJR19JUlFfUExMX1dBS0VVUCAtIDcpIDw8IElSUV9QTExfV0FLRVVQX1BPUykgfAorCQkJKChDT05GSUdfSVJRX0RNQTBfRVJST1IgLSA3KSA8PCBJUlFfRE1BMF9FUlJPUl9QT1MpIHwKKwkJCSgoQ09ORklHX0lSUV9QUElfRVJST1IgLSA3KSA8PCBJUlFfUFBJX0VSUk9SX1BPUykgfAorCQkJKChDT05GSUdfSVJRX1NQT1JUMF9FUlJPUiAtIDcpIDw8IElSUV9TUE9SVDBfRVJST1JfUE9TKSB8CisJCQkoKENPTkZJR19JUlFfU1BPUlQxX0VSUk9SIC0gNykgPDwgSVJRX1NQT1JUMV9FUlJPUl9QT1MpIHwKKwkJCSgoQ09ORklHX0lSUV9TUEkwX0VSUk9SIC0gNykgPDwgSVJRX1NQSTBfRVJST1JfUE9TKSB8CisJCQkoKENPTkZJR19JUlFfVUFSVDBfRVJST1IgLSA3KSA8PCBJUlFfVUFSVDBfRVJST1JfUE9TKSB8CisJCQkoKENPTkZJR19JUlFfUlRDIC0gNykgPDwgSVJRX1JUQ19QT1MpKTsKKworCWJmaW5fd3JpdGVfU0lDX0lBUjEoKChDT05GSUdfSVJRX1BQSSAtIDcpIDw8IElSUV9QUElfUE9TKSB8CisJCQkoKENPTkZJR19JUlFfU1BPUlQwX1JYIC0gNykgPDwgSVJRX1NQT1JUMF9SWF9QT1MpIHwKKwkJCSgoQ09ORklHX0lSUV9TUE9SVDBfVFggLSA3KSA8PCBJUlFfU1BPUlQwX1RYX1BPUykgfAorCQkJKChDT05GSUdfSVJRX1NQT1JUMV9SWCAtIDcpIDw8IElSUV9TUE9SVDFfUlhfUE9TKSB8CisJCQkoKENPTkZJR19JUlFfU1BPUlQxX1RYIC0gNykgPDwgSVJRX1NQT1JUMV9UWF9QT1MpIHwKKwkJCSgoQ09ORklHX0lSUV9TUEkwIC0gNykgPDwgSVJRX1NQSTBfUE9TKSB8CisJCQkoKENPTkZJR19JUlFfVUFSVDBfUlggLSA3KSA8PCBJUlFfVUFSVDBfUlhfUE9TKSB8CisJCQkoKENPTkZJR19JUlFfVUFSVDBfVFggLSA3KSA8PCBJUlFfVUFSVDBfVFhfUE9TKSk7CisKKwliZmluX3dyaXRlX1NJQ19JQVIyKCgoQ09ORklHX0lSUV9USU1FUjAgLSA3KSA8PCBJUlFfVElNRVIwX1BPUykgfAorCQkJKChDT05GSUdfSVJRX1RJTUVSMSAtIDcpIDw8IElSUV9USU1FUjFfUE9TKSB8CisJCQkoKENPTkZJR19JUlFfVElNRVIyIC0gNykgPDwgSVJRX1RJTUVSMl9QT1MpIHwKKwkJCSgoQ09ORklHX0lSUV9QT1JURl9JTlRBIC0gNykgPDwgSVJRX1BPUlRGX0lOVEFfUE9TKSB8CisJCQkoKENPTkZJR19JUlFfUE9SVEZfSU5UQiAtIDcpIDw8IElSUV9QT1JURl9JTlRCX1BPUykgfAorCQkJKChDT05GSUdfSVJRX01FTTBfRE1BMCAtIDcpIDw8IElSUV9NRU0wX0RNQTBfUE9TKSB8CisJCQkoKENPTkZJR19JUlFfTUVNMF9ETUExIC0gNykgPDwgSVJRX01FTTBfRE1BMV9QT1MpIHwKKwkJCSgoQ09ORklHX0lSUV9XQVRDSCAtIDcpIDw8IElSUV9XQVRDSF9QT1MpKTsKKworCWJmaW5fd3JpdGVfU0lDX0lBUjMoKChDT05GSUdfSVJRX0RNQTFfRVJST1IgLSA3KSA8PCBJUlFfRE1BMV9FUlJPUl9QT1MpIHwKKwkJCSgoQ09ORklHX0lSUV9TUE9SVDJfRVJST1IgLSA3KSA8PCBJUlFfU1BPUlQyX0VSUk9SX1BPUykgfAorCQkJKChDT05GSUdfSVJRX1NQT1JUM19FUlJPUiAtIDcpIDw8IElSUV9TUE9SVDNfRVJST1JfUE9TKSB8CisJCQkoKENPTkZJR19JUlFfU1BJMV9FUlJPUiAtIDcpIDw8IElSUV9TUEkxX0VSUk9SX1BPUykgfAorCQkJKChDT05GSUdfSVJRX1NQSTJfRVJST1IgLSA3KSA8PCBJUlFfU1BJMl9FUlJPUl9QT1MpIHwKKwkJCSgoQ09ORklHX0lSUV9VQVJUMV9FUlJPUiAtIDcpIDw8IElSUV9VQVJUMV9FUlJPUl9QT1MpIHwKKwkJCSgoQ09ORklHX0lSUV9VQVJUMl9FUlJPUiAtIDcpIDw8IElSUV9VQVJUMl9FUlJPUl9QT1MpKTsKKworCWJmaW5fd3JpdGVfU0lDX0lBUjQoKChDT05GSUdfSVJRX0NBTl9FUlJPUiAtIDcpIDw8IElSUV9DQU5fRVJST1JfUE9TKSB8CisJCQkoKENPTkZJR19JUlFfU1BPUlQyX1JYIC0gNykgPDwgSVJRX1NQT1JUMl9SWF9QT1MpIHwKKwkJCSgoQ09ORklHX0lSUV9TUE9SVDJfVFggLSA3KSA8PCBJUlFfU1BPUlQyX1RYX1BPUykgfAorCQkJKChDT05GSUdfSVJRX1NQT1JUM19SWCAtIDcpIDw8IElSUV9TUE9SVDNfUlhfUE9TKSB8CisJCQkoKENPTkZJR19JUlFfU1BPUlQzX1RYIC0gNykgPDwgSVJRX1NQT1JUM19UWF9QT1MpIHwKKwkJCSgoQ09ORklHX0lSUV9TUEkxIC0gNykgPDwgSVJRX1NQSTFfUE9TKSk7CisKKwliZmluX3dyaXRlX1NJQ19JQVI1KCgoQ09ORklHX0lSUV9TUEkyIC0gNykgPDwgSVJRX1NQSTJfUE9TKSB8CisJCQkoKENPTkZJR19JUlFfVUFSVDFfUlggLSA3KSA8PCBJUlFfVUFSVDFfUlhfUE9TKSB8CisJCQkoKENPTkZJR19JUlFfVUFSVDFfVFggLSA3KSA8PCBJUlFfVUFSVDFfVFhfUE9TKSB8CisJCQkoKENPTkZJR19JUlFfVUFSVDJfUlggLSA3KSA8PCBJUlFfVUFSVDJfUlhfUE9TKSB8CisJCQkoKENPTkZJR19JUlFfVUFSVDJfVFggLSA3KSA8PCBJUlFfVUFSVDJfVFhfUE9TKSB8CisJCQkoKENPTkZJR19JUlFfVFdJMCAtIDcpIDw8IElSUV9UV0kwX1BPUykgfAorCQkJKChDT05GSUdfSVJRX1RXSTEgLSA3KSA8PCBJUlFfVFdJMV9QT1MpIHwKKwkJCSgoQ09ORklHX0lSUV9DQU5fUlggLSA3KSA8PCBJUlFfQ0FOX1JYX1BPUykpOworCisJYmZpbl93cml0ZV9TSUNfSUFSNigoKENPTkZJR19JUlFfQ0FOX1RYIC0gNykgPDwgSVJRX0NBTl9UWF9QT1MpIHwKKwkJCSgoQ09ORklHX0lSUV9NRU0xX0RNQTAgLSA3KSA8PCBJUlFfTUVNMV9ETUEwX1BPUykgfAorCQkJKChDT05GSUdfSVJRX01FTTFfRE1BMSAtIDcpIDw8IElSUV9NRU0xX0RNQTFfUE9TKSk7CisKKwlTU1lOQygpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L0tjb25maWcgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvS2NvbmZpZwppbmRleCAxYmZjZDhmLi5kY2Y2NTcxIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvS2NvbmZpZworKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvS2NvbmZpZwpAQCAtMjUwLDcgKzI1MCw3IEBACiAJZGVmYXVsdCAxMQogY29uZmlnIElSUV9USU1FUjAKIAlpbnQgIklSUV9USU1FUjAiCi0JZGVmYXVsdCAxMQorCWRlZmF1bHQgOAogY29uZmlnIElSUV9USU1FUjEKIAlpbnQgIklSUV9USU1FUjEiCiAJZGVmYXVsdCAxMQpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L01ha2VmaWxlIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L01ha2VmaWxlCmluZGV4IDY4ZTU0NzguLjU2OTk0YjYgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9NYWtlZmlsZQorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvTWFrZWZpbGUKQEAgLTIsNiArMiw0IEBACiAjIGFyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9NYWtlZmlsZQogIwogCi1leHRyYS15IDo9IGhlYWQubwotCiBvYmoteSA6PSBpbnRzLXByaW9yaXR5Lm8gZG1hLm8KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9ib2FyZHMvY21fYmY1NDguYyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9ib2FyZHMvY21fYmY1NDguYwppbmRleCAyNDE5MmFhLi5mNTNhZDY4IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvYm9hcmRzL2NtX2JmNTQ4LmMKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2JvYXJkcy9jbV9iZjU0OC5jCkBAIC0zMiw2ICszMiw3IEBACiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvbXRkL210ZC5oPgogI2luY2x1ZGUgPGxpbnV4L210ZC9wYXJ0aXRpb25zLmg+CisjaW5jbHVkZSA8bGludXgvbXRkL3BoeXNtYXAuaD4KICNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpL2ZsYXNoLmg+CiAjaW5jbHVkZSA8bGludXgvaXJxLmg+CkBAIC00Miw2ICs0Myw3IEBACiAjaW5jbHVkZSA8YXNtL2dwaW8uaD4KICNpbmNsdWRlIDxhc20vbmFuZC5oPgogI2luY2x1ZGUgPGFzbS9wb3J0bXV4Lmg+CisjaW5jbHVkZSA8YXNtL2JmaW5fc2RoLmg+CiAjaW5jbHVkZSA8bWFjaC9iZjU0eF9rZXlzLmg+CiAjaW5jbHVkZSA8YXNtL2RwbWMuaD4KICNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgpAQCAtMTg2LDQ0ICsxODgsMTA3IEBACiAjZW5kaWYKIAogI2lmIGRlZmluZWQoQ09ORklHX0JGSU5fU0lSKSB8fCBkZWZpbmVkKENPTkZJR19CRklOX1NJUl9NT0RVTEUpCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIGJmaW5fc2lyX3Jlc291cmNlc1tdID0gewogI2lmZGVmIENPTkZJR19CRklOX1NJUjAKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYmZpbl9zaXIwX3Jlc291cmNlc1tdID0gewogCXsKIAkJLnN0YXJ0ID0gMHhGRkMwMDQwMCwKIAkJLmVuZCA9IDB4RkZDMDA0RkYsCiAJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAogCX0sCisJeworCQkuc3RhcnQgPSBJUlFfVUFSVDBfUlgsCisJCS5lbmQgPSBJUlFfVUFSVDBfUlgrMSwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJfSwKKwl7CisJCS5zdGFydCA9IENIX1VBUlQwX1JYLAorCQkuZW5kID0gQ0hfVUFSVDBfUlgrMSwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9ETUEsCisJfSwKK307CitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZmluX3NpcjBfZGV2aWNlID0geworCS5uYW1lID0gImJmaW5fc2lyIiwKKwkuaWQgPSAwLAorCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRShiZmluX3NpcjBfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UgPSBiZmluX3NpcjBfcmVzb3VyY2VzLAorfTsKICNlbmRpZgogI2lmZGVmIENPTkZJR19CRklOX1NJUjEKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYmZpbl9zaXIxX3Jlc291cmNlc1tdID0gewogCXsKIAkJLnN0YXJ0ID0gMHhGRkMwMjAwMCwKIAkJLmVuZCA9IDB4RkZDMDIwRkYsCiAJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAogCX0sCisJeworCQkuc3RhcnQgPSBJUlFfVUFSVDFfUlgsCisJCS5lbmQgPSBJUlFfVUFSVDFfUlgrMSwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJfSwKKwl7CisJCS5zdGFydCA9IENIX1VBUlQxX1JYLAorCQkuZW5kID0gQ0hfVUFSVDFfUlgrMSwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9ETUEsCisJfSwKK307CitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZmluX3NpcjFfZGV2aWNlID0geworCS5uYW1lID0gImJmaW5fc2lyIiwKKwkuaWQgPSAxLAorCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRShiZmluX3NpcjFfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UgPSBiZmluX3NpcjFfcmVzb3VyY2VzLAorfTsKICNlbmRpZgogI2lmZGVmIENPTkZJR19CRklOX1NJUjIKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYmZpbl9zaXIyX3Jlc291cmNlc1tdID0gewogCXsKIAkJLnN0YXJ0ID0gMHhGRkMwMjEwMCwKIAkJLmVuZCA9IDB4RkZDMDIxRkYsCiAJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAogCX0sCisJeworCQkuc3RhcnQgPSBJUlFfVUFSVDJfUlgsCisJCS5lbmQgPSBJUlFfVUFSVDJfUlgrMSwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJfSwKKwl7CisJCS5zdGFydCA9IENIX1VBUlQyX1JYLAorCQkuZW5kID0gQ0hfVUFSVDJfUlgrMSwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9ETUEsCisJfSwKK307CitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZmluX3NpcjJfZGV2aWNlID0geworCS5uYW1lID0gImJmaW5fc2lyIiwKKwkuaWQgPSAyLAorCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRShiZmluX3NpcjJfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UgPSBiZmluX3NpcjJfcmVzb3VyY2VzLAorfTsKICNlbmRpZgogI2lmZGVmIENPTkZJR19CRklOX1NJUjMKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYmZpbl9zaXIzX3Jlc291cmNlc1tdID0gewogCXsKIAkJLnN0YXJ0ID0gMHhGRkMwMzEwMCwKIAkJLmVuZCA9IDB4RkZDMDMxRkYsCiAJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAogCX0sCi0jZW5kaWYKKwl7CisJCS5zdGFydCA9IElSUV9VQVJUM19SWCwKKwkJLmVuZCA9IElSUV9VQVJUM19SWCsxLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorCXsKKwkJLnN0YXJ0ID0gQ0hfVUFSVDNfUlgsCisJCS5lbmQgPSBDSF9VQVJUM19SWCsxLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0RNQSwKKwl9LAogfTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYmZpbl9zaXJfZGV2aWNlID0geworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYmZpbl9zaXIzX2RldmljZSA9IHsKIAkubmFtZSA9ICJiZmluX3NpciIsCi0JLmlkID0gMCwKLQkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUoYmZpbl9zaXJfcmVzb3VyY2VzKSwKLQkucmVzb3VyY2UgPSBiZmluX3Npcl9yZXNvdXJjZXMsCisJLmlkID0gMywKKwkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUoYmZpbl9zaXIzX3Jlc291cmNlcyksCisJLnJlc291cmNlID0gYmZpbl9zaXIzX3Jlc291cmNlcywKIH07CiAjZW5kaWYKKyNlbmRpZgogCiAjaWYgZGVmaW5lZChDT05GSUdfU01TQzkxMVgpIHx8IGRlZmluZWQoQ09ORklHX1NNU0M5MTFYX01PRFVMRSkKIHN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2Ugc21zYzkxMXhfcmVzb3VyY2VzW10gPSB7CkBAIC0yNzEsOCArMzM2LDggQEAKIAkuZHluX2ZpZm8JPSAwLAogCS5zb2Z0X2Nvbgk9IDEsCiAJLmRtYQkJPSAxLAotCS5udW1fZXBzCT0gNywKLQkuZG1hX2NoYW5uZWxzCT0gNywKKwkubnVtX2Vwcwk9IDgsCisJLmRtYV9jaGFubmVscwk9IDgsCiAJLmdwaW9fdnJzZWwJPSBHUElPX1BINiwKIH07CiAKQEAgLTMwMiw2ICszNjcsMTkgQEAKIH07CiAjZW5kaWYKIAorc3RhdGljIHN0cnVjdCByZXNvdXJjZSBiZmluX2dwaW9zX3Jlc291cmNlcyA9IHsKKwkuc3RhcnQgPSAwLAorCS5lbmQgICA9IE1BWF9CTEFDS0ZJTl9HUElPUyAtIDEsCisJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZmluX2dwaW9zX2RldmljZSA9IHsKKwkubmFtZSA9ICJzaW1wbGUtZ3BpbyIsCisJLmlkID0gLTEsCisJLm51bV9yZXNvdXJjZXMgPSAxLAorCS5yZXNvdXJjZSA9ICZiZmluX2dwaW9zX3Jlc291cmNlcywKK307CisKICNpZiBkZWZpbmVkKENPTkZJR19QQVRBX0JGNTRYKSB8fCBkZWZpbmVkKENPTkZJR19QQVRBX0JGNTRYX01PRFVMRSkKIHN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYmZpbl9hdGFwaV9yZXNvdXJjZXNbXSA9IHsKIAl7CkBAIC0zNzIsOSArNDUwLDU4IEBACiAjZW5kaWYKIAogI2lmIGRlZmluZWQoQ09ORklHX1NESF9CRklOKSB8fCBkZWZpbmVkKENPTkZJR19TREhfQkZJTl9NT0RVTEUpCitzdGF0aWMgc3RydWN0IGJmaW5fc2RfaG9zdCBiZmluX3NkaF9kYXRhID0geworCS5kbWFfY2hhbiA9IENIX1NESCwKKwkuaXJxX2ludDAgPSBJUlFfU0RIX01BU0swLAorCS5waW5fcmVxID0ge1BfU0RfRDAsIFBfU0RfRDEsIFBfU0RfRDIsIFBfU0RfRDMsIFBfU0RfQ0xLLCBQX1NEX0NNRCwgMH0sCit9OworCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZjU0eF9zZGhfZGV2aWNlID0gewogCS5uYW1lID0gImJmaW4tc2RoIiwKIAkuaWQgPSAwLAorCS5kZXYgPSB7CisJCS5wbGF0Zm9ybV9kYXRhID0gJmJmaW5fc2RoX2RhdGEsCisJfSwKK307CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX01URF9QSFlTTUFQKSB8fCBkZWZpbmVkKENPTkZJR19NVERfUEhZU01BUF9NT0RVTEUpCitzdGF0aWMgc3RydWN0IG10ZF9wYXJ0aXRpb24gcGFyYV9wYXJ0aXRpb25zW10gPSB7CisJeworCQkubmFtZSAgICAgICA9ICJib290bG9hZGVyKG5vcikiLAorCQkuc2l6ZSAgICAgICA9IDB4NDAwMDAsCisJCS5vZmZzZXQgICAgID0gMCwKKwl9LCB7CisJCS5uYW1lICAgICAgID0gImxpbnV4IGtlcm5lbChub3IpIiwKKwkJLnNpemUgICAgICAgPSAweDQwMDAwMCwKKwkJLm9mZnNldCAgICAgPSBNVERQQVJUX09GU19BUFBFTkQsCisJfSwgeworCQkubmFtZSAgICAgICA9ICJmaWxlIHN5c3RlbShub3IpIiwKKwkJLnNpemUgICAgICAgPSBNVERQQVJUX1NJWl9GVUxMLAorCQkub2Zmc2V0ICAgICA9IE1URFBBUlRfT0ZTX0FQUEVORCwKKwl9Cit9OworCitzdGF0aWMgc3RydWN0IHBoeXNtYXBfZmxhc2hfZGF0YSBwYXJhX2ZsYXNoX2RhdGEgPSB7CisJLndpZHRoICAgICAgPSAyLAorCS5wYXJ0cyAgICAgID0gcGFyYV9wYXJ0aXRpb25zLAorCS5ucl9wYXJ0cyAgID0gQVJSQVlfU0laRShwYXJhX3BhcnRpdGlvbnMpLAorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBwYXJhX2ZsYXNoX3Jlc291cmNlID0geworCS5zdGFydCA9IDB4MjAwMDAwMDAsCisJLmVuZCAgID0gMHgyMDdmZmZmZiwKKwkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHBhcmFfZmxhc2hfZGV2aWNlID0geworCS5uYW1lICAgICAgICAgID0gInBoeXNtYXAtZmxhc2giLAorCS5pZCAgICAgICAgICAgID0gMCwKKwkuZGV2ID0geworCQkucGxhdGZvcm1fZGF0YSA9ICZwYXJhX2ZsYXNoX2RhdGEsCisJfSwKKwkubnVtX3Jlc291cmNlcyA9IDEsCisJLnJlc291cmNlICAgICAgPSAmcGFyYV9mbGFzaF9yZXNvdXJjZSwKIH07CiAjZW5kaWYKIApAQCAtNjQyLDcgKzc2OSwxOCBAQAogI2VuZGlmCiAKICNpZiBkZWZpbmVkKENPTkZJR19CRklOX1NJUikgfHwgZGVmaW5lZChDT05GSUdfQkZJTl9TSVJfTU9EVUxFKQotCSZiZmluX3Npcl9kZXZpY2UsCisjaWZkZWYgQ09ORklHX0JGSU5fU0lSMAorCSZiZmluX3NpcjBfZGV2aWNlLAorI2VuZGlmCisjaWZkZWYgQ09ORklHX0JGSU5fU0lSMQorCSZiZmluX3NpcjFfZGV2aWNlLAorI2VuZGlmCisjaWZkZWYgQ09ORklHX0JGSU5fU0lSMgorCSZiZmluX3NpcjJfZGV2aWNlLAorI2VuZGlmCisjaWZkZWYgQ09ORklHX0JGSU5fU0lSMworCSZiZmluX3NpcjNfZGV2aWNlLAorI2VuZGlmCiAjZW5kaWYKIAogI2lmIGRlZmluZWQoQ09ORklHX0ZCX0JGNTRYX0xRMDQzKSB8fCBkZWZpbmVkKENPTkZJR19GQl9CRjU0WF9MUTA0M19NT0RVTEUpCkBAIC02NzksNyArODE3LDcgQEAKICNlbmRpZgogCiAjaWYgZGVmaW5lZChDT05GSUdfSTJDX0JMQUNLRklOX1RXSSkgfHwgZGVmaW5lZChDT05GSUdfSTJDX0JMQUNLRklOX1RXSV9NT0RVTEUpCi0vKgkmaTJjX2JmaW5fdHdpMF9kZXZpY2UsICovCisJJmkyY19iZmluX3R3aTBfZGV2aWNlLAogI2lmICFkZWZpbmVkKENPTkZJR19CRjU0MikKIAkmaTJjX2JmaW5fdHdpMV9kZXZpY2UsCiAjZW5kaWYKQEAgLTY4OCw2ICs4MjYsMTIgQEAKICNpZiBkZWZpbmVkKENPTkZJR19LRVlCT0FSRF9HUElPKSB8fCBkZWZpbmVkKENPTkZJR19LRVlCT0FSRF9HUElPX01PRFVMRSkKIAkmYmZpbl9kZXZpY2VfZ3Bpb2tleXMsCiAjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX01URF9QSFlTTUFQKSB8fCBkZWZpbmVkKENPTkZJR19NVERfUEhZU01BUF9NT0RVTEUpCisJJnBhcmFfZmxhc2hfZGV2aWNlLAorI2VuZGlmCisKKwkmYmZpbl9ncGlvc19kZXZpY2UsCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBjbV9iZjU0OF9pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvYm9hcmRzL2V6a2l0LmMgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvYm9hcmRzL2V6a2l0LmMKaW5kZXggNTI4ODE4Ny4uMzA5YzE2MCAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2JvYXJkcy9lemtpdC5jCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9ib2FyZHMvZXpraXQuYwpAQCAtNDUsNiArNDUsNyBAQAogI2luY2x1ZGUgPGFzbS9uYW5kLmg+CiAjaW5jbHVkZSA8YXNtL2RwbWMuaD4KICNpbmNsdWRlIDxhc20vcG9ydG11eC5oPgorI2luY2x1ZGUgPGFzbS9iZmluX3NkaC5oPgogI2luY2x1ZGUgPG1hY2gvYmY1NHhfa2V5cy5oPgogI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3BpL2FkNzg3Ny5oPgpAQCAtNTIsMTYgKzUzLDE2IEBACiAvKgogICogTmFtZSB0aGUgQm9hcmQgZm9yIHRoZSAvcHJvYy9jcHVpbmZvCiAgKi8KLWNvbnN0IGNoYXIgYmZpbl9ib2FyZF9uYW1lW10gPSAiQURTUC1CRjU0OC1FWktJVCI7Citjb25zdCBjaGFyIGJmaW5fYm9hcmRfbmFtZVtdID0gIkFESSBCRjU0OC1FWktJVCI7CiAKIC8qCiAgKiAgRHJpdmVyIG5lZWRzIHRvIGtub3cgYWRkcmVzcywgaXJxIGFuZCBmbGFnIHBpbi4KICAqLwogCiAjaWYgZGVmaW5lZChDT05GSUdfVVNCX0lTUDE3NjBfSENEKSB8fCBkZWZpbmVkKENPTkZJR19VU0JfSVNQMTc2MF9IQ0RfTU9EVUxFKQotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBiZmluX2lzcDE3NjFfcmVzb3VyY2VzW10gPSB7CisjaW5jbHVkZSA8bGludXgvdXNiL2lzcDE3NjAuaD4KK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYmZpbl9pc3AxNzYwX3Jlc291cmNlc1tdID0gewogCVswXSA9IHsKLQkJLm5hbWUJPSAiaXNwMTc2MS1yZWdzIiwKIAkJLnN0YXJ0ICA9IDB4MkMwQzAwMDAsCiAJCS5lbmQgICAgPSAweDJDMEMwMDAwICsgMHhmZmZmZiwKIAkJLmZsYWdzICA9IElPUkVTT1VSQ0VfTUVNLApAQCAtNzMsMzIgKzc0LDI1IEBACiAJfSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGJmaW5faXNwMTc2MV9kZXZpY2UgPSB7Ci0JLm5hbWUgICAgICAgICAgID0gImlzcDE3NjEiLAorc3RhdGljIHN0cnVjdCBpc3AxNzYwX3BsYXRmb3JtX2RhdGEgaXNwMTc2MF9wcml2ID0geworCS5pc19pc3AxNzYxID0gMCwKKwkucG9ydDFfZGlzYWJsZSA9IDAsCisJLmJ1c193aWR0aF8xNiA9IDEsCisJLnBvcnQxX290ZyA9IDAsCisJLmFuYWxvZ19vYyA9IDAsCisJLmRhY2tfcG9sYXJpdHlfaGlnaCA9IDAsCisJLmRyZXFfcG9sYXJpdHlfaGlnaCA9IDAsCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZmluX2lzcDE3NjBfZGV2aWNlID0geworCS5uYW1lICAgICAgICAgICA9ICJpc3AxNzYwLWhjZCIsCiAJLmlkICAgICAgICAgICAgID0gMCwKLQkubnVtX3Jlc291cmNlcyAgPSBBUlJBWV9TSVpFKGJmaW5faXNwMTc2MV9yZXNvdXJjZXMpLAotCS5yZXNvdXJjZSAgICAgICA9IGJmaW5faXNwMTc2MV9yZXNvdXJjZXMsCisJLmRldiA9IHsKKwkJLnBsYXRmb3JtX2RhdGEgPSAmaXNwMTc2MF9wcml2LAorCX0sCisJLm51bV9yZXNvdXJjZXMgID0gQVJSQVlfU0laRShiZmluX2lzcDE3NjBfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UgICAgICAgPSBiZmluX2lzcDE3NjBfcmVzb3VyY2VzLAogfTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmJmaW5faXNwMTc2MV9kZXZpY2VzW10gPSB7Ci0JJmJmaW5faXNwMTc2MV9kZXZpY2UsCi19OwotCi1pbnQgX19pbml0IGJmaW5faXNwMTc2MV9pbml0KHZvaWQpCi17Ci0JdW5zaWduZWQgaW50IG51bV9kZXZpY2VzID0gQVJSQVlfU0laRShiZmluX2lzcDE3NjFfZGV2aWNlcyk7Ci0KLQlwcmludGsoS0VSTl9JTkZPICIlcygpOiByZWdpc3RlcmluZyBkZXZpY2UgcmVzb3VyY2VzXG4iLCBfX2Z1bmNfXyk7Ci0Jc2V0X2lycV90eXBlKGJmaW5faXNwMTc2MV9yZXNvdXJjZXNbMV0uc3RhcnQsIElSUUZfVFJJR0dFUl9GQUxMSU5HKTsKLQotCXJldHVybiBwbGF0Zm9ybV9hZGRfZGV2aWNlcyhiZmluX2lzcDE3NjFfZGV2aWNlcywgbnVtX2RldmljZXMpOwotfQotCi12b2lkIF9fZXhpdCBiZmluX2lzcDE3NjFfZXhpdCh2b2lkKQotewotCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKCZiZmluX2lzcDE3NjFfZGV2aWNlKTsKLX0KLWFyY2hfaW5pdGNhbGwoYmZpbl9pc3AxNzYxX2luaXQpOwogI2VuZGlmCiAKICNpZiBkZWZpbmVkKENPTkZJR19GQl9CRjU0WF9MUTA0MykgfHwgZGVmaW5lZChDT05GSUdfRkJfQkY1NFhfTFEwNDNfTU9EVUxFKQpAQCAtMjYyLDQ0ICsyNTYsMTA3IEBACiAjZW5kaWYKIAogI2lmIGRlZmluZWQoQ09ORklHX0JGSU5fU0lSKSB8fCBkZWZpbmVkKENPTkZJR19CRklOX1NJUl9NT0RVTEUpCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIGJmaW5fc2lyX3Jlc291cmNlc1tdID0gewogI2lmZGVmIENPTkZJR19CRklOX1NJUjAKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYmZpbl9zaXIwX3Jlc291cmNlc1tdID0gewogCXsKIAkJLnN0YXJ0ID0gMHhGRkMwMDQwMCwKIAkJLmVuZCA9IDB4RkZDMDA0RkYsCiAJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAogCX0sCisJeworCQkuc3RhcnQgPSBJUlFfVUFSVDBfUlgsCisJCS5lbmQgPSBJUlFfVUFSVDBfUlgrMSwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJfSwKKwl7CisJCS5zdGFydCA9IENIX1VBUlQwX1JYLAorCQkuZW5kID0gQ0hfVUFSVDBfUlgrMSwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9ETUEsCisJfSwKK307CitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZmluX3NpcjBfZGV2aWNlID0geworCS5uYW1lID0gImJmaW5fc2lyIiwKKwkuaWQgPSAwLAorCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRShiZmluX3NpcjBfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UgPSBiZmluX3NpcjBfcmVzb3VyY2VzLAorfTsKICNlbmRpZgogI2lmZGVmIENPTkZJR19CRklOX1NJUjEKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYmZpbl9zaXIxX3Jlc291cmNlc1tdID0gewogCXsKIAkJLnN0YXJ0ID0gMHhGRkMwMjAwMCwKIAkJLmVuZCA9IDB4RkZDMDIwRkYsCiAJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAogCX0sCisJeworCQkuc3RhcnQgPSBJUlFfVUFSVDFfUlgsCisJCS5lbmQgPSBJUlFfVUFSVDFfUlgrMSwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJfSwKKwl7CisJCS5zdGFydCA9IENIX1VBUlQxX1JYLAorCQkuZW5kID0gQ0hfVUFSVDFfUlgrMSwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9ETUEsCisJfSwKK307CitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZmluX3NpcjFfZGV2aWNlID0geworCS5uYW1lID0gImJmaW5fc2lyIiwKKwkuaWQgPSAxLAorCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRShiZmluX3NpcjFfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UgPSBiZmluX3NpcjFfcmVzb3VyY2VzLAorfTsKICNlbmRpZgogI2lmZGVmIENPTkZJR19CRklOX1NJUjIKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYmZpbl9zaXIyX3Jlc291cmNlc1tdID0gewogCXsKIAkJLnN0YXJ0ID0gMHhGRkMwMjEwMCwKIAkJLmVuZCA9IDB4RkZDMDIxRkYsCiAJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAogCX0sCisJeworCQkuc3RhcnQgPSBJUlFfVUFSVDJfUlgsCisJCS5lbmQgPSBJUlFfVUFSVDJfUlgrMSwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJfSwKKwl7CisJCS5zdGFydCA9IENIX1VBUlQyX1JYLAorCQkuZW5kID0gQ0hfVUFSVDJfUlgrMSwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9ETUEsCisJfSwKK307CitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBiZmluX3NpcjJfZGV2aWNlID0geworCS5uYW1lID0gImJmaW5fc2lyIiwKKwkuaWQgPSAyLAorCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRShiZmluX3NpcjJfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UgPSBiZmluX3NpcjJfcmVzb3VyY2VzLAorfTsKICNlbmRpZgogI2lmZGVmIENPTkZJR19CRklOX1NJUjMKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYmZpbl9zaXIzX3Jlc291cmNlc1tdID0gewogCXsKIAkJLnN0YXJ0ID0gMHhGRkMwMzEwMCwKIAkJLmVuZCA9IDB4RkZDMDMxRkYsCiAJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAogCX0sCi0jZW5kaWYKKwl7CisJCS5zdGFydCA9IElSUV9VQVJUM19SWCwKKwkJLmVuZCA9IElSUV9VQVJUM19SWCsxLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorCXsKKwkJLnN0YXJ0ID0gQ0hfVUFSVDNfUlgsCisJCS5lbmQgPSBDSF9VQVJUM19SWCsxLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0RNQSwKKwl9LAogfTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYmZpbl9zaXJfZGV2aWNlID0geworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYmZpbl9zaXIzX2RldmljZSA9IHsKIAkubmFtZSA9ICJiZmluX3NpciIsCi0JLmlkID0gMCwKLQkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUoYmZpbl9zaXJfcmVzb3VyY2VzKSwKLQkucmVzb3VyY2UgPSBiZmluX3Npcl9yZXNvdXJjZXMsCisJLmlkID0gMywKKwkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUoYmZpbl9zaXIzX3Jlc291cmNlcyksCisJLnJlc291cmNlID0gYmZpbl9zaXIzX3Jlc291cmNlcywKIH07CiAjZW5kaWYKKyNlbmRpZgogCiAjaWYgZGVmaW5lZChDT05GSUdfU01TQzkxMVgpIHx8IGRlZmluZWQoQ09ORklHX1NNU0M5MTFYX01PRFVMRSkKIHN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2Ugc21zYzkxMXhfcmVzb3VyY2VzW10gPSB7CkBAIC0zNDcsOCArNDA0LDggQEAKIAkuZHluX2ZpZm8JPSAwLAogCS5zb2Z0X2Nvbgk9IDEsCiAJLmRtYQkJPSAxLAotCS5udW1fZXBzCT0gNywKLQkuZG1hX2NoYW5uZWxzCT0gNywKKwkubnVtX2Vwcwk9IDgsCisJLmRtYV9jaGFubmVscwk9IDgsCiAJLmdwaW9fdnJzZWwJPSBHUElPX1BFNywKIH07CiAKQEAgLTQ0OCw5ICs1MDUsMTkgQEAKICNlbmRpZgogCiAjaWYgZGVmaW5lZChDT05GSUdfU0RIX0JGSU4pIHx8IGRlZmluZWQoQ09ORklHX1NESF9CRklOX01PRFVMRSkKKworc3RhdGljIHN0cnVjdCBiZmluX3NkX2hvc3QgYmZpbl9zZGhfZGF0YSA9IHsKKwkuZG1hX2NoYW4gPSBDSF9TREgsCisJLmlycV9pbnQwID0gSVJRX1NESF9NQVNLMCwKKwkucGluX3JlcSA9IHtQX1NEX0QwLCBQX1NEX0QxLCBQX1NEX0QyLCBQX1NEX0QzLCBQX1NEX0NMSywgUF9TRF9DTUQsIDB9LAorfTsKKwogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYmY1NHhfc2RoX2RldmljZSA9IHsKIAkubmFtZSA9ICJiZmluLXNkaCIsCiAJLmlkID0gMCwKKwkuZGV2ID0geworCQkucGxhdGZvcm1fZGF0YSA9ICZiZmluX3NkaF9kYXRhLAorCX0sCiB9OwogI2VuZGlmCiAKQEAgLTU4OSw3ICs2NTYsNyBAQAogewogCS5tb2RhbGlhcwkJPSAiYWQ3ODc3IiwKIAkucGxhdGZvcm1fZGF0YQkJPSAmYmZpbl9hZDc4NzdfdHNfaW5mbywKLQkuaXJxCQkJPSBJUlFfUEoxMSwJLyogbmV3ZXIgYm9hcmRzIChSZXYgMS40KykgdXNlIElSUV9QQjQgKi8KKwkuaXJxCQkJPSBJUlFfUEI0LAkvKiBvbGQgYm9hcmRzICg8PVJldiAxLjMpIHVzZSBJUlFfUEoxMSAqLwogCS5tYXhfc3BlZWRfaHoJCT0gMTI1MDAwMDAsICAgICAvKiBtYXggc3BpIGNsb2NrIChTQ0spIHNwZWVkIGluIEhaICovCiAJLmJ1c19udW0JCT0gMCwKIAkuY2hpcF9zZWxlY3QgIAkJPSAyLApAQCAtODEyLDcgKzg3OSwxOCBAQAogI2VuZGlmCiAKICNpZiBkZWZpbmVkKENPTkZJR19CRklOX1NJUikgfHwgZGVmaW5lZChDT05GSUdfQkZJTl9TSVJfTU9EVUxFKQotCSZiZmluX3Npcl9kZXZpY2UsCisjaWZkZWYgQ09ORklHX0JGSU5fU0lSMAorCSZiZmluX3NpcjBfZGV2aWNlLAorI2VuZGlmCisjaWZkZWYgQ09ORklHX0JGSU5fU0lSMQorCSZiZmluX3NpcjFfZGV2aWNlLAorI2VuZGlmCisjaWZkZWYgQ09ORklHX0JGSU5fU0lSMgorCSZiZmluX3NpcjJfZGV2aWNlLAorI2VuZGlmCisjaWZkZWYgQ09ORklHX0JGSU5fU0lSMworCSZiZmluX3NpcjNfZGV2aWNlLAorI2VuZGlmCiAjZW5kaWYKIAogI2lmIGRlZmluZWQoQ09ORklHX0ZCX0JGNTRYX0xRMDQzKSB8fCBkZWZpbmVkKENPTkZJR19GQl9CRjU0WF9MUTA0M19NT0RVTEUpCkBAIC04MjcsNiArOTA1LDEwIEBACiAJJm11c2JfZGV2aWNlLAogI2VuZGlmCiAKKyNpZiBkZWZpbmVkKENPTkZJR19VU0JfSVNQMTc2MF9IQ0QpIHx8IGRlZmluZWQoQ09ORklHX1VTQl9JU1AxNzYwX0hDRF9NT0RVTEUpCisJJmJmaW5faXNwMTc2MF9kZXZpY2UsCisjZW5kaWYKKwogI2lmIGRlZmluZWQoQ09ORklHX1BBVEFfQkY1NFgpIHx8IGRlZmluZWQoQ09ORklHX1BBVEFfQkY1NFhfTU9EVUxFKQogCSZiZmluX2F0YXBpX2RldmljZSwKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2RtYS5jIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2RtYS5jCmluZGV4IDc0NzMwZWIuLjUzNTk4MDYgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9kbWEuYworKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvZG1hLmMKQEAgLTMyLDcgKzMyLDcgQEAKICNpbmNsdWRlIDxhc20vYmxhY2tmaW4uaD4KICNpbmNsdWRlIDxhc20vZG1hLmg+CiAKLXN0cnVjdCBkbWFfcmVnaXN0ZXIgKmRtYV9pb19iYXNlX2FkZHJbTUFYX0JMQUNLRklOX0RNQV9DSEFOTkVMXSA9IHsKK3N0cnVjdCBkbWFfcmVnaXN0ZXIgKmRtYV9pb19iYXNlX2FkZHJbTUFYX0RNQV9DSEFOTkVMU10gPSB7CiAJKHN0cnVjdCBkbWFfcmVnaXN0ZXIgKikgRE1BMF9ORVhUX0RFU0NfUFRSLAogCShzdHJ1Y3QgZG1hX3JlZ2lzdGVyICopIERNQTFfTkVYVF9ERVNDX1BUUiwKIAkoc3RydWN0IGRtYV9yZWdpc3RlciAqKSBETUEyX05FWFRfREVTQ19QVFIsCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvaGVhZC5TIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2hlYWQuUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTNiMzYxZC4uMDAwMDAwMAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvaGVhZC5TCisrKyAvZGV2L251bGwKQEAgLTEsMTU4ICswLDAgQEAKLS8qCi0gKiBGaWxlOiAgICAgICAgIGFyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9oZWFkLlMKLSAqIEJhc2VkIG9uOiAgICAgYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2hlYWQuUwotICogQXV0aG9yOiAgICAgICBKZWZmIERpb25uZSA8amVmZkB1Y2xpbnV4Lm9yZz4gQ09QWVJJR0hUIDE5OTggRC4gSmVmZiBEaW9ubmUKLSAqCi0gKiBDcmVhdGVkOiAgICAgIDE5OTgKLSAqIERlc2NyaXB0aW9uOiAgU3RhcnR1cCBjb2RlIGZvciBCbGFja2ZpbiBCRjU0OAotICoKLSAqIE1vZGlmaWVkOgotICogICAgICAgICAgICAgICBDb3B5cmlnaHQgMjAwNC0yMDA3IEFuYWxvZyBEZXZpY2VzIEluYy4KLSAqCi0gKiBCdWdzOiAgICAgICAgIEVudGVyIGJ1Z3MgYXQgaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnLwotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIHRoZSBmaWxlIENPUFlJTkcsIG9yIHdyaXRlCi0gKiB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICogNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxhc20vYmxhY2tmaW4uaD4KLSNpZmRlZiBDT05GSUdfQkZJTl9LRVJORUxfQ0xPQ0sKLSNpbmNsdWRlIDxhc20vY2xvY2tzLmg+Ci0jaW5jbHVkZSA8bWFjaC9tZW1faW5pdC5oPgotI2VuZGlmCi0KLS5zZWN0aW9uIC5sMS50ZXh0Ci0jaWZkZWYgQ09ORklHX0JGSU5fS0VSTkVMX0NMT0NLCi1FTlRSWShfc3RhcnRfZG1hX2NvZGUpCi0KLQkvKiBFbmFibGUgUEhZIENMSyBidWZmZXIgb3V0cHV0ICovCi0JcDAuaCA9IGhpKFZSX0NUTCk7Ci0JcDAubCA9IGxvKFZSX0NUTCk7Ci0JcjAubCA9IHdbcDBdOwotCWJpdHNldChyMCwgMTQpOwotCXdbcDBdID0gcjAubDsKLQlzc3luYzsKLQotCXAwLmggPSBoaShTSUNfSVdSMCk7Ci0JcDAubCA9IGxvKFNJQ19JV1IwKTsKLQlyMC5sID0gMHgxOwotCXIwLmggPSAweDA7Ci0JW3AwXSA9IHIwOwotCVNTWU5DOwotCi0JLyoKLQkgKiAgU2V0IFBMTF9DVEwKLQkgKiAgIC0gWzE0OjA5XSA9IE1TRUxbNTowXSA6IENMS0lOIC8gVkNPIG11bHRpcGxpY2F0aW9uIGZhY3RvcnMKLQkgKiAgIC0gWzhdICAgICA9IEJZUEFTUyAgICA6IEJZUEFTUyB0aGUgUExMLCBydW4gQ0xLSU4gaW50byBDQ0xLL1NDTEsKLQkgKiAgIC0gWzddICAgICA9IG91dHB1dCBkZWxheSAoYWRkIDIwMHBzIG9mIGRlbGF5IHRvIG1lbSBzaWduYWxzKQotCSAqICAgLSBbNl0gICAgID0gaW5wdXQgZGVsYXkgKGFkZCAyMDBwcyBvZiBpbnB1dCBkZWxheSB0byBtZW0gc2lnbmFscykKLQkgKiAgIC0gWzVdICAgICA9IFBEV04gICAgICA6IDE9QWxsIENsb2NrcyBvZmYKLQkgKiAgIC0gWzNdICAgICA9IFNUT1BDSyAgICA6IDE9Q29yZSBDbG9jayBvZmYKLQkgKiAgIC0gWzFdICAgICA9IFBMTF9PRkYgICA6IDE9RGlzYWJsZSBQb3dlciB0byBQTEwKLQkgKiAgIC0gWzBdICAgICA9IERGICAgICAgICA6IDE9UGFzcyBDTEtJTi8yIHRvIFBMTCAvIDA9UGFzcyBDTEtJTiB0byBQTEwKLQkgKiAgIGFsbCBvdGhlciBiaXRzIHNldCB0byB6ZXJvCi0JICovCi0KLQlwMC5oID0gaGkoUExMX0xPQ0tDTlQpOwotCXAwLmwgPSBsbyhQTExfTE9DS0NOVCk7Ci0JcjAgPSAweDMwMChaKTsKLQl3W3AwXSA9IHIwLmw7Ci0Jc3N5bmM7Ci0KLQkvKiBlbmFibGUgc2VsZiByZWZyZXNoIHZpYSBTUlJFUSAqLwotCVAyLkggPSBoaShFQklVX1JTVENUTCk7Ci0JUDIuTCA9IGxvKEVCSVVfUlNUQ1RMKTsKLQlSMCA9IFtQMl07Ci0JQklUU0VUIChSMCwgMyk7Ci0JW1AyXSA9IFIwOwotCVNTWU5DOwotCi0JLyogd2FpdCBmb3IgU1JBQ0sgYml0IHRvIGJlIHNldCAqLwotLkxTUlJfTU9ERToKLQlSMCA9IFtQMl07Ci0JQ0MgPSBCSVRUU1QoUjAsIDQpOwotCWlmICFDQyBKVU1QIC5MU1JSX01PREU7Ci0KLQlyMCA9IENPTkZJR19WQ09fTVVMVCAmIDYzOyAgICAgICAvKiBMb2FkIHRoZSBWQ08gbXVsdGlwbGllciAgICAgICAgICovCi0JcjAgPSByMCA8PCA5OyAgICAgICAgICAgICAgICAgICAgLyogU2hpZnQgaXQgb3ZlciwgICAgICAgICAgICAgICAgICAqLwotCXIxID0gQ0xLSU5fSEFMRjsgICAgICAgICAgICAgICAgIC8qIERvIHdlIG5lZWQgdG8gZGl2aWRlIENMS0lOIGJ5IDI/Ki8KLQlyMCA9IHIxIHwgcjA7Ci0JcjEgPSBQTExfQllQQVNTOyAgICAgICAgICAgICAgICAgLyogQnlwYXNzIHRoZSBQTEw/ICAgICAgICAgICAgICAgICAqLwotCXIxID0gcjEgPDwgODsgICAgICAgICAgICAgICAgICAgIC8qIFNoaWZ0IGl0IG92ZXIgICAgICAgICAgICAgICAgICAgKi8KLQlyMCA9IHIxIHwgcjA7ICAgICAgICAgICAgICAgICAgICAvKiBhZGQgdGhlbSBhbGwgdG9nZXRoZXIgICAgICAgICAgICovCi0jaWZkZWYgQU5PTUFMWV8wNTAwMDI2NQotCUJJVFNFVChyMCwgMTUpOyAgICAgICAgICAgICAgICAgIC8qIEFkZCAyNTAgbVYgb2YgaHlzdGVyZXNpcyB0byBTUE9SVCBpbnB1dCBwaW5zICovCi0jZW5kaWYKLQotCXAwLmggPSBoaShQTExfQ1RMKTsKLQlwMC5sID0gbG8oUExMX0NUTCk7ICAgICAgICAgICAgICAvKiBMb2FkIHRoZSBhZGRyZXNzICAgICAgICAgICAgICAgICovCi0JY2xpIHIyOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGlzYWJsZSBpbnRlcnJ1cHRzICAgICAgICAgICAgICAqLwotCXNzeW5jOwotCXdbcDBdID0gcjAubDsgICAgICAgICAgICAgICAgICAgIC8qIFNldCB0aGUgdmFsdWUgICAgICAgICAgICAgICAgICAgKi8KLQlpZGxlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBXYWl0IGZvciB0aGUgUExMIHRvIHN0YWJsaXplICAgICovCi0Jc3RpIHIyOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRW5hYmxlIGludGVycnVwdHMgICAgICAgICAgICAgICAqLwotCi0uTGNoZWNrX2FnYWluOgotCXAwLmggPSBoaShQTExfU1RBVCk7Ci0JcDAubCA9IGxvKFBMTF9TVEFUKTsKLQlSMCA9IFdbUDBdKFopOwotCUNDID0gQklUVFNUKFIwLDUpOwotCWlmICEgQ0MganVtcCAuTGNoZWNrX2FnYWluOwotCi0JLyogQ29uZmlndXJlIFNDTEsgJiBDQ0xLIERpdmlkZXJzICovCi0JcjAgPSAoQ09ORklHX0NDTEtfQUNUX0RJViB8IENPTkZJR19TQ0xLX0RJVik7Ci0JcDAuaCA9IGhpKFBMTF9ESVYpOwotCXAwLmwgPSBsbyhQTExfRElWKTsKLQl3W3AwXSA9IHIwLmw7Ci0Jc3N5bmM7Ci0KLQkvKiBkaXNhYmxlIHNlbGYgcmVmcmVzaCBieSBjbGVhcmluZyBTUlJFUSAqLwotCVAyLkggPSBoaShFQklVX1JTVENUTCk7Ci0JUDIuTCA9IGxvKEVCSVVfUlNUQ1RMKTsKLQlSMCA9IFtQMl07Ci0JQ0MgPSBCSVRUU1QoUjAsIDApOwotCWlmIENDIGp1bXAgLkxza2lwZGRycnN0OwotCUJJVFNFVCAoUjAsIDApOwotLkxza2lwZGRycnN0OgotCUJJVENMUiAoUjAsIDMpOwotCVtQMl0gPSBSMDsKLQlTU1lOQzsKLQotCXAwLmwgPSBsbyhFQklVX0REUkNUTDApOwotCXAwLmggPSBoaShFQklVX0REUkNUTDApOwotCXIwLmwgPSBsbyhtZW1fRERSQ1RMMCk7Ci0JcjAuaCA9IGhpKG1lbV9ERFJDVEwwKTsKLQlbcDBdID0gcjA7Ci0Jc3N5bmM7Ci0KLQlwMC5sID0gbG8oRUJJVV9ERFJDVEwxKTsKLQlwMC5oID0gaGkoRUJJVV9ERFJDVEwxKTsKLQlyMC5sID0gbG8obWVtX0REUkNUTDEpOwotCXIwLmggPSBoaShtZW1fRERSQ1RMMSk7Ci0JW3AwXSA9IHIwOwotCXNzeW5jOwotCi0JcDAubCA9IGxvKEVCSVVfRERSQ1RMMik7Ci0JcDAuaCA9IGhpKEVCSVVfRERSQ1RMMik7Ci0JcjAubCA9IGxvKG1lbV9ERFJDVEwyKTsKLQlyMC5oID0gaGkobWVtX0REUkNUTDIpOwotCVtwMF0gPSByMDsKLQlzc3luYzsKLQotCVJUUzsKLUVORFBST0MoX3N0YXJ0X2RtYV9jb2RlKQotI2VuZGlmIC8qIENPTkZJR19CRklOX0tFUk5FTF9DTE9DSyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2luY2x1ZGUvbWFjaC9hbm9tYWx5LmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvaW5jbHVkZS9tYWNoL2Fub21hbHkuaAppbmRleCA4MTZiMDkyLi4zYjU0MzA5IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvaW5jbHVkZS9tYWNoL2Fub21hbHkuaAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvaW5jbHVkZS9tYWNoL2Fub21hbHkuaApAQCAtMTU3LDYgKzE1Nyw4IEBACiAjZGVmaW5lIEFOT01BTFlfMDUwMDA0MjkgKF9fU0lMSUNPTl9SRVZJU0lPTl9fIDwgMikKIC8qIFNvZnR3YXJlIFN5c3RlbSBSZXNldCBDb3JydXB0cyBQTExfTE9DS0NOVCBSZWdpc3RlciAqLwogI2RlZmluZSBBTk9NQUxZXzA1MDAwNDMwIChfX1NJTElDT05fUkVWSVNJT05fXyA+PSAyKQorLyogSUZMVVNIIEluc3RydWN0aW9uIGF0IEVuZCBvZiBIYXJkd2FyZSBMb29wIENhdXNlcyBJbmZpbml0ZSBTdGFsbCAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwNDQzICgxKQogCiAvKiBBbm9tYWxpZXMgdGhhdCBkb24ndCBleGlzdCBvbiB0aGlzIHByb2MgKi8KICNkZWZpbmUgQU5PTUFMWV8wNTAwMDEyNSAoMCkKQEAgLTE3Myw1ICsxNzUsOCBAQAogI2RlZmluZSBBTk9NQUxZXzA1MDAwMzExICgwKQogI2RlZmluZSBBTk9NQUxZXzA1MDAwMzIzICgwKQogI2RlZmluZSBBTk9NQUxZXzA1MDAwMzYzICgwKQorI2RlZmluZSBBTk9NQUxZXzA1MDAwNDEyICgwKQorI2RlZmluZSBBTk9NQUxZXzA1MDAwNDMyICgwKQorI2RlZmluZSBBTk9NQUxZXzA1MDAwNDM1ICgwKQogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9pbmNsdWRlL21hY2gvYmY1NDguaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9pbmNsdWRlL21hY2gvYmY1NDguaAppbmRleCA0OWY5YjQwLi5mMGU1Njk5IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvaW5jbHVkZS9tYWNoL2JmNTQ4LmgKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2luY2x1ZGUvbWFjaC9iZjU0OC5oCkBAIC0xMjIsNyArMTIyLDcgQEAKICNlbmRpZgogCiAjaWZuZGVmIENQVQotI2Vycm9yIFVua25vd24gQ1BVIHR5cGUgLSBUaGlzIGtlcm5lbCBkb2Vzbid0IHNlZW0gdG8gYmUgY29uZmlndXJlZCBwcm9wZXJseQorI2Vycm9yICJVbmtub3duIENQVSB0eXBlIC0gVGhpcyBrZXJuZWwgZG9lc24ndCBzZWVtIHRvIGJlIGNvbmZpZ3VyZWQgcHJvcGVybHkiCiAjZW5kaWYKIAogI2VuZGlmCS8qIF9fTUFDSF9CRjQ4X0hfXyAgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9pbmNsdWRlL21hY2gvYmZpbl9zaXIuaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9pbmNsdWRlL21hY2gvYmZpbl9zaXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQxZjljZi4uMDAwMDAwMAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvaW5jbHVkZS9tYWNoL2JmaW5fc2lyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNjYgKzAsMCBAQAotLyoKLSAqIEJsYWNrZmluIEluZnJhLXJlZCBEcml2ZXIKLSAqCi0gKiBDb3B5cmlnaHQgMjAwNi0yMDA4IEFuYWxvZyBEZXZpY2VzIEluYy4KLSAqCi0gKiBFbnRlciBidWdzIGF0IGh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZy8KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCi0gKgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9zZXJpYWwuaD4KLSNpbmNsdWRlIDxhc20vZG1hLmg+Ci0jaW5jbHVkZSA8YXNtL3BvcnRtdXguaD4KLQotI2RlZmluZSBTSVJfVUFSVF9HRVRfQ0hBUihwb3J0KSAgIGJmaW5fcmVhZDE2KChwb3J0KS0+bWVtYmFzZSArIE9GRlNFVF9SQlIpCi0jZGVmaW5lIFNJUl9VQVJUX0dFVF9ETEwocG9ydCkgICAgYmZpbl9yZWFkMTYoKHBvcnQpLT5tZW1iYXNlICsgT0ZGU0VUX0RMTCkKLSNkZWZpbmUgU0lSX1VBUlRfR0VUX0lFUihwb3J0KSAgICBiZmluX3JlYWQxNigocG9ydCktPm1lbWJhc2UgKyBPRkZTRVRfSUVSX1NFVCkKLSNkZWZpbmUgU0lSX1VBUlRfR0VUX0RMSChwb3J0KSAgICBiZmluX3JlYWQxNigocG9ydCktPm1lbWJhc2UgKyBPRkZTRVRfRExIKQotI2RlZmluZSBTSVJfVUFSVF9HRVRfTENSKHBvcnQpICAgIGJmaW5fcmVhZDE2KChwb3J0KS0+bWVtYmFzZSArIE9GRlNFVF9MQ1IpCi0jZGVmaW5lIFNJUl9VQVJUX0dFVF9MU1IocG9ydCkgICAgYmZpbl9yZWFkMTYoKHBvcnQpLT5tZW1iYXNlICsgT0ZGU0VUX0xTUikKLSNkZWZpbmUgU0lSX1VBUlRfR0VUX0dDVEwocG9ydCkgICBiZmluX3JlYWQxNigocG9ydCktPm1lbWJhc2UgKyBPRkZTRVRfR0NUTCkKLQotI2RlZmluZSBTSVJfVUFSVF9QVVRfQ0hBUihwb3J0LCB2KSBiZmluX3dyaXRlMTYoKChwb3J0KS0+bWVtYmFzZSArIE9GRlNFVF9USFIpLCB2KQotI2RlZmluZSBTSVJfVUFSVF9QVVRfRExMKHBvcnQsIHYpICBiZmluX3dyaXRlMTYoKChwb3J0KS0+bWVtYmFzZSArIE9GRlNFVF9ETEwpLCB2KQotI2RlZmluZSBTSVJfVUFSVF9TRVRfSUVSKHBvcnQsIHYpICBiZmluX3dyaXRlMTYoKChwb3J0KS0+bWVtYmFzZSArIE9GRlNFVF9JRVJfU0VUKSwgdikKLSNkZWZpbmUgU0lSX1VBUlRfQ0xFQVJfSUVSKHBvcnQsIHYpICBiZmluX3dyaXRlMTYoKChwb3J0KS0+bWVtYmFzZSArIE9GRlNFVF9JRVJfQ0xFQVIpLCB2KQotI2RlZmluZSBTSVJfVUFSVF9QVVRfRExIKHBvcnQsIHYpICBiZmluX3dyaXRlMTYoKChwb3J0KS0+bWVtYmFzZSArIE9GRlNFVF9ETEgpLCB2KQotI2RlZmluZSBTSVJfVUFSVF9QVVRfTFNSKHBvcnQsIHYpICBiZmluX3dyaXRlMTYoKChwb3J0KS0+bWVtYmFzZSArIE9GRlNFVF9MU1IpLCB2KQotI2RlZmluZSBTSVJfVUFSVF9QVVRfTENSKHBvcnQsIHYpICBiZmluX3dyaXRlMTYoKChwb3J0KS0+bWVtYmFzZSArIE9GRlNFVF9MQ1IpLCB2KQotI2RlZmluZSBTSVJfVUFSVF9DTEVBUl9MU1IocG9ydCkgIGJmaW5fd3JpdGUxNigoKHBvcnQpLT5tZW1iYXNlICsgT0ZGU0VUX0xTUiksIC0xKQotI2RlZmluZSBTSVJfVUFSVF9QVVRfR0NUTChwb3J0LCB2KSBiZmluX3dyaXRlMTYoKChwb3J0KS0+bWVtYmFzZSArIE9GRlNFVF9HQ1RMKSwgdikKLQotI2lmZGVmIENPTkZJR19TSVJfQkZJTl9ETUEKLXN0cnVjdCBkbWFfcnhfYnVmIHsKLQljaGFyICpidWY7Ci0JaW50IGhlYWQ7Ci0JaW50IHRhaWw7Ci0JfTsKLSNlbmRpZiAvKiBDT05GSUdfU0lSX0JGSU5fRE1BICovCi0KLXN0cnVjdCBiZmluX3Npcl9wb3J0IHsKLQl1bnNpZ25lZCBjaGFyIF9faW9tZW0gICAqbWVtYmFzZTsKLQl1bnNpZ25lZCBpbnQgICAgICAgICAgICBpcnE7Ci0JdW5zaWduZWQgaW50ICAgICAgICAgICAgbHNyOwotCXVuc2lnbmVkIGxvbmcgICAgICAgICAgIGNsazsKLQlzdHJ1Y3QgbmV0X2RldmljZSAgICAgICAqZGV2OwotI2lmZGVmIENPTkZJR19TSVJfQkZJTl9ETUEKLQlpbnQgICAgICAgICAgICAgICAgICAgICB0eF9kb25lOwotCXN0cnVjdCBkbWFfcnhfYnVmICAgICAgIHJ4X2RtYV9idWY7Ci0Jc3RydWN0IHRpbWVyX2xpc3QgICAgICAgcnhfZG1hX3RpbWVyOwotCWludCAgICAgICAgICAgICAgICAgICAgIHJ4X2RtYV9ucm93czsKLSNlbmRpZiAvKiBDT05GSUdfU0lSX0JGSU5fRE1BICovCi0JdW5zaWduZWQgaW50ICAgICAgICAgICAgdHhfZG1hX2NoYW5uZWw7Ci0JdW5zaWduZWQgaW50ICAgICAgICAgICAgcnhfZG1hX2NoYW5uZWw7Ci19OwotCi1zdHJ1Y3QgYmZpbl9zaXJfcG9ydCBzaXJfcG9ydHNbQkZJTl9VQVJUX05SX1BPUlRTXTsKLQotc3RydWN0IGJmaW5fc2lyX3BvcnRfcmVzIHsKLQl1bnNpZ25lZCBsb25nICAgYmFzZV9hZGRyOwotCWludCAgICAgICAgICAgICBpcnE7Ci0JdW5zaWduZWQgaW50ICAgIHJ4X2RtYV9jaGFubmVsOwotCXVuc2lnbmVkIGludCAgICB0eF9kbWFfY2hhbm5lbDsKLX07Ci0KLXN0cnVjdCBiZmluX3Npcl9wb3J0X3JlcyBiZmluX3Npcl9wb3J0X3Jlc291cmNlW10gPSB7Ci0jaWZkZWYgQ09ORklHX0JGSU5fU0lSMAotCXsKLQkweEZGQzAwNDAwLAotCUlSUV9VQVJUMF9SWCwKLQlDSF9VQVJUMF9SWCwKLQlDSF9VQVJUMF9UWCwKLQl9LAotI2VuZGlmCi0jaWZkZWYgQ09ORklHX0JGSU5fU0lSMQotCXsKLQkweEZGQzAyMDAwLAotCUlSUV9VQVJUMV9SWCwKLQlDSF9VQVJUMV9SWCwKLQlDSF9VQVJUMV9UWCwKLQl9LAotI2VuZGlmCi0jaWZkZWYgQ09ORklHX0JGSU5fU0lSMgotCXsKLQkweEZGQzAyMTAwLAotCUlSUV9VQVJUMl9SWCwKLQlDSF9VQVJUMl9SWCwKLQlDSF9VQVJUMl9UWCwKLQl9LAotI2VuZGlmCi0jaWZkZWYgQ09ORklHX0JGSU5fU0lSMwotCXsKLQkweEZGQzAzMTAwLAotCUlSUV9VQVJUM19SWCwKLQlDSF9VQVJUM19SWCwKLQlDSF9VQVJUM19UWCwKLQl9LAotI2VuZGlmCi19OwotCi1pbnQgbnJfc2lycyA9IEFSUkFZX1NJWkUoYmZpbl9zaXJfcG9ydF9yZXNvdXJjZSk7Ci0KLXN0cnVjdCBiZmluX3Npcl9zZWxmIHsKLQlzdHJ1Y3QgYmZpbl9zaXJfcG9ydCAgICAqc2lyX3BvcnQ7Ci0Jc3BpbmxvY2tfdCAgICAgICAgICAgICAgbG9jazsKLQl1bnNpZ25lZCBpbnQgICAgICAgICAgICBvcGVuOwotCWludCAgICAgICAgICAgICAgICAgICAgIHNwZWVkOwotCWludCAgICAgICAgICAgICAgICAgICAgIG5ld3NwZWVkOwotCi0Jc3RydWN0IHNrX2J1ZmYgICAgICAgICAgKnR4c2tiOwotCXN0cnVjdCBza19idWZmICAgICAgICAgICpyeHNrYjsKLQlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsKLQlzdHJ1Y3QgZGV2aWNlICAgICAgICAgICAqZGV2OwotCXN0cnVjdCBpcmxhcF9jYiAgICAgICAgICppcmxhcDsKLQlzdHJ1Y3QgcW9zX2luZm8gICAgICAgICBxb3M7Ci0KLQlpb2J1ZmZfdCAgICAgICAgICAgICAgICB0eF9idWZmOwotCWlvYnVmZl90ICAgICAgICAgICAgICAgIHJ4X2J1ZmY7Ci0KLQlzdHJ1Y3Qgd29ya19zdHJ1Y3QgICAgICB3b3JrOwotCWludCAgICAgICAgICAgICAgICAgICAgIG10dDsKLX07Ci0KLSNkZWZpbmUgRFJJVkVSX05BTUUgImJmaW5fc2lyIgotCi1zdGF0aWMgaW50IGJmaW5fc2lyX2h3X2luaXQodm9pZCkKLXsKLQlpbnQgcmV0ID0gLUVOT0RFVjsKLSNpZmRlZiBDT05GSUdfQkZJTl9TSVIwCi0JcmV0ID0gcGVyaXBoZXJhbF9yZXF1ZXN0KFBfVUFSVDBfVFgsIERSSVZFUl9OQU1FKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCXJldCA9IHBlcmlwaGVyYWxfcmVxdWVzdChQX1VBUlQwX1JYLCBEUklWRVJfTkFNRSk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLSNlbmRpZgotCi0jaWZkZWYgQ09ORklHX0JGSU5fU0lSMQotCXJldCA9IHBlcmlwaGVyYWxfcmVxdWVzdChQX1VBUlQxX1RYLCBEUklWRVJfTkFNRSk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQlyZXQgPSBwZXJpcGhlcmFsX3JlcXVlc3QoUF9VQVJUMV9SWCwgRFJJVkVSX05BTUUpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0jZW5kaWYKLQotI2lmZGVmIENPTkZJR19CRklOX1NJUjIKLQlyZXQgPSBwZXJpcGhlcmFsX3JlcXVlc3QoUF9VQVJUMl9UWCwgRFJJVkVSX05BTUUpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0JcmV0ID0gcGVyaXBoZXJhbF9yZXF1ZXN0KFBfVUFSVDJfUlgsIERSSVZFUl9OQU1FKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotI2VuZGlmCi0KLSNpZmRlZiBDT05GSUdfQkZJTl9TSVIzCi0JcmV0ID0gcGVyaXBoZXJhbF9yZXF1ZXN0KFBfVUFSVDNfVFgsIERSSVZFUl9OQU1FKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCXJldCA9IHBlcmlwaGVyYWxfcmVxdWVzdChQX1VBUlQzX1JYLCBEUklWRVJfTkFNRSk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLSNlbmRpZgotCXJldHVybiByZXQ7Ci19CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvaW5jbHVkZS9tYWNoL2JsYWNrZmluLmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvaW5jbHVkZS9tYWNoL2JsYWNrZmluLmgKaW5kZXggZDZlZTc0YS4uMGMwZTNlMiAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2luY2x1ZGUvbWFjaC9ibGFja2Zpbi5oCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9pbmNsdWRlL21hY2gvYmxhY2tmaW4uaApAQCAtMTExLDcgKzExMSw3IEBACiAKIC8qIFVBUlQgMCovCiAKLS8qIERNQSBDaGFubm5lbCAqLworLyogRE1BIENoYW5uZWwgKi8KICNkZWZpbmUgYmZpbl9yZWFkX0NIX1VBUlRfUlgoKQkJYmZpbl9yZWFkX0NIX1VBUlQxX1JYKCkKICNkZWZpbmUgYmZpbl93cml0ZV9DSF9VQVJUX1JYKHZhbCkJYmZpbl93cml0ZV9DSF9VQVJUMV9SWCh2YWwpCiAjZGVmaW5lIGJmaW5fcmVhZF9DSF9VQVJUX1RYKCkJCWJmaW5fcmVhZF9DSF9VQVJUMV9UWCgpCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvaW5jbHVkZS9tYWNoL2NkZWZCRjU0eF9iYXNlLmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvaW5jbHVkZS9tYWNoL2NkZWZCRjU0eF9iYXNlLmgKaW5kZXggNTdhYzhjYi4uNmU2MzZjNCAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2luY2x1ZGUvbWFjaC9jZGVmQkY1NHhfYmFzZS5oCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9pbmNsdWRlL21hY2gvY2RlZkJGNTR4X2Jhc2UuaApAQCAtMzQsNyArMzQsNiBAQAogI2luY2x1ZGUgPGFzbS9ibGFja2Zpbi5oPgogCiAjaW5jbHVkZSAiZGVmQkY1NHhfYmFzZS5oIgotI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KIAogLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KIC8qIFNZU1RFTSAmIE1NUiBBRERSRVNTIERFRklOSVRJT05TIENPTU1PTiBUTyBBTEwgQURTUC1CRjU0eCAgICAqLwpAQCAtNDMsNjMgKzQyLDkgQEAKIC8qIFBMTCBSZWdpc3RlcnMgKi8KIAogI2RlZmluZSBiZmluX3JlYWRfUExMX0NUTCgpCQliZmluX3JlYWQxNihQTExfQ1RMKQotLyogV3JpdGluZyB0byBQTExfQ1RMIGluaXRpYXRlcyBhIFBMTCByZWxvY2sgc2VxdWVuY2UuICovCi1zdGF0aWMgX19pbmxpbmVfXyB2b2lkIGJmaW5fd3JpdGVfUExMX0NUTCh1bnNpZ25lZCBpbnQgdmFsKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIGl3cjAsIGl3cjEsIGl3cjI7Ci0KLQlpZiAodmFsID09IGJmaW5fcmVhZF9QTExfQ1RMKCkpCi0JCXJldHVybjsKLQotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQkvKiBFbmFibGUgdGhlIFBMTCBXYWtldXAgYml0IGluIFNJQyBJV1IgKi8KLQlpd3IwID0gYmZpbl9yZWFkMzIoU0lDX0lXUjApOwotCWl3cjEgPSBiZmluX3JlYWQzMihTSUNfSVdSMSk7Ci0JaXdyMiA9IGJmaW5fcmVhZDMyKFNJQ19JV1IyKTsKLQkvKiBPbmx5IGFsbG93IFBQTCBXYWtldXApICovCi0JYmZpbl93cml0ZTMyKFNJQ19JV1IwLCBJV1JfRU5BQkxFKDApKTsKLQliZmluX3dyaXRlMzIoU0lDX0lXUjEsIDApOwotCWJmaW5fd3JpdGUzMihTSUNfSVdSMiwgMCk7Ci0KLQliZmluX3dyaXRlMTYoUExMX0NUTCwgdmFsKTsKLQlTU1lOQygpOwotCWFzbSgiSURMRTsiKTsKLQotCWJmaW5fd3JpdGUzMihTSUNfSVdSMCwgaXdyMCk7Ci0JYmZpbl93cml0ZTMyKFNJQ19JV1IxLCBpd3IxKTsKLQliZmluX3dyaXRlMzIoU0lDX0lXUjIsIGl3cjIpOwotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLX0KICNkZWZpbmUgYmZpbl9yZWFkX1BMTF9ESVYoKQkJYmZpbl9yZWFkMTYoUExMX0RJVikKICNkZWZpbmUgYmZpbl93cml0ZV9QTExfRElWKHZhbCkJCWJmaW5fd3JpdGUxNihQTExfRElWLCB2YWwpCiAjZGVmaW5lIGJmaW5fcmVhZF9WUl9DVEwoKQkJYmZpbl9yZWFkMTYoVlJfQ1RMKQotLyogV3JpdGluZyB0byBWUl9DVEwgaW5pdGlhdGVzIGEgUExMIHJlbG9jayBzZXF1ZW5jZS4gKi8KLXN0YXRpYyBfX2lubGluZV9fIHZvaWQgYmZpbl93cml0ZV9WUl9DVEwodW5zaWduZWQgaW50IHZhbCkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzLCBpd3IwLCBpd3IxLCBpd3IyOwotCi0JaWYgKHZhbCA9PSBiZmluX3JlYWRfVlJfQ1RMKCkpCi0JCXJldHVybjsKLQotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQkvKiBFbmFibGUgdGhlIFBMTCBXYWtldXAgYml0IGluIFNJQyBJV1IgKi8KLQlpd3IwID0gYmZpbl9yZWFkMzIoU0lDX0lXUjApOwotCWl3cjEgPSBiZmluX3JlYWQzMihTSUNfSVdSMSk7Ci0JaXdyMiA9IGJmaW5fcmVhZDMyKFNJQ19JV1IyKTsKLQkvKiBPbmx5IGFsbG93IFBQTCBXYWtldXApICovCi0JYmZpbl93cml0ZTMyKFNJQ19JV1IwLCBJV1JfRU5BQkxFKDApKTsKLQliZmluX3dyaXRlMzIoU0lDX0lXUjEsIDApOwotCWJmaW5fd3JpdGUzMihTSUNfSVdSMiwgMCk7Ci0KLQliZmluX3dyaXRlMTYoVlJfQ1RMLCB2YWwpOwotCVNTWU5DKCk7Ci0JYXNtKCJJRExFOyIpOwotCi0JYmZpbl93cml0ZTMyKFNJQ19JV1IwLCBpd3IwKTsKLQliZmluX3dyaXRlMzIoU0lDX0lXUjEsIGl3cjEpOwotCWJmaW5fd3JpdGUzMihTSUNfSVdSMiwgaXdyMik7Ci0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotfQogI2RlZmluZSBiZmluX3JlYWRfUExMX1NUQVQoKQkJYmZpbl9yZWFkMTYoUExMX1NUQVQpCiAjZGVmaW5lIGJmaW5fd3JpdGVfUExMX1NUQVQodmFsKQliZmluX3dyaXRlMTYoUExMX1NUQVQsIHZhbCkKICNkZWZpbmUgYmZpbl9yZWFkX1BMTF9MT0NLQ05UKCkJCWJmaW5fcmVhZDE2KFBMTF9MT0NLQ05UKQpAQCAtMjc0Niw1ICsyNjkxLDY0IEBACiAjZGVmaW5lIGJmaW5fcmVhZF9QSU5UM19JUlEJCWJmaW5fcmVhZF9QSU5UM19SRVFVRVNUCiAjZGVmaW5lIGJmaW5fd3JpdGVfUElOVDNfSVJRCQliZmluX3dyaXRlX1BJTlQzX1JFUVVFU1QKIAorLyogVGhlc2UgbmVlZCB0byBiZSBsYXN0IGR1ZSB0byB0aGUgY2RlZi9saW51eCBpbnRlci1kZXBlbmRlbmNpZXMgKi8KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisKKy8qIFdyaXRpbmcgdG8gUExMX0NUTCBpbml0aWF0ZXMgYSBQTEwgcmVsb2NrIHNlcXVlbmNlLiAqLworc3RhdGljIF9faW5saW5lX18gdm9pZCBiZmluX3dyaXRlX1BMTF9DVEwodW5zaWduZWQgaW50IHZhbCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzLCBpd3IwLCBpd3IxLCBpd3IyOworCisJaWYgKHZhbCA9PSBiZmluX3JlYWRfUExMX0NUTCgpKQorCQlyZXR1cm47CisKKwlsb2NhbF9pcnFfc2F2ZV9odyhmbGFncyk7CisJLyogRW5hYmxlIHRoZSBQTEwgV2FrZXVwIGJpdCBpbiBTSUMgSVdSICovCisJaXdyMCA9IGJmaW5fcmVhZDMyKFNJQ19JV1IwKTsKKwlpd3IxID0gYmZpbl9yZWFkMzIoU0lDX0lXUjEpOworCWl3cjIgPSBiZmluX3JlYWQzMihTSUNfSVdSMik7CisJLyogT25seSBhbGxvdyBQUEwgV2FrZXVwKSAqLworCWJmaW5fd3JpdGUzMihTSUNfSVdSMCwgSVdSX0VOQUJMRSgwKSk7CisJYmZpbl93cml0ZTMyKFNJQ19JV1IxLCAwKTsKKwliZmluX3dyaXRlMzIoU0lDX0lXUjIsIDApOworCisJYmZpbl93cml0ZTE2KFBMTF9DVEwsIHZhbCk7CisJU1NZTkMoKTsKKwlhc20oIklETEU7Iik7CisKKwliZmluX3dyaXRlMzIoU0lDX0lXUjAsIGl3cjApOworCWJmaW5fd3JpdGUzMihTSUNfSVdSMSwgaXdyMSk7CisJYmZpbl93cml0ZTMyKFNJQ19JV1IyLCBpd3IyKTsKKwlsb2NhbF9pcnFfcmVzdG9yZV9odyhmbGFncyk7Cit9CisKKy8qIFdyaXRpbmcgdG8gVlJfQ1RMIGluaXRpYXRlcyBhIFBMTCByZWxvY2sgc2VxdWVuY2UuICovCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIGJmaW5fd3JpdGVfVlJfQ1RMKHVuc2lnbmVkIGludCB2YWwpCit7CisJdW5zaWduZWQgbG9uZyBmbGFncywgaXdyMCwgaXdyMSwgaXdyMjsKKworCWlmICh2YWwgPT0gYmZpbl9yZWFkX1ZSX0NUTCgpKQorCQlyZXR1cm47CisKKwlsb2NhbF9pcnFfc2F2ZV9odyhmbGFncyk7CisJLyogRW5hYmxlIHRoZSBQTEwgV2FrZXVwIGJpdCBpbiBTSUMgSVdSICovCisJaXdyMCA9IGJmaW5fcmVhZDMyKFNJQ19JV1IwKTsKKwlpd3IxID0gYmZpbl9yZWFkMzIoU0lDX0lXUjEpOworCWl3cjIgPSBiZmluX3JlYWQzMihTSUNfSVdSMik7CisJLyogT25seSBhbGxvdyBQUEwgV2FrZXVwKSAqLworCWJmaW5fd3JpdGUzMihTSUNfSVdSMCwgSVdSX0VOQUJMRSgwKSk7CisJYmZpbl93cml0ZTMyKFNJQ19JV1IxLCAwKTsKKwliZmluX3dyaXRlMzIoU0lDX0lXUjIsIDApOworCisJYmZpbl93cml0ZTE2KFZSX0NUTCwgdmFsKTsKKwlTU1lOQygpOworCWFzbSgiSURMRTsiKTsKKworCWJmaW5fd3JpdGUzMihTSUNfSVdSMCwgaXdyMCk7CisJYmZpbl93cml0ZTMyKFNJQ19JV1IxLCBpd3IxKTsKKwliZmluX3dyaXRlMzIoU0lDX0lXUjIsIGl3cjIpOworCWxvY2FsX2lycV9yZXN0b3JlX2h3KGZsYWdzKTsKK30KKwogI2VuZGlmIC8qIF9DREVGX0JGNTRYX0ggKi8KIApkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2luY2x1ZGUvbWFjaC9kbWEuaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9pbmNsdWRlL21hY2gvZG1hLmgKaW5kZXggMzZhMmVmNy4uYTMwZDI0MiAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2luY2x1ZGUvbWFjaC9kbWEuaAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvaW5jbHVkZS9tYWNoL2RtYS5oCkBAIC0xLDMyICsxLDggQEAKLS8qCi0gKiBmaWxlOiAgICAgICAgIGluY2x1ZGUvYXNtLWJsYWNrZmluL21hY2gtYmY1NDgvZG1hLmgKLSAqIGJhc2VkIG9uOgotICogYXV0aG9yOgorLyogbWFjaC9kbWEuaCAtIGFyY2gtc3BlY2lmaWMgRE1BIGRlZmluZXMKICAqCi0gKiBjcmVhdGVkOgotICogZGVzY3JpcHRpb246Ci0gKglzeXN0ZW0gbW1yIHJlZ2lzdGVyIG1hcAotICogcmV2OgorICogQ29weXJpZ2h0IDIwMDQtMjAwOCBBbmFsb2cgRGV2aWNlcyBJbmMuCiAgKgotICogbW9kaWZpZWQ6Ci0gKgotICoKLSAqIGJ1Z3M6ICAgICAgICAgZW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCi0gKgotICogdGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgZ251IGdlbmVyYWwgcHVibGljIGxpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgZnJlZSBzb2Z0d2FyZSBmb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gKiBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiB0aGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCB3aXRob3V0IGFueSB3YXJyYW50eTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBtZXJjaGFudGFiaWxpdHkgb3IgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuICBzZWUgdGhlCi0gKiBnbnUgZ2VuZXJhbCBwdWJsaWMgbGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIHlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIGdudSBnZW5lcmFsIHB1YmxpYyBsaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIGNvcHlpbmcuCi0gKiBpZiBub3QsIHdyaXRlIHRvIHRoZSBmcmVlIHNvZnR3YXJlIGZvdW5kYXRpb24sCi0gKiA1OSB0ZW1wbGUgcGxhY2UgLSBzdWl0ZSAzMzAsIGJvc3RvbiwgbWEgMDIxMTEtMTMwNywgdXNhLgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgogICovCiAKICNpZm5kZWYgX01BQ0hfRE1BX0hfCkBAIC03MSw2ICs0Nyw2IEBACiAjZGVmaW5lIENIX01FTV9TVFJFQU0zX0RFU1QJMzAKICNkZWZpbmUgQ0hfTUVNX1NUUkVBTTNfU1JDCTMxCiAKLSNkZWZpbmUgTUFYX0JMQUNLRklOX0RNQV9DSEFOTkVMIDMyCisjZGVmaW5lIE1BWF9ETUFfQ0hBTk5FTFMgMzIKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvaW5jbHVkZS9tYWNoL2lycS5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2luY2x1ZGUvbWFjaC9pcnEuaAppbmRleCBhZDM4MGQxLi42MDI5OWE3IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvaW5jbHVkZS9tYWNoL2lycS5oCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9pbmNsdWRlL21hY2gvaXJxLmgKQEAgLTE1OCw3ICsxNTgsNyBAQAogI2RlZmluZSBJUlFfUElOVDIJCUJGSU5fSVJRKDk0KQkvKiBQSU5UMiBJbnRlcnJ1cHQgKi8KICNkZWZpbmUgSVJRX1BJTlQzCQlCRklOX0lSUSg5NSkJLyogUElOVDMgSW50ZXJydXB0ICovCiAKLSNkZWZpbmUgU1lTX0lSUVMgICAgICAgIAlJUlFfUElOVDMKKyNkZWZpbmUgU1lTX0lSUVMJCUlSUV9QSU5UMwogCiAjZGVmaW5lIEJGSU5fUEFfSVJRKHgpCQkoKHgpICsgU1lTX0lSUVMgKyAxKQogI2RlZmluZSBJUlFfUEEwCQkJQkZJTl9QQV9JUlEoMCkKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9pbmNsdWRlL21hY2gvbWVtX2luaXQuaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9pbmNsdWRlL21hY2gvbWVtX2luaXQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWIwYjg2My4uMDAwMDAwMAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvaW5jbHVkZS9tYWNoL21lbV9pbml0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNTUgKzAsMCBAQAotLyoKLSAqIEZpbGU6ICAgICAgICAgaW5jbHVkZS9hc20tYmxhY2tmaW4vbWFjaC1iZjU0OC9tZW1faW5pdC5oCi0gKiBCYXNlZCBvbjoKLSAqIEF1dGhvcjoKLSAqCi0gKiBDcmVhdGVkOgotICogRGVzY3JpcHRpb246Ci0gKgotICogUmV2OgotICoKLSAqIE1vZGlmaWVkOgotICogICAgICAgICAgICAgICBDb3B5cmlnaHQgMjAwNC0yMDA2IEFuYWxvZyBEZXZpY2VzIEluYy4KLSAqCi0gKiBCdWdzOiAgICAgICAgIEVudGVyIGJ1Z3MgYXQgaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnLwotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICogYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLgotICogSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLSAqLwotI2RlZmluZSBNSU5fRERSX1NDTEsoeCkJKHgqKENPTkZJR19TQ0xLX0haLzEwMDAvMTAwMCkvMTAwMCArIDEpCi0jZGVmaW5lIE1BWF9ERFJfU0NMSyh4KQkoeCooQ09ORklHX1NDTEtfSFovMTAwMC8xMDAwKS8xMDAwKQotI2RlZmluZSBERFJfQ0xLX0haKHgpCSgxMDAwKjEwMDAqMTAwMC94KQotCi0jaWYgKENPTkZJR19NRU1fTVQ0NlYzMk0xNl82VCkKLSNkZWZpbmUgRERSX1NJWkUJREVWU1pfNTEyCi0jZGVmaW5lIEREUl9XSURUSAlERVZXRF8xNgotI2RlZmluZSBERFJfTUFYX3RDSwkxMwotCi0jZGVmaW5lIEREUl90UkMJCUREUl9UUkMoTUlOX0REUl9TQ0xLKDYwKSkKLSNkZWZpbmUgRERSX3RSQVMJRERSX1RSQVMoTUlOX0REUl9TQ0xLKDQyKSkKLSNkZWZpbmUgRERSX3RSUAkJRERSX1RSUChNSU5fRERSX1NDTEsoMTUpKQotI2RlZmluZSBERFJfdFJGQwlERFJfVFJGQyhNSU5fRERSX1NDTEsoNzIpKQotI2RlZmluZSBERFJfdFJFRkkJRERSX1RSRUZJKE1BWF9ERFJfU0NMSyg3ODAwKSkKLQotI2RlZmluZSBERFJfdFJDRAlERFJfVFJDRChNSU5fRERSX1NDTEsoMTUpKQotI2RlZmluZSBERFJfdFdUUglERFJfVFdUUigxKQotI2RlZmluZSBERFJfdE1SRAlERFJfVE1SRChNSU5fRERSX1NDTEsoMTIpKQotI2RlZmluZSBERFJfdFdSCQlERFJfVFdSKE1JTl9ERFJfU0NMSygxNSkpCi0jZW5kaWYKLQotI2lmIChDT05GSUdfTUVNX01UNDZWMzJNMTZfNUIpCi0jZGVmaW5lIEREUl9TSVpFCURFVlNaXzUxMgotI2RlZmluZSBERFJfV0lEVEgJREVWV0RfMTYKLSNkZWZpbmUgRERSX01BWF90Q0sJMTMKLQotI2RlZmluZSBERFJfdFJDCQlERFJfVFJDKE1JTl9ERFJfU0NMSyg1NSkpCi0jZGVmaW5lIEREUl90UkFTCUREUl9UUkFTKE1JTl9ERFJfU0NMSyg0MCkpCi0jZGVmaW5lIEREUl90UlAJCUREUl9UUlAoTUlOX0REUl9TQ0xLKDE1KSkKLSNkZWZpbmUgRERSX3RSRkMJRERSX1RSRkMoTUlOX0REUl9TQ0xLKDcwKSkKLSNkZWZpbmUgRERSX3RSRUZJCUREUl9UUkVGSShNQVhfRERSX1NDTEsoNzgwMCkpCi0KLSNkZWZpbmUgRERSX3RSQ0QJRERSX1RSQ0QoTUlOX0REUl9TQ0xLKDE1KSkKLSNkZWZpbmUgRERSX3RXVFIJRERSX1RXVFIoMikKLSNkZWZpbmUgRERSX3RNUkQJRERSX1RNUkQoTUlOX0REUl9TQ0xLKDEwKSkKLSNkZWZpbmUgRERSX3RXUgkJRERSX1RXUihNSU5fRERSX1NDTEsoMTUpKQotI2VuZGlmCi0KLSNpZiAoQ09ORklHX01FTV9HRU5FUklDX0JPQVJEKQotI2RlZmluZSBERFJfU0laRQlERVZTWl81MTIKLSNkZWZpbmUgRERSX1dJRFRICURFVldEXzE2Ci0jZGVmaW5lIEREUl9NQVhfdENLCTEzCi0KLSNkZWZpbmUgRERSX3RSQ0QJRERSX1RSQ0QoMykKLSNkZWZpbmUgRERSX3RXVFIJRERSX1RXVFIoMikKLSNkZWZpbmUgRERSX3RXUgkJRERSX1RXUigyKQotI2RlZmluZSBERFJfdE1SRAlERFJfVE1SRCgyKQotI2RlZmluZSBERFJfdFJQCQlERFJfVFJQKDMpCi0jZGVmaW5lIEREUl90UkFTCUREUl9UUkFTKDcpCi0jZGVmaW5lIEREUl90UkMJCUREUl9UUkMoMTApCi0jZGVmaW5lIEREUl90UkZDCUREUl9UUkZDKDEyKQotI2RlZmluZSBERFJfdFJFRkkJRERSX1RSRUZJKDEyODgpCi0jZW5kaWYKLQotI2lmIChDT05GSUdfU0NMS19IWiA8IEREUl9DTEtfSFooRERSX01BWF90Q0spKQotIyBlcnJvciAiQ09ORklHX1NDTEtfSFogaXMgdG9vIHNtYWxsICg8RERSX0NMS19IWihERFJfTUFYX3RDSykgSHopLiIKLSNlbGlmKENPTkZJR19TQ0xLX0haIDw9IDEzMzMzMzMzMykKLSMgZGVmaW5lCUREUl9DTAkJQ0xfMgotI2Vsc2UKLSMgZXJyb3IgIkNPTkZJR19TQ0xLX0haIGlzIHRvbyBsYXJnZSAoPjEzMzMzMzMzMyBIeikuIgotI2VuZGlmCi0KLQotI2RlZmluZSBtZW1fRERSQ1RMMAkoRERSX3RSUCB8IEREUl90UkFTIHwgRERSX3RSQyB8IEREUl90UkZDIHwgRERSX3RSRUZJKQotI2RlZmluZSBtZW1fRERSQ1RMMQkoRERSX0RBVFdJRFRIIHwgRVhUQkFOS18xIHwgRERSX1NJWkUgfCBERFJfV0lEVEggfCBERFJfdFdUUiBcCi0JCQl8IEREUl90TVJEIHwgRERSX3RXUiB8IEREUl90UkNEKQotI2RlZmluZSBtZW1fRERSQ1RMMglERFJfQ0wKLQotCi0jaWYgZGVmaW5lZCBDT05GSUdfQ0xLSU5fSEFMRgotI2RlZmluZSBDTEtJTl9IQUxGICAgICAgIDEKLSNlbHNlCi0jZGVmaW5lIENMS0lOX0hBTEYgICAgICAgMAotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIENPTkZJR19QTExfQllQQVNTCi0jZGVmaW5lIFBMTF9CWVBBU1MgICAgICAxCi0jZWxzZQotI2RlZmluZSBQTExfQllQQVNTICAgICAgIDAKLSNlbmRpZgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqQ3VycmVudGx5IE5vdCBCZWluZyBVc2VkICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVExfV0FUICAoKENPTkZJR19GTEFTSF9TUEVFRF9CV0FUICogNCkgLyAoNDAwMDAwMDAwMCAvIENPTkZJR19TQ0xLX0haKSkgKyAxCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMX1JBVCAgKChDT05GSUdfRkxBU0hfU1BFRURfQlJBVCAqIDQpIC8gKDQwMDAwMDAwMDAgLyBDT05GSUdfU0NMS19IWikpICsgMQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTF9IVCAgICgoQ09ORklHX0ZMQVNIX1NQRUVEX0JIVCAgKiA0KSAvICg0MDAwMDAwMDAwIC8gQ09ORklHX1NDTEtfSFopKQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTF9TVCAgICgoQ09ORklHX0ZMQVNIX1NQRUVEX0JTVCAgKiA0KSAvICg0MDAwMDAwMDAwIC8gQ09ORklHX1NDTEtfSFopKSArIDEKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVExfVFQgICAoKENPTkZJR19GTEFTSF9TUEVFRF9CVFQgICogNCkgLyAoNDAwMDAwMDAwMCAvIENPTkZJR19TQ0xLX0haKSkgKyAxCi0KLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfVFQgPiAzKQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfVFQgICBCMFRUXzQKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9UVCA9PSAzKQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfVFQgICBCMFRUXzMKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9UVCA9PSAyKQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfVFQgICBCMFRUXzIKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9UVCA8IDIpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9UVCAgIEIwVFRfMQotI2VuZGlmCi0KLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfU1QgPiAzKQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfU1QgICBCMFNUXzQKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9TVCA9PSAzKQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfU1QgICBCMFNUXzMKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9TVCA9PSAyKQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfU1QgICBCMFNUXzIKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9TVCA8IDIpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9TVCAgIEIwU1RfMQotI2VuZGlmCi0KLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfSFQgPiAyKQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfSFQgICBCMEhUXzMKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9IVCA9PSAyKQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfSFQgICBCMEhUXzIKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9IVCA9PSAxKQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfSFQgICBCMEhUXzEKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9IVCA9PSAwICYmIENPTkZJR19GTEFTSF9TUEVFRF9CSFQgPT0gMCkKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX0hUICAgQjBIVF8wCi0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfSFQgPT0gMCAmJiBDT05GSUdfRkxBU0hfU1BFRURfQkhUICE9IDApCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9IVCAgIEIwSFRfMQotI2VuZGlmCi0KLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfV0FUID4gMTQpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9XQVQgIEIwV0FUXzE1Ci0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfV0FUID09IDE0KQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfV0FUICBCMFdBVF8xNAotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1dBVCA9PSAxMykKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1dBVCAgQjBXQVRfMTMKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9XQVQgPT0gMTIpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9XQVQgIEIwV0FUXzEyCi0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfV0FUID09IDExKQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfV0FUICBCMFdBVF8xMQotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1dBVCA9PSAxMCkKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1dBVCAgQjBXQVRfMTAKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9XQVQgPT0gOSkKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1dBVCAgQjBXQVRfOQotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1dBVCA9PSA4KQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfV0FUICBCMFdBVF84Ci0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfV0FUID09IDcpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9XQVQgIEIwV0FUXzcKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9XQVQgPT0gNikKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1dBVCAgQjBXQVRfNgotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1dBVCA9PSA1KQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfV0FUICBCMFdBVF81Ci0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfV0FUID09IDQpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9XQVQgIEIwV0FUXzQKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9XQVQgPT0gMykKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1dBVCAgQjBXQVRfMwotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1dBVCA9PSAyKQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfV0FUICBCMFdBVF8yCi0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfV0FUID09IDEpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9XQVQgIEIwV0FUXzEKLSNlbmRpZgotCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1JBVCA+IDE0KQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfUkFUICBCMFJBVF8xNQotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1JBVCA9PSAxNCkKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1JBVCAgQjBSQVRfMTQKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9SQVQgPT0gMTMpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9SQVQgIEIwUkFUXzEzCi0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfUkFUID09IDEyKQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfUkFUICBCMFJBVF8xMgotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1JBVCA9PSAxMSkKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1JBVCAgQjBSQVRfMTEKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9SQVQgPT0gMTApCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9SQVQgIEIwUkFUXzEwCi0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfUkFUID09IDkpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9SQVQgIEIwUkFUXzkKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9SQVQgPT0gOCkKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1JBVCAgQjBSQVRfOAotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1JBVCA9PSA3KQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfUkFUICBCMFJBVF83Ci0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfUkFUID09IDYpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9SQVQgIEIwUkFUXzYKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9SQVQgPT0gNSkKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1JBVCAgQjBSQVRfNQotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1JBVCA9PSA0KQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfUkFUICBCMFJBVF80Ci0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfUkFUID09IDMpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9SQVQgIEIwUkFUXzMKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9SQVQgPT0gMikKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1JBVCAgQjBSQVRfMgotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1JBVCA9PSAxKQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfUkFUICBCMFJBVF8xCi0jZW5kaWYKLQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDAgIFwKLQkoZmxhc2hfRUJJVV9BTUJDVEwwX1dBVCB8IGZsYXNoX0VCSVVfQU1CQ1RMMF9SQVQgfCBmbGFzaF9FQklVX0FNQkNUTDBfSFQgfCBcCi0JIGZsYXNoX0VCSVVfQU1CQ1RMMF9TVCB8IGZsYXNoX0VCSVVfQU1CQ1RMMF9UVCB8IENPTkZJR19GTEFTSF9TUEVFRF9SRFlFTikKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9pbmNsdWRlL21hY2gvbWVtX21hcC5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2luY2x1ZGUvbWFjaC9tZW1fbWFwLmgKaW5kZXggYTIyMjg0Mi4uNzBiOWMxMSAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2luY2x1ZGUvbWFjaC9tZW1fbWFwLmgKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2luY2x1ZGUvbWFjaC9tZW1fbWFwLmgKQEAgLTEwOCw0ICsxMDgsMTAgQEAKICNkZWZpbmUgTDFfU0NSQVRDSF9TVEFSVAkweEZGQjAwMDAwCiAjZGVmaW5lIEwxX1NDUkFUQ0hfTEVOR1RICTB4MTAwMAogCisjZGVmaW5lIEdFVF9QREFfU0FGRShwcmVnKQkJXAorCXByZWcubCA9IF9jcHVfcGRhOwkJXAorCXByZWcuaCA9IF9jcHVfcGRhOworCisjZGVmaW5lIEdFVF9QREEocHJlZywgZHJlZykJR0VUX1BEQV9TQUZFKHByZWcpCisKICNlbmRpZi8qIF9NRU1fTUFQXzU0OF9IXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL0tjb25maWcgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvS2NvbmZpZwppbmRleCAzZjQ4OTU0Li42MzhlYzM4IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvS2NvbmZpZworKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvS2NvbmZpZwpAQCAtNCw5ICs0LDkgQEAKIAogbWVudSAiQkY1NjEgU3BlY2lmaWMgQ29uZmlndXJhdGlvbiIKIAotY29tbWVudCAiQ29yZSBCIFN1cHBvcnQiCitpZiAoIVNNUCkKIAotbWVudSAiQ29yZSBCIFN1cHBvcnQiCitjb21tZW50ICJDb3JlIEIgU3VwcG9ydCIKIAogY29uZmlnIEJGNTYxX0NPUkVCCiAJYm9vbCAiRW5hYmxlIENvcmUgQiBzdXBwb3J0IgpAQCAtMjUsNyArMjUsNyBAQAogCSAgMCBpcyBzZXQsIGFuZCB3aWxsIHJlc2V0IFBDIHRvIDB4ZmY2MDAwMDAgd2hlbgogCSAgQ09SRUJfU1JBTV9JTklUIGlzIGNsZWFyZWQuCiAKLWVuZG1lbnUKK2VuZGlmCiAKIGNvbW1lbnQgIkludGVycnVwdCBQcmlvcml0eSBBc3NpZ25tZW50IgogCkBAIC0xMzgsNyArMTM4LDcgQEAKIAlkZWZhdWx0IDkKIGNvbmZpZyBJUlFfVElNRVIwCiAJaW50ICJUSU1FUiAwICBJbnRlcnJ1cHQiCi0JZGVmYXVsdCAxMAorCWRlZmF1bHQgOAogY29uZmlnIElSUV9USU1FUjEKIAlpbnQgIlRJTUVSIDEgIEludGVycnVwdCIKIAlkZWZhdWx0IDEwCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvTWFrZWZpbGUgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvTWFrZWZpbGUKaW5kZXggZjM5MjM1YS4uNTllMThhZiAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL01ha2VmaWxlCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9NYWtlZmlsZQpAQCAtMiw4ICsyLDcgQEAKICMgYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL01ha2VmaWxlCiAjCiAKLWV4dHJhLXkgOj0gaGVhZC5vCi0KIG9iai15IDo9IGludHMtcHJpb3JpdHkubyBkbWEubwogCiBvYmotJChDT05GSUdfQkY1NjFfQ09SRUIpICs9IGNvcmViLm8KK29iai0kKENPTkZJR19TTVApICArPSBzbXAubyBzZWNvbmRhcnkubyBhdG9taWMubwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2F0b21pYy5TIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2F0b21pYy5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0MzliYzYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvYXRvbWljLlMKQEAgLTAsMCArMSw5MTkgQEAKKy8qCisgKiBGaWxlOiAgICAgICAgIGFyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9hdG9taWMuUworICogQXV0aG9yOiAgICAgICBQaGlsaXBwZSBHZXJ1bSA8cnBtQHhlbm9tYWkub3JnPgorICoKKyAqICAgICAgICAgICAgICAgQ29weXJpZ2h0IDIwMDcgQW5hbG9nIERldmljZXMgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIHRoZSBmaWxlIENPUFlJTkcsIG9yIHdyaXRlCisgKiB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqLworCisjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgorI2luY2x1ZGUgPGFzbS9ibGFja2Zpbi5oPgorI2luY2x1ZGUgPGFzbS9jYWNoZS5oPgorI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgorI2luY2x1ZGUgPGFzbS9yd2xvY2suaD4KKyNpbmNsdWRlIDxhc20vY3BsYi5oPgorCisudGV4dAorCisubWFjcm8gY29yZXNsb3RfbG9hZGFkZHIgcmVnOnJlcQorCVxyZWdcKCkubCA9IF9jb3JlbG9jazsKKwlccmVnXCgpLmggPSBfY29yZWxvY2s7CisuZW5kbQorCisvKgorICogcjAgPSBhZGRyZXNzIG9mIGF0b21pYyBkYXRhIHRvIGZsdXNoIGFuZCBpbnZhbGlkYXRlICgzMmJpdCkuCisgKgorICogQ2xlYXIgaW50ZXJydXB0cyBhbmQgcmV0dXJuIHRoZSBvbGQgbWFzay4KKyAqIFdlIGFzc3VtZSB0aGF0IG5vIGF0b21pYyBkYXRhIGNhbiBzcGFuIGNhY2hlbGluZXMuCisgKgorICogQ2xvYmJlcnM6IHIyOjAsIHAwCisgKi8KK0VOVFJZKF9nZXRfY29yZV9sb2NrKQorCXIxID0gLUwxX0NBQ0hFX0JZVEVTOworCXIxID0gcjAgJiByMTsKKwljbGkgcjA7CisJY29yZXNsb3RfbG9hZGFkZHIgcDA7CisuTHJldHJ5X2NvcmVsb2NrOgorCXRlc3RzZXQgKHAwKTsKKwlpZiBjYyBqdW1wIC5MZG9uZV9jb3JlbG9jazsKKwlTU1lOQyhyMik7CisJanVtcCAuTHJldHJ5X2NvcmVsb2NrCisuTGRvbmVfY29yZWxvY2s6CisJcDAgPSByMTsKKwlDU1lOQyhyMik7CisJZmx1c2hpbnZbcDBdOworCVNTWU5DKHIyKTsKKwlydHM7CitFTkRQUk9DKF9nZXRfY29yZV9sb2NrKQorCisvKgorICogcjAgPSBhZGRyZXNzIG9mIGF0b21pYyBkYXRhIGluIHVuY2FjaGVhYmxlIG1lbW9yeSByZWdpb24gKDMyYml0KS4KKyAqCisgKiBDbGVhciBpbnRlcnJ1cHRzIGFuZCByZXR1cm4gdGhlIG9sZCBtYXNrLgorICoKKyAqIENsb2JiZXJzOiByMCwgcDAKKyAqLworRU5UUlkoX2dldF9jb3JlX2xvY2tfbm9mbHVzaCkKKwljbGkgcjA7CisJY29yZXNsb3RfbG9hZGFkZHIgcDA7CisuTHJldHJ5X2NvcmVsb2NrX25vZmx1c2g6CisJdGVzdHNldCAocDApOworCWlmIGNjIGp1bXAgLkxkb25lX2NvcmVsb2NrX25vZmx1c2g7CisJU1NZTkMocjIpOworCWp1bXAgLkxyZXRyeV9jb3JlbG9ja19ub2ZsdXNoCisuTGRvbmVfY29yZWxvY2tfbm9mbHVzaDoKKwlydHM7CitFTkRQUk9DKF9nZXRfY29yZV9sb2NrX25vZmx1c2gpCisKKy8qCisgKiByMCA9IGludGVycnVwdCBtYXNrIHRvIHJlc3RvcmUuCisgKiByMSA9IGFkZHJlc3Mgb2YgYXRvbWljIGRhdGEgdG8gZmx1c2ggYW5kIGludmFsaWRhdGUgKDMyYml0KS4KKyAqCisgKiBJbnRlcnJ1cHRzIGFyZSBtYXNrZWQgb24gZW50cnkgKHNlZSBfZ2V0X2NvcmVfbG9jaykuCisgKiBDbG9iYmVyczogcjI6MCwgcDAKKyAqLworRU5UUlkoX3B1dF9jb3JlX2xvY2spCisJLyogV3JpdGUtdGhyb3VnaCBjYWNoZSBhc3N1bWVkLCBzbyBubyBmbHVzaCBuZWVkZWQgaGVyZS4gKi8KKwljb3Jlc2xvdF9sb2FkYWRkciBwMDsKKwlyMSA9IDA7CisJW3AwXSA9IHIxOworCVNTWU5DKHIyKTsKKwlzdGkgcjA7CisJcnRzOworRU5EUFJPQyhfcHV0X2NvcmVfbG9jaykKKworI2lmZGVmIF9fQVJDSF9TWU5DX0NPUkVfRENBQ0hFCisKK0VOVFJZKF9fX3Jhd19zbXBfbWFya19iYXJyaWVyX2FzbSkKKwlbLS1zcF0gPSByZXRzOworCVstLXNwXSA9ICggcjc6NSApOworCVstLXNwXSA9IHIwOworCVstLXNwXSA9IHAxOworCVstLXNwXSA9IHAwOworCWNhbGwgX2dldF9jb3JlX2xvY2tfbm9mbHVzaDsKKworCS8qCisJICogQ2FsY3VsYXRlIGN1cnJlbnQgY29yZSBtYXNrCisJICovCisJR0VUX0NQVUlEKHAxLCByNyk7CisJcjYgPSAxOworCXI2IDw8PSByNzsKKworCS8qCisJICogU2V0IGJpdCBvZiBvdGhlciBjb3JlcyBpbiBiYXJyaWVyIG1hc2suIERvbid0IGNoYW5nZSBjdXJyZW50IGNvcmUgYml0LgorCSAqLworCXAxLmwgPSBfYmFycmllcl9tYXNrOworCXAxLmggPSBfYmFycmllcl9tYXNrOworCXI3ID0gW3AxXTsKKwlyNSA9IHI3ICYgcjY7CisJcjcgPSB+cjY7CisJY2MgPSByNSA9PSAwOworCWlmIGNjIGp1bXAgMWY7CisJcjcgPSByNyB8IHI2OworMToKKwlbcDFdID0gcjc7CisJU1NZTkMocjIpOworCisJY2FsbCBfcHV0X2NvcmVfbG9jazsKKwlwMCA9IFtzcCsrXTsKKwlwMSA9IFtzcCsrXTsKKwlyMCA9IFtzcCsrXTsKKwkoIHI3OjUgKSA9IFtzcCsrXTsKKwlyZXRzID0gW3NwKytdOworCXJ0czsKK0VORFBST0MoX19fcmF3X3NtcF9tYXJrX2JhcnJpZXJfYXNtKQorCitFTlRSWShfX19yYXdfc21wX2NoZWNrX2JhcnJpZXJfYXNtKQorCVstLXNwXSA9IHJldHM7CisJWy0tc3BdID0gKCByNzo1ICk7CisJWy0tc3BdID0gcjA7CisJWy0tc3BdID0gcDE7CisJWy0tc3BdID0gcDA7CisJY2FsbCBfZ2V0X2NvcmVfbG9ja19ub2ZsdXNoOworCisJLyoKKwkgKiBDYWxjdWxhdGUgY3VycmVudCBjb3JlIG1hc2sKKwkgKi8KKwlHRVRfQ1BVSUQocDEsIHI3KTsKKwlyNiA9IDE7CisJcjYgPDw9IHI3OworCisJLyoKKwkgKiBDbGVhciBjdXJyZW50IGNvcmUgYml0IGluIGJhcnJpZXIgbWFzayBpZiBpdCBpcyBzZXQuCisJICovCisJcDEubCA9IF9iYXJyaWVyX21hc2s7CisJcDEuaCA9IF9iYXJyaWVyX21hc2s7CisJcjcgPSBbcDFdOworCXI1ID0gcjcgJiByNjsKKwljYyA9IHI1ID09IDA7CisJaWYgY2MganVtcCAxZjsKKwlyNiA9IH5yNjsKKwlyNyA9IHI3ICYgcjY7CisJW3AxXSA9IHI3OworCVNTWU5DKHIyKTsKKworCWNhbGwgX3B1dF9jb3JlX2xvY2s7CisKKwkvKgorCSAqIEludmFsaWRhdGUgdGhlIGVudGlyZSBELWNhY2hlIG9mIGN1cnJlbnQgY29yZS4KKwkgKi8KKwlzcCArPSAtMTI7CisJY2FsbCBfcmVzeW5jX2NvcmVfZGNhY2hlCisJc3AgKz0gMTI7CisJanVtcCAyZjsKKzE6CisJY2FsbCBfcHV0X2NvcmVfbG9jazsKKzI6CisJcDAgPSBbc3ArK107CisJcDEgPSBbc3ArK107CisJcjAgPSBbc3ArK107CisJKCByNzo1ICkgPSBbc3ArK107CisJcmV0cyA9IFtzcCsrXTsKKwlydHM7CitFTkRQUk9DKF9fX3Jhd19zbXBfY2hlY2tfYmFycmllcl9hc20pCisKKy8qCisgKiByMCA9IGlycWZsYWdzCisgKiByMSA9IGFkZHJlc3Mgb2YgYXRvbWljIGRhdGEKKyAqCisgKiBDbG9iYmVyczogcjI6MCwgcDE6MAorICovCitfc3RhcnRfbG9ja19jb2hlcmVudDoKKworCVstLXNwXSA9IHJldHM7CisJWy0tc3BdID0gKCByNzo2ICk7CisJcjcgPSByMDsKKwlwMSA9IHIxOworCisJLyoKKwkgKiBEZXRlcm1pbmUgd2hldGhlciB0aGUgYXRvbWljIGRhdGEgd2FzIHByZXZpb3VzbHkKKwkgKiBvd25lZCBieSBhbm90aGVyIENQVSAoPXI2KS4KKwkgKi8KKwlHRVRfQ1BVSUQocDAsIHIyKTsKKwlyMSA9IDE7CisJcjEgPDw9IHIyOworCXIyID0gfnIxOworCisJcjEgPSBbcDFdOworCXIxID4+PSAyODsgICAvKiBDUFUgZmluZ2VycHJpbnRzIGFyZSBzdG9yZWQgaW4gdGhlIGhpZ2ggbmliYmxlLiAqLworCXI2ID0gcjEgJiByMjsKKwlyMSA9IFtwMV07CisJcjEgPDw9IDQ7CisJcjEgPj49IDQ7CisJW3AxXSA9IHIxOworCisJLyoKKwkgKiBSZWxlYXNlIHRoZSBjb3JlIGxvY2sgbm93LCBidXQga2VlcCBJUlFzIGRpc2FibGVkIHdoaWxlIHdlIGFyZQorCSAqIHBlcmZvcm1pbmcgdGhlIHJlbWFpbmluZyBob3VzZWtlZXBpbmcgY2hvcmVzIGZvciB0aGUgY3VycmVudCBDUFUuCisJICovCisJY29yZXNsb3RfbG9hZGFkZHIgcDA7CisJcjEgPSAwOworCVtwMF0gPSByMTsKKworCS8qCisJICogSWYgYW5vdGhlciBDUFUgaGFzIG93bmVkIHRoZSBzYW1lIGF0b21pYyBzZWN0aW9uIGJlZm9yZSB1cywKKwkgKiB0aGVuIG91ciBELWNhY2hlZCBjb3B5IG9mIHRoZSBzaGFyZWQgZGF0YSBwcm90ZWN0ZWQgYnkgdGhlCisJICogY3VycmVudCBzcGluL3dyaXRlX2xvY2sgbWF5IGJlIG9ic29sZXRlLgorCSAqLworCWNjID0gcjYgPT0gMDsKKwlpZiBjYyBqdW1wIC5MY2FjaGVfc3luY2VkCisKKwkvKgorCSAqIEludmFsaWRhdGUgdGhlIGVudGlyZSBELWNhY2hlIG9mIHRoZSBjdXJyZW50IGNvcmUuCisJICovCisJc3AgKz0gLTEyOworCWNhbGwgX3Jlc3luY19jb3JlX2RjYWNoZQorCXNwICs9IDEyOworCisuTGNhY2hlX3N5bmNlZDoKKwlTU1lOQyhyMik7CisJc3RpIHI3OworCSggcjc6NiApID0gW3NwKytdOworCXJldHMgPSBbc3ArK107CisJcnRzCisKKy8qCisgKiByMCA9IGlycWZsYWdzCisgKiByMSA9IGFkZHJlc3Mgb2YgYXRvbWljIGRhdGEKKyAqCisgKiBDbG9iYmVyczogcjI6MCwgcDE6MAorICovCitfZW5kX2xvY2tfY29oZXJlbnQ6CisKKwlwMSA9IHIxOworCUdFVF9DUFVJRChwMCwgcjIpOworCXIyICs9IDI4OworCXIxID0gMTsKKwlyMSA8PD0gcjI7CisJcjIgPSBbcDFdOworCXIyID0gcjEgfCByMjsKKwlbcDFdID0gcjI7CisJcjEgPSBwMTsKKwlqdW1wIF9wdXRfY29yZV9sb2NrOworCisjZW5kaWYgLyogX19BUkNIX1NZTkNfQ09SRV9EQ0FDSEUgKi8KKworLyoKKyAqIHIwID0gJnNwaW5sb2NrLT5sb2NrCisgKgorICogQ2xvYmJlcnM6IHIzOjAsIHAxOjAKKyAqLworRU5UUlkoX19fcmF3X3NwaW5faXNfbG9ja2VkX2FzbSkKKwlwMSA9IHIwOworCVstLXNwXSA9IHJldHM7CisJY2FsbCBfZ2V0X2NvcmVfbG9jazsKKwlyMyA9IFtwMV07CisJY2MgPSBiaXR0c3QoIHIzLCAwICk7CisJcjMgPSBjYzsKKwlyMSA9IHAxOworCWNhbGwgX3B1dF9jb3JlX2xvY2s7CisJcmV0cyA9IFtzcCsrXTsKKwlyMCA9IHIzOworCXJ0czsKK0VORFBST0MoX19fcmF3X3NwaW5faXNfbG9ja2VkX2FzbSkKKworLyoKKyAqIHIwID0gJnNwaW5sb2NrLT5sb2NrCisgKgorICogQ2xvYmJlcnM6IHIzOjAsIHAxOjAKKyAqLworRU5UUlkoX19fcmF3X3NwaW5fbG9ja19hc20pCisJcDEgPSByMDsKKwlbLS1zcF0gPSByZXRzOworLkxyZXRyeV9zcGlubG9jazoKKwljYWxsIF9nZXRfY29yZV9sb2NrOworCXIxID0gcDE7CisJcjIgPSBbcDFdOworCWNjID0gYml0dHN0KCByMiwgMCApOworCWlmIGNjIGp1bXAgLkxidXN5X3NwaW5sb2NrCisjaWZkZWYgX19BUkNIX1NZTkNfQ09SRV9EQ0FDSEUKKwlyMyA9IHAxOworCWJpdHNldCAoIHIyLCAwICk7IC8qIFJhaXNlIHRoZSBsb2NrIGJpdC4gKi8KKwlbcDFdID0gcjI7CisJY2FsbCBfc3RhcnRfbG9ja19jb2hlcmVudAorI2Vsc2UKKwlyMiA9IDE7CisJW3AxXSA9IHIyOworCWNhbGwgX3B1dF9jb3JlX2xvY2s7CisjZW5kaWYKKwlyZXRzID0gW3NwKytdOworCXJ0czsKKworLkxidXN5X3NwaW5sb2NrOgorCS8qIFdlIGRvbid0IHRvdWNoIHRoZSBhdG9taWMgYXJlYSBpZiBidXN5LCBzbyB0aGF0IGZsdXNoCisJICAgd2lsbCBiZWhhdmUgbGlrZSBub3AgaW4gX3B1dF9jb3JlX2xvY2suICovCisJY2FsbCBfcHV0X2NvcmVfbG9jazsKKwlTU1lOQyhyMik7CisJcjAgPSBwMTsKKwlqdW1wIC5McmV0cnlfc3BpbmxvY2sKK0VORFBST0MoX19fcmF3X3NwaW5fbG9ja19hc20pCisKKy8qCisgKiByMCA9ICZzcGlubG9jay0+bG9jaworICoKKyAqIENsb2JiZXJzOiByMzowLCBwMTowCisgKi8KK0VOVFJZKF9fX3Jhd19zcGluX3RyeWxvY2tfYXNtKQorCXAxID0gcjA7CisJWy0tc3BdID0gcmV0czsKKwljYWxsIF9nZXRfY29yZV9sb2NrOworCXIxID0gcDE7CisJcjMgPSBbcDFdOworCWNjID0gYml0dHN0KCByMywgMCApOworCWlmIGNjIGp1bXAgLkxmYWlsZWRfdHJ5bG9jaworI2lmZGVmIF9fQVJDSF9TWU5DX0NPUkVfRENBQ0hFCisJYml0c2V0ICggcjMsIDAgKTsgLyogUmFpc2UgdGhlIGxvY2sgYml0LiAqLworCVtwMV0gPSByMzsKKwljYWxsIF9zdGFydF9sb2NrX2NvaGVyZW50CisjZWxzZQorCXIyID0gMTsKKwlbcDFdID0gcjI7CisJY2FsbCBfcHV0X2NvcmVfbG9jazsKKyNlbmRpZgorCXIwID0gMTsKKwlyZXRzID0gW3NwKytdOworCXJ0czsKKy5MZmFpbGVkX3RyeWxvY2s6CisJY2FsbCBfcHV0X2NvcmVfbG9jazsKKwlyMCA9IDA7CisJcmV0cyA9IFtzcCsrXTsKKwlydHM7CitFTkRQUk9DKF9fX3Jhd19zcGluX3RyeWxvY2tfYXNtKQorCisvKgorICogcjAgPSAmc3BpbmxvY2stPmxvY2sKKyAqCisgKiBDbG9iYmVyczogcjI6MCwgcDE6MAorICovCitFTlRSWShfX19yYXdfc3Bpbl91bmxvY2tfYXNtKQorCXAxID0gcjA7CisJWy0tc3BdID0gcmV0czsKKwljYWxsIF9nZXRfY29yZV9sb2NrOworCXIyID0gW3AxXTsKKwliaXRjbHIgKCByMiwgMCApOworCVtwMV0gPSByMjsKKwlyMSA9IHAxOworI2lmZGVmIF9fQVJDSF9TWU5DX0NPUkVfRENBQ0hFCisJY2FsbCBfZW5kX2xvY2tfY29oZXJlbnQKKyNlbHNlCisJY2FsbCBfcHV0X2NvcmVfbG9jazsKKyNlbmRpZgorCXJldHMgPSBbc3ArK107CisJcnRzOworRU5EUFJPQyhfX19yYXdfc3Bpbl91bmxvY2tfYXNtKQorCisvKgorICogcjAgPSAmcndsb2NrLT5sb2NrCisgKgorICogQ2xvYmJlcnM6IHIyOjAsIHAxOjAKKyAqLworRU5UUlkoX19fcmF3X3JlYWRfbG9ja19hc20pCisJcDEgPSByMDsKKwlbLS1zcF0gPSByZXRzOworCWNhbGwgX2dldF9jb3JlX2xvY2s7CisuTHJkbG9ja190cnk6CisJcjEgPSBbcDFdOworCXIxICs9IC0xOworCVtwMV0gPSByMTsKKwljYyA9IHIxIDwgMDsKKwlpZiBjYyBqdW1wIC5McmRsb2NrX2ZhaWxlZAorCXIxID0gcDE7CisjaWZkZWYgX19BUkNIX1NZTkNfQ09SRV9EQ0FDSEUKKwljYWxsIF9zdGFydF9sb2NrX2NvaGVyZW50CisjZWxzZQorCWNhbGwgX3B1dF9jb3JlX2xvY2s7CisjZW5kaWYKKwlyZXRzID0gW3NwKytdOworCXJ0czsKKworLkxyZGxvY2tfZmFpbGVkOgorCXIxICs9IDE7CisJW3AxXSA9IHIxOworLkxyZGxvY2tfd2FpdDoKKwlyMSA9IHAxOworCWNhbGwgX3B1dF9jb3JlX2xvY2s7CisJU1NZTkMocjIpOworCXIwID0gcDE7CisJY2FsbCBfZ2V0X2NvcmVfbG9jazsKKwlyMSA9IFtwMV07CisJY2MgPSByMSA8IDI7CisJaWYgY2MganVtcCAuTHJkbG9ja193YWl0OworCWp1bXAgLkxyZGxvY2tfdHJ5CitFTkRQUk9DKF9fX3Jhd19yZWFkX2xvY2tfYXNtKQorCisvKgorICogcjAgPSAmcndsb2NrLT5sb2NrCisgKgorICogQ2xvYmJlcnM6IHIzOjAsIHAxOjAKKyAqLworRU5UUlkoX19fcmF3X3JlYWRfdHJ5bG9ja19hc20pCisJcDEgPSByMDsKKwlbLS1zcF0gPSByZXRzOworCWNhbGwgX2dldF9jb3JlX2xvY2s7CisJcjEgPSBbcDFdOworCWNjID0gcjEgPD0gMDsKKwlpZiBjYyBqdW1wIC5MZmFpbGVkX3RyeXJkbG9jazsKKwlyMSArPSAtMTsKKwlbcDFdID0gcjE7CisJcjEgPSBwMTsKKyNpZmRlZiBfX0FSQ0hfU1lOQ19DT1JFX0RDQUNIRQorCWNhbGwgX3N0YXJ0X2xvY2tfY29oZXJlbnQKKyNlbHNlCisJY2FsbCBfcHV0X2NvcmVfbG9jazsKKyNlbmRpZgorCXJldHMgPSBbc3ArK107CisJcjAgPSAxOworCXJ0czsKKy5MZmFpbGVkX3RyeXJkbG9jazoKKwlyMSA9IHAxOworCWNhbGwgX3B1dF9jb3JlX2xvY2s7CisJcmV0cyA9IFtzcCsrXTsKKwlyMCA9IDA7CisJcnRzOworRU5EUFJPQyhfX19yYXdfcmVhZF90cnlsb2NrX2FzbSkKKworLyoKKyAqIHIwID0gJnJ3bG9jay0+bG9jaworICoKKyAqIE5vdGU6IFByb2Nlc3NpbmcgY29udHJvbGxlZCBieSBhIHJlYWRlciBsb2NrIHNob3VsZCBub3QgaGF2ZQorICogYW55IHNpZGUtZWZmZWN0IG9uIGNhY2hlIGlzc3VlcyB3aXRoIHRoZSBvdGhlciBjb3JlLCBzbyB3ZQorICoganVzdCByZWxlYXNlIHRoZSBjb3JlIGxvY2sgYW5kIGV4aXQgKG5vIF9lbmRfbG9ja19jb2hlcmVudCkuCisgKgorICogQ2xvYmJlcnM6IHIzOjAsIHAxOjAKKyAqLworRU5UUlkoX19fcmF3X3JlYWRfdW5sb2NrX2FzbSkKKwlwMSA9IHIwOworCVstLXNwXSA9IHJldHM7CisJY2FsbCBfZ2V0X2NvcmVfbG9jazsKKwlyMSA9IFtwMV07CisJcjEgKz0gMTsKKwlbcDFdID0gcjE7CisJcjEgPSBwMTsKKwljYWxsIF9wdXRfY29yZV9sb2NrOworCXJldHMgPSBbc3ArK107CisJcnRzOworRU5EUFJPQyhfX19yYXdfcmVhZF91bmxvY2tfYXNtKQorCisvKgorICogcjAgPSAmcndsb2NrLT5sb2NrCisgKgorICogQ2xvYmJlcnM6IHIzOjAsIHAxOjAKKyAqLworRU5UUlkoX19fcmF3X3dyaXRlX2xvY2tfYXNtKQorCXAxID0gcjA7CisJcjMubCA9IGxvKFJXX0xPQ0tfQklBUyk7CisJcjMuaCA9IGhpKFJXX0xPQ0tfQklBUyk7CisJWy0tc3BdID0gcmV0czsKKwljYWxsIF9nZXRfY29yZV9sb2NrOworLkx3cmxvY2tfdHJ5OgorCXIxID0gW3AxXTsKKwlyMSA9IHIxIC0gcjM7CisjaWZkZWYgX19BUkNIX1NZTkNfQ09SRV9EQ0FDSEUKKwlyMiA9IHIxOworCXIyIDw8PSA0OworCXIyID4+PSA0OworCWNjID0gcjIgPT0gMDsKKyNlbHNlCisJY2MgPSByMSA9PSAwOworI2VuZGlmCisJaWYgIWNjIGp1bXAgLkx3cmxvY2tfd2FpdAorCVtwMV0gPSByMTsKKwlyMSA9IHAxOworI2lmZGVmIF9fQVJDSF9TWU5DX0NPUkVfRENBQ0hFCisJY2FsbCBfc3RhcnRfbG9ja19jb2hlcmVudAorI2Vsc2UKKwljYWxsIF9wdXRfY29yZV9sb2NrOworI2VuZGlmCisJcmV0cyA9IFtzcCsrXTsKKwlydHM7CisKKy5Md3Jsb2NrX3dhaXQ6CisJcjEgPSBwMTsKKwljYWxsIF9wdXRfY29yZV9sb2NrOworCVNTWU5DKHIyKTsKKwlyMCA9IHAxOworCWNhbGwgX2dldF9jb3JlX2xvY2s7CisJcjEgPSBbcDFdOworI2lmZGVmIF9fQVJDSF9TWU5DX0NPUkVfRENBQ0hFCisJcjEgPDw9IDQ7CisJcjEgPj49IDQ7CisjZW5kaWYKKwljYyA9IHIxID09IHIzOworCWlmICFjYyBqdW1wIC5Md3Jsb2NrX3dhaXQ7CisJanVtcCAuTHdybG9ja190cnkKK0VORFBST0MoX19fcmF3X3dyaXRlX2xvY2tfYXNtKQorCisvKgorICogcjAgPSAmcndsb2NrLT5sb2NrCisgKgorICogQ2xvYmJlcnM6IHIzOjAsIHAxOjAKKyAqLworRU5UUlkoX19fcmF3X3dyaXRlX3RyeWxvY2tfYXNtKQorCXAxID0gcjA7CisJWy0tc3BdID0gcmV0czsKKwljYWxsIF9nZXRfY29yZV9sb2NrOworCXIxID0gW3AxXTsKKwlyMi5sID0gbG8oUldfTE9DS19CSUFTKTsKKwlyMi5oID0gaGkoUldfTE9DS19CSUFTKTsKKwljYyA9IHIxID09IHIyOworCWlmICFjYyBqdW1wIC5MZmFpbGVkX3RyeXdybG9jazsKKyNpZmRlZiBfX0FSQ0hfU1lOQ19DT1JFX0RDQUNIRQorCXIxID4+PSAyODsKKwlyMSA8PD0gMjg7CisjZWxzZQorCXIxID0gMDsKKyNlbmRpZgorCVtwMV0gPSByMTsKKwlyMSA9IHAxOworI2lmZGVmIF9fQVJDSF9TWU5DX0NPUkVfRENBQ0hFCisJY2FsbCBfc3RhcnRfbG9ja19jb2hlcmVudAorI2Vsc2UKKwljYWxsIF9wdXRfY29yZV9sb2NrOworI2VuZGlmCisJcmV0cyA9IFtzcCsrXTsKKwlyMCA9IDE7CisJcnRzOworCisuTGZhaWxlZF90cnl3cmxvY2s6CisJcjEgPSBwMTsKKwljYWxsIF9wdXRfY29yZV9sb2NrOworCXJldHMgPSBbc3ArK107CisJcjAgPSAwOworCXJ0czsKK0VORFBST0MoX19fcmF3X3dyaXRlX3RyeWxvY2tfYXNtKQorCisvKgorICogcjAgPSAmcndsb2NrLT5sb2NrCisgKgorICogQ2xvYmJlcnM6IHIzOjAsIHAxOjAKKyAqLworRU5UUlkoX19fcmF3X3dyaXRlX3VubG9ja19hc20pCisJcDEgPSByMDsKKwlyMy5sID0gbG8oUldfTE9DS19CSUFTKTsKKwlyMy5oID0gaGkoUldfTE9DS19CSUFTKTsKKwlbLS1zcF0gPSByZXRzOworCWNhbGwgX2dldF9jb3JlX2xvY2s7CisJcjEgPSBbcDFdOworCXIxID0gcjEgKyByMzsKKwlbcDFdID0gcjE7CisJcjEgPSBwMTsKKyNpZmRlZiBfX0FSQ0hfU1lOQ19DT1JFX0RDQUNIRQorCWNhbGwgX2VuZF9sb2NrX2NvaGVyZW50CisjZWxzZQorCWNhbGwgX3B1dF9jb3JlX2xvY2s7CisjZW5kaWYKKwlyZXRzID0gW3NwKytdOworCXJ0czsKK0VORFBST0MoX19fcmF3X3dyaXRlX3VubG9ja19hc20pCisKKy8qCisgKiByMCA9IHB0cgorICogcjEgPSB2YWx1ZQorICoKKyAqIEFkZCBhIHNpZ25lZCB2YWx1ZSB0byBhIDMyYml0IHdvcmQgYW5kIHJldHVybiB0aGUgbmV3IHZhbHVlIGF0b21pY2FsbHkuCisgKiBDbG9iYmVyczogcjM6MCwgcDE6MAorICovCitFTlRSWShfX19yYXdfYXRvbWljX3VwZGF0ZV9hc20pCisJcDEgPSByMDsKKwlyMyA9IHIxOworCVstLXNwXSA9IHJldHM7CisJY2FsbCBfZ2V0X2NvcmVfbG9jazsKKwlyMiA9IFtwMV07CisJcjMgPSByMyArIHIyOworCVtwMV0gPSByMzsKKwlyMSA9IHAxOworCWNhbGwgX3B1dF9jb3JlX2xvY2s7CisJcjAgPSByMzsKKwlyZXRzID0gW3NwKytdOworCXJ0czsKK0VORFBST0MoX19fcmF3X2F0b21pY191cGRhdGVfYXNtKQorCisvKgorICogcjAgPSBwdHIKKyAqIHIxID0gbWFzaworICoKKyAqIENsZWFyIHRoZSBtYXNrIGJpdHMgZnJvbSBhIDMyYml0IHdvcmQgYW5kIHJldHVybiB0aGUgb2xkIDMyYml0IHZhbHVlCisgKiBhdG9taWNhbGx5LgorICogQ2xvYmJlcnM6IHIzOjAsIHAxOjAKKyAqLworRU5UUlkoX19fcmF3X2F0b21pY19jbGVhcl9hc20pCisJcDEgPSByMDsKKwlyMyA9IH5yMTsKKwlbLS1zcF0gPSByZXRzOworCWNhbGwgX2dldF9jb3JlX2xvY2s7CisJcjIgPSBbcDFdOworCXIzID0gcjIgJiByMzsKKwlbcDFdID0gcjM7CisJcjMgPSByMjsKKwlyMSA9IHAxOworCWNhbGwgX3B1dF9jb3JlX2xvY2s7CisJcjAgPSByMzsKKwlyZXRzID0gW3NwKytdOworCXJ0czsKK0VORFBST0MoX19fcmF3X2F0b21pY19jbGVhcl9hc20pCisKKy8qCisgKiByMCA9IHB0cgorICogcjEgPSBtYXNrCisgKgorICogU2V0IHRoZSBtYXNrIGJpdHMgaW50byBhIDMyYml0IHdvcmQgYW5kIHJldHVybiB0aGUgb2xkIDMyYml0IHZhbHVlCisgKiBhdG9taWNhbGx5LgorICogQ2xvYmJlcnM6IHIzOjAsIHAxOjAKKyAqLworRU5UUlkoX19fcmF3X2F0b21pY19zZXRfYXNtKQorCXAxID0gcjA7CisJcjMgPSByMTsKKwlbLS1zcF0gPSByZXRzOworCWNhbGwgX2dldF9jb3JlX2xvY2s7CisJcjIgPSBbcDFdOworCXIzID0gcjIgfCByMzsKKwlbcDFdID0gcjM7CisJcjMgPSByMjsKKwlyMSA9IHAxOworCWNhbGwgX3B1dF9jb3JlX2xvY2s7CisJcjAgPSByMzsKKwlyZXRzID0gW3NwKytdOworCXJ0czsKK0VORFBST0MoX19fcmF3X2F0b21pY19zZXRfYXNtKQorCisvKgorICogcjAgPSBwdHIKKyAqIHIxID0gbWFzaworICoKKyAqIFhPUiB0aGUgbWFzayBiaXRzIHdpdGggYSAzMmJpdCB3b3JkIGFuZCByZXR1cm4gdGhlIG9sZCAzMmJpdCB2YWx1ZQorICogYXRvbWljYWxseS4KKyAqIENsb2JiZXJzOiByMzowLCBwMTowCisgKi8KK0VOVFJZKF9fX3Jhd19hdG9taWNfeG9yX2FzbSkKKwlwMSA9IHIwOworCXIzID0gcjE7CisJWy0tc3BdID0gcmV0czsKKwljYWxsIF9nZXRfY29yZV9sb2NrOworCXIyID0gW3AxXTsKKwlyMyA9IHIyIF4gcjM7CisJW3AxXSA9IHIzOworCXIzID0gcjI7CisJcjEgPSBwMTsKKwljYWxsIF9wdXRfY29yZV9sb2NrOworCXIwID0gcjM7CisJcmV0cyA9IFtzcCsrXTsKKwlydHM7CitFTkRQUk9DKF9fX3Jhd19hdG9taWNfeG9yX2FzbSkKKworLyoKKyAqIHIwID0gcHRyCisgKiByMSA9IG1hc2sKKyAqCisgKiBQZXJmb3JtIGEgbG9naWNhbCBBTkQgYmV0d2VlbiB0aGUgbWFzayBiaXRzIGFuZCBhIDMyYml0IHdvcmQsIGFuZAorICogcmV0dXJuIHRoZSBtYXNrZWQgdmFsdWUuIFdlIG5lZWQgdGhpcyBvbiB0aGlzIGFyY2hpdGVjdHVyZSBpbgorICogb3JkZXIgdG8gaW52YWxpZGF0ZSB0aGUgbG9jYWwgY2FjaGUgYmVmb3JlIHRlc3RpbmcuCisgKgorICogQ2xvYmJlcnM6IHIzOjAsIHAxOjAKKyAqLworRU5UUlkoX19fcmF3X2F0b21pY190ZXN0X2FzbSkKKwlwMSA9IHIwOworCXIzID0gcjE7CisJcjEgPSAtTDFfQ0FDSEVfQllURVM7CisJcjEgPSByMCAmIHIxOworCXAwID0gcjE7CisJZmx1c2hpbnZbcDBdOworCVNTWU5DKHIyKTsKKwlyMCA9IFtwMV07CisJcjAgPSByMCAmIHIzOworCXJ0czsKK0VORFBST0MoX19fcmF3X2F0b21pY190ZXN0X2FzbSkKKworLyoKKyAqIHIwID0gcHRyCisgKiByMSA9IHZhbHVlCisgKgorICogU3dhcCAqcHRyIHdpdGggdmFsdWUgYW5kIHJldHVybiB0aGUgb2xkIDMyYml0IHZhbHVlIGF0b21pY2FsbHkuCisgKiBDbG9iYmVyczogcjM6MCwgcDE6MAorICovCisjZGVmaW5lCV9fZG9feGNoZyhzcmMsIGRzdCkgCQlcCisJcDEgPSByMDsJCQlcCisJcjMgPSByMTsJCQlcCisJWy0tc3BdID0gcmV0czsJCQlcCisJY2FsbCBfZ2V0X2NvcmVfbG9jazsJCVwKKwlyMiA9IHNyYzsJCQlcCisJZHN0ID0gcjM7CQkJXAorCXIzID0gcjI7CQkJXAorCXIxID0gcDE7CQkJXAorCWNhbGwgX3B1dF9jb3JlX2xvY2s7CQlcCisJcjAgPSByMzsJCQlcCisJcmV0cyA9IFtzcCsrXTsJCQlcCisJcnRzOworCitFTlRSWShfX19yYXdfeGNoZ18xX2FzbSkKKwlfX2RvX3hjaGcoYltwMV0gKHopLCBiW3AxXSkKK0VORFBST0MoX19fcmF3X3hjaGdfMV9hc20pCisKK0VOVFJZKF9fX3Jhd194Y2hnXzJfYXNtKQorCV9fZG9feGNoZyh3W3AxXSAoeiksIHdbcDFdKQorRU5EUFJPQyhfX19yYXdfeGNoZ18yX2FzbSkKKworRU5UUlkoX19fcmF3X3hjaGdfNF9hc20pCisJX19kb194Y2hnKFtwMV0sIFtwMV0pCitFTkRQUk9DKF9fX3Jhd194Y2hnXzRfYXNtKQorCisvKgorICogcjAgPSBwdHIKKyAqIHIxID0gbmV3CisgKiByMiA9IG9sZAorICoKKyAqIFN3YXAgKnB0ciB3aXRoIG5ldyBpZiAqcHRyID09IG9sZCBhbmQgcmV0dXJuIHRoZSBwcmV2aW91cyAqcHRyCisgKiB2YWx1ZSBhdG9taWNhbGx5LgorICoKKyAqIENsb2JiZXJzOiByMzowLCBwMTowCisgKi8KKyNkZWZpbmUJX19kb19jbXB4Y2hnKHNyYywgZHN0KSAJCVwKKwlbLS1zcF0gPSByZXRzOwkJCVwKKwlbLS1zcF0gPSByNDsJCQlcCisJcDEgPSByMDsJCQlcCisJcjMgPSByMTsJCQlcCisJcjQgPSByMjsJCQlcCisJY2FsbCBfZ2V0X2NvcmVfbG9jazsJCVwKKwlyMiA9IHNyYzsJCQlcCisJY2MgPSByMiA9PSByNDsJCQlcCisJaWYgIWNjIGp1bXAgMWY7CQkJXAorCWRzdCA9IHIzOwkJCVwKKyAgICAgMTogcjMgPSByMjsJCQlcCisJcjEgPSBwMTsJCQlcCisJY2FsbCBfcHV0X2NvcmVfbG9jazsJCVwKKwlyMCA9IHIzOwkJCVwKKwlyNCA9IFtzcCsrXTsJCQlcCisJcmV0cyA9IFtzcCsrXTsJCQlcCisJcnRzOworCitFTlRSWShfX19yYXdfY21weGNoZ18xX2FzbSkKKwlfX2RvX2NtcHhjaGcoYltwMV0gKHopLCBiW3AxXSkKK0VORFBST0MoX19fcmF3X2NtcHhjaGdfMV9hc20pCisKK0VOVFJZKF9fX3Jhd19jbXB4Y2hnXzJfYXNtKQorCV9fZG9fY21weGNoZyh3W3AxXSAoeiksIHdbcDFdKQorRU5EUFJPQyhfX19yYXdfY21weGNoZ18yX2FzbSkKKworRU5UUlkoX19fcmF3X2NtcHhjaGdfNF9hc20pCisJX19kb19jbXB4Y2hnKFtwMV0sIFtwMV0pCitFTkRQUk9DKF9fX3Jhd19jbXB4Y2hnXzRfYXNtKQorCisvKgorICogcjAgPSBwdHIKKyAqIHIxID0gYml0bnIKKyAqCisgKiBTZXQgYSBiaXQgaW4gYSAzMmJpdCB3b3JkIGFuZCByZXR1cm4gdGhlIG9sZCAzMmJpdCB2YWx1ZSBhdG9taWNhbGx5LgorICogQ2xvYmJlcnM6IHIzOjAsIHAxOjAKKyAqLworRU5UUlkoX19fcmF3X2JpdF9zZXRfYXNtKQorCXIyID0gcjE7CisJcjEgPSAxOworCXIxIDw8PSByMjsKKwlqdW1wIF9fX3Jhd19hdG9taWNfc2V0X2FzbQorRU5EUFJPQyhfX19yYXdfYml0X3NldF9hc20pCisKKy8qCisgKiByMCA9IHB0cgorICogcjEgPSBiaXRucgorICoKKyAqIENsZWFyIGEgYml0IGluIGEgMzJiaXQgd29yZCBhbmQgcmV0dXJuIHRoZSBvbGQgMzJiaXQgdmFsdWUgYXRvbWljYWxseS4KKyAqIENsb2JiZXJzOiByMzowLCBwMTowCisgKi8KK0VOVFJZKF9fX3Jhd19iaXRfY2xlYXJfYXNtKQorCXIyID0gcjE7CisJcjEgPSAxOworCXIxIDw8PSByMjsKKwlqdW1wIF9fX3Jhd19hdG9taWNfY2xlYXJfYXNtCitFTkRQUk9DKF9fX3Jhd19iaXRfY2xlYXJfYXNtKQorCisvKgorICogcjAgPSBwdHIKKyAqIHIxID0gYml0bnIKKyAqCisgKiBUb2dnbGUgYSBiaXQgaW4gYSAzMmJpdCB3b3JkIGFuZCByZXR1cm4gdGhlIG9sZCAzMmJpdCB2YWx1ZSBhdG9taWNhbGx5LgorICogQ2xvYmJlcnM6IHIzOjAsIHAxOjAKKyAqLworRU5UUlkoX19fcmF3X2JpdF90b2dnbGVfYXNtKQorCXIyID0gcjE7CisJcjEgPSAxOworCXIxIDw8PSByMjsKKwlqdW1wIF9fX3Jhd19hdG9taWNfeG9yX2FzbQorRU5EUFJPQyhfX19yYXdfYml0X3RvZ2dsZV9hc20pCisKKy8qCisgKiByMCA9IHB0cgorICogcjEgPSBiaXRucgorICoKKyAqIFRlc3QtYW5kLXNldCBhIGJpdCBpbiBhIDMyYml0IHdvcmQgYW5kIHJldHVybiB0aGUgb2xkIGJpdCB2YWx1ZSBhdG9taWNhbGx5LgorICogQ2xvYmJlcnM6IHIzOjAsIHAxOjAKKyAqLworRU5UUlkoX19fcmF3X2JpdF90ZXN0X3NldF9hc20pCisJWy0tc3BdID0gcmV0czsKKwlbLS1zcF0gPSByMTsKKwljYWxsIF9fX3Jhd19iaXRfc2V0X2FzbQorCXIxID0gW3NwKytdOworCXIyID0gMTsKKwlyMiA8PD0gcjE7CisJcjAgPSByMCAmIHIyOworCWNjID0gcjAgPT0gMDsKKwlpZiBjYyBqdW1wIDFmCisJcjAgPSAxOworMToKKwlyZXRzID0gW3NwKytdOworCXJ0czsKK0VORFBST0MoX19fcmF3X2JpdF90ZXN0X3NldF9hc20pCisKKy8qCisgKiByMCA9IHB0cgorICogcjEgPSBiaXRucgorICoKKyAqIFRlc3QtYW5kLWNsZWFyIGEgYml0IGluIGEgMzJiaXQgd29yZCBhbmQgcmV0dXJuIHRoZSBvbGQgYml0IHZhbHVlIGF0b21pY2FsbHkuCisgKiBDbG9iYmVyczogcjM6MCwgcDE6MAorICovCitFTlRSWShfX19yYXdfYml0X3Rlc3RfY2xlYXJfYXNtKQorCVstLXNwXSA9IHJldHM7CisJWy0tc3BdID0gcjE7CisJY2FsbCBfX19yYXdfYml0X2NsZWFyX2FzbQorCXIxID0gW3NwKytdOworCXIyID0gMTsKKwlyMiA8PD0gcjE7CisJcjAgPSByMCAmIHIyOworCWNjID0gcjAgPT0gMDsKKwlpZiBjYyBqdW1wIDFmCisJcjAgPSAxOworMToKKwlyZXRzID0gW3NwKytdOworCXJ0czsKK0VORFBST0MoX19fcmF3X2JpdF90ZXN0X2NsZWFyX2FzbSkKKworLyoKKyAqIHIwID0gcHRyCisgKiByMSA9IGJpdG5yCisgKgorICogVGVzdC1hbmQtdG9nZ2xlIGEgYml0IGluIGEgMzJiaXQgd29yZCwKKyAqIGFuZCByZXR1cm4gdGhlIG9sZCBiaXQgdmFsdWUgYXRvbWljYWxseS4KKyAqIENsb2JiZXJzOiByMzowLCBwMTowCisgKi8KK0VOVFJZKF9fX3Jhd19iaXRfdGVzdF90b2dnbGVfYXNtKQorCVstLXNwXSA9IHJldHM7CisJWy0tc3BdID0gcjE7CisJY2FsbCBfX19yYXdfYml0X3RvZ2dsZV9hc20KKwlyMSA9IFtzcCsrXTsKKwlyMiA9IDE7CisJcjIgPDw9IHIxOworCXIwID0gcjAgJiByMjsKKwljYyA9IHIwID09IDA7CisJaWYgY2MganVtcCAxZgorCXIwID0gMTsKKzE6CisJcmV0cyA9IFtzcCsrXTsKKwlydHM7CitFTkRQUk9DKF9fX3Jhd19iaXRfdGVzdF90b2dnbGVfYXNtKQorCisvKgorICogcjAgPSBwdHIKKyAqIHIxID0gYml0bnIKKyAqCisgKiBUZXN0IGEgYml0IGluIGEgMzJiaXQgd29yZCBhbmQgcmV0dXJuIGl0cyB2YWx1ZS4KKyAqIFdlIG5lZWQgdGhpcyBvbiB0aGlzIGFyY2hpdGVjdHVyZSBpbiBvcmRlciB0byBpbnZhbGlkYXRlCisgKiB0aGUgbG9jYWwgY2FjaGUgYmVmb3JlIHRlc3RpbmcuCisgKgorICogQ2xvYmJlcnM6IHIzOjAsIHAxOjAKKyAqLworRU5UUlkoX19fcmF3X2JpdF90ZXN0X2FzbSkKKwlyMiA9IHIxOworCXIxID0gMTsKKwlyMSA8PD0gcjI7CisJanVtcCBfX19yYXdfYXRvbWljX3Rlc3RfYXNtCitFTkRQUk9DKF9fX3Jhd19iaXRfdGVzdF9hc20pCisKKy8qCisgKiByMCA9IHB0cgorICoKKyAqIEZldGNoIGFuZCByZXR1cm4gYW4gdW5jYWNoZWQgMzJiaXQgdmFsdWUuCisgKgorICogQ2xvYmJlcnM6IHIyOjAsIHAxOjAKKyAqLworRU5UUlkoX19fcmF3X3VuY2FjaGVkX2ZldGNoX2FzbSkKKwlwMSA9IHIwOworCXIxID0gLUwxX0NBQ0hFX0JZVEVTOworCXIxID0gcjAgJiByMTsKKwlwMCA9IHIxOworCWZsdXNoaW52W3AwXTsKKwlTU1lOQyhyMik7CisJcjAgPSBbcDFdOworCXJ0czsKK0VORFBST0MoX19fcmF3X3VuY2FjaGVkX2ZldGNoX2FzbSkKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9ib2FyZHMvY21fYmY1NjEuYyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9ib2FyZHMvY21fYmY1NjEuYwppbmRleCA4ZjQwOTkwLi42ODgwZDFlIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvYm9hcmRzL2NtX2JmNTYxLmMKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2JvYXJkcy9jbV9iZjU2MS5jCkBAIC0yMzAsNiArMjMwLDE5IEBACiB9OwogI2VuZGlmCiAKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYmZpbl9ncGlvc19yZXNvdXJjZXMgPSB7CisJLnN0YXJ0ID0gMCwKKwkuZW5kICAgPSBNQVhfQkxBQ0tGSU5fR1BJT1MgLSAxLAorCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYmZpbl9ncGlvc19kZXZpY2UgPSB7CisJLm5hbWUgPSAic2ltcGxlLWdwaW8iLAorCS5pZCA9IC0xLAorCS5udW1fcmVzb3VyY2VzID0gMSwKKwkucmVzb3VyY2UgPSAmYmZpbl9ncGlvc19yZXNvdXJjZXMsCit9OworCiAjaWYgZGVmaW5lZChDT05GSUdfVVNCX0lTUDEzNjJfSENEKSB8fCBkZWZpbmVkKENPTkZJR19VU0JfSVNQMTM2Ml9IQ0RfTU9EVUxFKQogc3RhdGljIHN0cnVjdCByZXNvdXJjZSBpc3AxMzYyX2hjZF9yZXNvdXJjZXNbXSA9IHsKIAl7CkBAIC0yODcsMjMgKzMwMCwzMyBAQAogI2VuZGlmCiAKICNpZiBkZWZpbmVkKENPTkZJR19CRklOX1NJUikgfHwgZGVmaW5lZChDT05GSUdfQkZJTl9TSVJfTU9EVUxFKQotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBiZmluX3Npcl9yZXNvdXJjZXNbXSA9IHsKICNpZmRlZiBDT05GSUdfQkZJTl9TSVIwCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGJmaW5fc2lyMF9yZXNvdXJjZXNbXSA9IHsKIAl7CiAJCS5zdGFydCA9IDB4RkZDMDA0MDAsCiAJCS5lbmQgPSAweEZGQzAwNEZGLAogCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKIAl9LAotI2VuZGlmCisJeworCQkuc3RhcnQgPSBJUlFfVUFSVDBfUlgsCisJCS5lbmQgPSBJUlFfVUFSVDBfUlgrMSwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJfSwKKwl7CisJCS5zdGFydCA9IENIX1VBUlQwX1JYLAorCQkuZW5kID0gQ0hfVUFSVDBfUlgrMSwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9ETUEsCisJfSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGJmaW5fc2lyX2RldmljZSA9IHsKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGJmaW5fc2lyMF9kZXZpY2UgPSB7CiAJLm5hbWUgPSAiYmZpbl9zaXIiLAogCS5pZCA9IDAsCi0JLm51bV9yZXNvdXJjZXMgPSBBUlJBWV9TSVpFKGJmaW5fc2lyX3Jlc291cmNlcyksCi0JLnJlc291cmNlID0gYmZpbl9zaXJfcmVzb3VyY2VzLAorCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRShiZmluX3NpcjBfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UgPSBiZmluX3NpcjBfcmVzb3VyY2VzLAogfTsKICNlbmRpZgorI2VuZGlmCiAKICNpZiBkZWZpbmVkKENPTkZJR19QQVRBX1BMQVRGT1JNKSB8fCBkZWZpbmVkKENPTkZJR19QQVRBX1BMQVRGT1JNX01PRFVMRSkKICNkZWZpbmUgUEFUQV9JTlQJSVJRX1BGNDYKQEAgLTM4Miw3ICs0MDUsOSBAQAogI2VuZGlmCiAKICNpZiBkZWZpbmVkKENPTkZJR19CRklOX1NJUikgfHwgZGVmaW5lZChDT05GSUdfQkZJTl9TSVJfTU9EVUxFKQotCSZiZmluX3Npcl9kZXZpY2UsCisjaWZkZWYgQ09ORklHX0JGSU5fU0lSMAorCSZiZmluX3NpcjBfZGV2aWNlLAorI2VuZGlmCiAjZW5kaWYKIAogI2lmIGRlZmluZWQoQ09ORklHX1VTQl9JU1AxMzYyX0hDRCkgfHwgZGVmaW5lZChDT05GSUdfVVNCX0lTUDEzNjJfSENEX01PRFVMRSkKQEAgLTQwMCw2ICs0MjUsOCBAQAogI2lmIGRlZmluZWQoQ09ORklHX1BBVEFfUExBVEZPUk0pIHx8IGRlZmluZWQoQ09ORklHX1BBVEFfUExBVEZPUk1fTU9EVUxFKQogCSZiZmluX3BhdGFfZGV2aWNlLAogI2VuZGlmCisKKwkmYmZpbl9ncGlvc19kZXZpY2UsCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBjbV9iZjU2MV9pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvYm9hcmRzL2V6a2l0LmMgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvYm9hcmRzL2V6a2l0LmMKaW5kZXggNTBiNGNkYy4uMGUyMTc4YSAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2JvYXJkcy9lemtpdC5jCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9ib2FyZHMvZXpraXQuYwpAQCAtNDMsNTMgKzQzLDQyIEBACiAvKgogICogTmFtZSB0aGUgQm9hcmQgZm9yIHRoZSAvcHJvYy9jcHVpbmZvCiAgKi8KLWNvbnN0IGNoYXIgYmZpbl9ib2FyZF9uYW1lW10gPSAiQUREUy1CRjU2MS1FWktJVCI7Ci0KLSNkZWZpbmUgSVNQMTc2MV9CQVNFICAgICAgIDB4MkMwRjAwMDAKLSNkZWZpbmUgSVNQMTc2MV9JUlEgICAgICAgIElSUV9QRjEwCitjb25zdCBjaGFyIGJmaW5fYm9hcmRfbmFtZVtdID0gIkFESSBCRjU2MS1FWktJVCI7CiAKICNpZiBkZWZpbmVkKENPTkZJR19VU0JfSVNQMTc2MF9IQ0QpIHx8IGRlZmluZWQoQ09ORklHX1VTQl9JU1AxNzYwX0hDRF9NT0RVTEUpCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIGJmaW5faXNwMTc2MV9yZXNvdXJjZXNbXSA9IHsKLQl7Ci0JCS5uYW1lCT0gImlzcDE3NjEtcmVncyIsCi0JCS5zdGFydCAgPSBJU1AxNzYxX0JBU0UgKyAweDAwMDAwMDAwLAotCQkuZW5kICAgID0gSVNQMTc2MV9CQVNFICsgMHgwMDBmZmZmZiwKKyNpbmNsdWRlIDxsaW51eC91c2IvaXNwMTc2MC5oPgorc3RhdGljIHN0cnVjdCByZXNvdXJjZSBiZmluX2lzcDE3NjBfcmVzb3VyY2VzW10gPSB7CisJWzBdID0geworCQkuc3RhcnQgID0gMHgyQzBGMDAwMCwKKwkJLmVuZCAgICA9IDB4MjAzQzAwMDAgKyAweGZmZmZmLAogCQkuZmxhZ3MgID0gSU9SRVNPVVJDRV9NRU0sCiAJfSwKLQl7Ci0JCS5zdGFydCAgPSBJU1AxNzYxX0lSUSwKLQkJLmVuZCAgICA9IElTUDE3NjFfSVJRLAorCVsxXSA9IHsKKwkJLnN0YXJ0ICA9IElSUV9QRjEwLAorCQkuZW5kICAgID0gSVJRX1BGMTAsCiAJCS5mbGFncyAgPSBJT1JFU09VUkNFX0lSUSwKIAl9LAogfTsKIAotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYmZpbl9pc3AxNzYxX2RldmljZSA9IHsKLQkubmFtZSAgICAgICAgICAgPSAiaXNwMTc2MSIsCitzdGF0aWMgc3RydWN0IGlzcDE3NjBfcGxhdGZvcm1fZGF0YSBpc3AxNzYwX3ByaXYgPSB7CisJLmlzX2lzcDE3NjEgPSAwLAorCS5wb3J0MV9kaXNhYmxlID0gMCwKKwkuYnVzX3dpZHRoXzE2ID0gMSwKKwkucG9ydDFfb3RnID0gMCwKKwkuYW5hbG9nX29jID0gMCwKKwkuZGFja19wb2xhcml0eV9oaWdoID0gMCwKKwkuZHJlcV9wb2xhcml0eV9oaWdoID0gMCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGJmaW5faXNwMTc2MF9kZXZpY2UgPSB7CisJLm5hbWUgICAgICAgICAgID0gImlzcDE3NjAtaGNkIiwKIAkuaWQgICAgICAgICAgICAgPSAwLAotCS5udW1fcmVzb3VyY2VzICA9IEFSUkFZX1NJWkUoYmZpbl9pc3AxNzYxX3Jlc291cmNlcyksCi0JLnJlc291cmNlICAgICAgID0gYmZpbl9pc3AxNzYxX3Jlc291cmNlcywKKwkuZGV2ID0geworCQkucGxhdGZvcm1fZGF0YSA9ICZpc3AxNzYwX3ByaXYsCisJfSwKKwkubnVtX3Jlc291cmNlcyAgPSBBUlJBWV9TSVpFKGJmaW5faXNwMTc2MF9yZXNvdXJjZXMpLAorCS5yZXNvdXJjZSAgICAgICA9IGJmaW5faXNwMTc2MF9yZXNvdXJjZXMsCiB9OwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqYmZpbl9pc3AxNzYxX2RldmljZXNbXSA9IHsKLQkmYmZpbl9pc3AxNzYxX2RldmljZSwKLX07Ci0KLWludCBfX2luaXQgYmZpbl9pc3AxNzYxX2luaXQodm9pZCkKLXsKLQl1bnNpZ25lZCBpbnQgbnVtX2RldmljZXMgPSBBUlJBWV9TSVpFKGJmaW5faXNwMTc2MV9kZXZpY2VzKTsKLQotCXByaW50ayhLRVJOX0lORk8gIiVzKCk6IHJlZ2lzdGVyaW5nIGRldmljZSByZXNvdXJjZXNcbiIsIF9fZnVuY19fKTsKLQlzZXRfaXJxX3R5cGUoSVNQMTc2MV9JUlEsIElSUUZfVFJJR0dFUl9GQUxMSU5HKTsKLQotCXJldHVybiBwbGF0Zm9ybV9hZGRfZGV2aWNlcyhiZmluX2lzcDE3NjFfZGV2aWNlcywgbnVtX2RldmljZXMpOwotfQotCi12b2lkIF9fZXhpdCBiZmluX2lzcDE3NjFfZXhpdCh2b2lkKQotewotCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKCZiZmluX2lzcDE3NjFfZGV2aWNlKTsKLX0KLQotYXJjaF9pbml0Y2FsbChiZmluX2lzcDE3NjFfaW5pdCk7CiAjZW5kaWYKIAogI2lmIGRlZmluZWQoQ09ORklHX1VTQl9JU1AxMzYyX0hDRCkgfHwgZGVmaW5lZChDT05GSUdfVVNCX0lTUDEzNjJfSENEX01PRFVMRSkKQEAgLTIyMSwyMyArMjEwLDMzIEBACiAjZW5kaWYKIAogI2lmIGRlZmluZWQoQ09ORklHX0JGSU5fU0lSKSB8fCBkZWZpbmVkKENPTkZJR19CRklOX1NJUl9NT0RVTEUpCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIGJmaW5fc2lyX3Jlc291cmNlc1tdID0gewogI2lmZGVmIENPTkZJR19CRklOX1NJUjAKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYmZpbl9zaXIwX3Jlc291cmNlc1tdID0gewogCXsKIAkJLnN0YXJ0ID0gMHhGRkMwMDQwMCwKIAkJLmVuZCA9IDB4RkZDMDA0RkYsCiAJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAogCX0sCi0jZW5kaWYKKwl7CisJCS5zdGFydCA9IElSUV9VQVJUMF9SWCwKKwkJLmVuZCA9IElSUV9VQVJUMF9SWCsxLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorCXsKKwkJLnN0YXJ0ID0gQ0hfVUFSVDBfUlgsCisJCS5lbmQgPSBDSF9VQVJUMF9SWCsxLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0RNQSwKKwl9LAogfTsKIAotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYmZpbl9zaXJfZGV2aWNlID0geworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYmZpbl9zaXIwX2RldmljZSA9IHsKIAkubmFtZSA9ICJiZmluX3NpciIsCiAJLmlkID0gMCwKLQkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUoYmZpbl9zaXJfcmVzb3VyY2VzKSwKLQkucmVzb3VyY2UgPSBiZmluX3Npcl9yZXNvdXJjZXMsCisJLm51bV9yZXNvdXJjZXMgPSBBUlJBWV9TSVpFKGJmaW5fc2lyMF9yZXNvdXJjZXMpLAorCS5yZXNvdXJjZSA9IGJmaW5fc2lyMF9yZXNvdXJjZXMsCiB9OwogI2VuZGlmCisjZW5kaWYKIAogI2lmIGRlZmluZWQoQ09ORklHX01URF9QSFlTTUFQKSB8fCBkZWZpbmVkKENPTkZJR19NVERfUEhZU01BUF9NT0RVTEUpCiBzdGF0aWMgc3RydWN0IG10ZF9wYXJ0aXRpb24gZXpraXRfcGFydGl0aW9uc1tdID0gewpAQCAtNDQ5LDYgKzQ0OCwxMCBAQAogCSZuZXQyMjcyX2JmaW5fZGV2aWNlLAogI2VuZGlmCiAKKyNpZiBkZWZpbmVkKENPTkZJR19VU0JfSVNQMTc2MF9IQ0QpIHx8IGRlZmluZWQoQ09ORklHX1VTQl9JU1AxNzYwX0hDRF9NT0RVTEUpCisJJmJmaW5faXNwMTc2MF9kZXZpY2UsCisjZW5kaWYKKwogI2lmIGRlZmluZWQoQ09ORklHX1NQSV9CRklOKSB8fCBkZWZpbmVkKENPTkZJR19TUElfQkZJTl9NT0RVTEUpCiAJJmJmaW5fc3BpMF9kZXZpY2UsCiAjZW5kaWYKQEAgLTQ1OCw3ICs0NjEsOSBAQAogI2VuZGlmCiAKICNpZiBkZWZpbmVkKENPTkZJR19CRklOX1NJUikgfHwgZGVmaW5lZChDT05GSUdfQkZJTl9TSVJfTU9EVUxFKQotCSZiZmluX3Npcl9kZXZpY2UsCisjaWZkZWYgQ09ORklHX0JGSU5fU0lSMAorCSZiZmluX3NpcjBfZGV2aWNlLAorI2VuZGlmCiAjZW5kaWYKIAogI2lmIGRlZmluZWQoQ09ORklHX0tFWUJPQVJEX0dQSU8pIHx8IGRlZmluZWQoQ09ORklHX0tFWUJPQVJEX0dQSU9fTU9EVUxFKQpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2JvYXJkcy9nZW5lcmljX2JvYXJkLmMgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvYm9hcmRzL2dlbmVyaWNfYm9hcmQuYwppbmRleCAyZmFhMDA3Li4wYmEzNjZhIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvYm9hcmRzL2dlbmVyaWNfYm9hcmQuYworKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvYm9hcmRzL2dlbmVyaWNfYm9hcmQuYwpAQCAtNjIsMTAgKzYyLDQ1IEBACiB9OwogI2VuZGlmCiAKKyNpZiBkZWZpbmVkKENPTkZJR19CRklOX1NJUikgfHwgZGVmaW5lZChDT05GSUdfQkZJTl9TSVJfTU9EVUxFKQorI2lmZGVmIENPTkZJR19CRklOX1NJUjAKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYmZpbl9zaXIwX3Jlc291cmNlc1tdID0geworCXsKKwkJLnN0YXJ0ID0gMHhGRkMwMDQwMCwKKwkJLmVuZCA9IDB4RkZDMDA0RkYsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJeworCQkuc3RhcnQgPSBJUlFfVUFSVDBfUlgsCisJCS5lbmQgPSBJUlFfVUFSVDBfUlgrMSwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJfSwKKwl7CisJCS5zdGFydCA9IENIX1VBUlQwX1JYLAorCQkuZW5kID0gQ0hfVUFSVDBfUlgrMSwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9ETUEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGJmaW5fc2lyMF9kZXZpY2UgPSB7CisJLm5hbWUgPSAiYmZpbl9zaXIiLAorCS5pZCA9IDAsCisJLm51bV9yZXNvdXJjZXMgPSBBUlJBWV9TSVpFKGJmaW5fc2lyMF9yZXNvdXJjZXMpLAorCS5yZXNvdXJjZSA9IGJmaW5fc2lyMF9yZXNvdXJjZXMsCit9OworI2VuZGlmCisjZW5kaWYKKwogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmdlbmVyaWNfYm9hcmRfZGV2aWNlc1tdIF9faW5pdGRhdGEgPSB7CiAjaWYgZGVmaW5lZChDT05GSUdfU01DOTFYKSB8fCBkZWZpbmVkKENPTkZJR19TTUM5MVhfTU9EVUxFKQogCSZzbWM5MXhfZGV2aWNlLAogI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19CRklOX1NJUikgfHwgZGVmaW5lZChDT05GSUdfQkZJTl9TSVJfTU9EVUxFKQorI2lmZGVmIENPTkZJR19CRklOX1NJUjAKKwkmYmZpbl9zaXIwX2RldmljZSwKKyNlbmRpZgorI2VuZGlmCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBnZW5lcmljX2JvYXJkX2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9ib2FyZHMvdGVwbGEuYyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9ib2FyZHMvdGVwbGEuYwppbmRleCBjOTE3NGIzLi42Zjc3ZGJlIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvYm9hcmRzL3RlcGxhLmMKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2JvYXJkcy90ZXBsYS5jCkBAIC00NCw4ICs0NCw0MiBAQAogCS5yZXNvdXJjZSAgICAgID0gc21jOTF4X3Jlc291cmNlcywKIH07CiAKKyNpZiBkZWZpbmVkKENPTkZJR19CRklOX1NJUikgfHwgZGVmaW5lZChDT05GSUdfQkZJTl9TSVJfTU9EVUxFKQorI2lmZGVmIENPTkZJR19CRklOX1NJUjAKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYmZpbl9zaXIwX3Jlc291cmNlc1tdID0geworCXsKKwkJLnN0YXJ0ID0gMHhGRkMwMDQwMCwKKwkJLmVuZCA9IDB4RkZDMDA0RkYsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJeworCQkuc3RhcnQgPSBJUlFfVUFSVDBfUlgsCisJCS5lbmQgPSBJUlFfVUFSVDBfUlgrMSwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJfSwKKwl7CisJCS5zdGFydCA9IENIX1VBUlQwX1JYLAorCQkuZW5kID0gQ0hfVUFSVDBfUlgrMSwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9ETUEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGJmaW5fc2lyMF9kZXZpY2UgPSB7CisJLm5hbWUgPSAiYmZpbl9zaXIiLAorCS5pZCA9IDAsCisJLm51bV9yZXNvdXJjZXMgPSBBUlJBWV9TSVpFKGJmaW5fc2lyMF9yZXNvdXJjZXMpLAorCS5yZXNvdXJjZSA9IGJmaW5fc2lyMF9yZXNvdXJjZXMsCit9OworI2VuZGlmCisjZW5kaWYKKwogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnRlcGxhX2RldmljZXNbXSBfX2luaXRkYXRhID0gewogCSZzbWM5MXhfZGV2aWNlLAorI2lmIGRlZmluZWQoQ09ORklHX0JGSU5fU0lSKSB8fCBkZWZpbmVkKENPTkZJR19CRklOX1NJUl9NT0RVTEUpCisjaWZkZWYgQ09ORklHX0JGSU5fU0lSMAorCSZiZmluX3NpcjBfZGV2aWNlLAorI2VuZGlmCisjZW5kaWYKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IHRlcGxhX2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9kbWEuYyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9kbWEuYwppbmRleCAyNDQxNWViLi40MmIwMDM3IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvZG1hLmMKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2RtYS5jCkBAIC0zMSw3ICszMSw3IEBACiAjaW5jbHVkZSA8YXNtL2JsYWNrZmluLmg+CiAjaW5jbHVkZSA8YXNtL2RtYS5oPgogCi1zdHJ1Y3QgZG1hX3JlZ2lzdGVyICpkbWFfaW9fYmFzZV9hZGRyW01BWF9CTEFDS0ZJTl9ETUFfQ0hBTk5FTF0gPSB7CitzdHJ1Y3QgZG1hX3JlZ2lzdGVyICpkbWFfaW9fYmFzZV9hZGRyW01BWF9ETUFfQ0hBTk5FTFNdID0gewogCShzdHJ1Y3QgZG1hX3JlZ2lzdGVyICopIERNQTFfMF9ORVhUX0RFU0NfUFRSLAogCShzdHJ1Y3QgZG1hX3JlZ2lzdGVyICopIERNQTFfMV9ORVhUX0RFU0NfUFRSLAogCShzdHJ1Y3QgZG1hX3JlZ2lzdGVyICopIERNQTFfMl9ORVhUX0RFU0NfUFRSLApkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2hlYWQuUyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9oZWFkLlMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxYTc3N2EuLjAwMDAwMDAKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2hlYWQuUworKysgL2Rldi9udWxsCkBAIC0xLDEzNiArMCwwIEBACi0vKgotICogRmlsZTogICAgICAgICBhcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvaGVhZC5TCi0gKiBCYXNlZCBvbjogICAgIGFyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9oZWFkLlMKLSAqIEF1dGhvcjoKLSAqCi0gKiBDcmVhdGVkOgotICogRGVzY3JpcHRpb246ICBCRjU2MSBzdGFydHVwIGZpbGUKLSAqCi0gKiBNb2RpZmllZDoKLSAqICAgICAgICAgICAgICAgQ29weXJpZ2h0IDIwMDQtMjAwNiBBbmFsb2cgRGV2aWNlcyBJbmMuCi0gKgotICogQnVnczogICAgICAgICBFbnRlciBidWdzIGF0IGh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZy8KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSB0aGUgZmlsZSBDT1BZSU5HLCBvciB3cml0ZQotICogdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAqIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8YXNtL2JsYWNrZmluLmg+Ci0jaWZkZWYgQ09ORklHX0JGSU5fS0VSTkVMX0NMT0NLCi0jaW5jbHVkZSA8YXNtL2Nsb2Nrcy5oPgotI2luY2x1ZGUgPG1hY2gvbWVtX2luaXQuaD4KLSNlbmRpZgotCi0uc2VjdGlvbiAubDEudGV4dAotI2lmZGVmIENPTkZJR19CRklOX0tFUk5FTF9DTE9DSwotRU5UUlkoX3N0YXJ0X2RtYV9jb2RlKQotCXAwLmggPSBoaShTSUNBX0lXUjApOwotCXAwLmwgPSBsbyhTSUNBX0lXUjApOwotCXIwLmwgPSAweDE7Ci0JW3AwXSA9IHIwOwotCVNTWU5DOwotCi0JLyoKLQkgKiAgU2V0IFBMTF9DVEwKLQkgKiAgIC0gWzE0OjA5XSA9IE1TRUxbNTowXSA6IENMS0lOIC8gVkNPIG11bHRpcGxpY2F0aW9uIGZhY3RvcnMKLQkgKiAgIC0gWzhdICAgICA9IEJZUEFTUyAgICA6IEJZUEFTUyB0aGUgUExMLCBydW4gQ0xLSU4gaW50byBDQ0xLL1NDTEsKLQkgKiAgIC0gWzddICAgICA9IG91dHB1dCBkZWxheSAoYWRkIDIwMHBzIG9mIGRlbGF5IHRvIG1lbSBzaWduYWxzKQotCSAqICAgLSBbNl0gICAgID0gaW5wdXQgZGVsYXkgKGFkZCAyMDBwcyBvZiBpbnB1dCBkZWxheSB0byBtZW0gc2lnbmFscykKLQkgKiAgIC0gWzVdICAgICA9IFBEV04gICAgICA6IDE9QWxsIENsb2NrcyBvZmYKLQkgKiAgIC0gWzNdICAgICA9IFNUT1BDSyAgICA6IDE9Q29yZSBDbG9jayBvZmYKLQkgKiAgIC0gWzFdICAgICA9IFBMTF9PRkYgICA6IDE9RGlzYWJsZSBQb3dlciB0byBQTEwKLQkgKiAgIC0gWzBdICAgICA9IERGICAgICAgICA6IDE9UGFzcyBDTEtJTi8yIHRvIFBMTCAvIDA9UGFzcyBDTEtJTiB0byBQTEwKLQkgKiAgIGFsbCBvdGhlciBiaXRzIHNldCB0byB6ZXJvCi0JICovCi0KLQlwMC5oID0gaGkoUExMX0xPQ0tDTlQpOwotCXAwLmwgPSBsbyhQTExfTE9DS0NOVCk7Ci0JcjAgPSAweDMwMChaKTsKLQl3W3AwXSA9IHIwLmw7Ci0Jc3N5bmM7Ci0KLQlQMi5IID0gaGkoRUJJVV9TREdDVEwpOwotCVAyLkwgPSBsbyhFQklVX1NER0NUTCk7Ci0JUjAgPSBbUDJdOwotCUJJVFNFVCAoUjAsIDI0KTsKLQlbUDJdID0gUjA7Ci0JU1NZTkM7Ci0KLQlyMCA9IENPTkZJR19WQ09fTVVMVCAmIDYzOyAgICAgICAvKiBMb2FkIHRoZSBWQ08gbXVsdGlwbGllciAgICAgICAgICovCi0JcjAgPSByMCA8PCA5OyAgICAgICAgICAgICAgICAgICAgLyogU2hpZnQgaXQgb3ZlciwgICAgICAgICAgICAgICAgICAqLwotCXIxID0gQ0xLSU5fSEFMRjsgICAgICAgICAgICAgICAgIC8qIERvIHdlIG5lZWQgdG8gZGl2aWRlIENMS0lOIGJ5IDI/Ki8KLQlyMCA9IHIxIHwgcjA7Ci0JcjEgPSBQTExfQllQQVNTOyAgICAgICAgICAgICAgICAgLyogQnlwYXNzIHRoZSBQTEw/ICAgICAgICAgICAgICAgICAqLwotCXIxID0gcjEgPDwgODsgICAgICAgICAgICAgICAgICAgIC8qIFNoaWZ0IGl0IG92ZXIgICAgICAgICAgICAgICAgICAgKi8KLQlyMCA9IHIxIHwgcjA7ICAgICAgICAgICAgICAgICAgICAvKiBhZGQgdGhlbSBhbGwgdG9nZXRoZXIgICAgICAgICAgICovCi0jaWZkZWYgQU5PTUFMWV8wNTAwMDI2NQotCUJJVFNFVChyMCwgMTUpOyAgICAgICAgICAgICAgICAgIC8qIEFkZCAyNTAgbVYgb2YgaHlzdGVyZXNpcyB0byBTUE9SVCBpbnB1dCBwaW5zICovCi0jZW5kaWYKLQotCXAwLmggPSBoaShQTExfQ1RMKTsKLQlwMC5sID0gbG8oUExMX0NUTCk7ICAgICAgICAgICAgICAvKiBMb2FkIHRoZSBhZGRyZXNzICAgICAgICAgICAgICAgICovCi0JY2xpIHIyOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGlzYWJsZSBpbnRlcnJ1cHRzICAgICAgICAgICAgICAqLwotCXNzeW5jOwotCXdbcDBdID0gcjAubDsgICAgICAgICAgICAgICAgICAgIC8qIFNldCB0aGUgdmFsdWUgICAgICAgICAgICAgICAgICAgKi8KLQlpZGxlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBXYWl0IGZvciB0aGUgUExMIHRvIHN0YWJsaXplICAgICovCi0Jc3RpIHIyOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRW5hYmxlIGludGVycnVwdHMgICAgICAgICAgICAgICAqLwotCi0uTGNoZWNrX2FnYWluOgotCXAwLmggPSBoaShQTExfU1RBVCk7Ci0JcDAubCA9IGxvKFBMTF9TVEFUKTsKLQlSMCA9IFdbUDBdKFopOwotCUNDID0gQklUVFNUKFIwLDUpOwotCWlmICEgQ0MganVtcCAuTGNoZWNrX2FnYWluOwotCi0JLyogQ29uZmlndXJlIFNDTEsgJiBDQ0xLIERpdmlkZXJzICovCi0JcjAgPSAoQ09ORklHX0NDTEtfQUNUX0RJViB8IENPTkZJR19TQ0xLX0RJVik7Ci0JcDAuaCA9IGhpKFBMTF9ESVYpOwotCXAwLmwgPSBsbyhQTExfRElWKTsKLQl3W3AwXSA9IHIwLmw7Ci0Jc3N5bmM7Ci0KLQlwMC5sID0gbG8oRUJJVV9TRFJSQyk7Ci0JcDAuaCA9IGhpKEVCSVVfU0RSUkMpOwotCXIwID0gbWVtX1NEUlJDOwotCXdbcDBdID0gcjAubDsKLQlzc3luYzsKLQotCVAyLkggPSBoaShFQklVX1NER0NUTCk7Ci0JUDIuTCA9IGxvKEVCSVVfU0RHQ1RMKTsKLQlSMCA9IFtQMl07Ci0JQklUQ0xSIChSMCwgMjQpOwotCXAwLmggPSBoaShFQklVX1NEU1RBVCk7Ci0JcDAubCA9IGxvKEVCSVVfU0RTVEFUKTsKLQlyMi5sID0gd1twMF07Ci0JY2MgPSBiaXR0c3QocjIsMyk7Ci0JaWYgIWNjIGp1bXAgLkxza2lwOwotCU5PUDsKLQlCSVRTRVQgKFIwLCAyMyk7Ci0uTHNraXA6Ci0JW1AyXSA9IFIwOwotCVNTWU5DOwotCi0JUjAuTCA9IGxvKG1lbV9TREdDVEwpOwotCVIwLkggPSBoaShtZW1fU0RHQ1RMKTsKLQlSMSA9IFtwMl07Ci0JUjEgPSBSMSB8IFIwOwotCVtQMl0gPSBSMTsKLQlTU1lOQzsKLQotCVJUUzsKLUVORFBST0MoX3N0YXJ0X2RtYV9jb2RlKQotI2VuZGlmIC8qIENPTkZJR19CRklOX0tFUk5FTF9DTE9DSyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2luY2x1ZGUvbWFjaC9hbm9tYWx5LmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvaW5jbHVkZS9tYWNoL2Fub21hbHkuaAppbmRleCAyMjk5MGRmLi4xYTllMTc1IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvaW5jbHVkZS9tYWNoL2Fub21hbHkuaAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvaW5jbHVkZS9tYWNoL2Fub21hbHkuaApAQCAtNyw3ICs3LDcgQEAKICAqLwogCiAvKiBUaGlzIGZpbGUgc2hvdWxlIGJlIHVwIHRvIGRhdGUgd2l0aDoKLSAqICAtIFJldmlzaW9uIFAsIDAyLzA4LzIwMDg7IEFEU1AtQkY1NjEgQmxhY2tmaW4gUHJvY2Vzc29yIEFub21hbHkgTGlzdAorICogIC0gUmV2aXNpb24gUSwgMTEvMDcvMjAwODsgQURTUC1CRjU2MSBCbGFja2ZpbiBQcm9jZXNzb3IgQW5vbWFseSBMaXN0CiAgKi8KIAogI2lmbmRlZiBfTUFDSF9BTk9NQUxZX0hfCkBAIC0yNjQsNiArMjY0LDE4IEBACiAjZGVmaW5lIEFOT01BTFlfMDUwMDAzNzEgKDEpCiAvKiBMZXZlbC1TZW5zaXRpdmUgRXh0ZXJuYWwgR1BJTyBXYWtldXBzIE1heSBDYXVzZSBJbmRlZmluaXRlIFN0YWxsICovCiAjZGVmaW5lIEFOT01BTFlfMDUwMDA0MDMgKDEpCisvKiBURVNUU0VUIEluc3RydWN0aW9uIENhdXNlcyBEYXRhIENvcnJ1cHRpb24gd2l0aCBXcml0ZWJhY2sgRGF0YSBDYWNoZSBFbmFibGVkICovCisjZGVmaW5lIEFOT01BTFlfMDUwMDA0MTIgKDEpCisvKiBTcGVjdWxhdGl2ZSBGZXRjaGVzIENhbiBDYXVzZSBVbmRlc2lyZWQgRXh0ZXJuYWwgRklGTyBPcGVyYXRpb25zICovCisjZGVmaW5lIEFOT01BTFlfMDUwMDA0MTYgKDEpCisvKiBNdWx0aWNoYW5uZWwgU1BPUlQgQ2hhbm5lbCBNaXNhbGlnbm1lbnQgVW5kZXIgU3BlY2lmaWMgQ29uZmlndXJhdGlvbiAqLworI2RlZmluZSBBTk9NQUxZXzA1MDAwNDI1ICgxKQorLyogU3BlY3VsYXRpdmUgRmV0Y2hlcyBvZiBJbmRpcmVjdC1Qb2ludGVyIEluc3RydWN0aW9ucyBDYW4gQ2F1c2UgRmFsc2UgSGFyZHdhcmUgRXJyb3JzICovCisjZGVmaW5lIEFOT01BTFlfMDUwMDA0MjYgKDEpCisvKiBMb3N0L0NvcnJ1cHRlZCBMMi9MMyBNZW1vcnkgV3JpdGUgYWZ0ZXIgU3BlY3VsYXRpdmUgTDIgTWVtb3J5IFJlYWQgYnkgQ29yZSBCICovCisjZGVmaW5lIEFOT01BTFlfMDUwMDA0MjggKF9fU0lMSUNPTl9SRVZJU0lPTl9fID4gMykKKy8qIElGTFVTSCBJbnN0cnVjdGlvbiBhdCBFbmQgb2YgSGFyZHdhcmUgTG9vcCBDYXVzZXMgSW5maW5pdGUgU3RhbGwgKi8KKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDQ0MyAoMSkKIAogLyogQW5vbWFsaWVzIHRoYXQgZG9uJ3QgZXhpc3Qgb24gdGhpcyBwcm9jICovCiAjZGVmaW5lIEFOT01BTFlfMDUwMDAxNTggKDApCkBAIC0yNzIsNSArMjg0LDcgQEAKICNkZWZpbmUgQU5PTUFMWV8wNTAwMDMxMSAoMCkKICNkZWZpbmUgQU5PTUFMWV8wNTAwMDM1MyAoMSkKICNkZWZpbmUgQU5PTUFMWV8wNTAwMDM4NiAoMSkKKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDQzMiAoMCkKKyNkZWZpbmUgQU5PTUFMWV8wNTAwMDQzNSAoMCkKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvaW5jbHVkZS9tYWNoL2JmNTYxLmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvaW5jbHVkZS9tYWNoL2JmNTYxLmgKaW5kZXggMThiMWIzYS4uOTk2ODM2MiAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2luY2x1ZGUvbWFjaC9iZjU2MS5oCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9pbmNsdWRlL21hY2gvYmY1NjEuaApAQCAtMjE1LDcgKzIxNSw3IEBACiAjZW5kaWYKIAogI2lmbmRlZiBDUFUKLSNlcnJvciBVbmtub3duIENQVSB0eXBlIC0gVGhpcyBrZXJuZWwgZG9lc24ndCBzZWVtIHRvIGJlIGNvbmZpZ3VyZWQgcHJvcGVybHkKKyNlcnJvciAiVW5rbm93biBDUFUgdHlwZSAtIFRoaXMga2VybmVsIGRvZXNuJ3Qgc2VlbSB0byBiZSBjb25maWd1cmVkIHByb3Blcmx5IgogI2VuZGlmCiAKICNlbmRpZgkJCQkvKiBfX01BQ0hfQkY1NjFfSF9fICAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2luY2x1ZGUvbWFjaC9iZmluX3Npci5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2luY2x1ZGUvbWFjaC9iZmluX3Npci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YmI4N2U5Li4wMDAwMDAwCi0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9pbmNsdWRlL21hY2gvYmZpbl9zaXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi0vKgotICogQmxhY2tmaW4gSW5mcmEtcmVkIERyaXZlcgotICoKLSAqIENvcHlyaWdodCAyMDA2LTIwMDggQW5hbG9nIERldmljZXMgSW5jLgotICoKLSAqIEVudGVyIGJ1Z3MgYXQgaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnLwotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L3NlcmlhbC5oPgotI2luY2x1ZGUgPGFzbS9kbWEuaD4KLSNpbmNsdWRlIDxhc20vcG9ydG11eC5oPgotCi0jZGVmaW5lIFNJUl9VQVJUX0dFVF9DSEFSKHBvcnQpICAgYmZpbl9yZWFkMTYoKHBvcnQpLT5tZW1iYXNlICsgT0ZGU0VUX1JCUikKLSNkZWZpbmUgU0lSX1VBUlRfR0VUX0RMTChwb3J0KSAgICBiZmluX3JlYWQxNigocG9ydCktPm1lbWJhc2UgKyBPRkZTRVRfRExMKQotI2RlZmluZSBTSVJfVUFSVF9HRVRfSUVSKHBvcnQpICAgIGJmaW5fcmVhZDE2KChwb3J0KS0+bWVtYmFzZSArIE9GRlNFVF9JRVIpCi0jZGVmaW5lIFNJUl9VQVJUX0dFVF9ETEgocG9ydCkgICAgYmZpbl9yZWFkMTYoKHBvcnQpLT5tZW1iYXNlICsgT0ZGU0VUX0RMSCkKLSNkZWZpbmUgU0lSX1VBUlRfR0VUX0lJUihwb3J0KSAgICBiZmluX3JlYWQxNigocG9ydCktPm1lbWJhc2UgKyBPRkZTRVRfSUlSKQotI2RlZmluZSBTSVJfVUFSVF9HRVRfTENSKHBvcnQpICAgIGJmaW5fcmVhZDE2KChwb3J0KS0+bWVtYmFzZSArIE9GRlNFVF9MQ1IpCi0jZGVmaW5lIFNJUl9VQVJUX0dFVF9HQ1RMKHBvcnQpICAgYmZpbl9yZWFkMTYoKHBvcnQpLT5tZW1iYXNlICsgT0ZGU0VUX0dDVEwpCi0KLSNkZWZpbmUgU0lSX1VBUlRfUFVUX0NIQVIocG9ydCwgdikgYmZpbl93cml0ZTE2KCgocG9ydCktPm1lbWJhc2UgKyBPRkZTRVRfVEhSKSwgdikKLSNkZWZpbmUgU0lSX1VBUlRfUFVUX0RMTChwb3J0LCB2KSAgYmZpbl93cml0ZTE2KCgocG9ydCktPm1lbWJhc2UgKyBPRkZTRVRfRExMKSwgdikKLSNkZWZpbmUgU0lSX1VBUlRfUFVUX0lFUihwb3J0LCB2KSAgYmZpbl93cml0ZTE2KCgocG9ydCktPm1lbWJhc2UgKyBPRkZTRVRfSUVSKSwgdikKLSNkZWZpbmUgU0lSX1VBUlRfUFVUX0RMSChwb3J0LCB2KSAgYmZpbl93cml0ZTE2KCgocG9ydCktPm1lbWJhc2UgKyBPRkZTRVRfRExIKSwgdikKLSNkZWZpbmUgU0lSX1VBUlRfUFVUX0xDUihwb3J0LCB2KSAgYmZpbl93cml0ZTE2KCgocG9ydCktPm1lbWJhc2UgKyBPRkZTRVRfTENSKSwgdikKLSNkZWZpbmUgU0lSX1VBUlRfUFVUX0dDVEwocG9ydCwgdikgYmZpbl93cml0ZTE2KCgocG9ydCktPm1lbWJhc2UgKyBPRkZTRVRfR0NUTCksIHYpCi0KLSNpZmRlZiBDT05GSUdfU0lSX0JGSU5fRE1BCi1zdHJ1Y3QgZG1hX3J4X2J1ZiB7Ci0JY2hhciAqYnVmOwotCWludCBoZWFkOwotCWludCB0YWlsOwotCX07Ci0jZW5kaWYgLyogQ09ORklHX1NJUl9CRklOX0RNQSAqLwotCi1zdHJ1Y3QgYmZpbl9zaXJfcG9ydCB7Ci0JdW5zaWduZWQgY2hhciBfX2lvbWVtICAgKm1lbWJhc2U7Ci0JdW5zaWduZWQgaW50ICAgICAgICAgICAgaXJxOwotCXVuc2lnbmVkIGludCAgICAgICAgICAgIGxzcjsKLQl1bnNpZ25lZCBsb25nICAgICAgICAgICBjbGs7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgICAgICAgKmRldjsKLSNpZmRlZiBDT05GSUdfU0lSX0JGSU5fRE1BCi0JaW50ICAgICAgICAgICAgICAgICAgICAgdHhfZG9uZTsKLQlzdHJ1Y3QgZG1hX3J4X2J1ZiAgICAgICByeF9kbWFfYnVmOwotCXN0cnVjdCB0aW1lcl9saXN0ICAgICAgIHJ4X2RtYV90aW1lcjsKLQlpbnQgICAgICAgICAgICAgICAgICAgICByeF9kbWFfbnJvd3M7Ci0jZW5kaWYgLyogQ09ORklHX1NJUl9CRklOX0RNQSAqLwotCXVuc2lnbmVkIGludCAgICAgICAgICAgIHR4X2RtYV9jaGFubmVsOwotCXVuc2lnbmVkIGludCAgICAgICAgICAgIHJ4X2RtYV9jaGFubmVsOwotfTsKLQotc3RydWN0IGJmaW5fc2lyX3BvcnQgc2lyX3BvcnRzW0JGSU5fVUFSVF9OUl9QT1JUU107Ci0KLXN0cnVjdCBiZmluX3Npcl9wb3J0X3JlcyB7Ci0JdW5zaWduZWQgbG9uZyAgIGJhc2VfYWRkcjsKLQlpbnQgICAgICAgICAgICAgaXJxOwotCXVuc2lnbmVkIGludCAgICByeF9kbWFfY2hhbm5lbDsKLQl1bnNpZ25lZCBpbnQgICAgdHhfZG1hX2NoYW5uZWw7Ci19OwotCi1zdHJ1Y3QgYmZpbl9zaXJfcG9ydF9yZXMgYmZpbl9zaXJfcG9ydF9yZXNvdXJjZVtdID0gewotI2lmZGVmIENPTkZJR19CRklOX1NJUjAKLQl7Ci0JMHhGRkMwMDQwMCwKLQlJUlFfVUFSVF9SWCwKLQlDSF9VQVJUX1JYLAotCUNIX1VBUlRfVFgsCi0JfSwKLSNlbmRpZgotfTsKLQotaW50IG5yX3NpcnMgPSBBUlJBWV9TSVpFKGJmaW5fc2lyX3BvcnRfcmVzb3VyY2UpOwotCi1zdHJ1Y3QgYmZpbl9zaXJfc2VsZiB7Ci0Jc3RydWN0IGJmaW5fc2lyX3BvcnQgICAgKnNpcl9wb3J0OwotCXNwaW5sb2NrX3QgICAgICAgICAgICAgIGxvY2s7Ci0JdW5zaWduZWQgaW50ICAgICAgICAgICAgb3BlbjsKLQlpbnQgICAgICAgICAgICAgICAgICAgICBzcGVlZDsKLQlpbnQgICAgICAgICAgICAgICAgICAgICBuZXdzcGVlZDsKLQotCXN0cnVjdCBza19idWZmICAgICAgICAgICp0eHNrYjsKLQlzdHJ1Y3Qgc2tfYnVmZiAgICAgICAgICAqcnhza2I7Ci0Jc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7Ci0Jc3RydWN0IGRldmljZSAgICAgICAgICAgKmRldjsKLQlzdHJ1Y3QgaXJsYXBfY2IgICAgICAgICAqaXJsYXA7Ci0Jc3RydWN0IHFvc19pbmZvICAgICAgICAgcW9zOwotCi0JaW9idWZmX3QgICAgICAgICAgICAgICAgdHhfYnVmZjsKLQlpb2J1ZmZfdCAgICAgICAgICAgICAgICByeF9idWZmOwotCi0Jc3RydWN0IHdvcmtfc3RydWN0ICAgICAgd29yazsKLQlpbnQgICAgICAgICAgICAgICAgICAgICBtdHQ7Ci19OwotCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBTSVJfVUFSVF9HRVRfTFNSKHN0cnVjdCBiZmluX3Npcl9wb3J0ICpwb3J0KQotewotCXVuc2lnbmVkIGludCBsc3IgPSBiZmluX3JlYWQxNihwb3J0LT5tZW1iYXNlICsgT0ZGU0VUX0xTUik7Ci0JcG9ydC0+bHNyIHw9IChsc3IgJiAoQkl8RkV8UEV8T0UpKTsKLQlyZXR1cm4gbHNyIHwgcG9ydC0+bHNyOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgU0lSX1VBUlRfQ0xFQVJfTFNSKHN0cnVjdCBiZmluX3Npcl9wb3J0ICpwb3J0KQotewotCXBvcnQtPmxzciA9IDA7Ci0JYmZpbl9yZWFkMTYocG9ydC0+bWVtYmFzZSArIE9GRlNFVF9MU1IpOwotfQotCi0jZGVmaW5lIERSSVZFUl9OQU1FICJiZmluX3NpciIKLQotc3RhdGljIGludCBiZmluX3Npcl9od19pbml0KHZvaWQpCi17Ci0JaW50IHJldCA9IC1FTk9ERVY7Ci0jaWZkZWYgQ09ORklHX0JGSU5fU0lSMAotCXJldCA9IHBlcmlwaGVyYWxfcmVxdWVzdChQX1VBUlQwX1RYLCBEUklWRVJfTkFNRSk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQlyZXQgPSBwZXJpcGhlcmFsX3JlcXVlc3QoUF9VQVJUMF9SWCwgRFJJVkVSX05BTUUpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0jZW5kaWYKLQlyZXR1cm4gcmV0OwotfQpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2luY2x1ZGUvbWFjaC9ibGFja2Zpbi5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2luY2x1ZGUvbWFjaC9ibGFja2Zpbi5oCmluZGV4IDBlYTg2NjYuLmY3OWY2NjI2IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvaW5jbHVkZS9tYWNoL2JsYWNrZmluLmgKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2luY2x1ZGUvbWFjaC9ibGFja2Zpbi5oCkBAIC02Niw4ICs2NiwxMiBAQAogCiAjZGVmaW5lIGJmaW5fcmVhZF9TSUNfSU1BU0soeCkJCWJmaW5fcmVhZDMyKFNJQ0FfSU1BU0swICsgKHggPDwgMikpCiAjZGVmaW5lIGJmaW5fd3JpdGVfU0lDX0lNQVNLKHgsIHZhbCkJYmZpbl93cml0ZTMyKChTSUNBX0lNQVNLMCArICh4IDw8IDIpKSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU0lDQl9JTUFTSyh4KQkJYmZpbl9yZWFkMzIoU0lDQl9JTUFTSzAgKyAoeCA8PCAyKSkKKyNkZWZpbmUgYmZpbl93cml0ZV9TSUNCX0lNQVNLKHgsIHZhbCkJYmZpbl93cml0ZTMyKChTSUNCX0lNQVNLMCArICh4IDw8IDIpKSwgdmFsKQogI2RlZmluZSBiZmluX3JlYWRfU0lDX0lTUih4KQkJYmZpbl9yZWFkMzIoU0lDQV9JU1IwICsgKHggPDwgMikpCiAjZGVmaW5lIGJmaW5fd3JpdGVfU0lDX0lTUih4LCB2YWwpCWJmaW5fd3JpdGUzMigoU0lDQV9JU1IwICsgKHggPDwgMikpLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TSUNCX0lTUih4KQkJYmZpbl9yZWFkMzIoU0lDQl9JU1IwICsgKHggPDwgMikpCisjZGVmaW5lIGJmaW5fd3JpdGVfU0lDQl9JU1IoeCwgdmFsKQliZmluX3dyaXRlMzIoKFNJQ0JfSVNSMCArICh4IDw8IDIpKSwgdmFsKQogCiAjZGVmaW5lIEJGSU5fVUFSVF9OUl9QT1JUUyAgICAgIDEKIApkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2luY2x1ZGUvbWFjaC9jZGVmQkY1NjEuaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9pbmNsdWRlL21hY2gvY2RlZkJGNTYxLmgKaW5kZXggYzE0ZDYzNC4uOTVkNjA5ZiAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2luY2x1ZGUvbWFjaC9jZGVmQkY1NjEuaAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvaW5jbHVkZS9tYWNoL2NkZWZCRjU2MS5oCkBAIC0zOSw2NSArMzksMTUgQEAKIC8qaW5jbHVkZSBjb3JlIHNwZWNpZmljIHJlZ2lzdGVyIHBvaW50ZXIgZGVmaW5pdGlvbnMqLwogI2luY2x1ZGUgPGFzbS9jZGVmX0xQQmxhY2tmaW4uaD4KIAotI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCiAvKiBTeXN0ZW0gTU1SIFJlZ2lzdGVyIE1hcCAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCiAKIC8qIENsb2NrIGFuZCBTeXN0ZW0gQ29udHJvbCAoMHhGRkMwMDAwMCAtIDB4RkZDMDAwRkYpICovCiAjZGVmaW5lIGJmaW5fcmVhZF9QTExfQ1RMKCkgICAgICAgICAgICAgICAgICBiZmluX3JlYWQxNihQTExfQ1RMKQotLyogV3JpdGluZyB0byBQTExfQ1RMIGluaXRpYXRlcyBhIFBMTCByZWxvY2sgc2VxdWVuY2UuICovCi1zdGF0aWMgX19pbmxpbmVfXyB2b2lkIGJmaW5fd3JpdGVfUExMX0NUTCh1bnNpZ25lZCBpbnQgdmFsKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIGl3cjAsIGl3cjE7Ci0KLQlpZiAodmFsID09IGJmaW5fcmVhZF9QTExfQ1RMKCkpCi0JCXJldHVybjsKLQotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQkvKiBFbmFibGUgdGhlIFBMTCBXYWtldXAgYml0IGluIFNJQyBJV1IgKi8KLQlpd3IwID0gYmZpbl9yZWFkMzIoU0lDQV9JV1IwKTsKLQlpd3IxID0gYmZpbl9yZWFkMzIoU0lDQV9JV1IxKTsKLQkvKiBPbmx5IGFsbG93IFBQTCBXYWtldXApICovCi0JYmZpbl93cml0ZTMyKFNJQ0FfSVdSMCwgSVdSX0VOQUJMRSgwKSk7Ci0JYmZpbl93cml0ZTMyKFNJQ0FfSVdSMSwgMCk7Ci0KLQliZmluX3dyaXRlMTYoUExMX0NUTCwgdmFsKTsKLQlTU1lOQygpOwotCWFzbSgiSURMRTsiKTsKLQotCWJmaW5fd3JpdGUzMihTSUNBX0lXUjAsIGl3cjApOwotCWJmaW5fd3JpdGUzMihTSUNBX0lXUjEsIGl3cjEpOwotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLX0KICNkZWZpbmUgYmZpbl9yZWFkX1BMTF9ESVYoKSAgICAgICAgICAgICAgICAgIGJmaW5fcmVhZDE2KFBMTF9ESVYpCiAjZGVmaW5lIGJmaW5fd3JpdGVfUExMX0RJVih2YWwpICAgICAgICAgICAgICBiZmluX3dyaXRlMTYoUExMX0RJVix2YWwpCiAjZGVmaW5lIGJmaW5fcmVhZF9WUl9DVEwoKSAgICAgICAgICAgICAgICAgICBiZmluX3JlYWQxNihWUl9DVEwpCi0vKiBXcml0aW5nIHRvIFZSX0NUTCBpbml0aWF0ZXMgYSBQTEwgcmVsb2NrIHNlcXVlbmNlLiAqLwotc3RhdGljIF9faW5saW5lX18gdm9pZCBiZmluX3dyaXRlX1ZSX0NUTCh1bnNpZ25lZCBpbnQgdmFsKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIGl3cjAsIGl3cjE7Ci0KLQlpZiAodmFsID09IGJmaW5fcmVhZF9WUl9DVEwoKSkKLQkJcmV0dXJuOwotCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCS8qIEVuYWJsZSB0aGUgUExMIFdha2V1cCBiaXQgaW4gU0lDIElXUiAqLwotCWl3cjAgPSBiZmluX3JlYWQzMihTSUNBX0lXUjApOwotCWl3cjEgPSBiZmluX3JlYWQzMihTSUNBX0lXUjEpOwotCS8qIE9ubHkgYWxsb3cgUFBMIFdha2V1cCkgKi8KLQliZmluX3dyaXRlMzIoU0lDQV9JV1IwLCBJV1JfRU5BQkxFKDApKTsKLQliZmluX3dyaXRlMzIoU0lDQV9JV1IxLCAwKTsKLQotCWJmaW5fd3JpdGUxNihWUl9DVEwsIHZhbCk7Ci0JU1NZTkMoKTsKLQlhc20oIklETEU7Iik7Ci0KLQliZmluX3dyaXRlMzIoU0lDQV9JV1IwLCBpd3IwKTsKLQliZmluX3dyaXRlMzIoU0lDQV9JV1IxLCBpd3IxKTsKLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci19CiAjZGVmaW5lIGJmaW5fcmVhZF9QTExfU1RBVCgpICAgICAgICAgICAgICAgICBiZmluX3JlYWQxNihQTExfU1RBVCkKICNkZWZpbmUgYmZpbl93cml0ZV9QTExfU1RBVCh2YWwpICAgICAgICAgICAgIGJmaW5fd3JpdGUxNihQTExfU1RBVCx2YWwpCiAjZGVmaW5lIGJmaW5fcmVhZF9QTExfTE9DS0NOVCgpICAgICAgICAgICAgICBiZmluX3JlYWQxNihQTExfTE9DS0NOVCkKQEAgLTE1NzYsNCArMTUyNiw1NyBAQAogI2RlZmluZSBiZmluX3JlYWRfTURNQV9EMF9TVEFSVF9BRERSKCkgIGJmaW5fcmVhZF9NRE1BMV9EMF9TVEFSVF9BRERSKCkKICNkZWZpbmUgYmZpbl93cml0ZV9NRE1BX0QwX1NUQVJUX0FERFIodmFsKSBiZmluX3dyaXRlX01ETUExX0QwX1NUQVJUX0FERFIodmFsKQogCisvKiBUaGVzZSBuZWVkIHRvIGJlIGxhc3QgZHVlIHRvIHRoZSBjZGVmL2xpbnV4IGludGVyLWRlcGVuZGVuY2llcyAqLworI2luY2x1ZGUgPGFzbS9pcnEuaD4KKworLyogV3JpdGluZyB0byBQTExfQ1RMIGluaXRpYXRlcyBhIFBMTCByZWxvY2sgc2VxdWVuY2UuICovCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIGJmaW5fd3JpdGVfUExMX0NUTCh1bnNpZ25lZCBpbnQgdmFsKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIGl3cjAsIGl3cjE7CisKKwlpZiAodmFsID09IGJmaW5fcmVhZF9QTExfQ1RMKCkpCisJCXJldHVybjsKKworCWxvY2FsX2lycV9zYXZlX2h3KGZsYWdzKTsKKwkvKiBFbmFibGUgdGhlIFBMTCBXYWtldXAgYml0IGluIFNJQyBJV1IgKi8KKwlpd3IwID0gYmZpbl9yZWFkMzIoU0lDQV9JV1IwKTsKKwlpd3IxID0gYmZpbl9yZWFkMzIoU0lDQV9JV1IxKTsKKwkvKiBPbmx5IGFsbG93IFBQTCBXYWtldXApICovCisJYmZpbl93cml0ZTMyKFNJQ0FfSVdSMCwgSVdSX0VOQUJMRSgwKSk7CisJYmZpbl93cml0ZTMyKFNJQ0FfSVdSMSwgMCk7CisKKwliZmluX3dyaXRlMTYoUExMX0NUTCwgdmFsKTsKKwlTU1lOQygpOworCWFzbSgiSURMRTsiKTsKKworCWJmaW5fd3JpdGUzMihTSUNBX0lXUjAsIGl3cjApOworCWJmaW5fd3JpdGUzMihTSUNBX0lXUjEsIGl3cjEpOworCWxvY2FsX2lycV9yZXN0b3JlX2h3KGZsYWdzKTsKK30KKworLyogV3JpdGluZyB0byBWUl9DVEwgaW5pdGlhdGVzIGEgUExMIHJlbG9jayBzZXF1ZW5jZS4gKi8KK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgYmZpbl93cml0ZV9WUl9DVEwodW5zaWduZWQgaW50IHZhbCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzLCBpd3IwLCBpd3IxOworCisJaWYgKHZhbCA9PSBiZmluX3JlYWRfVlJfQ1RMKCkpCisJCXJldHVybjsKKworCWxvY2FsX2lycV9zYXZlX2h3KGZsYWdzKTsKKwkvKiBFbmFibGUgdGhlIFBMTCBXYWtldXAgYml0IGluIFNJQyBJV1IgKi8KKwlpd3IwID0gYmZpbl9yZWFkMzIoU0lDQV9JV1IwKTsKKwlpd3IxID0gYmZpbl9yZWFkMzIoU0lDQV9JV1IxKTsKKwkvKiBPbmx5IGFsbG93IFBQTCBXYWtldXApICovCisJYmZpbl93cml0ZTMyKFNJQ0FfSVdSMCwgSVdSX0VOQUJMRSgwKSk7CisJYmZpbl93cml0ZTMyKFNJQ0FfSVdSMSwgMCk7CisKKwliZmluX3dyaXRlMTYoVlJfQ1RMLCB2YWwpOworCVNTWU5DKCk7CisJYXNtKCJJRExFOyIpOworCisJYmZpbl93cml0ZTMyKFNJQ0FfSVdSMCwgaXdyMCk7CisJYmZpbl93cml0ZTMyKFNJQ0FfSVdSMSwgaXdyMSk7CisJbG9jYWxfaXJxX3Jlc3RvcmVfaHcoZmxhZ3MpOworfQorCiAjZW5kaWYJCQkJLyogX0NERUZfQkY1NjFfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2luY2x1ZGUvbWFjaC9kZWZCRjU2MS5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2luY2x1ZGUvbWFjaC9kZWZCRjU2MS5oCmluZGV4IDRlY2EyMDIuLmQ3YzUwOTcgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9pbmNsdWRlL21hY2gvZGVmQkY1NjEuaAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvaW5jbHVkZS9tYWNoL2RlZkJGNTYxLmgKQEAgLTkxMiw2ICs5MTIsOSBAQAogI2RlZmluZSBBQ1RJVkVfUExMRElTQUJMRUQJMHgwMDA0CS8qIFByb2Nlc3NvciBJbiBBY3RpdmUgTW9kZSBXaXRoIFBMTCBEaXNhYmxlZCAgICovCiAjZGVmaW5lCVBMTF9MT0NLRUQJCQkweDAwMjAJLyogUExMX0xPQ0tDTlQgSGFzIEJlZW4gUmVhY2hlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAKKy8qIFNJQ0FfU1lTQ1IgTWFza3MgKi8KKyNkZWZpbmUgQ09SRUJfU1JBTV9JTklUCQkweDAwMjAKKwogLyogU1dSU1QgTWFzayAqLwogI2RlZmluZSBTWVNURU1fUkVTRVQgICAgICAgICAgIDB4MDAwNwkvKiBJbml0aWF0ZXMgYSBzeXN0ZW0gc29mdHdhcmUgcmVzZXQgKi8KICNkZWZpbmUgRE9VQkxFX0ZBVUxUX0EgICAgICAgICAweDAwMDgJLyogQ29yZSBBIERvdWJsZSBGYXVsdCBDYXVzZXMgUmVzZXQgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9pbmNsdWRlL21hY2gvZG1hLmggYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvaW5jbHVkZS9tYWNoL2RtYS5oCmluZGV4IDhiYzQ2Y2QuLjEzNjQ3YzcgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9pbmNsdWRlL21hY2gvZG1hLmgKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2luY2x1ZGUvbWFjaC9kbWEuaApAQCAtMSwxMyArMSwxNyBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICAgICAgICBCRi01MzMvMi8xIFNwZWNpZmljIERlY2xhcmF0aW9ucwotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIG1hY2gvZG1hLmggLSBhcmNoLXNwZWNpZmljIERNQSBkZWZpbmVzCisgKgorICogQ29weXJpZ2h0IDIwMDQtMjAwOCBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgorICovCiAKICNpZm5kZWYgX01BQ0hfRE1BX0hfCiAjZGVmaW5lIF9NQUNIX0RNQV9IXwogCi0jZGVmaW5lIE1BWF9CTEFDS0ZJTl9ETUFfQ0hBTk5FTCAzNgorI2RlZmluZSBNQVhfRE1BX0NIQU5ORUxTIDM2CisKKy8qIFsjNDI2N10gSU1ETUEgY2hhbm5lbHMgaGF2ZSBubyBQRVJJUEhFUkFMX01BUCBNTVIgKi8KKyNkZWZpbmUgTUFYX0RNQV9TVVNQRU5EX0NIQU5ORUxTIDMyCiAKICNkZWZpbmUgQ0hfUFBJMAkJCTAKICNkZWZpbmUgQ0hfUFBJCQkJKENIX1BQSTApCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvaW5jbHVkZS9tYWNoL2dwaW8uaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9pbmNsdWRlL21hY2gvZ3Bpby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4ODJmNzkKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvaW5jbHVkZS9tYWNoL2dwaW8uaApAQCAtMCwwICsxLDY4IEBACisvKgorICogRmlsZTogYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2luY2x1ZGUvbWFjaC9ncGlvLmgKKyAqIEJ1Z3M6IEVudGVyIGJ1Z3MgYXQgaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnLworICoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCisgKi8KKworCisjaWZuZGVmIF9NQUNIX0dQSU9fSF8KKyNkZWZpbmUgX01BQ0hfR1BJT19IXworCisjZGVmaW5lIE1BWF9CTEFDS0ZJTl9HUElPUyA0OAorCisjZGVmaW5lCUdQSU9fUEYwCTAKKyNkZWZpbmUJR1BJT19QRjEJMQorI2RlZmluZQlHUElPX1BGMgkyCisjZGVmaW5lCUdQSU9fUEYzCTMKKyNkZWZpbmUJR1BJT19QRjQJNAorI2RlZmluZQlHUElPX1BGNQk1CisjZGVmaW5lCUdQSU9fUEY2CTYKKyNkZWZpbmUJR1BJT19QRjcJNworI2RlZmluZQlHUElPX1BGOAk4CisjZGVmaW5lCUdQSU9fUEY5CTkKKyNkZWZpbmUJR1BJT19QRjEwCTEwCisjZGVmaW5lCUdQSU9fUEYxMQkxMQorI2RlZmluZQlHUElPX1BGMTIJMTIKKyNkZWZpbmUJR1BJT19QRjEzCTEzCisjZGVmaW5lCUdQSU9fUEYxNAkxNAorI2RlZmluZQlHUElPX1BGMTUJMTUKKyNkZWZpbmUJR1BJT19QRjE2CTE2CisjZGVmaW5lCUdQSU9fUEYxNwkxNworI2RlZmluZQlHUElPX1BGMTgJMTgKKyNkZWZpbmUJR1BJT19QRjE5CTE5CisjZGVmaW5lCUdQSU9fUEYyMAkyMAorI2RlZmluZQlHUElPX1BGMjEJMjEKKyNkZWZpbmUJR1BJT19QRjIyCTIyCisjZGVmaW5lCUdQSU9fUEYyMwkyMworI2RlZmluZQlHUElPX1BGMjQJMjQKKyNkZWZpbmUJR1BJT19QRjI1CTI1CisjZGVmaW5lCUdQSU9fUEYyNgkyNgorI2RlZmluZQlHUElPX1BGMjcJMjcKKyNkZWZpbmUJR1BJT19QRjI4CTI4CisjZGVmaW5lCUdQSU9fUEYyOQkyOQorI2RlZmluZQlHUElPX1BGMzAJMzAKKyNkZWZpbmUJR1BJT19QRjMxCTMxCisjZGVmaW5lCUdQSU9fUEYzMgkzMgorI2RlZmluZQlHUElPX1BGMzMJMzMKKyNkZWZpbmUJR1BJT19QRjM0CTM0CisjZGVmaW5lCUdQSU9fUEYzNQkzNQorI2RlZmluZQlHUElPX1BGMzYJMzYKKyNkZWZpbmUJR1BJT19QRjM3CTM3CisjZGVmaW5lCUdQSU9fUEYzOAkzOAorI2RlZmluZQlHUElPX1BGMzkJMzkKKyNkZWZpbmUJR1BJT19QRjQwCTQwCisjZGVmaW5lCUdQSU9fUEY0MQk0MQorI2RlZmluZQlHUElPX1BGNDIJNDIKKyNkZWZpbmUJR1BJT19QRjQzCTQzCisjZGVmaW5lCUdQSU9fUEY0NAk0NAorI2RlZmluZQlHUElPX1BGNDUJNDUKKyNkZWZpbmUJR1BJT19QRjQ2CTQ2CisjZGVmaW5lCUdQSU9fUEY0Nwk0NworCisjZGVmaW5lIFBPUlRfRklPMCBHUElPXzAKKyNkZWZpbmUgUE9SVF9GSU8xIEdQSU9fMTYKKyNkZWZpbmUgUE9SVF9GSU8yIEdQSU9fMzIKKworI2VuZGlmIC8qIF9NQUNIX0dQSU9fSF8gKi8KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9pbmNsdWRlL21hY2gvbWVtX2luaXQuaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9pbmNsdWRlL21hY2gvbWVtX2luaXQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTE2MzI2MC4uMDAwMDAwMAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvaW5jbHVkZS9tYWNoL21lbV9pbml0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyOTUgKzAsMCBAQAotLyoKLSAqIEZpbGU6ICAgICAgICAgaW5jbHVkZS9hc20tYmxhY2tmaW4vbWFjaC1iZjU2MS9tZW1faW5pdC5oCi0gKiBCYXNlZCBvbjoKLSAqIEF1dGhvcjoKLSAqCi0gKiBDcmVhdGVkOgotICogRGVzY3JpcHRpb246Ci0gKgotICogUmV2OgotICoKLSAqIE1vZGlmaWVkOgotICoKLSAqIEJ1Z3M6ICAgICAgICAgRW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gKiBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuCi0gKiBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotICovCi0KLSNpZiAoQ09ORklHX01FTV9NVDQ4TEMxNk0xNkEyVEdfNzUgfHwgQ09ORklHX01FTV9NVDQ4TEM2NE00QTJGQl83RSB8fCBDT05GSUdfTUVNX0dFTkVSSUNfQk9BUkQgfHwgQ09ORklHX01FTV9NVDQ4TEM4TTMyQjJCNV83KQotI2lmIChDT05GSUdfU0NMS19IWiA+IDExOTQwMjk4NSkKLSNkZWZpbmUgU0RSQU1fdFJQICAgICAgIFRSUF8yCi0jZGVmaW5lIFNEUkFNX3RSUF9udW0gICAyCi0jZGVmaW5lIFNEUkFNX3RSQVMgICAgICBUUkFTXzcKLSNkZWZpbmUgU0RSQU1fdFJBU19udW0gIDcKLSNkZWZpbmUgU0RSQU1fdFJDRCAgICAgIFRSQ0RfMgotI2RlZmluZSBTRFJBTV90V1IgICAgICAgVFdSXzIKLSNlbmRpZgotI2lmIChDT05GSUdfU0NMS19IWiA+IDEwNDQ3NzYxMikgJiYgKENPTkZJR19TQ0xLX0haIDw9IDExOTQwMjk4NSkKLSNkZWZpbmUgU0RSQU1fdFJQICAgICAgIFRSUF8yCi0jZGVmaW5lIFNEUkFNX3RSUF9udW0gICAyCi0jZGVmaW5lIFNEUkFNX3RSQVMgICAgICBUUkFTXzYKLSNkZWZpbmUgU0RSQU1fdFJBU19udW0gIDYKLSNkZWZpbmUgU0RSQU1fdFJDRCAgICAgIFRSQ0RfMgotI2RlZmluZSBTRFJBTV90V1IgICAgICAgVFdSXzIKLSNlbmRpZgotI2lmIChDT05GSUdfU0NMS19IWiA+IDg5NTUyMjM5KSAmJiAoQ09ORklHX1NDTEtfSFogPD0gMTA0NDc3NjEyKQotI2RlZmluZSBTRFJBTV90UlAgICAgICAgVFJQXzIKLSNkZWZpbmUgU0RSQU1fdFJQX251bSAgIDIKLSNkZWZpbmUgU0RSQU1fdFJBUyAgICAgIFRSQVNfNQotI2RlZmluZSBTRFJBTV90UkFTX251bSAgNQotI2RlZmluZSBTRFJBTV90UkNEICAgICAgVFJDRF8yCi0jZGVmaW5lIFNEUkFNX3RXUiAgICAgICBUV1JfMgotI2VuZGlmCi0jaWYgKENPTkZJR19TQ0xLX0haID4gNzQ2MjY4NjYpICYmIChDT05GSUdfU0NMS19IWiA8PSA4OTU1MjIzOSkKLSNkZWZpbmUgU0RSQU1fdFJQICAgICAgIFRSUF8yCi0jZGVmaW5lIFNEUkFNX3RSUF9udW0gICAyCi0jZGVmaW5lIFNEUkFNX3RSQVMgICAgICBUUkFTXzQKLSNkZWZpbmUgU0RSQU1fdFJBU19udW0gIDQKLSNkZWZpbmUgU0RSQU1fdFJDRCAgICAgIFRSQ0RfMgotI2RlZmluZSBTRFJBTV90V1IgICAgICAgVFdSXzIKLSNlbmRpZgotI2lmIChDT05GSUdfU0NMS19IWiA+IDY2NjY2NjY3KSAmJiAoQ09ORklHX1NDTEtfSFogPD0gNzQ2MjY4NjYpCi0jZGVmaW5lIFNEUkFNX3RSUCAgICAgICBUUlBfMgotI2RlZmluZSBTRFJBTV90UlBfbnVtICAgMgotI2RlZmluZSBTRFJBTV90UkFTICAgICAgVFJBU18zCi0jZGVmaW5lIFNEUkFNX3RSQVNfbnVtICAzCi0jZGVmaW5lIFNEUkFNX3RSQ0QgICAgICBUUkNEXzIKLSNkZWZpbmUgU0RSQU1fdFdSICAgICAgIFRXUl8yCi0jZW5kaWYKLSNpZiAoQ09ORklHX1NDTEtfSFogPiA1OTcwMTQ5MykgJiYgKENPTkZJR19TQ0xLX0haIDw9IDY2NjY2NjY3KQotI2RlZmluZSBTRFJBTV90UlAgICAgICAgVFJQXzEKLSNkZWZpbmUgU0RSQU1fdFJQX251bSAgIDEKLSNkZWZpbmUgU0RSQU1fdFJBUyAgICAgIFRSQVNfNAotI2RlZmluZSBTRFJBTV90UkFTX251bSAgMwotI2RlZmluZSBTRFJBTV90UkNEICAgICAgVFJDRF8xCi0jZGVmaW5lIFNEUkFNX3RXUiAgICAgICBUV1JfMgotI2VuZGlmCi0jaWYgKENPTkZJR19TQ0xLX0haID4gNDQ3NzYxMTkpICYmIChDT05GSUdfU0NMS19IWiA8PSA1OTcwMTQ5MykKLSNkZWZpbmUgU0RSQU1fdFJQICAgICAgIFRSUF8xCi0jZGVmaW5lIFNEUkFNX3RSUF9udW0gICAxCi0jZGVmaW5lIFNEUkFNX3RSQVMgICAgICBUUkFTXzMKLSNkZWZpbmUgU0RSQU1fdFJBU19udW0gIDMKLSNkZWZpbmUgU0RSQU1fdFJDRCAgICAgIFRSQ0RfMQotI2RlZmluZSBTRFJBTV90V1IgICAgICAgVFdSXzIKLSNlbmRpZgotI2lmIChDT05GSUdfU0NMS19IWiA+IDI5ODUwNzQ2KSAmJiAoQ09ORklHX1NDTEtfSFogPD0gNDQ3NzYxMTkpCi0jZGVmaW5lIFNEUkFNX3RSUCAgICAgICBUUlBfMQotI2RlZmluZSBTRFJBTV90UlBfbnVtICAgMQotI2RlZmluZSBTRFJBTV90UkFTICAgICAgVFJBU18yCi0jZGVmaW5lIFNEUkFNX3RSQVNfbnVtICAyCi0jZGVmaW5lIFNEUkFNX3RSQ0QgICAgICBUUkNEXzEKLSNkZWZpbmUgU0RSQU1fdFdSICAgICAgIFRXUl8yCi0jZW5kaWYKLSNpZiAoQ09ORklHX1NDTEtfSFogPD0gMjk4NTA3NDYpCi0jZGVmaW5lIFNEUkFNX3RSUCAgICAgICBUUlBfMQotI2RlZmluZSBTRFJBTV90UlBfbnVtICAgMQotI2RlZmluZSBTRFJBTV90UkFTICAgICAgVFJBU18xCi0jZGVmaW5lIFNEUkFNX3RSQVNfbnVtICAxCi0jZGVmaW5lIFNEUkFNX3RSQ0QgICAgICBUUkNEXzEKLSNkZWZpbmUgU0RSQU1fdFdSICAgICAgIFRXUl8yCi0jZW5kaWYKLSNlbmRpZgotCi0jaWYgKENPTkZJR19NRU1fTVQ0OExDMTZNMTZBMlRHXzc1KQotICAvKlNEUkFNIElORk9STUFUSU9OOiAqLwotI2RlZmluZSBTRFJBTV9UcmVmICA2NAkJLyogUmVmcmVzaCBwZXJpb2QgaW4gbWlsbGlzZWNvbmRzICAgKi8KLSNkZWZpbmUgU0RSQU1fTlJBICAgODE5MgkvKiBOdW1iZXIgb2Ygcm93IGFkZHJlc3NlcyBpbiBTRFJBTSAqLwotI2RlZmluZSBTRFJBTV9DTCAgICBDTF8zCi0jZW5kaWYKLQotI2lmIChDT05GSUdfTUVNX01UNDhMQzY0TTRBMkZCXzdFKQotICAvKlNEUkFNIElORk9STUFUSU9OOiAqLwotI2RlZmluZSBTRFJBTV9UcmVmICA2NAkJLyogUmVmcmVzaCBwZXJpb2QgaW4gbWlsbGlzZWNvbmRzICAgKi8KLSNkZWZpbmUgU0RSQU1fTlJBICAgODE5MgkvKiBOdW1iZXIgb2Ygcm93IGFkZHJlc3NlcyBpbiBTRFJBTSAqLwotI2RlZmluZSBTRFJBTV9DTCAgICBDTF8zCi0jZW5kaWYKLQotI2lmIChDT05GSUdfTUVNX01UNDhMQzhNMzJCMkI1XzcpCi0gIC8qU0RSQU0gSU5GT1JNQVRJT046ICovCi0jZGVmaW5lIFNEUkFNX1RyZWYgIDY0CQkvKiBSZWZyZXNoIHBlcmlvZCBpbiBtaWxsaXNlY29uZHMgICAqLwotI2RlZmluZSBTRFJBTV9OUkEgICA0MDk2CS8qIE51bWJlciBvZiByb3cgYWRkcmVzc2VzIGluIFNEUkFNICovCi0jZGVmaW5lIFNEUkFNX0NMICAgIENMXzMKLSNlbmRpZgotCi0jaWYgKENPTkZJR19NRU1fR0VORVJJQ19CT0FSRCkKLSAgLypTRFJBTSBJTkZPUk1BVElPTjogTW9kaWZ5IHRoaXMgZm9yIHlvdXIgYm9hcmQgKi8KLSNkZWZpbmUgU0RSQU1fVHJlZiAgNjQJCS8qIFJlZnJlc2ggcGVyaW9kIGluIG1pbGxpc2Vjb25kcyAgICovCi0jZGVmaW5lIFNEUkFNX05SQSAgIDgxOTIJLyogTnVtYmVyIG9mIHJvdyBhZGRyZXNzZXMgaW4gU0RSQU0gKi8KLSNkZWZpbmUgU0RSQU1fQ0wgICAgQ0xfMwotI2VuZGlmCi0KLS8qIEVxdWF0aW9uIGZyb20gc2VjdGlvbiAxNyAocDE3LTQ2KSBvZiBCRjUzMyBIUk0gKi8KLSNkZWZpbmUgbWVtX1NEUlJDICAgICAgICgoKENPTkZJR19TQ0xLX0haIC8gMTAwMCkgKiBTRFJBTV9UcmVmKSAvIFNEUkFNX05SQSkgLSAoU0RSQU1fdFJBU19udW0gKyBTRFJBTV90UlBfbnVtKQotCi0vKiBFbmFibGUgU0NMSyBPdXQgKi8KLSNkZWZpbmUgbWVtX1NER0NUTCAgICAgICAgKFNDVExFIHwgU0RSQU1fQ0wgfCBTRFJBTV90UkFTIHwgU0RSQU1fdFJQIHwgU0RSQU1fdFJDRCB8IFNEUkFNX3RXUiB8IFBTUykKLQotI2lmIGRlZmluZWQgQ09ORklHX0NMS0lOX0hBTEYKLSNkZWZpbmUgQ0xLSU5fSEFMRiAgICAgICAxCi0jZWxzZQotI2RlZmluZSBDTEtJTl9IQUxGICAgICAgIDAKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCBDT05GSUdfUExMX0JZUEFTUwotI2RlZmluZSBQTExfQllQQVNTICAgICAgMQotI2Vsc2UKLSNkZWZpbmUgUExMX0JZUEFTUyAgICAgICAwCi0jZW5kaWYKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKkN1cnJlbnRseSBOb3QgQmVpbmcgVXNlZCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMX1dBVCAgKChDT05GSUdfRkxBU0hfU1BFRURfQldBVCAqIDQpIC8gKDQwMDAwMDAwMDAgLyBDT05GSUdfU0NMS19IWikpICsgMQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTF9SQVQgICgoQ09ORklHX0ZMQVNIX1NQRUVEX0JSQVQgKiA0KSAvICg0MDAwMDAwMDAwIC8gQ09ORklHX1NDTEtfSFopKSArIDEKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVExfSFQgICAoKENPTkZJR19GTEFTSF9TUEVFRF9CSFQgICogNCkgLyAoNDAwMDAwMDAwMCAvIENPTkZJR19TQ0xLX0haKSkKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVExfU1QgICAoKENPTkZJR19GTEFTSF9TUEVFRF9CU1QgICogNCkgLyAoNDAwMDAwMDAwMCAvIENPTkZJR19TQ0xLX0haKSkgKyAxCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMX1RUICAgKChDT05GSUdfRkxBU0hfU1BFRURfQlRUICAqIDQpIC8gKDQwMDAwMDAwMDAgLyBDT05GSUdfU0NMS19IWikpICsgMQotCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1RUID4gMykKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1RUICAgQjBUVF80Ci0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfVFQgPT0gMykKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1RUICAgQjBUVF8zCi0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfVFQgPT0gMikKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1RUICAgQjBUVF8yCi0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfVFQgPCAyKQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfVFQgICBCMFRUXzEKLSNlbmRpZgotCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1NUID4gMykKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1NUICAgQjBTVF80Ci0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfU1QgPT0gMykKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1NUICAgQjBTVF8zCi0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfU1QgPT0gMikKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1NUICAgQjBTVF8yCi0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfU1QgPCAyKQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfU1QgICBCMFNUXzEKLSNlbmRpZgotCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX0hUID4gMikKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX0hUICAgQjBIVF8zCi0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfSFQgPT0gMikKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX0hUICAgQjBIVF8yCi0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfSFQgPT0gMSkKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX0hUICAgQjBIVF8xCi0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfSFQgPT0gMCAmJiBDT05GSUdfRkxBU0hfU1BFRURfQkhUID09IDApCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9IVCAgIEIwSFRfMAotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX0hUID09IDAgJiYgQ09ORklHX0ZMQVNIX1NQRUVEX0JIVCAhPSAwKQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfSFQgICBCMEhUXzEKLSNlbmRpZgotCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1dBVCA+IDE0KQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfV0FUICBCMFdBVF8xNQotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1dBVCA9PSAxNCkKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1dBVCAgQjBXQVRfMTQKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9XQVQgPT0gMTMpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9XQVQgIEIwV0FUXzEzCi0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfV0FUID09IDEyKQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfV0FUICBCMFdBVF8xMgotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1dBVCA9PSAxMSkKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1dBVCAgQjBXQVRfMTEKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9XQVQgPT0gMTApCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9XQVQgIEIwV0FUXzEwCi0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfV0FUID09IDkpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9XQVQgIEIwV0FUXzkKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9XQVQgPT0gOCkKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1dBVCAgQjBXQVRfOAotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1dBVCA9PSA3KQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfV0FUICBCMFdBVF83Ci0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfV0FUID09IDYpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9XQVQgIEIwV0FUXzYKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9XQVQgPT0gNSkKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1dBVCAgQjBXQVRfNQotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1dBVCA9PSA0KQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfV0FUICBCMFdBVF80Ci0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfV0FUID09IDMpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9XQVQgIEIwV0FUXzMKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9XQVQgPT0gMikKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1dBVCAgQjBXQVRfMgotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1dBVCA9PSAxKQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfV0FUICBCMFdBVF8xCi0jZW5kaWYKLQotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9SQVQgPiAxNCkKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1JBVCAgQjBSQVRfMTUKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9SQVQgPT0gMTQpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9SQVQgIEIwUkFUXzE0Ci0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfUkFUID09IDEzKQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfUkFUICBCMFJBVF8xMwotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1JBVCA9PSAxMikKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1JBVCAgQjBSQVRfMTIKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9SQVQgPT0gMTEpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9SQVQgIEIwUkFUXzExCi0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfUkFUID09IDEwKQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfUkFUICBCMFJBVF8xMAotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1JBVCA9PSA5KQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfUkFUICBCMFJBVF85Ci0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfUkFUID09IDgpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9SQVQgIEIwUkFUXzgKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9SQVQgPT0gNykKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1JBVCAgQjBSQVRfNwotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1JBVCA9PSA2KQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfUkFUICBCMFJBVF82Ci0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfUkFUID09IDUpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9SQVQgIEIwUkFUXzUKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9SQVQgPT0gNCkKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1JBVCAgQjBSQVRfNAotI2VuZGlmCi0jaWYgKGZsYXNoX0VCSVVfQU1CQ1RMX1JBVCA9PSAzKQotI2RlZmluZSBmbGFzaF9FQklVX0FNQkNUTDBfUkFUICBCMFJBVF8zCi0jZW5kaWYKLSNpZiAoZmxhc2hfRUJJVV9BTUJDVExfUkFUID09IDIpCi0jZGVmaW5lIGZsYXNoX0VCSVVfQU1CQ1RMMF9SQVQgIEIwUkFUXzIKLSNlbmRpZgotI2lmIChmbGFzaF9FQklVX0FNQkNUTF9SQVQgPT0gMSkKLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwX1JBVCAgQjBSQVRfMQotI2VuZGlmCi0KLSNkZWZpbmUgZmxhc2hfRUJJVV9BTUJDVEwwICBcCi0JKGZsYXNoX0VCSVVfQU1CQ1RMMF9XQVQgfCBmbGFzaF9FQklVX0FNQkNUTDBfUkFUIHwgZmxhc2hfRUJJVV9BTUJDVEwwX0hUIHwgXAotCSBmbGFzaF9FQklVX0FNQkNUTDBfU1QgfCBmbGFzaF9FQklVX0FNQkNUTDBfVFQgfCBDT05GSUdfRkxBU0hfU1BFRURfUkRZRU4pCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvaW5jbHVkZS9tYWNoL21lbV9tYXAuaCBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9pbmNsdWRlL21hY2gvbWVtX21hcC5oCmluZGV4IGYxZDRjMDYuLjQxOWRmZmQgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9pbmNsdWRlL21hY2gvbWVtX21hcC5oCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9pbmNsdWRlL21hY2gvbWVtX21hcC5oCkBAIC04NSw0ICs4NSw4NCBAQAogI2RlZmluZSBMMV9TQ1JBVENIX1NUQVJUCUNPUkVBX0wxX1NDUkFUQ0hfU1RBUlQKICNkZWZpbmUgTDFfU0NSQVRDSF9MRU5HVEgJMHgxMDAwCiAKKyNpZmRlZiBfX0FTU0VNQkxZX18KKworLyoKKyAqIFRoZSBmb2xsb3dpbmcgbWFjcm9zIGJvdGggcmV0dXJuIHRoZSBhZGRyZXNzIG9mIHRoZSBQREEgZm9yIHRoZQorICogY3VycmVudCBjb3JlLgorICoKKyAqIEluIGl0cyBmaXJzdCBzYWZlIChhbmQgaGFpcnkpIGZvcm0sIHRoZSBtYWNybyBuZWl0aGVyIGNsb2JiZXJzIGFueQorICogcmVnaXN0ZXIgYXNpZGUgb2YgdGhlIG91dHB1dCBQcmVnLCBub3IgdXNlcyB0aGUgc3RhY2ssIHNpbmNlIGl0CisgKiBjb3VsZCBiZSBjYWxsZWQgd2l0aCBhbiBpbnZhbGlkIHN0YWNrIHBvaW50ZXIsIG9yIHRoZSBjdXJyZW50IHN0YWNrCisgKiBzcGFjZSBiZWluZyB1bmNvdmVyZWQgYnkgYW55IENQTEIgKGUuZy4gZWFybHkgZXhjZXB0aW9uIGhhbmRsaW5nKS4KKyAqCisgKiBUaGUgY29uc3RyYWludHMgb24gdGhlIHNlY29uZCBmb3JtIGFyZSBhIGJpdCByZWxheGVkLCBhbmQgdGhlIGNvZGUKKyAqIGlzIGFsbG93ZWQgdG8gdXNlIHRoZSBzcGVjaWZpZWQgRHJlZyBmb3IgZGV0ZXJtaW5pbmcgdGhlIFBEQQorICogYWRkcmVzcyB0byBiZSByZXR1cm5lZCBpbnRvIFByZWcuCisgKi8KKyNpZmRlZiBDT05GSUdfU01QCisjZGVmaW5lIEdFVF9QREFfU0FGRShwcmVnKQkJXAorCXByZWcubCA9IGxvKERTUElEKTsJCVwKKwlwcmVnLmggPSBoaShEU1BJRCk7CQlcCisJcHJlZyA9IFtwcmVnXTsJCQlcCisJcHJlZyA9IHByZWcgPDwgMjsJCVwKKwlwcmVnID0gcHJlZyA8PCAyOwkJXAorCXByZWcgPSBwcmVnIDw8IDI7CQlcCisJcHJlZyA9IHByZWcgPDwgMjsJCVwKKwlwcmVnID0gcHJlZyA8PCAyOwkJXAorCXByZWcgPSBwcmVnIDw8IDI7CQlcCisJcHJlZyA9IHByZWcgPDwgMjsJCVwKKwlwcmVnID0gcHJlZyA8PCAyOwkJXAorCXByZWcgPSBwcmVnIDw8IDI7CQlcCisJcHJlZyA9IHByZWcgPDwgMjsJCVwKKwlwcmVnID0gcHJlZyA8PCAyOwkJXAorCXByZWcgPSBwcmVnIDw8IDI7CQlcCisJaWYgY2MganVtcCAyZjsJCQlcCisJY2MgPSBwcmVnID09IDB4MDsJCVwKKwlwcmVnLmwgPSBfY3B1X3BkYTsJCVwKKwlwcmVnLmggPSBfY3B1X3BkYTsJCVwKKwlpZiAhY2MganVtcCAzZjsJCQlcCisxOgkJCQkJXAorCS8qIHByZWcgPSAweDA7ICovCQlcCisJY2MgPSAhY2M7IC8qIHJlc3RvcmUgY2MgdG8gMCAqLwlcCisJanVtcCA0ZjsJCQlcCisyOgkJCQkJXAorCWNjID0gcHJlZyA9PSAweDA7CQlcCisJcHJlZy5sID0gX2NwdV9wZGE7CQlcCisJcHJlZy5oID0gX2NwdV9wZGE7CQlcCisJaWYgY2MganVtcCA0ZjsJCQlcCisJLyogcHJlZyA9IDB4MTAwMDAwMDsgKi8JCVwKKwljYyA9ICFjYzsgLyogcmVzdG9yZSBjYyB0byAxICovCVwKKzM6CQkJCQlcCisJcHJlZyA9IFtwcmVnXTsJCQlcCis0OgorCisjZGVmaW5lIEdFVF9QREEocHJlZywgZHJlZykJCVwKKwlwcmVnLmwgPSBsbyhEU1BJRCk7CQlcCisJcHJlZy5oID0gaGkoRFNQSUQpOwkJXAorCWRyZWcgPSBbcHJlZ107CQkJXAorCXByZWcubCA9IF9jcHVfcGRhOwkJXAorCXByZWcuaCA9IF9jcHVfcGRhOwkJXAorCWNjID0gYml0dHN0KGRyZWcsIDApOwkJXAorCWlmICFjYyBqdW1wIDFmOwkJCVwKKwlwcmVnID0gW3ByZWddOwkJCVwKKzE6CQkJCQlcCisKKyNkZWZpbmUgR0VUX0NQVUlEKHByZWcsIGRyZWcpCQlcCisJcHJlZy5sID0gbG8oRFNQSUQpOwkJXAorCXByZWcuaCA9IGhpKERTUElEKTsJCVwKKwlkcmVnID0gW3ByZWddOwkJCVwKKwlkcmVnID0gUk9UIGRyZWcgQlkgLTE7CQlcCisJZHJlZyA9IENDOworCisjZWxzZQorI2RlZmluZSBHRVRfUERBX1NBRkUocHJlZykJCVwKKwlwcmVnLmwgPSBfY3B1X3BkYTsJCVwKKwlwcmVnLmggPSBfY3B1X3BkYTsKKworI2RlZmluZSBHRVRfUERBKHByZWcsIGRyZWcpCUdFVF9QREFfU0FGRShwcmVnKQorI2VuZGlmIC8qIENPTkZJR19TTVAgKi8KKworI2VuZGlmIC8qIF9fQVNTRU1CTFlfXyAqLworCiAjZW5kaWYJCQkJLyogX01FTV9NQVBfNTMzX0hfICovCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvaW5jbHVkZS9tYWNoL3NtcC5oIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2luY2x1ZGUvbWFjaC9zbXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOWU2NWViCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2luY2x1ZGUvbWFjaC9zbXAuaApAQCAtMCwwICsxLDIyIEBACisjaWZuZGVmIF9NQUNIX0JGNTYxX1NNUAorI2RlZmluZSBfTUFDSF9CRjU2MV9TTVAKKworc3RydWN0IHRhc2tfc3RydWN0OworCit2b2lkIHBsYXRmb3JtX2luaXRfY3B1cyh2b2lkKTsKKwordm9pZCBwbGF0Zm9ybV9wcmVwYXJlX2NwdXModW5zaWduZWQgaW50IG1heF9jcHVzKTsKKworaW50IHBsYXRmb3JtX2Jvb3Rfc2Vjb25kYXJ5KHVuc2lnbmVkIGludCBjcHUsIHN0cnVjdCB0YXNrX3N0cnVjdCAqaWRsZSk7CisKK3ZvaWQgcGxhdGZvcm1fc2Vjb25kYXJ5X2luaXQodW5zaWduZWQgaW50IGNwdSk7CisKK3ZvaWQgcGxhdGZvcm1fcmVxdWVzdF9pcGkoaW50ICgqaGFuZGxlcikoaW50LCB2b2lkICopKTsKKwordm9pZCBwbGF0Zm9ybV9zZW5kX2lwaShjcHVtYXNrX3QgY2FsbG1hcCk7CisKK3ZvaWQgcGxhdGZvcm1fc2VuZF9pcGlfY3B1KHVuc2lnbmVkIGludCBjcHUpOworCit2b2lkIHBsYXRmb3JtX2NsZWFyX2lwaSh1bnNpZ25lZCBpbnQgY3B1KTsKKworI2VuZGlmIC8qICFfTUFDSF9CRjU2MV9TTVAgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9zZWNvbmRhcnkuUyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9zZWNvbmRhcnkuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTI4MGYwCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL3NlY29uZGFyeS5TCkBAIC0wLDAgKzEsMjE1IEBACisvKgorICogRmlsZTogICAgICAgICBhcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvc2Vjb25kYXJ5LlMKKyAqIEJhc2VkIG9uOiAgICAgYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2hlYWQuUworICogQXV0aG9yOiAgICAgICBQaGlsaXBwZSBHZXJ1bSA8cnBtQHhlbm9tYWkub3JnPgorICoKKyAqICAgICAgICAgICAgICAgQ29weXJpZ2h0IDIwMDcgQW5hbG9nIERldmljZXMgSW5jLgorICoKKyAqIERlc2NyaXB0aW9uOiAgQkY1NjEgY29yZUIgYm9vdHN0cmFwIGZpbGUKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSB0aGUgZmlsZSBDT1BZSU5HLCBvciB3cml0ZQorICogdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8YXNtL2JsYWNrZmluLmg+CisjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CisKK19fSU5JVAorCisvKiBMYXkgdGhlIGluaXRpYWwgc3RhY2sgaW50byB0aGUgTDEgc2NyYXRjaCBhcmVhIG9mIENvcmUgQiAqLworI2RlZmluZSBJTklUSUFMX1NUQUNLCShDT1JFQl9MMV9TQ1JBVENIX1NUQVJUICsgTDFfU0NSQVRDSF9MRU5HVEggLSAxMikKKworRU5UUlkoX2NvcmViX3RyYW1wb2xpbmVfc3RhcnQpCisJLyogU2V0IHRoZSBTWVNDRkcgcmVnaXN0ZXIgKi8KKwlSMCA9IDB4MzY7CisJU1lTQ0ZHID0gUjA7IC8qRW5hYmxlIEN5Y2xlIENvdW50ZXIgYW5kIE5lc3RpbmcgT2YgSW50ZXJydXB0cygzcmQgQml0KSovCisJUjAgPSAwOworCisJLypDbGVhciBPdXQgQWxsIHRoZSBkYXRhIGFuZCBwb2ludGVyICBSZWdpc3RlcnMqLworCVIxID0gUjA7CisJUjIgPSBSMDsKKwlSMyA9IFIwOworCVI0ID0gUjA7CisJUjUgPSBSMDsKKwlSNiA9IFIwOworCVI3ID0gUjA7CisKKwlQMCA9IFIwOworCVAxID0gUjA7CisJUDIgPSBSMDsKKwlQMyA9IFIwOworCVA0ID0gUjA7CisJUDUgPSBSMDsKKworCUxDMCA9IHIwOworCUxDMSA9IHIwOworCUwwID0gcjA7CisJTDEgPSByMDsKKwlMMiA9IHIwOworCUwzID0gcjA7CisKKwkvKiBDbGVhciBPdXQgQWxsIHRoZSBEQUcgUmVnaXN0ZXJzKi8KKwlCMCA9IHIwOworCUIxID0gcjA7CisJQjIgPSByMDsKKwlCMyA9IHIwOworCisJSTAgPSByMDsKKwlJMSA9IHIwOworCUkyID0gcjA7CisJSTMgPSByMDsKKworCU0wID0gcjA7CisJTTEgPSByMDsKKwlNMiA9IHIwOworCU0zID0gcjA7CisKKwkvKiBUdXJuIG9mZiB0aGUgaWNhY2hlICovCisJcDAubCA9IExPKElNRU1fQ09OVFJPTCk7CisJcDAuaCA9IEhJKElNRU1fQ09OVFJPTCk7CisJUjEgPSBbcDBdOworCVIwID0gfkVOSUNQTEI7CisJUjAgPSBSMCAmIFIxOworCisJLyogQW5vbWFseSAwNTAwMDEyNSAqLworI2lmZGVmIEFOT01BTFlfMDUwMDAxMjUKKwlDTEkgUjI7CisJU1NZTkM7CisjZW5kaWYKKwlbcDBdID0gUjA7CisJU1NZTkM7CisjaWZkZWYgQU5PTUFMWV8wNTAwMDEyNQorCVNUSSBSMjsKKyNlbmRpZgorCisJLyogVHVybiBvZmYgdGhlIGRjYWNoZSAqLworCXAwLmwgPSBMTyhETUVNX0NPTlRST0wpOworCXAwLmggPSBISShETUVNX0NPTlRST0wpOworCVIxID0gW3AwXTsKKwlSMCA9IH5FTkRDUExCOworCVIwID0gUjAgJiBSMTsKKworCS8qIEFub21hbHkgMDUwMDAxMjUgKi8KKyNpZmRlZiBBTk9NQUxZXzA1MDAwMTI1CisJQ0xJIFIyOworCVNTWU5DOworI2VuZGlmCisJW3AwXSA9IFIwOworCVNTWU5DOworI2lmZGVmIEFOT01BTFlfMDUwMDAxMjUKKwlTVEkgUjI7CisjZW5kaWYKKworCS8qIGluIGNhc2Ugb2YgZG91YmxlIGZhdWx0cywgc2F2ZSBhIGZldyB0aGluZ3MgKi8KKwlwMC5sID0gX2luaXRfcmV0eF9jb3JlYjsKKwlwMC5oID0gX2luaXRfcmV0eF9jb3JlYjsKKwlSMCA9IFJFVFg7CisJW1AwXSA9IFIwOworCisjaWZkZWYgQ09ORklHX0RFQlVHX0RPVUJMRUZBVUxUCisJLyogT25seSBzYXZlIHRoZXNlIGlmIHdlIGFyZSBzdG9yaW5nIHRoZW0sCisJICogVGhpcyBoYXBwZW5zIGhlcmUsIHNpbmNlIEwxIGdldHMgY2xvYmJlcmVkCisJICogYmVsb3cKKwkgKi8KKwlHRVRfUERBKHAwLCByMCk7CisJcjcgPSBbcDAgKyBQREFfUkVUWF07CisJcDEubCA9IF9pbml0X3NhdmVkX3JldHhfY29yZWI7CisJcDEuaCA9IF9pbml0X3NhdmVkX3JldHhfY29yZWI7CisJW3AxXSA9IHI3OworCisJcjcgPSBbcDAgKyBQREFfRENQTEJdOworCXAxLmwgPSBfaW5pdF9zYXZlZF9kY3BsYl9mYXVsdF9hZGRyX2NvcmViOworCXAxLmggPSBfaW5pdF9zYXZlZF9kY3BsYl9mYXVsdF9hZGRyX2NvcmViOworCVtwMV0gPSByNzsKKworCXI3ID0gW3AwICsgUERBX0lDUExCXTsKKwlwMS5sID0gX2luaXRfc2F2ZWRfaWNwbGJfZmF1bHRfYWRkcl9jb3JlYjsKKwlwMS5oID0gX2luaXRfc2F2ZWRfaWNwbGJfZmF1bHRfYWRkcl9jb3JlYjsKKwlbcDFdID0gcjc7CisKKwlyNyA9IFtwMCArIFBEQV9TRVFTVEFUXTsKKwlwMS5sID0gX2luaXRfc2F2ZWRfc2Vxc3RhdF9jb3JlYjsKKwlwMS5oID0gX2luaXRfc2F2ZWRfc2Vxc3RhdF9jb3JlYjsKKwlbcDFdID0gcjc7CisjZW5kaWYKKworCS8qIEluaXRpYWxpemUgc3RhY2sgcG9pbnRlciAqLworCXNwLmwgPSBsbyhJTklUSUFMX1NUQUNLKTsKKwlzcC5oID0gaGkoSU5JVElBTF9TVEFDSyk7CisJZnAgPSBzcDsKKwl1c3AgPSBzcDsKKworCS8qIFRoaXMgc2VjdGlvbiBrZWVwcyB0aGUgcHJvY2Vzc29yIGluIHN1cGVydmlzb3IgbW9kZQorCSAqIGR1cmluZyBjb3JlIEIgc3RhcnR1cC4gIEJyYW5jaGVzIHRvIHRoZSBpZGxlIHRhc2suCisJICovCisKKwkvKiBFVlQxNSA9IF9yZWFsX3N0YXJ0ICovCisKKwlwMC5sID0gbG8oRVZUMTUpOworCXAwLmggPSBoaShFVlQxNSk7CisJcDEubCA9IF9jb3JlYl9zdGFydDsKKwlwMS5oID0gX2NvcmViX3N0YXJ0OworCVtwMF0gPSBwMTsKKwljc3luYzsKKworCXAwLmwgPSBsbyhJTUFTSyk7CisJcDAuaCA9IGhpKElNQVNLKTsKKwlwMS5sID0gSU1BU0tfSVZHMTU7CisJcDEuaCA9IDB4MDsKKwlbcDBdID0gcDE7CisJY3N5bmM7CisKKwlyYWlzZSAxNTsKKwlwMC5sID0gLkxXQUlUX0hFUkU7CisJcDAuaCA9IC5MV0FJVF9IRVJFOworCXJldGkgPSBwMDsKKyNpZiBkZWZpbmVkKEFOT01BTFlfMDUwMDAyODEpCisJbm9wOyBub3A7IG5vcDsKKyNlbmRpZgorCXJ0aTsKKworLkxXQUlUX0hFUkU6CisJanVtcCAuTFdBSVRfSEVSRTsKK0VORFBST0MoX2NvcmViX3RyYW1wb2xpbmVfc3RhcnQpCitFTlRSWShfY29yZWJfdHJhbXBvbGluZV9lbmQpCisKK0VOVFJZKF9jb3JlYl9zdGFydCkKKwlbLS1zcF0gPSByZXRpOworCisJcDAubCA9IGxvKFdET0dCX0NUTCk7CisJcDAuaCA9IGhpKFdET0dCX0NUTCk7CisJcjAgPSAweEFENih6KTsKKwl3W3AwXSA9IHIwOwkvKiBDbGVhciB0aGUgd2F0Y2hkb2cuICovCisJc3N5bmM7CisKKwkvKgorCSAqIHN3aXRjaCB0byBJRExFIHN0YWNrLgorCSAqLworCXAwLmwgPSBfc2Vjb25kYXJ5X3N0YWNrOworCXAwLmggPSBfc2Vjb25kYXJ5X3N0YWNrOworCXNwID0gW3AwXTsKKwl1c3AgPSBzcDsKKwlmcCA9IHNwOworCXNwICs9IC0xMjsKKwljYWxsIF9pbml0X3BkYQorCXNwICs9IDEyOworCWNhbGwgX3NlY29uZGFyeV9zdGFydF9rZXJuZWw7CisuTF9leGl0OgorCWp1bXAucwkuTF9leGl0OworRU5EUFJPQyhfY29yZWJfc3RhcnQpCisKK19fRklOSVQKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9zbXAuYyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9zbXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjI3ZTY5Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL3NtcC5jCkBAIC0wLDAgKzEsMTY3IEBACisvKgorICogRmlsZTogICAgICAgICBhcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvc21wLmMKKyAqIEF1dGhvcjogICAgICAgUGhpbGlwcGUgR2VydW0gPHJwbUB4ZW5vbWFpLm9yZz4KKyAqCisgKiAgICAgICAgICAgICAgIENvcHlyaWdodCAyMDA3IEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSB0aGUgZmlsZSBDT1BZSU5HLCBvciB3cml0ZQorICogdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8YXNtL3NtcC5oPgorI2luY2x1ZGUgPGFzbS9kbWEuaD4KKworc3RhdGljIERFRklORV9TUElOTE9DSyhib290X2xvY2spOworCitzdGF0aWMgY3B1bWFza190IGNwdV9jYWxsaW5fbWFwOworCisvKgorICogcGxhdGZvcm1faW5pdF9jcHVzKCkgLSBUZWxsIHRoZSB3b3JsZCBhYm91dCBob3cgbWFueSBjb3JlcyB3ZQorICogaGF2ZS4gVGhpcyBpcyBjYWxsZWQgd2hpbGUgc2V0dGluZyB1cCB0aGUgYXJjaGl0ZWN0dXJlIHN1cHBvcnQKKyAqIChzZXR1cF9hcmNoKCkpLCBzbyBkb24ndCBiZSB0b28gZGVtYW5kaW5nIGhlcmUgd2l0aCByZXNwZWN0IHRvCisgKiBhdmFpbGFibGUga2VybmVsIHNlcnZpY2VzLgorICovCisKK3ZvaWQgX19pbml0IHBsYXRmb3JtX2luaXRfY3B1cyh2b2lkKQoreworCWNwdV9zZXQoMCwgY3B1X3Bvc3NpYmxlX21hcCk7IC8qIENvcmVBICovCisJY3B1X3NldCgxLCBjcHVfcG9zc2libGVfbWFwKTsgLyogQ29yZUIgKi8KK30KKwordm9pZCBfX2luaXQgcGxhdGZvcm1fcHJlcGFyZV9jcHVzKHVuc2lnbmVkIGludCBtYXhfY3B1cykKK3sKKwlpbnQgbGVuOworCisJbGVuID0gJmNvcmViX3RyYW1wb2xpbmVfZW5kIC0gJmNvcmViX3RyYW1wb2xpbmVfc3RhcnQgKyAxOworCUJVR19PTihsZW4gPiBMMV9DT0RFX0xFTkdUSCk7CisKKwlkbWFfbWVtY3B5KCh2b2lkICopQ09SRUJfTDFfQ09ERV9TVEFSVCwgJmNvcmViX3RyYW1wb2xpbmVfc3RhcnQsIGxlbik7CisKKwkvKiBCb3RoIGNvcmVzIG91Z2h0IHRvIGJlIHByZXNlbnQgb24gYSBiZjU2MSEgKi8KKwljcHVfc2V0KDAsIGNwdV9wcmVzZW50X21hcCk7IC8qIENvcmVBICovCisJY3B1X3NldCgxLCBjcHVfcHJlc2VudF9tYXApOyAvKiBDb3JlQiAqLworCisJcHJpbnRrKEtFUk5fSU5GTyAiQ29yZUIgYm9vdHN0cmFwIGNvZGUgdG8gU1JBTSAlcCB2aWEgRE1BLlxuIiwgKHZvaWQgKilDT1JFQl9MMV9DT0RFX1NUQVJUKTsKK30KKworaW50IF9faW5pdCBzZXR1cF9wcm9maWxpbmdfdGltZXIodW5zaWduZWQgaW50IG11bHRpcGxpZXIpIC8qIG5vdCBzdXBwb3J0ZWQgKi8KK3sKKwlyZXR1cm4gLUVJTlZBTDsKK30KKwordm9pZCBfX2NwdWluaXQgcGxhdGZvcm1fc2Vjb25kYXJ5X2luaXQodW5zaWduZWQgaW50IGNwdSkKK3sKKwlsb2NhbF9pcnFfZGlzYWJsZSgpOworCisJLyogQ2xvbmUgc2V0dXAgZm9yIHBlcmlwaGVyYWwgaW50ZXJydXB0IHNvdXJjZXMgZnJvbSBDb3JlQS4gKi8KKwliZmluX3dyaXRlX1NJQ0JfSU1BU0swKGJmaW5fcmVhZF9TSUNBX0lNQVNLMCgpKTsKKwliZmluX3dyaXRlX1NJQ0JfSU1BU0sxKGJmaW5fcmVhZF9TSUNBX0lNQVNLMSgpKTsKKwlTU1lOQygpOworCisJLyogQ2xvbmUgc2V0dXAgZm9yIElBUnMgZnJvbSBDb3JlQS4gKi8KKwliZmluX3dyaXRlX1NJQ0JfSUFSMChiZmluX3JlYWRfU0lDQV9JQVIwKCkpOworCWJmaW5fd3JpdGVfU0lDQl9JQVIxKGJmaW5fcmVhZF9TSUNBX0lBUjEoKSk7CisJYmZpbl93cml0ZV9TSUNCX0lBUjIoYmZpbl9yZWFkX1NJQ0FfSUFSMigpKTsKKwliZmluX3dyaXRlX1NJQ0JfSUFSMyhiZmluX3JlYWRfU0lDQV9JQVIzKCkpOworCWJmaW5fd3JpdGVfU0lDQl9JQVI0KGJmaW5fcmVhZF9TSUNBX0lBUjQoKSk7CisJYmZpbl93cml0ZV9TSUNCX0lBUjUoYmZpbl9yZWFkX1NJQ0FfSUFSNSgpKTsKKwliZmluX3dyaXRlX1NJQ0JfSUFSNihiZmluX3JlYWRfU0lDQV9JQVI2KCkpOworCWJmaW5fd3JpdGVfU0lDQl9JQVI3KGJmaW5fcmVhZF9TSUNBX0lBUjcoKSk7CisJU1NZTkMoKTsKKworCWxvY2FsX2lycV9lbmFibGUoKTsKKworCS8qIENhbGlicmF0ZSBsb29wcyBwZXIgamlmZnkgdmFsdWUuICovCisJY2FsaWJyYXRlX2RlbGF5KCk7CisKKwkvKiBTdG9yZSBDUFUtcHJpdmF0ZSBpbmZvcm1hdGlvbiB0byB0aGUgY3B1X2RhdGEgYXJyYXkuICovCisJYmZpbl9zZXR1cF9jcHVkYXRhKGNwdSk7CisKKwkvKiBXZSBhcmUgZG9uZSB3aXRoIGxvY2FsIENQVSBpbml0cywgdW5ibG9jayB0aGUgYm9vdCBDUFUuICovCisJY3B1X3NldChjcHUsIGNwdV9jYWxsaW5fbWFwKTsKKwlzcGluX2xvY2soJmJvb3RfbG9jayk7CisJc3Bpbl91bmxvY2soJmJvb3RfbG9jayk7Cit9CisKK2ludCBfX2NwdWluaXQgcGxhdGZvcm1fYm9vdF9zZWNvbmRhcnkodW5zaWduZWQgaW50IGNwdSwgc3RydWN0IHRhc2tfc3RydWN0ICppZGxlKQoreworCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKKworCS8qIENvcmVCIGFscmVhZHkgcnVubmluZz8hICovCisJQlVHX09OKChiZmluX3JlYWRfU0lDQV9TWVNDUigpICYgQ09SRUJfU1JBTV9JTklUKSA9PSAwKTsKKworCXByaW50ayhLRVJOX0lORk8gIkJvb3RpbmcgQ29yZSBCLlxuIik7CisKKwlzcGluX2xvY2soJmJvb3RfbG9jayk7CisKKwkvKiBLaWNrIENvcmVCLCB3aGljaCBzaG91bGQgc3RhcnQgZXhlY3V0aW9uIGZyb20gQ09SRV9TUkFNX0JBU0UuICovCisJU1NZTkMoKTsKKwliZmluX3dyaXRlX1NJQ0FfU1lTQ1IoYmZpbl9yZWFkX1NJQ0FfU1lTQ1IoKSAmIH5DT1JFQl9TUkFNX0lOSVQpOworCVNTWU5DKCk7CisKKwl0aW1lb3V0ID0gamlmZmllcyArIDEgKiBIWjsKKwl3aGlsZSAodGltZV9iZWZvcmUoamlmZmllcywgdGltZW91dCkpIHsKKwkJaWYgKGNwdV9pc3NldChjcHUsIGNwdV9jYWxsaW5fbWFwKSkKKwkJCWJyZWFrOworCQl1ZGVsYXkoMTAwKTsKKwkJYmFycmllcigpOworCX0KKworCXNwaW5fdW5sb2NrKCZib290X2xvY2spOworCisJcmV0dXJuIGNwdV9pc3NldChjcHUsIGNwdV9jYWxsaW5fbWFwKSA/IDAgOiAtRU5PU1lTOworfQorCit2b2lkIF9faW5pdCBwbGF0Zm9ybV9yZXF1ZXN0X2lwaShpcnFfaGFuZGxlcl90IGhhbmRsZXIpCit7CisJaW50IHJldDsKKworCXJldCA9IHJlcXVlc3RfaXJxKElSUV9TVVBQTEVfMCwgaGFuZGxlciwgSVJRRl9ESVNBQkxFRCwKKwkJCSAgIlNNUCBpbnRlcnJ1cHQiLCBoYW5kbGVyKTsKKwlpZiAocmV0KQorCQlwYW5pYygiQ2Fubm90IHJlcXVlc3Qgc3VwcGxlbWVudGFsIGludGVycnVwdCAwIGZvciBJUEkgc2VydmljZVxuIik7Cit9CisKK3ZvaWQgcGxhdGZvcm1fc2VuZF9pcGkoY3B1bWFza190IGNhbGxtYXApCit7CisJdW5zaWduZWQgaW50IGNwdTsKKworCWZvcl9lYWNoX2NwdV9tYXNrKGNwdSwgY2FsbG1hcCkgeworCQlCVUdfT04oY3B1ID49IDIpOworCQlTU1lOQygpOworCQliZmluX3dyaXRlX1NJQ0JfU1lTQ1IoYmZpbl9yZWFkX1NJQ0JfU1lTQ1IoKSB8ICgxIDw8ICg2ICsgY3B1KSkpOworCQlTU1lOQygpOworCX0KK30KKwordm9pZCBwbGF0Zm9ybV9zZW5kX2lwaV9jcHUodW5zaWduZWQgaW50IGNwdSkKK3sKKwlCVUdfT04oY3B1ID49IDIpOworCVNTWU5DKCk7CisJYmZpbl93cml0ZV9TSUNCX1NZU0NSKGJmaW5fcmVhZF9TSUNCX1NZU0NSKCkgfCAoMSA8PCAoNiArIGNwdSkpKTsKKwlTU1lOQygpOworfQorCit2b2lkIHBsYXRmb3JtX2NsZWFyX2lwaSh1bnNpZ25lZCBpbnQgY3B1KQoreworCUJVR19PTihjcHUgPj0gMik7CisJU1NZTkMoKTsKKwliZmluX3dyaXRlX1NJQ0JfU1lTQ1IoYmZpbl9yZWFkX1NJQ0JfU1lTQ1IoKSB8ICgxIDw8ICgxMCArIGNwdSkpKTsKKwlTU1lOQygpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWNvbW1vbi9NYWtlZmlsZSBiL2FyY2gvYmxhY2tmaW4vbWFjaC1jb21tb24vTWFrZWZpbGUKaW5kZXggZTZlZDU3Yy4uMWYzMjI4ZSAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWNvbW1vbi9NYWtlZmlsZQorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtY29tbW9uL01ha2VmaWxlCkBAIC0zLDEwICszLDEyIEBACiAjCiAKIG9iai15IDo9IFwKLQljYWNoZS5vIGVudHJ5Lm8gaGVhZC5vIFwKKwljYWNoZS5vIGNhY2hlLWMubyBlbnRyeS5vIGhlYWQubyBcCiAJaW50ZXJydXB0Lm8gaXJxcGFuaWMubyBhcmNoX2NoZWNrcy5vIGludHMtcHJpb3JpdHkubwogCiBvYmotJChDT05GSUdfQkZJTl9JQ0FDSEVfTE9DSykgKz0gbG9jay5vCiBvYmotJChDT05GSUdfUE0pICAgICAgICAgICs9IHBtLm8gZHBtY19tb2Rlcy5vCiBvYmotJChDT05GSUdfQ1BVX0ZSRVEpICAgICs9IGNwdWZyZXEubwogb2JqLSQoQ09ORklHX0NQVV9WT0xUQUdFKSArPSBkcG1jLm8KK29iai0kKENPTkZJR19TTVApICAgICAgICAgKz0gc21wLm8KK29iai0kKENPTkZJR19CRklOX0tFUk5FTF9DTE9DSykgKz0gY2xvY2tzLWluaXQubwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWNvbW1vbi9jYWNoZS1jLmMgYi9hcmNoL2JsYWNrZmluL21hY2gtY29tbW9uL2NhY2hlLWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNmFiMWY4Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWNvbW1vbi9jYWNoZS1jLmMKQEAgLTAsMCArMSwyNCBAQAorLyoKKyAqIEJsYWNrZmluIGNhY2hlIGNvbnRyb2wgY29kZSAoc2ltcGxlciBjb250cm9sLXN0eWxlIGZ1bmN0aW9ucykKKyAqCisgKiBDb3B5cmlnaHQgMjAwNC0yMDA4IEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqCisgKiBFbnRlciBidWdzIGF0IGh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZy8KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCisgKi8KKworI2luY2x1ZGUgPGFzbS9ibGFja2Zpbi5oPgorCisvKiBJbnZhbGlkYXRlIHRoZSBFbnRpcmUgRGF0YSBjYWNoZSBieQorICogY2xlYXJpbmcgRE1DWzE6MF0gYml0cworICovCit2b2lkIGJsYWNrZmluX2ludmFsaWRhdGVfZW50aXJlX2RjYWNoZSh2b2lkKQoreworCXUzMiBkbWVtID0gYmZpbl9yZWFkX0RNRU1fQ09OVFJPTCgpOworCVNTWU5DKCk7CisJYmZpbl93cml0ZV9ETUVNX0NPTlRST0woZG1lbSAmIH4weGMpOworCVNTWU5DKCk7CisJYmZpbl93cml0ZV9ETUVNX0NPTlRST0woZG1lbSk7CisJU1NZTkMoKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1jb21tb24vY2FjaGUuUyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1jb21tb24vY2FjaGUuUwppbmRleCBhMDI4ZTk0Li4zYzk4ZGFjIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtY29tbW9uL2NhY2hlLlMKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWNvbW1vbi9jYWNoZS5TCkBAIC00OSwxMyArNDksMTcgQEAKIC5pZm5iIFxvcHRmbHVzaGlucwogCVxvcHRmbHVzaGlucyBbUDBdOwogLmVuZGlmCisjaWYgQU5PTUFMWV8wNTAwMDQ0MwogLmlmYiBcb3B0bm9waW5zCiAyOgogLmVuZGlmCiAJXGZsdXNoaW5zIFtQMCsrXTsKIC5pZm5iIFxvcHRub3BpbnMKLTI6IFxvcHRub3BpbnM7CisyOglcb3B0bm9waW5zOwogLmVuZGlmCisjZWxzZQorMjoJXGZsdXNoaW5zIFtQMCsrXTsKKyNlbmRpZgogCiAJUlRTOwogLmVuZG0KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1jb21tb24vY2xvY2tzLWluaXQuYyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1jb21tb24vY2xvY2tzLWluaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDE4MmFiCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWNvbW1vbi9jbG9ja3MtaW5pdC5jCkBAIC0wLDAgKzEsOTMgQEAKKy8qCisgKiBhcmNoL2JsYWNrZmluL21hY2gtY29tbW9uL2Nsb2Nrcy1pbml0LmMgLSByZXByb2dyYW0gY2xvY2tzIC8gbWVtb3J5CisgKgorICogQ29weXJpZ2h0IDIwMDQtMjAwOCBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGFzbS9ibGFja2Zpbi5oPgorCisjaW5jbHVkZSA8YXNtL2RtYS5oPgorI2luY2x1ZGUgPGFzbS9jbG9ja3MuaD4KKyNpbmNsdWRlIDxhc20vbWVtX2luaXQuaD4KKworI2RlZmluZSBQTExfQ1RMX1ZBTCBcCisJKCgoQ09ORklHX1ZDT19NVUxUICYgNjMpIDw8IDkpIHwgQ0xLSU5fSEFMRiB8IFwKKwkgKFBMTF9CWVBBU1MgPDwgOCkgfCAoQU5PTUFMWV8wNTAwMDI2NSA/IDB4ODAwMCA6IDApKQorCitfX2F0dHJpYnV0ZV9fKChsMV90ZXh0KSkKK3N0YXRpYyB2b2lkIGRvX3N5bmModm9pZCkKK3sKKwlfX2J1aWx0aW5fYmZpbl9zc3luYygpOworfQorCitfX2F0dHJpYnV0ZV9fKChsMV90ZXh0KSkKK3ZvaWQgaW5pdF9jbG9ja3Modm9pZCkKK3sKKwkvKiBLaWxsIGFueSBhY3RpdmUgRE1BcyBhcyB0aGV5IG1heSB0cmlnZ2VyIGV4dGVybmFsIG1lbW9yeSBhY2Nlc3NlcworCSAqIGluIHRoZSBtaWRkbGUgb2YgcmVwcm9ncmFtbWluZyB0aGluZ3MsIGFuZCB0aGF0J2xsIHNjcmV3IHVzIHVwLgorCSAqIEZvciBleGFtcGxlLCBhbnkgYXV0b21hdGljIERNQXMgbGVmdCBieSBVLUJvb3QgZm9yIHNwbGFzaCBzY3JlZW5zLgorCSAqLworCXNpemVfdCBpOworCWZvciAoaSA9IDA7IGkgPCBNQVhfRE1BX0NIQU5ORUxTOyArK2kpIHsKKwkJc3RydWN0IGRtYV9yZWdpc3RlciAqZG1hID0gZG1hX2lvX2Jhc2VfYWRkcltpXTsKKwkJZG1hLT5jZmcgPSAwOworCX0KKworCWRvX3N5bmMoKTsKKworI2lmZGVmIFNJQ19JV1IwCisJYmZpbl93cml0ZV9TSUNfSVdSMChJV1JfRU5BQkxFKDApKTsKKyMgaWZkZWYgU0lDX0lXUjEKKwkvKiBCRjUyeCBzeXN0ZW0gcmVzZXQgZG9lcyBub3QgcHJvcGVybHkgcmVzZXQgU0lDX0lXUjEgd2hpY2gKKwkgKiB3aWxsIHNjcmV3IHVwIHRoZSBib290cm9tIGFzIGl0IHJlbGllcyBvbiBNRE1BMC8xIHdha2luZyBpdAorCSAqIHVwIGZyb20gSURMRSBpbnN0cnVjdGlvbnMuICBTZWUgdGhpcyByZXBvcnQgZm9yIG1vcmUgaW5mbzoKKwkgKiBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvZ2YvdHJhY2tlci80MzIzCisJICovCisJaWYgKEFOT01BTFlfMDUwMDA0MzUpCisJCWJmaW5fd3JpdGVfU0lDX0lXUjEoSVdSX0VOQUJMRSgxMCkgfCBJV1JfRU5BQkxFKDExKSk7CisJZWxzZQorCQliZmluX3dyaXRlX1NJQ19JV1IxKElXUl9ESVNBQkxFX0FMTCk7CisjIGVuZGlmCisjIGlmZGVmIFNJQ19JV1IyCisJYmZpbl93cml0ZV9TSUNfSVdSMihJV1JfRElTQUJMRV9BTEwpOworIyBlbmRpZgorI2Vsc2UKKwliZmluX3dyaXRlX1NJQ19JV1IoSVdSX0VOQUJMRSgwKSk7CisjZW5kaWYKKwlkb19zeW5jKCk7CisjaWZkZWYgRUJJVV9TREdDVEwKKwliZmluX3dyaXRlX0VCSVVfU0RHQ1RMKGJmaW5fcmVhZF9FQklVX1NER0NUTCgpIHwgU1JGUyk7CisJZG9fc3luYygpOworI2VuZGlmCisKKyNpZmRlZiBDTEtCVUZPRQorCWJmaW5fd3JpdGUxNihWUl9DVEwsIGJmaW5fcmVhZF9WUl9DVEwoKSB8IENMS0JVRk9FKTsKKwlkb19zeW5jKCk7CisJX19hc21fXyBfX3ZvbGF0aWxlX18oIklETEU7Iik7CisjZW5kaWYKKwliZmluX3dyaXRlX1BMTF9MT0NLQ05UKDB4MzAwKTsKKwlkb19zeW5jKCk7CisJYmZpbl93cml0ZTE2KFBMTF9DVEwsIFBMTF9DVExfVkFMKTsKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygiSURMRTsiKTsKKwliZmluX3dyaXRlX1BMTF9ESVYoQ09ORklHX0NDTEtfQUNUX0RJViB8IENPTkZJR19TQ0xLX0RJVik7CisjaWZkZWYgRUJJVV9TREdDVEwKKwliZmluX3dyaXRlX0VCSVVfU0RSUkMobWVtX1NEUlJDKTsKKwliZmluX3dyaXRlX0VCSVVfU0RHQ1RMKG1lbV9TREdDVEwpOworI2Vsc2UKKwliZmluX3dyaXRlX0VCSVVfUlNUQ1RMKGJmaW5fcmVhZF9FQklVX1JTVENUTCgpICYgfihTUlJFUSkpOworCWRvX3N5bmMoKTsKKwliZmluX3dyaXRlX0VCSVVfUlNUQ1RMKGJmaW5fcmVhZF9FQklVX1JTVENUTCgpIHwgMHgxKTsKKwliZmluX3dyaXRlX0VCSVVfRERSQ1RMMChtZW1fRERSQ1RMMCk7CisJYmZpbl93cml0ZV9FQklVX0REUkNUTDEobWVtX0REUkNUTDEpOworCWJmaW5fd3JpdGVfRUJJVV9ERFJDVEwyKG1lbV9ERFJDVEwyKTsKKyNpZmRlZiBDT05GSUdfTUVNX0VCSVVfRERSUVVFCisJYmZpbl93cml0ZV9FQklVX0REUlFVRShDT05GSUdfTUVNX0VCSVVfRERSUVVFKTsKKyNlbmRpZgorI2VuZGlmCisJZG9fc3luYygpOworCWJmaW5fcmVhZDE2KDApOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWNvbW1vbi9jcHVmcmVxLmMgYi9hcmNoL2JsYWNrZmluL21hY2gtY29tbW9uL2NwdWZyZXEuYwppbmRleCBkZGE1NDQzLi43MmUxNjYwNSAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWNvbW1vbi9jcHVmcmVxLmMKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWNvbW1vbi9jcHVmcmVxLmMKQEAgLTEwNCw3ICsxMDQsNyBAQAogCQkgY2Nsa19oeiwgdGFyZ2V0X2ZyZXEsIGZyZXFzLm9sZCk7CiAKIAljcHVmcmVxX25vdGlmeV90cmFuc2l0aW9uKCZmcmVxcywgQ1BVRlJFUV9QUkVDSEFOR0UpOwotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwlsb2NhbF9pcnFfc2F2ZV9odyhmbGFncyk7CiAJCXBsbGRpdiA9IChiZmluX3JlYWRfUExMX0RJVigpICYgU1NFTCkgfCBkcG1fc3RhdGVfdGFibGVbaW5kZXhdLmNzZWw7CiAJCXRzY2FsZSA9IGRwbV9zdGF0ZV90YWJsZVtpbmRleF0udHNjYWxlOwogCQliZmluX3dyaXRlX1BMTF9ESVYocGxsZGl2KTsKQEAgLTExMiwxMCArMTEyLDEwIEBACiAJCWJmaW5fd3JpdGVfVFNDQUxFKHRzY2FsZSk7CiAJCWN5Y2xlcyA9IGdldF9jeWNsZXMoKTsKIAkJU1NZTkMoKTsKLQljeWNsZXMgKz0gMTA7IC8qIH4xMCBjeWNsZXMgd2UgbG9vc2UgYWZ0ZXIgZ2V0X2N5Y2xlcygpICovCisJY3ljbGVzICs9IDEwOyAvKiB+MTAgY3ljbGVzIHdlIGxvc2UgYWZ0ZXIgZ2V0X2N5Y2xlcygpICovCiAJX19iZmluX2N5Y2xlc19vZmYgKz0gKGN5Y2xlcyA8PCBfX2JmaW5fY3ljbGVzX21vZCkgLSAoY3ljbGVzIDw8IGluZGV4KTsKIAlfX2JmaW5fY3ljbGVzX21vZCA9IGluZGV4OwotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwlsb2NhbF9pcnFfcmVzdG9yZV9odyhmbGFncyk7CiAJLyogVE9ETzoganVzdCB0ZXN0IGNhc2UgZm9yIGN5Y2xlcyBjbG9jayBzb3VyY2UsIHJlbW92ZSBsYXRlciAqLwogCXByX2RlYnVnKCJjcHVmcmVxOiBkb25lXG4iKTsKIAljcHVmcmVxX25vdGlmeV90cmFuc2l0aW9uKCZmcmVxcywgQ1BVRlJFUV9QT1NUQ0hBTkdFKTsKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1jb21tb24vZHBtY19tb2Rlcy5TIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWNvbW1vbi9kcG1jX21vZGVzLlMKaW5kZXggYWQ1NDMxZS4uNGRhNTBiYyAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWNvbW1vbi9kcG1jX21vZGVzLlMKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWNvbW1vbi9kcG1jX21vZGVzLlMKQEAgLTI0Nyw3ICsyNDcsOCBAQAogRU5EUFJPQyhfdW5zZXRfZHJhbV9zcmZzKQogCiBFTlRSWShfc2V0X3NpY19pd3IpCi0jaWYgZGVmaW5lZChDT05GSUdfQkY1NHgpIHx8IGRlZmluZWQoQ09ORklHX0JGNTJ4KSAgfHwgZGVmaW5lZChDT05GSUdfQkY1NjEpCisjaWYgZGVmaW5lZChDT05GSUdfQkY1NHgpIHx8IGRlZmluZWQoQ09ORklHX0JGNTJ4KSB8fCBkZWZpbmVkKENPTkZJR19CRjU2MSkgfHwgXAorCWRlZmluZWQoQ09ORklHX0JGNTM4KSB8fCBkZWZpbmVkKENPTkZJR19CRjUzOSkgfHwgZGVmaW5lZChDT05GSUdfQkY1MXgpCiAJUDAuSCA9IGhpKFNJQ19JV1IwKTsKIAlQMC5MID0gbG8oU0lDX0lXUjApOwogCVAxLkggPSBoaShTSUNfSVdSMSk7CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtY29tbW9uL2VudHJ5LlMgYi9hcmNoL2JsYWNrZmluL21hY2gtY29tbW9uL2VudHJ5LlMKaW5kZXggYmRlNmRjNC4uZmFlNzc0NiAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWNvbW1vbi9lbnRyeS5TCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1jb21tb24vZW50cnkuUwpAQCAtMzYsNiArMzYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CiAjaW5jbHVkZSA8bGludXgvdW5pc3RkLmg+CisjaW5jbHVkZSA8bGludXgvdGhyZWFkcy5oPgogI2luY2x1ZGUgPGFzbS9ibGFja2Zpbi5oPgogI2luY2x1ZGUgPGFzbS9lcnJuby5oPgogI2luY2x1ZGUgPGFzbS9maXhlZF9jb2RlLmg+CkBAIC03NSwxMSArNzYsMTEgQEAKIAkgKiBoYW5kbGUgaXQuCiAJICovCiAJUDQgPSBSNzsJLyogU3RvcmUgRVhDQVVTRSAqLwotCXA1LmwgPSBfbGFzdF9jcGxiX2ZhdWx0X3JldHg7Ci0JcDUuaCA9IF9sYXN0X2NwbGJfZmF1bHRfcmV0eDsKLQlyNyA9IFtwNV07CisKKwlHRVRfUERBKHA1LCByNyk7CisJcjcgPSBbcDUgKyBQREFfTEZSRVRYXTsKIAlyNiA9IHJldHg7Ci0JW3A1XSA9IHI2OworCVtwNSArIFBEQV9MRlJFVFhdID0gcjY7CiAJY2MgPSByNiA9PSByNzsKIAlpZiAhY2MganVtcCBfYmZpbl9yZXR1cm5fZnJvbV9leGNlcHRpb247CiAJLyogZmFsbCB0aHJvdWdoICovCkBAIC0xMTEsMjQgKzExMiwyMSBAQAogRU5UUlkoX2V4X2RjcGxiX21pc3MpCiBFTlRSWShfZXhfaWNwbGJfbWlzcykKIAkoUjc6NixQNTo0KSA9IFtzcCsrXTsKLQlBU1RBVCA9IFtzcCsrXTsKLQlTQVZFX0FMTF9TWVMKLSNpZmRlZiBDT05GSUdfTVBVCisJLyogV2UgbGVhdmUgdGhlIHByZXZpb3VzbHkgcHVzaGVkIEFTVEFUIG9uIHRoZSBzdGFjay4gICovCisJU0FWRV9DT05URVhUX0NQTEIKKwogCS8qIFdlIG11c3QgbG9hZCBSMSBoZXJlLCBfYmVmb3JlXyBERUJVR19IV1RSQUNFX1NBVkUsIHNpbmNlIHRoYXQKIAkgKiB3aWxsIGNoYW5nZSB0aGUgc3RhY2sgcG9pbnRlci4gICovCiAJUjAgPSBTRVFTVEFUOwogCVIxID0gU1A7Ci0jZW5kaWYKKwogCURFQlVHX0hXVFJBQ0VfU0FWRShwNSwgcjcpCi0jaWZkZWYgQ09ORklHX01QVQorCiAJc3AgKz0gLTEyOwogCWNhbGwgX2NwbGJfaGRyOwogCXNwICs9IDEyOwogCUNDID0gUjAgPT0gMDsKIAlJRiAhQ0MgSlVNUCBfaGFuZGxlX2JhZF9jcGxiOwotI2Vsc2UKLQljYWxsIF9fY3BsYl9oZHI7Ci0jZW5kaWYKIAogI2lmZGVmIENPTkZJR19ERUJVR19ET1VCTEVGQVVMVAogCS8qIFdoaWxlIHdlIHdlcmUgcHJvY2Vzc2luZyB0aGlzLCBkaWQgd2UgZG91YmxlIGZhdWx0PyAqLwpAQCAtMTQyLDcgKzE0MCw4IEBACiAjZW5kaWYKIAogCURFQlVHX0hXVFJBQ0VfUkVTVE9SRShwNSwgcjcpCi0JUkVTVE9SRV9BTExfU1lTCisJUkVTVE9SRV9DT05URVhUX0NQTEIKKwlBU1RBVCA9IFtTUCsrXTsKIAlTUCA9IEVYX1NDUkFUQ0hfUkVHOwogCXJ0eDsKIEVORFBST0MoX2V4X2ljcGxiX21pc3MpCkBAIC0yOTcsOSArMjk2LDggQEAKIAkgKiB0aGUgc3RhY2sgdG8gZ2V0IHJlYWR5IHNvLCB3ZSBjYW4gZmFsbCB0aHJvdWdoIC0gd2UKIAkgKiBuZWVkIHRvIG1ha2UgYSBDUExCIGV4Y2VwdGlvbiBsb29rIGxpa2UgYSBub3JtYWwgZXhjZXB0aW9uCiAJICovCi0KLQlSRVNUT1JFX0FMTF9TWVMKLQlbLS1zcF0gPSBBU1RBVDsKKwlSRVNUT1JFX0NPTlRFWFRfQ1BMQgorCS8qIEFTVEFUIGlzIHN0aWxsIG9uIHRoZSBzdGFjaywgd2hlcmUgaXQgaXMgbmVlZGVkLiAgKi8KIAlbLS1zcF0gPSAoUjc6NixQNTo0KTsKIAogRU5UUlkoX2V4X3JlcGxhY2VhYmxlKQpAQCAtMzI0LDcgKzMyMiw5IEBACiAJW3A0XSA9IHA1OwogCWNzeW5jOwogCisJR0VUX1BEQShwNSwgcjYpOwogI2lmbmRlZiBDT05GSUdfREVCVUdfRE9VQkxFRkFVTFQKKwogCS8qCiAJICogU2F2ZSB0aGVzZSByZWdpc3RlcnMsIGFzIHRoZXkgYXJlIG9ubHkgdmFsaWQgaW4gZXhjZXB0aW9uIGNvbnRleHQKIAkgKiAgKHdoZXJlIHdlIGFyZSBub3cgLSBhcyBzb29uIGFzIHdlIGRlZmVyIHRvIElSUTUsIHRoZXkgY2FuIGNoYW5nZSkKQEAgLTMzNSwyOSArMzM1LDI1IEBACiAJcDQubCA9IGxvKERDUExCX0ZBVUxUX0FERFIpOwogCXA0LmggPSBoaShEQ1BMQl9GQVVMVF9BRERSKTsKIAlyNyA9IFtwNF07Ci0JcDUuaCA9IF9zYXZlZF9kY3BsYl9mYXVsdF9hZGRyOwotCXA1LmwgPSBfc2F2ZWRfZGNwbGJfZmF1bHRfYWRkcjsKLQlbcDVdID0gcjc7CisJW3A1ICsgUERBX0RDUExCXSA9IHI3OwogCi0JcjcgPSBbcDQgKyAoSUNQTEJfRkFVTFRfQUREUiAtIERDUExCX0ZBVUxUX0FERFIpXTsKLQlwNS5oID0gX3NhdmVkX2ljcGxiX2ZhdWx0X2FkZHI7Ci0JcDUubCA9IF9zYXZlZF9pY3BsYl9mYXVsdF9hZGRyOwotCVtwNV0gPSByNzsKKwlwNC5sID0gbG8oSUNQTEJfRkFVTFRfQUREUik7CisJcDQuaCA9IGhpKElDUExCX0ZBVUxUX0FERFIpOworCXI2ID0gW3A0XTsKKwlbcDUgKyBQREFfSUNQTEJdID0gcjY7CiAKIAlyNiA9IHJldHg7Ci0JcDQubCA9IF9zYXZlZF9yZXR4OwotCXA0LmggPSBfc2F2ZWRfcmV0eDsKLQlbcDRdID0gcjY7CisJW3A1ICsgUERBX1JFVFhdID0gcjY7CiAjZW5kaWYKIAlyNiA9IFNZU0NGRzsKLQlbcDQgKyA0XSA9IHI2OworCVtwNSArIFBEQV9TWVNDRkddID0gcjY7CiAJQklUQ0xSKHI2LCAwKTsKIAlTWVNDRkcgPSByNjsKIAogCS8qIERpc2FibGUgYWxsIGludGVycnVwdHMsIGJ1dCBtYWtlIHN1cmUgbGV2ZWwgNSBpcyBlbmFibGVkIHNvCiAJICogd2UgY2FuIHN3aXRjaCB0byB0aGF0IGxldmVsLiAgU2F2ZSB0aGUgb2xkIG1hc2suICAqLwogCWNsaSByNjsKLQlbcDQgKyA4XSA9IHI2OworCVtwNSArIFBEQV9FWElNQVNLXSA9IHI2OwogCiAJcDQubCA9IGxvKFNBRkVfVVNFUl9JTlNUUlVDVElPTik7CiAJcDQuaCA9IGhpKFNBRkVfVVNFUl9JTlNUUlVDVElPTik7CkBAIC0zNzEsOSArMzY3LDEwIEBACiBFTkRQUk9DKF9leF90cmFwX2MpCiAKIC8qIFdlIGp1c3QgcmVhbGl6ZWQgd2UgZ290IGFuIGV4Y2VwdGlvbiwgd2hpbGUgd2Ugd2VyZSBwcm9jZXNzaW5nIGEgZGlmZmVyZW50Ci0gKiBleGNlcHRpb24uIFRoaXMgaXMgYSB1bnJlY292ZXJhYmxlIGV2ZW50LCBzbyBjcmFzaAorICogZXhjZXB0aW9uLiBUaGlzIGlzIGEgdW5yZWNvdmVyYWJsZSBldmVudCwgc28gY3Jhc2guCisgKiBOb3RlOiB0aGlzIGNhbm5vdCBiZSBFTlRSWSgpIGFzIHdlIGp1bXAgaGVyZSB3aXRoICJpZiBjYyBqdW1wIiAuLi4KICAqLwotRU5UUlkoX2RvdWJsZV9mYXVsdCkKK19kb3VibGVfZmF1bHQ6CiAJLyogVHVybiBjYWNoZXMgJiBwcm90ZWN0aW9uIG9mZiwgdG8gZW5zdXJlIHdlIGRvbid0IGdldCBhbnkgbW9yZQogCSAqIGRvdWJsZSBleGNlcHRpb25zCiAJICovCkBAIC00MjQsMTcgKzQyMSwxNiBAQAogRU5UUlkoX2V4Y2VwdGlvbl90b19sZXZlbDUpCiAJU0FWRV9BTExfU1lTCiAKLQlwNC5sID0gX3NhdmVkX3JldHg7Ci0JcDQuaCA9IF9zYXZlZF9yZXR4OwotCXI2ID0gW3A0XTsKKwlHRVRfUERBKHA0LCByNyk7ICAgICAgICAvKiBGZXRjaCBjdXJyZW50IFBEQSAqLworCXI2ID0gW3A0ICsgUERBX1JFVFhdOwogCVtzcCArIFBUX1BDXSA9IHI2OwogCi0JcjYgPSBbcDQgKyA0XTsKKwlyNiA9IFtwNCArIFBEQV9TWVNDRkddOwogCVtzcCArIFBUX1NZU0NGR10gPSByNjsKIAogCS8qIFJlc3RvcmUgaW50ZXJydXB0IG1hc2suICBXZSBoYXZlbid0IHB1c2hlZCBSRVRJLCBzbyB0aGlzCiAJICogZG9lc24ndCBlbmFibGUgaW50ZXJydXB0cyB1bnRpbCB3ZSByZXR1cm4gZnJvbSB0aGlzIGhhbmRsZXIuICAqLwotCXI2ID0gW3A0ICsgOF07CisJcjYgPSBbcDQgKyBQREFfRVhJTUFTS107CiAJc3RpIHI2OwogCiAJLyogUmVzdG9yZSB0aGUgaGFyZHdhcmUgZXJyb3IgdmVjdG9yLiAgKi8KQEAgLTQ3OCw4ICs0NzQsOCBAQAogCSAqIHNjcmF0Y2ggcmVnaXN0ZXIgKGZvciB3YW50IG9mIGEgYmV0dGVyIG9wdGlvbikuCiAJICovCiAJRVhfU0NSQVRDSF9SRUcgPSBzcDsKLQlzcC5sID0gX2V4Y2VwdGlvbl9zdGFja190b3A7Ci0Jc3AuaCA9IF9leGNlcHRpb25fc3RhY2tfdG9wOworCUdFVF9QREFfU0FGRShzcCk7CisJc3AgPSBbc3AgKyBQREFfRVhTVEFDS10KIAkvKiBUcnkgdG8gZGVhbCB3aXRoIHN5c2NhbGxzIHF1aWNrbHkuICAqLwogCVstLXNwXSA9IEFTVEFUOwogCVstLXNwXSA9IChSNzo2LFA1OjQpOwpAQCAtNTAxLDI3ICs0OTcsMjIgQEAKIAkgKiBidXQgdGhleSBhcmUgbm90IHZlcnkgaW50ZXJlc3RpbmcsIHNvIGRvbid0IHNhdmUgdGhlbQogCSAqLwogCisJR0VUX1BEQShwNSwgcjcpOwogCXA0LmwgPSBsbyhEQ1BMQl9GQVVMVF9BRERSKTsKIAlwNC5oID0gaGkoRENQTEJfRkFVTFRfQUREUik7CiAJcjcgPSBbcDRdOwotCXA1LmggPSBfc2F2ZWRfZGNwbGJfZmF1bHRfYWRkcjsKLQlwNS5sID0gX3NhdmVkX2RjcGxiX2ZhdWx0X2FkZHI7Ci0JW3A1XSA9IHI3OworCVtwNSArIFBEQV9EQ1BMQl0gPSByNzsKIAotCXI3ID0gW3A0ICsgKElDUExCX0ZBVUxUX0FERFIgLSBEQ1BMQl9GQVVMVF9BRERSKV07Ci0JcDUuaCA9IF9zYXZlZF9pY3BsYl9mYXVsdF9hZGRyOwotCXA1LmwgPSBfc2F2ZWRfaWNwbGJfZmF1bHRfYWRkcjsKLQlbcDVdID0gcjc7CisJcDQubCA9IGxvKElDUExCX0ZBVUxUX0FERFIpOworCXA0LmggPSBoaShJQ1BMQl9GQVVMVF9BRERSKTsKKwlyNyA9IFtwNF07CisJW3A1ICsgUERBX0lDUExCXSA9IHI3OwogCi0JcDQubCA9IF9zYXZlZF9yZXR4OwotCXA0LmggPSBfc2F2ZWRfcmV0eDsKIAlyNiA9IHJldHg7Ci0JW3A0XSA9IHI2OworCVtwNSArIFBEQV9SRVRYXSA9IHI2OwogCiAJcjcgPSBTRVFTVEFUOwkJLyogcmVhc29uIGNvZGUgaXMgaW4gYml0IDU6MCAqLwotCXA0LmwgPSBfc2F2ZWRfc2Vxc3RhdDsKLQlwNC5oID0gX3NhdmVkX3NlcXN0YXQ7Ci0JW3A0XSA9IHI3OworCVtwNSArIFBEQV9TRVFTVEFUXSA9IHI3OwogI2Vsc2UKIAlyNyA9IFNFUVNUQVQ7ICAgICAgICAgICAvKiByZWFzb24gY29kZSBpcyBpbiBiaXQgNTowICovCiAjZW5kaWYKQEAgLTU0NiwxMSArNTM3LDExIEBACiAJcDAgPSBzcDsKIAlyMyA9IFNJWkVPRl9QVFJFR1MgLyA0OwogCXI0ID0gMCh4KTsKLTA6CisuTGNsZWFyX3JlZ3M6CiAJW3AwKytdID0gcjQ7CiAJcjMgKz0gLTE7CiAJY2MgPSByMyA9PSAwOwotCWlmICFjYyBqdW1wIDBiIChicCk7CisJaWYgIWNjIGp1bXAgLkxjbGVhcl9yZWdzIChicCk7CiAKIAlwMCA9IHNwOwogCXNwICs9IC0xNjsKQEAgLTU1OCw3ICs1NDksNyBAQAogCWNhbGwgX2RvX2V4ZWN2ZTsKIAlTUCArPSAxNjsKIAljYyA9IHIwID09IDA7Ci0JaWYgISBjYyBqdW1wIDFmOworCWlmICEgY2MganVtcCAuTGV4ZWN2ZV9mYWlsZWQ7CiAJLyogU3VjY2Vzcy4gIENvcHkgb3VyIHRlbXBvcmFyeSBwdF9yZWdzIHRvIHRoZSB0b3Agb2YgdGhlIGtlcm5lbAogCSAqIHN0YWNrIGFuZCBkbyBhIG5vcm1hbCBleGNlcHRpb24gcmV0dXJuLgogCSAqLwpAQCAtNTc0LDEyICs1NjUsMTIgQEAKIAlwMCA9IGZwOwogCXI0ID0gW3AwLS1dOwogCXIzID0gU0laRU9GX1BUUkVHUyAvIDQ7Ci0wOgorLkxjb3B5X3JlZ3M6CiAJcjQgPSBbcDAtLV07CiAJW3AxLS1dID0gcjQ7CiAJcjMgKz0gLTE7CiAJY2MgPSByMyA9PSAwOwotCWlmICEgY2MganVtcCAwYiAoYnApOworCWlmICEgY2MganVtcCAuTGNvcHlfcmVncyAoYnApOwogCiAJcjAgPSAoS0VSTkVMX1NUQUNLX1NJWkUgLSBTSVpFT0ZfUFRSRUdTKSAoeik7CiAJcDEgPSByMDsKQEAgLTU5MSw3ICs1ODIsNyBAQAogCiAJUkVTVE9SRV9DT05URVhUOwogCXJ0aTsKLTE6CisuTGV4ZWN2ZV9mYWlsZWQ6CiAJdW5saW5rOwogCXJ0czsKIEVORFBST0MoX2tlcm5lbF9leGVjdmUpCkBAIC05MjUsOSArOTE2LDE0IEBACiAJcDEgPSByZXRzOwogCVtzcCArIFBUX1JFU0VSVkVEXSA9IHAxOwogCi0JcDAubCA9IF9pcnFfZmxhZ3M7Ci0JcDAuaCA9IF9pcnFfZmxhZ3M7CisjaWZkZWYgQ09ORklHX1NNUAorCUdFVF9QREEocDAsIHIwKTsgCS8qIEZldGNoIGN1cnJlbnQgUERBIChjYW4ndCBtaWdyYXRlIHRvIG90aGVyIENQVSBoZXJlKSAqLworCXIwID0gW3AwICsgUERBX0lSUUZMQUdTXTsKKyNlbHNlCisJcDAubCA9IF9iZmluX2lycV9mbGFnczsKKwlwMC5oID0gX2JmaW5faXJxX2ZsYWdzOwogCXIwID0gW3AwXTsKKyNlbmRpZgogCXN0aSByMDsKIAogCXIwID0gc3A7CkBAIC0xNTM5LDE0ICsxNTM1LDE4IEBACiAJLmVuZHIKIEVORChfc3lzX2NhbGxfdGFibGUpCiAKLV9leGNlcHRpb25fc3RhY2s6Ci0JLnJlcHQgMTAyNAotCS5sb25nIDA7CisjaWZkZWYgQ09ORklHX0VYQ0VQVElPTl9MMV9TQ1JBVENICisvKiAuc2VjdGlvbiAubDEuYnNzLnNjcmF0Y2ggKi8KKy5zZXQgX2V4Y2VwdGlvbl9zdGFja190b3AsIEwxX1NDUkFUQ0hfU1RBUlQgKyBMMV9TQ1JBVENIX0xFTkdUSAorI2Vsc2UKKyNpZmRlZiBDT05GSUdfU1lTQ0FMTF9UQUJfTDEKKy5zZWN0aW9uIC5sMS5ic3MKKyNlbHNlCisuYnNzCisjZW5kaWYKK0VOVFJZKF9leGNlcHRpb25fc3RhY2spCisJLnJlcHQgMTAyNCAqIE5SX0NQVVMKKwkubG9uZyAwCiAJLmVuZHIKIF9leGNlcHRpb25fc3RhY2tfdG9wOgotCi0jaWYgQU5PTUFMWV8wNTAwMDI2MQotLyogVXNlZCBieSB0aGUgYXNzZW1ibHkgZW50cnkgcG9pbnQgdG8gd29yayBhcm91bmQgYW4gYW5vbWFseS4gICovCi1fbGFzdF9jcGxiX2ZhdWx0X3JldHg6Ci0JLmxvbmcgMDsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWNvbW1vbi9oZWFkLlMgYi9hcmNoL2JsYWNrZmluL21hY2gtY29tbW9uL2hlYWQuUwppbmRleCBmMTIzYTYyLi5lMWU0MmMwIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtY29tbW9uL2hlYWQuUworKysgYi9hcmNoL2JsYWNrZmluL21hY2gtY29tbW9uL2hlYWQuUwpAQCAtMTMsNiArMTMsNyBAQAogI2luY2x1ZGUgPGFzbS9ibGFja2Zpbi5oPgogI2luY2x1ZGUgPGFzbS90aHJlYWRfaW5mby5oPgogI2luY2x1ZGUgPGFzbS90cmFjZS5oPgorI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgogCiBfX0lOSVQKIApAQCAtMTExLDMzICsxMTIsMjYgQEAKIAkgKiBUaGlzIGhhcHBlbnMgaGVyZSwgc2luY2UgTDEgZ2V0cyBjbG9iYmVyZWQKIAkgKiBiZWxvdwogCSAqLwotCXAwLmwgPSBfc2F2ZWRfcmV0eDsKLQlwMC5oID0gX3NhdmVkX3JldHg7CisJR0VUX1BEQShwMCwgcjApOworCXI3ID0gW3AwICsgUERBX1JFVFhdOwogCXAxLmwgPSBfaW5pdF9zYXZlZF9yZXR4OwogCXAxLmggPSBfaW5pdF9zYXZlZF9yZXR4OwotCXIwID0gW3AwXTsKLQlbcDFdID0gcjA7CisJW3AxXSA9IHI3OwogCi0JcDAubCA9IF9zYXZlZF9kY3BsYl9mYXVsdF9hZGRyOwotCXAwLmggPSBfc2F2ZWRfZGNwbGJfZmF1bHRfYWRkcjsKKwlyNyA9IFtwMCArIFBEQV9EQ1BMQl07CiAJcDEubCA9IF9pbml0X3NhdmVkX2RjcGxiX2ZhdWx0X2FkZHI7CiAJcDEuaCA9IF9pbml0X3NhdmVkX2RjcGxiX2ZhdWx0X2FkZHI7Ci0JcjAgPSBbcDBdOwotCVtwMV0gPSByMDsKKwlbcDFdID0gcjc7CiAKLQlwMC5sID0gX3NhdmVkX2ljcGxiX2ZhdWx0X2FkZHI7Ci0JcDAuaCA9IF9zYXZlZF9pY3BsYl9mYXVsdF9hZGRyOworCXI3ID0gW3AwICsgUERBX0lDUExCXTsKIAlwMS5sID0gX2luaXRfc2F2ZWRfaWNwbGJfZmF1bHRfYWRkcjsKIAlwMS5oID0gX2luaXRfc2F2ZWRfaWNwbGJfZmF1bHRfYWRkcjsKLQlyMCA9IFtwMF07Ci0JW3AxXSA9IHIwOworCVtwMV0gPSByNzsKIAotCXAwLmwgPSBfc2F2ZWRfc2Vxc3RhdDsKLQlwMC5oID0gX3NhdmVkX3NlcXN0YXQ7CisJcjcgPSBbcDAgKyBQREFfU0VRU1RBVF07CiAJcDEubCA9IF9pbml0X3NhdmVkX3NlcXN0YXQ7CiAJcDEuaCA9IF9pbml0X3NhdmVkX3NlcXN0YXQ7Ci0JcjAgPSBbcDBdOwotCVtwMV0gPSByMDsKKwlbcDFdID0gcjc7CiAjZW5kaWYKIAogCS8qIEluaXRpYWxpemUgc3RhY2sgcG9pbnRlciAqLwpAQCAtMTUzLDcgKzE0Nyw3IEBACiAJLyogUHV0IFRoZSBDb2RlIGZvciBQTEwgUHJvZ3JhbW1pbmcgYW5kIFNEUkFNIFByb2dyYW1taW5nIGluIEwxIElTUkFNICovCiAJY2FsbCBfYmZpbl9yZWxvY2F0ZV9sMV9tZW07CiAjaWZkZWYgQ09ORklHX0JGSU5fS0VSTkVMX0NMT0NLCi0JY2FsbCBfc3RhcnRfZG1hX2NvZGU7CisJY2FsbCBfaW5pdF9jbG9ja3M7CiAjZW5kaWYKIAogCS8qIFRoaXMgc2VjdGlvbiBrZWVwcyB0aGUgcHJvY2Vzc29yIGluIHN1cGVydmlzb3IgbW9kZQpAQCAtMTcwLDEyICsxNjQsOCBAQAogCVtwMF0gPSBwMTsKIAljc3luYzsKIAotCXAwLmwgPSBsbyhJTUFTSyk7Ci0JcDAuaCA9IGhpKElNQVNLKTsKLQlwMS5sID0gSU1BU0tfSVZHMTU7Ci0JcDEuaCA9IDB4MDsKLQlbcDBdID0gcDE7Ci0JY3N5bmM7CisJcjAgPSBFVlRfSVZHMTUgKHopOworCXN0aSByMDsKIAogCXJhaXNlIDE1OwogCXAwLmwgPSAuTFdBSVRfSEVSRTsKQEAgLTE5NSw2ICsxODUsMTkgQEAKICMgZGVmaW5lIFdET0dfQ1RMIFdET0dBX0NUTAogI2VuZGlmCiAKK0VOVFJZKF9faW5pdF9jbGVhcl9ic3MpCisJcjIgPSByMiAtIHIxOworCWNjID0gcjIgPT0gMDsKKwlpZiBjYyBqdW1wIC5MX2Jzc19kb25lOworCXIyID4+PSAyOworCXAxID0gcjE7CisJcDIgPSByMjsKKwlsc2V0dXAgKDFmLCAxZikgbGMwID0gcDI7CisxOglbcDErK10gPSByMDsKKy5MX2Jzc19kb25lOgorCXJ0czsKK0VORFBST0MoX19pbml0X2NsZWFyX2JzcykKKwogRU5UUlkoX3JlYWxfc3RhcnQpCiAJLyogRW5hYmxlIG5lc3RlZCBpbnRlcnJ1cHRzICovCiAJWy0tc3BdID0gcmV0aTsKQEAgLTIwNiw4NyArMjA5LDM0IEBACiAJd1twMF0gPSByMDsKIAlzc3luYzsKIAorCXIwID0gMCAoeCk7CisJLyogWmVybyBvdXQgYWxsIG9mIHRoZSBmdW4gYnNzIHJlZ2lvbnMgKi8KICNpZiBMMV9EQVRBX0FfTEVOR1RIID4gMAogCXIxLmwgPSBfX3Nic3NfbDE7CiAJcjEuaCA9IF9fc2Jzc19sMTsKIAlyMi5sID0gX19lYnNzX2wxOwogCXIyLmggPSBfX2Vic3NfbDE7Ci0JcjAgPSAwICh6KTsKLQlyMiA9IHIyIC0gcjE7Ci0JY2MgPSByMiA9PSAwOwotCWlmIGNjIGp1bXAgLkxfYV9sMV9kb25lOwotCXIyID4+PSAyOwotCXAxID0gcjE7Ci0JcDIgPSByMjsKLQlsc2V0dXAgKC5MX2NsZWFyX2FfbDEsIC5MX2NsZWFyX2FfbDEgKSBsYzAgPSBwMjsKLS5MX2NsZWFyX2FfbDE6Ci0JW3AxKytdID0gcjA7Ci0uTF9hX2wxX2RvbmU6CisJY2FsbCBfX2luaXRfY2xlYXJfYnNzCiAjZW5kaWYKLQogI2lmIEwxX0RBVEFfQl9MRU5HVEggPiAwCiAJcjEubCA9IF9fc2Jzc19iX2wxOwogCXIxLmggPSBfX3Nic3NfYl9sMTsKIAlyMi5sID0gX19lYnNzX2JfbDE7CiAJcjIuaCA9IF9fZWJzc19iX2wxOwotCXIwID0gMCAoeik7Ci0JcjIgPSByMiAtIHIxOwotCWNjID0gcjIgPT0gMDsKLQlpZiBjYyBqdW1wIC5MX2JfbDFfZG9uZTsKLQlyMiA+Pj0gMjsKLQlwMSA9IHIxOwotCXAyID0gcjI7Ci0JbHNldHVwICguTF9jbGVhcl9iX2wxLCAuTF9jbGVhcl9iX2wxICkgbGMwID0gcDI7Ci0uTF9jbGVhcl9iX2wxOgotCVtwMSsrXSA9IHIwOwotLkxfYl9sMV9kb25lOgorCWNhbGwgX19pbml0X2NsZWFyX2JzcwogI2VuZGlmCi0KICNpZiBMMl9MRU5HVEggPiAwCiAJcjEubCA9IF9fc2Jzc19sMjsKIAlyMS5oID0gX19zYnNzX2wyOwogCXIyLmwgPSBfX2Vic3NfbDI7CiAJcjIuaCA9IF9fZWJzc19sMjsKLQlyMCA9IDAgKHopOwotCXIyID0gcjIgLSByMTsKLQljYyA9IHIyID09IDA7Ci0JaWYgY2MganVtcCAuTF9sMl9kb25lOwotCXIyID4+PSAyOwotCXAxID0gcjE7Ci0JcDIgPSByMjsKLQlsc2V0dXAgKC5MX2NsZWFyX2wyLCAuTF9jbGVhcl9sMiApIGxjMCA9IHAyOwotLkxfY2xlYXJfbDI6Ci0JW3AxKytdID0gcjA7Ci0uTF9sMl9kb25lOgorCWNhbGwgX19pbml0X2NsZWFyX2JzcwogI2VuZGlmCi0KLQkvKiBaZXJvIG91dCB0aGUgYnNzIHJlZ2lvbgotCSAqIE5vdGU6IHRoaXMgd2lsbCBmYWlsIGlmIGJzcyBpcyAwIGJ5dGVzIC4uLgotCSAqLwotCXIwID0gMCAoeik7CiAJcjEubCA9IF9fX2Jzc19zdGFydDsKIAlyMS5oID0gX19fYnNzX3N0YXJ0OwogCXIyLmwgPSBfX19ic3Nfc3RvcDsKIAlyMi5oID0gX19fYnNzX3N0b3A7Ci0JcjIgPSByMiAtIHIxOwotCXIyID4+PSAyOwotCXAxID0gcjE7Ci0JcDIgPSByMjsKLQlsc2V0dXAgKC5MX2NsZWFyX2JzcywgLkxfY2xlYXJfYnNzKSBsYzAgPSBwMjsKLS5MX2NsZWFyX2JzczoKLQlbcDErK10gPSByMDsKLQotCS8qIEluIGNhc2UgdGhlcmUgaXMgYSBOVUxMIHBvaW50ZXIgcmVmZXJlbmNlLAotCSAqIHplcm8gb3V0IHJlZ2lvbiBiZWZvcmUgc3RleHQKLQkgKi8KLQlwMSA9IHIwOwotCXIyLmwgPSBfX3N0ZXh0OwotCXIyLmggPSBfX3N0ZXh0OwotCXIyID4+PSAyOwotCXAyID0gcjI7Ci0JbHNldHVwICguTF9jbGVhcl96ZXJvLCAuTF9jbGVhcl96ZXJvKSBsYzAgPSBwMjsKLS5MX2NsZWFyX3plcm86Ci0JW3AxKytdID0gcjA7CisJY2FsbCBfX2luaXRfY2xlYXJfYnNzCiAKIAkvKiBQYXNzIHRoZSB1LWJvb3QgYXJndW1lbnRzIHRvIHRoZSBnbG9iYWwgdmFsdWUgY29tbWFuZCBsaW5lICovCiAJUjAgPSBSNzsKQEAgLTI5OSw2ICsyNDksOSBAQAogCXNwID0gc3AgKyBwMTsKIAl1c3AgPSBzcDsKIAlmcCA9IHNwOworCXNwICs9IC0xMjsKKwljYWxsIF9pbml0X3BkYQorCXNwICs9IDEyOwogCWp1bXAubCBfc3RhcnRfa2VybmVsOwogRU5EUFJPQyhfcmVhbF9zdGFydCkKIApkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWNvbW1vbi9pbnRlcnJ1cHQuUyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1jb21tb24vaW50ZXJydXB0LlMKaW5kZXggNGEyZWM3YS4uNDczZGYwZiAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWNvbW1vbi9pbnRlcnJ1cHQuUworKysgYi9hcmNoL2JsYWNrZmluL21hY2gtY29tbW9uL2ludGVycnVwdC5TCkBAIC0xMjksOCArMTI5LDE1IEBACiAjZW5kaWYKIAlyMSA9ICBzcDsKIAlTUCArPSAtMTI7CisjaWZkZWYgQ09ORklHX0lQSVBFCisJY2FsbCBfX19pcGlwZV9ncmFiX2lycQorCVNQICs9IDEyOworCWNjID0gcjAgPT0gMDsKKwlpZiBjYyBqdW1wIC5MY29tbW9uX3Jlc3RvcmVfY29udGV4dDsKKyNlbHNlIC8qIENPTkZJR19JUElQRSAqLwogCWNhbGwgX2RvX2lycTsKIAlTUCArPSAxMjsKKyNlbmRpZiAvKiBDT05GSUdfSVBJUEUgKi8KIAljYWxsIF9yZXR1cm5fZnJvbV9pbnQ7CiAuTGNvbW1vbl9yZXN0b3JlX2NvbnRleHQ6CiAJUkVTVE9SRV9DT05URVhUCkBAIC0xNTIsMTUgKzE1OSw2IEBACiAxOgogI2VuZGlmCiAKLSNpZmRlZiBDT05GSUdfSEFSRFdBUkVfUE0KLQlyNyA9IFtzcCArIFBUX1NFUVNUQVRdOwotCXI3ID0gcjcgPj4+IDB4ZTsKLQlyNiA9IDB4MUY7Ci0JcjcgPSByNyAmIHI2OwotCXI1ID0gMHgxMjsKLQljYyA9IHI3ID09IHI1OwotCWlmIGNjIGp1bXAgLkxjYWxsX2RvX292ZjsgLyogZGVhbCB3aXRoIHBlcmZvcm1hbmNlIGNvdW50ZXIgb3ZlcmZsb3cgKi8KLSNlbmRpZgogCSMgV2UgYXJlIGdvaW5nIHRvIGR1bXAgc29tZXRoaW5nIG91dCwgc28gbWFrZSBzdXJlIHdlIHByaW50IElQRU5EIHByb3Blcmx5CiAJcDIubCA9IGxvKElQRU5EKTsKIAlwMi5oID0gaGkoSVBFTkQpOwpAQCAtMTkyLDE3ICsxOTAsNiBAQAogLkxjb21tb25fcmVzdG9yZV9hbGxfc3lzOgogCVJFU1RPUkVfQUxMX1NZUwogCXJ0aTsKLQotI2lmZGVmIENPTkZJR19IQVJEV0FSRV9QTQotLkxjYWxsX2RvX292ZjoKLQotCVNQICs9IC0xMjsKLQljYWxsIF9wbV9vdmVyZmxvdzsKLQlTUCArPSAxMjsKLQotCWp1bXAgLkxjb21tb25fcmVzdG9yZV9hbGxfc3lzOwotI2VuZGlmCi0KIEVORFBST0MoX2V2dF9pdmh3KQogCiAvKiBJbnRlcnJ1cHQgcm91dGluZSBmb3IgZXZ0MiAoTk1JKS4KQEAgLTI0NSwzICsyMzIsNTYgQEAKIAljYWxsIF9zeXN0ZW1fY2FsbDsKIAlqdW1wIC5MY29tbW9uX3Jlc3RvcmVfY29udGV4dDsKIEVORFBST0MoX2V2dF9zeXN0ZW1fY2FsbCkKKworI2lmZGVmIENPTkZJR19JUElQRQorRU5UUlkoX19faXBpcGVfY2FsbF9pcnF0YWlsKQorCXIwLmwgPSAxZjsKKwlyMC5oID0gMWY7CisJcmV0aSA9IHIwOworCXJ0aTsKKzE6CisJWy0tc3BdID0gcmV0czsKKwlbLS1zcF0gPSAoIHI3OjQsIHA1OjMgKTsKKwlwMC5sID0gX19faXBpcGVfaXJxX3RhaWxfaG9vazsKKwlwMC5oID0gX19faXBpcGVfaXJxX3RhaWxfaG9vazsKKwlwMCA9IFtwMF07CisJc3AgKz0gLTEyOworCWNhbGwgKHAwKTsKKwlzcCArPSAxMjsKKwkoIHI3OjQsIHA1OjMgKSA9IFtzcCsrXTsKKwlyZXRzID0gW3NwKytdOworCisJWy0tc3BdID0gcmV0aTsKKwlyZXRpID0gW3NwKytdOyAgICAgICAgICAvKiBJUlFzIGFyZSBvZmYuICovCisJcjAuaCA9IDNmOworCXIwLmwgPSAzZjsKKwlwMC5sID0gbG8oRVZUMTQpOworCXAwLmggPSBoaShFVlQxNCk7CisJW3AwXSA9IHIwOworCWNzeW5jOworCXIwID0gMHg0MDFmOworCXN0aSByMDsKKwlyYWlzZSAxNDsKKwlbLS1zcF0gPSByZXRpOyAgICAgICAgICAvKiBJUlFzIG9uLiAqLworMjoKKwlqdW1wIDJiOyAgICAgICAgICAgICAgICAvKiBMaWtlbHkgcGFyYW5vaWQuICovCiszOgorCXNwICs9IDQ7ICAgICAgICAgICAgICAgIC8qIERpc2NhcmQgc2F2ZWQgUkVUSSAqLworCXIwLmggPSBfZXZ0MTRfc29mdGlycTsKKwlyMC5sID0gX2V2dDE0X3NvZnRpcnE7CisJcDAubCA9IGxvKEVWVDE0KTsKKwlwMC5oID0gaGkoRVZUMTQpOworCVtwMF0gPSByMDsKKwljc3luYzsKKwlwMC5sID0gX2JmaW5faXJxX2ZsYWdzOworCXAwLmggPSBfYmZpbl9pcnFfZmxhZ3M7CisJcjAgPSBbcDBdOworCXN0aSByMDsKKyNpZiAwIC8qIEZJWE1FOiB0aGlzIGFjdHVhbGx5IHJhaXNlcyBzY2hlZHVsaW5nIGxhdGVuY2llcyAqLworCS8qIFJlZW5hYmxlIGludGVycnVwdHMgKi8KKwlbLS1zcF0gPSByZXRpOworCXIwID0gW3NwKytdOworI2VuZGlmCisJcnRzOworRU5EUFJPQyhfX19pcGlwZV9jYWxsX2lycXRhaWwpCisjZW5kaWYgLyogQ09ORklHX0lQSVBFICovCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtY29tbW9uL2ludHMtcHJpb3JpdHkuYyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1jb21tb24vaW50cy1wcmlvcml0eS5jCmluZGV4IDM0ZThhNzIuLjFiYmE2MDMgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1jb21tb24vaW50cy1wcmlvcml0eS5jCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1jb21tb24vaW50cy1wcmlvcml0eS5jCkBAIC0xLDkgKzEsNiBAQAogLyoKICAqIEZpbGU6ICAgICAgICAgYXJjaC9ibGFja2Zpbi9tYWNoLWNvbW1vbi9pbnRzLXByaW9yaXR5LmMKLSAqIEJhc2VkIG9uOgotICogQXV0aG9yOgogICoKLSAqIENyZWF0ZWQ6ICAgICAgPwogICogRGVzY3JpcHRpb246ICBTZXQgdXAgdGhlIGludGVycnVwdCBwcmlvcml0aWVzCiAgKgogICogTW9kaWZpZWQ6CkBAIC0zNyw2ICszNCw5IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsX3N0YXQuaD4KICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2lmZGVmIENPTkZJR19JUElQRQorI2luY2x1ZGUgPGxpbnV4L2lwaXBlLmg+CisjZW5kaWYKICNpZmRlZiBDT05GSUdfS0dEQgogI2luY2x1ZGUgPGxpbnV4L2tnZGIuaD4KICNlbmRpZgpAQCAtNDUsNiArNDUsOCBAQAogI2luY2x1ZGUgPGFzbS9ncGlvLmg+CiAjaW5jbHVkZSA8YXNtL2lycV9oYW5kbGVyLmg+CiAKKyNkZWZpbmUgU0lDX1NZU0lSUShpcnEpCShpcnEgLSAoSVJRX0NPUkVUTVIgKyAxKSkKKwogI2lmZGVmIEJGNTM3X0ZBTUlMWQogIyBkZWZpbmUgQkY1MzdfR0VORVJJQ19FUlJPUl9JTlRfREVNVVgKICNlbHNlCkBAIC01OCwxMyArNjAsMTYgQEAKICAqIC0KICAqLwogCisjaWZuZGVmIENPTkZJR19TTVAKIC8qIEluaXRpYWxpemUgdGhpcyB0byBhbiBhY3R1YWwgdmFsdWUgdG8gZm9yY2UgaXQgaW50byB0aGUgLmRhdGEKICAqIHNlY3Rpb24gc28gdGhhdCB3ZSBrbm93IGl0IGlzIHByb3Blcmx5IGluaXRpYWxpemVkIGF0IGVudHJ5IGludG8KICAqIHRoZSBrZXJuZWwgYnV0IGJlZm9yZSBic3MgaXMgaW5pdGlhbGl6ZWQgdG8gemVybyAod2hpY2ggaXMgd2hlcmUKICAqIGl0IHdvdWxkIGxpdmUgb3RoZXJ3aXNlKS4gIFRoZSAweDFmIG1hZ2ljIHJlcHJlc2VudHMgdGhlIElSUXMgd2UKICAqIGNhbm5vdCBhY3R1YWxseSBtYXNrIG91dCBpbiBoYXJkd2FyZS4KICAqLwotdW5zaWduZWQgbG9uZyBpcnFfZmxhZ3MgPSAweDFmOwordW5zaWduZWQgbG9uZyBiZmluX2lycV9mbGFncyA9IDB4MWY7CitFWFBPUlRfU1lNQk9MKGJmaW5faXJxX2ZsYWdzKTsKKyNlbmRpZgogCiAvKiBUaGUgbnVtYmVyIG9mIHNwdXJpb3VzIGludGVycnVwdHMgKi8KIGF0b21pY190IG51bV9zcHVyaW91czsKQEAgLTEwMywxMiArMTA4LDE0IEBACiAJCWZvciAoaXJxbiA9IDA7IGlycW4gPCBOUl9QRVJJX0lOVFM7IGlycW4rKykgewogCQkJaW50IGlhcl9zaGlmdCA9IChpcnFuICYgNykgKiA0OwogCQkJCWlmIChpdmcgPT0gKDB4ZiAmCi0jaWZuZGVmIENPTkZJR19CRjUyeAorI2lmIGRlZmluZWQoQ09ORklHX0JGNTJ4KSB8fCBkZWZpbmVkKENPTkZJR19CRjUzOCkgXAorCXx8IGRlZmluZWQoQ09ORklHX0JGNTM5KSB8fCBkZWZpbmVkKENPTkZJR19CRjUxeCkKIAkJCSAgICAgYmZpbl9yZWFkMzIoKHVuc2lnbmVkIGxvbmcgKilTSUNfSUFSMCArCi0JCQkJCSAoaXJxbiA+PiAzKSkgPj4gaWFyX3NoaWZ0KSkgeworCQkJCQkgKChpcnFuICUgMzIpID4+IDMpICsgKChpcnFuIC8gMzIpICoKKwkJCQkJICgoU0lDX0lBUjQgLSBTSUNfSUFSMCkgLyA0KSkpID4+IGlhcl9zaGlmdCkpIHsKICNlbHNlCiAJCQkgICAgIGJmaW5fcmVhZDMyKCh1bnNpZ25lZCBsb25nICopU0lDX0lBUjAgKwotCQkJCQkgKChpcnFuJTMyKSA+PiAzKSArICgoaXJxbiAvIDMyKSAqIDE2KSkgPj4gaWFyX3NoaWZ0KSkgeworCQkJCQkgKGlycW4gPj4gMykpID4+IGlhcl9zaGlmdCkpIHsKICNlbmRpZgogCQkJCWl2Z190YWJsZVtpcnFfcG9zXS5pcnFubyA9IElWRzcgKyBpcnFuOwogCQkJCWl2Z190YWJsZVtpcnFfcG9zXS5pc3JmbGFnID0gMSA8PCAoaXJxbiAlIDMyKTsKQEAgLTEzMCwyNSArMTM3LDI1IEBACiAKIHN0YXRpYyB2b2lkIGJmaW5fY29yZV9tYXNrX2lycSh1bnNpZ25lZCBpbnQgaXJxKQogewotCWlycV9mbGFncyAmPSB+KDEgPDwgaXJxKTsKLQlpZiAoIWlycXNfZGlzYWJsZWQoKSkKLQkJbG9jYWxfaXJxX2VuYWJsZSgpOworCWJmaW5faXJxX2ZsYWdzICY9IH4oMSA8PCBpcnEpOworCWlmICghaXJxc19kaXNhYmxlZF9odygpKQorCQlsb2NhbF9pcnFfZW5hYmxlX2h3KCk7CiB9CiAKIHN0YXRpYyB2b2lkIGJmaW5fY29yZV91bm1hc2tfaXJxKHVuc2lnbmVkIGludCBpcnEpCiB7Ci0JaXJxX2ZsYWdzIHw9IDEgPDwgaXJxOworCWJmaW5faXJxX2ZsYWdzIHw9IDEgPDwgaXJxOwogCS8qCiAJICogSWYgaW50ZXJydXB0cyBhcmUgZW5hYmxlZCwgSU1BU0sgbXVzdCBjb250YWluIHRoZSBzYW1lIHZhbHVlCi0JICogYXMgaXJxX2ZsYWdzLiAgTWFrZSBzdXJlIHRoYXQgaW52YXJpYW50IGhvbGRzLiAgSWYgaW50ZXJydXB0cworCSAqIGFzIGJmaW5faXJxX2ZsYWdzLiAgTWFrZSBzdXJlIHRoYXQgaW52YXJpYW50IGhvbGRzLiAgSWYgaW50ZXJydXB0cwogCSAqIGFyZSBjdXJyZW50bHkgZGlzYWJsZWQgd2UgbmVlZCBub3QgZG8gYW55dGhpbmc7IG9uZSBvZiB0aGUKIAkgKiBjYWxsZXJzIHdpbGwgdGFrZSBjYXJlIG9mIHNldHRpbmcgSU1BU0sgdG8gdGhlIHByb3BlciB2YWx1ZQogCSAqIHdoZW4gcmVlbmFibGluZyBpbnRlcnJ1cHRzLgotCSAqIGxvY2FsX2lycV9lbmFibGUganVzdCBkb2VzICJTVEkgaXJxX2ZsYWdzIiwgc28gaXQncyBleGFjdGx5CisJICogbG9jYWxfaXJxX2VuYWJsZSBqdXN0IGRvZXMgIlNUSSBiZmluX2lycV9mbGFncyIsIHNvIGl0J3MgZXhhY3RseQogCSAqIHdoYXQgd2UgbmVlZC4KIAkgKi8KLQlpZiAoIWlycXNfZGlzYWJsZWQoKSkKLQkJbG9jYWxfaXJxX2VuYWJsZSgpOworCWlmICghaXJxc19kaXNhYmxlZF9odygpKQorCQlsb2NhbF9pcnFfZW5hYmxlX2h3KCk7CiAJcmV0dXJuOwogfQogCkBAIC0xNjMsOCArMTcwLDExIEBACiAJbWFza19iaXQgPSBTSUNfU1lTSVJRKGlycSkgJSAzMjsKIAliZmluX3dyaXRlX1NJQ19JTUFTSyhtYXNrX2JhbmssIGJmaW5fcmVhZF9TSUNfSU1BU0sobWFza19iYW5rKSAmCiAJCQkgICAgIH4oMSA8PCBtYXNrX2JpdCkpOworI2lmZGVmIENPTkZJR19TTVAKKwliZmluX3dyaXRlX1NJQ0JfSU1BU0sobWFza19iYW5rLCBiZmluX3JlYWRfU0lDQl9JTUFTSyhtYXNrX2JhbmspICYKKwkJCSAgICAgfigxIDw8IG1hc2tfYml0KSk7CiAjZW5kaWYKLQlTU1lOQygpOworI2VuZGlmCiB9CiAKIHN0YXRpYyB2b2lkIGJmaW5faW50ZXJuYWxfdW5tYXNrX2lycSh1bnNpZ25lZCBpbnQgaXJxKQpAQCAtMTc4LDE0ICsxODgsMTcgQEAKIAltYXNrX2JpdCA9IFNJQ19TWVNJUlEoaXJxKSAlIDMyOwogCWJmaW5fd3JpdGVfU0lDX0lNQVNLKG1hc2tfYmFuaywgYmZpbl9yZWFkX1NJQ19JTUFTSyhtYXNrX2JhbmspIHwKIAkJCSAgICAgKDEgPDwgbWFza19iaXQpKTsKKyNpZmRlZiBDT05GSUdfU01QCisJYmZpbl93cml0ZV9TSUNCX0lNQVNLKG1hc2tfYmFuaywgYmZpbl9yZWFkX1NJQ0JfSU1BU0sobWFza19iYW5rKSB8CisJCQkgICAgICgxIDw8IG1hc2tfYml0KSk7CiAjZW5kaWYKLQlTU1lOQygpOworI2VuZGlmCiB9CiAKICNpZmRlZiBDT05GSUdfUE0KIGludCBiZmluX2ludGVybmFsX3NldF93YWtlKHVuc2lnbmVkIGludCBpcnEsIHVuc2lnbmVkIGludCBzdGF0ZSkKIHsKLQl1bnNpZ25lZCBiYW5rLCBiaXQsIHdha2V1cCA9IDA7CisJdTMyIGJhbmssIGJpdCwgd2FrZXVwID0gMDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWJhbmsgPSBTSUNfU1lTSVJRKGlycSkgLyAzMjsKIAliaXQgPSBTSUNfU1lTSVJRKGlycSkgJSAzMjsKQEAgLTIyNSw3ICsyMzgsNyBAQAogCWJyZWFrOwogCX0KIAotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwlsb2NhbF9pcnFfc2F2ZV9odyhmbGFncyk7CiAKIAlpZiAoc3RhdGUpIHsKIAkJYmZpbl9zaWNfaXdyW2JhbmtdIHw9ICgxIDw8IGJpdCk7CkBAIC0yMzYsNyArMjQ5LDcgQEAKIAkJdnJfd2FrZXVwICAmPSB+d2FrZXVwOwogCX0KIAotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwlsb2NhbF9pcnFfcmVzdG9yZV9odyhmbGFncyk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTI2Miw2ICsyNzUsMTkgQEAKICNlbmRpZgogfTsKIAorc3RhdGljIHZvaWQgYmZpbl9oYW5kbGVfaXJxKHVuc2lnbmVkIGlycSkKK3sKKyNpZmRlZiBDT05GSUdfSVBJUEUKKwlzdHJ1Y3QgcHRfcmVncyByZWdzOyAgICAvKiBDb250ZW50cyBub3QgdXNlZC4gKi8KKwlpcGlwZV90cmFjZV9pcnFfZW50cnkoaXJxKTsKKwlfX2lwaXBlX2hhbmRsZV9pcnEoaXJxLCAmcmVncyk7CisJaXBpcGVfdHJhY2VfaXJxX2V4aXQoaXJxKTsKKyNlbHNlIC8qICFDT05GSUdfSVBJUEUgKi8KKwlzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MgPSBpcnFfZGVzYyArIGlycTsKKwlkZXNjLT5oYW5kbGVfaXJxKGlycSwgZGVzYyk7CisjZW5kaWYgIC8qICFDT05GSUdfSVBJUEUgKi8KK30KKwogI2lmZGVmIEJGNTM3X0dFTkVSSUNfRVJST1JfSU5UX0RFTVVYCiBzdGF0aWMgaW50IGVycm9yX2ludF9tYXNrOwogCkBAIC0yOTIsOCArMzE4LDYgQEAKIHsKIAlpbnQgaXJxID0gMDsKIAotCVNTWU5DKCk7Ci0KICNpZiAoZGVmaW5lZChDT05GSUdfQkY1MzcpIHx8IGRlZmluZWQoQ09ORklHX0JGNTM2KSkKIAlpZiAoYmZpbl9yZWFkX0VNQUNfU1lTVEFUKCkgJiBFTUFDX0VSUl9NQVNLKQogCQlpcnEgPSBJUlFfTUFDX0VSUk9SOwpAQCAtMzE3LDEwICszNDEsOSBAQAogCQlpcnEgPSBJUlFfVUFSVDFfRVJST1I7CiAKIAlpZiAoaXJxKSB7Ci0JCWlmIChlcnJvcl9pbnRfbWFzayAmICgxTCA8PCAoaXJxIC0gSVJRX1BQSV9FUlJPUikpKSB7Ci0JCQlzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MgPSBpcnFfZGVzYyArIGlycTsKLQkJCWRlc2MtPmhhbmRsZV9pcnEoaXJxLCBkZXNjKTsKLQkJfSBlbHNlIHsKKwkJaWYgKGVycm9yX2ludF9tYXNrICYgKDFMIDw8IChpcnEgLSBJUlFfUFBJX0VSUk9SKSkpCisJCQliZmluX2hhbmRsZV9pcnEoaXJxKTsKKwkJZWxzZSB7CiAKIAkJCXN3aXRjaCAoaXJxKSB7CiAJCQljYXNlIElSUV9QUElfRVJST1I6CkBAIC0zNjYsNjIgKzM4OSw1NyBAQAogCiBzdGF0aWMgaW5saW5lIHZvaWQgYmZpbl9zZXRfaXJxX2hhbmRsZXIodW5zaWduZWQgaXJxLCBpcnFfZmxvd19oYW5kbGVyX3QgaGFuZGxlKQogeworI2lmZGVmIENPTkZJR19JUElQRQorCV9zZXRfaXJxX2hhbmRsZXIoaXJxLCBoYW5kbGVfZWRnZV9pcnEpOworI2Vsc2UKIAlzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MgPSBpcnFfZGVzYyArIGlycTsKIAkvKiBNYXkgbm90IGNhbGwgZ2VuZXJpYyBzZXRfaXJxX2hhbmRsZXIoKSBkdWUgdG8gc3BpbmxvY2sKIAkgICByZWN1cnNpb24uICovCiAJZGVzYy0+aGFuZGxlX2lycSA9IGhhbmRsZTsKKyNlbmRpZgogfQogCitzdGF0aWMgREVDTEFSRV9CSVRNQVAoZ3Bpb19lbmFibGVkLCBNQVhfQkxBQ0tGSU5fR1BJT1MpOworZXh0ZXJuIHZvaWQgYmZpbl9ncGlvX2lycV9wcmVwYXJlKHVuc2lnbmVkIGdwaW8pOworCiAjaWYgIWRlZmluZWQoQ09ORklHX0JGNTR4KQogCi1zdGF0aWMgdW5zaWduZWQgc2hvcnQgZ3Bpb19lbmFibGVkW2dwaW9fYmFuayhNQVhfQkxBQ0tGSU5fR1BJT1MpXTsKLXN0YXRpYyB1bnNpZ25lZCBzaG9ydCBncGlvX2VkZ2VfdHJpZ2dlcmVkW2dwaW9fYmFuayhNQVhfQkxBQ0tGSU5fR1BJT1MpXTsKLQotZXh0ZXJuIHZvaWQgYmZpbl9ncGlvX2lycV9wcmVwYXJlKHVuc2lnbmVkIGdwaW8pOwotCiBzdGF0aWMgdm9pZCBiZmluX2dwaW9fYWNrX2lycSh1bnNpZ25lZCBpbnQgaXJxKQogewotCXUxNiBncGlvbnIgPSBpcnEgLSBJUlFfUEYwOwotCi0JaWYgKGdwaW9fZWRnZV90cmlnZ2VyZWRbZ3Bpb19iYW5rKGdwaW9ucildICYgZ3Bpb19iaXQoZ3Bpb25yKSkgewotCQlzZXRfZ3Bpb19kYXRhKGdwaW9uciwgMCk7Ci0JCVNTWU5DKCk7Ci0JfQorCS8qIEFGQUlLIGFja19pcnEgaW4gY2FzZSBtYXNrX2FjayBpcyBwcm92aWRlZAorCSAqIGdldCdzIG9ubHkgY2FsbGVkIGZvciBlZGdlIHNlbnNlIGlycXMKKwkgKi8KKwlzZXRfZ3Bpb19kYXRhKGlycV90b19ncGlvKGlycSksIDApOwogfQogCiBzdGF0aWMgdm9pZCBiZmluX2dwaW9fbWFza19hY2tfaXJxKHVuc2lnbmVkIGludCBpcnEpCiB7Ci0JdTE2IGdwaW9uciA9IGlycSAtIElSUV9QRjA7CisJc3RydWN0IGlycV9kZXNjICpkZXNjID0gaXJxX2Rlc2MgKyBpcnE7CisJdTMyIGdwaW9uciA9IGlycV90b19ncGlvKGlycSk7CiAKLQlpZiAoZ3Bpb19lZGdlX3RyaWdnZXJlZFtncGlvX2JhbmsoZ3Bpb25yKV0gJiBncGlvX2JpdChncGlvbnIpKSB7CisJaWYgKGRlc2MtPmhhbmRsZV9pcnEgPT0gaGFuZGxlX2VkZ2VfaXJxKQogCQlzZXRfZ3Bpb19kYXRhKGdwaW9uciwgMCk7Ci0JCVNTWU5DKCk7Ci0JfQogCiAJc2V0X2dwaW9fbWFza2EoZ3Bpb25yLCAwKTsKLQlTU1lOQygpOwogfQogCiBzdGF0aWMgdm9pZCBiZmluX2dwaW9fbWFza19pcnEodW5zaWduZWQgaW50IGlycSkKIHsKLQlzZXRfZ3Bpb19tYXNrYShpcnEgLSBJUlFfUEYwLCAwKTsKLQlTU1lOQygpOworCXNldF9ncGlvX21hc2thKGlycV90b19ncGlvKGlycSksIDApOwogfQogCiBzdGF0aWMgdm9pZCBiZmluX2dwaW9fdW5tYXNrX2lycSh1bnNpZ25lZCBpbnQgaXJxKQogewotCXNldF9ncGlvX21hc2thKGlycSAtIElSUV9QRjAsIDEpOwotCVNTWU5DKCk7CisJc2V0X2dwaW9fbWFza2EoaXJxX3RvX2dwaW8oaXJxKSwgMSk7CiB9CiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgYmZpbl9ncGlvX2lycV9zdGFydHVwKHVuc2lnbmVkIGludCBpcnEpCiB7Ci0JdTE2IGdwaW9uciA9IGlycSAtIElSUV9QRjA7CisJdTMyIGdwaW9uciA9IGlycV90b19ncGlvKGlycSk7CiAKLQlpZiAoIShncGlvX2VuYWJsZWRbZ3Bpb19iYW5rKGdwaW9ucildICYgZ3Bpb19iaXQoZ3Bpb25yKSkpCisJaWYgKF9fdGVzdF9hbmRfc2V0X2JpdChncGlvbnIsIGdwaW9fZW5hYmxlZCkpCiAJCWJmaW5fZ3Bpb19pcnFfcHJlcGFyZShncGlvbnIpOwogCi0JZ3Bpb19lbmFibGVkW2dwaW9fYmFuayhncGlvbnIpXSB8PSBncGlvX2JpdChncGlvbnIpOwogCWJmaW5fZ3Bpb191bm1hc2tfaXJxKGlycSk7CiAKIAlyZXR1cm4gMDsKQEAgLTQyOSwyOSArNDQ3LDM5IEBACiAKIHN0YXRpYyB2b2lkIGJmaW5fZ3Bpb19pcnFfc2h1dGRvd24odW5zaWduZWQgaW50IGlycSkKIHsKKwl1MzIgZ3Bpb25yID0gaXJxX3RvX2dwaW8oaXJxKTsKKwogCWJmaW5fZ3Bpb19tYXNrX2lycShpcnEpOwotCWdwaW9fZW5hYmxlZFtncGlvX2JhbmsoaXJxIC0gSVJRX1BGMCldICY9IH5ncGlvX2JpdChpcnEgLSBJUlFfUEYwKTsKKwlfX2NsZWFyX2JpdChncGlvbnIsIGdwaW9fZW5hYmxlZCk7CisJYmZpbl9ncGlvX2lycV9mcmVlKGdwaW9ucik7CiB9CiAKIHN0YXRpYyBpbnQgYmZpbl9ncGlvX2lycV90eXBlKHVuc2lnbmVkIGludCBpcnEsIHVuc2lnbmVkIGludCB0eXBlKQogewotCXUxNiBncGlvbnIgPSBpcnEgLSBJUlFfUEYwOworCWludCByZXQ7CisJY2hhciBidWZbMTZdOworCXUzMiBncGlvbnIgPSBpcnFfdG9fZ3BpbyhpcnEpOwogCiAJaWYgKHR5cGUgPT0gSVJRX1RZUEVfUFJPQkUpIHsKIAkJLyogb25seSBwcm9iZSB1bmVuYWJsZWQgR1BJTyBpbnRlcnJ1cHQgbGluZXMgKi8KLQkJaWYgKGdwaW9fZW5hYmxlZFtncGlvX2JhbmsoZ3Bpb25yKV0gJiBncGlvX2JpdChncGlvbnIpKQorCQlpZiAoX190ZXN0X2JpdChncGlvbnIsIGdwaW9fZW5hYmxlZCkpCiAJCQlyZXR1cm4gMDsKIAkJdHlwZSA9IElSUV9UWVBFX0VER0VfUklTSU5HIHwgSVJRX1RZUEVfRURHRV9GQUxMSU5HOwogCX0KIAogCWlmICh0eXBlICYgKElSUV9UWVBFX0VER0VfUklTSU5HIHwgSVJRX1RZUEVfRURHRV9GQUxMSU5HIHwKIAkJICAgIElSUV9UWVBFX0xFVkVMX0hJR0ggfCBJUlFfVFlQRV9MRVZFTF9MT1cpKSB7Ci0JCWlmICghKGdwaW9fZW5hYmxlZFtncGlvX2JhbmsoZ3Bpb25yKV0gJiBncGlvX2JpdChncGlvbnIpKSkKKworCQlzbnByaW50ZihidWYsIDE2LCAiZ3Bpby1pcnElZCIsIGlycSk7CisJCXJldCA9IGJmaW5fZ3Bpb19pcnFfcmVxdWVzdChncGlvbnIsIGJ1Zik7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCisJCWlmIChfX3Rlc3RfYW5kX3NldF9iaXQoZ3Bpb25yLCBncGlvX2VuYWJsZWQpKQogCQkJYmZpbl9ncGlvX2lycV9wcmVwYXJlKGdwaW9ucik7CiAKLQkJZ3Bpb19lbmFibGVkW2dwaW9fYmFuayhncGlvbnIpXSB8PSBncGlvX2JpdChncGlvbnIpOwogCX0gZWxzZSB7Ci0JCWdwaW9fZW5hYmxlZFtncGlvX2JhbmsoZ3Bpb25yKV0gJj0gfmdwaW9fYml0KGdwaW9ucik7CisJCV9fY2xlYXJfYml0KGdwaW9uciwgZ3Bpb19lbmFibGVkKTsKIAkJcmV0dXJuIDA7CiAJfQogCkBAIC00NzIsMTcgKzUwMCwxMyBAQAogCWlmICh0eXBlICYgKElSUV9UWVBFX0VER0VfUklTSU5HIHwgSVJRX1RZUEVfRURHRV9GQUxMSU5HKSkgewogCQlzZXRfZ3Bpb19lZGdlKGdwaW9uciwgMSk7CiAJCXNldF9ncGlvX2luZW4oZ3Bpb25yLCAxKTsKLQkJZ3Bpb19lZGdlX3RyaWdnZXJlZFtncGlvX2JhbmsoZ3Bpb25yKV0gfD0gZ3Bpb19iaXQoZ3Bpb25yKTsKIAkJc2V0X2dwaW9fZGF0YShncGlvbnIsIDApOwogCiAJfSBlbHNlIHsKIAkJc2V0X2dwaW9fZWRnZShncGlvbnIsIDApOwotCQlncGlvX2VkZ2VfdHJpZ2dlcmVkW2dwaW9fYmFuayhncGlvbnIpXSAmPSB+Z3Bpb19iaXQoZ3Bpb25yKTsKIAkJc2V0X2dwaW9faW5lbihncGlvbnIsIDEpOwogCX0KIAotCVNTWU5DKCk7Ci0KIAlpZiAodHlwZSAmIChJUlFfVFlQRV9FREdFX1JJU0lORyB8IElSUV9UWVBFX0VER0VfRkFMTElORykpCiAJCWJmaW5fc2V0X2lycV9oYW5kbGVyKGlycSwgaGFuZGxlX2VkZ2VfaXJxKTsKIAllbHNlCkBAIC01MDUsMjIgKzUyOSw2IEBACiB9CiAjZW5kaWYKIAotc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBiZmluX2dwaW9faXJxY2hpcCA9IHsKLQkubmFtZSA9ICJHUElPIiwKLQkuYWNrID0gYmZpbl9ncGlvX2Fja19pcnEsCi0JLm1hc2sgPSBiZmluX2dwaW9fbWFza19pcnEsCi0JLm1hc2tfYWNrID0gYmZpbl9ncGlvX21hc2tfYWNrX2lycSwKLQkudW5tYXNrID0gYmZpbl9ncGlvX3VubWFza19pcnEsCi0JLmRpc2FibGUgPSBiZmluX2dwaW9fbWFza19pcnEsCi0JLmVuYWJsZSA9IGJmaW5fZ3Bpb191bm1hc2tfaXJxLAotCS5zZXRfdHlwZSA9IGJmaW5fZ3Bpb19pcnFfdHlwZSwKLQkuc3RhcnR1cCA9IGJmaW5fZ3Bpb19pcnFfc3RhcnR1cCwKLQkuc2h1dGRvd24gPSBiZmluX2dwaW9faXJxX3NodXRkb3duLAotI2lmZGVmIENPTkZJR19QTQotCS5zZXRfd2FrZSA9IGJmaW5fZ3Bpb19zZXRfd2FrZSwKLSNlbmRpZgotfTsKLQogc3RhdGljIHZvaWQgYmZpbl9kZW11eF9ncGlvX2lycSh1bnNpZ25lZCBpbnQgaW50YV9pcnEsCiAJCQkJc3RydWN0IGlycV9kZXNjICpkZXNjKQogewpAQCAtNTM3LDcgKzU0NSwxMSBAQAogCQlpcnEgPSBJUlFfUEgwOwogCQlicmVhazsKICMgZW5kaWYKLSNlbGlmIGRlZmluZWQoQ09ORklHX0JGNTJ4KQorI2VsaWYgZGVmaW5lZChDT05GSUdfQkY1MzgpIHx8IGRlZmluZWQoQ09ORklHX0JGNTM5KQorCWNhc2UgSVJRX1BPUlRGX0lOVEE6CisJCWlycSA9IElSUV9QRjA7CisJCWJyZWFrOworI2VsaWYgZGVmaW5lZChDT05GSUdfQkY1MngpIHx8IGRlZmluZWQoQ09ORklHX0JGNTF4KQogCWNhc2UgSVJRX1BPUlRGX0lOVEE6CiAJCWlycSA9IElSUV9QRjA7CiAJCWJyZWFrOwpAQCAtNTY3LDMwICs1NzksMjIgQEAKIAkJZm9yIChpID0gMDsgaSA8IE1BWF9CTEFDS0ZJTl9HUElPUzsgaSArPSBHUElPX0JBTktTSVpFKSB7CiAJCQlpcnEgKz0gaTsKIAotCQkJbWFzayA9IGdldF9ncGlvcF9kYXRhKGkpICYKLQkJCQkoZ3Bpb19lbmFibGVkW2dwaW9fYmFuayhpKV0gJgotCQkJCWdldF9ncGlvcF9tYXNrYShpKSk7CisJCQltYXNrID0gZ2V0X2dwaW9wX2RhdGEoaSkgJiBnZXRfZ3Bpb3BfbWFza2EoaSk7CiAKIAkJCXdoaWxlIChtYXNrKSB7Ci0JCQkJaWYgKG1hc2sgJiAxKSB7Ci0JCQkJCWRlc2MgPSBpcnFfZGVzYyArIGlycTsKLQkJCQkJZGVzYy0+aGFuZGxlX2lycShpcnEsIGRlc2MpOwotCQkJCX0KKwkJCQlpZiAobWFzayAmIDEpCisJCQkJCWJmaW5faGFuZGxlX2lycShpcnEpOwogCQkJCWlycSsrOwogCQkJCW1hc2sgPj49IDE7CiAJCQl9CiAJCX0KIAl9IGVsc2UgewogCQkJZ3BpbyA9IGlycV90b19ncGlvKGlycSk7Ci0JCQltYXNrID0gZ2V0X2dwaW9wX2RhdGEoZ3BpbykgJgotCQkJCShncGlvX2VuYWJsZWRbZ3Bpb19iYW5rKGdwaW8pXSAmCi0JCQkJZ2V0X2dwaW9wX21hc2thKGdwaW8pKTsKKwkJCW1hc2sgPSBnZXRfZ3Bpb3BfZGF0YShncGlvKSAmIGdldF9ncGlvcF9tYXNrYShncGlvKTsKIAogCQkJZG8gewotCQkJCWlmIChtYXNrICYgMSkgewotCQkJCQlkZXNjID0gaXJxX2Rlc2MgKyBpcnE7Ci0JCQkJCWRlc2MtPmhhbmRsZV9pcnEoaXJxLCBkZXNjKTsKLQkJCQl9CisJCQkJaWYgKG1hc2sgJiAxKQorCQkJCQliZmluX2hhbmRsZV9pcnEoaXJxKTsKIAkJCQlpcnErKzsKIAkJCQltYXNrID4+PSAxOwogCQkJfSB3aGlsZSAobWFzayk7CkBAIC02MTIsMTAgKzYxNiw2IEBACiBzdGF0aWMgdW5zaWduZWQgY2hhciBpcnEycGludF9sdXRbTlJfUElOVFNdOwogc3RhdGljIHVuc2lnbmVkIGNoYXIgcGludDJpcnFfbHV0W05SX1BJTlRfU1lTX0lSUVMgKiBOUl9QSU5UX0JJVFNdOwogCi1zdGF0aWMgdW5zaWduZWQgaW50IGdwaW9fYm90aF9lZGdlX3RyaWdnZXJlZFtOUl9QSU5UX1NZU19JUlFTXTsKLXN0YXRpYyB1bnNpZ25lZCBzaG9ydCBncGlvX2VuYWJsZWRbZ3Bpb19iYW5rKE1BWF9CTEFDS0ZJTl9HUElPUyldOwotCi0KIHN0cnVjdCBwaW5faW50X3QgewogCXVuc2lnbmVkIGludCBtYXNrX3NldDsKIAl1bnNpZ25lZCBpbnQgbWFza19jbGVhcjsKQEAgLTYzNiwxMiArNjM2LDkgQEAKIAkoc3RydWN0IHBpbl9pbnRfdCAqKVBJTlQzX01BU0tfU0VULAogfTsKIAotZXh0ZXJuIHZvaWQgYmZpbl9ncGlvX2lycV9wcmVwYXJlKHVuc2lnbmVkIGdwaW8pOwotCi1pbmxpbmUgdW5zaWduZWQgc2hvcnQgZ2V0X2lycV9iYXNlKHU4IGJhbmssIHU4IGJtYXApCitpbmxpbmUgdW5zaWduZWQgaW50IGdldF9pcnFfYmFzZSh1MzIgYmFuaywgdTggYm1hcCkKIHsKLQotCXUxNiBpcnFfYmFzZTsKKwl1bnNpZ25lZCBpbnQgaXJxX2Jhc2U7CiAKIAlpZiAoYmFuayA8IDIpIHsJCS8qUEEtUEIgKi8KIAkJaXJxX2Jhc2UgPSBJUlFfUEEwICsgYm1hcCAqIDE2OwpAQCAtNjUwLDcgKzY0Nyw2IEBACiAJfQogCiAJcmV0dXJuIGlycV9iYXNlOwotCiB9CiAKIAkvKiBXaGVuZXZlciBQSU5UeF9BU1NJR04gaXMgYWx0ZXJlZCBpbml0X3BpbnRfbHV0KCkgbXVzdCBiZSBleGVjdXRlZCEgKi8KQEAgLTY3NywyMCArNjczLDE4IEBACiAKIAkJCXBpbnQyaXJxX2x1dFtiaXRfcG9zXSA9IGlycV9iYXNlIC0gU1lTX0lSUVM7CiAJCQlpcnEycGludF9sdXRbaXJxX2Jhc2UgLSBTWVNfSVJRU10gPSBiaXRfcG9zOwotCiAJCX0KLQogCX0KLQogfQogCiBzdGF0aWMgdm9pZCBiZmluX2dwaW9fYWNrX2lycSh1bnNpZ25lZCBpbnQgaXJxKQogewotCXU4IHBpbnRfdmFsID0gaXJxMnBpbnRfbHV0W2lycSAtIFNZU19JUlFTXTsKKwlzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MgPSBpcnFfZGVzYyArIGlycTsKKwl1MzIgcGludF92YWwgPSBpcnEycGludF9sdXRbaXJxIC0gU1lTX0lSUVNdOwogCXUzMiBwaW50Yml0ID0gUElOVF9CSVQocGludF92YWwpOwotCXU4IGJhbmsgPSBQSU5UXzJfQkFOSyhwaW50X3ZhbCk7CisJdTMyIGJhbmsgPSBQSU5UXzJfQkFOSyhwaW50X3ZhbCk7CiAKLQlpZiAodW5saWtlbHkoZ3Bpb19ib3RoX2VkZ2VfdHJpZ2dlcmVkW2JhbmtdICYgcGludGJpdCkpIHsKKwlpZiAoKGRlc2MtPnN0YXR1cyAmIElSUV9UWVBFX1NFTlNFX01BU0spID09IElSUV9UWVBFX0VER0VfQk9USCkgewogCQlpZiAocGludFtiYW5rXS0+aW52ZXJ0X3NldCAmIHBpbnRiaXQpCiAJCQlwaW50W2JhbmtdLT5pbnZlcnRfY2xlYXIgPSBwaW50Yml0OwogCQllbHNlCkBAIC02OTgsMTYgKzY5MiwxNiBAQAogCX0KIAlwaW50W2JhbmtdLT5yZXF1ZXN0ID0gcGludGJpdDsKIAotCVNTWU5DKCk7CiB9CiAKIHN0YXRpYyB2b2lkIGJmaW5fZ3Bpb19tYXNrX2Fja19pcnEodW5zaWduZWQgaW50IGlycSkKIHsKLQl1OCBwaW50X3ZhbCA9IGlycTJwaW50X2x1dFtpcnEgLSBTWVNfSVJRU107CisJc3RydWN0IGlycV9kZXNjICpkZXNjID0gaXJxX2Rlc2MgKyBpcnE7CisJdTMyIHBpbnRfdmFsID0gaXJxMnBpbnRfbHV0W2lycSAtIFNZU19JUlFTXTsKIAl1MzIgcGludGJpdCA9IFBJTlRfQklUKHBpbnRfdmFsKTsKLQl1OCBiYW5rID0gUElOVF8yX0JBTksocGludF92YWwpOworCXUzMiBiYW5rID0gUElOVF8yX0JBTksocGludF92YWwpOwogCi0JaWYgKHVubGlrZWx5KGdwaW9fYm90aF9lZGdlX3RyaWdnZXJlZFtiYW5rXSAmIHBpbnRiaXQpKSB7CisJaWYgKChkZXNjLT5zdGF0dXMgJiBJUlFfVFlQRV9TRU5TRV9NQVNLKSA9PSBJUlFfVFlQRV9FREdFX0JPVEgpIHsKIAkJaWYgKHBpbnRbYmFua10tPmludmVydF9zZXQgJiBwaW50Yml0KQogCQkJcGludFtiYW5rXS0+aW52ZXJ0X2NsZWFyID0gcGludGJpdDsKIAkJZWxzZQpAQCAtNzE2LDMyICs3MTAsMjkgQEAKIAogCXBpbnRbYmFua10tPnJlcXVlc3QgPSBwaW50Yml0OwogCXBpbnRbYmFua10tPm1hc2tfY2xlYXIgPSBwaW50Yml0OwotCVNTWU5DKCk7CiB9CiAKIHN0YXRpYyB2b2lkIGJmaW5fZ3Bpb19tYXNrX2lycSh1bnNpZ25lZCBpbnQgaXJxKQogewotCXU4IHBpbnRfdmFsID0gaXJxMnBpbnRfbHV0W2lycSAtIFNZU19JUlFTXTsKKwl1MzIgcGludF92YWwgPSBpcnEycGludF9sdXRbaXJxIC0gU1lTX0lSUVNdOwogCiAJcGludFtQSU5UXzJfQkFOSyhwaW50X3ZhbCldLT5tYXNrX2NsZWFyID0gUElOVF9CSVQocGludF92YWwpOwotCVNTWU5DKCk7CiB9CiAKIHN0YXRpYyB2b2lkIGJmaW5fZ3Bpb191bm1hc2tfaXJxKHVuc2lnbmVkIGludCBpcnEpCiB7Ci0JdTggcGludF92YWwgPSBpcnEycGludF9sdXRbaXJxIC0gU1lTX0lSUVNdOworCXUzMiBwaW50X3ZhbCA9IGlycTJwaW50X2x1dFtpcnEgLSBTWVNfSVJRU107CiAJdTMyIHBpbnRiaXQgPSBQSU5UX0JJVChwaW50X3ZhbCk7Ci0JdTggYmFuayA9IFBJTlRfMl9CQU5LKHBpbnRfdmFsKTsKKwl1MzIgYmFuayA9IFBJTlRfMl9CQU5LKHBpbnRfdmFsKTsKIAogCXBpbnRbYmFua10tPnJlcXVlc3QgPSBwaW50Yml0OwogCXBpbnRbYmFua10tPm1hc2tfc2V0ID0gcGludGJpdDsKLQlTU1lOQygpOwogfQogCiBzdGF0aWMgdW5zaWduZWQgaW50IGJmaW5fZ3Bpb19pcnFfc3RhcnR1cCh1bnNpZ25lZCBpbnQgaXJxKQogewotCXUxNiBncGlvbnIgPSBpcnFfdG9fZ3BpbyhpcnEpOwotCXU4IHBpbnRfdmFsID0gaXJxMnBpbnRfbHV0W2lycSAtIFNZU19JUlFTXTsKKwl1MzIgZ3Bpb25yID0gaXJxX3RvX2dwaW8oaXJxKTsKKwl1MzIgcGludF92YWwgPSBpcnEycGludF9sdXRbaXJxIC0gU1lTX0lSUVNdOwogCiAJaWYgKHBpbnRfdmFsID09IElSUV9OT1RfQVZBSUwpIHsKIAkJcHJpbnRrKEtFUk5fRVJSCkBAIC03NTAsMTAgKzc0MSw5IEBACiAJCXJldHVybiAtRU5PREVWOwogCX0KIAotCWlmICghKGdwaW9fZW5hYmxlZFtncGlvX2JhbmsoZ3Bpb25yKV0gJiBncGlvX2JpdChncGlvbnIpKSkKKwlpZiAoX190ZXN0X2FuZF9zZXRfYml0KGdwaW9uciwgZ3Bpb19lbmFibGVkKSkKIAkJYmZpbl9ncGlvX2lycV9wcmVwYXJlKGdwaW9ucik7CiAKLQlncGlvX2VuYWJsZWRbZ3Bpb19iYW5rKGdwaW9ucildIHw9IGdwaW9fYml0KGdwaW9ucik7CiAJYmZpbl9ncGlvX3VubWFza19pcnEoaXJxKTsKIAogCXJldHVybiAwOwpAQCAtNzYxLDM4ICs3NTEsNDUgQEAKIAogc3RhdGljIHZvaWQgYmZpbl9ncGlvX2lycV9zaHV0ZG93bih1bnNpZ25lZCBpbnQgaXJxKQogewotCXUxNiBncGlvbnIgPSBpcnFfdG9fZ3BpbyhpcnEpOworCXUzMiBncGlvbnIgPSBpcnFfdG9fZ3BpbyhpcnEpOwogCiAJYmZpbl9ncGlvX21hc2tfaXJxKGlycSk7Ci0JZ3Bpb19lbmFibGVkW2dwaW9fYmFuayhncGlvbnIpXSAmPSB+Z3Bpb19iaXQoZ3Bpb25yKTsKKwlfX2NsZWFyX2JpdChncGlvbnIsIGdwaW9fZW5hYmxlZCk7CisJYmZpbl9ncGlvX2lycV9mcmVlKGdwaW9ucik7CiB9CiAKIHN0YXRpYyBpbnQgYmZpbl9ncGlvX2lycV90eXBlKHVuc2lnbmVkIGludCBpcnEsIHVuc2lnbmVkIGludCB0eXBlKQogewotCi0JdTE2IGdwaW9uciA9IGlycV90b19ncGlvKGlycSk7Ci0JdTggcGludF92YWwgPSBpcnEycGludF9sdXRbaXJxIC0gU1lTX0lSUVNdOworCWludCByZXQ7CisJY2hhciBidWZbMTZdOworCXUzMiBncGlvbnIgPSBpcnFfdG9fZ3BpbyhpcnEpOworCXUzMiBwaW50X3ZhbCA9IGlycTJwaW50X2x1dFtpcnEgLSBTWVNfSVJRU107CiAJdTMyIHBpbnRiaXQgPSBQSU5UX0JJVChwaW50X3ZhbCk7Ci0JdTggYmFuayA9IFBJTlRfMl9CQU5LKHBpbnRfdmFsKTsKKwl1MzIgYmFuayA9IFBJTlRfMl9CQU5LKHBpbnRfdmFsKTsKIAogCWlmIChwaW50X3ZhbCA9PSBJUlFfTk9UX0FWQUlMKQogCQlyZXR1cm4gLUVOT0RFVjsKIAogCWlmICh0eXBlID09IElSUV9UWVBFX1BST0JFKSB7CiAJCS8qIG9ubHkgcHJvYmUgdW5lbmFibGVkIEdQSU8gaW50ZXJydXB0IGxpbmVzICovCi0JCWlmIChncGlvX2VuYWJsZWRbZ3Bpb19iYW5rKGdwaW9ucildICYgZ3Bpb19iaXQoZ3Bpb25yKSkKKwkJaWYgKF9fdGVzdF9iaXQoZ3Bpb25yLCBncGlvX2VuYWJsZWQpKQogCQkJcmV0dXJuIDA7CiAJCXR5cGUgPSBJUlFfVFlQRV9FREdFX1JJU0lORyB8IElSUV9UWVBFX0VER0VfRkFMTElORzsKIAl9CiAKIAlpZiAodHlwZSAmIChJUlFfVFlQRV9FREdFX1JJU0lORyB8IElSUV9UWVBFX0VER0VfRkFMTElORyB8CiAJCSAgICBJUlFfVFlQRV9MRVZFTF9ISUdIIHwgSVJRX1RZUEVfTEVWRUxfTE9XKSkgewotCQlpZiAoIShncGlvX2VuYWJsZWRbZ3Bpb19iYW5rKGdwaW9ucildICYgZ3Bpb19iaXQoZ3Bpb25yKSkpCisKKwkJc25wcmludGYoYnVmLCAxNiwgImdwaW8taXJxJWQiLCBpcnEpOworCQlyZXQgPSBiZmluX2dwaW9faXJxX3JlcXVlc3QoZ3Bpb25yLCBidWYpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKworCQlpZiAoX190ZXN0X2FuZF9zZXRfYml0KGdwaW9uciwgZ3Bpb19lbmFibGVkKSkKIAkJCWJmaW5fZ3Bpb19pcnFfcHJlcGFyZShncGlvbnIpOwogCi0JCWdwaW9fZW5hYmxlZFtncGlvX2JhbmsoZ3Bpb25yKV0gfD0gZ3Bpb19iaXQoZ3Bpb25yKTsKIAl9IGVsc2UgewotCQlncGlvX2VuYWJsZWRbZ3Bpb19iYW5rKGdwaW9ucildICY9IH5ncGlvX2JpdChncGlvbnIpOworCQlfX2NsZWFyX2JpdChncGlvbnIsIGdwaW9fZW5hYmxlZCk7CiAJCXJldHVybiAwOwogCX0KIApAQCAtODAzLDE1ICs4MDAsMTAgQEAKIAogCWlmICgodHlwZSAmIChJUlFfVFlQRV9FREdFX1JJU0lORyB8IElSUV9UWVBFX0VER0VfRkFMTElORykpCiAJICAgID09IChJUlFfVFlQRV9FREdFX1JJU0lORyB8IElSUV9UWVBFX0VER0VfRkFMTElORykpIHsKLQotCQlncGlvX2JvdGhfZWRnZV90cmlnZ2VyZWRbYmFua10gfD0gcGludGJpdDsKLQogCQlpZiAoZ3Bpb19nZXRfdmFsdWUoZ3Bpb25yKSkKIAkJCXBpbnRbYmFua10tPmludmVydF9zZXQgPSBwaW50Yml0OwogCQllbHNlCiAJCQlwaW50W2JhbmtdLT5pbnZlcnRfY2xlYXIgPSBwaW50Yml0OwotCX0gZWxzZSB7Ci0JCWdwaW9fYm90aF9lZGdlX3RyaWdnZXJlZFtiYW5rXSAmPSB+cGludGJpdDsKIAl9CiAKIAlpZiAodHlwZSAmIChJUlFfVFlQRV9FREdFX1JJU0lORyB8IElSUV9UWVBFX0VER0VfRkFMTElORykpIHsKQEAgLTgyMiw4ICs4MTQsNiBAQAogCQliZmluX3NldF9pcnFfaGFuZGxlcihpcnEsIGhhbmRsZV9sZXZlbF9pcnEpOwogCX0KIAotCVNTWU5DKCk7Ci0KIAlyZXR1cm4gMDsKIH0KIApAQCAtODM0LDcgKzgyNCw3IEBACiBpbnQgYmZpbl9ncGlvX3NldF93YWtlKHVuc2lnbmVkIGludCBpcnEsIHVuc2lnbmVkIGludCBzdGF0ZSkKIHsKIAl1MzIgcGludF9pcnE7Ci0JdTggcGludF92YWwgPSBpcnEycGludF9sdXRbaXJxIC0gU1lTX0lSUVNdOworCXUzMiBwaW50X3ZhbCA9IGlycTJwaW50X2x1dFtpcnEgLSBTWVNfSVJRU107CiAJdTMyIGJhbmsgPSBQSU5UXzJfQkFOSyhwaW50X3ZhbCk7CiAJdTMyIHBpbnRiaXQgPSBQSU5UX0JJVChwaW50X3ZhbCk7CiAKQEAgLTg5NSwyNiArODg1LDEwIEBACiB9CiAjZW5kaWYKIAotc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBiZmluX2dwaW9faXJxY2hpcCA9IHsKLQkubmFtZSA9ICJHUElPIiwKLQkuYWNrID0gYmZpbl9ncGlvX2Fja19pcnEsCi0JLm1hc2sgPSBiZmluX2dwaW9fbWFza19pcnEsCi0JLm1hc2tfYWNrID0gYmZpbl9ncGlvX21hc2tfYWNrX2lycSwKLQkudW5tYXNrID0gYmZpbl9ncGlvX3VubWFza19pcnEsCi0JLmRpc2FibGUgPSBiZmluX2dwaW9fbWFza19pcnEsCi0JLmVuYWJsZSA9IGJmaW5fZ3Bpb191bm1hc2tfaXJxLAotCS5zZXRfdHlwZSA9IGJmaW5fZ3Bpb19pcnFfdHlwZSwKLQkuc3RhcnR1cCA9IGJmaW5fZ3Bpb19pcnFfc3RhcnR1cCwKLQkuc2h1dGRvd24gPSBiZmluX2dwaW9faXJxX3NodXRkb3duLAotI2lmZGVmIENPTkZJR19QTQotCS5zZXRfd2FrZSA9IGJmaW5fZ3Bpb19zZXRfd2FrZSwKLSNlbmRpZgotfTsKLQogc3RhdGljIHZvaWQgYmZpbl9kZW11eF9ncGlvX2lycSh1bnNpZ25lZCBpbnQgaW50YV9pcnEsCiAJCQkJc3RydWN0IGlycV9kZXNjICpkZXNjKQogewotCXU4IGJhbmssIHBpbnRfdmFsOworCXUzMiBiYW5rLCBwaW50X3ZhbDsKIAl1MzIgcmVxdWVzdCwgaXJxOwogCiAJc3dpdGNoIChpbnRhX2lycSkgewpAQCAtOTQxLDggKzkxNSw3IEBACiAJd2hpbGUgKHJlcXVlc3QpIHsKIAkJaWYgKHJlcXVlc3QgJiAxKSB7CiAJCQlpcnEgPSBwaW50MmlycV9sdXRbcGludF92YWxdICsgU1lTX0lSUVM7Ci0JCQlkZXNjID0gaXJxX2Rlc2MgKyBpcnE7Ci0JCQlkZXNjLT5oYW5kbGVfaXJxKGlycSwgZGVzYyk7CisJCQliZmluX2hhbmRsZV9pcnEoaXJxKTsKIAkJfQogCQlwaW50X3ZhbCsrOwogCQlyZXF1ZXN0ID4+PSAxOwpAQCAtOTUxLDEwICs5MjQsMjQgQEAKIH0KICNlbmRpZgogCi12b2lkIF9faW5pdCBpbml0X2V4Y2VwdGlvbl92ZWN0b3JzKHZvaWQpCi17Ci0JU1NZTkMoKTsKK3N0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgYmZpbl9ncGlvX2lycWNoaXAgPSB7CisJLm5hbWUgPSAiR1BJTyIsCisJLmFjayA9IGJmaW5fZ3Bpb19hY2tfaXJxLAorCS5tYXNrID0gYmZpbl9ncGlvX21hc2tfaXJxLAorCS5tYXNrX2FjayA9IGJmaW5fZ3Bpb19tYXNrX2Fja19pcnEsCisJLnVubWFzayA9IGJmaW5fZ3Bpb191bm1hc2tfaXJxLAorCS5kaXNhYmxlID0gYmZpbl9ncGlvX21hc2tfaXJxLAorCS5lbmFibGUgPSBiZmluX2dwaW9fdW5tYXNrX2lycSwKKwkuc2V0X3R5cGUgPSBiZmluX2dwaW9faXJxX3R5cGUsCisJLnN0YXJ0dXAgPSBiZmluX2dwaW9faXJxX3N0YXJ0dXAsCisJLnNodXRkb3duID0gYmZpbl9ncGlvX2lycV9zaHV0ZG93biwKKyNpZmRlZiBDT05GSUdfUE0KKwkuc2V0X3dha2UgPSBiZmluX2dwaW9fc2V0X3dha2UsCisjZW5kaWYKK307CiAKK3ZvaWQgX19jcHVpbml0IGluaXRfZXhjZXB0aW9uX3ZlY3RvcnModm9pZCkKK3sKIAkvKiBjYW5ub3QgcHJvZ3JhbSBpbiBzb2Z0d2FyZToKIAkgKiBldnQwIC0gZW11bGF0aW9uIChqdGFnKQogCSAqIGV2dDEgLSByZXNldApAQCAtOTc5LDE3ICs5NjYsMjMgQEAKICAqIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBkdXJpbmcga2VybmVsIHN0YXJ0dXAgdG8gaW5pdGlhbGl6ZQogICogdGhlIEJGaW4gSVJRIGhhbmRsaW5nIHJvdXRpbmVzLgogICovCisKIGludCBfX2luaXQgaW5pdF9hcmNoX2lycSh2b2lkKQogewogCWludCBpcnE7CiAJdW5zaWduZWQgbG9uZyBpbGF0ID0gMDsKIAkvKiAgRGlzYWJsZSBhbGwgdGhlIHBlcmlwaGVyYWwgaW50cnMgIC0gcGFnZSA0LTI5IEhXIFJlZiBtYW51YWwgKi8KLSNpZiBkZWZpbmVkKENPTkZJR19CRjU0eCkgfHwgZGVmaW5lZChDT05GSUdfQkY1MngpIHx8IGRlZmluZWQoQ09ORklHX0JGNTYxKQorI2lmIGRlZmluZWQoQ09ORklHX0JGNTR4KSB8fCBkZWZpbmVkKENPTkZJR19CRjUyeCkgfHwgZGVmaW5lZChDT05GSUdfQkY1NjEpIFwKKwl8fCBkZWZpbmVkKEJGNTM4X0ZBTUlMWSkgfHwgZGVmaW5lZChDT05GSUdfQkY1MXgpCiAJYmZpbl93cml0ZV9TSUNfSU1BU0swKFNJQ19VTk1BU0tfQUxMKTsKIAliZmluX3dyaXRlX1NJQ19JTUFTSzEoU0lDX1VOTUFTS19BTEwpOwogIyBpZmRlZiBDT05GSUdfQkY1NHgKIAliZmluX3dyaXRlX1NJQ19JTUFTSzIoU0lDX1VOTUFTS19BTEwpOwogIyBlbmRpZgorIyBpZmRlZiBDT05GSUdfU01QCisJYmZpbl93cml0ZV9TSUNCX0lNQVNLMChTSUNfVU5NQVNLX0FMTCk7CisJYmZpbl93cml0ZV9TSUNCX0lNQVNLMShTSUNfVU5NQVNLX0FMTCk7CisjIGVuZGlmCiAjZWxzZQogCWJmaW5fd3JpdGVfU0lDX0lNQVNLKFNJQ19VTk1BU0tfQUxMKTsKICNlbmRpZgpAQCAtMTAyOSw3ICsxMDIyLDcgQEAKIAkJY2FzZSBJUlFfUElOVDE6CiAJCWNhc2UgSVJRX1BJTlQyOgogCQljYXNlIElSUV9QSU5UMzoKLSNlbGlmIGRlZmluZWQoQ09ORklHX0JGNTJ4KQorI2VsaWYgZGVmaW5lZChDT05GSUdfQkY1MngpIHx8IGRlZmluZWQoQ09ORklHX0JGNTF4KQogCQljYXNlIElSUV9QT1JURl9JTlRBOgogCQljYXNlIElSUV9QT1JUR19JTlRBOgogCQljYXNlIElSUV9QT1JUSF9JTlRBOgpAQCAtMTAzNywxOCArMTAzMCw0MSBAQAogCQljYXNlIElSUV9QUk9HMF9JTlRBOgogCQljYXNlIElSUV9QUk9HMV9JTlRBOgogCQljYXNlIElSUV9QUk9HMl9JTlRBOgorI2VsaWYgZGVmaW5lZChDT05GSUdfQkY1MzgpIHx8IGRlZmluZWQoQ09ORklHX0JGNTM5KQorCQljYXNlIElSUV9QT1JURl9JTlRBOgogI2VuZGlmCisKIAkJCXNldF9pcnFfY2hhaW5lZF9oYW5kbGVyKGlycSwKIAkJCQkJCWJmaW5fZGVtdXhfZ3Bpb19pcnEpOwogCQkJYnJlYWs7CiAjaWZkZWYgQkY1MzdfR0VORVJJQ19FUlJPUl9JTlRfREVNVVgKIAkJY2FzZSBJUlFfR0VORVJJQ19FUlJPUjoKLQkJCXNldF9pcnFfaGFuZGxlcihpcnEsIGJmaW5fZGVtdXhfZXJyb3JfaXJxKTsKLQorCQkJc2V0X2lycV9jaGFpbmVkX2hhbmRsZXIoaXJxLCBiZmluX2RlbXV4X2Vycm9yX2lycSk7CisJCQlicmVhazsKKyNlbmRpZgorI2lmIGRlZmluZWQoQ09ORklHX1RJQ0tfU09VUkNFX1NZU1RNUjApIHx8IGRlZmluZWQoQ09ORklHX0lQSVBFKQorCQljYXNlIElSUV9USU1FUjA6CisJCQlzZXRfaXJxX2hhbmRsZXIoaXJxLCBoYW5kbGVfcGVyY3B1X2lycSk7CisJCQlicmVhazsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19TTVAKKwkJY2FzZSBJUlFfU1VQUExFXzA6CisJCWNhc2UgSVJRX1NVUFBMRV8xOgorCQkJc2V0X2lycV9oYW5kbGVyKGlycSwgaGFuZGxlX3BlcmNwdV9pcnEpOwogCQkJYnJlYWs7CiAjZW5kaWYKIAkJZGVmYXVsdDoKKyNpZmRlZiBDT05GSUdfSVBJUEUKKwkvKgorCSAqIFdlIHdhbnQgaW50ZXJuYWwgaW50ZXJydXB0IHNvdXJjZXMgdG8gYmUgbWFza2VkLCBiZWNhdXNlCisJICogSVNScyBtYXkgdHJpZ2dlciBpbnRlcnJ1cHRzIHJlY3Vyc2l2ZWx5IChlLmcuIERNQSksIGJ1dAorCSAqIGludGVycnVwdHMgYXJlIF9ub3RfIG1hc2tlZCBhdCBDUFUgbGV2ZWwuIFNvIGxldCdzIGhhbmRsZQorCSAqIHRoZW0gYXMgbGV2ZWwgaW50ZXJydXB0cy4KKwkgKi8KKwkJCXNldF9pcnFfaGFuZGxlcihpcnEsIGhhbmRsZV9sZXZlbF9pcnEpOworI2Vsc2UgLyogIUNPTkZJR19JUElQRSAqLwogCQkJc2V0X2lycV9oYW5kbGVyKGlycSwgaGFuZGxlX3NpbXBsZV9pcnEpOworI2VuZGlmIC8qICFDT05GSUdfSVBJUEUgKi8KIAkJCWJyZWFrOwogCQl9CiAJfQpAQCAtMTA3Myw3ICsxMDg5LDcgQEAKIAlDU1lOQygpOwogCiAJcHJpbnRrKEtFUk5fSU5GTyAiQ29uZmlndXJpbmcgQmxhY2tmaW4gUHJpb3JpdHkgRHJpdmVuIEludGVycnVwdHNcbiIpOwotCS8qIElNQVNLPXh4eCBpcyBlcXVpdmFsZW50IHRvIFNUSSB4eCBvciBpcnFfZmxhZ3M9eHgsCisJLyogSU1BU0s9eHh4IGlzIGVxdWl2YWxlbnQgdG8gU1RJIHh4IG9yIGJmaW5faXJxX2ZsYWdzPXh4LAogCSAqIGxvY2FsX2lycV9lbmFibGUoKQogCSAqLwogCXByb2dyYW1fSUFSKCk7CkBAIC0xMDgxLDE5ICsxMDk3LDIzIEBACiAJc2VhcmNoX0lBUigpOwogCiAJLyogRW5hYmxlIGludGVycnVwdHMgSVZHNy0xNSAqLwotCWlycV9mbGFncyA9IGlycV9mbGFncyB8IElNQVNLX0lWRzE1IHwKKwliZmluX2lycV9mbGFncyB8PSBJTUFTS19JVkcxNSB8CiAJICAgIElNQVNLX0lWRzE0IHwgSU1BU0tfSVZHMTMgfCBJTUFTS19JVkcxMiB8IElNQVNLX0lWRzExIHwKIAkgICAgSU1BU0tfSVZHMTAgfCBJTUFTS19JVkc5IHwgSU1BU0tfSVZHOCB8IElNQVNLX0lWRzcgfCBJTUFTS19JVkdIVzsKIAotI2lmIGRlZmluZWQoQ09ORklHX0JGNTR4KSB8fCBkZWZpbmVkKENPTkZJR19CRjUyeCkgfHwgZGVmaW5lZChDT05GSUdfQkY1NjEpCisjaWYgZGVmaW5lZChDT05GSUdfQkY1NHgpIHx8IGRlZmluZWQoQ09ORklHX0JGNTJ4KSB8fCBkZWZpbmVkKENPTkZJR19CRjU2MSkgXAorCXx8IGRlZmluZWQoQkY1MzhfRkFNSUxZKSB8fCBkZWZpbmVkKENPTkZJR19CRjUxeCkKIAliZmluX3dyaXRlX1NJQ19JV1IwKElXUl9ESVNBQkxFX0FMTCk7Ci0jaWYgZGVmaW5lZChDT05GSUdfQkY1MngpCi0JLyogQkY1Mnggc3lzdGVtIHJlc2V0IGRvZXMgbm90IHByb3Blcmx5IHJlc2V0IFNJQ19JV1IxIHdoaWNoCisjaWYgZGVmaW5lZChDT05GSUdfQkY1MngpIHx8IGRlZmluZWQoQ09ORklHX0JGNTF4KQorCS8qIEJGNTJ4L0JGNTF4IHN5c3RlbSByZXNldCBkb2VzIG5vdCBwcm9wZXJseSByZXNldCBTSUNfSVdSMSB3aGljaAogCSAqIHdpbGwgc2NyZXcgdXAgdGhlIGJvb3Ryb20gYXMgaXQgcmVsaWVzIG9uIE1ETUEwLzEgd2FraW5nIGl0CiAJICogdXAgZnJvbSBJRExFIGluc3RydWN0aW9ucy4gIFNlZSB0aGlzIHJlcG9ydCBmb3IgbW9yZSBpbmZvOgogCSAqIGh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZy9nZi90cmFja2VyLzQzMjMKIAkgKi8KLQliZmluX3dyaXRlX1NJQ19JV1IxKElXUl9FTkFCTEUoMTApIHwgSVdSX0VOQUJMRSgxMSkpOworCWlmIChBTk9NQUxZXzA1MDAwNDM1KQorCQliZmluX3dyaXRlX1NJQ19JV1IxKElXUl9FTkFCTEUoMTApIHwgSVdSX0VOQUJMRSgxMSkpOworCWVsc2UKKwkJYmZpbl93cml0ZV9TSUNfSVdSMShJV1JfRElTQUJMRV9BTEwpOwogI2Vsc2UKIAliZmluX3dyaXRlX1NJQ19JV1IxKElXUl9ESVNBQkxFX0FMTCk7CiAjZW5kaWYKQEAgLTExMDQsNiArMTEyNCwxNCBAQAogCWJmaW5fd3JpdGVfU0lDX0lXUihJV1JfRElTQUJMRV9BTEwpOwogI2VuZGlmCiAKKyNpZmRlZiBDT05GSUdfSVBJUEUKKwlmb3IgKGlycSA9IDA7IGlycSA8IE5SX0lSUVM7IGlycSsrKSB7CisJCXN0cnVjdCBpcnFfZGVzYyAqZGVzYyA9IGlycV9kZXNjICsgaXJxOworCQlkZXNjLT5pY19wcmlvID0gX19pcGlwZV9nZXRfaXJxX3ByaW9yaXR5KGlycSk7CisJCWRlc2MtPnRocl9wcmlvID0gX19pcGlwZV9nZXRfaXJxdGhyZWFkX3ByaW9yaXR5KGlycSk7CisJfQorI2VuZGlmIC8qIENPTkZJR19JUElQRSAqLworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTExMTcsMTEgKzExNDUsMjAgQEAKIAl9IGVsc2UgewogCQlzdHJ1Y3QgaXZneCAqaXZnID0gaXZnN18xM1t2ZWMgLSBJVkc3XS5pZmlyc3Q7CiAJCXN0cnVjdCBpdmd4ICppdmdfc3RvcCA9IGl2ZzdfMTNbdmVjIC0gSVZHN10uaXN0b3A7Ci0jaWYgZGVmaW5lZChDT05GSUdfQkY1NHgpIHx8IGRlZmluZWQoQ09ORklHX0JGNTJ4KSB8fCBkZWZpbmVkKENPTkZJR19CRjU2MSkKKyNpZiBkZWZpbmVkKENPTkZJR19CRjU0eCkgfHwgZGVmaW5lZChDT05GSUdfQkY1MngpIHx8IGRlZmluZWQoQ09ORklHX0JGNTYxKSBcCisJfHwgZGVmaW5lZChCRjUzOF9GQU1JTFkpIHx8IGRlZmluZWQoQ09ORklHX0JGNTF4KQogCQl1bnNpZ25lZCBsb25nIHNpY19zdGF0dXNbM107CiAKLQkJc2ljX3N0YXR1c1swXSA9IGJmaW5fcmVhZF9TSUNfSVNSMCgpICYgYmZpbl9yZWFkX1NJQ19JTUFTSzAoKTsKLQkJc2ljX3N0YXR1c1sxXSA9IGJmaW5fcmVhZF9TSUNfSVNSMSgpICYgYmZpbl9yZWFkX1NJQ19JTUFTSzEoKTsKKwkJaWYgKHNtcF9wcm9jZXNzb3JfaWQoKSkgeworI2lmZGVmIENPTkZJR19TTVAKKwkJCS8qIFRoaXMgd2lsbCBiZSBvcHRpbWl6ZWQgb3V0IGluIFVQIG1vZGUuICovCisJCQlzaWNfc3RhdHVzWzBdID0gYmZpbl9yZWFkX1NJQ0JfSVNSMCgpICYgYmZpbl9yZWFkX1NJQ0JfSU1BU0swKCk7CisJCQlzaWNfc3RhdHVzWzFdID0gYmZpbl9yZWFkX1NJQ0JfSVNSMSgpICYgYmZpbl9yZWFkX1NJQ0JfSU1BU0sxKCk7CisjZW5kaWYKKwkJfSBlbHNlIHsKKwkJCXNpY19zdGF0dXNbMF0gPSBiZmluX3JlYWRfU0lDX0lTUjAoKSAmIGJmaW5fcmVhZF9TSUNfSU1BU0swKCk7CisJCQlzaWNfc3RhdHVzWzFdID0gYmZpbl9yZWFkX1NJQ19JU1IxKCkgJiBiZmluX3JlYWRfU0lDX0lNQVNLMSgpOworCQl9CiAjaWZkZWYgQ09ORklHX0JGNTR4CiAJCXNpY19zdGF0dXNbMl0gPSBiZmluX3JlYWRfU0lDX0lTUjIoKSAmIGJmaW5fcmVhZF9TSUNfSU1BU0syKCk7CiAjZW5kaWYKQEAgLTExNTAsMyArMTE4NywxNjEgQEAKIAl9CiAJYXNtX2RvX0lSUSh2ZWMsIGZwKTsKIH0KKworI2lmZGVmIENPTkZJR19JUElQRQorCitpbnQgX19pcGlwZV9nZXRfaXJxX3ByaW9yaXR5KHVuc2lnbmVkIGlycSkKK3sKKwlpbnQgaWVudCwgcHJpbzsKKworCWlmIChpcnEgPD0gSVJRX0NPUkVUTVIpCisJCXJldHVybiBpcnE7CisKKwlmb3IgKGllbnQgPSAwOyBpZW50IDwgTlJfUEVSSV9JTlRTOyBpZW50KyspIHsKKwkJc3RydWN0IGl2Z3ggKml2ZyA9IGl2Z190YWJsZSArIGllbnQ7CisJCWlmIChpdmctPmlycW5vID09IGlycSkgeworCQkJZm9yIChwcmlvID0gMDsgcHJpbyA8PSBJVkcxMy1JVkc3OyBwcmlvKyspIHsKKwkJCQlpZiAoaXZnN18xM1twcmlvXS5pZmlyc3QgPD0gaXZnICYmCisJCQkJICAgIGl2ZzdfMTNbcHJpb10uaXN0b3AgPiBpdmcpCisJCQkJCXJldHVybiBJVkc3ICsgcHJpbzsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiBJVkcxNTsKK30KKworaW50IF9faXBpcGVfZ2V0X2lycXRocmVhZF9wcmlvcml0eSh1bnNpZ25lZCBpcnEpCit7CisJaW50IGllbnQsIHByaW87CisJaW50IGRlbXV4X2lycTsKKworCS8qIFRoZSByZXR1cm5lZCBwcmlvcml0eSB2YWx1ZSBpcyByZXNjYWxlZCB0byBbMC4uSVZHMTMrMV0KKwkgKiB3aXRoIDAgYmVpbmcgdGhlIGxvd2VzdCBlZmZlY3RpdmUgcHJpb3JpdHkgbGV2ZWwuICovCisKKwlpZiAoaXJxIDw9IElSUV9DT1JFVE1SKQorCQlyZXR1cm4gSVZHMTMgLSBpcnEgKyAxOworCisJLyogR1BJTyBJUlFzIGFyZSBnaXZlbiB0aGUgcHJpb3JpdHkgb2YgdGhlIGRlbXV4CisJICogaW50ZXJydXB0LiAqLworCWlmIChJU19HUElPSVJRKGlycSkpIHsKKyNpZiBkZWZpbmVkKENPTkZJR19CRjU0eCkKKwkJdTMyIGJhbmsgPSBQSU5UXzJfQkFOSyhpcnEycGludF9sdXRbaXJxIC0gU1lTX0lSUVNdKTsKKwkJZGVtdXhfaXJxID0gKGJhbmsgPT0gMCA/IElSUV9QSU5UMCA6CisJCQkJYmFuayA9PSAxID8gSVJRX1BJTlQxIDoKKwkJCQliYW5rID09IDIgPyBJUlFfUElOVDIgOgorCQkJCUlSUV9QSU5UMyk7CisjZWxpZiBkZWZpbmVkKENPTkZJR19CRjU2MSkKKwkJZGVtdXhfaXJxID0gKGlycSA+PSBJUlFfUEYzMiA/IElSUV9QUk9HMl9JTlRBIDoKKwkJCQlpcnEgPj0gSVJRX1BGMTYgPyBJUlFfUFJPRzFfSU5UQSA6CisJCQkJSVJRX1BST0cwX0lOVEEpOworI2VsaWYgZGVmaW5lZChDT05GSUdfQkY1MngpCisJCWRlbXV4X2lycSA9IChpcnEgPj0gSVJRX1BIMCA/IElSUV9QT1JUSF9JTlRBIDoKKwkJCQlpcnEgPj0gSVJRX1BHMCA/IElSUV9QT1JUR19JTlRBIDoKKwkJCQlJUlFfUE9SVEZfSU5UQSk7CisjZWxzZQorCQlkZW11eF9pcnEgPSBpcnE7CisjZW5kaWYKKwkJcmV0dXJuIElWRzEzIC0gUFJJT19HUElPREVNVVgoZGVtdXhfaXJxKSArIDE7CisJfQorCisJLyogVGhlIEdQSU8gZGVtdXggaW50ZXJydXB0IGlzIGdpdmVuIGEgbG93ZXIgcHJpb3JpdHkKKwkgKiB0aGFuIHRoZSBHUElPIElSUXMsIHNvIHRoYXQgaXRzIHRocmVhZGVkIGhhbmRsZXIKKwkgKiB1bm1hc2tzIHRoZSBpbnRlcnJ1cHQgbGluZSBhZnRlciB0aGUgZGVjb2RlZCBJUlFzCisJICogaGF2ZSBiZWVuIHByb2Nlc3NlZC4gKi8KKwlwcmlvID0gUFJJT19HUElPREVNVVgoaXJxKTsKKwkvKiBkZW11eCBpcnE/ICovCisJaWYgKHByaW8gIT0gLTEpCisJCXJldHVybiBJVkcxMyAtIHByaW87CisKKwlmb3IgKGllbnQgPSAwOyBpZW50IDwgTlJfUEVSSV9JTlRTOyBpZW50KyspIHsKKwkJc3RydWN0IGl2Z3ggKml2ZyA9IGl2Z190YWJsZSArIGllbnQ7CisJCWlmIChpdmctPmlycW5vID09IGlycSkgeworCQkJZm9yIChwcmlvID0gMDsgcHJpbyA8PSBJVkcxMy1JVkc3OyBwcmlvKyspIHsKKwkJCQlpZiAoaXZnN18xM1twcmlvXS5pZmlyc3QgPD0gaXZnICYmCisJCQkJICAgIGl2ZzdfMTNbcHJpb10uaXN0b3AgPiBpdmcpCisJCQkJCXJldHVybiBJVkc3IC0gcHJpbzsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiAwOworfQorCisvKiBIdyBpbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZCBvbiBlbnRyeSAoY2hlY2sgU0FWRV9DT05URVhUKS4gKi8KKyNpZmRlZiBDT05GSUdfRE9fSVJRX0wxCitfX2F0dHJpYnV0ZV9fKChsMV90ZXh0KSkKKyNlbmRpZgorYXNtbGlua2FnZSBpbnQgX19pcGlwZV9ncmFiX2lycShpbnQgdmVjLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgaXZneCAqaXZnX3N0b3AgPSBpdmc3XzEzW3ZlYy1JVkc3XS5pc3RvcDsKKwlzdHJ1Y3QgaXZneCAqaXZnID0gaXZnN18xM1t2ZWMtSVZHN10uaWZpcnN0OworCWludCBpcnE7CisKKwlpZiAobGlrZWx5KHZlYyA9PSBFVlRfSVZUTVJfUCkpIHsKKwkJaXJxID0gSVJRX0NPUkVUTVI7CisJCWdvdG8gaGFuZGxlX2lycTsKKwl9CisKKwlTU1lOQygpOworCisjaWYgZGVmaW5lZChDT05GSUdfQkY1NHgpIHx8IGRlZmluZWQoQ09ORklHX0JGNTJ4KSB8fCBkZWZpbmVkKENPTkZJR19CRjU2MSkKKwl7CisJCXVuc2lnbmVkIGxvbmcgc2ljX3N0YXR1c1szXTsKKworCQlzaWNfc3RhdHVzWzBdID0gYmZpbl9yZWFkX1NJQ19JU1IwKCkgJiBiZmluX3JlYWRfU0lDX0lNQVNLMCgpOworCQlzaWNfc3RhdHVzWzFdID0gYmZpbl9yZWFkX1NJQ19JU1IxKCkgJiBiZmluX3JlYWRfU0lDX0lNQVNLMSgpOworI2lmZGVmIENPTkZJR19CRjU0eAorCQlzaWNfc3RhdHVzWzJdID0gYmZpbl9yZWFkX1NJQ19JU1IyKCkgJiBiZmluX3JlYWRfU0lDX0lNQVNLMigpOworI2VuZGlmCisJCWZvciAoOzsgaXZnKyspIHsKKwkJCWlmIChpdmcgPj0gaXZnX3N0b3ApIHsKKwkJCQlhdG9taWNfaW5jKCZudW1fc3B1cmlvdXMpOworCQkJCXJldHVybiAwOworCQkJfQorCQkJaWYgKHNpY19zdGF0dXNbKGl2Zy0+aXJxbm8gLSBJVkc3KSAvIDMyXSAmIGl2Zy0+aXNyZmxhZykKKwkJCQlicmVhazsKKwkJfQorCX0KKyNlbHNlCisJeworCQl1bnNpZ25lZCBsb25nIHNpY19zdGF0dXM7CisKKwkJc2ljX3N0YXR1cyA9IGJmaW5fcmVhZF9TSUNfSU1BU0soKSAmIGJmaW5fcmVhZF9TSUNfSVNSKCk7CisKKwkJZm9yICg7OyBpdmcrKykgeworCQkJaWYgKGl2ZyA+PSBpdmdfc3RvcCkgeworCQkJCWF0b21pY19pbmMoJm51bV9zcHVyaW91cyk7CisJCQkJcmV0dXJuIDA7CisJCQl9IGVsc2UgaWYgKHNpY19zdGF0dXMgJiBpdmctPmlzcmZsYWcpCisJCQkJYnJlYWs7CisJCX0KKwl9CisjZW5kaWYKKworCWlycSA9IGl2Zy0+aXJxbm87CisKKwlpZiAoaXJxID09IElSUV9TWVNUTVIpIHsKKwkJYmZpbl93cml0ZV9USU1FUl9TVEFUVVMoMSk7IC8qIExhdGNoIFRJTUlMMCAqLworCQkvKiBUaGlzIGlzIGJhc2ljYWxseSB3aGF0IHdlIG5lZWQgZnJvbSB0aGUgcmVnaXN0ZXIgZnJhbWUuICovCisJCV9fcmF3X2dldF9jcHVfdmFyKF9faXBpcGVfdGlja19yZWdzKS5pcGVuZCA9IHJlZ3MtPmlwZW5kOworCQlfX3Jhd19nZXRfY3B1X3ZhcihfX2lwaXBlX3RpY2tfcmVncykucGMgPSByZWdzLT5wYzsKKwkJaWYgKCFpcGlwZV9yb290X2RvbWFpbl9wKQorCQkJX19yYXdfZ2V0X2NwdV92YXIoX19pcGlwZV90aWNrX3JlZ3MpLmlwZW5kIHw9IDB4MTA7CisJCWVsc2UKKwkJCV9fcmF3X2dldF9jcHVfdmFyKF9faXBpcGVfdGlja19yZWdzKS5pcGVuZCAmPSB+MHgxMDsKKwl9CisKK2hhbmRsZV9pcnE6CisKKwlpcGlwZV90cmFjZV9pcnFfZW50cnkoaXJxKTsKKwlfX2lwaXBlX2hhbmRsZV9pcnEoaXJxLCByZWdzKTsKKyAgICAgICBpcGlwZV90cmFjZV9pcnFfZXhpdChpcnEpOworCisgICAgICAgaWYgKGlwaXBlX3Jvb3RfZG9tYWluX3ApCisJCXJldHVybiAhdGVzdF9iaXQoSVBJUEVfU1RBTExfRkxBRywgJmlwaXBlX3Jvb3RfY3B1ZG9tX3ZhcihzdGF0dXMpKTsKKworICAgICAgIHJldHVybiAwOworfQorCisjZW5kaWYgLyogQ09ORklHX0lQSVBFICovCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtY29tbW9uL2lycXBhbmljLmMgYi9hcmNoL2JsYWNrZmluL21hY2gtY29tbW9uL2lycXBhbmljLmMKaW5kZXggNjA2ZGVkOS4uMDUwMDRkZiAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWNvbW1vbi9pcnFwYW5pYy5jCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1jb21tb24vaXJxcGFuaWMuYwpAQCAtMzMsOCArMzMsNiBAQAogI2luY2x1ZGUgPGFzbS90cmFwcy5oPgogI2luY2x1ZGUgPGFzbS9ibGFja2Zpbi5oPgogCi0jaW5jbHVkZSAiLi4vb3Byb2ZpbGUvb3BfYmxhY2tmaW4uaCIKLQogI2lmZGVmIENPTkZJR19ERUJVR19JQ0FDSEVfQ0hFQ0sKICNkZWZpbmUgTDFfSUNBQ0hFX1NUQVJUIDB4ZmZhMTAwMDAKICNkZWZpbmUgTDFfSUNBQ0hFX0VORCAgIDB4ZmZhMTNmZmYKQEAgLTEzNCwxMyArMTMyLDMgQEAKICNlbmRpZgogCiB9Ci0KLSNpZmRlZiBDT05GSUdfSEFSRFdBUkVfUE0KLS8qCi0gKiBjYWxsIHRoZSBoYW5kbGVyIG9mIFBlcmZvcm1hbmNlIG92ZXJmbG93Ci0gKi8KLWFzbWxpbmthZ2Ugdm9pZCBwbV9vdmVyZmxvdyhpbnQgaXJxLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKLXsKLQlwbV9vdmVyZmxvd19oYW5kbGVyKGlycSwgcmVncyk7Ci19Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1jb21tb24vbG9jay5TIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWNvbW1vbi9sb2NrLlMKaW5kZXggOWRhZjAxMi4uNmM1ZjVmMCAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWNvbW1vbi9sb2NrLlMKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWNvbW1vbi9sb2NrLlMKQEAgLTE2MCw3ICsxNjAsNyBAQAogICogUjAgLSBXaGljaCB3YXkgdG8gYmUgbG9ja2VkCiAgKi8KIAotRU5UUlkoX2NhY2hlX2xvY2spCitFTlRSWShfYmZpbl9jYWNoZV9sb2NrKQogCiAJWy0tU1BdPSggUjc6MCxQNTowICk7CiAKQEAgLTE4NCw3ICsxODQsNyBAQAogCiAJKCBSNzowLFA1OjAgKSA9IFtTUCsrXTsKIAlSVFM7Ci1FTkRQUk9DKF9jYWNoZV9sb2NrKQorRU5EUFJPQyhfYmZpbl9jYWNoZV9sb2NrKQogCiAvKiBJbnZhbGlkYXRlIHRoZSBFbnRpcmUgSW5zdHJ1Y3Rpb24gY2FjaGUgYnkKICAqIGRpc2FibGluZyBJTUMgYml0CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtY29tbW9uL3BtLmMgYi9hcmNoL2JsYWNrZmluL21hY2gtY29tbW9uL3BtLmMKaW5kZXggZTI4YzZhZi4uZDNkNzBmZCAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWNvbW1vbi9wbS5jCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1jb21tb24vcG0uYwpAQCAtNzEsNyArNzEsNyBAQAogCWdwaW9fcG1fd2FrZXVwX3JlcXVlc3QoQ09ORklHX1BNX1dBS0VVUF9HUElPX05VTUJFUiwgV0FLRVVQX1RZUEUpOwogI2VuZGlmCiAKLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJbG9jYWxfaXJxX3NhdmVfaHcoZmxhZ3MpOwogCWJmaW5fcG1fc3RhbmRieV9zZXR1cCgpOwogCiAjaWZkZWYgQ09ORklHX1BNX0JGSU5fU0xFRVBfREVFUEVSCkBAIC04MiwxNSArODIsMTkgQEAKIAogCWJmaW5fcG1fc3RhbmRieV9yZXN0b3JlKCk7CiAKLSNpZiBkZWZpbmVkKENPTkZJR19CRjU0eCkgfHwgZGVmaW5lZChDT05GSUdfQkY1MngpICB8fCBkZWZpbmVkKENPTkZJR19CRjU2MSkKKyNpZiBkZWZpbmVkKENPTkZJR19CRjU0eCkgfHwgZGVmaW5lZChDT05GSUdfQkY1MngpICB8fCBkZWZpbmVkKENPTkZJR19CRjU2MSkgfHwgXAorCWRlZmluZWQoQ09ORklHX0JGNTM4KSB8fCBkZWZpbmVkKENPTkZJR19CRjUzOSkgfHwgZGVmaW5lZChDT05GSUdfQkY1MXgpCiAJYmZpbl93cml0ZV9TSUNfSVdSMChJV1JfRElTQUJMRV9BTEwpOwotI2lmIGRlZmluZWQoQ09ORklHX0JGNTJ4KQorI2lmIGRlZmluZWQoQ09ORklHX0JGNTJ4KSB8fCBkZWZpbmVkKENPTkZJR19CRjUxeCkKIAkvKiBCRjUyeCBzeXN0ZW0gcmVzZXQgZG9lcyBub3QgcHJvcGVybHkgcmVzZXQgU0lDX0lXUjEgd2hpY2gKIAkgKiB3aWxsIHNjcmV3IHVwIHRoZSBib290cm9tIGFzIGl0IHJlbGllcyBvbiBNRE1BMC8xIHdha2luZyBpdAogCSAqIHVwIGZyb20gSURMRSBpbnN0cnVjdGlvbnMuICBTZWUgdGhpcyByZXBvcnQgZm9yIG1vcmUgaW5mbzoKIAkgKiBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvZ2YvdHJhY2tlci80MzIzCiAJICovCi0JYmZpbl93cml0ZV9TSUNfSVdSMShJV1JfRU5BQkxFKDEwKSB8IElXUl9FTkFCTEUoMTEpKTsKKwlpZiAoQU5PTUFMWV8wNTAwMDQzNSkKKwkJYmZpbl93cml0ZV9TSUNfSVdSMShJV1JfRU5BQkxFKDEwKSB8IElXUl9FTkFCTEUoMTEpKTsKKwllbHNlCisJCWJmaW5fd3JpdGVfU0lDX0lXUjEoSVdSX0RJU0FCTEVfQUxMKTsKICNlbHNlCiAJYmZpbl93cml0ZV9TSUNfSVdSMShJV1JfRElTQUJMRV9BTEwpOwogI2VuZGlmCkBAIC0xMDEsNyArMTA1LDcgQEAKIAliZmluX3dyaXRlX1NJQ19JV1IoSVdSX0RJU0FCTEVfQUxMKTsKICNlbmRpZgogCi0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCWxvY2FsX2lycV9yZXN0b3JlX2h3KGZsYWdzKTsKIH0KIAogaW50IGJmNTN4X3N1c3BlbmRfbDFfbWVtKHVuc2lnbmVkIGNoYXIgKm1lbXB0cikKQEAgLTI0NSwxMiArMjQ5LDEyIEBACiAJd2FrZXVwIHw9IEdQV0U7CiAjZW5kaWYKIAotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwlsb2NhbF9pcnFfc2F2ZV9odyhmbGFncyk7CiAKIAlyZXQgPSBibGFja2Zpbl9kbWFfc3VzcGVuZCgpOwogCiAJaWYgKHJldCkgewotCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJCWxvY2FsX2lycV9yZXN0b3JlX2h3KGZsYWdzKTsKIAkJa2ZyZWUobWVtcHRyKTsKIAkJcmV0dXJuIHJldDsKIAl9CkBAIC0yNzEsNyArMjc1LDcgQEAKIAliZmluX2dwaW9fcG1faGliZXJuYXRlX3Jlc3RvcmUoKTsKIAlibGFja2Zpbl9kbWFfcmVzdW1lKCk7CiAKLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJbG9jYWxfaXJxX3Jlc3RvcmVfaHcoZmxhZ3MpOwogCWtmcmVlKG1lbXB0cik7CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1jb21tb24vc21wLmMgYi9hcmNoL2JsYWNrZmluL21hY2gtY29tbW9uL3NtcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3Yzk5MjgKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtY29tbW9uL3NtcC5jCkBAIC0wLDAgKzEsNDc2IEBACisvKgorICogRmlsZTogICAgICAgICBhcmNoL2JsYWNrZmluL2tlcm5lbC9zbXAuYworICogQXV0aG9yOiAgICAgICBQaGlsaXBwZSBHZXJ1bSA8cnBtQHhlbm9tYWkub3JnPgorICogSVBJIG1hbmFnZW1lbnQgYmFzZWQgb24gYXJjaC9hcm0va2VybmVsL3NtcC5jLgorICoKKyAqICAgICAgICAgICAgICAgQ29weXJpZ2h0IDIwMDcgQW5hbG9nIERldmljZXMgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIHRoZSBmaWxlIENPUFlJTkcsIG9yIHdyaXRlCisgKiB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2NhY2hlLmg+CisjaW5jbHVkZSA8bGludXgvcHJvZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9jcHUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXAuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KKyNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgorI2luY2x1ZGUgPGFzbS9tbXVfY29udGV4dC5oPgorI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CisjaW5jbHVkZSA8YXNtL3BnYWxsb2MuaD4KKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgorI2luY2x1ZGUgPGFzbS9jcHUuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKworc3RydWN0IGNvcmVsb2NrX3Nsb3QgY29yZWxvY2sgX19hdHRyaWJ1dGVfXyAoKF9fc2VjdGlvbl9fKCIubDIuYnNzIikpKTsKKwordm9pZCBfX2NwdWluaXRkYXRhICppbml0X3JldHhfY29yZWIsICppbml0X3NhdmVkX3JldHhfY29yZWIsCisJKmluaXRfc2F2ZWRfc2Vxc3RhdF9jb3JlYiwgKmluaXRfc2F2ZWRfaWNwbGJfZmF1bHRfYWRkcl9jb3JlYiwKKwkqaW5pdF9zYXZlZF9kY3BsYl9mYXVsdF9hZGRyX2NvcmViOworCitjcHVtYXNrX3QgY3B1X3Bvc3NpYmxlX21hcDsKK0VYUE9SVF9TWU1CT0woY3B1X3Bvc3NpYmxlX21hcCk7CisKK2NwdW1hc2tfdCBjcHVfb25saW5lX21hcDsKK0VYUE9SVF9TWU1CT0woY3B1X29ubGluZV9tYXApOworCisjZGVmaW5lIEJGSU5fSVBJX1JFU0NIRURVTEUgICAwCisjZGVmaW5lIEJGSU5fSVBJX0NBTExfRlVOQyAgICAxCisjZGVmaW5lIEJGSU5fSVBJX0NQVV9TVE9QICAgICAyCisKK3N0cnVjdCBibGFja2Zpbl9mbHVzaF9kYXRhIHsKKwl1bnNpZ25lZCBsb25nIHN0YXJ0OworCXVuc2lnbmVkIGxvbmcgZW5kOworfTsKKwordm9pZCAqc2Vjb25kYXJ5X3N0YWNrOworCisKK3N0cnVjdCBzbXBfY2FsbF9zdHJ1Y3QgeworCXZvaWQgKCpmdW5jKSh2b2lkICppbmZvKTsKKwl2b2lkICppbmZvOworCWludCB3YWl0OworCWNwdW1hc2tfdCBwZW5kaW5nOworCWNwdW1hc2tfdCB3YWl0bWFzazsKK307CisKK3N0YXRpYyBzdHJ1Y3QgYmxhY2tmaW5fZmx1c2hfZGF0YSBzbXBfZmx1c2hfZGF0YTsKKworc3RhdGljIERFRklORV9TUElOTE9DSyhzdG9wX2xvY2spOworCitzdHJ1Y3QgaXBpX21lc3NhZ2UgeworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwl1bnNpZ25lZCBsb25nIHR5cGU7CisJc3RydWN0IHNtcF9jYWxsX3N0cnVjdCBjYWxsX3N0cnVjdDsKK307CisKK3N0cnVjdCBpcGlfbWVzc2FnZV9xdWV1ZSB7CisJc3RydWN0IGxpc3RfaGVhZCBoZWFkOworCXNwaW5sb2NrX3QgbG9jazsKKwl1bnNpZ25lZCBsb25nIGNvdW50OworfTsKKworc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCBpcGlfbWVzc2FnZV9xdWV1ZSwgaXBpX21zZ19xdWV1ZSk7CisKK3N0YXRpYyB2b2lkIGlwaV9jcHVfc3RvcCh1bnNpZ25lZCBpbnQgY3B1KQoreworCXNwaW5fbG9jaygmc3RvcF9sb2NrKTsKKwlwcmludGsoS0VSTl9DUklUICJDUFUldTogc3RvcHBpbmdcbiIsIGNwdSk7CisJZHVtcF9zdGFjaygpOworCXNwaW5fdW5sb2NrKCZzdG9wX2xvY2spOworCisJY3B1X2NsZWFyKGNwdSwgY3B1X29ubGluZV9tYXApOworCisJbG9jYWxfaXJxX2Rpc2FibGUoKTsKKworCXdoaWxlICgxKQorCQlTU1lOQygpOworfQorCitzdGF0aWMgdm9pZCBpcGlfZmx1c2hfaWNhY2hlKHZvaWQgKmluZm8pCit7CisJc3RydWN0IGJsYWNrZmluX2ZsdXNoX2RhdGEgKmZkYXRhID0gaW5mbzsKKworCS8qIEludmFsaWRhdGUgdGhlIG1lbW9yeSBob2xkaW5nIHRoZSBib3VuZHMgb2YgdGhlIGZsdXNoZWQgcmVnaW9uLiAqLworCWJsYWNrZmluX2RjYWNoZV9pbnZhbGlkYXRlX3JhbmdlKCh1bnNpZ25lZCBsb25nKWZkYXRhLAorCQkJCQkgKHVuc2lnbmVkIGxvbmcpZmRhdGEgKyBzaXplb2YoKmZkYXRhKSk7CisKKwlibGFja2Zpbl9pY2FjaGVfZmx1c2hfcmFuZ2UoZmRhdGEtPnN0YXJ0LCBmZGF0YS0+ZW5kKTsKK30KKworc3RhdGljIHZvaWQgaXBpX2NhbGxfZnVuY3Rpb24odW5zaWduZWQgaW50IGNwdSwgc3RydWN0IGlwaV9tZXNzYWdlICptc2cpCit7CisJaW50IHdhaXQ7CisJdm9pZCAoKmZ1bmMpKHZvaWQgKmluZm8pOworCXZvaWQgKmluZm87CisJZnVuYyA9IG1zZy0+Y2FsbF9zdHJ1Y3QuZnVuYzsKKwlpbmZvID0gbXNnLT5jYWxsX3N0cnVjdC5pbmZvOworCXdhaXQgPSBtc2ctPmNhbGxfc3RydWN0LndhaXQ7CisJY3B1X2NsZWFyKGNwdSwgbXNnLT5jYWxsX3N0cnVjdC5wZW5kaW5nKTsKKwlmdW5jKGluZm8pOworCWlmICh3YWl0KQorCQljcHVfY2xlYXIoY3B1LCBtc2ctPmNhbGxfc3RydWN0LndhaXRtYXNrKTsKKwllbHNlCisJCWtmcmVlKG1zZyk7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBpcGlfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpkZXZfaW5zdGFuY2UpCit7CisJc3RydWN0IGlwaV9tZXNzYWdlICptc2csICptZzsKKwlzdHJ1Y3QgaXBpX21lc3NhZ2VfcXVldWUgKm1zZ19xdWV1ZTsKKwl1bnNpZ25lZCBpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOworCisJcGxhdGZvcm1fY2xlYXJfaXBpKGNwdSk7CisKKwltc2dfcXVldWUgPSAmX19nZXRfY3B1X3ZhcihpcGlfbXNnX3F1ZXVlKTsKKwltc2dfcXVldWUtPmNvdW50Kys7CisKKwlzcGluX2xvY2soJm1zZ19xdWV1ZS0+bG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKG1zZywgbWcsICZtc2dfcXVldWUtPmhlYWQsIGxpc3QpIHsKKwkJbGlzdF9kZWwoJm1zZy0+bGlzdCk7CisJCXN3aXRjaCAobXNnLT50eXBlKSB7CisJCWNhc2UgQkZJTl9JUElfUkVTQ0hFRFVMRToKKwkJCS8qIFRoYXQncyB0aGUgZWFzaWVzdCBvbmU7IGxlYXZlIGl0IHRvCisJCQkgKiByZXR1cm5fZnJvbV9pbnQuICovCisJCQlrZnJlZShtc2cpOworCQkJYnJlYWs7CisJCWNhc2UgQkZJTl9JUElfQ0FMTF9GVU5DOgorCQkJaXBpX2NhbGxfZnVuY3Rpb24oY3B1LCBtc2cpOworCQkJYnJlYWs7CisJCWNhc2UgQkZJTl9JUElfQ1BVX1NUT1A6CisJCQlpcGlfY3B1X3N0b3AoY3B1KTsKKwkJCWtmcmVlKG1zZyk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXByaW50ayhLRVJOX0NSSVQgIkNQVSV1OiBVbmtub3duIElQSSBtZXNzYWdlIFwKKwkJCTB4JWx4XG4iLCBjcHUsIG1zZy0+dHlwZSk7CisJCQlrZnJlZShtc2cpOworCQkJYnJlYWs7CisJCX0KKwl9CisJc3Bpbl91bmxvY2soJm1zZ19xdWV1ZS0+bG9jayk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgdm9pZCBpcGlfcXVldWVfaW5pdCh2b2lkKQoreworCXVuc2lnbmVkIGludCBjcHU7CisJc3RydWN0IGlwaV9tZXNzYWdlX3F1ZXVlICptc2dfcXVldWU7CisJZm9yX2VhY2hfcG9zc2libGVfY3B1KGNwdSkgeworCQltc2dfcXVldWUgPSAmcGVyX2NwdShpcGlfbXNnX3F1ZXVlLCBjcHUpOworCQlJTklUX0xJU1RfSEVBRCgmbXNnX3F1ZXVlLT5oZWFkKTsKKwkJc3Bpbl9sb2NrX2luaXQoJm1zZ19xdWV1ZS0+bG9jayk7CisJCW1zZ19xdWV1ZS0+Y291bnQgPSAwOworCX0KK30KKworaW50IHNtcF9jYWxsX2Z1bmN0aW9uKHZvaWQgKCpmdW5jKSh2b2lkICppbmZvKSwgdm9pZCAqaW5mbywgaW50IHdhaXQpCit7CisJdW5zaWduZWQgaW50IGNwdTsKKwljcHVtYXNrX3QgY2FsbG1hcDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBpcGlfbWVzc2FnZV9xdWV1ZSAqbXNnX3F1ZXVlOworCXN0cnVjdCBpcGlfbWVzc2FnZSAqbXNnOworCisJY2FsbG1hcCA9IGNwdV9vbmxpbmVfbWFwOworCWNwdV9jbGVhcihzbXBfcHJvY2Vzc29yX2lkKCksIGNhbGxtYXApOworCWlmIChjcHVzX2VtcHR5KGNhbGxtYXApKQorCQlyZXR1cm4gMDsKKworCW1zZyA9IGttYWxsb2Moc2l6ZW9mKCptc2cpLCBHRlBfQVRPTUlDKTsKKwlJTklUX0xJU1RfSEVBRCgmbXNnLT5saXN0KTsKKwltc2ctPmNhbGxfc3RydWN0LmZ1bmMgPSBmdW5jOworCW1zZy0+Y2FsbF9zdHJ1Y3QuaW5mbyA9IGluZm87CisJbXNnLT5jYWxsX3N0cnVjdC53YWl0ID0gd2FpdDsKKwltc2ctPmNhbGxfc3RydWN0LnBlbmRpbmcgPSBjYWxsbWFwOworCW1zZy0+Y2FsbF9zdHJ1Y3Qud2FpdG1hc2sgPSBjYWxsbWFwOworCW1zZy0+dHlwZSA9IEJGSU5fSVBJX0NBTExfRlVOQzsKKworCWZvcl9lYWNoX2NwdV9tYXNrKGNwdSwgY2FsbG1hcCkgeworCQltc2dfcXVldWUgPSAmcGVyX2NwdShpcGlfbXNnX3F1ZXVlLCBjcHUpOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmbXNnX3F1ZXVlLT5sb2NrLCBmbGFncyk7CisJCWxpc3RfYWRkKCZtc2ctPmxpc3QsICZtc2dfcXVldWUtPmhlYWQpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtc2dfcXVldWUtPmxvY2ssIGZsYWdzKTsKKwkJcGxhdGZvcm1fc2VuZF9pcGlfY3B1KGNwdSk7CisJfQorCWlmICh3YWl0KSB7CisJCXdoaWxlICghY3B1c19lbXB0eShtc2ctPmNhbGxfc3RydWN0LndhaXRtYXNrKSkKKwkJCWJsYWNrZmluX2RjYWNoZV9pbnZhbGlkYXRlX3JhbmdlKAorCQkJCSh1bnNpZ25lZCBsb25nKSgmbXNnLT5jYWxsX3N0cnVjdC53YWl0bWFzayksCisJCQkJKHVuc2lnbmVkIGxvbmcpKCZtc2ctPmNhbGxfc3RydWN0LndhaXRtYXNrKSk7CisJCWtmcmVlKG1zZyk7CisJfQorCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc21wX2NhbGxfZnVuY3Rpb24pOworCitpbnQgc21wX2NhbGxfZnVuY3Rpb25fc2luZ2xlKGludCBjcHVpZCwgdm9pZCAoKmZ1bmMpICh2b2lkICppbmZvKSwgdm9pZCAqaW5mbywKKwkJCQlpbnQgd2FpdCkKK3sKKwl1bnNpZ25lZCBpbnQgY3B1ID0gY3B1aWQ7CisJY3B1bWFza190IGNhbGxtYXA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgaXBpX21lc3NhZ2VfcXVldWUgKm1zZ19xdWV1ZTsKKwlzdHJ1Y3QgaXBpX21lc3NhZ2UgKm1zZzsKKworCWlmIChjcHVfaXNfb2ZmbGluZShjcHUpKQorCQlyZXR1cm4gMDsKKwljcHVzX2NsZWFyKGNhbGxtYXApOworCWNwdV9zZXQoY3B1LCBjYWxsbWFwKTsKKworCW1zZyA9IGttYWxsb2Moc2l6ZW9mKCptc2cpLCBHRlBfQVRPTUlDKTsKKwlJTklUX0xJU1RfSEVBRCgmbXNnLT5saXN0KTsKKwltc2ctPmNhbGxfc3RydWN0LmZ1bmMgPSBmdW5jOworCW1zZy0+Y2FsbF9zdHJ1Y3QuaW5mbyA9IGluZm87CisJbXNnLT5jYWxsX3N0cnVjdC53YWl0ID0gd2FpdDsKKwltc2ctPmNhbGxfc3RydWN0LnBlbmRpbmcgPSBjYWxsbWFwOworCW1zZy0+Y2FsbF9zdHJ1Y3Qud2FpdG1hc2sgPSBjYWxsbWFwOworCW1zZy0+dHlwZSA9IEJGSU5fSVBJX0NBTExfRlVOQzsKKworCW1zZ19xdWV1ZSA9ICZwZXJfY3B1KGlwaV9tc2dfcXVldWUsIGNwdSk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJm1zZ19xdWV1ZS0+bG9jaywgZmxhZ3MpOworCWxpc3RfYWRkKCZtc2ctPmxpc3QsICZtc2dfcXVldWUtPmhlYWQpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1zZ19xdWV1ZS0+bG9jaywgZmxhZ3MpOworCXBsYXRmb3JtX3NlbmRfaXBpX2NwdShjcHUpOworCisJaWYgKHdhaXQpIHsKKwkJd2hpbGUgKCFjcHVzX2VtcHR5KG1zZy0+Y2FsbF9zdHJ1Y3Qud2FpdG1hc2spKQorCQkJYmxhY2tmaW5fZGNhY2hlX2ludmFsaWRhdGVfcmFuZ2UoCisJCQkJKHVuc2lnbmVkIGxvbmcpKCZtc2ctPmNhbGxfc3RydWN0LndhaXRtYXNrKSwKKwkJCQkodW5zaWduZWQgbG9uZykoJm1zZy0+Y2FsbF9zdHJ1Y3Qud2FpdG1hc2spKTsKKwkJa2ZyZWUobXNnKTsKKwl9CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzbXBfY2FsbF9mdW5jdGlvbl9zaW5nbGUpOworCit2b2lkIHNtcF9zZW5kX3Jlc2NoZWR1bGUoaW50IGNwdSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBpcGlfbWVzc2FnZV9xdWV1ZSAqbXNnX3F1ZXVlOworCXN0cnVjdCBpcGlfbWVzc2FnZSAqbXNnOworCisJaWYgKGNwdV9pc19vZmZsaW5lKGNwdSkpCisJCXJldHVybjsKKworCW1zZyA9IGttYWxsb2Moc2l6ZW9mKCptc2cpLCBHRlBfQVRPTUlDKTsKKwltZW1zZXQobXNnLCAwLCBzaXplb2YobXNnKSk7CisJSU5JVF9MSVNUX0hFQUQoJm1zZy0+bGlzdCk7CisJbXNnLT50eXBlID0gQkZJTl9JUElfUkVTQ0hFRFVMRTsKKworCW1zZ19xdWV1ZSA9ICZwZXJfY3B1KGlwaV9tc2dfcXVldWUsIGNwdSk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJm1zZ19xdWV1ZS0+bG9jaywgZmxhZ3MpOworCWxpc3RfYWRkKCZtc2ctPmxpc3QsICZtc2dfcXVldWUtPmhlYWQpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1zZ19xdWV1ZS0+bG9jaywgZmxhZ3MpOworCXBsYXRmb3JtX3NlbmRfaXBpX2NwdShjcHUpOworCisJcmV0dXJuOworfQorCit2b2lkIHNtcF9zZW5kX3N0b3Aodm9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgY3B1OworCWNwdW1hc2tfdCBjYWxsbWFwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGlwaV9tZXNzYWdlX3F1ZXVlICptc2dfcXVldWU7CisJc3RydWN0IGlwaV9tZXNzYWdlICptc2c7CisKKwljYWxsbWFwID0gY3B1X29ubGluZV9tYXA7CisJY3B1X2NsZWFyKHNtcF9wcm9jZXNzb3JfaWQoKSwgY2FsbG1hcCk7CisJaWYgKGNwdXNfZW1wdHkoY2FsbG1hcCkpCisJCXJldHVybjsKKworCW1zZyA9IGttYWxsb2Moc2l6ZW9mKCptc2cpLCBHRlBfQVRPTUlDKTsKKwltZW1zZXQobXNnLCAwLCBzaXplb2YobXNnKSk7CisJSU5JVF9MSVNUX0hFQUQoJm1zZy0+bGlzdCk7CisJbXNnLT50eXBlID0gQkZJTl9JUElfQ1BVX1NUT1A7CisKKwlmb3JfZWFjaF9jcHVfbWFzayhjcHUsIGNhbGxtYXApIHsKKwkJbXNnX3F1ZXVlID0gJnBlcl9jcHUoaXBpX21zZ19xdWV1ZSwgY3B1KTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJm1zZ19xdWV1ZS0+bG9jaywgZmxhZ3MpOworCQlsaXN0X2FkZCgmbXNnLT5saXN0LCAmbXNnX3F1ZXVlLT5oZWFkKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbXNnX3F1ZXVlLT5sb2NrLCBmbGFncyk7CisJCXBsYXRmb3JtX3NlbmRfaXBpX2NwdShjcHUpOworCX0KKwlyZXR1cm47Cit9CisKK2ludCBfX2NwdWluaXQgX19jcHVfdXAodW5zaWduZWQgaW50IGNwdSkKK3sKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKmlkbGU7CisJaW50IHJldDsKKworCWlkbGUgPSBmb3JrX2lkbGUoY3B1KTsKKwlpZiAoSVNfRVJSKGlkbGUpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiQ1BVJXU6IGZvcmsoKSBmYWlsZWRcbiIsIGNwdSk7CisJCXJldHVybiBQVFJfRVJSKGlkbGUpOworCX0KKworCXNlY29uZGFyeV9zdGFjayA9IHRhc2tfc3RhY2tfcGFnZShpZGxlKSArIFRIUkVBRF9TSVpFOworCXNtcF93bWIoKTsKKworCXJldCA9IHBsYXRmb3JtX2Jvb3Rfc2Vjb25kYXJ5KGNwdSwgaWRsZSk7CisKKwlpZiAocmV0KSB7CisJCWNwdV9jbGVhcihjcHUsIGNwdV9wcmVzZW50X21hcCk7CisJCXByaW50ayhLRVJOX0NSSVQgIkNQVSV1OiBwcm9jZXNzb3IgZmFpbGVkIHRvIGJvb3QgKCVkKVxuIiwgY3B1LCByZXQpOworCQlmcmVlX3Rhc2soaWRsZSk7CisJfSBlbHNlCisJCWNwdV9zZXQoY3B1LCBjcHVfb25saW5lX21hcCk7CisKKwlzZWNvbmRhcnlfc3RhY2sgPSBOVUxMOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgX19jcHVpbml0IHNldHVwX3NlY29uZGFyeSh1bnNpZ25lZCBpbnQgY3B1KQoreworI2lmICEoZGVmaW5lZChDT05GSUdfVElDS19TT1VSQ0VfU1lTVE1SMCkgfHwgZGVmaW5lZChDT05GSUdfSVBJUEUpKQorCXN0cnVjdCBpcnFfZGVzYyAqdGltZXJfZGVzYzsKKyNlbmRpZgorCXVuc2lnbmVkIGxvbmcgaWxhdDsKKworCWJmaW5fd3JpdGVfSU1BU0soMCk7CisJQ1NZTkMoKTsKKwlpbGF0ID0gYmZpbl9yZWFkX0lMQVQoKTsKKwlDU1lOQygpOworCWJmaW5fd3JpdGVfSUxBVChpbGF0KTsKKwlDU1lOQygpOworCisJLyogUmVzZXJ2ZSB0aGUgUERBIHNwYWNlIGZvciB0aGUgc2Vjb25kYXJ5IENQVS4gKi8KKwlyZXNlcnZlX3BkYSgpOworCisJLyogRW5hYmxlIGludGVycnVwdCBsZXZlbHMgSVZHNy0xNS4gSUFScyBoYXZlIGJlZW4gYWxyZWFkeQorCSAqIHByb2dyYW1tZWQgYnkgdGhlIGJvb3QgQ1BVLiAgKi8KKwliZmluX2lycV9mbGFncyB8PSBJTUFTS19JVkcxNSB8CisJICAgIElNQVNLX0lWRzE0IHwgSU1BU0tfSVZHMTMgfCBJTUFTS19JVkcxMiB8IElNQVNLX0lWRzExIHwKKwkgICAgSU1BU0tfSVZHMTAgfCBJTUFTS19JVkc5IHwgSU1BU0tfSVZHOCB8IElNQVNLX0lWRzcgfCBJTUFTS19JVkdIVzsKKworI2lmIGRlZmluZWQoQ09ORklHX1RJQ0tfU09VUkNFX1NZU1RNUjApIHx8IGRlZmluZWQoQ09ORklHX0lQSVBFKQorCS8qIFBvd2VyIGRvd24gdGhlIGNvcmUgdGltZXIsIGp1c3QgdG8gcGxheSBzYWZlLiAqLworCWJmaW5fd3JpdGVfVENOVEwoMCk7CisKKwkvKiBzeXN0ZW0gdGltZXIwIGhhcyBiZWVuIHNldHVwIGJ5IENvcmVBLiAqLworI2Vsc2UKKwl0aW1lcl9kZXNjID0gaXJxX2Rlc2MgKyBJUlFfQ09SRVRNUjsKKwlzZXR1cF9jb3JlX3RpbWVyKCk7CisJdGltZXJfZGVzYy0+Y2hpcC0+ZW5hYmxlKElSUV9DT1JFVE1SKTsKKyNlbmRpZgorfQorCit2b2lkIF9fY3B1aW5pdCBzZWNvbmRhcnlfc3RhcnRfa2VybmVsKHZvaWQpCit7CisJdW5zaWduZWQgaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKwlzdHJ1Y3QgbW1fc3RydWN0ICptbSA9ICZpbml0X21tOworCisJaWYgKF9iZmluX3N3cnN0ICYgU1dSU1RfREJMX0ZBVUxUX0IpIHsKKwkJcHJpbnRrKEtFUk5fRU1FUkcgIkNvcmVCIFJlY292ZXJpbmcgZnJvbSBET1VCTEUgRkFVTFQgZXZlbnRcbiIpOworI2lmZGVmIENPTkZJR19ERUJVR19ET1VCTEVGQVVMVAorCQlwcmludGsoS0VSTl9FTUVSRyAiIFdoaWxlIGhhbmRsaW5nIGV4Y2VwdGlvbiAoRVhDQVVTRSA9IDB4JXgpIGF0ICVwRlxuIiwKKwkJCShpbnQpaW5pdF9zYXZlZF9zZXFzdGF0X2NvcmViICYgU0VRU1RBVF9FWENBVVNFLCBpbml0X3NhdmVkX3JldHhfY29yZWIpOworCQlwcmludGsoS0VSTl9OT1RJQ0UgIiAgIERDUExCX0ZBVUxUX0FERFI6ICVwRlxuIiwgaW5pdF9zYXZlZF9kY3BsYl9mYXVsdF9hZGRyX2NvcmViKTsKKwkJcHJpbnRrKEtFUk5fTk9USUNFICIgICBJQ1BMQl9GQVVMVF9BRERSOiAlcEZcbiIsIGluaXRfc2F2ZWRfaWNwbGJfZmF1bHRfYWRkcl9jb3JlYik7CisjZW5kaWYKKwkJcHJpbnRrKEtFUk5fTk9USUNFICIgVGhlIGluc3RydWN0aW9uIGF0ICVwRiBjYXVzZWQgYSBkb3VibGUgZXhjZXB0aW9uXG4iLAorCQkJaW5pdF9yZXR4X2NvcmViKTsKKwl9CisKKwkvKgorCSAqIFdlIHdhbnQgdGhlIEQtY2FjaGUgdG8gYmUgZW5hYmxlZCBlYXJseSwgaW4gY2FzZSB0aGUgYXRvbWljCisJICogc3VwcG9ydCBjb2RlIGVtdWxhdGVzIGNhY2hlIGNvaGVyZW5jZSAoc2VlCisJICogX19BUkNIX1NZTkNfQ09SRV9EQ0FDSEUpLgorCSAqLworCWluaXRfZXhjZXB0aW9uX3ZlY3RvcnMoKTsKKworCWJmaW5fc2V0dXBfY2FjaGVzKGNwdSk7CisKKwlsb2NhbF9pcnFfZGlzYWJsZSgpOworCisJLyogQXR0YWNoIHRoZSBuZXcgaWRsZSB0YXNrIHRvIHRoZSBnbG9iYWwgbW0uICovCisJYXRvbWljX2luYygmbW0tPm1tX3VzZXJzKTsKKwlhdG9taWNfaW5jKCZtbS0+bW1fY291bnQpOworCWN1cnJlbnQtPmFjdGl2ZV9tbSA9IG1tOworCUJVR19PTihjdXJyZW50LT5tbSk7CS8qIENhbid0IGJlLCBidXQgYmV0dGVyIGJlIHNhZmUgdGhhbiBzb3JyeS4gKi8KKworCXByZWVtcHRfZGlzYWJsZSgpOworCisJc2V0dXBfc2Vjb25kYXJ5KGNwdSk7CisKKwlsb2NhbF9pcnFfZW5hYmxlKCk7CisKKwlwbGF0Zm9ybV9zZWNvbmRhcnlfaW5pdChjcHUpOworCisJY3B1X2lkbGUoKTsKK30KKwordm9pZCBfX2luaXQgc21wX3ByZXBhcmVfYm9vdF9jcHUodm9pZCkKK3sKK30KKwordm9pZCBfX2luaXQgc21wX3ByZXBhcmVfY3B1cyh1bnNpZ25lZCBpbnQgbWF4X2NwdXMpCit7CisJcGxhdGZvcm1fcHJlcGFyZV9jcHVzKG1heF9jcHVzKTsKKwlpcGlfcXVldWVfaW5pdCgpOworCXBsYXRmb3JtX3JlcXVlc3RfaXBpKCZpcGlfaGFuZGxlcik7Cit9CisKK3ZvaWQgX19pbml0IHNtcF9jcHVzX2RvbmUodW5zaWduZWQgaW50IG1heF9jcHVzKQoreworCXVuc2lnbmVkIGxvbmcgYm9nb3N1bSA9IDA7CisJdW5zaWduZWQgaW50IGNwdTsKKworCWZvcl9lYWNoX29ubGluZV9jcHUoY3B1KQorCQlib2dvc3VtICs9IHBlcl9jcHUoY3B1X2RhdGEsIGNwdSkubG9vcHNfcGVyX2ppZmZ5OworCisJcHJpbnRrKEtFUk5fSU5GTyAiU01QOiBUb3RhbCBvZiAlZCBwcm9jZXNzb3JzIGFjdGl2YXRlZCAiCisJICAgICAgICIoJWx1LiUwMmx1IEJvZ29NSVBTKS5cbiIsCisJICAgICAgIG51bV9vbmxpbmVfY3B1cygpLAorCSAgICAgICBib2dvc3VtIC8gKDUwMDAwMC9IWiksCisJICAgICAgIChib2dvc3VtIC8gKDUwMDAvSFopKSAlIDEwMCk7Cit9CisKK3ZvaWQgc21wX2ljYWNoZV9mbHVzaF9yYW5nZV9vdGhlcnModW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQpCit7CisJc21wX2ZsdXNoX2RhdGEuc3RhcnQgPSBzdGFydDsKKwlzbXBfZmx1c2hfZGF0YS5lbmQgPSBlbmQ7CisKKwlpZiAoc21wX2NhbGxfZnVuY3Rpb24oJmlwaV9mbHVzaF9pY2FjaGUsICZzbXBfZmx1c2hfZGF0YSwgMSkpCisJCXByaW50ayhLRVJOX1dBUk5JTkcgIlNNUDogZmFpbGVkIHRvIHJ1biBJLWNhY2hlIGZsdXNoIHJlcXVlc3Qgb24gb3RoZXIgQ1BVc1xuIik7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzbXBfaWNhY2hlX2ZsdXNoX3JhbmdlX290aGVycyk7CisKKyNpZmRlZiBfX0FSQ0hfU1lOQ19DT1JFX0RDQUNIRQordW5zaWduZWQgbG9uZyBiYXJyaWVyX21hc2sgX19hdHRyaWJ1dGVfXyAoKF9fc2VjdGlvbl9fKCIubDIuYnNzIikpKTsKKwordm9pZCByZXN5bmNfY29yZV9kY2FjaGUodm9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgY3B1ID0gZ2V0X2NwdSgpOworCWJsYWNrZmluX2ludmFsaWRhdGVfZW50aXJlX2RjYWNoZSgpOworCSsrcGVyX2NwdShjcHVfZGF0YSwgY3B1KS5kY2FjaGVfaW52bGRfY291bnQ7CisJcHV0X2NwdSgpOworfQorRVhQT1JUX1NZTUJPTChyZXN5bmNfY29yZV9kY2FjaGUpOworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21tL2luaXQuYyBiL2FyY2gvYmxhY2tmaW4vbW0vaW5pdC5jCmluZGV4IGJjMjQwYWIuLmQwNTMyYjcgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbW0vaW5pdC5jCisrKyBiL2FyY2gvYmxhY2tmaW4vbW0vaW5pdC5jCkBAIC0zMSw3ICszMSw4IEBACiAjaW5jbHVkZSA8bGludXgvYm9vdG1lbS5oPgogI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vYmZpbi1nbG9iYWwuaD4KLSNpbmNsdWRlIDxhc20vbDFsYXlvdXQuaD4KKyNpbmNsdWRlIDxhc20vcGRhLmg+CisjaW5jbHVkZSA8YXNtL2NwbGJpbml0Lmg+CiAjaW5jbHVkZSAiYmxhY2tmaW5fc3JhbS5oIgogCiAvKgpAQCAtNTMsNiArNTQsMTEgQEAKIAogdW5zaWduZWQgbG9uZyBlbXB0eV96ZXJvX3BhZ2U7CiAKK2V4dGVybiB1bnNpZ25lZCBsb25nIGV4Y2VwdGlvbl9zdGFja1tOUl9DUFVTXVsxMDI0XTsKKworc3RydWN0IGJsYWNrZmluX3BkYSBjcHVfcGRhW05SX0NQVVNdOworRVhQT1JUX1NZTUJPTChjcHVfcGRhKTsKKwogLyoKICAqIHBhZ2luZ19pbml0KCkgY29udGludWVzIHRoZSB2aXJ0dWFsIG1lbW9yeSBlbnZpcm9ubWVudCBzZXR1cCB3aGljaAogICogd2FzIGJlZ3VuIGJ5IHRoZSBjb2RlIGluIGFyY2gvaGVhZC5TLgpAQCAtOTgsNiArMTA0LDMyIEBACiAJfQogfQogCithc21saW5rYWdlIHZvaWQgaW5pdF9wZGEodm9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgY3B1ID0gcmF3X3NtcF9wcm9jZXNzb3JfaWQoKTsKKworCS8qIEluaXRpYWxpemUgdGhlIFBEQSBmaWVsZHMgaG9sZGluZyByZWZlcmVuY2VzIHRvIG90aGVyIHBhcnRzCisJICAgb2YgdGhlIG1lbW9yeS4gVGhlIGNvbnRlbnQgb2Ygc3VjaCBtZW1vcnkgaXMgc3RpbGwKKwkgICB1bmRlZmluZWQgYXQgdGhlIHRpbWUgb2YgdGhlIGNhbGwsIHdlIGFyZSBvbmx5IHNldHRpbmcgdXAKKwkgICB2YWxpZCBwb2ludGVycyB0byBpdC4gKi8KKwltZW1zZXQoJmNwdV9wZGFbY3B1XSwgMCwgc2l6ZW9mKGNwdV9wZGFbY3B1XSkpOworCisJY3B1X3BkYVswXS5uZXh0ID0gJmNwdV9wZGFbMV07CisJY3B1X3BkYVsxXS5uZXh0ID0gJmNwdV9wZGFbMF07CisKKwljcHVfcGRhW2NwdV0uZXhfc3RhY2sgPSBleGNlcHRpb25fc3RhY2tbY3B1ICsgMV07CisKKyNpZmRlZiBDT05GSUdfU01QCisJY3B1X3BkYVtjcHVdLmltYXNrID0gMHgxZjsKKyNlbmRpZgorfQorCit2b2lkIF9fY3B1aW5pdCByZXNlcnZlX3BkYSh2b2lkKQoreworCXByaW50ayhLRVJOX0lORk8gIlBEQSBmb3IgQ1BVJXUgcmVzZXJ2ZWQgYXQgJXBcbiIsIHNtcF9wcm9jZXNzb3JfaWQoKSwKKwkJCQkJJmNwdV9wZGFbc21wX3Byb2Nlc3Nvcl9pZCgpXSk7Cit9CisKIHZvaWQgX19pbml0IG1lbV9pbml0KHZvaWQpCiB7CiAJdW5zaWduZWQgaW50IGNvZGVrID0gMCwgZGF0YWsgPSAwLCBpbml0ayA9IDA7CkBAIC0xNDEsMjEgKzE3MywxMyBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBzcmFtX2luaXQodm9pZCkKIHsKLQl1bnNpZ25lZCBsb25nIHRtcDsKLQogCS8qIEluaXRpYWxpemUgdGhlIGJsYWNrZmluIEwxIE1lbW9yeS4gKi8KIAliZmluX3NyYW1faW5pdCgpOwogCi0JLyogQWxsb2NhdGUgdGhpcyBvbmNlOyBuZXZlciBmcmVlIGl0LiAgV2UgYXNzdW1lIHRoaXMgZ2l2ZXMgdXMgYQotCSAgIHBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIEwxIHNjcmF0Y2hwYWQgbWVtb3J5OyBwYW5pYyBpZiBpdAotCSAgIGRvZXNuJ3QuICAqLwotCXRtcCA9ICh1bnNpZ25lZCBsb25nKWwxc3JhbV9hbGxvYyhzaXplb2Yoc3RydWN0IGwxX3NjcmF0Y2hfdGFza19pbmZvKSk7Ci0JaWYgKHRtcCAhPSAodW5zaWduZWQgbG9uZylMMV9TQ1JBVENIX1RBU0tfSU5GTykgewotCQlwcmludGsoS0VSTl9FTUVSRyAibWVtX2luaXQoKTogRGlkIG5vdCBnZXQgdGhlIHJpZ2h0IGFkZHJlc3MgZnJvbSBsMXNyYW1fYWxsb2M6ICUwOGx4ICE9ICUwOGx4XG4iLAotCQkJdG1wLCAodW5zaWduZWQgbG9uZylMMV9TQ1JBVENIX1RBU0tfSU5GTyk7Ci0JCXBhbmljKCJObyBMMSwgdGltZSB0byBnaXZlIHVwXG4iKTsKLQl9Ci0KKwkvKiBSZXNlcnZlIHRoZSBQREEgc3BhY2UgZm9yIHRoZSBib290IENQVSByaWdodCBhZnRlciB3ZQorCSAqIGluaXRpYWxpemVkIHRoZSBzY3JhdGNoIG1lbW9yeSBhbGxvY2F0b3IuCisJICovCisJcmVzZXJ2ZV9wZGEoKTsKIAlyZXR1cm4gMDsKIH0KIHB1cmVfaW5pdGNhbGwoc3JhbV9pbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbW0vc3JhbS1hbGxvYy5jIGIvYXJjaC9ibGFja2Zpbi9tbS9zcmFtLWFsbG9jLmMKaW5kZXggY2M2ZjMzNi4uODM0Y2FiNyAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tbS9zcmFtLWFsbG9jLmMKKysrIGIvYXJjaC9ibGFja2Zpbi9tbS9zcmFtLWFsbG9jLmMKQEAgLTM5LDEwICszOSwxMyBAQAogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvcnRjLmg+CiAjaW5jbHVkZSA8YXNtL2JsYWNrZmluLmg+CisjaW5jbHVkZSA8YXNtL21lbV9tYXAuaD4KICNpbmNsdWRlICJibGFja2Zpbl9zcmFtLmgiCiAKLXN0YXRpYyBzcGlubG9ja190IGwxc3JhbV9sb2NrLCBsMV9kYXRhX3NyYW1fbG9jaywgbDFfaW5zdF9zcmFtX2xvY2s7Ci1zdGF0aWMgc3BpbmxvY2tfdCBsMl9zcmFtX2xvY2s7CitzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3BpbmxvY2tfdCwgbDFzcmFtX2xvY2spIF9fX19jYWNoZWxpbmVfYWxpZ25lZF9pbl9zbXA7CitzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3BpbmxvY2tfdCwgbDFfZGF0YV9zcmFtX2xvY2spIF9fX19jYWNoZWxpbmVfYWxpZ25lZF9pbl9zbXA7CitzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3BpbmxvY2tfdCwgbDFfaW5zdF9zcmFtX2xvY2spIF9fX19jYWNoZWxpbmVfYWxpZ25lZF9pbl9zbXA7CitzdGF0aWMgc3BpbmxvY2tfdCBsMl9zcmFtX2xvY2sgX19fX2NhY2hlbGluZV9hbGlnbmVkX2luX3NtcDsKIAogLyogdGhlIGRhdGEgc3RydWN0dXJlIGZvciBMMSBzY3JhdGNocGFkIGFuZCBEQVRBIFNSQU0gKi8KIHN0cnVjdCBzcmFtX3BpZWNlIHsKQEAgLTUyLDE4ICs1NSwyMiBAQAogCXN0cnVjdCBzcmFtX3BpZWNlICpuZXh0OwogfTsKIAotc3RhdGljIHN0cnVjdCBzcmFtX3BpZWNlIGZyZWVfbDFfc3NyYW1faGVhZCwgdXNlZF9sMV9zc3JhbV9oZWFkOworc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCBzcmFtX3BpZWNlLCBmcmVlX2wxX3NzcmFtX2hlYWQpOworc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCBzcmFtX3BpZWNlLCB1c2VkX2wxX3NzcmFtX2hlYWQpOwogCiAjaWYgTDFfREFUQV9BX0xFTkdUSCAhPSAwCi1zdGF0aWMgc3RydWN0IHNyYW1fcGllY2UgZnJlZV9sMV9kYXRhX0Ffc3JhbV9oZWFkLCB1c2VkX2wxX2RhdGFfQV9zcmFtX2hlYWQ7CitzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IHNyYW1fcGllY2UsIGZyZWVfbDFfZGF0YV9BX3NyYW1faGVhZCk7CitzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IHNyYW1fcGllY2UsIHVzZWRfbDFfZGF0YV9BX3NyYW1faGVhZCk7CiAjZW5kaWYKIAogI2lmIEwxX0RBVEFfQl9MRU5HVEggIT0gMAotc3RhdGljIHN0cnVjdCBzcmFtX3BpZWNlIGZyZWVfbDFfZGF0YV9CX3NyYW1faGVhZCwgdXNlZF9sMV9kYXRhX0Jfc3JhbV9oZWFkOworc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCBzcmFtX3BpZWNlLCBmcmVlX2wxX2RhdGFfQl9zcmFtX2hlYWQpOworc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCBzcmFtX3BpZWNlLCB1c2VkX2wxX2RhdGFfQl9zcmFtX2hlYWQpOwogI2VuZGlmCiAKICNpZiBMMV9DT0RFX0xFTkdUSCAhPSAwCi1zdGF0aWMgc3RydWN0IHNyYW1fcGllY2UgZnJlZV9sMV9pbnN0X3NyYW1faGVhZCwgdXNlZF9sMV9pbnN0X3NyYW1faGVhZDsKK3N0YXRpYyBERUZJTkVfUEVSX0NQVShzdHJ1Y3Qgc3JhbV9waWVjZSwgZnJlZV9sMV9pbnN0X3NyYW1faGVhZCk7CitzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IHNyYW1fcGllY2UsIHVzZWRfbDFfaW5zdF9zcmFtX2hlYWQpOwogI2VuZGlmCiAKICNpZiBMMl9MRU5HVEggIT0gMApAQCAtNzUsMTAyICs4MiwxMTcgQEAKIC8qIEwxIFNjcmF0Y2hwYWQgU1JBTSBpbml0aWFsaXphdGlvbiBmdW5jdGlvbiAqLwogc3RhdGljIHZvaWQgX19pbml0IGwxc3JhbV9pbml0KHZvaWQpCiB7Ci0JZnJlZV9sMV9zc3JhbV9oZWFkLm5leHQgPQotCQlrbWVtX2NhY2hlX2FsbG9jKHNyYW1fcGllY2VfY2FjaGUsIEdGUF9LRVJORUwpOwotCWlmICghZnJlZV9sMV9zc3JhbV9oZWFkLm5leHQpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiRmFpbGVkIHRvIGluaXRpYWxpemUgU2NyYXRjaHBhZCBkYXRhIFNSQU1cbiIpOwotCQlyZXR1cm47CisJdW5zaWduZWQgaW50IGNwdTsKKwlmb3IgKGNwdSA9IDA7IGNwdSA8IG51bV9wb3NzaWJsZV9jcHVzKCk7ICsrY3B1KSB7CisJCXBlcl9jcHUoZnJlZV9sMV9zc3JhbV9oZWFkLCBjcHUpLm5leHQgPQorCQkJa21lbV9jYWNoZV9hbGxvYyhzcmFtX3BpZWNlX2NhY2hlLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFwZXJfY3B1KGZyZWVfbDFfc3NyYW1faGVhZCwgY3B1KS5uZXh0KSB7CisJCQlwcmludGsoS0VSTl9JTkZPICJGYWlsIHRvIGluaXRpYWxpemUgU2NyYXRjaHBhZCBkYXRhIFNSQU0uXG4iKTsKKwkJCXJldHVybjsKKwkJfQorCisJCXBlcl9jcHUoZnJlZV9sMV9zc3JhbV9oZWFkLCBjcHUpLm5leHQtPnBhZGRyID0gKHZvaWQgKilnZXRfbDFfc2NyYXRjaF9zdGFydF9jcHUoY3B1KTsKKwkJcGVyX2NwdShmcmVlX2wxX3NzcmFtX2hlYWQsIGNwdSkubmV4dC0+c2l6ZSA9IEwxX1NDUkFUQ0hfTEVOR1RIOworCQlwZXJfY3B1KGZyZWVfbDFfc3NyYW1faGVhZCwgY3B1KS5uZXh0LT5waWQgPSAwOworCQlwZXJfY3B1KGZyZWVfbDFfc3NyYW1faGVhZCwgY3B1KS5uZXh0LT5uZXh0ID0gTlVMTDsKKworCQlwZXJfY3B1KHVzZWRfbDFfc3NyYW1faGVhZCwgY3B1KS5uZXh0ID0gTlVMTDsKKworCQkvKiBtdXRleCBpbml0aWFsaXplICovCisJCXNwaW5fbG9ja19pbml0KCZwZXJfY3B1KGwxc3JhbV9sb2NrLCBjcHUpKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiQmxhY2tmaW4gU2NyYXRjaHBhZCBkYXRhIFNSQU06ICVkIEtCXG4iLAorCQkJTDFfU0NSQVRDSF9MRU5HVEggPj4gMTApOwogCX0KLQotCWZyZWVfbDFfc3NyYW1faGVhZC5uZXh0LT5wYWRkciA9ICh2b2lkICopTDFfU0NSQVRDSF9TVEFSVDsKLQlmcmVlX2wxX3NzcmFtX2hlYWQubmV4dC0+c2l6ZSA9IEwxX1NDUkFUQ0hfTEVOR1RIOwotCWZyZWVfbDFfc3NyYW1faGVhZC5uZXh0LT5waWQgPSAwOwotCWZyZWVfbDFfc3NyYW1faGVhZC5uZXh0LT5uZXh0ID0gTlVMTDsKLQotCXVzZWRfbDFfc3NyYW1faGVhZC5uZXh0ID0gTlVMTDsKLQotCS8qIG11dGV4IGluaXRpYWxpemUgKi8KLQlzcGluX2xvY2tfaW5pdCgmbDFzcmFtX2xvY2spOwotCi0JcHJpbnRrKEtFUk5fSU5GTyAiQmxhY2tmaW4gU2NyYXRjaHBhZCBkYXRhIFNSQU06ICVkIEtCXG4iLAotCSAgICAgICBMMV9TQ1JBVENIX0xFTkdUSCA+PiAxMCk7CiB9CiAKIHN0YXRpYyB2b2lkIF9faW5pdCBsMV9kYXRhX3NyYW1faW5pdCh2b2lkKQogeworI2lmIEwxX0RBVEFfQV9MRU5HVEggIT0gMCB8fCBMMV9EQVRBX0JfTEVOR1RIICE9IDAKKwl1bnNpZ25lZCBpbnQgY3B1OworI2VuZGlmCiAjaWYgTDFfREFUQV9BX0xFTkdUSCAhPSAwCi0JZnJlZV9sMV9kYXRhX0Ffc3JhbV9oZWFkLm5leHQgPQotCQlrbWVtX2NhY2hlX2FsbG9jKHNyYW1fcGllY2VfY2FjaGUsIEdGUF9LRVJORUwpOwotCWlmICghZnJlZV9sMV9kYXRhX0Ffc3JhbV9oZWFkLm5leHQpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiRmFpbGVkIHRvIGluaXRpYWxpemUgTDEgRGF0YSBBIFNSQU1cbiIpOwotCQlyZXR1cm47CisJZm9yIChjcHUgPSAwOyBjcHUgPCBudW1fcG9zc2libGVfY3B1cygpOyArK2NwdSkgeworCQlwZXJfY3B1KGZyZWVfbDFfZGF0YV9BX3NyYW1faGVhZCwgY3B1KS5uZXh0ID0KKwkJCWttZW1fY2FjaGVfYWxsb2Moc3JhbV9waWVjZV9jYWNoZSwgR0ZQX0tFUk5FTCk7CisJCWlmICghcGVyX2NwdShmcmVlX2wxX2RhdGFfQV9zcmFtX2hlYWQsIGNwdSkubmV4dCkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiRmFpbCB0byBpbml0aWFsaXplIEwxIERhdGEgQSBTUkFNLlxuIik7CisJCQlyZXR1cm47CisJCX0KKworCQlwZXJfY3B1KGZyZWVfbDFfZGF0YV9BX3NyYW1faGVhZCwgY3B1KS5uZXh0LT5wYWRkciA9CisJCQkodm9pZCAqKWdldF9sMV9kYXRhX2Ffc3RhcnRfY3B1KGNwdSkgKyAoX2Vic3NfbDEgLSBfc2RhdGFfbDEpOworCQlwZXJfY3B1KGZyZWVfbDFfZGF0YV9BX3NyYW1faGVhZCwgY3B1KS5uZXh0LT5zaXplID0KKwkJCUwxX0RBVEFfQV9MRU5HVEggLSAoX2Vic3NfbDEgLSBfc2RhdGFfbDEpOworCQlwZXJfY3B1KGZyZWVfbDFfZGF0YV9BX3NyYW1faGVhZCwgY3B1KS5uZXh0LT5waWQgPSAwOworCQlwZXJfY3B1KGZyZWVfbDFfZGF0YV9BX3NyYW1faGVhZCwgY3B1KS5uZXh0LT5uZXh0ID0gTlVMTDsKKworCQlwZXJfY3B1KHVzZWRfbDFfZGF0YV9BX3NyYW1faGVhZCwgY3B1KS5uZXh0ID0gTlVMTDsKKworCQlwcmludGsoS0VSTl9JTkZPICJCbGFja2ZpbiBMMSBEYXRhIEEgU1JBTTogJWQgS0IgKCVkIEtCIGZyZWUpXG4iLAorCQkJTDFfREFUQV9BX0xFTkdUSCA+PiAxMCwKKwkJCXBlcl9jcHUoZnJlZV9sMV9kYXRhX0Ffc3JhbV9oZWFkLCBjcHUpLm5leHQtPnNpemUgPj4gMTApOwogCX0KLQotCWZyZWVfbDFfZGF0YV9BX3NyYW1faGVhZC5uZXh0LT5wYWRkciA9Ci0JCSh2b2lkICopTDFfREFUQV9BX1NUQVJUICsgKF9lYnNzX2wxIC0gX3NkYXRhX2wxKTsKLQlmcmVlX2wxX2RhdGFfQV9zcmFtX2hlYWQubmV4dC0+c2l6ZSA9Ci0JCUwxX0RBVEFfQV9MRU5HVEggLSAoX2Vic3NfbDEgLSBfc2RhdGFfbDEpOwotCWZyZWVfbDFfZGF0YV9BX3NyYW1faGVhZC5uZXh0LT5waWQgPSAwOwotCWZyZWVfbDFfZGF0YV9BX3NyYW1faGVhZC5uZXh0LT5uZXh0ID0gTlVMTDsKLQotCXVzZWRfbDFfZGF0YV9BX3NyYW1faGVhZC5uZXh0ID0gTlVMTDsKLQotCXByaW50ayhLRVJOX0lORk8gIkJsYWNrZmluIEwxIERhdGEgQSBTUkFNOiAlZCBLQiAoJWQgS0IgZnJlZSlcbiIsCi0JCUwxX0RBVEFfQV9MRU5HVEggPj4gMTAsCi0JCWZyZWVfbDFfZGF0YV9BX3NyYW1faGVhZC5uZXh0LT5zaXplID4+IDEwKTsKICNlbmRpZgogI2lmIEwxX0RBVEFfQl9MRU5HVEggIT0gMAotCWZyZWVfbDFfZGF0YV9CX3NyYW1faGVhZC5uZXh0ID0KLQkJa21lbV9jYWNoZV9hbGxvYyhzcmFtX3BpZWNlX2NhY2hlLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWZyZWVfbDFfZGF0YV9CX3NyYW1faGVhZC5uZXh0KSB7Ci0JCXByaW50ayhLRVJOX0lORk8gIkZhaWxlZCB0byBpbml0aWFsaXplIEwxIERhdGEgQiBTUkFNXG4iKTsKLQkJcmV0dXJuOworCWZvciAoY3B1ID0gMDsgY3B1IDwgbnVtX3Bvc3NpYmxlX2NwdXMoKTsgKytjcHUpIHsKKwkJcGVyX2NwdShmcmVlX2wxX2RhdGFfQl9zcmFtX2hlYWQsIGNwdSkubmV4dCA9CisJCQlrbWVtX2NhY2hlX2FsbG9jKHNyYW1fcGllY2VfY2FjaGUsIEdGUF9LRVJORUwpOworCQlpZiAoIXBlcl9jcHUoZnJlZV9sMV9kYXRhX0Jfc3JhbV9oZWFkLCBjcHUpLm5leHQpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIkZhaWwgdG8gaW5pdGlhbGl6ZSBMMSBEYXRhIEIgU1JBTS5cbiIpOworCQkJcmV0dXJuOworCQl9CisKKwkJcGVyX2NwdShmcmVlX2wxX2RhdGFfQl9zcmFtX2hlYWQsIGNwdSkubmV4dC0+cGFkZHIgPQorCQkJKHZvaWQgKilnZXRfbDFfZGF0YV9iX3N0YXJ0X2NwdShjcHUpICsgKF9lYnNzX2JfbDEgLSBfc2RhdGFfYl9sMSk7CisJCXBlcl9jcHUoZnJlZV9sMV9kYXRhX0Jfc3JhbV9oZWFkLCBjcHUpLm5leHQtPnNpemUgPQorCQkJTDFfREFUQV9CX0xFTkdUSCAtIChfZWJzc19iX2wxIC0gX3NkYXRhX2JfbDEpOworCQlwZXJfY3B1KGZyZWVfbDFfZGF0YV9CX3NyYW1faGVhZCwgY3B1KS5uZXh0LT5waWQgPSAwOworCQlwZXJfY3B1KGZyZWVfbDFfZGF0YV9CX3NyYW1faGVhZCwgY3B1KS5uZXh0LT5uZXh0ID0gTlVMTDsKKworCQlwZXJfY3B1KHVzZWRfbDFfZGF0YV9CX3NyYW1faGVhZCwgY3B1KS5uZXh0ID0gTlVMTDsKKworCQlwcmludGsoS0VSTl9JTkZPICJCbGFja2ZpbiBMMSBEYXRhIEIgU1JBTTogJWQgS0IgKCVkIEtCIGZyZWUpXG4iLAorCQkJTDFfREFUQV9CX0xFTkdUSCA+PiAxMCwKKwkJCXBlcl9jcHUoZnJlZV9sMV9kYXRhX0Jfc3JhbV9oZWFkLCBjcHUpLm5leHQtPnNpemUgPj4gMTApOworCQkvKiBtdXRleCBpbml0aWFsaXplICovCiAJfQotCi0JZnJlZV9sMV9kYXRhX0Jfc3JhbV9oZWFkLm5leHQtPnBhZGRyID0KLQkJKHZvaWQgKilMMV9EQVRBX0JfU1RBUlQgKyAoX2Vic3NfYl9sMSAtIF9zZGF0YV9iX2wxKTsKLQlmcmVlX2wxX2RhdGFfQl9zcmFtX2hlYWQubmV4dC0+c2l6ZSA9Ci0JCUwxX0RBVEFfQl9MRU5HVEggLSAoX2Vic3NfYl9sMSAtIF9zZGF0YV9iX2wxKTsKLQlmcmVlX2wxX2RhdGFfQl9zcmFtX2hlYWQubmV4dC0+cGlkID0gMDsKLQlmcmVlX2wxX2RhdGFfQl9zcmFtX2hlYWQubmV4dC0+bmV4dCA9IE5VTEw7Ci0KLQl1c2VkX2wxX2RhdGFfQl9zcmFtX2hlYWQubmV4dCA9IE5VTEw7Ci0KLQlwcmludGsoS0VSTl9JTkZPICJCbGFja2ZpbiBMMSBEYXRhIEIgU1JBTTogJWQgS0IgKCVkIEtCIGZyZWUpXG4iLAotCQlMMV9EQVRBX0JfTEVOR1RIID4+IDEwLAotCQlmcmVlX2wxX2RhdGFfQl9zcmFtX2hlYWQubmV4dC0+c2l6ZSA+PiAxMCk7CiAjZW5kaWYKIAotCS8qIG11dGV4IGluaXRpYWxpemUgKi8KLQlzcGluX2xvY2tfaW5pdCgmbDFfZGF0YV9zcmFtX2xvY2spOworI2lmIEwxX0RBVEFfQV9MRU5HVEggIT0gMCB8fCBMMV9EQVRBX0JfTEVOR1RIICE9IDAKKwlmb3IgKGNwdSA9IDA7IGNwdSA8IG51bV9wb3NzaWJsZV9jcHVzKCk7ICsrY3B1KQorCQlzcGluX2xvY2tfaW5pdCgmcGVyX2NwdShsMV9kYXRhX3NyYW1fbG9jaywgY3B1KSk7CisjZW5kaWYKIH0KIAogc3RhdGljIHZvaWQgX19pbml0IGwxX2luc3Rfc3JhbV9pbml0KHZvaWQpCiB7CiAjaWYgTDFfQ09ERV9MRU5HVEggIT0gMAotCWZyZWVfbDFfaW5zdF9zcmFtX2hlYWQubmV4dCA9Ci0JCWttZW1fY2FjaGVfYWxsb2Moc3JhbV9waWVjZV9jYWNoZSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFmcmVlX2wxX2luc3Rfc3JhbV9oZWFkLm5leHQpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiRmFpbGVkIHRvIGluaXRpYWxpemUgTDEgSW5zdHJ1Y3Rpb24gU1JBTVxuIik7Ci0JCXJldHVybjsKKwl1bnNpZ25lZCBpbnQgY3B1OworCWZvciAoY3B1ID0gMDsgY3B1IDwgbnVtX3Bvc3NpYmxlX2NwdXMoKTsgKytjcHUpIHsKKwkJcGVyX2NwdShmcmVlX2wxX2luc3Rfc3JhbV9oZWFkLCBjcHUpLm5leHQgPQorCQkJa21lbV9jYWNoZV9hbGxvYyhzcmFtX3BpZWNlX2NhY2hlLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFwZXJfY3B1KGZyZWVfbDFfaW5zdF9zcmFtX2hlYWQsIGNwdSkubmV4dCkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiRmFpbGVkIHRvIGluaXRpYWxpemUgTDEgSW5zdHJ1Y3Rpb24gU1JBTVxuIik7CisJCQlyZXR1cm47CisJCX0KKworCQlwZXJfY3B1KGZyZWVfbDFfaW5zdF9zcmFtX2hlYWQsIGNwdSkubmV4dC0+cGFkZHIgPQorCQkJKHZvaWQgKilnZXRfbDFfY29kZV9zdGFydF9jcHUoY3B1KSArIChfZXRleHRfbDEgLSBfc3RleHRfbDEpOworCQlwZXJfY3B1KGZyZWVfbDFfaW5zdF9zcmFtX2hlYWQsIGNwdSkubmV4dC0+c2l6ZSA9CisJCQlMMV9DT0RFX0xFTkdUSCAtIChfZXRleHRfbDEgLSBfc3RleHRfbDEpOworCQlwZXJfY3B1KGZyZWVfbDFfaW5zdF9zcmFtX2hlYWQsIGNwdSkubmV4dC0+cGlkID0gMDsKKwkJcGVyX2NwdShmcmVlX2wxX2luc3Rfc3JhbV9oZWFkLCBjcHUpLm5leHQtPm5leHQgPSBOVUxMOworCisJCXBlcl9jcHUodXNlZF9sMV9pbnN0X3NyYW1faGVhZCwgY3B1KS5uZXh0ID0gTlVMTDsKKworCQlwcmludGsoS0VSTl9JTkZPICJCbGFja2ZpbiBMMSBJbnN0cnVjdGlvbiBTUkFNOiAlZCBLQiAoJWQgS0IgZnJlZSlcbiIsCisJCQlMMV9DT0RFX0xFTkdUSCA+PiAxMCwKKwkJCXBlcl9jcHUoZnJlZV9sMV9pbnN0X3NyYW1faGVhZCwgY3B1KS5uZXh0LT5zaXplID4+IDEwKTsKKworCQkvKiBtdXRleCBpbml0aWFsaXplICovCisJCXNwaW5fbG9ja19pbml0KCZwZXJfY3B1KGwxX2luc3Rfc3JhbV9sb2NrLCBjcHUpKTsKIAl9Ci0KLQlmcmVlX2wxX2luc3Rfc3JhbV9oZWFkLm5leHQtPnBhZGRyID0KLQkJKHZvaWQgKilMMV9DT0RFX1NUQVJUICsgKF9ldGV4dF9sMSAtIF9zdGV4dF9sMSk7Ci0JZnJlZV9sMV9pbnN0X3NyYW1faGVhZC5uZXh0LT5zaXplID0KLQkJTDFfQ09ERV9MRU5HVEggLSAoX2V0ZXh0X2wxIC0gX3N0ZXh0X2wxKTsKLQlmcmVlX2wxX2luc3Rfc3JhbV9oZWFkLm5leHQtPnBpZCA9IDA7Ci0JZnJlZV9sMV9pbnN0X3NyYW1faGVhZC5uZXh0LT5uZXh0ID0gTlVMTDsKLQotCXVzZWRfbDFfaW5zdF9zcmFtX2hlYWQubmV4dCA9IE5VTEw7Ci0KLQlwcmludGsoS0VSTl9JTkZPICJCbGFja2ZpbiBMMSBJbnN0cnVjdGlvbiBTUkFNOiAlZCBLQiAoJWQgS0IgZnJlZSlcbiIsCi0JCUwxX0NPREVfTEVOR1RIID4+IDEwLAotCQlmcmVlX2wxX2luc3Rfc3JhbV9oZWFkLm5leHQtPnNpemUgPj4gMTApOwogI2VuZGlmCi0KLQkvKiBtdXRleCBpbml0aWFsaXplICovCi0Jc3Bpbl9sb2NrX2luaXQoJmwxX2luc3Rfc3JhbV9sb2NrKTsKIH0KIAogc3RhdGljIHZvaWQgX19pbml0IGwyX3NyYW1faW5pdCh2b2lkKQpAQCAtMTc5LDcgKzIwMSw3IEBACiAJZnJlZV9sMl9zcmFtX2hlYWQubmV4dCA9CiAJCWttZW1fY2FjaGVfYWxsb2Moc3JhbV9waWVjZV9jYWNoZSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFmcmVlX2wyX3NyYW1faGVhZC5uZXh0KSB7Ci0JCXByaW50ayhLRVJOX0lORk8gIkZhaWxlZCB0byBpbml0aWFsaXplIEwyIFNSQU1cbiIpOworCQlwcmludGsoS0VSTl9JTkZPICJGYWlsIHRvIGluaXRpYWxpemUgTDIgU1JBTS5cbiIpOwogCQlyZXR1cm47CiAJfQogCkBAIC0yMDAsNiArMjIyLDcgQEAKIAkvKiBtdXRleCBpbml0aWFsaXplICovCiAJc3Bpbl9sb2NrX2luaXQoJmwyX3NyYW1fbG9jayk7CiB9CisKIHZvaWQgX19pbml0IGJmaW5fc3JhbV9pbml0KHZvaWQpCiB7CiAJc3JhbV9waWVjZV9jYWNoZSA9IGttZW1fY2FjaGVfY3JlYXRlKCJzcmFtX3BpZWNlX2NhY2hlIiwKQEAgLTM1MywyMCArMzc2LDIwIEBACiB7CiAKICNpZiBMMV9DT0RFX0xFTkdUSCAhPSAwCi0JaWYgKGFkZHIgPj0gKHZvaWQgKilMMV9DT0RFX1NUQVJUCi0JCSAmJiBhZGRyIDwgKHZvaWQgKikoTDFfQ09ERV9TVEFSVCArIEwxX0NPREVfTEVOR1RIKSkKKwlpZiAoYWRkciA+PSAodm9pZCAqKWdldF9sMV9jb2RlX3N0YXJ0KCkKKwkJICYmIGFkZHIgPCAodm9pZCAqKShnZXRfbDFfY29kZV9zdGFydCgpICsgTDFfQ09ERV9MRU5HVEgpKQogCQlyZXR1cm4gbDFfaW5zdF9zcmFtX2ZyZWUoYWRkcik7CiAJZWxzZQogI2VuZGlmCiAjaWYgTDFfREFUQV9BX0xFTkdUSCAhPSAwCi0JaWYgKGFkZHIgPj0gKHZvaWQgKilMMV9EQVRBX0FfU1RBUlQKLQkJICYmIGFkZHIgPCAodm9pZCAqKShMMV9EQVRBX0FfU1RBUlQgKyBMMV9EQVRBX0FfTEVOR1RIKSkKKwlpZiAoYWRkciA+PSAodm9pZCAqKWdldF9sMV9kYXRhX2Ffc3RhcnQoKQorCQkgJiYgYWRkciA8ICh2b2lkICopKGdldF9sMV9kYXRhX2Ffc3RhcnQoKSArIEwxX0RBVEFfQV9MRU5HVEgpKQogCQlyZXR1cm4gbDFfZGF0YV9BX3NyYW1fZnJlZShhZGRyKTsKIAllbHNlCiAjZW5kaWYKICNpZiBMMV9EQVRBX0JfTEVOR1RIICE9IDAKLQlpZiAoYWRkciA+PSAodm9pZCAqKUwxX0RBVEFfQl9TVEFSVAotCQkgJiYgYWRkciA8ICh2b2lkICopKEwxX0RBVEFfQl9TVEFSVCArIEwxX0RBVEFfQl9MRU5HVEgpKQorCWlmIChhZGRyID49ICh2b2lkICopZ2V0X2wxX2RhdGFfYl9zdGFydCgpCisJCSAmJiBhZGRyIDwgKHZvaWQgKikoZ2V0X2wxX2RhdGFfYl9zdGFydCgpICsgTDFfREFUQV9CX0xFTkdUSCkpCiAJCXJldHVybiBsMV9kYXRhX0Jfc3JhbV9mcmVlKGFkZHIpOwogCWVsc2UKICNlbmRpZgpAQCAtMzg0LDE3ICs0MDcsMjAgQEAKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXZvaWQgKmFkZHIgPSBOVUxMOworCXVuc2lnbmVkIGludCBjcHU7CiAKKwljcHUgPSBnZXRfY3B1KCk7CiAJLyogYWRkIG11dGV4IG9wZXJhdGlvbiAqLwotCXNwaW5fbG9ja19pcnFzYXZlKCZsMV9kYXRhX3NyYW1fbG9jaywgZmxhZ3MpOworCXNwaW5fbG9ja19pcnFzYXZlKCZwZXJfY3B1KGwxX2RhdGFfc3JhbV9sb2NrLCBjcHUpLCBmbGFncyk7CiAKICNpZiBMMV9EQVRBX0FfTEVOR1RIICE9IDAKLQlhZGRyID0gX3NyYW1fYWxsb2Moc2l6ZSwgJmZyZWVfbDFfZGF0YV9BX3NyYW1faGVhZCwKLQkJCSZ1c2VkX2wxX2RhdGFfQV9zcmFtX2hlYWQpOworCWFkZHIgPSBfc3JhbV9hbGxvYyhzaXplLCAmcGVyX2NwdShmcmVlX2wxX2RhdGFfQV9zcmFtX2hlYWQsIGNwdSksCisJCQkmcGVyX2NwdSh1c2VkX2wxX2RhdGFfQV9zcmFtX2hlYWQsIGNwdSkpOwogI2VuZGlmCiAKIAkvKiBhZGQgbXV0ZXggb3BlcmF0aW9uICovCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbDFfZGF0YV9zcmFtX2xvY2ssIGZsYWdzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwZXJfY3B1KGwxX2RhdGFfc3JhbV9sb2NrLCBjcHUpLCBmbGFncyk7CisJcHV0X2NwdSgpOwogCiAJcHJfZGVidWcoIkFsbG9jYXRlZCBhZGRyZXNzIGluIGwxX2RhdGFfQV9zcmFtX2FsbG9jIGlzIDB4JWx4KzB4JWx4XG4iLAogCQkgKGxvbmcgdW5zaWduZWQgaW50KWFkZHIsIHNpemUpOwpAQCAtNDA3LDE5ICs0MzMsMjIgQEAKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCByZXQ7CisJdW5zaWduZWQgaW50IGNwdTsKIAorCWNwdSA9IGdldF9jcHUoKTsKIAkvKiBhZGQgbXV0ZXggb3BlcmF0aW9uICovCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmwxX2RhdGFfc3JhbV9sb2NrLCBmbGFncyk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnBlcl9jcHUobDFfZGF0YV9zcmFtX2xvY2ssIGNwdSksIGZsYWdzKTsKIAogI2lmIEwxX0RBVEFfQV9MRU5HVEggIT0gMAotCXJldCA9IF9zcmFtX2ZyZWUoYWRkciwgJmZyZWVfbDFfZGF0YV9BX3NyYW1faGVhZCwKLQkJCSZ1c2VkX2wxX2RhdGFfQV9zcmFtX2hlYWQpOworCXJldCA9IF9zcmFtX2ZyZWUoYWRkciwgJnBlcl9jcHUoZnJlZV9sMV9kYXRhX0Ffc3JhbV9oZWFkLCBjcHUpLAorCQkJJnBlcl9jcHUodXNlZF9sMV9kYXRhX0Ffc3JhbV9oZWFkLCBjcHUpKTsKICNlbHNlCiAJcmV0ID0gLTE7CiAjZW5kaWYKIAogCS8qIGFkZCBtdXRleCBvcGVyYXRpb24gKi8KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsMV9kYXRhX3NyYW1fbG9jaywgZmxhZ3MpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBlcl9jcHUobDFfZGF0YV9zcmFtX2xvY2ssIGNwdSksIGZsYWdzKTsKKwlwdXRfY3B1KCk7CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtNDMwLDE1ICs0NTksMTggQEAKICNpZiBMMV9EQVRBX0JfTEVOR1RIICE9IDAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXZvaWQgKmFkZHI7CisJdW5zaWduZWQgaW50IGNwdTsKKworCWNwdSA9IGdldF9jcHUoKTsKKwkvKiBhZGQgbXV0ZXggb3BlcmF0aW9uICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBlcl9jcHUobDFfZGF0YV9zcmFtX2xvY2ssIGNwdSksIGZsYWdzKTsKKworCWFkZHIgPSBfc3JhbV9hbGxvYyhzaXplLCAmcGVyX2NwdShmcmVlX2wxX2RhdGFfQl9zcmFtX2hlYWQsIGNwdSksCisJCQkmcGVyX2NwdSh1c2VkX2wxX2RhdGFfQl9zcmFtX2hlYWQsIGNwdSkpOwogCiAJLyogYWRkIG11dGV4IG9wZXJhdGlvbiAqLwotCXNwaW5fbG9ja19pcnFzYXZlKCZsMV9kYXRhX3NyYW1fbG9jaywgZmxhZ3MpOwotCi0JYWRkciA9IF9zcmFtX2FsbG9jKHNpemUsICZmcmVlX2wxX2RhdGFfQl9zcmFtX2hlYWQsCi0JCQkmdXNlZF9sMV9kYXRhX0Jfc3JhbV9oZWFkKTsKLQotCS8qIGFkZCBtdXRleCBvcGVyYXRpb24gKi8KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsMV9kYXRhX3NyYW1fbG9jaywgZmxhZ3MpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBlcl9jcHUobDFfZGF0YV9zcmFtX2xvY2ssIGNwdSksIGZsYWdzKTsKKwlwdXRfY3B1KCk7CiAKIAlwcl9kZWJ1ZygiQWxsb2NhdGVkIGFkZHJlc3MgaW4gbDFfZGF0YV9CX3NyYW1fYWxsb2MgaXMgMHglbHgrMHglbHhcbiIsCiAJCSAobG9uZyB1bnNpZ25lZCBpbnQpYWRkciwgc2l6ZSk7CkBAIC00NTUsMTUgKzQ4NywxOCBAQAogI2lmIEwxX0RBVEFfQl9MRU5HVEggIT0gMAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IHJldDsKKwl1bnNpZ25lZCBpbnQgY3B1OworCisJY3B1ID0gZ2V0X2NwdSgpOworCS8qIGFkZCBtdXRleCBvcGVyYXRpb24gKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmcGVyX2NwdShsMV9kYXRhX3NyYW1fbG9jaywgY3B1KSwgZmxhZ3MpOworCisJcmV0ID0gX3NyYW1fZnJlZShhZGRyLCAmcGVyX2NwdShmcmVlX2wxX2RhdGFfQl9zcmFtX2hlYWQsIGNwdSksCisJCQkmcGVyX2NwdSh1c2VkX2wxX2RhdGFfQl9zcmFtX2hlYWQsIGNwdSkpOwogCiAJLyogYWRkIG11dGV4IG9wZXJhdGlvbiAqLwotCXNwaW5fbG9ja19pcnFzYXZlKCZsMV9kYXRhX3NyYW1fbG9jaywgZmxhZ3MpOwotCi0JcmV0ID0gX3NyYW1fZnJlZShhZGRyLCAmZnJlZV9sMV9kYXRhX0Jfc3JhbV9oZWFkLAotCQkJJnVzZWRfbDFfZGF0YV9CX3NyYW1faGVhZCk7Ci0KLQkvKiBhZGQgbXV0ZXggb3BlcmF0aW9uICovCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbDFfZGF0YV9zcmFtX2xvY2ssIGZsYWdzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwZXJfY3B1KGwxX2RhdGFfc3JhbV9sb2NrLCBjcHUpLCBmbGFncyk7CisJcHV0X2NwdSgpOwogCiAJcmV0dXJuIHJldDsKICNlbHNlCkBAIC01MDksMTUgKzU0NCwxOCBAQAogI2lmIEwxX0NPREVfTEVOR1RIICE9IDAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXZvaWQgKmFkZHI7CisJdW5zaWduZWQgaW50IGNwdTsKKworCWNwdSA9IGdldF9jcHUoKTsKKwkvKiBhZGQgbXV0ZXggb3BlcmF0aW9uICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBlcl9jcHUobDFfaW5zdF9zcmFtX2xvY2ssIGNwdSksIGZsYWdzKTsKKworCWFkZHIgPSBfc3JhbV9hbGxvYyhzaXplLCAmcGVyX2NwdShmcmVlX2wxX2luc3Rfc3JhbV9oZWFkLCBjcHUpLAorCQkJJnBlcl9jcHUodXNlZF9sMV9pbnN0X3NyYW1faGVhZCwgY3B1KSk7CiAKIAkvKiBhZGQgbXV0ZXggb3BlcmF0aW9uICovCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmwxX2luc3Rfc3JhbV9sb2NrLCBmbGFncyk7Ci0KLQlhZGRyID0gX3NyYW1fYWxsb2Moc2l6ZSwgJmZyZWVfbDFfaW5zdF9zcmFtX2hlYWQsCi0JCQkmdXNlZF9sMV9pbnN0X3NyYW1faGVhZCk7Ci0KLQkvKiBhZGQgbXV0ZXggb3BlcmF0aW9uICovCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbDFfaW5zdF9zcmFtX2xvY2ssIGZsYWdzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwZXJfY3B1KGwxX2luc3Rfc3JhbV9sb2NrLCBjcHUpLCBmbGFncyk7CisJcHV0X2NwdSgpOwogCiAJcHJfZGVidWcoIkFsbG9jYXRlZCBhZGRyZXNzIGluIGwxX2luc3Rfc3JhbV9hbGxvYyBpcyAweCVseCsweCVseFxuIiwKIAkJIChsb25nIHVuc2lnbmVkIGludClhZGRyLCBzaXplKTsKQEAgLTUzNCwxNSArNTcyLDE4IEBACiAjaWYgTDFfQ09ERV9MRU5HVEggIT0gMAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IHJldDsKKwl1bnNpZ25lZCBpbnQgY3B1OworCisJY3B1ID0gZ2V0X2NwdSgpOworCS8qIGFkZCBtdXRleCBvcGVyYXRpb24gKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmcGVyX2NwdShsMV9pbnN0X3NyYW1fbG9jaywgY3B1KSwgZmxhZ3MpOworCisJcmV0ID0gX3NyYW1fZnJlZShhZGRyLCAmcGVyX2NwdShmcmVlX2wxX2luc3Rfc3JhbV9oZWFkLCBjcHUpLAorCQkJJnBlcl9jcHUodXNlZF9sMV9pbnN0X3NyYW1faGVhZCwgY3B1KSk7CiAKIAkvKiBhZGQgbXV0ZXggb3BlcmF0aW9uICovCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmwxX2luc3Rfc3JhbV9sb2NrLCBmbGFncyk7Ci0KLQlyZXQgPSBfc3JhbV9mcmVlKGFkZHIsICZmcmVlX2wxX2luc3Rfc3JhbV9oZWFkLAotCQkJJnVzZWRfbDFfaW5zdF9zcmFtX2hlYWQpOwotCi0JLyogYWRkIG11dGV4IG9wZXJhdGlvbiAqLwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmwxX2luc3Rfc3JhbV9sb2NrLCBmbGFncyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGVyX2NwdShsMV9pbnN0X3NyYW1fbG9jaywgY3B1KSwgZmxhZ3MpOworCXB1dF9jcHUoKTsKIAogCXJldHVybiByZXQ7CiAjZWxzZQpAQCAtNTU2LDE1ICs1OTcsMTggQEAKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXZvaWQgKmFkZHI7CisJdW5zaWduZWQgaW50IGNwdTsKKworCWNwdSA9IGdldF9jcHUoKTsKKwkvKiBhZGQgbXV0ZXggb3BlcmF0aW9uICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBlcl9jcHUobDFzcmFtX2xvY2ssIGNwdSksIGZsYWdzKTsKKworCWFkZHIgPSBfc3JhbV9hbGxvYyhzaXplLCAmcGVyX2NwdShmcmVlX2wxX3NzcmFtX2hlYWQsIGNwdSksCisJCQkmcGVyX2NwdSh1c2VkX2wxX3NzcmFtX2hlYWQsIGNwdSkpOwogCiAJLyogYWRkIG11dGV4IG9wZXJhdGlvbiAqLwotCXNwaW5fbG9ja19pcnFzYXZlKCZsMXNyYW1fbG9jaywgZmxhZ3MpOwotCi0JYWRkciA9IF9zcmFtX2FsbG9jKHNpemUsICZmcmVlX2wxX3NzcmFtX2hlYWQsCi0JCQkmdXNlZF9sMV9zc3JhbV9oZWFkKTsKLQotCS8qIGFkZCBtdXRleCBvcGVyYXRpb24gKi8KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsMXNyYW1fbG9jaywgZmxhZ3MpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBlcl9jcHUobDFzcmFtX2xvY2ssIGNwdSksIGZsYWdzKTsKKwlwdXRfY3B1KCk7CiAKIAlyZXR1cm4gYWRkcjsKIH0KQEAgLTU3NCwxNSArNjE4LDE4IEBACiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAl2b2lkICphZGRyOworCXVuc2lnbmVkIGludCBjcHU7CisKKwljcHUgPSBnZXRfY3B1KCk7CisJLyogYWRkIG11dGV4IG9wZXJhdGlvbiAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZwZXJfY3B1KGwxc3JhbV9sb2NrLCBjcHUpLCBmbGFncyk7CisKKwlhZGRyID0gX3NyYW1fYWxsb2NfbWF4KCZwZXJfY3B1KGZyZWVfbDFfc3NyYW1faGVhZCwgY3B1KSwKKwkJCSZwZXJfY3B1KHVzZWRfbDFfc3NyYW1faGVhZCwgY3B1KSwgcHNpemUpOwogCiAJLyogYWRkIG11dGV4IG9wZXJhdGlvbiAqLwotCXNwaW5fbG9ja19pcnFzYXZlKCZsMXNyYW1fbG9jaywgZmxhZ3MpOwotCi0JYWRkciA9IF9zcmFtX2FsbG9jX21heCgmZnJlZV9sMV9zc3JhbV9oZWFkLAotCQkJJnVzZWRfbDFfc3NyYW1faGVhZCwgcHNpemUpOwotCi0JLyogYWRkIG11dGV4IG9wZXJhdGlvbiAqLwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmwxc3JhbV9sb2NrLCBmbGFncyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGVyX2NwdShsMXNyYW1fbG9jaywgY3B1KSwgZmxhZ3MpOworCXB1dF9jcHUoKTsKIAogCXJldHVybiBhZGRyOwogfQpAQCAtNTkyLDE1ICs2MzksMTggQEAKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCByZXQ7CisJdW5zaWduZWQgaW50IGNwdTsKKworCWNwdSA9IGdldF9jcHUoKTsKKwkvKiBhZGQgbXV0ZXggb3BlcmF0aW9uICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBlcl9jcHUobDFzcmFtX2xvY2ssIGNwdSksIGZsYWdzKTsKKworCXJldCA9IF9zcmFtX2ZyZWUoYWRkciwgJnBlcl9jcHUoZnJlZV9sMV9zc3JhbV9oZWFkLCBjcHUpLAorCQkJJnBlcl9jcHUodXNlZF9sMV9zc3JhbV9oZWFkLCBjcHUpKTsKIAogCS8qIGFkZCBtdXRleCBvcGVyYXRpb24gKi8KLQlzcGluX2xvY2tfaXJxc2F2ZSgmbDFzcmFtX2xvY2ssIGZsYWdzKTsKLQotCXJldCA9IF9zcmFtX2ZyZWUoYWRkciwgJmZyZWVfbDFfc3NyYW1faGVhZCwKLQkJCSZ1c2VkX2wxX3NzcmFtX2hlYWQpOwotCi0JLyogYWRkIG11dGV4IG9wZXJhdGlvbiAqLwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmwxc3JhbV9sb2NrLCBmbGFncyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGVyX2NwdShsMXNyYW1fbG9jaywgY3B1KSwgZmxhZ3MpOworCXB1dF9jcHUoKTsKIAogCXJldHVybiByZXQ7CiB9CkBAIC03NjEsMzMgKzgxMSwzNiBAQAogCQlpbnQgKmVvZiwgdm9pZCAqZGF0YSkKIHsKIAlpbnQgbGVuID0gMDsKKwl1bnNpZ25lZCBpbnQgY3B1OwogCi0JaWYgKF9zcmFtX3Byb2NfcmVhZChidWYsICZsZW4sIGNvdW50LCAiU2NyYXRjaHBhZCIsCi0JCQkmZnJlZV9sMV9zc3JhbV9oZWFkLCAmdXNlZF9sMV9zc3JhbV9oZWFkKSkKLQkJZ290byBub3RfZG9uZTsKKwlmb3IgKGNwdSA9IDA7IGNwdSA8IG51bV9wb3NzaWJsZV9jcHVzKCk7ICsrY3B1KSB7CisJCWlmIChfc3JhbV9wcm9jX3JlYWQoYnVmLCAmbGVuLCBjb3VudCwgIlNjcmF0Y2hwYWQiLAorCQkJJnBlcl9jcHUoZnJlZV9sMV9zc3JhbV9oZWFkLCBjcHUpLCAmcGVyX2NwdSh1c2VkX2wxX3NzcmFtX2hlYWQsIGNwdSkpKQorCQkJZ290byBub3RfZG9uZTsKICNpZiBMMV9EQVRBX0FfTEVOR1RIICE9IDAKLQlpZiAoX3NyYW1fcHJvY19yZWFkKGJ1ZiwgJmxlbiwgY291bnQsICJMMSBEYXRhIEEiLAotCQkJJmZyZWVfbDFfZGF0YV9BX3NyYW1faGVhZCwKLQkJCSZ1c2VkX2wxX2RhdGFfQV9zcmFtX2hlYWQpKQotCQlnb3RvIG5vdF9kb25lOworCQlpZiAoX3NyYW1fcHJvY19yZWFkKGJ1ZiwgJmxlbiwgY291bnQsICJMMSBEYXRhIEEiLAorCQkJJnBlcl9jcHUoZnJlZV9sMV9kYXRhX0Ffc3JhbV9oZWFkLCBjcHUpLAorCQkJJnBlcl9jcHUodXNlZF9sMV9kYXRhX0Ffc3JhbV9oZWFkLCBjcHUpKSkKKwkJCWdvdG8gbm90X2RvbmU7CiAjZW5kaWYKICNpZiBMMV9EQVRBX0JfTEVOR1RIICE9IDAKLQlpZiAoX3NyYW1fcHJvY19yZWFkKGJ1ZiwgJmxlbiwgY291bnQsICJMMSBEYXRhIEIiLAotCQkJJmZyZWVfbDFfZGF0YV9CX3NyYW1faGVhZCwKLQkJCSZ1c2VkX2wxX2RhdGFfQl9zcmFtX2hlYWQpKQotCQlnb3RvIG5vdF9kb25lOworCQlpZiAoX3NyYW1fcHJvY19yZWFkKGJ1ZiwgJmxlbiwgY291bnQsICJMMSBEYXRhIEIiLAorCQkJJnBlcl9jcHUoZnJlZV9sMV9kYXRhX0Jfc3JhbV9oZWFkLCBjcHUpLAorCQkJJnBlcl9jcHUodXNlZF9sMV9kYXRhX0Jfc3JhbV9oZWFkLCBjcHUpKSkKKwkJCWdvdG8gbm90X2RvbmU7CiAjZW5kaWYKICNpZiBMMV9DT0RFX0xFTkdUSCAhPSAwCi0JaWYgKF9zcmFtX3Byb2NfcmVhZChidWYsICZsZW4sIGNvdW50LCAiTDEgSW5zdHJ1Y3Rpb24iLAotCQkJJmZyZWVfbDFfaW5zdF9zcmFtX2hlYWQsICZ1c2VkX2wxX2luc3Rfc3JhbV9oZWFkKSkKLQkJZ290byBub3RfZG9uZTsKKwkJaWYgKF9zcmFtX3Byb2NfcmVhZChidWYsICZsZW4sIGNvdW50LCAiTDEgSW5zdHJ1Y3Rpb24iLAorCQkJJnBlcl9jcHUoZnJlZV9sMV9pbnN0X3NyYW1faGVhZCwgY3B1KSwKKwkJCSZwZXJfY3B1KHVzZWRfbDFfaW5zdF9zcmFtX2hlYWQsIGNwdSkpKQorCQkJZ290byBub3RfZG9uZTsKICNlbmRpZgorCX0KICNpZiBMMl9MRU5HVEggIT0gMAotCWlmIChfc3JhbV9wcm9jX3JlYWQoYnVmLCAmbGVuLCBjb3VudCwgIkwyIiwKLQkJCSZmcmVlX2wyX3NyYW1faGVhZCwgJnVzZWRfbDJfc3JhbV9oZWFkKSkKKwlpZiAoX3NyYW1fcHJvY19yZWFkKGJ1ZiwgJmxlbiwgY291bnQsICJMMiIsICZmcmVlX2wyX3NyYW1faGVhZCwKKwkJJnVzZWRfbDJfc3JhbV9oZWFkKSkKIAkJZ290byBub3RfZG9uZTsKICNlbmRpZgotCiAJKmVvZiA9IDE7CiAgbm90X2RvbmU6CiAJcmV0dXJuIGxlbjsKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vb3Byb2ZpbGUvTWFrZWZpbGUgYi9hcmNoL2JsYWNrZmluL29wcm9maWxlL01ha2VmaWxlCmluZGV4IDYzNGUzMDAuLmM3MGFmM2EgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vb3Byb2ZpbGUvTWFrZWZpbGUKKysrIGIvYXJjaC9ibGFja2Zpbi9vcHJvZmlsZS9NYWtlZmlsZQpAQCAtMTAsNSArMTAsNCBAQAogCQlvcHJvZmlsZWZzLm8gb3Byb2ZpbGVfc3RhdHMubyBcCiAJCXRpbWVyX2ludC5vICkKIAotb3Byb2ZpbGUteSA6PSAkKERSSVZFUl9PQkpTKSBjb21tb24ubwotb3Byb2ZpbGUtJChDT05GSUdfSEFSRFdBUkVfUE0pICs9IG9wX21vZGVsX2JmNTMzLm8KK29wcm9maWxlLXkgOj0gJChEUklWRVJfT0JKUykgYmZpbl9vcHJvZmlsZS5vCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL29wcm9maWxlL2JmaW5fb3Byb2ZpbGUuYyBiL2FyY2gvYmxhY2tmaW4vb3Byb2ZpbGUvYmZpbl9vcHJvZmlsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzYjk3MTMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2JsYWNrZmluL29wcm9maWxlL2JmaW5fb3Byb2ZpbGUuYwpAQCAtMCwwICsxLDE4IEBACisvKgorICogYmZpbl9vcHJvZmlsZS5jIC0gQmxhY2tmaW4gb3Byb2ZpbGUgY29kZQorICoKKyAqIENvcHlyaWdodCAyMDA0LTIwMDggQW5hbG9nIERldmljZXMgSW5jLgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9vcHJvZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworaW50IF9faW5pdCBvcHJvZmlsZV9hcmNoX2luaXQoc3RydWN0IG9wcm9maWxlX29wZXJhdGlvbnMgKm9wcykKK3sKKwlyZXR1cm4gLTE7Cit9CisKK3ZvaWQgb3Byb2ZpbGVfYXJjaF9leGl0KHZvaWQpCit7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL29wcm9maWxlL2NvbW1vbi5jIGIvYXJjaC9ibGFja2Zpbi9vcHJvZmlsZS9jb21tb24uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGY2ZDMwMy4uMDAwMDAwMAotLS0gYS9hcmNoL2JsYWNrZmluL29wcm9maWxlL2NvbW1vbi5jCisrKyAvZGV2L251bGwKQEAgLTEsMTY4ICswLDAgQEAKLS8qCi0gKiBGaWxlOiAgICAgICAgIGFyY2gvYmxhY2tmaW4vb3Byb2ZpbGUvY29tbW9uLmMKLSAqIEJhc2VkIG9uOiAgICAgYXJjaC9hbHBoYS9vcHJvZmlsZS9jb21tb24uYwotICogQXV0aG9yOiAgICAgICBBbnRvbiBCbGFuY2hhcmQgPGFudG9uQGF1LmlibS5jb20+Ci0gKgotICogQ3JlYXRlZDoKLSAqIERlc2NyaXB0aW9uOgotICoKLSAqIE1vZGlmaWVkOgotICogICAgICAgICAgICAgICBDb3B5cmlnaHQgKEMpIDIwMDQgQW50b24gQmxhbmNoYXJkIDxhbnRvbkBhdS5pYm0uY29tPiwgSUJNCi0gKiAgICAgICAgICAgICAgIENvcHlyaWdodCAyMDA0LTIwMDYgQW5hbG9nIERldmljZXMgSW5jLgotICoKLSAqIEJ1Z3M6ICAgICAgICAgRW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCBzZWUgdGhlIGZpbGUgQ09QWUlORywgb3Igd3JpdGUKLSAqIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gKiA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotICovCi0KLSNpbmNsdWRlIDxsaW51eC9vcHJvZmlsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9zbXAuaD4KLSNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgotI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+Ci0jaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvaXJxLmg+Ci0jaW5jbHVkZSA8bGludXgvaW8uaD4KLQotI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KLSNpbmNsdWRlIDxhc20vYmxhY2tmaW4uaD4KLQotI2luY2x1ZGUgIm9wX2JsYWNrZmluLmgiCi0KLSNkZWZpbmUgQkZJTl81MzNfSUQgIDB4RTUwNDAwMDMKLSNkZWZpbmUgQkZJTl81MzdfSUQgIDB4RTUwNDAwMDIKLQotc3RhdGljIGludCBwZm1vbl9lbmFibGVkOwotc3RhdGljIHN0cnVjdCBtdXRleCBwZm1vbl9sb2NrOwotCi1zdHJ1Y3Qgb3BfYmZpbjUzM19tb2RlbCAqbW9kZWw7Ci0KLXN0cnVjdCBvcF9jb3VudGVyX2NvbmZpZyBjdHJbT1BfTUFYX0NPVU5URVJdOwotCi1zdGF0aWMgaW50IG9wX2JmaW5fc2V0dXAodm9pZCkKLXsKLQlpbnQgcmV0OwotCi0JLyogUHJlLWNvbXB1dGUgdGhlIHZhbHVlcyB0byBzdHVmZiBpbiB0aGUgaGFyZHdhcmUgcmVnaXN0ZXJzLiAgKi8KLQlzcGluX2xvY2soJm9wcm9maWxlZnNfbG9jayk7Ci0JcmV0ID0gbW9kZWwtPnJlZ19zZXR1cChjdHIpOwotCXNwaW5fdW5sb2NrKCZvcHJvZmlsZWZzX2xvY2spOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHZvaWQgb3BfYmZpbl9zaHV0ZG93bih2b2lkKQotewotI2lmIDAKLQkvKiB3aGF0IGlzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gc2h1dGRvd24gYW5kIHN0b3A/ICovCi0jZW5kaWYKLX0KLQotc3RhdGljIGludCBvcF9iZmluX3N0YXJ0KHZvaWQpCi17Ci0JaW50IHJldCA9IC1FQlVTWTsKLQotCXByaW50ayhLRVJOX0lORk8gIktTREJHOmluICVzXG4iLCBfX2Z1bmNfXyk7Ci0JbXV0ZXhfbG9jaygmcGZtb25fbG9jayk7Ci0JaWYgKCFwZm1vbl9lbmFibGVkKSB7Ci0JCXJldCA9IG1vZGVsLT5zdGFydChjdHIpOwotCQlwZm1vbl9lbmFibGVkID0gIXJldDsKLQl9Ci0JbXV0ZXhfdW5sb2NrKCZwZm1vbl9sb2NrKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyB2b2lkIG9wX2JmaW5fc3RvcCh2b2lkKQotewotCW11dGV4X2xvY2soJnBmbW9uX2xvY2spOwotCWlmIChwZm1vbl9lbmFibGVkKSB7Ci0JCW1vZGVsLT5zdG9wKCk7Ci0JCXBmbW9uX2VuYWJsZWQgPSAwOwotCX0KLQltdXRleF91bmxvY2soJnBmbW9uX2xvY2spOwotfQotCi1zdGF0aWMgaW50IG9wX2JmaW5fY3JlYXRlX2ZpbGVzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBkZW50cnkgKnJvb3QpCi17Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgbW9kZWwtPm51bV9jb3VudGVyczsgKytpKSB7Ci0JCXN0cnVjdCBkZW50cnkgKmRpcjsKLQkJY2hhciBidWZbM107Ci0JCXByaW50ayhLRVJOX0lORk8gIk9wcm9maWxlOiBjcmVhdGluZyBmaWxlcy4uLiBcbiIpOwotCi0JCXNucHJpbnRmKGJ1Ziwgc2l6ZW9mIGJ1ZiwgIiVkIiwgaSk7Ci0JCWRpciA9IG9wcm9maWxlZnNfbWtkaXIoc2IsIHJvb3QsIGJ1Zik7Ci0KLQkJb3Byb2ZpbGVmc19jcmVhdGVfdWxvbmcoc2IsIGRpciwgImVuYWJsZWQiLCAmY3RyW2ldLmVuYWJsZWQpOwotCQlvcHJvZmlsZWZzX2NyZWF0ZV91bG9uZyhzYiwgZGlyLCAiZXZlbnQiLCAmY3RyW2ldLmV2ZW50KTsKLQkJb3Byb2ZpbGVmc19jcmVhdGVfdWxvbmcoc2IsIGRpciwgImNvdW50IiwgJmN0cltpXS5jb3VudCk7Ci0JCS8qCi0JCSAqIFdlIGRvbnQgc3VwcG9ydCBwZXIgY291bnRlciB1c2VyL2tlcm5lbCBzZWxlY3Rpb24sIGJ1dAotCQkgKiB3ZSBsZWF2ZSB0aGUgZW50cmllcyBiZWNhdXNlIHVzZXJzcGFjZSBleHBlY3RzIHRoZW0KLQkJICovCi0JCW9wcm9maWxlZnNfY3JlYXRlX3Vsb25nKHNiLCBkaXIsICJrZXJuZWwiLCAmY3RyW2ldLmtlcm5lbCk7Ci0JCW9wcm9maWxlZnNfY3JlYXRlX3Vsb25nKHNiLCBkaXIsICJ1c2VyIiwgJmN0cltpXS51c2VyKTsKLQkJb3Byb2ZpbGVmc19jcmVhdGVfdWxvbmcoc2IsIGRpciwgInVuaXRfbWFzayIsCi0JCQkJCSZjdHJbaV0udW5pdF9tYXNrKTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLWludCBfX2luaXQgb3Byb2ZpbGVfYXJjaF9pbml0KHN0cnVjdCBvcHJvZmlsZV9vcGVyYXRpb25zICpvcHMpCi17Ci0jaWZkZWYgQ09ORklHX0hBUkRXQVJFX1BNCi0JdW5zaWduZWQgaW50IGRzcGlkOwotCi0JbXV0ZXhfaW5pdCgmcGZtb25fbG9jayk7Ci0KLQlkc3BpZCA9IGJmaW5fcmVhZF9EU1BJRCgpOwotCi0JcHJpbnRrKEtFUk5fSU5GTyAiT3Byb2ZpbGUgZ290IHRoZSBjcHUgaWQgaXMgMHgleC4gXG4iLCBkc3BpZCk7Ci0KLQlzd2l0Y2ggKGRzcGlkKSB7Ci0JY2FzZSBCRklOXzUzM19JRDoKLQkJbW9kZWwgPSAmb3BfbW9kZWxfYmZpbjUzMzsKLQkJbW9kZWwtPm51bV9jb3VudGVycyA9IDI7Ci0JCWJyZWFrOwotCWNhc2UgQkZJTl81MzdfSUQ6Ci0JCW1vZGVsID0gJm9wX21vZGVsX2JmaW41MzM7Ci0JCW1vZGVsLT5udW1fY291bnRlcnMgPSAyOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0KLQlvcHMtPmNwdV90eXBlID0gbW9kZWwtPm5hbWU7Ci0Jb3BzLT5jcmVhdGVfZmlsZXMgPSBvcF9iZmluX2NyZWF0ZV9maWxlczsKLQlvcHMtPnNldHVwID0gb3BfYmZpbl9zZXR1cDsKLQlvcHMtPnNodXRkb3duID0gb3BfYmZpbl9zaHV0ZG93bjsKLQlvcHMtPnN0YXJ0ID0gb3BfYmZpbl9zdGFydDsKLQlvcHMtPnN0b3AgPSBvcF9iZmluX3N0b3A7Ci0KLQlwcmludGsoS0VSTl9JTkZPICJvcHJvZmlsZTogdXNpbmcgJXMgcGVyZm9ybWFuY2UgbW9uaXRvcmluZy5cbiIsCi0JICAgICAgIG9wcy0+Y3B1X3R5cGUpOwotCi0JcmV0dXJuIDA7Ci0jZWxzZQotCXJldHVybiAtMTsKLSNlbmRpZgotfQotCi12b2lkIG9wcm9maWxlX2FyY2hfZXhpdCh2b2lkKQotewotfQpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9vcHJvZmlsZS9vcF9ibGFja2Zpbi5oIGIvYXJjaC9ibGFja2Zpbi9vcHJvZmlsZS9vcF9ibGFja2Zpbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNWRkMDhjLi4wMDAwMDAwCi0tLSBhL2FyY2gvYmxhY2tmaW4vb3Byb2ZpbGUvb3BfYmxhY2tmaW4uaAorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qCi0gKiBGaWxlOiAgICAgICAgIGFyY2gvYmxhY2tmaW4vb3Byb2ZpbGUvb3BfYmxhY2tmaW4uaAotICogQmFzZWQgb246Ci0gKiBBdXRob3I6ICAgICAgIEFudG9uIEJsYW5jaGFyZCA8YW50b25AYXUuaWJtLmNvbT4KLSAqCi0gKiBDcmVhdGVkOgotICogRGVzY3JpcHRpb246Ci0gKgotICogTW9kaWZpZWQ6Ci0gKiAgICAgICAgICAgICAgIENvcHlyaWdodCAoQykgMjAwNCBBbnRvbiBCbGFuY2hhcmQgPGFudG9uQGF1LmlibS5jb20+LCBJQk0KLSAqICAgICAgICAgICAgICAgQ29weXJpZ2h0IDIwMDQtMjAwNiBBbmFsb2cgRGV2aWNlcyBJbmMuCi0gKgotICogQnVnczogICAgICAgICBFbnRlciBidWdzIGF0IGh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZy8KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSB0aGUgZmlsZSBDT1BZSU5HLCBvciB3cml0ZQotICogdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAqIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0gKi8KLQotI2lmbmRlZiBPUF9CTEFDS0ZJTl9ICi0jZGVmaW5lIE9QX0JMQUNLRklOX0ggMQotCi0jZGVmaW5lIE9QX01BWF9DT1VOVEVSIDIKLQotI2luY2x1ZGUgPGFzbS9ibGFja2Zpbi5oPgotCi0vKiBQZXItY291bnRlciBjb25maWd1cmF0aW9uIGFzIHNldCB2aWEgb3Byb2ZpbGVmcy4gICovCi1zdHJ1Y3Qgb3BfY291bnRlcl9jb25maWcgewotCXVuc2lnbmVkIGxvbmcgdmFsaWQ7Ci0JdW5zaWduZWQgbG9uZyBlbmFibGVkOwotCXVuc2lnbmVkIGxvbmcgZXZlbnQ7Ci0JdW5zaWduZWQgbG9uZyBjb3VudDsKLQl1bnNpZ25lZCBsb25nIGtlcm5lbDsKLQl1bnNpZ25lZCBsb25nIHVzZXI7Ci0JdW5zaWduZWQgbG9uZyB1bml0X21hc2s7Ci19OwotCi0vKiBTeXN0ZW0td2lkZSBjb25maWd1cmF0aW9uIGFzIHNldCB2aWEgb3Byb2ZpbGVmcy4gICovCi1zdHJ1Y3Qgb3Bfc3lzdGVtX2NvbmZpZyB7Ci0JdW5zaWduZWQgbG9uZyBlbmFibGVfa2VybmVsOwotCXVuc2lnbmVkIGxvbmcgZW5hYmxlX3VzZXI7Ci19OwotCi0vKiBQZXItYXJjaCBjb25maWd1cmF0aW9uICovCi1zdHJ1Y3Qgb3BfYmZpbjUzM19tb2RlbCB7Ci0JaW50ICgqcmVnX3NldHVwKSAoc3RydWN0IG9wX2NvdW50ZXJfY29uZmlnICopOwotCWludCAoKnN0YXJ0KSAoc3RydWN0IG9wX2NvdW50ZXJfY29uZmlnICopOwotCXZvaWQgKCpzdG9wKSAodm9pZCk7Ci0JaW50IG51bV9jb3VudGVyczsKLQljaGFyICpuYW1lOwotfTsKLQotZXh0ZXJuIHN0cnVjdCBvcF9iZmluNTMzX21vZGVsIG9wX21vZGVsX2JmaW41MzM7Ci0KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGN0cl9yZWFkKHZvaWQpCi17Ci0JdW5zaWduZWQgaW50IHRtcDsKLQotCXRtcCA9IGJmaW5fcmVhZF9QRkNUTCgpOwotCUNTWU5DKCk7Ci0KLQlyZXR1cm4gdG1wOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgY3RyX3dyaXRlKHVuc2lnbmVkIGludCB2YWwpCi17Ci0JYmZpbl93cml0ZV9QRkNUTCh2YWwpOwotCUNTWU5DKCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBjb3VudF9yZWFkKHVuc2lnbmVkIGludCAqY291bnQpCi17Ci0JY291bnRbMF0gPSBiZmluX3JlYWRfUEZDTlRSMCgpOwotCWNvdW50WzFdID0gYmZpbl9yZWFkX1BGQ05UUjEoKTsKLQlDU1lOQygpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgY291bnRfd3JpdGUodW5zaWduZWQgaW50ICpjb3VudCkKLXsKLQliZmluX3dyaXRlX1BGQ05UUjAoY291bnRbMF0pOwotCWJmaW5fd3JpdGVfUEZDTlRSMShjb3VudFsxXSk7Ci0JQ1NZTkMoKTsKLX0KLQotZXh0ZXJuIGludCBwbV9vdmVyZmxvd19oYW5kbGVyKGludCBpcnEsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL29wcm9maWxlL29wX21vZGVsX2JmNTMzLmMgYi9hcmNoL2JsYWNrZmluL29wcm9maWxlL29wX21vZGVsX2JmNTMzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxYzY5OGIuLjAwMDAwMDAKLS0tIGEvYXJjaC9ibGFja2Zpbi9vcHJvZmlsZS9vcF9tb2RlbF9iZjUzMy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTYxICswLDAgQEAKLS8qCi0gKiBGaWxlOiAgICAgICAgIGFyY2gvYmxhY2tmaW4vb3Byb2ZpbGUvb3BfbW9kZWxfYmY1MzMuYwotICogQmFzZWQgb246Ci0gKiBBdXRob3I6ICAgICAgIEFudG9uIEJsYW5jaGFyZCA8YW50b25AYXUuaWJtLmNvbT4KLSAqCi0gKiBDcmVhdGVkOgotICogRGVzY3JpcHRpb246Ci0gKgotICogTW9kaWZpZWQ6Ci0gKiAgICAgICAgICAgICAgIENvcHlyaWdodCAoQykgMjAwNCBBbnRvbiBCbGFuY2hhcmQgPGFudG9uQGF1LmlibS5jb20+LCBJQk0KLSAqICAgICAgICAgICAgICAgQ29weXJpZ2h0IDIwMDQtMjAwNiBBbmFsb2cgRGV2aWNlcyBJbmMuCi0gKgotICogQnVnczogICAgICAgICBFbnRlciBidWdzIGF0IGh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZy8KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSB0aGUgZmlsZSBDT1BZSU5HLCBvciB3cml0ZQotICogdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAqIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L29wcm9maWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgotI2luY2x1ZGUgPGxpbnV4L2lycS5oPgotI2luY2x1ZGUgPGxpbnV4L2lvLmg+Ci0jaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgotI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KLSNpbmNsdWRlIDxhc20vYmxhY2tmaW4uaD4KLQotI2luY2x1ZGUgIm9wX2JsYWNrZmluLmgiCi0KLSNkZWZpbmUgUE1fRU5BQkxFIDB4MDE7Ci0jZGVmaW5lIFBNX0NUTDFfRU5BQkxFICAweDE4Ci0jZGVmaW5lIFBNX0NUTDBfRU5BQkxFICAweEMwMDAKLSNkZWZpbmUgQ09VTlRfRURHRV9PTkxZIDB4MzAwMDAwMAotCi1zdGF0aWMgaW50IG9wcm9maWxlX3J1bm5pbmc7Ci0KLXN0YXRpYyB1bnNpZ25lZCBjdXJyX3BmY3RsLCBjdXJyX2NvdW50WzJdOwotCi1zdGF0aWMgaW50IGJmaW41MzNfcmVnX3NldHVwKHN0cnVjdCBvcF9jb3VudGVyX2NvbmZpZyAqY3RyKQotewotCXVuc2lnbmVkIGludCBwZmN0bCA9IGN0cl9yZWFkKCk7Ci0JdW5zaWduZWQgaW50IGNvdW50WzJdOwotCi0JLyogc2V0IEJsYWNrZmluIHBlcmYgbW9uaXRvciByZWdzIHdpdGggY3RyICovCi0JaWYgKGN0clswXS5lbmFibGVkKSB7Ci0JCXBmY3RsIHw9IChQTV9DVEwwX0VOQUJMRSB8ICgoY2hhciljdHJbMF0uZXZlbnQgPDwgNSkpOwotCQljb3VudFswXSA9IDB4RkZGRkZGRkYgLSBjdHJbMF0uY291bnQ7Ci0JCWN1cnJfY291bnRbMF0gPSBjb3VudFswXTsKLQl9Ci0JaWYgKGN0clsxXS5lbmFibGVkKSB7Ci0JCXBmY3RsIHw9IChQTV9DVEwxX0VOQUJMRSB8ICgoY2hhciljdHJbMV0uZXZlbnQgPDwgMTYpKTsKLQkJY291bnRbMV0gPSAweEZGRkZGRkZGIC0gY3RyWzFdLmNvdW50OwotCQljdXJyX2NvdW50WzFdID0gY291bnRbMV07Ci0JfQotCi0JcHJfZGVidWcoImN0clswXS5lbmFibGVkPSVkLGN0clsxXS5lbmFibGVkPSVkLGN0clswXS5ldmVudDw8NT0weCV4LGN0clsxXS5ldmVudDw8MTY9MHgleFxuIiwgY3RyWzBdLmVuYWJsZWQsIGN0clsxXS5lbmFibGVkLCBjdHJbMF0uZXZlbnQgPDwgNSwgY3RyWzFdLmV2ZW50IDw8IDE2KTsKLQlwZmN0bCB8PSBDT1VOVF9FREdFX09OTFk7Ci0JY3Vycl9wZmN0bCA9IHBmY3RsOwotCi0JcHJfZGVidWcoIndyaXRlIDB4JXggdG8gcGZjdGxcbiIsIHBmY3RsKTsKLQljdHJfd3JpdGUocGZjdGwpOwotCWNvdW50X3dyaXRlKGNvdW50KTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGJmaW41MzNfc3RhcnQoc3RydWN0IG9wX2NvdW50ZXJfY29uZmlnICpjdHIpCi17Ci0JdW5zaWduZWQgaW50IHBmY3RsID0gY3RyX3JlYWQoKTsKLQotCXBmY3RsIHw9IFBNX0VOQUJMRTsKLQljdXJyX3BmY3RsID0gcGZjdGw7Ci0KLQljdHJfd3JpdGUocGZjdGwpOwotCi0Jb3Byb2ZpbGVfcnVubmluZyA9IDE7Ci0JcHJfZGVidWcoInN0YXJ0IG9wcm9maWxlIGNvdW50ZXIgXG4iKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBiZmluNTMzX3N0b3Aodm9pZCkKLXsKLQlpbnQgcGZjdGw7Ci0KLQlwZmN0bCA9IGN0cl9yZWFkKCk7Ci0JcGZjdGwgJj0gflBNX0VOQUJMRTsKLQkvKiBmcmVlemUgY291bnRlcnMgKi8KLQljdHJfd3JpdGUocGZjdGwpOwotCi0Jb3Byb2ZpbGVfcnVubmluZyA9IDA7Ci0JcHJfZGVidWcoInN0b3Agb3Byb2ZpbGUgY291bnRlciBcbiIpOwotfQotCi1zdGF0aWMgaW50IGdldF9rZXJuZWwodm9pZCkKLXsKLQlpbnQgaXBlbmQsIGlzX2tlcm5lbDsKLQotCWlwZW5kID0gYmZpbl9yZWFkX0lQRU5EKCk7Ci0KLQkvKiB0ZXN0IGJpdCAxNSAqLwotCWlzX2tlcm5lbCA9ICgoaXBlbmQgJiAweDgwMDApICE9IDApOwotCi0JcmV0dXJuIGlzX2tlcm5lbDsKLX0KLQotaW50IHBtX292ZXJmbG93X2hhbmRsZXIoaW50IGlycSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCi17Ci0JaW50IGlzX2tlcm5lbDsKLQlpbnQgaSwgY3B1OwotCXVuc2lnbmVkIGludCBwYywgcGZjdGw7Ci0JdW5zaWduZWQgaW50IGNvdW50WzJdOwotCi0JcHJfZGVidWcoImdldCBpbnRlcnJ1cHQgaW4gJXNcbiIsIF9fZnVuY19fKTsKLQlpZiAob3Byb2ZpbGVfcnVubmluZyA9PSAwKSB7Ci0JCXByX2RlYnVnKCJlcnJvcjogZW50ZXJpbmcgaW50ZXJydXB0IHdoZW4gb3Byb2ZpbGUgaXMgc3RvcHBlZC5cblxyIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlpc19rZXJuZWwgPSBnZXRfa2VybmVsKCk7Ci0JY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwotCXBjID0gcmVncy0+cGM7Ci0JcGZjdGwgPSBjdHJfcmVhZCgpOwotCi0JLyogcmVhZCB0aGUgdHdvIGV2ZW50IGNvdW50ZXIgcmVncyAqLwotCWNvdW50X3JlYWQoY291bnQpOwotCi0JLyogaWYgdGhlIGNvdW50ZXIgb3ZlcmZsb3dzLCBhZGQgc2FtcGxlIHRvIG9wcm9maWxlIGJ1ZmZlciAqLwotCWZvciAoaSA9IDA7IGkgPCAyOyArK2kpIHsKLQkJaWYgKG9wcm9maWxlX3J1bm5pbmcpIHsKLQkJCW9wcm9maWxlX2FkZF9zYW1wbGUocmVncywgaSk7Ci0JCX0KLQl9Ci0KLQkvKiByZXNldCB0aGUgcGVyZm1vbiBjb3VudGVyICovCi0JY3RyX3dyaXRlKGN1cnJfcGZjdGwpOwotCWNvdW50X3dyaXRlKGN1cnJfY291bnQpOwotCXJldHVybiAwOwotfQotCi1zdHJ1Y3Qgb3BfYmZpbjUzM19tb2RlbCBvcF9tb2RlbF9iZmluNTMzID0gewotCS5yZWdfc2V0dXAgPSBiZmluNTMzX3JlZ19zZXR1cCwKLQkuc3RhcnQgPSBiZmluNTMzX3N0YXJ0LAotCS5zdG9wID0gYmZpbjUzM19zdG9wLAotCS5udW1fY291bnRlcnMgPSAyLAotCS5uYW1lID0gImJsYWNrZmluL2JmNTMzIgotfTsKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vb3Byb2ZpbGUvdGltZXJfaW50LmMgYi9hcmNoL2JsYWNrZmluL29wcm9maWxlL3RpbWVyX2ludC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzZmODYwLi4wMDAwMDAwCi0tLSBhL2FyY2gvYmxhY2tmaW4vb3Byb2ZpbGUvdGltZXJfaW50LmMKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKgotICogRmlsZTogICAgICAgICBhcmNoL2JsYWNrZmluL29wcm9maWxlL3RpbWVyX2ludC5jCi0gKiBCYXNlZCBvbjoKLSAqIEF1dGhvcjogICAgICAgTWljaGFlbCBLYW5nCi0gKgotICogQ3JlYXRlZDoKLSAqIERlc2NyaXB0aW9uOgotICoKLSAqIE1vZGlmaWVkOgotICogICAgICAgICAgICAgICBDb3B5cmlnaHQgMjAwNC0yMDA2IEFuYWxvZyBEZXZpY2VzIEluYy4KLSAqCi0gKiBCdWdzOiAgICAgICAgIEVudGVyIGJ1Z3MgYXQgaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnLwotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIHRoZSBmaWxlIENPUFlJTkcsIG9yIHdyaXRlCi0gKiB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICogNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgotI2luY2x1ZGUgPGxpbnV4L2lycS5oPgotI2luY2x1ZGUgPGxpbnV4L29wcm9maWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+Ci0KLXN0YXRpYyB2b2lkIGVuYWJsZV9zeXNfdGltZXIwKCkKLXsKLX0KLXN0YXRpYyB2b2lkIGRpc2FibGVfc3lzX3RpbWVyMCgpCi17Ci19Ci0KLXN0YXRpYyBpcnFyZXR1cm5fdCBzeXNfdGltZXIwX2ludF9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRldl9pZCwKLQkJCQkJICBzdHJ1Y3QgcHRfcmVncyAqcmVncykKLXsKLQlvcHJvZmlsZV9hZGRfc2FtcGxlKHJlZ3MsIDApOwotCXJldHVybiBJUlFfSEFORExFRDsKLX0KLQotc3RhdGljIGludCBzeXNfdGltZXIwX3N0YXJ0KHZvaWQpCi17Ci0JZW5hYmxlX3N5c190aW1lcjAoKTsKLQlyZXR1cm4gcmVxdWVzdF9pcnEoSVZHMTEsIHN5c190aW1lcjBfaW50X2hhbmRsZXIsIDAsICJzeXNfdGltZXIwIiwgTlVMTCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHN5c190aW1lcjBfc3RvcCh2b2lkKQotewotCWRpc2FibGVfc3lzX3RpbWVyKCk7Ci19Ci0KLWludCBfX2luaXQgc3lzX3RpbWVyMF9pbml0KHN0cnVjdCBvcHJvZmlsZV9vcGVyYXRpb25zICpvcHMpCi17Ci0JZXh0ZXJuIGludCBubWlfYWN0aXZlOwotCi0JaWYgKG5taV9hY3RpdmUgPD0gMCkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQlvcHMtPnN0YXJ0ID0gdGltZXJfc3RhcnQ7Ci0Jb3BzLT5zdG9wID0gdGltZXJfc3RvcDsKLQlvcHMtPmNwdV90eXBlID0gInRpbWVyIjsKLQlwcmludGsoS0VSTl9JTkZPICJvcHJvZmlsZTogdXNpbmcgTk1JIHRpbWVyIGludGVycnVwdC5cbiIpOwotCXJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvYXJjaC9jcmlzL2FyY2gtdjEwL2tlcm5lbC9lbnRyeS5TIGIvYXJjaC9jcmlzL2FyY2gtdjEwL2tlcm5lbC9lbnRyeS5TCmluZGV4IGVkMTcxZDMuLjcyZjVjZDMgMTAwNjQ0Ci0tLSBhL2FyY2gvY3Jpcy9hcmNoLXYxMC9rZXJuZWwvZW50cnkuUworKysgYi9hcmNoL2NyaXMvYXJjaC12MTAva2VybmVsL2VudHJ5LlMKQEAgLTY5MSw3ICs2OTEsNyBAQAogCS5sb25nIHN5c191c2VsaWIKIAkubG9uZyBzeXNfc3dhcG9uCiAJLmxvbmcgc3lzX3JlYm9vdAotCS5sb25nIG9sZF9yZWFkZGlyCisJLmxvbmcgc3lzX29sZF9yZWFkZGlyCiAJLmxvbmcgb2xkX21tYXAJCS8qIDkwICovCiAJLmxvbmcgc3lzX211bm1hcAogCS5sb25nIHN5c190cnVuY2F0ZQpkaWZmIC0tZ2l0IGEvYXJjaC9jcmlzL2FyY2gtdjMyL2tlcm5lbC9lbnRyeS5TIGIvYXJjaC9jcmlzL2FyY2gtdjMyL2tlcm5lbC9lbnRyeS5TCmluZGV4IDdmNmY5M2UuLjVlNjc0YzggMTAwNjQ0Ci0tLSBhL2FyY2gvY3Jpcy9hcmNoLXYzMi9rZXJuZWwvZW50cnkuUworKysgYi9hcmNoL2NyaXMvYXJjaC12MzIva2VybmVsL2VudHJ5LlMKQEAgLTYxNCw3ICs2MTQsNyBAQAogCS5sb25nIHN5c191c2VsaWIKIAkubG9uZyBzeXNfc3dhcG9uCiAJLmxvbmcgc3lzX3JlYm9vdAotCS5sb25nIG9sZF9yZWFkZGlyCisJLmxvbmcgc3lzX29sZF9yZWFkZGlyCiAJLmxvbmcgb2xkX21tYXAJCS8qIDkwICovCiAJLmxvbmcgc3lzX211bm1hcAogCS5sb25nIHN5c190cnVuY2F0ZQpkaWZmIC0tZ2l0IGEvYXJjaC9jcmlzL2FyY2gtdjMyL2tlcm5lbC9zaWduYWwuYyBiL2FyY2gvY3Jpcy9hcmNoLXYzMi9rZXJuZWwvc2lnbmFsLmMKaW5kZXggZGE3ZDJiZS4uMzcyZDBjYSAxMDA2NDQKLS0tIGEvYXJjaC9jcmlzL2FyY2gtdjMyL2tlcm5lbC9zaWduYWwuYworKysgYi9hcmNoL2NyaXMvYXJjaC12MzIva2VybmVsL3NpZ25hbC5jCkBAIC00NTYsNyArNDU2LDcgQEAKIAlyZXR1cm4gLUVGQVVMVDsKIH0KIAotLyogSW52b2tlIGEgc2luZ2FsIGhhbmRsZXIgdG8sIHdlbGwsIGhhbmRsZSB0aGUgc2lnbmFsLiAqLworLyogSW52b2tlIGEgc2lnbmFsIGhhbmRsZXIgdG8sIHdlbGwsIGhhbmRsZSB0aGUgc2lnbmFsLiAqLwogc3RhdGljIGlubGluZSBpbnQKIGhhbmRsZV9zaWduYWwoaW50IGNhbnJlc3RhcnQsIHVuc2lnbmVkIGxvbmcgc2lnLAogCSAgICAgIHNpZ2luZm9fdCAqaW5mbywgc3RydWN0IGtfc2lnYWN0aW9uICprYSwKZGlmZiAtLWdpdCBhL2FyY2gvY3Jpcy9pbmNsdWRlL2FyY2gtdjEwL2FyY2gvYnl0ZW9yZGVyLmggYi9hcmNoL2NyaXMvaW5jbHVkZS9hcmNoLXYxMC9hcmNoL2J5dGVvcmRlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTViNjQ2Li4wMDAwMDAwCi0tLSBhL2FyY2gvY3Jpcy9pbmNsdWRlL2FyY2gtdjEwL2FyY2gvYnl0ZW9yZGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0jaWZuZGVmIF9DUklTX0FSQ0hfQllURU9SREVSX0gKLSNkZWZpbmUgX0NSSVNfQVJDSF9CWVRFT1JERVJfSAotCi0jaW5jbHVkZSA8YXNtL3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KLQotLyogd2UganVzdCBkZWZpbmUgdGhlc2UgdHdvIChhcyB3ZSBjYW4gZG8gdGhlIHN3YXAgaW4gYSBzaW5nbGUKLSAqIGFzbSBpbnN0cnVjdGlvbiBpbiBDUklTKSBhbmQgdGhlIGFyY2gtaW5kZXBlbmRlbnQgZmlsZXMgd2lsbCBwdXQKLSAqIHRoZW0gdG9nZXRoZXIgaW50byBudG9obCBldGMuCi0gKi8KLQotc3RhdGljIGlubGluZSBfX2F0dHJpYnV0ZV9jb25zdF9fIF9fdTMyIF9fX2FyY2hfX3N3YWIzMihfX3UzMiB4KQotewotCV9fYXNtX18gKCJzd2Fwd2IgJTAiIDogIj1yIiAoeCkgOiAiMCIgKHgpKTsKLSAgCi0JcmV0dXJuKHgpOwotfQotCi1zdGF0aWMgaW5saW5lIF9fYXR0cmlidXRlX2NvbnN0X18gX191MTYgX19fYXJjaF9fc3dhYjE2KF9fdTE2IHgpCi17Ci0JX19hc21fXyAoInN3YXBiICUwIiA6ICI9ciIgKHgpIDogIjAiICh4KSk7Ci0JCi0JcmV0dXJuKHgpOwotfQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvY3Jpcy9pbmNsdWRlL2FyY2gtdjEwL2FyY2gvc3dhYi5oIGIvYXJjaC9jcmlzL2luY2x1ZGUvYXJjaC12MTAvYXJjaC9zd2FiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTRlODQ3ZAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvY3Jpcy9pbmNsdWRlL2FyY2gtdjEwL2FyY2gvc3dhYi5oCkBAIC0wLDAgKzEsMzAgQEAKKyNpZm5kZWYgX0NSSVNfQVJDSF9TV0FCX0gKKyNkZWZpbmUgX0NSSVNfQVJDSF9TV0FCX0gKKworI2luY2x1ZGUgPGFzbS90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CisKKyNkZWZpbmUgX19TV0FCXzY0X1RIUlVfMzJfXworCisvKiB3ZSBqdXN0IGRlZmluZSB0aGVzZSB0d28gKGFzIHdlIGNhbiBkbyB0aGUgc3dhcCBpbiBhIHNpbmdsZQorICogYXNtIGluc3RydWN0aW9uIGluIENSSVMpIGFuZCB0aGUgYXJjaC1pbmRlcGVuZGVudCBmaWxlcyB3aWxsIHB1dAorICogdGhlbSB0b2dldGhlciBpbnRvIG50b2hsIGV0Yy4KKyAqLworCitzdGF0aWMgaW5saW5lIF9fYXR0cmlidXRlX2NvbnN0X18gX191MzIgX19hcmNoX3N3YWIzMihfX3UzMiB4KQoreworCV9fYXNtX18gKCJzd2Fwd2IgJTAiIDogIj1yIiAoeCkgOiAiMCIgKHgpKTsKKworCXJldHVybih4KTsKK30KKyNkZWZpbmUgX19hcmNoX3N3YWIzMiBfX2FyY2hfc3dhYjMyCisKK3N0YXRpYyBpbmxpbmUgX19hdHRyaWJ1dGVfY29uc3RfXyBfX3UxNiBfX2FyY2hfc3dhYjE2KF9fdTE2IHgpCit7CisJX19hc21fXyAoInN3YXBiICUwIiA6ICI9ciIgKHgpIDogIjAiICh4KSk7CisKKwlyZXR1cm4oeCk7Cit9CisjZGVmaW5lIF9fYXJjaF9zd2FiMTYgX19hcmNoX3N3YWIxNgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvY3Jpcy9pbmNsdWRlL2FyY2gtdjMyL2FyY2gvYnl0ZW9yZGVyLmggYi9hcmNoL2NyaXMvaW5jbHVkZS9hcmNoLXYzMi9hcmNoL2J5dGVvcmRlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZWY4ZmI0Li4wMDAwMDAwCi0tLSBhL2FyY2gvY3Jpcy9pbmNsdWRlL2FyY2gtdjMyL2FyY2gvYnl0ZW9yZGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0jaWZuZGVmIF9BU01fQ1JJU19BUkNIX0JZVEVPUkRFUl9ICi0jZGVmaW5lIF9BU01fQ1JJU19BUkNIX0JZVEVPUkRFUl9ICi0KLSNpbmNsdWRlIDxhc20vdHlwZXMuaD4KLQotc3RhdGljIGlubGluZSBfX2NvbnN0X18gX191MzIKLV9fX2FyY2hfX3N3YWIzMihfX3UzMiB4KQotewotCV9fYXNtX18gX192b2xhdGlsZV9fICgic3dhcHdiICUwIiA6ICI9ciIgKHgpIDogIjAiICh4KSk7Ci0JcmV0dXJuICh4KTsKLX0KLQotc3RhdGljIGlubGluZSBfX2NvbnN0X18gX191MTYKLV9fX2FyY2hfX3N3YWIxNihfX3UxNiB4KQotewotCV9fYXNtX18gX192b2xhdGlsZV9fICgic3dhcGIgJTAiIDogIj1yIiAoeCkgOiAiMCIgKHgpKTsKLQlyZXR1cm4gKHgpOwotfQotCi0jZW5kaWYgLyogX0FTTV9DUklTX0FSQ0hfQllURU9SREVSX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvY3Jpcy9pbmNsdWRlL2FyY2gtdjMyL2FyY2gvc3dhYi5oIGIvYXJjaC9jcmlzL2luY2x1ZGUvYXJjaC12MzIvYXJjaC9zd2FiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWE0ZWE1ZQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvY3Jpcy9pbmNsdWRlL2FyY2gtdjMyL2FyY2gvc3dhYi5oCkBAIC0wLDAgKzEsMjQgQEAKKyNpZm5kZWYgX0FTTV9DUklTX0FSQ0hfU1dBQl9ICisjZGVmaW5lIF9BU01fQ1JJU19BUkNIX1NXQUJfSAorCisjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CisKKyNkZWZpbmUgX19TV0FCXzY0X1RIUlVfMzJfXworCitzdGF0aWMgaW5saW5lIF9fY29uc3RfXyBfX3UzMgorX19hcmNoX3N3YWIzMihfX3UzMiB4KQoreworCV9fYXNtX18gX192b2xhdGlsZV9fICgic3dhcHdiICUwIiA6ICI9ciIgKHgpIDogIjAiICh4KSk7CisJcmV0dXJuICh4KTsKK30KKyNkZWZpbmUgX19hcmNoX3N3YWIzMiBfX2FyY2hfc3dhYjMyCisKK3N0YXRpYyBpbmxpbmUgX19jb25zdF9fIF9fdTE2CitfX2FyY2hfc3dhYjE2KF9fdTE2IHgpCit7CisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJzd2FwYiAlMCIgOiAiPXIiICh4KSA6ICIwIiAoeCkpOworCXJldHVybiAoeCk7Cit9CisjZGVmaW5lIF9fYXJjaF9zd2FiMTYgX19hcmNoX3N3YWIxNgorCisjZW5kaWYgLyogX0FTTV9DUklTX0FSQ0hfU1dBQl9IICovCmRpZmYgLS1naXQgYS9hcmNoL2NyaXMvaW5jbHVkZS9hc20vYnl0ZW9yZGVyLmggYi9hcmNoL2NyaXMvaW5jbHVkZS9hc20vYnl0ZW9yZGVyLmgKaW5kZXggY2M4ZTQxOC4uYmNkMTg5NyAxMDA2NDQKLS0tIGEvYXJjaC9jcmlzL2luY2x1ZGUvYXNtL2J5dGVvcmRlci5oCisrKyBiL2FyY2gvY3Jpcy9pbmNsdWRlL2FzbS9ieXRlb3JkZXIuaApAQCAtMSwyNSArMSw2IEBACiAjaWZuZGVmIF9DUklTX0JZVEVPUkRFUl9ICiAjZGVmaW5lIF9DUklTX0JZVEVPUkRFUl9ICiAKLSNpZmRlZiBfX0dOVUNfXwotCi0jaWZkZWYgX19LRVJORUxfXwotI2luY2x1ZGUgPGFyY2gvYnl0ZW9yZGVyLmg+Ci0KLS8qIGRlZmluZXMgYXJlIG5lY2Vzc2FyeSBiZWNhdXNlIHRoZSBvdGhlciBmaWxlcyBkZXRlY3QgdGhlIHByZXNlbmNlCi0gKiBvZiBhIGRlZmluZWQgX19hcmNoX3N3YWIzMiwgbm90IGFuIGlubGluZQotICovCi0jZGVmaW5lIF9fYXJjaF9fc3dhYjMyKHgpIF9fX2FyY2hfX3N3YWIzMih4KQotI2RlZmluZSBfX2FyY2hfX3N3YWIxNih4KSBfX19hcmNoX19zd2FiMTYoeCkKLSNlbmRpZiAvKiBfX0tFUk5FTF9fICovCi0KLSNpZiAhZGVmaW5lZChfX1NUUklDVF9BTlNJX18pIHx8IGRlZmluZWQoX19LRVJORUxfXykKLSMgIGRlZmluZSBfX0JZVEVPUkRFUl9IQVNfVTY0X18KLSMgIGRlZmluZSBfX1NXQUJfNjRfVEhSVV8zMl9fCi0jZW5kaWYKLQotI2VuZGlmIC8qIF9fR05VQ19fICovCi0KICNpbmNsdWRlIDxsaW51eC9ieXRlb3JkZXIvbGl0dGxlX2VuZGlhbi5oPgogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvY3Jpcy9pbmNsdWRlL2FzbS9zd2FiLmggYi9hcmNoL2NyaXMvaW5jbHVkZS9hc20vc3dhYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwNjY4ZTgKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2NyaXMvaW5jbHVkZS9hc20vc3dhYi5oCkBAIC0wLDAgKzEsOCBAQAorI2lmbmRlZiBfQ1JJU19TV0FCX0gKKyNkZWZpbmUgX0NSSVNfU1dBQl9ICisKKyNpZmRlZiBfX0tFUk5FTF9fCisjaW5jbHVkZSA8YXJjaC9zd2FiLmg+CisjZW5kaWYgLyogX19LRVJORUxfXyAqLworCisjZW5kaWYgLyogX0NSSVNfU1dBQl9IICovCmRpZmYgLS1naXQgYS9hcmNoL2Zydi9rZXJuZWwvcHRyYWNlLmMgYi9hcmNoL2Zydi9rZXJuZWwvcHRyYWNlLmMKaW5kZXggNzA5ZTliZC4uNWU3ZDQwMSAxMDA2NDQKLS0tIGEvYXJjaC9mcnYva2VybmVsL3B0cmFjZS5jCisrKyBiL2FyY2gvZnJ2L2tlcm5lbC9wdHJhY2UuYwpAQCAtNjksNyArNjksOCBAQAogfQogCiAvKgotICogY2hlY2sgdGhhdCBhbiBhZGRyZXNzIGZhbGxzIHdpdGhpbiB0aGUgYm91bmRzIG9mIHRoZSB0YXJnZXQgcHJvY2VzcydzIG1lbW9yeSBtYXBwaW5ncworICogY2hlY2sgdGhhdCBhbiBhZGRyZXNzIGZhbGxzIHdpdGhpbiB0aGUgYm91bmRzIG9mIHRoZSB0YXJnZXQgcHJvY2VzcydzIG1lbW9yeQorICogbWFwcGluZ3MKICAqLwogc3RhdGljIGlubGluZSBpbnQgaXNfdXNlcl9hZGRyX3ZhbGlkKHN0cnVjdCB0YXNrX3N0cnVjdCAqY2hpbGQsCiAJCQkJICAgICB1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGxlbikKQEAgLTc5LDExICs4MCwxMSBAQAogCQlyZXR1cm4gLUVJTzsKIAlyZXR1cm4gMDsKICNlbHNlCi0Jc3RydWN0IHZtX2xpc3Rfc3RydWN0ICp2bWw7CisJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWE7CiAKLQlmb3IgKHZtbCA9IGNoaWxkLT5tbS0+Y29udGV4dC52bWxpc3Q7IHZtbDsgdm1sID0gdm1sLT5uZXh0KQotCQlpZiAoc3RhcnQgPj0gdm1sLT52bWEtPnZtX3N0YXJ0ICYmIHN0YXJ0ICsgbGVuIDw9IHZtbC0+dm1hLT52bV9lbmQpCi0JCQlyZXR1cm4gMDsKKwl2bWEgPSBmaW5kX3ZtYShjaGlsZC0+bW0sIHN0YXJ0KTsKKwlpZiAodm1hICYmIHN0YXJ0ID49IHZtYS0+dm1fc3RhcnQgJiYgc3RhcnQgKyBsZW4gPD0gdm1hLT52bV9lbmQpCisJCXJldHVybiAwOwogCiAJcmV0dXJuIC1FSU87CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvaDgzMDAvaW5jbHVkZS9hc20vS2J1aWxkIGIvYXJjaC9oODMwMC9pbmNsdWRlL2FzbS9LYnVpbGQKaW5kZXggMjdiMTA4YS4uYzY4ZTE2OCAxMDA2NDQKLS0tIGEvYXJjaC9oODMwMC9pbmNsdWRlL2FzbS9LYnVpbGQKKysrIGIvYXJjaC9oODMwMC9pbmNsdWRlL2FzbS9LYnVpbGQKQEAgLTEsMiArMSBAQAogaW5jbHVkZSBpbmNsdWRlL2FzbS1nZW5lcmljL0tidWlsZC5hc20KLXVuaWZkZWYteSArPSBzd2FiLmgKZGlmZiAtLWdpdCBhL2FyY2gvaDgzMDAvaW5jbHVkZS9hc20vYnl0ZW9yZGVyLmggYi9hcmNoL2g4MzAwL2luY2x1ZGUvYXNtL2J5dGVvcmRlci5oCmluZGV4IGMzNmI4MGEuLjEzNTM5ZGEgMTAwNjQ0Ci0tLSBhL2FyY2gvaDgzMDAvaW5jbHVkZS9hc20vYnl0ZW9yZGVyLmgKKysrIGIvYXJjaC9oODMwMC9pbmNsdWRlL2FzbS9ieXRlb3JkZXIuaApAQCAtMSw3ICsxLDYgQEAKICNpZm5kZWYgX0g4MzAwX0JZVEVPUkRFUl9ICiAjZGVmaW5lIF9IODMwMF9CWVRFT1JERVJfSAogCi0jaW5jbHVkZSA8YXNtL3N3YWIuaD4KICNpbmNsdWRlIDxsaW51eC9ieXRlb3JkZXIvYmlnX2VuZGlhbi5oPgogCiAjZW5kaWYgLyogX0g4MzAwX0JZVEVPUkRFUl9IICovCmRpZmYgLS1naXQgYS9hcmNoL2g4MzAwL2luY2x1ZGUvYXNtL21tdS5oIGIvYXJjaC9oODMwMC9pbmNsdWRlL2FzbS9tbXUuaAppbmRleCAyY2UwNmVhLi4zMTMwOTk2IDEwMDY0NAotLS0gYS9hcmNoL2g4MzAwL2luY2x1ZGUvYXNtL21tdS5oCisrKyBiL2FyY2gvaDgzMDAvaW5jbHVkZS9hc20vbW11LmgKQEAgLTQsNyArNCw2IEBACiAvKiBDb3B5cmlnaHQgKEMpIDIwMDIsIERhdmlkIE1jQ3VsbG91Z2ggPGRhdmlkbUBzbmFwZ2Vhci5jb20+ICovCiAKIHR5cGVkZWYgc3RydWN0IHsKLQlzdHJ1Y3Qgdm1fbGlzdF9zdHJ1Y3QJKnZtbGlzdDsKIAl1bnNpZ25lZCBsb25nCQllbmRfYnJrOwogfSBtbV9jb250ZXh0X3Q7CiAKZGlmZiAtLWdpdCBhL2FyY2gvaDgzMDAva2VybmVsL3N5c2NhbGxzLlMgYi9hcmNoL2g4MzAwL2tlcm5lbC9zeXNjYWxscy5TCmluZGV4IDU0ZTIxYzMuLjRlYjY3ZmEgMTAwNjQ0Ci0tLSBhL2FyY2gvaDgzMDAva2VybmVsL3N5c2NhbGxzLlMKKysrIGIvYXJjaC9oODMwMC9rZXJuZWwvc3lzY2FsbHMuUwpAQCAtMTAzLDcgKzEwMyw3IEBACiAJLmxvbmcgU1lNQk9MX05BTUUoc3lzX3VzZWxpYikKIAkubG9uZyBTWU1CT0xfTkFNRShzeXNfc3dhcG9uKQogCS5sb25nIFNZTUJPTF9OQU1FKHN5c19yZWJvb3QpCi0JLmxvbmcgU1lNQk9MX05BTUUob2xkX3JlYWRkaXIpCisJLmxvbmcgU1lNQk9MX05BTUUoc3lzX29sZF9yZWFkZGlyKQogCS5sb25nIFNZTUJPTF9OQU1FKG9sZF9tbWFwKQkJLyogOTAgKi8KIAkubG9uZyBTWU1CT0xfTkFNRShzeXNfbXVubWFwKQogCS5sb25nIFNZTUJPTF9OQU1FKHN5c190cnVuY2F0ZSkKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9LY29uZmlnIGIvYXJjaC9pYTY0L0tjb25maWcKaW5kZXggM2QzMTYzNi4uNjE4M2FlYyAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L0tjb25maWcKKysrIGIvYXJjaC9pYTY0L0tjb25maWcKQEAgLTE3LDYgKzE3LDcgQEAKIAlzZWxlY3QgQUNQSSBpZiAoIUlBNjRfSFBfU0lNKQogCXNlbGVjdCBQTSBpZiAoIUlBNjRfSFBfU0lNKQogCXNlbGVjdCBBUkNIX1NVUFBPUlRTX01TSQorCXNlbGVjdCBIQVZFX1VOU1RBQkxFX1NDSEVEX0NMT0NLCiAJc2VsZWN0IEhBVkVfSURFCiAJc2VsZWN0IEhBVkVfT1BST0ZJTEUKIAlzZWxlY3QgSEFWRV9LUFJPQkVTCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvY29uZmlncy9nZW5lcmljX2RlZmNvbmZpZyBiL2FyY2gvaWE2NC9jb25maWdzL2dlbmVyaWNfZGVmY29uZmlnCmluZGV4IDI3ZWI2NzYuLmExMDlkYjMgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9jb25maWdzL2dlbmVyaWNfZGVmY29uZmlnCisrKyBiL2FyY2gvaWE2NC9jb25maWdzL2dlbmVyaWNfZGVmY29uZmlnCkBAIC01NzgsNyArNTc4LDcgQEAKICMgQ09ORklHX1NBVEFfU0lTIGlzIG5vdCBzZXQKICMgQ09ORklHX1NBVEFfVUxJIGlzIG5vdCBzZXQKICMgQ09ORklHX1NBVEFfVklBIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NBVEFfVklURVNTRSBpcyBub3Qgc2V0CitDT05GSUdfU0FUQV9WSVRFU1NFPXkKICMgQ09ORklHX1NBVEFfSU5JQzE2MlggaXMgbm90IHNldAogIyBDT05GSUdfUEFUQV9BQ1BJIGlzIG5vdCBzZXQKICMgQ09ORklHX1BBVEFfQUxJIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9pYTMyL2lhMzJfZW50cnkuUyBiL2FyY2gvaWE2NC9pYTMyL2lhMzJfZW50cnkuUwppbmRleCBhOGNmMTk5Li5hNDZmODM5IDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvaWEzMi9pYTMyX2VudHJ5LlMKKysrIGIvYXJjaC9pYTY0L2lhMzIvaWEzMl9lbnRyeS5TCkBAIC0yMjAsNyArMjIwLDcgQEAKIAlkYXRhOCBzeXNfbWtkaXIKIAlkYXRhOCBzeXNfcm1kaXIJCSAgLyogNDAgKi8KIAlkYXRhOCBzeXNfZHVwCi0JZGF0YTggc3lzX3BpcGUKKwlkYXRhOCBzeXNfaWE2NF9waXBlCiAJZGF0YTggY29tcGF0X3N5c190aW1lcwogCWRhdGE4IHN5c19uaV9zeXNjYWxsCSAgLyogb2xkIHByb2Ygc3lzY2FsbCBob2xkZXIgKi8KIAlkYXRhOCBzeXMzMl9icmsJCSAgLyogNDUgKi8KZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9pbmNsdWRlL2FzbS9LYnVpbGQgYi9hcmNoL2lhNjQvaW5jbHVkZS9hc20vS2J1aWxkCmluZGV4IDNiMjViZDkuLmNjYmU4YWUgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9pbmNsdWRlL2FzbS9LYnVpbGQKKysrIGIvYXJjaC9pYTY0L2luY2x1ZGUvYXNtL0tidWlsZApAQCAtMTQsNCArMTQsMyBAQAogdW5pZmRlZi15ICs9IGludHJpbnNpY3MuaAogdW5pZmRlZi15ICs9IHBlcmZtb24uaAogdW5pZmRlZi15ICs9IHVzdGFjay5oCi11bmlmZGVmLXkgKz0gc3dhYi5oCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvaW5jbHVkZS9hc20vYWNwaS1leHQuaCBiL2FyY2gvaWE2NC9pbmNsdWRlL2FzbS9hY3BpLWV4dC5oCmluZGV4IDczNGQxMzcuLjdmODM2MmIgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9pbmNsdWRlL2FzbS9hY3BpLWV4dC5oCisrKyBiL2FyY2gvaWE2NC9pbmNsdWRlL2FzbS9hY3BpLWV4dC5oCkBAIC0xNCw3ICsxNCw2IEBACiAjZGVmaW5lIF9BU01fSUE2NF9BQ1BJX0VYVF9ICiAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGFjcGkvYWN0eXBlcy5oPgogCiBleHRlcm4gYWNwaV9zdGF0dXMgaHBfYWNwaV9jc3Jfc3BhY2UgKGFjcGlfaGFuZGxlLCB1NjQgKmJhc2UsIHU2NCAqbGVuZ3RoKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2luY2x1ZGUvYXNtL2J5dGVvcmRlci5oIGIvYXJjaC9pYTY0L2luY2x1ZGUvYXNtL2J5dGVvcmRlci5oCmluZGV4IDBmODRjNWMuLmE4ZGQ3MzUgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9pbmNsdWRlL2FzbS9ieXRlb3JkZXIuaAorKysgYi9hcmNoL2lhNjQvaW5jbHVkZS9hc20vYnl0ZW9yZGVyLmgKQEAgLTEsNyArMSw2IEBACiAjaWZuZGVmIF9BU01fSUE2NF9CWVRFT1JERVJfSAogI2RlZmluZSBfQVNNX0lBNjRfQllURU9SREVSX0gKIAotI2luY2x1ZGUgPGFzbS9zd2FiLmg+CiAjaW5jbHVkZSA8bGludXgvYnl0ZW9yZGVyL2xpdHRsZV9lbmRpYW4uaD4KIAogI2VuZGlmIC8qIF9BU01fSUE2NF9CWVRFT1JERVJfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2luY2x1ZGUvYXNtL2RtYS1tYXBwaW5nLmggYi9hcmNoL2lhNjQvaW5jbHVkZS9hc20vZG1hLW1hcHBpbmcuaAppbmRleCBiYmFiN2UyLi4xZjkxMmQ5IDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvaW5jbHVkZS9hc20vZG1hLW1hcHBpbmcuaAorKysgYi9hcmNoL2lhNjQvaW5jbHVkZS9hc20vZG1hLW1hcHBpbmcuaApAQCAtOSw2ICs5LDggQEAKICNpbmNsdWRlIDxsaW51eC9zY2F0dGVybGlzdC5oPgogI2luY2x1ZGUgPGFzbS9zd2lvdGxiLmg+CiAKKyNkZWZpbmUgQVJDSF9IQVNfRE1BX0dFVF9SRVFVSVJFRF9NQVNLCisKIHN0cnVjdCBkbWFfbWFwcGluZ19vcHMgewogCWludCAgICAgICAgICAgICAoKm1hcHBpbmdfZXJyb3IpKHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJCQkJIGRtYV9hZGRyX3QgZG1hX2FkZHIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2luY2x1ZGUvYXNtL2lycS5oIGIvYXJjaC9pYTY0L2luY2x1ZGUvYXNtL2lycS5oCmluZGV4IDM2NDI5YTUuLjUyODI1NDYgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9pbmNsdWRlL2FzbS9pcnEuaAorKysgYi9hcmNoL2lhNjQvaW5jbHVkZS9hc20vaXJxLmgKQEAgLTI3LDcgKzI3LDcgQEAKIH0KIAogZXh0ZXJuIHZvaWQgc2V0X2lycV9hZmZpbml0eV9pbmZvICh1bnNpZ25lZCBpbnQgaXJxLCBpbnQgZGVzdCwgaW50IHJlZGlyKTsKLWJvb2wgaXNfYWZmaW5pdHlfbWFza192YWxpZChjcHVtYXNrX3Zhcl90IGNwdW1hc2spOworYm9vbCBpc19hZmZpbml0eV9tYXNrX3ZhbGlkKGNvbnN0IHN0cnVjdCBjcHVtYXNrICpjcHVtYXNrKTsKIAogI2RlZmluZSBpc19hZmZpbml0eV9tYXNrX3ZhbGlkIGlzX2FmZmluaXR5X21hc2tfdmFsaWQKIApkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2luY2x1ZGUvYXNtL21hY2h2ZWMuaCBiL2FyY2gvaWE2NC9pbmNsdWRlL2FzbS9tYWNodmVjLmgKaW5kZXggNTljMTdlNC4uZmU4N2IyMSAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2luY2x1ZGUvYXNtL21hY2h2ZWMuaAorKysgYi9hcmNoL2lhNjQvaW5jbHVkZS9hc20vbWFjaHZlYy5oCkBAIC02Miw2ICs2Miw3IEBACiB0eXBlZGVmIHZvaWQgaWE2NF9tdl9kbWFfdW5tYXBfc2luZ2xlX2F0dHJzIChzdHJ1Y3QgZGV2aWNlICosIGRtYV9hZGRyX3QsIHNpemVfdCwgaW50LCBzdHJ1Y3QgZG1hX2F0dHJzICopOwogdHlwZWRlZiBpbnQgaWE2NF9tdl9kbWFfbWFwX3NnX2F0dHJzIChzdHJ1Y3QgZGV2aWNlICosIHN0cnVjdCBzY2F0dGVybGlzdCAqLCBpbnQsIGludCwgc3RydWN0IGRtYV9hdHRycyAqKTsKIHR5cGVkZWYgdm9pZCBpYTY0X212X2RtYV91bm1hcF9zZ19hdHRycyAoc3RydWN0IGRldmljZSAqLCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKiwgaW50LCBpbnQsIHN0cnVjdCBkbWFfYXR0cnMgKik7Cit0eXBlZGVmIHU2NCBpYTY0X212X2RtYV9nZXRfcmVxdWlyZWRfbWFzayAoc3RydWN0IGRldmljZSAqKTsKIAogLyoKICAqIFdBUk5JTkc6IFRoZSBsZWdhY3kgSS9PIHNwYWNlIGlzIF9hcmNoaXRlY3RlZF8uICBQbGF0Zm9ybXMgYXJlCkBAIC0xNTksNiArMTYwLDcgQEAKICMgIGRlZmluZSBwbGF0Zm9ybV9kbWFfc3luY19zZ19mb3JfZGV2aWNlIGlhNjRfbXYuZG1hX3N5bmNfc2dfZm9yX2RldmljZQogIyAgZGVmaW5lIHBsYXRmb3JtX2RtYV9tYXBwaW5nX2Vycm9yCQlpYTY0X212LmRtYV9tYXBwaW5nX2Vycm9yCiAjICBkZWZpbmUgcGxhdGZvcm1fZG1hX3N1cHBvcnRlZAlpYTY0X212LmRtYV9zdXBwb3J0ZWQKKyMgIGRlZmluZSBwbGF0Zm9ybV9kbWFfZ2V0X3JlcXVpcmVkX21hc2sgaWE2NF9tdi5kbWFfZ2V0X3JlcXVpcmVkX21hc2sKICMgIGRlZmluZSBwbGF0Zm9ybV9pcnFfdG9fdmVjdG9yCWlhNjRfbXYuaXJxX3RvX3ZlY3RvcgogIyAgZGVmaW5lIHBsYXRmb3JtX2xvY2FsX3ZlY3Rvcl90b19pcnEJaWE2NF9tdi5sb2NhbF92ZWN0b3JfdG9faXJxCiAjICBkZWZpbmUgcGxhdGZvcm1fcGNpX2dldF9sZWdhY3lfbWVtCWlhNjRfbXYucGNpX2dldF9sZWdhY3lfbWVtCkBAIC0yMTMsNiArMjE1LDcgQEAKIAlpYTY0X212X2RtYV9zeW5jX3NnX2Zvcl9kZXZpY2UgKmRtYV9zeW5jX3NnX2Zvcl9kZXZpY2U7CiAJaWE2NF9tdl9kbWFfbWFwcGluZ19lcnJvciAqZG1hX21hcHBpbmdfZXJyb3I7CiAJaWE2NF9tdl9kbWFfc3VwcG9ydGVkICpkbWFfc3VwcG9ydGVkOworCWlhNjRfbXZfZG1hX2dldF9yZXF1aXJlZF9tYXNrICpkbWFfZ2V0X3JlcXVpcmVkX21hc2s7CiAJaWE2NF9tdl9pcnFfdG9fdmVjdG9yICppcnFfdG9fdmVjdG9yOwogCWlhNjRfbXZfbG9jYWxfdmVjdG9yX3RvX2lycSAqbG9jYWxfdmVjdG9yX3RvX2lycTsKIAlpYTY0X212X3BjaV9nZXRfbGVnYWN5X21lbV90ICpwY2lfZ2V0X2xlZ2FjeV9tZW07CkBAIC0yNjMsNiArMjY2LDcgQEAKIAlwbGF0Zm9ybV9kbWFfc3luY19zZ19mb3JfZGV2aWNlLAlcCiAJcGxhdGZvcm1fZG1hX21hcHBpbmdfZXJyb3IsCQkJXAogCXBsYXRmb3JtX2RtYV9zdXBwb3J0ZWQsCQkJXAorCXBsYXRmb3JtX2RtYV9nZXRfcmVxdWlyZWRfbWFzaywJCVwKIAlwbGF0Zm9ybV9pcnFfdG9fdmVjdG9yLAkJCVwKIAlwbGF0Zm9ybV9sb2NhbF92ZWN0b3JfdG9faXJxLAkJXAogCXBsYXRmb3JtX3BjaV9nZXRfbGVnYWN5X21lbSwJCVwKQEAgLTM2Niw2ICszNzAsOSBAQAogI2lmbmRlZiBwbGF0Zm9ybV9kbWFfc3VwcG9ydGVkCiAjIGRlZmluZSAgcGxhdGZvcm1fZG1hX3N1cHBvcnRlZAlzd2lvdGxiX2RtYV9zdXBwb3J0ZWQKICNlbmRpZgorI2lmbmRlZiBwbGF0Zm9ybV9kbWFfZ2V0X3JlcXVpcmVkX21hc2sKKyMgZGVmaW5lICBwbGF0Zm9ybV9kbWFfZ2V0X3JlcXVpcmVkX21hc2sJaWE2NF9kbWFfZ2V0X3JlcXVpcmVkX21hc2sKKyNlbmRpZgogI2lmbmRlZiBwbGF0Zm9ybV9pcnFfdG9fdmVjdG9yCiAjIGRlZmluZSBwbGF0Zm9ybV9pcnFfdG9fdmVjdG9yCQlfX2lhNjRfaXJxX3RvX3ZlY3RvcgogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvaW5jbHVkZS9hc20vbWFjaHZlY19pbml0LmggYi9hcmNoL2lhNjQvaW5jbHVkZS9hc20vbWFjaHZlY19pbml0LmgKaW5kZXggZWY5NjRiMi4uMzdhNDY5OCAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2luY2x1ZGUvYXNtL21hY2h2ZWNfaW5pdC5oCisrKyBiL2FyY2gvaWE2NC9pbmNsdWRlL2FzbS9tYWNodmVjX2luaXQuaApAQCAtMyw2ICszLDcgQEAKIAogZXh0ZXJuIGlhNjRfbXZfc2VuZF9pcGlfdCBpYTY0X3NlbmRfaXBpOwogZXh0ZXJuIGlhNjRfbXZfZ2xvYmFsX3RsYl9wdXJnZV90IGlhNjRfZ2xvYmFsX3RsYl9wdXJnZTsKK2V4dGVybiBpYTY0X212X2RtYV9nZXRfcmVxdWlyZWRfbWFzayBpYTY0X2RtYV9nZXRfcmVxdWlyZWRfbWFzazsKIGV4dGVybiBpYTY0X212X2lycV90b192ZWN0b3IgX19pYTY0X2lycV90b192ZWN0b3I7CiBleHRlcm4gaWE2NF9tdl9sb2NhbF92ZWN0b3JfdG9faXJxIF9faWE2NF9sb2NhbF92ZWN0b3JfdG9faXJxOwogZXh0ZXJuIGlhNjRfbXZfcGNpX2dldF9sZWdhY3lfbWVtX3QgaWE2NF9wY2lfZ2V0X2xlZ2FjeV9tZW07CmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvaW5jbHVkZS9hc20vbWFjaHZlY19zbjIuaCBiL2FyY2gvaWE2NC9pbmNsdWRlL2FzbS9tYWNodmVjX3NuMi5oCmluZGV4IDc4MTMwOGUuLmYxYTZlMGQgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9pbmNsdWRlL2FzbS9tYWNodmVjX3NuMi5oCisrKyBiL2FyY2gvaWE2NC9pbmNsdWRlL2FzbS9tYWNodmVjX3NuMi5oCkBAIC02Nyw2ICs2Nyw3IEBACiBleHRlcm4gaWE2NF9tdl9kbWFfc3luY19zZ19mb3JfZGV2aWNlCXNuX2RtYV9zeW5jX3NnX2Zvcl9kZXZpY2U7CiBleHRlcm4gaWE2NF9tdl9kbWFfbWFwcGluZ19lcnJvcglzbl9kbWFfbWFwcGluZ19lcnJvcjsKIGV4dGVybiBpYTY0X212X2RtYV9zdXBwb3J0ZWQJCXNuX2RtYV9zdXBwb3J0ZWQ7CitleHRlcm4gaWE2NF9tdl9kbWFfZ2V0X3JlcXVpcmVkX21hc2sJc25fZG1hX2dldF9yZXF1aXJlZF9tYXNrOwogZXh0ZXJuIGlhNjRfbXZfbWlncmF0ZV90CQlzbl9taWdyYXRlOwogZXh0ZXJuIGlhNjRfbXZfa2VybmVsX2xhdW5jaF9ldmVudF90CXNuX2tlcm5lbF9sYXVuY2hfZXZlbnQ7CiBleHRlcm4gaWE2NF9tdl9zZXR1cF9tc2lfaXJxX3QJCXNuX3NldHVwX21zaV9pcnE7CkBAIC0xMjMsNiArMTI0LDcgQEAKICNkZWZpbmUgcGxhdGZvcm1fZG1hX3N5bmNfc2dfZm9yX2RldmljZQlzbl9kbWFfc3luY19zZ19mb3JfZGV2aWNlCiAjZGVmaW5lIHBsYXRmb3JtX2RtYV9tYXBwaW5nX2Vycm9yCQlzbl9kbWFfbWFwcGluZ19lcnJvcgogI2RlZmluZSBwbGF0Zm9ybV9kbWFfc3VwcG9ydGVkCQlzbl9kbWFfc3VwcG9ydGVkCisjZGVmaW5lIHBsYXRmb3JtX2RtYV9nZXRfcmVxdWlyZWRfbWFzawlzbl9kbWFfZ2V0X3JlcXVpcmVkX21hc2sKICNkZWZpbmUgcGxhdGZvcm1fbWlncmF0ZQkJc25fbWlncmF0ZQogI2RlZmluZSBwbGF0Zm9ybV9rZXJuZWxfbGF1bmNoX2V2ZW50ICAgIHNuX2tlcm5lbF9sYXVuY2hfZXZlbnQKICNpZmRlZiBDT05GSUdfUENJX01TSQpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2luY2x1ZGUvYXNtL3NuL2FjcGkuaCBiL2FyY2gvaWE2NC9pbmNsdWRlL2FzbS9zbi9hY3BpLmgKaW5kZXggOWNlMjgwMS4uZmQ0ODBkYjIgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9pbmNsdWRlL2FzbS9zbi9hY3BpLmgKKysrIGIvYXJjaC9pYTY0L2luY2x1ZGUvYXNtL3NuL2FjcGkuaApAQCAtOSw4ICs5LDYgQEAKICNpZm5kZWYgX0FTTV9JQTY0X1NOX0FDUElfSAogI2RlZmluZSBfQVNNX0lBNjRfU05fQUNQSV9ICiAKLSNpbmNsdWRlICJhY3BpL2FjZ2xvYmFsLmgiCi0KIGV4dGVybiBpbnQgc25fYWNwaV9yZXY7CiAjZGVmaW5lIFNOX0FDUElfQkFTRV9TVVBQT1JUKCkgICAoc25fYWNwaV9yZXYgPj0gMHgyMDEwMSkKIApkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2luY2x1ZGUvYXNtL3RvcG9sb2d5LmggYi9hcmNoL2lhNjQvaW5jbHVkZS9hc20vdG9wb2xvZ3kuaAppbmRleCA3NmEzM2E5Li4zMmYzYWYxIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvaW5jbHVkZS9hc20vdG9wb2xvZ3kuaAorKysgYi9hcmNoL2lhNjQvaW5jbHVkZS9hc20vdG9wb2xvZ3kuaApAQCAtMTI0LDcgKzEyNCw3IEBACiAKICNkZWZpbmUgY3B1bWFza19vZl9wY2lidXMoYnVzKQkocGNpYnVzX3RvX25vZGUoYnVzKSA9PSAtMSA/CQlcCiAJCQkJIGNwdV9hbGxfbWFzayA6CQkJCVwKLQkJCQkgY3B1bWFza19mcm9tX25vZGUocGNpYnVzX3RvX25vZGUoYnVzKSkpCisJCQkJIGNwdW1hc2tfb2Zfbm9kZShwY2lidXNfdG9fbm9kZShidXMpKSkKIAogI2luY2x1ZGUgPGFzbS1nZW5lcmljL3RvcG9sb2d5Lmg+CiAKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9pbmNsdWRlL2FzbS91bmlzdGQuaCBiL2FyY2gvaWE2NC9pbmNsdWRlL2FzbS91bmlzdGQuaAppbmRleCBmNzkxNTc2Li45MDE1OTc5IDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvaW5jbHVkZS9hc20vdW5pc3RkLmgKKysrIGIvYXJjaC9pYTY0L2luY2x1ZGUvYXNtL3VuaXN0ZC5oCkBAIC0zNjQsNyArMzY0LDcgQEAKIHN0cnVjdCBzaWdhY3Rpb247CiBsb25nIHN5c19leGVjdmUoY2hhciBfX3VzZXIgKmZpbGVuYW1lLCBjaGFyIF9fdXNlciAqIF9fdXNlciAqYXJndiwKIAkJCSAgIGNoYXIgX191c2VyICogX191c2VyICplbnZwLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7Ci1hc21saW5rYWdlIGxvbmcgc3lzX3BpcGUodm9pZCk7Cithc21saW5rYWdlIGxvbmcgc3lzX2lhNjRfcGlwZSh2b2lkKTsKIGFzbWxpbmthZ2UgbG9uZyBzeXNfcnRfc2lnYWN0aW9uKGludCBzaWcsCiAJCQkJIGNvbnN0IHN0cnVjdCBzaWdhY3Rpb24gX191c2VyICphY3QsCiAJCQkJIHN0cnVjdCBzaWdhY3Rpb24gX191c2VyICpvYWN0LApkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2tlcm5lbC9hY3BpLmMgYi9hcmNoL2lhNjQva2VybmVsL2FjcGkuYwppbmRleCAwNTUzNjQ4Li5kNTQxNjcxIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQva2VybmVsL2FjcGkuYworKysgYi9hcmNoL2lhNjQva2VybmVsL2FjcGkuYwpAQCAtNjUsNiArNjUsNyBAQAogdm9pZCAoKnBtX3Bvd2VyX29mZikgKHZvaWQpOwogRVhQT1JUX1NZTUJPTChwbV9wb3dlcl9vZmYpOwogCit1MzIgYWNwaV9yc2R0X2ZvcmNlZDsKIHVuc2lnbmVkIGludCBhY3BpX2NwZWlfb3ZlcnJpZGU7CiB1bnNpZ25lZCBpbnQgYWNwaV9jcGVpX3BoeXNfY3B1aWQ7CiAKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9rZXJuZWwvZW50cnkuUyBiL2FyY2gvaWE2NC9rZXJuZWwvZW50cnkuUwppbmRleCBkNDM1ZjRhLi5lNTM0MWUyIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQva2VybmVsL2VudHJ5LlMKKysrIGIvYXJjaC9pYTY0L2tlcm5lbC9lbnRyeS5TCkBAIC0xNDQyLDcgKzE0NDIsNyBAQAogCWRhdGE4IHN5c19ta2RpcgkJCQkvLyAxMDU1CiAJZGF0YTggc3lzX3JtZGlyCiAJZGF0YTggc3lzX2R1cAotCWRhdGE4IHN5c19waXBlCisJZGF0YTggc3lzX2lhNjRfcGlwZQogCWRhdGE4IHN5c190aW1lcwogCWRhdGE4IGlhNjRfYnJrCQkJCS8vIDEwNjAKIAlkYXRhOCBzeXNfc2V0Z2lkCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQva2VybmVsL2lycS5jIGIvYXJjaC9pYTY0L2tlcm5lbC9pcnEuYwppbmRleCA5NWZmMTZjLi5hNThmNjRjIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQva2VybmVsL2lycS5jCisrKyBiL2FyY2gvaWE2NC9rZXJuZWwvaXJxLmMKQEAgLTEwMiwxNyArMTAyLDE0IEBACiAKIHZvaWQgc2V0X2lycV9hZmZpbml0eV9pbmZvICh1bnNpZ25lZCBpbnQgaXJxLCBpbnQgaHdpZCwgaW50IHJlZGlyKQogewotCWNwdW1hc2tfdCBtYXNrID0gQ1BVX01BU0tfTk9ORTsKLQotCWNwdV9zZXQoY3B1X2xvZ2ljYWxfaWQoaHdpZCksIG1hc2spOwotCiAJaWYgKGlycSA8IE5SX0lSUVMpIHsKLQkJaXJxX2Rlc2NbaXJxXS5hZmZpbml0eSA9IG1hc2s7CisJCWNwdW1hc2tfY29weSgmaXJxX2Rlc2NbaXJxXS5hZmZpbml0eSwKKwkJCSAgICAgY3B1bWFza19vZihjcHVfbG9naWNhbF9pZChod2lkKSkpOwogCQlpcnFfcmVkaXJbaXJxXSA9IChjaGFyKSAocmVkaXIgJiAweGZmKTsKIAl9CiB9CiAKLWJvb2wgaXNfYWZmaW5pdHlfbWFza192YWxpZChjcHVtYXNrX3Zhcl90IGNwdW1hc2spCitib29sIGlzX2FmZmluaXR5X21hc2tfdmFsaWQoY29uc3Qgc3RydWN0IGNwdW1hc2sgKmNwdW1hc2spCiB7CiAJaWYgKGlhNjRfcGxhdGZvcm1faXMoInNuMiIpKSB7CiAJCS8qIE9ubHkgYWxsb3cgb25lIENQVSB0byBiZSBzcGVjaWZpZWQgaW4gdGhlIHNtcF9hZmZpbml0eSBtYXNrICovCkBAIC0xMjgsNyArMTI1LDcgQEAKIHVuc2lnbmVkIGludCB2ZWN0b3JzX2luX21pZ3JhdGlvbltOUl9JUlFTXTsKIAogLyoKLSAqIFNpbmNlIGNwdV9vbmxpbmVfbWFwIGlzIGFscmVhZHkgdXBkYXRlZCwgd2UganVzdCBuZWVkIHRvIGNoZWNrIGZvcgorICogU2luY2UgY3B1X29ubGluZV9tYXNrIGlzIGFscmVhZHkgdXBkYXRlZCwgd2UganVzdCBuZWVkIHRvIGNoZWNrIGZvcgogICogYWZmaW5pdHkgdGhhdCBoYXMgemVyb3MKICAqLwogc3RhdGljIHZvaWQgbWlncmF0ZV9pcnFzKHZvaWQpCkBAIC0xNTgsNyArMTU1LDcgQEAKIAkJCSAqLwogCQkJdmVjdG9yc19pbl9taWdyYXRpb25baXJxXSA9IGlycTsKIAotCQkJbmV3X2NwdSA9IGFueV9vbmxpbmVfY3B1KGNwdV9vbmxpbmVfbWFwKTsKKwkJCW5ld19jcHUgPSBjcHVtYXNrX2FueShjcHVfb25saW5lX21hc2spOwogCiAJCQkvKgogCQkJICogQWwgdGhyZWUgYXJlIGVzc2VudGlhbCwgY3VycmVudGx5IFdBUk5fT04uLiBtYXliZSBwYW5pYz8KQEAgLTE5MSw3ICsxODgsNyBAQAogCSAqIEZpbmQgYSBuZXcgdGltZXN5bmMgbWFzdGVyCiAJICovCiAJaWYgKHNtcF9wcm9jZXNzb3JfaWQoKSA9PSB0aW1lX2tlZXBlcl9pZCkgewotCQl0aW1lX2tlZXBlcl9pZCA9IGZpcnN0X2NwdShjcHVfb25saW5lX21hcCk7CisJCXRpbWVfa2VlcGVyX2lkID0gY3B1bWFza19maXJzdChjcHVfb25saW5lX21hc2spOwogCQlwcmludGsgKCJDUFUgJWQgaXMgbm93IHByb21vdGVkIHRvIHRpbWUta2VlcGVyIG1hc3RlclxuIiwgdGltZV9rZWVwZXJfaWQpOwogCX0KIApkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2tlcm5lbC9rcHJvYmVzLmMgYi9hcmNoL2lhNjQva2VybmVsL2twcm9iZXMuYwppbmRleCAwOTdiODRkLi45YWRhYzQ0IDEwMDY0NAotLS0gYS9hcmNoL2lhNjQva2VybmVsL2twcm9iZXMuYworKysgYi9hcmNoL2lhNjQva2VybmVsL2twcm9iZXMuYwpAQCAtNDM0LDcgKzQzNCw3IEBACiAJLyoKIAkgKiBJdCBpcyBwb3NzaWJsZSB0byBoYXZlIG11bHRpcGxlIGluc3RhbmNlcyBhc3NvY2lhdGVkIHdpdGggYSBnaXZlbgogCSAqIHRhc2sgZWl0aGVyIGJlY2F1c2UgYW4gbXVsdGlwbGUgZnVuY3Rpb25zIGluIHRoZSBjYWxsIHBhdGgKLQkgKiBoYXZlIGEgcmV0dXJuIHByb2JlIGluc3RhbGxlZCBvbiB0aGVtLCBhbmQvb3IgbW9yZSB0aGVuIG9uZSByZXR1cm4KKwkgKiBoYXZlIGEgcmV0dXJuIHByb2JlIGluc3RhbGxlZCBvbiB0aGVtLCBhbmQvb3IgbW9yZSB0aGFuIG9uZSByZXR1cm4KIAkgKiByZXR1cm4gcHJvYmUgd2FzIHJlZ2lzdGVyZWQgZm9yIGEgdGFyZ2V0IGZ1bmN0aW9uLgogCSAqCiAJICogV2UgY2FuIGhhbmRsZSB0aGlzIGJlY2F1c2U6CkBAIC04NzAsNyArODcwLDcgQEAKIAkJcmV0dXJuIDE7CiAKIHNzX3Byb2JlOgotI2lmICFkZWZpbmVkKENPTkZJR19QUkVFTVBUKSB8fCBkZWZpbmVkKENPTkZJR19QTSkKKyNpZiAhZGVmaW5lZChDT05GSUdfUFJFRU1QVCkgfHwgZGVmaW5lZChDT05GSUdfRlJFRVpFUikKIAlpZiAocC0+YWluc24uaW5zdF9mbGFnID09IElOU1RfRkxBR19CT09TVEFCTEUgJiYgIXAtPnBvc3RfaGFuZGxlcikgewogCQkvKiBCb29zdCB1cCAtLSB3ZSBjYW4gZXhlY3V0ZSBjb3BpZWQgaW5zdHJ1Y3Rpb25zIGRpcmVjdGx5ICovCiAJCWlhNjRfcHNyKHJlZ3MpLT5yaSA9IHAtPmFpbnNuLnNsb3Q7CmRpZmYgLS1naXQgYS9hcmNoL2lhNjQva2VybmVsL3N5c19pYTY0LmMgYi9hcmNoL2lhNjQva2VybmVsL3N5c19pYTY0LmMKaW5kZXggYmNiYjZkOC4uOTJlZDgzZiAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2tlcm5lbC9zeXNfaWE2NC5jCisrKyBiL2FyY2gvaWE2NC9rZXJuZWwvc3lzX2lhNjQuYwpAQCAtMTU0LDcgKzE1NCw3IEBACiAgKiBhbmQgcjkpIGFzIHRoaXMgaXMgZmFzdGVyIHRoYW4gZG9pbmcgYSBjb3B5X3RvX3VzZXIoKS4KICAqLwogYXNtbGlua2FnZSBsb25nCi1zeXNfcGlwZSAodm9pZCkKK3N5c19pYTY0X3BpcGUgKHZvaWQpCiB7CiAJc3RydWN0IHB0X3JlZ3MgKnJlZ3MgPSB0YXNrX3B0X3JlZ3MoY3VycmVudCk7CiAJaW50IGZkWzJdOwpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2tlcm5lbC91bmFsaWduZWQuYyBiL2FyY2gvaWE2NC9rZXJuZWwvdW5hbGlnbmVkLmMKaW5kZXggZmYwZTdjMS4uNmRiMDg1OSAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2tlcm5lbC91bmFsaWduZWQuYworKysgYi9hcmNoL2lhNjQva2VybmVsL3VuYWxpZ25lZC5jCkBAIC01OSw2ICs1OSw3IEBACiAgKiAgKGkuZS4gZG9uJ3QgYWxsb3cgYXR0YWNrZXIgdG8gZmlsbCB1cCBsb2dzIHdpdGggdW5hbGlnbmVkIGFjY2Vzc2VzKS4KICAqLwogaW50IG5vX3VuYWxpZ25lZF93YXJuaW5nOworaW50IHVuYWxpZ25lZF9kdW1wX3N0YWNrOwogc3RhdGljIGludCBub3ByaW50X3dhcm5pbmc7CiAKIC8qCkBAIC0xMzcxLDkgKzEzNzIsMTIgQEAKIAkJCX0KIAkJfQogCX0gZWxzZSB7Ci0JCWlmICh3aXRoaW5fbG9nZ2luZ19yYXRlX2xpbWl0KCkpCisJCWlmICh3aXRoaW5fbG9nZ2luZ19yYXRlX2xpbWl0KCkpIHsKIAkJCXByaW50ayhLRVJOX1dBUk5JTkcgImtlcm5lbCB1bmFsaWduZWQgYWNjZXNzIHRvIDB4JTAxNmx4LCBpcD0weCUwMTZseFxuIiwKIAkJCSAgICAgICBpZmEsIHJlZ3MtPmNyX2lpcCArIGlwc3ItPnJpKTsKKwkJCWlmICh1bmFsaWduZWRfZHVtcF9zdGFjaykKKwkJCQlkdW1wX3N0YWNrKCk7CisJCX0KIAkJc2V0X2ZzKEtFUk5FTF9EUyk7CiAJfQogCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvcGNpL3BjaS5jIGIvYXJjaC9pYTY0L3BjaS9wY2kuYwppbmRleCAyMTFmY2ZkLi42MWYxYWY1IDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvcGNpL3BjaS5jCisrKyBiL2FyY2gvaWE2NC9wY2kvcGNpLmMKQEAgLTE5LDYgKzE5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9ib290bWVtLmg+CiAKICNpbmNsdWRlIDxhc20vbWFjaHZlYy5oPgogI2luY2x1ZGUgPGFzbS9wYWdlLmg+CkBAIC03NDgsNiArNzQ5LDMyIEBACiAJcGNpX2NhY2hlX2xpbmVfc2l6ZSA9ICgxIDw8IGNjaS5wY2NpX2xpbmVfc2l6ZSkgLyA0OwogfQogCit1NjQgaWE2NF9kbWFfZ2V0X3JlcXVpcmVkX21hc2soc3RydWN0IGRldmljZSAqZGV2KQoreworCXUzMiBsb3dfdG90YWxyYW0gPSAoKG1heF9wZm4gLSAxKSA8PCBQQUdFX1NISUZUKTsKKwl1MzIgaGlnaF90b3RhbHJhbSA9ICgobWF4X3BmbiAtIDEpID4+ICgzMiAtIFBBR0VfU0hJRlQpKTsKKwl1NjQgbWFzazsKKworCWlmICghaGlnaF90b3RhbHJhbSkgeworCQkvKiBjb252ZXJ0IHRvIG1hc2sganVzdCBjb3ZlcmluZyB0b3RhbHJhbSAqLworCQlsb3dfdG90YWxyYW0gPSAoMSA8PCAoZmxzKGxvd190b3RhbHJhbSkgLSAxKSk7CisJCWxvd190b3RhbHJhbSArPSBsb3dfdG90YWxyYW0gLSAxOworCQltYXNrID0gbG93X3RvdGFscmFtOworCX0gZWxzZSB7CisJCWhpZ2hfdG90YWxyYW0gPSAoMSA8PCAoZmxzKGhpZ2hfdG90YWxyYW0pIC0gMSkpOworCQloaWdoX3RvdGFscmFtICs9IGhpZ2hfdG90YWxyYW0gLSAxOworCQltYXNrID0gKCgodTY0KWhpZ2hfdG90YWxyYW0pIDw8IDMyKSArIDB4ZmZmZmZmZmY7CisJfQorCXJldHVybiBtYXNrOworfQorRVhQT1JUX1NZTUJPTF9HUEwoaWE2NF9kbWFfZ2V0X3JlcXVpcmVkX21hc2spOworCit1NjQgZG1hX2dldF9yZXF1aXJlZF9tYXNrKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZG1hX2dldF9yZXF1aXJlZF9tYXNrKGRldik7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChkbWFfZ2V0X3JlcXVpcmVkX21hc2spOworCiBzdGF0aWMgaW50IF9faW5pdCBwY2liaW9zX2luaXQodm9pZCkKIHsKIAlzZXRfcGNpX2NhY2hlbGluZV9zaXplKCk7CmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvc24va2VybmVsL2lvX2FjcGlfaW5pdC5jIGIvYXJjaC9pYTY0L3NuL2tlcm5lbC9pb19hY3BpX2luaXQuYwppbmRleCBiYzYxMGE2Li5jNWEyMTQwIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvc24va2VybmVsL2lvX2FjcGlfaW5pdC5jCisrKyBiL2FyY2gvaWE2NC9zbi9rZXJuZWwvaW9fYWNwaV9pbml0LmMKQEAgLTEzLDcgKzEzLDYgQEAKICNpbmNsdWRlIDxhc20vc24vc25fc2FsLmg+CiAjaW5jbHVkZSAieHRhbGsvaHViZGV2LmgiCiAjaW5jbHVkZSA8bGludXgvYWNwaS5oPgotI2luY2x1ZGUgPGFjcGkvYWNuYW1lc3AuaD4KIAogCiAvKgpAQCAtNjQsNiArNjMsNyBAQAogc25fYWNwaV9odWJkZXZfaW5pdChhY3BpX2hhbmRsZSBoYW5kbGUsIHUzMiBkZXB0aCwgdm9pZCAqY29udGV4dCwgdm9pZCAqKnJldCkKIHsKIAlzdHJ1Y3QgYWNwaV9idWZmZXIgYnVmZmVyID0geyBBQ1BJX0FMTE9DQVRFX0JVRkZFUiwgTlVMTCB9OworCXN0cnVjdCBhY3BpX2J1ZmZlciBuYW1lX2J1ZmZlciA9IHsgQUNQSV9BTExPQ0FURV9CVUZGRVIsIE5VTEwgfTsKIAl1NjQgYWRkcjsKIAlzdHJ1Y3QgaHViZGV2X2luZm8gKmh1YmRldjsKIAlzdHJ1Y3QgaHViZGV2X2luZm8gKmh1YmRldl9wdHI7CkBAIC03NywxMSArNzcsMTIgQEAKIAlzdGF0dXMgPSBhY3BpX2dldF92ZW5kb3JfcmVzb3VyY2UoaGFuZGxlLCBNRVRIT0RfTkFNRV9fQ1JTLAogCQkJCQkgICZzbl91dWlkLCAmYnVmZmVyKTsKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJYWNwaV9nZXRfbmFtZShoYW5kbGUsIEFDUElfRlVMTF9QQVRITkFNRSwgJm5hbWVfYnVmZmVyKTsKIAkJcHJpbnRrKEtFUk5fRVJSCiAJCSAgICAgICAic25fYWNwaV9odWJkZXZfaW5pdDogYWNwaV9nZXRfdmVuZG9yX3Jlc291cmNlKCkgIgotCQkgICAgICAgIigweCV4KSBmYWlsZWQgZm9yOiAiLCBzdGF0dXMpOwotCQlhY3BpX25zX3ByaW50X25vZGVfcGF0aG5hbWUoaGFuZGxlLCBOVUxMKTsKLQkJcHJpbnRrKCJcbiIpOworCQkgICAgICAgIigweCV4KSBmYWlsZWQgZm9yOiAlc1xuIiwgc3RhdHVzLAorCQkJKGNoYXIgKiluYW1lX2J1ZmZlci5wb2ludGVyKTsKKwkJa2ZyZWUobmFtZV9idWZmZXIucG9pbnRlcik7CiAJCXJldHVybiBBRV9PSzsJCS8qIENvbnRpbnVlIHdhbGtpbmcgbmFtZXNwYWNlICovCiAJfQogCkBAIC04OSwxMSArOTAsMTIgQEAKIAl2ZW5kb3IgPSAmcmVzb3VyY2UtPmRhdGEudmVuZG9yX3R5cGVkOwogCWlmICgodmVuZG9yLT5ieXRlX2xlbmd0aCAtIHNpemVvZihzdHJ1Y3QgYWNwaV92ZW5kb3JfdXVpZCkpICE9CiAJICAgIHNpemVvZihzdHJ1Y3QgaHViZGV2X2luZm8gKikpIHsKKwkJYWNwaV9nZXRfbmFtZShoYW5kbGUsIEFDUElfRlVMTF9QQVRITkFNRSwgJm5hbWVfYnVmZmVyKTsKIAkJcHJpbnRrKEtFUk5fRVJSCi0JCSAgICAgICAic25fYWNwaV9odWJkZXZfaW5pdDogSW52YWxpZCB2ZW5kb3IgZGF0YSBsZW5ndGg6ICVkIGZvcjogIiwKLQkJICAgICAgICB2ZW5kb3ItPmJ5dGVfbGVuZ3RoKTsKLQkJYWNwaV9uc19wcmludF9ub2RlX3BhdGhuYW1lKGhhbmRsZSwgTlVMTCk7Ci0JCXByaW50aygiXG4iKTsKKwkJICAgICAgICJzbl9hY3BpX2h1YmRldl9pbml0OiBJbnZhbGlkIHZlbmRvciBkYXRhIGxlbmd0aDogIgorCQkgICAgICAgIiVkIGZvcjogJXNcbiIsCisJCQl2ZW5kb3ItPmJ5dGVfbGVuZ3RoLCAoY2hhciAqKW5hbWVfYnVmZmVyLnBvaW50ZXIpOworCQlrZnJlZShuYW1lX2J1ZmZlci5wb2ludGVyKTsKIAkJZ290byBleGl0OwogCX0KIApAQCAtMTIwLDYgKzEyMiw3IEBACiB7CiAJdTY0IGFkZHI7CiAJc3RydWN0IGFjcGlfYnVmZmVyIGJ1ZmZlciA9IHsgQUNQSV9BTExPQ0FURV9CVUZGRVIsIE5VTEwgfTsKKwlzdHJ1Y3QgYWNwaV9idWZmZXIgbmFtZV9idWZmZXIgPSB7IEFDUElfQUxMT0NBVEVfQlVGRkVSLCBOVUxMIH07CiAJYWNwaV9oYW5kbGUgaGFuZGxlOwogCXN0cnVjdCBwY2lidXNfYnVzc29mdCAqcHJvbV9idXNzb2Z0X3B0cjsKIAlzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAqcmVzb3VyY2U7CkBAIC0xMzEsMTEgKzEzNCwxMSBAQAogCXN0YXR1cyA9IGFjcGlfZ2V0X3ZlbmRvcl9yZXNvdXJjZShoYW5kbGUsIE1FVEhPRF9OQU1FX19DUlMsCiAJCQkJCSAgJnNuX3V1aWQsICZidWZmZXIpOwogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlhY3BpX2dldF9uYW1lKGhhbmRsZSwgQUNQSV9GVUxMX1BBVEhOQU1FLCAmbmFtZV9idWZmZXIpOwogCQlwcmludGsoS0VSTl9FUlIgIiVzOiAiCi0JCSAgICAgICAiYWNwaV9nZXRfdmVuZG9yX3Jlc291cmNlKCkgZmFpbGVkICgweCV4KSBmb3I6ICIsCi0JCSAgICAgICBfX2Z1bmNfXywgc3RhdHVzKTsKLQkJYWNwaV9uc19wcmludF9ub2RlX3BhdGhuYW1lKGhhbmRsZSwgTlVMTCk7Ci0JCXByaW50aygiXG4iKTsKKwkJICAgICAgICJhY3BpX2dldF92ZW5kb3JfcmVzb3VyY2UoKSBmYWlsZWQgKDB4JXgpIGZvcjogJXNcbiIsCisJCSAgICAgICBfX2Z1bmNfXywgc3RhdHVzLCAoY2hhciAqKW5hbWVfYnVmZmVyLnBvaW50ZXIpOworCQlrZnJlZShuYW1lX2J1ZmZlci5wb2ludGVyKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQogCXJlc291cmNlID0gYnVmZmVyLnBvaW50ZXI7CkBAIC0xNjgsNiArMTcxLDcgQEAKIHsKIAl1NjQgYWRkcjsKIAlzdHJ1Y3QgYWNwaV9idWZmZXIgYnVmZmVyID0geyBBQ1BJX0FMTE9DQVRFX0JVRkZFUiwgTlVMTCB9OworCXN0cnVjdCBhY3BpX2J1ZmZlciBuYW1lX2J1ZmZlciA9IHsgQUNQSV9BTExPQ0FURV9CVUZGRVIsIE5VTEwgfTsKIAlzdHJ1Y3Qgc25faXJxX2luZm8gKmlycV9pbmZvLCAqaXJxX2luZm9fcHJvbTsKIAlzdHJ1Y3QgcGNpZGV2X2luZm8gKnBjaWRldl9wdHIsICpwY2lkZXZfcHJvbV9wdHI7CiAJc3RydWN0IGFjcGlfcmVzb3VyY2UgKnJlc291cmNlOwpAQCAtMTgyLDExICsxODYsMTEgQEAKIAlzdGF0dXMgPSBhY3BpX2dldF92ZW5kb3JfcmVzb3VyY2UoaGFuZGxlLCBNRVRIT0RfTkFNRV9fQ1JTLAogCQkJCQkgICZzbl91dWlkLCAmYnVmZmVyKTsKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJYWNwaV9nZXRfbmFtZShoYW5kbGUsIEFDUElfRlVMTF9QQVRITkFNRSwgJm5hbWVfYnVmZmVyKTsKIAkJcHJpbnRrKEtFUk5fRVJSCi0JCSAgICAgICAiJXM6IGFjcGlfZ2V0X3ZlbmRvcl9yZXNvdXJjZSgpIGZhaWxlZCAoMHgleCkgZm9yOiAiLAotCQkgICAgICAgIF9fZnVuY19fLCBzdGF0dXMpOwotCQlhY3BpX25zX3ByaW50X25vZGVfcGF0aG5hbWUoaGFuZGxlLCBOVUxMKTsKLQkJcHJpbnRrKCJcbiIpOworCQkgICAgICAgIiVzOiBhY3BpX2dldF92ZW5kb3JfcmVzb3VyY2UoKSBmYWlsZWQgKDB4JXgpIGZvcjogJXNcbiIsCisJCQlfX2Z1bmNfXywgc3RhdHVzLCAoY2hhciAqKW5hbWVfYnVmZmVyLnBvaW50ZXIpOworCQlrZnJlZShuYW1lX2J1ZmZlci5wb2ludGVyKTsKIAkJcmV0dXJuIDE7CiAJfQogCkBAIC0xOTQsMTEgKzE5OCwxMiBAQAogCXZlbmRvciA9ICZyZXNvdXJjZS0+ZGF0YS52ZW5kb3JfdHlwZWQ7CiAJaWYgKCh2ZW5kb3ItPmJ5dGVfbGVuZ3RoIC0gc2l6ZW9mKHN0cnVjdCBhY3BpX3ZlbmRvcl91dWlkKSkgIT0KIAkgICAgc2l6ZW9mKHN0cnVjdCBwY2lfZGV2ZGV2X2luZm8gKikpIHsKKwkJYWNwaV9nZXRfbmFtZShoYW5kbGUsIEFDUElfRlVMTF9QQVRITkFNRSwgJm5hbWVfYnVmZmVyKTsKIAkJcHJpbnRrKEtFUk5fRVJSCi0JCSAgICAgICAiJXM6IEludmFsaWQgdmVuZG9yIGRhdGEgbGVuZ3RoOiAlZCBmb3I6ICIsCi0JCSAgICAgICAgX19mdW5jX18sIHZlbmRvci0+Ynl0ZV9sZW5ndGgpOwotCQlhY3BpX25zX3ByaW50X25vZGVfcGF0aG5hbWUoaGFuZGxlLCBOVUxMKTsKLQkJcHJpbnRrKCJcbiIpOworCQkgICAgICAgIiVzOiBJbnZhbGlkIHZlbmRvciBkYXRhIGxlbmd0aDogJWQgZm9yOiAlc1xuIiwKKwkJCSBfX2Z1bmNfXywgdmVuZG9yLT5ieXRlX2xlbmd0aCwKKwkJCShjaGFyICopbmFtZV9idWZmZXIucG9pbnRlcik7CisJCWtmcmVlKG5hbWVfYnVmZmVyLnBvaW50ZXIpOwogCQlyZXQgPSAxOwogCQlnb3RvIGV4aXQ7CiAJfQpAQCAtMjM5LDYgKzI0NCw5IEBACiAJYWNwaV9oYW5kbGUgcGFyZW50OwogCWludCBzbG90OwogCWFjcGlfc3RhdHVzIHN0YXR1czsKKwlzdHJ1Y3QgYWNwaV9idWZmZXIgbmFtZV9idWZmZXIgPSB7IEFDUElfQUxMT0NBVEVfQlVGRkVSLCBOVUxMIH07CisKKwlhY3BpX2dldF9uYW1lKGRldmljZV9oYW5kbGUsIEFDUElfRlVMTF9QQVRITkFNRSwgJm5hbWVfYnVmZmVyKTsKIAogCS8qCiAJICogRG8gYW4gdXB3YXJkIHNlYXJjaCB0byBmaW5kIHRoZSByb290IGJ1cyBkZXZpY2UsIGFuZApAQCAtMjQ5LDkgKzI1Nyw4IEBACiAJCXN0YXR1cyA9IGFjcGlfZ2V0X3BhcmVudChjaGlsZCwgJnBhcmVudCk7CiAJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQkJcHJpbnRrKEtFUk5fRVJSICIlczogYWNwaV9nZXRfcGFyZW50KCkgZmFpbGVkICIKLQkJCSAgICAgICAiKDB4JXgpIGZvcjogIiwgX19mdW5jX18sIHN0YXR1cyk7Ci0JCQlhY3BpX25zX3ByaW50X25vZGVfcGF0aG5hbWUoY2hpbGQsIE5VTEwpOwotCQkJcHJpbnRrKCJcbiIpOworCQkJICAgICAgICIoMHgleCkgZm9yOiAlc1xuIiwgX19mdW5jX18sIHN0YXR1cywKKwkJCQkoY2hhciAqKW5hbWVfYnVmZmVyLnBvaW50ZXIpOwogCQkJcGFuaWMoIiVzOiBVbmFibGUgdG8gZmluZCBob3N0IGRldmZuXG4iLCBfX2Z1bmNfXyk7CiAJCX0KIAkJaWYgKHBhcmVudCA9PSByb290YnVzX2hhbmRsZSkKQEAgLTI1OSwyMiArMjY2LDIwIEBACiAJCWNoaWxkID0gcGFyZW50OwogCX0KIAlpZiAoIWNoaWxkKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IFVuYWJsZSB0byBmaW5kIHJvb3QgYnVzIGZvcjogIiwKLQkJICAgICAgIF9fZnVuY19fKTsKLQkJYWNwaV9uc19wcmludF9ub2RlX3BhdGhuYW1lKGRldmljZV9oYW5kbGUsIE5VTEwpOwotCQlwcmludGsoIlxuIik7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IFVuYWJsZSB0byBmaW5kIHJvb3QgYnVzIGZvcjogJXNcbiIsCisJCSAgICAgICBfX2Z1bmNfXywgKGNoYXIgKiluYW1lX2J1ZmZlci5wb2ludGVyKTsKIAkJQlVHKCk7CiAJfQogCiAJc3RhdHVzID0gYWNwaV9ldmFsdWF0ZV9pbnRlZ2VyKGNoaWxkLCBNRVRIT0RfTkFNRV9fQURSLCBOVUxMLCAmYWRyKTsKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogVW5hYmxlIHRvIGdldCBfQURSICgweCV4KSBmb3I6ICIsCi0JCSAgICAgICBfX2Z1bmNfXywgc3RhdHVzKTsKLQkJYWNwaV9uc19wcmludF9ub2RlX3BhdGhuYW1lKGNoaWxkLCBOVUxMKTsKLQkJcHJpbnRrKCJcbiIpOworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBVbmFibGUgdG8gZ2V0IF9BRFIgKDB4JXgpIGZvcjogJXNcbiIsCisJCSAgICAgICBfX2Z1bmNfXywgc3RhdHVzLCAoY2hhciAqKW5hbWVfYnVmZmVyLnBvaW50ZXIpOwogCQlwYW5pYygiJXM6IFVuYWJsZSB0byBmaW5kIGhvc3QgZGV2Zm5cbiIsIF9fZnVuY19fKTsKIAl9CiAKKwlrZnJlZShuYW1lX2J1ZmZlci5wb2ludGVyKTsKKwogCXNsb3QgPSAoYWRyID4+IDE2KSAmIDB4ZmZmZjsKIAlmdW5jdGlvbiA9IGFkciAmIDB4ZmZmZjsKIAlkZXZmbiA9IFBDSV9ERVZGTihzbG90LCBmdW5jdGlvbik7CkBAIC0zMDAsMjcgKzMwNSwyOCBAQAogCWludCBmdW5jdGlvbjsKIAlpbnQgc2xvdDsKIAlzdHJ1Y3Qgc25fcGNpZGV2X21hdGNoICppbmZvID0gY29udGV4dDsKKwlzdHJ1Y3QgYWNwaV9idWZmZXIgbmFtZV9idWZmZXIgPSB7IEFDUElfQUxMT0NBVEVfQlVGRkVSLCBOVUxMIH07CiAKICAgICAgICAgc3RhdHVzID0gYWNwaV9ldmFsdWF0ZV9pbnRlZ2VyKGhhbmRsZSwgTUVUSE9EX05BTUVfX0FEUiwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhZHIpOwogICAgICAgICBpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpIHsKIAkJc3RhdHVzID0gYWNwaV9nZXRfcGFyZW50KGhhbmRsZSwgJnBhcmVudCk7CiAJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJYWNwaV9nZXRfbmFtZShoYW5kbGUsIEFDUElfRlVMTF9QQVRITkFNRSwgJm5hbWVfYnVmZmVyKTsKIAkJCXByaW50ayhLRVJOX0VSUgotCQkJICAgICAgICIlczogYWNwaV9nZXRfcGFyZW50KCkgZmFpbGVkICgweCV4KSBmb3I6ICIsCi0JCQkJCV9fZnVuY19fLCBzdGF0dXMpOwotCQkJYWNwaV9uc19wcmludF9ub2RlX3BhdGhuYW1lKGhhbmRsZSwgTlVMTCk7Ci0JCQlwcmludGsoIlxuIik7CisJCQkgICAgICAgIiVzOiBhY3BpX2dldF9wYXJlbnQoKSBmYWlsZWQgKDB4JXgpIGZvcjogJXNcbiIsCisJCQkJX19mdW5jX18sIHN0YXR1cywgKGNoYXIgKiluYW1lX2J1ZmZlci5wb2ludGVyKTsKKwkJCWtmcmVlKG5hbWVfYnVmZmVyLnBvaW50ZXIpOwogCQkJcmV0dXJuIEFFX09LOwogCQl9CiAJCXN0YXR1cyA9IGFjcGlfZXZhbHVhdGVfaW50ZWdlcihwYXJlbnQsIE1FVEhPRF9OQU1FX19CQk4sCiAJCQkJCSAgICAgICBOVUxMLCAmYmJuKTsKIAkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQlhY3BpX2dldF9uYW1lKGhhbmRsZSwgQUNQSV9GVUxMX1BBVEhOQU1FLCAmbmFtZV9idWZmZXIpOwogCQkJcHJpbnRrKEtFUk5fRVJSCi0JCQkgICIlczogRmFpbGVkIHRvIGZpbmQgX0JCTiBpbiBwYXJlbnQgb2Y6ICIsCi0JCQkJCV9fZnVuY19fKTsKLQkJCWFjcGlfbnNfcHJpbnRfbm9kZV9wYXRobmFtZShoYW5kbGUsIE5VTEwpOwotCQkJcHJpbnRrKCJcbiIpOworCQkJICAiJXM6IEZhaWxlZCB0byBmaW5kIF9CQk4gaW4gcGFyZW50IG9mOiAlc1xuIiwKKwkJCQkJX19mdW5jX18sIChjaGFyICopbmFtZV9idWZmZXIucG9pbnRlcik7CisJCQlrZnJlZShuYW1lX2J1ZmZlci5wb2ludGVyKTsKIAkJCXJldHVybiBBRV9PSzsKIAkJfQogCkBAIC0zNTAsMjQgKzM1NiwyNyBAQAogCWFjcGlfaGFuZGxlIHJvb3RidXNfaGFuZGxlOwogCXVuc2lnbmVkIGxvbmcgbG9uZyBzZWdtZW50OwogCWFjcGlfc3RhdHVzIHN0YXR1czsKKwlzdHJ1Y3QgYWNwaV9idWZmZXIgbmFtZV9idWZmZXIgPSB7IEFDUElfQUxMT0NBVEVfQlVGRkVSLCBOVUxMIH07CiAKIAlyb290YnVzX2hhbmRsZSA9IFBDSV9DT05UUk9MTEVSKGRldiktPmFjcGlfaGFuZGxlOwogICAgICAgICBzdGF0dXMgPSBhY3BpX2V2YWx1YXRlX2ludGVnZXIocm9vdGJ1c19oYW5kbGUsIE1FVEhPRF9OQU1FX19TRUcsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2VnbWVudCk7CiAgICAgICAgIGlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkgewogCQlpZiAoc2VnbWVudCAhPSBwY2lfZG9tYWluX25yKGRldikpIHsKKwkJCWFjcGlfZ2V0X25hbWUocm9vdGJ1c19oYW5kbGUsIEFDUElfRlVMTF9QQVRITkFNRSwKKwkJCQkmbmFtZV9idWZmZXIpOwogCQkJcHJpbnRrKEtFUk5fRVJSCi0JCQkgICAgICAgIiVzOiBTZWdtZW50IG51bWJlciBtaXNtYXRjaCwgMHglbGx4IHZzIDB4JXggZm9yOiAiLAotCQkJICAgICAgIF9fZnVuY19fLCBzZWdtZW50LCBwY2lfZG9tYWluX25yKGRldikpOwotCQkJYWNwaV9uc19wcmludF9ub2RlX3BhdGhuYW1lKHJvb3RidXNfaGFuZGxlLCBOVUxMKTsKLQkJCXByaW50aygiXG4iKTsKKwkJCSAgICAgICAiJXM6IFNlZ21lbnQgbnVtYmVyIG1pc21hdGNoLCAweCVsbHggdnMgMHgleCBmb3I6ICVzXG4iLAorCQkJICAgICAgIF9fZnVuY19fLCBzZWdtZW50LCBwY2lfZG9tYWluX25yKGRldiksCisJCQkgICAgICAgKGNoYXIgKiluYW1lX2J1ZmZlci5wb2ludGVyKTsKKwkJCWtmcmVlKG5hbWVfYnVmZmVyLnBvaW50ZXIpOwogCQkJcmV0dXJuIDE7CiAJCX0KIAl9IGVsc2UgewotCQlwcmludGsoS0VSTl9FUlIgIiVzOiBVbmFibGUgdG8gZ2V0IF9fU0VHIGZyb206ICIsCi0JCSAgICAgICBfX2Z1bmNfXyk7Ci0JCWFjcGlfbnNfcHJpbnRfbm9kZV9wYXRobmFtZShyb290YnVzX2hhbmRsZSwgTlVMTCk7Ci0JCXByaW50aygiXG4iKTsKKwkJYWNwaV9nZXRfbmFtZShyb290YnVzX2hhbmRsZSwgQUNQSV9GVUxMX1BBVEhOQU1FLCAmbmFtZV9idWZmZXIpOworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBVbmFibGUgdG8gZ2V0IF9fU0VHIGZyb206ICVzXG4iLAorCQkgICAgICAgX19mdW5jX18sIChjaGFyICopbmFtZV9idWZmZXIucG9pbnRlcik7CisJCWtmcmVlKG5hbWVfYnVmZmVyLnBvaW50ZXIpOwogCQlyZXR1cm4gMTsKIAl9CiAKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9zbi9rZXJuZWwvaW9fY29tbW9uLmMgYi9hcmNoL2lhNjQvc24va2VybmVsL2lvX2NvbW1vbi5jCmluZGV4IDhhOTI0YTUuLjBkNGZmYTQgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9zbi9rZXJuZWwvaW9fY29tbW9uLmMKKysrIGIvYXJjaC9pYTY0L3NuL2tlcm5lbC9pb19jb21tb24uYwpAQCAtMjYsNyArMjYsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KICNpbmNsdWRlIDxhc20vc24vc24yL3NuX2h3cGVyZi5oPgogI2luY2x1ZGUgPGFzbS9zbi9hY3BpLmg+Ci0jaW5jbHVkZSAiYWNwaS9hY2dsb2JhbC5oIgogCiBleHRlcm4gdm9pZCBzbl9pbml0X2NwZWlfdGltZXIodm9pZCk7CiBleHRlcm4gdm9pZCByZWdpc3Rlcl9zbl9wcm9jZnModm9pZCk7CkBAIC00NzMsNyArNDcyLDcgQEAKIAl7CiAJCXN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqaGVhZGVyID0gTlVMTDsKIAotCQlhY3BpX2dldF90YWJsZV9ieV9pbmRleChBQ1BJX1RBQkxFX0lOREVYX0RTRFQsICZoZWFkZXIpOworCQlhY3BpX2dldF90YWJsZShBQ1BJX1NJR19EU0RULCAxLCAmaGVhZGVyKTsKIAkJQlVHX09OKGhlYWRlciA9PSBOVUxMKTsKIAkJc25fYWNwaV9yZXYgPSBoZWFkZXItPm9lbV9yZXZpc2lvbjsKIAl9CkBAIC01MDUsNyArNTA0LDcgQEAKIAogCXsKIAkJc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICpoZWFkZXI7Ci0JCSh2b2lkKWFjcGlfZ2V0X3RhYmxlX2J5X2luZGV4KEFDUElfVEFCTEVfSU5ERVhfRFNEVCwgJmhlYWRlcik7CisJCSh2b2lkKWFjcGlfZ2V0X3RhYmxlKEFDUElfU0lHX0RTRFQsIDEsICZoZWFkZXIpOwogCQlwcmludGsoS0VSTl9JTkZPICJBQ1BJICBEU0RUIE9FTSBSZXYgMHgleFxuIiwKIAkJCWhlYWRlci0+b2VtX3JldmlzaW9uKTsKIAl9CmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvc24vcGNpL3BjaV9kbWEuYyBiL2FyY2gvaWE2NC9zbi9wY2kvcGNpX2RtYS5jCmluZGV4IDUzZWJiNjQuLjg2M2Y1MDEgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9zbi9wY2kvcGNpX2RtYS5jCisrKyBiL2FyY2gvaWE2NC9zbi9wY2kvcGNpX2RtYS5jCkBAIC0zNTYsNiArMzU2LDEyIEBACiB9CiBFWFBPUlRfU1lNQk9MKHNuX2RtYV9tYXBwaW5nX2Vycm9yKTsKIAordTY0IHNuX2RtYV9nZXRfcmVxdWlyZWRfbWFzayhzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIERNQV82NEJJVF9NQVNLOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc25fZG1hX2dldF9yZXF1aXJlZF9tYXNrKTsKKwogY2hhciAqc25fcGNpX2dldF9sZWdhY3lfbWVtKHN0cnVjdCBwY2lfYnVzICpidXMpCiB7CiAJaWYgKCFTTl9QQ0lCVVNfQlVTU09GVChidXMpKQpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L3hlbi90aW1lLmMgYi9hcmNoL2lhNjQveGVuL3RpbWUuYwppbmRleCBkMTVhOTRjLi42OGQ2MjA0IDEwMDY0NAotLS0gYS9hcmNoL2lhNjQveGVuL3RpbWUuYworKysgYi9hcmNoL2lhNjQveGVuL3RpbWUuYwpAQCAtMTI5LDggKzEyOSw4IEBACiAJCWJsb2NrZWQgPSBzdG9sZW50aWNrOwogCiAJaWYgKHN0b2xlbiA+IDAgfHwgYmxvY2tlZCA+IDApIHsKLQkJYWNjb3VudF9zdGVhbF90aW1lKE5VTEwsIGppZmZpZXNfdG9fY3B1dGltZShzdG9sZW4pKTsKLQkJYWNjb3VudF9zdGVhbF90aW1lKGlkbGVfdGFzayhjcHUpLCBqaWZmaWVzX3RvX2NwdXRpbWUoYmxvY2tlZCkpOworCQlhY2NvdW50X3N0ZWFsX3RpY2tzKHN0b2xlbik7CisJCWFjY291bnRfaWRsZV90aWNrcyhibG9ja2VkKTsKIAkJcnVuX2xvY2FsX3RpbWVycygpOwogCiAJCWlmIChyY3VfcGVuZGluZyhjcHUpKQpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL0tjb25maWcgYi9hcmNoL202OGsvS2NvbmZpZwppbmRleCBjODI1YmRlLi5mYjg3YzA4IDEwMDY0NAotLS0gYS9hcmNoL202OGsvS2NvbmZpZworKysgYi9hcmNoL202OGsvS2NvbmZpZwpAQCAtMzAzLDcgKzMwMyw3IEBACiAJICBjb3JyZWN0IHJvdW5kaW5nLCB0aGUgZW11bGF0b3IgY2FuIChvZnRlbikgZG8gdGhlIHNhbWUgYnV0IHRoaXMKIAkgIGV4dHJhIGNhbGN1bGF0aW9uIGNhbiBjb3N0IHF1aXRlIHNvbWUgdGltZSwgc28geW91IGNhbiBkaXNhYmxlCiAJICBpdCBoZXJlLiBUaGUgZW11bGF0b3Igd2lsbCB0aGVuICJvbmx5IiBjYWxjdWxhdGUgd2l0aCBhIDY0IGJpdAotCSAgbWFudGlzc2EgYW5kIHJvdW5kIHNsaWdodGx5IGluY29ycmVjdCwgd2hhdCBpcyBtb3JlIHRoZW4gZW5vdWdoCisJICBtYW50aXNzYSBhbmQgcm91bmQgc2xpZ2h0bHkgaW5jb3JyZWN0LCB3aGF0IGlzIG1vcmUgdGhhbiBlbm91Z2gKIAkgIGZvciBub3JtYWwgdXNhZ2UuCiAKIGNvbmZpZyBNNjhLRlBVX0VNVV9PTkxZCmRpZmYgLS1naXQgYS9hcmNoL202OGsvYW1pZ2EvYW1paW50cy5jIGIvYXJjaC9tNjhrL2FtaWdhL2FtaWludHMuYwppbmRleCA5MDdhNTUzLi5jNWI1MjEyIDEwMDY0NAotLS0gYS9hcmNoL202OGsvYW1pZ2EvYW1paW50cy5jCisrKyBiL2FyY2gvbTY4ay9hbWlnYS9hbWlpbnRzLmMKQEAgLTcyLDEwICs3MiwxNCBAQAogCiB2b2lkIF9faW5pdCBhbWlnYV9pbml0X0lSUSh2b2lkKQogewotCXJlcXVlc3RfaXJxKElSUV9BVVRPXzEsIGFtaV9pbnQxLCAwLCAiaW50MSIsIE5VTEwpOwotCXJlcXVlc3RfaXJxKElSUV9BVVRPXzMsIGFtaV9pbnQzLCAwLCAiaW50MyIsIE5VTEwpOwotCXJlcXVlc3RfaXJxKElSUV9BVVRPXzQsIGFtaV9pbnQ0LCAwLCAiaW50NCIsIE5VTEwpOwotCXJlcXVlc3RfaXJxKElSUV9BVVRPXzUsIGFtaV9pbnQ1LCAwLCAiaW50NSIsIE5VTEwpOworCWlmIChyZXF1ZXN0X2lycShJUlFfQVVUT18xLCBhbWlfaW50MSwgMCwgImludDEiLCBOVUxMKSkKKwkJcHJfZXJyKCJDb3VsZG4ndCByZWdpc3RlciBpbnQlZFxuIiwgMSk7CisJaWYgKHJlcXVlc3RfaXJxKElSUV9BVVRPXzMsIGFtaV9pbnQzLCAwLCAiaW50MyIsIE5VTEwpKQorCQlwcl9lcnIoIkNvdWxkbid0IHJlZ2lzdGVyIGludCVkXG4iLCAzKTsKKwlpZiAocmVxdWVzdF9pcnEoSVJRX0FVVE9fNCwgYW1pX2ludDQsIDAsICJpbnQ0IiwgTlVMTCkpCisJCXByX2VycigiQ291bGRuJ3QgcmVnaXN0ZXIgaW50JWRcbiIsIDQpOworCWlmIChyZXF1ZXN0X2lycShJUlFfQVVUT181LCBhbWlfaW50NSwgMCwgImludDUiLCBOVUxMKSkKKwkJcHJfZXJyKCJDb3VsZG4ndCByZWdpc3RlciBpbnQlZFxuIiwgNSk7CiAKIAltNjhrX3NldHVwX2lycV9jb250cm9sbGVyKCZhbWlnYV9pcnFfY29udHJvbGxlciwgSVJRX1VTRVIsIEFNSV9TVERfSVJRUyk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9hbWlnYS9jaWEuYyBiL2FyY2gvbTY4ay9hbWlnYS9jaWEuYwppbmRleCAzNDNmYWI0Li5lY2QwZjdjIDEwMDY0NAotLS0gYS9hcmNoL202OGsvYW1pZ2EvY2lhLmMKKysrIGIvYXJjaC9tNjhrL2FtaWdhL2NpYS5jCkBAIC0xNzYsNSArMTc2LDcgQEAKIAkvKiBvdmVycmlkZSBhdXRvIGludCBhbmQgaW5zdGFsbCBDSUEgaGFuZGxlciAqLwogCW02OGtfc2V0dXBfaXJxX2NvbnRyb2xsZXIoJmF1dG9faXJxX2NvbnRyb2xsZXIsIGJhc2UtPmhhbmRsZXJfaXJxLCAxKTsKIAltNjhrX2lycV9zdGFydHVwKGJhc2UtPmhhbmRsZXJfaXJxKTsKLQlyZXF1ZXN0X2lycShiYXNlLT5oYW5kbGVyX2lycSwgY2lhX2hhbmRsZXIsIElSUUZfU0hBUkVELCBiYXNlLT5uYW1lLCBiYXNlKTsKKwlpZiAocmVxdWVzdF9pcnEoYmFzZS0+aGFuZGxlcl9pcnEsIGNpYV9oYW5kbGVyLCBJUlFGX1NIQVJFRCwKKwkJCWJhc2UtPm5hbWUsIGJhc2UpKQorCQlwcl9lcnIoIkNvdWxkbid0IHJlZ2lzdGVyICVzIGludGVycnVwdFxuIiwgYmFzZS0+bmFtZSk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL202OGsvYW1pZ2EvY29uZmlnLmMgYi9hcmNoL202OGsvYW1pZ2EvY29uZmlnLmMKaW5kZXggYWI5ODYyYy4uNmU1NjI3NSAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2FtaWdhL2NvbmZpZy5jCisrKyBiL2FyY2gvbTY4ay9hbWlnYS9jb25maWcuYwpAQCAtNDkzLDcgKzQ5Myw4IEBACiAJICogUGxlYXNlIGRvbid0IGNoYW5nZSB0aGlzIHRvIHVzZSBjaWFhLCBhcyBpdCBpbnRlcmZlcmVzIHdpdGggdGhlCiAJICogU0NTSSBjb2RlLiBXZSdsbCBoYXZlIHRvIHRha2UgYSBsb29rIGF0IHRoaXMgbGF0ZXIKIAkgKi8KLQlyZXF1ZXN0X2lycShJUlFfQU1JR0FfQ0lBQl9UQSwgdGltZXJfcm91dGluZSwgMCwgInRpbWVyIiwgTlVMTCk7CisJaWYgKHJlcXVlc3RfaXJxKElSUV9BTUlHQV9DSUFCX1RBLCB0aW1lcl9yb3V0aW5lLCAwLCAidGltZXIiLCBOVUxMKSkKKwkJcHJfZXJyKCJDb3VsZG4ndCByZWdpc3RlciB0aW1lciBpbnRlcnJ1cHRcbiIpOwogCS8qIHN0YXJ0IHRpbWVyICovCiAJY2lhYi5jcmEgfD0gMHgxMTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9hcG9sbG8vY29uZmlnLmMgYi9hcmNoL202OGsvYXBvbGxvL2NvbmZpZy5jCmluZGV4IDc4ZGY5OGYuLjhkM2VhZmEgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9hcG9sbG8vY29uZmlnLmMKKysrIGIvYXJjaC9tNjhrL2Fwb2xsby9jb25maWcuYwpAQCAtMzEsMTAgKzMxLDYgQEAKIGV4dGVybiBpbnQgZG5fZHVtbXlfaHdjbGsoaW50LCBzdHJ1Y3QgcnRjX3RpbWUgKik7CiBleHRlcm4gaW50IGRuX2R1bW15X3NldF9jbG9ja19tbXNzKHVuc2lnbmVkIGxvbmcpOwogZXh0ZXJuIHZvaWQgZG5fZHVtbXlfcmVzZXQodm9pZCk7Ci1leHRlcm4gdm9pZCBkbl9kdW1teV93YWl0YnV0KHZvaWQpOwotZXh0ZXJuIHN0cnVjdCBmYl9pbmZvICpkbl9mYl9pbml0KGxvbmcgKik7Ci1leHRlcm4gdm9pZCBkbl9kdW1teV9kZWJ1Z19pbml0KHZvaWQpOwotZXh0ZXJuIGlycXJldHVybl90IGRuX3Byb2Nlc3NfaW50KGludCBpcnEsIHN0cnVjdCBwdF9yZWdzICpmcCk7CiAjaWZkZWYgQ09ORklHX0hFQVJUQkVBVAogc3RhdGljIHZvaWQgZG5faGVhcnRiZWF0KGludCBvbik7CiAjZW5kaWYKQEAgLTIwNCw3ICsyMDAsOCBAQAogCXByaW50aygiKigweDEwODAzKSAlMDJ4XG4iLCoodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKSh0aW1lcisweDMpKTsKICNlbmRpZgogCi0JcmVxdWVzdF9pcnEoSVJRX0FQT0xMTywgZG5fdGltZXJfaW50LCAwLCAidGltZSIsIHRpbWVyX3JvdXRpbmUpOworCWlmIChyZXF1ZXN0X2lycShJUlFfQVBPTExPLCBkbl90aW1lcl9pbnQsIDAsICJ0aW1lIiwgdGltZXJfcm91dGluZSkpCisJCXByX2VycigiQ291bGRuJ3QgcmVnaXN0ZXIgdGltZXIgaW50ZXJydXB0XG4iKTsKIH0KIAogdW5zaWduZWQgbG9uZyBkbl9nZXR0aW1lb2Zmc2V0KHZvaWQpIHsKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9hdGFyaS9hdGFrZXliLmMgYi9hcmNoL202OGsvYXRhcmkvYXRha2V5Yi5jCmluZGV4IGMwMzhiN2MuLmE1ZjMzYzAgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9hdGFyaS9hdGFrZXliLmMKKysrIGIvYXJjaC9tNjhrL2F0YXJpL2F0YWtleWIuYwpAQCAtMzMsNyArMzMsNiBAQAogI2luY2x1ZGUgPGFzbS9hdGFyaV9qb3lzdGljay5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KIAotZXh0ZXJuIHVuc2lnbmVkIGludCBrZXltYXBfY291bnQ7CiAKIC8qIEhvb2sgZm9yIE1JREkgc2VyaWFsIGRyaXZlciAqLwogdm9pZCAoKmF0YXJpX01JRElfaW50ZXJydXB0X2hvb2spICh2b2lkKTsKQEAgLTU2NywxNCArNTY2LDE5IEBACiAKIGludCBhdGFyaV9rZXliX2luaXQodm9pZCkKIHsKKwlpbnQgZXJyb3I7CisKIAlpZiAoYXRhcmlfa2V5Yl9kb25lKQogCQlyZXR1cm4gMDsKIAogCWtiX3N0YXRlLnN0YXRlID0gS0VZQk9BUkQ7CiAJa2Jfc3RhdGUubGVuID0gMDsKIAotCXJlcXVlc3RfaXJxKElSUV9NRlBfQUNJQSwgYXRhcmlfa2V5Ym9hcmRfaW50ZXJydXB0LCBJUlFfVFlQRV9TTE9XLAotCQkgICAgImtleWJvYXJkL21vdXNlL01JREkiLCBhdGFyaV9rZXlib2FyZF9pbnRlcnJ1cHQpOworCWVycm9yID0gcmVxdWVzdF9pcnEoSVJRX01GUF9BQ0lBLCBhdGFyaV9rZXlib2FyZF9pbnRlcnJ1cHQsCisJCQkgICAgSVJRX1RZUEVfU0xPVywgImtleWJvYXJkL21vdXNlL01JREkiLAorCQkJICAgIGF0YXJpX2tleWJvYXJkX2ludGVycnVwdCk7CisJaWYgKGVycm9yKQorCQlyZXR1cm4gZXJyb3I7CiAKIAlhdGFyaV90dXJub2ZmX2lycShJUlFfTUZQX0FDSUEpOwogCWRvIHsKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9hdGFyaS9zdGRtYS5jIGIvYXJjaC9tNjhrL2F0YXJpL3N0ZG1hLmMKaW5kZXggZDFiZDAyOS4uNjA0MzI5ZiAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2F0YXJpL3N0ZG1hLmMKKysrIGIvYXJjaC9tNjhrL2F0YXJpL3N0ZG1hLmMKQEAgLTE3OSw4ICsxNzksOSBAQAogdm9pZCBfX2luaXQgc3RkbWFfaW5pdCh2b2lkKQogewogCXN0ZG1hX2lzciA9IE5VTEw7Ci0JcmVxdWVzdF9pcnEoSVJRX01GUF9GREMsIHN0ZG1hX2ludCwgSVJRX1RZUEVfU0xPVyB8IElSUUZfU0hBUkVELAotCSAgICAgICAgICAgICJTVC1ETUE6IGZsb3BweS9BQ1NJL0lERS9GYWxjb24tU0NTSSIsIHN0ZG1hX2ludCk7CisJaWYgKHJlcXVlc3RfaXJxKElSUV9NRlBfRkRDLCBzdGRtYV9pbnQsIElSUV9UWVBFX1NMT1cgfCBJUlFGX1NIQVJFRCwKKwkJCSJTVC1ETUE6IGZsb3BweS9BQ1NJL0lERS9GYWxjb24tU0NTSSIsIHN0ZG1hX2ludCkpCisJCXByX2VycigiQ291bGRuJ3QgcmVnaXN0ZXIgU1QtRE1BIGludGVycnVwdFxuIik7CiB9CiAKIApkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2F0YXJpL3RpbWUuYyBiL2FyY2gvbTY4ay9hdGFyaS90aW1lLmMKaW5kZXggMWVkZGUyNy4uZDA3NmZmOCAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2F0YXJpL3RpbWUuYworKysgYi9hcmNoL202OGsvYXRhcmkvdGltZS5jCkBAIC0zMSw4ICszMSw5IEBACiAgICAgLyogc3RhcnQgdGltZXIgQywgZGl2ID0gMToxMDAgKi8KICAgICBtZnAudGltX2N0X2NkID0gKG1mcC50aW1fY3RfY2QgJiAxNSkgfCAweDYwOwogICAgIC8qIGluc3RhbGwgaW50ZXJydXB0IHNlcnZpY2Ugcm91dGluZSBmb3IgTUZQIFRpbWVyIEMgKi8KLSAgICByZXF1ZXN0X2lycShJUlFfTUZQX1RJTUMsIHRpbWVyX3JvdXRpbmUsIElSUV9UWVBFX1NMT1csCi0gICAgICAgICAgICAgICAgInRpbWVyIiwgdGltZXJfcm91dGluZSk7CisgICAgaWYgKHJlcXVlc3RfaXJxKElSUV9NRlBfVElNQywgdGltZXJfcm91dGluZSwgSVJRX1RZUEVfU0xPVywKKwkJICAgICJ0aW1lciIsIHRpbWVyX3JvdXRpbmUpKQorCXByX2VycigiQ291bGRuJ3QgcmVnaXN0ZXIgdGltZXIgaW50ZXJydXB0XG4iKTsKIH0KIAogLyogKythbmRyZWFzOiBnZXR0aW1lb2Zmc2V0IGZpeGVkIHRvIGNoZWNrIGZvciBwZW5kaW5nIGludGVycnVwdCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2J2bWU2MDAwL2NvbmZpZy5jIGIvYXJjaC9tNjhrL2J2bWU2MDAwL2NvbmZpZy5jCmluZGV4IGMwNzI1OTUuLjlmZTZmZWYgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9idm1lNjAwMC9jb25maWcuYworKysgYi9hcmNoL202OGsvYnZtZTYwMDAvY29uZmlnLmMKQEAgLTQzLDcgKzQzLDYgQEAKIGV4dGVybiBpbnQgYnZtZTYwMDBfaHdjbGsgKGludCwgc3RydWN0IHJ0Y190aW1lICopOwogZXh0ZXJuIGludCBidm1lNjAwMF9zZXRfY2xvY2tfbW1zcyAodW5zaWduZWQgbG9uZyk7CiBleHRlcm4gdm9pZCBidm1lNjAwMF9yZXNldCAodm9pZCk7Ci1leHRlcm4gdm9pZCBidm1lNjAwMF93YWl0YnV0KHZvaWQpOwogdm9pZCBidm1lNjAwMF9zZXRfdmVjdG9ycyAodm9pZCk7CiAKIC8qIFNhdmUgdGljayBoYW5kbGVyIHJvdXRpbmUgcG9pbnRlciwgd2lsbCBwb2ludCB0byBkb190aW1lcigpIGluCmRpZmYgLS1naXQgYS9hcmNoL202OGsvaHAzMDAvdGltZS5jIGIvYXJjaC9tNjhrL2hwMzAwL3RpbWUuYwppbmRleCBkZDdjOGEyLi5mNjMxMmM3IDEwMDY0NAotLS0gYS9hcmNoL202OGsvaHAzMDAvdGltZS5jCisrKyBiL2FyY2gvbTY4ay9ocDMwMC90aW1lLmMKQEAgLTcwLDcgKzcwLDggQEAKIAogICBhc20gdm9sYXRpbGUoIiBtb3ZwdyAlMCwlMUAoNSkiIDogOiAiZCIgKElOVFZBTCksICJhIiAoQ0xPQ0tCQVNFKSk7CiAKLSAgcmVxdWVzdF9pcnEoSVJRX0FVVE9fNiwgaHAzMDBfdGljaywgSVJRX0ZMR19TVEQsICJ0aW1lciB0aWNrIiwgdmVjdG9yKTsKKyAgaWYgKHJlcXVlc3RfaXJxKElSUV9BVVRPXzYsIGhwMzAwX3RpY2ssIElSUV9GTEdfU1RELCAidGltZXIgdGljayIsIHZlY3RvcikpCisgICAgcHJfZXJyKCJDb3VsZG4ndCByZWdpc3RlciB0aW1lciBpbnRlcnJ1cHRcbiIpOwogCiAgIG91dF84KENMT0NLQkFTRSArIENMS0NSMiwgMHgxKTsJCS8qIHNlbGVjdCBDUjEgKi8KICAgb3V0XzgoQ0xPQ0tCQVNFICsgQ0xLQ1IxLCAweDQwKTsJCS8qIGVuYWJsZSBpcnEgKi8KZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9rZXJuZWwvLmdpdGlnbm9yZSBiL2FyY2gvbTY4ay9rZXJuZWwvLmdpdGlnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNWY2NzZjCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9tNjhrL2tlcm5lbC8uZ2l0aWdub3JlCkBAIC0wLDAgKzEgQEAKK3ZtbGludXgubGRzCmRpZmYgLS1naXQgYS9hcmNoL202OGsva2VybmVsL2VudHJ5LlMgYi9hcmNoL202OGsva2VybmVsL2VudHJ5LlMKaW5kZXggZjI4NDA0ZC4uNWMzMzJmMiAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2tlcm5lbC9lbnRyeS5TCisrKyBiL2FyY2gvbTY4ay9rZXJuZWwvZW50cnkuUwpAQCAtNDI0LDcgKzQyNCw3IEBACiAuZGF0YQogQUxJR04KIHN5c19jYWxsX3RhYmxlOgotCS5sb25nIHN5c19uaV9zeXNjYWxsCS8qIDAgIC0gIG9sZCAic2V0dXAoKSIgc3lzdGVtIGNhbGwqLworCS5sb25nIHN5c19yZXN0YXJ0X3N5c2NhbGwJLyogMCAtIG9sZCAic2V0dXAoKSIgc3lzdGVtIGNhbGwsIHVzZWQgZm9yIHJlc3RhcnRpbmcgKi8KIAkubG9uZyBzeXNfZXhpdAogCS5sb25nIHN5c19mb3JrCiAJLmxvbmcgc3lzX3JlYWQKQEAgLTUxMyw3ICs1MTMsNyBAQAogCS5sb25nIHN5c191c2VsaWIKIAkubG9uZyBzeXNfc3dhcG9uCiAJLmxvbmcgc3lzX3JlYm9vdAotCS5sb25nIG9sZF9yZWFkZGlyCisJLmxvbmcgc3lzX29sZF9yZWFkZGlyCiAJLmxvbmcgb2xkX21tYXAJCS8qIDkwICovCiAJLmxvbmcgc3lzX211bm1hcAogCS5sb25nIHN5c190cnVuY2F0ZQpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2tlcm5lbC9zZXR1cC5jIGIvYXJjaC9tNjhrL2tlcm5lbC9zZXR1cC5jCmluZGV4IDRkOTdiZDIuLjMwMzczMGEgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9rZXJuZWwvc2V0dXAuYworKysgYi9hcmNoL202OGsva2VybmVsL3NldHVwLmMKQEAgLTI2LDYgKzI2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0cmQuaD4KIAogI2luY2x1ZGUgPGFzbS9ib290aW5mby5oPgorI2luY2x1ZGUgPGFzbS9zZWN0aW9ucy5oPgogI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgogI2luY2x1ZGUgPGFzbS9mcHUuaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+CkBAIC02Miw3ICs2Myw2IEBACiBpbnQgbTY4a19pczA0MG9yMDYwOwogRVhQT1JUX1NZTUJPTChtNjhrX2lzMDQwb3IwNjApOwogCi1leHRlcm4gaW50IGVuZDsKIGV4dGVybiB1bnNpZ25lZCBsb25nIGF2YWlsbWVtOwogCiBpbnQgbTY4a19udW1fbWVtb3J5OwpAQCAtMjE1LDExICsyMTUsMTAgQEAKIAogdm9pZCBfX2luaXQgc2V0dXBfYXJjaChjaGFyICoqY21kbGluZV9wKQogewotCWV4dGVybiBpbnQgX2V0ZXh0LCBfZWRhdGEsIF9lbmQ7CiAJaW50IGk7CiAKIAkvKiBUaGUgYm9vdGluZm8gaXMgbG9jYXRlZCByaWdodCBhZnRlciB0aGUga2VybmVsIGJzcyAqLwotCW02OGtfcGFyc2VfYm9vdGluZm8oKGNvbnN0IHN0cnVjdCBiaV9yZWNvcmQgKikmX2VuZCk7CisJbTY4a19wYXJzZV9ib290aW5mbygoY29uc3Qgc3RydWN0IGJpX3JlY29yZCAqKV9lbmQpOwogCiAJaWYgKENQVV9JU18wNDApCiAJCW02OGtfaXMwNDBvcjA2MCA9IDQ7CkBAIC0yNTIsOSArMjUxLDkgQEAKIAl9CiAKIAlpbml0X21tLnN0YXJ0X2NvZGUgPSBQQUdFX09GRlNFVDsKLQlpbml0X21tLmVuZF9jb2RlID0gKHVuc2lnbmVkIGxvbmcpICZfZXRleHQ7Ci0JaW5pdF9tbS5lbmRfZGF0YSA9ICh1bnNpZ25lZCBsb25nKSAmX2VkYXRhOwotCWluaXRfbW0uYnJrID0gKHVuc2lnbmVkIGxvbmcpICZfZW5kOworCWluaXRfbW0uZW5kX2NvZGUgPSAodW5zaWduZWQgbG9uZylfZXRleHQ7CisJaW5pdF9tbS5lbmRfZGF0YSA9ICh1bnNpZ25lZCBsb25nKV9lZGF0YTsKKwlpbml0X21tLmJyayA9ICh1bnNpZ25lZCBsb25nKV9lbmQ7CiAKIAkqY21kbGluZV9wID0gbTY4a19jb21tYW5kX2xpbmU7CiAJbWVtY3B5KGJvb3RfY29tbWFuZF9saW5lLCAqY21kbGluZV9wLCBDTF9TSVpFKTsKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9rZXJuZWwvc2lnbmFsLmMgYi9hcmNoL202OGsva2VybmVsL3NpZ25hbC5jCmluZGV4IGY5YWY4OTMuLmRlMmQwNWQgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9rZXJuZWwvc2lnbmFsLmMKKysrIGIvYXJjaC9tNjhrL2tlcm5lbC9zaWduYWwuYwpAQCAtMzI2LDYgKzMyNiw5IEBACiAJc3RydWN0IHNpZ2NvbnRleHQgY29udGV4dDsKIAlpbnQgZXJyOwogCisJLyogQWx3YXlzIG1ha2UgYW55IHBlbmRpbmcgcmVzdGFydGVkIHN5c3RlbSBjYWxscyByZXR1cm4gLUVJTlRSICovCisJY3VycmVudF90aHJlYWRfaW5mbygpLT5yZXN0YXJ0X2Jsb2NrLmZuID0gZG9fbm9fcmVzdGFydF9zeXNjYWxsOworCiAJLyogZ2V0IHByZXZpb3VzIGNvbnRleHQgKi8KIAlpZiAoY29weV9mcm9tX3VzZXIoJmNvbnRleHQsIHVzYywgc2l6ZW9mKGNvbnRleHQpKSkKIAkJZ290byBiYWRmcmFtZTsKQEAgLTQxMSw2ICs0MTQsOSBAQAogCXVuc2lnbmVkIGxvbmcgdXNwOwogCWludCBlcnI7CiAKKwkvKiBBbHdheXMgbWFrZSBhbnkgcGVuZGluZyByZXN0YXJ0ZWQgc3lzdGVtIGNhbGxzIHJldHVybiAtRUlOVFIgKi8KKwljdXJyZW50X3RocmVhZF9pbmZvKCktPnJlc3RhcnRfYmxvY2suZm4gPSBkb19ub19yZXN0YXJ0X3N5c2NhbGw7CisKIAllcnIgPSBfX2dldF91c2VyKHRlbXAsICZ1Yy0+dWNfbWNvbnRleHQudmVyc2lvbik7CiAJaWYgKHRlbXAgIT0gTUNPTlRFWFRfVkVSU0lPTikKIAkJZ290byBiYWRmcmFtZTsKQEAgLTkzNyw2ICs5NDMsMTUgQEAKIAkJcmVncy0+ZDAgPSAtRUlOVFI7CiAJCWJyZWFrOwogCisJY2FzZSAtRVJFU1RBUlRfUkVTVEFSVEJMT0NLOgorCQlpZiAoIWhhc19oYW5kbGVyKSB7CisJCQlyZWdzLT5kMCA9IF9fTlJfcmVzdGFydF9zeXNjYWxsOworCQkJcmVncy0+cGMgLT0gMjsKKwkJCWJyZWFrOworCQl9CisJCXJlZ3MtPmQwID0gLUVJTlRSOworCQlicmVhazsKKwogCWNhc2UgLUVSRVNUQVJUU1lTOgogCQlpZiAoaGFzX2hhbmRsZXIgJiYgIShrYS0+c2Euc2FfZmxhZ3MgJiBTQV9SRVNUQVJUKSkgewogCQkJcmVncy0+ZDAgPSAtRUlOVFI7CmRpZmYgLS1naXQgYS9hcmNoL202OGsva2VybmVsL3RyYXBzLmMgYi9hcmNoL202OGsva2VybmVsL3RyYXBzLmMKaW5kZXggNmQ4MTNkZS4uMTg0YWNjOSAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2tlcm5lbC90cmFwcy5jCisrKyBiL2FyY2gvbTY4ay9rZXJuZWwvdHJhcHMuYwpAQCAtNDAxLDcgKzQwMSw3IEBACiAgKiBjYWxsZWQgZnJvbSBzaWdyZXR1cm4oKSwgbXVzdCBlbnN1cmUgdXNlcnNwYWNlIGNvZGUgZGlkbid0CiAgKiBtYW5pcHVsYXRlIGV4Y2VwdGlvbiBmcmFtZSB0byBjaXJjdW12ZW50IHByb3RlY3Rpb24sIHRoZW4gY29tcGxldGUKICAqIHBlbmRpbmcgd3JpdGViYWNrcwotICogd2UganVzdCBjbGVhciBUTTIgdG8gdHVybiBpdCBpbnRvIGFuIHVzZXJzcGFjZSBhY2Nlc3MKKyAqIHdlIGp1c3QgY2xlYXIgVE0yIHRvIHR1cm4gaXQgaW50byBhIHVzZXJzcGFjZSBhY2Nlc3MKICAqLwogYXNtbGlua2FnZSB2b2lkIGJlcnJfMDQwY2xlYW51cChzdHJ1Y3QgZnJhbWUgKmZwKQogewpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2tlcm5lbC92bWxpbnV4LXN1bjMubGRzIGIvYXJjaC9tNjhrL2tlcm5lbC92bWxpbnV4LXN1bjMubGRzCmluZGV4IDhhNDkxOWUuLmQ5MzY4YzAgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9rZXJuZWwvdm1saW51eC1zdW4zLmxkcworKysgYi9hcmNoL202OGsva2VybmVsL3ZtbGludXgtc3VuMy5sZHMKQEAgLTMzLDYgKzMzLDcgQEAKIAl9IDpkYXRhCiAgIC8qIEVuZCBvZiBkYXRhIGdvZXMgKmhlcmUqIHNvIHRoYXQgZnJlZWluZyBpbml0IGNvZGUgd29ya3MgcHJvcGVybHkuICovCiAgIF9lZGF0YSA9IC47CisgIE5PVEVTCiAKICAgLyogd2lsbCBiZSBmcmVlZCBhZnRlciBpbml0ICovCiAgIC4gPSBBTElHTihQQUdFX1NJWkUpOwkvKiBJbml0IGNvZGUgYW5kIGRhdGEgKi8KZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9tYWMvYmFib29uLmMgYi9hcmNoL202OGsvbWFjL2JhYm9vbi5jCmluZGV4IDI0NWQxNmQuLjJhOTZiZWIgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9tYWMvYmFib29uLmMKKysrIGIvYXJjaC9tNjhrL21hYy9iYWJvb24uYwpAQCAtOTIsNyArOTIsOCBAQAogdm9pZCBfX2luaXQgYmFib29uX3JlZ2lzdGVyX2ludGVycnVwdHModm9pZCkKIHsKIAliYWJvb25fZGlzYWJsZWQgPSAwOwotCXJlcXVlc3RfaXJxKElSUV9OVUJVU19DLCBiYWJvb25faXJxLCAwLCAiYmFib29uIiwgKHZvaWQgKiliYWJvb24pOworCWlmIChyZXF1ZXN0X2lycShJUlFfTlVCVVNfQywgYmFib29uX2lycSwgMCwgImJhYm9vbiIsICh2b2lkICopYmFib29uKSkKKwkJcHJfZXJyKCJDb3VsZG4ndCByZWdpc3RlciBiYWJvb24gaW50ZXJydXB0XG4iKTsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9tYWMvY29uZmlnLmMgYi9hcmNoL202OGsvbWFjL2NvbmZpZy5jCmluZGV4IDg4MTliOTcuLjk4YjZiY2YgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9tYWMvY29uZmlnLmMKKysrIGIvYXJjaC9tNjhrL21hYy9jb25maWcuYwpAQCAtNDcsMTMgKzQ3LDYgQEAKIAogc3RydWN0IG1hY19ib290ZXJfZGF0YSBtYWNfYmlfZGF0YTsKIAotLyogTmV3IG02OGsgYm9vdGluZm8gc3R1ZmYgYW5kIHZpZGVvYmFzZSAqLwotCi1leHRlcm4gaW50IG02OGtfbnVtX21lbW9yeTsKLWV4dGVybiBzdHJ1Y3QgbWVtX2luZm8gbTY4a19tZW1vcnlbTlVNX01FTUlORk9dOwotCi1leHRlcm4gc3RydWN0IG1lbV9pbmZvIG02OGtfcmFtZGlzazsKLQogLyogVGhlIHBoeXMuIHZpZGVvIGFkZHIuIC0gbWlnaHQgYmUgYm9ndXMgb24gc29tZSBtYWNoaW5lcyAqLwogc3RhdGljIHVuc2lnbmVkIGxvbmcgbWFjX29yaWdfdmlkZW9hZGRyOwogCkBAIC02MSw3ICs1NCw2IEBACiBleHRlcm4gdW5zaWduZWQgbG9uZyBtYWNfZ2V0dGltZW9mZnNldCh2b2lkKTsKIGV4dGVybiBpbnQgbWFjX2h3Y2xrKGludCwgc3RydWN0IHJ0Y190aW1lICopOwogZXh0ZXJuIGludCBtYWNfc2V0X2Nsb2NrX21tc3ModW5zaWduZWQgbG9uZyk7Ci1leHRlcm4gaW50IHNob3dfbWFjX2ludGVycnVwdHMoc3RydWN0IHNlcV9maWxlICosIHZvaWQgKik7CiBleHRlcm4gdm9pZCBpb3BfcHJlaW5pdCh2b2lkKTsKIGV4dGVybiB2b2lkIGlvcF9pbml0KHZvaWQpOwogZXh0ZXJuIHZvaWQgdmlhX2luaXQodm9pZCk7CkBAIC04MDUsMTAgKzc5Nyw2IEBACiAJCW1hY19iaV9kYXRhLmJvb3R0aW1lLCBtYWNfYmlfZGF0YS5nbXRiaWFzKTsKIAlwcmludGsoS0VSTl9ERUJVRyAiIE1hY2hpbmUgSUQ6ICVsZCBDUFVpZDogMHglbHggbWVtb3J5IHNpemU6IDB4JWx4IFxuIiwKIAkJbWFjX2JpX2RhdGEuaWQsIG1hY19iaV9kYXRhLmNwdWlkLCBtYWNfYmlfZGF0YS5tZW1zaXplKTsKLSNpZiAwCi0JcHJpbnRrKCJSYW1kaXNrOiBhZGRyIDB4JWx4IHNpemUgMHglbHhcbiIsCi0JCW02OGtfcmFtZGlzay5hZGRyLCBtNjhrX3JhbWRpc2suc2l6ZSk7Ci0jZW5kaWYKIAogCWlvcF9pbml0KCk7CiAJdmlhX2luaXQoKTsKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9tYWMvZGVidWcuYyBiL2FyY2gvbTY4ay9tYWMvZGVidWcuYwppbmRleCA2NWRkNzdhLi5iY2UwNzRjIDEwMDY0NAotLS0gYS9hcmNoL202OGsvbWFjL2RlYnVnLmMKKysrIGIvYXJjaC9tNjhrL21hYy9kZWJ1Zy5jCkBAIC0yNyw3ICsyNyw2IEBACiAjaW5jbHVkZSA8YXNtL21hY2ludHMuaD4KIAogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgbWFjX3ZpZGVvYmFzZTsKLWV4dGVybiB1bnNpZ25lZCBsb25nIG1hY192aWRlb2RlcHRoOwogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgbWFjX3Jvd2J5dGVzOwogCiBleHRlcm4gdm9pZCBtYWNfc2VyaWFsX3ByaW50KGNvbnN0IGNoYXIgKik7CmRpZmYgLS1naXQgYS9hcmNoL202OGsvbWFjL2lvcC5jIGIvYXJjaC9tNjhrL21hYy9pb3AuYwppbmRleCAzMjZmYjk5Li4xYWQ0ZTlkIDEwMDY0NAotLS0gYS9hcmNoL202OGsvbWFjL2lvcC5jCisrKyBiL2FyY2gvbTY4ay9tYWMvaW9wLmMKQEAgLTMwNSwxNCArMzA1LDE2IEBACiB7CiAJaWYgKGlvcF9pc21fcHJlc2VudCkgewogCQlpZiAob3NzX3ByZXNlbnQpIHsKLQkJCXJlcXVlc3RfaXJxKE9TU19JUlFMRVZfSU9QSVNNLCBpb3BfaXNtX2lycSwKKwkJCWlmIChyZXF1ZXN0X2lycShPU1NfSVJRTEVWX0lPUElTTSwgaW9wX2lzbV9pcnEsCiAJCQkJCUlSUV9GTEdfTE9DSywgIklTTSBJT1AiLAotCQkJCQkodm9pZCAqKSBJT1BfTlVNX0lTTSk7CisJCQkJCSh2b2lkICopIElPUF9OVU1fSVNNKSkKKwkJCQlwcl9lcnIoIkNvdWxkbid0IHJlZ2lzdGVyIElTTSBJT1AgaW50ZXJydXB0XG4iKTsKIAkJCW9zc19pcnFfZW5hYmxlKElSUV9NQUNfQURCKTsKIAkJfSBlbHNlIHsKLQkJCXJlcXVlc3RfaXJxKElSUV9WSUEyXzAsIGlvcF9pc21faXJxLAorCQkJaWYgKHJlcXVlc3RfaXJxKElSUV9WSUEyXzAsIGlvcF9pc21faXJxLAogCQkJCQlJUlFfRkxHX0xPQ0t8SVJRX0ZMR19GQVNULCAiSVNNIElPUCIsCi0JCQkJCSh2b2lkICopIElPUF9OVU1fSVNNKTsKKwkJCQkJKHZvaWQgKikgSU9QX05VTV9JU00pKQorCQkJCXByX2VycigiQ291bGRuJ3QgcmVnaXN0ZXIgSVNNIElPUCBpbnRlcnJ1cHRcbiIpOwogCQl9CiAJCWlmICghaW9wX2FsaXZlKGlvcF9iYXNlW0lPUF9OVU1fSVNNXSkpIHsKIAkJCXByaW50aygiSU9QOiBvaCBteSBnb2QsIHRoZXkga2lsbGVkIHRoZSBJU00gSU9QIVxuIik7CmRpZmYgLS1naXQgYS9hcmNoL202OGsvbWFjL21hY2ludHMuYyBiL2FyY2gvbTY4ay9tYWMvbWFjaW50cy5jCmluZGV4IDgyZTU2MGMuLjIzNzExMDcgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9tYWMvbWFjaW50cy5jCisrKyBiL2FyY2gvbTY4ay9tYWMvbWFjaW50cy5jCkBAIC0xMzQsNiArMTM0LDcgQEAKICNpbmNsdWRlIDxhc20vZXJybm8uaD4KICNpbmNsdWRlIDxhc20vbWFjaW50cy5oPgogI2luY2x1ZGUgPGFzbS9pcnFfcmVncy5oPgorI2luY2x1ZGUgPGFzbS9tYWNfb3NzLmg+CiAKICNkZWZpbmUgREVCVUdfU1BVUklPVVMKICNkZWZpbmUgU0hVVFVQX1NPTklDCkBAIC0xNDYsNyArMTQ3LDYgQEAKICAqIFZJQS9SQlYgaG9va3MKICAqLwogCi1leHRlcm4gdm9pZCB2aWFfaW5pdCh2b2lkKTsKIGV4dGVybiB2b2lkIHZpYV9yZWdpc3Rlcl9pbnRlcnJ1cHRzKHZvaWQpOwogZXh0ZXJuIHZvaWQgdmlhX2lycV9lbmFibGUoaW50KTsKIGV4dGVybiB2b2lkIHZpYV9pcnFfZGlzYWJsZShpbnQpOwpAQCAtMTU3LDkgKzE1Nyw2IEBACiAgKiBPU1MgaG9va3MKICAqLwogCi1leHRlcm4gaW50IG9zc19wcmVzZW50OwotCi1leHRlcm4gdm9pZCBvc3NfaW5pdCh2b2lkKTsKIGV4dGVybiB2b2lkIG9zc19yZWdpc3Rlcl9pbnRlcnJ1cHRzKHZvaWQpOwogZXh0ZXJuIHZvaWQgb3NzX2lycV9lbmFibGUoaW50KTsKIGV4dGVybiB2b2lkIG9zc19pcnFfZGlzYWJsZShpbnQpOwpAQCAtMTcwLDkgKzE2Nyw2IEBACiAgKiBQU0MgaG9va3MKICAqLwogCi1leHRlcm4gaW50IHBzY19wcmVzZW50OwotCi1leHRlcm4gdm9pZCBwc2NfaW5pdCh2b2lkKTsKIGV4dGVybiB2b2lkIHBzY19yZWdpc3Rlcl9pbnRlcnJ1cHRzKHZvaWQpOwogZXh0ZXJuIHZvaWQgcHNjX2lycV9lbmFibGUoaW50KTsKIGV4dGVybiB2b2lkIHBzY19pcnFfZGlzYWJsZShpbnQpOwpAQCAtMTkxLDEyICsxODUsMTAgQEAKIAogZXh0ZXJuIGludCBiYWJvb25fcHJlc2VudDsKIAotZXh0ZXJuIHZvaWQgYmFib29uX2luaXQodm9pZCk7CiBleHRlcm4gdm9pZCBiYWJvb25fcmVnaXN0ZXJfaW50ZXJydXB0cyh2b2lkKTsKIGV4dGVybiB2b2lkIGJhYm9vbl9pcnFfZW5hYmxlKGludCk7CiBleHRlcm4gdm9pZCBiYWJvb25faXJxX2Rpc2FibGUoaW50KTsKIGV4dGVybiB2b2lkIGJhYm9vbl9pcnFfY2xlYXIoaW50KTsKLWV4dGVybiBpbnQgIGJhYm9vbl9pcnFfcGVuZGluZyhpbnQpOwogCiAvKgogICogU0NDIGludGVycnVwdCByb3V0aW5lcwpAQCAtMjU4LDggKzI1MCw5IEBACiAJaWYgKGJhYm9vbl9wcmVzZW50KQogCQliYWJvb25fcmVnaXN0ZXJfaW50ZXJydXB0cygpOwogCWlvcF9yZWdpc3Rlcl9pbnRlcnJ1cHRzKCk7Ci0JcmVxdWVzdF9pcnEoSVJRX0FVVE9fNywgbWFjX25taV9oYW5kbGVyLCAwLCAiTk1JIiwKLQkJCW1hY19ubWlfaGFuZGxlcik7CisJaWYgKHJlcXVlc3RfaXJxKElSUV9BVVRPXzcsIG1hY19ubWlfaGFuZGxlciwgMCwgIk5NSSIsCisJCQltYWNfbm1pX2hhbmRsZXIpKQorCQlwcl9lcnIoIkNvdWxkbid0IHJlZ2lzdGVyIE5NSVxuIik7CiAjaWZkZWYgREVCVUdfTUFDSU5UUwogCXByaW50aygibWFjX2luaXRfSVJRKCk6IERvbmUhXG4iKTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL21hYy9taXNjLmMgYi9hcmNoL202OGsvbWFjL21pc2MuYwppbmRleCBhNDRjNzA4Li41ZDgxODU2OCAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL21hYy9taXNjLmMKKysrIGIvYXJjaC9tNjhrL21hYy9taXNjLmMKQEAgLTM1LDcgKzM1LDYgQEAKIAogI2RlZmluZSBSVENfT0ZGU0VUIDIwODI4NDQ4MDAKIAotZXh0ZXJuIHN0cnVjdCBtYWNfYm9vdGVyX2RhdGEgbWFjX2JpX2RhdGE7CiBzdGF0aWMgdm9pZCAoKnJvbV9yZXNldCkodm9pZCk7CiAKICNpZmRlZiBDT05GSUdfQURCX0NVREEKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9tYWMvb3NzLmMgYi9hcmNoL202OGsvbWFjL29zcy5jCmluZGV4IDg0MjY1MDEuLmYzZDIzZDYgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9tYWMvb3NzLmMKKysrIGIvYXJjaC9tNjhrL21hYy9vc3MuYwpAQCAtNjYsMTYgKzY2LDIxIEBACiAKIHZvaWQgX19pbml0IG9zc19yZWdpc3Rlcl9pbnRlcnJ1cHRzKHZvaWQpCiB7Ci0JcmVxdWVzdF9pcnEoT1NTX0lSUUxFVl9TQ1NJLCBvc3NfaXJxLCBJUlFfRkxHX0xPQ0ssCi0JCQkic2NzaSIsICh2b2lkICopIG9zcyk7Ci0JcmVxdWVzdF9pcnEoT1NTX0lSUUxFVl9JT1BTQ0MsIG1hY19zY2NfZGlzcGF0Y2gsIElSUV9GTEdfTE9DSywKLQkJCSJzY2MiLCBtYWNfc2NjX2Rpc3BhdGNoKTsKLQlyZXF1ZXN0X2lycShPU1NfSVJRTEVWX05VQlVTLCBvc3NfbnVidXNfaXJxLCBJUlFfRkxHX0xPQ0ssCi0JCQkibnVidXMiLCAodm9pZCAqKSBvc3MpOwotCXJlcXVlc3RfaXJxKE9TU19JUlFMRVZfU09VTkQsIG9zc19pcnEsIElSUV9GTEdfTE9DSywKLQkJCSJzb3VuZCIsICh2b2lkICopIG9zcyk7Ci0JcmVxdWVzdF9pcnEoT1NTX0lSUUxFVl9WSUExLCB2aWExX2lycSwgSVJRX0ZMR19MT0NLLAotCQkJInZpYTEiLCAodm9pZCAqKSB2aWExKTsKKwlpZiAocmVxdWVzdF9pcnEoT1NTX0lSUUxFVl9TQ1NJLCBvc3NfaXJxLCBJUlFfRkxHX0xPQ0ssCisJCQkic2NzaSIsICh2b2lkICopIG9zcykpCisJCXByX2VycigiQ291bGRuJ3QgcmVnaXN0ZXIgJXMgaW50ZXJydXB0XG4iLCAic2NzaSIpOworCWlmIChyZXF1ZXN0X2lycShPU1NfSVJRTEVWX0lPUFNDQywgbWFjX3NjY19kaXNwYXRjaCwgSVJRX0ZMR19MT0NLLAorCQkJInNjYyIsIG1hY19zY2NfZGlzcGF0Y2gpKQorCQlwcl9lcnIoIkNvdWxkbid0IHJlZ2lzdGVyICVzIGludGVycnVwdFxuIiwgInNjYyIpOworCWlmIChyZXF1ZXN0X2lycShPU1NfSVJRTEVWX05VQlVTLCBvc3NfbnVidXNfaXJxLCBJUlFfRkxHX0xPQ0ssCisJCQkibnVidXMiLCAodm9pZCAqKSBvc3MpKQorCQlwcl9lcnIoIkNvdWxkbid0IHJlZ2lzdGVyICVzIGludGVycnVwdFxuIiwgIm51YnVzIik7CisJaWYgKHJlcXVlc3RfaXJxKE9TU19JUlFMRVZfU09VTkQsIG9zc19pcnEsIElSUV9GTEdfTE9DSywKKwkJCSJzb3VuZCIsICh2b2lkICopIG9zcykpCisJCXByX2VycigiQ291bGRuJ3QgcmVnaXN0ZXIgJXMgaW50ZXJydXB0XG4iLCAic291bmQiKTsKKwlpZiAocmVxdWVzdF9pcnEoT1NTX0lSUUxFVl9WSUExLCB2aWExX2lycSwgSVJRX0ZMR19MT0NLLAorCQkJInZpYTEiLCAodm9pZCAqKSB2aWExKSkKKwkJcHJfZXJyKCJDb3VsZG4ndCByZWdpc3RlciAlcyBpbnRlcnJ1cHRcbiIsICJ2aWExIik7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9hcmNoL202OGsvbWFjL3BzYy5jIGIvYXJjaC9tNjhrL21hYy9wc2MuYwppbmRleCBmODRhNGRkLi5iYTZjY2FiIDEwMDY0NAotLS0gYS9hcmNoL202OGsvbWFjL3BzYy5jCisrKyBiL2FyY2gvbTY4ay9tYWMvcHNjLmMKQEAgLTExNywxMCArMTE3LDE0IEBACiAKIHZvaWQgX19pbml0IHBzY19yZWdpc3Rlcl9pbnRlcnJ1cHRzKHZvaWQpCiB7Ci0JcmVxdWVzdF9pcnEoSVJRX0FVVE9fMywgcHNjX2lycSwgMCwgInBzYzMiLCAodm9pZCAqKSAweDMwKTsKLQlyZXF1ZXN0X2lycShJUlFfQVVUT180LCBwc2NfaXJxLCAwLCAicHNjNCIsICh2b2lkICopIDB4NDApOwotCXJlcXVlc3RfaXJxKElSUV9BVVRPXzUsIHBzY19pcnEsIDAsICJwc2M1IiwgKHZvaWQgKikgMHg1MCk7Ci0JcmVxdWVzdF9pcnEoSVJRX0FVVE9fNiwgcHNjX2lycSwgMCwgInBzYzYiLCAodm9pZCAqKSAweDYwKTsKKwlpZiAocmVxdWVzdF9pcnEoSVJRX0FVVE9fMywgcHNjX2lycSwgMCwgInBzYzMiLCAodm9pZCAqKSAweDMwKSkKKwkJcHJfZXJyKCJDb3VsZG4ndCByZWdpc3RlciBwc2MlZCBpbnRlcnJ1cHRcbiIsIDMpOworCWlmIChyZXF1ZXN0X2lycShJUlFfQVVUT180LCBwc2NfaXJxLCAwLCAicHNjNCIsICh2b2lkICopIDB4NDApKQorCQlwcl9lcnIoIkNvdWxkbid0IHJlZ2lzdGVyIHBzYyVkIGludGVycnVwdFxuIiwgNCk7CisJaWYgKHJlcXVlc3RfaXJxKElSUV9BVVRPXzUsIHBzY19pcnEsIDAsICJwc2M1IiwgKHZvaWQgKikgMHg1MCkpCisJCXByX2VycigiQ291bGRuJ3QgcmVnaXN0ZXIgcHNjJWQgaW50ZXJydXB0XG4iLCA1KTsKKwlpZiAocmVxdWVzdF9pcnEoSVJRX0FVVE9fNiwgcHNjX2lycSwgMCwgInBzYzYiLCAodm9pZCAqKSAweDYwKSkKKwkJcHJfZXJyKCJDb3VsZG4ndCByZWdpc3RlciBwc2MlZCBpbnRlcnJ1cHRcbiIsIDYpOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL21hYy92aWEuYyBiL2FyY2gvbTY4ay9tYWMvdmlhLmMKaW5kZXggZjAxZDQxOC4uN2Q5N2JhNSAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL21hYy92aWEuYworKysgYi9hcmNoL202OGsvbWFjL3ZpYS5jCkBAIC0zNCw2ICszNCw3IEBACiAjaW5jbHVkZSA8YXNtL21hY2ludHMuaD4KICNpbmNsdWRlIDxhc20vbWFjX3ZpYS5oPgogI2luY2x1ZGUgPGFzbS9tYWNfcHNjLmg+CisjaW5jbHVkZSA8YXNtL21hY19vc3MuaD4KIAogdm9sYXRpbGUgX191OCAqdmlhMSwgKnZpYTI7CiBpbnQgcmJ2X3ByZXNlbnQ7CkBAIC04NCw3ICs4NSw2IEBACiB2b2lkIHZpYV9pcnFfY2xlYXIoaW50IGlycSk7CiAKIGV4dGVybiBpcnFyZXR1cm5fdCBtYWNfc2NjX2Rpc3BhdGNoKGludCwgdm9pZCAqKTsKLWV4dGVybiBpbnQgb3NzX3ByZXNlbnQ7CiAKIC8qCiAgKiBJbml0aWFsaXplIHRoZSBWSUFzCkBAIC0yODMsNyArMjgzLDggQEAKIAl2aWExW3ZUMUNMXSA9IE1BQ19DTE9DS19MT1c7CiAJdmlhMVt2VDFDSF0gPSBNQUNfQ0xPQ0tfSElHSDsKIAotCXJlcXVlc3RfaXJxKElSUV9NQUNfVElNRVJfMSwgZnVuYywgSVJRX0ZMR19MT0NLLCAidGltZXIiLCBmdW5jKTsKKwlpZiAocmVxdWVzdF9pcnEoSVJRX01BQ19USU1FUl8xLCBmdW5jLCBJUlFfRkxHX0xPQ0ssICJ0aW1lciIsIGZ1bmMpKQorCQlwcl9lcnIoIkNvdWxkbid0IHJlZ2lzdGVyICVzIGludGVycnVwdFxuIiwgInRpbWVyIik7CiB9CiAKIC8qCkBAIC0yOTMsMjUgKzI5NCwzMSBAQAogdm9pZCBfX2luaXQgdmlhX3JlZ2lzdGVyX2ludGVycnVwdHModm9pZCkKIHsKIAlpZiAodmlhX2FsdF9tYXBwaW5nKSB7Ci0JCXJlcXVlc3RfaXJxKElSUV9BVVRPXzEsIHZpYTFfaXJxLAorCQlpZiAocmVxdWVzdF9pcnEoSVJRX0FVVE9fMSwgdmlhMV9pcnEsCiAJCQkJSVJRX0ZMR19MT0NLfElSUV9GTEdfRkFTVCwgInNvZnR3YXJlIiwKLQkJCQkodm9pZCAqKSB2aWExKTsKLQkJcmVxdWVzdF9pcnEoSVJRX0FVVE9fNiwgdmlhMV9pcnEsCisJCQkJKHZvaWQgKikgdmlhMSkpCisJCQlwcl9lcnIoIkNvdWxkbid0IHJlZ2lzdGVyICVzIGludGVycnVwdFxuIiwgInNvZnR3YXJlIik7CisJCWlmIChyZXF1ZXN0X2lycShJUlFfQVVUT182LCB2aWExX2lycSwKIAkJCQlJUlFfRkxHX0xPQ0t8SVJRX0ZMR19GQVNULCAidmlhMSIsCi0JCQkJKHZvaWQgKikgdmlhMSk7CisJCQkJKHZvaWQgKikgdmlhMSkpCisJCQlwcl9lcnIoIkNvdWxkbid0IHJlZ2lzdGVyICVzIGludGVycnVwdFxuIiwgInZpYTEiKTsKIAl9IGVsc2UgewotCQlyZXF1ZXN0X2lycShJUlFfQVVUT18xLCB2aWExX2lycSwKKwkJaWYgKHJlcXVlc3RfaXJxKElSUV9BVVRPXzEsIHZpYTFfaXJxLAogCQkJCUlSUV9GTEdfTE9DS3xJUlFfRkxHX0ZBU1QsICJ2aWExIiwKLQkJCQkodm9pZCAqKSB2aWExKTsKKwkJCQkodm9pZCAqKSB2aWExKSkKKwkJCXByX2VycigiQ291bGRuJ3QgcmVnaXN0ZXIgJXMgaW50ZXJydXB0XG4iLCAidmlhMSIpOwogCX0KLQlyZXF1ZXN0X2lycShJUlFfQVVUT18yLCB2aWEyX2lycSwgSVJRX0ZMR19MT0NLfElSUV9GTEdfRkFTVCwKLQkJCSJ2aWEyIiwgKHZvaWQgKikgdmlhMik7CisJaWYgKHJlcXVlc3RfaXJxKElSUV9BVVRPXzIsIHZpYTJfaXJxLCBJUlFfRkxHX0xPQ0t8SVJRX0ZMR19GQVNULAorCQkJInZpYTIiLCAodm9pZCAqKSB2aWEyKSkKKwkJcHJfZXJyKCJDb3VsZG4ndCByZWdpc3RlciAlcyBpbnRlcnJ1cHRcbiIsICJ2aWEyIik7CiAJaWYgKCFwc2NfcHJlc2VudCkgewotCQlyZXF1ZXN0X2lycShJUlFfQVVUT180LCBtYWNfc2NjX2Rpc3BhdGNoLCBJUlFfRkxHX0xPQ0ssCi0JCQkJInNjYyIsIG1hY19zY2NfZGlzcGF0Y2gpOworCQlpZiAocmVxdWVzdF9pcnEoSVJRX0FVVE9fNCwgbWFjX3NjY19kaXNwYXRjaCwgSVJRX0ZMR19MT0NLLAorCQkJCSJzY2MiLCBtYWNfc2NjX2Rpc3BhdGNoKSkKKwkJCXByX2VycigiQ291bGRuJ3QgcmVnaXN0ZXIgJXMgaW50ZXJydXB0XG4iLCAic2NjIik7CiAJfQotCXJlcXVlc3RfaXJxKElSUV9NQUNfTlVCVVMsIHZpYV9udWJ1c19pcnEsIElSUV9GTEdfTE9DS3xJUlFfRkxHX0ZBU1QsCi0JCQkibnVidXMiLCAodm9pZCAqKSB2aWEyKTsKKwlpZiAocmVxdWVzdF9pcnEoSVJRX01BQ19OVUJVUywgdmlhX251YnVzX2lycSwKKwkJCUlSUV9GTEdfTE9DS3xJUlFfRkxHX0ZBU1QsICJudWJ1cyIsICh2b2lkICopIHZpYTIpKQorCQlwcl9lcnIoIkNvdWxkbid0IHJlZ2lzdGVyICVzIGludGVycnVwdFxuIiwgIm51YnVzIik7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9hcmNoL202OGsvbWF0aC1lbXUvZnBfbG9nLmMgYi9hcmNoL202OGsvbWF0aC1lbXUvZnBfbG9nLmMKaW5kZXggYjEwMzNhZS4uMzY3ZWNlZSAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL21hdGgtZW11L2ZwX2xvZy5jCisrKyBiL2FyY2gvbTY4ay9tYXRoLWVtdS9mcF9sb2cuYwpAQCAtMjQsNyArMjQsNiBAQAogCiBleHRlcm4gc3RydWN0IGZwX2V4dCAqZnBfZmFkZChzdHJ1Y3QgZnBfZXh0ICpkZXN0LCBjb25zdCBzdHJ1Y3QgZnBfZXh0ICpzcmMpOwogZXh0ZXJuIHN0cnVjdCBmcF9leHQgKmZwX2ZkaXYoc3RydWN0IGZwX2V4dCAqZGVzdCwgY29uc3Qgc3RydWN0IGZwX2V4dCAqc3JjKTsKLWV4dGVybiBzdHJ1Y3QgZnBfZXh0ICpmcF9mbXVsKHN0cnVjdCBmcF9leHQgKmRlc3QsIGNvbnN0IHN0cnVjdCBmcF9leHQgKnNyYyk7CiAKIHN0cnVjdCBmcF9leHQgKgogZnBfZnNxcnQoc3RydWN0IGZwX2V4dCAqZGVzdCwgc3RydWN0IGZwX2V4dCAqc3JjKQpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL21tL2luaXQuYyBiL2FyY2gvbTY4ay9tbS9pbml0LmMKaW5kZXggODFiYjA4Yy4uMDAwN2IyYSAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL21tL2luaXQuYworKysgYi9hcmNoL202OGsvbW0vaW5pdC5jCkBAIC0yOCw2ICsyOCw3IEBACiAjaWZkZWYgQ09ORklHX0FUQVJJCiAjaW5jbHVkZSA8YXNtL2F0YXJpX3N0cmFtLmg+CiAjZW5kaWYKKyNpbmNsdWRlIDxhc20vc2VjdGlvbnMuaD4KICNpbmNsdWRlIDxhc20vdGxiLmg+CiAKIERFRklORV9QRVJfQ1BVKHN0cnVjdCBtbXVfZ2F0aGVyLCBtbXVfZ2F0aGVycyk7CkBAIC03Myw5ICs3NCw2IEBACiAKIC8qIFJlZmVyZW5jZXMgdG8gc2VjdGlvbiBib3VuZGFyaWVzICovCiAKLWV4dGVybiBjaGFyIF90ZXh0W10sIF9ldGV4dFtdOwotZXh0ZXJuIGNoYXIgX19pbml0X2JlZ2luW10sIF9faW5pdF9lbmRbXTsKLQogZXh0ZXJuIHBtZF90ICp6ZXJvX3BndGFibGU7CiAKIHZvaWQgX19pbml0IG1lbV9pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9hcmNoL202OGsvbW0vbW90b3JvbGEuYyBiL2FyY2gvbTY4ay9tbS9tb3Rvcm9sYS5jCmluZGV4IGM1ZGJiOWIuLjQ2NjVmYzggMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9tbS9tb3Rvcm9sYS5jCisrKyBiL2FyY2gvbTY4ay9tbS9tb3Rvcm9sYS5jCkBAIC0zMCw2ICszMCw3IEBACiAjaWZkZWYgQ09ORklHX0FUQVJJCiAjaW5jbHVkZSA8YXNtL2F0YXJpX3N0cmFtLmg+CiAjZW5kaWYKKyNpbmNsdWRlIDxhc20vc2VjdGlvbnMuaD4KIAogI3VuZGVmIERFQlVHCiAKQEAgLTMwMSwxNCArMzAyLDEyIEBACiAJfQogfQogCi1leHRlcm4gY2hhciBfX2luaXRfYmVnaW4sIF9faW5pdF9lbmQ7Ci0KIHZvaWQgZnJlZV9pbml0bWVtKHZvaWQpCiB7CiAJdW5zaWduZWQgbG9uZyBhZGRyOwogCi0JYWRkciA9ICh1bnNpZ25lZCBsb25nKSZfX2luaXRfYmVnaW47Ci0JZm9yICg7IGFkZHIgPCAodW5zaWduZWQgbG9uZykmX19pbml0X2VuZDsgYWRkciArPSBQQUdFX1NJWkUpIHsKKwlhZGRyID0gKHVuc2lnbmVkIGxvbmcpX19pbml0X2JlZ2luOworCWZvciAoOyBhZGRyIDwgKHVuc2lnbmVkIGxvbmcpX19pbml0X2VuZDsgYWRkciArPSBQQUdFX1NJWkUpIHsKIAkJdmlydF90b19wYWdlKGFkZHIpLT5mbGFncyAmPSB+KDEgPDwgUEdfcmVzZXJ2ZWQpOwogCQlpbml0X3BhZ2VfY291bnQodmlydF90b19wYWdlKGFkZHIpKTsKIAkJZnJlZV9wYWdlKGFkZHIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL212bWUxNDcvY29uZmlnLmMgYi9hcmNoL202OGsvbXZtZTE0Ny9jb25maWcuYwppbmRleCA0M2NkZjQ3Li4xMDBiYWFhIDEwMDY0NAotLS0gYS9hcmNoL202OGsvbXZtZTE0Ny9jb25maWcuYworKysgYi9hcmNoL202OGsvbXZtZTE0Ny9jb25maWcuYwpAQCAtNDIsNyArNDIsNiBAQAogZXh0ZXJuIGludCBtdm1lMTQ3X2h3Y2xrIChpbnQsIHN0cnVjdCBydGNfdGltZSAqKTsKIGV4dGVybiBpbnQgbXZtZTE0N19zZXRfY2xvY2tfbW1zcyAodW5zaWduZWQgbG9uZyk7CiBleHRlcm4gdm9pZCBtdm1lMTQ3X3Jlc2V0ICh2b2lkKTsKLWV4dGVybiB2b2lkIG12bWUxNDdfd2FpdGJ1dCh2b2lkKTsKIAogCiBzdGF0aWMgaW50IGJjZDJpbnQgKHVuc2lnbmVkIGNoYXIgYik7CkBAIC0xMTUsOCArMTE0LDkgQEAKIHZvaWQgbXZtZTE0N19zY2hlZF9pbml0IChpcnFfaGFuZGxlcl90IHRpbWVyX3JvdXRpbmUpCiB7CiAJdGlja19oYW5kbGVyID0gdGltZXJfcm91dGluZTsKLQlyZXF1ZXN0X2lycSAoUENDX0lSUV9USU1FUjEsIG12bWUxNDdfdGltZXJfaW50LAotCQlJUlFfRkxHX1JFUExBQ0UsICJ0aW1lciAxIiwgTlVMTCk7CisJaWYgKHJlcXVlc3RfaXJxKFBDQ19JUlFfVElNRVIxLCBtdm1lMTQ3X3RpbWVyX2ludCwgSVJRX0ZMR19SRVBMQUNFLAorCQkJInRpbWVyIDEiLCBOVUxMKSkKKwkJcHJfZXJyKCJDb3VsZG4ndCByZWdpc3RlciB0aW1lciBpbnRlcnJ1cHRcbiIpOwogCiAJLyogSW5pdCB0aGUgY2xvY2sgd2l0aCBhIHZhbHVlICovCiAJLyogb3VyIGNsb2NrIGdvZXMgb2ZmIGV2ZXJ5IDYuMjV1cyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL212bWUxNngvY29uZmlnLmMgYi9hcmNoL202OGsvbXZtZTE2eC9jb25maWcuYwppbmRleCAxNTIxODI2Li4xMWVkZjYxIDEwMDY0NAotLS0gYS9hcmNoL202OGsvbXZtZTE2eC9jb25maWcuYworKysgYi9hcmNoL202OGsvbXZtZTE2eC9jb25maWcuYwpAQCAtNDgsNyArNDgsNiBAQAogZXh0ZXJuIGludCBtdm1lMTZ4X2h3Y2xrIChpbnQsIHN0cnVjdCBydGNfdGltZSAqKTsKIGV4dGVybiBpbnQgbXZtZTE2eF9zZXRfY2xvY2tfbW1zcyAodW5zaWduZWQgbG9uZyk7CiBleHRlcm4gdm9pZCBtdm1lMTZ4X3Jlc2V0ICh2b2lkKTsKLWV4dGVybiB2b2lkIG12bWUxNnhfd2FpdGJ1dCh2b2lkKTsKIAogaW50IGJjZDJpbnQgKHVuc2lnbmVkIGNoYXIgYik7CiAKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9xNDAvY29uZmlnLmMgYi9hcmNoL202OGsvcTQwL2NvbmZpZy5jCmluZGV4IDcxMTA1NDYuLjMxYWIzZjAgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9xNDAvY29uZmlnLmMKKysrIGIvYXJjaC9tNjhrL3E0MC9jb25maWcuYwpAQCAtMzYsNyArMzYsNiBAQAogI2luY2x1ZGUgPGFzbS9tYWNoZGVwLmg+CiAjaW5jbHVkZSA8YXNtL3E0MF9tYXN0ZXIuaD4KIAotZXh0ZXJuIGlycXJldHVybl90IHE0MF9wcm9jZXNzX2ludChpbnQgbGV2ZWwsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKIGV4dGVybiB2b2lkIHE0MF9pbml0X0lSUSh2b2lkKTsKIHN0YXRpYyB2b2lkIHE0MF9nZXRfbW9kZWwoY2hhciAqbW9kZWwpOwogZXh0ZXJuIHZvaWQgcTQwX3NjaGVkX2luaXQoaXJxX2hhbmRsZXJfdCBoYW5kbGVyKTsKQEAgLTQ3LDggKzQ2LDYgQEAKIHN0YXRpYyBpbnQgcTQwX3NldF9jbG9ja19tbXNzKHVuc2lnbmVkIGxvbmcpOwogc3RhdGljIGludCBxNDBfZ2V0X3J0Y19wbGwoc3RydWN0IHJ0Y19wbGxfaW5mbyAqcGxsKTsKIHN0YXRpYyBpbnQgcTQwX3NldF9ydGNfcGxsKHN0cnVjdCBydGNfcGxsX2luZm8gKnBsbCk7Ci1leHRlcm4gdm9pZCBxNDBfd2FpdGJ1dCh2b2lkKTsKLXZvaWQgcTQwX3NldF92ZWN0b3JzKHZvaWQpOwogCiBleHRlcm4gdm9pZCBxNDBfbWtzb3VuZCh1bnNpZ25lZCBpbnQgLypmcmVxKi8sIHVuc2lnbmVkIGludCAvKnRpY2tzKi8pOwogCmRpZmYgLS1naXQgYS9hcmNoL202OGsvc3VuMy9jb25maWcuYyBiL2FyY2gvbTY4ay9zdW4zL2NvbmZpZy5jCmluZGV4IDhkZmFhMjAuLjJjYTI1YmQgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9zdW4zL2NvbmZpZy5jCisrKyBiL2FyY2gvbTY4ay9zdW4zL2NvbmZpZy5jCkBAIC0yNywyMyArMjcsMjEgQEAKICNpbmNsdWRlIDxhc20vc3VuM21tdS5oPgogI2luY2x1ZGUgPGFzbS9ydGMuaD4KICNpbmNsdWRlIDxhc20vbWFjaGRlcC5oPgorI2luY2x1ZGUgPGFzbS9pZHByb20uaD4KICNpbmNsdWRlIDxhc20vaW50ZXJzaWwuaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL3NlY3Rpb25zLmg+CiAjaW5jbHVkZSA8YXNtL3NlZ21lbnQuaD4KICNpbmNsdWRlIDxhc20vc3VuM2ludHMuaD4KIAotZXh0ZXJuIGNoYXIgX3RleHQsIF9lbmQ7Ci0KIGNoYXIgc3VuM19yZXNlcnZlZF9wbWVnW1NVTjNfUE1FR1NfTlVNXTsKIAogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgc3VuM19nZXR0aW1lb2Zmc2V0KHZvaWQpOwogc3RhdGljIHZvaWQgc3VuM19zY2hlZF9pbml0KGlycV9oYW5kbGVyX3QgaGFuZGxlcik7CiBleHRlcm4gdm9pZCBzdW4zX2dldF9tb2RlbCAoY2hhciogbW9kZWwpOwotZXh0ZXJuIHZvaWQgaWRwcm9tX2luaXQgKHZvaWQpOwogZXh0ZXJuIGludCBzdW4zX2h3Y2xrKGludCBzZXQsIHN0cnVjdCBydGNfdGltZSAqdCk7CiAKIHZvbGF0aWxlIGNoYXIqIGNsb2NrX3ZhOwotZXh0ZXJuIHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIqIHN1bjNfaW50cmVnOwogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgYXZhaWxtZW07CiB1bnNpZ25lZCBsb25nIG51bV9wYWdlczsKIApAQCAtMTQ5LDcgKzE0Nyw3IEBACiAJbWFjaF9oYWx0CSAgICAgPSAgc3VuM19oYWx0OwogCW1hY2hfZ2V0X2hhcmR3YXJlX2xpc3QgPSBzdW4zX2dldF9oYXJkd2FyZV9saXN0OwogCi0JbWVtb3J5X3N0YXJ0ID0gKCgoKGludCkmX2VuZCkgKyAweDIwMDApICYgfjB4MWZmZik7CisJbWVtb3J5X3N0YXJ0ID0gKCgoKHVuc2lnbmVkIGxvbmcpX2VuZCkgKyAweDIwMDApICYgfjB4MWZmZik7CiAvLyBQUk9NIHNlZW1zIHRvIHdhbnQgdGhlIGxhc3QgY291cGxlIG9mIHBoeXNpY2FsIHBhZ2VzLiAtLW0KIAltZW1vcnlfZW5kICAgPSAqKHJvbXZlYy0+cHZfc3VuM21lbSkgKyBQQUdFX09GRlNFVCAtIDIqUEFHRV9TSVpFOwogCmRpZmYgLS1naXQgYS9hcmNoL202OGsvc3VuMy9tbXVfZW11LmMgYi9hcmNoL202OGsvc3VuMy9tbXVfZW11LmMKaW5kZXggNjBmOWQ0NS4uM2NkMTkzOSAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL3N1bjMvbW11X2VtdS5jCisrKyBiL2FyY2gvbTY4ay9zdW4zL21tdV9lbXUuYwpAQCAtMjcsNyArMjcsNiBAQAogI2luY2x1ZGUgPGFzbS9tbXVfY29udGV4dC5oPgogI2luY2x1ZGUgPGFzbS9kdm1hLmg+CiAKLWV4dGVybiB2b2lkIHByb21fcmVib290IChjaGFyICopIF9fYXR0cmlidXRlX18gKChfX25vcmV0dXJuX18pKTsKIAogI3VuZGVmIERFQlVHX01NVV9FTVUKICNkZWZpbmUgREVCVUdfUFJPTV9NQVBTCmRpZmYgLS1naXQgYS9hcmNoL202OGsvc3VuMy9zdW4zaW50cy5jIGIvYXJjaC9tNjhrL3N1bjMvc3VuM2ludHMuYwppbmRleCA3MzY0Y2Q2Li5hZDkwMzkzIDEwMDY0NAotLS0gYS9hcmNoL202OGsvc3VuMy9zdW4zaW50cy5jCisrKyBiL2FyY2gvbTY4ay9zdW4zL3N1bjNpbnRzLmMKQEAgLTEwNSw3ICsxMDUsMTAgQEAKIAltNjhrX3NldHVwX2lycV9jb250cm9sbGVyKCZzdW4zX2lycV9jb250cm9sbGVyLCBJUlFfQVVUT18xLCA3KTsKIAltNjhrX3NldHVwX3VzZXJfaW50ZXJydXB0KFZFQ19VU0VSLCAxMjgsIE5VTEwpOwogCi0JcmVxdWVzdF9pcnEoSVJRX0FVVE9fNSwgc3VuM19pbnQ1LCAwLCAiaW50NSIsIE5VTEwpOwotCXJlcXVlc3RfaXJxKElSUV9BVVRPXzcsIHN1bjNfaW50NywgMCwgImludDciLCBOVUxMKTsKLQlyZXF1ZXN0X2lycShJUlFfVVNFUisxMjcsIHN1bjNfdmVjMjU1LCAwLCAidmVjMjU1IiwgTlVMTCk7CisJaWYgKHJlcXVlc3RfaXJxKElSUV9BVVRPXzUsIHN1bjNfaW50NSwgMCwgImludDUiLCBOVUxMKSkKKwkJcHJfZXJyKCJDb3VsZG4ndCByZWdpc3RlciAlcyBpbnRlcnJ1cHRcbiIsICJpbnQ1Iik7CisJaWYgKHJlcXVlc3RfaXJxKElSUV9BVVRPXzcsIHN1bjNfaW50NywgMCwgImludDciLCBOVUxMKSkKKwkJcHJfZXJyKCJDb3VsZG4ndCByZWdpc3RlciAlcyBpbnRlcnJ1cHRcbiIsICJpbnQ3Iik7CisJaWYgKHJlcXVlc3RfaXJxKElSUV9VU0VSKzEyNywgc3VuM192ZWMyNTUsIDAsICJ2ZWMyNTUiLCBOVUxMKSkKKwkJcHJfZXJyKCJDb3VsZG4ndCByZWdpc3RlciAlcyBpbnRlcnJ1cHRcbiIsICJ2ZWMyNTUiKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9zdW4zeC9jb25maWcuYyBiL2FyY2gvbTY4ay9zdW4zeC9jb25maWcuYwppbmRleCAyYjFjYTJkLi5mYzU5OWZhIDEwMDY0NAotLS0gYS9hcmNoL202OGsvc3VuM3gvY29uZmlnLmMKKysrIGIvYXJjaC9tNjhrL3N1bjN4L2NvbmZpZy5jCkBAIC0yMyw3ICsyMyw2IEBACiAjaW5jbHVkZSAidGltZS5oIgogCiB2b2xhdGlsZSBjaGFyICpjbG9ja192YTsKLWV4dGVybiB2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICpzdW4zX2ludHJlZzsKIAogZXh0ZXJuIHZvaWQgc3VuM19nZXRfbW9kZWwoY2hhciAqbW9kZWwpOwogCmRpZmYgLS1naXQgYS9hcmNoL202OGtub21tdS9pbmNsdWRlL2FzbS9LYnVpbGQgYi9hcmNoL202OGtub21tdS9pbmNsdWRlL2FzbS9LYnVpbGQKaW5kZXggNThjMDJhNC4uYzY4ZTE2OCAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrbm9tbXUvaW5jbHVkZS9hc20vS2J1aWxkCisrKyBiL2FyY2gvbTY4a25vbW11L2luY2x1ZGUvYXNtL0tidWlsZApAQCAtMSwzICsxIEBACiBpbmNsdWRlIGluY2x1ZGUvYXNtLWdlbmVyaWMvS2J1aWxkLmFzbQotCi11bmlmZGVmLXkgKz0gc3dhYi5oCmRpZmYgLS1naXQgYS9hcmNoL202OGtub21tdS9pbmNsdWRlL2FzbS9ieXRlb3JkZXIuaCBiL2FyY2gvbTY4a25vbW11L2luY2x1ZGUvYXNtL2J5dGVvcmRlci5oCmluZGV4IGE2ZjBiOGYuLjljNmM3NmEgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4a25vbW11L2luY2x1ZGUvYXNtL2J5dGVvcmRlci5oCisrKyBiL2FyY2gvbTY4a25vbW11L2luY2x1ZGUvYXNtL2J5dGVvcmRlci5oCkBAIC0xLDcgKzEsNiBAQAogI2lmbmRlZiBfTTY4S05PTU1VX0JZVEVPUkRFUl9ICiAjZGVmaW5lIF9NNjhLTk9NTVVfQllURU9SREVSX0gKIAotI2luY2x1ZGUgPGFzbS9zd2FiLmg+CiAjaW5jbHVkZSA8bGludXgvYnl0ZW9yZGVyL2JpZ19lbmRpYW4uaD4KIAogI2VuZGlmIC8qIF9NNjhLTk9NTVVfQllURU9SREVSX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvbTY4a25vbW11L2luY2x1ZGUvYXNtL21tdS5oIGIvYXJjaC9tNjhrbm9tbXUvaW5jbHVkZS9hc20vbW11LmgKaW5kZXggNWZhNmI2OC4uZTJkYTFlNiAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrbm9tbXUvaW5jbHVkZS9hc20vbW11LmgKKysrIGIvYXJjaC9tNjhrbm9tbXUvaW5jbHVkZS9hc20vbW11LmgKQEAgLTQsNyArNCw2IEBACiAvKiBDb3B5cmlnaHQgKEMpIDIwMDIsIERhdmlkIE1jQ3VsbG91Z2ggPGRhdmlkbUBzbmFwZ2Vhci5jb20+ICovCiAKIHR5cGVkZWYgc3RydWN0IHsKLQlzdHJ1Y3Qgdm1fbGlzdF9zdHJ1Y3QJKnZtbGlzdDsKIAl1bnNpZ25lZCBsb25nCQllbmRfYnJrOwogfSBtbV9jb250ZXh0X3Q7CiAKZGlmZiAtLWdpdCBhL2FyY2gvbTY4a25vbW11L2tlcm5lbC9zeXNjYWxsdGFibGUuUyBiL2FyY2gvbTY4a25vbW11L2tlcm5lbC9zeXNjYWxsdGFibGUuUwppbmRleCA4MTJmOGQ4Li41YzNlM2Y2IDEwMDY0NAotLS0gYS9hcmNoL202OGtub21tdS9rZXJuZWwvc3lzY2FsbHRhYmxlLlMKKysrIGIvYXJjaC9tNjhrbm9tbXUva2VybmVsL3N5c2NhbGx0YWJsZS5TCkBAIC0xMDcsNyArMTA3LDcgQEAKIAkubG9uZyBzeXNfdXNlbGliCiAJLmxvbmcgc3lzX25pX3N5c2NhbGwJLyogc3lzX3N3YXBvbiAqLwogCS5sb25nIHN5c19yZWJvb3QKLQkubG9uZyBvbGRfcmVhZGRpcgorCS5sb25nIHN5c19vbGRfcmVhZGRpcgogCS5sb25nIG9sZF9tbWFwCQkvKiA5MCAqLwogCS5sb25nIHN5c19tdW5tYXAKIAkubG9uZyBzeXNfdHJ1bmNhdGUKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9LY29uZmlnIGIvYXJjaC9taXBzL0tjb25maWcKaW5kZXggYTUyNTVlNy4uNTJjODBjMiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL0tjb25maWcKKysrIGIvYXJjaC9taXBzL0tjb25maWcKQEAgLTU5NSw2ICs1OTUsNDQgQEAKIAkgIFRoaXMgZW5hYmxlcyBzdXBwb3J0IGZvciB0aGUgV2luZCBSaXZlciBNSVBTMzIgNEtDIFBQTUMgZXZhbHVhdGlvbgogCSAgYm9hcmQsIHdoaWNoIGlzIGJhc2VkIG9uIEdUNjQxMjAgYnJpZGdlIGNoaXAuCiAKK2NvbmZpZyBDQVZJVU1fT0NURU9OX1NJTVVMQVRPUgorCWJvb2wgIlN1cHBvcnQgZm9yIHRoZSBDYXZpdW0gTmV0d29ya3MgT2N0ZW9uIFNpbXVsYXRvciIKKwlzZWxlY3QgQ0VWVF9SNEsKKwlzZWxlY3QgNjRCSVRfUEhZU19BRERSCisJc2VsZWN0IERNQV9DT0hFUkVOVAorCXNlbGVjdCBTWVNfU1VQUE9SVFNfNjRCSVRfS0VSTkVMCisJc2VsZWN0IFNZU19TVVBQT1JUU19CSUdfRU5ESUFOCisJc2VsZWN0IFNZU19TVVBQT1JUU19ISUdITUVNCisJc2VsZWN0IENQVV9DQVZJVU1fT0NURU9OCisJaGVscAorCSAgVGhlIE9jdGVvbiBzaW11bGF0b3IgaXMgc29mdHdhcmUgcGVyZm9ybWFuY2UgbW9kZWwgb2YgdGhlIENhdml1bQorCSAgT2N0ZW9uIFByb2Nlc3Nvci4gSXQgc3VwcG9ydHMgc2ltdWxhdGluZyBPY3Rlb24gcHJvY2Vzc29ycyBvbiB4ODYKKwkgIGhhcmR3YXJlLgorCitjb25maWcgQ0FWSVVNX09DVEVPTl9SRUZFUkVOQ0VfQk9BUkQKKwlib29sICJTdXBwb3J0IGZvciB0aGUgQ2F2aXVtIE5ldHdvcmtzIE9jdGVvbiByZWZlcmVuY2UgYm9hcmQiCisJc2VsZWN0IENFVlRfUjRLCisJc2VsZWN0IDY0QklUX1BIWVNfQUREUgorCXNlbGVjdCBETUFfQ09IRVJFTlQKKwlzZWxlY3QgU1lTX1NVUFBPUlRTXzY0QklUX0tFUk5FTAorCXNlbGVjdCBTWVNfU1VQUE9SVFNfQklHX0VORElBTgorCXNlbGVjdCBTWVNfU1VQUE9SVFNfSElHSE1FTQorCXNlbGVjdCBTWVNfSEFTX0VBUkxZX1BSSU5USworCXNlbGVjdCBDUFVfQ0FWSVVNX09DVEVPTgorCXNlbGVjdCBTV0FQX0lPX1NQQUNFCisJaGVscAorCSAgVGhpcyBvcHRpb24gc3VwcG9ydHMgYWxsIG9mIHRoZSBPY3Rlb24gcmVmZXJlbmNlIGJvYXJkcyBmcm9tIENhdml1bQorCSAgTmV0d29ya3MuIEl0IGJ1aWxkcyBhIGtlcm5lbCB0aGF0IGR5bmFtaWNhbGx5IGRldGVybWluZXMgdGhlIE9jdGVvbgorCSAgQ1BVIHR5cGUgYW5kIHN1cHBvcnRzIGFsbCBrbm93biBib2FyZCByZWZlcmVuY2UgaW1wbGVtZW50YXRpb25zLgorCSAgU29tZSBvZiB0aGUgc3VwcG9ydGVkIGJvYXJkcyBhcmU6CisJCUVCVDMwMDAKKwkJRUJIMzAwMAorCQlFQkgzMTAwCisJCVRodW5kZXIKKwkJS29kYW1hCisJCUhpa2FyaQorCSAgU2F5IFkgaGVyZSBmb3IgbW9zdCBPY3Rlb24gcmVmZXJlbmNlIGJvYXJkcy4KKwogZW5kY2hvaWNlCiAKIHNvdXJjZSAiYXJjaC9taXBzL2FsY2hlbXkvS2NvbmZpZyIKQEAgLTYwNyw2ICs2NDUsNyBAQAogc291cmNlICJhcmNoL21pcHMvc2lieXRlL0tjb25maWciCiBzb3VyY2UgImFyY2gvbWlwcy90eHg5L0tjb25maWciCiBzb3VyY2UgImFyY2gvbWlwcy92cjQxeHgvS2NvbmZpZyIKK3NvdXJjZSAiYXJjaC9taXBzL2Nhdml1bS1vY3Rlb24vS2NvbmZpZyIKIAogZW5kbWVudQogCkBAIC02ODIsNyArNzIxLDExIEBACiBjb25maWcgQ0VWVF9HVDY0MVhYCiAJYm9vbAogCitjb25maWcgQ0VWVF9SNEtfTElCCisJYm9vbAorCiBjb25maWcgQ0VWVF9SNEsKKwlzZWxlY3QgQ0VWVF9SNEtfTElCCiAJYm9vbAogCiBjb25maWcgQ0VWVF9TQjEyNTAKQEAgLTY5Nyw3ICs3NDAsMTEgQEAKIGNvbmZpZyBDU1JDX0lPQVNJQwogCWJvb2wKIAorY29uZmlnIENTUkNfUjRLX0xJQgorCWJvb2wKKwogY29uZmlnIENTUkNfUjRLCisJc2VsZWN0IENTUkNfUjRLX0xJQgogCWJvb2wKIAogY29uZmlnIENTUkNfU0IxMjUwCkBAIC04MzUsNiArODgyLDkgQEAKIGNvbmZpZyBJUlFfR0lDCiAJYm9vbAogCitjb25maWcgSVJRX0NQVV9PQ1RFT04KKwlib29sCisKIGNvbmZpZyBNSVBTX0JPQVJEU19HRU4KIAlib29sCiAKQEAgLTkyNCw3ICs5NzQsNyBAQAogY29uZmlnIE1JUFNfTDFfQ0FDSEVfU0hJRlQKIAlpbnQKIAlkZWZhdWx0ICI0IiBpZiBNQUNIX0RFQ1NUQVRJT04gfHwgTUlLUk9USUtfUkI1MzIKLQlkZWZhdWx0ICI3IiBpZiBTR0lfSVAyMiB8fCBTR0lfSVAyNyB8fCBTR0lfSVAyOCB8fCBTTklfUk0KKwlkZWZhdWx0ICI3IiBpZiBTR0lfSVAyMiB8fCBTR0lfSVAyNyB8fCBTR0lfSVAyOCB8fCBTTklfUk0gfHwgQ1BVX0NBVklVTV9PQ1RFT04KIAlkZWZhdWx0ICI0IiBpZiBQTUNfTVNQNDIwMF9FVkFMCiAJZGVmYXVsdCAiNSIKIApAQCAtMTE4NSw2ICsxMjM1LDIzIEBACiAJc2VsZWN0IENQVV9TVVBQT1JUU19ISUdITUVNCiAJc2VsZWN0IFdFQUtfT1JERVJJTkcKIAorY29uZmlnIENQVV9DQVZJVU1fT0NURU9OCisJYm9vbCAiQ2F2aXVtIE9jdGVvbiBwcm9jZXNzb3IiCisJc2VsZWN0IElSUV9DUFUKKwlzZWxlY3QgSVJRX0NQVV9PQ1RFT04KKwlzZWxlY3QgQ1BVX0hBU19QUkVGRVRDSAorCXNlbGVjdCBDUFVfU1VQUE9SVFNfNjRCSVRfS0VSTkVMCisJc2VsZWN0IFNZU19TVVBQT1JUU19TTVAKKwlzZWxlY3QgTlJfQ1BVU19ERUZBVUxUXzE2CisJc2VsZWN0IFdFQUtfT1JERVJJTkcKKwlzZWxlY3QgV0VBS19SRU9SREVSSU5HX0JFWU9ORF9MTFNDCisJc2VsZWN0IENQVV9TVVBQT1JUU19ISUdITUVNCisJaGVscAorCSAgVGhlIENhdml1bSBPY3Rlb24gcHJvY2Vzc29yIGlzIGEgaGlnaGx5IGludGVncmF0ZWQgY2hpcCBjb250YWluaW5nCisJICBtYW55IGV0aGVybmV0IGhhcmR3YXJlIHdpZGdldHMgZm9yIG5ldHdvcmtpbmcgdGFza3MuIFRoZSBwcm9jZXNzb3IKKwkgIGNhbiBoYXZlIHVwIHRvIDE2IE1pcHM2NHYyIGNvcmVzIGFuZCA4IGludGVncmF0ZWQgZ2lnYWJpdCBldGhlcm5ldHMuCisJICBGdWxsIGRldGFpbHMgY2FuIGJlIGZvdW5kIGF0IGh0dHA6Ly93d3cuY2F2aXVtbmV0d29ya3MuY29tLgorCiBlbmRjaG9pY2UKIAogY29uZmlnIFNZU19IQVNfQ1BVX0xPT05HU09OMgpAQCAtMTI4NSw3ICsxMzUyLDcgQEAKIAogY29uZmlnIENQVV9NSVBTUjIKIAlib29sCi0JZGVmYXVsdCB5IGlmIENQVV9NSVBTMzJfUjIgfHwgQ1BVX01JUFM2NF9SMgorCWRlZmF1bHQgeSBpZiBDUFVfTUlQUzMyX1IyIHx8IENQVV9NSVBTNjRfUjIgfHwgQ1BVX0NBVklVTV9PQ1RFT04KIAogY29uZmlnIFNZU19TVVBQT1JUU18zMkJJVF9LRVJORUwKIAlib29sCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvTWFrZWZpbGUgYi9hcmNoL21pcHMvTWFrZWZpbGUKaW5kZXggMjhjNTVmNi4uMjFiMDBlOSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL01ha2VmaWxlCisrKyBiL2FyY2gvbWlwcy9NYWtlZmlsZQpAQCAtMTQ0LDYgKzE0NCwxMCBAQAogY2ZsYWdzLSQoQ09ORklHX0NQVV9SODAwMCkJKz0gLW1hcmNoPXI4MDAwIC1XYSwtLXRyYXAKIGNmbGFncy0kKENPTkZJR19DUFVfUjEwMDAwKQkrPSAkKGNhbGwgY2Mtb3B0aW9uLC1tYXJjaD1yMTAwMDAsLW1hcmNoPXI4MDAwKSBcCiAJCQktV2EsLS10cmFwCitjZmxhZ3MtJChDT05GSUdfQ1BVX0NBVklVTV9PQ1RFT04pICs9ICQoY2FsbCBjYy1vcHRpb24sLW1hcmNoPW9jdGVvbikgLVdhLC0tdHJhcAoraWZlcSAoLCQoZmluZHN0cmluZyBtYXJjaD1vY3Rlb24sICQoY2ZsYWdzLSQoQ09ORklHX0NQVV9DQVZJVU1fT0NURU9OKSkpKQorY2ZsYWdzLSQoQ09ORklHX0NQVV9DQVZJVU1fT0NURU9OKSArPSAtV2EsLW1hcmNoPW9jdGVvbgorZW5kaWYKIAogY2ZsYWdzLSQoQ09ORklHX0NQVV9SNDAwMF9XT1JLQVJPVU5EUykJKz0gJChjYWxsIGNjLW9wdGlvbiwtbWZpeC1yNDAwMCwpCiBjZmxhZ3MtJChDT05GSUdfQ1BVX1I0NDAwX1dPUktBUk9VTkRTKQkrPSAkKGNhbGwgY2Mtb3B0aW9uLC1tZml4LXI0NDAwLCkKQEAgLTE4NCw4NCArMTg4LDg0IEBACiAjCiAjIEFNRCBBbGNoZW15IFBiMTAwMCBldmFsIGJvYXJkCiAjCi1saWJzLSQoQ09ORklHX01JUFNfUEIxMDAwKQkrPSBhcmNoL21pcHMvYWxjaGVteS9wYjEwMDAvCitjb3JlLSQoQ09ORklHX01JUFNfUEIxMDAwKQkrPSBhcmNoL21pcHMvYWxjaGVteS9kZXZib2FyZHMvCiBjZmxhZ3MtJChDT05GSUdfTUlQU19QQjEwMDApCSs9IC1JJChzcmN0cmVlKS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1wYjF4MDAKIGxvYWQtJChDT05GSUdfTUlQU19QQjEwMDApCSs9IDB4ZmZmZmZmZmY4MDEwMDAwMAogCiAjCiAjIEFNRCBBbGNoZW15IFBiMTEwMCBldmFsIGJvYXJkCiAjCi1saWJzLSQoQ09ORklHX01JUFNfUEIxMTAwKQkrPSBhcmNoL21pcHMvYWxjaGVteS9wYjExMDAvCitjb3JlLSQoQ09ORklHX01JUFNfUEIxMTAwKQkrPSBhcmNoL21pcHMvYWxjaGVteS9kZXZib2FyZHMvCiBjZmxhZ3MtJChDT05GSUdfTUlQU19QQjExMDApCSs9IC1JJChzcmN0cmVlKS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1wYjF4MDAKIGxvYWQtJChDT05GSUdfTUlQU19QQjExMDApCSs9IDB4ZmZmZmZmZmY4MDEwMDAwMAogCiAjCiAjIEFNRCBBbGNoZW15IFBiMTUwMCBldmFsIGJvYXJkCiAjCi1saWJzLSQoQ09ORklHX01JUFNfUEIxNTAwKQkrPSBhcmNoL21pcHMvYWxjaGVteS9wYjE1MDAvCitjb3JlLSQoQ09ORklHX01JUFNfUEIxNTAwKQkrPSBhcmNoL21pcHMvYWxjaGVteS9kZXZib2FyZHMvCiBjZmxhZ3MtJChDT05GSUdfTUlQU19QQjE1MDApCSs9IC1JJChzcmN0cmVlKS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1wYjF4MDAKIGxvYWQtJChDT05GSUdfTUlQU19QQjE1MDApCSs9IDB4ZmZmZmZmZmY4MDEwMDAwMAogCiAjCiAjIEFNRCBBbGNoZW15IFBiMTU1MCBldmFsIGJvYXJkCiAjCi1saWJzLSQoQ09ORklHX01JUFNfUEIxNTUwKQkrPSBhcmNoL21pcHMvYWxjaGVteS9wYjE1NTAvCitjb3JlLSQoQ09ORklHX01JUFNfUEIxNTUwKQkrPSBhcmNoL21pcHMvYWxjaGVteS9kZXZib2FyZHMvCiBjZmxhZ3MtJChDT05GSUdfTUlQU19QQjE1NTApCSs9IC1JJChzcmN0cmVlKS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1wYjF4MDAKIGxvYWQtJChDT05GSUdfTUlQU19QQjE1NTApCSs9IDB4ZmZmZmZmZmY4MDEwMDAwMAogCiAjCiAjIEFNRCBBbGNoZW15IFBiMTIwMCBldmFsIGJvYXJkCiAjCi1saWJzLSQoQ09ORklHX01JUFNfUEIxMjAwKQkrPSBhcmNoL21pcHMvYWxjaGVteS9wYjEyMDAvCitjb3JlLSQoQ09ORklHX01JUFNfUEIxMjAwKQkrPSBhcmNoL21pcHMvYWxjaGVteS9kZXZib2FyZHMvCiBjZmxhZ3MtJChDT05GSUdfTUlQU19QQjEyMDApCSs9IC1JJChzcmN0cmVlKS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1wYjF4MDAKIGxvYWQtJChDT05GSUdfTUlQU19QQjEyMDApCSs9IDB4ZmZmZmZmZmY4MDEwMDAwMAogCiAjCiAjIEFNRCBBbGNoZW15IERiMTAwMCBldmFsIGJvYXJkCiAjCi1saWJzLSQoQ09ORklHX01JUFNfREIxMDAwKQkrPSBhcmNoL21pcHMvYWxjaGVteS9kYjF4MDAvCitjb3JlLSQoQ09ORklHX01JUFNfREIxMDAwKQkrPSBhcmNoL21pcHMvYWxjaGVteS9kZXZib2FyZHMvCiBjZmxhZ3MtJChDT05GSUdfTUlQU19EQjEwMDApCSs9IC1JJChzcmN0cmVlKS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1kYjF4MDAKIGxvYWQtJChDT05GSUdfTUlQU19EQjEwMDApCSs9IDB4ZmZmZmZmZmY4MDEwMDAwMAogCiAjCiAjIEFNRCBBbGNoZW15IERiMTEwMCBldmFsIGJvYXJkCiAjCi1saWJzLSQoQ09ORklHX01JUFNfREIxMTAwKQkrPSBhcmNoL21pcHMvYWxjaGVteS9kYjF4MDAvCitjb3JlLSQoQ09ORklHX01JUFNfREIxMTAwKQkrPSBhcmNoL21pcHMvYWxjaGVteS9kZXZib2FyZHMvCiBjZmxhZ3MtJChDT05GSUdfTUlQU19EQjExMDApCSs9IC1JJChzcmN0cmVlKS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1kYjF4MDAKIGxvYWQtJChDT05GSUdfTUlQU19EQjExMDApCSs9IDB4ZmZmZmZmZmY4MDEwMDAwMAogCiAjCiAjIEFNRCBBbGNoZW15IERiMTUwMCBldmFsIGJvYXJkCiAjCi1saWJzLSQoQ09ORklHX01JUFNfREIxNTAwKQkrPSBhcmNoL21pcHMvYWxjaGVteS9kYjF4MDAvCitjb3JlLSQoQ09ORklHX01JUFNfREIxNTAwKQkrPSBhcmNoL21pcHMvYWxjaGVteS9kZXZib2FyZHMvCiBjZmxhZ3MtJChDT05GSUdfTUlQU19EQjE1MDApCSs9IC1JJChzcmN0cmVlKS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1kYjF4MDAKIGxvYWQtJChDT05GSUdfTUlQU19EQjE1MDApCSs9IDB4ZmZmZmZmZmY4MDEwMDAwMAogCiAjCiAjIEFNRCBBbGNoZW15IERiMTU1MCBldmFsIGJvYXJkCiAjCi1saWJzLSQoQ09ORklHX01JUFNfREIxNTUwKQkrPSBhcmNoL21pcHMvYWxjaGVteS9kYjF4MDAvCitjb3JlLSQoQ09ORklHX01JUFNfREIxNTUwKQkrPSBhcmNoL21pcHMvYWxjaGVteS9kZXZib2FyZHMvCiBjZmxhZ3MtJChDT05GSUdfTUlQU19EQjE1NTApCSs9IC1JJChzcmN0cmVlKS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1kYjF4MDAKIGxvYWQtJChDT05GSUdfTUlQU19EQjE1NTApCSs9IDB4ZmZmZmZmZmY4MDEwMDAwMAogCiAjCiAjIEFNRCBBbGNoZW15IERiMTIwMCBldmFsIGJvYXJkCiAjCi1saWJzLSQoQ09ORklHX01JUFNfREIxMjAwKQkrPSBhcmNoL21pcHMvYWxjaGVteS9wYjEyMDAvCitjb3JlLSQoQ09ORklHX01JUFNfREIxMjAwKQkrPSBhcmNoL21pcHMvYWxjaGVteS9kZXZib2FyZHMvCiBjZmxhZ3MtJChDT05GSUdfTUlQU19EQjEyMDApCSs9IC1JJChzcmN0cmVlKS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1kYjF4MDAKIGxvYWQtJChDT05GSUdfTUlQU19EQjEyMDApCSs9IDB4ZmZmZmZmZmY4MDEwMDAwMAogCiAjCiAjIEFNRCBBbGNoZW15IEJvc3BvcnVzIGV2YWwgYm9hcmQKICMKLWxpYnMtJChDT05GSUdfTUlQU19CT1NQT1JVUykJKz0gYXJjaC9taXBzL2FsY2hlbXkvZGIxeDAwLworY29yZS0kKENPTkZJR19NSVBTX0JPU1BPUlVTKQkrPSBhcmNoL21pcHMvYWxjaGVteS9kZXZib2FyZHMvCiBjZmxhZ3MtJChDT05GSUdfTUlQU19CT1NQT1JVUykJKz0gLUkkKHNyY3RyZWUpL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWRiMXgwMAogbG9hZC0kKENPTkZJR19NSVBTX0JPU1BPUlVTKQkrPSAweGZmZmZmZmZmODAxMDAwMDAKIAogIwogIyBBTUQgQWxjaGVteSBNaXJhZ2UgZXZhbCBib2FyZAogIwotbGlicy0kKENPTkZJR19NSVBTX01JUkFHRSkJKz0gYXJjaC9taXBzL2FsY2hlbXkvZGIxeDAwLworY29yZS0kKENPTkZJR19NSVBTX01JUkFHRSkJKz0gYXJjaC9taXBzL2FsY2hlbXkvZGV2Ym9hcmRzLwogY2ZsYWdzLSQoQ09ORklHX01JUFNfTUlSQUdFKQkrPSAtSSQoc3JjdHJlZSkvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtZGIxeDAwCiBsb2FkLSQoQ09ORklHX01JUFNfTUlSQUdFKQkrPSAweGZmZmZmZmZmODAxMDAwMDAKIApAQCAtNTg2LDYgKzU5MCwxOCBAQAogY29yZS0kKENPTkZJR19UT1NISUJBX1JCVFg0OTM4KSArPSBhcmNoL21pcHMvdHh4OS9yYnR4NDkzOC8KIGNvcmUtJChDT05GSUdfVE9TSElCQV9SQlRYNDkzOSkgKz0gYXJjaC9taXBzL3R4eDkvcmJ0eDQ5MzkvCiAKKyMKKyMgQ2F2aXVtIE9jdGVvbgorIworY29yZS0kKENPTkZJR19DUFVfQ0FWSVVNX09DVEVPTikJKz0gYXJjaC9taXBzL2Nhdml1bS1vY3Rlb24vCitjZmxhZ3MtJChDT05GSUdfQ1BVX0NBVklVTV9PQ1RFT04pCSs9IC1JJChzcmN0cmVlKS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1jYXZpdW0tb2N0ZW9uCitjb3JlLSQoQ09ORklHX0NQVV9DQVZJVU1fT0NURU9OKQkrPSBhcmNoL21pcHMvY2F2aXVtLW9jdGVvbi9leGVjdXRpdmUvCitpZmRlZiBDT05GSUdfQ0FWSVVNX09DVEVPTl8yTkRfS0VSTkVMCitsb2FkLSQoQ09ORklHX0NQVV9DQVZJVU1fT0NURU9OKQkrPSAweGZmZmZmZmZmODQxMDAwMDAKK2Vsc2UKK2xvYWQtJChDT05GSUdfQ1BVX0NBVklVTV9PQ1RFT04pIAkrPSAweGZmZmZmZmZmODExMDAwMDAKK2VuZGlmCisKIGNmbGFncy15CQkJKz0gLUkkKHNyY3RyZWUpL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWdlbmVyaWMKIGRyaXZlcnMtJChDT05GSUdfUENJKQkJKz0gYXJjaC9taXBzL3BjaS8KIApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2FsY2hlbXkvS2NvbmZpZyBiL2FyY2gvbWlwcy9hbGNoZW15L0tjb25maWcKaW5kZXggZTRhMDU3ZC4uN2Y4ZWYxMyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2FsY2hlbXkvS2NvbmZpZworKysgYi9hcmNoL21pcHMvYWxjaGVteS9LY29uZmlnCkBAIC0xMjgsOSArMTI4LDEwIEBACiBjb25maWcgU09DX0FVMVgwMAogCWJvb2wKIAlzZWxlY3QgNjRCSVRfUEhZU19BRERSCi0Jc2VsZWN0IENFVlRfUjRLCi0Jc2VsZWN0IENTUkNfUjRLCisJc2VsZWN0IENFVlRfUjRLX0xJQgorCXNlbGVjdCBDU1JDX1I0S19MSUIKIAlzZWxlY3QgSVJRX0NQVQogCXNlbGVjdCBTWVNfSEFTX0NQVV9NSVBTMzJfUjEKIAlzZWxlY3QgU1lTX1NVUFBPUlRTXzMyQklUX0tFUk5FTAogCXNlbGVjdCBTWVNfU1VQUE9SVFNfQVBNX0VNVUxBVElPTgorCXNlbGVjdCBHRU5FUklDX0hBUkRJUlFTX05PX19ET19JUlEKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9hbGNoZW15L2NvbW1vbi9NYWtlZmlsZSBiL2FyY2gvbWlwcy9hbGNoZW15L2NvbW1vbi9NYWtlZmlsZQppbmRleCBkZjQ4ZmQ2Li5kNTBkNDc2IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvYWxjaGVteS9jb21tb24vTWFrZWZpbGUKKysrIGIvYXJjaC9taXBzL2FsY2hlbXkvY29tbW9uL01ha2VmaWxlCkBAIC02LDggKzYsOCBAQAogIwogCiBvYmoteSArPSBwcm9tLm8gaXJxLm8gcHV0cy5vIHRpbWUubyByZXNldC5vIFwKLQlhdTF4eHhfaXJxbWFwLm8gY2xvY2tzLm8gcGxhdGZvcm0ubyBwb3dlci5vIHNldHVwLm8gXAotCXNsZWVwZXIubyBjcHV0YWJsZS5vIGRtYS5vIGRiZG1hLm8gZ3Bpby5vCisJY2xvY2tzLm8gcGxhdGZvcm0ubyBwb3dlci5vIHNldHVwLm8gXAorCXNsZWVwZXIubyBkbWEubyBkYmRtYS5vIGdwaW8ubwogCiBvYmotJChDT05GSUdfUENJKQkJKz0gcGNpLm8KIApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2FsY2hlbXkvY29tbW9uL2F1MXh4eF9pcnFtYXAuYyBiL2FyY2gvbWlwcy9hbGNoZW15L2NvbW1vbi9hdTF4eHhfaXJxbWFwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3Y2ExNTkuLjAwMDAwMDAKLS0tIGEvYXJjaC9taXBzL2FsY2hlbXkvY29tbW9uL2F1MXh4eF9pcnFtYXAuYworKysgL2Rldi9udWxsCkBAIC0xLDIwNSArMCwwIEBACi0vKgotICogQlJJRUYgTU9EVUxFIERFU0NSSVBUSU9OCi0gKglBdTF4eHggcHJvY2Vzc29yIHNwZWNpZmljIElSUSB0YWJsZXMKLSAqCi0gKiBDb3B5cmlnaHQgMjAwNCBFbWJlZGRlZCBFZGdlLCBMTEMKLSAqCWRhbkBlbWJlZGRlZGVkZ2UuY29tCi0gKgotICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZQkgaXQgYW5kL29yIG1vZGlmeSBpdAotICogIHVuZGVyICB0aGUgdGVybXMgb2YJIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQotICogIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlCUxpY2Vuc2UsIG9yIChhdCB5b3VyCi0gKiAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiAgVEhJUyAgU09GVFdBUkUgIElTIFBST1ZJREVECSAgYGBBUwlJUycnIEFORCAgIEFOWQlFWFBSRVNTIE9SIElNUExJRUQKLSAqICBXQVJSQU5USUVTLAkgIElOQ0xVRElORywgQlVUIE5PVCAgTElNSVRFRCAgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqICBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4KLSAqICBOTwlFVkVOVCAgU0hBTEwgICBUSEUgQVVUSE9SICBCRQkgTElBQkxFIEZPUiBBTlkJICBESVJFQ1QsIElORElSRUNULAotICogIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogIE5PVCBMSU1JVEVECSAgVE8sIFBST0NVUkVNRU5UIE9GICBTVUJTVElUVVRFIEdPT0RTCU9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiAgVVNFLCBEQVRBLAlPUiBQUk9GSVRTOyBPUglCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTgotICogIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCSBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgotICogIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotICogIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlICB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICogIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotICovCi0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotCi0jaW5jbHVkZSA8YXUxMDAwLmg+Ci0KLS8qIFRoZSBJQzAgaW50ZXJydXB0IHRhYmxlLiAgVGhpcyBpcyBwcm9jZXNzb3IsIHJhdGhlciB0aGFuCi0gKiBib2FyZCBkZXBlbmRlbnQsIHNvIG5vIHJlYXNvbiB0byBrZWVwIHRoaXMgaW5mbyBpbiB0aGUgYm9hcmQKLSAqIGRlcGVuZGVudCBmaWxlcy4KLSAqCi0gKiBDYXJlZnVsIGlmIHlvdSBjaGFuZ2UgbWF0Y2ggMiByZXF1ZXN0IQotICogVGhlIGludGVycnVwdCBoYW5kbGVyIGlzIGNhbGxlZCBkaXJlY3RseSBmcm9tIHRoZSBsb3cgbGV2ZWwgZGlzcGF0Y2ggY29kZS4KLSAqLwotc3RydWN0IGF1MXh4eF9pcnFtYXAgX19pbml0ZGF0YSBhdTF4eHhfaWMwX21hcFtdID0gewotCi0jaWYgZGVmaW5lZChDT05GSUdfU09DX0FVMTAwMCkKLQl7IEFVMTAwMF9VQVJUMF9JTlQsIElOVENfSU5UX0hJR0hfTEVWRUwsIDAgfSwKLQl7IEFVMTAwMF9VQVJUMV9JTlQsIElOVENfSU5UX0hJR0hfTEVWRUwsIDAgfSwKLQl7IEFVMTAwMF9VQVJUMl9JTlQsIElOVENfSU5UX0hJR0hfTEVWRUwsIDAgfSwKLQl7IEFVMTAwMF9VQVJUM19JTlQsIElOVENfSU5UX0hJR0hfTEVWRUwsIDAgfSwKLQl7IEFVMTAwMF9TU0kwX0lOVCwgSU5UQ19JTlRfSElHSF9MRVZFTCwgMCB9LAotCXsgQVUxMDAwX1NTSTFfSU5ULCBJTlRDX0lOVF9ISUdIX0xFVkVMLCAwIH0sCi0JeyBBVTEwMDBfRE1BX0lOVF9CQVNFLCBJTlRDX0lOVF9ISUdIX0xFVkVMLCAwIH0sCi0JeyBBVTEwMDBfRE1BX0lOVF9CQVNFKzEsIElOVENfSU5UX0hJR0hfTEVWRUwsIDAgfSwKLQl7IEFVMTAwMF9ETUFfSU5UX0JBU0UrMiwgSU5UQ19JTlRfSElHSF9MRVZFTCwgMCB9LAotCXsgQVUxMDAwX0RNQV9JTlRfQkFTRSszLCBJTlRDX0lOVF9ISUdIX0xFVkVMLCAwIH0sCi0JeyBBVTEwMDBfRE1BX0lOVF9CQVNFKzQsIElOVENfSU5UX0hJR0hfTEVWRUwsIDAgfSwKLQl7IEFVMTAwMF9ETUFfSU5UX0JBU0UrNSwgSU5UQ19JTlRfSElHSF9MRVZFTCwgMCB9LAotCXsgQVUxMDAwX0RNQV9JTlRfQkFTRSs2LCBJTlRDX0lOVF9ISUdIX0xFVkVMLCAwIH0sCi0JeyBBVTEwMDBfRE1BX0lOVF9CQVNFKzcsIElOVENfSU5UX0hJR0hfTEVWRUwsIDAgfSwKLQl7IEFVMTAwMF9UT1lfSU5ULCBJTlRDX0lOVF9SSVNFX0VER0UsIDAgfSwKLQl7IEFVMTAwMF9UT1lfTUFUQ0gwX0lOVCwgSU5UQ19JTlRfUklTRV9FREdFLCAwIH0sCi0JeyBBVTEwMDBfVE9ZX01BVENIMV9JTlQsIElOVENfSU5UX1JJU0VfRURHRSwgMCB9LAotCXsgQVUxMDAwX1RPWV9NQVRDSDJfSU5ULCBJTlRDX0lOVF9SSVNFX0VER0UsIDEgfSwKLQl7IEFVMTAwMF9SVENfSU5ULCBJTlRDX0lOVF9SSVNFX0VER0UsIDAgfSwKLQl7IEFVMTAwMF9SVENfTUFUQ0gwX0lOVCwgSU5UQ19JTlRfUklTRV9FREdFLCAwIH0sCi0JeyBBVTEwMDBfUlRDX01BVENIMV9JTlQsIElOVENfSU5UX1JJU0VfRURHRSwgMCB9LAotCXsgQVUxMDAwX1JUQ19NQVRDSDJfSU5ULCBJTlRDX0lOVF9SSVNFX0VER0UsIDAgfSwKLQl7IEFVMTAwMF9JUkRBX1RYX0lOVCwgSU5UQ19JTlRfSElHSF9MRVZFTCwgMCB9LAotCXsgQVUxMDAwX0lSREFfUlhfSU5ULCBJTlRDX0lOVF9ISUdIX0xFVkVMLCAwIH0sCi0JeyBBVTEwMDBfVVNCX0RFVl9SRVFfSU5ULCBJTlRDX0lOVF9ISUdIX0xFVkVMLCAwIH0sCi0JeyBBVTEwMDBfVVNCX0RFVl9TVVNfSU5ULCBJTlRDX0lOVF9SSVNFX0VER0UsIDAgfSwKLQl7IEFVMTAwMF9VU0JfSE9TVF9JTlQsIElOVENfSU5UX0xPV19MRVZFTCwgMCB9LAotCXsgQVUxMDAwX0FDU1lOQ19JTlQsIElOVENfSU5UX1JJU0VfRURHRSwgMCB9LAotCXsgQVUxMDAwX01BQzBfRE1BX0lOVCwgSU5UQ19JTlRfSElHSF9MRVZFTCwgMCB9LAotCXsgQVUxMDAwX01BQzFfRE1BX0lOVCwgSU5UQ19JTlRfSElHSF9MRVZFTCwgMCB9LAotCXsgQVUxMDAwX0FDOTdDX0lOVCwgSU5UQ19JTlRfUklTRV9FREdFLCAwIH0sCi0KLSNlbGlmIGRlZmluZWQoQ09ORklHX1NPQ19BVTE1MDApCi0KLQl7IEFVMTUwMF9VQVJUMF9JTlQsIElOVENfSU5UX0hJR0hfTEVWRUwsIDAgfSwKLQl7IEFVMTAwMF9QQ0lfSU5UQSwgSU5UQ19JTlRfTE9XX0xFVkVMLCAwIH0sCi0JeyBBVTEwMDBfUENJX0lOVEIsIElOVENfSU5UX0xPV19MRVZFTCwgMCB9LAotCXsgQVUxNTAwX1VBUlQzX0lOVCwgSU5UQ19JTlRfSElHSF9MRVZFTCwgMCB9LAotCXsgQVUxMDAwX1BDSV9JTlRDLCBJTlRDX0lOVF9MT1dfTEVWRUwsIDAgfSwKLQl7IEFVMTAwMF9QQ0lfSU5URCwgSU5UQ19JTlRfTE9XX0xFVkVMLCAwIH0sCi0JeyBBVTEwMDBfRE1BX0lOVF9CQVNFLCBJTlRDX0lOVF9ISUdIX0xFVkVMLCAwIH0sCi0JeyBBVTEwMDBfRE1BX0lOVF9CQVNFKzEsIElOVENfSU5UX0hJR0hfTEVWRUwsIDAgfSwKLQl7IEFVMTAwMF9ETUFfSU5UX0JBU0UrMiwgSU5UQ19JTlRfSElHSF9MRVZFTCwgMCB9LAotCXsgQVUxMDAwX0RNQV9JTlRfQkFTRSszLCBJTlRDX0lOVF9ISUdIX0xFVkVMLCAwIH0sCi0JeyBBVTEwMDBfRE1BX0lOVF9CQVNFKzQsIElOVENfSU5UX0hJR0hfTEVWRUwsIDAgfSwKLQl7IEFVMTAwMF9ETUFfSU5UX0JBU0UrNSwgSU5UQ19JTlRfSElHSF9MRVZFTCwgMCB9LAotCXsgQVUxMDAwX0RNQV9JTlRfQkFTRSs2LCBJTlRDX0lOVF9ISUdIX0xFVkVMLCAwIH0sCi0JeyBBVTEwMDBfRE1BX0lOVF9CQVNFKzcsIElOVENfSU5UX0hJR0hfTEVWRUwsIDAgfSwKLQl7IEFVMTAwMF9UT1lfSU5ULCBJTlRDX0lOVF9SSVNFX0VER0UsIDAgfSwKLQl7IEFVMTAwMF9UT1lfTUFUQ0gwX0lOVCwgSU5UQ19JTlRfUklTRV9FREdFLCAwIH0sCi0JeyBBVTEwMDBfVE9ZX01BVENIMV9JTlQsIElOVENfSU5UX1JJU0VfRURHRSwgMCB9LAotCXsgQVUxMDAwX1RPWV9NQVRDSDJfSU5ULCBJTlRDX0lOVF9SSVNFX0VER0UsIDEgfSwKLQl7IEFVMTAwMF9SVENfSU5ULCBJTlRDX0lOVF9SSVNFX0VER0UsIDAgfSwKLQl7IEFVMTAwMF9SVENfTUFUQ0gwX0lOVCwgSU5UQ19JTlRfUklTRV9FREdFLCAwIH0sCi0JeyBBVTEwMDBfUlRDX01BVENIMV9JTlQsIElOVENfSU5UX1JJU0VfRURHRSwgMCB9LAotCXsgQVUxMDAwX1JUQ19NQVRDSDJfSU5ULCBJTlRDX0lOVF9SSVNFX0VER0UsIDAgfSwKLQl7IEFVMTAwMF9VU0JfREVWX1JFUV9JTlQsIElOVENfSU5UX0hJR0hfTEVWRUwsIDAgfSwKLQl7IEFVMTAwMF9VU0JfREVWX1NVU19JTlQsIElOVENfSU5UX1JJU0VfRURHRSwgMCB9LAotCXsgQVUxMDAwX1VTQl9IT1NUX0lOVCwgSU5UQ19JTlRfTE9XX0xFVkVMLCAwIH0sCi0JeyBBVTEwMDBfQUNTWU5DX0lOVCwgSU5UQ19JTlRfUklTRV9FREdFLCAwIH0sCi0JeyBBVTE1MDBfTUFDMF9ETUFfSU5ULCBJTlRDX0lOVF9ISUdIX0xFVkVMLCAwIH0sCi0JeyBBVTE1MDBfTUFDMV9ETUFfSU5ULCBJTlRDX0lOVF9ISUdIX0xFVkVMLCAwIH0sCi0JeyBBVTEwMDBfQUM5N0NfSU5ULCBJTlRDX0lOVF9SSVNFX0VER0UsIDAgfSwKLQotI2VsaWYgZGVmaW5lZChDT05GSUdfU09DX0FVMTEwMCkKLQotCXsgQVUxMTAwX1VBUlQwX0lOVCwgSU5UQ19JTlRfSElHSF9MRVZFTCwgMCB9LAotCXsgQVUxMTAwX1VBUlQxX0lOVCwgSU5UQ19JTlRfSElHSF9MRVZFTCwgMCB9LAotCXsgQVUxMTAwX1NEX0lOVCwgSU5UQ19JTlRfSElHSF9MRVZFTCwgMCB9LAotCXsgQVUxMTAwX1VBUlQzX0lOVCwgSU5UQ19JTlRfSElHSF9MRVZFTCwgMCB9LAotCXsgQVUxMDAwX1NTSTBfSU5ULCBJTlRDX0lOVF9ISUdIX0xFVkVMLCAwIH0sCi0JeyBBVTEwMDBfU1NJMV9JTlQsIElOVENfSU5UX0hJR0hfTEVWRUwsIDAgfSwKLQl7IEFVMTAwMF9ETUFfSU5UX0JBU0UsIElOVENfSU5UX0hJR0hfTEVWRUwsIDAgfSwKLQl7IEFVMTAwMF9ETUFfSU5UX0JBU0UrMSwgSU5UQ19JTlRfSElHSF9MRVZFTCwgMCB9LAotCXsgQVUxMDAwX0RNQV9JTlRfQkFTRSsyLCBJTlRDX0lOVF9ISUdIX0xFVkVMLCAwIH0sCi0JeyBBVTEwMDBfRE1BX0lOVF9CQVNFKzMsIElOVENfSU5UX0hJR0hfTEVWRUwsIDAgfSwKLQl7IEFVMTAwMF9ETUFfSU5UX0JBU0UrNCwgSU5UQ19JTlRfSElHSF9MRVZFTCwgMCB9LAotCXsgQVUxMDAwX0RNQV9JTlRfQkFTRSs1LCBJTlRDX0lOVF9ISUdIX0xFVkVMLCAwIH0sCi0JeyBBVTEwMDBfRE1BX0lOVF9CQVNFKzYsIElOVENfSU5UX0hJR0hfTEVWRUwsIDAgfSwKLQl7IEFVMTAwMF9ETUFfSU5UX0JBU0UrNywgSU5UQ19JTlRfSElHSF9MRVZFTCwgMCB9LAotCXsgQVUxMDAwX1RPWV9JTlQsIElOVENfSU5UX1JJU0VfRURHRSwgMCB9LAotCXsgQVUxMDAwX1RPWV9NQVRDSDBfSU5ULCBJTlRDX0lOVF9SSVNFX0VER0UsIDAgfSwKLQl7IEFVMTAwMF9UT1lfTUFUQ0gxX0lOVCwgSU5UQ19JTlRfUklTRV9FREdFLCAwIH0sCi0JeyBBVTEwMDBfVE9ZX01BVENIMl9JTlQsIElOVENfSU5UX1JJU0VfRURHRSwgMSB9LAotCXsgQVUxMDAwX1JUQ19JTlQsIElOVENfSU5UX1JJU0VfRURHRSwgMCB9LAotCXsgQVUxMDAwX1JUQ19NQVRDSDBfSU5ULCBJTlRDX0lOVF9SSVNFX0VER0UsIDAgfSwKLQl7IEFVMTAwMF9SVENfTUFUQ0gxX0lOVCwgSU5UQ19JTlRfUklTRV9FREdFLCAwIH0sCi0JeyBBVTEwMDBfUlRDX01BVENIMl9JTlQsIElOVENfSU5UX1JJU0VfRURHRSwgMCB9LAotCXsgQVUxMDAwX0lSREFfVFhfSU5ULCBJTlRDX0lOVF9ISUdIX0xFVkVMLCAwIH0sCi0JeyBBVTEwMDBfSVJEQV9SWF9JTlQsIElOVENfSU5UX0hJR0hfTEVWRUwsIDAgfSwKLQl7IEFVMTAwMF9VU0JfREVWX1JFUV9JTlQsIElOVENfSU5UX0hJR0hfTEVWRUwsIDAgfSwKLQl7IEFVMTAwMF9VU0JfREVWX1NVU19JTlQsIElOVENfSU5UX1JJU0VfRURHRSwgMCB9LAotCXsgQVUxMDAwX1VTQl9IT1NUX0lOVCwgSU5UQ19JTlRfTE9XX0xFVkVMLCAwIH0sCi0JeyBBVTEwMDBfQUNTWU5DX0lOVCwgSU5UQ19JTlRfUklTRV9FREdFLCAwIH0sCi0JeyBBVTExMDBfTUFDMF9ETUFfSU5ULCBJTlRDX0lOVF9ISUdIX0xFVkVMLCAwIH0sCi0JLyogeyBBVTEwMDBfR1BJTzIxNV8yMDhfSU5ULCBJTlRDX0lOVF9ISUdIX0xFVkVMLCAwIH0sICovCi0JeyBBVTExMDBfTENEX0lOVCwgSU5UQ19JTlRfSElHSF9MRVZFTCwgMCB9LAotCXsgQVUxMDAwX0FDOTdDX0lOVCwgSU5UQ19JTlRfUklTRV9FREdFLCAwIH0sCi0KLSNlbGlmIGRlZmluZWQoQ09ORklHX1NPQ19BVTE1NTApCi0KLQl7IEFVMTU1MF9VQVJUMF9JTlQsIElOVENfSU5UX0hJR0hfTEVWRUwsIDAgfSwKLQl7IEFVMTU1MF9QQ0lfSU5UQSwgSU5UQ19JTlRfTE9XX0xFVkVMLCAwIH0sCi0JeyBBVTE1NTBfUENJX0lOVEIsIElOVENfSU5UX0xPV19MRVZFTCwgMCB9LAotCXsgQVUxNTUwX0RETUFfSU5ULCBJTlRDX0lOVF9ISUdIX0xFVkVMLCAwIH0sCi0JeyBBVTE1NTBfQ1JZUFRPX0lOVCwgSU5UQ19JTlRfSElHSF9MRVZFTCwgMCB9LAotCXsgQVUxNTUwX1BDSV9JTlRDLCBJTlRDX0lOVF9MT1dfTEVWRUwsIDAgfSwKLQl7IEFVMTU1MF9QQ0lfSU5URCwgSU5UQ19JTlRfTE9XX0xFVkVMLCAwIH0sCi0JeyBBVTE1NTBfUENJX1JTVF9JTlQsIElOVENfSU5UX0xPV19MRVZFTCwgMCB9LAotCXsgQVUxNTUwX1VBUlQxX0lOVCwgSU5UQ19JTlRfSElHSF9MRVZFTCwgMCB9LAotCXsgQVUxNTUwX1VBUlQzX0lOVCwgSU5UQ19JTlRfSElHSF9MRVZFTCwgMCB9LAotCXsgQVUxNTUwX1BTQzBfSU5ULCBJTlRDX0lOVF9ISUdIX0xFVkVMLCAwIH0sCi0JeyBBVTE1NTBfUFNDMV9JTlQsIElOVENfSU5UX0hJR0hfTEVWRUwsIDAgfSwKLQl7IEFVMTU1MF9QU0MyX0lOVCwgSU5UQ19JTlRfSElHSF9MRVZFTCwgMCB9LAotCXsgQVUxNTUwX1BTQzNfSU5ULCBJTlRDX0lOVF9ISUdIX0xFVkVMLCAwIH0sCi0JeyBBVTEwMDBfVE9ZX0lOVCwgSU5UQ19JTlRfUklTRV9FREdFLCAwIH0sCi0JeyBBVTEwMDBfVE9ZX01BVENIMF9JTlQsIElOVENfSU5UX1JJU0VfRURHRSwgMCB9LAotCXsgQVUxMDAwX1RPWV9NQVRDSDFfSU5ULCBJTlRDX0lOVF9SSVNFX0VER0UsIDAgfSwKLQl7IEFVMTAwMF9UT1lfTUFUQ0gyX0lOVCwgSU5UQ19JTlRfUklTRV9FREdFLCAxIH0sCi0JeyBBVTEwMDBfUlRDX0lOVCwgSU5UQ19JTlRfUklTRV9FREdFLCAwIH0sCi0JeyBBVTEwMDBfUlRDX01BVENIMF9JTlQsIElOVENfSU5UX1JJU0VfRURHRSwgMCB9LAotCXsgQVUxMDAwX1JUQ19NQVRDSDFfSU5ULCBJTlRDX0lOVF9SSVNFX0VER0UsIDAgfSwKLQl7IEFVMTAwMF9SVENfTUFUQ0gyX0lOVCwgSU5UQ19JTlRfUklTRV9FREdFLCAwIH0sCi0JeyBBVTE1NTBfTkFORF9JTlQsIElOVENfSU5UX1JJU0VfRURHRSwgMCB9LAotCXsgQVUxNTUwX1VTQl9ERVZfUkVRX0lOVCwgSU5UQ19JTlRfSElHSF9MRVZFTCwgMCB9LAotCXsgQVUxNTUwX1VTQl9ERVZfU1VTX0lOVCwgSU5UQ19JTlRfUklTRV9FREdFLCAwIH0sCi0JeyBBVTE1NTBfVVNCX0hPU1RfSU5ULCBJTlRDX0lOVF9MT1dfTEVWRUwsIDAgfSwKLQl7IEFVMTU1MF9NQUMwX0RNQV9JTlQsIElOVENfSU5UX0hJR0hfTEVWRUwsIDAgfSwKLQl7IEFVMTU1MF9NQUMxX0RNQV9JTlQsIElOVENfSU5UX0hJR0hfTEVWRUwsIDAgfSwKLQotI2VsaWYgZGVmaW5lZChDT05GSUdfU09DX0FVMTIwMCkKLQotCXsgQVUxMjAwX1VBUlQwX0lOVCwgSU5UQ19JTlRfSElHSF9MRVZFTCwgMCB9LAotCXsgQVUxMjAwX1NXVF9JTlQsIElOVENfSU5UX1JJU0VfRURHRSwgMCB9LAotCXsgQVUxMjAwX1NEX0lOVCwgSU5UQ19JTlRfSElHSF9MRVZFTCwgMCB9LAotCXsgQVUxMjAwX0RETUFfSU5ULCBJTlRDX0lOVF9ISUdIX0xFVkVMLCAwIH0sCi0JeyBBVTEyMDBfTUFFX0JFX0lOVCwgSU5UQ19JTlRfSElHSF9MRVZFTCwgMCB9LAotCXsgQVUxMjAwX1VBUlQxX0lOVCwgSU5UQ19JTlRfSElHSF9MRVZFTCwgMCB9LAotCXsgQVUxMjAwX01BRV9GRV9JTlQsIElOVENfSU5UX0hJR0hfTEVWRUwsIDAgfSwKLQl7IEFVMTIwMF9QU0MwX0lOVCwgSU5UQ19JTlRfSElHSF9MRVZFTCwgMCB9LAotCXsgQVUxMjAwX1BTQzFfSU5ULCBJTlRDX0lOVF9ISUdIX0xFVkVMLCAwIH0sCi0JeyBBVTEyMDBfQUVTX0lOVCwgSU5UQ19JTlRfSElHSF9MRVZFTCwgMCB9LAotCXsgQVUxMjAwX0NBTUVSQV9JTlQsIElOVENfSU5UX0hJR0hfTEVWRUwsIDAgfSwKLQl7IEFVMTAwMF9UT1lfSU5ULCBJTlRDX0lOVF9SSVNFX0VER0UsIDAgfSwKLQl7IEFVMTAwMF9UT1lfTUFUQ0gwX0lOVCwgSU5UQ19JTlRfUklTRV9FREdFLCAwIH0sCi0JeyBBVTEwMDBfVE9ZX01BVENIMV9JTlQsIElOVENfSU5UX1JJU0VfRURHRSwgMCB9LAotCXsgQVUxMDAwX1RPWV9NQVRDSDJfSU5ULCBJTlRDX0lOVF9SSVNFX0VER0UsIDEgfSwKLQl7IEFVMTAwMF9SVENfSU5ULCBJTlRDX0lOVF9SSVNFX0VER0UsIDAgfSwKLQl7IEFVMTAwMF9SVENfTUFUQ0gwX0lOVCwgSU5UQ19JTlRfUklTRV9FREdFLCAwIH0sCi0JeyBBVTEwMDBfUlRDX01BVENIMV9JTlQsIElOVENfSU5UX1JJU0VfRURHRSwgMCB9LAotCXsgQVUxMDAwX1JUQ19NQVRDSDJfSU5ULCBJTlRDX0lOVF9SSVNFX0VER0UsIDAgfSwKLQl7IEFVMTIwMF9OQU5EX0lOVCwgSU5UQ19JTlRfUklTRV9FREdFLCAwIH0sCi0JeyBBVTEyMDBfVVNCX0lOVCwgSU5UQ19JTlRfSElHSF9MRVZFTCwgMCB9LAotCXsgQVUxMjAwX0xDRF9JTlQsIElOVENfSU5UX0hJR0hfTEVWRUwsIDAgfSwKLQl7IEFVMTIwMF9NQUVfQk9USF9JTlQsIElOVENfSU5UX0hJR0hfTEVWRUwsIDAgfSwKLQotI2Vsc2UKLSNlcnJvciAiRXJyb3I6IFVua25vd24gQWxjaGVteSBTT0MiCi0jZW5kaWYKLQotfTsKLQotaW50IF9faW5pdGRhdGEgYXUxeHh4X2ljMF9ucl9pcnFzID0gQVJSQVlfU0laRShhdTF4eHhfaWMwX21hcCk7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvYWxjaGVteS9jb21tb24vY2xvY2tzLmMgYi9hcmNoL21pcHMvYWxjaGVteS9jb21tb24vY2xvY2tzLmMKaW5kZXggMDQzNDI5ZC4uZDg5OTE4NSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2FsY2hlbXkvY29tbW9uL2Nsb2Nrcy5jCisrKyBiL2FyY2gvbWlwcy9hbGNoZW15L2NvbW1vbi9jbG9ja3MuYwpAQCAtMjcsMTIgKzI3LDIxIEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8YXNtL3RpbWUuaD4KICNpbmNsdWRlIDxhc20vbWFjaC1hdTF4MDAvYXUxMDAwLmg+CiAKKy8qCisgKiBJIGhhdmVuJ3QgZm91bmQgYW55b25lIHRoYXQgZG9lc24ndCB1c2UgYSAxMiBNSHogc291cmNlIGNsb2NrLAorICogYnV0IGp1c3QgaW4gY2FzZS4uLi4uCisgKi8KKyNkZWZpbmUgQVUxMDAwX1NSQ19DTEsJMTIwMDAwMDAKKwogc3RhdGljIHVuc2lnbmVkIGludCBhdTF4MDBfY2xvY2s7IC8qICBIeiAqLwotc3RhdGljIHVuc2lnbmVkIGludCBsY2RfY2xvY2s7ICAgIC8qIEtIeiAqLwogc3RhdGljIHVuc2lnbmVkIGxvbmcgdWFydF9iYXVkX2Jhc2U7CiAKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0sodGltZV9sb2NrKTsKKwogLyoKICAqIFNldCB0aGUgYXUxMDAwX2Nsb2NrCiAgKi8KQEAgLTYzLDMxICs3Miw0NSBAQAogfQogCiAvKgotICogQ2FsY3VsYXRlIHRoZSBBdTF4MDAncyBMQ0QgY2xvY2sgYmFzZWQgb24gdGhlIGN1cnJlbnQKLSAqIGNwdSBjbG9jayBhbmQgdGhlIHN5c3RlbSBidXMgY2xvY2ssIGFuZCB0cnkgdG8ga2VlcCBpdAotICogYmVsb3cgNDAgTUh6ICh0aGUgUGIxMDAwIGJvYXJkIGNhbiBsb2NrLXVwIGlmIHRoZSBMQ0QKLSAqIGNsb2NrIGlzIG92ZXIgNDAgTUh6KS4KKyAqIFdlIHJlYWQgdGhlIHJlYWwgcHJvY2Vzc29yIHNwZWVkIGZyb20gdGhlIFBMTC4gIFRoaXMgaXMgaW1wb3J0YW50CisgKiBiZWNhdXNlIGl0IGlzIG1vcmUgYWNjdXJhdGUgdGhhbiBjb21wdXRpbmcgaXQgZnJvbSB0aGUgMzIgS0h6CisgKiBjb3VudGVyLCBpZiBpdCBleGlzdHMuICBJZiB3ZSBkb24ndCBoYXZlIGFuIGFjY3VyYXRlIHByb2Nlc3NvcgorICogc3BlZWQsIGFsbCBvZiB0aGUgcGVyaXBoZXJhbHMgdGhhdCBkZXJpdmUgdGhlaXIgY2xvY2tzIGJhc2VkIG9uCisgKiB0aGlzIGFkdmVydGlzZWQgc3BlZWQgd2lsbCBpbnRyb2R1Y2UgZXJyb3IgYW5kIHNvbWV0aW1lcyBub3Qgd29yaworICogcHJvcGVybHkuICBUaGlzIGZ1bmN0aW9uIGlzIGZ1dGhlciBjb252b2x1dGVkIHRvIHN0aWxsIGFsbG93IGNvbmZpZ3VyYXRpb25zCisgKiB0byBkbyB0aGF0IGluIGNhc2UgdGhleSBoYXZlIHJlYWxseSwgcmVhbGx5IG9sZCBzaWxpY29uIHdpdGggYQorICogd3JpdGUtb25seSBQTEwgcmVnaXN0ZXIuCQkJLS0gRGFuCiAgKi8KLXZvaWQgc2V0X2F1MXgwMF9sY2RfY2xvY2sodm9pZCkKK3Vuc2lnbmVkIGxvbmcgYXUxeHh4X2NhbGNfY2xvY2sodm9pZCkKIHsKLQl1bnNpZ25lZCBpbnQgc3RhdGljX2NmZzA7Ci0JdW5zaWduZWQgaW50IHN5c19idXNjbGsgPSAoZ2V0X2F1MXgwMF9zcGVlZCgpIC8gMTAwMCkgLwotCQkJCSAgKChpbnQpKGF1X3JlYWRsKFNZU19QT1dFUkNUUkwpICYgMHgwMykgKyAyKTsKKwl1bnNpZ25lZCBsb25nIGNwdV9zcGVlZDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0Jc3RhdGljX2NmZzAgPSBhdV9yZWFkbChNRU1fU1RDRkcwKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdGltZV9sb2NrLCBmbGFncyk7CiAKLQlpZiAoc3RhdGljX2NmZzAgJiAoMSA8PCAxMSkpCi0JCWxjZF9jbG9jayA9IHN5c19idXNjbGsgLyA1OyAvKiBub3RlOiBCQ0xLIHN3aXRjaGluZyBmYWlscyB3aXRoIEQ1ICovCisJLyoKKwkgKiBPbiBlYXJseSBBdTEwMDAsIHN5c19jcHVwbGwgd2FzIHdyaXRlLW9ubHkuIFNpbmNlIHRoZXNlCisJICogc2lsaWNvbiB2ZXJzaW9ucyBvZiBBdTEwMDAgYXJlIG5vdCBzb2xkIGJ5IEFNRCwgd2UgZG9uJ3QgYmVuZAorCSAqIG92ZXIgYmFja3dhcmRzIHRyeWluZyB0byBkZXRlcm1pbmUgdGhlIGZyZXF1ZW5jeS4KKwkgKi8KKwlpZiAoYXUxeHh4X2NwdV9oYXNfcGxsX3dvKCkpCisjaWZkZWYgQ09ORklHX1NPQ19BVTEwMDBfRlJFUVVFTkNZCisJCWNwdV9zcGVlZCA9IENPTkZJR19TT0NfQVUxMDAwX0ZSRVFVRU5DWTsKKyNlbHNlCisJCWNwdV9zcGVlZCA9IDM5NjAwMDAwMDsKKyNlbmRpZgogCWVsc2UKLQkJbGNkX2Nsb2NrID0gc3lzX2J1c2NsayAvIDQ7CisJCWNwdV9zcGVlZCA9IChhdV9yZWFkbChTWVNfQ1BVUExMKSAmIDB4MDAwMDAwM2YpICogQVUxMDAwX1NSQ19DTEs7CiAKLQlpZiAobGNkX2Nsb2NrID4gNTAwMDApIC8qIEVwc29uIE1BWCAqLwotCQlwcmludGsoS0VSTl9XQVJOSU5HICJ3YXJuaW5nOiBMQ0QgY2xvY2sgdG9vIGhpZ2ggKCV1IEtIeilcbiIsCi0JCQkJICAgIGxjZF9jbG9jayk7Ci19CisJLyogT24gQWxjaGVteSBDUFU6Y291bnRlciByYXRpbyBpcyAxOjEgKi8KKwltaXBzX2hwdF9mcmVxdWVuY3kgPSBjcHVfc3BlZWQ7CisJLyogRXF1YXRpb246IEJhdWRyYXRlID0gQ1BVIC8gKFNEICogMiAqIENMS0RJViAqIDE2KSAqLworCXNldF9hdTF4MDBfdWFydF9iYXVkX2Jhc2UoY3B1X3NwZWVkIC8gKDIgKiAoKGludCkoYXVfcmVhZGwoU1lTX1BPV0VSQ1RSTCkKKwkJCQkJCQkgICYgMHgwMykgKyAyKSAqIDE2KSk7CiAKLXVuc2lnbmVkIGludCBnZXRfYXUxeDAwX2xjZF9jbG9jayh2b2lkKQotewotCXJldHVybiBsY2RfY2xvY2s7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdGltZV9sb2NrLCBmbGFncyk7CisKKwlzZXRfYXUxeDAwX3NwZWVkKGNwdV9zcGVlZCk7CisKKwlyZXR1cm4gY3B1X3NwZWVkOwogfQotRVhQT1JUX1NZTUJPTChnZXRfYXUxeDAwX2xjZF9jbG9jayk7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvYWxjaGVteS9jb21tb24vY3B1dGFibGUuYyBiL2FyY2gvbWlwcy9hbGNoZW15L2NvbW1vbi9jcHV0YWJsZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTY0MzBiLi4wMDAwMDAwCi0tLSBhL2FyY2gvbWlwcy9hbGNoZW15L2NvbW1vbi9jcHV0YWJsZS5jCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoKLSAqICBhcmNoL21pcHMvYXUxMDAwL2NvbW1vbi9jcHV0YWJsZS5jCi0gKgotICogIENvcHlyaWdodCAoQykgMjAwNCBEYW4gTWFsZWsgKGRhbkBlbWJlZGRlZGVkZ2UuY29tKQotICoJQ29waWVkIGZyb20gUG93ZXJQQyBhbmQgdXBkYXRlZCBmb3IgQWxjaGVteSBBdTF4eHggcHJvY2Vzc29ycy4KLSAqCi0gKiAgQ29weXJpZ2h0IChDKSAyMDAxIEJlbi4gSGVycmVuc2NobWlkdCAoYmVuaEBrZXJuZWwuY3Jhc2hpbmcub3JnKQotICoKLSAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KLSAqICAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICovCi0KLSNpbmNsdWRlIDxhc20vbWFjaC1hdTF4MDAvYXUxMDAwLmg+Ci0KLXN0cnVjdCBjcHVfc3BlYyAqY3VyX2NwdV9zcGVjW05SX0NQVVNdOwotCi0vKiBXaXRoIHNvbWUgdGhvdWdodCwgd2UgY2FuIHByb2JhYmx5IHVzZSB0aGUgbWFzayB0byByZWR1Y2UgdGhlCi0gKiBzaXplIG9mIHRoZSB0YWJsZS4KLSAqLwotc3RydWN0IGNwdV9zcGVjIGNwdV9zcGVjc1tdID0gewotCXsgMHhmZmZmZmZmZiwgMHgwMDAzMDEwMCwgIkF1MTAwMCBEQSIsIDEsIDAsIDEgfSwKLQl7IDB4ZmZmZmZmZmYsIDB4MDAwMzAyMDEsICJBdTEwMDAgSEEiLCAxLCAwLCAxIH0sCi0JeyAweGZmZmZmZmZmLCAweDAwMDMwMjAyLCAiQXUxMDAwIEhCIiwgMSwgMCwgMSB9LAotCXsgMHhmZmZmZmZmZiwgMHgwMDAzMDIwMywgIkF1MTAwMCBIQyIsIDEsIDEsIDAgfSwKLQl7IDB4ZmZmZmZmZmYsIDB4MDAwMzAyMDQsICJBdTEwMDAgSEQiLCAxLCAxLCAwIH0sCi0JeyAweGZmZmZmZmZmLCAweDAxMDMwMjAwLCAiQXUxNTAwIEFCIiwgMSwgMSwgMCB9LAotCXsgMHhmZmZmZmZmZiwgMHgwMTAzMDIwMSwgIkF1MTUwMCBBQyIsIDAsIDEsIDAgfSwKLQl7IDB4ZmZmZmZmZmYsIDB4MDEwMzAyMDIsICJBdTE1MDAgQUQiLCAwLCAxLCAwIH0sCi0JeyAweGZmZmZmZmZmLCAweDAyMDMwMjAwLCAiQXUxMTAwIEFCIiwgMSwgMSwgMCB9LAotCXsgMHhmZmZmZmZmZiwgMHgwMjAzMDIwMSwgIkF1MTEwMCBCQSIsIDEsIDEsIDAgfSwKLQl7IDB4ZmZmZmZmZmYsIDB4MDIwMzAyMDIsICJBdTExMDAgQkMiLCAxLCAxLCAwIH0sCi0JeyAweGZmZmZmZmZmLCAweDAyMDMwMjAzLCAiQXUxMTAwIEJEIiwgMCwgMSwgMCB9LAotCXsgMHhmZmZmZmZmZiwgMHgwMjAzMDIwNCwgIkF1MTEwMCBCRSIsIDAsIDEsIDAgfSwKLQl7IDB4ZmZmZmZmZmYsIDB4MDMwMzAyMDAsICJBdTE1NTAgQUEiLCAwLCAxLCAwIH0sCi0JeyAweGZmZmZmZmZmLCAweDA0MDMwMjAwLCAiQXUxMjAwIEFCIiwgMCwgMCwgMCB9LAotCXsgMHhmZmZmZmZmZiwgMHgwNDAzMDIwMSwgIkF1MTIwMCBBQyIsIDEsIDAsIDAgfSwKLQl7IDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsICJVbmtub3duIEF1MXh4eCIsIDEsIDAsIDAgfQotfTsKLQotdm9pZCBzZXRfY3B1c3BlYyh2b2lkKQotewotCXN0cnVjdAljcHVfc3BlYyAqc3A7Ci0JdTMyCXByaWQ7Ci0KLQlwcmlkID0gcmVhZF9jMF9wcmlkKCk7Ci0Jc3AgPSBjcHVfc3BlY3M7Ci0Jd2hpbGUgKChwcmlkICYgc3AtPnByaWRfbWFzaykgIT0gc3AtPnByaWRfdmFsdWUpCi0JCXNwKys7Ci0JY3VyX2NwdV9zcGVjWzBdID0gc3A7Ci19CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvYWxjaGVteS9jb21tb24vZGJkbWEuYyBiL2FyY2gvbWlwcy9hbGNoZW15L2NvbW1vbi9kYmRtYS5jCmluZGV4IDYwMWVlOTEuLjNhYjZkODAgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9hbGNoZW15L2NvbW1vbi9kYmRtYS5jCisrKyBiL2FyY2gvbWlwcy9hbGNoZW15L2NvbW1vbi9kYmRtYS5jCkBAIC0xNzQsNiArMTc0LDExIEBACiAKICNkZWZpbmUgREJERVZfVEFCX1NJWkUJQVJSQVlfU0laRShkYmRldl90YWIpCiAKKyNpZmRlZiBDT05GSUdfUE0KK3N0YXRpYyB1MzIgYXUxeHh4X2RiZG1hX3BtX3JlZ3NbTlVNX0RCRE1BX0NIQU5TICsgMV1bOF07CisjZW5kaWYKKworCiBzdGF0aWMgY2hhbl90YWJfdCAqY2hhbl90YWJfcHRyW05VTV9EQkRNQV9DSEFOU107CiAKIHN0YXRpYyBkYmRldl90YWJfdCAqZmluZF9kYmRldl9pZCh1MzIgaWQpCkBAIC05NzUsNCArOTgwLDY0IEBACiAJcmV0dXJuIG5ieXRlczsKIH0KIAorI2lmZGVmIENPTkZJR19QTQordm9pZCBhdTF4eHhfZGJkbWFfc3VzcGVuZCh2b2lkKQoreworCWludCBpOworCXUzMiBhZGRyOworCisJYWRkciA9IERETUFfR0xPQkFMX0JBU0U7CisJYXUxeHh4X2RiZG1hX3BtX3JlZ3NbMF1bMF0gPSBhdV9yZWFkbChhZGRyICsgMHgwMCk7CisJYXUxeHh4X2RiZG1hX3BtX3JlZ3NbMF1bMV0gPSBhdV9yZWFkbChhZGRyICsgMHgwNCk7CisJYXUxeHh4X2RiZG1hX3BtX3JlZ3NbMF1bMl0gPSBhdV9yZWFkbChhZGRyICsgMHgwOCk7CisJYXUxeHh4X2RiZG1hX3BtX3JlZ3NbMF1bM10gPSBhdV9yZWFkbChhZGRyICsgMHgwYyk7CisKKwkvKiBzYXZlIGNoYW5uZWwgY29uZmlndXJhdGlvbnMgKi8KKwlmb3IgKGkgPSAxLCBhZGRyID0gRERNQV9DSEFOTkVMX0JBU0U7IGkgPCBOVU1fREJETUFfQ0hBTlM7IGkrKykgeworCQlhdTF4eHhfZGJkbWFfcG1fcmVnc1tpXVswXSA9IGF1X3JlYWRsKGFkZHIgKyAweDAwKTsKKwkJYXUxeHh4X2RiZG1hX3BtX3JlZ3NbaV1bMV0gPSBhdV9yZWFkbChhZGRyICsgMHgwNCk7CisJCWF1MXh4eF9kYmRtYV9wbV9yZWdzW2ldWzJdID0gYXVfcmVhZGwoYWRkciArIDB4MDgpOworCQlhdTF4eHhfZGJkbWFfcG1fcmVnc1tpXVszXSA9IGF1X3JlYWRsKGFkZHIgKyAweDBjKTsKKwkJYXUxeHh4X2RiZG1hX3BtX3JlZ3NbaV1bNF0gPSBhdV9yZWFkbChhZGRyICsgMHgxMCk7CisJCWF1MXh4eF9kYmRtYV9wbV9yZWdzW2ldWzVdID0gYXVfcmVhZGwoYWRkciArIDB4MTQpOworCQlhdTF4eHhfZGJkbWFfcG1fcmVnc1tpXVs2XSA9IGF1X3JlYWRsKGFkZHIgKyAweDE4KTsKKworCQkvKiBoYWx0IGNoYW5uZWwgKi8KKwkJYXVfd3JpdGVsKGF1MXh4eF9kYmRtYV9wbV9yZWdzW2ldWzBdICYgfjEsIGFkZHIgKyAweDAwKTsKKwkJYXVfc3luYygpOworCQl3aGlsZSAoIShhdV9yZWFkbChhZGRyICsgMHgxNCkgJiAxKSkKKwkJCWF1X3N5bmMoKTsKKworCQlhZGRyICs9IDB4MTAwOwkvKiBuZXh0IGNoYW5uZWwgYmFzZSAqLworCX0KKwkvKiBkaXNhYmxlIGNoYW5uZWwgaW50ZXJydXB0cyAqLworCWF1X3dyaXRlbCgwLCBERE1BX0dMT0JBTF9CQVNFICsgMHgwYyk7CisJYXVfc3luYygpOworfQorCit2b2lkIGF1MXh4eF9kYmRtYV9yZXN1bWUodm9pZCkKK3sKKwlpbnQgaTsKKwl1MzIgYWRkcjsKKworCWFkZHIgPSBERE1BX0dMT0JBTF9CQVNFOworCWF1X3dyaXRlbChhdTF4eHhfZGJkbWFfcG1fcmVnc1swXVswXSwgYWRkciArIDB4MDApOworCWF1X3dyaXRlbChhdTF4eHhfZGJkbWFfcG1fcmVnc1swXVsxXSwgYWRkciArIDB4MDQpOworCWF1X3dyaXRlbChhdTF4eHhfZGJkbWFfcG1fcmVnc1swXVsyXSwgYWRkciArIDB4MDgpOworCWF1X3dyaXRlbChhdTF4eHhfZGJkbWFfcG1fcmVnc1swXVszXSwgYWRkciArIDB4MGMpOworCisJLyogcmVzdG9yZSBjaGFubmVsIGNvbmZpZ3VyYXRpb25zICovCisJZm9yIChpID0gMSwgYWRkciA9IERETUFfQ0hBTk5FTF9CQVNFOyBpIDwgTlVNX0RCRE1BX0NIQU5TOyBpKyspIHsKKwkJYXVfd3JpdGVsKGF1MXh4eF9kYmRtYV9wbV9yZWdzW2ldWzBdLCBhZGRyICsgMHgwMCk7CisJCWF1X3dyaXRlbChhdTF4eHhfZGJkbWFfcG1fcmVnc1tpXVsxXSwgYWRkciArIDB4MDQpOworCQlhdV93cml0ZWwoYXUxeHh4X2RiZG1hX3BtX3JlZ3NbaV1bMl0sIGFkZHIgKyAweDA4KTsKKwkJYXVfd3JpdGVsKGF1MXh4eF9kYmRtYV9wbV9yZWdzW2ldWzNdLCBhZGRyICsgMHgwYyk7CisJCWF1X3dyaXRlbChhdTF4eHhfZGJkbWFfcG1fcmVnc1tpXVs0XSwgYWRkciArIDB4MTApOworCQlhdV93cml0ZWwoYXUxeHh4X2RiZG1hX3BtX3JlZ3NbaV1bNV0sIGFkZHIgKyAweDE0KTsKKwkJYXVfd3JpdGVsKGF1MXh4eF9kYmRtYV9wbV9yZWdzW2ldWzZdLCBhZGRyICsgMHgxOCk7CisJCWF1X3N5bmMoKTsKKwkJYWRkciArPSAweDEwMDsJLyogbmV4dCBjaGFubmVsIGJhc2UgKi8KKwl9Cit9CisjZW5kaWYJLyogQ09ORklHX1BNICovCiAjZW5kaWYgLyogZGVmaW5lZChDT05GSUdfU09DX0FVMTU1MCkgfHwgZGVmaW5lZChDT05GSUdfU09DX0FVMTIwMCkgKi8KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9hbGNoZW15L2NvbW1vbi9pcnEuYyBiL2FyY2gvbWlwcy9hbGNoZW15L2NvbW1vbi9pcnEuYwppbmRleCA0MGM2Y2VjLi5jODhjODIxIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvYWxjaGVteS9jb21tb24vaXJxLmMKKysrIGIvYXJjaC9taXBzL2FsY2hlbXkvY29tbW9uL2lycS5jCkBAIC0yNCw2ICsyNCw3IEBACiAgKiAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCiAgKiAgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCiAgKi8KKwogI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KQEAgLTM2LDE1ICszNywxNzIgQEAKICNpbmNsdWRlIDxhc20vbWFjaC1wYjF4MDAvcGIxMDAwLmg+CiAjZW5kaWYKIAotI2RlZmluZSBFWFRfSU5UQzBfUkVRMCAyIC8qIElQIDIgKi8KLSNkZWZpbmUgRVhUX0lOVEMwX1JFUTEgMyAvKiBJUCAzICovCi0jZGVmaW5lIEVYVF9JTlRDMV9SRVEwIDQgLyogSVAgNCAqLwotI2RlZmluZSBFWFRfSU5UQzFfUkVRMSA1IC8qIElQIDUgKi8KLSNkZWZpbmUgTUlQU19USU1FUl9JUCAgNyAvKiBJUCA3ICovCitzdGF0aWMgaW50IGF1MXhfaWNfc2V0dHlwZSh1bnNpZ25lZCBpbnQgaXJxLCB1bnNpZ25lZCBpbnQgZmxvd190eXBlKTsKIAotdm9pZCAoKmJvYXJkX2luaXRfaXJxKSh2b2lkKSBfX2luaXRkYXRhID0gTlVMTDsKKy8qIHBlci1wcm9jZXNzb3IgZml4ZWQgZnVuY3Rpb24gaXJxcyAqLworc3RydWN0IGF1MXh4eF9pcnFtYXAgYXUxeHh4X2ljMF9tYXBbXSBfX2luaXRkYXRhID0gewogCi1zdGF0aWMgREVGSU5FX1NQSU5MT0NLKGlycV9sb2NrKTsKKyNpZiBkZWZpbmVkKENPTkZJR19TT0NfQVUxMDAwKQorCXsgQVUxMDAwX1VBUlQwX0lOVCwgSVJRX1RZUEVfTEVWRUxfSElHSCwgMCB9LAorCXsgQVUxMDAwX1VBUlQxX0lOVCwgSVJRX1RZUEVfTEVWRUxfSElHSCwgMCB9LAorCXsgQVUxMDAwX1VBUlQyX0lOVCwgSVJRX1RZUEVfTEVWRUxfSElHSCwgMCB9LAorCXsgQVUxMDAwX1VBUlQzX0lOVCwgSVJRX1RZUEVfTEVWRUxfSElHSCwgMCB9LAorCXsgQVUxMDAwX1NTSTBfSU5ULCBJUlFfVFlQRV9MRVZFTF9ISUdILCAwIH0sCisJeyBBVTEwMDBfU1NJMV9JTlQsIElSUV9UWVBFX0xFVkVMX0hJR0gsIDAgfSwKKwl7IEFVMTAwMF9ETUFfSU5UX0JBU0UsIElSUV9UWVBFX0xFVkVMX0hJR0gsIDAgfSwKKwl7IEFVMTAwMF9ETUFfSU5UX0JBU0UrMSwgSVJRX1RZUEVfTEVWRUxfSElHSCwgMCB9LAorCXsgQVUxMDAwX0RNQV9JTlRfQkFTRSsyLCBJUlFfVFlQRV9MRVZFTF9ISUdILCAwIH0sCisJeyBBVTEwMDBfRE1BX0lOVF9CQVNFKzMsIElSUV9UWVBFX0xFVkVMX0hJR0gsIDAgfSwKKwl7IEFVMTAwMF9ETUFfSU5UX0JBU0UrNCwgSVJRX1RZUEVfTEVWRUxfSElHSCwgMCB9LAorCXsgQVUxMDAwX0RNQV9JTlRfQkFTRSs1LCBJUlFfVFlQRV9MRVZFTF9ISUdILCAwIH0sCisJeyBBVTEwMDBfRE1BX0lOVF9CQVNFKzYsIElSUV9UWVBFX0xFVkVMX0hJR0gsIDAgfSwKKwl7IEFVMTAwMF9ETUFfSU5UX0JBU0UrNywgSVJRX1RZUEVfTEVWRUxfSElHSCwgMCB9LAorCXsgQVUxMDAwX1RPWV9JTlQsIElSUV9UWVBFX0VER0VfUklTSU5HLCAwIH0sCisJeyBBVTEwMDBfVE9ZX01BVENIMF9JTlQsIElSUV9UWVBFX0VER0VfUklTSU5HLCAwIH0sCisJeyBBVTEwMDBfVE9ZX01BVENIMV9JTlQsIElSUV9UWVBFX0VER0VfUklTSU5HLCAwIH0sCisJeyBBVTEwMDBfVE9ZX01BVENIMl9JTlQsIElSUV9UWVBFX0VER0VfUklTSU5HLCAxIH0sCisJeyBBVTEwMDBfUlRDX0lOVCwgSVJRX1RZUEVfRURHRV9SSVNJTkcsIDAgfSwKKwl7IEFVMTAwMF9SVENfTUFUQ0gwX0lOVCwgSVJRX1RZUEVfRURHRV9SSVNJTkcsIDAgfSwKKwl7IEFVMTAwMF9SVENfTUFUQ0gxX0lOVCwgSVJRX1RZUEVfRURHRV9SSVNJTkcsIDAgfSwKKwl7IEFVMTAwMF9SVENfTUFUQ0gyX0lOVCwgSVJRX1RZUEVfRURHRV9SSVNJTkcsIDAgfSwKKwl7IEFVMTAwMF9JUkRBX1RYX0lOVCwgSVJRX1RZUEVfTEVWRUxfSElHSCwgMCB9LAorCXsgQVUxMDAwX0lSREFfUlhfSU5ULCBJUlFfVFlQRV9MRVZFTF9ISUdILCAwIH0sCisJeyBBVTEwMDBfVVNCX0RFVl9SRVFfSU5ULCBJUlFfVFlQRV9MRVZFTF9ISUdILCAwIH0sCisJeyBBVTEwMDBfVVNCX0RFVl9TVVNfSU5ULCBJUlFfVFlQRV9FREdFX1JJU0lORywgMCB9LAorCXsgQVUxMDAwX1VTQl9IT1NUX0lOVCwgSVJRX1RZUEVfTEVWRUxfTE9XLCAwIH0sCisJeyBBVTEwMDBfQUNTWU5DX0lOVCwgSVJRX1RZUEVfRURHRV9SSVNJTkcsIDAgfSwKKwl7IEFVMTAwMF9NQUMwX0RNQV9JTlQsIElSUV9UWVBFX0xFVkVMX0hJR0gsIDAgfSwKKwl7IEFVMTAwMF9NQUMxX0RNQV9JTlQsIElSUV9UWVBFX0xFVkVMX0hJR0gsIDAgfSwKKwl7IEFVMTAwMF9BQzk3Q19JTlQsIElSUV9UWVBFX0VER0VfUklTSU5HLCAwIH0sCisKKyNlbGlmIGRlZmluZWQoQ09ORklHX1NPQ19BVTE1MDApCisKKwl7IEFVMTUwMF9VQVJUMF9JTlQsIElSUV9UWVBFX0xFVkVMX0hJR0gsIDAgfSwKKwl7IEFVMTAwMF9QQ0lfSU5UQSwgSVJRX1RZUEVfTEVWRUxfTE9XLCAwIH0sCisJeyBBVTEwMDBfUENJX0lOVEIsIElSUV9UWVBFX0xFVkVMX0xPVywgMCB9LAorCXsgQVUxNTAwX1VBUlQzX0lOVCwgSVJRX1RZUEVfTEVWRUxfSElHSCwgMCB9LAorCXsgQVUxMDAwX1BDSV9JTlRDLCBJUlFfVFlQRV9MRVZFTF9MT1csIDAgfSwKKwl7IEFVMTAwMF9QQ0lfSU5URCwgSVJRX1RZUEVfTEVWRUxfTE9XLCAwIH0sCisJeyBBVTEwMDBfRE1BX0lOVF9CQVNFLCBJUlFfVFlQRV9MRVZFTF9ISUdILCAwIH0sCisJeyBBVTEwMDBfRE1BX0lOVF9CQVNFKzEsIElSUV9UWVBFX0xFVkVMX0hJR0gsIDAgfSwKKwl7IEFVMTAwMF9ETUFfSU5UX0JBU0UrMiwgSVJRX1RZUEVfTEVWRUxfSElHSCwgMCB9LAorCXsgQVUxMDAwX0RNQV9JTlRfQkFTRSszLCBJUlFfVFlQRV9MRVZFTF9ISUdILCAwIH0sCisJeyBBVTEwMDBfRE1BX0lOVF9CQVNFKzQsIElSUV9UWVBFX0xFVkVMX0hJR0gsIDAgfSwKKwl7IEFVMTAwMF9ETUFfSU5UX0JBU0UrNSwgSVJRX1RZUEVfTEVWRUxfSElHSCwgMCB9LAorCXsgQVUxMDAwX0RNQV9JTlRfQkFTRSs2LCBJUlFfVFlQRV9MRVZFTF9ISUdILCAwIH0sCisJeyBBVTEwMDBfRE1BX0lOVF9CQVNFKzcsIElSUV9UWVBFX0xFVkVMX0hJR0gsIDAgfSwKKwl7IEFVMTAwMF9UT1lfSU5ULCBJUlFfVFlQRV9FREdFX1JJU0lORywgMCB9LAorCXsgQVUxMDAwX1RPWV9NQVRDSDBfSU5ULCBJUlFfVFlQRV9FREdFX1JJU0lORywgMCB9LAorCXsgQVUxMDAwX1RPWV9NQVRDSDFfSU5ULCBJUlFfVFlQRV9FREdFX1JJU0lORywgMCB9LAorCXsgQVUxMDAwX1RPWV9NQVRDSDJfSU5ULCBJUlFfVFlQRV9FREdFX1JJU0lORywgMSB9LAorCXsgQVUxMDAwX1JUQ19JTlQsIElSUV9UWVBFX0VER0VfUklTSU5HLCAwIH0sCisJeyBBVTEwMDBfUlRDX01BVENIMF9JTlQsIElSUV9UWVBFX0VER0VfUklTSU5HLCAwIH0sCisJeyBBVTEwMDBfUlRDX01BVENIMV9JTlQsIElSUV9UWVBFX0VER0VfUklTSU5HLCAwIH0sCisJeyBBVTEwMDBfUlRDX01BVENIMl9JTlQsIElSUV9UWVBFX0VER0VfUklTSU5HLCAwIH0sCisJeyBBVTEwMDBfVVNCX0RFVl9SRVFfSU5ULCBJUlFfVFlQRV9MRVZFTF9ISUdILCAwIH0sCisJeyBBVTEwMDBfVVNCX0RFVl9TVVNfSU5ULCBJUlFfVFlQRV9FREdFX1JJU0lORywgMCB9LAorCXsgQVUxMDAwX1VTQl9IT1NUX0lOVCwgSVJRX1RZUEVfTEVWRUxfTE9XLCAwIH0sCisJeyBBVTEwMDBfQUNTWU5DX0lOVCwgSVJRX1RZUEVfRURHRV9SSVNJTkcsIDAgfSwKKwl7IEFVMTUwMF9NQUMwX0RNQV9JTlQsIElSUV9UWVBFX0xFVkVMX0hJR0gsIDAgfSwKKwl7IEFVMTUwMF9NQUMxX0RNQV9JTlQsIElSUV9UWVBFX0xFVkVMX0hJR0gsIDAgfSwKKwl7IEFVMTAwMF9BQzk3Q19JTlQsIElSUV9UWVBFX0VER0VfUklTSU5HLCAwIH0sCisKKyNlbGlmIGRlZmluZWQoQ09ORklHX1NPQ19BVTExMDApCisKKwl7IEFVMTEwMF9VQVJUMF9JTlQsIElSUV9UWVBFX0xFVkVMX0hJR0gsIDAgfSwKKwl7IEFVMTEwMF9VQVJUMV9JTlQsIElSUV9UWVBFX0xFVkVMX0hJR0gsIDAgfSwKKwl7IEFVMTEwMF9TRF9JTlQsIElSUV9UWVBFX0xFVkVMX0hJR0gsIDAgfSwKKwl7IEFVMTEwMF9VQVJUM19JTlQsIElSUV9UWVBFX0xFVkVMX0hJR0gsIDAgfSwKKwl7IEFVMTAwMF9TU0kwX0lOVCwgSVJRX1RZUEVfTEVWRUxfSElHSCwgMCB9LAorCXsgQVUxMDAwX1NTSTFfSU5ULCBJUlFfVFlQRV9MRVZFTF9ISUdILCAwIH0sCisJeyBBVTEwMDBfRE1BX0lOVF9CQVNFLCBJUlFfVFlQRV9MRVZFTF9ISUdILCAwIH0sCisJeyBBVTEwMDBfRE1BX0lOVF9CQVNFKzEsIElSUV9UWVBFX0xFVkVMX0hJR0gsIDAgfSwKKwl7IEFVMTAwMF9ETUFfSU5UX0JBU0UrMiwgSVJRX1RZUEVfTEVWRUxfSElHSCwgMCB9LAorCXsgQVUxMDAwX0RNQV9JTlRfQkFTRSszLCBJUlFfVFlQRV9MRVZFTF9ISUdILCAwIH0sCisJeyBBVTEwMDBfRE1BX0lOVF9CQVNFKzQsIElSUV9UWVBFX0xFVkVMX0hJR0gsIDAgfSwKKwl7IEFVMTAwMF9ETUFfSU5UX0JBU0UrNSwgSVJRX1RZUEVfTEVWRUxfSElHSCwgMCB9LAorCXsgQVUxMDAwX0RNQV9JTlRfQkFTRSs2LCBJUlFfVFlQRV9MRVZFTF9ISUdILCAwIH0sCisJeyBBVTEwMDBfRE1BX0lOVF9CQVNFKzcsIElSUV9UWVBFX0xFVkVMX0hJR0gsIDAgfSwKKwl7IEFVMTAwMF9UT1lfSU5ULCBJUlFfVFlQRV9FREdFX1JJU0lORywgMCB9LAorCXsgQVUxMDAwX1RPWV9NQVRDSDBfSU5ULCBJUlFfVFlQRV9FREdFX1JJU0lORywgMCB9LAorCXsgQVUxMDAwX1RPWV9NQVRDSDFfSU5ULCBJUlFfVFlQRV9FREdFX1JJU0lORywgMCB9LAorCXsgQVUxMDAwX1RPWV9NQVRDSDJfSU5ULCBJUlFfVFlQRV9FREdFX1JJU0lORywgMSB9LAorCXsgQVUxMDAwX1JUQ19JTlQsIElSUV9UWVBFX0VER0VfUklTSU5HLCAwIH0sCisJeyBBVTEwMDBfUlRDX01BVENIMF9JTlQsIElSUV9UWVBFX0VER0VfUklTSU5HLCAwIH0sCisJeyBBVTEwMDBfUlRDX01BVENIMV9JTlQsIElSUV9UWVBFX0VER0VfUklTSU5HLCAwIH0sCisJeyBBVTEwMDBfUlRDX01BVENIMl9JTlQsIElSUV9UWVBFX0VER0VfUklTSU5HLCAwIH0sCisJeyBBVTEwMDBfSVJEQV9UWF9JTlQsIElSUV9UWVBFX0xFVkVMX0hJR0gsIDAgfSwKKwl7IEFVMTAwMF9JUkRBX1JYX0lOVCwgSVJRX1RZUEVfTEVWRUxfSElHSCwgMCB9LAorCXsgQVUxMDAwX1VTQl9ERVZfUkVRX0lOVCwgSVJRX1RZUEVfTEVWRUxfSElHSCwgMCB9LAorCXsgQVUxMDAwX1VTQl9ERVZfU1VTX0lOVCwgSVJRX1RZUEVfRURHRV9SSVNJTkcsIDAgfSwKKwl7IEFVMTAwMF9VU0JfSE9TVF9JTlQsIElSUV9UWVBFX0xFVkVMX0xPVywgMCB9LAorCXsgQVUxMDAwX0FDU1lOQ19JTlQsIElSUV9UWVBFX0VER0VfUklTSU5HLCAwIH0sCisJeyBBVTExMDBfTUFDMF9ETUFfSU5ULCBJUlFfVFlQRV9MRVZFTF9ISUdILCAwIH0sCisJeyBBVTExMDBfTENEX0lOVCwgSVJRX1RZUEVfTEVWRUxfSElHSCwgMCB9LAorCXsgQVUxMDAwX0FDOTdDX0lOVCwgSVJRX1RZUEVfRURHRV9SSVNJTkcsIDAgfSwKKworI2VsaWYgZGVmaW5lZChDT05GSUdfU09DX0FVMTU1MCkKKworCXsgQVUxNTUwX1VBUlQwX0lOVCwgSVJRX1RZUEVfTEVWRUxfSElHSCwgMCB9LAorCXsgQVUxNTUwX1BDSV9JTlRBLCBJUlFfVFlQRV9MRVZFTF9MT1csIDAgfSwKKwl7IEFVMTU1MF9QQ0lfSU5UQiwgSVJRX1RZUEVfTEVWRUxfTE9XLCAwIH0sCisJeyBBVTE1NTBfRERNQV9JTlQsIElSUV9UWVBFX0xFVkVMX0hJR0gsIDAgfSwKKwl7IEFVMTU1MF9DUllQVE9fSU5ULCBJUlFfVFlQRV9MRVZFTF9ISUdILCAwIH0sCisJeyBBVTE1NTBfUENJX0lOVEMsIElSUV9UWVBFX0xFVkVMX0xPVywgMCB9LAorCXsgQVUxNTUwX1BDSV9JTlRELCBJUlFfVFlQRV9MRVZFTF9MT1csIDAgfSwKKwl7IEFVMTU1MF9QQ0lfUlNUX0lOVCwgSVJRX1RZUEVfTEVWRUxfTE9XLCAwIH0sCisJeyBBVTE1NTBfVUFSVDFfSU5ULCBJUlFfVFlQRV9MRVZFTF9ISUdILCAwIH0sCisJeyBBVTE1NTBfVUFSVDNfSU5ULCBJUlFfVFlQRV9MRVZFTF9ISUdILCAwIH0sCisJeyBBVTE1NTBfUFNDMF9JTlQsIElSUV9UWVBFX0xFVkVMX0hJR0gsIDAgfSwKKwl7IEFVMTU1MF9QU0MxX0lOVCwgSVJRX1RZUEVfTEVWRUxfSElHSCwgMCB9LAorCXsgQVUxNTUwX1BTQzJfSU5ULCBJUlFfVFlQRV9MRVZFTF9ISUdILCAwIH0sCisJeyBBVTE1NTBfUFNDM19JTlQsIElSUV9UWVBFX0xFVkVMX0hJR0gsIDAgfSwKKwl7IEFVMTAwMF9UT1lfSU5ULCBJUlFfVFlQRV9FREdFX1JJU0lORywgMCB9LAorCXsgQVUxMDAwX1RPWV9NQVRDSDBfSU5ULCBJUlFfVFlQRV9FREdFX1JJU0lORywgMCB9LAorCXsgQVUxMDAwX1RPWV9NQVRDSDFfSU5ULCBJUlFfVFlQRV9FREdFX1JJU0lORywgMCB9LAorCXsgQVUxMDAwX1RPWV9NQVRDSDJfSU5ULCBJUlFfVFlQRV9FREdFX1JJU0lORywgMSB9LAorCXsgQVUxMDAwX1JUQ19JTlQsIElSUV9UWVBFX0VER0VfUklTSU5HLCAwIH0sCisJeyBBVTEwMDBfUlRDX01BVENIMF9JTlQsIElSUV9UWVBFX0VER0VfUklTSU5HLCAwIH0sCisJeyBBVTEwMDBfUlRDX01BVENIMV9JTlQsIElSUV9UWVBFX0VER0VfUklTSU5HLCAwIH0sCisJeyBBVTEwMDBfUlRDX01BVENIMl9JTlQsIElSUV9UWVBFX0VER0VfUklTSU5HLCAwIH0sCisJeyBBVTE1NTBfTkFORF9JTlQsIElSUV9UWVBFX0VER0VfUklTSU5HLCAwIH0sCisJeyBBVTE1NTBfVVNCX0RFVl9SRVFfSU5ULCBJUlFfVFlQRV9MRVZFTF9ISUdILCAwIH0sCisJeyBBVTE1NTBfVVNCX0RFVl9TVVNfSU5ULCBJUlFfVFlQRV9FREdFX1JJU0lORywgMCB9LAorCXsgQVUxNTUwX1VTQl9IT1NUX0lOVCwgSVJRX1RZUEVfTEVWRUxfTE9XLCAwIH0sCisJeyBBVTE1NTBfTUFDMF9ETUFfSU5ULCBJUlFfVFlQRV9MRVZFTF9ISUdILCAwIH0sCisJeyBBVTE1NTBfTUFDMV9ETUFfSU5ULCBJUlFfVFlQRV9MRVZFTF9ISUdILCAwIH0sCisKKyNlbGlmIGRlZmluZWQoQ09ORklHX1NPQ19BVTEyMDApCisKKwl7IEFVMTIwMF9VQVJUMF9JTlQsIElSUV9UWVBFX0xFVkVMX0hJR0gsIDAgfSwKKwl7IEFVMTIwMF9TV1RfSU5ULCBJUlFfVFlQRV9FREdFX1JJU0lORywgMCB9LAorCXsgQVUxMjAwX1NEX0lOVCwgSVJRX1RZUEVfTEVWRUxfSElHSCwgMCB9LAorCXsgQVUxMjAwX0RETUFfSU5ULCBJUlFfVFlQRV9MRVZFTF9ISUdILCAwIH0sCisJeyBBVTEyMDBfTUFFX0JFX0lOVCwgSVJRX1RZUEVfTEVWRUxfSElHSCwgMCB9LAorCXsgQVUxMjAwX1VBUlQxX0lOVCwgSVJRX1RZUEVfTEVWRUxfSElHSCwgMCB9LAorCXsgQVUxMjAwX01BRV9GRV9JTlQsIElSUV9UWVBFX0xFVkVMX0hJR0gsIDAgfSwKKwl7IEFVMTIwMF9QU0MwX0lOVCwgSVJRX1RZUEVfTEVWRUxfSElHSCwgMCB9LAorCXsgQVUxMjAwX1BTQzFfSU5ULCBJUlFfVFlQRV9MRVZFTF9ISUdILCAwIH0sCisJeyBBVTEyMDBfQUVTX0lOVCwgSVJRX1RZUEVfTEVWRUxfSElHSCwgMCB9LAorCXsgQVUxMjAwX0NBTUVSQV9JTlQsIElSUV9UWVBFX0xFVkVMX0hJR0gsIDAgfSwKKwl7IEFVMTAwMF9UT1lfSU5ULCBJUlFfVFlQRV9FREdFX1JJU0lORywgMCB9LAorCXsgQVUxMDAwX1RPWV9NQVRDSDBfSU5ULCBJUlFfVFlQRV9FREdFX1JJU0lORywgMCB9LAorCXsgQVUxMDAwX1RPWV9NQVRDSDFfSU5ULCBJUlFfVFlQRV9FREdFX1JJU0lORywgMCB9LAorCXsgQVUxMDAwX1RPWV9NQVRDSDJfSU5ULCBJUlFfVFlQRV9FREdFX1JJU0lORywgMSB9LAorCXsgQVUxMDAwX1JUQ19JTlQsIElSUV9UWVBFX0VER0VfUklTSU5HLCAwIH0sCisJeyBBVTEwMDBfUlRDX01BVENIMF9JTlQsIElSUV9UWVBFX0VER0VfUklTSU5HLCAwIH0sCisJeyBBVTEwMDBfUlRDX01BVENIMV9JTlQsIElSUV9UWVBFX0VER0VfUklTSU5HLCAwIH0sCisJeyBBVTEwMDBfUlRDX01BVENIMl9JTlQsIElSUV9UWVBFX0VER0VfUklTSU5HLCAwIH0sCisJeyBBVTEyMDBfTkFORF9JTlQsIElSUV9UWVBFX0VER0VfUklTSU5HLCAwIH0sCisJeyBBVTEyMDBfVVNCX0lOVCwgSVJRX1RZUEVfTEVWRUxfSElHSCwgMCB9LAorCXsgQVUxMjAwX0xDRF9JTlQsIElSUV9UWVBFX0xFVkVMX0hJR0gsIDAgfSwKKwl7IEFVMTIwMF9NQUVfQk9USF9JTlQsIElSUV9UWVBFX0xFVkVMX0hJR0gsIDAgfSwKKworI2Vsc2UKKyNlcnJvciAiRXJyb3I6IFVua25vd24gQWxjaGVteSBTT0MiCisjZW5kaWYKK307CisKIAogI2lmZGVmIENPTkZJR19QTQogCkBAIC0xMzAsNjcgKzI4OCw0NyBAQAogI2VuZGlmIC8qIENPTkZJR19QTSAqLwogCiAKLWlubGluZSB2b2lkIGxvY2FsX2VuYWJsZV9pcnEodW5zaWduZWQgaW50IGlycV9ucikKK3N0YXRpYyB2b2lkIGF1MXhfaWMwX3VubWFzayh1bnNpZ25lZCBpbnQgaXJxX25yKQogewogCXVuc2lnbmVkIGludCBiaXQgPSBpcnFfbnIgLSBBVTEwMDBfSU5UQzBfSU5UX0JBU0U7Ci0KLQlpZiAoYml0ID49IDMyKSB7Ci0JCWF1X3dyaXRlbCgxIDw8IChiaXQgLSAzMiksIElDMV9NQVNLU0VUKTsKLQkJYXVfd3JpdGVsKDEgPDwgKGJpdCAtIDMyKSwgSUMxX1dBS0VTRVQpOwotCX0gZWxzZSB7Ci0JCWF1X3dyaXRlbCgxIDw8IGJpdCwgSUMwX01BU0tTRVQpOwotCQlhdV93cml0ZWwoMSA8PCBiaXQsIElDMF9XQUtFU0VUKTsKLQl9CisJYXVfd3JpdGVsKDEgPDwgYml0LCBJQzBfTUFTS1NFVCk7CisJYXVfd3JpdGVsKDEgPDwgYml0LCBJQzBfV0FLRVNFVCk7CiAJYXVfc3luYygpOwogfQogCi0KLWlubGluZSB2b2lkIGxvY2FsX2Rpc2FibGVfaXJxKHVuc2lnbmVkIGludCBpcnFfbnIpCitzdGF0aWMgdm9pZCBhdTF4X2ljMV91bm1hc2sodW5zaWduZWQgaW50IGlycV9ucikKIHsKLQl1bnNpZ25lZCBpbnQgYml0ID0gaXJxX25yIC0gQVUxMDAwX0lOVEMwX0lOVF9CQVNFOworCXVuc2lnbmVkIGludCBiaXQgPSBpcnFfbnIgLSBBVTEwMDBfSU5UQzFfSU5UX0JBU0U7CisJYXVfd3JpdGVsKDEgPDwgYml0LCBJQzFfTUFTS1NFVCk7CisJYXVfd3JpdGVsKDEgPDwgYml0LCBJQzFfV0FLRVNFVCk7CiAKLQlpZiAoYml0ID49IDMyKSB7Ci0JCWF1X3dyaXRlbCgxIDw8IChiaXQgLSAzMiksIElDMV9NQVNLQ0xSKTsKLQkJYXVfd3JpdGVsKDEgPDwgKGJpdCAtIDMyKSwgSUMxX1dBS0VDTFIpOwotCX0gZWxzZSB7Ci0JCWF1X3dyaXRlbCgxIDw8IGJpdCwgSUMwX01BU0tDTFIpOwotCQlhdV93cml0ZWwoMSA8PCBiaXQsIElDMF9XQUtFQ0xSKTsKLQl9CisvKiB2ZXJ5IGhhY2t5LiBkb2VzIHRoZSBwYjEwMDAgY3BsZCBhdXRvLWRpc2FibGUgdGhpcyBpbnQ/CisgKiBub3doZXJlIGluIHRoZSBjdXJyZW50IGtlcm5lbCBzb3VyY2VzIGlzIGl0IGRpc2FibGVkLgktLW1sYXUKKyAqLworI2lmIGRlZmluZWQoQ09ORklHX01JUFNfUEIxMDAwKQorCWlmIChpcnFfbnIgPT0gQVUxMDAwX0dQSU9fMTUpCisJCWF1X3dyaXRlbCgweDQwMDAsIFBCMTAwMF9NRFIpOyAvKiBlbmFibGUgaW50ICovCisjZW5kaWYKIAlhdV9zeW5jKCk7CiB9CiAKLQotc3RhdGljIGlubGluZSB2b2lkIG1hc2tfYW5kX2Fja19yaXNlX2VkZ2VfaXJxKHVuc2lnbmVkIGludCBpcnFfbnIpCitzdGF0aWMgdm9pZCBhdTF4X2ljMF9tYXNrKHVuc2lnbmVkIGludCBpcnFfbnIpCiB7CiAJdW5zaWduZWQgaW50IGJpdCA9IGlycV9uciAtIEFVMTAwMF9JTlRDMF9JTlRfQkFTRTsKLQotCWlmIChiaXQgPj0gMzIpIHsKLQkJYXVfd3JpdGVsKDEgPDwgKGJpdCAtIDMyKSwgSUMxX1JJU0lOR0NMUik7Ci0JCWF1X3dyaXRlbCgxIDw8IChiaXQgLSAzMiksIElDMV9NQVNLQ0xSKTsKLQl9IGVsc2UgewotCQlhdV93cml0ZWwoMSA8PCBiaXQsIElDMF9SSVNJTkdDTFIpOwotCQlhdV93cml0ZWwoMSA8PCBiaXQsIElDMF9NQVNLQ0xSKTsKLQl9CisJYXVfd3JpdGVsKDEgPDwgYml0LCBJQzBfTUFTS0NMUik7CisJYXVfd3JpdGVsKDEgPDwgYml0LCBJQzBfV0FLRUNMUik7CiAJYXVfc3luYygpOwogfQogCi0KLXN0YXRpYyBpbmxpbmUgdm9pZCBtYXNrX2FuZF9hY2tfZmFsbF9lZGdlX2lycSh1bnNpZ25lZCBpbnQgaXJxX25yKQorc3RhdGljIHZvaWQgYXUxeF9pYzFfbWFzayh1bnNpZ25lZCBpbnQgaXJxX25yKQogewotCXVuc2lnbmVkIGludCBiaXQgPSBpcnFfbnIgLSBBVTEwMDBfSU5UQzBfSU5UX0JBU0U7Ci0KLQlpZiAoYml0ID49IDMyKSB7Ci0JCWF1X3dyaXRlbCgxIDw8IChiaXQgLSAzMiksIElDMV9GQUxMSU5HQ0xSKTsKLQkJYXVfd3JpdGVsKDEgPDwgKGJpdCAtIDMyKSwgSUMxX01BU0tDTFIpOwotCX0gZWxzZSB7Ci0JCWF1X3dyaXRlbCgxIDw8IGJpdCwgSUMwX0ZBTExJTkdDTFIpOwotCQlhdV93cml0ZWwoMSA8PCBiaXQsIElDMF9NQVNLQ0xSKTsKLQl9CisJdW5zaWduZWQgaW50IGJpdCA9IGlycV9uciAtIEFVMTAwMF9JTlRDMV9JTlRfQkFTRTsKKwlhdV93cml0ZWwoMSA8PCBiaXQsIElDMV9NQVNLQ0xSKTsKKwlhdV93cml0ZWwoMSA8PCBiaXQsIElDMV9XQUtFQ0xSKTsKIAlhdV9zeW5jKCk7CiB9CiAKLQotc3RhdGljIGlubGluZSB2b2lkIG1hc2tfYW5kX2Fja19laXRoZXJfZWRnZV9pcnEodW5zaWduZWQgaW50IGlycV9ucikKK3N0YXRpYyB2b2lkIGF1MXhfaWMwX2Fjayh1bnNpZ25lZCBpbnQgaXJxX25yKQogewogCXVuc2lnbmVkIGludCBiaXQgPSBpcnFfbnIgLSBBVTEwMDBfSU5UQzBfSU5UX0JBU0U7CiAKQEAgLTE5OCwzNDkgKzMzNiwyMjkgQEAKIAkgKiBUaGlzIG1heSBhc3N1bWUgdGhhdCB3ZSBkb24ndCBnZXQgaW50ZXJydXB0cyBmcm9tCiAJICogYm90aCBlZGdlcyBhdCBvbmNlLCBvciBpZiB3ZSBkbywgdGhhdCB3ZSBkb24ndCBjYXJlLgogCSAqLwotCWlmIChiaXQgPj0gMzIpIHsKLQkJYXVfd3JpdGVsKDEgPDwgKGJpdCAtIDMyKSwgSUMxX0ZBTExJTkdDTFIpOwotCQlhdV93cml0ZWwoMSA8PCAoYml0IC0gMzIpLCBJQzFfUklTSU5HQ0xSKTsKLQkJYXVfd3JpdGVsKDEgPDwgKGJpdCAtIDMyKSwgSUMxX01BU0tDTFIpOwotCX0gZWxzZSB7Ci0JCWF1X3dyaXRlbCgxIDw8IGJpdCwgSUMwX0ZBTExJTkdDTFIpOwotCQlhdV93cml0ZWwoMSA8PCBiaXQsIElDMF9SSVNJTkdDTFIpOwotCQlhdV93cml0ZWwoMSA8PCBiaXQsIElDMF9NQVNLQ0xSKTsKLQl9CisJYXVfd3JpdGVsKDEgPDwgYml0LCBJQzBfRkFMTElOR0NMUik7CisJYXVfd3JpdGVsKDEgPDwgYml0LCBJQzBfUklTSU5HQ0xSKTsKIAlhdV9zeW5jKCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBtYXNrX2FuZF9hY2tfbGV2ZWxfaXJxKHVuc2lnbmVkIGludCBpcnFfbnIpCitzdGF0aWMgdm9pZCBhdTF4X2ljMV9hY2sodW5zaWduZWQgaW50IGlycV9ucikKIHsKLQlsb2NhbF9kaXNhYmxlX2lycShpcnFfbnIpOworCXVuc2lnbmVkIGludCBiaXQgPSBpcnFfbnIgLSBBVTEwMDBfSU5UQzFfSU5UX0JBU0U7CisKKwkvKgorCSAqIFRoaXMgbWF5IGFzc3VtZSB0aGF0IHdlIGRvbid0IGdldCBpbnRlcnJ1cHRzIGZyb20KKwkgKiBib3RoIGVkZ2VzIGF0IG9uY2UsIG9yIGlmIHdlIGRvLCB0aGF0IHdlIGRvbid0IGNhcmUuCisJICovCisJYXVfd3JpdGVsKDEgPDwgYml0LCBJQzFfRkFMTElOR0NMUik7CisJYXVfd3JpdGVsKDEgPDwgYml0LCBJQzFfUklTSU5HQ0xSKTsKIAlhdV9zeW5jKCk7Ci0jaWYgZGVmaW5lZChDT05GSUdfTUlQU19QQjEwMDApCi0JaWYgKGlycV9uciA9PSBBVTEwMDBfR1BJT18xNSkgewotCQlhdV93cml0ZWwoMHg4MDAwLCBQQjEwMDBfTURSKTsgLyogYWNrIGludCAqLwotCQlhdV9zeW5jKCk7Ci0JfQotI2VuZGlmCiB9CiAKLXN0YXRpYyB2b2lkIGVuZF9pcnEodW5zaWduZWQgaW50IGlycV9ucikKK3N0YXRpYyBpbnQgYXUxeF9pYzFfc2V0d2FrZSh1bnNpZ25lZCBpbnQgaXJxLCB1bnNpZ25lZCBpbnQgb24pCiB7Ci0JaWYgKCEoaXJxX2Rlc2NbaXJxX25yXS5zdGF0dXMgJiAoSVJRX0RJU0FCTEVEIHwgSVJRX0lOUFJPR1JFU1MpKSkKLQkJbG9jYWxfZW5hYmxlX2lycShpcnFfbnIpOworCXVuc2lnbmVkIGludCBiaXQgPSBpcnEgLSBBVTEwMDBfSU5UQzFfSU5UX0JBU0U7CisJdW5zaWduZWQgbG9uZyB3YWtlbXNrLCBmbGFnczsKIAotI2lmIGRlZmluZWQoQ09ORklHX01JUFNfUEIxMDAwKQotCWlmIChpcnFfbnIgPT0gQVUxMDAwX0dQSU9fMTUpIHsKLQkJYXVfd3JpdGVsKDB4NDAwMCwgUEIxMDAwX01EUik7IC8qIGVuYWJsZSBpbnQgKi8KLQkJYXVfc3luYygpOwotCX0KLSNlbmRpZgotfQorCS8qIG9ubHkgR1BJTyAwLTcgY2FuIGFjdCBhcyB3YWtldXAgc291cmNlOiAqLworCWlmICgoaXJxIDwgQVUxMDAwX0dQSU9fMCkgfHwgKGlycSA+IEFVMTAwMF9HUElPXzcpKQorCQlyZXR1cm4gLUVJTlZBTDsKIAotdW5zaWduZWQgbG9uZyBzYXZlX2xvY2FsX2FuZF9kaXNhYmxlKGludCBjb250cm9sbGVyKQotewotCWludCBpOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIG1hc2s7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmaXJxX2xvY2ssIGZsYWdzKTsKLQlpZiAoY29udHJvbGxlcikgewotCQltYXNrID0gYXVfcmVhZGwoSUMxX01BU0tTRVQpOwotCQlmb3IgKGkgPSAzMjsgaSA8IDY0OyBpKyspCi0JCQlsb2NhbF9kaXNhYmxlX2lycShpKTsKLQl9IGVsc2UgewotCQltYXNrID0gYXVfcmVhZGwoSUMwX01BU0tTRVQpOwotCQlmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykKLQkJCWxvY2FsX2Rpc2FibGVfaXJxKGkpOwotCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpcnFfbG9jaywgZmxhZ3MpOwotCi0JcmV0dXJuIG1hc2s7Ci19Ci0KLXZvaWQgcmVzdG9yZV9sb2NhbF9hbmRfZW5hYmxlKGludCBjb250cm9sbGVyLCB1bnNpZ25lZCBsb25nIG1hc2spCi17Ci0JaW50IGk7Ci0JdW5zaWduZWQgbG9uZyBmbGFncywgbmV3X21hc2s7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmaXJxX2xvY2ssIGZsYWdzKTsKLQlmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykKLQkJaWYgKG1hc2sgJiAoMSA8PCBpKSkgewotCQkJaWYgKGNvbnRyb2xsZXIpCi0JCQkJbG9jYWxfZW5hYmxlX2lycShpICsgMzIpOwotCQkJZWxzZQotCQkJCWxvY2FsX2VuYWJsZV9pcnEoaSk7Ci0JCX0KLQotCWlmIChjb250cm9sbGVyKQotCQluZXdfbWFzayA9IGF1X3JlYWRsKElDMV9NQVNLU0VUKTsKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJd2FrZW1zayA9IGF1X3JlYWRsKFNZU19XQUtFTVNLKTsKKwlpZiAob24pCisJCXdha2Vtc2sgfD0gMSA8PCBiaXQ7CiAJZWxzZQotCQluZXdfbWFzayA9IGF1X3JlYWRsKElDMF9NQVNLU0VUKTsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlycV9sb2NrLCBmbGFncyk7Ci19Ci0KLQotc3RhdGljIHN0cnVjdCBpcnFfY2hpcCByaXNlX2VkZ2VfaXJxX3R5cGUgPSB7Ci0JLm5hbWUJCT0gIkF1MTAwMCBSaXNlIEVkZ2UiLAotCS5hY2sJCT0gbWFza19hbmRfYWNrX3Jpc2VfZWRnZV9pcnEsCi0JLm1hc2sJCT0gbG9jYWxfZGlzYWJsZV9pcnEsCi0JLm1hc2tfYWNrCT0gbWFza19hbmRfYWNrX3Jpc2VfZWRnZV9pcnEsCi0JLnVubWFzawkJPSBsb2NhbF9lbmFibGVfaXJxLAotCS5lbmQJCT0gZW5kX2lycSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgZmFsbF9lZGdlX2lycV90eXBlID0gewotCS5uYW1lCQk9ICJBdTEwMDAgRmFsbCBFZGdlIiwKLQkuYWNrCQk9IG1hc2tfYW5kX2Fja19mYWxsX2VkZ2VfaXJxLAotCS5tYXNrCQk9IGxvY2FsX2Rpc2FibGVfaXJxLAotCS5tYXNrX2Fjawk9IG1hc2tfYW5kX2Fja19mYWxsX2VkZ2VfaXJxLAotCS51bm1hc2sJCT0gbG9jYWxfZW5hYmxlX2lycSwKLQkuZW5kCQk9IGVuZF9pcnEsCi19OwotCi1zdGF0aWMgc3RydWN0IGlycV9jaGlwIGVpdGhlcl9lZGdlX2lycV90eXBlID0gewotCS5uYW1lCQk9ICJBdTEwMDAgUmlzZSBvciBGYWxsIEVkZ2UiLAotCS5hY2sJCT0gbWFza19hbmRfYWNrX2VpdGhlcl9lZGdlX2lycSwKLQkubWFzawkJPSBsb2NhbF9kaXNhYmxlX2lycSwKLQkubWFza19hY2sJPSBtYXNrX2FuZF9hY2tfZWl0aGVyX2VkZ2VfaXJxLAotCS51bm1hc2sJCT0gbG9jYWxfZW5hYmxlX2lycSwKLQkuZW5kCQk9IGVuZF9pcnEsCi19OwotCi1zdGF0aWMgc3RydWN0IGlycV9jaGlwIGxldmVsX2lycV90eXBlID0gewotCS5uYW1lCQk9ICJBdTEwMDAgTGV2ZWwiLAotCS5hY2sJCT0gbWFza19hbmRfYWNrX2xldmVsX2lycSwKLQkubWFzawkJPSBsb2NhbF9kaXNhYmxlX2lycSwKLQkubWFza19hY2sJPSBtYXNrX2FuZF9hY2tfbGV2ZWxfaXJxLAotCS51bm1hc2sJCT0gbG9jYWxfZW5hYmxlX2lycSwKLQkuZW5kCQk9IGVuZF9pcnEsCi19OwotCi1zdGF0aWMgdm9pZCBfX2luaXQgc2V0dXBfbG9jYWxfaXJxKHVuc2lnbmVkIGludCBpcnFfbnIsIGludCB0eXBlLCBpbnQgaW50X3JlcSkKLXsKLQl1bnNpZ25lZCBpbnQgYml0ID0gaXJxX25yIC0gQVUxMDAwX0lOVEMwX0lOVF9CQVNFOwotCi0JaWYgKGlycV9uciA+IEFVMTAwMF9NQVhfSU5UUikKLQkJcmV0dXJuOwotCi0JLyogQ29uZmlnMltuXSwgQ29uZmlnMVtuXSwgQ29uZmlnMFtuXSAqLwotCWlmIChiaXQgPj0gMzIpIHsKLQkJc3dpdGNoICh0eXBlKSB7Ci0JCWNhc2UgSU5UQ19JTlRfUklTRV9FREdFOiAvKiAwOjA6MSAqLwotCQkJYXVfd3JpdGVsKDEgPDwgKGJpdCAtIDMyKSwgSUMxX0NGRzJDTFIpOwotCQkJYXVfd3JpdGVsKDEgPDwgKGJpdCAtIDMyKSwgSUMxX0NGRzFDTFIpOwotCQkJYXVfd3JpdGVsKDEgPDwgKGJpdCAtIDMyKSwgSUMxX0NGRzBTRVQpOwotCQkJc2V0X2lycV9jaGlwKGlycV9uciwgJnJpc2VfZWRnZV9pcnFfdHlwZSk7Ci0JCQlicmVhazsKLQkJY2FzZSBJTlRDX0lOVF9GQUxMX0VER0U6IC8qIDA6MTowICovCi0JCQlhdV93cml0ZWwoMSA8PCAoYml0IC0gMzIpLCBJQzFfQ0ZHMkNMUik7Ci0JCQlhdV93cml0ZWwoMSA8PCAoYml0IC0gMzIpLCBJQzFfQ0ZHMVNFVCk7Ci0JCQlhdV93cml0ZWwoMSA8PCAoYml0IC0gMzIpLCBJQzFfQ0ZHMENMUik7Ci0JCQlzZXRfaXJxX2NoaXAoaXJxX25yLCAmZmFsbF9lZGdlX2lycV90eXBlKTsKLQkJCWJyZWFrOwotCQljYXNlIElOVENfSU5UX1JJU0VfQU5EX0ZBTExfRURHRTogLyogMDoxOjEgKi8KLQkJCWF1X3dyaXRlbCgxIDw8IChiaXQgLSAzMiksIElDMV9DRkcyQ0xSKTsKLQkJCWF1X3dyaXRlbCgxIDw8IChiaXQgLSAzMiksIElDMV9DRkcxU0VUKTsKLQkJCWF1X3dyaXRlbCgxIDw8IChiaXQgLSAzMiksIElDMV9DRkcwU0VUKTsKLQkJCXNldF9pcnFfY2hpcChpcnFfbnIsICZlaXRoZXJfZWRnZV9pcnFfdHlwZSk7Ci0JCQlicmVhazsKLQkJY2FzZSBJTlRDX0lOVF9ISUdIX0xFVkVMOiAvKiAxOjA6MSAqLwotCQkJYXVfd3JpdGVsKDEgPDwgKGJpdCAtIDMyKSwgSUMxX0NGRzJTRVQpOwotCQkJYXVfd3JpdGVsKDEgPDwgKGJpdCAtIDMyKSwgSUMxX0NGRzFDTFIpOwotCQkJYXVfd3JpdGVsKDEgPDwgKGJpdCAtIDMyKSwgSUMxX0NGRzBTRVQpOwotCQkJc2V0X2lycV9jaGlwKGlycV9uciwgJmxldmVsX2lycV90eXBlKTsKLQkJCWJyZWFrOwotCQljYXNlIElOVENfSU5UX0xPV19MRVZFTDogLyogMToxOjAgKi8KLQkJCWF1X3dyaXRlbCgxIDw8IChiaXQgLSAzMiksIElDMV9DRkcyU0VUKTsKLQkJCWF1X3dyaXRlbCgxIDw8IChiaXQgLSAzMiksIElDMV9DRkcxU0VUKTsKLQkJCWF1X3dyaXRlbCgxIDw8IChiaXQgLSAzMiksIElDMV9DRkcwQ0xSKTsKLQkJCXNldF9pcnFfY2hpcChpcnFfbnIsICZsZXZlbF9pcnFfdHlwZSk7Ci0JCQlicmVhazsKLQkJY2FzZSBJTlRDX0lOVF9ESVNBQkxFRDogLyogMDowOjAgKi8KLQkJCWF1X3dyaXRlbCgxIDw8IChiaXQgLSAzMiksIElDMV9DRkcwQ0xSKTsKLQkJCWF1X3dyaXRlbCgxIDw8IChiaXQgLSAzMiksIElDMV9DRkcxQ0xSKTsKLQkJCWF1X3dyaXRlbCgxIDw8IChiaXQgLSAzMiksIElDMV9DRkcyQ0xSKTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OiAvKiBkaXNhYmxlIHRoZSBpbnRlcnJ1cHQgKi8KLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgInVuZXhwZWN0ZWQgaW50IHR5cGUgJWQgKGlycSAlZClcbiIsCi0JCQkgICAgICAgdHlwZSwgaXJxX25yKTsKLQkJCWF1X3dyaXRlbCgxIDw8IChiaXQgLSAzMiksIElDMV9DRkcwQ0xSKTsKLQkJCWF1X3dyaXRlbCgxIDw8IChiaXQgLSAzMiksIElDMV9DRkcxQ0xSKTsKLQkJCWF1X3dyaXRlbCgxIDw8IChiaXQgLSAzMiksIElDMV9DRkcyQ0xSKTsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoaW50X3JlcSkgLyogYXNzaWduIHRvIGludGVycnVwdCByZXF1ZXN0IDEgKi8KLQkJCWF1X3dyaXRlbCgxIDw8IChiaXQgLSAzMiksIElDMV9BU1NJR05DTFIpOwotCQllbHNlCSAgICAgLyogYXNzaWduIHRvIGludGVycnVwdCByZXF1ZXN0IDAgKi8KLQkJCWF1X3dyaXRlbCgxIDw8IChiaXQgLSAzMiksIElDMV9BU1NJR05TRVQpOwotCQlhdV93cml0ZWwoMSA8PCAoYml0IC0gMzIpLCBJQzFfU1JDU0VUKTsKLQkJYXVfd3JpdGVsKDEgPDwgKGJpdCAtIDMyKSwgSUMxX01BU0tDTFIpOwotCQlhdV93cml0ZWwoMSA8PCAoYml0IC0gMzIpLCBJQzFfV0FLRUNMUik7Ci0JfSBlbHNlIHsKLQkJc3dpdGNoICh0eXBlKSB7Ci0JCWNhc2UgSU5UQ19JTlRfUklTRV9FREdFOiAvKiAwOjA6MSAqLwotCQkJYXVfd3JpdGVsKDEgPDwgYml0LCBJQzBfQ0ZHMkNMUik7Ci0JCQlhdV93cml0ZWwoMSA8PCBiaXQsIElDMF9DRkcxQ0xSKTsKLQkJCWF1X3dyaXRlbCgxIDw8IGJpdCwgSUMwX0NGRzBTRVQpOwotCQkJc2V0X2lycV9jaGlwKGlycV9uciwgJnJpc2VfZWRnZV9pcnFfdHlwZSk7Ci0JCQlicmVhazsKLQkJY2FzZSBJTlRDX0lOVF9GQUxMX0VER0U6IC8qIDA6MTowICovCi0JCQlhdV93cml0ZWwoMSA8PCBiaXQsIElDMF9DRkcyQ0xSKTsKLQkJCWF1X3dyaXRlbCgxIDw8IGJpdCwgSUMwX0NGRzFTRVQpOwotCQkJYXVfd3JpdGVsKDEgPDwgYml0LCBJQzBfQ0ZHMENMUik7Ci0JCQlzZXRfaXJxX2NoaXAoaXJxX25yLCAmZmFsbF9lZGdlX2lycV90eXBlKTsKLQkJCWJyZWFrOwotCQljYXNlIElOVENfSU5UX1JJU0VfQU5EX0ZBTExfRURHRTogLyogMDoxOjEgKi8KLQkJCWF1X3dyaXRlbCgxIDw8IGJpdCwgSUMwX0NGRzJDTFIpOwotCQkJYXVfd3JpdGVsKDEgPDwgYml0LCBJQzBfQ0ZHMVNFVCk7Ci0JCQlhdV93cml0ZWwoMSA8PCBiaXQsIElDMF9DRkcwU0VUKTsKLQkJCXNldF9pcnFfY2hpcChpcnFfbnIsICZlaXRoZXJfZWRnZV9pcnFfdHlwZSk7Ci0JCQlicmVhazsKLQkJY2FzZSBJTlRDX0lOVF9ISUdIX0xFVkVMOiAvKiAxOjA6MSAqLwotCQkJYXVfd3JpdGVsKDEgPDwgYml0LCBJQzBfQ0ZHMlNFVCk7Ci0JCQlhdV93cml0ZWwoMSA8PCBiaXQsIElDMF9DRkcxQ0xSKTsKLQkJCWF1X3dyaXRlbCgxIDw8IGJpdCwgSUMwX0NGRzBTRVQpOwotCQkJc2V0X2lycV9jaGlwKGlycV9uciwgJmxldmVsX2lycV90eXBlKTsKLQkJCWJyZWFrOwotCQljYXNlIElOVENfSU5UX0xPV19MRVZFTDogLyogMToxOjAgKi8KLQkJCWF1X3dyaXRlbCgxIDw8IGJpdCwgSUMwX0NGRzJTRVQpOwotCQkJYXVfd3JpdGVsKDEgPDwgYml0LCBJQzBfQ0ZHMVNFVCk7Ci0JCQlhdV93cml0ZWwoMSA8PCBiaXQsIElDMF9DRkcwQ0xSKTsKLQkJCXNldF9pcnFfY2hpcChpcnFfbnIsICZsZXZlbF9pcnFfdHlwZSk7Ci0JCQlicmVhazsKLQkJY2FzZSBJTlRDX0lOVF9ESVNBQkxFRDogLyogMDowOjAgKi8KLQkJCWF1X3dyaXRlbCgxIDw8IGJpdCwgSUMwX0NGRzBDTFIpOwotCQkJYXVfd3JpdGVsKDEgPDwgYml0LCBJQzBfQ0ZHMUNMUik7Ci0JCQlhdV93cml0ZWwoMSA8PCBiaXQsIElDMF9DRkcyQ0xSKTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OiAvKiBkaXNhYmxlIHRoZSBpbnRlcnJ1cHQgKi8KLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgInVuZXhwZWN0ZWQgaW50IHR5cGUgJWQgKGlycSAlZClcbiIsCi0JCQkgICAgICAgdHlwZSwgaXJxX25yKTsKLQkJCWF1X3dyaXRlbCgxIDw8IGJpdCwgSUMwX0NGRzBDTFIpOwotCQkJYXVfd3JpdGVsKDEgPDwgYml0LCBJQzBfQ0ZHMUNMUik7Ci0JCQlhdV93cml0ZWwoMSA8PCBiaXQsIElDMF9DRkcyQ0xSKTsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoaW50X3JlcSkgLyogYXNzaWduIHRvIGludGVycnVwdCByZXF1ZXN0IDEgKi8KLQkJCWF1X3dyaXRlbCgxIDw8IGJpdCwgSUMwX0FTU0lHTkNMUik7Ci0JCWVsc2UJICAgICAvKiBhc3NpZ24gdG8gaW50ZXJydXB0IHJlcXVlc3QgMCAqLwotCQkJYXVfd3JpdGVsKDEgPDwgYml0LCBJQzBfQVNTSUdOU0VUKTsKLQkJYXVfd3JpdGVsKDEgPDwgYml0LCBJQzBfU1JDU0VUKTsKLQkJYXVfd3JpdGVsKDEgPDwgYml0LCBJQzBfTUFTS0NMUik7Ci0JCWF1X3dyaXRlbCgxIDw8IGJpdCwgSUMwX1dBS0VDTFIpOwotCX0KKwkJd2FrZW1zayAmPSB+KDEgPDwgYml0KTsKKwlhdV93cml0ZWwod2FrZW1zaywgU1lTX1dBS0VNU0spOwogCWF1X3N5bmMoKTsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisKKwlyZXR1cm4gMDsKIH0KIAogLyoKLSAqIEludGVycnVwdHMgYXJlIG5lc3RlZC4gRXZlbiBpZiBhbiBpbnRlcnJ1cHQgaGFuZGxlciBpcyByZWdpc3RlcmVkCi0gKiBhcyAiZmFzdCIsIHdlIG1pZ2h0IGdldCBhbm90aGVyIGludGVycnVwdCBiZWZvcmUgd2UgcmV0dXJuIGZyb20KLSAqIGludGNYX3JlcVhfaXJxZGlzcGF0Y2goKS4KKyAqIGlycV9jaGlwcyBmb3IgYm90aCBJQ3M7IHRoaXMgd2F5IHRoZSBtYXNrIGhhbmRsZXJzIGNhbiBiZQorICogYXMgc2hvcnQgYXMgcG9zc2libGUuCisgKgorICogTk9URTogdGhlIC0+YWNrKCkgY2FsbGJhY2sgaXMgdXNlZCBieSB0aGUgaGFuZGxlX2VkZ2VfaXJxCisgKgkgZmxvd2hhbmRsZXIgb25seSwgdGhlIC0+bWFza19hY2soKSBvbmUgYnkgaGFuZGxlX2xldmVsX2lycSwKKyAqCSBzbyBubyBuZWVkIGZvciBhbiBpcnFfY2hpcCBmb3IgZWFjaCB0eXBlIG9mIGlycSAobGV2ZWwvZWRnZSkuCiAgKi8KK3N0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgYXUxeF9pYzBfY2hpcCA9IHsKKwkubmFtZQkJPSAiQWxjaGVteS1JQzAiLAorCS5hY2sJCT0gYXUxeF9pYzBfYWNrLAkJLyogZWRnZSAqLworCS5tYXNrCQk9IGF1MXhfaWMwX21hc2ssCisJLm1hc2tfYWNrCT0gYXUxeF9pYzBfbWFzaywJLyogbGV2ZWwgKi8KKwkudW5tYXNrCQk9IGF1MXhfaWMwX3VubWFzaywKKwkuc2V0X3R5cGUJPSBhdTF4X2ljX3NldHR5cGUsCit9OwogCi1zdGF0aWMgdm9pZCBpbnRjMF9yZXEwX2lycWRpc3BhdGNoKHZvaWQpCitzdGF0aWMgc3RydWN0IGlycV9jaGlwIGF1MXhfaWMxX2NoaXAgPSB7CisJLm5hbWUJCT0gIkFsY2hlbXktSUMxIiwKKwkuYWNrCQk9IGF1MXhfaWMxX2FjaywJCS8qIGVkZ2UgKi8KKwkubWFzawkJPSBhdTF4X2ljMV9tYXNrLAorCS5tYXNrX2Fjawk9IGF1MXhfaWMxX21hc2ssCS8qIGxldmVsICovCisJLnVubWFzawkJPSBhdTF4X2ljMV91bm1hc2ssCisJLnNldF90eXBlCT0gYXUxeF9pY19zZXR0eXBlLAorCS5zZXRfd2FrZQk9IGF1MXhfaWMxX3NldHdha2UsCit9OworCitzdGF0aWMgaW50IGF1MXhfaWNfc2V0dHlwZSh1bnNpZ25lZCBpbnQgaXJxLCB1bnNpZ25lZCBpbnQgZmxvd190eXBlKQogewotCXN0YXRpYyB1bnNpZ25lZCBsb25nIGludGMwX3JlcTA7Ci0JdW5zaWduZWQgaW50IGJpdDsKKwlzdHJ1Y3QgaXJxX2NoaXAgKmNoaXA7CisJdW5zaWduZWQgbG9uZyBpY3JbNl07CisJdW5zaWduZWQgaW50IGJpdCwgaWM7CisJaW50IHJldDsKIAotCWludGMwX3JlcTAgfD0gYXVfcmVhZGwoSUMwX1JFUTBJTlQpOworCWlmIChpcnEgPj0gQVUxMDAwX0lOVEMxX0lOVF9CQVNFKSB7CisJCWJpdCA9IGlycSAtIEFVMTAwMF9JTlRDMV9JTlRfQkFTRTsKKwkJY2hpcCA9ICZhdTF4X2ljMV9jaGlwOworCQlpYyA9IDE7CisJfSBlbHNlIHsKKwkJYml0ID0gaXJxIC0gQVUxMDAwX0lOVEMwX0lOVF9CQVNFOworCQljaGlwID0gJmF1MXhfaWMwX2NoaXA7CisJCWljID0gMDsKKwl9CiAKLQlpZiAoIWludGMwX3JlcTApCisJaWYgKGJpdCA+IDMxKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWljclswXSA9IGljID8gSUMxX0NGRzBTRVQgOiBJQzBfQ0ZHMFNFVDsKKwlpY3JbMV0gPSBpYyA/IElDMV9DRkcxU0VUIDogSUMwX0NGRzFTRVQ7CisJaWNyWzJdID0gaWMgPyBJQzFfQ0ZHMlNFVCA6IElDMF9DRkcyU0VUOworCWljclszXSA9IGljID8gSUMxX0NGRzBDTFIgOiBJQzBfQ0ZHMENMUjsKKwlpY3JbNF0gPSBpYyA/IElDMV9DRkcxQ0xSIDogSUMwX0NGRzFDTFI7CisJaWNyWzVdID0gaWMgPyBJQzFfQ0ZHMkNMUiA6IElDMF9DRkcyQ0xSOworCisJcmV0ID0gMDsKKworCXN3aXRjaCAoZmxvd190eXBlKSB7CS8qIGNmZ3JlZ3MgMjoxOjAgKi8KKwljYXNlIElSUV9UWVBFX0VER0VfUklTSU5HOgkvKiAwOjA6MSAqLworCQlhdV93cml0ZWwoMSA8PCBiaXQsIGljcls1XSk7CisJCWF1X3dyaXRlbCgxIDw8IGJpdCwgaWNyWzRdKTsKKwkJYXVfd3JpdGVsKDEgPDwgYml0LCBpY3JbMF0pOworCQlzZXRfaXJxX2NoaXBfYW5kX2hhbmRsZXJfbmFtZShpcnEsIGNoaXAsCisJCQkJaGFuZGxlX2VkZ2VfaXJxLCAicmlzZWVkZ2UiKTsKKwkJYnJlYWs7CisJY2FzZSBJUlFfVFlQRV9FREdFX0ZBTExJTkc6CS8qIDA6MTowICovCisJCWF1X3dyaXRlbCgxIDw8IGJpdCwgaWNyWzVdKTsKKwkJYXVfd3JpdGVsKDEgPDwgYml0LCBpY3JbMV0pOworCQlhdV93cml0ZWwoMSA8PCBiaXQsIGljclszXSk7CisJCXNldF9pcnFfY2hpcF9hbmRfaGFuZGxlcl9uYW1lKGlycSwgY2hpcCwKKwkJCQloYW5kbGVfZWRnZV9pcnEsICJmYWxsZWRnZSIpOworCQlicmVhazsKKwljYXNlIElSUV9UWVBFX0VER0VfQk9USDoJLyogMDoxOjEgKi8KKwkJYXVfd3JpdGVsKDEgPDwgYml0LCBpY3JbNV0pOworCQlhdV93cml0ZWwoMSA8PCBiaXQsIGljclsxXSk7CisJCWF1X3dyaXRlbCgxIDw8IGJpdCwgaWNyWzBdKTsKKwkJc2V0X2lycV9jaGlwX2FuZF9oYW5kbGVyX25hbWUoaXJxLCBjaGlwLAorCQkJCWhhbmRsZV9lZGdlX2lycSwgImJvdGhlZGdlIik7CisJCWJyZWFrOworCWNhc2UgSVJRX1RZUEVfTEVWRUxfSElHSDoJLyogMTowOjEgKi8KKwkJYXVfd3JpdGVsKDEgPDwgYml0LCBpY3JbMl0pOworCQlhdV93cml0ZWwoMSA8PCBiaXQsIGljcls0XSk7CisJCWF1X3dyaXRlbCgxIDw8IGJpdCwgaWNyWzBdKTsKKwkJc2V0X2lycV9jaGlwX2FuZF9oYW5kbGVyX25hbWUoaXJxLCBjaGlwLAorCQkJCWhhbmRsZV9sZXZlbF9pcnEsICJoaWxldmVsIik7CisJCWJyZWFrOworCWNhc2UgSVJRX1RZUEVfTEVWRUxfTE9XOgkvKiAxOjE6MCAqLworCQlhdV93cml0ZWwoMSA8PCBiaXQsIGljclsyXSk7CisJCWF1X3dyaXRlbCgxIDw8IGJpdCwgaWNyWzFdKTsKKwkJYXVfd3JpdGVsKDEgPDwgYml0LCBpY3JbM10pOworCQlzZXRfaXJxX2NoaXBfYW5kX2hhbmRsZXJfbmFtZShpcnEsIGNoaXAsCisJCQkJaGFuZGxlX2xldmVsX2lycSwgImxvd2xldmVsIik7CisJCWJyZWFrOworCWNhc2UgSVJRX1RZUEVfTk9ORToJCS8qIDA6MDowICovCisJCWF1X3dyaXRlbCgxIDw8IGJpdCwgaWNyWzVdKTsKKwkJYXVfd3JpdGVsKDEgPDwgYml0LCBpY3JbNF0pOworCQlhdV93cml0ZWwoMSA8PCBiaXQsIGljclszXSk7CisJCS8qIHNldCBhdCBsZWFzdCBjaGlwIHNvIHdlIGNhbiBjYWxsIHNldF9pcnFfdHlwZSgpIG9uIGl0ICovCisJCXNldF9pcnFfY2hpcChpcnEsIGNoaXApOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXQgPSAtRUlOVkFMOworCX0KKwlhdV9zeW5jKCk7CisKKwlyZXR1cm4gcmV0OworfQorCithc21saW5rYWdlIHZvaWQgcGxhdF9pcnFfZGlzcGF0Y2godm9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgcGVuZGluZyA9IHJlYWRfYzBfc3RhdHVzKCkgJiByZWFkX2MwX2NhdXNlKCk7CisJdW5zaWduZWQgbG9uZyBzLCBvZmYsIGJpdDsKKworCWlmIChwZW5kaW5nICYgQ0FVU0VGX0lQNykgeworCQlkb19JUlEoTUlQU19DUFVfSVJRX0JBU0UgKyA3KTsKIAkJcmV0dXJuOworCX0gZWxzZSBpZiAocGVuZGluZyAmIENBVVNFRl9JUDIpIHsKKwkJcyA9IElDMF9SRVEwSU5UOworCQlvZmYgPSBBVTEwMDBfSU5UQzBfSU5UX0JBU0U7CisJfSBlbHNlIGlmIChwZW5kaW5nICYgQ0FVU0VGX0lQMykgeworCQlzID0gSUMwX1JFUTFJTlQ7CisJCW9mZiA9IEFVMTAwMF9JTlRDMF9JTlRfQkFTRTsKKwl9IGVsc2UgaWYgKHBlbmRpbmcgJiBDQVVTRUZfSVA0KSB7CisJCXMgPSBJQzFfUkVRMElOVDsKKwkJb2ZmID0gQVUxMDAwX0lOVEMxX0lOVF9CQVNFOworCX0gZWxzZSBpZiAocGVuZGluZyAmIENBVVNFRl9JUDUpIHsKKwkJcyA9IElDMV9SRVExSU5UOworCQlvZmYgPSBBVTEwMDBfSU5UQzFfSU5UX0JBU0U7CisJfSBlbHNlCisJCWdvdG8gc3B1cmlvdXM7CiAKKwliaXQgPSAwOworCXMgPSBhdV9yZWFkbChzKTsKKwlpZiAodW5saWtlbHkoIXMpKSB7CitzcHVyaW91czoKKwkJc3B1cmlvdXNfaW50ZXJydXB0KCk7CisJCXJldHVybjsKKwl9CiAjaWZkZWYgQVUxMDAwX1VTQl9ERVZfUkVRX0lOVAogCS8qCiAJICogQmVjYXVzZSBvZiB0aGUgdGlnaHQgdGltaW5nIG9mIFNFVFVQIHRva2VuIHRvIHJlcGx5CiAJICogdHJhbnNhY3Rpb25zLCB0aGUgVVNCIGRldmljZXMtc2lkZSBwYWNrZXQgY29tcGxldGUKIAkgKiBpbnRlcnJ1cHQgbmVlZHMgdGhlIGhpZ2hlc3QgcHJpb3JpdHkuCiAJICovCi0JaWYgKChpbnRjMF9yZXEwICYgKDEgPDwgQVUxMDAwX1VTQl9ERVZfUkVRX0lOVCkpKSB7Ci0JCWludGMwX3JlcTAgJj0gfigxIDw8IEFVMTAwMF9VU0JfREVWX1JFUV9JTlQpOworCWJpdCA9IDEgPDwgKEFVMTAwMF9VU0JfREVWX1JFUV9JTlQgLSBBVTEwMDBfSU5UQzBfSU5UX0JBU0UpOworCWlmICgocGVuZGluZyAmIENBVVNFRl9JUDIpICYmIChzICYgYml0KSkgewogCQlkb19JUlEoQVUxMDAwX1VTQl9ERVZfUkVRX0lOVCk7CiAJCXJldHVybjsKIAl9CiAjZW5kaWYKLQliaXQgPSBfX2ZmcyhpbnRjMF9yZXEwKTsKLQlpbnRjMF9yZXEwICY9IH4oMSA8PCBiaXQpOwotCWRvX0lSUShBVTEwMDBfSU5UQzBfSU5UX0JBU0UgKyBiaXQpOworCWRvX0lSUShfX2ZmcyhzKSArIG9mZik7CiB9CiAKLQotc3RhdGljIHZvaWQgaW50YzBfcmVxMV9pcnFkaXNwYXRjaCh2b2lkKQorLyogc2V0dXAgZWRnZS9sZXZlbCBhbmQgYXNzaWduIHJlcXVlc3QgMC8xICovCit2b2lkIF9faW5pdCBhdTF4eHhfc2V0dXBfaXJxbWFwKHN0cnVjdCBhdTF4eHhfaXJxbWFwICptYXAsIGludCBjb3VudCkKIHsKLQlzdGF0aWMgdW5zaWduZWQgbG9uZyBpbnRjMF9yZXExOwotCXVuc2lnbmVkIGludCBiaXQ7CisJdW5zaWduZWQgaW50IGJpdCwgaXJxX25yOwogCi0JaW50YzBfcmVxMSB8PSBhdV9yZWFkbChJQzBfUkVRMUlOVCk7CisJd2hpbGUgKGNvdW50LS0pIHsKKwkJaXJxX25yID0gbWFwW2NvdW50XS5pbV9pcnE7CiAKLQlpZiAoIWludGMwX3JlcTEpCi0JCXJldHVybjsKKwkJaWYgKCgoaXJxX25yIDwgQVUxMDAwX0lOVEMwX0lOVF9CQVNFKSB8fAorCQkgICAgIChpcnFfbnIgPj0gQVUxMDAwX0lOVEMwX0lOVF9CQVNFICsgMzIpKSAmJgorCQkgICAgKChpcnFfbnIgPCBBVTEwMDBfSU5UQzFfSU5UX0JBU0UpIHx8CisJCSAgICAgKGlycV9uciA+PSBBVTEwMDBfSU5UQzFfSU5UX0JBU0UgKyAzMikpKQorCQkJY29udGludWU7CiAKLQliaXQgPSBfX2ZmcyhpbnRjMF9yZXExKTsKLQlpbnRjMF9yZXExICY9IH4oMSA8PCBiaXQpOwotCWRvX0lSUShBVTEwMDBfSU5UQzBfSU5UX0JBU0UgKyBiaXQpOwotfQorCQlpZiAoaXJxX25yID49IEFVMTAwMF9JTlRDMV9JTlRfQkFTRSkgeworCQkJYml0ID0gaXJxX25yIC0gQVUxMDAwX0lOVEMxX0lOVF9CQVNFOworCQkJaWYgKG1hcFtjb3VudF0uaW1fcmVxdWVzdCkKKwkJCQlhdV93cml0ZWwoMSA8PCBiaXQsIElDMV9BU1NJR05DTFIpOworCQl9IGVsc2UgeworCQkJYml0ID0gaXJxX25yIC0gQVUxMDAwX0lOVEMwX0lOVF9CQVNFOworCQkJaWYgKG1hcFtjb3VudF0uaW1fcmVxdWVzdCkKKwkJCQlhdV93cml0ZWwoMSA8PCBiaXQsIElDMF9BU1NJR05DTFIpOworCQl9CiAKLQotLyoKLSAqIEludGVycnVwdCBDb250cm9sbGVyIDE6Ci0gKiBpbnRlcnJ1cHRzIDMyIC0gNjMKLSAqLwotc3RhdGljIHZvaWQgaW50YzFfcmVxMF9pcnFkaXNwYXRjaCh2b2lkKQotewotCXN0YXRpYyB1bnNpZ25lZCBsb25nIGludGMxX3JlcTA7Ci0JdW5zaWduZWQgaW50IGJpdDsKLQotCWludGMxX3JlcTAgfD0gYXVfcmVhZGwoSUMxX1JFUTBJTlQpOwotCi0JaWYgKCFpbnRjMV9yZXEwKQotCQlyZXR1cm47Ci0KLQliaXQgPSBfX2ZmcyhpbnRjMV9yZXEwKTsKLQlpbnRjMV9yZXEwICY9IH4oMSA8PCBiaXQpOwotCWRvX0lSUShBVTEwMDBfSU5UQzFfSU5UX0JBU0UgKyBiaXQpOwotfQotCi0KLXN0YXRpYyB2b2lkIGludGMxX3JlcTFfaXJxZGlzcGF0Y2godm9pZCkKLXsKLQlzdGF0aWMgdW5zaWduZWQgbG9uZyBpbnRjMV9yZXExOwotCXVuc2lnbmVkIGludCBiaXQ7Ci0KLQlpbnRjMV9yZXExIHw9IGF1X3JlYWRsKElDMV9SRVExSU5UKTsKLQotCWlmICghaW50YzFfcmVxMSkKLQkJcmV0dXJuOwotCi0JYml0ID0gX19mZnMoaW50YzFfcmVxMSk7Ci0JaW50YzFfcmVxMSAmPSB+KDEgPDwgYml0KTsKLQlkb19JUlEoQVUxMDAwX0lOVEMxX0lOVF9CQVNFICsgYml0KTsKLX0KLQotYXNtbGlua2FnZSB2b2lkIHBsYXRfaXJxX2Rpc3BhdGNoKHZvaWQpCi17Ci0JdW5zaWduZWQgaW50IHBlbmRpbmcgPSByZWFkX2MwX3N0YXR1cygpICYgcmVhZF9jMF9jYXVzZSgpOwotCi0JaWYgKHBlbmRpbmcgJiBDQVVTRUZfSVA3KQotCQlkb19JUlEoTUlQU19DUFVfSVJRX0JBU0UgKyA3KTsKLQllbHNlIGlmIChwZW5kaW5nICYgQ0FVU0VGX0lQMikKLQkJaW50YzBfcmVxMF9pcnFkaXNwYXRjaCgpOwotCWVsc2UgaWYgKHBlbmRpbmcgJiBDQVVTRUZfSVAzKQotCQlpbnRjMF9yZXExX2lycWRpc3BhdGNoKCk7Ci0JZWxzZSBpZiAocGVuZGluZyAmIENBVVNFRl9JUDQpCi0JCWludGMxX3JlcTBfaXJxZGlzcGF0Y2goKTsKLQllbHNlIGlmIChwZW5kaW5nICAmIENBVVNFRl9JUDUpCi0JCWludGMxX3JlcTFfaXJxZGlzcGF0Y2goKTsKLQllbHNlCi0JCXNwdXJpb3VzX2ludGVycnVwdCgpOworCQlhdTF4X2ljX3NldHR5cGUoaXJxX25yLCBtYXBbY291bnRdLmltX3R5cGUpOworCX0KIH0KIAogdm9pZCBfX2luaXQgYXJjaF9pbml0X2lycSh2b2lkKQogewogCWludCBpOwotCXN0cnVjdCBhdTF4eHhfaXJxbWFwICppbXA7Ci0JZXh0ZXJuIHN0cnVjdCBhdTF4eHhfaXJxbWFwIGF1MXh4eF9pcnFfbWFwW107Ci0JZXh0ZXJuIHN0cnVjdCBhdTF4eHhfaXJxbWFwIGF1MXh4eF9pYzBfbWFwW107Ci0JZXh0ZXJuIGludCBhdTF4eHhfbnJfaXJxczsKLQlleHRlcm4gaW50IGF1MXh4eF9pYzBfbnJfaXJxczsKIAogCS8qCiAJICogSW5pdGlhbGl6ZSBpbnRlcnJ1cHQgY29udHJvbGxlcnMgdG8gYSBzYWZlIHN0YXRlLgpAQCAtNTY5LDI4ICs1ODcsMjUgQEAKIAogCW1pcHNfY3B1X2lycV9pbml0KCk7CiAKKwkvKiByZWdpc3RlciBhbGwgNjQgcG9zc2libGUgSUMwK0lDMSBpcnEgc291cmNlcyBhcyB0eXBlICJub25lIi4KKwkgKiBVc2Ugc2V0X2lycV90eXBlKCkgdG8gc2V0IGVkZ2UvbGV2ZWwgYmVoYXZpb3VyIGF0IHJ1bnRpbWUuCisJICovCisJZm9yIChpID0gQVUxMDAwX0lOVEMwX0lOVF9CQVNFOworCSAgICAgKGkgPCBBVTEwMDBfSU5UQzBfSU5UX0JBU0UgKyAzMik7IGkrKykKKwkJYXUxeF9pY19zZXR0eXBlKGksIElSUV9UWVBFX05PTkUpOworCisJZm9yIChpID0gQVUxMDAwX0lOVEMxX0lOVF9CQVNFOworCSAgICAgKGkgPCBBVTEwMDBfSU5UQzFfSU5UX0JBU0UgKyAzMik7IGkrKykKKwkJYXUxeF9pY19zZXR0eXBlKGksIElSUV9UWVBFX05PTkUpOworCiAJLyoKIAkgKiBJbml0aWFsaXplIElDMCwgd2hpY2ggaXMgZml4ZWQgcGVyIHByb2Nlc3Nvci4KIAkgKi8KLQlpbXAgPSBhdTF4eHhfaWMwX21hcDsKLQlmb3IgKGkgPSAwOyBpIDwgYXUxeHh4X2ljMF9ucl9pcnFzOyBpKyspIHsKLQkJc2V0dXBfbG9jYWxfaXJxKGltcC0+aW1faXJxLCBpbXAtPmltX3R5cGUsIGltcC0+aW1fcmVxdWVzdCk7Ci0JCWltcCsrOwotCX0KKwlhdTF4eHhfc2V0dXBfaXJxbWFwKGF1MXh4eF9pYzBfbWFwLCBBUlJBWV9TSVpFKGF1MXh4eF9pYzBfbWFwKSk7CiAKLQkvKgotCSAqIE5vdyBzZXQgdXAgdGhlIGlycSBtYXBwaW5nIGZvciB0aGUgYm9hcmQuCi0JICovCi0JaW1wID0gYXUxeHh4X2lycV9tYXA7Ci0JZm9yIChpID0gMDsgaSA8IGF1MXh4eF9ucl9pcnFzOyBpKyspIHsKLQkJc2V0dXBfbG9jYWxfaXJxKGltcC0+aW1faXJxLCBpbXAtPmltX3R5cGUsIGltcC0+aW1fcmVxdWVzdCk7Ci0JCWltcCsrOwotCX0KLQotCXNldF9jMF9zdGF0dXMoSUVfSVJRMCB8IElFX0lSUTEgfCBJRV9JUlEyIHwgSUVfSVJRMyB8IElFX0lSUTQpOwotCi0JLyogQm9hcmQgc3BlY2lmaWMgSVJRIGluaXRpYWxpemF0aW9uLgorCS8qIEJvYXJkcyBjYW4gcmVnaXN0ZXIgYWRkaXRpb25hbCAoR1BJTy1iYXNlZCkgSVJRcy4KIAkqLwotCWlmIChib2FyZF9pbml0X2lycSkKLQkJYm9hcmRfaW5pdF9pcnEoKTsKKwlib2FyZF9pbml0X2lycSgpOworCisJc2V0X2MwX3N0YXR1cyhJRV9JUlEwIHwgSUVfSVJRMSB8IElFX0lSUTIgfCBJRV9JUlEzKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9hbGNoZW15L2NvbW1vbi9wb3dlci5jIGIvYXJjaC9taXBzL2FsY2hlbXkvY29tbW9uL3Bvd2VyLmMKaW5kZXggYmQ4NTRhNi4uNmFiN2I0MiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2FsY2hlbXkvY29tbW9uL3Bvd2VyLmMKKysrIGIvYXJjaC9taXBzL2FsY2hlbXkvY29tbW9uL3Bvd2VyLmMKQEAgLTM1LDI1ICszNSwxMiBAQAogI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KIAogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+Ci0jaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KICNpbmNsdWRlIDxhc20vbWFjaC1hdTF4MDAvYXUxMDAwLmg+Ci0KLSNpZmRlZiBDT05GSUdfUE0KLQotI2RlZmluZSBERUJVRyAxCi0jaWZkZWYJREVCVUcKLSNkZWZpbmUgRFBSSU5USyhmbXQsIGFyZ3MuLi4pCXByaW50ayhLRVJOX0RFQlVHICIlczogIiBmbXQsIF9fZnVuY19fLCAjIyBhcmdzKQotI2Vsc2UKLSNkZWZpbmUgRFBSSU5USyhmbXQsIGFyZ3MuLi4pCisjaWYgZGVmaW5lZChDT05GSUdfU09DX0FVMTU1MCkgfHwgZGVmaW5lZChDT05GSUdfU09DX0FVMTIwMCkKKyNpbmNsdWRlIDxhc20vbWFjaC1hdTF4MDAvYXUxeHh4X2RiZG1hLmg+CiAjZW5kaWYKIAotc3RhdGljIHZvaWQgYXUxMDAwX2NhbGlicmF0ZV9kZWxheSh2b2lkKTsKLQotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgc2F2ZV9sb2NhbF9hbmRfZGlzYWJsZShpbnQgY29udHJvbGxlcik7Ci1leHRlcm4gdm9pZCByZXN0b3JlX2xvY2FsX2FuZF9lbmFibGUoaW50IGNvbnRyb2xsZXIsIHVuc2lnbmVkIGxvbmcgbWFzayk7Ci1leHRlcm4gdm9pZCBsb2NhbF9lbmFibGVfaXJxKHVuc2lnbmVkIGludCBpcnFfbnIpOwotCi1zdGF0aWMgREVGSU5FX1NQSU5MT0NLKHBtX2xvY2spOworI2lmZGVmIENPTkZJR19QTQogCiAvKgogICogV2UgbmVlZCB0byBzYXZlL3Jlc3RvcmUgYSBidW5jaCBvZiBjb3JlIHJlZ2lzdGVycyB0aGF0IGFyZQpAQCAtNjUsMjkgKzUyLDE2IEBACiAgKiBXZSBvbmx5IGhhdmUgdG8gc2F2ZS9yZXN0b3JlIHJlZ2lzdGVycyB0aGF0IGFyZW4ndCBvdGhlcndpc2UKICAqIGRvbmUgYXMgcGFydCBvZiBhIGRyaXZlciBwbV8qIGZ1bmN0aW9uLgogICovCi1zdGF0aWMgdW5zaWduZWQgaW50CXNsZWVwX2F1eF9wbGxfY250cmw7Ci1zdGF0aWMgdW5zaWduZWQgaW50CXNsZWVwX2NwdV9wbGxfY250cmw7Ci1zdGF0aWMgdW5zaWduZWQgaW50CXNsZWVwX3Bpbl9mdW5jdGlvbjsKLXN0YXRpYyB1bnNpZ25lZCBpbnQJc2xlZXBfdWFydDBfaW50ZW47Ci1zdGF0aWMgdW5zaWduZWQgaW50CXNsZWVwX3VhcnQwX2ZpZm9jdGw7Ci1zdGF0aWMgdW5zaWduZWQgaW50CXNsZWVwX3VhcnQwX2xpbmVjdGw7Ci1zdGF0aWMgdW5zaWduZWQgaW50CXNsZWVwX3VhcnQwX2Nsa2RpdjsKLXN0YXRpYyB1bnNpZ25lZCBpbnQJc2xlZXBfdWFydDBfZW5hYmxlOwotc3RhdGljIHVuc2lnbmVkIGludAlzbGVlcF91c2Job3N0X2VuYWJsZTsKLXN0YXRpYyB1bnNpZ25lZCBpbnQJc2xlZXBfdXNiZGV2X2VuYWJsZTsKLXN0YXRpYyB1bnNpZ25lZCBpbnQJc2xlZXBfc3RhdGljX21lbWN0bHJbNF1bM107CitzdGF0aWMgdW5zaWduZWQgaW50IHNsZWVwX3VhcnQwX2ludGVuOworc3RhdGljIHVuc2lnbmVkIGludCBzbGVlcF91YXJ0MF9maWZvY3RsOworc3RhdGljIHVuc2lnbmVkIGludCBzbGVlcF91YXJ0MF9saW5lY3RsOworc3RhdGljIHVuc2lnbmVkIGludCBzbGVlcF91YXJ0MF9jbGtkaXY7CitzdGF0aWMgdW5zaWduZWQgaW50IHNsZWVwX3VhcnQwX2VuYWJsZTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgc2xlZXBfdXNiWzJdOworc3RhdGljIHVuc2lnbmVkIGludCBzbGVlcF9zeXNfY2xvY2tzWzVdOworc3RhdGljIHVuc2lnbmVkIGludCBzbGVlcF9zeXNfcGluZnVuYzsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgc2xlZXBfc3RhdGljX21lbWN0bHJbNF1bM107CiAKLS8qCi0gKiBEZWZpbmUgdGhpcyB0byBjYXVzZSB0aGUgdmFsdWUgeW91IHdyaXRlIHRvIC9wcm9jL3N5cy9wbS9zbGVlcCB0bwotICogc2V0IHRoZSBUT1kgdGltZXIgZm9yIHRoZSBhbW91bnQgb2YgdGltZSB5b3Ugd2FudCB0byBzbGVlcC4KLSAqIFRoaXMgaXMgZG9uZSBtYWlubHkgZm9yIHRlc3RpbmcsIGJ1dCBtYXkgYmUgdXNlZnVsIGluIG90aGVyIGNhc2VzLgotICogVGhlIHZhbHVlIGlzIG51bWJlciBvZiAzMktIeiB0aWNrcyB0byBzbGVlcC4KLSAqLwotI2RlZmluZSBTTEVFUF9URVNUX1RJTUVPVVQgMQotI2lmZGVmCVNMRUVQX1RFU1RfVElNRU9VVAotc3RhdGljIGludCBzbGVlcF90aWNrczsKLXZvaWQgd2FrZXVwX2NvdW50ZXIwX3NldChpbnQgdGlja3MpOwotI2VuZGlmCiAKIHN0YXRpYyB2b2lkIHNhdmVfY29yZV9yZWdzKHZvaWQpCiB7CkBAIC0xMDUsMzEgKzc5LDQ1IEBACiAJc2xlZXBfdWFydDBfbGluZWN0bCA9IGF1X3JlYWRsKFVBUlQwX0FERFIgKyBVQVJUX0xDUik7CiAJc2xlZXBfdWFydDBfY2xrZGl2ID0gYXVfcmVhZGwoVUFSVDBfQUREUiArIFVBUlRfQ0xLKTsKIAlzbGVlcF91YXJ0MF9lbmFibGUgPSBhdV9yZWFkbChVQVJUMF9BRERSICsgVUFSVF9NT0RfQ05UUkwpOworCWF1X3N5bmMoKTsKIAorI2lmbmRlZiBDT05GSUdfU09DX0FVMTIwMAogCS8qIFNodXRkb3duIFVTQiBob3N0L2RldmljZS4gKi8KLQlzbGVlcF91c2Job3N0X2VuYWJsZSA9IGF1X3JlYWRsKFVTQl9IT1NUX0NPTkZJRyk7CisJc2xlZXBfdXNiWzBdID0gYXVfcmVhZGwoVVNCX0hPU1RfQ09ORklHKTsKIAogCS8qIFRoZXJlIGFwcGVhcnMgdG8gYmUgc29tZSB1bmRvY3VtZW50ZWQgcmVzZXQgcmVnaXN0ZXIuLi4uICovCi0JYXVfd3JpdGVsKDAsIDB4YjAxMDAwMDQpOyBhdV9zeW5jKCk7Ci0JYXVfd3JpdGVsKDAsIFVTQl9IT1NUX0NPTkZJRyk7IGF1X3N5bmMoKTsKKwlhdV93cml0ZWwoMCwgMHhiMDEwMDAwNCk7CisJYXVfc3luYygpOworCWF1X3dyaXRlbCgwLCBVU0JfSE9TVF9DT05GSUcpOworCWF1X3N5bmMoKTsKIAotCXNsZWVwX3VzYmRldl9lbmFibGUgPSBhdV9yZWFkbChVU0JEX0VOQUJMRSk7Ci0JYXVfd3JpdGVsKDAsIFVTQkRfRU5BQkxFKTsgYXVfc3luYygpOworCXNsZWVwX3VzYlsxXSA9IGF1X3JlYWRsKFVTQkRfRU5BQkxFKTsKKwlhdV93cml0ZWwoMCwgVVNCRF9FTkFCTEUpOworCWF1X3N5bmMoKTsKKworI2Vsc2UJLyogQVUxMjAwICovCisKKwkvKiBlbmFibGUgYWNjZXNzIHRvIE9URyBtbWlvIHNvIHdlIGNhbiBzYXZlIE9URyBDQVAvTVVYLgorCSAqIEZJWE1FOiB3cml0ZSBhbiBPVEcgZHJpdmVyIGFuZCBtb3ZlIHRoaXMgc3R1ZmYgdGhlcmUhCisJICovCisJYXVfd3JpdGVsKGF1X3JlYWRsKFVTQl9NU1JfQkFTRSArIDQpIHwgKDEgPDwgNiksIFVTQl9NU1JfQkFTRSArIDQpOworCWF1X3N5bmMoKTsKKwlzbGVlcF91c2JbMF0gPSBhdV9yZWFkbCgweGI0MDIwMDIwKTsJLyogT1RHX0NBUCAqLworCXNsZWVwX3VzYlsxXSA9IGF1X3JlYWRsKDB4YjQwMjAwMjQpOwkvKiBPVEdfTVVYICovCisjZW5kaWYKIAogCS8qIFNhdmUgaW50ZXJydXB0IGNvbnRyb2xsZXIgc3RhdGUuICovCiAJc2F2ZV9hdTF4eHhfaW50Y3RsKCk7CiAKIAkvKiBDbG9ja3MgYW5kIFBMTHMuICovCi0Jc2xlZXBfYXV4X3BsbF9jbnRybCA9IGF1X3JlYWRsKFNZU19BVVhQTEwpOworCXNsZWVwX3N5c19jbG9ja3NbMF0gPSBhdV9yZWFkbChTWVNfRlJFUUNUUkwwKTsKKwlzbGVlcF9zeXNfY2xvY2tzWzFdID0gYXVfcmVhZGwoU1lTX0ZSRVFDVFJMMSk7CisJc2xlZXBfc3lzX2Nsb2Nrc1syXSA9IGF1X3JlYWRsKFNZU19DTEtTUkMpOworCXNsZWVwX3N5c19jbG9ja3NbM10gPSBhdV9yZWFkbChTWVNfQ1BVUExMKTsKKwlzbGVlcF9zeXNfY2xvY2tzWzRdID0gYXVfcmVhZGwoU1lTX0FVWFBMTCk7CiAKLQkvKgotCSAqIFdlIGRvbid0IHJlYWxseSBuZWVkIHRvIGRvIHRoaXMgb25lLCBidXQgdW5sZXNzIHdlCi0JICogd3JpdGUgaXQgYWdhaW4gaXQgd29uJ3QgaGF2ZSBhIHZhbGlkIHZhbHVlIGlmIHdlCi0JICogaGFwcGVuIHRvIHJlYWQgaXQuCi0JICovCi0Jc2xlZXBfY3B1X3BsbF9jbnRybCA9IGF1X3JlYWRsKFNZU19DUFVQTEwpOwotCi0Jc2xlZXBfcGluX2Z1bmN0aW9uID0gYXVfcmVhZGwoU1lTX1BJTkZVTkMpOworCS8qIHBpbiBtdXggY29uZmlnICovCisJc2xlZXBfc3lzX3BpbmZ1bmMgPSBhdV9yZWFkbChTWVNfUElORlVOQyk7CiAKIAkvKiBTYXZlIHRoZSBzdGF0aWMgbWVtb3J5IGNvbnRyb2xsZXIgY29uZmlndXJhdGlvbi4gKi8KIAlzbGVlcF9zdGF0aWNfbWVtY3RsclswXVswXSA9IGF1X3JlYWRsKE1FTV9TVENGRzApOwpAQCAtMTQ0LDE2ICsxMzIsNDUgQEAKIAlzbGVlcF9zdGF0aWNfbWVtY3RsclszXVswXSA9IGF1X3JlYWRsKE1FTV9TVENGRzMpOwogCXNsZWVwX3N0YXRpY19tZW1jdGxyWzNdWzFdID0gYXVfcmVhZGwoTUVNX1NUVElNRTMpOwogCXNsZWVwX3N0YXRpY19tZW1jdGxyWzNdWzJdID0gYXVfcmVhZGwoTUVNX1NUQUREUjMpOworCisjaWYgZGVmaW5lZChDT05GSUdfU09DX0FVMTU1MCkgfHwgZGVmaW5lZChDT05GSUdfU09DX0FVMTIwMCkKKwlhdTF4eHhfZGJkbWFfc3VzcGVuZCgpOworI2VuZGlmCiB9CiAKIHN0YXRpYyB2b2lkIHJlc3RvcmVfY29yZV9yZWdzKHZvaWQpCiB7Ci0JZXh0ZXJuIHZvaWQgcmVzdG9yZV9hdTF4eHhfaW50Y3RsKHZvaWQpOwotCWV4dGVybiB2b2lkIHdha2V1cF9jb3VudGVyMF9hZGp1c3Qodm9pZCk7CisJLyogcmVzdG9yZSBjbG9jayBjb25maWd1cmF0aW9uLiAgV3JpdGluZyBDUFVQTEwgbGFzdCB3aWxsCisJICogc3RhbGwgYSBiaXQgYW5kIHN0YWJpbGl6ZSBvdGhlciBjbG9ja3MgKHVubGVzcyB0aGlzIGlzCisJICogb25lIG9mIHRob3NlIEF1MTAwMCB3aXRoIGEgd3JpdGUtb25seSBQTEwsIHdoZXJlIHdlIGRvbnQKKwkgKiBoYXZlIGEgdmFsaWQgdmFsdWUpCisJICovCisJYXVfd3JpdGVsKHNsZWVwX3N5c19jbG9ja3NbMF0sIFNZU19GUkVRQ1RSTDApOworCWF1X3dyaXRlbChzbGVlcF9zeXNfY2xvY2tzWzFdLCBTWVNfRlJFUUNUUkwxKTsKKwlhdV93cml0ZWwoc2xlZXBfc3lzX2Nsb2Nrc1syXSwgU1lTX0NMS1NSQyk7CisJYXVfd3JpdGVsKHNsZWVwX3N5c19jbG9ja3NbNF0sIFNZU19BVVhQTEwpOworCWlmICghYXUxeHh4X2NwdV9oYXNfcGxsX3dvKCkpCisJCWF1X3dyaXRlbChzbGVlcF9zeXNfY2xvY2tzWzNdLCBTWVNfQ1BVUExMKTsKKwlhdV9zeW5jKCk7CiAKLQlhdV93cml0ZWwoc2xlZXBfYXV4X3BsbF9jbnRybCwgU1lTX0FVWFBMTCk7IGF1X3N5bmMoKTsKLQlhdV93cml0ZWwoc2xlZXBfY3B1X3BsbF9jbnRybCwgU1lTX0NQVVBMTCk7IGF1X3N5bmMoKTsKLQlhdV93cml0ZWwoc2xlZXBfcGluX2Z1bmN0aW9uLCBTWVNfUElORlVOQyk7IGF1X3N5bmMoKTsKKwlhdV93cml0ZWwoc2xlZXBfc3lzX3BpbmZ1bmMsIFNZU19QSU5GVU5DKTsKKwlhdV9zeW5jKCk7CisKKyNpZm5kZWYgQ09ORklHX1NPQ19BVTEyMDAKKwlhdV93cml0ZWwoc2xlZXBfdXNiWzBdLCBVU0JfSE9TVF9DT05GSUcpOworCWF1X3dyaXRlbChzbGVlcF91c2JbMV0sIFVTQkRfRU5BQkxFKTsKKwlhdV9zeW5jKCk7CisjZWxzZQorCS8qIGVuYWJsZSBhY2NjZXMgdG8gT1RHIG1lbW9yeSAqLworCWF1X3dyaXRlbChhdV9yZWFkbChVU0JfTVNSX0JBU0UgKyA0KSB8ICgxIDw8IDYpLCBVU0JfTVNSX0JBU0UgKyA0KTsKKwlhdV9zeW5jKCk7CisKKwkvKiByZXN0b3JlIE9URyBjYXBzIGFuZCBwb3J0IG11eC4gKi8KKwlhdV93cml0ZWwoc2xlZXBfdXNiWzBdLCAweGI0MDIwMDIwICsgMCk7CS8qIE9UR19DQVAgKi8KKwlhdV9zeW5jKCk7CisJYXVfd3JpdGVsKHNsZWVwX3VzYlsxXSwgMHhiNDAyMDAyMCArIDQpOwkvKiBPVEdfTVVYICovCisJYXVfc3luYygpOworI2VuZGlmCiAKIAkvKiBSZXN0b3JlIHRoZSBzdGF0aWMgbWVtb3J5IGNvbnRyb2xsZXIgY29uZmlndXJhdGlvbi4gKi8KIAlhdV93cml0ZWwoc2xlZXBfc3RhdGljX21lbWN0bHJbMF1bMF0sIE1FTV9TVENGRzApOwpAQCAtMTg0LDI4MiArMjAxLDE3IEBACiAJfQogCiAJcmVzdG9yZV9hdTF4eHhfaW50Y3RsKCk7Ci0Jd2FrZXVwX2NvdW50ZXIwX2FkanVzdCgpOworCisjaWYgZGVmaW5lZChDT05GSUdfU09DX0FVMTU1MCkgfHwgZGVmaW5lZChDT05GSUdfU09DX0FVMTIwMCkKKwlhdTF4eHhfZGJkbWFfcmVzdW1lKCk7CisjZW5kaWYKIH0KIAotdW5zaWduZWQgbG9uZyBzdXNwZW5kX21vZGU7Ci0KLXZvaWQgd2FrZXVwX2Zyb21fc3VzcGVuZCh2b2lkKQordm9pZCBhdV9zbGVlcCh2b2lkKQogewotCXN1c3BlbmRfbW9kZSA9IDA7Ci19Ci0KLWludCBhdV9zbGVlcCh2b2lkKQotewotCXVuc2lnbmVkIGxvbmcgd2FrZXVwLCBmbGFnczsKLQlleHRlcm4gdm9pZCBzYXZlX2FuZF9zbGVlcCh2b2lkKTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZwbV9sb2NrLCBmbGFncyk7Ci0KIAlzYXZlX2NvcmVfcmVncygpOwotCi0JZmx1c2hfY2FjaGVfYWxsKCk7Ci0KLQkvKioKLQkgKiogVGhlIGNvZGUgYmVsb3cgaXMgYWxsIHN5c3RlbSBkZXBlbmRlbnQgYW5kIHdlIHNob3VsZCBwcm9iYWJseQotCSAqKiBoYXZlIGEgZnVuY3Rpb24gY2FsbCBvdXQgb2YgaGVyZSB0byBzZXQgdGhpcyB1cC4gIFlvdSBuZWVkCi0JICoqIHRvIGNvbmZpZ3VyZSB0aGUgR1BJTyBvciB0aW1lciBpbnRlcnJ1cHRzIHRoYXQgd2lsbCBicmluZwotCSAqKiB5b3Ugb3V0IG9mIHNsZWVwLgotCSAqKiBGb3IgdGVzdGluZywgdGhlIFRPWSBjb3VudGVyIHdha2V1cCBpcyB1c2VmdWwuCi0JICoqLwotI2lmIDAKLQlhdV93cml0ZWwoYXVfcmVhZGwoU1lTX1BJTlNUQVRFUkQpICYgfigxIDw8IDExKSwgU1lTX1BJTlNUQVRFUkQpOwotCi0JLyogR1BJTyA2IGNhbiBjYXVzZSBhIHdha2UgdXAgZXZlbnQgKi8KLQl3YWtldXAgPSBhdV9yZWFkbChTWVNfV0FLRU1TSyk7Ci0Jd2FrZXVwICY9IH4oMSA8PCA4KTsJLyogdHVybiBvZmYgbWF0Y2gyMCB3YWtldXAgKi8KLQl3YWtldXAgfD0gMSA8PCA2OwkvKiB0dXJuIG9uICBHUElPICA2IHdha2V1cCAqLwotI2Vsc2UKLQkvKiBGb3IgdGVzdGluZywgYWxsb3cgbWF0Y2gyMCB0byB3YWtlIHVzIHVwLiAqLwotI2lmZGVmIFNMRUVQX1RFU1RfVElNRU9VVAotCXdha2V1cF9jb3VudGVyMF9zZXQoc2xlZXBfdGlja3MpOwotI2VuZGlmCi0Jd2FrZXVwID0gMSA8PCA4OwkvKiB0dXJuIG9uIG1hdGNoMjAgd2FrZXVwICAgKi8KLQl3YWtldXAgPSAwOwotI2VuZGlmCi0JYXVfd3JpdGVsKDEsIFNZU19XQUtFU1JDKTsJLyogY2xlYXIgY2F1c2UgKi8KLQlhdV9zeW5jKCk7Ci0JYXVfd3JpdGVsKHdha2V1cCwgU1lTX1dBS0VNU0spOwotCWF1X3N5bmMoKTsKLQotCXNhdmVfYW5kX3NsZWVwKCk7Ci0KLQkvKgotCSAqIEFmdGVyIGEgd2FrZXVwLCB0aGUgY3B1IHZlY3RvcnMgYmFjayB0byAweDFmYzAwMDAwLCBzbwotCSAqIGl0J3MgdXAgdG8gdGhlIGJvb3QgY29kZSB0byBnZXQgdXMgYmFjayBoZXJlLgotCSAqLworCWF1MXh4eF9zYXZlX2FuZF9zbGVlcCgpOwogCXJlc3RvcmVfY29yZV9yZWdzKCk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG1fbG9jaywgZmxhZ3MpOwotCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHBtX2RvX3NsZWVwKGN0bF90YWJsZSAqY3RsLCBpbnQgd3JpdGUsIHN0cnVjdCBmaWxlICpmaWxlLAotCQkgICAgICAgdm9pZCBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90ICpsZW4sIGxvZmZfdCAqcHBvcykKLXsKLSNpZmRlZiBTTEVFUF9URVNUX1RJTUVPVVQKLSNkZWZpbmUgVE1QQlVGTEVOMiAxNgotCWNoYXIgYnVmW1RNUEJVRkxFTjJdLCAqcDsKLSNlbmRpZgotCi0JaWYgKCF3cml0ZSkKLQkJKmxlbiA9IDA7Ci0JZWxzZSB7Ci0jaWZkZWYgU0xFRVBfVEVTVF9USU1FT1VUCi0JCWlmICgqbGVuID4gVE1QQlVGTEVOMiAtIDEpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJaWYgKGNvcHlfZnJvbV91c2VyKGJ1ZiwgYnVmZmVyLCAqbGVuKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCQlidWZbKmxlbl0gPSAwOwotCQlwID0gYnVmOwotCQlzbGVlcF90aWNrcyA9IHNpbXBsZV9zdHJ0b3VsKHAsICZwLCAwKTsKLSNlbmRpZgotCi0JCWF1X3NsZWVwKCk7Ci0JfQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHBtX2RvX2ZyZXEoY3RsX3RhYmxlICpjdGwsIGludCB3cml0ZSwgc3RydWN0IGZpbGUgKmZpbGUsCi0JCSAgICAgIHZvaWQgX191c2VyICpidWZmZXIsIHNpemVfdCAqbGVuLCBsb2ZmX3QgKnBwb3MpCi17Ci0JaW50IHJldHZhbCA9IDAsIGk7Ci0JdW5zaWduZWQgbG9uZyB2YWwsIHBsbDsKLSNkZWZpbmUgVE1QQlVGTEVOIDY0Ci0jZGVmaW5lIE1BWF9DUFVfRlJFUSAzOTYKLQljaGFyIGJ1ZltUTVBCVUZMRU5dLCAqcDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzLCBpbnRjMF9tYXNrLCBpbnRjMV9tYXNrOwotCXVuc2lnbmVkIGxvbmcgb2xkX2JhdWRfYmFzZSwgb2xkX2NwdV9mcmVxLCBvbGRfY2xrLCBvbGRfcmVmcmVzaDsKLQl1bnNpZ25lZCBsb25nIG5ld19iYXVkX2Jhc2UsIG5ld19jcHVfZnJlcSwgbmV3X2NsaywgbmV3X3JlZnJlc2g7Ci0JdW5zaWduZWQgbG9uZyBiYXVkX3JhdGU7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcG1fbG9jaywgZmxhZ3MpOwotCWlmICghd3JpdGUpCi0JCSpsZW4gPSAwOwotCWVsc2UgewotCQkvKiBQYXJzZSB0aGUgbmV3IGZyZXF1ZW5jeSAqLwotCQlpZiAoKmxlbiA+IFRNUEJVRkxFTiAtIDEpIHsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBtX2xvY2ssIGZsYWdzKTsKLQkJCXJldHVybiAtRUZBVUxUOwotCQl9Ci0JCWlmIChjb3B5X2Zyb21fdXNlcihidWYsIGJ1ZmZlciwgKmxlbikpIHsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBtX2xvY2ssIGZsYWdzKTsKLQkJCXJldHVybiAtRUZBVUxUOwotCQl9Ci0JCWJ1ZlsqbGVuXSA9IDA7Ci0JCXAgPSBidWY7Ci0JCXZhbCA9IHNpbXBsZV9zdHJ0b3VsKHAsICZwLCAwKTsKLQkJaWYgKHZhbCA+IE1BWF9DUFVfRlJFUSkgewotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG1fbG9jaywgZmxhZ3MpOwotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCX0KLQotCQlwbGwgPSB2YWwgLyAxMjsKLQkJaWYgKChwbGwgPiAzMykgfHwgKHBsbCA8IDcpKSB7CS8qIDM5NiBNSHogbWF4LCA4NCBNSHogbWluICovCi0JCQkvKiBSZXZpc2l0IHRoaXMgZm9yIGhpZ2hlciBzcGVlZCBDUFVzICovCi0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwbV9sb2NrLCBmbGFncyk7Ci0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJfQotCi0JCW9sZF9iYXVkX2Jhc2UgPSBnZXRfYXUxeDAwX3VhcnRfYmF1ZF9iYXNlKCk7Ci0JCW9sZF9jcHVfZnJlcSA9IGdldF9hdTF4MDBfc3BlZWQoKTsKLQotCQluZXdfY3B1X2ZyZXEgPSBwbGwgKiAxMiAqIDEwMDAwMDA7Ci0JICAgICAgICBuZXdfYmF1ZF9iYXNlID0gKG5ld19jcHVfZnJlcSAvICgyICogKChpbnQpKGF1X3JlYWRsKFNZU19QT1dFUkNUUkwpCi0JCQkJCQkJICAgICYgMHgwMykgKyAyKSAqIDE2KSk7Ci0JCXNldF9hdTF4MDBfc3BlZWQobmV3X2NwdV9mcmVxKTsKLQkJc2V0X2F1MXgwMF91YXJ0X2JhdWRfYmFzZShuZXdfYmF1ZF9iYXNlKTsKLQotCQlvbGRfcmVmcmVzaCA9IGF1X3JlYWRsKE1FTV9TRFJFRkNGRykgJiAweDFmZmZmZmY7Ci0JCW5ld19yZWZyZXNoID0gKChvbGRfcmVmcmVzaCAqIG5ld19jcHVfZnJlcSkgLyBvbGRfY3B1X2ZyZXEpIHwKLQkJCSAgICAgIChhdV9yZWFkbChNRU1fU0RSRUZDRkcpICYgfjB4MWZmZmZmZik7Ci0KLQkJYXVfd3JpdGVsKHBsbCwgU1lTX0NQVVBMTCk7Ci0JCWF1X3N5bmNfZGVsYXkoMSk7Ci0JCWF1X3dyaXRlbChuZXdfcmVmcmVzaCwgTUVNX1NEUkVGQ0ZHKTsKLQkJYXVfc3luY19kZWxheSgxKTsKLQotCQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQotCQkJaWYgKGF1X3JlYWRsKFVBUlRfQkFTRSArIFVBUlRfTU9EX0NOVFJMICsKLQkJCQkgICAgIGkgKiAweDAwMTAwMDAwKSA9PSAzKSB7Ci0JCQkJb2xkX2NsayA9IGF1X3JlYWRsKFVBUlRfQkFTRSArIFVBUlRfQ0xLICsKLQkJCQkJCSAgIGkgKiAweDAwMTAwMDAwKTsKLQkJCQliYXVkX3JhdGUgPSBvbGRfYmF1ZF9iYXNlIC8gb2xkX2NsazsKLQkJCQkvKgotCQkJCSAqIFdlIHdvbid0IGdldCBhbiBleGFjdCBiYXVkIHJhdGUgYW5kIHRoZSBlcnJvcgotCQkJCSAqIGNvdWxkIGJlIHNpZ25pZmljYW50IGVub3VnaCB0aGF0IG91ciBuZXcKLQkJCQkgKiBjYWxjdWxhdGlvbiB3aWxsIHJlc3VsdCBpbiBhIGNsb2NrIHRoYXQgd2lsbAotCQkJCSAqIGdpdmUgdXMgYSBiYXVkIHJhdGUgdGhhdCdzIHRvbyBmYXIgb2ZmIGZyb20KLQkJCQkgKiB3aGF0IHdlIHJlYWxseSB3YW50LgotCQkJCSAqLwotCQkJCWlmIChiYXVkX3JhdGUgPiAxMDAwMDApCi0JCQkJCWJhdWRfcmF0ZSA9IDExNTIwMDsKLQkJCQllbHNlIGlmIChiYXVkX3JhdGUgPiA1MDAwMCkKLQkJCQkJYmF1ZF9yYXRlID0gNTc2MDA7Ci0JCQkJZWxzZSBpZiAoYmF1ZF9yYXRlID4gMzAwMDApCi0JCQkJCWJhdWRfcmF0ZSA9IDM4NDAwOwotCQkJCWVsc2UgaWYgKGJhdWRfcmF0ZSA+IDE3MDAwKQotCQkJCQliYXVkX3JhdGUgPSAxOTIwMDsKLQkJCQllbHNlCi0JCQkJCWJhdWRfcmF0ZSA9IDk2MDA7Ci0JCQkJbmV3X2NsayA9IG5ld19iYXVkX2Jhc2UgLyBiYXVkX3JhdGU7Ci0JCQkJYXVfd3JpdGVsKG5ld19jbGssIFVBUlRfQkFTRSArIFVBUlRfQ0xLICsKLQkJCQkJICBpICogMHgwMDEwMDAwMCk7Ci0JCQkJYXVfc3luY19kZWxheSgxMCk7Ci0JCQl9Ci0JfQotCi0JLyoKLQkgKiBXZSBkb24ndCB3YW50IF9hbnlfIGludGVycnVwdHMgb3RoZXIgdGhhbiBtYXRjaDIwLiBPdGhlcndpc2Ugb3VyCi0JICogYXUxMDAwX2NhbGlicmF0ZV9kZWxheSgpIGNhbGN1bGF0aW9uIHdpbGwgYmUgb2ZmLCBwb3RlbnRpYWxseSBhIGxvdC4KLQkgKi8KLQlpbnRjMF9tYXNrID0gc2F2ZV9sb2NhbF9hbmRfZGlzYWJsZSgwKTsKLQlpbnRjMV9tYXNrID0gc2F2ZV9sb2NhbF9hbmRfZGlzYWJsZSgxKTsKLQlsb2NhbF9lbmFibGVfaXJxKEFVMTAwMF9UT1lfTUFUQ0gyX0lOVCk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG1fbG9jaywgZmxhZ3MpOwotCWF1MTAwMF9jYWxpYnJhdGVfZGVsYXkoKTsKLQlyZXN0b3JlX2xvY2FsX2FuZF9lbmFibGUoMCwgaW50YzBfbWFzayk7Ci0JcmVzdG9yZV9sb2NhbF9hbmRfZW5hYmxlKDEsIGludGMxX21hc2spOwotCi0JcmV0dXJuIHJldHZhbDsKLX0KLQotCi1zdGF0aWMgc3RydWN0IGN0bF90YWJsZSBwbV90YWJsZVtdID0gewotCXsKLQkJLmN0bF9uYW1lCT0gQ1RMX1VOTlVNQkVSRUQsCi0JCS5wcm9jbmFtZQk9ICJzbGVlcCIsCi0JCS5kYXRhCQk9IE5VTEwsCi0JCS5tYXhsZW4JCT0gMCwKLQkJLm1vZGUJCT0gMDYwMCwKLQkJLnByb2NfaGFuZGxlcgk9ICZwbV9kb19zbGVlcAotCX0sCi0JewotCQkuY3RsX25hbWUJPSBDVExfVU5OVU1CRVJFRCwKLQkJLnByb2NuYW1lCT0gImZyZXEiLAotCQkuZGF0YQkJPSBOVUxMLAotCQkubWF4bGVuCQk9IDAsCi0JCS5tb2RlCQk9IDA2MDAsCi0JCS5wcm9jX2hhbmRsZXIJPSAmcG1fZG9fZnJlcQotCX0sCi0Je30KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY3RsX3RhYmxlIHBtX2Rpcl90YWJsZVtdID0gewotCXsKLQkJLmN0bF9uYW1lCT0gQ1RMX1VOTlVNQkVSRUQsCi0JCS5wcm9jbmFtZQk9ICJwbSIsCi0JCS5tb2RlCQk9IDA1NTUsCi0JCS5jaGlsZAkJPSBwbV90YWJsZQotCX0sCi0Je30KLX07Ci0KLS8qCi0gKiBJbml0aWFsaXplIHBvd2VyIGludGVyZmFjZQotICovCi1zdGF0aWMgaW50IF9faW5pdCBwbV9pbml0KHZvaWQpCi17Ci0JcmVnaXN0ZXJfc3lzY3RsX3RhYmxlKHBtX2Rpcl90YWJsZSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLV9faW5pdGNhbGwocG1faW5pdCk7Ci0KLS8qCi0gKiBUaGlzIGlzIHJpZ2h0IG91dCBvZiBpbml0L21haW4uYwotICovCi0KLS8qCi0gKiBUaGlzIGlzIHRoZSBudW1iZXIgb2YgYml0cyBvZiBwcmVjaXNpb24gZm9yIHRoZSBsb29wc19wZXJfamlmZnkuCi0gKiBFYWNoIGJpdCB0YWtlcyBvbiBhdmVyYWdlIDEuNS9IWiBzZWNvbmRzLiAgVGhpcyAobGlrZSB0aGUgb3JpZ2luYWwpCi0gKiBpcyBhIGxpdHRsZSBiZXR0ZXIgdGhhbiAxJS4KLSAqLwotI2RlZmluZSBMUFNfUFJFQyA4Ci0KLXN0YXRpYyB2b2lkIGF1MTAwMF9jYWxpYnJhdGVfZGVsYXkodm9pZCkKLXsKLQl1bnNpZ25lZCBsb25nIHRpY2tzLCBsb29wYml0OwotCWludCBscHNfcHJlY2lzaW9uID0gTFBTX1BSRUM7Ci0KLQlsb29wc19wZXJfamlmZnkgPSAxIDw8IDEyOwotCi0Jd2hpbGUgKGxvb3BzX3Blcl9qaWZmeSA8PD0gMSkgewotCQkvKiBXYWl0IGZvciAic3RhcnQgb2YiIGNsb2NrIHRpY2sgKi8KLQkJdGlja3MgPSBqaWZmaWVzOwotCQl3aGlsZSAodGlja3MgPT0gamlmZmllcykKLQkJCS8qIG5vdGhpbmcgKi8gOwotCQkvKiBHbyAuLi4gKi8KLQkJdGlja3MgPSBqaWZmaWVzOwotCQlfX2RlbGF5KGxvb3BzX3Blcl9qaWZmeSk7Ci0JCXRpY2tzID0gamlmZmllcyAtIHRpY2tzOwotCQlpZiAodGlja3MpCi0JCQlicmVhazsKLQl9Ci0KLQkvKgotCSAqIERvIGEgYmluYXJ5IGFwcHJveGltYXRpb24gdG8gZ2V0IGxvb3BzX3Blcl9qaWZmeSBzZXQgdG8gYmUgZXF1YWwKLQkgKiBvbmUgY2xvY2sgKHVwIHRvIGxwc19wcmVjaXNpb24gYml0cykKLQkgKi8KLQlsb29wc19wZXJfamlmZnkgPj49IDE7Ci0JbG9vcGJpdCA9IGxvb3BzX3Blcl9qaWZmeTsKLQl3aGlsZSAobHBzX3ByZWNpc2lvbi0tICYmIChsb29wYml0ID4+PSAxKSkgewotCQlsb29wc19wZXJfamlmZnkgfD0gbG9vcGJpdDsKLQkJdGlja3MgPSBqaWZmaWVzOwotCQl3aGlsZSAodGlja3MgPT0gamlmZmllcyk7Ci0JCXRpY2tzID0gamlmZmllczsKLQkJX19kZWxheShsb29wc19wZXJfamlmZnkpOwotCQlpZiAoamlmZmllcyAhPSB0aWNrcykJLyogbG9uZ2VyIHRoYW4gMSB0aWNrICovCi0JCQlsb29wc19wZXJfamlmZnkgJj0gfmxvb3BiaXQ7Ci0JfQotfQogI2VuZGlmCS8qIENPTkZJR19QTSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2FsY2hlbXkvY29tbW9uL3Jlc2V0LmMgYi9hcmNoL21pcHMvYWxjaGVteS9jb21tb24vcmVzZXQuYwppbmRleCBkNTU1NDI5Li4wMTkxYzkzIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvYWxjaGVteS9jb21tb24vcmVzZXQuYworKysgYi9hcmNoL21pcHMvYWxjaGVteS9jb21tb24vcmVzZXQuYwpAQCAtMzEsOCArMzEsNiBAQAogCiAjaW5jbHVkZSA8YXNtL21hY2gtYXUxeDAwL2F1MTAwMC5oPgogCi1leHRlcm4gaW50IGF1X3NsZWVwKHZvaWQpOwotCiB2b2lkIGF1MTAwMF9yZXN0YXJ0KGNoYXIgKmNvbW1hbmQpCiB7CiAJLyogU2V0IGFsbCBpbnRlZ3JhdGVkIHBlcmlwaGVyYWxzIHRvIGRpc2FibGVkIHN0YXRlcyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2FsY2hlbXkvY29tbW9uL3NldHVwLmMgYi9hcmNoL21pcHMvYWxjaGVteS9jb21tb24vc2V0dXAuYwppbmRleCAxYWM2YjA2Li4zZjAzNmIzIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvYWxjaGVteS9jb21tb24vc2V0dXAuYworKysgYi9hcmNoL21pcHMvYWxjaGVteS9jb21tb24vc2V0dXAuYwpAQCAtMzUsNyArMzUsNiBAQAogI2luY2x1ZGUgPGFzbS90aW1lLmg+CiAKICNpbmNsdWRlIDxhdTEwMDAuaD4KLSNpbmNsdWRlIDxwcm9tLmg+CiAKIGV4dGVybiB2b2lkIF9faW5pdCBib2FyZF9zZXR1cCh2b2lkKTsKIGV4dGVybiB2b2lkIGF1MTAwMF9yZXN0YXJ0KGNoYXIgKik7CkBAIC00NSw4MCArNDQsMzQgQEAKIAogdm9pZCBfX2luaXQgcGxhdF9tZW1fc2V0dXAodm9pZCkKIHsKLQlzdHJ1Y3QJY3B1X3NwZWMgKnNwOwotCWNoYXIgKmFyZ3B0cjsKLQl1bnNpZ25lZCBsb25nIHByaWQsIGNwdWZyZXEsIGJjbGs7CisJdW5zaWduZWQgbG9uZyBlc3RfZnJlcTsKIAotCXNldF9jcHVzcGVjKCk7Ci0Jc3AgPSBjdXJfY3B1X3NwZWNbMF07CisJLyogZGV0ZXJtaW5lIGNvcmUgY2xvY2sgKi8KKwllc3RfZnJlcSA9IGF1MXh4eF9jYWxjX2Nsb2NrKCk7CisJZXN0X2ZyZXEgKz0gNTAwMDsgICAgLyogcm91bmQgKi8KKwllc3RfZnJlcSAtPSBlc3RfZnJlcSAlIDEwMDAwOworCXByaW50ayhLRVJOX0lORk8gIihQUklkICUwOHgpIEAgJWx1LiUwMmx1IE1IelxuIiwgcmVhZF9jMF9wcmlkKCksCisJICAgICAgIGVzdF9mcmVxIC8gMTAwMDAwMCwgKChlc3RfZnJlcSAlIDEwMDAwMDApICogMTAwKSAvIDEwMDAwMDApOworCisJX21hY2hpbmVfcmVzdGFydCA9IGF1MTAwMF9yZXN0YXJ0OworCV9tYWNoaW5lX2hhbHQgPSBhdTEwMDBfaGFsdDsKKwlwbV9wb3dlcl9vZmYgPSBhdTEwMDBfcG93ZXJfb2ZmOwogCiAJYm9hcmRfc2V0dXAoKTsgIC8qIGJvYXJkIHNwZWNpZmljIHNldHVwICovCiAKLQlwcmlkID0gcmVhZF9jMF9wcmlkKCk7Ci0JaWYgKHNwLT5jcHVfcGxsX3dvKQotI2lmZGVmIENPTkZJR19TT0NfQVUxMDAwX0ZSRVFVRU5DWQotCQljcHVmcmVxID0gQ09ORklHX1NPQ19BVTEwMDBfRlJFUVVFTkNZIC8gMTAwMDAwMDsKLSNlbHNlCi0JCWNwdWZyZXEgPSAzOTY7Ci0jZW5kaWYKLQllbHNlCi0JCWNwdWZyZXEgPSAoYXVfcmVhZGwoU1lTX0NQVVBMTCkgJiAweDNGKSAqIDEyOwotCXByaW50ayhLRVJOX0lORk8gIihQUklEICUwOGx4KSBAICVsZCBNSHpcbiIsIHByaWQsIGNwdWZyZXEpOwotCi0JaWYgKHNwLT5jcHVfYmNsaykgewotCQkvKiBFbmFibGUgQkNMSyBzd2l0Y2hpbmcgKi8KLQkJYmNsayA9IGF1X3JlYWRsKFNZU19QT1dFUkNUUkwpOwotCQlhdV93cml0ZWwoYmNsayB8IDB4NjAsIFNZU19QT1dFUkNUUkwpOwotCQlwcmludGsoS0VSTl9JTkZPICJCQ0xLIHN3aXRjaGluZyBlbmFibGVkIVxuIik7Ci0JfQotCi0JaWYgKHNwLT5jcHVfb2QpCisJaWYgKGF1MXh4eF9jcHVfbmVlZHNfY29uZmlnX29kKCkpCiAJCS8qIFZhcmlvdXMgZWFybHkgQXUxeHgwIGVycmF0YSBjb3JyZWN0ZWQgYnkgdGhpcyAqLwogCQlzZXRfYzBfY29uZmlnKDEgPDwgMTkpOyAvKiBTZXQgQ29uZmlnW09EXSAqLwogCWVsc2UKIAkJLyogQ2xlYXIgdG8gb2J0YWluIGJlc3Qgc3lzdGVtIGJ1cyBwZXJmb3JtYW5jZSAqLwogCQljbGVhcl9jMF9jb25maWcoMSA8PCAxOSk7IC8qIENsZWFyIENvbmZpZ1tPRF0gKi8KIAotCWFyZ3B0ciA9IHByb21fZ2V0Y21kbGluZSgpOwotCi0jaWZkZWYgQ09ORklHX1NFUklBTF84MjUwX0NPTlNPTEUKLQlhcmdwdHIgPSBzdHJzdHIoYXJncHRyLCAiY29uc29sZT0iKTsKLQlpZiAoYXJncHRyID09IE5VTEwpIHsKLQkJYXJncHRyID0gcHJvbV9nZXRjbWRsaW5lKCk7Ci0JCXN0cmNhdChhcmdwdHIsICIgY29uc29sZT10dHlTMCwxMTUyMDAiKTsKLQl9Ci0jZW5kaWYKLQotI2lmZGVmIENPTkZJR19GQl9BVTExMDAKLQlhcmdwdHIgPSBzdHJzdHIoYXJncHRyLCAidmlkZW89Iik7Ci0JaWYgKGFyZ3B0ciA9PSBOVUxMKSB7Ci0JCWFyZ3B0ciA9IHByb21fZ2V0Y21kbGluZSgpOwotCQkvKiBkZWZhdWx0IHBhbmVsICovCi0JCS8qc3RyY2F0KGFyZ3B0ciwgIiB2aWRlbz1hdTExMDBmYjpwYW5lbDpTaGFycF8zMjB4MjQwXzE2Iik7Ki8KLQl9Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoQ09ORklHX1NPVU5EX0FVMVgwMCkgJiYgIWRlZmluZWQoQ09ORklHX1NPQ19BVTEwMDApCi0JLyogYXUxMDAwIGRvZXMgbm90IHN1cHBvcnQgdnJhLCBhdTE1MDAgYW5kIGF1MTEwMCBkbyAqLwotCXN0cmNhdChhcmdwdHIsICIgYXUxMDAwX2F1ZGlvPXZyYSIpOwotCWFyZ3B0ciA9IHByb21fZ2V0Y21kbGluZSgpOwotI2VuZGlmCi0JX21hY2hpbmVfcmVzdGFydCA9IGF1MTAwMF9yZXN0YXJ0OwotCV9tYWNoaW5lX2hhbHQgPSBhdTEwMDBfaGFsdDsKLQlwbV9wb3dlcl9vZmYgPSBhdTEwMDBfcG93ZXJfb2ZmOwotCiAJLyogSU8vTUVNIHJlc291cmNlcy4gKi8KIAlzZXRfaW9fcG9ydF9iYXNlKDApOwogCWlvcG9ydF9yZXNvdXJjZS5zdGFydCA9IElPUE9SVF9SRVNPVVJDRV9TVEFSVDsKIAlpb3BvcnRfcmVzb3VyY2UuZW5kID0gSU9QT1JUX1JFU09VUkNFX0VORDsKIAlpb21lbV9yZXNvdXJjZS5zdGFydCA9IElPTUVNX1JFU09VUkNFX1NUQVJUOwogCWlvbWVtX3Jlc291cmNlLmVuZCA9IElPTUVNX1JFU09VUkNFX0VORDsKLQotCXdoaWxlIChhdV9yZWFkbChTWVNfQ09VTlRFUl9DTlRSTCkgJiBTWVNfQ05UUkxfRTBTKTsKLQlhdV93cml0ZWwoU1lTX0NOVFJMX0UwIHwgU1lTX0NOVFJMX0VOMCwgU1lTX0NPVU5URVJfQ05UUkwpOwotCWF1X3N5bmMoKTsKLQl3aGlsZSAoYXVfcmVhZGwoU1lTX0NPVU5URVJfQ05UUkwpICYgU1lTX0NOVFJMX1QwUyk7Ci0JYXVfd3JpdGVsKDAsIFNZU19UT1lUUklNKTsKIH0KIAogI2lmIGRlZmluZWQoQ09ORklHXzY0QklUX1BIWVNfQUREUikKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9hbGNoZW15L2NvbW1vbi9zbGVlcGVyLlMgYi9hcmNoL21pcHMvYWxjaGVteS9jb21tb24vc2xlZXBlci5TCmluZGV4IDMwMDZlMjcuLjRmNGIxNjcgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9hbGNoZW15L2NvbW1vbi9zbGVlcGVyLlMKKysrIGIvYXJjaC9taXBzL2FsY2hlbXkvY29tbW9uL3NsZWVwZXIuUwpAQCAtMTUsMTYgKzE1LDE3IEBACiAjaW5jbHVkZSA8YXNtL3JlZ2RlZi5oPgogI2luY2x1ZGUgPGFzbS9zdGFja2ZyYW1lLmg+CiAKKwkuZXh0ZXJuIF9fZmx1c2hfY2FjaGVfYWxsCisKIAkudGV4dAotCS5zZXQJbWFjcm8KLQkuc2V0CW5vYXQKKwkuc2V0IG5vcmVvcmRlcgorCS5zZXQgbm9hdAogCS5hbGlnbgk1CiAKIC8qIFNhdmUgYWxsIG9mIHRoZSBwcm9jZXNzb3IgZ2VuZXJhbCByZWdpc3RlcnMgYW5kIGdvIHRvIHNsZWVwLgogICogQSB3YWtldXAgY29uZGl0aW9uIHdpbGwgZ2V0IHVzIGJhY2sgaGVyZSB0byByZXN0b3JlIHRoZSByZWdpc3RlcnMuCiAgKi8KLUxFQUYoc2F2ZV9hbmRfc2xlZXApCi0KK0xFQUYoYXUxeHh4X3NhdmVfYW5kX3NsZWVwKQogCXN1YnUJc3AsIFBUX1NJWkUKIAlzdwkkMSwgUFRfUjEoc3ApCiAJc3cJJDIsIFBUX1IyKHNwKQpAQCAtMzMsMTQgKzM0LDYgQEAKIAlzdwkkNSwgUFRfUjUoc3ApCiAJc3cJJDYsIFBUX1I2KHNwKQogCXN3CSQ3LCBQVF9SNyhzcCkKLQlzdwkkOCwgUFRfUjgoc3ApCi0Jc3cJJDksIFBUX1I5KHNwKQotCXN3CSQxMCwgUFRfUjEwKHNwKQotCXN3CSQxMSwgUFRfUjExKHNwKQotCXN3CSQxMiwgUFRfUjEyKHNwKQotCXN3CSQxMywgUFRfUjEzKHNwKQotCXN3CSQxNCwgUFRfUjE0KHNwKQotCXN3CSQxNSwgUFRfUjE1KHNwKQogCXN3CSQxNiwgUFRfUjE2KHNwKQogCXN3CSQxNywgUFRfUjE3KHNwKQogCXN3CSQxOCwgUFRfUjE4KHNwKQpAQCAtNDksMTIgKzQyLDkgQEAKIAlzdwkkMjEsIFBUX1IyMShzcCkKIAlzdwkkMjIsIFBUX1IyMihzcCkKIAlzdwkkMjMsIFBUX1IyMyhzcCkKLQlzdwkkMjQsIFBUX1IyNChzcCkKLQlzdwkkMjUsIFBUX1IyNShzcCkKIAlzdwkkMjYsIFBUX1IyNihzcCkKIAlzdwkkMjcsIFBUX1IyNyhzcCkKIAlzdwkkMjgsIFBUX1IyOChzcCkKLQlzdwkkMjksIFBUX1IyOShzcCkKIAlzdwkkMzAsIFBUX1IzMChzcCkKIAlzdwkkMzEsIFBUX1IzMShzcCkKIAltZmMwCWswLCBDUDBfU1RBVFVTCkBAIC02NiwyMCArNTYsMjYgQEAKIAltZmMwCWswLCBDUDBfQ09ORklHCiAJc3cJazAsIDB4MTQoc3ApCiAKKwkvKiBmbHVzaCBjYWNoZXMgdG8gbWFrZSBzdXJlIGNvbnRleHQgaXMgaW4gbWVtb3J5ICovCisJbGEJdDEsIF9fZmx1c2hfY2FjaGVfYWxsCisJbHcJdDAsIDAodDEpCisJamFscgl0MAorCSBub3AKKwogCS8qIE5vdyBzZXQgdXAgdGhlIHNjcmF0Y2ggcmVnaXN0ZXJzIHNvIHRoZSBib290IHJvbSB3aWxsCiAJICogcmV0dXJuIHRvIHRoaXMgcG9pbnQgdXBvbiB3YWtldXAuCisJICogc3lzX3NjcmF0Y2gwIDogU1AKKwkgKiBzeXNfc2NyYXRjaDEgOiBSQQogCSAqLwotCWxhCWswLCAxZgotCWx1aQlrMSwgMHhiMTkwCi0Jb3JpCWsxLCAweDE4Ci0Jc3cJc3AsIDAoazEpCi0Jb3JpIAlrMSwgMHgxYwotCXN3CWswLCAwKGsxKQorCWx1aQl0MywgMHhiMTkwCQkvKiBzeXNfeHh4ICovCisJc3cJc3AsIDB4MDAxOCh0MykKKwlsYQlrMCwgM2YJCQkvKiByZXN1bWUgcGF0aCAqLworCXN3CWswLCAweDAwMWModDMpCiAKLS8qIFB1dCBTRFJBTSBpbnRvIHNlbGYgcmVmcmVzaC4gIFByZWxvYWQgaW5zdHJ1Y3Rpb25zIGludG8gY2FjaGUsCi0gKiBpc3N1ZSBhIHByZWNoYXJnZSwgdGhlbiBhdXRvIHJlZnJlc2gsIHRoZW4gc2xlZXAgY29tbWFuZHMgdG8gaXQuCi0gKi8KLQlsYQl0MCwgc2RzbGVlcAorCS8qIFB1dCBTRFJBTSBpbnRvIHNlbGYgcmVmcmVzaDogIFByZWxvYWQgaW5zdHJ1Y3Rpb25zIGludG8gY2FjaGUsCisJICogaXNzdWUgYSBwcmVjaGFyZ2UsIGF1dG8vc2VsZiByZWZyZXNoLCB0aGVuIHNsZWVwIGNvbW1hbmRzIHRvIGl0LgorCSAqLworCWxhCXQwLCAxZgogCS5zZXQJbWlwczMKIAljYWNoZQkweDE0LCAwKHQwKQogCWNhY2hlCTB4MTQsIDMyKHQwKQpAQCAtODcsMjQgKzgzLDU3IEBACiAJY2FjaGUJMHgxNCwgOTYodDApCiAJLnNldAltaXBzMAogCi1zZHNsZWVwOgotCWx1aSAJazAsIDB4YjQwMAotCXN3CXplcm8sIDB4MDAxYyhrMCkJLyogUHJlY2hhcmdlICovCi0Jc3cJemVybywgMHgwMDIwKGswKQkvKiBBdXRvIHJlZnJlc2ggKi8KLQlzdwl6ZXJvLCAweDAwMzAoazApCS8qIFNEUkFNIHNsZWVwICovCisxOglsdWkgCWEwLCAweGI0MDAJCS8qIG1lbV94eHggKi8KKyNpZiBkZWZpbmVkKENPTkZJR19TT0NfQVUxMDAwKSB8fCBkZWZpbmVkKENPTkZJR19TT0NfQVUxMTAwKSB8fAlcCisgICAgZGVmaW5lZChDT05GSUdfU09DX0FVMTUwMCkKKwlzdwl6ZXJvLCAweDAwMWMoYTApIAkvKiBQcmVjaGFyZ2UgKi8KKwlzeW5jCisJc3cJemVybywgMHgwMDIwKGEwKQkvKiBBdXRvIFJlZnJlc2ggKi8KKwlzeW5jCisJc3cJemVybywgMHgwMDMwKGEwKSAgCS8qIFNsZWVwICovCisJc3luYworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19TT0NfQVUxNTUwKSB8fCBkZWZpbmVkKENPTkZJR19TT0NfQVUxMjAwKQorCXN3CXplcm8sIDB4MDhjMChhMCkgCS8qIFByZWNoYXJnZSAqLworCXN5bmMKKwlzdwl6ZXJvLCAweDA4ZDAoYTApCS8qIFNlbGYgUmVmcmVzaCAqLwogCXN5bmMKIAotCWx1aSAJazEsIDB4YjE5MAotCXN3CXplcm8sIDB4MDA3OChrMSkJLyogZ2V0IHJlYWR5ICB0byBzbGVlcCAqLworCS8qIHdhaXQgZm9yIHNkcmFtIHRvIGVudGVyIHNlbGYtcmVmcmVzaCBtb2RlICovCisJbHVpIAl0MCwgMHgwMTAwCisyOglsdyAJdDEsIDB4MDg1MChhMCkJCS8qIG1lbV9zZHN0YXQgKi8KKwlhbmQJdDIsIHQxLCB0MAorCWJlcQl0MiwgemVybywgMmIKKwkgbm9wCisKKwkvKiBkaXNhYmxlIFNEUkFNIGNsb2NrcyAqLworCWx1aQl0MCwgMHhjZmZmCisJb3JpCXQwLCB0MCwgMHhmZmZmCisJbHcgCXQxLCAweDA4NDAoYTApCQkvKiBtZW1fc2Rjb25maWdhICovCisJYW5kIAl0MSwgdDAsIHQxCQkvKiBjbGVhciBDRVsxOjBdICovCisJc3cgCXQxLCAweDA4NDAoYTApCQkvKiBtZW1fc2Rjb25maWdhICovCiAJc3luYwotCXN3CXplcm8sIDB4MDA3YyhrMSkJLyogUHV0IHByb2Nlc3NvciB0byBzbGVlcCAqLworI2VuZGlmCisKKwkvKiBwdXQgcG93ZXIgc3VwcGx5IGFuZCBwcm9jZXNzb3IgdG8gc2xlZXAgKi8KKwlzdwl6ZXJvLCAweDAwNzgodDMpCS8qIHN5c19zbHBwd3IgKi8KIAlzeW5jCisJc3cJemVybywgMHgwMDdjKHQzKQkvKiBzeXNfc2xlZXAgKi8KKwlzeW5jCisJbm9wCisJbm9wCisJbm9wCisJbm9wCisJbm9wCisJbm9wCisJbm9wCisJbm9wCiAKIAkvKiBUaGlzIGlzIHdoZXJlIHdlIHJldHVybiB1cG9uIHdha2V1cC4KIAkgKiBSZWxvYWQgYWxsIG9mIHRoZSByZWdpc3RlcnMgYW5kIHJldHVybi4KIAkgKi8KLTE6CW5vcAotCWx3CWswLCAweDIwKHNwKQorMzoJbHcJazAsIDB4MjAoc3ApCiAJbXRjMAlrMCwgQ1AwX1NUQVRVUwogCWx3CWswLCAweDFjKHNwKQogCW10YzAJazAsIENQMF9DT05URVhUCkBAIC0xMTMsMTAgKzE0MiwxMSBAQAogCWx3CWswLCAweDE0KHNwKQogCW10YzAJazAsIENQMF9DT05GSUcKIAotCS8qIFdlIG5lZWQgdG8gY2F0Y2ggdGhlIGVhbHJ5IEFsY2hlbXkgU09DcyB3aXRoCisJLyogV2UgbmVlZCB0byBjYXRjaCB0aGUgZWFybHkgQWxjaGVteSBTT0NzIHdpdGgKIAkgKiB0aGUgd3JpdGUtb25seSBDb25maWdbT0RdIGJpdCBhbmQgc2V0IGl0IGJhY2sgdG8gb25lLi4uCiAJICovCiAJamFsCWF1MXgwMF9maXh1cF9jb25maWdfb2QKKwkgbm9wCiAJbHcJJDEsIFBUX1IxKHNwKQogCWx3CSQyLCBQVF9SMihzcCkKIAlsdwkkMywgUFRfUjMoc3ApCkBAIC0xMjQsMTQgKzE1NCw2IEBACiAJbHcJJDUsIFBUX1I1KHNwKQogCWx3CSQ2LCBQVF9SNihzcCkKIAlsdwkkNywgUFRfUjcoc3ApCi0JbHcJJDgsIFBUX1I4KHNwKQotCWx3CSQ5LCBQVF9SOShzcCkKLQlsdwkkMTAsIFBUX1IxMChzcCkKLQlsdwkkMTEsIFBUX1IxMShzcCkKLQlsdwkkMTIsIFBUX1IxMihzcCkKLQlsdwkkMTMsIFBUX1IxMyhzcCkKLQlsdwkkMTQsIFBUX1IxNChzcCkKLQlsdwkkMTUsIFBUX1IxNShzcCkKIAlsdwkkMTYsIFBUX1IxNihzcCkKIAlsdwkkMTcsIFBUX1IxNyhzcCkKIAlsdwkkMTgsIFBUX1IxOChzcCkKQEAgLTE0MCwxNSArMTYyLDExIEBACiAJbHcJJDIxLCBQVF9SMjEoc3ApCiAJbHcJJDIyLCBQVF9SMjIoc3ApCiAJbHcJJDIzLCBQVF9SMjMoc3ApCi0JbHcJJDI0LCBQVF9SMjQoc3ApCi0JbHcJJDI1LCBQVF9SMjUoc3ApCiAJbHcJJDI2LCBQVF9SMjYoc3ApCiAJbHcJJDI3LCBQVF9SMjcoc3ApCiAJbHcJJDI4LCBQVF9SMjgoc3ApCi0JbHcJJDI5LCBQVF9SMjkoc3ApCiAJbHcJJDMwLCBQVF9SMzAoc3ApCiAJbHcJJDMxLCBQVF9SMzEoc3ApCi0JYWRkaXUJc3AsIFBUX1NJWkUKLQogCWpyCXJhCi1FTkQoc2F2ZV9hbmRfc2xlZXApCisJIGFkZGl1CXNwLCBQVF9TSVpFCitFTkQoYXUxeHh4X3NhdmVfYW5kX3NsZWVwKQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2FsY2hlbXkvY29tbW9uL3RpbWUuYyBiL2FyY2gvbWlwcy9hbGNoZW15L2NvbW1vbi90aW1lLmMKaW5kZXggNTYzZDkzOS4uMzI4ODAxNCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2FsY2hlbXkvY29tbW9uL3RpbWUuYworKysgYi9hcmNoL21pcHMvYWxjaGVteS9jb21tb24vdGltZS5jCkBAIC0xLDUgKzEsNyBAQAogLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBNYW51ZWwgTGF1c3MgPG1hbm9Acm9hcmluZWxrLmhvbWVsaW51eC5uZXQ+CiAgKgorICogUHJldmlvdXMgaW5jYXJuYXRpb25zIHdlcmU6CiAgKiBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDYsIDIwMDggTW9udGFWaXN0YSBTb2Z0d2FyZSwgPHNvdXJjZUBtdmlzdGEuY29tPgogICogQ29waWVkIGFuZCBtb2RpZmllZCBDYXJzdGVuIExhbmdnYWFyZCdzIHRpbWUuYwogICoKQEAgLTIzLDI0NCArMjUsMTQxIEBACiAgKgogICogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgKgotICogU2V0dGluZyB1cCB0aGUgY2xvY2sgb24gdGhlIE1JUFMgYm9hcmRzLgotICoKLSAqIFdlIHByb3ZpZGUgdGhlIGNsb2NrIGludGVycnVwdCBwcm9jZXNzaW5nIGFuZCB0aGUgdGltZXIgb2Zmc2V0IGNvbXB1dGUKLSAqIGZ1bmN0aW9ucy4gIElmIENPTkZJR19QTSBpcyBzZWxlY3RlZCwgd2UgYWxzbyBlbnN1cmUgdGhlIDMyS0h6IHRpbWVyIGlzCi0gKiBhdmFpbGFibGUuICAtLSBEYW4KKyAqIENsb2Nrc291cmNlL2V2ZW50IHVzaW5nIHRoZSAzMi43NjhrSHotY2xvY2tlZCBDb3VudGVyMSAoJ1JUQycgaW4gdGhlCisgKiBkYXRhYm9va3MpLiAgRmlybXdhcmUvQm9hcmQgaW5pdCBjb2RlIG11c3QgZW5hYmxlIHRoZSBjb3VudGVycyBpbiB0aGUKKyAqIGNvdW50ZXIgY29udHJvbCByZWdpc3Rlciwgb3RoZXJ3aXNlIHRoZSBDUDAgY291bnRlciBjbG9ja3NvdXJjZS9ldmVudAorICogd2lsbCBiZSBpbnN0YWxsZWQgaW5zdGVhZCAoYW5kIHVzZSBvZiAnd2FpdCcgaW5zdHJ1Y3Rpb24gaXMgcHJvaGliaXRlZCkuCiAgKi8KIAotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsb2NrY2hpcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9jbG9ja3NvdXJjZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAKLSNpbmNsdWRlIDxhc20vbWlwc3JlZ3MuaD4KICNpbmNsdWRlIDxhc20vdGltZS5oPgogI2luY2x1ZGUgPGFzbS9tYWNoLWF1MXgwMC9hdTEwMDAuaD4KIAotc3RhdGljIGludCBub19hdTF4eHhfMzJraHo7CisvKiAzMmtIeiBjbG9jayBlbmFibGVkIGFuZCBkZXRlY3RlZCAqLworI2RlZmluZSBDTlRSX09LIChTWVNfQ05UUkxfRTAgfCBTWVNfQ05UUkxfMzJTKQorCiBleHRlcm4gaW50IGFsbG93X2F1MWtfd2FpdDsgLyogZGVmYXVsdCBvZmYgZm9yIENQMCBDb3VudGVyICovCiAKLSNpZmRlZiBDT05GSUdfUE0KLSNpZiBIWiA8IDEwMCB8fCBIWiA+IDEwMDAKLSNlcnJvciAidW5zdXBwb3J0ZWQgSFogdmFsdWUhIE11c3QgYmUgaW4gWzEwMCwxMDAwXSIKLSNlbmRpZgotI2RlZmluZSBNQVRDSDIwX0lOQyAoMzI4ICogMTAwIC8gSFopIC8qIG1hZ2ljIG51bWJlciAzMjggaXMgZm9yIEhaPTEwMC4uLiAqLwotc3RhdGljIHVuc2lnbmVkIGxvbmcgbGFzdF9wYzAsIGxhc3RfbWF0Y2gyMDsKLSNlbmRpZgotCi1zdGF0aWMgREVGSU5FX1NQSU5MT0NLKHRpbWVfbG9jayk7Ci0KLXVuc2lnbmVkIGxvbmcgd3RpbWVyOwotCi0jaWZkZWYgQ09ORklHX1BNCi1zdGF0aWMgaXJxcmV0dXJuX3QgY291bnRlcjBfaXJxKGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3N0YXRpYyBjeWNsZV90IGF1MXhfY291bnRlcjFfcmVhZCh2b2lkKQogewotCXVuc2lnbmVkIGxvbmcgcGMwOwotCWludCB0aW1lX2VsYXBzZWQ7Ci0Jc3RhdGljIGludCBqaWZmaWVfZHJpZnQ7CisJcmV0dXJuIGF1X3JlYWRsKFNZU19SVENSRUFEKTsKK30KIAotCWlmIChhdV9yZWFkbChTWVNfQ09VTlRFUl9DTlRSTCkgJiBTWVNfQ05UUkxfTTIwKSB7Ci0JCS8qIHNob3VsZCBuZXZlciBoYXBwZW4hICovCi0JCXByaW50ayhLRVJOX1dBUk5JTkcgImNvdW50ZXIgMCB3IHN0YXR1cyBlcnJvclxuIik7Ci0JCXJldHVybiBJUlFfTk9ORTsKLQl9CitzdGF0aWMgc3RydWN0IGNsb2Nrc291cmNlIGF1MXhfY291bnRlcjFfY2xvY2tzb3VyY2UgPSB7CisJLm5hbWUJCT0gImFsY2hlbXktY291bnRlcjEiLAorCS5yZWFkCQk9IGF1MXhfY291bnRlcjFfcmVhZCwKKwkubWFzawkJPSBDTE9DS1NPVVJDRV9NQVNLKDMyKSwKKwkuZmxhZ3MJCT0gQ0xPQ0tfU09VUkNFX0lTX0NPTlRJTlVPVVMsCisJLnJhdGluZwkJPSAxMDAsCit9OwogCi0JcGMwID0gYXVfcmVhZGwoU1lTX1RPWVJFQUQpOwotCWlmIChwYzAgPCBsYXN0X21hdGNoMjApCi0JCS8qIGNvdW50ZXIgb3ZlcmZsb3dlZCAqLwotCQl0aW1lX2VsYXBzZWQgPSAoMHhmZmZmZmZmZiAtIGxhc3RfbWF0Y2gyMCkgKyBwYzA7Ci0JZWxzZQotCQl0aW1lX2VsYXBzZWQgPSBwYzAgLSBsYXN0X21hdGNoMjA7Ci0KLQl3aGlsZSAodGltZV9lbGFwc2VkID4gMCkgewotCQlkb190aW1lcigxKTsKLSNpZm5kZWYgQ09ORklHX1NNUAotCQl1cGRhdGVfcHJvY2Vzc190aW1lcyh1c2VyX21vZGUoZ2V0X2lycV9yZWdzKCkpKTsKLSNlbmRpZgotCQl0aW1lX2VsYXBzZWQgLT0gTUFUQ0gyMF9JTkM7Ci0JCWxhc3RfbWF0Y2gyMCArPSBNQVRDSDIwX0lOQzsKLQkJamlmZmllX2RyaWZ0Kys7Ci0JfQotCi0JbGFzdF9wYzAgPSBwYzA7Ci0JYXVfd3JpdGVsKGxhc3RfbWF0Y2gyMCArIE1BVENIMjBfSU5DLCBTWVNfVE9ZTUFUQ0gyKTsKK3N0YXRpYyBpbnQgYXUxeF9ydGNtYXRjaDJfc2V0X25leHRfZXZlbnQodW5zaWduZWQgbG9uZyBkZWx0YSwKKwkJCQkJIHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmNkKQoreworCWRlbHRhICs9IGF1X3JlYWRsKFNZU19SVENSRUFEKTsKKwkvKiB3YWl0IGZvciByZWdpc3RlciBhY2Nlc3MgKi8KKwl3aGlsZSAoYXVfcmVhZGwoU1lTX0NPVU5URVJfQ05UUkwpICYgU1lTX0NOVFJMX00yMSkKKwkJOworCWF1X3dyaXRlbChkZWx0YSwgU1lTX1JUQ01BVENIMik7CiAJYXVfc3luYygpOwogCi0JLyoKLQkgKiBPdXIgY291bnRlciB0aWNrcyBhdCAxMC4wMDk3NjU2MjUgbXMvdGljaywgd2Ugd2UncmUgcnVubmluZwotCSAqIGFsbW9zdCAxMCB1UyB0b28gc2xvdyBwZXIgdGljay4KLQkgKi8KKwlyZXR1cm4gMDsKK30KIAotCWlmIChqaWZmaWVfZHJpZnQgPj0gOTk5KSB7Ci0JCWppZmZpZV9kcmlmdCAtPSA5OTk7Ci0JCWRvX3RpbWVyKDEpOyAvKiBpbmNyZW1lbnQgamlmZmllcyBieSBvbmUgKi8KLSNpZm5kZWYgQ09ORklHX1NNUAotCQl1cGRhdGVfcHJvY2Vzc190aW1lcyh1c2VyX21vZGUoZ2V0X2lycV9yZWdzKCkpKTsKLSNlbmRpZgotCX0KK3N0YXRpYyB2b2lkIGF1MXhfcnRjbWF0Y2gyX3NldF9tb2RlKGVudW0gY2xvY2tfZXZlbnRfbW9kZSBtb2RlLAorCQkJCSAgICBzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpjZCkKK3sKK30KIAorc3RhdGljIGlycXJldHVybl90IGF1MXhfcnRjbWF0Y2gyX2lycShpbnQgaXJxLCB2b2lkICpkZXZfaWQpCit7CisJc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqY2QgPSBkZXZfaWQ7CisJY2QtPmV2ZW50X2hhbmRsZXIoY2QpOwogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIAotc3RydWN0IGlycWFjdGlvbiBjb3VudGVyMF9hY3Rpb24gPSB7Ci0JLmhhbmRsZXIJPSBjb3VudGVyMF9pcnEsCi0JLmZsYWdzCQk9IElSUUZfRElTQUJMRUQsCi0JLm5hbWUJCT0gImFsY2hlbXktdG95IiwKLQkuZGV2X2lkCQk9IE5VTEwsCitzdGF0aWMgc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSBhdTF4X3J0Y21hdGNoMl9jbG9ja2RldiA9IHsKKwkubmFtZQkJPSAicnRjbWF0Y2gyIiwKKwkuZmVhdHVyZXMJPSBDTE9DS19FVlRfRkVBVF9PTkVTSE9ULAorCS5yYXRpbmcJCT0gMTAwLAorCS5pcnEJCT0gQVUxMDAwX1JUQ19NQVRDSDJfSU5ULAorCS5zZXRfbmV4dF9ldmVudAk9IGF1MXhfcnRjbWF0Y2gyX3NldF9uZXh0X2V2ZW50LAorCS5zZXRfbW9kZQk9IGF1MXhfcnRjbWF0Y2gyX3NldF9tb2RlLAorCS5jcHVtYXNrCT0gQ1BVX01BU0tfQUxMLAogfTsKIAotLyogV2hlbiB3ZSB3YWtldXAgZnJvbSBzbGVlcCwgd2UgaGF2ZSB0byAiY2F0Y2ggdXAiIG9uIGFsbCBvZiB0aGUKLSAqIHRpbWVyIHRpY2tzIHdlIGhhdmUgbWlzc2VkLgotICovCi12b2lkIHdha2V1cF9jb3VudGVyMF9hZGp1c3Qodm9pZCkKLXsKLQl1bnNpZ25lZCBsb25nIHBjMDsKLQlpbnQgdGltZV9lbGFwc2VkOwotCi0JcGMwID0gYXVfcmVhZGwoU1lTX1RPWVJFQUQpOwotCWlmIChwYzAgPCBsYXN0X21hdGNoMjApCi0JCS8qIGNvdW50ZXIgb3ZlcmZsb3dlZCAqLwotCQl0aW1lX2VsYXBzZWQgPSAoMHhmZmZmZmZmZiAtIGxhc3RfbWF0Y2gyMCkgKyBwYzA7Ci0JZWxzZQotCQl0aW1lX2VsYXBzZWQgPSBwYzAgLSBsYXN0X21hdGNoMjA7Ci0KLQl3aGlsZSAodGltZV9lbGFwc2VkID4gMCkgewotCQl0aW1lX2VsYXBzZWQgLT0gTUFUQ0gyMF9JTkM7Ci0JCWxhc3RfbWF0Y2gyMCArPSBNQVRDSDIwX0lOQzsKLQl9Ci0KLQlsYXN0X3BjMCA9IHBjMDsKLQlhdV93cml0ZWwobGFzdF9tYXRjaDIwICsgTUFUQ0gyMF9JTkMsIFNZU19UT1lNQVRDSDIpOwotCWF1X3N5bmMoKTsKLQotfQotCi0vKiBUaGlzIGlzIGp1c3QgZm9yIGRlYnVnZ2luZyB0byBzZXQgdGhlIHRpbWVyIGZvciBhIHNsZWVwIGRlbGF5LiAqLwotdm9pZCB3YWtldXBfY291bnRlcjBfc2V0KGludCB0aWNrcykKLXsKLQl1bnNpZ25lZCBsb25nIHBjMDsKLQotCXBjMCA9IGF1X3JlYWRsKFNZU19UT1lSRUFEKTsKLQlsYXN0X3BjMCA9IHBjMDsKLQlhdV93cml0ZWwobGFzdF9tYXRjaDIwICsgKE1BVENIMjBfSU5DICogdGlja3MpLCBTWVNfVE9ZTUFUQ0gyKTsKLQlhdV9zeW5jKCk7Ci19Ci0jZW5kaWYKLQotLyoKLSAqIEkgaGF2ZW4ndCBmb3VuZCBhbnlvbmUgdGhhdCBkb2Vzbid0IHVzZSBhIDEyIE1IeiBzb3VyY2UgY2xvY2ssCi0gKiBidXQganVzdCBpbiBjYXNlLi4uLi4KLSAqLwotI2RlZmluZSBBVTEwMDBfU1JDX0NMSwkxMjAwMDAwMAotCi0vKgotICogV2UgcmVhZCB0aGUgcmVhbCBwcm9jZXNzb3Igc3BlZWQgZnJvbSB0aGUgUExMLiAgVGhpcyBpcyBpbXBvcnRhbnQKLSAqIGJlY2F1c2UgaXQgaXMgbW9yZSBhY2N1cmF0ZSB0aGFuIGNvbXB1dGluZyBpdCBmcm9tIHRoZSAzMiBLSHoKLSAqIGNvdW50ZXIsIGlmIGl0IGV4aXN0cy4gIElmIHdlIGRvbid0IGhhdmUgYW4gYWNjdXJhdGUgcHJvY2Vzc29yCi0gKiBzcGVlZCwgYWxsIG9mIHRoZSBwZXJpcGhlcmFscyB0aGF0IGRlcml2ZSB0aGVpciBjbG9ja3MgYmFzZWQgb24KLSAqIHRoaXMgYWR2ZXJ0aXNlZCBzcGVlZCB3aWxsIGludHJvZHVjZSBlcnJvciBhbmQgc29tZXRpbWVzIG5vdCB3b3JrCi0gKiBwcm9wZXJseS4gIFRoaXMgZnVuY3Rpb24gaXMgZnV0aGVyIGNvbnZvbHV0ZWQgdG8gc3RpbGwgYWxsb3cgY29uZmlndXJhdGlvbnMKLSAqIHRvIGRvIHRoYXQgaW4gY2FzZSB0aGV5IGhhdmUgcmVhbGx5LCByZWFsbHkgb2xkIHNpbGljb24gd2l0aCBhCi0gKiB3cml0ZS1vbmx5IFBMTCByZWdpc3RlciwgdGhhdCB3ZSBuZWVkIHRoZSAzMiBLSHogd2hlbiBwb3dlciBtYW5hZ2VtZW50Ci0gKiAid2FpdCIgaXMgZW5hYmxlZCwgYW5kIHdlIG5lZWQgdG8gZGV0ZWN0IGlmIHRoZSAzMiBLSHogaXNuJ3QgcHJlc2VudAotICogYnV0IHJlcXVlc3RlZC4uLi4uLmdvdCBpdD8gOi0pCQktLSBEYW4KLSAqLwotdW5zaWduZWQgbG9uZyBjYWxjX2Nsb2NrKHZvaWQpCi17Ci0JdW5zaWduZWQgbG9uZyBjcHVfc3BlZWQ7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1bnNpZ25lZCBsb25nIGNvdW50ZXI7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmdGltZV9sb2NrLCBmbGFncyk7Ci0KLQkvKiBQb3dlciBtYW5hZ2VtZW50IGNhcmVzIGlmIHdlIGRvbid0IGhhdmUgYSAzMiBLSHogY291bnRlci4gKi8KLQlub19hdTF4eHhfMzJraHogPSAwOwotCWNvdW50ZXIgPSBhdV9yZWFkbChTWVNfQ09VTlRFUl9DTlRSTCk7Ci0JaWYgKGNvdW50ZXIgJiBTWVNfQ05UUkxfRTApIHsKLQkJaW50IHRyaW1fZGl2aWRlID0gMTY7Ci0KLQkJYXVfd3JpdGVsKGNvdW50ZXIgfCBTWVNfQ05UUkxfRU4xLCBTWVNfQ09VTlRFUl9DTlRSTCk7Ci0KLQkJd2hpbGUgKGF1X3JlYWRsKFNZU19DT1VOVEVSX0NOVFJMKSAmIFNZU19DTlRSTF9UMVMpOwotCQkvKiBSVEMgbm93IHRpY2tzIGF0IDMyLjc2OC8xNiBrSHogKi8KLQkJYXVfd3JpdGVsKHRyaW1fZGl2aWRlIC0gMSwgU1lTX1JUQ1RSSU0pOwotCQl3aGlsZSAoYXVfcmVhZGwoU1lTX0NPVU5URVJfQ05UUkwpICYgU1lTX0NOVFJMX1QxUyk7Ci0KLQkJd2hpbGUgKGF1X3JlYWRsKFNZU19DT1VOVEVSX0NOVFJMKSAmIFNZU19DTlRSTF9DMVMpOwotCQlhdV93cml0ZWwoMCwgU1lTX1RPWVdSSVRFKTsKLQkJd2hpbGUgKGF1X3JlYWRsKFNZU19DT1VOVEVSX0NOVFJMKSAmIFNZU19DTlRSTF9DMVMpOwotCX0gZWxzZQotCQlub19hdTF4eHhfMzJraHogPSAxOwotCi0JLyoKLQkgKiBPbiBlYXJseSBBdTEwMDAsIHN5c19jcHVwbGwgd2FzIHdyaXRlLW9ubHkuIFNpbmNlIHRoZXNlCi0JICogc2lsaWNvbiB2ZXJzaW9ucyBvZiBBdTEwMDAgYXJlIG5vdCBzb2xkIGJ5IEFNRCwgd2UgZG9uJ3QgYmVuZAotCSAqIG92ZXIgYmFja3dhcmRzIHRyeWluZyB0byBkZXRlcm1pbmUgdGhlIGZyZXF1ZW5jeS4KLQkgKi8KLQlpZiAoY3VyX2NwdV9zcGVjWzBdLT5jcHVfcGxsX3dvKQotI2lmZGVmIENPTkZJR19TT0NfQVUxMDAwX0ZSRVFVRU5DWQotCQljcHVfc3BlZWQgPSBDT05GSUdfU09DX0FVMTAwMF9GUkVRVUVOQ1k7Ci0jZWxzZQotCQljcHVfc3BlZWQgPSAzOTYwMDAwMDA7Ci0jZW5kaWYKLQllbHNlCi0JCWNwdV9zcGVlZCA9IChhdV9yZWFkbChTWVNfQ1BVUExMKSAmIDB4MDAwMDAwM2YpICogQVUxMDAwX1NSQ19DTEs7Ci0JLyogT24gQWxjaGVteSBDUFU6Y291bnRlciByYXRpbyBpcyAxOjEgKi8KLQltaXBzX2hwdF9mcmVxdWVuY3kgPSBjcHVfc3BlZWQ7Ci0JLyogRXF1YXRpb246IEJhdWRyYXRlID0gQ1BVIC8gKFNEICogMiAqIENMS0RJViAqIDE2KSAqLwotCXNldF9hdTF4MDBfdWFydF9iYXVkX2Jhc2UoY3B1X3NwZWVkIC8gKDIgKiAoKGludCkoYXVfcmVhZGwoU1lTX1BPV0VSQ1RSTCkKLQkJCQkJCQkgICYgMHgwMykgKyAyKSAqIDE2KSk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdGltZV9sb2NrLCBmbGFncyk7Ci0JcmV0dXJuIGNwdV9zcGVlZDsKLX0KK3N0YXRpYyBzdHJ1Y3QgaXJxYWN0aW9uIGF1MXhfcnRjbWF0Y2gyX2lycWFjdGlvbiA9IHsKKwkuaGFuZGxlcgk9IGF1MXhfcnRjbWF0Y2gyX2lycSwKKwkuZmxhZ3MJCT0gSVJRRl9ESVNBQkxFRCB8IElSUUZfVElNRVIsCisJLm5hbWUJCT0gInRpbWVyIiwKKwkuZGV2X2lkCQk9ICZhdTF4X3J0Y21hdGNoMl9jbG9ja2RldiwKK307CiAKIHZvaWQgX19pbml0IHBsYXRfdGltZV9pbml0KHZvaWQpCiB7Ci0JdW5zaWduZWQgaW50IGVzdF9mcmVxID0gY2FsY19jbG9jaygpOworCXN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmNkID0gJmF1MXhfcnRjbWF0Y2gyX2Nsb2NrZGV2OworCXVuc2lnbmVkIGxvbmcgdDsKIAotCWVzdF9mcmVxICs9IDUwMDA7ICAgIC8qIHJvdW5kICovCi0JZXN0X2ZyZXEgLT0gZXN0X2ZyZXElMTAwMDA7Ci0JcHJpbnRrKEtFUk5fSU5GTyAiQ1BVIGZyZXF1ZW5jeSAldS4lMDJ1IE1IelxuIiwKLQkgICAgICAgZXN0X2ZyZXEgLyAxMDAwMDAwLCAoKGVzdF9mcmVxICUgMTAwMDAwMCkgKiAxMDApIC8gMTAwMDAwMCk7Ci0Jc2V0X2F1MXgwMF9zcGVlZChlc3RfZnJlcSk7Ci0Jc2V0X2F1MXgwMF9sY2RfY2xvY2soKTsgLyogcHJvZ3JhbSB0aGUgTENEIGNsb2NrICovCi0KLSNpZmRlZiBDT05GSUdfUE0KLQkvKgotCSAqIHNldHVwIGNvdW50ZXIgMCwgc2luY2UgaXQga2VlcHMgdGlja2luZyBhZnRlciBhCi0JICogJ3dhaXQnIGluc3RydWN0aW9uIGhhcyBiZWVuIGV4ZWN1dGVkLiBUaGUgQ1AwIHRpbWVyIGFuZAotCSAqIGNvdW50ZXIgMSBkbyBOT1QgY29udGludWUgcnVubmluZyBhZnRlciAnd2FpdCcKLQkgKgotCSAqIEl0J3MgdG9vIGVhcmx5IHRvIGNhbGwgcmVxdWVzdF9pcnEoKSBoZXJlLCBzbyB3ZSBoYW5kbGUKLQkgKiBjb3VudGVyIDAgaW50ZXJydXB0IGFzIGEgc3BlY2lhbCBpcnEgYW5kIGl0IGRvZXNuJ3Qgc2hvdwotCSAqIHVwIHVuZGVyIC9wcm9jL2ludGVycnVwdHMuCi0JICoKLQkgKiBDaGVjayB0byBlbnN1cmUgd2UgcmVhbGx5IGhhdmUgYSAzMiBLSHogb3NjaWxsYXRvciBiZWZvcmUKLQkgKiB3ZSBkbyB0aGlzLgorCS8qIENoZWNrIGlmIGZpcm13YXJlIChZQU1PTiwgLi4uKSBoYXMgZW5hYmxlZCAzMmtIeiBhbmQgY2xvY2sKKwkgKiBoYXMgYmVlbiBkZXRlY3RlZC4gIElmIHNvIGluc3RhbGwgdGhlIHJ0Y21hdGNoMiBjbG9ja3NvdXJjZSwKKwkgKiBvdGhlcndpc2UgZG9uJ3QgYm90aGVyLiAgTm90ZSB0aGF0IGJvdGggYml0cyBiZWluZyBzZXQgaXMgYnkKKwkgKiBubyBtZWFucyBhIGRlZmluaXRlIGd1YXJhbnRlZSB0aGF0IHRoZSBjb3VudGVycyBhY3R1YWxseSB3b3JrCisJICogKHRoZSAzMlMgYml0IHNlZW1zIHRvIGJlIHN0dWNrIHNldCB0byAxIG9uY2UgYSBzaW5nbGUgY2xvY2stCisJICogZWRnZSBpcyBkZXRlY3RlZCwgaGVuY2UgdGhlIHRpbWVvdXRzKS4KIAkgKi8KLQlpZiAobm9fYXUxeHh4XzMya2h6KQotCQlwcmludGsoS0VSTl9XQVJOSU5HICJXQVJOSU5HOiBubyAzMktIeiBjbG9jayBmb3VuZC5cbiIpOwotCWVsc2UgewotCQl3aGlsZSAoYXVfcmVhZGwoU1lTX0NPVU5URVJfQ05UUkwpICYgU1lTX0NOVFJMX0MwUyk7Ci0JCWF1X3dyaXRlbCgwLCBTWVNfVE9ZV1JJVEUpOwotCQl3aGlsZSAoYXVfcmVhZGwoU1lTX0NPVU5URVJfQ05UUkwpICYgU1lTX0NOVFJMX0MwUyk7CisJaWYgKENOVFJfT0sgIT0gKGF1X3JlYWRsKFNZU19DT1VOVEVSX0NOVFJMKSAmIENOVFJfT0spKQorCQlnb3RvIGNudHJfZXJyOwogCi0JCWF1X3dyaXRlbChhdV9yZWFkbChTWVNfV0FLRU1TSykgfCAoMSA8PCA4KSwgU1lTX1dBS0VNU0spOwotCQlhdV93cml0ZWwofjAsIFNZU19XQUtFU1JDKTsKLQkJYXVfc3luYygpOwotCQl3aGlsZSAoYXVfcmVhZGwoU1lTX0NPVU5URVJfQ05UUkwpICYgU1lTX0NOVFJMX00yMCk7CisJLyoKKwkgKiBzZXR1cCBjb3VudGVyIDEgKFJUQykgdG8gdGljayBhdCBmdWxsIHNwZWVkCisJICovCisJdCA9IDB4ZmZmZmZmOworCXdoaWxlICgoYXVfcmVhZGwoU1lTX0NPVU5URVJfQ05UUkwpICYgU1lTX0NOVFJMX1QxUykgJiYgdC0tKQorCQlhc20gdm9sYXRpbGUgKCJub3AiKTsKKwlpZiAoIXQpCisJCWdvdG8gY250cl9lcnI7CiAKLQkJLyogU2V0dXAgbWF0Y2gyMCB0byBpbnRlcnJ1cHQgb25jZSBldmVyeSBIWiAqLwotCQlsYXN0X3BjMCA9IGxhc3RfbWF0Y2gyMCA9IGF1X3JlYWRsKFNZU19UT1lSRUFEKTsKLQkJYXVfd3JpdGVsKGxhc3RfbWF0Y2gyMCArIE1BVENIMjBfSU5DLCBTWVNfVE9ZTUFUQ0gyKTsKLQkJYXVfc3luYygpOwotCQl3aGlsZSAoYXVfcmVhZGwoU1lTX0NPVU5URVJfQ05UUkwpICYgU1lTX0NOVFJMX00yMCk7Ci0JCXNldHVwX2lycShBVTEwMDBfVE9ZX01BVENIMl9JTlQsICZjb3VudGVyMF9hY3Rpb24pOworCWF1X3dyaXRlbCgwLCBTWVNfUlRDVFJJTSk7CS8qIDMyLjc2OCBrSHogKi8KKwlhdV9zeW5jKCk7CiAKLQkJLyogV2UgY2FuIHVzZSB0aGUgcmVhbCAnd2FpdCcgaW5zdHJ1Y3Rpb24uICovCi0JCWFsbG93X2F1MWtfd2FpdCA9IDE7Ci0JfQorCXQgPSAweGZmZmZmZjsKKwl3aGlsZSAoKGF1X3JlYWRsKFNZU19DT1VOVEVSX0NOVFJMKSAmIFNZU19DTlRSTF9DMVMpICYmIHQtLSkKKwkJYXNtIHZvbGF0aWxlICgibm9wIik7CisJaWYgKCF0KQorCQlnb3RvIGNudHJfZXJyOworCWF1X3dyaXRlbCgwLCBTWVNfUlRDV1JJVEUpOworCWF1X3N5bmMoKTsKIAotI2VuZGlmCisJdCA9IDB4ZmZmZmZmOworCXdoaWxlICgoYXVfcmVhZGwoU1lTX0NPVU5URVJfQ05UUkwpICYgU1lTX0NOVFJMX0MxUykgJiYgdC0tKQorCQlhc20gdm9sYXRpbGUgKCJub3AiKTsKKwlpZiAoIXQpCisJCWdvdG8gY250cl9lcnI7CisKKwkvKiByZWdpc3RlciBjb3VudGVyMSBjbG9ja3NvdXJjZSBhbmQgZXZlbnQgZGV2aWNlICovCisJY2xvY2tzb3VyY2Vfc2V0X2Nsb2NrKCZhdTF4X2NvdW50ZXIxX2Nsb2Nrc291cmNlLCAzMjc2OCk7CisJY2xvY2tzb3VyY2VfcmVnaXN0ZXIoJmF1MXhfY291bnRlcjFfY2xvY2tzb3VyY2UpOworCisJY2QtPnNoaWZ0ID0gMzI7CisJY2QtPm11bHQgPSBkaXZfc2MoMzI3NjgsIE5TRUNfUEVSX1NFQywgY2QtPnNoaWZ0KTsKKwljZC0+bWF4X2RlbHRhX25zID0gY2xvY2tldmVudF9kZWx0YTJucygweGZmZmZmZmZmLCBjZCk7CisJY2QtPm1pbl9kZWx0YV9ucyA9IGNsb2NrZXZlbnRfZGVsdGEybnMoOCwgY2QpOwkvKiB+MC4yNW1zICovCisJY2xvY2tldmVudHNfcmVnaXN0ZXJfZGV2aWNlKGNkKTsKKwlzZXR1cF9pcnEoQVUxMDAwX1JUQ19NQVRDSDJfSU5ULCAmYXUxeF9ydGNtYXRjaDJfaXJxYWN0aW9uKTsKKworCXByaW50ayhLRVJOX0lORk8gIkFsY2hlbXkgY2xvY2tzb3VyY2UgaW5zdGFsbGVkXG4iKTsKKworCS8qIGNhbiBub3cgdXNlICd3YWl0JyAqLworCWFsbG93X2F1MWtfd2FpdCA9IDE7CisJcmV0dXJuOworCitjbnRyX2VycjoKKwkvKiBjb3VudGVycyB1bnVzYWJsZSwgdXNlIEMwIGNvdW50ZXIgKi8KKwlyNGtfY2xvY2tldmVudF9pbml0KCk7CisJaW5pdF9yNGtfY2xvY2tzb3VyY2UoKTsKKwlhbGxvd19hdTFrX3dhaXQgPSAwOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2FsY2hlbXkvZGIxeDAwL01ha2VmaWxlIGIvYXJjaC9taXBzL2FsY2hlbXkvZGIxeDAwL01ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzRkYjNiLi4wMDAwMDAwCi0tLSBhL2FyY2gvbWlwcy9hbGNoZW15L2RiMXgwMC9NYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotIwotIyAgQ29weXJpZ2h0IDIwMDAsIDIwMDggTW9udGFWaXN0YSBTb2Z0d2FyZSBJbmMuCi0jICBBdXRob3I6IE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4gPHNvdXJjZUBtdmlzdGEuY29tPgotIwotIyBNYWtlZmlsZSBmb3IgdGhlIEFsY2hlbXkgU2VtaWNvbmR1Y3RvciBEQkF1MXh4MCBib2FyZHMuCi0jCi0KLWxpYi15IDo9IGluaXQubyBib2FyZF9zZXR1cC5vIGlycW1hcC5vCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvYWxjaGVteS9kYjF4MDAvYm9hcmRfc2V0dXAuYyBiL2FyY2gvbWlwcy9hbGNoZW15L2RiMXgwMC9ib2FyZF9zZXR1cC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTVjY2JiLi4wMDAwMDAwCi0tLSBhL2FyY2gvbWlwcy9hbGNoZW15L2RiMXgwMC9ib2FyZF9zZXR1cC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLS8qCi0gKgotICogQlJJRUYgTU9EVUxFIERFU0NSSVBUSU9OCi0gKglBbGNoZW15IERiMXgwMCBib2FyZCBzZXR1cC4KLSAqCi0gKiBDb3B5cmlnaHQgMjAwMCwgMjAwOCBNb250YVZpc3RhIFNvZnR3YXJlIEluYy4KLSAqIEF1dGhvcjogTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLiA8c291cmNlQG12aXN0YS5jb20+Ci0gKgotICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAotICogIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQotICogIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgotICogIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogIFRISVMgIFNPRlRXQVJFICBJUyBQUk9WSURFRCAgIGBgQVMgIElTJycgQU5EICAgQU5ZICBFWFBSRVNTIE9SIElNUExJRUQKLSAqICBXQVJSQU5USUVTLCAgIElOQ0xVRElORywgQlVUIE5PVCAgTElNSVRFRCAgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqICBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4KLSAqICBOTyAgRVZFTlQgIFNIQUxMICAgVEhFIEFVVEhPUiAgQkUgICAgTElBQkxFIEZPUiBBTlkgICBESVJFQ1QsIElORElSRUNULAotICogIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogIE5PVCBMSU1JVEVEICAgVE8sIFBST0NVUkVNRU5UIE9GICBTVUJTVElUVVRFIEdPT0RTICBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogIFVTRSwgREFUQSwgIE9SIFBST0ZJVFM7IE9SICBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTgotICogIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOICBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgotICogIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotICogIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlICB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICogIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0KLSNpbmNsdWRlIDxhc20vbWFjaC1hdTF4MDAvYXUxMDAwLmg+Ci0jaW5jbHVkZSA8YXNtL21hY2gtZGIxeDAwL2RiMXgwMC5oPgotCi1zdGF0aWMgQkNTUiAqIGNvbnN0IGJjc3IgPSAoQkNTUiAqKUJDU1JfS1NFRzFfQUREUjsKLQotdm9pZCBib2FyZF9yZXNldCh2b2lkKQotewotCS8qIEhpdCBCQ1NSLlNXX1JFU0VUW1JFU0VUXSAqLwotCWJjc3ItPnN3cmVzZXQgPSAweDAwMDA7Ci19Ci0KLXZvaWQgX19pbml0IGJvYXJkX3NldHVwKHZvaWQpCi17Ci0JdTMyIHBpbl9mdW5jID0gMDsKLQotCS8qIE5vdCB2YWxpZCBmb3IgQXUxNTUwICovCi0jaWYgZGVmaW5lZChDT05GSUdfSVJEQSkgJiYgXAotICAgKGRlZmluZWQoQ09ORklHX1NPQ19BVTEwMDApIHx8IGRlZmluZWQoQ09ORklHX1NPQ19BVTExMDApKQotCS8qIFNldCBJUkZJUlNFTCBpbnN0ZWFkIG9mIEdQSU8xNSAqLwotCXBpbl9mdW5jID0gYXVfcmVhZGwoU1lTX1BJTkZVTkMpIHwgU1lTX1BGX0lSRjsKLQlhdV93cml0ZWwocGluX2Z1bmMsIFNZU19QSU5GVU5DKTsKLQkvKiBQb3dlciBvZmYgdW50aWwgdGhlIGRyaXZlciBpcyBpbiB1c2UgKi8KLQliY3NyLT5yZXNldHMgJj0gfkJDU1JfUkVTRVRTX0lSREFfTU9ERV9NQVNLOwotCWJjc3ItPnJlc2V0cyB8PSAgQkNTUl9SRVNFVFNfSVJEQV9NT0RFX09GRjsKLQlhdV9zeW5jKCk7Ci0jZW5kaWYKLQliY3NyLT5wY21jaWEgPSAweDAwMDA7IC8qIHR1cm4gb2ZmIFBDTUNJQSBwb3dlciAqLwotCi0jaWZkZWYgQ09ORklHX01JUFNfTUlSQUdFCi0JLyogRW5hYmxlIEdQSU9bMzE6MF0gaW5wdXRzICovCi0JYXVfd3JpdGVsKDAsIFNZU19QSU5JTlBVVEVOKTsKLQotCS8qIEdQSU9bMjBdIGlzIG91dHB1dCwgdHJpc3RhdGUgdGhlIG90aGVyIGlucHV0IHByaW1hcnkgR1BJT3MgKi8KLQlhdV93cml0ZWwofigxIDw8IDIwKSwgU1lTX1RSSU9VVENMUik7Ci0KLQkvKiBTZXQgR1BJT1syMTA6MjA4XSBpbnN0ZWFkIG9mIFNTSV8wICovCi0JcGluX2Z1bmMgPSBhdV9yZWFkbChTWVNfUElORlVOQykgfCBTWVNfUEZfUzA7Ci0KLQkvKiBTZXQgR1BJT1syMTU6MjExXSBmb3IgTEVEcyAqLwotCXBpbl9mdW5jIHw9IDUgPDwgMjsKLQotCS8qIFNldCBHUElPWzIxNDoyMTNdIGZvciBtb3JlIExFRHMgKi8KLQlwaW5fZnVuYyB8PSA1IDw8IDEyOwotCi0JLyogU2V0IEdQSU9bMjA3OjIwMF0gaW5zdGVhZCBvZiBQQ01DSUEvTENEICovCi0JcGluX2Z1bmMgfD0gU1lTX1BGX0xDRCB8IFNZU19QRl9QQzsKLQlhdV93cml0ZWwocGluX2Z1bmMsIFNZU19QSU5GVU5DKTsKLQotCS8qCi0JICogRW5hYmxlIHNwZWFrZXIgYW1wbGlmaWVyLiAgVGhpcyBzaG91bGQKLQkgKiBiZSBwYXJ0IG9mIHRoZSBhdWRpbyBkcml2ZXIuCi0JICovCi0JYXVfd3JpdGVsKGF1X3JlYWRsKEdQSU8yX0RJUikgfCAweDIwMCwgR1BJTzJfRElSKTsKLQlhdV93cml0ZWwoMHgwMjAwMDIwMCwgR1BJTzJfT1VUUFVUKTsKLSNlbmRpZgotCi0JYXVfc3luYygpOwotCi0jaWZkZWYgQ09ORklHX01JUFNfREIxMDAwCi0JcHJpbnRrKEtFUk5fSU5GTyAiQU1EIEFsY2hlbXkgQXUxMDAwL0RiMTAwMCBCb2FyZFxuIik7Ci0jZW5kaWYKLSNpZmRlZiBDT05GSUdfTUlQU19EQjE1MDAKLQlwcmludGsoS0VSTl9JTkZPICJBTUQgQWxjaGVteSBBdTE1MDAvRGIxNTAwIEJvYXJkXG4iKTsKLSNlbmRpZgotI2lmZGVmIENPTkZJR19NSVBTX0RCMTEwMAotCXByaW50ayhLRVJOX0lORk8gIkFNRCBBbGNoZW15IEF1MTEwMC9EYjExMDAgQm9hcmRcbiIpOwotI2VuZGlmCi0jaWZkZWYgQ09ORklHX01JUFNfQk9TUE9SVVMKLQlwcmludGsoS0VSTl9JTkZPICJBTUQgQWxjaGVteSBCb3Nwb3J1cyBCb2FyZFxuIik7Ci0jZW5kaWYKLSNpZmRlZiBDT05GSUdfTUlQU19NSVJBR0UKLQlwcmludGsoS0VSTl9JTkZPICJBTUQgQWxjaGVteSBNaXJhZ2UgQm9hcmRcbiIpOwotI2VuZGlmCi0jaWZkZWYgQ09ORklHX01JUFNfREIxNTUwCi0JcHJpbnRrKEtFUk5fSU5GTyAiQU1EIEFsY2hlbXkgQXUxNTUwL0RiMTU1MCBCb2FyZFxuIik7Ci0jZW5kaWYKLX0KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9hbGNoZW15L2RiMXgwMC9pbml0LmMgYi9hcmNoL21pcHMvYWxjaGVteS9kYjF4MDAvaW5pdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDc0MTM1Li4wMDAwMDAwCi0tLSBhL2FyY2gvbWlwcy9hbGNoZW15L2RiMXgwMC9pbml0LmMKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKgotICogQlJJRUYgTU9EVUxFIERFU0NSSVBUSU9OCi0gKglQQjEwMDAgYm9hcmQgc2V0dXAKLSAqCi0gKiBDb3B5cmlnaHQgMjAwMSwgMjAwOCBNb250YVZpc3RhIFNvZnR3YXJlIEluYy4KLSAqIEF1dGhvcjogTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLiA8c291cmNlQG12aXN0YS5jb20+Ci0gKgotICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAotICogIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQotICogIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgotICogIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogIFRISVMgIFNPRlRXQVJFICBJUyBQUk9WSURFRCAgIGBgQVMgIElTJycgQU5EICAgQU5ZICBFWFBSRVNTIE9SIElNUExJRUQKLSAqICBXQVJSQU5USUVTLCAgIElOQ0xVRElORywgQlVUIE5PVCAgTElNSVRFRCAgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqICBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4KLSAqICBOTyAgRVZFTlQgIFNIQUxMICAgVEhFIEFVVEhPUiAgQkUgICAgTElBQkxFIEZPUiBBTlkgICBESVJFQ1QsIElORElSRUNULAotICogIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogIE5PVCBMSU1JVEVEICAgVE8sIFBST0NVUkVNRU5UIE9GICBTVUJTVElUVVRFIEdPT0RTICBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogIFVTRSwgREFUQSwgIE9SIFBST0ZJVFM7IE9SICBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTgotICogIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOICBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgotICogIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotICogIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlICB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICogIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0KLSNpbmNsdWRlIDxhc20vYm9vdGluZm8uaD4KLQotI2luY2x1ZGUgPHByb20uaD4KLQotY29uc3QgY2hhciAqZ2V0X3N5c3RlbV90eXBlKHZvaWQpCi17Ci0jaWZkZWYgQ09ORklHX01JUFNfQk9TUE9SVVMKLQlyZXR1cm4gIkFsY2hlbXkgQm9zcG9ydXMgR2F0ZXdheSBSZWZlcmVuY2UiOwotI2Vsc2UKLQlyZXR1cm4gIkFsY2hlbXkgRGIxeDAwIjsKLSNlbmRpZgotfQotCi12b2lkIF9faW5pdCBwcm9tX2luaXQodm9pZCkKLXsKLQl1bnNpZ25lZCBjaGFyICptZW1zaXplX3N0cjsKLQl1bnNpZ25lZCBsb25nIG1lbXNpemU7Ci0KLQlwcm9tX2FyZ2MgPSBmd19hcmcwOwotCXByb21fYXJndiA9IChjaGFyICoqKWZ3X2FyZzE7Ci0JcHJvbV9lbnZwID0gKGNoYXIgKiopZndfYXJnMjsKLQotCXByb21faW5pdF9jbWRsaW5lKCk7Ci0KLQltZW1zaXplX3N0ciA9IHByb21fZ2V0ZW52KCJtZW1zaXplIik7Ci0JaWYgKCFtZW1zaXplX3N0cikKLQkJbWVtc2l6ZSA9IDB4MDQwMDAwMDA7Ci0JZWxzZQotCQlzdHJpY3Rfc3RydG9sKG1lbXNpemVfc3RyLCAwLCAmbWVtc2l6ZSk7Ci0JYWRkX21lbW9yeV9yZWdpb24oMCwgbWVtc2l6ZSwgQk9PVF9NRU1fUkFNKTsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9hbGNoZW15L2RiMXgwMC9pcnFtYXAuYyBiL2FyY2gvbWlwcy9hbGNoZW15L2RiMXgwMC9pcnFtYXAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTRjMDkwZS4uMDAwMDAwMAotLS0gYS9hcmNoL21pcHMvYWxjaGVteS9kYjF4MDAvaXJxbWFwLmMKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKgotICogQlJJRUYgTU9EVUxFIERFU0NSSVBUSU9OCi0gKglBdTF4eHggaXJxIG1hcCB0YWJsZQotICoKLSAqIENvcHlyaWdodCAyMDAzIEVtYmVkZGVkIEVkZ2UsIExMQwotICoJCWRhbkBlbWJlZGRlZGVkZ2UuY29tCi0gKgotICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZQkgaXQgYW5kL29yIG1vZGlmeSBpdAotICogIHVuZGVyICB0aGUgdGVybXMgb2YJIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQotICogIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlCUxpY2Vuc2UsIG9yIChhdCB5b3VyCi0gKiAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiAgVEhJUyAgU09GVFdBUkUgIElTIFBST1ZJREVECSAgYGBBUwlJUycnIEFORCAgIEFOWQlFWFBSRVNTIE9SIElNUExJRUQKLSAqICBXQVJSQU5USUVTLAkgIElOQ0xVRElORywgQlVUIE5PVCAgTElNSVRFRCAgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqICBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4KLSAqICBOTwlFVkVOVCAgU0hBTEwgICBUSEUgQVVUSE9SICBCRQkgTElBQkxFIEZPUiBBTlkJICBESVJFQ1QsIElORElSRUNULAotICogIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogIE5PVCBMSU1JVEVECSAgVE8sIFBST0NVUkVNRU5UIE9GICBTVUJTVElUVVRFIEdPT0RTCU9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiAgVVNFLCBEQVRBLAlPUiBQUk9GSVRTOyBPUglCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTgotICogIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCSBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgotICogIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotICogIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlICB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICogIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0KLSNpbmNsdWRlIDxhc20vbWFjaC1hdTF4MDAvYXUxMDAwLmg+Ci0KLSNpZmRlZiBDT05GSUdfTUlQU19EQjE1MDAKLWNoYXIgaXJxX3RhYl9hbGNoZW15W11bNV0gX19pbml0ZGF0YSA9IHsKLQlbMTJdID0geyAtMSwgSU5UQSwgSU5UWCwgSU5UWCwgSU5UWCB9LCAvKiBJRFNFTCAxMiAtIEhQVDM3MSAgICovCi0JWzEzXSA9IHsgLTEsIElOVEEsIElOVEIsIElOVEMsIElOVEQgfSwgLyogSURTRUwgMTMgLSBQQ0kgc2xvdCAqLwotfTsKLSNlbmRpZgotCi0jaWZkZWYgQ09ORklHX01JUFNfQk9TUE9SVVMKLWNoYXIgaXJxX3RhYl9hbGNoZW15W11bNV0gX19pbml0ZGF0YSA9IHsKLQlbMTFdID0geyAtMSwgSU5UQSwgSU5UQiwgSU5UWCwgSU5UWCB9LCAvKiBJRFNFTCAxMSAtIG1pbmlQQ0kgICovCi0JWzEyXSA9IHsgLTEsIElOVEEsIElOVFgsIElOVFgsIElOVFggfSwgLyogSURTRUwgMTIgLSBTTjE3NDEgICAqLwotCVsxM10gPSB7IC0xLCBJTlRBLCBJTlRCLCBJTlRDLCBJTlREIH0sIC8qIElEU0VMIDEzIC0gUENJIHNsb3QgKi8KLX07Ci0jZW5kaWYKLQotI2lmZGVmIENPTkZJR19NSVBTX01JUkFHRQotY2hhciBpcnFfdGFiX2FsY2hlbXlbXVs1XSBfX2luaXRkYXRhID0gewotCVsxMV0gPSB7IC0xLCBJTlRELCBJTlRYLCBJTlRYLCBJTlRYIH0sIC8qIElEU0VMIDExIC0gU01JIFZHWCAqLwotCVsxMl0gPSB7IC0xLCBJTlRYLCBJTlRYLCBJTlRDLCBJTlRYIH0sIC8qIElEU0VMIDEyIC0gUE5YMTMwMCAqLwotCVsxM10gPSB7IC0xLCBJTlRBLCBJTlRCLCBJTlRYLCBJTlRYIH0sIC8qIElEU0VMIDEzIC0gbWluaVBDSSAqLwotfTsKLSNlbmRpZgotCi0jaWZkZWYgQ09ORklHX01JUFNfREIxNTUwCi1jaGFyIGlycV90YWJfYWxjaGVteVtdWzVdIF9faW5pdGRhdGEgPSB7Ci0JWzExXSA9IHsgLTEsIElOVEMsIElOVFgsIElOVFgsIElOVFggfSwgLyogSURTRUwgMTEgLSBvbi1ib2FyZCBIUFQzNzEgKi8KLQlbMTJdID0geyAtMSwgSU5UQiwgSU5UQywgSU5URCwgSU5UQSB9LCAvKiBJRFNFTCAxMiAtIFBDSSBzbG90IDIgKGxlZnQpICovCi0JWzEzXSA9IHsgLTEsIElOVEEsIElOVEIsIElOVEMsIElOVEQgfSwgLyogSURTRUwgMTMgLSBQQ0kgc2xvdCAxIChyaWdodCkgKi8KLX07Ci0jZW5kaWYKLQotCi1zdHJ1Y3QgYXUxeHh4X2lycW1hcCBfX2luaXRkYXRhIGF1MXh4eF9pcnFfbWFwW10gPSB7Ci0KLSNpZm5kZWYgQ09ORklHX01JUFNfTUlSQUdFCi0jaWZkZWYgQ09ORklHX01JUFNfREIxNTUwCi0JeyBBVTEwMDBfR1BJT18zLCBJTlRDX0lOVF9MT1dfTEVWRUwsIDAgfSwgLyogUENNQ0lBIENhcmQgMCBJUlEjICovCi0JeyBBVTEwMDBfR1BJT181LCBJTlRDX0lOVF9MT1dfTEVWRUwsIDAgfSwgLyogUENNQ0lBIENhcmQgMSBJUlEjICovCi0jZWxzZQotCXsgQVUxMDAwX0dQSU9fMCwgSU5UQ19JTlRfTE9XX0xFVkVMLCAwIH0sIC8qIFBDTUNJQSBDYXJkIDAgRnVsbHlfSW50ZXJ0ZWQjICovCi0JeyBBVTEwMDBfR1BJT18xLCBJTlRDX0lOVF9MT1dfTEVWRUwsIDAgfSwgLyogUENNQ0lBIENhcmQgMCBTVFNDSEcjICovCi0JeyBBVTEwMDBfR1BJT18yLCBJTlRDX0lOVF9MT1dfTEVWRUwsIDAgfSwgLyogUENNQ0lBIENhcmQgMCBJUlEjICovCi0KLQl7IEFVMTAwMF9HUElPXzMsIElOVENfSU5UX0xPV19MRVZFTCwgMCB9LCAvKiBQQ01DSUEgQ2FyZCAxIEZ1bGx5X0ludGVydGVkIyAqLwotCXsgQVUxMDAwX0dQSU9fNCwgSU5UQ19JTlRfTE9XX0xFVkVMLCAwIH0sIC8qIFBDTUNJQSBDYXJkIDEgU1RTQ0hHIyAqLwotCXsgQVUxMDAwX0dQSU9fNSwgSU5UQ19JTlRfTE9XX0xFVkVMLCAwIH0sIC8qIFBDTUNJQSBDYXJkIDEgSVJRIyAqLwotI2VuZGlmCi0jZWxzZQotCXsgQVUxMDAwX0dQSU9fNywgSU5UQ19JTlRfUklTRV9FREdFLCAwIH0sIC8qIHRvdWNoc2NyZWVuIHBlbiBkb3duICovCi0jZW5kaWYKLQotfTsKLQotaW50IF9faW5pdGRhdGEgYXUxeHh4X25yX2lycXMgPSBBUlJBWV9TSVpFKGF1MXh4eF9pcnFfbWFwKTsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9hbGNoZW15L2RldmJvYXJkcy9NYWtlZmlsZSBiL2FyY2gvbWlwcy9hbGNoZW15L2RldmJvYXJkcy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzBmOWYyCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9taXBzL2FsY2hlbXkvZGV2Ym9hcmRzL01ha2VmaWxlCkBAIC0wLDAgKzEsMTggQEAKKyMKKyMgQWxjaGVteSBEZXZlbGJvYXJkcworIworCitvYmoteSArPSBwcm9tLm8KK29iai0kKENPTkZJR19QTSkJCSs9IHBtLm8KK29iai0kKENPTkZJR19NSVBTX1BCMTAwMCkJKz0gcGIxMDAwLworb2JqLSQoQ09ORklHX01JUFNfUEIxMTAwKQkrPSBwYjExMDAvCitvYmotJChDT05GSUdfTUlQU19QQjEyMDApCSs9IHBiMTIwMC8KK29iai0kKENPTkZJR19NSVBTX1BCMTUwMCkJKz0gcGIxNTAwLworb2JqLSQoQ09ORklHX01JUFNfUEIxNTUwKQkrPSBwYjE1NTAvCitvYmotJChDT05GSUdfTUlQU19EQjEwMDApCSs9IGRiMXgwMC8KK29iai0kKENPTkZJR19NSVBTX0RCMTEwMCkJKz0gZGIxeDAwLworb2JqLSQoQ09ORklHX01JUFNfREIxMjAwKQkrPSBwYjEyMDAvCitvYmotJChDT05GSUdfTUlQU19EQjE1MDApCSs9IGRiMXgwMC8KK29iai0kKENPTkZJR19NSVBTX0RCMTU1MCkJKz0gZGIxeDAwLworb2JqLSQoQ09ORklHX01JUFNfQk9TUE9SVVMpCSs9IGRiMXgwMC8KK29iai0kKENPTkZJR19NSVBTX01JUkFHRSkJKz0gZGIxeDAwLwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2FsY2hlbXkvZGV2Ym9hcmRzL2RiMXgwMC9NYWtlZmlsZSBiL2FyY2gvbWlwcy9hbGNoZW15L2RldmJvYXJkcy9kYjF4MDAvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDMyMjQxYQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbWlwcy9hbGNoZW15L2RldmJvYXJkcy9kYjF4MDAvTWFrZWZpbGUKQEAgLTAsMCArMSw4IEBACisjCisjICBDb3B5cmlnaHQgMjAwMCwgMjAwOCBNb250YVZpc3RhIFNvZnR3YXJlIEluYy4KKyMgIEF1dGhvcjogTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLiA8c291cmNlQG12aXN0YS5jb20+CisjCisjIE1ha2VmaWxlIGZvciB0aGUgQWxjaGVteSBTZW1pY29uZHVjdG9yIERCQXUxeHgwIGJvYXJkcy4KKyMKKworb2JqLXkgOj0gYm9hcmRfc2V0dXAubyBpcnFtYXAubwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2FsY2hlbXkvZGV2Ym9hcmRzL2RiMXgwMC9ib2FyZF9zZXR1cC5jIGIvYXJjaC9taXBzL2FsY2hlbXkvZGV2Ym9hcmRzL2RiMXgwMC9ib2FyZF9zZXR1cC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3NWZmYmYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21pcHMvYWxjaGVteS9kZXZib2FyZHMvZGIxeDAwL2JvYXJkX3NldHVwLmMKQEAgLTAsMCArMSwxNDUgQEAKKy8qCisgKgorICogQlJJRUYgTU9EVUxFIERFU0NSSVBUSU9OCisgKglBbGNoZW15IERiMXgwMCBib2FyZCBzZXR1cC4KKyAqCisgKiBDb3B5cmlnaHQgMjAwMCwgMjAwOCBNb250YVZpc3RhIFNvZnR3YXJlIEluYy4KKyAqIEF1dGhvcjogTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLiA8c291cmNlQG12aXN0YS5jb20+CisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAorICogIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgorICogIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRISVMgIFNPRlRXQVJFICBJUyBQUk9WSURFRCAgIGBgQVMgIElTJycgQU5EICAgQU5ZICBFWFBSRVNTIE9SIElNUExJRUQKKyAqICBXQVJSQU5USUVTLCAgIElOQ0xVRElORywgQlVUIE5PVCAgTElNSVRFRCAgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqICBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4KKyAqICBOTyAgRVZFTlQgIFNIQUxMICAgVEhFIEFVVEhPUiAgQkUgICAgTElBQkxFIEZPUiBBTlkgICBESVJFQ1QsIElORElSRUNULAorICogIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogIE5PVCBMSU1JVEVEICAgVE8sIFBST0NVUkVNRU5UIE9GICBTVUJTVElUVVRFIEdPT0RTICBPUiBTRVJWSUNFUzsgTE9TUyBPRgorICogIFVTRSwgREFUQSwgIE9SIFBST0ZJVFM7IE9SICBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTgorICogIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOICBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlICB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKKyNpbmNsdWRlIDxhc20vbWFjaC1hdTF4MDAvYXUxMDAwLmg+CisjaW5jbHVkZSA8YXNtL21hY2gtZGIxeDAwL2RiMXgwMC5oPgorCisjaW5jbHVkZSA8cHJvbS5oPgorCisKK3N0YXRpYyBCQ1NSICogY29uc3QgYmNzciA9IChCQ1NSICopQkNTUl9LU0VHMV9BRERSOworCitjb25zdCBjaGFyICpnZXRfc3lzdGVtX3R5cGUodm9pZCkKK3sKKyNpZmRlZiBDT05GSUdfTUlQU19CT1NQT1JVUworCXJldHVybiAiQWxjaGVteSBCb3Nwb3J1cyBHYXRld2F5IFJlZmVyZW5jZSI7CisjZWxzZQorCXJldHVybiAiQWxjaGVteSBEYjF4MDAiOworI2VuZGlmCit9CisKK3ZvaWQgYm9hcmRfcmVzZXQodm9pZCkKK3sKKwkvKiBIaXQgQkNTUi5TV19SRVNFVFtSRVNFVF0gKi8KKwliY3NyLT5zd3Jlc2V0ID0gMHgwMDAwOworfQorCit2b2lkIF9faW5pdCBib2FyZF9zZXR1cCh2b2lkKQoreworCXUzMiBwaW5fZnVuYyA9IDA7CisJY2hhciAqYXJncHRyOworCisJYXJncHRyID0gcHJvbV9nZXRjbWRsaW5lKCk7CisjaWZkZWYgQ09ORklHX1NFUklBTF84MjUwX0NPTlNPTEUKKwlhcmdwdHIgPSBzdHJzdHIoYXJncHRyLCAiY29uc29sZT0iKTsKKwlpZiAoYXJncHRyID09IE5VTEwpIHsKKwkJYXJncHRyID0gcHJvbV9nZXRjbWRsaW5lKCk7CisJCXN0cmNhdChhcmdwdHIsICIgY29uc29sZT10dHlTMCwxMTUyMDAiKTsKKwl9CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19GQl9BVTExMDAKKwlhcmdwdHIgPSBzdHJzdHIoYXJncHRyLCAidmlkZW89Iik7CisJaWYgKGFyZ3B0ciA9PSBOVUxMKSB7CisJCWFyZ3B0ciA9IHByb21fZ2V0Y21kbGluZSgpOworCQkvKiBkZWZhdWx0IHBhbmVsICovCisJCS8qc3RyY2F0KGFyZ3B0ciwgIiB2aWRlbz1hdTExMDBmYjpwYW5lbDpTaGFycF8zMjB4MjQwXzE2Iik7Ki8KKwl9CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX1NPVU5EX0FVMVgwMCkgJiYgIWRlZmluZWQoQ09ORklHX1NPQ19BVTEwMDApCisJLyogYXUxMDAwIGRvZXMgbm90IHN1cHBvcnQgdnJhLCBhdTE1MDAgYW5kIGF1MTEwMCBkbyAqLworCXN0cmNhdChhcmdwdHIsICIgYXUxMDAwX2F1ZGlvPXZyYSIpOworCWFyZ3B0ciA9IHByb21fZ2V0Y21kbGluZSgpOworI2VuZGlmCisKKwkvKiBOb3QgdmFsaWQgZm9yIEF1MTU1MCAqLworI2lmIGRlZmluZWQoQ09ORklHX0lSREEpICYmIFwKKyAgIChkZWZpbmVkKENPTkZJR19TT0NfQVUxMDAwKSB8fCBkZWZpbmVkKENPTkZJR19TT0NfQVUxMTAwKSkKKwkvKiBTZXQgSVJGSVJTRUwgaW5zdGVhZCBvZiBHUElPMTUgKi8KKwlwaW5fZnVuYyA9IGF1X3JlYWRsKFNZU19QSU5GVU5DKSB8IFNZU19QRl9JUkY7CisJYXVfd3JpdGVsKHBpbl9mdW5jLCBTWVNfUElORlVOQyk7CisJLyogUG93ZXIgb2ZmIHVudGlsIHRoZSBkcml2ZXIgaXMgaW4gdXNlICovCisJYmNzci0+cmVzZXRzICY9IH5CQ1NSX1JFU0VUU19JUkRBX01PREVfTUFTSzsKKwliY3NyLT5yZXNldHMgfD0gIEJDU1JfUkVTRVRTX0lSREFfTU9ERV9PRkY7CisJYXVfc3luYygpOworI2VuZGlmCisJYmNzci0+cGNtY2lhID0gMHgwMDAwOyAvKiB0dXJuIG9mZiBQQ01DSUEgcG93ZXIgKi8KKworI2lmZGVmIENPTkZJR19NSVBTX01JUkFHRQorCS8qIEVuYWJsZSBHUElPWzMxOjBdIGlucHV0cyAqLworCWF1X3dyaXRlbCgwLCBTWVNfUElOSU5QVVRFTik7CisKKwkvKiBHUElPWzIwXSBpcyBvdXRwdXQsIHRyaXN0YXRlIHRoZSBvdGhlciBpbnB1dCBwcmltYXJ5IEdQSU9zICovCisJYXVfd3JpdGVsKH4oMSA8PCAyMCksIFNZU19UUklPVVRDTFIpOworCisJLyogU2V0IEdQSU9bMjEwOjIwOF0gaW5zdGVhZCBvZiBTU0lfMCAqLworCXBpbl9mdW5jID0gYXVfcmVhZGwoU1lTX1BJTkZVTkMpIHwgU1lTX1BGX1MwOworCisJLyogU2V0IEdQSU9bMjE1OjIxMV0gZm9yIExFRHMgKi8KKwlwaW5fZnVuYyB8PSA1IDw8IDI7CisKKwkvKiBTZXQgR1BJT1syMTQ6MjEzXSBmb3IgbW9yZSBMRURzICovCisJcGluX2Z1bmMgfD0gNSA8PCAxMjsKKworCS8qIFNldCBHUElPWzIwNzoyMDBdIGluc3RlYWQgb2YgUENNQ0lBL0xDRCAqLworCXBpbl9mdW5jIHw9IFNZU19QRl9MQ0QgfCBTWVNfUEZfUEM7CisJYXVfd3JpdGVsKHBpbl9mdW5jLCBTWVNfUElORlVOQyk7CisKKwkvKgorCSAqIEVuYWJsZSBzcGVha2VyIGFtcGxpZmllci4gIFRoaXMgc2hvdWxkCisJICogYmUgcGFydCBvZiB0aGUgYXVkaW8gZHJpdmVyLgorCSAqLworCWF1X3dyaXRlbChhdV9yZWFkbChHUElPMl9ESVIpIHwgMHgyMDAsIEdQSU8yX0RJUik7CisJYXVfd3JpdGVsKDB4MDIwMDAyMDAsIEdQSU8yX09VVFBVVCk7CisjZW5kaWYKKworCWF1X3N5bmMoKTsKKworI2lmZGVmIENPTkZJR19NSVBTX0RCMTAwMAorCXByaW50ayhLRVJOX0lORk8gIkFNRCBBbGNoZW15IEF1MTAwMC9EYjEwMDAgQm9hcmRcbiIpOworI2VuZGlmCisjaWZkZWYgQ09ORklHX01JUFNfREIxNTAwCisJcHJpbnRrKEtFUk5fSU5GTyAiQU1EIEFsY2hlbXkgQXUxNTAwL0RiMTUwMCBCb2FyZFxuIik7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfTUlQU19EQjExMDAKKwlwcmludGsoS0VSTl9JTkZPICJBTUQgQWxjaGVteSBBdTExMDAvRGIxMTAwIEJvYXJkXG4iKTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19NSVBTX0JPU1BPUlVTCisJcHJpbnRrKEtFUk5fSU5GTyAiQU1EIEFsY2hlbXkgQm9zcG9ydXMgQm9hcmRcbiIpOworI2VuZGlmCisjaWZkZWYgQ09ORklHX01JUFNfTUlSQUdFCisJcHJpbnRrKEtFUk5fSU5GTyAiQU1EIEFsY2hlbXkgTWlyYWdlIEJvYXJkXG4iKTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19NSVBTX0RCMTU1MAorCXByaW50ayhLRVJOX0lORk8gIkFNRCBBbGNoZW15IEF1MTU1MC9EYjE1NTAgQm9hcmRcbiIpOworI2VuZGlmCit9CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvYWxjaGVteS9kZXZib2FyZHMvZGIxeDAwL2lycW1hcC5jIGIvYXJjaC9taXBzL2FsY2hlbXkvZGV2Ym9hcmRzL2RiMXgwMC9pcnFtYXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjA5MDI1Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9taXBzL2FsY2hlbXkvZGV2Ym9hcmRzL2RiMXgwMC9pcnFtYXAuYwpAQCAtMCwwICsxLDkwIEBACisvKgorICogQlJJRUYgTU9EVUxFIERFU0NSSVBUSU9OCisgKglBdTF4eHggaXJxIG1hcCB0YWJsZQorICoKKyAqIENvcHlyaWdodCAyMDAzIEVtYmVkZGVkIEVkZ2UsIExMQworICoJCWRhbkBlbWJlZGRlZGVkZ2UuY29tCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZQkgaXQgYW5kL29yIG1vZGlmeSBpdAorICogIHVuZGVyICB0aGUgdGVybXMgb2YJIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlCUxpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVEhJUyAgU09GVFdBUkUgIElTIFBST1ZJREVECSAgYGBBUwlJUycnIEFORCAgIEFOWQlFWFBSRVNTIE9SIElNUExJRUQKKyAqICBXQVJSQU5USUVTLAkgIElOQ0xVRElORywgQlVUIE5PVCAgTElNSVRFRCAgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqICBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4KKyAqICBOTwlFVkVOVCAgU0hBTEwgICBUSEUgQVVUSE9SICBCRQkgTElBQkxFIEZPUiBBTlkJICBESVJFQ1QsIElORElSRUNULAorICogIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogIE5PVCBMSU1JVEVECSAgVE8sIFBST0NVUkVNRU5UIE9GICBTVUJTVElUVVRFIEdPT0RTCU9SIFNFUlZJQ0VTOyBMT1NTIE9GCisgKiAgVVNFLCBEQVRBLAlPUiBQUk9GSVRTOyBPUglCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTgorICogIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCSBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlICB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisKKyNpbmNsdWRlIDxhc20vbWFjaC1hdTF4MDAvYXUxMDAwLmg+CisKKyNpZmRlZiBDT05GSUdfTUlQU19EQjE1MDAKK2NoYXIgaXJxX3RhYl9hbGNoZW15W11bNV0gX19pbml0ZGF0YSA9IHsKKwlbMTJdID0geyAtMSwgSU5UQSwgSU5UWCwgSU5UWCwgSU5UWCB9LCAvKiBJRFNFTCAxMiAtIEhQVDM3MSAgICovCisJWzEzXSA9IHsgLTEsIElOVEEsIElOVEIsIElOVEMsIElOVEQgfSwgLyogSURTRUwgMTMgLSBQQ0kgc2xvdCAqLworfTsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX01JUFNfQk9TUE9SVVMKK2NoYXIgaXJxX3RhYl9hbGNoZW15W11bNV0gX19pbml0ZGF0YSA9IHsKKwlbMTFdID0geyAtMSwgSU5UQSwgSU5UQiwgSU5UWCwgSU5UWCB9LCAvKiBJRFNFTCAxMSAtIG1pbmlQQ0kgICovCisJWzEyXSA9IHsgLTEsIElOVEEsIElOVFgsIElOVFgsIElOVFggfSwgLyogSURTRUwgMTIgLSBTTjE3NDEgICAqLworCVsxM10gPSB7IC0xLCBJTlRBLCBJTlRCLCBJTlRDLCBJTlREIH0sIC8qIElEU0VMIDEzIC0gUENJIHNsb3QgKi8KK307CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19NSVBTX01JUkFHRQorY2hhciBpcnFfdGFiX2FsY2hlbXlbXVs1XSBfX2luaXRkYXRhID0geworCVsxMV0gPSB7IC0xLCBJTlRELCBJTlRYLCBJTlRYLCBJTlRYIH0sIC8qIElEU0VMIDExIC0gU01JIFZHWCAqLworCVsxMl0gPSB7IC0xLCBJTlRYLCBJTlRYLCBJTlRDLCBJTlRYIH0sIC8qIElEU0VMIDEyIC0gUE5YMTMwMCAqLworCVsxM10gPSB7IC0xLCBJTlRBLCBJTlRCLCBJTlRYLCBJTlRYIH0sIC8qIElEU0VMIDEzIC0gbWluaVBDSSAqLworfTsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX01JUFNfREIxNTUwCitjaGFyIGlycV90YWJfYWxjaGVteVtdWzVdIF9faW5pdGRhdGEgPSB7CisJWzExXSA9IHsgLTEsIElOVEMsIElOVFgsIElOVFgsIElOVFggfSwgLyogSURTRUwgMTEgLSBvbi1ib2FyZCBIUFQzNzEgKi8KKwlbMTJdID0geyAtMSwgSU5UQiwgSU5UQywgSU5URCwgSU5UQSB9LCAvKiBJRFNFTCAxMiAtIFBDSSBzbG90IDIgKGxlZnQpICovCisJWzEzXSA9IHsgLTEsIElOVEEsIElOVEIsIElOVEMsIElOVEQgfSwgLyogSURTRUwgMTMgLSBQQ0kgc2xvdCAxIChyaWdodCkgKi8KK307CisjZW5kaWYKKworCitzdHJ1Y3QgYXUxeHh4X2lycW1hcCBfX2luaXRkYXRhIGF1MXh4eF9pcnFfbWFwW10gPSB7CisKKyNpZm5kZWYgQ09ORklHX01JUFNfTUlSQUdFCisjaWZkZWYgQ09ORklHX01JUFNfREIxNTUwCisJeyBBVTEwMDBfR1BJT18zLCBJUlFGX1RSSUdHRVJfTE9XLCAwIH0sIC8qIFBDTUNJQSBDYXJkIDAgSVJRIyAqLworCXsgQVUxMDAwX0dQSU9fNSwgSVJRRl9UUklHR0VSX0xPVywgMCB9LCAvKiBQQ01DSUEgQ2FyZCAxIElSUSMgKi8KKyNlbHNlCisJeyBBVTEwMDBfR1BJT18wLCBJUlFGX1RSSUdHRVJfTE9XLCAwIH0sIC8qIFBDTUNJQSBDYXJkIDAgRnVsbHlfSW50ZXJ0ZWQjICovCisJeyBBVTEwMDBfR1BJT18xLCBJUlFGX1RSSUdHRVJfTE9XLCAwIH0sIC8qIFBDTUNJQSBDYXJkIDAgU1RTQ0hHIyAqLworCXsgQVUxMDAwX0dQSU9fMiwgSVJRRl9UUklHR0VSX0xPVywgMCB9LCAvKiBQQ01DSUEgQ2FyZCAwIElSUSMgKi8KKworCXsgQVUxMDAwX0dQSU9fMywgSVJRRl9UUklHR0VSX0xPVywgMCB9LCAvKiBQQ01DSUEgQ2FyZCAxIEZ1bGx5X0ludGVydGVkIyAqLworCXsgQVUxMDAwX0dQSU9fNCwgSVJRRl9UUklHR0VSX0xPVywgMCB9LCAvKiBQQ01DSUEgQ2FyZCAxIFNUU0NIRyMgKi8KKwl7IEFVMTAwMF9HUElPXzUsIElSUUZfVFJJR0dFUl9MT1csIDAgfSwgLyogUENNQ0lBIENhcmQgMSBJUlEjICovCisjZW5kaWYKKyNlbHNlCisJeyBBVTEwMDBfR1BJT183LCBJUlFGX1RSSUdHRVJfUklTSU5HLCAwIH0sIC8qIHRvdWNoc2NyZWVuIHBlbiBkb3duICovCisjZW5kaWYKKworfTsKKwordm9pZCBfX2luaXQgYm9hcmRfaW5pdF9pcnEodm9pZCkKK3sKKwlhdTF4eHhfc2V0dXBfaXJxbWFwKGF1MXh4eF9pcnFfbWFwLCBBUlJBWV9TSVpFKGF1MXh4eF9pcnFfbWFwKSk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvYWxjaGVteS9kZXZib2FyZHMvcGIxMDAwL01ha2VmaWxlIGIvYXJjaC9taXBzL2FsY2hlbXkvZGV2Ym9hcmRzL3BiMTAwMC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45N2M2NjE1Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9taXBzL2FsY2hlbXkvZGV2Ym9hcmRzL3BiMTAwMC9NYWtlZmlsZQpAQCAtMCwwICsxLDggQEAKKyMKKyMgIENvcHlyaWdodCAyMDAwLCAyMDA4IE1vbnRhVmlzdGEgU29mdHdhcmUgSW5jLgorIyAgQXV0aG9yOiBNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuIDxzb3VyY2VAbXZpc3RhLmNvbT4KKyMKKyMgTWFrZWZpbGUgZm9yIHRoZSBBbGNoZW15IFNlbWljb25kdWN0b3IgUGIxMDAwIGJvYXJkLgorIworCitvYmoteSA6PSBib2FyZF9zZXR1cC5vCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvYWxjaGVteS9kZXZib2FyZHMvcGIxMDAwL2JvYXJkX3NldHVwLmMgYi9hcmNoL21pcHMvYWxjaGVteS9kZXZib2FyZHMvcGIxMDAwL2JvYXJkX3NldHVwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWVkMmZkZQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbWlwcy9hbGNoZW15L2RldmJvYXJkcy9wYjEwMDAvYm9hcmRfc2V0dXAuYwpAQCAtMCwwICsxLDE5MSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAwLCAyMDA4IE1vbnRhVmlzdGEgU29mdHdhcmUgSW5jLgorICogQXV0aG9yOiBNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuIDxzb3VyY2VAbXZpc3RhLmNvbT4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVEhJUyAgU09GVFdBUkUgIElTIFBST1ZJREVEICAgYGBBUyAgSVMnJyBBTkQgICBBTlkgIEVYUFJFU1MgT1IgSU1QTElFRAorICogIFdBUlJBTlRJRVMsICAgSU5DTFVESU5HLCBCVVQgTk9UICBMSU1JVEVEICBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTgorICogIE5PICBFVkVOVCAgU0hBTEwgICBUSEUgQVVUSE9SICBCRSAgICBMSUFCTEUgRk9SIEFOWSAgIERJUkVDVCwgSU5ESVJFQ1QsCisgKiAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiAgTk9UIExJTUlURUQgICBUTywgUFJPQ1VSRU1FTlQgT0YgIFNVQlNUSVRVVEUgR09PRFMgIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCisgKiAgVVNFLCBEQVRBLCAgT1IgUFJPRklUUzsgT1IgIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OCisgKiAgQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiAgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiAgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGFzbS9tYWNoLWF1MXgwMC9hdTEwMDAuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC1wYjF4MDAvcGIxMDAwLmg+CisjaW5jbHVkZSA8cHJvbS5oPgorCisKK3N0cnVjdCBhdTF4eHhfaXJxbWFwIF9faW5pdGRhdGEgYXUxeHh4X2lycV9tYXBbXSA9IHsKKwl7IEFVMTAwMF9HUElPXzE1LCBJUlFGX1RSSUdHRVJfTE9XLCAwIH0sCit9OworCisKK2NvbnN0IGNoYXIgKmdldF9zeXN0ZW1fdHlwZSh2b2lkKQoreworCXJldHVybiAiQWxjaGVteSBQYjEwMDAiOworfQorCit2b2lkIGJvYXJkX3Jlc2V0KHZvaWQpCit7Cit9CisKK3ZvaWQgX19pbml0IGJvYXJkX2luaXRfaXJxKHZvaWQpCit7CisJYXUxeHh4X3NldHVwX2lycW1hcChhdTF4eHhfaXJxX21hcCwgQVJSQVlfU0laRShhdTF4eHhfaXJxX21hcCkpOworfQorCit2b2lkIF9faW5pdCBib2FyZF9zZXR1cCh2b2lkKQoreworCXUzMiBwaW5fZnVuYywgc3RhdGljX2NmZzA7CisJdTMyIHN5c19mcmVxY3RybCwgc3lzX2Nsa3NyYzsKKwl1MzIgcHJpZCA9IHJlYWRfYzBfcHJpZCgpOworCisjaWZkZWYgQ09ORklHX1NFUklBTF84MjUwX0NPTlNPTEUKKwljaGFyICphcmdwdHIgPSBwcm9tX2dldGNtZGxpbmUoKTsKKwlhcmdwdHIgPSBzdHJzdHIoYXJncHRyLCAiY29uc29sZT0iKTsKKwlpZiAoYXJncHRyID09IE5VTEwpIHsKKwkJYXJncHRyID0gcHJvbV9nZXRjbWRsaW5lKCk7CisJCXN0cmNhdChhcmdwdHIsICIgY29uc29sZT10dHlTMCwxMTUyMDAiKTsKKwl9CisjZW5kaWYKKworCS8qIFNldCBBVVggY2xvY2sgdG8gMTIgTUh6ICogOCA9IDk2IE1IeiAqLworCWF1X3dyaXRlbCg4LCBTWVNfQVVYUExMKTsKKwlhdV93cml0ZWwoMCwgU1lTX1BJTlNUQVRFUkQpOworCXVkZWxheSgxMDApOworCisjaWYgZGVmaW5lZChDT05GSUdfVVNCX09IQ0lfSENEKSB8fCBkZWZpbmVkKENPTkZJR19VU0JfT0hDSV9IQ0RfTU9EVUxFKQorCS8qIFplcm8gYW5kIGRpc2FibGUgRlJFUTIgKi8KKwlzeXNfZnJlcWN0cmwgPSBhdV9yZWFkbChTWVNfRlJFUUNUUkwwKTsKKwlzeXNfZnJlcWN0cmwgJj0gfjB4RkZGMDAwMDA7CisJYXVfd3JpdGVsKHN5c19mcmVxY3RybCwgU1lTX0ZSRVFDVFJMMCk7CisKKwkvKiBaZXJvIGFuZCBkaXNhYmxlIFVTQkgvVVNCRCBjbG9ja3MgKi8KKwlzeXNfY2xrc3JjID0gYXVfcmVhZGwoU1lTX0NMS1NSQyk7CisJc3lzX2Nsa3NyYyAmPSB+KFNZU19DU19DVUQgfCBTWVNfQ1NfRFVEIHwgU1lTX0NTX01VRF9NQVNLIHwKKwkJICAgICAgICBTWVNfQ1NfQ1VIIHwgU1lTX0NTX0RVSCB8IFNZU19DU19NVUhfTUFTSyk7CisJYXVfd3JpdGVsKHN5c19jbGtzcmMsIFNZU19DTEtTUkMpOworCisJc3lzX2ZyZXFjdHJsID0gYXVfcmVhZGwoU1lTX0ZSRVFDVFJMMCk7CisJc3lzX2ZyZXFjdHJsICY9IH4weEZGRjAwMDAwOworCisJc3lzX2Nsa3NyYyA9IGF1X3JlYWRsKFNZU19DTEtTUkMpOworCXN5c19jbGtzcmMgJj0gfihTWVNfQ1NfQ1VEIHwgU1lTX0NTX0RVRCB8IFNZU19DU19NVURfTUFTSyB8CisJCSAgICAgICAgU1lTX0NTX0NVSCB8IFNZU19DU19EVUggfCBTWVNfQ1NfTVVIX01BU0spOworCisJc3dpdGNoIChwcmlkICYgMHgwMDAwMDBGRikgeworCWNhc2UgMHgwMDogLyogREEgKi8KKwljYXNlIDB4MDE6IC8qIEhBICovCisJY2FzZSAweDAyOiAvKiBIQiAqLworCQkvKiBDUFUgY29yZSBmcmVxIHRvIDQ4IE1IeiB0byBzbG93IGl0IHdheSBkb3duLi4uICovCisJCWF1X3dyaXRlbCg0LCBTWVNfQ1BVUExMKTsKKworCQkvKgorCQkgKiBTZXR1cCA0OCBNSHogRlJFUTIgZnJvbSBDUFVQTEwgZm9yIFVTQiBIb3N0CisJCSAqIEZSRElWMiA9IDMgLT4gZGl2IGJ5IDggb2YgMzg0IE1IeiAtPiA0OCBNSHoKKwkJICovCisJCXN5c19mcmVxY3RybCB8PSAoMyA8PCBTWVNfRkNfRlJESVYyX0JJVCkgfCBTWVNfRkNfRkUyOworCQlhdV93cml0ZWwoc3lzX2ZyZXFjdHJsLCBTWVNfRlJFUUNUUkwwKTsKKworCQkvKiBDUFUgY29yZSBmcmVxIHRvIDM4NCBNSHogKi8KKwkJYXVfd3JpdGVsKDB4MjAsIFNZU19DUFVQTEwpOworCisJCXByaW50ayhLRVJOX0lORk8gIkF1MTAwMDogNDggTUh6IE9IQ0kgd29ya2Fyb3VuZCBlbmFibGVkXG4iKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OiAvKiBIQyBhbmQgbmV3ZXIgKi8KKwkJLyogRlJFUTIgPSBhdXggLyAyID0gNDggTUh6ICovCisJCXN5c19mcmVxY3RybCB8PSAoMCA8PCBTWVNfRkNfRlJESVYyX0JJVCkgfAorCQkJCSBTWVNfRkNfRkUyIHwgU1lTX0ZDX0ZTMjsKKwkJYXVfd3JpdGVsKHN5c19mcmVxY3RybCwgU1lTX0ZSRVFDVFJMMCk7CisJCWJyZWFrOworCX0KKworCS8qCisJICogUm91dGUgNDggTUh6IEZSRVEyIGludG8gVVNCIEhvc3QgYW5kL29yIERldmljZQorCSAqLworCXN5c19jbGtzcmMgfD0gU1lTX0NTX01VWF9GUTIgPDwgU1lTX0NTX01VSF9CSVQ7CisJYXVfd3JpdGVsKHN5c19jbGtzcmMsIFNZU19DTEtTUkMpOworCisJLyogQ29uZmlndXJlIHBpbnMgR1BJT1sxNDo5XSBhcyBHUElPICovCisJcGluX2Z1bmMgPSBhdV9yZWFkbChTWVNfUElORlVOQykgJiB+KFNZU19QRl9VUjMgfCBTWVNfUEZfVVNCKTsKKworCS8qIDJuZCBVU0IgcG9ydCBpcyBVU0IgaG9zdCAqLworCXBpbl9mdW5jIHw9IFNZU19QRl9VU0I7CisKKwlhdV93cml0ZWwocGluX2Z1bmMsIFNZU19QSU5GVU5DKTsKKwlhdV93cml0ZWwoMHgyODAwLCBTWVNfVFJJT1VUQ0xSKTsKKwlhdV93cml0ZWwoMHgwMDMwLCBTWVNfT1VUUFVUQ0xSKTsKKyNlbmRpZiAvKiBkZWZpbmVkKENPTkZJR19VU0JfT0hDSV9IQ0QpIHx8IGRlZmluZWQoQ09ORklHX1VTQl9PSENJX0hDRF9NT0RVTEUpICovCisKKwkvKiBNYWtlIEdQSU8gMTUgYW4gaW5wdXQgKGZvciBpbnRlcnJ1cHQgbGluZSkgKi8KKwlwaW5fZnVuYyA9IGF1X3JlYWRsKFNZU19QSU5GVU5DKSAmIH5TWVNfUEZfSVJGOworCS8qIFdlIGRvbid0IG5lZWQgSTJTLCBzbyBtYWtlIGl0IGF2YWlsYWJsZSBmb3IgR1BJT1szMToyOV0gKi8KKwlwaW5fZnVuYyB8PSBTWVNfUEZfSTJTOworCWF1X3dyaXRlbChwaW5fZnVuYywgU1lTX1BJTkZVTkMpOworCisJYXVfd3JpdGVsKDB4ODAwMCwgU1lTX1RSSU9VVENMUik7CisKKwlzdGF0aWNfY2ZnMCA9IGF1X3JlYWRsKE1FTV9TVENGRzApICYgfjB4YzAwOworCWF1X3dyaXRlbChzdGF0aWNfY2ZnMCwgTUVNX1NUQ0ZHMCk7CisKKwkvKiBjb25maWd1cmUgUkNFMiogZm9yIExDRCAqLworCWF1X3dyaXRlbCgweDAwMDAwMDA0LCBNRU1fU1RDRkcyKTsKKworCS8qIE1FTV9TVFRJTUUyICovCisJYXVfd3JpdGVsKDB4MDkwMDAwMDAsIE1FTV9TVFRJTUUyKTsKKworCS8qIFNldCAzMi1iaXQgYmFzZSBhZGRyZXNzIGRlY29kaW5nIGZvciBSQ0UyKiAqLworCWF1X3dyaXRlbCgweDEwMDAzZmYwLCBNRU1fU1RBRERSMik7CisKKwkvKgorCSAqIFBDSSBDUExEIHNldHVwCisJICogRXhwYW5kIENFMCB0byBjb3ZlciBQQ0kKKwkgKi8KKwlhdV93cml0ZWwoMHgxMTgwM2U0MCwgTUVNX1NUQUREUjEpOworCisJLyogQnVyc3QgdmlzaWJpbGl0eSBvbiAqLworCWF1X3dyaXRlbChhdV9yZWFkbChNRU1fU1RDRkcwKSB8IDB4MTAwMCwgTUVNX1NUQ0ZHMCk7CisKKwlhdV93cml0ZWwoMHg4MywgTUVNX1NUQ0ZHMSk7CSAgICAgLyogZXdhaXQgZW5hYmxlZCwgZmxhc2ggdGltaW5nICovCisJYXVfd3JpdGVsKDB4MzMwMzBhMTAsIE1FTV9TVFRJTUUxKTsgIC8qIHNsb3dlciB0aW1pbmcgZm9yIEZQR0EgKi8KKworCS8qIFNldHVwIHRoZSBzdGF0aWMgYnVzIGNvbnRyb2xsZXIgKi8KKwlhdV93cml0ZWwoMHgwMDAwMDAwMiwgTUVNX1NUQ0ZHMyk7ICAvKiB0eXBlID0gUENNQ0lBICovCisJYXVfd3JpdGVsKDB4MjgwRTNEMDcsIE1FTV9TVFRJTUUzKTsgLyogMjUwbnMgY3ljbGUgdGltZSAqLworCWF1X3dyaXRlbCgweDEwMDAwMDAwLCBNRU1fU1RBRERSMyk7IC8qIGFueSBQQ01DSUEgc2VsZWN0ICovCisKKwkvKgorCSAqIEVuYWJsZSBBdTEwMDAgQkNMSyBzd2l0Y2hpbmcgLSBub3RlOiBzZWQxMzU2IG11c3Qgbm90IHVzZQorCSAqIGl0cyBCQ0xLIChBdTEwMDAgTENMSykgZm9yIGFueSB0aW1pbmdzCisJICovCisJc3dpdGNoIChwcmlkICYgMHgwMDAwMDBGRikgeworCWNhc2UgMHgwMDogLyogREEgKi8KKwljYXNlIDB4MDE6IC8qIEhBICovCisJY2FzZSAweDAyOiAvKiBIQiAqLworCQlicmVhazsKKwlkZWZhdWx0OiAgLyogSEMgYW5kIG5ld2VyICovCisJCS8qCisJCSAqIEVuYWJsZSBzeXMgYnVzIGNsb2NrIGRpdmlkZXIgd2hlbiBJRExFIHN0YXRlIG9yIG5vIGJ1cworCQkgKiBhY3Rpdml0eS4KKwkJICovCisJCWF1X3dyaXRlbChhdV9yZWFkbChTWVNfUE9XRVJDVFJMKSB8ICgweDMgPDwgNSksIFNZU19QT1dFUkNUUkwpOworCQlicmVhazsKKwl9Cit9CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvYWxjaGVteS9kZXZib2FyZHMvcGIxMTAwL01ha2VmaWxlIGIvYXJjaC9taXBzL2FsY2hlbXkvZGV2Ym9hcmRzL3BiMTEwMC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTg2ZGQ3Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9taXBzL2FsY2hlbXkvZGV2Ym9hcmRzL3BiMTEwMC9NYWtlZmlsZQpAQCAtMCwwICsxLDggQEAKKyMKKyMgIENvcHlyaWdodCAyMDAwLCAyMDAxLCAyMDA4IE1vbnRhVmlzdGEgU29mdHdhcmUgSW5jLgorIyAgQXV0aG9yOiBNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuIDxzb3VyY2VAbXZpc3RhLmNvbT4KKyMKKyMgTWFrZWZpbGUgZm9yIHRoZSBBbGNoZW15IFNlbWljb25kdWN0b3IgUGIxMTAwIGJvYXJkLgorIworCitvYmoteSA6PSBib2FyZF9zZXR1cC5vCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvYWxjaGVteS9kZXZib2FyZHMvcGIxMTAwL2JvYXJkX3NldHVwLmMgYi9hcmNoL21pcHMvYWxjaGVteS9kZXZib2FyZHMvcGIxMTAwL2JvYXJkX3NldHVwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGRmNTdmYQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbWlwcy9hbGNoZW15L2RldmJvYXJkcy9wYjExMDAvYm9hcmRfc2V0dXAuYwpAQCAtMCwwICsxLDE1NiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAyLCAyMDA4IE1vbnRhVmlzdGEgU29mdHdhcmUgSW5jLgorICogQXV0aG9yOiBNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuIDxzb3VyY2VAbXZpc3RhLmNvbT4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVEhJUyAgU09GVFdBUkUgIElTIFBST1ZJREVEICAgYGBBUyAgSVMnJyBBTkQgICBBTlkgIEVYUFJFU1MgT1IgSU1QTElFRAorICogIFdBUlJBTlRJRVMsICAgSU5DTFVESU5HLCBCVVQgTk9UICBMSU1JVEVEICBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTgorICogIE5PICBFVkVOVCAgU0hBTEwgICBUSEUgQVVUSE9SICBCRSAgICBMSUFCTEUgRk9SIEFOWSAgIERJUkVDVCwgSU5ESVJFQ1QsCisgKiAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiAgTk9UIExJTUlURUQgICBUTywgUFJPQ1VSRU1FTlQgT0YgIFNVQlNUSVRVVEUgR09PRFMgIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCisgKiAgVVNFLCBEQVRBLCAgT1IgUFJPRklUUzsgT1IgIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OCisgKiAgQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiAgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiAgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorCisjaW5jbHVkZSA8YXNtL21hY2gtYXUxeDAwL2F1MTAwMC5oPgorI2luY2x1ZGUgPGFzbS9tYWNoLXBiMXgwMC9wYjExMDAuaD4KKworI2luY2x1ZGUgPHByb20uaD4KKworCitzdHJ1Y3QgYXUxeHh4X2lycW1hcCBfX2luaXRkYXRhIGF1MXh4eF9pcnFfbWFwW10gPSB7CisJeyBBVTEwMDBfR1BJT185LCAgSVJRRl9UUklHR0VSX0xPVywgMCB9LCAvKiBQQ01DSUEgQ2FyZCBGdWxseV9JbnNlcnRlZCMgKi8KKwl7IEFVMTAwMF9HUElPXzEwLCBJUlFGX1RSSUdHRVJfTE9XLCAwIH0sIC8qIFBDTUNJQSBDYXJkIFNUU0NIRyMgKi8KKwl7IEFVMTAwMF9HUElPXzExLCBJUlFGX1RSSUdHRVJfTE9XLCAwIH0sIC8qIFBDTUNJQSBDYXJkIElSUSMgKi8KKwl7IEFVMTAwMF9HUElPXzEzLCBJUlFGX1RSSUdHRVJfTE9XLCAwIH0sIC8qIERDX0lSUSMgKi8KK307CisKKworY29uc3QgY2hhciAqZ2V0X3N5c3RlbV90eXBlKHZvaWQpCit7CisJcmV0dXJuICJBbGNoZW15IFBiMTEwMCI7Cit9CisKK3ZvaWQgYm9hcmRfcmVzZXQodm9pZCkKK3sKKwkvKiBIaXQgQkNTUi5SU1RfVkRESVtTT0ZUX1JFU0VUXSAqLworCWF1X3dyaXRlbCgweDAwMDAwMDAwLCBQQjExMDBfUlNUX1ZEREkpOworfQorCit2b2lkIF9faW5pdCBib2FyZF9pbml0X2lycSh2b2lkKQoreworCWF1MXh4eF9zZXR1cF9pcnFtYXAoYXUxeHh4X2lycV9tYXAsIEFSUkFZX1NJWkUoYXUxeHh4X2lycV9tYXApKTsKK30KKwordm9pZCBfX2luaXQgYm9hcmRfc2V0dXAodm9pZCkKK3sKKwl2b2xhdGlsZSB2b2lkIF9faW9tZW0gKmJhc2UgPSAodm9sYXRpbGUgdm9pZCBfX2lvbWVtICopMHhhYzAwMDAwMFVMOworCWNoYXIgKmFyZ3B0cjsKKworCWFyZ3B0ciA9IHByb21fZ2V0Y21kbGluZSgpOworI2lmZGVmIENPTkZJR19TRVJJQUxfODI1MF9DT05TT0xFCisJYXJncHRyID0gc3Ryc3RyKGFyZ3B0ciwgImNvbnNvbGU9Iik7CisJaWYgKGFyZ3B0ciA9PSBOVUxMKSB7CisJCWFyZ3B0ciA9IHByb21fZ2V0Y21kbGluZSgpOworCQlzdHJjYXQoYXJncHRyLCAiIGNvbnNvbGU9dHR5UzAsMTE1MjAwIik7CisJfQorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfRkJfQVUxMTAwCisJYXJncHRyID0gc3Ryc3RyKGFyZ3B0ciwgInZpZGVvPSIpOworCWlmIChhcmdwdHIgPT0gTlVMTCkgeworCQlhcmdwdHIgPSBwcm9tX2dldGNtZGxpbmUoKTsKKwkJLyogZGVmYXVsdCBwYW5lbCAqLworCQkvKnN0cmNhdChhcmdwdHIsICIgdmlkZW89YXUxMTAwZmI6cGFuZWw6U2hhcnBfMzIweDI0MF8xNiIpOyovCisJfQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19TT1VORF9BVTFYMDApICYmICFkZWZpbmVkKENPTkZJR19TT0NfQVUxMDAwKQorCS8qIGF1MTAwMCBkb2VzIG5vdCBzdXBwb3J0IHZyYSwgYXUxNTAwIGFuZCBhdTExMDAgZG8gKi8KKwlzdHJjYXQoYXJncHRyLCAiIGF1MTAwMF9hdWRpbz12cmEiKTsKKwlhcmdwdHIgPSBwcm9tX2dldGNtZGxpbmUoKTsKKyNlbmRpZgorCisJLyogU2V0IEFVWCBjbG9jayB0byAxMiBNSHogKiA4ID0gOTYgTUh6ICovCisJYXVfd3JpdGVsKDgsIFNZU19BVVhQTEwpOworCWF1X3dyaXRlbCgwLCBTWVNfUElOSU5QVVRFTik7CisJdWRlbGF5KDEwMCk7CisKKyNpZiBkZWZpbmVkKENPTkZJR19VU0JfT0hDSV9IQ0QpIHx8IGRlZmluZWQoQ09ORklHX1VTQl9PSENJX0hDRF9NT0RVTEUpCisJeworCQl1MzIgcGluX2Z1bmMsIHN5c19mcmVxY3RybCwgc3lzX2Nsa3NyYzsKKworCQkvKiBDb25maWd1cmUgcGlucyBHUElPWzE0OjldIGFzIEdQSU8gKi8KKwkJcGluX2Z1bmMgPSBhdV9yZWFkbChTWVNfUElORlVOQykgJiB+U1lTX1BGX1VSMzsKKworCQkvKiBaZXJvIGFuZCBkaXNhYmxlIEZSRVEyICovCisJCXN5c19mcmVxY3RybCA9IGF1X3JlYWRsKFNZU19GUkVRQ1RSTDApOworCQlzeXNfZnJlcWN0cmwgJj0gfjB4RkZGMDAwMDA7CisJCWF1X3dyaXRlbChzeXNfZnJlcWN0cmwsIFNZU19GUkVRQ1RSTDApOworCisJCS8qIFplcm8gYW5kIGRpc2FibGUgVVNCSC9VU0JEL0lyREEgY2xvY2sgKi8KKwkJc3lzX2Nsa3NyYyA9IGF1X3JlYWRsKFNZU19DTEtTUkMpOworCQlzeXNfY2xrc3JjICY9IH4oU1lTX0NTX0NJUiB8IFNZU19DU19ESVIgfCBTWVNfQ1NfTUlSX01BU0spOworCQlhdV93cml0ZWwoc3lzX2Nsa3NyYywgU1lTX0NMS1NSQyk7CisKKwkJc3lzX2ZyZXFjdHJsID0gYXVfcmVhZGwoU1lTX0ZSRVFDVFJMMCk7CisJCXN5c19mcmVxY3RybCAmPSB+MHhGRkYwMDAwMDsKKworCQlzeXNfY2xrc3JjID0gYXVfcmVhZGwoU1lTX0NMS1NSQyk7CisJCXN5c19jbGtzcmMgJj0gfihTWVNfQ1NfQ0lSIHwgU1lTX0NTX0RJUiB8IFNZU19DU19NSVJfTUFTSyk7CisKKwkJLyogRlJFUTIgPSBhdXggLyAyID0gNDggTUh6ICovCisJCXN5c19mcmVxY3RybCB8PSAoMCA8PCBTWVNfRkNfRlJESVYyX0JJVCkgfAorCQkJCVNZU19GQ19GRTIgfCBTWVNfRkNfRlMyOworCQlhdV93cml0ZWwoc3lzX2ZyZXFjdHJsLCBTWVNfRlJFUUNUUkwwKTsKKworCQkvKgorCQkgKiBSb3V0ZSA0OCBNSHogRlJFUTIgaW50byBVU0JIL1VTQkQvSXJEQQorCQkgKi8KKwkJc3lzX2Nsa3NyYyB8PSBTWVNfQ1NfTVVYX0ZRMiA8PCBTWVNfQ1NfTUlSX0JJVDsKKwkJYXVfd3JpdGVsKHN5c19jbGtzcmMsIFNZU19DTEtTUkMpOworCisJCS8qIFNldHVwIHRoZSBzdGF0aWMgYnVzIGNvbnRyb2xsZXIgKi8KKwkJYXVfd3JpdGVsKDB4MDAwMDAwMDIsIE1FTV9TVENGRzMpOyAgLyogdHlwZSA9IFBDTUNJQSAqLworCQlhdV93cml0ZWwoMHgyODBFM0QwNywgTUVNX1NUVElNRTMpOyAvKiAyNTBucyBjeWNsZSB0aW1lICovCisJCWF1X3dyaXRlbCgweDEwMDAwMDAwLCBNRU1fU1RBRERSMyk7IC8qIGFueSBQQ01DSUEgc2VsZWN0ICovCisKKwkJLyoKKwkJICogR2V0IFVTQiBGdW5jdGlvbmFsaXR5IHBpbiBzdGF0ZSAoZGV2aWNlIHZzIGhvc3QgZHJpdmUgcGlucykuCisJCSAqLworCQlwaW5fZnVuYyA9IGF1X3JlYWRsKFNZU19QSU5GVU5DKSAmIH5TWVNfUEZfVVNCOworCQkvKiAybmQgVVNCIHBvcnQgaXMgVVNCIGhvc3QuICovCisJCXBpbl9mdW5jIHw9IFNZU19QRl9VU0I7CisJCWF1X3dyaXRlbChwaW5fZnVuYywgU1lTX1BJTkZVTkMpOworCX0KKyNlbmRpZiAvKiBkZWZpbmVkKENPTkZJR19VU0JfT0hDSV9IQ0QpIHx8IGRlZmluZWQoQ09ORklHX1VTQl9PSENJX0hDRF9NT0RVTEUpICovCisKKwkvKiBFbmFibGUgc3lzIGJ1cyBjbG9jayBkaXZpZGVyIHdoZW4gSURMRSBzdGF0ZSBvciBubyBidXMgYWN0aXZpdHkuICovCisJYXVfd3JpdGVsKGF1X3JlYWRsKFNZU19QT1dFUkNUUkwpIHwgKDB4MyA8PCA1KSwgU1lTX1BPV0VSQ1RSTCk7CisKKwkvKiBFbmFibGUgdGhlIFJUQyBpZiBub3QgYWxyZWFkeSBlbmFibGVkLiAqLworCWlmICghKHJlYWRiKGJhc2UgKyAweDI4KSAmIDB4MjApKSB7CisJCXdyaXRlYihyZWFkYihiYXNlICsgMHgyOCkgfCAweDIwLCBiYXNlICsgMHgyOCk7CisJCWF1X3N5bmMoKTsKKwl9CisJLyogUHV0IHRoZSBjbG9jayBpbiBCQ0QgbW9kZS4gKi8KKwlpZiAocmVhZGIoYmFzZSArIDB4MkMpICYgMHg0KSB7IC8qIHJlZyBCICovCisJCXdyaXRlYihyZWFkYihiYXNlICsgMHgyYykgJiB+MHg0LCBiYXNlICsgMHgyYyk7CisJCWF1X3N5bmMoKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvYWxjaGVteS9kZXZib2FyZHMvcGIxMjAwL01ha2VmaWxlIGIvYXJjaC9taXBzL2FsY2hlbXkvZGV2Ym9hcmRzL3BiMTIwMC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOGMzYTk5Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9taXBzL2FsY2hlbXkvZGV2Ym9hcmRzL3BiMTIwMC9NYWtlZmlsZQpAQCAtMCwwICsxLDcgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIHRoZSBBbGNoZW15IFNlbWljb25kdWN0b3IgUGIxMjAwL0RCQXUxMjAwIGJvYXJkcy4KKyMKKworb2JqLXkgOj0gYm9hcmRfc2V0dXAubyBpcnFtYXAubyBwbGF0Zm9ybS5vCisKK0VYVFJBX0NGTEFHUyArPSAtV2Vycm9yCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvYWxjaGVteS9kZXZib2FyZHMvcGIxMjAwL2JvYXJkX3NldHVwLmMgYi9hcmNoL21pcHMvYWxjaGVteS9kZXZib2FyZHMvcGIxMjAwL2JvYXJkX3NldHVwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTRlNmI3ZQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbWlwcy9hbGNoZW15L2RldmJvYXJkcy9wYjEyMDAvYm9hcmRfc2V0dXAuYwpAQCAtMCwwICsxLDE2NCBAQAorLyoKKyAqCisgKiBCUklFRiBNT0RVTEUgREVTQ1JJUFRJT04KKyAqCUFsY2hlbXkgUGIxMjAwL0RiMTIwMCBib2FyZCBzZXR1cC4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVEhJUyAgU09GVFdBUkUgIElTIFBST1ZJREVEICAgYGBBUyAgSVMnJyBBTkQgICBBTlkgIEVYUFJFU1MgT1IgSU1QTElFRAorICogIFdBUlJBTlRJRVMsICAgSU5DTFVESU5HLCBCVVQgTk9UICBMSU1JVEVEICBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTgorICogIE5PICBFVkVOVCAgU0hBTEwgICBUSEUgQVVUSE9SICBCRSAgICBMSUFCTEUgRk9SIEFOWSAgIERJUkVDVCwgSU5ESVJFQ1QsCisgKiAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiAgTk9UIExJTUlURUQgICBUTywgUFJPQ1VSRU1FTlQgT0YgIFNVQlNUSVRVVEUgR09PRFMgIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCisgKiAgVVNFLCBEQVRBLCAgT1IgUFJPRklUUzsgT1IgIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OCisgKiAgQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiAgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiAgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorCisjaW5jbHVkZSA8cHJvbS5oPgorI2luY2x1ZGUgPGF1MXh4eC5oPgorCisKK2NvbnN0IGNoYXIgKmdldF9zeXN0ZW1fdHlwZSh2b2lkKQoreworCXJldHVybiAiQWxjaGVteSBQYjEyMDAiOworfQorCit2b2lkIGJvYXJkX3Jlc2V0KHZvaWQpCit7CisJYmNzci0+cmVzZXRzID0gMDsKKwliY3NyLT5zeXN0ZW0gPSAwOworfQorCit2b2lkIF9faW5pdCBib2FyZF9zZXR1cCh2b2lkKQoreworCWNoYXIgKmFyZ3B0cjsKKworCWFyZ3B0ciA9IHByb21fZ2V0Y21kbGluZSgpOworI2lmZGVmIENPTkZJR19TRVJJQUxfODI1MF9DT05TT0xFCisJYXJncHRyID0gc3Ryc3RyKGFyZ3B0ciwgImNvbnNvbGU9Iik7CisJaWYgKGFyZ3B0ciA9PSBOVUxMKSB7CisJCWFyZ3B0ciA9IHByb21fZ2V0Y21kbGluZSgpOworCQlzdHJjYXQoYXJncHRyLCAiIGNvbnNvbGU9dHR5UzAsMTE1MjAwIik7CisJfQorI2VuZGlmCisjaWZkZWYgQ09ORklHX0ZCX0FVMTIwMAorCXN0cmNhdChhcmdwdHIsICIgdmlkZW89YXUxMjAwZmI6cGFuZWw6YnMiKTsKKyNlbmRpZgorCisjaWYgMAorCXsKKwkJdTMyIHBpbl9mdW5jOworCisJCS8qCisJCSAqIEVuYWJsZSBQU0MxIFNZTkMgZm9yIEFDOTcuICBOb3JtYWx5IGRvbmUgaW4gYXVkaW8gZHJpdmVyLAorCQkgKiBidXQgaXQgaXMgYm9hcmQgc3BlY2lmaWMgY29kZSwgc28gcHV0IGl0IGhlcmUuCisJCSAqLworCQlwaW5fZnVuYyA9IGF1X3JlYWRsKFNZU19QSU5GVU5DKTsKKwkJYXVfc3luYygpOworCQlwaW5fZnVuYyB8PSBTWVNfUEZfTVVTVF9CRV9TRVQgfCBTWVNfUEZfUFNDMV9TMTsKKwkJYXVfd3JpdGVsKHBpbl9mdW5jLCBTWVNfUElORlVOQyk7CisKKwkJYXVfd3JpdGVsKDAsICh1MzIpYmNzciB8IDB4MTApOyAvKiB0dXJuIG9mZiBQQ01DSUEgcG93ZXIgKi8KKwkJYXVfc3luYygpOworCX0KKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfSTJDX0FVMTU1MCkKKwl7CisJCXUzMiBmcmVxMCwgY2xrc3JjOworCQl1MzIgcGluX2Z1bmM7CisKKwkJLyogU2VsZWN0IFNNQnVzIGluIENQTEQgKi8KKwkJYmNzci0+cmVzZXRzICY9IH5CQ1NSX1JFU0VUU19QQ1MwTVVYOworCisJCXBpbl9mdW5jID0gYXVfcmVhZGwoU1lTX1BJTkZVTkMpOworCQlhdV9zeW5jKCk7CisJCXBpbl9mdW5jICY9IH4oU1lTX1BJTkZVTkNfUDBBIHwgU1lTX1BJTkZVTkNfUDBCKTsKKwkJLyogU2V0IEdQSU9zIGNvcnJlY3RseSAqLworCQlwaW5fZnVuYyB8PSAyIDw8IDE3OworCQlhdV93cml0ZWwocGluX2Z1bmMsIFNZU19QSU5GVU5DKTsKKwkJYXVfc3luYygpOworCisJCS8qIFRoZSBJMkMgZHJpdmVyIGRlcGVuZHMgb24gNTAgTUh6IGNsb2NrICovCisJCWZyZXEwID0gYXVfcmVhZGwoU1lTX0ZSRVFDVFJMMCk7CisJCWF1X3N5bmMoKTsKKwkJZnJlcTAgJj0gfihTWVNfRkNfRlJESVYxX01BU0sgfCBTWVNfRkNfRlMxIHwgU1lTX0ZDX0ZFMSk7CisJCWZyZXEwIHw9IDMgPDwgU1lTX0ZDX0ZSRElWMV9CSVQ7CisJCS8qIDM5NiBNSHogLyAoMyArIDEpICogMiA9PSA0OS41IE1IeiAqLworCQlhdV93cml0ZWwoZnJlcTAsIFNZU19GUkVRQ1RSTDApOworCQlhdV9zeW5jKCk7CisJCWZyZXEwIHw9IFNZU19GQ19GRTE7CisJCWF1X3dyaXRlbChmcmVxMCwgU1lTX0ZSRVFDVFJMMCk7CisJCWF1X3N5bmMoKTsKKworCQljbGtzcmMgPSBhdV9yZWFkbChTWVNfQ0xLU1JDKTsKKwkJYXVfc3luYygpOworCQljbGtzcmMgJj0gfihTWVNfQ1NfQ0UwIHwgU1lTX0NTX0RFMCB8IFNZU19DU19NRTBfTUFTSyk7CisJCS8qIEJpdCAyMiBpcyBFWFRDTEswIGZvciBQU0MwICovCisJCWNsa3NyYyB8PSBTWVNfQ1NfTVVYX0ZRMSA8PCBTWVNfQ1NfTUUwX0JJVDsKKwkJYXVfd3JpdGVsKGNsa3NyYywgU1lTX0NMS1NSQyk7CisJCWF1X3N5bmMoKTsKKwl9CisjZW5kaWYKKworCS8qCisJICogVGhlIFBiMTIwMCBkZXZlbG9wbWVudCBib2FyZCB1c2VzIGV4dGVybmFsIE1VWCBmb3IgUFNDMCB0bworCSAqIHN1cHBvcnQgU01CL1NQSS4gYmNzci0+cmVzZXRzIGJpdCAxMjogMD1TTUIgMT1TUEkKKwkgKi8KKyNpZmRlZiBDT05GSUdfSTJDX0FVMTU1MAorCWJjc3ItPnJlc2V0cyAmPSB+QkNTUl9SRVNFVFNfUENTME1VWDsKKyNlbmRpZgorCWF1X3N5bmMoKTsKKworI2lmZGVmIENPTkZJR19NSVBTX1BCMTIwMAorCXByaW50ayhLRVJOX0lORk8gIkFNRCBBbGNoZW15IFBiMTIwMCBCb2FyZFxuIik7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfTUlQU19EQjEyMDAKKwlwcmludGsoS0VSTl9JTkZPICJBTUQgQWxjaGVteSBEYjEyMDAgQm9hcmRcbiIpOworI2VuZGlmCit9CisKK2ludCBib2FyZF9hdTEyMDBmYl9wYW5lbCh2b2lkKQoreworCUJDU1IgKmJjc3IgPSAoQkNTUiAqKUJDU1JfS1NFRzFfQUREUjsKKwlpbnQgcDsKKworCXAgPSBiY3NyLT5zd2l0Y2hlczsKKwlwID4+PSA4OworCXAgJj0gMHgwRjsKKwlyZXR1cm4gcDsKK30KKworaW50IGJvYXJkX2F1MTIwMGZiX3BhbmVsX2luaXQodm9pZCkKK3sKKwkvKiBBcHBseSBwb3dlciAqLworCUJDU1IgKmJjc3IgPSAoQkNTUiAqKUJDU1JfS1NFRzFfQUREUjsKKworCWJjc3ItPmJvYXJkIHw9IEJDU1JfQk9BUkRfTENEVkVFIHwgQkNTUl9CT0FSRF9MQ0RWREQgfCBCQ1NSX0JPQVJEX0xDREJMOworCS8qIHByaW50ayhLRVJOX0RFQlVHICJib2FyZF9hdTEyMDBmYl9wYW5lbF9pbml0KClcbiIpOyAqLworCXJldHVybiAwOworfQorCitpbnQgYm9hcmRfYXUxMjAwZmJfcGFuZWxfc2h1dGRvd24odm9pZCkKK3sKKwkvKiBSZW1vdmUgcG93ZXIgKi8KKwlCQ1NSICpiY3NyID0gKEJDU1IgKilCQ1NSX0tTRUcxX0FERFI7CisKKwliY3NyLT5ib2FyZCAmPSB+KEJDU1JfQk9BUkRfTENEVkVFIHwgQkNTUl9CT0FSRF9MQ0RWREQgfAorCQkJIEJDU1JfQk9BUkRfTENEQkwpOworCS8qIHByaW50ayhLRVJOX0RFQlVHICJib2FyZF9hdTEyMDBmYl9wYW5lbF9zaHV0ZG93bigpXG4iKTsgKi8KKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9hbGNoZW15L2RldmJvYXJkcy9wYjEyMDAvaXJxbWFwLmMgYi9hcmNoL21pcHMvYWxjaGVteS9kZXZib2FyZHMvcGIxMjAwL2lycW1hcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlNDc0OTgKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21pcHMvYWxjaGVteS9kZXZib2FyZHMvcGIxMjAwL2lycW1hcC5jCkBAIC0wLDAgKzEsMTM0IEBACisvKgorICogQlJJRUYgTU9EVUxFIERFU0NSSVBUSU9OCisgKglBdTF4eHggaXJxIG1hcCB0YWJsZQorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUJIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqICB1bmRlciAgdGhlIHRlcm1zIG9mCSB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQlMaWNlbnNlLCBvciAoYXQgeW91cgorICogIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRISVMgIFNPRlRXQVJFICBJUyBQUk9WSURFRAkgIGBgQVMJSVMnJyBBTkQgICBBTlkJRVhQUkVTUyBPUiBJTVBMSUVECisgKiAgV0FSUkFOVElFUywJICBJTkNMVURJTkcsIEJVVCBOT1QgIExJTUlURUQgIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiAgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOCisgKiAgTk8JRVZFTlQgIFNIQUxMICAgVEhFIEFVVEhPUiAgQkUJIExJQUJMRSBGT1IgQU5ZCSAgRElSRUNULCBJTkRJUkVDVCwKKyAqICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqICBOT1QgTElNSVRFRAkgIFRPLCBQUk9DVVJFTUVOVCBPRiAgU1VCU1RJVFVURSBHT09EUwlPUiBTRVJWSUNFUzsgTE9TUyBPRgorICogIFVTRSwgREFUQSwJT1IgUFJPRklUUzsgT1IJQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04KKyAqICBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgkgQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqICAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqICBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSAgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqICA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorCisjaW5jbHVkZSA8YXNtL21hY2gtYXUxeDAwL2F1MTAwMC5oPgorCisjaWZkZWYgQ09ORklHX01JUFNfUEIxMjAwCisjaW5jbHVkZSA8YXNtL21hY2gtcGIxeDAwL3BiMTIwMC5oPgorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfTUlQU19EQjEyMDAKKyNpbmNsdWRlIDxhc20vbWFjaC1kYjF4MDAvZGIxMjAwLmg+CisjZGVmaW5lIFBCMTIwMF9JTlRfQkVHSU4gREIxMjAwX0lOVF9CRUdJTgorI2RlZmluZSBQQjEyMDBfSU5UX0VORCBEQjEyMDBfSU5UX0VORAorI2VuZGlmCisKK3N0cnVjdCBhdTF4eHhfaXJxbWFwIF9faW5pdGRhdGEgYXUxeHh4X2lycV9tYXBbXSA9IHsKKwkvKiBUaGlzIGlzIGV4dGVybmFsIGludGVycnVwdCBjYXNjYWRlICovCisJeyBBVTEwMDBfR1BJT183LCBJUlFGX1RSSUdHRVJfTE9XLCAwIH0sCit9OworCisKKy8qCisgKiBTdXBwb3J0IGZvciBFeHRlcm5hbCBpbnRlcnJ1cHRzIG9uIHRoZSBQYjEyMDAgRGV2ZWxvcG1lbnQgcGxhdGZvcm0uCisgKi8KKworc3RhdGljIHZvaWQgcGIxMjAwX2Nhc2NhZGVfaGFuZGxlcih1bnNpZ25lZCBpbnQgaXJxLCBzdHJ1Y3QgaXJxX2Rlc2MgKmQpCit7CisJdW5zaWduZWQgc2hvcnQgYmlzciA9IGJjc3ItPmludF9zdGF0dXM7CisKKwlmb3IgKCA7IGJpc3I7IGJpc3IgJj0gYmlzciAtIDEpCisJCWdlbmVyaWNfaGFuZGxlX2lycShQQjEyMDBfSU5UX0JFR0lOICsgX19mZnMoYmlzcikpOworfQorCisvKiBOT1RFOiBib3RoIHRoZSBlbmFibGUgYW5kIG1hc2sgYml0cyBtdXN0IGJlIGNsZWFyZWQsIG90aGVyd2lzZSB0aGUKKyAqIENQTEQgZ2VuZXJhdGVzIHRvbnMgb2Ygc3B1cmlvdXMgaW50ZXJydXB0cyAoYXQgbGVhc3Qgb24gdGhlIERCMTIwMCkuCisgKi8KK3N0YXRpYyB2b2lkIHBiMTIwMF9tYXNrX2lycSh1bnNpZ25lZCBpbnQgaXJxX25yKQoreworCWJjc3ItPmludGNscl9tYXNrID0gMSA8PCAoaXJxX25yIC0gUEIxMjAwX0lOVF9CRUdJTik7CisJYmNzci0+aW50Y2xyID0gMSA8PCAoaXJxX25yIC0gUEIxMjAwX0lOVF9CRUdJTik7CisJYXVfc3luYygpOworfQorCitzdGF0aWMgdm9pZCBwYjEyMDBfbWFza2Fja19pcnEodW5zaWduZWQgaW50IGlycV9ucikKK3sKKwliY3NyLT5pbnRjbHJfbWFzayA9IDEgPDwgKGlycV9uciAtIFBCMTIwMF9JTlRfQkVHSU4pOworCWJjc3ItPmludGNsciA9IDEgPDwgKGlycV9uciAtIFBCMTIwMF9JTlRfQkVHSU4pOworCWJjc3ItPmludF9zdGF0dXMgPSAxIDw8IChpcnFfbnIgLSBQQjEyMDBfSU5UX0JFR0lOKTsJLyogYWNrICovCisJYXVfc3luYygpOworfQorCitzdGF0aWMgdm9pZCBwYjEyMDBfdW5tYXNrX2lycSh1bnNpZ25lZCBpbnQgaXJxX25yKQoreworCWJjc3ItPmludHNldCA9IDEgPDwgKGlycV9uciAtIFBCMTIwMF9JTlRfQkVHSU4pOworCWJjc3ItPmludHNldF9tYXNrID0gMSA8PCAoaXJxX25yIC0gUEIxMjAwX0lOVF9CRUdJTik7CisJYXVfc3luYygpOworfQorCitzdGF0aWMgc3RydWN0IGlycV9jaGlwIHBiMTIwMF9jcGxkX2lycV90eXBlID0geworI2lmZGVmIENPTkZJR19NSVBTX1BCMTIwMAorCS5uYW1lID0gIlBiMTIwMCBFeHQiLAorI2VuZGlmCisjaWZkZWYgQ09ORklHX01JUFNfREIxMjAwCisJLm5hbWUgPSAiRGIxMjAwIEV4dCIsCisjZW5kaWYKKwkubWFzawkJPSBwYjEyMDBfbWFza19pcnEsCisJLm1hc2tfYWNrCT0gcGIxMjAwX21hc2thY2tfaXJxLAorCS51bm1hc2sJCT0gcGIxMjAwX3VubWFza19pcnEsCit9OworCit2b2lkIF9faW5pdCBib2FyZF9pbml0X2lycSh2b2lkKQoreworCXVuc2lnbmVkIGludCBpcnE7CisKKwlhdTF4eHhfc2V0dXBfaXJxbWFwKGF1MXh4eF9pcnFfbWFwLCBBUlJBWV9TSVpFKGF1MXh4eF9pcnFfbWFwKSk7CisKKyNpZmRlZiBDT05GSUdfTUlQU19QQjEyMDAKKwkvKiBXZSBoYXZlIGEgcHJvYmxlbSB3aXRoIENQTEQgcmV2IDMuICovCisJaWYgKCgoYmNzci0+d2hvYW1pICYgQkNTUl9XSE9BTUlfQ1BMRCkgPj4gNCkgPD0gMykgeworCQlwcmludGsoS0VSTl9FUlIgIldBUk5JTkchISFcbiIpOworCQlwcmludGsoS0VSTl9FUlIgIldBUk5JTkchISFcbiIpOworCQlwcmludGsoS0VSTl9FUlIgIldBUk5JTkchISFcbiIpOworCQlwcmludGsoS0VSTl9FUlIgIldBUk5JTkchISFcbiIpOworCQlwcmludGsoS0VSTl9FUlIgIldBUk5JTkchISFcbiIpOworCQlwcmludGsoS0VSTl9FUlIgIldBUk5JTkchISFcbiIpOworCQlwcmludGsoS0VSTl9FUlIgIlBiMTIwMCBtdXN0IGJlIGF0IENQTEQgcmV2IDQuIFBsZWFzZSBoYXZlIFBiMTIwMFxuIik7CisJCXByaW50ayhLRVJOX0VSUiAidXBkYXRlZCB0byBsYXRlc3QgcmV2aXNpb24uIFRoaXMgc29mdHdhcmUgd2lsbFxuIik7CisJCXByaW50ayhLRVJOX0VSUiAibm90IHdvcmsgb24gYW55dGhpbmcgbGVzcyB0aGFuIENQTEQgcmV2IDQuXG4iKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJXQVJOSU5HISEhXG4iKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJXQVJOSU5HISEhXG4iKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJXQVJOSU5HISEhXG4iKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJXQVJOSU5HISEhXG4iKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJXQVJOSU5HISEhXG4iKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJXQVJOSU5HISEhXG4iKTsKKwkJcGFuaWMoIkdhbWUgb3Zlci4gIFlvdXIgc2NvcmUgaXMgMC4iKTsKKwl9CisjZW5kaWYKKwkvKiBtYXNrICYgZGlzYWJsZSAmIGFjayBhbGwgKi8KKwliY3NyLT5pbnRjbHJfbWFzayA9IDB4ZmZmZjsKKwliY3NyLT5pbnRjbHIgPSAweGZmZmY7CisJYmNzci0+aW50X3N0YXR1cyA9IDB4ZmZmZjsKKwlhdV9zeW5jKCk7CisKKwlmb3IgKGlycSA9IFBCMTIwMF9JTlRfQkVHSU47IGlycSA8PSBQQjEyMDBfSU5UX0VORDsgaXJxKyspCisJCXNldF9pcnFfY2hpcF9hbmRfaGFuZGxlcl9uYW1lKGlycSwgJnBiMTIwMF9jcGxkX2lycV90eXBlLAorCQkJCQkgaGFuZGxlX2xldmVsX2lycSwgImxldmVsIik7CisKKwlzZXRfaXJxX2NoYWluZWRfaGFuZGxlcihBVTEwMDBfR1BJT183LCBwYjEyMDBfY2FzY2FkZV9oYW5kbGVyKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9hbGNoZW15L3BiMTIwMC9wbGF0Zm9ybS5jIGIvYXJjaC9taXBzL2FsY2hlbXkvZGV2Ym9hcmRzL3BiMTIwMC9wbGF0Zm9ybS5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcmNoL21pcHMvYWxjaGVteS9wYjEyMDAvcGxhdGZvcm0uYwpyZW5hbWUgdG8gYXJjaC9taXBzL2FsY2hlbXkvZGV2Ym9hcmRzL3BiMTIwMC9wbGF0Zm9ybS5jCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvYWxjaGVteS9kZXZib2FyZHMvcGIxNTAwL01ha2VmaWxlIGIvYXJjaC9taXBzL2FsY2hlbXkvZGV2Ym9hcmRzL3BiMTUwMC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzNiNDE5Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9taXBzL2FsY2hlbXkvZGV2Ym9hcmRzL3BiMTUwMC9NYWtlZmlsZQpAQCAtMCwwICsxLDggQEAKKyMKKyMgIENvcHlyaWdodCAyMDAwLCAyMDAxLCAyMDA4IE1vbnRhVmlzdGEgU29mdHdhcmUgSW5jLgorIyAgQXV0aG9yOiBNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuIDxzb3VyY2VAbXZpc3RhLmNvbT4KKyMKKyMgTWFrZWZpbGUgZm9yIHRoZSBBbGNoZW15IFNlbWljb25kdWN0b3IgUGIxNTAwIGJvYXJkLgorIworCitvYmoteSA6PSBib2FyZF9zZXR1cC5vCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvYWxjaGVteS9kZXZib2FyZHMvcGIxNTAwL2JvYXJkX3NldHVwLmMgYi9hcmNoL21pcHMvYWxjaGVteS9kZXZib2FyZHMvcGIxNTAwL2JvYXJkX3NldHVwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmVkM2IwOQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbWlwcy9hbGNoZW15L2RldmJvYXJkcy9wYjE1MDAvYm9hcmRfc2V0dXAuYwpAQCAtMCwwICsxLDE2MyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAwLCAyMDA4IE1vbnRhVmlzdGEgU29mdHdhcmUgSW5jLgorICogQXV0aG9yOiBNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuIDxzb3VyY2VAbXZpc3RhLmNvbT4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVEhJUyAgU09GVFdBUkUgIElTIFBST1ZJREVEICAgYGBBUyAgSVMnJyBBTkQgICBBTlkgIEVYUFJFU1MgT1IgSU1QTElFRAorICogIFdBUlJBTlRJRVMsICAgSU5DTFVESU5HLCBCVVQgTk9UICBMSU1JVEVEICBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTgorICogIE5PICBFVkVOVCAgU0hBTEwgICBUSEUgQVVUSE9SICBCRSAgICBMSUFCTEUgRk9SIEFOWSAgIERJUkVDVCwgSU5ESVJFQ1QsCisgKiAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiAgTk9UIExJTUlURUQgICBUTywgUFJPQ1VSRU1FTlQgT0YgIFNVQlNUSVRVVEUgR09PRFMgIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCisgKiAgVVNFLCBEQVRBLCAgT1IgUFJPRklUUzsgT1IgIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OCisgKiAgQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiAgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiAgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorCisjaW5jbHVkZSA8YXNtL21hY2gtYXUxeDAwL2F1MTAwMC5oPgorI2luY2x1ZGUgPGFzbS9tYWNoLXBiMXgwMC9wYjE1MDAuaD4KKworI2luY2x1ZGUgPHByb20uaD4KKworCitjaGFyIGlycV90YWJfYWxjaGVteVtdWzVdIF9faW5pdGRhdGEgPSB7CisJWzEyXSA9IHsgLTEsIElOVEEsIElOVFgsIElOVFgsIElOVFggfSwgICAvKiBJRFNFTCAxMiAtIEhQVDM3MAkqLworCVsxM10gPSB7IC0xLCBJTlRBLCBJTlRCLCBJTlRDLCBJTlREIH0sICAgLyogSURTRUwgMTMgLSBQQ0kgc2xvdCAqLworfTsKKworc3RydWN0IGF1MXh4eF9pcnFtYXAgX19pbml0ZGF0YSBhdTF4eHhfaXJxX21hcFtdID0geworCXsgQVUxNTAwX0dQSU9fMjA0LCBJUlFGX1RSSUdHRVJfSElHSCwgMCB9LAorCXsgQVUxNTAwX0dQSU9fMjAxLCBJUlFGX1RSSUdHRVJfTE9XLCAwIH0sCisJeyBBVTE1MDBfR1BJT18yMDIsIElSUUZfVFJJR0dFUl9MT1csIDAgfSwKKwl7IEFVMTUwMF9HUElPXzIwMywgSVJRRl9UUklHR0VSX0xPVywgMCB9LAorCXsgQVUxNTAwX0dQSU9fMjA1LCBJUlFGX1RSSUdHRVJfTE9XLCAwIH0sCit9OworCisKK2NvbnN0IGNoYXIgKmdldF9zeXN0ZW1fdHlwZSh2b2lkKQoreworCXJldHVybiAiQWxjaGVteSBQYjE1MDAiOworfQorCit2b2lkIGJvYXJkX3Jlc2V0KHZvaWQpCit7CisJLyogSGl0IEJDU1IuUlNUX1ZERElbU09GVF9SRVNFVF0gKi8KKwlhdV93cml0ZWwoMHgwMDAwMDAwMCwgUEIxNTAwX1JTVF9WRERJKTsKK30KKwordm9pZCBfX2luaXQgYm9hcmRfaW5pdF9pcnEodm9pZCkKK3sKKwlhdTF4eHhfc2V0dXBfaXJxbWFwKGF1MXh4eF9pcnFfbWFwLCBBUlJBWV9TSVpFKGF1MXh4eF9pcnFfbWFwKSk7Cit9CisKK3ZvaWQgX19pbml0IGJvYXJkX3NldHVwKHZvaWQpCit7CisJdTMyIHBpbl9mdW5jOworCXUzMiBzeXNfZnJlcWN0cmwsIHN5c19jbGtzcmM7CisJY2hhciAqYXJncHRyOworCisJYXJncHRyID0gcHJvbV9nZXRjbWRsaW5lKCk7CisjaWZkZWYgQ09ORklHX1NFUklBTF84MjUwX0NPTlNPTEUKKwlhcmdwdHIgPSBzdHJzdHIoYXJncHRyLCAiY29uc29sZT0iKTsKKwlpZiAoYXJncHRyID09IE5VTEwpIHsKKwkJYXJncHRyID0gcHJvbV9nZXRjbWRsaW5lKCk7CisJCXN0cmNhdChhcmdwdHIsICIgY29uc29sZT10dHlTMCwxMTUyMDAiKTsKKwl9CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX1NPVU5EX0FVMVgwMCkgJiYgIWRlZmluZWQoQ09ORklHX1NPQ19BVTEwMDApCisJLyogYXUxMDAwIGRvZXMgbm90IHN1cHBvcnQgdnJhLCBhdTE1MDAgYW5kIGF1MTEwMCBkbyAqLworCXN0cmNhdChhcmdwdHIsICIgYXUxMDAwX2F1ZGlvPXZyYSIpOworCWFyZ3B0ciA9IHByb21fZ2V0Y21kbGluZSgpOworI2VuZGlmCisKKwlzeXNfY2xrc3JjID0gc3lzX2ZyZXFjdHJsID0gcGluX2Z1bmMgPSAwOworCS8qIFNldCBBVVggY2xvY2sgdG8gMTIgTUh6ICogOCA9IDk2IE1IeiAqLworCWF1X3dyaXRlbCg4LCBTWVNfQVVYUExMKTsKKwlhdV93cml0ZWwoMCwgU1lTX1BJTlNUQVRFUkQpOworCXVkZWxheSgxMDApOworCisjaWYgZGVmaW5lZChDT05GSUdfVVNCX09IQ0lfSENEKSB8fCBkZWZpbmVkKENPTkZJR19VU0JfT0hDSV9IQ0RfTU9EVUxFKQorCisJLyogR1BJTzIwMSBpcyBpbnB1dCBmb3IgUENNQ0lBIGNhcmQgZGV0ZWN0ICovCisJLyogR1BJTzIwMyBpcyBpbnB1dCBmb3IgUENNQ0lBIGludGVycnVwdCByZXF1ZXN0ICovCisJYXVfd3JpdGVsKGF1X3JlYWRsKEdQSU8yX0RJUikgJiB+KCgxIDw8IDEpIHwgKDEgPDwgMykpLCBHUElPMl9ESVIpOworCisJLyogWmVybyBhbmQgZGlzYWJsZSBGUkVRMiAqLworCXN5c19mcmVxY3RybCA9IGF1X3JlYWRsKFNZU19GUkVRQ1RSTDApOworCXN5c19mcmVxY3RybCAmPSB+MHhGRkYwMDAwMDsKKwlhdV93cml0ZWwoc3lzX2ZyZXFjdHJsLCBTWVNfRlJFUUNUUkwwKTsKKworCS8qIHplcm8gYW5kIGRpc2FibGUgVVNCSC9VU0JEIGNsb2NrcyAqLworCXN5c19jbGtzcmMgPSBhdV9yZWFkbChTWVNfQ0xLU1JDKTsKKwlzeXNfY2xrc3JjICY9IH4oU1lTX0NTX0NVRCB8IFNZU19DU19EVUQgfCBTWVNfQ1NfTVVEX01BU0sgfAorCQkJU1lTX0NTX0NVSCB8IFNZU19DU19EVUggfCBTWVNfQ1NfTVVIX01BU0spOworCWF1X3dyaXRlbChzeXNfY2xrc3JjLCBTWVNfQ0xLU1JDKTsKKworCXN5c19mcmVxY3RybCA9IGF1X3JlYWRsKFNZU19GUkVRQ1RSTDApOworCXN5c19mcmVxY3RybCAmPSB+MHhGRkYwMDAwMDsKKworCXN5c19jbGtzcmMgPSBhdV9yZWFkbChTWVNfQ0xLU1JDKTsKKwlzeXNfY2xrc3JjICY9IH4oU1lTX0NTX0NVRCB8IFNZU19DU19EVUQgfCBTWVNfQ1NfTVVEX01BU0sgfAorCQkJU1lTX0NTX0NVSCB8IFNZU19DU19EVUggfCBTWVNfQ1NfTVVIX01BU0spOworCisJLyogRlJFUTIgPSBhdXgvMiA9IDQ4IE1IeiAqLworCXN5c19mcmVxY3RybCB8PSAoMCA8PCBTWVNfRkNfRlJESVYyX0JJVCkgfCBTWVNfRkNfRkUyIHwgU1lTX0ZDX0ZTMjsKKwlhdV93cml0ZWwoc3lzX2ZyZXFjdHJsLCBTWVNfRlJFUUNUUkwwKTsKKworCS8qCisJICogUm91dGUgNDhNSHogRlJFUTIgaW50byBVU0IgSG9zdCBhbmQvb3IgRGV2aWNlCisJICovCisJc3lzX2Nsa3NyYyB8PSBTWVNfQ1NfTVVYX0ZRMiA8PCBTWVNfQ1NfTVVIX0JJVDsKKwlhdV93cml0ZWwoc3lzX2Nsa3NyYywgU1lTX0NMS1NSQyk7CisKKwlwaW5fZnVuYyA9IGF1X3JlYWRsKFNZU19QSU5GVU5DKSAmIH5TWVNfUEZfVVNCOworCS8qIDJuZCBVU0IgcG9ydCBpcyBVU0IgaG9zdCAqLworCXBpbl9mdW5jIHw9IFNZU19QRl9VU0I7CisJYXVfd3JpdGVsKHBpbl9mdW5jLCBTWVNfUElORlVOQyk7CisjZW5kaWYgLyogZGVmaW5lZChDT05GSUdfVVNCX09IQ0lfSENEKSB8fCBkZWZpbmVkKENPTkZJR19VU0JfT0hDSV9IQ0RfTU9EVUxFKSAqLworCisjaWZkZWYgQ09ORklHX1BDSQorCS8qIFNldHVwIFBDSSBidXMgY29udHJvbGxlciAqLworCWF1X3dyaXRlbCgwLCBBdTE1MDBfUENJX0NNRU0pOworCWF1X3dyaXRlbCgweDAwMDAzZmZmLCBBdTE1MDBfQ0ZHX0JBU0UpOworI2lmIGRlZmluZWQoX19NSVBTRUJfXykKKwlhdV93cml0ZWwoMHhmIHwgKDIgPDwgNikgfCAoMSA8PCA0KSwgQXUxNTAwX1BDSV9DRkcpOworI2Vsc2UKKwlhdV93cml0ZWwoMHhmLCBBdTE1MDBfUENJX0NGRyk7CisjZW5kaWYKKwlhdV93cml0ZWwoMHhmMDAwMDAwMCwgQXUxNTAwX1BDSV9NV01BU0tfREVWKTsKKwlhdV93cml0ZWwoMCwgQXUxNTAwX1BDSV9NV0JBU0VfUkVWX0NDTCk7CisJYXVfd3JpdGVsKDB4MDJhMDAzNTYsIEF1MTUwMF9QQ0lfU1RBVENNRCk7CisJYXVfd3JpdGVsKDB4MDAwMDNjMDQsIEF1MTUwMF9QQ0lfSERSVFlQRSk7CisJYXVfd3JpdGVsKDB4MDAwMDAwMDgsIEF1MTUwMF9QQ0lfTUJBUik7CisJYXVfc3luYygpOworI2VuZGlmCisKKwkvKiBFbmFibGUgc3lzIGJ1cyBjbG9jayBkaXZpZGVyIHdoZW4gSURMRSBzdGF0ZSBvciBubyBidXMgYWN0aXZpdHkuICovCisJYXVfd3JpdGVsKGF1X3JlYWRsKFNZU19QT1dFUkNUUkwpIHwgKDB4MyA8PCA1KSwgU1lTX1BPV0VSQ1RSTCk7CisKKwkvKiBFbmFibGUgdGhlIFJUQyBpZiBub3QgYWxyZWFkeSBlbmFibGVkICovCisJaWYgKCEoYXVfcmVhZGwoMHhhYzAwMDAyOCkgJiAweDIwKSkgeworCQlwcmludGsoS0VSTl9JTkZPICJlbmFibGluZyBjbG9jayAuLi5cbiIpOworCQlhdV93cml0ZWwoKGF1X3JlYWRsKDB4YWMwMDAwMjgpIHwgMHgyMCksIDB4YWMwMDAwMjgpOworCX0KKwkvKiBQdXQgdGhlIGNsb2NrIGluIEJDRCBtb2RlICovCisJaWYgKGF1X3JlYWRsKDB4YWMwMDAwMmMpICYgMHg0KSB7IC8qIHJlZyBCICovCisJCWF1X3dyaXRlbChhdV9yZWFkbCgweGFjMDAwMDJjKSAmIH4weDQsIDB4YWMwMDAwMmMpOworCQlhdV9zeW5jKCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2FsY2hlbXkvZGV2Ym9hcmRzL3BiMTU1MC9NYWtlZmlsZSBiL2FyY2gvbWlwcy9hbGNoZW15L2RldmJvYXJkcy9wYjE1NTAvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ZmOTViYwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbWlwcy9hbGNoZW15L2RldmJvYXJkcy9wYjE1NTAvTWFrZWZpbGUKQEAgLTAsMCArMSw4IEBACisjCisjICBDb3B5cmlnaHQgMjAwMCwgMjAwOCBNb250YVZpc3RhIFNvZnR3YXJlIEluYy4KKyMgIEF1dGhvcjogTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLiA8c291cmNlQG12aXN0YS5jb20+CisjCisjIE1ha2VmaWxlIGZvciB0aGUgQWxjaGVteSBTZW1pY29uZHVjdG9yIFBiMTU1MCBib2FyZC4KKyMKKworb2JqLXkgOj0gYm9hcmRfc2V0dXAubwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2FsY2hlbXkvZGV2Ym9hcmRzL3BiMTU1MC9ib2FyZF9zZXR1cC5jIGIvYXJjaC9taXBzL2FsY2hlbXkvZGV2Ym9hcmRzL3BiMTU1MC9ib2FyZF9zZXR1cC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2ZTllN2QKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21pcHMvYWxjaGVteS9kZXZib2FyZHMvcGIxNTUwL2JvYXJkX3NldHVwLmMKQEAgLTAsMCArMSw5MiBAQAorLyoKKyAqCisgKiBCUklFRiBNT0RVTEUgREVTQ1JJUFRJT04KKyAqCUFsY2hlbXkgUGIxNTUwIGJvYXJkIHNldHVwLgorICoKKyAqIENvcHlyaWdodCAyMDAwLCAyMDA4IE1vbnRhVmlzdGEgU29mdHdhcmUgSW5jLgorICogQXV0aG9yOiBNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuIDxzb3VyY2VAbXZpc3RhLmNvbT4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVEhJUyAgU09GVFdBUkUgIElTIFBST1ZJREVEICAgYGBBUyAgSVMnJyBBTkQgICBBTlkgIEVYUFJFU1MgT1IgSU1QTElFRAorICogIFdBUlJBTlRJRVMsICAgSU5DTFVESU5HLCBCVVQgTk9UICBMSU1JVEVEICBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTgorICogIE5PICBFVkVOVCAgU0hBTEwgICBUSEUgQVVUSE9SICBCRSAgICBMSUFCTEUgRk9SIEFOWSAgIERJUkVDVCwgSU5ESVJFQ1QsCisgKiAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiAgTk9UIExJTUlURUQgICBUTywgUFJPQ1VSRU1FTlQgT0YgIFNVQlNUSVRVVEUgR09PRFMgIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCisgKiAgVVNFLCBEQVRBLCAgT1IgUFJPRklUUzsgT1IgIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OCisgKiAgQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiAgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiAgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKworI2luY2x1ZGUgPGFzbS9tYWNoLWF1MXgwMC9hdTEwMDAuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC1wYjF4MDAvcGIxNTUwLmg+CisKKyNpbmNsdWRlIDxwcm9tLmg+CisKKworY2hhciBpcnFfdGFiX2FsY2hlbXlbXVs1XSBfX2luaXRkYXRhID0geworCVsxMl0gPSB7IC0xLCBJTlRCLCBJTlRDLCBJTlRELCBJTlRBIH0sIC8qIElEU0VMIDEyIC0gUENJIHNsb3QgMiAobGVmdCkgICovCisJWzEzXSA9IHsgLTEsIElOVEEsIElOVEIsIElOVEMsIElOVEQgfSwgLyogSURTRUwgMTMgLSBQQ0kgc2xvdCAxIChyaWdodCkgKi8KK307CisKK3N0cnVjdCBhdTF4eHhfaXJxbWFwIF9faW5pdGRhdGEgYXUxeHh4X2lycV9tYXBbXSA9IHsKKwl7IEFVMTAwMF9HUElPXzAsIElSUUZfVFJJR0dFUl9MT1csIDAgfSwKKwl7IEFVMTAwMF9HUElPXzEsIElSUUZfVFJJR0dFUl9MT1csIDAgfSwKK307CisKK2NvbnN0IGNoYXIgKmdldF9zeXN0ZW1fdHlwZSh2b2lkKQoreworCXJldHVybiAiQWxjaGVteSBQYjE1NTAiOworfQorCit2b2lkIGJvYXJkX3Jlc2V0KHZvaWQpCit7CisJLyogSGl0IEJDU1IuU1lTVEVNW1JFU0VUXSAqLworCWF1X3dyaXRldyhhdV9yZWFkdygweEFGMDAwMDFDKSAmIH5CQ1NSX1NZU1RFTV9SRVNFVCwgMHhBRjAwMDAxQyk7Cit9CisKK3ZvaWQgX19pbml0IGJvYXJkX2luaXRfaXJxKHZvaWQpCit7CisJYXUxeHh4X3NldHVwX2lycW1hcChhdTF4eHhfaXJxX21hcCwgQVJSQVlfU0laRShhdTF4eHhfaXJxX21hcCkpOworfQorCit2b2lkIF9faW5pdCBib2FyZF9zZXR1cCh2b2lkKQoreworCXUzMiBwaW5fZnVuYzsKKworI2lmZGVmIENPTkZJR19TRVJJQUxfODI1MF9DT05TT0xFCisJY2hhciAqYXJncHRyOworCWFyZ3B0ciA9IHByb21fZ2V0Y21kbGluZSgpOworCWFyZ3B0ciA9IHN0cnN0cihhcmdwdHIsICJjb25zb2xlPSIpOworCWlmIChhcmdwdHIgPT0gTlVMTCkgeworCQlhcmdwdHIgPSBwcm9tX2dldGNtZGxpbmUoKTsKKwkJc3RyY2F0KGFyZ3B0ciwgIiBjb25zb2xlPXR0eVMwLDExNTIwMCIpOworCX0KKyNlbmRpZgorCisJLyoKKwkgKiBFbmFibGUgUFNDMSBTWU5DIGZvciBBQyc5Ny4gIE5vcm1hbHkgZG9uZSBpbiBhdWRpbyBkcml2ZXIsCisJICogYnV0IGl0IGlzIGJvYXJkIHNwZWNpZmljIGNvZGUsIHNvIHB1dCBpdCBoZXJlLgorCSAqLworCXBpbl9mdW5jID0gYXVfcmVhZGwoU1lTX1BJTkZVTkMpOworCWF1X3N5bmMoKTsKKwlwaW5fZnVuYyB8PSBTWVNfUEZfTVVTVF9CRV9TRVQgfCBTWVNfUEZfUFNDMV9TMTsKKwlhdV93cml0ZWwocGluX2Z1bmMsIFNZU19QSU5GVU5DKTsKKworCWF1X3dyaXRlbCgwLCAodTMyKWJjc3IgfCAweDEwKTsgLyogdHVybiBvZmYgUENNQ0lBIHBvd2VyICovCisJYXVfc3luYygpOworCisJcHJpbnRrKEtFUk5fSU5GTyAiQU1EIEFsY2hlbXkgUGIxNTUwIEJvYXJkXG4iKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9hbGNoZW15L2RldmJvYXJkcy9wbS5jIGIvYXJjaC9taXBzL2FsY2hlbXkvZGV2Ym9hcmRzL3BtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDVlYjljMwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbWlwcy9hbGNoZW15L2RldmJvYXJkcy9wbS5jCkBAIC0wLDAgKzEsMjI5IEBACisvKgorICogQWxjaGVteSBEZXZlbG9wbWVudCBCb2FyZCBleGFtcGxlIHN1c3BlbmQgdXNlcnNwYWNlIGludGVyZmFjZS4KKyAqCisgKiAoYykgMjAwOCBNYW51ZWwgTGF1c3MgPG1hbm9Acm9hcmluZWxrLmhvbWVsaW51eC5uZXQ+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9rb2JqZWN0Lmg+CisjaW5jbHVkZSA8bGludXgvc3VzcGVuZC5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+CisjaW5jbHVkZSA8YXNtL21hY2gtYXUxeDAwL2F1MTAwMC5oPgorCisvKgorICogR2VuZXJpYyBzdXNwZW5kIHVzZXJzcGFjZSBpbnRlcmZhY2UgZm9yIEFsY2hlbXkgZGV2ZWxvcG1lbnQgYm9hcmRzLgorICogVGhpcyBjb2RlIGV4cG9ydHMgYSBmZXcgc3lzZnMgbm9kZXMgdW5kZXIgL3N5cy9wb3dlci9kYjF4LyB3aGljaAorICogY2FuIGJlIHVzZWQgYnkgdXNlcnNwYWNlIHRvIGVuL2Rpc2FibGUgYWxsIGF1MXgtcHJvdmlkZWQgd2FrZXVwCisgKiBzb3VyY2VzIGFuZCBjb25maWd1cmUgdGhlIHRpbWVvdXQgYWZ0ZXIgd2hpY2ggdGhlIHRoZSBUT1lNQVRDSDIgaXJxCisgKiBpcyB0byB0cmlnZ2VyIGEgd2FrZXVwLgorICovCisKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgZGIxeF9wbV9zbGVlcF9zZWNzOworc3RhdGljIHVuc2lnbmVkIGxvbmcgZGIxeF9wbV93YWtlbXNrOworc3RhdGljIHVuc2lnbmVkIGxvbmcgZGIxeF9wbV9sYXN0X3dha2VzcmM7CisKK3N0YXRpYyBpbnQgZGIxeF9wbV9lbnRlcihzdXNwZW5kX3N0YXRlX3Qgc3RhdGUpCit7CisJLyogZW5hYmxlIEdQSU8gYmFzZWQgd2FrZXVwICovCisJYXVfd3JpdGVsKDEsIFNZU19QSU5JTlBVVEVOKTsKKworCS8qIGNsZWFyIGFuZCBzZXR1cCB3YWtlIGNhdXNlIGFuZCBzb3VyY2UgKi8KKwlhdV93cml0ZWwoMCwgU1lTX1dBS0VNU0spOworCWF1X3N5bmMoKTsKKwlhdV93cml0ZWwoMCwgU1lTX1dBS0VTUkMpOworCWF1X3N5bmMoKTsKKworCWF1X3dyaXRlbChkYjF4X3BtX3dha2Vtc2ssIFNZU19XQUtFTVNLKTsKKwlhdV9zeW5jKCk7CisKKwkvKiBzZXR1cCAxSHotdGltZXItYmFzZWQgd2FrZXVwOiB3YWl0IGZvciByZWcgYWNjZXNzICovCisJd2hpbGUgKGF1X3JlYWRsKFNZU19DT1VOVEVSX0NOVFJMKSAmIFNZU19DTlRSTF9NMjApCisJCWFzbSB2b2xhdGlsZSAoIm5vcCIpOworCisJYXVfd3JpdGVsKGF1X3JlYWRsKFNZU19UT1lSRUFEKSArIGRiMXhfcG1fc2xlZXBfc2VjcywgU1lTX1RPWU1BVENIMik7CisJYXVfc3luYygpOworCisJLyogd2FpdCBmb3IgdmFsdWUgdG8gcmVhbGx5IGhpdCB0aGUgcmVnaXN0ZXIgKi8KKwl3aGlsZSAoYXVfcmVhZGwoU1lTX0NPVU5URVJfQ05UUkwpICYgU1lTX0NOVFJMX00yMCkKKwkJYXNtIHZvbGF0aWxlICgibm9wIik7CisKKwkvKiAuLi5hbmQgbm93IHRoZSBzYW5kbWFuIGNhbiBjb21lISAqLworCWF1X3NsZWVwKCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkYjF4X3BtX2JlZ2luKHN1c3BlbmRfc3RhdGVfdCBzdGF0ZSkKK3sKKwlpZiAoIWRiMXhfcG1fd2FrZW1zaykgeworCQlwcmludGsoS0VSTl9FUlIgImRiMXg6IG5vIHdha2V1cCBzb3VyY2UgYWN0aXZhdGVkIVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBkYjF4X3BtX2VuZCh2b2lkKQoreworCS8qIHJlYWQgYW5kIHN0b3JlIHdha2V1cCBzb3VyY2UsIHRoZSBjbGVhciB0aGUgcmVnaXN0ZXIuIFRvCisJICogYmUgYWJsZSB0byBjbGVhciBpdCwgV0FLRU1TSyBtdXN0IGJlIGNsZWFyZWQgZmlyc3QuCisJICovCisJZGIxeF9wbV9sYXN0X3dha2VzcmMgPSBhdV9yZWFkbChTWVNfV0FLRVNSQyk7CisKKwlhdV93cml0ZWwoMCwgU1lTX1dBS0VNU0spOworCWF1X3dyaXRlbCgwLCBTWVNfV0FLRVNSQyk7CisJYXVfc3luYygpOworCit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fc3VzcGVuZF9vcHMgZGIxeF9wbV9vcHMgPSB7CisJLnZhbGlkCQk9IHN1c3BlbmRfdmFsaWRfb25seV9tZW0sCisJLmJlZ2luCQk9IGRiMXhfcG1fYmVnaW4sCisJLmVudGVyCQk9IGRiMXhfcG1fZW50ZXIsCisJLmVuZAkJPSBkYjF4X3BtX2VuZCwKK307CisKKyNkZWZpbmUgQVRUUkNNUCh4KSAoMCA9PSBzdHJjbXAoYXR0ci0+YXR0ci5uYW1lLCAjeCkpCisKK3N0YXRpYyBzc2l6ZV90IGRiMXhfcG1hdHRyX3Nob3coc3RydWN0IGtvYmplY3QgKmtvYmosCisJCQkJc3RydWN0IGtvYmpfYXR0cmlidXRlICphdHRyLAorCQkJCWNoYXIgKmJ1ZikKK3sKKwlpbnQgaWR4OworCisJaWYgKEFUVFJDTVAodGltZXJfdGltZW91dCkpCisJCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVsdVxuIiwgZGIxeF9wbV9zbGVlcF9zZWNzKTsKKworCWVsc2UgaWYgKEFUVFJDTVAodGltZXIpKQorCQlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwKKwkJCQkhIShkYjF4X3BtX3dha2Vtc2sgJiBTWVNfV0FLRU1TS19NMikpOworCisJZWxzZSBpZiAoQVRUUkNNUCh3YWtlc3JjKSkKKwkJcmV0dXJuIHNwcmludGYoYnVmLCAiJWx1XG4iLCBkYjF4X3BtX2xhc3Rfd2FrZXNyYyk7CisKKwllbHNlIGlmIChBVFRSQ01QKGdwaW8wKSB8fCBBVFRSQ01QKGdwaW8xKSB8fCBBVFRSQ01QKGdwaW8yKSB8fAorCQkgQVRUUkNNUChncGlvMykgfHwgQVRUUkNNUChncGlvNCkgfHwgQVRUUkNNUChncGlvNSkgfHwKKwkJIEFUVFJDTVAoZ3BpbzYpIHx8IEFUVFJDTVAoZ3BpbzcpKSB7CisJCWlkeCA9IChhdHRyLT5hdHRyLm5hbWUpWzRdIC0gJzAnOworCQlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwKKwkJCSEhKGRiMXhfcG1fd2FrZW1zayAmIFNZU19XQUtFTVNLX0dQSU8oaWR4KSkpOworCisJfSBlbHNlIGlmIChBVFRSQ01QKHdha2Vtc2spKSB7CisJCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiUwOGx4XG4iLCBkYjF4X3BtX3dha2Vtc2spOworCX0KKworCXJldHVybiAtRU5PRU5UOworfQorCitzdGF0aWMgc3NpemVfdCBkYjF4X3BtYXR0cl9zdG9yZShzdHJ1Y3Qga29iamVjdCAqa29iaiwKKwkJCQkgc3RydWN0IGtvYmpfYXR0cmlidXRlICphdHRyLAorCQkJCSBjb25zdCBjaGFyICppbnN0ciwKKwkJCQkgc2l6ZV90IGJ5dGVzKQoreworCXVuc2lnbmVkIGxvbmcgbDsKKwlpbnQgdG1wOworCisJaWYgKEFUVFJDTVAodGltZXJfdGltZW91dCkpIHsKKwkJdG1wID0gc3RyaWN0X3N0cnRvdWwoaW5zdHIsIDAsICZsKTsKKwkJaWYgKHRtcCkKKwkJCXJldHVybiB0bXA7CisKKwkJZGIxeF9wbV9zbGVlcF9zZWNzID0gbDsKKworCX0gZWxzZSBpZiAoQVRUUkNNUCh0aW1lcikpIHsKKwkJaWYgKGluc3RyWzBdICE9ICcwJykKKwkJCWRiMXhfcG1fd2FrZW1zayB8PSBTWVNfV0FLRU1TS19NMjsKKwkJZWxzZQorCQkJZGIxeF9wbV93YWtlbXNrICY9IH5TWVNfV0FLRU1TS19NMjsKKworCX0gZWxzZSBpZiAoQVRUUkNNUChncGlvMCkgfHwgQVRUUkNNUChncGlvMSkgfHwgQVRUUkNNUChncGlvMikgfHwKKwkJICAgQVRUUkNNUChncGlvMykgfHwgQVRUUkNNUChncGlvNCkgfHwgQVRUUkNNUChncGlvNSkgfHwKKwkJICAgQVRUUkNNUChncGlvNikgfHwgQVRUUkNNUChncGlvNykpIHsKKwkJdG1wID0gKGF0dHItPmF0dHIubmFtZSlbNF0gLSAnMCc7CisJCWlmIChpbnN0clswXSAhPSAnMCcpIHsKKwkJCWRiMXhfcG1fd2FrZW1zayB8PSBTWVNfV0FLRU1TS19HUElPKHRtcCk7CisJCX0gZWxzZSB7CisJCQlkYjF4X3BtX3dha2Vtc2sgJj0gflNZU19XQUtFTVNLX0dQSU8odG1wKTsKKwkJfQorCisJfSBlbHNlIGlmIChBVFRSQ01QKHdha2Vtc2spKSB7CisJCXRtcCA9IHN0cmljdF9zdHJ0b3VsKGluc3RyLCAwLCAmbCk7CisJCWlmICh0bXApCisJCQlyZXR1cm4gdG1wOworCisJCWRiMXhfcG1fd2FrZW1zayA9IGwgJiAweDAwMDAwMDNmOworCisJfSBlbHNlCisJCWJ5dGVzID0gLUVOT0VOVDsKKworCXJldHVybiBieXRlczsKK30KKworI2RlZmluZSBBVFRSKHgpCQkJCQkJCVwKKwlzdGF0aWMgc3RydWN0IGtvYmpfYXR0cmlidXRlIHgjI19hdHRyaWJ1dGUgPSAJCVwKKwkJX19BVFRSKHgsIDA2NjQsIGRiMXhfcG1hdHRyX3Nob3csCQlcCisJCQkJZGIxeF9wbWF0dHJfc3RvcmUpOworCitBVFRSKGdwaW8wKQkJLyogR1BJTy1iYXNlZCB3YWtldXAgZW5hYmxlICovCitBVFRSKGdwaW8xKQorQVRUUihncGlvMikKK0FUVFIoZ3BpbzMpCitBVFRSKGdwaW80KQorQVRUUihncGlvNSkKK0FUVFIoZ3BpbzYpCitBVFRSKGdwaW83KQorQVRUUih0aW1lcikJCS8qIFRPWU1BVENIMi1iYXNlZCB3YWtldXAgZW5hYmxlICovCitBVFRSKHRpbWVyX3RpbWVvdXQpCS8qIHRpbWVyLWJhc2VkIHdha2V1cCB0aW1lb3V0IHZhbHVlLCBpbiBzZWNvbmRzICovCitBVFRSKHdha2VzcmMpCQkvKiBjb250ZW50cyBvZiBTWVNfV0FLRVNSQyBhZnRlciBsYXN0IHdha2V1cCAqLworQVRUUih3YWtlbXNrKQkJLyogZGlyZWN0IGFjY2VzcyB0byBTWVNfV0FLRU1TSyAqLworCisjZGVmaW5lIEFUVFJfTElTVCh4KQkmIHggIyMgX2F0dHJpYnV0ZS5hdHRyCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqZGIxeF9wbWF0dHJzW10gPSB7CisJQVRUUl9MSVNUKGdwaW8wKSwKKwlBVFRSX0xJU1QoZ3BpbzEpLAorCUFUVFJfTElTVChncGlvMiksCisJQVRUUl9MSVNUKGdwaW8zKSwKKwlBVFRSX0xJU1QoZ3BpbzQpLAorCUFUVFJfTElTVChncGlvNSksCisJQVRUUl9MSVNUKGdwaW82KSwKKwlBVFRSX0xJU1QoZ3BpbzcpLAorCUFUVFJfTElTVCh0aW1lciksCisJQVRUUl9MSVNUKHRpbWVyX3RpbWVvdXQpLAorCUFUVFJfTElTVCh3YWtlc3JjKSwKKwlBVFRSX0xJU1Qod2FrZW1zayksCisJTlVMTCwJCS8qIHRlcm1pbmF0b3IgKi8KK307CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGRiMXhfcG1hdHRyX2dyb3VwID0geworCS5uYW1lCT0gImRiMXgiLAorCS5hdHRycwk9IGRiMXhfcG1hdHRycywKK307CisKKy8qCisgKiBJbml0aWFsaXplIHN1c3BlbmQgaW50ZXJmYWNlCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IHBtX2luaXQodm9pZCkKK3sKKwkvKiBpbml0IFRPWSB0byB0aWNrIGF0IDFIeiBpZiBub3QgYWxyZWFkeSBkb25lLiBObyBuZWVkIHRvIHdhaXQKKwkgKiBmb3IgY29uZmlybWF0aW9uIHNpbmNlIHRoZXJlJ3MgcGxlbnR5IG9mIHRpbWUgZnJvbSBoZXJlIHRvCisJICogdGhlIG5leHQgc3VzcGVuZCBjeWNsZS4KKwkgKi8KKwlpZiAoYXVfcmVhZGwoU1lTX1RPWVRSSU0pICE9IDMyNzY3KSB7CisJCWF1X3dyaXRlbCgzMjc2NywgU1lTX1RPWVRSSU0pOworCQlhdV9zeW5jKCk7CisJfQorCisJZGIxeF9wbV9sYXN0X3dha2VzcmMgPSBhdV9yZWFkbChTWVNfV0FLRVNSQyk7CisKKwlhdV93cml0ZWwoMCwgU1lTX1dBS0VTUkMpOworCWF1X3N5bmMoKTsKKwlhdV93cml0ZWwoMCwgU1lTX1dBS0VNU0spOworCWF1X3N5bmMoKTsKKworCXN1c3BlbmRfc2V0X29wcygmZGIxeF9wbV9vcHMpOworCisJcmV0dXJuIHN5c2ZzX2NyZWF0ZV9ncm91cChwb3dlcl9rb2JqLCAmZGIxeF9wbWF0dHJfZ3JvdXApOworfQorCitsYXRlX2luaXRjYWxsKHBtX2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2FsY2hlbXkvZGV2Ym9hcmRzL3Byb20uYyBiL2FyY2gvbWlwcy9hbGNoZW15L2RldmJvYXJkcy9wcm9tLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDA0MmJkNgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbWlwcy9hbGNoZW15L2RldmJvYXJkcy9wcm9tLmMKQEAgLTAsMCArMSw2MiBAQAorLyoKKyAqIENvbW1vbiBjb2RlIHVzZWQgYnkgYWxsIEFsY2hlbXkgZGV2ZWxib2FyZHMuCisgKgorICogRXh0cmFjdGVkIGZyb20gZmlsZXMgd2hpY2ggaGFkIHRoaXMgdG8gc2F5OgorICoKKyAqIENvcHlyaWdodCAyMDAwLCAyMDA4IE1vbnRhVmlzdGEgU29mdHdhcmUgSW5jLgorICogQXV0aG9yOiBNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuIDxzb3VyY2VAbXZpc3RhLmNvbT4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVEhJUyAgU09GVFdBUkUgIElTIFBST1ZJREVEICAgYGBBUyAgSVMnJyBBTkQgICBBTlkgIEVYUFJFU1MgT1IgSU1QTElFRAorICogIFdBUlJBTlRJRVMsICAgSU5DTFVESU5HLCBCVVQgTk9UICBMSU1JVEVEICBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTgorICogIE5PICBFVkVOVCAgU0hBTEwgICBUSEUgQVVUSE9SICBCRSAgICBMSUFCTEUgRk9SIEFOWSAgIERJUkVDVCwgSU5ESVJFQ1QsCisgKiAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiAgTk9UIExJTUlURUQgICBUTywgUFJPQ1VSRU1FTlQgT0YgIFNVQlNUSVRVVEUgR09PRFMgIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCisgKiAgVVNFLCBEQVRBLCAgT1IgUFJPRklUUzsgT1IgIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OCisgKiAgQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiAgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiAgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxhc20vYm9vdGluZm8uaD4KKyNpbmNsdWRlIDxhc20vbWFjaC1hdTF4MDAvYXUxMDAwLmg+CisjaW5jbHVkZSA8cHJvbS5oPgorCisjaWYgZGVmaW5lZChDT05GSUdfTUlQU19QQjEwMDApIHx8IGRlZmluZWQoQ09ORklHX01JUFNfREIxMDAwKSB8fCBcCisgICAgZGVmaW5lZChDT05GSUdfTUlQU19QQjExMDApIHx8IGRlZmluZWQoQ09ORklHX01JUFNfREIxMTAwKSB8fCBcCisgICAgZGVmaW5lZChDT05GSUdfTUlQU19QQjE1MDApIHx8IGRlZmluZWQoQ09ORklHX01JUFNfREIxNTAwKSB8fCBcCisgICAgZGVmaW5lZChDT05GSUdfTUlQU19CT1NQT1JVUykgfHwgZGVmaW5lZChDT05GSUdfTUlQU19NSVJBR0UpCisjZGVmaW5lIEFMQ0hFTVlfQk9BUkRfREVGQVVMVF9NRU1TSVpFCTB4MDQwMDAwMDAKKworI2Vsc2UJLyogQXUxNTUwL0F1MTIwMC1iYXNlZCBkZXZlbGJvYXJkcyAqLworI2RlZmluZSBBTENIRU1ZX0JPQVJEX0RFRkFVTFRfTUVNU0laRQkweDA4MDAwMDAwCisjZW5kaWYKKwordm9pZCBfX2luaXQgcHJvbV9pbml0KHZvaWQpCit7CisJdW5zaWduZWQgY2hhciAqbWVtc2l6ZV9zdHI7CisJdW5zaWduZWQgbG9uZyBtZW1zaXplOworCisJcHJvbV9hcmdjID0gKGludClmd19hcmcwOworCXByb21fYXJndiA9IChjaGFyICoqKWZ3X2FyZzE7CisJcHJvbV9lbnZwID0gKGNoYXIgKiopZndfYXJnMjsKKworCXByb21faW5pdF9jbWRsaW5lKCk7CisJbWVtc2l6ZV9zdHIgPSBwcm9tX2dldGVudigibWVtc2l6ZSIpOworCWlmICghbWVtc2l6ZV9zdHIpCisJCW1lbXNpemUgPSBBTENIRU1ZX0JPQVJEX0RFRkFVTFRfTUVNU0laRTsKKwllbHNlCisJCXN0cmljdF9zdHJ0b3VsKG1lbXNpemVfc3RyLCAwLCAmbWVtc2l6ZSk7CisJYWRkX21lbW9yeV9yZWdpb24oMCwgbWVtc2l6ZSwgQk9PVF9NRU1fUkFNKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9hbGNoZW15L210eC0xL2JvYXJkX3NldHVwLmMgYi9hcmNoL21pcHMvYWxjaGVteS9tdHgtMS9ib2FyZF9zZXR1cC5jCmluZGV4IDNmODA3OTEuLjhlZDFhZTEgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9hbGNoZW15L210eC0xL2JvYXJkX3NldHVwLmMKKysrIGIvYXJjaC9taXBzL2FsY2hlbXkvbXR4LTEvYm9hcmRfc2V0dXAuYwpAQCAtMzIsNiArMzIsOCBAQAogCiAjaW5jbHVkZSA8YXNtL21hY2gtYXUxeDAwL2F1MTAwMC5oPgogCisjaW5jbHVkZSA8cHJvbS5oPgorCiBleHRlcm4gaW50ICgqYm9hcmRfcGNpX2lkc2VsKSh1bnNpZ25lZCBpbnQgZGV2c2VsLCBpbnQgYXNzZXJ0KTsKIGludCBtdHgxX3BjaV9pZHNlbCh1bnNpZ25lZCBpbnQgZGV2c2VsLCBpbnQgYXNzZXJ0KTsKIApAQCAtNDMsNiArNDUsMTYgQEAKIAogdm9pZCBfX2luaXQgYm9hcmRfc2V0dXAodm9pZCkKIHsKKyNpZmRlZiBDT05GSUdfU0VSSUFMXzgyNTBfQ09OU09MRQorCWNoYXIgKmFyZ3B0cjsKKwlhcmdwdHIgPSBwcm9tX2dldGNtZGxpbmUoKTsKKwlhcmdwdHIgPSBzdHJzdHIoYXJncHRyLCAiY29uc29sZT0iKTsKKwlpZiAoYXJncHRyID09IE5VTEwpIHsKKwkJYXJncHRyID0gcHJvbV9nZXRjbWRsaW5lKCk7CisJCXN0cmNhdChhcmdwdHIsICIgY29uc29sZT10dHlTMCwxMTUyMDAiKTsKKwl9CisjZW5kaWYKKwogI2lmIGRlZmluZWQoQ09ORklHX1VTQl9PSENJX0hDRCkgfHwgZGVmaW5lZChDT05GSUdfVVNCX09IQ0lfSENEX01PRFVMRSkKIAkvKiBFbmFibGUgVVNCIHBvd2VyIHN3aXRjaCAqLwogCWF1X3dyaXRlbChhdV9yZWFkbChHUElPMl9ESVIpIHwgMHgxMCwgR1BJTzJfRElSKTsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9hbGNoZW15L210eC0xL2luaXQuYyBiL2FyY2gvbWlwcy9hbGNoZW15L210eC0xL2luaXQuYwppbmRleCAzYmFlMTNjLi41ZTg3MWM4IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvYWxjaGVteS9tdHgtMS9pbml0LmMKKysrIGIvYXJjaC9taXBzL2FsY2hlbXkvbXR4LTEvaW5pdC5jCkBAIC01NSw2ICs1NSw2IEBACiAJaWYgKCFtZW1zaXplX3N0cikKIAkJbWVtc2l6ZSA9IDB4MDQwMDAwMDA7CiAJZWxzZQotCQlzdHJpY3Rfc3RydG9sKG1lbXNpemVfc3RyLCAwLCAmbWVtc2l6ZSk7CisJCXN0cmljdF9zdHJ0b3VsKG1lbXNpemVfc3RyLCAwLCAmbWVtc2l6ZSk7CiAJYWRkX21lbW9yeV9yZWdpb24oMCwgbWVtc2l6ZSwgQk9PVF9NRU1fUkFNKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9hbGNoZW15L210eC0xL2lycW1hcC5jIGIvYXJjaC9taXBzL2FsY2hlbXkvbXR4LTEvaXJxbWFwLmMKaW5kZXggZjJiZjAyOS4uZjFhYjEyYSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2FsY2hlbXkvbXR4LTEvaXJxbWFwLmMKKysrIGIvYXJjaC9taXBzL2FsY2hlbXkvbXR4LTEvaXJxbWFwLmMKQEAgLTI3LDcgKzI3LDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgotCisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8YXNtL21hY2gtYXUxeDAwL2F1MTAwMC5oPgogCiBjaGFyIGlycV90YWJfYWxjaGVteVtdWzVdIF9faW5pdGRhdGEgPSB7CkBAIC00MiwxMSArNDIsMTUgQEAKIH07CiAKIHN0cnVjdCBhdTF4eHhfaXJxbWFwIF9faW5pdGRhdGEgYXUxeHh4X2lycV9tYXBbXSA9IHsKLSAgICAgICB7IEFVMTUwMF9HUElPXzIwNCwgSU5UQ19JTlRfSElHSF9MRVZFTCwgMCB9LAotICAgICAgIHsgQVUxNTAwX0dQSU9fMjAxLCBJTlRDX0lOVF9MT1dfTEVWRUwsIDAgfSwKLSAgICAgICB7IEFVMTUwMF9HUElPXzIwMiwgSU5UQ19JTlRfTE9XX0xFVkVMLCAwIH0sCi0gICAgICAgeyBBVTE1MDBfR1BJT18yMDMsIElOVENfSU5UX0xPV19MRVZFTCwgMCB9LAotICAgICAgIHsgQVUxNTAwX0dQSU9fMjA1LCBJTlRDX0lOVF9MT1dfTEVWRUwsIDAgfSwKKyAgICAgICB7IEFVMTUwMF9HUElPXzIwNCwgSVJRRl9UUklHR0VSX0hJR0gsIDAgfSwKKyAgICAgICB7IEFVMTUwMF9HUElPXzIwMSwgSVJRRl9UUklHR0VSX0xPVywgMCB9LAorICAgICAgIHsgQVUxNTAwX0dQSU9fMjAyLCBJUlFGX1RSSUdHRVJfTE9XLCAwIH0sCisgICAgICAgeyBBVTE1MDBfR1BJT18yMDMsIElSUUZfVFJJR0dFUl9MT1csIDAgfSwKKyAgICAgICB7IEFVMTUwMF9HUElPXzIwNSwgSVJRRl9UUklHR0VSX0xPVywgMCB9LAogfTsKIAotaW50IF9faW5pdGRhdGEgYXUxeHh4X25yX2lycXMgPSBBUlJBWV9TSVpFKGF1MXh4eF9pcnFfbWFwKTsKKwordm9pZCBfX2luaXQgYm9hcmRfaW5pdF9pcnEodm9pZCkKK3sKKwlhdTF4eHhfc2V0dXBfaXJxbWFwKGF1MXh4eF9pcnFfbWFwLCBBUlJBWV9TSVpFKGF1MXh4eF9pcnFfbWFwKSk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvYWxjaGVteS9wYjEwMDAvTWFrZWZpbGUgYi9hcmNoL21pcHMvYWxjaGVteS9wYjEwMDAvTWFrZWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5YmJlYzAuLjAwMDAwMDAKLS0tIGEvYXJjaC9taXBzL2FsY2hlbXkvcGIxMDAwL01ha2VmaWxlCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0jCi0jICBDb3B5cmlnaHQgMjAwMCwgMjAwOCBNb250YVZpc3RhIFNvZnR3YXJlIEluYy4KLSMgIEF1dGhvcjogTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLiA8c291cmNlQG12aXN0YS5jb20+Ci0jCi0jIE1ha2VmaWxlIGZvciB0aGUgQWxjaGVteSBTZW1pY29uZHVjdG9yIFBiMTAwMCBib2FyZC4KLSMKLQotbGliLXkgOj0gaW5pdC5vIGJvYXJkX3NldHVwLm8gaXJxbWFwLm8KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9hbGNoZW15L3BiMTAwMC9ib2FyZF9zZXR1cC5jIGIvYXJjaC9taXBzL2FsY2hlbXkvcGIxMDAwL2JvYXJkX3NldHVwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1ZGYxNjcuLjAwMDAwMDAKLS0tIGEvYXJjaC9taXBzL2FsY2hlbXkvcGIxMDAwL2JvYXJkX3NldHVwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNjUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAwLCAyMDA4IE1vbnRhVmlzdGEgU29mdHdhcmUgSW5jLgotICogQXV0aG9yOiBNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuIDxzb3VyY2VAbXZpc3RhLmNvbT4KLSAqCi0gKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiAgdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCi0gKiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCi0gKiAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiAgVEhJUyAgU09GVFdBUkUgIElTIFBST1ZJREVEICAgYGBBUyAgSVMnJyBBTkQgICBBTlkgIEVYUFJFU1MgT1IgSU1QTElFRAotICogIFdBUlJBTlRJRVMsICAgSU5DTFVESU5HLCBCVVQgTk9UICBMSU1JVEVEICBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTgotICogIE5PICBFVkVOVCAgU0hBTEwgICBUSEUgQVVUSE9SICBCRSAgICBMSUFCTEUgRk9SIEFOWSAgIERJUkVDVCwgSU5ESVJFQ1QsCi0gKiAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gKiAgTk9UIExJTUlURUQgICBUTywgUFJPQ1VSRU1FTlQgT0YgIFNVQlNUSVRVVEUgR09PRFMgIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiAgVVNFLCBEQVRBLCAgT1IgUFJPRklUUzsgT1IgIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OCi0gKiAgQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCi0gKiAgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi0gKiAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gKiAgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotCi0jaW5jbHVkZSA8YXNtL21hY2gtYXUxeDAwL2F1MTAwMC5oPgotI2luY2x1ZGUgPGFzbS9tYWNoLXBiMXgwMC9wYjEwMDAuaD4KLQotdm9pZCBib2FyZF9yZXNldCh2b2lkKQotewotfQotCi12b2lkIF9faW5pdCBib2FyZF9zZXR1cCh2b2lkKQotewotCXUzMiBwaW5fZnVuYywgc3RhdGljX2NmZzA7Ci0JdTMyIHN5c19mcmVxY3RybCwgc3lzX2Nsa3NyYzsKLQl1MzIgcHJpZCA9IHJlYWRfYzBfcHJpZCgpOwotCi0JLyogU2V0IEFVWCBjbG9jayB0byAxMiBNSHogKiA4ID0gOTYgTUh6ICovCi0JYXVfd3JpdGVsKDgsIFNZU19BVVhQTEwpOwotCWF1X3dyaXRlbCgwLCBTWVNfUElOU1RBVEVSRCk7Ci0JdWRlbGF5KDEwMCk7Ci0KLSNpZiBkZWZpbmVkKENPTkZJR19VU0JfT0hDSV9IQ0QpIHx8IGRlZmluZWQoQ09ORklHX1VTQl9PSENJX0hDRF9NT0RVTEUpCi0JLyogWmVybyBhbmQgZGlzYWJsZSBGUkVRMiAqLwotCXN5c19mcmVxY3RybCA9IGF1X3JlYWRsKFNZU19GUkVRQ1RSTDApOwotCXN5c19mcmVxY3RybCAmPSB+MHhGRkYwMDAwMDsKLQlhdV93cml0ZWwoc3lzX2ZyZXFjdHJsLCBTWVNfRlJFUUNUUkwwKTsKLQotCS8qIFplcm8gYW5kIGRpc2FibGUgVVNCSC9VU0JEIGNsb2NrcyAqLwotCXN5c19jbGtzcmMgPSBhdV9yZWFkbChTWVNfQ0xLU1JDKTsKLQlzeXNfY2xrc3JjICY9IH4oU1lTX0NTX0NVRCB8IFNZU19DU19EVUQgfCBTWVNfQ1NfTVVEX01BU0sgfAotCQkgICAgICAgIFNZU19DU19DVUggfCBTWVNfQ1NfRFVIIHwgU1lTX0NTX01VSF9NQVNLKTsKLQlhdV93cml0ZWwoc3lzX2Nsa3NyYywgU1lTX0NMS1NSQyk7Ci0KLQlzeXNfZnJlcWN0cmwgPSBhdV9yZWFkbChTWVNfRlJFUUNUUkwwKTsKLQlzeXNfZnJlcWN0cmwgJj0gfjB4RkZGMDAwMDA7Ci0KLQlzeXNfY2xrc3JjID0gYXVfcmVhZGwoU1lTX0NMS1NSQyk7Ci0Jc3lzX2Nsa3NyYyAmPSB+KFNZU19DU19DVUQgfCBTWVNfQ1NfRFVEIHwgU1lTX0NTX01VRF9NQVNLIHwKLQkJICAgICAgICBTWVNfQ1NfQ1VIIHwgU1lTX0NTX0RVSCB8IFNZU19DU19NVUhfTUFTSyk7Ci0KLQlzd2l0Y2ggKHByaWQgJiAweDAwMDAwMEZGKSB7Ci0JY2FzZSAweDAwOiAvKiBEQSAqLwotCWNhc2UgMHgwMTogLyogSEEgKi8KLQljYXNlIDB4MDI6IC8qIEhCICovCi0JCS8qIENQVSBjb3JlIGZyZXEgdG8gNDggTUh6IHRvIHNsb3cgaXQgd2F5IGRvd24uLi4gKi8KLQkJYXVfd3JpdGVsKDQsIFNZU19DUFVQTEwpOwotCi0JCS8qCi0JCSAqIFNldHVwIDQ4IE1IeiBGUkVRMiBmcm9tIENQVVBMTCBmb3IgVVNCIEhvc3QKLQkJICogRlJESVYyID0gMyAtPiBkaXYgYnkgOCBvZiAzODQgTUh6IC0+IDQ4IE1IegotCQkgKi8KLQkJc3lzX2ZyZXFjdHJsIHw9ICgzIDw8IFNZU19GQ19GUkRJVjJfQklUKSB8IFNZU19GQ19GRTI7Ci0JCWF1X3dyaXRlbChzeXNfZnJlcWN0cmwsIFNZU19GUkVRQ1RSTDApOwotCi0JCS8qIENQVSBjb3JlIGZyZXEgdG8gMzg0IE1IeiAqLwotCQlhdV93cml0ZWwoMHgyMCwgU1lTX0NQVVBMTCk7Ci0KLQkJcHJpbnRrKEtFUk5fSU5GTyAiQXUxMDAwOiA0OCBNSHogT0hDSSB3b3JrYXJvdW5kIGVuYWJsZWRcbiIpOwotCQlicmVhazsKLQotCWRlZmF1bHQ6IC8qIEhDIGFuZCBuZXdlciAqLwotCQkvKiBGUkVRMiA9IGF1eCAvIDIgPSA0OCBNSHogKi8KLQkJc3lzX2ZyZXFjdHJsIHw9ICgwIDw8IFNZU19GQ19GUkRJVjJfQklUKSB8Ci0JCQkJIFNZU19GQ19GRTIgfCBTWVNfRkNfRlMyOwotCQlhdV93cml0ZWwoc3lzX2ZyZXFjdHJsLCBTWVNfRlJFUUNUUkwwKTsKLQkJYnJlYWs7Ci0JfQotCi0JLyoKLQkgKiBSb3V0ZSA0OCBNSHogRlJFUTIgaW50byBVU0IgSG9zdCBhbmQvb3IgRGV2aWNlCi0JICovCi0Jc3lzX2Nsa3NyYyB8PSBTWVNfQ1NfTVVYX0ZRMiA8PCBTWVNfQ1NfTVVIX0JJVDsKLQlhdV93cml0ZWwoc3lzX2Nsa3NyYywgU1lTX0NMS1NSQyk7Ci0KLQkvKiBDb25maWd1cmUgcGlucyBHUElPWzE0OjldIGFzIEdQSU8gKi8KLQlwaW5fZnVuYyA9IGF1X3JlYWRsKFNZU19QSU5GVU5DKSAmIH4oU1lTX1BGX1VSMyB8IFNZU19QRl9VU0IpOwotCi0JLyogMm5kIFVTQiBwb3J0IGlzIFVTQiBob3N0ICovCi0JcGluX2Z1bmMgfD0gU1lTX1BGX1VTQjsKLQotCWF1X3dyaXRlbChwaW5fZnVuYywgU1lTX1BJTkZVTkMpOwotCWF1X3dyaXRlbCgweDI4MDAsIFNZU19UUklPVVRDTFIpOwotCWF1X3dyaXRlbCgweDAwMzAsIFNZU19PVVRQVVRDTFIpOwotI2VuZGlmIC8qIGRlZmluZWQoQ09ORklHX1VTQl9PSENJX0hDRCkgfHwgZGVmaW5lZChDT05GSUdfVVNCX09IQ0lfSENEX01PRFVMRSkgKi8KLQotCS8qIE1ha2UgR1BJTyAxNSBhbiBpbnB1dCAoZm9yIGludGVycnVwdCBsaW5lKSAqLwotCXBpbl9mdW5jID0gYXVfcmVhZGwoU1lTX1BJTkZVTkMpICYgflNZU19QRl9JUkY7Ci0JLyogV2UgZG9uJ3QgbmVlZCBJMlMsIHNvIG1ha2UgaXQgYXZhaWxhYmxlIGZvciBHUElPWzMxOjI5XSAqLwotCXBpbl9mdW5jIHw9IFNZU19QRl9JMlM7Ci0JYXVfd3JpdGVsKHBpbl9mdW5jLCBTWVNfUElORlVOQyk7Ci0KLQlhdV93cml0ZWwoMHg4MDAwLCBTWVNfVFJJT1VUQ0xSKTsKLQotCXN0YXRpY19jZmcwID0gYXVfcmVhZGwoTUVNX1NUQ0ZHMCkgJiB+MHhjMDA7Ci0JYXVfd3JpdGVsKHN0YXRpY19jZmcwLCBNRU1fU1RDRkcwKTsKLQotCS8qIGNvbmZpZ3VyZSBSQ0UyKiBmb3IgTENEICovCi0JYXVfd3JpdGVsKDB4MDAwMDAwMDQsIE1FTV9TVENGRzIpOwotCi0JLyogTUVNX1NUVElNRTIgKi8KLQlhdV93cml0ZWwoMHgwOTAwMDAwMCwgTUVNX1NUVElNRTIpOwotCi0JLyogU2V0IDMyLWJpdCBiYXNlIGFkZHJlc3MgZGVjb2RpbmcgZm9yIFJDRTIqICovCi0JYXVfd3JpdGVsKDB4MTAwMDNmZjAsIE1FTV9TVEFERFIyKTsKLQotCS8qCi0JICogUENJIENQTEQgc2V0dXAKLQkgKiBFeHBhbmQgQ0UwIHRvIGNvdmVyIFBDSQotCSAqLwotCWF1X3dyaXRlbCgweDExODAzZTQwLCBNRU1fU1RBRERSMSk7Ci0KLQkvKiBCdXJzdCB2aXNpYmlsaXR5IG9uICovCi0JYXVfd3JpdGVsKGF1X3JlYWRsKE1FTV9TVENGRzApIHwgMHgxMDAwLCBNRU1fU1RDRkcwKTsKLQotCWF1X3dyaXRlbCgweDgzLCBNRU1fU1RDRkcxKTsJICAgICAvKiBld2FpdCBlbmFibGVkLCBmbGFzaCB0aW1pbmcgKi8KLQlhdV93cml0ZWwoMHgzMzAzMGExMCwgTUVNX1NUVElNRTEpOyAgLyogc2xvd2VyIHRpbWluZyBmb3IgRlBHQSAqLwotCi0JLyogU2V0dXAgdGhlIHN0YXRpYyBidXMgY29udHJvbGxlciAqLwotCWF1X3dyaXRlbCgweDAwMDAwMDAyLCBNRU1fU1RDRkczKTsgIC8qIHR5cGUgPSBQQ01DSUEgKi8KLQlhdV93cml0ZWwoMHgyODBFM0QwNywgTUVNX1NUVElNRTMpOyAvKiAyNTBucyBjeWNsZSB0aW1lICovCi0JYXVfd3JpdGVsKDB4MTAwMDAwMDAsIE1FTV9TVEFERFIzKTsgLyogYW55IFBDTUNJQSBzZWxlY3QgKi8KLQotCS8qCi0JICogRW5hYmxlIEF1MTAwMCBCQ0xLIHN3aXRjaGluZyAtIG5vdGU6IHNlZDEzNTYgbXVzdCBub3QgdXNlCi0JICogaXRzIEJDTEsgKEF1MTAwMCBMQ0xLKSBmb3IgYW55IHRpbWluZ3MKLQkgKi8KLQlzd2l0Y2ggKHByaWQgJiAweDAwMDAwMEZGKSB7Ci0JY2FzZSAweDAwOiAvKiBEQSAqLwotCWNhc2UgMHgwMTogLyogSEEgKi8KLQljYXNlIDB4MDI6IC8qIEhCICovCi0JCWJyZWFrOwotCWRlZmF1bHQ6ICAvKiBIQyBhbmQgbmV3ZXIgKi8KLQkJLyoKLQkJICogRW5hYmxlIHN5cyBidXMgY2xvY2sgZGl2aWRlciB3aGVuIElETEUgc3RhdGUgb3Igbm8gYnVzCi0JCSAqIGFjdGl2aXR5LgotCQkgKi8KLQkJYXVfd3JpdGVsKGF1X3JlYWRsKFNZU19QT1dFUkNUUkwpIHwgKDB4MyA8PCA1KSwgU1lTX1BPV0VSQ1RSTCk7Ci0JCWJyZWFrOwotCX0KLX0KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9hbGNoZW15L3BiMTAwMC9pbml0LmMgYi9hcmNoL21pcHMvYWxjaGVteS9wYjEwMDAvaW5pdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTljN2Q1Li4wMDAwMDAwCi0tLSBhL2FyY2gvbWlwcy9hbGNoZW15L3BiMTAwMC9pbml0LmMKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKgotICogQlJJRUYgTU9EVUxFIERFU0NSSVBUSU9OCi0gKglQYjEwMDAgYm9hcmQgc2V0dXAKLSAqCi0gKiBDb3B5cmlnaHQgMjAwMSwgMjAwOCBNb250YVZpc3RhIFNvZnR3YXJlIEluYy4KLSAqIEF1dGhvcjogTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLiA8c291cmNlQG12aXN0YS5jb20+Ci0gKgotICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAotICogIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQotICogIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgotICogIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogIFRISVMgIFNPRlRXQVJFICBJUyBQUk9WSURFRCAgIGBgQVMgIElTJycgQU5EICAgQU5ZICBFWFBSRVNTIE9SIElNUExJRUQKLSAqICBXQVJSQU5USUVTLCAgIElOQ0xVRElORywgQlVUIE5PVCAgTElNSVRFRCAgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqICBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4KLSAqICBOTyAgRVZFTlQgIFNIQUxMICAgVEhFIEFVVEhPUiAgQkUgICAgTElBQkxFIEZPUiBBTlkgICBESVJFQ1QsIElORElSRUNULAotICogIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogIE5PVCBMSU1JVEVEICAgVE8sIFBST0NVUkVNRU5UIE9GICBTVUJTVElUVVRFIEdPT0RTICBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogIFVTRSwgREFUQSwgIE9SIFBST0ZJVFM7IE9SICBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTgotICogIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOICBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgotICogIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotICogIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlICB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICogIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0KLSNpbmNsdWRlIDxhc20vYm9vdGluZm8uaD4KLQotI2luY2x1ZGUgPHByb20uaD4KLQotY29uc3QgY2hhciAqZ2V0X3N5c3RlbV90eXBlKHZvaWQpCi17Ci0JcmV0dXJuICJBbGNoZW15IFBiMTAwMCI7Ci19Ci0KLXZvaWQgX19pbml0IHByb21faW5pdCh2b2lkKQotewotCXVuc2lnbmVkIGNoYXIgKm1lbXNpemVfc3RyOwotCXVuc2lnbmVkIGxvbmcgbWVtc2l6ZTsKLQotCXByb21fYXJnYyA9IChpbnQpZndfYXJnMDsKLQlwcm9tX2FyZ3YgPSAoY2hhciAqKilmd19hcmcxOwotCXByb21fZW52cCA9IChjaGFyICoqKWZ3X2FyZzI7Ci0KLQlwcm9tX2luaXRfY21kbGluZSgpOwotCW1lbXNpemVfc3RyID0gcHJvbV9nZXRlbnYoIm1lbXNpemUiKTsKLQlpZiAoIW1lbXNpemVfc3RyKQotCQltZW1zaXplID0gMHgwNDAwMDAwMDsKLQllbHNlCi0JCXN0cmljdF9zdHJ0b2wobWVtc2l6ZV9zdHIsIDAsICZtZW1zaXplKTsKLQlhZGRfbWVtb3J5X3JlZ2lvbigwLCBtZW1zaXplLCBCT09UX01FTV9SQU0pOwotfQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2FsY2hlbXkvcGIxMDAwL2lycW1hcC5jIGIvYXJjaC9taXBzL2FsY2hlbXkvcGIxMDAwL2lycW1hcC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiM2Q1NmIwLi4wMDAwMDAwCi0tLSBhL2FyY2gvbWlwcy9hbGNoZW15L3BiMTAwMC9pcnFtYXAuYworKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qCi0gKiBCUklFRiBNT0RVTEUgREVTQ1JJUFRJT04KLSAqCUF1MXh4eCBpcnEgbWFwIHRhYmxlCi0gKgotICogQ29weXJpZ2h0IDIwMDMgRW1iZWRkZWQgRWRnZSwgTExDCi0gKgkJZGFuQGVtYmVkZGVkZWRnZS5jb20KLSAqCi0gKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlCSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiAgdW5kZXIgIHRoZSB0ZXJtcyBvZgkgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCi0gKiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUJTGljZW5zZSwgb3IgKGF0IHlvdXIKLSAqICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqICBUSElTICBTT0ZUV0FSRSAgSVMgUFJPVklERUQJICBgYEFTCUlTJycgQU5EICAgQU5ZCUVYUFJFU1MgT1IgSU1QTElFRAotICogIFdBUlJBTlRJRVMsCSAgSU5DTFVESU5HLCBCVVQgTk9UICBMSU1JVEVEICBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTgotICogIE5PCUVWRU5UICBTSEFMTCAgIFRIRSBBVVRIT1IgIEJFCSBMSUFCTEUgRk9SIEFOWQkgIERJUkVDVCwgSU5ESVJFQ1QsCi0gKiAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gKiAgTk9UIExJTUlURUQJICBUTywgUFJPQ1VSRU1FTlQgT0YgIFNVQlNUSVRVVEUgR09PRFMJT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqICBVU0UsIERBVEEsCU9SIFBST0ZJVFM7IE9SCUJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OCi0gKiAgQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4JIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCi0gKiAgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi0gKiAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gKiAgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLQotI2luY2x1ZGUgPGFzbS9tYWNoLWF1MXgwMC9hdTEwMDAuaD4KLQotc3RydWN0IGF1MXh4eF9pcnFtYXAgX19pbml0ZGF0YSBhdTF4eHhfaXJxX21hcFtdID0gewotCXsgQVUxMDAwX0dQSU9fMTUsIElOVENfSU5UX0xPV19MRVZFTCwgMCB9LAotfTsKLQotaW50IF9faW5pdGRhdGEgYXUxeHh4X25yX2lycXMgPSBBUlJBWV9TSVpFKGF1MXh4eF9pcnFfbWFwKTsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9hbGNoZW15L3BiMTEwMC9NYWtlZmlsZSBiL2FyY2gvbWlwcy9hbGNoZW15L3BiMTEwMC9NYWtlZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzkzZTk3Yy4uMDAwMDAwMAotLS0gYS9hcmNoL21pcHMvYWxjaGVteS9wYjExMDAvTWFrZWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLSMKLSMgIENvcHlyaWdodCAyMDAwLCAyMDAxLCAyMDA4IE1vbnRhVmlzdGEgU29mdHdhcmUgSW5jLgotIyAgQXV0aG9yOiBNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuIDxzb3VyY2VAbXZpc3RhLmNvbT4KLSMKLSMgTWFrZWZpbGUgZm9yIHRoZSBBbGNoZW15IFNlbWljb25kdWN0b3IgUGIxMTAwIGJvYXJkLgotIwotCi1saWIteSA6PSBpbml0Lm8gYm9hcmRfc2V0dXAubyBpcnFtYXAubwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2FsY2hlbXkvcGIxMTAwL2JvYXJkX3NldHVwLmMgYi9hcmNoL21pcHMvYWxjaGVteS9wYjExMDAvYm9hcmRfc2V0dXAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzBiZmQ1OS4uMDAwMDAwMAotLS0gYS9hcmNoL21pcHMvYWxjaGVteS9wYjExMDAvYm9hcmRfc2V0dXAuYworKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIsIDIwMDggTW9udGFWaXN0YSBTb2Z0d2FyZSBJbmMuCi0gKiBBdXRob3I6IE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4gPHNvdXJjZUBtdmlzdGEuY29tPgotICoKLSAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqICB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKLSAqICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKLSAqICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqICBUSElTICBTT0ZUV0FSRSAgSVMgUFJPVklERUQgICBgYEFTICBJUycnIEFORCAgIEFOWSAgRVhQUkVTUyBPUiBJTVBMSUVECi0gKiAgV0FSUkFOVElFUywgICBJTkNMVURJTkcsIEJVVCBOT1QgIExJTUlURUQgIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0gKiAgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOCi0gKiAgTk8gIEVWRU5UICBTSEFMTCAgIFRIRSBBVVRIT1IgIEJFICAgIExJQUJMRSBGT1IgQU5ZICAgRElSRUNULCBJTkRJUkVDVCwKLSAqICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSAqICBOT1QgTElNSVRFRCAgIFRPLCBQUk9DVVJFTUVOVCBPRiAgU1VCU1RJVFVURSBHT09EUyAgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqICBVU0UsIERBVEEsICBPUiBQUk9GSVRTOyBPUiAgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04KLSAqICBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiAgQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqICAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKLSAqICBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLSAqICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSAgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAqICA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0KLSNpbmNsdWRlIDxhc20vbWFjaC1hdTF4MDAvYXUxMDAwLmg+Ci0jaW5jbHVkZSA8YXNtL21hY2gtcGIxeDAwL3BiMTEwMC5oPgotCi12b2lkIGJvYXJkX3Jlc2V0KHZvaWQpCi17Ci0JLyogSGl0IEJDU1IuUlNUX1ZERElbU09GVF9SRVNFVF0gKi8KLQlhdV93cml0ZWwoMHgwMDAwMDAwMCwgUEIxMTAwX1JTVF9WRERJKTsKLX0KLQotdm9pZCBfX2luaXQgYm9hcmRfc2V0dXAodm9pZCkKLXsKLQl2b2xhdGlsZSB2b2lkIF9faW9tZW0gKmJhc2UgPSAodm9sYXRpbGUgdm9pZCBfX2lvbWVtICopMHhhYzAwMDAwMFVMOwotCi0JLyogU2V0IEFVWCBjbG9jayB0byAxMiBNSHogKiA4ID0gOTYgTUh6ICovCi0JYXVfd3JpdGVsKDgsIFNZU19BVVhQTEwpOwotCWF1X3dyaXRlbCgwLCBTWVNfUElOSU5QVVRFTik7Ci0JdWRlbGF5KDEwMCk7Ci0KLSNpZiBkZWZpbmVkKENPTkZJR19VU0JfT0hDSV9IQ0QpIHx8IGRlZmluZWQoQ09ORklHX1VTQl9PSENJX0hDRF9NT0RVTEUpCi0JewotCQl1MzIgcGluX2Z1bmMsIHN5c19mcmVxY3RybCwgc3lzX2Nsa3NyYzsKLQotCQkvKiBDb25maWd1cmUgcGlucyBHUElPWzE0OjldIGFzIEdQSU8gKi8KLQkJcGluX2Z1bmMgPSBhdV9yZWFkbChTWVNfUElORlVOQykgJiB+U1lTX1BGX1VSMzsKLQotCQkvKiBaZXJvIGFuZCBkaXNhYmxlIEZSRVEyICovCi0JCXN5c19mcmVxY3RybCA9IGF1X3JlYWRsKFNZU19GUkVRQ1RSTDApOwotCQlzeXNfZnJlcWN0cmwgJj0gfjB4RkZGMDAwMDA7Ci0JCWF1X3dyaXRlbChzeXNfZnJlcWN0cmwsIFNZU19GUkVRQ1RSTDApOwotCi0JCS8qIFplcm8gYW5kIGRpc2FibGUgVVNCSC9VU0JEL0lyREEgY2xvY2sgKi8KLQkJc3lzX2Nsa3NyYyA9IGF1X3JlYWRsKFNZU19DTEtTUkMpOwotCQlzeXNfY2xrc3JjICY9IH4oU1lTX0NTX0NJUiB8IFNZU19DU19ESVIgfCBTWVNfQ1NfTUlSX01BU0spOwotCQlhdV93cml0ZWwoc3lzX2Nsa3NyYywgU1lTX0NMS1NSQyk7Ci0KLQkJc3lzX2ZyZXFjdHJsID0gYXVfcmVhZGwoU1lTX0ZSRVFDVFJMMCk7Ci0JCXN5c19mcmVxY3RybCAmPSB+MHhGRkYwMDAwMDsKLQotCQlzeXNfY2xrc3JjID0gYXVfcmVhZGwoU1lTX0NMS1NSQyk7Ci0JCXN5c19jbGtzcmMgJj0gfihTWVNfQ1NfQ0lSIHwgU1lTX0NTX0RJUiB8IFNZU19DU19NSVJfTUFTSyk7Ci0KLQkJLyogRlJFUTIgPSBhdXggLyAyID0gNDggTUh6ICovCi0JCXN5c19mcmVxY3RybCB8PSAoMCA8PCBTWVNfRkNfRlJESVYyX0JJVCkgfAotCQkJCVNZU19GQ19GRTIgfCBTWVNfRkNfRlMyOwotCQlhdV93cml0ZWwoc3lzX2ZyZXFjdHJsLCBTWVNfRlJFUUNUUkwwKTsKLQotCQkvKgotCQkgKiBSb3V0ZSA0OCBNSHogRlJFUTIgaW50byBVU0JIL1VTQkQvSXJEQQotCQkgKi8KLQkJc3lzX2Nsa3NyYyB8PSBTWVNfQ1NfTVVYX0ZRMiA8PCBTWVNfQ1NfTUlSX0JJVDsKLQkJYXVfd3JpdGVsKHN5c19jbGtzcmMsIFNZU19DTEtTUkMpOwotCi0JCS8qIFNldHVwIHRoZSBzdGF0aWMgYnVzIGNvbnRyb2xsZXIgKi8KLQkJYXVfd3JpdGVsKDB4MDAwMDAwMDIsIE1FTV9TVENGRzMpOyAgLyogdHlwZSA9IFBDTUNJQSAqLwotCQlhdV93cml0ZWwoMHgyODBFM0QwNywgTUVNX1NUVElNRTMpOyAvKiAyNTBucyBjeWNsZSB0aW1lICovCi0JCWF1X3dyaXRlbCgweDEwMDAwMDAwLCBNRU1fU1RBRERSMyk7IC8qIGFueSBQQ01DSUEgc2VsZWN0ICovCi0KLQkJLyoKLQkJICogR2V0IFVTQiBGdW5jdGlvbmFsaXR5IHBpbiBzdGF0ZSAoZGV2aWNlIHZzIGhvc3QgZHJpdmUgcGlucykuCi0JCSAqLwotCQlwaW5fZnVuYyA9IGF1X3JlYWRsKFNZU19QSU5GVU5DKSAmIH5TWVNfUEZfVVNCOwotCQkvKiAybmQgVVNCIHBvcnQgaXMgVVNCIGhvc3QuICovCi0JCXBpbl9mdW5jIHw9IFNZU19QRl9VU0I7Ci0JCWF1X3dyaXRlbChwaW5fZnVuYywgU1lTX1BJTkZVTkMpOwotCX0KLSNlbmRpZiAvKiBkZWZpbmVkKENPTkZJR19VU0JfT0hDSV9IQ0QpIHx8IGRlZmluZWQoQ09ORklHX1VTQl9PSENJX0hDRF9NT0RVTEUpICovCi0KLQkvKiBFbmFibGUgc3lzIGJ1cyBjbG9jayBkaXZpZGVyIHdoZW4gSURMRSBzdGF0ZSBvciBubyBidXMgYWN0aXZpdHkuICovCi0JYXVfd3JpdGVsKGF1X3JlYWRsKFNZU19QT1dFUkNUUkwpIHwgKDB4MyA8PCA1KSwgU1lTX1BPV0VSQ1RSTCk7Ci0KLQkvKiBFbmFibGUgdGhlIFJUQyBpZiBub3QgYWxyZWFkeSBlbmFibGVkLiAqLwotCWlmICghKHJlYWRiKGJhc2UgKyAweDI4KSAmIDB4MjApKSB7Ci0JCXdyaXRlYihyZWFkYihiYXNlICsgMHgyOCkgfCAweDIwLCBiYXNlICsgMHgyOCk7Ci0JCWF1X3N5bmMoKTsKLQl9Ci0JLyogUHV0IHRoZSBjbG9jayBpbiBCQ0QgbW9kZS4gKi8KLQlpZiAocmVhZGIoYmFzZSArIDB4MkMpICYgMHg0KSB7IC8qIHJlZyBCICovCi0JCXdyaXRlYihyZWFkYihiYXNlICsgMHgyYykgJiB+MHg0LCBiYXNlICsgMHgyYyk7Ci0JCWF1X3N5bmMoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvYWxjaGVteS9wYjExMDAvaW5pdC5jIGIvYXJjaC9taXBzL2FsY2hlbXkvcGIxMTAwL2luaXQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2M2NzkyMy4uMDAwMDAwMAotLS0gYS9hcmNoL21pcHMvYWxjaGVteS9wYjExMDAvaW5pdC5jCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoKLSAqCi0gKiBCUklFRiBNT0RVTEUgREVTQ1JJUFRJT04KLSAqCVBiMTEwMCBib2FyZCBzZXR1cAotICoKLSAqIENvcHlyaWdodCAyMDAyLCAyMDA4IE1vbnRhVmlzdGEgU29mdHdhcmUgSW5jLgotICogQXV0aG9yOiBNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuIDxzb3VyY2VAbXZpc3RhLmNvbT4KLSAqCi0gKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiAgdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCi0gKiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCi0gKiAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiAgVEhJUyAgU09GVFdBUkUgIElTIFBST1ZJREVEICAgYGBBUyAgSVMnJyBBTkQgICBBTlkgIEVYUFJFU1MgT1IgSU1QTElFRAotICogIFdBUlJBTlRJRVMsICAgSU5DTFVESU5HLCBCVVQgTk9UICBMSU1JVEVEICBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTgotICogIE5PICBFVkVOVCAgU0hBTEwgICBUSEUgQVVUSE9SICBCRSAgICBMSUFCTEUgRk9SIEFOWSAgIERJUkVDVCwgSU5ESVJFQ1QsCi0gKiAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gKiAgTk9UIExJTUlURUQgICBUTywgUFJPQ1VSRU1FTlQgT0YgIFNVQlNUSVRVVEUgR09PRFMgIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiAgVVNFLCBEQVRBLCAgT1IgUFJPRklUUzsgT1IgIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OCi0gKiAgQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCi0gKiAgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi0gKiAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gKiAgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLQotI2luY2x1ZGUgPGFzbS9ib290aW5mby5oPgotCi0jaW5jbHVkZSA8cHJvbS5oPgotCi1jb25zdCBjaGFyICpnZXRfc3lzdGVtX3R5cGUodm9pZCkKLXsKLQlyZXR1cm4gIkFsY2hlbXkgUGIxMTAwIjsKLX0KLQotdm9pZCBfX2luaXQgcHJvbV9pbml0KHZvaWQpCi17Ci0JdW5zaWduZWQgY2hhciAqbWVtc2l6ZV9zdHI7Ci0JdW5zaWduZWQgbG9uZyBtZW1zaXplOwotCi0JcHJvbV9hcmdjID0gZndfYXJnMDsKLQlwcm9tX2FyZ3YgPSAoY2hhciAqKilmd19hcmcxOwotCXByb21fZW52cCA9IChjaGFyICoqKWZ3X2FyZzM7Ci0KLQlwcm9tX2luaXRfY21kbGluZSgpOwotCi0JbWVtc2l6ZV9zdHIgPSBwcm9tX2dldGVudigibWVtc2l6ZSIpOwotCWlmICghbWVtc2l6ZV9zdHIpCi0JCW1lbXNpemUgPSAweDA0MDAwMDAwOwotCWVsc2UKLQkJc3RyaWN0X3N0cnRvbChtZW1zaXplX3N0ciwgMCwgJm1lbXNpemUpOwotCi0JYWRkX21lbW9yeV9yZWdpb24oMCwgbWVtc2l6ZSwgQk9PVF9NRU1fUkFNKTsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9hbGNoZW15L3BiMTEwMC9pcnFtYXAuYyBiL2FyY2gvbWlwcy9hbGNoZW15L3BiMTEwMC9pcnFtYXAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWI3ZGQ4Yi4uMDAwMDAwMAotLS0gYS9hcmNoL21pcHMvYWxjaGVteS9wYjExMDAvaXJxbWFwLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKgotICogQlJJRUYgTU9EVUxFIERFU0NSSVBUSU9OCi0gKglBdTF4eDAgSVJRIG1hcCB0YWJsZQotICoKLSAqIENvcHlyaWdodCAyMDAzIEVtYmVkZGVkIEVkZ2UsIExMQwotICoJCWRhbkBlbWJlZGRlZGVkZ2UuY29tCi0gKgotICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZQkgaXQgYW5kL29yIG1vZGlmeSBpdAotICogIHVuZGVyICB0aGUgdGVybXMgb2YJIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQotICogIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlCUxpY2Vuc2UsIG9yIChhdCB5b3VyCi0gKiAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiAgVEhJUyAgU09GVFdBUkUgIElTIFBST1ZJREVECSAgYGBBUwlJUycnIEFORCAgIEFOWQlFWFBSRVNTIE9SIElNUExJRUQKLSAqICBXQVJSQU5USUVTLAkgIElOQ0xVRElORywgQlVUIE5PVCAgTElNSVRFRCAgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqICBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4KLSAqICBOTwlFVkVOVCAgU0hBTEwgICBUSEUgQVVUSE9SICBCRQkgTElBQkxFIEZPUiBBTlkJICBESVJFQ1QsIElORElSRUNULAotICogIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogIE5PVCBMSU1JVEVECSAgVE8sIFBST0NVUkVNRU5UIE9GICBTVUJTVElUVVRFIEdPT0RTCU9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiAgVVNFLCBEQVRBLAlPUiBQUk9GSVRTOyBPUglCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTgotICogIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCSBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgotICogIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotICogIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlICB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICogIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0KLSNpbmNsdWRlIDxhc20vbWFjaC1hdTF4MDAvYXUxMDAwLmg+Ci0KLXN0cnVjdCBhdTF4eHhfaXJxbWFwIF9faW5pdGRhdGEgYXUxeHh4X2lycV9tYXBbXSA9IHsKLQl7IEFVMTAwMF9HUElPXzksICBJTlRDX0lOVF9MT1dfTEVWRUwsIDAgfSwgLyogUENNQ0lBIENhcmQgRnVsbHlfSW5zZXJ0ZWQjICovCi0JeyBBVTEwMDBfR1BJT18xMCwgSU5UQ19JTlRfTE9XX0xFVkVMLCAwIH0sIC8qIFBDTUNJQSBDYXJkIFNUU0NIRyMgKi8KLQl7IEFVMTAwMF9HUElPXzExLCBJTlRDX0lOVF9MT1dfTEVWRUwsIDAgfSwgLyogUENNQ0lBIENhcmQgSVJRIyAqLwotCXsgQVUxMDAwX0dQSU9fMTMsIElOVENfSU5UX0xPV19MRVZFTCwgMCB9LCAvKiBEQ19JUlEjICovCi19OwotCi1pbnQgX19pbml0ZGF0YSBhdTF4eHhfbnJfaXJxcyA9IEFSUkFZX1NJWkUoYXUxeHh4X2lycV9tYXApOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2FsY2hlbXkvcGIxMjAwL01ha2VmaWxlIGIvYXJjaC9taXBzL2FsY2hlbXkvcGIxMjAwL01ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjc4YWRmLi4wMDAwMDAwCi0tLSBhL2FyY2gvbWlwcy9hbGNoZW15L3BiMTIwMC9NYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotIwotIyBNYWtlZmlsZSBmb3IgdGhlIEFsY2hlbXkgU2VtaWNvbmR1Y3RvciBQYjEyMDAvREJBdTEyMDAgYm9hcmRzLgotIwotCi1saWIteSA6PSBpbml0Lm8gYm9hcmRfc2V0dXAubyBpcnFtYXAubwotb2JqLXkgKz0gcGxhdGZvcm0ubwotCi1FWFRSQV9DRkxBR1MgKz0gLVdlcnJvcgpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2FsY2hlbXkvcGIxMjAwL2JvYXJkX3NldHVwLmMgYi9hcmNoL21pcHMvYWxjaGVteS9wYjEyMDAvYm9hcmRfc2V0dXAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmNiMjExNTAuLjAwMDAwMDAKLS0tIGEvYXJjaC9taXBzL2FsY2hlbXkvcGIxMjAwL2JvYXJkX3NldHVwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNjIgKzAsMCBAQAotLyoKLSAqCi0gKiBCUklFRiBNT0RVTEUgREVTQ1JJUFRJT04KLSAqCUFsY2hlbXkgUGIxMjAwL0RiMTIwMCBib2FyZCBzZXR1cC4KLSAqCi0gKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiAgdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCi0gKiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCi0gKiAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiAgVEhJUyAgU09GVFdBUkUgIElTIFBST1ZJREVEICAgYGBBUyAgSVMnJyBBTkQgICBBTlkgIEVYUFJFU1MgT1IgSU1QTElFRAotICogIFdBUlJBTlRJRVMsICAgSU5DTFVESU5HLCBCVVQgTk9UICBMSU1JVEVEICBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTgotICogIE5PICBFVkVOVCAgU0hBTEwgICBUSEUgQVVUSE9SICBCRSAgICBMSUFCTEUgRk9SIEFOWSAgIERJUkVDVCwgSU5ESVJFQ1QsCi0gKiAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gKiAgTk9UIExJTUlURUQgICBUTywgUFJPQ1VSRU1FTlQgT0YgIFNVQlNUSVRVVEUgR09PRFMgIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiAgVVNFLCBEQVRBLCAgT1IgUFJPRklUUzsgT1IgIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OCi0gKiAgQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCi0gKiAgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi0gKiAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gKiAgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotCi0jaW5jbHVkZSA8cHJvbS5oPgotI2luY2x1ZGUgPGF1MXh4eC5oPgotCi1leHRlcm4gdm9pZCBfYm9hcmRfaW5pdF9pcnEodm9pZCk7Ci1leHRlcm4gdm9pZCAoKmJvYXJkX2luaXRfaXJxKSh2b2lkKTsKLQotdm9pZCBib2FyZF9yZXNldCh2b2lkKQotewotCWJjc3ItPnJlc2V0cyA9IDA7Ci0JYmNzci0+c3lzdGVtID0gMDsKLX0KLQotdm9pZCBfX2luaXQgYm9hcmRfc2V0dXAodm9pZCkKLXsKLQljaGFyICphcmdwdHIgPSBOVUxMOwotCi0jaWYgMAotCXsKLQkJdTMyIHBpbl9mdW5jOwotCi0JCS8qCi0JCSAqIEVuYWJsZSBQU0MxIFNZTkMgZm9yIEFDOTcuICBOb3JtYWx5IGRvbmUgaW4gYXVkaW8gZHJpdmVyLAotCQkgKiBidXQgaXQgaXMgYm9hcmQgc3BlY2lmaWMgY29kZSwgc28gcHV0IGl0IGhlcmUuCi0JCSAqLwotCQlwaW5fZnVuYyA9IGF1X3JlYWRsKFNZU19QSU5GVU5DKTsKLQkJYXVfc3luYygpOwotCQlwaW5fZnVuYyB8PSBTWVNfUEZfTVVTVF9CRV9TRVQgfCBTWVNfUEZfUFNDMV9TMTsKLQkJYXVfd3JpdGVsKHBpbl9mdW5jLCBTWVNfUElORlVOQyk7Ci0KLQkJYXVfd3JpdGVsKDAsICh1MzIpYmNzciB8IDB4MTApOyAvKiB0dXJuIG9mZiBQQ01DSUEgcG93ZXIgKi8KLQkJYXVfc3luYygpOwotCX0KLSNlbmRpZgotCi0jaWYgZGVmaW5lZChDT05GSUdfSTJDX0FVMTU1MCkKLQl7Ci0JCXUzMiBmcmVxMCwgY2xrc3JjOwotCQl1MzIgcGluX2Z1bmM7Ci0KLQkJLyogU2VsZWN0IFNNQnVzIGluIENQTEQgKi8KLQkJYmNzci0+cmVzZXRzICY9IH5CQ1NSX1JFU0VUU19QQ1MwTVVYOwotCi0JCXBpbl9mdW5jID0gYXVfcmVhZGwoU1lTX1BJTkZVTkMpOwotCQlhdV9zeW5jKCk7Ci0JCXBpbl9mdW5jICY9IH4oU1lTX1BJTkZVTkNfUDBBIHwgU1lTX1BJTkZVTkNfUDBCKTsKLQkJLyogU2V0IEdQSU9zIGNvcnJlY3RseSAqLwotCQlwaW5fZnVuYyB8PSAyIDw8IDE3OwotCQlhdV93cml0ZWwocGluX2Z1bmMsIFNZU19QSU5GVU5DKTsKLQkJYXVfc3luYygpOwotCi0JCS8qIFRoZSBJMkMgZHJpdmVyIGRlcGVuZHMgb24gNTAgTUh6IGNsb2NrICovCi0JCWZyZXEwID0gYXVfcmVhZGwoU1lTX0ZSRVFDVFJMMCk7Ci0JCWF1X3N5bmMoKTsKLQkJZnJlcTAgJj0gfihTWVNfRkNfRlJESVYxX01BU0sgfCBTWVNfRkNfRlMxIHwgU1lTX0ZDX0ZFMSk7Ci0JCWZyZXEwIHw9IDMgPDwgU1lTX0ZDX0ZSRElWMV9CSVQ7Ci0JCS8qIDM5NiBNSHogLyAoMyArIDEpICogMiA9PSA0OS41IE1IeiAqLwotCQlhdV93cml0ZWwoZnJlcTAsIFNZU19GUkVRQ1RSTDApOwotCQlhdV9zeW5jKCk7Ci0JCWZyZXEwIHw9IFNZU19GQ19GRTE7Ci0JCWF1X3dyaXRlbChmcmVxMCwgU1lTX0ZSRVFDVFJMMCk7Ci0JCWF1X3N5bmMoKTsKLQotCQljbGtzcmMgPSBhdV9yZWFkbChTWVNfQ0xLU1JDKTsKLQkJYXVfc3luYygpOwotCQljbGtzcmMgJj0gfihTWVNfQ1NfQ0UwIHwgU1lTX0NTX0RFMCB8IFNZU19DU19NRTBfTUFTSyk7Ci0JCS8qIEJpdCAyMiBpcyBFWFRDTEswIGZvciBQU0MwICovCi0JCWNsa3NyYyB8PSBTWVNfQ1NfTVVYX0ZRMSA8PCBTWVNfQ1NfTUUwX0JJVDsKLQkJYXVfd3JpdGVsKGNsa3NyYywgU1lTX0NMS1NSQyk7Ci0JCWF1X3N5bmMoKTsKLQl9Ci0jZW5kaWYKLQotI2lmZGVmIENPTkZJR19GQl9BVTEyMDAKLQlhcmdwdHIgPSBwcm9tX2dldGNtZGxpbmUoKTsKLSNpZmRlZiBDT05GSUdfTUlQU19QQjEyMDAKLQlzdHJjYXQoYXJncHRyLCAiIHZpZGVvPWF1MTIwMGZiOnBhbmVsOmJzIik7Ci0jZW5kaWYKLSNpZmRlZiBDT05GSUdfTUlQU19EQjEyMDAKLQlzdHJjYXQoYXJncHRyLCAiIHZpZGVvPWF1MTIwMGZiOnBhbmVsOmJzIik7Ci0jZW5kaWYKLSNlbmRpZgotCi0JLyoKLQkgKiBUaGUgUGIxMjAwIGRldmVsb3BtZW50IGJvYXJkIHVzZXMgZXh0ZXJuYWwgTVVYIGZvciBQU0MwIHRvCi0JICogc3VwcG9ydCBTTUIvU1BJLiBiY3NyLT5yZXNldHMgYml0IDEyOiAwPVNNQiAxPVNQSQotCSAqLwotI2lmZGVmIENPTkZJR19JMkNfQVUxNTUwCi0JYmNzci0+cmVzZXRzICY9IH5CQ1NSX1JFU0VUU19QQ1MwTVVYOwotI2VuZGlmCi0JYXVfc3luYygpOwotCi0jaWZkZWYgQ09ORklHX01JUFNfUEIxMjAwCi0JcHJpbnRrKEtFUk5fSU5GTyAiQU1EIEFsY2hlbXkgUGIxMjAwIEJvYXJkXG4iKTsKLSNlbmRpZgotI2lmZGVmIENPTkZJR19NSVBTX0RCMTIwMAotCXByaW50ayhLRVJOX0lORk8gIkFNRCBBbGNoZW15IERiMTIwMCBCb2FyZFxuIik7Ci0jZW5kaWYKLQotCS8qIFNldHVwIFBiMTIwMCBFeHRlcm5hbCBJbnRlcnJ1cHQgQ29udHJvbGxlciAqLwotCWJvYXJkX2luaXRfaXJxID0gX2JvYXJkX2luaXRfaXJxOwotfQotCi1pbnQgYm9hcmRfYXUxMjAwZmJfcGFuZWwodm9pZCkKLXsKLQlCQ1NSICpiY3NyID0gKEJDU1IgKilCQ1NSX0tTRUcxX0FERFI7Ci0JaW50IHA7Ci0KLQlwID0gYmNzci0+c3dpdGNoZXM7Ci0JcCA+Pj0gODsKLQlwICY9IDB4MEY7Ci0JcmV0dXJuIHA7Ci19Ci0KLWludCBib2FyZF9hdTEyMDBmYl9wYW5lbF9pbml0KHZvaWQpCi17Ci0JLyogQXBwbHkgcG93ZXIgKi8KLQlCQ1NSICpiY3NyID0gKEJDU1IgKilCQ1NSX0tTRUcxX0FERFI7Ci0KLQliY3NyLT5ib2FyZCB8PSBCQ1NSX0JPQVJEX0xDRFZFRSB8IEJDU1JfQk9BUkRfTENEVkREIHwgQkNTUl9CT0FSRF9MQ0RCTDsKLQkvKiBwcmludGsoS0VSTl9ERUJVRyAiYm9hcmRfYXUxMjAwZmJfcGFuZWxfaW5pdCgpXG4iKTsgKi8KLQlyZXR1cm4gMDsKLX0KLQotaW50IGJvYXJkX2F1MTIwMGZiX3BhbmVsX3NodXRkb3duKHZvaWQpCi17Ci0JLyogUmVtb3ZlIHBvd2VyICovCi0JQkNTUiAqYmNzciA9IChCQ1NSICopQkNTUl9LU0VHMV9BRERSOwotCi0JYmNzci0+Ym9hcmQgJj0gfihCQ1NSX0JPQVJEX0xDRFZFRSB8IEJDU1JfQk9BUkRfTENEVkREIHwKLQkJCSBCQ1NSX0JPQVJEX0xDREJMKTsKLQkvKiBwcmludGsoS0VSTl9ERUJVRyAiYm9hcmRfYXUxMjAwZmJfcGFuZWxfc2h1dGRvd24oKVxuIik7ICovCi0JcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvYWxjaGVteS9wYjEyMDAvaW5pdC5jIGIvYXJjaC9taXBzL2FsY2hlbXkvcGIxMjAwL2luaXQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTliMmEwZi4uMDAwMDAwMAotLS0gYS9hcmNoL21pcHMvYWxjaGVteS9wYjEyMDAvaW5pdC5jCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoKLSAqCi0gKiBCUklFRiBNT0RVTEUgREVTQ1JJUFRJT04KLSAqCVBCMTIwMCBib2FyZCBzZXR1cAotICoKLSAqIENvcHlyaWdodCAyMDAxLCAyMDA4IE1vbnRhVmlzdGEgU29mdHdhcmUgSW5jLgotICogQXV0aG9yOiBNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuIDxzb3VyY2VAbXZpc3RhLmNvbT4KLSAqCi0gKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiAgdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCi0gKiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCi0gKiAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiAgVEhJUyAgU09GVFdBUkUgIElTIFBST1ZJREVEICAgYGBBUyAgSVMnJyBBTkQgICBBTlkgIEVYUFJFU1MgT1IgSU1QTElFRAotICogIFdBUlJBTlRJRVMsICAgSU5DTFVESU5HLCBCVVQgTk9UICBMSU1JVEVEICBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTgotICogIE5PICBFVkVOVCAgU0hBTEwgICBUSEUgQVVUSE9SICBCRSAgICBMSUFCTEUgRk9SIEFOWSAgIERJUkVDVCwgSU5ESVJFQ1QsCi0gKiAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gKiAgTk9UIExJTUlURUQgICBUTywgUFJPQ1VSRU1FTlQgT0YgIFNVQlNUSVRVVEUgR09PRFMgIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiAgVVNFLCBEQVRBLCAgT1IgUFJPRklUUzsgT1IgIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OCi0gKiAgQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCi0gKiAgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi0gKiAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gKiAgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLQotI2luY2x1ZGUgPGFzbS9ib290aW5mby5oPgotCi0jaW5jbHVkZSA8cHJvbS5oPgotCi1jb25zdCBjaGFyICpnZXRfc3lzdGVtX3R5cGUodm9pZCkKLXsKLQlyZXR1cm4gIkFsY2hlbXkgUGIxMjAwIjsKLX0KLQotdm9pZCBfX2luaXQgcHJvbV9pbml0KHZvaWQpCi17Ci0JdW5zaWduZWQgY2hhciAqbWVtc2l6ZV9zdHI7Ci0JdW5zaWduZWQgbG9uZyBtZW1zaXplOwotCi0JcHJvbV9hcmdjID0gKGludClmd19hcmcwOwotCXByb21fYXJndiA9IChjaGFyICoqKWZ3X2FyZzE7Ci0JcHJvbV9lbnZwID0gKGNoYXIgKiopZndfYXJnMjsKLQotCXByb21faW5pdF9jbWRsaW5lKCk7Ci0JbWVtc2l6ZV9zdHIgPSBwcm9tX2dldGVudigibWVtc2l6ZSIpOwotCWlmICghbWVtc2l6ZV9zdHIpCi0JCW1lbXNpemUgPSAweDA4MDAwMDAwOwotCWVsc2UKLQkJc3RyaWN0X3N0cnRvbChtZW1zaXplX3N0ciwgMCwgJm1lbXNpemUpOwotCWFkZF9tZW1vcnlfcmVnaW9uKDAsIG1lbXNpemUsIEJPT1RfTUVNX1JBTSk7Ci19CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvYWxjaGVteS9wYjEyMDAvaXJxbWFwLmMgYi9hcmNoL21pcHMvYWxjaGVteS9wYjEyMDAvaXJxbWFwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhNTA1YWQuLjAwMDAwMDAKLS0tIGEvYXJjaC9taXBzL2FsY2hlbXkvcGIxMjAwL2lycW1hcC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTYwICswLDAgQEAKLS8qCi0gKiBCUklFRiBNT0RVTEUgREVTQ1JJUFRJT04KLSAqCUF1MXh4eCBpcnEgbWFwIHRhYmxlCi0gKgotICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZQkgaXQgYW5kL29yIG1vZGlmeSBpdAotICogIHVuZGVyICB0aGUgdGVybXMgb2YJIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQotICogIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlCUxpY2Vuc2UsIG9yIChhdCB5b3VyCi0gKiAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiAgVEhJUyAgU09GVFdBUkUgIElTIFBST1ZJREVECSAgYGBBUwlJUycnIEFORCAgIEFOWQlFWFBSRVNTIE9SIElNUExJRUQKLSAqICBXQVJSQU5USUVTLAkgIElOQ0xVRElORywgQlVUIE5PVCAgTElNSVRFRCAgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqICBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4KLSAqICBOTwlFVkVOVCAgU0hBTEwgICBUSEUgQVVUSE9SICBCRQkgTElBQkxFIEZPUiBBTlkJICBESVJFQ1QsIElORElSRUNULAotICogIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogIE5PVCBMSU1JVEVECSAgVE8sIFBST0NVUkVNRU5UIE9GICBTVUJTVElUVVRFIEdPT0RTCU9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiAgVVNFLCBEQVRBLAlPUiBQUk9GSVRTOyBPUglCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTgotICogIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCSBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgotICogIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotICogIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlICB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICogIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0KLSNpbmNsdWRlIDxhc20vbWFjaC1hdTF4MDAvYXUxMDAwLmg+Ci0KLSNpZmRlZiBDT05GSUdfTUlQU19QQjEyMDAKLSNpbmNsdWRlIDxhc20vbWFjaC1wYjF4MDAvcGIxMjAwLmg+Ci0jZW5kaWYKLQotI2lmZGVmIENPTkZJR19NSVBTX0RCMTIwMAotI2luY2x1ZGUgPGFzbS9tYWNoLWRiMXgwMC9kYjEyMDAuaD4KLSNkZWZpbmUgUEIxMjAwX0lOVF9CRUdJTiBEQjEyMDBfSU5UX0JFR0lOCi0jZGVmaW5lIFBCMTIwMF9JTlRfRU5EIERCMTIwMF9JTlRfRU5ECi0jZW5kaWYKLQotc3RydWN0IGF1MXh4eF9pcnFtYXAgX19pbml0ZGF0YSBhdTF4eHhfaXJxX21hcFtdID0gewotCS8qIFRoaXMgaXMgZXh0ZXJuYWwgaW50ZXJydXB0IGNhc2NhZGUgKi8KLQl7IEFVMTAwMF9HUElPXzcsIElOVENfSU5UX0xPV19MRVZFTCwgMCB9LAotfTsKLQotaW50IF9faW5pdGRhdGEgYXUxeHh4X25yX2lycXMgPSBBUlJBWV9TSVpFKGF1MXh4eF9pcnFfbWFwKTsKLQotLyoKLSAqIFN1cHBvcnQgZm9yIEV4dGVybmFsIGludGVycnVwdHMgb24gdGhlIFBiMTIwMCBEZXZlbG9wbWVudCBwbGF0Zm9ybS4KLSAqLwotc3RhdGljIHZvbGF0aWxlIGludCBwYjEyMDBfY2FzY2FkZV9lbjsKLQotaXJxcmV0dXJuX3QgcGIxMjAwX2Nhc2NhZGVfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpkZXZfaWQpCi17Ci0JdW5zaWduZWQgc2hvcnQgYmlzciA9IGJjc3ItPmludF9zdGF0dXM7Ci0JaW50IGV4dGlycV9uciA9IDA7Ci0KLQkvKiBDbGVhciBhbGwgdGhlIGVkZ2UgaW50ZXJydXB0cy4gVGhpcyBoYXMgbm8gZWZmZWN0IG9uIGxldmVsLiAqLwotCWJjc3ItPmludF9zdGF0dXMgPSBiaXNyOwotCWZvciAoIDsgYmlzcjsgYmlzciAmPSBiaXNyIC0gMSkgewotCQlleHRpcnFfbnIgPSBQQjEyMDBfSU5UX0JFR0lOICsgX19mZnMoYmlzcik7Ci0JCS8qIEFjayBhbmQgZGlzcGF0Y2ggSVJRICovCi0JCWRvX0lSUShleHRpcnFfbnIpOwotCX0KLQotCXJldHVybiBJUlFfUkVUVkFMKDEpOwotfQotCi1pbmxpbmUgdm9pZCBwYjEyMDBfZW5hYmxlX2lycSh1bnNpZ25lZCBpbnQgaXJxX25yKQotewotCWJjc3ItPmludHNldF9tYXNrID0gMSA8PCAoaXJxX25yIC0gUEIxMjAwX0lOVF9CRUdJTik7Ci0JYmNzci0+aW50c2V0ID0gMSA8PCAoaXJxX25yIC0gUEIxMjAwX0lOVF9CRUdJTik7Ci19Ci0KLWlubGluZSB2b2lkIHBiMTIwMF9kaXNhYmxlX2lycSh1bnNpZ25lZCBpbnQgaXJxX25yKQotewotCWJjc3ItPmludGNscl9tYXNrID0gMSA8PCAoaXJxX25yIC0gUEIxMjAwX0lOVF9CRUdJTik7Ci0JYmNzci0+aW50Y2xyID0gMSA8PCAoaXJxX25yIC0gUEIxMjAwX0lOVF9CRUdJTik7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgcGIxMjAwX3NldHVwX2Nhc2NhZGUodm9pZCkKLXsKLQlyZXR1cm4gcmVxdWVzdF9pcnEoQVUxMDAwX0dQSU9fNywgJnBiMTIwMF9jYXNjYWRlX2hhbmRsZXIsCi0JCQkgICAwLCAiUGIxMjAwIENhc2NhZGUiLCAmcGIxMjAwX2Nhc2NhZGVfaGFuZGxlcik7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgcGIxMjAwX3N0YXJ0dXBfaXJxKHVuc2lnbmVkIGludCBpcnEpCi17Ci0JaWYgKCsrcGIxMjAwX2Nhc2NhZGVfZW4gPT0gMSkgewotCQlpbnQgcmVzOwotCi0JCXJlcyA9IHBiMTIwMF9zZXR1cF9jYXNjYWRlKCk7Ci0JCWlmIChyZXMpCi0JCQlyZXR1cm4gcmVzOwotCX0KLQotCXBiMTIwMF9lbmFibGVfaXJxKGlycSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgcGIxMjAwX3NodXRkb3duX2lycSh1bnNpZ25lZCBpbnQgaXJxKQotewotCXBiMTIwMF9kaXNhYmxlX2lycShpcnEpOwotCWlmICgtLXBiMTIwMF9jYXNjYWRlX2VuID09IDApCi0JCWZyZWVfaXJxKEFVMTAwMF9HUElPXzcsICZwYjEyMDBfY2FzY2FkZV9oYW5kbGVyKTsKLX0KLQotc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBleHRlcm5hbF9pcnFfdHlwZSA9IHsKLSNpZmRlZiBDT05GSUdfTUlQU19QQjEyMDAKLQkubmFtZSA9ICJQYjEyMDAgRXh0IiwKLSNlbmRpZgotI2lmZGVmIENPTkZJR19NSVBTX0RCMTIwMAotCS5uYW1lID0gIkRiMTIwMCBFeHQiLAotI2VuZGlmCi0JLnN0YXJ0dXAgID0gcGIxMjAwX3N0YXJ0dXBfaXJxLAotCS5zaHV0ZG93biA9IHBiMTIwMF9zaHV0ZG93bl9pcnEsCi0JLmFjayAgICAgID0gcGIxMjAwX2Rpc2FibGVfaXJxLAotCS5tYXNrICAgICA9IHBiMTIwMF9kaXNhYmxlX2lycSwKLQkubWFza19hY2sgPSBwYjEyMDBfZGlzYWJsZV9pcnEsCi0JLnVubWFzayAgID0gcGIxMjAwX2VuYWJsZV9pcnEsCi19OwotCi12b2lkIF9ib2FyZF9pbml0X2lycSh2b2lkKQotewotCXVuc2lnbmVkIGludCBpcnE7Ci0KLSNpZmRlZiBDT05GSUdfTUlQU19QQjEyMDAKLQkvKiBXZSBoYXZlIGEgcHJvYmxlbSB3aXRoIENQTEQgcmV2IDMuICovCi0JaWYgKCgoYmNzci0+d2hvYW1pICYgQkNTUl9XSE9BTUlfQ1BMRCkgPj4gNCkgPD0gMykgewotCQlwcmludGsoS0VSTl9FUlIgIldBUk5JTkchISFcbiIpOwotCQlwcmludGsoS0VSTl9FUlIgIldBUk5JTkchISFcbiIpOwotCQlwcmludGsoS0VSTl9FUlIgIldBUk5JTkchISFcbiIpOwotCQlwcmludGsoS0VSTl9FUlIgIldBUk5JTkchISFcbiIpOwotCQlwcmludGsoS0VSTl9FUlIgIldBUk5JTkchISFcbiIpOwotCQlwcmludGsoS0VSTl9FUlIgIldBUk5JTkchISFcbiIpOwotCQlwcmludGsoS0VSTl9FUlIgIlBiMTIwMCBtdXN0IGJlIGF0IENQTEQgcmV2IDQuIFBsZWFzZSBoYXZlIFBiMTIwMFxuIik7Ci0JCXByaW50ayhLRVJOX0VSUiAidXBkYXRlZCB0byBsYXRlc3QgcmV2aXNpb24uIFRoaXMgc29mdHdhcmUgd2lsbFxuIik7Ci0JCXByaW50ayhLRVJOX0VSUiAibm90IHdvcmsgb24gYW55dGhpbmcgbGVzcyB0aGFuIENQTEQgcmV2IDQuXG4iKTsKLQkJcHJpbnRrKEtFUk5fRVJSICJXQVJOSU5HISEhXG4iKTsKLQkJcHJpbnRrKEtFUk5fRVJSICJXQVJOSU5HISEhXG4iKTsKLQkJcHJpbnRrKEtFUk5fRVJSICJXQVJOSU5HISEhXG4iKTsKLQkJcHJpbnRrKEtFUk5fRVJSICJXQVJOSU5HISEhXG4iKTsKLQkJcHJpbnRrKEtFUk5fRVJSICJXQVJOSU5HISEhXG4iKTsKLQkJcHJpbnRrKEtFUk5fRVJSICJXQVJOSU5HISEhXG4iKTsKLQkJcGFuaWMoIkdhbWUgb3Zlci4gIFlvdXIgc2NvcmUgaXMgMC4iKTsKLQl9Ci0jZW5kaWYKLQotCWZvciAoaXJxID0gUEIxMjAwX0lOVF9CRUdJTjsgaXJxIDw9IFBCMTIwMF9JTlRfRU5EOyBpcnErKykgewotCQlzZXRfaXJxX2NoaXBfYW5kX2hhbmRsZXIoaXJxLCAmZXh0ZXJuYWxfaXJxX3R5cGUsCi0JCQkJCSBoYW5kbGVfbGV2ZWxfaXJxKTsKLQkJcGIxMjAwX2Rpc2FibGVfaXJxKGlycSk7Ci0JfQotCi0JLyoKLQkgKiBHUElPXzcgY2FuIG5vdCBiZSBob29rZWQgaGVyZSwgc28gaXQgaXMgaG9va2VkIHVwb24gZmlyc3QKLQkgKiByZXF1ZXN0IG9mIGFueSBzb3VyY2UgYXR0YWNoZWQgdG8gdGhlIGNhc2NhZGUuCi0JICovCi19CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvYWxjaGVteS9wYjE1MDAvTWFrZWZpbGUgYi9hcmNoL21pcHMvYWxjaGVteS9wYjE1MDAvTWFrZWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwMmYzOGQuLjAwMDAwMDAKLS0tIGEvYXJjaC9taXBzL2FsY2hlbXkvcGIxNTAwL01ha2VmaWxlCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0jCi0jICBDb3B5cmlnaHQgMjAwMCwgMjAwMSwgMjAwOCBNb250YVZpc3RhIFNvZnR3YXJlIEluYy4KLSMgIEF1dGhvcjogTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLiA8c291cmNlQG12aXN0YS5jb20+Ci0jCi0jIE1ha2VmaWxlIGZvciB0aGUgQWxjaGVteSBTZW1pY29uZHVjdG9yIFBiMTUwMCBib2FyZC4KLSMKLQotbGliLXkgOj0gaW5pdC5vIGJvYXJkX3NldHVwLm8gaXJxbWFwLm8KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9hbGNoZW15L3BiMTUwMC9ib2FyZF9zZXR1cC5jIGIvYXJjaC9taXBzL2FsY2hlbXkvcGIxNTAwL2JvYXJkX3NldHVwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzNTc3MWMuLjAwMDAwMDAKLS0tIGEvYXJjaC9taXBzL2FsY2hlbXkvcGIxNTAwL2JvYXJkX3NldHVwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAwLCAyMDA4IE1vbnRhVmlzdGEgU29mdHdhcmUgSW5jLgotICogQXV0aG9yOiBNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuIDxzb3VyY2VAbXZpc3RhLmNvbT4KLSAqCi0gKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiAgdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCi0gKiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCi0gKiAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiAgVEhJUyAgU09GVFdBUkUgIElTIFBST1ZJREVEICAgYGBBUyAgSVMnJyBBTkQgICBBTlkgIEVYUFJFU1MgT1IgSU1QTElFRAotICogIFdBUlJBTlRJRVMsICAgSU5DTFVESU5HLCBCVVQgTk9UICBMSU1JVEVEICBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTgotICogIE5PICBFVkVOVCAgU0hBTEwgICBUSEUgQVVUSE9SICBCRSAgICBMSUFCTEUgRk9SIEFOWSAgIERJUkVDVCwgSU5ESVJFQ1QsCi0gKiAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gKiAgTk9UIExJTUlURUQgICBUTywgUFJPQ1VSRU1FTlQgT0YgIFNVQlNUSVRVVEUgR09PRFMgIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiAgVVNFLCBEQVRBLCAgT1IgUFJPRklUUzsgT1IgIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OCi0gKiAgQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCi0gKiAgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi0gKiAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gKiAgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotCi0jaW5jbHVkZSA8YXNtL21hY2gtYXUxeDAwL2F1MTAwMC5oPgotI2luY2x1ZGUgPGFzbS9tYWNoLXBiMXgwMC9wYjE1MDAuaD4KLQotdm9pZCBib2FyZF9yZXNldCh2b2lkKQotewotCS8qIEhpdCBCQ1NSLlJTVF9WRERJW1NPRlRfUkVTRVRdICovCi0JYXVfd3JpdGVsKDB4MDAwMDAwMDAsIFBCMTUwMF9SU1RfVkRESSk7Ci19Ci0KLXZvaWQgX19pbml0IGJvYXJkX3NldHVwKHZvaWQpCi17Ci0JdTMyIHBpbl9mdW5jOwotCXUzMiBzeXNfZnJlcWN0cmwsIHN5c19jbGtzcmM7Ci0KLQlzeXNfY2xrc3JjID0gc3lzX2ZyZXFjdHJsID0gcGluX2Z1bmMgPSAwOwotCS8qIFNldCBBVVggY2xvY2sgdG8gMTIgTUh6ICogOCA9IDk2IE1IeiAqLwotCWF1X3dyaXRlbCg4LCBTWVNfQVVYUExMKTsKLQlhdV93cml0ZWwoMCwgU1lTX1BJTlNUQVRFUkQpOwotCXVkZWxheSgxMDApOwotCi0jaWYgZGVmaW5lZChDT05GSUdfVVNCX09IQ0lfSENEKSB8fCBkZWZpbmVkKENPTkZJR19VU0JfT0hDSV9IQ0RfTU9EVUxFKQotCi0JLyogR1BJTzIwMSBpcyBpbnB1dCBmb3IgUENNQ0lBIGNhcmQgZGV0ZWN0ICovCi0JLyogR1BJTzIwMyBpcyBpbnB1dCBmb3IgUENNQ0lBIGludGVycnVwdCByZXF1ZXN0ICovCi0JYXVfd3JpdGVsKGF1X3JlYWRsKEdQSU8yX0RJUikgJiB+KCgxIDw8IDEpIHwgKDEgPDwgMykpLCBHUElPMl9ESVIpOwotCi0JLyogWmVybyBhbmQgZGlzYWJsZSBGUkVRMiAqLwotCXN5c19mcmVxY3RybCA9IGF1X3JlYWRsKFNZU19GUkVRQ1RSTDApOwotCXN5c19mcmVxY3RybCAmPSB+MHhGRkYwMDAwMDsKLQlhdV93cml0ZWwoc3lzX2ZyZXFjdHJsLCBTWVNfRlJFUUNUUkwwKTsKLQotCS8qIHplcm8gYW5kIGRpc2FibGUgVVNCSC9VU0JEIGNsb2NrcyAqLwotCXN5c19jbGtzcmMgPSBhdV9yZWFkbChTWVNfQ0xLU1JDKTsKLQlzeXNfY2xrc3JjICY9IH4oU1lTX0NTX0NVRCB8IFNZU19DU19EVUQgfCBTWVNfQ1NfTVVEX01BU0sgfAotCQkJU1lTX0NTX0NVSCB8IFNZU19DU19EVUggfCBTWVNfQ1NfTVVIX01BU0spOwotCWF1X3dyaXRlbChzeXNfY2xrc3JjLCBTWVNfQ0xLU1JDKTsKLQotCXN5c19mcmVxY3RybCA9IGF1X3JlYWRsKFNZU19GUkVRQ1RSTDApOwotCXN5c19mcmVxY3RybCAmPSB+MHhGRkYwMDAwMDsKLQotCXN5c19jbGtzcmMgPSBhdV9yZWFkbChTWVNfQ0xLU1JDKTsKLQlzeXNfY2xrc3JjICY9IH4oU1lTX0NTX0NVRCB8IFNZU19DU19EVUQgfCBTWVNfQ1NfTVVEX01BU0sgfAotCQkJU1lTX0NTX0NVSCB8IFNZU19DU19EVUggfCBTWVNfQ1NfTVVIX01BU0spOwotCi0JLyogRlJFUTIgPSBhdXgvMiA9IDQ4IE1IeiAqLwotCXN5c19mcmVxY3RybCB8PSAoMCA8PCBTWVNfRkNfRlJESVYyX0JJVCkgfCBTWVNfRkNfRkUyIHwgU1lTX0ZDX0ZTMjsKLQlhdV93cml0ZWwoc3lzX2ZyZXFjdHJsLCBTWVNfRlJFUUNUUkwwKTsKLQotCS8qCi0JICogUm91dGUgNDhNSHogRlJFUTIgaW50byBVU0IgSG9zdCBhbmQvb3IgRGV2aWNlCi0JICovCi0Jc3lzX2Nsa3NyYyB8PSBTWVNfQ1NfTVVYX0ZRMiA8PCBTWVNfQ1NfTVVIX0JJVDsKLQlhdV93cml0ZWwoc3lzX2Nsa3NyYywgU1lTX0NMS1NSQyk7Ci0KLQlwaW5fZnVuYyA9IGF1X3JlYWRsKFNZU19QSU5GVU5DKSAmIH5TWVNfUEZfVVNCOwotCS8qIDJuZCBVU0IgcG9ydCBpcyBVU0IgaG9zdCAqLwotCXBpbl9mdW5jIHw9IFNZU19QRl9VU0I7Ci0JYXVfd3JpdGVsKHBpbl9mdW5jLCBTWVNfUElORlVOQyk7Ci0jZW5kaWYgLyogZGVmaW5lZChDT05GSUdfVVNCX09IQ0lfSENEKSB8fCBkZWZpbmVkKENPTkZJR19VU0JfT0hDSV9IQ0RfTU9EVUxFKSAqLwotCi0jaWZkZWYgQ09ORklHX1BDSQotCS8qIFNldHVwIFBDSSBidXMgY29udHJvbGxlciAqLwotCWF1X3dyaXRlbCgwLCBBdTE1MDBfUENJX0NNRU0pOwotCWF1X3dyaXRlbCgweDAwMDAzZmZmLCBBdTE1MDBfQ0ZHX0JBU0UpOwotI2lmIGRlZmluZWQoX19NSVBTRUJfXykKLQlhdV93cml0ZWwoMHhmIHwgKDIgPDwgNikgfCAoMSA8PCA0KSwgQXUxNTAwX1BDSV9DRkcpOwotI2Vsc2UKLQlhdV93cml0ZWwoMHhmLCBBdTE1MDBfUENJX0NGRyk7Ci0jZW5kaWYKLQlhdV93cml0ZWwoMHhmMDAwMDAwMCwgQXUxNTAwX1BDSV9NV01BU0tfREVWKTsKLQlhdV93cml0ZWwoMCwgQXUxNTAwX1BDSV9NV0JBU0VfUkVWX0NDTCk7Ci0JYXVfd3JpdGVsKDB4MDJhMDAzNTYsIEF1MTUwMF9QQ0lfU1RBVENNRCk7Ci0JYXVfd3JpdGVsKDB4MDAwMDNjMDQsIEF1MTUwMF9QQ0lfSERSVFlQRSk7Ci0JYXVfd3JpdGVsKDB4MDAwMDAwMDgsIEF1MTUwMF9QQ0lfTUJBUik7Ci0JYXVfc3luYygpOwotI2VuZGlmCi0KLQkvKiBFbmFibGUgc3lzIGJ1cyBjbG9jayBkaXZpZGVyIHdoZW4gSURMRSBzdGF0ZSBvciBubyBidXMgYWN0aXZpdHkuICovCi0JYXVfd3JpdGVsKGF1X3JlYWRsKFNZU19QT1dFUkNUUkwpIHwgKDB4MyA8PCA1KSwgU1lTX1BPV0VSQ1RSTCk7Ci0KLQkvKiBFbmFibGUgdGhlIFJUQyBpZiBub3QgYWxyZWFkeSBlbmFibGVkICovCi0JaWYgKCEoYXVfcmVhZGwoMHhhYzAwMDAyOCkgJiAweDIwKSkgewotCQlwcmludGsoS0VSTl9JTkZPICJlbmFibGluZyBjbG9jayAuLi5cbiIpOwotCQlhdV93cml0ZWwoKGF1X3JlYWRsKDB4YWMwMDAwMjgpIHwgMHgyMCksIDB4YWMwMDAwMjgpOwotCX0KLQkvKiBQdXQgdGhlIGNsb2NrIGluIEJDRCBtb2RlICovCi0JaWYgKGF1X3JlYWRsKDB4YWMwMDAwMmMpICYgMHg0KSB7IC8qIHJlZyBCICovCi0JCWF1X3dyaXRlbChhdV9yZWFkbCgweGFjMDAwMDJjKSAmIH4weDQsIDB4YWMwMDAwMmMpOwotCQlhdV9zeW5jKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2FsY2hlbXkvcGIxNTAwL2luaXQuYyBiL2FyY2gvbWlwcy9hbGNoZW15L3BiMTUwMC9pbml0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiNmUzOTUuLjAwMDAwMDAKLS0tIGEvYXJjaC9taXBzL2FsY2hlbXkvcGIxNTAwL2luaXQuYworKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qCi0gKgotICogQlJJRUYgTU9EVUxFIERFU0NSSVBUSU9OCi0gKglQYjE1MDAgYm9hcmQgc2V0dXAKLSAqCi0gKiBDb3B5cmlnaHQgMjAwMSwgMjAwOCBNb250YVZpc3RhIFNvZnR3YXJlIEluYy4KLSAqIEF1dGhvcjogTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLiA8c291cmNlQG12aXN0YS5jb20+Ci0gKgotICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAotICogIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQotICogIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgotICogIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogIFRISVMgIFNPRlRXQVJFICBJUyBQUk9WSURFRCAgIGBgQVMgIElTJycgQU5EICAgQU5ZICBFWFBSRVNTIE9SIElNUExJRUQKLSAqICBXQVJSQU5USUVTLCAgIElOQ0xVRElORywgQlVUIE5PVCAgTElNSVRFRCAgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqICBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4KLSAqICBOTyAgRVZFTlQgIFNIQUxMICAgVEhFIEFVVEhPUiAgQkUgICAgTElBQkxFIEZPUiBBTlkgICBESVJFQ1QsIElORElSRUNULAotICogIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogIE5PVCBMSU1JVEVEICAgVE8sIFBST0NVUkVNRU5UIE9GICBTVUJTVElUVVRFIEdPT0RTICBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogIFVTRSwgREFUQSwgIE9SIFBST0ZJVFM7IE9SICBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTgotICogIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOICBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgotICogIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotICogIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlICB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICogIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0KLSNpbmNsdWRlIDxhc20vYm9vdGluZm8uaD4KLQotI2luY2x1ZGUgPHByb20uaD4KLQotY29uc3QgY2hhciAqZ2V0X3N5c3RlbV90eXBlKHZvaWQpCi17Ci0JcmV0dXJuICJBbGNoZW15IFBiMTUwMCI7Ci19Ci0KLXZvaWQgX19pbml0IHByb21faW5pdCh2b2lkKQotewotCXVuc2lnbmVkIGNoYXIgKm1lbXNpemVfc3RyOwotCXVuc2lnbmVkIGxvbmcgbWVtc2l6ZTsKLQotCXByb21fYXJnYyA9IChpbnQpZndfYXJnMDsKLQlwcm9tX2FyZ3YgPSAoY2hhciAqKilmd19hcmcxOwotCXByb21fZW52cCA9IChjaGFyICoqKWZ3X2FyZzI7Ci0KLQlwcm9tX2luaXRfY21kbGluZSgpOwotCW1lbXNpemVfc3RyID0gcHJvbV9nZXRlbnYoIm1lbXNpemUiKTsKLQlpZiAoIW1lbXNpemVfc3RyKQotCQltZW1zaXplID0gMHgwNDAwMDAwMDsKLQllbHNlCi0JCXN0cmljdF9zdHJ0b2wobWVtc2l6ZV9zdHIsIDAsICZtZW1zaXplKTsKLQlhZGRfbWVtb3J5X3JlZ2lvbigwLCBtZW1zaXplLCBCT09UX01FTV9SQU0pOwotfQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2FsY2hlbXkvcGIxNTAwL2lycW1hcC5jIGIvYXJjaC9taXBzL2FsY2hlbXkvcGIxNTAwL2lycW1hcC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOWM0NjgyLi4wMDAwMDAwCi0tLSBhL2FyY2gvbWlwcy9hbGNoZW15L3BiMTUwMC9pcnFtYXAuYworKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qCi0gKiBCUklFRiBNT0RVTEUgREVTQ1JJUFRJT04KLSAqCUF1MXh4eCBpcnEgbWFwIHRhYmxlCi0gKgotICogQ29weXJpZ2h0IDIwMDMgRW1iZWRkZWQgRWRnZSwgTExDCi0gKgkJZGFuQGVtYmVkZGVkZWRnZS5jb20KLSAqCi0gKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlCSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiAgdW5kZXIgIHRoZSB0ZXJtcyBvZgkgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCi0gKiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUJTGljZW5zZSwgb3IgKGF0IHlvdXIKLSAqICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqICBUSElTICBTT0ZUV0FSRSAgSVMgUFJPVklERUQJICBgYEFTCUlTJycgQU5EICAgQU5ZCUVYUFJFU1MgT1IgSU1QTElFRAotICogIFdBUlJBTlRJRVMsCSAgSU5DTFVESU5HLCBCVVQgTk9UICBMSU1JVEVEICBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTgotICogIE5PCUVWRU5UICBTSEFMTCAgIFRIRSBBVVRIT1IgIEJFCSBMSUFCTEUgRk9SIEFOWQkgIERJUkVDVCwgSU5ESVJFQ1QsCi0gKiAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gKiAgTk9UIExJTUlURUQJICBUTywgUFJPQ1VSRU1FTlQgT0YgIFNVQlNUSVRVVEUgR09PRFMJT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqICBVU0UsIERBVEEsCU9SIFBST0ZJVFM7IE9SCUJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OCi0gKiAgQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4JIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCi0gKiAgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi0gKiAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gKiAgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLQotI2luY2x1ZGUgPGFzbS9tYWNoLWF1MXgwMC9hdTEwMDAuaD4KLQotY2hhciBpcnFfdGFiX2FsY2hlbXlbXVs1XSBfX2luaXRkYXRhID0gewotCVsxMl0gPSB7IC0xLCBJTlRBLCBJTlRYLCBJTlRYLCBJTlRYIH0sICAgLyogSURTRUwgMTIgLSBIUFQzNzAJKi8KLQlbMTNdID0geyAtMSwgSU5UQSwgSU5UQiwgSU5UQywgSU5URCB9LCAgIC8qIElEU0VMIDEzIC0gUENJIHNsb3QgKi8KLX07Ci0KLXN0cnVjdCBhdTF4eHhfaXJxbWFwIF9faW5pdGRhdGEgYXUxeHh4X2lycV9tYXBbXSA9IHsKLQl7IEFVMTUwMF9HUElPXzIwNCwgSU5UQ19JTlRfSElHSF9MRVZFTCwgMCB9LAotCXsgQVUxNTAwX0dQSU9fMjAxLCBJTlRDX0lOVF9MT1dfTEVWRUwsIDAgfSwKLQl7IEFVMTUwMF9HUElPXzIwMiwgSU5UQ19JTlRfTE9XX0xFVkVMLCAwIH0sCi0JeyBBVTE1MDBfR1BJT18yMDMsIElOVENfSU5UX0xPV19MRVZFTCwgMCB9LAotCXsgQVUxNTAwX0dQSU9fMjA1LCBJTlRDX0lOVF9MT1dfTEVWRUwsIDAgfSwKLX07Ci0KLWludCBfX2luaXRkYXRhIGF1MXh4eF9ucl9pcnFzID0gQVJSQVlfU0laRShhdTF4eHhfaXJxX21hcCk7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvYWxjaGVteS9wYjE1NTAvTWFrZWZpbGUgYi9hcmNoL21pcHMvYWxjaGVteS9wYjE1NTAvTWFrZWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkOGJlY2EuLjAwMDAwMDAKLS0tIGEvYXJjaC9taXBzL2FsY2hlbXkvcGIxNTUwL01ha2VmaWxlCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0jCi0jICBDb3B5cmlnaHQgMjAwMCwgMjAwOCBNb250YVZpc3RhIFNvZnR3YXJlIEluYy4KLSMgIEF1dGhvcjogTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLiA8c291cmNlQG12aXN0YS5jb20+Ci0jCi0jIE1ha2VmaWxlIGZvciB0aGUgQWxjaGVteSBTZW1pY29uZHVjdG9yIFBiMTU1MCBib2FyZC4KLSMKLQotbGliLXkgOj0gaW5pdC5vIGJvYXJkX3NldHVwLm8gaXJxbWFwLm8KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9hbGNoZW15L3BiMTU1MC9ib2FyZF9zZXR1cC5jIGIvYXJjaC9taXBzL2FsY2hlbXkvcGIxNTUwL2JvYXJkX3NldHVwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlZDc2YjYuLjAwMDAwMDAKLS0tIGEvYXJjaC9taXBzL2FsY2hlbXkvcGIxNTUwL2JvYXJkX3NldHVwLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKgotICoKLSAqIEJSSUVGIE1PRFVMRSBERVNDUklQVElPTgotICoJQWxjaGVteSBQYjE1NTAgYm9hcmQgc2V0dXAuCi0gKgotICogQ29weXJpZ2h0IDIwMDAsIDIwMDggTW9udGFWaXN0YSBTb2Z0d2FyZSBJbmMuCi0gKiBBdXRob3I6IE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4gPHNvdXJjZUBtdmlzdGEuY29tPgotICoKLSAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqICB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKLSAqICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKLSAqICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqICBUSElTICBTT0ZUV0FSRSAgSVMgUFJPVklERUQgICBgYEFTICBJUycnIEFORCAgIEFOWSAgRVhQUkVTUyBPUiBJTVBMSUVECi0gKiAgV0FSUkFOVElFUywgICBJTkNMVURJTkcsIEJVVCBOT1QgIExJTUlURUQgIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0gKiAgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOCi0gKiAgTk8gIEVWRU5UICBTSEFMTCAgIFRIRSBBVVRIT1IgIEJFICAgIExJQUJMRSBGT1IgQU5ZICAgRElSRUNULCBJTkRJUkVDVCwKLSAqICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSAqICBOT1QgTElNSVRFRCAgIFRPLCBQUk9DVVJFTUVOVCBPRiAgU1VCU1RJVFVURSBHT09EUyAgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqICBVU0UsIERBVEEsICBPUiBQUk9GSVRTOyBPUiAgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04KLSAqICBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiAgQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqICAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKLSAqICBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLSAqICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSAgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAqICA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotCi0jaW5jbHVkZSA8YXNtL21hY2gtYXUxeDAwL2F1MTAwMC5oPgotI2luY2x1ZGUgPGFzbS9tYWNoLXBiMXgwMC9wYjE1NTAuaD4KLQotdm9pZCBib2FyZF9yZXNldCh2b2lkKQotewotCS8qIEhpdCBCQ1NSLlNZU1RFTVtSRVNFVF0gKi8KLQlhdV93cml0ZXcoYXVfcmVhZHcoMHhBRjAwMDAxQykgJiB+QkNTUl9TWVNURU1fUkVTRVQsIDB4QUYwMDAwMUMpOwotfQotCi12b2lkIF9faW5pdCBib2FyZF9zZXR1cCh2b2lkKQotewotCXUzMiBwaW5fZnVuYzsKLQotCS8qCi0JICogRW5hYmxlIFBTQzEgU1lOQyBmb3IgQUMnOTcuICBOb3JtYWx5IGRvbmUgaW4gYXVkaW8gZHJpdmVyLAotCSAqIGJ1dCBpdCBpcyBib2FyZCBzcGVjaWZpYyBjb2RlLCBzbyBwdXQgaXQgaGVyZS4KLQkgKi8KLQlwaW5fZnVuYyA9IGF1X3JlYWRsKFNZU19QSU5GVU5DKTsKLQlhdV9zeW5jKCk7Ci0JcGluX2Z1bmMgfD0gU1lTX1BGX01VU1RfQkVfU0VUIHwgU1lTX1BGX1BTQzFfUzE7Ci0JYXVfd3JpdGVsKHBpbl9mdW5jLCBTWVNfUElORlVOQyk7Ci0KLQlhdV93cml0ZWwoMCwgKHUzMiliY3NyIHwgMHgxMCk7IC8qIHR1cm4gb2ZmIFBDTUNJQSBwb3dlciAqLwotCWF1X3N5bmMoKTsKLQotCXByaW50ayhLRVJOX0lORk8gIkFNRCBBbGNoZW15IFBiMTU1MCBCb2FyZFxuIik7Ci19CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvYWxjaGVteS9wYjE1NTAvaW5pdC5jIGIvYXJjaC9taXBzL2FsY2hlbXkvcGIxNTUwL2luaXQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTEwNTVhMS4uMDAwMDAwMAotLS0gYS9hcmNoL21pcHMvYWxjaGVteS9wYjE1NTAvaW5pdC5jCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoKLSAqCi0gKiBCUklFRiBNT0RVTEUgREVTQ1JJUFRJT04KLSAqCVBiMTU1MCBib2FyZCBzZXR1cAotICoKLSAqIENvcHlyaWdodCAyMDAxLCAyMDA4IE1vbnRhVmlzdGEgU29mdHdhcmUgSW5jLgotICogQXV0aG9yOiBNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuIDxzb3VyY2VAbXZpc3RhLmNvbT4KLSAqCi0gKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiAgdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCi0gKiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCi0gKiAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiAgVEhJUyAgU09GVFdBUkUgIElTIFBST1ZJREVEICAgYGBBUyAgSVMnJyBBTkQgICBBTlkgIEVYUFJFU1MgT1IgSU1QTElFRAotICogIFdBUlJBTlRJRVMsICAgSU5DTFVESU5HLCBCVVQgTk9UICBMSU1JVEVEICBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTgotICogIE5PICBFVkVOVCAgU0hBTEwgICBUSEUgQVVUSE9SICBCRSAgICBMSUFCTEUgRk9SIEFOWSAgIERJUkVDVCwgSU5ESVJFQ1QsCi0gKiAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gKiAgTk9UIExJTUlURUQgICBUTywgUFJPQ1VSRU1FTlQgT0YgIFNVQlNUSVRVVEUgR09PRFMgIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiAgVVNFLCBEQVRBLCAgT1IgUFJPRklUUzsgT1IgIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OCi0gKiAgQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCi0gKiAgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi0gKiAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gKiAgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLQotI2luY2x1ZGUgPGFzbS9ib290aW5mby5oPgotCi0jaW5jbHVkZSA8cHJvbS5oPgotCi1jb25zdCBjaGFyICpnZXRfc3lzdGVtX3R5cGUodm9pZCkKLXsKLQlyZXR1cm4gIkFsY2hlbXkgUGIxNTUwIjsKLX0KLQotdm9pZCBfX2luaXQgcHJvbV9pbml0KHZvaWQpCi17Ci0JdW5zaWduZWQgY2hhciAqbWVtc2l6ZV9zdHI7Ci0JdW5zaWduZWQgbG9uZyBtZW1zaXplOwotCi0JcHJvbV9hcmdjID0gKGludClmd19hcmcwOwotCXByb21fYXJndiA9IChjaGFyICoqKWZ3X2FyZzE7Ci0JcHJvbV9lbnZwID0gKGNoYXIgKiopZndfYXJnMjsKLQotCXByb21faW5pdF9jbWRsaW5lKCk7Ci0JbWVtc2l6ZV9zdHIgPSBwcm9tX2dldGVudigibWVtc2l6ZSIpOwotCWlmICghbWVtc2l6ZV9zdHIpCi0JCW1lbXNpemUgPSAweDA4MDAwMDAwOwotCWVsc2UKLQkJc3RyaWN0X3N0cnRvbChtZW1zaXplX3N0ciwgMCwgJm1lbXNpemUpOwotCWFkZF9tZW1vcnlfcmVnaW9uKDAsIG1lbXNpemUsIEJPT1RfTUVNX1JBTSk7Ci19CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvYWxjaGVteS9wYjE1NTAvaXJxbWFwLmMgYi9hcmNoL21pcHMvYWxjaGVteS9wYjE1NTAvaXJxbWFwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwMmE0ZDEuLjAwMDAwMDAKLS0tIGEvYXJjaC9taXBzL2FsY2hlbXkvcGIxNTUwL2lycW1hcC5jCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoKLSAqIEJSSUVGIE1PRFVMRSBERVNDUklQVElPTgotICoJQXUxeHgwIElSUSBtYXAgdGFibGUKLSAqCi0gKiBDb3B5cmlnaHQgMjAwMyBFbWJlZGRlZCBFZGdlLCBMTEMKLSAqCQlkYW5AZW1iZWRkZWRlZGdlLmNvbQotICoKLSAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUJIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqICB1bmRlciAgdGhlIHRlcm1zIG9mCSB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKLSAqICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQlMaWNlbnNlLCBvciAoYXQgeW91cgotICogIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogIFRISVMgIFNPRlRXQVJFICBJUyBQUk9WSURFRAkgIGBgQVMJSVMnJyBBTkQgICBBTlkJRVhQUkVTUyBPUiBJTVBMSUVECi0gKiAgV0FSUkFOVElFUywJICBJTkNMVURJTkcsIEJVVCBOT1QgIExJTUlURUQgIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0gKiAgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOCi0gKiAgTk8JRVZFTlQgIFNIQUxMICAgVEhFIEFVVEhPUiAgQkUJIExJQUJMRSBGT1IgQU5ZCSAgRElSRUNULCBJTkRJUkVDVCwKLSAqICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSAqICBOT1QgTElNSVRFRAkgIFRPLCBQUk9DVVJFTUVOVCBPRiAgU1VCU1RJVFVURSBHT09EUwlPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogIFVTRSwgREFUQSwJT1IgUFJPRklUUzsgT1IJQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04KLSAqICBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgkgQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqICAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKLSAqICBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLSAqICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSAgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAqICA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotCi0jaW5jbHVkZSA8YXNtL21hY2gtYXUxeDAwL2F1MTAwMC5oPgotCi1jaGFyIGlycV90YWJfYWxjaGVteVtdWzVdIF9faW5pdGRhdGEgPSB7Ci0JWzEyXSA9IHsgLTEsIElOVEIsIElOVEMsIElOVEQsIElOVEEgfSwgLyogSURTRUwgMTIgLSBQQ0kgc2xvdCAyIChsZWZ0KSAgKi8KLQlbMTNdID0geyAtMSwgSU5UQSwgSU5UQiwgSU5UQywgSU5URCB9LCAvKiBJRFNFTCAxMyAtIFBDSSBzbG90IDEgKHJpZ2h0KSAqLwotfTsKLQotc3RydWN0IGF1MXh4eF9pcnFtYXAgX19pbml0ZGF0YSBhdTF4eHhfaXJxX21hcFtdID0gewotCXsgQVUxMDAwX0dQSU9fMCwgSU5UQ19JTlRfTE9XX0xFVkVMLCAwIH0sCi0JeyBBVTEwMDBfR1BJT18xLCBJTlRDX0lOVF9MT1dfTEVWRUwsIDAgfSwKLX07Ci0KLWludCBfX2luaXRkYXRhIGF1MXh4eF9ucl9pcnFzID0gQVJSQVlfU0laRShhdTF4eHhfaXJxX21hcCk7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvYWxjaGVteS94eHMxNTAwL2JvYXJkX3NldHVwLmMgYi9hcmNoL21pcHMvYWxjaGVteS94eHMxNTAwL2JvYXJkX3NldHVwLmMKaW5kZXggNGM1ODdhYy4uYTI2MzRmYSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2FsY2hlbXkveHhzMTUwMC9ib2FyZF9zZXR1cC5jCisrKyBiL2FyY2gvbWlwcy9hbGNoZW15L3h4czE1MDAvYm9hcmRfc2V0dXAuYwpAQCAtMjgsNiArMjgsOCBAQAogCiAjaW5jbHVkZSA8YXNtL21hY2gtYXUxeDAwL2F1MTAwMC5oPgogCisjaW5jbHVkZSA8cHJvbS5oPgorCiB2b2lkIGJvYXJkX3Jlc2V0KHZvaWQpCiB7CiAJLyogSGl0IEJDU1IuU1lTVEVNX0NPTlRST0xbU1dfUlNUXSAqLwpAQCAtMzgsNiArNDAsMTYgQEAKIHsKIAl1MzIgcGluX2Z1bmM7CiAKKyNpZmRlZiBDT05GSUdfU0VSSUFMXzgyNTBfQ09OU09MRQorCWNoYXIgKmFyZ3B0cjsKKwlhcmdwdHIgPSBwcm9tX2dldGNtZGxpbmUoKTsKKwlhcmdwdHIgPSBzdHJzdHIoYXJncHRyLCAiY29uc29sZT0iKTsKKwlpZiAoYXJncHRyID09IE5VTEwpIHsKKwkJYXJncHRyID0gcHJvbV9nZXRjbWRsaW5lKCk7CisJCXN0cmNhdChhcmdwdHIsICIgY29uc29sZT10dHlTMCwxMTUyMDAiKTsKKwl9CisjZW5kaWYKKwogCS8qIFNldCBtdWx0aXBsZSB1c2UgcGlucyAoVUFSVDMvR1BJTykgdG8gVUFSVCAoaXQncyB1c2VkIGFzIFVBUlQgdG9vKSAqLwogCXBpbl9mdW5jICA9IGF1X3JlYWRsKFNZU19QSU5GVU5DKSAmIH5TWVNfUEZfVVIzOwogCXBpbl9mdW5jIHw9IFNZU19QRl9VUjM7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvYWxjaGVteS94eHMxNTAwL2luaXQuYyBiL2FyY2gvbWlwcy9hbGNoZW15L3h4czE1MDAvaW5pdC5jCmluZGV4IDc1MTY0MzQuLjQ1NmZhMTQgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9hbGNoZW15L3h4czE1MDAvaW5pdC5jCisrKyBiL2FyY2gvbWlwcy9hbGNoZW15L3h4czE1MDAvaW5pdC5jCkBAIC01Myw2ICs1Myw2IEBACiAJaWYgKCFtZW1zaXplX3N0cikKIAkJbWVtc2l6ZSA9IDB4MDQwMDAwMDA7CiAJZWxzZQotCQlzdHJpY3Rfc3RydG9sKG1lbXNpemVfc3RyLCAwLCAmbWVtc2l6ZSk7CisJCXN0cmljdF9zdHJ0b3VsKG1lbXNpemVfc3RyLCAwLCAmbWVtc2l6ZSk7CiAJYWRkX21lbW9yeV9yZWdpb24oMCwgbWVtc2l6ZSwgQk9PVF9NRU1fUkFNKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9hbGNoZW15L3h4czE1MDAvaXJxbWFwLmMgYi9hcmNoL21pcHMvYWxjaGVteS94eHMxNTAwL2lycW1hcC5jCmluZGV4IGVkZjA2ZWQuLjBmMGYzMDEgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9hbGNoZW15L3h4czE1MDAvaXJxbWFwLmMKKysrIGIvYXJjaC9taXBzL2FsY2hlbXkveHhzMTUwMC9pcnFtYXAuYwpAQCAtMjcsMjMgKzI3LDI2IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLQorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGFzbS9tYWNoLWF1MXgwMC9hdTEwMDAuaD4KIAogc3RydWN0IGF1MXh4eF9pcnFtYXAgX19pbml0ZGF0YSBhdTF4eHhfaXJxX21hcFtdID0gewotCXsgQVUxNTAwX0dQSU9fMjA0LCBJTlRDX0lOVF9ISUdIX0xFVkVMLCAwIH0sCi0JeyBBVTE1MDBfR1BJT18yMDEsIElOVENfSU5UX0xPV19MRVZFTCwgMCB9LAotCXsgQVUxNTAwX0dQSU9fMjAyLCBJTlRDX0lOVF9MT1dfTEVWRUwsIDAgfSwKLQl7IEFVMTUwMF9HUElPXzIwMywgSU5UQ19JTlRfTE9XX0xFVkVMLCAwIH0sCi0JeyBBVTE1MDBfR1BJT18yMDUsIElOVENfSU5UX0xPV19MRVZFTCwgMCB9LAotCXsgQVUxNTAwX0dQSU9fMjA3LCBJTlRDX0lOVF9MT1dfTEVWRUwsIDAgfSwKKwl7IEFVMTUwMF9HUElPXzIwNCwgSVJRRl9UUklHR0VSX0hJR0gsIDAgfSwKKwl7IEFVMTUwMF9HUElPXzIwMSwgSVJRRl9UUklHR0VSX0xPVywgMCB9LAorCXsgQVUxNTAwX0dQSU9fMjAyLCBJUlFGX1RSSUdHRVJfTE9XLCAwIH0sCisJeyBBVTE1MDBfR1BJT18yMDMsIElSUUZfVFJJR0dFUl9MT1csIDAgfSwKKwl7IEFVMTUwMF9HUElPXzIwNSwgSVJRRl9UUklHR0VSX0xPVywgMCB9LAorCXsgQVUxNTAwX0dQSU9fMjA3LCBJUlFGX1RSSUdHRVJfTE9XLCAwIH0sCiAKLQl7IEFVMTAwMF9HUElPXzAsIElOVENfSU5UX0xPV19MRVZFTCwgMCB9LAotCXsgQVUxMDAwX0dQSU9fMSwgSU5UQ19JTlRfTE9XX0xFVkVMLCAwIH0sCi0JeyBBVTEwMDBfR1BJT18yLCBJTlRDX0lOVF9MT1dfTEVWRUwsIDAgfSwKLQl7IEFVMTAwMF9HUElPXzMsIElOVENfSU5UX0xPV19MRVZFTCwgMCB9LAotCXsgQVUxMDAwX0dQSU9fNCwgSU5UQ19JTlRfTE9XX0xFVkVMLCAwIH0sIC8qIENGIGludGVycnVwdCAqLwotCXsgQVUxMDAwX0dQSU9fNSwgSU5UQ19JTlRfTE9XX0xFVkVMLCAwIH0sCisJeyBBVTEwMDBfR1BJT18wLCBJUlFGX1RSSUdHRVJfTE9XLCAwIH0sCisJeyBBVTEwMDBfR1BJT18xLCBJUlFGX1RSSUdHRVJfTE9XLCAwIH0sCisJeyBBVTEwMDBfR1BJT18yLCBJUlFGX1RSSUdHRVJfTE9XLCAwIH0sCisJeyBBVTEwMDBfR1BJT18zLCBJUlFGX1RSSUdHRVJfTE9XLCAwIH0sCisJeyBBVTEwMDBfR1BJT180LCBJUlFGX1RSSUdHRVJfTE9XLCAwIH0sIC8qIENGIGludGVycnVwdCAqLworCXsgQVUxMDAwX0dQSU9fNSwgSVJRRl9UUklHR0VSX0xPVywgMCB9LAogfTsKIAotaW50IF9faW5pdGRhdGEgYXUxeHh4X25yX2lycXMgPSBBUlJBWV9TSVpFKGF1MXh4eF9pcnFfbWFwKTsKK3ZvaWQgX19pbml0IGJvYXJkX2luaXRfaXJxKHZvaWQpCit7CisJYXUxeHh4X3NldHVwX2lycW1hcChhdTF4eHhfaXJxX21hcCwgQVJSQVlfU0laRShhdTF4eHhfaXJxX21hcCkpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2Nhdml1bS1vY3Rlb24vS2NvbmZpZyBiL2FyY2gvbWlwcy9jYXZpdW0tb2N0ZW9uL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDk0YzE3ZQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbWlwcy9jYXZpdW0tb2N0ZW9uL0tjb25maWcKQEAgLTAsMCArMSw4NSBAQAorY29uZmlnIENBVklVTV9PQ1RFT05fU1BFQ0lGSUNfT1BUSU9OUworCWJvb2wgIkVuYWJsZSBPY3Rlb24gc3BlY2lmaWMgb3B0aW9ucyIKKwlkZXBlbmRzIG9uIENQVV9DQVZJVU1fT0NURU9OCisJZGVmYXVsdCAieSIKKworY29uZmlnIENBVklVTV9PQ1RFT05fMk5EX0tFUk5FTAorCWJvb2wgIkJ1aWxkIHRoZSBrZXJuZWwgdG8gYmUgdXNlZCBhcyBhIDJuZCBrZXJuZWwgb24gdGhlIHNhbWUgY2hpcCIKKwlkZXBlbmRzIG9uIENBVklVTV9PQ1RFT05fU1BFQ0lGSUNfT1BUSU9OUworCWRlZmF1bHQgIm4iCisJaGVscAorCSAgVGhpcyBvcHRpb24gY29uZmlndXJlcyB0aGlzIGtlcm5lbCB0byBiZSBsaW5rZWQgYXQgYSBkaWZmZXJlbnQKKwkgIGFkZHJlc3MgYW5kIHVzZSB0aGUgMm5kIHVhcnQgZm9yIG91dHB1dC4gVGhpcyBhbGxvd3MgYSBrZXJuZWwgYnVpbHQKKwkgIHdpdGggdGhpcyBvcHRpb24gdG8gYmUgcnVuIGF0IHRoZSBzYW1lIHRpbWUgYXMgb25lIGJ1aWx0IHdpdGhvdXQgdGhpcworCSAgb3B0aW9uLgorCitjb25maWcgQ0FWSVVNX09DVEVPTl9IV19GSVhfVU5BTElHTkVECisJYm9vbCAiRW5hYmxlIGhhcmR3YXJlIGZpeHVwcyBvZiB1bmFsaWduZWQgbG9hZHMgYW5kIHN0b3JlcyIKKwlkZXBlbmRzIG9uIENBVklVTV9PQ1RFT05fU1BFQ0lGSUNfT1BUSU9OUworCWRlZmF1bHQgInkiCisJaGVscAorCSAgQ29uZmlndXJlIHRoZSBPY3Rlb24gaGFyZHdhcmUgdG8gYXV0b21hdGljYWxseSBmaXggdW5hbGlnbmVkIGxvYWRzCisJICBhbmQgc3RvcmVzLiBOb3JtYWxseSB1bmFsaWduZWQgYWNjZXNzZXMgYXJlIGZpeGVkIHVzaW5nIGEga2VybmVsCisJICBleGNlcHRpb24gaGFuZGxlci4gVGhpcyBvcHRpb24gZW5hYmxlcyB0aGUgaGFyZHdhcmUgYXV0b21hdGljIGZpeHVwcywKKwkgIHdoaWNoIHJlcXVpcmVzIG9ubHkgYW4gZXh0cmEgMyBjeWNsZXMuIERpc2FibGUgdGhpcyBvcHRpb24gaWYgeW91CisJICBhcmUgcnVubmluZyBjb2RlIHRoYXQgcmVsaWVzIG9uIGFkZHJlc3MgZXhjZXB0aW9ucyBvbiB1bmFsaWduZWQKKwkgIGFjY2Vzc2VzLgorCitjb25maWcgQ0FWSVVNX09DVEVPTl9DVk1TRUdfU0laRQorCWludCAiTnVtYmVyIG9mIEwxIGNhY2hlIGxpbmVzIHJlc2VydmVkIGZvciBDVk1TRUcgbWVtb3J5IgorCWRlcGVuZHMgb24gQ0FWSVVNX09DVEVPTl9TUEVDSUZJQ19PUFRJT05TCisJcmFuZ2UgMCA1NAorCWRlZmF1bHQgMQorCWhlbHAKKwkgIENWTVNFRyBMTSBpcyBhIHNlZ21lbnQgdGhhdCBhY2Nlc3NlcyBwb3J0aW9ucyBvZiB0aGUgZGNhY2hlIGFzIGEKKwkgIGxvY2FsIG1lbW9yeTsgdGhlIGxhcmdlciBDVk1TRUcgaXMsIHRoZSBzbWFsbGVyIHRoZSBjYWNoZSBpcy4KKwkgIFRoaXMgc2VsZWN0cyB0aGUgc2l6ZSBvZiBDVk1TRUcgTE0sIHdoaWNoIGlzIGluIGNhY2hlIGJsb2Nrcy4gVGhlCisJICBsZWdhbGx5IHJhbmdlIGlzIGZyb20gemVybyB0byA1NCBjYWNoZSBibG9ja3MgKGkuZS4gQ1ZNU0VHIExNIGlzCisJICBiZXR3ZWVuIHplcm8gYW5kIDYxOTIgYnl0ZXMpLgorCitjb25maWcgQ0FWSVVNX09DVEVPTl9MT0NLX0wyCisJYm9vbCAiTG9jayBvZnRlbiB1c2VkIGtlcm5lbCBjb2RlIGluIHRoZSBMMiIKKwlkZXBlbmRzIG9uIENBVklVTV9PQ1RFT05fU1BFQ0lGSUNfT1BUSU9OUworCWRlZmF1bHQgInkiCisJaGVscAorCSAgRW5hYmxlIGxvY2tpbmcgcGFydHMgb2YgdGhlIGtlcm5lbCBpbnRvIHRoZSBMMiBjYWNoZS4KKworY29uZmlnIENBVklVTV9PQ1RFT05fTE9DS19MMl9UTEIKKwlib29sICJMb2NrIHRoZSBUTEIgaGFuZGxlciBpbiBMMiIKKwlkZXBlbmRzIG9uIENBVklVTV9PQ1RFT05fTE9DS19MMgorCWRlZmF1bHQgInkiCisJaGVscAorCSAgTG9jayB0aGUgbG93IGxldmVsIFRMQiBmYXN0IHBhdGggaW50byBMMi4KKworY29uZmlnIENBVklVTV9PQ1RFT05fTE9DS19MMl9FWENFUFRJT04KKwlib29sICJMb2NrIHRoZSBleGNlcHRpb24gaGFuZGxlciBpbiBMMiIKKwlkZXBlbmRzIG9uIENBVklVTV9PQ1RFT05fTE9DS19MMgorCWRlZmF1bHQgInkiCisJaGVscAorCSAgTG9jayB0aGUgbG93IGxldmVsIGV4Y2VwdGlvbiBoYW5kbGVyIGludG8gTDIuCisKK2NvbmZpZyBDQVZJVU1fT0NURU9OX0xPQ0tfTDJfTE9XX0xFVkVMX0lOVEVSUlVQVAorCWJvb2wgIkxvY2sgdGhlIGludGVycnVwdCBoYW5kbGVyIGluIEwyIgorCWRlcGVuZHMgb24gQ0FWSVVNX09DVEVPTl9MT0NLX0wyCisJZGVmYXVsdCAieSIKKwloZWxwCisJICBMb2NrIHRoZSBsb3cgbGV2ZWwgaW50ZXJydXB0IGhhbmRsZXIgaW50byBMMi4KKworY29uZmlnIENBVklVTV9PQ1RFT05fTE9DS19MMl9JTlRFUlJVUFQKKwlib29sICJMb2NrIHRoZSAybmQgbGV2ZWwgaW50ZXJydXB0IGhhbmRsZXIgaW4gTDIiCisJZGVwZW5kcyBvbiBDQVZJVU1fT0NURU9OX0xPQ0tfTDIKKwlkZWZhdWx0ICJ5IgorCWhlbHAKKwkgIExvY2sgdGhlIDJuZCBsZXZlbCBpbnRlcnJ1cHQgaGFuZGxlciBpbiBMMi4KKworY29uZmlnIENBVklVTV9PQ1RFT05fTE9DS19MMl9NRU1DUFkKKwlib29sICJMb2NrIG1lbWNweSgpIGluIEwyIgorCWRlcGVuZHMgb24gQ0FWSVVNX09DVEVPTl9MT0NLX0wyCisJZGVmYXVsdCAieSIKKwloZWxwCisJICBMb2NrIHRoZSBrZXJuZWwncyBpbXBsZW1lbnRhdGlvbiBvZiBtZW1jcHkoKSBpbnRvIEwyLgorCitjb25maWcgQVJDSF9TUEFSU0VNRU1fRU5BQkxFCisJZGVmX2Jvb2wgeQorCXNlbGVjdCBTUEFSU0VNRU1fU1RBVElDCisJZGVwZW5kcyBvbiBDUFVfQ0FWSVVNX09DVEVPTgpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2Nhdml1bS1vY3Rlb24vTWFrZWZpbGUgYi9hcmNoL21pcHMvY2F2aXVtLW9jdGVvbi9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzJhN2ZhCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9taXBzL2Nhdml1bS1vY3Rlb24vTWFrZWZpbGUKQEAgLTAsMCArMSwxNiBAQAorIworIyBNYWtlZmlsZSBmb3IgdGhlIENhdml1bSBPY3Rlb24gc3BlY2lmaWMga2VybmVsIGludGVyZmFjZSByb3V0aW5lcworIyB1bmRlciBMaW51eC4KKyMKKyMgVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyMgTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorIyBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAwOCBDYXZpdW0gTmV0d29ya3MKKyMKKworb2JqLXkgOj0gc2V0dXAubyBzZXJpYWwubyBvY3Rlb24taXJxLm8gY3NyYy1vY3Rlb24ubworb2JqLXkgKz0gZG1hLW9jdGVvbi5vIGZsYXNoX3NldHVwLm8KK29iai15ICs9IG9jdGVvbi1tZW1jcHkubworCitvYmotJChDT05GSUdfU01QKSAgICAgICAgICAgICAgICAgICAgICs9IHNtcC5vCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvY2F2aXVtLW9jdGVvbi9jc3JjLW9jdGVvbi5jIGIvYXJjaC9taXBzL2Nhdml1bS1vY3Rlb24vY3NyYy1vY3Rlb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MGZkOTJjCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9taXBzL2Nhdml1bS1vY3Rlb24vY3NyYy1vY3Rlb24uYwpAQCAtMCwwICsxLDU4IEBACisvKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IGJ5IFJhbGYgQmFlY2hsZQorICovCisjaW5jbHVkZSA8bGludXgvY2xvY2tzb3VyY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKKyNpbmNsdWRlIDxhc20vdGltZS5oPgorCisjaW5jbHVkZSA8YXNtL29jdGVvbi9vY3Rlb24uaD4KKyNpbmNsdWRlIDxhc20vb2N0ZW9uL2N2bXgtaXBkLWRlZnMuaD4KKworLyoKKyAqIFNldCB0aGUgY3VycmVudCBjb3JlJ3MgY3ZtY291bnQgY291bnRlciB0byB0aGUgdmFsdWUgb2YgdGhlCisgKiBJUERfQ0xLX0NPVU5ULiAgV2UgZG8gdGhpcyBvbiBhbGwgY29yZXMgYXMgdGhleSBhcmUgYnJvdWdodAorICogb24tbGluZS4gIFRoaXMgYWxsb3dzIGZvciBhIHJlYWQgZnJvbSBhIGxvY2FsIGNwdSByZWdpc3RlciB0bworICogYWNjZXNzIGEgc3luY2hyb25pemVkIGNvdW50ZXIuCisgKgorICovCit2b2lkIG9jdGVvbl9pbml0X2N2bWNvdW50KHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBsb29wcyA9IDI7CisKKwkvKiBDbG9iYmVyIGxvb3BzIHNvIEdDQyB3aWxsIG5vdCB1bnJvbGwgdGhlIGZvbGxvd2luZyB3aGlsZSBsb29wLiAqLworCWFzbSgiIiA6ICIrciIgKGxvb3BzKSk7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJLyoKKwkgKiBMb29wIHNldmVyYWwgdGltZXMgc28gd2UgYXJlIGV4ZWN1dGluZyBmcm9tIHRoZSBjYWNoZSwKKwkgKiB3aGljaCBzaG91bGQgZ2l2ZSBtb3JlIGRldGVybWluaXN0aWMgdGltaW5nLgorCSAqLworCXdoaWxlIChsb29wcy0tKQorCQl3cml0ZV9jMF9jdm1jb3VudChjdm14X3JlYWRfY3NyKENWTVhfSVBEX0NMS19DT1VOVCkpOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKK30KKworc3RhdGljIGN5Y2xlX3Qgb2N0ZW9uX2N2bWNvdW50X3JlYWQodm9pZCkKK3sKKwlyZXR1cm4gcmVhZF9jMF9jdm1jb3VudCgpOworfQorCitzdGF0aWMgc3RydWN0IGNsb2Nrc291cmNlIGNsb2Nrc291cmNlX21pcHMgPSB7CisJLm5hbWUJCT0gIk9DVEVPTl9DVk1DT1VOVCIsCisJLnJlYWQJCT0gb2N0ZW9uX2N2bWNvdW50X3JlYWQsCisJLm1hc2sJCT0gQ0xPQ0tTT1VSQ0VfTUFTSyg2NCksCisJLmZsYWdzCQk9IENMT0NLX1NPVVJDRV9JU19DT05USU5VT1VTLAorfTsKKwordm9pZCBfX2luaXQgcGxhdF90aW1lX2luaXQodm9pZCkKK3sKKwljbG9ja3NvdXJjZV9taXBzLnJhdGluZyA9IDMwMDsKKwljbG9ja3NvdXJjZV9zZXRfY2xvY2soJmNsb2Nrc291cmNlX21pcHMsIG1pcHNfaHB0X2ZyZXF1ZW5jeSk7CisJY2xvY2tzb3VyY2VfcmVnaXN0ZXIoJmNsb2Nrc291cmNlX21pcHMpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2Nhdml1bS1vY3Rlb24vZG1hLW9jdGVvbi5jIGIvYXJjaC9taXBzL2Nhdml1bS1vY3Rlb24vZG1hLW9jdGVvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxYjFlZjkKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21pcHMvY2F2aXVtLW9jdGVvbi9kbWEtb2N0ZW9uLmMKQEAgLTAsMCArMSwzMiBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMCAgQW5pIEpvc2hpIDxham9zaGlAdW5peGJveC5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDAsIDIwMDEgIFJhbGYgQmFlY2hsZSA8cmFsZkBnbnUub3JnPgorICogQ29weXJpZ2h0IChDKSAyMDA1IElseWEgQS4gVm9seW5ldHMtRXZlbmJha2ggPGlseWFAdG90YWwta25vd2xlZGdlLmNvbT4KKyAqIHN3aXBlZCBmcm9tIGkzODYsIGFuZCBjbG9uZWQgZm9yIE1JUFMgYnkgR2VlcnQsIHBvbGlzaGVkIGJ5IFJhbGYuCisgKiBJUDMyIGNoYW5nZXMgYnkgSWx5YS4KKyAqIENhdml1bSBOZXR3b3JrczogQ3JlYXRlIG5ldyBkbWEgc2V0dXAgZm9yIENhdml1bSBOZXR3b3JrcyBPY3Rlb24gYmFzZWQgb24KKyAqIHRoZSBrZXJuZWxzIG9yaWdpbmFsLgorICovCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorCisjaW5jbHVkZSA8ZG1hLWNvaGVyZW5jZS5oPgorCitkbWFfYWRkcl90IG9jdGVvbl9tYXBfZG1hX21lbShzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKnB0ciwgc2l6ZV90IHNpemUpCit7CisJLyogV2l0aG91dCBQQ0kvUENJZSB0aGlzIGZ1bmN0aW9uIGNhbiBiZSBjYWxsZWQgZm9yIE9jdGVvbiBpbnRlcm5hbAorCSAgIGRldmljZXMgc3VjaCBhcyBVU0IuIFRoZXNlIGRldmljZXMgYWxsIHN1cHBvcnQgNjRiaXQgYWRkcmVzc2luZyAqLworCW1iKCk7CisJcmV0dXJuIHZpcnRfdG9fcGh5cyhwdHIpOworfQorCit2b2lkIG9jdGVvbl91bm1hcF9kbWFfbWVtKHN0cnVjdCBkZXZpY2UgKmRldiwgZG1hX2FkZHJfdCBkbWFfYWRkcikKK3sKKwkvKiBXaXRob3V0IFBDSS9QQ0llIHRoaXMgZnVuY3Rpb24gY2FuIGJlIGNhbGxlZCBmb3IgT2N0ZW9uIGludGVybmFsCisJICogZGV2aWNlcyBzdWNoIGFzIFVTQi4gVGhlc2UgZGV2aWNlcyBhbGwgc3VwcG9ydCA2NGJpdCBhZGRyZXNzaW5nICovCisJcmV0dXJuOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2Nhdml1bS1vY3Rlb24vZXhlY3V0aXZlL01ha2VmaWxlIGIvYXJjaC9taXBzL2Nhdml1bS1vY3Rlb24vZXhlY3V0aXZlL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwZDZjYjIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21pcHMvY2F2aXVtLW9jdGVvbi9leGVjdXRpdmUvTWFrZWZpbGUKQEAgLTAsMCArMSwxMyBAQAorIworIyBNYWtlZmlsZSBmb3IgdGhlIENhdml1bSBPY3Rlb24gc3BlY2lmaWMga2VybmVsIGludGVyZmFjZSByb3V0aW5lcworIyB1bmRlciBMaW51eC4KKyMKKyMgVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyMgTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorIyBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAwOCBDYXZpdW0gTmV0d29ya3MKKyMKKworb2JqLXkgKz0gY3ZteC1ib290bWVtLm8gY3ZteC1sMmMubyBjdm14LXN5c2luZm8ubyBvY3Rlb24tbW9kZWwubworCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvY2F2aXVtLW9jdGVvbi9leGVjdXRpdmUvY3ZteC1ib290bWVtLmMgYi9hcmNoL21pcHMvY2F2aXVtLW9jdGVvbi9leGVjdXRpdmUvY3ZteC1ib290bWVtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGY1YTA4YgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbWlwcy9jYXZpdW0tb2N0ZW9uL2V4ZWN1dGl2ZS9jdm14LWJvb3RtZW0uYwpAQCAtMCwwICsxLDU4NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqbGljZW5zZSBzdGFydCoqKioqKioqKioqKioqKgorICogQXV0aG9yOiBDYXZpdW0gTmV0d29ya3MKKyAqCisgKiBDb250YWN0OiBzdXBwb3J0QGNhdml1bW5ldHdvcmtzLmNvbQorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIE9DVEVPTiBTREsKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwOCBDYXZpdW0gTmV0d29ya3MKKyAqCisgKiBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgVmVyc2lvbiAyLCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogQVMtSVMgYW5kIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkKKyAqIG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgVElUTEUsIG9yCisgKiBOT05JTkZSSU5HRU1FTlQuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlCisgKiBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgZmlsZTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKiBvciB2aXNpdCBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLgorICoKKyAqIFRoaXMgZmlsZSBtYXkgYWxzbyBiZSBhdmFpbGFibGUgdW5kZXIgYSBkaWZmZXJlbnQgbGljZW5zZSBmcm9tIENhdml1bS4KKyAqIENvbnRhY3QgQ2F2aXVtIE5ldHdvcmtzIGZvciBtb3JlIGluZm9ybWF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKipsaWNlbnNlIGVuZCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogU2ltcGxlIGFsbG9jYXRlIG9ubHkgbWVtb3J5IGFsbG9jYXRvci4gIFVzZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGF0CisgKiBhcHBsaWNhdGlvbiBzdGFydCB0aW1lLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKworI2luY2x1ZGUgPGFzbS9vY3Rlb24vY3ZteC5oPgorI2luY2x1ZGUgPGFzbS9vY3Rlb24vY3ZteC1zcGlubG9jay5oPgorI2luY2x1ZGUgPGFzbS9vY3Rlb24vY3ZteC1ib290bWVtLmg+CisKKy8qI2RlZmluZSBERUJVRyAqLworCisKK3N0YXRpYyBzdHJ1Y3QgY3ZteF9ib290bWVtX2Rlc2MgKmN2bXhfYm9vdG1lbV9kZXNjOworCisvKiBTZWUgaGVhZGVyIGZpbGUgZm9yIGRlc2NyaXB0aW9ucyBvZiBmdW5jdGlvbnMgKi8KKworLyoKKyAqIFdyYXBwZXIgZnVuY3Rpb25zIGFyZSBwcm92aWRlZCBmb3IgcmVhZGluZy93cml0aW5nIHRoZSBzaXplIGFuZAorICogbmV4dCBibG9jayB2YWx1ZXMgYXMgdGhlc2UgbWF5IG5vdCBiZSBkaXJlY3RseSBhZGRyZXNzaWJsZSAoaW4gMzIKKyAqIGJpdCBhcHBsaWNhdGlvbnMsIGZvciBpbnN0YW5jZS4pICBPZmZzZXRzIG9mIGRhdGEgZWxlbWVudHMgaW4KKyAqIGJvb3RtZW0gbGlzdCwgbXVzdCBtYXRjaCBjdm14X2Jvb3RtZW1fYmxvY2tfaGVhZGVyX3QuCisgKi8KKyNkZWZpbmUgTkVYVF9PRkZTRVQgMAorI2RlZmluZSBTSVpFX09GRlNFVCA4CisKK3N0YXRpYyB2b2lkIGN2bXhfYm9vdG1lbV9waHlfc2V0X3NpemUodWludDY0X3QgYWRkciwgdWludDY0X3Qgc2l6ZSkKK3sKKwljdm14X3dyaXRlNjRfdWludDY0KChhZGRyICsgU0laRV9PRkZTRVQpIHwgKDF1bGwgPDwgNjMpLCBzaXplKTsKK30KKworc3RhdGljIHZvaWQgY3ZteF9ib290bWVtX3BoeV9zZXRfbmV4dCh1aW50NjRfdCBhZGRyLCB1aW50NjRfdCBuZXh0KQoreworCWN2bXhfd3JpdGU2NF91aW50NjQoKGFkZHIgKyBORVhUX09GRlNFVCkgfCAoMXVsbCA8PCA2MyksIG5leHQpOworfQorCitzdGF0aWMgdWludDY0X3QgY3ZteF9ib290bWVtX3BoeV9nZXRfc2l6ZSh1aW50NjRfdCBhZGRyKQoreworCXJldHVybiBjdm14X3JlYWQ2NF91aW50NjQoKGFkZHIgKyBTSVpFX09GRlNFVCkgfCAoMXVsbCA8PCA2MykpOworfQorCitzdGF0aWMgdWludDY0X3QgY3ZteF9ib290bWVtX3BoeV9nZXRfbmV4dCh1aW50NjRfdCBhZGRyKQoreworCXJldHVybiBjdm14X3JlYWQ2NF91aW50NjQoKGFkZHIgKyBORVhUX09GRlNFVCkgfCAoMXVsbCA8PCA2MykpOworfQorCit2b2lkICpjdm14X2Jvb3RtZW1fYWxsb2NfcmFuZ2UodWludDY0X3Qgc2l6ZSwgdWludDY0X3QgYWxpZ25tZW50LAorCQkJICAgICAgIHVpbnQ2NF90IG1pbl9hZGRyLCB1aW50NjRfdCBtYXhfYWRkcikKK3sKKwlpbnQ2NF90IGFkZHJlc3M7CisJYWRkcmVzcyA9CisJICAgIGN2bXhfYm9vdG1lbV9waHlfYWxsb2Moc2l6ZSwgbWluX2FkZHIsIG1heF9hZGRyLCBhbGlnbm1lbnQsIDApOworCisJaWYgKGFkZHJlc3MgPiAwKQorCQlyZXR1cm4gY3ZteF9waHlzX3RvX3B0cihhZGRyZXNzKTsKKwllbHNlCisJCXJldHVybiBOVUxMOworfQorCit2b2lkICpjdm14X2Jvb3RtZW1fYWxsb2NfYWRkcmVzcyh1aW50NjRfdCBzaXplLCB1aW50NjRfdCBhZGRyZXNzLAorCQkJCSB1aW50NjRfdCBhbGlnbm1lbnQpCit7CisJcmV0dXJuIGN2bXhfYm9vdG1lbV9hbGxvY19yYW5nZShzaXplLCBhbGlnbm1lbnQsIGFkZHJlc3MsCisJCQkJCWFkZHJlc3MgKyBzaXplKTsKK30KKwordm9pZCAqY3ZteF9ib290bWVtX2FsbG9jKHVpbnQ2NF90IHNpemUsIHVpbnQ2NF90IGFsaWdubWVudCkKK3sKKwlyZXR1cm4gY3ZteF9ib290bWVtX2FsbG9jX3JhbmdlKHNpemUsIGFsaWdubWVudCwgMCwgMCk7Cit9CisKK2ludCBjdm14X2Jvb3RtZW1fZnJlZV9uYW1lZChjaGFyICpuYW1lKQoreworCXJldHVybiBjdm14X2Jvb3RtZW1fcGh5X25hbWVkX2Jsb2NrX2ZyZWUobmFtZSwgMCk7Cit9CisKK3N0cnVjdCBjdm14X2Jvb3RtZW1fbmFtZWRfYmxvY2tfZGVzYyAqY3ZteF9ib290bWVtX2ZpbmRfbmFtZWRfYmxvY2soY2hhciAqbmFtZSkKK3sKKwlyZXR1cm4gY3ZteF9ib290bWVtX3BoeV9uYW1lZF9ibG9ja19maW5kKG5hbWUsIDApOworfQorCit2b2lkIGN2bXhfYm9vdG1lbV9sb2NrKHZvaWQpCit7CisJY3ZteF9zcGlubG9ja19sb2NrKChjdm14X3NwaW5sb2NrX3QgKikgJihjdm14X2Jvb3RtZW1fZGVzYy0+bG9jaykpOworfQorCit2b2lkIGN2bXhfYm9vdG1lbV91bmxvY2sodm9pZCkKK3sKKwljdm14X3NwaW5sb2NrX3VubG9jaygoY3ZteF9zcGlubG9ja190ICopICYoY3ZteF9ib290bWVtX2Rlc2MtPmxvY2spKTsKK30KKworaW50IGN2bXhfYm9vdG1lbV9pbml0KHZvaWQgKm1lbV9kZXNjX3B0cikKK3sKKwkvKiBIZXJlIHdlIHNldCB0aGUgZ2xvYmFsIHBvaW50ZXIgdG8gdGhlIGJvb3RtZW0gZGVzY3JpcHRvcgorCSAqIGJsb2NrLiAgVGhpcyBwb2ludGVyIHdpbGwgYmUgdXNlZCBkaXJlY3RseSwgc28gd2Ugd2lsbCBzZXQKKwkgKiBpdCB1cCB0byBiZSBkaXJlY3RseSB1c2FibGUgYnkgdGhlIGFwcGxpY2F0aW9uLiAgSXQgaXMgc2V0CisJICogdXAgYXMgZm9sbG93cyBmb3IgdGhlIHZhcmlvdXMgcnVudGltZS9BQkkgY29tYmluYXRpb25zOgorCSAqCisJICogTGludXggNjQgYml0OiBTZXQgWEtQSFlTIGJpdAorCSAqIExpbnV4IDMyIGJpdDogdXNlIG1tYXAgdG8gY3JlYXRlIG1hcHBpbmcsIHVzZSB2aXJ0dWFsIGFkZHJlc3MKKwkgKiBDVk1YIDY0IGJpdDogIHVzZSBwaHlzaWNhbCBhZGRyZXNzIGRpcmVjdGx5CisJICogQ1ZNWCAzMiBiaXQ6ICB1c2UgcGh5c2ljYWwgYWRkcmVzcyBkaXJlY3RseQorCSAqCisJICogTm90ZSB0aGF0IHRoZSBDVk1YIGVudmlyb25tZW50IGFzc3VtZXMgdGhlIHVzZSBvZiAxLTEgVExCCisJICogbWFwcGluZ3Mgc28gdGhhdCB0aGUgcGh5c2ljYWwgYWRkcmVzc2VzIGNhbiBiZSB1c2VkCisJICogZGlyZWN0bHkKKwkgKi8KKwlpZiAoIWN2bXhfYm9vdG1lbV9kZXNjKSB7CisjaWYgICBkZWZpbmVkKENWTVhfQUJJXzY0KQorCQkvKiBTZXQgWEtQSFlTIGJpdCAqLworCQljdm14X2Jvb3RtZW1fZGVzYyA9IGN2bXhfcGh5c190b19wdHIoQ0FTVDY0KG1lbV9kZXNjX3B0cikpOworI2Vsc2UKKwkJY3ZteF9ib290bWVtX2Rlc2MgPSAoc3RydWN0IGN2bXhfYm9vdG1lbV9kZXNjICopIG1lbV9kZXNjX3B0cjsKKyNlbmRpZgorCX0KKworCXJldHVybiAwOworfQorCisvKgorICogVGhlIGN2bXhfYm9vdG1lbV9waHkqIGZ1bmN0aW9ucyBiZWxvdyByZXR1cm4gNjQgYml0IHBoeXNpY2FsCisgKiBhZGRyZXNzZXMsIGFuZCBleHBvc2UgbW9yZSBmZWF0dXJlcyB0aGF0IHRoZSBjdm14X2Jvb3RtZW1fZnVuY3Rpb25zCisgKiBhYm92ZS4gIFRoZXNlIGFyZSByZXF1aXJlZCBmb3IgZnVsbCBtZW1vcnkgc3BhY2UgYWNjZXNzIGluIDMyIGJpdAorICogYXBwbGljYXRpb25zLCBhcyB3ZWxsIGFzIGZvciB1c2luZyBzb21lIGFkdmFuY2UgZmVhdHVyZXMuICBNb3N0CisgKiBhcHBsaWNhdGlvbnMgc2hvdWxkIG5vdCBuZWVkIHRvIHVzZSB0aGVzZS4KKyAqLworCitpbnQ2NF90IGN2bXhfYm9vdG1lbV9waHlfYWxsb2ModWludDY0X3QgcmVxX3NpemUsIHVpbnQ2NF90IGFkZHJlc3NfbWluLAorCQkJICAgICAgIHVpbnQ2NF90IGFkZHJlc3NfbWF4LCB1aW50NjRfdCBhbGlnbm1lbnQsCisJCQkgICAgICAgdWludDMyX3QgZmxhZ3MpCit7CisKKwl1aW50NjRfdCBoZWFkX2FkZHI7CisJdWludDY0X3QgZW50X2FkZHI7CisJLyogcG9pbnRzIHRvIHByZXZpb3VzIGxpc3QgZW50cnksIE5VTEwgY3VycmVudCBlbnRyeSBpcyBoZWFkIG9mIGxpc3QgKi8KKwl1aW50NjRfdCBwcmV2X2FkZHIgPSAwOworCXVpbnQ2NF90IG5ld19lbnRfYWRkciA9IDA7CisJdWludDY0X3QgZGVzaXJlZF9taW5fYWRkcjsKKworI2lmZGVmIERFQlVHCisJY3ZteF9kcHJpbnRmKCJjdm14X2Jvb3RtZW1fcGh5X2FsbG9jOiByZXFfc2l6ZTogMHglbGx4LCAiCisJCSAgICAgIm1pbl9hZGRyOiAweCVsbHgsIG1heF9hZGRyOiAweCVsbHgsIGFsaWduOiAweCVsbHhcbiIsCisJCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylyZXFfc2l6ZSwKKwkJICAgICAodW5zaWduZWQgbG9uZyBsb25nKWFkZHJlc3NfbWluLAorCQkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpYWRkcmVzc19tYXgsCisJCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylhbGlnbm1lbnQpOworI2VuZGlmCisKKwlpZiAoY3ZteF9ib290bWVtX2Rlc2MtPm1ham9yX3ZlcnNpb24gPiAzKSB7CisJCWN2bXhfZHByaW50ZigiRVJST1I6IEluY29tcGF0aWJsZSBib290bWVtIGRlc2NyaXB0b3IgIgorCQkJICAgICAidmVyc2lvbjogJWQuJWQgYXQgYWRkcjogJXBcbiIsCisJCQkgICAgIChpbnQpY3ZteF9ib290bWVtX2Rlc2MtPm1ham9yX3ZlcnNpb24sCisJCQkgICAgIChpbnQpY3ZteF9ib290bWVtX2Rlc2MtPm1pbm9yX3ZlcnNpb24sCisJCQkgICAgIGN2bXhfYm9vdG1lbV9kZXNjKTsKKwkJZ290byBlcnJvcl9vdXQ7CisJfQorCisJLyoKKwkgKiBEbyBhIHZhcmlldHkgb2YgY2hlY2tzIHRvIHZhbGlkYXRlIHRoZSBhcmd1bWVudHMuICBUaGUKKwkgKiBhbGxvY2F0b3IgY29kZSB3aWxsIGxhdGVyIGFzc3VtZSB0aGF0IHRoZXNlIGNoZWNrcyBoYXZlCisJICogYmVlbiBtYWRlLiAgV2UgdmFsaWRhdGUgdGhhdCB0aGUgcmVxdWVzdGVkIGNvbnN0cmFpbnRzIGFyZQorCSAqIG5vdCBzZWxmLWNvbnRyYWRpY3RvcnkgYmVmb3JlIHdlIGxvb2sgdGhyb3VnaCB0aGUgbGlzdCBvZgorCSAqIGF2YWlsYWJsZSBtZW1vcnkuCisJICovCisKKwkvKiAwIGlzIG5vdCBhIHZhbGlkIHJlcV9zaXplIGZvciB0aGlzIGFsbG9jYXRvciAqLworCWlmICghcmVxX3NpemUpCisJCWdvdG8gZXJyb3Jfb3V0OworCisJLyogUm91bmQgcmVxX3NpemUgdXAgdG8gbXVsdCBvZiBtaW5pbXVtIGFsaWdubWVudCBieXRlcyAqLworCXJlcV9zaXplID0gKHJlcV9zaXplICsgKENWTVhfQk9PVE1FTV9BTElHTk1FTlRfU0laRSAtIDEpKSAmCisJCX4oQ1ZNWF9CT09UTUVNX0FMSUdOTUVOVF9TSVpFIC0gMSk7CisKKwkvKgorCSAqIENvbnZlcnQgITAgYWRkcmVzc19taW4gYW5kIDAgYWRkcmVzc19tYXggdG8gc3BlY2lhbCBjYXNlIG9mCisJICogcmFuZ2UgdGhhdCBzcGVjaWZpZXMgYW4gZXhhY3QgbWVtb3J5IGJsb2NrIHRvIGFsbG9jYXRlLiAgRG8KKwkgKiB0aGlzIGJlZm9yZSBvdGhlciBjaGVja3MgYW5kIGFkanVzdG1lbnRzIHNvIHRoYXQgdGhpcworCSAqIHRyYW5mb3JtYXRpb24gd2lsbCBiZSB2YWxpZGF0ZWQuCisJICovCisJaWYgKGFkZHJlc3NfbWluICYmICFhZGRyZXNzX21heCkKKwkJYWRkcmVzc19tYXggPSBhZGRyZXNzX21pbiArIHJlcV9zaXplOworCWVsc2UgaWYgKCFhZGRyZXNzX21pbiAmJiAhYWRkcmVzc19tYXgpCisJCWFkZHJlc3NfbWF4ID0gfjB1bGw7ICAvKiBJZiBubyBsaW1pdHMgZ2l2ZW4sIHVzZSBtYXggbGltaXRzICovCisKKworCS8qCisJICogRW5mb3JjZSBtaW5pbXVtIGFsaWdubWVudCAodGhpcyBhbHNvIGtlZXBzIHRoZSBtaW5pbXVtIGZyZWUgYmxvY2sKKwkgKiByZXFfc2l6ZSB0aGUgc2FtZSBhcyB0aGUgYWxpZ25tZW50IHJlcV9zaXplLgorCSAqLworCWlmIChhbGlnbm1lbnQgPCBDVk1YX0JPT1RNRU1fQUxJR05NRU5UX1NJWkUpCisJCWFsaWdubWVudCA9IENWTVhfQk9PVE1FTV9BTElHTk1FTlRfU0laRTsKKworCS8qCisJICogQWRqdXN0IGFkZHJlc3MgbWluaW11bSBiYXNlZCBvbiByZXF1ZXN0ZWQgYWxpZ25tZW50IChyb3VuZAorCSAqIHVwIHRvIG1lZXQgYWxpZ25tZW50KS4gIERvIHRoaXMgaGVyZSBzbyB3ZSBjYW4gcmVqZWN0CisJICogaW1wb3NzaWJsZSByZXF1ZXN0cyB1cCBmcm9udC4gKE5PUCBmb3IgYWRkcmVzc19taW4gPT0gMCkKKwkgKi8KKwlpZiAoYWxpZ25tZW50KQorCQlhZGRyZXNzX21pbiA9IF9fQUxJR05fTUFTSyhhZGRyZXNzX21pbiwgKGFsaWdubWVudCAtIDEpKTsKKworCS8qCisJICogUmVqZWN0IGluY29uc2lzdGVudCBhcmdzLiAgV2UgaGF2ZSBhZGp1c3RlZCB0aGVzZSwgc28gdGhpcworCSAqIG1heSBmYWlsIGR1ZSB0byBvdXIgaW50ZXJuYWwgY2hhbmdlcyBldmVuIGlmIHRoaXMgY2hlY2sKKwkgKiB3b3VsZCBwYXNzIGZvciB0aGUgdmFsdWVzIHRoZSB1c2VyIHN1cHBsaWVkLgorCSAqLworCWlmIChyZXFfc2l6ZSA+IGFkZHJlc3NfbWF4IC0gYWRkcmVzc19taW4pCisJCWdvdG8gZXJyb3Jfb3V0OworCisJLyogV2FsayB0aHJvdWdoIHRoZSBsaXN0IGVudHJpZXMgLSBmaXJzdCBmaXQgZm91bmQgaXMgcmV0dXJuZWQgKi8KKworCWlmICghKGZsYWdzICYgQ1ZNWF9CT09UTUVNX0ZMQUdfTk9fTE9DS0lORykpCisJCWN2bXhfYm9vdG1lbV9sb2NrKCk7CisJaGVhZF9hZGRyID0gY3ZteF9ib290bWVtX2Rlc2MtPmhlYWRfYWRkcjsKKwllbnRfYWRkciA9IGhlYWRfYWRkcjsKKwlmb3IgKDsgZW50X2FkZHI7CisJICAgICBwcmV2X2FkZHIgPSBlbnRfYWRkciwKKwkgICAgIGVudF9hZGRyID0gY3ZteF9ib290bWVtX3BoeV9nZXRfbmV4dChlbnRfYWRkcikpIHsKKwkJdWludDY0X3QgdXNhYmxlX2Jhc2UsIHVzYWJsZV9tYXg7CisJCXVpbnQ2NF90IGVudF9zaXplID0gY3ZteF9ib290bWVtX3BoeV9nZXRfc2l6ZShlbnRfYWRkcik7CisKKwkJaWYgKGN2bXhfYm9vdG1lbV9waHlfZ2V0X25leHQoZW50X2FkZHIpCisJCSAgICAmJiBlbnRfYWRkciA+IGN2bXhfYm9vdG1lbV9waHlfZ2V0X25leHQoZW50X2FkZHIpKSB7CisJCQljdm14X2RwcmludGYoIkludGVybmFsIGJvb3RtZW1fYWxsb2MoKSBlcnJvcjogZW50OiAiCisJCQkJIjB4JWxseCwgbmV4dDogMHglbGx4XG4iLAorCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpZW50X2FkZHIsCisJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZykKKwkJCQljdm14X2Jvb3RtZW1fcGh5X2dldF9uZXh0KGVudF9hZGRyKSk7CisJCQlnb3RvIGVycm9yX291dDsKKwkJfQorCisJCS8qCisJCSAqIERldGVybWluZSBpZiB0aGlzIGlzIGFuIGVudHJ5IHRoYXQgY2FuIHNhdGlzaWZ5IHRoZQorCQkgKiByZXF1ZXN0IENoZWNrIHRvIG1ha2Ugc3VyZSBlbnRyeSBpcyBsYXJnZSBlbm91Z2ggdG8KKwkJICogc2F0aXNmeSByZXF1ZXN0LgorCQkgKi8KKwkJdXNhYmxlX2Jhc2UgPQorCQkgICAgX19BTElHTl9NQVNLKG1heChhZGRyZXNzX21pbiwgZW50X2FkZHIpLCBhbGlnbm1lbnQgLSAxKTsKKwkJdXNhYmxlX21heCA9IG1pbihhZGRyZXNzX21heCwgZW50X2FkZHIgKyBlbnRfc2l6ZSk7CisJCS8qCisJCSAqIFdlIHNob3VsZCBiZSBhYmxlIHRvIGFsbG9jYXRlIGJsb2NrIGF0IGFkZHJlc3MKKwkJICogdXNhYmxlX2Jhc2UuCisJCSAqLworCisJCWRlc2lyZWRfbWluX2FkZHIgPSB1c2FibGVfYmFzZTsKKwkJLyoKKwkJICogRGV0ZXJtaW5lIGlmIHJlcXVlc3QgY2FuIGJlIHNhdGlzZmllZCBmcm9tIHRoZQorCQkgKiBjdXJyZW50IGVudHJ5LgorCQkgKi8KKwkJaWYgKCEoKGVudF9hZGRyICsgZW50X3NpemUpID4gdXNhYmxlX2Jhc2UKKwkJCQkmJiBlbnRfYWRkciA8IGFkZHJlc3NfbWF4CisJCQkJJiYgcmVxX3NpemUgPD0gdXNhYmxlX21heCAtIHVzYWJsZV9iYXNlKSkKKwkJCWNvbnRpbnVlOworCQkvKgorCQkgKiBXZSBoYXZlIGZvdW5kIGFuIGVudHJ5IHRoYXQgaGFzIHJvb20gdG8gc2F0aXNmeSB0aGUKKwkJICogcmVxdWVzdCwgc28gYWxsb2NhdGUgaXQgZnJvbSB0aGlzIGVudHJ5LiAgSWYgZW5kCisJCSAqIENWTVhfQk9PVE1FTV9GTEFHX0VORF9BTExPQyBzZXQsIHRoZW4gYWxsb2NhdGUgZnJvbQorCQkgKiB0aGUgZW5kIG9mIHRoaXMgYmxvY2sgcmF0aGVyIHRoYW4gdGhlIGJlZ2lubmluZy4KKwkJICovCisJCWlmIChmbGFncyAmIENWTVhfQk9PVE1FTV9GTEFHX0VORF9BTExPQykgeworCQkJZGVzaXJlZF9taW5fYWRkciA9IHVzYWJsZV9tYXggLSByZXFfc2l6ZTsKKwkJCS8qCisJCQkgKiBBbGlnbiBkZXNpcmVkIGFkZHJlc3MgZG93biB0byByZXF1aXJlZAorCQkJICogYWxpZ25tZW50LgorCQkJICovCisJCQlkZXNpcmVkX21pbl9hZGRyICY9IH4oYWxpZ25tZW50IC0gMSk7CisJCX0KKworCQkvKiBNYXRjaCBhdCBzdGFydCBvZiBlbnRyeSAqLworCQlpZiAoZGVzaXJlZF9taW5fYWRkciA9PSBlbnRfYWRkcikgeworCQkJaWYgKHJlcV9zaXplIDwgZW50X3NpemUpIHsKKwkJCQkvKgorCQkJCSAqIGJpZyBlbm91Z2ggdG8gY3JlYXRlIGEgbmV3IGJsb2NrCisJCQkJICogZnJvbSB0b3AgcG9ydGlvbiBvZiBibG9jay4KKwkJCQkgKi8KKwkJCQluZXdfZW50X2FkZHIgPSBlbnRfYWRkciArIHJlcV9zaXplOworCQkJCWN2bXhfYm9vdG1lbV9waHlfc2V0X25leHQobmV3X2VudF9hZGRyLAorCQkJCQljdm14X2Jvb3RtZW1fcGh5X2dldF9uZXh0KGVudF9hZGRyKSk7CisJCQkJY3ZteF9ib290bWVtX3BoeV9zZXRfc2l6ZShuZXdfZW50X2FkZHIsCisJCQkJCQkJZW50X3NpemUgLQorCQkJCQkJCXJlcV9zaXplKTsKKworCQkJCS8qCisJCQkJICogQWRqdXN0IG5leHQgcG9pbnRlciBhcyBmb2xsb3dpbmcKKwkJCQkgKiBjb2RlIHVzZXMgdGhpcy4KKwkJCQkgKi8KKwkJCQljdm14X2Jvb3RtZW1fcGh5X3NldF9uZXh0KGVudF9hZGRyLAorCQkJCQkJCW5ld19lbnRfYWRkcik7CisJCQl9CisKKwkJCS8qCisJCQkgKiBhZGp1c3QgcHJldiBwdHIgb3IgaGVhZCB0byByZW1vdmUgdGhpcworCQkJICogZW50cnkgZnJvbSBsaXN0LgorCQkJICovCisJCQlpZiAocHJldl9hZGRyKQorCQkJCWN2bXhfYm9vdG1lbV9waHlfc2V0X25leHQocHJldl9hZGRyLAorCQkJCQljdm14X2Jvb3RtZW1fcGh5X2dldF9uZXh0KGVudF9hZGRyKSk7CisJCQllbHNlCisJCQkJLyoKKwkJCQkgKiBoZWFkIG9mIGxpc3QgYmVpbmcgcmV0dXJuZWQsIHNvCisJCQkJICogdXBkYXRlIGhlYWQgcHRyLgorCQkJCSAqLworCQkJCWN2bXhfYm9vdG1lbV9kZXNjLT5oZWFkX2FkZHIgPQorCQkJCQljdm14X2Jvb3RtZW1fcGh5X2dldF9uZXh0KGVudF9hZGRyKTsKKworCQkJaWYgKCEoZmxhZ3MgJiBDVk1YX0JPT1RNRU1fRkxBR19OT19MT0NLSU5HKSkKKwkJCQljdm14X2Jvb3RtZW1fdW5sb2NrKCk7CisJCQlyZXR1cm4gZGVzaXJlZF9taW5fYWRkcjsKKwkJfQorCQkvKgorCQkgKiBibG9jayByZXR1cm5lZCBkb2Vzbid0IHN0YXJ0IGF0IGJlZ2lubmluZyBvZiBlbnRyeSwKKwkJICogc28gd2Uga25vdyB0aGF0IHdlIHdpbGwgYmUgc3BsaXR0aW5nIGEgYmxvY2sgb2ZmCisJCSAqIHRoZSBmcm9udCBvZiB0aGlzIG9uZS4gIENyZWF0ZSBhIG5ldyBibG9jayBmcm9tIHRoZQorCQkgKiBiZWdpbm5pbmcsIGFkZCB0byBsaXN0LCBhbmQgZ28gdG8gdG9wIG9mIGxvb3AKKwkJICogYWdhaW4uCisJCSAqCisJCSAqIGNyZWF0ZSBuZXcgYmxvY2sgZnJvbSBoaWdoIHBvcnRpb24gb2YKKwkJICogYmxvY2ssIHNvIHRoYXQgdG9wIGJsb2NrIHN0YXJ0cyBhdCBkZXNpcmVkCisJCSAqIGFkZHIuCisJCSAqLworCQluZXdfZW50X2FkZHIgPSBkZXNpcmVkX21pbl9hZGRyOworCQljdm14X2Jvb3RtZW1fcGh5X3NldF9uZXh0KG5ld19lbnRfYWRkciwKKwkJCQkJY3ZteF9ib290bWVtX3BoeV9nZXRfbmV4dAorCQkJCQkoZW50X2FkZHIpKTsKKwkJY3ZteF9ib290bWVtX3BoeV9zZXRfc2l6ZShuZXdfZW50X2FkZHIsCisJCQkJCWN2bXhfYm9vdG1lbV9waHlfZ2V0X3NpemUKKwkJCQkJKGVudF9hZGRyKSAtCisJCQkJCShkZXNpcmVkX21pbl9hZGRyIC0KKwkJCQkJCWVudF9hZGRyKSk7CisJCWN2bXhfYm9vdG1lbV9waHlfc2V0X3NpemUoZW50X2FkZHIsCisJCQkJCWRlc2lyZWRfbWluX2FkZHIgLSBlbnRfYWRkcik7CisJCWN2bXhfYm9vdG1lbV9waHlfc2V0X25leHQoZW50X2FkZHIsIG5ld19lbnRfYWRkcik7CisJCS8qIExvb3AgYWdhaW4gdG8gaGFuZGxlIGFjdHVhbCBhbGxvYyBmcm9tIG5ldyBibG9jayAqLworCX0KK2Vycm9yX291dDoKKwkvKiBXZSBkaWRuJ3QgZmluZCBhbnl0aGluZywgc28gcmV0dXJuIGVycm9yICovCisJaWYgKCEoZmxhZ3MgJiBDVk1YX0JPT1RNRU1fRkxBR19OT19MT0NLSU5HKSkKKwkJY3ZteF9ib290bWVtX3VubG9jaygpOworCXJldHVybiAtMTsKK30KKworaW50IF9fY3ZteF9ib290bWVtX3BoeV9mcmVlKHVpbnQ2NF90IHBoeV9hZGRyLCB1aW50NjRfdCBzaXplLCB1aW50MzJfdCBmbGFncykKK3sKKwl1aW50NjRfdCBjdXJfYWRkcjsKKwl1aW50NjRfdCBwcmV2X2FkZHIgPSAwOwkvKiB6ZXJvIGlzIGludmFsaWQgKi8KKwlpbnQgcmV0dmFsID0gMDsKKworI2lmZGVmIERFQlVHCisJY3ZteF9kcHJpbnRmKCJfX2N2bXhfYm9vdG1lbV9waHlfZnJlZSBhZGRyOiAweCVsbHgsIHNpemU6IDB4JWxseFxuIiwKKwkJICAgICAodW5zaWduZWQgbG9uZyBsb25nKXBoeV9hZGRyLCAodW5zaWduZWQgbG9uZyBsb25nKXNpemUpOworI2VuZGlmCisJaWYgKGN2bXhfYm9vdG1lbV9kZXNjLT5tYWpvcl92ZXJzaW9uID4gMykgeworCQljdm14X2RwcmludGYoIkVSUk9SOiBJbmNvbXBhdGlibGUgYm9vdG1lbSBkZXNjcmlwdG9yICIKKwkJCSAgICAgInZlcnNpb246ICVkLiVkIGF0IGFkZHI6ICVwXG4iLAorCQkJICAgICAoaW50KWN2bXhfYm9vdG1lbV9kZXNjLT5tYWpvcl92ZXJzaW9uLAorCQkJICAgICAoaW50KWN2bXhfYm9vdG1lbV9kZXNjLT5taW5vcl92ZXJzaW9uLAorCQkJICAgICBjdm14X2Jvb3RtZW1fZGVzYyk7CisJCXJldHVybiAwOworCX0KKworCS8qIDAgaXMgbm90IGEgdmFsaWQgc2l6ZSBmb3IgdGhpcyBhbGxvY2F0b3IgKi8KKwlpZiAoIXNpemUpCisJCXJldHVybiAwOworCisJaWYgKCEoZmxhZ3MgJiBDVk1YX0JPT1RNRU1fRkxBR19OT19MT0NLSU5HKSkKKwkJY3ZteF9ib290bWVtX2xvY2soKTsKKwljdXJfYWRkciA9IGN2bXhfYm9vdG1lbV9kZXNjLT5oZWFkX2FkZHI7CisJaWYgKGN1cl9hZGRyID09IDAgfHwgcGh5X2FkZHIgPCBjdXJfYWRkcikgeworCQkvKiBhZGQgYXQgZnJvbnQgb2YgbGlzdCAtIHNwZWNpYWwgY2FzZSB3aXRoIGNoYW5naW5nIGhlYWQgcHRyICovCisJCWlmIChjdXJfYWRkciAmJiBwaHlfYWRkciArIHNpemUgPiBjdXJfYWRkcikKKwkJCWdvdG8gYm9vdG1lbV9mcmVlX2RvbmU7CS8qIGVycm9yLCBvdmVybGFwcGluZyBzZWN0aW9uICovCisJCWVsc2UgaWYgKHBoeV9hZGRyICsgc2l6ZSA9PSBjdXJfYWRkcikgeworCQkJLyogQWRkIHRvIGZyb250IG9mIGV4aXN0aW5nIGZpcnN0IGJsb2NrICovCisJCQljdm14X2Jvb3RtZW1fcGh5X3NldF9uZXh0KHBoeV9hZGRyLAorCQkJCQkJICBjdm14X2Jvb3RtZW1fcGh5X2dldF9uZXh0CisJCQkJCQkgIChjdXJfYWRkcikpOworCQkJY3ZteF9ib290bWVtX3BoeV9zZXRfc2l6ZShwaHlfYWRkciwKKwkJCQkJCSAgY3ZteF9ib290bWVtX3BoeV9nZXRfc2l6ZQorCQkJCQkJICAoY3VyX2FkZHIpICsgc2l6ZSk7CisJCQljdm14X2Jvb3RtZW1fZGVzYy0+aGVhZF9hZGRyID0gcGh5X2FkZHI7CisKKwkJfSBlbHNlIHsKKwkJCS8qIE5ldyBibG9jayBiZWZvcmUgZmlyc3QgYmxvY2suICBPSyBpZiBjdXJfYWRkciBpcyAwICovCisJCQljdm14X2Jvb3RtZW1fcGh5X3NldF9uZXh0KHBoeV9hZGRyLCBjdXJfYWRkcik7CisJCQljdm14X2Jvb3RtZW1fcGh5X3NldF9zaXplKHBoeV9hZGRyLCBzaXplKTsKKwkJCWN2bXhfYm9vdG1lbV9kZXNjLT5oZWFkX2FkZHIgPSBwaHlfYWRkcjsKKwkJfQorCQlyZXR2YWwgPSAxOworCQlnb3RvIGJvb3RtZW1fZnJlZV9kb25lOworCX0KKworCS8qIEZpbmQgcGxhY2UgaW4gbGlzdCB0byBhZGQgYmxvY2sgKi8KKwl3aGlsZSAoY3VyX2FkZHIgJiYgcGh5X2FkZHIgPiBjdXJfYWRkcikgeworCQlwcmV2X2FkZHIgPSBjdXJfYWRkcjsKKwkJY3VyX2FkZHIgPSBjdm14X2Jvb3RtZW1fcGh5X2dldF9uZXh0KGN1cl9hZGRyKTsKKwl9CisKKwlpZiAoIWN1cl9hZGRyKSB7CisJCS8qCisJCSAqIFdlIGhhdmUgcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBsaXN0LCBhZGQgb24gdG8gZW5kLAorCQkgKiBjaGVja2luZyB0byBzZWUgaWYgd2UgbmVlZCB0byBjb21iaW5lIHdpdGggbGFzdAorCQkgKiBibG9jaworCQkgKi8KKwkJaWYgKHByZXZfYWRkciArIGN2bXhfYm9vdG1lbV9waHlfZ2V0X3NpemUocHJldl9hZGRyKSA9PQorCQkgICAgcGh5X2FkZHIpIHsKKwkJCWN2bXhfYm9vdG1lbV9waHlfc2V0X3NpemUocHJldl9hZGRyLAorCQkJCQkJICBjdm14X2Jvb3RtZW1fcGh5X2dldF9zaXplCisJCQkJCQkgIChwcmV2X2FkZHIpICsgc2l6ZSk7CisJCX0gZWxzZSB7CisJCQljdm14X2Jvb3RtZW1fcGh5X3NldF9uZXh0KHByZXZfYWRkciwgcGh5X2FkZHIpOworCQkJY3ZteF9ib290bWVtX3BoeV9zZXRfc2l6ZShwaHlfYWRkciwgc2l6ZSk7CisJCQljdm14X2Jvb3RtZW1fcGh5X3NldF9uZXh0KHBoeV9hZGRyLCAwKTsKKwkJfQorCQlyZXR2YWwgPSAxOworCQlnb3RvIGJvb3RtZW1fZnJlZV9kb25lOworCX0gZWxzZSB7CisJCS8qCisJCSAqIGluc2VydCBiZXR3ZWVuIHByZXYgYW5kIGN1ciBub2RlcywgY2hlY2tpbmcgZm9yCisJCSAqIG1lcmdlIHdpdGggZWl0aGVyL2JvdGguCisJCSAqLworCQlpZiAocHJldl9hZGRyICsgY3ZteF9ib290bWVtX3BoeV9nZXRfc2l6ZShwcmV2X2FkZHIpID09CisJCSAgICBwaHlfYWRkcikgeworCQkJLyogTWVyZ2Ugd2l0aCBwcmV2aW91cyAqLworCQkJY3ZteF9ib290bWVtX3BoeV9zZXRfc2l6ZShwcmV2X2FkZHIsCisJCQkJCQkgIGN2bXhfYm9vdG1lbV9waHlfZ2V0X3NpemUKKwkJCQkJCSAgKHByZXZfYWRkcikgKyBzaXplKTsKKwkJCWlmIChwaHlfYWRkciArIHNpemUgPT0gY3VyX2FkZHIpIHsKKwkJCQkvKiBBbHNvIG1lcmdlIHdpdGggY3VycmVudCAqLworCQkJCWN2bXhfYm9vdG1lbV9waHlfc2V0X3NpemUocHJldl9hZGRyLAorCQkJCQljdm14X2Jvb3RtZW1fcGh5X2dldF9zaXplKGN1cl9hZGRyKSArCisJCQkJCWN2bXhfYm9vdG1lbV9waHlfZ2V0X3NpemUocHJldl9hZGRyKSk7CisJCQkJY3ZteF9ib290bWVtX3BoeV9zZXRfbmV4dChwcmV2X2FkZHIsCisJCQkJCWN2bXhfYm9vdG1lbV9waHlfZ2V0X25leHQoY3VyX2FkZHIpKTsKKwkJCX0KKwkJCXJldHZhbCA9IDE7CisJCQlnb3RvIGJvb3RtZW1fZnJlZV9kb25lOworCQl9IGVsc2UgaWYgKHBoeV9hZGRyICsgc2l6ZSA9PSBjdXJfYWRkcikgeworCQkJLyogTWVyZ2Ugd2l0aCBjdXJyZW50ICovCisJCQljdm14X2Jvb3RtZW1fcGh5X3NldF9zaXplKHBoeV9hZGRyLAorCQkJCQkJICBjdm14X2Jvb3RtZW1fcGh5X2dldF9zaXplCisJCQkJCQkgIChjdXJfYWRkcikgKyBzaXplKTsKKwkJCWN2bXhfYm9vdG1lbV9waHlfc2V0X25leHQocGh5X2FkZHIsCisJCQkJCQkgIGN2bXhfYm9vdG1lbV9waHlfZ2V0X25leHQKKwkJCQkJCSAgKGN1cl9hZGRyKSk7CisJCQljdm14X2Jvb3RtZW1fcGh5X3NldF9uZXh0KHByZXZfYWRkciwgcGh5X2FkZHIpOworCQkJcmV0dmFsID0gMTsKKwkJCWdvdG8gYm9vdG1lbV9mcmVlX2RvbmU7CisJCX0KKworCQkvKiBJdCBpcyBhIHN0YW5kYWxvbmUgYmxvY2ssIGFkZCBpbiBiZXR3ZWVuIHByZXYgYW5kIGN1ciAqLworCQljdm14X2Jvb3RtZW1fcGh5X3NldF9zaXplKHBoeV9hZGRyLCBzaXplKTsKKwkJY3ZteF9ib290bWVtX3BoeV9zZXRfbmV4dChwaHlfYWRkciwgY3VyX2FkZHIpOworCQljdm14X2Jvb3RtZW1fcGh5X3NldF9uZXh0KHByZXZfYWRkciwgcGh5X2FkZHIpOworCisJfQorCXJldHZhbCA9IDE7CisKK2Jvb3RtZW1fZnJlZV9kb25lOgorCWlmICghKGZsYWdzICYgQ1ZNWF9CT09UTUVNX0ZMQUdfTk9fTE9DS0lORykpCisJCWN2bXhfYm9vdG1lbV91bmxvY2soKTsKKwlyZXR1cm4gcmV0dmFsOworCit9CisKK3N0cnVjdCBjdm14X2Jvb3RtZW1fbmFtZWRfYmxvY2tfZGVzYyAqCisJY3ZteF9ib290bWVtX3BoeV9uYW1lZF9ibG9ja19maW5kKGNoYXIgKm5hbWUsIHVpbnQzMl90IGZsYWdzKQoreworCXVuc2lnbmVkIGludCBpOworCXN0cnVjdCBjdm14X2Jvb3RtZW1fbmFtZWRfYmxvY2tfZGVzYyAqbmFtZWRfYmxvY2tfYXJyYXlfcHRyOworCisjaWZkZWYgREVCVUcKKwljdm14X2RwcmludGYoImN2bXhfYm9vdG1lbV9waHlfbmFtZWRfYmxvY2tfZmluZDogJXNcbiIsIG5hbWUpOworI2VuZGlmCisJLyoKKwkgKiBMb2NrIHRoZSBzdHJ1Y3R1cmUgdG8gbWFrZSBzdXJlIHRoYXQgaXQgaXMgbm90IGJlaW5nCisJICogY2hhbmdlZCB3aGlsZSB3ZSBhcmUgZXhhbWluaW5nIGl0LgorCSAqLworCWlmICghKGZsYWdzICYgQ1ZNWF9CT09UTUVNX0ZMQUdfTk9fTE9DS0lORykpCisJCWN2bXhfYm9vdG1lbV9sb2NrKCk7CisKKwkvKiBVc2UgWEtQSFlTIGZvciA2NCBiaXQgbGludXggKi8KKwluYW1lZF9ibG9ja19hcnJheV9wdHIgPSAoc3RydWN0IGN2bXhfYm9vdG1lbV9uYW1lZF9ibG9ja19kZXNjICopCisJICAgIGN2bXhfcGh5c190b19wdHIoY3ZteF9ib290bWVtX2Rlc2MtPm5hbWVkX2Jsb2NrX2FycmF5X2FkZHIpOworCisjaWZkZWYgREVCVUcKKwljdm14X2RwcmludGYKKwkgICAgKCJjdm14X2Jvb3RtZW1fcGh5X25hbWVkX2Jsb2NrX2ZpbmQ6IG5hbWVkX2Jsb2NrX2FycmF5X3B0cjogJXBcbiIsCisJICAgICBuYW1lZF9ibG9ja19hcnJheV9wdHIpOworI2VuZGlmCisJaWYgKGN2bXhfYm9vdG1lbV9kZXNjLT5tYWpvcl92ZXJzaW9uID09IDMpIHsKKwkJZm9yIChpID0gMDsKKwkJICAgICBpIDwgY3ZteF9ib290bWVtX2Rlc2MtPm5hbWVkX2Jsb2NrX251bV9ibG9ja3M7IGkrKykgeworCQkJaWYgKChuYW1lICYmIG5hbWVkX2Jsb2NrX2FycmF5X3B0cltpXS5zaXplCisJCQkgICAgICYmICFzdHJuY21wKG5hbWUsIG5hbWVkX2Jsb2NrX2FycmF5X3B0cltpXS5uYW1lLAorCQkJCQkgY3ZteF9ib290bWVtX2Rlc2MtPm5hbWVkX2Jsb2NrX25hbWVfbGVuCisJCQkJCSAtIDEpKQorCQkJICAgIHx8ICghbmFtZSAmJiAhbmFtZWRfYmxvY2tfYXJyYXlfcHRyW2ldLnNpemUpKSB7CisJCQkJaWYgKCEoZmxhZ3MgJiBDVk1YX0JPT1RNRU1fRkxBR19OT19MT0NLSU5HKSkKKwkJCQkJY3ZteF9ib290bWVtX3VubG9jaygpOworCisJCQkJcmV0dXJuICYobmFtZWRfYmxvY2tfYXJyYXlfcHRyW2ldKTsKKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCWN2bXhfZHByaW50ZigiRVJST1I6IEluY29tcGF0aWJsZSBib290bWVtIGRlc2NyaXB0b3IgIgorCQkJICAgICAidmVyc2lvbjogJWQuJWQgYXQgYWRkcjogJXBcbiIsCisJCQkgICAgIChpbnQpY3ZteF9ib290bWVtX2Rlc2MtPm1ham9yX3ZlcnNpb24sCisJCQkgICAgIChpbnQpY3ZteF9ib290bWVtX2Rlc2MtPm1pbm9yX3ZlcnNpb24sCisJCQkgICAgIGN2bXhfYm9vdG1lbV9kZXNjKTsKKwl9CisJaWYgKCEoZmxhZ3MgJiBDVk1YX0JPT1RNRU1fRkxBR19OT19MT0NLSU5HKSkKKwkJY3ZteF9ib290bWVtX3VubG9jaygpOworCisJcmV0dXJuIE5VTEw7Cit9CisKK2ludCBjdm14X2Jvb3RtZW1fcGh5X25hbWVkX2Jsb2NrX2ZyZWUoY2hhciAqbmFtZSwgdWludDMyX3QgZmxhZ3MpCit7CisJc3RydWN0IGN2bXhfYm9vdG1lbV9uYW1lZF9ibG9ja19kZXNjICpuYW1lZF9ibG9ja19wdHI7CisKKwlpZiAoY3ZteF9ib290bWVtX2Rlc2MtPm1ham9yX3ZlcnNpb24gIT0gMykgeworCQljdm14X2RwcmludGYoIkVSUk9SOiBJbmNvbXBhdGlibGUgYm9vdG1lbSBkZXNjcmlwdG9yIHZlcnNpb246ICIKKwkJCSAgICAgIiVkLiVkIGF0IGFkZHI6ICVwXG4iLAorCQkJICAgICAoaW50KWN2bXhfYm9vdG1lbV9kZXNjLT5tYWpvcl92ZXJzaW9uLAorCQkJICAgICAoaW50KWN2bXhfYm9vdG1lbV9kZXNjLT5taW5vcl92ZXJzaW9uLAorCQkJICAgICBjdm14X2Jvb3RtZW1fZGVzYyk7CisJCXJldHVybiAwOworCX0KKyNpZmRlZiBERUJVRworCWN2bXhfZHByaW50ZigiY3ZteF9ib290bWVtX3BoeV9uYW1lZF9ibG9ja19mcmVlOiAlc1xuIiwgbmFtZSk7CisjZW5kaWYKKworCS8qCisJICogVGFrZSBsb2NrIGhlcmUsIGFzIG5hbWUgbG9va3VwL2Jsb2NrIGZyZWUvbmFtZSBmcmVlIG5lZWQgdG8KKwkgKiBiZSBhdG9taWMuCisJICovCisJY3ZteF9ib290bWVtX2xvY2soKTsKKworCW5hbWVkX2Jsb2NrX3B0ciA9CisJICAgIGN2bXhfYm9vdG1lbV9waHlfbmFtZWRfYmxvY2tfZmluZChuYW1lLAorCQkJCQkgICAgICBDVk1YX0JPT1RNRU1fRkxBR19OT19MT0NLSU5HKTsKKwlpZiAobmFtZWRfYmxvY2tfcHRyKSB7CisjaWZkZWYgREVCVUcKKwkJY3ZteF9kcHJpbnRmKCJjdm14X2Jvb3RtZW1fcGh5X25hbWVkX2Jsb2NrX2ZyZWU6ICIKKwkJCSAgICAgIiVzLCBiYXNlOiAweCVsbHgsIHNpemU6IDB4JWxseFxuIiwKKwkJCSAgICAgbmFtZSwKKwkJCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyluYW1lZF9ibG9ja19wdHItPmJhc2VfYWRkciwKKwkJCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyluYW1lZF9ibG9ja19wdHItPnNpemUpOworI2VuZGlmCisJCV9fY3ZteF9ib290bWVtX3BoeV9mcmVlKG5hbWVkX2Jsb2NrX3B0ci0+YmFzZV9hZGRyLAorCQkJCQluYW1lZF9ibG9ja19wdHItPnNpemUsCisJCQkJCUNWTVhfQk9PVE1FTV9GTEFHX05PX0xPQ0tJTkcpOworCQluYW1lZF9ibG9ja19wdHItPnNpemUgPSAwOworCQkvKiBTZXQgc2l6ZSB0byB6ZXJvIHRvIGluZGljYXRlIGJsb2NrIG5vdCB1c2VkLiAqLworCX0KKworCWN2bXhfYm9vdG1lbV91bmxvY2soKTsKKwlyZXR1cm4gbmFtZWRfYmxvY2tfcHRyICE9IE5VTEw7CS8qIDAgb24gZmFpbHVyZSwgMSBvbiBzdWNjZXNzICovCit9CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvY2F2aXVtLW9jdGVvbi9leGVjdXRpdmUvY3ZteC1sMmMuYyBiL2FyY2gvbWlwcy9jYXZpdW0tb2N0ZW9uL2V4ZWN1dGl2ZS9jdm14LWwyYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhYmU1NmYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21pcHMvY2F2aXVtLW9jdGVvbi9leGVjdXRpdmUvY3ZteC1sMmMuYwpAQCAtMCwwICsxLDczNCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqbGljZW5zZSBzdGFydCoqKioqKioqKioqKioqKgorICogQXV0aG9yOiBDYXZpdW0gTmV0d29ya3MKKyAqCisgKiBDb250YWN0OiBzdXBwb3J0QGNhdml1bW5ldHdvcmtzLmNvbQorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIE9DVEVPTiBTREsKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwOCBDYXZpdW0gTmV0d29ya3MKKyAqCisgKiBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgVmVyc2lvbiAyLCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogQVMtSVMgYW5kIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkKKyAqIG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgVElUTEUsIG9yCisgKiBOT05JTkZSSU5HRU1FTlQuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlCisgKiBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgZmlsZTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKiBvciB2aXNpdCBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLgorICoKKyAqIFRoaXMgZmlsZSBtYXkgYWxzbyBiZSBhdmFpbGFibGUgdW5kZXIgYSBkaWZmZXJlbnQgbGljZW5zZSBmcm9tIENhdml1bS4KKyAqIENvbnRhY3QgQ2F2aXVtIE5ldHdvcmtzIGZvciBtb3JlIGluZm9ybWF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKipsaWNlbnNlIGVuZCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogSW1wbGVtZW50YXRpb24gb2YgdGhlIExldmVsIDIgQ2FjaGUgKEwyQykgY29udHJvbCwgbWVhc3VyZW1lbnQsIGFuZAorICogZGVidWdnaW5nIGZhY2lsaXRpZXMuCisgKi8KKworI2luY2x1ZGUgPGFzbS9vY3Rlb24vY3ZteC5oPgorI2luY2x1ZGUgPGFzbS9vY3Rlb24vY3ZteC1sMmMuaD4KKyNpbmNsdWRlIDxhc20vb2N0ZW9uL2N2bXgtc3BpbmxvY2suaD4KKworLyoKKyAqIFRoaXMgc3BpbmxvY2sgaXMgdXNlZCBpbnRlcm5hbGx5IHRvIGVuc3VyZSB0aGF0IG9ubHkgb25lIGNvcmUgaXMKKyAqIHBlcmZvcm1pbmcgY2VydGFpbiBMMiBvcGVyYXRpb25zIGF0IGEgdGltZS4KKyAqCisgKiBOT1RFOiBUaGlzIG9ubHkgcHJvdGVjdHMgY2FsbHMgZnJvbSB3aXRoaW4gYSBzaW5nbGUgYXBwbGljYXRpb24gLQorICogaWYgbXVsdGlwbGUgYXBwbGljYXRpb25zIG9yIG9wZXJhdGluZyBzeXN0ZW1zIGFyZSBydW5uaW5nLCB0aGVuIGl0CisgKiBpcyB1cCB0byB0aGUgdXNlciBwcm9ncmFtIHRvIGNvb3JkaW5hdGUgYmV0d2VlbiB0aGVtLgorICovCitzdGF0aWMgY3ZteF9zcGlubG9ja190IGN2bXhfbDJjX3NwaW5sb2NrOworCitzdGF0aWMgaW5saW5lIGludCBsMl9zaXplX2hhbGYodm9pZCkKK3sKKwl1aW50NjRfdCB2YWwgPSBjdm14X3JlYWRfY3NyKENWTVhfTDJEX0ZVUzMpOworCXJldHVybiAhISh2YWwgJiAoMXVsbCA8PCAzNCkpOworfQorCitpbnQgY3ZteF9sMmNfZ2V0X2NvcmVfd2F5X3BhcnRpdGlvbih1aW50MzJfdCBjb3JlKQoreworCXVpbnQzMl90IGZpZWxkOworCisJLyogVmFsaWRhdGUgdGhlIGNvcmUgbnVtYmVyICovCisJaWYgKGNvcmUgPj0gY3ZteF9vY3Rlb25fbnVtX2NvcmVzKCkpCisJCXJldHVybiAtMTsKKworCS8qCisJICogVXNlIHRoZSBsb3dlciB0d28gYml0cyBvZiB0aGUgY29yZU51bWJlciB0byBkZXRlcm1pbmUgdGhlCisJICogYml0IG9mZnNldCBvZiB0aGUgVU1TS1tdIGZpZWxkIGluIHRoZSBMMkNfU1BBUiByZWdpc3Rlci4KKwkgKi8KKwlmaWVsZCA9IChjb3JlICYgMHgzKSAqIDg7CisKKwkvKgorCSAqIFJldHVybiB0aGUgVU1TS1tdIGZpZWxkIGZyb20gdGhlIGFwcHJvcHJpYXRlIEwyQ19TUEFSCisJICogcmVnaXN0ZXIgYmFzZWQgb24gdGhlIGNvcmVOdW1iZXIuCisJICovCisKKwlzd2l0Y2ggKGNvcmUgJiAweEMpIHsKKwljYXNlIDB4MDoKKwkJcmV0dXJuIChjdm14X3JlYWRfY3NyKENWTVhfTDJDX1NQQVIwKSAmICgweEZGIDw8IGZpZWxkKSkgPj4KKwkJCWZpZWxkOworCWNhc2UgMHg0OgorCQlyZXR1cm4gKGN2bXhfcmVhZF9jc3IoQ1ZNWF9MMkNfU1BBUjEpICYgKDB4RkYgPDwgZmllbGQpKSA+PgorCQkJZmllbGQ7CisJY2FzZSAweDg6CisJCXJldHVybiAoY3ZteF9yZWFkX2NzcihDVk1YX0wyQ19TUEFSMikgJiAoMHhGRiA8PCBmaWVsZCkpID4+CisJCQlmaWVsZDsKKwljYXNlIDB4QzoKKwkJcmV0dXJuIChjdm14X3JlYWRfY3NyKENWTVhfTDJDX1NQQVIzKSAmICgweEZGIDw8IGZpZWxkKSkgPj4KKwkJCWZpZWxkOworCX0KKwlyZXR1cm4gMDsKK30KKworaW50IGN2bXhfbDJjX3NldF9jb3JlX3dheV9wYXJ0aXRpb24odWludDMyX3QgY29yZSwgdWludDMyX3QgbWFzaykKK3sKKwl1aW50MzJfdCBmaWVsZDsKKwl1aW50MzJfdCB2YWxpZF9tYXNrOworCisJdmFsaWRfbWFzayA9ICgweDEgPDwgY3ZteF9sMmNfZ2V0X251bV9hc3NvYygpKSAtIDE7CisKKwltYXNrICY9IHZhbGlkX21hc2s7CisKKwkvKiBBIFVNU0sgc2V0dGluZyB3aGljaCBibG9ja3MgYWxsIEwyQyBXYXlzIGlzIGFuIGVycm9yLiAqLworCWlmIChtYXNrID09IHZhbGlkX21hc2spCisJCXJldHVybiAtMTsKKworCS8qIFZhbGlkYXRlIHRoZSBjb3JlIG51bWJlciAqLworCWlmIChjb3JlID49IGN2bXhfb2N0ZW9uX251bV9jb3JlcygpKQorCQlyZXR1cm4gLTE7CisKKwkvKiBDaGVjayB0byBtYWtlIHN1cmUgY3VycmVudCBtYXNrICYgbmV3IG1hc2sgZG9uJ3QgYmxvY2sgYWxsIHdheXMgKi8KKwlpZiAoKChtYXNrIHwgY3ZteF9sMmNfZ2V0X2NvcmVfd2F5X3BhcnRpdGlvbihjb3JlKSkgJiB2YWxpZF9tYXNrKSA9PQorCSAgICB2YWxpZF9tYXNrKQorCQlyZXR1cm4gLTE7CisKKwkvKiBVc2UgdGhlIGxvd2VyIHR3byBiaXRzIG9mIGNvcmUgdG8gZGV0ZXJtaW5lIHRoZSBiaXQgb2Zmc2V0IG9mIHRoZQorCSAqIFVNU0tbXSBmaWVsZCBpbiB0aGUgTDJDX1NQQVIgcmVnaXN0ZXIuCisJICovCisJZmllbGQgPSAoY29yZSAmIDB4MykgKiA4OworCisJLyogQXNzaWduIHRoZSBuZXcgbWFzayBzZXR0aW5nIHRvIHRoZSBVTVNLW10gZmllbGQgaW4gdGhlIGFwcHJvcHJpYXRlCisJICogTDJDX1NQQVIgcmVnaXN0ZXIgYmFzZWQgb24gdGhlIGNvcmVfbnVtLgorCSAqCisJICovCisJc3dpdGNoIChjb3JlICYgMHhDKSB7CisJY2FzZSAweDA6CisJCWN2bXhfd3JpdGVfY3NyKENWTVhfTDJDX1NQQVIwLAorCQkJICAgICAgIChjdm14X3JlYWRfY3NyKENWTVhfTDJDX1NQQVIwKSAmCisJCQkJfigweEZGIDw8IGZpZWxkKSkgfCBtYXNrIDw8IGZpZWxkKTsKKwkJYnJlYWs7CisJY2FzZSAweDQ6CisJCWN2bXhfd3JpdGVfY3NyKENWTVhfTDJDX1NQQVIxLAorCQkJICAgICAgIChjdm14X3JlYWRfY3NyKENWTVhfTDJDX1NQQVIxKSAmCisJCQkJfigweEZGIDw8IGZpZWxkKSkgfCBtYXNrIDw8IGZpZWxkKTsKKwkJYnJlYWs7CisJY2FzZSAweDg6CisJCWN2bXhfd3JpdGVfY3NyKENWTVhfTDJDX1NQQVIyLAorCQkJICAgICAgIChjdm14X3JlYWRfY3NyKENWTVhfTDJDX1NQQVIyKSAmCisJCQkJfigweEZGIDw8IGZpZWxkKSkgfCBtYXNrIDw8IGZpZWxkKTsKKwkJYnJlYWs7CisJY2FzZSAweEM6CisJCWN2bXhfd3JpdGVfY3NyKENWTVhfTDJDX1NQQVIzLAorCQkJICAgICAgIChjdm14X3JlYWRfY3NyKENWTVhfTDJDX1NQQVIzKSAmCisJCQkJfigweEZGIDw8IGZpZWxkKSkgfCBtYXNrIDw8IGZpZWxkKTsKKwkJYnJlYWs7CisJfQorCXJldHVybiAwOworfQorCitpbnQgY3ZteF9sMmNfc2V0X2h3X3dheV9wYXJ0aXRpb24odWludDMyX3QgbWFzaykKK3sKKwl1aW50MzJfdCB2YWxpZF9tYXNrOworCisJdmFsaWRfbWFzayA9IDB4ZmY7CisKKwlpZiAoT0NURU9OX0lTX01PREVMKE9DVEVPTl9DTjU4WFgpIHx8IE9DVEVPTl9JU19NT0RFTChPQ1RFT05fQ04zOFhYKSkgeworCQlpZiAobDJfc2l6ZV9oYWxmKCkpCisJCQl2YWxpZF9tYXNrID0gMHhmOworCX0gZWxzZSBpZiAobDJfc2l6ZV9oYWxmKCkpCisJCXZhbGlkX21hc2sgPSAweDM7CisKKwltYXNrICY9IHZhbGlkX21hc2s7CisKKwkvKiBBIFVNU0sgc2V0dGluZyB3aGljaCBibG9ja3MgYWxsIEwyQyBXYXlzIGlzIGFuIGVycm9yLiAqLworCWlmIChtYXNrID09IHZhbGlkX21hc2spCisJCXJldHVybiAtMTsKKwkvKiBDaGVjayB0byBtYWtlIHN1cmUgY3VycmVudCBtYXNrICYgbmV3IG1hc2sgZG9uJ3QgYmxvY2sgYWxsIHdheXMgKi8KKwlpZiAoKChtYXNrIHwgY3ZteF9sMmNfZ2V0X2h3X3dheV9wYXJ0aXRpb24oKSkgJiB2YWxpZF9tYXNrKSA9PQorCSAgICB2YWxpZF9tYXNrKQorCQlyZXR1cm4gLTE7CisKKwljdm14X3dyaXRlX2NzcihDVk1YX0wyQ19TUEFSNCwKKwkJICAgICAgIChjdm14X3JlYWRfY3NyKENWTVhfTDJDX1NQQVI0KSAmIH4weEZGKSB8IG1hc2spOworCXJldHVybiAwOworfQorCitpbnQgY3ZteF9sMmNfZ2V0X2h3X3dheV9wYXJ0aXRpb24odm9pZCkKK3sKKwlyZXR1cm4gY3ZteF9yZWFkX2NzcihDVk1YX0wyQ19TUEFSNCkgJiAoMHhGRik7Cit9CisKK3ZvaWQgY3ZteF9sMmNfY29uZmlnX3BlcmYodWludDMyX3QgY291bnRlciwgZW51bSBjdm14X2wyY19ldmVudCBldmVudCwKKwkJCSAgdWludDMyX3QgY2xlYXJfb25fcmVhZCkKK3sKKwl1bmlvbiBjdm14X2wyY19wZmN0bCBwZmN0bDsKKworCXBmY3RsLnU2NCA9IGN2bXhfcmVhZF9jc3IoQ1ZNWF9MMkNfUEZDVEwpOworCisJc3dpdGNoIChjb3VudGVyKSB7CisJY2FzZSAwOgorCQlwZmN0bC5zLmNudDBzZWwgPSBldmVudDsKKwkJcGZjdGwucy5jbnQwZW5hID0gMTsKKwkJaWYgKCFjdm14X29jdGVvbl9pc19wYXNzMSgpKQorCQkJcGZjdGwucy5jbnQwcmRjbHIgPSBjbGVhcl9vbl9yZWFkOworCQlicmVhazsKKwljYXNlIDE6CisJCXBmY3RsLnMuY250MXNlbCA9IGV2ZW50OworCQlwZmN0bC5zLmNudDFlbmEgPSAxOworCQlpZiAoIWN2bXhfb2N0ZW9uX2lzX3Bhc3MxKCkpCisJCQlwZmN0bC5zLmNudDFyZGNsciA9IGNsZWFyX29uX3JlYWQ7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJcGZjdGwucy5jbnQyc2VsID0gZXZlbnQ7CisJCXBmY3RsLnMuY250MmVuYSA9IDE7CisJCWlmICghY3ZteF9vY3Rlb25faXNfcGFzczEoKSkKKwkJCXBmY3RsLnMuY250MnJkY2xyID0gY2xlYXJfb25fcmVhZDsKKwkJYnJlYWs7CisJY2FzZSAzOgorCWRlZmF1bHQ6CisJCXBmY3RsLnMuY250M3NlbCA9IGV2ZW50OworCQlwZmN0bC5zLmNudDNlbmEgPSAxOworCQlpZiAoIWN2bXhfb2N0ZW9uX2lzX3Bhc3MxKCkpCisJCQlwZmN0bC5zLmNudDNyZGNsciA9IGNsZWFyX29uX3JlYWQ7CisJCWJyZWFrOworCX0KKworCWN2bXhfd3JpdGVfY3NyKENWTVhfTDJDX1BGQ1RMLCBwZmN0bC51NjQpOworfQorCit1aW50NjRfdCBjdm14X2wyY19yZWFkX3BlcmYodWludDMyX3QgY291bnRlcikKK3sKKwlzd2l0Y2ggKGNvdW50ZXIpIHsKKwljYXNlIDA6CisJCXJldHVybiBjdm14X3JlYWRfY3NyKENWTVhfTDJDX1BGQzApOworCWNhc2UgMToKKwkJcmV0dXJuIGN2bXhfcmVhZF9jc3IoQ1ZNWF9MMkNfUEZDMSk7CisJY2FzZSAyOgorCQlyZXR1cm4gY3ZteF9yZWFkX2NzcihDVk1YX0wyQ19QRkMyKTsKKwljYXNlIDM6CisJZGVmYXVsdDoKKwkJcmV0dXJuIGN2bXhfcmVhZF9jc3IoQ1ZNWF9MMkNfUEZDMyk7CisJfQorfQorCisvKioKKyAqIEBJTlRFUk5BTAorICogSGVscGVyIGZ1bmN0aW9uIHVzZSB0byBmYXVsdCBpbiBjYWNoZSBsaW5lcyBmb3IgTDIgY2FjaGUgbG9ja2luZworICoKKyAqIEBhZGRyOiAgIEFkZHJlc3Mgb2YgYmFzZSBvZiBtZW1vcnkgcmVnaW9uIHRvIHJlYWQgaW50byBMMiBjYWNoZQorICogQGxlbjogICAgTGVuZ3RoIChpbiBieXRlcykgb2YgcmVnaW9uIHRvIGZhdWx0IGluCisgKi8KK3N0YXRpYyB2b2lkIGZhdWx0X2luKHVpbnQ2NF90IGFkZHIsIGludCBsZW4pCit7CisJdm9sYXRpbGUgY2hhciAqcHRyOworCXZvbGF0aWxlIGNoYXIgZHVtbXk7CisJLyoKKwkgKiBBZGp1c3QgYWRkciBhbmQgbGVuZ3RoIHNvIHdlIGdldCBhbGwgY2FjaGUgbGluZXMgZXZlbiBmb3IKKwkgKiBzbWFsbCByYW5nZXMgc3Bhbm5pbmcgdHdvIGNhY2hlIGxpbmVzCisJICovCisJbGVuICs9IGFkZHIgJiBDVk1YX0NBQ0hFX0xJTkVfTUFTSzsKKwlhZGRyICY9IH5DVk1YX0NBQ0hFX0xJTkVfTUFTSzsKKwlwdHIgPSAodm9sYXRpbGUgY2hhciAqKWN2bXhfcGh5c190b19wdHIoYWRkcik7CisJLyoKKwkgKiBJbnZhbGlkYXRlIEwxIGNhY2hlIHRvIG1ha2Ugc3VyZSBhbGwgbG9hZHMgcmVzdWx0IGluIGRhdGEKKwkgKiBiZWluZyBpbiBMMi4KKwkgKi8KKwlDVk1YX0RDQUNIRV9JTlZBTElEQVRFOworCXdoaWxlIChsZW4gPiAwKSB7CisJCWR1bW15ICs9ICpwdHI7CisJCWxlbiAtPSBDVk1YX0NBQ0hFX0xJTkVfU0laRTsKKwkJcHRyICs9IENWTVhfQ0FDSEVfTElORV9TSVpFOworCX0KK30KKworaW50IGN2bXhfbDJjX2xvY2tfbGluZSh1aW50NjRfdCBhZGRyKQoreworCWludCByZXR2YWwgPSAwOworCXVuaW9uIGN2bXhfbDJjX2RiZyBsMmNkYmc7CisJdW5pb24gY3ZteF9sMmNfbGNrYmFzZSBsY2tiYXNlOworCXVuaW9uIGN2bXhfbDJjX2xja29mZiBsY2tvZmY7CisJdW5pb24gY3ZteF9sMnRfZXJyIGwydF9lcnI7CisJbDJjZGJnLnU2NCA9IDA7CisJbGNrYmFzZS51NjQgPSAwOworCWxja29mZi51NjQgPSAwOworCisJY3ZteF9zcGlubG9ja19sb2NrKCZjdm14X2wyY19zcGlubG9jayk7CisKKwkvKiBDbGVhciBsMnQgZXJyb3IgYml0cyBpZiBzZXQgKi8KKwlsMnRfZXJyLnU2NCA9IGN2bXhfcmVhZF9jc3IoQ1ZNWF9MMlRfRVJSKTsKKwlsMnRfZXJyLnMubGNrZXJyID0gMTsKKwlsMnRfZXJyLnMubGNrZXJyMiA9IDE7CisJY3ZteF93cml0ZV9jc3IoQ1ZNWF9MMlRfRVJSLCBsMnRfZXJyLnU2NCk7CisKKwlhZGRyICY9IH5DVk1YX0NBQ0hFX0xJTkVfTUFTSzsKKworCS8qIFNldCB0aGlzIGNvcmUgYXMgZGVidWcgY29yZSAqLworCWwyY2RiZy5zLnBwbnVtID0gY3ZteF9nZXRfY29yZV9udW0oKTsKKwlDVk1YX1NZTkM7CisJY3ZteF93cml0ZV9jc3IoQ1ZNWF9MMkNfREJHLCBsMmNkYmcudTY0KTsKKwljdm14X3JlYWRfY3NyKENWTVhfTDJDX0RCRyk7CisKKwlsY2tvZmYucy5sY2tfb2Zmc2V0ID0gMDsJLyogT25seSBsb2NrIDEgbGluZSBhdCBhIHRpbWUgKi8KKwljdm14X3dyaXRlX2NzcihDVk1YX0wyQ19MQ0tPRkYsIGxja29mZi51NjQpOworCWN2bXhfcmVhZF9jc3IoQ1ZNWF9MMkNfTENLT0ZGKTsKKworCWlmICgoKHVuaW9uIGN2bXhfbDJjX2NmZykgKGN2bXhfcmVhZF9jc3IoQ1ZNWF9MMkNfQ0ZHKSkpLnMuaWR4YWxpYXMpIHsKKwkJaW50IGFsaWFzX3NoaWZ0ID0KKwkJICAgIENWTVhfTDJDX0lEWF9BRERSX1NISUZUICsgMiAqIENWTVhfTDJfU0VUX0JJVFMgLSAxOworCQl1aW50NjRfdCBhZGRyX3RtcCA9CisJCSAgICBhZGRyIF4gKGFkZHIgJiAoKDEgPDwgYWxpYXNfc2hpZnQpIC0gMSkpID4+CisJCSAgICBDVk1YX0wyX1NFVF9CSVRTOworCQlsY2tiYXNlLnMubGNrX2Jhc2UgPSBhZGRyX3RtcCA+PiA3OworCX0gZWxzZSB7CisJCWxja2Jhc2Uucy5sY2tfYmFzZSA9IGFkZHIgPj4gNzsKKwl9CisKKwlsY2tiYXNlLnMubGNrX2VuYSA9IDE7CisJY3ZteF93cml0ZV9jc3IoQ1ZNWF9MMkNfTENLQkFTRSwgbGNrYmFzZS51NjQpOworCWN2bXhfcmVhZF9jc3IoQ1ZNWF9MMkNfTENLQkFTRSk7CS8qIE1ha2Ugc3VyZSBpdCBnZXRzIHRoZXJlICovCisKKwlmYXVsdF9pbihhZGRyLCBDVk1YX0NBQ0hFX0xJTkVfU0laRSk7CisKKwlsY2tiYXNlLnMubGNrX2VuYSA9IDA7CisJY3ZteF93cml0ZV9jc3IoQ1ZNWF9MMkNfTENLQkFTRSwgbGNrYmFzZS51NjQpOworCWN2bXhfcmVhZF9jc3IoQ1ZNWF9MMkNfTENLQkFTRSk7CS8qIE1ha2Ugc3VyZSBpdCBnZXRzIHRoZXJlICovCisKKwkvKiBTdG9wIGJlaW5nIGRlYnVnIGNvcmUgKi8KKwljdm14X3dyaXRlX2NzcihDVk1YX0wyQ19EQkcsIDApOworCWN2bXhfcmVhZF9jc3IoQ1ZNWF9MMkNfREJHKTsKKworCWwydF9lcnIudTY0ID0gY3ZteF9yZWFkX2NzcihDVk1YX0wyVF9FUlIpOworCWlmIChsMnRfZXJyLnMubGNrZXJyIHx8IGwydF9lcnIucy5sY2tlcnIyKQorCQlyZXR2YWwgPSAxOwkvKiBXZSB3ZXJlIHVuYWJsZSB0byBsb2NrIHRoZSBsaW5lICovCisKKwljdm14X3NwaW5sb2NrX3VubG9jaygmY3ZteF9sMmNfc3BpbmxvY2spOworCisJcmV0dXJuIHJldHZhbDsKK30KKworaW50IGN2bXhfbDJjX2xvY2tfbWVtX3JlZ2lvbih1aW50NjRfdCBzdGFydCwgdWludDY0X3QgbGVuKQoreworCWludCByZXR2YWwgPSAwOworCisJLyogUm91bmQgc3RhcnQvZW5kIHRvIGNhY2hlIGxpbmUgYm91bmRhcmllcyAqLworCWxlbiArPSBzdGFydCAmIENWTVhfQ0FDSEVfTElORV9NQVNLOworCXN0YXJ0ICY9IH5DVk1YX0NBQ0hFX0xJTkVfTUFTSzsKKwlsZW4gPSAobGVuICsgQ1ZNWF9DQUNIRV9MSU5FX01BU0spICYgfkNWTVhfQ0FDSEVfTElORV9NQVNLOworCisJd2hpbGUgKGxlbikgeworCQlyZXR2YWwgKz0gY3ZteF9sMmNfbG9ja19saW5lKHN0YXJ0KTsKKwkJc3RhcnQgKz0gQ1ZNWF9DQUNIRV9MSU5FX1NJWkU7CisJCWxlbiAtPSBDVk1YX0NBQ0hFX0xJTkVfU0laRTsKKwl9CisKKwlyZXR1cm4gcmV0dmFsOworfQorCit2b2lkIGN2bXhfbDJjX2ZsdXNoKHZvaWQpCit7CisJdWludDY0X3QgYXNzb2MsIHNldDsKKwl1aW50NjRfdCBuX2Fzc29jLCBuX3NldDsKKwl1bmlvbiBjdm14X2wyY19kYmcgbDJjZGJnOworCisJY3ZteF9zcGlubG9ja19sb2NrKCZjdm14X2wyY19zcGlubG9jayk7CisKKwlsMmNkYmcudTY0ID0gMDsKKwlpZiAoIU9DVEVPTl9JU19NT0RFTChPQ1RFT05fQ04zMFhYKSkKKwkJbDJjZGJnLnMucHBudW0gPSBjdm14X2dldF9jb3JlX251bSgpOworCWwyY2RiZy5zLmZpbnYgPSAxOworCW5fc2V0ID0gQ1ZNWF9MMl9TRVRTOworCW5fYXNzb2MgPSBsMl9zaXplX2hhbGYoKSA/IChDVk1YX0wyX0FTU09DIC8gMikgOiBDVk1YX0wyX0FTU09DOworCWZvciAoc2V0ID0gMDsgc2V0IDwgbl9zZXQ7IHNldCsrKSB7CisJCWZvciAoYXNzb2MgPSAwOyBhc3NvYyA8IG5fYXNzb2M7IGFzc29jKyspIHsKKwkJCWwyY2RiZy5zLnNldCA9IGFzc29jOworCQkJLyogRW50ZXIgZGVidWcgbW9kZSwgYW5kIG1ha2Ugc3VyZSBhbGwgb3RoZXIKKwkJCSAqKiB3cml0ZXMgY29tcGxldGUgYmVmb3JlIHdlIGVudGVyIGRlYnVnCisJCQkgKiogbW9kZSAqLworCQkJQ1ZNWF9TWU5DVzsKKwkJCWN2bXhfd3JpdGVfY3NyKENWTVhfTDJDX0RCRywgbDJjZGJnLnU2NCk7CisJCQljdm14X3JlYWRfY3NyKENWTVhfTDJDX0RCRyk7CisKKwkJCUNWTVhfUFJFUEFSRV9GT1JfU1RPUkUoQ1ZNWF9BRERfU0VHCisJCQkJCSAgICAgICAoQ1ZNWF9NSVBTX1NQQUNFX1hLUEhZUywKKwkJCQkJCXNldCAqIENWTVhfQ0FDSEVfTElORV9TSVpFKSwgMCk7CisJCQlDVk1YX1NZTkNXOwkvKiBQdXNoIFNURiBvdXQgdG8gTDIgKi8KKwkJCS8qIEV4aXQgZGVidWcgbW9kZSAqLworCQkJQ1ZNWF9TWU5DOworCQkJY3ZteF93cml0ZV9jc3IoQ1ZNWF9MMkNfREJHLCAwKTsKKwkJCWN2bXhfcmVhZF9jc3IoQ1ZNWF9MMkNfREJHKTsKKwkJfQorCX0KKworCWN2bXhfc3BpbmxvY2tfdW5sb2NrKCZjdm14X2wyY19zcGlubG9jayk7Cit9CisKK2ludCBjdm14X2wyY191bmxvY2tfbGluZSh1aW50NjRfdCBhZGRyZXNzKQoreworCWludCBhc3NvYzsKKwl1bmlvbiBjdm14X2wyY190YWcgdGFnOworCXVuaW9uIGN2bXhfbDJjX2RiZyBsMmNkYmc7CisJdWludDMyX3QgdGFnX2FkZHI7CisKKwl1aW50MzJfdCBpbmRleCA9IGN2bXhfbDJjX2FkZHJlc3NfdG9faW5kZXgoYWRkcmVzcyk7CisKKwljdm14X3NwaW5sb2NrX2xvY2soJmN2bXhfbDJjX3NwaW5sb2NrKTsKKwkvKiBDb21wdXRlIHBvcnRpb24gb2YgYWRkcmVzcyB0aGF0IGlzIHN0b3JlZCBpbiB0YWcgKi8KKwl0YWdfYWRkciA9CisJICAgICgoYWRkcmVzcyA+PiBDVk1YX0wyQ19UQUdfQUREUl9BTElBU19TSElGVCkgJgorCSAgICAgKCgxIDw8IENWTVhfTDJDX1RBR19BRERSX0FMSUFTX1NISUZUKSAtIDEpKTsKKwlmb3IgKGFzc29jID0gMDsgYXNzb2MgPCBDVk1YX0wyX0FTU09DOyBhc3NvYysrKSB7CisJCXRhZyA9IGN2bXhfZ2V0X2wyY190YWcoYXNzb2MsIGluZGV4KTsKKworCQlpZiAodGFnLnMuViAmJiAodGFnLnMuYWRkciA9PSB0YWdfYWRkcikpIHsKKwkJCWwyY2RiZy51NjQgPSAwOworCQkJbDJjZGJnLnMucHBudW0gPSBjdm14X2dldF9jb3JlX251bSgpOworCQkJbDJjZGJnLnMuc2V0ID0gYXNzb2M7CisJCQlsMmNkYmcucy5maW52ID0gMTsKKworCQkJQ1ZNWF9TWU5DOworCQkJLyogRW50ZXIgZGVidWcgbW9kZSAqLworCQkJY3ZteF93cml0ZV9jc3IoQ1ZNWF9MMkNfREJHLCBsMmNkYmcudTY0KTsKKwkJCWN2bXhfcmVhZF9jc3IoQ1ZNWF9MMkNfREJHKTsKKworCQkJQ1ZNWF9QUkVQQVJFX0ZPUl9TVE9SRShDVk1YX0FERF9TRUcKKwkJCQkJICAgICAgIChDVk1YX01JUFNfU1BBQ0VfWEtQSFlTLAorCQkJCQkJYWRkcmVzcyksIDApOworCQkJQ1ZNWF9TWU5DOworCQkJLyogRXhpdCBkZWJ1ZyBtb2RlICovCisJCQljdm14X3dyaXRlX2NzcihDVk1YX0wyQ19EQkcsIDApOworCQkJY3ZteF9yZWFkX2NzcihDVk1YX0wyQ19EQkcpOworCQkJY3ZteF9zcGlubG9ja191bmxvY2soJmN2bXhfbDJjX3NwaW5sb2NrKTsKKwkJCXJldHVybiB0YWcucy5MOworCQl9CisJfQorCWN2bXhfc3BpbmxvY2tfdW5sb2NrKCZjdm14X2wyY19zcGlubG9jayk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBjdm14X2wyY191bmxvY2tfbWVtX3JlZ2lvbih1aW50NjRfdCBzdGFydCwgdWludDY0X3QgbGVuKQoreworCWludCBudW1fdW5sb2NrZWQgPSAwOworCS8qIFJvdW5kIHN0YXJ0L2VuZCB0byBjYWNoZSBsaW5lIGJvdW5kYXJpZXMgKi8KKwlsZW4gKz0gc3RhcnQgJiBDVk1YX0NBQ0hFX0xJTkVfTUFTSzsKKwlzdGFydCAmPSB+Q1ZNWF9DQUNIRV9MSU5FX01BU0s7CisJbGVuID0gKGxlbiArIENWTVhfQ0FDSEVfTElORV9NQVNLKSAmIH5DVk1YX0NBQ0hFX0xJTkVfTUFTSzsKKwl3aGlsZSAobGVuID4gMCkgeworCQludW1fdW5sb2NrZWQgKz0gY3ZteF9sMmNfdW5sb2NrX2xpbmUoc3RhcnQpOworCQlzdGFydCArPSBDVk1YX0NBQ0hFX0xJTkVfU0laRTsKKwkJbGVuIC09IENWTVhfQ0FDSEVfTElORV9TSVpFOworCX0KKworCXJldHVybiBudW1fdW5sb2NrZWQ7Cit9CisKKy8qCisgKiBJbnRlcm5hbCBsMmMgdGFnIHR5cGVzLiAgVGhlc2UgYXJlIGNvbnZlcnRlZCB0byBhIGdlbmVyaWMgc3RydWN0dXJlCisgKiB0aGF0IGNhbiBiZSB1c2VkIG9uIGFsbCBjaGlwcy4KKyAqLwordW5pb24gX19jdm14X2wyY190YWcgeworCXVpbnQ2NF90IHU2NDsKKwlzdHJ1Y3QgY3ZteF9sMmNfdGFnX2NuNTB4eCB7CisJCXVpbnQ2NF90IHJlc2VydmVkOjQwOworCQl1aW50NjRfdCBWOjE7CS8qIExpbmUgdmFsaWQgKi8KKwkJdWludDY0X3QgRDoxOwkvKiBMaW5lIGRpcnR5ICovCisJCXVpbnQ2NF90IEw6MTsJLyogTGluZSBsb2NrZWQgKi8KKwkJdWludDY0X3QgVToxOwkvKiBVc2UsIExSVSBldmljdGlvbiAqLworCQl1aW50NjRfdCBhZGRyOjIwOwkvKiBQaHlzIG1lbSBhZGRyICgzMy4uMTQpICovCisJfSBjbjUweHg7CisJc3RydWN0IGN2bXhfbDJjX3RhZ19jbjMweHggeworCQl1aW50NjRfdCByZXNlcnZlZDo0MTsKKwkJdWludDY0X3QgVjoxOwkvKiBMaW5lIHZhbGlkICovCisJCXVpbnQ2NF90IEQ6MTsJLyogTGluZSBkaXJ0eSAqLworCQl1aW50NjRfdCBMOjE7CS8qIExpbmUgbG9ja2VkICovCisJCXVpbnQ2NF90IFU6MTsJLyogVXNlLCBMUlUgZXZpY3Rpb24gKi8KKwkJdWludDY0X3QgYWRkcjoxOTsJLyogUGh5cyBtZW0gYWRkciAoMzMuLjE1KSAqLworCX0gY24zMHh4OworCXN0cnVjdCBjdm14X2wyY190YWdfY24zMXh4IHsKKwkJdWludDY0X3QgcmVzZXJ2ZWQ6NDI7CisJCXVpbnQ2NF90IFY6MTsJLyogTGluZSB2YWxpZCAqLworCQl1aW50NjRfdCBEOjE7CS8qIExpbmUgZGlydHkgKi8KKwkJdWludDY0X3QgTDoxOwkvKiBMaW5lIGxvY2tlZCAqLworCQl1aW50NjRfdCBVOjE7CS8qIFVzZSwgTFJVIGV2aWN0aW9uICovCisJCXVpbnQ2NF90IGFkZHI6MTg7CS8qIFBoeXMgbWVtIGFkZHIgKDMzLi4xNikgKi8KKwl9IGNuMzF4eDsKKwlzdHJ1Y3QgY3ZteF9sMmNfdGFnX2NuMzh4eCB7CisJCXVpbnQ2NF90IHJlc2VydmVkOjQzOworCQl1aW50NjRfdCBWOjE7CS8qIExpbmUgdmFsaWQgKi8KKwkJdWludDY0X3QgRDoxOwkvKiBMaW5lIGRpcnR5ICovCisJCXVpbnQ2NF90IEw6MTsJLyogTGluZSBsb2NrZWQgKi8KKwkJdWludDY0X3QgVToxOwkvKiBVc2UsIExSVSBldmljdGlvbiAqLworCQl1aW50NjRfdCBhZGRyOjE3OwkvKiBQaHlzIG1lbSBhZGRyICgzMy4uMTcpICovCisJfSBjbjM4eHg7CisJc3RydWN0IGN2bXhfbDJjX3RhZ19jbjU4eHggeworCQl1aW50NjRfdCByZXNlcnZlZDo0NDsKKwkJdWludDY0X3QgVjoxOwkvKiBMaW5lIHZhbGlkICovCisJCXVpbnQ2NF90IEQ6MTsJLyogTGluZSBkaXJ0eSAqLworCQl1aW50NjRfdCBMOjE7CS8qIExpbmUgbG9ja2VkICovCisJCXVpbnQ2NF90IFU6MTsJLyogVXNlLCBMUlUgZXZpY3Rpb24gKi8KKwkJdWludDY0X3QgYWRkcjoxNjsJLyogUGh5cyBtZW0gYWRkciAoMzMuLjE4KSAqLworCX0gY241OHh4OworCXN0cnVjdCBjdm14X2wyY190YWdfY241OHh4IGNuNTZ4eDsJLyogMjA0OCBzZXRzICovCisJc3RydWN0IGN2bXhfbDJjX3RhZ19jbjMxeHggY241Mnh4OwkvKiA1MTIgc2V0cyAqLworfTsKKworLyoqCisgKiBASU5URVJOQUwKKyAqIEZ1bmN0aW9uIHRvIHJlYWQgYSBMMkMgdGFnLiAgVGhpcyBjb2RlIG1ha2UgdGhlIGN1cnJlbnQgY29yZQorICogdGhlICdkZWJ1ZyBjb3JlJyBmb3IgdGhlIEwyLiAgVGhpcyBjb2RlIG11c3Qgb25seSBiZSBleGVjdXRlZCBieQorICogMSBjb3JlIGF0IGEgdGltZS4KKyAqCisgKiBAYXNzb2M6ICBBc3NvY2lhdGlvbiAod2F5KSBvZiB0aGUgdGFnIHRvIGR1bXAKKyAqIEBpbmRleDogIEluZGV4IG9mIHRoZSBjYWNoZWxpbmUKKyAqCisgKiBSZXR1cm5zIFRoZSBPY3Rlb24gbW9kZWwgc3BlY2lmaWMgdGFnIHN0cnVjdHVyZS4gIFRoaXMgaXMKKyAqICAgICAgICAgdHJhbnNsYXRlZCBieSBhIHdyYXBwZXIgZnVuY3Rpb24gdG8gYSBnZW5lcmljIGZvcm0gdGhhdCBpcworICogICAgICAgICBlYXNpZXIgZm9yIGFwcGxpY2F0aW9ucyB0byB1c2UuCisgKi8KK3N0YXRpYyB1bmlvbiBfX2N2bXhfbDJjX3RhZyBfX3JlYWRfbDJfdGFnKHVpbnQ2NF90IGFzc29jLCB1aW50NjRfdCBpbmRleCkKK3sKKworCXVpbnQ2NF90IGRlYnVnX3RhZ19hZGRyID0gKCgoMVVMTCA8PCA2MykgfCAoaW5kZXggPDwgNykpICsgOTYpOworCXVpbnQ2NF90IGNvcmUgPSBjdm14X2dldF9jb3JlX251bSgpOworCXVuaW9uIF9fY3ZteF9sMmNfdGFnIHRhZ192YWw7CisJdWludDY0X3QgZGJnX2FkZHIgPSBDVk1YX0wyQ19EQkc7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXVuaW9uIGN2bXhfbDJjX2RiZyBkZWJ1Z192YWw7CisJZGVidWdfdmFsLnU2NCA9IDA7CisJLyoKKwkgKiBGb3IgbG93IGNvcmUgY291bnQgcGFydHMsIHRoZSBjb3JlIG51bWJlciBpcyBhbHdheXMgc21hbGwgZW5vdWdoCisJICogdG8gc3RheSBpbiB0aGUgY29ycmVjdCBmaWVsZCBhbmQgbm90IHNldCBhbnkgcmVzZXJ2ZWQgYml0cy4KKwkgKi8KKwlkZWJ1Z192YWwucy5wcG51bSA9IGNvcmU7CisJZGVidWdfdmFsLnMubDJ0ID0gMTsKKwlkZWJ1Z192YWwucy5zZXQgPSBhc3NvYzsKKwkvKgorCSAqIE1ha2Ugc3VyZSBjb3JlIGlzIHF1aWV0IChubyBwcmVmZXRjaGVzLCBldGMuKSBiZWZvcmUKKwkgKiBlbnRlcmluZyBkZWJ1ZyBtb2RlLgorCSAqLworCUNWTVhfU1lOQzsKKwkvKiBGbHVzaCBMMSB0byBtYWtlIHN1cmUgZGVidWcgbG9hZCBtaXNzZXMgTDEgKi8KKwlDVk1YX0RDQUNIRV9JTlZBTElEQVRFOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCisJLyoKKwkgKiBUaGUgZm9sbG93aW5nIG11c3QgYmUgZG9uZSBpbiBhc3NlbWJseSBhcyB3aGVuIGluIGRlYnVnCisJICogbW9kZSBhbGwgZGF0YSBsb2FkcyBmcm9tIEwyIHJldHVybiBzcGVjaWFsIGRlYnVnIGRhdGEsIG5vdAorCSAqIG5vcm1hbCBtZW1vcnkgY29udGVudHMuICBBbHNvLCBpbnRlcnJ1cHRzIG11c3QgYmUKKwkgKiBkaXNhYmxlZCwgc2luY2UgaWYgYW4gaW50ZXJydXB0IG9jY3VycyB3aGlsZSBpbiBkZWJ1ZyBtb2RlCisJICogdGhlIElTUiB3aWxsIGdldCBkZWJ1ZyBkYXRhIGZyb20gYWxsIGl0cyBtZW1vcnkgcmVhZHMKKwkgKiBpbnN0ZWFkIG9mIHRoZSBjb250ZW50cyBvZiBtZW1vcnkKKwkgKi8KKworCWFzbSB2b2xhdGlsZSAoIi5zZXQgcHVzaCAgICAgICAgICAgICAgXG4iCisJCSIgICAgICAgIC5zZXQgbWlwczY0ICAgICAgICAgICAgICBcbiIKKwkJIiAgICAgICAgLnNldCBub3Jlb3JkZXIgICAgICAgICAgIFxuIgorCQkvKiBFbnRlciBkZWJ1ZyBtb2RlLCB3YWl0IGZvciBzdG9yZSAqLworCQkiICAgICAgICBzZCAgICAlW2RiZ192YWxdLCAwKCVbZGJnX2FkZHJdKSAgXG4iCisJCSIgICAgICAgIGxkICAgICQwLCAwKCVbZGJnX2FkZHJdKSBcbiIKKwkJLyogUmVhZCBMMkMgdGFnIGRhdGEgKi8KKwkJIiAgICAgICAgbGQgICAgJVt0YWdfdmFsXSwgMCglW3RhZ19hZGRyXSkgXG4iCisJCS8qIEV4aXQgZGVidWcgbW9kZSwgd2FpdCBmb3Igc3RvcmUgKi8KKwkJIiAgICAgICAgc2QgICAgJDAsIDAoJVtkYmdfYWRkcl0pICBcbiIKKwkJIiAgICAgICAgbGQgICAgJDAsIDAoJVtkYmdfYWRkcl0pIFxuIgorCQkvKiBJbnZhbGlkYXRlIGRjYWNoZSB0byBkaXNjYXJkIGRlYnVnIGRhdGEgKi8KKwkJIiAgICAgICAgY2FjaGUgOSwgMCgkMCkgXG4iCisJCSIgICAgICAgIC5zZXQgcG9wIiA6CisJCVt0YWdfdmFsXSAiPXIiKHRhZ192YWwudTY0KSA6IFtkYmdfYWRkcl0gInIiKGRiZ19hZGRyKSwKKwkJW2RiZ192YWxdICJyIihkZWJ1Z192YWwudTY0KSwKKwkJW3RhZ19hZGRyXSAiciIoZGVidWdfdGFnX2FkZHIpIDogIm1lbW9yeSIpOworCisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCXJldHVybiB0YWdfdmFsOworCit9CisKK3VuaW9uIGN2bXhfbDJjX3RhZyBjdm14X2wyY19nZXRfdGFnKHVpbnQzMl90IGFzc29jaWF0aW9uLCB1aW50MzJfdCBpbmRleCkKK3sKKwl1bmlvbiBfX2N2bXhfbDJjX3RhZyB0bXBfdGFnOworCXVuaW9uIGN2bXhfbDJjX3RhZyB0YWc7CisJdGFnLnU2NCA9IDA7CisKKwlpZiAoKGludClhc3NvY2lhdGlvbiA+PSBjdm14X2wyY19nZXRfbnVtX2Fzc29jKCkpIHsKKwkJY3ZteF9kcHJpbnRmCisJCSAgICAoIkVSUk9SOiBjdm14X2dldF9sMmNfdGFnIGFzc29jaWF0aW9uIG91dCBvZiByYW5nZVxuIik7CisJCXJldHVybiB0YWc7CisJfQorCWlmICgoaW50KWluZGV4ID49IGN2bXhfbDJjX2dldF9udW1fc2V0cygpKSB7CisJCWN2bXhfZHByaW50ZigiRVJST1I6IGN2bXhfZ2V0X2wyY190YWcgIgorCQkJICAgICAiaW5kZXggb3V0IG9mIHJhbmdlIChhcmc6ICVkLCBtYXg6ICVkXG4iLAorCQkgICAgIGluZGV4LCBjdm14X2wyY19nZXRfbnVtX3NldHMoKSk7CisJCXJldHVybiB0YWc7CisJfQorCS8qIF9fcmVhZF9sMl90YWcgaXMgaW50ZW5kZWQgZm9yIGludGVybmFsIHVzZSBvbmx5ICovCisJdG1wX3RhZyA9IF9fcmVhZF9sMl90YWcoYXNzb2NpYXRpb24sIGluZGV4KTsKKworCS8qCisJICogQ29udmVydCBhbGwgdGFnIHN0cnVjdHVyZSB0eXBlcyB0byBnZW5lcmljIHZlcnNpb24sIGFzIGl0CisJICogY2FuIHJlcHJlc2VudCBhbGwgbW9kZWxzLgorCSAqLworCWlmIChPQ1RFT05fSVNfTU9ERUwoT0NURU9OX0NONThYWCkgfHwgT0NURU9OX0lTX01PREVMKE9DVEVPTl9DTjU2WFgpKSB7CisJCXRhZy5zLlYgPSB0bXBfdGFnLmNuNTh4eC5WOworCQl0YWcucy5EID0gdG1wX3RhZy5jbjU4eHguRDsKKwkJdGFnLnMuTCA9IHRtcF90YWcuY241OHh4Lkw7CisJCXRhZy5zLlUgPSB0bXBfdGFnLmNuNTh4eC5VOworCQl0YWcucy5hZGRyID0gdG1wX3RhZy5jbjU4eHguYWRkcjsKKwl9IGVsc2UgaWYgKE9DVEVPTl9JU19NT0RFTChPQ1RFT05fQ04zOFhYKSkgeworCQl0YWcucy5WID0gdG1wX3RhZy5jbjM4eHguVjsKKwkJdGFnLnMuRCA9IHRtcF90YWcuY24zOHh4LkQ7CisJCXRhZy5zLkwgPSB0bXBfdGFnLmNuMzh4eC5MOworCQl0YWcucy5VID0gdG1wX3RhZy5jbjM4eHguVTsKKwkJdGFnLnMuYWRkciA9IHRtcF90YWcuY24zOHh4LmFkZHI7CisJfSBlbHNlIGlmIChPQ1RFT05fSVNfTU9ERUwoT0NURU9OX0NOMzFYWCkKKwkJICAgfHwgT0NURU9OX0lTX01PREVMKE9DVEVPTl9DTjUyWFgpKSB7CisJCXRhZy5zLlYgPSB0bXBfdGFnLmNuMzF4eC5WOworCQl0YWcucy5EID0gdG1wX3RhZy5jbjMxeHguRDsKKwkJdGFnLnMuTCA9IHRtcF90YWcuY24zMXh4Lkw7CisJCXRhZy5zLlUgPSB0bXBfdGFnLmNuMzF4eC5VOworCQl0YWcucy5hZGRyID0gdG1wX3RhZy5jbjMxeHguYWRkcjsKKwl9IGVsc2UgaWYgKE9DVEVPTl9JU19NT0RFTChPQ1RFT05fQ04zMFhYKSkgeworCQl0YWcucy5WID0gdG1wX3RhZy5jbjMweHguVjsKKwkJdGFnLnMuRCA9IHRtcF90YWcuY24zMHh4LkQ7CisJCXRhZy5zLkwgPSB0bXBfdGFnLmNuMzB4eC5MOworCQl0YWcucy5VID0gdG1wX3RhZy5jbjMweHguVTsKKwkJdGFnLnMuYWRkciA9IHRtcF90YWcuY24zMHh4LmFkZHI7CisJfSBlbHNlIGlmIChPQ1RFT05fSVNfTU9ERUwoT0NURU9OX0NONTBYWCkpIHsKKwkJdGFnLnMuViA9IHRtcF90YWcuY241MHh4LlY7CisJCXRhZy5zLkQgPSB0bXBfdGFnLmNuNTB4eC5EOworCQl0YWcucy5MID0gdG1wX3RhZy5jbjUweHguTDsKKwkJdGFnLnMuVSA9IHRtcF90YWcuY241MHh4LlU7CisJCXRhZy5zLmFkZHIgPSB0bXBfdGFnLmNuNTB4eC5hZGRyOworCX0gZWxzZSB7CisJCWN2bXhfZHByaW50ZigiVW5zdXBwb3J0ZWQgT0NURU9OIE1vZGVsIGluICVzXG4iLCBfX2Z1bmNfXyk7CisJfQorCisJcmV0dXJuIHRhZzsKK30KKwordWludDMyX3QgY3ZteF9sMmNfYWRkcmVzc190b19pbmRleCh1aW50NjRfdCBhZGRyKQoreworCXVpbnQ2NF90IGlkeCA9IGFkZHIgPj4gQ1ZNWF9MMkNfSURYX0FERFJfU0hJRlQ7CisJdW5pb24gY3ZteF9sMmNfY2ZnIGwyY19jZmc7CisJbDJjX2NmZy51NjQgPSBjdm14X3JlYWRfY3NyKENWTVhfTDJDX0NGRyk7CisKKwlpZiAobDJjX2NmZy5zLmlkeGFsaWFzKSB7CisJCWlkeCBePQorCQkgICAgKChhZGRyICYgQ1ZNWF9MMkNfQUxJQVNfTUFTSykgPj4KKwkJICAgICBDVk1YX0wyQ19UQUdfQUREUl9BTElBU19TSElGVCk7CisJfQorCWlkeCAmPSBDVk1YX0wyQ19JRFhfTUFTSzsKKwlyZXR1cm4gaWR4OworfQorCitpbnQgY3ZteF9sMmNfZ2V0X2NhY2hlX3NpemVfYnl0ZXModm9pZCkKK3sKKwlyZXR1cm4gY3ZteF9sMmNfZ2V0X251bV9zZXRzKCkgKiBjdm14X2wyY19nZXRfbnVtX2Fzc29jKCkgKgorCQlDVk1YX0NBQ0hFX0xJTkVfU0laRTsKK30KKworLyoqCisgKiBSZXR1cm4gbG9nIGJhc2UgMiBvZiB0aGUgbnVtYmVyIG9mIHNldHMgaW4gdGhlIEwyIGNhY2hlCisgKiBSZXR1cm5zCisgKi8KK2ludCBjdm14X2wyY19nZXRfc2V0X2JpdHModm9pZCkKK3sKKwlpbnQgbDJfc2V0X2JpdHM7CisJaWYgKE9DVEVPTl9JU19NT0RFTChPQ1RFT05fQ041NlhYKSB8fCBPQ1RFT05fSVNfTU9ERUwoT0NURU9OX0NONThYWCkpCisJCWwyX3NldF9iaXRzID0gMTE7CS8qIDIwNDggc2V0cyAqLworCWVsc2UgaWYgKE9DVEVPTl9JU19NT0RFTChPQ1RFT05fQ04zOFhYKSkKKwkJbDJfc2V0X2JpdHMgPSAxMDsJLyogMTAyNCBzZXRzICovCisJZWxzZSBpZiAoT0NURU9OX0lTX01PREVMKE9DVEVPTl9DTjMxWFgpCisJCSB8fCBPQ1RFT05fSVNfTU9ERUwoT0NURU9OX0NONTJYWCkpCisJCWwyX3NldF9iaXRzID0gOTsJLyogNTEyIHNldHMgKi8KKwllbHNlIGlmIChPQ1RFT05fSVNfTU9ERUwoT0NURU9OX0NOMzBYWCkpCisJCWwyX3NldF9iaXRzID0gODsJLyogMjU2IHNldHMgKi8KKwllbHNlIGlmIChPQ1RFT05fSVNfTU9ERUwoT0NURU9OX0NONTBYWCkpCisJCWwyX3NldF9iaXRzID0gNzsJLyogMTI4IHNldHMgKi8KKwllbHNlIHsKKwkJY3ZteF9kcHJpbnRmKCJVbnN1cHBvcnRlZCBPQ1RFT04gTW9kZWwgaW4gJXNcbiIsIF9fZnVuY19fKTsKKwkJbDJfc2V0X2JpdHMgPSAxMTsJLyogMjA0OCBzZXRzICovCisJfQorCXJldHVybiBsMl9zZXRfYml0czsKKworfQorCisvKiBSZXR1cm4gdGhlIG51bWJlciBvZiBzZXRzIGluIHRoZSBMMiBDYWNoZSAqLworaW50IGN2bXhfbDJjX2dldF9udW1fc2V0cyh2b2lkKQoreworCXJldHVybiAxIDw8IGN2bXhfbDJjX2dldF9zZXRfYml0cygpOworfQorCisvKiBSZXR1cm4gdGhlIG51bWJlciBvZiBhc3NvY2lhdGlvbnMgaW4gdGhlIEwyIENhY2hlICovCitpbnQgY3ZteF9sMmNfZ2V0X251bV9hc3NvYyh2b2lkKQoreworCWludCBsMl9hc3NvYzsKKwlpZiAoT0NURU9OX0lTX01PREVMKE9DVEVPTl9DTjU2WFgpIHx8CisJICAgIE9DVEVPTl9JU19NT0RFTChPQ1RFT05fQ041MlhYKSB8fAorCSAgICBPQ1RFT05fSVNfTU9ERUwoT0NURU9OX0NONThYWCkgfHwKKwkgICAgT0NURU9OX0lTX01PREVMKE9DVEVPTl9DTjUwWFgpIHx8IE9DVEVPTl9JU19NT0RFTChPQ1RFT05fQ04zOFhYKSkKKwkJbDJfYXNzb2MgPSA4OworCWVsc2UgaWYgKE9DVEVPTl9JU19NT0RFTChPQ1RFT05fQ04zMVhYKSB8fAorCQkgT0NURU9OX0lTX01PREVMKE9DVEVPTl9DTjMwWFgpKQorCQlsMl9hc3NvYyA9IDQ7CisJZWxzZSB7CisJCWN2bXhfZHByaW50ZigiVW5zdXBwb3J0ZWQgT0NURU9OIE1vZGVsIGluICVzXG4iLCBfX2Z1bmNfXyk7CisJCWwyX2Fzc29jID0gODsKKwl9CisKKwkvKiBDaGVjayB0byBzZWUgaWYgcGFydCBvZiB0aGUgY2FjaGUgaXMgZGlzYWJsZWQgKi8KKwlpZiAoY3ZteF9mdXNlX3JlYWQoMjY1KSkKKwkJbDJfYXNzb2MgPSBsMl9hc3NvYyA+PiAyOworCWVsc2UgaWYgKGN2bXhfZnVzZV9yZWFkKDI2NCkpCisJCWwyX2Fzc29jID0gbDJfYXNzb2MgPj4gMTsKKworCXJldHVybiBsMl9hc3NvYzsKK30KKworLyoqCisgKiBGbHVzaCBhIGxpbmUgZnJvbSB0aGUgTDIgY2FjaGUKKyAqIFRoaXMgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGZyb20gb25lIGNvcmUgYXQgYSB0aW1lLCBhcyB0aGlzIHJvdXRpbmUKKyAqIHNldHMgdGhlIGNvcmUgdG8gdGhlICdkZWJ1ZycgY29yZSBpbiBvcmRlciB0byBmbHVzaCB0aGUgbGluZS4KKyAqCisgKiBAYXNzb2M6ICBBc3NvY2lhdGlvbiAob3Igd2F5KSB0byBmbHVzaAorICogQGluZGV4OiAgSW5kZXggdG8gZmx1c2gKKyAqLwordm9pZCBjdm14X2wyY19mbHVzaF9saW5lKHVpbnQzMl90IGFzc29jLCB1aW50MzJfdCBpbmRleCkKK3sKKwl1bmlvbiBjdm14X2wyY19kYmcgbDJjZGJnOworCisJbDJjZGJnLnU2NCA9IDA7CisJbDJjZGJnLnMucHBudW0gPSBjdm14X2dldF9jb3JlX251bSgpOworCWwyY2RiZy5zLmZpbnYgPSAxOworCisJbDJjZGJnLnMuc2V0ID0gYXNzb2M7CisJLyoKKwkgKiBFbnRlciBkZWJ1ZyBtb2RlLCBhbmQgbWFrZSBzdXJlIGFsbCBvdGhlciB3cml0ZXMgY29tcGxldGUKKwkgKiBiZWZvcmUgd2UgZW50ZXIgZGVidWcgbW9kZS4KKwkgKi8KKwlhc20gdm9sYXRpbGUgKCJzeW5jIiA6IDogOiAibWVtb3J5Iik7CisJY3ZteF93cml0ZV9jc3IoQ1ZNWF9MMkNfREJHLCBsMmNkYmcudTY0KTsKKwljdm14X3JlYWRfY3NyKENWTVhfTDJDX0RCRyk7CisKKwlDVk1YX1BSRVBBUkVfRk9SX1NUT1JFKCgoMVVMTCA8PCA2MykgKyAoaW5kZXgpICogMTI4KSwgMCk7CisJLyogRXhpdCBkZWJ1ZyBtb2RlICovCisJYXNtIHZvbGF0aWxlICgic3luYyIgOiA6IDogIm1lbW9yeSIpOworCWN2bXhfd3JpdGVfY3NyKENWTVhfTDJDX0RCRywgMCk7CisJY3ZteF9yZWFkX2NzcihDVk1YX0wyQ19EQkcpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2Nhdml1bS1vY3Rlb24vZXhlY3V0aXZlL2N2bXgtc3lzaW5mby5jIGIvYXJjaC9taXBzL2Nhdml1bS1vY3Rlb24vZXhlY3V0aXZlL2N2bXgtc3lzaW5mby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4MTIzNzA3Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9taXBzL2Nhdml1bS1vY3Rlb24vZXhlY3V0aXZlL2N2bXgtc3lzaW5mby5jCkBAIC0wLDAgKzEsMTE2IEBACisvKioqKioqKioqKioqKioqKioqKioqKipsaWNlbnNlIHN0YXJ0KioqKioqKioqKioqKioqCisgKiBBdXRob3I6IENhdml1bSBOZXR3b3JrcworICoKKyAqIENvbnRhY3Q6IHN1cHBvcnRAY2F2aXVtbmV0d29ya3MuY29tCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgT0NURU9OIFNESworICoKKyAqIENvcHlyaWdodCAoYykgMjAwMy0yMDA4IENhdml1bSBOZXR3b3JrcworICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBWZXJzaW9uIDIsIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBBUy1JUyBhbmQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eQorICogb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBUSVRMRSwgb3IKKyAqIE5PTklORlJJTkdFTUVOVC4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUKKyAqIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBmaWxlOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqIG9yIHZpc2l0IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uCisgKgorICogVGhpcyBmaWxlIG1heSBhbHNvIGJlIGF2YWlsYWJsZSB1bmRlciBhIGRpZmZlcmVudCBsaWNlbnNlIGZyb20gQ2F2aXVtLgorICogQ29udGFjdCBDYXZpdW0gTmV0d29ya3MgZm9yIG1vcmUgaW5mb3JtYXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKmxpY2Vuc2UgZW5kKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBUaGlzIG1vZHVsZSBwcm92aWRlcyBzeXN0ZW0vYm9hcmQvYXBwbGljYXRpb24gaW5mb3JtYXRpb24gb2J0YWluZWQKKyAqIGJ5IHRoZSBib290bG9hZGVyLgorICovCisKKyNpbmNsdWRlIDxhc20vb2N0ZW9uL2N2bXguaD4KKyNpbmNsdWRlIDxhc20vb2N0ZW9uL2N2bXgtc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxhc20vb2N0ZW9uL2N2bXgtc3lzaW5mby5oPgorCisvKioKKyAqIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgdGhlIHByaXZhdGUgc3RhdGUgbWFpbnRhaW5lZCBieSBzeXNpbmZvIG1vZHVsZS4KKyAqCisgKi8KK3N0YXRpYyBzdHJ1Y3QgeworCXN0cnVjdCBjdm14X3N5c2luZm8gc3lzaW5mbzsJICAgLyogc3lzdGVtIGluZm9ybWF0aW9uICovCisJY3ZteF9zcGlubG9ja190IGxvY2s7CSAgIC8qIG11dGV4IHNwaW5sb2NrICovCisKK30gc3RhdGUgPSB7CisJLmxvY2sgPSBDVk1YX1NQSU5MT0NLX1VOTE9DS0VEX0lOSVRJQUxJWkVSCit9OworCisKKy8qCisgKiBHbG9iYWwgdmFyaWFibGVzIHRoYXQgZGVmaW5lIHRoZSBtaW4vbWF4IG9mIHRoZSBtZW1vcnkgcmVnaW9uIHNldAorICogdXAgZm9yIDMyIGJpdCB1c2Vyc3BhY2UgYWNjZXNzLgorICovCit1aW50NjRfdCBsaW51eF9tZW0zMl9taW47Cit1aW50NjRfdCBsaW51eF9tZW0zMl9tYXg7Cit1aW50NjRfdCBsaW51eF9tZW0zMl93aXJlZDsKK3VpbnQ2NF90IGxpbnV4X21lbTMyX29mZnNldDsKKworLyoqCisgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGFwcGxpY2F0aW9uIGluZm9ybWF0aW9uIGFzIG9idGFpbmVkCisgKiBieSB0aGUgYm9vdGxvYWRlci4gIFRoaXMgcHJvdmlkZXMgdGhlIGNvcmUgbWFzayBvZiB0aGUgY29yZXMKKyAqIHJ1bm5pbmcgdGhlIHNhbWUgYXBwbGljYXRpb24gaW1hZ2UsIGFzIHdlbGwgYXMgdGhlIHBoeXNpY2FsCisgKiBtZW1vcnkgcmVnaW9ucyBhdmFpbGFibGUgdG8gdGhlIGNvcmUuCisgKgorICogUmV0dXJucyAgUG9pbnRlciB0byB0aGUgYm9vdCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUKKyAqCisgKi8KK3N0cnVjdCBjdm14X3N5c2luZm8gKmN2bXhfc3lzaW5mb19nZXQodm9pZCkKK3sKKwlyZXR1cm4gJihzdGF0ZS5zeXNpbmZvKTsKK30KKworLyoqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgaW4gbm9uLXNpbXBsZSBleGVjdXRpdmUgZW52aXJvbm1lbnRzIChzdWNoIGFzCisgKiBMaW51eCBrZXJuZWwsIHUtYm9vdCwgZXRjLikgIHRvIGNvbmZpZ3VyZSB0aGUgbWluaW1hbCBmaWVsZHMgdGhhdAorICogYXJlIHJlcXVpcmVkIHRvIHVzZSBzaW1wbGUgZXhlY3V0aXZlIGZpbGVzIGRpcmVjdGx5LgorICoKKyAqIExvY2tpbmcgKGlmIHJlcXVpcmVkKSBtdXN0IGJlIGhhbmRsZWQgb3V0c2lkZSBvZiB0aGlzCisgKiBmdW5jdGlvbgorICoKKyAqIEBwaHlfbWVtX2Rlc2NfcHRyOgorICogICAgICAgICAgICAgICAgICAgUG9pbnRlciB0byBnbG9iYWwgcGh5c2ljYWwgbWVtb3J5IGRlc2NyaXB0b3IKKyAqICAgICAgICAgICAgICAgICAgIChib290bWVtIGRlc2NyaXB0b3IpIEBib2FyZF90eXBlOiBPY3Rlb24gYm9hcmQKKyAqICAgICAgICAgICAgICAgICAgIHR5cGUgZW51bWVyYXRpb24KKyAqCisgKiBAYm9hcmRfcmV2X21ham9yOgorICogICAgICAgICAgICAgICAgICAgQm9hcmQgbWFqb3IgcmV2aXNpb24KKyAqIEBib2FyZF9yZXZfbWlub3I6CisgKiAgICAgICAgICAgICAgICAgICBCb2FyZCBtaW5vciByZXZpc2lvbgorICogQGNwdV9jbG9ja19oejoKKyAqICAgICAgICAgICAgICAgICAgIENQVSBjbG9jayBmcmVxZW5jeSBpbiBoZXJ0egorICoKKyAqIFJldHVybnMgMDogRmFpbHVyZQorICogICAgICAgICAxOiBzdWNjZXNzCisgKi8KK2ludCBjdm14X3N5c2luZm9fbWluaW1hbF9pbml0aWFsaXplKHZvaWQgKnBoeV9tZW1fZGVzY19wdHIsCisJCQkJICAgIHVpbnQxNl90IGJvYXJkX3R5cGUsCisJCQkJICAgIHVpbnQ4X3QgYm9hcmRfcmV2X21ham9yLAorCQkJCSAgICB1aW50OF90IGJvYXJkX3Jldl9taW5vciwKKwkJCQkgICAgdWludDMyX3QgY3B1X2Nsb2NrX2h6KQoreworCisJLyogVGhlIHN5c2luZm8gc3RydWN0dXJlIHdhcyBhbHJlYWR5IGluaXRpYWxpemVkICovCisJaWYgKHN0YXRlLnN5c2luZm8uYm9hcmRfdHlwZSkKKwkJcmV0dXJuIDA7CisKKwltZW1zZXQoJihzdGF0ZS5zeXNpbmZvKSwgMHgwLCBzaXplb2Yoc3RhdGUuc3lzaW5mbykpOworCXN0YXRlLnN5c2luZm8ucGh5X21lbV9kZXNjX3B0ciA9IHBoeV9tZW1fZGVzY19wdHI7CisJc3RhdGUuc3lzaW5mby5ib2FyZF90eXBlID0gYm9hcmRfdHlwZTsKKwlzdGF0ZS5zeXNpbmZvLmJvYXJkX3Jldl9tYWpvciA9IGJvYXJkX3Jldl9tYWpvcjsKKwlzdGF0ZS5zeXNpbmZvLmJvYXJkX3Jldl9taW5vciA9IGJvYXJkX3Jldl9taW5vcjsKKwlzdGF0ZS5zeXNpbmZvLmNwdV9jbG9ja19oeiA9IGNwdV9jbG9ja19oejsKKworCXJldHVybiAxOworfQorCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvY2F2aXVtLW9jdGVvbi9leGVjdXRpdmUvb2N0ZW9uLW1vZGVsLmMgYi9hcmNoL21pcHMvY2F2aXVtLW9jdGVvbi9leGVjdXRpdmUvb2N0ZW9uLW1vZGVsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWFmYzM3OQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbWlwcy9jYXZpdW0tb2N0ZW9uL2V4ZWN1dGl2ZS9vY3Rlb24tbW9kZWwuYwpAQCAtMCwwICsxLDM1OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqbGljZW5zZSBzdGFydCoqKioqKioqKioqKioqKgorICogQXV0aG9yOiBDYXZpdW0gTmV0d29ya3MKKyAqCisgKiBDb250YWN0OiBzdXBwb3J0QGNhdml1bW5ldHdvcmtzLmNvbQorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIE9DVEVPTiBTREsKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwOCBDYXZpdW0gTmV0d29ya3MKKyAqCisgKiBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgVmVyc2lvbiAyLCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogQVMtSVMgYW5kIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkKKyAqIG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgVElUTEUsIG9yCisgKiBOT05JTkZSSU5HRU1FTlQuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlCisgKiBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgZmlsZTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKiBvciB2aXNpdCBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLgorICoKKyAqIFRoaXMgZmlsZSBtYXkgYWxzbyBiZSBhdmFpbGFibGUgdW5kZXIgYSBkaWZmZXJlbnQgbGljZW5zZSBmcm9tIENhdml1bS4KKyAqIENvbnRhY3QgQ2F2aXVtIE5ldHdvcmtzIGZvciBtb3JlIGluZm9ybWF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKipsaWNlbnNlIGVuZCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogRmlsZSBkZWZpbmluZyBmdW5jdGlvbnMgZm9yIHdvcmtpbmcgd2l0aCBkaWZmZXJlbnQgT2N0ZW9uCisgKiBtb2RlbHMuCisgKi8KKyNpbmNsdWRlIDxhc20vb2N0ZW9uL29jdGVvbi5oPgorCisvKioKKyAqIEdpdmVuIHRoZSBjaGlwIHByb2Nlc3NvciBJRCBmcm9tIENPUDAsIHRoaXMgZnVuY3Rpb24gcmV0dXJucyBhCisgKiBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBjaGlwIG1vZGVsIG51bWJlci4gVGhlIHN0cmluZyBpcyBvZiB0aGUKKyAqIGZvcm0gQ05YWFhYcFguWC1GUkVRLVNVRkZJWC4KKyAqIC0gWFhYWCA9IFRoZSBjaGlwIG1vZGVsIG51bWJlcgorICogLSBYLlggPSBDaGlwIHBhc3MgbnVtYmVyCisgKiAtIEZSRVEgPSBDdXJyZW50IGZyZXF1ZW5jeSBpbiBNaHoKKyAqIC0gU1VGRklYID0gTlNQLCBFWFAsIFNDUCwgU1NQLCBvciBDUAorICoKKyAqIEBjaGlwX2lkOiBDaGlwIElECisgKgorICogUmV0dXJucyBNb2RlbCBzdHJpbmcKKyAqLworY29uc3QgY2hhciAqb2N0ZW9uX21vZGVsX2dldF9zdHJpbmcodWludDMyX3QgY2hpcF9pZCkKK3sKKwlzdGF0aWMgY2hhciBidWZmZXJbMzJdOworCXJldHVybiBvY3Rlb25fbW9kZWxfZ2V0X3N0cmluZ19idWZmZXIoY2hpcF9pZCwgYnVmZmVyKTsKK30KKworLyoKKyAqIFZlcnNpb24gb2Ygb2N0ZW9uX21vZGVsX2dldF9zdHJpbmcoKSB0aGF0IHRha2VzIGJ1ZmZlciBhcyBhcmd1bWVudCwKKyAqIGFzIHJ1bm5pbmcgZWFybHkgaW4gdS1ib290IHN0YXRpYy9nbG9iYWwgdmFyaWFibGVzIGRvbid0IHdvcmsgd2hlbgorICogcnVubmluZyBmcm9tIGZsYXNoLgorICovCitjb25zdCBjaGFyICpvY3Rlb25fbW9kZWxfZ2V0X3N0cmluZ19idWZmZXIodWludDMyX3QgY2hpcF9pZCwgY2hhciAqYnVmZmVyKQoreworCWNvbnN0IGNoYXIgKmZhbWlseTsKKwljb25zdCBjaGFyICpjb3JlX21vZGVsOworCWNoYXIgcGFzc1s0XTsKKwlpbnQgY2xvY2tfbWh6OworCWNvbnN0IGNoYXIgKnN1ZmZpeDsKKwl1bmlvbiBjdm14X2wyZF9mdXMzIGZ1czM7CisJaW50IG51bV9jb3JlczsKKwl1bmlvbiBjdm14X21pb19mdXNfZGF0MiBmdXNfZGF0MjsKKwl1bmlvbiBjdm14X21pb19mdXNfZGF0MyBmdXNfZGF0MzsKKwljaGFyIGZ1c2VfbW9kZWxbMTBdOworCXVpbnQzMl90IGZ1c2VfZGF0YSA9IDA7CisKKwlmdXMzLnU2NCA9IGN2bXhfcmVhZF9jc3IoQ1ZNWF9MMkRfRlVTMyk7CisJZnVzX2RhdDIudTY0ID0gY3ZteF9yZWFkX2NzcihDVk1YX01JT19GVVNfREFUMik7CisJZnVzX2RhdDMudTY0ID0gY3ZteF9yZWFkX2NzcihDVk1YX01JT19GVVNfREFUMyk7CisKKwludW1fY29yZXMgPSBjdm14X29jdGVvbl9udW1fY29yZXMoKTsKKworCS8qIE1ha2Ugc3VyZSB0aGUgbm9uIGV4aXN0YW50IGRldmljZXMgbG9vayBkaXNhYmxlZCAqLworCXN3aXRjaCAoKGNoaXBfaWQgPj4gOCkgJiAweGZmKSB7CisJY2FzZSA2OgkJLyogQ041MFhYICovCisJY2FzZSAyOgkJLyogQ04zMFhYICovCisJCWZ1c19kYXQzLnMubm9kZmFfZHRlID0gMTsKKwkJZnVzX2RhdDMucy5ub3ppcCA9IDE7CisJCWJyZWFrOworCWNhc2UgNDoJCS8qIENONTdYWCBvciBDTjU2WFggKi8KKwkJZnVzX2RhdDMucy5ub2RmYV9kdGUgPSAxOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwkvKiBNYWtlIGEgZ3Vlc3MgYXQgdGhlIHN1ZmZpeCAqLworCS8qIE5TUCA9IGV2ZXJ5dGhpbmcgKi8KKwkvKiBFWFAgPSBObyBjcnlwdG8gKi8KKwkvKiBTQ1AgPSBObyBERkEsIE5vIHppcCAqLworCS8qIENQID0gTm8gREZBLCBObyBjcnlwdG8sIE5vIHppcCAqLworCWlmIChmdXNfZGF0My5zLm5vZGZhX2R0ZSkgeworCQlpZiAoZnVzX2RhdDIucy5ub2NyeXB0bykKKwkJCXN1ZmZpeCA9ICJDUCI7CisJCWVsc2UKKwkJCXN1ZmZpeCA9ICJTQ1AiOworCX0gZWxzZSBpZiAoZnVzX2RhdDIucy5ub2NyeXB0bykKKwkJc3VmZml4ID0gIkVYUCI7CisJZWxzZQorCQlzdWZmaXggPSAiTlNQIjsKKworCS8qCisJICogQXNzdW1lIHBhc3MgbnVtYmVyIGlzIGVuY29kZWQgdXNpbmcgPDU6Mz48MjowPi4gRXhjZXB0aW9ucworCSAqIHdpbGwgYmUgZml4ZWQgbGF0ZXIuCisJICovCisJc3ByaW50ZihwYXNzLCAiJXUuJXUiLCAoKGNoaXBfaWQgPj4gMykgJiA3KSArIDEsIGNoaXBfaWQgJiA3KTsKKworCS8qCisJICogVXNlIHRoZSBudW1iZXIgb2YgY29yZXMgdG8gZGV0ZXJtaW5lIHRoZSBsYXN0IDIgZGlnaXRzIG9mCisJICogdGhlIG1vZGVsIG51bWJlci4gVGhlcmUgYXJlIHNvbWUgZXhjZXB0aW9ucyB0aGF0IGFyZSBmaXhlZAorCSAqIGxhdGVyLgorCSAqLworCXN3aXRjaCAobnVtX2NvcmVzKSB7CisJY2FzZSAxNjoKKwkJY29yZV9tb2RlbCA9ICI2MCI7CisJCWJyZWFrOworCWNhc2UgMTU6CisJCWNvcmVfbW9kZWwgPSAiNTgiOworCQlicmVhazsKKwljYXNlIDE0OgorCQljb3JlX21vZGVsID0gIjU1IjsKKwkJYnJlYWs7CisJY2FzZSAxMzoKKwkJY29yZV9tb2RlbCA9ICI1MiI7CisJCWJyZWFrOworCWNhc2UgMTI6CisJCWNvcmVfbW9kZWwgPSAiNTAiOworCQlicmVhazsKKwljYXNlIDExOgorCQljb3JlX21vZGVsID0gIjQ4IjsKKwkJYnJlYWs7CisJY2FzZSAxMDoKKwkJY29yZV9tb2RlbCA9ICI0NSI7CisJCWJyZWFrOworCWNhc2UgOToKKwkJY29yZV9tb2RlbCA9ICI0MiI7CisJCWJyZWFrOworCWNhc2UgODoKKwkJY29yZV9tb2RlbCA9ICI0MCI7CisJCWJyZWFrOworCWNhc2UgNzoKKwkJY29yZV9tb2RlbCA9ICIzOCI7CisJCWJyZWFrOworCWNhc2UgNjoKKwkJY29yZV9tb2RlbCA9ICIzNCI7CisJCWJyZWFrOworCWNhc2UgNToKKwkJY29yZV9tb2RlbCA9ICIzMiI7CisJCWJyZWFrOworCWNhc2UgNDoKKwkJY29yZV9tb2RlbCA9ICIzMCI7CisJCWJyZWFrOworCWNhc2UgMzoKKwkJY29yZV9tb2RlbCA9ICIyNSI7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJY29yZV9tb2RlbCA9ICIyMCI7CisJCWJyZWFrOworCWNhc2UgMToKKwkJY29yZV9tb2RlbCA9ICIxMCI7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWNvcmVfbW9kZWwgPSAiWFgiOworCQlicmVhazsKKwl9CisKKwkvKiBOb3cgZmlndXJlIG91dCB0aGUgZmFtaWx5LCB0aGUgZmlyc3QgdHdvIGRpZ2l0cyAqLworCXN3aXRjaCAoKGNoaXBfaWQgPj4gOCkgJiAweGZmKSB7CisJY2FzZSAwOgkJLyogQ04zOFhYLCBDTjM3WFggb3IgQ04zNlhYICovCisJCWlmIChmdXMzLmNuMzh4eC5jcmlwXzUxMmspIHsKKwkJCS8qCisJCQkgKiBGb3Igc29tZSB1bmtub3duIHJlYXNvbiwgdGhlIDE2IGNvcmUgb25lIGlzCisJCQkgKiBjYWxsZWQgMzcgaW5zdGVhZCBvZiAzNi4KKwkJCSAqLworCQkJaWYgKG51bV9jb3JlcyA+PSAxNikKKwkJCQlmYW1pbHkgPSAiMzciOworCQkJZWxzZQorCQkJCWZhbWlseSA9ICIzNiI7CisJCX0gZWxzZQorCQkJZmFtaWx5ID0gIjM4IjsKKwkJLyoKKwkJICogVGhpcyBzZXJpZXMgb2YgY2hpcHMgZGlkbid0IGZvbGxvdyB0aGUgc3RhbmRhcmQKKwkJICogcGFzcyBudW1iZXJpbmcuCisJCSAqLworCQlzd2l0Y2ggKGNoaXBfaWQgJiAweGYpIHsKKwkJY2FzZSAwOgorCQkJc3RyY3B5KHBhc3MsICIxLlgiKTsKKwkJCWJyZWFrOworCQljYXNlIDE6CisJCQlzdHJjcHkocGFzcywgIjIuWCIpOworCQkJYnJlYWs7CisJCWNhc2UgMzoKKwkJCXN0cmNweShwYXNzLCAiMy5YIik7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXN0cmNweShwYXNzLCAiWC5YIik7CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKwljYXNlIDE6CQkvKiBDTjMxWFggb3IgQ04zMDIwICovCisJCWlmICgoY2hpcF9pZCAmIDB4MTApIHx8IGZ1czMuY24zMXh4LmNyaXBfMTI4aykKKwkJCWZhbWlseSA9ICIzMCI7CisJCWVsc2UKKwkJCWZhbWlseSA9ICIzMSI7CisJCS8qCisJCSAqIFRoaXMgc2VyaWVzIG9mIGNoaXBzIGRpZG4ndCBmb2xsb3cgdGhlIHN0YW5kYXJkCisJCSAqIHBhc3MgbnVtYmVyaW5nLgorCQkgKi8KKwkJc3dpdGNoIChjaGlwX2lkICYgMHhmKSB7CisJCWNhc2UgMDoKKwkJCXN0cmNweShwYXNzLCAiMS4wIik7CisJCQlicmVhazsKKwkJY2FzZSAyOgorCQkJc3RyY3B5KHBhc3MsICIxLjEiKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJc3RyY3B5KHBhc3MsICJYLlgiKTsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCWNhc2UgMjoJCS8qIENOMzAxMCBvciBDTjMwMDUgKi8KKwkJZmFtaWx5ID0gIjMwIjsKKwkJLyogQSBjaGlwIHdpdGggaGFsZiBjYWNoZSBpcyBhbiAwNSAqLworCQlpZiAoZnVzMy5jbjMweHguY3JpcF82NGspCisJCQljb3JlX21vZGVsID0gIjA1IjsKKwkJLyoKKwkJICogVGhpcyBzZXJpZXMgb2YgY2hpcHMgZGlkbid0IGZvbGxvdyB0aGUgc3RhbmRhcmQKKwkJICogcGFzcyBudW1iZXJpbmcuCisJCSAqLworCQlzd2l0Y2ggKGNoaXBfaWQgJiAweGYpIHsKKwkJY2FzZSAwOgorCQkJc3RyY3B5KHBhc3MsICIxLjAiKTsKKwkJCWJyZWFrOworCQljYXNlIDI6CisJCQlzdHJjcHkocGFzcywgIjEuMSIpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlzdHJjcHkocGFzcywgIlguWCIpOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisJY2FzZSAzOgkJLyogQ041OFhYICovCisJCWZhbWlseSA9ICI1OCI7CisJCS8qIFNwZWNpYWwgY2FzZS4gNCBjb3JlLCBubyBjcnlwdG8gKi8KKwkJaWYgKChudW1fY29yZXMgPT0gNCkgJiYgZnVzX2RhdDIuY24zOHh4Lm5vY3J5cHRvKQorCQkJY29yZV9tb2RlbCA9ICIyOSI7CisKKwkJLyogUGFzcyAxIHVzZXMgZGlmZmVyZW50IGVuY29kaW5ncyBmb3IgcGFzcyBudW1iZXJzICovCisJCWlmICgoY2hpcF9pZCAmIDB4RkYpIDwgMHg4KSB7CisJCQlzd2l0Y2ggKGNoaXBfaWQgJiAweDMpIHsKKwkJCWNhc2UgMDoKKwkJCQlzdHJjcHkocGFzcywgIjEuMCIpOworCQkJCWJyZWFrOworCQkJY2FzZSAxOgorCQkJCXN0cmNweShwYXNzLCAiMS4xIik7CisJCQkJYnJlYWs7CisJCQljYXNlIDM6CisJCQkJc3RyY3B5KHBhc3MsICIxLjIiKTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJc3RyY3B5KHBhc3MsICIxLlgiKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlicmVhazsKKwljYXNlIDQ6CQkvKiBDTjU3WFgsIENONTZYWCwgQ041NVhYLCBDTjU0WFggKi8KKwkJaWYgKGZ1c19kYXQyLmNuNTZ4eC5yYWlkX2VuKSB7CisJCQlpZiAoZnVzMy5jbjU2eHguY3JpcF8xMDI0aykKKwkJCQlmYW1pbHkgPSAiNTUiOworCQkJZWxzZQorCQkJCWZhbWlseSA9ICI1NyI7CisJCQlpZiAoZnVzX2RhdDIuY241Nnh4Lm5vY3J5cHRvKQorCQkJCXN1ZmZpeCA9ICJTUCI7CisJCQllbHNlCisJCQkJc3VmZml4ID0gIlNTUCI7CisJCX0gZWxzZSB7CisJCQlpZiAoZnVzX2RhdDIuY241Nnh4Lm5vY3J5cHRvKQorCQkJCXN1ZmZpeCA9ICJDUCI7CisJCQllbHNlIHsKKwkJCQlzdWZmaXggPSAiTlNQIjsKKwkJCQlpZiAoZnVzX2RhdDMucy5ub3ppcCkKKwkJCQkJc3VmZml4ID0gIlNDUCI7CisJCQl9CisJCQlpZiAoZnVzMy5jbjU2eHguY3JpcF8xMDI0aykKKwkJCQlmYW1pbHkgPSAiNTQiOworCQkJZWxzZQorCQkJCWZhbWlseSA9ICI1NiI7CisJCX0KKwkJYnJlYWs7CisJY2FzZSA2OgkJLyogQ041MFhYICovCisJCWZhbWlseSA9ICI1MCI7CisJCWJyZWFrOworCWNhc2UgNzoJCS8qIENONTJYWCAqLworCQlpZiAoZnVzMy5jbjUyeHguY3JpcF8yNTZrKQorCQkJZmFtaWx5ID0gIjUxIjsKKwkJZWxzZQorCQkJZmFtaWx5ID0gIjUyIjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZmFtaWx5ID0gIlhYIjsKKwkJY29yZV9tb2RlbCA9ICJYWCI7CisJCXN0cmNweShwYXNzLCAiWC5YIik7CisJCXN1ZmZpeCA9ICJYWFgiOworCQlicmVhazsKKwl9CisKKwljbG9ja19taHogPSBvY3Rlb25fZ2V0X2Nsb2NrX3JhdGUoKSAvIDEwMDAwMDA7CisKKwlpZiAoZmFtaWx5WzBdICE9ICczJykgeworCQkvKiBDaGVjayBmb3IgbW9kZWwgaW4gZnVzZXMsIG92ZXJyaWRlcyBub3JtYWwgZGVjb2RlICovCisJCS8qIFRoaXMgaXMgX25vdF8gdmFsaWQgZm9yIE9jdGVvbiBDTjNYWFggbW9kZWxzICovCisJCWZ1c2VfZGF0YSB8PSBjdm14X2Z1c2VfcmVhZF9ieXRlKDUxKTsKKwkJZnVzZV9kYXRhID0gZnVzZV9kYXRhIDw8IDg7CisJCWZ1c2VfZGF0YSB8PSBjdm14X2Z1c2VfcmVhZF9ieXRlKDUwKTsKKwkJZnVzZV9kYXRhID0gZnVzZV9kYXRhIDw8IDg7CisJCWZ1c2VfZGF0YSB8PSBjdm14X2Z1c2VfcmVhZF9ieXRlKDQ5KTsKKwkJZnVzZV9kYXRhID0gZnVzZV9kYXRhIDw8IDg7CisJCWZ1c2VfZGF0YSB8PSBjdm14X2Z1c2VfcmVhZF9ieXRlKDQ4KTsKKwkJaWYgKGZ1c2VfZGF0YSAmIDB4N2ZmZmYpIHsKKwkJCWludCBtb2RlbCA9IGZ1c2VfZGF0YSAmIDB4M2ZmZjsKKwkJCWludCBzdWZmaXggPSAoZnVzZV9kYXRhID4+IDE0KSAmIDB4MWY7CisJCQlpZiAoc3VmZml4ICYmIG1vZGVsKSB7CisJCQkJLyoKKwkJCQkgKiBIYXZlIGJvdGggbnVtYmVyIGFuZCBzdWZmaXggaW4KKwkJCQkgKiBmdXNlcywgc28gYm90aAorCQkJCSAqLworCQkJCXNwcmludGYoZnVzZV9tb2RlbCwgIiVkJWMiLAorCQkJCQltb2RlbCwgJ0EnICsgc3VmZml4IC0gMSk7CisJCQkJY29yZV9tb2RlbCA9ICIiOworCQkJCWZhbWlseSA9IGZ1c2VfbW9kZWw7CisJCQl9IGVsc2UgaWYgKHN1ZmZpeCAmJiAhbW9kZWwpIHsKKwkJCQkvKgorCQkJCSAqIE9ubHkgaGF2ZSBzdWZmaXgsIHNvIGFkZCBzdWZmaXggdG8KKwkJCQkgKiAnbm9ybWFsJyBtb2RlbCBudW1iZXIuCisJCQkJICovCisJCQkJc3ByaW50ZihmdXNlX21vZGVsLCAiJXMlYyIsIGNvcmVfbW9kZWwsCisJCQkJCSdBJyArIHN1ZmZpeCAtIDEpOworCQkJCWNvcmVfbW9kZWwgPSBmdXNlX21vZGVsOworCQkJfSBlbHNlIHsKKwkJCQkvKgorCQkJCSAqIERvbid0IGhhdmUgc3VmZml4LCBzbyBqdXN0IHVzZQorCQkJCSAqIG1vZGVsIGZyb20gZnVzZXMuCisJCQkJICovCisJCQkJc3ByaW50ZihmdXNlX21vZGVsLCAiJWQiLCBtb2RlbCk7CisJCQkJY29yZV9tb2RlbCA9ICIiOworCQkJCWZhbWlseSA9IGZ1c2VfbW9kZWw7CisJCQl9CisJCX0KKwl9CisJc3ByaW50ZihidWZmZXIsICJDTiVzJXNwJXMtJWQtJXMiLAorCQlmYW1pbHksIGNvcmVfbW9kZWwsIHBhc3MsIGNsb2NrX21oeiwgc3VmZml4KTsKKwlyZXR1cm4gYnVmZmVyOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2Nhdml1bS1vY3Rlb24vZmxhc2hfc2V0dXAuYyBiL2FyY2gvbWlwcy9jYXZpdW0tb2N0ZW9uL2ZsYXNoX3NldHVwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTUzZDM2YwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbWlwcy9jYXZpdW0tb2N0ZW9uL2ZsYXNoX3NldHVwLmMKQEAgLTAsMCArMSw4NCBAQAorLyoKKyAqICAgT2N0ZW9uIEJvb3RidXMgZmxhc2ggc2V0dXAKKyAqCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcsIDIwMDggQ2F2aXVtIE5ldHdvcmtzCisgKi8KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tdGQvbXRkLmg+CisjaW5jbHVkZSA8bGludXgvbXRkL21hcC5oPgorI2luY2x1ZGUgPGxpbnV4L210ZC9wYXJ0aXRpb25zLmg+CisKKyNpbmNsdWRlIDxhc20vb2N0ZW9uL29jdGVvbi5oPgorCitzdGF0aWMgc3RydWN0IG1hcF9pbmZvIGZsYXNoX21hcDsKK3N0YXRpYyBzdHJ1Y3QgbXRkX2luZm8gKm15bXRkOworI2lmZGVmIENPTkZJR19NVERfUEFSVElUSU9OUworc3RhdGljIGludCBucl9wYXJ0czsKK3N0YXRpYyBzdHJ1Y3QgbXRkX3BhcnRpdGlvbiAqcGFydHM7CitzdGF0aWMgY29uc3QgY2hhciAqcGFydF9wcm9iZV90eXBlc1tdID0geworCSJjbWRsaW5lcGFydCIsCisjaWZkZWYgQ09ORklHX01URF9SRURCT09UX1BBUlRTCisJIlJlZEJvb3QiLAorI2VuZGlmCisJTlVMTAorfTsKKyNlbmRpZgorCisvKioKKyAqIE1vZHVsZS8gZHJpdmVyIGluaXRpYWxpemF0aW9uLgorICoKKyAqIFJldHVybnMgWmVybyBvbiBzdWNjZXNzCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IGZsYXNoX2luaXQodm9pZCkKK3sKKwkvKgorCSAqIFJlYWQgdGhlIGJvb3RidXMgcmVnaW9uIDAgc2V0dXAgdG8gZGV0ZXJtaW5lIHRoZSBiYXNlCisJICogYWRkcmVzcyBvZiB0aGUgZmxhc2guCisJICovCisJdW5pb24gY3ZteF9taW9fYm9vdF9yZWdfY2ZneCByZWdpb25fY2ZnOworCXJlZ2lvbl9jZmcudTY0ID0gY3ZteF9yZWFkX2NzcihDVk1YX01JT19CT09UX1JFR19DRkdYKDApKTsKKwlpZiAocmVnaW9uX2NmZy5zLmVuKSB7CisJCS8qCisJCSAqIFRoZSBib290bG9hZGVyIGFsd2F5cyB0YWtlcyB0aGUgZmxhc2ggYW5kIHNldHMgaXRzCisJCSAqIGFkZHJlc3Mgc28gdGhlIGVudGlyZSBmbGFzaCBmaXRzIGJlbG93CisJCSAqIDB4MWZjMDAwMDAuIFRoaXMgd2F5IHRoZSBmbGFzaCBhbGlhc2VzIHRvCisJCSAqIDB4MWZjMDAwMDAgZm9yIGJvb3RpbmcuIFNvZnR3YXJlIGNhbiBhY2Nlc3MgdGhlCisJCSAqIGZ1bGwgZmxhc2ggYXQgdGhlIHRydWUgYWRkcmVzcywgd2hpbGUgY29yZSBib290IGNhbgorCQkgKiBhY2Nlc3MgNE1CLgorCQkgKi8KKwkJLyogVXNlIHRoaXMgbmFtZSBzbyBvbGQgcGFydCBsaW5lcyB3b3JrICovCisJCWZsYXNoX21hcC5uYW1lID0gInBoeXNfbWFwcGVkX2ZsYXNoIjsKKwkJZmxhc2hfbWFwLnBoeXMgPSByZWdpb25fY2ZnLnMuYmFzZSA8PCAxNjsKKwkJZmxhc2hfbWFwLnNpemUgPSAweDFmYzAwMDAwIC0gZmxhc2hfbWFwLnBoeXM7CisJCWZsYXNoX21hcC5iYW5rd2lkdGggPSAxOworCQlmbGFzaF9tYXAudmlydCA9IGlvcmVtYXAoZmxhc2hfbWFwLnBoeXMsIGZsYXNoX21hcC5zaXplKTsKKwkJcHJfbm90aWNlKCJCb290YnVzIGZsYXNoOiBTZXR0aW5nIGZsYXNoIGZvciAlbHVNQiBmbGFzaCBhdCAiCisJCQkgICIweCUwOGx4XG4iLCBmbGFzaF9tYXAuc2l6ZSA+PiAyMCwgZmxhc2hfbWFwLnBoeXMpOworCQlzaW1wbGVfbWFwX2luaXQoJmZsYXNoX21hcCk7CisJCW15bXRkID0gZG9fbWFwX3Byb2JlKCJjZmlfcHJvYmUiLCAmZmxhc2hfbWFwKTsKKwkJaWYgKG15bXRkKSB7CisJCQlteW10ZC0+b3duZXIgPSBUSElTX01PRFVMRTsKKworI2lmZGVmIENPTkZJR19NVERfUEFSVElUSU9OUworCQkJbnJfcGFydHMgPSBwYXJzZV9tdGRfcGFydGl0aW9ucyhteW10ZCwKKwkJCQkJCQlwYXJ0X3Byb2JlX3R5cGVzLAorCQkJCQkJCSZwYXJ0cywgMCk7CisJCQlpZiAobnJfcGFydHMgPiAwKQorCQkJCWFkZF9tdGRfcGFydGl0aW9ucyhteW10ZCwgcGFydHMsIG5yX3BhcnRzKTsKKwkJCWVsc2UKKwkJCQlhZGRfbXRkX2RldmljZShteW10ZCk7CisjZWxzZQorCQkJYWRkX210ZF9kZXZpY2UobXltdGQpOworI2VuZGlmCisJCX0gZWxzZSB7CisJCQlwcl9lcnIoIkZhaWxlZCB0byByZWdpc3RlciBNVEQgZGV2aWNlIGZvciBmbGFzaFxuIik7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK2xhdGVfaW5pdGNhbGwoZmxhc2hfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvY2F2aXVtLW9jdGVvbi9vY3Rlb24taXJxLmMgYi9hcmNoL21pcHMvY2F2aXVtLW9jdGVvbi9vY3Rlb24taXJxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmM3Mjk4NAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbWlwcy9jYXZpdW0tb2N0ZW9uL29jdGVvbi1pcnEuYwpAQCAtMCwwICsxLDQ5NyBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDA4IENhdml1bSBOZXR3b3JrcworICovCisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaGFyZGlycS5oPgorCisjaW5jbHVkZSA8YXNtL29jdGVvbi9vY3Rlb24uaD4KKworREVGSU5FX1JXTE9DSyhvY3Rlb25faXJxX2NpdTBfcndsb2NrKTsKK0RFRklORV9SV0xPQ0sob2N0ZW9uX2lycV9jaXUxX3J3bG9jayk7CitERUZJTkVfU1BJTkxPQ0sob2N0ZW9uX2lycV9tc2lfbG9jayk7CisKK3N0YXRpYyB2b2lkIG9jdGVvbl9pcnFfY29yZV9hY2sodW5zaWduZWQgaW50IGlycSkKK3sKKwl1bnNpZ25lZCBpbnQgYml0ID0gaXJxIC0gT0NURU9OX0lSUV9TVzA7CisJLyoKKwkgKiBXZSBkb24ndCBuZWVkIHRvIGRpc2FibGUgSVJRcyB0byBtYWtlIHRoZXNlIGF0b21pYyBzaW5jZQorCSAqIHRoZXkgYXJlIGFscmVhZHkgZGlzYWJsZWQgZWFybGllciBpbiB0aGUgbG93IGxldmVsCisJICogaW50ZXJydXB0IGNvZGUuCisJICovCisJY2xlYXJfYzBfc3RhdHVzKDB4MTAwIDw8IGJpdCk7CisJLyogVGhlIHR3byB1c2VyIGludGVycnVwdHMgbXVzdCBiZSBjbGVhcmVkIG1hbnVhbGx5LiAqLworCWlmIChiaXQgPCAyKQorCQljbGVhcl9jMF9jYXVzZSgweDEwMCA8PCBiaXQpOworfQorCitzdGF0aWMgdm9pZCBvY3Rlb25faXJxX2NvcmVfZW9pKHVuc2lnbmVkIGludCBpcnEpCit7CisJaXJxX2Rlc2NfdCAqZGVzYyA9IGlycV9kZXNjICsgaXJxOworCXVuc2lnbmVkIGludCBiaXQgPSBpcnEgLSBPQ1RFT05fSVJRX1NXMDsKKwkvKgorCSAqIElmIGFuIElSUSBpcyBiZWluZyBwcm9jZXNzZWQgd2hpbGUgd2UgYXJlIGRpc2FibGluZyBpdCB0aGUKKwkgKiBoYW5kbGVyIHdpbGwgYXR0ZW1wdCB0byB1bm1hc2sgdGhlIGludGVycnVwdCBhZnRlciBpdCBoYXMKKwkgKiBiZWVuIGRpc2FibGVkLgorCSAqLworCWlmIChkZXNjLT5zdGF0dXMgJiBJUlFfRElTQUJMRUQpCisJCXJldHVybjsKKworCS8qIFRoZXJlIGlzIGEgcmFjZSBoZXJlLiAgV2Ugc2hvdWxkIGZpeCBpdC4gICovCisKKwkvKgorCSAqIFdlIGRvbid0IG5lZWQgdG8gZGlzYWJsZSBJUlFzIHRvIG1ha2UgdGhlc2UgYXRvbWljIHNpbmNlCisJICogdGhleSBhcmUgYWxyZWFkeSBkaXNhYmxlZCBlYXJsaWVyIGluIHRoZSBsb3cgbGV2ZWwKKwkgKiBpbnRlcnJ1cHQgY29kZS4KKwkgKi8KKwlzZXRfYzBfc3RhdHVzKDB4MTAwIDw8IGJpdCk7Cit9CisKK3N0YXRpYyB2b2lkIG9jdGVvbl9pcnFfY29yZV9lbmFibGUodW5zaWduZWQgaW50IGlycSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGludCBiaXQgPSBpcnEgLSBPQ1RFT05fSVJRX1NXMDsKKworCS8qCisJICogV2UgbmVlZCB0byBkaXNhYmxlIGludGVycnVwdHMgdG8gbWFrZSBzdXJlIG91ciB1cGRhdGVzIGFyZQorCSAqIGF0b21pYy4KKwkgKi8KKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJc2V0X2MwX3N0YXR1cygweDEwMCA8PCBiaXQpOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgb2N0ZW9uX2lycV9jb3JlX2Rpc2FibGVfbG9jYWwodW5zaWduZWQgaW50IGlycSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGludCBiaXQgPSBpcnEgLSBPQ1RFT05fSVJRX1NXMDsKKwkvKgorCSAqIFdlIG5lZWQgdG8gZGlzYWJsZSBpbnRlcnJ1cHRzIHRvIG1ha2Ugc3VyZSBvdXIgdXBkYXRlcyBhcmUKKwkgKiBhdG9taWMuCisJICovCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCWNsZWFyX2MwX3N0YXR1cygweDEwMCA8PCBiaXQpOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgb2N0ZW9uX2lycV9jb3JlX2Rpc2FibGUodW5zaWduZWQgaW50IGlycSkKK3sKKyNpZmRlZiBDT05GSUdfU01QCisJb25fZWFjaF9jcHUoKHZvaWQgKCopKHZvaWQgKikpIG9jdGVvbl9pcnFfY29yZV9kaXNhYmxlX2xvY2FsLAorCQkgICAgKHZvaWQgKikgKGxvbmcpIGlycSwgMSk7CisjZWxzZQorCW9jdGVvbl9pcnFfY29yZV9kaXNhYmxlX2xvY2FsKGlycSk7CisjZW5kaWYKK30KKworc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBvY3Rlb25faXJxX2NoaXBfY29yZSA9IHsKKwkubmFtZSA9ICJDb3JlIiwKKwkuZW5hYmxlID0gb2N0ZW9uX2lycV9jb3JlX2VuYWJsZSwKKwkuZGlzYWJsZSA9IG9jdGVvbl9pcnFfY29yZV9kaXNhYmxlLAorCS5hY2sgPSBvY3Rlb25faXJxX2NvcmVfYWNrLAorCS5lb2kgPSBvY3Rlb25faXJxX2NvcmVfZW9pLAorfTsKKworCitzdGF0aWMgdm9pZCBvY3Rlb25faXJxX2NpdTBfYWNrKHVuc2lnbmVkIGludCBpcnEpCit7CisJLyoKKwkgKiBJbiBvcmRlciB0byBhdm9pZCBhbnkgbG9ja2luZyBhY2Nlc3NpbmcgdGhlIENJVSwgd2UKKwkgKiBhY2tub3dsZWRnZSBDSVUgaW50ZXJydXB0cyBieSBkaXNhYmxpbmcgYWxsIG9mIHRoZW0uICBUaGlzCisJICogd2F5IHdlIGNhbiB1c2UgYSBwZXIgY29yZSByZWdpc3RlciBhbmQgYXZvaWQgYW55IG91dCBvZgorCSAqIGNvcmUgbG9ja2luZyByZXF1aXJlbWVudHMuICBUaGlzIGhhcyB0aGUgc2lkZSBhZmZlY3QgdGhhdAorCSAqIENJVSBpbnRlcnJ1cHRzIGNhbid0IGJlIHByb2Nlc3NlZCByZWN1cnNpdmVseS4KKwkgKgorCSAqIFdlIGRvbid0IG5lZWQgdG8gZGlzYWJsZSBJUlFzIHRvIG1ha2UgdGhlc2UgYXRvbWljIHNpbmNlCisJICogdGhleSBhcmUgYWxyZWFkeSBkaXNhYmxlZCBlYXJsaWVyIGluIHRoZSBsb3cgbGV2ZWwKKwkgKiBpbnRlcnJ1cHQgY29kZS4KKwkgKi8KKwljbGVhcl9jMF9zdGF0dXMoMHgxMDAgPDwgMik7Cit9CisKK3N0YXRpYyB2b2lkIG9jdGVvbl9pcnFfY2l1MF9lb2kodW5zaWduZWQgaW50IGlycSkKK3sKKwkvKgorCSAqIEVuYWJsZSBhbGwgQ0lVIGludGVycnVwdHMgYWdhaW4uICBXZSBkb24ndCBuZWVkIHRvIGRpc2FibGUKKwkgKiBJUlFzIHRvIG1ha2UgdGhlc2UgYXRvbWljIHNpbmNlIHRoZXkgYXJlIGFscmVhZHkgZGlzYWJsZWQKKwkgKiBlYXJsaWVyIGluIHRoZSBsb3cgbGV2ZWwgaW50ZXJydXB0IGNvZGUuCisJICovCisJc2V0X2MwX3N0YXR1cygweDEwMCA8PCAyKTsKK30KKworc3RhdGljIHZvaWQgb2N0ZW9uX2lycV9jaXUwX2VuYWJsZSh1bnNpZ25lZCBpbnQgaXJxKQoreworCWludCBjb3JlaWQgPSBjdm14X2dldF9jb3JlX251bSgpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdWludDY0X3QgZW4wOworCWludCBiaXQgPSBpcnEgLSBPQ1RFT05fSVJRX1dPUktRMDsJLyogQml0IDAtNjMgb2YgRU4wICovCisKKwkvKgorCSAqIEEgcmVhZCBsb2NrIGlzIHVzZWQgaGVyZSB0byBtYWtlIHN1cmUgb25seSBvbmUgY29yZSBpcyBldmVyCisJICogdXBkYXRpbmcgdGhlIENJVSBlbmFibGUgYml0cyBhdCBhIHRpbWUuIER1cmluZyBhbiBlbmFibGUKKwkgKiB0aGUgY29yZXMgZG9uJ3QgaW50ZXJmZXJlIHdpdGggZWFjaCBvdGhlci4gRHVyaW5nIGEgZGlzYWJsZQorCSAqIHRoZSB3cml0ZSBsb2NrIHN0b3BzIGFueSBlbmFibGVzIHRoYXQgbWlnaHQgY2F1c2UgYQorCSAqIHByb2JsZW0uCisJICovCisJcmVhZF9sb2NrX2lycXNhdmUoJm9jdGVvbl9pcnFfY2l1MF9yd2xvY2ssIGZsYWdzKTsKKwllbjAgPSBjdm14X3JlYWRfY3NyKENWTVhfQ0lVX0lOVFhfRU4wKGNvcmVpZCAqIDIpKTsKKwllbjAgfD0gMXVsbCA8PCBiaXQ7CisJY3ZteF93cml0ZV9jc3IoQ1ZNWF9DSVVfSU5UWF9FTjAoY29yZWlkICogMiksIGVuMCk7CisJY3ZteF9yZWFkX2NzcihDVk1YX0NJVV9JTlRYX0VOMChjb3JlaWQgKiAyKSk7CisJcmVhZF91bmxvY2tfaXJxcmVzdG9yZSgmb2N0ZW9uX2lycV9jaXUwX3J3bG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBvY3Rlb25faXJxX2NpdTBfZGlzYWJsZSh1bnNpZ25lZCBpbnQgaXJxKQoreworCWludCBiaXQgPSBpcnEgLSBPQ1RFT05fSVJRX1dPUktRMDsJLyogQml0IDAtNjMgb2YgRU4wICovCisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1aW50NjRfdCBlbjA7CisjaWZkZWYgQ09ORklHX1NNUAorCWludCBjcHU7CisJd3JpdGVfbG9ja19pcnFzYXZlKCZvY3Rlb25faXJxX2NpdTBfcndsb2NrLCBmbGFncyk7CisJZm9yX2VhY2hfb25saW5lX2NwdShjcHUpIHsKKwkJaW50IGNvcmVpZCA9IGNwdV9sb2dpY2FsX21hcChjcHUpOworCQllbjAgPSBjdm14X3JlYWRfY3NyKENWTVhfQ0lVX0lOVFhfRU4wKGNvcmVpZCAqIDIpKTsKKwkJZW4wICY9IH4oMXVsbCA8PCBiaXQpOworCQljdm14X3dyaXRlX2NzcihDVk1YX0NJVV9JTlRYX0VOMChjb3JlaWQgKiAyKSwgZW4wKTsKKwl9CisJLyoKKwkgKiBXZSBuZWVkIHRvIGRvIGEgcmVhZCBhZnRlciB0aGUgbGFzdCB1cGRhdGUgdG8gbWFrZSBzdXJlIGFsbAorCSAqIG9mIHRoZW0gYXJlIGRvbmUuCisJICovCisJY3ZteF9yZWFkX2NzcihDVk1YX0NJVV9JTlRYX0VOMChjdm14X2dldF9jb3JlX251bSgpICogMikpOworCXdyaXRlX3VubG9ja19pcnFyZXN0b3JlKCZvY3Rlb25faXJxX2NpdTBfcndsb2NrLCBmbGFncyk7CisjZWxzZQorCWludCBjb3JlaWQgPSBjdm14X2dldF9jb3JlX251bSgpOworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwllbjAgPSBjdm14X3JlYWRfY3NyKENWTVhfQ0lVX0lOVFhfRU4wKGNvcmVpZCAqIDIpKTsKKwllbjAgJj0gfigxdWxsIDw8IGJpdCk7CisJY3ZteF93cml0ZV9jc3IoQ1ZNWF9DSVVfSU5UWF9FTjAoY29yZWlkICogMiksIGVuMCk7CisJY3ZteF9yZWFkX2NzcihDVk1YX0NJVV9JTlRYX0VOMChjb3JlaWQgKiAyKSk7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworI2VuZGlmCit9CisKKyNpZmRlZiBDT05GSUdfU01QCitzdGF0aWMgdm9pZCBvY3Rlb25faXJxX2NpdTBfc2V0X2FmZmluaXR5KHVuc2lnbmVkIGludCBpcnEsIGNvbnN0IHN0cnVjdCBjcHVtYXNrICpkZXN0KQoreworCWludCBjcHU7CisJaW50IGJpdCA9IGlycSAtIE9DVEVPTl9JUlFfV09SS1EwOwkvKiBCaXQgMC02MyBvZiBFTjAgKi8KKworCXdyaXRlX2xvY2soJm9jdGVvbl9pcnFfY2l1MF9yd2xvY2spOworCWZvcl9lYWNoX29ubGluZV9jcHUoY3B1KSB7CisJCWludCBjb3JlaWQgPSBjcHVfbG9naWNhbF9tYXAoY3B1KTsKKwkJdWludDY0X3QgZW4wID0KKwkJCWN2bXhfcmVhZF9jc3IoQ1ZNWF9DSVVfSU5UWF9FTjAoY29yZWlkICogMikpOworCQlpZiAoY3B1bWFza190ZXN0X2NwdShjcHUsIGRlc3QpKQorCQkJZW4wIHw9IDF1bGwgPDwgYml0OworCQllbHNlCisJCQllbjAgJj0gfigxdWxsIDw8IGJpdCk7CisJCWN2bXhfd3JpdGVfY3NyKENWTVhfQ0lVX0lOVFhfRU4wKGNvcmVpZCAqIDIpLCBlbjApOworCX0KKwkvKgorCSAqIFdlIG5lZWQgdG8gZG8gYSByZWFkIGFmdGVyIHRoZSBsYXN0IHVwZGF0ZSB0byBtYWtlIHN1cmUgYWxsCisJICogb2YgdGhlbSBhcmUgZG9uZS4KKwkgKi8KKwljdm14X3JlYWRfY3NyKENWTVhfQ0lVX0lOVFhfRU4wKGN2bXhfZ2V0X2NvcmVfbnVtKCkgKiAyKSk7CisJd3JpdGVfdW5sb2NrKCZvY3Rlb25faXJxX2NpdTBfcndsb2NrKTsKK30KKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IGlycV9jaGlwIG9jdGVvbl9pcnFfY2hpcF9jaXUwID0geworCS5uYW1lID0gIkNJVTAiLAorCS5lbmFibGUgPSBvY3Rlb25faXJxX2NpdTBfZW5hYmxlLAorCS5kaXNhYmxlID0gb2N0ZW9uX2lycV9jaXUwX2Rpc2FibGUsCisJLmFjayA9IG9jdGVvbl9pcnFfY2l1MF9hY2ssCisJLmVvaSA9IG9jdGVvbl9pcnFfY2l1MF9lb2ksCisjaWZkZWYgQ09ORklHX1NNUAorCS5zZXRfYWZmaW5pdHkgPSBvY3Rlb25faXJxX2NpdTBfc2V0X2FmZmluaXR5LAorI2VuZGlmCit9OworCisKK3N0YXRpYyB2b2lkIG9jdGVvbl9pcnFfY2l1MV9hY2sodW5zaWduZWQgaW50IGlycSkKK3sKKwkvKgorCSAqIEluIG9yZGVyIHRvIGF2b2lkIGFueSBsb2NraW5nIGFjY2Vzc2luZyB0aGUgQ0lVLCB3ZQorCSAqIGFja25vd2xlZGdlIENJVSBpbnRlcnJ1cHRzIGJ5IGRpc2FibGluZyBhbGwgb2YgdGhlbS4gIFRoaXMKKwkgKiB3YXkgd2UgY2FuIHVzZSBhIHBlciBjb3JlIHJlZ2lzdGVyIGFuZCBhdm9pZCBhbnkgb3V0IG9mCisJICogY29yZSBsb2NraW5nIHJlcXVpcmVtZW50cy4gIFRoaXMgaGFzIHRoZSBzaWRlIGFmZmVjdCB0aGF0CisJICogQ0lVIGludGVycnVwdHMgY2FuJ3QgYmUgcHJvY2Vzc2VkIHJlY3Vyc2l2ZWx5LiAgV2UgZG9uJ3QKKwkgKiBuZWVkIHRvIGRpc2FibGUgSVJRcyB0byBtYWtlIHRoZXNlIGF0b21pYyBzaW5jZSB0aGV5IGFyZQorCSAqIGFscmVhZHkgZGlzYWJsZWQgZWFybGllciBpbiB0aGUgbG93IGxldmVsIGludGVycnVwdCBjb2RlLgorCSAqLworCWNsZWFyX2MwX3N0YXR1cygweDEwMCA8PCAzKTsKK30KKworc3RhdGljIHZvaWQgb2N0ZW9uX2lycV9jaXUxX2VvaSh1bnNpZ25lZCBpbnQgaXJxKQoreworCS8qCisJICogRW5hYmxlIGFsbCBDSVUgaW50ZXJydXB0cyBhZ2Fpbi4gIFdlIGRvbid0IG5lZWQgdG8gZGlzYWJsZQorCSAqIElSUXMgdG8gbWFrZSB0aGVzZSBhdG9taWMgc2luY2UgdGhleSBhcmUgYWxyZWFkeSBkaXNhYmxlZAorCSAqIGVhcmxpZXIgaW4gdGhlIGxvdyBsZXZlbCBpbnRlcnJ1cHQgY29kZS4KKwkgKi8KKwlzZXRfYzBfc3RhdHVzKDB4MTAwIDw8IDMpOworfQorCitzdGF0aWMgdm9pZCBvY3Rlb25faXJxX2NpdTFfZW5hYmxlKHVuc2lnbmVkIGludCBpcnEpCit7CisJaW50IGNvcmVpZCA9IGN2bXhfZ2V0X2NvcmVfbnVtKCk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1aW50NjRfdCBlbjE7CisJaW50IGJpdCA9IGlycSAtIE9DVEVPTl9JUlFfV0RPRzA7CS8qIEJpdCAwLTYzIG9mIEVOMSAqLworCisJLyoKKwkgKiBBIHJlYWQgbG9jayBpcyB1c2VkIGhlcmUgdG8gbWFrZSBzdXJlIG9ubHkgb25lIGNvcmUgaXMgZXZlcgorCSAqIHVwZGF0aW5nIHRoZSBDSVUgZW5hYmxlIGJpdHMgYXQgYSB0aW1lLiAgRHVyaW5nIGFuIGVuYWJsZQorCSAqIHRoZSBjb3JlcyBkb24ndCBpbnRlcmZlcmUgd2l0aCBlYWNoIG90aGVyLiAgRHVyaW5nIGEgZGlzYWJsZQorCSAqIHRoZSB3cml0ZSBsb2NrIHN0b3BzIGFueSBlbmFibGVzIHRoYXQgbWlnaHQgY2F1c2UgYQorCSAqIHByb2JsZW0uCisJICovCisJcmVhZF9sb2NrX2lycXNhdmUoJm9jdGVvbl9pcnFfY2l1MV9yd2xvY2ssIGZsYWdzKTsKKwllbjEgPSBjdm14X3JlYWRfY3NyKENWTVhfQ0lVX0lOVFhfRU4xKGNvcmVpZCAqIDIgKyAxKSk7CisJZW4xIHw9IDF1bGwgPDwgYml0OworCWN2bXhfd3JpdGVfY3NyKENWTVhfQ0lVX0lOVFhfRU4xKGNvcmVpZCAqIDIgKyAxKSwgZW4xKTsKKwljdm14X3JlYWRfY3NyKENWTVhfQ0lVX0lOVFhfRU4xKGNvcmVpZCAqIDIgKyAxKSk7CisJcmVhZF91bmxvY2tfaXJxcmVzdG9yZSgmb2N0ZW9uX2lycV9jaXUxX3J3bG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBvY3Rlb25faXJxX2NpdTFfZGlzYWJsZSh1bnNpZ25lZCBpbnQgaXJxKQoreworCWludCBiaXQgPSBpcnEgLSBPQ1RFT05fSVJRX1dET0cwOwkvKiBCaXQgMC02MyBvZiBFTjEgKi8KKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVpbnQ2NF90IGVuMTsKKyNpZmRlZiBDT05GSUdfU01QCisJaW50IGNwdTsKKwl3cml0ZV9sb2NrX2lycXNhdmUoJm9jdGVvbl9pcnFfY2l1MV9yd2xvY2ssIGZsYWdzKTsKKwlmb3JfZWFjaF9vbmxpbmVfY3B1KGNwdSkgeworCQlpbnQgY29yZWlkID0gY3B1X2xvZ2ljYWxfbWFwKGNwdSk7CisJCWVuMSA9IGN2bXhfcmVhZF9jc3IoQ1ZNWF9DSVVfSU5UWF9FTjEoY29yZWlkICogMiArIDEpKTsKKwkJZW4xICY9IH4oMXVsbCA8PCBiaXQpOworCQljdm14X3dyaXRlX2NzcihDVk1YX0NJVV9JTlRYX0VOMShjb3JlaWQgKiAyICsgMSksIGVuMSk7CisJfQorCS8qCisJICogV2UgbmVlZCB0byBkbyBhIHJlYWQgYWZ0ZXIgdGhlIGxhc3QgdXBkYXRlIHRvIG1ha2Ugc3VyZSBhbGwKKwkgKiBvZiB0aGVtIGFyZSBkb25lLgorCSAqLworCWN2bXhfcmVhZF9jc3IoQ1ZNWF9DSVVfSU5UWF9FTjEoY3ZteF9nZXRfY29yZV9udW0oKSAqIDIgKyAxKSk7CisJd3JpdGVfdW5sb2NrX2lycXJlc3RvcmUoJm9jdGVvbl9pcnFfY2l1MV9yd2xvY2ssIGZsYWdzKTsKKyNlbHNlCisJaW50IGNvcmVpZCA9IGN2bXhfZ2V0X2NvcmVfbnVtKCk7CisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCWVuMSA9IGN2bXhfcmVhZF9jc3IoQ1ZNWF9DSVVfSU5UWF9FTjEoY29yZWlkICogMiArIDEpKTsKKwllbjEgJj0gfigxdWxsIDw8IGJpdCk7CisJY3ZteF93cml0ZV9jc3IoQ1ZNWF9DSVVfSU5UWF9FTjEoY29yZWlkICogMiArIDEpLCBlbjEpOworCWN2bXhfcmVhZF9jc3IoQ1ZNWF9DSVVfSU5UWF9FTjEoY29yZWlkICogMiArIDEpKTsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisjZW5kaWYKK30KKworI2lmZGVmIENPTkZJR19TTVAKK3N0YXRpYyB2b2lkIG9jdGVvbl9pcnFfY2l1MV9zZXRfYWZmaW5pdHkodW5zaWduZWQgaW50IGlycSwgY29uc3Qgc3RydWN0IGNwdW1hc2sgKmRlc3QpCit7CisJaW50IGNwdTsKKwlpbnQgYml0ID0gaXJxIC0gT0NURU9OX0lSUV9XRE9HMDsJLyogQml0IDAtNjMgb2YgRU4xICovCisKKwl3cml0ZV9sb2NrKCZvY3Rlb25faXJxX2NpdTFfcndsb2NrKTsKKwlmb3JfZWFjaF9vbmxpbmVfY3B1KGNwdSkgeworCQlpbnQgY29yZWlkID0gY3B1X2xvZ2ljYWxfbWFwKGNwdSk7CisJCXVpbnQ2NF90IGVuMSA9CisJCQljdm14X3JlYWRfY3NyKENWTVhfQ0lVX0lOVFhfRU4xCisJCQkJKGNvcmVpZCAqIDIgKyAxKSk7CisJCWlmIChjcHVtYXNrX3Rlc3RfY3B1KGNwdSwgZGVzdCkpCisJCQllbjEgfD0gMXVsbCA8PCBiaXQ7CisJCWVsc2UKKwkJCWVuMSAmPSB+KDF1bGwgPDwgYml0KTsKKwkJY3ZteF93cml0ZV9jc3IoQ1ZNWF9DSVVfSU5UWF9FTjEoY29yZWlkICogMiArIDEpLCBlbjEpOworCX0KKwkvKgorCSAqIFdlIG5lZWQgdG8gZG8gYSByZWFkIGFmdGVyIHRoZSBsYXN0IHVwZGF0ZSB0byBtYWtlIHN1cmUgYWxsCisJICogb2YgdGhlbSBhcmUgZG9uZS4KKwkgKi8KKwljdm14X3JlYWRfY3NyKENWTVhfQ0lVX0lOVFhfRU4xKGN2bXhfZ2V0X2NvcmVfbnVtKCkgKiAyICsgMSkpOworCXdyaXRlX3VubG9jaygmb2N0ZW9uX2lycV9jaXUxX3J3bG9jayk7Cit9CisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBvY3Rlb25faXJxX2NoaXBfY2l1MSA9IHsKKwkubmFtZSA9ICJDSVUxIiwKKwkuZW5hYmxlID0gb2N0ZW9uX2lycV9jaXUxX2VuYWJsZSwKKwkuZGlzYWJsZSA9IG9jdGVvbl9pcnFfY2l1MV9kaXNhYmxlLAorCS5hY2sgPSBvY3Rlb25faXJxX2NpdTFfYWNrLAorCS5lb2kgPSBvY3Rlb25faXJxX2NpdTFfZW9pLAorI2lmZGVmIENPTkZJR19TTVAKKwkuc2V0X2FmZmluaXR5ID0gb2N0ZW9uX2lycV9jaXUxX3NldF9hZmZpbml0eSwKKyNlbmRpZgorfTsKKworI2lmZGVmIENPTkZJR19QQ0lfTVNJCisKK3N0YXRpYyB2b2lkIG9jdGVvbl9pcnFfbXNpX2Fjayh1bnNpZ25lZCBpbnQgaXJxKQoreworCWlmICghb2N0ZW9uX2hhc19mZWF0dXJlKE9DVEVPTl9GRUFUVVJFX1BDSUUpKSB7CisJCS8qIFRoZXNlIGNoaXBzIGhhdmUgUENJICovCisJCWN2bXhfd3JpdGVfY3NyKENWTVhfTlBJX05QSV9NU0lfUkNWLAorCQkJICAgICAgIDF1bGwgPDwgKGlycSAtIE9DVEVPTl9JUlFfTVNJX0JJVDApKTsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBUaGVzZSBjaGlwcyBoYXZlIFBDSWUuIFRoYW5rZnVsbHkgdGhlIEFDSyBkb2Vzbid0CisJCSAqIG5lZWQgYW55IGxvY2tpbmcuCisJCSAqLworCQljdm14X3dyaXRlX2NzcihDVk1YX1BFWFBfTlBFSV9NU0lfUkNWMCwKKwkJCSAgICAgICAxdWxsIDw8IChpcnEgLSBPQ1RFT05fSVJRX01TSV9CSVQwKSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBvY3Rlb25faXJxX21zaV9lb2kodW5zaWduZWQgaW50IGlycSkKK3sKKwkvKiBOb3RoaW5nIG5lZWRlZCAqLworfQorCitzdGF0aWMgdm9pZCBvY3Rlb25faXJxX21zaV9lbmFibGUodW5zaWduZWQgaW50IGlycSkKK3sKKwlpZiAoIW9jdGVvbl9oYXNfZmVhdHVyZShPQ1RFT05fRkVBVFVSRV9QQ0lFKSkgeworCQkvKgorCQkgKiBPY3Rlb24gUENJIGRvZXNuJ3QgaGF2ZSB0aGUgYWJpbGl0eSB0byBtYXNrL3VubWFzaworCQkgKiBNU0kgaW50ZXJydXB0cyBpbmRpdmlkdWFsbHkuICBJbnN0ZWFkIG9mCisJCSAqIG1hc2tpbmcvdW5tYXNraW5nIHRoZW0gaW4gZ3JvdXBzIG9mIDE2LCB3ZSBzaW1wbGUKKwkJICogYXNzdW1lIE1TSSBkZXZpY2VzIGFyZSB3ZWxsIGJlaGF2ZWQuICBNU0kKKwkJICogaW50ZXJydXB0cyBhcmUgYWx3YXlzIGVuYWJsZSBhbmQgdGhlIEFDSyBpcyBhc3N1bWVkCisJCSAqIHRvIGJlIGVub3VnaC4KKwkJICovCisJfSBlbHNlIHsKKwkJLyogVGhlc2UgY2hpcHMgaGF2ZSBQQ0llLiAgTm90ZSB0aGF0IHdlIG9ubHkgc3VwcG9ydAorCQkgKiB0aGUgZmlyc3QgNjQgTVNJIGludGVycnVwdHMuICBVbmZvcnR1bmF0ZWx5IGFsbCB0aGUKKwkJICogTVNJIGVuYWJsZXMgYXJlIGluIHRoZSBzYW1lIHJlZ2lzdGVyLiAgV2UgdXNlCisJCSAqIE1TSTAncyBsb2NrIHRvIGNvbnRyb2wgYWNjZXNzIHRvIHRoZW0gYWxsLgorCQkgKi8KKwkJdWludDY0X3QgZW47CisJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZvY3Rlb25faXJxX21zaV9sb2NrLCBmbGFncyk7CisJCWVuID0gY3ZteF9yZWFkX2NzcihDVk1YX1BFWFBfTlBFSV9NU0lfRU5CMCk7CisJCWVuIHw9IDF1bGwgPDwgKGlycSAtIE9DVEVPTl9JUlFfTVNJX0JJVDApOworCQljdm14X3dyaXRlX2NzcihDVk1YX1BFWFBfTlBFSV9NU0lfRU5CMCwgZW4pOworCQljdm14X3JlYWRfY3NyKENWTVhfUEVYUF9OUEVJX01TSV9FTkIwKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmb2N0ZW9uX2lycV9tc2lfbG9jaywgZmxhZ3MpOworCX0KK30KKworc3RhdGljIHZvaWQgb2N0ZW9uX2lycV9tc2lfZGlzYWJsZSh1bnNpZ25lZCBpbnQgaXJxKQoreworCWlmICghb2N0ZW9uX2hhc19mZWF0dXJlKE9DVEVPTl9GRUFUVVJFX1BDSUUpKSB7CisJCS8qIFNlZSBjb21tZW50IGluIGVuYWJsZSAqLworCX0gZWxzZSB7CisJCS8qCisJCSAqIFRoZXNlIGNoaXBzIGhhdmUgUENJZS4gIE5vdGUgdGhhdCB3ZSBvbmx5IHN1cHBvcnQKKwkJICogdGhlIGZpcnN0IDY0IE1TSSBpbnRlcnJ1cHRzLiAgVW5mb3J0dW5hdGVseSBhbGwgdGhlCisJCSAqIE1TSSBlbmFibGVzIGFyZSBpbiB0aGUgc2FtZSByZWdpc3Rlci4gIFdlIHVzZQorCQkgKiBNU0kwJ3MgbG9jayB0byBjb250cm9sIGFjY2VzcyB0byB0aGVtIGFsbC4KKwkJICovCisJCXVpbnQ2NF90IGVuOworCQl1bnNpZ25lZCBsb25nIGZsYWdzOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmb2N0ZW9uX2lycV9tc2lfbG9jaywgZmxhZ3MpOworCQllbiA9IGN2bXhfcmVhZF9jc3IoQ1ZNWF9QRVhQX05QRUlfTVNJX0VOQjApOworCQllbiAmPSB+KDF1bGwgPDwgKGlycSAtIE9DVEVPTl9JUlFfTVNJX0JJVDApKTsKKwkJY3ZteF93cml0ZV9jc3IoQ1ZNWF9QRVhQX05QRUlfTVNJX0VOQjAsIGVuKTsKKwkJY3ZteF9yZWFkX2NzcihDVk1YX1BFWFBfTlBFSV9NU0lfRU5CMCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm9jdGVvbl9pcnFfbXNpX2xvY2ssIGZsYWdzKTsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgb2N0ZW9uX2lycV9jaGlwX21zaSA9IHsKKwkubmFtZSA9ICJNU0kiLAorCS5lbmFibGUgPSBvY3Rlb25faXJxX21zaV9lbmFibGUsCisJLmRpc2FibGUgPSBvY3Rlb25faXJxX21zaV9kaXNhYmxlLAorCS5hY2sgPSBvY3Rlb25faXJxX21zaV9hY2ssCisJLmVvaSA9IG9jdGVvbl9pcnFfbXNpX2VvaSwKK307CisjZW5kaWYKKwordm9pZCBfX2luaXQgYXJjaF9pbml0X2lycSh2b2lkKQoreworCWludCBpcnE7CisKKyNpZmRlZiBDT05GSUdfU01QCisJLyogU2V0IHRoZSBkZWZhdWx0IGFmZmluaXR5IHRvIHRoZSBib290IGNwdS4gKi8KKwljcHVtYXNrX2NsZWFyKGlycV9kZWZhdWx0X2FmZmluaXR5KTsKKwljcHVtYXNrX3NldF9jcHUoc21wX3Byb2Nlc3Nvcl9pZCgpLCBpcnFfZGVmYXVsdF9hZmZpbml0eSk7CisjZW5kaWYKKworCWlmIChOUl9JUlFTIDwgT0NURU9OX0lSUV9MQVNUKQorCQlwcl9lcnIoIm9jdGVvbl9pcnFfaW5pdDogTlJfSVJRUyBpcyBzZXQgdG9vIGxvd1xuIik7CisKKwkvKiAwIC0gMTUgcmVzZXJ2ZWQgZm9yIGk4MjU5IG1hc3RlciBhbmQgc2xhdmUgY29udHJvbGxlci4gKi8KKworCS8qIDE3IC0gMjMgTWlwcyBpbnRlcm5hbCAqLworCWZvciAoaXJxID0gT0NURU9OX0lSUV9TVzA7IGlycSA8PSBPQ1RFT05fSVJRX1RJTUVSOyBpcnErKykgeworCQlzZXRfaXJxX2NoaXBfYW5kX2hhbmRsZXIoaXJxLCAmb2N0ZW9uX2lycV9jaGlwX2NvcmUsCisJCQkJCSBoYW5kbGVfcGVyY3B1X2lycSk7CisJfQorCisJLyogMjQgLSA4NyBDSVVfSU5UX1NVTTAgKi8KKwlmb3IgKGlycSA9IE9DVEVPTl9JUlFfV09SS1EwOyBpcnEgPD0gT0NURU9OX0lSUV9CT09URE1BOyBpcnErKykgeworCQlzZXRfaXJxX2NoaXBfYW5kX2hhbmRsZXIoaXJxLCAmb2N0ZW9uX2lycV9jaGlwX2NpdTAsCisJCQkJCSBoYW5kbGVfcGVyY3B1X2lycSk7CisJfQorCisJLyogODggLSAxNTEgQ0lVX0lOVF9TVU0xICovCisJZm9yIChpcnEgPSBPQ1RFT05fSVJRX1dET0cwOyBpcnEgPD0gT0NURU9OX0lSUV9SRVNFUlZFRDE1MTsgaXJxKyspIHsKKwkJc2V0X2lycV9jaGlwX2FuZF9oYW5kbGVyKGlycSwgJm9jdGVvbl9pcnFfY2hpcF9jaXUxLAorCQkJCQkgaGFuZGxlX3BlcmNwdV9pcnEpOworCX0KKworI2lmZGVmIENPTkZJR19QQ0lfTVNJCisJLyogMTUyIC0gMjE1IFBDSS9QQ0llIE1TSSBpbnRlcnJ1cHRzICovCisJZm9yIChpcnEgPSBPQ1RFT05fSVJRX01TSV9CSVQwOyBpcnEgPD0gT0NURU9OX0lSUV9NU0lfQklUNjM7IGlycSsrKSB7CisJCXNldF9pcnFfY2hpcF9hbmRfaGFuZGxlcihpcnEsICZvY3Rlb25faXJxX2NoaXBfbXNpLAorCQkJCQkgaGFuZGxlX3BlcmNwdV9pcnEpOworCX0KKyNlbmRpZgorCXNldF9jMF9zdGF0dXMoMHgzMDAgPDwgMik7Cit9CisKK2FzbWxpbmthZ2Ugdm9pZCBwbGF0X2lycV9kaXNwYXRjaCh2b2lkKQoreworCWNvbnN0IHVuc2lnbmVkIGxvbmcgY29yZV9pZCA9IGN2bXhfZ2V0X2NvcmVfbnVtKCk7CisJY29uc3QgdWludDY0X3QgY2l1X3N1bTBfYWRkcmVzcyA9IENWTVhfQ0lVX0lOVFhfU1VNMChjb3JlX2lkICogMik7CisJY29uc3QgdWludDY0X3QgY2l1X2VuMF9hZGRyZXNzID0gQ1ZNWF9DSVVfSU5UWF9FTjAoY29yZV9pZCAqIDIpOworCWNvbnN0IHVpbnQ2NF90IGNpdV9zdW0xX2FkZHJlc3MgPSBDVk1YX0NJVV9JTlRfU1VNMTsKKwljb25zdCB1aW50NjRfdCBjaXVfZW4xX2FkZHJlc3MgPSBDVk1YX0NJVV9JTlRYX0VOMShjb3JlX2lkICogMiArIDEpOworCXVuc2lnbmVkIGxvbmcgY29wMF9jYXVzZTsKKwl1bnNpZ25lZCBsb25nIGNvcDBfc3RhdHVzOworCXVpbnQ2NF90IGNpdV9lbjsKKwl1aW50NjRfdCBjaXVfc3VtOworCisJd2hpbGUgKDEpIHsKKwkJY29wMF9jYXVzZSA9IHJlYWRfYzBfY2F1c2UoKTsKKwkJY29wMF9zdGF0dXMgPSByZWFkX2MwX3N0YXR1cygpOworCQljb3AwX2NhdXNlICY9IGNvcDBfc3RhdHVzOworCQljb3AwX2NhdXNlICY9IFNUMF9JTTsKKworCQlpZiAodW5saWtlbHkoY29wMF9jYXVzZSAmIFNUQVRVU0ZfSVAyKSkgeworCQkJY2l1X3N1bSA9IGN2bXhfcmVhZF9jc3IoY2l1X3N1bTBfYWRkcmVzcyk7CisJCQljaXVfZW4gPSBjdm14X3JlYWRfY3NyKGNpdV9lbjBfYWRkcmVzcyk7CisJCQljaXVfc3VtICY9IGNpdV9lbjsKKwkJCWlmIChsaWtlbHkoY2l1X3N1bSkpCisJCQkJZG9fSVJRKGZsczY0KGNpdV9zdW0pICsgT0NURU9OX0lSUV9XT1JLUTAgLSAxKTsKKwkJCWVsc2UKKwkJCQlzcHVyaW91c19pbnRlcnJ1cHQoKTsKKwkJfSBlbHNlIGlmICh1bmxpa2VseShjb3AwX2NhdXNlICYgU1RBVFVTRl9JUDMpKSB7CisJCQljaXVfc3VtID0gY3ZteF9yZWFkX2NzcihjaXVfc3VtMV9hZGRyZXNzKTsKKwkJCWNpdV9lbiA9IGN2bXhfcmVhZF9jc3IoY2l1X2VuMV9hZGRyZXNzKTsKKwkJCWNpdV9zdW0gJj0gY2l1X2VuOworCQkJaWYgKGxpa2VseShjaXVfc3VtKSkKKwkJCQlkb19JUlEoZmxzNjQoY2l1X3N1bSkgKyBPQ1RFT05fSVJRX1dET0cwIC0gMSk7CisJCQllbHNlCisJCQkJc3B1cmlvdXNfaW50ZXJydXB0KCk7CisJCX0gZWxzZSBpZiAobGlrZWx5KGNvcDBfY2F1c2UpKSB7CisJCQlkb19JUlEoZmxzKGNvcDBfY2F1c2UpIC0gOSArIE1JUFNfQ1BVX0lSUV9CQVNFKTsKKwkJfSBlbHNlIHsKKwkJCWJyZWFrOworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2Nhdml1bS1vY3Rlb24vb2N0ZW9uLW1lbWNweS5TIGIvYXJjaC9taXBzL2Nhdml1bS1vY3Rlb24vb2N0ZW9uLW1lbWNweS5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4ZTBjZGQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21pcHMvY2F2aXVtLW9jdGVvbi9vY3Rlb24tbWVtY3B5LlMKQEAgLTAsMCArMSw1MjEgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBVbmlmaWVkIGltcGxlbWVudGF0aW9uIG9mIG1lbWNweSwgbWVtbW92ZSBhbmQgdGhlIF9fY29weV91c2VyIGJhY2tlbmQuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk4LCA5OSwgMjAwMCwgMDEsIDIwMDIgUmFsZiBCYWVjaGxlIChyYWxmQGdudS5vcmcpCisgKiBDb3B5cmlnaHQgKEMpIDE5OTksIDIwMDAsIDAxLCAyMDAyIFNpbGljb24gR3JhcGhpY3MsIEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAwMiBCcm9hZGNvbSwgSW5jLgorICogICBtZW1jcHkvY29weV91c2VyIGF1dGhvcjogTWFyayBWYW5kZXZvb3JkZQorICoKKyAqIE1uZW1vbmljIG5hbWVzIGZvciBhcmd1bWVudHMgdG8gbWVtY3B5L19fY29weV91c2VyCisgKi8KKworI2luY2x1ZGUgPGFzbS9hc20uaD4KKyNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KKyNpbmNsdWRlIDxhc20vcmVnZGVmLmg+CisKKyNkZWZpbmUgZHN0IGEwCisjZGVmaW5lIHNyYyBhMQorI2RlZmluZSBsZW4gYTIKKworLyoKKyAqIFNwZWMKKyAqCisgKiBtZW1jcHkgY29waWVzIGxlbiBieXRlcyBmcm9tIHNyYyB0byBkc3QgYW5kIHNldHMgdjAgdG8gZHN0LgorICogSXQgYXNzdW1lcyB0aGF0CisgKiAgIC0gc3JjIGFuZCBkc3QgZG9uJ3Qgb3ZlcmxhcAorICogICAtIHNyYyBpcyByZWFkYWJsZQorICogICAtIGRzdCBpcyB3cml0YWJsZQorICogbWVtY3B5IHVzZXMgdGhlIHN0YW5kYXJkIGNhbGxpbmcgY29udmVudGlvbgorICoKKyAqIF9fY29weV91c2VyIGNvcGllcyB1cCB0byBsZW4gYnl0ZXMgZnJvbSBzcmMgdG8gZHN0IGFuZCBzZXRzIGEyIChsZW4pIHRvCisgKiB0aGUgbnVtYmVyIG9mIHVuY29waWVkIGJ5dGVzIGR1ZSB0byBhbiBleGNlcHRpb24gY2F1c2VkIGJ5IGEgcmVhZCBvciB3cml0ZS4KKyAqIF9fY29weV91c2VyIGFzc3VtZXMgdGhhdCBzcmMgYW5kIGRzdCBkb24ndCBvdmVybGFwLCBhbmQgdGhhdCB0aGUgY2FsbCBpcworICogaW1wbGVtZW50aW5nIG9uZSBvZiB0aGUgZm9sbG93aW5nOgorICogICBjb3B5X3RvX3VzZXIKKyAqICAgICAtIHNyYyBpcyByZWFkYWJsZSAgKG5vIGV4Y2VwdGlvbnMgd2hlbiByZWFkaW5nIHNyYykKKyAqICAgY29weV9mcm9tX3VzZXIKKyAqICAgICAtIGRzdCBpcyB3cml0YWJsZSAgKG5vIGV4Y2VwdGlvbnMgd2hlbiB3cml0aW5nIGRzdCkKKyAqIF9fY29weV91c2VyIHVzZXMgYSBub24tc3RhbmRhcmQgY2FsbGluZyBjb252ZW50aW9uOyBzZWUKKyAqIGFyY2gvbWlwcy9pbmNsdWRlL2FzbS91YWNjZXNzLmgKKyAqCisgKiBXaGVuIGFuIGV4Y2VwdGlvbiBoYXBwZW5zIG9uIGEgbG9hZCwgdGhlIGhhbmRsZXIgbXVzdAorICMgZW5zdXJlIHRoYXQgYWxsIG9mIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIgaXMgb3ZlcndyaXR0ZW4gdG8gcHJldmVudAorICogbGVha2luZyBpbmZvcm1hdGlvbiB0byB1c2VyIG1vZGUgcHJvZ3JhbXMuCisgKi8KKworLyoKKyAqIEltcGxlbWVudGF0aW9uCisgKi8KKworLyoKKyAqIFRoZSBleGNlcHRpb24gaGFuZGxlciBmb3IgbG9hZHMgcmVxdWlyZXMgdGhhdDoKKyAqICAxLSBBVCBjb250YWluIHRoZSBhZGRyZXNzIG9mIHRoZSBieXRlIGp1c3QgcGFzdCB0aGUgZW5kIG9mIHRoZSBzb3VyY2UKKyAqICAgICBvZiB0aGUgY29weSwKKyAqICAyLSBzcmNfZW50cnkgPD0gc3JjIDwgQVQsIGFuZAorICogIDMtIChkc3QgLSBzcmMpID09IChkc3RfZW50cnkgLSBzcmNfZW50cnkpLAorICogVGhlIF9lbnRyeSBzdWZmaXggZGVub3RlcyB2YWx1ZXMgd2hlbiBfX2NvcHlfdXNlciB3YXMgY2FsbGVkLgorICoKKyAqICgxKSBpcyBzZXQgdXAgdXAgYnkgdWFjY2Vzcy5oIGFuZCBtYWludGFpbmVkIGJ5IG5vdCB3cml0aW5nIEFUIGluIGNvcHlfdXNlcgorICogKDIpIGlzIG1ldCBieSBpbmNyZW1lbnRpbmcgc3JjIGJ5IHRoZSBudW1iZXIgb2YgYnl0ZXMgY29waWVkCisgKiAoMykgaXMgbWV0IGJ5IG5vdCBkb2luZyBsb2FkcyBiZXR3ZWVuIGEgcGFpciBvZiBpbmNyZW1lbnRzIG9mIGRzdCBhbmQgc3JjCisgKgorICogVGhlIGV4Y2VwdGlvbiBoYW5kbGVycyBmb3Igc3RvcmVzIGFkanVzdCBsZW4gKGlmIG5lY2Vzc2FyeSkgYW5kIHJldHVybi4KKyAqIFRoZXNlIGhhbmRsZXJzIGRvIG5vdCBuZWVkIHRvIG92ZXJ3cml0ZSBhbnkgZGF0YS4KKyAqCisgKiBGb3IgX19ybWVtY3B5IGFuZCBtZW1tb3ZlIGFuIGV4Y2VwdGlvbiBpcyBhbHdheXMgYSBrZXJuZWwgYnVnLCB0aGVyZWZvcmUKKyAqIHRoZXkncmUgbm90IHByb3RlY3RlZC4KKyAqLworCisjZGVmaW5lIEVYQyhpbnN0X3JlZyxhZGRyLGhhbmRsZXIpCQlcCis5OglpbnN0X3JlZywgYWRkcjsJCQkJXAorCS5zZWN0aW9uIF9fZXhfdGFibGUsImEiOwkJXAorCVBUUgk5YiwgaGFuZGxlcjsJCQlcCisJLnByZXZpb3VzCisKKy8qCisgKiBPbmx5IG9uIHRoZSA2NC1iaXQga2VybmVsIHdlIGNhbiBtYWRlIHVzZSBvZiA2NC1iaXQgcmVnaXN0ZXJzLgorICovCisjaWZkZWYgQ09ORklHXzY0QklUCisjZGVmaW5lIFVTRV9ET1VCTEUKKyNlbmRpZgorCisjaWZkZWYgVVNFX0RPVUJMRQorCisjZGVmaW5lIExPQUQgICBsZAorI2RlZmluZSBMT0FETCAgbGRsCisjZGVmaW5lIExPQURSICBsZHIKKyNkZWZpbmUgU1RPUkVMIHNkbAorI2RlZmluZSBTVE9SRVIgc2RyCisjZGVmaW5lIFNUT1JFICBzZAorI2RlZmluZSBBREQgICAgZGFkZHUKKyNkZWZpbmUgU1VCICAgIGRzdWJ1CisjZGVmaW5lIFNSTCAgICBkc3JsCisjZGVmaW5lIFNSQSAgICBkc3JhCisjZGVmaW5lIFNMTCAgICBkc2xsCisjZGVmaW5lIFNMTFYgICBkc2xsdgorI2RlZmluZSBTUkxWICAgZHNybHYKKyNkZWZpbmUgTkJZVEVTIDgKKyNkZWZpbmUgTE9HX05CWVRFUyAzCisKKy8qCisgKiBBcyB3ZSBhcmUgc2hhcmluZyBjb2RlIGJhc2Ugd2l0aCB0aGUgbWlwczMyIHRyZWUgKHdoaWNoIHVzZSB0aGUgbzMyIEFCSQorICogcmVnaXN0ZXIgZGVmaW5pdGlvbnMpLiBXZSBuZWVkIHRvIHJlZGVmaW5lIHRoZSByZWdpc3RlciBkZWZpbml0aW9ucyBmcm9tCisgKiB0aGUgbjY0IEFCSSByZWdpc3RlciBuYW1pbmcgdG8gdGhlIG8zMiBBQkkgcmVnaXN0ZXIgbmFtaW5nLgorICovCisjdW5kZWYgdDAKKyN1bmRlZiB0MQorI3VuZGVmIHQyCisjdW5kZWYgdDMKKyNkZWZpbmUgdDAJJDgKKyNkZWZpbmUgdDEJJDkKKyNkZWZpbmUgdDIJJDEwCisjZGVmaW5lIHQzCSQxMQorI2RlZmluZSB0NAkkMTIKKyNkZWZpbmUgdDUJJDEzCisjZGVmaW5lIHQ2CSQxNAorI2RlZmluZSB0NwkkMTUKKworI2Vsc2UKKworI2RlZmluZSBMT0FEICAgbHcKKyNkZWZpbmUgTE9BREwgIGx3bAorI2RlZmluZSBMT0FEUiAgbHdyCisjZGVmaW5lIFNUT1JFTCBzd2wKKyNkZWZpbmUgU1RPUkVSIHN3cgorI2RlZmluZSBTVE9SRSAgc3cKKyNkZWZpbmUgQUREICAgIGFkZHUKKyNkZWZpbmUgU1VCICAgIHN1YnUKKyNkZWZpbmUgU1JMICAgIHNybAorI2RlZmluZSBTTEwgICAgc2xsCisjZGVmaW5lIFNSQSAgICBzcmEKKyNkZWZpbmUgU0xMViAgIHNsbHYKKyNkZWZpbmUgU1JMViAgIHNybHYKKyNkZWZpbmUgTkJZVEVTIDQKKyNkZWZpbmUgTE9HX05CWVRFUyAyCisKKyNlbmRpZiAvKiBVU0VfRE9VQkxFICovCisKKyNpZmRlZiBDT05GSUdfQ1BVX0xJVFRMRV9FTkRJQU4KKyNkZWZpbmUgTERGSVJTVCBMT0FEUgorI2RlZmluZSBMRFJFU1QgIExPQURMCisjZGVmaW5lIFNURklSU1QgU1RPUkVSCisjZGVmaW5lIFNUUkVTVCAgU1RPUkVMCisjZGVmaW5lIFNISUZUX0RJU0NBUkQgU0xMVgorI2Vsc2UKKyNkZWZpbmUgTERGSVJTVCBMT0FETAorI2RlZmluZSBMRFJFU1QgIExPQURSCisjZGVmaW5lIFNURklSU1QgU1RPUkVMCisjZGVmaW5lIFNUUkVTVCAgU1RPUkVSCisjZGVmaW5lIFNISUZUX0RJU0NBUkQgU1JMVgorI2VuZGlmCisKKyNkZWZpbmUgRklSU1QodW5pdCkgKCh1bml0KSpOQllURVMpCisjZGVmaW5lIFJFU1QodW5pdCkgIChGSVJTVCh1bml0KStOQllURVMtMSkKKyNkZWZpbmUgVU5JVCh1bml0KSAgRklSU1QodW5pdCkKKworI2RlZmluZSBBRERSTUFTSyAoTkJZVEVTLTEpCisKKwkudGV4dAorCS5zZXQJbm9yZW9yZGVyCisJLnNldAlub2F0CisKKy8qCisgKiBBIGNvbWJpbmVkIG1lbWNweS9fX2NvcHlfdXNlcgorICogX19jb3B5X3VzZXIgc2V0cyBsZW4gdG8gMCBmb3Igc3VjY2VzczsgZWxzZSB0byBhbiB1cHBlciBib3VuZCBvZgorICogdGhlIG51bWJlciBvZiB1bmNvcGllZCBieXRlcy4KKyAqIG1lbWNweSBzZXRzIHYwIHRvIGRzdC4KKyAqLworCS5hbGlnbgk1CitMRUFGKG1lbWNweSkJCQkJCS8qIGEwPWRzdCBhMT1zcmMgYTI9bGVuICovCisJbW92ZQl2MCwgZHN0CQkJCS8qIHJldHVybiB2YWx1ZSAqLworX19tZW1jcHk6CitGRVhQT1JUKF9fY29weV91c2VyKQorCS8qCisJICogTm90ZTogZHN0ICYgc3JjIG1heSBiZSB1bmFsaWduZWQsIGxlbiBtYXkgYmUgMAorCSAqIFRlbXBzCisJICovCisJIworCSMgT2N0ZW9uIGRvZXNuJ3QgY2FyZSBpZiB0aGUgZGVzdGluYXRpb24gaXMgdW5hbGlnbmVkLiBUaGUgaGFyZHdhcmUKKwkjIGNhbiBmaXggaXQgZmFzdGVyIHRoYW4gd2UgY2FuIHNwZWNpYWwgY2FzZSB0aGUgYXNzZW1ibHkuCisJIworCXByZWYJMCwgMChzcmMpCisJc2x0dQl0MCwgbGVuLCBOQllURVMJCSMgQ2hlY2sgaWYgPCAxIHdvcmQKKwlibmV6CXQwLCBjb3B5X2J5dGVzX2NoZWNrbGVuCisJIGFuZAl0MCwgc3JjLCBBRERSTUFTSwkjIENoZWNrIGlmIHNyYyB1bmFsaWduZWQKKwlibmV6CXQwLCBzcmNfdW5hbGlnbmVkCisJIHNsdHUJdDAsIGxlbiwgNCpOQllURVMJIyBDaGVjayBpZiA8IDQgd29yZHMKKwlibmV6CXQwLCBsZXNzX3RoYW5fNHVuaXRzCisJIHNsdHUJdDAsIGxlbiwgOCpOQllURVMJIyBDaGVjayBpZiA8IDggd29yZHMKKwlibmV6CXQwLCBsZXNzX3RoYW5fOHVuaXRzCisJIHNsdHUJdDAsIGxlbiwgMTYqTkJZVEVTCSMgQ2hlY2sgaWYgPCAxNiB3b3JkcworCWJuZXoJdDAsIGNsZWFudXBfYm90aF9hbGlnbmVkCisJIHNsdHUJdDAsIGxlbiwgMTI4KzEJCSMgQ2hlY2sgaWYgbGVuIDwgMTI5CisJYm5legl0MCwgMWYJCQkjIFNraXAgcHJlZmV0Y2ggaWYgbGVuIGlzIHRvbyBzaG9ydAorCSBzbHR1CXQwLCBsZW4sIDI1NisxCQkjIENoZWNrIGlmIGxlbiA8IDI1NworCWJuZXoJdDAsIDFmCQkJIyBTa2lwIHByZWZldGNoIGlmIGxlbiBpcyB0b28gc2hvcnQKKwkgcHJlZgkwLCAxMjgoc3JjKQkJIyBXZSBtdXN0IG5vdCBwcmVmZXRjaCBpbnZhbGlkIGFkZHJlc3NlcworCSMKKwkjIFRoaXMgaXMgd2hlcmUgd2UgbG9vcCBpZiB0aGVyZSBpcyBtb3JlIHRoYW4gMTI4IGJ5dGVzIGxlZnQKKzI6CXByZWYJMCwgMjU2KHNyYykJCSMgV2UgbXVzdCBub3QgcHJlZmV0Y2ggaW52YWxpZCBhZGRyZXNzZXMKKwkjCisJIyBUaGlzIGlzIHdoZXJlIHdlIGxvb3AgaWYgd2UgY2FuJ3QgcHJlZmV0Y2ggYW55bW9yZQorMToKK0VYQygJTE9BRAl0MCwgVU5JVCgwKShzcmMpLAlsX2V4YykKK0VYQygJTE9BRAl0MSwgVU5JVCgxKShzcmMpLAlsX2V4Y19jb3B5KQorRVhDKAlMT0FECXQyLCBVTklUKDIpKHNyYyksCWxfZXhjX2NvcHkpCitFWEMoCUxPQUQJdDMsIFVOSVQoMykoc3JjKSwJbF9leGNfY29weSkKKwlTVUIJbGVuLCBsZW4sIDE2Kk5CWVRFUworRVhDKAlTVE9SRQl0MCwgVU5JVCgwKShkc3QpLAlzX2V4Y19wMTZ1KQorRVhDKAlTVE9SRQl0MSwgVU5JVCgxKShkc3QpLAlzX2V4Y19wMTV1KQorRVhDKAlTVE9SRQl0MiwgVU5JVCgyKShkc3QpLAlzX2V4Y19wMTR1KQorRVhDKAlTVE9SRQl0MywgVU5JVCgzKShkc3QpLAlzX2V4Y19wMTN1KQorRVhDKAlMT0FECXQwLCBVTklUKDQpKHNyYyksCWxfZXhjX2NvcHkpCitFWEMoCUxPQUQJdDEsIFVOSVQoNSkoc3JjKSwJbF9leGNfY29weSkKK0VYQygJTE9BRAl0MiwgVU5JVCg2KShzcmMpLAlsX2V4Y19jb3B5KQorRVhDKAlMT0FECXQzLCBVTklUKDcpKHNyYyksCWxfZXhjX2NvcHkpCitFWEMoCVNUT1JFCXQwLCBVTklUKDQpKGRzdCksCXNfZXhjX3AxMnUpCitFWEMoCVNUT1JFCXQxLCBVTklUKDUpKGRzdCksCXNfZXhjX3AxMXUpCitFWEMoCVNUT1JFCXQyLCBVTklUKDYpKGRzdCksCXNfZXhjX3AxMHUpCisJQURECXNyYywgc3JjLCAxNipOQllURVMKK0VYQygJU1RPUkUJdDMsIFVOSVQoNykoZHN0KSwJc19leGNfcDl1KQorCUFERAlkc3QsIGRzdCwgMTYqTkJZVEVTCitFWEMoCUxPQUQJdDAsIFVOSVQoLTgpKHNyYyksCWxfZXhjX2NvcHkpCitFWEMoCUxPQUQJdDEsIFVOSVQoLTcpKHNyYyksCWxfZXhjX2NvcHkpCitFWEMoCUxPQUQJdDIsIFVOSVQoLTYpKHNyYyksCWxfZXhjX2NvcHkpCitFWEMoCUxPQUQJdDMsIFVOSVQoLTUpKHNyYyksCWxfZXhjX2NvcHkpCitFWEMoCVNUT1JFCXQwLCBVTklUKC04KShkc3QpLAlzX2V4Y19wOHUpCitFWEMoCVNUT1JFCXQxLCBVTklUKC03KShkc3QpLAlzX2V4Y19wN3UpCitFWEMoCVNUT1JFCXQyLCBVTklUKC02KShkc3QpLAlzX2V4Y19wNnUpCitFWEMoCVNUT1JFCXQzLCBVTklUKC01KShkc3QpLAlzX2V4Y19wNXUpCitFWEMoCUxPQUQJdDAsIFVOSVQoLTQpKHNyYyksCWxfZXhjX2NvcHkpCitFWEMoCUxPQUQJdDEsIFVOSVQoLTMpKHNyYyksCWxfZXhjX2NvcHkpCitFWEMoCUxPQUQJdDIsIFVOSVQoLTIpKHNyYyksCWxfZXhjX2NvcHkpCitFWEMoCUxPQUQJdDMsIFVOSVQoLTEpKHNyYyksCWxfZXhjX2NvcHkpCitFWEMoCVNUT1JFCXQwLCBVTklUKC00KShkc3QpLAlzX2V4Y19wNHUpCitFWEMoCVNUT1JFCXQxLCBVTklUKC0zKShkc3QpLAlzX2V4Y19wM3UpCitFWEMoCVNUT1JFCXQyLCBVTklUKC0yKShkc3QpLAlzX2V4Y19wMnUpCitFWEMoCVNUT1JFCXQzLCBVTklUKC0xKShkc3QpLAlzX2V4Y19wMXUpCisJc2x0dQl0MCwgbGVuLCAyNTYrMQkJIyBTZWUgaWYgd2UgY2FuIHByZWZldGNoIG1vcmUKKwliZXF6CXQwLCAyYgorCSBzbHR1CXQwLCBsZW4sIDEyOAkJIyBTZWUgaWYgd2UgY2FuIGxvb3AgbW9yZSB0aW1lCisJYmVxegl0MCwgMWIKKwkgbm9wCisJIworCSMgSnVtcCBoZXJlIGlmIHRoZXJlIGFyZSBsZXNzIHRoYW4gMTYqTkJZVEVTIGxlZnQuCisJIworY2xlYW51cF9ib3RoX2FsaWduZWQ6CisJYmVxeglsZW4sIGRvbmUKKwkgc2x0dQl0MCwgbGVuLCA4Kk5CWVRFUworCWJuZXoJdDAsIGxlc3NfdGhhbl84dW5pdHMKKwkgbm9wCitFWEMoCUxPQUQJdDAsIFVOSVQoMCkoc3JjKSwJbF9leGMpCitFWEMoCUxPQUQJdDEsIFVOSVQoMSkoc3JjKSwJbF9leGNfY29weSkKK0VYQygJTE9BRAl0MiwgVU5JVCgyKShzcmMpLAlsX2V4Y19jb3B5KQorRVhDKAlMT0FECXQzLCBVTklUKDMpKHNyYyksCWxfZXhjX2NvcHkpCisJU1VCCWxlbiwgbGVuLCA4Kk5CWVRFUworRVhDKAlTVE9SRQl0MCwgVU5JVCgwKShkc3QpLAlzX2V4Y19wOHUpCitFWEMoCVNUT1JFCXQxLCBVTklUKDEpKGRzdCksCXNfZXhjX3A3dSkKK0VYQygJU1RPUkUJdDIsIFVOSVQoMikoZHN0KSwJc19leGNfcDZ1KQorRVhDKAlTVE9SRQl0MywgVU5JVCgzKShkc3QpLAlzX2V4Y19wNXUpCitFWEMoCUxPQUQJdDAsIFVOSVQoNCkoc3JjKSwJbF9leGNfY29weSkKK0VYQygJTE9BRAl0MSwgVU5JVCg1KShzcmMpLAlsX2V4Y19jb3B5KQorRVhDKAlMT0FECXQyLCBVTklUKDYpKHNyYyksCWxfZXhjX2NvcHkpCitFWEMoCUxPQUQJdDMsIFVOSVQoNykoc3JjKSwJbF9leGNfY29weSkKK0VYQygJU1RPUkUJdDAsIFVOSVQoNCkoZHN0KSwJc19leGNfcDR1KQorRVhDKAlTVE9SRQl0MSwgVU5JVCg1KShkc3QpLAlzX2V4Y19wM3UpCitFWEMoCVNUT1JFCXQyLCBVTklUKDYpKGRzdCksCXNfZXhjX3AydSkKK0VYQygJU1RPUkUJdDMsIFVOSVQoNykoZHN0KSwJc19leGNfcDF1KQorCUFERAlzcmMsIHNyYywgOCpOQllURVMKKwliZXF6CWxlbiwgZG9uZQorCSBBREQJZHN0LCBkc3QsIDgqTkJZVEVTCisJIworCSMgSnVtcCBoZXJlIGlmIHRoZXJlIGFyZSBsZXNzIHRoYW4gOCpOQllURVMgbGVmdC4KKwkjCitsZXNzX3RoYW5fOHVuaXRzOgorCXNsdHUJdDAsIGxlbiwgNCpOQllURVMKKwlibmV6CXQwLCBsZXNzX3RoYW5fNHVuaXRzCisJIG5vcAorRVhDKAlMT0FECXQwLCBVTklUKDApKHNyYyksCWxfZXhjKQorRVhDKAlMT0FECXQxLCBVTklUKDEpKHNyYyksCWxfZXhjX2NvcHkpCitFWEMoCUxPQUQJdDIsIFVOSVQoMikoc3JjKSwJbF9leGNfY29weSkKK0VYQygJTE9BRAl0MywgVU5JVCgzKShzcmMpLAlsX2V4Y19jb3B5KQorCVNVQglsZW4sIGxlbiwgNCpOQllURVMKK0VYQygJU1RPUkUJdDAsIFVOSVQoMCkoZHN0KSwJc19leGNfcDR1KQorRVhDKAlTVE9SRQl0MSwgVU5JVCgxKShkc3QpLAlzX2V4Y19wM3UpCitFWEMoCVNUT1JFCXQyLCBVTklUKDIpKGRzdCksCXNfZXhjX3AydSkKK0VYQygJU1RPUkUJdDMsIFVOSVQoMykoZHN0KSwJc19leGNfcDF1KQorCUFERAlzcmMsIHNyYywgNCpOQllURVMKKwliZXF6CWxlbiwgZG9uZQorCSBBREQJZHN0LCBkc3QsIDQqTkJZVEVTCisJIworCSMgSnVtcCBoZXJlIGlmIHRoZXJlIGFyZSBsZXNzIHRoYW4gNCpOQllURVMgbGVmdC4gVGhpcyBtZWFucworCSMgd2UgbWF5IG5lZWQgdG8gY29weSB1cCB0byAzIE5CWVRFUyB3b3Jkcy4KKwkjCitsZXNzX3RoYW5fNHVuaXRzOgorCXNsdHUJdDAsIGxlbiwgMSpOQllURVMKKwlibmV6CXQwLCBjb3B5X2J5dGVzX2NoZWNrbGVuCisJIG5vcAorCSMKKwkjIDEpIENvcHkgTkJZVEVTLCB0aGVuIGNoZWNrIGxlbmd0aCBhZ2FpbgorCSMKK0VYQygJTE9BRAl0MCwgMChzcmMpLAkJbF9leGMpCisJU1VCCWxlbiwgbGVuLCBOQllURVMKKwlzbHR1CXQxLCBsZW4sIDgKK0VYQygJU1RPUkUJdDAsIDAoZHN0KSwJCXNfZXhjX3AxdSkKKwlBREQJc3JjLCBzcmMsIE5CWVRFUworCWJuZXoJdDEsIGNvcHlfYnl0ZXNfY2hlY2tsZW4KKwkgQURECWRzdCwgZHN0LCBOQllURVMKKwkjCisJIyAyKSBDb3B5IE5CWVRFUywgdGhlbiBjaGVjayBsZW5ndGggYWdhaW4KKwkjCitFWEMoCUxPQUQJdDAsIDAoc3JjKSwJCWxfZXhjKQorCVNVQglsZW4sIGxlbiwgTkJZVEVTCisJc2x0dQl0MSwgbGVuLCA4CitFWEMoCVNUT1JFCXQwLCAwKGRzdCksCQlzX2V4Y19wMXUpCisJQURECXNyYywgc3JjLCBOQllURVMKKwlibmV6CXQxLCBjb3B5X2J5dGVzX2NoZWNrbGVuCisJIEFERAlkc3QsIGRzdCwgTkJZVEVTCisJIworCSMgMykgQ29weSBOQllURVMsIHRoZW4gY2hlY2sgbGVuZ3RoIGFnYWluCisJIworRVhDKAlMT0FECXQwLCAwKHNyYyksCQlsX2V4YykKKwlTVUIJbGVuLCBsZW4sIE5CWVRFUworCUFERAlzcmMsIHNyYywgTkJZVEVTCisJQURECWRzdCwgZHN0LCBOQllURVMKKwliIGNvcHlfYnl0ZXNfY2hlY2tsZW4KK0VYQygJIFNUT1JFCXQwLCAtOChkc3QpLAkJc19leGNfcDF1KQorCitzcmNfdW5hbGlnbmVkOgorI2RlZmluZSByZW0gdDgKKwlTUkwJdDAsIGxlbiwgTE9HX05CWVRFUysyICAgICMgKzIgZm9yIDQgdW5pdHMvaXRlcgorCWJlcXoJdDAsIGNsZWFudXBfc3JjX3VuYWxpZ25lZAorCSBhbmQJcmVtLCBsZW4sICg0Kk5CWVRFUy0xKSAgICMgcmVtID0gbGVuICUgNCpOQllURVMKKzE6CisvKgorICogQXZvaWQgY29uc2VjdXRpdmUgTEQqJ3MgdG8gdGhlIHNhbWUgcmVnaXN0ZXIgc2luY2Ugc29tZSBtaXBzCisgKiBpbXBsZW1lbnRhdGlvbnMgY2FuJ3QgaXNzdWUgdGhlbSBpbiB0aGUgc2FtZSBjeWNsZS4KKyAqIEl0J3MgT0sgdG8gbG9hZCBGSVJTVChOKzEpIGJlZm9yZSBSRVNUKE4pIGJlY2F1c2UgdGhlIHR3byBhZGRyZXNzZXMKKyAqIGFyZSB0byB0aGUgc2FtZSB1bml0ICh1bmxlc3Mgc3JjIGlzIGFsaWduZWQsIGJ1dCBpdCdzIG5vdCkuCisgKi8KK0VYQygJTERGSVJTVAl0MCwgRklSU1QoMCkoc3JjKSwJbF9leGMpCitFWEMoCUxERklSU1QJdDEsIEZJUlNUKDEpKHNyYyksCWxfZXhjX2NvcHkpCisJU1VCICAgICBsZW4sIGxlbiwgNCpOQllURVMKK0VYQygJTERSRVNUCXQwLCBSRVNUKDApKHNyYyksCWxfZXhjX2NvcHkpCitFWEMoCUxEUkVTVAl0MSwgUkVTVCgxKShzcmMpLAlsX2V4Y19jb3B5KQorRVhDKAlMREZJUlNUCXQyLCBGSVJTVCgyKShzcmMpLAlsX2V4Y19jb3B5KQorRVhDKAlMREZJUlNUCXQzLCBGSVJTVCgzKShzcmMpLAlsX2V4Y19jb3B5KQorRVhDKAlMRFJFU1QJdDIsIFJFU1QoMikoc3JjKSwJbF9leGNfY29weSkKK0VYQygJTERSRVNUCXQzLCBSRVNUKDMpKHNyYyksCWxfZXhjX2NvcHkpCisJQURECXNyYywgc3JjLCA0Kk5CWVRFUworRVhDKAlTVE9SRQl0MCwgVU5JVCgwKShkc3QpLAlzX2V4Y19wNHUpCitFWEMoCVNUT1JFCXQxLCBVTklUKDEpKGRzdCksCXNfZXhjX3AzdSkKK0VYQygJU1RPUkUJdDIsIFVOSVQoMikoZHN0KSwJc19leGNfcDJ1KQorRVhDKAlTVE9SRQl0MywgVU5JVCgzKShkc3QpLAlzX2V4Y19wMXUpCisJYm5lCWxlbiwgcmVtLCAxYgorCSBBREQJZHN0LCBkc3QsIDQqTkJZVEVTCisKK2NsZWFudXBfc3JjX3VuYWxpZ25lZDoKKwliZXF6CWxlbiwgZG9uZQorCSBhbmQJcmVtLCBsZW4sIE5CWVRFUy0xICAjIHJlbSA9IGxlbiAlIE5CWVRFUworCWJlcQlyZW0sIGxlbiwgY29weV9ieXRlcworCSBub3AKKzE6CitFWEMoCUxERklSU1QgdDAsIEZJUlNUKDApKHNyYyksCWxfZXhjKQorRVhDKAlMRFJFU1QJdDAsIFJFU1QoMCkoc3JjKSwJbF9leGNfY29weSkKKwlTVUIJbGVuLCBsZW4sIE5CWVRFUworRVhDKAlTVE9SRQl0MCwgMChkc3QpLAkJc19leGNfcDF1KQorCUFERAlzcmMsIHNyYywgTkJZVEVTCisJYm5lCWxlbiwgcmVtLCAxYgorCSBBREQJZHN0LCBkc3QsIE5CWVRFUworCitjb3B5X2J5dGVzX2NoZWNrbGVuOgorCWJlcXoJbGVuLCBkb25lCisJIG5vcAorY29weV9ieXRlczoKKwkvKiAwIDwgbGVuIDwgTkJZVEVTICAqLworI2RlZmluZSBDT1BZX0JZVEUoTikJCQlcCitFWEMoCWxiCXQwLCBOKHNyYyksIGxfZXhjKTsJXAorCVNVQglsZW4sIGxlbiwgMTsJCVwKKwliZXF6CWxlbiwgZG9uZTsJCVwKK0VYQygJIHNiCXQwLCBOKGRzdCksIHNfZXhjX3AxKQorCisJQ09QWV9CWVRFKDApCisJQ09QWV9CWVRFKDEpCisjaWZkZWYgVVNFX0RPVUJMRQorCUNPUFlfQllURSgyKQorCUNPUFlfQllURSgzKQorCUNPUFlfQllURSg0KQorCUNPUFlfQllURSg1KQorI2VuZGlmCitFWEMoCWxiCXQwLCBOQllURVMtMihzcmMpLCBsX2V4YykKKwlTVUIJbGVuLCBsZW4sIDEKKwlqcglyYQorRVhDKAkgc2IJdDAsIE5CWVRFUy0yKGRzdCksIHNfZXhjX3AxKQorZG9uZToKKwlqcglyYQorCSBub3AKKwlFTkQobWVtY3B5KQorCitsX2V4Y19jb3B5OgorCS8qCisJICogQ29weSBieXRlcyBmcm9tIHNyYyB1bnRpbCBmYXVsdGluZyBsb2FkIGFkZHJlc3MgKG9yIHVudGlsIGEKKwkgKiBsYiBmYXVsdHMpCisJICoKKwkgKiBXaGVuIHJlYWNoZWQgYnkgYSBmYXVsdGluZyBMREZJUlNUL0xEUkVTVCwgVEhSRUFEX0JVQUREUigkMjgpCisJICogbWF5IGJlIG1vcmUgdGhhbiBhIGJ5dGUgYmV5b25kIHRoZSBsYXN0IGFkZHJlc3MuCisJICogSGVuY2UsIHRoZSBsYiBiZWxvdyBtYXkgZ2V0IGFuIGV4Y2VwdGlvbi4KKwkgKgorCSAqIEFzc3VtZXMgc3JjIDwgVEhSRUFEX0JVQUREUigkMjgpCisJICovCisJTE9BRAl0MCwgVElfVEFTSygkMjgpCisJIG5vcAorCUxPQUQJdDAsIFRIUkVBRF9CVUFERFIodDApCisxOgorRVhDKAlsYgl0MSwgMChzcmMpLAlsX2V4YykKKwlBREQJc3JjLCBzcmMsIDEKKwlzYgl0MSwgMChkc3QpCSMgY2FuJ3QgZmF1bHQgLS0gd2UncmUgY29weV9mcm9tX3VzZXIKKwlibmUJc3JjLCB0MCwgMWIKKwkgQURECWRzdCwgZHN0LCAxCitsX2V4YzoKKwlMT0FECXQwLCBUSV9UQVNLKCQyOCkKKwkgbm9wCisJTE9BRAl0MCwgVEhSRUFEX0JVQUREUih0MCkJIyB0MCBpcyBqdXN0IHBhc3QgbGFzdCBnb29kIGFkZHJlc3MKKwkgbm9wCisJU1VCCWxlbiwgQVQsIHQwCQkjIGxlbiBudW1iZXIgb2YgdW5jb3BpZWQgYnl0ZXMKKwkvKgorCSAqIEhlcmUncyB3aGVyZSB3ZSByZWx5IG9uIHNyYyBhbmQgZHN0IGJlaW5nIGluY3JlbWVudGVkIGluIHRhbmRlbSwKKwkgKiAgIFNlZSAoMykgYWJvdmUuCisJICogZHN0ICs9IChmYXVsdCBhZGRyIC0gc3JjKSB0byBwdXQgZHN0IGF0IGZpcnN0IGJ5dGUgdG8gY2xlYXIKKwkgKi8KKwlBREQJZHN0LCB0MAkJCSMgY29tcHV0ZSBzdGFydCBhZGRyZXNzIGluIGExCisJU1VCCWRzdCwgc3JjCisJLyoKKwkgKiBDbGVhciBsZW4gYnl0ZXMgc3RhcnRpbmcgYXQgZHN0LiAgQ2FuJ3QgY2FsbCBfX2J6ZXJvIGJlY2F1c2UgaXQKKwkgKiBtaWdodCBtb2RpZnkgbGVuLiAgQW4gaW5lZmZpY2llbnQgbG9vcCBmb3IgdGhlc2UgcmFyZSB0aW1lcy4uLgorCSAqLworCWJlcXoJbGVuLCBkb25lCisJIFNVQglzcmMsIGxlbiwgMQorMToJc2IJemVybywgMChkc3QpCisJQURECWRzdCwgZHN0LCAxCisJYm5leglzcmMsIDFiCisJIFNVQglzcmMsIHNyYywgMQorCWpyCXJhCisJIG5vcAorCisKKyNkZWZpbmUgU0VYQyhuKQkJCQlcCitzX2V4Y19wICMjIG4gIyMgdToJCQlcCisJanIJcmE7CQkJXAorCSBBREQJbGVuLCBsZW4sIG4qTkJZVEVTCisKK1NFWEMoMTYpCitTRVhDKDE1KQorU0VYQygxNCkKK1NFWEMoMTMpCitTRVhDKDEyKQorU0VYQygxMSkKK1NFWEMoMTApCitTRVhDKDkpCitTRVhDKDgpCitTRVhDKDcpCitTRVhDKDYpCitTRVhDKDUpCitTRVhDKDQpCitTRVhDKDMpCitTRVhDKDIpCitTRVhDKDEpCisKK3NfZXhjX3AxOgorCWpyCXJhCisJIEFERAlsZW4sIGxlbiwgMQorc19leGM6CisJanIJcmEKKwkgbm9wCisKKwkuYWxpZ24JNQorTEVBRihtZW1tb3ZlKQorCUFERAl0MCwgYTAsIGEyCisJQURECXQxLCBhMSwgYTIKKwlzbHR1CXQwLCBhMSwgdDAJCQkjIGRzdCArIGxlbiA8PSBzcmMgLT4gbWVtY3B5CisJc2x0dQl0MSwgYTAsIHQxCQkJIyBkc3QgPj0gc3JjICsgbGVuIC0+IG1lbWNweQorCWFuZAl0MCwgdDEKKwliZXF6CXQwLCBfX21lbWNweQorCSBtb3ZlCXYwLCBhMAkJCQkvKiByZXR1cm4gdmFsdWUgKi8KKwliZXF6CWEyLCByX291dAorCUVORChtZW1tb3ZlKQorCisJLyogZmFsbCB0aHJvdWdoIHRvIF9fcm1lbWNweSAqLworTEVBRihfX3JtZW1jcHkpCQkJCQkvKiBhMD1kc3QgYTE9c3JjIGEyPWxlbiAqLworCSBzbHR1CXQwLCBhMSwgYTAKKwliZXF6CXQwLCByX2VuZF9ieXRlc191cAkJIyBzcmMgPj0gZHN0CisJIG5vcAorCUFERAlhMCwgYTIJCQkJIyBkc3QgPSBkc3QgKyBsZW4KKwlBREQJYTEsIGEyCQkJCSMgc3JjID0gc3JjICsgbGVuCisKK3JfZW5kX2J5dGVzOgorCWxiCXQwLCAtMShhMSkKKwlTVUIJYTIsIGEyLCAweDEKKwlzYgl0MCwgLTEoYTApCisJU1VCCWExLCBhMSwgMHgxCisJYm5leglhMiwgcl9lbmRfYnl0ZXMKKwkgU1VCCWEwLCBhMCwgMHgxCisKK3Jfb3V0OgorCWpyCXJhCisJIG1vdmUJYTIsIHplcm8KKworcl9lbmRfYnl0ZXNfdXA6CisJbGIJdDAsIChhMSkKKwlTVUIJYTIsIGEyLCAweDEKKwlzYgl0MCwgKGEwKQorCUFERAlhMSwgYTEsIDB4MQorCWJuZXoJYTIsIHJfZW5kX2J5dGVzX3VwCisJIEFERAlhMCwgYTAsIDB4MQorCisJanIJcmEKKwkgbW92ZQlhMiwgemVybworCUVORChfX3JtZW1jcHkpCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvY2F2aXVtLW9jdGVvbi9zZXJpYWwuYyBiL2FyY2gvbWlwcy9jYXZpdW0tb2N0ZW9uL3NlcmlhbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyNDA3MjgKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21pcHMvY2F2aXVtLW9jdGVvbi9zZXJpYWwuYwpAQCAtMCwwICsxLDEzNiBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDA3IENhdml1bSBOZXR3b3JrcworICovCisjaW5jbHVkZSA8bGludXgvY29uc29sZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWxfODI1MC5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF9yZWcuaD4KKyNpbmNsdWRlIDxsaW51eC90dHkuaD4KKworI2luY2x1ZGUgPGFzbS90aW1lLmg+CisKKyNpbmNsdWRlIDxhc20vb2N0ZW9uL29jdGVvbi5oPgorCisjaWZkZWYgQ09ORklHX0dEQl9DT05TT0xFCisjZGVmaW5lIERFQlVHX1VBUlQgMAorI2Vsc2UKKyNkZWZpbmUgREVCVUdfVUFSVCAxCisjZW5kaWYKKwordW5zaWduZWQgaW50IG9jdGVvbl9zZXJpYWxfaW4oc3RydWN0IHVhcnRfcG9ydCAqdXAsIGludCBvZmZzZXQpCit7CisJaW50IHJ2ID0gY3ZteF9yZWFkX2NzcigodWludDY0X3QpKHVwLT5tZW1iYXNlICsgKG9mZnNldCA8PCAzKSkpOworCWlmIChvZmZzZXQgPT0gVUFSVF9JSVIgJiYgKHJ2ICYgMHhmKSA9PSA3KSB7CisJCS8qIEJ1c3kgaW50ZXJydXB0LCByZWFkIHRoZSBVU1IgKDM5KSBhbmQgdHJ5IGFnYWluLiAqLworCQljdm14X3JlYWRfY3NyKCh1aW50NjRfdCkodXAtPm1lbWJhc2UgKyAoMzkgPDwgMykpKTsKKwkJcnYgPSBjdm14X3JlYWRfY3NyKCh1aW50NjRfdCkodXAtPm1lbWJhc2UgKyAob2Zmc2V0IDw8IDMpKSk7CisJfQorCXJldHVybiBydjsKK30KKwordm9pZCBvY3Rlb25fc2VyaWFsX291dChzdHJ1Y3QgdWFydF9wb3J0ICp1cCwgaW50IG9mZnNldCwgaW50IHZhbHVlKQoreworCS8qCisJICogSWYgYml0cyA2IG9yIDcgb2YgdGhlIE9DVEVPTiBVQVJUJ3MgTENSIGFyZSBzZXQsIGl0IHF1aXRzCisJICogd29ya2luZy4KKwkgKi8KKwlpZiAob2Zmc2V0ID09IFVBUlRfTENSKQorCQl2YWx1ZSAmPSAweDlmOworCWN2bXhfd3JpdGVfY3NyKCh1aW50NjRfdCkodXAtPm1lbWJhc2UgKyAob2Zmc2V0IDw8IDMpKSwgKHU4KXZhbHVlKTsKK30KKworLyoKKyAqIEFsbG9jYXRlZCBpbiAuYnNzLCBzbyBpdCBpcyBhbGwgemVyb2VkLgorICovCisjZGVmaW5lIE9DVEVPTl9NQVhfVUFSVFMgMworc3RhdGljIHN0cnVjdCBwbGF0X3NlcmlhbDgyNTBfcG9ydCBvY3Rlb25fdWFydDgyNTBfZGF0YVtPQ1RFT05fTUFYX1VBUlRTICsgMV07CitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBvY3Rlb25fdWFydDgyNTBfZGV2aWNlID0geworCS5uYW1lCQkJPSAic2VyaWFsODI1MCIsCisJLmlkCQkJPSBQTEFUODI1MF9ERVZfUExBVEZPUk0sCisJLmRldgkJCT0geworCQkucGxhdGZvcm1fZGF0YQk9IG9jdGVvbl91YXJ0ODI1MF9kYXRhLAorCX0sCit9OworCitzdGF0aWMgdm9pZCBfX2luaXQgb2N0ZW9uX3VhcnRfc2V0X2NvbW1vbihzdHJ1Y3QgcGxhdF9zZXJpYWw4MjUwX3BvcnQgKnApCit7CisJcC0+ZmxhZ3MgPSBBU1lOQ19TS0lQX1RFU1QgfCBVUEZfU0hBUkVfSVJRIHwgVVBGX0ZJWEVEX1RZUEU7CisJcC0+dHlwZSA9IFBPUlRfT0NURU9OOworCXAtPmlvdHlwZSA9IFVQSU9fTUVNOworCXAtPnJlZ3NoaWZ0ID0gMzsJLyogSS9PIGFkZHJlc3NlcyBhcmUgZXZlcnkgOCBieXRlcyAqLworCXAtPnVhcnRjbGsgPSBtaXBzX2hwdF9mcmVxdWVuY3k7CisJcC0+c2VyaWFsX2luID0gb2N0ZW9uX3NlcmlhbF9pbjsKKwlwLT5zZXJpYWxfb3V0ID0gb2N0ZW9uX3NlcmlhbF9vdXQ7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IG9jdGVvbl9zZXJpYWxfaW5pdCh2b2lkKQoreworCWludCBlbmFibGVfdWFydDA7CisJaW50IGVuYWJsZV91YXJ0MTsKKwlpbnQgZW5hYmxlX3VhcnQyOworCXN0cnVjdCBwbGF0X3NlcmlhbDgyNTBfcG9ydCAqcDsKKworI2lmZGVmIENPTkZJR19DQVZJVU1fT0NURU9OXzJORF9LRVJORUwKKwkvKgorCSAqIElmIHdlIGFyZSBjb25maWd1cmVkIHRvIHJ1biBhcyB0aGUgc2Vjb25kIG9mIHR3byBrZXJuZWxzLAorCSAqIGRpc2FibGUgdWFydDAgYW5kIGVuYWJsZSB1YXJ0MS4gVWFydDAgaXMgb3duZWQgYnkgdGhlIGZpcnN0CisJICoga2VybmVsCisJICovCisJZW5hYmxlX3VhcnQwID0gMDsKKwllbmFibGVfdWFydDEgPSAxOworI2Vsc2UKKwkvKgorCSAqIFdlIGFyZSBjb25maWd1cmVkIGZvciB0aGUgZmlyc3Qga2VybmVsLiBXZSdsbCBlbmFibGUgdWFydDAKKwkgKiBpZiB0aGUgYm9vdGxvYWRlciB0b2xkIHVzIHRvIHVzZSAwLCBvdGhlcndpc2Ugd2lsbCBlbmFibGUKKwkgKiB1YXJ0IDEuCisJICovCisJZW5hYmxlX3VhcnQwID0gKG9jdGVvbl9nZXRfYm9vdF91YXJ0KCkgPT0gMCk7CisJZW5hYmxlX3VhcnQxID0gKG9jdGVvbl9nZXRfYm9vdF91YXJ0KCkgPT0gMSk7CisjaWZkZWYgQ09ORklHX0tHREIKKwllbmFibGVfdWFydDEgPSAxOworI2VuZGlmCisjZW5kaWYKKworCS8qIFJpZ2h0IG5vdyBDTjUyWFggaXMgdGhlIG9ubHkgY2hpcCB3aXRoIGEgdGhpcmQgdWFydCAqLworCWVuYWJsZV91YXJ0MiA9IE9DVEVPTl9JU19NT0RFTChPQ1RFT05fQ041MlhYKTsKKworCXAgPSBvY3Rlb25fdWFydDgyNTBfZGF0YTsKKwlpZiAoZW5hYmxlX3VhcnQwKSB7CisJCS8qIEFkZCBhIHR0eVMgZGV2aWNlIGZvciBoYXJkd2FyZSB1YXJ0IDAgKi8KKwkJb2N0ZW9uX3VhcnRfc2V0X2NvbW1vbihwKTsKKwkJcC0+bWVtYmFzZSA9ICh2b2lkICopIENWTVhfTUlPX1VBUlRYX1JCUigwKTsKKwkJcC0+bWFwYmFzZSA9IENWTVhfTUlPX1VBUlRYX1JCUigwKSAmICgoMXVsbCA8PCA0OSkgLSAxKTsKKwkJcC0+aXJxID0gT0NURU9OX0lSUV9VQVJUMDsKKwkJcCsrOworCX0KKworCWlmIChlbmFibGVfdWFydDEpIHsKKwkJLyogQWRkIGEgdHR5UyBkZXZpY2UgZm9yIGhhcmR3YXJlIHVhcnQgMSAqLworCQlvY3Rlb25fdWFydF9zZXRfY29tbW9uKHApOworCQlwLT5tZW1iYXNlID0gKHZvaWQgKikgQ1ZNWF9NSU9fVUFSVFhfUkJSKDEpOworCQlwLT5tYXBiYXNlID0gQ1ZNWF9NSU9fVUFSVFhfUkJSKDEpICYgKCgxdWxsIDw8IDQ5KSAtIDEpOworCQlwLT5pcnEgPSBPQ1RFT05fSVJRX1VBUlQxOworCQlwKys7CisJfQorCWlmIChlbmFibGVfdWFydDIpIHsKKwkJLyogQWRkIGEgdHR5UyBkZXZpY2UgZm9yIGhhcmR3YXJlIHVhcnQgMiAqLworCQlvY3Rlb25fdWFydF9zZXRfY29tbW9uKHApOworCQlwLT5tZW1iYXNlID0gKHZvaWQgKikgQ1ZNWF9NSU9fVUFSVDJfUkJSOworCQlwLT5tYXBiYXNlID0gQ1ZNWF9NSU9fVUFSVDJfUkJSICYgKCgxdWxsIDw8IDQ5KSAtIDEpOworCQlwLT5pcnEgPSBPQ1RFT05fSVJRX1VBUlQyOworCQlwKys7CisJfQorCisJQlVHX09OKHAgPiAmb2N0ZW9uX3VhcnQ4MjUwX2RhdGFbT0NURU9OX01BWF9VQVJUU10pOworCisJcmV0dXJuIHBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcigmb2N0ZW9uX3VhcnQ4MjUwX2RldmljZSk7Cit9CisKK2RldmljZV9pbml0Y2FsbChvY3Rlb25fc2VyaWFsX2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2Nhdml1bS1vY3Rlb24vc2V0dXAuYyBiL2FyY2gvbWlwcy9jYXZpdW0tb2N0ZW9uL3NldHVwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTA4NWZlZAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbWlwcy9jYXZpdW0tb2N0ZW9uL3NldHVwLmMKQEAgLTAsMCArMSw5MjkgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNyBDYXZpdW0gTmV0d29ya3MKKyAqIENvcHlyaWdodCAoQykgMjAwOCBXaW5kIFJpdmVyIFN5c3RlbXMKKyAqLworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9jb25zb2xlLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcmlhbC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CS8qIGZvciBtZW1zZXQgKi8KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWwuaD4KKyNpbmNsdWRlIDxsaW51eC90dHkuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2VyaWFsX2NvcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWxfODI1MC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorCisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorI2luY2x1ZGUgPGFzbS9yZWJvb3QuaD4KKyNpbmNsdWRlIDxhc20vc21wLW9wcy5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vaXJxX2NwdS5oPgorI2luY2x1ZGUgPGFzbS9taXBzcmVncy5oPgorI2luY2x1ZGUgPGFzbS9ib290aW5mby5oPgorI2luY2x1ZGUgPGFzbS9zZWN0aW9ucy5oPgorI2luY2x1ZGUgPGFzbS90aW1lLmg+CisKKyNpbmNsdWRlIDxhc20vb2N0ZW9uL29jdGVvbi5oPgorCisjaWZkZWYgQ09ORklHX0NBVklVTV9ERUNPREVfUlNMCitleHRlcm4gdm9pZCBjdm14X2ludGVycnVwdF9yc2xfZGVjb2RlKHZvaWQpOworZXh0ZXJuIGludCBfX2N2bXhfaW50ZXJydXB0X2VjY19yZXBvcnRfc2luZ2xlX2JpdF9lcnJvcnM7CitleHRlcm4gdm9pZCBjdm14X2ludGVycnVwdF9yc2xfZW5hYmxlKHZvaWQpOworI2VuZGlmCisKK2V4dGVybiBzdHJ1Y3QgcGxhdF9zbXBfb3BzIG9jdGVvbl9zbXBfb3BzOworCisjaWZkZWYgQ09ORklHX1BDSQorZXh0ZXJuIHZvaWQgcGNpX2NvbnNvbGVfaW5pdChjb25zdCBjaGFyICphcmcpOworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfQ0FWSVVNX1JFU0VSVkUzMgorZXh0ZXJuIHVpbnQ2NF90IG9jdGVvbl9yZXNlcnZlMzJfbWVtb3J5OworI2VuZGlmCitzdGF0aWMgdW5zaWduZWQgbG9uZyBsb25nIE1BWF9NRU1PUlkgPSA1MTJ1bGwgPDwgMjA7CisKK3N0cnVjdCBvY3Rlb25fYm9vdF9kZXNjcmlwdG9yICpvY3Rlb25fYm9vdF9kZXNjX3B0cjsKKworc3RydWN0IGN2bXhfYm9vdGluZm8gKm9jdGVvbl9ib290aW5mbzsKK0VYUE9SVF9TWU1CT0wob2N0ZW9uX2Jvb3RpbmZvKTsKKworI2lmZGVmIENPTkZJR19DQVZJVU1fUkVTRVJWRTMyCit1aW50NjRfdCBvY3Rlb25fcmVzZXJ2ZTMyX21lbW9yeTsKK0VYUE9SVF9TWU1CT0wob2N0ZW9uX3Jlc2VydmUzMl9tZW1vcnkpOworI2VuZGlmCisKK3N0YXRpYyBpbnQgb2N0ZW9uX3VhcnQ7CisKK2V4dGVybiBhc21saW5rYWdlIHZvaWQgaGFuZGxlX2ludCh2b2lkKTsKK2V4dGVybiBhc21saW5rYWdlIHZvaWQgcGxhdF9pcnFfZGlzcGF0Y2godm9pZCk7CisKKy8qKgorICogUmV0dXJuIG5vbiB6ZXJvIGlmIHdlIGFyZSBjdXJyZW50bHkgcnVubmluZyBpbiB0aGUgT2N0ZW9uIHNpbXVsYXRvcgorICoKKyAqIFJldHVybnMKKyAqLworaW50IG9jdGVvbl9pc19zaW11bGF0aW9uKHZvaWQpCit7CisJcmV0dXJuIG9jdGVvbl9ib290aW5mby0+Ym9hcmRfdHlwZSA9PSBDVk1YX0JPQVJEX1RZUEVfU0lNOworfQorRVhQT1JUX1NZTUJPTChvY3Rlb25faXNfc2ltdWxhdGlvbik7CisKKy8qKgorICogUmV0dXJuIHRydWUgaWYgT2N0ZW9uIGlzIGluIFBDSSBIb3N0IG1vZGUuIFRoaXMgbWVhbnMKKyAqIExpbnV4IGNhbiBjb250cm9sIHRoZSBQQ0kgYnVzLgorICoKKyAqIFJldHVybnMgTm9uIHplcm8gaWYgT2N0ZW9uIGluIGhvc3QgbW9kZS4KKyAqLworaW50IG9jdGVvbl9pc19wY2lfaG9zdCh2b2lkKQoreworI2lmZGVmIENPTkZJR19QQ0kKKwlyZXR1cm4gb2N0ZW9uX2Jvb3RpbmZvLT5jb25maWdfZmxhZ3MgJiBDVk1YX0JPT1RJTkZPX0NGR19GTEFHX1BDSV9IT1NUOworI2Vsc2UKKwlyZXR1cm4gMDsKKyNlbmRpZgorfQorCisvKioKKyAqIEdldCB0aGUgY2xvY2sgcmF0ZSBvZiBPY3Rlb24KKyAqCisgKiBSZXR1cm5zIENsb2NrIHJhdGUgaW4gSFoKKyAqLwordWludDY0X3Qgb2N0ZW9uX2dldF9jbG9ja19yYXRlKHZvaWQpCit7CisJaWYgKG9jdGVvbl9pc19zaW11bGF0aW9uKCkpCisJCW9jdGVvbl9ib290aW5mby0+ZWNsb2NrX2h6ID0gNjAwMDAwMDsKKwlyZXR1cm4gb2N0ZW9uX2Jvb3RpbmZvLT5lY2xvY2tfaHo7Cit9CitFWFBPUlRfU1lNQk9MKG9jdGVvbl9nZXRfY2xvY2tfcmF0ZSk7CisKKy8qKgorICogV3JpdGUgdG8gdGhlIExDRCBkaXNwbGF5IGNvbm5lY3RlZCB0byB0aGUgYm9vdGJ1cy4gVGhpcyBkaXNwbGF5CisgKiBleGlzdHMgb24gbW9zdCBDYXZpdW0gZXZhbHVhdGlvbiBib2FyZHMuIElmIGl0IGRvZXNuJ3QgZXhpc3QsIHRoZW4KKyAqIHRoaXMgZnVuY3Rpb24gZG9lc24ndCBkbyBhbnl0aGluZy4KKyAqCisgKiBAczogICAgICBTdHJpbmcgdG8gd3JpdGUKKyAqLwordm9pZCBvY3Rlb25fd3JpdGVfbGNkKGNvbnN0IGNoYXIgKnMpCit7CisJaWYgKG9jdGVvbl9ib290aW5mby0+bGVkX2Rpc3BsYXlfYmFzZV9hZGRyKSB7CisJCXZvaWQgX19pb21lbSAqbGNkX2FkZHJlc3MgPQorCQkJaW9yZW1hcF9ub2NhY2hlKG9jdGVvbl9ib290aW5mby0+bGVkX2Rpc3BsYXlfYmFzZV9hZGRyLAorCQkJCQk4KTsKKwkJaW50IGk7CisJCWZvciAoaSA9IDA7IGkgPCA4OyBpKyssIHMrKykgeworCQkJaWYgKCpzKQorCQkJCWlvd3JpdGU4KCpzLCBsY2RfYWRkcmVzcyArIGkpOworCQkJZWxzZQorCQkJCWlvd3JpdGU4KCcgJywgbGNkX2FkZHJlc3MgKyBpKTsKKwkJfQorCQlpb3VubWFwKGxjZF9hZGRyZXNzKTsKKwl9Cit9CisKKy8qKgorICogUmV0dXJuIHRoZSBjb25zb2xlIHVhcnQgcGFzc2VkIGJ5IHRoZSBib290bG9hZGVyCisgKgorICogUmV0dXJucyB1YXJ0ICAgKDAgb3IgMSkKKyAqLworaW50IG9jdGVvbl9nZXRfYm9vdF91YXJ0KHZvaWQpCit7CisJaW50IHVhcnQ7CisjaWZkZWYgQ09ORklHX0NBVklVTV9PQ1RFT05fMk5EX0tFUk5FTAorCXVhcnQgPSAxOworI2Vsc2UKKwl1YXJ0ID0gKG9jdGVvbl9ib290X2Rlc2NfcHRyLT5mbGFncyAmIE9DVEVPTl9CTF9GTEFHX0NPTlNPTEVfVUFSVDEpID8KKwkJMSA6IDA7CisjZW5kaWYKKwlyZXR1cm4gdWFydDsKK30KKworLyoqCisgKiBHZXQgdGhlIGNvcmVtYXNrIExpbnV4IHdhcyBib290ZWQgb24uCisgKgorICogUmV0dXJucyBDb3JlIG1hc2sKKyAqLworaW50IG9jdGVvbl9nZXRfYm9vdF9jb3JlbWFzayh2b2lkKQoreworCXJldHVybiBvY3Rlb25fYm9vdF9kZXNjX3B0ci0+Y29yZV9tYXNrOworfQorCisvKioKKyAqIENoZWNrIHRoZSBoYXJkd2FyZSBCSVNUIHJlc3VsdHMgZm9yIGEgQ1BVCisgKi8KK3ZvaWQgb2N0ZW9uX2NoZWNrX2NwdV9iaXN0KHZvaWQpCit7CisJY29uc3QgaW50IGNvcmVpZCA9IGN2bXhfZ2V0X2NvcmVfbnVtKCk7CisJdW5zaWduZWQgbG9uZyBsb25nIG1hc2s7CisJdW5zaWduZWQgbG9uZyBsb25nIGJpc3RfdmFsOworCisJLyogQ2hlY2sgQklTVCByZXN1bHRzIGZvciBDT1AwIHJlZ2lzdGVycyAqLworCW1hc2sgPSAweDFmMDAwMDAwMDB1bGw7CisJYmlzdF92YWwgPSByZWFkX29jdGVvbl9jMF9pY2FjaGVlcnIoKTsKKwlpZiAoYmlzdF92YWwgJiBtYXNrKQorCQlwcl9lcnIoIkNvcmUlZCBCSVNUIEZhaWx1cmU6IENhY2hlRXJyKGljYWNoZSkgPSAweCVsbHhcbiIsCisJCSAgICAgICBjb3JlaWQsIGJpc3RfdmFsKTsKKworCWJpc3RfdmFsID0gcmVhZF9vY3Rlb25fYzBfZGNhY2hlZXJyKCk7CisJaWYgKGJpc3RfdmFsICYgMSkKKwkJcHJfZXJyKCJDb3JlJWQgTDEgRGNhY2hlIHBhcml0eSBlcnJvcjogIgorCQkgICAgICAgIkNhY2hlRXJyKGRjYWNoZSkgPSAweCVsbHhcbiIsCisJCSAgICAgICBjb3JlaWQsIGJpc3RfdmFsKTsKKworCW1hc2sgPSAweGZjMDAwMDAwMDAwMDAwMDB1bGw7CisJYmlzdF92YWwgPSByZWFkX2MwX2N2bW1lbWN0bCgpOworCWlmIChiaXN0X3ZhbCAmIG1hc2spCisJCXByX2VycigiQ29yZSVkIEJJU1QgRmFpbHVyZTogQ09QMF9DVk1fTUVNX0NUTCA9IDB4JWxseFxuIiwKKwkJICAgICAgIGNvcmVpZCwgYmlzdF92YWwpOworCisJd3JpdGVfb2N0ZW9uX2MwX2RjYWNoZWVycigwKTsKK30KKworI2lmZGVmIENPTkZJR19DQVZJVU1fUkVTRVJWRTMyX1VTRV9XSVJFRF9UTEIKKy8qKgorICogQ2FsbGVkIG9uIGV2ZXJ5IGNvcmUgdG8gc2V0dXAgdGhlIHdpcmVkIHRsYiBlbnRyeSBuZWVkZWQKKyAqIGlmIENPTkZJR19DQVZJVU1fUkVTRVJWRTMyX1VTRV9XSVJFRF9UTEIgaXMgc2V0LgorICoKKyAqLworc3RhdGljIHZvaWQgb2N0ZW9uX2hhbF9zZXR1cF9wZXJfY3B1X3Jlc2VydmVkMzIodm9pZCAqdW51c2VkKQoreworCS8qCisJICogVGhlIGNvbmZpZyBoYXMgc2VsZWN0ZWQgdG8gd2lyZSB0aGUgcmVzZXJ2ZTMyIG1lbW9yeSBmb3IgYWxsCisJICogdXNlcnNwYWNlIGFwcGxpY2F0aW9ucy4gV2UgbmVlZCB0byBwdXQgYSB3aXJlZCBUTEIgZW50cnkgaW4gZm9yIGVhY2gKKwkgKiA1MTJNQiBvZiByZXNlcnZlMzIgbWVtb3J5LiBXZSBvbmx5IGhhbmRsZSBkb3VibGUgMjU2TUIgcGFnZXMgaGVyZSwKKwkgKiBzbyByZXNlcnZlMzIgbXVzdCBiZSBtdWx0aXBsZSBvZiA1MTJNQi4KKwkgKi8KKwl1aW50MzJfdCBzaXplID0gQ09ORklHX0NBVklVTV9SRVNFUlZFMzI7CisJdWludDMyX3QgZW50cnlsbzAgPQorCQkweDcgfCAoKG9jdGVvbl9yZXNlcnZlMzJfbWVtb3J5ICYgKCgxdWwgPDwgNDApIC0gMSkpID4+IDYpOworCXVpbnQzMl90IGVudHJ5bG8xID0gZW50cnlsbzAgKyAoMjU2IDw8IDE0KTsKKwl1aW50MzJfdCBlbnRyeWhpID0gKDB4ODAwMDAwMDBVTCAtIChDT05GSUdfQ0FWSVVNX1JFU0VSVkUzMiA8PCAyMCkpOworCXdoaWxlIChzaXplID49IDUxMikgeworI2lmIDAKKwkJcHJfaW5mbygiQ1BVJWQ6IEFkZGluZyBkb3VibGUgd2lyZWQgVExCIGVudHJ5IGZvciAweCVseFxuIiwKKwkJCXNtcF9wcm9jZXNzb3JfaWQoKSwgZW50cnloaSk7CisjZW5kaWYKKwkJYWRkX3dpcmVkX2VudHJ5KGVudHJ5bG8wLCBlbnRyeWxvMSwgZW50cnloaSwgUE1fMjU2TSk7CisJCWVudHJ5bG8wICs9IDUxMiA8PCAxNDsKKwkJZW50cnlsbzEgKz0gNTEyIDw8IDE0OworCQllbnRyeWhpICs9IDUxMiA8PCAyMDsKKwkJc2l6ZSAtPSA1MTI7CisJfQorfQorI2VuZGlmIC8qIENPTkZJR19DQVZJVU1fUkVTRVJWRTMyX1VTRV9XSVJFRF9UTEIgKi8KKworLyoqCisgKiBDYWxsZWQgdG8gcmVsZWFzZSB0aGUgbmFtZWQgYmxvY2sgd2hpY2ggd2FzIHVzZWQgdG8gbWFkZSBzdXJlCisgKiB0aGF0IG5vYm9keSB1c2VkIHRoZSBtZW1vcnkgZm9yIHNvbWV0aGluZyBlbHNlIGR1cmluZworICogaW5pdC4gTm93IHdlJ2xsIGZyZWUgaXQgc28gdXNlcnNwYWNlIGFwcHMgY2FuIHVzZSB0aGlzCisgKiBtZW1vcnkgcmVnaW9uIHdpdGggYm9vdG1lbV9hbGxvYy4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBvbmx5IG9uY2UgZnJvbSBwcm9tX2ZyZWVfcHJvbV9tZW1vcnkoKS4KKyAqLwordm9pZCBvY3Rlb25faGFsX3NldHVwX3Jlc2VydmVkMzIodm9pZCkKK3sKKyNpZmRlZiBDT05GSUdfQ0FWSVVNX1JFU0VSVkUzMl9VU0VfV0lSRURfVExCCisJb25fZWFjaF9jcHUob2N0ZW9uX2hhbF9zZXR1cF9wZXJfY3B1X3Jlc2VydmVkMzIsIE5VTEwsIDAsIDEpOworI2VuZGlmCit9CisKKy8qKgorICogUmVib290IE9jdGVvbgorICoKKyAqIEBjb21tYW5kOiBDb21tYW5kIHRvIHBhc3MgdG8gdGhlIGJvb3Rsb2FkZXIuIEN1cnJlbnRseSBpZ25vcmVkLgorICovCitzdGF0aWMgdm9pZCBvY3Rlb25fcmVzdGFydChjaGFyICpjb21tYW5kKQoreworCS8qIERpc2FibGUgYWxsIHdhdGNoZG9ncyBiZWZvcmUgc29mdCByZXNldC4gVGhleSBkb24ndCBnZXQgY2xlYXJlZCAqLworI2lmZGVmIENPTkZJR19TTVAKKwlpbnQgY3B1OworCWZvcl9lYWNoX29ubGluZV9jcHUoY3B1KQorCQljdm14X3dyaXRlX2NzcihDVk1YX0NJVV9XRE9HWChjcHVfbG9naWNhbF9tYXAoY3B1KSksIDApOworI2Vsc2UKKwljdm14X3dyaXRlX2NzcihDVk1YX0NJVV9XRE9HWChjdm14X2dldF9jb3JlX251bSgpKSwgMCk7CisjZW5kaWYKKworCW1iKCk7CisJd2hpbGUgKDEpCisJCWN2bXhfd3JpdGVfY3NyKENWTVhfQ0lVX1NPRlRfUlNULCAxKTsKK30KKworCisvKioKKyAqIFBlcm1hbmVudGx5IHN0b3AgYSBjb3JlLgorICoKKyAqIEBhcmc6IElnbm9yZWQuCisgKi8KK3N0YXRpYyB2b2lkIG9jdGVvbl9raWxsX2NvcmUodm9pZCAqYXJnKQoreworCW1iKCk7CisJaWYgKG9jdGVvbl9pc19zaW11bGF0aW9uKCkpIHsKKwkJLyogVGhlIHNpbXVsYXRvciBuZWVkcyB0aGUgd2F0Y2hkb2cgdG8gc3RvcCBmb3IgZGVhZCBjb3JlcyAqLworCQljdm14X3dyaXRlX2NzcihDVk1YX0NJVV9XRE9HWChjdm14X2dldF9jb3JlX251bSgpKSwgMCk7CisJCS8qIEEgYnJlYWsgaW5zdHJ1Y3Rpb24gY2F1c2VzIHRoZSBzaW11bGF0b3Igc3RvcCBhIGNvcmUgKi8KKwkJYXNtIHZvbGF0aWxlICgic3luY1xuYnJlYWsiKTsKKwl9Cit9CisKKworLyoqCisgKiBIYWx0IHRoZSBzeXN0ZW0KKyAqLworc3RhdGljIHZvaWQgb2N0ZW9uX2hhbHQodm9pZCkKK3sKKwlzbXBfY2FsbF9mdW5jdGlvbihvY3Rlb25fa2lsbF9jb3JlLCBOVUxMLCAwKTsKKworCXN3aXRjaCAob2N0ZW9uX2Jvb3RpbmZvLT5ib2FyZF90eXBlKSB7CisJY2FzZSBDVk1YX0JPQVJEX1RZUEVfTkFPMzg6CisJCS8qIERyaXZpbmcgYSAxIHRvIEdQSU8gMTIgc2h1dHMgb2ZmIHRoaXMgYm9hcmQgKi8KKwkJY3ZteF93cml0ZV9jc3IoQ1ZNWF9HUElPX0JJVF9DRkdYKDEyKSwgMSk7CisJCWN2bXhfd3JpdGVfY3NyKENWTVhfR1BJT19UWF9TRVQsIDB4MTAwMCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCW9jdGVvbl93cml0ZV9sY2QoIlBvd2VyT2ZmIik7CisJCWJyZWFrOworCX0KKworCW9jdGVvbl9raWxsX2NvcmUoTlVMTCk7Cit9CisKKyNpZiAwCisvKioKKyAqIFBsYXRmb3JtIHRpbWUgaW5pdCBzcGVjaWZpY3MuCisgKiBSZXR1cm5zCisgKi8KK3ZvaWQgX19pbml0IHBsYXRfdGltZV9pbml0KHZvaWQpCit7CisJLyogTm90aGluZyBzcGVjaWFsIGhlcmUsIGJ1dCB3ZSBhcmUgcmVxdWlyZWQgdG8gaGF2ZSBvbmUgKi8KK30KKworI2VuZGlmCisKKy8qKgorICogSGFuZGxlIGFsbCB0aGUgZXJyb3IgY29uZGl0aW9uIGludGVycnVwdHMgdGhhdCBtaWdodCBvY2N1ci4KKyAqCisgKi8KKyNpZmRlZiBDT05GSUdfQ0FWSVVNX0RFQ09ERV9SU0wKK3N0YXRpYyBpcnFyZXR1cm5fdCBvY3Rlb25fcmxtX2ludGVycnVwdChpbnQgY3BsLCB2b2lkICpkZXZfaWQpCit7CisJY3ZteF9pbnRlcnJ1cHRfcnNsX2RlY29kZSgpOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKyNlbmRpZgorCisvKioKKyAqIFJldHVybiBhIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIHN5c3RlbSB0eXBlCisgKgorICogUmV0dXJucworICovCitjb25zdCBjaGFyICpvY3Rlb25fYm9hcmRfdHlwZV9zdHJpbmcodm9pZCkKK3sKKwlzdGF0aWMgY2hhciBuYW1lWzgwXTsKKwlzcHJpbnRmKG5hbWUsICIlcyAoJXMpIiwKKwkJY3ZteF9ib2FyZF90eXBlX3RvX3N0cmluZyhvY3Rlb25fYm9vdGluZm8tPmJvYXJkX3R5cGUpLAorCQlvY3Rlb25fbW9kZWxfZ2V0X3N0cmluZyhyZWFkX2MwX3ByaWQoKSkpOworCXJldHVybiBuYW1lOworfQorCitjb25zdCBjaGFyICpnZXRfc3lzdGVtX3R5cGUodm9pZCkKKwlfX2F0dHJpYnV0ZV9fICgoYWxpYXMoIm9jdGVvbl9ib2FyZF90eXBlX3N0cmluZyIpKSk7CisKK3ZvaWQgb2N0ZW9uX3VzZXJfaW9faW5pdCh2b2lkKQoreworCXVuaW9uIG9jdGVvbl9jdm1lbWN0bCBjdm1tZW1jdGw7CisJdW5pb24gY3ZteF9pb2JfZmF1X3RpbWVvdXQgZmF1X3RpbWVvdXQ7CisJdW5pb24gY3ZteF9wb3dfbndfdGltIG5tX3RpbTsKKwl1aW50NjRfdCBjdm1jdGw7CisKKwkvKiBHZXQgdGhlIGN1cnJlbnQgc2V0dGluZ3MgZm9yIENQMF9DVk1NRU1DVExfUkVHICovCisJY3ZtbWVtY3RsLnU2NCA9IHJlYWRfYzBfY3ZtbWVtY3RsKCk7CisJLyogUi9XIElmIHNldCwgbWFya2VkIHdyaXRlLWJ1ZmZlciBlbnRyaWVzIHRpbWUgb3V0IHRoZSBzYW1lCisJICogYXMgYXMgb3RoZXIgZW50cmllczsgaWYgY2xlYXIsIG1hcmtlZCB3cml0ZS1idWZmZXIgZW50cmllcworCSAqIHVzZSB0aGUgbWF4aW11bSB0aW1lb3V0LiAqLworCWN2bW1lbWN0bC5zLmRpc21hcmt3Ymxvbmd0byA9IDE7CisJLyogUi9XIElmIHNldCwgYSBtZXJnZWQgc3RvcmUgZG9lcyBub3QgY2xlYXIgdGhlIHdyaXRlLWJ1ZmZlcgorCSAqIGVudHJ5IHRpbWVvdXQgc3RhdGUuICovCisJY3ZtbWVtY3RsLnMuZGlzbXJnY2xyd2J0byA9IDA7CisJLyogUi9XIFR3byBiaXRzIHRoYXQgYXJlIHRoZSBNU0JzIG9mIHRoZSByZXN1bHRhbnQgQ1ZNU0VHIExNCisJICogd29yZCBsb2NhdGlvbiBmb3IgYW4gSU9CRE1BLiBUaGUgb3RoZXIgOCBiaXRzIGNvbWUgZnJvbSB0aGUKKwkgKiBTQ1JBRERSIGZpZWxkIG9mIHRoZSBJT0JETUEuICovCisJY3ZtbWVtY3RsLnMuaW9iZG1hc2NybXNiID0gMDsKKwkvKiBSL1cgSWYgc2V0LCBTWU5DV1MgYW5kIFNZTkNTIG9ubHkgb3JkZXIgbWFya2VkIHN0b3JlczsgaWYKKwkgKiBjbGVhciwgU1lOQ1dTIGFuZCBTWU5DUyBvbmx5IG9yZGVyIHVubWFya2VkCisJICogc3RvcmVzLiBTWU5DV1NNQVJLRUQgaGFzIG5vIGVmZmVjdCB3aGVuIERJU1NZTkNXUyBpcworCSAqIHNldC4gKi8KKwljdm1tZW1jdGwucy5zeW5jd3NtYXJrZWQgPSAwOworCS8qIFIvVyBJZiBzZXQsIFNZTkNXUyBhY3RzIGFzIFNZTkNXIGFuZCBTWU5DUyBhY3RzIGFzIFNZTkMuICovCisJY3ZtbWVtY3RsLnMuZGlzc3luY3dzID0gMDsKKwkvKiBSL1cgSWYgc2V0LCBubyBzdGFsbCBoYXBwZW5zIG9uIHdyaXRlIGJ1ZmZlciBmdWxsLiAqLworCWlmIChPQ1RFT05fSVNfTU9ERUwoT0NURU9OX0NOMzhYWF9QQVNTMikpCisJCWN2bW1lbWN0bC5zLmRpc3diZnN0ID0gMTsKKwllbHNlCisJCWN2bW1lbWN0bC5zLmRpc3diZnN0ID0gMDsKKwkvKiBSL1cgSWYgc2V0IChhbmQgU1ggc2V0KSwgc3VwZXJ2aXNvci1sZXZlbCBsb2Fkcy9zdG9yZXMgY2FuCisJICogdXNlIFhLUEhZUyBhZGRyZXNzZXMgd2l0aCA8NDg+PT0wICovCisJY3ZtbWVtY3RsLnMueGttZW1lbmFzID0gMDsKKworCS8qIFIvVyBJZiBzZXQgKGFuZCBVWCBzZXQpLCB1c2VyLWxldmVsIGxvYWRzL3N0b3JlcyBjYW4gdXNlCisJICogWEtQSFlTIGFkZHJlc3NlcyB3aXRoIFZBPDQ4Pj09MCAqLworCWN2bW1lbWN0bC5zLnhrbWVtZW5hdSA9IDA7CisKKwkvKiBSL1cgSWYgc2V0IChhbmQgU1ggc2V0KSwgc3VwZXJ2aXNvci1sZXZlbCBsb2Fkcy9zdG9yZXMgY2FuCisJICogdXNlIFhLUEhZUyBhZGRyZXNzZXMgd2l0aCBWQTw0OD49PTEgKi8KKwljdm1tZW1jdGwucy54a2lvZW5hcyA9IDA7CisKKwkvKiBSL1cgSWYgc2V0IChhbmQgVVggc2V0KSwgdXNlci1sZXZlbCBsb2Fkcy9zdG9yZXMgY2FuIHVzZQorCSAqIFhLUEhZUyBhZGRyZXNzZXMgd2l0aCBWQTw0OD49PTEgKi8KKwljdm1tZW1jdGwucy54a2lvZW5hdSA9IDA7CisKKwkvKiBSL1cgSWYgc2V0LCBhbGwgc3RvcmVzIGFjdCBhcyBTWU5DVyAoTk9NRVJHRSBtdXN0IGJlIHNldAorCSAqIHdoZW4gdGhpcyBpcyBzZXQpIFJXLCByZXNldCB0byAwLiAqLworCWN2bW1lbWN0bC5zLmFsbHN5bmN3ID0gMDsKKworCS8qIFIvVyBJZiBzZXQsIG5vIHN0b3JlcyBtZXJnZSwgYW5kIGFsbCBzdG9yZXMgcmVhY2ggdGhlCisJICogY29oZXJlbnQgYnVzIGluIG9yZGVyLiAqLworCWN2bW1lbWN0bC5zLm5vbWVyZ2UgPSAwOworCS8qIFIvVyBTZWxlY3RzIHRoZSBiaXQgaW4gdGhlIGNvdW50ZXIgdXNlZCBmb3IgRElEIHRpbWUtb3V0cyAwCisJICogPSAyMzEsIDEgPSAyMzAsIDIgPSAyMjksIDMgPSAyMTQuIEFjdHVhbCB0aW1lLW91dCBpcworCSAqIGJldHdlZW4gMXggYW5kIDJ4IHRoaXMgaW50ZXJ2YWwuIEZvciBleGFtcGxlLCB3aXRoCisJICogRElEVFRPPTMsIGV4cGlyYXRpb24gaW50ZXJ2YWwgaXMgYmV0d2VlbiAxNksgYW5kIDMySy4gKi8KKwljdm1tZW1jdGwucy5kaWR0dG8gPSAwOworCS8qIFIvVyBJZiBzZXQsIHRoZSAobWVtKSBDU1IgY2xvY2sgbmV2ZXIgdHVybnMgb2ZmLiAqLworCWN2bW1lbWN0bC5zLmNzcmNrYWx3eXMgPSAwOworCS8qIFIvVyBJZiBzZXQsIG1jbGsgbmV2ZXIgdHVybnMgb2ZmLiAqLworCWN2bW1lbWN0bC5zLm1jbGthbHd5cyA9IDA7CisJLyogUi9XIFNlbGVjdHMgdGhlIGJpdCBpbiB0aGUgY291bnRlciB1c2VkIGZvciB3cml0ZSBidWZmZXIKKwkgKiBmbHVzaCB0aW1lLW91dHMgKFdCRkxUKzExKSBpcyB0aGUgYml0IHBvc2l0aW9uIGluIGFuCisJICogaW50ZXJuYWwgY291bnRlciB1c2VkIHRvIGRldGVybWluZSBleHBpcmF0aW9uLiBUaGUgd3JpdGUKKwkgKiBidWZmZXIgZXhwaXJlcyBiZXR3ZWVuIDF4IGFuZCAyeCB0aGlzIGludGVydmFsLiBGb3IKKwkgKiBleGFtcGxlLCB3aXRoIFdCRkxUID0gMCwgYSB3cml0ZSBidWZmZXIgZXhwaXJlcyBiZXR3ZWVuIDJLCisJICogYW5kIDRLIGN5Y2xlcyBhZnRlciB0aGUgd3JpdGUgYnVmZmVyIGVudHJ5IGlzIGFsbG9jYXRlZC4gKi8KKwljdm1tZW1jdGwucy53YmZsdGltZSA9IDA7CisJLyogUi9XIElmIHNldCwgZG8gbm90IHB1dCBJc3RyZWFtIGluIHRoZSBMMiBjYWNoZS4gKi8KKwljdm1tZW1jdGwucy5pc3Rybm9sMiA9IDA7CisJLyogUi9XIFRoZSB3cml0ZSBidWZmZXIgdGhyZXNob2xkLiAqLworCWN2bW1lbWN0bC5zLndidGhyZXNoID0gMTA7CisJLyogUi9XIElmIHNldCwgQ1ZNU0VHIGlzIGF2YWlsYWJsZSBmb3IgbG9hZHMvc3RvcmVzIGluCisJICoga2VybmVsL2RlYnVnIG1vZGUuICovCisjaWYgQ09ORklHX0NBVklVTV9PQ1RFT05fQ1ZNU0VHX1NJWkUgPiAwCisJY3ZtbWVtY3RsLnMuY3Ztc2VnZW5hayA9IDE7CisjZWxzZQorCWN2bW1lbWN0bC5zLmN2bXNlZ2VuYWsgPSAwOworI2VuZGlmCisJLyogUi9XIElmIHNldCwgQ1ZNU0VHIGlzIGF2YWlsYWJsZSBmb3IgbG9hZHMvc3RvcmVzIGluCisJICogc3VwZXJ2aXNvciBtb2RlLiAqLworCWN2bW1lbWN0bC5zLmN2bXNlZ2VuYXMgPSAwOworCS8qIFIvVyBJZiBzZXQsIENWTVNFRyBpcyBhdmFpbGFibGUgZm9yIGxvYWRzL3N0b3JlcyBpbiB1c2VyCisJICogbW9kZS4gKi8KKwljdm1tZW1jdGwucy5jdm1zZWdlbmF1ID0gMDsKKwkvKiBSL1cgU2l6ZSBvZiBsb2NhbCBtZW1vcnkgaW4gY2FjaGUgYmxvY2tzLCA1NCAoNjkxMiBieXRlcykKKwkgKiBpcyBtYXggbGVnYWwgdmFsdWUuICovCisJY3ZtbWVtY3RsLnMubG1lbXN6ID0gQ09ORklHX0NBVklVTV9PQ1RFT05fQ1ZNU0VHX1NJWkU7CisKKworCWlmIChzbXBfcHJvY2Vzc29yX2lkKCkgPT0gMCkKKwkJcHJfbm90aWNlKCJDVk1TRUcgc2l6ZTogJWQgY2FjaGUgbGluZXMgKCVkIGJ5dGVzKVxuIiwKKwkJCSAgQ09ORklHX0NBVklVTV9PQ1RFT05fQ1ZNU0VHX1NJWkUsCisJCQkgIENPTkZJR19DQVZJVU1fT0NURU9OX0NWTVNFR19TSVpFICogMTI4KTsKKworCXdyaXRlX2MwX2N2bW1lbWN0bChjdm1tZW1jdGwudTY0KTsKKworCS8qIE1vdmUgdGhlIHBlcmZvcm1hbmNlIGNvdW50ZXIgaW50ZXJydXB0cyB0byBJUlEgNiAqLworCWN2bWN0bCA9IHJlYWRfYzBfY3ZtY3RsKCk7CisJY3ZtY3RsICY9IH4oNyA8PCA3KTsKKwljdm1jdGwgfD0gNiA8PCA3OworCXdyaXRlX2MwX2N2bWN0bChjdm1jdGwpOworCisJLyogU2V0IGEgZGVmYXVsdCBmb3IgdGhlIGhhcmR3YXJlIHRpbWVvdXRzICovCisJZmF1X3RpbWVvdXQudTY0ID0gMDsKKwlmYXVfdGltZW91dC5zLnRvdXRfdmFsID0gMHhmZmY7CisJLyogRGlzYWJsZSB0YWd3YWl0IEZBVSB0aW1lb3V0ICovCisJZmF1X3RpbWVvdXQucy50b3V0X2VuYiA9IDA7CisJY3ZteF93cml0ZV9jc3IoQ1ZNWF9JT0JfRkFVX1RJTUVPVVQsIGZhdV90aW1lb3V0LnU2NCk7CisKKwlubV90aW0udTY0ID0gMDsKKwkvKiA0MDk2IGN5Y2xlcyAqLworCW5tX3RpbS5zLm53X3RpbSA9IDM7CisJY3ZteF93cml0ZV9jc3IoQ1ZNWF9QT1dfTldfVElNLCBubV90aW0udTY0KTsKKworCXdyaXRlX29jdGVvbl9jMF9pY2FjaGVlcnIoMCk7CisJd3JpdGVfYzBfZGVycmFkZHIxKDApOworfQorCisvKioKKyAqIEVhcmx5IGVudHJ5IHBvaW50IGZvciBhcmNoIHNldHVwCisgKi8KK3ZvaWQgX19pbml0IHByb21faW5pdCh2b2lkKQoreworCXN0cnVjdCBjdm14X3N5c2luZm8gKnN5c2luZm87CisJY29uc3QgaW50IGNvcmVpZCA9IGN2bXhfZ2V0X2NvcmVfbnVtKCk7CisJaW50IGk7CisJaW50IGFyZ2M7CisJc3RydWN0IHVhcnRfcG9ydCBvY3Rlb25fcG9ydDsKKyNpZmRlZiBDT05GSUdfQ0FWSVVNX1JFU0VSVkUzMgorCWludDY0X3QgYWRkciA9IC0xOworI2VuZGlmCisJLyoKKwkgKiBUaGUgYm9vdGxvYWRlciBwYXNzZXMgYSBwb2ludGVyIHRvIHRoZSBib290IGRlc2NyaXB0b3IgaW4KKwkgKiAkYTMsIHRoaXMgaXMgYXZhaWxhYmxlIGFzIGZ3X2FyZzMuCisJICovCisJb2N0ZW9uX2Jvb3RfZGVzY19wdHIgPSAoc3RydWN0IG9jdGVvbl9ib290X2Rlc2NyaXB0b3IgKilmd19hcmczOworCW9jdGVvbl9ib290aW5mbyA9CisJCWN2bXhfcGh5c190b19wdHIob2N0ZW9uX2Jvb3RfZGVzY19wdHItPmN2bXhfZGVzY192YWRkcik7CisJY3ZteF9ib290bWVtX2luaXQoY3ZteF9waHlzX3RvX3B0cihvY3Rlb25fYm9vdGluZm8tPnBoeV9tZW1fZGVzY19hZGRyKSk7CisKKwkvKgorCSAqIE9ubHkgZW5hYmxlIHRoZSBMRUQgY29udHJvbGxlciBpZiB3ZSdyZSBydW5uaW5nIG9uIGEgQ04zOFhYLCBDTjU4WFgsCisJICogb3IgQ041NlhYLiBUaGUgQ04zMFhYIGFuZCBDTjMxWFggZG9uJ3QgaGF2ZSBhbiBMRUQgY29udHJvbGxlci4KKwkgKi8KKwlpZiAoIW9jdGVvbl9pc19zaW11bGF0aW9uKCkgJiYKKwkgICAgb2N0ZW9uX2hhc19mZWF0dXJlKE9DVEVPTl9GRUFUVVJFX0xFRF9DT05UUk9MTEVSKSkgeworCQljdm14X3dyaXRlX2NzcihDVk1YX0xFRF9FTiwgMCk7CisJCWN2bXhfd3JpdGVfY3NyKENWTVhfTEVEX1BSVCwgMCk7CisJCWN2bXhfd3JpdGVfY3NyKENWTVhfTEVEX0RCRywgMCk7CisJCWN2bXhfd3JpdGVfY3NyKENWTVhfTEVEX1BSVF9GTVQsIDApOworCQljdm14X3dyaXRlX2NzcihDVk1YX0xFRF9VRERfQ05UWCgwKSwgMzIpOworCQljdm14X3dyaXRlX2NzcihDVk1YX0xFRF9VRERfQ05UWCgxKSwgMzIpOworCQljdm14X3dyaXRlX2NzcihDVk1YX0xFRF9VRERfREFUWCgwKSwgMCk7CisJCWN2bXhfd3JpdGVfY3NyKENWTVhfTEVEX1VERF9EQVRYKDEpLCAwKTsKKwkJY3ZteF93cml0ZV9jc3IoQ1ZNWF9MRURfRU4sIDEpOworCX0KKyNpZmRlZiBDT05GSUdfQ0FWSVVNX1JFU0VSVkUzMgorCS8qCisJICogV2UgbmVlZCB0byB0ZW1wb3JhcmlseSBhbGxvY2F0ZSBhbGwgbWVtb3J5IGluIHRoZSByZXNlcnZlMzIKKwkgKiByZWdpb24uIFRoaXMgbWFrZXMgc3VyZSB0aGUga2VybmVsIGRvZXNuJ3QgYWxsb2NhdGUgdGhpcworCSAqIG1lbW9yeSB3aGVuIGl0IGlzIGdldHRpbmcgbWVtb3J5IGZyb20gdGhlCisJICogYm9vdGxvYWRlci4gTGF0ZXIsIGFmdGVyIHRoZSBtZW1vcnkgYWxsb2NhdGlvbnMgYXJlCisJICogY29tcGxldGUsIHRoZSByZXNlcnZlMzIgd2lsbCBiZSBmcmVlZC4KKwkgKi8KKyNpZmRlZiBDT05GSUdfQ0FWSVVNX1JFU0VSVkUzMl9VU0VfV0lSRURfVExCCisJaWYgKENPTkZJR19DQVZJVU1fUkVTRVJWRTMyICYgMHgxZmYpCisJCXByX2VycigiQ0FWSVVNX1JFU0VSVkUzMiBpc24ndCBhIG11bHRpcGxlIG9mIDUxMk1CLiAiCisJCSAgICAgICAiVGhpcyBpcyByZXF1aXJlZCBpZiBDQVZJVU1fUkVTRVJWRTMyX1VTRV9XSVJFRF9UTEIgIgorCQkgICAgICAgImlzIHNldFxuIik7CisJZWxzZQorCQlhZGRyID0gY3ZteF9ib290bWVtX3BoeV9uYW1lZF9ibG9ja19hbGxvYyhDT05GSUdfQ0FWSVVNX1JFU0VSVkUzMiA8PCAyMCwKKwkJCQkJCQkwLCAwLCA1MTIgPDwgMjAsCisJCQkJCQkJIkNBVklVTV9SRVNFUlZFMzIiLCAwKTsKKyNlbHNlCisJLyoKKwkgKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIFJFU0VSVkVEMzIgYWxpZ25lZCBvbiAyTUIgYm91bmRhcnkuIFRoaXMKKwkgKiBpcyBpbiBjYXNlIHdlIGxhdGVyIHVzZSBodWdldGxiIGVudHJpZXMgd2l0aCBpdC4KKwkgKi8KKwlhZGRyID0gY3ZteF9ib290bWVtX3BoeV9uYW1lZF9ibG9ja19hbGxvYyhDT05GSUdfQ0FWSVVNX1JFU0VSVkUzMiA8PCAyMCwKKwkJCQkJCTAsIDAsIDIgPDwgMjAsCisJCQkJCQkiQ0FWSVVNX1JFU0VSVkUzMiIsIDApOworI2VuZGlmCisJaWYgKGFkZHIgPCAwKQorCQlwcl9lcnIoIkZhaWxlZCB0byBhbGxvY2F0ZSBDQVZJVU1fUkVTRVJWRTMyIG1lbW9yeSBhcmVhXG4iKTsKKwllbHNlCisJCW9jdGVvbl9yZXNlcnZlMzJfbWVtb3J5ID0gYWRkcjsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0NBVklVTV9PQ1RFT05fTE9DS19MMgorCWlmIChjdm14X3JlYWRfY3NyKENWTVhfTDJEX0ZVUzMpICYgKDN1bGwgPDwgMzQpKSB7CisJCXByX2luZm8oIlNraXBwaW5nIEwyIGxvY2tpbmcgZHVlIHRvIHJlZHVjZWQgTDIgY2FjaGUgc2l6ZVxuIik7CisJfSBlbHNlIHsKKwkJdWludDMyX3QgZWJhc2UgPSByZWFkX2MwX2ViYXNlKCkgJiAweDNmZmZmMDAwOworI2lmZGVmIENPTkZJR19DQVZJVU1fT0NURU9OX0xPQ0tfTDJfVExCCisJCS8qIFRMQiByZWZpbGwgKi8KKwkJY3ZteF9sMmNfbG9ja19tZW1fcmVnaW9uKGViYXNlLCAweDEwMCk7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfQ0FWSVVNX09DVEVPTl9MT0NLX0wyX0VYQ0VQVElPTgorCQkvKiBHZW5lcmFsIGV4Y2VwdGlvbiAqLworCQljdm14X2wyY19sb2NrX21lbV9yZWdpb24oZWJhc2UgKyAweDE4MCwgMHg4MCk7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfQ0FWSVVNX09DVEVPTl9MT0NLX0wyX0xPV19MRVZFTF9JTlRFUlJVUFQKKwkJLyogSW50ZXJydXB0IGhhbmRsZXIgKi8KKwkJY3ZteF9sMmNfbG9ja19tZW1fcmVnaW9uKGViYXNlICsgMHgyMDAsIDB4ODApOworI2VuZGlmCisjaWZkZWYgQ09ORklHX0NBVklVTV9PQ1RFT05fTE9DS19MMl9JTlRFUlJVUFQKKwkJY3ZteF9sMmNfbG9ja19tZW1fcmVnaW9uKF9fcGFfc3ltYm9sKGhhbmRsZV9pbnQpLCAweDEwMCk7CisJCWN2bXhfbDJjX2xvY2tfbWVtX3JlZ2lvbihfX3BhX3N5bWJvbChwbGF0X2lycV9kaXNwYXRjaCksIDB4ODApOworI2VuZGlmCisjaWZkZWYgQ09ORklHX0NBVklVTV9PQ1RFT05fTE9DS19MMl9NRU1DUFkKKwkJY3ZteF9sMmNfbG9ja19tZW1fcmVnaW9uKF9fcGFfc3ltYm9sKG1lbWNweSksIDB4NDgwKTsKKyNlbmRpZgorCX0KKyNlbmRpZgorCisJc3lzaW5mbyA9IGN2bXhfc3lzaW5mb19nZXQoKTsKKwltZW1zZXQoc3lzaW5mbywgMCwgc2l6ZW9mKCpzeXNpbmZvKSk7CisJc3lzaW5mby0+c3lzdGVtX2RyYW1fc2l6ZSA9IG9jdGVvbl9ib290aW5mby0+ZHJhbV9zaXplIDw8IDIwOworCXN5c2luZm8tPnBoeV9tZW1fZGVzY19wdHIgPQorCQljdm14X3BoeXNfdG9fcHRyKG9jdGVvbl9ib290aW5mby0+cGh5X21lbV9kZXNjX2FkZHIpOworCXN5c2luZm8tPmNvcmVfbWFzayA9IG9jdGVvbl9ib290aW5mby0+Y29yZV9tYXNrOworCXN5c2luZm8tPmV4Y2VwdGlvbl9iYXNlX2FkZHIgPSBvY3Rlb25fYm9vdGluZm8tPmV4Y2VwdGlvbl9iYXNlX2FkZHI7CisJc3lzaW5mby0+Y3B1X2Nsb2NrX2h6ID0gb2N0ZW9uX2Jvb3RpbmZvLT5lY2xvY2tfaHo7CisJc3lzaW5mby0+ZHJhbV9kYXRhX3JhdGVfaHogPSBvY3Rlb25fYm9vdGluZm8tPmRjbG9ja19oeiAqIDI7CisJc3lzaW5mby0+Ym9hcmRfdHlwZSA9IG9jdGVvbl9ib290aW5mby0+Ym9hcmRfdHlwZTsKKwlzeXNpbmZvLT5ib2FyZF9yZXZfbWFqb3IgPSBvY3Rlb25fYm9vdGluZm8tPmJvYXJkX3Jldl9tYWpvcjsKKwlzeXNpbmZvLT5ib2FyZF9yZXZfbWlub3IgPSBvY3Rlb25fYm9vdGluZm8tPmJvYXJkX3Jldl9taW5vcjsKKwltZW1jcHkoc3lzaW5mby0+bWFjX2FkZHJfYmFzZSwgb2N0ZW9uX2Jvb3RpbmZvLT5tYWNfYWRkcl9iYXNlLAorCSAgICAgICBzaXplb2Yoc3lzaW5mby0+bWFjX2FkZHJfYmFzZSkpOworCXN5c2luZm8tPm1hY19hZGRyX2NvdW50ID0gb2N0ZW9uX2Jvb3RpbmZvLT5tYWNfYWRkcl9jb3VudDsKKwltZW1jcHkoc3lzaW5mby0+Ym9hcmRfc2VyaWFsX251bWJlciwKKwkgICAgICAgb2N0ZW9uX2Jvb3RpbmZvLT5ib2FyZF9zZXJpYWxfbnVtYmVyLAorCSAgICAgICBzaXplb2Yoc3lzaW5mby0+Ym9hcmRfc2VyaWFsX251bWJlcikpOworCXN5c2luZm8tPmNvbXBhY3RfZmxhc2hfY29tbW9uX2Jhc2VfYWRkciA9CisJCW9jdGVvbl9ib290aW5mby0+Y29tcGFjdF9mbGFzaF9jb21tb25fYmFzZV9hZGRyOworCXN5c2luZm8tPmNvbXBhY3RfZmxhc2hfYXR0cmlidXRlX2Jhc2VfYWRkciA9CisJCW9jdGVvbl9ib290aW5mby0+Y29tcGFjdF9mbGFzaF9hdHRyaWJ1dGVfYmFzZV9hZGRyOworCXN5c2luZm8tPmxlZF9kaXNwbGF5X2Jhc2VfYWRkciA9IG9jdGVvbl9ib290aW5mby0+bGVkX2Rpc3BsYXlfYmFzZV9hZGRyOworCXN5c2luZm8tPmRmYV9yZWZfY2xvY2tfaHogPSBvY3Rlb25fYm9vdGluZm8tPmRmYV9yZWZfY2xvY2tfaHo7CisJc3lzaW5mby0+Ym9vdGxvYWRlcl9jb25maWdfZmxhZ3MgPSBvY3Rlb25fYm9vdGluZm8tPmNvbmZpZ19mbGFnczsKKworCisJb2N0ZW9uX2NoZWNrX2NwdV9iaXN0KCk7CisKKwlvY3Rlb25fdWFydCA9IG9jdGVvbl9nZXRfYm9vdF91YXJ0KCk7CisKKwkvKgorCSAqIERpc2FibGUgQWxsIENJVSBJbnRlcnJ1cHRzLiBUaGUgb25lcyB3ZSBuZWVkIHdpbGwgYmUKKwkgKiBlbmFibGVkIGxhdGVyLiAgUmVhZCB0aGUgU1VNIHJlZ2lzdGVyIHNvIHdlIGtub3cgdGhlIHdyaXRlCisJICogY29tcGxldGVkLgorCSAqLworCWN2bXhfd3JpdGVfY3NyKENWTVhfQ0lVX0lOVFhfRU4wKChjb3JlaWQgKiAyKSksIDApOworCWN2bXhfd3JpdGVfY3NyKENWTVhfQ0lVX0lOVFhfRU4wKChjb3JlaWQgKiAyICsgMSkpLCAwKTsKKwljdm14X3dyaXRlX2NzcihDVk1YX0NJVV9JTlRYX0VOMSgoY29yZWlkICogMikpLCAwKTsKKwljdm14X3dyaXRlX2NzcihDVk1YX0NJVV9JTlRYX0VOMSgoY29yZWlkICogMiArIDEpKSwgMCk7CisJY3ZteF9yZWFkX2NzcihDVk1YX0NJVV9JTlRYX1NVTTAoKGNvcmVpZCAqIDIpKSk7CisKKyNpZmRlZiBDT05GSUdfU01QCisJb2N0ZW9uX3dyaXRlX2xjZCgiTGludXhTTVAiKTsKKyNlbHNlCisJb2N0ZW9uX3dyaXRlX2xjZCgiTGludXgiKTsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0NBVklVTV9HREIKKwkvKgorCSAqIFdoZW4gZGVidWdnaW5nIHRoZSBsaW51eCBrZXJuZWwsIGZvcmNlIHRoZSBjb3JlcyB0byBlbnRlcgorCSAqIHRoZSBkZWJ1ZyBleGNlcHRpb24gaGFuZGxlciB0byBicmVhayBpbi4KKwkgKi8KKwlpZiAob2N0ZW9uX2dldF9ib290X2RlYnVnX2ZsYWcoKSkgeworCQljdm14X3dyaXRlX2NzcihDVk1YX0NJVV9ESU5ULCAxIDw8IGN2bXhfZ2V0X2NvcmVfbnVtKCkpOworCQljdm14X3JlYWRfY3NyKENWTVhfQ0lVX0RJTlQpOworCX0KKyNlbmRpZgorCisJLyoKKwkgKiBCSVNUIHNob3VsZCBhbHdheXMgYmUgZW5hYmxlZCB3aGVuIGRvaW5nIGEgc29mdCByZXNldC4gTDIKKwkgKiBDYWNoZSBsb2NraW5nIGZvciBpbnN0YW5jZSBpcyBub3QgY2xlYXJlZCB1bmxlc3MgQklTVCBpcworCSAqIGVuYWJsZWQuICBVbmZvcnR1bmF0ZWx5IGR1ZSB0byBhIGNoaXAgZXJyYXRhIEctMjAwIGZvcgorCSAqIENuMzhYWCBhbmQgQ04zMVhYLCBCSVNUIG1zdXQgYmUgZGlzYWJsZWQgb24gdGhlc2UgcGFydHMuCisJICovCisJaWYgKE9DVEVPTl9JU19NT0RFTChPQ1RFT05fQ04zOFhYX1BBU1MyKSB8fAorCSAgICBPQ1RFT05fSVNfTU9ERUwoT0NURU9OX0NOMzFYWCkpCisJCWN2bXhfd3JpdGVfY3NyKENWTVhfQ0lVX1NPRlRfQklTVCwgMCk7CisJZWxzZQorCQljdm14X3dyaXRlX2NzcihDVk1YX0NJVV9TT0ZUX0JJU1QsIDEpOworCisJLyogRGVmYXVsdCB0byA2NE1CIGluIHRoZSBzaW11bGF0b3IgdG8gc3BlZWQgdGhpbmdzIHVwICovCisJaWYgKG9jdGVvbl9pc19zaW11bGF0aW9uKCkpCisJCU1BWF9NRU1PUlkgPSA2NHVsbCA8PCAyMDsKKworCWFyY3NfY21kbGluZVswXSA9IDA7CisJYXJnYyA9IG9jdGVvbl9ib290X2Rlc2NfcHRyLT5hcmdjOworCWZvciAoaSA9IDA7IGkgPCBhcmdjOyBpKyspIHsKKwkJY29uc3QgY2hhciAqYXJnID0KKwkJCWN2bXhfcGh5c190b19wdHIob2N0ZW9uX2Jvb3RfZGVzY19wdHItPmFyZ3ZbaV0pOworCQlpZiAoKHN0cm5jbXAoYXJnLCAiTUVNPSIsIDQpID09IDApIHx8CisJCSAgICAoc3RybmNtcChhcmcsICJtZW09IiwgNCkgPT0gMCkpIHsKKwkJCXNzY2FuZihhcmcgKyA0LCAiJWxsdSIsICZNQVhfTUVNT1JZKTsKKwkJCU1BWF9NRU1PUlkgPDw9IDIwOworCQkJaWYgKE1BWF9NRU1PUlkgPT0gMCkKKwkJCQlNQVhfTUVNT1JZID0gMzJ1bGwgPDwgMzA7CisJCX0gZWxzZSBpZiAoc3RyY21wKGFyZywgImVjY192ZXJib3NlIikgPT0gMCkgeworI2lmZGVmIENPTkZJR19DQVZJVU1fUkVQT1JUX1NJTkdMRV9CSVRfRUNDCisJCQlfX2N2bXhfaW50ZXJydXB0X2VjY19yZXBvcnRfc2luZ2xlX2JpdF9lcnJvcnMgPSAxOworCQkJcHJfbm90aWNlKCJSZXBvcnRpbmcgb2Ygc2luZ2xlIGJpdCBFQ0MgZXJyb3JzIGlzICIKKwkJCQkgICJ0dXJuZWQgb25cbiIpOworI2VuZGlmCisJCX0gZWxzZSBpZiAoc3RybGVuKGFyY3NfY21kbGluZSkgKyBzdHJsZW4oYXJnKSArIDEgPAorCQkJICAgc2l6ZW9mKGFyY3NfY21kbGluZSkgLSAxKSB7CisJCQlzdHJjYXQoYXJjc19jbWRsaW5lLCAiICIpOworCQkJc3RyY2F0KGFyY3NfY21kbGluZSwgYXJnKTsKKwkJfQorCX0KKworCWlmIChzdHJzdHIoYXJjc19jbWRsaW5lLCAiY29uc29sZT0iKSA9PSBOVUxMKSB7CisjaWZkZWYgQ09ORklHX0dEQl9DT05TT0xFCisJCXN0cmNhdChhcmNzX2NtZGxpbmUsICIgY29uc29sZT1nZGIiKTsKKyNlbHNlCisjaWZkZWYgQ09ORklHX0NBVklVTV9PQ1RFT05fMk5EX0tFUk5FTAorCQlzdHJjYXQoYXJjc19jbWRsaW5lLCAiIGNvbnNvbGU9dHR5UzAsMTE1MjAwIik7CisjZWxzZQorCQlpZiAob2N0ZW9uX3VhcnQgPT0gMSkKKwkJCXN0cmNhdChhcmNzX2NtZGxpbmUsICIgY29uc29sZT10dHlTMSwxMTUyMDAiKTsKKwkJZWxzZQorCQkJc3RyY2F0KGFyY3NfY21kbGluZSwgIiBjb25zb2xlPXR0eVMwLDExNTIwMCIpOworI2VuZGlmCisjZW5kaWYKKwl9CisKKwlpZiAob2N0ZW9uX2lzX3NpbXVsYXRpb24oKSkgeworCQkvKgorCQkgKiBUaGUgc2ltdWxhdG9yIHVzZXMgYSBtdGRyYW0gZGV2aWNlIHByZSBmaWxsZWQgd2l0aAorCQkgKiB0aGUgZmlsZXN5c3RlbS4gQWxzbyBzcGVjaWZ5IHRoZSBjYWxpYnJhdGlvbiBkZWxheQorCQkgKiB0byBhdm9pZCBjYWxjdWxhdGluZyBpdCBldmVyeSB0aW1lLgorCQkgKi8KKwkJc3RyY2F0KGFyY3NfY21kbGluZSwgIiBydyByb290PTFmMDAiCisJCSAgICAgICAiIGxwaj02MDE3NiBzbHJhbT1yb290LDB4NDAwMDAwMDAsKzEwNzM3NDE4MjQiKTsKKwl9CisKKwltaXBzX2hwdF9mcmVxdWVuY3kgPSBvY3Rlb25fZ2V0X2Nsb2NrX3JhdGUoKTsKKworCW9jdGVvbl9pbml0X2N2bWNvdW50KCk7CisKKwlfbWFjaGluZV9yZXN0YXJ0ID0gb2N0ZW9uX3Jlc3RhcnQ7CisJX21hY2hpbmVfaGFsdCA9IG9jdGVvbl9oYWx0OworCisJbWVtc2V0KCZvY3Rlb25fcG9ydCwgMCwgc2l6ZW9mKG9jdGVvbl9wb3J0KSk7CisJLyoKKwkgKiBGb3IgZWFybHlfc2VyaWFsX3NldHVwIHdlIGRvbid0IHNldCB0aGUgcG9ydCB0eXBlIG9yCisJICogVVBGX0ZJWEVEX1RZUEUuCisJICovCisJb2N0ZW9uX3BvcnQuZmxhZ3MgPSBBU1lOQ19TS0lQX1RFU1QgfCBVUEZfU0hBUkVfSVJROworCW9jdGVvbl9wb3J0LmlvdHlwZSA9IFVQSU9fTUVNOworCS8qIEkvTyBhZGRyZXNzZXMgYXJlIGV2ZXJ5IDggYnl0ZXMgKi8KKwlvY3Rlb25fcG9ydC5yZWdzaGlmdCA9IDM7CisJLyogQ2xvY2sgcmF0ZSBvZiB0aGUgY2hpcCAqLworCW9jdGVvbl9wb3J0LnVhcnRjbGsgPSBtaXBzX2hwdF9mcmVxdWVuY3k7CisJb2N0ZW9uX3BvcnQuZmlmb3NpemUgPSA2NDsKKwlvY3Rlb25fcG9ydC5tYXBiYXNlID0gMHgwMDAxMTgwMDAwMDAwODAwdWxsICsgKDEwMjQgKiBvY3Rlb25fdWFydCk7CisJb2N0ZW9uX3BvcnQubWVtYmFzZSA9IGN2bXhfcGh5c190b19wdHIob2N0ZW9uX3BvcnQubWFwYmFzZSk7CisJb2N0ZW9uX3BvcnQuc2VyaWFsX2luID0gb2N0ZW9uX3NlcmlhbF9pbjsKKwlvY3Rlb25fcG9ydC5zZXJpYWxfb3V0ID0gb2N0ZW9uX3NlcmlhbF9vdXQ7CisjaWZkZWYgQ09ORklHX0NBVklVTV9PQ1RFT05fMk5EX0tFUk5FTAorCW9jdGVvbl9wb3J0LmxpbmUgPSAwOworI2Vsc2UKKwlvY3Rlb25fcG9ydC5saW5lID0gb2N0ZW9uX3VhcnQ7CisjZW5kaWYKKwlvY3Rlb25fcG9ydC5pcnEgPSA0MiArIG9jdGVvbl91YXJ0OworCWVhcmx5X3NlcmlhbF9zZXR1cCgmb2N0ZW9uX3BvcnQpOworCisJb2N0ZW9uX3VzZXJfaW9faW5pdCgpOworCXJlZ2lzdGVyX3NtcF9vcHMoJm9jdGVvbl9zbXBfb3BzKTsKK30KKwordm9pZCBfX2luaXQgcGxhdF9tZW1fc2V0dXAodm9pZCkKK3sKKwl1aW50NjRfdCBtZW1fYWxsb2Nfc2l6ZTsKKwl1aW50NjRfdCB0b3RhbDsKKwlpbnQ2NF90IG1lbW9yeTsKKworCXRvdGFsID0gMDsKKworCS8qIEZpcnN0IGFkZCB0aGUgaW5pdCBtZW1vcnkgd2Ugd2lsbCBiZSByZXR1cm5pbmcuICAqLworCW1lbW9yeSA9IF9fcGFfc3ltYm9sKCZfX2luaXRfYmVnaW4pICYgUEFHRV9NQVNLOworCW1lbV9hbGxvY19zaXplID0gKF9fcGFfc3ltYm9sKCZfX2luaXRfZW5kKSAmIFBBR0VfTUFTSykgLSBtZW1vcnk7CisJaWYgKG1lbV9hbGxvY19zaXplID4gMCkgeworCQlhZGRfbWVtb3J5X3JlZ2lvbihtZW1vcnksIG1lbV9hbGxvY19zaXplLCBCT09UX01FTV9SQU0pOworCQl0b3RhbCArPSBtZW1fYWxsb2Nfc2l6ZTsKKwl9CisKKwkvKgorCSAqIFRoZSBNaXBzIG1lbW9yeSBpbml0IHVzZXMgdGhlIGZpcnN0IG1lbW9yeSBsb2NhdGlvbiBmb3IKKwkgKiBzb21lIG1lbW9yeSB2ZWN0b3JzLiBXaGVuIFNQQVJTRU1FTSBpcyBpbiB1c2UsIGl0IGRvZXNuJ3QKKwkgKiB2ZXJpZnkgdGhhdCB0aGUgc2l6ZSBpcyBiaWcgZW5vdWdoIGZvciB0aGUgZmluYWwKKwkgKiB2ZWN0b3JzLiBNYWtpbmcgdGhlIHNtYWxsZXN0IGNodWNrIDRNQiBzZWVtcyB0byBiZSBlbm91Z2gKKwkgKiB0byBjb25zaXN0YW50bHkgd29yay4KKwkgKi8KKwltZW1fYWxsb2Nfc2l6ZSA9IDQgPDwgMjA7CisJaWYgKG1lbV9hbGxvY19zaXplID4gTUFYX01FTU9SWSkKKwkJbWVtX2FsbG9jX3NpemUgPSBNQVhfTUVNT1JZOworCisJLyoKKwkgKiBXaGVuIGFsbG9jYXRpbmcgbWVtb3J5LCB3ZSB3YW50IGluY3JlbWVudGluZyBhZGRyZXNzZXMgZnJvbQorCSAqIGJvb3RtZW1fYWxsb2Mgc28gdGhlIGNvZGUgaW4gYWRkX21lbW9yeV9yZWdpb24gY2FuIG1lcmdlCisJICogcmVnaW9ucyBuZXh0IHRvIGVhY2ggb3RoZXIuCisJICovCisJY3ZteF9ib290bWVtX2xvY2soKTsKKwl3aGlsZSAoKGJvb3RfbWVtX21hcC5ucl9tYXAgPCBCT09UX01FTV9NQVBfTUFYKQorCQkmJiAodG90YWwgPCBNQVhfTUVNT1JZKSkgeworI2lmIGRlZmluZWQoQ09ORklHXzY0QklUKSB8fCBkZWZpbmVkKENPTkZJR182NEJJVF9QSFlTX0FERFIpCisJCW1lbW9yeSA9IGN2bXhfYm9vdG1lbV9waHlfYWxsb2MobWVtX2FsbG9jX3NpemUsCisJCQkJCQlfX3BhX3N5bWJvbCgmX19pbml0X2VuZCksIC0xLAorCQkJCQkJMHgxMDAwMDAsCisJCQkJCQlDVk1YX0JPT1RNRU1fRkxBR19OT19MT0NLSU5HKTsKKyNlbGlmIGRlZmluZWQoQ09ORklHX0hJR0hNRU0pCisJCW1lbW9yeSA9IGN2bXhfYm9vdG1lbV9waHlfYWxsb2MobWVtX2FsbG9jX3NpemUsIDAsIDF1bGwgPDwgMzEsCisJCQkJCQkweDEwMDAwMCwKKwkJCQkJCUNWTVhfQk9PVE1FTV9GTEFHX05PX0xPQ0tJTkcpOworI2Vsc2UKKwkJbWVtb3J5ID0gY3ZteF9ib290bWVtX3BoeV9hbGxvYyhtZW1fYWxsb2Nfc2l6ZSwgMCwgNTEyIDw8IDIwLAorCQkJCQkJMHgxMDAwMDAsCisJCQkJCQlDVk1YX0JPT1RNRU1fRkxBR19OT19MT0NLSU5HKTsKKyNlbmRpZgorCQlpZiAobWVtb3J5ID49IDApIHsKKwkJCS8qCisJCQkgKiBUaGlzIGZ1bmN0aW9uIGF1dG9tYXRpY2FsbHkgbWVyZ2VzIGFkZHJlc3MKKwkJCSAqIHJlZ2lvbnMgbmV4dCB0byBlYWNoIG90aGVyIGlmIHRoZXkgYXJlCisJCQkgKiByZWNlaXZlZCBpbiBpbmNyZW1lbnRpbmcgb3JkZXIuCisJCQkgKi8KKwkJCWFkZF9tZW1vcnlfcmVnaW9uKG1lbW9yeSwgbWVtX2FsbG9jX3NpemUsIEJPT1RfTUVNX1JBTSk7CisJCQl0b3RhbCArPSBtZW1fYWxsb2Nfc2l6ZTsKKwkJfSBlbHNlIHsKKwkJCWJyZWFrOworCQl9CisJfQorCWN2bXhfYm9vdG1lbV91bmxvY2soKTsKKworI2lmZGVmIENPTkZJR19DQVZJVU1fUkVTRVJWRTMyCisJLyoKKwkgKiBOb3cgdGhhdCB3ZSd2ZSBhbGxvY2F0ZWQgdGhlIGtlcm5lbCBtZW1vcnkgaXQgaXMgc2FmZSB0bworCSAqIGZyZWUgdGhlIHJlc2VydmVkIHJlZ2lvbi4gV2UgZnJlZSBpdCBoZXJlIHNvIHRoYXQgYnVpbHRpbgorCSAqIGRyaXZlcnMgY2FuIHVzZSB0aGUgbWVtb3J5LgorCSAqLworCWlmIChvY3Rlb25fcmVzZXJ2ZTMyX21lbW9yeSkKKwkJY3ZteF9ib290bWVtX2ZyZWVfbmFtZWQoIkNBVklVTV9SRVNFUlZFMzIiKTsKKyNlbmRpZiAvKiBDT05GSUdfQ0FWSVVNX1JFU0VSVkUzMiAqLworCisJaWYgKHRvdGFsID09IDApCisJCXBhbmljKCJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZyb20gIgorCQkgICAgICAiY3ZteF9ib290bWVtX3BoeV9hbGxvY1xuIik7Cit9CisKKworaW50IHByb21fcHV0Y2hhcihjaGFyIGMpCit7CisJdWludDY0X3QgbHNydmFsOworCisJLyogU3BpbiB1bnRpbCB0aGVyZSBpcyByb29tICovCisJZG8geworCQlsc3J2YWwgPSBjdm14X3JlYWRfY3NyKENWTVhfTUlPX1VBUlRYX0xTUihvY3Rlb25fdWFydCkpOworCX0gd2hpbGUgKChsc3J2YWwgJiAweDIwKSA9PSAwKTsKKworCS8qIFdyaXRlIHRoZSBieXRlICovCisJY3ZteF93cml0ZV9jc3IoQ1ZNWF9NSU9fVUFSVFhfVEhSKG9jdGVvbl91YXJ0KSwgYyk7CisJcmV0dXJuIDE7Cit9CisKK3ZvaWQgcHJvbV9mcmVlX3Byb21fbWVtb3J5KHZvaWQpCit7CisjaWZkZWYgQ09ORklHX0NBVklVTV9ERUNPREVfUlNMCisJY3ZteF9pbnRlcnJ1cHRfcnNsX2VuYWJsZSgpOworCisJLyogQWRkIGFuIGludGVycnVwdCBoYW5kbGVyIGZvciBnZW5lcmFsIGZhaWx1cmVzLiAqLworCWlmIChyZXF1ZXN0X2lycShPQ1RFT05fSVJRX1JNTCwgb2N0ZW9uX3JsbV9pbnRlcnJ1cHQsIElSUUZfU0hBUkVELAorCQkJIlJNTC9SU0wiLCBvY3Rlb25fcmxtX2ludGVycnVwdCkpIHsKKwkJcGFuaWMoIlVuYWJsZSB0byByZXF1ZXN0X2lycShPQ1RFT05fSVJRX1JNTClcbiIpOworCX0KKyNlbmRpZgorCisJLyogVGhpcyBjYWxsIGlzIGhlcmUgc28gdGhhdCBpdCBpcyBwZXJmb3JtZWQgYWZ0ZXIgYW55IFRMQgorCSAgIGluaXRpYWxpemF0aW9ucy4gSXQgbmVlZHMgdG8gYmUgYWZ0ZXIgdGhlc2UgaW4gY2FzZSB0aGUKKwkgICBDT05GSUdfQ0FWSVVNX1JFU0VSVkUzMl9VU0VfV0lSRURfVExCIG9wdGlvbiBpcyBzZXQgKi8KKwlvY3Rlb25faGFsX3NldHVwX3Jlc2VydmVkMzIoKTsKK30KKworc3RhdGljIHN0cnVjdCBvY3Rlb25fY2ZfZGF0YSBvY3Rlb25fY2ZfZGF0YTsKKworc3RhdGljIGludCBfX2luaXQgb2N0ZW9uX2NmX2RldmljZV9pbml0KHZvaWQpCit7CisJdW5pb24gY3ZteF9taW9fYm9vdF9yZWdfY2ZneCBtaW9fYm9vdF9yZWdfY2ZnOworCXVuc2lnbmVkIGxvbmcgYmFzZV9wdHIsIHJlZ2lvbl9iYXNlLCByZWdpb25fc2l6ZTsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZDsKKwlzdHJ1Y3QgcmVzb3VyY2UgY2ZfcmVzb3VyY2VzWzNdOworCXVuc2lnbmVkIGludCBudW1fcmVzb3VyY2VzOworCWludCBpOworCWludCByZXQgPSAwOworCisJLyogU2V0dXAgb2N0ZW9uLWNmIHBsYXRmb3JtIGRldmljZSBpZiBwcmVzZW50LiAqLworCWJhc2VfcHRyID0gMDsKKwlpZiAob2N0ZW9uX2Jvb3RpbmZvLT5tYWpvcl92ZXJzaW9uID09IDEKKwkJJiYgb2N0ZW9uX2Jvb3RpbmZvLT5taW5vcl92ZXJzaW9uID49IDEpIHsKKwkJaWYgKG9jdGVvbl9ib290aW5mby0+Y29tcGFjdF9mbGFzaF9jb21tb25fYmFzZV9hZGRyKQorCQkJYmFzZV9wdHIgPQorCQkJCW9jdGVvbl9ib290aW5mby0+Y29tcGFjdF9mbGFzaF9jb21tb25fYmFzZV9hZGRyOworCX0gZWxzZSB7CisJCWJhc2VfcHRyID0gMHgxZDAwMDgwMDsKKwl9CisKKwlpZiAoIWJhc2VfcHRyKQorCQlyZXR1cm4gcmV0OworCisJLyogRmluZCBDUzAgcmVnaW9uLiAqLworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKwkJbWlvX2Jvb3RfcmVnX2NmZy51NjQgPSBjdm14X3JlYWRfY3NyKENWTVhfTUlPX0JPT1RfUkVHX0NGR1goaSkpOworCQlyZWdpb25fYmFzZSA9IG1pb19ib290X3JlZ19jZmcucy5iYXNlIDw8IDE2OworCQlyZWdpb25fc2l6ZSA9IChtaW9fYm9vdF9yZWdfY2ZnLnMuc2l6ZSArIDEpIDw8IDE2OworCQlpZiAobWlvX2Jvb3RfcmVnX2NmZy5zLmVuICYmIGJhc2VfcHRyID49IHJlZ2lvbl9iYXNlCisJCSAgICAmJiBiYXNlX3B0ciA8IHJlZ2lvbl9iYXNlICsgcmVnaW9uX3NpemUpCisJCQlicmVhazsKKwl9CisJaWYgKGkgPj0gNykgeworCQkvKiBpIGFuZCBpICsgMSBhcmUgQ1MwIGFuZCBDUzEsIGJvdGggbXVzdCBiZSBsZXNzIHRoYW4gOC4gKi8KKwkJZ290byBvdXQ7CisJfQorCW9jdGVvbl9jZl9kYXRhLmJhc2VfcmVnaW9uID0gaTsKKwlvY3Rlb25fY2ZfZGF0YS5pczE2Yml0ID0gbWlvX2Jvb3RfcmVnX2NmZy5zLndpZHRoOworCW9jdGVvbl9jZl9kYXRhLmJhc2VfcmVnaW9uX2JpYXMgPSBiYXNlX3B0ciAtIHJlZ2lvbl9iYXNlOworCW1lbXNldChjZl9yZXNvdXJjZXMsIDAsIHNpemVvZihjZl9yZXNvdXJjZXMpKTsKKwludW1fcmVzb3VyY2VzID0gMDsKKwljZl9yZXNvdXJjZXNbbnVtX3Jlc291cmNlc10uZmxhZ3MJPSBJT1JFU09VUkNFX01FTTsKKwljZl9yZXNvdXJjZXNbbnVtX3Jlc291cmNlc10uc3RhcnQJPSByZWdpb25fYmFzZTsKKwljZl9yZXNvdXJjZXNbbnVtX3Jlc291cmNlc10uZW5kCT0gcmVnaW9uX2Jhc2UgKyByZWdpb25fc2l6ZSAtIDE7CisJbnVtX3Jlc291cmNlcysrOworCisKKwlpZiAoIShiYXNlX3B0ciAmIDB4ZmZmZnVsKSkgeworCQkvKgorCQkgKiBCb290IGxvYWRlciBzaWduYWxzIGF2YWlsYWJpbGl0eSBvZiBETUEgKHRydWVfaWRlCisJCSAqIG1vZGUpIGJ5IHNldHRpbmcgbG93IG9yZGVyIGJpdHMgb2YgYmFzZV9wdHIgdG8KKwkJICogemVyby4KKwkJICovCisKKwkJLyogQXN1bWUgdGhhdCBDUzEgaW1tZWRpYXRlbHkgZm9sbG93cy4gKi8KKwkJbWlvX2Jvb3RfcmVnX2NmZy51NjQgPQorCQkJY3ZteF9yZWFkX2NzcihDVk1YX01JT19CT09UX1JFR19DRkdYKGkgKyAxKSk7CisJCXJlZ2lvbl9iYXNlID0gbWlvX2Jvb3RfcmVnX2NmZy5zLmJhc2UgPDwgMTY7CisJCXJlZ2lvbl9zaXplID0gKG1pb19ib290X3JlZ19jZmcucy5zaXplICsgMSkgPDwgMTY7CisJCWlmICghbWlvX2Jvb3RfcmVnX2NmZy5zLmVuKQorCQkJZ290byBvdXQ7CisKKwkJY2ZfcmVzb3VyY2VzW251bV9yZXNvdXJjZXNdLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU07CisJCWNmX3Jlc291cmNlc1tudW1fcmVzb3VyY2VzXS5zdGFydAk9IHJlZ2lvbl9iYXNlOworCQljZl9yZXNvdXJjZXNbbnVtX3Jlc291cmNlc10uZW5kCT0gcmVnaW9uX2Jhc2UgKyByZWdpb25fc2l6ZSAtIDE7CisJCW51bV9yZXNvdXJjZXMrKzsKKworCQlvY3Rlb25fY2ZfZGF0YS5kbWFfZW5naW5lID0gMDsKKwkJY2ZfcmVzb3VyY2VzW251bV9yZXNvdXJjZXNdLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlE7CisJCWNmX3Jlc291cmNlc1tudW1fcmVzb3VyY2VzXS5zdGFydAk9IE9DVEVPTl9JUlFfQk9PVERNQTsKKwkJY2ZfcmVzb3VyY2VzW251bV9yZXNvdXJjZXNdLmVuZAk9IE9DVEVPTl9JUlFfQk9PVERNQTsKKwkJbnVtX3Jlc291cmNlcysrOworCX0gZWxzZSB7CisJCW9jdGVvbl9jZl9kYXRhLmRtYV9lbmdpbmUgPSAtMTsKKwl9CisKKwlwZCA9IHBsYXRmb3JtX2RldmljZV9hbGxvYygicGF0YV9vY3Rlb25fY2YiLCAtMSk7CisJaWYgKCFwZCkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIG91dDsKKwl9CisJcGQtPmRldi5wbGF0Zm9ybV9kYXRhID0gJm9jdGVvbl9jZl9kYXRhOworCisJcmV0ID0gcGxhdGZvcm1fZGV2aWNlX2FkZF9yZXNvdXJjZXMocGQsIGNmX3Jlc291cmNlcywgbnVtX3Jlc291cmNlcyk7CisJaWYgKHJldCkKKwkJZ290byBmYWlsOworCisJcmV0ID0gcGxhdGZvcm1fZGV2aWNlX2FkZChwZCk7CisJaWYgKHJldCkKKwkJZ290byBmYWlsOworCisJcmV0dXJuIHJldDsKK2ZhaWw6CisJcGxhdGZvcm1fZGV2aWNlX3B1dChwZCk7CitvdXQ6CisJcmV0dXJuIHJldDsKK30KK2RldmljZV9pbml0Y2FsbChvY3Rlb25fY2ZfZGV2aWNlX2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2Nhdml1bS1vY3Rlb24vc21wLmMgYi9hcmNoL21pcHMvY2F2aXVtLW9jdGVvbi9zbXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNGUwYWQ2Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9taXBzL2Nhdml1bS1vY3Rlb24vc21wLmMKQEAgLTAsMCArMSwyMTEgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwOCBDYXZpdW0gTmV0d29ya3MKKyAqLworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbF9zdGF0Lmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgPGFzbS9tbXVfY29udGV4dC5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vdGltZS5oPgorCisjaW5jbHVkZSA8YXNtL29jdGVvbi9vY3Rlb24uaD4KKwordm9sYXRpbGUgdW5zaWduZWQgbG9uZyBvY3Rlb25fcHJvY2Vzc29yX2Jvb3QgPSAweGZmOwordm9sYXRpbGUgdW5zaWduZWQgbG9uZyBvY3Rlb25fcHJvY2Vzc29yX3NwOwordm9sYXRpbGUgdW5zaWduZWQgbG9uZyBvY3Rlb25fcHJvY2Vzc29yX2dwOworCitzdGF0aWMgaXJxcmV0dXJuX3QgbWFpbGJveF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkKQoreworCWNvbnN0IGludCBjb3JlaWQgPSBjdm14X2dldF9jb3JlX251bSgpOworCXVpbnQ2NF90IGFjdGlvbjsKKworCS8qIExvYWQgdGhlIG1haWxib3ggcmVnaXN0ZXIgdG8gZmlndXJlIG91dCB3aGF0IHdlJ3JlIHN1cHBvc2VkIHRvIGRvICovCisJYWN0aW9uID0gY3ZteF9yZWFkX2NzcihDVk1YX0NJVV9NQk9YX0NMUlgoY29yZWlkKSk7CisKKwkvKiBDbGVhciB0aGUgbWFpbGJveCB0byBjbGVhciB0aGUgaW50ZXJydXB0ICovCisJY3ZteF93cml0ZV9jc3IoQ1ZNWF9DSVVfTUJPWF9DTFJYKGNvcmVpZCksIGFjdGlvbik7CisKKwlpZiAoYWN0aW9uICYgU01QX0NBTExfRlVOQ1RJT04pCisJCXNtcF9jYWxsX2Z1bmN0aW9uX2ludGVycnVwdCgpOworCisJLyogQ2hlY2sgaWYgd2UndmUgYmVlbiB0b2xkIHRvIGZsdXNoIHRoZSBpY2FjaGUgKi8KKwlpZiAoYWN0aW9uICYgU01QX0lDQUNIRV9GTFVTSCkKKwkJYXNtIHZvbGF0aWxlICgic3luY2kgMCgkMClcbiIpOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworLyoqCisgKiBDYXVzZSB0aGUgZnVuY3Rpb24gZGVzY3JpYmVkIGJ5IGNhbGxfZGF0YSB0byBiZSBleGVjdXRlZCBvbiB0aGUgcGFzc2VkCisgKiBjcHUuICBXaGVuIHRoZSBmdW5jdGlvbiBoYXMgZmluaXNoZWQsIGluY3JlbWVudCB0aGUgZmluaXNoZWQgZmllbGQgb2YKKyAqIGNhbGxfZGF0YS4KKyAqLwordm9pZCBvY3Rlb25fc2VuZF9pcGlfc2luZ2xlKGludCBjcHUsIHVuc2lnbmVkIGludCBhY3Rpb24pCit7CisJaW50IGNvcmVpZCA9IGNwdV9sb2dpY2FsX21hcChjcHUpOworCS8qCisJcHJfaW5mbygiU01QOiBNYWlsYm94IHNlbmQgY3B1PSVkLCBjb3JlaWQ9JWQsIGFjdGlvbj0ldVxuIiwgY3B1LAorCSAgICAgICBjb3JlaWQsIGFjdGlvbik7CisJKi8KKwljdm14X3dyaXRlX2NzcihDVk1YX0NJVV9NQk9YX1NFVFgoY29yZWlkKSwgYWN0aW9uKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG9jdGVvbl9zZW5kX2lwaV9tYXNrKGNwdW1hc2tfdCBtYXNrLCB1bnNpZ25lZCBpbnQgYWN0aW9uKQoreworCXVuc2lnbmVkIGludCBpOworCisJZm9yX2VhY2hfY3B1X21hc2soaSwgbWFzaykKKwkJb2N0ZW9uX3NlbmRfaXBpX3NpbmdsZShpLCBhY3Rpb24pOworfQorCisvKioKKyAqIERldGVjdCBhdmFpbGFibGUgQ1BVcywgcG9wdWxhdGUgcGh5c19jcHVfcHJlc2VudF9tYXAKKyAqLworc3RhdGljIHZvaWQgb2N0ZW9uX3NtcF9zZXR1cCh2b2lkKQoreworCWNvbnN0IGludCBjb3JlaWQgPSBjdm14X2dldF9jb3JlX251bSgpOworCWludCBjcHVzOworCWludCBpZDsKKworCWludCBjb3JlX21hc2sgPSBvY3Rlb25fZ2V0X2Jvb3RfY29yZW1hc2soKTsKKworCWNwdXNfY2xlYXIoY3B1X3Bvc3NpYmxlX21hcCk7CisJX19jcHVfbnVtYmVyX21hcFtjb3JlaWRdID0gMDsKKwlfX2NwdV9sb2dpY2FsX21hcFswXSA9IGNvcmVpZDsKKwljcHVfc2V0KDAsIGNwdV9wb3NzaWJsZV9tYXApOworCisJY3B1cyA9IDE7CisJZm9yIChpZCA9IDA7IGlkIDwgMTY7IGlkKyspIHsKKwkJaWYgKChpZCAhPSBjb3JlaWQpICYmIChjb3JlX21hc2sgJiAoMSA8PCBpZCkpKSB7CisJCQljcHVfc2V0KGNwdXMsIGNwdV9wb3NzaWJsZV9tYXApOworCQkJX19jcHVfbnVtYmVyX21hcFtpZF0gPSBjcHVzOworCQkJX19jcHVfbG9naWNhbF9tYXBbY3B1c10gPSBpZDsKKwkJCWNwdXMrKzsKKwkJfQorCX0KK30KKworLyoqCisgKiBGaXJtd2FyZSBDUFUgc3RhcnR1cCBob29rCisgKgorICovCitzdGF0aWMgdm9pZCBvY3Rlb25fYm9vdF9zZWNvbmRhcnkoaW50IGNwdSwgc3RydWN0IHRhc2tfc3RydWN0ICppZGxlKQoreworCWludCBjb3VudDsKKworCXByX2luZm8oIlNNUDogQm9vdGluZyBDUFUlMDJkIChDb3JlSWQgJTJkKS4uLlxuIiwgY3B1LAorCQljcHVfbG9naWNhbF9tYXAoY3B1KSk7CisKKwlvY3Rlb25fcHJvY2Vzc29yX3NwID0gX19LU1RLX1RPUyhpZGxlKTsKKwlvY3Rlb25fcHJvY2Vzc29yX2dwID0gKHVuc2lnbmVkIGxvbmcpKHRhc2tfdGhyZWFkX2luZm8oaWRsZSkpOworCW9jdGVvbl9wcm9jZXNzb3JfYm9vdCA9IGNwdV9sb2dpY2FsX21hcChjcHUpOworCW1iKCk7CisKKwljb3VudCA9IDEwMDAwOworCXdoaWxlIChvY3Rlb25fcHJvY2Vzc29yX3NwICYmIGNvdW50KSB7CisJCS8qIFdhaXRpbmcgZm9yIHByb2Nlc3NvciB0byBnZXQgdGhlIFNQIGFuZCBHUCAqLworCQl1ZGVsYXkoMSk7CisJCWNvdW50LS07CisJfQorCWlmIChjb3VudCA9PSAwKQorCQlwcl9lcnIoIlNlY29uZGFyeSBib290IHRpbWVvdXRcbiIpOworfQorCisvKioKKyAqIEFmdGVyIHdlJ3ZlIGRvbmUgaW5pdGlhbCBib290LCB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBhbGxvdyB0aGUKKyAqIGJvYXJkIGNvZGUgdG8gY2xlYW4gdXAgc3RhdGUsIGlmIG5lZWRlZAorICovCitzdGF0aWMgdm9pZCBvY3Rlb25faW5pdF9zZWNvbmRhcnkodm9pZCkKK3sKKwljb25zdCBpbnQgY29yZWlkID0gY3ZteF9nZXRfY29yZV9udW0oKTsKKwl1bmlvbiBjdm14X2NpdV9pbnR4X3N1bTAgaW50ZXJydXB0X2VuYWJsZTsKKworCW9jdGVvbl9jaGVja19jcHVfYmlzdCgpOworCW9jdGVvbl9pbml0X2N2bWNvdW50KCk7CisJLyoKKwlwcl9pbmZvKCJTTVA6IENQVSVkIChDb3JlSWQgJWx1KSBzdGFydGVkXG4iLCBjcHUsIGNvcmVpZCk7CisJKi8KKwkvKiBFbmFibGUgTWFpbGJveCBpbnRlcnJ1cHRzIHRvIHRoaXMgY29yZS4gVGhlc2UgYXJlIHRoZSBvbmx5CisJICAgaW50ZXJydXB0cyBhbGxvd2VkIG9uIGxpbmUgMyAqLworCWN2bXhfd3JpdGVfY3NyKENWTVhfQ0lVX01CT1hfQ0xSWChjb3JlaWQpLCAweGZmZmZmZmZmKTsKKwlpbnRlcnJ1cHRfZW5hYmxlLnU2NCA9IDA7CisJaW50ZXJydXB0X2VuYWJsZS5zLm1ib3ggPSAweDM7CisJY3ZteF93cml0ZV9jc3IoQ1ZNWF9DSVVfSU5UWF9FTjAoKGNvcmVpZCAqIDIpKSwgaW50ZXJydXB0X2VuYWJsZS51NjQpOworCWN2bXhfd3JpdGVfY3NyKENWTVhfQ0lVX0lOVFhfRU4wKChjb3JlaWQgKiAyICsgMSkpLCAwKTsKKwljdm14X3dyaXRlX2NzcihDVk1YX0NJVV9JTlRYX0VOMSgoY29yZWlkICogMikpLCAwKTsKKwljdm14X3dyaXRlX2NzcihDVk1YX0NJVV9JTlRYX0VOMSgoY29yZWlkICogMiArIDEpKSwgMCk7CisJLyogRW5hYmxlIGNvcmUgaW50ZXJydXB0IHByb2Nlc3NpbmcgZm9yIDIsMyBhbmQgNyAqLworCXNldF9jMF9zdGF0dXMoMHg4YzAxKTsKK30KKworLyoqCisgKiBDYWxsb3V0IHRvIGZpcm13YXJlIGJlZm9yZSBzbXBfaW5pdAorICoKKyAqLwordm9pZCBvY3Rlb25fcHJlcGFyZV9jcHVzKHVuc2lnbmVkIGludCBtYXhfY3B1cykKK3sKKwljdm14X3dyaXRlX2NzcihDVk1YX0NJVV9NQk9YX0NMUlgoY3ZteF9nZXRfY29yZV9udW0oKSksIDB4ZmZmZmZmZmYpOworCWlmIChyZXF1ZXN0X2lycShPQ1RFT05fSVJRX01CT1gwLCBtYWlsYm94X2ludGVycnVwdCwgSVJRRl9TSEFSRUQsCisJCQkibWFpbGJveDAiLCBtYWlsYm94X2ludGVycnVwdCkpIHsKKwkJcGFuaWMoIkNhbm5vdCByZXF1ZXN0X2lycShPQ1RFT05fSVJRX01CT1gwKVxuIik7CisJfQorCWlmIChyZXF1ZXN0X2lycShPQ1RFT05fSVJRX01CT1gxLCBtYWlsYm94X2ludGVycnVwdCwgSVJRRl9TSEFSRUQsCisJCQkibWFpbGJveDEiLCBtYWlsYm94X2ludGVycnVwdCkpIHsKKwkJcGFuaWMoIkNhbm5vdCByZXF1ZXN0X2lycShPQ1RFT05fSVJRX01CT1gxKVxuIik7CisJfQorfQorCisvKioKKyAqIExhc3QgY2hhbmNlIGZvciB0aGUgYm9hcmQgY29kZSB0byBmaW5pc2ggU01QIGluaXRpYWxpemF0aW9uIGJlZm9yZQorICogdGhlIENQVSBpcyAib25saW5lIi4KKyAqLworc3RhdGljIHZvaWQgb2N0ZW9uX3NtcF9maW5pc2godm9pZCkKK3sKKyNpZmRlZiBDT05GSUdfQ0FWSVVNX0dEQgorCXVuc2lnbmVkIGxvbmcgdG1wOworCS8qIFB1bHNlIE1DRDAgc2lnbmFsIG9uIEN0cmwtQyB0byBzdG9wIGFsbCB0aGUgY29yZXMuIEFsc28gc2V0IHRoZSBNQ0QwCisJICAgdG8gYmUgbm90IG1hc2tlZCBieSB0aGlzIGNvcmUgc28gd2Uga25vdyB0aGUgc2lnbmFsIGlzIHJlY2VpdmVkIGJ5CisJICAgc29tZW9uZSAqLworCWFzbSB2b2xhdGlsZSAoImRtZmMwICUwLCAkMjJcbiIKKwkJICAgICAgIm9yaSAgICUwLCAlMCwgMHg5MTAwXG4iICJkbXRjMCAlMCwgJDIyXG4iIDogIj1yIiAodG1wKSk7CisjZW5kaWYKKworCW9jdGVvbl91c2VyX2lvX2luaXQoKTsKKworCS8qIHRvIGdlbmVyYXRlIHRoZSBmaXJzdCBDUFUgdGltZXIgaW50ZXJydXB0ICovCisJd3JpdGVfYzBfY29tcGFyZShyZWFkX2MwX2NvdW50KCkgKyBtaXBzX2hwdF9mcmVxdWVuY3kgLyBIWik7Cit9CisKKy8qKgorICogSG9vayBmb3IgYWZ0ZXIgYWxsIENQVXMgYXJlIG9ubGluZQorICovCitzdGF0aWMgdm9pZCBvY3Rlb25fY3B1c19kb25lKHZvaWQpCit7CisjaWZkZWYgQ09ORklHX0NBVklVTV9HREIKKwl1bnNpZ25lZCBsb25nIHRtcDsKKwkvKiBQdWxzZSBNQ0QwIHNpZ25hbCBvbiBDdHJsLUMgdG8gc3RvcCBhbGwgdGhlIGNvcmVzLiBBbHNvIHNldCB0aGUgTUNEMAorCSAgIHRvIGJlIG5vdCBtYXNrZWQgYnkgdGhpcyBjb3JlIHNvIHdlIGtub3cgdGhlIHNpZ25hbCBpcyByZWNlaXZlZCBieQorCSAgIHNvbWVvbmUgKi8KKwlhc20gdm9sYXRpbGUgKCJkbWZjMCAlMCwgJDIyXG4iCisJCSAgICAgICJvcmkgICAlMCwgJTAsIDB4OTEwMFxuIiAiZG10YzAgJTAsICQyMlxuIiA6ICI9ciIgKHRtcCkpOworI2VuZGlmCit9CisKK3N0cnVjdCBwbGF0X3NtcF9vcHMgb2N0ZW9uX3NtcF9vcHMgPSB7CisJLnNlbmRfaXBpX3NpbmdsZQk9IG9jdGVvbl9zZW5kX2lwaV9zaW5nbGUsCisJLnNlbmRfaXBpX21hc2sJCT0gb2N0ZW9uX3NlbmRfaXBpX21hc2ssCisJLmluaXRfc2Vjb25kYXJ5CQk9IG9jdGVvbl9pbml0X3NlY29uZGFyeSwKKwkuc21wX2ZpbmlzaAkJPSBvY3Rlb25fc21wX2ZpbmlzaCwKKwkuY3B1c19kb25lCQk9IG9jdGVvbl9jcHVzX2RvbmUsCisJLmJvb3Rfc2Vjb25kYXJ5CQk9IG9jdGVvbl9ib290X3NlY29uZGFyeSwKKwkuc21wX3NldHVwCQk9IG9jdGVvbl9zbXBfc2V0dXAsCisJLnByZXBhcmVfY3B1cwkJPSBvY3Rlb25fcHJlcGFyZV9jcHVzLAorfTsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9jb25maWdzL2Nhdml1bS1vY3Rlb25fZGVmY29uZmlnIGIvYXJjaC9taXBzL2NvbmZpZ3MvY2F2aXVtLW9jdGVvbl9kZWZjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2FmYWEyOAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbWlwcy9jb25maWdzL2Nhdml1bS1vY3Rlb25fZGVmY29uZmlnCkBAIC0wLDAgKzEsOTQzIEBACisjCisjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMjgtcmM2CisjIFdlZCBEZWMgIDMgMTE6MDA6NTggMjAwOAorIworQ09ORklHX01JUFM9eQorCisjCisjIE1hY2hpbmUgc2VsZWN0aW9uCisjCisjIENPTkZJR19NQUNIX0FMQ0hFTVkgaXMgbm90IHNldAorIyBDT05GSUdfQkFTTEVSX0VYQ0lURSBpcyBub3Qgc2V0CisjIENPTkZJR19CQ000N1hYIGlzIG5vdCBzZXQKKyMgQ09ORklHX01JUFNfQ09CQUxUIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BQ0hfREVDU1RBVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19NQUNIX0pBWlogaXMgbm90IHNldAorIyBDT05GSUdfTEFTQVQgaXMgbm90IHNldAorIyBDT05GSUdfTEVNT1RFX0ZVTE9ORyBpcyBub3Qgc2V0CisjIENPTkZJR19NSVBTX01BTFRBIGlzIG5vdCBzZXQKKyMgQ09ORklHX01JUFNfU0lNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BQ0hfRU1NQSBpcyBub3Qgc2V0CisjIENPTkZJR19NQUNIX1ZSNDFYWCBpcyBub3Qgc2V0CisjIENPTkZJR19OWFBfU1RCMjIwIGlzIG5vdCBzZXQKKyMgQ09ORklHX05YUF9TVEIyMjUgaXMgbm90IHNldAorIyBDT05GSUdfUE5YODU1MF9KQlMgaXMgbm90IHNldAorIyBDT05GSUdfUE5YODU1MF9TVEI4MTAgaXMgbm90IHNldAorIyBDT05GSUdfUE1DX01TUCBpcyBub3Qgc2V0CisjIENPTkZJR19QTUNfWU9TRU1JVEUgaXMgbm90IHNldAorIyBDT05GSUdfU0dJX0lQMjIgaXMgbm90IHNldAorIyBDT05GSUdfU0dJX0lQMjcgaXMgbm90IHNldAorIyBDT05GSUdfU0dJX0lQMjggaXMgbm90IHNldAorIyBDT05GSUdfU0dJX0lQMzIgaXMgbm90IHNldAorIyBDT05GSUdfU0lCWVRFX0NSSElORSBpcyBub3Qgc2V0CisjIENPTkZJR19TSUJZVEVfQ0FSTUVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NJQllURV9DUkhPTkUgaXMgbm90IHNldAorIyBDT05GSUdfU0lCWVRFX1JIT05FIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NJQllURV9TV0FSTSBpcyBub3Qgc2V0CisjIENPTkZJR19TSUJZVEVfTElUVExFU1VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NJQllURV9TRU5UT1NBIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NJQllURV9CSUdTVVIgaXMgbm90IHNldAorIyBDT05GSUdfU05JX1JNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BQ0hfVFgzOVhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BQ0hfVFg0OVhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX01JS1JPVElLX1JCNTMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dSX1BQTUMgaXMgbm90IHNldAorIyBDT05GSUdfQ0FWSVVNX09DVEVPTl9TSU1VTEFUT1IgaXMgbm90IHNldAorQ09ORklHX0NBVklVTV9PQ1RFT05fUkVGRVJFTkNFX0JPQVJEPXkKK0NPTkZJR19DQVZJVU1fT0NURU9OX1NQRUNJRklDX09QVElPTlM9eQorIyBDT05GSUdfQ0FWSVVNX09DVEVPTl8yTkRfS0VSTkVMIGlzIG5vdCBzZXQKK0NPTkZJR19DQVZJVU1fT0NURU9OX0hXX0ZJWF9VTkFMSUdORUQ9eQorQ09ORklHX0NBVklVTV9PQ1RFT05fQ1ZNU0VHX1NJWkU9MgorQ09ORklHX0NBVklVTV9PQ1RFT05fTE9DS19MMj15CitDT05GSUdfQ0FWSVVNX09DVEVPTl9MT0NLX0wyX1RMQj15CitDT05GSUdfQ0FWSVVNX09DVEVPTl9MT0NLX0wyX0VYQ0VQVElPTj15CitDT05GSUdfQ0FWSVVNX09DVEVPTl9MT0NLX0wyX0xPV19MRVZFTF9JTlRFUlJVUFQ9eQorQ09ORklHX0NBVklVTV9PQ1RFT05fTE9DS19MMl9JTlRFUlJVUFQ9eQorQ09ORklHX0NBVklVTV9PQ1RFT05fTE9DS19MMl9NRU1DUFk9eQorQ09ORklHX0FSQ0hfU1BBUlNFTUVNX0VOQUJMRT15CitDT05GSUdfUldTRU1fR0VORVJJQ19TUElOTE9DSz15CisjIENPTkZJR19BUkNIX0hBU19JTE9HMl9VMzIgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9IQVNfSUxPRzJfVTY0IGlzIG5vdCBzZXQKK0NPTkZJR19BUkNIX1NVUFBPUlRTX09QUk9GSUxFPXkKK0NPTkZJR19HRU5FUklDX0ZJTkRfTkVYVF9CSVQ9eQorQ09ORklHX0dFTkVSSUNfSFdFSUdIVD15CitDT05GSUdfR0VORVJJQ19DQUxJQlJBVEVfREVMQVk9eQorQ09ORklHX0dFTkVSSUNfQ0xPQ0tFVkVOVFM9eQorQ09ORklHX0dFTkVSSUNfVElNRT15CitDT05GSUdfR0VORVJJQ19DTU9TX1VQREFURT15CitDT05GSUdfU0NIRURfTk9fTk9fT01JVF9GUkFNRV9QT0lOVEVSPXkKKyMgQ09ORklHX0dFTkVSSUNfSEFSRElSUVNfTk9fX0RPX0lSUSBpcyBub3Qgc2V0CitDT05GSUdfQ0VWVF9SNEs9eQorQ09ORklHX0NTUkNfUjRLPXkKK0NPTkZJR19ETUFfQ09IRVJFTlQ9eQorIyBDT05GSUdfRUFSTFlfUFJJTlRLIGlzIG5vdCBzZXQKK0NPTkZJR19TWVNfSEFTX0VBUkxZX1BSSU5USz15CisjIENPTkZJR19IT1RQTFVHX0NQVSBpcyBub3Qgc2V0CisjIENPTkZJR19OT19JT1BPUlQgaXMgbm90IHNldAorQ09ORklHX0NQVV9CSUdfRU5ESUFOPXkKKyMgQ09ORklHX0NQVV9MSVRUTEVfRU5ESUFOIGlzIG5vdCBzZXQKK0NPTkZJR19TWVNfU1VQUE9SVFNfQklHX0VORElBTj15CitDT05GSUdfSVJRX0NQVT15CitDT05GSUdfSVJRX0NQVV9PQ1RFT049eQorQ09ORklHX1NXQVBfSU9fU1BBQ0U9eQorQ09ORklHX01JUFNfTDFfQ0FDSEVfU0hJRlQ9NworCisjCisjIENQVSBzZWxlY3Rpb24KKyMKKyMgQ09ORklHX0NQVV9MT09OR1NPTjIgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX01JUFMzMl9SMSBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfTUlQUzMyX1IyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9NSVBTNjRfUjEgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX01JUFM2NF9SMiBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfUjMwMDAgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1RYMzlYWCBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfVlI0MVhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9SNDMwMCBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfUjRYMDAgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1RYNDlYWCBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfUjUwMDAgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1I1NDMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9SNTUwMCBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfUjYwMDAgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX05FVkFEQSBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfUjgwMDAgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1IxMDAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfUk03MDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9STTkwMDAgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NCMSBpcyBub3Qgc2V0CitDT05GSUdfQ1BVX0NBVklVTV9PQ1RFT049eQorQ09ORklHX1dFQUtfT1JERVJJTkc9eQorQ09ORklHX1dFQUtfUkVPUkRFUklOR19CRVlPTkRfTExTQz15CitDT05GSUdfQ1BVX01JUFNSMj15CitDT05GSUdfU1lTX1NVUFBPUlRTXzY0QklUX0tFUk5FTD15CitDT05GSUdfQ1BVX1NVUFBPUlRTXzY0QklUX0tFUk5FTD15CisKKyMKKyMgS2VybmVsIHR5cGUKKyMKKyMgQ09ORklHXzMyQklUIGlzIG5vdCBzZXQKK0NPTkZJR182NEJJVD15CitDT05GSUdfUEFHRV9TSVpFXzRLQj15CisjIENPTkZJR19QQUdFX1NJWkVfOEtCIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBR0VfU0laRV8xNktCIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBR0VfU0laRV82NEtCIGlzIG5vdCBzZXQKK0NPTkZJR19DUFVfSEFTX1BSRUZFVENIPXkKK0NPTkZJR19NSVBTX01UX0RJU0FCTEVEPXkKKyMgQ09ORklHX01JUFNfTVRfU01QIGlzIG5vdCBzZXQKKyMgQ09ORklHX01JUFNfTVRfU01UQyBpcyBub3Qgc2V0CitDT05GSUdfNjRCSVRfUEhZU19BRERSPXkKK0NPTkZJR19DUFVfSEFTX1NZTkM9eQorQ09ORklHX0dFTkVSSUNfSEFSRElSUVM9eQorQ09ORklHX0dFTkVSSUNfSVJRX1BST0JFPXkKK0NPTkZJR19JUlFfUEVSX0NQVT15CitDT05GSUdfQ1BVX1NVUFBPUlRTX0hJR0hNRU09eQorQ09ORklHX1NZU19TVVBQT1JUU19ISUdITUVNPXkKK0NPTkZJR19BUkNIX0ZMQVRNRU1fRU5BQkxFPXkKK0NPTkZJR19BUkNIX1BPUFVMQVRFU19OT0RFX01BUD15CitDT05GSUdfU0VMRUNUX01FTU9SWV9NT0RFTD15CisjIENPTkZJR19GTEFUTUVNX01BTlVBTCBpcyBub3Qgc2V0CisjIENPTkZJR19ESVNDT05USUdNRU1fTUFOVUFMIGlzIG5vdCBzZXQKK0NPTkZJR19TUEFSU0VNRU1fTUFOVUFMPXkKK0NPTkZJR19TUEFSU0VNRU09eQorQ09ORklHX0hBVkVfTUVNT1JZX1BSRVNFTlQ9eQorQ09ORklHX1NQQVJTRU1FTV9TVEFUSUM9eQorQ09ORklHX1BBR0VGTEFHU19FWFRFTkRFRD15CitDT05GSUdfU1BMSVRfUFRMT0NLX0NQVVM9NAorQ09ORklHX1JFU09VUkNFU182NEJJVD15CitDT05GSUdfUEhZU19BRERSX1RfNjRCSVQ9eQorQ09ORklHX1pPTkVfRE1BX0ZMQUc9MAorQ09ORklHX1ZJUlRfVE9fQlVTPXkKK0NPTkZJR19VTkVWSUNUQUJMRV9MUlU9eQorQ09ORklHX1NNUD15CitDT05GSUdfU1lTX1NVUFBPUlRTX1NNUD15CitDT05GSUdfTlJfQ1BVU19ERUZBVUxUXzE2PXkKK0NPTkZJR19OUl9DUFVTPTE2CisjIENPTkZJR19OT19IWiBpcyBub3Qgc2V0CisjIENPTkZJR19ISUdIX1JFU19USU1FUlMgaXMgbm90IHNldAorQ09ORklHX0dFTkVSSUNfQ0xPQ0tFVkVOVFNfQlVJTEQ9eQorIyBDT05GSUdfSFpfNDggaXMgbm90IHNldAorIyBDT05GSUdfSFpfMTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0haXzEyOCBpcyBub3Qgc2V0CitDT05GSUdfSFpfMjUwPXkKKyMgQ09ORklHX0haXzI1NiBpcyBub3Qgc2V0CisjIENPTkZJR19IWl8xMDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0haXzEwMjQgaXMgbm90IHNldAorQ09ORklHX1NZU19TVVBQT1JUU19BUkJJVF9IWj15CitDT05GSUdfSFo9MjUwCisjIENPTkZJR19QUkVFTVBUX05PTkUgaXMgbm90IHNldAorIyBDT05GSUdfUFJFRU1QVF9WT0xVTlRBUlkgaXMgbm90IHNldAorQ09ORklHX1BSRUVNUFQ9eQorIyBDT05GSUdfUFJFRU1QVF9SQ1UgaXMgbm90IHNldAorIyBDT05GSUdfS0VYRUMgaXMgbm90IHNldAorQ09ORklHX1NFQ0NPTVA9eQorQ09ORklHX0xPQ0tERVBfU1VQUE9SVD15CitDT05GSUdfU1RBQ0tUUkFDRV9TVVBQT1JUPXkKK0NPTkZJR19ERUZDT05GSUdfTElTVD0iL2xpYi9tb2R1bGVzLyRVTkFNRV9SRUxFQVNFLy5jb25maWciCisKKyMKKyMgR2VuZXJhbCBzZXR1cAorIworQ09ORklHX0VYUEVSSU1FTlRBTD15CitDT05GSUdfTE9DS19LRVJORUw9eQorQ09ORklHX0lOSVRfRU5WX0FSR19MSU1JVD0zMgorQ09ORklHX0xPQ0FMVkVSU0lPTj0iIgorQ09ORklHX0xPQ0FMVkVSU0lPTl9BVVRPPXkKK0NPTkZJR19TV0FQPXkKK0NPTkZJR19TWVNWSVBDPXkKK0NPTkZJR19TWVNWSVBDX1NZU0NUTD15CitDT05GSUdfUE9TSVhfTVFVRVVFPXkKK0NPTkZJR19CU0RfUFJPQ0VTU19BQ0NUPXkKK0NPTkZJR19CU0RfUFJPQ0VTU19BQ0NUX1YzPXkKKyMgQ09ORklHX1RBU0tTVEFUUyBpcyBub3Qgc2V0CisjIENPTkZJR19BVURJVCBpcyBub3Qgc2V0CitDT05GSUdfSUtDT05GSUc9eQorQ09ORklHX0lLQ09ORklHX1BST0M9eQorQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKKyMgQ09ORklHX0NHUk9VUFMgaXMgbm90IHNldAorQ09ORklHX0dST1VQX1NDSEVEPXkKK0NPTkZJR19GQUlSX0dST1VQX1NDSEVEPXkKKyMgQ09ORklHX1JUX0dST1VQX1NDSEVEIGlzIG5vdCBzZXQKK0NPTkZJR19VU0VSX1NDSEVEPXkKKyMgQ09ORklHX0NHUk9VUF9TQ0hFRCBpcyBub3Qgc2V0CitDT05GSUdfU1lTRlNfREVQUkVDQVRFRD15CitDT05GSUdfU1lTRlNfREVQUkVDQVRFRF9WMj15CitDT05GSUdfUkVMQVk9eQorIyBDT05GSUdfTkFNRVNQQUNFUyBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVl9JTklUUkQ9eQorQ09ORklHX0lOSVRSQU1GU19TT1VSQ0U9IiIKKyMgQ09ORklHX0NDX09QVElNSVpFX0ZPUl9TSVpFIGlzIG5vdCBzZXQKK0NPTkZJR19TWVNDVEw9eQorQ09ORklHX0VNQkVEREVEPXkKK0NPTkZJR19TWVNDVExfU1lTQ0FMTD15CitDT05GSUdfS0FMTFNZTVM9eQorIyBDT05GSUdfS0FMTFNZTVNfQUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tBTExTWU1TX0VYVFJBX1BBU1MgaXMgbm90IHNldAorQ09ORklHX0hPVFBMVUc9eQorQ09ORklHX1BSSU5USz15CitDT05GSUdfQlVHPXkKK0NPTkZJR19FTEZfQ09SRT15CisjIENPTkZJR19QQ1NQS1JfUExBVEZPUk0gaXMgbm90IHNldAorQ09ORklHX0NPTVBBVF9CUks9eQorQ09ORklHX0JBU0VfRlVMTD15CitDT05GSUdfRlVURVg9eQorQ09ORklHX0FOT05fSU5PREVTPXkKK0NPTkZJR19FUE9MTD15CitDT05GSUdfU0lHTkFMRkQ9eQorQ09ORklHX1RJTUVSRkQ9eQorQ09ORklHX0VWRU5URkQ9eQorQ09ORklHX1NITUVNPXkKK0NPTkZJR19BSU89eQorQ09ORklHX1ZNX0VWRU5UX0NPVU5URVJTPXkKK0NPTkZJR19TTEFCPXkKKyMgQ09ORklHX1NMVUIgaXMgbm90IHNldAorIyBDT05GSUdfU0xPQiBpcyBub3Qgc2V0CisjIENPTkZJR19QUk9GSUxJTkcgaXMgbm90IHNldAorIyBDT05GSUdfTUFSS0VSUyBpcyBub3Qgc2V0CitDT05GSUdfSEFWRV9PUFJPRklMRT15CitDT05GSUdfVVNFX0dFTkVSSUNfU01QX0hFTFBFUlM9eQorIyBDT05GSUdfSEFWRV9HRU5FUklDX0RNQV9DT0hFUkVOVCBpcyBub3Qgc2V0CitDT05GSUdfU0xBQklORk89eQorQ09ORklHX1JUX01VVEVYRVM9eQorIyBDT05GSUdfVElOWV9TSE1FTSBpcyBub3Qgc2V0CitDT05GSUdfQkFTRV9TTUFMTD0wCitDT05GSUdfTU9EVUxFUz15CisjIENPTkZJR19NT0RVTEVfRk9SQ0VfTE9BRCBpcyBub3Qgc2V0CitDT05GSUdfTU9EVUxFX1VOTE9BRD15CisjIENPTkZJR19NT0RVTEVfRk9SQ0VfVU5MT0FEIGlzIG5vdCBzZXQKKyMgQ09ORklHX01PRFZFUlNJT05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX01PRFVMRV9TUkNWRVJTSU9OX0FMTCBpcyBub3Qgc2V0CitDT05GSUdfS01PRD15CitDT05GSUdfU1RPUF9NQUNISU5FPXkKK0NPTkZJR19CTE9DSz15CisjIENPTkZJR19CTEtfREVWX0lPX1RSQUNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfQlNHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSU5URUdSSVRZIGlzIG5vdCBzZXQKK0NPTkZJR19CTE9DS19DT01QQVQ9eQorCisjCisjIElPIFNjaGVkdWxlcnMKKyMKK0NPTkZJR19JT1NDSEVEX05PT1A9eQorQ09ORklHX0lPU0NIRURfQVM9eQorQ09ORklHX0lPU0NIRURfREVBRExJTkU9eQorQ09ORklHX0lPU0NIRURfQ0ZRPXkKKyMgQ09ORklHX0RFRkFVTFRfQVMgaXMgbm90IHNldAorIyBDT05GSUdfREVGQVVMVF9ERUFETElORSBpcyBub3Qgc2V0CitDT05GSUdfREVGQVVMVF9DRlE9eQorIyBDT05GSUdfREVGQVVMVF9OT09QIGlzIG5vdCBzZXQKK0NPTkZJR19ERUZBVUxUX0lPU0NIRUQ9ImNmcSIKK0NPTkZJR19DTEFTU0lDX1JDVT15CisjIENPTkZJR19QUk9CRV9JTklUUkRfSEVBREVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZSRUVaRVIgaXMgbm90IHNldAorCisjCisjIEJ1cyBvcHRpb25zIChQQ0ksIFBDTUNJQSwgRUlTQSwgSVNBLCBUQykKKyMKKyMgQ09ORklHX0FSQ0hfU1VQUE9SVFNfTVNJIGlzIG5vdCBzZXQKK0NPTkZJR19NTVU9eQorIyBDT05GSUdfUENDQVJEIGlzIG5vdCBzZXQKKworIworIyBFeGVjdXRhYmxlIGZpbGUgZm9ybWF0cworIworQ09ORklHX0JJTkZNVF9FTEY9eQorIyBDT05GSUdfQ09SRV9EVU1QX0RFRkFVTFRfRUxGX0hFQURFUlMgaXMgbm90IHNldAorIyBDT05GSUdfSEFWRV9BT1VUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JJTkZNVF9NSVNDIGlzIG5vdCBzZXQKK0NPTkZJR19NSVBTMzJfQ09NUEFUPXkKK0NPTkZJR19DT01QQVQ9eQorQ09ORklHX1NZU1ZJUENfQ09NUEFUPXkKK0NPTkZJR19NSVBTMzJfTzMyPXkKK0NPTkZJR19NSVBTMzJfTjMyPXkKK0NPTkZJR19CSU5GTVRfRUxGMzI9eQorCisjCisjIFBvd2VyIG1hbmFnZW1lbnQgb3B0aW9ucworIworIyBDT05GSUdfUE0gaXMgbm90IHNldAorQ09ORklHX05FVD15CisKKyMKKyMgTmV0d29ya2luZyBvcHRpb25zCisjCitDT05GSUdfUEFDS0VUPXkKK0NPTkZJR19QQUNLRVRfTU1BUD15CitDT05GSUdfVU5JWD15CitDT05GSUdfWEZSTT15CisjIENPTkZJR19YRlJNX1VTRVIgaXMgbm90IHNldAorIyBDT05GSUdfWEZSTV9TVUJfUE9MSUNZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1hGUk1fTUlHUkFURSBpcyBub3Qgc2V0CisjIENPTkZJR19YRlJNX1NUQVRJU1RJQ1MgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0tFWSBpcyBub3Qgc2V0CitDT05GSUdfSU5FVD15CitDT05GSUdfSVBfTVVMVElDQVNUPXkKK0NPTkZJR19JUF9BRFZBTkNFRF9ST1VURVI9eQorQ09ORklHX0FTS19JUF9GSUJfSEFTSD15CisjIENPTkZJR19JUF9GSUJfVFJJRSBpcyBub3Qgc2V0CitDT05GSUdfSVBfRklCX0hBU0g9eQorQ09ORklHX0lQX01VTFRJUExFX1RBQkxFUz15CitDT05GSUdfSVBfUk9VVEVfTVVMVElQQVRIPXkKK0NPTkZJR19JUF9ST1VURV9WRVJCT1NFPXkKK0NPTkZJR19JUF9QTlA9eQorQ09ORklHX0lQX1BOUF9ESENQPXkKK0NPTkZJR19JUF9QTlBfQk9PVFA9eQorQ09ORklHX0lQX1BOUF9SQVJQPXkKKyMgQ09ORklHX05FVF9JUElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9JUEdSRSBpcyBub3Qgc2V0CitDT05GSUdfSVBfTVJPVVRFPXkKK0NPTkZJR19JUF9QSU1TTV9WMT15CitDT05GSUdfSVBfUElNU01fVjI9eQorIyBDT05GSUdfQVJQRCBpcyBub3Qgc2V0CitDT05GSUdfU1lOX0NPT0tJRVM9eQorIyBDT05GSUdfSU5FVF9BSCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX0VTUCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX0lQQ09NUCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX1hGUk1fVFVOTkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfVFVOTkVMIGlzIG5vdCBzZXQKK0NPTkZJR19JTkVUX1hGUk1fTU9ERV9UUkFOU1BPUlQ9eQorQ09ORklHX0lORVRfWEZSTV9NT0RFX1RVTk5FTD15CitDT05GSUdfSU5FVF9YRlJNX01PREVfQkVFVD15CisjIENPTkZJR19JTkVUX0xSTyBpcyBub3Qgc2V0CitDT05GSUdfSU5FVF9ESUFHPXkKK0NPTkZJR19JTkVUX1RDUF9ESUFHPXkKKyMgQ09ORklHX1RDUF9DT05HX0FEVkFOQ0VEIGlzIG5vdCBzZXQKK0NPTkZJR19UQ1BfQ09OR19DVUJJQz15CitDT05GSUdfREVGQVVMVF9UQ1BfQ09ORz0iY3ViaWMiCisjIENPTkZJR19UQ1BfTUQ1U0lHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQVjYgaXMgbm90IHNldAorIyBDT05GSUdfTkVUTEFCRUwgaXMgbm90IHNldAorIyBDT05GSUdfTkVUV09SS19TRUNNQVJLIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVEZJTFRFUiBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9EQ0NQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX1NDVFAgaXMgbm90IHNldAorIyBDT05GSUdfVElQQyBpcyBub3Qgc2V0CisjIENPTkZJR19BVE0gaXMgbm90IHNldAorIyBDT05GSUdfQlJJREdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9EU0EgaXMgbm90IHNldAorIyBDT05GSUdfVkxBTl84MDIxUSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUNORVQgaXMgbm90IHNldAorIyBDT05GSUdfTExDMiBpcyBub3Qgc2V0CisjIENPTkZJR19JUFggaXMgbm90IHNldAorIyBDT05GSUdfQVRBTEsgaXMgbm90IHNldAorIyBDT05GSUdfWDI1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0xBUEIgaXMgbm90IHNldAorIyBDT05GSUdfRUNPTkVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dBTl9ST1VURVIgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1NDSEVEIGlzIG5vdCBzZXQKKworIworIyBOZXR3b3JrIHRlc3RpbmcKKyMKKyMgQ09ORklHX05FVF9QS1RHRU4gaXMgbm90IHNldAorIyBDT05GSUdfSEFNUkFESU8gaXMgbm90IHNldAorIyBDT05GSUdfQ0FOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lSREEgaXMgbm90IHNldAorIyBDT05GSUdfQlQgaXMgbm90IHNldAorIyBDT05GSUdfQUZfUlhSUEMgaXMgbm90IHNldAorIyBDT05GSUdfUEhPTkVUIGlzIG5vdCBzZXQKK0NPTkZJR19GSUJfUlVMRVM9eQorIyBDT05GSUdfV0lSRUxFU1MgaXMgbm90IHNldAorIyBDT05GSUdfUkZLSUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF85UCBpcyBub3Qgc2V0CisKKyMKKyMgRGV2aWNlIERyaXZlcnMKKyMKKworIworIyBHZW5lcmljIERyaXZlciBPcHRpb25zCisjCitDT05GSUdfVUVWRU5UX0hFTFBFUl9QQVRIPSIvc2Jpbi9ob3RwbHVnIgorQ09ORklHX1NUQU5EQUxPTkU9eQorQ09ORklHX1BSRVZFTlRfRklSTVdBUkVfQlVJTEQ9eQorIyBDT05GSUdfRldfTE9BREVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0RSSVZFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19ERVZSRVMgaXMgbm90IHNldAorIyBDT05GSUdfU1lTX0hZUEVSVklTT1IgaXMgbm90IHNldAorIyBDT05GSUdfQ09OTkVDVE9SIGlzIG5vdCBzZXQKK0NPTkZJR19NVEQ9eQorIyBDT05GSUdfTVREX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9DT05DQVQgaXMgbm90IHNldAorQ09ORklHX01URF9QQVJUSVRJT05TPXkKKyMgQ09ORklHX01URF9SRURCT09UX1BBUlRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9DTURMSU5FX1BBUlRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9BUjdfUEFSVFMgaXMgbm90IHNldAorCisjCisjIFVzZXIgTW9kdWxlcyBBbmQgVHJhbnNsYXRpb24gTGF5ZXJzCisjCitDT05GSUdfTVREX0NIQVI9eQorQ09ORklHX01URF9CTEtERVZTPXkKK0NPTkZJR19NVERfQkxPQ0s9eQorIyBDT05GSUdfRlRMIGlzIG5vdCBzZXQKKyMgQ09ORklHX05GVEwgaXMgbm90IHNldAorIyBDT05GSUdfSU5GVEwgaXMgbm90IHNldAorIyBDT05GSUdfUkZEX0ZUTCBpcyBub3Qgc2V0CisjIENPTkZJR19TU0ZEQyBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfT09QUyBpcyBub3Qgc2V0CisKKyMKKyMgUkFNL1JPTS9GbGFzaCBjaGlwIGRyaXZlcnMKKyMKK0NPTkZJR19NVERfQ0ZJPXkKKyMgQ09ORklHX01URF9KRURFQ1BST0JFIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfR0VOX1BST0JFPXkKKyMgQ09ORklHX01URF9DRklfQURWX09QVElPTlMgaXMgbm90IHNldAorQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8xPXkKK0NPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMj15CitDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzQ9eQorIyBDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzggaXMgbm90IHNldAorIyBDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzE2IGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8zMiBpcyBub3Qgc2V0CitDT05GSUdfTVREX0NGSV9JMT15CitDT05GSUdfTVREX0NGSV9JMj15CisjIENPTkZJR19NVERfQ0ZJX0k0IGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9DRklfSTggaXMgbm90IHNldAorIyBDT05GSUdfTVREX0NGSV9JTlRFTEVYVCBpcyBub3Qgc2V0CitDT05GSUdfTVREX0NGSV9BTURTVEQ9eQorIyBDT05GSUdfTVREX0NGSV9TVEFBIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfQ0ZJX1VUSUw9eQorIyBDT05GSUdfTVREX1JBTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfUk9NIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9BQlNFTlQgaXMgbm90IHNldAorCisjCisjIE1hcHBpbmcgZHJpdmVycyBmb3IgY2hpcCBhY2Nlc3MKKyMKKyMgQ09ORklHX01URF9DT01QTEVYX01BUFBJTkdTIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfUEhZU01BUD15CitDT05GSUdfTVREX1BIWVNNQVBfU1RBUlQ9MHg4MDAwMDAwCitDT05GSUdfTVREX1BIWVNNQVBfTEVOPTB4MAorQ09ORklHX01URF9QSFlTTUFQX0JBTktXSURUSD0yCisjIENPTkZJR19NVERfUExBVFJBTSBpcyBub3Qgc2V0CisKKyMKKyMgU2VsZi1jb250YWluZWQgTVREIGRldmljZSBkcml2ZXJzCisjCisjIENPTkZJR19NVERfU0xSQU0gaXMgbm90IHNldAorIyBDT05GSUdfTVREX1BIUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9NVERSQU0gaXMgbm90IHNldAorIyBDT05GSUdfTVREX0JMT0NLMk1URCBpcyBub3Qgc2V0CisKKyMKKyMgRGlzay1Pbi1DaGlwIERldmljZSBEcml2ZXJzCisjCisjIENPTkZJR19NVERfRE9DMjAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfRE9DMjAwMSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfRE9DMjAwMVBMVVMgaXMgbm90IHNldAorIyBDT05GSUdfTVREX05BTkQgaXMgbm90IHNldAorIyBDT05GSUdfTVREX09ORU5BTkQgaXMgbm90IHNldAorCisjCisjIFVCSSAtIFVuc29ydGVkIGJsb2NrIGltYWdlcworIworIyBDT05GSUdfTVREX1VCSSBpcyBub3Qgc2V0CisjIENPTkZJR19QQVJQT1JUIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWPXkKKyMgQ09ORklHX0JMS19ERVZfQ09XX0NPTU1PTiBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVl9MT09QPXkKKyMgQ09ORklHX0JMS19ERVZfQ1JZUFRPTE9PUCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX05CRCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1JBTSBpcyBub3Qgc2V0CisjIENPTkZJR19DRFJPTV9QS1RDRFZEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUQV9PVkVSX0VUSCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0hEIGlzIG5vdCBzZXQKKyMgQ09ORklHX01JU0NfREVWSUNFUyBpcyBub3Qgc2V0CitDT05GSUdfSEFWRV9JREU9eQorIyBDT05GSUdfSURFIGlzIG5vdCBzZXQKKworIworIyBTQ1NJIGRldmljZSBzdXBwb3J0CisjCisjIENPTkZJR19SQUlEX0FUVFJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0kgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9ETUEgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9ORVRMSU5LIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUQSBpcyBub3Qgc2V0CisjIENPTkZJR19NRCBpcyBub3Qgc2V0CitDT05GSUdfTkVUREVWSUNFUz15CisjIENPTkZJR19EVU1NWSBpcyBub3Qgc2V0CisjIENPTkZJR19CT05ESU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BQ1ZMQU4gaXMgbm90IHNldAorIyBDT05GSUdfRVFVQUxJWkVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RVTiBpcyBub3Qgc2V0CisjIENPTkZJR19WRVRIIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BIWUxJQiBpcyBub3Qgc2V0CitDT05GSUdfTkVUX0VUSEVSTkVUPXkKK0NPTkZJR19NSUk9eQorIyBDT05GSUdfQVg4ODc5NiBpcyBub3Qgc2V0CisjIENPTkZJR19TTUM5MVggaXMgbm90IHNldAorIyBDT05GSUdfRE05MDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lCTV9ORVdfRU1BQ19aTUlJIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lCTV9ORVdfRU1BQ19SR01JSSBpcyBub3Qgc2V0CisjIENPTkZJR19JQk1fTkVXX0VNQUNfVEFIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lCTV9ORVdfRU1BQ19FTUFDNCBpcyBub3Qgc2V0CisjIENPTkZJR19JQk1fTkVXX0VNQUNfTk9fRkxPV19DVFJMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lCTV9ORVdfRU1BQ19NQUxfQ0xSX0lDSU5UU1RBVCBpcyBub3Qgc2V0CisjIENPTkZJR19JQk1fTkVXX0VNQUNfTUFMX0NPTU1PTl9FUlIgaXMgbm90IHNldAorIyBDT05GSUdfQjQ0IGlzIG5vdCBzZXQKK0NPTkZJR19ORVRERVZfMTAwMD15CisjIENPTkZJR19ORVRERVZfMTAwMDAgaXMgbm90IHNldAorCisjCisjIFdpcmVsZXNzIExBTgorIworIyBDT05GSUdfV0xBTl9QUkU4MDIxMSBpcyBub3Qgc2V0CisjIENPTkZJR19XTEFOXzgwMjExIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lXTFdJRklfTEVEUyBpcyBub3Qgc2V0CisjIENPTkZJR19XQU4gaXMgbm90IHNldAorIyBDT05GSUdfUFBQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NMSVAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUQ09OU09MRSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRQT0xMIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIgaXMgbm90IHNldAorIyBDT05GSUdfSVNETiBpcyBub3Qgc2V0CisjIENPTkZJR19QSE9ORSBpcyBub3Qgc2V0CisKKyMKKyMgSW5wdXQgZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX0lOUFVUIGlzIG5vdCBzZXQKKworIworIyBIYXJkd2FyZSBJL08gcG9ydHMKKyMKKyMgQ09ORklHX1NFUklPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dBTUVQT1JUIGlzIG5vdCBzZXQKKworIworIyBDaGFyYWN0ZXIgZGV2aWNlcworIworIyBDT05GSUdfVlQgaXMgbm90IHNldAorQ09ORklHX0RFVktNRU09eQorIyBDT05GSUdfU0VSSUFMX05PTlNUQU5EQVJEIGlzIG5vdCBzZXQKKworIworIyBTZXJpYWwgZHJpdmVycworIworQ09ORklHX1NFUklBTF84MjUwPXkKK0NPTkZJR19TRVJJQUxfODI1MF9DT05TT0xFPXkKK0NPTkZJR19TRVJJQUxfODI1MF9OUl9VQVJUUz0yCitDT05GSUdfU0VSSUFMXzgyNTBfUlVOVElNRV9VQVJUUz0yCisjIENPTkZJR19TRVJJQUxfODI1MF9FWFRFTkRFRCBpcyBub3Qgc2V0CisKKyMKKyMgTm9uLTgyNTAgc2VyaWFsIHBvcnQgc3VwcG9ydAorIworQ09ORklHX1NFUklBTF9DT1JFPXkKK0NPTkZJR19TRVJJQUxfQ09SRV9DT05TT0xFPXkKK0NPTkZJR19VTklYOThfUFRZUz15CitDT05GSUdfTEVHQUNZX1BUWVM9eQorQ09ORklHX0xFR0FDWV9QVFlfQ09VTlQ9MjU2CisjIENPTkZJR19JUE1JX0hBTkRMRVIgaXMgbm90IHNldAorIyBDT05GSUdfSFdfUkFORE9NIGlzIG5vdCBzZXQKKyMgQ09ORklHX1IzOTY0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JBV19EUklWRVIgaXMgbm90IHNldAorIyBDT05GSUdfVENHX1RQTSBpcyBub3Qgc2V0CisjIENPTkZJR19JMkMgaXMgbm90IHNldAorIyBDT05GSUdfU1BJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1cxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BPV0VSX1NVUFBMWSBpcyBub3Qgc2V0CisjIENPTkZJR19IV01PTiBpcyBub3Qgc2V0CisjIENPTkZJR19USEVSTUFMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RIRVJNQUxfSFdNT04gaXMgbm90IHNldAorQ09ORklHX1dBVENIRE9HPXkKKyMgQ09ORklHX1dBVENIRE9HX05PV0FZT1VUIGlzIG5vdCBzZXQKKworIworIyBXYXRjaGRvZyBEZXZpY2UgRHJpdmVycworIworIyBDT05GSUdfU09GVF9XQVRDSERPRyBpcyBub3Qgc2V0CitDT05GSUdfU1NCX1BPU1NJQkxFPXkKKworIworIyBTb25pY3MgU2lsaWNvbiBCYWNrcGxhbmUKKyMKKyMgQ09ORklHX1NTQiBpcyBub3Qgc2V0CisKKyMKKyMgTXVsdGlmdW5jdGlvbiBkZXZpY2UgZHJpdmVycworIworIyBDT05GSUdfTUZEX0NPUkUgaXMgbm90IHNldAorIyBDT05GSUdfTUZEX1NNNTAxIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hUQ19QQVNJQzMgaXMgbm90IHNldAorIyBDT05GSUdfTUZEX1RNSU8gaXMgbm90IHNldAorIyBDT05GSUdfUkVHVUxBVE9SIGlzIG5vdCBzZXQKKworIworIyBNdWx0aW1lZGlhIGRldmljZXMKKyMKKworIworIyBNdWx0aW1lZGlhIGNvcmUgc3VwcG9ydAorIworIyBDT05GSUdfVklERU9fREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RWQl9DT1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZJREVPX01FRElBIGlzIG5vdCBzZXQKKworIworIyBNdWx0aW1lZGlhIGRyaXZlcnMKKyMKKyMgQ09ORklHX0RBQiBpcyBub3Qgc2V0CisKKyMKKyMgR3JhcGhpY3Mgc3VwcG9ydAorIworIyBDT05GSUdfVkdBU1RBVEUgaXMgbm90IHNldAorIyBDT05GSUdfVklERU9fT1VUUFVUX0NPTlRST0wgaXMgbm90IHNldAorIyBDT05GSUdfRkIgaXMgbm90IHNldAorIyBDT05GSUdfQkFDS0xJR0hUX0xDRF9TVVBQT1JUIGlzIG5vdCBzZXQKKworIworIyBEaXNwbGF5IGRldmljZSBzdXBwb3J0CisjCisjIENPTkZJR19ESVNQTEFZX1NVUFBPUlQgaXMgbm90IHNldAorIyBDT05GSUdfU09VTkQgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NVUFBPUlQgaXMgbm90IHNldAorIyBDT05GSUdfTU1DIGlzIG5vdCBzZXQKKyMgQ09ORklHX01FTVNUSUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FV19MRURTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FDQ0VTU0lCSUxJVFkgaXMgbm90IHNldAorQ09ORklHX1JUQ19MSUI9eQorIyBDT05GSUdfUlRDX0NMQVNTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RNQURFVklDRVMgaXMgbm90IHNldAorIyBDT05GSUdfVUlPIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NUQUdJTkcgaXMgbm90IHNldAorQ09ORklHX1NUQUdJTkdfRVhDTFVERV9CVUlMRD15CisKKyMKKyMgRmlsZSBzeXN0ZW1zCisjCisjIENPTkZJR19FWFQyX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYVDNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRVhUNF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19SRUlTRVJGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19KRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRlNfUE9TSVhfQUNMIGlzIG5vdCBzZXQKK0NPTkZJR19GSUxFX0xPQ0tJTkc9eQorIyBDT05GSUdfWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dGUzJfRlMgaXMgbm90IHNldAorIyBDT05GSUdfT0NGUzJfRlMgaXMgbm90IHNldAorQ09ORklHX0ROT1RJRlk9eQorQ09ORklHX0lOT1RJRlk9eQorQ09ORklHX0lOT1RJRllfVVNFUj15CisjIENPTkZJR19RVU9UQSBpcyBub3Qgc2V0CisjIENPTkZJR19BVVRPRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQVVUT0ZTNF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19GVVNFX0ZTIGlzIG5vdCBzZXQKKworIworIyBDRC1ST00vRFZEIEZpbGVzeXN0ZW1zCisjCisjIENPTkZJR19JU085NjYwX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VERl9GUyBpcyBub3Qgc2V0CisKKyMKKyMgRE9TL0ZBVC9OVCBGaWxlc3lzdGVtcworIworIyBDT05GSUdfTVNET1NfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVkZBVF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19OVEZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBQc2V1ZG8gZmlsZXN5c3RlbXMKKyMKK0NPTkZJR19QUk9DX0ZTPXkKK0NPTkZJR19QUk9DX0tDT1JFPXkKK0NPTkZJR19QUk9DX1NZU0NUTD15CitDT05GSUdfUFJPQ19QQUdFX01PTklUT1I9eQorQ09ORklHX1NZU0ZTPXkKK0NPTkZJR19UTVBGUz15CisjIENPTkZJR19UTVBGU19QT1NJWF9BQ0wgaXMgbm90IHNldAorIyBDT05GSUdfSFVHRVRMQl9QQUdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NPTkZJR0ZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBNaXNjZWxsYW5lb3VzIGZpbGVzeXN0ZW1zCisjCisjIENPTkZJR19BREZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FGRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hGU1BMVVNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQkVGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19CRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGRlMyX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQU1GUyBpcyBub3Qgc2V0CisjIENPTkZJR19WWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01JTklYX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX09NRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSFBGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19RTlg0RlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUk9NRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfU1lTVl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19VRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTkVUV09SS19GSUxFU1lTVEVNUyBpcyBub3Qgc2V0CisKKyMKKyMgUGFydGl0aW9uIFR5cGVzCisjCisjIENPTkZJR19QQVJUSVRJT05fQURWQU5DRUQgaXMgbm90IHNldAorQ09ORklHX01TRE9TX1BBUlRJVElPTj15CitDT05GSUdfTkxTPXkKK0NPTkZJR19OTFNfREVGQVVMVD0iaXNvODg1OS0xIgorQ09ORklHX05MU19DT0RFUEFHRV80Mzc9eQorIyBDT05GSUdfTkxTX0NPREVQQUdFXzczNyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfNzc1IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NTAgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg1MiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODU1IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NTcgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODYxIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjIgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODY0IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjUgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2NiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODY5IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV85MzYgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzk1MCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfOTMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV85NDkgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg3NCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV84IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV8xMjUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV8xMjUxIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19BU0NJSSBpcyBub3Qgc2V0CitDT05GSUdfTkxTX0lTTzg4NTlfMT15CisjIENPTkZJR19OTFNfSVNPODg1OV8yIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzMgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfNCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV81IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzYgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfNyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV85IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzEzIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzE0IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzE1IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19LT0k4X1IgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0tPSThfVSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfVVRGOCBpcyBub3Qgc2V0CisjIENPTkZJR19ETE0gaXMgbm90IHNldAorCisjCisjIEtlcm5lbCBoYWNraW5nCisjCitDT05GSUdfVFJBQ0VfSVJRRkxBR1NfU1VQUE9SVD15CisjIENPTkZJR19QUklOVEtfVElNRSBpcyBub3Qgc2V0CitDT05GSUdfRU5BQkxFX1dBUk5fREVQUkVDQVRFRD15CitDT05GSUdfRU5BQkxFX01VU1RfQ0hFQ0s9eQorQ09ORklHX0ZSQU1FX1dBUk49MjA0OAorQ09ORklHX01BR0lDX1NZU1JRPXkKKyMgQ09ORklHX1VOVVNFRF9TWU1CT0xTIGlzIG5vdCBzZXQKK0NPTkZJR19ERUJVR19GUz15CisjIENPTkZJR19IRUFERVJTX0NIRUNLIGlzIG5vdCBzZXQKK0NPTkZJR19ERUJVR19LRVJORUw9eQorIyBDT05GSUdfREVCVUdfU0hJUlEgaXMgbm90IHNldAorQ09ORklHX0RFVEVDVF9TT0ZUTE9DS1VQPXkKKyMgQ09ORklHX0JPT1RQQVJBTV9TT0ZUTE9DS1VQX1BBTklDIGlzIG5vdCBzZXQKK0NPTkZJR19CT09UUEFSQU1fU09GVExPQ0tVUF9QQU5JQ19WQUxVRT0wCitDT05GSUdfU0NIRURfREVCVUc9eQorIyBDT05GSUdfU0NIRURTVEFUUyBpcyBub3Qgc2V0CisjIENPTkZJR19USU1FUl9TVEFUUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19PQkpFQ1RTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NMQUIgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX1BSRUVNUFQ9eQorIyBDT05GSUdfREVCVUdfUlRfTVVURVhFUyBpcyBub3Qgc2V0CisjIENPTkZJR19SVF9NVVRFWF9URVNURVIgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX1NQSU5MT0NLPXkKKyMgQ09ORklHX0RFQlVHX01VVEVYRVMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfTE9DS19BTExPQyBpcyBub3Qgc2V0CisjIENPTkZJR19QUk9WRV9MT0NLSU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xPQ0tfU1RBVCBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfU1BJTkxPQ0tfU0xFRVA9eQorIyBDT05GSUdfREVCVUdfTE9DS0lOR19BUElfU0VMRlRFU1RTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0tPQkpFQ1QgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX0lORk89eQorIyBDT05GSUdfREVCVUdfVk0gaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfV1JJVEVDT1VOVCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19NRU1PUllfSU5JVCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19MSVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JPT1RfUFJJTlRLX0RFTEFZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JDVV9UT1JUVVJFX1RFU1QgaXMgbm90IHNldAorIyBDT05GSUdfUkNVX0NQVV9TVEFMTF9ERVRFQ1RPUiBpcyBub3Qgc2V0CisjIENPTkZJR19CQUNLVFJBQ0VfU0VMRl9URVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0JMT0NLX0VYVF9ERVZUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZBVUxUX0lOSkVDVElPTiBpcyBub3Qgc2V0CitDT05GSUdfU1lTQ1RMX1NZU0NBTExfQ0hFQ0s9eQorCisjCisjIFRyYWNlcnMKKyMKKyMgQ09ORklHX0lSUVNPRkZfVFJBQ0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BSRUVNUFRfVFJBQ0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDSEVEX1RSQUNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19DT05URVhUX1NXSVRDSF9UUkFDRVIgaXMgbm90IHNldAorIyBDT05GSUdfQk9PVF9UUkFDRVIgaXMgbm90IHNldAorIyBDT05GSUdfRFlOQU1JQ19QUklOVEtfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfU0FNUExFUyBpcyBub3Qgc2V0CitDT05GSUdfSEFWRV9BUkNIX0tHREI9eQorIyBDT05GSUdfS0dEQiBpcyBub3Qgc2V0CitDT05GSUdfQ01ETElORT0iIgorIyBDT05GSUdfREVCVUdfU1RBQ0tfVVNBR0UgaXMgbm90IHNldAorIyBDT05GSUdfUlVOVElNRV9ERUJVRyBpcyBub3Qgc2V0CisKKyMKKyMgU2VjdXJpdHkgb3B0aW9ucworIworIyBDT05GSUdfS0VZUyBpcyBub3Qgc2V0CitDT05GSUdfU0VDVVJJVFk9eQorIyBDT05GSUdfU0VDVVJJVFlGUyBpcyBub3Qgc2V0CitDT05GSUdfU0VDVVJJVFlfTkVUV09SSz15CisjIENPTkZJR19TRUNVUklUWV9ORVRXT1JLX1hGUk0gaXMgbm90IHNldAorIyBDT05GSUdfU0VDVVJJVFlfRklMRV9DQVBBQklMSVRJRVMgaXMgbm90IHNldAorQ09ORklHX1NFQ1VSSVRZX0RFRkFVTFRfTU1BUF9NSU5fQUREUj0wCitDT05GSUdfQ1JZUFRPPXkKKworIworIyBDcnlwdG8gY29yZSBvciBoZWxwZXIKKyMKKyMgQ09ORklHX0NSWVBUT19GSVBTIGlzIG5vdCBzZXQKK0NPTkZJR19DUllQVE9fQUxHQVBJPXkKK0NPTkZJR19DUllQVE9fQUVBRD15CitDT05GSUdfQ1JZUFRPX0JMS0NJUEhFUj15CitDT05GSUdfQ1JZUFRPX0hBU0g9eQorQ09ORklHX0NSWVBUT19STkc9eQorQ09ORklHX0NSWVBUT19NQU5BR0VSPXkKKyMgQ09ORklHX0NSWVBUT19HRjEyOE1VTCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fTlVMTCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQ1JZUFREIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19BVVRIRU5DIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19URVNUIGlzIG5vdCBzZXQKKworIworIyBBdXRoZW50aWNhdGVkIEVuY3J5cHRpb24gd2l0aCBBc3NvY2lhdGVkIERhdGEKKyMKKyMgQ09ORklHX0NSWVBUT19DQ00gaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0dDTSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0VRSVYgaXMgbm90IHNldAorCisjCisjIEJsb2NrIG1vZGVzCisjCitDT05GSUdfQ1JZUFRPX0NCQz15CisjIENPTkZJR19DUllQVE9fQ1RSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19DVFMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0VDQiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fTFJXIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19QQ0JDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19YVFMgaXMgbm90IHNldAorCisjCisjIEhhc2ggbW9kZXMKKyMKK0NPTkZJR19DUllQVE9fSE1BQz15CisjIENPTkZJR19DUllQVE9fWENCQyBpcyBub3Qgc2V0CisKKyMKKyMgRGlnZXN0CisjCisjIENPTkZJR19DUllQVE9fQ1JDMzJDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19NRDQgaXMgbm90IHNldAorQ09ORklHX0NSWVBUT19NRDU9eQorIyBDT05GSUdfQ1JZUFRPX01JQ0hBRUxfTUlDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19STUQxMjggaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1JNRDE2MCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fUk1EMjU2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19STUQzMjAgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1NIQTEgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1NIQTI1NiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0hBNTEyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19UR1IxOTIgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1dQNTEyIGlzIG5vdCBzZXQKKworIworIyBDaXBoZXJzCisjCisjIENPTkZJR19DUllQVE9fQUVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19BTlVCSVMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0FSQzQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0JMT1dGSVNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19DQU1FTExJQSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQ0FTVDUgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0NBU1Q2IGlzIG5vdCBzZXQKK0NPTkZJR19DUllQVE9fREVTPXkKKyMgQ09ORklHX0NSWVBUT19GQ1JZUFQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0tIQVpBRCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0FMU0EyMCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0VFRCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0VSUEVOVCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fVEVBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19UV09GSVNIIGlzIG5vdCBzZXQKKworIworIyBDb21wcmVzc2lvbgorIworIyBDT05GSUdfQ1JZUFRPX0RFRkxBVEUgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0xaTyBpcyBub3Qgc2V0CisKKyMKKyMgUmFuZG9tIE51bWJlciBHZW5lcmF0aW9uCisjCisjIENPTkZJR19DUllQVE9fQU5TSV9DUFJORyBpcyBub3Qgc2V0CitDT05GSUdfQ1JZUFRPX0hXPXkKKworIworIyBMaWJyYXJ5IHJvdXRpbmVzCisjCitDT05GSUdfQklUUkVWRVJTRT15CisjIENPTkZJR19DUkNfQ0NJVFQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JDMTYgaXMgbm90IHNldAorIyBDT05GSUdfQ1JDX1QxMERJRiBpcyBub3Qgc2V0CisjIENPTkZJR19DUkNfSVRVX1QgaXMgbm90IHNldAorQ09ORklHX0NSQzMyPXkKKyMgQ09ORklHX0NSQzcgaXMgbm90IHNldAorIyBDT05GSUdfTElCQ1JDMzJDIGlzIG5vdCBzZXQKK0NPTkZJR19QTElTVD15CitDT05GSUdfSEFTX0lPTUVNPXkKK0NPTkZJR19IQVNfSU9QT1JUPXkKK0NPTkZJR19IQVNfRE1BPXkKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9LYnVpbGQgYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vS2J1aWxkCmluZGV4IDAyMzg2NmMuLjc4OTdmMDUgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9LYnVpbGQKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL0tidWlsZApAQCAtMSw0ICsxLDMgQEAKIGluY2x1ZGUgaW5jbHVkZS9hc20tZ2VuZXJpYy9LYnVpbGQuYXNtCiAKIGhlYWRlci15ICs9IGNhY2hlY3RsLmggc2dpZGVmcy5oIHN5c21pcHMuaAotaGVhZGVyLXkgKz0gc3dhYi5oCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vYnl0ZW9yZGVyLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vYnl0ZW9yZGVyLmgKaW5kZXggNjA3YjcxOC4uOTU3OTA1MSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2J5dGVvcmRlci5oCisrKyBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9ieXRlb3JkZXIuaApAQCAtOCw4ICs4LDYgQEAKICNpZm5kZWYgX0FTTV9CWVRFT1JERVJfSAogI2RlZmluZSBfQVNNX0JZVEVPUkRFUl9ICiAKLSNpbmNsdWRlIDxhc20vc3dhYi5oPgotCiAjaWYgZGVmaW5lZChfX01JUFNFQl9fKQogI2luY2x1ZGUgPGxpbnV4L2J5dGVvcmRlci9iaWdfZW5kaWFuLmg+CiAjZWxpZiBkZWZpbmVkKF9fTUlQU0VMX18pCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vY3B1LWZlYXR1cmVzLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vY3B1LWZlYXR1cmVzLmgKaW5kZXggMTJkMTJkZi4uYTBkMTRmOCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2NwdS1mZWF0dXJlcy5oCisrKyBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9jcHUtZmVhdHVyZXMuaApAQCAtMzgsNiArMzgsOSBAQAogI2lmbmRlZiBjcHVfaGFzX3R4MzlfY2FjaGUKICNkZWZpbmUgY3B1X2hhc190eDM5X2NhY2hlCShjcHVfZGF0YVswXS5vcHRpb25zICYgTUlQU19DUFVfVFgzOV9DQUNIRSkKICNlbmRpZgorI2lmbmRlZiBjcHVfaGFzX29jdGVvbl9jYWNoZQorI2RlZmluZSBjcHVfaGFzX29jdGVvbl9jYWNoZQkwCisjZW5kaWYKICNpZm5kZWYgY3B1X2hhc19mcHUKICNkZWZpbmUgY3B1X2hhc19mcHUJCShjdXJyZW50X2NwdV9kYXRhLm9wdGlvbnMgJiBNSVBTX0NQVV9GUFUpCiAjZGVmaW5lIHJhd19jcHVfaGFzX2ZwdQkJKHJhd19jdXJyZW50X2NwdV9kYXRhLm9wdGlvbnMgJiBNSVBTX0NQVV9GUFUpCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vY3B1LmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vY3B1LmgKaW5kZXggMjI5YTc4Ni4uYzAxODcyNyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2NwdS5oCisrKyBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9jcHUuaApAQCAtMzMsNiArMzMsNyBAQAogI2RlZmluZSBQUklEX0NPTVBfVE9TSElCQQkweDA3MDAwMAogI2RlZmluZSBQUklEX0NPTVBfTFNJCQkweDA4MDAwMAogI2RlZmluZSBQUklEX0NPTVBfTEVYUkEJCTB4MGIwMDAwCisjZGVmaW5lIFBSSURfQ09NUF9DQVZJVU0JMHgwZDAwMDAKIAogCiAvKgpAQCAtMTE0LDYgKzExNSwxOCBAQAogI2RlZmluZSBQUklEX0lNUF9CQ00zMzAyCTB4OTAwMAogCiAvKgorICogVGhlc2UgYXJlIHRoZSBQUklEJ3MgZm9yIHdoZW4gMjM6MTYgPT0gUFJJRF9DT01QX0NBVklVTQorICovCisKKyNkZWZpbmUgUFJJRF9JTVBfQ0FWSVVNX0NOMzhYWCAweDAwMDAKKyNkZWZpbmUgUFJJRF9JTVBfQ0FWSVVNX0NOMzFYWCAweDAxMDAKKyNkZWZpbmUgUFJJRF9JTVBfQ0FWSVVNX0NOMzBYWCAweDAyMDAKKyNkZWZpbmUgUFJJRF9JTVBfQ0FWSVVNX0NONThYWCAweDAzMDAKKyNkZWZpbmUgUFJJRF9JTVBfQ0FWSVVNX0NONTZYWCAweDA0MDAKKyNkZWZpbmUgUFJJRF9JTVBfQ0FWSVVNX0NONTBYWCAweDA2MDAKKyNkZWZpbmUgUFJJRF9JTVBfQ0FWSVVNX0NONTJYWCAweDA3MDAKKworLyoKICAqIERlZmluaXRpb25zIGZvciA3OjAgb24gbGVnYWN5IHByb2Nlc3NvcnMKICAqLwogCkBAIC0yMDMsNiArMjE2LDcgQEAKIAkgKiBNSVBTNjQgY2xhc3MgcHJvY2Vzc29ycwogCSAqLwogCUNQVV81S0MsIENQVV8yMEtDLCBDUFVfMjVLRiwgQ1BVX1NCMSwgQ1BVX1NCMUEsIENQVV9MT09OR1NPTjIsCisJQ1BVX0NBVklVTV9PQ1RFT04sCiAKIAlDUFVfTEFTVAogfTsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9oYXphcmRzLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vaGF6YXJkcy5oCmluZGV4IDJkZTYzOGYuLjQzYmFlZDEgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9oYXphcmRzLmgKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2hhemFyZHMuaApAQCAtNDIsNyArNDIsNyBAQAogLyoKICAqIFRMQiBoYXphcmRzCiAgKi8KLSNpZiBkZWZpbmVkKENPTkZJR19DUFVfTUlQU1IyKQorI2lmIGRlZmluZWQoQ09ORklHX0NQVV9NSVBTUjIpICYmICFkZWZpbmVkKENPTkZJR19DUFVfQ0FWSVVNX09DVEVPTikKIAogLyoKICAqIE1JUFNSMiBkZWZpbmVzIGVoYiBmb3IgaGF6YXJkIGF2b2lkYW5jZQpAQCAtMTM4LDcgKzEzOCw3IEBACiAJCV9faW5zdHJ1Y3Rpb25faGF6YXJkKCk7CQkJCQlcCiB9IHdoaWxlICgwKQogCi0jZWxpZiBkZWZpbmVkKENPTkZJR19DUFVfUjEwMDAwKQorI2VsaWYgZGVmaW5lZChDT05GSUdfQ1BVX1IxMDAwMCkgfHwgZGVmaW5lZChDT05GSUdfQ1BVX0NBVklVTV9PQ1RFT04pCiAKIC8qCiAgKiBSMTAwMDAgcm9ja3MgLSBhbGwgaGF6YXJkcyBoYW5kbGVkIGluIGhhcmR3YXJlLCBzbyB0aGlzIGJlY29tZXMgYSBub2JyYWluZXIuCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vaW8uaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9pby5oCmluZGV4IDUwMWE0MGIuLjQzNjg3OGUgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9pby5oCisrKyBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9pby5oCkBAIC0yOTUsNiArMjk1LDEyIEBACiAjdW5kZWYgX19JU19LU0VHMQogfQogCisjaWZkZWYgQ09ORklHX0NQVV9DQVZJVU1fT0NURU9OCisjZGVmaW5lIHdhcl9vY3Rlb25faW9fcmVvcmRlcl93bWIoKSAgCQl3bWIoKQorI2Vsc2UKKyNkZWZpbmUgd2FyX29jdGVvbl9pb19yZW9yZGVyX3dtYigpCQlkbyB7IH0gd2hpbGUgKDApCisjZW5kaWYKKwogI2RlZmluZSBfX0JVSUxEX01FTU9SWV9TSU5HTEUocGZ4LCBid2xxLCB0eXBlLCBpcnEpCQkJXAogCQkJCQkJCQkJXAogc3RhdGljIGlubGluZSB2b2lkIHBmeCMjd3JpdGUjI2J3bHEodHlwZSB2YWwsCQkJCVwKQEAgLTMwMyw2ICszMDksOCBAQAogCXZvbGF0aWxlIHR5cGUgKl9fbWVtOwkJCQkJCVwKIAl0eXBlIF9fdmFsOwkJCQkJCQlcCiAJCQkJCQkJCQlcCisJd2FyX29jdGVvbl9pb19yZW9yZGVyX3dtYigpOwkJCQkJXAorCQkJCQkJCQkJXAogCV9fbWVtID0gKHZvaWQgKilfX3N3aXp6bGVfYWRkcl8jI2J3bHEoKHVuc2lnbmVkIGxvbmcpKG1lbSkpOwlcCiAJCQkJCQkJCQlcCiAJX192YWwgPSBwZngjI2lvc3dhYiMjYndscShfX21lbSwgdmFsKTsJCQkJXApAQCAtMzcwLDYgKzM3OCw4IEBACiAJdm9sYXRpbGUgdHlwZSAqX19hZGRyOwkJCQkJCVwKIAl0eXBlIF9fdmFsOwkJCQkJCQlcCiAJCQkJCQkJCQlcCisJd2FyX29jdGVvbl9pb19yZW9yZGVyX3dtYigpOwkJCQkJXAorCQkJCQkJCQkJXAogCV9fYWRkciA9ICh2b2lkICopX19zd2l6emxlX2FkZHJfIyNid2xxKG1pcHNfaW9fcG9ydF9iYXNlICsgcG9ydCk7IFwKIAkJCQkJCQkJCVwKIAlfX3ZhbCA9IHBmeCMjaW9zd2FiIyNid2xxKF9fYWRkciwgdmFsKTsJCQkJXApAQCAtNTA0LDggKzUxNCwxMiBAQAogI2VuZGlmCiAKIAorI2lmZGVmIENPTkZJR19DUFVfQ0FWSVVNX09DVEVPTgorI2RlZmluZSBtbWlvd2IoKSB3bWIoKQorI2Vsc2UKIC8qIERlcGVuZHMgb24gTUlQUyBJSSBpbnN0cnVjdGlvbiBzZXQgKi8KICNkZWZpbmUgbW1pb3diKCkgYXNtIHZvbGF0aWxlICgic3luYyIgOjo6ICJtZW1vcnkiKQorI2VuZGlmCiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBtZW1zZXRfaW8odm9sYXRpbGUgdm9pZCBfX2lvbWVtICphZGRyLCB1bnNpZ25lZCBjaGFyIHZhbCwgaW50IGNvdW50KQogewpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtYXUxeDAwL2F1MTAwMC5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtYXUxeDAwL2F1MTAwMC5oCmluZGV4IDBkMzAyYmEuLjYyZjkxZjUgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWF1MXgwMC9hdTEwMDAuaAorKysgYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1hdTF4MDAvYXUxMDAwLmgKQEAgLTkxLDE0ICs5MSw1NyBAQAogCXJldHVybiAqKHZvbGF0aWxlIHUzMiAqKXJlZzsKIH0KIAorLyogRWFybHkgQXUxMDAwIGhhdmUgYSB3cml0ZS1vbmx5IFNZU19DUFVQTEwgcmVnaXN0ZXIuICovCitzdGF0aWMgaW5saW5lIGludCBhdTF4eHhfY3B1X2hhc19wbGxfd28odm9pZCkKK3sKKwlzd2l0Y2ggKHJlYWRfYzBfcHJpZCgpKSB7CisJY2FzZSAweDAwMDMwMTAwOgkvKiBBdTEwMDAgREEgKi8KKwljYXNlIDB4MDAwMzAyMDE6CS8qIEF1MTAwMCBIQSAqLworCWNhc2UgMHgwMDAzMDIwMjoJLyogQXUxMDAwIEhCICovCisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworLyogZG9lcyBDUFUgbmVlZCBDT05GSUdbT0RdIHNldCB0byBmaXggdG9ucyBvZiBlcnJhdGE/ICovCitzdGF0aWMgaW5saW5lIGludCBhdTF4eHhfY3B1X25lZWRzX2NvbmZpZ19vZCh2b2lkKQoreworCS8qCisJICogYzBfY29uZmlnLm9kIChiaXQgMTkpIHdhcyB3cml0ZSBvbmx5IChhbmQgcmVhZCBhcyAwKSBvbiB0aGUKKwkgKiBlYXJseSByZXZpc2lvbnMgb2YgQWxjaGVteSBTT0NzLiAgSXQgZGlzYWJsZXMgdGhlIGJ1cyB0cmFucy0KKwkgKiBhY3Rpb24gb3ZlcmxhcHBpbmcgYW5kIG5lZWRzIHRvIGJlIHNldCB0byBmaXggdmFyaW91cyBlcnJhdGEuCisJICovCisJc3dpdGNoIChyZWFkX2MwX3ByaWQoKSkgeworCWNhc2UgMHgwMDAzMDEwMDogLyogQXUxMDAwIERBICovCisJY2FzZSAweDAwMDMwMjAxOiAvKiBBdTEwMDAgSEEgKi8KKwljYXNlIDB4MDAwMzAyMDI6IC8qIEF1MTAwMCBIQiAqLworCWNhc2UgMHgwMTAzMDIwMDogLyogQXUxNTAwIEFCICovCisJLyoKKwkgKiBBdTExMDAvQXUxMjAwIGVycmF0YSBhY3R1YWxseSBrZWVwIHNpbGVuY2UgYWJvdXQgdGhpcyBiaXQsCisJICogc28gd2Ugc2V0IGl0IGp1c3QgaW4gY2FzZSBmb3IgdGhvc2UgcmV2aXNpb25zIHRoYXQgcmVxdWlyZQorCSAqIGl0IHRvIGJlIHNldCBhY2NvcmRpbmcgdG8gdGhlIChub3cgZ29uZSkgY3B1X3RhYmxlLgorCSAqLworCWNhc2UgMHgwMjAzMDIwMDogLyogQXUxMTAwIEFCICovCisJY2FzZSAweDAyMDMwMjAxOiAvKiBBdTExMDAgQkEgKi8KKwljYXNlIDB4MDIwMzAyMDI6IC8qIEF1MTEwMCBCQyAqLworCWNhc2UgMHgwNDAzMDIwMTogLyogQXUxMjAwIEFDICovCisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KIAogLyogYXJjaC9taXBzL2F1MTAwMC9jb21tb24vY2xvY2tzLmMgKi8KIGV4dGVybiB2b2lkIHNldF9hdTF4MDBfc3BlZWQodW5zaWduZWQgaW50IG5ld19mcmVxKTsKIGV4dGVybiB1bnNpZ25lZCBpbnQgZ2V0X2F1MXgwMF9zcGVlZCh2b2lkKTsKIGV4dGVybiB2b2lkIHNldF9hdTF4MDBfdWFydF9iYXVkX2Jhc2UodW5zaWduZWQgbG9uZyBuZXdfYmF1ZF9iYXNlKTsKIGV4dGVybiB1bnNpZ25lZCBsb25nIGdldF9hdTF4MDBfdWFydF9iYXVkX2Jhc2Uodm9pZCk7Ci1leHRlcm4gdm9pZCBzZXRfYXUxeDAwX2xjZF9jbG9jayh2b2lkKTsKLWV4dGVybiB1bnNpZ25lZCBpbnQgZ2V0X2F1MXgwMF9sY2RfY2xvY2sodm9pZCk7CitleHRlcm4gdW5zaWduZWQgbG9uZyBhdTF4eHhfY2FsY19jbG9jayh2b2lkKTsKKworLyogUE06IGFyY2gvbWlwcy9hbGNoZW15L2NvbW1vbi9zbGVlcGVyLlMsIHBvd2VyLmMsIGlycS5jICovCit2b2lkIGF1MXh4eF9zYXZlX2FuZF9zbGVlcCh2b2lkKTsKK3ZvaWQgYXVfc2xlZXAodm9pZCk7Cit2b2lkIHNhdmVfYXUxeHh4X2ludGN0bCh2b2lkKTsKK3ZvaWQgcmVzdG9yZV9hdTF4eHhfaW50Y3RsKHZvaWQpOwogCiAvKgogICogRXZlcnkgYm9hcmQgZGVzY3JpYmVzIGl0cyBJUlEgbWFwcGluZyB3aXRoIHRoaXMgdGFibGUuCkBAIC0xMDksMTAgKzE1MiwxMSBAQAogCWludAlpbV9yZXF1ZXN0OwogfTsKIAotLyoKLSAqIGluaXRfSVJRIGxvb2tzIGZvciBhIHRhYmxlIHdpdGggdGhpcyBuYW1lLgotICovCi1leHRlcm4gc3RydWN0IGF1MXh4eF9pcnFtYXAgYXUxeHh4X2lycV9tYXBbXTsKKy8qIGNvcmUgY2FsbHMgdGhpcyBmdW5jdGlvbiB0byBsZXQgYm9hcmRzIGluaXRpYWxpemUgb3RoZXIgSVJRIHNvdXJjZXMgKi8KK3ZvaWQgYm9hcmRfaW5pdF9pcnEodm9pZCk7CisKKy8qIGJvYXJkcyBjYWxsIHRoaXMgdG8gcmVnaXN0ZXIgYWRkaXRpb25hbCAoR1BJTykgaW50ZXJydXB0cyAqLwordm9pZCBhdTF4eHhfc2V0dXBfaXJxbWFwKHN0cnVjdCBhdTF4eHhfaXJxbWFwICptYXAsIGludCBjb3VudCk7CiAKICNlbmRpZiAvKiAhZGVmaW5lZCAoX0xBTkdVQUdFX0FTU0VNQkxZKSAqLwogCkBAIC01MDUsMTUgKzU0OSw2IEBACiAKICNkZWZpbmUgSUMxX1RFU1RCSVQJCTB4QjE4MDAwODAKIAotLyogSW50ZXJydXB0IENvbmZpZ3VyYXRpb24gTW9kZXMgKi8KLSNkZWZpbmUgSU5UQ19JTlRfRElTQUJMRUQJCTB4MAotI2RlZmluZSBJTlRDX0lOVF9SSVNFX0VER0UJCTB4MQotI2RlZmluZSBJTlRDX0lOVF9GQUxMX0VER0UJCTB4MgotI2RlZmluZSBJTlRDX0lOVF9SSVNFX0FORF9GQUxMX0VER0UJMHgzCi0jZGVmaW5lIElOVENfSU5UX0hJR0hfTEVWRUwJCTB4NQotI2RlZmluZSBJTlRDX0lOVF9MT1dfTEVWRUwJCTB4NgotI2RlZmluZSBJTlRDX0lOVF9ISUdIX0FORF9MT1dfTEVWRUwJMHg3Ci0KIC8qIEludGVycnVwdCBOdW1iZXJzICovCiAvKiBBdTEwMDAgKi8KICNpZmRlZiBDT05GSUdfU09DX0FVMTAwMApAQCAtMTUyNSw2ICsxNTYwLDEwIEBACiAjZGVmaW5lIFNZU19TTFBQV1IJCTB4QjE5MDAwNzgKICNkZWZpbmUgU1lTX1NMRUVQCQkweEIxOTAwMDdDCiAKKyNkZWZpbmUgU1lTX1dBS0VNU0tfRDIJCSgxIDw8IDkpCisjZGVmaW5lIFNZU19XQUtFTVNLX00yCQkoMSA8PCA4KQorI2RlZmluZSBTWVNfV0FLRU1TS19HUElPKHgpCSgxIDw8ICh4KSkKKwogLyogQ2xvY2sgQ29udHJvbGxlciAqLwogI2RlZmluZSBTWVNfRlJFUUNUUkwwCQkweEIxOTAwMDIwCiAjICBkZWZpbmUgU1lTX0ZDX0ZSRElWMl9CSVQJMjIKQEAgLTE3NDksMjQgKzE3ODgsNCBAQAogCiAjZW5kaWYKIAotLyoKLSAqIFByb2Nlc3NvciBpbmZvcm1hdGlvbiBiYXNlZCBvbiBQUklELgotICogQ29waWVkIGZyb20gUG93ZXJQQy4KLSAqLwotI2lmbmRlZiBfTEFOR1VBR0VfQVNTRU1CTFkKLXN0cnVjdCBjcHVfc3BlYyB7Ci0JLyogQ1BVIGlzIG1hdGNoZWQgdmlhIChQUklEICYgcHJpZF9tYXNrKSA9PSBwcmlkX3ZhbHVlICovCi0JdW5zaWduZWQgaW50CXByaWRfbWFzazsKLQl1bnNpZ25lZCBpbnQJcHJpZF92YWx1ZTsKLQotCWNoYXIJCSpjcHVfbmFtZTsKLQl1bnNpZ25lZCBjaGFyCWNwdV9vZDsJCS8qIFNldCBDb25maWdbT0RdICovCi0JdW5zaWduZWQgY2hhcgljcHVfYmNsazsJLyogRW5hYmxlIEJDTEsgc3dpdGNoaW5nICovCi0JdW5zaWduZWQgY2hhcgljcHVfcGxsX3dvOwkvKiBzeXNfY3B1cGxsIHJlZy4gd3JpdGUtb25seSAqLwotfTsKLQotZXh0ZXJuIHN0cnVjdCBjcHVfc3BlYwljcHVfc3BlY3NbXTsKLWV4dGVybiBzdHJ1Y3QgY3B1X3NwZWMJKmN1cl9jcHVfc3BlY1tdOwotI2VuZGlmCi0KICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtYXUxeDAwL2F1MXh4eF9kYmRtYS5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtYXUxeDAwL2F1MXh4eF9kYmRtYS5oCmluZGV4IDQ0YTY3YmYuLjA2ZjY4ZjQgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWF1MXgwMC9hdTF4eHhfZGJkbWEuaAorKysgYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1hdTF4MDAvYXUxeHh4X2RiZG1hLmgKQEAgLTM1Nyw2ICszNTcsMTEgQEAKIHUzMiBhdTF4eHhfZGRtYV9hZGRfZGV2aWNlKGRiZGV2X3RhYl90ICpkZXYpOwogZXh0ZXJuIHZvaWQgYXUxeHh4X2RkbWFfZGVsX2RldmljZSh1MzIgZGV2aWQpOwogdm9pZCAqYXUxeHh4X2RkbWFfZ2V0X25leHRwdHJfdmlydChhdTF4X2RkbWFfZGVzY190ICpkcCk7CisjaWZkZWYgQ09ORklHX1BNCit2b2lkIGF1MXh4eF9kYmRtYV9zdXNwZW5kKHZvaWQpOwordm9pZCBhdTF4eHhfZGJkbWFfcmVzdW1lKHZvaWQpOworI2VuZGlmCisKIAogLyoKICAqIFNvbWUgY29tcGF0aWJpbHR5IG1hY3JvcyAtLSBuZWVkZWQgdG8gbWFrZSBjaGFuZ2VzIHRvIEFQSQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtY2F2aXVtLW9jdGVvbi9jcHUtZmVhdHVyZS1vdmVycmlkZXMuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWNhdml1bS1vY3Rlb24vY3B1LWZlYXR1cmUtb3ZlcnJpZGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDRjZTZlNgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWNhdml1bS1vY3Rlb24vY3B1LWZlYXR1cmUtb3ZlcnJpZGVzLmgKQEAgLTAsMCArMSw3OCBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNCBDYXZpdW0gTmV0d29ya3MKKyAqLworI2lmbmRlZiBfX0FTTV9NQUNIX0NBVklVTV9PQ1RFT05fQ1BVX0ZFQVRVUkVfT1ZFUlJJREVTX0gKKyNkZWZpbmUgX19BU01fTUFDSF9DQVZJVU1fT0NURU9OX0NQVV9GRUFUVVJFX09WRVJSSURFU19ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGFzbS9taXBzcmVncy5oPgorCisvKgorICogQ2F2aXVtIE9jdGVvbnMgYXJlIE1JUFM2NHYyIHByb2Nlc3NvcnMKKyAqLworI2RlZmluZSBjcHVfZGNhY2hlX2xpbmVfc2l6ZSgpCTEyOAorI2RlZmluZSBjcHVfaWNhY2hlX2xpbmVfc2l6ZSgpCTEyOAorCisKKyNkZWZpbmUgY3B1X2hhc180a2V4CQkxCisjZGVmaW5lIGNwdV9oYXNfM2tfY2FjaGUJMAorI2RlZmluZSBjcHVfaGFzXzRrX2NhY2hlCTAKKyNkZWZpbmUgY3B1X2hhc190eDM5X2NhY2hlCTAKKyNkZWZpbmUgY3B1X2hhc19mcHUJCTAKKyNkZWZpbmUgY3B1X2hhc19jb3VudGVyCQkxCisjZGVmaW5lIGNwdV9oYXNfd2F0Y2gJCTEKKyNkZWZpbmUgY3B1X2hhc19kaXZlYwkJMQorI2RlZmluZSBjcHVfaGFzX3ZjZQkJMAorI2RlZmluZSBjcHVfaGFzX2NhY2hlX2NkZXhfcAkwCisjZGVmaW5lIGNwdV9oYXNfY2FjaGVfY2RleF9zCTAKKyNkZWZpbmUgY3B1X2hhc19wcmVmZXRjaAkxCisKKy8qCisgKiBXZSBzaG91bGQgZGlzYWJsZSBMTC9TQyBvbiBub24gU01QIHN5c3RlbXMgYXMgaXQgaXMgZmFzdGVyIHRvCisgKiBkaXNhYmxlIGludGVycnVwdHMgZm9yIGF0b21pYyBhY2Nlc3MgdGhhbiBhIExML1NDLiAgVW5mb3J0dW5hdGx5IHdlCisgKiBjYW5ub3QgYXMgdGhpcyBicmVha3MgYXNtL2Z1dGV4LmgKKyAqLworI2RlZmluZSBjcHVfaGFzX2xsc2MJCTEKKyNkZWZpbmUgY3B1X2hhc192dGFnX2ljYWNoZQkxCisjZGVmaW5lIGNwdV9oYXNfZGNfYWxpYXNlcwkwCisjZGVmaW5lIGNwdV9oYXNfaWNfZmlsbHNfZl9kYwkwCisjZGVmaW5lIGNwdV9oYXNfNjRiaXRzCQkxCisjZGVmaW5lIGNwdV9oYXNfb2N0ZW9uX2NhY2hlCTEKKyNkZWZpbmUgY3B1X2hhc19zYWEJCW9jdGVvbl9oYXNfc2FhKCkKKyNkZWZpbmUgY3B1X2hhc19taXBzMzJyMQkwCisjZGVmaW5lIGNwdV9oYXNfbWlwczMycjIJMAorI2RlZmluZSBjcHVfaGFzX21pcHM2NHIxCTAKKyNkZWZpbmUgY3B1X2hhc19taXBzNjRyMgkxCisjZGVmaW5lIGNwdV9oYXNfZHNwCQkwCisjZGVmaW5lIGNwdV9oYXNfbWlwc210CQkwCisjZGVmaW5lIGNwdV9oYXNfdXNlcmxvY2FsCTAKKyNkZWZpbmUgY3B1X2hhc192aW50CQkwCisjZGVmaW5lIGNwdV9oYXNfdmVpYwkJMAorI2RlZmluZSBBUkNIX0hBU19SRUFEX0NVUlJFTlRfVElNRVIgMQorI2RlZmluZSBBUkNIX0hBU19JUlFfUEVSX0NQVQkxCisjZGVmaW5lIEFSQ0hfSEFTX1NQSU5MT0NLX1BSRUZFVENIIDEKKyNkZWZpbmUgc3Bpbl9sb2NrX3ByZWZldGNoKHgpIHByZWZldGNoKHgpCisjZGVmaW5lIFBSRUZFVENIX1NUUklERSAxMjgKKworc3RhdGljIGlubGluZSBpbnQgcmVhZF9jdXJyZW50X3RpbWVyKHVuc2lnbmVkIGxvbmcgKnJlc3VsdCkKK3sKKwlhc20gdm9sYXRpbGUgKCJyZGh3ciAlMCwkMzFcbiIKKyNpZm5kZWYgQ09ORklHXzY0QklUCisJCSAgICAgICJcdHNsbCAlMCwgMCIKKyNlbmRpZgorCQkgICAgICA6ICI9ciIgKCpyZXN1bHQpKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgb2N0ZW9uX2hhc19zYWEodm9pZCkKK3sKKwlpbnQgaWQ7CisJYXNtIHZvbGF0aWxlICgibWZjMCAlMCwgJDE1LDAiIDogIj1yIiAoaWQpKTsKKwlyZXR1cm4gaWQgPj0gMHgwMDBkMDMwMDsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1jYXZpdW0tb2N0ZW9uL2RtYS1jb2hlcmVuY2UuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWNhdml1bS1vY3Rlb24vZG1hLWNvaGVyZW5jZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzMGZjZTkKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1jYXZpdW0tb2N0ZW9uL2RtYS1jb2hlcmVuY2UuaApAQCAtMCwwICsxLDY0IEBACisvKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA2ICBSYWxmIEJhZWNobGUgPHJhbGZAbGludXgtbWlwcy5vcmc+CisgKgorICoKKyAqIFNpbWlsYXIgdG8gbWFjaC1nZW5lcmljL2RtYS1jb2hlcmVuY2UuaCBleGNlcHQKKyAqIHBsYXRfZGV2aWNlX2lzX2NvaGVyZW50IGhhcmQgY29kZWQgdG8gcmV0dXJuIDEuCisgKgorICovCisjaWZuZGVmIF9fQVNNX01BQ0hfQ0FWSVVNX09DVEVPTl9ETUFfQ09IRVJFTkNFX0gKKyNkZWZpbmUgX19BU01fTUFDSF9DQVZJVU1fT0NURU9OX0RNQV9DT0hFUkVOQ0VfSAorCitzdHJ1Y3QgZGV2aWNlOworCitkbWFfYWRkcl90IG9jdGVvbl9tYXBfZG1hX21lbShzdHJ1Y3QgZGV2aWNlICosIHZvaWQgKiwgc2l6ZV90KTsKK3ZvaWQgb2N0ZW9uX3VubWFwX2RtYV9tZW0oc3RydWN0IGRldmljZSAqLCBkbWFfYWRkcl90KTsKKworc3RhdGljIGlubGluZSBkbWFfYWRkcl90IHBsYXRfbWFwX2RtYV9tZW0oc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICphZGRyLAorCXNpemVfdCBzaXplKQoreworCXJldHVybiBvY3Rlb25fbWFwX2RtYV9tZW0oZGV2LCBhZGRyLCBzaXplKTsKK30KKworc3RhdGljIGlubGluZSBkbWFfYWRkcl90IHBsYXRfbWFwX2RtYV9tZW1fcGFnZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJc3RydWN0IHBhZ2UgKnBhZ2UpCit7CisJcmV0dXJuIG9jdGVvbl9tYXBfZG1hX21lbShkZXYsIHBhZ2VfYWRkcmVzcyhwYWdlKSwgUEFHRV9TSVpFKTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHBsYXRfZG1hX2FkZHJfdG9fcGh5cyhkbWFfYWRkcl90IGRtYV9hZGRyKQoreworCXJldHVybiBkbWFfYWRkcjsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHBsYXRfdW5tYXBfZG1hX21lbShzdHJ1Y3QgZGV2aWNlICpkZXYsIGRtYV9hZGRyX3QgZG1hX2FkZHIpCit7CisJb2N0ZW9uX3VubWFwX2RtYV9tZW0oZGV2LCBkbWFfYWRkcik7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHBsYXRfZG1hX3N1cHBvcnRlZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHU2NCBtYXNrKQoreworCXJldHVybiAxOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcGxhdF9leHRyYV9zeW5jX2Zvcl9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2KQoreworCW1iKCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHBsYXRfZGV2aWNlX2lzX2NvaGVyZW50KHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGlubGluZSBpbnQgcGxhdF9kbWFfbWFwcGluZ19lcnJvcihzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJCSBkbWFfYWRkcl90IGRtYV9hZGRyKQoreworCXJldHVybiBkbWFfYWRkciA9PSAtMTsKK30KKworI2VuZGlmIC8qIF9fQVNNX01BQ0hfQ0FWSVVNX09DVEVPTl9ETUFfQ09IRVJFTkNFX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWNhdml1bS1vY3Rlb24vaXJxLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1jYXZpdW0tb2N0ZW9uL2lycS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzMjIyMGYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1jYXZpdW0tb2N0ZW9uL2lycS5oCkBAIC0wLDAgKzEsMjQ0IEBACisvKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMDggQ2F2aXVtIE5ldHdvcmtzCisgKi8KKyNpZm5kZWYgX19PQ1RFT05fSVJRX0hfXworI2RlZmluZSBfX09DVEVPTl9JUlFfSF9fCisKKyNkZWZpbmUgTlJfSVJRUyBPQ1RFT05fSVJRX0xBU1QKKyNkZWZpbmUgTUlQU19DUFVfSVJRX0JBU0UgT0NURU9OX0lSUV9TVzAKKworLyogMCAtIDcgcmVwcmVzZW50IHRoZSBpODI1OSBtYXN0ZXIgKi8KKyNkZWZpbmUgT0NURU9OX0lSUV9JODI1OU0wCTAKKyNkZWZpbmUgT0NURU9OX0lSUV9JODI1OU0xCTEKKyNkZWZpbmUgT0NURU9OX0lSUV9JODI1OU0yCTIKKyNkZWZpbmUgT0NURU9OX0lSUV9JODI1OU0zCTMKKyNkZWZpbmUgT0NURU9OX0lSUV9JODI1OU00CTQKKyNkZWZpbmUgT0NURU9OX0lSUV9JODI1OU01CTUKKyNkZWZpbmUgT0NURU9OX0lSUV9JODI1OU02CTYKKyNkZWZpbmUgT0NURU9OX0lSUV9JODI1OU03CTcKKy8qIDggLSAxNSByZXByZXNlbnQgdGhlIGk4MjU5IHNsYXZlICovCisjZGVmaW5lIE9DVEVPTl9JUlFfSTgyNTlTMAk4CisjZGVmaW5lIE9DVEVPTl9JUlFfSTgyNTlTMQk5CisjZGVmaW5lIE9DVEVPTl9JUlFfSTgyNTlTMgkxMAorI2RlZmluZSBPQ1RFT05fSVJRX0k4MjU5UzMJMTEKKyNkZWZpbmUgT0NURU9OX0lSUV9JODI1OVM0CTEyCisjZGVmaW5lIE9DVEVPTl9JUlFfSTgyNTlTNQkxMworI2RlZmluZSBPQ1RFT05fSVJRX0k4MjU5UzYJMTQKKyNkZWZpbmUgT0NURU9OX0lSUV9JODI1OVM3CTE1CisvKiAxNiAtIDIzIHJlcHJlc2VudCB0aGUgOCBNSVBTIHN0YW5kYXJkIGludGVycnVwdCBzb3VyY2VzICovCisjZGVmaW5lIE9DVEVPTl9JUlFfU1cwCQkxNgorI2RlZmluZSBPQ1RFT05fSVJRX1NXMQkJMTcKKyNkZWZpbmUgT0NURU9OX0lSUV9DSVUwCQkxOAorI2RlZmluZSBPQ1RFT05fSVJRX0NJVTEJCTE5CisjZGVmaW5lIE9DVEVPTl9JUlFfQ0lVNAkJMjAKKyNkZWZpbmUgT0NURU9OX0lSUV81CQkyMQorI2RlZmluZSBPQ1RFT05fSVJRX1BFUkYJCTIyCisjZGVmaW5lIE9DVEVPTl9JUlFfVElNRVIJMjMKKy8qIDI0IC0gODcgcmVwcmVzZW50IHRoZSBzb3VyY2VzIGluIENJVV9JTlRYX0VOMCAqLworI2RlZmluZSBPQ1RFT05fSVJRX1dPUktRMAkyNAorI2RlZmluZSBPQ1RFT05fSVJRX1dPUktRMQkyNQorI2RlZmluZSBPQ1RFT05fSVJRX1dPUktRMgkyNgorI2RlZmluZSBPQ1RFT05fSVJRX1dPUktRMwkyNworI2RlZmluZSBPQ1RFT05fSVJRX1dPUktRNAkyOAorI2RlZmluZSBPQ1RFT05fSVJRX1dPUktRNQkyOQorI2RlZmluZSBPQ1RFT05fSVJRX1dPUktRNgkzMAorI2RlZmluZSBPQ1RFT05fSVJRX1dPUktRNwkzMQorI2RlZmluZSBPQ1RFT05fSVJRX1dPUktROAkzMgorI2RlZmluZSBPQ1RFT05fSVJRX1dPUktROQkzMworI2RlZmluZSBPQ1RFT05fSVJRX1dPUktRMTAJMzQKKyNkZWZpbmUgT0NURU9OX0lSUV9XT1JLUTExCTM1CisjZGVmaW5lIE9DVEVPTl9JUlFfV09SS1ExMgkzNgorI2RlZmluZSBPQ1RFT05fSVJRX1dPUktRMTMJMzcKKyNkZWZpbmUgT0NURU9OX0lSUV9XT1JLUTE0CTM4CisjZGVmaW5lIE9DVEVPTl9JUlFfV09SS1ExNQkzOQorI2RlZmluZSBPQ1RFT05fSVJRX0dQSU8wCTQwCisjZGVmaW5lIE9DVEVPTl9JUlFfR1BJTzEJNDEKKyNkZWZpbmUgT0NURU9OX0lSUV9HUElPMgk0MgorI2RlZmluZSBPQ1RFT05fSVJRX0dQSU8zCTQzCisjZGVmaW5lIE9DVEVPTl9JUlFfR1BJTzQJNDQKKyNkZWZpbmUgT0NURU9OX0lSUV9HUElPNQk0NQorI2RlZmluZSBPQ1RFT05fSVJRX0dQSU82CTQ2CisjZGVmaW5lIE9DVEVPTl9JUlFfR1BJTzcJNDcKKyNkZWZpbmUgT0NURU9OX0lSUV9HUElPOAk0OAorI2RlZmluZSBPQ1RFT05fSVJRX0dQSU85CTQ5CisjZGVmaW5lIE9DVEVPTl9JUlFfR1BJTzEwCTUwCisjZGVmaW5lIE9DVEVPTl9JUlFfR1BJTzExCTUxCisjZGVmaW5lIE9DVEVPTl9JUlFfR1BJTzEyCTUyCisjZGVmaW5lIE9DVEVPTl9JUlFfR1BJTzEzCTUzCisjZGVmaW5lIE9DVEVPTl9JUlFfR1BJTzE0CTU0CisjZGVmaW5lIE9DVEVPTl9JUlFfR1BJTzE1CTU1CisjZGVmaW5lIE9DVEVPTl9JUlFfTUJPWDAJNTYKKyNkZWZpbmUgT0NURU9OX0lSUV9NQk9YMQk1NworI2RlZmluZSBPQ1RFT05fSVJRX1VBUlQwCTU4CisjZGVmaW5lIE9DVEVPTl9JUlFfVUFSVDEJNTkKKyNkZWZpbmUgT0NURU9OX0lSUV9QQ0lfSU5UMAk2MAorI2RlZmluZSBPQ1RFT05fSVJRX1BDSV9JTlQxCTYxCisjZGVmaW5lIE9DVEVPTl9JUlFfUENJX0lOVDIJNjIKKyNkZWZpbmUgT0NURU9OX0lSUV9QQ0lfSU5UMwk2MworI2RlZmluZSBPQ1RFT05fSVJRX1BDSV9NU0kwCTY0CisjZGVmaW5lIE9DVEVPTl9JUlFfUENJX01TSTEJNjUKKyNkZWZpbmUgT0NURU9OX0lSUV9QQ0lfTVNJMgk2NgorI2RlZmluZSBPQ1RFT05fSVJRX1BDSV9NU0kzCTY3CisjZGVmaW5lIE9DVEVPTl9JUlFfUkVTRVJWRUQ2OAk2OAkvKiBTdW1tYXJ5IG9mIENJVV9JTlRfU1VNMSAqLworI2RlZmluZSBPQ1RFT05fSVJRX1RXU0kJCTY5CisjZGVmaW5lIE9DVEVPTl9JUlFfUk1MCQk3MAorI2RlZmluZSBPQ1RFT05fSVJRX1RSQUNFCTcxCisjZGVmaW5lIE9DVEVPTl9JUlFfR01YX0RSUDAJNzIKKyNkZWZpbmUgT0NURU9OX0lSUV9HTVhfRFJQMQk3MworI2RlZmluZSBPQ1RFT05fSVJRX0lQRF9EUlAJNzQKKyNkZWZpbmUgT0NURU9OX0lSUV9LRVlfWkVSTwk3NQorI2RlZmluZSBPQ1RFT05fSVJRX1RJTUVSMAk3NgorI2RlZmluZSBPQ1RFT05fSVJRX1RJTUVSMQk3NworI2RlZmluZSBPQ1RFT05fSVJRX1RJTUVSMgk3OAorI2RlZmluZSBPQ1RFT05fSVJRX1RJTUVSMwk3OQorI2RlZmluZSBPQ1RFT05fSVJRX1VTQjAJCTgwCisjZGVmaW5lIE9DVEVPTl9JUlFfUENNCQk4MQorI2RlZmluZSBPQ1RFT05fSVJRX01QSQkJODIKKyNkZWZpbmUgT0NURU9OX0lSUV9UV1NJMgk4MworI2RlZmluZSBPQ1RFT05fSVJRX1BPV0lRCTg0CisjZGVmaW5lIE9DVEVPTl9JUlFfSVBEUFBUSFIJODUKKyNkZWZpbmUgT0NURU9OX0lSUV9NSUkwCQk4NgorI2RlZmluZSBPQ1RFT05fSVJRX0JPT1RETUEJODcKKy8qIDg4IC0gMTUxIHJlcHJlc2VudCB0aGUgc291cmNlcyBpbiBDSVVfSU5UWF9FTjEgKi8KKyNkZWZpbmUgT0NURU9OX0lSUV9XRE9HMAk4OAorI2RlZmluZSBPQ1RFT05fSVJRX1dET0cxCTg5CisjZGVmaW5lIE9DVEVPTl9JUlFfV0RPRzIJOTAKKyNkZWZpbmUgT0NURU9OX0lSUV9XRE9HMwk5MQorI2RlZmluZSBPQ1RFT05fSVJRX1dET0c0CTkyCisjZGVmaW5lIE9DVEVPTl9JUlFfV0RPRzUJOTMKKyNkZWZpbmUgT0NURU9OX0lSUV9XRE9HNgk5NAorI2RlZmluZSBPQ1RFT05fSVJRX1dET0c3CTk1CisjZGVmaW5lIE9DVEVPTl9JUlFfV0RPRzgJOTYKKyNkZWZpbmUgT0NURU9OX0lSUV9XRE9HOQk5NworI2RlZmluZSBPQ1RFT05fSVJRX1dET0cxMAk5OAorI2RlZmluZSBPQ1RFT05fSVJRX1dET0cxMQk5OQorI2RlZmluZSBPQ1RFT05fSVJRX1dET0cxMgkxMDAKKyNkZWZpbmUgT0NURU9OX0lSUV9XRE9HMTMJMTAxCisjZGVmaW5lIE9DVEVPTl9JUlFfV0RPRzE0CTEwMgorI2RlZmluZSBPQ1RFT05fSVJRX1dET0cxNQkxMDMKKyNkZWZpbmUgT0NURU9OX0lSUV9VQVJUMgkxMDQKKyNkZWZpbmUgT0NURU9OX0lSUV9VU0IxCQkxMDUKKyNkZWZpbmUgT0NURU9OX0lSUV9NSUkxCQkxMDYKKyNkZWZpbmUgT0NURU9OX0lSUV9SRVNFUlZFRDEwNwkxMDcKKyNkZWZpbmUgT0NURU9OX0lSUV9SRVNFUlZFRDEwOAkxMDgKKyNkZWZpbmUgT0NURU9OX0lSUV9SRVNFUlZFRDEwOQkxMDkKKyNkZWZpbmUgT0NURU9OX0lSUV9SRVNFUlZFRDExMAkxMTAKKyNkZWZpbmUgT0NURU9OX0lSUV9SRVNFUlZFRDExMQkxMTEKKyNkZWZpbmUgT0NURU9OX0lSUV9SRVNFUlZFRDExMgkxMTIKKyNkZWZpbmUgT0NURU9OX0lSUV9SRVNFUlZFRDExMwkxMTMKKyNkZWZpbmUgT0NURU9OX0lSUV9SRVNFUlZFRDExNAkxMTQKKyNkZWZpbmUgT0NURU9OX0lSUV9SRVNFUlZFRDExNQkxMTUKKyNkZWZpbmUgT0NURU9OX0lSUV9SRVNFUlZFRDExNgkxMTYKKyNkZWZpbmUgT0NURU9OX0lSUV9SRVNFUlZFRDExNwkxMTcKKyNkZWZpbmUgT0NURU9OX0lSUV9SRVNFUlZFRDExOAkxMTgKKyNkZWZpbmUgT0NURU9OX0lSUV9SRVNFUlZFRDExOQkxMTkKKyNkZWZpbmUgT0NURU9OX0lSUV9SRVNFUlZFRDEyMAkxMjAKKyNkZWZpbmUgT0NURU9OX0lSUV9SRVNFUlZFRDEyMQkxMjEKKyNkZWZpbmUgT0NURU9OX0lSUV9SRVNFUlZFRDEyMgkxMjIKKyNkZWZpbmUgT0NURU9OX0lSUV9SRVNFUlZFRDEyMwkxMjMKKyNkZWZpbmUgT0NURU9OX0lSUV9SRVNFUlZFRDEyNAkxMjQKKyNkZWZpbmUgT0NURU9OX0lSUV9SRVNFUlZFRDEyNQkxMjUKKyNkZWZpbmUgT0NURU9OX0lSUV9SRVNFUlZFRDEyNgkxMjYKKyNkZWZpbmUgT0NURU9OX0lSUV9SRVNFUlZFRDEyNwkxMjcKKyNkZWZpbmUgT0NURU9OX0lSUV9SRVNFUlZFRDEyOAkxMjgKKyNkZWZpbmUgT0NURU9OX0lSUV9SRVNFUlZFRDEyOQkxMjkKKyNkZWZpbmUgT0NURU9OX0lSUV9SRVNFUlZFRDEzMAkxMzAKKyNkZWZpbmUgT0NURU9OX0lSUV9SRVNFUlZFRDEzMQkxMzEKKyNkZWZpbmUgT0NURU9OX0lSUV9SRVNFUlZFRDEzMgkxMzIKKyNkZWZpbmUgT0NURU9OX0lSUV9SRVNFUlZFRDEzMwkxMzMKKyNkZWZpbmUgT0NURU9OX0lSUV9SRVNFUlZFRDEzNAkxMzQKKyNkZWZpbmUgT0NURU9OX0lSUV9SRVNFUlZFRDEzNQkxMzUKKyNkZWZpbmUgT0NURU9OX0lSUV9SRVNFUlZFRDEzNgkxMzYKKyNkZWZpbmUgT0NURU9OX0lSUV9SRVNFUlZFRDEzNwkxMzcKKyNkZWZpbmUgT0NURU9OX0lSUV9SRVNFUlZFRDEzOAkxMzgKKyNkZWZpbmUgT0NURU9OX0lSUV9SRVNFUlZFRDEzOQkxMzkKKyNkZWZpbmUgT0NURU9OX0lSUV9SRVNFUlZFRDE0MAkxNDAKKyNkZWZpbmUgT0NURU9OX0lSUV9SRVNFUlZFRDE0MQkxNDEKKyNkZWZpbmUgT0NURU9OX0lSUV9SRVNFUlZFRDE0MgkxNDIKKyNkZWZpbmUgT0NURU9OX0lSUV9SRVNFUlZFRDE0MwkxNDMKKyNkZWZpbmUgT0NURU9OX0lSUV9SRVNFUlZFRDE0NAkxNDQKKyNkZWZpbmUgT0NURU9OX0lSUV9SRVNFUlZFRDE0NQkxNDUKKyNkZWZpbmUgT0NURU9OX0lSUV9SRVNFUlZFRDE0NgkxNDYKKyNkZWZpbmUgT0NURU9OX0lSUV9SRVNFUlZFRDE0NwkxNDcKKyNkZWZpbmUgT0NURU9OX0lSUV9SRVNFUlZFRDE0OAkxNDgKKyNkZWZpbmUgT0NURU9OX0lSUV9SRVNFUlZFRDE0OQkxNDkKKyNkZWZpbmUgT0NURU9OX0lSUV9SRVNFUlZFRDE1MAkxNTAKKyNkZWZpbmUgT0NURU9OX0lSUV9SRVNFUlZFRDE1MQkxNTEKKworI2lmZGVmIENPTkZJR19QQ0lfTVNJCisvKiAxNTIgLSAyMTUgcmVwcmVzZW50IHRoZSBNU0kgaW50ZXJydXB0cyAwLTYzICovCisjZGVmaW5lIE9DVEVPTl9JUlFfTVNJX0JJVDAJMTUyCisjZGVmaW5lIE9DVEVPTl9JUlFfTVNJX0JJVDEJMTUzCisjZGVmaW5lIE9DVEVPTl9JUlFfTVNJX0JJVDIJMTU0CisjZGVmaW5lIE9DVEVPTl9JUlFfTVNJX0JJVDMJMTU1CisjZGVmaW5lIE9DVEVPTl9JUlFfTVNJX0JJVDQJMTU2CisjZGVmaW5lIE9DVEVPTl9JUlFfTVNJX0JJVDUJMTU3CisjZGVmaW5lIE9DVEVPTl9JUlFfTVNJX0JJVDYJMTU4CisjZGVmaW5lIE9DVEVPTl9JUlFfTVNJX0JJVDcJMTU5CisjZGVmaW5lIE9DVEVPTl9JUlFfTVNJX0JJVDgJMTYwCisjZGVmaW5lIE9DVEVPTl9JUlFfTVNJX0JJVDkJMTYxCisjZGVmaW5lIE9DVEVPTl9JUlFfTVNJX0JJVDEwCTE2MgorI2RlZmluZSBPQ1RFT05fSVJRX01TSV9CSVQxMQkxNjMKKyNkZWZpbmUgT0NURU9OX0lSUV9NU0lfQklUMTIJMTY0CisjZGVmaW5lIE9DVEVPTl9JUlFfTVNJX0JJVDEzCTE2NQorI2RlZmluZSBPQ1RFT05fSVJRX01TSV9CSVQxNAkxNjYKKyNkZWZpbmUgT0NURU9OX0lSUV9NU0lfQklUMTUJMTY3CisjZGVmaW5lIE9DVEVPTl9JUlFfTVNJX0JJVDE2CTE2OAorI2RlZmluZSBPQ1RFT05fSVJRX01TSV9CSVQxNwkxNjkKKyNkZWZpbmUgT0NURU9OX0lSUV9NU0lfQklUMTgJMTcwCisjZGVmaW5lIE9DVEVPTl9JUlFfTVNJX0JJVDE5CTE3MQorI2RlZmluZSBPQ1RFT05fSVJRX01TSV9CSVQyMAkxNzIKKyNkZWZpbmUgT0NURU9OX0lSUV9NU0lfQklUMjEJMTczCisjZGVmaW5lIE9DVEVPTl9JUlFfTVNJX0JJVDIyCTE3NAorI2RlZmluZSBPQ1RFT05fSVJRX01TSV9CSVQyMwkxNzUKKyNkZWZpbmUgT0NURU9OX0lSUV9NU0lfQklUMjQJMTc2CisjZGVmaW5lIE9DVEVPTl9JUlFfTVNJX0JJVDI1CTE3NworI2RlZmluZSBPQ1RFT05fSVJRX01TSV9CSVQyNgkxNzgKKyNkZWZpbmUgT0NURU9OX0lSUV9NU0lfQklUMjcJMTc5CisjZGVmaW5lIE9DVEVPTl9JUlFfTVNJX0JJVDI4CTE4MAorI2RlZmluZSBPQ1RFT05fSVJRX01TSV9CSVQyOQkxODEKKyNkZWZpbmUgT0NURU9OX0lSUV9NU0lfQklUMzAJMTgyCisjZGVmaW5lIE9DVEVPTl9JUlFfTVNJX0JJVDMxCTE4MworI2RlZmluZSBPQ1RFT05fSVJRX01TSV9CSVQzMgkxODQKKyNkZWZpbmUgT0NURU9OX0lSUV9NU0lfQklUMzMJMTg1CisjZGVmaW5lIE9DVEVPTl9JUlFfTVNJX0JJVDM0CTE4NgorI2RlZmluZSBPQ1RFT05fSVJRX01TSV9CSVQzNQkxODcKKyNkZWZpbmUgT0NURU9OX0lSUV9NU0lfQklUMzYJMTg4CisjZGVmaW5lIE9DVEVPTl9JUlFfTVNJX0JJVDM3CTE4OQorI2RlZmluZSBPQ1RFT05fSVJRX01TSV9CSVQzOAkxOTAKKyNkZWZpbmUgT0NURU9OX0lSUV9NU0lfQklUMzkJMTkxCisjZGVmaW5lIE9DVEVPTl9JUlFfTVNJX0JJVDQwCTE5MgorI2RlZmluZSBPQ1RFT05fSVJRX01TSV9CSVQ0MQkxOTMKKyNkZWZpbmUgT0NURU9OX0lSUV9NU0lfQklUNDIJMTk0CisjZGVmaW5lIE9DVEVPTl9JUlFfTVNJX0JJVDQzCTE5NQorI2RlZmluZSBPQ1RFT05fSVJRX01TSV9CSVQ0NAkxOTYKKyNkZWZpbmUgT0NURU9OX0lSUV9NU0lfQklUNDUJMTk3CisjZGVmaW5lIE9DVEVPTl9JUlFfTVNJX0JJVDQ2CTE5OAorI2RlZmluZSBPQ1RFT05fSVJRX01TSV9CSVQ0NwkxOTkKKyNkZWZpbmUgT0NURU9OX0lSUV9NU0lfQklUNDgJMjAwCisjZGVmaW5lIE9DVEVPTl9JUlFfTVNJX0JJVDQ5CTIwMQorI2RlZmluZSBPQ1RFT05fSVJRX01TSV9CSVQ1MAkyMDIKKyNkZWZpbmUgT0NURU9OX0lSUV9NU0lfQklUNTEJMjAzCisjZGVmaW5lIE9DVEVPTl9JUlFfTVNJX0JJVDUyCTIwNAorI2RlZmluZSBPQ1RFT05fSVJRX01TSV9CSVQ1MwkyMDUKKyNkZWZpbmUgT0NURU9OX0lSUV9NU0lfQklUNTQJMjA2CisjZGVmaW5lIE9DVEVPTl9JUlFfTVNJX0JJVDU1CTIwNworI2RlZmluZSBPQ1RFT05fSVJRX01TSV9CSVQ1NgkyMDgKKyNkZWZpbmUgT0NURU9OX0lSUV9NU0lfQklUNTcJMjA5CisjZGVmaW5lIE9DVEVPTl9JUlFfTVNJX0JJVDU4CTIxMAorI2RlZmluZSBPQ1RFT05fSVJRX01TSV9CSVQ1OQkyMTEKKyNkZWZpbmUgT0NURU9OX0lSUV9NU0lfQklUNjAJMjEyCisjZGVmaW5lIE9DVEVPTl9JUlFfTVNJX0JJVDYxCTIxMworI2RlZmluZSBPQ1RFT05fSVJRX01TSV9CSVQ2MgkyMTQKKyNkZWZpbmUgT0NURU9OX0lSUV9NU0lfQklUNjMJMjE1CisKKyNkZWZpbmUgT0NURU9OX0lSUV9MQVNUICAgICAgICAgMjE2CisjZWxzZQorI2RlZmluZSBPQ1RFT05fSVJRX0xBU1QgICAgICAgICAxNTIKKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWNhdml1bS1vY3Rlb24va2VybmVsLWVudHJ5LWluaXQuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWNhdml1bS1vY3Rlb24va2VybmVsLWVudHJ5LWluaXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjJiNWViCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtY2F2aXVtLW9jdGVvbi9rZXJuZWwtZW50cnktaW5pdC5oCkBAIC0wLDAgKzEsMTMxIEBACisvKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1LTIwMDggQ2F2aXVtIE5ldHdvcmtzLCBJbmMKKyAqLworI2lmbmRlZiBfX0FTTV9NQUNIX0NBVklVTV9PQ1RFT05fS0VSTkVMX0VOVFJZX0gKKyNkZWZpbmUgX19BU01fTUFDSF9DQVZJVU1fT0NURU9OX0tFUk5FTF9FTlRSWV9ICisKKworI2RlZmluZSBDUDBfQ1lDTEVfQ09VTlRFUiAkOSwgNgorI2RlZmluZSBDUDBfQ1ZNQ1RMX1JFRyAkOSwgNworI2RlZmluZSBDUDBfQ1ZNTUVNQ1RMX1JFRyAkMTEsNworI2RlZmluZSBDUDBfUFJJRF9SRUcgJDE1LCAwCisjZGVmaW5lIENQMF9QUklEX09DVEVPTl9QQVNTMSAweDAwMGQwMDAwCisjZGVmaW5lIENQMF9QUklEX09DVEVPTl9DTjMwWFggMHgwMDBkMDIwMAorCisubWFjcm8gIGtlcm5lbF9lbnRyeV9zZXR1cAorCSMgUmVnaXN0ZXJzIHNldCBieSBib290bG9hZGVyOgorCSMgKG9ubHkgMzIgYml0cyBzZXQgYnkgYm9vdGxvYWRlciwgYWxsIGFkZHJlc3NlcyBhcmUgcGh5c2ljYWwKKwkjIGFkZHJlc3NlcywgYW5kIG5lZWQgdG8gaGF2ZSB0aGUgYXBwcm9wcmlhdGUgbWVtb3J5IHJlZ2lvbiBzZXQKKwkjIGJ5IHRoZSBrZXJuZWwKKwkjIGEwID0gYXJnYworCSMgYTEgPSBhcmd2IChrc2VnMCBjb21wYXQgYWRkcikKKwkjIGEyID0gMSBpZiBpbml0IGNvcmUsIHplcm8gb3RoZXJ3aXNlCisJIyBhMyA9IGFkZHJlc3Mgb2YgYm9vdCBkZXNjcmlwdG9yIGJsb2NrCisJLnNldCBwdXNoCisJLnNldCBhcmNoPW9jdGVvbgorCSMgUmVhZCB0aGUgY2F2aXVtIG1lbSBjb250cm9sIHJlZ2lzdGVyCisJZG1mYzAgICB2MCwgQ1AwX0NWTU1FTUNUTF9SRUcKKwkjIENsZWFyIHRoZSBsb3dlciA2IGJpdHMsIHRoZSBDVk1TRUcgc2l6ZQorCWRpbnMgICAgdjAsICQwLCAwLCA2CisJb3JpICAgICB2MCwgQ09ORklHX0NBVklVTV9PQ1RFT05fQ1ZNU0VHX1NJWkUKKwlkbXRjMCAgIHYwLCBDUDBfQ1ZNTUVNQ1RMX1JFRwkjIFdyaXRlIHRoZSBjYXZpdW0gbWVtIGNvbnRyb2wgcmVnaXN0ZXIKKwlkbWZjMCAgIHYwLCBDUDBfQ1ZNQ1RMX1JFRwkjIFJlYWQgdGhlIGNhdml1bSBjb250cm9sIHJlZ2lzdGVyCisjaWZkZWYgQ09ORklHX0NBVklVTV9PQ1RFT05fSFdfRklYX1VOQUxJR05FRAorCSMgRGlzYWJsZSB1bmFsaWduZWQgbG9hZC9zdG9yZSBzdXBwb3J0IGJ1dCBsZWF2ZSBIVyBmaXh1cCBlbmFibGVkCisJb3IgIHYwLCB2MCwgMHg1MDAxCisJeG9yIHYwLCB2MCwgMHgxMDAxCisjZWxzZQorCSMgRGlzYWJsZSB1bmFsaWduZWQgbG9hZC9zdG9yZSBhbmQgSFcgZml4dXAgc3VwcG9ydAorCW9yICB2MCwgdjAsIDB4NTAwMQorCXhvciB2MCwgdjAsIDB4NTAwMQorI2VuZGlmCisJIyBSZWFkIHRoZSBwcm9jZXNzb3IgSUQgcmVnaXN0ZXIKKwltZmMwIHYxLCBDUDBfUFJJRF9SRUcKKwkjIERpc2FibGUgaW5zdHJ1Y3Rpb24gcHJlZmV0Y2hpbmcgKE9jdGVvbiBQYXNzMSBlcnJhdGEpCisJb3IgIHYwLCB2MCwgMHgyMDAwCisJIyBTa2lwIHJlZW5hYmxlIG9mIHByZWZldGNoaW5nIGZvciBPY3Rlb24gUGFzczEKKwliZXEgdjEsIENQMF9QUklEX09DVEVPTl9QQVNTMSwgc2tpcAorCW5vcAorCSMgUmVlbmFibGUgaW5zdHJ1Y3Rpb24gcHJlZmV0Y2hpbmcsIG5vdCBvbiBQYXNzMQorCXhvciB2MCwgdjAsIDB4MjAwMAorCSMgU3RyaXAgb2ZmIHBhc3MgbnVtYmVyIG9mZiBvZiBwcm9jZXNzb3IgaWQKKwlzcmwgdjEsIDgKKwlzbGwgdjEsIDgKKwkjIENOMzBYWCBuZWVkcyBzb21lIGV4dHJhIHN0dWZmIHR1cm5lZCBvZmYgZm9yIGJldHRlciBwZXJmb3JtYW5jZQorCWJuZSB2MSwgQ1AwX1BSSURfT0NURU9OX0NOMzBYWCwgc2tpcAorCW5vcAorCSMgQ04zMFhYIFVzZSByYW5kb20gSWNhY2hlIHJlcGxhY2VtZW50CisJb3IgIHYwLCB2MCwgMHg0MDAKKwkjIENOMzBYWCBEaXNhYmxlIGluc3RydWN0aW9uIHByZWZldGNoaW5nCisJb3IgIHYwLCB2MCwgMHgyMDAwCitza2lwOgorCSMgV3JpdGUgdGhlIGNhdml1bSBjb250cm9sIHJlZ2lzdGVyCisJZG10YzAgICB2MCwgQ1AwX0NWTUNUTF9SRUcKKwlzeW5jCisJIyBGbHVzaCBkY2FjaGUgYWZ0ZXIgY29uZmlnIGNoYW5nZQorCWNhY2hlICAgOSwgMCgkMCkKKwkjIEdldCBteSBjb3JlIGlkCisJcmRod3IgICB2MCwgJDAKKwkjIEp1bXAgdGhlIG1hc3RlciB0byBrZXJuZWxfZW50cnkKKwlibmUgICAgIGEyLCB6ZXJvLCBvY3Rlb25fbWFpbl9wcm9jZXNzb3IKKwlub3AKKworI2lmZGVmIENPTkZJR19TTVAKKworCSMKKwkjIEFsbCBjb3JlcyBvdGhlciB0aGFuIHRoZSBtYXN0ZXIgbmVlZCB0byB3YWl0IGhlcmUgZm9yIFNNUCBib290c3RyYXAKKwkjIHRvIGJlZ2luCisJIworCisJIyBUaGlzIGlzIHRoZSB2YXJpYWJsZSB3aGVyZSB0aGUgbmV4dCBjb3JlIHRvIGJvb3Qgb3Mgc3RvcmVkCisJUFRSX0xBICB0MCwgb2N0ZW9uX3Byb2Nlc3Nvcl9ib290CitvY3Rlb25fc3Bpbl93YWl0X2Jvb3Q6CisJIyBHZXQgdGhlIGNvcmUgaWQgb2YgdGhlIG5leHQgdG8gYmUgYm9vdGVkCisJTE9OR19MICB0MSwgKHQwKQorCSMgS2VlcCBsb29waW5nIGlmIGl0IGlzbid0IG1lCisJYm5lIHQxLCB2MCwgb2N0ZW9uX3NwaW5fd2FpdF9ib290CisJbm9wCisJIyBHZXQgbXkgR1AgZnJvbSB0aGUgZ2xvYmFsIHZhcmlhYmxlCisJUFRSX0xBICB0MCwgb2N0ZW9uX3Byb2Nlc3Nvcl9ncAorCUxPTkdfTCAgZ3AsICh0MCkKKwkjIEdldCBteSBTUCBmcm9tIHRoZSBnbG9iYWwgdmFyaWFibGUKKwlQVFJfTEEgIHQwLCBvY3Rlb25fcHJvY2Vzc29yX3NwCisJTE9OR19MICBzcCwgKHQwKQorCSMgU2V0IHRoZSBTUCBnbG9iYWwgdmFyaWFibGUgdG8gemVybyBzbyB0aGUgbWFzdGVyIGtub3dzIHdlJ3ZlIHN0YXJ0ZWQKKwlMT05HX1MgIHplcm8sICh0MCkKKyNpZmRlZiBfX09DVEVPTl9fCisJc3luY3cKKwlzeW5jdworI2Vsc2UKKwlzeW5jCisjZW5kaWYKKwkjIEp1bXAgdG8gdGhlIG5vcm1hbCBMaW51eCBTTVAgZW50cnkgcG9pbnQKKwlqICAgc21wX2Jvb3RzdHJhcAorCW5vcAorI2Vsc2UgLyogQ09ORklHX1NNUCAqLworCisJIworCSMgU29tZW9uZSB0cmllZCB0byBib290IFNNUCB3aXRoIGEgbm9uIFNNUCBrZXJuZWwuIEFsbCBleHRyYSBjb3JlcworCSMgd2lsbCBoYWx0IGhlcmUuCisJIworb2N0ZW9uX3dhaXRfZm9yZXZlcjoKKwl3YWl0CisJYiAgIG9jdGVvbl93YWl0X2ZvcmV2ZXIKKwlub3AKKworI2VuZGlmIC8qIENPTkZJR19TTVAgKi8KK29jdGVvbl9tYWluX3Byb2Nlc3NvcjoKKwkuc2V0IHBvcAorLmVuZG0KKworLyoKKyAqIERvIFNNUCBzbGF2ZSBwcm9jZXNzb3Igc2V0dXAgbmVjZXNzYXJ5IGJlZm9yZSB3ZSBjYW4gc2F2ZWx5IGV4ZWN1dGUgQyBjb2RlLgorICovCisJLm1hY3JvICBzbXBfc2xhdmVfc2V0dXAKKwkuZW5kbQorCisjZW5kaWYgLyogX19BU01fTUFDSF9DQVZJVU1fT0NURU9OX0tFUk5FTF9FTlRSWV9IICovCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1jYXZpdW0tb2N0ZW9uL3dhci5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtY2F2aXVtLW9jdGVvbi93YXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDcxMmQ3Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtY2F2aXVtLW9jdGVvbi93YXIuaApAQCAtMCwwICsxLDI2IEBACisvKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyLCAyMDA0LCAyMDA3IGJ5IFJhbGYgQmFlY2hsZSA8cmFsZkBsaW51eC1taXBzLm9yZz4KKyAqIENvcHlyaWdodCAoQykgMjAwOCBDYXZpdW0gTmV0d29ya3MgPHN1cHBvcnRAY2F2aXVtbmV0d29ya3MuY29tPgorICovCisjaWZuZGVmIF9fQVNNX01JUFNfTUFDSF9DQVZJVU1fT0NURU9OX1dBUl9ICisjZGVmaW5lIF9fQVNNX01JUFNfTUFDSF9DQVZJVU1fT0NURU9OX1dBUl9ICisKKyNkZWZpbmUgUjQ2MDBfVjFfSU5ERVhfSUNBQ0hFT1BfV0FSCTAKKyNkZWZpbmUgUjQ2MDBfVjFfSElUX0NBQ0hFT1BfV0FSCTAKKyNkZWZpbmUgUjQ2MDBfVjJfSElUX0NBQ0hFT1BfV0FSCTAKKyNkZWZpbmUgUjU0MzJfQ1AwX0lOVEVSUlVQVF9XQVIJCTAKKyNkZWZpbmUgQkNNMTI1MF9NM19XQVIJCQkwCisjZGVmaW5lIFNJQllURV8xOTU2X1dBUgkJCTAKKyNkZWZpbmUgTUlQUzRLX0lDQUNIRV9SRUZJTExfV0FSCTAKKyNkZWZpbmUgTUlQU19DQUNIRV9TWU5DX1dBUgkJMAorI2RlZmluZSBUWDQ5WFhfSUNBQ0hFX0lOREVYX0lOVl9XQVIJMAorI2RlZmluZSBSTTkwMDBfQ0RFWF9TTVBfV0FSCQkwCisjZGVmaW5lIElDQUNIRV9SRUZJTExTX1dPUktBUk9VTkRfV0FSCTAKKyNkZWZpbmUgUjEwMDAwX0xMU0NfV0FSCQkJMAorI2RlZmluZSBNSVBTMzRLX01JU1NFRF9JVExCX1dBUgkJMAorCisjZW5kaWYgLyogX19BU01fTUlQU19NQUNIX0NBVklVTV9PQ1RFT05fV0FSX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWdlbmVyaWMvZG1hLWNvaGVyZW5jZS5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtZ2VuZXJpYy9kbWEtY29oZXJlbmNlLmgKaW5kZXggNzZlMDRlNy4uMzZjNjExYiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtZ2VuZXJpYy9kbWEtY29oZXJlbmNlLmgKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtZ2VuZXJpYy9kbWEtY29oZXJlbmNlLmgKQEAgLTI4LDEwICsyOCwzNCBAQAogCXJldHVybiBkbWFfYWRkcjsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIHBsYXRfdW5tYXBfZG1hX21lbShkbWFfYWRkcl90IGRtYV9hZGRyKQorc3RhdGljIGlubGluZSB2b2lkIHBsYXRfdW5tYXBfZG1hX21lbShzdHJ1Y3QgZGV2aWNlICpkZXYsIGRtYV9hZGRyX3QgZG1hX2FkZHIpCiB7CiB9CiAKK3N0YXRpYyBpbmxpbmUgaW50IHBsYXRfZG1hX3N1cHBvcnRlZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHU2NCBtYXNrKQoreworCS8qCisJICogd2UgZmFsbCBiYWNrIHRvIEdGUF9ETUEgd2hlbiB0aGUgbWFzayBpc24ndCBhbGwgMXMsCisJICogc28gd2UgY2FuJ3QgZ3VhcmFudGVlIGFsbG9jYXRpb25zIHRoYXQgbXVzdCBiZQorCSAqIHdpdGhpbiBhIHRpZ2h0ZXIgcmFuZ2UgdGhhbiBHRlBfRE1BLi4KKwkgKi8KKwlpZiAobWFzayA8IERNQV9CSVRfTUFTSygyNCkpCisJCXJldHVybiAwOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwbGF0X2V4dHJhX3N5bmNfZm9yX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJcmV0dXJuOworfQorCitzdGF0aWMgaW5saW5lIGludCBwbGF0X2RtYV9tYXBwaW5nX2Vycm9yKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkJIGRtYV9hZGRyX3QgZG1hX2FkZHIpCit7CisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbmxpbmUgaW50IHBsYXRfZGV2aWNlX2lzX2NvaGVyZW50KHN0cnVjdCBkZXZpY2UgKmRldikKIHsKICNpZmRlZiBDT05GSUdfRE1BX0NPSEVSRU5UCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1pcDI3L2RtYS1jb2hlcmVuY2UuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWlwMjcvZG1hLWNvaGVyZW5jZS5oCmluZGV4IGVkN2U2MjIuLjRjMjFiZmMgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWlwMjcvZG1hLWNvaGVyZW5jZS5oCisrKyBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWlwMjcvZG1hLWNvaGVyZW5jZS5oCkBAIC0zOCwxMCArMzgsMzQgQEAKIAlyZXR1cm4gZG1hX2FkZHIgJiB+KDB4ZmZVTCA8PCA1Nik7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBwbGF0X3VubWFwX2RtYV9tZW0oZG1hX2FkZHJfdCBkbWFfYWRkcikKK3N0YXRpYyBpbmxpbmUgdm9pZCBwbGF0X3VubWFwX2RtYV9tZW0oc3RydWN0IGRldmljZSAqZGV2LCBkbWFfYWRkcl90IGRtYV9hZGRyKQogewogfQogCitzdGF0aWMgaW5saW5lIGludCBwbGF0X2RtYV9zdXBwb3J0ZWQoc3RydWN0IGRldmljZSAqZGV2LCB1NjQgbWFzaykKK3sKKwkvKgorCSAqIHdlIGZhbGwgYmFjayB0byBHRlBfRE1BIHdoZW4gdGhlIG1hc2sgaXNuJ3QgYWxsIDFzLAorCSAqIHNvIHdlIGNhbid0IGd1YXJhbnRlZSBhbGxvY2F0aW9ucyB0aGF0IG11c3QgYmUKKwkgKiB3aXRoaW4gYSB0aWdodGVyIHJhbmdlIHRoYW4gR0ZQX0RNQS4uCisJICovCisJaWYgKG1hc2sgPCBETUFfQklUX01BU0soMjQpKQorCQlyZXR1cm4gMDsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcGxhdF9leHRyYV9zeW5jX2Zvcl9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2KQoreworCXJldHVybjsKK30KKworc3RhdGljIGlubGluZSBpbnQgcGxhdF9kbWFfbWFwcGluZ19lcnJvcihzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJCSBkbWFfYWRkcl90IGRtYV9hZGRyKQoreworCXJldHVybiAwOworfQorCiBzdGF0aWMgaW5saW5lIGludCBwbGF0X2RldmljZV9pc19jb2hlcmVudChzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJcmV0dXJuIDE7CQkvKiBJUDI3IG5vbi1jb2hlcm5ldCBtb2RlIGlzIHVuc3VwcG9ydGVkICovCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1pcDMyL2RtYS1jb2hlcmVuY2UuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWlwMzIvZG1hLWNvaGVyZW5jZS5oCmluZGV4IGE1NTExZWIuLjdhZTQwZjQgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWlwMzIvZG1hLWNvaGVyZW5jZS5oCisrKyBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWlwMzIvZG1hLWNvaGVyZW5jZS5oCkBAIC02MCwxMCArNjAsMzQgQEAKIAlyZXR1cm4gYWRkcjsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIHBsYXRfdW5tYXBfZG1hX21lbShkbWFfYWRkcl90IGRtYV9hZGRyKQorc3RhdGljIGlubGluZSB2b2lkIHBsYXRfdW5tYXBfZG1hX21lbShzdHJ1Y3QgZGV2aWNlICpkZXYsIGRtYV9hZGRyX3QgZG1hX2FkZHIpCiB7CiB9CiAKK3N0YXRpYyBpbmxpbmUgaW50IHBsYXRfZG1hX3N1cHBvcnRlZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHU2NCBtYXNrKQoreworCS8qCisJICogd2UgZmFsbCBiYWNrIHRvIEdGUF9ETUEgd2hlbiB0aGUgbWFzayBpc24ndCBhbGwgMXMsCisJICogc28gd2UgY2FuJ3QgZ3VhcmFudGVlIGFsbG9jYXRpb25zIHRoYXQgbXVzdCBiZQorCSAqIHdpdGhpbiBhIHRpZ2h0ZXIgcmFuZ2UgdGhhbiBHRlBfRE1BLi4KKwkgKi8KKwlpZiAobWFzayA8IERNQV9CSVRfTUFTSygyNCkpCisJCXJldHVybiAwOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwbGF0X2V4dHJhX3N5bmNfZm9yX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJcmV0dXJuOworfQorCitzdGF0aWMgaW5saW5lIGludCBwbGF0X2RtYV9tYXBwaW5nX2Vycm9yKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkJIGRtYV9hZGRyX3QgZG1hX2FkZHIpCit7CisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbmxpbmUgaW50IHBsYXRfZGV2aWNlX2lzX2NvaGVyZW50KHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlyZXR1cm4gMDsJCS8qIElQMzIgaXMgbm9uLWNvaGVybmV0ICovCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1qYXp6L2RtYS1jb2hlcmVuY2UuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWphenovZG1hLWNvaGVyZW5jZS5oCmluZGV4IGQ2Njk3OWEuLjFjN2NkMjcgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWphenovZG1hLWNvaGVyZW5jZS5oCisrKyBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWphenovZG1hLWNvaGVyZW5jZS5oCkBAIC0yNywxMSArMjcsMzUgQEAKIAlyZXR1cm4gdmRtYV9sb2cycGh5cyhkbWFfYWRkcik7CiB9CiAKLXN0YXRpYyB2b2lkIHBsYXRfdW5tYXBfZG1hX21lbShkbWFfYWRkcl90IGRtYV9hZGRyKQorc3RhdGljIHZvaWQgcGxhdF91bm1hcF9kbWFfbWVtKHN0cnVjdCBkZXZpY2UgKmRldiwgZG1hX2FkZHJfdCBkbWFfYWRkcikKIHsKIAl2ZG1hX2ZyZWUoZG1hX2FkZHIpOwogfQogCitzdGF0aWMgaW5saW5lIGludCBwbGF0X2RtYV9zdXBwb3J0ZWQoc3RydWN0IGRldmljZSAqZGV2LCB1NjQgbWFzaykKK3sKKwkvKgorCSAqIHdlIGZhbGwgYmFjayB0byBHRlBfRE1BIHdoZW4gdGhlIG1hc2sgaXNuJ3QgYWxsIDFzLAorCSAqIHNvIHdlIGNhbid0IGd1YXJhbnRlZSBhbGxvY2F0aW9ucyB0aGF0IG11c3QgYmUKKwkgKiB3aXRoaW4gYSB0aWdodGVyIHJhbmdlIHRoYW4gR0ZQX0RNQS4uCisJICovCisJaWYgKG1hc2sgPCBETUFfQklUX01BU0soMjQpKQorCQlyZXR1cm4gMDsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcGxhdF9leHRyYV9zeW5jX2Zvcl9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2KQoreworCXJldHVybjsKK30KKworc3RhdGljIGlubGluZSBpbnQgcGxhdF9kbWFfbWFwcGluZ19lcnJvcihzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJCSBkbWFfYWRkcl90IGRtYV9hZGRyKQoreworCXJldHVybiAwOworfQorCiBzdGF0aWMgaW5saW5lIGludCBwbGF0X2RldmljZV9pc19jb2hlcmVudChzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1sZW1vdGUvZG1hLWNvaGVyZW5jZS5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtbGVtb3RlL2RtYS1jb2hlcmVuY2UuaAppbmRleCA3ZTkxNDc3Li4zOGZhZDdkIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1sZW1vdGUvZG1hLWNvaGVyZW5jZS5oCisrKyBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWxlbW90ZS9kbWEtY29oZXJlbmNlLmgKQEAgLTMwLDEwICszMCwzNCBAQAogCXJldHVybiBkbWFfYWRkciAmIDB4N2ZmZmZmZmY7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBwbGF0X3VubWFwX2RtYV9tZW0oZG1hX2FkZHJfdCBkbWFfYWRkcikKK3N0YXRpYyBpbmxpbmUgdm9pZCBwbGF0X3VubWFwX2RtYV9tZW0oc3RydWN0IGRldmljZSAqZGV2LCBkbWFfYWRkcl90IGRtYV9hZGRyKQogewogfQogCitzdGF0aWMgaW5saW5lIGludCBwbGF0X2RtYV9zdXBwb3J0ZWQoc3RydWN0IGRldmljZSAqZGV2LCB1NjQgbWFzaykKK3sKKwkvKgorCSAqIHdlIGZhbGwgYmFjayB0byBHRlBfRE1BIHdoZW4gdGhlIG1hc2sgaXNuJ3QgYWxsIDFzLAorCSAqIHNvIHdlIGNhbid0IGd1YXJhbnRlZSBhbGxvY2F0aW9ucyB0aGF0IG11c3QgYmUKKwkgKiB3aXRoaW4gYSB0aWdodGVyIHJhbmdlIHRoYW4gR0ZQX0RNQS4uCisJICovCisJaWYgKG1hc2sgPCBETUFfQklUX01BU0soMjQpKQorCQlyZXR1cm4gMDsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcGxhdF9leHRyYV9zeW5jX2Zvcl9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2KQoreworCXJldHVybjsKK30KKworc3RhdGljIGlubGluZSBpbnQgcGxhdF9kbWFfbWFwcGluZ19lcnJvcihzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJCSBkbWFfYWRkcl90IGRtYV9hZGRyKQoreworCXJldHVybiAwOworfQorCiBzdGF0aWMgaW5saW5lIGludCBwbGF0X2RldmljZV9pc19jb2hlcmVudChzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWlwc3JlZ3MuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9taXBzcmVncy5oCmluZGV4IDkzMTYzMjQuLjA0MTc1MTYgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9taXBzcmVncy5oCisrKyBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9taXBzcmVncy5oCkBAIC0xMDAwLDYgKzEwMDAsMjYgQEAKICNkZWZpbmUgcmVhZF9jMF9lYmFzZSgpCQlfX3JlYWRfMzJiaXRfYzBfcmVnaXN0ZXIoJDE1LCAxKQogI2RlZmluZSB3cml0ZV9jMF9lYmFzZSh2YWwpCV9fd3JpdGVfMzJiaXRfYzBfcmVnaXN0ZXIoJDE1LCAxLCB2YWwpCiAKKworLyogQ2F2aXVtIE9DVEVPTiAoY25NSVBTKSAqLworI2RlZmluZSByZWFkX2MwX2N2bWNvdW50KCkJX19yZWFkX3Vsb25nX2MwX3JlZ2lzdGVyKCQ5LCA2KQorI2RlZmluZSB3cml0ZV9jMF9jdm1jb3VudCh2YWwpCV9fd3JpdGVfdWxvbmdfYzBfcmVnaXN0ZXIoJDksIDYsIHZhbCkKKworI2RlZmluZSByZWFkX2MwX2N2bWN0bCgpCV9fcmVhZF82NGJpdF9jMF9yZWdpc3RlcigkOSwgNykKKyNkZWZpbmUgd3JpdGVfYzBfY3ZtY3RsKHZhbCkJX193cml0ZV82NGJpdF9jMF9yZWdpc3RlcigkOSwgNywgdmFsKQorCisjZGVmaW5lIHJlYWRfYzBfY3ZtbWVtY3RsKCkJX19yZWFkXzY0Yml0X2MwX3JlZ2lzdGVyKCQxMSwgNykKKyNkZWZpbmUgd3JpdGVfYzBfY3ZtbWVtY3RsKHZhbCkJX193cml0ZV82NGJpdF9jMF9yZWdpc3RlcigkMTEsIDcsIHZhbCkKKy8qCisgKiBUaGUgY2FjaGVlcnIgcmVnaXN0ZXJzIGFyZSBub3Qgc3RhbmRhcmRpemVkLiAgT24gT0NURU9OLCB0aGV5IGFyZQorICogNjQgYml0cyB3aWRlLgorICovCisjZGVmaW5lIHJlYWRfb2N0ZW9uX2MwX2ljYWNoZWVycigpCV9fcmVhZF82NGJpdF9jMF9yZWdpc3RlcigkMjcsIDApCisjZGVmaW5lIHdyaXRlX29jdGVvbl9jMF9pY2FjaGVlcnIodmFsKQlfX3dyaXRlXzY0Yml0X2MwX3JlZ2lzdGVyKCQyNywgMCwgdmFsKQorCisjZGVmaW5lIHJlYWRfb2N0ZW9uX2MwX2RjYWNoZWVycigpCV9fcmVhZF82NGJpdF9jMF9yZWdpc3RlcigkMjcsIDEpCisjZGVmaW5lIHdyaXRlX29jdGVvbl9jMF9kY2FjaGVlcnIodmFsKQlfX3dyaXRlXzY0Yml0X2MwX3JlZ2lzdGVyKCQyNywgMSwgdmFsKQorCiAvKgogICogTWFjcm9zIHRvIGFjY2VzcyB0aGUgZmxvYXRpbmcgcG9pbnQgY29wcm9jZXNzb3IgY29udHJvbCByZWdpc3RlcnMKICAqLwpAQCAtMTAwOCw2ICsxMDI4LDggQEAKIAlfX2FzbV9fIF9fdm9sYXRpbGVfXyggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKIAkiLnNldFx0cHVzaFxuXHQiCQkJCQlcCiAJIi5zZXRcdHJlb3JkZXJcblx0IgkJCQkJXAorCS8qIGdhcyBmYWlscyB0byBhc3NlbWJsZSBjZmMxIGZvciBzb21lIGFyY2hzIChvY3Rlb24pLiovIFwKKwkiLnNldFx0bWlwczFcblx0IgkJCQkJXAogICAgICAgICAiY2ZjMVx0JTAsIlNUUihzb3VyY2UpIlxuXHQiICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKIAkiLnNldFx0cG9wIgkJCQkJCVwKICAgICAgICAgOiAiPXIiIChfX3JlcykpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbW9kdWxlLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbW9kdWxlLmgKaW5kZXggZTJlMDliMi4uZDk0MDg1YSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21vZHVsZS5oCisrKyBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tb2R1bGUuaApAQCAtMTE2LDYgKzExNiw4IEBACiAjZGVmaW5lIE1PRFVMRV9QUk9DX0ZBTUlMWSAiU0IxICIKICNlbGlmIGRlZmluZWQgQ09ORklHX0NQVV9MT09OR1NPTjIKICNkZWZpbmUgTU9EVUxFX1BST0NfRkFNSUxZICJMT09OR1NPTjIgIgorI2VsaWYgZGVmaW5lZCBDT05GSUdfQ1BVX0NBVklVTV9PQ1RFT04KKyNkZWZpbmUgTU9EVUxFX1BST0NfRkFNSUxZICJPQ1RFT04gIgogI2Vsc2UKICNlcnJvciBNT0RVTEVfUFJPQ19GQU1JTFkgdW5kZWZpbmVkIGZvciB5b3VyIHByb2Nlc3NvciBjb25maWd1cmF0aW9uCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9vY3Rlb24vY3ZteC1hc20uaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9vY3Rlb24vY3ZteC1hc20uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjFkM2ZjCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL29jdGVvbi9jdm14LWFzbS5oCkBAIC0wLDAgKzEsMTI4IEBACisvKioqKioqKioqKioqKioqKioqKioqKipsaWNlbnNlIHN0YXJ0KioqKioqKioqKioqKioqCisgKiBBdXRob3I6IENhdml1bSBOZXR3b3JrcworICoKKyAqIENvbnRhY3Q6IHN1cHBvcnRAY2F2aXVtbmV0d29ya3MuY29tCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgT0NURU9OIFNESworICoKKyAqIENvcHlyaWdodCAoYykgMjAwMy0yMDA4IENhdml1bSBOZXR3b3JrcworICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBWZXJzaW9uIDIsIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBBUy1JUyBhbmQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eQorICogb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBUSVRMRSwgb3IKKyAqIE5PTklORlJJTkdFTUVOVC4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUKKyAqIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBmaWxlOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqIG9yIHZpc2l0IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uCisgKgorICogVGhpcyBmaWxlIG1heSBhbHNvIGJlIGF2YWlsYWJsZSB1bmRlciBhIGRpZmZlcmVudCBsaWNlbnNlIGZyb20gQ2F2aXVtLgorICogQ29udGFjdCBDYXZpdW0gTmV0d29ya3MgZm9yIG1vcmUgaW5mb3JtYXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKmxpY2Vuc2UgZW5kKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKgorICogVGhpcyBpcyBmaWxlIGRlZmluZXMgQVNNIHByaW1pdGl2ZXMgZm9yIHRoZSBleGVjdXRpdmUuCisgKi8KKyNpZm5kZWYgX19DVk1YX0FTTV9IX18KKyNkZWZpbmUgX19DVk1YX0FTTV9IX18KKworI2luY2x1ZGUgIm9jdGVvbi1tb2RlbC5oIgorCisvKiBvdGhlciB1c2VmdWwgc3R1ZmYgKi8KKyNkZWZpbmUgQ1ZNWF9TWU5DIGFzbSB2b2xhdGlsZSAoInN5bmMiIDogOiA6ICJtZW1vcnkiKQorLyogU3RyaW5nIHZlcnNpb24gb2YgU1lOQ1cgbWFjcm8gZm9yIHVzaW5nIGluIGlubGluZSBhc20gY29uc3RydWN0cyAqLworI2RlZmluZSBDVk1YX1NZTkNXX1NUUiAic3luY3dcbnN5bmN3XG4iCisjaWZkZWYgX19PQ1RFT05fXworCisvKiBEZXByZWNhdGVkLCB3aWxsIGJlIHJlbW92ZWQgaW4gZnV0dXJlIHJlbGVhc2UgKi8KKyNkZWZpbmUgQ1ZNWF9TWU5DSU8gYXNtIHZvbGF0aWxlICgibm9wIikKKworI2RlZmluZSBDVk1YX1NZTkNJT0JETUEgYXNtIHZvbGF0aWxlICgic3luY2lvYmRtYSIgOiA6IDogIm1lbW9yeSIpCisKKy8qIERlcHJlY2F0ZWQsIHdpbGwgYmUgcmVtb3ZlZCBpbiBmdXR1cmUgcmVsZWFzZSAqLworI2RlZmluZSBDVk1YX1NZTkNJT0FMTCBhc20gdm9sYXRpbGUgKCJub3AiKQorCisvKgorICogV2UgYWN0dWFsbHkgdXNlIHR3byBzeW5jdyBpbnN0cnVjdGlvbnMgaW4gYSByb3cgd2hlbiB3ZSBuZWVkIGEgd3JpdGUKKyAqIG1lbW9yeSBiYXJyaWVyLiBUaGlzIGlzIGJlY2F1c2UgdGhlIENOM1hYWCBzZXJpZXMgb2YgT2N0ZW9ucyBoYXZlCisgKiBlcnJhdGEgQ29yZS00MDEuIFRoaXMgY2FuIGNhdXNlIGEgc2luZ2xlIHN5bmN3IHRvIG5vdCBlbmZvcmNlCisgKiBvcmRlcmluZyB1bmRlciB2ZXJ5IHJhcmUgY29uZGl0aW9ucy4gRXZlbiBpZiBpdCBpcyByYXJlLCBiZXR0ZXIgc2FmZQorICogdGhhbiBzb3JyeS4KKyAqLworI2RlZmluZSBDVk1YX1NZTkNXIGFzbSB2b2xhdGlsZSAoInN5bmN3XG5cdHN5bmN3IiA6IDogOiAibWVtb3J5IikKKworLyoKKyAqIERlZmluZSBuZXcgc3luYyBpbnN0cnVjdGlvbnMgdG8gYmUgbm9ybWFsIFNZTkMgaW5zdHJ1Y3Rpb25zIGZvcgorICogb3BlcmF0aW5nIHN5c3RlbXMgdGhhdCB1c2UgdGhyZWFkcy4KKyAqLworI2RlZmluZSBDVk1YX1NZTkNXUyBDVk1YX1NZTkNXCisjZGVmaW5lIENWTVhfU1lOQ1MgIENWTVhfU1lOQworI2RlZmluZSBDVk1YX1NZTkNXU19TVFIgQ1ZNWF9TWU5DV19TVFIKKyNlbHNlCisvKgorICogTm90IHVzaW5nIGEgQ2F2aXVtIGNvbXBpbGVyLCBhbHdheXMgdXNlIHRoZSBzbG93ZXIgc3luYyBzbyB0aGUKKyAqIGFzc2VtYmxlciBzdGF5cyBoYXBweS4KKyAqLworLyogRGVwcmVjYXRlZCwgd2lsbCBiZSByZW1vdmVkIGluIGZ1dHVyZSByZWxlYXNlICovCisjZGVmaW5lIENWTVhfU1lOQ0lPIGFzbSB2b2xhdGlsZSAoIm5vcCIpCisKKyNkZWZpbmUgQ1ZNWF9TWU5DSU9CRE1BIGFzbSB2b2xhdGlsZSAoInN5bmMiIDogOiA6ICJtZW1vcnkiKQorCisvKiBEZXByZWNhdGVkLCB3aWxsIGJlIHJlbW92ZWQgaW4gZnV0dXJlIHJlbGVhc2UgKi8KKyNkZWZpbmUgQ1ZNWF9TWU5DSU9BTEwgYXNtIHZvbGF0aWxlICgibm9wIikKKworI2RlZmluZSBDVk1YX1NZTkNXIGFzbSB2b2xhdGlsZSAoInN5bmMiIDogOiA6ICJtZW1vcnkiKQorI2RlZmluZSBDVk1YX1NZTkNXUyBDVk1YX1NZTkNXCisjZGVmaW5lIENWTVhfU1lOQ1MgIENWTVhfU1lOQworI2RlZmluZSBDVk1YX1NZTkNXU19TVFIgQ1ZNWF9TWU5DV19TVFIKKyNlbmRpZgorCisvKgorICogQ1ZNWF9QUkVQQVJFX0ZPUl9TVE9SRSBtYWtlcyBlYWNoIGJ5dGUgb2YgdGhlIGJsb2NrIHVucHJlZGljdGFibGUKKyAqIChhY3R1YWxseSBvbGQgdmFsdWUgb3IgemVybykgdW50aWwgdGhhdCBieXRlIGlzIHN0b3JlZCB0byAoYnkgdGhpcyBvcgorICogYW5vdGhlciBwcm9jZXNzb3IuIE5vdGUgdGhhdCB0aGUgdmFsdWUgb2YgZWFjaCBieXRlIGlzIG5vdCBvbmx5CisgKiB1bnByZWRpY3RhYmxlLCBidXQgbWF5IGFsc28gY2hhbmdlIGFnYWluIC0gdXAgdW50aWwgdGhlIHBvaW50IHdoZW4gb25lCisgKiBvZiB0aGUgY29yZXMgc3RvcmVzIHRvIHRoZSBieXRlLgorICovCisjZGVmaW5lIENWTVhfUFJFUEFSRV9GT1JfU1RPUkUoYWRkcmVzcywgb2Zmc2V0KSBcCisJYXNtIHZvbGF0aWxlICgicHJlZiAzMCwgIiBDVk1YX1RNUF9TVFIob2Zmc2V0KSAiKCVbcmJhc2VdKSIgOiA6IFwKKwlbcmJhc2VdICJkIiAoYWRkcmVzcykpCisvKgorICogVGhpcyBpcyBhIGNvbW1hbmQgaGVhZGVkIHRvIHRoZSBMMiBjb250cm9sbGVyIHRvIHRlbGwgaXQgdG8gY2xlYXIKKyAqIGl0cyBkaXJ0eSBiaXQgZm9yIGEgYmxvY2suIEJhc2ljYWxseSwgU1cgaXMgdGVsbGluZyBIVyB0aGF0IHRoZQorICogY3VycmVudCB2ZXJzaW9uIG9mIHRoZSBibG9jayB3aWxsIG5vdCBiZSB1c2VkLgorICovCisjZGVmaW5lIENWTVhfRE9OVF9XUklURV9CQUNLKGFkZHJlc3MsIG9mZnNldCkgXAorCWFzbSB2b2xhdGlsZSAoInByZWYgMjksICIgQ1ZNWF9UTVBfU1RSKG9mZnNldCkgIiglW3JiYXNlXSkiIDogOiBcCisJW3JiYXNlXSAiZCIgKGFkZHJlc3MpKQorCisvKiBmbHVzaCBzdG9yZXMsIGludmFsaWRhdGUgZW50aXJlIGljYWNoZSAqLworI2RlZmluZSBDVk1YX0lDQUNIRV9JTlZBTElEQVRFIFwKKwl7IENWTVhfU1lOQzsgYXNtIHZvbGF0aWxlICgic3luY2kgMCgkMCkiIDogOiApOyB9CisKKy8qIGZsdXNoIHN0b3JlcywgaW52YWxpZGF0ZSBlbnRpcmUgaWNhY2hlICovCisjZGVmaW5lIENWTVhfSUNBQ0hFX0lOVkFMSURBVEUyIFwKKwl7IENWTVhfU1lOQzsgYXNtIHZvbGF0aWxlICgiY2FjaGUgMCwgMCgkMCkiIDogOiApOyB9CisKKy8qIGNvbXBsZXRlIHByZWZldGNoZXMsIGludmFsaWRhdGUgZW50aXJlIGRjYWNoZSAqLworI2RlZmluZSBDVk1YX0RDQUNIRV9JTlZBTElEQVRFIFwKKwl7IENWTVhfU1lOQzsgYXNtIHZvbGF0aWxlICgiY2FjaGUgOSwgMCgkMCkiIDogOiApOyB9CisKKworI2RlZmluZSBDVk1YX1BPUChyZXN1bHQsIGlucHV0KSBcCisJYXNtICgicG9wICVbcmRdLCVbcnNdIiA6IFtyZF0gIj1kIiAocmVzdWx0KSA6IFtyc10gImQiIChpbnB1dCkpCisjZGVmaW5lIENWTVhfRFBPUChyZXN1bHQsIGlucHV0KSBcCisJYXNtICgiZHBvcCAlW3JkXSwlW3JzXSIgOiBbcmRdICI9ZCIgKHJlc3VsdCkgOiBbcnNdICJkIiAoaW5wdXQpKQorCisvKiBzb21lIG5ldyBjb3AwLWxpa2Ugc3R1ZmYgKi8KKyNkZWZpbmUgQ1ZNWF9SREhXUihyZXN1bHQsIHJlZ3N0cikgXAorCWFzbSB2b2xhdGlsZSAoInJkaHdyICVbcnRdLCQiIENWTVhfVE1QX1NUUihyZWdzdHIpIDogW3J0XSAiPWQiIChyZXN1bHQpKQorI2RlZmluZSBDVk1YX1JESFdSTlYocmVzdWx0LCByZWdzdHIpIFwKKwlhc20gKCJyZGh3ciAlW3J0XSwkIiBDVk1YX1RNUF9TVFIocmVnc3RyKSA6IFtydF0gIj1kIiAocmVzdWx0KSkKKyNlbmRpZiAvKiBfX0NWTVhfQVNNX0hfXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL29jdGVvbi9jdm14LWJvb3RpbmZvLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vb2N0ZW9uL2N2bXgtYm9vdGluZm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTI5ODlhCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL29jdGVvbi9jdm14LWJvb3RpbmZvLmgKQEAgLTAsMCArMSwyNjIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKmxpY2Vuc2Ugc3RhcnQqKioqKioqKioqKioqKioKKyAqIEF1dGhvcjogQ2F2aXVtIE5ldHdvcmtzCisgKgorICogQ29udGFjdDogc3VwcG9ydEBjYXZpdW1uZXR3b3Jrcy5jb20KKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBPQ1RFT04gU0RLCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMDggQ2F2aXVtIE5ldHdvcmtzCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIFZlcnNpb24gMiwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIEFTLUlTIGFuZCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5CisgKiBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIFRJVExFLCBvcgorICogTk9OSU5GUklOR0VNRU5ULiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZQorICogZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIGZpbGU7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICogb3IgdmlzaXQgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4KKyAqCisgKiBUaGlzIGZpbGUgbWF5IGFsc28gYmUgYXZhaWxhYmxlIHVuZGVyIGEgZGlmZmVyZW50IGxpY2Vuc2UgZnJvbSBDYXZpdW0uCisgKiBDb250YWN0IENhdml1bSBOZXR3b3JrcyBmb3IgbW9yZSBpbmZvcm1hdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqbGljZW5zZSBlbmQqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIEhlYWRlciBmaWxlIGNvbnRhaW5pbmcgdGhlIEFCSSB3aXRoIHRoZSBib290bG9hZGVyLgorICovCisKKyNpZm5kZWYgX19DVk1YX0JPT1RJTkZPX0hfXworI2RlZmluZSBfX0NWTVhfQk9PVElORk9fSF9fCisKKy8qCisgKiBDdXJyZW50IG1ham9yIGFuZCBtaW5vciB2ZXJzaW9ucyBvZiB0aGUgQ1ZNWCBib290aW5mbyBibG9jayB0aGF0IGlzCisgKiBwYXNzZWQgZnJvbSB0aGUgYm9vdGxvYWRlciB0byB0aGUgYXBwbGljYXRpb24uICBUaGlzIGlzIHZlcnNpb25lZAorICogc28gdGhhdCBhcHBsaWNhdGlvbnMgY2FuIHByb3Blcmx5IGhhbmRsZSBtdWx0aXBsZSBib290bG9hZGVyCisgKiB2ZXJzaW9ucy4KKyAqLworI2RlZmluZSBDVk1YX0JPT1RJTkZPX01BSl9WRVIgMQorI2RlZmluZSBDVk1YX0JPT1RJTkZPX01JTl9WRVIgMgorCisjaWYgKENWTVhfQk9PVElORk9fTUFKX1ZFUiA9PSAxKQorI2RlZmluZSBDVk1YX0JPT1RJTkZPX09DVEVPTl9TRVJJQUxfTEVOIDIwCisvKgorICogVGhpcyBzdHJ1Y3R1cmUgaXMgcG9wdWxhdGVkIGJ5IHRoZSBib290bG9hZGVyLiAgRm9yIGJpbmFyeQorICogY29tcGF0aWJpbGl0eSB0aGUgb25seSBjaGFuZ2VzIHRoYXQgc2hvdWxkIGJlIG1hZGUgYXJlCisgKiBhZGRpbmcgbWVtYmVycyB0byB0aGUgZW5kIG9mIHRoZSBzdHJ1Y3R1cmUsIGFuZCB0aGUgbWlub3IKKyAqIHZlcnNpb24gc2hvdWxkIGJlIGluY3JlbWVudGVkIGF0IHRoYXQgdGltZS4KKyAqIElmIGFuIGluY29tcGF0aWJsZSBjaGFuZ2UgaXMgbWFkZSwgdGhlIG1ham9yIHZlcnNpb24KKyAqIG11c3QgYmUgaW5jcmVtZW50ZWQsIGFuZCB0aGUgbWlub3IgdmVyc2lvbiBzaG91bGQgYmUgcmVzZXQKKyAqIHRvIDAuCisgKi8KK3N0cnVjdCBjdm14X2Jvb3RpbmZvIHsKKwl1aW50MzJfdCBtYWpvcl92ZXJzaW9uOworCXVpbnQzMl90IG1pbm9yX3ZlcnNpb247CisKKwl1aW50NjRfdCBzdGFja190b3A7CisJdWludDY0X3QgaGVhcF9iYXNlOworCXVpbnQ2NF90IGhlYXBfZW5kOworCXVpbnQ2NF90IGRlc2NfdmFkZHI7CisKKwl1aW50MzJfdCBleGNlcHRpb25fYmFzZV9hZGRyOworCXVpbnQzMl90IHN0YWNrX3NpemU7CisJdWludDMyX3QgZmxhZ3M7CisJdWludDMyX3QgY29yZV9tYXNrOworCS8qIERSQU0gc2l6ZSBpbiBtZWdhYnl0ZXMgKi8KKwl1aW50MzJfdCBkcmFtX3NpemU7CisJLyogcGh5c2ljYWwgYWRkcmVzcyBvZiBmcmVlIG1lbW9yeSBkZXNjcmlwdG9yIGJsb2NrKi8KKwl1aW50MzJfdCBwaHlfbWVtX2Rlc2NfYWRkcjsKKwkvKiB1c2VkIHRvIHBhc3MgZmxhZ3MgZnJvbSBhcHAgdG8gZGVidWdnZXIgKi8KKwl1aW50MzJfdCBkZWJ1Z2dlcl9mbGFnc19iYXNlX2FkZHI7CisKKwkvKiBDUFUgY2xvY2sgc3BlZWQsIGluIGh6ICovCisJdWludDMyX3QgZWNsb2NrX2h6OworCisJLyogRFJBTSBjbG9jayBzcGVlZCwgaW4gaHogKi8KKwl1aW50MzJfdCBkY2xvY2tfaHo7CisKKwl1aW50MzJfdCByZXNlcnZlZDA7CisJdWludDE2X3QgYm9hcmRfdHlwZTsKKwl1aW50OF90IGJvYXJkX3Jldl9tYWpvcjsKKwl1aW50OF90IGJvYXJkX3Jldl9taW5vcjsKKwl1aW50MTZfdCByZXNlcnZlZDE7CisJdWludDhfdCByZXNlcnZlZDI7CisJdWludDhfdCByZXNlcnZlZDM7CisJY2hhciBib2FyZF9zZXJpYWxfbnVtYmVyW0NWTVhfQk9PVElORk9fT0NURU9OX1NFUklBTF9MRU5dOworCXVpbnQ4X3QgbWFjX2FkZHJfYmFzZVs2XTsKKwl1aW50OF90IG1hY19hZGRyX2NvdW50OworI2lmIChDVk1YX0JPT1RJTkZPX01JTl9WRVIgPj0gMSkKKwkvKgorCSAqIFNldmVyYWwgYm9hcmRzIHN1cHBvcnQgY29tcGFjdCBmbGFzaCBvbiB0aGUgT2N0ZW9uIGJvb3QKKwkgKiBidXMuICBUaGUgQ0YgbWVtb3J5IHNwYWNlcyBtYXkgYmUgbWFwcGVkIHRvIGRpZmZlcmVudAorCSAqIGFkZHJlc3NlcyBvbiBkaWZmZXJlbnQgYm9hcmRzLiAgVGhlc2UgYXJlIHRoZSBwaHlzaWNhbAorCSAqIGFkZHJlc3Nlcywgc28gY2FyZSBtdXN0IGJlIHRha2VuIHRvIHVzZSB0aGUgY29ycmVjdAorCSAqIFhLUEhZUy9LU0VHMCBhZGRyZXNzaW5nIGRlcGVuZGluZyBvbiB0aGUgYXBwbGljYXRpb24ncworCSAqIEFCSS4gIFRoZXNlIHZhbHVlcyB3aWxsIGJlIDAgaWYgQ0YgaXMgbm90IHByZXNlbnQuCisJICovCisJdWludDY0X3QgY29tcGFjdF9mbGFzaF9jb21tb25fYmFzZV9hZGRyOworCXVpbnQ2NF90IGNvbXBhY3RfZmxhc2hfYXR0cmlidXRlX2Jhc2VfYWRkcjsKKwkvKgorCSAqIEJhc2UgYWRkcmVzcyBvZiB0aGUgTEVEIGRpc3BsYXkgKGFzIG9uIEVCVDMwMDAgYm9hcmQpCisJICogVGhpcyB3aWxsIGJlIDAgaWYgTEVEIGRpc3BsYXkgbm90IHByZXNlbnQuCisJICovCisJdWludDY0X3QgbGVkX2Rpc3BsYXlfYmFzZV9hZGRyOworI2VuZGlmCisjaWYgKENWTVhfQk9PVElORk9fTUlOX1ZFUiA+PSAyKQorCS8qIERGQSByZWZlcmVuY2UgY2xvY2sgaW4gaHogKGlmIGFwcGxpY2FibGUpKi8KKwl1aW50MzJfdCBkZmFfcmVmX2Nsb2NrX2h6OworCisJLyoKKwkgKiBmbGFncyBpbmRpY2F0aW5nIHZhcmlvdXMgY29uZmlndXJhdGlvbiBvcHRpb25zLiAgVGhlc2UKKwkgKiBmbGFncyBzdXBlcmNlZGUgdGhlICdmbGFncycgdmFyaWFibGUgYW5kIHNob3VsZCBiZSB1c2VkCisJICogaW5zdGVhZCBpZiBhdmFpbGFibGUuCisJICovCisJdWludDMyX3QgY29uZmlnX2ZsYWdzOworI2VuZGlmCisKK307CisKKyNkZWZpbmUgQ1ZNWF9CT09USU5GT19DRkdfRkxBR19QQ0lfSE9TVAkJCSgxdWxsIDw8IDApCisjZGVmaW5lIENWTVhfQk9PVElORk9fQ0ZHX0ZMQUdfUENJX1RBUkdFVAkJKDF1bGwgPDwgMSkKKyNkZWZpbmUgQ1ZNWF9CT09USU5GT19DRkdfRkxBR19ERUJVRwkJCSgxdWxsIDw8IDIpCisjZGVmaW5lIENWTVhfQk9PVElORk9fQ0ZHX0ZMQUdfTk9fTUFHSUMJCQkoMXVsbCA8PCAzKQorLyogVGhpcyBmbGFnIGlzIHNldCBpZiB0aGUgVExCIG1hcHBpbmdzIGFyZSBub3QgY29udGFpbmVkIGluIHRoZQorICogMHgxMDAwMDAwMCAtIDB4MjAwMDAwMDAgYm9vdCBidXMgcmVnaW9uLiAqLworI2RlZmluZSBDVk1YX0JPT1RJTkZPX0NGR19GTEFHX09WRVJTSVpFX1RMQl9NQVBQSU5HICAgICAoMXVsbCA8PCA0KQorI2RlZmluZSBDVk1YX0JPT1RJTkZPX0NGR19GTEFHX0JSRUFLCQkJKDF1bGwgPDwgNSkKKworI2VuZGlmIC8qICAgKENWTVhfQk9PVElORk9fTUFKX1ZFUiA9PSAxKSAqLworCisvKiBUeXBlIGRlZmluZXMgZm9yIGJvYXJkIGFuZCBjaGlwIHR5cGVzICovCitlbnVtIGN2bXhfYm9hcmRfdHlwZXNfZW51bSB7CisJQ1ZNWF9CT0FSRF9UWVBFX05VTEwgPSAwLAorCUNWTVhfQk9BUkRfVFlQRV9TSU0gPSAxLAorCUNWTVhfQk9BUkRfVFlQRV9FQlQzMDAwID0gMiwKKwlDVk1YX0JPQVJEX1RZUEVfS09EQU1BID0gMywKKwlDVk1YX0JPQVJEX1RZUEVfTklBR0FSQSA9IDQsCisJQ1ZNWF9CT0FSRF9UWVBFX05BQzM4ID0gNSwJLyogZm9ybWVybHkgTkFPMzggKi8KKwlDVk1YX0JPQVJEX1RZUEVfVEhVTkRFUiA9IDYsCisJQ1ZNWF9CT0FSRF9UWVBFX1RSQU5UT1IgPSA3LAorCUNWTVhfQk9BUkRfVFlQRV9FQkgzMDAwID0gOCwKKwlDVk1YX0JPQVJEX1RZUEVfRUJIMzEwMCA9IDksCisJQ1ZNWF9CT0FSRF9UWVBFX0hJS0FSSSA9IDEwLAorCUNWTVhfQk9BUkRfVFlQRV9DTjMwMTBfRVZCX0hTNSA9IDExLAorCUNWTVhfQk9BUkRfVFlQRV9DTjMwMDVfRVZCX0hTNSA9IDEyLAorCUNWTVhfQk9BUkRfVFlQRV9LQlAgPSAxMywKKwkvKiBEZXByZWNhdGVkLCBDVk1YX0JPQVJEX1RZUEVfQ04zMDEwX0VWQl9IUzUgc3VwcG9ydHMgdGhlIENOMzAyMCAqLworCUNWTVhfQk9BUkRfVFlQRV9DTjMwMjBfRVZCX0hTNSA9IDE0LAorCUNWTVhfQk9BUkRfVFlQRV9FQlQ1ODAwID0gMTUsCisJQ1ZNWF9CT0FSRF9UWVBFX05JQ1BSTzIgPSAxNiwKKwlDVk1YX0JPQVJEX1RZUEVfRUJINTYwMCA9IDE3LAorCUNWTVhfQk9BUkRfVFlQRV9FQkg1NjAxID0gMTgsCisJQ1ZNWF9CT0FSRF9UWVBFX0VCSDUyMDAgPSAxOSwKKwlDVk1YX0JPQVJEX1RZUEVfQkJHV19SRUYgPSAyMCwKKwlDVk1YX0JPQVJEX1RZUEVfTklDX1hMRV80RyA9IDIxLAorCUNWTVhfQk9BUkRfVFlQRV9FQlQ1NjAwID0gMjIsCisJQ1ZNWF9CT0FSRF9UWVBFX0VCSDUyMDEgPSAyMywKKwlDVk1YX0JPQVJEX1RZUEVfTUFYLAorCisJLyoKKwkgKiBUaGUgcmFuZ2UgZnJvbSBDVk1YX0JPQVJEX1RZUEVfTUFYIHRvCisJICogQ1ZNWF9CT0FSRF9UWVBFX0NVU1RfREVGSU5FRF9NSU4gaXMgcmVzZXJ2ZWQgZm9yIGZ1dHVyZQorCSAqIFNESyB1c2UuCisJICovCisKKwkvKgorCSAqIFNldCBhc2lkZSBhIHJhbmdlIGZvciBjdXN0b21lciBib2FyZHMuICBUaGVzZSBudW1iZXJzIGFyZSBtYW5hZ2VkCisJICogYnkgQ2F2aXVtLgorCSAqLworCUNWTVhfQk9BUkRfVFlQRV9DVVNUX0RFRklORURfTUlOID0gMTAwMDAsCisJQ1ZNWF9CT0FSRF9UWVBFX0NVU1RfV1NYMTYgPSAxMDAwMSwKKwlDVk1YX0JPQVJEX1RZUEVfQ1VTVF9OUzAyMTYgPSAxMDAwMiwKKwlDVk1YX0JPQVJEX1RZUEVfQ1VTVF9OQjUgPSAxMDAwMywKKwlDVk1YX0JPQVJEX1RZUEVfQ1VTVF9XTVI1MDAgPSAxMDAwNCwKKwlDVk1YX0JPQVJEX1RZUEVfQ1VTVF9ERUZJTkVEX01BWCA9IDIwMDAwLAorCisJLyoKKwkgKiBTZXQgYXNpZGUgYSByYW5nZSBmb3IgY3VzdG9tZXIgcHJpdmF0ZSB1c2UuICBUaGUgU0RLIHdvbid0CisJICogdXNlIGFueSBudW1iZXJzIGluIHRoaXMgcmFuZ2UuCisJICovCisJQ1ZNWF9CT0FSRF9UWVBFX0NVU1RfUFJJVkFURV9NSU4gPSAyMDAwMSwKKwlDVk1YX0JPQVJEX1RZUEVfQ1VTVF9QUklWQVRFX01BWCA9IDMwMDAwLAorCisJLyogVGhlIHJlbWFpbmluZyByYW5nZSBpcyByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZS4gKi8KK307CisKK2VudW0gY3ZteF9jaGlwX3R5cGVzX2VudW0geworCUNWTVhfQ0hJUF9UWVBFX05VTEwgPSAwLAorCUNWTVhfQ0hJUF9TSU1fVFlQRV9ERVBSRUNBVEVEID0gMSwKKwlDVk1YX0NISVBfVFlQRV9PQ1RFT05fU0FNUExFID0gMiwKKwlDVk1YX0NISVBfVFlQRV9NQVgsCit9OworCisvKiBDb21wYXRhYmlsaXR5IGFsaWFzIGZvciBOQUMzOCBuYW1lIGNoYW5nZSwgcGxhbm5lZCB0byBiZSByZW1vdmVkCisgKiBmcm9tIFNESyAxLjcgKi8KKyNkZWZpbmUgQ1ZNWF9CT0FSRF9UWVBFX05BTzM4CUNWTVhfQk9BUkRfVFlQRV9OQUMzOAorCisvKiBGdW5jdGlvbnMgdG8gcmV0dXJuIHN0cmluZyBiYXNlZCBvbiB0eXBlICovCisjZGVmaW5lIEVOVU1fQlJEX1RZUEVfQ0FTRSh4KSBcCisJY2FzZSB4OiByZXR1cm4oI3ggKyAxNik7CS8qIFNraXAgQ1ZNWF9CT0FSRF9UWVBFXyAqLworc3RhdGljIGlubGluZSBjb25zdCBjaGFyICpjdm14X2JvYXJkX3R5cGVfdG9fc3RyaW5nKGVudW0KKwkJCQkJCSAgICBjdm14X2JvYXJkX3R5cGVzX2VudW0gdHlwZSkKK3sKKwlzd2l0Y2ggKHR5cGUpIHsKKwkJRU5VTV9CUkRfVFlQRV9DQVNFKENWTVhfQk9BUkRfVFlQRV9OVUxMKQorCQlFTlVNX0JSRF9UWVBFX0NBU0UoQ1ZNWF9CT0FSRF9UWVBFX1NJTSkKKwkJRU5VTV9CUkRfVFlQRV9DQVNFKENWTVhfQk9BUkRfVFlQRV9FQlQzMDAwKQorCQlFTlVNX0JSRF9UWVBFX0NBU0UoQ1ZNWF9CT0FSRF9UWVBFX0tPREFNQSkKKwkJRU5VTV9CUkRfVFlQRV9DQVNFKENWTVhfQk9BUkRfVFlQRV9OSUFHQVJBKQorCQlFTlVNX0JSRF9UWVBFX0NBU0UoQ1ZNWF9CT0FSRF9UWVBFX05BQzM4KQorCQlFTlVNX0JSRF9UWVBFX0NBU0UoQ1ZNWF9CT0FSRF9UWVBFX1RIVU5ERVIpCisJCUVOVU1fQlJEX1RZUEVfQ0FTRShDVk1YX0JPQVJEX1RZUEVfVFJBTlRPUikKKwkJRU5VTV9CUkRfVFlQRV9DQVNFKENWTVhfQk9BUkRfVFlQRV9FQkgzMDAwKQorCQlFTlVNX0JSRF9UWVBFX0NBU0UoQ1ZNWF9CT0FSRF9UWVBFX0VCSDMxMDApCisJCUVOVU1fQlJEX1RZUEVfQ0FTRShDVk1YX0JPQVJEX1RZUEVfSElLQVJJKQorCQlFTlVNX0JSRF9UWVBFX0NBU0UoQ1ZNWF9CT0FSRF9UWVBFX0NOMzAxMF9FVkJfSFM1KQorCQlFTlVNX0JSRF9UWVBFX0NBU0UoQ1ZNWF9CT0FSRF9UWVBFX0NOMzAwNV9FVkJfSFM1KQorCQlFTlVNX0JSRF9UWVBFX0NBU0UoQ1ZNWF9CT0FSRF9UWVBFX0tCUCkKKwkJRU5VTV9CUkRfVFlQRV9DQVNFKENWTVhfQk9BUkRfVFlQRV9DTjMwMjBfRVZCX0hTNSkKKwkJRU5VTV9CUkRfVFlQRV9DQVNFKENWTVhfQk9BUkRfVFlQRV9FQlQ1ODAwKQorCQlFTlVNX0JSRF9UWVBFX0NBU0UoQ1ZNWF9CT0FSRF9UWVBFX05JQ1BSTzIpCisJCUVOVU1fQlJEX1RZUEVfQ0FTRShDVk1YX0JPQVJEX1RZUEVfRUJINTYwMCkKKwkJRU5VTV9CUkRfVFlQRV9DQVNFKENWTVhfQk9BUkRfVFlQRV9FQkg1NjAxKQorCQlFTlVNX0JSRF9UWVBFX0NBU0UoQ1ZNWF9CT0FSRF9UWVBFX0VCSDUyMDApCisJCUVOVU1fQlJEX1RZUEVfQ0FTRShDVk1YX0JPQVJEX1RZUEVfQkJHV19SRUYpCisJCUVOVU1fQlJEX1RZUEVfQ0FTRShDVk1YX0JPQVJEX1RZUEVfTklDX1hMRV80RykKKwkJRU5VTV9CUkRfVFlQRV9DQVNFKENWTVhfQk9BUkRfVFlQRV9FQlQ1NjAwKQorCQlFTlVNX0JSRF9UWVBFX0NBU0UoQ1ZNWF9CT0FSRF9UWVBFX0VCSDUyMDEpCisJCUVOVU1fQlJEX1RZUEVfQ0FTRShDVk1YX0JPQVJEX1RZUEVfTUFYKQorCisJCQkvKiBDdXN0b21lciBib2FyZHMgbGlzdGVkIGhlcmUgKi8KKwkJRU5VTV9CUkRfVFlQRV9DQVNFKENWTVhfQk9BUkRfVFlQRV9DVVNUX0RFRklORURfTUlOKQorCQlFTlVNX0JSRF9UWVBFX0NBU0UoQ1ZNWF9CT0FSRF9UWVBFX0NVU1RfV1NYMTYpCisJCUVOVU1fQlJEX1RZUEVfQ0FTRShDVk1YX0JPQVJEX1RZUEVfQ1VTVF9OUzAyMTYpCisJCUVOVU1fQlJEX1RZUEVfQ0FTRShDVk1YX0JPQVJEX1RZUEVfQ1VTVF9OQjUpCisJCUVOVU1fQlJEX1RZUEVfQ0FTRShDVk1YX0JPQVJEX1RZUEVfQ1VTVF9XTVI1MDApCisJCUVOVU1fQlJEX1RZUEVfQ0FTRShDVk1YX0JPQVJEX1RZUEVfQ1VTVF9ERUZJTkVEX01BWCkKKworCQkgICAgLyogQ3VzdG9tZXIgcHJpdmF0ZSByYW5nZSAqLworCQlFTlVNX0JSRF9UWVBFX0NBU0UoQ1ZNWF9CT0FSRF9UWVBFX0NVU1RfUFJJVkFURV9NSU4pCisJCUVOVU1fQlJEX1RZUEVfQ0FTRShDVk1YX0JPQVJEX1RZUEVfQ1VTVF9QUklWQVRFX01BWCkKKwl9CisJcmV0dXJuICJVbnN1cHBvcnRlZCBCb2FyZCI7Cit9CisKKyNkZWZpbmUgRU5VTV9DSElQX1RZUEVfQ0FTRSh4KSBcCisJY2FzZSB4OiByZXR1cm4oI3ggKyAxNSk7CS8qIFNraXAgQ1ZNWF9DSElQX1RZUEUgKi8KK3N0YXRpYyBpbmxpbmUgY29uc3QgY2hhciAqY3ZteF9jaGlwX3R5cGVfdG9fc3RyaW5nKGVudW0KKwkJCQkJCSAgIGN2bXhfY2hpcF90eXBlc19lbnVtIHR5cGUpCit7CisJc3dpdGNoICh0eXBlKSB7CisJCUVOVU1fQ0hJUF9UWVBFX0NBU0UoQ1ZNWF9DSElQX1RZUEVfTlVMTCkKKwkJICAgIEVOVU1fQ0hJUF9UWVBFX0NBU0UoQ1ZNWF9DSElQX1NJTV9UWVBFX0RFUFJFQ0FURUQpCisJCSAgICBFTlVNX0NISVBfVFlQRV9DQVNFKENWTVhfQ0hJUF9UWVBFX09DVEVPTl9TQU1QTEUpCisJCSAgICBFTlVNX0NISVBfVFlQRV9DQVNFKENWTVhfQ0hJUF9UWVBFX01BWCkKKwl9CisJcmV0dXJuICJVbnN1cHBvcnRlZCBDaGlwIjsKK30KKworI2VuZGlmIC8qIF9fQ1ZNWF9CT09USU5GT19IX18gKi8KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9vY3Rlb24vY3ZteC1ib290bWVtLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vb2N0ZW9uL2N2bXgtYm9vdG1lbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjYmU0YjUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vb2N0ZW9uL2N2bXgtYm9vdG1lbS5oCkBAIC0wLDAgKzEsMjg4IEBACisvKioqKioqKioqKioqKioqKioqKioqKipsaWNlbnNlIHN0YXJ0KioqKioqKioqKioqKioqCisgKiBBdXRob3I6IENhdml1bSBOZXR3b3JrcworICoKKyAqIENvbnRhY3Q6IHN1cHBvcnRAY2F2aXVtbmV0d29ya3MuY29tCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgT0NURU9OIFNESworICoKKyAqIENvcHlyaWdodCAoYykgMjAwMy0yMDA4IENhdml1bSBOZXR3b3JrcworICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBWZXJzaW9uIDIsIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBBUy1JUyBhbmQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eQorICogb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBUSVRMRSwgb3IKKyAqIE5PTklORlJJTkdFTUVOVC4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUKKyAqIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBmaWxlOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqIG9yIHZpc2l0IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uCisgKgorICogVGhpcyBmaWxlIG1heSBhbHNvIGJlIGF2YWlsYWJsZSB1bmRlciBhIGRpZmZlcmVudCBsaWNlbnNlIGZyb20gQ2F2aXVtLgorICogQ29udGFjdCBDYXZpdW0gTmV0d29ya3MgZm9yIG1vcmUgaW5mb3JtYXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKmxpY2Vuc2UgZW5kKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBTaW1wbGUgYWxsb2NhdGUgb25seSBtZW1vcnkgYWxsb2NhdG9yLiAgVXNlZCB0byBhbGxvY2F0ZSBtZW1vcnkgYXQKKyAqIGFwcGxpY2F0aW9uIHN0YXJ0IHRpbWUuCisgKi8KKworI2lmbmRlZiBfX0NWTVhfQk9PVE1FTV9IX18KKyNkZWZpbmUgX19DVk1YX0JPT1RNRU1fSF9fCisvKiBNdXN0IGJlIG11bHRpcGxlIG9mIDgsIGNoYW5naW5nIGJyZWFrcyBBQkkgKi8KKyNkZWZpbmUgQ1ZNWF9CT09UTUVNX05BTUVfTEVOIDEyOAorCisvKiBDYW4gY2hhbmdlIHdpdGhvdXQgYnJlYWtpbmcgQUJJICovCisjZGVmaW5lIENWTVhfQk9PVE1FTV9OVU1fTkFNRURfQkxPQ0tTIDY0CisKKy8qIG1pbmltdW0gYWxpZ25tZW50IG9mIGJvb3RtZW0gYWxsb2NlZCBibG9ja3MgKi8KKyNkZWZpbmUgQ1ZNWF9CT09UTUVNX0FMSUdOTUVOVF9TSVpFICAgICAoMTZ1bGwpCisKKy8qIEZsYWdzIGZvciBjdm14X2Jvb3RtZW1fcGh5X21lbSogZnVuY3Rpb25zICovCisvKiBBbGxvY2F0ZSBmcm9tIGVuZCBvZiBibG9jayBpbnN0ZWFkIG9mIGJlZ2lubmluZyAqLworI2RlZmluZSBDVk1YX0JPT1RNRU1fRkxBR19FTkRfQUxMT0MgICAgKDEgPDwgMCkKKworLyogRG9uJ3QgZG8gYW55IGxvY2tpbmcuICovCisjZGVmaW5lIENWTVhfQk9PVE1FTV9GTEFHX05PX0xPQ0tJTkcgICAoMSA8PCAxKQorCisvKiBGaXJzdCBieXRlcyBvZiBlYWNoIGZyZWUgcGh5c2ljYWwgYmxvY2sgb2YgbWVtb3J5IGNvbnRhaW4gdGhpcyBzdHJ1Y3R1cmUsCisgKiB3aGljaCBpcyB1c2VkIHRvIG1haW50YWluIHRoZSBmcmVlIG1lbW9yeSBsaXN0LiAgU2luY2UgdGhlIGJvb3Rsb2FkZXIgaXMKKyAqIG9ubHkgMzIgYml0cywgdGhlcmUgaXMgYSB1bmlvbiBwcm92aWRpbmcgNjQgYW5kIDMyIGJpdCB2ZXJzaW9ucy4gIFRoZQorICogYXBwbGljYXRpb24gaW5pdCBjb2RlIGNvbnZlcnRzIGFkZHJlc3NlcyB0byA2NCBiaXQgYWRkcmVzc2VzIGJlZm9yZSB0aGUKKyAqIGFwcGxpY2F0aW9uIHN0YXJ0cy4KKyAqLworc3RydWN0IGN2bXhfYm9vdG1lbV9ibG9ja19oZWFkZXIgeworCS8qCisJICogTm90ZTogdGhlc2UgYXJlIHJlZmVyZW5jZWQgZnJvbSBhc3NlbWJseSByb3V0aW5lcyBpbiB0aGUKKwkgKiBib290bG9hZGVyLCBzbyB0aGlzIHN0cnVjdHVyZSBzaG91bGQgbm90IGJlIGNoYW5nZWQKKwkgKiB3aXRob3V0IGNoYW5naW5nIHRob3NlIHJvdXRpbmVzIGFzIHdlbGwuCisJICovCisJdWludDY0X3QgbmV4dF9ibG9ja19hZGRyOworCXVpbnQ2NF90IHNpemU7CisKK307CisKKy8qCisgKiBTdHJ1Y3R1cmUgZm9yIG5hbWVkIG1lbW9yeSBibG9ja3MuICBOdW1iZXIgb2YgZGVzY3JpcHRvcnMgYXZhaWxhYmxlCisgKiBjYW4gYmUgY2hhbmdlZCB3aXRob3V0IGFmZmVjdGluZyBjb21wYXRpYmxpdHksIGJ1dCBuYW1lIGxlbmd0aAorICogY2hhbmdlcyByZXF1aXJlIGEgYnVtcCBpbiB0aGUgYm9vdG1lbSBkZXNjcmlwdG9yIHZlcnNpb24gTm90ZTogVGhpcworICogc3RydWN0dXJlIG11c3QgYmUgbmF0dXJhbGx5IDY0IGJpdCBhbGlnbmVkLCBhcyBhIHNpbmdsZSBtZW1vcnkKKyAqIGltYWdlIHdpbGwgYmUgdXNlZCBieSBib3RoIDMyIGFuZCA2NCBiaXQgcHJvZ3JhbXMuCisgKi8KK3N0cnVjdCBjdm14X2Jvb3RtZW1fbmFtZWRfYmxvY2tfZGVzYyB7CisJLyogQmFzZSBhZGRyZXNzIG9mIG5hbWVkIGJsb2NrICovCisJdWludDY0X3QgYmFzZV9hZGRyOworCS8qCisJICogU2l6ZSBhY3R1YWxseSBhbGxvY2F0ZWQgZm9yIG5hbWVkIGJsb2NrIChtYXkgZGlmZmVyIGZyb20KKwkgKiByZXF1ZXN0ZWQpLgorCSAqLworCXVpbnQ2NF90IHNpemU7CisJLyogbmFtZSBvZiBuYW1lZCBibG9jayAqLworCWNoYXIgbmFtZVtDVk1YX0JPT1RNRU1fTkFNRV9MRU5dOworfTsKKworLyogQ3VycmVudCBkZXNjcmlwdG9yIHZlcnNpb25zICovCisvKiBDVk1YIGJvb3RtZW0gZGVzY3JpcHRvciBtYWpvciB2ZXJzaW9uICovCisjZGVmaW5lIENWTVhfQk9PVE1FTV9ERVNDX01BSl9WRVIgICAzCisKKy8qIENWTVggYm9vdG1lbSBkZXNjcmlwdG9yIG1pbm9yIHZlcnNpb24gKi8KKyNkZWZpbmUgQ1ZNWF9CT09UTUVNX0RFU0NfTUlOX1ZFUiAgIDAKKworLyogRmlyc3QgdGhyZWUgbWVtYmVycyBvZiBjdm14X2Jvb3RtZW1fZGVzY190IGFyZSBsZWZ0IGluIG9yaWdpbmFsCisgKiBwb3NpdGlvbnMgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LgorICovCitzdHJ1Y3QgY3ZteF9ib290bWVtX2Rlc2MgeworCS8qIHNwaW5sb2NrIHRvIGNvbnRyb2wgYWNjZXNzIHRvIGxpc3QgKi8KKwl1aW50MzJfdCBsb2NrOworCS8qIGZsYWdzIGZvciBpbmRpY2F0aW5nIHZhcmlvdXMgY29uZGl0aW9ucyAqLworCXVpbnQzMl90IGZsYWdzOworCXVpbnQ2NF90IGhlYWRfYWRkcjsKKworCS8qIEluY3JlbWVudGVkIHdoZW4gaW5jb21wYXRpYmxlIGNoYW5nZXMgbWFkZSAqLworCXVpbnQzMl90IG1ham9yX3ZlcnNpb247CisKKwkvKgorCSAqIEluY3JlbWVudGVkIGNoYW5nZWQgd2hlbiBjb21wYXRpYmxlIGNoYW5nZXMgbWFkZSwgcmVzZXQgdG8KKwkgKiB6ZXJvIHdoZW4gbWFqb3IgaW5jcmVtZW50ZWQuCisJICovCisJdWludDMyX3QgbWlub3JfdmVyc2lvbjsKKworCXVpbnQ2NF90IGFwcF9kYXRhX2FkZHI7CisJdWludDY0X3QgYXBwX2RhdGFfc2l6ZTsKKworCS8qIG51bWJlciBvZiBlbGVtZW50cyBpbiBuYW1lZCBibG9ja3MgYXJyYXkgKi8KKwl1aW50MzJfdCBuYW1lZF9ibG9ja19udW1fYmxvY2tzOworCisJLyogbGVuZ3RoIG9mIG5hbWUgYXJyYXkgaW4gYm9vdG1lbSBibG9ja3MgKi8KKwl1aW50MzJfdCBuYW1lZF9ibG9ja19uYW1lX2xlbjsKKwkvKiBhZGRyZXNzIG9mIG5hbWVkIG1lbW9yeSBibG9jayBkZXNjcmlwdG9ycyAqLworCXVpbnQ2NF90IG5hbWVkX2Jsb2NrX2FycmF5X2FkZHI7CisKK307CisKKy8qKgorICogSW5pdGlhbGl6ZSB0aGUgYm9vdCBhbGxvYyBtZW1vcnkgc3RydWN0dXJlcy4gVGhpcyBpcworICogbm9ybWFsbHkgY2FsbGVkIGluc2lkZSBvZiBjdm14X3VzZXJfYXBwX2luaXQoKQorICoKKyAqIEBtZW1fZGVzY19wdHI6CUFkZHJlc3Mgb2YgdGhlIGZyZWUgbWVtb3J5IGxpc3QKKyAqLworZXh0ZXJuIGludCBjdm14X2Jvb3RtZW1faW5pdCh2b2lkICptZW1fZGVzY19wdHIpOworCisvKioKKyAqIEFsbG9jYXRlIGEgYmxvY2sgb2YgbWVtb3J5IGZyb20gdGhlIGZyZWUgbGlzdCB0aGF0IHdhcyBwYXNzZWQKKyAqIHRvIHRoZSBhcHBsaWNhdGlvbiBieSB0aGUgYm9vdGxvYWRlci4KKyAqIFRoaXMgaXMgYW4gYWxsb2NhdGUtb25seSBhbGdvcml0aG0sIHNvIGZyZWVpbmcgbWVtb3J5IGlzIG5vdCBwb3NzaWJsZS4KKyAqCisgKiBAc2l6ZTogICAgICBTaXplIGluIGJ5dGVzIG9mIGJsb2NrIHRvIGFsbG9jYXRlCisgKiBAYWxpZ25tZW50OiBBbGlnbm1lbnQgcmVxdWlyZWQgLSBtdXN0IGJlIHBvd2VyIG9mIDIKKyAqCisgKiBSZXR1cm5zIHBvaW50ZXIgdG8gYmxvY2sgb2YgbWVtb3J5LCBOVUxMIG9uIGVycm9yCisgKi8KK2V4dGVybiB2b2lkICpjdm14X2Jvb3RtZW1fYWxsb2ModWludDY0X3Qgc2l6ZSwgdWludDY0X3QgYWxpZ25tZW50KTsKKworLyoqCisgKiBBbGxvY2F0ZSBhIGJsb2NrIG9mIG1lbW9yeSBmcm9tIHRoZSBmcmVlIGxpc3QgdGhhdCB3YXMKKyAqIHBhc3NlZCB0byB0aGUgYXBwbGljYXRpb24gYnkgdGhlIGJvb3Rsb2FkZXIgYXQgYSBzcGVjaWZpYworICogYWRkcmVzcy4gVGhpcyBpcyBhbiBhbGxvY2F0ZS1vbmx5IGFsZ29yaXRobSwgc28KKyAqIGZyZWVpbmcgbWVtb3J5IGlzIG5vdCBwb3NzaWJsZS4gQWxsb2NhdGlvbiB3aWxsIGZhaWwgaWYKKyAqIG1lbW9yeSBjYW5ub3QgYmUgYWxsb2NhdGVkIGF0IHRoZSBzcGVjaWZpZWQgYWRkcmVzcy4KKyAqCisgKiBAc2l6ZTogICAgICBTaXplIGluIGJ5dGVzIG9mIGJsb2NrIHRvIGFsbG9jYXRlCisgKiBAYWRkcmVzczogICBQaHlzaWNhbCBhZGRyZXNzIHRvIGFsbG9jYXRlIG1lbW9yeSBhdC4gIElmIHRoaXMgbWVtb3J5IGlzIG5vdAorICogICAgICAgICAgICAgICAgICBhdmFpbGFibGUsIHRoZSBhbGxvY2F0aW9uIGZhaWxzLgorICogQGFsaWdubWVudDogQWxpZ25tZW50IHJlcXVpcmVkIC0gbXVzdCBiZSBwb3dlciBvZiAyCisgKiBSZXR1cm5zIHBvaW50ZXIgdG8gYmxvY2sgb2YgbWVtb3J5LCBOVUxMIG9uIGVycm9yCisgKi8KK2V4dGVybiB2b2lkICpjdm14X2Jvb3RtZW1fYWxsb2NfYWRkcmVzcyh1aW50NjRfdCBzaXplLCB1aW50NjRfdCBhZGRyZXNzLAorCQkJCQl1aW50NjRfdCBhbGlnbm1lbnQpOworCisvKioKKyAqIEFsbG9jYXRlIGEgYmxvY2sgb2YgbWVtb3J5IGZyb20gdGhlIGZyZWUgbGlzdCB0aGF0IHdhcworICogcGFzc2VkIHRvIHRoZSBhcHBsaWNhdGlvbiBieSB0aGUgYm9vdGxvYWRlciB3aXRoaW4gYSBzcGVjaWZpZWQKKyAqIGFkZHJlc3MgcmFuZ2UuIFRoaXMgaXMgYW4gYWxsb2NhdGUtb25seSBhbGdvcml0aG0sIHNvCisgKiBmcmVlaW5nIG1lbW9yeSBpcyBub3QgcG9zc2libGUuIEFsbG9jYXRpb24gd2lsbCBmYWlsIGlmCisgKiBtZW1vcnkgY2Fubm90IGJlIGFsbG9jYXRlZCBpbiB0aGUgcmVxdWVzdGVkIHJhbmdlLgorICoKKyAqIEBzaXplOiAgICAgIFNpemUgaW4gYnl0ZXMgb2YgYmxvY2sgdG8gYWxsb2NhdGUKKyAqIEBtaW5fYWRkcjogIGRlZmluZXMgdGhlIG1pbmltdW0gYWRkcmVzcyBvZiB0aGUgcmFuZ2UKKyAqIEBtYXhfYWRkcjogIGRlZmluZXMgdGhlIG1heGltdW0gYWRkcmVzcyBvZiB0aGUgcmFuZ2UKKyAqIEBhbGlnbm1lbnQ6IEFsaWdubWVudCByZXF1aXJlZCAtIG11c3QgYmUgcG93ZXIgb2YgMgorICogUmV0dXJucyBwb2ludGVyIHRvIGJsb2NrIG9mIG1lbW9yeSwgTlVMTCBvbiBlcnJvcgorICovCitleHRlcm4gdm9pZCAqY3ZteF9ib290bWVtX2FsbG9jX3JhbmdlKHVpbnQ2NF90IHNpemUsIHVpbnQ2NF90IGFsaWdubWVudCwKKwkJCQkgICAgICB1aW50NjRfdCBtaW5fYWRkciwgdWludDY0X3QgbWF4X2FkZHIpOworCisvKioKKyAqIEZyZWVzIGEgcHJldmlvdXNseSBhbGxvY2F0ZWQgbmFtZWQgYm9vdG1lbSBibG9jay4KKyAqCisgKiBAbmFtZTogICBuYW1lIG9mIGJsb2NrIHRvIGZyZWUKKyAqCisgKiBSZXR1cm5zIDAgb24gZmFpbHVyZSwKKyAqICAgICAgICAgITAgb24gc3VjY2VzcworICovCitleHRlcm4gaW50IGN2bXhfYm9vdG1lbV9mcmVlX25hbWVkKGNoYXIgKm5hbWUpOworCisvKioKKyAqIEZpbmRzIGEgbmFtZWQgYm9vdG1lbSBibG9jayBieSBuYW1lLgorICoKKyAqIEBuYW1lOiAgIG5hbWUgb2YgYmxvY2sgdG8gZnJlZQorICoKKyAqIFJldHVybnMgcG9pbnRlciB0byBuYW1lZCBibG9jayBkZXNjcmlwdG9yIG9uIHN1Y2Nlc3MKKyAqICAgICAgICAgMCBvbiBmYWlsdXJlCisgKi8KK3N0cnVjdCBjdm14X2Jvb3RtZW1fbmFtZWRfYmxvY2tfZGVzYyAqY3ZteF9ib290bWVtX2ZpbmRfbmFtZWRfYmxvY2soY2hhciAqbmFtZSk7CisKKy8qKgorICogQWxsb2NhdGVzIGEgYmxvY2sgb2YgcGh5c2ljYWwgbWVtb3J5IGZyb20gdGhlIGZyZWUgbGlzdCwgYXQKKyAqIChvcHRpb25hbCkgcmVxdWVzdGVkIGFkZHJlc3MgYW5kIGFsaWdubWVudC4KKyAqCisgKiBAcmVxX3NpemU6IHNpemUgb2YgcmVnaW9uIHRvIGFsbG9jYXRlLiAgQWxsIHJlcXVlc3RzIGFyZSByb3VuZGVkIHVwCisgKiAgICAgICAgICAgIHRvIGJlIGEgbXVsdGlwbGUgQ1ZNWF9CT09UTUVNX0FMSUdOTUVOVF9TSVpFIGJ5dGVzIHNpemUKKyAqCisgKiBAYWRkcmVzc19taW46IE1pbmltdW0gYWRkcmVzcyB0aGF0IGJsb2NrIGNhbiBvY2N1cHkuCisgKgorICogQGFkZHJlc3NfbWF4OiBTcGVjaWZpZXMgdGhlIG1heGltdW0gYWRkcmVzc19taW4gKGluY2x1c2l2ZSkgdGhhdAorICogICAgICAgICAgICAgICB0aGUgYWxsb2NhdGlvbiBjYW4gdXNlLgorICoKKyAqIEBhbGlnbm1lbnQ6IFJlcXVlc3RlZCBhbGlnbm1lbnQgb2YgdGhlIGJsb2NrLiAgSWYgdGhpcyBhbGlnbm1lbnQKKyAqICAgICAgICAgICAgIGNhbm5vdCBiZSBtZXQsIHRoZSBhbGxvY2F0aW9uIGZhaWxzLiAgVGhpcyBtdXN0IGJlIGEKKyAqICAgICAgICAgICAgIHBvd2VyIG9mIDIuICAoTm90ZTogQWxpZ25tZW50IG9mCisgKiAgICAgICAgICAgICBDVk1YX0JPT1RNRU1fQUxJR05NRU5UX1NJWkUgYnl0ZXMgaXMgcmVxdWlyZWQsIGFuZAorICogICAgICAgICAgICAgaW50ZXJuYWxseSBlbmZvcmNlZC4gIFJlcXVlc3RlZCBhbGlnbm1lbnRzIG9mIGxlc3MgdGhhbgorICogICAgICAgICAgICAgQ1ZNWF9CT09UTUVNX0FMSUdOTUVOVF9TSVpFIGFyZSBzZXQgdG8KKyAqICAgICAgICAgICAgIENWTVhfQk9PVE1FTV9BTElHTk1FTlRfU0laRS4pCisgKgorICogQGZsYWdzOiAgICAgRmxhZ3MgdG8gY29udHJvbCBvcHRpb25zIGZvciB0aGUgYWxsb2NhdGlvbi4KKyAqCisgKiBSZXR1cm5zIHBoeXNpY2FsIGFkZHJlc3Mgb2YgYmxvY2sgYWxsb2NhdGVkLCBvciAtMSBvbiBmYWlsdXJlCisgKi8KK2ludDY0X3QgY3ZteF9ib290bWVtX3BoeV9hbGxvYyh1aW50NjRfdCByZXFfc2l6ZSwgdWludDY0X3QgYWRkcmVzc19taW4sCisJCQkgICAgICAgdWludDY0X3QgYWRkcmVzc19tYXgsIHVpbnQ2NF90IGFsaWdubWVudCwKKwkJCSAgICAgICB1aW50MzJfdCBmbGFncyk7CisKKy8qKgorICogRmluZHMgYSBuYW1lZCBtZW1vcnkgYmxvY2sgYnkgbmFtZS4KKyAqIEFsc28gdXNlZCBmb3IgZmluZGluZyBhbiB1bnVzZWQgZW50cnkgaW4gdGhlIG5hbWVkIGJsb2NrIHRhYmxlLgorICoKKyAqIEBuYW1lOiBOYW1lIG9mIG1lbW9yeSBibG9jayB0byBmaW5kLiAgSWYgTlVMTCBwb2ludGVyIGdpdmVuLCB0aGVuCisgKiAgICAgICAgZmluZHMgdW51c2VkIGRlc2NyaXB0b3IsIGlmIGF2YWlsYWJsZS4KKyAqCisgKiBAZmxhZ3M6IEZsYWdzIHRvIGNvbnRyb2wgb3B0aW9ucyBmb3IgdGhlIGFsbG9jYXRpb24uCisgKgorICogUmV0dXJucyBQb2ludGVyIHRvIG1lbW9yeSBibG9jayBkZXNjcmlwdG9yLCBOVUxMIGlmIG5vdCBmb3VuZC4KKyAqICAgICAgICAgSWYgTlVMTCByZXR1cm5lZCB3aGVuIG5hbWUgcGFyYW1ldGVyIGlzIE5VTEwsIHRoZW4gbm8gbWVtb3J5CisgKiAgICAgICAgIGJsb2NrIGRlc2NyaXB0b3JzIGFyZSBhdmFpbGFibGUuCisgKi8KK3N0cnVjdCBjdm14X2Jvb3RtZW1fbmFtZWRfYmxvY2tfZGVzYyAqCitjdm14X2Jvb3RtZW1fcGh5X25hbWVkX2Jsb2NrX2ZpbmQoY2hhciAqbmFtZSwgdWludDMyX3QgZmxhZ3MpOworCisvKioKKyAqIEZyZWVzIGEgbmFtZWQgYmxvY2suCisgKgorICogQG5hbWU6ICAgbmFtZSBvZiBibG9jayB0byBmcmVlCisgKiBAZmxhZ3M6ICBmbGFncyBmb3IgcGFzc2luZyBvcHRpb25zCisgKgorICogUmV0dXJucyAwIG9uIGZhaWx1cmUKKyAqICAgICAgICAgMSBvbiBzdWNjZXNzCisgKi8KK2ludCBjdm14X2Jvb3RtZW1fcGh5X25hbWVkX2Jsb2NrX2ZyZWUoY2hhciAqbmFtZSwgdWludDMyX3QgZmxhZ3MpOworCisvKioKKyAqIEZyZWVzIGEgYmxvY2sgdG8gdGhlIGJvb3RtZW0gYWxsb2NhdG9yIGxpc3QuICBUaGlzIG11c3QKKyAqIGJlIHVzZWQgd2l0aCBjYXJlLCBhcyB0aGUgc2l6ZSBwcm92aWRlZCBtdXN0IG1hdGNoIHRoZSBzaXplCisgKiBvZiB0aGUgYmxvY2sgdGhhdCB3YXMgYWxsb2NhdGVkLCBvciB0aGUgbGlzdCB3aWxsIGJlY29tZQorICogY29ycnVwdGVkLgorICoKKyAqIElNUE9SVEFOVDogIFRoaXMgaXMgb25seSBpbnRlbmRlZCB0byBiZSB1c2VkIGFzIHBhcnQgb2YgbmFtZWQgYmxvY2sKKyAqIGZyZWVzIGFuZCBpbml0aWFsIHBvcHVsYXRpb24gb2YgdGhlIGZyZWUgbWVtb3J5IGxpc3QuCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqCisgKiBAcGh5X2FkZHI6IHBoeXNpY2FsIGFkZHJlc3Mgb2YgYmxvY2sKKyAqIEBzaXplOiAgICAgc2l6ZSBvZiBibG9jayBpbiBieXRlcy4KKyAqIEBmbGFnczogICAgZmxhZ3MgZm9yIHBhc3Npbmcgb3B0aW9ucworICoKKyAqIFJldHVybnMgMSBvbiBzdWNjZXNzLAorICogICAgICAgICAwIG9uIGZhaWx1cmUKKyAqLworaW50IF9fY3ZteF9ib290bWVtX3BoeV9mcmVlKHVpbnQ2NF90IHBoeV9hZGRyLCB1aW50NjRfdCBzaXplLCB1aW50MzJfdCBmbGFncyk7CisKKy8qKgorICogTG9ja3MgdGhlIGJvb3RtZW0gYWxsb2NhdG9yLiAgVGhpcyBpcyB1c2VmdWwgaW4gY2VydGFpbiBzaXR1YXRpb25zCisgKiB3aGVyZSBtdWx0aXBsZSBhbGxvY2F0aW9ucyBtdXN0IGJlIG1hZGUgd2l0aG91dCBiZWluZyBpbnRlcnJ1cHRlZC4KKyAqIFRoaXMgc2hvdWxkIGJlIHVzZWQgd2l0aCB0aGUgQ1ZNWF9CT09UTUVNX0ZMQUdfTk9fTE9DS0lORyBmbGFnLgorICoKKyAqLwordm9pZCBjdm14X2Jvb3RtZW1fbG9jayh2b2lkKTsKKworLyoqCisgKiBVbmxvY2tzIHRoZSBib290bWVtIGFsbG9jYXRvci4gIFRoaXMgaXMgdXNlZnVsIGluIGNlcnRhaW4gc2l0dWF0aW9ucworICogd2hlcmUgbXVsdGlwbGUgYWxsb2NhdGlvbnMgbXVzdCBiZSBtYWRlIHdpdGhvdXQgYmVpbmcgaW50ZXJydXB0ZWQuCisgKiBUaGlzIHNob3VsZCBiZSB1c2VkIHdpdGggdGhlIENWTVhfQk9PVE1FTV9GTEFHX05PX0xPQ0tJTkcgZmxhZy4KKyAqCisgKi8KK3ZvaWQgY3ZteF9ib290bWVtX3VubG9jayh2b2lkKTsKKworI2VuZGlmIC8qICAgX19DVk1YX0JPT1RNRU1fSF9fICovCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vb2N0ZW9uL2N2bXgtY2l1LWRlZnMuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9vY3Rlb24vY3ZteC1jaXUtZGVmcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4ZjA1YjcKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vb2N0ZW9uL2N2bXgtY2l1LWRlZnMuaApAQCAtMCwwICsxLDE2MTYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKmxpY2Vuc2Ugc3RhcnQqKioqKioqKioqKioqKioKKyAqIEF1dGhvcjogQ2F2aXVtIE5ldHdvcmtzCisgKgorICogQ29udGFjdDogc3VwcG9ydEBjYXZpdW1uZXR3b3Jrcy5jb20KKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBPQ1RFT04gU0RLCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMDggQ2F2aXVtIE5ldHdvcmtzCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIFZlcnNpb24gMiwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIEFTLUlTIGFuZCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5CisgKiBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIFRJVExFLCBvcgorICogTk9OSU5GUklOR0VNRU5ULiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZQorICogZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIGZpbGU7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICogb3IgdmlzaXQgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4KKyAqCisgKiBUaGlzIGZpbGUgbWF5IGFsc28gYmUgYXZhaWxhYmxlIHVuZGVyIGEgZGlmZmVyZW50IGxpY2Vuc2UgZnJvbSBDYXZpdW0uCisgKiBDb250YWN0IENhdml1bSBOZXR3b3JrcyBmb3IgbW9yZSBpbmZvcm1hdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqbGljZW5zZSBlbmQqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfX0NWTVhfQ0lVX0RFRlNfSF9fCisjZGVmaW5lIF9fQ1ZNWF9DSVVfREVGU19IX18KKworI2RlZmluZSBDVk1YX0NJVV9CSVNUIFwKKwkgQ1ZNWF9BRERfSU9fU0VHKDB4MDAwMTA3MDAwMDAwMDczMHVsbCkKKyNkZWZpbmUgQ1ZNWF9DSVVfRElOVCBcCisJIENWTVhfQUREX0lPX1NFRygweDAwMDEwNzAwMDAwMDA3MjB1bGwpCisjZGVmaW5lIENWTVhfQ0lVX0ZVU0UgXAorCSBDVk1YX0FERF9JT19TRUcoMHgwMDAxMDcwMDAwMDAwNzI4dWxsKQorI2RlZmluZSBDVk1YX0NJVV9HU1RPUCBcCisJIENWTVhfQUREX0lPX1NFRygweDAwMDEwNzAwMDAwMDA3MTB1bGwpCisjZGVmaW5lIENWTVhfQ0lVX0lOVFhfRU4wKG9mZnNldCkgXAorCSBDVk1YX0FERF9JT19TRUcoMHgwMDAxMDcwMDAwMDAwMjAwdWxsICsgKCgob2Zmc2V0KSAmIDYzKSAqIDE2KSkKKyNkZWZpbmUgQ1ZNWF9DSVVfSU5UWF9FTjBfVzFDKG9mZnNldCkgXAorCSBDVk1YX0FERF9JT19TRUcoMHgwMDAxMDcwMDAwMDAyMjAwdWxsICsgKCgob2Zmc2V0KSAmIDYzKSAqIDE2KSkKKyNkZWZpbmUgQ1ZNWF9DSVVfSU5UWF9FTjBfVzFTKG9mZnNldCkgXAorCSBDVk1YX0FERF9JT19TRUcoMHgwMDAxMDcwMDAwMDA2MjAwdWxsICsgKCgob2Zmc2V0KSAmIDYzKSAqIDE2KSkKKyNkZWZpbmUgQ1ZNWF9DSVVfSU5UWF9FTjEob2Zmc2V0KSBcCisJIENWTVhfQUREX0lPX1NFRygweDAwMDEwNzAwMDAwMDAyMDh1bGwgKyAoKChvZmZzZXQpICYgNjMpICogMTYpKQorI2RlZmluZSBDVk1YX0NJVV9JTlRYX0VOMV9XMUMob2Zmc2V0KSBcCisJIENWTVhfQUREX0lPX1NFRygweDAwMDEwNzAwMDAwMDIyMDh1bGwgKyAoKChvZmZzZXQpICYgNjMpICogMTYpKQorI2RlZmluZSBDVk1YX0NJVV9JTlRYX0VOMV9XMVMob2Zmc2V0KSBcCisJIENWTVhfQUREX0lPX1NFRygweDAwMDEwNzAwMDAwMDYyMDh1bGwgKyAoKChvZmZzZXQpICYgNjMpICogMTYpKQorI2RlZmluZSBDVk1YX0NJVV9JTlRYX0VONF8wKG9mZnNldCkgXAorCSBDVk1YX0FERF9JT19TRUcoMHgwMDAxMDcwMDAwMDAwQzgwdWxsICsgKCgob2Zmc2V0KSAmIDE1KSAqIDE2KSkKKyNkZWZpbmUgQ1ZNWF9DSVVfSU5UWF9FTjRfMF9XMUMob2Zmc2V0KSBcCisJIENWTVhfQUREX0lPX1NFRygweDAwMDEwNzAwMDAwMDJDODB1bGwgKyAoKChvZmZzZXQpICYgMTUpICogMTYpKQorI2RlZmluZSBDVk1YX0NJVV9JTlRYX0VONF8wX1cxUyhvZmZzZXQpIFwKKwkgQ1ZNWF9BRERfSU9fU0VHKDB4MDAwMTA3MDAwMDAwNkM4MHVsbCArICgoKG9mZnNldCkgJiAxNSkgKiAxNikpCisjZGVmaW5lIENWTVhfQ0lVX0lOVFhfRU40XzEob2Zmc2V0KSBcCisJIENWTVhfQUREX0lPX1NFRygweDAwMDEwNzAwMDAwMDBDODh1bGwgKyAoKChvZmZzZXQpICYgMTUpICogMTYpKQorI2RlZmluZSBDVk1YX0NJVV9JTlRYX0VONF8xX1cxQyhvZmZzZXQpIFwKKwkgQ1ZNWF9BRERfSU9fU0VHKDB4MDAwMTA3MDAwMDAwMkM4OHVsbCArICgoKG9mZnNldCkgJiAxNSkgKiAxNikpCisjZGVmaW5lIENWTVhfQ0lVX0lOVFhfRU40XzFfVzFTKG9mZnNldCkgXAorCSBDVk1YX0FERF9JT19TRUcoMHgwMDAxMDcwMDAwMDA2Qzg4dWxsICsgKCgob2Zmc2V0KSAmIDE1KSAqIDE2KSkKKyNkZWZpbmUgQ1ZNWF9DSVVfSU5UWF9TVU0wKG9mZnNldCkgXAorCSBDVk1YX0FERF9JT19TRUcoMHgwMDAxMDcwMDAwMDAwMDAwdWxsICsgKCgob2Zmc2V0KSAmIDYzKSAqIDgpKQorI2RlZmluZSBDVk1YX0NJVV9JTlRYX1NVTTQob2Zmc2V0KSBcCisJIENWTVhfQUREX0lPX1NFRygweDAwMDEwNzAwMDAwMDBDMDB1bGwgKyAoKChvZmZzZXQpICYgMTUpICogOCkpCisjZGVmaW5lIENWTVhfQ0lVX0lOVF9TVU0xIFwKKwkgQ1ZNWF9BRERfSU9fU0VHKDB4MDAwMTA3MDAwMDAwMDEwOHVsbCkKKyNkZWZpbmUgQ1ZNWF9DSVVfTUJPWF9DTFJYKG9mZnNldCkgXAorCSBDVk1YX0FERF9JT19TRUcoMHgwMDAxMDcwMDAwMDAwNjgwdWxsICsgKCgob2Zmc2V0KSAmIDE1KSAqIDgpKQorI2RlZmluZSBDVk1YX0NJVV9NQk9YX1NFVFgob2Zmc2V0KSBcCisJIENWTVhfQUREX0lPX1NFRygweDAwMDEwNzAwMDAwMDA2MDB1bGwgKyAoKChvZmZzZXQpICYgMTUpICogOCkpCisjZGVmaW5lIENWTVhfQ0lVX05NSSBcCisJIENWTVhfQUREX0lPX1NFRygweDAwMDEwNzAwMDAwMDA3MTh1bGwpCisjZGVmaW5lIENWTVhfQ0lVX1BDSV9JTlRBIFwKKwkgQ1ZNWF9BRERfSU9fU0VHKDB4MDAwMTA3MDAwMDAwMDc1MHVsbCkKKyNkZWZpbmUgQ1ZNWF9DSVVfUFBfREJHIFwKKwkgQ1ZNWF9BRERfSU9fU0VHKDB4MDAwMTA3MDAwMDAwMDcwOHVsbCkKKyNkZWZpbmUgQ1ZNWF9DSVVfUFBfUE9LRVgob2Zmc2V0KSBcCisJIENWTVhfQUREX0lPX1NFRygweDAwMDEwNzAwMDAwMDA1ODB1bGwgKyAoKChvZmZzZXQpICYgMTUpICogOCkpCisjZGVmaW5lIENWTVhfQ0lVX1BQX1JTVCBcCisJIENWTVhfQUREX0lPX1NFRygweDAwMDEwNzAwMDAwMDA3MDB1bGwpCisjZGVmaW5lIENWTVhfQ0lVX1FMTV9EQ09LIFwKKwkgQ1ZNWF9BRERfSU9fU0VHKDB4MDAwMTA3MDAwMDAwMDc2MHVsbCkKKyNkZWZpbmUgQ1ZNWF9DSVVfUUxNX0pUR0MgXAorCSBDVk1YX0FERF9JT19TRUcoMHgwMDAxMDcwMDAwMDAwNzY4dWxsKQorI2RlZmluZSBDVk1YX0NJVV9RTE1fSlRHRCBcCisJIENWTVhfQUREX0lPX1NFRygweDAwMDEwNzAwMDAwMDA3NzB1bGwpCisjZGVmaW5lIENWTVhfQ0lVX1NPRlRfQklTVCBcCisJIENWTVhfQUREX0lPX1NFRygweDAwMDEwNzAwMDAwMDA3Mzh1bGwpCisjZGVmaW5lIENWTVhfQ0lVX1NPRlRfUFJTVCBcCisJIENWTVhfQUREX0lPX1NFRygweDAwMDEwNzAwMDAwMDA3NDh1bGwpCisjZGVmaW5lIENWTVhfQ0lVX1NPRlRfUFJTVDEgXAorCSBDVk1YX0FERF9JT19TRUcoMHgwMDAxMDcwMDAwMDAwNzU4dWxsKQorI2RlZmluZSBDVk1YX0NJVV9TT0ZUX1JTVCBcCisJIENWTVhfQUREX0lPX1NFRygweDAwMDEwNzAwMDAwMDA3NDB1bGwpCisjZGVmaW5lIENWTVhfQ0lVX1RJTVgob2Zmc2V0KSBcCisJIENWTVhfQUREX0lPX1NFRygweDAwMDEwNzAwMDAwMDA0ODB1bGwgKyAoKChvZmZzZXQpICYgMykgKiA4KSkKKyNkZWZpbmUgQ1ZNWF9DSVVfV0RPR1gob2Zmc2V0KSBcCisJIENWTVhfQUREX0lPX1NFRygweDAwMDEwNzAwMDAwMDA1MDB1bGwgKyAoKChvZmZzZXQpICYgMTUpICogOCkpCisKK3VuaW9uIGN2bXhfY2l1X2Jpc3QgeworCXVpbnQ2NF90IHU2NDsKKwlzdHJ1Y3QgY3ZteF9jaXVfYmlzdF9zIHsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfNF82Mzo2MDsKKwkJdWludDY0X3QgYmlzdDo0OworCX0gczsKKwlzdHJ1Y3QgY3ZteF9jaXVfYmlzdF9zIGNuMzB4eDsKKwlzdHJ1Y3QgY3ZteF9jaXVfYmlzdF9zIGNuMzF4eDsKKwlzdHJ1Y3QgY3ZteF9jaXVfYmlzdF9zIGNuMzh4eDsKKwlzdHJ1Y3QgY3ZteF9jaXVfYmlzdF9zIGNuMzh4eHAyOworCXN0cnVjdCBjdm14X2NpdV9iaXN0X2NuNTB4eCB7CisJCXVpbnQ2NF90IHJlc2VydmVkXzJfNjM6NjI7CisJCXVpbnQ2NF90IGJpc3Q6MjsKKwl9IGNuNTB4eDsKKwlzdHJ1Y3QgY3ZteF9jaXVfYmlzdF9jbjUyeHggeworCQl1aW50NjRfdCByZXNlcnZlZF8zXzYzOjYxOworCQl1aW50NjRfdCBiaXN0OjM7CisJfSBjbjUyeHg7CisJc3RydWN0IGN2bXhfY2l1X2Jpc3RfY241Mnh4IGNuNTJ4eHAxOworCXN0cnVjdCBjdm14X2NpdV9iaXN0X3MgY241Nnh4OworCXN0cnVjdCBjdm14X2NpdV9iaXN0X3MgY241Nnh4cDE7CisJc3RydWN0IGN2bXhfY2l1X2Jpc3RfcyBjbjU4eHg7CisJc3RydWN0IGN2bXhfY2l1X2Jpc3RfcyBjbjU4eHhwMTsKK307CisKK3VuaW9uIGN2bXhfY2l1X2RpbnQgeworCXVpbnQ2NF90IHU2NDsKKwlzdHJ1Y3QgY3ZteF9jaXVfZGludF9zIHsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfMTZfNjM6NDg7CisJCXVpbnQ2NF90IGRpbnQ6MTY7CisJfSBzOworCXN0cnVjdCBjdm14X2NpdV9kaW50X2NuMzB4eCB7CisJCXVpbnQ2NF90IHJlc2VydmVkXzFfNjM6NjM7CisJCXVpbnQ2NF90IGRpbnQ6MTsKKwl9IGNuMzB4eDsKKwlzdHJ1Y3QgY3ZteF9jaXVfZGludF9jbjMxeHggeworCQl1aW50NjRfdCByZXNlcnZlZF8yXzYzOjYyOworCQl1aW50NjRfdCBkaW50OjI7CisJfSBjbjMxeHg7CisJc3RydWN0IGN2bXhfY2l1X2RpbnRfcyBjbjM4eHg7CisJc3RydWN0IGN2bXhfY2l1X2RpbnRfcyBjbjM4eHhwMjsKKwlzdHJ1Y3QgY3ZteF9jaXVfZGludF9jbjMxeHggY241MHh4OworCXN0cnVjdCBjdm14X2NpdV9kaW50X2NuNTJ4eCB7CisJCXVpbnQ2NF90IHJlc2VydmVkXzRfNjM6NjA7CisJCXVpbnQ2NF90IGRpbnQ6NDsKKwl9IGNuNTJ4eDsKKwlzdHJ1Y3QgY3ZteF9jaXVfZGludF9jbjUyeHggY241Mnh4cDE7CisJc3RydWN0IGN2bXhfY2l1X2RpbnRfY241Nnh4IHsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfMTJfNjM6NTI7CisJCXVpbnQ2NF90IGRpbnQ6MTI7CisJfSBjbjU2eHg7CisJc3RydWN0IGN2bXhfY2l1X2RpbnRfY241Nnh4IGNuNTZ4eHAxOworCXN0cnVjdCBjdm14X2NpdV9kaW50X3MgY241OHh4OworCXN0cnVjdCBjdm14X2NpdV9kaW50X3MgY241OHh4cDE7Cit9OworCit1bmlvbiBjdm14X2NpdV9mdXNlIHsKKwl1aW50NjRfdCB1NjQ7CisJc3RydWN0IGN2bXhfY2l1X2Z1c2VfcyB7CisJCXVpbnQ2NF90IHJlc2VydmVkXzE2XzYzOjQ4OworCQl1aW50NjRfdCBmdXNlOjE2OworCX0gczsKKwlzdHJ1Y3QgY3ZteF9jaXVfZnVzZV9jbjMweHggeworCQl1aW50NjRfdCByZXNlcnZlZF8xXzYzOjYzOworCQl1aW50NjRfdCBmdXNlOjE7CisJfSBjbjMweHg7CisJc3RydWN0IGN2bXhfY2l1X2Z1c2VfY24zMXh4IHsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfMl82Mzo2MjsKKwkJdWludDY0X3QgZnVzZToyOworCX0gY24zMXh4OworCXN0cnVjdCBjdm14X2NpdV9mdXNlX3MgY24zOHh4OworCXN0cnVjdCBjdm14X2NpdV9mdXNlX3MgY24zOHh4cDI7CisJc3RydWN0IGN2bXhfY2l1X2Z1c2VfY24zMXh4IGNuNTB4eDsKKwlzdHJ1Y3QgY3ZteF9jaXVfZnVzZV9jbjUyeHggeworCQl1aW50NjRfdCByZXNlcnZlZF80XzYzOjYwOworCQl1aW50NjRfdCBmdXNlOjQ7CisJfSBjbjUyeHg7CisJc3RydWN0IGN2bXhfY2l1X2Z1c2VfY241Mnh4IGNuNTJ4eHAxOworCXN0cnVjdCBjdm14X2NpdV9mdXNlX2NuNTZ4eCB7CisJCXVpbnQ2NF90IHJlc2VydmVkXzEyXzYzOjUyOworCQl1aW50NjRfdCBmdXNlOjEyOworCX0gY241Nnh4OworCXN0cnVjdCBjdm14X2NpdV9mdXNlX2NuNTZ4eCBjbjU2eHhwMTsKKwlzdHJ1Y3QgY3ZteF9jaXVfZnVzZV9zIGNuNTh4eDsKKwlzdHJ1Y3QgY3ZteF9jaXVfZnVzZV9zIGNuNTh4eHAxOworfTsKKwordW5pb24gY3ZteF9jaXVfZ3N0b3AgeworCXVpbnQ2NF90IHU2NDsKKwlzdHJ1Y3QgY3ZteF9jaXVfZ3N0b3BfcyB7CisJCXVpbnQ2NF90IHJlc2VydmVkXzFfNjM6NjM7CisJCXVpbnQ2NF90IGdzdG9wOjE7CisJfSBzOworCXN0cnVjdCBjdm14X2NpdV9nc3RvcF9zIGNuMzB4eDsKKwlzdHJ1Y3QgY3ZteF9jaXVfZ3N0b3BfcyBjbjMxeHg7CisJc3RydWN0IGN2bXhfY2l1X2dzdG9wX3MgY24zOHh4OworCXN0cnVjdCBjdm14X2NpdV9nc3RvcF9zIGNuMzh4eHAyOworCXN0cnVjdCBjdm14X2NpdV9nc3RvcF9zIGNuNTB4eDsKKwlzdHJ1Y3QgY3ZteF9jaXVfZ3N0b3BfcyBjbjUyeHg7CisJc3RydWN0IGN2bXhfY2l1X2dzdG9wX3MgY241Mnh4cDE7CisJc3RydWN0IGN2bXhfY2l1X2dzdG9wX3MgY241Nnh4OworCXN0cnVjdCBjdm14X2NpdV9nc3RvcF9zIGNuNTZ4eHAxOworCXN0cnVjdCBjdm14X2NpdV9nc3RvcF9zIGNuNTh4eDsKKwlzdHJ1Y3QgY3ZteF9jaXVfZ3N0b3BfcyBjbjU4eHhwMTsKK307CisKK3VuaW9uIGN2bXhfY2l1X2ludHhfZW4wIHsKKwl1aW50NjRfdCB1NjQ7CisJc3RydWN0IGN2bXhfY2l1X2ludHhfZW4wX3MgeworCQl1aW50NjRfdCBib290ZG1hOjE7CisJCXVpbnQ2NF90IG1paToxOworCQl1aW50NjRfdCBpcGRwcHRocjoxOworCQl1aW50NjRfdCBwb3dpcToxOworCQl1aW50NjRfdCB0d3NpMjoxOworCQl1aW50NjRfdCBtcGk6MTsKKwkJdWludDY0X3QgcGNtOjE7CisJCXVpbnQ2NF90IHVzYjoxOworCQl1aW50NjRfdCB0aW1lcjo0OworCQl1aW50NjRfdCBrZXlfemVybzoxOworCQl1aW50NjRfdCBpcGRfZHJwOjE7CisJCXVpbnQ2NF90IGdteF9kcnA6MjsKKwkJdWludDY0X3QgdHJhY2U6MTsKKwkJdWludDY0X3Qgcm1sOjE7CisJCXVpbnQ2NF90IHR3c2k6MTsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfNDRfNDQ6MTsKKwkJdWludDY0X3QgcGNpX21zaTo0OworCQl1aW50NjRfdCBwY2lfaW50OjQ7CisJCXVpbnQ2NF90IHVhcnQ6MjsKKwkJdWludDY0X3QgbWJveDoyOworCQl1aW50NjRfdCBncGlvOjE2OworCQl1aW50NjRfdCB3b3JrcToxNjsKKwl9IHM7CisJc3RydWN0IGN2bXhfY2l1X2ludHhfZW4wX2NuMzB4eCB7CisJCXVpbnQ2NF90IHJlc2VydmVkXzU5XzYzOjU7CisJCXVpbnQ2NF90IG1waToxOworCQl1aW50NjRfdCBwY206MTsKKwkJdWludDY0X3QgdXNiOjE7CisJCXVpbnQ2NF90IHRpbWVyOjQ7CisJCXVpbnQ2NF90IHJlc2VydmVkXzUxXzUxOjE7CisJCXVpbnQ2NF90IGlwZF9kcnA6MTsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfNDlfNDk6MTsKKwkJdWludDY0X3QgZ214X2RycDoxOworCQl1aW50NjRfdCByZXNlcnZlZF80N180NzoxOworCQl1aW50NjRfdCBybWw6MTsKKwkJdWludDY0X3QgdHdzaToxOworCQl1aW50NjRfdCByZXNlcnZlZF80NF80NDoxOworCQl1aW50NjRfdCBwY2lfbXNpOjQ7CisJCXVpbnQ2NF90IHBjaV9pbnQ6NDsKKwkJdWludDY0X3QgdWFydDoyOworCQl1aW50NjRfdCBtYm94OjI7CisJCXVpbnQ2NF90IGdwaW86MTY7CisJCXVpbnQ2NF90IHdvcmtxOjE2OworCX0gY24zMHh4OworCXN0cnVjdCBjdm14X2NpdV9pbnR4X2VuMF9jbjMxeHggeworCQl1aW50NjRfdCByZXNlcnZlZF81OV82Mzo1OworCQl1aW50NjRfdCBtcGk6MTsKKwkJdWludDY0X3QgcGNtOjE7CisJCXVpbnQ2NF90IHVzYjoxOworCQl1aW50NjRfdCB0aW1lcjo0OworCQl1aW50NjRfdCByZXNlcnZlZF81MV81MToxOworCQl1aW50NjRfdCBpcGRfZHJwOjE7CisJCXVpbnQ2NF90IHJlc2VydmVkXzQ5XzQ5OjE7CisJCXVpbnQ2NF90IGdteF9kcnA6MTsKKwkJdWludDY0X3QgdHJhY2U6MTsKKwkJdWludDY0X3Qgcm1sOjE7CisJCXVpbnQ2NF90IHR3c2k6MTsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfNDRfNDQ6MTsKKwkJdWludDY0X3QgcGNpX21zaTo0OworCQl1aW50NjRfdCBwY2lfaW50OjQ7CisJCXVpbnQ2NF90IHVhcnQ6MjsKKwkJdWludDY0X3QgbWJveDoyOworCQl1aW50NjRfdCBncGlvOjE2OworCQl1aW50NjRfdCB3b3JrcToxNjsKKwl9IGNuMzF4eDsKKwlzdHJ1Y3QgY3ZteF9jaXVfaW50eF9lbjBfY24zOHh4IHsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfNTZfNjM6ODsKKwkJdWludDY0X3QgdGltZXI6NDsKKwkJdWludDY0X3Qga2V5X3plcm86MTsKKwkJdWludDY0X3QgaXBkX2RycDoxOworCQl1aW50NjRfdCBnbXhfZHJwOjI7CisJCXVpbnQ2NF90IHRyYWNlOjE7CisJCXVpbnQ2NF90IHJtbDoxOworCQl1aW50NjRfdCB0d3NpOjE7CisJCXVpbnQ2NF90IHJlc2VydmVkXzQ0XzQ0OjE7CisJCXVpbnQ2NF90IHBjaV9tc2k6NDsKKwkJdWludDY0X3QgcGNpX2ludDo0OworCQl1aW50NjRfdCB1YXJ0OjI7CisJCXVpbnQ2NF90IG1ib3g6MjsKKwkJdWludDY0X3QgZ3BpbzoxNjsKKwkJdWludDY0X3Qgd29ya3E6MTY7CisJfSBjbjM4eHg7CisJc3RydWN0IGN2bXhfY2l1X2ludHhfZW4wX2NuMzh4eCBjbjM4eHhwMjsKKwlzdHJ1Y3QgY3ZteF9jaXVfaW50eF9lbjBfY24zMHh4IGNuNTB4eDsKKwlzdHJ1Y3QgY3ZteF9jaXVfaW50eF9lbjBfY241Mnh4IHsKKwkJdWludDY0X3QgYm9vdGRtYToxOworCQl1aW50NjRfdCBtaWk6MTsKKwkJdWludDY0X3QgaXBkcHB0aHI6MTsKKwkJdWludDY0X3QgcG93aXE6MTsKKwkJdWludDY0X3QgdHdzaTI6MTsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfNTdfNTg6MjsKKwkJdWludDY0X3QgdXNiOjE7CisJCXVpbnQ2NF90IHRpbWVyOjQ7CisJCXVpbnQ2NF90IHJlc2VydmVkXzUxXzUxOjE7CisJCXVpbnQ2NF90IGlwZF9kcnA6MTsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfNDlfNDk6MTsKKwkJdWludDY0X3QgZ214X2RycDoxOworCQl1aW50NjRfdCB0cmFjZToxOworCQl1aW50NjRfdCBybWw6MTsKKwkJdWludDY0X3QgdHdzaToxOworCQl1aW50NjRfdCByZXNlcnZlZF80NF80NDoxOworCQl1aW50NjRfdCBwY2lfbXNpOjQ7CisJCXVpbnQ2NF90IHBjaV9pbnQ6NDsKKwkJdWludDY0X3QgdWFydDoyOworCQl1aW50NjRfdCBtYm94OjI7CisJCXVpbnQ2NF90IGdwaW86MTY7CisJCXVpbnQ2NF90IHdvcmtxOjE2OworCX0gY241Mnh4OworCXN0cnVjdCBjdm14X2NpdV9pbnR4X2VuMF9jbjUyeHggY241Mnh4cDE7CisJc3RydWN0IGN2bXhfY2l1X2ludHhfZW4wX2NuNTZ4eCB7CisJCXVpbnQ2NF90IGJvb3RkbWE6MTsKKwkJdWludDY0X3QgbWlpOjE7CisJCXVpbnQ2NF90IGlwZHBwdGhyOjE7CisJCXVpbnQ2NF90IHBvd2lxOjE7CisJCXVpbnQ2NF90IHR3c2kyOjE7CisJCXVpbnQ2NF90IHJlc2VydmVkXzU3XzU4OjI7CisJCXVpbnQ2NF90IHVzYjoxOworCQl1aW50NjRfdCB0aW1lcjo0OworCQl1aW50NjRfdCBrZXlfemVybzoxOworCQl1aW50NjRfdCBpcGRfZHJwOjE7CisJCXVpbnQ2NF90IGdteF9kcnA6MjsKKwkJdWludDY0X3QgdHJhY2U6MTsKKwkJdWludDY0X3Qgcm1sOjE7CisJCXVpbnQ2NF90IHR3c2k6MTsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfNDRfNDQ6MTsKKwkJdWludDY0X3QgcGNpX21zaTo0OworCQl1aW50NjRfdCBwY2lfaW50OjQ7CisJCXVpbnQ2NF90IHVhcnQ6MjsKKwkJdWludDY0X3QgbWJveDoyOworCQl1aW50NjRfdCBncGlvOjE2OworCQl1aW50NjRfdCB3b3JrcToxNjsKKwl9IGNuNTZ4eDsKKwlzdHJ1Y3QgY3ZteF9jaXVfaW50eF9lbjBfY241Nnh4IGNuNTZ4eHAxOworCXN0cnVjdCBjdm14X2NpdV9pbnR4X2VuMF9jbjM4eHggY241OHh4OworCXN0cnVjdCBjdm14X2NpdV9pbnR4X2VuMF9jbjM4eHggY241OHh4cDE7Cit9OworCit1bmlvbiBjdm14X2NpdV9pbnR4X2VuMF93MWMgeworCXVpbnQ2NF90IHU2NDsKKwlzdHJ1Y3QgY3ZteF9jaXVfaW50eF9lbjBfdzFjX3MgeworCQl1aW50NjRfdCBib290ZG1hOjE7CisJCXVpbnQ2NF90IG1paToxOworCQl1aW50NjRfdCBpcGRwcHRocjoxOworCQl1aW50NjRfdCBwb3dpcToxOworCQl1aW50NjRfdCB0d3NpMjoxOworCQl1aW50NjRfdCByZXNlcnZlZF81N181ODoyOworCQl1aW50NjRfdCB1c2I6MTsKKwkJdWludDY0X3QgdGltZXI6NDsKKwkJdWludDY0X3Qga2V5X3plcm86MTsKKwkJdWludDY0X3QgaXBkX2RycDoxOworCQl1aW50NjRfdCBnbXhfZHJwOjI7CisJCXVpbnQ2NF90IHRyYWNlOjE7CisJCXVpbnQ2NF90IHJtbDoxOworCQl1aW50NjRfdCB0d3NpOjE7CisJCXVpbnQ2NF90IHJlc2VydmVkXzQ0XzQ0OjE7CisJCXVpbnQ2NF90IHBjaV9tc2k6NDsKKwkJdWludDY0X3QgcGNpX2ludDo0OworCQl1aW50NjRfdCB1YXJ0OjI7CisJCXVpbnQ2NF90IG1ib3g6MjsKKwkJdWludDY0X3QgZ3BpbzoxNjsKKwkJdWludDY0X3Qgd29ya3E6MTY7CisJfSBzOworCXN0cnVjdCBjdm14X2NpdV9pbnR4X2VuMF93MWNfY241Mnh4IHsKKwkJdWludDY0X3QgYm9vdGRtYToxOworCQl1aW50NjRfdCBtaWk6MTsKKwkJdWludDY0X3QgaXBkcHB0aHI6MTsKKwkJdWludDY0X3QgcG93aXE6MTsKKwkJdWludDY0X3QgdHdzaTI6MTsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfNTdfNTg6MjsKKwkJdWludDY0X3QgdXNiOjE7CisJCXVpbnQ2NF90IHRpbWVyOjQ7CisJCXVpbnQ2NF90IHJlc2VydmVkXzUxXzUxOjE7CisJCXVpbnQ2NF90IGlwZF9kcnA6MTsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfNDlfNDk6MTsKKwkJdWludDY0X3QgZ214X2RycDoxOworCQl1aW50NjRfdCB0cmFjZToxOworCQl1aW50NjRfdCBybWw6MTsKKwkJdWludDY0X3QgdHdzaToxOworCQl1aW50NjRfdCByZXNlcnZlZF80NF80NDoxOworCQl1aW50NjRfdCBwY2lfbXNpOjQ7CisJCXVpbnQ2NF90IHBjaV9pbnQ6NDsKKwkJdWludDY0X3QgdWFydDoyOworCQl1aW50NjRfdCBtYm94OjI7CisJCXVpbnQ2NF90IGdwaW86MTY7CisJCXVpbnQ2NF90IHdvcmtxOjE2OworCX0gY241Mnh4OworCXN0cnVjdCBjdm14X2NpdV9pbnR4X2VuMF93MWNfcyBjbjU2eHg7CisJc3RydWN0IGN2bXhfY2l1X2ludHhfZW4wX3cxY19jbjU4eHggeworCQl1aW50NjRfdCByZXNlcnZlZF81Nl82Mzo4OworCQl1aW50NjRfdCB0aW1lcjo0OworCQl1aW50NjRfdCBrZXlfemVybzoxOworCQl1aW50NjRfdCBpcGRfZHJwOjE7CisJCXVpbnQ2NF90IGdteF9kcnA6MjsKKwkJdWludDY0X3QgdHJhY2U6MTsKKwkJdWludDY0X3Qgcm1sOjE7CisJCXVpbnQ2NF90IHR3c2k6MTsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfNDRfNDQ6MTsKKwkJdWludDY0X3QgcGNpX21zaTo0OworCQl1aW50NjRfdCBwY2lfaW50OjQ7CisJCXVpbnQ2NF90IHVhcnQ6MjsKKwkJdWludDY0X3QgbWJveDoyOworCQl1aW50NjRfdCBncGlvOjE2OworCQl1aW50NjRfdCB3b3JrcToxNjsKKwl9IGNuNTh4eDsKK307CisKK3VuaW9uIGN2bXhfY2l1X2ludHhfZW4wX3cxcyB7CisJdWludDY0X3QgdTY0OworCXN0cnVjdCBjdm14X2NpdV9pbnR4X2VuMF93MXNfcyB7CisJCXVpbnQ2NF90IGJvb3RkbWE6MTsKKwkJdWludDY0X3QgbWlpOjE7CisJCXVpbnQ2NF90IGlwZHBwdGhyOjE7CisJCXVpbnQ2NF90IHBvd2lxOjE7CisJCXVpbnQ2NF90IHR3c2kyOjE7CisJCXVpbnQ2NF90IHJlc2VydmVkXzU3XzU4OjI7CisJCXVpbnQ2NF90IHVzYjoxOworCQl1aW50NjRfdCB0aW1lcjo0OworCQl1aW50NjRfdCBrZXlfemVybzoxOworCQl1aW50NjRfdCBpcGRfZHJwOjE7CisJCXVpbnQ2NF90IGdteF9kcnA6MjsKKwkJdWludDY0X3QgdHJhY2U6MTsKKwkJdWludDY0X3Qgcm1sOjE7CisJCXVpbnQ2NF90IHR3c2k6MTsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfNDRfNDQ6MTsKKwkJdWludDY0X3QgcGNpX21zaTo0OworCQl1aW50NjRfdCBwY2lfaW50OjQ7CisJCXVpbnQ2NF90IHVhcnQ6MjsKKwkJdWludDY0X3QgbWJveDoyOworCQl1aW50NjRfdCBncGlvOjE2OworCQl1aW50NjRfdCB3b3JrcToxNjsKKwl9IHM7CisJc3RydWN0IGN2bXhfY2l1X2ludHhfZW4wX3cxc19jbjUyeHggeworCQl1aW50NjRfdCBib290ZG1hOjE7CisJCXVpbnQ2NF90IG1paToxOworCQl1aW50NjRfdCBpcGRwcHRocjoxOworCQl1aW50NjRfdCBwb3dpcToxOworCQl1aW50NjRfdCB0d3NpMjoxOworCQl1aW50NjRfdCByZXNlcnZlZF81N181ODoyOworCQl1aW50NjRfdCB1c2I6MTsKKwkJdWludDY0X3QgdGltZXI6NDsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfNTFfNTE6MTsKKwkJdWludDY0X3QgaXBkX2RycDoxOworCQl1aW50NjRfdCByZXNlcnZlZF80OV80OToxOworCQl1aW50NjRfdCBnbXhfZHJwOjE7CisJCXVpbnQ2NF90IHRyYWNlOjE7CisJCXVpbnQ2NF90IHJtbDoxOworCQl1aW50NjRfdCB0d3NpOjE7CisJCXVpbnQ2NF90IHJlc2VydmVkXzQ0XzQ0OjE7CisJCXVpbnQ2NF90IHBjaV9tc2k6NDsKKwkJdWludDY0X3QgcGNpX2ludDo0OworCQl1aW50NjRfdCB1YXJ0OjI7CisJCXVpbnQ2NF90IG1ib3g6MjsKKwkJdWludDY0X3QgZ3BpbzoxNjsKKwkJdWludDY0X3Qgd29ya3E6MTY7CisJfSBjbjUyeHg7CisJc3RydWN0IGN2bXhfY2l1X2ludHhfZW4wX3cxc19zIGNuNTZ4eDsKKwlzdHJ1Y3QgY3ZteF9jaXVfaW50eF9lbjBfdzFzX2NuNTh4eCB7CisJCXVpbnQ2NF90IHJlc2VydmVkXzU2XzYzOjg7CisJCXVpbnQ2NF90IHRpbWVyOjQ7CisJCXVpbnQ2NF90IGtleV96ZXJvOjE7CisJCXVpbnQ2NF90IGlwZF9kcnA6MTsKKwkJdWludDY0X3QgZ214X2RycDoyOworCQl1aW50NjRfdCB0cmFjZToxOworCQl1aW50NjRfdCBybWw6MTsKKwkJdWludDY0X3QgdHdzaToxOworCQl1aW50NjRfdCByZXNlcnZlZF80NF80NDoxOworCQl1aW50NjRfdCBwY2lfbXNpOjQ7CisJCXVpbnQ2NF90IHBjaV9pbnQ6NDsKKwkJdWludDY0X3QgdWFydDoyOworCQl1aW50NjRfdCBtYm94OjI7CisJCXVpbnQ2NF90IGdwaW86MTY7CisJCXVpbnQ2NF90IHdvcmtxOjE2OworCX0gY241OHh4OworfTsKKwordW5pb24gY3ZteF9jaXVfaW50eF9lbjEgeworCXVpbnQ2NF90IHU2NDsKKwlzdHJ1Y3QgY3ZteF9jaXVfaW50eF9lbjFfcyB7CisJCXVpbnQ2NF90IHJlc2VydmVkXzIwXzYzOjQ0OworCQl1aW50NjRfdCBuYW5kOjE7CisJCXVpbnQ2NF90IG1paTE6MTsKKwkJdWludDY0X3QgdXNiMToxOworCQl1aW50NjRfdCB1YXJ0MjoxOworCQl1aW50NjRfdCB3ZG9nOjE2OworCX0gczsKKwlzdHJ1Y3QgY3ZteF9jaXVfaW50eF9lbjFfY24zMHh4IHsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfMV82Mzo2MzsKKwkJdWludDY0X3Qgd2RvZzoxOworCX0gY24zMHh4OworCXN0cnVjdCBjdm14X2NpdV9pbnR4X2VuMV9jbjMxeHggeworCQl1aW50NjRfdCByZXNlcnZlZF8yXzYzOjYyOworCQl1aW50NjRfdCB3ZG9nOjI7CisJfSBjbjMxeHg7CisJc3RydWN0IGN2bXhfY2l1X2ludHhfZW4xX2NuMzh4eCB7CisJCXVpbnQ2NF90IHJlc2VydmVkXzE2XzYzOjQ4OworCQl1aW50NjRfdCB3ZG9nOjE2OworCX0gY24zOHh4OworCXN0cnVjdCBjdm14X2NpdV9pbnR4X2VuMV9jbjM4eHggY24zOHh4cDI7CisJc3RydWN0IGN2bXhfY2l1X2ludHhfZW4xX2NuMzF4eCBjbjUweHg7CisJc3RydWN0IGN2bXhfY2l1X2ludHhfZW4xX2NuNTJ4eCB7CisJCXVpbnQ2NF90IHJlc2VydmVkXzIwXzYzOjQ0OworCQl1aW50NjRfdCBuYW5kOjE7CisJCXVpbnQ2NF90IG1paTE6MTsKKwkJdWludDY0X3QgdXNiMToxOworCQl1aW50NjRfdCB1YXJ0MjoxOworCQl1aW50NjRfdCByZXNlcnZlZF80XzE1OjEyOworCQl1aW50NjRfdCB3ZG9nOjQ7CisJfSBjbjUyeHg7CisJc3RydWN0IGN2bXhfY2l1X2ludHhfZW4xX2NuNTJ4eHAxIHsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfMTlfNjM6NDU7CisJCXVpbnQ2NF90IG1paTE6MTsKKwkJdWludDY0X3QgdXNiMToxOworCQl1aW50NjRfdCB1YXJ0MjoxOworCQl1aW50NjRfdCByZXNlcnZlZF80XzE1OjEyOworCQl1aW50NjRfdCB3ZG9nOjQ7CisJfSBjbjUyeHhwMTsKKwlzdHJ1Y3QgY3ZteF9jaXVfaW50eF9lbjFfY241Nnh4IHsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfMTJfNjM6NTI7CisJCXVpbnQ2NF90IHdkb2c6MTI7CisJfSBjbjU2eHg7CisJc3RydWN0IGN2bXhfY2l1X2ludHhfZW4xX2NuNTZ4eCBjbjU2eHhwMTsKKwlzdHJ1Y3QgY3ZteF9jaXVfaW50eF9lbjFfY24zOHh4IGNuNTh4eDsKKwlzdHJ1Y3QgY3ZteF9jaXVfaW50eF9lbjFfY24zOHh4IGNuNTh4eHAxOworfTsKKwordW5pb24gY3ZteF9jaXVfaW50eF9lbjFfdzFjIHsKKwl1aW50NjRfdCB1NjQ7CisJc3RydWN0IGN2bXhfY2l1X2ludHhfZW4xX3cxY19zIHsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfMjBfNjM6NDQ7CisJCXVpbnQ2NF90IG5hbmQ6MTsKKwkJdWludDY0X3QgbWlpMToxOworCQl1aW50NjRfdCB1c2IxOjE7CisJCXVpbnQ2NF90IHVhcnQyOjE7CisJCXVpbnQ2NF90IHdkb2c6MTY7CisJfSBzOworCXN0cnVjdCBjdm14X2NpdV9pbnR4X2VuMV93MWNfY241Mnh4IHsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfMjBfNjM6NDQ7CisJCXVpbnQ2NF90IG5hbmQ6MTsKKwkJdWludDY0X3QgbWlpMToxOworCQl1aW50NjRfdCB1c2IxOjE7CisJCXVpbnQ2NF90IHVhcnQyOjE7CisJCXVpbnQ2NF90IHJlc2VydmVkXzRfMTU6MTI7CisJCXVpbnQ2NF90IHdkb2c6NDsKKwl9IGNuNTJ4eDsKKwlzdHJ1Y3QgY3ZteF9jaXVfaW50eF9lbjFfdzFjX2NuNTZ4eCB7CisJCXVpbnQ2NF90IHJlc2VydmVkXzEyXzYzOjUyOworCQl1aW50NjRfdCB3ZG9nOjEyOworCX0gY241Nnh4OworCXN0cnVjdCBjdm14X2NpdV9pbnR4X2VuMV93MWNfY241OHh4IHsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfMTZfNjM6NDg7CisJCXVpbnQ2NF90IHdkb2c6MTY7CisJfSBjbjU4eHg7Cit9OworCit1bmlvbiBjdm14X2NpdV9pbnR4X2VuMV93MXMgeworCXVpbnQ2NF90IHU2NDsKKwlzdHJ1Y3QgY3ZteF9jaXVfaW50eF9lbjFfdzFzX3MgeworCQl1aW50NjRfdCByZXNlcnZlZF8yMF82Mzo0NDsKKwkJdWludDY0X3QgbmFuZDoxOworCQl1aW50NjRfdCBtaWkxOjE7CisJCXVpbnQ2NF90IHVzYjE6MTsKKwkJdWludDY0X3QgdWFydDI6MTsKKwkJdWludDY0X3Qgd2RvZzoxNjsKKwl9IHM7CisJc3RydWN0IGN2bXhfY2l1X2ludHhfZW4xX3cxc19jbjUyeHggeworCQl1aW50NjRfdCByZXNlcnZlZF8yMF82Mzo0NDsKKwkJdWludDY0X3QgbmFuZDoxOworCQl1aW50NjRfdCBtaWkxOjE7CisJCXVpbnQ2NF90IHVzYjE6MTsKKwkJdWludDY0X3QgdWFydDI6MTsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfNF8xNToxMjsKKwkJdWludDY0X3Qgd2RvZzo0OworCX0gY241Mnh4OworCXN0cnVjdCBjdm14X2NpdV9pbnR4X2VuMV93MXNfY241Nnh4IHsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfMTJfNjM6NTI7CisJCXVpbnQ2NF90IHdkb2c6MTI7CisJfSBjbjU2eHg7CisJc3RydWN0IGN2bXhfY2l1X2ludHhfZW4xX3cxc19jbjU4eHggeworCQl1aW50NjRfdCByZXNlcnZlZF8xNl82Mzo0ODsKKwkJdWludDY0X3Qgd2RvZzoxNjsKKwl9IGNuNTh4eDsKK307CisKK3VuaW9uIGN2bXhfY2l1X2ludHhfZW40XzAgeworCXVpbnQ2NF90IHU2NDsKKwlzdHJ1Y3QgY3ZteF9jaXVfaW50eF9lbjRfMF9zIHsKKwkJdWludDY0X3QgYm9vdGRtYToxOworCQl1aW50NjRfdCBtaWk6MTsKKwkJdWludDY0X3QgaXBkcHB0aHI6MTsKKwkJdWludDY0X3QgcG93aXE6MTsKKwkJdWludDY0X3QgdHdzaTI6MTsKKwkJdWludDY0X3QgbXBpOjE7CisJCXVpbnQ2NF90IHBjbToxOworCQl1aW50NjRfdCB1c2I6MTsKKwkJdWludDY0X3QgdGltZXI6NDsKKwkJdWludDY0X3Qga2V5X3plcm86MTsKKwkJdWludDY0X3QgaXBkX2RycDoxOworCQl1aW50NjRfdCBnbXhfZHJwOjI7CisJCXVpbnQ2NF90IHRyYWNlOjE7CisJCXVpbnQ2NF90IHJtbDoxOworCQl1aW50NjRfdCB0d3NpOjE7CisJCXVpbnQ2NF90IHJlc2VydmVkXzQ0XzQ0OjE7CisJCXVpbnQ2NF90IHBjaV9tc2k6NDsKKwkJdWludDY0X3QgcGNpX2ludDo0OworCQl1aW50NjRfdCB1YXJ0OjI7CisJCXVpbnQ2NF90IG1ib3g6MjsKKwkJdWludDY0X3QgZ3BpbzoxNjsKKwkJdWludDY0X3Qgd29ya3E6MTY7CisJfSBzOworCXN0cnVjdCBjdm14X2NpdV9pbnR4X2VuNF8wX2NuNTB4eCB7CisJCXVpbnQ2NF90IHJlc2VydmVkXzU5XzYzOjU7CisJCXVpbnQ2NF90IG1waToxOworCQl1aW50NjRfdCBwY206MTsKKwkJdWludDY0X3QgdXNiOjE7CisJCXVpbnQ2NF90IHRpbWVyOjQ7CisJCXVpbnQ2NF90IHJlc2VydmVkXzUxXzUxOjE7CisJCXVpbnQ2NF90IGlwZF9kcnA6MTsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfNDlfNDk6MTsKKwkJdWludDY0X3QgZ214X2RycDoxOworCQl1aW50NjRfdCByZXNlcnZlZF80N180NzoxOworCQl1aW50NjRfdCBybWw6MTsKKwkJdWludDY0X3QgdHdzaToxOworCQl1aW50NjRfdCByZXNlcnZlZF80NF80NDoxOworCQl1aW50NjRfdCBwY2lfbXNpOjQ7CisJCXVpbnQ2NF90IHBjaV9pbnQ6NDsKKwkJdWludDY0X3QgdWFydDoyOworCQl1aW50NjRfdCBtYm94OjI7CisJCXVpbnQ2NF90IGdwaW86MTY7CisJCXVpbnQ2NF90IHdvcmtxOjE2OworCX0gY241MHh4OworCXN0cnVjdCBjdm14X2NpdV9pbnR4X2VuNF8wX2NuNTJ4eCB7CisJCXVpbnQ2NF90IGJvb3RkbWE6MTsKKwkJdWludDY0X3QgbWlpOjE7CisJCXVpbnQ2NF90IGlwZHBwdGhyOjE7CisJCXVpbnQ2NF90IHBvd2lxOjE7CisJCXVpbnQ2NF90IHR3c2kyOjE7CisJCXVpbnQ2NF90IHJlc2VydmVkXzU3XzU4OjI7CisJCXVpbnQ2NF90IHVzYjoxOworCQl1aW50NjRfdCB0aW1lcjo0OworCQl1aW50NjRfdCByZXNlcnZlZF81MV81MToxOworCQl1aW50NjRfdCBpcGRfZHJwOjE7CisJCXVpbnQ2NF90IHJlc2VydmVkXzQ5XzQ5OjE7CisJCXVpbnQ2NF90IGdteF9kcnA6MTsKKwkJdWludDY0X3QgdHJhY2U6MTsKKwkJdWludDY0X3Qgcm1sOjE7CisJCXVpbnQ2NF90IHR3c2k6MTsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfNDRfNDQ6MTsKKwkJdWludDY0X3QgcGNpX21zaTo0OworCQl1aW50NjRfdCBwY2lfaW50OjQ7CisJCXVpbnQ2NF90IHVhcnQ6MjsKKwkJdWludDY0X3QgbWJveDoyOworCQl1aW50NjRfdCBncGlvOjE2OworCQl1aW50NjRfdCB3b3JrcToxNjsKKwl9IGNuNTJ4eDsKKwlzdHJ1Y3QgY3ZteF9jaXVfaW50eF9lbjRfMF9jbjUyeHggY241Mnh4cDE7CisJc3RydWN0IGN2bXhfY2l1X2ludHhfZW40XzBfY241Nnh4IHsKKwkJdWludDY0X3QgYm9vdGRtYToxOworCQl1aW50NjRfdCBtaWk6MTsKKwkJdWludDY0X3QgaXBkcHB0aHI6MTsKKwkJdWludDY0X3QgcG93aXE6MTsKKwkJdWludDY0X3QgdHdzaTI6MTsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfNTdfNTg6MjsKKwkJdWludDY0X3QgdXNiOjE7CisJCXVpbnQ2NF90IHRpbWVyOjQ7CisJCXVpbnQ2NF90IGtleV96ZXJvOjE7CisJCXVpbnQ2NF90IGlwZF9kcnA6MTsKKwkJdWludDY0X3QgZ214X2RycDoyOworCQl1aW50NjRfdCB0cmFjZToxOworCQl1aW50NjRfdCBybWw6MTsKKwkJdWludDY0X3QgdHdzaToxOworCQl1aW50NjRfdCByZXNlcnZlZF80NF80NDoxOworCQl1aW50NjRfdCBwY2lfbXNpOjQ7CisJCXVpbnQ2NF90IHBjaV9pbnQ6NDsKKwkJdWludDY0X3QgdWFydDoyOworCQl1aW50NjRfdCBtYm94OjI7CisJCXVpbnQ2NF90IGdwaW86MTY7CisJCXVpbnQ2NF90IHdvcmtxOjE2OworCX0gY241Nnh4OworCXN0cnVjdCBjdm14X2NpdV9pbnR4X2VuNF8wX2NuNTZ4eCBjbjU2eHhwMTsKKwlzdHJ1Y3QgY3ZteF9jaXVfaW50eF9lbjRfMF9jbjU4eHggeworCQl1aW50NjRfdCByZXNlcnZlZF81Nl82Mzo4OworCQl1aW50NjRfdCB0aW1lcjo0OworCQl1aW50NjRfdCBrZXlfemVybzoxOworCQl1aW50NjRfdCBpcGRfZHJwOjE7CisJCXVpbnQ2NF90IGdteF9kcnA6MjsKKwkJdWludDY0X3QgdHJhY2U6MTsKKwkJdWludDY0X3Qgcm1sOjE7CisJCXVpbnQ2NF90IHR3c2k6MTsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfNDRfNDQ6MTsKKwkJdWludDY0X3QgcGNpX21zaTo0OworCQl1aW50NjRfdCBwY2lfaW50OjQ7CisJCXVpbnQ2NF90IHVhcnQ6MjsKKwkJdWludDY0X3QgbWJveDoyOworCQl1aW50NjRfdCBncGlvOjE2OworCQl1aW50NjRfdCB3b3JrcToxNjsKKwl9IGNuNTh4eDsKKwlzdHJ1Y3QgY3ZteF9jaXVfaW50eF9lbjRfMF9jbjU4eHggY241OHh4cDE7Cit9OworCit1bmlvbiBjdm14X2NpdV9pbnR4X2VuNF8wX3cxYyB7CisJdWludDY0X3QgdTY0OworCXN0cnVjdCBjdm14X2NpdV9pbnR4X2VuNF8wX3cxY19zIHsKKwkJdWludDY0X3QgYm9vdGRtYToxOworCQl1aW50NjRfdCBtaWk6MTsKKwkJdWludDY0X3QgaXBkcHB0aHI6MTsKKwkJdWludDY0X3QgcG93aXE6MTsKKwkJdWludDY0X3QgdHdzaTI6MTsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfNTdfNTg6MjsKKwkJdWludDY0X3QgdXNiOjE7CisJCXVpbnQ2NF90IHRpbWVyOjQ7CisJCXVpbnQ2NF90IGtleV96ZXJvOjE7CisJCXVpbnQ2NF90IGlwZF9kcnA6MTsKKwkJdWludDY0X3QgZ214X2RycDoyOworCQl1aW50NjRfdCB0cmFjZToxOworCQl1aW50NjRfdCBybWw6MTsKKwkJdWludDY0X3QgdHdzaToxOworCQl1aW50NjRfdCByZXNlcnZlZF80NF80NDoxOworCQl1aW50NjRfdCBwY2lfbXNpOjQ7CisJCXVpbnQ2NF90IHBjaV9pbnQ6NDsKKwkJdWludDY0X3QgdWFydDoyOworCQl1aW50NjRfdCBtYm94OjI7CisJCXVpbnQ2NF90IGdwaW86MTY7CisJCXVpbnQ2NF90IHdvcmtxOjE2OworCX0gczsKKwlzdHJ1Y3QgY3ZteF9jaXVfaW50eF9lbjRfMF93MWNfY241Mnh4IHsKKwkJdWludDY0X3QgYm9vdGRtYToxOworCQl1aW50NjRfdCBtaWk6MTsKKwkJdWludDY0X3QgaXBkcHB0aHI6MTsKKwkJdWludDY0X3QgcG93aXE6MTsKKwkJdWludDY0X3QgdHdzaTI6MTsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfNTdfNTg6MjsKKwkJdWludDY0X3QgdXNiOjE7CisJCXVpbnQ2NF90IHRpbWVyOjQ7CisJCXVpbnQ2NF90IHJlc2VydmVkXzUxXzUxOjE7CisJCXVpbnQ2NF90IGlwZF9kcnA6MTsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfNDlfNDk6MTsKKwkJdWludDY0X3QgZ214X2RycDoxOworCQl1aW50NjRfdCB0cmFjZToxOworCQl1aW50NjRfdCBybWw6MTsKKwkJdWludDY0X3QgdHdzaToxOworCQl1aW50NjRfdCByZXNlcnZlZF80NF80NDoxOworCQl1aW50NjRfdCBwY2lfbXNpOjQ7CisJCXVpbnQ2NF90IHBjaV9pbnQ6NDsKKwkJdWludDY0X3QgdWFydDoyOworCQl1aW50NjRfdCBtYm94OjI7CisJCXVpbnQ2NF90IGdwaW86MTY7CisJCXVpbnQ2NF90IHdvcmtxOjE2OworCX0gY241Mnh4OworCXN0cnVjdCBjdm14X2NpdV9pbnR4X2VuNF8wX3cxY19zIGNuNTZ4eDsKKwlzdHJ1Y3QgY3ZteF9jaXVfaW50eF9lbjRfMF93MWNfY241OHh4IHsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfNTZfNjM6ODsKKwkJdWludDY0X3QgdGltZXI6NDsKKwkJdWludDY0X3Qga2V5X3plcm86MTsKKwkJdWludDY0X3QgaXBkX2RycDoxOworCQl1aW50NjRfdCBnbXhfZHJwOjI7CisJCXVpbnQ2NF90IHRyYWNlOjE7CisJCXVpbnQ2NF90IHJtbDoxOworCQl1aW50NjRfdCB0d3NpOjE7CisJCXVpbnQ2NF90IHJlc2VydmVkXzQ0XzQ0OjE7CisJCXVpbnQ2NF90IHBjaV9tc2k6NDsKKwkJdWludDY0X3QgcGNpX2ludDo0OworCQl1aW50NjRfdCB1YXJ0OjI7CisJCXVpbnQ2NF90IG1ib3g6MjsKKwkJdWludDY0X3QgZ3BpbzoxNjsKKwkJdWludDY0X3Qgd29ya3E6MTY7CisJfSBjbjU4eHg7Cit9OworCit1bmlvbiBjdm14X2NpdV9pbnR4X2VuNF8wX3cxcyB7CisJdWludDY0X3QgdTY0OworCXN0cnVjdCBjdm14X2NpdV9pbnR4X2VuNF8wX3cxc19zIHsKKwkJdWludDY0X3QgYm9vdGRtYToxOworCQl1aW50NjRfdCBtaWk6MTsKKwkJdWludDY0X3QgaXBkcHB0aHI6MTsKKwkJdWludDY0X3QgcG93aXE6MTsKKwkJdWludDY0X3QgdHdzaTI6MTsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfNTdfNTg6MjsKKwkJdWludDY0X3QgdXNiOjE7CisJCXVpbnQ2NF90IHRpbWVyOjQ7CisJCXVpbnQ2NF90IGtleV96ZXJvOjE7CisJCXVpbnQ2NF90IGlwZF9kcnA6MTsKKwkJdWludDY0X3QgZ214X2RycDoyOworCQl1aW50NjRfdCB0cmFjZToxOworCQl1aW50NjRfdCBybWw6MTsKKwkJdWludDY0X3QgdHdzaToxOworCQl1aW50NjRfdCByZXNlcnZlZF80NF80NDoxOworCQl1aW50NjRfdCBwY2lfbXNpOjQ7CisJCXVpbnQ2NF90IHBjaV9pbnQ6NDsKKwkJdWludDY0X3QgdWFydDoyOworCQl1aW50NjRfdCBtYm94OjI7CisJCXVpbnQ2NF90IGdwaW86MTY7CisJCXVpbnQ2NF90IHdvcmtxOjE2OworCX0gczsKKwlzdHJ1Y3QgY3ZteF9jaXVfaW50eF9lbjRfMF93MXNfY241Mnh4IHsKKwkJdWludDY0X3QgYm9vdGRtYToxOworCQl1aW50NjRfdCBtaWk6MTsKKwkJdWludDY0X3QgaXBkcHB0aHI6MTsKKwkJdWludDY0X3QgcG93aXE6MTsKKwkJdWludDY0X3QgdHdzaTI6MTsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfNTdfNTg6MjsKKwkJdWludDY0X3QgdXNiOjE7CisJCXVpbnQ2NF90IHRpbWVyOjQ7CisJCXVpbnQ2NF90IHJlc2VydmVkXzUxXzUxOjE7CisJCXVpbnQ2NF90IGlwZF9kcnA6MTsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfNDlfNDk6MTsKKwkJdWludDY0X3QgZ214X2RycDoxOworCQl1aW50NjRfdCB0cmFjZToxOworCQl1aW50NjRfdCBybWw6MTsKKwkJdWludDY0X3QgdHdzaToxOworCQl1aW50NjRfdCByZXNlcnZlZF80NF80NDoxOworCQl1aW50NjRfdCBwY2lfbXNpOjQ7CisJCXVpbnQ2NF90IHBjaV9pbnQ6NDsKKwkJdWludDY0X3QgdWFydDoyOworCQl1aW50NjRfdCBtYm94OjI7CisJCXVpbnQ2NF90IGdwaW86MTY7CisJCXVpbnQ2NF90IHdvcmtxOjE2OworCX0gY241Mnh4OworCXN0cnVjdCBjdm14X2NpdV9pbnR4X2VuNF8wX3cxc19zIGNuNTZ4eDsKKwlzdHJ1Y3QgY3ZteF9jaXVfaW50eF9lbjRfMF93MXNfY241OHh4IHsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfNTZfNjM6ODsKKwkJdWludDY0X3QgdGltZXI6NDsKKwkJdWludDY0X3Qga2V5X3plcm86MTsKKwkJdWludDY0X3QgaXBkX2RycDoxOworCQl1aW50NjRfdCBnbXhfZHJwOjI7CisJCXVpbnQ2NF90IHRyYWNlOjE7CisJCXVpbnQ2NF90IHJtbDoxOworCQl1aW50NjRfdCB0d3NpOjE7CisJCXVpbnQ2NF90IHJlc2VydmVkXzQ0XzQ0OjE7CisJCXVpbnQ2NF90IHBjaV9tc2k6NDsKKwkJdWludDY0X3QgcGNpX2ludDo0OworCQl1aW50NjRfdCB1YXJ0OjI7CisJCXVpbnQ2NF90IG1ib3g6MjsKKwkJdWludDY0X3QgZ3BpbzoxNjsKKwkJdWludDY0X3Qgd29ya3E6MTY7CisJfSBjbjU4eHg7Cit9OworCit1bmlvbiBjdm14X2NpdV9pbnR4X2VuNF8xIHsKKwl1aW50NjRfdCB1NjQ7CisJc3RydWN0IGN2bXhfY2l1X2ludHhfZW40XzFfcyB7CisJCXVpbnQ2NF90IHJlc2VydmVkXzIwXzYzOjQ0OworCQl1aW50NjRfdCBuYW5kOjE7CisJCXVpbnQ2NF90IG1paTE6MTsKKwkJdWludDY0X3QgdXNiMToxOworCQl1aW50NjRfdCB1YXJ0MjoxOworCQl1aW50NjRfdCB3ZG9nOjE2OworCX0gczsKKwlzdHJ1Y3QgY3ZteF9jaXVfaW50eF9lbjRfMV9jbjUweHggeworCQl1aW50NjRfdCByZXNlcnZlZF8yXzYzOjYyOworCQl1aW50NjRfdCB3ZG9nOjI7CisJfSBjbjUweHg7CisJc3RydWN0IGN2bXhfY2l1X2ludHhfZW40XzFfY241Mnh4IHsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfMjBfNjM6NDQ7CisJCXVpbnQ2NF90IG5hbmQ6MTsKKwkJdWludDY0X3QgbWlpMToxOworCQl1aW50NjRfdCB1c2IxOjE7CisJCXVpbnQ2NF90IHVhcnQyOjE7CisJCXVpbnQ2NF90IHJlc2VydmVkXzRfMTU6MTI7CisJCXVpbnQ2NF90IHdkb2c6NDsKKwl9IGNuNTJ4eDsKKwlzdHJ1Y3QgY3ZteF9jaXVfaW50eF9lbjRfMV9jbjUyeHhwMSB7CisJCXVpbnQ2NF90IHJlc2VydmVkXzE5XzYzOjQ1OworCQl1aW50NjRfdCBtaWkxOjE7CisJCXVpbnQ2NF90IHVzYjE6MTsKKwkJdWludDY0X3QgdWFydDI6MTsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfNF8xNToxMjsKKwkJdWludDY0X3Qgd2RvZzo0OworCX0gY241Mnh4cDE7CisJc3RydWN0IGN2bXhfY2l1X2ludHhfZW40XzFfY241Nnh4IHsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfMTJfNjM6NTI7CisJCXVpbnQ2NF90IHdkb2c6MTI7CisJfSBjbjU2eHg7CisJc3RydWN0IGN2bXhfY2l1X2ludHhfZW40XzFfY241Nnh4IGNuNTZ4eHAxOworCXN0cnVjdCBjdm14X2NpdV9pbnR4X2VuNF8xX2NuNTh4eCB7CisJCXVpbnQ2NF90IHJlc2VydmVkXzE2XzYzOjQ4OworCQl1aW50NjRfdCB3ZG9nOjE2OworCX0gY241OHh4OworCXN0cnVjdCBjdm14X2NpdV9pbnR4X2VuNF8xX2NuNTh4eCBjbjU4eHhwMTsKK307CisKK3VuaW9uIGN2bXhfY2l1X2ludHhfZW40XzFfdzFjIHsKKwl1aW50NjRfdCB1NjQ7CisJc3RydWN0IGN2bXhfY2l1X2ludHhfZW40XzFfdzFjX3MgeworCQl1aW50NjRfdCByZXNlcnZlZF8yMF82Mzo0NDsKKwkJdWludDY0X3QgbmFuZDoxOworCQl1aW50NjRfdCBtaWkxOjE7CisJCXVpbnQ2NF90IHVzYjE6MTsKKwkJdWludDY0X3QgdWFydDI6MTsKKwkJdWludDY0X3Qgd2RvZzoxNjsKKwl9IHM7CisJc3RydWN0IGN2bXhfY2l1X2ludHhfZW40XzFfdzFjX2NuNTJ4eCB7CisJCXVpbnQ2NF90IHJlc2VydmVkXzIwXzYzOjQ0OworCQl1aW50NjRfdCBuYW5kOjE7CisJCXVpbnQ2NF90IG1paTE6MTsKKwkJdWludDY0X3QgdXNiMToxOworCQl1aW50NjRfdCB1YXJ0MjoxOworCQl1aW50NjRfdCByZXNlcnZlZF80XzE1OjEyOworCQl1aW50NjRfdCB3ZG9nOjQ7CisJfSBjbjUyeHg7CisJc3RydWN0IGN2bXhfY2l1X2ludHhfZW40XzFfdzFjX2NuNTZ4eCB7CisJCXVpbnQ2NF90IHJlc2VydmVkXzEyXzYzOjUyOworCQl1aW50NjRfdCB3ZG9nOjEyOworCX0gY241Nnh4OworCXN0cnVjdCBjdm14X2NpdV9pbnR4X2VuNF8xX3cxY19jbjU4eHggeworCQl1aW50NjRfdCByZXNlcnZlZF8xNl82Mzo0ODsKKwkJdWludDY0X3Qgd2RvZzoxNjsKKwl9IGNuNTh4eDsKK307CisKK3VuaW9uIGN2bXhfY2l1X2ludHhfZW40XzFfdzFzIHsKKwl1aW50NjRfdCB1NjQ7CisJc3RydWN0IGN2bXhfY2l1X2ludHhfZW40XzFfdzFzX3MgeworCQl1aW50NjRfdCByZXNlcnZlZF8yMF82Mzo0NDsKKwkJdWludDY0X3QgbmFuZDoxOworCQl1aW50NjRfdCBtaWkxOjE7CisJCXVpbnQ2NF90IHVzYjE6MTsKKwkJdWludDY0X3QgdWFydDI6MTsKKwkJdWludDY0X3Qgd2RvZzoxNjsKKwl9IHM7CisJc3RydWN0IGN2bXhfY2l1X2ludHhfZW40XzFfdzFzX2NuNTJ4eCB7CisJCXVpbnQ2NF90IHJlc2VydmVkXzIwXzYzOjQ0OworCQl1aW50NjRfdCBuYW5kOjE7CisJCXVpbnQ2NF90IG1paTE6MTsKKwkJdWludDY0X3QgdXNiMToxOworCQl1aW50NjRfdCB1YXJ0MjoxOworCQl1aW50NjRfdCByZXNlcnZlZF80XzE1OjEyOworCQl1aW50NjRfdCB3ZG9nOjQ7CisJfSBjbjUyeHg7CisJc3RydWN0IGN2bXhfY2l1X2ludHhfZW40XzFfdzFzX2NuNTZ4eCB7CisJCXVpbnQ2NF90IHJlc2VydmVkXzEyXzYzOjUyOworCQl1aW50NjRfdCB3ZG9nOjEyOworCX0gY241Nnh4OworCXN0cnVjdCBjdm14X2NpdV9pbnR4X2VuNF8xX3cxc19jbjU4eHggeworCQl1aW50NjRfdCByZXNlcnZlZF8xNl82Mzo0ODsKKwkJdWludDY0X3Qgd2RvZzoxNjsKKwl9IGNuNTh4eDsKK307CisKK3VuaW9uIGN2bXhfY2l1X2ludHhfc3VtMCB7CisJdWludDY0X3QgdTY0OworCXN0cnVjdCBjdm14X2NpdV9pbnR4X3N1bTBfcyB7CisJCXVpbnQ2NF90IGJvb3RkbWE6MTsKKwkJdWludDY0X3QgbWlpOjE7CisJCXVpbnQ2NF90IGlwZHBwdGhyOjE7CisJCXVpbnQ2NF90IHBvd2lxOjE7CisJCXVpbnQ2NF90IHR3c2kyOjE7CisJCXVpbnQ2NF90IG1waToxOworCQl1aW50NjRfdCBwY206MTsKKwkJdWludDY0X3QgdXNiOjE7CisJCXVpbnQ2NF90IHRpbWVyOjQ7CisJCXVpbnQ2NF90IGtleV96ZXJvOjE7CisJCXVpbnQ2NF90IGlwZF9kcnA6MTsKKwkJdWludDY0X3QgZ214X2RycDoyOworCQl1aW50NjRfdCB0cmFjZToxOworCQl1aW50NjRfdCBybWw6MTsKKwkJdWludDY0X3QgdHdzaToxOworCQl1aW50NjRfdCB3ZG9nX3N1bToxOworCQl1aW50NjRfdCBwY2lfbXNpOjQ7CisJCXVpbnQ2NF90IHBjaV9pbnQ6NDsKKwkJdWludDY0X3QgdWFydDoyOworCQl1aW50NjRfdCBtYm94OjI7CisJCXVpbnQ2NF90IGdwaW86MTY7CisJCXVpbnQ2NF90IHdvcmtxOjE2OworCX0gczsKKwlzdHJ1Y3QgY3ZteF9jaXVfaW50eF9zdW0wX2NuMzB4eCB7CisJCXVpbnQ2NF90IHJlc2VydmVkXzU5XzYzOjU7CisJCXVpbnQ2NF90IG1waToxOworCQl1aW50NjRfdCBwY206MTsKKwkJdWludDY0X3QgdXNiOjE7CisJCXVpbnQ2NF90IHRpbWVyOjQ7CisJCXVpbnQ2NF90IHJlc2VydmVkXzUxXzUxOjE7CisJCXVpbnQ2NF90IGlwZF9kcnA6MTsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfNDlfNDk6MTsKKwkJdWludDY0X3QgZ214X2RycDoxOworCQl1aW50NjRfdCByZXNlcnZlZF80N180NzoxOworCQl1aW50NjRfdCBybWw6MTsKKwkJdWludDY0X3QgdHdzaToxOworCQl1aW50NjRfdCB3ZG9nX3N1bToxOworCQl1aW50NjRfdCBwY2lfbXNpOjQ7CisJCXVpbnQ2NF90IHBjaV9pbnQ6NDsKKwkJdWludDY0X3QgdWFydDoyOworCQl1aW50NjRfdCBtYm94OjI7CisJCXVpbnQ2NF90IGdwaW86MTY7CisJCXVpbnQ2NF90IHdvcmtxOjE2OworCX0gY24zMHh4OworCXN0cnVjdCBjdm14X2NpdV9pbnR4X3N1bTBfY24zMXh4IHsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfNTlfNjM6NTsKKwkJdWludDY0X3QgbXBpOjE7CisJCXVpbnQ2NF90IHBjbToxOworCQl1aW50NjRfdCB1c2I6MTsKKwkJdWludDY0X3QgdGltZXI6NDsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfNTFfNTE6MTsKKwkJdWludDY0X3QgaXBkX2RycDoxOworCQl1aW50NjRfdCByZXNlcnZlZF80OV80OToxOworCQl1aW50NjRfdCBnbXhfZHJwOjE7CisJCXVpbnQ2NF90IHRyYWNlOjE7CisJCXVpbnQ2NF90IHJtbDoxOworCQl1aW50NjRfdCB0d3NpOjE7CisJCXVpbnQ2NF90IHdkb2dfc3VtOjE7CisJCXVpbnQ2NF90IHBjaV9tc2k6NDsKKwkJdWludDY0X3QgcGNpX2ludDo0OworCQl1aW50NjRfdCB1YXJ0OjI7CisJCXVpbnQ2NF90IG1ib3g6MjsKKwkJdWludDY0X3QgZ3BpbzoxNjsKKwkJdWludDY0X3Qgd29ya3E6MTY7CisJfSBjbjMxeHg7CisJc3RydWN0IGN2bXhfY2l1X2ludHhfc3VtMF9jbjM4eHggeworCQl1aW50NjRfdCByZXNlcnZlZF81Nl82Mzo4OworCQl1aW50NjRfdCB0aW1lcjo0OworCQl1aW50NjRfdCBrZXlfemVybzoxOworCQl1aW50NjRfdCBpcGRfZHJwOjE7CisJCXVpbnQ2NF90IGdteF9kcnA6MjsKKwkJdWludDY0X3QgdHJhY2U6MTsKKwkJdWludDY0X3Qgcm1sOjE7CisJCXVpbnQ2NF90IHR3c2k6MTsKKwkJdWludDY0X3Qgd2RvZ19zdW06MTsKKwkJdWludDY0X3QgcGNpX21zaTo0OworCQl1aW50NjRfdCBwY2lfaW50OjQ7CisJCXVpbnQ2NF90IHVhcnQ6MjsKKwkJdWludDY0X3QgbWJveDoyOworCQl1aW50NjRfdCBncGlvOjE2OworCQl1aW50NjRfdCB3b3JrcToxNjsKKwl9IGNuMzh4eDsKKwlzdHJ1Y3QgY3ZteF9jaXVfaW50eF9zdW0wX2NuMzh4eCBjbjM4eHhwMjsKKwlzdHJ1Y3QgY3ZteF9jaXVfaW50eF9zdW0wX2NuMzB4eCBjbjUweHg7CisJc3RydWN0IGN2bXhfY2l1X2ludHhfc3VtMF9jbjUyeHggeworCQl1aW50NjRfdCBib290ZG1hOjE7CisJCXVpbnQ2NF90IG1paToxOworCQl1aW50NjRfdCBpcGRwcHRocjoxOworCQl1aW50NjRfdCBwb3dpcToxOworCQl1aW50NjRfdCB0d3NpMjoxOworCQl1aW50NjRfdCByZXNlcnZlZF81N181ODoyOworCQl1aW50NjRfdCB1c2I6MTsKKwkJdWludDY0X3QgdGltZXI6NDsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfNTFfNTE6MTsKKwkJdWludDY0X3QgaXBkX2RycDoxOworCQl1aW50NjRfdCByZXNlcnZlZF80OV80OToxOworCQl1aW50NjRfdCBnbXhfZHJwOjE7CisJCXVpbnQ2NF90IHRyYWNlOjE7CisJCXVpbnQ2NF90IHJtbDoxOworCQl1aW50NjRfdCB0d3NpOjE7CisJCXVpbnQ2NF90IHdkb2dfc3VtOjE7CisJCXVpbnQ2NF90IHBjaV9tc2k6NDsKKwkJdWludDY0X3QgcGNpX2ludDo0OworCQl1aW50NjRfdCB1YXJ0OjI7CisJCXVpbnQ2NF90IG1ib3g6MjsKKwkJdWludDY0X3QgZ3BpbzoxNjsKKwkJdWludDY0X3Qgd29ya3E6MTY7CisJfSBjbjUyeHg7CisJc3RydWN0IGN2bXhfY2l1X2ludHhfc3VtMF9jbjUyeHggY241Mnh4cDE7CisJc3RydWN0IGN2bXhfY2l1X2ludHhfc3VtMF9jbjU2eHggeworCQl1aW50NjRfdCBib290ZG1hOjE7CisJCXVpbnQ2NF90IG1paToxOworCQl1aW50NjRfdCBpcGRwcHRocjoxOworCQl1aW50NjRfdCBwb3dpcToxOworCQl1aW50NjRfdCB0d3NpMjoxOworCQl1aW50NjRfdCByZXNlcnZlZF81N181ODoyOworCQl1aW50NjRfdCB1c2I6MTsKKwkJdWludDY0X3QgdGltZXI6NDsKKwkJdWludDY0X3Qga2V5X3plcm86MTsKKwkJdWludDY0X3QgaXBkX2RycDoxOworCQl1aW50NjRfdCBnbXhfZHJwOjI7CisJCXVpbnQ2NF90IHRyYWNlOjE7CisJCXVpbnQ2NF90IHJtbDoxOworCQl1aW50NjRfdCB0d3NpOjE7CisJCXVpbnQ2NF90IHdkb2dfc3VtOjE7CisJCXVpbnQ2NF90IHBjaV9tc2k6NDsKKwkJdWludDY0X3QgcGNpX2ludDo0OworCQl1aW50NjRfdCB1YXJ0OjI7CisJCXVpbnQ2NF90IG1ib3g6MjsKKwkJdWludDY0X3QgZ3BpbzoxNjsKKwkJdWludDY0X3Qgd29ya3E6MTY7CisJfSBjbjU2eHg7CisJc3RydWN0IGN2bXhfY2l1X2ludHhfc3VtMF9jbjU2eHggY241Nnh4cDE7CisJc3RydWN0IGN2bXhfY2l1X2ludHhfc3VtMF9jbjM4eHggY241OHh4OworCXN0cnVjdCBjdm14X2NpdV9pbnR4X3N1bTBfY24zOHh4IGNuNTh4eHAxOworfTsKKwordW5pb24gY3ZteF9jaXVfaW50eF9zdW00IHsKKwl1aW50NjRfdCB1NjQ7CisJc3RydWN0IGN2bXhfY2l1X2ludHhfc3VtNF9zIHsKKwkJdWludDY0X3QgYm9vdGRtYToxOworCQl1aW50NjRfdCBtaWk6MTsKKwkJdWludDY0X3QgaXBkcHB0aHI6MTsKKwkJdWludDY0X3QgcG93aXE6MTsKKwkJdWludDY0X3QgdHdzaTI6MTsKKwkJdWludDY0X3QgbXBpOjE7CisJCXVpbnQ2NF90IHBjbToxOworCQl1aW50NjRfdCB1c2I6MTsKKwkJdWludDY0X3QgdGltZXI6NDsKKwkJdWludDY0X3Qga2V5X3plcm86MTsKKwkJdWludDY0X3QgaXBkX2RycDoxOworCQl1aW50NjRfdCBnbXhfZHJwOjI7CisJCXVpbnQ2NF90IHRyYWNlOjE7CisJCXVpbnQ2NF90IHJtbDoxOworCQl1aW50NjRfdCB0d3NpOjE7CisJCXVpbnQ2NF90IHdkb2dfc3VtOjE7CisJCXVpbnQ2NF90IHBjaV9tc2k6NDsKKwkJdWludDY0X3QgcGNpX2ludDo0OworCQl1aW50NjRfdCB1YXJ0OjI7CisJCXVpbnQ2NF90IG1ib3g6MjsKKwkJdWludDY0X3QgZ3BpbzoxNjsKKwkJdWludDY0X3Qgd29ya3E6MTY7CisJfSBzOworCXN0cnVjdCBjdm14X2NpdV9pbnR4X3N1bTRfY241MHh4IHsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfNTlfNjM6NTsKKwkJdWludDY0X3QgbXBpOjE7CisJCXVpbnQ2NF90IHBjbToxOworCQl1aW50NjRfdCB1c2I6MTsKKwkJdWludDY0X3QgdGltZXI6NDsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfNTFfNTE6MTsKKwkJdWludDY0X3QgaXBkX2RycDoxOworCQl1aW50NjRfdCByZXNlcnZlZF80OV80OToxOworCQl1aW50NjRfdCBnbXhfZHJwOjE7CisJCXVpbnQ2NF90IHJlc2VydmVkXzQ3XzQ3OjE7CisJCXVpbnQ2NF90IHJtbDoxOworCQl1aW50NjRfdCB0d3NpOjE7CisJCXVpbnQ2NF90IHdkb2dfc3VtOjE7CisJCXVpbnQ2NF90IHBjaV9tc2k6NDsKKwkJdWludDY0X3QgcGNpX2ludDo0OworCQl1aW50NjRfdCB1YXJ0OjI7CisJCXVpbnQ2NF90IG1ib3g6MjsKKwkJdWludDY0X3QgZ3BpbzoxNjsKKwkJdWludDY0X3Qgd29ya3E6MTY7CisJfSBjbjUweHg7CisJc3RydWN0IGN2bXhfY2l1X2ludHhfc3VtNF9jbjUyeHggeworCQl1aW50NjRfdCBib290ZG1hOjE7CisJCXVpbnQ2NF90IG1paToxOworCQl1aW50NjRfdCBpcGRwcHRocjoxOworCQl1aW50NjRfdCBwb3dpcToxOworCQl1aW50NjRfdCB0d3NpMjoxOworCQl1aW50NjRfdCByZXNlcnZlZF81N181ODoyOworCQl1aW50NjRfdCB1c2I6MTsKKwkJdWludDY0X3QgdGltZXI6NDsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfNTFfNTE6MTsKKwkJdWludDY0X3QgaXBkX2RycDoxOworCQl1aW50NjRfdCByZXNlcnZlZF80OV80OToxOworCQl1aW50NjRfdCBnbXhfZHJwOjE7CisJCXVpbnQ2NF90IHRyYWNlOjE7CisJCXVpbnQ2NF90IHJtbDoxOworCQl1aW50NjRfdCB0d3NpOjE7CisJCXVpbnQ2NF90IHdkb2dfc3VtOjE7CisJCXVpbnQ2NF90IHBjaV9tc2k6NDsKKwkJdWludDY0X3QgcGNpX2ludDo0OworCQl1aW50NjRfdCB1YXJ0OjI7CisJCXVpbnQ2NF90IG1ib3g6MjsKKwkJdWludDY0X3QgZ3BpbzoxNjsKKwkJdWludDY0X3Qgd29ya3E6MTY7CisJfSBjbjUyeHg7CisJc3RydWN0IGN2bXhfY2l1X2ludHhfc3VtNF9jbjUyeHggY241Mnh4cDE7CisJc3RydWN0IGN2bXhfY2l1X2ludHhfc3VtNF9jbjU2eHggeworCQl1aW50NjRfdCBib290ZG1hOjE7CisJCXVpbnQ2NF90IG1paToxOworCQl1aW50NjRfdCBpcGRwcHRocjoxOworCQl1aW50NjRfdCBwb3dpcToxOworCQl1aW50NjRfdCB0d3NpMjoxOworCQl1aW50NjRfdCByZXNlcnZlZF81N181ODoyOworCQl1aW50NjRfdCB1c2I6MTsKKwkJdWludDY0X3QgdGltZXI6NDsKKwkJdWludDY0X3Qga2V5X3plcm86MTsKKwkJdWludDY0X3QgaXBkX2RycDoxOworCQl1aW50NjRfdCBnbXhfZHJwOjI7CisJCXVpbnQ2NF90IHRyYWNlOjE7CisJCXVpbnQ2NF90IHJtbDoxOworCQl1aW50NjRfdCB0d3NpOjE7CisJCXVpbnQ2NF90IHdkb2dfc3VtOjE7CisJCXVpbnQ2NF90IHBjaV9tc2k6NDsKKwkJdWludDY0X3QgcGNpX2ludDo0OworCQl1aW50NjRfdCB1YXJ0OjI7CisJCXVpbnQ2NF90IG1ib3g6MjsKKwkJdWludDY0X3QgZ3BpbzoxNjsKKwkJdWludDY0X3Qgd29ya3E6MTY7CisJfSBjbjU2eHg7CisJc3RydWN0IGN2bXhfY2l1X2ludHhfc3VtNF9jbjU2eHggY241Nnh4cDE7CisJc3RydWN0IGN2bXhfY2l1X2ludHhfc3VtNF9jbjU4eHggeworCQl1aW50NjRfdCByZXNlcnZlZF81Nl82Mzo4OworCQl1aW50NjRfdCB0aW1lcjo0OworCQl1aW50NjRfdCBrZXlfemVybzoxOworCQl1aW50NjRfdCBpcGRfZHJwOjE7CisJCXVpbnQ2NF90IGdteF9kcnA6MjsKKwkJdWludDY0X3QgdHJhY2U6MTsKKwkJdWludDY0X3Qgcm1sOjE7CisJCXVpbnQ2NF90IHR3c2k6MTsKKwkJdWludDY0X3Qgd2RvZ19zdW06MTsKKwkJdWludDY0X3QgcGNpX21zaTo0OworCQl1aW50NjRfdCBwY2lfaW50OjQ7CisJCXVpbnQ2NF90IHVhcnQ6MjsKKwkJdWludDY0X3QgbWJveDoyOworCQl1aW50NjRfdCBncGlvOjE2OworCQl1aW50NjRfdCB3b3JrcToxNjsKKwl9IGNuNTh4eDsKKwlzdHJ1Y3QgY3ZteF9jaXVfaW50eF9zdW00X2NuNTh4eCBjbjU4eHhwMTsKK307CisKK3VuaW9uIGN2bXhfY2l1X2ludF9zdW0xIHsKKwl1aW50NjRfdCB1NjQ7CisJc3RydWN0IGN2bXhfY2l1X2ludF9zdW0xX3MgeworCQl1aW50NjRfdCByZXNlcnZlZF8yMF82Mzo0NDsKKwkJdWludDY0X3QgbmFuZDoxOworCQl1aW50NjRfdCBtaWkxOjE7CisJCXVpbnQ2NF90IHVzYjE6MTsKKwkJdWludDY0X3QgdWFydDI6MTsKKwkJdWludDY0X3Qgd2RvZzoxNjsKKwl9IHM7CisJc3RydWN0IGN2bXhfY2l1X2ludF9zdW0xX2NuMzB4eCB7CisJCXVpbnQ2NF90IHJlc2VydmVkXzFfNjM6NjM7CisJCXVpbnQ2NF90IHdkb2c6MTsKKwl9IGNuMzB4eDsKKwlzdHJ1Y3QgY3ZteF9jaXVfaW50X3N1bTFfY24zMXh4IHsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfMl82Mzo2MjsKKwkJdWludDY0X3Qgd2RvZzoyOworCX0gY24zMXh4OworCXN0cnVjdCBjdm14X2NpdV9pbnRfc3VtMV9jbjM4eHggeworCQl1aW50NjRfdCByZXNlcnZlZF8xNl82Mzo0ODsKKwkJdWludDY0X3Qgd2RvZzoxNjsKKwl9IGNuMzh4eDsKKwlzdHJ1Y3QgY3ZteF9jaXVfaW50X3N1bTFfY24zOHh4IGNuMzh4eHAyOworCXN0cnVjdCBjdm14X2NpdV9pbnRfc3VtMV9jbjMxeHggY241MHh4OworCXN0cnVjdCBjdm14X2NpdV9pbnRfc3VtMV9jbjUyeHggeworCQl1aW50NjRfdCByZXNlcnZlZF8yMF82Mzo0NDsKKwkJdWludDY0X3QgbmFuZDoxOworCQl1aW50NjRfdCBtaWkxOjE7CisJCXVpbnQ2NF90IHVzYjE6MTsKKwkJdWludDY0X3QgdWFydDI6MTsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfNF8xNToxMjsKKwkJdWludDY0X3Qgd2RvZzo0OworCX0gY241Mnh4OworCXN0cnVjdCBjdm14X2NpdV9pbnRfc3VtMV9jbjUyeHhwMSB7CisJCXVpbnQ2NF90IHJlc2VydmVkXzE5XzYzOjQ1OworCQl1aW50NjRfdCBtaWkxOjE7CisJCXVpbnQ2NF90IHVzYjE6MTsKKwkJdWludDY0X3QgdWFydDI6MTsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfNF8xNToxMjsKKwkJdWludDY0X3Qgd2RvZzo0OworCX0gY241Mnh4cDE7CisJc3RydWN0IGN2bXhfY2l1X2ludF9zdW0xX2NuNTZ4eCB7CisJCXVpbnQ2NF90IHJlc2VydmVkXzEyXzYzOjUyOworCQl1aW50NjRfdCB3ZG9nOjEyOworCX0gY241Nnh4OworCXN0cnVjdCBjdm14X2NpdV9pbnRfc3VtMV9jbjU2eHggY241Nnh4cDE7CisJc3RydWN0IGN2bXhfY2l1X2ludF9zdW0xX2NuMzh4eCBjbjU4eHg7CisJc3RydWN0IGN2bXhfY2l1X2ludF9zdW0xX2NuMzh4eCBjbjU4eHhwMTsKK307CisKK3VuaW9uIGN2bXhfY2l1X21ib3hfY2xyeCB7CisJdWludDY0X3QgdTY0OworCXN0cnVjdCBjdm14X2NpdV9tYm94X2NscnhfcyB7CisJCXVpbnQ2NF90IHJlc2VydmVkXzMyXzYzOjMyOworCQl1aW50NjRfdCBiaXRzOjMyOworCX0gczsKKwlzdHJ1Y3QgY3ZteF9jaXVfbWJveF9jbHJ4X3MgY24zMHh4OworCXN0cnVjdCBjdm14X2NpdV9tYm94X2NscnhfcyBjbjMxeHg7CisJc3RydWN0IGN2bXhfY2l1X21ib3hfY2xyeF9zIGNuMzh4eDsKKwlzdHJ1Y3QgY3ZteF9jaXVfbWJveF9jbHJ4X3MgY24zOHh4cDI7CisJc3RydWN0IGN2bXhfY2l1X21ib3hfY2xyeF9zIGNuNTB4eDsKKwlzdHJ1Y3QgY3ZteF9jaXVfbWJveF9jbHJ4X3MgY241Mnh4OworCXN0cnVjdCBjdm14X2NpdV9tYm94X2NscnhfcyBjbjUyeHhwMTsKKwlzdHJ1Y3QgY3ZteF9jaXVfbWJveF9jbHJ4X3MgY241Nnh4OworCXN0cnVjdCBjdm14X2NpdV9tYm94X2NscnhfcyBjbjU2eHhwMTsKKwlzdHJ1Y3QgY3ZteF9jaXVfbWJveF9jbHJ4X3MgY241OHh4OworCXN0cnVjdCBjdm14X2NpdV9tYm94X2NscnhfcyBjbjU4eHhwMTsKK307CisKK3VuaW9uIGN2bXhfY2l1X21ib3hfc2V0eCB7CisJdWludDY0X3QgdTY0OworCXN0cnVjdCBjdm14X2NpdV9tYm94X3NldHhfcyB7CisJCXVpbnQ2NF90IHJlc2VydmVkXzMyXzYzOjMyOworCQl1aW50NjRfdCBiaXRzOjMyOworCX0gczsKKwlzdHJ1Y3QgY3ZteF9jaXVfbWJveF9zZXR4X3MgY24zMHh4OworCXN0cnVjdCBjdm14X2NpdV9tYm94X3NldHhfcyBjbjMxeHg7CisJc3RydWN0IGN2bXhfY2l1X21ib3hfc2V0eF9zIGNuMzh4eDsKKwlzdHJ1Y3QgY3ZteF9jaXVfbWJveF9zZXR4X3MgY24zOHh4cDI7CisJc3RydWN0IGN2bXhfY2l1X21ib3hfc2V0eF9zIGNuNTB4eDsKKwlzdHJ1Y3QgY3ZteF9jaXVfbWJveF9zZXR4X3MgY241Mnh4OworCXN0cnVjdCBjdm14X2NpdV9tYm94X3NldHhfcyBjbjUyeHhwMTsKKwlzdHJ1Y3QgY3ZteF9jaXVfbWJveF9zZXR4X3MgY241Nnh4OworCXN0cnVjdCBjdm14X2NpdV9tYm94X3NldHhfcyBjbjU2eHhwMTsKKwlzdHJ1Y3QgY3ZteF9jaXVfbWJveF9zZXR4X3MgY241OHh4OworCXN0cnVjdCBjdm14X2NpdV9tYm94X3NldHhfcyBjbjU4eHhwMTsKK307CisKK3VuaW9uIGN2bXhfY2l1X25taSB7CisJdWludDY0X3QgdTY0OworCXN0cnVjdCBjdm14X2NpdV9ubWlfcyB7CisJCXVpbnQ2NF90IHJlc2VydmVkXzE2XzYzOjQ4OworCQl1aW50NjRfdCBubWk6MTY7CisJfSBzOworCXN0cnVjdCBjdm14X2NpdV9ubWlfY24zMHh4IHsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfMV82Mzo2MzsKKwkJdWludDY0X3Qgbm1pOjE7CisJfSBjbjMweHg7CisJc3RydWN0IGN2bXhfY2l1X25taV9jbjMxeHggeworCQl1aW50NjRfdCByZXNlcnZlZF8yXzYzOjYyOworCQl1aW50NjRfdCBubWk6MjsKKwl9IGNuMzF4eDsKKwlzdHJ1Y3QgY3ZteF9jaXVfbm1pX3MgY24zOHh4OworCXN0cnVjdCBjdm14X2NpdV9ubWlfcyBjbjM4eHhwMjsKKwlzdHJ1Y3QgY3ZteF9jaXVfbm1pX2NuMzF4eCBjbjUweHg7CisJc3RydWN0IGN2bXhfY2l1X25taV9jbjUyeHggeworCQl1aW50NjRfdCByZXNlcnZlZF80XzYzOjYwOworCQl1aW50NjRfdCBubWk6NDsKKwl9IGNuNTJ4eDsKKwlzdHJ1Y3QgY3ZteF9jaXVfbm1pX2NuNTJ4eCBjbjUyeHhwMTsKKwlzdHJ1Y3QgY3ZteF9jaXVfbm1pX2NuNTZ4eCB7CisJCXVpbnQ2NF90IHJlc2VydmVkXzEyXzYzOjUyOworCQl1aW50NjRfdCBubWk6MTI7CisJfSBjbjU2eHg7CisJc3RydWN0IGN2bXhfY2l1X25taV9jbjU2eHggY241Nnh4cDE7CisJc3RydWN0IGN2bXhfY2l1X25taV9zIGNuNTh4eDsKKwlzdHJ1Y3QgY3ZteF9jaXVfbm1pX3MgY241OHh4cDE7Cit9OworCit1bmlvbiBjdm14X2NpdV9wY2lfaW50YSB7CisJdWludDY0X3QgdTY0OworCXN0cnVjdCBjdm14X2NpdV9wY2lfaW50YV9zIHsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfMl82Mzo2MjsKKwkJdWludDY0X3QgaW50cjoyOworCX0gczsKKwlzdHJ1Y3QgY3ZteF9jaXVfcGNpX2ludGFfcyBjbjMweHg7CisJc3RydWN0IGN2bXhfY2l1X3BjaV9pbnRhX3MgY24zMXh4OworCXN0cnVjdCBjdm14X2NpdV9wY2lfaW50YV9zIGNuMzh4eDsKKwlzdHJ1Y3QgY3ZteF9jaXVfcGNpX2ludGFfcyBjbjM4eHhwMjsKKwlzdHJ1Y3QgY3ZteF9jaXVfcGNpX2ludGFfcyBjbjUweHg7CisJc3RydWN0IGN2bXhfY2l1X3BjaV9pbnRhX3MgY241Mnh4OworCXN0cnVjdCBjdm14X2NpdV9wY2lfaW50YV9zIGNuNTJ4eHAxOworCXN0cnVjdCBjdm14X2NpdV9wY2lfaW50YV9zIGNuNTZ4eDsKKwlzdHJ1Y3QgY3ZteF9jaXVfcGNpX2ludGFfcyBjbjU2eHhwMTsKKwlzdHJ1Y3QgY3ZteF9jaXVfcGNpX2ludGFfcyBjbjU4eHg7CisJc3RydWN0IGN2bXhfY2l1X3BjaV9pbnRhX3MgY241OHh4cDE7Cit9OworCit1bmlvbiBjdm14X2NpdV9wcF9kYmcgeworCXVpbnQ2NF90IHU2NDsKKwlzdHJ1Y3QgY3ZteF9jaXVfcHBfZGJnX3MgeworCQl1aW50NjRfdCByZXNlcnZlZF8xNl82Mzo0ODsKKwkJdWludDY0X3QgcHBkYmc6MTY7CisJfSBzOworCXN0cnVjdCBjdm14X2NpdV9wcF9kYmdfY24zMHh4IHsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfMV82Mzo2MzsKKwkJdWludDY0X3QgcHBkYmc6MTsKKwl9IGNuMzB4eDsKKwlzdHJ1Y3QgY3ZteF9jaXVfcHBfZGJnX2NuMzF4eCB7CisJCXVpbnQ2NF90IHJlc2VydmVkXzJfNjM6NjI7CisJCXVpbnQ2NF90IHBwZGJnOjI7CisJfSBjbjMxeHg7CisJc3RydWN0IGN2bXhfY2l1X3BwX2RiZ19zIGNuMzh4eDsKKwlzdHJ1Y3QgY3ZteF9jaXVfcHBfZGJnX3MgY24zOHh4cDI7CisJc3RydWN0IGN2bXhfY2l1X3BwX2RiZ19jbjMxeHggY241MHh4OworCXN0cnVjdCBjdm14X2NpdV9wcF9kYmdfY241Mnh4IHsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfNF82Mzo2MDsKKwkJdWludDY0X3QgcHBkYmc6NDsKKwl9IGNuNTJ4eDsKKwlzdHJ1Y3QgY3ZteF9jaXVfcHBfZGJnX2NuNTJ4eCBjbjUyeHhwMTsKKwlzdHJ1Y3QgY3ZteF9jaXVfcHBfZGJnX2NuNTZ4eCB7CisJCXVpbnQ2NF90IHJlc2VydmVkXzEyXzYzOjUyOworCQl1aW50NjRfdCBwcGRiZzoxMjsKKwl9IGNuNTZ4eDsKKwlzdHJ1Y3QgY3ZteF9jaXVfcHBfZGJnX2NuNTZ4eCBjbjU2eHhwMTsKKwlzdHJ1Y3QgY3ZteF9jaXVfcHBfZGJnX3MgY241OHh4OworCXN0cnVjdCBjdm14X2NpdV9wcF9kYmdfcyBjbjU4eHhwMTsKK307CisKK3VuaW9uIGN2bXhfY2l1X3BwX3Bva2V4IHsKKwl1aW50NjRfdCB1NjQ7CisJc3RydWN0IGN2bXhfY2l1X3BwX3Bva2V4X3MgeworCQl1aW50NjRfdCByZXNlcnZlZF8wXzYzOjY0OworCX0gczsKKwlzdHJ1Y3QgY3ZteF9jaXVfcHBfcG9rZXhfcyBjbjMweHg7CisJc3RydWN0IGN2bXhfY2l1X3BwX3Bva2V4X3MgY24zMXh4OworCXN0cnVjdCBjdm14X2NpdV9wcF9wb2tleF9zIGNuMzh4eDsKKwlzdHJ1Y3QgY3ZteF9jaXVfcHBfcG9rZXhfcyBjbjM4eHhwMjsKKwlzdHJ1Y3QgY3ZteF9jaXVfcHBfcG9rZXhfcyBjbjUweHg7CisJc3RydWN0IGN2bXhfY2l1X3BwX3Bva2V4X3MgY241Mnh4OworCXN0cnVjdCBjdm14X2NpdV9wcF9wb2tleF9zIGNuNTJ4eHAxOworCXN0cnVjdCBjdm14X2NpdV9wcF9wb2tleF9zIGNuNTZ4eDsKKwlzdHJ1Y3QgY3ZteF9jaXVfcHBfcG9rZXhfcyBjbjU2eHhwMTsKKwlzdHJ1Y3QgY3ZteF9jaXVfcHBfcG9rZXhfcyBjbjU4eHg7CisJc3RydWN0IGN2bXhfY2l1X3BwX3Bva2V4X3MgY241OHh4cDE7Cit9OworCit1bmlvbiBjdm14X2NpdV9wcF9yc3QgeworCXVpbnQ2NF90IHU2NDsKKwlzdHJ1Y3QgY3ZteF9jaXVfcHBfcnN0X3MgeworCQl1aW50NjRfdCByZXNlcnZlZF8xNl82Mzo0ODsKKwkJdWludDY0X3QgcnN0OjE1OworCQl1aW50NjRfdCByc3QwOjE7CisJfSBzOworCXN0cnVjdCBjdm14X2NpdV9wcF9yc3RfY24zMHh4IHsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfMV82Mzo2MzsKKwkJdWludDY0X3QgcnN0MDoxOworCX0gY24zMHh4OworCXN0cnVjdCBjdm14X2NpdV9wcF9yc3RfY24zMXh4IHsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfMl82Mzo2MjsKKwkJdWludDY0X3QgcnN0OjE7CisJCXVpbnQ2NF90IHJzdDA6MTsKKwl9IGNuMzF4eDsKKwlzdHJ1Y3QgY3ZteF9jaXVfcHBfcnN0X3MgY24zOHh4OworCXN0cnVjdCBjdm14X2NpdV9wcF9yc3RfcyBjbjM4eHhwMjsKKwlzdHJ1Y3QgY3ZteF9jaXVfcHBfcnN0X2NuMzF4eCBjbjUweHg7CisJc3RydWN0IGN2bXhfY2l1X3BwX3JzdF9jbjUyeHggeworCQl1aW50NjRfdCByZXNlcnZlZF80XzYzOjYwOworCQl1aW50NjRfdCByc3Q6MzsKKwkJdWludDY0X3QgcnN0MDoxOworCX0gY241Mnh4OworCXN0cnVjdCBjdm14X2NpdV9wcF9yc3RfY241Mnh4IGNuNTJ4eHAxOworCXN0cnVjdCBjdm14X2NpdV9wcF9yc3RfY241Nnh4IHsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfMTJfNjM6NTI7CisJCXVpbnQ2NF90IHJzdDoxMTsKKwkJdWludDY0X3QgcnN0MDoxOworCX0gY241Nnh4OworCXN0cnVjdCBjdm14X2NpdV9wcF9yc3RfY241Nnh4IGNuNTZ4eHAxOworCXN0cnVjdCBjdm14X2NpdV9wcF9yc3RfcyBjbjU4eHg7CisJc3RydWN0IGN2bXhfY2l1X3BwX3JzdF9zIGNuNTh4eHAxOworfTsKKwordW5pb24gY3ZteF9jaXVfcWxtX2Rjb2sgeworCXVpbnQ2NF90IHU2NDsKKwlzdHJ1Y3QgY3ZteF9jaXVfcWxtX2Rjb2tfcyB7CisJCXVpbnQ2NF90IHJlc2VydmVkXzRfNjM6NjA7CisJCXVpbnQ2NF90IHFsbV9kY29rOjQ7CisJfSBzOworCXN0cnVjdCBjdm14X2NpdV9xbG1fZGNva19jbjUyeHggeworCQl1aW50NjRfdCByZXNlcnZlZF8yXzYzOjYyOworCQl1aW50NjRfdCBxbG1fZGNvazoyOworCX0gY241Mnh4OworCXN0cnVjdCBjdm14X2NpdV9xbG1fZGNva19jbjUyeHggY241Mnh4cDE7CisJc3RydWN0IGN2bXhfY2l1X3FsbV9kY29rX3MgY241Nnh4OworCXN0cnVjdCBjdm14X2NpdV9xbG1fZGNva19zIGNuNTZ4eHAxOworfTsKKwordW5pb24gY3ZteF9jaXVfcWxtX2p0Z2MgeworCXVpbnQ2NF90IHU2NDsKKwlzdHJ1Y3QgY3ZteF9jaXVfcWxtX2p0Z2NfcyB7CisJCXVpbnQ2NF90IHJlc2VydmVkXzExXzYzOjUzOworCQl1aW50NjRfdCBjbGtfZGl2OjM7CisJCXVpbnQ2NF90IHJlc2VydmVkXzZfNzoyOworCQl1aW50NjRfdCBtdXhfc2VsOjI7CisJCXVpbnQ2NF90IGJ5cGFzczo0OworCX0gczsKKwlzdHJ1Y3QgY3ZteF9jaXVfcWxtX2p0Z2NfY241Mnh4IHsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfMTFfNjM6NTM7CisJCXVpbnQ2NF90IGNsa19kaXY6MzsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfNV83OjM7CisJCXVpbnQ2NF90IG11eF9zZWw6MTsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfMl8zOjI7CisJCXVpbnQ2NF90IGJ5cGFzczoyOworCX0gY241Mnh4OworCXN0cnVjdCBjdm14X2NpdV9xbG1fanRnY19jbjUyeHggY241Mnh4cDE7CisJc3RydWN0IGN2bXhfY2l1X3FsbV9qdGdjX3MgY241Nnh4OworCXN0cnVjdCBjdm14X2NpdV9xbG1fanRnY19zIGNuNTZ4eHAxOworfTsKKwordW5pb24gY3ZteF9jaXVfcWxtX2p0Z2QgeworCXVpbnQ2NF90IHU2NDsKKwlzdHJ1Y3QgY3ZteF9jaXVfcWxtX2p0Z2RfcyB7CisJCXVpbnQ2NF90IGNhcHR1cmU6MTsKKwkJdWludDY0X3Qgc2hpZnQ6MTsKKwkJdWludDY0X3QgdXBkYXRlOjE7CisJCXVpbnQ2NF90IHJlc2VydmVkXzQ0XzYwOjE3OworCQl1aW50NjRfdCBzZWxlY3Q6NDsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfMzdfMzk6MzsKKwkJdWludDY0X3Qgc2hmdF9jbnQ6NTsKKwkJdWludDY0X3Qgc2hmdF9yZWc6MzI7CisJfSBzOworCXN0cnVjdCBjdm14X2NpdV9xbG1fanRnZF9jbjUyeHggeworCQl1aW50NjRfdCBjYXB0dXJlOjE7CisJCXVpbnQ2NF90IHNoaWZ0OjE7CisJCXVpbnQ2NF90IHVwZGF0ZToxOworCQl1aW50NjRfdCByZXNlcnZlZF80Ml82MDoxOTsKKwkJdWludDY0X3Qgc2VsZWN0OjI7CisJCXVpbnQ2NF90IHJlc2VydmVkXzM3XzM5OjM7CisJCXVpbnQ2NF90IHNoZnRfY250OjU7CisJCXVpbnQ2NF90IHNoZnRfcmVnOjMyOworCX0gY241Mnh4OworCXN0cnVjdCBjdm14X2NpdV9xbG1fanRnZF9jbjUyeHggY241Mnh4cDE7CisJc3RydWN0IGN2bXhfY2l1X3FsbV9qdGdkX3MgY241Nnh4OworCXN0cnVjdCBjdm14X2NpdV9xbG1fanRnZF9jbjU2eHhwMSB7CisJCXVpbnQ2NF90IGNhcHR1cmU6MTsKKwkJdWludDY0X3Qgc2hpZnQ6MTsKKwkJdWludDY0X3QgdXBkYXRlOjE7CisJCXVpbnQ2NF90IHJlc2VydmVkXzM3XzYwOjI0OworCQl1aW50NjRfdCBzaGZ0X2NudDo1OworCQl1aW50NjRfdCBzaGZ0X3JlZzozMjsKKwl9IGNuNTZ4eHAxOworfTsKKwordW5pb24gY3ZteF9jaXVfc29mdF9iaXN0IHsKKwl1aW50NjRfdCB1NjQ7CisJc3RydWN0IGN2bXhfY2l1X3NvZnRfYmlzdF9zIHsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfMV82Mzo2MzsKKwkJdWludDY0X3Qgc29mdF9iaXN0OjE7CisJfSBzOworCXN0cnVjdCBjdm14X2NpdV9zb2Z0X2Jpc3RfcyBjbjMweHg7CisJc3RydWN0IGN2bXhfY2l1X3NvZnRfYmlzdF9zIGNuMzF4eDsKKwlzdHJ1Y3QgY3ZteF9jaXVfc29mdF9iaXN0X3MgY24zOHh4OworCXN0cnVjdCBjdm14X2NpdV9zb2Z0X2Jpc3RfcyBjbjM4eHhwMjsKKwlzdHJ1Y3QgY3ZteF9jaXVfc29mdF9iaXN0X3MgY241MHh4OworCXN0cnVjdCBjdm14X2NpdV9zb2Z0X2Jpc3RfcyBjbjUyeHg7CisJc3RydWN0IGN2bXhfY2l1X3NvZnRfYmlzdF9zIGNuNTJ4eHAxOworCXN0cnVjdCBjdm14X2NpdV9zb2Z0X2Jpc3RfcyBjbjU2eHg7CisJc3RydWN0IGN2bXhfY2l1X3NvZnRfYmlzdF9zIGNuNTZ4eHAxOworCXN0cnVjdCBjdm14X2NpdV9zb2Z0X2Jpc3RfcyBjbjU4eHg7CisJc3RydWN0IGN2bXhfY2l1X3NvZnRfYmlzdF9zIGNuNTh4eHAxOworfTsKKwordW5pb24gY3ZteF9jaXVfc29mdF9wcnN0IHsKKwl1aW50NjRfdCB1NjQ7CisJc3RydWN0IGN2bXhfY2l1X3NvZnRfcHJzdF9zIHsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfM182Mzo2MTsKKwkJdWludDY0X3QgaG9zdDY0OjE7CisJCXVpbnQ2NF90IG5waToxOworCQl1aW50NjRfdCBzb2Z0X3Byc3Q6MTsKKwl9IHM7CisJc3RydWN0IGN2bXhfY2l1X3NvZnRfcHJzdF9zIGNuMzB4eDsKKwlzdHJ1Y3QgY3ZteF9jaXVfc29mdF9wcnN0X3MgY24zMXh4OworCXN0cnVjdCBjdm14X2NpdV9zb2Z0X3Byc3RfcyBjbjM4eHg7CisJc3RydWN0IGN2bXhfY2l1X3NvZnRfcHJzdF9zIGNuMzh4eHAyOworCXN0cnVjdCBjdm14X2NpdV9zb2Z0X3Byc3RfcyBjbjUweHg7CisJc3RydWN0IGN2bXhfY2l1X3NvZnRfcHJzdF9jbjUyeHggeworCQl1aW50NjRfdCByZXNlcnZlZF8xXzYzOjYzOworCQl1aW50NjRfdCBzb2Z0X3Byc3Q6MTsKKwl9IGNuNTJ4eDsKKwlzdHJ1Y3QgY3ZteF9jaXVfc29mdF9wcnN0X2NuNTJ4eCBjbjUyeHhwMTsKKwlzdHJ1Y3QgY3ZteF9jaXVfc29mdF9wcnN0X2NuNTJ4eCBjbjU2eHg7CisJc3RydWN0IGN2bXhfY2l1X3NvZnRfcHJzdF9jbjUyeHggY241Nnh4cDE7CisJc3RydWN0IGN2bXhfY2l1X3NvZnRfcHJzdF9zIGNuNTh4eDsKKwlzdHJ1Y3QgY3ZteF9jaXVfc29mdF9wcnN0X3MgY241OHh4cDE7Cit9OworCit1bmlvbiBjdm14X2NpdV9zb2Z0X3Byc3QxIHsKKwl1aW50NjRfdCB1NjQ7CisJc3RydWN0IGN2bXhfY2l1X3NvZnRfcHJzdDFfcyB7CisJCXVpbnQ2NF90IHJlc2VydmVkXzFfNjM6NjM7CisJCXVpbnQ2NF90IHNvZnRfcHJzdDoxOworCX0gczsKKwlzdHJ1Y3QgY3ZteF9jaXVfc29mdF9wcnN0MV9zIGNuNTJ4eDsKKwlzdHJ1Y3QgY3ZteF9jaXVfc29mdF9wcnN0MV9zIGNuNTJ4eHAxOworCXN0cnVjdCBjdm14X2NpdV9zb2Z0X3Byc3QxX3MgY241Nnh4OworCXN0cnVjdCBjdm14X2NpdV9zb2Z0X3Byc3QxX3MgY241Nnh4cDE7Cit9OworCit1bmlvbiBjdm14X2NpdV9zb2Z0X3JzdCB7CisJdWludDY0X3QgdTY0OworCXN0cnVjdCBjdm14X2NpdV9zb2Z0X3JzdF9zIHsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfMV82Mzo2MzsKKwkJdWludDY0X3Qgc29mdF9yc3Q6MTsKKwl9IHM7CisJc3RydWN0IGN2bXhfY2l1X3NvZnRfcnN0X3MgY24zMHh4OworCXN0cnVjdCBjdm14X2NpdV9zb2Z0X3JzdF9zIGNuMzF4eDsKKwlzdHJ1Y3QgY3ZteF9jaXVfc29mdF9yc3RfcyBjbjM4eHg7CisJc3RydWN0IGN2bXhfY2l1X3NvZnRfcnN0X3MgY24zOHh4cDI7CisJc3RydWN0IGN2bXhfY2l1X3NvZnRfcnN0X3MgY241MHh4OworCXN0cnVjdCBjdm14X2NpdV9zb2Z0X3JzdF9zIGNuNTJ4eDsKKwlzdHJ1Y3QgY3ZteF9jaXVfc29mdF9yc3RfcyBjbjUyeHhwMTsKKwlzdHJ1Y3QgY3ZteF9jaXVfc29mdF9yc3RfcyBjbjU2eHg7CisJc3RydWN0IGN2bXhfY2l1X3NvZnRfcnN0X3MgY241Nnh4cDE7CisJc3RydWN0IGN2bXhfY2l1X3NvZnRfcnN0X3MgY241OHh4OworCXN0cnVjdCBjdm14X2NpdV9zb2Z0X3JzdF9zIGNuNTh4eHAxOworfTsKKwordW5pb24gY3ZteF9jaXVfdGlteCB7CisJdWludDY0X3QgdTY0OworCXN0cnVjdCBjdm14X2NpdV90aW14X3MgeworCQl1aW50NjRfdCByZXNlcnZlZF8zN182MzoyNzsKKwkJdWludDY0X3Qgb25lX3Nob3Q6MTsKKwkJdWludDY0X3QgbGVuOjM2OworCX0gczsKKwlzdHJ1Y3QgY3ZteF9jaXVfdGlteF9zIGNuMzB4eDsKKwlzdHJ1Y3QgY3ZteF9jaXVfdGlteF9zIGNuMzF4eDsKKwlzdHJ1Y3QgY3ZteF9jaXVfdGlteF9zIGNuMzh4eDsKKwlzdHJ1Y3QgY3ZteF9jaXVfdGlteF9zIGNuMzh4eHAyOworCXN0cnVjdCBjdm14X2NpdV90aW14X3MgY241MHh4OworCXN0cnVjdCBjdm14X2NpdV90aW14X3MgY241Mnh4OworCXN0cnVjdCBjdm14X2NpdV90aW14X3MgY241Mnh4cDE7CisJc3RydWN0IGN2bXhfY2l1X3RpbXhfcyBjbjU2eHg7CisJc3RydWN0IGN2bXhfY2l1X3RpbXhfcyBjbjU2eHhwMTsKKwlzdHJ1Y3QgY3ZteF9jaXVfdGlteF9zIGNuNTh4eDsKKwlzdHJ1Y3QgY3ZteF9jaXVfdGlteF9zIGNuNTh4eHAxOworfTsKKwordW5pb24gY3ZteF9jaXVfd2RvZ3ggeworCXVpbnQ2NF90IHU2NDsKKwlzdHJ1Y3QgY3ZteF9jaXVfd2RvZ3hfcyB7CisJCXVpbnQ2NF90IHJlc2VydmVkXzQ2XzYzOjE4OworCQl1aW50NjRfdCBnc3RvcGVuOjE7CisJCXVpbnQ2NF90IGRzdG9wOjE7CisJCXVpbnQ2NF90IGNudDoyNDsKKwkJdWludDY0X3QgbGVuOjE2OworCQl1aW50NjRfdCBzdGF0ZToyOworCQl1aW50NjRfdCBtb2RlOjI7CisJfSBzOworCXN0cnVjdCBjdm14X2NpdV93ZG9neF9zIGNuMzB4eDsKKwlzdHJ1Y3QgY3ZteF9jaXVfd2RvZ3hfcyBjbjMxeHg7CisJc3RydWN0IGN2bXhfY2l1X3dkb2d4X3MgY24zOHh4OworCXN0cnVjdCBjdm14X2NpdV93ZG9neF9zIGNuMzh4eHAyOworCXN0cnVjdCBjdm14X2NpdV93ZG9neF9zIGNuNTB4eDsKKwlzdHJ1Y3QgY3ZteF9jaXVfd2RvZ3hfcyBjbjUyeHg7CisJc3RydWN0IGN2bXhfY2l1X3dkb2d4X3MgY241Mnh4cDE7CisJc3RydWN0IGN2bXhfY2l1X3dkb2d4X3MgY241Nnh4OworCXN0cnVjdCBjdm14X2NpdV93ZG9neF9zIGNuNTZ4eHAxOworCXN0cnVjdCBjdm14X2NpdV93ZG9neF9zIGNuNTh4eDsKKwlzdHJ1Y3QgY3ZteF9jaXVfd2RvZ3hfcyBjbjU4eHhwMTsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL29jdGVvbi9jdm14LWdwaW8tZGVmcy5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL29jdGVvbi9jdm14LWdwaW8tZGVmcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmZGQ2YmEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vb2N0ZW9uL2N2bXgtZ3Bpby1kZWZzLmgKQEAgLTAsMCArMSwyMTkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKmxpY2Vuc2Ugc3RhcnQqKioqKioqKioqKioqKioKKyAqIEF1dGhvcjogQ2F2aXVtIE5ldHdvcmtzCisgKgorICogQ29udGFjdDogc3VwcG9ydEBjYXZpdW1uZXR3b3Jrcy5jb20KKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBPQ1RFT04gU0RLCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMDggQ2F2aXVtIE5ldHdvcmtzCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIFZlcnNpb24gMiwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIEFTLUlTIGFuZCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5CisgKiBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIFRJVExFLCBvcgorICogTk9OSU5GUklOR0VNRU5ULiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZQorICogZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIGZpbGU7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICogb3IgdmlzaXQgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4KKyAqCisgKiBUaGlzIGZpbGUgbWF5IGFsc28gYmUgYXZhaWxhYmxlIHVuZGVyIGEgZGlmZmVyZW50IGxpY2Vuc2UgZnJvbSBDYXZpdW0uCisgKiBDb250YWN0IENhdml1bSBOZXR3b3JrcyBmb3IgbW9yZSBpbmZvcm1hdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqbGljZW5zZSBlbmQqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfX0NWTVhfR1BJT19ERUZTX0hfXworI2RlZmluZSBfX0NWTVhfR1BJT19ERUZTX0hfXworCisjZGVmaW5lIENWTVhfR1BJT19CSVRfQ0ZHWChvZmZzZXQpIFwKKwkgQ1ZNWF9BRERfSU9fU0VHKDB4MDAwMTA3MDAwMDAwMDgwMHVsbCArICgoKG9mZnNldCkgJiAxNSkgKiA4KSkKKyNkZWZpbmUgQ1ZNWF9HUElPX0JPT1RfRU5BIFwKKwkgQ1ZNWF9BRERfSU9fU0VHKDB4MDAwMTA3MDAwMDAwMDhBOHVsbCkKKyNkZWZpbmUgQ1ZNWF9HUElPX0NMS19HRU5YKG9mZnNldCkgXAorCSBDVk1YX0FERF9JT19TRUcoMHgwMDAxMDcwMDAwMDAwOEMwdWxsICsgKCgob2Zmc2V0KSAmIDMpICogOCkpCisjZGVmaW5lIENWTVhfR1BJT19EQkdfRU5BIFwKKwkgQ1ZNWF9BRERfSU9fU0VHKDB4MDAwMTA3MDAwMDAwMDhBMHVsbCkKKyNkZWZpbmUgQ1ZNWF9HUElPX0lOVF9DTFIgXAorCSBDVk1YX0FERF9JT19TRUcoMHgwMDAxMDcwMDAwMDAwODk4dWxsKQorI2RlZmluZSBDVk1YX0dQSU9fUlhfREFUIFwKKwkgQ1ZNWF9BRERfSU9fU0VHKDB4MDAwMTA3MDAwMDAwMDg4MHVsbCkKKyNkZWZpbmUgQ1ZNWF9HUElPX1RYX0NMUiBcCisJIENWTVhfQUREX0lPX1NFRygweDAwMDEwNzAwMDAwMDA4OTB1bGwpCisjZGVmaW5lIENWTVhfR1BJT19UWF9TRVQgXAorCSBDVk1YX0FERF9JT19TRUcoMHgwMDAxMDcwMDAwMDAwODg4dWxsKQorI2RlZmluZSBDVk1YX0dQSU9fWEJJVF9DRkdYKG9mZnNldCkgXAorCSBDVk1YX0FERF9JT19TRUcoMHgwMDAxMDcwMDAwMDAwOTAwdWxsICsgKCgob2Zmc2V0KSAmIDMxKSAqIDgpIC0gOCAqIDE2KQorCit1bmlvbiBjdm14X2dwaW9fYml0X2NmZ3ggeworCXVpbnQ2NF90IHU2NDsKKwlzdHJ1Y3QgY3ZteF9ncGlvX2JpdF9jZmd4X3MgeworCQl1aW50NjRfdCByZXNlcnZlZF8xNV82Mzo0OTsKKwkJdWludDY0X3QgY2xrX2dlbjoxOworCQl1aW50NjRfdCBjbGtfc2VsOjI7CisJCXVpbnQ2NF90IGZpbF9zZWw6NDsKKwkJdWludDY0X3QgZmlsX2NudDo0OworCQl1aW50NjRfdCBpbnRfdHlwZToxOworCQl1aW50NjRfdCBpbnRfZW46MTsKKwkJdWludDY0X3QgcnhfeG9yOjE7CisJCXVpbnQ2NF90IHR4X29lOjE7CisJfSBzOworCXN0cnVjdCBjdm14X2dwaW9fYml0X2NmZ3hfY24zMHh4IHsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfMTJfNjM6NTI7CisJCXVpbnQ2NF90IGZpbF9zZWw6NDsKKwkJdWludDY0X3QgZmlsX2NudDo0OworCQl1aW50NjRfdCBpbnRfdHlwZToxOworCQl1aW50NjRfdCBpbnRfZW46MTsKKwkJdWludDY0X3QgcnhfeG9yOjE7CisJCXVpbnQ2NF90IHR4X29lOjE7CisJfSBjbjMweHg7CisJc3RydWN0IGN2bXhfZ3Bpb19iaXRfY2ZneF9jbjMweHggY24zMXh4OworCXN0cnVjdCBjdm14X2dwaW9fYml0X2NmZ3hfY24zMHh4IGNuMzh4eDsKKwlzdHJ1Y3QgY3ZteF9ncGlvX2JpdF9jZmd4X2NuMzB4eCBjbjM4eHhwMjsKKwlzdHJ1Y3QgY3ZteF9ncGlvX2JpdF9jZmd4X2NuMzB4eCBjbjUweHg7CisJc3RydWN0IGN2bXhfZ3Bpb19iaXRfY2ZneF9zIGNuNTJ4eDsKKwlzdHJ1Y3QgY3ZteF9ncGlvX2JpdF9jZmd4X3MgY241Mnh4cDE7CisJc3RydWN0IGN2bXhfZ3Bpb19iaXRfY2ZneF9zIGNuNTZ4eDsKKwlzdHJ1Y3QgY3ZteF9ncGlvX2JpdF9jZmd4X3MgY241Nnh4cDE7CisJc3RydWN0IGN2bXhfZ3Bpb19iaXRfY2ZneF9jbjMweHggY241OHh4OworCXN0cnVjdCBjdm14X2dwaW9fYml0X2NmZ3hfY24zMHh4IGNuNTh4eHAxOworfTsKKwordW5pb24gY3ZteF9ncGlvX2Jvb3RfZW5hIHsKKwl1aW50NjRfdCB1NjQ7CisJc3RydWN0IGN2bXhfZ3Bpb19ib290X2VuYV9zIHsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfMTJfNjM6NTI7CisJCXVpbnQ2NF90IGJvb3RfZW5hOjQ7CisJCXVpbnQ2NF90IHJlc2VydmVkXzBfNzo4OworCX0gczsKKwlzdHJ1Y3QgY3ZteF9ncGlvX2Jvb3RfZW5hX3MgY24zMHh4OworCXN0cnVjdCBjdm14X2dwaW9fYm9vdF9lbmFfcyBjbjMxeHg7CisJc3RydWN0IGN2bXhfZ3Bpb19ib290X2VuYV9zIGNuNTB4eDsKK307CisKK3VuaW9uIGN2bXhfZ3Bpb19jbGtfZ2VueCB7CisJdWludDY0X3QgdTY0OworCXN0cnVjdCBjdm14X2dwaW9fY2xrX2dlbnhfcyB7CisJCXVpbnQ2NF90IHJlc2VydmVkXzMyXzYzOjMyOworCQl1aW50NjRfdCBuOjMyOworCX0gczsKKwlzdHJ1Y3QgY3ZteF9ncGlvX2Nsa19nZW54X3MgY241Mnh4OworCXN0cnVjdCBjdm14X2dwaW9fY2xrX2dlbnhfcyBjbjUyeHhwMTsKKwlzdHJ1Y3QgY3ZteF9ncGlvX2Nsa19nZW54X3MgY241Nnh4OworCXN0cnVjdCBjdm14X2dwaW9fY2xrX2dlbnhfcyBjbjU2eHhwMTsKK307CisKK3VuaW9uIGN2bXhfZ3Bpb19kYmdfZW5hIHsKKwl1aW50NjRfdCB1NjQ7CisJc3RydWN0IGN2bXhfZ3Bpb19kYmdfZW5hX3MgeworCQl1aW50NjRfdCByZXNlcnZlZF8yMV82Mzo0MzsKKwkJdWludDY0X3QgZGJnX2VuYToyMTsKKwl9IHM7CisJc3RydWN0IGN2bXhfZ3Bpb19kYmdfZW5hX3MgY24zMHh4OworCXN0cnVjdCBjdm14X2dwaW9fZGJnX2VuYV9zIGNuMzF4eDsKKwlzdHJ1Y3QgY3ZteF9ncGlvX2RiZ19lbmFfcyBjbjUweHg7Cit9OworCit1bmlvbiBjdm14X2dwaW9faW50X2NsciB7CisJdWludDY0X3QgdTY0OworCXN0cnVjdCBjdm14X2dwaW9faW50X2Nscl9zIHsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfMTZfNjM6NDg7CisJCXVpbnQ2NF90IHR5cGU6MTY7CisJfSBzOworCXN0cnVjdCBjdm14X2dwaW9faW50X2Nscl9zIGNuMzB4eDsKKwlzdHJ1Y3QgY3ZteF9ncGlvX2ludF9jbHJfcyBjbjMxeHg7CisJc3RydWN0IGN2bXhfZ3Bpb19pbnRfY2xyX3MgY24zOHh4OworCXN0cnVjdCBjdm14X2dwaW9faW50X2Nscl9zIGNuMzh4eHAyOworCXN0cnVjdCBjdm14X2dwaW9faW50X2Nscl9zIGNuNTB4eDsKKwlzdHJ1Y3QgY3ZteF9ncGlvX2ludF9jbHJfcyBjbjUyeHg7CisJc3RydWN0IGN2bXhfZ3Bpb19pbnRfY2xyX3MgY241Mnh4cDE7CisJc3RydWN0IGN2bXhfZ3Bpb19pbnRfY2xyX3MgY241Nnh4OworCXN0cnVjdCBjdm14X2dwaW9faW50X2Nscl9zIGNuNTZ4eHAxOworCXN0cnVjdCBjdm14X2dwaW9faW50X2Nscl9zIGNuNTh4eDsKKwlzdHJ1Y3QgY3ZteF9ncGlvX2ludF9jbHJfcyBjbjU4eHhwMTsKK307CisKK3VuaW9uIGN2bXhfZ3Bpb19yeF9kYXQgeworCXVpbnQ2NF90IHU2NDsKKwlzdHJ1Y3QgY3ZteF9ncGlvX3J4X2RhdF9zIHsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfMjRfNjM6NDA7CisJCXVpbnQ2NF90IGRhdDoyNDsKKwl9IHM7CisJc3RydWN0IGN2bXhfZ3Bpb19yeF9kYXRfcyBjbjMweHg7CisJc3RydWN0IGN2bXhfZ3Bpb19yeF9kYXRfcyBjbjMxeHg7CisJc3RydWN0IGN2bXhfZ3Bpb19yeF9kYXRfY24zOHh4IHsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfMTZfNjM6NDg7CisJCXVpbnQ2NF90IGRhdDoxNjsKKwl9IGNuMzh4eDsKKwlzdHJ1Y3QgY3ZteF9ncGlvX3J4X2RhdF9jbjM4eHggY24zOHh4cDI7CisJc3RydWN0IGN2bXhfZ3Bpb19yeF9kYXRfcyBjbjUweHg7CisJc3RydWN0IGN2bXhfZ3Bpb19yeF9kYXRfY24zOHh4IGNuNTJ4eDsKKwlzdHJ1Y3QgY3ZteF9ncGlvX3J4X2RhdF9jbjM4eHggY241Mnh4cDE7CisJc3RydWN0IGN2bXhfZ3Bpb19yeF9kYXRfY24zOHh4IGNuNTZ4eDsKKwlzdHJ1Y3QgY3ZteF9ncGlvX3J4X2RhdF9jbjM4eHggY241Nnh4cDE7CisJc3RydWN0IGN2bXhfZ3Bpb19yeF9kYXRfY24zOHh4IGNuNTh4eDsKKwlzdHJ1Y3QgY3ZteF9ncGlvX3J4X2RhdF9jbjM4eHggY241OHh4cDE7Cit9OworCit1bmlvbiBjdm14X2dwaW9fdHhfY2xyIHsKKwl1aW50NjRfdCB1NjQ7CisJc3RydWN0IGN2bXhfZ3Bpb190eF9jbHJfcyB7CisJCXVpbnQ2NF90IHJlc2VydmVkXzI0XzYzOjQwOworCQl1aW50NjRfdCBjbHI6MjQ7CisJfSBzOworCXN0cnVjdCBjdm14X2dwaW9fdHhfY2xyX3MgY24zMHh4OworCXN0cnVjdCBjdm14X2dwaW9fdHhfY2xyX3MgY24zMXh4OworCXN0cnVjdCBjdm14X2dwaW9fdHhfY2xyX2NuMzh4eCB7CisJCXVpbnQ2NF90IHJlc2VydmVkXzE2XzYzOjQ4OworCQl1aW50NjRfdCBjbHI6MTY7CisJfSBjbjM4eHg7CisJc3RydWN0IGN2bXhfZ3Bpb190eF9jbHJfY24zOHh4IGNuMzh4eHAyOworCXN0cnVjdCBjdm14X2dwaW9fdHhfY2xyX3MgY241MHh4OworCXN0cnVjdCBjdm14X2dwaW9fdHhfY2xyX2NuMzh4eCBjbjUyeHg7CisJc3RydWN0IGN2bXhfZ3Bpb190eF9jbHJfY24zOHh4IGNuNTJ4eHAxOworCXN0cnVjdCBjdm14X2dwaW9fdHhfY2xyX2NuMzh4eCBjbjU2eHg7CisJc3RydWN0IGN2bXhfZ3Bpb190eF9jbHJfY24zOHh4IGNuNTZ4eHAxOworCXN0cnVjdCBjdm14X2dwaW9fdHhfY2xyX2NuMzh4eCBjbjU4eHg7CisJc3RydWN0IGN2bXhfZ3Bpb190eF9jbHJfY24zOHh4IGNuNTh4eHAxOworfTsKKwordW5pb24gY3ZteF9ncGlvX3R4X3NldCB7CisJdWludDY0X3QgdTY0OworCXN0cnVjdCBjdm14X2dwaW9fdHhfc2V0X3MgeworCQl1aW50NjRfdCByZXNlcnZlZF8yNF82Mzo0MDsKKwkJdWludDY0X3Qgc2V0OjI0OworCX0gczsKKwlzdHJ1Y3QgY3ZteF9ncGlvX3R4X3NldF9zIGNuMzB4eDsKKwlzdHJ1Y3QgY3ZteF9ncGlvX3R4X3NldF9zIGNuMzF4eDsKKwlzdHJ1Y3QgY3ZteF9ncGlvX3R4X3NldF9jbjM4eHggeworCQl1aW50NjRfdCByZXNlcnZlZF8xNl82Mzo0ODsKKwkJdWludDY0X3Qgc2V0OjE2OworCX0gY24zOHh4OworCXN0cnVjdCBjdm14X2dwaW9fdHhfc2V0X2NuMzh4eCBjbjM4eHhwMjsKKwlzdHJ1Y3QgY3ZteF9ncGlvX3R4X3NldF9zIGNuNTB4eDsKKwlzdHJ1Y3QgY3ZteF9ncGlvX3R4X3NldF9jbjM4eHggY241Mnh4OworCXN0cnVjdCBjdm14X2dwaW9fdHhfc2V0X2NuMzh4eCBjbjUyeHhwMTsKKwlzdHJ1Y3QgY3ZteF9ncGlvX3R4X3NldF9jbjM4eHggY241Nnh4OworCXN0cnVjdCBjdm14X2dwaW9fdHhfc2V0X2NuMzh4eCBjbjU2eHhwMTsKKwlzdHJ1Y3QgY3ZteF9ncGlvX3R4X3NldF9jbjM4eHggY241OHh4OworCXN0cnVjdCBjdm14X2dwaW9fdHhfc2V0X2NuMzh4eCBjbjU4eHhwMTsKK307CisKK3VuaW9uIGN2bXhfZ3Bpb194Yml0X2NmZ3ggeworCXVpbnQ2NF90IHU2NDsKKwlzdHJ1Y3QgY3ZteF9ncGlvX3hiaXRfY2ZneF9zIHsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfMTJfNjM6NTI7CisJCXVpbnQ2NF90IGZpbF9zZWw6NDsKKwkJdWludDY0X3QgZmlsX2NudDo0OworCQl1aW50NjRfdCByZXNlcnZlZF8yXzM6MjsKKwkJdWludDY0X3QgcnhfeG9yOjE7CisJCXVpbnQ2NF90IHR4X29lOjE7CisJfSBzOworCXN0cnVjdCBjdm14X2dwaW9feGJpdF9jZmd4X3MgY24zMHh4OworCXN0cnVjdCBjdm14X2dwaW9feGJpdF9jZmd4X3MgY24zMXh4OworCXN0cnVjdCBjdm14X2dwaW9feGJpdF9jZmd4X3MgY241MHh4OworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vb2N0ZW9uL2N2bXgtaW9iLWRlZnMuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9vY3Rlb24vY3ZteC1pb2ItZGVmcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlZTM2YmEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vb2N0ZW9uL2N2bXgtaW9iLWRlZnMuaApAQCAtMCwwICsxLDUzMCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqbGljZW5zZSBzdGFydCoqKioqKioqKioqKioqKgorICogQXV0aG9yOiBDYXZpdW0gTmV0d29ya3MKKyAqCisgKiBDb250YWN0OiBzdXBwb3J0QGNhdml1bW5ldHdvcmtzLmNvbQorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIE9DVEVPTiBTREsKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwOCBDYXZpdW0gTmV0d29ya3MKKyAqCisgKiBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgVmVyc2lvbiAyLCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogQVMtSVMgYW5kIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkKKyAqIG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgVElUTEUsIG9yCisgKiBOT05JTkZSSU5HRU1FTlQuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlCisgKiBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgZmlsZTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKiBvciB2aXNpdCBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLgorICoKKyAqIFRoaXMgZmlsZSBtYXkgYWxzbyBiZSBhdmFpbGFibGUgdW5kZXIgYSBkaWZmZXJlbnQgbGljZW5zZSBmcm9tIENhdml1bS4KKyAqIENvbnRhY3QgQ2F2aXVtIE5ldHdvcmtzIGZvciBtb3JlIGluZm9ybWF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKipsaWNlbnNlIGVuZCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9fQ1ZNWF9JT0JfREVGU19IX18KKyNkZWZpbmUgX19DVk1YX0lPQl9ERUZTX0hfXworCisjZGVmaW5lIENWTVhfSU9CX0JJU1RfU1RBVFVTIFwKKwkgQ1ZNWF9BRERfSU9fU0VHKDB4MDAwMTE4MDBGMDAwMDdGOHVsbCkKKyNkZWZpbmUgQ1ZNWF9JT0JfQ1RMX1NUQVRVUyBcCisJIENWTVhfQUREX0lPX1NFRygweDAwMDExODAwRjAwMDAwNTB1bGwpCisjZGVmaW5lIENWTVhfSU9CX0RXQl9QUklfQ05UIFwKKwkgQ1ZNWF9BRERfSU9fU0VHKDB4MDAwMTE4MDBGMDAwMDAyOHVsbCkKKyNkZWZpbmUgQ1ZNWF9JT0JfRkFVX1RJTUVPVVQgXAorCSBDVk1YX0FERF9JT19TRUcoMHgwMDAxMTgwMEYwMDAwMDAwdWxsKQorI2RlZmluZSBDVk1YX0lPQl9JMkNfUFJJX0NOVCBcCisJIENWTVhfQUREX0lPX1NFRygweDAwMDExODAwRjAwMDAwMTB1bGwpCisjZGVmaW5lIENWTVhfSU9CX0lOQl9DT05UUk9MX01BVENIIFwKKwkgQ1ZNWF9BRERfSU9fU0VHKDB4MDAwMTE4MDBGMDAwMDA3OHVsbCkKKyNkZWZpbmUgQ1ZNWF9JT0JfSU5CX0NPTlRST0xfTUFUQ0hfRU5CIFwKKwkgQ1ZNWF9BRERfSU9fU0VHKDB4MDAwMTE4MDBGMDAwMDA4OHVsbCkKKyNkZWZpbmUgQ1ZNWF9JT0JfSU5CX0RBVEFfTUFUQ0ggXAorCSBDVk1YX0FERF9JT19TRUcoMHgwMDAxMTgwMEYwMDAwMDcwdWxsKQorI2RlZmluZSBDVk1YX0lPQl9JTkJfREFUQV9NQVRDSF9FTkIgXAorCSBDVk1YX0FERF9JT19TRUcoMHgwMDAxMTgwMEYwMDAwMDgwdWxsKQorI2RlZmluZSBDVk1YX0lPQl9JTlRfRU5CIFwKKwkgQ1ZNWF9BRERfSU9fU0VHKDB4MDAwMTE4MDBGMDAwMDA2MHVsbCkKKyNkZWZpbmUgQ1ZNWF9JT0JfSU5UX1NVTSBcCisJIENWTVhfQUREX0lPX1NFRygweDAwMDExODAwRjAwMDAwNTh1bGwpCisjZGVmaW5lIENWTVhfSU9CX04yQ19MMkNfUFJJX0NOVCBcCisJIENWTVhfQUREX0lPX1NFRygweDAwMDExODAwRjAwMDAwMjB1bGwpCisjZGVmaW5lIENWTVhfSU9CX04yQ19SU1BfUFJJX0NOVCBcCisJIENWTVhfQUREX0lPX1NFRygweDAwMDExODAwRjAwMDAwMDh1bGwpCisjZGVmaW5lIENWTVhfSU9CX09VVEJfQ09NX1BSSV9DTlQgXAorCSBDVk1YX0FERF9JT19TRUcoMHgwMDAxMTgwMEYwMDAwMDQwdWxsKQorI2RlZmluZSBDVk1YX0lPQl9PVVRCX0NPTlRST0xfTUFUQ0ggXAorCSBDVk1YX0FERF9JT19TRUcoMHgwMDAxMTgwMEYwMDAwMDk4dWxsKQorI2RlZmluZSBDVk1YX0lPQl9PVVRCX0NPTlRST0xfTUFUQ0hfRU5CIFwKKwkgQ1ZNWF9BRERfSU9fU0VHKDB4MDAwMTE4MDBGMDAwMDBBOHVsbCkKKyNkZWZpbmUgQ1ZNWF9JT0JfT1VUQl9EQVRBX01BVENIIFwKKwkgQ1ZNWF9BRERfSU9fU0VHKDB4MDAwMTE4MDBGMDAwMDA5MHVsbCkKKyNkZWZpbmUgQ1ZNWF9JT0JfT1VUQl9EQVRBX01BVENIX0VOQiBcCisJIENWTVhfQUREX0lPX1NFRygweDAwMDExODAwRjAwMDAwQTB1bGwpCisjZGVmaW5lIENWTVhfSU9CX09VVEJfRlBBX1BSSV9DTlQgXAorCSBDVk1YX0FERF9JT19TRUcoMHgwMDAxMTgwMEYwMDAwMDQ4dWxsKQorI2RlZmluZSBDVk1YX0lPQl9PVVRCX1JFUV9QUklfQ05UIFwKKwkgQ1ZNWF9BRERfSU9fU0VHKDB4MDAwMTE4MDBGMDAwMDAzOHVsbCkKKyNkZWZpbmUgQ1ZNWF9JT0JfUDJDX1JFUV9QUklfQ05UIFwKKwkgQ1ZNWF9BRERfSU9fU0VHKDB4MDAwMTE4MDBGMDAwMDAxOHVsbCkKKyNkZWZpbmUgQ1ZNWF9JT0JfUEtUX0VSUiBcCisJIENWTVhfQUREX0lPX1NFRygweDAwMDExODAwRjAwMDAwNjh1bGwpCisKK3VuaW9uIGN2bXhfaW9iX2Jpc3Rfc3RhdHVzIHsKKwl1aW50NjRfdCB1NjQ7CisJc3RydWN0IGN2bXhfaW9iX2Jpc3Rfc3RhdHVzX3MgeworCQl1aW50NjRfdCByZXNlcnZlZF8xOF82Mzo0NjsKKwkJdWludDY0X3QgaWNucmNiOjE7CisJCXVpbnQ2NF90IGljcjA6MTsKKwkJdWludDY0X3QgaWNyMToxOworCQl1aW50NjRfdCBpY25yMToxOworCQl1aW50NjRfdCBpY25yMDoxOworCQl1aW50NjRfdCBpYmRyMDoxOworCQl1aW50NjRfdCBpYmRyMToxOworCQl1aW50NjRfdCBpYnIwOjE7CisJCXVpbnQ2NF90IGlicjE6MTsKKwkJdWludDY0X3QgaWNucnQ6MTsKKwkJdWludDY0X3QgaWJycTA6MTsKKwkJdWludDY0X3QgaWJycTE6MTsKKwkJdWludDY0X3QgaWNybjA6MTsKKwkJdWludDY0X3QgaWNybjE6MTsKKwkJdWludDY0X3QgaWNycDA6MTsKKwkJdWludDY0X3QgaWNycDE6MTsKKwkJdWludDY0X3QgaWJkOjE7CisJCXVpbnQ2NF90IGljZDoxOworCX0gczsKKwlzdHJ1Y3QgY3ZteF9pb2JfYmlzdF9zdGF0dXNfcyBjbjMweHg7CisJc3RydWN0IGN2bXhfaW9iX2Jpc3Rfc3RhdHVzX3MgY24zMXh4OworCXN0cnVjdCBjdm14X2lvYl9iaXN0X3N0YXR1c19zIGNuMzh4eDsKKwlzdHJ1Y3QgY3ZteF9pb2JfYmlzdF9zdGF0dXNfcyBjbjM4eHhwMjsKKwlzdHJ1Y3QgY3ZteF9pb2JfYmlzdF9zdGF0dXNfcyBjbjUweHg7CisJc3RydWN0IGN2bXhfaW9iX2Jpc3Rfc3RhdHVzX3MgY241Mnh4OworCXN0cnVjdCBjdm14X2lvYl9iaXN0X3N0YXR1c19zIGNuNTJ4eHAxOworCXN0cnVjdCBjdm14X2lvYl9iaXN0X3N0YXR1c19zIGNuNTZ4eDsKKwlzdHJ1Y3QgY3ZteF9pb2JfYmlzdF9zdGF0dXNfcyBjbjU2eHhwMTsKKwlzdHJ1Y3QgY3ZteF9pb2JfYmlzdF9zdGF0dXNfcyBjbjU4eHg7CisJc3RydWN0IGN2bXhfaW9iX2Jpc3Rfc3RhdHVzX3MgY241OHh4cDE7Cit9OworCit1bmlvbiBjdm14X2lvYl9jdGxfc3RhdHVzIHsKKwl1aW50NjRfdCB1NjQ7CisJc3RydWN0IGN2bXhfaW9iX2N0bF9zdGF0dXNfcyB7CisJCXVpbnQ2NF90IHJlc2VydmVkXzVfNjM6NTk7CisJCXVpbnQ2NF90IG91dGJfbWF0OjE7CisJCXVpbnQ2NF90IGluYl9tYXQ6MTsKKwkJdWludDY0X3QgcGtvX2VuYjoxOworCQl1aW50NjRfdCBkd2JfZW5iOjE7CisJCXVpbnQ2NF90IGZhdV9lbmQ6MTsKKwl9IHM7CisJc3RydWN0IGN2bXhfaW9iX2N0bF9zdGF0dXNfcyBjbjMweHg7CisJc3RydWN0IGN2bXhfaW9iX2N0bF9zdGF0dXNfcyBjbjMxeHg7CisJc3RydWN0IGN2bXhfaW9iX2N0bF9zdGF0dXNfcyBjbjM4eHg7CisJc3RydWN0IGN2bXhfaW9iX2N0bF9zdGF0dXNfcyBjbjM4eHhwMjsKKwlzdHJ1Y3QgY3ZteF9pb2JfY3RsX3N0YXR1c19zIGNuNTB4eDsKKwlzdHJ1Y3QgY3ZteF9pb2JfY3RsX3N0YXR1c19zIGNuNTJ4eDsKKwlzdHJ1Y3QgY3ZteF9pb2JfY3RsX3N0YXR1c19zIGNuNTJ4eHAxOworCXN0cnVjdCBjdm14X2lvYl9jdGxfc3RhdHVzX3MgY241Nnh4OworCXN0cnVjdCBjdm14X2lvYl9jdGxfc3RhdHVzX3MgY241Nnh4cDE7CisJc3RydWN0IGN2bXhfaW9iX2N0bF9zdGF0dXNfcyBjbjU4eHg7CisJc3RydWN0IGN2bXhfaW9iX2N0bF9zdGF0dXNfcyBjbjU4eHhwMTsKK307CisKK3VuaW9uIGN2bXhfaW9iX2R3Yl9wcmlfY250IHsKKwl1aW50NjRfdCB1NjQ7CisJc3RydWN0IGN2bXhfaW9iX2R3Yl9wcmlfY250X3MgeworCQl1aW50NjRfdCByZXNlcnZlZF8xNl82Mzo0ODsKKwkJdWludDY0X3QgY250X2VuYjoxOworCQl1aW50NjRfdCBjbnRfdmFsOjE1OworCX0gczsKKwlzdHJ1Y3QgY3ZteF9pb2JfZHdiX3ByaV9jbnRfcyBjbjM4eHg7CisJc3RydWN0IGN2bXhfaW9iX2R3Yl9wcmlfY250X3MgY24zOHh4cDI7CisJc3RydWN0IGN2bXhfaW9iX2R3Yl9wcmlfY250X3MgY241Mnh4OworCXN0cnVjdCBjdm14X2lvYl9kd2JfcHJpX2NudF9zIGNuNTJ4eHAxOworCXN0cnVjdCBjdm14X2lvYl9kd2JfcHJpX2NudF9zIGNuNTZ4eDsKKwlzdHJ1Y3QgY3ZteF9pb2JfZHdiX3ByaV9jbnRfcyBjbjU2eHhwMTsKKwlzdHJ1Y3QgY3ZteF9pb2JfZHdiX3ByaV9jbnRfcyBjbjU4eHg7CisJc3RydWN0IGN2bXhfaW9iX2R3Yl9wcmlfY250X3MgY241OHh4cDE7Cit9OworCit1bmlvbiBjdm14X2lvYl9mYXVfdGltZW91dCB7CisJdWludDY0X3QgdTY0OworCXN0cnVjdCBjdm14X2lvYl9mYXVfdGltZW91dF9zIHsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfMTNfNjM6NTE7CisJCXVpbnQ2NF90IHRvdXRfZW5iOjE7CisJCXVpbnQ2NF90IHRvdXRfdmFsOjEyOworCX0gczsKKwlzdHJ1Y3QgY3ZteF9pb2JfZmF1X3RpbWVvdXRfcyBjbjMweHg7CisJc3RydWN0IGN2bXhfaW9iX2ZhdV90aW1lb3V0X3MgY24zMXh4OworCXN0cnVjdCBjdm14X2lvYl9mYXVfdGltZW91dF9zIGNuMzh4eDsKKwlzdHJ1Y3QgY3ZteF9pb2JfZmF1X3RpbWVvdXRfcyBjbjM4eHhwMjsKKwlzdHJ1Y3QgY3ZteF9pb2JfZmF1X3RpbWVvdXRfcyBjbjUweHg7CisJc3RydWN0IGN2bXhfaW9iX2ZhdV90aW1lb3V0X3MgY241Mnh4OworCXN0cnVjdCBjdm14X2lvYl9mYXVfdGltZW91dF9zIGNuNTJ4eHAxOworCXN0cnVjdCBjdm14X2lvYl9mYXVfdGltZW91dF9zIGNuNTZ4eDsKKwlzdHJ1Y3QgY3ZteF9pb2JfZmF1X3RpbWVvdXRfcyBjbjU2eHhwMTsKKwlzdHJ1Y3QgY3ZteF9pb2JfZmF1X3RpbWVvdXRfcyBjbjU4eHg7CisJc3RydWN0IGN2bXhfaW9iX2ZhdV90aW1lb3V0X3MgY241OHh4cDE7Cit9OworCit1bmlvbiBjdm14X2lvYl9pMmNfcHJpX2NudCB7CisJdWludDY0X3QgdTY0OworCXN0cnVjdCBjdm14X2lvYl9pMmNfcHJpX2NudF9zIHsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfMTZfNjM6NDg7CisJCXVpbnQ2NF90IGNudF9lbmI6MTsKKwkJdWludDY0X3QgY250X3ZhbDoxNTsKKwl9IHM7CisJc3RydWN0IGN2bXhfaW9iX2kyY19wcmlfY250X3MgY24zOHh4OworCXN0cnVjdCBjdm14X2lvYl9pMmNfcHJpX2NudF9zIGNuMzh4eHAyOworCXN0cnVjdCBjdm14X2lvYl9pMmNfcHJpX2NudF9zIGNuNTJ4eDsKKwlzdHJ1Y3QgY3ZteF9pb2JfaTJjX3ByaV9jbnRfcyBjbjUyeHhwMTsKKwlzdHJ1Y3QgY3ZteF9pb2JfaTJjX3ByaV9jbnRfcyBjbjU2eHg7CisJc3RydWN0IGN2bXhfaW9iX2kyY19wcmlfY250X3MgY241Nnh4cDE7CisJc3RydWN0IGN2bXhfaW9iX2kyY19wcmlfY250X3MgY241OHh4OworCXN0cnVjdCBjdm14X2lvYl9pMmNfcHJpX2NudF9zIGNuNTh4eHAxOworfTsKKwordW5pb24gY3ZteF9pb2JfaW5iX2NvbnRyb2xfbWF0Y2ggeworCXVpbnQ2NF90IHU2NDsKKwlzdHJ1Y3QgY3ZteF9pb2JfaW5iX2NvbnRyb2xfbWF0Y2hfcyB7CisJCXVpbnQ2NF90IHJlc2VydmVkXzI5XzYzOjM1OworCQl1aW50NjRfdCBtYXNrOjg7CisJCXVpbnQ2NF90IG9wYzo0OworCQl1aW50NjRfdCBkc3Q6OTsKKwkJdWludDY0X3Qgc3JjOjg7CisJfSBzOworCXN0cnVjdCBjdm14X2lvYl9pbmJfY29udHJvbF9tYXRjaF9zIGNuMzB4eDsKKwlzdHJ1Y3QgY3ZteF9pb2JfaW5iX2NvbnRyb2xfbWF0Y2hfcyBjbjMxeHg7CisJc3RydWN0IGN2bXhfaW9iX2luYl9jb250cm9sX21hdGNoX3MgY24zOHh4OworCXN0cnVjdCBjdm14X2lvYl9pbmJfY29udHJvbF9tYXRjaF9zIGNuMzh4eHAyOworCXN0cnVjdCBjdm14X2lvYl9pbmJfY29udHJvbF9tYXRjaF9zIGNuNTB4eDsKKwlzdHJ1Y3QgY3ZteF9pb2JfaW5iX2NvbnRyb2xfbWF0Y2hfcyBjbjUyeHg7CisJc3RydWN0IGN2bXhfaW9iX2luYl9jb250cm9sX21hdGNoX3MgY241Mnh4cDE7CisJc3RydWN0IGN2bXhfaW9iX2luYl9jb250cm9sX21hdGNoX3MgY241Nnh4OworCXN0cnVjdCBjdm14X2lvYl9pbmJfY29udHJvbF9tYXRjaF9zIGNuNTZ4eHAxOworCXN0cnVjdCBjdm14X2lvYl9pbmJfY29udHJvbF9tYXRjaF9zIGNuNTh4eDsKKwlzdHJ1Y3QgY3ZteF9pb2JfaW5iX2NvbnRyb2xfbWF0Y2hfcyBjbjU4eHhwMTsKK307CisKK3VuaW9uIGN2bXhfaW9iX2luYl9jb250cm9sX21hdGNoX2VuYiB7CisJdWludDY0X3QgdTY0OworCXN0cnVjdCBjdm14X2lvYl9pbmJfY29udHJvbF9tYXRjaF9lbmJfcyB7CisJCXVpbnQ2NF90IHJlc2VydmVkXzI5XzYzOjM1OworCQl1aW50NjRfdCBtYXNrOjg7CisJCXVpbnQ2NF90IG9wYzo0OworCQl1aW50NjRfdCBkc3Q6OTsKKwkJdWludDY0X3Qgc3JjOjg7CisJfSBzOworCXN0cnVjdCBjdm14X2lvYl9pbmJfY29udHJvbF9tYXRjaF9lbmJfcyBjbjMweHg7CisJc3RydWN0IGN2bXhfaW9iX2luYl9jb250cm9sX21hdGNoX2VuYl9zIGNuMzF4eDsKKwlzdHJ1Y3QgY3ZteF9pb2JfaW5iX2NvbnRyb2xfbWF0Y2hfZW5iX3MgY24zOHh4OworCXN0cnVjdCBjdm14X2lvYl9pbmJfY29udHJvbF9tYXRjaF9lbmJfcyBjbjM4eHhwMjsKKwlzdHJ1Y3QgY3ZteF9pb2JfaW5iX2NvbnRyb2xfbWF0Y2hfZW5iX3MgY241MHh4OworCXN0cnVjdCBjdm14X2lvYl9pbmJfY29udHJvbF9tYXRjaF9lbmJfcyBjbjUyeHg7CisJc3RydWN0IGN2bXhfaW9iX2luYl9jb250cm9sX21hdGNoX2VuYl9zIGNuNTJ4eHAxOworCXN0cnVjdCBjdm14X2lvYl9pbmJfY29udHJvbF9tYXRjaF9lbmJfcyBjbjU2eHg7CisJc3RydWN0IGN2bXhfaW9iX2luYl9jb250cm9sX21hdGNoX2VuYl9zIGNuNTZ4eHAxOworCXN0cnVjdCBjdm14X2lvYl9pbmJfY29udHJvbF9tYXRjaF9lbmJfcyBjbjU4eHg7CisJc3RydWN0IGN2bXhfaW9iX2luYl9jb250cm9sX21hdGNoX2VuYl9zIGNuNTh4eHAxOworfTsKKwordW5pb24gY3ZteF9pb2JfaW5iX2RhdGFfbWF0Y2ggeworCXVpbnQ2NF90IHU2NDsKKwlzdHJ1Y3QgY3ZteF9pb2JfaW5iX2RhdGFfbWF0Y2hfcyB7CisJCXVpbnQ2NF90IGRhdGE6NjQ7CisJfSBzOworCXN0cnVjdCBjdm14X2lvYl9pbmJfZGF0YV9tYXRjaF9zIGNuMzB4eDsKKwlzdHJ1Y3QgY3ZteF9pb2JfaW5iX2RhdGFfbWF0Y2hfcyBjbjMxeHg7CisJc3RydWN0IGN2bXhfaW9iX2luYl9kYXRhX21hdGNoX3MgY24zOHh4OworCXN0cnVjdCBjdm14X2lvYl9pbmJfZGF0YV9tYXRjaF9zIGNuMzh4eHAyOworCXN0cnVjdCBjdm14X2lvYl9pbmJfZGF0YV9tYXRjaF9zIGNuNTB4eDsKKwlzdHJ1Y3QgY3ZteF9pb2JfaW5iX2RhdGFfbWF0Y2hfcyBjbjUyeHg7CisJc3RydWN0IGN2bXhfaW9iX2luYl9kYXRhX21hdGNoX3MgY241Mnh4cDE7CisJc3RydWN0IGN2bXhfaW9iX2luYl9kYXRhX21hdGNoX3MgY241Nnh4OworCXN0cnVjdCBjdm14X2lvYl9pbmJfZGF0YV9tYXRjaF9zIGNuNTZ4eHAxOworCXN0cnVjdCBjdm14X2lvYl9pbmJfZGF0YV9tYXRjaF9zIGNuNTh4eDsKKwlzdHJ1Y3QgY3ZteF9pb2JfaW5iX2RhdGFfbWF0Y2hfcyBjbjU4eHhwMTsKK307CisKK3VuaW9uIGN2bXhfaW9iX2luYl9kYXRhX21hdGNoX2VuYiB7CisJdWludDY0X3QgdTY0OworCXN0cnVjdCBjdm14X2lvYl9pbmJfZGF0YV9tYXRjaF9lbmJfcyB7CisJCXVpbnQ2NF90IGRhdGE6NjQ7CisJfSBzOworCXN0cnVjdCBjdm14X2lvYl9pbmJfZGF0YV9tYXRjaF9lbmJfcyBjbjMweHg7CisJc3RydWN0IGN2bXhfaW9iX2luYl9kYXRhX21hdGNoX2VuYl9zIGNuMzF4eDsKKwlzdHJ1Y3QgY3ZteF9pb2JfaW5iX2RhdGFfbWF0Y2hfZW5iX3MgY24zOHh4OworCXN0cnVjdCBjdm14X2lvYl9pbmJfZGF0YV9tYXRjaF9lbmJfcyBjbjM4eHhwMjsKKwlzdHJ1Y3QgY3ZteF9pb2JfaW5iX2RhdGFfbWF0Y2hfZW5iX3MgY241MHh4OworCXN0cnVjdCBjdm14X2lvYl9pbmJfZGF0YV9tYXRjaF9lbmJfcyBjbjUyeHg7CisJc3RydWN0IGN2bXhfaW9iX2luYl9kYXRhX21hdGNoX2VuYl9zIGNuNTJ4eHAxOworCXN0cnVjdCBjdm14X2lvYl9pbmJfZGF0YV9tYXRjaF9lbmJfcyBjbjU2eHg7CisJc3RydWN0IGN2bXhfaW9iX2luYl9kYXRhX21hdGNoX2VuYl9zIGNuNTZ4eHAxOworCXN0cnVjdCBjdm14X2lvYl9pbmJfZGF0YV9tYXRjaF9lbmJfcyBjbjU4eHg7CisJc3RydWN0IGN2bXhfaW9iX2luYl9kYXRhX21hdGNoX2VuYl9zIGNuNTh4eHAxOworfTsKKwordW5pb24gY3ZteF9pb2JfaW50X2VuYiB7CisJdWludDY0X3QgdTY0OworCXN0cnVjdCBjdm14X2lvYl9pbnRfZW5iX3MgeworCQl1aW50NjRfdCByZXNlcnZlZF82XzYzOjU4OworCQl1aW50NjRfdCBwX2RhdDoxOworCQl1aW50NjRfdCBucF9kYXQ6MTsKKwkJdWludDY0X3QgcF9lb3A6MTsKKwkJdWludDY0X3QgcF9zb3A6MTsKKwkJdWludDY0X3QgbnBfZW9wOjE7CisJCXVpbnQ2NF90IG5wX3NvcDoxOworCX0gczsKKwlzdHJ1Y3QgY3ZteF9pb2JfaW50X2VuYl9jbjMweHggeworCQl1aW50NjRfdCByZXNlcnZlZF80XzYzOjYwOworCQl1aW50NjRfdCBwX2VvcDoxOworCQl1aW50NjRfdCBwX3NvcDoxOworCQl1aW50NjRfdCBucF9lb3A6MTsKKwkJdWludDY0X3QgbnBfc29wOjE7CisJfSBjbjMweHg7CisJc3RydWN0IGN2bXhfaW9iX2ludF9lbmJfY24zMHh4IGNuMzF4eDsKKwlzdHJ1Y3QgY3ZteF9pb2JfaW50X2VuYl9jbjMweHggY24zOHh4OworCXN0cnVjdCBjdm14X2lvYl9pbnRfZW5iX2NuMzB4eCBjbjM4eHhwMjsKKwlzdHJ1Y3QgY3ZteF9pb2JfaW50X2VuYl9zIGNuNTB4eDsKKwlzdHJ1Y3QgY3ZteF9pb2JfaW50X2VuYl9zIGNuNTJ4eDsKKwlzdHJ1Y3QgY3ZteF9pb2JfaW50X2VuYl9zIGNuNTJ4eHAxOworCXN0cnVjdCBjdm14X2lvYl9pbnRfZW5iX3MgY241Nnh4OworCXN0cnVjdCBjdm14X2lvYl9pbnRfZW5iX3MgY241Nnh4cDE7CisJc3RydWN0IGN2bXhfaW9iX2ludF9lbmJfcyBjbjU4eHg7CisJc3RydWN0IGN2bXhfaW9iX2ludF9lbmJfcyBjbjU4eHhwMTsKK307CisKK3VuaW9uIGN2bXhfaW9iX2ludF9zdW0geworCXVpbnQ2NF90IHU2NDsKKwlzdHJ1Y3QgY3ZteF9pb2JfaW50X3N1bV9zIHsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfNl82Mzo1ODsKKwkJdWludDY0X3QgcF9kYXQ6MTsKKwkJdWludDY0X3QgbnBfZGF0OjE7CisJCXVpbnQ2NF90IHBfZW9wOjE7CisJCXVpbnQ2NF90IHBfc29wOjE7CisJCXVpbnQ2NF90IG5wX2VvcDoxOworCQl1aW50NjRfdCBucF9zb3A6MTsKKwl9IHM7CisJc3RydWN0IGN2bXhfaW9iX2ludF9zdW1fY24zMHh4IHsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfNF82Mzo2MDsKKwkJdWludDY0X3QgcF9lb3A6MTsKKwkJdWludDY0X3QgcF9zb3A6MTsKKwkJdWludDY0X3QgbnBfZW9wOjE7CisJCXVpbnQ2NF90IG5wX3NvcDoxOworCX0gY24zMHh4OworCXN0cnVjdCBjdm14X2lvYl9pbnRfc3VtX2NuMzB4eCBjbjMxeHg7CisJc3RydWN0IGN2bXhfaW9iX2ludF9zdW1fY24zMHh4IGNuMzh4eDsKKwlzdHJ1Y3QgY3ZteF9pb2JfaW50X3N1bV9jbjMweHggY24zOHh4cDI7CisJc3RydWN0IGN2bXhfaW9iX2ludF9zdW1fcyBjbjUweHg7CisJc3RydWN0IGN2bXhfaW9iX2ludF9zdW1fcyBjbjUyeHg7CisJc3RydWN0IGN2bXhfaW9iX2ludF9zdW1fcyBjbjUyeHhwMTsKKwlzdHJ1Y3QgY3ZteF9pb2JfaW50X3N1bV9zIGNuNTZ4eDsKKwlzdHJ1Y3QgY3ZteF9pb2JfaW50X3N1bV9zIGNuNTZ4eHAxOworCXN0cnVjdCBjdm14X2lvYl9pbnRfc3VtX3MgY241OHh4OworCXN0cnVjdCBjdm14X2lvYl9pbnRfc3VtX3MgY241OHh4cDE7Cit9OworCit1bmlvbiBjdm14X2lvYl9uMmNfbDJjX3ByaV9jbnQgeworCXVpbnQ2NF90IHU2NDsKKwlzdHJ1Y3QgY3ZteF9pb2JfbjJjX2wyY19wcmlfY250X3MgeworCQl1aW50NjRfdCByZXNlcnZlZF8xNl82Mzo0ODsKKwkJdWludDY0X3QgY250X2VuYjoxOworCQl1aW50NjRfdCBjbnRfdmFsOjE1OworCX0gczsKKwlzdHJ1Y3QgY3ZteF9pb2JfbjJjX2wyY19wcmlfY250X3MgY24zOHh4OworCXN0cnVjdCBjdm14X2lvYl9uMmNfbDJjX3ByaV9jbnRfcyBjbjM4eHhwMjsKKwlzdHJ1Y3QgY3ZteF9pb2JfbjJjX2wyY19wcmlfY250X3MgY241Mnh4OworCXN0cnVjdCBjdm14X2lvYl9uMmNfbDJjX3ByaV9jbnRfcyBjbjUyeHhwMTsKKwlzdHJ1Y3QgY3ZteF9pb2JfbjJjX2wyY19wcmlfY250X3MgY241Nnh4OworCXN0cnVjdCBjdm14X2lvYl9uMmNfbDJjX3ByaV9jbnRfcyBjbjU2eHhwMTsKKwlzdHJ1Y3QgY3ZteF9pb2JfbjJjX2wyY19wcmlfY250X3MgY241OHh4OworCXN0cnVjdCBjdm14X2lvYl9uMmNfbDJjX3ByaV9jbnRfcyBjbjU4eHhwMTsKK307CisKK3VuaW9uIGN2bXhfaW9iX24yY19yc3BfcHJpX2NudCB7CisJdWludDY0X3QgdTY0OworCXN0cnVjdCBjdm14X2lvYl9uMmNfcnNwX3ByaV9jbnRfcyB7CisJCXVpbnQ2NF90IHJlc2VydmVkXzE2XzYzOjQ4OworCQl1aW50NjRfdCBjbnRfZW5iOjE7CisJCXVpbnQ2NF90IGNudF92YWw6MTU7CisJfSBzOworCXN0cnVjdCBjdm14X2lvYl9uMmNfcnNwX3ByaV9jbnRfcyBjbjM4eHg7CisJc3RydWN0IGN2bXhfaW9iX24yY19yc3BfcHJpX2NudF9zIGNuMzh4eHAyOworCXN0cnVjdCBjdm14X2lvYl9uMmNfcnNwX3ByaV9jbnRfcyBjbjUyeHg7CisJc3RydWN0IGN2bXhfaW9iX24yY19yc3BfcHJpX2NudF9zIGNuNTJ4eHAxOworCXN0cnVjdCBjdm14X2lvYl9uMmNfcnNwX3ByaV9jbnRfcyBjbjU2eHg7CisJc3RydWN0IGN2bXhfaW9iX24yY19yc3BfcHJpX2NudF9zIGNuNTZ4eHAxOworCXN0cnVjdCBjdm14X2lvYl9uMmNfcnNwX3ByaV9jbnRfcyBjbjU4eHg7CisJc3RydWN0IGN2bXhfaW9iX24yY19yc3BfcHJpX2NudF9zIGNuNTh4eHAxOworfTsKKwordW5pb24gY3ZteF9pb2Jfb3V0Yl9jb21fcHJpX2NudCB7CisJdWludDY0X3QgdTY0OworCXN0cnVjdCBjdm14X2lvYl9vdXRiX2NvbV9wcmlfY250X3MgeworCQl1aW50NjRfdCByZXNlcnZlZF8xNl82Mzo0ODsKKwkJdWludDY0X3QgY250X2VuYjoxOworCQl1aW50NjRfdCBjbnRfdmFsOjE1OworCX0gczsKKwlzdHJ1Y3QgY3ZteF9pb2Jfb3V0Yl9jb21fcHJpX2NudF9zIGNuMzh4eDsKKwlzdHJ1Y3QgY3ZteF9pb2Jfb3V0Yl9jb21fcHJpX2NudF9zIGNuMzh4eHAyOworCXN0cnVjdCBjdm14X2lvYl9vdXRiX2NvbV9wcmlfY250X3MgY241Mnh4OworCXN0cnVjdCBjdm14X2lvYl9vdXRiX2NvbV9wcmlfY250X3MgY241Mnh4cDE7CisJc3RydWN0IGN2bXhfaW9iX291dGJfY29tX3ByaV9jbnRfcyBjbjU2eHg7CisJc3RydWN0IGN2bXhfaW9iX291dGJfY29tX3ByaV9jbnRfcyBjbjU2eHhwMTsKKwlzdHJ1Y3QgY3ZteF9pb2Jfb3V0Yl9jb21fcHJpX2NudF9zIGNuNTh4eDsKKwlzdHJ1Y3QgY3ZteF9pb2Jfb3V0Yl9jb21fcHJpX2NudF9zIGNuNTh4eHAxOworfTsKKwordW5pb24gY3ZteF9pb2Jfb3V0Yl9jb250cm9sX21hdGNoIHsKKwl1aW50NjRfdCB1NjQ7CisJc3RydWN0IGN2bXhfaW9iX291dGJfY29udHJvbF9tYXRjaF9zIHsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfMjZfNjM6Mzg7CisJCXVpbnQ2NF90IG1hc2s6ODsKKwkJdWludDY0X3QgZW90OjE7CisJCXVpbnQ2NF90IGRzdDo4OworCQl1aW50NjRfdCBzcmM6OTsKKwl9IHM7CisJc3RydWN0IGN2bXhfaW9iX291dGJfY29udHJvbF9tYXRjaF9zIGNuMzB4eDsKKwlzdHJ1Y3QgY3ZteF9pb2Jfb3V0Yl9jb250cm9sX21hdGNoX3MgY24zMXh4OworCXN0cnVjdCBjdm14X2lvYl9vdXRiX2NvbnRyb2xfbWF0Y2hfcyBjbjM4eHg7CisJc3RydWN0IGN2bXhfaW9iX291dGJfY29udHJvbF9tYXRjaF9zIGNuMzh4eHAyOworCXN0cnVjdCBjdm14X2lvYl9vdXRiX2NvbnRyb2xfbWF0Y2hfcyBjbjUweHg7CisJc3RydWN0IGN2bXhfaW9iX291dGJfY29udHJvbF9tYXRjaF9zIGNuNTJ4eDsKKwlzdHJ1Y3QgY3ZteF9pb2Jfb3V0Yl9jb250cm9sX21hdGNoX3MgY241Mnh4cDE7CisJc3RydWN0IGN2bXhfaW9iX291dGJfY29udHJvbF9tYXRjaF9zIGNuNTZ4eDsKKwlzdHJ1Y3QgY3ZteF9pb2Jfb3V0Yl9jb250cm9sX21hdGNoX3MgY241Nnh4cDE7CisJc3RydWN0IGN2bXhfaW9iX291dGJfY29udHJvbF9tYXRjaF9zIGNuNTh4eDsKKwlzdHJ1Y3QgY3ZteF9pb2Jfb3V0Yl9jb250cm9sX21hdGNoX3MgY241OHh4cDE7Cit9OworCit1bmlvbiBjdm14X2lvYl9vdXRiX2NvbnRyb2xfbWF0Y2hfZW5iIHsKKwl1aW50NjRfdCB1NjQ7CisJc3RydWN0IGN2bXhfaW9iX291dGJfY29udHJvbF9tYXRjaF9lbmJfcyB7CisJCXVpbnQ2NF90IHJlc2VydmVkXzI2XzYzOjM4OworCQl1aW50NjRfdCBtYXNrOjg7CisJCXVpbnQ2NF90IGVvdDoxOworCQl1aW50NjRfdCBkc3Q6ODsKKwkJdWludDY0X3Qgc3JjOjk7CisJfSBzOworCXN0cnVjdCBjdm14X2lvYl9vdXRiX2NvbnRyb2xfbWF0Y2hfZW5iX3MgY24zMHh4OworCXN0cnVjdCBjdm14X2lvYl9vdXRiX2NvbnRyb2xfbWF0Y2hfZW5iX3MgY24zMXh4OworCXN0cnVjdCBjdm14X2lvYl9vdXRiX2NvbnRyb2xfbWF0Y2hfZW5iX3MgY24zOHh4OworCXN0cnVjdCBjdm14X2lvYl9vdXRiX2NvbnRyb2xfbWF0Y2hfZW5iX3MgY24zOHh4cDI7CisJc3RydWN0IGN2bXhfaW9iX291dGJfY29udHJvbF9tYXRjaF9lbmJfcyBjbjUweHg7CisJc3RydWN0IGN2bXhfaW9iX291dGJfY29udHJvbF9tYXRjaF9lbmJfcyBjbjUyeHg7CisJc3RydWN0IGN2bXhfaW9iX291dGJfY29udHJvbF9tYXRjaF9lbmJfcyBjbjUyeHhwMTsKKwlzdHJ1Y3QgY3ZteF9pb2Jfb3V0Yl9jb250cm9sX21hdGNoX2VuYl9zIGNuNTZ4eDsKKwlzdHJ1Y3QgY3ZteF9pb2Jfb3V0Yl9jb250cm9sX21hdGNoX2VuYl9zIGNuNTZ4eHAxOworCXN0cnVjdCBjdm14X2lvYl9vdXRiX2NvbnRyb2xfbWF0Y2hfZW5iX3MgY241OHh4OworCXN0cnVjdCBjdm14X2lvYl9vdXRiX2NvbnRyb2xfbWF0Y2hfZW5iX3MgY241OHh4cDE7Cit9OworCit1bmlvbiBjdm14X2lvYl9vdXRiX2RhdGFfbWF0Y2ggeworCXVpbnQ2NF90IHU2NDsKKwlzdHJ1Y3QgY3ZteF9pb2Jfb3V0Yl9kYXRhX21hdGNoX3MgeworCQl1aW50NjRfdCBkYXRhOjY0OworCX0gczsKKwlzdHJ1Y3QgY3ZteF9pb2Jfb3V0Yl9kYXRhX21hdGNoX3MgY24zMHh4OworCXN0cnVjdCBjdm14X2lvYl9vdXRiX2RhdGFfbWF0Y2hfcyBjbjMxeHg7CisJc3RydWN0IGN2bXhfaW9iX291dGJfZGF0YV9tYXRjaF9zIGNuMzh4eDsKKwlzdHJ1Y3QgY3ZteF9pb2Jfb3V0Yl9kYXRhX21hdGNoX3MgY24zOHh4cDI7CisJc3RydWN0IGN2bXhfaW9iX291dGJfZGF0YV9tYXRjaF9zIGNuNTB4eDsKKwlzdHJ1Y3QgY3ZteF9pb2Jfb3V0Yl9kYXRhX21hdGNoX3MgY241Mnh4OworCXN0cnVjdCBjdm14X2lvYl9vdXRiX2RhdGFfbWF0Y2hfcyBjbjUyeHhwMTsKKwlzdHJ1Y3QgY3ZteF9pb2Jfb3V0Yl9kYXRhX21hdGNoX3MgY241Nnh4OworCXN0cnVjdCBjdm14X2lvYl9vdXRiX2RhdGFfbWF0Y2hfcyBjbjU2eHhwMTsKKwlzdHJ1Y3QgY3ZteF9pb2Jfb3V0Yl9kYXRhX21hdGNoX3MgY241OHh4OworCXN0cnVjdCBjdm14X2lvYl9vdXRiX2RhdGFfbWF0Y2hfcyBjbjU4eHhwMTsKK307CisKK3VuaW9uIGN2bXhfaW9iX291dGJfZGF0YV9tYXRjaF9lbmIgeworCXVpbnQ2NF90IHU2NDsKKwlzdHJ1Y3QgY3ZteF9pb2Jfb3V0Yl9kYXRhX21hdGNoX2VuYl9zIHsKKwkJdWludDY0X3QgZGF0YTo2NDsKKwl9IHM7CisJc3RydWN0IGN2bXhfaW9iX291dGJfZGF0YV9tYXRjaF9lbmJfcyBjbjMweHg7CisJc3RydWN0IGN2bXhfaW9iX291dGJfZGF0YV9tYXRjaF9lbmJfcyBjbjMxeHg7CisJc3RydWN0IGN2bXhfaW9iX291dGJfZGF0YV9tYXRjaF9lbmJfcyBjbjM4eHg7CisJc3RydWN0IGN2bXhfaW9iX291dGJfZGF0YV9tYXRjaF9lbmJfcyBjbjM4eHhwMjsKKwlzdHJ1Y3QgY3ZteF9pb2Jfb3V0Yl9kYXRhX21hdGNoX2VuYl9zIGNuNTB4eDsKKwlzdHJ1Y3QgY3ZteF9pb2Jfb3V0Yl9kYXRhX21hdGNoX2VuYl9zIGNuNTJ4eDsKKwlzdHJ1Y3QgY3ZteF9pb2Jfb3V0Yl9kYXRhX21hdGNoX2VuYl9zIGNuNTJ4eHAxOworCXN0cnVjdCBjdm14X2lvYl9vdXRiX2RhdGFfbWF0Y2hfZW5iX3MgY241Nnh4OworCXN0cnVjdCBjdm14X2lvYl9vdXRiX2RhdGFfbWF0Y2hfZW5iX3MgY241Nnh4cDE7CisJc3RydWN0IGN2bXhfaW9iX291dGJfZGF0YV9tYXRjaF9lbmJfcyBjbjU4eHg7CisJc3RydWN0IGN2bXhfaW9iX291dGJfZGF0YV9tYXRjaF9lbmJfcyBjbjU4eHhwMTsKK307CisKK3VuaW9uIGN2bXhfaW9iX291dGJfZnBhX3ByaV9jbnQgeworCXVpbnQ2NF90IHU2NDsKKwlzdHJ1Y3QgY3ZteF9pb2Jfb3V0Yl9mcGFfcHJpX2NudF9zIHsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfMTZfNjM6NDg7CisJCXVpbnQ2NF90IGNudF9lbmI6MTsKKwkJdWludDY0X3QgY250X3ZhbDoxNTsKKwl9IHM7CisJc3RydWN0IGN2bXhfaW9iX291dGJfZnBhX3ByaV9jbnRfcyBjbjM4eHg7CisJc3RydWN0IGN2bXhfaW9iX291dGJfZnBhX3ByaV9jbnRfcyBjbjM4eHhwMjsKKwlzdHJ1Y3QgY3ZteF9pb2Jfb3V0Yl9mcGFfcHJpX2NudF9zIGNuNTJ4eDsKKwlzdHJ1Y3QgY3ZteF9pb2Jfb3V0Yl9mcGFfcHJpX2NudF9zIGNuNTJ4eHAxOworCXN0cnVjdCBjdm14X2lvYl9vdXRiX2ZwYV9wcmlfY250X3MgY241Nnh4OworCXN0cnVjdCBjdm14X2lvYl9vdXRiX2ZwYV9wcmlfY250X3MgY241Nnh4cDE7CisJc3RydWN0IGN2bXhfaW9iX291dGJfZnBhX3ByaV9jbnRfcyBjbjU4eHg7CisJc3RydWN0IGN2bXhfaW9iX291dGJfZnBhX3ByaV9jbnRfcyBjbjU4eHhwMTsKK307CisKK3VuaW9uIGN2bXhfaW9iX291dGJfcmVxX3ByaV9jbnQgeworCXVpbnQ2NF90IHU2NDsKKwlzdHJ1Y3QgY3ZteF9pb2Jfb3V0Yl9yZXFfcHJpX2NudF9zIHsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfMTZfNjM6NDg7CisJCXVpbnQ2NF90IGNudF9lbmI6MTsKKwkJdWludDY0X3QgY250X3ZhbDoxNTsKKwl9IHM7CisJc3RydWN0IGN2bXhfaW9iX291dGJfcmVxX3ByaV9jbnRfcyBjbjM4eHg7CisJc3RydWN0IGN2bXhfaW9iX291dGJfcmVxX3ByaV9jbnRfcyBjbjM4eHhwMjsKKwlzdHJ1Y3QgY3ZteF9pb2Jfb3V0Yl9yZXFfcHJpX2NudF9zIGNuNTJ4eDsKKwlzdHJ1Y3QgY3ZteF9pb2Jfb3V0Yl9yZXFfcHJpX2NudF9zIGNuNTJ4eHAxOworCXN0cnVjdCBjdm14X2lvYl9vdXRiX3JlcV9wcmlfY250X3MgY241Nnh4OworCXN0cnVjdCBjdm14X2lvYl9vdXRiX3JlcV9wcmlfY250X3MgY241Nnh4cDE7CisJc3RydWN0IGN2bXhfaW9iX291dGJfcmVxX3ByaV9jbnRfcyBjbjU4eHg7CisJc3RydWN0IGN2bXhfaW9iX291dGJfcmVxX3ByaV9jbnRfcyBjbjU4eHhwMTsKK307CisKK3VuaW9uIGN2bXhfaW9iX3AyY19yZXFfcHJpX2NudCB7CisJdWludDY0X3QgdTY0OworCXN0cnVjdCBjdm14X2lvYl9wMmNfcmVxX3ByaV9jbnRfcyB7CisJCXVpbnQ2NF90IHJlc2VydmVkXzE2XzYzOjQ4OworCQl1aW50NjRfdCBjbnRfZW5iOjE7CisJCXVpbnQ2NF90IGNudF92YWw6MTU7CisJfSBzOworCXN0cnVjdCBjdm14X2lvYl9wMmNfcmVxX3ByaV9jbnRfcyBjbjM4eHg7CisJc3RydWN0IGN2bXhfaW9iX3AyY19yZXFfcHJpX2NudF9zIGNuMzh4eHAyOworCXN0cnVjdCBjdm14X2lvYl9wMmNfcmVxX3ByaV9jbnRfcyBjbjUyeHg7CisJc3RydWN0IGN2bXhfaW9iX3AyY19yZXFfcHJpX2NudF9zIGNuNTJ4eHAxOworCXN0cnVjdCBjdm14X2lvYl9wMmNfcmVxX3ByaV9jbnRfcyBjbjU2eHg7CisJc3RydWN0IGN2bXhfaW9iX3AyY19yZXFfcHJpX2NudF9zIGNuNTZ4eHAxOworCXN0cnVjdCBjdm14X2lvYl9wMmNfcmVxX3ByaV9jbnRfcyBjbjU4eHg7CisJc3RydWN0IGN2bXhfaW9iX3AyY19yZXFfcHJpX2NudF9zIGNuNTh4eHAxOworfTsKKwordW5pb24gY3ZteF9pb2JfcGt0X2VyciB7CisJdWludDY0X3QgdTY0OworCXN0cnVjdCBjdm14X2lvYl9wa3RfZXJyX3MgeworCQl1aW50NjRfdCByZXNlcnZlZF82XzYzOjU4OworCQl1aW50NjRfdCBwb3J0OjY7CisJfSBzOworCXN0cnVjdCBjdm14X2lvYl9wa3RfZXJyX3MgY24zMHh4OworCXN0cnVjdCBjdm14X2lvYl9wa3RfZXJyX3MgY24zMXh4OworCXN0cnVjdCBjdm14X2lvYl9wa3RfZXJyX3MgY24zOHh4OworCXN0cnVjdCBjdm14X2lvYl9wa3RfZXJyX3MgY24zOHh4cDI7CisJc3RydWN0IGN2bXhfaW9iX3BrdF9lcnJfcyBjbjUweHg7CisJc3RydWN0IGN2bXhfaW9iX3BrdF9lcnJfcyBjbjUyeHg7CisJc3RydWN0IGN2bXhfaW9iX3BrdF9lcnJfcyBjbjUyeHhwMTsKKwlzdHJ1Y3QgY3ZteF9pb2JfcGt0X2Vycl9zIGNuNTZ4eDsKKwlzdHJ1Y3QgY3ZteF9pb2JfcGt0X2Vycl9zIGNuNTZ4eHAxOworCXN0cnVjdCBjdm14X2lvYl9wa3RfZXJyX3MgY241OHh4OworCXN0cnVjdCBjdm14X2lvYl9wa3RfZXJyX3MgY241OHh4cDE7Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9vY3Rlb24vY3ZteC1pcGQtZGVmcy5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL29jdGVvbi9jdm14LWlwZC1kZWZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjhiOGZjNgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9vY3Rlb24vY3ZteC1pcGQtZGVmcy5oCkBAIC0wLDAgKzEsODc3IEBACisvKioqKioqKioqKioqKioqKioqKioqKipsaWNlbnNlIHN0YXJ0KioqKioqKioqKioqKioqCisgKiBBdXRob3I6IENhdml1bSBOZXR3b3JrcworICoKKyAqIENvbnRhY3Q6IHN1cHBvcnRAY2F2aXVtbmV0d29ya3MuY29tCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgT0NURU9OIFNESworICoKKyAqIENvcHlyaWdodCAoYykgMjAwMy0yMDA4IENhdml1bSBOZXR3b3JrcworICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBWZXJzaW9uIDIsIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBBUy1JUyBhbmQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eQorICogb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBUSVRMRSwgb3IKKyAqIE5PTklORlJJTkdFTUVOVC4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUKKyAqIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBmaWxlOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqIG9yIHZpc2l0IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uCisgKgorICogVGhpcyBmaWxlIG1heSBhbHNvIGJlIGF2YWlsYWJsZSB1bmRlciBhIGRpZmZlcmVudCBsaWNlbnNlIGZyb20gQ2F2aXVtLgorICogQ29udGFjdCBDYXZpdW0gTmV0d29ya3MgZm9yIG1vcmUgaW5mb3JtYXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKmxpY2Vuc2UgZW5kKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX19DVk1YX0lQRF9ERUZTX0hfXworI2RlZmluZSBfX0NWTVhfSVBEX0RFRlNfSF9fCisKKyNkZWZpbmUgQ1ZNWF9JUERfMVNUX01CVUZGX1NLSVAgXAorCSBDVk1YX0FERF9JT19TRUcoMHgwMDAxNEYwMDAwMDAwMDAwdWxsKQorI2RlZmluZSBDVk1YX0lQRF8xc3RfTkVYVF9QVFJfQkFDSyBcCisJIENWTVhfQUREX0lPX1NFRygweDAwMDE0RjAwMDAwMDAxNTB1bGwpCisjZGVmaW5lIENWTVhfSVBEXzJuZF9ORVhUX1BUUl9CQUNLIFwKKwkgQ1ZNWF9BRERfSU9fU0VHKDB4MDAwMTRGMDAwMDAwMDE1OHVsbCkKKyNkZWZpbmUgQ1ZNWF9JUERfQklTVF9TVEFUVVMgXAorCSBDVk1YX0FERF9JT19TRUcoMHgwMDAxNEYwMDAwMDAwN0Y4dWxsKQorI2RlZmluZSBDVk1YX0lQRF9CUF9QUlRfUkVEX0VORCBcCisJIENWTVhfQUREX0lPX1NFRygweDAwMDE0RjAwMDAwMDAzMjh1bGwpCisjZGVmaW5lIENWTVhfSVBEX0NMS19DT1VOVCBcCisJIENWTVhfQUREX0lPX1NFRygweDAwMDE0RjAwMDAwMDAzMzh1bGwpCisjZGVmaW5lIENWTVhfSVBEX0NUTF9TVEFUVVMgXAorCSBDVk1YX0FERF9JT19TRUcoMHgwMDAxNEYwMDAwMDAwMDE4dWxsKQorI2RlZmluZSBDVk1YX0lQRF9JTlRfRU5CIFwKKwkgQ1ZNWF9BRERfSU9fU0VHKDB4MDAwMTRGMDAwMDAwMDE2MHVsbCkKKyNkZWZpbmUgQ1ZNWF9JUERfSU5UX1NVTSBcCisJIENWTVhfQUREX0lPX1NFRygweDAwMDE0RjAwMDAwMDAxNjh1bGwpCisjZGVmaW5lIENWTVhfSVBEX05PVF8xU1RfTUJVRkZfU0tJUCBcCisJIENWTVhfQUREX0lPX1NFRygweDAwMDE0RjAwMDAwMDAwMDh1bGwpCisjZGVmaW5lIENWTVhfSVBEX1BBQ0tFVF9NQlVGRl9TSVpFIFwKKwkgQ1ZNWF9BRERfSU9fU0VHKDB4MDAwMTRGMDAwMDAwMDAxMHVsbCkKKyNkZWZpbmUgQ1ZNWF9JUERfUEtUX1BUUl9WQUxJRCBcCisJIENWTVhfQUREX0lPX1NFRygweDAwMDE0RjAwMDAwMDAzNTh1bGwpCisjZGVmaW5lIENWTVhfSVBEX1BPUlRYX0JQX1BBR0VfQ05UKG9mZnNldCkgXAorCSBDVk1YX0FERF9JT19TRUcoMHgwMDAxNEYwMDAwMDAwMDI4dWxsICsgKCgob2Zmc2V0KSAmIDYzKSAqIDgpKQorI2RlZmluZSBDVk1YX0lQRF9QT1JUWF9CUF9QQUdFX0NOVDIob2Zmc2V0KSBcCisJIENWTVhfQUREX0lPX1NFRygweDAwMDE0RjAwMDAwMDAzNjh1bGwgKyAoKChvZmZzZXQpICYgNjMpICogOCkgLSA4ICogMzYpCisjZGVmaW5lIENWTVhfSVBEX1BPUlRfQlBfQ09VTlRFUlMyX1BBSVJYKG9mZnNldCkgXAorCSBDVk1YX0FERF9JT19TRUcoMHgwMDAxNEYwMDAwMDAwMzg4dWxsICsgKCgob2Zmc2V0KSAmIDYzKSAqIDgpIC0gOCAqIDM2KQorI2RlZmluZSBDVk1YX0lQRF9QT1JUX0JQX0NPVU5URVJTX1BBSVJYKG9mZnNldCkgXAorCSBDVk1YX0FERF9JT19TRUcoMHgwMDAxNEYwMDAwMDAwMUI4dWxsICsgKCgob2Zmc2V0KSAmIDYzKSAqIDgpKQorI2RlZmluZSBDVk1YX0lQRF9QT1JUX1FPU19JTlRYKG9mZnNldCkgXAorCSBDVk1YX0FERF9JT19TRUcoMHgwMDAxNEYwMDAwMDAwODA4dWxsICsgKCgob2Zmc2V0KSAmIDcpICogOCkpCisjZGVmaW5lIENWTVhfSVBEX1BPUlRfUU9TX0lOVF9FTkJYKG9mZnNldCkgXAorCSBDVk1YX0FERF9JT19TRUcoMHgwMDAxNEYwMDAwMDAwODQ4dWxsICsgKCgob2Zmc2V0KSAmIDcpICogOCkpCisjZGVmaW5lIENWTVhfSVBEX1BPUlRfUU9TX1hfQ05UKG9mZnNldCkgXAorCSBDVk1YX0FERF9JT19TRUcoMHgwMDAxNEYwMDAwMDAwODg4dWxsICsgKCgob2Zmc2V0KSAmIDUxMSkgKiA4KSkKKyNkZWZpbmUgQ1ZNWF9JUERfUFJDX0hPTERfUFRSX0ZJRk9fQ1RMIFwKKwkgQ1ZNWF9BRERfSU9fU0VHKDB4MDAwMTRGMDAwMDAwMDM0OHVsbCkKKyNkZWZpbmUgQ1ZNWF9JUERfUFJDX1BPUlRfUFRSX0ZJRk9fQ1RMIFwKKwkgQ1ZNWF9BRERfSU9fU0VHKDB4MDAwMTRGMDAwMDAwMDM1MHVsbCkKKyNkZWZpbmUgQ1ZNWF9JUERfUFRSX0NPVU5UIFwKKwkgQ1ZNWF9BRERfSU9fU0VHKDB4MDAwMTRGMDAwMDAwMDMyMHVsbCkKKyNkZWZpbmUgQ1ZNWF9JUERfUFdQX1BUUl9GSUZPX0NUTCBcCisJIENWTVhfQUREX0lPX1NFRygweDAwMDE0RjAwMDAwMDAzNDB1bGwpCisjZGVmaW5lIENWTVhfSVBEX1FPUzBfUkVEX01BUktTIFwKKwkgQ1ZNWF9BRERfSU9fU0VHKDB4MDAwMTRGMDAwMDAwMDE3OHVsbCkKKyNkZWZpbmUgQ1ZNWF9JUERfUU9TMV9SRURfTUFSS1MgXAorCSBDVk1YX0FERF9JT19TRUcoMHgwMDAxNEYwMDAwMDAwMTgwdWxsKQorI2RlZmluZSBDVk1YX0lQRF9RT1MyX1JFRF9NQVJLUyBcCisJIENWTVhfQUREX0lPX1NFRygweDAwMDE0RjAwMDAwMDAxODh1bGwpCisjZGVmaW5lIENWTVhfSVBEX1FPUzNfUkVEX01BUktTIFwKKwkgQ1ZNWF9BRERfSU9fU0VHKDB4MDAwMTRGMDAwMDAwMDE5MHVsbCkKKyNkZWZpbmUgQ1ZNWF9JUERfUU9TNF9SRURfTUFSS1MgXAorCSBDVk1YX0FERF9JT19TRUcoMHgwMDAxNEYwMDAwMDAwMTk4dWxsKQorI2RlZmluZSBDVk1YX0lQRF9RT1M1X1JFRF9NQVJLUyBcCisJIENWTVhfQUREX0lPX1NFRygweDAwMDE0RjAwMDAwMDAxQTB1bGwpCisjZGVmaW5lIENWTVhfSVBEX1FPUzZfUkVEX01BUktTIFwKKwkgQ1ZNWF9BRERfSU9fU0VHKDB4MDAwMTRGMDAwMDAwMDFBOHVsbCkKKyNkZWZpbmUgQ1ZNWF9JUERfUU9TN19SRURfTUFSS1MgXAorCSBDVk1YX0FERF9JT19TRUcoMHgwMDAxNEYwMDAwMDAwMUIwdWxsKQorI2RlZmluZSBDVk1YX0lQRF9RT1NYX1JFRF9NQVJLUyhvZmZzZXQpIFwKKwkgQ1ZNWF9BRERfSU9fU0VHKDB4MDAwMTRGMDAwMDAwMDE3OHVsbCArICgoKG9mZnNldCkgJiA3KSAqIDgpKQorI2RlZmluZSBDVk1YX0lQRF9RVUUwX0ZSRUVfUEFHRV9DTlQgXAorCSBDVk1YX0FERF9JT19TRUcoMHgwMDAxNEYwMDAwMDAwMzMwdWxsKQorI2RlZmluZSBDVk1YX0lQRF9SRURfUE9SVF9FTkFCTEUgXAorCSBDVk1YX0FERF9JT19TRUcoMHgwMDAxNEYwMDAwMDAwMkQ4dWxsKQorI2RlZmluZSBDVk1YX0lQRF9SRURfUE9SVF9FTkFCTEUyIFwKKwkgQ1ZNWF9BRERfSU9fU0VHKDB4MDAwMTRGMDAwMDAwMDNBOHVsbCkKKyNkZWZpbmUgQ1ZNWF9JUERfUkVEX1FVRTBfUEFSQU0gXAorCSBDVk1YX0FERF9JT19TRUcoMHgwMDAxNEYwMDAwMDAwMkUwdWxsKQorI2RlZmluZSBDVk1YX0lQRF9SRURfUVVFMV9QQVJBTSBcCisJIENWTVhfQUREX0lPX1NFRygweDAwMDE0RjAwMDAwMDAyRTh1bGwpCisjZGVmaW5lIENWTVhfSVBEX1JFRF9RVUUyX1BBUkFNIFwKKwkgQ1ZNWF9BRERfSU9fU0VHKDB4MDAwMTRGMDAwMDAwMDJGMHVsbCkKKyNkZWZpbmUgQ1ZNWF9JUERfUkVEX1FVRTNfUEFSQU0gXAorCSBDVk1YX0FERF9JT19TRUcoMHgwMDAxNEYwMDAwMDAwMkY4dWxsKQorI2RlZmluZSBDVk1YX0lQRF9SRURfUVVFNF9QQVJBTSBcCisJIENWTVhfQUREX0lPX1NFRygweDAwMDE0RjAwMDAwMDAzMDB1bGwpCisjZGVmaW5lIENWTVhfSVBEX1JFRF9RVUU1X1BBUkFNIFwKKwkgQ1ZNWF9BRERfSU9fU0VHKDB4MDAwMTRGMDAwMDAwMDMwOHVsbCkKKyNkZWZpbmUgQ1ZNWF9JUERfUkVEX1FVRTZfUEFSQU0gXAorCSBDVk1YX0FERF9JT19TRUcoMHgwMDAxNEYwMDAwMDAwMzEwdWxsKQorI2RlZmluZSBDVk1YX0lQRF9SRURfUVVFN19QQVJBTSBcCisJIENWTVhfQUREX0lPX1NFRygweDAwMDE0RjAwMDAwMDAzMTh1bGwpCisjZGVmaW5lIENWTVhfSVBEX1JFRF9RVUVYX1BBUkFNKG9mZnNldCkgXAorCSBDVk1YX0FERF9JT19TRUcoMHgwMDAxNEYwMDAwMDAwMkUwdWxsICsgKCgob2Zmc2V0KSAmIDcpICogOCkpCisjZGVmaW5lIENWTVhfSVBEX1NVQl9QT1JUX0JQX1BBR0VfQ05UIFwKKwkgQ1ZNWF9BRERfSU9fU0VHKDB4MDAwMTRGMDAwMDAwMDE0OHVsbCkKKyNkZWZpbmUgQ1ZNWF9JUERfU1VCX1BPUlRfRkNTIFwKKwkgQ1ZNWF9BRERfSU9fU0VHKDB4MDAwMTRGMDAwMDAwMDE3MHVsbCkKKyNkZWZpbmUgQ1ZNWF9JUERfU1VCX1BPUlRfUU9TX0NOVCBcCisJIENWTVhfQUREX0lPX1NFRygweDAwMDE0RjAwMDAwMDA4MDB1bGwpCisjZGVmaW5lIENWTVhfSVBEX1dRRV9GUEFfUVVFVUUgXAorCSBDVk1YX0FERF9JT19TRUcoMHgwMDAxNEYwMDAwMDAwMDIwdWxsKQorI2RlZmluZSBDVk1YX0lQRF9XUUVfUFRSX1ZBTElEIFwKKwkgQ1ZNWF9BRERfSU9fU0VHKDB4MDAwMTRGMDAwMDAwMDM2MHVsbCkKKwordW5pb24gY3ZteF9pcGRfMXN0X21idWZmX3NraXAgeworCXVpbnQ2NF90IHU2NDsKKwlzdHJ1Y3QgY3ZteF9pcGRfMXN0X21idWZmX3NraXBfcyB7CisJCXVpbnQ2NF90IHJlc2VydmVkXzZfNjM6NTg7CisJCXVpbnQ2NF90IHNraXBfc3o6NjsKKwl9IHM7CisJc3RydWN0IGN2bXhfaXBkXzFzdF9tYnVmZl9za2lwX3MgY24zMHh4OworCXN0cnVjdCBjdm14X2lwZF8xc3RfbWJ1ZmZfc2tpcF9zIGNuMzF4eDsKKwlzdHJ1Y3QgY3ZteF9pcGRfMXN0X21idWZmX3NraXBfcyBjbjM4eHg7CisJc3RydWN0IGN2bXhfaXBkXzFzdF9tYnVmZl9za2lwX3MgY24zOHh4cDI7CisJc3RydWN0IGN2bXhfaXBkXzFzdF9tYnVmZl9za2lwX3MgY241MHh4OworCXN0cnVjdCBjdm14X2lwZF8xc3RfbWJ1ZmZfc2tpcF9zIGNuNTJ4eDsKKwlzdHJ1Y3QgY3ZteF9pcGRfMXN0X21idWZmX3NraXBfcyBjbjUyeHhwMTsKKwlzdHJ1Y3QgY3ZteF9pcGRfMXN0X21idWZmX3NraXBfcyBjbjU2eHg7CisJc3RydWN0IGN2bXhfaXBkXzFzdF9tYnVmZl9za2lwX3MgY241Nnh4cDE7CisJc3RydWN0IGN2bXhfaXBkXzFzdF9tYnVmZl9za2lwX3MgY241OHh4OworCXN0cnVjdCBjdm14X2lwZF8xc3RfbWJ1ZmZfc2tpcF9zIGNuNTh4eHAxOworfTsKKwordW5pb24gY3ZteF9pcGRfMXN0X25leHRfcHRyX2JhY2sgeworCXVpbnQ2NF90IHU2NDsKKwlzdHJ1Y3QgY3ZteF9pcGRfMXN0X25leHRfcHRyX2JhY2tfcyB7CisJCXVpbnQ2NF90IHJlc2VydmVkXzRfNjM6NjA7CisJCXVpbnQ2NF90IGJhY2s6NDsKKwl9IHM7CisJc3RydWN0IGN2bXhfaXBkXzFzdF9uZXh0X3B0cl9iYWNrX3MgY24zMHh4OworCXN0cnVjdCBjdm14X2lwZF8xc3RfbmV4dF9wdHJfYmFja19zIGNuMzF4eDsKKwlzdHJ1Y3QgY3ZteF9pcGRfMXN0X25leHRfcHRyX2JhY2tfcyBjbjM4eHg7CisJc3RydWN0IGN2bXhfaXBkXzFzdF9uZXh0X3B0cl9iYWNrX3MgY24zOHh4cDI7CisJc3RydWN0IGN2bXhfaXBkXzFzdF9uZXh0X3B0cl9iYWNrX3MgY241MHh4OworCXN0cnVjdCBjdm14X2lwZF8xc3RfbmV4dF9wdHJfYmFja19zIGNuNTJ4eDsKKwlzdHJ1Y3QgY3ZteF9pcGRfMXN0X25leHRfcHRyX2JhY2tfcyBjbjUyeHhwMTsKKwlzdHJ1Y3QgY3ZteF9pcGRfMXN0X25leHRfcHRyX2JhY2tfcyBjbjU2eHg7CisJc3RydWN0IGN2bXhfaXBkXzFzdF9uZXh0X3B0cl9iYWNrX3MgY241Nnh4cDE7CisJc3RydWN0IGN2bXhfaXBkXzFzdF9uZXh0X3B0cl9iYWNrX3MgY241OHh4OworCXN0cnVjdCBjdm14X2lwZF8xc3RfbmV4dF9wdHJfYmFja19zIGNuNTh4eHAxOworfTsKKwordW5pb24gY3ZteF9pcGRfMm5kX25leHRfcHRyX2JhY2sgeworCXVpbnQ2NF90IHU2NDsKKwlzdHJ1Y3QgY3ZteF9pcGRfMm5kX25leHRfcHRyX2JhY2tfcyB7CisJCXVpbnQ2NF90IHJlc2VydmVkXzRfNjM6NjA7CisJCXVpbnQ2NF90IGJhY2s6NDsKKwl9IHM7CisJc3RydWN0IGN2bXhfaXBkXzJuZF9uZXh0X3B0cl9iYWNrX3MgY24zMHh4OworCXN0cnVjdCBjdm14X2lwZF8ybmRfbmV4dF9wdHJfYmFja19zIGNuMzF4eDsKKwlzdHJ1Y3QgY3ZteF9pcGRfMm5kX25leHRfcHRyX2JhY2tfcyBjbjM4eHg7CisJc3RydWN0IGN2bXhfaXBkXzJuZF9uZXh0X3B0cl9iYWNrX3MgY24zOHh4cDI7CisJc3RydWN0IGN2bXhfaXBkXzJuZF9uZXh0X3B0cl9iYWNrX3MgY241MHh4OworCXN0cnVjdCBjdm14X2lwZF8ybmRfbmV4dF9wdHJfYmFja19zIGNuNTJ4eDsKKwlzdHJ1Y3QgY3ZteF9pcGRfMm5kX25leHRfcHRyX2JhY2tfcyBjbjUyeHhwMTsKKwlzdHJ1Y3QgY3ZteF9pcGRfMm5kX25leHRfcHRyX2JhY2tfcyBjbjU2eHg7CisJc3RydWN0IGN2bXhfaXBkXzJuZF9uZXh0X3B0cl9iYWNrX3MgY241Nnh4cDE7CisJc3RydWN0IGN2bXhfaXBkXzJuZF9uZXh0X3B0cl9iYWNrX3MgY241OHh4OworCXN0cnVjdCBjdm14X2lwZF8ybmRfbmV4dF9wdHJfYmFja19zIGNuNTh4eHAxOworfTsKKwordW5pb24gY3ZteF9pcGRfYmlzdF9zdGF0dXMgeworCXVpbnQ2NF90IHU2NDsKKwlzdHJ1Y3QgY3ZteF9pcGRfYmlzdF9zdGF0dXNfcyB7CisJCXVpbnQ2NF90IHJlc2VydmVkXzE4XzYzOjQ2OworCQl1aW50NjRfdCBjc3JfbWVtOjE7CisJCXVpbnQ2NF90IGNzcl9uY21kOjE7CisJCXVpbnQ2NF90IHB3cV93cWVkOjE7CisJCXVpbnQ2NF90IHB3cV93cDE6MTsKKwkJdWludDY0X3QgcHdxX3BvdzoxOworCQl1aW50NjRfdCBpcHFfcGJlMToxOworCQl1aW50NjRfdCBpcHFfcGJlMDoxOworCQl1aW50NjRfdCBwYm0zOjE7CisJCXVpbnQ2NF90IHBibTI6MTsKKwkJdWludDY0X3QgcGJtMToxOworCQl1aW50NjRfdCBwYm0wOjE7CisJCXVpbnQ2NF90IHBibV93b3JkOjE7CisJCXVpbnQ2NF90IHB3cTE6MTsKKwkJdWludDY0X3QgcHdxMDoxOworCQl1aW50NjRfdCBwcmNfb2ZmOjE7CisJCXVpbnQ2NF90IGlwZF9vbGQ6MTsKKwkJdWludDY0X3QgaXBkX25ldzoxOworCQl1aW50NjRfdCBwd3A6MTsKKwl9IHM7CisJc3RydWN0IGN2bXhfaXBkX2Jpc3Rfc3RhdHVzX2NuMzB4eCB7CisJCXVpbnQ2NF90IHJlc2VydmVkXzE2XzYzOjQ4OworCQl1aW50NjRfdCBwd3Ffd3FlZDoxOworCQl1aW50NjRfdCBwd3Ffd3AxOjE7CisJCXVpbnQ2NF90IHB3cV9wb3c6MTsKKwkJdWludDY0X3QgaXBxX3BiZTE6MTsKKwkJdWludDY0X3QgaXBxX3BiZTA6MTsKKwkJdWludDY0X3QgcGJtMzoxOworCQl1aW50NjRfdCBwYm0yOjE7CisJCXVpbnQ2NF90IHBibTE6MTsKKwkJdWludDY0X3QgcGJtMDoxOworCQl1aW50NjRfdCBwYm1fd29yZDoxOworCQl1aW50NjRfdCBwd3ExOjE7CisJCXVpbnQ2NF90IHB3cTA6MTsKKwkJdWludDY0X3QgcHJjX29mZjoxOworCQl1aW50NjRfdCBpcGRfb2xkOjE7CisJCXVpbnQ2NF90IGlwZF9uZXc6MTsKKwkJdWludDY0X3QgcHdwOjE7CisJfSBjbjMweHg7CisJc3RydWN0IGN2bXhfaXBkX2Jpc3Rfc3RhdHVzX2NuMzB4eCBjbjMxeHg7CisJc3RydWN0IGN2bXhfaXBkX2Jpc3Rfc3RhdHVzX2NuMzB4eCBjbjM4eHg7CisJc3RydWN0IGN2bXhfaXBkX2Jpc3Rfc3RhdHVzX2NuMzB4eCBjbjM4eHhwMjsKKwlzdHJ1Y3QgY3ZteF9pcGRfYmlzdF9zdGF0dXNfY24zMHh4IGNuNTB4eDsKKwlzdHJ1Y3QgY3ZteF9pcGRfYmlzdF9zdGF0dXNfcyBjbjUyeHg7CisJc3RydWN0IGN2bXhfaXBkX2Jpc3Rfc3RhdHVzX3MgY241Mnh4cDE7CisJc3RydWN0IGN2bXhfaXBkX2Jpc3Rfc3RhdHVzX3MgY241Nnh4OworCXN0cnVjdCBjdm14X2lwZF9iaXN0X3N0YXR1c19zIGNuNTZ4eHAxOworCXN0cnVjdCBjdm14X2lwZF9iaXN0X3N0YXR1c19jbjMweHggY241OHh4OworCXN0cnVjdCBjdm14X2lwZF9iaXN0X3N0YXR1c19jbjMweHggY241OHh4cDE7Cit9OworCit1bmlvbiBjdm14X2lwZF9icF9wcnRfcmVkX2VuZCB7CisJdWludDY0X3QgdTY0OworCXN0cnVjdCBjdm14X2lwZF9icF9wcnRfcmVkX2VuZF9zIHsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfNDBfNjM6MjQ7CisJCXVpbnQ2NF90IHBydF9lbmI6NDA7CisJfSBzOworCXN0cnVjdCBjdm14X2lwZF9icF9wcnRfcmVkX2VuZF9jbjMweHggeworCQl1aW50NjRfdCByZXNlcnZlZF8zNl82MzoyODsKKwkJdWludDY0X3QgcHJ0X2VuYjozNjsKKwl9IGNuMzB4eDsKKwlzdHJ1Y3QgY3ZteF9pcGRfYnBfcHJ0X3JlZF9lbmRfY24zMHh4IGNuMzF4eDsKKwlzdHJ1Y3QgY3ZteF9pcGRfYnBfcHJ0X3JlZF9lbmRfY24zMHh4IGNuMzh4eDsKKwlzdHJ1Y3QgY3ZteF9pcGRfYnBfcHJ0X3JlZF9lbmRfY24zMHh4IGNuMzh4eHAyOworCXN0cnVjdCBjdm14X2lwZF9icF9wcnRfcmVkX2VuZF9jbjMweHggY241MHh4OworCXN0cnVjdCBjdm14X2lwZF9icF9wcnRfcmVkX2VuZF9zIGNuNTJ4eDsKKwlzdHJ1Y3QgY3ZteF9pcGRfYnBfcHJ0X3JlZF9lbmRfcyBjbjUyeHhwMTsKKwlzdHJ1Y3QgY3ZteF9pcGRfYnBfcHJ0X3JlZF9lbmRfcyBjbjU2eHg7CisJc3RydWN0IGN2bXhfaXBkX2JwX3BydF9yZWRfZW5kX3MgY241Nnh4cDE7CisJc3RydWN0IGN2bXhfaXBkX2JwX3BydF9yZWRfZW5kX2NuMzB4eCBjbjU4eHg7CisJc3RydWN0IGN2bXhfaXBkX2JwX3BydF9yZWRfZW5kX2NuMzB4eCBjbjU4eHhwMTsKK307CisKK3VuaW9uIGN2bXhfaXBkX2Nsa19jb3VudCB7CisJdWludDY0X3QgdTY0OworCXN0cnVjdCBjdm14X2lwZF9jbGtfY291bnRfcyB7CisJCXVpbnQ2NF90IGNsa19jbnQ6NjQ7CisJfSBzOworCXN0cnVjdCBjdm14X2lwZF9jbGtfY291bnRfcyBjbjMweHg7CisJc3RydWN0IGN2bXhfaXBkX2Nsa19jb3VudF9zIGNuMzF4eDsKKwlzdHJ1Y3QgY3ZteF9pcGRfY2xrX2NvdW50X3MgY24zOHh4OworCXN0cnVjdCBjdm14X2lwZF9jbGtfY291bnRfcyBjbjM4eHhwMjsKKwlzdHJ1Y3QgY3ZteF9pcGRfY2xrX2NvdW50X3MgY241MHh4OworCXN0cnVjdCBjdm14X2lwZF9jbGtfY291bnRfcyBjbjUyeHg7CisJc3RydWN0IGN2bXhfaXBkX2Nsa19jb3VudF9zIGNuNTJ4eHAxOworCXN0cnVjdCBjdm14X2lwZF9jbGtfY291bnRfcyBjbjU2eHg7CisJc3RydWN0IGN2bXhfaXBkX2Nsa19jb3VudF9zIGNuNTZ4eHAxOworCXN0cnVjdCBjdm14X2lwZF9jbGtfY291bnRfcyBjbjU4eHg7CisJc3RydWN0IGN2bXhfaXBkX2Nsa19jb3VudF9zIGNuNTh4eHAxOworfTsKKwordW5pb24gY3ZteF9pcGRfY3RsX3N0YXR1cyB7CisJdWludDY0X3QgdTY0OworCXN0cnVjdCBjdm14X2lwZF9jdGxfc3RhdHVzX3MgeworCQl1aW50NjRfdCByZXNlcnZlZF8xNV82Mzo0OTsKKwkJdWludDY0X3Qgbm9fd3B0cjoxOworCQl1aW50NjRfdCBwcV9hcGt0OjE7CisJCXVpbnQ2NF90IHBxX25hYnVmOjE7CisJCXVpbnQ2NF90IGlwZF9mdWxsOjE7CisJCXVpbnQ2NF90IHBrdF9vZmY6MTsKKwkJdWludDY0X3QgbGVuX204OjE7CisJCXVpbnQ2NF90IHJlc2V0OjE7CisJCXVpbnQ2NF90IGFkZHBrdDoxOworCQl1aW50NjRfdCBuYWRkYnVmOjE7CisJCXVpbnQ2NF90IHBrdF9sZW5kOjE7CisJCXVpbnQ2NF90IHdxZV9sZW5kOjE7CisJCXVpbnQ2NF90IHBicF9lbjoxOworCQl1aW50NjRfdCBvcGNfbW9kZToyOworCQl1aW50NjRfdCBpcGRfZW46MTsKKwl9IHM7CisJc3RydWN0IGN2bXhfaXBkX2N0bF9zdGF0dXNfY24zMHh4IHsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfMTBfNjM6NTQ7CisJCXVpbnQ2NF90IGxlbl9tODoxOworCQl1aW50NjRfdCByZXNldDoxOworCQl1aW50NjRfdCBhZGRwa3Q6MTsKKwkJdWludDY0X3QgbmFkZGJ1ZjoxOworCQl1aW50NjRfdCBwa3RfbGVuZDoxOworCQl1aW50NjRfdCB3cWVfbGVuZDoxOworCQl1aW50NjRfdCBwYnBfZW46MTsKKwkJdWludDY0X3Qgb3BjX21vZGU6MjsKKwkJdWludDY0X3QgaXBkX2VuOjE7CisJfSBjbjMweHg7CisJc3RydWN0IGN2bXhfaXBkX2N0bF9zdGF0dXNfY24zMHh4IGNuMzF4eDsKKwlzdHJ1Y3QgY3ZteF9pcGRfY3RsX3N0YXR1c19jbjMweHggY24zOHh4OworCXN0cnVjdCBjdm14X2lwZF9jdGxfc3RhdHVzX2NuMzh4eHAyIHsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfOV82Mzo1NTsKKwkJdWludDY0X3QgcmVzZXQ6MTsKKwkJdWludDY0X3QgYWRkcGt0OjE7CisJCXVpbnQ2NF90IG5hZGRidWY6MTsKKwkJdWludDY0X3QgcGt0X2xlbmQ6MTsKKwkJdWludDY0X3Qgd3FlX2xlbmQ6MTsKKwkJdWludDY0X3QgcGJwX2VuOjE7CisJCXVpbnQ2NF90IG9wY19tb2RlOjI7CisJCXVpbnQ2NF90IGlwZF9lbjoxOworCX0gY24zOHh4cDI7CisJc3RydWN0IGN2bXhfaXBkX2N0bF9zdGF0dXNfcyBjbjUweHg7CisJc3RydWN0IGN2bXhfaXBkX2N0bF9zdGF0dXNfcyBjbjUyeHg7CisJc3RydWN0IGN2bXhfaXBkX2N0bF9zdGF0dXNfcyBjbjUyeHhwMTsKKwlzdHJ1Y3QgY3ZteF9pcGRfY3RsX3N0YXR1c19zIGNuNTZ4eDsKKwlzdHJ1Y3QgY3ZteF9pcGRfY3RsX3N0YXR1c19zIGNuNTZ4eHAxOworCXN0cnVjdCBjdm14X2lwZF9jdGxfc3RhdHVzX2NuNTh4eCB7CisJCXVpbnQ2NF90IHJlc2VydmVkXzEyXzYzOjUyOworCQl1aW50NjRfdCBpcGRfZnVsbDoxOworCQl1aW50NjRfdCBwa3Rfb2ZmOjE7CisJCXVpbnQ2NF90IGxlbl9tODoxOworCQl1aW50NjRfdCByZXNldDoxOworCQl1aW50NjRfdCBhZGRwa3Q6MTsKKwkJdWludDY0X3QgbmFkZGJ1ZjoxOworCQl1aW50NjRfdCBwa3RfbGVuZDoxOworCQl1aW50NjRfdCB3cWVfbGVuZDoxOworCQl1aW50NjRfdCBwYnBfZW46MTsKKwkJdWludDY0X3Qgb3BjX21vZGU6MjsKKwkJdWludDY0X3QgaXBkX2VuOjE7CisJfSBjbjU4eHg7CisJc3RydWN0IGN2bXhfaXBkX2N0bF9zdGF0dXNfY241OHh4IGNuNTh4eHAxOworfTsKKwordW5pb24gY3ZteF9pcGRfaW50X2VuYiB7CisJdWludDY0X3QgdTY0OworCXN0cnVjdCBjdm14X2lwZF9pbnRfZW5iX3MgeworCQl1aW50NjRfdCByZXNlcnZlZF8xMl82Mzo1MjsKKwkJdWludDY0X3QgcHFfc3ViOjE7CisJCXVpbnQ2NF90IHBxX2FkZDoxOworCQl1aW50NjRfdCBiY19vdnI6MTsKKwkJdWludDY0X3QgZF9jb2xsOjE7CisJCXVpbnQ2NF90IGNfY29sbDoxOworCQl1aW50NjRfdCBjY19vdnI6MTsKKwkJdWludDY0X3QgZGNfb3ZyOjE7CisJCXVpbnQ2NF90IGJwX3N1YjoxOworCQl1aW50NjRfdCBwcmNfcGFyMzoxOworCQl1aW50NjRfdCBwcmNfcGFyMjoxOworCQl1aW50NjRfdCBwcmNfcGFyMToxOworCQl1aW50NjRfdCBwcmNfcGFyMDoxOworCX0gczsKKwlzdHJ1Y3QgY3ZteF9pcGRfaW50X2VuYl9jbjMweHggeworCQl1aW50NjRfdCByZXNlcnZlZF81XzYzOjU5OworCQl1aW50NjRfdCBicF9zdWI6MTsKKwkJdWludDY0X3QgcHJjX3BhcjM6MTsKKwkJdWludDY0X3QgcHJjX3BhcjI6MTsKKwkJdWludDY0X3QgcHJjX3BhcjE6MTsKKwkJdWludDY0X3QgcHJjX3BhcjA6MTsKKwl9IGNuMzB4eDsKKwlzdHJ1Y3QgY3ZteF9pcGRfaW50X2VuYl9jbjMweHggY24zMXh4OworCXN0cnVjdCBjdm14X2lwZF9pbnRfZW5iX2NuMzh4eCB7CisJCXVpbnQ2NF90IHJlc2VydmVkXzEwXzYzOjU0OworCQl1aW50NjRfdCBiY19vdnI6MTsKKwkJdWludDY0X3QgZF9jb2xsOjE7CisJCXVpbnQ2NF90IGNfY29sbDoxOworCQl1aW50NjRfdCBjY19vdnI6MTsKKwkJdWludDY0X3QgZGNfb3ZyOjE7CisJCXVpbnQ2NF90IGJwX3N1YjoxOworCQl1aW50NjRfdCBwcmNfcGFyMzoxOworCQl1aW50NjRfdCBwcmNfcGFyMjoxOworCQl1aW50NjRfdCBwcmNfcGFyMToxOworCQl1aW50NjRfdCBwcmNfcGFyMDoxOworCX0gY24zOHh4OworCXN0cnVjdCBjdm14X2lwZF9pbnRfZW5iX2NuMzB4eCBjbjM4eHhwMjsKKwlzdHJ1Y3QgY3ZteF9pcGRfaW50X2VuYl9jbjM4eHggY241MHh4OworCXN0cnVjdCBjdm14X2lwZF9pbnRfZW5iX3MgY241Mnh4OworCXN0cnVjdCBjdm14X2lwZF9pbnRfZW5iX3MgY241Mnh4cDE7CisJc3RydWN0IGN2bXhfaXBkX2ludF9lbmJfcyBjbjU2eHg7CisJc3RydWN0IGN2bXhfaXBkX2ludF9lbmJfcyBjbjU2eHhwMTsKKwlzdHJ1Y3QgY3ZteF9pcGRfaW50X2VuYl9jbjM4eHggY241OHh4OworCXN0cnVjdCBjdm14X2lwZF9pbnRfZW5iX2NuMzh4eCBjbjU4eHhwMTsKK307CisKK3VuaW9uIGN2bXhfaXBkX2ludF9zdW0geworCXVpbnQ2NF90IHU2NDsKKwlzdHJ1Y3QgY3ZteF9pcGRfaW50X3N1bV9zIHsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfMTJfNjM6NTI7CisJCXVpbnQ2NF90IHBxX3N1YjoxOworCQl1aW50NjRfdCBwcV9hZGQ6MTsKKwkJdWludDY0X3QgYmNfb3ZyOjE7CisJCXVpbnQ2NF90IGRfY29sbDoxOworCQl1aW50NjRfdCBjX2NvbGw6MTsKKwkJdWludDY0X3QgY2Nfb3ZyOjE7CisJCXVpbnQ2NF90IGRjX292cjoxOworCQl1aW50NjRfdCBicF9zdWI6MTsKKwkJdWludDY0X3QgcHJjX3BhcjM6MTsKKwkJdWludDY0X3QgcHJjX3BhcjI6MTsKKwkJdWludDY0X3QgcHJjX3BhcjE6MTsKKwkJdWludDY0X3QgcHJjX3BhcjA6MTsKKwl9IHM7CisJc3RydWN0IGN2bXhfaXBkX2ludF9zdW1fY24zMHh4IHsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfNV82Mzo1OTsKKwkJdWludDY0X3QgYnBfc3ViOjE7CisJCXVpbnQ2NF90IHByY19wYXIzOjE7CisJCXVpbnQ2NF90IHByY19wYXIyOjE7CisJCXVpbnQ2NF90IHByY19wYXIxOjE7CisJCXVpbnQ2NF90IHByY19wYXIwOjE7CisJfSBjbjMweHg7CisJc3RydWN0IGN2bXhfaXBkX2ludF9zdW1fY24zMHh4IGNuMzF4eDsKKwlzdHJ1Y3QgY3ZteF9pcGRfaW50X3N1bV9jbjM4eHggeworCQl1aW50NjRfdCByZXNlcnZlZF8xMF82Mzo1NDsKKwkJdWludDY0X3QgYmNfb3ZyOjE7CisJCXVpbnQ2NF90IGRfY29sbDoxOworCQl1aW50NjRfdCBjX2NvbGw6MTsKKwkJdWludDY0X3QgY2Nfb3ZyOjE7CisJCXVpbnQ2NF90IGRjX292cjoxOworCQl1aW50NjRfdCBicF9zdWI6MTsKKwkJdWludDY0X3QgcHJjX3BhcjM6MTsKKwkJdWludDY0X3QgcHJjX3BhcjI6MTsKKwkJdWludDY0X3QgcHJjX3BhcjE6MTsKKwkJdWludDY0X3QgcHJjX3BhcjA6MTsKKwl9IGNuMzh4eDsKKwlzdHJ1Y3QgY3ZteF9pcGRfaW50X3N1bV9jbjMweHggY24zOHh4cDI7CisJc3RydWN0IGN2bXhfaXBkX2ludF9zdW1fY24zOHh4IGNuNTB4eDsKKwlzdHJ1Y3QgY3ZteF9pcGRfaW50X3N1bV9zIGNuNTJ4eDsKKwlzdHJ1Y3QgY3ZteF9pcGRfaW50X3N1bV9zIGNuNTJ4eHAxOworCXN0cnVjdCBjdm14X2lwZF9pbnRfc3VtX3MgY241Nnh4OworCXN0cnVjdCBjdm14X2lwZF9pbnRfc3VtX3MgY241Nnh4cDE7CisJc3RydWN0IGN2bXhfaXBkX2ludF9zdW1fY24zOHh4IGNuNTh4eDsKKwlzdHJ1Y3QgY3ZteF9pcGRfaW50X3N1bV9jbjM4eHggY241OHh4cDE7Cit9OworCit1bmlvbiBjdm14X2lwZF9ub3RfMXN0X21idWZmX3NraXAgeworCXVpbnQ2NF90IHU2NDsKKwlzdHJ1Y3QgY3ZteF9pcGRfbm90XzFzdF9tYnVmZl9za2lwX3MgeworCQl1aW50NjRfdCByZXNlcnZlZF82XzYzOjU4OworCQl1aW50NjRfdCBza2lwX3N6OjY7CisJfSBzOworCXN0cnVjdCBjdm14X2lwZF9ub3RfMXN0X21idWZmX3NraXBfcyBjbjMweHg7CisJc3RydWN0IGN2bXhfaXBkX25vdF8xc3RfbWJ1ZmZfc2tpcF9zIGNuMzF4eDsKKwlzdHJ1Y3QgY3ZteF9pcGRfbm90XzFzdF9tYnVmZl9za2lwX3MgY24zOHh4OworCXN0cnVjdCBjdm14X2lwZF9ub3RfMXN0X21idWZmX3NraXBfcyBjbjM4eHhwMjsKKwlzdHJ1Y3QgY3ZteF9pcGRfbm90XzFzdF9tYnVmZl9za2lwX3MgY241MHh4OworCXN0cnVjdCBjdm14X2lwZF9ub3RfMXN0X21idWZmX3NraXBfcyBjbjUyeHg7CisJc3RydWN0IGN2bXhfaXBkX25vdF8xc3RfbWJ1ZmZfc2tpcF9zIGNuNTJ4eHAxOworCXN0cnVjdCBjdm14X2lwZF9ub3RfMXN0X21idWZmX3NraXBfcyBjbjU2eHg7CisJc3RydWN0IGN2bXhfaXBkX25vdF8xc3RfbWJ1ZmZfc2tpcF9zIGNuNTZ4eHAxOworCXN0cnVjdCBjdm14X2lwZF9ub3RfMXN0X21idWZmX3NraXBfcyBjbjU4eHg7CisJc3RydWN0IGN2bXhfaXBkX25vdF8xc3RfbWJ1ZmZfc2tpcF9zIGNuNTh4eHAxOworfTsKKwordW5pb24gY3ZteF9pcGRfcGFja2V0X21idWZmX3NpemUgeworCXVpbnQ2NF90IHU2NDsKKwlzdHJ1Y3QgY3ZteF9pcGRfcGFja2V0X21idWZmX3NpemVfcyB7CisJCXVpbnQ2NF90IHJlc2VydmVkXzEyXzYzOjUyOworCQl1aW50NjRfdCBtYl9zaXplOjEyOworCX0gczsKKwlzdHJ1Y3QgY3ZteF9pcGRfcGFja2V0X21idWZmX3NpemVfcyBjbjMweHg7CisJc3RydWN0IGN2bXhfaXBkX3BhY2tldF9tYnVmZl9zaXplX3MgY24zMXh4OworCXN0cnVjdCBjdm14X2lwZF9wYWNrZXRfbWJ1ZmZfc2l6ZV9zIGNuMzh4eDsKKwlzdHJ1Y3QgY3ZteF9pcGRfcGFja2V0X21idWZmX3NpemVfcyBjbjM4eHhwMjsKKwlzdHJ1Y3QgY3ZteF9pcGRfcGFja2V0X21idWZmX3NpemVfcyBjbjUweHg7CisJc3RydWN0IGN2bXhfaXBkX3BhY2tldF9tYnVmZl9zaXplX3MgY241Mnh4OworCXN0cnVjdCBjdm14X2lwZF9wYWNrZXRfbWJ1ZmZfc2l6ZV9zIGNuNTJ4eHAxOworCXN0cnVjdCBjdm14X2lwZF9wYWNrZXRfbWJ1ZmZfc2l6ZV9zIGNuNTZ4eDsKKwlzdHJ1Y3QgY3ZteF9pcGRfcGFja2V0X21idWZmX3NpemVfcyBjbjU2eHhwMTsKKwlzdHJ1Y3QgY3ZteF9pcGRfcGFja2V0X21idWZmX3NpemVfcyBjbjU4eHg7CisJc3RydWN0IGN2bXhfaXBkX3BhY2tldF9tYnVmZl9zaXplX3MgY241OHh4cDE7Cit9OworCit1bmlvbiBjdm14X2lwZF9wa3RfcHRyX3ZhbGlkIHsKKwl1aW50NjRfdCB1NjQ7CisJc3RydWN0IGN2bXhfaXBkX3BrdF9wdHJfdmFsaWRfcyB7CisJCXVpbnQ2NF90IHJlc2VydmVkXzI5XzYzOjM1OworCQl1aW50NjRfdCBwdHI6Mjk7CisJfSBzOworCXN0cnVjdCBjdm14X2lwZF9wa3RfcHRyX3ZhbGlkX3MgY24zMHh4OworCXN0cnVjdCBjdm14X2lwZF9wa3RfcHRyX3ZhbGlkX3MgY24zMXh4OworCXN0cnVjdCBjdm14X2lwZF9wa3RfcHRyX3ZhbGlkX3MgY24zOHh4OworCXN0cnVjdCBjdm14X2lwZF9wa3RfcHRyX3ZhbGlkX3MgY241MHh4OworCXN0cnVjdCBjdm14X2lwZF9wa3RfcHRyX3ZhbGlkX3MgY241Mnh4OworCXN0cnVjdCBjdm14X2lwZF9wa3RfcHRyX3ZhbGlkX3MgY241Mnh4cDE7CisJc3RydWN0IGN2bXhfaXBkX3BrdF9wdHJfdmFsaWRfcyBjbjU2eHg7CisJc3RydWN0IGN2bXhfaXBkX3BrdF9wdHJfdmFsaWRfcyBjbjU2eHhwMTsKKwlzdHJ1Y3QgY3ZteF9pcGRfcGt0X3B0cl92YWxpZF9zIGNuNTh4eDsKKwlzdHJ1Y3QgY3ZteF9pcGRfcGt0X3B0cl92YWxpZF9zIGNuNTh4eHAxOworfTsKKwordW5pb24gY3ZteF9pcGRfcG9ydHhfYnBfcGFnZV9jbnQgeworCXVpbnQ2NF90IHU2NDsKKwlzdHJ1Y3QgY3ZteF9pcGRfcG9ydHhfYnBfcGFnZV9jbnRfcyB7CisJCXVpbnQ2NF90IHJlc2VydmVkXzE4XzYzOjQ2OworCQl1aW50NjRfdCBicF9lbmI6MTsKKwkJdWludDY0X3QgcGFnZV9jbnQ6MTc7CisJfSBzOworCXN0cnVjdCBjdm14X2lwZF9wb3J0eF9icF9wYWdlX2NudF9zIGNuMzB4eDsKKwlzdHJ1Y3QgY3ZteF9pcGRfcG9ydHhfYnBfcGFnZV9jbnRfcyBjbjMxeHg7CisJc3RydWN0IGN2bXhfaXBkX3BvcnR4X2JwX3BhZ2VfY250X3MgY24zOHh4OworCXN0cnVjdCBjdm14X2lwZF9wb3J0eF9icF9wYWdlX2NudF9zIGNuMzh4eHAyOworCXN0cnVjdCBjdm14X2lwZF9wb3J0eF9icF9wYWdlX2NudF9zIGNuNTB4eDsKKwlzdHJ1Y3QgY3ZteF9pcGRfcG9ydHhfYnBfcGFnZV9jbnRfcyBjbjUyeHg7CisJc3RydWN0IGN2bXhfaXBkX3BvcnR4X2JwX3BhZ2VfY250X3MgY241Mnh4cDE7CisJc3RydWN0IGN2bXhfaXBkX3BvcnR4X2JwX3BhZ2VfY250X3MgY241Nnh4OworCXN0cnVjdCBjdm14X2lwZF9wb3J0eF9icF9wYWdlX2NudF9zIGNuNTZ4eHAxOworCXN0cnVjdCBjdm14X2lwZF9wb3J0eF9icF9wYWdlX2NudF9zIGNuNTh4eDsKKwlzdHJ1Y3QgY3ZteF9pcGRfcG9ydHhfYnBfcGFnZV9jbnRfcyBjbjU4eHhwMTsKK307CisKK3VuaW9uIGN2bXhfaXBkX3BvcnR4X2JwX3BhZ2VfY250MiB7CisJdWludDY0X3QgdTY0OworCXN0cnVjdCBjdm14X2lwZF9wb3J0eF9icF9wYWdlX2NudDJfcyB7CisJCXVpbnQ2NF90IHJlc2VydmVkXzE4XzYzOjQ2OworCQl1aW50NjRfdCBicF9lbmI6MTsKKwkJdWludDY0X3QgcGFnZV9jbnQ6MTc7CisJfSBzOworCXN0cnVjdCBjdm14X2lwZF9wb3J0eF9icF9wYWdlX2NudDJfcyBjbjUyeHg7CisJc3RydWN0IGN2bXhfaXBkX3BvcnR4X2JwX3BhZ2VfY250Ml9zIGNuNTJ4eHAxOworCXN0cnVjdCBjdm14X2lwZF9wb3J0eF9icF9wYWdlX2NudDJfcyBjbjU2eHg7CisJc3RydWN0IGN2bXhfaXBkX3BvcnR4X2JwX3BhZ2VfY250Ml9zIGNuNTZ4eHAxOworfTsKKwordW5pb24gY3ZteF9pcGRfcG9ydF9icF9jb3VudGVyczJfcGFpcnggeworCXVpbnQ2NF90IHU2NDsKKwlzdHJ1Y3QgY3ZteF9pcGRfcG9ydF9icF9jb3VudGVyczJfcGFpcnhfcyB7CisJCXVpbnQ2NF90IHJlc2VydmVkXzI1XzYzOjM5OworCQl1aW50NjRfdCBjbnRfdmFsOjI1OworCX0gczsKKwlzdHJ1Y3QgY3ZteF9pcGRfcG9ydF9icF9jb3VudGVyczJfcGFpcnhfcyBjbjUyeHg7CisJc3RydWN0IGN2bXhfaXBkX3BvcnRfYnBfY291bnRlcnMyX3BhaXJ4X3MgY241Mnh4cDE7CisJc3RydWN0IGN2bXhfaXBkX3BvcnRfYnBfY291bnRlcnMyX3BhaXJ4X3MgY241Nnh4OworCXN0cnVjdCBjdm14X2lwZF9wb3J0X2JwX2NvdW50ZXJzMl9wYWlyeF9zIGNuNTZ4eHAxOworfTsKKwordW5pb24gY3ZteF9pcGRfcG9ydF9icF9jb3VudGVyc19wYWlyeCB7CisJdWludDY0X3QgdTY0OworCXN0cnVjdCBjdm14X2lwZF9wb3J0X2JwX2NvdW50ZXJzX3BhaXJ4X3MgeworCQl1aW50NjRfdCByZXNlcnZlZF8yNV82MzozOTsKKwkJdWludDY0X3QgY250X3ZhbDoyNTsKKwl9IHM7CisJc3RydWN0IGN2bXhfaXBkX3BvcnRfYnBfY291bnRlcnNfcGFpcnhfcyBjbjMweHg7CisJc3RydWN0IGN2bXhfaXBkX3BvcnRfYnBfY291bnRlcnNfcGFpcnhfcyBjbjMxeHg7CisJc3RydWN0IGN2bXhfaXBkX3BvcnRfYnBfY291bnRlcnNfcGFpcnhfcyBjbjM4eHg7CisJc3RydWN0IGN2bXhfaXBkX3BvcnRfYnBfY291bnRlcnNfcGFpcnhfcyBjbjM4eHhwMjsKKwlzdHJ1Y3QgY3ZteF9pcGRfcG9ydF9icF9jb3VudGVyc19wYWlyeF9zIGNuNTB4eDsKKwlzdHJ1Y3QgY3ZteF9pcGRfcG9ydF9icF9jb3VudGVyc19wYWlyeF9zIGNuNTJ4eDsKKwlzdHJ1Y3QgY3ZteF9pcGRfcG9ydF9icF9jb3VudGVyc19wYWlyeF9zIGNuNTJ4eHAxOworCXN0cnVjdCBjdm14X2lwZF9wb3J0X2JwX2NvdW50ZXJzX3BhaXJ4X3MgY241Nnh4OworCXN0cnVjdCBjdm14X2lwZF9wb3J0X2JwX2NvdW50ZXJzX3BhaXJ4X3MgY241Nnh4cDE7CisJc3RydWN0IGN2bXhfaXBkX3BvcnRfYnBfY291bnRlcnNfcGFpcnhfcyBjbjU4eHg7CisJc3RydWN0IGN2bXhfaXBkX3BvcnRfYnBfY291bnRlcnNfcGFpcnhfcyBjbjU4eHhwMTsKK307CisKK3VuaW9uIGN2bXhfaXBkX3BvcnRfcW9zX3hfY250IHsKKwl1aW50NjRfdCB1NjQ7CisJc3RydWN0IGN2bXhfaXBkX3BvcnRfcW9zX3hfY250X3MgeworCQl1aW50NjRfdCB3bWFyazozMjsKKwkJdWludDY0X3QgY250OjMyOworCX0gczsKKwlzdHJ1Y3QgY3ZteF9pcGRfcG9ydF9xb3NfeF9jbnRfcyBjbjUyeHg7CisJc3RydWN0IGN2bXhfaXBkX3BvcnRfcW9zX3hfY250X3MgY241Mnh4cDE7CisJc3RydWN0IGN2bXhfaXBkX3BvcnRfcW9zX3hfY250X3MgY241Nnh4OworCXN0cnVjdCBjdm14X2lwZF9wb3J0X3Fvc194X2NudF9zIGNuNTZ4eHAxOworfTsKKwordW5pb24gY3ZteF9pcGRfcG9ydF9xb3NfaW50eCB7CisJdWludDY0X3QgdTY0OworCXN0cnVjdCBjdm14X2lwZF9wb3J0X3Fvc19pbnR4X3MgeworCQl1aW50NjRfdCBpbnRyOjY0OworCX0gczsKKwlzdHJ1Y3QgY3ZteF9pcGRfcG9ydF9xb3NfaW50eF9zIGNuNTJ4eDsKKwlzdHJ1Y3QgY3ZteF9pcGRfcG9ydF9xb3NfaW50eF9zIGNuNTJ4eHAxOworCXN0cnVjdCBjdm14X2lwZF9wb3J0X3Fvc19pbnR4X3MgY241Nnh4OworCXN0cnVjdCBjdm14X2lwZF9wb3J0X3Fvc19pbnR4X3MgY241Nnh4cDE7Cit9OworCit1bmlvbiBjdm14X2lwZF9wb3J0X3Fvc19pbnRfZW5ieCB7CisJdWludDY0X3QgdTY0OworCXN0cnVjdCBjdm14X2lwZF9wb3J0X3Fvc19pbnRfZW5ieF9zIHsKKwkJdWludDY0X3QgZW5iOjY0OworCX0gczsKKwlzdHJ1Y3QgY3ZteF9pcGRfcG9ydF9xb3NfaW50X2VuYnhfcyBjbjUyeHg7CisJc3RydWN0IGN2bXhfaXBkX3BvcnRfcW9zX2ludF9lbmJ4X3MgY241Mnh4cDE7CisJc3RydWN0IGN2bXhfaXBkX3BvcnRfcW9zX2ludF9lbmJ4X3MgY241Nnh4OworCXN0cnVjdCBjdm14X2lwZF9wb3J0X3Fvc19pbnRfZW5ieF9zIGNuNTZ4eHAxOworfTsKKwordW5pb24gY3ZteF9pcGRfcHJjX2hvbGRfcHRyX2ZpZm9fY3RsIHsKKwl1aW50NjRfdCB1NjQ7CisJc3RydWN0IGN2bXhfaXBkX3ByY19ob2xkX3B0cl9maWZvX2N0bF9zIHsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfMzlfNjM6MjU7CisJCXVpbnQ2NF90IG1heF9wa3Q6MzsKKwkJdWludDY0X3QgcHJhZGRyOjM7CisJCXVpbnQ2NF90IHB0cjoyOTsKKwkJdWludDY0X3QgY2VuYToxOworCQl1aW50NjRfdCByYWRkcjozOworCX0gczsKKwlzdHJ1Y3QgY3ZteF9pcGRfcHJjX2hvbGRfcHRyX2ZpZm9fY3RsX3MgY24zMHh4OworCXN0cnVjdCBjdm14X2lwZF9wcmNfaG9sZF9wdHJfZmlmb19jdGxfcyBjbjMxeHg7CisJc3RydWN0IGN2bXhfaXBkX3ByY19ob2xkX3B0cl9maWZvX2N0bF9zIGNuMzh4eDsKKwlzdHJ1Y3QgY3ZteF9pcGRfcHJjX2hvbGRfcHRyX2ZpZm9fY3RsX3MgY241MHh4OworCXN0cnVjdCBjdm14X2lwZF9wcmNfaG9sZF9wdHJfZmlmb19jdGxfcyBjbjUyeHg7CisJc3RydWN0IGN2bXhfaXBkX3ByY19ob2xkX3B0cl9maWZvX2N0bF9zIGNuNTJ4eHAxOworCXN0cnVjdCBjdm14X2lwZF9wcmNfaG9sZF9wdHJfZmlmb19jdGxfcyBjbjU2eHg7CisJc3RydWN0IGN2bXhfaXBkX3ByY19ob2xkX3B0cl9maWZvX2N0bF9zIGNuNTZ4eHAxOworCXN0cnVjdCBjdm14X2lwZF9wcmNfaG9sZF9wdHJfZmlmb19jdGxfcyBjbjU4eHg7CisJc3RydWN0IGN2bXhfaXBkX3ByY19ob2xkX3B0cl9maWZvX2N0bF9zIGNuNTh4eHAxOworfTsKKwordW5pb24gY3ZteF9pcGRfcHJjX3BvcnRfcHRyX2ZpZm9fY3RsIHsKKwl1aW50NjRfdCB1NjQ7CisJc3RydWN0IGN2bXhfaXBkX3ByY19wb3J0X3B0cl9maWZvX2N0bF9zIHsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfNDRfNjM6MjA7CisJCXVpbnQ2NF90IG1heF9wa3Q6NzsKKwkJdWludDY0X3QgcHRyOjI5OworCQl1aW50NjRfdCBjZW5hOjE7CisJCXVpbnQ2NF90IHJhZGRyOjc7CisJfSBzOworCXN0cnVjdCBjdm14X2lwZF9wcmNfcG9ydF9wdHJfZmlmb19jdGxfcyBjbjMweHg7CisJc3RydWN0IGN2bXhfaXBkX3ByY19wb3J0X3B0cl9maWZvX2N0bF9zIGNuMzF4eDsKKwlzdHJ1Y3QgY3ZteF9pcGRfcHJjX3BvcnRfcHRyX2ZpZm9fY3RsX3MgY24zOHh4OworCXN0cnVjdCBjdm14X2lwZF9wcmNfcG9ydF9wdHJfZmlmb19jdGxfcyBjbjUweHg7CisJc3RydWN0IGN2bXhfaXBkX3ByY19wb3J0X3B0cl9maWZvX2N0bF9zIGNuNTJ4eDsKKwlzdHJ1Y3QgY3ZteF9pcGRfcHJjX3BvcnRfcHRyX2ZpZm9fY3RsX3MgY241Mnh4cDE7CisJc3RydWN0IGN2bXhfaXBkX3ByY19wb3J0X3B0cl9maWZvX2N0bF9zIGNuNTZ4eDsKKwlzdHJ1Y3QgY3ZteF9pcGRfcHJjX3BvcnRfcHRyX2ZpZm9fY3RsX3MgY241Nnh4cDE7CisJc3RydWN0IGN2bXhfaXBkX3ByY19wb3J0X3B0cl9maWZvX2N0bF9zIGNuNTh4eDsKKwlzdHJ1Y3QgY3ZteF9pcGRfcHJjX3BvcnRfcHRyX2ZpZm9fY3RsX3MgY241OHh4cDE7Cit9OworCit1bmlvbiBjdm14X2lwZF9wdHJfY291bnQgeworCXVpbnQ2NF90IHU2NDsKKwlzdHJ1Y3QgY3ZteF9pcGRfcHRyX2NvdW50X3MgeworCQl1aW50NjRfdCByZXNlcnZlZF8xOV82Mzo0NTsKKwkJdWludDY0X3QgcGt0dl9jbnQ6MTsKKwkJdWludDY0X3Qgd3Fldl9jbnQ6MTsKKwkJdWludDY0X3QgcGZpZl9jbnQ6MzsKKwkJdWludDY0X3QgcGt0X3BjbnQ6NzsKKwkJdWludDY0X3Qgd3FlX3BjbnQ6NzsKKwl9IHM7CisJc3RydWN0IGN2bXhfaXBkX3B0cl9jb3VudF9zIGNuMzB4eDsKKwlzdHJ1Y3QgY3ZteF9pcGRfcHRyX2NvdW50X3MgY24zMXh4OworCXN0cnVjdCBjdm14X2lwZF9wdHJfY291bnRfcyBjbjM4eHg7CisJc3RydWN0IGN2bXhfaXBkX3B0cl9jb3VudF9zIGNuMzh4eHAyOworCXN0cnVjdCBjdm14X2lwZF9wdHJfY291bnRfcyBjbjUweHg7CisJc3RydWN0IGN2bXhfaXBkX3B0cl9jb3VudF9zIGNuNTJ4eDsKKwlzdHJ1Y3QgY3ZteF9pcGRfcHRyX2NvdW50X3MgY241Mnh4cDE7CisJc3RydWN0IGN2bXhfaXBkX3B0cl9jb3VudF9zIGNuNTZ4eDsKKwlzdHJ1Y3QgY3ZteF9pcGRfcHRyX2NvdW50X3MgY241Nnh4cDE7CisJc3RydWN0IGN2bXhfaXBkX3B0cl9jb3VudF9zIGNuNTh4eDsKKwlzdHJ1Y3QgY3ZteF9pcGRfcHRyX2NvdW50X3MgY241OHh4cDE7Cit9OworCit1bmlvbiBjdm14X2lwZF9wd3BfcHRyX2ZpZm9fY3RsIHsKKwl1aW50NjRfdCB1NjQ7CisJc3RydWN0IGN2bXhfaXBkX3B3cF9wdHJfZmlmb19jdGxfcyB7CisJCXVpbnQ2NF90IHJlc2VydmVkXzYxXzYzOjM7CisJCXVpbnQ2NF90IG1heF9jbnRzOjc7CisJCXVpbnQ2NF90IHdyYWRkcjo4OworCQl1aW50NjRfdCBwcmFkZHI6ODsKKwkJdWludDY0X3QgcHRyOjI5OworCQl1aW50NjRfdCBjZW5hOjE7CisJCXVpbnQ2NF90IHJhZGRyOjg7CisJfSBzOworCXN0cnVjdCBjdm14X2lwZF9wd3BfcHRyX2ZpZm9fY3RsX3MgY24zMHh4OworCXN0cnVjdCBjdm14X2lwZF9wd3BfcHRyX2ZpZm9fY3RsX3MgY24zMXh4OworCXN0cnVjdCBjdm14X2lwZF9wd3BfcHRyX2ZpZm9fY3RsX3MgY24zOHh4OworCXN0cnVjdCBjdm14X2lwZF9wd3BfcHRyX2ZpZm9fY3RsX3MgY241MHh4OworCXN0cnVjdCBjdm14X2lwZF9wd3BfcHRyX2ZpZm9fY3RsX3MgY241Mnh4OworCXN0cnVjdCBjdm14X2lwZF9wd3BfcHRyX2ZpZm9fY3RsX3MgY241Mnh4cDE7CisJc3RydWN0IGN2bXhfaXBkX3B3cF9wdHJfZmlmb19jdGxfcyBjbjU2eHg7CisJc3RydWN0IGN2bXhfaXBkX3B3cF9wdHJfZmlmb19jdGxfcyBjbjU2eHhwMTsKKwlzdHJ1Y3QgY3ZteF9pcGRfcHdwX3B0cl9maWZvX2N0bF9zIGNuNTh4eDsKKwlzdHJ1Y3QgY3ZteF9pcGRfcHdwX3B0cl9maWZvX2N0bF9zIGNuNTh4eHAxOworfTsKKwordW5pb24gY3ZteF9pcGRfcW9zeF9yZWRfbWFya3MgeworCXVpbnQ2NF90IHU2NDsKKwlzdHJ1Y3QgY3ZteF9pcGRfcW9zeF9yZWRfbWFya3NfcyB7CisJCXVpbnQ2NF90IGRyb3A6MzI7CisJCXVpbnQ2NF90IHBhc3M6MzI7CisJfSBzOworCXN0cnVjdCBjdm14X2lwZF9xb3N4X3JlZF9tYXJrc19zIGNuMzB4eDsKKwlzdHJ1Y3QgY3ZteF9pcGRfcW9zeF9yZWRfbWFya3NfcyBjbjMxeHg7CisJc3RydWN0IGN2bXhfaXBkX3Fvc3hfcmVkX21hcmtzX3MgY24zOHh4OworCXN0cnVjdCBjdm14X2lwZF9xb3N4X3JlZF9tYXJrc19zIGNuMzh4eHAyOworCXN0cnVjdCBjdm14X2lwZF9xb3N4X3JlZF9tYXJrc19zIGNuNTB4eDsKKwlzdHJ1Y3QgY3ZteF9pcGRfcW9zeF9yZWRfbWFya3NfcyBjbjUyeHg7CisJc3RydWN0IGN2bXhfaXBkX3Fvc3hfcmVkX21hcmtzX3MgY241Mnh4cDE7CisJc3RydWN0IGN2bXhfaXBkX3Fvc3hfcmVkX21hcmtzX3MgY241Nnh4OworCXN0cnVjdCBjdm14X2lwZF9xb3N4X3JlZF9tYXJrc19zIGNuNTZ4eHAxOworCXN0cnVjdCBjdm14X2lwZF9xb3N4X3JlZF9tYXJrc19zIGNuNTh4eDsKKwlzdHJ1Y3QgY3ZteF9pcGRfcW9zeF9yZWRfbWFya3NfcyBjbjU4eHhwMTsKK307CisKK3VuaW9uIGN2bXhfaXBkX3F1ZTBfZnJlZV9wYWdlX2NudCB7CisJdWludDY0X3QgdTY0OworCXN0cnVjdCBjdm14X2lwZF9xdWUwX2ZyZWVfcGFnZV9jbnRfcyB7CisJCXVpbnQ2NF90IHJlc2VydmVkXzMyXzYzOjMyOworCQl1aW50NjRfdCBxMF9wY250OjMyOworCX0gczsKKwlzdHJ1Y3QgY3ZteF9pcGRfcXVlMF9mcmVlX3BhZ2VfY250X3MgY24zMHh4OworCXN0cnVjdCBjdm14X2lwZF9xdWUwX2ZyZWVfcGFnZV9jbnRfcyBjbjMxeHg7CisJc3RydWN0IGN2bXhfaXBkX3F1ZTBfZnJlZV9wYWdlX2NudF9zIGNuMzh4eDsKKwlzdHJ1Y3QgY3ZteF9pcGRfcXVlMF9mcmVlX3BhZ2VfY250X3MgY24zOHh4cDI7CisJc3RydWN0IGN2bXhfaXBkX3F1ZTBfZnJlZV9wYWdlX2NudF9zIGNuNTB4eDsKKwlzdHJ1Y3QgY3ZteF9pcGRfcXVlMF9mcmVlX3BhZ2VfY250X3MgY241Mnh4OworCXN0cnVjdCBjdm14X2lwZF9xdWUwX2ZyZWVfcGFnZV9jbnRfcyBjbjUyeHhwMTsKKwlzdHJ1Y3QgY3ZteF9pcGRfcXVlMF9mcmVlX3BhZ2VfY250X3MgY241Nnh4OworCXN0cnVjdCBjdm14X2lwZF9xdWUwX2ZyZWVfcGFnZV9jbnRfcyBjbjU2eHhwMTsKKwlzdHJ1Y3QgY3ZteF9pcGRfcXVlMF9mcmVlX3BhZ2VfY250X3MgY241OHh4OworCXN0cnVjdCBjdm14X2lwZF9xdWUwX2ZyZWVfcGFnZV9jbnRfcyBjbjU4eHhwMTsKK307CisKK3VuaW9uIGN2bXhfaXBkX3JlZF9wb3J0X2VuYWJsZSB7CisJdWludDY0X3QgdTY0OworCXN0cnVjdCBjdm14X2lwZF9yZWRfcG9ydF9lbmFibGVfcyB7CisJCXVpbnQ2NF90IHByYl9kbHk6MTQ7CisJCXVpbnQ2NF90IGF2Z19kbHk6MTQ7CisJCXVpbnQ2NF90IHBydF9lbmI6MzY7CisJfSBzOworCXN0cnVjdCBjdm14X2lwZF9yZWRfcG9ydF9lbmFibGVfcyBjbjMweHg7CisJc3RydWN0IGN2bXhfaXBkX3JlZF9wb3J0X2VuYWJsZV9zIGNuMzF4eDsKKwlzdHJ1Y3QgY3ZteF9pcGRfcmVkX3BvcnRfZW5hYmxlX3MgY24zOHh4OworCXN0cnVjdCBjdm14X2lwZF9yZWRfcG9ydF9lbmFibGVfcyBjbjM4eHhwMjsKKwlzdHJ1Y3QgY3ZteF9pcGRfcmVkX3BvcnRfZW5hYmxlX3MgY241MHh4OworCXN0cnVjdCBjdm14X2lwZF9yZWRfcG9ydF9lbmFibGVfcyBjbjUyeHg7CisJc3RydWN0IGN2bXhfaXBkX3JlZF9wb3J0X2VuYWJsZV9zIGNuNTJ4eHAxOworCXN0cnVjdCBjdm14X2lwZF9yZWRfcG9ydF9lbmFibGVfcyBjbjU2eHg7CisJc3RydWN0IGN2bXhfaXBkX3JlZF9wb3J0X2VuYWJsZV9zIGNuNTZ4eHAxOworCXN0cnVjdCBjdm14X2lwZF9yZWRfcG9ydF9lbmFibGVfcyBjbjU4eHg7CisJc3RydWN0IGN2bXhfaXBkX3JlZF9wb3J0X2VuYWJsZV9zIGNuNTh4eHAxOworfTsKKwordW5pb24gY3ZteF9pcGRfcmVkX3BvcnRfZW5hYmxlMiB7CisJdWludDY0X3QgdTY0OworCXN0cnVjdCBjdm14X2lwZF9yZWRfcG9ydF9lbmFibGUyX3MgeworCQl1aW50NjRfdCByZXNlcnZlZF80XzYzOjYwOworCQl1aW50NjRfdCBwcnRfZW5iOjQ7CisJfSBzOworCXN0cnVjdCBjdm14X2lwZF9yZWRfcG9ydF9lbmFibGUyX3MgY241Mnh4OworCXN0cnVjdCBjdm14X2lwZF9yZWRfcG9ydF9lbmFibGUyX3MgY241Mnh4cDE7CisJc3RydWN0IGN2bXhfaXBkX3JlZF9wb3J0X2VuYWJsZTJfcyBjbjU2eHg7CisJc3RydWN0IGN2bXhfaXBkX3JlZF9wb3J0X2VuYWJsZTJfcyBjbjU2eHhwMTsKK307CisKK3VuaW9uIGN2bXhfaXBkX3JlZF9xdWV4X3BhcmFtIHsKKwl1aW50NjRfdCB1NjQ7CisJc3RydWN0IGN2bXhfaXBkX3JlZF9xdWV4X3BhcmFtX3MgeworCQl1aW50NjRfdCByZXNlcnZlZF80OV82MzoxNTsKKwkJdWludDY0X3QgdXNlX3BjbnQ6MTsKKwkJdWludDY0X3QgbmV3X2Nvbjo4OworCQl1aW50NjRfdCBhdmdfY29uOjg7CisJCXVpbnQ2NF90IHByYl9jb246MzI7CisJfSBzOworCXN0cnVjdCBjdm14X2lwZF9yZWRfcXVleF9wYXJhbV9zIGNuMzB4eDsKKwlzdHJ1Y3QgY3ZteF9pcGRfcmVkX3F1ZXhfcGFyYW1fcyBjbjMxeHg7CisJc3RydWN0IGN2bXhfaXBkX3JlZF9xdWV4X3BhcmFtX3MgY24zOHh4OworCXN0cnVjdCBjdm14X2lwZF9yZWRfcXVleF9wYXJhbV9zIGNuMzh4eHAyOworCXN0cnVjdCBjdm14X2lwZF9yZWRfcXVleF9wYXJhbV9zIGNuNTB4eDsKKwlzdHJ1Y3QgY3ZteF9pcGRfcmVkX3F1ZXhfcGFyYW1fcyBjbjUyeHg7CisJc3RydWN0IGN2bXhfaXBkX3JlZF9xdWV4X3BhcmFtX3MgY241Mnh4cDE7CisJc3RydWN0IGN2bXhfaXBkX3JlZF9xdWV4X3BhcmFtX3MgY241Nnh4OworCXN0cnVjdCBjdm14X2lwZF9yZWRfcXVleF9wYXJhbV9zIGNuNTZ4eHAxOworCXN0cnVjdCBjdm14X2lwZF9yZWRfcXVleF9wYXJhbV9zIGNuNTh4eDsKKwlzdHJ1Y3QgY3ZteF9pcGRfcmVkX3F1ZXhfcGFyYW1fcyBjbjU4eHhwMTsKK307CisKK3VuaW9uIGN2bXhfaXBkX3N1Yl9wb3J0X2JwX3BhZ2VfY250IHsKKwl1aW50NjRfdCB1NjQ7CisJc3RydWN0IGN2bXhfaXBkX3N1Yl9wb3J0X2JwX3BhZ2VfY250X3MgeworCQl1aW50NjRfdCByZXNlcnZlZF8zMV82MzozMzsKKwkJdWludDY0X3QgcG9ydDo2OworCQl1aW50NjRfdCBwYWdlX2NudDoyNTsKKwl9IHM7CisJc3RydWN0IGN2bXhfaXBkX3N1Yl9wb3J0X2JwX3BhZ2VfY250X3MgY24zMHh4OworCXN0cnVjdCBjdm14X2lwZF9zdWJfcG9ydF9icF9wYWdlX2NudF9zIGNuMzF4eDsKKwlzdHJ1Y3QgY3ZteF9pcGRfc3ViX3BvcnRfYnBfcGFnZV9jbnRfcyBjbjM4eHg7CisJc3RydWN0IGN2bXhfaXBkX3N1Yl9wb3J0X2JwX3BhZ2VfY250X3MgY24zOHh4cDI7CisJc3RydWN0IGN2bXhfaXBkX3N1Yl9wb3J0X2JwX3BhZ2VfY250X3MgY241MHh4OworCXN0cnVjdCBjdm14X2lwZF9zdWJfcG9ydF9icF9wYWdlX2NudF9zIGNuNTJ4eDsKKwlzdHJ1Y3QgY3ZteF9pcGRfc3ViX3BvcnRfYnBfcGFnZV9jbnRfcyBjbjUyeHhwMTsKKwlzdHJ1Y3QgY3ZteF9pcGRfc3ViX3BvcnRfYnBfcGFnZV9jbnRfcyBjbjU2eHg7CisJc3RydWN0IGN2bXhfaXBkX3N1Yl9wb3J0X2JwX3BhZ2VfY250X3MgY241Nnh4cDE7CisJc3RydWN0IGN2bXhfaXBkX3N1Yl9wb3J0X2JwX3BhZ2VfY250X3MgY241OHh4OworCXN0cnVjdCBjdm14X2lwZF9zdWJfcG9ydF9icF9wYWdlX2NudF9zIGNuNTh4eHAxOworfTsKKwordW5pb24gY3ZteF9pcGRfc3ViX3BvcnRfZmNzIHsKKwl1aW50NjRfdCB1NjQ7CisJc3RydWN0IGN2bXhfaXBkX3N1Yl9wb3J0X2Zjc19zIHsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfNDBfNjM6MjQ7CisJCXVpbnQ2NF90IHBvcnRfYml0Mjo0OworCQl1aW50NjRfdCByZXNlcnZlZF8zMl8zNTo0OworCQl1aW50NjRfdCBwb3J0X2JpdDozMjsKKwl9IHM7CisJc3RydWN0IGN2bXhfaXBkX3N1Yl9wb3J0X2Zjc19jbjMweHggeworCQl1aW50NjRfdCByZXNlcnZlZF8zXzYzOjYxOworCQl1aW50NjRfdCBwb3J0X2JpdDozOworCX0gY24zMHh4OworCXN0cnVjdCBjdm14X2lwZF9zdWJfcG9ydF9mY3NfY24zMHh4IGNuMzF4eDsKKwlzdHJ1Y3QgY3ZteF9pcGRfc3ViX3BvcnRfZmNzX2NuMzh4eCB7CisJCXVpbnQ2NF90IHJlc2VydmVkXzMyXzYzOjMyOworCQl1aW50NjRfdCBwb3J0X2JpdDozMjsKKwl9IGNuMzh4eDsKKwlzdHJ1Y3QgY3ZteF9pcGRfc3ViX3BvcnRfZmNzX2NuMzh4eCBjbjM4eHhwMjsKKwlzdHJ1Y3QgY3ZteF9pcGRfc3ViX3BvcnRfZmNzX2NuMzB4eCBjbjUweHg7CisJc3RydWN0IGN2bXhfaXBkX3N1Yl9wb3J0X2Zjc19zIGNuNTJ4eDsKKwlzdHJ1Y3QgY3ZteF9pcGRfc3ViX3BvcnRfZmNzX3MgY241Mnh4cDE7CisJc3RydWN0IGN2bXhfaXBkX3N1Yl9wb3J0X2Zjc19zIGNuNTZ4eDsKKwlzdHJ1Y3QgY3ZteF9pcGRfc3ViX3BvcnRfZmNzX3MgY241Nnh4cDE7CisJc3RydWN0IGN2bXhfaXBkX3N1Yl9wb3J0X2Zjc19jbjM4eHggY241OHh4OworCXN0cnVjdCBjdm14X2lwZF9zdWJfcG9ydF9mY3NfY24zOHh4IGNuNTh4eHAxOworfTsKKwordW5pb24gY3ZteF9pcGRfc3ViX3BvcnRfcW9zX2NudCB7CisJdWludDY0X3QgdTY0OworCXN0cnVjdCBjdm14X2lwZF9zdWJfcG9ydF9xb3NfY250X3MgeworCQl1aW50NjRfdCByZXNlcnZlZF80MV82MzoyMzsKKwkJdWludDY0X3QgcG9ydF9xb3M6OTsKKwkJdWludDY0X3QgY250OjMyOworCX0gczsKKwlzdHJ1Y3QgY3ZteF9pcGRfc3ViX3BvcnRfcW9zX2NudF9zIGNuNTJ4eDsKKwlzdHJ1Y3QgY3ZteF9pcGRfc3ViX3BvcnRfcW9zX2NudF9zIGNuNTJ4eHAxOworCXN0cnVjdCBjdm14X2lwZF9zdWJfcG9ydF9xb3NfY250X3MgY241Nnh4OworCXN0cnVjdCBjdm14X2lwZF9zdWJfcG9ydF9xb3NfY250X3MgY241Nnh4cDE7Cit9OworCit1bmlvbiBjdm14X2lwZF93cWVfZnBhX3F1ZXVlIHsKKwl1aW50NjRfdCB1NjQ7CisJc3RydWN0IGN2bXhfaXBkX3dxZV9mcGFfcXVldWVfcyB7CisJCXVpbnQ2NF90IHJlc2VydmVkXzNfNjM6NjE7CisJCXVpbnQ2NF90IHdxZV9wb29sOjM7CisJfSBzOworCXN0cnVjdCBjdm14X2lwZF93cWVfZnBhX3F1ZXVlX3MgY24zMHh4OworCXN0cnVjdCBjdm14X2lwZF93cWVfZnBhX3F1ZXVlX3MgY24zMXh4OworCXN0cnVjdCBjdm14X2lwZF93cWVfZnBhX3F1ZXVlX3MgY24zOHh4OworCXN0cnVjdCBjdm14X2lwZF93cWVfZnBhX3F1ZXVlX3MgY24zOHh4cDI7CisJc3RydWN0IGN2bXhfaXBkX3dxZV9mcGFfcXVldWVfcyBjbjUweHg7CisJc3RydWN0IGN2bXhfaXBkX3dxZV9mcGFfcXVldWVfcyBjbjUyeHg7CisJc3RydWN0IGN2bXhfaXBkX3dxZV9mcGFfcXVldWVfcyBjbjUyeHhwMTsKKwlzdHJ1Y3QgY3ZteF9pcGRfd3FlX2ZwYV9xdWV1ZV9zIGNuNTZ4eDsKKwlzdHJ1Y3QgY3ZteF9pcGRfd3FlX2ZwYV9xdWV1ZV9zIGNuNTZ4eHAxOworCXN0cnVjdCBjdm14X2lwZF93cWVfZnBhX3F1ZXVlX3MgY241OHh4OworCXN0cnVjdCBjdm14X2lwZF93cWVfZnBhX3F1ZXVlX3MgY241OHh4cDE7Cit9OworCit1bmlvbiBjdm14X2lwZF93cWVfcHRyX3ZhbGlkIHsKKwl1aW50NjRfdCB1NjQ7CisJc3RydWN0IGN2bXhfaXBkX3dxZV9wdHJfdmFsaWRfcyB7CisJCXVpbnQ2NF90IHJlc2VydmVkXzI5XzYzOjM1OworCQl1aW50NjRfdCBwdHI6Mjk7CisJfSBzOworCXN0cnVjdCBjdm14X2lwZF93cWVfcHRyX3ZhbGlkX3MgY24zMHh4OworCXN0cnVjdCBjdm14X2lwZF93cWVfcHRyX3ZhbGlkX3MgY24zMXh4OworCXN0cnVjdCBjdm14X2lwZF93cWVfcHRyX3ZhbGlkX3MgY24zOHh4OworCXN0cnVjdCBjdm14X2lwZF93cWVfcHRyX3ZhbGlkX3MgY241MHh4OworCXN0cnVjdCBjdm14X2lwZF93cWVfcHRyX3ZhbGlkX3MgY241Mnh4OworCXN0cnVjdCBjdm14X2lwZF93cWVfcHRyX3ZhbGlkX3MgY241Mnh4cDE7CisJc3RydWN0IGN2bXhfaXBkX3dxZV9wdHJfdmFsaWRfcyBjbjU2eHg7CisJc3RydWN0IGN2bXhfaXBkX3dxZV9wdHJfdmFsaWRfcyBjbjU2eHhwMTsKKwlzdHJ1Y3QgY3ZteF9pcGRfd3FlX3B0cl92YWxpZF9zIGNuNTh4eDsKKwlzdHJ1Y3QgY3ZteF9pcGRfd3FlX3B0cl92YWxpZF9zIGNuNTh4eHAxOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vb2N0ZW9uL2N2bXgtbDJjLWRlZnMuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9vY3Rlb24vY3ZteC1sMmMtZGVmcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzNzU4MzgKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vb2N0ZW9uL2N2bXgtbDJjLWRlZnMuaApAQCAtMCwwICsxLDk2MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqbGljZW5zZSBzdGFydCoqKioqKioqKioqKioqKgorICogQXV0aG9yOiBDYXZpdW0gTmV0d29ya3MKKyAqCisgKiBDb250YWN0OiBzdXBwb3J0QGNhdml1bW5ldHdvcmtzLmNvbQorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIE9DVEVPTiBTREsKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwOCBDYXZpdW0gTmV0d29ya3MKKyAqCisgKiBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgVmVyc2lvbiAyLCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogQVMtSVMgYW5kIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkKKyAqIG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgVElUTEUsIG9yCisgKiBOT05JTkZSSU5HRU1FTlQuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlCisgKiBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgZmlsZTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKiBvciB2aXNpdCBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLgorICoKKyAqIFRoaXMgZmlsZSBtYXkgYWxzbyBiZSBhdmFpbGFibGUgdW5kZXIgYSBkaWZmZXJlbnQgbGljZW5zZSBmcm9tIENhdml1bS4KKyAqIENvbnRhY3QgQ2F2aXVtIE5ldHdvcmtzIGZvciBtb3JlIGluZm9ybWF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKipsaWNlbnNlIGVuZCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9fQ1ZNWF9MMkNfREVGU19IX18KKyNkZWZpbmUgX19DVk1YX0wyQ19ERUZTX0hfXworCisjZGVmaW5lIENWTVhfTDJDX0JTVDAgXAorCSBDVk1YX0FERF9JT19TRUcoMHgwMDAxMTgwMDgwMDAwN0Y4dWxsKQorI2RlZmluZSBDVk1YX0wyQ19CU1QxIFwKKwkgQ1ZNWF9BRERfSU9fU0VHKDB4MDAwMTE4MDA4MDAwMDdGMHVsbCkKKyNkZWZpbmUgQ1ZNWF9MMkNfQlNUMiBcCisJIENWTVhfQUREX0lPX1NFRygweDAwMDExODAwODAwMDA3RTh1bGwpCisjZGVmaW5lIENWTVhfTDJDX0NGRyBcCisJIENWTVhfQUREX0lPX1NFRygweDAwMDExODAwODAwMDAwMDB1bGwpCisjZGVmaW5lIENWTVhfTDJDX0RCRyBcCisJIENWTVhfQUREX0lPX1NFRygweDAwMDExODAwODAwMDAwMzB1bGwpCisjZGVmaW5lIENWTVhfTDJDX0RVVCBcCisJIENWTVhfQUREX0lPX1NFRygweDAwMDExODAwODAwMDAwNTB1bGwpCisjZGVmaW5lIENWTVhfTDJDX0dSUFdSUjAgXAorCSBDVk1YX0FERF9JT19TRUcoMHgwMDAxMTgwMDgwMDAwMEM4dWxsKQorI2RlZmluZSBDVk1YX0wyQ19HUlBXUlIxIFwKKwkgQ1ZNWF9BRERfSU9fU0VHKDB4MDAwMTE4MDA4MDAwMDBEMHVsbCkKKyNkZWZpbmUgQ1ZNWF9MMkNfSU5UX0VOIFwKKwkgQ1ZNWF9BRERfSU9fU0VHKDB4MDAwMTE4MDA4MDAwMDEwMHVsbCkKKyNkZWZpbmUgQ1ZNWF9MMkNfSU5UX1NUQVQgXAorCSBDVk1YX0FERF9JT19TRUcoMHgwMDAxMTgwMDgwMDAwMEY4dWxsKQorI2RlZmluZSBDVk1YX0wyQ19MQ0tCQVNFIFwKKwkgQ1ZNWF9BRERfSU9fU0VHKDB4MDAwMTE4MDA4MDAwMDA1OHVsbCkKKyNkZWZpbmUgQ1ZNWF9MMkNfTENLT0ZGIFwKKwkgQ1ZNWF9BRERfSU9fU0VHKDB4MDAwMTE4MDA4MDAwMDA2MHVsbCkKKyNkZWZpbmUgQ1ZNWF9MMkNfTEZCMCBcCisJIENWTVhfQUREX0lPX1NFRygweDAwMDExODAwODAwMDAwMzh1bGwpCisjZGVmaW5lIENWTVhfTDJDX0xGQjEgXAorCSBDVk1YX0FERF9JT19TRUcoMHgwMDAxMTgwMDgwMDAwMDQwdWxsKQorI2RlZmluZSBDVk1YX0wyQ19MRkIyIFwKKwkgQ1ZNWF9BRERfSU9fU0VHKDB4MDAwMTE4MDA4MDAwMDA0OHVsbCkKKyNkZWZpbmUgQ1ZNWF9MMkNfTEZCMyBcCisJIENWTVhfQUREX0lPX1NFRygweDAwMDExODAwODAwMDAwQjh1bGwpCisjZGVmaW5lIENWTVhfTDJDX09PQiBcCisJIENWTVhfQUREX0lPX1NFRygweDAwMDExODAwODAwMDAwRDh1bGwpCisjZGVmaW5lIENWTVhfTDJDX09PQjEgXAorCSBDVk1YX0FERF9JT19TRUcoMHgwMDAxMTgwMDgwMDAwMEUwdWxsKQorI2RlZmluZSBDVk1YX0wyQ19PT0IyIFwKKwkgQ1ZNWF9BRERfSU9fU0VHKDB4MDAwMTE4MDA4MDAwMDBFOHVsbCkKKyNkZWZpbmUgQ1ZNWF9MMkNfT09CMyBcCisJIENWTVhfQUREX0lPX1NFRygweDAwMDExODAwODAwMDAwRjB1bGwpCisjZGVmaW5lIENWTVhfTDJDX1BGQzAgXAorCSBDVk1YX0FERF9JT19TRUcoMHgwMDAxMTgwMDgwMDAwMDk4dWxsKQorI2RlZmluZSBDVk1YX0wyQ19QRkMxIFwKKwkgQ1ZNWF9BRERfSU9fU0VHKDB4MDAwMTE4MDA4MDAwMDBBMHVsbCkKKyNkZWZpbmUgQ1ZNWF9MMkNfUEZDMiBcCisJIENWTVhfQUREX0lPX1NFRygweDAwMDExODAwODAwMDAwQTh1bGwpCisjZGVmaW5lIENWTVhfTDJDX1BGQzMgXAorCSBDVk1YX0FERF9JT19TRUcoMHgwMDAxMTgwMDgwMDAwMEIwdWxsKQorI2RlZmluZSBDVk1YX0wyQ19QRkNUTCBcCisJIENWTVhfQUREX0lPX1NFRygweDAwMDExODAwODAwMDAwOTB1bGwpCisjZGVmaW5lIENWTVhfTDJDX1BGQ1gob2Zmc2V0KSBcCisJIENWTVhfQUREX0lPX1NFRygweDAwMDExODAwODAwMDAwOTh1bGwgKyAoKChvZmZzZXQpICYgMykgKiA4KSkKKyNkZWZpbmUgQ1ZNWF9MMkNfUFBHUlAgXAorCSBDVk1YX0FERF9JT19TRUcoMHgwMDAxMTgwMDgwMDAwMEMwdWxsKQorI2RlZmluZSBDVk1YX0wyQ19TUEFSMCBcCisJIENWTVhfQUREX0lPX1NFRygweDAwMDExODAwODAwMDAwNjh1bGwpCisjZGVmaW5lIENWTVhfTDJDX1NQQVIxIFwKKwkgQ1ZNWF9BRERfSU9fU0VHKDB4MDAwMTE4MDA4MDAwMDA3MHVsbCkKKyNkZWZpbmUgQ1ZNWF9MMkNfU1BBUjIgXAorCSBDVk1YX0FERF9JT19TRUcoMHgwMDAxMTgwMDgwMDAwMDc4dWxsKQorI2RlZmluZSBDVk1YX0wyQ19TUEFSMyBcCisJIENWTVhfQUREX0lPX1NFRygweDAwMDExODAwODAwMDAwODB1bGwpCisjZGVmaW5lIENWTVhfTDJDX1NQQVI0IFwKKwkgQ1ZNWF9BRERfSU9fU0VHKDB4MDAwMTE4MDA4MDAwMDA4OHVsbCkKKwordW5pb24gY3ZteF9sMmNfYnN0MCB7CisJdWludDY0X3QgdTY0OworCXN0cnVjdCBjdm14X2wyY19ic3QwX3MgeworCQl1aW50NjRfdCByZXNlcnZlZF8yNF82Mzo0MDsKKwkJdWludDY0X3QgZHRibms6MTsKKwkJdWludDY0X3Qgd2xiX21zazo0OworCQl1aW50NjRfdCBkdGNudDoxMzsKKwkJdWludDY0X3QgZHQ6MTsKKwkJdWludDY0X3Qgc3Rpbl9tc2s6MTsKKwkJdWludDY0X3Qgd2xiX2RhdDo0OworCX0gczsKKwlzdHJ1Y3QgY3ZteF9sMmNfYnN0MF9jbjMweHggeworCQl1aW50NjRfdCByZXNlcnZlZF8yM182Mzo0MTsKKwkJdWludDY0X3Qgd2xiX21zazo0OworCQl1aW50NjRfdCByZXNlcnZlZF8xNV8xODo0OworCQl1aW50NjRfdCBkdGNudDo5OworCQl1aW50NjRfdCBkdDoxOworCQl1aW50NjRfdCByZXNlcnZlZF80XzQ6MTsKKwkJdWludDY0X3Qgd2xiX2RhdDo0OworCX0gY24zMHh4OworCXN0cnVjdCBjdm14X2wyY19ic3QwX2NuMzF4eCB7CisJCXVpbnQ2NF90IHJlc2VydmVkXzIzXzYzOjQxOworCQl1aW50NjRfdCB3bGJfbXNrOjQ7CisJCXVpbnQ2NF90IHJlc2VydmVkXzE2XzE4OjM7CisJCXVpbnQ2NF90IGR0Y250OjEwOworCQl1aW50NjRfdCBkdDoxOworCQl1aW50NjRfdCBzdGluX21zazoxOworCQl1aW50NjRfdCB3bGJfZGF0OjQ7CisJfSBjbjMxeHg7CisJc3RydWN0IGN2bXhfbDJjX2JzdDBfY24zOHh4IHsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfMTlfNjM6NDU7CisJCXVpbnQ2NF90IGR0Y250OjEzOworCQl1aW50NjRfdCBkdDoxOworCQl1aW50NjRfdCBzdGluX21zazoxOworCQl1aW50NjRfdCB3bGJfZGF0OjQ7CisJfSBjbjM4eHg7CisJc3RydWN0IGN2bXhfbDJjX2JzdDBfY24zOHh4IGNuMzh4eHAyOworCXN0cnVjdCBjdm14X2wyY19ic3QwX2NuNTB4eCB7CisJCXVpbnQ2NF90IHJlc2VydmVkXzI0XzYzOjQwOworCQl1aW50NjRfdCBkdGJuazoxOworCQl1aW50NjRfdCB3bGJfbXNrOjQ7CisJCXVpbnQ2NF90IHJlc2VydmVkXzE2XzE4OjM7CisJCXVpbnQ2NF90IGR0Y250OjEwOworCQl1aW50NjRfdCBkdDoxOworCQl1aW50NjRfdCBzdGluX21zazoxOworCQl1aW50NjRfdCB3bGJfZGF0OjQ7CisJfSBjbjUweHg7CisJc3RydWN0IGN2bXhfbDJjX2JzdDBfY241MHh4IGNuNTJ4eDsKKwlzdHJ1Y3QgY3ZteF9sMmNfYnN0MF9jbjUweHggY241Mnh4cDE7CisJc3RydWN0IGN2bXhfbDJjX2JzdDBfcyBjbjU2eHg7CisJc3RydWN0IGN2bXhfbDJjX2JzdDBfcyBjbjU2eHhwMTsKKwlzdHJ1Y3QgY3ZteF9sMmNfYnN0MF9zIGNuNTh4eDsKKwlzdHJ1Y3QgY3ZteF9sMmNfYnN0MF9zIGNuNTh4eHAxOworfTsKKwordW5pb24gY3ZteF9sMmNfYnN0MSB7CisJdWludDY0X3QgdTY0OworCXN0cnVjdCBjdm14X2wyY19ic3QxX3MgeworCQl1aW50NjRfdCByZXNlcnZlZF85XzYzOjU1OworCQl1aW50NjRfdCBsMnQ6OTsKKwl9IHM7CisJc3RydWN0IGN2bXhfbDJjX2JzdDFfY24zMHh4IHsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfMTZfNjM6NDg7CisJCXVpbnQ2NF90IHZ3ZGY6NDsKKwkJdWludDY0X3QgbHJmOjI7CisJCXVpbnQ2NF90IHZhYl92d2NmOjE7CisJCXVpbnQ2NF90IHJlc2VydmVkXzVfODo0OworCQl1aW50NjRfdCBsMnQ6NTsKKwl9IGNuMzB4eDsKKwlzdHJ1Y3QgY3ZteF9sMmNfYnN0MV9jbjMweHggY24zMXh4OworCXN0cnVjdCBjdm14X2wyY19ic3QxX2NuMzh4eCB7CisJCXVpbnQ2NF90IHJlc2VydmVkXzE2XzYzOjQ4OworCQl1aW50NjRfdCB2d2RmOjQ7CisJCXVpbnQ2NF90IGxyZjoyOworCQl1aW50NjRfdCB2YWJfdndjZjoxOworCQl1aW50NjRfdCBsMnQ6OTsKKwl9IGNuMzh4eDsKKwlzdHJ1Y3QgY3ZteF9sMmNfYnN0MV9jbjM4eHggY24zOHh4cDI7CisJc3RydWN0IGN2bXhfbDJjX2JzdDFfY24zOHh4IGNuNTB4eDsKKwlzdHJ1Y3QgY3ZteF9sMmNfYnN0MV9jbjUyeHggeworCQl1aW50NjRfdCByZXNlcnZlZF8xOV82Mzo0NTsKKwkJdWludDY0X3QgcGxjMjoxOworCQl1aW50NjRfdCBwbGMxOjE7CisJCXVpbnQ2NF90IHBsYzA6MTsKKwkJdWludDY0X3QgdndkZjo0OworCQl1aW50NjRfdCByZXNlcnZlZF8xMV8xMToxOworCQl1aW50NjRfdCBpbGM6MTsKKwkJdWludDY0X3QgdmFiX3Z3Y2Y6MTsKKwkJdWludDY0X3QgbDJ0Ojk7CisJfSBjbjUyeHg7CisJc3RydWN0IGN2bXhfbDJjX2JzdDFfY241Mnh4IGNuNTJ4eHAxOworCXN0cnVjdCBjdm14X2wyY19ic3QxX2NuNTZ4eCB7CisJCXVpbnQ2NF90IHJlc2VydmVkXzI0XzYzOjQwOworCQl1aW50NjRfdCBwbGMyOjE7CisJCXVpbnQ2NF90IHBsYzE6MTsKKwkJdWludDY0X3QgcGxjMDoxOworCQl1aW50NjRfdCBpbGM6MTsKKwkJdWludDY0X3QgdndkZjE6NDsKKwkJdWludDY0X3QgdndkZjA6NDsKKwkJdWludDY0X3QgdmFiX3Z3Y2YxOjE7CisJCXVpbnQ2NF90IHJlc2VydmVkXzEwXzEwOjE7CisJCXVpbnQ2NF90IHZhYl92d2NmMDoxOworCQl1aW50NjRfdCBsMnQ6OTsKKwl9IGNuNTZ4eDsKKwlzdHJ1Y3QgY3ZteF9sMmNfYnN0MV9jbjU2eHggY241Nnh4cDE7CisJc3RydWN0IGN2bXhfbDJjX2JzdDFfY24zOHh4IGNuNTh4eDsKKwlzdHJ1Y3QgY3ZteF9sMmNfYnN0MV9jbjM4eHggY241OHh4cDE7Cit9OworCit1bmlvbiBjdm14X2wyY19ic3QyIHsKKwl1aW50NjRfdCB1NjQ7CisJc3RydWN0IGN2bXhfbDJjX2JzdDJfcyB7CisJCXVpbnQ2NF90IHJlc2VydmVkXzE2XzYzOjQ4OworCQl1aW50NjRfdCBtcmI6NDsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfNF8xMTo4OworCQl1aW50NjRfdCBpcGNic3Q6MTsKKwkJdWludDY0X3QgcGljYnN0OjE7CisJCXVpbnQ2NF90IHhyZG1zazoxOworCQl1aW50NjRfdCB4cmRkYXQ6MTsKKwl9IHM7CisJc3RydWN0IGN2bXhfbDJjX2JzdDJfY24zMHh4IHsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfMTZfNjM6NDg7CisJCXVpbnQ2NF90IG1yYjo0OworCQl1aW50NjRfdCBybWRmOjQ7CisJCXVpbnQ2NF90IHJlc2VydmVkXzRfNzo0OworCQl1aW50NjRfdCBpcGNic3Q6MTsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfMl8yOjE7CisJCXVpbnQ2NF90IHhyZG1zazoxOworCQl1aW50NjRfdCB4cmRkYXQ6MTsKKwl9IGNuMzB4eDsKKwlzdHJ1Y3QgY3ZteF9sMmNfYnN0Ml9jbjMweHggY24zMXh4OworCXN0cnVjdCBjdm14X2wyY19ic3QyX2NuMzh4eCB7CisJCXVpbnQ2NF90IHJlc2VydmVkXzE2XzYzOjQ4OworCQl1aW50NjRfdCBtcmI6NDsKKwkJdWludDY0X3Qgcm1kZjo0OworCQl1aW50NjRfdCByaGRmOjQ7CisJCXVpbnQ2NF90IGlwY2JzdDoxOworCQl1aW50NjRfdCBwaWNic3Q6MTsKKwkJdWludDY0X3QgeHJkbXNrOjE7CisJCXVpbnQ2NF90IHhyZGRhdDoxOworCX0gY24zOHh4OworCXN0cnVjdCBjdm14X2wyY19ic3QyX2NuMzh4eCBjbjM4eHhwMjsKKwlzdHJ1Y3QgY3ZteF9sMmNfYnN0Ml9jbjMweHggY241MHh4OworCXN0cnVjdCBjdm14X2wyY19ic3QyX2NuMzB4eCBjbjUyeHg7CisJc3RydWN0IGN2bXhfbDJjX2JzdDJfY24zMHh4IGNuNTJ4eHAxOworCXN0cnVjdCBjdm14X2wyY19ic3QyX2NuNTZ4eCB7CisJCXVpbnQ2NF90IHJlc2VydmVkXzE2XzYzOjQ4OworCQl1aW50NjRfdCBtcmI6NDsKKwkJdWludDY0X3Qgcm1kYjo0OworCQl1aW50NjRfdCByaGRiOjQ7CisJCXVpbnQ2NF90IGlwY2JzdDoxOworCQl1aW50NjRfdCBwaWNic3Q6MTsKKwkJdWludDY0X3QgeHJkbXNrOjE7CisJCXVpbnQ2NF90IHhyZGRhdDoxOworCX0gY241Nnh4OworCXN0cnVjdCBjdm14X2wyY19ic3QyX2NuNTZ4eCBjbjU2eHhwMTsKKwlzdHJ1Y3QgY3ZteF9sMmNfYnN0Ml9jbjU2eHggY241OHh4OworCXN0cnVjdCBjdm14X2wyY19ic3QyX2NuNTZ4eCBjbjU4eHhwMTsKK307CisKK3VuaW9uIGN2bXhfbDJjX2NmZyB7CisJdWludDY0X3QgdTY0OworCXN0cnVjdCBjdm14X2wyY19jZmdfcyB7CisJCXVpbnQ2NF90IHJlc2VydmVkXzIwXzYzOjQ0OworCQl1aW50NjRfdCBic3RydW46MTsKKwkJdWludDY0X3QgbGJpc3Q6MTsKKwkJdWludDY0X3QgeG9yX2Jhbms6MTsKKwkJdWludDY0X3QgZHByZXMxOjE7CisJCXVpbnQ2NF90IGRwcmVzMDoxOworCQl1aW50NjRfdCBkZmlsbF9kaXM6MTsKKwkJdWludDY0X3QgZnBleHA6NDsKKwkJdWludDY0X3QgZnBlbXB0eToxOworCQl1aW50NjRfdCBmcGVuOjE7CisJCXVpbnQ2NF90IGlkeGFsaWFzOjE7CisJCXVpbnQ2NF90IG13Zl9jcmQ6NDsKKwkJdWludDY0X3QgcnNwX2FyYl9tb2RlOjE7CisJCXVpbnQ2NF90IHJmYl9hcmJfbW9kZToxOworCQl1aW50NjRfdCBscmZfYXJiX21vZGU6MTsKKwl9IHM7CisJc3RydWN0IGN2bXhfbDJjX2NmZ19jbjMweHggeworCQl1aW50NjRfdCByZXNlcnZlZF8xNF82Mzo1MDsKKwkJdWludDY0X3QgZnBleHA6NDsKKwkJdWludDY0X3QgZnBlbXB0eToxOworCQl1aW50NjRfdCBmcGVuOjE7CisJCXVpbnQ2NF90IGlkeGFsaWFzOjE7CisJCXVpbnQ2NF90IG13Zl9jcmQ6NDsKKwkJdWludDY0X3QgcnNwX2FyYl9tb2RlOjE7CisJCXVpbnQ2NF90IHJmYl9hcmJfbW9kZToxOworCQl1aW50NjRfdCBscmZfYXJiX21vZGU6MTsKKwl9IGNuMzB4eDsKKwlzdHJ1Y3QgY3ZteF9sMmNfY2ZnX2NuMzB4eCBjbjMxeHg7CisJc3RydWN0IGN2bXhfbDJjX2NmZ19jbjMweHggY24zOHh4OworCXN0cnVjdCBjdm14X2wyY19jZmdfY24zMHh4IGNuMzh4eHAyOworCXN0cnVjdCBjdm14X2wyY19jZmdfY241MHh4IHsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfMjBfNjM6NDQ7CisJCXVpbnQ2NF90IGJzdHJ1bjoxOworCQl1aW50NjRfdCBsYmlzdDoxOworCQl1aW50NjRfdCByZXNlcnZlZF8xNF8xNzo0OworCQl1aW50NjRfdCBmcGV4cDo0OworCQl1aW50NjRfdCBmcGVtcHR5OjE7CisJCXVpbnQ2NF90IGZwZW46MTsKKwkJdWludDY0X3QgaWR4YWxpYXM6MTsKKwkJdWludDY0X3QgbXdmX2NyZDo0OworCQl1aW50NjRfdCByc3BfYXJiX21vZGU6MTsKKwkJdWludDY0X3QgcmZiX2FyYl9tb2RlOjE7CisJCXVpbnQ2NF90IGxyZl9hcmJfbW9kZToxOworCX0gY241MHh4OworCXN0cnVjdCBjdm14X2wyY19jZmdfY241MHh4IGNuNTJ4eDsKKwlzdHJ1Y3QgY3ZteF9sMmNfY2ZnX2NuNTB4eCBjbjUyeHhwMTsKKwlzdHJ1Y3QgY3ZteF9sMmNfY2ZnX3MgY241Nnh4OworCXN0cnVjdCBjdm14X2wyY19jZmdfcyBjbjU2eHhwMTsKKwlzdHJ1Y3QgY3ZteF9sMmNfY2ZnX2NuNTh4eCB7CisJCXVpbnQ2NF90IHJlc2VydmVkXzIwXzYzOjQ0OworCQl1aW50NjRfdCBic3RydW46MTsKKwkJdWludDY0X3QgbGJpc3Q6MTsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfMTVfMTc6MzsKKwkJdWludDY0X3QgZGZpbGxfZGlzOjE7CisJCXVpbnQ2NF90IGZwZXhwOjQ7CisJCXVpbnQ2NF90IGZwZW1wdHk6MTsKKwkJdWludDY0X3QgZnBlbjoxOworCQl1aW50NjRfdCBpZHhhbGlhczoxOworCQl1aW50NjRfdCBtd2ZfY3JkOjQ7CisJCXVpbnQ2NF90IHJzcF9hcmJfbW9kZToxOworCQl1aW50NjRfdCByZmJfYXJiX21vZGU6MTsKKwkJdWludDY0X3QgbHJmX2FyYl9tb2RlOjE7CisJfSBjbjU4eHg7CisJc3RydWN0IGN2bXhfbDJjX2NmZ19jbjU4eHhwMSB7CisJCXVpbnQ2NF90IHJlc2VydmVkXzE1XzYzOjQ5OworCQl1aW50NjRfdCBkZmlsbF9kaXM6MTsKKwkJdWludDY0X3QgZnBleHA6NDsKKwkJdWludDY0X3QgZnBlbXB0eToxOworCQl1aW50NjRfdCBmcGVuOjE7CisJCXVpbnQ2NF90IGlkeGFsaWFzOjE7CisJCXVpbnQ2NF90IG13Zl9jcmQ6NDsKKwkJdWludDY0X3QgcnNwX2FyYl9tb2RlOjE7CisJCXVpbnQ2NF90IHJmYl9hcmJfbW9kZToxOworCQl1aW50NjRfdCBscmZfYXJiX21vZGU6MTsKKwl9IGNuNTh4eHAxOworfTsKKwordW5pb24gY3ZteF9sMmNfZGJnIHsKKwl1aW50NjRfdCB1NjQ7CisJc3RydWN0IGN2bXhfbDJjX2RiZ19zIHsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfMTVfNjM6NDk7CisJCXVpbnQ2NF90IGxmYl9lbnVtOjQ7CisJCXVpbnQ2NF90IGxmYl9kbXA6MTsKKwkJdWludDY0X3QgcHBudW06NDsKKwkJdWludDY0X3Qgc2V0OjM7CisJCXVpbnQ2NF90IGZpbnY6MTsKKwkJdWludDY0X3QgbDJkOjE7CisJCXVpbnQ2NF90IGwydDoxOworCX0gczsKKwlzdHJ1Y3QgY3ZteF9sMmNfZGJnX2NuMzB4eCB7CisJCXVpbnQ2NF90IHJlc2VydmVkXzEzXzYzOjUxOworCQl1aW50NjRfdCBsZmJfZW51bToyOworCQl1aW50NjRfdCBsZmJfZG1wOjE7CisJCXVpbnQ2NF90IHJlc2VydmVkXzVfOTo1OworCQl1aW50NjRfdCBzZXQ6MjsKKwkJdWludDY0X3QgZmludjoxOworCQl1aW50NjRfdCBsMmQ6MTsKKwkJdWludDY0X3QgbDJ0OjE7CisJfSBjbjMweHg7CisJc3RydWN0IGN2bXhfbDJjX2RiZ19jbjMxeHggeworCQl1aW50NjRfdCByZXNlcnZlZF8xNF82Mzo1MDsKKwkJdWludDY0X3QgbGZiX2VudW06MzsKKwkJdWludDY0X3QgbGZiX2RtcDoxOworCQl1aW50NjRfdCByZXNlcnZlZF83Xzk6MzsKKwkJdWludDY0X3QgcHBudW06MTsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfNV81OjE7CisJCXVpbnQ2NF90IHNldDoyOworCQl1aW50NjRfdCBmaW52OjE7CisJCXVpbnQ2NF90IGwyZDoxOworCQl1aW50NjRfdCBsMnQ6MTsKKwl9IGNuMzF4eDsKKwlzdHJ1Y3QgY3ZteF9sMmNfZGJnX3MgY24zOHh4OworCXN0cnVjdCBjdm14X2wyY19kYmdfcyBjbjM4eHhwMjsKKwlzdHJ1Y3QgY3ZteF9sMmNfZGJnX2NuNTB4eCB7CisJCXVpbnQ2NF90IHJlc2VydmVkXzE0XzYzOjUwOworCQl1aW50NjRfdCBsZmJfZW51bTozOworCQl1aW50NjRfdCBsZmJfZG1wOjE7CisJCXVpbnQ2NF90IHJlc2VydmVkXzdfOTozOworCQl1aW50NjRfdCBwcG51bToxOworCQl1aW50NjRfdCBzZXQ6MzsKKwkJdWludDY0X3QgZmludjoxOworCQl1aW50NjRfdCBsMmQ6MTsKKwkJdWludDY0X3QgbDJ0OjE7CisJfSBjbjUweHg7CisJc3RydWN0IGN2bXhfbDJjX2RiZ19jbjUyeHggeworCQl1aW50NjRfdCByZXNlcnZlZF8xNF82Mzo1MDsKKwkJdWludDY0X3QgbGZiX2VudW06MzsKKwkJdWludDY0X3QgbGZiX2RtcDoxOworCQl1aW50NjRfdCByZXNlcnZlZF84Xzk6MjsKKwkJdWludDY0X3QgcHBudW06MjsKKwkJdWludDY0X3Qgc2V0OjM7CisJCXVpbnQ2NF90IGZpbnY6MTsKKwkJdWludDY0X3QgbDJkOjE7CisJCXVpbnQ2NF90IGwydDoxOworCX0gY241Mnh4OworCXN0cnVjdCBjdm14X2wyY19kYmdfY241Mnh4IGNuNTJ4eHAxOworCXN0cnVjdCBjdm14X2wyY19kYmdfcyBjbjU2eHg7CisJc3RydWN0IGN2bXhfbDJjX2RiZ19zIGNuNTZ4eHAxOworCXN0cnVjdCBjdm14X2wyY19kYmdfcyBjbjU4eHg7CisJc3RydWN0IGN2bXhfbDJjX2RiZ19zIGNuNTh4eHAxOworfTsKKwordW5pb24gY3ZteF9sMmNfZHV0IHsKKwl1aW50NjRfdCB1NjQ7CisJc3RydWN0IGN2bXhfbDJjX2R1dF9zIHsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfMzJfNjM6MzI7CisJCXVpbnQ2NF90IGR0ZW5hOjE7CisJCXVpbnQ2NF90IHJlc2VydmVkXzMwXzMwOjE7CisJCXVpbnQ2NF90IGR0X3ZsZDoxOworCQl1aW50NjRfdCBkdF90YWc6Mjk7CisJfSBzOworCXN0cnVjdCBjdm14X2wyY19kdXRfcyBjbjMweHg7CisJc3RydWN0IGN2bXhfbDJjX2R1dF9zIGNuMzF4eDsKKwlzdHJ1Y3QgY3ZteF9sMmNfZHV0X3MgY24zOHh4OworCXN0cnVjdCBjdm14X2wyY19kdXRfcyBjbjM4eHhwMjsKKwlzdHJ1Y3QgY3ZteF9sMmNfZHV0X3MgY241MHh4OworCXN0cnVjdCBjdm14X2wyY19kdXRfcyBjbjUyeHg7CisJc3RydWN0IGN2bXhfbDJjX2R1dF9zIGNuNTJ4eHAxOworCXN0cnVjdCBjdm14X2wyY19kdXRfcyBjbjU2eHg7CisJc3RydWN0IGN2bXhfbDJjX2R1dF9zIGNuNTZ4eHAxOworCXN0cnVjdCBjdm14X2wyY19kdXRfcyBjbjU4eHg7CisJc3RydWN0IGN2bXhfbDJjX2R1dF9zIGNuNTh4eHAxOworfTsKKwordW5pb24gY3ZteF9sMmNfZ3Jwd3JyMCB7CisJdWludDY0X3QgdTY0OworCXN0cnVjdCBjdm14X2wyY19ncnB3cnIwX3MgeworCQl1aW50NjRfdCBwbGMxcm1zazozMjsKKwkJdWludDY0X3QgcGxjMHJtc2s6MzI7CisJfSBzOworCXN0cnVjdCBjdm14X2wyY19ncnB3cnIwX3MgY241Mnh4OworCXN0cnVjdCBjdm14X2wyY19ncnB3cnIwX3MgY241Mnh4cDE7CisJc3RydWN0IGN2bXhfbDJjX2dycHdycjBfcyBjbjU2eHg7CisJc3RydWN0IGN2bXhfbDJjX2dycHdycjBfcyBjbjU2eHhwMTsKK307CisKK3VuaW9uIGN2bXhfbDJjX2dycHdycjEgeworCXVpbnQ2NF90IHU2NDsKKwlzdHJ1Y3QgY3ZteF9sMmNfZ3Jwd3JyMV9zIHsKKwkJdWludDY0X3QgaWxjcm1zazozMjsKKwkJdWludDY0X3QgcGxjMnJtc2s6MzI7CisJfSBzOworCXN0cnVjdCBjdm14X2wyY19ncnB3cnIxX3MgY241Mnh4OworCXN0cnVjdCBjdm14X2wyY19ncnB3cnIxX3MgY241Mnh4cDE7CisJc3RydWN0IGN2bXhfbDJjX2dycHdycjFfcyBjbjU2eHg7CisJc3RydWN0IGN2bXhfbDJjX2dycHdycjFfcyBjbjU2eHhwMTsKK307CisKK3VuaW9uIGN2bXhfbDJjX2ludF9lbiB7CisJdWludDY0X3QgdTY0OworCXN0cnVjdCBjdm14X2wyY19pbnRfZW5fcyB7CisJCXVpbnQ2NF90IHJlc2VydmVkXzlfNjM6NTU7CisJCXVpbnQ2NF90IGxjazJlbmE6MTsKKwkJdWludDY0X3QgbGNrZW5hOjE7CisJCXVpbnQ2NF90IGwyZGRlZGVuOjE7CisJCXVpbnQ2NF90IGwyZHNlY2VuOjE7CisJCXVpbnQ2NF90IGwydGRlZGVuOjE7CisJCXVpbnQ2NF90IGwydHNlY2VuOjE7CisJCXVpbnQ2NF90IG9vYjNlbjoxOworCQl1aW50NjRfdCBvb2IyZW46MTsKKwkJdWludDY0X3Qgb29iMWVuOjE7CisJfSBzOworCXN0cnVjdCBjdm14X2wyY19pbnRfZW5fcyBjbjUyeHg7CisJc3RydWN0IGN2bXhfbDJjX2ludF9lbl9zIGNuNTJ4eHAxOworCXN0cnVjdCBjdm14X2wyY19pbnRfZW5fcyBjbjU2eHg7CisJc3RydWN0IGN2bXhfbDJjX2ludF9lbl9zIGNuNTZ4eHAxOworfTsKKwordW5pb24gY3ZteF9sMmNfaW50X3N0YXQgeworCXVpbnQ2NF90IHU2NDsKKwlzdHJ1Y3QgY3ZteF9sMmNfaW50X3N0YXRfcyB7CisJCXVpbnQ2NF90IHJlc2VydmVkXzlfNjM6NTU7CisJCXVpbnQ2NF90IGxjazI6MTsKKwkJdWludDY0X3QgbGNrOjE7CisJCXVpbnQ2NF90IGwyZGRlZDoxOworCQl1aW50NjRfdCBsMmRzZWM6MTsKKwkJdWludDY0X3QgbDJ0ZGVkOjE7CisJCXVpbnQ2NF90IGwydHNlYzoxOworCQl1aW50NjRfdCBvb2IzOjE7CisJCXVpbnQ2NF90IG9vYjI6MTsKKwkJdWludDY0X3Qgb29iMToxOworCX0gczsKKwlzdHJ1Y3QgY3ZteF9sMmNfaW50X3N0YXRfcyBjbjUyeHg7CisJc3RydWN0IGN2bXhfbDJjX2ludF9zdGF0X3MgY241Mnh4cDE7CisJc3RydWN0IGN2bXhfbDJjX2ludF9zdGF0X3MgY241Nnh4OworCXN0cnVjdCBjdm14X2wyY19pbnRfc3RhdF9zIGNuNTZ4eHAxOworfTsKKwordW5pb24gY3ZteF9sMmNfbGNrYmFzZSB7CisJdWludDY0X3QgdTY0OworCXN0cnVjdCBjdm14X2wyY19sY2tiYXNlX3MgeworCQl1aW50NjRfdCByZXNlcnZlZF8zMV82MzozMzsKKwkJdWludDY0X3QgbGNrX2Jhc2U6Mjc7CisJCXVpbnQ2NF90IHJlc2VydmVkXzFfMzozOworCQl1aW50NjRfdCBsY2tfZW5hOjE7CisJfSBzOworCXN0cnVjdCBjdm14X2wyY19sY2tiYXNlX3MgY24zMHh4OworCXN0cnVjdCBjdm14X2wyY19sY2tiYXNlX3MgY24zMXh4OworCXN0cnVjdCBjdm14X2wyY19sY2tiYXNlX3MgY24zOHh4OworCXN0cnVjdCBjdm14X2wyY19sY2tiYXNlX3MgY24zOHh4cDI7CisJc3RydWN0IGN2bXhfbDJjX2xja2Jhc2VfcyBjbjUweHg7CisJc3RydWN0IGN2bXhfbDJjX2xja2Jhc2VfcyBjbjUyeHg7CisJc3RydWN0IGN2bXhfbDJjX2xja2Jhc2VfcyBjbjUyeHhwMTsKKwlzdHJ1Y3QgY3ZteF9sMmNfbGNrYmFzZV9zIGNuNTZ4eDsKKwlzdHJ1Y3QgY3ZteF9sMmNfbGNrYmFzZV9zIGNuNTZ4eHAxOworCXN0cnVjdCBjdm14X2wyY19sY2tiYXNlX3MgY241OHh4OworCXN0cnVjdCBjdm14X2wyY19sY2tiYXNlX3MgY241OHh4cDE7Cit9OworCit1bmlvbiBjdm14X2wyY19sY2tvZmYgeworCXVpbnQ2NF90IHU2NDsKKwlzdHJ1Y3QgY3ZteF9sMmNfbGNrb2ZmX3MgeworCQl1aW50NjRfdCByZXNlcnZlZF8xMF82Mzo1NDsKKwkJdWludDY0X3QgbGNrX29mZnNldDoxMDsKKwl9IHM7CisJc3RydWN0IGN2bXhfbDJjX2xja29mZl9zIGNuMzB4eDsKKwlzdHJ1Y3QgY3ZteF9sMmNfbGNrb2ZmX3MgY24zMXh4OworCXN0cnVjdCBjdm14X2wyY19sY2tvZmZfcyBjbjM4eHg7CisJc3RydWN0IGN2bXhfbDJjX2xja29mZl9zIGNuMzh4eHAyOworCXN0cnVjdCBjdm14X2wyY19sY2tvZmZfcyBjbjUweHg7CisJc3RydWN0IGN2bXhfbDJjX2xja29mZl9zIGNuNTJ4eDsKKwlzdHJ1Y3QgY3ZteF9sMmNfbGNrb2ZmX3MgY241Mnh4cDE7CisJc3RydWN0IGN2bXhfbDJjX2xja29mZl9zIGNuNTZ4eDsKKwlzdHJ1Y3QgY3ZteF9sMmNfbGNrb2ZmX3MgY241Nnh4cDE7CisJc3RydWN0IGN2bXhfbDJjX2xja29mZl9zIGNuNTh4eDsKKwlzdHJ1Y3QgY3ZteF9sMmNfbGNrb2ZmX3MgY241OHh4cDE7Cit9OworCit1bmlvbiBjdm14X2wyY19sZmIwIHsKKwl1aW50NjRfdCB1NjQ7CisJc3RydWN0IGN2bXhfbDJjX2xmYjBfcyB7CisJCXVpbnQ2NF90IHJlc2VydmVkXzMyXzYzOjMyOworCQl1aW50NjRfdCBzdGNwbmQ6MTsKKwkJdWludDY0X3Qgc3RwbmQ6MTsKKwkJdWludDY0X3Qgc3RpbnY6MTsKKwkJdWludDY0X3Qgc3RjZmw6MTsKKwkJdWludDY0X3QgdmFtOjE7CisJCXVpbnQ2NF90IGlueHQ6NDsKKwkJdWludDY0X3QgaXRsOjE7CisJCXVpbnQ2NF90IGloZDoxOworCQl1aW50NjRfdCBzZXQ6MzsKKwkJdWludDY0X3QgdmFibnVtOjQ7CisJCXVpbnQ2NF90IHNpZDo5OworCQl1aW50NjRfdCBjbWQ6NDsKKwkJdWludDY0X3QgdmxkOjE7CisJfSBzOworCXN0cnVjdCBjdm14X2wyY19sZmIwX2NuMzB4eCB7CisJCXVpbnQ2NF90IHJlc2VydmVkXzMyXzYzOjMyOworCQl1aW50NjRfdCBzdGNwbmQ6MTsKKwkJdWludDY0X3Qgc3RwbmQ6MTsKKwkJdWludDY0X3Qgc3RpbnY6MTsKKwkJdWludDY0X3Qgc3RjZmw6MTsKKwkJdWludDY0X3QgdmFtOjE7CisJCXVpbnQ2NF90IHJlc2VydmVkXzI1XzI2OjI7CisJCXVpbnQ2NF90IGlueHQ6MjsKKwkJdWludDY0X3QgaXRsOjE7CisJCXVpbnQ2NF90IGloZDoxOworCQl1aW50NjRfdCByZXNlcnZlZF8yMF8yMDoxOworCQl1aW50NjRfdCBzZXQ6MjsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfMTZfMTc6MjsKKwkJdWludDY0X3QgdmFibnVtOjI7CisJCXVpbnQ2NF90IHNpZDo5OworCQl1aW50NjRfdCBjbWQ6NDsKKwkJdWludDY0X3QgdmxkOjE7CisJfSBjbjMweHg7CisJc3RydWN0IGN2bXhfbDJjX2xmYjBfY24zMXh4IHsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfMzJfNjM6MzI7CisJCXVpbnQ2NF90IHN0Y3BuZDoxOworCQl1aW50NjRfdCBzdHBuZDoxOworCQl1aW50NjRfdCBzdGludjoxOworCQl1aW50NjRfdCBzdGNmbDoxOworCQl1aW50NjRfdCB2YW06MTsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfMjZfMjY6MTsKKwkJdWludDY0X3QgaW54dDozOworCQl1aW50NjRfdCBpdGw6MTsKKwkJdWludDY0X3QgaWhkOjE7CisJCXVpbnQ2NF90IHJlc2VydmVkXzIwXzIwOjE7CisJCXVpbnQ2NF90IHNldDoyOworCQl1aW50NjRfdCByZXNlcnZlZF8xN18xNzoxOworCQl1aW50NjRfdCB2YWJudW06MzsKKwkJdWludDY0X3Qgc2lkOjk7CisJCXVpbnQ2NF90IGNtZDo0OworCQl1aW50NjRfdCB2bGQ6MTsKKwl9IGNuMzF4eDsKKwlzdHJ1Y3QgY3ZteF9sMmNfbGZiMF9zIGNuMzh4eDsKKwlzdHJ1Y3QgY3ZteF9sMmNfbGZiMF9zIGNuMzh4eHAyOworCXN0cnVjdCBjdm14X2wyY19sZmIwX2NuNTB4eCB7CisJCXVpbnQ2NF90IHJlc2VydmVkXzMyXzYzOjMyOworCQl1aW50NjRfdCBzdGNwbmQ6MTsKKwkJdWludDY0X3Qgc3RwbmQ6MTsKKwkJdWludDY0X3Qgc3RpbnY6MTsKKwkJdWludDY0X3Qgc3RjZmw6MTsKKwkJdWludDY0X3QgdmFtOjE7CisJCXVpbnQ2NF90IHJlc2VydmVkXzI2XzI2OjE7CisJCXVpbnQ2NF90IGlueHQ6MzsKKwkJdWludDY0X3QgaXRsOjE7CisJCXVpbnQ2NF90IGloZDoxOworCQl1aW50NjRfdCBzZXQ6MzsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfMTdfMTc6MTsKKwkJdWludDY0X3QgdmFibnVtOjM7CisJCXVpbnQ2NF90IHNpZDo5OworCQl1aW50NjRfdCBjbWQ6NDsKKwkJdWludDY0X3QgdmxkOjE7CisJfSBjbjUweHg7CisJc3RydWN0IGN2bXhfbDJjX2xmYjBfY241MHh4IGNuNTJ4eDsKKwlzdHJ1Y3QgY3ZteF9sMmNfbGZiMF9jbjUweHggY241Mnh4cDE7CisJc3RydWN0IGN2bXhfbDJjX2xmYjBfcyBjbjU2eHg7CisJc3RydWN0IGN2bXhfbDJjX2xmYjBfcyBjbjU2eHhwMTsKKwlzdHJ1Y3QgY3ZteF9sMmNfbGZiMF9zIGNuNTh4eDsKKwlzdHJ1Y3QgY3ZteF9sMmNfbGZiMF9zIGNuNTh4eHAxOworfTsKKwordW5pb24gY3ZteF9sMmNfbGZiMSB7CisJdWludDY0X3QgdTY0OworCXN0cnVjdCBjdm14X2wyY19sZmIxX3MgeworCQl1aW50NjRfdCByZXNlcnZlZF8xOV82Mzo0NTsKKwkJdWludDY0X3QgZHNnb2luZzoxOworCQl1aW50NjRfdCBiaWQ6MjsKKwkJdWludDY0X3Qgd3Ryc3A6MTsKKwkJdWludDY0X3Qgd3RkdzoxOworCQl1aW50NjRfdCB3dGRxOjE7CisJCXVpbnQ2NF90IHd0d2hwOjE7CisJCXVpbnQ2NF90IHd0d2hmOjE7CisJCXVpbnQ2NF90IHd0d3JtOjE7CisJCXVpbnQ2NF90IHd0c3RtOjE7CisJCXVpbnQ2NF90IHd0cmRhOjE7CisJCXVpbnQ2NF90IHd0c3RkdDoxOworCQl1aW50NjRfdCB3dHN0cnNwOjE7CisJCXVpbnQ2NF90IHd0c3Ryc2M6MTsKKwkJdWludDY0X3Qgd3R2dG06MTsKKwkJdWludDY0X3Qgd3RtZmw6MTsKKwkJdWludDY0X3QgcHJicnR5OjE7CisJCXVpbnQ2NF90IHd0cHJiOjE7CisJCXVpbnQ2NF90IHZsZDoxOworCX0gczsKKwlzdHJ1Y3QgY3ZteF9sMmNfbGZiMV9zIGNuMzB4eDsKKwlzdHJ1Y3QgY3ZteF9sMmNfbGZiMV9zIGNuMzF4eDsKKwlzdHJ1Y3QgY3ZteF9sMmNfbGZiMV9zIGNuMzh4eDsKKwlzdHJ1Y3QgY3ZteF9sMmNfbGZiMV9zIGNuMzh4eHAyOworCXN0cnVjdCBjdm14X2wyY19sZmIxX3MgY241MHh4OworCXN0cnVjdCBjdm14X2wyY19sZmIxX3MgY241Mnh4OworCXN0cnVjdCBjdm14X2wyY19sZmIxX3MgY241Mnh4cDE7CisJc3RydWN0IGN2bXhfbDJjX2xmYjFfcyBjbjU2eHg7CisJc3RydWN0IGN2bXhfbDJjX2xmYjFfcyBjbjU2eHhwMTsKKwlzdHJ1Y3QgY3ZteF9sMmNfbGZiMV9zIGNuNTh4eDsKKwlzdHJ1Y3QgY3ZteF9sMmNfbGZiMV9zIGNuNTh4eHAxOworfTsKKwordW5pb24gY3ZteF9sMmNfbGZiMiB7CisJdWludDY0X3QgdTY0OworCXN0cnVjdCBjdm14X2wyY19sZmIyX3MgeworCQl1aW50NjRfdCByZXNlcnZlZF8wXzYzOjY0OworCX0gczsKKwlzdHJ1Y3QgY3ZteF9sMmNfbGZiMl9jbjMweHggeworCQl1aW50NjRfdCByZXNlcnZlZF8yN182MzozNzsKKwkJdWludDY0X3QgbGZiX3RhZzoxOTsKKwkJdWludDY0X3QgbGZiX2lkeDo4OworCX0gY24zMHh4OworCXN0cnVjdCBjdm14X2wyY19sZmIyX2NuMzF4eCB7CisJCXVpbnQ2NF90IHJlc2VydmVkXzI3XzYzOjM3OworCQl1aW50NjRfdCBsZmJfdGFnOjE3OworCQl1aW50NjRfdCBsZmJfaWR4OjEwOworCX0gY24zMXh4OworCXN0cnVjdCBjdm14X2wyY19sZmIyX2NuMzF4eCBjbjM4eHg7CisJc3RydWN0IGN2bXhfbDJjX2xmYjJfY24zMXh4IGNuMzh4eHAyOworCXN0cnVjdCBjdm14X2wyY19sZmIyX2NuNTB4eCB7CisJCXVpbnQ2NF90IHJlc2VydmVkXzI3XzYzOjM3OworCQl1aW50NjRfdCBsZmJfdGFnOjIwOworCQl1aW50NjRfdCBsZmJfaWR4Ojc7CisJfSBjbjUweHg7CisJc3RydWN0IGN2bXhfbDJjX2xmYjJfY241Mnh4IHsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfMjdfNjM6Mzc7CisJCXVpbnQ2NF90IGxmYl90YWc6MTg7CisJCXVpbnQ2NF90IGxmYl9pZHg6OTsKKwl9IGNuNTJ4eDsKKwlzdHJ1Y3QgY3ZteF9sMmNfbGZiMl9jbjUyeHggY241Mnh4cDE7CisJc3RydWN0IGN2bXhfbDJjX2xmYjJfY241Nnh4IHsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfMjdfNjM6Mzc7CisJCXVpbnQ2NF90IGxmYl90YWc6MTY7CisJCXVpbnQ2NF90IGxmYl9pZHg6MTE7CisJfSBjbjU2eHg7CisJc3RydWN0IGN2bXhfbDJjX2xmYjJfY241Nnh4IGNuNTZ4eHAxOworCXN0cnVjdCBjdm14X2wyY19sZmIyX2NuNTZ4eCBjbjU4eHg7CisJc3RydWN0IGN2bXhfbDJjX2xmYjJfY241Nnh4IGNuNTh4eHAxOworfTsKKwordW5pb24gY3ZteF9sMmNfbGZiMyB7CisJdWludDY0X3QgdTY0OworCXN0cnVjdCBjdm14X2wyY19sZmIzX3MgeworCQl1aW50NjRfdCByZXNlcnZlZF81XzYzOjU5OworCQl1aW50NjRfdCBzdHBhcnRkaXM6MTsKKwkJdWludDY0X3QgbGZiX2h3bTo0OworCX0gczsKKwlzdHJ1Y3QgY3ZteF9sMmNfbGZiM19jbjMweHggeworCQl1aW50NjRfdCByZXNlcnZlZF81XzYzOjU5OworCQl1aW50NjRfdCBzdHBhcnRkaXM6MTsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfMl8zOjI7CisJCXVpbnQ2NF90IGxmYl9od206MjsKKwl9IGNuMzB4eDsKKwlzdHJ1Y3QgY3ZteF9sMmNfbGZiM19jbjMxeHggeworCQl1aW50NjRfdCByZXNlcnZlZF81XzYzOjU5OworCQl1aW50NjRfdCBzdHBhcnRkaXM6MTsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfM18zOjE7CisJCXVpbnQ2NF90IGxmYl9od206MzsKKwl9IGNuMzF4eDsKKwlzdHJ1Y3QgY3ZteF9sMmNfbGZiM19zIGNuMzh4eDsKKwlzdHJ1Y3QgY3ZteF9sMmNfbGZiM19zIGNuMzh4eHAyOworCXN0cnVjdCBjdm14X2wyY19sZmIzX2NuMzF4eCBjbjUweHg7CisJc3RydWN0IGN2bXhfbDJjX2xmYjNfY24zMXh4IGNuNTJ4eDsKKwlzdHJ1Y3QgY3ZteF9sMmNfbGZiM19jbjMxeHggY241Mnh4cDE7CisJc3RydWN0IGN2bXhfbDJjX2xmYjNfcyBjbjU2eHg7CisJc3RydWN0IGN2bXhfbDJjX2xmYjNfcyBjbjU2eHhwMTsKKwlzdHJ1Y3QgY3ZteF9sMmNfbGZiM19zIGNuNTh4eDsKKwlzdHJ1Y3QgY3ZteF9sMmNfbGZiM19zIGNuNTh4eHAxOworfTsKKwordW5pb24gY3ZteF9sMmNfb29iIHsKKwl1aW50NjRfdCB1NjQ7CisJc3RydWN0IGN2bXhfbDJjX29vYl9zIHsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfMl82Mzo2MjsKKwkJdWludDY0X3QgZHdiZW5hOjE7CisJCXVpbnQ2NF90IHN0ZW5hOjE7CisJfSBzOworCXN0cnVjdCBjdm14X2wyY19vb2JfcyBjbjUyeHg7CisJc3RydWN0IGN2bXhfbDJjX29vYl9zIGNuNTJ4eHAxOworCXN0cnVjdCBjdm14X2wyY19vb2JfcyBjbjU2eHg7CisJc3RydWN0IGN2bXhfbDJjX29vYl9zIGNuNTZ4eHAxOworfTsKKwordW5pb24gY3ZteF9sMmNfb29iMSB7CisJdWludDY0X3QgdTY0OworCXN0cnVjdCBjdm14X2wyY19vb2IxX3MgeworCQl1aW50NjRfdCBmYWRyOjI3OworCQl1aW50NjRfdCBmc3JjOjE7CisJCXVpbnQ2NF90IHJlc2VydmVkXzM0XzM1OjI7CisJCXVpbnQ2NF90IHNhZHI6MTQ7CisJCXVpbnQ2NF90IHJlc2VydmVkXzE0XzE5OjY7CisJCXVpbnQ2NF90IHNpemU6MTQ7CisJfSBzOworCXN0cnVjdCBjdm14X2wyY19vb2IxX3MgY241Mnh4OworCXN0cnVjdCBjdm14X2wyY19vb2IxX3MgY241Mnh4cDE7CisJc3RydWN0IGN2bXhfbDJjX29vYjFfcyBjbjU2eHg7CisJc3RydWN0IGN2bXhfbDJjX29vYjFfcyBjbjU2eHhwMTsKK307CisKK3VuaW9uIGN2bXhfbDJjX29vYjIgeworCXVpbnQ2NF90IHU2NDsKKwlzdHJ1Y3QgY3ZteF9sMmNfb29iMl9zIHsKKwkJdWludDY0X3QgZmFkcjoyNzsKKwkJdWludDY0X3QgZnNyYzoxOworCQl1aW50NjRfdCByZXNlcnZlZF8zNF8zNToyOworCQl1aW50NjRfdCBzYWRyOjE0OworCQl1aW50NjRfdCByZXNlcnZlZF8xNF8xOTo2OworCQl1aW50NjRfdCBzaXplOjE0OworCX0gczsKKwlzdHJ1Y3QgY3ZteF9sMmNfb29iMl9zIGNuNTJ4eDsKKwlzdHJ1Y3QgY3ZteF9sMmNfb29iMl9zIGNuNTJ4eHAxOworCXN0cnVjdCBjdm14X2wyY19vb2IyX3MgY241Nnh4OworCXN0cnVjdCBjdm14X2wyY19vb2IyX3MgY241Nnh4cDE7Cit9OworCit1bmlvbiBjdm14X2wyY19vb2IzIHsKKwl1aW50NjRfdCB1NjQ7CisJc3RydWN0IGN2bXhfbDJjX29vYjNfcyB7CisJCXVpbnQ2NF90IGZhZHI6Mjc7CisJCXVpbnQ2NF90IGZzcmM6MTsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfMzRfMzU6MjsKKwkJdWludDY0X3Qgc2FkcjoxNDsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfMTRfMTk6NjsKKwkJdWludDY0X3Qgc2l6ZToxNDsKKwl9IHM7CisJc3RydWN0IGN2bXhfbDJjX29vYjNfcyBjbjUyeHg7CisJc3RydWN0IGN2bXhfbDJjX29vYjNfcyBjbjUyeHhwMTsKKwlzdHJ1Y3QgY3ZteF9sMmNfb29iM19zIGNuNTZ4eDsKKwlzdHJ1Y3QgY3ZteF9sMmNfb29iM19zIGNuNTZ4eHAxOworfTsKKwordW5pb24gY3ZteF9sMmNfcGZjeCB7CisJdWludDY0X3QgdTY0OworCXN0cnVjdCBjdm14X2wyY19wZmN4X3MgeworCQl1aW50NjRfdCByZXNlcnZlZF8zNl82MzoyODsKKwkJdWludDY0X3QgcGZjbnQwOjM2OworCX0gczsKKwlzdHJ1Y3QgY3ZteF9sMmNfcGZjeF9zIGNuMzB4eDsKKwlzdHJ1Y3QgY3ZteF9sMmNfcGZjeF9zIGNuMzF4eDsKKwlzdHJ1Y3QgY3ZteF9sMmNfcGZjeF9zIGNuMzh4eDsKKwlzdHJ1Y3QgY3ZteF9sMmNfcGZjeF9zIGNuMzh4eHAyOworCXN0cnVjdCBjdm14X2wyY19wZmN4X3MgY241MHh4OworCXN0cnVjdCBjdm14X2wyY19wZmN4X3MgY241Mnh4OworCXN0cnVjdCBjdm14X2wyY19wZmN4X3MgY241Mnh4cDE7CisJc3RydWN0IGN2bXhfbDJjX3BmY3hfcyBjbjU2eHg7CisJc3RydWN0IGN2bXhfbDJjX3BmY3hfcyBjbjU2eHhwMTsKKwlzdHJ1Y3QgY3ZteF9sMmNfcGZjeF9zIGNuNTh4eDsKKwlzdHJ1Y3QgY3ZteF9sMmNfcGZjeF9zIGNuNTh4eHAxOworfTsKKwordW5pb24gY3ZteF9sMmNfcGZjdGwgeworCXVpbnQ2NF90IHU2NDsKKwlzdHJ1Y3QgY3ZteF9sMmNfcGZjdGxfcyB7CisJCXVpbnQ2NF90IHJlc2VydmVkXzM2XzYzOjI4OworCQl1aW50NjRfdCBjbnQzcmRjbHI6MTsKKwkJdWludDY0X3QgY250MnJkY2xyOjE7CisJCXVpbnQ2NF90IGNudDFyZGNscjoxOworCQl1aW50NjRfdCBjbnQwcmRjbHI6MTsKKwkJdWludDY0X3QgY250M2VuYToxOworCQl1aW50NjRfdCBjbnQzY2xyOjE7CisJCXVpbnQ2NF90IGNudDNzZWw6NjsKKwkJdWludDY0X3QgY250MmVuYToxOworCQl1aW50NjRfdCBjbnQyY2xyOjE7CisJCXVpbnQ2NF90IGNudDJzZWw6NjsKKwkJdWludDY0X3QgY250MWVuYToxOworCQl1aW50NjRfdCBjbnQxY2xyOjE7CisJCXVpbnQ2NF90IGNudDFzZWw6NjsKKwkJdWludDY0X3QgY250MGVuYToxOworCQl1aW50NjRfdCBjbnQwY2xyOjE7CisJCXVpbnQ2NF90IGNudDBzZWw6NjsKKwl9IHM7CisJc3RydWN0IGN2bXhfbDJjX3BmY3RsX3MgY24zMHh4OworCXN0cnVjdCBjdm14X2wyY19wZmN0bF9zIGNuMzF4eDsKKwlzdHJ1Y3QgY3ZteF9sMmNfcGZjdGxfcyBjbjM4eHg7CisJc3RydWN0IGN2bXhfbDJjX3BmY3RsX3MgY24zOHh4cDI7CisJc3RydWN0IGN2bXhfbDJjX3BmY3RsX3MgY241MHh4OworCXN0cnVjdCBjdm14X2wyY19wZmN0bF9zIGNuNTJ4eDsKKwlzdHJ1Y3QgY3ZteF9sMmNfcGZjdGxfcyBjbjUyeHhwMTsKKwlzdHJ1Y3QgY3ZteF9sMmNfcGZjdGxfcyBjbjU2eHg7CisJc3RydWN0IGN2bXhfbDJjX3BmY3RsX3MgY241Nnh4cDE7CisJc3RydWN0IGN2bXhfbDJjX3BmY3RsX3MgY241OHh4OworCXN0cnVjdCBjdm14X2wyY19wZmN0bF9zIGNuNTh4eHAxOworfTsKKwordW5pb24gY3ZteF9sMmNfcHBncnAgeworCXVpbnQ2NF90IHU2NDsKKwlzdHJ1Y3QgY3ZteF9sMmNfcHBncnBfcyB7CisJCXVpbnQ2NF90IHJlc2VydmVkXzI0XzYzOjQwOworCQl1aW50NjRfdCBwcDExZ3JwOjI7CisJCXVpbnQ2NF90IHBwMTBncnA6MjsKKwkJdWludDY0X3QgcHA5Z3JwOjI7CisJCXVpbnQ2NF90IHBwOGdycDoyOworCQl1aW50NjRfdCBwcDdncnA6MjsKKwkJdWludDY0X3QgcHA2Z3JwOjI7CisJCXVpbnQ2NF90IHBwNWdycDoyOworCQl1aW50NjRfdCBwcDRncnA6MjsKKwkJdWludDY0X3QgcHAzZ3JwOjI7CisJCXVpbnQ2NF90IHBwMmdycDoyOworCQl1aW50NjRfdCBwcDFncnA6MjsKKwkJdWludDY0X3QgcHAwZ3JwOjI7CisJfSBzOworCXN0cnVjdCBjdm14X2wyY19wcGdycF9jbjUyeHggeworCQl1aW50NjRfdCByZXNlcnZlZF84XzYzOjU2OworCQl1aW50NjRfdCBwcDNncnA6MjsKKwkJdWludDY0X3QgcHAyZ3JwOjI7CisJCXVpbnQ2NF90IHBwMWdycDoyOworCQl1aW50NjRfdCBwcDBncnA6MjsKKwl9IGNuNTJ4eDsKKwlzdHJ1Y3QgY3ZteF9sMmNfcHBncnBfY241Mnh4IGNuNTJ4eHAxOworCXN0cnVjdCBjdm14X2wyY19wcGdycF9zIGNuNTZ4eDsKKwlzdHJ1Y3QgY3ZteF9sMmNfcHBncnBfcyBjbjU2eHhwMTsKK307CisKK3VuaW9uIGN2bXhfbDJjX3NwYXIwIHsKKwl1aW50NjRfdCB1NjQ7CisJc3RydWN0IGN2bXhfbDJjX3NwYXIwX3MgeworCQl1aW50NjRfdCByZXNlcnZlZF8zMl82MzozMjsKKwkJdWludDY0X3QgdW1zazM6ODsKKwkJdWludDY0X3QgdW1zazI6ODsKKwkJdWludDY0X3QgdW1zazE6ODsKKwkJdWludDY0X3QgdW1zazA6ODsKKwl9IHM7CisJc3RydWN0IGN2bXhfbDJjX3NwYXIwX2NuMzB4eCB7CisJCXVpbnQ2NF90IHJlc2VydmVkXzRfNjM6NjA7CisJCXVpbnQ2NF90IHVtc2swOjQ7CisJfSBjbjMweHg7CisJc3RydWN0IGN2bXhfbDJjX3NwYXIwX2NuMzF4eCB7CisJCXVpbnQ2NF90IHJlc2VydmVkXzEyXzYzOjUyOworCQl1aW50NjRfdCB1bXNrMTo0OworCQl1aW50NjRfdCByZXNlcnZlZF80Xzc6NDsKKwkJdWludDY0X3QgdW1zazA6NDsKKwl9IGNuMzF4eDsKKwlzdHJ1Y3QgY3ZteF9sMmNfc3BhcjBfcyBjbjM4eHg7CisJc3RydWN0IGN2bXhfbDJjX3NwYXIwX3MgY24zOHh4cDI7CisJc3RydWN0IGN2bXhfbDJjX3NwYXIwX2NuNTB4eCB7CisJCXVpbnQ2NF90IHJlc2VydmVkXzE2XzYzOjQ4OworCQl1aW50NjRfdCB1bXNrMTo4OworCQl1aW50NjRfdCB1bXNrMDo4OworCX0gY241MHh4OworCXN0cnVjdCBjdm14X2wyY19zcGFyMF9zIGNuNTJ4eDsKKwlzdHJ1Y3QgY3ZteF9sMmNfc3BhcjBfcyBjbjUyeHhwMTsKKwlzdHJ1Y3QgY3ZteF9sMmNfc3BhcjBfcyBjbjU2eHg7CisJc3RydWN0IGN2bXhfbDJjX3NwYXIwX3MgY241Nnh4cDE7CisJc3RydWN0IGN2bXhfbDJjX3NwYXIwX3MgY241OHh4OworCXN0cnVjdCBjdm14X2wyY19zcGFyMF9zIGNuNTh4eHAxOworfTsKKwordW5pb24gY3ZteF9sMmNfc3BhcjEgeworCXVpbnQ2NF90IHU2NDsKKwlzdHJ1Y3QgY3ZteF9sMmNfc3BhcjFfcyB7CisJCXVpbnQ2NF90IHJlc2VydmVkXzMyXzYzOjMyOworCQl1aW50NjRfdCB1bXNrNzo4OworCQl1aW50NjRfdCB1bXNrNjo4OworCQl1aW50NjRfdCB1bXNrNTo4OworCQl1aW50NjRfdCB1bXNrNDo4OworCX0gczsKKwlzdHJ1Y3QgY3ZteF9sMmNfc3BhcjFfcyBjbjM4eHg7CisJc3RydWN0IGN2bXhfbDJjX3NwYXIxX3MgY24zOHh4cDI7CisJc3RydWN0IGN2bXhfbDJjX3NwYXIxX3MgY241Nnh4OworCXN0cnVjdCBjdm14X2wyY19zcGFyMV9zIGNuNTZ4eHAxOworCXN0cnVjdCBjdm14X2wyY19zcGFyMV9zIGNuNTh4eDsKKwlzdHJ1Y3QgY3ZteF9sMmNfc3BhcjFfcyBjbjU4eHhwMTsKK307CisKK3VuaW9uIGN2bXhfbDJjX3NwYXIyIHsKKwl1aW50NjRfdCB1NjQ7CisJc3RydWN0IGN2bXhfbDJjX3NwYXIyX3MgeworCQl1aW50NjRfdCByZXNlcnZlZF8zMl82MzozMjsKKwkJdWludDY0X3QgdW1zazExOjg7CisJCXVpbnQ2NF90IHVtc2sxMDo4OworCQl1aW50NjRfdCB1bXNrOTo4OworCQl1aW50NjRfdCB1bXNrODo4OworCX0gczsKKwlzdHJ1Y3QgY3ZteF9sMmNfc3BhcjJfcyBjbjM4eHg7CisJc3RydWN0IGN2bXhfbDJjX3NwYXIyX3MgY24zOHh4cDI7CisJc3RydWN0IGN2bXhfbDJjX3NwYXIyX3MgY241Nnh4OworCXN0cnVjdCBjdm14X2wyY19zcGFyMl9zIGNuNTZ4eHAxOworCXN0cnVjdCBjdm14X2wyY19zcGFyMl9zIGNuNTh4eDsKKwlzdHJ1Y3QgY3ZteF9sMmNfc3BhcjJfcyBjbjU4eHhwMTsKK307CisKK3VuaW9uIGN2bXhfbDJjX3NwYXIzIHsKKwl1aW50NjRfdCB1NjQ7CisJc3RydWN0IGN2bXhfbDJjX3NwYXIzX3MgeworCQl1aW50NjRfdCByZXNlcnZlZF8zMl82MzozMjsKKwkJdWludDY0X3QgdW1zazE1Ojg7CisJCXVpbnQ2NF90IHVtc2sxNDo4OworCQl1aW50NjRfdCB1bXNrMTM6ODsKKwkJdWludDY0X3QgdW1zazEyOjg7CisJfSBzOworCXN0cnVjdCBjdm14X2wyY19zcGFyM19zIGNuMzh4eDsKKwlzdHJ1Y3QgY3ZteF9sMmNfc3BhcjNfcyBjbjM4eHhwMjsKKwlzdHJ1Y3QgY3ZteF9sMmNfc3BhcjNfcyBjbjU4eHg7CisJc3RydWN0IGN2bXhfbDJjX3NwYXIzX3MgY241OHh4cDE7Cit9OworCit1bmlvbiBjdm14X2wyY19zcGFyNCB7CisJdWludDY0X3QgdTY0OworCXN0cnVjdCBjdm14X2wyY19zcGFyNF9zIHsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfOF82Mzo1NjsKKwkJdWludDY0X3QgdW1za2lvYjo4OworCX0gczsKKwlzdHJ1Y3QgY3ZteF9sMmNfc3BhcjRfY24zMHh4IHsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfNF82Mzo2MDsKKwkJdWludDY0X3QgdW1za2lvYjo0OworCX0gY24zMHh4OworCXN0cnVjdCBjdm14X2wyY19zcGFyNF9jbjMweHggY24zMXh4OworCXN0cnVjdCBjdm14X2wyY19zcGFyNF9zIGNuMzh4eDsKKwlzdHJ1Y3QgY3ZteF9sMmNfc3BhcjRfcyBjbjM4eHhwMjsKKwlzdHJ1Y3QgY3ZteF9sMmNfc3BhcjRfcyBjbjUweHg7CisJc3RydWN0IGN2bXhfbDJjX3NwYXI0X3MgY241Mnh4OworCXN0cnVjdCBjdm14X2wyY19zcGFyNF9zIGNuNTJ4eHAxOworCXN0cnVjdCBjdm14X2wyY19zcGFyNF9zIGNuNTZ4eDsKKwlzdHJ1Y3QgY3ZteF9sMmNfc3BhcjRfcyBjbjU2eHhwMTsKKwlzdHJ1Y3QgY3ZteF9sMmNfc3BhcjRfcyBjbjU4eHg7CisJc3RydWN0IGN2bXhfbDJjX3NwYXI0X3MgY241OHh4cDE7Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9vY3Rlb24vY3ZteC1sMmMuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9vY3Rlb24vY3ZteC1sMmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYThjMDkwCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL29jdGVvbi9jdm14LWwyYy5oCkBAIC0wLDAgKzEsMzI1IEBACisvKioqKioqKioqKioqKioqKioqKioqKipsaWNlbnNlIHN0YXJ0KioqKioqKioqKioqKioqCisgKiBBdXRob3I6IENhdml1bSBOZXR3b3JrcworICoKKyAqIENvbnRhY3Q6IHN1cHBvcnRAY2F2aXVtbmV0d29ya3MuY29tCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgT0NURU9OIFNESworICoKKyAqIENvcHlyaWdodCAoYykgMjAwMy0yMDA4IENhdml1bSBOZXR3b3JrcworICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBWZXJzaW9uIDIsIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBBUy1JUyBhbmQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eQorICogb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBUSVRMRSwgb3IKKyAqIE5PTklORlJJTkdFTUVOVC4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUKKyAqIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBmaWxlOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqIG9yIHZpc2l0IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uCisgKgorICogVGhpcyBmaWxlIG1heSBhbHNvIGJlIGF2YWlsYWJsZSB1bmRlciBhIGRpZmZlcmVudCBsaWNlbnNlIGZyb20gQ2F2aXVtLgorICogQ29udGFjdCBDYXZpdW0gTmV0d29ya3MgZm9yIG1vcmUgaW5mb3JtYXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKmxpY2Vuc2UgZW5kKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKgorICogSW50ZXJmYWNlIHRvIHRoZSBMZXZlbCAyIENhY2hlIChMMkMpIGNvbnRyb2wsIG1lYXN1cmVtZW50LCBhbmQgZGVidWdnaW5nCisgKiBmYWNpbGl0aWVzLgorICovCisKKyNpZm5kZWYgX19DVk1YX0wyQ19IX18KKyNkZWZpbmUgX19DVk1YX0wyQ19IX18KKworLyogRGVwcmVjYXRlZCBtYWNybywgdXNlIGZ1bmN0aW9uICovCisjZGVmaW5lIENWTVhfTDJfQVNTT0MgICAgIGN2bXhfbDJjX2dldF9udW1fYXNzb2MoKQorCisvKiBEZXByZWNhdGVkIG1hY3JvLCB1c2UgZnVuY3Rpb24gKi8KKyNkZWZpbmUgQ1ZNWF9MMl9TRVRfQklUUyAgY3ZteF9sMmNfZ2V0X3NldF9iaXRzKCkKKworLyogRGVwcmVjYXRlZCBtYWNybywgdXNlIGZ1bmN0aW9uICovCisjZGVmaW5lIENWTVhfTDJfU0VUUyAgICAgIGN2bXhfbDJjX2dldF9udW1fc2V0cygpCisKKyNkZWZpbmUgQ1ZNWF9MMkNfSURYX0FERFJfU0hJRlQgNyAgLyogYmFzZWQgb24gMTI4IGJ5dGUgY2FjaGUgbGluZSBzaXplICovCisjZGVmaW5lIENWTVhfTDJDX0lEWF9NQVNLICAgICAgIChjdm14X2wyY19nZXRfbnVtX3NldHMoKSAtIDEpCisKKy8qIERlZmluZXMgZm9yIGluZGV4IGFsaWFzaW5nIGNvbXB1dGF0aW9ucyAqLworI2RlZmluZSBDVk1YX0wyQ19UQUdfQUREUl9BTElBU19TSElGVCBcCisJKENWTVhfTDJDX0lEWF9BRERSX1NISUZUICsgY3ZteF9sMmNfZ2V0X3NldF9iaXRzKCkpCisKKyNkZWZpbmUgQ1ZNWF9MMkNfQUxJQVNfTUFTSyBcCisJKENWTVhfTDJDX0lEWF9NQVNLIDw8IENWTVhfTDJDX1RBR19BRERSX0FMSUFTX1NISUZUKQorCit1bmlvbiBjdm14X2wyY190YWcgeworCXVpbnQ2NF90IHU2NDsKKwlzdHJ1Y3QgeworCQl1aW50NjRfdCByZXNlcnZlZDoyODsKKwkJdWludDY0X3QgVjoxOwkvKiBMaW5lIHZhbGlkICovCisJCXVpbnQ2NF90IEQ6MTsJLyogTGluZSBkaXJ0eSAqLworCQl1aW50NjRfdCBMOjE7CS8qIExpbmUgbG9ja2VkICovCisJCXVpbnQ2NF90IFU6MTsJLyogVXNlLCBMUlUgZXZpY3Rpb24gKi8KKwkJdWludDY0X3QgYWRkcjozMjsJLyogUGh5cyBtZW0gKG5vdCBhbGwgYml0cyB2YWxpZCkgKi8KKwl9IHM7Cit9OworCisgIC8qIEwyQyBQZXJmb3JtYW5jZSBDb3VudGVyIGV2ZW50cy4gKi8KK2VudW0gY3ZteF9sMmNfZXZlbnQgeworCUNWTVhfTDJDX0VWRU5UX0NZQ0xFUyA9IDAsCisJQ1ZNWF9MMkNfRVZFTlRfSU5TVFJVQ1RJT05fTUlTUyA9IDEsCisJQ1ZNWF9MMkNfRVZFTlRfSU5TVFJVQ1RJT05fSElUID0gMiwKKwlDVk1YX0wyQ19FVkVOVF9EQVRBX01JU1MgPSAzLAorCUNWTVhfTDJDX0VWRU5UX0RBVEFfSElUID0gNCwKKwlDVk1YX0wyQ19FVkVOVF9NSVNTID0gNSwKKwlDVk1YX0wyQ19FVkVOVF9ISVQgPSA2LAorCUNWTVhfTDJDX0VWRU5UX1ZJQ1RJTV9ISVQgPSA3LAorCUNWTVhfTDJDX0VWRU5UX0lOREVYX0NPTkZMSUNUID0gOCwKKwlDVk1YX0wyQ19FVkVOVF9UQUdfUFJPQkUgPSA5LAorCUNWTVhfTDJDX0VWRU5UX1RBR19VUERBVEUgPSAxMCwKKwlDVk1YX0wyQ19FVkVOVF9UQUdfQ09NUExFVEUgPSAxMSwKKwlDVk1YX0wyQ19FVkVOVF9UQUdfRElSVFkgPSAxMiwKKwlDVk1YX0wyQ19FVkVOVF9EQVRBX1NUT1JFX05PUCA9IDEzLAorCUNWTVhfTDJDX0VWRU5UX0RBVEFfU1RPUkVfUkVBRCA9IDE0LAorCUNWTVhfTDJDX0VWRU5UX0RBVEFfU1RPUkVfV1JJVEUgPSAxNSwKKwlDVk1YX0wyQ19FVkVOVF9GSUxMX0RBVEFfVkFMSUQgPSAxNiwKKwlDVk1YX0wyQ19FVkVOVF9XUklURV9SRVFVRVNUID0gMTcsCisJQ1ZNWF9MMkNfRVZFTlRfUkVBRF9SRVFVRVNUID0gMTgsCisJQ1ZNWF9MMkNfRVZFTlRfV1JJVEVfREFUQV9WQUxJRCA9IDE5LAorCUNWTVhfTDJDX0VWRU5UX1hNQ19OT1AgPSAyMCwKKwlDVk1YX0wyQ19FVkVOVF9YTUNfTERUID0gMjEsCisJQ1ZNWF9MMkNfRVZFTlRfWE1DX0xESSA9IDIyLAorCUNWTVhfTDJDX0VWRU5UX1hNQ19MREQgPSAyMywKKwlDVk1YX0wyQ19FVkVOVF9YTUNfU1RGID0gMjQsCisJQ1ZNWF9MMkNfRVZFTlRfWE1DX1NUVCA9IDI1LAorCUNWTVhfTDJDX0VWRU5UX1hNQ19TVFAgPSAyNiwKKwlDVk1YX0wyQ19FVkVOVF9YTUNfU1RDID0gMjcsCisJQ1ZNWF9MMkNfRVZFTlRfWE1DX0RXQiA9IDI4LAorCUNWTVhfTDJDX0VWRU5UX1hNQ19QTDIgPSAyOSwKKwlDVk1YX0wyQ19FVkVOVF9YTUNfUFNMMSA9IDMwLAorCUNWTVhfTDJDX0VWRU5UX1hNQ19JT0JMRCA9IDMxLAorCUNWTVhfTDJDX0VWRU5UX1hNQ19JT0JTVCA9IDMyLAorCUNWTVhfTDJDX0VWRU5UX1hNQ19JT0JETUEgPSAzMywKKwlDVk1YX0wyQ19FVkVOVF9YTUNfSU9CUlNQID0gMzQsCisJQ1ZNWF9MMkNfRVZFTlRfWE1DX0JVU19WQUxJRCA9IDM1LAorCUNWTVhfTDJDX0VWRU5UX1hNQ19NRU1fREFUQSA9IDM2LAorCUNWTVhfTDJDX0VWRU5UX1hNQ19SRUZMX0RBVEEgPSAzNywKKwlDVk1YX0wyQ19FVkVOVF9YTUNfSU9CUlNQX0RBVEEgPSAzOCwKKwlDVk1YX0wyQ19FVkVOVF9SU0NfTk9QID0gMzksCisJQ1ZNWF9MMkNfRVZFTlRfUlNDX1NURE4gPSA0MCwKKwlDVk1YX0wyQ19FVkVOVF9SU0NfRklMTCA9IDQxLAorCUNWTVhfTDJDX0VWRU5UX1JTQ19SRUZMID0gNDIsCisJQ1ZNWF9MMkNfRVZFTlRfUlNDX1NUSU4gPSA0MywKKwlDVk1YX0wyQ19FVkVOVF9SU0NfU0NJTiA9IDQ0LAorCUNWTVhfTDJDX0VWRU5UX1JTQ19TQ0ZMID0gNDUsCisJQ1ZNWF9MMkNfRVZFTlRfUlNDX1NDRE4gPSA0NiwKKwlDVk1YX0wyQ19FVkVOVF9SU0NfREFUQV9WQUxJRCA9IDQ3LAorCUNWTVhfTDJDX0VWRU5UX1JTQ19WQUxJRF9GSUxMID0gNDgsCisJQ1ZNWF9MMkNfRVZFTlRfUlNDX1ZBTElEX1NUUlNQID0gNDksCisJQ1ZNWF9MMkNfRVZFTlRfUlNDX1ZBTElEX1JFRkwgPSA1MCwKKwlDVk1YX0wyQ19FVkVOVF9MUkZfUkVRID0gNTEsCisJQ1ZNWF9MMkNfRVZFTlRfRFRfUkRfQUxMT0MgPSA1MiwKKwlDVk1YX0wyQ19FVkVOVF9EVF9XUl9JTlZBTCA9IDUzCit9OworCisvKioKKyAqIENvbmZpZ3VyZSBvbmUgb2YgdGhlIGZvdXIgTDIgQ2FjaGUgcGVyZm9ybWFuY2UgY291bnRlcnMgdG8gY2FwdHVyZSBldmVudAorICogb2NjdXJlbmNlcy4KKyAqCisgKiBAY291bnRlcjogICAgICAgIFRoZSBjb3VudGVyIHRvIGNvbmZpZ3VyZS4gUmFuZ2UgMC4uMy4KKyAqIEBldmVudDogICAgICAgICAgVGhlIHR5cGUgb2YgTDIgQ2FjaGUgZXZlbnQgb2NjdXJyZW5jZSB0byBjb3VudC4KKyAqIEBjbGVhcl9vbl9yZWFkOiAgV2hlbiBhc3NlcnRlZCwgYW55IHJlYWQgb2YgdGhlIHBlcmZvcm1hbmNlIGNvdW50ZXIKKyAqICAgICAgICAgICAgICAgICAgICAgICBjbGVhcnMgdGhlIGNvdW50ZXIuCisgKgorICogVGhlIHJvdXRpbmUgZG9lcyBub3QgY2xlYXIgdGhlIGNvdW50ZXIuCisgKi8KK3ZvaWQgY3ZteF9sMmNfY29uZmlnX3BlcmYodWludDMyX3QgY291bnRlciwKKwkJCSAgZW51bSBjdm14X2wyY19ldmVudCBldmVudCwgdWludDMyX3QgY2xlYXJfb25fcmVhZCk7CisvKioKKyAqIFJlYWQgdGhlIGdpdmVuIEwyIENhY2hlIHBlcmZvcm1hbmNlIGNvdW50ZXIuIFRoZSBjb3VudGVyIG11c3QgYmUgY29uZmlndXJlZAorICogYmVmb3JlIHJlYWRpbmcsIGJ1dCB0aGlzIHJvdXRpbmUgZG9lcyBub3QgZW5mb3JjZSB0aGlzIHJlcXVpcmVtZW50LgorICoKKyAqIEBjb3VudGVyOiAgVGhlIGNvdW50ZXIgdG8gY29uZmlndXJlLiBSYW5nZSAwLi4zLgorICoKKyAqIFJldHVybnMgVGhlIGN1cnJlbnQgY291bnRlciB2YWx1ZS4KKyAqLwordWludDY0X3QgY3ZteF9sMmNfcmVhZF9wZXJmKHVpbnQzMl90IGNvdW50ZXIpOworCisvKioKKyAqIFJldHVybiB0aGUgTDIgQ2FjaGUgd2F5IHBhcnRpdGlvbmluZyBmb3IgYSBnaXZlbiBjb3JlLgorICoKKyAqIEBjb3JlOiAgVGhlIGNvcmUgcHJvY2Vzc29yIG9mIGludGVyZXN0LgorICoKKyAqIFJldHVybnMgICAgVGhlIG1hc2sgc3BlY2lmeWluZyB0aGUgcGFydGl0aW9uaW5nLiAwIGJpdHMgaW4gbWFzayBpbmRpY2F0ZXMKKyAqICAgICAgICAgICAgICB0aGUgY2FjaGUgJ3dheXMnIHRoYXQgYSBjb3JlIGNhbiBldmljdCBmcm9tLgorICogICAgICAgICAgICAtMSBvbiBlcnJvcgorICovCitpbnQgY3ZteF9sMmNfZ2V0X2NvcmVfd2F5X3BhcnRpdGlvbih1aW50MzJfdCBjb3JlKTsKKworLyoqCisgKiBQYXJ0aXRpb25zIHRoZSBMMiBjYWNoZSBmb3IgYSBjb3JlCisgKgorICogQGNvcmU6ICBUaGUgY29yZSB0aGF0IHRoZSBwYXJ0aXRpb25pbmcgYXBwbGllcyB0by4KKyAqCisgKiBAbWFzazogVGhlIHBhcnRpdGlvbmluZyBvZiB0aGUgd2F5cyBleHByZXNzZWQgYXMgYSBiaW5hcnkgbWFzay4gQSAwCisgKiAgICAgICAgYml0IGFsbG93cyB0aGUgY29yZSB0byBldmljdCBjYWNoZSBsaW5lcyBmcm9tIGEgd2F5LCB3aGlsZSBhCisgKiAgICAgICAgMSBiaXQgYmxvY2tzIHRoZSBjb3JlIGZyb20gZXZpY3RpbmcgYW55IGxpbmVzIGZyb20gdGhhdAorICogICAgICAgIHdheS4gVGhlcmUgbXVzdCBiZSBhdCBsZWFzdCBvbmUgYWxsb3dlZCB3YXkgKDAgYml0KSBpbiB0aGUKKyAqICAgICAgICBtYXNrLgorICoKKyAqIElmIGFueSB3YXlzIGFyZSBibG9ja2VkIGZvciBhbGwgY29yZXMgYW5kIHRoZSBIVyBibG9ja3MsIHRoZW4gdGhvc2UKKyAqIHdheXMgd2lsbCBuZXZlciBoYXZlIGFueSBjYWNoZSBsaW5lcyBldmljdGVkIGZyb20gdGhlbS4gIEFsbCBjb3JlcworICogYW5kIHRoZSBoYXJkd2FyZSBibG9ja3MgYXJlIGZyZWUgdG8gcmVhZCBmcm9tIGFsbCB3YXlzIHJlZ2FyZGxlc3MKKyAqIG9mIHRoZSBwYXJ0aXRpb25pbmcuCisgKi8KK2ludCBjdm14X2wyY19zZXRfY29yZV93YXlfcGFydGl0aW9uKHVpbnQzMl90IGNvcmUsIHVpbnQzMl90IG1hc2spOworCisvKioKKyAqIFJldHVybiB0aGUgTDIgQ2FjaGUgd2F5IHBhcnRpdGlvbmluZyBmb3IgdGhlIGh3IGJsb2Nrcy4KKyAqCisgKiBSZXR1cm5zICAgIFRoZSBtYXNrIHNwZWNpZnlpbmcgdGhlIHJlc2VydmVkIHdheS4gMCBiaXRzIGluIG1hc2sgaW5kaWNhdGVzCisgKiAgICAgICAgICAgICAgdGhlIGNhY2hlICd3YXlzJyB0aGF0IGEgY29yZSBjYW4gZXZpY3QgZnJvbS4KKyAqICAgICAgICAgICAgLTEgb24gZXJyb3IKKyAqLworaW50IGN2bXhfbDJjX2dldF9od193YXlfcGFydGl0aW9uKHZvaWQpOworCisvKioKKyAqIFBhcnRpdGlvbnMgdGhlIEwyIGNhY2hlIGZvciB0aGUgaGFyZHdhcmUgYmxvY2tzLgorICoKKyAqIEBtYXNrOiBUaGUgcGFydGl0aW9uaW5nIG9mIHRoZSB3YXlzIGV4cHJlc3NlZCBhcyBhIGJpbmFyeSBtYXNrLiBBIDAKKyAqICAgICAgICBiaXQgYWxsb3dzIHRoZSBjb3JlIHRvIGV2aWN0IGNhY2hlIGxpbmVzIGZyb20gYSB3YXksIHdoaWxlIGEKKyAqICAgICAgICAxIGJpdCBibG9ja3MgdGhlIGNvcmUgZnJvbSBldmljdGluZyBhbnkgbGluZXMgZnJvbSB0aGF0CisgKiAgICAgICAgd2F5LiBUaGVyZSBtdXN0IGJlIGF0IGxlYXN0IG9uZSBhbGxvd2VkIHdheSAoMCBiaXQpIGluIHRoZQorICogICAgICAgIG1hc2suCisgKgorICogSWYgYW55IHdheXMgYXJlIGJsb2NrZWQgZm9yIGFsbCBjb3JlcyBhbmQgdGhlIEhXIGJsb2NrcywgdGhlbiB0aG9zZQorICogd2F5cyB3aWxsIG5ldmVyIGhhdmUgYW55IGNhY2hlIGxpbmVzIGV2aWN0ZWQgZnJvbSB0aGVtLiAgQWxsIGNvcmVzCisgKiBhbmQgdGhlIGhhcmR3YXJlIGJsb2NrcyBhcmUgZnJlZSB0byByZWFkIGZyb20gYWxsIHdheXMgcmVnYXJkbGVzcworICogb2YgdGhlIHBhcnRpdGlvbmluZy4KKyAqLworaW50IGN2bXhfbDJjX3NldF9od193YXlfcGFydGl0aW9uKHVpbnQzMl90IG1hc2spOworCisvKioKKyAqIExvY2tzIGEgbGluZSBpbiB0aGUgTDIgY2FjaGUgYXQgdGhlIHNwZWNpZmllZCBwaHlzaWNhbCBhZGRyZXNzCisgKgorICogQGFkZHI6ICAgcGh5c2ljYWwgYWRkcmVzcyBvZiBsaW5lIHRvIGxvY2sKKyAqCisgKiBSZXR1cm5zIDAgb24gc3VjY2VzcywKKyAqICAgICAgICAgMSBpZiBsaW5lIG5vdCBsb2NrZWQuCisgKi8KK2ludCBjdm14X2wyY19sb2NrX2xpbmUodWludDY0X3QgYWRkcik7CisKKy8qKgorICogTG9ja3MgYSBzcGVjaWZpZWQgbWVtb3J5IHJlZ2lvbiBpbiB0aGUgTDIgY2FjaGUuCisgKgorICogTm90ZSB0aGF0IGlmIG5vdCBhbGwgbGluZXMgY2FuIGJlIGxvY2tlZCwgdGhhdCBtZWFucyB0aGF0IGFsbAorICogYnV0IG9uZSBvZiB0aGUgd2F5cyAoYXNzb2NpYXRpb25zKSBhdmFpbGFibGUgdG8gdGhlIGxvY2tpbmcKKyAqIGNvcmUgYXJlIGxvY2tlZC4gIEhhdmluZyBvbmx5IDEgYXNzb2NpYXRpb24gYXZhaWxhYmxlIGZvcgorICogbm9ybWFsIGNhY2hpbmcgbWF5IGhhdmUgYSBzaWduaWZpY2FudCBhZHZlcnNlIGFmZmVjdCBvbiBwZXJmb3JtYW5jZS4KKyAqIENhcmUgc2hvdWxkIGJlIHRha2VuIHRvIGVuc3VyZSB0aGF0IGVub3VnaCBvZiB0aGUgTDIgY2FjaGUgaXMgbGVmdAorICogdW5sb2NrZWQgdG8gYWxsb3cgZm9yIG5vcm1hbCBjYWNoaW5nIG9mIERSQU0uCisgKgorICogQHN0YXJ0OiAgUGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUgc3RhcnQgb2YgdGhlIHJlZ2lvbiB0byBsb2NrCisgKiBAbGVuOiAgICBMZW5ndGggKGluIGJ5dGVzKSBvZiByZWdpb24gdG8gbG9jaworICoKKyAqIFJldHVybnMgTnVtYmVyIG9mIHJlcXVlc3RlZCBsaW5lcyB0aGF0IHdoZXJlIG5vdCBsb2NrZWQuCisgKiAgICAgICAgIDAgb24gc3VjY2VzcyAoYWxsIGxvY2tlZCkKKyAqLworaW50IGN2bXhfbDJjX2xvY2tfbWVtX3JlZ2lvbih1aW50NjRfdCBzdGFydCwgdWludDY0X3QgbGVuKTsKKworLyoqCisgKiBVbmxvY2sgYW5kIGZsdXNoIGEgY2FjaGUgbGluZSBmcm9tIHRoZSBMMiBjYWNoZS4KKyAqIElNUE9SVEFOVDogTXVzdCBvbmx5IGJlIHJ1biBieSBvbmUgY29yZSBhdCBhIHRpbWUgZHVlIHRvIHVzZQorICogb2YgTDJDIGRlYnVnIGZlYXR1cmVzLgorICogTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gd2lsbCBmbHVzaCBhIG1hdGNoaW5nIGJ1dCB1bmxvY2tlZCBjYWNoZSBsaW5lLgorICogKElmIGFkZHJlc3MgaXMgbm90IGluIEwyLCBubyBsaW5lcyBhcmUgZmx1c2hlZC4pCisgKgorICogQGFkZHJlc3M6IFBoeXNpY2FsIGFkZHJlc3MgdG8gdW5sb2NrCisgKgorICogUmV0dXJucyAwOiBsaW5lIG5vdCB1bmxvY2tlZAorICogICAgICAgICAxOiBsaW5lIHVubG9ja2VkCisgKi8KK2ludCBjdm14X2wyY191bmxvY2tfbGluZSh1aW50NjRfdCBhZGRyZXNzKTsKKworLyoqCisgKiBVbmxvY2tzIGEgcmVnaW9uIG9mIG1lbW9yeSB0aGF0IGlzIGxvY2tlZCBpbiB0aGUgTDIgY2FjaGUKKyAqCisgKiBAc3RhcnQ6ICBzdGFydCBwaHlzaWNhbCBhZGRyZXNzCisgKiBAbGVuOiAgICBsZW5ndGggKGluIGJ5dGVzKSB0byB1bmxvY2sKKyAqCisgKiBSZXR1cm5zIE51bWJlciBvZiBsb2NrZWQgbGluZXMgdGhhdCB0aGUgY2FsbCB1bmxvY2tlZAorICovCitpbnQgY3ZteF9sMmNfdW5sb2NrX21lbV9yZWdpb24odWludDY0X3Qgc3RhcnQsIHVpbnQ2NF90IGxlbik7CisKKy8qKgorICogUmVhZCB0aGUgTDIgY29udHJvbGxlciB0YWcgZm9yIGEgZ2l2ZW4gbG9jYXRpb24gaW4gTDIKKyAqCisgKiBAYXNzb2NpYXRpb246CisgKiAgICAgICAgICAgICAgIFdoaWNoIGFzc29jaWF0aW9uIHRvIHJlYWQgbGluZSBmcm9tCisgKiBAaW5kZXg6ICBXaGljaCB3YXkgdG8gcmVhZCBmcm9tLgorICoKKyAqIFJldHVybnMgbDJjIHRhZyBzdHJ1Y3R1cmUgZm9yIGxpbmUgcmVxdWVzdGVkLgorICovCit1bmlvbiBjdm14X2wyY190YWcgY3ZteF9sMmNfZ2V0X3RhZyh1aW50MzJfdCBhc3NvY2lhdGlvbiwgdWludDMyX3QgaW5kZXgpOworCisvKiBXcmFwcGVyIGFyb3VuZCBkZXByZWNhdGVkIG9sZCBmdW5jdGlvbiBuYW1lICovCitzdGF0aWMgaW5saW5lIHVuaW9uIGN2bXhfbDJjX3RhZyBjdm14X2dldF9sMmNfdGFnKHVpbnQzMl90IGFzc29jaWF0aW9uLAorCQkJCQkgICAgICB1aW50MzJfdCBpbmRleCkKK3sKKwlyZXR1cm4gY3ZteF9sMmNfZ2V0X3RhZyhhc3NvY2lhdGlvbiwgaW5kZXgpOworfQorCisvKioKKyAqIFJldHVybnMgdGhlIGNhY2hlIGluZGV4IGZvciBhIGdpdmVuIHBoeXNpY2FsIGFkZHJlc3MKKyAqCisgKiBAYWRkcjogICBwaHlzaWNhbCBhZGRyZXNzCisgKgorICogUmV0dXJucyBMMiBjYWNoZSBpbmRleAorICovCit1aW50MzJfdCBjdm14X2wyY19hZGRyZXNzX3RvX2luZGV4KHVpbnQ2NF90IGFkZHIpOworCisvKioKKyAqIEZsdXNoZXMgKGFuZCB1bmxvY2tzKSB0aGUgZW50aXJlIEwyIGNhY2hlLgorICogSU1QT1JUQU5UOiBNdXN0IG9ubHkgYmUgcnVuIGJ5IG9uZSBjb3JlIGF0IGEgdGltZSBkdWUgdG8gdXNlCisgKiBvZiBMMkMgZGVidWcgZmVhdHVyZXMuCisgKi8KK3ZvaWQgY3ZteF9sMmNfZmx1c2godm9pZCk7CisKKy8qKgorICoKKyAqIFJldHVybnMgUmV0dXJucyB0aGUgc2l6ZSBvZiB0aGUgTDIgY2FjaGUgaW4gYnl0ZXMsCisgKiAtMSBvbiBlcnJvciAodW5yZWNvZ25pemVkIG1vZGVsKQorICovCitpbnQgY3ZteF9sMmNfZ2V0X2NhY2hlX3NpemVfYnl0ZXModm9pZCk7CisKKy8qKgorICogUmV0dXJuIHRoZSBudW1iZXIgb2Ygc2V0cyBpbiB0aGUgTDIgQ2FjaGUKKyAqCisgKiBSZXR1cm5zCisgKi8KK2ludCBjdm14X2wyY19nZXRfbnVtX3NldHModm9pZCk7CisKKy8qKgorICogUmV0dXJuIGxvZyBiYXNlIDIgb2YgdGhlIG51bWJlciBvZiBzZXRzIGluIHRoZSBMMiBjYWNoZQorICogUmV0dXJucworICovCitpbnQgY3ZteF9sMmNfZ2V0X3NldF9iaXRzKHZvaWQpOworLyoqCisgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBhc3NvY2lhdGlvbnMgaW4gdGhlIEwyIENhY2hlCisgKgorICogUmV0dXJucworICovCitpbnQgY3ZteF9sMmNfZ2V0X251bV9hc3NvYyh2b2lkKTsKKworLyoqCisgKiBGbHVzaCBhIGxpbmUgZnJvbSB0aGUgTDIgY2FjaGUKKyAqIFRoaXMgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGZyb20gb25lIGNvcmUgYXQgYSB0aW1lLCBhcyB0aGlzIHJvdXRpbmUKKyAqIHNldHMgdGhlIGNvcmUgdG8gdGhlICdkZWJ1ZycgY29yZSBpbiBvcmRlciB0byBmbHVzaCB0aGUgbGluZS4KKyAqCisgKiBAYXNzb2M6ICBBc3NvY2lhdGlvbiAob3Igd2F5KSB0byBmbHVzaAorICogQGluZGV4OiAgSW5kZXggdG8gZmx1c2gKKyAqLwordm9pZCBjdm14X2wyY19mbHVzaF9saW5lKHVpbnQzMl90IGFzc29jLCB1aW50MzJfdCBpbmRleCk7CisKKyNlbmRpZiAvKiBfX0NWTVhfTDJDX0hfXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL29jdGVvbi9jdm14LWwyZC1kZWZzLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vb2N0ZW9uL2N2bXgtbDJkLWRlZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzEwMmQ0Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL29jdGVvbi9jdm14LWwyZC1kZWZzLmgKQEAgLTAsMCArMSwzNjkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKmxpY2Vuc2Ugc3RhcnQqKioqKioqKioqKioqKioKKyAqIEF1dGhvcjogQ2F2aXVtIE5ldHdvcmtzCisgKgorICogQ29udGFjdDogc3VwcG9ydEBjYXZpdW1uZXR3b3Jrcy5jb20KKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBPQ1RFT04gU0RLCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMDggQ2F2aXVtIE5ldHdvcmtzCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIFZlcnNpb24gMiwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIEFTLUlTIGFuZCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5CisgKiBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIFRJVExFLCBvcgorICogTk9OSU5GUklOR0VNRU5ULiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZQorICogZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIGZpbGU7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICogb3IgdmlzaXQgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4KKyAqCisgKiBUaGlzIGZpbGUgbWF5IGFsc28gYmUgYXZhaWxhYmxlIHVuZGVyIGEgZGlmZmVyZW50IGxpY2Vuc2UgZnJvbSBDYXZpdW0uCisgKiBDb250YWN0IENhdml1bSBOZXR3b3JrcyBmb3IgbW9yZSBpbmZvcm1hdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqbGljZW5zZSBlbmQqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfX0NWTVhfTDJEX0RFRlNfSF9fCisjZGVmaW5lIF9fQ1ZNWF9MMkRfREVGU19IX18KKworI2RlZmluZSBDVk1YX0wyRF9CU1QwIFwKKwkgQ1ZNWF9BRERfSU9fU0VHKDB4MDAwMTE4MDA4MDAwMDc4MHVsbCkKKyNkZWZpbmUgQ1ZNWF9MMkRfQlNUMSBcCisJIENWTVhfQUREX0lPX1NFRygweDAwMDExODAwODAwMDA3ODh1bGwpCisjZGVmaW5lIENWTVhfTDJEX0JTVDIgXAorCSBDVk1YX0FERF9JT19TRUcoMHgwMDAxMTgwMDgwMDAwNzkwdWxsKQorI2RlZmluZSBDVk1YX0wyRF9CU1QzIFwKKwkgQ1ZNWF9BRERfSU9fU0VHKDB4MDAwMTE4MDA4MDAwMDc5OHVsbCkKKyNkZWZpbmUgQ1ZNWF9MMkRfRVJSIFwKKwkgQ1ZNWF9BRERfSU9fU0VHKDB4MDAwMTE4MDA4MDAwMDAxMHVsbCkKKyNkZWZpbmUgQ1ZNWF9MMkRfRkFEUiBcCisJIENWTVhfQUREX0lPX1NFRygweDAwMDExODAwODAwMDAwMTh1bGwpCisjZGVmaW5lIENWTVhfTDJEX0ZTWU4wIFwKKwkgQ1ZNWF9BRERfSU9fU0VHKDB4MDAwMTE4MDA4MDAwMDAyMHVsbCkKKyNkZWZpbmUgQ1ZNWF9MMkRfRlNZTjEgXAorCSBDVk1YX0FERF9JT19TRUcoMHgwMDAxMTgwMDgwMDAwMDI4dWxsKQorI2RlZmluZSBDVk1YX0wyRF9GVVMwIFwKKwkgQ1ZNWF9BRERfSU9fU0VHKDB4MDAwMTE4MDA4MDAwMDdBMHVsbCkKKyNkZWZpbmUgQ1ZNWF9MMkRfRlVTMSBcCisJIENWTVhfQUREX0lPX1NFRygweDAwMDExODAwODAwMDA3QTh1bGwpCisjZGVmaW5lIENWTVhfTDJEX0ZVUzIgXAorCSBDVk1YX0FERF9JT19TRUcoMHgwMDAxMTgwMDgwMDAwN0IwdWxsKQorI2RlZmluZSBDVk1YX0wyRF9GVVMzIFwKKwkgQ1ZNWF9BRERfSU9fU0VHKDB4MDAwMTE4MDA4MDAwMDdCOHVsbCkKKwordW5pb24gY3ZteF9sMmRfYnN0MCB7CisJdWludDY0X3QgdTY0OworCXN0cnVjdCBjdm14X2wyZF9ic3QwX3MgeworCQl1aW50NjRfdCByZXNlcnZlZF8zNV82MzoyOTsKKwkJdWludDY0X3QgZnRsOjE7CisJCXVpbnQ2NF90IHEwc3RhdDozNDsKKwl9IHM7CisJc3RydWN0IGN2bXhfbDJkX2JzdDBfcyBjbjMweHg7CisJc3RydWN0IGN2bXhfbDJkX2JzdDBfcyBjbjMxeHg7CisJc3RydWN0IGN2bXhfbDJkX2JzdDBfcyBjbjM4eHg7CisJc3RydWN0IGN2bXhfbDJkX2JzdDBfcyBjbjM4eHhwMjsKKwlzdHJ1Y3QgY3ZteF9sMmRfYnN0MF9zIGNuNTB4eDsKKwlzdHJ1Y3QgY3ZteF9sMmRfYnN0MF9zIGNuNTJ4eDsKKwlzdHJ1Y3QgY3ZteF9sMmRfYnN0MF9zIGNuNTJ4eHAxOworCXN0cnVjdCBjdm14X2wyZF9ic3QwX3MgY241Nnh4OworCXN0cnVjdCBjdm14X2wyZF9ic3QwX3MgY241Nnh4cDE7CisJc3RydWN0IGN2bXhfbDJkX2JzdDBfcyBjbjU4eHg7CisJc3RydWN0IGN2bXhfbDJkX2JzdDBfcyBjbjU4eHhwMTsKK307CisKK3VuaW9uIGN2bXhfbDJkX2JzdDEgeworCXVpbnQ2NF90IHU2NDsKKwlzdHJ1Y3QgY3ZteF9sMmRfYnN0MV9zIHsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfMzRfNjM6MzA7CisJCXVpbnQ2NF90IHExc3RhdDozNDsKKwl9IHM7CisJc3RydWN0IGN2bXhfbDJkX2JzdDFfcyBjbjMweHg7CisJc3RydWN0IGN2bXhfbDJkX2JzdDFfcyBjbjMxeHg7CisJc3RydWN0IGN2bXhfbDJkX2JzdDFfcyBjbjM4eHg7CisJc3RydWN0IGN2bXhfbDJkX2JzdDFfcyBjbjM4eHhwMjsKKwlzdHJ1Y3QgY3ZteF9sMmRfYnN0MV9zIGNuNTB4eDsKKwlzdHJ1Y3QgY3ZteF9sMmRfYnN0MV9zIGNuNTJ4eDsKKwlzdHJ1Y3QgY3ZteF9sMmRfYnN0MV9zIGNuNTJ4eHAxOworCXN0cnVjdCBjdm14X2wyZF9ic3QxX3MgY241Nnh4OworCXN0cnVjdCBjdm14X2wyZF9ic3QxX3MgY241Nnh4cDE7CisJc3RydWN0IGN2bXhfbDJkX2JzdDFfcyBjbjU4eHg7CisJc3RydWN0IGN2bXhfbDJkX2JzdDFfcyBjbjU4eHhwMTsKK307CisKK3VuaW9uIGN2bXhfbDJkX2JzdDIgeworCXVpbnQ2NF90IHU2NDsKKwlzdHJ1Y3QgY3ZteF9sMmRfYnN0Ml9zIHsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfMzRfNjM6MzA7CisJCXVpbnQ2NF90IHEyc3RhdDozNDsKKwl9IHM7CisJc3RydWN0IGN2bXhfbDJkX2JzdDJfcyBjbjMweHg7CisJc3RydWN0IGN2bXhfbDJkX2JzdDJfcyBjbjMxeHg7CisJc3RydWN0IGN2bXhfbDJkX2JzdDJfcyBjbjM4eHg7CisJc3RydWN0IGN2bXhfbDJkX2JzdDJfcyBjbjM4eHhwMjsKKwlzdHJ1Y3QgY3ZteF9sMmRfYnN0Ml9zIGNuNTB4eDsKKwlzdHJ1Y3QgY3ZteF9sMmRfYnN0Ml9zIGNuNTJ4eDsKKwlzdHJ1Y3QgY3ZteF9sMmRfYnN0Ml9zIGNuNTJ4eHAxOworCXN0cnVjdCBjdm14X2wyZF9ic3QyX3MgY241Nnh4OworCXN0cnVjdCBjdm14X2wyZF9ic3QyX3MgY241Nnh4cDE7CisJc3RydWN0IGN2bXhfbDJkX2JzdDJfcyBjbjU4eHg7CisJc3RydWN0IGN2bXhfbDJkX2JzdDJfcyBjbjU4eHhwMTsKK307CisKK3VuaW9uIGN2bXhfbDJkX2JzdDMgeworCXVpbnQ2NF90IHU2NDsKKwlzdHJ1Y3QgY3ZteF9sMmRfYnN0M19zIHsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfMzRfNjM6MzA7CisJCXVpbnQ2NF90IHEzc3RhdDozNDsKKwl9IHM7CisJc3RydWN0IGN2bXhfbDJkX2JzdDNfcyBjbjMweHg7CisJc3RydWN0IGN2bXhfbDJkX2JzdDNfcyBjbjMxeHg7CisJc3RydWN0IGN2bXhfbDJkX2JzdDNfcyBjbjM4eHg7CisJc3RydWN0IGN2bXhfbDJkX2JzdDNfcyBjbjM4eHhwMjsKKwlzdHJ1Y3QgY3ZteF9sMmRfYnN0M19zIGNuNTB4eDsKKwlzdHJ1Y3QgY3ZteF9sMmRfYnN0M19zIGNuNTJ4eDsKKwlzdHJ1Y3QgY3ZteF9sMmRfYnN0M19zIGNuNTJ4eHAxOworCXN0cnVjdCBjdm14X2wyZF9ic3QzX3MgY241Nnh4OworCXN0cnVjdCBjdm14X2wyZF9ic3QzX3MgY241Nnh4cDE7CisJc3RydWN0IGN2bXhfbDJkX2JzdDNfcyBjbjU4eHg7CisJc3RydWN0IGN2bXhfbDJkX2JzdDNfcyBjbjU4eHhwMTsKK307CisKK3VuaW9uIGN2bXhfbDJkX2VyciB7CisJdWludDY0X3QgdTY0OworCXN0cnVjdCBjdm14X2wyZF9lcnJfcyB7CisJCXVpbnQ2NF90IHJlc2VydmVkXzZfNjM6NTg7CisJCXVpbnQ2NF90IGJtaGNsc2VsOjE7CisJCXVpbnQ2NF90IGRlZF9lcnI6MTsKKwkJdWludDY0X3Qgc2VjX2VycjoxOworCQl1aW50NjRfdCBkZWRfaW50ZW5hOjE7CisJCXVpbnQ2NF90IHNlY19pbnRlbmE6MTsKKwkJdWludDY0X3QgZWNjX2VuYToxOworCX0gczsKKwlzdHJ1Y3QgY3ZteF9sMmRfZXJyX3MgY24zMHh4OworCXN0cnVjdCBjdm14X2wyZF9lcnJfcyBjbjMxeHg7CisJc3RydWN0IGN2bXhfbDJkX2Vycl9zIGNuMzh4eDsKKwlzdHJ1Y3QgY3ZteF9sMmRfZXJyX3MgY24zOHh4cDI7CisJc3RydWN0IGN2bXhfbDJkX2Vycl9zIGNuNTB4eDsKKwlzdHJ1Y3QgY3ZteF9sMmRfZXJyX3MgY241Mnh4OworCXN0cnVjdCBjdm14X2wyZF9lcnJfcyBjbjUyeHhwMTsKKwlzdHJ1Y3QgY3ZteF9sMmRfZXJyX3MgY241Nnh4OworCXN0cnVjdCBjdm14X2wyZF9lcnJfcyBjbjU2eHhwMTsKKwlzdHJ1Y3QgY3ZteF9sMmRfZXJyX3MgY241OHh4OworCXN0cnVjdCBjdm14X2wyZF9lcnJfcyBjbjU4eHhwMTsKK307CisKK3VuaW9uIGN2bXhfbDJkX2ZhZHIgeworCXVpbnQ2NF90IHU2NDsKKwlzdHJ1Y3QgY3ZteF9sMmRfZmFkcl9zIHsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfMTlfNjM6NDU7CisJCXVpbnQ2NF90IGZhZHJ1OjE7CisJCXVpbnQ2NF90IGZvd21zazo0OworCQl1aW50NjRfdCBmc2V0OjM7CisJCXVpbnQ2NF90IGZhZHI6MTE7CisJfSBzOworCXN0cnVjdCBjdm14X2wyZF9mYWRyX2NuMzB4eCB7CisJCXVpbnQ2NF90IHJlc2VydmVkXzE4XzYzOjQ2OworCQl1aW50NjRfdCBmb3dtc2s6NDsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfMTNfMTM6MTsKKwkJdWludDY0X3QgZnNldDoyOworCQl1aW50NjRfdCByZXNlcnZlZF85XzEwOjI7CisJCXVpbnQ2NF90IGZhZHI6OTsKKwl9IGNuMzB4eDsKKwlzdHJ1Y3QgY3ZteF9sMmRfZmFkcl9jbjMxeHggeworCQl1aW50NjRfdCByZXNlcnZlZF8xOF82Mzo0NjsKKwkJdWludDY0X3QgZm93bXNrOjQ7CisJCXVpbnQ2NF90IHJlc2VydmVkXzEzXzEzOjE7CisJCXVpbnQ2NF90IGZzZXQ6MjsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfMTBfMTA6MTsKKwkJdWludDY0X3QgZmFkcjoxMDsKKwl9IGNuMzF4eDsKKwlzdHJ1Y3QgY3ZteF9sMmRfZmFkcl9jbjM4eHggeworCQl1aW50NjRfdCByZXNlcnZlZF8xOF82Mzo0NjsKKwkJdWludDY0X3QgZm93bXNrOjQ7CisJCXVpbnQ2NF90IGZzZXQ6MzsKKwkJdWludDY0X3QgZmFkcjoxMTsKKwl9IGNuMzh4eDsKKwlzdHJ1Y3QgY3ZteF9sMmRfZmFkcl9jbjM4eHggY24zOHh4cDI7CisJc3RydWN0IGN2bXhfbDJkX2ZhZHJfY241MHh4IHsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfMThfNjM6NDY7CisJCXVpbnQ2NF90IGZvd21zazo0OworCQl1aW50NjRfdCBmc2V0OjM7CisJCXVpbnQ2NF90IHJlc2VydmVkXzhfMTA6MzsKKwkJdWludDY0X3QgZmFkcjo4OworCX0gY241MHh4OworCXN0cnVjdCBjdm14X2wyZF9mYWRyX2NuNTJ4eCB7CisJCXVpbnQ2NF90IHJlc2VydmVkXzE4XzYzOjQ2OworCQl1aW50NjRfdCBmb3dtc2s6NDsKKwkJdWludDY0X3QgZnNldDozOworCQl1aW50NjRfdCByZXNlcnZlZF8xMF8xMDoxOworCQl1aW50NjRfdCBmYWRyOjEwOworCX0gY241Mnh4OworCXN0cnVjdCBjdm14X2wyZF9mYWRyX2NuNTJ4eCBjbjUyeHhwMTsKKwlzdHJ1Y3QgY3ZteF9sMmRfZmFkcl9zIGNuNTZ4eDsKKwlzdHJ1Y3QgY3ZteF9sMmRfZmFkcl9zIGNuNTZ4eHAxOworCXN0cnVjdCBjdm14X2wyZF9mYWRyX3MgY241OHh4OworCXN0cnVjdCBjdm14X2wyZF9mYWRyX3MgY241OHh4cDE7Cit9OworCit1bmlvbiBjdm14X2wyZF9mc3luMCB7CisJdWludDY0X3QgdTY0OworCXN0cnVjdCBjdm14X2wyZF9mc3luMF9zIHsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfMjBfNjM6NDQ7CisJCXVpbnQ2NF90IGZzeW5fb3cxOjEwOworCQl1aW50NjRfdCBmc3luX293MDoxMDsKKwl9IHM7CisJc3RydWN0IGN2bXhfbDJkX2ZzeW4wX3MgY24zMHh4OworCXN0cnVjdCBjdm14X2wyZF9mc3luMF9zIGNuMzF4eDsKKwlzdHJ1Y3QgY3ZteF9sMmRfZnN5bjBfcyBjbjM4eHg7CisJc3RydWN0IGN2bXhfbDJkX2ZzeW4wX3MgY24zOHh4cDI7CisJc3RydWN0IGN2bXhfbDJkX2ZzeW4wX3MgY241MHh4OworCXN0cnVjdCBjdm14X2wyZF9mc3luMF9zIGNuNTJ4eDsKKwlzdHJ1Y3QgY3ZteF9sMmRfZnN5bjBfcyBjbjUyeHhwMTsKKwlzdHJ1Y3QgY3ZteF9sMmRfZnN5bjBfcyBjbjU2eHg7CisJc3RydWN0IGN2bXhfbDJkX2ZzeW4wX3MgY241Nnh4cDE7CisJc3RydWN0IGN2bXhfbDJkX2ZzeW4wX3MgY241OHh4OworCXN0cnVjdCBjdm14X2wyZF9mc3luMF9zIGNuNTh4eHAxOworfTsKKwordW5pb24gY3ZteF9sMmRfZnN5bjEgeworCXVpbnQ2NF90IHU2NDsKKwlzdHJ1Y3QgY3ZteF9sMmRfZnN5bjFfcyB7CisJCXVpbnQ2NF90IHJlc2VydmVkXzIwXzYzOjQ0OworCQl1aW50NjRfdCBmc3luX293MzoxMDsKKwkJdWludDY0X3QgZnN5bl9vdzI6MTA7CisJfSBzOworCXN0cnVjdCBjdm14X2wyZF9mc3luMV9zIGNuMzB4eDsKKwlzdHJ1Y3QgY3ZteF9sMmRfZnN5bjFfcyBjbjMxeHg7CisJc3RydWN0IGN2bXhfbDJkX2ZzeW4xX3MgY24zOHh4OworCXN0cnVjdCBjdm14X2wyZF9mc3luMV9zIGNuMzh4eHAyOworCXN0cnVjdCBjdm14X2wyZF9mc3luMV9zIGNuNTB4eDsKKwlzdHJ1Y3QgY3ZteF9sMmRfZnN5bjFfcyBjbjUyeHg7CisJc3RydWN0IGN2bXhfbDJkX2ZzeW4xX3MgY241Mnh4cDE7CisJc3RydWN0IGN2bXhfbDJkX2ZzeW4xX3MgY241Nnh4OworCXN0cnVjdCBjdm14X2wyZF9mc3luMV9zIGNuNTZ4eHAxOworCXN0cnVjdCBjdm14X2wyZF9mc3luMV9zIGNuNTh4eDsKKwlzdHJ1Y3QgY3ZteF9sMmRfZnN5bjFfcyBjbjU4eHhwMTsKK307CisKK3VuaW9uIGN2bXhfbDJkX2Z1czAgeworCXVpbnQ2NF90IHU2NDsKKwlzdHJ1Y3QgY3ZteF9sMmRfZnVzMF9zIHsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfMzRfNjM6MzA7CisJCXVpbnQ2NF90IHEwZnVzOjM0OworCX0gczsKKwlzdHJ1Y3QgY3ZteF9sMmRfZnVzMF9zIGNuMzB4eDsKKwlzdHJ1Y3QgY3ZteF9sMmRfZnVzMF9zIGNuMzF4eDsKKwlzdHJ1Y3QgY3ZteF9sMmRfZnVzMF9zIGNuMzh4eDsKKwlzdHJ1Y3QgY3ZteF9sMmRfZnVzMF9zIGNuMzh4eHAyOworCXN0cnVjdCBjdm14X2wyZF9mdXMwX3MgY241MHh4OworCXN0cnVjdCBjdm14X2wyZF9mdXMwX3MgY241Mnh4OworCXN0cnVjdCBjdm14X2wyZF9mdXMwX3MgY241Mnh4cDE7CisJc3RydWN0IGN2bXhfbDJkX2Z1czBfcyBjbjU2eHg7CisJc3RydWN0IGN2bXhfbDJkX2Z1czBfcyBjbjU2eHhwMTsKKwlzdHJ1Y3QgY3ZteF9sMmRfZnVzMF9zIGNuNTh4eDsKKwlzdHJ1Y3QgY3ZteF9sMmRfZnVzMF9zIGNuNTh4eHAxOworfTsKKwordW5pb24gY3ZteF9sMmRfZnVzMSB7CisJdWludDY0X3QgdTY0OworCXN0cnVjdCBjdm14X2wyZF9mdXMxX3MgeworCQl1aW50NjRfdCByZXNlcnZlZF8zNF82MzozMDsKKwkJdWludDY0X3QgcTFmdXM6MzQ7CisJfSBzOworCXN0cnVjdCBjdm14X2wyZF9mdXMxX3MgY24zMHh4OworCXN0cnVjdCBjdm14X2wyZF9mdXMxX3MgY24zMXh4OworCXN0cnVjdCBjdm14X2wyZF9mdXMxX3MgY24zOHh4OworCXN0cnVjdCBjdm14X2wyZF9mdXMxX3MgY24zOHh4cDI7CisJc3RydWN0IGN2bXhfbDJkX2Z1czFfcyBjbjUweHg7CisJc3RydWN0IGN2bXhfbDJkX2Z1czFfcyBjbjUyeHg7CisJc3RydWN0IGN2bXhfbDJkX2Z1czFfcyBjbjUyeHhwMTsKKwlzdHJ1Y3QgY3ZteF9sMmRfZnVzMV9zIGNuNTZ4eDsKKwlzdHJ1Y3QgY3ZteF9sMmRfZnVzMV9zIGNuNTZ4eHAxOworCXN0cnVjdCBjdm14X2wyZF9mdXMxX3MgY241OHh4OworCXN0cnVjdCBjdm14X2wyZF9mdXMxX3MgY241OHh4cDE7Cit9OworCit1bmlvbiBjdm14X2wyZF9mdXMyIHsKKwl1aW50NjRfdCB1NjQ7CisJc3RydWN0IGN2bXhfbDJkX2Z1czJfcyB7CisJCXVpbnQ2NF90IHJlc2VydmVkXzM0XzYzOjMwOworCQl1aW50NjRfdCBxMmZ1czozNDsKKwl9IHM7CisJc3RydWN0IGN2bXhfbDJkX2Z1czJfcyBjbjMweHg7CisJc3RydWN0IGN2bXhfbDJkX2Z1czJfcyBjbjMxeHg7CisJc3RydWN0IGN2bXhfbDJkX2Z1czJfcyBjbjM4eHg7CisJc3RydWN0IGN2bXhfbDJkX2Z1czJfcyBjbjM4eHhwMjsKKwlzdHJ1Y3QgY3ZteF9sMmRfZnVzMl9zIGNuNTB4eDsKKwlzdHJ1Y3QgY3ZteF9sMmRfZnVzMl9zIGNuNTJ4eDsKKwlzdHJ1Y3QgY3ZteF9sMmRfZnVzMl9zIGNuNTJ4eHAxOworCXN0cnVjdCBjdm14X2wyZF9mdXMyX3MgY241Nnh4OworCXN0cnVjdCBjdm14X2wyZF9mdXMyX3MgY241Nnh4cDE7CisJc3RydWN0IGN2bXhfbDJkX2Z1czJfcyBjbjU4eHg7CisJc3RydWN0IGN2bXhfbDJkX2Z1czJfcyBjbjU4eHhwMTsKK307CisKK3VuaW9uIGN2bXhfbDJkX2Z1czMgeworCXVpbnQ2NF90IHU2NDsKKwlzdHJ1Y3QgY3ZteF9sMmRfZnVzM19zIHsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfNDBfNjM6MjQ7CisJCXVpbnQ2NF90IGVtYV9jdGw6MzsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfMzRfMzY6MzsKKwkJdWludDY0X3QgcTNmdXM6MzQ7CisJfSBzOworCXN0cnVjdCBjdm14X2wyZF9mdXMzX2NuMzB4eCB7CisJCXVpbnQ2NF90IHJlc2VydmVkXzM1XzYzOjI5OworCQl1aW50NjRfdCBjcmlwXzY0azoxOworCQl1aW50NjRfdCBxM2Z1czozNDsKKwl9IGNuMzB4eDsKKwlzdHJ1Y3QgY3ZteF9sMmRfZnVzM19jbjMxeHggeworCQl1aW50NjRfdCByZXNlcnZlZF8zNV82MzoyOTsKKwkJdWludDY0X3QgY3JpcF8xMjhrOjE7CisJCXVpbnQ2NF90IHEzZnVzOjM0OworCX0gY24zMXh4OworCXN0cnVjdCBjdm14X2wyZF9mdXMzX2NuMzh4eCB7CisJCXVpbnQ2NF90IHJlc2VydmVkXzM2XzYzOjI4OworCQl1aW50NjRfdCBjcmlwXzI1Nms6MTsKKwkJdWludDY0X3QgY3JpcF81MTJrOjE7CisJCXVpbnQ2NF90IHEzZnVzOjM0OworCX0gY24zOHh4OworCXN0cnVjdCBjdm14X2wyZF9mdXMzX2NuMzh4eCBjbjM4eHhwMjsKKwlzdHJ1Y3QgY3ZteF9sMmRfZnVzM19jbjUweHggeworCQl1aW50NjRfdCByZXNlcnZlZF80MF82MzoyNDsKKwkJdWludDY0X3QgZW1hX2N0bDozOworCQl1aW50NjRfdCByZXNlcnZlZF8zNl8zNjoxOworCQl1aW50NjRfdCBjcmlwXzMyazoxOworCQl1aW50NjRfdCBjcmlwXzY0azoxOworCQl1aW50NjRfdCBxM2Z1czozNDsKKwl9IGNuNTB4eDsKKwlzdHJ1Y3QgY3ZteF9sMmRfZnVzM19jbjUyeHggeworCQl1aW50NjRfdCByZXNlcnZlZF80MF82MzoyNDsKKwkJdWludDY0X3QgZW1hX2N0bDozOworCQl1aW50NjRfdCByZXNlcnZlZF8zNl8zNjoxOworCQl1aW50NjRfdCBjcmlwXzEyOGs6MTsKKwkJdWludDY0X3QgY3JpcF8yNTZrOjE7CisJCXVpbnQ2NF90IHEzZnVzOjM0OworCX0gY241Mnh4OworCXN0cnVjdCBjdm14X2wyZF9mdXMzX2NuNTJ4eCBjbjUyeHhwMTsKKwlzdHJ1Y3QgY3ZteF9sMmRfZnVzM19jbjU2eHggeworCQl1aW50NjRfdCByZXNlcnZlZF80MF82MzoyNDsKKwkJdWludDY0X3QgZW1hX2N0bDozOworCQl1aW50NjRfdCByZXNlcnZlZF8zNl8zNjoxOworCQl1aW50NjRfdCBjcmlwXzUxMms6MTsKKwkJdWludDY0X3QgY3JpcF8xMDI0azoxOworCQl1aW50NjRfdCBxM2Z1czozNDsKKwl9IGNuNTZ4eDsKKwlzdHJ1Y3QgY3ZteF9sMmRfZnVzM19jbjU2eHggY241Nnh4cDE7CisJc3RydWN0IGN2bXhfbDJkX2Z1czNfY241OHh4IHsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfMzlfNjM6MjU7CisJCXVpbnQ2NF90IGVtYV9jdGw6MjsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfMzZfMzY6MTsKKwkJdWludDY0X3QgY3JpcF81MTJrOjE7CisJCXVpbnQ2NF90IGNyaXBfMTAyNGs6MTsKKwkJdWludDY0X3QgcTNmdXM6MzQ7CisJfSBjbjU4eHg7CisJc3RydWN0IGN2bXhfbDJkX2Z1czNfY241OHh4IGNuNTh4eHAxOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vb2N0ZW9uL2N2bXgtbDJ0LWRlZnMuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9vY3Rlb24vY3ZteC1sMnQtZGVmcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2MzlhM2YKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vb2N0ZW9uL2N2bXgtbDJ0LWRlZnMuaApAQCAtMCwwICsxLDE0MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqbGljZW5zZSBzdGFydCoqKioqKioqKioqKioqKgorICogQXV0aG9yOiBDYXZpdW0gTmV0d29ya3MKKyAqCisgKiBDb250YWN0OiBzdXBwb3J0QGNhdml1bW5ldHdvcmtzLmNvbQorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIE9DVEVPTiBTREsKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwOCBDYXZpdW0gTmV0d29ya3MKKyAqCisgKiBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgVmVyc2lvbiAyLCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogQVMtSVMgYW5kIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkKKyAqIG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgVElUTEUsIG9yCisgKiBOT05JTkZSSU5HRU1FTlQuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlCisgKiBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgZmlsZTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKiBvciB2aXNpdCBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLgorICoKKyAqIFRoaXMgZmlsZSBtYXkgYWxzbyBiZSBhdmFpbGFibGUgdW5kZXIgYSBkaWZmZXJlbnQgbGljZW5zZSBmcm9tIENhdml1bS4KKyAqIENvbnRhY3QgQ2F2aXVtIE5ldHdvcmtzIGZvciBtb3JlIGluZm9ybWF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKipsaWNlbnNlIGVuZCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9fQ1ZNWF9MMlRfREVGU19IX18KKyNkZWZpbmUgX19DVk1YX0wyVF9ERUZTX0hfXworCisjZGVmaW5lIENWTVhfTDJUX0VSUiBcCisJIENWTVhfQUREX0lPX1NFRygweDAwMDExODAwODAwMDAwMDh1bGwpCisKK3VuaW9uIGN2bXhfbDJ0X2VyciB7CisJdWludDY0X3QgdTY0OworCXN0cnVjdCBjdm14X2wydF9lcnJfcyB7CisJCXVpbnQ2NF90IHJlc2VydmVkXzI5XzYzOjM1OworCQl1aW50NjRfdCBmYWRydToxOworCQl1aW50NjRfdCBsY2tfaW50ZW5hMjoxOworCQl1aW50NjRfdCBsY2tlcnIyOjE7CisJCXVpbnQ2NF90IGxja19pbnRlbmE6MTsKKwkJdWludDY0X3QgbGNrZXJyOjE7CisJCXVpbnQ2NF90IGZzZXQ6MzsKKwkJdWludDY0X3QgZmFkcjoxMDsKKwkJdWludDY0X3QgZnN5bjo2OworCQl1aW50NjRfdCBkZWRfZXJyOjE7CisJCXVpbnQ2NF90IHNlY19lcnI6MTsKKwkJdWludDY0X3QgZGVkX2ludGVuYToxOworCQl1aW50NjRfdCBzZWNfaW50ZW5hOjE7CisJCXVpbnQ2NF90IGVjY19lbmE6MTsKKwl9IHM7CisJc3RydWN0IGN2bXhfbDJ0X2Vycl9jbjMweHggeworCQl1aW50NjRfdCByZXNlcnZlZF8yOF82MzozNjsKKwkJdWludDY0X3QgbGNrX2ludGVuYTI6MTsKKwkJdWludDY0X3QgbGNrZXJyMjoxOworCQl1aW50NjRfdCBsY2tfaW50ZW5hOjE7CisJCXVpbnQ2NF90IGxja2VycjoxOworCQl1aW50NjRfdCByZXNlcnZlZF8yM18yMzoxOworCQl1aW50NjRfdCBmc2V0OjI7CisJCXVpbnQ2NF90IHJlc2VydmVkXzE5XzIwOjI7CisJCXVpbnQ2NF90IGZhZHI6ODsKKwkJdWludDY0X3QgZnN5bjo2OworCQl1aW50NjRfdCBkZWRfZXJyOjE7CisJCXVpbnQ2NF90IHNlY19lcnI6MTsKKwkJdWludDY0X3QgZGVkX2ludGVuYToxOworCQl1aW50NjRfdCBzZWNfaW50ZW5hOjE7CisJCXVpbnQ2NF90IGVjY19lbmE6MTsKKwl9IGNuMzB4eDsKKwlzdHJ1Y3QgY3ZteF9sMnRfZXJyX2NuMzF4eCB7CisJCXVpbnQ2NF90IHJlc2VydmVkXzI4XzYzOjM2OworCQl1aW50NjRfdCBsY2tfaW50ZW5hMjoxOworCQl1aW50NjRfdCBsY2tlcnIyOjE7CisJCXVpbnQ2NF90IGxja19pbnRlbmE6MTsKKwkJdWludDY0X3QgbGNrZXJyOjE7CisJCXVpbnQ2NF90IHJlc2VydmVkXzIzXzIzOjE7CisJCXVpbnQ2NF90IGZzZXQ6MjsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfMjBfMjA6MTsKKwkJdWludDY0X3QgZmFkcjo5OworCQl1aW50NjRfdCBmc3luOjY7CisJCXVpbnQ2NF90IGRlZF9lcnI6MTsKKwkJdWludDY0X3Qgc2VjX2VycjoxOworCQl1aW50NjRfdCBkZWRfaW50ZW5hOjE7CisJCXVpbnQ2NF90IHNlY19pbnRlbmE6MTsKKwkJdWludDY0X3QgZWNjX2VuYToxOworCX0gY24zMXh4OworCXN0cnVjdCBjdm14X2wydF9lcnJfY24zOHh4IHsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfMjhfNjM6MzY7CisJCXVpbnQ2NF90IGxja19pbnRlbmEyOjE7CisJCXVpbnQ2NF90IGxja2VycjI6MTsKKwkJdWludDY0X3QgbGNrX2ludGVuYToxOworCQl1aW50NjRfdCBsY2tlcnI6MTsKKwkJdWludDY0X3QgZnNldDozOworCQl1aW50NjRfdCBmYWRyOjEwOworCQl1aW50NjRfdCBmc3luOjY7CisJCXVpbnQ2NF90IGRlZF9lcnI6MTsKKwkJdWludDY0X3Qgc2VjX2VycjoxOworCQl1aW50NjRfdCBkZWRfaW50ZW5hOjE7CisJCXVpbnQ2NF90IHNlY19pbnRlbmE6MTsKKwkJdWludDY0X3QgZWNjX2VuYToxOworCX0gY24zOHh4OworCXN0cnVjdCBjdm14X2wydF9lcnJfY24zOHh4IGNuMzh4eHAyOworCXN0cnVjdCBjdm14X2wydF9lcnJfY241MHh4IHsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfMjhfNjM6MzY7CisJCXVpbnQ2NF90IGxja19pbnRlbmEyOjE7CisJCXVpbnQ2NF90IGxja2VycjI6MTsKKwkJdWludDY0X3QgbGNrX2ludGVuYToxOworCQl1aW50NjRfdCBsY2tlcnI6MTsKKwkJdWludDY0X3QgZnNldDozOworCQl1aW50NjRfdCByZXNlcnZlZF8xOF8yMDozOworCQl1aW50NjRfdCBmYWRyOjc7CisJCXVpbnQ2NF90IGZzeW46NjsKKwkJdWludDY0X3QgZGVkX2VycjoxOworCQl1aW50NjRfdCBzZWNfZXJyOjE7CisJCXVpbnQ2NF90IGRlZF9pbnRlbmE6MTsKKwkJdWludDY0X3Qgc2VjX2ludGVuYToxOworCQl1aW50NjRfdCBlY2NfZW5hOjE7CisJfSBjbjUweHg7CisJc3RydWN0IGN2bXhfbDJ0X2Vycl9jbjUyeHggeworCQl1aW50NjRfdCByZXNlcnZlZF8yOF82MzozNjsKKwkJdWludDY0X3QgbGNrX2ludGVuYTI6MTsKKwkJdWludDY0X3QgbGNrZXJyMjoxOworCQl1aW50NjRfdCBsY2tfaW50ZW5hOjE7CisJCXVpbnQ2NF90IGxja2VycjoxOworCQl1aW50NjRfdCBmc2V0OjM7CisJCXVpbnQ2NF90IHJlc2VydmVkXzIwXzIwOjE7CisJCXVpbnQ2NF90IGZhZHI6OTsKKwkJdWludDY0X3QgZnN5bjo2OworCQl1aW50NjRfdCBkZWRfZXJyOjE7CisJCXVpbnQ2NF90IHNlY19lcnI6MTsKKwkJdWludDY0X3QgZGVkX2ludGVuYToxOworCQl1aW50NjRfdCBzZWNfaW50ZW5hOjE7CisJCXVpbnQ2NF90IGVjY19lbmE6MTsKKwl9IGNuNTJ4eDsKKwlzdHJ1Y3QgY3ZteF9sMnRfZXJyX2NuNTJ4eCBjbjUyeHhwMTsKKwlzdHJ1Y3QgY3ZteF9sMnRfZXJyX3MgY241Nnh4OworCXN0cnVjdCBjdm14X2wydF9lcnJfcyBjbjU2eHhwMTsKKwlzdHJ1Y3QgY3ZteF9sMnRfZXJyX3MgY241OHh4OworCXN0cnVjdCBjdm14X2wydF9lcnJfcyBjbjU4eHhwMTsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL29jdGVvbi9jdm14LWxlZC1kZWZzLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vb2N0ZW9uL2N2bXgtbGVkLWRlZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNmYxNzRhCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL29jdGVvbi9jdm14LWxlZC1kZWZzLmgKQEAgLTAsMCArMSwyNDAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKmxpY2Vuc2Ugc3RhcnQqKioqKioqKioqKioqKioKKyAqIEF1dGhvcjogQ2F2aXVtIE5ldHdvcmtzCisgKgorICogQ29udGFjdDogc3VwcG9ydEBjYXZpdW1uZXR3b3Jrcy5jb20KKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBPQ1RFT04gU0RLCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMDggQ2F2aXVtIE5ldHdvcmtzCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIFZlcnNpb24gMiwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIEFTLUlTIGFuZCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5CisgKiBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIFRJVExFLCBvcgorICogTk9OSU5GUklOR0VNRU5ULiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZQorICogZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIGZpbGU7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICogb3IgdmlzaXQgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4KKyAqCisgKiBUaGlzIGZpbGUgbWF5IGFsc28gYmUgYXZhaWxhYmxlIHVuZGVyIGEgZGlmZmVyZW50IGxpY2Vuc2UgZnJvbSBDYXZpdW0uCisgKiBDb250YWN0IENhdml1bSBOZXR3b3JrcyBmb3IgbW9yZSBpbmZvcm1hdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqbGljZW5zZSBlbmQqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfX0NWTVhfTEVEX0RFRlNfSF9fCisjZGVmaW5lIF9fQ1ZNWF9MRURfREVGU19IX18KKworI2RlZmluZSBDVk1YX0xFRF9CTElOSyBcCisJIENWTVhfQUREX0lPX1NFRygweDAwMDExODAwMDAwMDFBNDh1bGwpCisjZGVmaW5lIENWTVhfTEVEX0NMS19QSEFTRSBcCisJIENWTVhfQUREX0lPX1NFRygweDAwMDExODAwMDAwMDFBMDh1bGwpCisjZGVmaW5lIENWTVhfTEVEX0NZTE9OIFwKKwkgQ1ZNWF9BRERfSU9fU0VHKDB4MDAwMTE4MDAwMDAwMUFGOHVsbCkKKyNkZWZpbmUgQ1ZNWF9MRURfREJHIFwKKwkgQ1ZNWF9BRERfSU9fU0VHKDB4MDAwMTE4MDAwMDAwMUExOHVsbCkKKyNkZWZpbmUgQ1ZNWF9MRURfRU4gXAorCSBDVk1YX0FERF9JT19TRUcoMHgwMDAxMTgwMDAwMDAxQTAwdWxsKQorI2RlZmluZSBDVk1YX0xFRF9QT0xBUklUWSBcCisJIENWTVhfQUREX0lPX1NFRygweDAwMDExODAwMDAwMDFBNTB1bGwpCisjZGVmaW5lIENWTVhfTEVEX1BSVCBcCisJIENWTVhfQUREX0lPX1NFRygweDAwMDExODAwMDAwMDFBMTB1bGwpCisjZGVmaW5lIENWTVhfTEVEX1BSVF9GTVQgXAorCSBDVk1YX0FERF9JT19TRUcoMHgwMDAxMTgwMDAwMDAxQTMwdWxsKQorI2RlZmluZSBDVk1YX0xFRF9QUlRfU1RBVFVTWChvZmZzZXQpIFwKKwkgQ1ZNWF9BRERfSU9fU0VHKDB4MDAwMTE4MDAwMDAwMUE4MHVsbCArICgoKG9mZnNldCkgJiA3KSAqIDgpKQorI2RlZmluZSBDVk1YX0xFRF9VRERfQ05UWChvZmZzZXQpIFwKKwkgQ1ZNWF9BRERfSU9fU0VHKDB4MDAwMTE4MDAwMDAwMUEyMHVsbCArICgoKG9mZnNldCkgJiAxKSAqIDgpKQorI2RlZmluZSBDVk1YX0xFRF9VRERfREFUWChvZmZzZXQpIFwKKwkgQ1ZNWF9BRERfSU9fU0VHKDB4MDAwMTE4MDAwMDAwMUEzOHVsbCArICgoKG9mZnNldCkgJiAxKSAqIDgpKQorI2RlZmluZSBDVk1YX0xFRF9VRERfREFUX0NMUlgob2Zmc2V0KSBcCisJIENWTVhfQUREX0lPX1NFRygweDAwMDExODAwMDAwMDFBQzh1bGwgKyAoKChvZmZzZXQpICYgMSkgKiAxNikpCisjZGVmaW5lIENWTVhfTEVEX1VERF9EQVRfU0VUWChvZmZzZXQpIFwKKwkgQ1ZNWF9BRERfSU9fU0VHKDB4MDAwMTE4MDAwMDAwMUFDMHVsbCArICgoKG9mZnNldCkgJiAxKSAqIDE2KSkKKwordW5pb24gY3ZteF9sZWRfYmxpbmsgeworCXVpbnQ2NF90IHU2NDsKKwlzdHJ1Y3QgY3ZteF9sZWRfYmxpbmtfcyB7CisJCXVpbnQ2NF90IHJlc2VydmVkXzhfNjM6NTY7CisJCXVpbnQ2NF90IHJhdGU6ODsKKwl9IHM7CisJc3RydWN0IGN2bXhfbGVkX2JsaW5rX3MgY24zOHh4OworCXN0cnVjdCBjdm14X2xlZF9ibGlua19zIGNuMzh4eHAyOworCXN0cnVjdCBjdm14X2xlZF9ibGlua19zIGNuNTZ4eDsKKwlzdHJ1Y3QgY3ZteF9sZWRfYmxpbmtfcyBjbjU2eHhwMTsKKwlzdHJ1Y3QgY3ZteF9sZWRfYmxpbmtfcyBjbjU4eHg7CisJc3RydWN0IGN2bXhfbGVkX2JsaW5rX3MgY241OHh4cDE7Cit9OworCit1bmlvbiBjdm14X2xlZF9jbGtfcGhhc2UgeworCXVpbnQ2NF90IHU2NDsKKwlzdHJ1Y3QgY3ZteF9sZWRfY2xrX3BoYXNlX3MgeworCQl1aW50NjRfdCByZXNlcnZlZF83XzYzOjU3OworCQl1aW50NjRfdCBwaGFzZTo3OworCX0gczsKKwlzdHJ1Y3QgY3ZteF9sZWRfY2xrX3BoYXNlX3MgY24zOHh4OworCXN0cnVjdCBjdm14X2xlZF9jbGtfcGhhc2VfcyBjbjM4eHhwMjsKKwlzdHJ1Y3QgY3ZteF9sZWRfY2xrX3BoYXNlX3MgY241Nnh4OworCXN0cnVjdCBjdm14X2xlZF9jbGtfcGhhc2VfcyBjbjU2eHhwMTsKKwlzdHJ1Y3QgY3ZteF9sZWRfY2xrX3BoYXNlX3MgY241OHh4OworCXN0cnVjdCBjdm14X2xlZF9jbGtfcGhhc2VfcyBjbjU4eHhwMTsKK307CisKK3VuaW9uIGN2bXhfbGVkX2N5bG9uIHsKKwl1aW50NjRfdCB1NjQ7CisJc3RydWN0IGN2bXhfbGVkX2N5bG9uX3MgeworCQl1aW50NjRfdCByZXNlcnZlZF8xNl82Mzo0ODsKKwkJdWludDY0X3QgcmF0ZToxNjsKKwl9IHM7CisJc3RydWN0IGN2bXhfbGVkX2N5bG9uX3MgY24zOHh4OworCXN0cnVjdCBjdm14X2xlZF9jeWxvbl9zIGNuMzh4eHAyOworCXN0cnVjdCBjdm14X2xlZF9jeWxvbl9zIGNuNTZ4eDsKKwlzdHJ1Y3QgY3ZteF9sZWRfY3lsb25fcyBjbjU2eHhwMTsKKwlzdHJ1Y3QgY3ZteF9sZWRfY3lsb25fcyBjbjU4eHg7CisJc3RydWN0IGN2bXhfbGVkX2N5bG9uX3MgY241OHh4cDE7Cit9OworCit1bmlvbiBjdm14X2xlZF9kYmcgeworCXVpbnQ2NF90IHU2NDsKKwlzdHJ1Y3QgY3ZteF9sZWRfZGJnX3MgeworCQl1aW50NjRfdCByZXNlcnZlZF8xXzYzOjYzOworCQl1aW50NjRfdCBkYmdfZW46MTsKKwl9IHM7CisJc3RydWN0IGN2bXhfbGVkX2RiZ19zIGNuMzh4eDsKKwlzdHJ1Y3QgY3ZteF9sZWRfZGJnX3MgY24zOHh4cDI7CisJc3RydWN0IGN2bXhfbGVkX2RiZ19zIGNuNTZ4eDsKKwlzdHJ1Y3QgY3ZteF9sZWRfZGJnX3MgY241Nnh4cDE7CisJc3RydWN0IGN2bXhfbGVkX2RiZ19zIGNuNTh4eDsKKwlzdHJ1Y3QgY3ZteF9sZWRfZGJnX3MgY241OHh4cDE7Cit9OworCit1bmlvbiBjdm14X2xlZF9lbiB7CisJdWludDY0X3QgdTY0OworCXN0cnVjdCBjdm14X2xlZF9lbl9zIHsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfMV82Mzo2MzsKKwkJdWludDY0X3QgZW46MTsKKwl9IHM7CisJc3RydWN0IGN2bXhfbGVkX2VuX3MgY24zOHh4OworCXN0cnVjdCBjdm14X2xlZF9lbl9zIGNuMzh4eHAyOworCXN0cnVjdCBjdm14X2xlZF9lbl9zIGNuNTZ4eDsKKwlzdHJ1Y3QgY3ZteF9sZWRfZW5fcyBjbjU2eHhwMTsKKwlzdHJ1Y3QgY3ZteF9sZWRfZW5fcyBjbjU4eHg7CisJc3RydWN0IGN2bXhfbGVkX2VuX3MgY241OHh4cDE7Cit9OworCit1bmlvbiBjdm14X2xlZF9wb2xhcml0eSB7CisJdWludDY0X3QgdTY0OworCXN0cnVjdCBjdm14X2xlZF9wb2xhcml0eV9zIHsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfMV82Mzo2MzsKKwkJdWludDY0X3QgcG9sYXJpdHk6MTsKKwl9IHM7CisJc3RydWN0IGN2bXhfbGVkX3BvbGFyaXR5X3MgY24zOHh4OworCXN0cnVjdCBjdm14X2xlZF9wb2xhcml0eV9zIGNuMzh4eHAyOworCXN0cnVjdCBjdm14X2xlZF9wb2xhcml0eV9zIGNuNTZ4eDsKKwlzdHJ1Y3QgY3ZteF9sZWRfcG9sYXJpdHlfcyBjbjU2eHhwMTsKKwlzdHJ1Y3QgY3ZteF9sZWRfcG9sYXJpdHlfcyBjbjU4eHg7CisJc3RydWN0IGN2bXhfbGVkX3BvbGFyaXR5X3MgY241OHh4cDE7Cit9OworCit1bmlvbiBjdm14X2xlZF9wcnQgeworCXVpbnQ2NF90IHU2NDsKKwlzdHJ1Y3QgY3ZteF9sZWRfcHJ0X3MgeworCQl1aW50NjRfdCByZXNlcnZlZF84XzYzOjU2OworCQl1aW50NjRfdCBwcnRfZW46ODsKKwl9IHM7CisJc3RydWN0IGN2bXhfbGVkX3BydF9zIGNuMzh4eDsKKwlzdHJ1Y3QgY3ZteF9sZWRfcHJ0X3MgY24zOHh4cDI7CisJc3RydWN0IGN2bXhfbGVkX3BydF9zIGNuNTZ4eDsKKwlzdHJ1Y3QgY3ZteF9sZWRfcHJ0X3MgY241Nnh4cDE7CisJc3RydWN0IGN2bXhfbGVkX3BydF9zIGNuNTh4eDsKKwlzdHJ1Y3QgY3ZteF9sZWRfcHJ0X3MgY241OHh4cDE7Cit9OworCit1bmlvbiBjdm14X2xlZF9wcnRfZm10IHsKKwl1aW50NjRfdCB1NjQ7CisJc3RydWN0IGN2bXhfbGVkX3BydF9mbXRfcyB7CisJCXVpbnQ2NF90IHJlc2VydmVkXzRfNjM6NjA7CisJCXVpbnQ2NF90IGZvcm1hdDo0OworCX0gczsKKwlzdHJ1Y3QgY3ZteF9sZWRfcHJ0X2ZtdF9zIGNuMzh4eDsKKwlzdHJ1Y3QgY3ZteF9sZWRfcHJ0X2ZtdF9zIGNuMzh4eHAyOworCXN0cnVjdCBjdm14X2xlZF9wcnRfZm10X3MgY241Nnh4OworCXN0cnVjdCBjdm14X2xlZF9wcnRfZm10X3MgY241Nnh4cDE7CisJc3RydWN0IGN2bXhfbGVkX3BydF9mbXRfcyBjbjU4eHg7CisJc3RydWN0IGN2bXhfbGVkX3BydF9mbXRfcyBjbjU4eHhwMTsKK307CisKK3VuaW9uIGN2bXhfbGVkX3BydF9zdGF0dXN4IHsKKwl1aW50NjRfdCB1NjQ7CisJc3RydWN0IGN2bXhfbGVkX3BydF9zdGF0dXN4X3MgeworCQl1aW50NjRfdCByZXNlcnZlZF82XzYzOjU4OworCQl1aW50NjRfdCBzdGF0dXM6NjsKKwl9IHM7CisJc3RydWN0IGN2bXhfbGVkX3BydF9zdGF0dXN4X3MgY24zOHh4OworCXN0cnVjdCBjdm14X2xlZF9wcnRfc3RhdHVzeF9zIGNuMzh4eHAyOworCXN0cnVjdCBjdm14X2xlZF9wcnRfc3RhdHVzeF9zIGNuNTZ4eDsKKwlzdHJ1Y3QgY3ZteF9sZWRfcHJ0X3N0YXR1c3hfcyBjbjU2eHhwMTsKKwlzdHJ1Y3QgY3ZteF9sZWRfcHJ0X3N0YXR1c3hfcyBjbjU4eHg7CisJc3RydWN0IGN2bXhfbGVkX3BydF9zdGF0dXN4X3MgY241OHh4cDE7Cit9OworCit1bmlvbiBjdm14X2xlZF91ZGRfY250eCB7CisJdWludDY0X3QgdTY0OworCXN0cnVjdCBjdm14X2xlZF91ZGRfY250eF9zIHsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfNl82Mzo1ODsKKwkJdWludDY0X3QgY250OjY7CisJfSBzOworCXN0cnVjdCBjdm14X2xlZF91ZGRfY250eF9zIGNuMzh4eDsKKwlzdHJ1Y3QgY3ZteF9sZWRfdWRkX2NudHhfcyBjbjM4eHhwMjsKKwlzdHJ1Y3QgY3ZteF9sZWRfdWRkX2NudHhfcyBjbjU2eHg7CisJc3RydWN0IGN2bXhfbGVkX3VkZF9jbnR4X3MgY241Nnh4cDE7CisJc3RydWN0IGN2bXhfbGVkX3VkZF9jbnR4X3MgY241OHh4OworCXN0cnVjdCBjdm14X2xlZF91ZGRfY250eF9zIGNuNTh4eHAxOworfTsKKwordW5pb24gY3ZteF9sZWRfdWRkX2RhdHggeworCXVpbnQ2NF90IHU2NDsKKwlzdHJ1Y3QgY3ZteF9sZWRfdWRkX2RhdHhfcyB7CisJCXVpbnQ2NF90IHJlc2VydmVkXzMyXzYzOjMyOworCQl1aW50NjRfdCBkYXQ6MzI7CisJfSBzOworCXN0cnVjdCBjdm14X2xlZF91ZGRfZGF0eF9zIGNuMzh4eDsKKwlzdHJ1Y3QgY3ZteF9sZWRfdWRkX2RhdHhfcyBjbjM4eHhwMjsKKwlzdHJ1Y3QgY3ZteF9sZWRfdWRkX2RhdHhfcyBjbjU2eHg7CisJc3RydWN0IGN2bXhfbGVkX3VkZF9kYXR4X3MgY241Nnh4cDE7CisJc3RydWN0IGN2bXhfbGVkX3VkZF9kYXR4X3MgY241OHh4OworCXN0cnVjdCBjdm14X2xlZF91ZGRfZGF0eF9zIGNuNTh4eHAxOworfTsKKwordW5pb24gY3ZteF9sZWRfdWRkX2RhdF9jbHJ4IHsKKwl1aW50NjRfdCB1NjQ7CisJc3RydWN0IGN2bXhfbGVkX3VkZF9kYXRfY2xyeF9zIHsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfMzJfNjM6MzI7CisJCXVpbnQ2NF90IGNscjozMjsKKwl9IHM7CisJc3RydWN0IGN2bXhfbGVkX3VkZF9kYXRfY2xyeF9zIGNuMzh4eDsKKwlzdHJ1Y3QgY3ZteF9sZWRfdWRkX2RhdF9jbHJ4X3MgY24zOHh4cDI7CisJc3RydWN0IGN2bXhfbGVkX3VkZF9kYXRfY2xyeF9zIGNuNTZ4eDsKKwlzdHJ1Y3QgY3ZteF9sZWRfdWRkX2RhdF9jbHJ4X3MgY241Nnh4cDE7CisJc3RydWN0IGN2bXhfbGVkX3VkZF9kYXRfY2xyeF9zIGNuNTh4eDsKKwlzdHJ1Y3QgY3ZteF9sZWRfdWRkX2RhdF9jbHJ4X3MgY241OHh4cDE7Cit9OworCit1bmlvbiBjdm14X2xlZF91ZGRfZGF0X3NldHggeworCXVpbnQ2NF90IHU2NDsKKwlzdHJ1Y3QgY3ZteF9sZWRfdWRkX2RhdF9zZXR4X3MgeworCQl1aW50NjRfdCByZXNlcnZlZF8zMl82MzozMjsKKwkJdWludDY0X3Qgc2V0OjMyOworCX0gczsKKwlzdHJ1Y3QgY3ZteF9sZWRfdWRkX2RhdF9zZXR4X3MgY24zOHh4OworCXN0cnVjdCBjdm14X2xlZF91ZGRfZGF0X3NldHhfcyBjbjM4eHhwMjsKKwlzdHJ1Y3QgY3ZteF9sZWRfdWRkX2RhdF9zZXR4X3MgY241Nnh4OworCXN0cnVjdCBjdm14X2xlZF91ZGRfZGF0X3NldHhfcyBjbjU2eHhwMTsKKwlzdHJ1Y3QgY3ZteF9sZWRfdWRkX2RhdF9zZXR4X3MgY241OHh4OworCXN0cnVjdCBjdm14X2xlZF91ZGRfZGF0X3NldHhfcyBjbjU4eHhwMTsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL29jdGVvbi9jdm14LW1pby1kZWZzLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vb2N0ZW9uL2N2bXgtbWlvLWRlZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTU1ZjA1Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL29jdGVvbi9jdm14LW1pby1kZWZzLmgKQEAgLTAsMCArMSwyMDA0IEBACisvKioqKioqKioqKioqKioqKioqKioqKipsaWNlbnNlIHN0YXJ0KioqKioqKioqKioqKioqCisgKiBBdXRob3I6IENhdml1bSBOZXR3b3JrcworICoKKyAqIENvbnRhY3Q6IHN1cHBvcnRAY2F2aXVtbmV0d29ya3MuY29tCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgT0NURU9OIFNESworICoKKyAqIENvcHlyaWdodCAoYykgMjAwMy0yMDA4IENhdml1bSBOZXR3b3JrcworICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBWZXJzaW9uIDIsIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBBUy1JUyBhbmQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eQorICogb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBUSVRMRSwgb3IKKyAqIE5PTklORlJJTkdFTUVOVC4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUKKyAqIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBmaWxlOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqIG9yIHZpc2l0IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uCisgKgorICogVGhpcyBmaWxlIG1heSBhbHNvIGJlIGF2YWlsYWJsZSB1bmRlciBhIGRpZmZlcmVudCBsaWNlbnNlIGZyb20gQ2F2aXVtLgorICogQ29udGFjdCBDYXZpdW0gTmV0d29ya3MgZm9yIG1vcmUgaW5mb3JtYXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKmxpY2Vuc2UgZW5kKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX19DVk1YX01JT19ERUZTX0hfXworI2RlZmluZSBfX0NWTVhfTUlPX0RFRlNfSF9fCisKKyNkZWZpbmUgQ1ZNWF9NSU9fQk9PVF9CSVNUX1NUQVQgXAorCSBDVk1YX0FERF9JT19TRUcoMHgwMDAxMTgwMDAwMDAwMEY4dWxsKQorI2RlZmluZSBDVk1YX01JT19CT09UX0NPTVAgXAorCSBDVk1YX0FERF9JT19TRUcoMHgwMDAxMTgwMDAwMDAwMEI4dWxsKQorI2RlZmluZSBDVk1YX01JT19CT09UX0RNQV9DRkdYKG9mZnNldCkgXAorCSBDVk1YX0FERF9JT19TRUcoMHgwMDAxMTgwMDAwMDAwMTAwdWxsICsgKCgob2Zmc2V0KSAmIDMpICogOCkpCisjZGVmaW5lIENWTVhfTUlPX0JPT1RfRE1BX0lOVFgob2Zmc2V0KSBcCisJIENWTVhfQUREX0lPX1NFRygweDAwMDExODAwMDAwMDAxMzh1bGwgKyAoKChvZmZzZXQpICYgMykgKiA4KSkKKyNkZWZpbmUgQ1ZNWF9NSU9fQk9PVF9ETUFfSU5UX0VOWChvZmZzZXQpIFwKKwkgQ1ZNWF9BRERfSU9fU0VHKDB4MDAwMTE4MDAwMDAwMDE1MHVsbCArICgoKG9mZnNldCkgJiAzKSAqIDgpKQorI2RlZmluZSBDVk1YX01JT19CT09UX0RNQV9USU1YKG9mZnNldCkgXAorCSBDVk1YX0FERF9JT19TRUcoMHgwMDAxMTgwMDAwMDAwMTIwdWxsICsgKCgob2Zmc2V0KSAmIDMpICogOCkpCisjZGVmaW5lIENWTVhfTUlPX0JPT1RfRVJSIFwKKwkgQ1ZNWF9BRERfSU9fU0VHKDB4MDAwMTE4MDAwMDAwMDBBMHVsbCkKKyNkZWZpbmUgQ1ZNWF9NSU9fQk9PVF9JTlQgXAorCSBDVk1YX0FERF9JT19TRUcoMHgwMDAxMTgwMDAwMDAwMEE4dWxsKQorI2RlZmluZSBDVk1YX01JT19CT09UX0xPQ19BRFIgXAorCSBDVk1YX0FERF9JT19TRUcoMHgwMDAxMTgwMDAwMDAwMDkwdWxsKQorI2RlZmluZSBDVk1YX01JT19CT09UX0xPQ19DRkdYKG9mZnNldCkgXAorCSBDVk1YX0FERF9JT19TRUcoMHgwMDAxMTgwMDAwMDAwMDgwdWxsICsgKCgob2Zmc2V0KSAmIDEpICogOCkpCisjZGVmaW5lIENWTVhfTUlPX0JPT1RfTE9DX0RBVCBcCisJIENWTVhfQUREX0lPX1NFRygweDAwMDExODAwMDAwMDAwOTh1bGwpCisjZGVmaW5lIENWTVhfTUlPX0JPT1RfUElOX0RFRlMgXAorCSBDVk1YX0FERF9JT19TRUcoMHgwMDAxMTgwMDAwMDAwMEMwdWxsKQorI2RlZmluZSBDVk1YX01JT19CT09UX1JFR19DRkdYKG9mZnNldCkgXAorCSBDVk1YX0FERF9JT19TRUcoMHgwMDAxMTgwMDAwMDAwMDAwdWxsICsgKCgob2Zmc2V0KSAmIDcpICogOCkpCisjZGVmaW5lIENWTVhfTUlPX0JPT1RfUkVHX1RJTVgob2Zmc2V0KSBcCisJIENWTVhfQUREX0lPX1NFRygweDAwMDExODAwMDAwMDAwNDB1bGwgKyAoKChvZmZzZXQpICYgNykgKiA4KSkKKyNkZWZpbmUgQ1ZNWF9NSU9fQk9PVF9USFIgXAorCSBDVk1YX0FERF9JT19TRUcoMHgwMDAxMTgwMDAwMDAwMEIwdWxsKQorI2RlZmluZSBDVk1YX01JT19GVVNfQk5LX0RBVFgob2Zmc2V0KSBcCisJIENWTVhfQUREX0lPX1NFRygweDAwMDExODAwMDAwMDE1MjB1bGwgKyAoKChvZmZzZXQpICYgMykgKiA4KSkKKyNkZWZpbmUgQ1ZNWF9NSU9fRlVTX0RBVDAgXAorCSBDVk1YX0FERF9JT19TRUcoMHgwMDAxMTgwMDAwMDAxNDAwdWxsKQorI2RlZmluZSBDVk1YX01JT19GVVNfREFUMSBcCisJIENWTVhfQUREX0lPX1NFRygweDAwMDExODAwMDAwMDE0MDh1bGwpCisjZGVmaW5lIENWTVhfTUlPX0ZVU19EQVQyIFwKKwkgQ1ZNWF9BRERfSU9fU0VHKDB4MDAwMTE4MDAwMDAwMTQxMHVsbCkKKyNkZWZpbmUgQ1ZNWF9NSU9fRlVTX0RBVDMgXAorCSBDVk1YX0FERF9JT19TRUcoMHgwMDAxMTgwMDAwMDAxNDE4dWxsKQorI2RlZmluZSBDVk1YX01JT19GVVNfRU1BIFwKKwkgQ1ZNWF9BRERfSU9fU0VHKDB4MDAwMTE4MDAwMDAwMTU1MHVsbCkKKyNkZWZpbmUgQ1ZNWF9NSU9fRlVTX1BERiBcCisJIENWTVhfQUREX0lPX1NFRygweDAwMDExODAwMDAwMDE0MjB1bGwpCisjZGVmaW5lIENWTVhfTUlPX0ZVU19QTEwgXAorCSBDVk1YX0FERF9JT19TRUcoMHgwMDAxMTgwMDAwMDAxNTgwdWxsKQorI2RlZmluZSBDVk1YX01JT19GVVNfUFJPRyBcCisJIENWTVhfQUREX0lPX1NFRygweDAwMDExODAwMDAwMDE1MTB1bGwpCisjZGVmaW5lIENWTVhfTUlPX0ZVU19QUk9HX1RJTUVTIFwKKwkgQ1ZNWF9BRERfSU9fU0VHKDB4MDAwMTE4MDAwMDAwMTUxOHVsbCkKKyNkZWZpbmUgQ1ZNWF9NSU9fRlVTX1JDTUQgXAorCSBDVk1YX0FERF9JT19TRUcoMHgwMDAxMTgwMDAwMDAxNTAwdWxsKQorI2RlZmluZSBDVk1YX01JT19GVVNfU1BSX1JFUEFJUl9SRVMgXAorCSBDVk1YX0FERF9JT19TRUcoMHgwMDAxMTgwMDAwMDAxNTQ4dWxsKQorI2RlZmluZSBDVk1YX01JT19GVVNfU1BSX1JFUEFJUl9TVU0gXAorCSBDVk1YX0FERF9JT19TRUcoMHgwMDAxMTgwMDAwMDAxNTQwdWxsKQorI2RlZmluZSBDVk1YX01JT19GVVNfVU5MT0NLIFwKKwkgQ1ZNWF9BRERfSU9fU0VHKDB4MDAwMTE4MDAwMDAwMTU3OHVsbCkKKyNkZWZpbmUgQ1ZNWF9NSU9fRlVTX1dBRFIgXAorCSBDVk1YX0FERF9JT19TRUcoMHgwMDAxMTgwMDAwMDAxNTA4dWxsKQorI2RlZmluZSBDVk1YX01JT19OREZfRE1BX0NGRyBcCisJIENWTVhfQUREX0lPX1NFRygweDAwMDExODAwMDAwMDAxNjh1bGwpCisjZGVmaW5lIENWTVhfTUlPX05ERl9ETUFfSU5UIFwKKwkgQ1ZNWF9BRERfSU9fU0VHKDB4MDAwMTE4MDAwMDAwMDE3MHVsbCkKKyNkZWZpbmUgQ1ZNWF9NSU9fTkRGX0RNQV9JTlRfRU4gXAorCSBDVk1YX0FERF9JT19TRUcoMHgwMDAxMTgwMDAwMDAwMTc4dWxsKQorI2RlZmluZSBDVk1YX01JT19QTExfQ1RMIFwKKwkgQ1ZNWF9BRERfSU9fU0VHKDB4MDAwMTE4MDAwMDAwMTQ0OHVsbCkKKyNkZWZpbmUgQ1ZNWF9NSU9fUExMX1NFVFRJTkcgXAorCSBDVk1YX0FERF9JT19TRUcoMHgwMDAxMTgwMDAwMDAxNDQwdWxsKQorI2RlZmluZSBDVk1YX01JT19UV1NYX0lOVChvZmZzZXQpIFwKKwkgQ1ZNWF9BRERfSU9fU0VHKDB4MDAwMTE4MDAwMDAwMTAxMHVsbCArICgoKG9mZnNldCkgJiAxKSAqIDUxMikpCisjZGVmaW5lIENWTVhfTUlPX1RXU1hfU1dfVFdTSShvZmZzZXQpIFwKKwkgQ1ZNWF9BRERfSU9fU0VHKDB4MDAwMTE4MDAwMDAwMTAwMHVsbCArICgoKG9mZnNldCkgJiAxKSAqIDUxMikpCisjZGVmaW5lIENWTVhfTUlPX1RXU1hfU1dfVFdTSV9FWFQob2Zmc2V0KSBcCisJIENWTVhfQUREX0lPX1NFRygweDAwMDExODAwMDAwMDEwMTh1bGwgKyAoKChvZmZzZXQpICYgMSkgKiA1MTIpKQorI2RlZmluZSBDVk1YX01JT19UV1NYX1RXU0lfU1cob2Zmc2V0KSBcCisJIENWTVhfQUREX0lPX1NFRygweDAwMDExODAwMDAwMDEwMDh1bGwgKyAoKChvZmZzZXQpICYgMSkgKiA1MTIpKQorI2RlZmluZSBDVk1YX01JT19VQVJUMl9ETEggXAorCSBDVk1YX0FERF9JT19TRUcoMHgwMDAxMTgwMDAwMDAwNDg4dWxsKQorI2RlZmluZSBDVk1YX01JT19VQVJUMl9ETEwgXAorCSBDVk1YX0FERF9JT19TRUcoMHgwMDAxMTgwMDAwMDAwNDgwdWxsKQorI2RlZmluZSBDVk1YX01JT19VQVJUMl9GQVIgXAorCSBDVk1YX0FERF9JT19TRUcoMHgwMDAxMTgwMDAwMDAwNTIwdWxsKQorI2RlZmluZSBDVk1YX01JT19VQVJUMl9GQ1IgXAorCSBDVk1YX0FERF9JT19TRUcoMHgwMDAxMTgwMDAwMDAwNDUwdWxsKQorI2RlZmluZSBDVk1YX01JT19VQVJUMl9IVFggXAorCSBDVk1YX0FERF9JT19TRUcoMHgwMDAxMTgwMDAwMDAwNzA4dWxsKQorI2RlZmluZSBDVk1YX01JT19VQVJUMl9JRVIgXAorCSBDVk1YX0FERF9JT19TRUcoMHgwMDAxMTgwMDAwMDAwNDA4dWxsKQorI2RlZmluZSBDVk1YX01JT19VQVJUMl9JSVIgXAorCSBDVk1YX0FERF9JT19TRUcoMHgwMDAxMTgwMDAwMDAwNDEwdWxsKQorI2RlZmluZSBDVk1YX01JT19VQVJUMl9MQ1IgXAorCSBDVk1YX0FERF9JT19TRUcoMHgwMDAxMTgwMDAwMDAwNDE4dWxsKQorI2RlZmluZSBDVk1YX01JT19VQVJUMl9MU1IgXAorCSBDVk1YX0FERF9JT19TRUcoMHgwMDAxMTgwMDAwMDAwNDI4dWxsKQorI2RlZmluZSBDVk1YX01JT19VQVJUMl9NQ1IgXAorCSBDVk1YX0FERF9JT19TRUcoMHgwMDAxMTgwMDAwMDAwNDIwdWxsKQorI2RlZmluZSBDVk1YX01JT19VQVJUMl9NU1IgXAorCSBDVk1YX0FERF9JT19TRUcoMHgwMDAxMTgwMDAwMDAwNDMwdWxsKQorI2RlZmluZSBDVk1YX01JT19VQVJUMl9SQlIgXAorCSBDVk1YX0FERF9JT19TRUcoMHgwMDAxMTgwMDAwMDAwNDAwdWxsKQorI2RlZmluZSBDVk1YX01JT19VQVJUMl9SRkwgXAorCSBDVk1YX0FERF9JT19TRUcoMHgwMDAxMTgwMDAwMDAwNjA4dWxsKQorI2RlZmluZSBDVk1YX01JT19VQVJUMl9SRlcgXAorCSBDVk1YX0FERF9JT19TRUcoMHgwMDAxMTgwMDAwMDAwNTMwdWxsKQorI2RlZmluZSBDVk1YX01JT19VQVJUMl9TQkNSIFwKKwkgQ1ZNWF9BRERfSU9fU0VHKDB4MDAwMTE4MDAwMDAwMDYyMHVsbCkKKyNkZWZpbmUgQ1ZNWF9NSU9fVUFSVDJfU0NSIFwKKwkgQ1ZNWF9BRERfSU9fU0VHKDB4MDAwMTE4MDAwMDAwMDQzOHVsbCkKKyNkZWZpbmUgQ1ZNWF9NSU9fVUFSVDJfU0ZFIFwKKwkgQ1ZNWF9BRERfSU9fU0VHKDB4MDAwMTE4MDAwMDAwMDYzMHVsbCkKKyNkZWZpbmUgQ1ZNWF9NSU9fVUFSVDJfU1JSIFwKKwkgQ1ZNWF9BRERfSU9fU0VHKDB4MDAwMTE4MDAwMDAwMDYxMHVsbCkKKyNkZWZpbmUgQ1ZNWF9NSU9fVUFSVDJfU1JUIFwKKwkgQ1ZNWF9BRERfSU9fU0VHKDB4MDAwMTE4MDAwMDAwMDYzOHVsbCkKKyNkZWZpbmUgQ1ZNWF9NSU9fVUFSVDJfU1JUUyBcCisJIENWTVhfQUREX0lPX1NFRygweDAwMDExODAwMDAwMDA2MTh1bGwpCisjZGVmaW5lIENWTVhfTUlPX1VBUlQyX1NUVCBcCisJIENWTVhfQUREX0lPX1NFRygweDAwMDExODAwMDAwMDA3MDB1bGwpCisjZGVmaW5lIENWTVhfTUlPX1VBUlQyX1RGTCBcCisJIENWTVhfQUREX0lPX1NFRygweDAwMDExODAwMDAwMDA2MDB1bGwpCisjZGVmaW5lIENWTVhfTUlPX1VBUlQyX1RGUiBcCisJIENWTVhfQUREX0lPX1NFRygweDAwMDExODAwMDAwMDA1Mjh1bGwpCisjZGVmaW5lIENWTVhfTUlPX1VBUlQyX1RIUiBcCisJIENWTVhfQUREX0lPX1NFRygweDAwMDExODAwMDAwMDA0NDB1bGwpCisjZGVmaW5lIENWTVhfTUlPX1VBUlQyX1VTUiBcCisJIENWTVhfQUREX0lPX1NFRygweDAwMDExODAwMDAwMDA1Mzh1bGwpCisjZGVmaW5lIENWTVhfTUlPX1VBUlRYX0RMSChvZmZzZXQpIFwKKwkgQ1ZNWF9BRERfSU9fU0VHKDB4MDAwMTE4MDAwMDAwMDg4OHVsbCArICgoKG9mZnNldCkgJiAxKSAqIDEwMjQpKQorI2RlZmluZSBDVk1YX01JT19VQVJUWF9ETEwob2Zmc2V0KSBcCisJIENWTVhfQUREX0lPX1NFRygweDAwMDExODAwMDAwMDA4ODB1bGwgKyAoKChvZmZzZXQpICYgMSkgKiAxMDI0KSkKKyNkZWZpbmUgQ1ZNWF9NSU9fVUFSVFhfRkFSKG9mZnNldCkgXAorCSBDVk1YX0FERF9JT19TRUcoMHgwMDAxMTgwMDAwMDAwOTIwdWxsICsgKCgob2Zmc2V0KSAmIDEpICogMTAyNCkpCisjZGVmaW5lIENWTVhfTUlPX1VBUlRYX0ZDUihvZmZzZXQpIFwKKwkgQ1ZNWF9BRERfSU9fU0VHKDB4MDAwMTE4MDAwMDAwMDg1MHVsbCArICgoKG9mZnNldCkgJiAxKSAqIDEwMjQpKQorI2RlZmluZSBDVk1YX01JT19VQVJUWF9IVFgob2Zmc2V0KSBcCisJIENWTVhfQUREX0lPX1NFRygweDAwMDExODAwMDAwMDBCMDh1bGwgKyAoKChvZmZzZXQpICYgMSkgKiAxMDI0KSkKKyNkZWZpbmUgQ1ZNWF9NSU9fVUFSVFhfSUVSKG9mZnNldCkgXAorCSBDVk1YX0FERF9JT19TRUcoMHgwMDAxMTgwMDAwMDAwODA4dWxsICsgKCgob2Zmc2V0KSAmIDEpICogMTAyNCkpCisjZGVmaW5lIENWTVhfTUlPX1VBUlRYX0lJUihvZmZzZXQpIFwKKwkgQ1ZNWF9BRERfSU9fU0VHKDB4MDAwMTE4MDAwMDAwMDgxMHVsbCArICgoKG9mZnNldCkgJiAxKSAqIDEwMjQpKQorI2RlZmluZSBDVk1YX01JT19VQVJUWF9MQ1Iob2Zmc2V0KSBcCisJIENWTVhfQUREX0lPX1NFRygweDAwMDExODAwMDAwMDA4MTh1bGwgKyAoKChvZmZzZXQpICYgMSkgKiAxMDI0KSkKKyNkZWZpbmUgQ1ZNWF9NSU9fVUFSVFhfTFNSKG9mZnNldCkgXAorCSBDVk1YX0FERF9JT19TRUcoMHgwMDAxMTgwMDAwMDAwODI4dWxsICsgKCgob2Zmc2V0KSAmIDEpICogMTAyNCkpCisjZGVmaW5lIENWTVhfTUlPX1VBUlRYX01DUihvZmZzZXQpIFwKKwkgQ1ZNWF9BRERfSU9fU0VHKDB4MDAwMTE4MDAwMDAwMDgyMHVsbCArICgoKG9mZnNldCkgJiAxKSAqIDEwMjQpKQorI2RlZmluZSBDVk1YX01JT19VQVJUWF9NU1Iob2Zmc2V0KSBcCisJIENWTVhfQUREX0lPX1NFRygweDAwMDExODAwMDAwMDA4MzB1bGwgKyAoKChvZmZzZXQpICYgMSkgKiAxMDI0KSkKKyNkZWZpbmUgQ1ZNWF9NSU9fVUFSVFhfUkJSKG9mZnNldCkgXAorCSBDVk1YX0FERF9JT19TRUcoMHgwMDAxMTgwMDAwMDAwODAwdWxsICsgKCgob2Zmc2V0KSAmIDEpICogMTAyNCkpCisjZGVmaW5lIENWTVhfTUlPX1VBUlRYX1JGTChvZmZzZXQpIFwKKwkgQ1ZNWF9BRERfSU9fU0VHKDB4MDAwMTE4MDAwMDAwMEEwOHVsbCArICgoKG9mZnNldCkgJiAxKSAqIDEwMjQpKQorI2RlZmluZSBDVk1YX01JT19VQVJUWF9SRlcob2Zmc2V0KSBcCisJIENWTVhfQUREX0lPX1NFRygweDAwMDExODAwMDAwMDA5MzB1bGwgKyAoKChvZmZzZXQpICYgMSkgKiAxMDI0KSkKKyNkZWZpbmUgQ1ZNWF9NSU9fVUFSVFhfU0JDUihvZmZzZXQpIFwKKwkgQ1ZNWF9BRERfSU9fU0VHKDB4MDAwMTE4MDAwMDAwMEEyMHVsbCArICgoKG9mZnNldCkgJiAxKSAqIDEwMjQpKQorI2RlZmluZSBDVk1YX01JT19VQVJUWF9TQ1Iob2Zmc2V0KSBcCisJIENWTVhfQUREX0lPX1NFRygweDAwMDExODAwMDAwMDA4Mzh1bGwgKyAoKChvZmZzZXQpICYgMSkgKiAxMDI0KSkKKyNkZWZpbmUgQ1ZNWF9NSU9fVUFSVFhfU0ZFKG9mZnNldCkgXAorCSBDVk1YX0FERF9JT19TRUcoMHgwMDAxMTgwMDAwMDAwQTMwdWxsICsgKCgob2Zmc2V0KSAmIDEpICogMTAyNCkpCisjZGVmaW5lIENWTVhfTUlPX1VBUlRYX1NSUihvZmZzZXQpIFwKKwkgQ1ZNWF9BRERfSU9fU0VHKDB4MDAwMTE4MDAwMDAwMEExMHVsbCArICgoKG9mZnNldCkgJiAxKSAqIDEwMjQpKQorI2RlZmluZSBDVk1YX01JT19VQVJUWF9TUlQob2Zmc2V0KSBcCisJIENWTVhfQUREX0lPX1NFRygweDAwMDExODAwMDAwMDBBMzh1bGwgKyAoKChvZmZzZXQpICYgMSkgKiAxMDI0KSkKKyNkZWZpbmUgQ1ZNWF9NSU9fVUFSVFhfU1JUUyhvZmZzZXQpIFwKKwkgQ1ZNWF9BRERfSU9fU0VHKDB4MDAwMTE4MDAwMDAwMEExOHVsbCArICgoKG9mZnNldCkgJiAxKSAqIDEwMjQpKQorI2RlZmluZSBDVk1YX01JT19VQVJUWF9TVFQob2Zmc2V0KSBcCisJIENWTVhfQUREX0lPX1NFRygweDAwMDExODAwMDAwMDBCMDB1bGwgKyAoKChvZmZzZXQpICYgMSkgKiAxMDI0KSkKKyNkZWZpbmUgQ1ZNWF9NSU9fVUFSVFhfVEZMKG9mZnNldCkgXAorCSBDVk1YX0FERF9JT19TRUcoMHgwMDAxMTgwMDAwMDAwQTAwdWxsICsgKCgob2Zmc2V0KSAmIDEpICogMTAyNCkpCisjZGVmaW5lIENWTVhfTUlPX1VBUlRYX1RGUihvZmZzZXQpIFwKKwkgQ1ZNWF9BRERfSU9fU0VHKDB4MDAwMTE4MDAwMDAwMDkyOHVsbCArICgoKG9mZnNldCkgJiAxKSAqIDEwMjQpKQorI2RlZmluZSBDVk1YX01JT19VQVJUWF9USFIob2Zmc2V0KSBcCisJIENWTVhfQUREX0lPX1NFRygweDAwMDExODAwMDAwMDA4NDB1bGwgKyAoKChvZmZzZXQpICYgMSkgKiAxMDI0KSkKKyNkZWZpbmUgQ1ZNWF9NSU9fVUFSVFhfVVNSKG9mZnNldCkgXAorCSBDVk1YX0FERF9JT19TRUcoMHgwMDAxMTgwMDAwMDAwOTM4dWxsICsgKCgob2Zmc2V0KSAmIDEpICogMTAyNCkpCisKK3VuaW9uIGN2bXhfbWlvX2Jvb3RfYmlzdF9zdGF0IHsKKwl1aW50NjRfdCB1NjQ7CisJc3RydWN0IGN2bXhfbWlvX2Jvb3RfYmlzdF9zdGF0X3MgeworCQl1aW50NjRfdCByZXNlcnZlZF8yXzYzOjYyOworCQl1aW50NjRfdCBsb2M6MTsKKwkJdWludDY0X3QgbmNiaToxOworCX0gczsKKwlzdHJ1Y3QgY3ZteF9taW9fYm9vdF9iaXN0X3N0YXRfY24zMHh4IHsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfNF82Mzo2MDsKKwkJdWludDY0X3QgbmNib18xOjE7CisJCXVpbnQ2NF90IG5jYm9fMDoxOworCQl1aW50NjRfdCBsb2M6MTsKKwkJdWludDY0X3QgbmNiaToxOworCX0gY24zMHh4OworCXN0cnVjdCBjdm14X21pb19ib290X2Jpc3Rfc3RhdF9jbjMweHggY24zMXh4OworCXN0cnVjdCBjdm14X21pb19ib290X2Jpc3Rfc3RhdF9jbjM4eHggeworCQl1aW50NjRfdCByZXNlcnZlZF8zXzYzOjYxOworCQl1aW50NjRfdCBuY2JvXzA6MTsKKwkJdWludDY0X3QgbG9jOjE7CisJCXVpbnQ2NF90IG5jYmk6MTsKKwl9IGNuMzh4eDsKKwlzdHJ1Y3QgY3ZteF9taW9fYm9vdF9iaXN0X3N0YXRfY24zOHh4IGNuMzh4eHAyOworCXN0cnVjdCBjdm14X21pb19ib290X2Jpc3Rfc3RhdF9jbjUweHggeworCQl1aW50NjRfdCByZXNlcnZlZF82XzYzOjU4OworCQl1aW50NjRfdCBwY21fMToxOworCQl1aW50NjRfdCBwY21fMDoxOworCQl1aW50NjRfdCBuY2JvXzE6MTsKKwkJdWludDY0X3QgbmNib18wOjE7CisJCXVpbnQ2NF90IGxvYzoxOworCQl1aW50NjRfdCBuY2JpOjE7CisJfSBjbjUweHg7CisJc3RydWN0IGN2bXhfbWlvX2Jvb3RfYmlzdF9zdGF0X2NuNTJ4eCB7CisJCXVpbnQ2NF90IHJlc2VydmVkXzZfNjM6NTg7CisJCXVpbnQ2NF90IG5kZjoyOworCQl1aW50NjRfdCBuY2JvXzA6MTsKKwkJdWludDY0X3QgZG1hOjE7CisJCXVpbnQ2NF90IGxvYzoxOworCQl1aW50NjRfdCBuY2JpOjE7CisJfSBjbjUyeHg7CisJc3RydWN0IGN2bXhfbWlvX2Jvb3RfYmlzdF9zdGF0X2NuNTJ4eHAxIHsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfNF82Mzo2MDsKKwkJdWludDY0X3QgbmNib18wOjE7CisJCXVpbnQ2NF90IGRtYToxOworCQl1aW50NjRfdCBsb2M6MTsKKwkJdWludDY0X3QgbmNiaToxOworCX0gY241Mnh4cDE7CisJc3RydWN0IGN2bXhfbWlvX2Jvb3RfYmlzdF9zdGF0X2NuNTJ4eHAxIGNuNTZ4eDsKKwlzdHJ1Y3QgY3ZteF9taW9fYm9vdF9iaXN0X3N0YXRfY241Mnh4cDEgY241Nnh4cDE7CisJc3RydWN0IGN2bXhfbWlvX2Jvb3RfYmlzdF9zdGF0X2NuMzh4eCBjbjU4eHg7CisJc3RydWN0IGN2bXhfbWlvX2Jvb3RfYmlzdF9zdGF0X2NuMzh4eCBjbjU4eHhwMTsKK307CisKK3VuaW9uIGN2bXhfbWlvX2Jvb3RfY29tcCB7CisJdWludDY0X3QgdTY0OworCXN0cnVjdCBjdm14X21pb19ib290X2NvbXBfcyB7CisJCXVpbnQ2NF90IHJlc2VydmVkXzEwXzYzOjU0OworCQl1aW50NjRfdCBwY3RsOjU7CisJCXVpbnQ2NF90IG5jdGw6NTsKKwl9IHM7CisJc3RydWN0IGN2bXhfbWlvX2Jvb3RfY29tcF9zIGNuNTB4eDsKKwlzdHJ1Y3QgY3ZteF9taW9fYm9vdF9jb21wX3MgY241Mnh4OworCXN0cnVjdCBjdm14X21pb19ib290X2NvbXBfcyBjbjUyeHhwMTsKKwlzdHJ1Y3QgY3ZteF9taW9fYm9vdF9jb21wX3MgY241Nnh4OworCXN0cnVjdCBjdm14X21pb19ib290X2NvbXBfcyBjbjU2eHhwMTsKK307CisKK3VuaW9uIGN2bXhfbWlvX2Jvb3RfZG1hX2NmZ3ggeworCXVpbnQ2NF90IHU2NDsKKwlzdHJ1Y3QgY3ZteF9taW9fYm9vdF9kbWFfY2ZneF9zIHsKKwkJdWludDY0X3QgZW46MTsKKwkJdWludDY0X3Qgcnc6MTsKKwkJdWludDY0X3QgY2xyOjE7CisJCXVpbnQ2NF90IHJlc2VydmVkXzYwXzYwOjE7CisJCXVpbnQ2NF90IHN3YXAzMjoxOworCQl1aW50NjRfdCBzd2FwMTY6MTsKKwkJdWludDY0X3Qgc3dhcDg6MTsKKwkJdWludDY0X3QgZW5kaWFuOjE7CisJCXVpbnQ2NF90IHNpemU6MjA7CisJCXVpbnQ2NF90IGFkcjozNjsKKwl9IHM7CisJc3RydWN0IGN2bXhfbWlvX2Jvb3RfZG1hX2NmZ3hfcyBjbjUyeHg7CisJc3RydWN0IGN2bXhfbWlvX2Jvb3RfZG1hX2NmZ3hfcyBjbjUyeHhwMTsKKwlzdHJ1Y3QgY3ZteF9taW9fYm9vdF9kbWFfY2ZneF9zIGNuNTZ4eDsKKwlzdHJ1Y3QgY3ZteF9taW9fYm9vdF9kbWFfY2ZneF9zIGNuNTZ4eHAxOworfTsKKwordW5pb24gY3ZteF9taW9fYm9vdF9kbWFfaW50eCB7CisJdWludDY0X3QgdTY0OworCXN0cnVjdCBjdm14X21pb19ib290X2RtYV9pbnR4X3MgeworCQl1aW50NjRfdCByZXNlcnZlZF8yXzYzOjYyOworCQl1aW50NjRfdCBkbWFycToxOworCQl1aW50NjRfdCBkb25lOjE7CisJfSBzOworCXN0cnVjdCBjdm14X21pb19ib290X2RtYV9pbnR4X3MgY241Mnh4OworCXN0cnVjdCBjdm14X21pb19ib290X2RtYV9pbnR4X3MgY241Mnh4cDE7CisJc3RydWN0IGN2bXhfbWlvX2Jvb3RfZG1hX2ludHhfcyBjbjU2eHg7CisJc3RydWN0IGN2bXhfbWlvX2Jvb3RfZG1hX2ludHhfcyBjbjU2eHhwMTsKK307CisKK3VuaW9uIGN2bXhfbWlvX2Jvb3RfZG1hX2ludF9lbnggeworCXVpbnQ2NF90IHU2NDsKKwlzdHJ1Y3QgY3ZteF9taW9fYm9vdF9kbWFfaW50X2VueF9zIHsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfMl82Mzo2MjsKKwkJdWludDY0X3QgZG1hcnE6MTsKKwkJdWludDY0X3QgZG9uZToxOworCX0gczsKKwlzdHJ1Y3QgY3ZteF9taW9fYm9vdF9kbWFfaW50X2VueF9zIGNuNTJ4eDsKKwlzdHJ1Y3QgY3ZteF9taW9fYm9vdF9kbWFfaW50X2VueF9zIGNuNTJ4eHAxOworCXN0cnVjdCBjdm14X21pb19ib290X2RtYV9pbnRfZW54X3MgY241Nnh4OworCXN0cnVjdCBjdm14X21pb19ib290X2RtYV9pbnRfZW54X3MgY241Nnh4cDE7Cit9OworCit1bmlvbiBjdm14X21pb19ib290X2RtYV90aW14IHsKKwl1aW50NjRfdCB1NjQ7CisJc3RydWN0IGN2bXhfbWlvX2Jvb3RfZG1hX3RpbXhfcyB7CisJCXVpbnQ2NF90IGRtYWNrX3BpOjE7CisJCXVpbnQ2NF90IGRtYXJxX3BpOjE7CisJCXVpbnQ2NF90IHRpbV9tdWx0OjI7CisJCXVpbnQ2NF90IHJkX2RseTozOworCQl1aW50NjRfdCBkZHI6MTsKKwkJdWludDY0X3Qgd2lkdGg6MTsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfNDhfNTQ6NzsKKwkJdWludDY0X3QgcGF1c2U6NjsKKwkJdWludDY0X3QgZG1hY2tfaDo2OworCQl1aW50NjRfdCB3ZV9uOjY7CisJCXVpbnQ2NF90IHdlX2E6NjsKKwkJdWludDY0X3Qgb2Vfbjo2OworCQl1aW50NjRfdCBvZV9hOjY7CisJCXVpbnQ2NF90IGRtYWNrX3M6NjsKKwkJdWludDY0X3QgZG1hcnE6NjsKKwl9IHM7CisJc3RydWN0IGN2bXhfbWlvX2Jvb3RfZG1hX3RpbXhfcyBjbjUyeHg7CisJc3RydWN0IGN2bXhfbWlvX2Jvb3RfZG1hX3RpbXhfcyBjbjUyeHhwMTsKKwlzdHJ1Y3QgY3ZteF9taW9fYm9vdF9kbWFfdGlteF9zIGNuNTZ4eDsKKwlzdHJ1Y3QgY3ZteF9taW9fYm9vdF9kbWFfdGlteF9zIGNuNTZ4eHAxOworfTsKKwordW5pb24gY3ZteF9taW9fYm9vdF9lcnIgeworCXVpbnQ2NF90IHU2NDsKKwlzdHJ1Y3QgY3ZteF9taW9fYm9vdF9lcnJfcyB7CisJCXVpbnQ2NF90IHJlc2VydmVkXzJfNjM6NjI7CisJCXVpbnQ2NF90IHdhaXRfZXJyOjE7CisJCXVpbnQ2NF90IGFkcl9lcnI6MTsKKwl9IHM7CisJc3RydWN0IGN2bXhfbWlvX2Jvb3RfZXJyX3MgY24zMHh4OworCXN0cnVjdCBjdm14X21pb19ib290X2Vycl9zIGNuMzF4eDsKKwlzdHJ1Y3QgY3ZteF9taW9fYm9vdF9lcnJfcyBjbjM4eHg7CisJc3RydWN0IGN2bXhfbWlvX2Jvb3RfZXJyX3MgY24zOHh4cDI7CisJc3RydWN0IGN2bXhfbWlvX2Jvb3RfZXJyX3MgY241MHh4OworCXN0cnVjdCBjdm14X21pb19ib290X2Vycl9zIGNuNTJ4eDsKKwlzdHJ1Y3QgY3ZteF9taW9fYm9vdF9lcnJfcyBjbjUyeHhwMTsKKwlzdHJ1Y3QgY3ZteF9taW9fYm9vdF9lcnJfcyBjbjU2eHg7CisJc3RydWN0IGN2bXhfbWlvX2Jvb3RfZXJyX3MgY241Nnh4cDE7CisJc3RydWN0IGN2bXhfbWlvX2Jvb3RfZXJyX3MgY241OHh4OworCXN0cnVjdCBjdm14X21pb19ib290X2Vycl9zIGNuNTh4eHAxOworfTsKKwordW5pb24gY3ZteF9taW9fYm9vdF9pbnQgeworCXVpbnQ2NF90IHU2NDsKKwlzdHJ1Y3QgY3ZteF9taW9fYm9vdF9pbnRfcyB7CisJCXVpbnQ2NF90IHJlc2VydmVkXzJfNjM6NjI7CisJCXVpbnQ2NF90IHdhaXRfaW50OjE7CisJCXVpbnQ2NF90IGFkcl9pbnQ6MTsKKwl9IHM7CisJc3RydWN0IGN2bXhfbWlvX2Jvb3RfaW50X3MgY24zMHh4OworCXN0cnVjdCBjdm14X21pb19ib290X2ludF9zIGNuMzF4eDsKKwlzdHJ1Y3QgY3ZteF9taW9fYm9vdF9pbnRfcyBjbjM4eHg7CisJc3RydWN0IGN2bXhfbWlvX2Jvb3RfaW50X3MgY24zOHh4cDI7CisJc3RydWN0IGN2bXhfbWlvX2Jvb3RfaW50X3MgY241MHh4OworCXN0cnVjdCBjdm14X21pb19ib290X2ludF9zIGNuNTJ4eDsKKwlzdHJ1Y3QgY3ZteF9taW9fYm9vdF9pbnRfcyBjbjUyeHhwMTsKKwlzdHJ1Y3QgY3ZteF9taW9fYm9vdF9pbnRfcyBjbjU2eHg7CisJc3RydWN0IGN2bXhfbWlvX2Jvb3RfaW50X3MgY241Nnh4cDE7CisJc3RydWN0IGN2bXhfbWlvX2Jvb3RfaW50X3MgY241OHh4OworCXN0cnVjdCBjdm14X21pb19ib290X2ludF9zIGNuNTh4eHAxOworfTsKKwordW5pb24gY3ZteF9taW9fYm9vdF9sb2NfYWRyIHsKKwl1aW50NjRfdCB1NjQ7CisJc3RydWN0IGN2bXhfbWlvX2Jvb3RfbG9jX2Fkcl9zIHsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfOF82Mzo1NjsKKwkJdWludDY0X3QgYWRyOjU7CisJCXVpbnQ2NF90IHJlc2VydmVkXzBfMjozOworCX0gczsKKwlzdHJ1Y3QgY3ZteF9taW9fYm9vdF9sb2NfYWRyX3MgY24zMHh4OworCXN0cnVjdCBjdm14X21pb19ib290X2xvY19hZHJfcyBjbjMxeHg7CisJc3RydWN0IGN2bXhfbWlvX2Jvb3RfbG9jX2Fkcl9zIGNuMzh4eDsKKwlzdHJ1Y3QgY3ZteF9taW9fYm9vdF9sb2NfYWRyX3MgY24zOHh4cDI7CisJc3RydWN0IGN2bXhfbWlvX2Jvb3RfbG9jX2Fkcl9zIGNuNTB4eDsKKwlzdHJ1Y3QgY3ZteF9taW9fYm9vdF9sb2NfYWRyX3MgY241Mnh4OworCXN0cnVjdCBjdm14X21pb19ib290X2xvY19hZHJfcyBjbjUyeHhwMTsKKwlzdHJ1Y3QgY3ZteF9taW9fYm9vdF9sb2NfYWRyX3MgY241Nnh4OworCXN0cnVjdCBjdm14X21pb19ib290X2xvY19hZHJfcyBjbjU2eHhwMTsKKwlzdHJ1Y3QgY3ZteF9taW9fYm9vdF9sb2NfYWRyX3MgY241OHh4OworCXN0cnVjdCBjdm14X21pb19ib290X2xvY19hZHJfcyBjbjU4eHhwMTsKK307CisKK3VuaW9uIGN2bXhfbWlvX2Jvb3RfbG9jX2NmZ3ggeworCXVpbnQ2NF90IHU2NDsKKwlzdHJ1Y3QgY3ZteF9taW9fYm9vdF9sb2NfY2ZneF9zIHsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfMzJfNjM6MzI7CisJCXVpbnQ2NF90IGVuOjE7CisJCXVpbnQ2NF90IHJlc2VydmVkXzI4XzMwOjM7CisJCXVpbnQ2NF90IGJhc2U6MjU7CisJCXVpbnQ2NF90IHJlc2VydmVkXzBfMjozOworCX0gczsKKwlzdHJ1Y3QgY3ZteF9taW9fYm9vdF9sb2NfY2ZneF9zIGNuMzB4eDsKKwlzdHJ1Y3QgY3ZteF9taW9fYm9vdF9sb2NfY2ZneF9zIGNuMzF4eDsKKwlzdHJ1Y3QgY3ZteF9taW9fYm9vdF9sb2NfY2ZneF9zIGNuMzh4eDsKKwlzdHJ1Y3QgY3ZteF9taW9fYm9vdF9sb2NfY2ZneF9zIGNuMzh4eHAyOworCXN0cnVjdCBjdm14X21pb19ib290X2xvY19jZmd4X3MgY241MHh4OworCXN0cnVjdCBjdm14X21pb19ib290X2xvY19jZmd4X3MgY241Mnh4OworCXN0cnVjdCBjdm14X21pb19ib290X2xvY19jZmd4X3MgY241Mnh4cDE7CisJc3RydWN0IGN2bXhfbWlvX2Jvb3RfbG9jX2NmZ3hfcyBjbjU2eHg7CisJc3RydWN0IGN2bXhfbWlvX2Jvb3RfbG9jX2NmZ3hfcyBjbjU2eHhwMTsKKwlzdHJ1Y3QgY3ZteF9taW9fYm9vdF9sb2NfY2ZneF9zIGNuNTh4eDsKKwlzdHJ1Y3QgY3ZteF9taW9fYm9vdF9sb2NfY2ZneF9zIGNuNTh4eHAxOworfTsKKwordW5pb24gY3ZteF9taW9fYm9vdF9sb2NfZGF0IHsKKwl1aW50NjRfdCB1NjQ7CisJc3RydWN0IGN2bXhfbWlvX2Jvb3RfbG9jX2RhdF9zIHsKKwkJdWludDY0X3QgZGF0YTo2NDsKKwl9IHM7CisJc3RydWN0IGN2bXhfbWlvX2Jvb3RfbG9jX2RhdF9zIGNuMzB4eDsKKwlzdHJ1Y3QgY3ZteF9taW9fYm9vdF9sb2NfZGF0X3MgY24zMXh4OworCXN0cnVjdCBjdm14X21pb19ib290X2xvY19kYXRfcyBjbjM4eHg7CisJc3RydWN0IGN2bXhfbWlvX2Jvb3RfbG9jX2RhdF9zIGNuMzh4eHAyOworCXN0cnVjdCBjdm14X21pb19ib290X2xvY19kYXRfcyBjbjUweHg7CisJc3RydWN0IGN2bXhfbWlvX2Jvb3RfbG9jX2RhdF9zIGNuNTJ4eDsKKwlzdHJ1Y3QgY3ZteF9taW9fYm9vdF9sb2NfZGF0X3MgY241Mnh4cDE7CisJc3RydWN0IGN2bXhfbWlvX2Jvb3RfbG9jX2RhdF9zIGNuNTZ4eDsKKwlzdHJ1Y3QgY3ZteF9taW9fYm9vdF9sb2NfZGF0X3MgY241Nnh4cDE7CisJc3RydWN0IGN2bXhfbWlvX2Jvb3RfbG9jX2RhdF9zIGNuNTh4eDsKKwlzdHJ1Y3QgY3ZteF9taW9fYm9vdF9sb2NfZGF0X3MgY241OHh4cDE7Cit9OworCit1bmlvbiBjdm14X21pb19ib290X3Bpbl9kZWZzIHsKKwl1aW50NjRfdCB1NjQ7CisJc3RydWN0IGN2bXhfbWlvX2Jvb3RfcGluX2RlZnNfcyB7CisJCXVpbnQ2NF90IHJlc2VydmVkXzE2XzYzOjQ4OworCQl1aW50NjRfdCBhbGU6MTsKKwkJdWludDY0X3Qgd2lkdGg6MTsKKwkJdWludDY0X3QgZG1hY2tfcDI6MTsKKwkJdWludDY0X3QgZG1hY2tfcDE6MTsKKwkJdWludDY0X3QgZG1hY2tfcDA6MTsKKwkJdWludDY0X3QgdGVybToyOworCQl1aW50NjRfdCBuYW5kOjE7CisJCXVpbnQ2NF90IHJlc2VydmVkXzBfNzo4OworCX0gczsKKwlzdHJ1Y3QgY3ZteF9taW9fYm9vdF9waW5fZGVmc19jbjUyeHggeworCQl1aW50NjRfdCByZXNlcnZlZF8xNl82Mzo0ODsKKwkJdWludDY0X3QgYWxlOjE7CisJCXVpbnQ2NF90IHdpZHRoOjE7CisJCXVpbnQ2NF90IHJlc2VydmVkXzEzXzEzOjE7CisJCXVpbnQ2NF90IGRtYWNrX3AxOjE7CisJCXVpbnQ2NF90IGRtYWNrX3AwOjE7CisJCXVpbnQ2NF90IHRlcm06MjsKKwkJdWludDY0X3QgbmFuZDoxOworCQl1aW50NjRfdCByZXNlcnZlZF8wXzc6ODsKKwl9IGNuNTJ4eDsKKwlzdHJ1Y3QgY3ZteF9taW9fYm9vdF9waW5fZGVmc19jbjU2eHggeworCQl1aW50NjRfdCByZXNlcnZlZF8xNl82Mzo0ODsKKwkJdWludDY0X3QgYWxlOjE7CisJCXVpbnQ2NF90IHdpZHRoOjE7CisJCXVpbnQ2NF90IGRtYWNrX3AyOjE7CisJCXVpbnQ2NF90IGRtYWNrX3AxOjE7CisJCXVpbnQ2NF90IGRtYWNrX3AwOjE7CisJCXVpbnQ2NF90IHRlcm06MjsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfMF84Ojk7CisJfSBjbjU2eHg7Cit9OworCit1bmlvbiBjdm14X21pb19ib290X3JlZ19jZmd4IHsKKwl1aW50NjRfdCB1NjQ7CisJc3RydWN0IGN2bXhfbWlvX2Jvb3RfcmVnX2NmZ3hfcyB7CisJCXVpbnQ2NF90IHJlc2VydmVkXzQ0XzYzOjIwOworCQl1aW50NjRfdCBkbWFjazoyOworCQl1aW50NjRfdCB0aW1fbXVsdDoyOworCQl1aW50NjRfdCByZF9kbHk6MzsKKwkJdWludDY0X3Qgc2FtOjE7CisJCXVpbnQ2NF90IHdlX2V4dDoyOworCQl1aW50NjRfdCBvZV9leHQ6MjsKKwkJdWludDY0X3QgZW46MTsKKwkJdWludDY0X3Qgb3JiaXQ6MTsKKwkJdWludDY0X3QgYWxlOjE7CisJCXVpbnQ2NF90IHdpZHRoOjE7CisJCXVpbnQ2NF90IHNpemU6MTI7CisJCXVpbnQ2NF90IGJhc2U6MTY7CisJfSBzOworCXN0cnVjdCBjdm14X21pb19ib290X3JlZ19jZmd4X2NuMzB4eCB7CisJCXVpbnQ2NF90IHJlc2VydmVkXzM3XzYzOjI3OworCQl1aW50NjRfdCBzYW06MTsKKwkJdWludDY0X3Qgd2VfZXh0OjI7CisJCXVpbnQ2NF90IG9lX2V4dDoyOworCQl1aW50NjRfdCBlbjoxOworCQl1aW50NjRfdCBvcmJpdDoxOworCQl1aW50NjRfdCBhbGU6MTsKKwkJdWludDY0X3Qgd2lkdGg6MTsKKwkJdWludDY0X3Qgc2l6ZToxMjsKKwkJdWludDY0X3QgYmFzZToxNjsKKwl9IGNuMzB4eDsKKwlzdHJ1Y3QgY3ZteF9taW9fYm9vdF9yZWdfY2ZneF9jbjMweHggY24zMXh4OworCXN0cnVjdCBjdm14X21pb19ib290X3JlZ19jZmd4X2NuMzh4eCB7CisJCXVpbnQ2NF90IHJlc2VydmVkXzMyXzYzOjMyOworCQl1aW50NjRfdCBlbjoxOworCQl1aW50NjRfdCBvcmJpdDoxOworCQl1aW50NjRfdCByZXNlcnZlZF8yOF8yOToyOworCQl1aW50NjRfdCBzaXplOjEyOworCQl1aW50NjRfdCBiYXNlOjE2OworCX0gY24zOHh4OworCXN0cnVjdCBjdm14X21pb19ib290X3JlZ19jZmd4X2NuMzh4eCBjbjM4eHhwMjsKKwlzdHJ1Y3QgY3ZteF9taW9fYm9vdF9yZWdfY2ZneF9jbjUweHggeworCQl1aW50NjRfdCByZXNlcnZlZF80Ml82MzoyMjsKKwkJdWludDY0X3QgdGltX211bHQ6MjsKKwkJdWludDY0X3QgcmRfZGx5OjM7CisJCXVpbnQ2NF90IHNhbToxOworCQl1aW50NjRfdCB3ZV9leHQ6MjsKKwkJdWludDY0X3Qgb2VfZXh0OjI7CisJCXVpbnQ2NF90IGVuOjE7CisJCXVpbnQ2NF90IG9yYml0OjE7CisJCXVpbnQ2NF90IGFsZToxOworCQl1aW50NjRfdCB3aWR0aDoxOworCQl1aW50NjRfdCBzaXplOjEyOworCQl1aW50NjRfdCBiYXNlOjE2OworCX0gY241MHh4OworCXN0cnVjdCBjdm14X21pb19ib290X3JlZ19jZmd4X3MgY241Mnh4OworCXN0cnVjdCBjdm14X21pb19ib290X3JlZ19jZmd4X3MgY241Mnh4cDE7CisJc3RydWN0IGN2bXhfbWlvX2Jvb3RfcmVnX2NmZ3hfcyBjbjU2eHg7CisJc3RydWN0IGN2bXhfbWlvX2Jvb3RfcmVnX2NmZ3hfcyBjbjU2eHhwMTsKKwlzdHJ1Y3QgY3ZteF9taW9fYm9vdF9yZWdfY2ZneF9jbjMweHggY241OHh4OworCXN0cnVjdCBjdm14X21pb19ib290X3JlZ19jZmd4X2NuMzB4eCBjbjU4eHhwMTsKK307CisKK3VuaW9uIGN2bXhfbWlvX2Jvb3RfcmVnX3RpbXggeworCXVpbnQ2NF90IHU2NDsKKwlzdHJ1Y3QgY3ZteF9taW9fYm9vdF9yZWdfdGlteF9zIHsKKwkJdWludDY0X3QgcGFnZW06MTsKKwkJdWludDY0X3Qgd2FpdG06MTsKKwkJdWludDY0X3QgcGFnZXM6MjsKKwkJdWludDY0X3QgYWxlOjY7CisJCXVpbnQ2NF90IHBhZ2U6NjsKKwkJdWludDY0X3Qgd2FpdDo2OworCQl1aW50NjRfdCBwYXVzZTo2OworCQl1aW50NjRfdCB3cl9obGQ6NjsKKwkJdWludDY0X3QgcmRfaGxkOjY7CisJCXVpbnQ2NF90IHdlOjY7CisJCXVpbnQ2NF90IG9lOjY7CisJCXVpbnQ2NF90IGNlOjY7CisJCXVpbnQ2NF90IGFkcjo2OworCX0gczsKKwlzdHJ1Y3QgY3ZteF9taW9fYm9vdF9yZWdfdGlteF9zIGNuMzB4eDsKKwlzdHJ1Y3QgY3ZteF9taW9fYm9vdF9yZWdfdGlteF9zIGNuMzF4eDsKKwlzdHJ1Y3QgY3ZteF9taW9fYm9vdF9yZWdfdGlteF9jbjM4eHggeworCQl1aW50NjRfdCBwYWdlbToxOworCQl1aW50NjRfdCB3YWl0bToxOworCQl1aW50NjRfdCBwYWdlczoyOworCQl1aW50NjRfdCByZXNlcnZlZF81NF81OTo2OworCQl1aW50NjRfdCBwYWdlOjY7CisJCXVpbnQ2NF90IHdhaXQ6NjsKKwkJdWludDY0X3QgcGF1c2U6NjsKKwkJdWludDY0X3Qgd3JfaGxkOjY7CisJCXVpbnQ2NF90IHJkX2hsZDo2OworCQl1aW50NjRfdCB3ZTo2OworCQl1aW50NjRfdCBvZTo2OworCQl1aW50NjRfdCBjZTo2OworCQl1aW50NjRfdCBhZHI6NjsKKwl9IGNuMzh4eDsKKwlzdHJ1Y3QgY3ZteF9taW9fYm9vdF9yZWdfdGlteF9jbjM4eHggY24zOHh4cDI7CisJc3RydWN0IGN2bXhfbWlvX2Jvb3RfcmVnX3RpbXhfcyBjbjUweHg7CisJc3RydWN0IGN2bXhfbWlvX2Jvb3RfcmVnX3RpbXhfcyBjbjUyeHg7CisJc3RydWN0IGN2bXhfbWlvX2Jvb3RfcmVnX3RpbXhfcyBjbjUyeHhwMTsKKwlzdHJ1Y3QgY3ZteF9taW9fYm9vdF9yZWdfdGlteF9zIGNuNTZ4eDsKKwlzdHJ1Y3QgY3ZteF9taW9fYm9vdF9yZWdfdGlteF9zIGNuNTZ4eHAxOworCXN0cnVjdCBjdm14X21pb19ib290X3JlZ190aW14X3MgY241OHh4OworCXN0cnVjdCBjdm14X21pb19ib290X3JlZ190aW14X3MgY241OHh4cDE7Cit9OworCit1bmlvbiBjdm14X21pb19ib290X3RociB7CisJdWludDY0X3QgdTY0OworCXN0cnVjdCBjdm14X21pb19ib290X3Rocl9zIHsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfMjJfNjM6NDI7CisJCXVpbnQ2NF90IGRtYV90aHI6NjsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfMTRfMTU6MjsKKwkJdWludDY0X3QgZmlmX2NudDo2OworCQl1aW50NjRfdCByZXNlcnZlZF82Xzc6MjsKKwkJdWludDY0X3QgZmlmX3Rocjo2OworCX0gczsKKwlzdHJ1Y3QgY3ZteF9taW9fYm9vdF90aHJfY24zMHh4IHsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfMTRfNjM6NTA7CisJCXVpbnQ2NF90IGZpZl9jbnQ6NjsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfNl83OjI7CisJCXVpbnQ2NF90IGZpZl90aHI6NjsKKwl9IGNuMzB4eDsKKwlzdHJ1Y3QgY3ZteF9taW9fYm9vdF90aHJfY24zMHh4IGNuMzF4eDsKKwlzdHJ1Y3QgY3ZteF9taW9fYm9vdF90aHJfY24zMHh4IGNuMzh4eDsKKwlzdHJ1Y3QgY3ZteF9taW9fYm9vdF90aHJfY24zMHh4IGNuMzh4eHAyOworCXN0cnVjdCBjdm14X21pb19ib290X3Rocl9jbjMweHggY241MHh4OworCXN0cnVjdCBjdm14X21pb19ib290X3Rocl9zIGNuNTJ4eDsKKwlzdHJ1Y3QgY3ZteF9taW9fYm9vdF90aHJfcyBjbjUyeHhwMTsKKwlzdHJ1Y3QgY3ZteF9taW9fYm9vdF90aHJfcyBjbjU2eHg7CisJc3RydWN0IGN2bXhfbWlvX2Jvb3RfdGhyX3MgY241Nnh4cDE7CisJc3RydWN0IGN2bXhfbWlvX2Jvb3RfdGhyX2NuMzB4eCBjbjU4eHg7CisJc3RydWN0IGN2bXhfbWlvX2Jvb3RfdGhyX2NuMzB4eCBjbjU4eHhwMTsKK307CisKK3VuaW9uIGN2bXhfbWlvX2Z1c19ibmtfZGF0eCB7CisJdWludDY0X3QgdTY0OworCXN0cnVjdCBjdm14X21pb19mdXNfYm5rX2RhdHhfcyB7CisJCXVpbnQ2NF90IGRhdDo2NDsKKwl9IHM7CisJc3RydWN0IGN2bXhfbWlvX2Z1c19ibmtfZGF0eF9zIGNuNTB4eDsKKwlzdHJ1Y3QgY3ZteF9taW9fZnVzX2Jua19kYXR4X3MgY241Mnh4OworCXN0cnVjdCBjdm14X21pb19mdXNfYm5rX2RhdHhfcyBjbjUyeHhwMTsKKwlzdHJ1Y3QgY3ZteF9taW9fZnVzX2Jua19kYXR4X3MgY241Nnh4OworCXN0cnVjdCBjdm14X21pb19mdXNfYm5rX2RhdHhfcyBjbjU2eHhwMTsKKwlzdHJ1Y3QgY3ZteF9taW9fZnVzX2Jua19kYXR4X3MgY241OHh4OworCXN0cnVjdCBjdm14X21pb19mdXNfYm5rX2RhdHhfcyBjbjU4eHhwMTsKK307CisKK3VuaW9uIGN2bXhfbWlvX2Z1c19kYXQwIHsKKwl1aW50NjRfdCB1NjQ7CisJc3RydWN0IGN2bXhfbWlvX2Z1c19kYXQwX3MgeworCQl1aW50NjRfdCByZXNlcnZlZF8zMl82MzozMjsKKwkJdWludDY0X3QgbWFuX2luZm86MzI7CisJfSBzOworCXN0cnVjdCBjdm14X21pb19mdXNfZGF0MF9zIGNuMzB4eDsKKwlzdHJ1Y3QgY3ZteF9taW9fZnVzX2RhdDBfcyBjbjMxeHg7CisJc3RydWN0IGN2bXhfbWlvX2Z1c19kYXQwX3MgY24zOHh4OworCXN0cnVjdCBjdm14X21pb19mdXNfZGF0MF9zIGNuMzh4eHAyOworCXN0cnVjdCBjdm14X21pb19mdXNfZGF0MF9zIGNuNTB4eDsKKwlzdHJ1Y3QgY3ZteF9taW9fZnVzX2RhdDBfcyBjbjUyeHg7CisJc3RydWN0IGN2bXhfbWlvX2Z1c19kYXQwX3MgY241Mnh4cDE7CisJc3RydWN0IGN2bXhfbWlvX2Z1c19kYXQwX3MgY241Nnh4OworCXN0cnVjdCBjdm14X21pb19mdXNfZGF0MF9zIGNuNTZ4eHAxOworCXN0cnVjdCBjdm14X21pb19mdXNfZGF0MF9zIGNuNTh4eDsKKwlzdHJ1Y3QgY3ZteF9taW9fZnVzX2RhdDBfcyBjbjU4eHhwMTsKK307CisKK3VuaW9uIGN2bXhfbWlvX2Z1c19kYXQxIHsKKwl1aW50NjRfdCB1NjQ7CisJc3RydWN0IGN2bXhfbWlvX2Z1c19kYXQxX3MgeworCQl1aW50NjRfdCByZXNlcnZlZF8zMl82MzozMjsKKwkJdWludDY0X3QgbWFuX2luZm86MzI7CisJfSBzOworCXN0cnVjdCBjdm14X21pb19mdXNfZGF0MV9zIGNuMzB4eDsKKwlzdHJ1Y3QgY3ZteF9taW9fZnVzX2RhdDFfcyBjbjMxeHg7CisJc3RydWN0IGN2bXhfbWlvX2Z1c19kYXQxX3MgY24zOHh4OworCXN0cnVjdCBjdm14X21pb19mdXNfZGF0MV9zIGNuMzh4eHAyOworCXN0cnVjdCBjdm14X21pb19mdXNfZGF0MV9zIGNuNTB4eDsKKwlzdHJ1Y3QgY3ZteF9taW9fZnVzX2RhdDFfcyBjbjUyeHg7CisJc3RydWN0IGN2bXhfbWlvX2Z1c19kYXQxX3MgY241Mnh4cDE7CisJc3RydWN0IGN2bXhfbWlvX2Z1c19kYXQxX3MgY241Nnh4OworCXN0cnVjdCBjdm14X21pb19mdXNfZGF0MV9zIGNuNTZ4eHAxOworCXN0cnVjdCBjdm14X21pb19mdXNfZGF0MV9zIGNuNTh4eDsKKwlzdHJ1Y3QgY3ZteF9taW9fZnVzX2RhdDFfcyBjbjU4eHhwMTsKK307CisKK3VuaW9uIGN2bXhfbWlvX2Z1c19kYXQyIHsKKwl1aW50NjRfdCB1NjQ7CisJc3RydWN0IGN2bXhfbWlvX2Z1c19kYXQyX3MgeworCQl1aW50NjRfdCByZXNlcnZlZF8zNF82MzozMDsKKwkJdWludDY0X3QgZnVzMzE4OjE7CisJCXVpbnQ2NF90IHJhaWRfZW46MTsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfMzBfMzE6MjsKKwkJdWludDY0X3Qgbm9rYXN1OjE7CisJCXVpbnQ2NF90IG5vZGZhX2NwMjoxOworCQl1aW50NjRfdCBub211bDoxOworCQl1aW50NjRfdCBub2NyeXB0bzoxOworCQl1aW50NjRfdCByc3Rfc2h0OjE7CisJCXVpbnQ2NF90IGJpc3RfZGlzOjE7CisJCXVpbnQ2NF90IGNoaXBfaWQ6ODsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfMF8xNToxNjsKKwl9IHM7CisJc3RydWN0IGN2bXhfbWlvX2Z1c19kYXQyX2NuMzB4eCB7CisJCXVpbnQ2NF90IHJlc2VydmVkXzI5XzYzOjM1OworCQl1aW50NjRfdCBub2RmYV9jcDI6MTsKKwkJdWludDY0X3Qgbm9tdWw6MTsKKwkJdWludDY0X3Qgbm9jcnlwdG86MTsKKwkJdWludDY0X3QgcnN0X3NodDoxOworCQl1aW50NjRfdCBiaXN0X2RpczoxOworCQl1aW50NjRfdCBjaGlwX2lkOjg7CisJCXVpbnQ2NF90IHBsbF9vZmY6NDsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfMV8xMToxMTsKKwkJdWludDY0X3QgcHBfZGlzOjE7CisJfSBjbjMweHg7CisJc3RydWN0IGN2bXhfbWlvX2Z1c19kYXQyX2NuMzF4eCB7CisJCXVpbnQ2NF90IHJlc2VydmVkXzI5XzYzOjM1OworCQl1aW50NjRfdCBub2RmYV9jcDI6MTsKKwkJdWludDY0X3Qgbm9tdWw6MTsKKwkJdWludDY0X3Qgbm9jcnlwdG86MTsKKwkJdWludDY0X3QgcnN0X3NodDoxOworCQl1aW50NjRfdCBiaXN0X2RpczoxOworCQl1aW50NjRfdCBjaGlwX2lkOjg7CisJCXVpbnQ2NF90IHBsbF9vZmY6NDsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfMl8xMToxMDsKKwkJdWludDY0X3QgcHBfZGlzOjI7CisJfSBjbjMxeHg7CisJc3RydWN0IGN2bXhfbWlvX2Z1c19kYXQyX2NuMzh4eCB7CisJCXVpbnQ2NF90IHJlc2VydmVkXzI5XzYzOjM1OworCQl1aW50NjRfdCBub2RmYV9jcDI6MTsKKwkJdWludDY0X3Qgbm9tdWw6MTsKKwkJdWludDY0X3Qgbm9jcnlwdG86MTsKKwkJdWludDY0X3QgcnN0X3NodDoxOworCQl1aW50NjRfdCBiaXN0X2RpczoxOworCQl1aW50NjRfdCBjaGlwX2lkOjg7CisJCXVpbnQ2NF90IHBwX2RpczoxNjsKKwl9IGNuMzh4eDsKKwlzdHJ1Y3QgY3ZteF9taW9fZnVzX2RhdDJfY24zOHh4IGNuMzh4eHAyOworCXN0cnVjdCBjdm14X21pb19mdXNfZGF0Ml9jbjUweHggeworCQl1aW50NjRfdCByZXNlcnZlZF8zNF82MzozMDsKKwkJdWludDY0X3QgZnVzMzE4OjE7CisJCXVpbnQ2NF90IHJhaWRfZW46MTsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfMzBfMzE6MjsKKwkJdWludDY0X3Qgbm9rYXN1OjE7CisJCXVpbnQ2NF90IG5vZGZhX2NwMjoxOworCQl1aW50NjRfdCBub211bDoxOworCQl1aW50NjRfdCBub2NyeXB0bzoxOworCQl1aW50NjRfdCByc3Rfc2h0OjE7CisJCXVpbnQ2NF90IGJpc3RfZGlzOjE7CisJCXVpbnQ2NF90IGNoaXBfaWQ6ODsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfMl8xNToxNDsKKwkJdWludDY0X3QgcHBfZGlzOjI7CisJfSBjbjUweHg7CisJc3RydWN0IGN2bXhfbWlvX2Z1c19kYXQyX2NuNTJ4eCB7CisJCXVpbnQ2NF90IHJlc2VydmVkXzM0XzYzOjMwOworCQl1aW50NjRfdCBmdXMzMTg6MTsKKwkJdWludDY0X3QgcmFpZF9lbjoxOworCQl1aW50NjRfdCByZXNlcnZlZF8zMF8zMToyOworCQl1aW50NjRfdCBub2thc3U6MTsKKwkJdWludDY0X3Qgbm9kZmFfY3AyOjE7CisJCXVpbnQ2NF90IG5vbXVsOjE7CisJCXVpbnQ2NF90IG5vY3J5cHRvOjE7CisJCXVpbnQ2NF90IHJzdF9zaHQ6MTsKKwkJdWludDY0X3QgYmlzdF9kaXM6MTsKKwkJdWludDY0X3QgY2hpcF9pZDo4OworCQl1aW50NjRfdCByZXNlcnZlZF80XzE1OjEyOworCQl1aW50NjRfdCBwcF9kaXM6NDsKKwl9IGNuNTJ4eDsKKwlzdHJ1Y3QgY3ZteF9taW9fZnVzX2RhdDJfY241Mnh4IGNuNTJ4eHAxOworCXN0cnVjdCBjdm14X21pb19mdXNfZGF0Ml9jbjU2eHggeworCQl1aW50NjRfdCByZXNlcnZlZF8zNF82MzozMDsKKwkJdWludDY0X3QgZnVzMzE4OjE7CisJCXVpbnQ2NF90IHJhaWRfZW46MTsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfMzBfMzE6MjsKKwkJdWludDY0X3Qgbm9rYXN1OjE7CisJCXVpbnQ2NF90IG5vZGZhX2NwMjoxOworCQl1aW50NjRfdCBub211bDoxOworCQl1aW50NjRfdCBub2NyeXB0bzoxOworCQl1aW50NjRfdCByc3Rfc2h0OjE7CisJCXVpbnQ2NF90IGJpc3RfZGlzOjE7CisJCXVpbnQ2NF90IGNoaXBfaWQ6ODsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfMTJfMTU6NDsKKwkJdWludDY0X3QgcHBfZGlzOjEyOworCX0gY241Nnh4OworCXN0cnVjdCBjdm14X21pb19mdXNfZGF0Ml9jbjU2eHggY241Nnh4cDE7CisJc3RydWN0IGN2bXhfbWlvX2Z1c19kYXQyX2NuNTh4eCB7CisJCXVpbnQ2NF90IHJlc2VydmVkXzMwXzYzOjM0OworCQl1aW50NjRfdCBub2thc3U6MTsKKwkJdWludDY0X3Qgbm9kZmFfY3AyOjE7CisJCXVpbnQ2NF90IG5vbXVsOjE7CisJCXVpbnQ2NF90IG5vY3J5cHRvOjE7CisJCXVpbnQ2NF90IHJzdF9zaHQ6MTsKKwkJdWludDY0X3QgYmlzdF9kaXM6MTsKKwkJdWludDY0X3QgY2hpcF9pZDo4OworCQl1aW50NjRfdCBwcF9kaXM6MTY7CisJfSBjbjU4eHg7CisJc3RydWN0IGN2bXhfbWlvX2Z1c19kYXQyX2NuNTh4eCBjbjU4eHhwMTsKK307CisKK3VuaW9uIGN2bXhfbWlvX2Z1c19kYXQzIHsKKwl1aW50NjRfdCB1NjQ7CisJc3RydWN0IGN2bXhfbWlvX2Z1c19kYXQzX3MgeworCQl1aW50NjRfdCByZXNlcnZlZF8zMl82MzozMjsKKwkJdWludDY0X3QgcGxsX2RpdjQ6MTsKKwkJdWludDY0X3QgemlwX2NyaXA6MjsKKwkJdWludDY0X3QgYmFyMl9lbjoxOworCQl1aW50NjRfdCBlZnVzX2xjazoxOworCQl1aW50NjRfdCBlZnVzX2lnbjoxOworCQl1aW50NjRfdCBub3ppcDoxOworCQl1aW50NjRfdCBub2RmYV9kdGU6MTsKKwkJdWludDY0X3QgaWNhY2hlOjI0OworCX0gczsKKwlzdHJ1Y3QgY3ZteF9taW9fZnVzX2RhdDNfY24zMHh4IHsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfMzJfNjM6MzI7CisJCXVpbnQ2NF90IHBsbF9kaXY0OjE7CisJCXVpbnQ2NF90IHJlc2VydmVkXzI5XzMwOjI7CisJCXVpbnQ2NF90IGJhcjJfZW46MTsKKwkJdWludDY0X3QgZWZ1c19sY2s6MTsKKwkJdWludDY0X3QgZWZ1c19pZ246MTsKKwkJdWludDY0X3Qgbm96aXA6MTsKKwkJdWludDY0X3Qgbm9kZmFfZHRlOjE7CisJCXVpbnQ2NF90IGljYWNoZToyNDsKKwl9IGNuMzB4eDsKKwlzdHJ1Y3QgY3ZteF9taW9fZnVzX2RhdDNfcyBjbjMxeHg7CisJc3RydWN0IGN2bXhfbWlvX2Z1c19kYXQzX2NuMzh4eCB7CisJCXVpbnQ2NF90IHJlc2VydmVkXzMxXzYzOjMzOworCQl1aW50NjRfdCB6aXBfY3JpcDoyOworCQl1aW50NjRfdCBiYXIyX2VuOjE7CisJCXVpbnQ2NF90IGVmdXNfbGNrOjE7CisJCXVpbnQ2NF90IGVmdXNfaWduOjE7CisJCXVpbnQ2NF90IG5vemlwOjE7CisJCXVpbnQ2NF90IG5vZGZhX2R0ZToxOworCQl1aW50NjRfdCBpY2FjaGU6MjQ7CisJfSBjbjM4eHg7CisJc3RydWN0IGN2bXhfbWlvX2Z1c19kYXQzX2NuMzh4eHAyIHsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfMjlfNjM6MzU7CisJCXVpbnQ2NF90IGJhcjJfZW46MTsKKwkJdWludDY0X3QgZWZ1c19sY2s6MTsKKwkJdWludDY0X3QgZWZ1c19pZ246MTsKKwkJdWludDY0X3Qgbm96aXA6MTsKKwkJdWludDY0X3Qgbm9kZmFfZHRlOjE7CisJCXVpbnQ2NF90IGljYWNoZToyNDsKKwl9IGNuMzh4eHAyOworCXN0cnVjdCBjdm14X21pb19mdXNfZGF0M19jbjM4eHggY241MHh4OworCXN0cnVjdCBjdm14X21pb19mdXNfZGF0M19jbjM4eHggY241Mnh4OworCXN0cnVjdCBjdm14X21pb19mdXNfZGF0M19jbjM4eHggY241Mnh4cDE7CisJc3RydWN0IGN2bXhfbWlvX2Z1c19kYXQzX2NuMzh4eCBjbjU2eHg7CisJc3RydWN0IGN2bXhfbWlvX2Z1c19kYXQzX2NuMzh4eCBjbjU2eHhwMTsKKwlzdHJ1Y3QgY3ZteF9taW9fZnVzX2RhdDNfY24zOHh4IGNuNTh4eDsKKwlzdHJ1Y3QgY3ZteF9taW9fZnVzX2RhdDNfY24zOHh4IGNuNTh4eHAxOworfTsKKwordW5pb24gY3ZteF9taW9fZnVzX2VtYSB7CisJdWludDY0X3QgdTY0OworCXN0cnVjdCBjdm14X21pb19mdXNfZW1hX3MgeworCQl1aW50NjRfdCByZXNlcnZlZF83XzYzOjU3OworCQl1aW50NjRfdCBlZmZfZW1hOjM7CisJCXVpbnQ2NF90IHJlc2VydmVkXzNfMzoxOworCQl1aW50NjRfdCBlbWE6MzsKKwl9IHM7CisJc3RydWN0IGN2bXhfbWlvX2Z1c19lbWFfcyBjbjUweHg7CisJc3RydWN0IGN2bXhfbWlvX2Z1c19lbWFfcyBjbjUyeHg7CisJc3RydWN0IGN2bXhfbWlvX2Z1c19lbWFfcyBjbjUyeHhwMTsKKwlzdHJ1Y3QgY3ZteF9taW9fZnVzX2VtYV9zIGNuNTZ4eDsKKwlzdHJ1Y3QgY3ZteF9taW9fZnVzX2VtYV9zIGNuNTZ4eHAxOworCXN0cnVjdCBjdm14X21pb19mdXNfZW1hX2NuNTh4eCB7CisJCXVpbnQ2NF90IHJlc2VydmVkXzJfNjM6NjI7CisJCXVpbnQ2NF90IGVtYToyOworCX0gY241OHh4OworCXN0cnVjdCBjdm14X21pb19mdXNfZW1hX2NuNTh4eCBjbjU4eHhwMTsKK307CisKK3VuaW9uIGN2bXhfbWlvX2Z1c19wZGYgeworCXVpbnQ2NF90IHU2NDsKKwlzdHJ1Y3QgY3ZteF9taW9fZnVzX3BkZl9zIHsKKwkJdWludDY0X3QgcGRmOjY0OworCX0gczsKKwlzdHJ1Y3QgY3ZteF9taW9fZnVzX3BkZl9zIGNuNTB4eDsKKwlzdHJ1Y3QgY3ZteF9taW9fZnVzX3BkZl9zIGNuNTJ4eDsKKwlzdHJ1Y3QgY3ZteF9taW9fZnVzX3BkZl9zIGNuNTJ4eHAxOworCXN0cnVjdCBjdm14X21pb19mdXNfcGRmX3MgY241Nnh4OworCXN0cnVjdCBjdm14X21pb19mdXNfcGRmX3MgY241Nnh4cDE7CisJc3RydWN0IGN2bXhfbWlvX2Z1c19wZGZfcyBjbjU4eHg7Cit9OworCit1bmlvbiBjdm14X21pb19mdXNfcGxsIHsKKwl1aW50NjRfdCB1NjQ7CisJc3RydWN0IGN2bXhfbWlvX2Z1c19wbGxfcyB7CisJCXVpbnQ2NF90IHJlc2VydmVkXzJfNjM6NjI7CisJCXVpbnQ2NF90IHJmc2xpcDoxOworCQl1aW50NjRfdCBmYnNsaXA6MTsKKwl9IHM7CisJc3RydWN0IGN2bXhfbWlvX2Z1c19wbGxfcyBjbjUweHg7CisJc3RydWN0IGN2bXhfbWlvX2Z1c19wbGxfcyBjbjUyeHg7CisJc3RydWN0IGN2bXhfbWlvX2Z1c19wbGxfcyBjbjUyeHhwMTsKKwlzdHJ1Y3QgY3ZteF9taW9fZnVzX3BsbF9zIGNuNTZ4eDsKKwlzdHJ1Y3QgY3ZteF9taW9fZnVzX3BsbF9zIGNuNTZ4eHAxOworCXN0cnVjdCBjdm14X21pb19mdXNfcGxsX3MgY241OHh4OworCXN0cnVjdCBjdm14X21pb19mdXNfcGxsX3MgY241OHh4cDE7Cit9OworCit1bmlvbiBjdm14X21pb19mdXNfcHJvZyB7CisJdWludDY0X3QgdTY0OworCXN0cnVjdCBjdm14X21pb19mdXNfcHJvZ19zIHsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfMV82Mzo2MzsKKwkJdWludDY0X3QgcHJvZzoxOworCX0gczsKKwlzdHJ1Y3QgY3ZteF9taW9fZnVzX3Byb2dfcyBjbjMweHg7CisJc3RydWN0IGN2bXhfbWlvX2Z1c19wcm9nX3MgY24zMXh4OworCXN0cnVjdCBjdm14X21pb19mdXNfcHJvZ19zIGNuMzh4eDsKKwlzdHJ1Y3QgY3ZteF9taW9fZnVzX3Byb2dfcyBjbjM4eHhwMjsKKwlzdHJ1Y3QgY3ZteF9taW9fZnVzX3Byb2dfcyBjbjUweHg7CisJc3RydWN0IGN2bXhfbWlvX2Z1c19wcm9nX3MgY241Mnh4OworCXN0cnVjdCBjdm14X21pb19mdXNfcHJvZ19zIGNuNTJ4eHAxOworCXN0cnVjdCBjdm14X21pb19mdXNfcHJvZ19zIGNuNTZ4eDsKKwlzdHJ1Y3QgY3ZteF9taW9fZnVzX3Byb2dfcyBjbjU2eHhwMTsKKwlzdHJ1Y3QgY3ZteF9taW9fZnVzX3Byb2dfcyBjbjU4eHg7CisJc3RydWN0IGN2bXhfbWlvX2Z1c19wcm9nX3MgY241OHh4cDE7Cit9OworCit1bmlvbiBjdm14X21pb19mdXNfcHJvZ190aW1lcyB7CisJdWludDY0X3QgdTY0OworCXN0cnVjdCBjdm14X21pb19mdXNfcHJvZ190aW1lc19zIHsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfMzNfNjM6MzE7CisJCXVpbnQ2NF90IHByb2dfcGluOjE7CisJCXVpbnQ2NF90IG91dDo4OworCQl1aW50NjRfdCBzY2xrX2xvOjQ7CisJCXVpbnQ2NF90IHNjbGtfaGk6MTI7CisJCXVpbnQ2NF90IHNldHVwOjg7CisJfSBzOworCXN0cnVjdCBjdm14X21pb19mdXNfcHJvZ190aW1lc19zIGNuNTB4eDsKKwlzdHJ1Y3QgY3ZteF9taW9fZnVzX3Byb2dfdGltZXNfcyBjbjUyeHg7CisJc3RydWN0IGN2bXhfbWlvX2Z1c19wcm9nX3RpbWVzX3MgY241Mnh4cDE7CisJc3RydWN0IGN2bXhfbWlvX2Z1c19wcm9nX3RpbWVzX3MgY241Nnh4OworCXN0cnVjdCBjdm14X21pb19mdXNfcHJvZ190aW1lc19zIGNuNTZ4eHAxOworCXN0cnVjdCBjdm14X21pb19mdXNfcHJvZ190aW1lc19zIGNuNTh4eDsKKwlzdHJ1Y3QgY3ZteF9taW9fZnVzX3Byb2dfdGltZXNfcyBjbjU4eHhwMTsKK307CisKK3VuaW9uIGN2bXhfbWlvX2Z1c19yY21kIHsKKwl1aW50NjRfdCB1NjQ7CisJc3RydWN0IGN2bXhfbWlvX2Z1c19yY21kX3MgeworCQl1aW50NjRfdCByZXNlcnZlZF8yNF82Mzo0MDsKKwkJdWludDY0X3QgZGF0Ojg7CisJCXVpbnQ2NF90IHJlc2VydmVkXzEzXzE1OjM7CisJCXVpbnQ2NF90IHBlbmQ6MTsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfOV8xMTozOworCQl1aW50NjRfdCBlZnVzZToxOworCQl1aW50NjRfdCBhZGRyOjg7CisJfSBzOworCXN0cnVjdCBjdm14X21pb19mdXNfcmNtZF9jbjMweHggeworCQl1aW50NjRfdCByZXNlcnZlZF8yNF82Mzo0MDsKKwkJdWludDY0X3QgZGF0Ojg7CisJCXVpbnQ2NF90IHJlc2VydmVkXzEzXzE1OjM7CisJCXVpbnQ2NF90IHBlbmQ6MTsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfOV8xMTozOworCQl1aW50NjRfdCBlZnVzZToxOworCQl1aW50NjRfdCByZXNlcnZlZF83Xzc6MTsKKwkJdWludDY0X3QgYWRkcjo3OworCX0gY24zMHh4OworCXN0cnVjdCBjdm14X21pb19mdXNfcmNtZF9jbjMweHggY24zMXh4OworCXN0cnVjdCBjdm14X21pb19mdXNfcmNtZF9jbjMweHggY24zOHh4OworCXN0cnVjdCBjdm14X21pb19mdXNfcmNtZF9jbjMweHggY24zOHh4cDI7CisJc3RydWN0IGN2bXhfbWlvX2Z1c19yY21kX2NuMzB4eCBjbjUweHg7CisJc3RydWN0IGN2bXhfbWlvX2Z1c19yY21kX3MgY241Mnh4OworCXN0cnVjdCBjdm14X21pb19mdXNfcmNtZF9zIGNuNTJ4eHAxOworCXN0cnVjdCBjdm14X21pb19mdXNfcmNtZF9zIGNuNTZ4eDsKKwlzdHJ1Y3QgY3ZteF9taW9fZnVzX3JjbWRfcyBjbjU2eHhwMTsKKwlzdHJ1Y3QgY3ZteF9taW9fZnVzX3JjbWRfY24zMHh4IGNuNTh4eDsKKwlzdHJ1Y3QgY3ZteF9taW9fZnVzX3JjbWRfY24zMHh4IGNuNTh4eHAxOworfTsKKwordW5pb24gY3ZteF9taW9fZnVzX3Nwcl9yZXBhaXJfcmVzIHsKKwl1aW50NjRfdCB1NjQ7CisJc3RydWN0IGN2bXhfbWlvX2Z1c19zcHJfcmVwYWlyX3Jlc19zIHsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfNDJfNjM6MjI7CisJCXVpbnQ2NF90IHJlcGFpcjI6MTQ7CisJCXVpbnQ2NF90IHJlcGFpcjE6MTQ7CisJCXVpbnQ2NF90IHJlcGFpcjA6MTQ7CisJfSBzOworCXN0cnVjdCBjdm14X21pb19mdXNfc3ByX3JlcGFpcl9yZXNfcyBjbjMweHg7CisJc3RydWN0IGN2bXhfbWlvX2Z1c19zcHJfcmVwYWlyX3Jlc19zIGNuMzF4eDsKKwlzdHJ1Y3QgY3ZteF9taW9fZnVzX3Nwcl9yZXBhaXJfcmVzX3MgY24zOHh4OworCXN0cnVjdCBjdm14X21pb19mdXNfc3ByX3JlcGFpcl9yZXNfcyBjbjUweHg7CisJc3RydWN0IGN2bXhfbWlvX2Z1c19zcHJfcmVwYWlyX3Jlc19zIGNuNTJ4eDsKKwlzdHJ1Y3QgY3ZteF9taW9fZnVzX3Nwcl9yZXBhaXJfcmVzX3MgY241Mnh4cDE7CisJc3RydWN0IGN2bXhfbWlvX2Z1c19zcHJfcmVwYWlyX3Jlc19zIGNuNTZ4eDsKKwlzdHJ1Y3QgY3ZteF9taW9fZnVzX3Nwcl9yZXBhaXJfcmVzX3MgY241Nnh4cDE7CisJc3RydWN0IGN2bXhfbWlvX2Z1c19zcHJfcmVwYWlyX3Jlc19zIGNuNTh4eDsKKwlzdHJ1Y3QgY3ZteF9taW9fZnVzX3Nwcl9yZXBhaXJfcmVzX3MgY241OHh4cDE7Cit9OworCit1bmlvbiBjdm14X21pb19mdXNfc3ByX3JlcGFpcl9zdW0geworCXVpbnQ2NF90IHU2NDsKKwlzdHJ1Y3QgY3ZteF9taW9fZnVzX3Nwcl9yZXBhaXJfc3VtX3MgeworCQl1aW50NjRfdCByZXNlcnZlZF8xXzYzOjYzOworCQl1aW50NjRfdCB0b29fbWFueToxOworCX0gczsKKwlzdHJ1Y3QgY3ZteF9taW9fZnVzX3Nwcl9yZXBhaXJfc3VtX3MgY24zMHh4OworCXN0cnVjdCBjdm14X21pb19mdXNfc3ByX3JlcGFpcl9zdW1fcyBjbjMxeHg7CisJc3RydWN0IGN2bXhfbWlvX2Z1c19zcHJfcmVwYWlyX3N1bV9zIGNuMzh4eDsKKwlzdHJ1Y3QgY3ZteF9taW9fZnVzX3Nwcl9yZXBhaXJfc3VtX3MgY241MHh4OworCXN0cnVjdCBjdm14X21pb19mdXNfc3ByX3JlcGFpcl9zdW1fcyBjbjUyeHg7CisJc3RydWN0IGN2bXhfbWlvX2Z1c19zcHJfcmVwYWlyX3N1bV9zIGNuNTJ4eHAxOworCXN0cnVjdCBjdm14X21pb19mdXNfc3ByX3JlcGFpcl9zdW1fcyBjbjU2eHg7CisJc3RydWN0IGN2bXhfbWlvX2Z1c19zcHJfcmVwYWlyX3N1bV9zIGNuNTZ4eHAxOworCXN0cnVjdCBjdm14X21pb19mdXNfc3ByX3JlcGFpcl9zdW1fcyBjbjU4eHg7CisJc3RydWN0IGN2bXhfbWlvX2Z1c19zcHJfcmVwYWlyX3N1bV9zIGNuNTh4eHAxOworfTsKKwordW5pb24gY3ZteF9taW9fZnVzX3VubG9jayB7CisJdWludDY0X3QgdTY0OworCXN0cnVjdCBjdm14X21pb19mdXNfdW5sb2NrX3MgeworCQl1aW50NjRfdCByZXNlcnZlZF8yNF82Mzo0MDsKKwkJdWludDY0X3Qga2V5OjI0OworCX0gczsKKwlzdHJ1Y3QgY3ZteF9taW9fZnVzX3VubG9ja19zIGNuMzB4eDsKKwlzdHJ1Y3QgY3ZteF9taW9fZnVzX3VubG9ja19zIGNuMzF4eDsKK307CisKK3VuaW9uIGN2bXhfbWlvX2Z1c193YWRyIHsKKwl1aW50NjRfdCB1NjQ7CisJc3RydWN0IGN2bXhfbWlvX2Z1c193YWRyX3MgeworCQl1aW50NjRfdCByZXNlcnZlZF8xMF82Mzo1NDsKKwkJdWludDY0X3QgYWRkcjoxMDsKKwl9IHM7CisJc3RydWN0IGN2bXhfbWlvX2Z1c193YWRyX3MgY24zMHh4OworCXN0cnVjdCBjdm14X21pb19mdXNfd2Fkcl9zIGNuMzF4eDsKKwlzdHJ1Y3QgY3ZteF9taW9fZnVzX3dhZHJfcyBjbjM4eHg7CisJc3RydWN0IGN2bXhfbWlvX2Z1c193YWRyX3MgY24zOHh4cDI7CisJc3RydWN0IGN2bXhfbWlvX2Z1c193YWRyX2NuNTB4eCB7CisJCXVpbnQ2NF90IHJlc2VydmVkXzJfNjM6NjI7CisJCXVpbnQ2NF90IGFkZHI6MjsKKwl9IGNuNTB4eDsKKwlzdHJ1Y3QgY3ZteF9taW9fZnVzX3dhZHJfY241Mnh4IHsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfM182Mzo2MTsKKwkJdWludDY0X3QgYWRkcjozOworCX0gY241Mnh4OworCXN0cnVjdCBjdm14X21pb19mdXNfd2Fkcl9jbjUyeHggY241Mnh4cDE7CisJc3RydWN0IGN2bXhfbWlvX2Z1c193YWRyX2NuNTJ4eCBjbjU2eHg7CisJc3RydWN0IGN2bXhfbWlvX2Z1c193YWRyX2NuNTJ4eCBjbjU2eHhwMTsKKwlzdHJ1Y3QgY3ZteF9taW9fZnVzX3dhZHJfY241MHh4IGNuNTh4eDsKKwlzdHJ1Y3QgY3ZteF9taW9fZnVzX3dhZHJfY241MHh4IGNuNTh4eHAxOworfTsKKwordW5pb24gY3ZteF9taW9fbmRmX2RtYV9jZmcgeworCXVpbnQ2NF90IHU2NDsKKwlzdHJ1Y3QgY3ZteF9taW9fbmRmX2RtYV9jZmdfcyB7CisJCXVpbnQ2NF90IGVuOjE7CisJCXVpbnQ2NF90IHJ3OjE7CisJCXVpbnQ2NF90IGNscjoxOworCQl1aW50NjRfdCByZXNlcnZlZF82MF82MDoxOworCQl1aW50NjRfdCBzd2FwMzI6MTsKKwkJdWludDY0X3Qgc3dhcDE2OjE7CisJCXVpbnQ2NF90IHN3YXA4OjE7CisJCXVpbnQ2NF90IGVuZGlhbjoxOworCQl1aW50NjRfdCBzaXplOjIwOworCQl1aW50NjRfdCBhZHI6MzY7CisJfSBzOworCXN0cnVjdCBjdm14X21pb19uZGZfZG1hX2NmZ19zIGNuNTJ4eDsKK307CisKK3VuaW9uIGN2bXhfbWlvX25kZl9kbWFfaW50IHsKKwl1aW50NjRfdCB1NjQ7CisJc3RydWN0IGN2bXhfbWlvX25kZl9kbWFfaW50X3MgeworCQl1aW50NjRfdCByZXNlcnZlZF8xXzYzOjYzOworCQl1aW50NjRfdCBkb25lOjE7CisJfSBzOworCXN0cnVjdCBjdm14X21pb19uZGZfZG1hX2ludF9zIGNuNTJ4eDsKK307CisKK3VuaW9uIGN2bXhfbWlvX25kZl9kbWFfaW50X2VuIHsKKwl1aW50NjRfdCB1NjQ7CisJc3RydWN0IGN2bXhfbWlvX25kZl9kbWFfaW50X2VuX3MgeworCQl1aW50NjRfdCByZXNlcnZlZF8xXzYzOjYzOworCQl1aW50NjRfdCBkb25lOjE7CisJfSBzOworCXN0cnVjdCBjdm14X21pb19uZGZfZG1hX2ludF9lbl9zIGNuNTJ4eDsKK307CisKK3VuaW9uIGN2bXhfbWlvX3BsbF9jdGwgeworCXVpbnQ2NF90IHU2NDsKKwlzdHJ1Y3QgY3ZteF9taW9fcGxsX2N0bF9zIHsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfNV82Mzo1OTsKKwkJdWludDY0X3QgYndfY3RsOjU7CisJfSBzOworCXN0cnVjdCBjdm14X21pb19wbGxfY3RsX3MgY24zMHh4OworCXN0cnVjdCBjdm14X21pb19wbGxfY3RsX3MgY24zMXh4OworfTsKKwordW5pb24gY3ZteF9taW9fcGxsX3NldHRpbmcgeworCXVpbnQ2NF90IHU2NDsKKwlzdHJ1Y3QgY3ZteF9taW9fcGxsX3NldHRpbmdfcyB7CisJCXVpbnQ2NF90IHJlc2VydmVkXzE3XzYzOjQ3OworCQl1aW50NjRfdCBzZXR0aW5nOjE3OworCX0gczsKKwlzdHJ1Y3QgY3ZteF9taW9fcGxsX3NldHRpbmdfcyBjbjMweHg7CisJc3RydWN0IGN2bXhfbWlvX3BsbF9zZXR0aW5nX3MgY24zMXh4OworfTsKKwordW5pb24gY3ZteF9taW9fdHdzeF9pbnQgeworCXVpbnQ2NF90IHU2NDsKKwlzdHJ1Y3QgY3ZteF9taW9fdHdzeF9pbnRfcyB7CisJCXVpbnQ2NF90IHJlc2VydmVkXzEyXzYzOjUyOworCQl1aW50NjRfdCBzY2w6MTsKKwkJdWludDY0X3Qgc2RhOjE7CisJCXVpbnQ2NF90IHNjbF9vdnI6MTsKKwkJdWludDY0X3Qgc2RhX292cjoxOworCQl1aW50NjRfdCByZXNlcnZlZF83Xzc6MTsKKwkJdWludDY0X3QgY29yZV9lbjoxOworCQl1aW50NjRfdCB0c19lbjoxOworCQl1aW50NjRfdCBzdF9lbjoxOworCQl1aW50NjRfdCByZXNlcnZlZF8zXzM6MTsKKwkJdWludDY0X3QgY29yZV9pbnQ6MTsKKwkJdWludDY0X3QgdHNfaW50OjE7CisJCXVpbnQ2NF90IHN0X2ludDoxOworCX0gczsKKwlzdHJ1Y3QgY3ZteF9taW9fdHdzeF9pbnRfcyBjbjMweHg7CisJc3RydWN0IGN2bXhfbWlvX3R3c3hfaW50X3MgY24zMXh4OworCXN0cnVjdCBjdm14X21pb190d3N4X2ludF9zIGNuMzh4eDsKKwlzdHJ1Y3QgY3ZteF9taW9fdHdzeF9pbnRfY24zOHh4cDIgeworCQl1aW50NjRfdCByZXNlcnZlZF83XzYzOjU3OworCQl1aW50NjRfdCBjb3JlX2VuOjE7CisJCXVpbnQ2NF90IHRzX2VuOjE7CisJCXVpbnQ2NF90IHN0X2VuOjE7CisJCXVpbnQ2NF90IHJlc2VydmVkXzNfMzoxOworCQl1aW50NjRfdCBjb3JlX2ludDoxOworCQl1aW50NjRfdCB0c19pbnQ6MTsKKwkJdWludDY0X3Qgc3RfaW50OjE7CisJfSBjbjM4eHhwMjsKKwlzdHJ1Y3QgY3ZteF9taW9fdHdzeF9pbnRfcyBjbjUweHg7CisJc3RydWN0IGN2bXhfbWlvX3R3c3hfaW50X3MgY241Mnh4OworCXN0cnVjdCBjdm14X21pb190d3N4X2ludF9zIGNuNTJ4eHAxOworCXN0cnVjdCBjdm14X21pb190d3N4X2ludF9zIGNuNTZ4eDsKKwlzdHJ1Y3QgY3ZteF9taW9fdHdzeF9pbnRfcyBjbjU2eHhwMTsKKwlzdHJ1Y3QgY3ZteF9taW9fdHdzeF9pbnRfcyBjbjU4eHg7CisJc3RydWN0IGN2bXhfbWlvX3R3c3hfaW50X3MgY241OHh4cDE7Cit9OworCit1bmlvbiBjdm14X21pb190d3N4X3N3X3R3c2kgeworCXVpbnQ2NF90IHU2NDsKKwlzdHJ1Y3QgY3ZteF9taW9fdHdzeF9zd190d3NpX3MgeworCQl1aW50NjRfdCB2OjE7CisJCXVpbnQ2NF90IHNsb25seToxOworCQl1aW50NjRfdCBlaWE6MTsKKwkJdWludDY0X3Qgb3A6NDsKKwkJdWludDY0X3QgcjoxOworCQl1aW50NjRfdCBzb3ZyOjE7CisJCXVpbnQ2NF90IHNpemU6MzsKKwkJdWludDY0X3Qgc2NyOjI7CisJCXVpbnQ2NF90IGE6MTA7CisJCXVpbnQ2NF90IGlhOjU7CisJCXVpbnQ2NF90IGVvcF9pYTozOworCQl1aW50NjRfdCBkOjMyOworCX0gczsKKwlzdHJ1Y3QgY3ZteF9taW9fdHdzeF9zd190d3NpX3MgY24zMHh4OworCXN0cnVjdCBjdm14X21pb190d3N4X3N3X3R3c2lfcyBjbjMxeHg7CisJc3RydWN0IGN2bXhfbWlvX3R3c3hfc3dfdHdzaV9zIGNuMzh4eDsKKwlzdHJ1Y3QgY3ZteF9taW9fdHdzeF9zd190d3NpX3MgY24zOHh4cDI7CisJc3RydWN0IGN2bXhfbWlvX3R3c3hfc3dfdHdzaV9zIGNuNTB4eDsKKwlzdHJ1Y3QgY3ZteF9taW9fdHdzeF9zd190d3NpX3MgY241Mnh4OworCXN0cnVjdCBjdm14X21pb190d3N4X3N3X3R3c2lfcyBjbjUyeHhwMTsKKwlzdHJ1Y3QgY3ZteF9taW9fdHdzeF9zd190d3NpX3MgY241Nnh4OworCXN0cnVjdCBjdm14X21pb190d3N4X3N3X3R3c2lfcyBjbjU2eHhwMTsKKwlzdHJ1Y3QgY3ZteF9taW9fdHdzeF9zd190d3NpX3MgY241OHh4OworCXN0cnVjdCBjdm14X21pb190d3N4X3N3X3R3c2lfcyBjbjU4eHhwMTsKK307CisKK3VuaW9uIGN2bXhfbWlvX3R3c3hfc3dfdHdzaV9leHQgeworCXVpbnQ2NF90IHU2NDsKKwlzdHJ1Y3QgY3ZteF9taW9fdHdzeF9zd190d3NpX2V4dF9zIHsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfNDBfNjM6MjQ7CisJCXVpbnQ2NF90IGlhOjg7CisJCXVpbnQ2NF90IGQ6MzI7CisJfSBzOworCXN0cnVjdCBjdm14X21pb190d3N4X3N3X3R3c2lfZXh0X3MgY24zMHh4OworCXN0cnVjdCBjdm14X21pb190d3N4X3N3X3R3c2lfZXh0X3MgY24zMXh4OworCXN0cnVjdCBjdm14X21pb190d3N4X3N3X3R3c2lfZXh0X3MgY24zOHh4OworCXN0cnVjdCBjdm14X21pb190d3N4X3N3X3R3c2lfZXh0X3MgY24zOHh4cDI7CisJc3RydWN0IGN2bXhfbWlvX3R3c3hfc3dfdHdzaV9leHRfcyBjbjUweHg7CisJc3RydWN0IGN2bXhfbWlvX3R3c3hfc3dfdHdzaV9leHRfcyBjbjUyeHg7CisJc3RydWN0IGN2bXhfbWlvX3R3c3hfc3dfdHdzaV9leHRfcyBjbjUyeHhwMTsKKwlzdHJ1Y3QgY3ZteF9taW9fdHdzeF9zd190d3NpX2V4dF9zIGNuNTZ4eDsKKwlzdHJ1Y3QgY3ZteF9taW9fdHdzeF9zd190d3NpX2V4dF9zIGNuNTZ4eHAxOworCXN0cnVjdCBjdm14X21pb190d3N4X3N3X3R3c2lfZXh0X3MgY241OHh4OworCXN0cnVjdCBjdm14X21pb190d3N4X3N3X3R3c2lfZXh0X3MgY241OHh4cDE7Cit9OworCit1bmlvbiBjdm14X21pb190d3N4X3R3c2lfc3cgeworCXVpbnQ2NF90IHU2NDsKKwlzdHJ1Y3QgY3ZteF9taW9fdHdzeF90d3NpX3N3X3MgeworCQl1aW50NjRfdCB2OjI7CisJCXVpbnQ2NF90IHJlc2VydmVkXzMyXzYxOjMwOworCQl1aW50NjRfdCBkOjMyOworCX0gczsKKwlzdHJ1Y3QgY3ZteF9taW9fdHdzeF90d3NpX3N3X3MgY24zMHh4OworCXN0cnVjdCBjdm14X21pb190d3N4X3R3c2lfc3dfcyBjbjMxeHg7CisJc3RydWN0IGN2bXhfbWlvX3R3c3hfdHdzaV9zd19zIGNuMzh4eDsKKwlzdHJ1Y3QgY3ZteF9taW9fdHdzeF90d3NpX3N3X3MgY24zOHh4cDI7CisJc3RydWN0IGN2bXhfbWlvX3R3c3hfdHdzaV9zd19zIGNuNTB4eDsKKwlzdHJ1Y3QgY3ZteF9taW9fdHdzeF90d3NpX3N3X3MgY241Mnh4OworCXN0cnVjdCBjdm14X21pb190d3N4X3R3c2lfc3dfcyBjbjUyeHhwMTsKKwlzdHJ1Y3QgY3ZteF9taW9fdHdzeF90d3NpX3N3X3MgY241Nnh4OworCXN0cnVjdCBjdm14X21pb190d3N4X3R3c2lfc3dfcyBjbjU2eHhwMTsKKwlzdHJ1Y3QgY3ZteF9taW9fdHdzeF90d3NpX3N3X3MgY241OHh4OworCXN0cnVjdCBjdm14X21pb190d3N4X3R3c2lfc3dfcyBjbjU4eHhwMTsKK307CisKK3VuaW9uIGN2bXhfbWlvX3VhcnR4X2RsaCB7CisJdWludDY0X3QgdTY0OworCXN0cnVjdCBjdm14X21pb191YXJ0eF9kbGhfcyB7CisJCXVpbnQ2NF90IHJlc2VydmVkXzhfNjM6NTY7CisJCXVpbnQ2NF90IGRsaDo4OworCX0gczsKKwlzdHJ1Y3QgY3ZteF9taW9fdWFydHhfZGxoX3MgY24zMHh4OworCXN0cnVjdCBjdm14X21pb191YXJ0eF9kbGhfcyBjbjMxeHg7CisJc3RydWN0IGN2bXhfbWlvX3VhcnR4X2RsaF9zIGNuMzh4eDsKKwlzdHJ1Y3QgY3ZteF9taW9fdWFydHhfZGxoX3MgY24zOHh4cDI7CisJc3RydWN0IGN2bXhfbWlvX3VhcnR4X2RsaF9zIGNuNTB4eDsKKwlzdHJ1Y3QgY3ZteF9taW9fdWFydHhfZGxoX3MgY241Mnh4OworCXN0cnVjdCBjdm14X21pb191YXJ0eF9kbGhfcyBjbjUyeHhwMTsKKwlzdHJ1Y3QgY3ZteF9taW9fdWFydHhfZGxoX3MgY241Nnh4OworCXN0cnVjdCBjdm14X21pb191YXJ0eF9kbGhfcyBjbjU2eHhwMTsKKwlzdHJ1Y3QgY3ZteF9taW9fdWFydHhfZGxoX3MgY241OHh4OworCXN0cnVjdCBjdm14X21pb191YXJ0eF9kbGhfcyBjbjU4eHhwMTsKK307CisKK3VuaW9uIGN2bXhfbWlvX3VhcnR4X2RsbCB7CisJdWludDY0X3QgdTY0OworCXN0cnVjdCBjdm14X21pb191YXJ0eF9kbGxfcyB7CisJCXVpbnQ2NF90IHJlc2VydmVkXzhfNjM6NTY7CisJCXVpbnQ2NF90IGRsbDo4OworCX0gczsKKwlzdHJ1Y3QgY3ZteF9taW9fdWFydHhfZGxsX3MgY24zMHh4OworCXN0cnVjdCBjdm14X21pb191YXJ0eF9kbGxfcyBjbjMxeHg7CisJc3RydWN0IGN2bXhfbWlvX3VhcnR4X2RsbF9zIGNuMzh4eDsKKwlzdHJ1Y3QgY3ZteF9taW9fdWFydHhfZGxsX3MgY24zOHh4cDI7CisJc3RydWN0IGN2bXhfbWlvX3VhcnR4X2RsbF9zIGNuNTB4eDsKKwlzdHJ1Y3QgY3ZteF9taW9fdWFydHhfZGxsX3MgY241Mnh4OworCXN0cnVjdCBjdm14X21pb191YXJ0eF9kbGxfcyBjbjUyeHhwMTsKKwlzdHJ1Y3QgY3ZteF9taW9fdWFydHhfZGxsX3MgY241Nnh4OworCXN0cnVjdCBjdm14X21pb191YXJ0eF9kbGxfcyBjbjU2eHhwMTsKKwlzdHJ1Y3QgY3ZteF9taW9fdWFydHhfZGxsX3MgY241OHh4OworCXN0cnVjdCBjdm14X21pb191YXJ0eF9kbGxfcyBjbjU4eHhwMTsKK307CisKK3VuaW9uIGN2bXhfbWlvX3VhcnR4X2ZhciB7CisJdWludDY0X3QgdTY0OworCXN0cnVjdCBjdm14X21pb191YXJ0eF9mYXJfcyB7CisJCXVpbnQ2NF90IHJlc2VydmVkXzFfNjM6NjM7CisJCXVpbnQ2NF90IGZhcjoxOworCX0gczsKKwlzdHJ1Y3QgY3ZteF9taW9fdWFydHhfZmFyX3MgY24zMHh4OworCXN0cnVjdCBjdm14X21pb191YXJ0eF9mYXJfcyBjbjMxeHg7CisJc3RydWN0IGN2bXhfbWlvX3VhcnR4X2Zhcl9zIGNuMzh4eDsKKwlzdHJ1Y3QgY3ZteF9taW9fdWFydHhfZmFyX3MgY24zOHh4cDI7CisJc3RydWN0IGN2bXhfbWlvX3VhcnR4X2Zhcl9zIGNuNTB4eDsKKwlzdHJ1Y3QgY3ZteF9taW9fdWFydHhfZmFyX3MgY241Mnh4OworCXN0cnVjdCBjdm14X21pb191YXJ0eF9mYXJfcyBjbjUyeHhwMTsKKwlzdHJ1Y3QgY3ZteF9taW9fdWFydHhfZmFyX3MgY241Nnh4OworCXN0cnVjdCBjdm14X21pb191YXJ0eF9mYXJfcyBjbjU2eHhwMTsKKwlzdHJ1Y3QgY3ZteF9taW9fdWFydHhfZmFyX3MgY241OHh4OworCXN0cnVjdCBjdm14X21pb191YXJ0eF9mYXJfcyBjbjU4eHhwMTsKK307CisKK3VuaW9uIGN2bXhfbWlvX3VhcnR4X2ZjciB7CisJdWludDY0X3QgdTY0OworCXN0cnVjdCBjdm14X21pb191YXJ0eF9mY3JfcyB7CisJCXVpbnQ2NF90IHJlc2VydmVkXzhfNjM6NTY7CisJCXVpbnQ2NF90IHJ4dHJpZzoyOworCQl1aW50NjRfdCB0eHRyaWc6MjsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfM18zOjE7CisJCXVpbnQ2NF90IHR4ZnI6MTsKKwkJdWludDY0X3QgcnhmcjoxOworCQl1aW50NjRfdCBlbjoxOworCX0gczsKKwlzdHJ1Y3QgY3ZteF9taW9fdWFydHhfZmNyX3MgY24zMHh4OworCXN0cnVjdCBjdm14X21pb191YXJ0eF9mY3JfcyBjbjMxeHg7CisJc3RydWN0IGN2bXhfbWlvX3VhcnR4X2Zjcl9zIGNuMzh4eDsKKwlzdHJ1Y3QgY3ZteF9taW9fdWFydHhfZmNyX3MgY24zOHh4cDI7CisJc3RydWN0IGN2bXhfbWlvX3VhcnR4X2Zjcl9zIGNuNTB4eDsKKwlzdHJ1Y3QgY3ZteF9taW9fdWFydHhfZmNyX3MgY241Mnh4OworCXN0cnVjdCBjdm14X21pb191YXJ0eF9mY3JfcyBjbjUyeHhwMTsKKwlzdHJ1Y3QgY3ZteF9taW9fdWFydHhfZmNyX3MgY241Nnh4OworCXN0cnVjdCBjdm14X21pb191YXJ0eF9mY3JfcyBjbjU2eHhwMTsKKwlzdHJ1Y3QgY3ZteF9taW9fdWFydHhfZmNyX3MgY241OHh4OworCXN0cnVjdCBjdm14X21pb191YXJ0eF9mY3JfcyBjbjU4eHhwMTsKK307CisKK3VuaW9uIGN2bXhfbWlvX3VhcnR4X2h0eCB7CisJdWludDY0X3QgdTY0OworCXN0cnVjdCBjdm14X21pb191YXJ0eF9odHhfcyB7CisJCXVpbnQ2NF90IHJlc2VydmVkXzFfNjM6NjM7CisJCXVpbnQ2NF90IGh0eDoxOworCX0gczsKKwlzdHJ1Y3QgY3ZteF9taW9fdWFydHhfaHR4X3MgY24zMHh4OworCXN0cnVjdCBjdm14X21pb191YXJ0eF9odHhfcyBjbjMxeHg7CisJc3RydWN0IGN2bXhfbWlvX3VhcnR4X2h0eF9zIGNuMzh4eDsKKwlzdHJ1Y3QgY3ZteF9taW9fdWFydHhfaHR4X3MgY24zOHh4cDI7CisJc3RydWN0IGN2bXhfbWlvX3VhcnR4X2h0eF9zIGNuNTB4eDsKKwlzdHJ1Y3QgY3ZteF9taW9fdWFydHhfaHR4X3MgY241Mnh4OworCXN0cnVjdCBjdm14X21pb191YXJ0eF9odHhfcyBjbjUyeHhwMTsKKwlzdHJ1Y3QgY3ZteF9taW9fdWFydHhfaHR4X3MgY241Nnh4OworCXN0cnVjdCBjdm14X21pb191YXJ0eF9odHhfcyBjbjU2eHhwMTsKKwlzdHJ1Y3QgY3ZteF9taW9fdWFydHhfaHR4X3MgY241OHh4OworCXN0cnVjdCBjdm14X21pb191YXJ0eF9odHhfcyBjbjU4eHhwMTsKK307CisKK3VuaW9uIGN2bXhfbWlvX3VhcnR4X2llciB7CisJdWludDY0X3QgdTY0OworCXN0cnVjdCBjdm14X21pb191YXJ0eF9pZXJfcyB7CisJCXVpbnQ2NF90IHJlc2VydmVkXzhfNjM6NTY7CisJCXVpbnQ2NF90IHB0aW1lOjE7CisJCXVpbnQ2NF90IHJlc2VydmVkXzRfNjozOworCQl1aW50NjRfdCBlZHNzaToxOworCQl1aW50NjRfdCBlbHNpOjE7CisJCXVpbnQ2NF90IGV0YmVpOjE7CisJCXVpbnQ2NF90IGVyYmZpOjE7CisJfSBzOworCXN0cnVjdCBjdm14X21pb191YXJ0eF9pZXJfcyBjbjMweHg7CisJc3RydWN0IGN2bXhfbWlvX3VhcnR4X2llcl9zIGNuMzF4eDsKKwlzdHJ1Y3QgY3ZteF9taW9fdWFydHhfaWVyX3MgY24zOHh4OworCXN0cnVjdCBjdm14X21pb191YXJ0eF9pZXJfcyBjbjM4eHhwMjsKKwlzdHJ1Y3QgY3ZteF9taW9fdWFydHhfaWVyX3MgY241MHh4OworCXN0cnVjdCBjdm14X21pb191YXJ0eF9pZXJfcyBjbjUyeHg7CisJc3RydWN0IGN2bXhfbWlvX3VhcnR4X2llcl9zIGNuNTJ4eHAxOworCXN0cnVjdCBjdm14X21pb191YXJ0eF9pZXJfcyBjbjU2eHg7CisJc3RydWN0IGN2bXhfbWlvX3VhcnR4X2llcl9zIGNuNTZ4eHAxOworCXN0cnVjdCBjdm14X21pb191YXJ0eF9pZXJfcyBjbjU4eHg7CisJc3RydWN0IGN2bXhfbWlvX3VhcnR4X2llcl9zIGNuNTh4eHAxOworfTsKKwordW5pb24gY3ZteF9taW9fdWFydHhfaWlyIHsKKwl1aW50NjRfdCB1NjQ7CisJc3RydWN0IGN2bXhfbWlvX3VhcnR4X2lpcl9zIHsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfOF82Mzo1NjsKKwkJdWludDY0X3QgZmVuOjI7CisJCXVpbnQ2NF90IHJlc2VydmVkXzRfNToyOworCQl1aW50NjRfdCBpaWQ6NDsKKwl9IHM7CisJc3RydWN0IGN2bXhfbWlvX3VhcnR4X2lpcl9zIGNuMzB4eDsKKwlzdHJ1Y3QgY3ZteF9taW9fdWFydHhfaWlyX3MgY24zMXh4OworCXN0cnVjdCBjdm14X21pb191YXJ0eF9paXJfcyBjbjM4eHg7CisJc3RydWN0IGN2bXhfbWlvX3VhcnR4X2lpcl9zIGNuMzh4eHAyOworCXN0cnVjdCBjdm14X21pb191YXJ0eF9paXJfcyBjbjUweHg7CisJc3RydWN0IGN2bXhfbWlvX3VhcnR4X2lpcl9zIGNuNTJ4eDsKKwlzdHJ1Y3QgY3ZteF9taW9fdWFydHhfaWlyX3MgY241Mnh4cDE7CisJc3RydWN0IGN2bXhfbWlvX3VhcnR4X2lpcl9zIGNuNTZ4eDsKKwlzdHJ1Y3QgY3ZteF9taW9fdWFydHhfaWlyX3MgY241Nnh4cDE7CisJc3RydWN0IGN2bXhfbWlvX3VhcnR4X2lpcl9zIGNuNTh4eDsKKwlzdHJ1Y3QgY3ZteF9taW9fdWFydHhfaWlyX3MgY241OHh4cDE7Cit9OworCit1bmlvbiBjdm14X21pb191YXJ0eF9sY3IgeworCXVpbnQ2NF90IHU2NDsKKwlzdHJ1Y3QgY3ZteF9taW9fdWFydHhfbGNyX3MgeworCQl1aW50NjRfdCByZXNlcnZlZF84XzYzOjU2OworCQl1aW50NjRfdCBkbGFiOjE7CisJCXVpbnQ2NF90IGJyazoxOworCQl1aW50NjRfdCByZXNlcnZlZF81XzU6MTsKKwkJdWludDY0X3QgZXBzOjE7CisJCXVpbnQ2NF90IHBlbjoxOworCQl1aW50NjRfdCBzdG9wOjE7CisJCXVpbnQ2NF90IGNsczoyOworCX0gczsKKwlzdHJ1Y3QgY3ZteF9taW9fdWFydHhfbGNyX3MgY24zMHh4OworCXN0cnVjdCBjdm14X21pb191YXJ0eF9sY3JfcyBjbjMxeHg7CisJc3RydWN0IGN2bXhfbWlvX3VhcnR4X2xjcl9zIGNuMzh4eDsKKwlzdHJ1Y3QgY3ZteF9taW9fdWFydHhfbGNyX3MgY24zOHh4cDI7CisJc3RydWN0IGN2bXhfbWlvX3VhcnR4X2xjcl9zIGNuNTB4eDsKKwlzdHJ1Y3QgY3ZteF9taW9fdWFydHhfbGNyX3MgY241Mnh4OworCXN0cnVjdCBjdm14X21pb191YXJ0eF9sY3JfcyBjbjUyeHhwMTsKKwlzdHJ1Y3QgY3ZteF9taW9fdWFydHhfbGNyX3MgY241Nnh4OworCXN0cnVjdCBjdm14X21pb191YXJ0eF9sY3JfcyBjbjU2eHhwMTsKKwlzdHJ1Y3QgY3ZteF9taW9fdWFydHhfbGNyX3MgY241OHh4OworCXN0cnVjdCBjdm14X21pb191YXJ0eF9sY3JfcyBjbjU4eHhwMTsKK307CisKK3VuaW9uIGN2bXhfbWlvX3VhcnR4X2xzciB7CisJdWludDY0X3QgdTY0OworCXN0cnVjdCBjdm14X21pb191YXJ0eF9sc3JfcyB7CisJCXVpbnQ2NF90IHJlc2VydmVkXzhfNjM6NTY7CisJCXVpbnQ2NF90IGZlcnI6MTsKKwkJdWludDY0X3QgdGVtdDoxOworCQl1aW50NjRfdCB0aHJlOjE7CisJCXVpbnQ2NF90IGJpOjE7CisJCXVpbnQ2NF90IGZlOjE7CisJCXVpbnQ2NF90IHBlOjE7CisJCXVpbnQ2NF90IG9lOjE7CisJCXVpbnQ2NF90IGRyOjE7CisJfSBzOworCXN0cnVjdCBjdm14X21pb191YXJ0eF9sc3JfcyBjbjMweHg7CisJc3RydWN0IGN2bXhfbWlvX3VhcnR4X2xzcl9zIGNuMzF4eDsKKwlzdHJ1Y3QgY3ZteF9taW9fdWFydHhfbHNyX3MgY24zOHh4OworCXN0cnVjdCBjdm14X21pb191YXJ0eF9sc3JfcyBjbjM4eHhwMjsKKwlzdHJ1Y3QgY3ZteF9taW9fdWFydHhfbHNyX3MgY241MHh4OworCXN0cnVjdCBjdm14X21pb191YXJ0eF9sc3JfcyBjbjUyeHg7CisJc3RydWN0IGN2bXhfbWlvX3VhcnR4X2xzcl9zIGNuNTJ4eHAxOworCXN0cnVjdCBjdm14X21pb191YXJ0eF9sc3JfcyBjbjU2eHg7CisJc3RydWN0IGN2bXhfbWlvX3VhcnR4X2xzcl9zIGNuNTZ4eHAxOworCXN0cnVjdCBjdm14X21pb191YXJ0eF9sc3JfcyBjbjU4eHg7CisJc3RydWN0IGN2bXhfbWlvX3VhcnR4X2xzcl9zIGNuNTh4eHAxOworfTsKKwordW5pb24gY3ZteF9taW9fdWFydHhfbWNyIHsKKwl1aW50NjRfdCB1NjQ7CisJc3RydWN0IGN2bXhfbWlvX3VhcnR4X21jcl9zIHsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfNl82Mzo1ODsKKwkJdWludDY0X3QgYWZjZToxOworCQl1aW50NjRfdCBsb29wOjE7CisJCXVpbnQ2NF90IG91dDI6MTsKKwkJdWludDY0X3Qgb3V0MToxOworCQl1aW50NjRfdCBydHM6MTsKKwkJdWludDY0X3QgZHRyOjE7CisJfSBzOworCXN0cnVjdCBjdm14X21pb191YXJ0eF9tY3JfcyBjbjMweHg7CisJc3RydWN0IGN2bXhfbWlvX3VhcnR4X21jcl9zIGNuMzF4eDsKKwlzdHJ1Y3QgY3ZteF9taW9fdWFydHhfbWNyX3MgY24zOHh4OworCXN0cnVjdCBjdm14X21pb191YXJ0eF9tY3JfcyBjbjM4eHhwMjsKKwlzdHJ1Y3QgY3ZteF9taW9fdWFydHhfbWNyX3MgY241MHh4OworCXN0cnVjdCBjdm14X21pb191YXJ0eF9tY3JfcyBjbjUyeHg7CisJc3RydWN0IGN2bXhfbWlvX3VhcnR4X21jcl9zIGNuNTJ4eHAxOworCXN0cnVjdCBjdm14X21pb191YXJ0eF9tY3JfcyBjbjU2eHg7CisJc3RydWN0IGN2bXhfbWlvX3VhcnR4X21jcl9zIGNuNTZ4eHAxOworCXN0cnVjdCBjdm14X21pb191YXJ0eF9tY3JfcyBjbjU4eHg7CisJc3RydWN0IGN2bXhfbWlvX3VhcnR4X21jcl9zIGNuNTh4eHAxOworfTsKKwordW5pb24gY3ZteF9taW9fdWFydHhfbXNyIHsKKwl1aW50NjRfdCB1NjQ7CisJc3RydWN0IGN2bXhfbWlvX3VhcnR4X21zcl9zIHsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfOF82Mzo1NjsKKwkJdWludDY0X3QgZGNkOjE7CisJCXVpbnQ2NF90IHJpOjE7CisJCXVpbnQ2NF90IGRzcjoxOworCQl1aW50NjRfdCBjdHM6MTsKKwkJdWludDY0X3QgZGRjZDoxOworCQl1aW50NjRfdCB0ZXJpOjE7CisJCXVpbnQ2NF90IGRkc3I6MTsKKwkJdWludDY0X3QgZGN0czoxOworCX0gczsKKwlzdHJ1Y3QgY3ZteF9taW9fdWFydHhfbXNyX3MgY24zMHh4OworCXN0cnVjdCBjdm14X21pb191YXJ0eF9tc3JfcyBjbjMxeHg7CisJc3RydWN0IGN2bXhfbWlvX3VhcnR4X21zcl9zIGNuMzh4eDsKKwlzdHJ1Y3QgY3ZteF9taW9fdWFydHhfbXNyX3MgY24zOHh4cDI7CisJc3RydWN0IGN2bXhfbWlvX3VhcnR4X21zcl9zIGNuNTB4eDsKKwlzdHJ1Y3QgY3ZteF9taW9fdWFydHhfbXNyX3MgY241Mnh4OworCXN0cnVjdCBjdm14X21pb191YXJ0eF9tc3JfcyBjbjUyeHhwMTsKKwlzdHJ1Y3QgY3ZteF9taW9fdWFydHhfbXNyX3MgY241Nnh4OworCXN0cnVjdCBjdm14X21pb191YXJ0eF9tc3JfcyBjbjU2eHhwMTsKKwlzdHJ1Y3QgY3ZteF9taW9fdWFydHhfbXNyX3MgY241OHh4OworCXN0cnVjdCBjdm14X21pb191YXJ0eF9tc3JfcyBjbjU4eHhwMTsKK307CisKK3VuaW9uIGN2bXhfbWlvX3VhcnR4X3JiciB7CisJdWludDY0X3QgdTY0OworCXN0cnVjdCBjdm14X21pb191YXJ0eF9yYnJfcyB7CisJCXVpbnQ2NF90IHJlc2VydmVkXzhfNjM6NTY7CisJCXVpbnQ2NF90IHJicjo4OworCX0gczsKKwlzdHJ1Y3QgY3ZteF9taW9fdWFydHhfcmJyX3MgY24zMHh4OworCXN0cnVjdCBjdm14X21pb191YXJ0eF9yYnJfcyBjbjMxeHg7CisJc3RydWN0IGN2bXhfbWlvX3VhcnR4X3Jicl9zIGNuMzh4eDsKKwlzdHJ1Y3QgY3ZteF9taW9fdWFydHhfcmJyX3MgY24zOHh4cDI7CisJc3RydWN0IGN2bXhfbWlvX3VhcnR4X3Jicl9zIGNuNTB4eDsKKwlzdHJ1Y3QgY3ZteF9taW9fdWFydHhfcmJyX3MgY241Mnh4OworCXN0cnVjdCBjdm14X21pb191YXJ0eF9yYnJfcyBjbjUyeHhwMTsKKwlzdHJ1Y3QgY3ZteF9taW9fdWFydHhfcmJyX3MgY241Nnh4OworCXN0cnVjdCBjdm14X21pb191YXJ0eF9yYnJfcyBjbjU2eHhwMTsKKwlzdHJ1Y3QgY3ZteF9taW9fdWFydHhfcmJyX3MgY241OHh4OworCXN0cnVjdCBjdm14X21pb191YXJ0eF9yYnJfcyBjbjU4eHhwMTsKK307CisKK3VuaW9uIGN2bXhfbWlvX3VhcnR4X3JmbCB7CisJdWludDY0X3QgdTY0OworCXN0cnVjdCBjdm14X21pb191YXJ0eF9yZmxfcyB7CisJCXVpbnQ2NF90IHJlc2VydmVkXzdfNjM6NTc7CisJCXVpbnQ2NF90IHJmbDo3OworCX0gczsKKwlzdHJ1Y3QgY3ZteF9taW9fdWFydHhfcmZsX3MgY24zMHh4OworCXN0cnVjdCBjdm14X21pb191YXJ0eF9yZmxfcyBjbjMxeHg7CisJc3RydWN0IGN2bXhfbWlvX3VhcnR4X3JmbF9zIGNuMzh4eDsKKwlzdHJ1Y3QgY3ZteF9taW9fdWFydHhfcmZsX3MgY24zOHh4cDI7CisJc3RydWN0IGN2bXhfbWlvX3VhcnR4X3JmbF9zIGNuNTB4eDsKKwlzdHJ1Y3QgY3ZteF9taW9fdWFydHhfcmZsX3MgY241Mnh4OworCXN0cnVjdCBjdm14X21pb191YXJ0eF9yZmxfcyBjbjUyeHhwMTsKKwlzdHJ1Y3QgY3ZteF9taW9fdWFydHhfcmZsX3MgY241Nnh4OworCXN0cnVjdCBjdm14X21pb191YXJ0eF9yZmxfcyBjbjU2eHhwMTsKKwlzdHJ1Y3QgY3ZteF9taW9fdWFydHhfcmZsX3MgY241OHh4OworCXN0cnVjdCBjdm14X21pb191YXJ0eF9yZmxfcyBjbjU4eHhwMTsKK307CisKK3VuaW9uIGN2bXhfbWlvX3VhcnR4X3JmdyB7CisJdWludDY0X3QgdTY0OworCXN0cnVjdCBjdm14X21pb191YXJ0eF9yZndfcyB7CisJCXVpbnQ2NF90IHJlc2VydmVkXzEwXzYzOjU0OworCQl1aW50NjRfdCByZmZlOjE7CisJCXVpbnQ2NF90IHJmcGU6MTsKKwkJdWludDY0X3QgcmZ3ZDo4OworCX0gczsKKwlzdHJ1Y3QgY3ZteF9taW9fdWFydHhfcmZ3X3MgY24zMHh4OworCXN0cnVjdCBjdm14X21pb191YXJ0eF9yZndfcyBjbjMxeHg7CisJc3RydWN0IGN2bXhfbWlvX3VhcnR4X3Jmd19zIGNuMzh4eDsKKwlzdHJ1Y3QgY3ZteF9taW9fdWFydHhfcmZ3X3MgY24zOHh4cDI7CisJc3RydWN0IGN2bXhfbWlvX3VhcnR4X3Jmd19zIGNuNTB4eDsKKwlzdHJ1Y3QgY3ZteF9taW9fdWFydHhfcmZ3X3MgY241Mnh4OworCXN0cnVjdCBjdm14X21pb191YXJ0eF9yZndfcyBjbjUyeHhwMTsKKwlzdHJ1Y3QgY3ZteF9taW9fdWFydHhfcmZ3X3MgY241Nnh4OworCXN0cnVjdCBjdm14X21pb191YXJ0eF9yZndfcyBjbjU2eHhwMTsKKwlzdHJ1Y3QgY3ZteF9taW9fdWFydHhfcmZ3X3MgY241OHh4OworCXN0cnVjdCBjdm14X21pb191YXJ0eF9yZndfcyBjbjU4eHhwMTsKK307CisKK3VuaW9uIGN2bXhfbWlvX3VhcnR4X3NiY3IgeworCXVpbnQ2NF90IHU2NDsKKwlzdHJ1Y3QgY3ZteF9taW9fdWFydHhfc2Jjcl9zIHsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfMV82Mzo2MzsKKwkJdWludDY0X3Qgc2JjcjoxOworCX0gczsKKwlzdHJ1Y3QgY3ZteF9taW9fdWFydHhfc2Jjcl9zIGNuMzB4eDsKKwlzdHJ1Y3QgY3ZteF9taW9fdWFydHhfc2Jjcl9zIGNuMzF4eDsKKwlzdHJ1Y3QgY3ZteF9taW9fdWFydHhfc2Jjcl9zIGNuMzh4eDsKKwlzdHJ1Y3QgY3ZteF9taW9fdWFydHhfc2Jjcl9zIGNuMzh4eHAyOworCXN0cnVjdCBjdm14X21pb191YXJ0eF9zYmNyX3MgY241MHh4OworCXN0cnVjdCBjdm14X21pb191YXJ0eF9zYmNyX3MgY241Mnh4OworCXN0cnVjdCBjdm14X21pb191YXJ0eF9zYmNyX3MgY241Mnh4cDE7CisJc3RydWN0IGN2bXhfbWlvX3VhcnR4X3NiY3JfcyBjbjU2eHg7CisJc3RydWN0IGN2bXhfbWlvX3VhcnR4X3NiY3JfcyBjbjU2eHhwMTsKKwlzdHJ1Y3QgY3ZteF9taW9fdWFydHhfc2Jjcl9zIGNuNTh4eDsKKwlzdHJ1Y3QgY3ZteF9taW9fdWFydHhfc2Jjcl9zIGNuNTh4eHAxOworfTsKKwordW5pb24gY3ZteF9taW9fdWFydHhfc2NyIHsKKwl1aW50NjRfdCB1NjQ7CisJc3RydWN0IGN2bXhfbWlvX3VhcnR4X3Njcl9zIHsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfOF82Mzo1NjsKKwkJdWludDY0X3Qgc2NyOjg7CisJfSBzOworCXN0cnVjdCBjdm14X21pb191YXJ0eF9zY3JfcyBjbjMweHg7CisJc3RydWN0IGN2bXhfbWlvX3VhcnR4X3Njcl9zIGNuMzF4eDsKKwlzdHJ1Y3QgY3ZteF9taW9fdWFydHhfc2NyX3MgY24zOHh4OworCXN0cnVjdCBjdm14X21pb191YXJ0eF9zY3JfcyBjbjM4eHhwMjsKKwlzdHJ1Y3QgY3ZteF9taW9fdWFydHhfc2NyX3MgY241MHh4OworCXN0cnVjdCBjdm14X21pb191YXJ0eF9zY3JfcyBjbjUyeHg7CisJc3RydWN0IGN2bXhfbWlvX3VhcnR4X3Njcl9zIGNuNTJ4eHAxOworCXN0cnVjdCBjdm14X21pb191YXJ0eF9zY3JfcyBjbjU2eHg7CisJc3RydWN0IGN2bXhfbWlvX3VhcnR4X3Njcl9zIGNuNTZ4eHAxOworCXN0cnVjdCBjdm14X21pb191YXJ0eF9zY3JfcyBjbjU4eHg7CisJc3RydWN0IGN2bXhfbWlvX3VhcnR4X3Njcl9zIGNuNTh4eHAxOworfTsKKwordW5pb24gY3ZteF9taW9fdWFydHhfc2ZlIHsKKwl1aW50NjRfdCB1NjQ7CisJc3RydWN0IGN2bXhfbWlvX3VhcnR4X3NmZV9zIHsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfMV82Mzo2MzsKKwkJdWludDY0X3Qgc2ZlOjE7CisJfSBzOworCXN0cnVjdCBjdm14X21pb191YXJ0eF9zZmVfcyBjbjMweHg7CisJc3RydWN0IGN2bXhfbWlvX3VhcnR4X3NmZV9zIGNuMzF4eDsKKwlzdHJ1Y3QgY3ZteF9taW9fdWFydHhfc2ZlX3MgY24zOHh4OworCXN0cnVjdCBjdm14X21pb191YXJ0eF9zZmVfcyBjbjM4eHhwMjsKKwlzdHJ1Y3QgY3ZteF9taW9fdWFydHhfc2ZlX3MgY241MHh4OworCXN0cnVjdCBjdm14X21pb191YXJ0eF9zZmVfcyBjbjUyeHg7CisJc3RydWN0IGN2bXhfbWlvX3VhcnR4X3NmZV9zIGNuNTJ4eHAxOworCXN0cnVjdCBjdm14X21pb191YXJ0eF9zZmVfcyBjbjU2eHg7CisJc3RydWN0IGN2bXhfbWlvX3VhcnR4X3NmZV9zIGNuNTZ4eHAxOworCXN0cnVjdCBjdm14X21pb191YXJ0eF9zZmVfcyBjbjU4eHg7CisJc3RydWN0IGN2bXhfbWlvX3VhcnR4X3NmZV9zIGNuNTh4eHAxOworfTsKKwordW5pb24gY3ZteF9taW9fdWFydHhfc3JyIHsKKwl1aW50NjRfdCB1NjQ7CisJc3RydWN0IGN2bXhfbWlvX3VhcnR4X3Nycl9zIHsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfM182Mzo2MTsKKwkJdWludDY0X3Qgc3RmcjoxOworCQl1aW50NjRfdCBzcmZyOjE7CisJCXVpbnQ2NF90IHVzcjoxOworCX0gczsKKwlzdHJ1Y3QgY3ZteF9taW9fdWFydHhfc3JyX3MgY24zMHh4OworCXN0cnVjdCBjdm14X21pb191YXJ0eF9zcnJfcyBjbjMxeHg7CisJc3RydWN0IGN2bXhfbWlvX3VhcnR4X3Nycl9zIGNuMzh4eDsKKwlzdHJ1Y3QgY3ZteF9taW9fdWFydHhfc3JyX3MgY24zOHh4cDI7CisJc3RydWN0IGN2bXhfbWlvX3VhcnR4X3Nycl9zIGNuNTB4eDsKKwlzdHJ1Y3QgY3ZteF9taW9fdWFydHhfc3JyX3MgY241Mnh4OworCXN0cnVjdCBjdm14X21pb191YXJ0eF9zcnJfcyBjbjUyeHhwMTsKKwlzdHJ1Y3QgY3ZteF9taW9fdWFydHhfc3JyX3MgY241Nnh4OworCXN0cnVjdCBjdm14X21pb191YXJ0eF9zcnJfcyBjbjU2eHhwMTsKKwlzdHJ1Y3QgY3ZteF9taW9fdWFydHhfc3JyX3MgY241OHh4OworCXN0cnVjdCBjdm14X21pb191YXJ0eF9zcnJfcyBjbjU4eHhwMTsKK307CisKK3VuaW9uIGN2bXhfbWlvX3VhcnR4X3NydCB7CisJdWludDY0X3QgdTY0OworCXN0cnVjdCBjdm14X21pb191YXJ0eF9zcnRfcyB7CisJCXVpbnQ2NF90IHJlc2VydmVkXzJfNjM6NjI7CisJCXVpbnQ2NF90IHNydDoyOworCX0gczsKKwlzdHJ1Y3QgY3ZteF9taW9fdWFydHhfc3J0X3MgY24zMHh4OworCXN0cnVjdCBjdm14X21pb191YXJ0eF9zcnRfcyBjbjMxeHg7CisJc3RydWN0IGN2bXhfbWlvX3VhcnR4X3NydF9zIGNuMzh4eDsKKwlzdHJ1Y3QgY3ZteF9taW9fdWFydHhfc3J0X3MgY24zOHh4cDI7CisJc3RydWN0IGN2bXhfbWlvX3VhcnR4X3NydF9zIGNuNTB4eDsKKwlzdHJ1Y3QgY3ZteF9taW9fdWFydHhfc3J0X3MgY241Mnh4OworCXN0cnVjdCBjdm14X21pb191YXJ0eF9zcnRfcyBjbjUyeHhwMTsKKwlzdHJ1Y3QgY3ZteF9taW9fdWFydHhfc3J0X3MgY241Nnh4OworCXN0cnVjdCBjdm14X21pb191YXJ0eF9zcnRfcyBjbjU2eHhwMTsKKwlzdHJ1Y3QgY3ZteF9taW9fdWFydHhfc3J0X3MgY241OHh4OworCXN0cnVjdCBjdm14X21pb191YXJ0eF9zcnRfcyBjbjU4eHhwMTsKK307CisKK3VuaW9uIGN2bXhfbWlvX3VhcnR4X3NydHMgeworCXVpbnQ2NF90IHU2NDsKKwlzdHJ1Y3QgY3ZteF9taW9fdWFydHhfc3J0c19zIHsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfMV82Mzo2MzsKKwkJdWludDY0X3Qgc3J0czoxOworCX0gczsKKwlzdHJ1Y3QgY3ZteF9taW9fdWFydHhfc3J0c19zIGNuMzB4eDsKKwlzdHJ1Y3QgY3ZteF9taW9fdWFydHhfc3J0c19zIGNuMzF4eDsKKwlzdHJ1Y3QgY3ZteF9taW9fdWFydHhfc3J0c19zIGNuMzh4eDsKKwlzdHJ1Y3QgY3ZteF9taW9fdWFydHhfc3J0c19zIGNuMzh4eHAyOworCXN0cnVjdCBjdm14X21pb191YXJ0eF9zcnRzX3MgY241MHh4OworCXN0cnVjdCBjdm14X21pb191YXJ0eF9zcnRzX3MgY241Mnh4OworCXN0cnVjdCBjdm14X21pb191YXJ0eF9zcnRzX3MgY241Mnh4cDE7CisJc3RydWN0IGN2bXhfbWlvX3VhcnR4X3NydHNfcyBjbjU2eHg7CisJc3RydWN0IGN2bXhfbWlvX3VhcnR4X3NydHNfcyBjbjU2eHhwMTsKKwlzdHJ1Y3QgY3ZteF9taW9fdWFydHhfc3J0c19zIGNuNTh4eDsKKwlzdHJ1Y3QgY3ZteF9taW9fdWFydHhfc3J0c19zIGNuNTh4eHAxOworfTsKKwordW5pb24gY3ZteF9taW9fdWFydHhfc3R0IHsKKwl1aW50NjRfdCB1NjQ7CisJc3RydWN0IGN2bXhfbWlvX3VhcnR4X3N0dF9zIHsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfMl82Mzo2MjsKKwkJdWludDY0X3Qgc3R0OjI7CisJfSBzOworCXN0cnVjdCBjdm14X21pb191YXJ0eF9zdHRfcyBjbjMweHg7CisJc3RydWN0IGN2bXhfbWlvX3VhcnR4X3N0dF9zIGNuMzF4eDsKKwlzdHJ1Y3QgY3ZteF9taW9fdWFydHhfc3R0X3MgY24zOHh4OworCXN0cnVjdCBjdm14X21pb191YXJ0eF9zdHRfcyBjbjM4eHhwMjsKKwlzdHJ1Y3QgY3ZteF9taW9fdWFydHhfc3R0X3MgY241MHh4OworCXN0cnVjdCBjdm14X21pb191YXJ0eF9zdHRfcyBjbjUyeHg7CisJc3RydWN0IGN2bXhfbWlvX3VhcnR4X3N0dF9zIGNuNTJ4eHAxOworCXN0cnVjdCBjdm14X21pb191YXJ0eF9zdHRfcyBjbjU2eHg7CisJc3RydWN0IGN2bXhfbWlvX3VhcnR4X3N0dF9zIGNuNTZ4eHAxOworCXN0cnVjdCBjdm14X21pb191YXJ0eF9zdHRfcyBjbjU4eHg7CisJc3RydWN0IGN2bXhfbWlvX3VhcnR4X3N0dF9zIGNuNTh4eHAxOworfTsKKwordW5pb24gY3ZteF9taW9fdWFydHhfdGZsIHsKKwl1aW50NjRfdCB1NjQ7CisJc3RydWN0IGN2bXhfbWlvX3VhcnR4X3RmbF9zIHsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfN182Mzo1NzsKKwkJdWludDY0X3QgdGZsOjc7CisJfSBzOworCXN0cnVjdCBjdm14X21pb191YXJ0eF90ZmxfcyBjbjMweHg7CisJc3RydWN0IGN2bXhfbWlvX3VhcnR4X3RmbF9zIGNuMzF4eDsKKwlzdHJ1Y3QgY3ZteF9taW9fdWFydHhfdGZsX3MgY24zOHh4OworCXN0cnVjdCBjdm14X21pb191YXJ0eF90ZmxfcyBjbjM4eHhwMjsKKwlzdHJ1Y3QgY3ZteF9taW9fdWFydHhfdGZsX3MgY241MHh4OworCXN0cnVjdCBjdm14X21pb191YXJ0eF90ZmxfcyBjbjUyeHg7CisJc3RydWN0IGN2bXhfbWlvX3VhcnR4X3RmbF9zIGNuNTJ4eHAxOworCXN0cnVjdCBjdm14X21pb191YXJ0eF90ZmxfcyBjbjU2eHg7CisJc3RydWN0IGN2bXhfbWlvX3VhcnR4X3RmbF9zIGNuNTZ4eHAxOworCXN0cnVjdCBjdm14X21pb191YXJ0eF90ZmxfcyBjbjU4eHg7CisJc3RydWN0IGN2bXhfbWlvX3VhcnR4X3RmbF9zIGNuNTh4eHAxOworfTsKKwordW5pb24gY3ZteF9taW9fdWFydHhfdGZyIHsKKwl1aW50NjRfdCB1NjQ7CisJc3RydWN0IGN2bXhfbWlvX3VhcnR4X3Rmcl9zIHsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfOF82Mzo1NjsKKwkJdWludDY0X3QgdGZyOjg7CisJfSBzOworCXN0cnVjdCBjdm14X21pb191YXJ0eF90ZnJfcyBjbjMweHg7CisJc3RydWN0IGN2bXhfbWlvX3VhcnR4X3Rmcl9zIGNuMzF4eDsKKwlzdHJ1Y3QgY3ZteF9taW9fdWFydHhfdGZyX3MgY24zOHh4OworCXN0cnVjdCBjdm14X21pb191YXJ0eF90ZnJfcyBjbjM4eHhwMjsKKwlzdHJ1Y3QgY3ZteF9taW9fdWFydHhfdGZyX3MgY241MHh4OworCXN0cnVjdCBjdm14X21pb191YXJ0eF90ZnJfcyBjbjUyeHg7CisJc3RydWN0IGN2bXhfbWlvX3VhcnR4X3Rmcl9zIGNuNTJ4eHAxOworCXN0cnVjdCBjdm14X21pb191YXJ0eF90ZnJfcyBjbjU2eHg7CisJc3RydWN0IGN2bXhfbWlvX3VhcnR4X3Rmcl9zIGNuNTZ4eHAxOworCXN0cnVjdCBjdm14X21pb191YXJ0eF90ZnJfcyBjbjU4eHg7CisJc3RydWN0IGN2bXhfbWlvX3VhcnR4X3Rmcl9zIGNuNTh4eHAxOworfTsKKwordW5pb24gY3ZteF9taW9fdWFydHhfdGhyIHsKKwl1aW50NjRfdCB1NjQ7CisJc3RydWN0IGN2bXhfbWlvX3VhcnR4X3Rocl9zIHsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfOF82Mzo1NjsKKwkJdWludDY0X3QgdGhyOjg7CisJfSBzOworCXN0cnVjdCBjdm14X21pb191YXJ0eF90aHJfcyBjbjMweHg7CisJc3RydWN0IGN2bXhfbWlvX3VhcnR4X3Rocl9zIGNuMzF4eDsKKwlzdHJ1Y3QgY3ZteF9taW9fdWFydHhfdGhyX3MgY24zOHh4OworCXN0cnVjdCBjdm14X21pb191YXJ0eF90aHJfcyBjbjM4eHhwMjsKKwlzdHJ1Y3QgY3ZteF9taW9fdWFydHhfdGhyX3MgY241MHh4OworCXN0cnVjdCBjdm14X21pb191YXJ0eF90aHJfcyBjbjUyeHg7CisJc3RydWN0IGN2bXhfbWlvX3VhcnR4X3Rocl9zIGNuNTJ4eHAxOworCXN0cnVjdCBjdm14X21pb191YXJ0eF90aHJfcyBjbjU2eHg7CisJc3RydWN0IGN2bXhfbWlvX3VhcnR4X3Rocl9zIGNuNTZ4eHAxOworCXN0cnVjdCBjdm14X21pb191YXJ0eF90aHJfcyBjbjU4eHg7CisJc3RydWN0IGN2bXhfbWlvX3VhcnR4X3Rocl9zIGNuNTh4eHAxOworfTsKKwordW5pb24gY3ZteF9taW9fdWFydHhfdXNyIHsKKwl1aW50NjRfdCB1NjQ7CisJc3RydWN0IGN2bXhfbWlvX3VhcnR4X3Vzcl9zIHsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfNV82Mzo1OTsKKwkJdWludDY0X3QgcmZmOjE7CisJCXVpbnQ2NF90IHJmbmU6MTsKKwkJdWludDY0X3QgdGZlOjE7CisJCXVpbnQ2NF90IHRmbmY6MTsKKwkJdWludDY0X3QgYnVzeToxOworCX0gczsKKwlzdHJ1Y3QgY3ZteF9taW9fdWFydHhfdXNyX3MgY24zMHh4OworCXN0cnVjdCBjdm14X21pb191YXJ0eF91c3JfcyBjbjMxeHg7CisJc3RydWN0IGN2bXhfbWlvX3VhcnR4X3Vzcl9zIGNuMzh4eDsKKwlzdHJ1Y3QgY3ZteF9taW9fdWFydHhfdXNyX3MgY24zOHh4cDI7CisJc3RydWN0IGN2bXhfbWlvX3VhcnR4X3Vzcl9zIGNuNTB4eDsKKwlzdHJ1Y3QgY3ZteF9taW9fdWFydHhfdXNyX3MgY241Mnh4OworCXN0cnVjdCBjdm14X21pb191YXJ0eF91c3JfcyBjbjUyeHhwMTsKKwlzdHJ1Y3QgY3ZteF9taW9fdWFydHhfdXNyX3MgY241Nnh4OworCXN0cnVjdCBjdm14X21pb191YXJ0eF91c3JfcyBjbjU2eHhwMTsKKwlzdHJ1Y3QgY3ZteF9taW9fdWFydHhfdXNyX3MgY241OHh4OworCXN0cnVjdCBjdm14X21pb191YXJ0eF91c3JfcyBjbjU4eHhwMTsKK307CisKK3VuaW9uIGN2bXhfbWlvX3VhcnQyX2RsaCB7CisJdWludDY0X3QgdTY0OworCXN0cnVjdCBjdm14X21pb191YXJ0Ml9kbGhfcyB7CisJCXVpbnQ2NF90IHJlc2VydmVkXzhfNjM6NTY7CisJCXVpbnQ2NF90IGRsaDo4OworCX0gczsKKwlzdHJ1Y3QgY3ZteF9taW9fdWFydDJfZGxoX3MgY241Mnh4OworCXN0cnVjdCBjdm14X21pb191YXJ0Ml9kbGhfcyBjbjUyeHhwMTsKK307CisKK3VuaW9uIGN2bXhfbWlvX3VhcnQyX2RsbCB7CisJdWludDY0X3QgdTY0OworCXN0cnVjdCBjdm14X21pb191YXJ0Ml9kbGxfcyB7CisJCXVpbnQ2NF90IHJlc2VydmVkXzhfNjM6NTY7CisJCXVpbnQ2NF90IGRsbDo4OworCX0gczsKKwlzdHJ1Y3QgY3ZteF9taW9fdWFydDJfZGxsX3MgY241Mnh4OworCXN0cnVjdCBjdm14X21pb191YXJ0Ml9kbGxfcyBjbjUyeHhwMTsKK307CisKK3VuaW9uIGN2bXhfbWlvX3VhcnQyX2ZhciB7CisJdWludDY0X3QgdTY0OworCXN0cnVjdCBjdm14X21pb191YXJ0Ml9mYXJfcyB7CisJCXVpbnQ2NF90IHJlc2VydmVkXzFfNjM6NjM7CisJCXVpbnQ2NF90IGZhcjoxOworCX0gczsKKwlzdHJ1Y3QgY3ZteF9taW9fdWFydDJfZmFyX3MgY241Mnh4OworCXN0cnVjdCBjdm14X21pb191YXJ0Ml9mYXJfcyBjbjUyeHhwMTsKK307CisKK3VuaW9uIGN2bXhfbWlvX3VhcnQyX2ZjciB7CisJdWludDY0X3QgdTY0OworCXN0cnVjdCBjdm14X21pb191YXJ0Ml9mY3JfcyB7CisJCXVpbnQ2NF90IHJlc2VydmVkXzhfNjM6NTY7CisJCXVpbnQ2NF90IHJ4dHJpZzoyOworCQl1aW50NjRfdCB0eHRyaWc6MjsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfM18zOjE7CisJCXVpbnQ2NF90IHR4ZnI6MTsKKwkJdWludDY0X3QgcnhmcjoxOworCQl1aW50NjRfdCBlbjoxOworCX0gczsKKwlzdHJ1Y3QgY3ZteF9taW9fdWFydDJfZmNyX3MgY241Mnh4OworCXN0cnVjdCBjdm14X21pb191YXJ0Ml9mY3JfcyBjbjUyeHhwMTsKK307CisKK3VuaW9uIGN2bXhfbWlvX3VhcnQyX2h0eCB7CisJdWludDY0X3QgdTY0OworCXN0cnVjdCBjdm14X21pb191YXJ0Ml9odHhfcyB7CisJCXVpbnQ2NF90IHJlc2VydmVkXzFfNjM6NjM7CisJCXVpbnQ2NF90IGh0eDoxOworCX0gczsKKwlzdHJ1Y3QgY3ZteF9taW9fdWFydDJfaHR4X3MgY241Mnh4OworCXN0cnVjdCBjdm14X21pb191YXJ0Ml9odHhfcyBjbjUyeHhwMTsKK307CisKK3VuaW9uIGN2bXhfbWlvX3VhcnQyX2llciB7CisJdWludDY0X3QgdTY0OworCXN0cnVjdCBjdm14X21pb191YXJ0Ml9pZXJfcyB7CisJCXVpbnQ2NF90IHJlc2VydmVkXzhfNjM6NTY7CisJCXVpbnQ2NF90IHB0aW1lOjE7CisJCXVpbnQ2NF90IHJlc2VydmVkXzRfNjozOworCQl1aW50NjRfdCBlZHNzaToxOworCQl1aW50NjRfdCBlbHNpOjE7CisJCXVpbnQ2NF90IGV0YmVpOjE7CisJCXVpbnQ2NF90IGVyYmZpOjE7CisJfSBzOworCXN0cnVjdCBjdm14X21pb191YXJ0Ml9pZXJfcyBjbjUyeHg7CisJc3RydWN0IGN2bXhfbWlvX3VhcnQyX2llcl9zIGNuNTJ4eHAxOworfTsKKwordW5pb24gY3ZteF9taW9fdWFydDJfaWlyIHsKKwl1aW50NjRfdCB1NjQ7CisJc3RydWN0IGN2bXhfbWlvX3VhcnQyX2lpcl9zIHsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfOF82Mzo1NjsKKwkJdWludDY0X3QgZmVuOjI7CisJCXVpbnQ2NF90IHJlc2VydmVkXzRfNToyOworCQl1aW50NjRfdCBpaWQ6NDsKKwl9IHM7CisJc3RydWN0IGN2bXhfbWlvX3VhcnQyX2lpcl9zIGNuNTJ4eDsKKwlzdHJ1Y3QgY3ZteF9taW9fdWFydDJfaWlyX3MgY241Mnh4cDE7Cit9OworCit1bmlvbiBjdm14X21pb191YXJ0Ml9sY3IgeworCXVpbnQ2NF90IHU2NDsKKwlzdHJ1Y3QgY3ZteF9taW9fdWFydDJfbGNyX3MgeworCQl1aW50NjRfdCByZXNlcnZlZF84XzYzOjU2OworCQl1aW50NjRfdCBkbGFiOjE7CisJCXVpbnQ2NF90IGJyazoxOworCQl1aW50NjRfdCByZXNlcnZlZF81XzU6MTsKKwkJdWludDY0X3QgZXBzOjE7CisJCXVpbnQ2NF90IHBlbjoxOworCQl1aW50NjRfdCBzdG9wOjE7CisJCXVpbnQ2NF90IGNsczoyOworCX0gczsKKwlzdHJ1Y3QgY3ZteF9taW9fdWFydDJfbGNyX3MgY241Mnh4OworCXN0cnVjdCBjdm14X21pb191YXJ0Ml9sY3JfcyBjbjUyeHhwMTsKK307CisKK3VuaW9uIGN2bXhfbWlvX3VhcnQyX2xzciB7CisJdWludDY0X3QgdTY0OworCXN0cnVjdCBjdm14X21pb191YXJ0Ml9sc3JfcyB7CisJCXVpbnQ2NF90IHJlc2VydmVkXzhfNjM6NTY7CisJCXVpbnQ2NF90IGZlcnI6MTsKKwkJdWludDY0X3QgdGVtdDoxOworCQl1aW50NjRfdCB0aHJlOjE7CisJCXVpbnQ2NF90IGJpOjE7CisJCXVpbnQ2NF90IGZlOjE7CisJCXVpbnQ2NF90IHBlOjE7CisJCXVpbnQ2NF90IG9lOjE7CisJCXVpbnQ2NF90IGRyOjE7CisJfSBzOworCXN0cnVjdCBjdm14X21pb191YXJ0Ml9sc3JfcyBjbjUyeHg7CisJc3RydWN0IGN2bXhfbWlvX3VhcnQyX2xzcl9zIGNuNTJ4eHAxOworfTsKKwordW5pb24gY3ZteF9taW9fdWFydDJfbWNyIHsKKwl1aW50NjRfdCB1NjQ7CisJc3RydWN0IGN2bXhfbWlvX3VhcnQyX21jcl9zIHsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfNl82Mzo1ODsKKwkJdWludDY0X3QgYWZjZToxOworCQl1aW50NjRfdCBsb29wOjE7CisJCXVpbnQ2NF90IG91dDI6MTsKKwkJdWludDY0X3Qgb3V0MToxOworCQl1aW50NjRfdCBydHM6MTsKKwkJdWludDY0X3QgZHRyOjE7CisJfSBzOworCXN0cnVjdCBjdm14X21pb191YXJ0Ml9tY3JfcyBjbjUyeHg7CisJc3RydWN0IGN2bXhfbWlvX3VhcnQyX21jcl9zIGNuNTJ4eHAxOworfTsKKwordW5pb24gY3ZteF9taW9fdWFydDJfbXNyIHsKKwl1aW50NjRfdCB1NjQ7CisJc3RydWN0IGN2bXhfbWlvX3VhcnQyX21zcl9zIHsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfOF82Mzo1NjsKKwkJdWludDY0X3QgZGNkOjE7CisJCXVpbnQ2NF90IHJpOjE7CisJCXVpbnQ2NF90IGRzcjoxOworCQl1aW50NjRfdCBjdHM6MTsKKwkJdWludDY0X3QgZGRjZDoxOworCQl1aW50NjRfdCB0ZXJpOjE7CisJCXVpbnQ2NF90IGRkc3I6MTsKKwkJdWludDY0X3QgZGN0czoxOworCX0gczsKKwlzdHJ1Y3QgY3ZteF9taW9fdWFydDJfbXNyX3MgY241Mnh4OworCXN0cnVjdCBjdm14X21pb191YXJ0Ml9tc3JfcyBjbjUyeHhwMTsKK307CisKK3VuaW9uIGN2bXhfbWlvX3VhcnQyX3JiciB7CisJdWludDY0X3QgdTY0OworCXN0cnVjdCBjdm14X21pb191YXJ0Ml9yYnJfcyB7CisJCXVpbnQ2NF90IHJlc2VydmVkXzhfNjM6NTY7CisJCXVpbnQ2NF90IHJicjo4OworCX0gczsKKwlzdHJ1Y3QgY3ZteF9taW9fdWFydDJfcmJyX3MgY241Mnh4OworCXN0cnVjdCBjdm14X21pb191YXJ0Ml9yYnJfcyBjbjUyeHhwMTsKK307CisKK3VuaW9uIGN2bXhfbWlvX3VhcnQyX3JmbCB7CisJdWludDY0X3QgdTY0OworCXN0cnVjdCBjdm14X21pb191YXJ0Ml9yZmxfcyB7CisJCXVpbnQ2NF90IHJlc2VydmVkXzdfNjM6NTc7CisJCXVpbnQ2NF90IHJmbDo3OworCX0gczsKKwlzdHJ1Y3QgY3ZteF9taW9fdWFydDJfcmZsX3MgY241Mnh4OworCXN0cnVjdCBjdm14X21pb191YXJ0Ml9yZmxfcyBjbjUyeHhwMTsKK307CisKK3VuaW9uIGN2bXhfbWlvX3VhcnQyX3JmdyB7CisJdWludDY0X3QgdTY0OworCXN0cnVjdCBjdm14X21pb191YXJ0Ml9yZndfcyB7CisJCXVpbnQ2NF90IHJlc2VydmVkXzEwXzYzOjU0OworCQl1aW50NjRfdCByZmZlOjE7CisJCXVpbnQ2NF90IHJmcGU6MTsKKwkJdWludDY0X3QgcmZ3ZDo4OworCX0gczsKKwlzdHJ1Y3QgY3ZteF9taW9fdWFydDJfcmZ3X3MgY241Mnh4OworCXN0cnVjdCBjdm14X21pb191YXJ0Ml9yZndfcyBjbjUyeHhwMTsKK307CisKK3VuaW9uIGN2bXhfbWlvX3VhcnQyX3NiY3IgeworCXVpbnQ2NF90IHU2NDsKKwlzdHJ1Y3QgY3ZteF9taW9fdWFydDJfc2Jjcl9zIHsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfMV82Mzo2MzsKKwkJdWludDY0X3Qgc2JjcjoxOworCX0gczsKKwlzdHJ1Y3QgY3ZteF9taW9fdWFydDJfc2Jjcl9zIGNuNTJ4eDsKKwlzdHJ1Y3QgY3ZteF9taW9fdWFydDJfc2Jjcl9zIGNuNTJ4eHAxOworfTsKKwordW5pb24gY3ZteF9taW9fdWFydDJfc2NyIHsKKwl1aW50NjRfdCB1NjQ7CisJc3RydWN0IGN2bXhfbWlvX3VhcnQyX3Njcl9zIHsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfOF82Mzo1NjsKKwkJdWludDY0X3Qgc2NyOjg7CisJfSBzOworCXN0cnVjdCBjdm14X21pb191YXJ0Ml9zY3JfcyBjbjUyeHg7CisJc3RydWN0IGN2bXhfbWlvX3VhcnQyX3Njcl9zIGNuNTJ4eHAxOworfTsKKwordW5pb24gY3ZteF9taW9fdWFydDJfc2ZlIHsKKwl1aW50NjRfdCB1NjQ7CisJc3RydWN0IGN2bXhfbWlvX3VhcnQyX3NmZV9zIHsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfMV82Mzo2MzsKKwkJdWludDY0X3Qgc2ZlOjE7CisJfSBzOworCXN0cnVjdCBjdm14X21pb191YXJ0Ml9zZmVfcyBjbjUyeHg7CisJc3RydWN0IGN2bXhfbWlvX3VhcnQyX3NmZV9zIGNuNTJ4eHAxOworfTsKKwordW5pb24gY3ZteF9taW9fdWFydDJfc3JyIHsKKwl1aW50NjRfdCB1NjQ7CisJc3RydWN0IGN2bXhfbWlvX3VhcnQyX3Nycl9zIHsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfM182Mzo2MTsKKwkJdWludDY0X3Qgc3RmcjoxOworCQl1aW50NjRfdCBzcmZyOjE7CisJCXVpbnQ2NF90IHVzcjoxOworCX0gczsKKwlzdHJ1Y3QgY3ZteF9taW9fdWFydDJfc3JyX3MgY241Mnh4OworCXN0cnVjdCBjdm14X21pb191YXJ0Ml9zcnJfcyBjbjUyeHhwMTsKK307CisKK3VuaW9uIGN2bXhfbWlvX3VhcnQyX3NydCB7CisJdWludDY0X3QgdTY0OworCXN0cnVjdCBjdm14X21pb191YXJ0Ml9zcnRfcyB7CisJCXVpbnQ2NF90IHJlc2VydmVkXzJfNjM6NjI7CisJCXVpbnQ2NF90IHNydDoyOworCX0gczsKKwlzdHJ1Y3QgY3ZteF9taW9fdWFydDJfc3J0X3MgY241Mnh4OworCXN0cnVjdCBjdm14X21pb191YXJ0Ml9zcnRfcyBjbjUyeHhwMTsKK307CisKK3VuaW9uIGN2bXhfbWlvX3VhcnQyX3NydHMgeworCXVpbnQ2NF90IHU2NDsKKwlzdHJ1Y3QgY3ZteF9taW9fdWFydDJfc3J0c19zIHsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfMV82Mzo2MzsKKwkJdWludDY0X3Qgc3J0czoxOworCX0gczsKKwlzdHJ1Y3QgY3ZteF9taW9fdWFydDJfc3J0c19zIGNuNTJ4eDsKKwlzdHJ1Y3QgY3ZteF9taW9fdWFydDJfc3J0c19zIGNuNTJ4eHAxOworfTsKKwordW5pb24gY3ZteF9taW9fdWFydDJfc3R0IHsKKwl1aW50NjRfdCB1NjQ7CisJc3RydWN0IGN2bXhfbWlvX3VhcnQyX3N0dF9zIHsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfMl82Mzo2MjsKKwkJdWludDY0X3Qgc3R0OjI7CisJfSBzOworCXN0cnVjdCBjdm14X21pb191YXJ0Ml9zdHRfcyBjbjUyeHg7CisJc3RydWN0IGN2bXhfbWlvX3VhcnQyX3N0dF9zIGNuNTJ4eHAxOworfTsKKwordW5pb24gY3ZteF9taW9fdWFydDJfdGZsIHsKKwl1aW50NjRfdCB1NjQ7CisJc3RydWN0IGN2bXhfbWlvX3VhcnQyX3RmbF9zIHsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfN182Mzo1NzsKKwkJdWludDY0X3QgdGZsOjc7CisJfSBzOworCXN0cnVjdCBjdm14X21pb191YXJ0Ml90ZmxfcyBjbjUyeHg7CisJc3RydWN0IGN2bXhfbWlvX3VhcnQyX3RmbF9zIGNuNTJ4eHAxOworfTsKKwordW5pb24gY3ZteF9taW9fdWFydDJfdGZyIHsKKwl1aW50NjRfdCB1NjQ7CisJc3RydWN0IGN2bXhfbWlvX3VhcnQyX3Rmcl9zIHsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfOF82Mzo1NjsKKwkJdWludDY0X3QgdGZyOjg7CisJfSBzOworCXN0cnVjdCBjdm14X21pb191YXJ0Ml90ZnJfcyBjbjUyeHg7CisJc3RydWN0IGN2bXhfbWlvX3VhcnQyX3Rmcl9zIGNuNTJ4eHAxOworfTsKKwordW5pb24gY3ZteF9taW9fdWFydDJfdGhyIHsKKwl1aW50NjRfdCB1NjQ7CisJc3RydWN0IGN2bXhfbWlvX3VhcnQyX3Rocl9zIHsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfOF82Mzo1NjsKKwkJdWludDY0X3QgdGhyOjg7CisJfSBzOworCXN0cnVjdCBjdm14X21pb191YXJ0Ml90aHJfcyBjbjUyeHg7CisJc3RydWN0IGN2bXhfbWlvX3VhcnQyX3Rocl9zIGNuNTJ4eHAxOworfTsKKwordW5pb24gY3ZteF9taW9fdWFydDJfdXNyIHsKKwl1aW50NjRfdCB1NjQ7CisJc3RydWN0IGN2bXhfbWlvX3VhcnQyX3Vzcl9zIHsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfNV82Mzo1OTsKKwkJdWludDY0X3QgcmZmOjE7CisJCXVpbnQ2NF90IHJmbmU6MTsKKwkJdWludDY0X3QgdGZlOjE7CisJCXVpbnQ2NF90IHRmbmY6MTsKKwkJdWludDY0X3QgYnVzeToxOworCX0gczsKKwlzdHJ1Y3QgY3ZteF9taW9fdWFydDJfdXNyX3MgY241Mnh4OworCXN0cnVjdCBjdm14X21pb191YXJ0Ml91c3JfcyBjbjUyeHhwMTsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL29jdGVvbi9jdm14LXBhY2tldC5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL29jdGVvbi9jdm14LXBhY2tldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4YWVmYTEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vb2N0ZW9uL2N2bXgtcGFja2V0LmgKQEAgLTAsMCArMSw2MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqbGljZW5zZSBzdGFydCoqKioqKioqKioqKioqKgorICogQXV0aG9yOiBDYXZpdW0gTmV0d29ya3MKKyAqCisgKiBDb250YWN0OiBzdXBwb3J0QGNhdml1bW5ldHdvcmtzLmNvbQorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIE9DVEVPTiBTREsKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwOCBDYXZpdW0gTmV0d29ya3MKKyAqCisgKiBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgVmVyc2lvbiAyLCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogQVMtSVMgYW5kIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkKKyAqIG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgVElUTEUsIG9yCisgKiBOT05JTkZSSU5HRU1FTlQuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlCisgKiBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgZmlsZTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKiBvciB2aXNpdCBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLgorICoKKyAqIFRoaXMgZmlsZSBtYXkgYWxzbyBiZSBhdmFpbGFibGUgdW5kZXIgYSBkaWZmZXJlbnQgbGljZW5zZSBmcm9tIENhdml1bS4KKyAqIENvbnRhY3QgQ2F2aXVtIE5ldHdvcmtzIGZvciBtb3JlIGluZm9ybWF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKipsaWNlbnNlIGVuZCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogUGFja2V0IGJ1ZmZlciBkZWZpbmVzLgorICovCisKKyNpZm5kZWYgX19DVk1YX1BBQ0tFVF9IX18KKyNkZWZpbmUgX19DVk1YX1BBQ0tFVF9IX18KKworLyoqCisgKiBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIGEgYnVmZmVyIHBvaW50ZXIgb24gT2N0ZW9uCisgKi8KK3VuaW9uIGN2bXhfYnVmX3B0ciB7CisJdm9pZCAqcHRyOworCXVpbnQ2NF90IHU2NDsKKwlzdHJ1Y3QgeworCQkvKiBpZiBzZXQsIGludmVydCB0aGUgImZyZWUiIHBpY2sgb2YgdGhlIG92ZXJhbGwKKwkJICogcGFja2V0LiBIVyBhbHdheXMgc2V0cyB0aGlzIGJpdCB0byAwIG9uIGluYm91bmQKKwkJICogcGFja2V0ICovCisJCXVpbnQ2NF90IGk6MTsKKworCQkvKiBJbmRpY2F0ZXMgdGhlIGFtb3VudCB0byBiYWNrIHVwIHRvIGdldCB0byB0aGUKKwkJICogYnVmZmVyIHN0YXJ0IGluIGNhY2hlIGxpbmVzLiBJbiBtb3N0IGNhc2VzIHRoaXMgaXMKKwkJICogbGVzcyB0aGFuIG9uZSBjb21wbGV0ZSBjYWNoZSBsaW5lLCBzbyB0aGUgdmFsdWUgaXMKKwkJICogemVybyAqLworCQl1aW50NjRfdCBiYWNrOjQ7CisJCS8qIFRoZSBwb29sIHRoYXQgdGhlIGJ1ZmZlciBjYW1lIGZyb20gLyBnb2VzIHRvICovCisJCXVpbnQ2NF90IHBvb2w6MzsKKwkJLyogVGhlIHNpemUgb2YgdGhlIHNlZ21lbnQgcG9pbnRlZCB0byBieSBhZGRyIChpbiBieXRlcykgKi8KKwkJdWludDY0X3Qgc2l6ZToxNjsKKwkJLyogUG9pbnRlciB0byB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUgZGF0YSwgTk9UIGJ1ZmZlciAqLworCQl1aW50NjRfdCBhZGRyOjQwOworCX0gczsKK307CisKKyNlbmRpZiAvKiAgX19DVk1YX1BBQ0tFVF9IX18gKi8KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9vY3Rlb24vY3ZteC1wb3ctZGVmcy5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL29jdGVvbi9jdm14LXBvdy1kZWZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQ4MmUyNAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9vY3Rlb24vY3ZteC1wb3ctZGVmcy5oCkBAIC0wLDAgKzEsNjk4IEBACisvKioqKioqKioqKioqKioqKioqKioqKipsaWNlbnNlIHN0YXJ0KioqKioqKioqKioqKioqCisgKiBBdXRob3I6IENhdml1bSBOZXR3b3JrcworICoKKyAqIENvbnRhY3Q6IHN1cHBvcnRAY2F2aXVtbmV0d29ya3MuY29tCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgT0NURU9OIFNESworICoKKyAqIENvcHlyaWdodCAoYykgMjAwMy0yMDA4IENhdml1bSBOZXR3b3JrcworICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBWZXJzaW9uIDIsIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBBUy1JUyBhbmQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eQorICogb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBUSVRMRSwgb3IKKyAqIE5PTklORlJJTkdFTUVOVC4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUKKyAqIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBmaWxlOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqIG9yIHZpc2l0IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uCisgKgorICogVGhpcyBmaWxlIG1heSBhbHNvIGJlIGF2YWlsYWJsZSB1bmRlciBhIGRpZmZlcmVudCBsaWNlbnNlIGZyb20gQ2F2aXVtLgorICogQ29udGFjdCBDYXZpdW0gTmV0d29ya3MgZm9yIG1vcmUgaW5mb3JtYXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKmxpY2Vuc2UgZW5kKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX19DVk1YX1BPV19ERUZTX0hfXworI2RlZmluZSBfX0NWTVhfUE9XX0RFRlNfSF9fCisKKyNkZWZpbmUgQ1ZNWF9QT1dfQklTVF9TVEFUIFwKKwkgQ1ZNWF9BRERfSU9fU0VHKDB4MDAwMTY3MDAwMDAwMDNGOHVsbCkKKyNkZWZpbmUgQ1ZNWF9QT1dfRFNfUEMgXAorCSBDVk1YX0FERF9JT19TRUcoMHgwMDAxNjcwMDAwMDAwMzk4dWxsKQorI2RlZmluZSBDVk1YX1BPV19FQ0NfRVJSIFwKKwkgQ1ZNWF9BRERfSU9fU0VHKDB4MDAwMTY3MDAwMDAwMDIxOHVsbCkKKyNkZWZpbmUgQ1ZNWF9QT1dfSU5UX0NUTCBcCisJIENWTVhfQUREX0lPX1NFRygweDAwMDE2NzAwMDAwMDAyMjB1bGwpCisjZGVmaW5lIENWTVhfUE9XX0lRX0NOVFgob2Zmc2V0KSBcCisJIENWTVhfQUREX0lPX1NFRygweDAwMDE2NzAwMDAwMDAzNDB1bGwgKyAoKChvZmZzZXQpICYgNykgKiA4KSkKKyNkZWZpbmUgQ1ZNWF9QT1dfSVFfQ09NX0NOVCBcCisJIENWTVhfQUREX0lPX1NFRygweDAwMDE2NzAwMDAwMDAzODh1bGwpCisjZGVmaW5lIENWTVhfUE9XX0lRX0lOVCBcCisJIENWTVhfQUREX0lPX1NFRygweDAwMDE2NzAwMDAwMDAyMzh1bGwpCisjZGVmaW5lIENWTVhfUE9XX0lRX0lOVF9FTiBcCisJIENWTVhfQUREX0lPX1NFRygweDAwMDE2NzAwMDAwMDAyNDB1bGwpCisjZGVmaW5lIENWTVhfUE9XX0lRX1RIUlgob2Zmc2V0KSBcCisJIENWTVhfQUREX0lPX1NFRygweDAwMDE2NzAwMDAwMDAzQTB1bGwgKyAoKChvZmZzZXQpICYgNykgKiA4KSkKKyNkZWZpbmUgQ1ZNWF9QT1dfTk9TX0NOVCBcCisJIENWTVhfQUREX0lPX1NFRygweDAwMDE2NzAwMDAwMDAyMjh1bGwpCisjZGVmaW5lIENWTVhfUE9XX05XX1RJTSBcCisJIENWTVhfQUREX0lPX1NFRygweDAwMDE2NzAwMDAwMDAyMTB1bGwpCisjZGVmaW5lIENWTVhfUE9XX1BGX1JTVF9NU0sgXAorCSBDVk1YX0FERF9JT19TRUcoMHgwMDAxNjcwMDAwMDAwMjMwdWxsKQorI2RlZmluZSBDVk1YX1BPV19QUF9HUlBfTVNLWChvZmZzZXQpIFwKKwkgQ1ZNWF9BRERfSU9fU0VHKDB4MDAwMTY3MDAwMDAwMDAwMHVsbCArICgoKG9mZnNldCkgJiAxNSkgKiA4KSkKKyNkZWZpbmUgQ1ZNWF9QT1dfUU9TX1JORFgob2Zmc2V0KSBcCisJIENWTVhfQUREX0lPX1NFRygweDAwMDE2NzAwMDAwMDAxQzB1bGwgKyAoKChvZmZzZXQpICYgNykgKiA4KSkKKyNkZWZpbmUgQ1ZNWF9QT1dfUU9TX1RIUlgob2Zmc2V0KSBcCisJIENWTVhfQUREX0lPX1NFRygweDAwMDE2NzAwMDAwMDAxODB1bGwgKyAoKChvZmZzZXQpICYgNykgKiA4KSkKKyNkZWZpbmUgQ1ZNWF9QT1dfVFNfUEMgXAorCSBDVk1YX0FERF9JT19TRUcoMHgwMDAxNjcwMDAwMDAwMzkwdWxsKQorI2RlZmluZSBDVk1YX1BPV19XQV9DT01fUEMgXAorCSBDVk1YX0FERF9JT19TRUcoMHgwMDAxNjcwMDAwMDAwMzgwdWxsKQorI2RlZmluZSBDVk1YX1BPV19XQV9QQ1gob2Zmc2V0KSBcCisJIENWTVhfQUREX0lPX1NFRygweDAwMDE2NzAwMDAwMDAzMDB1bGwgKyAoKChvZmZzZXQpICYgNykgKiA4KSkKKyNkZWZpbmUgQ1ZNWF9QT1dfV1FfSU5UIFwKKwkgQ1ZNWF9BRERfSU9fU0VHKDB4MDAwMTY3MDAwMDAwMDIwMHVsbCkKKyNkZWZpbmUgQ1ZNWF9QT1dfV1FfSU5UX0NOVFgob2Zmc2V0KSBcCisJIENWTVhfQUREX0lPX1NFRygweDAwMDE2NzAwMDAwMDAxMDB1bGwgKyAoKChvZmZzZXQpICYgMTUpICogOCkpCisjZGVmaW5lIENWTVhfUE9XX1dRX0lOVF9QQyBcCisJIENWTVhfQUREX0lPX1NFRygweDAwMDE2NzAwMDAwMDAyMDh1bGwpCisjZGVmaW5lIENWTVhfUE9XX1dRX0lOVF9USFJYKG9mZnNldCkgXAorCSBDVk1YX0FERF9JT19TRUcoMHgwMDAxNjcwMDAwMDAwMDgwdWxsICsgKCgob2Zmc2V0KSAmIDE1KSAqIDgpKQorI2RlZmluZSBDVk1YX1BPV19XU19QQ1gob2Zmc2V0KSBcCisJIENWTVhfQUREX0lPX1NFRygweDAwMDE2NzAwMDAwMDAyODB1bGwgKyAoKChvZmZzZXQpICYgMTUpICogOCkpCisKK3VuaW9uIGN2bXhfcG93X2Jpc3Rfc3RhdCB7CisJdWludDY0X3QgdTY0OworCXN0cnVjdCBjdm14X3Bvd19iaXN0X3N0YXRfcyB7CisJCXVpbnQ2NF90IHJlc2VydmVkXzMyXzYzOjMyOworCQl1aW50NjRfdCBwcDoxNjsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfMF8xNToxNjsKKwl9IHM7CisJc3RydWN0IGN2bXhfcG93X2Jpc3Rfc3RhdF9jbjMweHggeworCQl1aW50NjRfdCByZXNlcnZlZF8xN182Mzo0NzsKKwkJdWludDY0X3QgcHA6MTsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfOV8xNTo3OworCQl1aW50NjRfdCBjYW06MTsKKwkJdWludDY0X3QgbmJ0MToxOworCQl1aW50NjRfdCBuYnQwOjE7CisJCXVpbnQ2NF90IGluZGV4OjE7CisJCXVpbnQ2NF90IGZpZHg6MTsKKwkJdWludDY0X3QgbmJyMToxOworCQl1aW50NjRfdCBuYnIwOjE7CisJCXVpbnQ2NF90IHBlbmQ6MTsKKwkJdWludDY0X3QgYWRyOjE7CisJfSBjbjMweHg7CisJc3RydWN0IGN2bXhfcG93X2Jpc3Rfc3RhdF9jbjMxeHggeworCQl1aW50NjRfdCByZXNlcnZlZF8xOF82Mzo0NjsKKwkJdWludDY0X3QgcHA6MjsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfOV8xNTo3OworCQl1aW50NjRfdCBjYW06MTsKKwkJdWludDY0X3QgbmJ0MToxOworCQl1aW50NjRfdCBuYnQwOjE7CisJCXVpbnQ2NF90IGluZGV4OjE7CisJCXVpbnQ2NF90IGZpZHg6MTsKKwkJdWludDY0X3QgbmJyMToxOworCQl1aW50NjRfdCBuYnIwOjE7CisJCXVpbnQ2NF90IHBlbmQ6MTsKKwkJdWludDY0X3QgYWRyOjE7CisJfSBjbjMxeHg7CisJc3RydWN0IGN2bXhfcG93X2Jpc3Rfc3RhdF9jbjM4eHggeworCQl1aW50NjRfdCByZXNlcnZlZF8zMl82MzozMjsKKwkJdWludDY0X3QgcHA6MTY7CisJCXVpbnQ2NF90IHJlc2VydmVkXzEwXzE1OjY7CisJCXVpbnQ2NF90IGNhbToxOworCQl1aW50NjRfdCBuYnQ6MTsKKwkJdWludDY0X3QgaW5kZXg6MTsKKwkJdWludDY0X3QgZmlkeDoxOworCQl1aW50NjRfdCBuYnIxOjE7CisJCXVpbnQ2NF90IG5icjA6MTsKKwkJdWludDY0X3QgcGVuZDE6MTsKKwkJdWludDY0X3QgcGVuZDA6MTsKKwkJdWludDY0X3QgYWRyMToxOworCQl1aW50NjRfdCBhZHIwOjE7CisJfSBjbjM4eHg7CisJc3RydWN0IGN2bXhfcG93X2Jpc3Rfc3RhdF9jbjM4eHggY24zOHh4cDI7CisJc3RydWN0IGN2bXhfcG93X2Jpc3Rfc3RhdF9jbjMxeHggY241MHh4OworCXN0cnVjdCBjdm14X3Bvd19iaXN0X3N0YXRfY241Mnh4IHsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfMjBfNjM6NDQ7CisJCXVpbnQ2NF90IHBwOjQ7CisJCXVpbnQ2NF90IHJlc2VydmVkXzlfMTU6NzsKKwkJdWludDY0X3QgY2FtOjE7CisJCXVpbnQ2NF90IG5idDE6MTsKKwkJdWludDY0X3QgbmJ0MDoxOworCQl1aW50NjRfdCBpbmRleDoxOworCQl1aW50NjRfdCBmaWR4OjE7CisJCXVpbnQ2NF90IG5icjE6MTsKKwkJdWludDY0X3QgbmJyMDoxOworCQl1aW50NjRfdCBwZW5kOjE7CisJCXVpbnQ2NF90IGFkcjoxOworCX0gY241Mnh4OworCXN0cnVjdCBjdm14X3Bvd19iaXN0X3N0YXRfY241Mnh4IGNuNTJ4eHAxOworCXN0cnVjdCBjdm14X3Bvd19iaXN0X3N0YXRfY241Nnh4IHsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfMjhfNjM6MzY7CisJCXVpbnQ2NF90IHBwOjEyOworCQl1aW50NjRfdCByZXNlcnZlZF8xMF8xNTo2OworCQl1aW50NjRfdCBjYW06MTsKKwkJdWludDY0X3QgbmJ0OjE7CisJCXVpbnQ2NF90IGluZGV4OjE7CisJCXVpbnQ2NF90IGZpZHg6MTsKKwkJdWludDY0X3QgbmJyMToxOworCQl1aW50NjRfdCBuYnIwOjE7CisJCXVpbnQ2NF90IHBlbmQxOjE7CisJCXVpbnQ2NF90IHBlbmQwOjE7CisJCXVpbnQ2NF90IGFkcjE6MTsKKwkJdWludDY0X3QgYWRyMDoxOworCX0gY241Nnh4OworCXN0cnVjdCBjdm14X3Bvd19iaXN0X3N0YXRfY241Nnh4IGNuNTZ4eHAxOworCXN0cnVjdCBjdm14X3Bvd19iaXN0X3N0YXRfY24zOHh4IGNuNTh4eDsKKwlzdHJ1Y3QgY3ZteF9wb3dfYmlzdF9zdGF0X2NuMzh4eCBjbjU4eHhwMTsKK307CisKK3VuaW9uIGN2bXhfcG93X2RzX3BjIHsKKwl1aW50NjRfdCB1NjQ7CisJc3RydWN0IGN2bXhfcG93X2RzX3BjX3MgeworCQl1aW50NjRfdCByZXNlcnZlZF8zMl82MzozMjsKKwkJdWludDY0X3QgZHNfcGM6MzI7CisJfSBzOworCXN0cnVjdCBjdm14X3Bvd19kc19wY19zIGNuMzB4eDsKKwlzdHJ1Y3QgY3ZteF9wb3dfZHNfcGNfcyBjbjMxeHg7CisJc3RydWN0IGN2bXhfcG93X2RzX3BjX3MgY24zOHh4OworCXN0cnVjdCBjdm14X3Bvd19kc19wY19zIGNuMzh4eHAyOworCXN0cnVjdCBjdm14X3Bvd19kc19wY19zIGNuNTB4eDsKKwlzdHJ1Y3QgY3ZteF9wb3dfZHNfcGNfcyBjbjUyeHg7CisJc3RydWN0IGN2bXhfcG93X2RzX3BjX3MgY241Mnh4cDE7CisJc3RydWN0IGN2bXhfcG93X2RzX3BjX3MgY241Nnh4OworCXN0cnVjdCBjdm14X3Bvd19kc19wY19zIGNuNTZ4eHAxOworCXN0cnVjdCBjdm14X3Bvd19kc19wY19zIGNuNTh4eDsKKwlzdHJ1Y3QgY3ZteF9wb3dfZHNfcGNfcyBjbjU4eHhwMTsKK307CisKK3VuaW9uIGN2bXhfcG93X2VjY19lcnIgeworCXVpbnQ2NF90IHU2NDsKKwlzdHJ1Y3QgY3ZteF9wb3dfZWNjX2Vycl9zIHsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfNDVfNjM6MTk7CisJCXVpbnQ2NF90IGlvcF9pZToxMzsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfMjlfMzE6MzsKKwkJdWludDY0X3QgaW9wOjEzOworCQl1aW50NjRfdCByZXNlcnZlZF8xNF8xNToyOworCQl1aW50NjRfdCBycGVfaWU6MTsKKwkJdWludDY0X3QgcnBlOjE7CisJCXVpbnQ2NF90IHJlc2VydmVkXzlfMTE6MzsKKwkJdWludDY0X3Qgc3luOjU7CisJCXVpbnQ2NF90IGRiZV9pZToxOworCQl1aW50NjRfdCBzYmVfaWU6MTsKKwkJdWludDY0X3QgZGJlOjE7CisJCXVpbnQ2NF90IHNiZToxOworCX0gczsKKwlzdHJ1Y3QgY3ZteF9wb3dfZWNjX2Vycl9zIGNuMzB4eDsKKwlzdHJ1Y3QgY3ZteF9wb3dfZWNjX2Vycl9jbjMxeHggeworCQl1aW50NjRfdCByZXNlcnZlZF8xNF82Mzo1MDsKKwkJdWludDY0X3QgcnBlX2llOjE7CisJCXVpbnQ2NF90IHJwZToxOworCQl1aW50NjRfdCByZXNlcnZlZF85XzExOjM7CisJCXVpbnQ2NF90IHN5bjo1OworCQl1aW50NjRfdCBkYmVfaWU6MTsKKwkJdWludDY0X3Qgc2JlX2llOjE7CisJCXVpbnQ2NF90IGRiZToxOworCQl1aW50NjRfdCBzYmU6MTsKKwl9IGNuMzF4eDsKKwlzdHJ1Y3QgY3ZteF9wb3dfZWNjX2Vycl9zIGNuMzh4eDsKKwlzdHJ1Y3QgY3ZteF9wb3dfZWNjX2Vycl9jbjMxeHggY24zOHh4cDI7CisJc3RydWN0IGN2bXhfcG93X2VjY19lcnJfcyBjbjUweHg7CisJc3RydWN0IGN2bXhfcG93X2VjY19lcnJfcyBjbjUyeHg7CisJc3RydWN0IGN2bXhfcG93X2VjY19lcnJfcyBjbjUyeHhwMTsKKwlzdHJ1Y3QgY3ZteF9wb3dfZWNjX2Vycl9zIGNuNTZ4eDsKKwlzdHJ1Y3QgY3ZteF9wb3dfZWNjX2Vycl9zIGNuNTZ4eHAxOworCXN0cnVjdCBjdm14X3Bvd19lY2NfZXJyX3MgY241OHh4OworCXN0cnVjdCBjdm14X3Bvd19lY2NfZXJyX3MgY241OHh4cDE7Cit9OworCit1bmlvbiBjdm14X3Bvd19pbnRfY3RsIHsKKwl1aW50NjRfdCB1NjQ7CisJc3RydWN0IGN2bXhfcG93X2ludF9jdGxfcyB7CisJCXVpbnQ2NF90IHJlc2VydmVkXzZfNjM6NTg7CisJCXVpbnQ2NF90IHBmcl9kaXM6MTsKKwkJdWludDY0X3QgbmJyX3Rocjo1OworCX0gczsKKwlzdHJ1Y3QgY3ZteF9wb3dfaW50X2N0bF9zIGNuMzB4eDsKKwlzdHJ1Y3QgY3ZteF9wb3dfaW50X2N0bF9zIGNuMzF4eDsKKwlzdHJ1Y3QgY3ZteF9wb3dfaW50X2N0bF9zIGNuMzh4eDsKKwlzdHJ1Y3QgY3ZteF9wb3dfaW50X2N0bF9zIGNuMzh4eHAyOworCXN0cnVjdCBjdm14X3Bvd19pbnRfY3RsX3MgY241MHh4OworCXN0cnVjdCBjdm14X3Bvd19pbnRfY3RsX3MgY241Mnh4OworCXN0cnVjdCBjdm14X3Bvd19pbnRfY3RsX3MgY241Mnh4cDE7CisJc3RydWN0IGN2bXhfcG93X2ludF9jdGxfcyBjbjU2eHg7CisJc3RydWN0IGN2bXhfcG93X2ludF9jdGxfcyBjbjU2eHhwMTsKKwlzdHJ1Y3QgY3ZteF9wb3dfaW50X2N0bF9zIGNuNTh4eDsKKwlzdHJ1Y3QgY3ZteF9wb3dfaW50X2N0bF9zIGNuNTh4eHAxOworfTsKKwordW5pb24gY3ZteF9wb3dfaXFfY250eCB7CisJdWludDY0X3QgdTY0OworCXN0cnVjdCBjdm14X3Bvd19pcV9jbnR4X3MgeworCQl1aW50NjRfdCByZXNlcnZlZF8zMl82MzozMjsKKwkJdWludDY0X3QgaXFfY250OjMyOworCX0gczsKKwlzdHJ1Y3QgY3ZteF9wb3dfaXFfY250eF9zIGNuMzB4eDsKKwlzdHJ1Y3QgY3ZteF9wb3dfaXFfY250eF9zIGNuMzF4eDsKKwlzdHJ1Y3QgY3ZteF9wb3dfaXFfY250eF9zIGNuMzh4eDsKKwlzdHJ1Y3QgY3ZteF9wb3dfaXFfY250eF9zIGNuMzh4eHAyOworCXN0cnVjdCBjdm14X3Bvd19pcV9jbnR4X3MgY241MHh4OworCXN0cnVjdCBjdm14X3Bvd19pcV9jbnR4X3MgY241Mnh4OworCXN0cnVjdCBjdm14X3Bvd19pcV9jbnR4X3MgY241Mnh4cDE7CisJc3RydWN0IGN2bXhfcG93X2lxX2NudHhfcyBjbjU2eHg7CisJc3RydWN0IGN2bXhfcG93X2lxX2NudHhfcyBjbjU2eHhwMTsKKwlzdHJ1Y3QgY3ZteF9wb3dfaXFfY250eF9zIGNuNTh4eDsKKwlzdHJ1Y3QgY3ZteF9wb3dfaXFfY250eF9zIGNuNTh4eHAxOworfTsKKwordW5pb24gY3ZteF9wb3dfaXFfY29tX2NudCB7CisJdWludDY0X3QgdTY0OworCXN0cnVjdCBjdm14X3Bvd19pcV9jb21fY250X3MgeworCQl1aW50NjRfdCByZXNlcnZlZF8zMl82MzozMjsKKwkJdWludDY0X3QgaXFfY250OjMyOworCX0gczsKKwlzdHJ1Y3QgY3ZteF9wb3dfaXFfY29tX2NudF9zIGNuMzB4eDsKKwlzdHJ1Y3QgY3ZteF9wb3dfaXFfY29tX2NudF9zIGNuMzF4eDsKKwlzdHJ1Y3QgY3ZteF9wb3dfaXFfY29tX2NudF9zIGNuMzh4eDsKKwlzdHJ1Y3QgY3ZteF9wb3dfaXFfY29tX2NudF9zIGNuMzh4eHAyOworCXN0cnVjdCBjdm14X3Bvd19pcV9jb21fY250X3MgY241MHh4OworCXN0cnVjdCBjdm14X3Bvd19pcV9jb21fY250X3MgY241Mnh4OworCXN0cnVjdCBjdm14X3Bvd19pcV9jb21fY250X3MgY241Mnh4cDE7CisJc3RydWN0IGN2bXhfcG93X2lxX2NvbV9jbnRfcyBjbjU2eHg7CisJc3RydWN0IGN2bXhfcG93X2lxX2NvbV9jbnRfcyBjbjU2eHhwMTsKKwlzdHJ1Y3QgY3ZteF9wb3dfaXFfY29tX2NudF9zIGNuNTh4eDsKKwlzdHJ1Y3QgY3ZteF9wb3dfaXFfY29tX2NudF9zIGNuNTh4eHAxOworfTsKKwordW5pb24gY3ZteF9wb3dfaXFfaW50IHsKKwl1aW50NjRfdCB1NjQ7CisJc3RydWN0IGN2bXhfcG93X2lxX2ludF9zIHsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfOF82Mzo1NjsKKwkJdWludDY0X3QgaXFfaW50Ojg7CisJfSBzOworCXN0cnVjdCBjdm14X3Bvd19pcV9pbnRfcyBjbjUyeHg7CisJc3RydWN0IGN2bXhfcG93X2lxX2ludF9zIGNuNTJ4eHAxOworCXN0cnVjdCBjdm14X3Bvd19pcV9pbnRfcyBjbjU2eHg7CisJc3RydWN0IGN2bXhfcG93X2lxX2ludF9zIGNuNTZ4eHAxOworfTsKKwordW5pb24gY3ZteF9wb3dfaXFfaW50X2VuIHsKKwl1aW50NjRfdCB1NjQ7CisJc3RydWN0IGN2bXhfcG93X2lxX2ludF9lbl9zIHsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfOF82Mzo1NjsKKwkJdWludDY0X3QgaW50X2VuOjg7CisJfSBzOworCXN0cnVjdCBjdm14X3Bvd19pcV9pbnRfZW5fcyBjbjUyeHg7CisJc3RydWN0IGN2bXhfcG93X2lxX2ludF9lbl9zIGNuNTJ4eHAxOworCXN0cnVjdCBjdm14X3Bvd19pcV9pbnRfZW5fcyBjbjU2eHg7CisJc3RydWN0IGN2bXhfcG93X2lxX2ludF9lbl9zIGNuNTZ4eHAxOworfTsKKwordW5pb24gY3ZteF9wb3dfaXFfdGhyeCB7CisJdWludDY0X3QgdTY0OworCXN0cnVjdCBjdm14X3Bvd19pcV90aHJ4X3MgeworCQl1aW50NjRfdCByZXNlcnZlZF8zMl82MzozMjsKKwkJdWludDY0X3QgaXFfdGhyOjMyOworCX0gczsKKwlzdHJ1Y3QgY3ZteF9wb3dfaXFfdGhyeF9zIGNuNTJ4eDsKKwlzdHJ1Y3QgY3ZteF9wb3dfaXFfdGhyeF9zIGNuNTJ4eHAxOworCXN0cnVjdCBjdm14X3Bvd19pcV90aHJ4X3MgY241Nnh4OworCXN0cnVjdCBjdm14X3Bvd19pcV90aHJ4X3MgY241Nnh4cDE7Cit9OworCit1bmlvbiBjdm14X3Bvd19ub3NfY250IHsKKwl1aW50NjRfdCB1NjQ7CisJc3RydWN0IGN2bXhfcG93X25vc19jbnRfcyB7CisJCXVpbnQ2NF90IHJlc2VydmVkXzEyXzYzOjUyOworCQl1aW50NjRfdCBub3NfY250OjEyOworCX0gczsKKwlzdHJ1Y3QgY3ZteF9wb3dfbm9zX2NudF9jbjMweHggeworCQl1aW50NjRfdCByZXNlcnZlZF83XzYzOjU3OworCQl1aW50NjRfdCBub3NfY250Ojc7CisJfSBjbjMweHg7CisJc3RydWN0IGN2bXhfcG93X25vc19jbnRfY24zMXh4IHsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfOV82Mzo1NTsKKwkJdWludDY0X3Qgbm9zX2NudDo5OworCX0gY24zMXh4OworCXN0cnVjdCBjdm14X3Bvd19ub3NfY250X3MgY24zOHh4OworCXN0cnVjdCBjdm14X3Bvd19ub3NfY250X3MgY24zOHh4cDI7CisJc3RydWN0IGN2bXhfcG93X25vc19jbnRfY24zMXh4IGNuNTB4eDsKKwlzdHJ1Y3QgY3ZteF9wb3dfbm9zX2NudF9jbjUyeHggeworCQl1aW50NjRfdCByZXNlcnZlZF8xMF82Mzo1NDsKKwkJdWludDY0X3Qgbm9zX2NudDoxMDsKKwl9IGNuNTJ4eDsKKwlzdHJ1Y3QgY3ZteF9wb3dfbm9zX2NudF9jbjUyeHggY241Mnh4cDE7CisJc3RydWN0IGN2bXhfcG93X25vc19jbnRfcyBjbjU2eHg7CisJc3RydWN0IGN2bXhfcG93X25vc19jbnRfcyBjbjU2eHhwMTsKKwlzdHJ1Y3QgY3ZteF9wb3dfbm9zX2NudF9zIGNuNTh4eDsKKwlzdHJ1Y3QgY3ZteF9wb3dfbm9zX2NudF9zIGNuNTh4eHAxOworfTsKKwordW5pb24gY3ZteF9wb3dfbndfdGltIHsKKwl1aW50NjRfdCB1NjQ7CisJc3RydWN0IGN2bXhfcG93X253X3RpbV9zIHsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfMTBfNjM6NTQ7CisJCXVpbnQ2NF90IG53X3RpbToxMDsKKwl9IHM7CisJc3RydWN0IGN2bXhfcG93X253X3RpbV9zIGNuMzB4eDsKKwlzdHJ1Y3QgY3ZteF9wb3dfbndfdGltX3MgY24zMXh4OworCXN0cnVjdCBjdm14X3Bvd19ud190aW1fcyBjbjM4eHg7CisJc3RydWN0IGN2bXhfcG93X253X3RpbV9zIGNuMzh4eHAyOworCXN0cnVjdCBjdm14X3Bvd19ud190aW1fcyBjbjUweHg7CisJc3RydWN0IGN2bXhfcG93X253X3RpbV9zIGNuNTJ4eDsKKwlzdHJ1Y3QgY3ZteF9wb3dfbndfdGltX3MgY241Mnh4cDE7CisJc3RydWN0IGN2bXhfcG93X253X3RpbV9zIGNuNTZ4eDsKKwlzdHJ1Y3QgY3ZteF9wb3dfbndfdGltX3MgY241Nnh4cDE7CisJc3RydWN0IGN2bXhfcG93X253X3RpbV9zIGNuNTh4eDsKKwlzdHJ1Y3QgY3ZteF9wb3dfbndfdGltX3MgY241OHh4cDE7Cit9OworCit1bmlvbiBjdm14X3Bvd19wZl9yc3RfbXNrIHsKKwl1aW50NjRfdCB1NjQ7CisJc3RydWN0IGN2bXhfcG93X3BmX3JzdF9tc2tfcyB7CisJCXVpbnQ2NF90IHJlc2VydmVkXzhfNjM6NTY7CisJCXVpbnQ2NF90IHJzdF9tc2s6ODsKKwl9IHM7CisJc3RydWN0IGN2bXhfcG93X3BmX3JzdF9tc2tfcyBjbjUweHg7CisJc3RydWN0IGN2bXhfcG93X3BmX3JzdF9tc2tfcyBjbjUyeHg7CisJc3RydWN0IGN2bXhfcG93X3BmX3JzdF9tc2tfcyBjbjUyeHhwMTsKKwlzdHJ1Y3QgY3ZteF9wb3dfcGZfcnN0X21za19zIGNuNTZ4eDsKKwlzdHJ1Y3QgY3ZteF9wb3dfcGZfcnN0X21za19zIGNuNTZ4eHAxOworCXN0cnVjdCBjdm14X3Bvd19wZl9yc3RfbXNrX3MgY241OHh4OworCXN0cnVjdCBjdm14X3Bvd19wZl9yc3RfbXNrX3MgY241OHh4cDE7Cit9OworCit1bmlvbiBjdm14X3Bvd19wcF9ncnBfbXNreCB7CisJdWludDY0X3QgdTY0OworCXN0cnVjdCBjdm14X3Bvd19wcF9ncnBfbXNreF9zIHsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfNDhfNjM6MTY7CisJCXVpbnQ2NF90IHFvczdfcHJpOjQ7CisJCXVpbnQ2NF90IHFvczZfcHJpOjQ7CisJCXVpbnQ2NF90IHFvczVfcHJpOjQ7CisJCXVpbnQ2NF90IHFvczRfcHJpOjQ7CisJCXVpbnQ2NF90IHFvczNfcHJpOjQ7CisJCXVpbnQ2NF90IHFvczJfcHJpOjQ7CisJCXVpbnQ2NF90IHFvczFfcHJpOjQ7CisJCXVpbnQ2NF90IHFvczBfcHJpOjQ7CisJCXVpbnQ2NF90IGdycF9tc2s6MTY7CisJfSBzOworCXN0cnVjdCBjdm14X3Bvd19wcF9ncnBfbXNreF9jbjMweHggeworCQl1aW50NjRfdCByZXNlcnZlZF8xNl82Mzo0ODsKKwkJdWludDY0X3QgZ3JwX21zazoxNjsKKwl9IGNuMzB4eDsKKwlzdHJ1Y3QgY3ZteF9wb3dfcHBfZ3JwX21za3hfY24zMHh4IGNuMzF4eDsKKwlzdHJ1Y3QgY3ZteF9wb3dfcHBfZ3JwX21za3hfY24zMHh4IGNuMzh4eDsKKwlzdHJ1Y3QgY3ZteF9wb3dfcHBfZ3JwX21za3hfY24zMHh4IGNuMzh4eHAyOworCXN0cnVjdCBjdm14X3Bvd19wcF9ncnBfbXNreF9zIGNuNTB4eDsKKwlzdHJ1Y3QgY3ZteF9wb3dfcHBfZ3JwX21za3hfcyBjbjUyeHg7CisJc3RydWN0IGN2bXhfcG93X3BwX2dycF9tc2t4X3MgY241Mnh4cDE7CisJc3RydWN0IGN2bXhfcG93X3BwX2dycF9tc2t4X3MgY241Nnh4OworCXN0cnVjdCBjdm14X3Bvd19wcF9ncnBfbXNreF9zIGNuNTZ4eHAxOworCXN0cnVjdCBjdm14X3Bvd19wcF9ncnBfbXNreF9zIGNuNTh4eDsKKwlzdHJ1Y3QgY3ZteF9wb3dfcHBfZ3JwX21za3hfcyBjbjU4eHhwMTsKK307CisKK3VuaW9uIGN2bXhfcG93X3Fvc19ybmR4IHsKKwl1aW50NjRfdCB1NjQ7CisJc3RydWN0IGN2bXhfcG93X3Fvc19ybmR4X3MgeworCQl1aW50NjRfdCByZXNlcnZlZF8zMl82MzozMjsKKwkJdWludDY0X3Qgcm5kX3AzOjg7CisJCXVpbnQ2NF90IHJuZF9wMjo4OworCQl1aW50NjRfdCBybmRfcDE6ODsKKwkJdWludDY0X3Qgcm5kOjg7CisJfSBzOworCXN0cnVjdCBjdm14X3Bvd19xb3Nfcm5keF9zIGNuMzB4eDsKKwlzdHJ1Y3QgY3ZteF9wb3dfcW9zX3JuZHhfcyBjbjMxeHg7CisJc3RydWN0IGN2bXhfcG93X3Fvc19ybmR4X3MgY24zOHh4OworCXN0cnVjdCBjdm14X3Bvd19xb3Nfcm5keF9zIGNuMzh4eHAyOworCXN0cnVjdCBjdm14X3Bvd19xb3Nfcm5keF9zIGNuNTB4eDsKKwlzdHJ1Y3QgY3ZteF9wb3dfcW9zX3JuZHhfcyBjbjUyeHg7CisJc3RydWN0IGN2bXhfcG93X3Fvc19ybmR4X3MgY241Mnh4cDE7CisJc3RydWN0IGN2bXhfcG93X3Fvc19ybmR4X3MgY241Nnh4OworCXN0cnVjdCBjdm14X3Bvd19xb3Nfcm5keF9zIGNuNTZ4eHAxOworCXN0cnVjdCBjdm14X3Bvd19xb3Nfcm5keF9zIGNuNTh4eDsKKwlzdHJ1Y3QgY3ZteF9wb3dfcW9zX3JuZHhfcyBjbjU4eHhwMTsKK307CisKK3VuaW9uIGN2bXhfcG93X3Fvc190aHJ4IHsKKwl1aW50NjRfdCB1NjQ7CisJc3RydWN0IGN2bXhfcG93X3Fvc190aHJ4X3MgeworCQl1aW50NjRfdCByZXNlcnZlZF82MF82Mzo0OworCQl1aW50NjRfdCBkZXNfY250OjEyOworCQl1aW50NjRfdCBidWZfY250OjEyOworCQl1aW50NjRfdCBmcmVlX2NudDoxMjsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfMjNfMjM6MTsKKwkJdWludDY0X3QgbWF4X3RocjoxMTsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfMTFfMTE6MTsKKwkJdWludDY0X3QgbWluX3RocjoxMTsKKwl9IHM7CisJc3RydWN0IGN2bXhfcG93X3Fvc190aHJ4X2NuMzB4eCB7CisJCXVpbnQ2NF90IHJlc2VydmVkXzU1XzYzOjk7CisJCXVpbnQ2NF90IGRlc19jbnQ6NzsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfNDNfNDc6NTsKKwkJdWludDY0X3QgYnVmX2NudDo3OworCQl1aW50NjRfdCByZXNlcnZlZF8zMV8zNTo1OworCQl1aW50NjRfdCBmcmVlX2NudDo3OworCQl1aW50NjRfdCByZXNlcnZlZF8xOF8yMzo2OworCQl1aW50NjRfdCBtYXhfdGhyOjY7CisJCXVpbnQ2NF90IHJlc2VydmVkXzZfMTE6NjsKKwkJdWludDY0X3QgbWluX3Rocjo2OworCX0gY24zMHh4OworCXN0cnVjdCBjdm14X3Bvd19xb3NfdGhyeF9jbjMxeHggeworCQl1aW50NjRfdCByZXNlcnZlZF81N182Mzo3OworCQl1aW50NjRfdCBkZXNfY250Ojk7CisJCXVpbnQ2NF90IHJlc2VydmVkXzQ1XzQ3OjM7CisJCXVpbnQ2NF90IGJ1Zl9jbnQ6OTsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfMzNfMzU6MzsKKwkJdWludDY0X3QgZnJlZV9jbnQ6OTsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfMjBfMjM6NDsKKwkJdWludDY0X3QgbWF4X3Rocjo4OworCQl1aW50NjRfdCByZXNlcnZlZF84XzExOjQ7CisJCXVpbnQ2NF90IG1pbl90aHI6ODsKKwl9IGNuMzF4eDsKKwlzdHJ1Y3QgY3ZteF9wb3dfcW9zX3RocnhfcyBjbjM4eHg7CisJc3RydWN0IGN2bXhfcG93X3Fvc190aHJ4X3MgY24zOHh4cDI7CisJc3RydWN0IGN2bXhfcG93X3Fvc190aHJ4X2NuMzF4eCBjbjUweHg7CisJc3RydWN0IGN2bXhfcG93X3Fvc190aHJ4X2NuNTJ4eCB7CisJCXVpbnQ2NF90IHJlc2VydmVkXzU4XzYzOjY7CisJCXVpbnQ2NF90IGRlc19jbnQ6MTA7CisJCXVpbnQ2NF90IHJlc2VydmVkXzQ2XzQ3OjI7CisJCXVpbnQ2NF90IGJ1Zl9jbnQ6MTA7CisJCXVpbnQ2NF90IHJlc2VydmVkXzM0XzM1OjI7CisJCXVpbnQ2NF90IGZyZWVfY250OjEwOworCQl1aW50NjRfdCByZXNlcnZlZF8yMV8yMzozOworCQl1aW50NjRfdCBtYXhfdGhyOjk7CisJCXVpbnQ2NF90IHJlc2VydmVkXzlfMTE6MzsKKwkJdWludDY0X3QgbWluX3Rocjo5OworCX0gY241Mnh4OworCXN0cnVjdCBjdm14X3Bvd19xb3NfdGhyeF9jbjUyeHggY241Mnh4cDE7CisJc3RydWN0IGN2bXhfcG93X3Fvc190aHJ4X3MgY241Nnh4OworCXN0cnVjdCBjdm14X3Bvd19xb3NfdGhyeF9zIGNuNTZ4eHAxOworCXN0cnVjdCBjdm14X3Bvd19xb3NfdGhyeF9zIGNuNTh4eDsKKwlzdHJ1Y3QgY3ZteF9wb3dfcW9zX3RocnhfcyBjbjU4eHhwMTsKK307CisKK3VuaW9uIGN2bXhfcG93X3RzX3BjIHsKKwl1aW50NjRfdCB1NjQ7CisJc3RydWN0IGN2bXhfcG93X3RzX3BjX3MgeworCQl1aW50NjRfdCByZXNlcnZlZF8zMl82MzozMjsKKwkJdWludDY0X3QgdHNfcGM6MzI7CisJfSBzOworCXN0cnVjdCBjdm14X3Bvd190c19wY19zIGNuMzB4eDsKKwlzdHJ1Y3QgY3ZteF9wb3dfdHNfcGNfcyBjbjMxeHg7CisJc3RydWN0IGN2bXhfcG93X3RzX3BjX3MgY24zOHh4OworCXN0cnVjdCBjdm14X3Bvd190c19wY19zIGNuMzh4eHAyOworCXN0cnVjdCBjdm14X3Bvd190c19wY19zIGNuNTB4eDsKKwlzdHJ1Y3QgY3ZteF9wb3dfdHNfcGNfcyBjbjUyeHg7CisJc3RydWN0IGN2bXhfcG93X3RzX3BjX3MgY241Mnh4cDE7CisJc3RydWN0IGN2bXhfcG93X3RzX3BjX3MgY241Nnh4OworCXN0cnVjdCBjdm14X3Bvd190c19wY19zIGNuNTZ4eHAxOworCXN0cnVjdCBjdm14X3Bvd190c19wY19zIGNuNTh4eDsKKwlzdHJ1Y3QgY3ZteF9wb3dfdHNfcGNfcyBjbjU4eHhwMTsKK307CisKK3VuaW9uIGN2bXhfcG93X3dhX2NvbV9wYyB7CisJdWludDY0X3QgdTY0OworCXN0cnVjdCBjdm14X3Bvd193YV9jb21fcGNfcyB7CisJCXVpbnQ2NF90IHJlc2VydmVkXzMyXzYzOjMyOworCQl1aW50NjRfdCB3YV9wYzozMjsKKwl9IHM7CisJc3RydWN0IGN2bXhfcG93X3dhX2NvbV9wY19zIGNuMzB4eDsKKwlzdHJ1Y3QgY3ZteF9wb3dfd2FfY29tX3BjX3MgY24zMXh4OworCXN0cnVjdCBjdm14X3Bvd193YV9jb21fcGNfcyBjbjM4eHg7CisJc3RydWN0IGN2bXhfcG93X3dhX2NvbV9wY19zIGNuMzh4eHAyOworCXN0cnVjdCBjdm14X3Bvd193YV9jb21fcGNfcyBjbjUweHg7CisJc3RydWN0IGN2bXhfcG93X3dhX2NvbV9wY19zIGNuNTJ4eDsKKwlzdHJ1Y3QgY3ZteF9wb3dfd2FfY29tX3BjX3MgY241Mnh4cDE7CisJc3RydWN0IGN2bXhfcG93X3dhX2NvbV9wY19zIGNuNTZ4eDsKKwlzdHJ1Y3QgY3ZteF9wb3dfd2FfY29tX3BjX3MgY241Nnh4cDE7CisJc3RydWN0IGN2bXhfcG93X3dhX2NvbV9wY19zIGNuNTh4eDsKKwlzdHJ1Y3QgY3ZteF9wb3dfd2FfY29tX3BjX3MgY241OHh4cDE7Cit9OworCit1bmlvbiBjdm14X3Bvd193YV9wY3ggeworCXVpbnQ2NF90IHU2NDsKKwlzdHJ1Y3QgY3ZteF9wb3dfd2FfcGN4X3MgeworCQl1aW50NjRfdCByZXNlcnZlZF8zMl82MzozMjsKKwkJdWludDY0X3Qgd2FfcGM6MzI7CisJfSBzOworCXN0cnVjdCBjdm14X3Bvd193YV9wY3hfcyBjbjMweHg7CisJc3RydWN0IGN2bXhfcG93X3dhX3BjeF9zIGNuMzF4eDsKKwlzdHJ1Y3QgY3ZteF9wb3dfd2FfcGN4X3MgY24zOHh4OworCXN0cnVjdCBjdm14X3Bvd193YV9wY3hfcyBjbjM4eHhwMjsKKwlzdHJ1Y3QgY3ZteF9wb3dfd2FfcGN4X3MgY241MHh4OworCXN0cnVjdCBjdm14X3Bvd193YV9wY3hfcyBjbjUyeHg7CisJc3RydWN0IGN2bXhfcG93X3dhX3BjeF9zIGNuNTJ4eHAxOworCXN0cnVjdCBjdm14X3Bvd193YV9wY3hfcyBjbjU2eHg7CisJc3RydWN0IGN2bXhfcG93X3dhX3BjeF9zIGNuNTZ4eHAxOworCXN0cnVjdCBjdm14X3Bvd193YV9wY3hfcyBjbjU4eHg7CisJc3RydWN0IGN2bXhfcG93X3dhX3BjeF9zIGNuNTh4eHAxOworfTsKKwordW5pb24gY3ZteF9wb3dfd3FfaW50IHsKKwl1aW50NjRfdCB1NjQ7CisJc3RydWN0IGN2bXhfcG93X3dxX2ludF9zIHsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfMzJfNjM6MzI7CisJCXVpbnQ2NF90IGlxX2RpczoxNjsKKwkJdWludDY0X3Qgd3FfaW50OjE2OworCX0gczsKKwlzdHJ1Y3QgY3ZteF9wb3dfd3FfaW50X3MgY24zMHh4OworCXN0cnVjdCBjdm14X3Bvd193cV9pbnRfcyBjbjMxeHg7CisJc3RydWN0IGN2bXhfcG93X3dxX2ludF9zIGNuMzh4eDsKKwlzdHJ1Y3QgY3ZteF9wb3dfd3FfaW50X3MgY24zOHh4cDI7CisJc3RydWN0IGN2bXhfcG93X3dxX2ludF9zIGNuNTB4eDsKKwlzdHJ1Y3QgY3ZteF9wb3dfd3FfaW50X3MgY241Mnh4OworCXN0cnVjdCBjdm14X3Bvd193cV9pbnRfcyBjbjUyeHhwMTsKKwlzdHJ1Y3QgY3ZteF9wb3dfd3FfaW50X3MgY241Nnh4OworCXN0cnVjdCBjdm14X3Bvd193cV9pbnRfcyBjbjU2eHhwMTsKKwlzdHJ1Y3QgY3ZteF9wb3dfd3FfaW50X3MgY241OHh4OworCXN0cnVjdCBjdm14X3Bvd193cV9pbnRfcyBjbjU4eHhwMTsKK307CisKK3VuaW9uIGN2bXhfcG93X3dxX2ludF9jbnR4IHsKKwl1aW50NjRfdCB1NjQ7CisJc3RydWN0IGN2bXhfcG93X3dxX2ludF9jbnR4X3MgeworCQl1aW50NjRfdCByZXNlcnZlZF8yOF82MzozNjsKKwkJdWludDY0X3QgdGNfY250OjQ7CisJCXVpbnQ2NF90IGRzX2NudDoxMjsKKwkJdWludDY0X3QgaXFfY250OjEyOworCX0gczsKKwlzdHJ1Y3QgY3ZteF9wb3dfd3FfaW50X2NudHhfY24zMHh4IHsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfMjhfNjM6MzY7CisJCXVpbnQ2NF90IHRjX2NudDo0OworCQl1aW50NjRfdCByZXNlcnZlZF8xOV8yMzo1OworCQl1aW50NjRfdCBkc19jbnQ6NzsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfN18xMTo1OworCQl1aW50NjRfdCBpcV9jbnQ6NzsKKwl9IGNuMzB4eDsKKwlzdHJ1Y3QgY3ZteF9wb3dfd3FfaW50X2NudHhfY24zMXh4IHsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfMjhfNjM6MzY7CisJCXVpbnQ2NF90IHRjX2NudDo0OworCQl1aW50NjRfdCByZXNlcnZlZF8yMV8yMzozOworCQl1aW50NjRfdCBkc19jbnQ6OTsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfOV8xMTozOworCQl1aW50NjRfdCBpcV9jbnQ6OTsKKwl9IGNuMzF4eDsKKwlzdHJ1Y3QgY3ZteF9wb3dfd3FfaW50X2NudHhfcyBjbjM4eHg7CisJc3RydWN0IGN2bXhfcG93X3dxX2ludF9jbnR4X3MgY24zOHh4cDI7CisJc3RydWN0IGN2bXhfcG93X3dxX2ludF9jbnR4X2NuMzF4eCBjbjUweHg7CisJc3RydWN0IGN2bXhfcG93X3dxX2ludF9jbnR4X2NuNTJ4eCB7CisJCXVpbnQ2NF90IHJlc2VydmVkXzI4XzYzOjM2OworCQl1aW50NjRfdCB0Y19jbnQ6NDsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfMjJfMjM6MjsKKwkJdWludDY0X3QgZHNfY250OjEwOworCQl1aW50NjRfdCByZXNlcnZlZF8xMF8xMToyOworCQl1aW50NjRfdCBpcV9jbnQ6MTA7CisJfSBjbjUyeHg7CisJc3RydWN0IGN2bXhfcG93X3dxX2ludF9jbnR4X2NuNTJ4eCBjbjUyeHhwMTsKKwlzdHJ1Y3QgY3ZteF9wb3dfd3FfaW50X2NudHhfcyBjbjU2eHg7CisJc3RydWN0IGN2bXhfcG93X3dxX2ludF9jbnR4X3MgY241Nnh4cDE7CisJc3RydWN0IGN2bXhfcG93X3dxX2ludF9jbnR4X3MgY241OHh4OworCXN0cnVjdCBjdm14X3Bvd193cV9pbnRfY250eF9zIGNuNTh4eHAxOworfTsKKwordW5pb24gY3ZteF9wb3dfd3FfaW50X3BjIHsKKwl1aW50NjRfdCB1NjQ7CisJc3RydWN0IGN2bXhfcG93X3dxX2ludF9wY19zIHsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfNjBfNjM6NDsKKwkJdWludDY0X3QgcGM6Mjg7CisJCXVpbnQ2NF90IHJlc2VydmVkXzI4XzMxOjQ7CisJCXVpbnQ2NF90IHBjX3RocjoyMDsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfMF83Ojg7CisJfSBzOworCXN0cnVjdCBjdm14X3Bvd193cV9pbnRfcGNfcyBjbjMweHg7CisJc3RydWN0IGN2bXhfcG93X3dxX2ludF9wY19zIGNuMzF4eDsKKwlzdHJ1Y3QgY3ZteF9wb3dfd3FfaW50X3BjX3MgY24zOHh4OworCXN0cnVjdCBjdm14X3Bvd193cV9pbnRfcGNfcyBjbjM4eHhwMjsKKwlzdHJ1Y3QgY3ZteF9wb3dfd3FfaW50X3BjX3MgY241MHh4OworCXN0cnVjdCBjdm14X3Bvd193cV9pbnRfcGNfcyBjbjUyeHg7CisJc3RydWN0IGN2bXhfcG93X3dxX2ludF9wY19zIGNuNTJ4eHAxOworCXN0cnVjdCBjdm14X3Bvd193cV9pbnRfcGNfcyBjbjU2eHg7CisJc3RydWN0IGN2bXhfcG93X3dxX2ludF9wY19zIGNuNTZ4eHAxOworCXN0cnVjdCBjdm14X3Bvd193cV9pbnRfcGNfcyBjbjU4eHg7CisJc3RydWN0IGN2bXhfcG93X3dxX2ludF9wY19zIGNuNTh4eHAxOworfTsKKwordW5pb24gY3ZteF9wb3dfd3FfaW50X3RocnggeworCXVpbnQ2NF90IHU2NDsKKwlzdHJ1Y3QgY3ZteF9wb3dfd3FfaW50X3RocnhfcyB7CisJCXVpbnQ2NF90IHJlc2VydmVkXzI5XzYzOjM1OworCQl1aW50NjRfdCB0Y19lbjoxOworCQl1aW50NjRfdCB0Y190aHI6NDsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfMjNfMjM6MTsKKwkJdWludDY0X3QgZHNfdGhyOjExOworCQl1aW50NjRfdCByZXNlcnZlZF8xMV8xMToxOworCQl1aW50NjRfdCBpcV90aHI6MTE7CisJfSBzOworCXN0cnVjdCBjdm14X3Bvd193cV9pbnRfdGhyeF9jbjMweHggeworCQl1aW50NjRfdCByZXNlcnZlZF8yOV82MzozNTsKKwkJdWludDY0X3QgdGNfZW46MTsKKwkJdWludDY0X3QgdGNfdGhyOjQ7CisJCXVpbnQ2NF90IHJlc2VydmVkXzE4XzIzOjY7CisJCXVpbnQ2NF90IGRzX3Rocjo2OworCQl1aW50NjRfdCByZXNlcnZlZF82XzExOjY7CisJCXVpbnQ2NF90IGlxX3Rocjo2OworCX0gY24zMHh4OworCXN0cnVjdCBjdm14X3Bvd193cV9pbnRfdGhyeF9jbjMxeHggeworCQl1aW50NjRfdCByZXNlcnZlZF8yOV82MzozNTsKKwkJdWludDY0X3QgdGNfZW46MTsKKwkJdWludDY0X3QgdGNfdGhyOjQ7CisJCXVpbnQ2NF90IHJlc2VydmVkXzIwXzIzOjQ7CisJCXVpbnQ2NF90IGRzX3Rocjo4OworCQl1aW50NjRfdCByZXNlcnZlZF84XzExOjQ7CisJCXVpbnQ2NF90IGlxX3Rocjo4OworCX0gY24zMXh4OworCXN0cnVjdCBjdm14X3Bvd193cV9pbnRfdGhyeF9zIGNuMzh4eDsKKwlzdHJ1Y3QgY3ZteF9wb3dfd3FfaW50X3RocnhfcyBjbjM4eHhwMjsKKwlzdHJ1Y3QgY3ZteF9wb3dfd3FfaW50X3RocnhfY24zMXh4IGNuNTB4eDsKKwlzdHJ1Y3QgY3ZteF9wb3dfd3FfaW50X3RocnhfY241Mnh4IHsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfMjlfNjM6MzU7CisJCXVpbnQ2NF90IHRjX2VuOjE7CisJCXVpbnQ2NF90IHRjX3Rocjo0OworCQl1aW50NjRfdCByZXNlcnZlZF8yMV8yMzozOworCQl1aW50NjRfdCBkc190aHI6OTsKKwkJdWludDY0X3QgcmVzZXJ2ZWRfOV8xMTozOworCQl1aW50NjRfdCBpcV90aHI6OTsKKwl9IGNuNTJ4eDsKKwlzdHJ1Y3QgY3ZteF9wb3dfd3FfaW50X3RocnhfY241Mnh4IGNuNTJ4eHAxOworCXN0cnVjdCBjdm14X3Bvd193cV9pbnRfdGhyeF9zIGNuNTZ4eDsKKwlzdHJ1Y3QgY3ZteF9wb3dfd3FfaW50X3RocnhfcyBjbjU2eHhwMTsKKwlzdHJ1Y3QgY3ZteF9wb3dfd3FfaW50X3RocnhfcyBjbjU4eHg7CisJc3RydWN0IGN2bXhfcG93X3dxX2ludF90aHJ4X3MgY241OHh4cDE7Cit9OworCit1bmlvbiBjdm14X3Bvd193c19wY3ggeworCXVpbnQ2NF90IHU2NDsKKwlzdHJ1Y3QgY3ZteF9wb3dfd3NfcGN4X3MgeworCQl1aW50NjRfdCByZXNlcnZlZF8zMl82MzozMjsKKwkJdWludDY0X3Qgd3NfcGM6MzI7CisJfSBzOworCXN0cnVjdCBjdm14X3Bvd193c19wY3hfcyBjbjMweHg7CisJc3RydWN0IGN2bXhfcG93X3dzX3BjeF9zIGNuMzF4eDsKKwlzdHJ1Y3QgY3ZteF9wb3dfd3NfcGN4X3MgY24zOHh4OworCXN0cnVjdCBjdm14X3Bvd193c19wY3hfcyBjbjM4eHhwMjsKKwlzdHJ1Y3QgY3ZteF9wb3dfd3NfcGN4X3MgY241MHh4OworCXN0cnVjdCBjdm14X3Bvd193c19wY3hfcyBjbjUyeHg7CisJc3RydWN0IGN2bXhfcG93X3dzX3BjeF9zIGNuNTJ4eHAxOworCXN0cnVjdCBjdm14X3Bvd193c19wY3hfcyBjbjU2eHg7CisJc3RydWN0IGN2bXhfcG93X3dzX3BjeF9zIGNuNTZ4eHAxOworCXN0cnVjdCBjdm14X3Bvd193c19wY3hfcyBjbjU4eHg7CisJc3RydWN0IGN2bXhfcG93X3dzX3BjeF9zIGNuNTh4eHAxOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vb2N0ZW9uL2N2bXgtc3BpbmxvY2suaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9vY3Rlb24vY3ZteC1zcGlubG9jay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmYmYwODcKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vb2N0ZW9uL2N2bXgtc3BpbmxvY2suaApAQCAtMCwwICsxLDIzMiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqbGljZW5zZSBzdGFydCoqKioqKioqKioqKioqKgorICogQXV0aG9yOiBDYXZpdW0gTmV0d29ya3MKKyAqCisgKiBDb250YWN0OiBzdXBwb3J0QGNhdml1bW5ldHdvcmtzLmNvbQorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIE9DVEVPTiBTREsKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwOCBDYXZpdW0gTmV0d29ya3MKKyAqCisgKiBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgVmVyc2lvbiAyLCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogQVMtSVMgYW5kIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkKKyAqIG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgVElUTEUsIG9yCisgKiBOT05JTkZSSU5HRU1FTlQuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlCisgKiBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgZmlsZTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKiBvciB2aXNpdCBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLgorICoKKyAqIFRoaXMgZmlsZSBtYXkgYWxzbyBiZSBhdmFpbGFibGUgdW5kZXIgYSBkaWZmZXJlbnQgbGljZW5zZSBmcm9tIENhdml1bS4KKyAqIENvbnRhY3QgQ2F2aXVtIE5ldHdvcmtzIGZvciBtb3JlIGluZm9ybWF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKipsaWNlbnNlIGVuZCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKKyAqIEltcGxlbWVudGF0aW9uIG9mIHNwaW5sb2NrcyBmb3IgT2N0ZW9uIENWTVguICBBbHRob3VnaCBzaW1pbGFyIGluCisgKiBmdW5jdGlvbiB0byBMaW51eCBrZXJuZWwgc3BpbmxvY2tzLCB0aGV5IGFyZSBub3QgY29tcGF0aWJsZS4KKyAqIE9jdGVvbiBDVk1YIHNwaW5sb2NrcyBhcmUgb25seSB1c2VkIHRvIHN5bmNocm9uaXplIHdpdGggdGhlIGJvb3QKKyAqIG1vbml0b3IgYW5kIG90aGVyIG5vbi1MaW51eCBwcm9ncmFtcyBydW5uaW5nIGluIHRoZSBzeXN0ZW0uCisgKi8KKworI2lmbmRlZiBfX0NWTVhfU1BJTkxPQ0tfSF9fCisjZGVmaW5lIF9fQ1ZNWF9TUElOTE9DS19IX18KKworI2luY2x1ZGUgImN2bXgtYXNtLmgiCisKKy8qIFNwaW5sb2NrcyBmb3IgT2N0ZW9uICovCisKKy8qIGRlZmluZSB0aGVzZSB0byBlbmFibGUgcmVjdXJzaXZlIHNwaW5sb2NrIGRlYnVnZ2luZyAqLworLyojZGVmaW5lIENWTVhfU1BJTkxPQ0tfREVCVUcgKi8KKworLyoqCisgKiBTcGlubG9ja3MgZm9yIE9jdGVvbiBDVk1YCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwl2b2xhdGlsZSB1aW50MzJfdCB2YWx1ZTsKK30gY3ZteF9zcGlubG9ja190OworCisvKiBub3RlIC0gbWFjcm9zIG5vdCBleHBhbmRlZCBpbiBpbmxpbmUgQVNNLCBzbyB2YWx1ZXMgaGFyZGNvZGVkICovCisjZGVmaW5lICBDVk1YX1NQSU5MT0NLX1VOTE9DS0VEX1ZBTCAgMAorI2RlZmluZSAgQ1ZNWF9TUElOTE9DS19MT0NLRURfVkFMICAgIDEKKworI2RlZmluZSBDVk1YX1NQSU5MT0NLX1VOTE9DS0VEX0lOSVRJQUxJWkVSICB7Q1ZNWF9TUElOTE9DS19VTkxPQ0tFRF9WQUx9CisKKy8qKgorICogSW5pdGlhbGl6ZSBhIHNwaW5sb2NrCisgKgorICogQGxvY2s6ICAgTG9jayB0byBpbml0aWFsaXplCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBjdm14X3NwaW5sb2NrX2luaXQoY3ZteF9zcGlubG9ja190ICpsb2NrKQoreworCWxvY2stPnZhbHVlID0gQ1ZNWF9TUElOTE9DS19VTkxPQ0tFRF9WQUw7Cit9CisKKy8qKgorICogUmV0dXJuIG5vbi16ZXJvIGlmIHRoZSBzcGlubG9jayBpcyBjdXJyZW50bHkgbG9ja2VkCisgKgorICogQGxvY2s6ICAgTG9jayB0byBjaGVjaworICogUmV0dXJucyBOb24temVybyBpZiBsb2NrZWQKKyAqLworc3RhdGljIGlubGluZSBpbnQgY3ZteF9zcGlubG9ja19sb2NrZWQoY3ZteF9zcGlubG9ja190ICpsb2NrKQoreworCXJldHVybiBsb2NrLT52YWx1ZSAhPSBDVk1YX1NQSU5MT0NLX1VOTE9DS0VEX1ZBTDsKK30KKworLyoqCisgKiBSZWxlYXNlcyBsb2NrCisgKgorICogQGxvY2s6ICAgcG9pbnRlciB0byBsb2NrIHN0cnVjdHVyZQorICovCitzdGF0aWMgaW5saW5lIHZvaWQgY3ZteF9zcGlubG9ja191bmxvY2soY3ZteF9zcGlubG9ja190ICpsb2NrKQoreworCUNWTVhfU1lOQ1dTOworCWxvY2stPnZhbHVlID0gMDsKKwlDVk1YX1NZTkNXUzsKK30KKworLyoqCisgKiBBdHRlbXB0cyB0byB0YWtlIHRoZSBsb2NrLCBidXQgZG9lcyBub3Qgc3BpbiBpZiBsb2NrIGlzIG5vdCBhdmFpbGFibGUuCisgKiBNYXkgdGFrZSBzb21lIHRpbWUgdG8gYWNxdWlyZSB0aGUgbG9jayBldmVuIGlmIGl0IGlzIGF2YWlsYWJsZQorICogZHVlIHRvIHRoZSBsbC9zYyBub3Qgc3VjY2VlZGluZy4KKyAqCisgKiBAbG9jazogICBwb2ludGVyIHRvIGxvY2sgc3RydWN0dXJlCisgKgorICogUmV0dXJucyAwOiBsb2NrIHN1Y2Nlc3NmdWxseSB0YWtlbgorICogICAgICAgICAxOiBsb2NrIG5vdCB0YWtlbiwgaGVsZCBieSBzb21lb25lIGVsc2UKKyAqIFRoZXNlIHJldHVybiB2YWx1ZXMgbWF0Y2ggdGhlIExpbnV4IHNlbWFudGljcy4KKyAqLworCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBjdm14X3NwaW5sb2NrX3RyeWxvY2soY3ZteF9zcGlubG9ja190ICpsb2NrKQoreworCXVuc2lnbmVkIGludCB0bXA7CisKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygiLnNldCBub3Jlb3JkZXIgICAgICAgICBcbiIKKwkJCSAgICAgIjE6IGxsICAgJVt0bXBdLCAlW3ZhbF0gXG4iCisJCQkvKiBpZiBsb2NrIGhlbGQsIGZhaWwgaW1tZWRpYXRlbHkgKi8KKwkJCSAgICAgIiAgIGJuZXogJVt0bXBdLCAyZiAgICAgXG4iCisJCQkgICAgICIgICBsaSAgICVbdG1wXSwgMSAgICAgIFxuIgorCQkJICAgICAiICAgc2MgICAlW3RtcF0sICVbdmFsXSBcbiIKKwkJCSAgICAgIiAgIGJlcXogJVt0bXBdLCAxYiAgICAgXG4iCisJCQkgICAgICIgICBsaSAgICVbdG1wXSwgMCAgICAgIFxuIgorCQkJICAgICAiMjogICAgICAgICAgICAgICAgICAgICBcbiIKKwkJCSAgICAgIi5zZXQgcmVvcmRlciAgICAgICAgICAgXG4iIDoKKwkJCVt2YWxdICIrbSIobG9jay0+dmFsdWUpLCBbdG1wXSAiPSZyIih0bXApCisJCQkgICAgIDogOiAibWVtb3J5Iik7CisKKwlyZXR1cm4gdG1wICE9IDA7CQkvKiBub3JtYWxpemUgdG8gMCBvciAxICovCit9CisKKy8qKgorICogR2V0cyBsb2NrLCBzcGlucyB1bnRpbCBsb2NrIGlzIHRha2VuCisgKgorICogQGxvY2s6ICAgcG9pbnRlciB0byBsb2NrIHN0cnVjdHVyZQorICovCitzdGF0aWMgaW5saW5lIHZvaWQgY3ZteF9zcGlubG9ja19sb2NrKGN2bXhfc3BpbmxvY2tfdCAqbG9jaykKK3sKKwl1bnNpZ25lZCBpbnQgdG1wOworCisJX19hc21fXyBfX3ZvbGF0aWxlX18oIi5zZXQgbm9yZW9yZGVyICAgICAgICAgXG4iCisJCQkgICAgICIxOiBsbCAgICVbdG1wXSwgJVt2YWxdICBcbiIKKwkJCSAgICAgIiAgIGJuZXogJVt0bXBdLCAxYiAgICAgXG4iCisJCQkgICAgICIgICBsaSAgICVbdG1wXSwgMSAgICAgIFxuIgorCQkJICAgICAiICAgc2MgICAlW3RtcF0sICVbdmFsXSBcbiIKKwkJCSAgICAgIiAgIGJlcXogJVt0bXBdLCAxYiAgICAgXG4iCisJCQkgICAgICIgICBub3AgICAgICAgICAgICAgICAgXG4iCisJCQkgICAgICIuc2V0IHJlb3JkZXIgICAgICAgICAgIFxuIiA6CisJCQlbdmFsXSAiK20iKGxvY2stPnZhbHVlKSwgW3RtcF0gIj0mciIodG1wKQorCQkJOiA6ICJtZW1vcnkiKTsKKworfQorCisvKiogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEJpdCBzcGlubG9ja3MKKyAqIFRoZXNlIHNwaW5sb2NrcyB1c2UgYSBzaW5nbGUgYml0IChiaXQgMzEpIG9mIGEgMzIgYml0IHdvcmQgZm9yIGxvY2tpbmcuCisgKiBUaGUgcmVzdCBvZiB0aGUgYml0cyBpbiB0aGUgd29yZCBhcmUgbGVmdCB1bmRpc3R1cmJlZC4gIFRoaXMgZW5hYmxlcyBtb3JlCisgKiBjb21wYWN0IGRhdGEgc3RydWN0dXJlcyBhcyBvbmx5IDEgYml0IGlzIGNvbnN1bWVkIGZvciB0aGUgbG9jay4KKyAqCisgKi8KKworLyoqCisgKiBHZXRzIGxvY2ssIHNwaW5zIHVudGlsIGxvY2sgaXMgdGFrZW4KKyAqIFByZXNlcnZlcyB0aGUgbG93IDMxIGJpdHMgb2YgdGhlIDMyIGJpdAorICogd29yZCB1c2VkIGZvciB0aGUgbG9jay4KKyAqCisgKgorICogQHdvcmQ6ICB3b3JkIHRvIGxvY2sgYml0IDMxIG9mCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBjdm14X3NwaW5sb2NrX2JpdF9sb2NrKHVpbnQzMl90ICp3b3JkKQoreworCXVuc2lnbmVkIGludCB0bXA7CisJdW5zaWduZWQgaW50IHNhdjsKKworCV9fYXNtX18gX192b2xhdGlsZV9fKCIuc2V0IG5vcmVvcmRlciAgICAgICAgIFxuIgorCQkJICAgICAiLnNldCBub2F0ICAgICAgICAgICAgICBcbiIKKwkJCSAgICAgIjE6IGxsICAgICVbdG1wXSwgJVt2YWxdICBcbiIKKwkJCSAgICAgIiAgIGJiaXQxICVbdG1wXSwgMzEsIDFiICAgIFxuIgorCQkJICAgICAiICAgbGkgICAgJGF0LCAxICAgICAgXG4iCisJCQkgICAgICIgICBpbnMgICAlW3RtcF0sICRhdCwgMzEsIDEgIFxuIgorCQkJICAgICAiICAgc2MgICAgJVt0bXBdLCAlW3ZhbF0gXG4iCisJCQkgICAgICIgICBiZXF6ICAlW3RtcF0sIDFiICAgICBcbiIKKwkJCSAgICAgIiAgIG5vcCAgICAgICAgICAgICAgICBcbiIKKwkJCSAgICAgIi5zZXQgYXQgICAgICAgICAgICAgIFxuIgorCQkJICAgICAiLnNldCByZW9yZGVyICAgICAgICAgICBcbiIgOgorCQkJW3ZhbF0gIittIigqd29yZCksIFt0bXBdICI9JnIiKHRtcCksIFtzYXZdICI9JnIiKHNhdikKKwkJCSAgICAgOiA6ICJtZW1vcnkiKTsKKworfQorCisvKioKKyAqIEF0dGVtcHRzIHRvIGdldCBsb2NrLCByZXR1cm5zIGltbWVkaWF0ZWx5IHdpdGggc3VjY2Vzcy9mYWlsdXJlCisgKiBQcmVzZXJ2ZXMgdGhlIGxvdyAzMSBiaXRzIG9mIHRoZSAzMiBiaXQKKyAqIHdvcmQgdXNlZCBmb3IgdGhlIGxvY2suCisgKgorICoKKyAqIEB3b3JkOiAgd29yZCB0byBsb2NrIGJpdCAzMSBvZgorICogUmV0dXJucyAwOiBsb2NrIHN1Y2Nlc3NmdWxseSB0YWtlbgorICogICAgICAgICAxOiBsb2NrIG5vdCB0YWtlbiwgaGVsZCBieSBzb21lb25lIGVsc2UKKyAqIFRoZXNlIHJldHVybiB2YWx1ZXMgbWF0Y2ggdGhlIExpbnV4IHNlbWFudGljcy4KKyAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgY3ZteF9zcGlubG9ja19iaXRfdHJ5bG9jayh1aW50MzJfdCAqd29yZCkKK3sKKwl1bnNpZ25lZCBpbnQgdG1wOworCisJX19hc21fXyBfX3ZvbGF0aWxlX18oIi5zZXQgbm9yZW9yZGVyXG5cdCIKKwkJCSAgICAgIi5zZXQgbm9hdFxuIgorCQkJICAgICAiMTogbGwgICAgJVt0bXBdLCAlW3ZhbF0gXG4iCisJCQkvKiBpZiBsb2NrIGhlbGQsIGZhaWwgaW1tZWRpYXRlbHkgKi8KKwkJCSAgICAgIiAgIGJiaXQxICVbdG1wXSwgMzEsIDJmICAgICBcbiIKKwkJCSAgICAgIiAgIGxpICAgICRhdCwgMSAgICAgIFxuIgorCQkJICAgICAiICAgaW5zICAgJVt0bXBdLCAkYXQsIDMxLCAxICBcbiIKKwkJCSAgICAgIiAgIHNjICAgICVbdG1wXSwgJVt2YWxdIFxuIgorCQkJICAgICAiICAgYmVxeiAgJVt0bXBdLCAxYiAgICAgXG4iCisJCQkgICAgICIgICBsaSAgICAlW3RtcF0sIDAgICAgICBcbiIKKwkJCSAgICAgIjI6ICAgICAgICAgICAgICAgICAgICAgXG4iCisJCQkgICAgICIuc2V0IGF0ICAgICAgICAgICAgICBcbiIKKwkJCSAgICAgIi5zZXQgcmVvcmRlciAgICAgICAgICAgXG4iIDoKKwkJCVt2YWxdICIrbSIoKndvcmQpLCBbdG1wXSAiPSZyIih0bXApCisJCQk6IDogIm1lbW9yeSIpOworCisJcmV0dXJuIHRtcCAhPSAwOwkJLyogbm9ybWFsaXplIHRvIDAgb3IgMSAqLworfQorCisvKioKKyAqIFJlbGVhc2VzIGJpdCBsb2NrCisgKgorICogVW5jb25kaXRpb25hbGx5IGNsZWFycyBiaXQgMzEgb2YgdGhlIGxvY2sgd29yZC4gIE5vdGUgdGhhdCB0aGlzIGlzCisgKiBkb25lIG5vbi1hdG9taWNhbGx5LCBhcyB0aGlzIGltcGxlbWVudGF0aW9uIGFzc3VtZXMgdGhhdCB0aGUgcmVzdAorICogb2YgdGhlIGJpdHMgaW4gdGhlIHdvcmQgYXJlIHByb3RlY3RlZCBieSB0aGUgbG9jay4KKyAqCisgKiBAd29yZDogIHdvcmQgdG8gdW5sb2NrIGJpdCAzMSBpbgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgY3ZteF9zcGlubG9ja19iaXRfdW5sb2NrKHVpbnQzMl90ICp3b3JkKQoreworCUNWTVhfU1lOQ1dTOworCSp3b3JkICY9IH4oMVVMIDw8IDMxKTsKKwlDVk1YX1NZTkNXUzsKK30KKworI2VuZGlmIC8qIF9fQ1ZNWF9TUElOTE9DS19IX18gKi8KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9vY3Rlb24vY3ZteC1zeXNpbmZvLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vb2N0ZW9uL2N2bXgtc3lzaW5mby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxZGQ1NzQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vb2N0ZW9uL2N2bXgtc3lzaW5mby5oCkBAIC0wLDAgKzEsMTUyIEBACisvKioqKioqKioqKioqKioqKioqKioqKipsaWNlbnNlIHN0YXJ0KioqKioqKioqKioqKioqCisgKiBBdXRob3I6IENhdml1bSBOZXR3b3JrcworICoKKyAqIENvbnRhY3Q6IHN1cHBvcnRAY2F2aXVtbmV0d29ya3MuY29tCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgT0NURU9OIFNESworICoKKyAqIENvcHlyaWdodCAoYykgMjAwMy0yMDA4IENhdml1bSBOZXR3b3JrcworICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBWZXJzaW9uIDIsIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBBUy1JUyBhbmQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eQorICogb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBUSVRMRSwgb3IKKyAqIE5PTklORlJJTkdFTUVOVC4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUKKyAqIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBmaWxlOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqIG9yIHZpc2l0IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uCisgKgorICogVGhpcyBmaWxlIG1heSBhbHNvIGJlIGF2YWlsYWJsZSB1bmRlciBhIGRpZmZlcmVudCBsaWNlbnNlIGZyb20gQ2F2aXVtLgorICogQ29udGFjdCBDYXZpdW0gTmV0d29ya3MgZm9yIG1vcmUgaW5mb3JtYXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKmxpY2Vuc2UgZW5kKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBUaGlzIG1vZHVsZSBwcm92aWRlcyBzeXN0ZW0vYm9hcmQgaW5mb3JtYXRpb24gb2J0YWluZWQgYnkgdGhlIGJvb3Rsb2FkZXIuCisgKi8KKworI2lmbmRlZiBfX0NWTVhfU1lTSU5GT19IX18KKyNkZWZpbmUgX19DVk1YX1NZU0lORk9fSF9fCisKKyNkZWZpbmUgT0NURU9OX1NFUklBTF9MRU4gMjAKKy8qKgorICogU3RydWN0dXJlIGRlc2NyaWJpbmcgYXBwbGljYXRpb24gc3BlY2lmaWMgaW5mb3JtYXRpb24uCisgKiBfX2N2bXhfYXBwX2luaXQoKSBwb3B1bGF0ZXMgdGhpcyBmcm9tIHRoZSBjdm14IGJvb3QgZGVzY3JpcHRvci4KKyAqIFRoaXMgc3RydWN0dXJlIGlzIHByaXZhdGUgdG8gc2ltcGxlIGV4ZWN1dGl2ZSBhcHBsaWNhdGlvbnMsIHNvCisgKiBubyB2ZXJzaW9uaW5nIGlzIHJlcXVpcmVkLgorICoKKyAqIFRoaXMgc3RydWN0dXJlIG11c3QgYmUgcHJvdmlkZWQgd2l0aCBzb21lIGZpZWxkcyBzZXQgaW4gb3JkZXIgdG8KKyAqIHVzZSBzaW1wbGUgZXhlY3V0aXZlIGZ1bmN0aW9ucyBpbiBvdGhlciBhcHBsaWNhdGlvbnMgKExpbnV4IGtlcm5lbCwKKyAqIHUtYm9vdCwgZXRjLikgIFRoZSBjdm14X3N5c2luZm9fbWluaW1hbF9pbml0aWFsaXplKCkgZnVuY3Rpb24gaXMKKyAqIHByb3ZpZGVkIHRvIHNldCB0aGUgcmVxdWlyZWQgdmFsdWVzIGluIHRoZXNlIGNhc2VzLgorICovCitzdHJ1Y3QgY3ZteF9zeXNpbmZvIHsKKwkvKiBTeXN0ZW0gd2lkZSB2YXJpYWJsZXMgKi8KKwkvKiBpbnN0YWxsZWQgRFJBTSBpbiBzeXN0ZW0sIGluIGJ5dGVzICovCisJdWludDY0X3Qgc3lzdGVtX2RyYW1fc2l6ZTsKKworCS8qIHB0ciB0byBtZW1vcnkgZGVzY3JpcHRvciBibG9jayAqLworCXZvaWQgKnBoeV9tZW1fZGVzY19wdHI7CisKKworCS8qIEFwcGxpY2F0aW9uIGltYWdlIHNwZWNpZmljIHZhcmlhYmxlcyAqLworCS8qIHN0YWNrIHRvcCBhZGRyZXNzICh2aXJ0dWFsKSAqLworCXVpbnQ2NF90IHN0YWNrX3RvcDsKKwkvKiBoZWFwIGJhc2UgYWRkcmVzcyAodmlydHVhbCkgKi8KKwl1aW50NjRfdCBoZWFwX2Jhc2U7CisJLyogc3RhY2sgc2l6ZSBpbiBieXRlcyAqLworCXVpbnQzMl90IHN0YWNrX3NpemU7CisJLyogaGVhcCBzaXplIGluIGJ5dGVzICovCisJdWludDMyX3QgaGVhcF9zaXplOworCS8qIGNvcmVtYXNrIGRlZmluaW5nIGNvcmVzIHJ1bm5pbmcgYXBwbGljYXRpb24gKi8KKwl1aW50MzJfdCBjb3JlX21hc2s7CisJLyogRGVwcmVjYXRlZCwgdXNlIGN2bXhfY29yZW1hc2tfZmlyc3RfY29yZSgpIHRvIHNlbGVjdCBpbml0IGNvcmUgKi8KKwl1aW50MzJfdCBpbml0X2NvcmU7CisKKwkvKiBleGNlcHRpb24gYmFzZSBhZGRyZXNzLCBhcyBzZXQgYnkgYm9vdGxvYWRlciAqLworCXVpbnQ2NF90IGV4Y2VwdGlvbl9iYXNlX2FkZHI7CisKKwkvKiBjcHUgY2xvY2sgc3BlZWQgaW4gaHogKi8KKwl1aW50MzJfdCBjcHVfY2xvY2tfaHo7CisKKwkvKiBkcmFtIGRhdGEgcmF0ZSBpbiBoeiAoZGF0YSByYXRlID0gMiAqIGNsb2NrIHJhdGUgKi8KKwl1aW50MzJfdCBkcmFtX2RhdGFfcmF0ZV9oejsKKworCisJdWludDE2X3QgYm9hcmRfdHlwZTsKKwl1aW50OF90IGJvYXJkX3Jldl9tYWpvcjsKKwl1aW50OF90IGJvYXJkX3Jldl9taW5vcjsKKwl1aW50OF90IG1hY19hZGRyX2Jhc2VbNl07CisJdWludDhfdCBtYWNfYWRkcl9jb3VudDsKKwljaGFyIGJvYXJkX3NlcmlhbF9udW1iZXJbT0NURU9OX1NFUklBTF9MRU5dOworCS8qCisJICogU2V2ZXJhbCBib2FyZHMgc3VwcG9ydCBjb21wYWN0IGZsYXNoIG9uIHRoZSBPY3Rlb24gYm9vdAorCSAqIGJ1cy4gIFRoZSBDRiBtZW1vcnkgc3BhY2VzIG1heSBiZSBtYXBwZWQgdG8gZGlmZmVyZW50CisJICogYWRkcmVzc2VzIG9uIGRpZmZlcmVudCBib2FyZHMuICBUaGVzZSB2YWx1ZXMgd2lsbCBiZSAwIGlmCisJICogQ0YgaXMgbm90IHByZXNlbnQuICBOb3RlIHRoYXQgdGhlc2UgYWRkcmVzc2VzIGFyZSBwaHlzaWNhbAorCSAqIGFkZHJlc3NlcywgYW5kIGl0IGlzIHVwIHRvIHRoZSBhcHBsaWNhdGlvbiB0byB1c2UgdGhlCisJICogcHJvcGVyIGFkZHJlc3NpbmcgbW9kZSAoWEtQSFlTLCBLU0VHMCwgZXRjLikKKwkgKi8KKwl1aW50NjRfdCBjb21wYWN0X2ZsYXNoX2NvbW1vbl9iYXNlX2FkZHI7CisJdWludDY0X3QgY29tcGFjdF9mbGFzaF9hdHRyaWJ1dGVfYmFzZV9hZGRyOworCS8qCisJICogQmFzZSBhZGRyZXNzIG9mIHRoZSBMRUQgZGlzcGxheSAoYXMgb24gRUJUMzAwMCBib2FyZCkgVGhpcworCSAqIHdpbGwgYmUgMCBpZiBMRUQgZGlzcGxheSBub3QgcHJlc2VudC4gIE5vdGUgdGhhdCB0aGlzCisJICogYWRkcmVzcyBpcyBhIHBoeXNpY2FsIGFkZHJlc3MsIGFuZCBpdCBpcyB1cCB0byB0aGUKKwkgKiBhcHBsaWNhdGlvbiB0byB1c2UgdGhlIHByb3BlciBhZGRyZXNzaW5nIG1vZGUgKFhLUEhZUywKKwkgKiBLU0VHMCwgZXRjLikKKwkgKi8KKwl1aW50NjRfdCBsZWRfZGlzcGxheV9iYXNlX2FkZHI7CisJLyogREZBIHJlZmVyZW5jZSBjbG9jayBpbiBoeiAoaWYgYXBwbGljYWJsZSkqLworCXVpbnQzMl90IGRmYV9yZWZfY2xvY2tfaHo7CisJLyogY29uZmlndXJhdGlvbiBmbGFncyBmcm9tIGJvb3Rsb2FkZXIgKi8KKwl1aW50MzJfdCBib290bG9hZGVyX2NvbmZpZ19mbGFnczsKKworCS8qIFVhcnQgbnVtYmVyIHVzZWQgZm9yIGNvbnNvbGUgKi8KKwl1aW50OF90IGNvbnNvbGVfdWFydF9udW07Cit9OworCisvKioKKyAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgc3lzdGVtL2JvYXJkIGluZm9ybWF0aW9uIGFzIG9idGFpbmVkCisgKiBieSB0aGUgYm9vdGxvYWRlci4KKyAqCisgKgorICogUmV0dXJucyAgUG9pbnRlciB0byB0aGUgYm9vdCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUKKyAqCisgKi8KKworZXh0ZXJuIHN0cnVjdCBjdm14X3N5c2luZm8gKmN2bXhfc3lzaW5mb19nZXQodm9pZCk7CisKKy8qKgorICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGluIG5vbi1zaW1wbGUgZXhlY3V0aXZlIGVudmlyb25tZW50cyAoc3VjaCBhcworICogTGludXgga2VybmVsLCB1LWJvb3QsIGV0Yy4pICB0byBjb25maWd1cmUgdGhlIG1pbmltYWwgZmllbGRzIHRoYXQKKyAqIGFyZSByZXF1aXJlZCB0byB1c2Ugc2ltcGxlIGV4ZWN1dGl2ZSBmaWxlcyBkaXJlY3RseS4KKyAqCisgKiBMb2NraW5nIChpZiByZXF1aXJlZCkgbXVzdCBiZSBoYW5kbGVkIG91dHNpZGUgb2YgdGhpcworICogZnVuY3Rpb24KKyAqCisgKiBAcGh5X21lbV9kZXNjX3B0cjogUG9pbnRlciB0byBnbG9iYWwgcGh5c2ljYWwgbWVtb3J5IGRlc2NyaXB0b3IKKyAqICAgICAgICAgICAgICAgICAgIChib290bWVtIGRlc2NyaXB0b3IpIEBib2FyZF90eXBlOiBPY3Rlb24gYm9hcmQKKyAqICAgICAgICAgICAgICAgICAgIHR5cGUgZW51bWVyYXRpb24KKyAqCisgKiBAYm9hcmRfcmV2X21ham9yOgorICogICAgICAgICAgICAgICAgICAgQm9hcmQgbWFqb3IgcmV2aXNpb24KKyAqIEBib2FyZF9yZXZfbWlub3I6CisgKiAgICAgICAgICAgICAgICAgICBCb2FyZCBtaW5vciByZXZpc2lvbgorICogQGNwdV9jbG9ja19oejoKKyAqICAgICAgICAgICAgICAgICAgIENQVSBjbG9jayBmcmVxZW5jeSBpbiBoZXJ0egorICoKKyAqIFJldHVybnMgMDogRmFpbHVyZQorICogICAgICAgICAxOiBzdWNjZXNzCisgKi8KK2V4dGVybiBpbnQgY3ZteF9zeXNpbmZvX21pbmltYWxfaW5pdGlhbGl6ZSh2b2lkICpwaHlfbWVtX2Rlc2NfcHRyLAorCQkJCQkgICB1aW50MTZfdCBib2FyZF90eXBlLAorCQkJCQkgICB1aW50OF90IGJvYXJkX3Jldl9tYWpvciwKKwkJCQkJICAgdWludDhfdCBib2FyZF9yZXZfbWlub3IsCisJCQkJCSAgIHVpbnQzMl90IGNwdV9jbG9ja19oeik7CisKKyNlbmRpZiAvKiBfX0NWTVhfU1lTSU5GT19IX18gKi8KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9vY3Rlb24vY3ZteC5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL29jdGVvbi9jdm14LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDNmZGRmYQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9vY3Rlb24vY3ZteC5oCkBAIC0wLDAgKzEsNTA1IEBACisvKioqKioqKioqKioqKioqKioqKioqKipsaWNlbnNlIHN0YXJ0KioqKioqKioqKioqKioqCisgKiBBdXRob3I6IENhdml1bSBOZXR3b3JrcworICoKKyAqIENvbnRhY3Q6IHN1cHBvcnRAY2F2aXVtbmV0d29ya3MuY29tCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgT0NURU9OIFNESworICoKKyAqIENvcHlyaWdodCAoYykgMjAwMy0yMDA4IENhdml1bSBOZXR3b3JrcworICoKKyAqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBWZXJzaW9uIDIsIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBBUy1JUyBhbmQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eQorICogb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBUSVRMRSwgb3IKKyAqIE5PTklORlJJTkdFTUVOVC4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUKKyAqIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBmaWxlOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqIG9yIHZpc2l0IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uCisgKgorICogVGhpcyBmaWxlIG1heSBhbHNvIGJlIGF2YWlsYWJsZSB1bmRlciBhIGRpZmZlcmVudCBsaWNlbnNlIGZyb20gQ2F2aXVtLgorICogQ29udGFjdCBDYXZpdW0gTmV0d29ya3MgZm9yIG1vcmUgaW5mb3JtYXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKmxpY2Vuc2UgZW5kKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX19DVk1YX0hfXworI2RlZmluZSBfX0NWTVhfSF9fCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKworI2luY2x1ZGUgImN2bXgtYXNtLmgiCisjaW5jbHVkZSAiY3ZteC1wYWNrZXQuaCIKKyNpbmNsdWRlICJjdm14LXN5c2luZm8uaCIKKworI2luY2x1ZGUgImN2bXgtY2l1LWRlZnMuaCIKKyNpbmNsdWRlICJjdm14LWdwaW8tZGVmcy5oIgorI2luY2x1ZGUgImN2bXgtaW9iLWRlZnMuaCIKKyNpbmNsdWRlICJjdm14LWlwZC1kZWZzLmgiCisjaW5jbHVkZSAiY3ZteC1sMmMtZGVmcy5oIgorI2luY2x1ZGUgImN2bXgtbDJkLWRlZnMuaCIKKyNpbmNsdWRlICJjdm14LWwydC1kZWZzLmgiCisjaW5jbHVkZSAiY3ZteC1sZWQtZGVmcy5oIgorI2luY2x1ZGUgImN2bXgtbWlvLWRlZnMuaCIKKyNpbmNsdWRlICJjdm14LXBvdy1kZWZzLmgiCisKKyNpbmNsdWRlICJjdm14LWJvb3RpbmZvLmgiCisjaW5jbHVkZSAiY3ZteC1ib290bWVtLmgiCisjaW5jbHVkZSAiY3ZteC1sMmMuaCIKKworI2lmbmRlZiBDVk1YX0VOQUJMRV9ERUJVR19QUklOVFMKKyNkZWZpbmUgQ1ZNWF9FTkFCTEVfREVCVUdfUFJJTlRTIDEKKyNlbmRpZgorCisjaWYgQ1ZNWF9FTkFCTEVfREVCVUdfUFJJTlRTCisjZGVmaW5lIGN2bXhfZHByaW50ZiAgICAgICAgcHJpbnRrCisjZWxzZQorI2RlZmluZSBjdm14X2RwcmludGYoLi4uKSAgIHt9CisjZW5kaWYKKworI2RlZmluZSBDVk1YX01BWF9DT1JFUyAgICAgICAgICAoMTYpCisjZGVmaW5lIENWTVhfQ0FDSEVfTElORV9TSVpFICAgICgxMjgpCS8qIEluIGJ5dGVzICovCisjZGVmaW5lIENWTVhfQ0FDSEVfTElORV9NQVNLICAgIChDVk1YX0NBQ0hFX0xJTkVfU0laRSAtIDEpCS8qIEluIGJ5dGVzICovCisjZGVmaW5lIENWTVhfQ0FDSEVfTElORV9BTElHTkVEIF9fYXR0cmlidXRlX18gKChhbGlnbmVkKENWTVhfQ0FDSEVfTElORV9TSVpFKSkpCisjZGVmaW5lIENBU1Q2NCh2KSAoKGxvbmcgbG9uZykobG9uZykodikpCisjZGVmaW5lIENBU1RQVFIodHlwZSwgdikgKCh0eXBlICopKGxvbmcpKHYpKQorCisvKgorICogUmV0dXJucyBwcm9jZXNzb3IgSUQsIGRpZmZlcmVudCBMaW51eCBhbmQgc2ltcGxlIGV4ZWMgdmVyc2lvbnMKKyAqIHByb3ZpZGVkIGluIHRoZSBjdm14LWFwcC1pbml0Ki5jIGZpbGVzLgorICovCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IGN2bXhfZ2V0X3Byb2NfaWQodm9pZCkgX19hdHRyaWJ1dGVfXyAoKHB1cmUpKTsKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgY3ZteF9nZXRfcHJvY19pZCh2b2lkKQoreworCXVpbnQzMl90IGlkOworCWFzbSgibWZjMCAlMCwgJDE1LDAiIDogIj1yIihpZCkpOworCXJldHVybiBpZDsKK30KKworLyogdHVybiB0aGUgdmFyaWFibGUgbmFtZSBpbnRvIGEgc3RyaW5nICovCisjZGVmaW5lIENWTVhfVE1QX1NUUih4KSBDVk1YX1RNUF9TVFIyKHgpCisjZGVmaW5lIENWTVhfVE1QX1NUUjIoeCkgI3gKKworLyoqCisgKiBCdWlsZHMgYSBiaXQgbWFzayBnaXZlbiB0aGUgcmVxdWlyZWQgc2l6ZSBpbiBiaXRzLgorICoKKyAqIEBiaXRzOiAgIE51bWJlciBvZiBiaXRzIGluIHRoZSBtYXNrCisgKiBSZXR1cm5zIFRoZSBtYXNrCisgKi8gc3RhdGljIGlubGluZSB1aW50NjRfdCBjdm14X2J1aWxkX21hc2sodWludDY0X3QgYml0cykKK3sKKwlyZXR1cm4gfigofjB4MHVsbCkgPDwgYml0cyk7Cit9CisKKy8qKgorICogQnVpbGRzIGEgbWVtb3J5IGFkZHJlc3MgZm9yIEkvTyBiYXNlZCBvbiB0aGUgTWFqb3IgYW5kIFN1YiBESUQuCisgKgorICogQG1ham9yX2RpZDogNSBiaXQgbWFqb3IgZGlkCisgKiBAc3ViX2RpZDogICAzIGJpdCBzdWIgZGlkCisgKiBSZXR1cm5zIEkvTyBiYXNlIGFkZHJlc3MKKyAqLworc3RhdGljIGlubGluZSB1aW50NjRfdCBjdm14X2J1aWxkX2lvX2FkZHJlc3ModWludDY0X3QgbWFqb3JfZGlkLAorCQkJCQkgICAgIHVpbnQ2NF90IHN1Yl9kaWQpCit7CisJcmV0dXJuICgweDF1bGwgPDwgNDgpIHwgKG1ham9yX2RpZCA8PCA0MykgfCAoc3ViX2RpZCA8PCA0MCk7Cit9CisKKy8qKgorICogUGVyZm9ybSBtYXNrIGFuZCBzaGlmdCB0byBwbGFjZSB0aGUgc3VwcGxpZWQgdmFsdWUgaW50bworICogdGhlIHN1cHBsaWVkIGJpdCByYWdlLgorICoKKyAqIEV4YW1wbGU6IGN2bXhfYnVpbGRfYml0cygzOSwyNCx2YWx1ZSkKKyAqIDxwcmU+CisgKiA2ICAgICAgIDUgICAgICAgNCAgICAgICAzICAgICAgIDMgICAgICAgMiAgICAgICAxCisgKiAzICAgICAgIDUgICAgICAgNyAgICAgICA5ICAgICAgIDEgICAgICAgMyAgICAgICA1ICAgICAgIDcgICAgICAwCisgKiArLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0rCisgKiAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBfX19fX19fX19fX3ZhbHVlMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCisgKiA8L3ByZT4KKyAqCisgKiBAaGlnaF9iaXQ6IEhpZ2hlc3QgYml0IHZhbHVlIGNhbiBvY2N1cHkgKGluY2x1c2l2ZSkgMC02MworICogQGxvd19iaXQ6ICBMb3dlc3QgYml0IHZhbHVlIGNhbiBvY2N1cHkgaW5jbHVzaXZlIDAtaGlnaF9iaXQKKyAqIEB2YWx1ZTogICAgVmFsdWUgdG8gdXNlCisgKiBSZXR1cm5zIFZhbHVlIG1hc2tlZCBhbmQgc2hpZnRlZAorICovCitzdGF0aWMgaW5saW5lIHVpbnQ2NF90IGN2bXhfYnVpbGRfYml0cyh1aW50NjRfdCBoaWdoX2JpdCwKKwkJCQkgICAgICAgdWludDY0X3QgbG93X2JpdCwgdWludDY0X3QgdmFsdWUpCit7CisJcmV0dXJuICh2YWx1ZSAmIGN2bXhfYnVpbGRfbWFzayhoaWdoX2JpdCAtIGxvd19iaXQgKyAxKSkgPDwgbG93X2JpdDsKK30KKworZW51bSBjdm14X21pcHNfc3BhY2UgeworCUNWTVhfTUlQU19TUEFDRV9YS1NFRyA9IDNMTCwKKwlDVk1YX01JUFNfU1BBQ0VfWEtQSFlTID0gMkxMLAorCUNWTVhfTUlQU19TUEFDRV9YU1NFRyA9IDFMTCwKKwlDVk1YX01JUFNfU1BBQ0VfWFVTRUcgPSAwTEwKK307CisKKy8qIFRoZXNlIG1hY3JvcyBmb3IgdXNlIHdoZW4gdXNpbmcgMzIgYml0IHBvaW50ZXJzLiAqLworI2RlZmluZSBDVk1YX01JUFMzMl9TUEFDRV9LU0VHMCAxbAorI2RlZmluZSBDVk1YX0FERF9TRUczMihzZWdtZW50LCBhZGQpIFwKKwkoKChpbnQzMl90KXNlZ21lbnQgPDwgMzEpIHwgKGludDMyX3QpKGFkZCkpCisKKyNkZWZpbmUgQ1ZNWF9JT19TRUcgQ1ZNWF9NSVBTX1NQQUNFX1hLUEhZUworCisvKiBUaGVzZSBtYWNyb3Mgc2ltcGxpZnkgdGhlIHByb2Nlc3Mgb2YgY3JlYXRpbmcgY29tbW9uIElPIGFkZHJlc3NlcyAqLworI2RlZmluZSBDVk1YX0FERF9TRUcoc2VnbWVudCwgYWRkKSBcCisJKCgoKHVpbnQ2NF90KXNlZ21lbnQpIDw8IDYyKSB8IChhZGQpKQorI2lmbmRlZiBDVk1YX0FERF9JT19TRUcKKyNkZWZpbmUgQ1ZNWF9BRERfSU9fU0VHKGFkZCkgQ1ZNWF9BRERfU0VHKENWTVhfSU9fU0VHLCAoYWRkKSkKKyNlbmRpZgorCisvKioKKyAqIENvbnZlcnQgYSBtZW1vcnkgcG9pbnRlciAodm9pZCopIGludG8gYSBoYXJkd2FyZSBjb21wYXRhYmxlCisgKiBtZW1vcnkgYWRkcmVzcyAodWludDY0X3QpLiBPY3Rlb24gaGFyZHdhcmUgd2lkZ2V0cyBkb24ndAorICogdW5kZXJzdGFuZCBsb2dpY2FsIGFkZHJlc3Nlcy4KKyAqCisgKiBAcHRyOiAgICBDIHN0eWxlIG1lbW9yeSBwb2ludGVyCisgKiBSZXR1cm5zIEhhcmR3YXJlIHBoeXNpY2FsIGFkZHJlc3MKKyAqLworc3RhdGljIGlubGluZSB1aW50NjRfdCBjdm14X3B0cl90b19waHlzKHZvaWQgKnB0cikKK3sKKwlpZiAoc2l6ZW9mKHZvaWQgKikgPT0gOCkgeworCQkvKgorCQkgKiBXZSdyZSBydW5uaW5nIGluIDY0IGJpdCBtb2RlLiBOb3JtYWxseSB0aGlzIG1lYW5zCisJCSAqIHRoYXQgd2UgY2FuIHVzZSA0MCBiaXRzIG9mIGFkZHJlc3Mgc3BhY2UgKHRoZQorCQkgKiBoYXJkd2FyZSBsaW1pdCkuIFVuZm9ydHVuYXRlbHkgdGhlcmUgaXMgb25lIGNhc2UKKwkJICogd2VyZSB3ZSBuZWVkIHRvIGxpbWl0IHRoaXMgdG8gMzAgYml0cywgc2lnbgorCQkgKiBleHRlbmRlZCAzMiBiaXQuIEFsdGhvdWdoIHRoZXNlIGFyZSA2NCBiaXRzIHdpZGUsCisJCSAqIG9ubHkgMzAgYml0cyBjYW4gYmUgdXNlZC4KKwkJICovCisJCWlmICgoQ0FTVDY0KHB0cikgPj4gNjIpID09IDMpCisJCQlyZXR1cm4gQ0FTVDY0KHB0cikgJiBjdm14X2J1aWxkX21hc2soMzApOworCQllbHNlCisJCQlyZXR1cm4gQ0FTVDY0KHB0cikgJiBjdm14X2J1aWxkX21hc2soNDApOworCX0gZWxzZSB7CisJCXJldHVybiAobG9uZykocHRyKSAmIDB4MWZmZmZmZmY7CisJfQorfQorCisvKioKKyAqIENvbnZlcnQgYSBoYXJkd2FyZSBwaHlzaWNhbCBhZGRyZXNzICh1aW50NjRfdCkgaW50byBhCisgKiBtZW1vcnkgcG9pbnRlciAodm9pZCAqKS4KKyAqCisgKiBAcGh5c2ljYWxfYWRkcmVzczoKKyAqICAgICAgICAgICAgICAgSGFyZHdhcmUgcGh5c2ljYWwgYWRkcmVzcyB0byBtZW1vcnkKKyAqIFJldHVybnMgUG9pbnRlciB0byBtZW1vcnkKKyAqLworc3RhdGljIGlubGluZSB2b2lkICpjdm14X3BoeXNfdG9fcHRyKHVpbnQ2NF90IHBoeXNpY2FsX2FkZHJlc3MpCit7CisJaWYgKHNpemVvZih2b2lkICopID09IDgpIHsKKwkJLyogSnVzdCBzZXQgdGhlIHRvcCBiaXQsIGF2b2lkaW5nIGFueSBUTEIgdWdseW5lc3MgKi8KKwkJcmV0dXJuIENBU1RQVFIodm9pZCwKKwkJCSAgICAgICBDVk1YX0FERF9TRUcoQ1ZNWF9NSVBTX1NQQUNFX1hLUEhZUywKKwkJCQkJICAgIHBoeXNpY2FsX2FkZHJlc3MpKTsKKwl9IGVsc2UgeworCQlyZXR1cm4gQ0FTVFBUUih2b2lkLAorCQkJICAgICAgIENWTVhfQUREX1NFRzMyKENWTVhfTUlQUzMyX1NQQUNFX0tTRUcwLAorCQkJCQkgICAgICBwaHlzaWNhbF9hZGRyZXNzKSk7CisJfQorfQorCisvKiBUaGUgZm9sbG93aW5nICNpZiBjb250cm9scyB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgbWFjcm8KKyAgICBDVk1YX0JVSUxEX1dSSVRFNjQuIFRoaXMgbWFjcm8gaXMgdXNlZCB0byBidWlsZCBhIHN0b3JlIG9wZXJhdGlvbiB0bworICAgIGEgZnVsbCA2NGJpdCBhZGRyZXNzLiBXaXRoIGEgNjRiaXQgQUJJLCB0aGlzIGNhbiBiZSBkb25lIHdpdGggYSBzaW1wbGUKKyAgICBwb2ludGVyIGFjY2Vzcy4gMzJiaXQgQUJJcyByZXF1aXJlIG1vcmUgY29tcGxpY2F0ZWQgYXNzZW1ibHkgKi8KKworLyogV2UgaGF2ZSBhIGZ1bGwgNjRiaXQgQUJJLiBXcml0aW5nIHRvIGEgNjRiaXQgYWRkcmVzcyBjYW4gYmUgZG9uZSB3aXRoCisgICAgYSBzaW1wbGUgdm9sYXRpbGUgcG9pbnRlciAqLworI2RlZmluZSBDVk1YX0JVSUxEX1dSSVRFNjQoVFlQRSwgU1QpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIGlubGluZSB2b2lkIGN2bXhfd3JpdGU2NF8jI1RZUEUodWludDY0X3QgYWRkciwgVFlQRSMjX3QgdmFsKSAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICpDQVNUUFRSKHZvbGF0aWxlIFRZUEUjI190LCBhZGRyKSA9IHZhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisKKy8qIFRoZSBmb2xsb3dpbmcgI2lmIGNvbnRyb2xzIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBtYWNybworICAgIENWTVhfQlVJTERfUkVBRDY0LiBUaGlzIG1hY3JvIGlzIHVzZWQgdG8gYnVpbGQgYSBsb2FkIG9wZXJhdGlvbiBmcm9tCisgICAgYSBmdWxsIDY0Yml0IGFkZHJlc3MuIFdpdGggYSA2NGJpdCBBQkksIHRoaXMgY2FuIGJlIGRvbmUgd2l0aCBhIHNpbXBsZQorICAgIHBvaW50ZXIgYWNjZXNzLiAzMmJpdCBBQklzIHJlcXVpcmUgbW9yZSBjb21wbGljYXRlZCBhc3NlbWJseSAqLworCisvKiBXZSBoYXZlIGEgZnVsbCA2NGJpdCBBQkkuIFdyaXRpbmcgdG8gYSA2NGJpdCBhZGRyZXNzIGNhbiBiZSBkb25lIHdpdGgKKyAgICBhIHNpbXBsZSB2b2xhdGlsZSBwb2ludGVyICovCisjZGVmaW5lIENWTVhfQlVJTERfUkVBRDY0KFRZUEUsIExUKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgaW5saW5lIFRZUEUjI190IGN2bXhfcmVhZDY0XyMjVFlQRSh1aW50NjRfdCBhZGRyKSAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJcmV0dXJuICpDQVNUUFRSKHZvbGF0aWxlIFRZUEUjI190LCBhZGRyKTsJCQlcCit9CisKKworLyogVGhlIGZvbGxvd2luZyBkZWZpbmVzIDggZnVuY3Rpb25zIGZvciB3cml0aW5nIHRvIGEgNjRiaXQgYWRkcmVzcy4gRWFjaAorICAgIHRha2VzIHR3byBhcmd1bWVudHMsIHRoZSBhZGRyZXNzIGFuZCB0aGUgdmFsdWUgdG8gd3JpdGUuCisgICAgY3ZteF93cml0ZTY0X2ludDY0ICAgICAgY3ZteF93cml0ZTY0X3VpbnQ2NAorICAgIGN2bXhfd3JpdGU2NF9pbnQzMiAgICAgIGN2bXhfd3JpdGU2NF91aW50MzIKKyAgICBjdm14X3dyaXRlNjRfaW50MTYgICAgICBjdm14X3dyaXRlNjRfdWludDE2CisgICAgY3ZteF93cml0ZTY0X2ludDggICAgICAgY3ZteF93cml0ZTY0X3VpbnQ4ICovCitDVk1YX0JVSUxEX1dSSVRFNjQoaW50NjQsICJzZCIpOworQ1ZNWF9CVUlMRF9XUklURTY0KGludDMyLCAic3ciKTsKK0NWTVhfQlVJTERfV1JJVEU2NChpbnQxNiwgInNoIik7CitDVk1YX0JVSUxEX1dSSVRFNjQoaW50OCwgInNiIik7CitDVk1YX0JVSUxEX1dSSVRFNjQodWludDY0LCAic2QiKTsKK0NWTVhfQlVJTERfV1JJVEU2NCh1aW50MzIsICJzdyIpOworQ1ZNWF9CVUlMRF9XUklURTY0KHVpbnQxNiwgInNoIik7CitDVk1YX0JVSUxEX1dSSVRFNjQodWludDgsICJzYiIpOworI2RlZmluZSBjdm14X3dyaXRlNjQgY3ZteF93cml0ZTY0X3VpbnQ2NAorCisvKiBUaGUgZm9sbG93aW5nIGRlZmluZXMgOCBmdW5jdGlvbnMgZm9yIHJlYWRpbmcgZnJvbSBhIDY0Yml0IGFkZHJlc3MuIEVhY2gKKyAgICB0YWtlcyB0aGUgYWRkcmVzcyBhcyB0aGUgb25seSBhcmd1bWVudAorICAgIGN2bXhfcmVhZDY0X2ludDY0ICAgICAgIGN2bXhfcmVhZDY0X3VpbnQ2NAorICAgIGN2bXhfcmVhZDY0X2ludDMyICAgICAgIGN2bXhfcmVhZDY0X3VpbnQzMgorICAgIGN2bXhfcmVhZDY0X2ludDE2ICAgICAgIGN2bXhfcmVhZDY0X3VpbnQxNgorICAgIGN2bXhfcmVhZDY0X2ludDggICAgICAgIGN2bXhfcmVhZDY0X3VpbnQ4ICovCitDVk1YX0JVSUxEX1JFQUQ2NChpbnQ2NCwgImxkIik7CitDVk1YX0JVSUxEX1JFQUQ2NChpbnQzMiwgImx3Iik7CitDVk1YX0JVSUxEX1JFQUQ2NChpbnQxNiwgImxoIik7CitDVk1YX0JVSUxEX1JFQUQ2NChpbnQ4LCAibGIiKTsKK0NWTVhfQlVJTERfUkVBRDY0KHVpbnQ2NCwgImxkIik7CitDVk1YX0JVSUxEX1JFQUQ2NCh1aW50MzIsICJsdyIpOworQ1ZNWF9CVUlMRF9SRUFENjQodWludDE2LCAibGh1Iik7CitDVk1YX0JVSUxEX1JFQUQ2NCh1aW50OCwgImxidSIpOworI2RlZmluZSBjdm14X3JlYWQ2NCBjdm14X3JlYWQ2NF91aW50NjQKKworCitzdGF0aWMgaW5saW5lIHZvaWQgY3ZteF93cml0ZV9jc3IodWludDY0X3QgY3NyX2FkZHIsIHVpbnQ2NF90IHZhbCkKK3sKKwljdm14X3dyaXRlNjQoY3NyX2FkZHIsIHZhbCk7CisKKwkvKgorCSAqIFBlcmZvcm0gYW4gaW1tZWRpYXRlIHJlYWQgYWZ0ZXIgZXZlcnkgd3JpdGUgdG8gYW4gUlNMCisJICogcmVnaXN0ZXIgdG8gZm9yY2UgdGhlIHdyaXRlIHRvIGNvbXBsZXRlLiBJdCBkb2Vzbid0IG1hdHRlcgorCSAqIHdoYXQgUlNMIHJlYWQgd2UgZG8sIHNvIHdlIGNob29zZSBDVk1YX01JT19CT09UX0JJU1RfU1RBVAorCSAqIGJlY2F1c2UgaXQgaXMgZmFzdCBhbmQgaGFybWxlc3MuCisJICovCisJaWYgKChjc3JfYWRkciA+PiA0MCkgPT0gKDB4ODAwMTE4KSkKKwkJY3ZteF9yZWFkNjQoQ1ZNWF9NSU9fQk9PVF9CSVNUX1NUQVQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgY3ZteF93cml0ZV9pbyh1aW50NjRfdCBpb19hZGRyLCB1aW50NjRfdCB2YWwpCit7CisJY3ZteF93cml0ZTY0KGlvX2FkZHIsIHZhbCk7CisKK30KKworc3RhdGljIGlubGluZSB1aW50NjRfdCBjdm14X3JlYWRfY3NyKHVpbnQ2NF90IGNzcl9hZGRyKQoreworCXVpbnQ2NF90IHZhbCA9IGN2bXhfcmVhZDY0KGNzcl9hZGRyKTsKKwlyZXR1cm4gdmFsOworfQorCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjdm14X3NlbmRfc2luZ2xlKHVpbnQ2NF90IGRhdGEpCit7CisJY29uc3QgdWludDY0X3QgQ1ZNWF9JT0JETUFfU0VORFNJTkdMRSA9IDB4ZmZmZmZmZmZmZmZmYTIwMHVsbDsKKwljdm14X3dyaXRlNjQoQ1ZNWF9JT0JETUFfU0VORFNJTkdMRSwgZGF0YSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjdm14X3JlYWRfY3NyX2FzeW5jKHVpbnQ2NF90IHNjcmFkZHIsIHVpbnQ2NF90IGNzcl9hZGRyKQoreworCXVuaW9uIHsKKwkJdWludDY0X3QgdTY0OworCQlzdHJ1Y3QgeworCQkJdWludDY0X3Qgc2NyYWRkcjo4OworCQkJdWludDY0X3QgbGVuOjg7CisJCQl1aW50NjRfdCBhZGRyOjQ4OworCQl9IHM7CisJfSBhZGRyOworCWFkZHIudTY0ID0gY3NyX2FkZHI7CisJYWRkci5zLnNjcmFkZHIgPSBzY3JhZGRyID4+IDM7CisJYWRkci5zLmxlbiA9IDE7CisJY3ZteF9zZW5kX3NpbmdsZShhZGRyLnU2NCk7Cit9CisKKy8qIFJldHVybiB0cnVlIGlmIE9jdGVvbiBpcyBDTjM4WFggcGFzcyAxICovCitzdGF0aWMgaW5saW5lIGludCBjdm14X29jdGVvbl9pc19wYXNzMSh2b2lkKQoreworI2lmIE9DVEVPTl9JU19DT01NT05fQklOQVJZKCkKKwlyZXR1cm4gMDsJLyogUGFzcyAxIGlzbid0IHN1cHBvcnRlZCBmb3IgY29tbW9uIGJpbmFyaWVzICovCisjZWxzZQorLyogTm93IHRoYXQgd2Uga25vdyB3ZSdyZSBidWlsdCBmb3IgYSBzcGVjaWZpYyBtb2RlbCwgb25seSBjaGVjayBDTjM4WFggKi8KKyNpZiBPQ1RFT05fSVNfTU9ERUwoT0NURU9OX0NOMzhYWCkKKwlyZXR1cm4gY3ZteF9nZXRfcHJvY19pZCgpID09IE9DVEVPTl9DTjM4WFhfUEFTUzE7CisjZWxzZQorCXJldHVybiAwOwkvKiBCdWlsdCBmb3Igbm9uIENOMzhYWCBjaGlwLCB3ZSdyZSBub3QgQ04zOFhYIHBhc3MxICovCisjZW5kaWYKKyNlbmRpZgorfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBjdm14X2dldF9jb3JlX251bSh2b2lkKQoreworCXVuc2lnbmVkIGludCBjb3JlX251bTsKKwlDVk1YX1JESFdSTlYoY29yZV9udW0sIDApOworCXJldHVybiBjb3JlX251bTsKK30KKworLyoqCisgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYml0cyBzZXQgaW4gdGhlIHByb3ZpZGVkIHZhbHVlLgorICogU2ltcGxlIHdyYXBwZXIgZm9yIFBPUCBpbnN0cnVjdGlvbi4KKyAqCisgKiBAdmFsOiAgICAzMiBiaXQgdmFsdWUgdG8gY291bnQgc2V0IGJpdHMgaW4KKyAqCisgKiBSZXR1cm5zIE51bWJlciBvZiBiaXRzIHNldAorICovCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IGN2bXhfcG9wKHVpbnQzMl90IHZhbCkKK3sKKwl1aW50MzJfdCBwb3A7CisJQ1ZNWF9QT1AocG9wLCB2YWwpOworCXJldHVybiBwb3A7Cit9CisKKy8qKgorICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJpdHMgc2V0IGluIHRoZSBwcm92aWRlZCB2YWx1ZS4KKyAqIFNpbXBsZSB3cmFwcGVyIGZvciBEUE9QIGluc3RydWN0aW9uLgorICoKKyAqIEB2YWw6ICAgIDY0IGJpdCB2YWx1ZSB0byBjb3VudCBzZXQgYml0cyBpbgorICoKKyAqIFJldHVybnMgTnVtYmVyIG9mIGJpdHMgc2V0CisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGN2bXhfZHBvcCh1aW50NjRfdCB2YWwpCit7CisJaW50IHBvcDsKKwlDVk1YX0RQT1AocG9wLCB2YWwpOworCXJldHVybiBwb3A7Cit9CisKKy8qKgorICogUHJvdmlkZSBjdXJyZW50IGN5Y2xlIGNvdW50ZXIgYXMgYSByZXR1cm4gdmFsdWUKKyAqCisgKiBSZXR1cm5zIGN1cnJlbnQgY3ljbGUgY291bnRlcgorICovCisKK3N0YXRpYyBpbmxpbmUgdWludDY0X3QgY3ZteF9nZXRfY3ljbGUodm9pZCkKK3sKKwl1aW50NjRfdCBjeWNsZTsKKwlDVk1YX1JESFdSKGN5Y2xlLCAzMSk7CisJcmV0dXJuIGN5Y2xlOworfQorCisvKioKKyAqIFJlYWRzIGEgY2hpcCBnbG9iYWwgY3ljbGUgY291bnRlci4gIFRoaXMgY291bnRzIENQVSBjeWNsZXMgc2luY2UKKyAqIGNoaXAgcmVzZXQuICBUaGUgY291bnRlciBpcyA2NCBiaXQuCisgKiBUaGlzIHJlZ2lzdGVyIGRvZXMgbm90IGV4aXN0IG9uIENOMzhYWCBwYXNzIDEgc2lsaWNpb24KKyAqCisgKiBSZXR1cm5zIEdsb2JhbCBjaGlwIGN5Y2xlIGNvdW50IHNpbmNlIGNoaXAgcmVzZXQuCisgKi8KK3N0YXRpYyBpbmxpbmUgdWludDY0X3QgY3ZteF9nZXRfY3ljbGVfZ2xvYmFsKHZvaWQpCit7CisJaWYgKGN2bXhfb2N0ZW9uX2lzX3Bhc3MxKCkpCisJCXJldHVybiAwOworCWVsc2UKKwkJcmV0dXJuIGN2bXhfcmVhZDY0KENWTVhfSVBEX0NMS19DT1VOVCk7Cit9CisKKy8qKgorICogVGhpcyBtYWNybyBzcGlucyBvbiBhIGZpZWxkIHdhaXRpbmcgZm9yIGl0IHRvIHJlYWNoIGEgdmFsdWUuIEl0CisgKiBpcyBjb21tb24gaW4gY29kZSB0byBuZWVkIHRvIHdhaXQgZm9yIGEgc3BlY2lmaWMgZmllbGQgaW4gYSBDU1IKKyAqIHRvIG1hdGNoIGEgc3BlY2lmaWMgdmFsdWUuIENvbmNlcHR1YWxseSB0aGlzIG1hY3JvIGV4cGFuZHMgdG86CisgKgorICogMSkgcmVhZCBjc3IgYXQgImFkZHJlc3MiIHdpdGggYSBjc3IgdHlwZWRlZiBvZiAidHlwZSIKKyAqIDIpIENoZWNrIGlmICgidHlwZSIucy4iZmllbGQiICJvcCIgInZhbHVlIikKKyAqIDMpIElmICMyIGlzbid0IHRydWUgbG9vcCB0byAjMSB1bmxlc3MgdG9vIG11Y2ggdGltZSBoYXMgcGFzc2VkLgorICovCisjZGVmaW5lIENWTVhfV0FJVF9GT1JfRklFTEQ2NChhZGRyZXNzLCB0eXBlLCBmaWVsZCwgb3AsIHZhbHVlLCB0aW1lb3V0X3VzZWMpXAorICAgICgJCQkJCQkJCQlcCit7CQkJCQkJCQkJXAorCWludCByZXN1bHQ7CQkJCQkJCVwKKwlkbyB7CQkJCQkJCQlcCisJCXVpbnQ2NF90IGRvbmUgPSBjdm14X2dldF9jeWNsZSgpICsgKHVpbnQ2NF90KXRpbWVvdXRfdXNlYyAqIFwKKwkJCWN2bXhfc3lzaW5mb19nZXQoKS0+Y3B1X2Nsb2NrX2h6IC8gMTAwMDAwMDsJXAorCQl0eXBlIGM7CQkJCQkJCVwKKwkJd2hpbGUgKDEpIHsJCQkJCQlcCisJCQljLnU2NCA9IGN2bXhfcmVhZF9jc3IoYWRkcmVzcyk7CQkJXAorCQkJaWYgKChjLnMuZmllbGQpIG9wKHZhbHVlKSkgewkJCVwKKwkJCQlyZXN1bHQgPSAwOwkJCQlcCisJCQkJYnJlYWs7CQkJCQlcCisJCQl9IGVsc2UgaWYgKGN2bXhfZ2V0X2N5Y2xlKCkgPiBkb25lKSB7CQlcCisJCQkJcmVzdWx0ID0gLTE7CQkJCVwKKwkJCQlicmVhazsJCQkJCVwKKwkJCX0gZWxzZQkJCQkJCVwKKwkJCQljdm14X3dhaXQoMTAwKTsJCQkJXAorCQl9CQkJCQkJCVwKKwl9IHdoaWxlICgwKTsJCQkJCQkJXAorCXJlc3VsdDsJCQkJCQkJCVwKK30pCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjdm14X3Jlc2V0X29jdGVvbih2b2lkKQoreworCXVuaW9uIGN2bXhfY2l1X3NvZnRfcnN0IGNpdV9zb2Z0X3JzdDsKKwljaXVfc29mdF9yc3QudTY0ID0gMDsKKwljaXVfc29mdF9yc3Qucy5zb2Z0X3JzdCA9IDE7CisJY3ZteF93cml0ZV9jc3IoQ1ZNWF9DSVVfU09GVF9SU1QsIGNpdV9zb2Z0X3JzdC51NjQpOworfQorCisvKiBSZXR1cm4gdGhlIG51bWJlciBvZiBjb3JlcyBhdmFpbGFibGUgaW4gdGhlIGNoaXAgKi8KK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgY3ZteF9vY3Rlb25fbnVtX2NvcmVzKHZvaWQpCit7CisJdWludDMyX3QgY2l1X2Z1c2UgPSAodWludDMyX3QpIGN2bXhfcmVhZF9jc3IoQ1ZNWF9DSVVfRlVTRSkgJiAweGZmZmY7CisJcmV0dXJuIGN2bXhfcG9wKGNpdV9mdXNlKTsKK30KKworLyoqCisgKiBSZWFkIGEgYnl0ZSBvZiBmdXNlIGRhdGEKKyAqIEBieXRlX2FkZHI6ICAgYWRkcmVzcyB0byByZWFkCisgKgorICogUmV0dXJucyBmdXNlIHZhbHVlOiAwIG9yIDEKKyAqLworc3RhdGljIHVpbnQ4X3QgY3ZteF9mdXNlX3JlYWRfYnl0ZShpbnQgYnl0ZV9hZGRyKQoreworCXVuaW9uIGN2bXhfbWlvX2Z1c19yY21kIHJlYWRfY21kOworCisJcmVhZF9jbWQudTY0ID0gMDsKKwlyZWFkX2NtZC5zLmFkZHIgPSBieXRlX2FkZHI7CisJcmVhZF9jbWQucy5wZW5kID0gMTsKKwljdm14X3dyaXRlX2NzcihDVk1YX01JT19GVVNfUkNNRCwgcmVhZF9jbWQudTY0KTsKKwl3aGlsZSAoKHJlYWRfY21kLnU2NCA9IGN2bXhfcmVhZF9jc3IoQ1ZNWF9NSU9fRlVTX1JDTUQpKQorCSAgICAgICAmJiByZWFkX2NtZC5zLnBlbmQpCisJCTsKKwlyZXR1cm4gcmVhZF9jbWQucy5kYXQ7Cit9CisKKy8qKgorICogUmVhZCBhIHNpbmdsZSBmdXNlIGJpdAorICoKKyAqIEBmdXNlOiAgIEZ1c2UgbnVtYmVyICgwLTEwMjQpCisgKgorICogUmV0dXJucyBmdXNlIHZhbHVlOiAwIG9yIDEKKyAqLworc3RhdGljIGlubGluZSBpbnQgY3ZteF9mdXNlX3JlYWQoaW50IGZ1c2UpCit7CisJcmV0dXJuIChjdm14X2Z1c2VfcmVhZF9ieXRlKGZ1c2UgPj4gMykgPj4gKGZ1c2UgJiAweDcpKSAmIDE7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGN2bXhfb2N0ZW9uX21vZGVsX0NOMzZYWCh2b2lkKQoreworCXJldHVybiBPQ1RFT05fSVNfTU9ERUwoT0NURU9OX0NOMzhYWCkKKwkJJiYgIWN2bXhfb2N0ZW9uX2lzX3Bhc3MxKCkKKwkJJiYgY3ZteF9mdXNlX3JlYWQoMjY0KTsKK30KKworc3RhdGljIGlubGluZSBpbnQgY3ZteF9vY3Rlb25femlwX3ByZXNlbnQodm9pZCkKK3sKKwlyZXR1cm4gb2N0ZW9uX2hhc19mZWF0dXJlKE9DVEVPTl9GRUFUVVJFX1pJUCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGN2bXhfb2N0ZW9uX2RmYV9wcmVzZW50KHZvaWQpCit7CisJaWYgKCFPQ1RFT05fSVNfTU9ERUwoT0NURU9OX0NOMzhYWCkKKwkgICAgJiYgIU9DVEVPTl9JU19NT0RFTChPQ1RFT05fQ04zMVhYKQorCSAgICAmJiAhT0NURU9OX0lTX01PREVMKE9DVEVPTl9DTjU4WFgpKQorCQlyZXR1cm4gMDsKKwllbHNlIGlmIChPQ1RFT05fSVNfTU9ERUwoT0NURU9OX0NOMzAyMCkpCisJCXJldHVybiAwOworCWVsc2UgaWYgKGN2bXhfb2N0ZW9uX2lzX3Bhc3MxKCkpCisJCXJldHVybiAxOworCWVsc2UKKwkJcmV0dXJuICFjdm14X2Z1c2VfcmVhZCgxMjApOworfQorCitzdGF0aWMgaW5saW5lIGludCBjdm14X29jdGVvbl9jcnlwdG9fcHJlc2VudCh2b2lkKQoreworCXJldHVybiBvY3Rlb25faGFzX2ZlYXR1cmUoT0NURU9OX0ZFQVRVUkVfQ1JZUFRPKTsKK30KKworI2VuZGlmIC8qICBfX0NWTVhfSF9fICAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL29jdGVvbi9vY3Rlb24tZmVhdHVyZS5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL29jdGVvbi9vY3Rlb24tZmVhdHVyZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0ZmFjNjgKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vb2N0ZW9uL29jdGVvbi1mZWF0dXJlLmgKQEAgLTAsMCArMSwxMTkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKmxpY2Vuc2Ugc3RhcnQqKioqKioqKioqKioqKioKKyAqIEF1dGhvcjogQ2F2aXVtIE5ldHdvcmtzCisgKgorICogQ29udGFjdDogc3VwcG9ydEBjYXZpdW1uZXR3b3Jrcy5jb20KKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBPQ1RFT04gU0RLCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMDggQ2F2aXVtIE5ldHdvcmtzCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIFZlcnNpb24gMiwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIEFTLUlTIGFuZCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5CisgKiBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIFRJVExFLCBvcgorICogTk9OSU5GUklOR0VNRU5ULiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZQorICogZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIGZpbGU7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICogb3IgdmlzaXQgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy4KKyAqCisgKiBUaGlzIGZpbGUgbWF5IGFsc28gYmUgYXZhaWxhYmxlIHVuZGVyIGEgZGlmZmVyZW50IGxpY2Vuc2UgZnJvbSBDYXZpdW0uCisgKiBDb250YWN0IENhdml1bSBOZXR3b3JrcyBmb3IgbW9yZSBpbmZvcm1hdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqbGljZW5zZSBlbmQqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIEZpbGUgZGVmaW5pbmcgY2hlY2tzIGZvciBkaWZmZXJlbnQgT2N0ZW9uIGZlYXR1cmVzLgorICovCisKKyNpZm5kZWYgX19PQ1RFT05fRkVBVFVSRV9IX18KKyNkZWZpbmUgX19PQ1RFT05fRkVBVFVSRV9IX18KKworZW51bSBvY3Rlb25fZmVhdHVyZSB7CisJLyoKKwkgKiBPY3Rlb24gbW9kZWxzIGluIHRoZSBDTjVYWFggZmFtaWx5IGFuZCBoaWdoZXIgc3VwcG9ydAorCSAqIGF0b21pYyBhZGQgaW5zdHJ1Y3Rpb25zIHRvIG1lbW9yeSAoc2FhL3NhYWQpLgorCSAqLworCU9DVEVPTl9GRUFUVVJFX1NBQUQsCisJLyogRG9lcyB0aGlzIE9jdGVvbiBzdXBwb3J0IHRoZSBaSVAgb2ZmbG9hZCBlbmdpbmU/ICovCisJT0NURU9OX0ZFQVRVUkVfWklQLAorCS8qIERvZXMgdGhpcyBPY3Rlb24gc3VwcG9ydCBjcnlwdG8gYWNjZWxlcmF0aW9uIHVzaW5nIENPUDI/ICovCisJT0NURU9OX0ZFQVRVUkVfQ1JZUFRPLAorCS8qIERvZXMgdGhpcyBPY3Rlb24gc3VwcG9ydCBQQ0kgZXhwcmVzcz8gKi8KKwlPQ1RFT05fRkVBVFVSRV9QQ0lFLAorCS8qIFNvbWUgT2N0ZW9uIG1vZGVscyBzdXBwb3J0IGludGVybmFsIG1lbW9yeSBmb3Igc3RvcmluZworCSAqIGNyeXB0b2dyYXBoaWMga2V5cyAqLworCU9DVEVPTl9GRUFUVVJFX0tFWV9NRU1PUlksCisJLyogT2N0ZW9uIGhhcyBhIExFRCBjb250cm9sbGVyIGZvciBiYW5rcyBvZiBleHRlcm5hbCBMRURzICovCisJT0NURU9OX0ZFQVRVUkVfTEVEX0NPTlRST0xMRVIsCisJLyogT2N0ZW9uIGhhcyBhIHRyYWNlIGJ1ZmZlciAqLworCU9DVEVPTl9GRUFUVVJFX1RSQSwKKwkvKiBPY3Rlb24gaGFzIGEgbWFuYWdlbWVudCBwb3J0ICovCisJT0NURU9OX0ZFQVRVUkVfTUdNVF9QT1JULAorCS8qIE9jdGVvbiBoYXMgYSByYWlkIHVuaXQgKi8KKwlPQ1RFT05fRkVBVFVSRV9SQUlELAorCS8qIE9jdGVvbiBoYXMgYSBidWlsdGluIFVTQiAqLworCU9DVEVPTl9GRUFUVVJFX1VTQiwKK307CisKK3N0YXRpYyBpbmxpbmUgaW50IGN2bXhfZnVzZV9yZWFkKGludCBmdXNlKTsKKworLyoqCisgKiBEZXRlcm1pbmUgaWYgdGhlIGN1cnJlbnQgT2N0ZW9uIHN1cHBvcnRzIGEgc3BlY2lmaWMgZmVhdHVyZS4gVGhlc2UKKyAqIGNoZWNrcyBoYXZlIGJlZW4gb3B0aW1pemVkIHRvIGJlIGZhaXJseSBxdWljaywgYnV0IHRoZXkgc2hvdWxkIHN0aWxsCisgKiBiZSBrZXB0IG91dCBvZiBmYXN0IHBhdGggY29kZS4KKyAqCisgKiBAZmVhdHVyZTogRmVhdHVyZSB0byBjaGVjayBmb3IuIFRoaXMgc2hvdWxkIGFsd2F5cyBiZSBhIGNvbnN0YW50IHNvIHRoZQorICogICAgICAgICAgICAgICAgY29tcGlsZXIgY2FuIHJlbW92ZSB0aGUgc3dpdGNoIHN0YXRlbWVudCB0aHJvdWdoIG9wdGltaXphdGlvbi4KKyAqCisgKiBSZXR1cm5zIE5vbiB6ZXJvIGlmIHRoZSBmZWF0dXJlIGV4aXN0cy4gWmVybyBpZiB0aGUgZmVhdHVyZSBkb2VzIG5vdAorICogICAgICAgICBleGlzdC4KKyAqLworc3RhdGljIGlubGluZSBpbnQgb2N0ZW9uX2hhc19mZWF0dXJlKGVudW0gb2N0ZW9uX2ZlYXR1cmUgZmVhdHVyZSkKK3sKKwlzd2l0Y2ggKGZlYXR1cmUpIHsKKwljYXNlIE9DVEVPTl9GRUFUVVJFX1NBQUQ6CisJCXJldHVybiAhT0NURU9OX0lTX01PREVMKE9DVEVPTl9DTjNYWFgpOworCisJY2FzZSBPQ1RFT05fRkVBVFVSRV9aSVA6CisJCWlmIChPQ1RFT05fSVNfTU9ERUwoT0NURU9OX0NOMzBYWCkKKwkJICAgIHx8IE9DVEVPTl9JU19NT0RFTChPQ1RFT05fQ041MFhYKQorCQkgICAgfHwgT0NURU9OX0lTX01PREVMKE9DVEVPTl9DTjUyWFgpKQorCQkJcmV0dXJuIDA7CisJCWVsc2UgaWYgKE9DVEVPTl9JU19NT0RFTChPQ1RFT05fQ04zOFhYX1BBU1MxKSkKKwkJCXJldHVybiAxOworCQllbHNlCisJCQlyZXR1cm4gIWN2bXhfZnVzZV9yZWFkKDEyMSk7CisKKwljYXNlIE9DVEVPTl9GRUFUVVJFX0NSWVBUTzoKKwkJcmV0dXJuICFjdm14X2Z1c2VfcmVhZCg5MCk7CisKKwljYXNlIE9DVEVPTl9GRUFUVVJFX1BDSUU6CisJCXJldHVybiBPQ1RFT05fSVNfTU9ERUwoT0NURU9OX0NONTZYWCkKKwkJCXx8IE9DVEVPTl9JU19NT0RFTChPQ1RFT05fQ041MlhYKTsKKworCWNhc2UgT0NURU9OX0ZFQVRVUkVfS0VZX01FTU9SWToKKwljYXNlIE9DVEVPTl9GRUFUVVJFX0xFRF9DT05UUk9MTEVSOgorCQlyZXR1cm4gT0NURU9OX0lTX01PREVMKE9DVEVPTl9DTjM4WFgpCisJCQl8fCBPQ1RFT05fSVNfTU9ERUwoT0NURU9OX0NONThYWCkKKwkJCXx8IE9DVEVPTl9JU19NT0RFTChPQ1RFT05fQ041NlhYKTsKKwljYXNlIE9DVEVPTl9GRUFUVVJFX1RSQToKKwkJcmV0dXJuICEoT0NURU9OX0lTX01PREVMKE9DVEVPTl9DTjMwWFgpCisJCQkgfHwgT0NURU9OX0lTX01PREVMKE9DVEVPTl9DTjUwWFgpKTsKKwljYXNlIE9DVEVPTl9GRUFUVVJFX01HTVRfUE9SVDoKKwkJcmV0dXJuIE9DVEVPTl9JU19NT0RFTChPQ1RFT05fQ041NlhYKQorCQkJfHwgT0NURU9OX0lTX01PREVMKE9DVEVPTl9DTjUyWFgpOworCWNhc2UgT0NURU9OX0ZFQVRVUkVfUkFJRDoKKwkJcmV0dXJuIE9DVEVPTl9JU19NT0RFTChPQ1RFT05fQ041NlhYKQorCQkJfHwgT0NURU9OX0lTX01PREVMKE9DVEVPTl9DTjUyWFgpOworCWNhc2UgT0NURU9OX0ZFQVRVUkVfVVNCOgorCQlyZXR1cm4gIShPQ1RFT05fSVNfTU9ERUwoT0NURU9OX0NOMzhYWCkKKwkJCSB8fCBPQ1RFT05fSVNfTU9ERUwoT0NURU9OX0NONThYWCkpOworCX0KKwlyZXR1cm4gMDsKK30KKworI2VuZGlmIC8qIF9fT0NURU9OX0ZFQVRVUkVfSF9fICovCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vb2N0ZW9uL29jdGVvbi1tb2RlbC5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL29jdGVvbi9vY3Rlb24tbW9kZWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjUwMzM2Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL29jdGVvbi9vY3Rlb24tbW9kZWwuaApAQCAtMCwwICsxLDMyMSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqbGljZW5zZSBzdGFydCoqKioqKioqKioqKioqKgorICogQXV0aG9yOiBDYXZpdW0gTmV0d29ya3MKKyAqCisgKiBDb250YWN0OiBzdXBwb3J0QGNhdml1bW5ldHdvcmtzLmNvbQorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIE9DVEVPTiBTREsKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwOCBDYXZpdW0gTmV0d29ya3MKKyAqCisgKiBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgVmVyc2lvbiAyLCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogQVMtSVMgYW5kIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkKKyAqIG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgVElUTEUsIG9yCisgKiBOT05JTkZSSU5HRU1FTlQuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlCisgKiBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgZmlsZTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKiBvciB2aXNpdCBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLgorICoKKyAqIFRoaXMgZmlsZSBtYXkgYWxzbyBiZSBhdmFpbGFibGUgdW5kZXIgYSBkaWZmZXJlbnQgbGljZW5zZSBmcm9tIENhdml1bS4KKyAqIENvbnRhY3QgQ2F2aXVtIE5ldHdvcmtzIGZvciBtb3JlIGluZm9ybWF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKipsaWNlbnNlIGVuZCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoKKyAqIEZpbGUgZGVmaW5pbmcgZGlmZmVyZW50IE9jdGVvbiBtb2RlbCBJRHMgYW5kIG1hY3JvcyB0bworICogY29tcGFyZSB0aGVtLgorICoKKyAqLworCisjaWZuZGVmIF9fT0NURU9OX01PREVMX0hfXworI2RlZmluZSBfX09DVEVPTl9NT0RFTF9IX18KKworLyogTk9URTogVGhlc2UgbXVzdCBtYXRjaCB3aGF0IGlzIGNoZWNrZWQgaW4gY29tbW9uLWNvbmZpZy5tayAqLworLyogRGVmaW5lcyB0byByZXByZXNlbnQgdGhlIGRpZmZlcmVudCB2ZXJzaW9ucyBvZiBPY3Rlb24uICAqLworCisvKgorICogSU1QT1JUQU5UOiBXaGVuIHRoZSBkZWZhdWx0IHBhc3MgaXMgdXBkYXRlZCBmb3IgYW4gT2N0ZW9uIE1vZGVsLAorICogdGhlIGNvcnJlc3BvbmRpbmcgY2hhbmdlIG11c3QgYWxzbyBiZSBtYWRlIGluIHRoZSBvY3Qtc2ltIHNjcmlwdC4KKyAqLworCisvKgorICogVGhlIGRlZmluZXMgYmVsb3cgc2hvdWxkIGJlIHVzZWQgd2l0aCB0aGUgT0NURU9OX0lTX01PREVMKCkgbWFjcm8KKyAqIHRvIGRldGVybWluZSB3aGF0IG1vZGVsIG9mIGNoaXAgdGhlIHNvZnR3YXJlIGlzIHJ1bm5pbmcgb24uICBNb2RlbHMKKyAqIGVuZGluZyBpbiAnWFgnIG1hdGNoIG11bHRpcGxlIG1vZGVscyAoZmFtaWxpZXMpLCB3aGlsZSBzcGVjaWZpYworICogbW9kZWxzIG1hdGNoIG9ubHkgdGhhdCBtb2RlbC4gIElmIGEgcGFzcyAocmV2aXNpb24pIGlzIHNwZWNpZmllZCwKKyAqIHRoZW4gb25seSB0aGF0IHJldmlzaW9uIHdpbGwgYmUgbWF0Y2hlZC4gIENhcmUgc2hvdWxkIGJlIHRha2VuIHdoZW4KKyAqIGNoZWNraW5nIGZvciBib3RoIHNwZWNpZmljIG1vZGVscyBhbmQgZmFtaWxpZXMgdGhhdCB0aGUgc3BlY2lmaWMKKyAqIG1vZGVscyBhcmUgY2hlY2tlZCBmb3IgZmlyc3QuICBXaGlsZSB0aGVzZSBkZWZpbmVzIGFyZSBzaW1pbGFyIHRvCisgKiB0aGUgcHJvY2Vzc29yIElELCB0aGV5IGFyZSBub3QgaW50ZW5kZWQgdG8gYmUgdXNlZCBieSBhbnl0aGluZworICogb3RoZXIgdGhhdCB0aGUgT0NURU9OX0lTX01PREVMIGZyYW1ld29yaywgYW5kIHRoZSB2YWx1ZXMgYXJlCisgKiBzdWJqZWN0IHRvIGNoYW5nZSBhdCBhbnl0aW1lIHdpdGhvdXQgbm90aWNlLgorICoKKyAqIE5PVEU6IG9ubHkgdGhlIE9DVEVPTl9JU19NT0RFTCgpIG1hY3JvL2Z1bmN0aW9uIGFuZCB0aGUgT0NURU9OX0NOKgorICogbWFjcm9zIHNob3VsZCBiZSB1c2VkIG91dHNpZGUgb2YgdGhpcyBmaWxlLiAgQWxsIG90aGVyIG1hY3JvcyBhcmUKKyAqIGZvciBpbnRlcm5hbCB1c2Ugb25seSwgYW5kIG1heSBjaGFuZ2Ugd2l0aG91dCBub3RpY2UuCisgKi8KKworLyogRmxhZyBiaXRzIGluIHRvcCBieXRlICovCisvKiBJZ25vcmVzIHJldmlzaW9uIGluIG1vZGVsIGNoZWNrcyAqLworI2RlZmluZSBPTV9JR05PUkVfUkVWSVNJT04gICAgICAgIDB4MDEwMDAwMDAKKy8qIENoZWNrIHN1Ym1vZGVscyAqLworI2RlZmluZSBPTV9DSEVDS19TVUJNT0RFTCAgICAgICAgIDB4MDIwMDAwMDAKKy8qIE1hdGNoIGFsbCBtb2RlbHMgcHJldmlvdXMgdGhhbiB0aGUgb25lIHNwZWNpZmllZCAqLworI2RlZmluZSBPTV9NQVRDSF9QUkVWSU9VU19NT0RFTFMgIDB4MDQwMDAwMDAKKy8qIElnbm9yZXMgdGhlIG1pbm9yIHJldmlzb24gb24gbmV3ZXIgcGFydHMgKi8KKyNkZWZpbmUgT01fSUdOT1JFX01JTk9SX1JFVklTSU9OICAweDA4MDAwMDAwCisjZGVmaW5lIE9NX0ZMQUdfTUFTSyAgICAgICAgICAgICAgMHhmZjAwMDAwMAorCisvKgorICogQ041WFhYIG1vZGVscyB3aXRoIG5ldyByZXZpc2lvbiBlbmNvZGluZworICovCisjZGVmaW5lIE9DVEVPTl9DTjU4WFhfUEFTUzFfMCAgIDB4MDAwZDAzMDAKKyNkZWZpbmUgT0NURU9OX0NONThYWF9QQVNTMV8xICAgMHgwMDBkMDMwMQorI2RlZmluZSBPQ1RFT05fQ041OFhYX1BBU1MxXzIgICAweDAwMGQwMzAzCisjZGVmaW5lIE9DVEVPTl9DTjU4WFhfUEFTUzJfMCAgIDB4MDAwZDAzMDgKKyNkZWZpbmUgT0NURU9OX0NONThYWF9QQVNTMl8xICAgMHgwMDBkMDMwOQorI2RlZmluZSBPQ1RFT05fQ041OFhYX1BBU1MyXzIgICAweDAwMGQwMzBhCisjZGVmaW5lIE9DVEVPTl9DTjU4WFhfUEFTUzJfMyAgIDB4MDAwZDAzMGIKKworI2RlZmluZSBPQ1RFT05fQ041OFhYICAgICAgICAgICAoT0NURU9OX0NONThYWF9QQVNTMV8wIHwgT01fSUdOT1JFX1JFVklTSU9OKQorI2RlZmluZSBPQ1RFT05fQ041OFhYX1BBU1MxX1ggICAoT0NURU9OX0NONThYWF9QQVNTMV8wIFwKKwkJCQkgfCBPTV9JR05PUkVfTUlOT1JfUkVWSVNJT04pCisjZGVmaW5lIE9DVEVPTl9DTjU4WFhfUEFTUzJfWCAgIChPQ1RFT05fQ041OFhYX1BBU1MyXzAgXAorCQkJCSB8IE9NX0lHTk9SRV9NSU5PUl9SRVZJU0lPTikKKyNkZWZpbmUgT0NURU9OX0NONThYWF9QQVNTMSAgICAgT0NURU9OX0NONThYWF9QQVNTMV9YCisjZGVmaW5lIE9DVEVPTl9DTjU4WFhfUEFTUzIgICAgIE9DVEVPTl9DTjU4WFhfUEFTUzJfWAorCisjZGVmaW5lIE9DVEVPTl9DTjU2WFhfUEFTUzFfMCAgIDB4MDAwZDA0MDAKKyNkZWZpbmUgT0NURU9OX0NONTZYWF9QQVNTMV8xICAgMHgwMDBkMDQwMQorI2RlZmluZSBPQ1RFT05fQ041NlhYX1BBU1MyXzAgICAweDAwMGQwNDA4CisjZGVmaW5lIE9DVEVPTl9DTjU2WFhfUEFTUzJfMSAgIDB4MDAwZDA0MDkKKworI2RlZmluZSBPQ1RFT05fQ041NlhYICAgICAgICAgICAoT0NURU9OX0NONTZYWF9QQVNTMl8wIHwgT01fSUdOT1JFX1JFVklTSU9OKQorI2RlZmluZSBPQ1RFT05fQ041NlhYX1BBU1MxX1ggICAoT0NURU9OX0NONTZYWF9QQVNTMV8wIFwKKwkJCQkgfCBPTV9JR05PUkVfTUlOT1JfUkVWSVNJT04pCisjZGVmaW5lIE9DVEVPTl9DTjU2WFhfUEFTUzJfWCAgIChPQ1RFT05fQ041NlhYX1BBU1MyXzAgXAorCQkJCSB8IE9NX0lHTk9SRV9NSU5PUl9SRVZJU0lPTikKKyNkZWZpbmUgT0NURU9OX0NONTZYWF9QQVNTMSAgICAgT0NURU9OX0NONTZYWF9QQVNTMV9YCisjZGVmaW5lIE9DVEVPTl9DTjU2WFhfUEFTUzIgICAgIE9DVEVPTl9DTjU2WFhfUEFTUzJfWAorCisjZGVmaW5lIE9DVEVPTl9DTjU3WFggICAgICAgICAgIE9DVEVPTl9DTjU2WFgKKyNkZWZpbmUgT0NURU9OX0NONTdYWF9QQVNTMSAgICAgT0NURU9OX0NONTZYWF9QQVNTMQorI2RlZmluZSBPQ1RFT05fQ041N1hYX1BBU1MyICAgICBPQ1RFT05fQ041NlhYX1BBU1MyCisKKyNkZWZpbmUgT0NURU9OX0NONTVYWCAgICAgICAgICAgT0NURU9OX0NONTZYWAorI2RlZmluZSBPQ1RFT05fQ041NVhYX1BBU1MxICAgICBPQ1RFT05fQ041NlhYX1BBU1MxCisjZGVmaW5lIE9DVEVPTl9DTjU1WFhfUEFTUzIgICAgIE9DVEVPTl9DTjU2WFhfUEFTUzIKKworI2RlZmluZSBPQ1RFT05fQ041NFhYICAgICAgICAgICBPQ1RFT05fQ041NlhYCisjZGVmaW5lIE9DVEVPTl9DTjU0WFhfUEFTUzEgICAgIE9DVEVPTl9DTjU2WFhfUEFTUzEKKyNkZWZpbmUgT0NURU9OX0NONTRYWF9QQVNTMiAgICAgT0NURU9OX0NONTZYWF9QQVNTMgorCisjZGVmaW5lIE9DVEVPTl9DTjUwWFhfUEFTUzFfMCAgIDB4MDAwZDA2MDAKKworI2RlZmluZSBPQ1RFT05fQ041MFhYICAgICAgICAgICAoT0NURU9OX0NONTBYWF9QQVNTMV8wIHwgT01fSUdOT1JFX1JFVklTSU9OKQorI2RlZmluZSBPQ1RFT05fQ041MFhYX1BBU1MxX1ggICAoT0NURU9OX0NONTBYWF9QQVNTMV8wIFwKKwkJCQkgfCBPTV9JR05PUkVfTUlOT1JfUkVWSVNJT04pCisjZGVmaW5lIE9DVEVPTl9DTjUwWFhfUEFTUzEgICAgIE9DVEVPTl9DTjUwWFhfUEFTUzFfWAorCisvKgorICogTk9URTogT2N0ZW9uIENONTAwMEYgbW9kZWwgaXMgbm90IGlkZW50aWZpYWJsZSB1c2luZyB0aGUKKyAqIE9DVEVPTl9JU19NT0RFTCgpIGZ1bmN0aW9ucywgYnV0IGFyZSB0cmVhdGVkIGFzIENONTBYWC4KKyAqLworCisjZGVmaW5lIE9DVEVPTl9DTjUyWFhfUEFTUzFfMCAgIDB4MDAwZDA3MDAKKyNkZWZpbmUgT0NURU9OX0NONTJYWF9QQVNTMl8wICAgMHgwMDBkMDcwOAorCisjZGVmaW5lIE9DVEVPTl9DTjUyWFggICAgICAgICAgIChPQ1RFT05fQ041MlhYX1BBU1MyXzAgfCBPTV9JR05PUkVfUkVWSVNJT04pCisjZGVmaW5lIE9DVEVPTl9DTjUyWFhfUEFTUzFfWCAgIChPQ1RFT05fQ041MlhYX1BBU1MxXzAgXAorCQkJCSB8IE9NX0lHTk9SRV9NSU5PUl9SRVZJU0lPTikKKyNkZWZpbmUgT0NURU9OX0NONTJYWF9QQVNTMl9YICAgKE9DVEVPTl9DTjUyWFhfUEFTUzJfMCBcCisJCQkJIHwgT01fSUdOT1JFX01JTk9SX1JFVklTSU9OKQorI2RlZmluZSBPQ1RFT05fQ041MlhYX1BBU1MxICAgICBPQ1RFT05fQ041MlhYX1BBU1MxX1gKKyNkZWZpbmUgT0NURU9OX0NONTJYWF9QQVNTMiAgICAgT0NURU9OX0NONTJYWF9QQVNTMl9YCisKKy8qCisgKiBDTjNYWFggbW9kZWxzIHdpdGggb2xkIHJldmlzaW9uIGVuY29uZGluZworICovCisjZGVmaW5lIE9DVEVPTl9DTjM4WFhfUEFTUzEgICAgIDB4MDAwZDAwMDAKKyNkZWZpbmUgT0NURU9OX0NOMzhYWF9QQVNTMiAgICAgMHgwMDBkMDAwMQorI2RlZmluZSBPQ1RFT05fQ04zOFhYX1BBU1MzICAgICAweDAwMGQwMDAzCisjZGVmaW5lIE9DVEVPTl9DTjM4WFggICAgICAgICAgIChPQ1RFT05fQ04zOFhYX1BBU1MzIHwgT01fSUdOT1JFX1JFVklTSU9OKQorCisjZGVmaW5lIE9DVEVPTl9DTjM2WFggICAgICAgICAgIE9DVEVPTl9DTjM4WFgKKyNkZWZpbmUgT0NURU9OX0NOMzZYWF9QQVNTMiAgICAgT0NURU9OX0NOMzhYWF9QQVNTMgorI2RlZmluZSBPQ1RFT05fQ04zNlhYX1BBU1MzICAgICBPQ1RFT05fQ04zOFhYX1BBU1MzCisKKy8qIFRoZSBPQ1RFT05fQ04zMVhYIG1hdGNoZXMgQ04zMVhYIG1vZGVscyBhbmQgdGhlIENOMzAyMCAqLworI2RlZmluZSBPQ1RFT05fQ04zMVhYX1BBU1MxICAgICAweDAwMGQwMTAwCisjZGVmaW5lIE9DVEVPTl9DTjMxWFhfUEFTUzFfMSAgIDB4MDAwZDAxMDIKKyNkZWZpbmUgT0NURU9OX0NOMzFYWCAgICAgICAgICAgKE9DVEVPTl9DTjMxWFhfUEFTUzEgfCBPTV9JR05PUkVfUkVWSVNJT04pCisKKy8qCisgKiBUaGlzIG1vZGVsIGlzIG9ubHkgdXNlZCBmb3IgaW50ZXJuYWwgY2hlY2tzLCBpdCBpcyBub3QgYSB2YWxpZAorICogbW9kZWwgZm9yIHRoZSBPQ1RFT05fTU9ERUwgZW52aXJvbm1lbnQgdmFyaWFibGUuICBUaGlzIG1hdGNoZXMgdGhlCisgKiBDTjMwMTAgYW5kIENOMzAwNSBidXQgTk9UIHRoZSBDTjMwMjAuCisgKi8KKyNkZWZpbmUgT0NURU9OX0NOMzBYWF9QQVNTMSAgICAgMHgwMDBkMDIwMAorI2RlZmluZSBPQ1RFT05fQ04zMFhYX1BBU1MxXzEgICAweDAwMGQwMjAyCisjZGVmaW5lIE9DVEVPTl9DTjMwWFggICAgICAgICAgIChPQ1RFT05fQ04zMFhYX1BBU1MxIHwgT01fSUdOT1JFX1JFVklTSU9OKQorCisjZGVmaW5lIE9DVEVPTl9DTjMwMDVfUEFTUzEgICAgICgweDAwMGQwMjEwIHwgT01fQ0hFQ0tfU1VCTU9ERUwpCisjZGVmaW5lIE9DVEVPTl9DTjMwMDVfUEFTUzFfMCAgICgweDAwMGQwMjEwIHwgT01fQ0hFQ0tfU1VCTU9ERUwpCisjZGVmaW5lIE9DVEVPTl9DTjMwMDVfUEFTUzFfMSAgICgweDAwMGQwMjEyIHwgT01fQ0hFQ0tfU1VCTU9ERUwpCisjZGVmaW5lIE9DVEVPTl9DTjMwMDUgICAgICAgICAgIChPQ1RFT05fQ04zMDA1X1BBU1MxIHwgT01fSUdOT1JFX1JFVklTSU9OIFwKKwkJCQkgfCBPTV9DSEVDS19TVUJNT0RFTCkKKworI2RlZmluZSBPQ1RFT05fQ04zMDEwX1BBU1MxICAgICAoMHgwMDBkMDIwMCB8IE9NX0NIRUNLX1NVQk1PREVMKQorI2RlZmluZSBPQ1RFT05fQ04zMDEwX1BBU1MxXzAgICAoMHgwMDBkMDIwMCB8IE9NX0NIRUNLX1NVQk1PREVMKQorI2RlZmluZSBPQ1RFT05fQ04zMDEwX1BBU1MxXzEgICAoMHgwMDBkMDIwMiB8IE9NX0NIRUNLX1NVQk1PREVMKQorI2RlZmluZSBPQ1RFT05fQ04zMDEwICAgICAgICAgICAoT0NURU9OX0NOMzAxMF9QQVNTMSB8IE9NX0lHTk9SRV9SRVZJU0lPTiBcCisJCQkJIHwgT01fQ0hFQ0tfU1VCTU9ERUwpCisKKyNkZWZpbmUgT0NURU9OX0NOMzAyMF9QQVNTMSAgICAgKDB4MDAwZDAxMTAgfCBPTV9DSEVDS19TVUJNT0RFTCkKKyNkZWZpbmUgT0NURU9OX0NOMzAyMF9QQVNTMV8wICAgKDB4MDAwZDAxMTAgfCBPTV9DSEVDS19TVUJNT0RFTCkKKyNkZWZpbmUgT0NURU9OX0NOMzAyMF9QQVNTMV8xICAgKDB4MDAwZDAxMTIgfCBPTV9DSEVDS19TVUJNT0RFTCkKKyNkZWZpbmUgT0NURU9OX0NOMzAyMCAgICAgICAgICAgKE9DVEVPTl9DTjMwMjBfUEFTUzEgfCBPTV9JR05PUkVfUkVWSVNJT04gXAorCQkJCSB8IE9NX0NIRUNLX1NVQk1PREVMKQorCisKKworLyogVGhpcyBtYXRjaGVzIHRoZSBjb21wbGV0ZSBmYW1pbHkgb2YgQ04zeHh4IENQVXMsIGFuZCBub3Qgc3Vic2VxdWVudCBtb2RlbHMgKi8KKyNkZWZpbmUgT0NURU9OX0NOM1hYWCAgICAgICAgICAgKE9DVEVPTl9DTjU4WFhfUEFTUzFfMCBcCisJCQkJIHwgT01fTUFUQ0hfUFJFVklPVVNfTU9ERUxTIFwKKwkJCQkgfCBPTV9JR05PUkVfUkVWSVNJT04pCisKKy8qIFRoZSByZXZpc2lvbiBieXRlIChsb3cgYnl0ZSkgaGFzIHR3byBkaWZmZXJlbnQgZW5jb2RpbmdzLgorICogQ04zWFhYOgorICoKKyAqICAgICBiaXRzCisgKiAgICAgPDc6NT46IHJlc2VydmVkICgwKQorICogICAgIDw0PjogICBhbHRlcm5hdGUgcGFja2FnZQorICogICAgIDwzOjA+OiByZXZpc2lvbgorICoKKyAqIENONVhYWDoKKyAqCisgKiAgICAgYml0cworICogICAgIDw3PjogICByZXNlcnZlZCAoMCkKKyAqICAgICA8Nj46ICAgYWx0ZXJuYXRlIHBhY2thZ2UKKyAqICAgICA8NTozPjogbWFqb3IgcmV2aXNpb24KKyAqICAgICA8MjowPjogbWlub3IgcmV2aXNpb24KKyAqCisgKi8KKworLyogTWFza3MgdXNlZCBmb3IgdGhlIHZhcmlvdXMgdHlwZXMgb2YgbW9kZWwvZmFtaWx5L3JldmlzaW9uIG1hdGNoaW5nICovCisjZGVmaW5lIE9DVEVPTl8zOFhYX0ZBTUlMWV9NQVNLICAgICAgMHgwMGZmZmYwMAorI2RlZmluZSBPQ1RFT05fMzhYWF9GQU1JTFlfUkVWX01BU0sgIDB4MDBmZmZmMGYKKyNkZWZpbmUgT0NURU9OXzM4WFhfTU9ERUxfTUFTSyAgICAgICAweDAwZmZmZjEwCisjZGVmaW5lIE9DVEVPTl8zOFhYX01PREVMX1JFVl9NQVNLICAgKE9DVEVPTl8zOFhYX0ZBTUlMWV9SRVZfTUFTSyBcCisJCQkJICAgICAgfCBPQ1RFT05fMzhYWF9NT0RFTF9NQVNLKQorCisvKiBDTjVYWFggYW5kIGxhdGVyIHVzZSBkaWZmZXJlbnQgbGF5b3V0IG9mIGJpdHMgaW4gdGhlIHJldmlzaW9uIElEIGZpZWxkICovCisjZGVmaW5lIE9DVEVPTl81OFhYX0ZBTUlMWV9NQVNLICAgICAgT0NURU9OXzM4WFhfRkFNSUxZX01BU0sKKyNkZWZpbmUgT0NURU9OXzU4WFhfRkFNSUxZX1JFVl9NQVNLICAweDAwZmZmZjNmCisjZGVmaW5lIE9DVEVPTl81OFhYX01PREVMX01BU0sgICAgICAgMHgwMGZmZmZjMAorI2RlZmluZSBPQ1RFT05fNThYWF9NT0RFTF9SRVZfTUFTSyAgIChPQ1RFT05fNThYWF9GQU1JTFlfUkVWX01BU0sgXAorCQkJCSAgICAgIHwgT0NURU9OXzU4WFhfTU9ERUxfTUFTSykKKyNkZWZpbmUgT0NURU9OXzU4WFhfTU9ERUxfTUlOT1JfUkVWX01BU0sgKE9DVEVPTl81OFhYX01PREVMX1JFVl9NQVNLIFwKKwkJCQkJICAmIDB4MDBmZmZmZjgpCisKKyNkZWZpbmUgX19PQ1RFT05fTUFUQ0hfTUFTS19fKHgsIHksIHopICgoKHgpICYgKHopKSA9PSAoKHkpICYgKHopKSkKKworLyogTk9URTogVGhpcyBpcyBmb3IgaW50ZXJuYWwgKHRvIHRoaXMgZmlsZSkgdXNlIG9ubHkuICovCitzdGF0aWMgaW5saW5lIGludCBfX09DVEVPTl9JU19NT0RFTF9DT01QSUxFX18odWludDMyX3QgYXJnX21vZGVsLAorCQkJCQkgICAgICB1aW50MzJfdCBjaGlwX21vZGVsKQoreworCXVpbnQzMl90IHJldl9hbmRfc3ViID0gT01fSUdOT1JFX1JFVklTSU9OIHwgT01fQ0hFQ0tfU1VCTU9ERUw7CisKKwlpZiAoKGFyZ19tb2RlbCAmIE9DVEVPTl8zOFhYX0ZBTUlMWV9NQVNLKSA8IE9DVEVPTl9DTjU4WFhfUEFTUzFfMCkgeworCQlpZiAoKChhcmdfbW9kZWwgJiBPTV9GTEFHX01BU0spID09IHJldl9hbmRfc3ViKSAmJgorCQkgICAgX19PQ1RFT05fTUFUQ0hfTUFTS19fKGNoaXBfbW9kZWwsIGFyZ19tb2RlbCwKKwkJCQkJICBPQ1RFT05fMzhYWF9NT0RFTF9NQVNLKSkKKwkJCXJldHVybiAxOworCQlpZiAoKChhcmdfbW9kZWwgJiBPTV9GTEFHX01BU0spID09IDApICYmCisJCSAgICBfX09DVEVPTl9NQVRDSF9NQVNLX18oY2hpcF9tb2RlbCwgYXJnX21vZGVsLAorCQkJCQkgIE9DVEVPTl8zOFhYX0ZBTUlMWV9SRVZfTUFTSykpCisJCQlyZXR1cm4gMTsKKwkJaWYgKCgoYXJnX21vZGVsICYgT01fRkxBR19NQVNLKSA9PSBPTV9JR05PUkVfUkVWSVNJT04pICYmCisJCSAgICBfX09DVEVPTl9NQVRDSF9NQVNLX18oY2hpcF9tb2RlbCwgYXJnX21vZGVsLAorCQkJCQkgIE9DVEVPTl8zOFhYX0ZBTUlMWV9NQVNLKSkKKwkJCXJldHVybiAxOworCQlpZiAoKChhcmdfbW9kZWwgJiBPTV9GTEFHX01BU0spID09IE9NX0NIRUNLX1NVQk1PREVMKSAmJgorCQkgICAgX19PQ1RFT05fTUFUQ0hfTUFTS19fKChjaGlwX21vZGVsKSwgKGFyZ19tb2RlbCksCisJCQkJCSAgT0NURU9OXzM4WFhfTU9ERUxfUkVWX01BU0spKQorCQkJcmV0dXJuIDE7CisJCWlmICgoYXJnX21vZGVsICYgT01fTUFUQ0hfUFJFVklPVVNfTU9ERUxTKSAmJgorCQkgICAgKChjaGlwX21vZGVsICYgT0NURU9OXzM4WFhfTU9ERUxfTUFTSykgPAorCQkJICAgIChhcmdfbW9kZWwgJiBPQ1RFT05fMzhYWF9NT0RFTF9NQVNLKSkpCisJCQlyZXR1cm4gMTsKKwl9IGVsc2UgeworCQlpZiAoKChhcmdfbW9kZWwgJiBPTV9GTEFHX01BU0spID09IHJldl9hbmRfc3ViKSAmJgorCQkgICAgX19PQ1RFT05fTUFUQ0hfTUFTS19fKChjaGlwX21vZGVsKSwgKGFyZ19tb2RlbCksCisJCQkJCSAgT0NURU9OXzU4WFhfTU9ERUxfTUFTSykpCisJCQlyZXR1cm4gMTsKKwkJaWYgKCgoYXJnX21vZGVsICYgT01fRkxBR19NQVNLKSA9PSAwKSAmJgorCQkgICAgX19PQ1RFT05fTUFUQ0hfTUFTS19fKChjaGlwX21vZGVsKSwgKGFyZ19tb2RlbCksCisJCQkJCSAgT0NURU9OXzU4WFhfRkFNSUxZX1JFVl9NQVNLKSkKKwkJCXJldHVybiAxOworCQlpZiAoKChhcmdfbW9kZWwgJiBPTV9GTEFHX01BU0spID09IE9NX0lHTk9SRV9NSU5PUl9SRVZJU0lPTikgJiYKKwkJICAgIF9fT0NURU9OX01BVENIX01BU0tfXygoY2hpcF9tb2RlbCksIChhcmdfbW9kZWwpLAorCQkJCQkgIE9DVEVPTl81OFhYX01PREVMX01JTk9SX1JFVl9NQVNLKSkKKwkJCXJldHVybiAxOworCQlpZiAoKChhcmdfbW9kZWwgJiBPTV9GTEFHX01BU0spID09IE9NX0lHTk9SRV9SRVZJU0lPTikgJiYKKwkJICAgIF9fT0NURU9OX01BVENIX01BU0tfXygoY2hpcF9tb2RlbCksIChhcmdfbW9kZWwpLAorCQkJCQkgIE9DVEVPTl81OFhYX0ZBTUlMWV9NQVNLKSkKKwkJCXJldHVybiAxOworCQlpZiAoKChhcmdfbW9kZWwgJiBPTV9GTEFHX01BU0spID09IE9NX0NIRUNLX1NVQk1PREVMKSAmJgorCQkgICAgX19PQ1RFT05fTUFUQ0hfTUFTS19fKChjaGlwX21vZGVsKSwgKGFyZ19tb2RlbCksCisJCQkJCSAgT0NURU9OXzU4WFhfTU9ERUxfUkVWX01BU0spKQorCQkJcmV0dXJuIDE7CisJCWlmICgoYXJnX21vZGVsICYgT01fTUFUQ0hfUFJFVklPVVNfTU9ERUxTKSAmJgorCQkgICAgKChjaGlwX21vZGVsICYgT0NURU9OXzU4WFhfTU9ERUxfTUFTSykgPAorCQkJICAgIChhcmdfbW9kZWwgJiBPQ1RFT05fNThYWF9NT0RFTF9NQVNLKSkpCisJCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIGZvcndhcmQgZGVjbGFyYXRpb25zICovCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IGN2bXhfZ2V0X3Byb2NfaWQodm9pZCkgX19hdHRyaWJ1dGVfXyAoKHB1cmUpKTsKK3N0YXRpYyBpbmxpbmUgdWludDY0X3QgY3ZteF9yZWFkX2Nzcih1aW50NjRfdCBjc3JfYWRkcik7CisKKy8qIE5PVEU6IFRoaXMgZm9yIGludGVybmFsIHVzZSBvbmx5ISEhISEgKi8KK3N0YXRpYyBpbmxpbmUgaW50IF9fb2N0ZW9uX2lzX21vZGVsX3J1bnRpbWVfXyh1aW50MzJfdCBtb2RlbCkKK3sKKwl1aW50MzJfdCBjcHVpZCA9IGN2bXhfZ2V0X3Byb2NfaWQoKTsKKworCS8qCisJICogQ2hlY2sgZm9yIHNwZWNpYWwgY2FzZSBvZiBtaXNtYXJrZWQgMzAwNSBzYW1wbGVzLiBXZSBvbmx5CisJICogbmVlZCB0byBjaGVjayBpZiB0aGUgc3ViIG1vZGVsIGlzbid0IGJlaW5nIGlnbm9yZWQuCisJICovCisJaWYgKChtb2RlbCAmIE9NX0NIRUNLX1NVQk1PREVMKSA9PSBPTV9DSEVDS19TVUJNT0RFTCkgeworCQlpZiAoY3B1aWQgPT0gT0NURU9OX0NOMzAxMF9QQVNTMSBcCisJCSAgICAmJiAoY3ZteF9yZWFkX2NzcigweDgwMDExODAwODAwMDA3Qjh1bGwpICYgKDF1bGwgPDwgMzQpKSkKKwkJCWNwdWlkIHw9IDB4MTA7CisJfQorCXJldHVybiBfX09DVEVPTl9JU19NT0RFTF9DT01QSUxFX18obW9kZWwsIGNwdWlkKTsKK30KKworLyoKKyAqIFRoZSBPQ1RFT05fSVNfTU9ERUwgbWFjcm8gc2hvdWxkIGJlIHVzZWQgZm9yIGFsbCBPY3Rlb24gbW9kZWwKKyAqIGNoZWNraW5nIGRvbmUgaW4gYSBwcm9ncmFtLiAgVGhpcyBzaG91bGQgYmUga2VwdCBydW50aW1lIGlmIGF0IGFsbAorICogcG9zc2libGUuICBBbnkgY29tcGlsZSB0aW1lICgjaWYgT0NURU9OX0lTX01PREVMKSB1c2FnZSBtdXN0IGJlCisgKiBjb25kdGlvbmFsaXplZCB3aXRoIE9DVEVPTl9JU19DT01NT05fQklOQVJZKCkgaWYgcnVudGltZSBjaGVja2luZworICogc3VwcG9ydCBpcyByZXF1aXJlZC4KKyAqLworI2RlZmluZSBPQ1RFT05fSVNfTU9ERUwoeCkgX19vY3Rlb25faXNfbW9kZWxfcnVudGltZV9fKHgpCisjZGVmaW5lIE9DVEVPTl9JU19DT01NT05fQklOQVJZKCkgMQorI3VuZGVmIE9DVEVPTl9NT0RFTAorCitjb25zdCBjaGFyICpvY3Rlb25fbW9kZWxfZ2V0X3N0cmluZyh1aW50MzJfdCBjaGlwX2lkKTsKK2NvbnN0IGNoYXIgKm9jdGVvbl9tb2RlbF9nZXRfc3RyaW5nX2J1ZmZlcih1aW50MzJfdCBjaGlwX2lkLCBjaGFyICpidWZmZXIpOworCisjaW5jbHVkZSAib2N0ZW9uLWZlYXR1cmUuaCIKKworI2VuZGlmIC8qIF9fT0NURU9OX01PREVMX0hfXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL29jdGVvbi9vY3Rlb24uaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9vY3Rlb24vb2N0ZW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWRjNjc2MAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9vY3Rlb24vb2N0ZW9uLmgKQEAgLTAsMCArMSwyNDggQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwOCBDYXZpdW0gTmV0d29ya3MKKyAqLworI2lmbmRlZiBfX0FTTV9PQ1RFT05fT0NURU9OX0gKKyNkZWZpbmUgX19BU01fT0NURU9OX09DVEVPTl9ICisKKyNpbmNsdWRlICJjdm14LmgiCisKK2V4dGVybiB1aW50NjRfdCBvY3Rlb25fYm9vdG1lbV9hbGxvY19yYW5nZV9waHlzKHVpbnQ2NF90IHNpemUsCisJCQkJCQl1aW50NjRfdCBhbGlnbm1lbnQsCisJCQkJCQl1aW50NjRfdCBtaW5fYWRkciwKKwkJCQkJCXVpbnQ2NF90IG1heF9hZGRyLAorCQkJCQkJaW50IGRvX2xvY2tpbmcpOworZXh0ZXJuIHZvaWQgKm9jdGVvbl9ib290bWVtX2FsbG9jKHVpbnQ2NF90IHNpemUsIHVpbnQ2NF90IGFsaWdubWVudCwKKwkJCQkgIGludCBkb19sb2NraW5nKTsKK2V4dGVybiB2b2lkICpvY3Rlb25fYm9vdG1lbV9hbGxvY19yYW5nZSh1aW50NjRfdCBzaXplLCB1aW50NjRfdCBhbGlnbm1lbnQsCisJCQkJCXVpbnQ2NF90IG1pbl9hZGRyLCB1aW50NjRfdCBtYXhfYWRkciwKKwkJCQkJaW50IGRvX2xvY2tpbmcpOworZXh0ZXJuIHZvaWQgKm9jdGVvbl9ib290bWVtX2FsbG9jX25hbWVkKHVpbnQ2NF90IHNpemUsIHVpbnQ2NF90IGFsaWdubWVudCwKKwkJCQkJY2hhciAqbmFtZSk7CitleHRlcm4gdm9pZCAqb2N0ZW9uX2Jvb3RtZW1fYWxsb2NfbmFtZWRfcmFuZ2UodWludDY0X3Qgc2l6ZSwgdWludDY0X3QgbWluX2FkZHIsCisJCQkJCSAgICAgIHVpbnQ2NF90IG1heF9hZGRyLCB1aW50NjRfdCBhbGlnbiwKKwkJCQkJICAgICAgY2hhciAqbmFtZSk7CitleHRlcm4gdm9pZCAqb2N0ZW9uX2Jvb3RtZW1fYWxsb2NfbmFtZWRfYWRkcmVzcyh1aW50NjRfdCBzaXplLCB1aW50NjRfdCBhZGRyZXNzLAorCQkJCQkJY2hhciAqbmFtZSk7CitleHRlcm4gaW50IG9jdGVvbl9ib290bWVtX2ZyZWVfbmFtZWQoY2hhciAqbmFtZSk7CitleHRlcm4gdm9pZCBvY3Rlb25fYm9vdG1lbV9sb2NrKHZvaWQpOworZXh0ZXJuIHZvaWQgb2N0ZW9uX2Jvb3RtZW1fdW5sb2NrKHZvaWQpOworCitleHRlcm4gaW50IG9jdGVvbl9pc19zaW11bGF0aW9uKHZvaWQpOworZXh0ZXJuIGludCBvY3Rlb25faXNfcGNpX2hvc3Qodm9pZCk7CitleHRlcm4gaW50IG9jdGVvbl91c2JfaXNfcmVmX2Nsayh2b2lkKTsKK2V4dGVybiB1aW50NjRfdCBvY3Rlb25fZ2V0X2Nsb2NrX3JhdGUodm9pZCk7CitleHRlcm4gY29uc3QgY2hhciAqb2N0ZW9uX2JvYXJkX3R5cGVfc3RyaW5nKHZvaWQpOworZXh0ZXJuIGNvbnN0IGNoYXIgKm9jdGVvbl9nZXRfcGNpX2ludGVycnVwdHModm9pZCk7CitleHRlcm4gaW50IG9jdGVvbl9nZXRfc291dGhicmlkZ2VfaW50ZXJydXB0KHZvaWQpOworZXh0ZXJuIGludCBvY3Rlb25fZ2V0X2Jvb3RfY29yZW1hc2sodm9pZCk7CitleHRlcm4gaW50IG9jdGVvbl9nZXRfYm9vdF9udW1fYXJndW1lbnRzKHZvaWQpOworZXh0ZXJuIGNvbnN0IGNoYXIgKm9jdGVvbl9nZXRfYm9vdF9hcmd1bWVudChpbnQgYXJnKTsKK2V4dGVybiB2b2lkIG9jdGVvbl9oYWxfc2V0dXBfcmVzZXJ2ZWQzMih2b2lkKTsKK2V4dGVybiB2b2lkIG9jdGVvbl91c2VyX2lvX2luaXQodm9pZCk7CitzdHJ1Y3Qgb2N0ZW9uX2NvcDJfc3RhdGU7CitleHRlcm4gdW5zaWduZWQgbG9uZyBvY3Rlb25fY3J5cHRvX2VuYWJsZShzdHJ1Y3Qgb2N0ZW9uX2NvcDJfc3RhdGUgKnN0YXRlKTsKK2V4dGVybiB2b2lkIG9jdGVvbl9jcnlwdG9fZGlzYWJsZShzdHJ1Y3Qgb2N0ZW9uX2NvcDJfc3RhdGUgKnN0YXRlLAorCQkJCSAgdW5zaWduZWQgbG9uZyBmbGFncyk7CisKK2V4dGVybiB2b2lkIG9jdGVvbl9pbml0X2N2bWNvdW50KHZvaWQpOworCisjZGVmaW5lIE9DVEVPTl9BUkdWX01BWF9BUkdTCTY0CisjZGVmaW5lIE9DVE9FTl9TRVJJQUxfTEVOCTIwCisKK3N0cnVjdCBvY3Rlb25fYm9vdF9kZXNjcmlwdG9yIHsKKwkvKiBTdGFydCBvZiBibG9jayByZWZlcmVuY2VkIGJ5IGFzc2VtYmx5IGNvZGUgLSBkbyBub3QgY2hhbmdlISAqLworCXVpbnQzMl90IGRlc2NfdmVyc2lvbjsKKwl1aW50MzJfdCBkZXNjX3NpemU7CisJdWludDY0X3Qgc3RhY2tfdG9wOworCXVpbnQ2NF90IGhlYXBfYmFzZTsKKwl1aW50NjRfdCBoZWFwX2VuZDsKKwkvKiBPbmx5IHVzZWQgYnkgYm9vdGxvYWRlciAqLworCXVpbnQ2NF90IGVudHJ5X3BvaW50OworCXVpbnQ2NF90IGRlc2NfdmFkZHI7CisJLyogRW5kIG9mIFRoaXMgYmxvY2sgcmVmZXJlbmNlZCBieSBhc3NlbWJseSBjb2RlIC0gZG8gbm90IGNoYW5nZSEgKi8KKwl1aW50MzJfdCBleGNlcHRpb25fYmFzZV9hZGRyOworCXVpbnQzMl90IHN0YWNrX3NpemU7CisJdWludDMyX3QgaGVhcF9zaXplOworCS8qIEFyZ2MgY291bnQgZm9yIGFwcGxpY2F0aW9uLiAqLworCXVpbnQzMl90IGFyZ2M7CisJdWludDMyX3QgYXJndltPQ1RFT05fQVJHVl9NQVhfQVJHU107CisKKyNkZWZpbmUgIEJPT1RfRkxBR19JTklUX0NPUkUJCSgxIDw8IDApCisjZGVmaW5lICBPQ1RFT05fQkxfRkxBR19ERUJVRwkJKDEgPDwgMSkKKyNkZWZpbmUgIE9DVEVPTl9CTF9GTEFHX05PX01BR0lDCSgxIDw8IDIpCisJLyogSWYgc2V0LCB1c2UgdWFydDEgZm9yIGNvbnNvbGUgKi8KKyNkZWZpbmUgIE9DVEVPTl9CTF9GTEFHX0NPTlNPTEVfVUFSVDEJKDEgPDwgMykKKwkvKiBJZiBzZXQsIHVzZSBQQ0kgY29uc29sZSAqLworI2RlZmluZSAgT0NURU9OX0JMX0ZMQUdfQ09OU09MRV9QQ0kJKDEgPDwgNCkKKwkvKiBDYWxsIGV4aXQgb24gYnJlYWsgb24gc2VyaWFsIHBvcnQgKi8KKyNkZWZpbmUgIE9DVEVPTl9CTF9GTEFHX0JSRUFLCQkoMSA8PCA1KQorCisJdWludDMyX3QgZmxhZ3M7CisJdWludDMyX3QgY29yZV9tYXNrOworCS8qIERSQU0gc2l6ZSBpbiBtZWdhYnllcy4gKi8KKwl1aW50MzJfdCBkcmFtX3NpemU7CisJLyogcGh5c2ljYWwgYWRkcmVzcyBvZiBmcmVlIG1lbW9yeSBkZXNjcmlwdG9yIGJsb2NrLiAqLworCXVpbnQzMl90IHBoeV9tZW1fZGVzY19hZGRyOworCS8qIHVzZWQgdG8gcGFzcyBmbGFncyBmcm9tIGFwcCB0byBkZWJ1Z2dlci4gKi8KKwl1aW50MzJfdCBkZWJ1Z2dlcl9mbGFnc19iYXNlX2FkZHI7CisJLyogQ1BVIGNsb2NrIHNwZWVkLCBpbiBoei4gKi8KKwl1aW50MzJfdCBlY2xvY2tfaHo7CisJLyogRFJBTSBjbG9jayBzcGVlZCwgaW4gaHouICovCisJdWludDMyX3QgZGNsb2NrX2h6OworCS8qIFNQSTQgY2xvY2sgaW4gaHouICovCisJdWludDMyX3Qgc3BpX2Nsb2NrX2h6OworCXVpbnQxNl90IGJvYXJkX3R5cGU7CisJdWludDhfdCBib2FyZF9yZXZfbWFqb3I7CisJdWludDhfdCBib2FyZF9yZXZfbWlub3I7CisJdWludDE2X3QgY2hpcF90eXBlOworCXVpbnQ4X3QgY2hpcF9yZXZfbWFqb3I7CisJdWludDhfdCBjaGlwX3Jldl9taW5vcjsKKwljaGFyIGJvYXJkX3NlcmlhbF9udW1iZXJbT0NUT0VOX1NFUklBTF9MRU5dOworCXVpbnQ4X3QgbWFjX2FkZHJfYmFzZVs2XTsKKwl1aW50OF90IG1hY19hZGRyX2NvdW50OworCXVpbnQ2NF90IGN2bXhfZGVzY192YWRkcjsKK307CisKK3VuaW9uIG9jdGVvbl9jdm1lbWN0bCB7CisJdWludDY0X3QgdTY0OworCXN0cnVjdCB7CisJCS8qIFJPIDEgPSBCSVNUIGZhaWwsIDAgPSBCSVNUIHBhc3MgKi8KKwkJdWludDY0X3QgdGxiYmlzdDoxOworCQkvKiBSTyAxID0gQklTVCBmYWlsLCAwID0gQklTVCBwYXNzICovCisJCXVpbnQ2NF90IGwxY2Jpc3Q6MTsKKwkJLyogUk8gMSA9IEJJU1QgZmFpbCwgMCA9IEJJU1QgcGFzcyAqLworCQl1aW50NjRfdCBsMWRiaXN0OjE7CisJCS8qIFJPIDEgPSBCSVNUIGZhaWwsIDAgPSBCSVNUIHBhc3MgKi8KKwkJdWludDY0X3QgZGNtYmlzdDoxOworCQkvKiBSTyAxID0gQklTVCBmYWlsLCAwID0gQklTVCBwYXNzICovCisJCXVpbnQ2NF90IHB0Z2Jpc3Q6MTsKKwkJLyogUk8gMSA9IEJJU1QgZmFpbCwgMCA9IEJJU1QgcGFzcyAqLworCQl1aW50NjRfdCB3YmZiaXN0OjE7CisJCS8qIFJlc2VydmVkICovCisJCXVpbnQ2NF90IHJlc2VydmVkOjIyOworCQkvKiBSL1cgSWYgc2V0LCBtYXJrZWQgd3JpdGUtYnVmZmVyIGVudHJpZXMgdGltZSBvdXQKKwkJICogdGhlIHNhbWUgYXMgYXMgb3RoZXIgZW50cmllczsgaWYgY2xlYXIsIG1hcmtlZAorCQkgKiB3cml0ZS1idWZmZXIgZW50cmllcyB1c2UgdGhlIG1heGltdW0gdGltZW91dC4gKi8KKwkJdWludDY0X3QgZGlzbWFya3dibG9uZ3RvOjE7CisJCS8qIFIvVyBJZiBzZXQsIGEgbWVyZ2VkIHN0b3JlIGRvZXMgbm90IGNsZWFyIHRoZQorCQkgKiB3cml0ZS1idWZmZXIgZW50cnkgdGltZW91dCBzdGF0ZS4gKi8KKwkJdWludDY0X3QgZGlzbXJnY2xyd2J0bzoxOworCQkvKiBSL1cgVHdvIGJpdHMgdGhhdCBhcmUgdGhlIE1TQnMgb2YgdGhlIHJlc3VsdGFudAorCQkgKiBDVk1TRUcgTE0gd29yZCBsb2NhdGlvbiBmb3IgYW4gSU9CRE1BLiBUaGUgb3RoZXIgOAorCQkgKiBiaXRzIGNvbWUgZnJvbSB0aGUgU0NSQUREUiBmaWVsZCBvZiB0aGUgSU9CRE1BLiAqLworCQl1aW50NjRfdCBpb2JkbWFzY3Jtc2I6MjsKKwkJLyogUi9XIElmIHNldCwgU1lOQ1dTIGFuZCBTWU5DUyBvbmx5IG9yZGVyIG1hcmtlZAorCQkgKiBzdG9yZXM7IGlmIGNsZWFyLCBTWU5DV1MgYW5kIFNZTkNTIG9ubHkgb3JkZXIKKwkJICogdW5tYXJrZWQgc3RvcmVzLiBTWU5DV1NNQVJLRUQgaGFzIG5vIGVmZmVjdCB3aGVuCisJCSAqIERJU1NZTkNXUyBpcyBzZXQuICovCisJCXVpbnQ2NF90IHN5bmN3c21hcmtlZDoxOworCQkvKiBSL1cgSWYgc2V0LCBTWU5DV1MgYWN0cyBhcyBTWU5DVyBhbmQgU1lOQ1MgYWN0cyBhcworCQkgKiBTWU5DLiAqLworCQl1aW50NjRfdCBkaXNzeW5jd3M6MTsKKwkJLyogUi9XIElmIHNldCwgbm8gc3RhbGwgaGFwcGVucyBvbiB3cml0ZSBidWZmZXIKKwkJICogZnVsbC4gKi8KKwkJdWludDY0X3QgZGlzd2Jmc3Q6MTsKKwkJLyogUi9XIElmIHNldCAoYW5kIFNYIHNldCksIHN1cGVydmlzb3ItbGV2ZWwKKwkJICogbG9hZHMvc3RvcmVzIGNhbiB1c2UgWEtQSFlTIGFkZHJlc3NlcyB3aXRoCisJCSAqIFZBPDQ4Pj09MCAqLworCQl1aW50NjRfdCB4a21lbWVuYXM6MTsKKwkJLyogUi9XIElmIHNldCAoYW5kIFVYIHNldCksIHVzZXItbGV2ZWwgbG9hZHMvc3RvcmVzCisJCSAqIGNhbiB1c2UgWEtQSFlTIGFkZHJlc3NlcyB3aXRoIFZBPDQ4Pj09MCAqLworCQl1aW50NjRfdCB4a21lbWVuYXU6MTsKKwkJLyogUi9XIElmIHNldCAoYW5kIFNYIHNldCksIHN1cGVydmlzb3ItbGV2ZWwKKwkJICogbG9hZHMvc3RvcmVzIGNhbiB1c2UgWEtQSFlTIGFkZHJlc3NlcyB3aXRoCisJCSAqIFZBPDQ4Pj09MSAqLworCQl1aW50NjRfdCB4a2lvZW5hczoxOworCQkvKiBSL1cgSWYgc2V0IChhbmQgVVggc2V0KSwgdXNlci1sZXZlbCBsb2Fkcy9zdG9yZXMKKwkJICogY2FuIHVzZSBYS1BIWVMgYWRkcmVzc2VzIHdpdGggVkE8NDg+PT0xICovCisJCXVpbnQ2NF90IHhraW9lbmF1OjE7CisJCS8qIFIvVyBJZiBzZXQsIGFsbCBzdG9yZXMgYWN0IGFzIFNZTkNXIChOT01FUkdFIG11c3QKKwkJICogYmUgc2V0IHdoZW4gdGhpcyBpcyBzZXQpIFJXLCByZXNldCB0byAwLiAqLworCQl1aW50NjRfdCBhbGxzeW5jdzoxOworCQkvKiBSL1cgSWYgc2V0LCBubyBzdG9yZXMgbWVyZ2UsIGFuZCBhbGwgc3RvcmVzIHJlYWNoCisJCSAqIHRoZSBjb2hlcmVudCBidXMgaW4gb3JkZXIuICovCisJCXVpbnQ2NF90IG5vbWVyZ2U6MTsKKwkJLyogUi9XIFNlbGVjdHMgdGhlIGJpdCBpbiB0aGUgY291bnRlciB1c2VkIGZvciBESUQKKwkJICogdGltZS1vdXRzIDAgPSAyMzEsIDEgPSAyMzAsIDIgPSAyMjksIDMgPQorCQkgKiAyMTQuIEFjdHVhbCB0aW1lLW91dCBpcyBiZXR3ZWVuIDF4IGFuZCAyeCB0aGlzCisJCSAqIGludGVydmFsLiBGb3IgZXhhbXBsZSwgd2l0aCBESURUVE89MywgZXhwaXJhdGlvbgorCQkgKiBpbnRlcnZhbCBpcyBiZXR3ZWVuIDE2SyBhbmQgMzJLLiAqLworCQl1aW50NjRfdCBkaWR0dG86MjsKKwkJLyogUi9XIElmIHNldCwgdGhlIChtZW0pIENTUiBjbG9jayBuZXZlciB0dXJucyBvZmYuICovCisJCXVpbnQ2NF90IGNzcmNrYWx3eXM6MTsKKwkJLyogUi9XIElmIHNldCwgbWNsayBuZXZlciB0dXJucyBvZmYuICovCisJCXVpbnQ2NF90IG1jbGthbHd5czoxOworCQkvKiBSL1cgU2VsZWN0cyB0aGUgYml0IGluIHRoZSBjb3VudGVyIHVzZWQgZm9yIHdyaXRlCisJCSAqIGJ1ZmZlciBmbHVzaCB0aW1lLW91dHMgKFdCRkxUKzExKSBpcyB0aGUgYml0CisJCSAqIHBvc2l0aW9uIGluIGFuIGludGVybmFsIGNvdW50ZXIgdXNlZCB0byBkZXRlcm1pbmUKKwkJICogZXhwaXJhdGlvbi4gVGhlIHdyaXRlIGJ1ZmZlciBleHBpcmVzIGJldHdlZW4gMXggYW5kCisJCSAqIDJ4IHRoaXMgaW50ZXJ2YWwuIEZvciBleGFtcGxlLCB3aXRoIFdCRkxUID0gMCwgYQorCQkgKiB3cml0ZSBidWZmZXIgZXhwaXJlcyBiZXR3ZWVuIDJLIGFuZCA0SyBjeWNsZXMgYWZ0ZXIKKwkJICogdGhlIHdyaXRlIGJ1ZmZlciBlbnRyeSBpcyBhbGxvY2F0ZWQuICovCisJCXVpbnQ2NF90IHdiZmx0aW1lOjM7CisJCS8qIFIvVyBJZiBzZXQsIGRvIG5vdCBwdXQgSXN0cmVhbSBpbiB0aGUgTDIgY2FjaGUuICovCisJCXVpbnQ2NF90IGlzdHJub2wyOjE7CisJCS8qIFIvVyBUaGUgd3JpdGUgYnVmZmVyIHRocmVzaG9sZC4gKi8KKwkJdWludDY0X3Qgd2J0aHJlc2g6NDsKKwkJLyogUmVzZXJ2ZWQgKi8KKwkJdWludDY0X3QgcmVzZXJ2ZWQyOjI7CisJCS8qIFIvVyBJZiBzZXQsIENWTVNFRyBpcyBhdmFpbGFibGUgZm9yIGxvYWRzL3N0b3JlcyBpbgorCQkgKiBrZXJuZWwvZGVidWcgbW9kZS4gKi8KKwkJdWludDY0X3QgY3Ztc2VnZW5hazoxOworCQkvKiBSL1cgSWYgc2V0LCBDVk1TRUcgaXMgYXZhaWxhYmxlIGZvciBsb2Fkcy9zdG9yZXMgaW4KKwkJICogc3VwZXJ2aXNvciBtb2RlLiAqLworCQl1aW50NjRfdCBjdm1zZWdlbmFzOjE7CisJCS8qIFIvVyBJZiBzZXQsIENWTVNFRyBpcyBhdmFpbGFibGUgZm9yIGxvYWRzL3N0b3JlcyBpbgorCQkgKiB1c2VyIG1vZGUuICovCisJCXVpbnQ2NF90IGN2bXNlZ2VuYXU6MTsKKwkJLyogUi9XIFNpemUgb2YgbG9jYWwgbWVtb3J5IGluIGNhY2hlIGJsb2NrcywgNTQgKDY5MTIKKwkJICogYnl0ZXMpIGlzIG1heCBsZWdhbCB2YWx1ZS4gKi8KKwkJdWludDY0X3QgbG1lbXN6OjY7CisJfSBzOworfTsKKworc3RydWN0IG9jdGVvbl9jZl9kYXRhIHsKKwl1bnNpZ25lZCBsb25nCWJhc2VfcmVnaW9uX2JpYXM7CisJdW5zaWduZWQgaW50CWJhc2VfcmVnaW9uOwkvKiBUaGUgY2hpcCBzZWxlY3QgcmVnaW9uIHVzZWQgYnkgQ0YgKi8KKwlpbnQJCWlzMTZiaXQ7CS8qIDAgLSA4Yml0LCAhMCAtIDE2Yml0ICovCisJaW50CQlkbWFfZW5naW5lOwkvKiAtMSBmb3Igbm8gRE1BICovCit9OworCitleHRlcm4gdm9pZCBvY3Rlb25fd3JpdGVfbGNkKGNvbnN0IGNoYXIgKnMpOworZXh0ZXJuIHZvaWQgb2N0ZW9uX2NoZWNrX2NwdV9iaXN0KHZvaWQpOworZXh0ZXJuIGludCBvY3Rlb25fZ2V0X2Jvb3RfZGVidWdfZmxhZyh2b2lkKTsKK2V4dGVybiBpbnQgb2N0ZW9uX2dldF9ib290X3VhcnQodm9pZCk7CisKK3N0cnVjdCB1YXJ0X3BvcnQ7CitleHRlcm4gdW5zaWduZWQgaW50IG9jdGVvbl9zZXJpYWxfaW4oc3RydWN0IHVhcnRfcG9ydCAqLCBpbnQpOworZXh0ZXJuIHZvaWQgb2N0ZW9uX3NlcmlhbF9vdXQoc3RydWN0IHVhcnRfcG9ydCAqLCBpbnQsIGludCk7CisKKy8qKgorICogV3JpdGUgYSAzMmJpdCB2YWx1ZSB0byB0aGUgT2N0ZW9uIE5QSSByZWdpc3RlciBzcGFjZQorICoKKyAqIEBhZGRyZXNzOiBBZGRyZXNzIHRvIHdyaXRlIHRvCisgKiBAdmFsOiAgICAgVmFsdWUgdG8gd3JpdGUKKyAqLworc3RhdGljIGlubGluZSB2b2lkIG9jdGVvbl9ucGlfd3JpdGUzMih1aW50NjRfdCBhZGRyZXNzLCB1aW50MzJfdCB2YWwpCit7CisJY3ZteF93cml0ZTY0X3VpbnQzMihhZGRyZXNzIF4gNCwgdmFsKTsKKwljdm14X3JlYWQ2NF91aW50MzIoYWRkcmVzcyBeIDQpOworfQorCisKKy8qKgorICogUmVhZCBhIDMyYml0IHZhbHVlIGZyb20gdGhlIE9jdGVvbiBOUEkgcmVnaXN0ZXIgc3BhY2UKKyAqCisgKiBAYWRkcmVzczogQWRkcmVzcyB0byByZWFkCisgKiBSZXR1cm5zIFRoZSByZXN1bHQKKyAqLworc3RhdGljIGlubGluZSB1aW50MzJfdCBvY3Rlb25fbnBpX3JlYWQzMih1aW50NjRfdCBhZGRyZXNzKQoreworCXJldHVybiBjdm14X3JlYWQ2NF91aW50MzIoYWRkcmVzcyBeIDQpOworfQorCisjZW5kaWYgLyogX19BU01fT0NURU9OX09DVEVPTl9IICovCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vcHJvY2Vzc29yLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vcHJvY2Vzc29yLmgKaW5kZXggMThlZTU4ZS4uMGY5MjZhYSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3Byb2Nlc3Nvci5oCisrKyBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9wcm9jZXNzb3IuaApAQCAtMTE4LDYgKzExOCw2MCBAQAogCXN0cnVjdCBtaXBzMzI2NF93YXRjaF9yZWdfc3RhdGUgbWlwczMyNjQ7CiB9OwogCisjaWZkZWYgQ09ORklHX0NQVV9DQVZJVU1fT0NURU9OCisKK3N0cnVjdCBvY3Rlb25fY29wMl9zdGF0ZSB7CisJLyogRE1GQzIgcnQsIDB4MDIwMSAqLworCXVuc2lnbmVkIGxvbmcgICBjb3AyX2NyY19pdjsKKwkvKiBETUZDMiBydCwgMHgwMjAyIChTZXQgd2l0aCBETVRDMiBydCwgMHgxMjAyKSAqLworCXVuc2lnbmVkIGxvbmcgICBjb3AyX2NyY19sZW5ndGg7CisJLyogRE1GQzIgcnQsIDB4MDIwMCAoc2V0IHdpdGggRE1UQzIgcnQsIDB4NDIwMCkgKi8KKwl1bnNpZ25lZCBsb25nICAgY29wMl9jcmNfcG9seTsKKwkvKiBETUZDMiBydCwgMHgwNDAyOyBETUZDMiBydCwgMHgwNDBBICovCisJdW5zaWduZWQgbG9uZyAgIGNvcDJfbGxtX2RhdFsyXTsKKyAgICAgICAvKiBETUZDMiBydCwgMHgwMDg0ICovCisJdW5zaWduZWQgbG9uZyAgIGNvcDJfM2Rlc19pdjsKKwkvKiBETUZDMiBydCwgMHgwMDgwOyBETUZDMiBydCwgMHgwMDgxOyBETUZDMiBydCwgMHgwMDgyICovCisJdW5zaWduZWQgbG9uZyAgIGNvcDJfM2Rlc19rZXlbM107CisJLyogRE1GQzIgcnQsIDB4MDA4OCAoU2V0IHdpdGggRE1UQzIgcnQsIDB4MDA5OCkgKi8KKwl1bnNpZ25lZCBsb25nICAgY29wMl8zZGVzX3Jlc3VsdDsKKwkvKiBETUZDMiBydCwgMHgwMTExIChGSVhNRTogUmVhZCBQYXNzMSBFcnJhdGEpICovCisJdW5zaWduZWQgbG9uZyAgIGNvcDJfYWVzX2lucDA7CisJLyogRE1GQzIgcnQsIDB4MDEwMjsgRE1GQzIgcnQsIDB4MDEwMyAqLworCXVuc2lnbmVkIGxvbmcgICBjb3AyX2Flc19pdlsyXTsKKwkvKiBETUZDMiBydCwgMHgwMTA0OyBETUZDMiBydCwgMHgwMTA1OyBETUZDMiBydCwgMHgwMTA2OyBETUZDMgorCSAqIHJ0LCAweDAxMDcgKi8KKwl1bnNpZ25lZCBsb25nICAgY29wMl9hZXNfa2V5WzRdOworCS8qIERNRkMyIHJ0LCAweDAxMTAgKi8KKwl1bnNpZ25lZCBsb25nICAgY29wMl9hZXNfa2V5bGVuOworCS8qIERNRkMyIHJ0LCAweDAxMDA7IERNRkMyIHJ0LCAweDAxMDEgKi8KKwl1bnNpZ25lZCBsb25nICAgY29wMl9hZXNfcmVzdWx0WzJdOworCS8qIERNRkMyIHJ0LCAweDAyNDA7IERNRkMyIHJ0LCAweDAyNDE7IERNRkMyIHJ0LCAweDAyNDI7IERNRkMyCisJICogcnQsIDB4MDI0MzsgRE1GQzIgcnQsIDB4MDI0NDsgRE1GQzIgcnQsIDB4MDI0NTsgRE1GQzIgcnQsCisJICogMHgwMjQ2OyBETUZDMiBydCwgMHgwMjQ3OyBETUZDMiBydCwgMHgwMjQ4OyBETUZDMiBydCwKKwkgKiAweDAyNDk7IERNRkMyIHJ0LCAweDAyNEE7IERNRkMyIHJ0LCAweDAyNEI7IERNRkMyIHJ0LAorCSAqIDB4MDI0QzsgRE1GQzIgcnQsIDB4MDI0RDsgRE1GQzIgcnQsIDB4MDI0RSAtIFBhc3MyICovCisJdW5zaWduZWQgbG9uZyAgIGNvcDJfaHNoX2RhdHdbMTVdOworCS8qIERNRkMyIHJ0LCAweDAyNTA7IERNRkMyIHJ0LCAweDAyNTE7IERNRkMyIHJ0LCAweDAyNTI7IERNRkMyCisJICogcnQsIDB4MDI1MzsgRE1GQzIgcnQsIDB4MDI1NDsgRE1GQzIgcnQsIDB4MDI1NTsgRE1GQzIgcnQsCisJICogMHgwMjU2OyBETUZDMiBydCwgMHgwMjU3IC0gUGFzczIgKi8KKwl1bnNpZ25lZCBsb25nICAgY29wMl9oc2hfaXZ3WzhdOworCS8qIERNRkMyIHJ0LCAweDAyNTg7IERNRkMyIHJ0LCAweDAyNTkgLSBQYXNzMiAqLworCXVuc2lnbmVkIGxvbmcgICBjb3AyX2dmbV9tdWx0WzJdOworCS8qIERNRkMyIHJ0LCAweDAyNUUgLSBQYXNzMiAqLworCXVuc2lnbmVkIGxvbmcgICBjb3AyX2dmbV9wb2x5OworCS8qIERNRkMyIHJ0LCAweDAyNUE7IERNRkMyIHJ0LCAweDAyNUIgLSBQYXNzMiAqLworCXVuc2lnbmVkIGxvbmcgICBjb3AyX2dmbV9yZXN1bHRbMl07Cit9OworI2RlZmluZSBJTklUX09DVEVPTl9DT1AyIHswLH0KKworc3RydWN0IG9jdGVvbl9jdm1zZWdfc3RhdGUgeworCXVuc2lnbmVkIGxvbmcgY3Ztc2VnW0NPTkZJR19DQVZJVU1fT0NURU9OX0NWTVNFR19TSVpFXQorCQkJICAgIFtjcHVfZGNhY2hlX2xpbmVfc2l6ZSgpIC8gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpXTsKK307CisKKyNlbmRpZgorCiB0eXBlZGVmIHN0cnVjdCB7CiAJdW5zaWduZWQgbG9uZyBzZWc7CiB9IG1tX3NlZ21lbnRfdDsKQEAgLTE2MCw2ICsyMTQsMTAgQEAKIAl1bnNpZ25lZCBsb25nIHRyYXBfbm87CiAJdW5zaWduZWQgbG9uZyBpcml4X3RyYW1wb2xpbmU7ICAvKiBXaGVlZS4uLiAqLwogCXVuc2lnbmVkIGxvbmcgaXJpeF9vbGRjdHg7CisjaWZkZWYgQ09ORklHX0NQVV9DQVZJVU1fT0NURU9OCisgICAgc3RydWN0IG9jdGVvbl9jb3AyX3N0YXRlIGNwMiBfX2F0dHJpYnV0ZV9fICgoX19hbGlnbmVkX18oMTI4KSkpOworICAgIHN0cnVjdCBvY3Rlb25fY3Ztc2VnX3N0YXRlIGN2bXNlZyBfX2F0dHJpYnV0ZV9fICgoX19hbGlnbmVkX18oMTI4KSkpOworI2VuZGlmCiAJc3RydWN0IG1pcHNfYWJpICphYmk7CiB9OwogCkBAIC0xNzEsNiArMjI5LDEzIEBACiAjZGVmaW5lIEZQQUZGX0lOSVQKICNlbmRpZiAvKiBDT05GSUdfTUlQU19NVF9GUEFGRiAqLwogCisjaWZkZWYgQ09ORklHX0NQVV9DQVZJVU1fT0NURU9OCisjZGVmaW5lIE9DVEVPTl9JTklUCQkJCQkJXAorCS5jcDIJCQk9IElOSVRfT0NURU9OX0NPUDIsCisjZWxzZQorI2RlZmluZSBPQ1RFT05fSU5JVAorI2VuZGlmIC8qIENPTkZJR19DUFVfQ0FWSVVNX09DVEVPTiAqLworCiAjZGVmaW5lIElOSVRfVEhSRUFEICB7CQkJCQkJXAogICAgICAgICAvKgkJCQkJCQlcCiAgICAgICAgICAqIFNhdmVkIG1haW4gcHJvY2Vzc29yIHJlZ2lzdGVycwkJCVwKQEAgLTIyMSw2ICsyODYsMTAgQEAKIAkudHJhcF9ubwkJPSAwLAkJCQlcCiAJLmlyaXhfdHJhbXBvbGluZQk9IDAsCQkJCVwKIAkuaXJpeF9vbGRjdHgJCT0gMCwJCQkJXAorCS8qCQkJCQkJCVwKKwkgKiBDYXZpdW0gT2N0ZW9uIHNwZWNpZmljcyAobnVsbCBpZiBub3QgT2N0ZW9uKQkJXAorCSAqLwkJCQkJCQlcCisJT0NURU9OX0lOSVQJCQkJCQlcCiB9CiAKIHN0cnVjdCB0YXNrX3N0cnVjdDsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9wdHJhY2UuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9wdHJhY2UuaAppbmRleCBjMmM4YmFjLi4xZjMwZDE2IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vcHRyYWNlLmgKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3B0cmFjZS5oCkBAIC00OCw2ICs0OCwxMCBAQAogI2lmZGVmIENPTkZJR19NSVBTX01UX1NNVEMKIAl1bnNpZ25lZCBsb25nIGNwMF90Y3N0YXR1czsKICNlbmRpZiAvKiBDT05GSUdfTUlQU19NVF9TTVRDICovCisjaWZkZWYgQ09ORklHX0NQVV9DQVZJVU1fT0NURU9OCisJdW5zaWduZWQgbG9uZyBsb25nIG1wbFszXTsgICAgICAgIC8qIE1UTXswLDEsMn0gKi8KKwl1bnNpZ25lZCBsb25nIGxvbmcgbXRwWzNdOyAgICAgICAgLyogTVRQezAsMSwyfSAqLworI2VuZGlmCiB9IF9fYXR0cmlidXRlX18gKChhbGlnbmVkICg4KSkpOwogCiAvKiBBcmJpdHJhcmlseSBjaG9vc2UgdGhlIHNhbWUgcHRyYWNlIG51bWJlcnMgYXMgdXNlZCBieSB0aGUgU3BhcmMgY29kZS4gKi8KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9zbXAuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9zbXAuaAppbmRleCA4NjU1N2I1Li40MGU1ZWYxIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vc21wLmgKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3NtcC5oCkBAIC0zNyw2ICszNyw5IEBACiAKICNkZWZpbmUgU01QX1JFU0NIRURVTEVfWU9VUlNFTEYJMHgxCS8qIFhYWCBicmFpbmRlYWQgKi8KICNkZWZpbmUgU01QX0NBTExfRlVOQ1RJT04JMHgyCisvKiBPY3Rlb24gLSBUZWxsIGFub3RoZXIgY29yZSB0byBmbHVzaCBpdHMgaWNhY2hlICovCisjZGVmaW5lIFNNUF9JQ0FDSEVfRkxVU0gJMHg0CisKIAogZXh0ZXJuIHZvaWQgYXNtbGlua2FnZSBzbXBfYm9vdHN0cmFwKHZvaWQpOwogCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vc3RhY2tmcmFtZS5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3N0YWNrZnJhbWUuaAppbmRleCA0YzM3YzRlNS4uZGIwZmE3YiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3N0YWNrZnJhbWUuaAorKysgYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vc3RhY2tmcmFtZS5oCkBAIC0xOTQsNiArMTk0LDE5IEBACiAJCUxPTkdfUwkkMzEsIFBUX1IzMShzcCkKIAkJb3JpCSQyOCwgc3AsIF9USFJFQURfTUFTSwogCQl4b3JpCSQyOCwgX1RIUkVBRF9NQVNLCisjaWZkZWYgQ09ORklHX0NQVV9DQVZJVU1fT0NURU9OCisJCS5zZXQgICAgbWlwczY0CisJCXByZWYgICAgMCwgMCgkMjgpICAgICAgIC8qIFByZWZldGNoIHRoZSBjdXJyZW50IHBvaW50ZXIgKi8KKwkJcHJlZiAgICAwLCBQVF9SMzEoc3ApICAgLyogUHJlZmV0Y2ggdGhlICQzMShyYSkgKi8KKwkJLyogVGhlIE9jdGVvbiBtdWx0aXBsaWVyIHN0YXRlIGlzIGFmZmVjdGVkIGJ5IGdlbmVyYWwgbXVsdGlwbHkKKwkJICAgIGluc3RydWN0aW9ucy4gSXQgbXVzdCBiZSBzYXZlZCBiZWZvcmUgYW5kIGtlcm5lbCBjb2RlIG1pZ2h0CisJCSAgICBjb3JydXB0IGl0ICovCisJCWphbCAgICAgb2N0ZW9uX211bHRfc2F2ZQorCQlMT05HX0wgIHYxLCAwKCQyOCkgIC8qIExvYWQgdGhlIGN1cnJlbnQgcG9pbnRlciAqLworCQkJIC8qIFJlc3RvcmUgJDMxKHJhKSB0aGF0IHdhcyBjaGFuZ2VkIGJ5IHRoZSBqYWwgKi8KKwkJTE9OR19MICByYSwgUFRfUjMxKHNwKQorCQlwcmVmICAgIDAsIDAodjEpICAgIC8qIFByZWZldGNoIHRoZSBjdXJyZW50IHRocmVhZCAqLworI2VuZGlmCiAJCS5zZXQJcG9wCiAJCS5lbmRtCiAKQEAgLTMyNCw2ICszMzcsMTAgQEAKIAkJRFZQRQk1CQkJCSMgZHZwZSBhMQogCQlqYWwJbWlwc19paGIKICNlbmRpZiAvKiBDT05GSUdfTUlQU19NVF9TTVRDICovCisjaWZkZWYgQ09ORklHX0NQVV9DQVZJVU1fT0NURU9OCisJCS8qIFJlc3RvcmUgdGhlIE9jdGVvbiBtdWx0aXBsaWVyIHN0YXRlICovCisJCWphbAlvY3Rlb25fbXVsdF9yZXN0b3JlCisjZW5kaWYKIAkJbWZjMAlhMCwgQ1AwX1NUQVRVUwogCQlvcmkJYTAsIFNUQVRNQVNLCiAJCXhvcmkJYTAsIFNUQVRNQVNLCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vdGltZS5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3RpbWUuaAppbmRleCA5NjAxZWE5Li4zOGEzMGQyIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vdGltZS5oCisrKyBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS90aW1lLmgKQEAgLTUwLDI3ICs1MCwzNSBAQAogLyoKICAqIEluaXRpYWxpemUgdGhlIGNhbGxpbmcgQ1BVJ3MgY29tcGFyZSBpbnRlcnJ1cHQgYXMgY2xvY2tldmVudCBkZXZpY2UKICAqLwotI2lmZGVmIENPTkZJR19DRVZUX1I0SwotZXh0ZXJuIGludCBtaXBzX2Nsb2NrZXZlbnRfaW5pdCh2b2lkKTsKKyNpZmRlZiBDT05GSUdfQ0VWVF9SNEtfTElCCiBleHRlcm4gdW5zaWduZWQgaW50IF9fd2VhayBnZXRfYzBfY29tcGFyZV9pbnQodm9pZCk7Ci0jZWxzZQorZXh0ZXJuIGludCByNGtfY2xvY2tldmVudF9pbml0KHZvaWQpOworI2VuZGlmCisKIHN0YXRpYyBpbmxpbmUgaW50IG1pcHNfY2xvY2tldmVudF9pbml0KHZvaWQpCiB7CisjaWZkZWYgQ09ORklHX0NFVlRfUjRLCisJcmV0dXJuIHI0a19jbG9ja2V2ZW50X2luaXQoKTsKKyNlbHNlCiAJcmV0dXJuIC1FTlhJTzsKLX0KICNlbmRpZgorfQogCiAvKgogICogSW5pdGlhbGl6ZSB0aGUgY291bnQgcmVnaXN0ZXIgYXMgYSBjbG9ja3NvdXJjZQogICovCi0jaWZkZWYgQ09ORklHX0NTUkNfUjRLCi1leHRlcm4gaW50IGluaXRfbWlwc19jbG9ja3NvdXJjZSh2b2lkKTsKLSNlbHNlCisjaWZkZWYgQ09ORklHX0NTUkNfUjRLX0xJQgorZXh0ZXJuIGludCBpbml0X3I0a19jbG9ja3NvdXJjZSh2b2lkKTsKKyNlbmRpZgorCiBzdGF0aWMgaW5saW5lIGludCBpbml0X21pcHNfY2xvY2tzb3VyY2Uodm9pZCkKIHsKKyNpZmRlZiBDT05GSUdfQ1NSQ19SNEsKKwlyZXR1cm4gaW5pdF9yNGtfY2xvY2tzb3VyY2UoKTsKKyNlbHNlCiAJcmV0dXJuIDA7Ci19CiAjZW5kaWYKK30KIAogZXh0ZXJuIHZvaWQgY2xvY2tzb3VyY2Vfc2V0X2Nsb2NrKHN0cnVjdCBjbG9ja3NvdXJjZSAqY3MsIHVuc2lnbmVkIGludCBjbG9jayk7CiBleHRlcm4gdm9pZCBjbG9ja2V2ZW50X3NldF9jbG9jayhzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpjZCwKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvTWFrZWZpbGUgYi9hcmNoL21pcHMva2VybmVsL01ha2VmaWxlCmluZGV4IGIxMzcyYzIuLmU5NjEyMjEgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvTWFrZWZpbGUKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9NYWtlZmlsZQpAQCAtOSw3ICs5LDcgQEAKIAkJICAgdGltZS5vIHRvcG9sb2d5Lm8gdHJhcHMubyB1bmFsaWduZWQubyB3YXRjaC5vCiAKIG9iai0kKENPTkZJR19DRVZUX0JDTTE0ODApCSs9IGNldnQtYmNtMTQ4MC5vCi1vYmotJChDT05GSUdfQ0VWVF9SNEspCQkrPSBjZXZ0LXI0ay5vCitvYmotJChDT05GSUdfQ0VWVF9SNEtfTElCKQkrPSBjZXZ0LXI0ay5vCiBvYmotJChDT05GSUdfTUlQU19NVF9TTVRDKQkrPSBjZXZ0LXNtdGMubwogb2JqLSQoQ09ORklHX0NFVlRfRFMxMjg3KQkrPSBjZXZ0LWRzMTI4Ny5vCiBvYmotJChDT05GSUdfQ0VWVF9HVDY0MVhYKQkrPSBjZXZ0LWd0NjQxeHgubwpAQCAtMTcsNyArMTcsNyBAQAogb2JqLSQoQ09ORklHX0NFVlRfVFhYOSkJCSs9IGNldnQtdHh4OS5vCiBvYmotJChDT05GSUdfQ1NSQ19CQ00xNDgwKQkrPSBjc3JjLWJjbTE0ODAubwogb2JqLSQoQ09ORklHX0NTUkNfSU9BU0lDKQkrPSBjc3JjLWlvYXNpYy5vCi1vYmotJChDT05GSUdfQ1NSQ19SNEspCQkrPSBjc3JjLXI0ay5vCitvYmotJChDT05GSUdfQ1NSQ19SNEtfTElCKQkrPSBjc3JjLXI0ay5vCiBvYmotJChDT05GSUdfQ1NSQ19TQjEyNTApCSs9IGNzcmMtc2IxMjUwLm8KIG9iai0kKENPTkZJR19TWU5DX1I0SykJCSs9IHN5bmMtcjRrLm8KIApAQCAtNDMsNiArNDMsNyBAQAogb2JqLSQoQ09ORklHX0NQVV9UWDM5WFgpCSs9IHIyMzAwX2ZwdS5vIHIyMzAwX3N3aXRjaC5vCiBvYmotJChDT05GSUdfQ1BVX1RYNDlYWCkJKz0gcjRrX2ZwdS5vIHI0a19zd2l0Y2gubwogb2JqLSQoQ09ORklHX0NQVV9WUjQxWFgpCSs9IHI0a19mcHUubyByNGtfc3dpdGNoLm8KK29iai0kKENPTkZJR19DUFVfQ0FWSVVNX09DVEVPTikJKz0gb2N0ZW9uX3N3aXRjaC5vCiAKIG9iai0kKENPTkZJR19TTVApCQkrPSBzbXAubwogb2JqLSQoQ09ORklHX1NNUF9VUCkJCSs9IHNtcC11cC5vCmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL2FzbS1vZmZzZXRzLmMgYi9hcmNoL21pcHMva2VybmVsL2FzbS1vZmZzZXRzLmMKaW5kZXggNzI5NDIyMi4uYzkwMWMyMiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9hc20tb2Zmc2V0cy5jCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvYXNtLW9mZnNldHMuYwpAQCAtNjQsNiArNjQsMTAgQEAKICNpZmRlZiBDT05GSUdfTUlQU19NVF9TTVRDCiAJT0ZGU0VUKFBUX1RDU1RBVFVTLCBwdF9yZWdzLCBjcDBfdGNzdGF0dXMpOwogI2VuZGlmIC8qIENPTkZJR19NSVBTX01UX1NNVEMgKi8KKyNpZmRlZiBDT05GSUdfQ1BVX0NBVklVTV9PQ1RFT04KKwlPRkZTRVQoUFRfTVBMLCBwdF9yZWdzLCBtcGwpOworCU9GRlNFVChQVF9NVFAsIHB0X3JlZ3MsIG10cCk7CisjZW5kaWYgLyogQ09ORklHX0NQVV9DQVZJVU1fT0NURU9OICovCiAJREVGSU5FKFBUX1NJWkUsIHNpemVvZihzdHJ1Y3QgcHRfcmVncykpOwogCUJMQU5LKCk7CiB9CkBAIC0yOTUsMyArMjk5LDMwIEBACiAJREVGSU5FKElDX0lSUV9DUFVTVEFUX1QsIHNpemVvZihpcnFfY3B1c3RhdF90KSk7CiAJQkxBTksoKTsKIH0KKworI2lmZGVmIENPTkZJR19DUFVfQ0FWSVVNX09DVEVPTgordm9pZCBvdXRwdXRfb2N0ZW9uX2NvcDJfc3RhdGVfZGVmaW5lcyh2b2lkKQoreworCUNPTU1FTlQoIk9jdGVvbiBzcGVjaWZpYyBvY3Rlb25fY29wMl9zdGF0ZSBvZmZzZXRzLiIpOworCU9GRlNFVChPQ1RFT05fQ1AyX0NSQ19JViwJb2N0ZW9uX2NvcDJfc3RhdGUsIGNvcDJfY3JjX2l2KTsKKwlPRkZTRVQoT0NURU9OX0NQMl9DUkNfTEVOR1RILAlvY3Rlb25fY29wMl9zdGF0ZSwgY29wMl9jcmNfbGVuZ3RoKTsKKwlPRkZTRVQoT0NURU9OX0NQMl9DUkNfUE9MWSwJb2N0ZW9uX2NvcDJfc3RhdGUsIGNvcDJfY3JjX3BvbHkpOworCU9GRlNFVChPQ1RFT05fQ1AyX0xMTV9EQVQsCW9jdGVvbl9jb3AyX3N0YXRlLCBjb3AyX2xsbV9kYXQpOworCU9GRlNFVChPQ1RFT05fQ1AyXzNERVNfSVYsCW9jdGVvbl9jb3AyX3N0YXRlLCBjb3AyXzNkZXNfaXYpOworCU9GRlNFVChPQ1RFT05fQ1AyXzNERVNfS0VZLAlvY3Rlb25fY29wMl9zdGF0ZSwgY29wMl8zZGVzX2tleSk7CisJT0ZGU0VUKE9DVEVPTl9DUDJfM0RFU19SRVNVTFQsCW9jdGVvbl9jb3AyX3N0YXRlLCBjb3AyXzNkZXNfcmVzdWx0KTsKKwlPRkZTRVQoT0NURU9OX0NQMl9BRVNfSU5QMCwJb2N0ZW9uX2NvcDJfc3RhdGUsIGNvcDJfYWVzX2lucDApOworCU9GRlNFVChPQ1RFT05fQ1AyX0FFU19JViwJb2N0ZW9uX2NvcDJfc3RhdGUsIGNvcDJfYWVzX2l2KTsKKwlPRkZTRVQoT0NURU9OX0NQMl9BRVNfS0VZLAlvY3Rlb25fY29wMl9zdGF0ZSwgY29wMl9hZXNfa2V5KTsKKwlPRkZTRVQoT0NURU9OX0NQMl9BRVNfS0VZTEVOLAlvY3Rlb25fY29wMl9zdGF0ZSwgY29wMl9hZXNfa2V5bGVuKTsKKwlPRkZTRVQoT0NURU9OX0NQMl9BRVNfUkVTVUxULAlvY3Rlb25fY29wMl9zdGF0ZSwgY29wMl9hZXNfcmVzdWx0KTsKKwlPRkZTRVQoT0NURU9OX0NQMl9HRk1fTVVMVCwJb2N0ZW9uX2NvcDJfc3RhdGUsIGNvcDJfZ2ZtX211bHQpOworCU9GRlNFVChPQ1RFT05fQ1AyX0dGTV9QT0xZLAlvY3Rlb25fY29wMl9zdGF0ZSwgY29wMl9nZm1fcG9seSk7CisJT0ZGU0VUKE9DVEVPTl9DUDJfR0ZNX1JFU1VMVCwJb2N0ZW9uX2NvcDJfc3RhdGUsIGNvcDJfZ2ZtX3Jlc3VsdCk7CisJT0ZGU0VUKE9DVEVPTl9DUDJfSFNIX0RBVFcsCW9jdGVvbl9jb3AyX3N0YXRlLCBjb3AyX2hzaF9kYXR3KTsKKwlPRkZTRVQoT0NURU9OX0NQMl9IU0hfSVZXLAlvY3Rlb25fY29wMl9zdGF0ZSwgY29wMl9oc2hfaXZ3KTsKKwlPRkZTRVQoVEhSRUFEX0NQMiwJdGFza19zdHJ1Y3QsIHRocmVhZC5jcDIpOworCU9GRlNFVChUSFJFQURfQ1ZNU0VHLAl0YXNrX3N0cnVjdCwgdGhyZWFkLmN2bXNlZy5jdm1zZWcpOworCUJMQU5LKCk7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvYnJhbmNoLmMgYi9hcmNoL21pcHMva2VybmVsL2JyYW5jaC5jCmluZGV4IDZiNWRmOGIuLjAxNzZlZDAgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvYnJhbmNoLmMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9icmFuY2guYwpAQCAtMjA1LDYgKzIwNSwzOSBAQAogCQkJYnJlYWs7CiAJCX0KIAkJYnJlYWs7CisjaWZkZWYgQ09ORklHX0NQVV9DQVZJVU1fT0NURU9OCisJY2FzZSBsd2MyX29wOiAvKiBUaGlzIGlzIGJiaXQwIG9uIE9jdGVvbiAqLworCQlpZiAoKHJlZ3MtPnJlZ3NbaW5zbi5pX2Zvcm1hdC5yc10gJiAoMXVsbDw8aW5zbi5pX2Zvcm1hdC5ydCkpCisJCSAgICAgPT0gMCkKKwkJCWVwYyA9IGVwYyArIDQgKyAoaW5zbi5pX2Zvcm1hdC5zaW1tZWRpYXRlIDw8IDIpOworCQllbHNlCisJCQllcGMgKz0gODsKKwkJcmVncy0+Y3AwX2VwYyA9IGVwYzsKKwkJYnJlYWs7CisJY2FzZSBsZGMyX29wOiAvKiBUaGlzIGlzIGJiaXQwMzIgb24gT2N0ZW9uICovCisJCWlmICgocmVncy0+cmVnc1tpbnNuLmlfZm9ybWF0LnJzXSAmCisJCSAgICAoMXVsbDw8KGluc24uaV9mb3JtYXQucnQrMzIpKSkgPT0gMCkKKwkJCWVwYyA9IGVwYyArIDQgKyAoaW5zbi5pX2Zvcm1hdC5zaW1tZWRpYXRlIDw8IDIpOworCQllbHNlCisJCQllcGMgKz0gODsKKwkJcmVncy0+Y3AwX2VwYyA9IGVwYzsKKwkJYnJlYWs7CisJY2FzZSBzd2MyX29wOiAvKiBUaGlzIGlzIGJiaXQxIG9uIE9jdGVvbiAqLworCQlpZiAocmVncy0+cmVnc1tpbnNuLmlfZm9ybWF0LnJzXSAmICgxdWxsPDxpbnNuLmlfZm9ybWF0LnJ0KSkKKwkJCWVwYyA9IGVwYyArIDQgKyAoaW5zbi5pX2Zvcm1hdC5zaW1tZWRpYXRlIDw8IDIpOworCQllbHNlCisJCQllcGMgKz0gODsKKwkJcmVncy0+Y3AwX2VwYyA9IGVwYzsKKwkJYnJlYWs7CisJY2FzZSBzZGMyX29wOiAvKiBUaGlzIGlzIGJiaXQxMzIgb24gT2N0ZW9uICovCisJCWlmIChyZWdzLT5yZWdzW2luc24uaV9mb3JtYXQucnNdICYKKwkJICAgICgxdWxsPDwoaW5zbi5pX2Zvcm1hdC5ydCszMikpKQorCQkJZXBjID0gZXBjICsgNCArIChpbnNuLmlfZm9ybWF0LnNpbW1lZGlhdGUgPDwgMik7CisJCWVsc2UKKwkJCWVwYyArPSA4OworCQlyZWdzLT5jcDBfZXBjID0gZXBjOworCQlicmVhazsKKyNlbmRpZgogCX0KIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9jZXZ0LXI0ay5jIGIvYXJjaC9taXBzL2tlcm5lbC9jZXZ0LXI0ay5jCmluZGV4IGUxZWM4M2IuLjAwMTVlNDQgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvY2V2dC1yNGsuYworKysgYi9hcmNoL21pcHMva2VybmVsL2NldnQtcjRrLmMKQEAgLTE2MCw3ICsxNjAsNyBAQAogCiAjaWZuZGVmIENPTkZJR19NSVBTX01UX1NNVEMKIAotaW50IF9fY3B1aW5pdCBtaXBzX2Nsb2NrZXZlbnRfaW5pdCh2b2lkKQoraW50IF9fY3B1aW5pdCByNGtfY2xvY2tldmVudF9pbml0KHZvaWQpCiB7CiAJdWludDY0X3QgbWlwc19mcmVxID0gbWlwc19ocHRfZnJlcXVlbmN5OwogCXVuc2lnbmVkIGludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL2NwdS1wcm9iZS5jIGIvYXJjaC9taXBzL2tlcm5lbC9jcHUtcHJvYmUuYwppbmRleCBjOTIwN2I1Li5hNzE2MmE0IDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL2NwdS1wcm9iZS5jCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvY3B1LXByb2JlLmMKQEAgLTk2LDYgKzk2LDkgQEAKIAogc3RhdGljIHZvaWQgYXUxa193YWl0KHZvaWQpCiB7CisJaWYgKCFhbGxvd19hdTFrX3dhaXQpCisJCXJldHVybjsKKwogCS8qIHVzaW5nIHRoZSB3YWl0IGluc3RydWN0aW9uIG1ha2VzIENQMCBjb3VudGVyIHVudXNhYmxlICovCiAJX19hc21fXygiCS5zZXQJbWlwczMJCQlcbiIKIAkJIgljYWNoZQkweDE0LCAwKCUwKQkJXG4iCkBAIC0xNTQsNiArMTU3LDcgQEAKIAljYXNlIENQVV8yNUtGOgogCWNhc2UgQ1BVX1BSNDQ1MDoKIAljYXNlIENQVV9CQ00zMzAyOgorCWNhc2UgQ1BVX0NBVklVTV9PQ1RFT046CiAJCWNwdV93YWl0ID0gcjRrX3dhaXQ7CiAJCWJyZWFrOwogCkBAIC0xODUsOCArMTg5LDcgQEAKIAljYXNlIENQVV9BVTEyMDA6CiAJY2FzZSBDUFVfQVUxMjEwOgogCWNhc2UgQ1BVX0FVMTI1MDoKLQkJaWYgKGFsbG93X2F1MWtfd2FpdCkKLQkJCWNwdV93YWl0ID0gYXUxa193YWl0OworCQljcHVfd2FpdCA9IGF1MWtfd2FpdDsKIAkJYnJlYWs7CiAJY2FzZSBDUFVfMjBLQzoKIAkJLyoKQEAgLTg3NSw2ICs4NzgsMjcgQEAKIAl9CiB9CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCBjcHVfcHJvYmVfY2F2aXVtKHN0cnVjdCBjcHVpbmZvX21pcHMgKmMsIHVuc2lnbmVkIGludCBjcHUpCit7CisJZGVjb2RlX2NvbmZpZ3MoYyk7CisJc3dpdGNoIChjLT5wcm9jZXNzb3JfaWQgJiAweGZmMDApIHsKKwljYXNlIFBSSURfSU1QX0NBVklVTV9DTjM4WFg6CisJY2FzZSBQUklEX0lNUF9DQVZJVU1fQ04zMVhYOgorCWNhc2UgUFJJRF9JTVBfQ0FWSVVNX0NOMzBYWDoKKwljYXNlIFBSSURfSU1QX0NBVklVTV9DTjU4WFg6CisJY2FzZSBQUklEX0lNUF9DQVZJVU1fQ041NlhYOgorCWNhc2UgUFJJRF9JTVBfQ0FWSVVNX0NONTBYWDoKKwljYXNlIFBSSURfSU1QX0NBVklVTV9DTjUyWFg6CisJCWMtPmNwdXR5cGUgPSBDUFVfQ0FWSVVNX09DVEVPTjsKKwkJX19jcHVfbmFtZVtjcHVdID0gIkNhdml1bSBPY3Rlb24iOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcmludGsoS0VSTl9JTkZPICJVbmtub3duIE9jdGVvbiBjaGlwIVxuIik7CisJCWMtPmNwdXR5cGUgPSBDUFVfVU5LTk9XTjsKKwkJYnJlYWs7CisJfQorfQorCiBjb25zdCBjaGFyICpfX2NwdV9uYW1lW05SX0NQVVNdOwogCiBfX2NwdWluaXQgdm9pZCBjcHVfcHJvYmUodm9pZCkKQEAgLTkwOSw2ICs5MzMsOSBAQAogCWNhc2UgUFJJRF9DT01QX05YUDoKIAkJY3B1X3Byb2JlX254cChjLCBjcHUpOwogCQlicmVhazsKKwljYXNlIFBSSURfQ09NUF9DQVZJVU06CisJCWNwdV9wcm9iZV9jYXZpdW0oYywgY3B1KTsKKwkJYnJlYWs7CiAJfQogCiAJQlVHX09OKCFfX2NwdV9uYW1lW2NwdV0pOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9jc3JjLXI0ay5jIGIvYXJjaC9taXBzL2tlcm5lbC9jc3JjLXI0ay5jCmluZGV4IDc0ZmI3NDUuLmYxYTI4OTMgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvY3NyYy1yNGsuYworKysgYi9hcmNoL21pcHMva2VybmVsL2NzcmMtcjRrLmMKQEAgLTIyLDcgKzIyLDcgQEAKIAkuZmxhZ3MJCT0gQ0xPQ0tfU09VUkNFX0lTX0NPTlRJTlVPVVMsCiB9OwogCi1pbnQgX19pbml0IGluaXRfbWlwc19jbG9ja3NvdXJjZSh2b2lkKQoraW50IF9faW5pdCBpbml0X3I0a19jbG9ja3NvdXJjZSh2b2lkKQogewogCWlmICghY3B1X2hhc19jb3VudGVyIHx8ICFtaXBzX2hwdF9mcmVxdWVuY3kpCiAJCXJldHVybiAtRU5YSU87CmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL2dlbmV4LlMgYi9hcmNoL21pcHMva2VybmVsL2dlbmV4LlMKaW5kZXggNzU3ZDQ4Zi4uZmI2ZjczMSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9nZW5leC5TCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvZ2VuZXguUwpAQCAtMzg1LDEwICszODUsMTQgQEAKIAkuZW5kbQogCiAJLm1hY3JvCV9fYnVpbGRfY2xlYXJfZnBlCisJLnNldAlwdXNoCisJLyogZ2FzIGZhaWxzIHRvIGFzc2VtYmxlIGNmYzEgZm9yIHNvbWUgYXJjaHMgKG9jdGVvbikuKi8gXAorCS5zZXQJbWlwczEKIAljZmMxCWExLCBmY3IzMQogCWxpCWEyLCB+KDB4M2YgPDwgMTIpCiAJYW5kCWEyLCBhMQogCWN0YzEJYTIsIGZjcjMxCisJLnNldAlwb3AKIAlUUkFDRV9JUlFTX09OCiAJU1RJCiAJLmVuZG0KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvaXJxLmMgYi9hcmNoL21pcHMva2VybmVsL2lycS5jCmluZGV4IDRiNDAwN2IuLmEwZmYyYjYgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvaXJxLmMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9pcnEuYwpAQCAtMTExLDYgKzExMSw3IEBACiAJCQlzZXFfcHJpbnRmKHAsICIlMTB1ICIsIGtzdGF0X2NwdShqKS5pcnFzW2ldKTsKICNlbmRpZgogCQlzZXFfcHJpbnRmKHAsICIgJTE0cyIsIGlycV9kZXNjW2ldLmNoaXAtPm5hbWUpOworCQlzZXFfcHJpbnRmKHAsICItJS04cyIsIGlycV9kZXNjW2ldLm5hbWUpOwogCQlzZXFfcHJpbnRmKHAsICIgICVzIiwgYWN0aW9uLT5uYW1lKTsKIAogCQlmb3IgKGFjdGlvbj1hY3Rpb24tPm5leHQ7IGFjdGlvbjsgYWN0aW9uID0gYWN0aW9uLT5uZXh0KQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9vY3Rlb25fc3dpdGNoLlMgYi9hcmNoL21pcHMva2VybmVsL29jdGVvbl9zd2l0Y2guUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTIzODk2Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9vY3Rlb25fc3dpdGNoLlMKQEAgLTAsMCArMSw1MDYgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTgsIDE5OTksIDIwMDIsIDIwMDMgUmFsZiBCYWVjaGxlCisgKiBDb3B5cmlnaHQgKEMpIDE5OTYgRGF2aWQgUy4gTWlsbGVyIChkbUBlbmdyLnNnaS5jb20pCisgKiBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTUsIDE5OTYsIGJ5IEFuZHJlYXMgQnVzc2UKKyAqIENvcHlyaWdodCAoQykgMTk5OSBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgTUlQUyBUZWNobm9sb2dpZXMsIEluYy4KKyAqICAgIHdyaXR0ZW4gYnkgQ2Fyc3RlbiBMYW5nZ2FhcmQsIGNhcnN0ZW5sQG1pcHMuY29tCisgKi8KKyNpbmNsdWRlIDxhc20vYXNtLmg+CisjaW5jbHVkZSA8YXNtL2NhY2hlY3RsLmg+CisjaW5jbHVkZSA8YXNtL2ZwcmVnZGVmLmg+CisjaW5jbHVkZSA8YXNtL21pcHNyZWdzLmg+CisjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKyNpbmNsdWRlIDxhc20vcGd0YWJsZS1iaXRzLmg+CisjaW5jbHVkZSA8YXNtL3JlZ2RlZi5oPgorI2luY2x1ZGUgPGFzbS9zdGFja2ZyYW1lLmg+CisjaW5jbHVkZSA8YXNtL3RocmVhZF9pbmZvLmg+CisKKyNpbmNsdWRlIDxhc20vYXNtbWFjcm8uaD4KKworLyoKKyAqIE9mZnNldCB0byB0aGUgY3VycmVudCBwcm9jZXNzIHN0YXR1cyBmbGFncywgdGhlIGZpcnN0IDMyIGJ5dGVzIG9mIHRoZQorICogc3RhY2sgYXJlIG5vdCB1c2VkLgorICovCisjZGVmaW5lIFNUX09GRiAoX1RIUkVBRF9TSVpFIC0gMzIgLSBQVF9TSVpFICsgUFRfU1RBVFVTKQorCisvKgorICogdGFza19zdHJ1Y3QgKnJlc3VtZSh0YXNrX3N0cnVjdCAqcHJldiwgdGFza19zdHJ1Y3QgKm5leHQsCisgKiAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB0aHJlYWRfaW5mbyAqbmV4dF90aSkKKyAqLworCS5hbGlnbgk3CisJTEVBRihyZXN1bWUpCisJLnNldCBhcmNoPW9jdGVvbgorI2lmbmRlZiBDT05GSUdfQ1BVX0hBU19MTFNDCisJc3cJemVybywgbGxfYml0CisjZW5kaWYKKwltZmMwCXQxLCBDUDBfU1RBVFVTCisJTE9OR19TCXQxLCBUSFJFQURfU1RBVFVTKGEwKQorCWNwdV9zYXZlX25vbnNjcmF0Y2ggYTAKKwlMT05HX1MJcmEsIFRIUkVBRF9SRUczMShhMCkKKworCS8qIGNoZWNrIGlmIHdlIG5lZWQgdG8gc2F2ZSBDT1AyIHJlZ2lzdGVycyAqLworCVBUUl9MCXQyLCBUQVNLX1RIUkVBRF9JTkZPKGEwKQorCUxPTkdfTAl0MCwgU1RfT0ZGKHQyKQorCWJiaXQwCXQwLCAzMCwgMWYKKworCS8qIERpc2FibGUgQ09QMiBpbiB0aGUgc3RvcmVkIHByb2Nlc3Mgc3RhdGUgKi8KKwlsaQl0MSwgU1QwX0NVMgorCXhvcgl0MCwgdDEKKwlMT05HX1MJdDAsIFNUX09GRih0MikKKworCS8qIEVuYWJsZSBDT1AyIHNvIHdlIGNhbiBzYXZlIGl0ICovCisJbWZjMAl0MCwgQ1AwX1NUQVRVUworCW9yCXQwLCB0MQorCW10YzAJdDAsIENQMF9TVEFUVVMKKworCS8qIFNhdmUgQ09QMiAqLworCWRhZGR1CWEwLCBUSFJFQURfQ1AyCisJamFsIG9jdGVvbl9jb3AyX3NhdmUKKwlkc3VidQlhMCwgVEhSRUFEX0NQMgorCisJLyogRGlzYWJsZSBDT1AyIG5vdyB0aGF0IHdlIGFyZSBkb25lICovCisJbWZjMAl0MCwgQ1AwX1NUQVRVUworCWxpCXQxLCBTVDBfQ1UyCisJeG9yCXQwLCB0MQorCW10YzAJdDAsIENQMF9TVEFUVVMKKworMToKKyNpZiBDT05GSUdfQ0FWSVVNX09DVEVPTl9DVk1TRUdfU0laRSA+IDAKKwkvKiBDaGVjayBpZiB3ZSBuZWVkIHRvIHN0b3JlIENWTVNFRyBzdGF0ZSAqLworCW1mYzAJdDAsICQxMSw3IAkvKiBDdm1NZW1DdGwgKi8KKwliYml0MAl0MCwgNiwgM2YJLyogSXMgdXNlciBhY2Nlc3MgZW5hYmxlZD8gKi8KKworCS8qIFN0b3JlIHRoZSBDVk1TRUcgc3RhdGUgKi8KKwkvKiBFeHRyYWN0IHRoZSBzaXplIG9mIENWTVNFRyAqLworCWFuZGkJdDAsIDB4M2YKKwkvKiBNdWx0aXBseSAqIChjYWNoZSBsaW5lIHNpemUvc2l6ZW9mKGxvbmcpLzIpICovCisJc2xsCXQwLCA3LUxPTkdMT0ctMQorCWxpCXQxLCAtMzI3NjggCS8qIEJhc2UgYWRkcmVzcyBvZiBDVk1TRUcgKi8KKwlMT05HX0FEREkgdDIsIGEwLCBUSFJFQURfQ1ZNU0VHCS8qIFdoZXJlIHRvIHN0b3JlIENWTVNFRyB0byAqLworCXN5bmNpb2JkbWEKKzI6CisJLnNldCBub3Jlb3JkZXIKKwlMT05HX0wJdDgsIDAodDEpCS8qIExvYWQgZnJvbSBDVk1TRUcgKi8KKwlzdWJ1CXQwLCAxCQkvKiBEZWNyZW1lbnQgbG9vcCB2YXIgKi8KKwlMT05HX0wJdDksIExPTkdTSVpFKHQxKS8qIExvYWQgZnJvbSBDVk1TRUcgKi8KKwlMT05HX0FERFUgdDEsIExPTkdTSVpFKjIgLyogSW5jcmVtZW50IGxvYyBpbiBDVk1TRUcgKi8KKwlMT05HX1MJdDgsIDAodDIpCS8qIFN0b3JlIENWTVNFRyB0byB0aHJlYWQgc3RvcmFnZSAqLworCUxPTkdfQUREVSB0MiwgTE9OR1NJWkUqMiAvKiBJbmNyZW1lbnQgbG9jIGluIHRocmVhZCBzdG9yYWdlICovCisJYm5legl0MCwgMmIJCS8qIExvb3AgdW50aWwgd2UndmUgY29waWVkIGl0IGFsbCAqLworCSBMT05HX1MJdDksIC1MT05HU0laRSh0MikvKiBTdG9yZSBDVk1TRUcgdG8gdGhyZWFkIHN0b3JhZ2UgKi8KKwkuc2V0IHJlb3JkZXIKKworCS8qIERpc2FibGUgYWNjZXNzIHRvIENWTVNFRyAqLworCW1mYzAJdDAsICQxMSw3IAkvKiBDdm1NZW1DdGwgKi8KKwl4b3JpCXQwLCB0MCwgMHg0MAkvKiBCaXQgNiBpcyBDVk1TRUcgdXNlciBlbmFibGUgKi8KKwltdGMwCXQwLCAkMTEsNyAJLyogQ3ZtTWVtQ3RsICovCisjZW5kaWYKKzM6CisJLyoKKwkgKiBUaGUgb3JkZXIgb2YgcmVzdG9yaW5nIHRoZSByZWdpc3RlcnMgdGFrZXMgY2FyZSBvZiB0aGUgcmFjZQorCSAqIHVwZGF0aW5nICQyOCwgJDI5IGFuZCBrZXJuZWxzcCB3aXRob3V0IGRpc2FibGluZyBpbnRzLgorCSAqLworCW1vdmUJJDI4LCBhMgorCWNwdV9yZXN0b3JlX25vbnNjcmF0Y2ggYTEKKworI2lmIChfVEhSRUFEX1NJWkUgLSAzMikgPCAweDgwMDAKKwlQVFJfQURESVUJdDAsICQyOCwgX1RIUkVBRF9TSVpFIC0gMzIKKyNlbHNlCisJUFRSX0xJCQl0MCwgX1RIUkVBRF9TSVpFIC0gMzIKKwlQVFJfQUREVQl0MCwgJDI4CisjZW5kaWYKKwlzZXRfc2F2ZWRfc3AJdDAsIHQxLCB0MgorCisJbWZjMAl0MSwgQ1AwX1NUQVRVUwkJLyogRG8gd2UgcmVhbGx5IG5lZWQgdGhpcz8gKi8KKwlsaQlhMywgMHhmZjAxCisJYW5kCXQxLCBhMworCUxPTkdfTAlhMiwgVEhSRUFEX1NUQVRVUyhhMSkKKwlub3IJYTMsICQwLCBhMworCWFuZAlhMiwgYTMKKwlvcglhMiwgdDEKKwltdGMwCWEyLCBDUDBfU1RBVFVTCisJbW92ZQl2MCwgYTAKKwlqcglyYQorCUVORChyZXN1bWUpCisKKy8qCisgKiB2b2lkIG9jdGVvbl9jb3AyX3NhdmUoc3RydWN0IG9jdGVvbl9jb3AyX3N0YXRlICphMCkKKyAqLworCS5hbGlnbgk3CisJTEVBRihvY3Rlb25fY29wMl9zYXZlKQorCisJZG1mYzAJdDksICQ5LDcJLyogQ3ZtQ3RsIHJlZ2lzdGVyLiAqLworCisgICAgICAgIC8qIFNhdmUgdGhlIENPUDIgQ1JDIHN0YXRlICovCisJZG1mYzIJdDAsIDB4MDIwMQorCWRtZmMyCXQxLCAweDAyMDIKKwlkbWZjMgl0MiwgMHgwMjAwCisJc2QJdDAsIE9DVEVPTl9DUDJfQ1JDX0lWKGEwKQorCXNkCXQxLCBPQ1RFT05fQ1AyX0NSQ19MRU5HVEgoYTApCisJc2QJdDIsIE9DVEVPTl9DUDJfQ1JDX1BPTFkoYTApCisJLyogU2tpcCBuZXh0IGluc3RydWN0aW9ucyBpZiBDdm1DdGxbTk9ERkFfQ1AyXSBzZXQgKi8KKwliYml0MQl0OSwgMjgsIDFmCisKKwkvKiBTYXZlIHRoZSBMTE0gc3RhdGUgKi8KKwlkbWZjMgl0MCwgMHgwNDAyCisJZG1mYzIJdDEsIDB4MDQwQQorCXNkCXQwLCBPQ1RFT05fQ1AyX0xMTV9EQVQoYTApCisJc2QJdDEsIE9DVEVPTl9DUDJfTExNX0RBVCs4KGEwKQorCisxOiAgICAgIGJiaXQxCXQ5LCAyNiwgM2YJLyogZG9uZSBpZiBDdm1DdGxbTk9DUllQVE9dIHNldCAqLworCisJLyogU2F2ZSB0aGUgQ09QMiBjcnlwdG8gc3RhdGUgKi8KKyAgICAgICAgLyogdGhpcyBwYXJ0IGlzIG1vc3RseSBjb21tb24gdG8gYm90aCBwYXNzIDEgYW5kIGxhdGVyIHJldmlzaW9ucyAqLworCWRtZmMyIAl0MCwgMHgwMDg0CisJZG1mYzIgCXQxLCAweDAwODAKKwlkbWZjMiAJdDIsIDB4MDA4MQorCWRtZmMyIAl0MywgMHgwMDgyCisJc2QJdDAsIE9DVEVPTl9DUDJfM0RFU19JVihhMCkKKwlkbWZjMiAJdDAsIDB4MDA4OAorCXNkCXQxLCBPQ1RFT05fQ1AyXzNERVNfS0VZKGEwKQorCWRtZmMyIAl0MSwgMHgwMTExICAgICAgICAgICAgICAgICAgICAgIC8qIG9ubHkgbmVjZXNzYXJ5IGZvciBwYXNzIDEgKi8KKwlzZAl0MiwgT0NURU9OX0NQMl8zREVTX0tFWSs4KGEwKQorCWRtZmMyIAl0MiwgMHgwMTAyCisJc2QJdDMsIE9DVEVPTl9DUDJfM0RFU19LRVkrMTYoYTApCisJZG1mYzIgCXQzLCAweDAxMDMKKwlzZAl0MCwgT0NURU9OX0NQMl8zREVTX1JFU1VMVChhMCkKKwlkbWZjMiAJdDAsIDB4MDEwNAorCXNkCXQxLCBPQ1RFT05fQ1AyX0FFU19JTlAwKGEwKSAgICAgLyogb25seSBuZWNlc3NhcnkgZm9yIHBhc3MgMSAqLworCWRtZmMyIAl0MSwgMHgwMTA1CisJc2QJdDIsIE9DVEVPTl9DUDJfQUVTX0lWKGEwKQorCWRtZmMyCXQyLCAweDAxMDYKKwlzZAl0MywgT0NURU9OX0NQMl9BRVNfSVYrOChhMCkKKwlkbWZjMiAJdDMsIDB4MDEwNworCXNkCXQwLCBPQ1RFT05fQ1AyX0FFU19LRVkoYTApCisJZG1mYzIJdDAsIDB4MDExMAorCXNkCXQxLCBPQ1RFT05fQ1AyX0FFU19LRVkrOChhMCkKKwlkbWZjMgl0MSwgMHgwMTAwCisJc2QJdDIsIE9DVEVPTl9DUDJfQUVTX0tFWSsxNihhMCkKKwlkbWZjMgl0MiwgMHgwMTAxCisJc2QJdDMsIE9DVEVPTl9DUDJfQUVTX0tFWSsyNChhMCkKKwltZmMwCXQzLCAkMTUsMCAJLyogR2V0IHRoZSBwcm9jZXNzb3IgSUQgcmVnaXN0ZXIgKi8KKwlzZAl0MCwgT0NURU9OX0NQMl9BRVNfS0VZTEVOKGEwKQorCWxpCXQwLCAweDAwMGQwMDAwCS8qIFRoaXMgaXMgdGhlIHByb2Nlc3NvciBJRCBvZiBPY3Rlb24gUGFzczEgKi8KKwlzZAl0MSwgT0NURU9OX0NQMl9BRVNfUkVTVUxUKGEwKQorCXNkCXQyLCBPQ1RFT05fQ1AyX0FFU19SRVNVTFQrOChhMCkKKwkvKiBTa2lwIHRvIHRoZSBQYXNzMSB2ZXJzaW9uIG9mIHRoZSByZW1haW5kZXIgb2YgdGhlIENPUDIgc3RhdGUgKi8KKwliZXEJdDMsIHQwLCAyZgorCisgICAgICAgIC8qIHRoZSBub24tcGFzczEgc3RhdGUgd2hlbiAhQ3ZtQ3RsW05PQ1JZUFRPXSAqLworCWRtZmMyCXQxLCAweDAyNDAKKwlkbWZjMgl0MiwgMHgwMjQxCisJZG1mYzIJdDMsIDB4MDI0MgorCWRtZmMyCXQwLCAweDAyNDMKKwlzZAl0MSwgT0NURU9OX0NQMl9IU0hfREFUVyhhMCkKKwlkbWZjMgl0MSwgMHgwMjQ0CisJc2QJdDIsIE9DVEVPTl9DUDJfSFNIX0RBVFcrOChhMCkKKwlkbWZjMgl0MiwgMHgwMjQ1CisJc2QJdDMsIE9DVEVPTl9DUDJfSFNIX0RBVFcrMTYoYTApCisJZG1mYzIJdDMsIDB4MDI0NgorCXNkCXQwLCBPQ1RFT05fQ1AyX0hTSF9EQVRXKzI0KGEwKQorCWRtZmMyCXQwLCAweDAyNDcKKwlzZAl0MSwgT0NURU9OX0NQMl9IU0hfREFUVyszMihhMCkKKwlkbWZjMgl0MSwgMHgwMjQ4CisJc2QJdDIsIE9DVEVPTl9DUDJfSFNIX0RBVFcrNDAoYTApCisJZG1mYzIJdDIsIDB4MDI0OQorCXNkCXQzLCBPQ1RFT05fQ1AyX0hTSF9EQVRXKzQ4KGEwKQorCWRtZmMyCXQzLCAweDAyNEEKKwlzZAl0MCwgT0NURU9OX0NQMl9IU0hfREFUVys1NihhMCkKKwlkbWZjMgl0MCwgMHgwMjRCCisJc2QJdDEsIE9DVEVPTl9DUDJfSFNIX0RBVFcrNjQoYTApCisJZG1mYzIJdDEsIDB4MDI0QworCXNkCXQyLCBPQ1RFT05fQ1AyX0hTSF9EQVRXKzcyKGEwKQorCWRtZmMyCXQyLCAweDAyNEQKKwlzZAl0MywgT0NURU9OX0NQMl9IU0hfREFUVys4MChhMCkKKwlkbWZjMiAJdDMsIDB4MDI0RQorCXNkCXQwLCBPQ1RFT05fQ1AyX0hTSF9EQVRXKzg4KGEwKQorCWRtZmMyCXQwLCAweDAyNTAKKwlzZAl0MSwgT0NURU9OX0NQMl9IU0hfREFUVys5NihhMCkKKwlkbWZjMgl0MSwgMHgwMjUxCisJc2QJdDIsIE9DVEVPTl9DUDJfSFNIX0RBVFcrMTA0KGEwKQorCWRtZmMyCXQyLCAweDAyNTIKKwlzZAl0MywgT0NURU9OX0NQMl9IU0hfREFUVysxMTIoYTApCisJZG1mYzIJdDMsIDB4MDI1MworCXNkCXQwLCBPQ1RFT05fQ1AyX0hTSF9JVlcoYTApCisJZG1mYzIJdDAsIDB4MDI1NAorCXNkCXQxLCBPQ1RFT05fQ1AyX0hTSF9JVlcrOChhMCkKKwlkbWZjMgl0MSwgMHgwMjU1CisJc2QJdDIsIE9DVEVPTl9DUDJfSFNIX0lWVysxNihhMCkKKwlkbWZjMgl0MiwgMHgwMjU2CisJc2QJdDMsIE9DVEVPTl9DUDJfSFNIX0lWVysyNChhMCkKKwlkbWZjMgl0MywgMHgwMjU3CisJc2QJdDAsIE9DVEVPTl9DUDJfSFNIX0lWVyszMihhMCkKKwlkbWZjMiAJdDAsIDB4MDI1OAorCXNkCXQxLCBPQ1RFT05fQ1AyX0hTSF9JVlcrNDAoYTApCisJZG1mYzIgCXQxLCAweDAyNTkKKwlzZAl0MiwgT0NURU9OX0NQMl9IU0hfSVZXKzQ4KGEwKQorCWRtZmMyCXQyLCAweDAyNUUKKwlzZAl0MywgT0NURU9OX0NQMl9IU0hfSVZXKzU2KGEwKQorCWRtZmMyCXQzLCAweDAyNUEKKwlzZAl0MCwgT0NURU9OX0NQMl9HRk1fTVVMVChhMCkKKwlkbWZjMgl0MCwgMHgwMjVCCisJc2QJdDEsIE9DVEVPTl9DUDJfR0ZNX01VTFQrOChhMCkKKwlzZAl0MiwgT0NURU9OX0NQMl9HRk1fUE9MWShhMCkKKwlzZAl0MywgT0NURU9OX0NQMl9HRk1fUkVTVUxUKGEwKQorCXNkCXQwLCBPQ1RFT05fQ1AyX0dGTV9SRVNVTFQrOChhMCkKKwlqcglyYQorCisyOiAgICAgIC8qIHBhc3MgMSBzcGVjaWFsIHN0dWZmIHdoZW4gIUN2bUN0bFtOT0NSWVBUT10gKi8KKwlkbWZjMgl0MywgMHgwMDQwCisJZG1mYzIJdDAsIDB4MDA0MQorCWRtZmMyCXQxLCAweDAwNDIKKwlkbWZjMgl0MiwgMHgwMDQzCisJc2QJdDMsIE9DVEVPTl9DUDJfSFNIX0RBVFcoYTApCisJZG1mYzIJdDMsIDB4MDA0NAorCXNkCXQwLCBPQ1RFT05fQ1AyX0hTSF9EQVRXKzgoYTApCisJZG1mYzIJdDAsIDB4MDA0NQorCXNkCXQxLCBPQ1RFT05fQ1AyX0hTSF9EQVRXKzE2KGEwKQorCWRtZmMyCXQxLCAweDAwNDYKKwlzZAl0MiwgT0NURU9OX0NQMl9IU0hfREFUVysyNChhMCkKKwlkbWZjMgl0MiwgMHgwMDQ4CisJc2QJdDMsIE9DVEVPTl9DUDJfSFNIX0RBVFcrMzIoYTApCisJZG1mYzIJdDMsIDB4MDA0OQorCXNkCXQwLCBPQ1RFT05fQ1AyX0hTSF9EQVRXKzQwKGEwKQorCWRtZmMyCXQwLCAweDAwNEEKKwlzZAl0MSwgT0NURU9OX0NQMl9IU0hfREFUVys0OChhMCkKKwlzZAl0MiwgT0NURU9OX0NQMl9IU0hfSVZXKGEwKQorCXNkCXQzLCBPQ1RFT05fQ1AyX0hTSF9JVlcrOChhMCkKKwlzZAl0MCwgT0NURU9OX0NQMl9IU0hfSVZXKzE2KGEwKQorCiszOiAgICAgIC8qIHBhc3MgMSBvciBDdm1DdGxbTk9DUllQVE9dIHNldCAqLworCWpyCXJhCisJRU5EKG9jdGVvbl9jb3AyX3NhdmUpCisKKy8qCisgKiB2b2lkIG9jdGVvbl9jb3AyX3Jlc3RvcmUoc3RydWN0IG9jdGVvbl9jb3AyX3N0YXRlICphMCkKKyAqLworCS5hbGlnbgk3CisJLnNldCBwdXNoCisJLnNldCBub3Jlb3JkZXIKKwlMRUFGKG9jdGVvbl9jb3AyX3Jlc3RvcmUpCisgICAgICAgIC8qIEZpcnN0IGNhY2hlIGxpbmUgd2FzIHByZWZldGNoZWQgYmVmb3JlIHRoZSBjYWxsICovCisgICAgICAgIHByZWYgICAgNCwgIDEyOChhMCkKKwlkbWZjMAl0OSwgJDksNwkvKiBDdm1DdGwgcmVnaXN0ZXIuICovCisKKyAgICAgICAgcHJlZiAgICA0LCAgMjU2KGEwKQorCWxkCXQwLCBPQ1RFT05fQ1AyX0NSQ19JVihhMCkKKyAgICAgICAgcHJlZiAgICA0LCAgMzg0KGEwKQorCWxkCXQxLCBPQ1RFT05fQ1AyX0NSQ19MRU5HVEgoYTApCisJbGQJdDIsIE9DVEVPTl9DUDJfQ1JDX1BPTFkoYTApCisKKwkvKiBSZXN0b3JlIHRoZSBDT1AyIENSQyBzdGF0ZSAqLworCWRtdGMyCXQwLCAweDAyMDEKKwlkbXRjMiAJdDEsIDB4MTIwMgorCWJiaXQxCXQ5LCAyOCwgMmYJLyogU2tpcCBMTE0gaWYgQ3ZtQ3RsW05PREZBX0NQMl0gaXMgc2V0ICovCisJIGRtdGMyCXQyLCAweDQyMDAKKworCS8qIFJlc3RvcmUgdGhlIExMTSBzdGF0ZSAqLworCWxkCXQwLCBPQ1RFT05fQ1AyX0xMTV9EQVQoYTApCisJbGQJdDEsIE9DVEVPTl9DUDJfTExNX0RBVCs4KGEwKQorCWRtdGMyCXQwLCAweDA0MDIKKwlkbXRjMgl0MSwgMHgwNDBBCisKKzI6CisJYmJpdDEJdDksIDI2LCBkb25lX3Jlc3RvcmUJLyogZG9uZSBpZiBDdm1DdGxbTk9DUllQVE9dIHNldCAqLworCSBub3AKKworCS8qIFJlc3RvcmUgdGhlIENPUDIgY3J5cHRvIHN0YXRlIGNvbW1vbiB0byBwYXNzIDEgYW5kIHBhc3MgMiAqLworCWxkCXQwLCBPQ1RFT05fQ1AyXzNERVNfSVYoYTApCisJbGQJdDEsIE9DVEVPTl9DUDJfM0RFU19LRVkoYTApCisJbGQJdDIsIE9DVEVPTl9DUDJfM0RFU19LRVkrOChhMCkKKwlkbXRjMiAJdDAsIDB4MDA4NAorCWxkCXQwLCBPQ1RFT05fQ1AyXzNERVNfS0VZKzE2KGEwKQorCWRtdGMyIAl0MSwgMHgwMDgwCisJbGQJdDEsIE9DVEVPTl9DUDJfM0RFU19SRVNVTFQoYTApCisJZG10YzIgCXQyLCAweDAwODEKKwlsZAl0MiwgT0NURU9OX0NQMl9BRVNfSU5QMChhMCkgLyogb25seSByZWFsbHkgbmVlZGVkIGZvciBwYXNzIDEgKi8KKwlkbXRjMgl0MCwgMHgwMDgyCisJbGQJdDAsIE9DVEVPTl9DUDJfQUVTX0lWKGEwKQorCWRtdGMyIAl0MSwgMHgwMDk4CisJbGQJdDEsIE9DVEVPTl9DUDJfQUVTX0lWKzgoYTApCisJZG10YzIgCXQyLCAweDAxMEEgICAgICAgICAgICAgICAgICAvKiBvbmx5IHJlYWxseSBuZWVkZWQgZm9yIHBhc3MgMSAqLworCWxkCXQyLCBPQ1RFT05fQ1AyX0FFU19LRVkoYTApCisJZG10YzIgCXQwLCAweDAxMDIKKwlsZAl0MCwgT0NURU9OX0NQMl9BRVNfS0VZKzgoYTApCisJZG10YzIJdDEsIDB4MDEwMworCWxkCXQxLCBPQ1RFT05fQ1AyX0FFU19LRVkrMTYoYTApCisJZG10YzIJdDIsIDB4MDEwNAorCWxkCXQyLCBPQ1RFT05fQ1AyX0FFU19LRVkrMjQoYTApCisJZG10YzIJdDAsIDB4MDEwNQorCWxkCXQwLCBPQ1RFT05fQ1AyX0FFU19LRVlMRU4oYTApCisJZG10YzIJdDEsIDB4MDEwNgorCWxkCXQxLCBPQ1RFT05fQ1AyX0FFU19SRVNVTFQoYTApCisJZG10YzIJdDIsIDB4MDEwNworCWxkCXQyLCBPQ1RFT05fQ1AyX0FFU19SRVNVTFQrOChhMCkKKwltZmMwCXQzLCAkMTUsMCAJLyogR2V0IHRoZSBwcm9jZXNzb3IgSUQgcmVnaXN0ZXIgKi8KKwlkbXRjMgl0MCwgMHgwMTEwCisJbGkJdDAsIDB4MDAwZDAwMDAJLyogVGhpcyBpcyB0aGUgcHJvY2Vzc29yIElEIG9mIE9jdGVvbiBQYXNzMSAqLworCWRtdGMyCXQxLCAweDAxMDAKKwlibmUJdDAsIHQzLCAzZgkvKiBTa2lwIHRoZSBuZXh0IHN0dWZmIGZvciBub24tcGFzczEgKi8KKwkgZG10YzIJdDIsIDB4MDEwMQorCisgICAgICAgIC8qIHRoaXMgY29kZSBpcyBzcGVjaWZpYyBmb3IgcGFzcyAxICovCisJbGQJdDAsIE9DVEVPTl9DUDJfSFNIX0RBVFcoYTApCisJbGQJdDEsIE9DVEVPTl9DUDJfSFNIX0RBVFcrOChhMCkKKwlsZAl0MiwgT0NURU9OX0NQMl9IU0hfREFUVysxNihhMCkKKwlkbXRjMgl0MCwgMHgwMDQwCisJbGQJdDAsIE9DVEVPTl9DUDJfSFNIX0RBVFcrMjQoYTApCisJZG10YzIJdDEsIDB4MDA0MQorCWxkCXQxLCBPQ1RFT05fQ1AyX0hTSF9EQVRXKzMyKGEwKQorCWRtdGMyCXQyLCAweDAwNDIKKwlsZAl0MiwgT0NURU9OX0NQMl9IU0hfREFUVys0MChhMCkKKwlkbXRjMgl0MCwgMHgwMDQzCisJbGQJdDAsIE9DVEVPTl9DUDJfSFNIX0RBVFcrNDgoYTApCisJZG10YzIJdDEsIDB4MDA0NAorCWxkCXQxLCBPQ1RFT05fQ1AyX0hTSF9JVlcoYTApCisJZG10YzIJdDIsIDB4MDA0NQorCWxkCXQyLCBPQ1RFT05fQ1AyX0hTSF9JVlcrOChhMCkKKwlkbXRjMgl0MCwgMHgwMDQ2CisJbGQJdDAsIE9DVEVPTl9DUDJfSFNIX0lWVysxNihhMCkKKwlkbXRjMgl0MSwgMHgwMDQ4CisJZG10YzIJdDIsIDB4MDA0OQorICAgICAgICBiIGRvbmVfcmVzdG9yZSAgIC8qIHVuY29uZGl0aW9uYWwgYnJhbmNoICovCisJIGRtdGMyCXQwLCAweDAwNEEKKworMzogICAgICAvKiB0aGlzIGlzIHBvc3QtcGFzczEgY29kZSAqLworCWxkCXQyLCBPQ1RFT05fQ1AyX0hTSF9EQVRXKGEwKQorCWxkCXQwLCBPQ1RFT05fQ1AyX0hTSF9EQVRXKzgoYTApCisJbGQJdDEsIE9DVEVPTl9DUDJfSFNIX0RBVFcrMTYoYTApCisJZG10YzIJdDIsIDB4MDI0MAorCWxkCXQyLCBPQ1RFT05fQ1AyX0hTSF9EQVRXKzI0KGEwKQorCWRtdGMyCXQwLCAweDAyNDEKKwlsZAl0MCwgT0NURU9OX0NQMl9IU0hfREFUVyszMihhMCkKKwlkbXRjMgl0MSwgMHgwMjQyCisJbGQJdDEsIE9DVEVPTl9DUDJfSFNIX0RBVFcrNDAoYTApCisJZG10YzIJdDIsIDB4MDI0MworCWxkCXQyLCBPQ1RFT05fQ1AyX0hTSF9EQVRXKzQ4KGEwKQorCWRtdGMyCXQwLCAweDAyNDQKKwlsZAl0MCwgT0NURU9OX0NQMl9IU0hfREFUVys1NihhMCkKKwlkbXRjMgl0MSwgMHgwMjQ1CisJbGQJdDEsIE9DVEVPTl9DUDJfSFNIX0RBVFcrNjQoYTApCisJZG10YzIJdDIsIDB4MDI0NgorCWxkCXQyLCBPQ1RFT05fQ1AyX0hTSF9EQVRXKzcyKGEwKQorCWRtdGMyCXQwLCAweDAyNDcKKwlsZAl0MCwgT0NURU9OX0NQMl9IU0hfREFUVys4MChhMCkKKwlkbXRjMgl0MSwgMHgwMjQ4CisJbGQJdDEsIE9DVEVPTl9DUDJfSFNIX0RBVFcrODgoYTApCisJZG10YzIJdDIsIDB4MDI0OQorCWxkCXQyLCBPQ1RFT05fQ1AyX0hTSF9EQVRXKzk2KGEwKQorCWRtdGMyCXQwLCAweDAyNEEKKwlsZAl0MCwgT0NURU9OX0NQMl9IU0hfREFUVysxMDQoYTApCisJZG10YzIJdDEsIDB4MDI0QgorCWxkCXQxLCBPQ1RFT05fQ1AyX0hTSF9EQVRXKzExMihhMCkKKwlkbXRjMgl0MiwgMHgwMjRDCisJbGQJdDIsIE9DVEVPTl9DUDJfSFNIX0lWVyhhMCkKKwlkbXRjMgl0MCwgMHgwMjRECisJbGQJdDAsIE9DVEVPTl9DUDJfSFNIX0lWVys4KGEwKQorCWRtdGMyCXQxLCAweDAyNEUKKwlsZAl0MSwgT0NURU9OX0NQMl9IU0hfSVZXKzE2KGEwKQorCWRtdGMyCXQyLCAweDAyNTAKKwlsZAl0MiwgT0NURU9OX0NQMl9IU0hfSVZXKzI0KGEwKQorCWRtdGMyCXQwLCAweDAyNTEKKwlsZAl0MCwgT0NURU9OX0NQMl9IU0hfSVZXKzMyKGEwKQorCWRtdGMyCXQxLCAweDAyNTIKKwlsZAl0MSwgT0NURU9OX0NQMl9IU0hfSVZXKzQwKGEwKQorCWRtdGMyCXQyLCAweDAyNTMKKwlsZAl0MiwgT0NURU9OX0NQMl9IU0hfSVZXKzQ4KGEwKQorCWRtdGMyCXQwLCAweDAyNTQKKwlsZAl0MCwgT0NURU9OX0NQMl9IU0hfSVZXKzU2KGEwKQorCWRtdGMyCXQxLCAweDAyNTUKKwlsZAl0MSwgT0NURU9OX0NQMl9HRk1fTVVMVChhMCkKKwlkbXRjMgl0MiwgMHgwMjU2CisJbGQJdDIsIE9DVEVPTl9DUDJfR0ZNX01VTFQrOChhMCkKKwlkbXRjMgl0MCwgMHgwMjU3CisJbGQJdDAsIE9DVEVPTl9DUDJfR0ZNX1BPTFkoYTApCisJZG10YzIJdDEsIDB4MDI1OAorCWxkCXQxLCBPQ1RFT05fQ1AyX0dGTV9SRVNVTFQoYTApCisJZG10YzIJdDIsIDB4MDI1OQorCWxkCXQyLCBPQ1RFT05fQ1AyX0dGTV9SRVNVTFQrOChhMCkKKwlkbXRjMgl0MCwgMHgwMjVFCisJZG10YzIJdDEsIDB4MDI1QQorCWRtdGMyCXQyLCAweDAyNUIKKworZG9uZV9yZXN0b3JlOgorCWpyCXJhCisJIG5vcAorCUVORChvY3Rlb25fY29wMl9yZXN0b3JlKQorCS5zZXQgcG9wCisKKy8qCisgKiB2b2lkIG9jdGVvbl9tdWx0X3NhdmUoKQorICogc3AgaXMgYXNzdW1lZCB0byBwb2ludCB0byBhIHN0cnVjdCBwdF9yZWdzCisgKgorICogTk9URTogVGhpcyBpcyBjYWxsZWQgaW4gU0FWRV9TT01FIGluIHN0YWNrZnJhbWUuaC4gSXQgY2FuIG9ubHkKKyAqICAgICAgIHNhZmVseSBtb2RpZnkgazAgYW5kIGsxLgorICovCisJLmFsaWduCTcKKwkuc2V0IHB1c2gKKwkuc2V0IG5vcmVvcmRlcgorCUxFQUYob2N0ZW9uX211bHRfc2F2ZSkKKwlkbWZjMAlrMCwgJDksNwkvKiBDdm1DdGwgcmVnaXN0ZXIuICovCisJYmJpdDEJazAsIDI3LCAxZgkvKiBTa2lwIEN2bUN0bFtOT01VTF0gKi8KKwkgbm9wCisKKwkvKiBTYXZlIHRoZSBtdWx0aXBsaWVyIHN0YXRlICovCisJdjNtdWx1CWswLCAkMCwgJDAKKwl2M211bHUJazEsICQwLCAkMAorCXNkCWswLCBQVF9NVFAoc3ApICAgICAgICAvKiBQVF9NVFAgICAgaGFzIFAwICovCisJdjNtdWx1CWswLCAkMCwgJDAKKwlzZAlrMSwgUFRfTVRQKzgoc3ApICAgICAgLyogUFRfTVRQKzggIGhhcyBQMSAqLworCW9yaQlrMSwgJDAsIDEKKwl2M211bHUJazEsIGsxLCAkMAorCXNkCWswLCBQVF9NVFArMTYoc3ApICAgICAvKiBQVF9NVFArMTYgaGFzIFAyICovCisJdjNtdWx1CWswLCAkMCwgJDAKKwlzZAlrMSwgUFRfTVBMKHNwKSAgICAgICAgLyogUFRfTVBMICAgIGhhcyBNUEwwICovCisJdjNtdWx1CWsxLCAkMCwgJDAKKwlzZAlrMCwgUFRfTVBMKzgoc3ApICAgICAgLyogUFRfTVBMKzggIGhhcyBNUEwxICovCisJanIJcmEKKwkgc2QJazEsIFBUX01QTCsxNihzcCkgICAgIC8qIFBUX01QTCsxNiBoYXMgTVBMMiAqLworCisxOgkvKiBSZXN1bWUgaGVyZSBpZiBDdm1DdGxbTk9NVUxdICovCisJanIJcmEKKwlFTkQob2N0ZW9uX211bHRfc2F2ZSkKKwkuc2V0IHBvcAorCisvKgorICogdm9pZCBvY3Rlb25fbXVsdF9yZXN0b3JlKCkKKyAqIHNwIGlzIGFzc3VtZWQgdG8gcG9pbnQgdG8gYSBzdHJ1Y3QgcHRfcmVncworICoKKyAqIE5PVEU6IFRoaXMgaXMgY2FsbGVkIGluIFJFU1RPUkVfU09NRSBpbiBzdGFja2ZyYW1lLmguCisgKi8KKwkuYWxpZ24JNworCS5zZXQgcHVzaAorCS5zZXQgbm9yZW9yZGVyCisJTEVBRihvY3Rlb25fbXVsdF9yZXN0b3JlKQorCWRtZmMwCWsxLCAkOSw3CQkvKiBDdm1DdGwgcmVnaXN0ZXIuICovCisJbGQJdjAsIFBUX01QTChzcCkgICAgICAgIAkvKiBNUEwwICovCisJbGQJdjEsIFBUX01QTCs4KHNwKSAgICAgIAkvKiBNUEwxICovCisJbGQJazAsIFBUX01QTCsxNihzcCkgICAgIAkvKiBNUEwyICovCisJYmJpdDEJazEsIDI3LCAxZgkJLyogU2tpcCBDdm1DdGxbTk9NVUxdICovCisJLyogTm9ybWFsbHkgZmFsbHMgdGhyb3VnaCwgc28gbm8gdGltZSB3YXN0ZWQgaGVyZSAqLworCW5vcAorCisJLyogUmVzdG9yZSB0aGUgbXVsdGlwbGllciBzdGF0ZSAqLworCWxkCWsxLCBQVF9NVFArMTYoc3ApICAgICAJLyogUDIgKi8KKwlNVE0wCXYwCQkJLyogTVBMMCAqLworCWxkCXYwLCBQVF9NVFArOChzcCkJLyogUDEgKi8KKwlNVE0xCXYxCQkJLyogTVBMMSAqLworCWxkCXYxLCBQVF9NVFAoc3ApICAgCS8qIFAwICovCisJTVRNMglrMAkJCS8qIE1QTDIgKi8KKwlNVFAyCWsxCQkJLyogUDIgKi8KKwlNVFAxCXYwCQkJLyogUDEgKi8KKwlqcglyYQorCSBNVFAwCXYxCQkJLyogUDAgKi8KKworMToJLyogUmVzdW1lIGhlcmUgaWYgQ3ZtQ3RsW05PTVVMXSAqLworCWpyCXJhCisJIG5vcAorCUVORChvY3Rlb25fbXVsdF9yZXN0b3JlKQorCS5zZXQgcG9wCisKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvcHRyYWNlMzIuYyBiL2FyY2gvbWlwcy9rZXJuZWwvcHRyYWNlMzIuYwppbmRleCAxY2EzNDEwLi5jNGY5YWMxIDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL3B0cmFjZTMyLmMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9wdHJhY2UzMi5jCkBAIC00OSwxOSArNDksNiBAQAogCWludCByZXQ7CiAKIAlzd2l0Y2ggKHJlcXVlc3QpIHsKLQkvKiB3aGVuIEkgYW5kIEQgc3BhY2UgYXJlIHNlcGFyYXRlLCB0aGVzZSB3aWxsIG5lZWQgdG8gYmUgZml4ZWQuICovCi0JY2FzZSBQVFJBQ0VfUEVFS1RFWFQ6IC8qIHJlYWQgd29yZCBhdCBsb2NhdGlvbiBhZGRyLiAqLwotCWNhc2UgUFRSQUNFX1BFRUtEQVRBOiB7Ci0JCXVuc2lnbmVkIGludCB0bXA7Ci0JCWludCBjb3BpZWQ7Ci0KLQkJY29waWVkID0gYWNjZXNzX3Byb2Nlc3Nfdm0oY2hpbGQsIGFkZHIsICZ0bXAsIHNpemVvZih0bXApLCAwKTsKLQkJcmV0ID0gLUVJTzsKLQkJaWYgKGNvcGllZCAhPSBzaXplb2YodG1wKSkKLQkJCWJyZWFrOwotCQlyZXQgPSBwdXRfdXNlcih0bXAsICh1bnNpZ25lZCBpbnQgX191c2VyICopICh1bnNpZ25lZCBsb25nKSBkYXRhKTsKLQkJYnJlYWs7Ci0JfQogCiAJLyoKIAkgKiBSZWFkIDQgYnl0ZXMgb2YgdGhlIG90aGVyIHByb2Nlc3MnIHN0b3JhZ2UKQEAgLTIwOCwxNiArMTk1LDYgQEAKIAkJYnJlYWs7CiAJfQogCi0JLyogd2hlbiBJIGFuZCBEIHNwYWNlIGFyZSBzZXBhcmF0ZSwgdGhpcyB3aWxsIGhhdmUgdG8gYmUgZml4ZWQuICovCi0JY2FzZSBQVFJBQ0VfUE9LRVRFWFQ6IC8qIHdyaXRlIHRoZSB3b3JkIGF0IGxvY2F0aW9uIGFkZHIuICovCi0JY2FzZSBQVFJBQ0VfUE9LRURBVEE6Ci0JCXJldCA9IDA7Ci0JCWlmIChhY2Nlc3NfcHJvY2Vzc192bShjaGlsZCwgYWRkciwgJmRhdGEsIHNpemVvZihkYXRhKSwgMSkKLQkJICAgID09IHNpemVvZihkYXRhKSkKLQkJCWJyZWFrOwotCQlyZXQgPSAtRUlPOwotCQlicmVhazsKLQogCS8qCiAJICogV3JpdGUgNCBieXRlcyBpbnRvIHRoZSBvdGhlciBwcm9jZXNzJyBzdG9yYWdlCiAJICogIGRhdGEgaXMgdGhlIDQgYnl0ZXMgdGhhdCB0aGUgdXNlciB3YW50cyB3cml0dGVuCkBAIC0zMzIsNTAgKzMwOSwxMSBAQAogCQlyZXQgPSBwdHJhY2Vfc2V0ZnByZWdzKGNoaWxkLCAoX191MzIgX191c2VyICopIChfX3U2NCkgZGF0YSk7CiAJCWJyZWFrOwogCi0JY2FzZSBQVFJBQ0VfU1lTQ0FMTDogLyogY29udGludWUgYW5kIHN0b3AgYXQgbmV4dCAocmV0dXJuIGZyb20pIHN5c2NhbGwgKi8KLQljYXNlIFBUUkFDRV9DT05UOiB7IC8qIHJlc3RhcnQgYWZ0ZXIgc2lnbmFsLiAqLwotCQlyZXQgPSAtRUlPOwotCQlpZiAoIXZhbGlkX3NpZ25hbChkYXRhKSkKLQkJCWJyZWFrOwotCQlpZiAocmVxdWVzdCA9PSBQVFJBQ0VfU1lTQ0FMTCkgewotCQkJc2V0X3Rza190aHJlYWRfZmxhZyhjaGlsZCwgVElGX1NZU0NBTExfVFJBQ0UpOwotCQl9Ci0JCWVsc2UgewotCQkJY2xlYXJfdHNrX3RocmVhZF9mbGFnKGNoaWxkLCBUSUZfU1lTQ0FMTF9UUkFDRSk7Ci0JCX0KLQkJY2hpbGQtPmV4aXRfY29kZSA9IGRhdGE7Ci0JCXdha2VfdXBfcHJvY2VzcyhjaGlsZCk7Ci0JCXJldCA9IDA7Ci0JCWJyZWFrOwotCX0KLQotCS8qCi0JICogbWFrZSB0aGUgY2hpbGQgZXhpdC4gIEJlc3QgSSBjYW4gZG8gaXMgc2VuZCBpdCBhIHNpZ2tpbGwuCi0JICogcGVyaGFwcyBpdCBzaG91bGQgYmUgcHV0IGluIHRoZSBzdGF0dXMgdGhhdCBpdCB3YW50cyB0bwotCSAqIGV4aXQuCi0JICovCi0JY2FzZSBQVFJBQ0VfS0lMTDoKLQkJcmV0ID0gMDsKLQkJaWYgKGNoaWxkLT5leGl0X3N0YXRlID09IEVYSVRfWk9NQklFKQkvKiBhbHJlYWR5IGRlYWQgKi8KLQkJCWJyZWFrOwotCQljaGlsZC0+ZXhpdF9jb2RlID0gU0lHS0lMTDsKLQkJd2FrZV91cF9wcm9jZXNzKGNoaWxkKTsKLQkJYnJlYWs7Ci0KIAljYXNlIFBUUkFDRV9HRVRfVEhSRUFEX0FSRUE6CiAJCXJldCA9IHB1dF91c2VyKHRhc2tfdGhyZWFkX2luZm8oY2hpbGQpLT50cF92YWx1ZSwKIAkJCQkodW5zaWduZWQgaW50IF9fdXNlciAqKSAodW5zaWduZWQgbG9uZykgZGF0YSk7CiAJCWJyZWFrOwogCi0JY2FzZSBQVFJBQ0VfREVUQUNIOiAvKiBkZXRhY2ggYSBwcm9jZXNzIHRoYXQgd2FzIGF0dGFjaGVkLiAqLwotCQlyZXQgPSBwdHJhY2VfZGV0YWNoKGNoaWxkLCBkYXRhKTsKLQkJYnJlYWs7Ci0KLQljYXNlIFBUUkFDRV9HRVRFVkVOVE1TRzoKLQkJcmV0ID0gcHV0X3VzZXIoY2hpbGQtPnB0cmFjZV9tZXNzYWdlLAotCQkJICAgICAgICh1bnNpZ25lZCBpbnQgX191c2VyICopICh1bnNpZ25lZCBsb25nKSBkYXRhKTsKLQkJYnJlYWs7Ci0KIAljYXNlIFBUUkFDRV9HRVRfVEhSRUFEX0FSRUFfMzI2NDoKIAkJcmV0ID0gcHV0X3VzZXIodGFza190aHJlYWRfaW5mbyhjaGlsZCktPnRwX3ZhbHVlLAogCQkJCSh1bnNpZ25lZCBsb25nIF9fdXNlciAqKSAodW5zaWduZWQgbG9uZykgZGF0YSk7CkBAIC0zOTIsNyArMzMwLDcgQEAKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgotCQlyZXQgPSBwdHJhY2VfcmVxdWVzdChjaGlsZCwgcmVxdWVzdCwgYWRkciwgZGF0YSk7CisJCXJldCA9IGNvbXBhdF9wdHJhY2VfcmVxdWVzdChjaGlsZCwgcmVxdWVzdCwgYWRkciwgZGF0YSk7CiAJCWJyZWFrOwogCX0KIG91dDoKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvc2NhbGwzMi1vMzIuUyBiL2FyY2gvbWlwcy9rZXJuZWwvc2NhbGwzMi1vMzIuUwppbmRleCBkMDkxNmE1Li41MWQxYmE0IDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL3NjYWxsMzItbzMyLlMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9zY2FsbDMyLW8zMi5TCkBAIC0zOTgsNyArMzk4LDcgQEAKIAlzeXMJc3lzX3VzZWxpYgkJMQogCXN5cwlzeXNfc3dhcG9uCQkyCiAJc3lzCXN5c19yZWJvb3QJCTMKLQlzeXMJb2xkX3JlYWRkaXIJCTMKKwlzeXMJc3lzX29sZF9yZWFkZGlyCQkzCiAJc3lzCW9sZF9tbWFwCQk2CS8qIDQwOTAgKi8KIAlzeXMJc3lzX211bm1hcAkJMgogCXN5cwlzeXNfdHJ1bmNhdGUJCTIKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvc3RhY2t0cmFjZS5jIGIvYXJjaC9taXBzL2tlcm5lbC9zdGFja3RyYWNlLmMKaW5kZXggMDYzMmUyYS4uNThmNWNkNyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9zdGFja3RyYWNlLmMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9zdGFja3RyYWNlLmMKQEAgLTMyLDcgKzMyLDggQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIHNhdmVfY29udGV4dF9zdGFjayhzdHJ1Y3Qgc3RhY2tfdHJhY2UgKnRyYWNlLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3N0YXRpYyB2b2lkIHNhdmVfY29udGV4dF9zdGFjayhzdHJ1Y3Qgc3RhY2tfdHJhY2UgKnRyYWNlLAorCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAl1bnNpZ25lZCBsb25nIHNwID0gcmVncy0+cmVnc1syOV07CiAjaWZkZWYgQ09ORklHX0tBTExTWU1TCkBAIC00MSw3ICs0Miw3IEBACiAKIAlpZiAocmF3X3Nob3dfdHJhY2UgfHwgIV9fa2VybmVsX3RleHRfYWRkcmVzcyhwYykpIHsKIAkJdW5zaWduZWQgbG9uZyBzdGFja19wYWdlID0KLQkJCSh1bnNpZ25lZCBsb25nKXRhc2tfc3RhY2tfcGFnZShjdXJyZW50KTsKKwkJCSh1bnNpZ25lZCBsb25nKXRhc2tfc3RhY2tfcGFnZSh0c2spOwogCQlpZiAoc3RhY2tfcGFnZSAmJiBzcCA+PSBzdGFja19wYWdlICYmCiAJCSAgICBzcCA8PSBzdGFja19wYWdlICsgVEhSRUFEX1NJWkUgLSAzMikKIAkJCXNhdmVfcmF3X2NvbnRleHRfc3RhY2sodHJhY2UsIHNwKTsKQEAgLTU0LDcgKzU1LDcgQEAKIAkJCXRyYWNlLT5lbnRyaWVzW3RyYWNlLT5ucl9lbnRyaWVzKytdID0gcGM7CiAJCWlmICh0cmFjZS0+bnJfZW50cmllcyA+PSB0cmFjZS0+bWF4X2VudHJpZXMpCiAJCQlicmVhazsKLQkJcGMgPSB1bndpbmRfc3RhY2soY3VycmVudCwgJnNwLCBwYywgJnJhKTsKKwkJcGMgPSB1bndpbmRfc3RhY2sodHNrLCAmc3AsIHBjLCAmcmEpOwogCX0gd2hpbGUgKHBjKTsKICNlbHNlCiAJc2F2ZV9yYXdfY29udGV4dF9zdGFjayh0cmFjZSwgc3ApOwpAQCAtNjYsMTIgKzY3LDIzIEBACiAgKi8KIHZvaWQgc2F2ZV9zdGFja190cmFjZShzdHJ1Y3Qgc3RhY2tfdHJhY2UgKnRyYWNlKQogeworCXNhdmVfc3RhY2tfdHJhY2VfdHNrKGN1cnJlbnQsIHRyYWNlKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNhdmVfc3RhY2tfdHJhY2UpOworCit2b2lkIHNhdmVfc3RhY2tfdHJhY2VfdHNrKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCBzdHJ1Y3Qgc3RhY2tfdHJhY2UgKnRyYWNlKQorewogCXN0cnVjdCBwdF9yZWdzIGR1bW15cmVnczsKIAlzdHJ1Y3QgcHRfcmVncyAqcmVncyA9ICZkdW1teXJlZ3M7CiAKIAlXQVJOX09OKHRyYWNlLT5ucl9lbnRyaWVzIHx8ICF0cmFjZS0+bWF4X2VudHJpZXMpOwogCi0JcHJlcGFyZV9mcmFtZXRyYWNlKHJlZ3MpOwotCXNhdmVfY29udGV4dF9zdGFjayh0cmFjZSwgcmVncyk7CisJaWYgKHRzayAhPSBjdXJyZW50KSB7CisJCXJlZ3MtPnJlZ3NbMjldID0gdHNrLT50aHJlYWQucmVnMjk7CisJCXJlZ3MtPnJlZ3NbMzFdID0gMDsKKwkJcmVncy0+Y3AwX2VwYyA9IHRzay0+dGhyZWFkLnJlZzMxOworCX0gZWxzZQorCQlwcmVwYXJlX2ZyYW1ldHJhY2UocmVncyk7CisJc2F2ZV9jb250ZXh0X3N0YWNrKHRyYWNlLCB0c2ssIHJlZ3MpOwogfQotRVhQT1JUX1NZTUJPTF9HUEwoc2F2ZV9zdGFja190cmFjZSk7CitFWFBPUlRfU1lNQk9MX0dQTChzYXZlX3N0YWNrX3RyYWNlX3Rzayk7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL3RyYXBzLmMgYi9hcmNoL21pcHMva2VybmVsL3RyYXBzLmMKaW5kZXggMzUzMDU2MS4uZjYwODNjNiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC90cmFwcy5jCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvdHJhcHMuYwpAQCAtNDcsNiArNDcsNyBAQAogI2luY2x1ZGUgPGFzbS9tbXVfY29udGV4dC5oPgogI2luY2x1ZGUgPGFzbS90eXBlcy5oPgogI2luY2x1ZGUgPGFzbS9zdGFja3RyYWNlLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgogCiBleHRlcm4gdm9pZCBjaGVja193YWl0KHZvaWQpOwogZXh0ZXJuIGFzbWxpbmthZ2Ugdm9pZCByNGtfd2FpdCh2b2lkKTsKQEAgLTc4LDYgKzc5LDEwIEBACiBleHRlcm4gaW50IGZwdV9lbXVsYXRvcl9jb3AxSGFuZGxlcihzdHJ1Y3QgcHRfcmVncyAqeGNwLAogCXN0cnVjdCBtaXBzX2ZwdV9zdHJ1Y3QgKmN0eCwgaW50IGhhc19mcHUpOwogCisjaWZkZWYgQ09ORklHX0NQVV9DQVZJVU1fT0NURU9OCitleHRlcm4gYXNtbGlua2FnZSB2b2lkIG9jdGVvbl9jb3AyX3Jlc3RvcmUoc3RydWN0IG9jdGVvbl9jb3AyX3N0YXRlICp0YXNrKTsKKyNlbmRpZgorCiB2b2lkICgqYm9hcmRfYmVfaW5pdCkodm9pZCk7CiBpbnQgKCpib2FyZF9iZV9oYW5kbGVyKShzdHJ1Y3QgcHRfcmVncyAqcmVncywgaW50IGlzX2ZpeHVwKTsKIHZvaWQgKCpib2FyZF9ubWlfaGFuZGxlcl9zZXR1cCkodm9pZCk7CkBAIC04NjAsNiArODY1LDcgQEAKIAl1bnNpZ25lZCBpbnQgb3Bjb2RlOwogCXVuc2lnbmVkIGludCBjcGlkOwogCWludCBzdGF0dXM7CisJdW5zaWduZWQgbG9uZyBfX21heWJlX3VudXNlZCBmbGFnczsKIAogCWRpZV9pZl9rZXJuZWwoImRvX2NwdSBpbnZva2VkIGZyb20ga2VybmVsIGNvbnRleHQhIiwgcmVncyk7CiAKQEAgLTkxNSw2ICs5MjEsMTcgQEAKIAkJcmV0dXJuOwogCiAJY2FzZSAyOgorI2lmZGVmIENPTkZJR19DUFVfQ0FWSVVNX09DVEVPTgorCQlwcmVmZXRjaCgmY3VycmVudC0+dGhyZWFkLmNwMik7CisJCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwkJS1NUS19TVEFUVVMoY3VycmVudCkgfD0gU1QwX0NVMjsKKwkJc3RhdHVzID0gcmVhZF9jMF9zdGF0dXMoKTsKKwkJd3JpdGVfYzBfc3RhdHVzKHN0YXR1cyB8IFNUMF9DVTIpOworCQlvY3Rlb25fY29wMl9yZXN0b3JlKCYoY3VycmVudC0+dGhyZWFkLmNwMikpOworCQl3cml0ZV9jMF9zdGF0dXMoc3RhdHVzICYgflNUMF9DVTIpOworCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJCXJldHVybjsKKyNlbmRpZgogCWNhc2UgMzoKIAkJYnJlYWs7CiAJfQpAQCAtMTQ4OCw2ICsxNTA1LDEwIEBACiAJCXdyaXRlX2MwX2h3cmVuYShlbmFibGUpOwogCX0KIAorI2lmZGVmIENPTkZJR19DUFVfQ0FWSVVNX09DVEVPTgorCXdyaXRlX2MwX2h3cmVuYSgweGMwMDAwMDBmKTsgLyogT2N0ZW9uIGhhcyByZWdpc3RlciAzMCBhbmQgMzEgKi8KKyNlbmRpZgorCiAjaWZkZWYgQ09ORklHX01JUFNfTVRfU01UQwogCWlmICghc2Vjb25kYXJ5VEMpIHsKICNlbmRpZiAvKiBDT05GSUdfTUlQU19NVF9TTVRDICovCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbGliL01ha2VmaWxlIGIvYXJjaC9taXBzL2xpYi9NYWtlZmlsZQppbmRleCBkYmNmNjUxLi5jMTNjN2FkIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbGliL01ha2VmaWxlCisrKyBiL2FyY2gvbWlwcy9saWIvTWFrZWZpbGUKQEAgLTI3LDYgKzI3LDcgQEAKIG9iai0kKENPTkZJR19DUFVfVFgzOVhYKQkrPSByM2tfZHVtcF90bGIubwogb2JqLSQoQ09ORklHX0NQVV9UWDQ5WFgpCSs9IGR1bXBfdGxiLm8KIG9iai0kKENPTkZJR19DUFVfVlI0MVhYKQkrPSBkdW1wX3RsYi5vCitvYmotJChDT05GSUdfQ1BVX0NBVklVTV9PQ1RFT04pCSs9IGR1bXBfdGxiLm8KIAogIyBsaWJnY2Mtc3R5bGUgc3R1ZmYgbmVlZGVkIGluIHRoZSBrZXJuZWwKIG9iai15ICs9IGFzaGxkaTMubyBhc2hyZGkzLm8gY21wZGkyLm8gbHNocmRpMy5vIHVjbXBkaTIubwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL21tL01ha2VmaWxlIGIvYXJjaC9taXBzL21tL01ha2VmaWxlCmluZGV4IDk1YmEzMmIuLmQ3ZWM5NTUgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9tbS9NYWtlZmlsZQorKysgYi9hcmNoL21pcHMvbW0vTWFrZWZpbGUKQEAgLTI3LDYgKzI3LDcgQEAKIG9iai0kKENPTkZJR19DUFVfVFgzOVhYKQkrPSBjLXR4MzkubyB0bGItcjNrLm8KIG9iai0kKENPTkZJR19DUFVfVFg0OVhYKQkrPSBjLXI0ay5vIGNleC1nZW4ubyB0bGItcjRrLm8KIG9iai0kKENPTkZJR19DUFVfVlI0MVhYKQkrPSBjLXI0ay5vIGNleC1nZW4ubyB0bGItcjRrLm8KK29iai0kKENPTkZJR19DUFVfQ0FWSVVNX09DVEVPTikJKz0gYy1vY3Rlb24ubyBjZXgtb2N0Lm8gdGxiLXI0ay5vCiAKIG9iai0kKENPTkZJR19JUDIyX0NQVV9TQ0FDSEUpCSs9IHNjLWlwMjIubwogb2JqLSQoQ09ORklHX1I1MDAwX0NQVV9TQ0FDSEUpICArPSBzYy1yNWsubwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL21tL2Mtb2N0ZW9uLmMgYi9hcmNoL21pcHMvbW0vYy1vY3Rlb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NGQwMWEwCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9taXBzL21tL2Mtb2N0ZW9uLmMKQEAgLTAsMCArMSwzMDcgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUtMjAwNyBDYXZpdW0gTmV0d29ya3MKKyAqLworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8bGludXgvY3B1Lmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKworI2luY2x1ZGUgPGFzbS9iY2FjaGUuaD4KKyNpbmNsdWRlIDxhc20vYm9vdGluZm8uaD4KKyNpbmNsdWRlIDxhc20vY2FjaGVvcHMuaD4KKyNpbmNsdWRlIDxhc20vY3B1LWZlYXR1cmVzLmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorI2luY2x1ZGUgPGFzbS9yNGtjYWNoZS5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vbW11X2NvbnRleHQuaD4KKyNpbmNsdWRlIDxhc20vd2FyLmg+CisKKyNpbmNsdWRlIDxhc20vb2N0ZW9uL29jdGVvbi5oPgorCit1bnNpZ25lZCBsb25nIGxvbmcgY2FjaGVfZXJyX2RjYWNoZVtOUl9DUFVTXTsKKworLyoqCisgKiBPY3Rlb24gYXV0b21hdGljYWxseSBmbHVzaGVzIHRoZSBkY2FjaGUgb24gdGxiIGNoYW5nZXMsIHNvCisgKiBmcm9tIExpbnV4J3Mgdmlld3BvaW50IGl0IGFjdHMgbXVjaCBsaWtlIGEgcGh5c2ljYWxseQorICogdGFnZ2VkIGNhY2hlLiBObyBmbHVzaGluZyBpcyBuZWVkZWQKKyAqCisgKi8KK3N0YXRpYyB2b2lkIG9jdGVvbl9mbHVzaF9kYXRhX2NhY2hlX3BhZ2UodW5zaWduZWQgbG9uZyBhZGRyKQoreworICAgIC8qIE5vdGhpbmcgdG8gZG8gKi8KK30KKworc3RhdGljIGlubGluZSB2b2lkIG9jdGVvbl9sb2NhbF9mbHVzaF9pY2FjaGUodm9pZCkKK3sKKwlhc20gdm9sYXRpbGUgKCJzeW5jaSAwKCQwKSIpOworfQorCisvKgorICogRmx1c2ggbG9jYWwgSS1jYWNoZSBmb3IgdGhlIHNwZWNpZmllZCByYW5nZS4KKyAqLworc3RhdGljIHZvaWQgbG9jYWxfb2N0ZW9uX2ZsdXNoX2ljYWNoZV9yYW5nZSh1bnNpZ25lZCBsb25nIHN0YXJ0LAorCQkJCQkgICAgdW5zaWduZWQgbG9uZyBlbmQpCit7CisJb2N0ZW9uX2xvY2FsX2ZsdXNoX2ljYWNoZSgpOworfQorCisvKioKKyAqIEZsdXNoIGNhY2hlcyBhcyBuZWNlc3NhcnkgZm9yIGFsbCBjb3JlcyBhZmZlY3RlZCBieSBhCisgKiB2bWEuIElmIG5vIHZtYSBpcyBzdXBwbGllZCwgYWxsIGNvcmVzIGFyZSBmbHVzaGVkLgorICoKKyAqIEB2bWE6ICAgIFZNQSB0byBmbHVzaCBvciBOVUxMIHRvIGZsdXNoIGFsbCBpY2FjaGVzLgorICovCitzdGF0aWMgdm9pZCBvY3Rlb25fZmx1c2hfaWNhY2hlX2FsbF9jb3JlcyhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3sKKwlleHRlcm4gdm9pZCBvY3Rlb25fc2VuZF9pcGlfc2luZ2xlKGludCBjcHUsIHVuc2lnbmVkIGludCBhY3Rpb24pOworI2lmZGVmIENPTkZJR19TTVAKKwlpbnQgY3B1OworCWNwdW1hc2tfdCBtYXNrOworI2VuZGlmCisKKwltYigpOworCW9jdGVvbl9sb2NhbF9mbHVzaF9pY2FjaGUoKTsKKyNpZmRlZiBDT05GSUdfU01QCisJcHJlZW1wdF9kaXNhYmxlKCk7CisJY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOworCisJLyoKKwkgKiBJZiB3ZSBoYXZlIGEgdm1hIHN0cnVjdHVyZSwgd2Ugb25seSBuZWVkIHRvIHdvcnJ5IGFib3V0CisJICogY29yZXMgaXQgaGFzIGJlZW4gdXNlZCBvbgorCSAqLworCWlmICh2bWEpCisJCW1hc2sgPSB2bWEtPnZtX21tLT5jcHVfdm1fbWFzazsKKwllbHNlCisJCW1hc2sgPSBjcHVfb25saW5lX21hcDsKKwljcHVfY2xlYXIoY3B1LCBtYXNrKTsKKwlmb3JfZWFjaF9jcHVfbWFzayhjcHUsIG1hc2spCisJCW9jdGVvbl9zZW5kX2lwaV9zaW5nbGUoY3B1LCBTTVBfSUNBQ0hFX0ZMVVNIKTsKKworCXByZWVtcHRfZW5hYmxlKCk7CisjZW5kaWYKK30KKworCisvKioKKyAqIENhbGxlZCB0byBmbHVzaCB0aGUgaWNhY2hlIG9uIGFsbCBjb3JlcworICovCitzdGF0aWMgdm9pZCBvY3Rlb25fZmx1c2hfaWNhY2hlX2FsbCh2b2lkKQoreworCW9jdGVvbl9mbHVzaF9pY2FjaGVfYWxsX2NvcmVzKE5VTEwpOworfQorCisKKy8qKgorICogQ2FsbGVkIHRvIGZsdXNoIGFsbCBtZW1vcnkgYXNzb2NpYXRlZCB3aXRoIGEgbWVtb3J5CisgKiBjb250ZXh0LgorICoKKyAqIEBtbTogICAgIE1lbW9yeSBjb250ZXh0IHRvIGZsdXNoCisgKi8KK3N0YXRpYyB2b2lkIG9jdGVvbl9mbHVzaF9jYWNoZV9tbShzdHJ1Y3QgbW1fc3RydWN0ICptbSkKK3sKKwkvKgorCSAqIEFjY29yZGluZyB0byB0aGUgUjRLIHZlcnNpb24gb2YgdGhpcyBmaWxlLCBDUFVzIHdpdGhvdXQKKwkgKiBkY2FjaGUgYWxpYXNlcyBkb24ndCBuZWVkIHRvIGRvIGFueXRoaW5nIGhlcmUKKwkgKi8KK30KKworCisvKioKKyAqIEZsdXNoIGEgcmFuZ2Ugb2Yga2VybmVsIGFkZHJlc3NlcyBvdXQgb2YgdGhlIGljYWNoZQorICoKKyAqLworc3RhdGljIHZvaWQgb2N0ZW9uX2ZsdXNoX2ljYWNoZV9yYW5nZSh1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCkKK3sKKwlvY3Rlb25fZmx1c2hfaWNhY2hlX2FsbF9jb3JlcyhOVUxMKTsKK30KKworCisvKioKKyAqIEZsdXNoIHRoZSBpY2FjaGUgZm9yIGEgdHJhbXBvbGluZS4gVGhlc2UgYXJlIHVzZWQgZm9yIGludGVycnVwdAorICogYW5kIGV4Y2VwdGlvbiBob29raW5nLgorICoKKyAqIEBhZGRyOiAgIEFkZHJlc3MgdG8gZmx1c2gKKyAqLworc3RhdGljIHZvaWQgb2N0ZW9uX2ZsdXNoX2NhY2hlX3NpZ3RyYW1wKHVuc2lnbmVkIGxvbmcgYWRkcikKK3sKKwlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYTsKKworCXZtYSA9IGZpbmRfdm1hKGN1cnJlbnQtPm1tLCBhZGRyKTsKKwlvY3Rlb25fZmx1c2hfaWNhY2hlX2FsbF9jb3Jlcyh2bWEpOworfQorCisKKy8qKgorICogRmx1c2ggYSByYW5nZSBvdXQgb2YgYSB2bWEKKyAqCisgKiBAdm1hOiAgICBWTUEgdG8gZmx1c2gKKyAqIEBzdGFydDoKKyAqIEBlbmQ6CisgKi8KK3N0YXRpYyB2b2lkIG9jdGVvbl9mbHVzaF9jYWNoZV9yYW5nZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKKwkJCQkgICAgIHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kKQoreworCWlmICh2bWEtPnZtX2ZsYWdzICYgVk1fRVhFQykKKwkJb2N0ZW9uX2ZsdXNoX2ljYWNoZV9hbGxfY29yZXModm1hKTsKK30KKworCisvKioKKyAqIEZsdXNoIGEgc3BlY2lmaWMgcGFnZSBvZiBhIHZtYQorICoKKyAqIEB2bWE6ICAgIFZNQSB0byBmbHVzaCBwYWdlIGZvcgorICogQHBhZ2U6ICAgUGFnZSB0byBmbHVzaAorICogQHBmbjoKKyAqLworc3RhdGljIHZvaWQgb2N0ZW9uX2ZsdXNoX2NhY2hlX3BhZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCisJCQkJICAgIHVuc2lnbmVkIGxvbmcgcGFnZSwgdW5zaWduZWQgbG9uZyBwZm4pCit7CisJaWYgKHZtYS0+dm1fZmxhZ3MgJiBWTV9FWEVDKQorCQlvY3Rlb25fZmx1c2hfaWNhY2hlX2FsbF9jb3Jlcyh2bWEpOworfQorCisKKy8qKgorICogUHJvYmUgT2N0ZW9uJ3MgY2FjaGVzCisgKgorICovCitzdGF0aWMgdm9pZCBfX2RldmluaXQgcHJvYmVfb2N0ZW9uKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBpY2FjaGVfc2l6ZTsKKwl1bnNpZ25lZCBsb25nIGRjYWNoZV9zaXplOworCXVuc2lnbmVkIGludCBjb25maWcxOworCXN0cnVjdCBjcHVpbmZvX21pcHMgKmMgPSAmY3VycmVudF9jcHVfZGF0YTsKKworCXN3aXRjaCAoYy0+Y3B1dHlwZSkgeworCWNhc2UgQ1BVX0NBVklVTV9PQ1RFT046CisJCWNvbmZpZzEgPSByZWFkX2MwX2NvbmZpZzEoKTsKKwkJYy0+aWNhY2hlLmxpbmVzeiA9IDIgPDwgKChjb25maWcxID4+IDE5KSAmIDcpOworCQljLT5pY2FjaGUuc2V0cyA9IDY0IDw8ICgoY29uZmlnMSA+PiAyMikgJiA3KTsKKwkJYy0+aWNhY2hlLndheXMgPSAxICsgKChjb25maWcxID4+IDE2KSAmIDcpOworCQljLT5pY2FjaGUuZmxhZ3MgfD0gTUlQU19DQUNIRV9WVEFHOworCQlpY2FjaGVfc2l6ZSA9CisJCQljLT5pY2FjaGUuc2V0cyAqIGMtPmljYWNoZS53YXlzICogYy0+aWNhY2hlLmxpbmVzejsKKwkJYy0+aWNhY2hlLndheWJpdCA9IGZmcyhpY2FjaGVfc2l6ZSAvIGMtPmljYWNoZS53YXlzKSAtIDE7CisJCWMtPmRjYWNoZS5saW5lc3ogPSAxMjg7CisJCWlmIChPQ1RFT05fSVNfTU9ERUwoT0NURU9OX0NOM1hYWCkpCisJCQljLT5kY2FjaGUuc2V0cyA9IDE7IC8qIENOM1hYWCBoYXMgb25lIERjYWNoZSBzZXQgKi8KKwkJZWxzZQorCQkJYy0+ZGNhY2hlLnNldHMgPSAyOyAvKiBDTjVYWFggaGFzIHR3byBEY2FjaGUgc2V0cyAqLworCQljLT5kY2FjaGUud2F5cyA9IDY0OworCQlkY2FjaGVfc2l6ZSA9CisJCQljLT5kY2FjaGUuc2V0cyAqIGMtPmRjYWNoZS53YXlzICogYy0+ZGNhY2hlLmxpbmVzejsKKwkJYy0+ZGNhY2hlLndheWJpdCA9IGZmcyhkY2FjaGVfc2l6ZSAvIGMtPmRjYWNoZS53YXlzKSAtIDE7CisJCWMtPm9wdGlvbnMgfD0gTUlQU19DUFVfUFJFRkVUQ0g7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcGFuaWMoIlVuc3VwcG9ydGVkIENhdml1bSBOZXR3b3JrcyBDUFUgdHlwZVxuIik7CisJCWJyZWFrOworCX0KKworCS8qIGNvbXB1dGUgYSBjb3VwbGUgb2Ygb3RoZXIgY2FjaGUgdmFyaWFibGVzICovCisJYy0+aWNhY2hlLndheXNpemUgPSBpY2FjaGVfc2l6ZSAvIGMtPmljYWNoZS53YXlzOworCWMtPmRjYWNoZS53YXlzaXplID0gZGNhY2hlX3NpemUgLyBjLT5kY2FjaGUud2F5czsKKworCWMtPmljYWNoZS5zZXRzID0gaWNhY2hlX3NpemUgLyAoYy0+aWNhY2hlLmxpbmVzeiAqIGMtPmljYWNoZS53YXlzKTsKKwljLT5kY2FjaGUuc2V0cyA9IGRjYWNoZV9zaXplIC8gKGMtPmRjYWNoZS5saW5lc3ogKiBjLT5kY2FjaGUud2F5cyk7CisKKwlpZiAoc21wX3Byb2Nlc3Nvcl9pZCgpID09IDApIHsKKwkJcHJfbm90aWNlKCJQcmltYXJ5IGluc3RydWN0aW9uIGNhY2hlICVsZGtCLCAlcywgJWQgd2F5LCAiCisJCQkgICIlZCBzZXRzLCBsaW5lc2l6ZSAlZCBieXRlcy5cbiIsCisJCQkgIGljYWNoZV9zaXplID4+IDEwLAorCQkJICBjcHVfaGFzX3Z0YWdfaWNhY2hlID8KKwkJCQkidmlydHVhbGx5IHRhZ2dlZCIgOiAicGh5c2ljYWxseSB0YWdnZWQiLAorCQkJICBjLT5pY2FjaGUud2F5cywgYy0+aWNhY2hlLnNldHMsIGMtPmljYWNoZS5saW5lc3opOworCisJCXByX25vdGljZSgiUHJpbWFyeSBkYXRhIGNhY2hlICVsZGtCLCAlZC13YXksICVkIHNldHMsICIKKwkJCSAgImxpbmVzaXplICVkIGJ5dGVzLlxuIiwKKwkJCSAgZGNhY2hlX3NpemUgPj4gMTAsIGMtPmRjYWNoZS53YXlzLAorCQkJICBjLT5kY2FjaGUuc2V0cywgYy0+ZGNhY2hlLmxpbmVzeik7CisJfQorfQorCisKKy8qKgorICogU2V0dXAgdGhlIE9jdGVvbiBjYWNoZSBmbHVzaCByb3V0aW5lcworICoKKyAqLwordm9pZCBfX2RldmluaXQgb2N0ZW9uX2NhY2hlX2luaXQodm9pZCkKK3sKKwlleHRlcm4gdW5zaWduZWQgbG9uZyBlYmFzZTsKKwlleHRlcm4gY2hhciBleGNlcHRfdmVjMl9vY3Rlb247CisKKwltZW1jcHkoKHZvaWQgKikoZWJhc2UgKyAweDEwMCksICZleGNlcHRfdmVjMl9vY3Rlb24sIDB4ODApOworCW9jdGVvbl9mbHVzaF9jYWNoZV9zaWd0cmFtcChlYmFzZSArIDB4MTAwKTsKKworCXByb2JlX29jdGVvbigpOworCisJc2htX2FsaWduX21hc2sgPSBQQUdFX1NJWkUgLSAxOworCisJZmx1c2hfY2FjaGVfYWxsCQkJPSBvY3Rlb25fZmx1c2hfaWNhY2hlX2FsbDsKKwlfX2ZsdXNoX2NhY2hlX2FsbAkJPSBvY3Rlb25fZmx1c2hfaWNhY2hlX2FsbDsKKwlmbHVzaF9jYWNoZV9tbQkJCT0gb2N0ZW9uX2ZsdXNoX2NhY2hlX21tOworCWZsdXNoX2NhY2hlX3BhZ2UJCT0gb2N0ZW9uX2ZsdXNoX2NhY2hlX3BhZ2U7CisJZmx1c2hfY2FjaGVfcmFuZ2UJCT0gb2N0ZW9uX2ZsdXNoX2NhY2hlX3JhbmdlOworCWZsdXNoX2NhY2hlX3NpZ3RyYW1wCQk9IG9jdGVvbl9mbHVzaF9jYWNoZV9zaWd0cmFtcDsKKwlmbHVzaF9pY2FjaGVfYWxsCQk9IG9jdGVvbl9mbHVzaF9pY2FjaGVfYWxsOworCWZsdXNoX2RhdGFfY2FjaGVfcGFnZQkJPSBvY3Rlb25fZmx1c2hfZGF0YV9jYWNoZV9wYWdlOworCWZsdXNoX2ljYWNoZV9yYW5nZQkJPSBvY3Rlb25fZmx1c2hfaWNhY2hlX3JhbmdlOworCWxvY2FsX2ZsdXNoX2ljYWNoZV9yYW5nZQk9IGxvY2FsX29jdGVvbl9mbHVzaF9pY2FjaGVfcmFuZ2U7CisKKwlidWlsZF9jbGVhcl9wYWdlKCk7CisJYnVpbGRfY29weV9wYWdlKCk7Cit9CisKKy8qKgorICogSGFuZGxlIGEgY2FjaGUgZXJyb3IgZXhjZXB0aW9uCisgKi8KKworc3RhdGljIHZvaWQgIGNhY2hlX3Bhcml0eV9lcnJvcl9vY3Rlb24oaW50IG5vbl9yZWNvdmVyYWJsZSkKK3sKKwl1bnNpZ25lZCBsb25nIGNvcmVpZCA9IGN2bXhfZ2V0X2NvcmVfbnVtKCk7CisJdWludDY0X3QgaWNhY2hlX2VyciA9IHJlYWRfb2N0ZW9uX2MwX2ljYWNoZWVycigpOworCisJcHJfZXJyKCJDYWNoZSBlcnJvciBleGNlcHRpb246XG4iKTsKKwlwcl9lcnIoImNwMF9lcnJvcmVwYyA9PSAlbHhcbiIsIHJlYWRfYzBfZXJyb3JlcGMoKSk7CisJaWYgKGljYWNoZV9lcnIgJiAxKSB7CisJCXByX2VycigiQ2FjaGVFcnIgKEljYWNoZSkgPT0gJWxseFxuIiwKKwkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpaWNhY2hlX2Vycik7CisJCXdyaXRlX29jdGVvbl9jMF9pY2FjaGVlcnIoMCk7CisJfQorCWlmIChjYWNoZV9lcnJfZGNhY2hlW2NvcmVpZF0gJiAxKSB7CisJCXByX2VycigiQ2FjaGVFcnIgKERjYWNoZSkgPT0gJWxseFxuIiwKKwkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpY2FjaGVfZXJyX2RjYWNoZVtjb3JlaWRdKTsKKwkJY2FjaGVfZXJyX2RjYWNoZVtjb3JlaWRdID0gMDsKKwl9CisKKwlpZiAobm9uX3JlY292ZXJhYmxlKQorCQlwYW5pYygiQ2FuJ3QgaGFuZGxlIGNhY2hlIGVycm9yOiBuZXN0ZWQgZXhjZXB0aW9uIik7Cit9CisKKy8qKgorICogQ2FsbGVkIHdoZW4gdGhlIHRoZSBleGNlcHRpb24gaXMgbm90IHJlY292ZXJhYmxlCisgKi8KKworYXNtbGlua2FnZSB2b2lkIGNhY2hlX3Bhcml0eV9lcnJvcl9vY3Rlb25fcmVjb3ZlcmFibGUodm9pZCkKK3sKKwljYWNoZV9wYXJpdHlfZXJyb3Jfb2N0ZW9uKDApOworfQorCisvKioKKyAqIENhbGxlZCB3aGVuIHRoZSB0aGUgZXhjZXB0aW9uIGlzIHJlY292ZXJhYmxlCisgKi8KKworYXNtbGlua2FnZSB2b2lkIGNhY2hlX3Bhcml0eV9lcnJvcl9vY3Rlb25fbm9uX3JlY292ZXJhYmxlKHZvaWQpCit7CisJY2FjaGVfcGFyaXR5X2Vycm9yX29jdGVvbigxKTsKK30KKwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL21tL2NhY2hlLmMgYi9hcmNoL21pcHMvbW0vY2FjaGUuYwppbmRleCAxZWI3YzcxLi45OGFkMGE4IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbW0vY2FjaGUuYworKysgYi9hcmNoL21pcHMvbW0vY2FjaGUuYwpAQCAtMTgyLDYgKzE4MiwxMiBAQAogCQl0eDM5X2NhY2hlX2luaXQoKTsKIAl9CiAKKwlpZiAoY3B1X2hhc19vY3Rlb25fY2FjaGUpIHsKKwkJZXh0ZXJuIHZvaWQgX193ZWFrIG9jdGVvbl9jYWNoZV9pbml0KHZvaWQpOworCisJCW9jdGVvbl9jYWNoZV9pbml0KCk7CisJfQorCiAJc2V0dXBfcHJvdGVjdGlvbl9tYXAoKTsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL21tL2NleC1vY3QuUyBiL2FyY2gvbWlwcy9tbS9jZXgtb2N0LlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2RiODU1MwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbWlwcy9tbS9jZXgtb2N0LlMKQEAgLTAsMCArMSw3MCBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBDYXZpdW0gTmV0d29ya3MKKyAqIENhY2hlIGVycm9yIGhhbmRsZXIKKyAqLworCisjaW5jbHVkZSA8YXNtL2FzbS5oPgorI2luY2x1ZGUgPGFzbS9yZWdkZWYuaD4KKyNpbmNsdWRlIDxhc20vbWlwc3JlZ3MuaD4KKyNpbmNsdWRlIDxhc20vc3RhY2tmcmFtZS5oPgorCisvKgorICogSGFuZGxlIGNhY2hlIGVycm9yLiBJbmRpY2F0ZSB0byB0aGUgc2Vjb25kIGxldmVsIGhhbmRsZXIgd2hldGhlcgorICogdGhlIGV4Y2VwdGlvbiBpcyByZWNvdmVyYWJsZS4KKyAqLworCUxFQUYoZXhjZXB0X3ZlYzJfb2N0ZW9uKQorCisJLnNldCAgICBwdXNoCisJLnNldAltaXBzNjRyMgorCS5zZXQJbm9yZW9yZGVyCisJLnNldAlub2F0CisKKworCS8qIGR1ZSB0byBhbiBlcnJhdGEgd2UgbmVlZCB0byByZWFkIHRoZSBDT1AwIENhY2hlRXJyIChEY2FjaGUpCisJICogYmVmb3JlIGFueSBjYWNoZS9EUkFNIGFjY2VzcwkgKi8KKworCXJkaHdyICAgazAsICQwICAgICAgICAvKiBnZXQgY29yZV9pZCAqLworCVBUUl9MQSAgazEsIGNhY2hlX2Vycl9kY2FjaGUKKwlzbGwgICAgIGswLCBrMCwgMworCVBUUl9BRERVIGsxLCBrMCwgazEgICAgLyogazEgPSAmY2FjaGVfZXJyX2RjYWNoZVtjb3JlX2lkXSAqLworCisJZG1mYzAgICBrMCwgQ1AwX0NBQ0hFRVJSLCAxCisJc2QgICAgICBrMCwgKGsxKQorCWRtdGMwICAgJDAsIENQMF9DQUNIRUVSUiwgMQorCisgICAgICAgIC8qIGNoZWNrIHdoZXRoZXIgdGhpcyBpcyBhIG5lc3RlZCBleGNlcHRpb24gKi8KKwltZmMwICAgIGsxLCBDUDBfU1RBVFVTCisJYW5kaSAgICBrMSwgazEsIFNUMF9FWEwKKwliZXF6ICAgIGsxLCAxZgorCSBub3AKKwlqCWNhY2hlX3Bhcml0eV9lcnJvcl9vY3Rlb25fbm9uX3JlY292ZXJhYmxlCisJIG5vcAorCisJLyogZXhjZXB0aW9uIGlzIHJlY292ZXJhYmxlICovCisxOglqCWhhbmRsZV9jYWNoZV9lcnIKKwkgbm9wCisKKwkuc2V0ICAgIHBvcAorCUVORChleGNlcHRfdmVjMl9vY3Rlb24pCisKKyAvKiBXZSBuZWVkIHRvIGp1bXAgdG8gaGFuZGxlX2NhY2hlX2VyciBzbyB0aGF0IHRoZSBwcmV2aW91cyBoYW5kbGVyCisgICogY2FuIGZpdCB3aXRoaW4gMHg4MCBieXRlcy4gV2UgYWxzbyBtb3ZlIGZyb20gMHhGRkZGRkZGRkFYWFhYWFhYCisgICogc3BhY2UgKHVuY2FjaGVkKSB0byB0aGUgMHhGRkZGRkZGRjhYWFhYWFhYIHNwYWNlIChjYWNoZWQpLiAgKi8KKwlMRUFGKGhhbmRsZV9jYWNoZV9lcnIpCisJLnNldCAgICBwdXNoCisgICAgICAgIC5zZXQgICAgbm9yZW9yZGVyCisgICAgICAgIC5zZXQgICAgbm9hdAorCisJU0FWRV9BTEwKKwlLTU9ERQorCWphbCAgICAgY2FjaGVfcGFyaXR5X2Vycm9yX29jdGVvbl9yZWNvdmVyYWJsZQorCW5vcAorCWogICAgICAgcmV0X2Zyb21fZXhjZXB0aW9uCisJbm9wCisKKwkuc2V0IHBvcAorCUVORChoYW5kbGVfY2FjaGVfZXJyKQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL21tL2RtYS1kZWZhdWx0LmMgYi9hcmNoL21pcHMvbW0vZG1hLWRlZmF1bHQuYwppbmRleCBlNjcwOGIzLi41NDZlNjk3IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbW0vZG1hLWRlZmF1bHQuYworKysgYi9hcmNoL21pcHMvbW0vZG1hLWRlZmF1bHQuYwpAQCAtMTExLDcgKzExMSw3IEBACiB2b2lkIGRtYV9mcmVlX25vbmNvaGVyZW50KHN0cnVjdCBkZXZpY2UgKmRldiwgc2l6ZV90IHNpemUsIHZvaWQgKnZhZGRyLAogCWRtYV9hZGRyX3QgZG1hX2hhbmRsZSkKIHsKLQlwbGF0X3VubWFwX2RtYV9tZW0oZG1hX2hhbmRsZSk7CisJcGxhdF91bm1hcF9kbWFfbWVtKGRldiwgZG1hX2hhbmRsZSk7CiAJZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZykgdmFkZHIsIGdldF9vcmRlcihzaXplKSk7CiB9CiAKQEAgLTEyMiw3ICsxMjIsNyBAQAogewogCXVuc2lnbmVkIGxvbmcgYWRkciA9ICh1bnNpZ25lZCBsb25nKSB2YWRkcjsKIAotCXBsYXRfdW5tYXBfZG1hX21lbShkbWFfaGFuZGxlKTsKKwlwbGF0X3VubWFwX2RtYV9tZW0oZGV2LCBkbWFfaGFuZGxlKTsKIAogCWlmICghcGxhdF9kZXZpY2VfaXNfY29oZXJlbnQoZGV2KSkKIAkJYWRkciA9IENBQ19BRERSKGFkZHIpOwpAQCAtMTczLDcgKzE3Myw3IEBACiAJCV9fZG1hX3N5bmMoZG1hX2FkZHJfdG9fdmlydChkbWFfYWRkciksIHNpemUsCiAJCSAgICAgICAgICAgZGlyZWN0aW9uKTsKIAotCXBsYXRfdW5tYXBfZG1hX21lbShkbWFfYWRkcik7CisJcGxhdF91bm1hcF9kbWFfbWVtKGRldiwgZG1hX2FkZHIpOwogfQogCiBFWFBPUlRfU1lNQk9MKGRtYV91bm1hcF9zaW5nbGUpOwpAQCAtMjI5LDcgKzIyOSw3IEBACiAJCWRtYV9jYWNoZV93YmFja19pbnYoYWRkciwgc2l6ZSk7CiAJfQogCi0JcGxhdF91bm1hcF9kbWFfbWVtKGRtYV9hZGRyZXNzKTsKKwlwbGF0X3VubWFwX2RtYV9tZW0oZGV2LCBkbWFfYWRkcmVzcyk7CiB9CiAKIEVYUE9SVF9TWU1CT0woZG1hX3VubWFwX3BhZ2UpOwpAQCAtMjQ5LDcgKzI0OSw3IEBACiAJCQlpZiAoYWRkcikKIAkJCQlfX2RtYV9zeW5jKGFkZHIsIHNnLT5sZW5ndGgsIGRpcmVjdGlvbik7CiAJCX0KLQkJcGxhdF91bm1hcF9kbWFfbWVtKHNnLT5kbWFfYWRkcmVzcyk7CisJCXBsYXRfdW5tYXBfZG1hX21lbShkZXYsIHNnLT5kbWFfYWRkcmVzcyk7CiAJfQogfQogCkBAIC0yNzUsNiArMjc1LDcgQEAKIHsKIAlCVUdfT04oZGlyZWN0aW9uID09IERNQV9OT05FKTsKIAorCXBsYXRfZXh0cmFfc3luY19mb3JfZGV2aWNlKGRldik7CiAJaWYgKCFwbGF0X2RldmljZV9pc19jb2hlcmVudChkZXYpKSB7CiAJCXVuc2lnbmVkIGxvbmcgYWRkcjsKIApAQCAtMzA1LDYgKzMwNiw3IEBACiB7CiAJQlVHX09OKGRpcmVjdGlvbiA9PSBETUFfTk9ORSk7CiAKKwlwbGF0X2V4dHJhX3N5bmNfZm9yX2RldmljZShkZXYpOwogCWlmICghcGxhdF9kZXZpY2VfaXNfY29oZXJlbnQoZGV2KSkgewogCQl1bnNpZ25lZCBsb25nIGFkZHI7CiAKQEAgLTM1MSwyMiArMzUzLDE0IEBACiAKIGludCBkbWFfbWFwcGluZ19lcnJvcihzdHJ1Y3QgZGV2aWNlICpkZXYsIGRtYV9hZGRyX3QgZG1hX2FkZHIpCiB7Ci0JcmV0dXJuIDA7CisJcmV0dXJuIHBsYXRfZG1hX21hcHBpbmdfZXJyb3IoZGV2LCBkbWFfYWRkcik7CiB9CiAKIEVYUE9SVF9TWU1CT0woZG1hX21hcHBpbmdfZXJyb3IpOwogCiBpbnQgZG1hX3N1cHBvcnRlZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHU2NCBtYXNrKQogewotCS8qCi0JICogd2UgZmFsbCBiYWNrIHRvIEdGUF9ETUEgd2hlbiB0aGUgbWFzayBpc24ndCBhbGwgMXMsCi0JICogc28gd2UgY2FuJ3QgZ3VhcmFudGVlIGFsbG9jYXRpb25zIHRoYXQgbXVzdCBiZQotCSAqIHdpdGhpbiBhIHRpZ2h0ZXIgcmFuZ2UgdGhhbiBHRlBfRE1BLi4KLQkgKi8KLQlpZiAobWFzayA8IERNQV9CSVRfTUFTSygyNCkpCi0JCXJldHVybiAwOwotCi0JcmV0dXJuIDE7CisJcmV0dXJuIHBsYXRfZG1hX3N1cHBvcnRlZChkZXYsIG1hc2spOwogfQogCiBFWFBPUlRfU1lNQk9MKGRtYV9zdXBwb3J0ZWQpOwpAQCAtMzgzLDYgKzM3Nyw3IEBACiB7CiAJQlVHX09OKGRpcmVjdGlvbiA9PSBETUFfTk9ORSk7CiAKKwlwbGF0X2V4dHJhX3N5bmNfZm9yX2RldmljZShkZXYpOwogCWlmICghcGxhdF9kZXZpY2VfaXNfY29oZXJlbnQoZGV2KSkKIAkJX19kbWFfc3luYygodW5zaWduZWQgbG9uZyl2YWRkciwgc2l6ZSwgZGlyZWN0aW9uKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9tbS90bGItcjRrLmMgYi9hcmNoL21pcHMvbW0vdGxiLXI0ay5jCmluZGV4IDVjZTJmYTcuLjk2MTlmNjYgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9tbS90bGItcjRrLmMKKysrIGIvYXJjaC9taXBzL21tL3RsYi1yNGsuYwpAQCAtNDc4LDcgKzQ3OCwxMCBAQAogCXByb2JlX3RsYihjb25maWcpOwogCXdyaXRlX2MwX3BhZ2VtYXNrKFBNX0RFRkFVTFRfTUFTSyk7CiAJd3JpdGVfYzBfd2lyZWQoMCk7Ci0Jd3JpdGVfYzBfZnJhbWVtYXNrKDApOworCWlmIChjdXJyZW50X2NwdV90eXBlKCkgPT0gQ1BVX1IxMDAwMCB8fAorCSAgICBjdXJyZW50X2NwdV90eXBlKCkgPT0gQ1BVX1IxMjAwMCB8fAorCSAgICBjdXJyZW50X2NwdV90eXBlKCkgPT0gQ1BVX1IxNDAwMCkKKwkJd3JpdGVfYzBfZnJhbWVtYXNrKDApOwogCXRlbXBfdGxiX2VudHJ5ID0gY3VycmVudF9jcHVfZGF0YS50bGJzaXplIC0gMTsKIAogICAgICAgICAvKiBGcm9tIHRoaXMgcG9pbnQgb24gdGhlIEFSQyBmaXJtd2FyZSBpcyBkZWFkLiAgKi8KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9tbS90bGJleC5jIGIvYXJjaC9taXBzL21tL3RsYmV4LmMKaW5kZXggOTc5Y2Y5MS4uNDI5NDIwMyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL21tL3RsYmV4LmMKKysrIGIvYXJjaC9taXBzL21tL3RsYmV4LmMKQEAgLTMxNyw2ICszMTcsNyBAQAogCWNhc2UgQ1BVX0JDTTMzMDI6CiAJY2FzZSBDUFVfQkNNNDcxMDoKIAljYXNlIENQVV9MT09OR1NPTjI6CisJY2FzZSBDUFVfQ0FWSVVNX09DVEVPTjoKIAkJaWYgKG00a2NfdGxicF93YXIoKSkKIAkJCXVhc21faV9ub3AocCk7CiAJCXRsYncocCk7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvcGNpL3BjaS1pcDI3LmMgYi9hcmNoL21pcHMvcGNpL3BjaS1pcDI3LmMKaW5kZXggZjk3YWIxNC4uZGRhNmYyMCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL3BjaS9wY2ktaXAyNy5jCisrKyBiL2FyY2gvbWlwcy9wY2kvcGNpLWlwMjcuYwpAQCAtMTQ2LDEyICsxNDYsNiBAQAogCXJldHVybiAwOwogfQogCi0vKiBNb3N0IE1JUFMgc3lzdGVtcyBoYXZlIHN0cmFpZ2h0LWZvcndhcmQgc3dpenpsaW5nIG5lZWRzLiAgKi8KLXN0YXRpYyBpbmxpbmUgdTggYnJpZGdlX3N3aXp6bGUodTggcGluLCB1OCBzbG90KQotewotCXJldHVybiAoKChwaW4gLSAxKSArIHNsb3QpICUgNCkgKyAxOwotfQotCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBwY2lfZGV2ICpicmlkZ2Vfcm9vdF9kZXYoc3RydWN0IHBjaV9kZXYgKmRldikKIHsKIAl3aGlsZSAoZGV2LT5idXMtPnBhcmVudCkgewpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3BjaS9wY2kuYyBiL2FyY2gvbWlwcy9wY2kvcGNpLmMKaW5kZXggNjJjYWU3NC4uYjBlYjllNyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL3BjaS9wY2kuYworKysgYi9hcmNoL21pcHMvcGNpL3BjaS5jCkBAIC0xNDksMjggKzE0OSw2IEBACiAJICAgICAgICJTa2lwcGluZyBQQ0kgYnVzIHNjYW4gZHVlIHRvIHJlc291cmNlIGNvbmZsaWN0XG4iKTsKIH0KIAotLyogTW9zdCBNSVBTIHN5c3RlbXMgaGF2ZSBzdHJhaWdodC1mb3J3YXJkIHN3aXp6bGluZyBuZWVkcy4gICovCi0KLXN0YXRpYyBpbmxpbmUgdTggYnJpZGdlX3N3aXp6bGUodTggcGluLCB1OCBzbG90KQotewotCXJldHVybiAoKChwaW4gLSAxKSArIHNsb3QpICUgNCkgKyAxOwotfQotCi1zdGF0aWMgdTggX19pbml0IGNvbW1vbl9zd2l6emxlKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4ICpwaW5wKQotewotCXU4IHBpbiA9ICpwaW5wOwotCi0Jd2hpbGUgKGRldi0+YnVzLT5wYXJlbnQpIHsKLQkJcGluID0gYnJpZGdlX3N3aXp6bGUocGluLCBQQ0lfU0xPVChkZXYtPmRldmZuKSk7Ci0JCS8qIE1vdmUgdXAgdGhlIGNoYWluIG9mIGJyaWRnZXMuICovCi0JCWRldiA9IGRldi0+YnVzLT5zZWxmOwotICAgICAgICB9Ci0JKnBpbnAgPSBwaW47Ci0KLQkvKiBUaGUgc2xvdCBpcyB0aGUgc2xvdCBvZiB0aGUgbGFzdCBicmlkZ2UuICovCi0JcmV0dXJuIFBDSV9TTE9UKGRldi0+ZGV2Zm4pOwotfQotCiBzdGF0aWMgaW50IF9faW5pdCBwY2liaW9zX2luaXQodm9pZCkKIHsKIAlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2U7CkBAIC0xNzksNyArMTU3LDcgQEAKIAlmb3IgKGhvc2UgPSBob3NlX2hlYWQ7IGhvc2U7IGhvc2UgPSBob3NlLT5uZXh0KQogCQlwY2liaW9zX3NjYW5idXMoaG9zZSk7CiAKLQlwY2lfZml4dXBfaXJxcyhjb21tb25fc3dpenpsZSwgcGNpYmlvc19tYXBfaXJxKTsKKwlwY2lfZml4dXBfaXJxcyhwY2lfY29tbW9uX3N3aXp6bGUsIHBjaWJpb3NfbWFwX2lycSk7CiAKIAlwY2lfaW5pdGlhbGl6ZWQgPSAxOwogCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvcG1jLXNpZXJyYS95b3NlbWl0ZS9hdG1lbF9yZWFkX2VlcHJvbS5jIGIvYXJjaC9taXBzL3BtYy1zaWVycmEveW9zZW1pdGUvYXRtZWxfcmVhZF9lZXByb20uYwppbmRleCA5Nzg2MmY0Li5jYWY1ZTlhIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvcG1jLXNpZXJyYS95b3NlbWl0ZS9hdG1lbF9yZWFkX2VlcHJvbS5jCisrKyBiL2FyY2gvbWlwcy9wbWMtc2llcnJhL3lvc2VtaXRlL2F0bWVsX3JlYWRfZWVwcm9tLmMKQEAgLTE0OCw3ICsxNDgsNyBAQAogCXNlbmRfYnl0ZShXX0hFQURFUik7CiAJcmVjdl9hY2soKTsKIAotCS8qIEVFUFJPTSB3aXRoIHNpemUgb2YgbW9yZSB0aGVuIDJLIG5lZWQgdHdvIGJ5dGUgYWRkcmVzc2luZyAqLworCS8qIEVFUFJPTSB3aXRoIHNpemUgb2YgbW9yZSB0aGFuIDJLIG5lZWQgdHdvIGJ5dGUgYWRkcmVzc2luZyAqLwogCWlmIChlZXByb21fc2l6ZSA+IDIwNDgpIHsKIAkJc2VuZF9ieXRlKDB4MDApOwogCQlyZWN2X2FjaygpOwpkaWZmIC0tZ2l0IGEvYXJjaC9tbjEwMzAwL2tlcm5lbC9lbnRyeS5TIGIvYXJjaC9tbjEwMzAwL2tlcm5lbC9lbnRyeS5TCmluZGV4IDYyZmJhOGEuLmNlZWFhYWEgMTAwNjQ0Ci0tLSBhL2FyY2gvbW4xMDMwMC9rZXJuZWwvZW50cnkuUworKysgYi9hcmNoL21uMTAzMDAva2VybmVsL2VudHJ5LlMKQEAgLTQ3OCw3ICs0NzgsNyBAQAogCS5sb25nIHN5c191c2VsaWIKIAkubG9uZyBzeXNfc3dhcG9uCiAJLmxvbmcgc3lzX3JlYm9vdAotCS5sb25nIG9sZF9yZWFkZGlyCisJLmxvbmcgc3lzX29sZF9yZWFkZGlyCiAJLmxvbmcgb2xkX21tYXAJCS8qIDkwICovCiAJLmxvbmcgc3lzX211bm1hcAogCS5sb25nIHN5c190cnVuY2F0ZQpkaWZmIC0tZ2l0IGEvYXJjaC9wYXJpc2MvTWFrZWZpbGUgYi9hcmNoL3BhcmlzYy9NYWtlZmlsZQppbmRleCA1ZGRhZDdiLi4wZDQyODI3IDEwMDY0NAotLS0gYS9hcmNoL3BhcmlzYy9NYWtlZmlsZQorKysgYi9hcmNoL3BhcmlzYy9NYWtlZmlsZQpAQCAtNzcsNyArNzcsNyBAQAogCiBkcml2ZXJzLSQoQ09ORklHX09QUk9GSUxFKQkJKz0gYXJjaC9wYXJpc2Mvb3Byb2ZpbGUvCiAKLVBBTE8gOj0gJChzaGVsbCBpZiB3aGljaCBwYWxvOyB0aGVuIDogOyBcCitQQUxPIDo9ICQoc2hlbGwgaWYgKHdoaWNoIHBhbG8gMj4mMSk7IHRoZW4gOiA7IFwKIAllbGlmIFsgLXggL3NiaW4vcGFsbyBdOyB0aGVuIGVjaG8gL3NiaW4vcGFsbzsgXAogCWZpKQogCmRpZmYgLS1naXQgYS9hcmNoL3BhcmlzYy9pbmNsdWRlL2FzbS9ieXRlb3JkZXIuaCBiL2FyY2gvcGFyaXNjL2luY2x1ZGUvYXNtL2J5dGVvcmRlci5oCmluZGV4IGRiMTQ4MzEuLjU4YWYyYzUgMTAwNjQ0Ci0tLSBhL2FyY2gvcGFyaXNjL2luY2x1ZGUvYXNtL2J5dGVvcmRlci5oCisrKyBiL2FyY2gvcGFyaXNjL2luY2x1ZGUvYXNtL2J5dGVvcmRlci5oCkBAIC0xLDgyICsxLDYgQEAKICNpZm5kZWYgX1BBUklTQ19CWVRFT1JERVJfSAogI2RlZmluZSBfUEFSSVNDX0JZVEVPUkRFUl9ICiAKLSNpbmNsdWRlIDxhc20vdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgotCi0jaWZkZWYgX19HTlVDX18KLQotc3RhdGljIF9faW5saW5lX18gX19hdHRyaWJ1dGVfY29uc3RfXyBfX3UxNiBfX19hcmNoX19zd2FiMTYoX191MTYgeCkKLXsKLQlfX2FzbV9fKCJkZXAgJTAsIDE1LCA4LCAlMFxuXHQiCQkvKiBkZXBvc2l0IDAwYWIgLT4gMGJhYiAqLwotCQkic2hkICUlcjAsICUwLCA4LCAlMCIJCS8qIHNoaWZ0IDAwMDAwMGFiIC0+IDAwYmEgKi8KLQkJOiAiPXIiICh4KQotCQk6ICIwIiAoeCkpOwotCXJldHVybiB4OwotfQotCi1zdGF0aWMgX19pbmxpbmVfXyBfX2F0dHJpYnV0ZV9jb25zdF9fIF9fdTMyIF9fX2FyY2hfX3N3YWIyNChfX3UzMiB4KQotewotCV9fYXNtX18oInNoZCAlMCwgJTAsIDgsICUwXG5cdCIJCS8qIHNoaWZ0IHhhYmN4YWJjIC0+IGN4YWIgKi8KLQkJImRlcCAlMCwgMTUsIDgsICUwXG5cdCIJCS8qIGRlcG9zaXQgY3hhYiAtPiBjYmFiICovCi0JCSJzaGQgJSVyMCwgJTAsIDgsICUwIgkJLyogc2hpZnQgMDAwMGNiYWIgLT4gMGNiYSAqLwotCQk6ICI9ciIgKHgpCi0JCTogIjAiICh4KSk7Ci0JcmV0dXJuIHg7Ci19Ci0KLXN0YXRpYyBfX2lubGluZV9fIF9fYXR0cmlidXRlX2NvbnN0X18gX191MzIgX19fYXJjaF9fc3dhYjMyKF9fdTMyIHgpCi17Ci0JdW5zaWduZWQgaW50IHRlbXA7Ci0JX19hc21fXygic2hkICUwLCAlMCwgMTYsICUxXG5cdCIJLyogc2hpZnQgYWJjZGFiY2QgLT4gY2RhYiAqLwotCQkiZGVwICUxLCAxNSwgOCwgJTFcblx0IgkJLyogZGVwb3NpdCBjZGFiIC0+IGNiYWIgKi8KLQkJInNoZCAlMCwgJTEsIDgsICUwIgkJLyogc2hpZnQgYWJjZGNiYWIgLT4gZGNiYSAqLwotCQk6ICI9ciIgKHgpLCAiPSZyIiAodGVtcCkKLQkJOiAiMCIgKHgpKTsKLQlyZXR1cm4geDsKLX0KLQotCi0jaWYgQklUU19QRVJfTE9ORyA+IDMyCi0vKgotKiogRnJvbSAiUEEtUklTQyAyLjAgQXJjaGl0ZWN0dXJlIiwgSFAgUHJvZmVzc2lvbmFsIEJvb2tzLgotKiogU2VlIEFwcGVuZGl4IEkgcGFnZSA4ICwgIkVuZGlhbiBCeXRlIFN3YXBwaW5nIi4KLSoqCi0qKiBQcmV0dHkgY29vbCBhbGdvcml0aG06ICgqID09IHplcm8nZCBiaXRzKQotKiogICAgICBQRVJNSCAgIDAxMjM0NTY3IC0+IDY3NDUyMzAxIGludG8gJTAKLSoqICAgICAgSFNITCAgICA2NzQ1MjMwMSAtPiA3KjUqMyoxKiBpbnRvICUxCi0qKiAgICAgIEhTSFIgICAgNjc0NTIzMDEgLT4gKjYqNCoyKjAgaW50byAlMAotKiogICAgICBPUiAgICAgICUwIHwgJTEgIC0+IDc2NTQzMjEwIGludG8gJTAgKGFsbCBkb25lISkKLSovCi1zdGF0aWMgX19pbmxpbmVfXyBfX2F0dHJpYnV0ZV9jb25zdF9fIF9fdTY0IF9fX2FyY2hfX3N3YWI2NChfX3U2NCB4KSB7Ci0JX191NjQgdGVtcDsKLQlfX2FzbV9fKCJwZXJtaCwzMjEwICUwLCAlMFxuXHQiCi0JCSJoc2hsICUwLCA4LCAlMVxuXHQiCi0JCSJoc2hyLHUgJTAsIDgsICUwXG5cdCIKLQkJIm9yICUxLCAlMCwgJTAiCi0JCTogIj1yIiAoeCksICI9JnIiICh0ZW1wKQotCQk6ICIwIiAoeCkpOwotCXJldHVybiB4OwotfQotI2RlZmluZSBfX2FyY2hfX3N3YWI2NCh4KSBfX19hcmNoX19zd2FiNjQoeCkKLSNkZWZpbmUgX19CWVRFT1JERVJfSEFTX1U2NF9fCi0jZWxpZiAhZGVmaW5lZChfX1NUUklDVF9BTlNJX18pCi1zdGF0aWMgX19pbmxpbmVfXyBfX2F0dHJpYnV0ZV9jb25zdF9fIF9fdTY0IF9fX2FyY2hfX3N3YWI2NChfX3U2NCB4KQotewotCV9fdTMyIHQxID0gX19fYXJjaF9fc3dhYjMyKChfX3UzMikgeCk7Ci0JX191MzIgdDIgPSBfX19hcmNoX19zd2FiMzIoKF9fdTMyKSAoeCA+PiAzMikpOwotCXJldHVybiAoKChfX3U2NCkgdDEgPDwgMzIpIHwgdDIpOwotfQotI2RlZmluZSBfX2FyY2hfX3N3YWI2NCh4KSBfX19hcmNoX19zd2FiNjQoeCkKLSNkZWZpbmUgX19CWVRFT1JERVJfSEFTX1U2NF9fCi0jZW5kaWYKLQotI2RlZmluZSBfX2FyY2hfX3N3YWIxNih4KSBfX19hcmNoX19zd2FiMTYoeCkKLSNkZWZpbmUgX19hcmNoX19zd2FiMjQoeCkgX19fYXJjaF9fc3dhYjI0KHgpCi0jZGVmaW5lIF9fYXJjaF9fc3dhYjMyKHgpIF9fX2FyY2hfX3N3YWIzMih4KQotCi0jZW5kaWYgLyogX19HTlVDX18gKi8KLQogI2luY2x1ZGUgPGxpbnV4L2J5dGVvcmRlci9iaWdfZW5kaWFuLmg+CiAKICNlbmRpZiAvKiBfUEFSSVNDX0JZVEVPUkRFUl9IICovCmRpZmYgLS1naXQgYS9hcmNoL3BhcmlzYy9pbmNsdWRlL2FzbS9jaGVja3N1bS5oIGIvYXJjaC9wYXJpc2MvaW5jbHVkZS9hc20vY2hlY2tzdW0uaAppbmRleCBlOTYzOWNjLi5jODRiMmZjIDEwMDY0NAotLS0gYS9hcmNoL3BhcmlzYy9pbmNsdWRlL2FzbS9jaGVja3N1bS5oCisrKyBiL2FyY2gvcGFyaXNjL2luY2x1ZGUvYXNtL2NoZWNrc3VtLmgKQEAgLTE4Miw3ICsxODIsNyBAQAogI2VuZGlmCiAJOiAiPXIiIChzdW0pLCAiPXIiIChzYWRkciksICI9ciIgKGRhZGRyKSwgIj1yIiAobGVuKQogCTogIjAiIChzdW0pLCAiMSIgKHNhZGRyKSwgIjIiIChkYWRkciksICIzIiAobGVuKSwgInIiIChwcm90bykKLQk6ICJyMTkiLCAicjIwIiwgInIyMSIsICJyMjIiKTsKKwk6ICJyMTkiLCAicjIwIiwgInIyMSIsICJyMjIiLCAibWVtb3J5Iik7CiAJcmV0dXJuIGNzdW1fZm9sZChzdW0pOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL3BhcmlzYy9pbmNsdWRlL2FzbS9pby5oIGIvYXJjaC9wYXJpc2MvaW5jbHVkZS9hc20vaW8uaAppbmRleCA1NWRkYjE4Li5kMzAzMWQxIDEwMDY0NAotLS0gYS9hcmNoL3BhcmlzYy9pbmNsdWRlL2FzbS9pby5oCisrKyBiL2FyY2gvcGFyaXNjL2luY2x1ZGUvYXNtL2lvLmgKQEAgLTQsMTIgKzQsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KIAotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgcGFyaXNjX3ZtZXJnZV9ib3VuZGFyeTsKLWV4dGVybiB1bnNpZ25lZCBsb25nIHBhcmlzY192bWVyZ2VfbWF4X3NpemU7Ci0KLSNkZWZpbmUgQklPX1ZNRVJHRV9CT1VOREFSWQlwYXJpc2Nfdm1lcmdlX2JvdW5kYXJ5Ci0jZGVmaW5lIEJJT19WTUVSR0VfTUFYX1NJWkUJcGFyaXNjX3ZtZXJnZV9tYXhfc2l6ZQotCiAjZGVmaW5lIHZpcnRfdG9fcGh5cyhhKSAoKHVuc2lnbmVkIGxvbmcpX19wYShhKSkKICNkZWZpbmUgcGh5c190b192aXJ0KGEpIF9fdmEoYSkKICNkZWZpbmUgdmlydF90b19idXMgdmlydF90b19waHlzCkBAIC0xODIsOSArMTc2LDkgQEAKIAogLyogcmVhZGIgY2FuIG5ldmVyIGJlIGNvbnN0LCBzbyB1c2UgX19mc3dhYiBpbnN0ZWFkIG9mIGxlKl90b19jcHUgKi8KICNkZWZpbmUgcmVhZGIoYWRkcikgX19yYXdfcmVhZGIoYWRkcikKLSNkZWZpbmUgcmVhZHcoYWRkcikgX19mc3dhYjE2KF9fcmF3X3JlYWR3KGFkZHIpKQotI2RlZmluZSByZWFkbChhZGRyKSBfX2Zzd2FiMzIoX19yYXdfcmVhZGwoYWRkcikpCi0jZGVmaW5lIHJlYWRxKGFkZHIpIF9fZnN3YWI2NChfX3Jhd19yZWFkcShhZGRyKSkKKyNkZWZpbmUgcmVhZHcoYWRkcikgbGUxNl90b19jcHUoX19yYXdfcmVhZHcoYWRkcikpCisjZGVmaW5lIHJlYWRsKGFkZHIpIGxlMzJfdG9fY3B1KF9fcmF3X3JlYWRsKGFkZHIpKQorI2RlZmluZSByZWFkcShhZGRyKSBsZTY0X3RvX2NwdShfX3Jhd19yZWFkcShhZGRyKSkKICNkZWZpbmUgd3JpdGViKGIsIGFkZHIpIF9fcmF3X3dyaXRlYihiLCBhZGRyKQogI2RlZmluZSB3cml0ZXcoYiwgYWRkcikgX19yYXdfd3JpdGV3KGNwdV90b19sZTE2KGIpLCBhZGRyKQogI2RlZmluZSB3cml0ZWwoYiwgYWRkcikgX19yYXdfd3JpdGVsKGNwdV90b19sZTMyKGIpLCBhZGRyKQpkaWZmIC0tZ2l0IGEvYXJjaC9wYXJpc2MvaW5jbHVkZS9hc20vbW11X2NvbnRleHQuaCBiL2FyY2gvcGFyaXNjL2luY2x1ZGUvYXNtL21tdV9jb250ZXh0LmgKaW5kZXggODU4NTZjNy4uMzU0YjJhYyAxMDA2NDQKLS0tIGEvYXJjaC9wYXJpc2MvaW5jbHVkZS9hc20vbW11X2NvbnRleHQuaAorKysgYi9hcmNoL3BhcmlzYy9pbmNsdWRlL2FzbS9tbXVfY29udGV4dC5oCkBAIC0zNCwxNCArMzQsMTkgQEAKIAltbS0+Y29udGV4dCA9IDA7CiB9CiAKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBfX3NwYWNlX3RvX3Byb3QobW1fY29udGV4dF90IGNvbnRleHQpCit7CisjaWYgU1BBQ0VJRF9TSElGVCA9PSAwCisJcmV0dXJuIGNvbnRleHQgPDwgMTsKKyNlbHNlCisJcmV0dXJuIGNvbnRleHQgPj4gKFNQQUNFSURfU0hJRlQgLSAxKTsKKyNlbmRpZgorfQorCiBzdGF0aWMgaW5saW5lIHZvaWQgbG9hZF9jb250ZXh0KG1tX2NvbnRleHRfdCBjb250ZXh0KQogewogCW10c3AoY29udGV4dCwgMyk7Ci0jaWYgU1BBQ0VJRF9TSElGVCA9PSAwCi0JbXRjdGwoY29udGV4dCA8PCAxLDgpOwotI2Vsc2UKLQltdGN0bChjb250ZXh0ID4+IChTUEFDRUlEX1NISUZUIC0gMSksOCk7Ci0jZW5kaWYKKwltdGN0bChfX3NwYWNlX3RvX3Byb3QoY29udGV4dCksIDgpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgc3dpdGNoX21tKHN0cnVjdCBtbV9zdHJ1Y3QgKnByZXYsIHN0cnVjdCBtbV9zdHJ1Y3QgKm5leHQsIHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKQpkaWZmIC0tZ2l0IGEvYXJjaC9wYXJpc2MvaW5jbHVkZS9hc20vcHJvY2Vzc29yLmggYi9hcmNoL3BhcmlzYy9pbmNsdWRlL2FzbS9wcm9jZXNzb3IuaAppbmRleCAzYzlkMzQ4Li45ZDY0ZGY4IDEwMDY0NAotLS0gYS9hcmNoL3BhcmlzYy9pbmNsdWRlL2FzbS9wcm9jZXNzb3IuaAorKysgYi9hcmNoL3BhcmlzYy9pbmNsdWRlL2FzbS9wcm9jZXNzb3IuaApAQCAtMTcsNiArMTcsNyBAQAogI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KICNpbmNsdWRlIDxhc20vdHlwZXMuaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL3BlcmNwdS5oPgogI2VuZGlmIC8qIF9fQVNTRU1CTFlfXyAqLwogCiAjZGVmaW5lIEtFUk5FTF9TVEFDS19TSVpFIAkoNCpQQUdFX1NJWkUpCkBAIC0xMDksOCArMTEwLDcgQEAKIH07CiAKIGV4dGVybiBzdHJ1Y3Qgc3lzdGVtX2NwdWluZm9fcGFyaXNjIGJvb3RfY3B1X2RhdGE7Ci1leHRlcm4gc3RydWN0IGNwdWluZm9fcGFyaXNjIGNwdV9kYXRhW05SX0NQVVNdOwotI2RlZmluZSBjdXJyZW50X2NwdV9kYXRhIGNwdV9kYXRhW3NtcF9wcm9jZXNzb3JfaWQoKV0KK0RFQ0xBUkVfUEVSX0NQVShzdHJ1Y3QgY3B1aW5mb19wYXJpc2MsIGNwdV9kYXRhKTsKIAogI2RlZmluZSBDUFVfSFZFUlNJT04gKChib290X2NwdV9kYXRhLmh2ZXJzaW9uID4+IDQpICYgMHgwRkZGKQogCmRpZmYgLS1naXQgYS9hcmNoL3BhcmlzYy9pbmNsdWRlL2FzbS9zd2FiLmggYi9hcmNoL3BhcmlzYy9pbmNsdWRlL2FzbS9zd2FiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2ZmMTZjNQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcGFyaXNjL2luY2x1ZGUvYXNtL3N3YWIuaApAQCAtMCwwICsxLDY2IEBACisjaWZuZGVmIF9QQVJJU0NfU1dBQl9ICisjZGVmaW5lIF9QQVJJU0NfU1dBQl9ICisKKyNpbmNsdWRlIDxhc20vdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgorCisjZGVmaW5lIF9fU1dBQl82NF9USFJVXzMyX18KKworc3RhdGljIGlubGluZSBfX2F0dHJpYnV0ZV9jb25zdF9fIF9fdTE2IF9fYXJjaF9zd2FiMTYoX191MTYgeCkKK3sKKwlfX2FzbV9fKCJkZXAgJTAsIDE1LCA4LCAlMFxuXHQiCQkvKiBkZXBvc2l0IDAwYWIgLT4gMGJhYiAqLworCQkic2hkICUlcjAsICUwLCA4LCAlMCIJCS8qIHNoaWZ0IDAwMDAwMGFiIC0+IDAwYmEgKi8KKwkJOiAiPXIiICh4KQorCQk6ICIwIiAoeCkpOworCXJldHVybiB4OworfQorI2RlZmluZSBfX2FyY2hfc3dhYjE2IF9fYXJjaF9zd2FiMTYKKworc3RhdGljIGlubGluZSBfX2F0dHJpYnV0ZV9jb25zdF9fIF9fdTMyIF9fYXJjaF9zd2FiMjQoX191MzIgeCkKK3sKKwlfX2FzbV9fKCJzaGQgJTAsICUwLCA4LCAlMFxuXHQiCQkvKiBzaGlmdCB4YWJjeGFiYyAtPiBjeGFiICovCisJCSJkZXAgJTAsIDE1LCA4LCAlMFxuXHQiCQkvKiBkZXBvc2l0IGN4YWIgLT4gY2JhYiAqLworCQkic2hkICUlcjAsICUwLCA4LCAlMCIJCS8qIHNoaWZ0IDAwMDBjYmFiIC0+IDBjYmEgKi8KKwkJOiAiPXIiICh4KQorCQk6ICIwIiAoeCkpOworCXJldHVybiB4OworfQorCitzdGF0aWMgaW5saW5lIF9fYXR0cmlidXRlX2NvbnN0X18gX191MzIgX19hcmNoX3N3YWIzMihfX3UzMiB4KQoreworCXVuc2lnbmVkIGludCB0ZW1wOworCV9fYXNtX18oInNoZCAlMCwgJTAsIDE2LCAlMVxuXHQiCS8qIHNoaWZ0IGFiY2RhYmNkIC0+IGNkYWIgKi8KKwkJImRlcCAlMSwgMTUsIDgsICUxXG5cdCIJCS8qIGRlcG9zaXQgY2RhYiAtPiBjYmFiICovCisJCSJzaGQgJTAsICUxLCA4LCAlMCIJCS8qIHNoaWZ0IGFiY2RjYmFiIC0+IGRjYmEgKi8KKwkJOiAiPXIiICh4KSwgIj0mciIgKHRlbXApCisJCTogIjAiICh4KSk7CisJcmV0dXJuIHg7Cit9CisjZGVmaW5lIF9fYXJjaF9zd2FiMzIgX19hcmNoX3N3YWIzMgorCisjaWYgQklUU19QRVJfTE9ORyA+IDMyCisvKgorKiogRnJvbSAiUEEtUklTQyAyLjAgQXJjaGl0ZWN0dXJlIiwgSFAgUHJvZmVzc2lvbmFsIEJvb2tzLgorKiogU2VlIEFwcGVuZGl4IEkgcGFnZSA4ICwgIkVuZGlhbiBCeXRlIFN3YXBwaW5nIi4KKyoqCisqKiBQcmV0dHkgY29vbCBhbGdvcml0aG06ICgqID09IHplcm8nZCBiaXRzKQorKiogICAgICBQRVJNSCAgIDAxMjM0NTY3IC0+IDY3NDUyMzAxIGludG8gJTAKKyoqICAgICAgSFNITCAgICA2NzQ1MjMwMSAtPiA3KjUqMyoxKiBpbnRvICUxCisqKiAgICAgIEhTSFIgICAgNjc0NTIzMDEgLT4gKjYqNCoyKjAgaW50byAlMAorKiogICAgICBPUiAgICAgICUwIHwgJTEgIC0+IDc2NTQzMjEwIGludG8gJTAgKGFsbCBkb25lISkKKyovCitzdGF0aWMgaW5saW5lIF9fYXR0cmlidXRlX2NvbnN0X18gX191NjQgX19hcmNoX3N3YWI2NChfX3U2NCB4KQoreworCV9fdTY0IHRlbXA7CisJX19hc21fXygicGVybWgsMzIxMCAlMCwgJTBcblx0IgorCQkiaHNobCAlMCwgOCwgJTFcblx0IgorCQkiaHNocix1ICUwLCA4LCAlMFxuXHQiCisJCSJvciAlMSwgJTAsICUwIgorCQk6ICI9ciIgKHgpLCAiPSZyIiAodGVtcCkKKwkJOiAiMCIgKHgpKTsKKwlyZXR1cm4geDsKK30KKyNkZWZpbmUgX19hcmNoX3N3YWI2NCBfX2FyY2hfc3dhYjY0CisjZW5kaWYgLyogQklUU19QRVJfTE9ORyA+IDMyICovCisKKyNlbmRpZiAvKiBfUEFSSVNDX1NXQUJfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wYXJpc2MvaW5jbHVkZS9hc20vdWFjY2Vzcy5oIGIvYXJjaC9wYXJpc2MvaW5jbHVkZS9hc20vdWFjY2Vzcy5oCmluZGV4IDQ4NzhiOTUuLjFjNmRiYjYgMTAwNjQ0Ci0tLSBhL2FyY2gvcGFyaXNjL2luY2x1ZGUvYXNtL3VhY2Nlc3MuaAorKysgYi9hcmNoL3BhcmlzYy9pbmNsdWRlL2FzbS91YWNjZXNzLmgKQEAgLTI0MSw0ICsyNDEsNiBAQAogI2RlZmluZSBfX2NvcHlfdG9fdXNlcl9pbmF0b21pYyBfX2NvcHlfdG9fdXNlcgogI2RlZmluZSBfX2NvcHlfZnJvbV91c2VyX2luYXRvbWljIF9fY29weV9mcm9tX3VzZXIKIAoraW50IGZpeHVwX2V4Y2VwdGlvbihzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CisKICNlbmRpZiAvKiBfX1BBUklTQ19VQUNDRVNTX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvcGFyaXNjL2tlcm5lbC9kcml2ZXJzLmMgYi9hcmNoL3BhcmlzYy9rZXJuZWwvZHJpdmVycy5jCmluZGV4IDg4NGI3Y2UuLjk5NGJjZDkgMTAwNjQ0Ci0tLSBhL2FyY2gvcGFyaXNjL2tlcm5lbC9kcml2ZXJzLmMKKysrIGIvYXJjaC9wYXJpc2Mva2VybmVsL2RyaXZlcnMuYwpAQCAtNTQ5LDYgKzU0OSwzOCBAQAogCXJldHVybiBtYXRjaF9kZXZpY2UodG9fcGFyaXNjX2RyaXZlcihkcnYpLCB0b19wYXJpc2NfZGV2aWNlKGRldikpOwogfQogCitzdGF0aWMgc3NpemVfdCBtYWtlX21vZGFsaWFzKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKQoreworCWNvbnN0IHN0cnVjdCBwYXJpc2NfZGV2aWNlICpwYWRldiA9IHRvX3BhcmlzY19kZXZpY2UoZGV2KTsKKwljb25zdCBzdHJ1Y3QgcGFyaXNjX2RldmljZV9pZCAqaWQgPSAmcGFkZXYtPmlkOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAicGFyaXNjOnQlMDJYaHYlMDRYcmV2JTAyWHN2JTA4WFxuIiwKKwkJKHU4KWlkLT5od190eXBlLCAodTE2KWlkLT5odmVyc2lvbiwgKHU4KWlkLT5odmVyc2lvbl9yZXYsCisJCSh1MzIpaWQtPnN2ZXJzaW9uKTsKK30KKworc3RhdGljIGludCBwYXJpc2NfdWV2ZW50KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGtvYmpfdWV2ZW50X2VudiAqZW52KQoreworCWNvbnN0IHN0cnVjdCBwYXJpc2NfZGV2aWNlICpwYWRldjsKKwljaGFyIG1vZGFsaWFzWzQwXTsKKworCWlmICghZGV2KQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXBhZGV2ID0gdG9fcGFyaXNjX2RldmljZShkZXYpOworCWlmICghcGFkZXYpCisJCXJldHVybiAtRU5PREVWOworCisJaWYgKGFkZF91ZXZlbnRfdmFyKGVudiwgIlBBUklTQ19OQU1FPSVzIiwgcGFkZXYtPm5hbWUpKQorCQlyZXR1cm4gLUVOT01FTTsKKworCW1ha2VfbW9kYWxpYXMoZGV2LCBtb2RhbGlhcyk7CisJaWYgKGFkZF91ZXZlbnRfdmFyKGVudiwgIk1PREFMSUFTPSVzIiwgbW9kYWxpYXMpKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJldHVybiAwOworfQorCiAjZGVmaW5lIHBhX2Rldl9hdHRyKG5hbWUsIGZpZWxkLCBmb3JtYXRfc3RyaW5nKQkJCQlcCiBzdGF0aWMgc3NpemVfdCBuYW1lIyNfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCQlcCiB7CQkJCQkJCQkJXApAQCAtNTY2LDEyICs1OTgsNyBAQAogCiBzdGF0aWMgc3NpemVfdCBtb2RhbGlhc19zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKLQlzdHJ1Y3QgcGFyaXNjX2RldmljZSAqcGFkZXYgPSB0b19wYXJpc2NfZGV2aWNlKGRldik7Ci0Jc3RydWN0IHBhcmlzY19kZXZpY2VfaWQgKmlkID0gJnBhZGV2LT5pZDsKLQotCXJldHVybiBzcHJpbnRmKGJ1ZiwgInBhcmlzYzp0JTAyWGh2JTA0WHJldiUwMlhzdiUwOFhcbiIsCi0JCSh1OClpZC0+aHdfdHlwZSwgKHUxNilpZC0+aHZlcnNpb24sICh1OClpZC0+aHZlcnNpb25fcmV2LAotCQkodTMyKWlkLT5zdmVyc2lvbik7CisJcmV0dXJuIG1ha2VfbW9kYWxpYXMoZGV2LCBidWYpOwogfQogCiBzdGF0aWMgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgcGFyaXNjX2RldmljZV9hdHRyc1tdID0gewpAQCAtNTg3LDYgKzYxNCw3IEBACiBzdHJ1Y3QgYnVzX3R5cGUgcGFyaXNjX2J1c190eXBlID0gewogCS5uYW1lID0gInBhcmlzYyIsCiAJLm1hdGNoID0gcGFyaXNjX2dlbmVyaWNfbWF0Y2gsCisJLnVldmVudCA9IHBhcmlzY191ZXZlbnQsCiAJLmRldl9hdHRycyA9IHBhcmlzY19kZXZpY2VfYXR0cnMsCiAJLnByb2JlID0gcGFyaXNjX2RyaXZlcl9wcm9iZSwKIAkucmVtb3ZlID0gcGFyaXNjX2RyaXZlcl9yZW1vdmUsCmRpZmYgLS1naXQgYS9hcmNoL3BhcmlzYy9rZXJuZWwvaHBtYy5TIGIvYXJjaC9wYXJpc2Mva2VybmVsL2hwbWMuUwppbmRleCAyY2JmMTNiLi41NTk1YTJmIDEwMDY0NAotLS0gYS9hcmNoL3BhcmlzYy9rZXJuZWwvaHBtYy5TCisrKyBiL2FyY2gvcGFyaXNjL2tlcm5lbC9ocG1jLlMKQEAgLTgwLDYgKzgwLDcgQEAKIAogCS5pbXBvcnQgaW50cl9zYXZlLCBjb2RlCiBFTlRSWShvc19ocG1jKQorLm9zX2hwbWM6CiAKIAkvKgogCSAqIHJlZ2lzdGVycyBtb2RpZmllZDoKQEAgLTI5NSw1ICsyOTYsMTAgQEAKIAliIC4KIAlub3AKIEVORFBST0Mob3NfaHBtYykKLUVOVFJZKG9zX2hwbWNfZW5kKQkvKiB0aGlzIGxhYmVsIHVzZWQgdG8gY29tcHV0ZSBvc19ocG1jIGNoZWNrc3VtICovCisub3NfaHBtY19lbmQ6CiAJbm9wCisuZGF0YQorLmFsaWduIDQKKwkuZXhwb3J0IG9zX2hwbWNfc2l6ZQorb3NfaHBtY19zaXplOgorCS53b3JkIC5vc19ocG1jX2VuZC0ub3NfaHBtYwpkaWZmIC0tZ2l0IGEvYXJjaC9wYXJpc2Mva2VybmVsL2lycS5jIGIvYXJjaC9wYXJpc2Mva2VybmVsL2lycS5jCmluZGV4IDRjZWE5MzUuLmFjMmM4MjIgMTAwNjQ0Ci0tLSBhL2FyY2gvcGFyaXNjL2tlcm5lbC9pcnEuYworKysgYi9hcmNoL3BhcmlzYy9rZXJuZWwvaXJxLmMKQEAgLTI5OCw3ICsyOTgsNyBAQAogCWlycV9kZXNjW2lycV0uYWZmaW5pdHkgPSBjcHVtYXNrX29mX2NwdShjcHUpOwogI2VuZGlmCiAKLQlyZXR1cm4gY3B1X2RhdGFbY3B1XS50eG5fYWRkcjsKKwlyZXR1cm4gcGVyX2NwdShjcHVfZGF0YSwgY3B1KS50eG5fYWRkcjsKIH0KIAogCkBAIC0zMDksOCArMzA5LDkgQEAKIAluZXh0X2NwdSsrOyAvKiBhc3NpZ24gdG8gIm5leHQiIENQVSB3ZSB3YW50IHRoaXMgYnVnZ2VyIG9uICovCiAKIAkvKiB2YWxpZGF0ZSBlbnRyeSAqLwotCXdoaWxlICgobmV4dF9jcHUgPCBOUl9DUFVTKSAmJiAoIWNwdV9kYXRhW25leHRfY3B1XS50eG5fYWRkciB8fCAKLQkJIWNwdV9vbmxpbmUobmV4dF9jcHUpKSkKKwl3aGlsZSAoKG5leHRfY3B1IDwgTlJfQ1BVUykgJiYKKwkJKCFwZXJfY3B1KGNwdV9kYXRhLCBuZXh0X2NwdSkudHhuX2FkZHIgfHwKKwkJICFjcHVfb25saW5lKG5leHRfY3B1KSkpCiAJCW5leHRfY3B1Kys7CiAKIAlpZiAobmV4dF9jcHUgPj0gTlJfQ1BVUykgCkBAIC0zNTksNyArMzYwLDcgQEAKIAkJcHJpbnRrKEtFUk5fREVCVUcgInJlZGlyZWN0aW5nIGlycSAlZCBmcm9tIENQVSAlZCB0byAlZFxuIiwKIAkJICAgICAgIGlycSwgc21wX3Byb2Nlc3Nvcl9pZCgpLCBjcHUpOwogCQlnc2Nfd3JpdGVsKGlycSArIENQVV9JUlFfQkFTRSwKLQkJCSAgIGNwdV9kYXRhW2NwdV0uaHBhKTsKKwkJCSAgIHBlcl9jcHUoY3B1X2RhdGEsIGNwdSkuaHBhKTsKIAkJZ290byBzZXRfb3V0OwogCX0KICNlbmRpZgpAQCAtNDIxLDUgKzQyMiw1IEBACiAKIHZvaWQgYWNrX2JhZF9pcnEodW5zaWduZWQgaW50IGlycSkKIHsKLQlwcmludGsoInVuZXhwZWN0ZWQgSVJRICVkXG4iLCBpcnEpOworCXByaW50ayhLRVJOX1dBUk5JTkcgInVuZXhwZWN0ZWQgSVJRICVkXG4iLCBpcnEpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9wYXJpc2Mva2VybmVsL3BkY19jb25zLmMgYi9hcmNoL3BhcmlzYy9rZXJuZWwvcGRjX2NvbnMuYwppbmRleCBjY2I2ODA5Li4xZmYzNjZjIDEwMDY0NAotLS0gYS9hcmNoL3BhcmlzYy9rZXJuZWwvcGRjX2NvbnMuYworKysgYi9hcmNoL3BhcmlzYy9rZXJuZWwvcGRjX2NvbnMuYwpAQCAtNTIsNyArNTIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgogI2luY2x1ZGUgPGFzbS9wZGMuaD4JCS8qIGZvciBpb2RjX2NhbGwoKSBwcm90byBhbmQgZnJpZW5kcyAqLwogCi1zdGF0aWMgc3BpbmxvY2tfdCBwZGNfY29uc29sZV9sb2NrID0gU1BJTl9MT0NLX1VOTE9DS0VEOworc3RhdGljIERFRklORV9TUElOTE9DSyhwZGNfY29uc29sZV9sb2NrKTsKIAogc3RhdGljIHZvaWQgcGRjX2NvbnNvbGVfd3JpdGUoc3RydWN0IGNvbnNvbGUgKmNvLCBjb25zdCBjaGFyICpzLCB1bnNpZ25lZCBjb3VudCkKIHsKZGlmZiAtLWdpdCBhL2FyY2gvcGFyaXNjL2tlcm5lbC9wZXJmLmMgYi9hcmNoL3BhcmlzYy9rZXJuZWwvcGVyZi5jCmluZGV4IGY2OTZmNTcuLjc1MDk5ZWYgMTAwNjQ0Ci0tLSBhL2FyY2gvcGFyaXNjL2tlcm5lbC9wZXJmLmMKKysrIGIvYXJjaC9wYXJpc2Mva2VybmVsL3BlcmYuYwpAQCAtNTQxLDkgKzU0MSw5IEBACiAJc3Bpbl9sb2NrX2luaXQoJnBlcmZfbG9jayk7CiAKIAkvKiBUT0RPOiB0aGlzIG9ubHkgbGV0cyB1cyBhY2Nlc3MgdGhlIGZpcnN0IGNwdS4uIHdoYXQgdG8gZG8gZm9yIFNNUD8gKi8KLQljcHVfZGV2aWNlID0gY3B1X2RhdGFbMF0uZGV2OworCWNwdV9kZXZpY2UgPSBwZXJfY3B1KGNwdV9kYXRhLCAwKS5kZXY7CiAJcHJpbnRrKCJQZXJmb3JtYW5jZSBtb25pdG9yaW5nIGNvdW50ZXJzIGVuYWJsZWQgZm9yICVzXG4iLAotCQljcHVfZGF0YVswXS5kZXYtPm5hbWUpOworCQlwZXJfY3B1KGNwdV9kYXRhLCAwKS5kZXYtPm5hbWUpOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3BhcmlzYy9rZXJuZWwvcHJvY2Vzc29yLmMgYi9hcmNoL3BhcmlzYy9rZXJuZWwvcHJvY2Vzc29yLmMKaW5kZXggMzcwMDg2Zi4uZWNiNjA5MyAxMDA2NDQKLS0tIGEvYXJjaC9wYXJpc2Mva2VybmVsL3Byb2Nlc3Nvci5jCisrKyBiL2FyY2gvcGFyaXNjL2tlcm5lbC9wcm9jZXNzb3IuYwpAQCAtMyw3ICszLDcgQEAKICAqICAgIEluaXRpYWwgc2V0dXAtcm91dGluZXMgZm9yIEhQIDkwMDAgYmFzZWQgaGFyZHdhcmUuCiAgKgogICogICAgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyLCAxOTk1ICBMaW51cyBUb3J2YWxkcwotICogICAgTW9kaWZpY2F0aW9ucyBmb3IgUEEtUklTQyAoQykgMTk5OSBIZWxnZSBEZWxsZXIgPGRlbGxlckBnbXguZGU+CisgKiAgICBNb2RpZmljYXRpb25zIGZvciBQQS1SSVNDIChDKSAxOTk5LTIwMDggSGVsZ2UgRGVsbGVyIDxkZWxsZXJAZ214LmRlPgogICogICAgTW9kaWZpY2F0aW9ucyBjb3B5cmlnaHQgMTk5OSBTdVNFIEdtYkggKFBoaWxpcHAgUnVtcGYpCiAgKiAgICBNb2RpZmljYXRpb25zIGNvcHlyaWdodCAyMDAwIE1hcnRpbiBLLiBQZXRlcnNlbiA8bWtwQG1rcC5uZXQ+CiAgKiAgICBNb2RpZmljYXRpb25zIGNvcHlyaWdodCAyMDAwIFBoaWxpcHAgUnVtcGYgPHBydW1wZkB0dXgub3JnPgpAQCAtNDYsNyArNDYsNyBAQAogc3RydWN0IHN5c3RlbV9jcHVpbmZvX3BhcmlzYyBib290X2NwdV9kYXRhIF9fcmVhZF9tb3N0bHk7CiBFWFBPUlRfU1lNQk9MKGJvb3RfY3B1X2RhdGEpOwogCi1zdHJ1Y3QgY3B1aW5mb19wYXJpc2MgY3B1X2RhdGFbTlJfQ1BVU10gX19yZWFkX21vc3RseTsKK0RFRklORV9QRVJfQ1BVKHN0cnVjdCBjcHVpbmZvX3BhcmlzYywgY3B1X2RhdGEpOwogCiBleHRlcm4gaW50IHVwZGF0ZV9jcjE2X2Nsb2Nrc291cmNlKHZvaWQpOwkvKiBmcm9tIHRpbWUuYyAqLwogCkBAIC02OSw2ICs2OSwyMyBAQAogKi8KIAogLyoqCisgKiBpbml0X2NwdV9wcm9maWxlciAtIGVuYWJsZS9zZXR1cCBwZXIgY3B1IHByb2ZpbGluZyBob29rcy4KKyAqIEBjcHVudW06IFRoZSBwcm9jZXNzb3IgaW5zdGFuY2UuCisgKgorICogRklYTUU6IGRvZXNuJ3QgZG8gbXVjaCB5ZXQuLi4KKyAqLworc3RhdGljIHZvaWQgX19jcHVpbml0Citpbml0X3BlcmNwdV9wcm9mKHVuc2lnbmVkIGxvbmcgY3B1bnVtKQoreworCXN0cnVjdCBjcHVpbmZvX3BhcmlzYyAqcDsKKworCXAgPSAmcGVyX2NwdShjcHVfZGF0YSwgY3B1bnVtKTsKKwlwLT5wcm9mX2NvdW50ZXIgPSAxOworCXAtPnByb2ZfbXVsdGlwbGllciA9IDE7Cit9CisKKworLyoqCiAgKiBwcm9jZXNzb3JfcHJvYmUgLSBEZXRlcm1pbmUgaWYgcHJvY2Vzc29yIGRyaXZlciBzaG91bGQgY2xhaW0gdGhpcyBkZXZpY2UuCiAgKiBAZGV2OiBUaGUgZGV2aWNlIHdoaWNoIGhhcyBiZWVuIGZvdW5kLgogICoKQEAgLTE0Nyw3ICsxNjQsNyBAQAogCX0KICNlbmRpZgogCi0JcCA9ICZjcHVfZGF0YVtjcHVpZF07CisJcCA9ICZwZXJfY3B1KGNwdV9kYXRhLCBjcHVpZCk7CiAJYm9vdF9jcHVfZGF0YS5jcHVfY291bnQrKzsKIAogCS8qIGluaXRpYWxpemUgY291bnRlcnMgLSBDUFUgMCBnZXRzIGl0X3ZhbHVlIHNldCBpbiB0aW1lX2luaXQoKSAqLwpAQCAtMTYyLDEyICsxNzksOSBAQAogI2lmZGVmIENPTkZJR19TTVAKIAkvKgogCSoqIEZJWE1FOiByZXZpZXcgaWYgYW55IG90aGVyIGluaXRpYWxpemF0aW9uIGlzIGNsb2JiZXJlZAotCSoqCWZvciBib290X2NwdSBieSB0aGUgYWJvdmUgbWVtc2V0KCkuCisJKioJICBmb3IgYm9vdF9jcHUgYnkgdGhlIGFib3ZlIG1lbXNldCgpLgogCSovCi0KLQkvKiBzdG9sZW4gZnJvbSBpbml0X3BlcmNwdV9wcm9mKCkgKi8KLQljcHVfZGF0YVtjcHVpZF0ucHJvZl9jb3VudGVyID0gMTsKLQljcHVfZGF0YVtjcHVpZF0ucHJvZl9tdWx0aXBsaWVyID0gMTsKKwlpbml0X3BlcmNwdV9wcm9mKGNwdWlkKTsKICNlbmRpZgogCiAJLyoKQEAgLTI2MSwxOSArMjc1LDYgQEAKIH0KIAogCi0vKioKLSAqIGluaXRfY3B1X3Byb2ZpbGVyIC0gZW5hYmxlL3NldHVwIHBlciBjcHUgcHJvZmlsaW5nIGhvb2tzLgotICogQGNwdW51bTogVGhlIHByb2Nlc3NvciBpbnN0YW5jZS4KLSAqCi0gKiBGSVhNRTogZG9lc24ndCBkbyBtdWNoIHlldC4uLgotICovCi1zdGF0aWMgaW5saW5lIHZvaWQgX19pbml0Ci1pbml0X3BlcmNwdV9wcm9mKGludCBjcHVudW0pCi17Ci0JY3B1X2RhdGFbY3B1bnVtXS5wcm9mX2NvdW50ZXIgPSAxOwotCWNwdV9kYXRhW2NwdW51bV0ucHJvZl9tdWx0aXBsaWVyID0gMTsKLX0KLQogCiAvKioKICAqIGluaXRfcGVyX2NwdSAtIEhhbmRsZSBpbmRpdmlkdWFsIHByb2Nlc3NvciBpbml0aWFsaXphdGlvbnMuCkBAIC0yOTMsNyArMjk0LDcgQEAKICAqCiAgKiBvIEVuYWJsZSBDUFUgcHJvZmlsaW5nIGhvb2tzLgogICovCi1pbnQgX19pbml0IGluaXRfcGVyX2NwdShpbnQgY3B1bnVtKQoraW50IF9fY3B1aW5pdCBpbml0X3Blcl9jcHUoaW50IGNwdW51bSkKIHsKIAlpbnQgcmV0OwogCXN0cnVjdCBwZGNfY29wcm9jX2NmZyBjb3Byb2NfY2ZnOwpAQCAtMzA3LDggKzMwOCw4IEBACiAJCS8qIEZXSVcsIEZQIHJldi9tb2RlbCBpcyBhIG1vcmUgYWNjdXJhdGUgd2F5IHRvIGRldGVybWluZQogCQkqKiBDUFUgdHlwZS4gQ1BVIHJldi9tb2RlbCBoYXMgc29tZSBhbWJpZ3VvdXMgY2FzZXMuCiAJCSovCi0JCWNwdV9kYXRhW2NwdW51bV0uZnBfcmV2ID0gY29wcm9jX2NmZy5yZXZpc2lvbjsKLQkJY3B1X2RhdGFbY3B1bnVtXS5mcF9tb2RlbCA9IGNvcHJvY19jZmcubW9kZWw7CisJCXBlcl9jcHUoY3B1X2RhdGEsIGNwdW51bSkuZnBfcmV2ID0gY29wcm9jX2NmZy5yZXZpc2lvbjsKKwkJcGVyX2NwdShjcHVfZGF0YSwgY3B1bnVtKS5mcF9tb2RlbCA9IGNvcHJvY19jZmcubW9kZWw7CiAKIAkJcHJpbnRrKEtFUk5fSU5GTyAgIkZQWyVkXSBlbmFibGVkOiBSZXYgJWxkIE1vZGVsICVsZFxuIiwKIAkJCWNwdW51bSwgY29wcm9jX2NmZy5yZXZpc2lvbiwgY29wcm9jX2NmZy5tb2RlbCk7CkBAIC0zNDQsMTYgKzM0NSwxNyBAQAogaW50CiBzaG93X2NwdWluZm8gKHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdikKIHsKLQlpbnQJbjsKKwl1bnNpZ25lZCBsb25nIGNwdTsKIAotCWZvcihuPTA7IG48Ym9vdF9jcHVfZGF0YS5jcHVfY291bnQ7IG4rKykgeworCWZvcl9lYWNoX29ubGluZV9jcHUoY3B1KSB7CisJCWNvbnN0IHN0cnVjdCBjcHVpbmZvX3BhcmlzYyAqY3B1aW5mbyA9ICZwZXJfY3B1KGNwdV9kYXRhLCBjcHUpOwogI2lmZGVmIENPTkZJR19TTVAKLQkJaWYgKDAgPT0gY3B1X2RhdGFbbl0uaHBhKQorCQlpZiAoMCA9PSBjcHVpbmZvLT5ocGEpCiAJCQljb250aW51ZTsKICNlbmRpZgotCQlzZXFfcHJpbnRmKG0sICJwcm9jZXNzb3JcdDogJWRcbiIKKwkJc2VxX3ByaW50ZihtLCAicHJvY2Vzc29yXHQ6ICVsdVxuIgogCQkJCSJjcHUgZmFtaWx5XHQ6IFBBLVJJU0MgJXNcbiIsCi0JCQkJIG4sIGJvb3RfY3B1X2RhdGEuZmFtaWx5X25hbWUpOworCQkJCSBjcHUsIGJvb3RfY3B1X2RhdGEuZmFtaWx5X25hbWUpOwogCiAJCXNlcV9wcmludGYobSwgImNwdVx0XHQ6ICVzXG4iLCAgYm9vdF9jcHVfZGF0YS5jcHVfbmFtZSApOwogCkBAIC0zNjUsOCArMzY3LDggQEAKIAkJc2VxX3ByaW50ZihtLCAibW9kZWxcdFx0OiAlc1xuIgogCQkJCSJtb2RlbCBuYW1lXHQ6ICVzXG4iLAogCQkJCSBib290X2NwdV9kYXRhLnBkYy5zeXNfbW9kZWxfbmFtZSwKLQkJCQkgY3B1X2RhdGFbbl0uZGV2ID8gCi0JCQkJIGNwdV9kYXRhW25dLmRldi0+bmFtZSA6ICJVbmtub3duIiApOworCQkJCSBjcHVpbmZvLT5kZXYgPworCQkJCSBjcHVpbmZvLT5kZXYtPm5hbWUgOiAiVW5rbm93biIpOwogCiAJCXNlcV9wcmludGYobSwgImh2ZXJzaW9uXHQ6IDB4JTA4eFxuIgogCQkJICAgICAgICAic3ZlcnNpb25cdDogMHglMDh4XG4iLApAQCAtMzc3LDggKzM3OSw4IEBACiAJCXNob3dfY2FjaGVfaW5mbyhtKTsKIAogCQlzZXFfcHJpbnRmKG0sICJib2dvbWlwc1x0OiAlbHUuJTAybHVcbiIsCi0JCQkgICAgIGNwdV9kYXRhW25dLmxvb3BzX3Blcl9qaWZmeSAvICg1MDAwMDAgLyBIWiksCi0JCQkgICAgIChjcHVfZGF0YVtuXS5sb29wc19wZXJfamlmZnkgLyAoNTAwMCAvIEhaKSkgJSAxMDApOworCQkJICAgICBjcHVpbmZvLT5sb29wc19wZXJfamlmZnkgLyAoNTAwMDAwIC8gSFopLAorCQkJICAgICAoY3B1aW5mby0+bG9vcHNfcGVyX2ppZmZ5IC8gKDUwMDAgLyBIWikpICUgMTAwKTsKIAogCQlzZXFfcHJpbnRmKG0sICJzb2Z0d2FyZSBpZFx0OiAlbGRcblxuIiwKIAkJCQlib290X2NwdV9kYXRhLnBkYy5tb2RlbC5zd19pZCk7CmRpZmYgLS1naXQgYS9hcmNoL3BhcmlzYy9rZXJuZWwvc2V0dXAuYyBiL2FyY2gvcGFyaXNjL2tlcm5lbC9zZXR1cC5jCmluZGV4IDdkMjc4NTMuLjgyMTMxY2EgMTAwNjQ0Ci0tLSBhL2FyY2gvcGFyaXNjL2tlcm5lbC9zZXR1cC5jCisrKyBiL2FyY2gvcGFyaXNjL2tlcm5lbC9zZXR1cC5jCkBAIC01OCwxMSArNTgsNiBAQAogRVhQT1JUX1NZTUJPTChwYXJpc2NfYnVzX2lzX3BoeXMpOwogI2VuZGlmCiAKLS8qIFRoaXMgc2V0cyB0aGUgdm1lcmdlIGJvdW5kYXJ5IGFuZCBzaXplLCBpdCdzIGhlcmUgYmVjYXVzZSBpdCBoYXMgdG8KLSAqIGJlIGF2YWlsYWJsZSBvbiBhbGwgcGxhdGZvcm1zICh6ZXJvIG1lYW5zIG5vLXZpcnR1YWwgbWVyZ2luZykgKi8KLXVuc2lnbmVkIGxvbmcgcGFyaXNjX3ZtZXJnZV9ib3VuZGFyeSA9IDA7Ci11bnNpZ25lZCBsb25nIHBhcmlzY192bWVyZ2VfbWF4X3NpemUgPSAwOwotCiB2b2lkIF9faW5pdCBzZXR1cF9jbWRsaW5lKGNoYXIgKipjbWRsaW5lX3ApCiB7CiAJZXh0ZXJuIHVuc2lnbmVkIGludCBib290X2FyZ3NbXTsKQEAgLTMyMSw3ICszMTYsNyBAQAogCQogCXByb2Nlc3Nvcl9pbml0KCk7CiAJcHJpbnRrKEtFUk5fSU5GTyAiQ1BVKHMpOiAlZCB4ICVzIGF0ICVkLiUwNmQgTUh6XG4iLAotCQkJYm9vdF9jcHVfZGF0YS5jcHVfY291bnQsCisJCQludW1fcHJlc2VudF9jcHVzKCksCiAJCQlib290X2NwdV9kYXRhLmNwdV9uYW1lLAogCQkJYm9vdF9jcHVfZGF0YS5jcHVfaHogLyAxMDAwMDAwLAogCQkJYm9vdF9jcHVfZGF0YS5jcHVfaHogJSAxMDAwMDAwCSk7CkBAIC0zODcsOCArMzgyLDggQEAKIAlpZiAocmV0ID49IDAgJiYgY29wcm9jX2NmZy5jY3JfZnVuY3Rpb25hbCkgewogCQltdGN0bChjb3Byb2NfY2ZnLmNjcl9mdW5jdGlvbmFsLCAxMCk7CiAKLQkJY3B1X2RhdGFbY3B1bnVtXS5mcF9yZXYgPSBjb3Byb2NfY2ZnLnJldmlzaW9uOwotCQljcHVfZGF0YVtjcHVudW1dLmZwX21vZGVsID0gY29wcm9jX2NmZy5tb2RlbDsKKwkJcGVyX2NwdShjcHVfZGF0YSwgY3B1bnVtKS5mcF9yZXYgPSBjb3Byb2NfY2ZnLnJldmlzaW9uOworCQlwZXJfY3B1KGNwdV9kYXRhLCBjcHVudW0pLmZwX21vZGVsID0gY29wcm9jX2NmZy5tb2RlbDsKIAogCQlhc20gdm9sYXRpbGUgKCJmc3RkCSVmcjAsOCglc3ApIik7CiAJfSBlbHNlIHsKZGlmZiAtLWdpdCBhL2FyY2gvcGFyaXNjL2tlcm5lbC9zbXAuYyBiL2FyY2gvcGFyaXNjL2tlcm5lbC9zbXAuYwppbmRleCA4MGJjMDAwLi45OTk1ZDdlIDEwMDY0NAotLS0gYS9hcmNoL3BhcmlzYy9rZXJuZWwvc21wLmMKKysrIGIvYXJjaC9wYXJpc2Mva2VybmVsL3NtcC5jCkBAIC01NiwxNiArNTYsMTcgQEAKIAkJaWYgKGx2bCA+PSBzbXBfZGVidWdfbHZsKQlcCiAJCQlwcmludGsocHJpbnRhcmdzKTsKICNlbHNlCi0jZGVmaW5lIHNtcF9kZWJ1ZyhsdmwsIC4uLikKKyNkZWZpbmUgc21wX2RlYnVnKGx2bCwgLi4uKQlkbyB7IH0gd2hpbGUoMCkKICNlbmRpZiAvKiBERUJVR19TTVAgKi8KIAogREVGSU5FX1NQSU5MT0NLKHNtcF9sb2NrKTsKIAogdm9sYXRpbGUgc3RydWN0IHRhc2tfc3RydWN0ICpzbXBfaW5pdF9jdXJyZW50X2lkbGVfdGFzazsKIAotc3RhdGljIHZvbGF0aWxlIGludCBjcHVfbm93X2Jvb3RpbmcgX19yZWFkX21vc3RseSA9IDA7CS8qIHRyYWNrIHdoaWNoIENQVSBpcyBib290aW5nICovCisvKiB0cmFjayB3aGljaCBDUFUgaXMgYm9vdGluZyAqLworc3RhdGljIHZvbGF0aWxlIGludCBjcHVfbm93X2Jvb3RpbmcgX19jcHVpbml0ZGF0YTsKIAotc3RhdGljIGludCBwYXJpc2NfbWF4X2NwdXMgX19yZWFkX21vc3RseSA9IDE7CitzdGF0aWMgaW50IHBhcmlzY19tYXhfY3B1cyBfX2NwdWluaXRkYXRhID0gMTsKIAogREVGSU5FX1BFUl9DUFUoc3BpbmxvY2tfdCwgaXBpX2xvY2spID0gU1BJTl9MT0NLX1VOTE9DS0VEOwogCkBAIC0xMjMsNyArMTI0LDcgQEAKIGlwaV9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkKSAKIHsKIAlpbnQgdGhpc19jcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7Ci0Jc3RydWN0IGNwdWluZm9fcGFyaXNjICpwID0gJmNwdV9kYXRhW3RoaXNfY3B1XTsKKwlzdHJ1Y3QgY3B1aW5mb19wYXJpc2MgKnAgPSAmcGVyX2NwdShjcHVfZGF0YSwgdGhpc19jcHUpOwogCXVuc2lnbmVkIGxvbmcgb3BzOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKQEAgLTIwMiwxMyArMjAzLDEzIEBACiBzdGF0aWMgaW5saW5lIHZvaWQKIGlwaV9zZW5kKGludCBjcHUsIGVudW0gaXBpX21lc3NhZ2VfdHlwZSBvcCkKIHsKLQlzdHJ1Y3QgY3B1aW5mb19wYXJpc2MgKnAgPSAmY3B1X2RhdGFbY3B1XTsKKwlzdHJ1Y3QgY3B1aW5mb19wYXJpc2MgKnAgPSAmcGVyX2NwdShjcHVfZGF0YSwgY3B1KTsKIAlzcGlubG9ja190ICpsb2NrID0gJnBlcl9jcHUoaXBpX2xvY2ssIGNwdSk7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCXNwaW5fbG9ja19pcnFzYXZlKGxvY2ssIGZsYWdzKTsKIAlwLT5wZW5kaW5nX2lwaSB8PSAxIDw8IG9wOwotCWdzY193cml0ZWwoSVBJX0lSUSAtIENQVV9JUlFfQkFTRSwgY3B1X2RhdGFbY3B1XS5ocGEpOworCWdzY193cml0ZWwoSVBJX0lSUSAtIENQVV9JUlFfQkFTRSwgcC0+aHBhKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKGxvY2ssIGZsYWdzKTsKIH0KIApAQCAtMjI0LDEwICsyMjUsNyBAQAogc3RhdGljIGlubGluZSB2b2lkCiBzZW5kX0lQSV9zaW5nbGUoaW50IGRlc3RfY3B1LCBlbnVtIGlwaV9tZXNzYWdlX3R5cGUgb3ApCiB7Ci0JaWYgKGRlc3RfY3B1ID09IE5PX1BST0NfSUQpIHsKLQkJQlVHKCk7Ci0JCXJldHVybjsKLQl9CisJQlVHX09OKGRlc3RfY3B1ID09IE5PX1BST0NfSUQpOwogCiAJaXBpX3NlbmQoZGVzdF9jcHUsIG9wKTsKIH0KQEAgLTMwOSw4ICszMDcsNyBAQAogCS8qIEluaXRpYWxpc2UgdGhlIGlkbGUgdGFzayBmb3IgdGhpcyBDUFUgKi8KIAlhdG9taWNfaW5jKCZpbml0X21tLm1tX2NvdW50KTsKIAljdXJyZW50LT5hY3RpdmVfbW0gPSAmaW5pdF9tbTsKLQlpZihjdXJyZW50LT5tbSkKLQkJQlVHKCk7CisJQlVHX09OKGN1cnJlbnQtPm1tKTsKIAllbnRlcl9sYXp5X3RsYigmaW5pdF9tbSwgY3VycmVudCk7CiAKIAlpbml0X0lSUSgpOyAgIC8qIG1ha2Ugc3VyZSBubyBJUlFzIGFyZSBlbmFibGVkIG9yIHBlbmRpbmcgKi8KQEAgLTM0NSw2ICszNDIsNyBAQAogICovCiBpbnQgX19jcHVpbml0IHNtcF9ib290X29uZV9jcHUoaW50IGNwdWlkKQogeworCWNvbnN0IHN0cnVjdCBjcHVpbmZvX3BhcmlzYyAqcCA9ICZwZXJfY3B1KGNwdV9kYXRhLCBjcHVpZCk7CiAJc3RydWN0IHRhc2tfc3RydWN0ICppZGxlOwogCWxvbmcgdGltZW91dDsKIApAQCAtMzc2LDcgKzM3NCw3IEBACiAJc21wX2luaXRfY3VycmVudF9pZGxlX3Rhc2sgPSBpZGxlIDsKIAltYigpOwogCi0JcHJpbnRrKCJSZWxlYXNpbmcgY3B1ICVkIG5vdywgaHBhPSVseFxuIiwgY3B1aWQsIGNwdV9kYXRhW2NwdWlkXS5ocGEpOworCXByaW50ayhLRVJOX0lORk8gIlJlbGVhc2luZyBjcHUgJWQgbm93LCBocGE9JWx4XG4iLCBjcHVpZCwgcC0+aHBhKTsKIAogCS8qCiAJKiogVGhpcyBnZXRzIFBEQyB0byByZWxlYXNlIHRoZSBDUFUgZnJvbSBhIHZlcnkgdGlnaHQgbG9vcC4KQEAgLTM4Nyw3ICszODUsNyBAQAogCSoqIEVJUnswfSkuIE1FTV9SRU5ERVogaXMgdmFsaWQgb25seSB3aGVuIGl0IGlzIG5vbnplcm8gYW5kIHRoZSAKIAkqKiBjb250ZW50cyBvZiBtZW1vcnkgYXJlIHZhbGlkLiIKIAkqLwotCWdzY193cml0ZWwoVElNRVJfSVJRIC0gQ1BVX0lSUV9CQVNFLCBjcHVfZGF0YVtjcHVpZF0uaHBhKTsKKwlnc2Nfd3JpdGVsKFRJTUVSX0lSUSAtIENQVV9JUlFfQkFTRSwgcC0+aHBhKTsKIAltYigpOwogCiAJLyogCkBAIC00MTksMTIgKzQxNywxMiBAQAogCXJldHVybiAwOwogfQogCi12b2lkIF9fZGV2aW5pdCBzbXBfcHJlcGFyZV9ib290X2NwdSh2b2lkKQordm9pZCBfX2luaXQgc21wX3ByZXBhcmVfYm9vdF9jcHUodm9pZCkKIHsKLQlpbnQgYm9vdHN0cmFwX3Byb2Nlc3Nvcj1jcHVfZGF0YVswXS5jcHVpZDsJLyogQ1BVIElEIG9mIEJTUCAqLworCWludCBib290c3RyYXBfcHJvY2Vzc29yID0gcGVyX2NwdShjcHVfZGF0YSwgMCkuY3B1aWQ7CiAKIAkvKiBTZXR1cCBCU1AgbWFwcGluZ3MgKi8KLQlwcmludGsoIlNNUDogYm9vdHN0cmFwIENQVSBJRCBpcyAlZFxuIixib290c3RyYXBfcHJvY2Vzc29yKTsKKwlwcmludGsoS0VSTl9JTkZPICJTTVA6IGJvb3RzdHJhcCBDUFUgSUQgaXMgJWRcbiIsIGJvb3RzdHJhcF9wcm9jZXNzb3IpOwogCiAJY3B1X3NldChib290c3RyYXBfcHJvY2Vzc29yLCBjcHVfb25saW5lX21hcCk7CiAJY3B1X3NldChib290c3RyYXBfcHJvY2Vzc29yLCBjcHVfcHJlc2VudF9tYXApOwpkaWZmIC0tZ2l0IGEvYXJjaC9wYXJpc2Mva2VybmVsL3RpbWUuYyBiL2FyY2gvcGFyaXNjL2tlcm5lbC90aW1lLmMKaW5kZXggNGQwOTIwMy4uOWQ0NmM0MyAxMDA2NDQKLS0tIGEvYXJjaC9wYXJpc2Mva2VybmVsL3RpbWUuYworKysgYi9hcmNoL3BhcmlzYy9rZXJuZWwvdGltZS5jCkBAIC02MCw3ICs2MCw3IEBACiAJdW5zaWduZWQgbG9uZyBjeWNsZXNfZWxhcHNlZCwgdGlja3NfZWxhcHNlZDsKIAl1bnNpZ25lZCBsb25nIGN5Y2xlc19yZW1haW5kZXI7CiAJdW5zaWduZWQgaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKLQlzdHJ1Y3QgY3B1aW5mb19wYXJpc2MgKmNwdWluZm8gPSAmY3B1X2RhdGFbY3B1XTsKKwlzdHJ1Y3QgY3B1aW5mb19wYXJpc2MgKmNwdWluZm8gPSAmcGVyX2NwdShjcHVfZGF0YSwgY3B1KTsKIAogCS8qIGdjYyBjYW4gb3B0aW1pemUgZm9yICJyZWFkLW9ubHkiIGNhc2Ugd2l0aCBhIGxvY2FsIGNsb2NrdGljayAqLwogCXVuc2lnbmVkIGxvbmcgY3B0ID0gY2xvY2t0aWNrOwpAQCAtMjEzLDcgKzIxMyw3IEBACiAKIAltdGN0bChuZXh0X3RpY2ssIDE2KTsJCS8qIGtpY2sgb2ZmIEludGVydmFsIFRpbWVyIChDUjE2KSAqLwogCi0JY3B1X2RhdGFbY3B1XS5pdF92YWx1ZSA9IG5leHRfdGljazsKKwlwZXJfY3B1KGNwdV9kYXRhLCBjcHUpLml0X3ZhbHVlID0gbmV4dF90aWNrOwogfQogCiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHJ0Y19wYXJpc2NfZGV2ID0gewpkaWZmIC0tZ2l0IGEvYXJjaC9wYXJpc2Mva2VybmVsL3RvcG9sb2d5LmMgYi9hcmNoL3BhcmlzYy9rZXJuZWwvdG9wb2xvZ3kuYwppbmRleCBkNzFjYjAxLi5mNTE1OTM4IDEwMDY0NAotLS0gYS9hcmNoL3BhcmlzYy9rZXJuZWwvdG9wb2xvZ3kuYworKysgYi9hcmNoL3BhcmlzYy9rZXJuZWwvdG9wb2xvZ3kuYwpAQCAtMjIsMTQgKzIyLDE0IEBACiAjaW5jbHVkZSA8bGludXgvY3B1Lmg+CiAjaW5jbHVkZSA8bGludXgvY2FjaGUuaD4KIAotc3RhdGljIHN0cnVjdCBjcHUgY3B1X2RldmljZXNbTlJfQ1BVU10gX19yZWFkX21vc3RseTsKK3N0YXRpYyBERUZJTkVfUEVSX0NQVShzdHJ1Y3QgY3B1LCBjcHVfZGV2aWNlcyk7CiAKIHN0YXRpYyBpbnQgX19pbml0IHRvcG9sb2d5X2luaXQodm9pZCkKIHsKIAlpbnQgbnVtOwogCiAJZm9yX2VhY2hfcHJlc2VudF9jcHUobnVtKSB7Ci0JCXJlZ2lzdGVyX2NwdSgmY3B1X2RldmljZXNbbnVtXSwgbnVtKTsKKwkJcmVnaXN0ZXJfY3B1KCZwZXJfY3B1KGNwdV9kZXZpY2VzLCBudW0pLCBudW0pOwogCX0KIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvcGFyaXNjL2tlcm5lbC90cmFwcy5jIGIvYXJjaC9wYXJpc2Mva2VybmVsL3RyYXBzLmMKaW5kZXggNGM3NzFjZC4uYmE2NThkMiAxMDA2NDQKLS0tIGEvYXJjaC9wYXJpc2Mva2VybmVsL3RyYXBzLmMKKysrIGIvYXJjaC9wYXJpc2Mva2VybmVsL3RyYXBzLmMKQEAgLTc0NSw2ICs3NDUsMTAgQEAKIAkJLyogRmFsbCBUaHJvdWdoICovCiAJY2FzZSAyNzogCiAJCS8qIERhdGEgbWVtb3J5IHByb3RlY3Rpb24gSUQgdHJhcCAqLworCQlpZiAoY29kZSA9PSAyNyAmJiAhdXNlcl9tb2RlKHJlZ3MpICYmCisJCQlmaXh1cF9leGNlcHRpb24ocmVncykpCisJCQlyZXR1cm47CisKIAkJZGllX2lmX2tlcm5lbCgiUHJvdGVjdGlvbiBpZCB0cmFwIiwgcmVncywgY29kZSk7CiAJCXNpLnNpX2NvZGUgPSBTRUdWX01BUEVSUjsKIAkJc2kuc2lfc2lnbm8gPSBTSUdTRUdWOwpAQCAtODIxLDggKzgyNSw4IEBACiAKIGludCBfX2luaXQgY2hlY2tfaXZ0KHZvaWQgKml2YSkKIHsKKwlleHRlcm4gdTMyIG9zX2hwbWNfc2l6ZTsKIAlleHRlcm4gY29uc3QgdTMyIG9zX2hwbWNbXTsKLQlleHRlcm4gY29uc3QgdTMyIG9zX2hwbWNfZW5kW107CiAKIAlpbnQgaTsKIAl1MzIgY2hlY2sgPSAwOwpAQCAtODM5LDggKzg0Myw3IEBACiAJICAgICppdmFwKysgPSAwOwogCiAJLyogQ29tcHV0ZSBDaGVja3N1bSBmb3IgSFBNQyBoYW5kbGVyICovCi0KLQlsZW5ndGggPSBvc19ocG1jX2VuZCAtIG9zX2hwbWM7CisJbGVuZ3RoID0gb3NfaHBtY19zaXplOwogCWl2YXBbN10gPSBsZW5ndGg7CiAKIAlocG1jcCA9ICh1MzIgKilvc19ocG1jOwpkaWZmIC0tZ2l0IGEvYXJjaC9wYXJpc2Mva2VybmVsL3Vud2luZC5jIGIvYXJjaC9wYXJpc2Mva2VybmVsL3Vud2luZC5jCmluZGV4IDY3NzNjNTguLjY5ZGFkNWEgMTAwNjQ0Ci0tLSBhL2FyY2gvcGFyaXNjL2tlcm5lbC91bndpbmQuYworKysgYi9hcmNoL3BhcmlzYy9rZXJuZWwvdW53aW5kLmMKQEAgLTM3Miw3ICszNzIsNyBAQAogCXN0cnVjdCBwdF9yZWdzICpyID0gJnQtPnRocmVhZC5yZWdzOwogCXN0cnVjdCBwdF9yZWdzICpyMjsKIAotCXIyID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHB0X3JlZ3MpLCBHRlBfS0VSTkVMKTsKKwlyMiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBwdF9yZWdzKSwgR0ZQX0FUT01JQyk7CiAJaWYgKCFyMikKIAkJcmV0dXJuOwogCSpyMiA9ICpyOwpkaWZmIC0tZ2l0IGEvYXJjaC9wYXJpc2MvbGliL2lvbWFwLmMgYi9hcmNoL3BhcmlzYy9saWIvaW9tYXAuYwppbmRleCA5YWJlZDA3Li41MDY5ZThiIDEwMDY0NAotLS0gYS9hcmNoL3BhcmlzYy9saWIvaW9tYXAuYworKysgYi9hcmNoL3BhcmlzYy9saWIvaW9tYXAuYwpAQCAtMjYxLDcgKzI2MSw3IEBACiAJaW9tZW1fd3JpdGUzMnIsCiB9OwogCi1jb25zdCBzdHJ1Y3QgaW9tYXBfb3BzICppb21hcF9vcHNbOF0gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGlvbWFwX29wcyAqaW9tYXBfb3BzWzhdID0gewogCVswXSA9ICZpb3BvcnRfb3BzLAogCVs3XSA9ICZpb21lbV9vcHMKIH07CmRpZmYgLS1naXQgYS9hcmNoL3BhcmlzYy9saWIvbWVtY3B5LmMgYi9hcmNoL3BhcmlzYy9saWIvbWVtY3B5LmMKaW5kZXggMmQ2ODQzMS4uYmJkYTkwOSAxMDA2NDQKLS0tIGEvYXJjaC9wYXJpc2MvbGliL21lbWNweS5jCisrKyBiL2FyY2gvcGFyaXNjL2xpYi9tZW1jcHkuYwpAQCAtMjc1LDcgKzI3NSw3IEBACiAKIAogLyogUmV0dXJucyAwIGZvciBzdWNjZXNzLCBvdGhlcndpc2UsIHJldHVybnMgbnVtYmVyIG9mIGJ5dGVzIG5vdCB0cmFuc2ZlcnJlZC4gKi8KLXVuc2lnbmVkIGxvbmcgcGFfbWVtY3B5KHZvaWQgKmRzdHAsIGNvbnN0IHZvaWQgKnNyY3AsIHVuc2lnbmVkIGxvbmcgbGVuKQorc3RhdGljIHVuc2lnbmVkIGxvbmcgcGFfbWVtY3B5KHZvaWQgKmRzdHAsIGNvbnN0IHZvaWQgKnNyY3AsIHVuc2lnbmVkIGxvbmcgbGVuKQogewogCXJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgc3JjLCBkc3QsIHQxLCB0MiwgdDM7CiAJcmVnaXN0ZXIgdW5zaWduZWQgY2hhciAqcGNzLCAqcGNkOwpkaWZmIC0tZ2l0IGEvYXJjaC9wYXJpc2MvbW0vZmF1bHQuYyBiL2FyY2gvcGFyaXNjL21tL2ZhdWx0LmMKaW5kZXggYjJlM2U5YS4uOTJjN2ZhNCAxMDA2NDQKLS0tIGEvYXJjaC9wYXJpc2MvbW0vZmF1bHQuYworKysgYi9hcmNoL3BhcmlzYy9tbS9mYXVsdC5jCkBAIC0xMzksMTMgKzEzOSw0MSBAQAogCQkJfQogI2VuZGlmCiAKK2ludCBmaXh1cF9leGNlcHRpb24oc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJY29uc3Qgc3RydWN0IGV4Y2VwdGlvbl90YWJsZV9lbnRyeSAqZml4OworCisJZml4ID0gc2VhcmNoX2V4Y2VwdGlvbl90YWJsZXMocmVncy0+aWFvcVswXSk7CisJaWYgKGZpeCkgeworCQlzdHJ1Y3QgZXhjZXB0aW9uX2RhdGEgKmQ7CisJCWQgPSAmX19nZXRfY3B1X3ZhcihleGNlcHRpb25fZGF0YSk7CisJCWQtPmZhdWx0X2lwID0gcmVncy0+aWFvcVswXTsKKwkJZC0+ZmF1bHRfc3BhY2UgPSByZWdzLT5pc3I7CisJCWQtPmZhdWx0X2FkZHIgPSByZWdzLT5pb3I7CisKKwkJcmVncy0+aWFvcVswXSA9ICgoZml4LT5maXh1cCkgJiB+Myk7CisJCS8qCisJCSAqIE5PVEU6IEluIHNvbWUgY2FzZXMgdGhlIGZhdWx0aW5nIGluc3RydWN0aW9uCisJCSAqIG1heSBiZSBpbiB0aGUgZGVsYXkgc2xvdCBvZiBhIGJyYW5jaC4gV2UKKwkJICogZG9uJ3Qgd2FudCB0byB0YWtlIHRoZSBicmFuY2gsIHNvIHdlIGRvbid0CisJCSAqIGluY3JlbWVudCBpYW9xWzFdLCBpbnN0ZWFkIHdlIHNldCBpdCB0byBiZQorCQkgKiBpYW9xWzBdKzQsIGFuZCBjbGVhciB0aGUgQiBiaXQgaW4gdGhlIFBTVworCQkgKi8KKwkJcmVncy0+aWFvcVsxXSA9IHJlZ3MtPmlhb3FbMF0gKyA0OworCQlyZWdzLT5nclswXSAmPSB+UFNXX0I7IC8qIElQU1cgaW4gZ3JbMF0gKi8KKworCQlyZXR1cm4gMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKwogdm9pZCBkb19wYWdlX2ZhdWx0KHN0cnVjdCBwdF9yZWdzICpyZWdzLCB1bnNpZ25lZCBsb25nIGNvZGUsCiAJCQkgICAgICB1bnNpZ25lZCBsb25nIGFkZHJlc3MpCiB7CiAJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsICpwcmV2X3ZtYTsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayA9IGN1cnJlbnQ7CiAJc3RydWN0IG1tX3N0cnVjdCAqbW0gPSB0c2stPm1tOwotCWNvbnN0IHN0cnVjdCBleGNlcHRpb25fdGFibGVfZW50cnkgKmZpeDsKIAl1bnNpZ25lZCBsb25nIGFjY190eXBlOwogCWludCBmYXVsdDsKIApAQCAtMjI5LDMyICsyNTcsOCBAQAogCiBub19jb250ZXh0OgogCi0JaWYgKCF1c2VyX21vZGUocmVncykpIHsKLQkJZml4ID0gc2VhcmNoX2V4Y2VwdGlvbl90YWJsZXMocmVncy0+aWFvcVswXSk7Ci0KLQkJaWYgKGZpeCkgewotCQkJc3RydWN0IGV4Y2VwdGlvbl9kYXRhICpkOwotCi0JCQlkID0gJl9fZ2V0X2NwdV92YXIoZXhjZXB0aW9uX2RhdGEpOwotCQkJZC0+ZmF1bHRfaXAgPSByZWdzLT5pYW9xWzBdOwotCQkJZC0+ZmF1bHRfc3BhY2UgPSByZWdzLT5pc3I7Ci0JCQlkLT5mYXVsdF9hZGRyID0gcmVncy0+aW9yOwotCi0JCQlyZWdzLT5pYW9xWzBdID0gKChmaXgtPmZpeHVwKSAmIH4zKTsKLQotCQkJLyoKLQkJCSAqIE5PVEU6IEluIHNvbWUgY2FzZXMgdGhlIGZhdWx0aW5nIGluc3RydWN0aW9uCi0JCQkgKiBtYXkgYmUgaW4gdGhlIGRlbGF5IHNsb3Qgb2YgYSBicmFuY2guIFdlCi0JCQkgKiBkb24ndCB3YW50IHRvIHRha2UgdGhlIGJyYW5jaCwgc28gd2UgZG9uJ3QKLQkJCSAqIGluY3JlbWVudCBpYW9xWzFdLCBpbnN0ZWFkIHdlIHNldCBpdCB0byBiZQotCQkJICogaWFvcVswXSs0LCBhbmQgY2xlYXIgdGhlIEIgYml0IGluIHRoZSBQU1cKLQkJCSAqLwotCi0JCQlyZWdzLT5pYW9xWzFdID0gcmVncy0+aWFvcVswXSArIDQ7Ci0JCQlyZWdzLT5nclswXSAmPSB+UFNXX0I7IC8qIElQU1cgaW4gZ3JbMF0gKi8KLQotCQkJcmV0dXJuOwotCQl9CisJaWYgKCF1c2VyX21vZGUocmVncykgJiYgZml4dXBfZXhjZXB0aW9uKHJlZ3MpKSB7CisJCXJldHVybjsKIAl9CiAKIAlwYXJpc2NfdGVybWluYXRlKCJCYWQgQWRkcmVzcyAobnVsbCBwb2ludGVyIGRlcmVmPykiLCByZWdzLCBjb2RlLCBhZGRyZXNzKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9LY29uZmlnIGIvYXJjaC9wb3dlcnBjL0tjb25maWcKaW5kZXggNzlmMjVjZS4uZTM5YjczYiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL0tjb25maWcKKysrIGIvYXJjaC9wb3dlcnBjL0tjb25maWcKQEAgLTEwOCw2ICsxMDgsOCBAQAogY29uZmlnIFBQQwogCWJvb2wKIAlkZWZhdWx0IHkKKwlzZWxlY3QgSEFWRV9GVFJBQ0VfTUNPVU5UX1JFQ09SRAorCXNlbGVjdCBIQVZFX0RZTkFNSUNfRlRSQUNFCiAJc2VsZWN0IEhBVkVfRlVOQ1RJT05fVFJBQ0VSCiAJc2VsZWN0IEFSQ0hfV0FOVF9PUFRJT05BTF9HUElPTElCCiAJc2VsZWN0IEhBVkVfSURFCkBAIC0xMjEsNiArMTIzLDcgQEAKIAlzZWxlY3QgSEFWRV9ETUFfQVRUUlMgaWYgUFBDNjQKIAlzZWxlY3QgVVNFX0dFTkVSSUNfU01QX0hFTFBFUlMgaWYgU01QCiAJc2VsZWN0IEhBVkVfT1BST0ZJTEUKKwlzZWxlY3QgSEFWRV9TWVNDQUxMX1dSQVBQRVJTIGlmIFBQQzY0CiAKIGNvbmZpZyBFQVJMWV9QUklOVEsKIAlib29sCkBAIC0zMjYsNyArMzI5LDggQEAKIAogY29uZmlnIENSQVNIX0RVTVAKIAlib29sICJCdWlsZCBhIGtkdW1wIGNyYXNoIGtlcm5lbCIKLQlkZXBlbmRzIG9uIChQUEM2NCAmJiBSRUxPQ0FUQUJMRSkgfHwgNnh4CisJZGVwZW5kcyBvbiBQUEM2NCB8fCA2eHgKKwlzZWxlY3QgUkVMT0NBVEFCTEUgaWYgUFBDNjQKIAloZWxwCiAJICBCdWlsZCBhIGtlcm5lbCBzdWl0YWJsZSBmb3IgdXNlIGFzIGEga2R1bXAgY2FwdHVyZSBrZXJuZWwuCiAJICBUaGUgc2FtZSBrZXJuZWwgYmluYXJ5IGNhbiBiZSB1c2VkIGFzIHByb2R1Y3Rpb24ga2VybmVsIGFuZCBkdW1wCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9NYWtlZmlsZSBiL2FyY2gvcG93ZXJwYy9ib290L01ha2VmaWxlCmluZGV4IGYzMjgyOTkuLmU4NGRmMzMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L01ha2VmaWxlCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L01ha2VmaWxlCkBAIC0yMDgsNyArMjA4LDcgQEAKICMKICMgVGhlc2VzIGFyZSBkZWZhdWx0IHRhcmdldHMgdG8gYnVpbGQgaW1hZ2VzIHdoaWNoIGVtYmVkIGRldmljZSB0cmVlIGJsb2JzLgogIyBUaGV5IGFyZSBvbmx5IHJlcXVpcmVkIG9uIGJvYXJkcyB3aGljaCBkbyBub3QgaGF2ZSBGRFQgc3VwcG9ydCBpbiBmaXJtd2FyZS4KLSMgQm9hcmRzIHdpdGggbmV3aXNoIHUtYm9vdCBmaXJtYXJlIGNhbiB1c2UgdGhlIHVJbWFnZSB0YXJnZXQgYWJvdmUKKyMgQm9hcmRzIHdpdGggbmV3aXNoIHUtYm9vdCBmaXJtd2FyZSBjYW4gdXNlIHRoZSB1SW1hZ2UgdGFyZ2V0IGFib3ZlCiAjCiAKICMgQm9hcmQgcG9ydHMgaW4gYXJjaC9wb3dlcnBjL3BsYXRmb3JtLzQweC9LY29uZmlnCkBAIC0zNTYsNyArMzU2LDcgQEAKIAlAcm0gLWYgJEA7IGxuICQ8ICRACiAKIGluc3RhbGw6ICQoQ09ORklHVVJFKSAkKGFkZHByZWZpeCAkKG9iaikvLCAkKGltYWdlLXkpKQotCXNoIC14ICQoc3JjdHJlZSkvJChzcmMpL2luc3RhbGwuc2ggIiQoS0VSTkVMUkVMRUFTRSkiIHZtbGludXggU3lzdGVtLm1hcCAiJChJTlNUQUxMX1BBVEgpIiAkPAorCXNoIC14ICQoc3JjdHJlZSkvJChzcmMpL2luc3RhbGwuc2ggIiQoS0VSTkVMUkVMRUFTRSkiIHZtbGludXggU3lzdGVtLm1hcCAiJChJTlNUQUxMX1BBVEgpIiAkXgogCiAjIGFueXRoaW5nIG5vdCBpbiAkKHRhcmdldHMpCiBjbGVhbi1maWxlcyArPSAkKGltYWdlLSkgJChpbml0cmQtKSBjdUltYWdlLiogZHRiSW1hZ2UuKiB0cmVlSW1hZ2UuKiBcCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZ2VmX3NiYzYxMC5kdHMgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZ2VmX3NiYzYxMC5kdHMKaW5kZXggOTcwOGIzNC4uZTc4YzM1NSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2dlZl9zYmM2MTAuZHRzCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9nZWZfc2JjNjEwLmR0cwpAQCAtODgsNiArODgsMjEgQEAKIAkJCWNvbXBhdGlibGUgPSAiZ2VmLGZwZ2EtcmVncyI7CiAJCQlyZWcgPSA8MHg0IDB4MCAweDQwPjsKIAkJfTsKKworCQl3ZHRANCwyMDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZ2VmLGZwZ2Etd2R0IjsKKwkJCXJlZyA9IDwweDQgMHgyMDAwIDB4OD47CisJCQlpbnRlcnJ1cHRzID0gPDB4MWEgMHg0PjsKKwkJCWludGVycnVwdC1wYXJlbnQgPSA8JmdlZl9waWM+OworCQl9OworCQkvKiBTZWNvbmQgd2F0Y2hkb2cgYXZhaWxhYmxlLCBkcml2ZXIgY3VycmVudGx5IHN1cHBvcnRzIG9uZS4KKwkJd2R0QDQsMjAxMCB7CisJCQljb21wYXRpYmxlID0gImdlZixmcGdhLXdkdCI7CisJCQlyZWcgPSA8MHg0IDB4MjAxMCAweDg+OworCQkJaW50ZXJydXB0cyA9IDwweDFiIDB4ND47CisJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZnZWZfcGljPjsKKwkJfTsKKwkJKi8KIAkJZ2VmX3BpYzogcGljQDQsNDAwMCB7CiAJCQkjaW50ZXJydXB0LWNlbGxzID0gPDE+OwogCQkJaW50ZXJydXB0LWNvbnRyb2xsZXI7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODMxNWVyZGIuZHRzIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzgzMTVlcmRiLmR0cwppbmRleCAwNzJjOWIwLi43MTc4NDE2IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODMxNWVyZGIuZHRzCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4MzE1ZXJkYi5kdHMKQEAgLTI1NSw3ICsyNTUsNyBAQAogCQkJZGV2aWNlX3R5cGUgPSAic2VyaWFsIjsKIAkJCWNvbXBhdGlibGUgPSAibnMxNjU1MCI7CiAJCQlyZWcgPSA8MHg0NTAwIDB4MTAwPjsKLQkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsKKwkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwxMzMzMzMzMzM+OwogCQkJaW50ZXJydXB0cyA9IDw5IDB4OD47CiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZpcGljPjsKIAkJfTsKQEAgLTI2NSw3ICsyNjUsNyBAQAogCQkJZGV2aWNlX3R5cGUgPSAic2VyaWFsIjsKIAkJCWNvbXBhdGlibGUgPSAibnMxNjU1MCI7CiAJCQlyZWcgPSA8MHg0NjAwIDB4MTAwPjsKLQkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsKKwkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwxMzMzMzMzMzM+OwogCQkJaW50ZXJydXB0cyA9IDwxMCAweDg+OwogCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmaXBpYz47CiAJCX07CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODM2eF9tZHMuZHRzIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzgzNnhfbWRzLmR0cwppbmRleCAxNDUzNGQwLi42ZTM0ZjE3IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODM2eF9tZHMuZHRzCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4MzZ4X21kcy5kdHMKQEAgLTY5LDggKzY5LDE4IEBACiAJCX07CiAKIAkJYmNzckAxLDAgeworCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkjc2l6ZS1jZWxscyA9IDwxPjsKICAJCQljb21wYXRpYmxlID0gImZzbCxtcGM4MzYwbWRzLWJjc3IiOwogCQkJcmVnID0gPDEgMCAweDgwMDA+OworCQkJcmFuZ2VzID0gPDAgMSAwIDB4ODAwMD47CisKKwkJCWJjc3IxMzogZ3Bpby1jb250cm9sbGVyQGQgeworCQkJCSNncGlvLWNlbGxzID0gPDI+OworCQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzgzNjBtZHMtYmNzci1ncGlvIjsKKwkJCQlyZWcgPSA8MHhkIDE+OworCQkJCWdwaW8tY29udHJvbGxlcjsKKwkJCX07CiAJCX07CiAJfTsKIApAQCAtMTk1LDEwICsyMDUsMjEgQEAKIAkJfTsKIAogCQlwYXJfaW9AMTQwMCB7CisJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCSNzaXplLWNlbGxzID0gPDE+OwogCQkJcmVnID0gPDB4MTQwMCAweDEwMD47CisJCQlyYW5nZXMgPSA8MCAweDE0MDAgMHgxMDA+OwogCQkJZGV2aWNlX3R5cGUgPSAicGFyX2lvIjsKIAkJCW51bS1wb3J0cyA9IDw3PjsKIAorCQkJcWVfcGlvX2I6IGdwaW8tY29udHJvbGxlckAxOCB7CisJCQkJI2dwaW8tY2VsbHMgPSA8Mj47CisJCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODM2MC1xZS1wYXJpby1iYW5rIiwKKwkJCQkJICAgICAiZnNsLG1wYzgzMjMtcWUtcGFyaW8tYmFuayI7CisJCQkJcmVnID0gPDB4MTggMHgxOD47CisJCQkJZ3Bpby1jb250cm9sbGVyOworCQkJfTsKKwogCQkJcGlvMTogdWNjX3BpbkAwMSB7CiAJCQkJcGlvLW1hcCA9IDwKIAkJCS8qIHBvcnQgIHBpbiAgZGlyICBvcGVuX2RyYWluICBhc3NpZ25tZW50ICBoYXNfaXJxICovCkBAIC0yODIsNiArMzAzLDE1IEBACiAJCQl9OwogCQl9OwogCisJCXRpbWVyQDQ0MCB7CisJCQljb21wYXRpYmxlID0gImZzbCxtcGM4MzYwLXFlLWd0bSIsCisJCQkJICAgICAiZnNsLHFlLWd0bSIsICJmc2wsZ3RtIjsKKwkJCXJlZyA9IDwweDQ0MCAweDQwPjsKKwkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwxMzIwMDAwMDA+OworCQkJaW50ZXJydXB0cyA9IDwxMiAxMyAxNCAxNT47CisJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZxZWljPjsKKwkJfTsKKwogCQlzcGlANGMwIHsKIAkJCWNlbGwtaW5kZXggPSA8MD47CiAJCQljb21wYXRpYmxlID0gImZzbCxzcGkiOwpAQCAtMzAxLDExICszMzEsMjAgQEAKIAkJfTsKIAogCQl1c2JANmMwIHsKLQkJCWNvbXBhdGlibGUgPSAicWVfdWRjIjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzgzNjAtcWUtdXNiIiwKKwkJCQkgICAgICJmc2wsbXBjODMyMy1xZS11c2IiOwogCQkJcmVnID0gPDB4NmMwIDB4NDAgMHg4YjAwIDB4MTAwPjsKIAkJCWludGVycnVwdHMgPSA8MTE+OwogCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmcWVpYz47Ci0JCQltb2RlID0gInNsYXZlIjsKKwkJCWZzbCxmdWxsc3BlZWQtY2xvY2sgPSAiY2xrMjEiOworCQkJZnNsLGxvd3NwZWVkLWNsb2NrID0gImJyZzkiOworCQkJZ3Bpb3MgPSA8JnFlX3Bpb19iICAyIDAgICAvKiBVU0JPRSAqLworCQkJCSAmcWVfcGlvX2IgIDMgMCAgIC8qIFVTQlRQICovCisJCQkJICZxZV9waW9fYiAgOCAwICAgLyogVVNCVE4gKi8KKwkJCQkgJnFlX3Bpb19iICA5IDAgICAvKiBVU0JSUCAqLworCQkJCSAmcWVfcGlvX2IgMTEgMCAgIC8qIFVTQlJOICovCisJCQkJICZiY3NyMTMgICAgNSAwICAgLyogU1BFRUQgKi8KKwkJCQkgJmJjc3IxMyAgICA0IDE+OyAvKiBQT1dFUiAqLwogCQl9OwogCiAJCWVuZXQwOiB1Y2NAMjAwMCB7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODM2eF9yZGsuZHRzIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzgzNnhfcmRrLmR0cwppbmRleCBkZWNhZGYzLi4zN2I3ODk1IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODM2eF9yZGsuZHRzCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4MzZ4X3Jkay5kdHMKQEAgLTIxOCw4ICsyMTgsMjMgQEAKIAkJCQlyZWcgPSA8MHg0NDAgMHg0MD47CiAJCQkJaW50ZXJydXB0cyA9IDwxMiAxMyAxNCAxNT47CiAJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmcWVpYz47Ci0JCQkJLyogZmlsbGVkIGJ5IHUtYm9vdCAqLwotCQkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsKKwkJCQljbG9jay1mcmVxdWVuY3kgPSA8MTY2NjY2NjY2PjsKKwkJCX07CisKKwkJCXVzYkA2YzAgeworCQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzgzNjAtcWUtdXNiIiwKKwkJCQkJICAgICAiZnNsLG1wYzgzMjMtcWUtdXNiIjsKKwkJCQlyZWcgPSA8MHg2YzAgMHg0MCAweDhiMDAgMHgxMDA+OworCQkJCWludGVycnVwdHMgPSA8MTE+OworCQkJCWludGVycnVwdC1wYXJlbnQgPSA8JnFlaWM+OworCQkJCWZzbCxmdWxsc3BlZWQtY2xvY2sgPSAiY2xrMjEiOworCQkJCWdwaW9zID0gPCZxZV9waW9fYiAgMiAwIC8qIFVTQk9FICovCisJCQkJCSAmcWVfcGlvX2IgIDMgMCAvKiBVU0JUUCAqLworCQkJCQkgJnFlX3Bpb19iICA4IDAgLyogVVNCVE4gKi8KKwkJCQkJICZxZV9waW9fYiAgOSAwIC8qIFVTQlJQICovCisJCQkJCSAmcWVfcGlvX2IgMTEgMCAvKiBVU0JSTiAqLworCQkJCQkgJnFlX3Bpb19lIDIwIDAgLyogU1BFRUQgKi8KKwkJCQkJICZxZV9waW9fZSAyMSAxIC8qIFBPV0VSICovPjsKIAkJCX07CiAKIAkJCXNwaUA0YzAgewpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzg1NDRkcy5kdHMgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODU0NGRzLmR0cwppbmRleCBiOWRhNDIxLi4wNjY4ZDEwIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODU0NGRzLmR0cworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODU0NGRzLmR0cwpAQCAtMzEzLDcgKzMxMyw3IEBACiAJCQkgIDB4MTAwMDAwMCAweDAgMHgwIDB4ZTEwMTAwMDAgMHgwIDB4MTAwMDA+OwogCQljbG9jay1mcmVxdWVuY3kgPSA8MzMzMzMzMzM+OwogCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJaW50ZXJydXB0cyA9IDwyNiAyPjsKKwkJaW50ZXJydXB0cyA9IDwyNSAyPjsKIAkJaW50ZXJydXB0LW1hcC1tYXNrID0gPDB4ZjgwMCAweDAgMHgwIDB4Nz47CiAJCWludGVycnVwdC1tYXAgPSA8CiAJCQkvKiBJRFNFTCAweDAgKi8KQEAgLTM1MCw3ICszNTAsNyBAQAogCQkJICAweDEwMDAwMDAgMHgwIDB4MCAweGUxMDIwMDAwIDB4MCAweDEwMDAwPjsKIAkJY2xvY2stZnJlcXVlbmN5ID0gPDMzMzMzMzMzPjsKIAkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCWludGVycnVwdHMgPSA8MjUgMj47CisJCWludGVycnVwdHMgPSA8MjYgMj47CiAJCWludGVycnVwdC1tYXAtbWFzayA9IDwweGY4MDAgMHgwIDB4MCAweDc+OwogCQlpbnRlcnJ1cHQtbWFwID0gPAogCQkJLyogSURTRUwgMHgwICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODU3MmRzLmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4NTcyZHMuZHRzCmluZGV4IDIxNDU5ZTEuLjNkY2MwMDEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4NTcyZHMuZHRzCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4NTcyZHMuZHRzCkBAIC03MjQsNyArNzI0LDcgQEAKIAkJCSAgMHgxMDAwMDAwIDB4MCAweDAwMDAwMDAwIDAgMHhmZmMxMDAwMCAweDAgMHgwMDAxMDAwMD47CiAJCWNsb2NrLWZyZXF1ZW5jeSA9IDwzMzMzMzMzMz47CiAJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQlpbnRlcnJ1cHRzID0gPDI2IDI+OworCQlpbnRlcnJ1cHRzID0gPDI1IDI+OwogCQlpbnRlcnJ1cHQtbWFwLW1hc2sgPSA8MHhmODAwIDB4MCAweDAgMHg3PjsKIAkJaW50ZXJydXB0LW1hcCA9IDwKIAkJCS8qIElEU0VMIDB4MCAqLwpAQCAtNzYxLDcgKzc2MSw3IEBACiAJCQkgIDB4MTAwMDAwMCAweDAgMHgwMDAwMDAwMCAwIDB4ZmZjMjAwMDAgMHgwIDB4MDAwMTAwMDA+OwogCQljbG9jay1mcmVxdWVuY3kgPSA8MzMzMzMzMzM+OwogCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJaW50ZXJydXB0cyA9IDwyNyAyPjsKKwkJaW50ZXJydXB0cyA9IDwyNiAyPjsKIAkJaW50ZXJydXB0LW1hcC1tYXNrID0gPDB4ZjgwMCAweDAgMHgwIDB4Nz47CiAJCWludGVycnVwdC1tYXAgPSA8CiAJCQkvKiBJRFNFTCAweDAgKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4NTcyZHNfY2FtcF9jb3JlMC5kdHMgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODU3MmRzX2NhbXBfY29yZTAuZHRzCmluZGV4IGMxMTRjNGUuLmZkNDYyZWYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4NTcyZHNfY2FtcF9jb3JlMC5kdHMKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzg1NzJkc19jYW1wX2NvcmUwLmR0cwpAQCAtNDU3LDcgKzQ1Nyw3IEBACiAJCQkgIDB4MTAwMDAwMCAweDAgMHgwIDB4ZmZjMTAwMDAgMHgwIDB4MTAwMDA+OwogCQljbG9jay1mcmVxdWVuY3kgPSA8MzMzMzMzMzM+OwogCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJaW50ZXJydXB0cyA9IDwyNiAyPjsKKwkJaW50ZXJydXB0cyA9IDwyNSAyPjsKIAkJaW50ZXJydXB0LW1hcC1tYXNrID0gPDB4ZjgwMCAweDAgMHgwIDB4Nz47CiAJCWludGVycnVwdC1tYXAgPSA8CiAJCQkvKiBJRFNFTCAweDAgKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4NTcyZHNfY2FtcF9jb3JlMS5kdHMgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODU3MmRzX2NhbXBfY29yZTEuZHRzCmluZGV4IDA0ZWNkYTEuLmUzNTIzMGYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4NTcyZHNfY2FtcF9jb3JlMS5kdHMKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzg1NzJkc19jYW1wX2NvcmUxLmR0cwpAQCAtMjA4LDcgKzIwOCw3IEBACiAJCQkgIDB4MTAwMDAwMCAweDAgMHgwIDB4ZmZjMjAwMDAgMHgwIDB4MTAwMDA+OwogCQljbG9jay1mcmVxdWVuY3kgPSA8MzMzMzMzMzM+OwogCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJaW50ZXJydXB0cyA9IDwyNyAyPjsKKwkJaW50ZXJydXB0cyA9IDwyNiAyPjsKIAkJaW50ZXJydXB0LW1hcC1tYXNrID0gPDB4ZjgwMCAweDAgMHgwIDB4Nz47CiAJCWludGVycnVwdC1tYXAgPSA8CiAJCQkvKiBJRFNFTCAweDAgKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4NjQxX2hwY24uZHRzIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzg2NDFfaHBjbi5kdHMKaW5kZXggMzVkNWUyNC4uNDQ4MTUzMiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzg2NDFfaHBjbi5kdHMKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzg2NDFfaHBjbi5kdHMKQEAgLTI2LDcgKzI2LDEzIEBACiAJCXNlcmlhbDEgPSAmc2VyaWFsMTsKIAkJcGNpMCA9ICZwY2kwOwogCQlwY2kxID0gJnBjaTE7Ci0JCXJhcGlkaW8wID0gJnJhcGlkaW8wOworLyoKKyAqIE9ubHkgb25lIG9mIFJhcGlkIElPIG9yIFBDSSBjYW4gYmUgcHJlc2VudCBkdWUgdG8gSFcgbGltaXRhdGlvbnMgYW5kCisgKiBkdWUgdG8gdGhlIGZhY3QgdGhhdCB0aGUgMiBub3cgc2hhcmUgYWRkcmVzcyBzcGFjZSBpbiB0aGUgbmV3IG1lbW9yeQorICogbWFwLiAgVGhlIG1vc3QgbGlrZWx5IGNhc2UgaXMgdGhhdCB3ZSBoYXZlIFBDSSwgc28gY29tbWVudCBvdXQgdGhlCisgKiByYXBpZGlvIG5vZGUuICBMZWF2ZSBpdCBoZXJlIGZvciByZWZlcmVuY2UuCisgKi8KKwkJLyogcmFwaWRpbzAgPSAmcmFwaWRpbzA7ICovCiAJfTsKIAogCWNwdXMgewpAQCAtNjIsMTggKzY4LDE3IEBACiAJCXJlZyA9IDwweDAwMDAwMDAwIDB4NDAwMDAwMDA+OwkvLyAxRyBhdCAweDAKIAl9OwogCi0JbG9jYWxidXNAZjgwMDUwMDAgeworCWxvY2FsYnVzQGZmZTA1MDAwIHsKIAkJI2FkZHJlc3MtY2VsbHMgPSA8Mj47CiAJCSNzaXplLWNlbGxzID0gPDE+OwogCQljb21wYXRpYmxlID0gImZzbCxtcGM4NjQxLWxvY2FsYnVzIiwgInNpbXBsZS1idXMiOwotCQlyZWcgPSA8MHhmODAwNTAwMCAweDEwMDA+OworCQlyZWcgPSA8MHhmZmUwNTAwMCAweDEwMDA+OwogCQlpbnRlcnJ1cHRzID0gPDE5IDI+OwogCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKIAotCQlyYW5nZXMgPSA8MCAwIDB4ZmY4MDAwMDAgMHgwMDgwMDAwMAotCQkJICAxIDAgMHhmZTAwMDAwMCAweDAxMDAwMDAwCi0JCQkgIDIgMCAweGY4MjAwMDAwIDB4MDAxMDAwMDAKLQkJCSAgMyAwIDB4ZjgxMDAwMDAgMHgwMDEwMDAwMD47CisJCXJhbmdlcyA9IDwwIDAgMHhlZjgwMDAwMCAweDAwODAwMDAwCisJCQkgIDIgMCAweGZmZGY4MDAwIDB4MDAwMDgwMDAKKwkJCSAgMyAwIDB4ZmZkZjAwMDAgMHgwMDAwODAwMD47CiAKIAkJZmxhc2hAMCwwIHsKIAkJCWNvbXBhdGlibGUgPSAiY2ZpLWZsYXNoIjsKQEAgLTEwMywxMyArMTA4LDEzIEBACiAJCX07CiAJfTsKIAotCXNvYzg2NDFAZjgwMDAwMDAgeworCXNvYzg2NDFAZmZlMDAwMDAgewogCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKIAkJI3NpemUtY2VsbHMgPSA8MT47CiAJCWRldmljZV90eXBlID0gInNvYyI7CiAJCWNvbXBhdGlibGUgPSAic2ltcGxlLWJ1cyI7Ci0JCXJhbmdlcyA9IDwweDAwMDAwMDAwIDB4ZjgwMDAwMDAgMHgwMDEwMDAwMD47Ci0JCXJlZyA9IDwweGY4MDAwMDAwIDB4MDAwMDEwMDA+OwkvLyBDQ1NSQkFSCisJCXJhbmdlcyA9IDwweDAwMDAwMDAwIDB4ZmZlMDAwMDAgMHgwMDEwMDAwMD47CisJCXJlZyA9IDwweGZmZTAwMDAwIDB4MDAwMDEwMDA+OwkvLyBDQ1NSQkFSCiAJCWJ1cy1mcmVxdWVuY3kgPSA8MD47CiAKIAkJaTJjQDMwMDAgewpAQCAtMzQwLDE3ICszNDUsMTcgQEAKIAkJfTsKIAl9OwogCi0JcGNpMDogcGNpZUBmODAwODAwMCB7CisJcGNpMDogcGNpZUBmZmUwODAwMCB7CiAJCWNlbGwtaW5kZXggPSA8MD47CiAJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzg2NDEtcGNpZSI7CiAJCWRldmljZV90eXBlID0gInBjaSI7CiAJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8MT47CiAJCSNzaXplLWNlbGxzID0gPDI+OwogCQkjYWRkcmVzcy1jZWxscyA9IDwzPjsKLQkJcmVnID0gPDB4ZjgwMDgwMDAgMHgxMDAwPjsKKwkJcmVnID0gPDB4ZmZlMDgwMDAgMHgxMDAwPjsKIAkJYnVzLXJhbmdlID0gPDB4MCAweGZmPjsKIAkJcmFuZ2VzID0gPDB4MDIwMDAwMDAgMHgwIDB4ODAwMDAwMDAgMHg4MDAwMDAwMCAweDAgMHgyMDAwMDAwMAotCQkJICAweDAxMDAwMDAwIDB4MCAweDAwMDAwMDAwIDB4ZTIwMDAwMDAgMHgwIDB4MDAxMDAwMDA+OworCQkJICAweDAxMDAwMDAwIDB4MCAweDAwMDAwMDAwIDB4ZmZjMDAwMDAgMHgwIDB4MDAwMTAwMDA+OwogCQljbG9jay1mcmVxdWVuY3kgPSA8MzMzMzMzMzM+OwogCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKIAkJaW50ZXJydXB0cyA9IDwyNCAyPjsKQEAgLTQ4MSw3ICs0ODYsNyBAQAogCiAJCQkJICAweDAxMDAwMDAwIDB4MCAweDAwMDAwMDAwCiAJCQkJICAweDAxMDAwMDAwIDB4MCAweDAwMDAwMDAwCi0JCQkJICAweDAgMHgwMDEwMDAwMD47CisJCQkJICAweDAgMHgwMDAxMDAwMD47CiAJCQl1bGkxNTc1QDAgewogCQkJCXJlZyA9IDwwIDAgMCAwIDA+OwogCQkJCSNzaXplLWNlbGxzID0gPDI+OwpAQCAtNDkxLDcgKzQ5Niw3IEBACiAJCQkJCSAgMHgwIDB4MjAwMDAwMDAKIAkJCQkJICAweDAxMDAwMDAwIDB4MCAweDAwMDAwMDAwCiAJCQkJCSAgMHgwMTAwMDAwMCAweDAgMHgwMDAwMDAwMAotCQkJCQkgIDB4MCAweDAwMTAwMDAwPjsKKwkJCQkJICAweDAgMHgwMDAxMDAwMD47CiAJCQkJaXNhQDFlIHsKIAkJCQkJZGV2aWNlX3R5cGUgPSAiaXNhIjsKIAkJCQkJI2ludGVycnVwdC1jZWxscyA9IDwyPjsKQEAgLTU0OSwxNyArNTU0LDE3IEBACiAKIAl9OwogCi0JcGNpMTogcGNpZUBmODAwOTAwMCB7CisJcGNpMTogcGNpZUBmZmUwOTAwMCB7CiAJCWNlbGwtaW5kZXggPSA8MT47CiAJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzg2NDEtcGNpZSI7CiAJCWRldmljZV90eXBlID0gInBjaSI7CiAJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8MT47CiAJCSNzaXplLWNlbGxzID0gPDI+OwogCQkjYWRkcmVzcy1jZWxscyA9IDwzPjsKLQkJcmVnID0gPDB4ZjgwMDkwMDAgMHgxMDAwPjsKKwkJcmVnID0gPDB4ZmZlMDkwMDAgMHgxMDAwPjsKIAkJYnVzLXJhbmdlID0gPDAgMHhmZj47CiAJCXJhbmdlcyA9IDwweDAyMDAwMDAwIDB4MCAweGEwMDAwMDAwIDB4YTAwMDAwMDAgMHgwIDB4MjAwMDAwMDAKLQkJCSAgMHgwMTAwMDAwMCAweDAgMHgwMDAwMDAwMCAweGUzMDAwMDAwIDB4MCAweDAwMTAwMDAwPjsKKwkJCSAgMHgwMTAwMDAwMCAweDAgMHgwMDAwMDAwMCAweGZmYzEwMDAwIDB4MCAweDAwMDEwMDAwPjsKIAkJY2xvY2stZnJlcXVlbmN5ID0gPDMzMzMzMzMzPjsKIAkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CiAJCWludGVycnVwdHMgPSA8MjUgMj47CkBAIC01ODIsMTggKzU4NywyMSBAQAogCiAJCQkJICAweDAxMDAwMDAwIDB4MCAweDAwMDAwMDAwCiAJCQkJICAweDAxMDAwMDAwIDB4MCAweDAwMDAwMDAwCi0JCQkJICAweDAgMHgwMDEwMDAwMD47CisJCQkJICAweDAgMHgwMDAxMDAwMD47CiAJCX07CiAJfTsKLQlyYXBpZGlvMDogcmFwaWRpb0BmODBjMDAwMCB7CisvKgorCXJhcGlkaW8wOiByYXBpZGlvQGZmZWMwMDAwIHsKIAkJI2FkZHJlc3MtY2VsbHMgPSA8Mj47CiAJCSNzaXplLWNlbGxzID0gPDI+OwogCQljb21wYXRpYmxlID0gImZzbCxyYXBpZGlvLWRlbHRhIjsKLQkJcmVnID0gPDB4ZjgwYzAwMDAgMHgyMDAwMD47Ci0JCXJhbmdlcyA9IDwwIDAgMHhjMDAwMDAwMCAwIDB4MjAwMDAwMDA+OworCQlyZWcgPSA8MHhmZmVjMDAwMCAweDIwMDAwPjsKKwkJcmFuZ2VzID0gPDAgMCAweDgwMDAwMDAwIDAgMHgyMDAwMDAwMD47CiAJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkvKiBlcnJfaXJxIGJlbGxfb3V0Yl9pcnEgYmVsbF9pbmJfaXJxCi0JCQltc2cxX3R4X2lycSBtc2cxX3J4X2lycQltc2cyX3R4X2lycSBtc2cyX3J4X2lycSAqLworCQkvLyBlcnJfaXJxIGJlbGxfb3V0Yl9pcnEgYmVsbF9pbmJfaXJxCisJCS8vCW1zZzFfdHhfaXJxIG1zZzFfcnhfaXJxCW1zZzJfdHhfaXJxIG1zZzJfcnhfaXJxCiAJCWludGVycnVwdHMgPSA8NDggMiA0OSAyIDUwIDIgNTMgMiA1NCAyIDU1IDIgNTYgMj47CiAJfTsKKyovCisKIH07CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvc2VxdW9pYS5kdHMgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvc2VxdW9pYS5kdHMKaW5kZXggM2IyOTVlOC4uNDNjYzY4YiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3NlcXVvaWEuZHRzCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9zZXF1b2lhLmR0cwpAQCAtMTM0LDcgKzEzNCw3IEBACiAJCX07CiAKIAkJVVNCMTogdXNiQGUwMDAwNDAwIHsKLQkJCWNvbXBhdGlibGUgPSAib2hjaS1iZSI7CisJCQljb21wYXRpYmxlID0gImlibSx1c2Itb2hjaS00NDBlcHgiLCAib2hjaS1iZSI7CiAJCQlyZWcgPSA8MHgwMDAwMDAwMCAweGUwMDAwNDAwIDB4MDAwMDAwNjA+OwogCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmVUlDMD47CiAJCQlpbnRlcnJ1cHRzID0gPDB4MTUgMHg4PjsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2luc3RhbGwuc2ggYi9hcmNoL3Bvd2VycGMvYm9vdC9pbnN0YWxsLnNoCmluZGV4IGIwMDJiZmQuLjUxYjIzODcgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2luc3RhbGwuc2gKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvaW5zdGFsbC5zaApAQCAtMTUsNyArMTUsNyBAQAogIyAgICQyIC0ga2VybmVsIGltYWdlIGZpbGUKICMgICAkMyAtIGtlcm5lbCBtYXAgZmlsZQogIyAgICQ0IC0gZGVmYXVsdCBpbnN0YWxsIHBhdGggKGJsYW5rIGlmIHJvb3QgZGlyZWN0b3J5KQotIyAgICQ1IC0ga2VybmVsIGJvb3QgZmlsZSwgdGhlIHpJbWFnZQorIyAgICQ1IGFuZCBtb3JlIC0ga2VybmVsIGJvb3QgZmlsZXM7IHpJbWFnZSosIHVJbWFnZSwgY3VJbWFnZS4qLCBldGMuCiAjCiAKICMgVXNlciBtYXkgaGF2ZSBhIGN1c3RvbSBpbnN0YWxsIHNjcmlwdApAQCAtMzgsMyArMzgsMTUgQEAKIAogY2F0ICQyID4gJDQvJGltYWdlX25hbWUKIGNwICQzICQ0L1N5c3RlbS5tYXAKKworIyBDb3B5IGFsbCB0aGUgYm9vdGFibGUgaW1hZ2UgZmlsZXMKK3BhdGg9JDQKK3NoaWZ0IDQKK3doaWxlIFsgJCMgLW5lIDAgXTsgZG8KKwlpbWFnZV9uYW1lPWBiYXNlbmFtZSAkMWAKKwlpZiBbIC1mICRwYXRoLyRpbWFnZV9uYW1lIF07IHRoZW4KKwkJbXYgJHBhdGgvJGltYWdlX25hbWUgJHBhdGgvJGltYWdlX25hbWUub2xkCisJZmkKKwljYXQgJDEgPiAkcGF0aC8kaW1hZ2VfbmFtZQorCXNoaWZ0Citkb25lOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvODV4eC9tcGM4NTcyX2RzX2RlZmNvbmZpZyBiL2FyY2gvcG93ZXJwYy9jb25maWdzLzg1eHgvbXBjODU3Ml9kc19kZWZjb25maWcKaW5kZXggNjM1NTg4My4uMzJhZWI3OSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvODV4eC9tcGM4NTcyX2RzX2RlZmNvbmZpZworKysgYi9hcmNoL3Bvd2VycGMvY29uZmlncy84NXh4L21wYzg1NzJfZHNfZGVmY29uZmlnCkBAIC0xLDcgKzEsNyBAQAogIwogIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAotIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjI4LXJjMwotIyBTYXQgTm92ICA4IDEyOjQwOjEzIDIwMDgKKyMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4yOC1yYzgKKyMgVHVlIERlYyAzMCAxMToxNzo0NiAyMDA4CiAjCiAjIENPTkZJR19QUEM2NCBpcyBub3Qgc2V0CiAKQEAgLTIxLDcgKzIxLDEwIEBACiBDT05GSUdfRlNMX0VNQl9QRVJGTU9OPXkKICMgQ09ORklHX1BIWVNfNjRCSVQgaXMgbm90IHNldAogQ09ORklHX1NQRT15CitDT05GSUdfUFBDX01NVV9OT0hBU0g9eQogIyBDT05GSUdfUFBDX01NX1NMSUNFUyBpcyBub3Qgc2V0CitDT05GSUdfU01QPXkKK0NPTkZJR19OUl9DUFVTPTIKIENPTkZJR19QUEMzMj15CiBDT05GSUdfV09SRF9TSVpFPTMyCiAjIENPTkZJR19BUkNIX1BIWVNfQUREUl9UXzY0QklUIGlzIG5vdCBzZXQKQEAgLTUwLDcgKzUzLDcgQEAKIENPTkZJR19QUENfT0Y9eQogQ09ORklHX09GPXkKIENPTkZJR19QUENfVURCR18xNjU1MD15Ci0jIENPTkZJR19HRU5FUklDX1RCU1lOQyBpcyBub3Qgc2V0CitDT05GSUdfR0VORVJJQ19UQlNZTkM9eQogQ09ORklHX0FVRElUX0FSQ0g9eQogQ09ORklHX0dFTkVSSUNfQlVHPXkKIENPTkZJR19ERUZBVUxUX1VJTUFHRT15CkBAIC02Miw3ICs2NSw3IEBACiAjIEdlbmVyYWwgc2V0dXAKICMKIENPTkZJR19FWFBFUklNRU5UQUw9eQotQ09ORklHX0JST0tFTl9PTl9TTVA9eQorQ09ORklHX0xPQ0tfS0VSTkVMPXkKIENPTkZJR19JTklUX0VOVl9BUkdfTElNSVQ9MzIKIENPTkZJR19MT0NBTFZFUlNJT049IiIKIENPTkZJR19MT0NBTFZFUlNJT05fQVVUTz15CkBAIC0xMjYsNiArMTI5LDcgQEAKIENPTkZJR19IQVZFX0tQUk9CRVM9eQogQ09ORklHX0hBVkVfS1JFVFBST0JFUz15CiBDT05GSUdfSEFWRV9BUkNIX1RSQUNFSE9PSz15CitDT05GSUdfVVNFX0dFTkVSSUNfU01QX0hFTFBFUlM9eQogIyBDT05GSUdfSEFWRV9HRU5FUklDX0RNQV9DT0hFUkVOVCBpcyBub3Qgc2V0CiBDT05GSUdfU0xBQklORk89eQogQ09ORklHX1JUX01VVEVYRVM9eQpAQCAtMTM4LDYgKzE0Miw3IEBACiBDT05GSUdfTU9EVkVSU0lPTlM9eQogIyBDT05GSUdfTU9EVUxFX1NSQ1ZFUlNJT05fQUxMIGlzIG5vdCBzZXQKIENPTkZJR19LTU9EPXkKK0NPTkZJR19TVE9QX01BQ0hJTkU9eQogQ09ORklHX0JMT0NLPXkKIENPTkZJR19MQkQ9eQogIyBDT05GSUdfQkxLX0RFVl9JT19UUkFDRSBpcyBub3Qgc2V0CkBAIC0xOTcsNiArMjAyLDcgQEAKICMgQ09ORklHX0NQTTIgaXMgbm90IHNldAogQ09ORklHX0ZTTF9VTEkxNTc1PXkKICMgQ09ORklHX01QQzh4eHhfR1BJTyBpcyBub3Qgc2V0CisjIENPTkZJR19TSU1QTEVfR1BJTyBpcyBub3Qgc2V0CiAKICMKICMgS2VybmVsIG9wdGlvbnMKQEAgLTIyNCw2ICsyMzAsNyBAQAogQ09ORklHX0FSQ0hfRU5BQkxFX01FTU9SWV9IT1RQTFVHPXkKIENPTkZJR19BUkNIX0hBU19XQUxLX01FTU9SWT15CiBDT05GSUdfQVJDSF9FTkFCTEVfTUVNT1JZX0hPVFJFTU9WRT15CisjIENPTkZJR19JUlFfQUxMX0NQVVMgaXMgbm90IHNldAogQ09ORklHX0FSQ0hfRkxBVE1FTV9FTkFCTEU9eQogQ09ORklHX0FSQ0hfUE9QVUxBVEVTX05PREVfTUFQPXkKIENPTkZJR19TRUxFQ1RfTUVNT1JZX01PREVMPXkKQEAgLTI0MSw2ICsyNDgsOSBAQAogQ09ORklHX0JPVU5DRT15CiBDT05GSUdfVklSVF9UT19CVVM9eQogQ09ORklHX1VORVZJQ1RBQkxFX0xSVT15CitDT05GSUdfUFBDXzRLX1BBR0VTPXkKKyMgQ09ORklHX1BQQ18xNktfUEFHRVMgaXMgbm90IHNldAorIyBDT05GSUdfUFBDXzY0S19QQUdFUyBpcyBub3Qgc2V0CiBDT05GSUdfRk9SQ0VfTUFYX1pPTkVPUkRFUj0xMQogQ09ORklHX1BST0NfREVWSUNFVFJFRT15CiAjIENPTkZJR19DTURMSU5FX0JPT0wgaXMgbm90IHNldApAQCAtNDQzLDggKzQ1MywxMCBAQAogIyBDT05GSUdfRUVQUk9NXzkzQ1g2IGlzIG5vdCBzZXQKICMgQ09ORklHX1NHSV9JT0M0IGlzIG5vdCBzZXQKICMgQ09ORklHX1RJRk1fQ09SRSBpcyBub3Qgc2V0CisjIENPTkZJR19JQ1M5MzJTNDAxIGlzIG5vdCBzZXQKICMgQ09ORklHX0VOQ0xPU1VSRV9TRVJWSUNFUyBpcyBub3Qgc2V0CiAjIENPTkZJR19IUF9JTE8gaXMgbm90IHNldAorIyBDT05GSUdfQzJQT1JUIGlzIG5vdCBzZXQKIENPTkZJR19IQVZFX0lERT15CiAjIENPTkZJR19JREUgaXMgbm90IHNldAogCkBAIC03ODQsNiArNzk2LDcgQEAKIENPTkZJR19VTklYOThfUFRZUz15CiBDT05GSUdfTEVHQUNZX1BUWVM9eQogQ09ORklHX0xFR0FDWV9QVFlfQ09VTlQ9MjU2CisjIENPTkZJR19IVkNfVURCRyBpcyBub3Qgc2V0CiAjIENPTkZJR19JUE1JX0hBTkRMRVIgaXMgbm90IHNldAogQ09ORklHX0hXX1JBTkRPTT15CiBDT05GSUdfTlZSQU09eQpAQCAtODY5LDExICs4ODIsMTEgQEAKICMgQ09ORklHX1RIRVJNQUwgaXMgbm90IHNldAogIyBDT05GSUdfVEhFUk1BTF9IV01PTiBpcyBub3Qgc2V0CiAjIENPTkZJR19XQVRDSERPRyBpcyBub3Qgc2V0CitDT05GSUdfU1NCX1BPU1NJQkxFPXkKIAogIwogIyBTb25pY3MgU2lsaWNvbiBCYWNrcGxhbmUKICMKLUNPTkZJR19TU0JfUE9TU0lCTEU9eQogIyBDT05GSUdfU1NCIGlzIG5vdCBzZXQKIAogIwpAQCAtODg2LDE0ICs4OTksNyBAQAogIyBDT05GSUdfUE1JQ19EQTkwM1ggaXMgbm90IHNldAogIyBDT05GSUdfTUZEX1dNODQwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19NRkRfV004MzUwX0kyQyBpcyBub3Qgc2V0Ci0KLSMKLSMgVm9sdGFnZSBhbmQgQ3VycmVudCByZWd1bGF0b3JzCi0jCiAjIENPTkZJR19SRUdVTEFUT1IgaXMgbm90IHNldAotIyBDT05GSUdfUkVHVUxBVE9SX0ZJWEVEX1ZPTFRBR0UgaXMgbm90IHNldAotIyBDT05GSUdfUkVHVUxBVE9SX1ZJUlRVQUxfQ09OU1VNRVIgaXMgbm90IHNldAotIyBDT05GSUdfUkVHVUxBVE9SX0JRMjQwMjIgaXMgbm90IHNldAogCiAjCiAjIE11bHRpbWVkaWEgZGV2aWNlcwpAQCAtMTI1MiwxMSArMTI1OCwxMSBAQAogIyBDT05GSUdfVVNCX1RNQyBpcyBub3Qgc2V0CiAKICMKLSMgTk9URTogVVNCX1NUT1JBR0UgZW5hYmxlcyBTQ1NJLCBhbmQgJ1NDU0kgZGlzayBzdXBwb3J0JworIyBOT1RFOiBVU0JfU1RPUkFHRSBkZXBlbmRzIG9uIFNDU0kgYnV0IEJMS19ERVZfU0QgbWF5IGFsc28gYmUgbmVlZGVkOwogIwogCiAjCi0jIG1heSBhbHNvIGJlIG5lZWRlZDsgc2VlIFVTQl9TVE9SQUdFIEhlbHAgZm9yIG1vcmUgaW5mb3JtYXRpb24KKyMgc2VlIFVTQl9TVE9SQUdFIEhlbHAgZm9yIG1vcmUgaW5mb3JtYXRpb24KICMKIENPTkZJR19VU0JfU1RPUkFHRT15CiAjIENPTkZJR19VU0JfU1RPUkFHRV9ERUJVRyBpcyBub3Qgc2V0CkBAIC0xMzQ4LDYgKzEzNTQsNyBAQAogIyBDT05GSUdfUlRDX0RSVl9NNDFUODAgaXMgbm90IHNldAogIyBDT05GSUdfUlRDX0RSVl9TMzUzOTBBIGlzIG5vdCBzZXQKICMgQ09ORklHX1JUQ19EUlZfRk0zMTMwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfUlg4NTgxIGlzIG5vdCBzZXQKIAogIwogIyBTUEkgUlRDIGRyaXZlcnMKQEAgLTE2MjQsNiArMTYzMSw3IEBACiAjIENPTkZJR19TQU1QTEVTIGlzIG5vdCBzZXQKIENPTkZJR19IQVZFX0FSQ0hfS0dEQj15CiAjIENPTkZJR19LR0RCIGlzIG5vdCBzZXQKK0NPTkZJR19QUklOVF9TVEFDS19ERVBUSD02NAogIyBDT05GSUdfREVCVUdfU1RBQ0tPVkVSRkxPVyBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19TVEFDS19VU0FHRSBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19QQUdFQUxMT0MgaXMgbm90IHNldApAQCAtMTY0OSwxMSArMTY1NywxNiBAQAogIwogIyBDT05GSUdfQ1JZUFRPX0ZJUFMgaXMgbm90IHNldAogQ09ORklHX0NSWVBUT19BTEdBUEk9eQorQ09ORklHX0NSWVBUT19BTEdBUEkyPXkKIENPTkZJR19DUllQVE9fQUVBRD15CitDT05GSUdfQ1JZUFRPX0FFQUQyPXkKIENPTkZJR19DUllQVE9fQkxLQ0lQSEVSPXkKK0NPTkZJR19DUllQVE9fQkxLQ0lQSEVSMj15CiBDT05GSUdfQ1JZUFRPX0hBU0g9eQotQ09ORklHX0NSWVBUT19STkc9eQorQ09ORklHX0NSWVBUT19IQVNIMj15CitDT05GSUdfQ1JZUFRPX1JORzI9eQogQ09ORklHX0NSWVBUT19NQU5BR0VSPXkKK0NPTkZJR19DUllQVE9fTUFOQUdFUjI9eQogIyBDT05GSUdfQ1JZUFRPX0dGMTI4TVVMIGlzIG5vdCBzZXQKICMgQ09ORklHX0NSWVBUT19OVUxMIGlzIG5vdCBzZXQKICMgQ09ORklHX0NSWVBUT19DUllQVEQgaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvODZ4eC9nZWZfc2JjNjEwX2RlZmNvbmZpZyBiL2FyY2gvcG93ZXJwYy9jb25maWdzLzg2eHgvZ2VmX3NiYzYxMF9kZWZjb25maWcKaW5kZXggY2QxZmZhNDQuLjM5MTg3NGMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9jb25maWdzLzg2eHgvZ2VmX3NiYzYxMF9kZWZjb25maWcKKysrIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvODZ4eC9nZWZfc2JjNjEwX2RlZmNvbmZpZwpAQCAtMTE2NCw2ICsxMTY0LDcgQEAKICMgQ09ORklHX1NPRlRfV0FUQ0hET0cgaXMgbm90IHNldAogIyBDT05GSUdfQUxJTTcxMDFfV0RUIGlzIG5vdCBzZXQKICMgQ09ORklHXzh4eHhfV0RUIGlzIG5vdCBzZXQKK0NPTkZJR19HRUZfV0RUPXkKIAogIwogIyBQQ0ktYmFzZWQgV2F0Y2hkb2cgQ2FyZHMKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jb25maWdzL3BwYzY0X2RlZmNvbmZpZyBiL2FyY2gvcG93ZXJwYy9jb25maWdzL3BwYzY0X2RlZmNvbmZpZwppbmRleCAwNjlhZTFiLi5kNDY4NWQxIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvY29uZmlncy9wcGM2NF9kZWZjb25maWcKKysrIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvcHBjNjRfZGVmY29uZmlnCkBAIC0yMTEsMTEgKzIxMSwyOCBAQAogQ09ORklHX1BQQ19QQVNFTUlfSU9NTVU9eQogIyBDT05GSUdfUFBDX1BBU0VNSV9JT01NVV9ETUFfRk9SQ0UgaXMgbm90IHNldAogQ09ORklHX1BQQ19QQVNFTUlfTURJTz15Ci0jIENPTkZJR19QUENfUFMzIGlzIG5vdCBzZXQKK0NPTkZJR19QUENfUFMzPXkKKworIworIyBQUzMgUGxhdGZvcm0gT3B0aW9ucworIworIyBDT05GSUdfUFMzX0FEVkFOQ0VEIGlzIG5vdCBzZXQKK0NPTkZJR19QUzNfSFRBQl9TSVpFPTIwCisjIENPTkZJR19QUzNfRFlOQU1JQ19ETUEgaXMgbm90IHNldAorQ09ORklHX1BTM19WVUFSVD15CitDT05GSUdfUFMzX1BTM0FWPXkKK0NPTkZJR19QUzNfU1lTX01BTkFHRVI9eQorQ09ORklHX1BTM19TVE9SQUdFPW0KK0NPTkZJR19QUzNfRElTSz1tCitDT05GSUdfUFMzX1JPTT1tCitDT05GSUdfUFMzX0ZMQVNIPW0KK0NPTkZJR19QUzNfTFBNPW0KIENPTkZJR19QUENfQ0VMTD15CitDT05GSUdfUFBDX0NFTExfQ09NTU9OPXkKIENPTkZJR19QUENfQ0VMTF9OQVRJVkU9eQogQ09ORklHX1BQQ19JQk1fQ0VMTF9CTEFERT15CiBDT05GSUdfUFBDX0NFTExFQj15CitDT05GSUdfUFBDX0NFTExfUVBBQ0U9eQogCiAjCiAjIENlbGwgQnJvYWRiYW5kIEVuZ2luZSBvcHRpb25zCkBAIC05ODEsNiArOTk4LDkgQEAKIENPTkZJR19USUdPTjM9eQogIyBDT05GSUdfQk5YMiBpcyBub3Qgc2V0CiBDT05GSUdfU1BJREVSX05FVD1tCitDT05GSUdfR0VMSUNfTkVUPW0KK0NPTkZJR19HRUxJQ19XSVJFTEVTUz15CisjIENPTkZJR19HRUxJQ19XSVJFTEVTU19PTERfUFNLX0lOVEVSRkFDRSBpcyBub3Qgc2V0CiAjIENPTkZJR19RTEEzWFhYIGlzIG5vdCBzZXQKICMgQ09ORklHX0FUTDEgaXMgbm90IHNldAogIyBDT05GSUdfQVRMMUUgaXMgbm90IHNldApAQCAtMTM3MCw2ICsxMzkwLDggQEAKICMgQ09ORklHX0ZCX1BNMyBpcyBub3Qgc2V0CiAjIENPTkZJR19GQl9DQVJNSU5FIGlzIG5vdCBzZXQKIENPTkZJR19GQl9JQk1fR1hUNDUwMD15CitDT05GSUdfRkJfUFMzPW0KK0NPTkZJR19GQl9QUzNfREVGQVVMVF9TSVpFX009OQogIyBDT05GSUdfRkJfVklSVFVBTCBpcyBub3Qgc2V0CiAjIENPTkZJR19GQl9NRVRST05PTUUgaXMgbm90IHNldAogQ09ORklHX0JBQ0tMSUdIVF9MQ0RfU1VQUE9SVD15CkBAIC0xNDkyLDYgKzE1MTQsOCBAQAogQ09ORklHX1NORF9QUEM9eQogQ09ORklHX1NORF9QT1dFUk1BQz1tCiBDT05GSUdfU05EX1BPV0VSTUFDX0FVVE9fRFJDPXkKK0NPTkZJR19TTkRfUFMzPW0KK0NPTkZJR19TTkRfUFMzX0RFRkFVTFRfU1RBUlRfREVMQVk9MjAwMAogQ09ORklHX1NORF9BT0E9bQogQ09ORklHX1NORF9BT0FfRkFCUklDX0xBWU9VVD1tCiBDT05GSUdfU05EX0FPQV9PTllYPW0KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9LYnVpbGQgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vS2J1aWxkCmluZGV4IDkyNjg2MDIuLjVhYjdkN2YgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9LYnVpbGQKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL0tidWlsZApAQCAtMzUsNCArMzUsMyBAQAogdW5pZmRlZi15ICs9IHRlcm1pb3MuaAogdW5pZmRlZi15ICs9IHR5cGVzLmgKIHVuaWZkZWYteSArPSB1bmlzdGQuaAotdW5pZmRlZi15ICs9IHN3YWIuaApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2J5dGVvcmRlci5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2J5dGVvcmRlci5oCmluZGV4IDVjY2EyN2EuLmFhNmNjNGYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9ieXRlb3JkZXIuaAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vYnl0ZW9yZGVyLmgKQEAgLTcsOCArNyw2IEBACiAgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KICAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAgKi8KLQotI2luY2x1ZGUgPGFzbS9zd2FiLmg+CiAjaW5jbHVkZSA8bGludXgvYnl0ZW9yZGVyL2JpZ19lbmRpYW4uaD4KIAogI2VuZGlmIC8qIF9BU01fUE9XRVJQQ19CWVRFT1JERVJfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2NlbGwtcG11LmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vY2VsbC1wbXUuaAppbmRleCA4MDY2ZWVkLi5iNGI3MzM4IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vY2VsbC1wbXUuaAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vY2VsbC1wbXUuaApAQCAtMzcsOSArMzcsMTEgQEAKICNkZWZpbmUgQ0JFX1BNX1NUT1BfQVRfTUFYICAgICAgICAgICAgICAgICAweDQwMDAwMDAwCiAjZGVmaW5lIENCRV9QTV9UUkFDRV9NT0RFX0dFVChwbV9jb250cm9sKSAgKCgocG1fY29udHJvbCkgPj4gMjgpICYgMHgzKQogI2RlZmluZSBDQkVfUE1fVFJBQ0VfTU9ERV9TRVQobW9kZSkgICAgICAgICgoKG1vZGUpICAmIDB4MykgPDwgMjgpCisjZGVmaW5lIENCRV9QTV9UUkFDRV9CVUZfT1ZGTFcoYml0KSAgICAgICAgKCgoYml0KSAmIDB4MSkgPDwgMTcpCiAjZGVmaW5lIENCRV9QTV9DT1VOVF9NT0RFX1NFVChjb3VudCkgICAgICAgKCgoY291bnQpICYgMHgzKSA8PCAxOCkKICNkZWZpbmUgQ0JFX1BNX0ZSRUVaRV9BTExfQ1RSUyAgICAgICAgICAgICAweDAwMTAwMDAwCiAjZGVmaW5lIENCRV9QTV9FTkFCTEVfRVhUX1RSQUNFICAgICAgICAgICAgMHgwMDAwODAwMAorI2RlZmluZSBDQkVfUE1fU1BVX0FERFJfVFJBQ0VfU0VUKG1zaykgICAgICgoKG1zaykgJiAweDMpIDw8IDkpCiAKIC8qIE1hY3JvcyBmb3IgdGhlIHRyYWNlX2FkZHJlc3MgcmVnaXN0ZXIuICovCiAjZGVmaW5lIENCRV9QTV9UUkFDRV9CVUZfRlVMTCAgICAgICAgICAgICAgMHgwMDAwMDgwMApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2lvY3Rscy5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2lvY3Rscy5oCmluZGV4IDI3OWE2MjIuLjE4NDIxODZkIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vaW9jdGxzLmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2lvY3Rscy5oCkBAIC04OSw2ICs4OSw4IEBACiAjZGVmaW5lIFRJT0NTQlJLCTB4NTQyNyAgLyogQlNEIGNvbXBhdGliaWxpdHkgKi8KICNkZWZpbmUgVElPQ0NCUksJMHg1NDI4ICAvKiBCU0QgY29tcGF0aWJpbGl0eSAqLwogI2RlZmluZSBUSU9DR1NJRAkweDU0MjkgIC8qIFJldHVybiB0aGUgc2Vzc2lvbiBJRCBvZiBGRCAqLworI2RlZmluZSBUSU9DR1JTNDg1CTB4NTQyZQorI2RlZmluZSBUSU9DU1JTNDg1CTB4NTQyZgogI2RlZmluZSBUSU9DR1BUTglfSU9SKCdUJywweDMwLCB1bnNpZ25lZCBpbnQpIC8qIEdldCBQdHkgTnVtYmVyIChvZiBwdHktbXV4IGRldmljZSkgKi8KICNkZWZpbmUgVElPQ1NQVExDSwlfSU9XKCdUJywweDMxLCBpbnQpICAvKiBMb2NrL3VubG9jayBQdHkgKi8KIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2tleGVjLmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20va2V4ZWMuaAppbmRleCA2ZGJmZmM5Li43ZTA2YjQzIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20va2V4ZWMuaAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20va2V4ZWMuaApAQCAtNDgsNjMgKzQ4LDggQEAKIHsKIAlpZiAob2xkcmVncykKIAkJbWVtY3B5KG5ld3JlZ3MsIG9sZHJlZ3MsIHNpemVvZigqbmV3cmVncykpOwotI2lmZGVmIF9fcG93ZXJwYzY0X18KLQllbHNlIHsKLQkJLyogRklYTUUgTWVyZ2UgdGhpcyB3aXRoIHhtb25fc2F2ZV9yZWdzID8/ICovCi0JCXVuc2lnbmVkIGxvbmcgdG1wMSwgdG1wMjsKLQkJX19hc21fXyBfX3ZvbGF0aWxlX18gKAotCQkJInN0ZCAgICAwLDAoJTIpXG4iCi0JCQkic3RkICAgIDEsOCglMilcbiIKLQkJCSJzdGQgICAgMiwxNiglMilcbiIKLQkJCSJzdGQgICAgMywyNCglMilcbiIKLQkJCSJzdGQgICAgNCwzMiglMilcbiIKLQkJCSJzdGQgICAgNSw0MCglMilcbiIKLQkJCSJzdGQgICAgNiw0OCglMilcbiIKLQkJCSJzdGQgICAgNyw1NiglMilcbiIKLQkJCSJzdGQgICAgOCw2NCglMilcbiIKLQkJCSJzdGQgICAgOSw3MiglMilcbiIKLQkJCSJzdGQgICAgMTAsODAoJTIpXG4iCi0JCQkic3RkICAgIDExLDg4KCUyKVxuIgotCQkJInN0ZCAgICAxMiw5NiglMilcbiIKLQkJCSJzdGQgICAgMTMsMTA0KCUyKVxuIgotCQkJInN0ZCAgICAxNCwxMTIoJTIpXG4iCi0JCQkic3RkICAgIDE1LDEyMCglMilcbiIKLQkJCSJzdGQgICAgMTYsMTI4KCUyKVxuIgotCQkJInN0ZCAgICAxNywxMzYoJTIpXG4iCi0JCQkic3RkICAgIDE4LDE0NCglMilcbiIKLQkJCSJzdGQgICAgMTksMTUyKCUyKVxuIgotCQkJInN0ZCAgICAyMCwxNjAoJTIpXG4iCi0JCQkic3RkICAgIDIxLDE2OCglMilcbiIKLQkJCSJzdGQgICAgMjIsMTc2KCUyKVxuIgotCQkJInN0ZCAgICAyMywxODQoJTIpXG4iCi0JCQkic3RkICAgIDI0LDE5MiglMilcbiIKLQkJCSJzdGQgICAgMjUsMjAwKCUyKVxuIgotCQkJInN0ZCAgICAyNiwyMDgoJTIpXG4iCi0JCQkic3RkICAgIDI3LDIxNiglMilcbiIKLQkJCSJzdGQgICAgMjgsMjI0KCUyKVxuIgotCQkJInN0ZCAgICAyOSwyMzIoJTIpXG4iCi0JCQkic3RkICAgIDMwLDI0MCglMilcbiIKLQkJCSJzdGQgICAgMzEsMjQ4KCUyKVxuIgotCQkJIm1mbXNyICAlMFxuIgotCQkJInN0ZCAgICAlMCwgMjY0KCUyKVxuIgotCQkJIm1mY3RyICAlMFxuIgotCQkJInN0ZCAgICAlMCwgMjgwKCUyKVxuIgotCQkJIm1mbHIgICAlMFxuIgotCQkJInN0ZCAgICAlMCwgMjg4KCUyKVxuIgotCQkJImJsICAgICAxZlxuIgotCQkiMTogICAgIG1mbHIgICAlMVxuIgotCQkJInN0ZCAgICAlMSwgMjU2KCUyKVxuIgotCQkJIm10bHIgICAlMFxuIgotCQkJIm1meGVyICAlMFxuIgotCQkJInN0ZCAgICAlMCwgMjk2KCUyKVxuIgotCQkJOiAiPSZyIiAodG1wMSksICI9JnIiICh0bXAyKQotCQkJOiAiYiIgKG5ld3JlZ3MpCi0JCQk6ICJtZW1vcnkiKTsKLQl9Ci0jZWxzZQogCWVsc2UKIAkJcHBjX3NhdmVfcmVncyhuZXdyZWdzKTsKLSNlbmRpZiAvKiBfX3Bvd2VycGM2NF9fICovCiB9CiAKIGV4dGVybiB2b2lkIGtleGVjX3NtcF93YWl0KHZvaWQpOwkvKiBnZXQgYW5kIGNsZWFyIG5hY2EgcGh5c2lkLCB3YWl0IGZvcgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL29wcm9maWxlX2ltcGwuaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9vcHJvZmlsZV9pbXBsLmgKaW5kZXggOTUwMzVjNi4uNjM5ZGM5NiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL29wcm9maWxlX2ltcGwuaAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vb3Byb2ZpbGVfaW1wbC5oCkBAIC0zMiw2ICszMiwxMiBAQAogCXVuc2lnbmVkIGxvbmcgbW1jcjA7CiAJdW5zaWduZWQgbG9uZyBtbWNyMTsKIAl1bnNpZ25lZCBsb25nIG1tY3JhOworI2lmZGVmIENPTkZJR19PUFJPRklMRV9DRUxMCisJLyogUmVnaXN0ZXIgZm9yIG9wcm9maWxlIHVzZXIgdG9vbCB0byBjaGVjayBjZWxsIGtlcm5lbCBwcm9maWxpbmcKKwkgKiBzdXBvcnQuCisJICovCisJdW5zaWduZWQgbG9uZyBjZWxsX3N1cHBvcnQ7CisjZW5kaWYKICNlbmRpZgogCXVuc2lnbmVkIGxvbmcgZW5hYmxlX2tlcm5lbDsKIAl1bnNpZ25lZCBsb25nIGVuYWJsZV91c2VyOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3BzMy5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3BzMy5oCmluZGV4IGNmZjMwYzAuLjY3ZjE4MTIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9wczMuaAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcHMzLmgKQEAgLTEwMywxMCArMTAzLDEwIEBACiAJaW50ICgqbWFwKShzdHJ1Y3QgcHMzX2RtYV9yZWdpb24gKiwKIAkJICAgdW5zaWduZWQgbG9uZyB2aXJ0X2FkZHIsCiAJCSAgIHVuc2lnbmVkIGxvbmcgbGVuLAotCQkgICB1bnNpZ25lZCBsb25nICpidXNfYWRkciwKKwkJICAgZG1hX2FkZHJfdCAqYnVzX2FkZHIsCiAJCSAgIHU2NCBpb3B0ZV9wcCk7CiAJaW50ICgqdW5tYXApKHN0cnVjdCBwczNfZG1hX3JlZ2lvbiAqLAotCQkgICAgIHVuc2lnbmVkIGxvbmcgYnVzX2FkZHIsCisJCSAgICAgZG1hX2FkZHJfdCBidXNfYWRkciwKIAkJICAgICB1bnNpZ25lZCBsb25nIGxlbik7CiB9OwogLyoqCkBAIC0xMjQsOSArMTI0LDkgQEAKIGludCBwczNfZG1hX3JlZ2lvbl9jcmVhdGUoc3RydWN0IHBzM19kbWFfcmVnaW9uICpyKTsKIGludCBwczNfZG1hX3JlZ2lvbl9mcmVlKHN0cnVjdCBwczNfZG1hX3JlZ2lvbiAqcik7CiBpbnQgcHMzX2RtYV9tYXAoc3RydWN0IHBzM19kbWFfcmVnaW9uICpyLCB1bnNpZ25lZCBsb25nIHZpcnRfYWRkciwKLQl1bnNpZ25lZCBsb25nIGxlbiwgdW5zaWduZWQgbG9uZyAqYnVzX2FkZHIsCisJdW5zaWduZWQgbG9uZyBsZW4sIGRtYV9hZGRyX3QgKmJ1c19hZGRyLAogCXU2NCBpb3B0ZV9wcCk7Ci1pbnQgcHMzX2RtYV91bm1hcChzdHJ1Y3QgcHMzX2RtYV9yZWdpb24gKnIsIHVuc2lnbmVkIGxvbmcgYnVzX2FkZHIsCitpbnQgcHMzX2RtYV91bm1hcChzdHJ1Y3QgcHMzX2RtYV9yZWdpb24gKnIsIGRtYV9hZGRyX3QgYnVzX2FkZHIsCiAJdW5zaWduZWQgbG9uZyBsZW4pOwogCiAvKiBtbWlvIHJvdXRpbmVzICovCkBAIC0zMjAsNiArMzIwLDcgQEAKIAogZW51bSBwczNfbWF0Y2hfc3ViX2lkIHsKIAlQUzNfTUFUQ0hfU1VCX0lEX0dQVV9GQgkJPSAxLAorCVBTM19NQVRDSF9TVUJfSURfR1BVX1JBTURJU0sJPSAyLAogfTsKIAogI2RlZmluZSBQUzNfTU9EVUxFX0FMSUFTX0VIQ0kJCSJwczM6MTowIgpAQCAtMzMyLDYgKzMzMyw3IEBACiAjZGVmaW5lIFBTM19NT0RVTEVfQUxJQVNfU1RPUl9GTEFTSAkicHMzOjg6MCIKICNkZWZpbmUgUFMzX01PRFVMRV9BTElBU19TT1VORAkJInBzMzo5OjAiCiAjZGVmaW5lIFBTM19NT0RVTEVfQUxJQVNfR1BVX0ZCCQkicHMzOjEwOjEiCisjZGVmaW5lIFBTM19NT0RVTEVfQUxJQVNfR1BVX1JBTURJU0sJInBzMzoxMDoyIgogI2RlZmluZSBQUzNfTU9EVUxFX0FMSUFTX0xQTQkJInBzMzoxMTowIgogCiBlbnVtIHBzM19zeXN0ZW1fYnVzX2RldmljZV90eXBlIHsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9xZS5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3FlLmgKaW5kZXggZWRlZTE1ZC4uMjcwMTc1MyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3FlLmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3FlLmgKQEAgLTE3LDYgKzE3LDggQEAKICNpZmRlZiBfX0tFUk5FTF9fCiAKICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8YXNtL2NwbS5oPgogI2luY2x1ZGUgPGFzbS9pbW1hcF9xZS5oPgogCkBAIC04NCw3ICs4NiwxMSBAQAogZXh0ZXJuIHNwaW5sb2NrX3QgY214Z2NyX2xvY2s7CiAKIC8qIEV4cG9ydCBRRSBjb21tb24gb3BlcmF0aW9ucyAqLworI2lmZGVmIENPTkZJR19RVUlDQ19FTkdJTkUKIGV4dGVybiB2b2lkIF9faW5pdCBxZV9yZXNldCh2b2lkKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgcWVfcmVzZXQodm9pZCkge30KKyNlbmRpZgogCiAvKiBRRSBQSU8gKi8KICNkZWZpbmUgUUVfUElPX1BJTlMgMzIKQEAgLTEwMSwxNiArMTA3LDQzIEBACiAjZW5kaWYKIH07CiAKLWV4dGVybiBpbnQgcGFyX2lvX2luaXQoc3RydWN0IGRldmljZV9ub2RlICpucCk7Ci1leHRlcm4gaW50IHBhcl9pb19vZl9jb25maWcoc3RydWN0IGRldmljZV9ub2RlICpucCk7CiAjZGVmaW5lIFFFX1BJT19ESVJfSU4JMgogI2RlZmluZSBRRV9QSU9fRElSX09VVAkxCiBleHRlcm4gdm9pZCBfX3Bhcl9pb19jb25maWdfcGluKHN0cnVjdCBxZV9waW9fcmVncyBfX2lvbWVtICpwYXJfaW8sIHU4IHBpbiwKIAkJCQlpbnQgZGlyLCBpbnQgb3Blbl9kcmFpbiwgaW50IGFzc2lnbm1lbnQsCiAJCQkJaW50IGhhc19pcnEpOworI2lmZGVmIENPTkZJR19RVUlDQ19FTkdJTkUKK2V4dGVybiBpbnQgcGFyX2lvX2luaXQoc3RydWN0IGRldmljZV9ub2RlICpucCk7CitleHRlcm4gaW50IHBhcl9pb19vZl9jb25maWcoc3RydWN0IGRldmljZV9ub2RlICpucCk7CiBleHRlcm4gaW50IHBhcl9pb19jb25maWdfcGluKHU4IHBvcnQsIHU4IHBpbiwgaW50IGRpciwgaW50IG9wZW5fZHJhaW4sCiAJCQkgICAgIGludCBhc3NpZ25tZW50LCBpbnQgaGFzX2lycSk7CiBleHRlcm4gaW50IHBhcl9pb19kYXRhX3NldCh1OCBwb3J0LCB1OCBwaW4sIHU4IHZhbCk7CisjZWxzZQorc3RhdGljIGlubGluZSBpbnQgcGFyX2lvX2luaXQoc3RydWN0IGRldmljZV9ub2RlICpucCkgeyByZXR1cm4gLUVOT1NZUzsgfQorc3RhdGljIGlubGluZSBpbnQgcGFyX2lvX29mX2NvbmZpZyhzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKSB7IHJldHVybiAtRU5PU1lTOyB9CitzdGF0aWMgaW5saW5lIGludCBwYXJfaW9fY29uZmlnX3Bpbih1OCBwb3J0LCB1OCBwaW4sIGludCBkaXIsIGludCBvcGVuX2RyYWluLAorCQlpbnQgYXNzaWdubWVudCwgaW50IGhhc19pcnEpIHsgcmV0dXJuIC1FTk9TWVM7IH0KK3N0YXRpYyBpbmxpbmUgaW50IHBhcl9pb19kYXRhX3NldCh1OCBwb3J0LCB1OCBwaW4sIHU4IHZhbCkgeyByZXR1cm4gLUVOT1NZUzsgfQorI2VuZGlmIC8qIENPTkZJR19RVUlDQ19FTkdJTkUgKi8KKworLyoKKyAqIFBpbiBtdWx0aXBsZXhpbmcgZnVuY3Rpb25zLgorICovCitzdHJ1Y3QgcWVfcGluOworI2lmZGVmIENPTkZJR19RRV9HUElPCitleHRlcm4gc3RydWN0IHFlX3BpbiAqcWVfcGluX3JlcXVlc3Qoc3RydWN0IGRldmljZV9ub2RlICpucCwgaW50IGluZGV4KTsKK2V4dGVybiB2b2lkIHFlX3Bpbl9mcmVlKHN0cnVjdCBxZV9waW4gKnFlX3Bpbik7CitleHRlcm4gdm9pZCBxZV9waW5fc2V0X2dwaW8oc3RydWN0IHFlX3BpbiAqcWVfcGluKTsKK2V4dGVybiB2b2lkIHFlX3Bpbl9zZXRfZGVkaWNhdGVkKHN0cnVjdCBxZV9waW4gKnBpbik7CisjZWxzZQorc3RhdGljIGlubGluZSBzdHJ1Y3QgcWVfcGluICpxZV9waW5fcmVxdWVzdChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLCBpbnQgaW5kZXgpCit7CisJcmV0dXJuIEVSUl9QVFIoLUVOT1NZUyk7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgcWVfcGluX2ZyZWUoc3RydWN0IHFlX3BpbiAqcWVfcGluKSB7fQorc3RhdGljIGlubGluZSB2b2lkIHFlX3Bpbl9zZXRfZ3BpbyhzdHJ1Y3QgcWVfcGluICpxZV9waW4pIHt9CitzdGF0aWMgaW5saW5lIHZvaWQgcWVfcGluX3NldF9kZWRpY2F0ZWQoc3RydWN0IHFlX3BpbiAqcGluKSB7fQorI2VuZGlmIC8qIENPTkZJR19RRV9HUElPICovCiAKIC8qIFFFIGludGVybmFsIEFQSSAqLwogaW50IHFlX2lzc3VlX2NtZCh1MzIgY21kLCB1MzIgZGV2aWNlLCB1OCBtY25fcHJvdG9jb2wsIHUzMiBjbWRfaW5wdXQpOwpAQCAtNTkxLDcgKzYyNCw3IEBACiAjZGVmaW5lIFVDQ19HRVRIX1VDQ0VfUlhGMSAgICAgIDB4MDAwMDAwMDIKICNkZWZpbmUgVUNDX0dFVEhfVUNDRV9SWEYwICAgICAgMHgwMDAwMDAwMQogCi0vKiBVUFNNUiwgd2hlbiB1c2VkIGFzIGEgVUFSVCAqLworLyogVUNDIFByb3RvY29sIFNwZWNpZmljIE1vZGUgUmVnaXN0ZXIgKFVQU01SKSwgd2hlbiB1c2VkIGZvciBVQVJUICovCiAjZGVmaW5lIFVDQ19VQVJUX1VQU01SX0ZMQwkJMHg4MDAwCiAjZGVmaW5lIFVDQ19VQVJUX1VQU01SX1NMCQkweDQwMDAKICNkZWZpbmUgVUNDX1VBUlRfVVBTTVJfQ0xfTUFTSwkJMHgzMDAwCkBAIC02MTksNiArNjUyLDIzIEBACiAjZGVmaW5lIFVDQ19VQVJUX1VQU01SX1RQTV9FVkVOCQkweDAwMDIKICNkZWZpbmUgVUNDX1VBUlRfVVBTTVJfVFBNX0hJR0gJCTB4MDAwMwogCisvKiBVQ0MgUHJvdG9jb2wgU3BlY2lmaWMgTW9kZSBSZWdpc3RlciAoVVBTTVIpLCB3aGVuIHVzZWQgZm9yIEV0aGVybmV0ICovCisjZGVmaW5lIFVDQ19HRVRIX1VQU01SX0ZURkUgICAgIDB4ODAwMDAwMDAKKyNkZWZpbmUgVUNDX0dFVEhfVVBTTVJfUFRQRSAgICAgMHg0MDAwMDAwMAorI2RlZmluZSBVQ0NfR0VUSF9VUFNNUl9FQ00gICAgICAweDA0MDAwMDAwCisjZGVmaW5lIFVDQ19HRVRIX1VQU01SX0hTRSAgICAgIDB4MDIwMDAwMDAKKyNkZWZpbmUgVUNDX0dFVEhfVVBTTVJfUFJPICAgICAgMHgwMDQwMDAwMAorI2RlZmluZSBVQ0NfR0VUSF9VUFNNUl9DQVAgICAgICAweDAwMjAwMDAwCisjZGVmaW5lIFVDQ19HRVRIX1VQU01SX1JTSCAgICAgIDB4MDAxMDAwMDAKKyNkZWZpbmUgVUNDX0dFVEhfVVBTTVJfUlBNICAgICAgMHgwMDA4MDAwMAorI2RlZmluZSBVQ0NfR0VUSF9VUFNNUl9SMTBNICAgICAweDAwMDQwMDAwCisjZGVmaW5lIFVDQ19HRVRIX1VQU01SX1JMUEIgICAgIDB4MDAwMjAwMDAKKyNkZWZpbmUgVUNDX0dFVEhfVVBTTVJfVEJJTSAgICAgMHgwMDAxMDAwMAorI2RlZmluZSBVQ0NfR0VUSF9VUFNNUl9SRVMxICAgICAweDAwMDAyMDAwCisjZGVmaW5lIFVDQ19HRVRIX1VQU01SX1JNTSAgICAgIDB4MDAwMDEwMDAKKyNkZWZpbmUgVUNDX0dFVEhfVVBTTVJfQ0FNICAgICAgMHgwMDAwMDQwMAorI2RlZmluZSBVQ0NfR0VUSF9VUFNNUl9CUk8gICAgICAweDAwMDAwMjAwCisKIC8qIFVDQyBUcmFuc21pdCBPbiBEZW1hbmQgUmVnaXN0ZXIgKFVUT0RSKSAqLwogI2RlZmluZSBVQ0NfU0xPV19UT0QJMHg4MDAwCiAjZGVmaW5lIFVDQ19GQVNUX1RPRAkweDgwMDAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9xZV9pYy5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3FlX2ljLmgKaW5kZXggNTZhNzc0NS4uY2Y1MTk2NiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3FlX2ljLmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3FlX2ljLmgKQEAgLTE3LDYgKzE3LDkgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogCitzdHJ1Y3QgZGV2aWNlX25vZGU7CitzdHJ1Y3QgcWVfaWM7CisKICNkZWZpbmUgTlVNX09GX1FFX0lDX0dST1VQUwk2CiAKIC8qIEZsYWdzIHdoZW4gd2UgaW5pdCB0aGUgUUUgSUMgKi8KQEAgLTU0LDE3ICs1NywyNyBAQAogCVFFX0lDX0dSUF9SSVNDQgkJLyogUUUgaW50ZXJydXB0IGNvbnRyb2xsZXIgUklTQyBncm91cCBCICovCiB9OwogCisjaWZkZWYgQ09ORklHX1FVSUNDX0VOR0lORQogdm9pZCBxZV9pY19pbml0KHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSwgdW5zaWduZWQgaW50IGZsYWdzLAogCQl2b2lkICgqbG93X2hhbmRsZXIpKHVuc2lnbmVkIGludCBpcnEsIHN0cnVjdCBpcnFfZGVzYyAqZGVzYyksCiAJCXZvaWQgKCpoaWdoX2hhbmRsZXIpKHVuc2lnbmVkIGludCBpcnEsIHN0cnVjdCBpcnFfZGVzYyAqZGVzYykpOwordW5zaWduZWQgaW50IHFlX2ljX2dldF9sb3dfaXJxKHN0cnVjdCBxZV9pYyAqcWVfaWMpOwordW5zaWduZWQgaW50IHFlX2ljX2dldF9oaWdoX2lycShzdHJ1Y3QgcWVfaWMgKnFlX2ljKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgcWVfaWNfaW5pdChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUsIHVuc2lnbmVkIGludCBmbGFncywKKwkJdm9pZCAoKmxvd19oYW5kbGVyKSh1bnNpZ25lZCBpbnQgaXJxLCBzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MpLAorCQl2b2lkICgqaGlnaF9oYW5kbGVyKSh1bnNpZ25lZCBpbnQgaXJxLCBzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MpKQore30KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHFlX2ljX2dldF9sb3dfaXJxKHN0cnVjdCBxZV9pYyAqcWVfaWMpCit7IHJldHVybiAwOyB9CitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBxZV9pY19nZXRfaGlnaF9pcnEoc3RydWN0IHFlX2ljICpxZV9pYykKK3sgcmV0dXJuIDA7IH0KKyNlbmRpZiAvKiBDT05GSUdfUVVJQ0NfRU5HSU5FICovCisKIHZvaWQgcWVfaWNfc2V0X2hpZ2hlc3RfcHJpb3JpdHkodW5zaWduZWQgaW50IHZpcnEsIGludCBoaWdoKTsKIGludCBxZV9pY19zZXRfcHJpb3JpdHkodW5zaWduZWQgaW50IHZpcnEsIHVuc2lnbmVkIGludCBwcmlvcml0eSk7CiBpbnQgcWVfaWNfc2V0X2hpZ2hfcHJpb3JpdHkodW5zaWduZWQgaW50IHZpcnEsIHVuc2lnbmVkIGludCBwcmlvcml0eSwgaW50IGhpZ2gpOwogCi1zdHJ1Y3QgcWVfaWM7Ci11bnNpZ25lZCBpbnQgcWVfaWNfZ2V0X2xvd19pcnEoc3RydWN0IHFlX2ljICpxZV9pYyk7Ci11bnNpZ25lZCBpbnQgcWVfaWNfZ2V0X2hpZ2hfaXJxKHN0cnVjdCBxZV9pYyAqcWVfaWMpOwotCiBzdGF0aWMgaW5saW5lIHZvaWQgcWVfaWNfY2FzY2FkZV9sb3dfaXBpYyh1bnNpZ25lZCBpbnQgaXJxLAogCQkJCQkgIHN0cnVjdCBpcnFfZGVzYyAqZGVzYykKIHsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9ydGFzLmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcnRhcy5oCmluZGV4IGUwMTc1YmUuLjBhYTAzMTUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9ydGFzLmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3J0YXMuaApAQCAtMTgsNyArMTgsNyBAQAogICovCiAKICNkZWZpbmUgUlRBU19VTktOT1dOX1NFUlZJQ0UgKC0xKQotI2RlZmluZSBSVEFTX0lOU1RBTlRJQVRFX01BWCAoMVVMPDwzMCkgLyogRG9uJ3QgaW5zdGFudGlhdGUgcnRhcyBhdC9hYm92ZSB0aGlzIHZhbHVlICovCisjZGVmaW5lIFJUQVNfSU5TVEFOVElBVEVfTUFYICgxVUxMPDwzMCkgLyogRG9uJ3QgaW5zdGFudGlhdGUgcnRhcyBhdC9hYm92ZSB0aGlzIHZhbHVlICovCiAKIC8qIEJ1ZmZlciBzaXplIGZvciBwcGNfcnRhcyBzeXN0ZW0gY2FsbC4gKi8KICNkZWZpbmUgUlRBU19STU9CVUZfTUFYICg2NCAqIDEwMjQpCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vc3B1LmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vc3B1LmgKaW5kZXggOGIyZWIwNC4uMGFiOGQ4NjkgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9zcHUuaAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vc3B1LmgKQEAgLTEyOCw3ICsxMjgsNyBAQAogCWludCBudW1iZXI7CiAJdW5zaWduZWQgaW50IGlycXNbM107CiAJdTMyIG5vZGU7Ci0JdTY0IGZsYWdzOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdTY0IGNsYXNzXzBfcGVuZGluZzsKIAl1NjQgY2xhc3NfMF9kYXI7CiAJdTY0IGNsYXNzXzFfZGFyOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3N5c3RibC5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3N5c3RibC5oCmluZGV4IDgwM2RlZjIzLi43MjM1M2Y2IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vc3lzdGJsLmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3N5c3RibC5oCkBAIC05Miw3ICs5Miw3IEBACiBTWVNDQUxMKHVzZWxpYikKIFNZU0NBTEwoc3dhcG9uKQogU1lTQ0FMTChyZWJvb3QpCi1TWVNYKHN5c19uaV9zeXNjYWxsLGNvbXBhdF9zeXNfb2xkX3JlYWRkaXIsb2xkX3JlYWRkaXIpCitTWVNYKHN5c19uaV9zeXNjYWxsLGNvbXBhdF9zeXNfb2xkX3JlYWRkaXIsc3lzX29sZF9yZWFkZGlyKQogU1lTQ0FMTF9TUFUobW1hcCkKIFNZU0NBTExfU1BVKG11bm1hcCkKIFNZU0NBTExfU1BVKHRydW5jYXRlKQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3R5cGVzLmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vdHlwZXMuaAppbmRleCBjMDA0YzEzLi43Y2UyN2E1IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vdHlwZXMuaAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vdHlwZXMuaApAQCAtMSw3ICsxLDEyIEBACiAjaWZuZGVmIF9BU01fUE9XRVJQQ19UWVBFU19ICiAjZGVmaW5lIF9BU01fUE9XRVJQQ19UWVBFU19ICiAKLSNpZmRlZiBfX3Bvd2VycGM2NF9fCisvKgorICogVGhpcyBpcyBoZXJlIGJlY2F1c2Ugd2UgdXNlZCB0byB1c2UgbDY0IGZvciA2NGJpdCBwb3dlcnBjCisgKiBhbmQgd2UgZG9uJ3Qgd2FudCB0byBpbXBhY3QgdXNlciBtb2RlIHdpdGggb3VyIGNoYW5nZSB0byBsbDY0CisgKiBpbiB0aGUga2VybmVsLgorICovCisjaWYgZGVmaW5lZChfX3Bvd2VycGM2NF9fKSAmJiAhZGVmaW5lZChfX0tFUk5FTF9fKQogIyBpbmNsdWRlIDxhc20tZ2VuZXJpYy9pbnQtbDY0Lmg+CiAjZWxzZQogIyBpbmNsdWRlIDxhc20tZ2VuZXJpYy9pbnQtbGw2NC5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9NYWtlZmlsZSBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvTWFrZWZpbGUKaW5kZXggMTMwOGE4Ni4uOGQxYTQxOSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9NYWtlZmlsZQorKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL01ha2VmaWxlCkBAIC0yOSw3ICsyOSw3IEBACiBvYmoteQkJCQk6PSBjcHV0YWJsZS5vIHB0cmFjZS5vIHN5c2NhbGxzLm8gXAogCQkJCSAgIGlycS5vIGFsaWduLm8gc2lnbmFsXzMyLm8gcG1jLm8gdmRzby5vIFwKIAkJCQkgICBpbml0X3Rhc2subyBwcm9jZXNzLm8gc3lzdGJsLm8gaWRsZS5vIFwKLQkJCQkgICBzaWduYWwubyBzeXNmcy5vCisJCQkJICAgc2lnbmFsLm8gc3lzZnMubyBjYWNoZWluZm8ubwogb2JqLXkJCQkJKz0gdmRzbzMyLwogb2JqLSQoQ09ORklHX1BQQzY0KQkJKz0gc2V0dXBfNjQubyBzeXNfcHBjMzIubyBcCiAJCQkJICAgc2lnbmFsXzY0Lm8gcHRyYWNlMzIubyBcCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL2FzbS1vZmZzZXRzLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL2FzbS1vZmZzZXRzLmMKaW5kZXggOTkzN2ZlNC4uMTllZTQ5MSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9hc20tb2Zmc2V0cy5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvYXNtLW9mZnNldHMuYwpAQCAtNTYsNiArNTYsMTAgQEAKICNpbmNsdWRlICJoZWFkX2Jvb2tlLmgiCiAjZW5kaWYKIAorI2lmIGRlZmluZWQoQ09ORklHX0ZTTF9CT09LRSkKKyNpbmNsdWRlICIuLi9tbS9tbXVfZGVjbC5oIgorI2VuZGlmCisKIGludCBtYWluKHZvaWQpCiB7CiAJREVGSU5FKFRIUkVBRCwgb2Zmc2V0b2Yoc3RydWN0IHRhc2tfc3RydWN0LCB0aHJlYWQpKTsKQEAgLTM4Miw2ICszODYsOSBAQAogCURFRklORShQR0RfVF9MT0cyLCBQR0RfVF9MT0cyKTsKIAlERUZJTkUoUFRFX1RfTE9HMiwgUFRFX1RfTE9HMik7CiAjZW5kaWYKKyNpZmRlZiBDT05GSUdfRlNMX0JPT0tFCisJREVGSU5FKFRMQkNBTV9TSVpFLCBzaXplb2Yoc3RydWN0IHRsYmNhbSkpOworI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfS1ZNX0VYSVRfVElNSU5HCiAJREVGSU5FKFZDUFVfVElNSU5HX0VYSVRfVEJVLCBvZmZzZXRvZihzdHJ1Y3Qga3ZtX3ZjcHUsCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL2NhY2hlaW5mby5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9jYWNoZWluZm8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjM3YjFkCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9jYWNoZWluZm8uYwpAQCAtMCwwICsxLDgzNyBAQAorLyoKKyAqIFByb2Nlc3NvciBjYWNoZSBpbmZvcm1hdGlvbiBtYWRlIGF2YWlsYWJsZSB0byB1c2Vyc3BhY2UgdmlhIHN5c2ZzOworICogaW50ZW5kZWQgdG8gYmUgY29tcGF0aWJsZSB3aXRoIHg4NiBpbnRlbF9jYWNoZWluZm8gaW1wbGVtZW50YXRpb24uCisgKgorICogQ29weXJpZ2h0IDIwMDggSUJNIENvcnBvcmF0aW9uCisgKiBBdXRob3I6IE5hdGhhbiBMeW5jaAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NwdS5oPgorI2luY2x1ZGUgPGxpbnV4L2NwdW1hc2suaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgva29iamVjdC5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvcGVyY3B1Lmg+CisjaW5jbHVkZSA8YXNtL3Byb20uaD4KKworI2luY2x1ZGUgImNhY2hlaW5mby5oIgorCisvKiBwZXItY3B1IG9iamVjdCBmb3IgdHJhY2tpbmc6CisgKiAtIGEgImNhY2hlIiBrb2JqZWN0IGZvciB0aGUgdG9wLWxldmVsIGRpcmVjdG9yeQorICogLSBhIGxpc3Qgb2YgImluZGV4IiBvYmplY3RzIHJlcHJlc2VudGluZyB0aGUgY3B1J3MgbG9jYWwgY2FjaGUgaGllcmFyY2h5CisgKi8KK3N0cnVjdCBjYWNoZV9kaXIgeworCXN0cnVjdCBrb2JqZWN0ICprb2JqOyAvKiBiYXJlIChub3QgZW1iZWRkZWQpIGtvYmplY3QgZm9yIGNhY2hlCisJCQkgICAgICAgKiBkaXJlY3RvcnkgKi8KKwlzdHJ1Y3QgY2FjaGVfaW5kZXhfZGlyICppbmRleDsgLyogbGlzdCBvZiBpbmRleCBvYmplY3RzICovCit9OworCisvKiAiaW5kZXgiIG9iamVjdDogZWFjaCBjcHUncyBjYWNoZSBkaXJlY3RvcnkgaGFzIGFuIGluZGV4CisgKiBzdWJkaXJlY3RvcnkgY29ycmVzcG9uZGluZyB0byBhIGNhY2hlIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhlCisgKiBjcHUuICBUaGlzIG9iamVjdCdzIGxpZmV0aW1lIGlzIG1hbmFnZWQgdmlhIHRoZSBlbWJlZGRlZCBrb2JqZWN0LgorICovCitzdHJ1Y3QgY2FjaGVfaW5kZXhfZGlyIHsKKwlzdHJ1Y3Qga29iamVjdCBrb2JqOworCXN0cnVjdCBjYWNoZV9pbmRleF9kaXIgKm5leHQ7IC8qIG5leHQgaW5kZXggaW4gcGFyZW50IGRpcmVjdG9yeSAqLworCXN0cnVjdCBjYWNoZSAqY2FjaGU7Cit9OworCisvKiBUZW1wbGF0ZSBmb3IgZGV0ZXJtaW5pbmcgd2hpY2ggT0YgcHJvcGVydGllcyB0byBxdWVyeSBmb3IgYSBnaXZlbgorICogY2FjaGUgdHlwZSAqLworc3RydWN0IGNhY2hlX3R5cGVfaW5mbyB7CisJY29uc3QgY2hhciAqbmFtZTsKKwljb25zdCBjaGFyICpzaXplX3Byb3A7CisKKwkvKiBBbGxvdyBmb3IgYm90aCBbZGldLWNhY2hlLWxpbmUtc2l6ZSBhbmQKKwkgKiBbZGldLWNhY2hlLWJsb2NrLXNpemUgcHJvcGVydGllcy4gIEFjY29yZGluZyB0byB0aGUgUG93ZXJQQworCSAqIFByb2Nlc3NvciBiaW5kaW5nLCAtbGluZS1zaXplIHNob3VsZCBiZSBwcm92aWRlZCBpZiBpdAorCSAqIGRpZmZlcnMgZnJvbSB0aGUgY2FjaGUgYmxvY2sgc2l6ZSAodGhhdCB3aGljaCBpcyBvcGVyYXRlZAorCSAqIG9uIGJ5IGNhY2hlIGluc3RydWN0aW9ucyksIHNvIHdlIGxvb2sgZm9yIC1saW5lLXNpemUgZmlyc3QuCisJICogU2VlIGNhY2hlX2dldF9saW5lX3NpemUoKS4gKi8KKworCWNvbnN0IGNoYXIgKmxpbmVfc2l6ZV9wcm9wc1syXTsKKwljb25zdCBjaGFyICpucl9zZXRzX3Byb3A7Cit9OworCisvKiBUaGVzZSBhcmUgdXNlZCB0byBpbmRleCB0aGUgY2FjaGVfdHlwZV9pbmZvIGFycmF5LiAqLworI2RlZmluZSBDQUNIRV9UWVBFX1VOSUZJRUQgICAgIDAKKyNkZWZpbmUgQ0FDSEVfVFlQRV9JTlNUUlVDVElPTiAxCisjZGVmaW5lIENBQ0hFX1RZUEVfREFUQSAgICAgICAgMgorCitzdGF0aWMgY29uc3Qgc3RydWN0IGNhY2hlX3R5cGVfaW5mbyBjYWNoZV90eXBlX2luZm9bXSA9IHsKKwl7CisJCS8qIFBvd2VyUEMgUHJvY2Vzc29yIGJpbmRpbmcgc2F5cyB0aGUgW2RpXS1jYWNoZS0qCisJCSAqIG11c3QgYmUgZXF1YWwgb24gdW5pZmllZCBjYWNoZXMsIHNvIGp1c3QgdXNlCisJCSAqIGQtY2FjaGUgcHJvcGVydGllcy4gKi8KKwkJLm5hbWUgICAgICAgICAgICA9ICJVbmlmaWVkIiwKKwkJLnNpemVfcHJvcCAgICAgICA9ICJkLWNhY2hlLXNpemUiLAorCQkubGluZV9zaXplX3Byb3BzID0geyAiZC1jYWNoZS1saW5lLXNpemUiLAorCQkJCSAgICAgImQtY2FjaGUtYmxvY2stc2l6ZSIsIH0sCisJCS5ucl9zZXRzX3Byb3AgICAgPSAiZC1jYWNoZS1zZXRzIiwKKwl9LAorCXsKKwkJLm5hbWUgICAgICAgICAgICA9ICJJbnN0cnVjdGlvbiIsCisJCS5zaXplX3Byb3AgICAgICAgPSAiaS1jYWNoZS1zaXplIiwKKwkJLmxpbmVfc2l6ZV9wcm9wcyA9IHsgImktY2FjaGUtbGluZS1zaXplIiwKKwkJCQkgICAgICJpLWNhY2hlLWJsb2NrLXNpemUiLCB9LAorCQkubnJfc2V0c19wcm9wICAgID0gImktY2FjaGUtc2V0cyIsCisJfSwKKwl7CisJCS5uYW1lICAgICAgICAgICAgPSAiRGF0YSIsCisJCS5zaXplX3Byb3AgICAgICAgPSAiZC1jYWNoZS1zaXplIiwKKwkJLmxpbmVfc2l6ZV9wcm9wcyA9IHsgImQtY2FjaGUtbGluZS1zaXplIiwKKwkJCQkgICAgICJkLWNhY2hlLWJsb2NrLXNpemUiLCB9LAorCQkubnJfc2V0c19wcm9wICAgID0gImQtY2FjaGUtc2V0cyIsCisJfSwKK307CisKKy8qIENhY2hlIG9iamVjdDogZWFjaCBpbnN0YW5jZSBvZiB0aGlzIGNvcnJlc3BvbmRzIHRvIGEgZGlzdGluY3QgY2FjaGUKKyAqIGluIHRoZSBzeXN0ZW0uICBUaGVyZSBhcmUgc2VwYXJhdGUgb2JqZWN0cyBmb3IgSGFydmFyZCBjYWNoZXM6IG9uZQorICogZWFjaCBmb3IgaW5zdHJ1Y3Rpb24gYW5kIGRhdGEsIGFuZCBlYWNoIHJlZmVycyB0byB0aGUgc2FtZSBPRiBub2RlLgorICogVGhlIHJlZmNvdW50IG9mIHRoZSBPRiBub2RlIGlzIGVsZXZhdGVkIGZvciB0aGUgbGlmZXRpbWUgb2YgdGhlCisgKiBjYWNoZSBvYmplY3QuICBBIGNhY2hlIG9iamVjdCBpcyByZWxlYXNlZCB3aGVuIGl0cyBzaGFyZWRfY3B1X21hcAorICogaXMgY2xlYXJlZCAoc2VlIGNhY2hlX2NwdV9jbGVhcikuCisgKgorICogQSBjYWNoZSBvYmplY3QgaXMgb24gdHdvIGxpc3RzOiBhbiB1bnNvcnRlZCBnbG9iYWwgbGlzdAorICogKGNhY2hlX2xpc3QpIG9mIGNhY2hlIG9iamVjdHM7IGFuZCBhIHNpbmdseS1saW5rZWQgbGlzdAorICogcmVwcmVzZW50aW5nIHRoZSBsb2NhbCBjYWNoZSBoaWVyYXJjaHksIHdoaWNoIGlzIG9yZGVyZWQgYnkgbGV2ZWwKKyAqIChlLmcuIEwxZCAtPiBMMWkgLT4gTDIgLT4gTDMpLgorICovCitzdHJ1Y3QgY2FjaGUgeworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqb2Zub2RlOyAgICAvKiBPRiBub2RlIGZvciB0aGlzIGNhY2hlLCBtYXkgYmUgY3B1ICovCisJc3RydWN0IGNwdW1hc2sgc2hhcmVkX2NwdV9tYXA7IC8qIG9ubGluZSBDUFVzIHVzaW5nIHRoaXMgY2FjaGUgKi8KKwlpbnQgdHlwZTsgICAgICAgICAgICAgICAgICAgICAgLyogc3BsaXQgY2FjaGUgZGlzYW1iaWd1YXRpb24gKi8KKwlpbnQgbGV2ZWw7ICAgICAgICAgICAgICAgICAgICAgLyogbGV2ZWwgbm90IGV4cGxpY2l0IGluIGRldmljZSB0cmVlICovCisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OyAgICAgICAgIC8qIGdsb2JhbCBsaXN0IG9mIGNhY2hlIG9iamVjdHMgKi8KKwlzdHJ1Y3QgY2FjaGUgKm5leHRfbG9jYWw7ICAgICAgLyogbmV4dCBjYWNoZSBvZiA+PSBsZXZlbCAqLworfTsKKworc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCBjYWNoZV9kaXIgKiwgY2FjaGVfZGlyX3BjcHUpOworCisvKiB0cmF2ZXJzYWwvbW9kaWZpY2F0aW9uIG9mIHRoaXMgbGlzdCBvY2N1cnMgb25seSBhdCBjcHUgaG90cGx1ZyB0aW1lOworICogYWNjZXNzIGlzIHNlcmlhbGl6ZWQgYnkgY3B1IGhvdHBsdWcgbG9ja2luZworICovCitzdGF0aWMgTElTVF9IRUFEKGNhY2hlX2xpc3QpOworCitzdGF0aWMgc3RydWN0IGNhY2hlX2luZGV4X2RpciAqa29ial90b19jYWNoZV9pbmRleF9kaXIoc3RydWN0IGtvYmplY3QgKmspCit7CisJcmV0dXJuIGNvbnRhaW5lcl9vZihrLCBzdHJ1Y3QgY2FjaGVfaW5kZXhfZGlyLCBrb2JqKTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKmNhY2hlX3R5cGVfc3RyaW5nKGNvbnN0IHN0cnVjdCBjYWNoZSAqY2FjaGUpCit7CisJcmV0dXJuIGNhY2hlX3R5cGVfaW5mb1tjYWNoZS0+dHlwZV0ubmFtZTsKK30KKworc3RhdGljIHZvaWQgX19jcHVpbml0IGNhY2hlX2luaXQoc3RydWN0IGNhY2hlICpjYWNoZSwgaW50IHR5cGUsIGludCBsZXZlbCwgc3RydWN0IGRldmljZV9ub2RlICpvZm5vZGUpCit7CisJY2FjaGUtPnR5cGUgPSB0eXBlOworCWNhY2hlLT5sZXZlbCA9IGxldmVsOworCWNhY2hlLT5vZm5vZGUgPSBvZl9ub2RlX2dldChvZm5vZGUpOworCUlOSVRfTElTVF9IRUFEKCZjYWNoZS0+bGlzdCk7CisJbGlzdF9hZGQoJmNhY2hlLT5saXN0LCAmY2FjaGVfbGlzdCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY2FjaGUgKl9fY3B1aW5pdCBuZXdfY2FjaGUoaW50IHR5cGUsIGludCBsZXZlbCwgc3RydWN0IGRldmljZV9ub2RlICpvZm5vZGUpCit7CisJc3RydWN0IGNhY2hlICpjYWNoZTsKKworCWNhY2hlID0ga3phbGxvYyhzaXplb2YoKmNhY2hlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKGNhY2hlKQorCQljYWNoZV9pbml0KGNhY2hlLCB0eXBlLCBsZXZlbCwgb2Zub2RlKTsKKworCXJldHVybiBjYWNoZTsKK30KKworc3RhdGljIHZvaWQgcmVsZWFzZV9jYWNoZV9kZWJ1Z2NoZWNrKHN0cnVjdCBjYWNoZSAqY2FjaGUpCit7CisJc3RydWN0IGNhY2hlICppdGVyOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShpdGVyLCAmY2FjaGVfbGlzdCwgbGlzdCkKKwkJV0FSTl9PTkNFKGl0ZXItPm5leHRfbG9jYWwgPT0gY2FjaGUsCisJCQkgICJjYWNoZSBmb3IgJXMoJXMpIHJlZmVycyB0byBjYWNoZSBmb3IgJXMoJXMpXG4iLAorCQkJICBpdGVyLT5vZm5vZGUtPmZ1bGxfbmFtZSwKKwkJCSAgY2FjaGVfdHlwZV9zdHJpbmcoaXRlciksCisJCQkgIGNhY2hlLT5vZm5vZGUtPmZ1bGxfbmFtZSwKKwkJCSAgY2FjaGVfdHlwZV9zdHJpbmcoY2FjaGUpKTsKK30KKworc3RhdGljIHZvaWQgcmVsZWFzZV9jYWNoZShzdHJ1Y3QgY2FjaGUgKmNhY2hlKQoreworCWlmICghY2FjaGUpCisJCXJldHVybjsKKworCXByX2RlYnVnKCJmcmVlaW5nIEwlZCAlcyBjYWNoZSBmb3IgJXNcbiIsIGNhY2hlLT5sZXZlbCwKKwkJIGNhY2hlX3R5cGVfc3RyaW5nKGNhY2hlKSwgY2FjaGUtPm9mbm9kZS0+ZnVsbF9uYW1lKTsKKworCXJlbGVhc2VfY2FjaGVfZGVidWdjaGVjayhjYWNoZSk7CisJbGlzdF9kZWwoJmNhY2hlLT5saXN0KTsKKwlvZl9ub2RlX3B1dChjYWNoZS0+b2Zub2RlKTsKKwlrZnJlZShjYWNoZSk7Cit9CisKK3N0YXRpYyB2b2lkIGNhY2hlX2NwdV9zZXQoc3RydWN0IGNhY2hlICpjYWNoZSwgaW50IGNwdSkKK3sKKwlzdHJ1Y3QgY2FjaGUgKm5leHQgPSBjYWNoZTsKKworCXdoaWxlIChuZXh0KSB7CisJCVdBUk5fT05DRShjcHVtYXNrX3Rlc3RfY3B1KGNwdSwgJm5leHQtPnNoYXJlZF9jcHVfbWFwKSwKKwkJCSAgIkNQVSAlaSBhbHJlYWR5IGFjY291bnRlZCBpbiAlcyglcylcbiIsCisJCQkgIGNwdSwgbmV4dC0+b2Zub2RlLT5mdWxsX25hbWUsCisJCQkgIGNhY2hlX3R5cGVfc3RyaW5nKG5leHQpKTsKKwkJY3B1bWFza19zZXRfY3B1KGNwdSwgJm5leHQtPnNoYXJlZF9jcHVfbWFwKTsKKwkJbmV4dCA9IG5leHQtPm5leHRfbG9jYWw7CisJfQorfQorCitzdGF0aWMgaW50IGNhY2hlX3NpemUoY29uc3Qgc3RydWN0IGNhY2hlICpjYWNoZSwgdW5zaWduZWQgaW50ICpyZXQpCit7CisJY29uc3QgY2hhciAqcHJvcG5hbWU7CisJY29uc3QgdTMyICpjYWNoZV9zaXplOworCisJcHJvcG5hbWUgPSBjYWNoZV90eXBlX2luZm9bY2FjaGUtPnR5cGVdLnNpemVfcHJvcDsKKworCWNhY2hlX3NpemUgPSBvZl9nZXRfcHJvcGVydHkoY2FjaGUtPm9mbm9kZSwgcHJvcG5hbWUsIE5VTEwpOworCWlmICghY2FjaGVfc2l6ZSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwkqcmV0ID0gKmNhY2hlX3NpemU7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY2FjaGVfc2l6ZV9rYihjb25zdCBzdHJ1Y3QgY2FjaGUgKmNhY2hlLCB1bnNpZ25lZCBpbnQgKnJldCkKK3sKKwl1bnNpZ25lZCBpbnQgc2l6ZTsKKworCWlmIChjYWNoZV9zaXplKGNhY2hlLCAmc2l6ZSkpCisJCXJldHVybiAtRU5PREVWOworCisJKnJldCA9IHNpemUgLyAxMDI0OworCXJldHVybiAwOworfQorCisvKiBub3QgY2FjaGVfbGluZV9zaXplKCkgYmVjYXVzZSB0aGF0J3MgYSBtYWNybyBpbiBpbmNsdWRlL2xpbnV4L2NhY2hlLmggKi8KK3N0YXRpYyBpbnQgY2FjaGVfZ2V0X2xpbmVfc2l6ZShjb25zdCBzdHJ1Y3QgY2FjaGUgKmNhY2hlLCB1bnNpZ25lZCBpbnQgKnJldCkKK3sKKwljb25zdCB1MzIgKmxpbmVfc2l6ZTsKKwlpbnQgaSwgbGltOworCisJbGltID0gQVJSQVlfU0laRShjYWNoZV90eXBlX2luZm9bY2FjaGUtPnR5cGVdLmxpbmVfc2l6ZV9wcm9wcyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbGltOyBpKyspIHsKKwkJY29uc3QgY2hhciAqcHJvcG5hbWU7CisKKwkJcHJvcG5hbWUgPSBjYWNoZV90eXBlX2luZm9bY2FjaGUtPnR5cGVdLmxpbmVfc2l6ZV9wcm9wc1tpXTsKKwkJbGluZV9zaXplID0gb2ZfZ2V0X3Byb3BlcnR5KGNhY2hlLT5vZm5vZGUsIHByb3BuYW1lLCBOVUxMKTsKKwkJaWYgKGxpbmVfc2l6ZSkKKwkJCWJyZWFrOworCX0KKworCWlmICghbGluZV9zaXplKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCSpyZXQgPSAqbGluZV9zaXplOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNhY2hlX25yX3NldHMoY29uc3Qgc3RydWN0IGNhY2hlICpjYWNoZSwgdW5zaWduZWQgaW50ICpyZXQpCit7CisJY29uc3QgY2hhciAqcHJvcG5hbWU7CisJY29uc3QgdTMyICpucl9zZXRzOworCisJcHJvcG5hbWUgPSBjYWNoZV90eXBlX2luZm9bY2FjaGUtPnR5cGVdLm5yX3NldHNfcHJvcDsKKworCW5yX3NldHMgPSBvZl9nZXRfcHJvcGVydHkoY2FjaGUtPm9mbm9kZSwgcHJvcG5hbWUsIE5VTEwpOworCWlmICghbnJfc2V0cykKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwkqcmV0ID0gKm5yX3NldHM7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY2FjaGVfYXNzb2NpYXRpdml0eShjb25zdCBzdHJ1Y3QgY2FjaGUgKmNhY2hlLCB1bnNpZ25lZCBpbnQgKnJldCkKK3sKKwl1bnNpZ25lZCBpbnQgbGluZV9zaXplOworCXVuc2lnbmVkIGludCBucl9zZXRzOworCXVuc2lnbmVkIGludCBzaXplOworCisJaWYgKGNhY2hlX25yX3NldHMoY2FjaGUsICZucl9zZXRzKSkKKwkJZ290byBlcnI7CisKKwkvKiBJZiB0aGUgY2FjaGUgaXMgZnVsbHkgYXNzb2NpYXRpdmUsIHRoZXJlIGlzIG5vIG5lZWQgdG8KKwkgKiBjaGVjayB0aGUgb3RoZXIgcHJvcGVydGllcy4KKwkgKi8KKwlpZiAobnJfc2V0cyA9PSAxKSB7CisJCSpyZXQgPSAwOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoY2FjaGVfZ2V0X2xpbmVfc2l6ZShjYWNoZSwgJmxpbmVfc2l6ZSkpCisJCWdvdG8gZXJyOworCWlmIChjYWNoZV9zaXplKGNhY2hlLCAmc2l6ZSkpCisJCWdvdG8gZXJyOworCisJaWYgKCEobnJfc2V0cyA+IDAgJiYgc2l6ZSA+IDAgJiYgbGluZV9zaXplID4gMCkpCisJCWdvdG8gZXJyOworCisJKnJldCA9IChzaXplIC8gbnJfc2V0cykgLyBsaW5lX3NpemU7CisJcmV0dXJuIDA7CitlcnI6CisJcmV0dXJuIC1FTk9ERVY7Cit9CisKKy8qIGhlbHBlciBmb3IgZGVhbGluZyB3aXRoIHNwbGl0IGNhY2hlcyAqLworc3RhdGljIHN0cnVjdCBjYWNoZSAqY2FjaGVfZmluZF9maXJzdF9zaWJsaW5nKHN0cnVjdCBjYWNoZSAqY2FjaGUpCit7CisJc3RydWN0IGNhY2hlICppdGVyOworCisJaWYgKGNhY2hlLT50eXBlID09IENBQ0hFX1RZUEVfVU5JRklFRCkKKwkJcmV0dXJuIGNhY2hlOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShpdGVyLCAmY2FjaGVfbGlzdCwgbGlzdCkKKwkJaWYgKGl0ZXItPm9mbm9kZSA9PSBjYWNoZS0+b2Zub2RlICYmIGl0ZXItPm5leHRfbG9jYWwgPT0gY2FjaGUpCisJCQlyZXR1cm4gaXRlcjsKKworCXJldHVybiBjYWNoZTsKK30KKworLyogcmV0dXJuIHRoZSBmaXJzdCBjYWNoZSBvbiBhIGxvY2FsIGxpc3QgbWF0Y2hpbmcgbm9kZSAqLworc3RhdGljIHN0cnVjdCBjYWNoZSAqY2FjaGVfbG9va3VwX2J5X25vZGUoY29uc3Qgc3RydWN0IGRldmljZV9ub2RlICpub2RlKQoreworCXN0cnVjdCBjYWNoZSAqY2FjaGUgPSBOVUxMOworCXN0cnVjdCBjYWNoZSAqaXRlcjsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoaXRlciwgJmNhY2hlX2xpc3QsIGxpc3QpIHsKKwkJaWYgKGl0ZXItPm9mbm9kZSAhPSBub2RlKQorCQkJY29udGludWU7CisJCWNhY2hlID0gY2FjaGVfZmluZF9maXJzdF9zaWJsaW5nKGl0ZXIpOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gY2FjaGU7Cit9CisKK3N0YXRpYyBib29sIGNhY2hlX25vZGVfaXNfdW5pZmllZChjb25zdCBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKQoreworCXJldHVybiBvZl9nZXRfcHJvcGVydHkobnAsICJjYWNoZS11bmlmaWVkIiwgTlVMTCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY2FjaGUgKl9fY3B1aW5pdCBjYWNoZV9kb19vbmVfZGV2bm9kZV91bmlmaWVkKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSwgaW50IGxldmVsKQoreworCXN0cnVjdCBjYWNoZSAqY2FjaGU7CisKKwlwcl9kZWJ1ZygiY3JlYXRpbmcgTCVkIHVjYWNoZSBmb3IgJXNcbiIsIGxldmVsLCBub2RlLT5mdWxsX25hbWUpOworCisJY2FjaGUgPSBuZXdfY2FjaGUoQ0FDSEVfVFlQRV9VTklGSUVELCBsZXZlbCwgbm9kZSk7CisKKwlyZXR1cm4gY2FjaGU7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY2FjaGUgKl9fY3B1aW5pdCBjYWNoZV9kb19vbmVfZGV2bm9kZV9zcGxpdChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUsIGludCBsZXZlbCkKK3sKKwlzdHJ1Y3QgY2FjaGUgKmRjYWNoZSwgKmljYWNoZTsKKworCXByX2RlYnVnKCJjcmVhdGluZyBMJWQgZGNhY2hlIGFuZCBpY2FjaGUgZm9yICVzXG4iLCBsZXZlbCwKKwkJIG5vZGUtPmZ1bGxfbmFtZSk7CisKKwlkY2FjaGUgPSBuZXdfY2FjaGUoQ0FDSEVfVFlQRV9EQVRBLCBsZXZlbCwgbm9kZSk7CisJaWNhY2hlID0gbmV3X2NhY2hlKENBQ0hFX1RZUEVfSU5TVFJVQ1RJT04sIGxldmVsLCBub2RlKTsKKworCWlmICghZGNhY2hlIHx8ICFpY2FjaGUpCisJCWdvdG8gZXJyOworCisJZGNhY2hlLT5uZXh0X2xvY2FsID0gaWNhY2hlOworCisJcmV0dXJuIGRjYWNoZTsKK2VycjoKKwlyZWxlYXNlX2NhY2hlKGRjYWNoZSk7CisJcmVsZWFzZV9jYWNoZShpY2FjaGUpOworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgc3RydWN0IGNhY2hlICpfX2NwdWluaXQgY2FjaGVfZG9fb25lX2Rldm5vZGUoc3RydWN0IGRldmljZV9ub2RlICpub2RlLCBpbnQgbGV2ZWwpCit7CisJc3RydWN0IGNhY2hlICpjYWNoZTsKKworCWlmIChjYWNoZV9ub2RlX2lzX3VuaWZpZWQobm9kZSkpCisJCWNhY2hlID0gY2FjaGVfZG9fb25lX2Rldm5vZGVfdW5pZmllZChub2RlLCBsZXZlbCk7CisJZWxzZQorCQljYWNoZSA9IGNhY2hlX2RvX29uZV9kZXZub2RlX3NwbGl0KG5vZGUsIGxldmVsKTsKKworCXJldHVybiBjYWNoZTsKK30KKworc3RhdGljIHN0cnVjdCBjYWNoZSAqX19jcHVpbml0IGNhY2hlX2xvb2t1cF9vcl9pbnN0YW50aWF0ZShzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUsIGludCBsZXZlbCkKK3sKKwlzdHJ1Y3QgY2FjaGUgKmNhY2hlOworCisJY2FjaGUgPSBjYWNoZV9sb29rdXBfYnlfbm9kZShub2RlKTsKKworCVdBUk5fT05DRShjYWNoZSAmJiBjYWNoZS0+bGV2ZWwgIT0gbGV2ZWwsCisJCSAgImNhY2hlIGxldmVsIG1pc21hdGNoIG9uIGxvb2t1cCAoZ290ICVkLCBleHBlY3RlZCAlZClcbiIsCisJCSAgY2FjaGUtPmxldmVsLCBsZXZlbCk7CisKKwlpZiAoIWNhY2hlKQorCQljYWNoZSA9IGNhY2hlX2RvX29uZV9kZXZub2RlKG5vZGUsIGxldmVsKTsKKworCXJldHVybiBjYWNoZTsKK30KKworc3RhdGljIHZvaWQgX19jcHVpbml0IGxpbmtfY2FjaGVfbGlzdHMoc3RydWN0IGNhY2hlICpzbWFsbGVyLCBzdHJ1Y3QgY2FjaGUgKmJpZ2dlcikKK3sKKwl3aGlsZSAoc21hbGxlci0+bmV4dF9sb2NhbCkgeworCQlpZiAoc21hbGxlci0+bmV4dF9sb2NhbCA9PSBiaWdnZXIpCisJCQlyZXR1cm47IC8qIGFscmVhZHkgbGlua2VkICovCisJCXNtYWxsZXIgPSBzbWFsbGVyLT5uZXh0X2xvY2FsOworCX0KKworCXNtYWxsZXItPm5leHRfbG9jYWwgPSBiaWdnZXI7Cit9CisKK3N0YXRpYyB2b2lkIF9fY3B1aW5pdCBkb19zdWJzaWRpYXJ5X2NhY2hlc19kZWJ1Z2NoZWNrKHN0cnVjdCBjYWNoZSAqY2FjaGUpCit7CisJV0FSTl9PTl9PTkNFKGNhY2hlLT5sZXZlbCAhPSAxKTsKKwlXQVJOX09OX09OQ0Uoc3RyY21wKGNhY2hlLT5vZm5vZGUtPnR5cGUsICJjcHUiKSk7Cit9CisKK3N0YXRpYyB2b2lkIF9fY3B1aW5pdCBkb19zdWJzaWRpYXJ5X2NhY2hlcyhzdHJ1Y3QgY2FjaGUgKmNhY2hlKQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqc3ViY2FjaGVfbm9kZTsKKwlpbnQgbGV2ZWwgPSBjYWNoZS0+bGV2ZWw7CisKKwlkb19zdWJzaWRpYXJ5X2NhY2hlc19kZWJ1Z2NoZWNrKGNhY2hlKTsKKworCXdoaWxlICgoc3ViY2FjaGVfbm9kZSA9IG9mX2ZpbmRfbmV4dF9jYWNoZV9ub2RlKGNhY2hlLT5vZm5vZGUpKSkgeworCQlzdHJ1Y3QgY2FjaGUgKnN1YmNhY2hlOworCisJCWxldmVsKys7CisJCXN1YmNhY2hlID0gY2FjaGVfbG9va3VwX29yX2luc3RhbnRpYXRlKHN1YmNhY2hlX25vZGUsIGxldmVsKTsKKwkJb2Zfbm9kZV9wdXQoc3ViY2FjaGVfbm9kZSk7CisJCWlmICghc3ViY2FjaGUpCisJCQlicmVhazsKKworCQlsaW5rX2NhY2hlX2xpc3RzKGNhY2hlLCBzdWJjYWNoZSk7CisJCWNhY2hlID0gc3ViY2FjaGU7CisJfQorfQorCitzdGF0aWMgc3RydWN0IGNhY2hlICpfX2NwdWluaXQgY2FjaGVfY2hhaW5faW5zdGFudGlhdGUodW5zaWduZWQgaW50IGNwdV9pZCkKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmNwdV9ub2RlOworCXN0cnVjdCBjYWNoZSAqY3B1X2NhY2hlID0gTlVMTDsKKworCXByX2RlYnVnKCJjcmVhdGluZyBjYWNoZSBvYmplY3QocykgZm9yIENQVSAlaVxuIiwgY3B1X2lkKTsKKworCWNwdV9ub2RlID0gb2ZfZ2V0X2NwdV9ub2RlKGNwdV9pZCwgTlVMTCk7CisJV0FSTl9PTkNFKCFjcHVfbm9kZSwgIm5vIE9GIG5vZGUgZm91bmQgZm9yIENQVSAlaVxuIiwgY3B1X2lkKTsKKwlpZiAoIWNwdV9ub2RlKQorCQlnb3RvIG91dDsKKworCWNwdV9jYWNoZSA9IGNhY2hlX2xvb2t1cF9vcl9pbnN0YW50aWF0ZShjcHVfbm9kZSwgMSk7CisJaWYgKCFjcHVfY2FjaGUpCisJCWdvdG8gb3V0OworCisJZG9fc3Vic2lkaWFyeV9jYWNoZXMoY3B1X2NhY2hlKTsKKworCWNhY2hlX2NwdV9zZXQoY3B1X2NhY2hlLCBjcHVfaWQpOworb3V0OgorCW9mX25vZGVfcHV0KGNwdV9ub2RlKTsKKworCXJldHVybiBjcHVfY2FjaGU7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY2FjaGVfZGlyICpfX2NwdWluaXQgY2FjaGVpbmZvX2NyZWF0ZV9jYWNoZV9kaXIodW5zaWduZWQgaW50IGNwdV9pZCkKK3sKKwlzdHJ1Y3QgY2FjaGVfZGlyICpjYWNoZV9kaXI7CisJc3RydWN0IHN5c19kZXZpY2UgKnN5c2RldjsKKwlzdHJ1Y3Qga29iamVjdCAqa29iaiA9IE5VTEw7CisKKwlzeXNkZXYgPSBnZXRfY3B1X3N5c2RldihjcHVfaWQpOworCVdBUk5fT05DRSghc3lzZGV2LCAibm8gc3lzZGV2IGZvciBDUFUgJWlcbiIsIGNwdV9pZCk7CisJaWYgKCFzeXNkZXYpCisJCWdvdG8gZXJyOworCisJa29iaiA9IGtvYmplY3RfY3JlYXRlX2FuZF9hZGQoImNhY2hlIiwgJnN5c2Rldi0+a29iaik7CisJaWYgKCFrb2JqKQorCQlnb3RvIGVycjsKKworCWNhY2hlX2RpciA9IGt6YWxsb2Moc2l6ZW9mKCpjYWNoZV9kaXIpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWNhY2hlX2RpcikKKwkJZ290byBlcnI7CisKKwljYWNoZV9kaXItPmtvYmogPSBrb2JqOworCisJV0FSTl9PTl9PTkNFKHBlcl9jcHUoY2FjaGVfZGlyX3BjcHUsIGNwdV9pZCkgIT0gTlVMTCk7CisKKwlwZXJfY3B1KGNhY2hlX2Rpcl9wY3B1LCBjcHVfaWQpID0gY2FjaGVfZGlyOworCisJcmV0dXJuIGNhY2hlX2RpcjsKK2VycjoKKwlrb2JqZWN0X3B1dChrb2JqKTsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgY2FjaGVfaW5kZXhfcmVsZWFzZShzdHJ1Y3Qga29iamVjdCAqa29iaikKK3sKKwlzdHJ1Y3QgY2FjaGVfaW5kZXhfZGlyICppbmRleDsKKworCWluZGV4ID0ga29ial90b19jYWNoZV9pbmRleF9kaXIoa29iaik7CisKKwlwcl9kZWJ1ZygiZnJlZWluZyBpbmRleCBkaXJlY3RvcnkgZm9yIEwlZCAlcyBjYWNoZVxuIiwKKwkJIGluZGV4LT5jYWNoZS0+bGV2ZWwsIGNhY2hlX3R5cGVfc3RyaW5nKGluZGV4LT5jYWNoZSkpOworCisJa2ZyZWUoaW5kZXgpOworfQorCitzdGF0aWMgc3NpemVfdCBjYWNoZV9pbmRleF9zaG93KHN0cnVjdCBrb2JqZWN0ICprLCBzdHJ1Y3QgYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IGtvYmpfYXR0cmlidXRlICprb2JqX2F0dHI7CisKKwlrb2JqX2F0dHIgPSBjb250YWluZXJfb2YoYXR0ciwgc3RydWN0IGtvYmpfYXR0cmlidXRlLCBhdHRyKTsKKworCXJldHVybiBrb2JqX2F0dHItPnNob3coaywga29ial9hdHRyLCBidWYpOworfQorCitzdGF0aWMgc3RydWN0IGNhY2hlICppbmRleF9rb2JqX3RvX2NhY2hlKHN0cnVjdCBrb2JqZWN0ICprKQoreworCXN0cnVjdCBjYWNoZV9pbmRleF9kaXIgKmluZGV4OworCisJaW5kZXggPSBrb2JqX3RvX2NhY2hlX2luZGV4X2RpcihrKTsKKworCXJldHVybiBpbmRleC0+Y2FjaGU7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNpemVfc2hvdyhzdHJ1Y3Qga29iamVjdCAqaywgc3RydWN0IGtvYmpfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJdW5zaWduZWQgaW50IHNpemVfa2I7CisJc3RydWN0IGNhY2hlICpjYWNoZTsKKworCWNhY2hlID0gaW5kZXhfa29ial90b19jYWNoZShrKTsKKworCWlmIChjYWNoZV9zaXplX2tiKGNhY2hlLCAmc2l6ZV9rYikpCisJCXJldHVybiAtRU5PREVWOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVLXG4iLCBzaXplX2tiKTsKK30KKworc3RhdGljIHN0cnVjdCBrb2JqX2F0dHJpYnV0ZSBjYWNoZV9zaXplX2F0dHIgPQorCV9fQVRUUihzaXplLCAwNDQ0LCBzaXplX3Nob3csIE5VTEwpOworCisKK3N0YXRpYyBzc2l6ZV90IGxpbmVfc2l6ZV9zaG93KHN0cnVjdCBrb2JqZWN0ICprLCBzdHJ1Y3Qga29ial9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwl1bnNpZ25lZCBpbnQgbGluZV9zaXplOworCXN0cnVjdCBjYWNoZSAqY2FjaGU7CisKKwljYWNoZSA9IGluZGV4X2tvYmpfdG9fY2FjaGUoayk7CisKKwlpZiAoY2FjaGVfZ2V0X2xpbmVfc2l6ZShjYWNoZSwgJmxpbmVfc2l6ZSkpCisJCXJldHVybiAtRU5PREVWOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIGxpbmVfc2l6ZSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qga29ial9hdHRyaWJ1dGUgY2FjaGVfbGluZV9zaXplX2F0dHIgPQorCV9fQVRUUihjb2hlcmVuY3lfbGluZV9zaXplLCAwNDQ0LCBsaW5lX3NpemVfc2hvdywgTlVMTCk7CisKK3N0YXRpYyBzc2l6ZV90IG5yX3NldHNfc2hvdyhzdHJ1Y3Qga29iamVjdCAqaywgc3RydWN0IGtvYmpfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJdW5zaWduZWQgaW50IG5yX3NldHM7CisJc3RydWN0IGNhY2hlICpjYWNoZTsKKworCWNhY2hlID0gaW5kZXhfa29ial90b19jYWNoZShrKTsKKworCWlmIChjYWNoZV9ucl9zZXRzKGNhY2hlLCAmbnJfc2V0cykpCisJCXJldHVybiAtRU5PREVWOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIG5yX3NldHMpOworfQorCitzdGF0aWMgc3RydWN0IGtvYmpfYXR0cmlidXRlIGNhY2hlX25yX3NldHNfYXR0ciA9CisJX19BVFRSKG51bWJlcl9vZl9zZXRzLCAwNDQ0LCBucl9zZXRzX3Nob3csIE5VTEwpOworCitzdGF0aWMgc3NpemVfdCBhc3NvY2lhdGl2aXR5X3Nob3coc3RydWN0IGtvYmplY3QgKmssIHN0cnVjdCBrb2JqX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXVuc2lnbmVkIGludCBhc3NvY2lhdGl2aXR5OworCXN0cnVjdCBjYWNoZSAqY2FjaGU7CisKKwljYWNoZSA9IGluZGV4X2tvYmpfdG9fY2FjaGUoayk7CisKKwlpZiAoY2FjaGVfYXNzb2NpYXRpdml0eShjYWNoZSwgJmFzc29jaWF0aXZpdHkpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCBhc3NvY2lhdGl2aXR5KTsKK30KKworc3RhdGljIHN0cnVjdCBrb2JqX2F0dHJpYnV0ZSBjYWNoZV9hc3NvY19hdHRyID0KKwlfX0FUVFIod2F5c19vZl9hc3NvY2lhdGl2aXR5LCAwNDQ0LCBhc3NvY2lhdGl2aXR5X3Nob3csIE5VTEwpOworCitzdGF0aWMgc3NpemVfdCB0eXBlX3Nob3coc3RydWN0IGtvYmplY3QgKmssIHN0cnVjdCBrb2JqX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBjYWNoZSAqY2FjaGU7CisKKwljYWNoZSA9IGluZGV4X2tvYmpfdG9fY2FjaGUoayk7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlc1xuIiwgY2FjaGVfdHlwZV9zdHJpbmcoY2FjaGUpKTsKK30KKworc3RhdGljIHN0cnVjdCBrb2JqX2F0dHJpYnV0ZSBjYWNoZV90eXBlX2F0dHIgPQorCV9fQVRUUih0eXBlLCAwNDQ0LCB0eXBlX3Nob3csIE5VTEwpOworCitzdGF0aWMgc3NpemVfdCBsZXZlbF9zaG93KHN0cnVjdCBrb2JqZWN0ICprLCBzdHJ1Y3Qga29ial9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgY2FjaGVfaW5kZXhfZGlyICppbmRleDsKKwlzdHJ1Y3QgY2FjaGUgKmNhY2hlOworCisJaW5kZXggPSBrb2JqX3RvX2NhY2hlX2luZGV4X2RpcihrKTsKKwljYWNoZSA9IGluZGV4LT5jYWNoZTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBjYWNoZS0+bGV2ZWwpOworfQorCitzdGF0aWMgc3RydWN0IGtvYmpfYXR0cmlidXRlIGNhY2hlX2xldmVsX2F0dHIgPQorCV9fQVRUUihsZXZlbCwgMDQ0NCwgbGV2ZWxfc2hvdywgTlVMTCk7CisKK3N0YXRpYyBzc2l6ZV90IHNoYXJlZF9jcHVfbWFwX3Nob3coc3RydWN0IGtvYmplY3QgKmssIHN0cnVjdCBrb2JqX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBjYWNoZV9pbmRleF9kaXIgKmluZGV4OworCXN0cnVjdCBjYWNoZSAqY2FjaGU7CisJaW50IGxlbjsKKwlpbnQgbiA9IDA7CisKKwlpbmRleCA9IGtvYmpfdG9fY2FjaGVfaW5kZXhfZGlyKGspOworCWNhY2hlID0gaW5kZXgtPmNhY2hlOworCWxlbiA9IFBBR0VfU0laRSAtIDI7CisKKwlpZiAobGVuID4gMSkgeworCQluID0gY3B1bWFza19zY25wcmludGYoYnVmLCBsZW4sICZjYWNoZS0+c2hhcmVkX2NwdV9tYXApOworCQlidWZbbisrXSA9ICdcbic7CisJCWJ1ZltuXSA9ICdcMCc7CisJfQorCXJldHVybiBuOworfQorCitzdGF0aWMgc3RydWN0IGtvYmpfYXR0cmlidXRlIGNhY2hlX3NoYXJlZF9jcHVfbWFwX2F0dHIgPQorCV9fQVRUUihzaGFyZWRfY3B1X21hcCwgMDQ0NCwgc2hhcmVkX2NwdV9tYXBfc2hvdywgTlVMTCk7CisKKy8qIEF0dHJpYnV0ZXMgd2hpY2ggc2hvdWxkIGFsd2F5cyBiZSBjcmVhdGVkIC0tIHRoZSBrb2JqZWN0L3N5c2ZzIGNvcmUKKyAqIGRvZXMgdGhpcyBhdXRvbWF0aWNhbGx5IHZpYSBrb2JqX3R5cGUtPmRlZmF1bHRfYXR0cnMuICBUaGlzIGlzIHRoZQorICogbWluaW11bSBkYXRhIHJlcXVpcmVkIHRvIHVuaXF1ZWx5IGlkZW50aWZ5IGEgY2FjaGUuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpjYWNoZV9pbmRleF9kZWZhdWx0X2F0dHJzW10gPSB7CisJJmNhY2hlX3R5cGVfYXR0ci5hdHRyLAorCSZjYWNoZV9sZXZlbF9hdHRyLmF0dHIsCisJJmNhY2hlX3NoYXJlZF9jcHVfbWFwX2F0dHIuYXR0ciwKKwlOVUxMLAorfTsKKworLyogQXR0cmlidXRlcyB3aGljaCBzaG91bGQgYmUgY3JlYXRlZCBpZiB0aGUgY2FjaGUgZGV2aWNlIG5vZGUgaGFzIHRoZQorICogcmlnaHQgcHJvcGVydGllcyAtLSBzZWUgY2FjaGVpbmZvX2NyZWF0ZV9pbmRleF9vcHRfYXR0cnMKKyAqLworc3RhdGljIHN0cnVjdCBrb2JqX2F0dHJpYnV0ZSAqY2FjaGVfaW5kZXhfb3B0X2F0dHJzW10gPSB7CisJJmNhY2hlX3NpemVfYXR0ciwKKwkmY2FjaGVfbGluZV9zaXplX2F0dHIsCisJJmNhY2hlX25yX3NldHNfYXR0ciwKKwkmY2FjaGVfYXNzb2NfYXR0ciwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc3lzZnNfb3BzIGNhY2hlX2luZGV4X29wcyA9IHsKKwkuc2hvdyA9IGNhY2hlX2luZGV4X3Nob3csCit9OworCitzdGF0aWMgc3RydWN0IGtvYmpfdHlwZSBjYWNoZV9pbmRleF90eXBlID0geworCS5yZWxlYXNlID0gY2FjaGVfaW5kZXhfcmVsZWFzZSwKKwkuc3lzZnNfb3BzID0gJmNhY2hlX2luZGV4X29wcywKKwkuZGVmYXVsdF9hdHRycyA9IGNhY2hlX2luZGV4X2RlZmF1bHRfYXR0cnMsCit9OworCitzdGF0aWMgdm9pZCBfX2NwdWluaXQgY2FjaGVpbmZvX2NyZWF0ZV9pbmRleF9vcHRfYXR0cnMoc3RydWN0IGNhY2hlX2luZGV4X2RpciAqZGlyKQoreworCWNvbnN0IGNoYXIgKmNhY2hlX25hbWU7CisJY29uc3QgY2hhciAqY2FjaGVfdHlwZTsKKwlzdHJ1Y3QgY2FjaGUgKmNhY2hlOworCWNoYXIgKmJ1ZjsKKwlpbnQgaTsKKworCWJ1ZiA9IGttYWxsb2MoUEFHRV9TSVpFLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWJ1ZikKKwkJcmV0dXJuOworCisJY2FjaGUgPSBkaXItPmNhY2hlOworCWNhY2hlX25hbWUgPSBjYWNoZS0+b2Zub2RlLT5mdWxsX25hbWU7CisJY2FjaGVfdHlwZSA9IGNhY2hlX3R5cGVfc3RyaW5nKGNhY2hlKTsKKworCS8qIFdlIGRvbid0IHdhbnQgdG8gY3JlYXRlIGFuIGF0dHJpYnV0ZSB0aGF0IGNhbid0IHByb3ZpZGUgYQorCSAqIG1lYW5pbmdmdWwgdmFsdWUuICBDaGVjayB0aGUgcmV0dXJuIHZhbHVlIG9mIGVhY2ggb3B0aW9uYWwKKwkgKiBhdHRyaWJ1dGUncyAtPnNob3cgbWV0aG9kIGJlZm9yZSByZWdpc3RlcmluZyB0aGUKKwkgKiBhdHRyaWJ1dGUuCisJICovCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoY2FjaGVfaW5kZXhfb3B0X2F0dHJzKTsgaSsrKSB7CisJCXN0cnVjdCBrb2JqX2F0dHJpYnV0ZSAqYXR0cjsKKwkJc3NpemVfdCByYzsKKworCQlhdHRyID0gY2FjaGVfaW5kZXhfb3B0X2F0dHJzW2ldOworCisJCXJjID0gYXR0ci0+c2hvdygmZGlyLT5rb2JqLCBhdHRyLCBidWYpOworCQlpZiAocmMgPD0gMCkgeworCQkJcHJfZGVidWcoIm5vdCBjcmVhdGluZyAlcyBhdHRyaWJ1dGUgZm9yICIKKwkJCQkgIiVzKCVzKSAocmMgPSAlemQpXG4iLAorCQkJCSBhdHRyLT5hdHRyLm5hbWUsIGNhY2hlX25hbWUsCisJCQkJIGNhY2hlX3R5cGUsIHJjKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChzeXNmc19jcmVhdGVfZmlsZSgmZGlyLT5rb2JqLCAmYXR0ci0+YXR0cikpCisJCQlwcl9kZWJ1ZygiY291bGQgbm90IGNyZWF0ZSAlcyBhdHRyaWJ1dGUgZm9yICVzKCVzKVxuIiwKKwkJCQkgYXR0ci0+YXR0ci5uYW1lLCBjYWNoZV9uYW1lLCBjYWNoZV90eXBlKTsKKwl9CisKKwlrZnJlZShidWYpOworfQorCitzdGF0aWMgdm9pZCBfX2NwdWluaXQgY2FjaGVpbmZvX2NyZWF0ZV9pbmRleF9kaXIoc3RydWN0IGNhY2hlICpjYWNoZSwgaW50IGluZGV4LCBzdHJ1Y3QgY2FjaGVfZGlyICpjYWNoZV9kaXIpCit7CisJc3RydWN0IGNhY2hlX2luZGV4X2RpciAqaW5kZXhfZGlyOworCWludCByYzsKKworCWluZGV4X2RpciA9IGt6YWxsb2Moc2l6ZW9mKCppbmRleF9kaXIpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWluZGV4X2RpcikKKwkJZ290byBlcnI7CisKKwlpbmRleF9kaXItPmNhY2hlID0gY2FjaGU7CisKKwlyYyA9IGtvYmplY3RfaW5pdF9hbmRfYWRkKCZpbmRleF9kaXItPmtvYmosICZjYWNoZV9pbmRleF90eXBlLAorCQkJCSAgY2FjaGVfZGlyLT5rb2JqLCAiaW5kZXglZCIsIGluZGV4KTsKKwlpZiAocmMpCisJCWdvdG8gZXJyOworCisJaW5kZXhfZGlyLT5uZXh0ID0gY2FjaGVfZGlyLT5pbmRleDsKKwljYWNoZV9kaXItPmluZGV4ID0gaW5kZXhfZGlyOworCisJY2FjaGVpbmZvX2NyZWF0ZV9pbmRleF9vcHRfYXR0cnMoaW5kZXhfZGlyKTsKKworCXJldHVybjsKK2VycjoKKwlrZnJlZShpbmRleF9kaXIpOworfQorCitzdGF0aWMgdm9pZCBfX2NwdWluaXQgY2FjaGVpbmZvX3N5c2ZzX3BvcHVsYXRlKHVuc2lnbmVkIGludCBjcHVfaWQsIHN0cnVjdCBjYWNoZSAqY2FjaGVfbGlzdCkKK3sKKwlzdHJ1Y3QgY2FjaGVfZGlyICpjYWNoZV9kaXI7CisJc3RydWN0IGNhY2hlICpjYWNoZTsKKwlpbnQgaW5kZXggPSAwOworCisJY2FjaGVfZGlyID0gY2FjaGVpbmZvX2NyZWF0ZV9jYWNoZV9kaXIoY3B1X2lkKTsKKwlpZiAoIWNhY2hlX2RpcikKKwkJcmV0dXJuOworCisJY2FjaGUgPSBjYWNoZV9saXN0OworCXdoaWxlIChjYWNoZSkgeworCQljYWNoZWluZm9fY3JlYXRlX2luZGV4X2RpcihjYWNoZSwgaW5kZXgsIGNhY2hlX2Rpcik7CisJCWluZGV4Kys7CisJCWNhY2hlID0gY2FjaGUtPm5leHRfbG9jYWw7CisJfQorfQorCit2b2lkIF9fY3B1aW5pdCBjYWNoZWluZm9fY3B1X29ubGluZSh1bnNpZ25lZCBpbnQgY3B1X2lkKQoreworCXN0cnVjdCBjYWNoZSAqY2FjaGU7CisKKwljYWNoZSA9IGNhY2hlX2NoYWluX2luc3RhbnRpYXRlKGNwdV9pZCk7CisJaWYgKCFjYWNoZSkKKwkJcmV0dXJuOworCisJY2FjaGVpbmZvX3N5c2ZzX3BvcHVsYXRlKGNwdV9pZCwgY2FjaGUpOworfQorCisjaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVIC8qIGZ1bmN0aW9ucyBuZWVkZWQgZm9yIGNwdSBvZmZsaW5lICovCisKK3N0YXRpYyBzdHJ1Y3QgY2FjaGUgKmNhY2hlX2xvb2t1cF9ieV9jcHUodW5zaWduZWQgaW50IGNwdV9pZCkKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmNwdV9ub2RlOworCXN0cnVjdCBjYWNoZSAqY2FjaGU7CisKKwljcHVfbm9kZSA9IG9mX2dldF9jcHVfbm9kZShjcHVfaWQsIE5VTEwpOworCVdBUk5fT05DRSghY3B1X25vZGUsICJubyBPRiBub2RlIGZvdW5kIGZvciBDUFUgJWlcbiIsIGNwdV9pZCk7CisJaWYgKCFjcHVfbm9kZSkKKwkJcmV0dXJuIE5VTEw7CisKKwljYWNoZSA9IGNhY2hlX2xvb2t1cF9ieV9ub2RlKGNwdV9ub2RlKTsKKwlvZl9ub2RlX3B1dChjcHVfbm9kZSk7CisKKwlyZXR1cm4gY2FjaGU7Cit9CisKK3N0YXRpYyB2b2lkIHJlbW92ZV9pbmRleF9kaXJzKHN0cnVjdCBjYWNoZV9kaXIgKmNhY2hlX2RpcikKK3sKKwlzdHJ1Y3QgY2FjaGVfaW5kZXhfZGlyICppbmRleDsKKworCWluZGV4ID0gY2FjaGVfZGlyLT5pbmRleDsKKworCXdoaWxlIChpbmRleCkgeworCQlzdHJ1Y3QgY2FjaGVfaW5kZXhfZGlyICpuZXh0OworCisJCW5leHQgPSBpbmRleC0+bmV4dDsKKwkJa29iamVjdF9wdXQoJmluZGV4LT5rb2JqKTsKKwkJaW5kZXggPSBuZXh0OworCX0KK30KKworc3RhdGljIHZvaWQgcmVtb3ZlX2NhY2hlX2RpcihzdHJ1Y3QgY2FjaGVfZGlyICpjYWNoZV9kaXIpCit7CisJcmVtb3ZlX2luZGV4X2RpcnMoY2FjaGVfZGlyKTsKKworCWtvYmplY3RfcHV0KGNhY2hlX2Rpci0+a29iaik7CisKKwlrZnJlZShjYWNoZV9kaXIpOworfQorCitzdGF0aWMgdm9pZCBjYWNoZV9jcHVfY2xlYXIoc3RydWN0IGNhY2hlICpjYWNoZSwgaW50IGNwdSkKK3sKKwl3aGlsZSAoY2FjaGUpIHsKKwkJc3RydWN0IGNhY2hlICpuZXh0ID0gY2FjaGUtPm5leHRfbG9jYWw7CisKKwkJV0FSTl9PTkNFKCFjcHVtYXNrX3Rlc3RfY3B1KGNwdSwgJmNhY2hlLT5zaGFyZWRfY3B1X21hcCksCisJCQkgICJDUFUgJWkgbm90IGFjY291bnRlZCBpbiAlcyglcylcbiIsCisJCQkgIGNwdSwgY2FjaGUtPm9mbm9kZS0+ZnVsbF9uYW1lLAorCQkJICBjYWNoZV90eXBlX3N0cmluZyhjYWNoZSkpOworCisJCWNwdW1hc2tfY2xlYXJfY3B1KGNwdSwgJmNhY2hlLT5zaGFyZWRfY3B1X21hcCk7CisKKwkJLyogUmVsZWFzZSB0aGUgY2FjaGUgb2JqZWN0IGlmIGFsbCB0aGUgY3B1cyB1c2luZyBpdAorCQkgKiBhcmUgb2ZmbGluZSAqLworCQlpZiAoY3B1bWFza19lbXB0eSgmY2FjaGUtPnNoYXJlZF9jcHVfbWFwKSkKKwkJCXJlbGVhc2VfY2FjaGUoY2FjaGUpOworCisJCWNhY2hlID0gbmV4dDsKKwl9Cit9CisKK3ZvaWQgY2FjaGVpbmZvX2NwdV9vZmZsaW5lKHVuc2lnbmVkIGludCBjcHVfaWQpCit7CisJc3RydWN0IGNhY2hlX2RpciAqY2FjaGVfZGlyOworCXN0cnVjdCBjYWNoZSAqY2FjaGU7CisKKwkvKiBQcmV2ZW50IHVzZXJzcGFjZSBmcm9tIHNlZWluZyBpbmNvbnNpc3RlbnQgc3RhdGUgLSByZW1vdmUKKwkgKiB0aGUgc3lzZnMgaGllcmFyY2h5IGZpcnN0ICovCisJY2FjaGVfZGlyID0gcGVyX2NwdShjYWNoZV9kaXJfcGNwdSwgY3B1X2lkKTsKKworCS8qIGNhcmVmdWwsIHN5c2ZzIHBvcHVsYXRpb24gbWF5IGhhdmUgZmFpbGVkICovCisJaWYgKGNhY2hlX2RpcikKKwkJcmVtb3ZlX2NhY2hlX2RpcihjYWNoZV9kaXIpOworCisJcGVyX2NwdShjYWNoZV9kaXJfcGNwdSwgY3B1X2lkKSA9IE5VTEw7CisKKwkvKiBjbGVhciB0aGUgQ1BVJ3MgYml0IGluIGl0cyBjYWNoZSBjaGFpbiwgcG9zc2libHkgZnJlZWluZworCSAqIGNhY2hlIG9iamVjdHMgKi8KKwljYWNoZSA9IGNhY2hlX2xvb2t1cF9ieV9jcHUoY3B1X2lkKTsKKwlpZiAoY2FjaGUpCisJCWNhY2hlX2NwdV9jbGVhcihjYWNoZSwgY3B1X2lkKTsKK30KKyNlbmRpZiAvKiBDT05GSUdfSE9UUExVR19DUFUgKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvY2FjaGVpbmZvLmggYi9hcmNoL3Bvd2VycGMva2VybmVsL2NhY2hlaW5mby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3Yjc0ZDMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL2NhY2hlaW5mby5oCkBAIC0wLDAgKzEsOCBAQAorI2lmbmRlZiBfUFBDX0NBQ0hFSU5GT19ICisjZGVmaW5lIF9QUENfQ0FDSEVJTkZPX0gKKworLyogVGhlc2UgYXJlIGp1c3QgaG9va3MgZm9yIHN5c2ZzLmMgdG8gdXNlLiAqLworZXh0ZXJuIHZvaWQgY2FjaGVpbmZvX2NwdV9vbmxpbmUodW5zaWduZWQgaW50IGNwdV9pZCk7CitleHRlcm4gdm9pZCBjYWNoZWluZm9fY3B1X29mZmxpbmUodW5zaWduZWQgaW50IGNwdV9pZCk7CisKKyNlbmRpZiAvKiBfUFBDX0NBQ0hFSU5GT19IICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL2RtYS1pb21tdS5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9kbWEtaW9tbXUuYwppbmRleCAxNDE4M2FmLi4yOTgzYWRhIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL2RtYS1pb21tdS5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvZG1hLWlvbW11LmMKQEAgLTc5LDEwICs3OSwxMCBAQAogCQkgICAgICAgIldhcm5pbmc6IElPTU1VIG9mZnNldCB0b28gYmlnIGZvciBkZXZpY2UgbWFza1xuIik7CiAJCWlmICh0YmwpCiAJCQlwcmludGsoS0VSTl9JTkZPCi0JCQkgICAgICAgIm1hc2s6IDB4JTA4bHgsIHRhYmxlIG9mZnNldDogMHglMDhseFxuIiwKKwkJCSAgICAgICAibWFzazogMHglMDhsbHgsIHRhYmxlIG9mZnNldDogMHglMDhseFxuIiwKIAkJCQltYXNrLCB0YmwtPml0X29mZnNldCk7CiAJCWVsc2UKLQkJCXByaW50ayhLRVJOX0lORk8gIm1hc2s6IDB4JTA4bHgsIHRhYmxlIHVuYXZhaWxhYmxlXG4iLAorCQkJcHJpbnRrKEtFUk5fSU5GTyAibWFzazogMHglMDhsbHgsIHRhYmxlIHVuYXZhaWxhYmxlXG4iLAogCQkJCW1hc2spOwogCQlyZXR1cm4gMDsKIAl9IGVsc2UKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvaGVhZF82NC5TIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9oZWFkXzY0LlMKaW5kZXggYjRiY2Y1YS4uZWJhZWRhZiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9oZWFkXzY0LlMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9oZWFkXzY0LlMKQEAgLTE1MTgsNiArMTUxOCwxNSBAQAogCS8qIHR1cm4gb24gNjQtYml0IG1vZGUgKi8KIAlibAkuZW5hYmxlXzY0Yl9tb2RlCiAKKwlsaQlyMCwwCisJbWZzcHIJcjMsU1BSTl9ISUQ0CisJcmxkaW1pCXIzLHIwLDQwLDIzCS8qIGNsZWFyIGJpdCAyMyAocm1fY2kpICovCisJc3luYworCW10c3ByCVNQUk5fSElENCxyMworCWlzeW5jCisJc3luYworCXNsYmlhCisKIAkvKiBnZXQgVE9DIHBvaW50ZXIgKHJlYWwgYWRkcmVzcykgKi8KIAlibAkucmVsYXRpdmVfdG9jCiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvaGVhZF9mc2xfYm9va2UuUyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvaGVhZF9mc2xfYm9va2UuUwppbmRleCAxMWI1NDlhYy4uMzZmZmIzNSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9oZWFkX2ZzbF9ib29rZS5TCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvaGVhZF9mc2xfYm9va2UuUwpAQCAtMzg5LDEwICszODksNiBAQAogI2VuZGlmCiAjZW5kaWYKIAotCW1mc3ByCXIzLFNQUk5fVExCMUNGRwotCWFuZGkuCXIzLHIzLDB4ZmZmCi0JbGlzCXI0LG51bV90bGJjYW1fZW50cmllc0BoYQotCXN0dwlyMyxudW1fdGxiY2FtX2VudHJpZXNAbChyNCkKIC8qCiAgKiBEZWNpZGUgd2hhdCBzb3J0IG9mIG1hY2hpbmUgdGhpcyBpcyBhbmQgaW5pdGlhbGl6ZSB0aGUgTU1VLgogICovCkBAIC03MTEsNyArNzA3LDcgQEAKIAlFWENFUFRJT04oMHgyMDYwLCBQZXJmb3JtYW5jZU1vbml0b3IsIHBlcmZvcm1hbmNlX21vbml0b3JfZXhjZXB0aW9uLCBFWENfWEZFUl9TVEQpCiAKICNpZmRlZiBDT05GSUdfUFBDX0U1MDBNQwotCUVYQ0VQVElPTigweDIwNzAsIERvb3JiZWxsLCB1bmtub3duX2V4Y2VwdGlvbiwgRVhDX1hGRVJfRUUpCisJRVhDRVBUSU9OKDB4MjA3MCwgRG9vcmJlbGwsIHVua25vd25fZXhjZXB0aW9uLCBFWENfWEZFUl9TVEQpCiAjZW5kaWYKIAogCS8qIERlYnVnIEludGVycnVwdCAqLwpAQCAtOTA5LDcgKzkwNSw3IEBACiBfR0xPQkFMKGxvYWRjYW1fZW50cnkpCiAJbGlzCXI0LFRMQkNBTUBoYQogCWFkZGkJcjQscjQsVExCQ0FNQGwKLQltdWxsaQlyNSxyMywyMAorCW11bGxpCXI1LHIzLFRMQkNBTV9TSVpFCiAJYWRkCXIzLHI1LHI0CiAJbHd6CXI0LDAocjMpCiAJbXRzcHIJU1BSTl9NQVMwLHI0CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL2lvbW11LmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL2lvbW11LmMKaW5kZXggMWJmYTcwNi4uZmQ1MTU3OCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9pb21tdS5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvaW9tbXUuYwpAQCAtMjM5LDEyICsyMzksMTIgQEAKIAkJaWYgKHByaW50a19yYXRlbGltaXQoKSkgewogCQkJcHJpbnRrKEtFUk5fSU5GTyAiaW9tbXVfZnJlZTogaW52YWxpZCBlbnRyeVxuIik7CiAJCQlwcmludGsoS0VSTl9JTkZPICJcdGVudHJ5ICAgICA9IDB4JWx4XG4iLCBlbnRyeSk7IAotCQkJcHJpbnRrKEtFUk5fSU5GTyAiXHRkbWFfYWRkciAgPSAweCVseFxuIiwgKHU2NClkbWFfYWRkcik7Ci0JCQlwcmludGsoS0VSTl9JTkZPICJcdFRhYmxlICAgICA9IDB4JWx4XG4iLCAodTY0KXRibCk7Ci0JCQlwcmludGsoS0VSTl9JTkZPICJcdGJ1cyMgICAgICA9IDB4JWx4XG4iLCAodTY0KXRibC0+aXRfYnVzbm8pOwotCQkJcHJpbnRrKEtFUk5fSU5GTyAiXHRzaXplICAgICAgPSAweCVseFxuIiwgKHU2NCl0YmwtPml0X3NpemUpOwotCQkJcHJpbnRrKEtFUk5fSU5GTyAiXHRzdGFydE9mZiAgPSAweCVseFxuIiwgKHU2NCl0YmwtPml0X29mZnNldCk7Ci0JCQlwcmludGsoS0VSTl9JTkZPICJcdGluZGV4ICAgICA9IDB4JWx4XG4iLCAodTY0KXRibC0+aXRfaW5kZXgpOworCQkJcHJpbnRrKEtFUk5fSU5GTyAiXHRkbWFfYWRkciAgPSAweCVsbHhcbiIsICh1NjQpZG1hX2FkZHIpOworCQkJcHJpbnRrKEtFUk5fSU5GTyAiXHRUYWJsZSAgICAgPSAweCVsbHhcbiIsICh1NjQpdGJsKTsKKwkJCXByaW50ayhLRVJOX0lORk8gIlx0YnVzIyAgICAgID0gMHglbGx4XG4iLCAodTY0KXRibC0+aXRfYnVzbm8pOworCQkJcHJpbnRrKEtFUk5fSU5GTyAiXHRzaXplICAgICAgPSAweCVsbHhcbiIsICh1NjQpdGJsLT5pdF9zaXplKTsKKwkJCXByaW50ayhLRVJOX0lORk8gIlx0c3RhcnRPZmYgID0gMHglbGx4XG4iLCAodTY0KXRibC0+aXRfb2Zmc2V0KTsKKwkJCXByaW50ayhLRVJOX0lORk8gIlx0aW5kZXggICAgID0gMHglbGx4XG4iLCAodTY0KXRibC0+aXRfaW5kZXgpOwogCQkJV0FSTl9PTigxKTsKIAkJfQogCQlyZXR1cm47CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL2twcm9iZXMuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwva3Byb2Jlcy5jCmluZGV4IDk4OWVkY2QuLmM5MzI5NzggMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwva3Byb2Jlcy5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwva3Byb2Jlcy5jCkBAIC0zMTcsNyArMzE3LDcgQEAKIAkvKgogCSAqIEl0IGlzIHBvc3NpYmxlIHRvIGhhdmUgbXVsdGlwbGUgaW5zdGFuY2VzIGFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuCiAJICogdGFzayBlaXRoZXIgYmVjYXVzZSBhbiBtdWx0aXBsZSBmdW5jdGlvbnMgaW4gdGhlIGNhbGwgcGF0aAotCSAqIGhhdmUgYSByZXR1cm4gcHJvYmUgaW5zdGFsbGVkIG9uIHRoZW0sIGFuZC9vciBtb3JlIHRoZW4gb25lIHJldHVybgorCSAqIGhhdmUgYSByZXR1cm4gcHJvYmUgaW5zdGFsbGVkIG9uIHRoZW0sIGFuZC9vciBtb3JlIHRoYW4gb25lIHJldHVybgogCSAqIHJldHVybiBwcm9iZSB3YXMgcmVnaXN0ZXJlZCBmb3IgYSB0YXJnZXQgZnVuY3Rpb24uCiAJICoKIAkgKiBXZSBjYW4gaGFuZGxlIHRoaXMgYmVjYXVzZToKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvbHBhcmNmZy5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9scGFyY2ZnLmMKaW5kZXggZDA1MWU4Yy4uMTgyZTBmNiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9scGFyY2ZnLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9scGFyY2ZnLmMKQEAgLTI0MCw3ICsyNDAsNyBAQAogCWlmIChyYykKIAkJcmV0dXJuOwogCi0Jc2VxX3ByaW50ZihtLCAicGFydGl0aW9uX2VudGl0bGVkX2NhcGFjaXR5PSVsZFxuIiwKKwlzZXFfcHJpbnRmKG0sICJwYXJ0aXRpb25fZW50aXRsZWRfY2FwYWNpdHk9JWxsZFxuIiwKIAkgICAgICAgICAgIHBwcF9kYXRhLmVudGl0bGVtZW50KTsKIAlzZXFfcHJpbnRmKG0sICJncm91cD0lZFxuIiwgcHBwX2RhdGEuZ3JvdXBfbnVtKTsKIAlzZXFfcHJpbnRmKG0sICJzeXN0ZW1fYWN0aXZlX3Byb2Nlc3NvcnM9JWRcbiIsCkBAIC0yNjUsNyArMjY1LDcgQEAKIAkJICAgcHBwX2RhdGEudW5hbGxvY2F0ZWRfd2VpZ2h0KTsKIAlzZXFfcHJpbnRmKG0sICJjYXBhY2l0eV93ZWlnaHQ9JWRcbiIsIHBwcF9kYXRhLndlaWdodCk7CiAJc2VxX3ByaW50ZihtLCAiY2FwcGVkPSVkXG4iLCBwcHBfZGF0YS5jYXBwZWQpOwotCXNlcV9wcmludGYobSwgInVuYWxsb2NhdGVkX2NhcGFjaXR5PSVsZFxuIiwKKwlzZXFfcHJpbnRmKG0sICJ1bmFsbG9jYXRlZF9jYXBhY2l0eT0lbGxkXG4iLAogCQkgICBwcHBfZGF0YS51bmFsbG9jYXRlZF9lbnRpdGxlbWVudCk7CiB9CiAKQEAgLTUwOSwxMCArNTA5LDEwIEBACiAJfSBlbHNlCiAJCXJldHVybiAtRUlOVkFMOwogCi0JcHJfZGVidWcoIiVzOiBjdXJyZW50X2VudGl0bGVkID0gJWx1LCBjdXJyZW50X3dlaWdodCA9ICV1XG4iLAorCXByX2RlYnVnKCIlczogY3VycmVudF9lbnRpdGxlZCA9ICVsbHUsIGN1cnJlbnRfd2VpZ2h0ID0gJXVcbiIsCiAJCSBfX2Z1bmNfXywgcHBwX2RhdGEuZW50aXRsZW1lbnQsIHBwcF9kYXRhLndlaWdodCk7CiAKLQlwcl9kZWJ1ZygiJXM6IG5ld19lbnRpdGxlZCA9ICVsdSwgbmV3X3dlaWdodCA9ICV1XG4iLAorCXByX2RlYnVnKCIlczogbmV3X2VudGl0bGVkID0gJWxsdSwgbmV3X3dlaWdodCA9ICV1XG4iLAogCQkgX19mdW5jX18sIG5ld19lbnRpdGxlZCwgbmV3X3dlaWdodCk7CiAKIAlyZXR2YWwgPSBwbHBhcl9oY2FsbF9ub3JldHMoSF9TRVRfUFBQLCBuZXdfZW50aXRsZWQsIG5ld193ZWlnaHQpOwpAQCAtNTU4LDcgKzU1OCw3IEBACiAJcHJfZGVidWcoIiVzOiBjdXJyZW50X2VudGl0bGVkID0gJWx1LCBjdXJyZW50X3dlaWdodCA9ICV1XG4iLAogCSAgICAgICAgIF9fZnVuY19fLCBtcHBfZGF0YS5lbnRpdGxlZF9tZW0sIG1wcF9kYXRhLm1lbV93ZWlnaHQpOwogCi0JcHJfZGVidWcoIiVzOiBuZXdfZW50aXRsZWQgPSAlbHUsIG5ld193ZWlnaHQgPSAldVxuIiwKKwlwcl9kZWJ1ZygiJXM6IG5ld19lbnRpdGxlZCA9ICVsbHUsIG5ld193ZWlnaHQgPSAldVxuIiwKIAkJIF9fZnVuY19fLCBuZXdfZW50aXRsZWQsIG5ld193ZWlnaHQpOwogCiAJcmMgPSBwbHBhcl9oY2FsbF9ub3JldHMoSF9TRVRfTVBQLCBuZXdfZW50aXRsZWQsIG5ld193ZWlnaHQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9tYWNoaW5lX2tleGVjLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL21hY2hpbmVfa2V4ZWMuYwppbmRleCBiM2FiZWJiLi5kNTllMmIxIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL21hY2hpbmVfa2V4ZWMuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL21hY2hpbmVfa2V4ZWMuYwpAQCAtOTMsMTAgKzkzLDM1IEBACiAJCQkJS0RVTVBfS0VSTkVMQkFTRSk7CiAKIAljcmFzaGtfcmVzLnN0YXJ0ID0gS0RVTVBfS0VSTkVMQkFTRTsKKyNlbHNlCisJaWYgKCFjcmFzaGtfcmVzLnN0YXJ0KSB7CisJCS8qCisJCSAqIHVuc3BlY2lmaWVkIGFkZHJlc3MsIGNob29zZSBhIHJlZ2lvbiBvZiBzcGVjaWZpZWQgc2l6ZQorCQkgKiBjYW4gb3ZlcmxhcCB3aXRoIGluaXRyZCAoaWdub3JpbmcgY29ycnVwdGlvbiB3aGVuIHJldGFpbmVkKQorCQkgKiBwcGM2NCByZXF1aXJlcyBrZXJuZWwgYW5kIHNvbWUgc3RhY2tzIHRvIGJlIGluIGZpcnN0IHNlZ2VtbnQKKwkJICovCisJCWNyYXNoa19yZXMuc3RhcnQgPSBLRFVNUF9LRVJORUxCQVNFOworCX0KKworCWNyYXNoX2Jhc2UgPSBQQUdFX0FMSUdOKGNyYXNoa19yZXMuc3RhcnQpOworCWlmIChjcmFzaF9iYXNlICE9IGNyYXNoa19yZXMuc3RhcnQpIHsKKwkJcHJpbnRrKCJDcmFzaCBrZXJuZWwgYmFzZSBtdXN0IGJlIGFsaWduZWQgdG8gMHglbHhcbiIsCisJCQkJUEFHRV9TSVpFKTsKKwkJY3Jhc2hrX3Jlcy5zdGFydCA9IGNyYXNoX2Jhc2U7CisJfQorCiAjZW5kaWYKIAljcmFzaF9zaXplID0gUEFHRV9BTElHTihjcmFzaF9zaXplKTsKIAljcmFzaGtfcmVzLmVuZCA9IGNyYXNoa19yZXMuc3RhcnQgKyBjcmFzaF9zaXplIC0gMTsKIAorCS8qIFRoZSBjcmFzaCByZWdpb24gbXVzdCBub3Qgb3ZlcmxhcCB0aGUgY3VycmVudCBrZXJuZWwgKi8KKwlpZiAob3ZlcmxhcHNfY3Jhc2hrZXJuZWwoX19wYShfc3RleHQpLCBfZW5kIC0gX3N0ZXh0KSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkiQ3Jhc2gga2VybmVsIGNhbiBub3Qgb3ZlcmxhcCBjdXJyZW50IGtlcm5lbFxuIik7CisJCWNyYXNoa19yZXMuc3RhcnQgPSBjcmFzaGtfcmVzLmVuZCA9IDA7CisJCXJldHVybjsKKwl9CisKIAkvKiBDcmFzaCBrZXJuZWwgdHJ1bXBzIG1lbW9yeSBsaW1pdCAqLwogCWlmIChtZW1vcnlfbGltaXQgJiYgbWVtb3J5X2xpbWl0IDw9IGNyYXNoa19yZXMuZW5kKSB7CiAJCW1lbW9yeV9saW1pdCA9IGNyYXNoa19yZXMuZW5kICsgMTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcGNpLWNvbW1vbi5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wY2ktY29tbW9uLmMKaW5kZXggMjUzODAzMC4uZGE1YTM4NSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wY2ktY29tbW9uLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wY2ktY29tbW9uLmMKQEAgLTE2LDcgKzE2LDcgQEAKICAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAgKi8KIAotI3VuZGVmIERFQlVHCisjZGVmaW5lIERFQlVHCiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KQEAgLTEzNTYsNiArMTM1Niw2MyBAQAogCX0KIH0KIAorc3RhdGljIHZvaWQgX19pbml0IHBjaWJpb3NfcmVzZXJ2ZV9sZWdhY3lfcmVnaW9ucyhzdHJ1Y3QgcGNpX2J1cyAqYnVzKQoreworCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSA9IHBjaV9idXNfdG9faG9zdChidXMpOworCXJlc291cmNlX3NpemVfdAlvZmZzZXQ7CisJc3RydWN0IHJlc291cmNlICpyZXMsICpwcmVzOworCWludCBpOworCisJcHJfZGVidWcoIlJlc2VydmluZyBsZWdhY3kgcmFuZ2VzIGZvciBkb21haW4gJTA0eFxuIiwgcGNpX2RvbWFpbl9ucihidXMpKTsKKworCS8qIENoZWNrIGZvciBJTyAqLworCWlmICghKGhvc2UtPmlvX3Jlc291cmNlLmZsYWdzICYgSU9SRVNPVVJDRV9JTykpCisJCWdvdG8gbm9faW87CisJb2Zmc2V0ID0gKHVuc2lnbmVkIGxvbmcpaG9zZS0+aW9fYmFzZV92aXJ0IC0gX0lPX0JBU0U7CisJcmVzID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHJlc291cmNlKSwgR0ZQX0tFUk5FTCk7CisJQlVHX09OKHJlcyA9PSBOVUxMKTsKKwlyZXMtPm5hbWUgPSAiTGVnYWN5IElPIjsKKwlyZXMtPmZsYWdzID0gSU9SRVNPVVJDRV9JTzsKKwlyZXMtPnN0YXJ0ID0gb2Zmc2V0OworCXJlcy0+ZW5kID0gKG9mZnNldCArIDB4ZmZmKSAmIDB4ZmZmZmZmZmZ1bDsKKwlwcl9kZWJ1ZygiQ2FuZGlkYXRlIGxlZ2FjeSBJTzogJXBSXG4iLCByZXMpOworCWlmIChyZXF1ZXN0X3Jlc291cmNlKCZob3NlLT5pb19yZXNvdXJjZSwgcmVzKSkgeworCQlwcmludGsoS0VSTl9ERUJVRworCQkgICAgICAgIlBDSSAlMDR4OiUwMnggQ2Fubm90IHJlc2VydmUgTGVnYWN5IElPICVwUlxuIiwKKwkJICAgICAgIHBjaV9kb21haW5fbnIoYnVzKSwgYnVzLT5udW1iZXIsIHJlcyk7CisJCWtmcmVlKHJlcyk7CisJfQorCisgbm9faW86CisJLyogQ2hlY2sgZm9yIG1lbW9yeSAqLworCW9mZnNldCA9IGhvc2UtPnBjaV9tZW1fb2Zmc2V0OworCXByX2RlYnVnKCJob3NlIG1lbSBvZmZzZXQ6ICUwMTZsbHhcbiIsICh1bnNpZ25lZCBsb25nIGxvbmcpb2Zmc2V0KTsKKwlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisJCXByZXMgPSAmaG9zZS0+bWVtX3Jlc291cmNlc1tpXTsKKwkJaWYgKCEocHJlcy0+ZmxhZ3MgJiBJT1JFU09VUkNFX01FTSkpCisJCQljb250aW51ZTsKKwkJcHJfZGVidWcoImhvc2UgbWVtIHJlczogJXBSXG4iLCBwcmVzKTsKKwkJaWYgKChwcmVzLT5zdGFydCAtIG9mZnNldCkgPD0gMHhhMDAwMCAmJgorCQkgICAgKHByZXMtPmVuZCAtIG9mZnNldCkgPj0gMHhiZmZmZikKKwkJCWJyZWFrOworCX0KKwlpZiAoaSA+PSAzKQorCQlyZXR1cm47CisJcmVzID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHJlc291cmNlKSwgR0ZQX0tFUk5FTCk7CisJQlVHX09OKHJlcyA9PSBOVUxMKTsKKwlyZXMtPm5hbWUgPSAiTGVnYWN5IFZHQSBtZW1vcnkiOworCXJlcy0+ZmxhZ3MgPSBJT1JFU09VUkNFX01FTTsKKwlyZXMtPnN0YXJ0ID0gMHhhMDAwMCArIG9mZnNldDsKKwlyZXMtPmVuZCA9IDB4YmZmZmYgKyBvZmZzZXQ7CisJcHJfZGVidWcoIkNhbmRpZGF0ZSBWR0EgbWVtb3J5OiAlcFJcbiIsIHJlcyk7CisJaWYgKHJlcXVlc3RfcmVzb3VyY2UocHJlcywgcmVzKSkgeworCQlwcmludGsoS0VSTl9ERUJVRworCQkgICAgICAgIlBDSSAlMDR4OiUwMnggQ2Fubm90IHJlc2VydmUgVkdBIG1lbW9yeSAlcFJcbiIsCisJCSAgICAgICBwY2lfZG9tYWluX25yKGJ1cyksIGJ1cy0+bnVtYmVyLCByZXMpOworCQlrZnJlZShyZXMpOworCX0KK30KKwogdm9pZCBfX2luaXQgcGNpYmlvc19yZXNvdXJjZV9zdXJ2ZXkodm9pZCkKIHsKIAlzdHJ1Y3QgcGNpX2J1cyAqYjsKQEAgLTEzNzEsNiArMTQyOCwxOCBAQAogCQlwY2liaW9zX2FsbG9jYXRlX3Jlc291cmNlcygxKTsKIAl9CiAKKwkvKiBCZWZvcmUgd2Ugc3RhcnQgYXNzaWduaW5nIHVuYXNzaWduZWQgcmVzb3VyY2UsIHdlIHRyeSB0byByZXNlcnZlCisJICogdGhlIGxvdyBJTyBhcmVhIGFuZCB0aGUgVkdBIG1lbW9yeSBhcmVhIGlmIHRoZXkgaW50ZXJzZWN0IHRoZQorCSAqIGJ1cyBhdmFpbGFibGUgcmVzb3VyY2VzIHRvIGF2b2lkIGFsbG9jYXRpbmcgdGhpbmdzIG9uIHRvcCBvZiB0aGVtCisJICovCisJaWYgKCEocHBjX3BjaV9mbGFncyAmIFBQQ19QQ0lfUFJPQkVfT05MWSkpIHsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShiLCAmcGNpX3Jvb3RfYnVzZXMsIG5vZGUpCisJCQlwY2liaW9zX3Jlc2VydmVfbGVnYWN5X3JlZ2lvbnMoYik7CisJfQorCisJLyogTm93LCBpZiB0aGUgcGxhdGZvcm0gZGlkbid0IGRlY2lkZSB0byBibGluZGx5IHRydXN0IHRoZSBmaXJtd2FyZSwKKwkgKiB3ZSBwcm9jZWVkIHRvIGFzc2lnbmluZyB0aGluZ3MgdGhhdCB3ZXJlIGxlZnQgdW5hc3NpZ25lZAorCSAqLwogCWlmICghKHBwY19wY2lfZmxhZ3MgJiBQUENfUENJX1BST0JFX09OTFkpKSB7CiAJCXByX2RlYnVnKCJQQ0k6IEFzc2lnbmluZyB1bmFzc2lnbmVkIHJlc291Y2VzLi4uXG4iKTsKIAkJcGNpX2Fzc2lnbl91bmFzc2lnbmVkX3Jlc291cmNlcygpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wY2lfNjQuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcGNpXzY0LmMKaW5kZXggMzlmYWRjNi4uZWE4ZWRhOCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wY2lfNjQuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3BjaV82NC5jCkBAIC00NzAsNyArNDcwLDcgQEAKIAlpZiAoYnVzLT5zZWxmKSB7CiAJCXByX2RlYnVnKCJJTyBtYXBwaW5nIGZvciBQQ0ktUENJIGJyaWRnZSAlc1xuIiwKIAkJCSBwY2lfbmFtZShidXMtPnNlbGYpKTsKLQkJcHJfZGVidWcoIiAgdmlydD0weCUwMTZseC4uLjB4JTAxNmx4XG4iLAorCQlwcl9kZWJ1ZygiICB2aXJ0PTB4JTAxNmxseC4uLjB4JTAxNmxseFxuIiwKIAkJCSBidXMtPnJlc291cmNlWzBdLT5zdGFydCArIF9JT19CQVNFLAogCQkJIGJ1cy0+cmVzb3VyY2VbMF0tPmVuZCArIF9JT19CQVNFKTsKIAkJcmV0dXJuIDA7CkBAIC01MDIsNyArNTAyLDcgQEAKIAkJCQkJICAgICAgaG9zZS0+aW9fYmFzZV9waHlzIC0gcGh5c19wYWdlKTsKIAogCXByX2RlYnVnKCJJTyBtYXBwaW5nIGZvciBQSEIgJXNcbiIsIGhvc2UtPmRuLT5mdWxsX25hbWUpOwotCXByX2RlYnVnKCIgIHBoeXM9MHglMDE2bHgsIHZpcnQ9MHglcCAoYWxsb2M9MHglcClcbiIsCisJcHJfZGVidWcoIiAgcGh5cz0weCUwMTZsbHgsIHZpcnQ9MHglcCAoYWxsb2M9MHglcClcbiIsCiAJCSBob3NlLT5pb19iYXNlX3BoeXMsIGhvc2UtPmlvX2Jhc2VfdmlydCwgaG9zZS0+aW9fYmFzZV9hbGxvYyk7CiAJcHJfZGVidWcoIiAgc2l6ZT0weCUwMTZseCAoYWxsb2M9MHglMDE2bHgpXG4iLAogCQkgaG9zZS0+cGNpX2lvX3NpemUsIHNpemVfcGFnZSk7CkBAIC01MTcsNyArNTE3LDcgQEAKIAlob3NlLT5pb19yZXNvdXJjZS5zdGFydCArPSBpb192aXJ0X29mZnNldDsKIAlob3NlLT5pb19yZXNvdXJjZS5lbmQgKz0gaW9fdmlydF9vZmZzZXQ7CiAKLQlwcl9kZWJ1ZygiICBob3NlLT5pb19yZXNvdXJjZT0weCUwMTZseC4uLjB4JTAxNmx4XG4iLAorCXByX2RlYnVnKCIgIGhvc2UtPmlvX3Jlc291cmNlPTB4JTAxNmxseC4uLjB4JTAxNmxseFxuIiwKIAkJIGhvc2UtPmlvX3Jlc291cmNlLnN0YXJ0LCBob3NlLT5pb19yZXNvdXJjZS5lbmQpOwogCiAJcmV0dXJuIDA7CkBAIC01NjAsOSArNTYwLDE0IEBACiAJICogRzUgbWFjaGluZXMuLi4gU28gd2hlbiBzb21ldGhpbmcgYXNrcyBmb3IgYnVzIDAgaW8gYmFzZQogCSAqIChidXMgMCBpcyBIVCByb290KSwgd2UgcmV0dXJuIHRoZSBBR1Agb25lIGluc3RlYWQuCiAJICovCi0JaWYgKG1hY2hpbmVfaXNfY29tcGF0aWJsZSgiTWFjUklTQzQiKSkKLQkJaWYgKGluX2J1cyA9PSAwKQorCWlmIChpbl9idXMgPT0gMCAmJiBtYWNoaW5lX2lzX2NvbXBhdGlibGUoIk1hY1JJU0M0IikpIHsKKwkJc3RydWN0IGRldmljZV9ub2RlICphZ3A7CisKKwkJYWdwID0gb2ZfZmluZF9jb21wYXRpYmxlX25vZGUoTlVMTCwgTlVMTCwgInUzLWFncCIpOworCQlpZiAoYWdwKQogCQkJaW5fYnVzID0gMHhmMDsKKwkJb2Zfbm9kZV9wdXQoYWdwKTsKKwl9CiAKIAkvKiBUaGF0IHN5c2NhbGwgaXNuJ3QgcXVpdGUgY29tcGF0aWJsZSB3aXRoIFBDSSBkb21haW5zLCBidXQgaXQncwogCSAqIHVzZWQgb24gcHJlLWRvbWFpbnMgc2V0dXAuIFdlIHJldHVybiB0aGUgZmlyc3QgbWF0Y2gKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHBjX2tzeW1zLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3BwY19rc3ltcy5jCmluZGV4IGRjZWMxMzIuLmM4YjI3YmIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHBjX2tzeW1zLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wcGNfa3N5bXMuYwpAQCAtMTY1LDYgKzE2NSw3IEBACiBFWFBPUlRfU1lNQk9MKGlycV9kZXNjKTsKIEVYUE9SVF9TWU1CT0wodGJfdGlja3NfcGVyX2ppZmZ5KTsKIEVYUE9SVF9TWU1CT0woY2FjaGVhYmxlX21lbWNweSk7CitFWFBPUlRfU1lNQk9MKGNhY2hlYWJsZV9tZW16ZXJvKTsKICNlbmRpZgogCiAjaWZkZWYgQ09ORklHX1BQQzMyCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3Byb20uYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHJvbS5jCmluZGV4IDZmNzNjNzMuLmYwMGY4MzEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHJvbS5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHJvbS5jCkBAIC01OTAsNiArNTkwLDExIEBACiB7CiAJdTMyICpzbGJfc2l6ZV9wdHI7CiAKKwlzbGJfc2l6ZV9wdHIgPSBvZl9nZXRfZmxhdF9kdF9wcm9wKG5vZGUsICJzbGItc2l6ZSIsIE5VTEwpOworCWlmIChzbGJfc2l6ZV9wdHIgIT0gTlVMTCkgeworCQltbXVfc2xiX3NpemUgPSAqc2xiX3NpemVfcHRyOworCQlyZXR1cm47CisJfQogCXNsYl9zaXplX3B0ciA9IG9mX2dldF9mbGF0X2R0X3Byb3Aobm9kZSwgImlibSxzbGItc2l6ZSIsIE5VTEwpOwogCWlmIChzbGJfc2l6ZV9wdHIgIT0gTlVMTCkgewogCQltbXVfc2xiX3NpemUgPSAqc2xiX3NpemVfcHRyOwpAQCAtODI0LDExICs4MjksMTEgQEAKICNlbmRpZgogCiAjaWZkZWYgQ09ORklHX0tFWEVDCi0JbHByb3AgPSAodTY0KilvZl9nZXRfZmxhdF9kdF9wcm9wKG5vZGUsICJsaW51eCxjcmFzaGtlcm5lbC1iYXNlIiwgTlVMTCk7CisJbHByb3AgPSBvZl9nZXRfZmxhdF9kdF9wcm9wKG5vZGUsICJsaW51eCxjcmFzaGtlcm5lbC1iYXNlIiwgTlVMTCk7CiAJaWYgKGxwcm9wKQogCQljcmFzaGtfcmVzLnN0YXJ0ID0gKmxwcm9wOwogCi0JbHByb3AgPSAodTY0KilvZl9nZXRfZmxhdF9kdF9wcm9wKG5vZGUsICJsaW51eCxjcmFzaGtlcm5lbC1zaXplIiwgTlVMTCk7CisJbHByb3AgPSBvZl9nZXRfZmxhdF9kdF9wcm9wKG5vZGUsICJsaW51eCxjcmFzaGtlcm5lbC1zaXplIiwgTlVMTCk7CiAJaWYgKGxwcm9wKQogCQljcmFzaGtfcmVzLmVuZCA9IGNyYXNoa19yZXMuc3RhcnQgKyAqbHByb3AgLSAxOwogI2VuZGlmCkBAIC04OTMsMTIgKzg5OCwxMiBAQAogCXU2NCBiYXNlLCBzaXplLCBsbWJfc2l6ZTsKIAl1bnNpZ25lZCBpbnQgaXNfa2V4ZWNfa2R1bXAgPSAwLCBybmdzOwogCi0JbHMgPSAoY2VsbF90ICopb2ZfZ2V0X2ZsYXRfZHRfcHJvcChub2RlLCAiaWJtLGxtYi1zaXplIiwgJmwpOworCWxzID0gb2ZfZ2V0X2ZsYXRfZHRfcHJvcChub2RlLCAiaWJtLGxtYi1zaXplIiwgJmwpOwogCWlmIChscyA9PSBOVUxMIHx8IGwgPCBkdF9yb290X3NpemVfY2VsbHMgKiBzaXplb2YoY2VsbF90KSkKIAkJcmV0dXJuIDA7CiAJbG1iX3NpemUgPSBkdF9tZW1fbmV4dF9jZWxsKGR0X3Jvb3Rfc2l6ZV9jZWxscywgJmxzKTsKIAotCWRtID0gKGNlbGxfdCAqKW9mX2dldF9mbGF0X2R0X3Byb3Aobm9kZSwgImlibSxkeW5hbWljLW1lbW9yeSIsICZsKTsKKwlkbSA9IG9mX2dldF9mbGF0X2R0X3Byb3Aobm9kZSwgImlibSxkeW5hbWljLW1lbW9yeSIsICZsKTsKIAlpZiAoZG0gPT0gTlVMTCB8fCBsIDwgc2l6ZW9mKGNlbGxfdCkpCiAJCXJldHVybiAwOwogCkBAIC05MDcsNyArOTEyLDcgQEAKIAkJcmV0dXJuIDA7CiAKIAkvKiBjaGVjayBpZiB0aGlzIGlzIGEga2V4ZWMva2R1bXAga2VybmVsLiAqLwotCXVzbSA9IChjZWxsX3QgKilvZl9nZXRfZmxhdF9kdF9wcm9wKG5vZGUsICJsaW51eCxkcmNvbmYtdXNhYmxlLW1lbW9yeSIsCisJdXNtID0gb2ZfZ2V0X2ZsYXRfZHRfcHJvcChub2RlLCAibGludXgsZHJjb25mLXVzYWJsZS1tZW1vcnkiLAogCQkJCQkJICZsKTsKIAlpZiAodXNtICE9IE5VTEwpCiAJCWlzX2tleGVjX2tkdW1wID0gMTsKQEAgLTk4MSw5ICs5ODYsOSBAQAogCX0gZWxzZSBpZiAoc3RyY21wKHR5cGUsICJtZW1vcnkiKSAhPSAwKQogCQlyZXR1cm4gMDsKIAotCXJlZyA9IChjZWxsX3QgKilvZl9nZXRfZmxhdF9kdF9wcm9wKG5vZGUsICJsaW51eCx1c2FibGUtbWVtb3J5IiwgJmwpOworCXJlZyA9IG9mX2dldF9mbGF0X2R0X3Byb3Aobm9kZSwgImxpbnV4LHVzYWJsZS1tZW1vcnkiLCAmbCk7CiAJaWYgKHJlZyA9PSBOVUxMKQotCQlyZWcgPSAoY2VsbF90ICopb2ZfZ2V0X2ZsYXRfZHRfcHJvcChub2RlLCAicmVnIiwgJmwpOworCQlyZWcgPSBvZl9nZXRfZmxhdF9kdF9wcm9wKG5vZGUsICJyZWciLCAmbCk7CiAJaWYgKHJlZyA9PSBOVUxMKQogCQlyZXR1cm4gMDsKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wcm9tX2luaXQuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHJvbV9pbml0LmMKaW5kZXggMjQ0NTk0NS4uN2YxYjMzZCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wcm9tX2luaXQuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3Byb21faW5pdC5jCkBAIC0xMjEwLDcgKzEyMTAsNyBAQAogCQkvKiBJbml0aWFsaXplIHRoZSB0YWJsZSB0byBoYXZlIGEgb25lLXRvLW9uZSBtYXBwaW5nCiAJCSAqIG92ZXIgdGhlIGFsbG9jYXRlZCBzaXplLgogCQkgKi8KLQkJdGNlX2VudHJ5cCA9ICh1bnNpZ25lZCBsb25nICopYmFzZTsKKwkJdGNlX2VudHJ5cCA9ICh1NjQgKiliYXNlOwogCQlmb3IgKGkgPSAwOyBpIDwgKG1pbnNpemUgPj4gMykgO3RjZV9lbnRyeXArKywgaSsrKSB7CiAJCQl0Y2VfZW50cnkgPSAoaSA8PCBQQUdFX1NISUZUKTsKIAkJCXRjZV9lbnRyeSB8PSAweDM7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3Byb21fcGFyc2UuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHJvbV9wYXJzZS5jCmluZGV4IDhjMTMzNTUuLjhmMDg1NmYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHJvbV9wYXJzZS5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHJvbV9wYXJzZS5jCkBAIC0yMzIsMTEgKzIzMiw2IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChvZl9wY2lfYWRkcmVzc190b19yZXNvdXJjZSk7CiAKLXN0YXRpYyB1OCBvZl9pcnFfcGNpX3N3aXp6bGUodTggc2xvdCwgdTggcGluKQotewotCXJldHVybiAoKChwaW4gLSAxKSArIHNsb3QpICUgNCkgKyAxOwotfQotCiBpbnQgb2ZfaXJxX21hcF9wY2koc3RydWN0IHBjaV9kZXYgKnBkZXYsIHN0cnVjdCBvZl9pcnEgKm91dF9pcnEpCiB7CiAJc3RydWN0IGRldmljZV9ub2RlICpkbiwgKnBwbm9kZTsKQEAgLTMwNiw3ICszMDEsNyBAQAogCQkvKiBXZSBjYW4gb25seSBnZXQgaGVyZSBpZiB3ZSBoaXQgYSBQMlAgYnJpZGdlIHdpdGggbm8gbm9kZSwKIAkJICogbGV0J3MgZG8gc3RhbmRhcmQgc3dpenpsaW5nIGFuZCB0cnkgYWdhaW4KIAkJICovCi0JCWxzcGVjID0gb2ZfaXJxX3BjaV9zd2l6emxlKFBDSV9TTE9UKHBkZXYtPmRldmZuKSwgbHNwZWMpOworCQlsc3BlYyA9IHBjaV9zd2l6emxlX2ludGVycnVwdF9waW4ocGRldiwgbHNwZWMpOwogCQlwZGV2ID0gcHBkZXY7CiAJfQogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3NldHVwXzY0LmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3NldHVwXzY0LmMKaW5kZXggZDhiZDIxNi4uMmQzNDE5NiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9zZXR1cF82NC5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvc2V0dXBfNjQuYwpAQCAtNDM0LDggKzQzNCw4IEBACiAJcHJpbnRrKCJTdGFydGluZyBMaW51eCBQUEM2NCAlc1xuIiwgaW5pdF91dHNuYW1lKCktPnZlcnNpb24pOwogCiAJcHJpbnRrKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7Ci0JcHJpbnRrKCJwcGM2NF9wZnRfc2l6ZSAgICAgICAgICAgICAgICA9IDB4JWx4XG4iLCBwcGM2NF9wZnRfc2l6ZSk7Ci0JcHJpbnRrKCJwaHlzaWNhbE1lbW9yeVNpemUgICAgICAgICAgICA9IDB4JWx4XG4iLCBsbWJfcGh5c19tZW1fc2l6ZSgpKTsKKwlwcmludGsoInBwYzY0X3BmdF9zaXplICAgICAgICAgICAgICAgID0gMHglbGx4XG4iLCBwcGM2NF9wZnRfc2l6ZSk7CisJcHJpbnRrKCJwaHlzaWNhbE1lbW9yeVNpemUgICAgICAgICAgICA9IDB4JWxseFxuIiwgbG1iX3BoeXNfbWVtX3NpemUoKSk7CiAJaWYgKHBwYzY0X2NhY2hlcy5kbGluZV9zaXplICE9IDB4ODApCiAJCXByaW50aygicHBjNjRfY2FjaGVzLmRjYWNoZV9saW5lX3NpemUgPSAweCV4XG4iLAogCQkgICAgICAgcHBjNjRfY2FjaGVzLmRsaW5lX3NpemUpOwpAQCAtNDkzLDcgKzQ5Myw3IEBACiAJICogYnJpbmd1cCwgd2UgbmVlZCB0byBnZXQgYXQgdGhlbSBpbiByZWFsIG1vZGUuIFRoaXMgbWVhbnMgdGhleQogCSAqIG11c3QgYWxzbyBiZSB3aXRoaW4gdGhlIFJNTyByZWdpb24uCiAJICovCi0JbGltaXQgPSBtaW4oMHgxMDAwMDAwMFVMLCBsbWIucm1vX3NpemUpOworCWxpbWl0ID0gbWluKDB4MTAwMDAwMDBVTEwsIGxtYi5ybW9fc2l6ZSk7CiAKIAlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoaSkgewogCQl1bnNpZ25lZCBsb25nIHNwOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9zeXNmcy5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9zeXNmcy5jCmluZGV4IDBjNjRmMTAuLjRhMmVlMDggMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvc3lzZnMuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3N5c2ZzLmMKQEAgLTE4LDYgKzE4LDggQEAKICNpbmNsdWRlIDxhc20vbWFjaGRlcC5oPgogI2luY2x1ZGUgPGFzbS9zbXAuaD4KIAorI2luY2x1ZGUgImNhY2hlaW5mby5oIgorCiAjaWZkZWYgQ09ORklHX1BQQzY0CiAjaW5jbHVkZSA8YXNtL3BhY2EuaD4KICNpbmNsdWRlIDxhc20vbHBwYWNhLmg+CkBAIC0yNSw4ICsyNyw2IEBACiAKIHN0YXRpYyBERUZJTkVfUEVSX0NQVShzdHJ1Y3QgY3B1LCBjcHVfZGV2aWNlcyk7CiAKLXN0YXRpYyBERUZJTkVfUEVSX0NQVShzdHJ1Y3Qga29iamVjdCAqLCBjYWNoZV90b3BsZXZlbCk7Ci0KIC8qCiAgKiBTTVQgc25vb3plIGRlbGF5IHN0dWZmLCA2NC1iaXQgb25seSBmb3Igbm93CiAgKi8KQEAgLTM0MywyODMgKzM0Myw2IEBACiAjZW5kaWYgLyogSEFTX1BQQ19QTUNfUEE2VCAqLwogI2VuZGlmIC8qIEhBU19QUENfUE1DX0NMQVNTSUMgKi8KIAotc3RydWN0IGNhY2hlX2Rlc2MgewotCXN0cnVjdCBrb2JqZWN0IGtvYmo7Ci0Jc3RydWN0IGNhY2hlX2Rlc2MgKm5leHQ7Ci0JY29uc3QgY2hhciAqdHlwZTsJLyogSW5zdHJ1Y3Rpb24sIERhdGEsIG9yIFVuaWZpZWQgKi8KLQl1MzIgc2l6ZTsJCS8qIHRvdGFsIGNhY2hlIHNpemUgaW4gS0IgKi8KLQl1MzIgbGluZV9zaXplOwkJLyogaW4gYnl0ZXMgKi8KLQl1MzIgbnJfc2V0czsJCS8qIG51bWJlciBvZiBzZXRzICovCi0JdTMyIGxldmVsOwkJLyogZS5nLiAxLCAyLCAzLi4uICovCi0JdTMyIGFzc29jaWF0aXZpdHk7CS8qIGUuZy4gOC13YXkuLi4gMCBpcyBmdWxseSBhc3NvY2lhdGl2ZSAqLwotfTsKLQotREVGSU5FX1BFUl9DUFUoc3RydWN0IGNhY2hlX2Rlc2MgKiwgY2FjaGVfZGVzYyk7Ci0KLXN0YXRpYyBzdHJ1Y3QgY2FjaGVfZGVzYyAqa29ial90b19jYWNoZV9kZXNjKHN0cnVjdCBrb2JqZWN0ICprKQotewotCXJldHVybiBjb250YWluZXJfb2Yoaywgc3RydWN0IGNhY2hlX2Rlc2MsIGtvYmopOwotfQotCi1zdGF0aWMgdm9pZCBjYWNoZV9kZXNjX3JlbGVhc2Uoc3RydWN0IGtvYmplY3QgKmspCi17Ci0Jc3RydWN0IGNhY2hlX2Rlc2MgKmRlc2MgPSBrb2JqX3RvX2NhY2hlX2Rlc2Moayk7Ci0KLQlwcl9kZWJ1ZygiJXM6IHJlbGVhc2luZyAlc1xuIiwgX19mdW5jX18sIGtvYmplY3RfbmFtZShrKSk7Ci0KLQlpZiAoZGVzYy0+bmV4dCkKLQkJa29iamVjdF9wdXQoJmRlc2MtPm5leHQtPmtvYmopOwotCi0Ja2ZyZWUoa29ial90b19jYWNoZV9kZXNjKGspKTsKLX0KLQotc3RhdGljIHNzaXplX3QgY2FjaGVfZGVzY19zaG93KHN0cnVjdCBrb2JqZWN0ICprLCBzdHJ1Y3QgYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCi17Ci0Jc3RydWN0IGtvYmpfYXR0cmlidXRlICprb2JqX2F0dHI7Ci0KLQlrb2JqX2F0dHIgPSBjb250YWluZXJfb2YoYXR0ciwgc3RydWN0IGtvYmpfYXR0cmlidXRlLCBhdHRyKTsKLQotCXJldHVybiBrb2JqX2F0dHItPnNob3coaywga29ial9hdHRyLCBidWYpOwotfQotCi1zdGF0aWMgc3RydWN0IHN5c2ZzX29wcyBjYWNoZV9kZXNjX3N5c2ZzX29wcyA9IHsKLQkuc2hvdyA9IGNhY2hlX2Rlc2Nfc2hvdywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qga29ial90eXBlIGNhY2hlX2Rlc2NfdHlwZSA9IHsKLQkucmVsZWFzZSA9IGNhY2hlX2Rlc2NfcmVsZWFzZSwKLQkuc3lzZnNfb3BzID0gJmNhY2hlX2Rlc2Nfc3lzZnNfb3BzLAotfTsKLQotc3RhdGljIHNzaXplX3QgY2FjaGVfc2l6ZV9zaG93KHN0cnVjdCBrb2JqZWN0ICprLCBzdHJ1Y3Qga29ial9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3QgY2FjaGVfZGVzYyAqY2FjaGUgPSBrb2JqX3RvX2NhY2hlX2Rlc2Moayk7Ci0KLQlyZXR1cm4gc3ByaW50ZihidWYsICIldUtcbiIsIGNhY2hlLT5zaXplKTsKLX0KLQotc3RhdGljIHN0cnVjdCBrb2JqX2F0dHJpYnV0ZSBjYWNoZV9zaXplX2F0dHIgPQotCV9fQVRUUihzaXplLCAwNDQ0LCBjYWNoZV9zaXplX3Nob3csIE5VTEwpOwotCi1zdGF0aWMgc3NpemVfdCBjYWNoZV9saW5lX3NpemVfc2hvdyhzdHJ1Y3Qga29iamVjdCAqaywgc3RydWN0IGtvYmpfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCi17Ci0Jc3RydWN0IGNhY2hlX2Rlc2MgKmNhY2hlID0ga29ial90b19jYWNoZV9kZXNjKGspOwotCi0JcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIGNhY2hlLT5saW5lX3NpemUpOwotfQotCi1zdGF0aWMgc3RydWN0IGtvYmpfYXR0cmlidXRlIGNhY2hlX2xpbmVfc2l6ZV9hdHRyID0KLQlfX0FUVFIoY29oZXJlbmN5X2xpbmVfc2l6ZSwgMDQ0NCwgY2FjaGVfbGluZV9zaXplX3Nob3csIE5VTEwpOwotCi1zdGF0aWMgc3NpemVfdCBjYWNoZV9ucl9zZXRzX3Nob3coc3RydWN0IGtvYmplY3QgKmssIHN0cnVjdCBrb2JqX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQotewotCXN0cnVjdCBjYWNoZV9kZXNjICpjYWNoZSA9IGtvYmpfdG9fY2FjaGVfZGVzYyhrKTsKLQotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCBjYWNoZS0+bnJfc2V0cyk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qga29ial9hdHRyaWJ1dGUgY2FjaGVfbnJfc2V0c19hdHRyID0KLQlfX0FUVFIobnVtYmVyX29mX3NldHMsIDA0NDQsIGNhY2hlX25yX3NldHNfc2hvdywgTlVMTCk7Ci0KLXN0YXRpYyBzc2l6ZV90IGNhY2hlX3R5cGVfc2hvdyhzdHJ1Y3Qga29iamVjdCAqaywgc3RydWN0IGtvYmpfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCi17Ci0Jc3RydWN0IGNhY2hlX2Rlc2MgKmNhY2hlID0ga29ial90b19jYWNoZV9kZXNjKGspOwotCi0JcmV0dXJuIHNwcmludGYoYnVmLCAiJXNcbiIsIGNhY2hlLT50eXBlKTsKLX0KLQotc3RhdGljIHN0cnVjdCBrb2JqX2F0dHJpYnV0ZSBjYWNoZV90eXBlX2F0dHIgPQotCV9fQVRUUih0eXBlLCAwNDQ0LCBjYWNoZV90eXBlX3Nob3csIE5VTEwpOwotCi1zdGF0aWMgc3NpemVfdCBjYWNoZV9sZXZlbF9zaG93KHN0cnVjdCBrb2JqZWN0ICprLCBzdHJ1Y3Qga29ial9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3QgY2FjaGVfZGVzYyAqY2FjaGUgPSBrb2JqX3RvX2NhY2hlX2Rlc2Moayk7Ci0KLQlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgY2FjaGUtPmxldmVsKTsKLX0KLQotc3RhdGljIHN0cnVjdCBrb2JqX2F0dHJpYnV0ZSBjYWNoZV9sZXZlbF9hdHRyID0KLQlfX0FUVFIobGV2ZWwsIDA0NDQsIGNhY2hlX2xldmVsX3Nob3csIE5VTEwpOwotCi1zdGF0aWMgc3NpemVfdCBjYWNoZV9hc3NvY19zaG93KHN0cnVjdCBrb2JqZWN0ICprLCBzdHJ1Y3Qga29ial9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3QgY2FjaGVfZGVzYyAqY2FjaGUgPSBrb2JqX3RvX2NhY2hlX2Rlc2Moayk7Ci0KLQlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgY2FjaGUtPmFzc29jaWF0aXZpdHkpOwotfQotCi1zdGF0aWMgc3RydWN0IGtvYmpfYXR0cmlidXRlIGNhY2hlX2Fzc29jX2F0dHIgPQotCV9fQVRUUih3YXlzX29mX2Fzc29jaWF0aXZpdHksIDA0NDQsIGNhY2hlX2Fzc29jX3Nob3csIE5VTEwpOwotCi1zdHJ1Y3QgY2FjaGVfZGVzY19pbmZvIHsKLQljb25zdCBjaGFyICp0eXBlOwotCWNvbnN0IGNoYXIgKnNpemVfcHJvcDsKLQljb25zdCBjaGFyICpsaW5lX3NpemVfcHJvcDsKLQljb25zdCBjaGFyICpucl9zZXRzX3Byb3A7Ci19OwotCi0vKiBQb3dlclBDIFByb2Nlc3NvciBiaW5kaW5nIHNheXMgdGhlIFtkaV0tY2FjaGUtKiBtdXN0IGJlIGVxdWFsIG9uCi0gKiB1bmlmaWVkIGNhY2hlcywgc28ganVzdCB1c2UgZC1jYWNoZSBwcm9wZXJ0aWVzLiAqLwotc3RhdGljIHN0cnVjdCBjYWNoZV9kZXNjX2luZm8gdWNhY2hlX2luZm8gPSB7Ci0JLnR5cGUgPSAiVW5pZmllZCIsCi0JLnNpemVfcHJvcCA9ICJkLWNhY2hlLXNpemUiLAotCS5saW5lX3NpemVfcHJvcCA9ICJkLWNhY2hlLWxpbmUtc2l6ZSIsCi0JLm5yX3NldHNfcHJvcCA9ICJkLWNhY2hlLXNldHMiLAotfTsKLQotc3RhdGljIHN0cnVjdCBjYWNoZV9kZXNjX2luZm8gZGNhY2hlX2luZm8gPSB7Ci0JLnR5cGUgPSAiRGF0YSIsCi0JLnNpemVfcHJvcCA9ICJkLWNhY2hlLXNpemUiLAotCS5saW5lX3NpemVfcHJvcCA9ICJkLWNhY2hlLWxpbmUtc2l6ZSIsCi0JLm5yX3NldHNfcHJvcCA9ICJkLWNhY2hlLXNldHMiLAotfTsKLQotc3RhdGljIHN0cnVjdCBjYWNoZV9kZXNjX2luZm8gaWNhY2hlX2luZm8gPSB7Ci0JLnR5cGUgPSAiSW5zdHJ1Y3Rpb24iLAotCS5zaXplX3Byb3AgPSAiaS1jYWNoZS1zaXplIiwKLQkubGluZV9zaXplX3Byb3AgPSAiaS1jYWNoZS1saW5lLXNpemUiLAotCS5ucl9zZXRzX3Byb3AgPSAiaS1jYWNoZS1zZXRzIiwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2FjaGVfZGVzYyAqIF9fY3B1aW5pdCBjcmVhdGVfY2FjaGVfZGVzYyhzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLCBzdHJ1Y3Qga29iamVjdCAqcGFyZW50LCBpbnQgaW5kZXgsIGludCBsZXZlbCwgc3RydWN0IGNhY2hlX2Rlc2NfaW5mbyAqaW5mbykKLXsKLQljb25zdCB1MzIgKmNhY2hlX2xpbmVfc2l6ZTsKLQlzdHJ1Y3QgY2FjaGVfZGVzYyAqbmV3OwotCWNvbnN0IHUzMiAqY2FjaGVfc2l6ZTsKLQljb25zdCB1MzIgKm5yX3NldHM7Ci0JaW50IHJjOwotCi0JbmV3ID0ga3phbGxvYyhzaXplb2YoKm5ldyksIEdGUF9LRVJORUwpOwotCWlmICghbmV3KQotCQlyZXR1cm4gTlVMTDsKLQotCXJjID0ga29iamVjdF9pbml0X2FuZF9hZGQoJm5ldy0+a29iaiwgJmNhY2hlX2Rlc2NfdHlwZSwgcGFyZW50LAotCQkJCSAgImluZGV4JWQiLCBpbmRleCk7Ci0JaWYgKHJjKQotCQlnb3RvIGVycjsKLQotCS8qIHR5cGUgKi8KLQluZXctPnR5cGUgPSBpbmZvLT50eXBlOwotCXJjID0gc3lzZnNfY3JlYXRlX2ZpbGUoJm5ldy0+a29iaiwgJmNhY2hlX3R5cGVfYXR0ci5hdHRyKTsKLQlXQVJOX09OKHJjKTsKLQotCS8qIGxldmVsICovCi0JbmV3LT5sZXZlbCA9IGxldmVsOwotCXJjID0gc3lzZnNfY3JlYXRlX2ZpbGUoJm5ldy0+a29iaiwgJmNhY2hlX2xldmVsX2F0dHIuYXR0cik7Ci0JV0FSTl9PTihyYyk7Ci0KLQkvKiBzaXplICovCi0JY2FjaGVfc2l6ZSA9IG9mX2dldF9wcm9wZXJ0eShucCwgaW5mby0+c2l6ZV9wcm9wLCBOVUxMKTsKLQlpZiAoY2FjaGVfc2l6ZSkgewotCQluZXctPnNpemUgPSAqY2FjaGVfc2l6ZSAvIDEwMjQ7Ci0JCXJjID0gc3lzZnNfY3JlYXRlX2ZpbGUoJm5ldy0+a29iaiwKLQkJCQkgICAgICAgJmNhY2hlX3NpemVfYXR0ci5hdHRyKTsKLQkJV0FSTl9PTihyYyk7Ci0JfQotCi0JLyogY29oZXJlbmN5X2xpbmVfc2l6ZSAqLwotCWNhY2hlX2xpbmVfc2l6ZSA9IG9mX2dldF9wcm9wZXJ0eShucCwgaW5mby0+bGluZV9zaXplX3Byb3AsIE5VTEwpOwotCWlmIChjYWNoZV9saW5lX3NpemUpIHsKLQkJbmV3LT5saW5lX3NpemUgPSAqY2FjaGVfbGluZV9zaXplOwotCQlyYyA9IHN5c2ZzX2NyZWF0ZV9maWxlKCZuZXctPmtvYmosCi0JCQkJICAgICAgICZjYWNoZV9saW5lX3NpemVfYXR0ci5hdHRyKTsKLQkJV0FSTl9PTihyYyk7Ci0JfQotCi0JLyogbnVtYmVyX29mX3NldHMgKi8KLQlucl9zZXRzID0gb2ZfZ2V0X3Byb3BlcnR5KG5wLCBpbmZvLT5ucl9zZXRzX3Byb3AsIE5VTEwpOwotCWlmIChucl9zZXRzKSB7Ci0JCW5ldy0+bnJfc2V0cyA9ICpucl9zZXRzOwotCQlyYyA9IHN5c2ZzX2NyZWF0ZV9maWxlKCZuZXctPmtvYmosCi0JCQkJICAgICAgICZjYWNoZV9ucl9zZXRzX2F0dHIuYXR0cik7Ci0JCVdBUk5fT04ocmMpOwotCX0KLQotCS8qIHdheXNfb2ZfYXNzb2NpYXRpdml0eSAqLwotCWlmIChuZXctPm5yX3NldHMgPT0gMSkgewotCQkvKiBmdWxseSBhc3NvY2lhdGl2ZSAqLwotCQluZXctPmFzc29jaWF0aXZpdHkgPSAwOwotCQlnb3RvIGNyZWF0ZV9hc3NvYzsKLQl9Ci0KLQlpZiAobmV3LT5ucl9zZXRzICYmIG5ldy0+c2l6ZSAmJiBuZXctPmxpbmVfc2l6ZSkgewotCQkvKiBJZiB3ZSBoYXZlIHZhbHVlcyBmb3IgYWxsIG9mIHRoZXNlIHdlIGNhbiBkZXJpdmUKLQkJICogdGhlIGFzc29jaWF0aXZpdHkuICovCi0JCW5ldy0+YXNzb2NpYXRpdml0eSA9Ci0JCQkoKG5ldy0+c2l6ZSAqIDEwMjQpIC8gbmV3LT5ucl9zZXRzKSAvIG5ldy0+bGluZV9zaXplOwotY3JlYXRlX2Fzc29jOgotCQlyYyA9IHN5c2ZzX2NyZWF0ZV9maWxlKCZuZXctPmtvYmosCi0JCQkJICAgICAgICZjYWNoZV9hc3NvY19hdHRyLmF0dHIpOwotCQlXQVJOX09OKHJjKTsKLQl9Ci0KLQlyZXR1cm4gbmV3OwotZXJyOgotCWtmcmVlKG5ldyk7Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBib29sIGNhY2hlX2lzX3VuaWZpZWQoc3RydWN0IGRldmljZV9ub2RlICpucCkKLXsKLQlyZXR1cm4gb2ZfZ2V0X3Byb3BlcnR5KG5wLCAiY2FjaGUtdW5pZmllZCIsIE5VTEwpOwotfQotCi1zdGF0aWMgc3RydWN0IGNhY2hlX2Rlc2MgKiBfX2NwdWluaXQgY3JlYXRlX2NhY2hlX2luZGV4X2luZm8oc3RydWN0IGRldmljZV9ub2RlICpucCwgc3RydWN0IGtvYmplY3QgKnBhcmVudCwgaW50IGluZGV4LCBpbnQgbGV2ZWwpCi17Ci0Jc3RydWN0IGRldmljZV9ub2RlICpuZXh0X2NhY2hlOwotCXN0cnVjdCBjYWNoZV9kZXNjICpuZXcsICoqZW5kOwotCi0JcHJfZGVidWcoIiVzKG5vZGUgPSAlcywgaW5kZXggPSAlZClcbiIsIF9fZnVuY19fLCBucC0+ZnVsbF9uYW1lLCBpbmRleCk7Ci0KLQlpZiAoY2FjaGVfaXNfdW5pZmllZChucCkpIHsKLQkJbmV3ID0gY3JlYXRlX2NhY2hlX2Rlc2MobnAsIHBhcmVudCwgaW5kZXgsIGxldmVsLAotCQkJCQkmdWNhY2hlX2luZm8pOwotCX0gZWxzZSB7Ci0JCW5ldyA9IGNyZWF0ZV9jYWNoZV9kZXNjKG5wLCBwYXJlbnQsIGluZGV4LCBsZXZlbCwKLQkJCQkJJmRjYWNoZV9pbmZvKTsKLQkJaWYgKG5ldykgewotCQkJaW5kZXgrKzsKLQkJCW5ldy0+bmV4dCA9IGNyZWF0ZV9jYWNoZV9kZXNjKG5wLCBwYXJlbnQsIGluZGV4LCBsZXZlbCwKLQkJCQkJCSAgICAgICZpY2FjaGVfaW5mbyk7Ci0JCX0KLQl9Ci0JaWYgKCFuZXcpCi0JCXJldHVybiBOVUxMOwotCi0JZW5kID0gJm5ldy0+bmV4dDsKLQl3aGlsZSAoKmVuZCkKLQkJZW5kID0gJigqZW5kKS0+bmV4dDsKLQotCW5leHRfY2FjaGUgPSBvZl9maW5kX25leHRfY2FjaGVfbm9kZShucCk7Ci0JaWYgKCFuZXh0X2NhY2hlKQotCQlnb3RvIG91dDsKLQotCSplbmQgPSBjcmVhdGVfY2FjaGVfaW5kZXhfaW5mbyhuZXh0X2NhY2hlLCBwYXJlbnQsICsraW5kZXgsICsrbGV2ZWwpOwotCi0Jb2Zfbm9kZV9wdXQobmV4dF9jYWNoZSk7Ci1vdXQ6Ci0JcmV0dXJuIG5ldzsKLX0KLQotc3RhdGljIHZvaWQgX19jcHVpbml0IGNyZWF0ZV9jYWNoZV9pbmZvKHN0cnVjdCBzeXNfZGV2aWNlICpzeXNkZXYpCi17Ci0Jc3RydWN0IGtvYmplY3QgKmNhY2hlX3RvcGxldmVsOwotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBOVUxMOwotCWludCBjcHUgPSBzeXNkZXYtPmlkOwotCi0JY2FjaGVfdG9wbGV2ZWwgPSBrb2JqZWN0X2NyZWF0ZV9hbmRfYWRkKCJjYWNoZSIsICZzeXNkZXYtPmtvYmopOwotCWlmICghY2FjaGVfdG9wbGV2ZWwpCi0JCXJldHVybjsKLQlwZXJfY3B1KGNhY2hlX3RvcGxldmVsLCBjcHUpID0gY2FjaGVfdG9wbGV2ZWw7Ci0JbnAgPSBvZl9nZXRfY3B1X25vZGUoY3B1LCBOVUxMKTsKLQlpZiAobnAgIT0gTlVMTCkgewotCQlwZXJfY3B1KGNhY2hlX2Rlc2MsIGNwdSkgPQotCQkJY3JlYXRlX2NhY2hlX2luZGV4X2luZm8obnAsIGNhY2hlX3RvcGxldmVsLCAwLCAxKTsKLQkJb2Zfbm9kZV9wdXQobnApOwotCX0KLQlyZXR1cm47Ci19Ci0KIHN0YXRpYyB2b2lkIF9fY3B1aW5pdCByZWdpc3Rlcl9jcHVfb25saW5lKHVuc2lnbmVkIGludCBjcHUpCiB7CiAJc3RydWN0IGNwdSAqYyA9ICZwZXJfY3B1KGNwdV9kZXZpY2VzLCBjcHUpOwpAQCAtNjg0LDI1ICs0MDcsMTAgQEAKIAkJc3lzZGV2X2NyZWF0ZV9maWxlKHMsICZhdHRyX2RzY3IpOwogI2VuZGlmIC8qIENPTkZJR19QUEM2NCAqLwogCi0JY3JlYXRlX2NhY2hlX2luZm8ocyk7CisJY2FjaGVpbmZvX2NwdV9vbmxpbmUoY3B1KTsKIH0KIAogI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQotc3RhdGljIHZvaWQgcmVtb3ZlX2NhY2hlX2luZm8oc3RydWN0IHN5c19kZXZpY2UgKnN5c2RldikKLXsKLQlzdHJ1Y3Qga29iamVjdCAqY2FjaGVfdG9wbGV2ZWw7Ci0Jc3RydWN0IGNhY2hlX2Rlc2MgKmNhY2hlX2Rlc2M7Ci0JaW50IGNwdSA9IHN5c2Rldi0+aWQ7Ci0KLQljYWNoZV9kZXNjID0gcGVyX2NwdShjYWNoZV9kZXNjLCBjcHUpOwotCWlmIChjYWNoZV9kZXNjICE9IE5VTEwpCi0JCWtvYmplY3RfcHV0KCZjYWNoZV9kZXNjLT5rb2JqKTsKLQotCWNhY2hlX3RvcGxldmVsID0gcGVyX2NwdShjYWNoZV90b3BsZXZlbCwgY3B1KTsKLQlpZiAoY2FjaGVfdG9wbGV2ZWwgIT0gTlVMTCkKLQkJa29iamVjdF9wdXQoY2FjaGVfdG9wbGV2ZWwpOwotfQotCiBzdGF0aWMgdm9pZCB1bnJlZ2lzdGVyX2NwdV9vbmxpbmUodW5zaWduZWQgaW50IGNwdSkKIHsKIAlzdHJ1Y3QgY3B1ICpjID0gJnBlcl9jcHUoY3B1X2RldmljZXMsIGNwdSk7CkBAIC03NjksNyArNDc3LDcgQEAKIAkJc3lzZGV2X3JlbW92ZV9maWxlKHMsICZhdHRyX2RzY3IpOwogI2VuZGlmIC8qIENPTkZJR19QUEM2NCAqLwogCi0JcmVtb3ZlX2NhY2hlX2luZm8ocyk7CisJY2FjaGVpbmZvX2NwdV9vZmZsaW5lKGNwdSk7CiB9CiAjZW5kaWYgLyogQ09ORklHX0hPVFBMVUdfQ1BVICovCiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvdm1saW51eC5sZHMuUyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvdm1saW51eC5sZHMuUwppbmRleCA0N2JmMTVjLi4xNjFiOWI5IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3ZtbGludXgubGRzLlMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC92bWxpbnV4Lmxkcy5TCkBAIC04Nyw3ICs4Nyw5IEBACiAJLyogVGhlIGR1bW15IHNlZ21lbnQgY29udGVudHMgZm9yIHRoZSBidWcgd29ya2Fyb3VuZCBtZW50aW9uZWQgYWJvdmUKIAkgICBuZWFyIFBIRFJTLiAgKi8KIAkuZHVtbXkgOiBBVChBRERSKC5kdW1teSkgLSBMT0FEX09GRlNFVCkgewotCQlMT05HKDB4ZjE3NykKKwkJTE9ORygwKQorCQlMT05HKDApCisJCUxPTkcoMCkKIAl9IDprZXJuZWwgOmR1bW15CiAKIC8qCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbW0vZnNsX2Jvb2tlX21tdS5jIGIvYXJjaC9wb3dlcnBjL21tL2ZzbF9ib29rZV9tbXUuYwppbmRleCAyM2NlZTM5Li4xOTcxZTRlZTMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9tbS9mc2xfYm9va2VfbW11LmMKKysrIGIvYXJjaC9wb3dlcnBjL21tL2ZzbF9ib29rZV9tbXUuYwpAQCAtNTYsMTggKzU2LDExIEBACiAKIGV4dGVybiB2b2lkIGxvYWRjYW1fZW50cnkodW5zaWduZWQgaW50IGluZGV4KTsKIHVuc2lnbmVkIGludCB0bGJjYW1faW5kZXg7Ci11bnNpZ25lZCBpbnQgbnVtX3RsYmNhbV9lbnRyaWVzOwogc3RhdGljIHVuc2lnbmVkIGxvbmcgX19jYW0wLCBfX2NhbTEsIF9fY2FtMjsKIAogI2RlZmluZSBOVU1fVExCQ0FNUwkoMTYpCiAKLXN0cnVjdCB0bGJjYW0gewotICAgCXUzMglNQVMwOwotCXUzMglNQVMxOwotCXUzMglNQVMyOwotCXUzMglNQVMzOwotCXUzMglNQVM3OwotfSBUTEJDQU1bTlVNX1RMQkNBTVNdOworc3RydWN0IHRsYmNhbSBUTEJDQU1bTlVNX1RMQkNBTVNdOwogCiBzdHJ1Y3QgdGxiY2FtcmFuZ2UgewogICAgCXVuc2lnbmVkIGxvbmcgc3RhcnQ7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbW0vbW11X2RlY2wuaCBiL2FyY2gvcG93ZXJwYy9tbS9tbXVfZGVjbC5oCmluZGV4IDQzMTRiMzkuLmQxZjljNjIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9tbS9tbXVfZGVjbC5oCisrKyBiL2FyY2gvcG93ZXJwYy9tbS9tbXVfZGVjbC5oCkBAIC0zMCwxMSArMzAsMTEgQEAKICNpZiBkZWZpbmVkKENPTkZJR180MHgpIHx8IGRlZmluZWQoQ09ORklHXzh4eCkKIHN0YXRpYyBpbmxpbmUgdm9pZCBfdGxiaWxfYWxsKHZvaWQpCiB7Ci0JYXNtIHZvbGF0aWxlICgic3luYzsgdGxiaWE7IGlzeW5jIiA6IDogOiAibWVtb3J5IikKKwlhc20gdm9sYXRpbGUgKCJzeW5jOyB0bGJpYTsgaXN5bmMiIDogOiA6ICJtZW1vcnkiKTsKIH0KIHN0YXRpYyBpbmxpbmUgdm9pZCBfdGxiaWxfcGlkKHVuc2lnbmVkIGludCBwaWQpCiB7Ci0JYXNtIHZvbGF0aWxlICgic3luYzsgdGxiaWE7IGlzeW5jIiA6IDogOiAibWVtb3J5IikKKwlhc20gdm9sYXRpbGUgKCJzeW5jOyB0bGJpYTsgaXN5bmMiIDogOiA6ICJtZW1vcnkiKTsKIH0KICNlbHNlIC8qIENPTkZJR180MHggfHwgQ09ORklHXzh4eCAqLwogZXh0ZXJuIHZvaWQgX3RsYmlsX2FsbCh2b2lkKTsKQEAgLTQ3LDcgKzQ3LDcgQEAKICNpZmRlZiBDT05GSUdfOHh4CiBzdGF0aWMgaW5saW5lIHZvaWQgX3RsYmlsX3ZhKHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgdW5zaWduZWQgaW50IHBpZCkKIHsKLQlhc20gdm9sYXRpbGUgKCJ0bGJpZSAlMDsgc3luYyIgOiA6ICJyIiAoYWRkcmVzcykgOiAibWVtb3J5IikKKwlhc20gdm9sYXRpbGUgKCJ0bGJpZSAlMDsgc3luYyIgOiA6ICJyIiAoYWRkcmVzcykgOiAibWVtb3J5Iik7CiB9CiAjZWxzZSAvKiBDT05GSUdfOHh4ICovCiBleHRlcm4gdm9pZCBfdGxiaWxfdmEodW5zaWduZWQgbG9uZyBhZGRyZXNzLCB1bnNpZ25lZCBpbnQgcGlkKTsKQEAgLTc1LDYgKzc1LDE1IEBACiAjZW5kaWYgLyogQ09ORklHX1BQQ19NTVVfTk9IQVNIICovCiAKICNpZmRlZiBDT05GSUdfUFBDMzIKKworc3RydWN0IHRsYmNhbSB7CisJdTMyCU1BUzA7CisJdTMyCU1BUzE7CisJdTMyCU1BUzI7CisJdTMyCU1BUzM7CisJdTMyCU1BUzc7Cit9OworCiBleHRlcm4gdm9pZCBtYXBpbl9yYW0odm9pZCk7CiBleHRlcm4gaW50IG1hcF9wYWdlKHVuc2lnbmVkIGxvbmcgdmEsIHBoeXNfYWRkcl90IHBhLCBpbnQgZmxhZ3MpOwogZXh0ZXJuIHZvaWQgc2V0YmF0KGludCBpbmRleCwgdW5zaWduZWQgbG9uZyB2aXJ0LCBwaHlzX2FkZHJfdCBwaHlzLApAQCAtOTAsOCArOTksNiBAQAogc3RydWN0IGhhc2hfcHRlOwogZXh0ZXJuIHN0cnVjdCBoYXNoX3B0ZSAqSGFzaCwgKkhhc2hfZW5kOwogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgSGFzaF9zaXplLCBIYXNoX21hc2s7Ci0KLWV4dGVybiB1bnNpZ25lZCBpbnQgbnVtX3RsYmNhbV9lbnRyaWVzOwogI2VuZGlmCiAKIGV4dGVybiB1bnNpZ25lZCBsb25nIGlvcmVtYXBfYm90OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL21tL251bWEuYyBiL2FyY2gvcG93ZXJwYy9tbS9udW1hLmMKaW5kZXggY2Y4MTA0OS4uNzM5M2JkNyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL21tL251bWEuYworKysgYi9hcmNoL3Bvd2VycGMvbW0vbnVtYS5jCkBAIC04MjIsNDIgKzgyMiw1MCBAQAogICogcmVxdWlyZWQuIG5pZCBpcyB0aGUgcHJlZmVycmVkIG5vZGUgYW5kIGVuZCBpcyB0aGUgcGh5c2ljYWwgYWRkcmVzcyBvZgogICogdGhlIGhpZ2hlc3QgYWRkcmVzcyBpbiB0aGUgbm9kZS4KICAqCi0gKiBSZXR1cm5zIHRoZSBwaHlzaWNhbCBhZGRyZXNzIG9mIHRoZSBtZW1vcnkuCisgKiBSZXR1cm5zIHRoZSB2aXJ0dWFsIGFkZHJlc3Mgb2YgdGhlIG1lbW9yeS4KICAqLwotc3RhdGljIHZvaWQgX19pbml0ICpjYXJlZnVsX2FsbG9jYXRpb24oaW50IG5pZCwgdW5zaWduZWQgbG9uZyBzaXplLAorc3RhdGljIHZvaWQgX19pbml0ICpjYXJlZnVsX3phbGxvY2F0aW9uKGludCBuaWQsIHVuc2lnbmVkIGxvbmcgc2l6ZSwKIAkJCQkgICAgICAgdW5zaWduZWQgbG9uZyBhbGlnbiwKIAkJCQkgICAgICAgdW5zaWduZWQgbG9uZyBlbmRfcGZuKQogeworCXZvaWQgKnJldDsKIAlpbnQgbmV3X25pZDsKLQl1bnNpZ25lZCBsb25nIHJldCA9IF9fbG1iX2FsbG9jX2Jhc2Uoc2l6ZSwgYWxpZ24sIGVuZF9wZm4gPDwgUEFHRV9TSElGVCk7CisJdW5zaWduZWQgbG9uZyByZXRfcGFkZHI7CisKKwlyZXRfcGFkZHIgPSBfX2xtYl9hbGxvY19iYXNlKHNpemUsIGFsaWduLCBlbmRfcGZuIDw8IFBBR0VfU0hJRlQpOwogCiAJLyogcmV0cnkgb3ZlciBhbGwgbWVtb3J5ICovCi0JaWYgKCFyZXQpCi0JCXJldCA9IF9fbG1iX2FsbG9jX2Jhc2Uoc2l6ZSwgYWxpZ24sIGxtYl9lbmRfb2ZfRFJBTSgpKTsKKwlpZiAoIXJldF9wYWRkcikKKwkJcmV0X3BhZGRyID0gX19sbWJfYWxsb2NfYmFzZShzaXplLCBhbGlnbiwgbG1iX2VuZF9vZl9EUkFNKCkpOwogCi0JaWYgKCFyZXQpCi0JCXBhbmljKCJudW1hLmM6IGNhbm5vdCBhbGxvY2F0ZSAlbHUgYnl0ZXMgb24gbm9kZSAlZCIsCisJaWYgKCFyZXRfcGFkZHIpCisJCXBhbmljKCJudW1hLmM6IGNhbm5vdCBhbGxvY2F0ZSAlbHUgYnl0ZXMgZm9yIG5vZGUgJWQiLAogCQkgICAgICBzaXplLCBuaWQpOwogCisJcmV0ID0gX192YShyZXRfcGFkZHIpOworCiAJLyoKLQkgKiBJZiB0aGUgbWVtb3J5IGNhbWUgZnJvbSBhIHByZXZpb3VzbHkgYWxsb2NhdGVkIG5vZGUsIHdlIG11c3QKLQkgKiByZXRyeSB3aXRoIHRoZSBib290bWVtIGFsbG9jYXRvci4KKwkgKiBXZSBpbml0aWFsaXplIHRoZSBub2RlcyBpbiBudW1lcmljIG9yZGVyOiAwLCAxLCAyLi4uCisJICogYW5kIGhhbmQgb3ZlciBjb250cm9sIGZyb20gdGhlIExNQiBhbGxvY2F0b3IgdG8gdGhlCisJICogYm9vdG1lbSBhbGxvY2F0b3IuICBJZiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmb3IKKwkgKiBub2RlIDUsIHRoZW4gd2Uga25vdyB0aGF0IGFsbCBub2RlcyA8NSBhcmUgdXNpbmcgdGhlCisJICogYm9vdG1lbSBhbGxvY2F0b3IgaW5zdGVhZCBvZiB0aGUgTE1CIGFsbG9jYXRvci4KKwkgKgorCSAqIFNvLCBjaGVjayB0aGUgbmlkIGZyb20gd2hpY2ggdGhpcyBhbGxvY2F0aW9uIGNhbWUKKwkgKiBhbmQgZG91YmxlIGNoZWNrIHRvIHNlZSBpZiB3ZSBuZWVkIHRvIHVzZSBib290bWVtCisJICogaW5zdGVhZCBvZiB0aGUgTE1CLiAgV2UgZG9uJ3QgZnJlZSB0aGUgTE1CIG1lbW9yeQorCSAqIHNpbmNlIGl0IHdvdWxkIGJlIHVzZWxlc3MuCiAJICovCi0JbmV3X25pZCA9IGVhcmx5X3Bmbl90b19uaWQocmV0ID4+IFBBR0VfU0hJRlQpOworCW5ld19uaWQgPSBlYXJseV9wZm5fdG9fbmlkKHJldF9wYWRkciA+PiBQQUdFX1NISUZUKTsKIAlpZiAobmV3X25pZCA8IG5pZCkgewotCQlyZXQgPSAodW5zaWduZWQgbG9uZylfX2FsbG9jX2Jvb3RtZW1fbm9kZShOT0RFX0RBVEEobmV3X25pZCksCisJCXJldCA9IF9fYWxsb2NfYm9vdG1lbV9ub2RlKE5PREVfREFUQShuZXdfbmlkKSwKIAkJCQlzaXplLCBhbGlnbiwgMCk7CiAKLQkJaWYgKCFyZXQpCi0JCQlwYW5pYygibnVtYS5jOiBjYW5ub3QgYWxsb2NhdGUgJWx1IGJ5dGVzIG9uIG5vZGUgJWQiLAotCQkJICAgICAgc2l6ZSwgbmV3X25pZCk7Ci0KLQkJcmV0ID0gX19wYShyZXQpOwotCi0JCWRiZygiYWxsb2NfYm9vdG1lbSAlbHggJWx4XG4iLCByZXQsIHNpemUpOworCQlkYmcoImFsbG9jX2Jvb3RtZW0gJXAgJWx4XG4iLCByZXQsIHNpemUpOwogCX0KIAotCXJldHVybiAodm9pZCAqKXJldDsKKwltZW1zZXQocmV0LCAwLCBzaXplKTsKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIF9fY3B1aW5pdGRhdGEgcHBjNjRfbnVtYV9uYiA9IHsKQEAgLTk1Miw3ICs5NjAsNyBAQAogCiAJZm9yX2VhY2hfb25saW5lX25vZGUobmlkKSB7CiAJCXVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLCBlbmRfcGZuOwotCQl1bnNpZ25lZCBsb25nIGJvb3RtZW1fcGFkZHI7CisJCXZvaWQgKmJvb3RtZW1fdmFkZHI7CiAJCXVuc2lnbmVkIGxvbmcgYm9vdG1hcF9wYWdlczsKIAogCQlnZXRfcGZuX3JhbmdlX2Zvcl9uaWQobmlkLCAmc3RhcnRfcGZuLCAmZW5kX3Bmbik7CkBAIC05NjQsMTEgKzk3Miw5IEBACiAJCSAqIHByZXZpb3VzIG5vZGVzJyBib290bWVtIHRvIGJlIGluaXRpYWxpemVkIGFuZCBoYXZlCiAJCSAqIGFsbCByZXNlcnZlZCBhcmVhcyBtYXJrZWQuCiAJCSAqLwotCQlOT0RFX0RBVEEobmlkKSA9IGNhcmVmdWxfYWxsb2NhdGlvbihuaWQsCisJCU5PREVfREFUQShuaWQpID0gY2FyZWZ1bF96YWxsb2NhdGlvbihuaWQsCiAJCQkJCXNpemVvZihzdHJ1Y3QgcGdsaXN0X2RhdGEpLAogCQkJCQlTTVBfQ0FDSEVfQllURVMsIGVuZF9wZm4pOwotCQlOT0RFX0RBVEEobmlkKSA9IF9fdmEoTk9ERV9EQVRBKG5pZCkpOwotCQltZW1zZXQoTk9ERV9EQVRBKG5pZCksIDAsIHNpemVvZihzdHJ1Y3QgcGdsaXN0X2RhdGEpKTsKIAogICAJCWRiZygibm9kZSAlZFxuIiwgbmlkKTsKIAkJZGJnKCJOT0RFX0RBVEEoKSA9ICVwXG4iLCBOT0RFX0RBVEEobmlkKSk7CkBAIC05ODQsMjAgKzk5MCwyMCBAQAogICAJCWRiZygiZW5kX3BhZGRyID0gJWx4XG4iLCBlbmRfcGZuIDw8IFBBR0VfU0hJRlQpOwogCiAJCWJvb3RtYXBfcGFnZXMgPSBib290bWVtX2Jvb3RtYXBfcGFnZXMoZW5kX3BmbiAtIHN0YXJ0X3Bmbik7Ci0JCWJvb3RtZW1fcGFkZHIgPSAodW5zaWduZWQgbG9uZyljYXJlZnVsX2FsbG9jYXRpb24obmlkLAorCQlib290bWVtX3ZhZGRyID0gY2FyZWZ1bF96YWxsb2NhdGlvbihuaWQsCiAJCQkJCWJvb3RtYXBfcGFnZXMgPDwgUEFHRV9TSElGVCwKIAkJCQkJUEFHRV9TSVpFLCBlbmRfcGZuKTsKLQkJbWVtc2V0KF9fdmEoYm9vdG1lbV9wYWRkciksIDAsIGJvb3RtYXBfcGFnZXMgPDwgUEFHRV9TSElGVCk7CiAKLQkJZGJnKCJib290bWFwX3BhZGRyID0gJWx4XG4iLCBib290bWVtX3BhZGRyKTsKKwkJZGJnKCJib290bWFwX3ZhZGRyID0gJXBcbiIsIGJvb3RtZW1fdmFkZHIpOwogCi0JCWluaXRfYm9vdG1lbV9ub2RlKE5PREVfREFUQShuaWQpLCBib290bWVtX3BhZGRyID4+IFBBR0VfU0hJRlQsCisJCWluaXRfYm9vdG1lbV9ub2RlKE5PREVfREFUQShuaWQpLAorCQkJCSAgX19wYShib290bWVtX3ZhZGRyKSA+PiBQQUdFX1NISUZULAogCQkJCSAgc3RhcnRfcGZuLCBlbmRfcGZuKTsKIAogCQlmcmVlX2Jvb3RtZW1fd2l0aF9hY3RpdmVfcmVnaW9ucyhuaWQsIGVuZF9wZm4pOwogCQkvKgogCQkgKiBCZSB2ZXJ5IGNhcmVmdWwgYWJvdXQgbW92aW5nIHRoaXMgYXJvdW5kLiAgRnV0dXJlCi0JCSAqIGNhbGxzIHRvIGNhcmVmdWxfYWxsb2NhdGlvbigpIGRlcGVuZCBvbiB0aGlzIGdldHRpbmcKKwkJICogY2FsbHMgdG8gY2FyZWZ1bF96YWxsb2NhdGlvbigpIGRlcGVuZCBvbiB0aGlzIGdldHRpbmcKIAkJICogZG9uZSBjb3JyZWN0bHkuCiAJCSAqLwogCQltYXJrX3Jlc2VydmVkX3JlZ2lvbnNfZm9yX25pZChuaWQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL21tL3BndGFibGVfMzIuYyBiL2FyY2gvcG93ZXJwYy9tbS9wZ3RhYmxlXzMyLmMKaW5kZXggMzhmZjM1Zi4uMjI5NzJjZCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL21tL3BndGFibGVfMzIuYworKysgYi9hcmNoL3Bvd2VycGMvbW0vcGd0YWJsZV8zMi5jCkBAIC0yNjYsNyArMjY2LDggQEAKIAkJLyogVGhlIFBURSBzaG91bGQgbmV2ZXIgYmUgYWxyZWFkeSBzZXQgbm9yIHByZXNlbnQgaW4gdGhlCiAJCSAqIGhhc2ggdGFibGUKIAkJICovCi0JCUJVR19PTihwdGVfdmFsKCpwZykgJiAoX1BBR0VfUFJFU0VOVCB8IF9QQUdFX0hBU0hQVEUpKTsKKwkJQlVHX09OKChwdGVfdmFsKCpwZykgJiAoX1BBR0VfUFJFU0VOVCB8IF9QQUdFX0hBU0hQVEUpKSAmJgorCQkgICAgICAgZmxhZ3MpOwogCQlzZXRfcHRlX2F0KCZpbml0X21tLCB2YSwgcGcsIHBmbl9wdGUocGEgPj4gUEFHRV9TSElGVCwKIAkJCQkJCSAgICAgX19wZ3Byb3QoZmxhZ3MpKSk7CiAJfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL21tL3NsaWNlLmMgYi9hcmNoL3Bvd2VycGMvbW0vc2xpY2UuYwppbmRleCBkYjQ0ZTAyLi5iYTUxOTQ4IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvbW0vc2xpY2UuYworKysgYi9hcmNoL3Bvd2VycGMvbW0vc2xpY2UuYwpAQCAtNzEwLDkgKzcxMCwxOCBAQAogCQkJICAgdW5zaWduZWQgbG9uZyBsZW4pCiB7CiAJc3RydWN0IHNsaWNlX21hc2sgbWFzaywgYXZhaWxhYmxlOworCXVuc2lnbmVkIGludCBwc2l6ZSA9IG1tLT5jb250ZXh0LnVzZXJfcHNpemU7CiAKIAltYXNrID0gc2xpY2VfcmFuZ2VfdG9fbWFzayhhZGRyLCBsZW4pOwotCWF2YWlsYWJsZSA9IHNsaWNlX21hc2tfZm9yX3NpemUobW0sIG1tLT5jb250ZXh0LnVzZXJfcHNpemUpOworCWF2YWlsYWJsZSA9IHNsaWNlX21hc2tfZm9yX3NpemUobW0sIHBzaXplKTsKKyNpZmRlZiBDT05GSUdfUFBDXzY0S19QQUdFUworCS8qIFdlIG5lZWQgdG8gYWNjb3VudCBmb3IgNGsgc2xpY2VzIHRvbyAqLworCWlmIChwc2l6ZSA9PSBNTVVfUEFHRV82NEspIHsKKwkJc3RydWN0IHNsaWNlX21hc2sgY29tcGF0X21hc2s7CisJCWNvbXBhdF9tYXNrID0gc2xpY2VfbWFza19mb3Jfc2l6ZShtbSwgTU1VX1BBR0VfNEspOworCQlvcl9tYXNrKGF2YWlsYWJsZSwgY29tcGF0X21hc2spOworCX0KKyNlbmRpZgogCiAjaWYgMCAvKiB0b28gdmVyYm9zZSAqLwogCXNsaWNlX2RiZygiaXNfaHVnZXBhZ2Vfb25seV9yYW5nZShtbT0lcCwgYWRkcj0lbHgsIGxlbj0lbHgpXG4iLApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL21tL3N0YWIuYyBiL2FyY2gvcG93ZXJwYy9tbS9zdGFiLmMKaW5kZXggNjBlNjAzMi4uOThjZDFkYyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL21tL3N0YWIuYworKysgYi9hcmNoL3Bvd2VycGMvbW0vc3RhYi5jCkBAIC0yNTEsOCArMjUxLDggQEAKIAogCQlwYWNhW2NwdV0uc3RhYl9hZGRyID0gbmV3c3RhYjsKIAkJcGFjYVtjcHVdLnN0YWJfcmVhbCA9IHZpcnRfdG9fYWJzKG5ld3N0YWIpOwotCQlwcmludGsoS0VSTl9JTkZPICJTZWdtZW50IHRhYmxlIGZvciBDUFUgJWQgYXQgMHglbHggIgotCQkgICAgICAgInZpcnR1YWwsIDB4JWx4IGFic29sdXRlXG4iLAorCQlwcmludGsoS0VSTl9JTkZPICJTZWdtZW50IHRhYmxlIGZvciBDUFUgJWQgYXQgMHglbGx4ICIKKwkJICAgICAgICJ2aXJ0dWFsLCAweCVsbHggYWJzb2x1dGVcbiIsCiAJCSAgICAgICBjcHUsIHBhY2FbY3B1XS5zdGFiX2FkZHIsIHBhY2FbY3B1XS5zdGFiX3JlYWwpOwogCX0KIH0KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9tbS90bGJfbm9oYXNoLmMgYi9hcmNoL3Bvd2VycGMvbW0vdGxiX25vaGFzaC5jCmluZGV4IDgwM2E2NGMuLjM5YWMyMmIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9tbS90bGJfbm9oYXNoLmMKKysrIGIvYXJjaC9wb3dlcnBjL21tL3RsYl9ub2hhc2guYwpAQCAtMTg5LDggKzE4OSw5IEBACiAJc21wX2NhbGxfZnVuY3Rpb24oZG9fZmx1c2hfdGxiX21tX2lwaSwgTlVMTCwgMSk7CiAJX3RsYmlsX3BpZCgwKTsKIAlwcmVlbXB0X2VuYWJsZSgpOwotI2VuZGlmCisjZWxzZQogCV90bGJpbF9waWQoMCk7CisjZW5kaWYKIH0KIEVYUE9SVF9TWU1CT0woZmx1c2hfdGxiX2tlcm5lbF9yYW5nZSk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9vcHJvZmlsZS9jZWxsL3ByX3V0aWwuaCBiL2FyY2gvcG93ZXJwYy9vcHJvZmlsZS9jZWxsL3ByX3V0aWwuaAppbmRleCA2MjgwMDljLi45NjRiOTM5IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvb3Byb2ZpbGUvY2VsbC9wcl91dGlsLmgKKysrIGIvYXJjaC9wb3dlcnBjL29wcm9maWxlL2NlbGwvcHJfdXRpbC5oCkBAIC0zMCw2ICszMCwxMCBAQAogZXh0ZXJuIHN0cnVjdCBkZWxheWVkX3dvcmsgc3B1X3dvcms7CiBleHRlcm4gaW50IHNwdV9wcm9mX3J1bm5pbmc7CiAKKyNkZWZpbmUgVFJBQ0VfQVJSQVlfU0laRSAxMDI0CisKK2V4dGVybiBzcGlubG9ja190IG9wcm9mX3NwdV9zbXBsX2FycnlfbGNrOworCiBzdHJ1Y3Qgc3B1X292ZXJsYXlfaW5mbyB7CS8qIG1hcCBvZiBzZWN0aW9ucyB3aXRoaW4gYW4gU1BVIG92ZXJsYXkgKi8KIAl1bnNpZ25lZCBpbnQgdm1hOwkvKiBTUFUgdmlydHVhbCBtZW1vcnkgYWRkcmVzcyBmcm9tIGVsZiAqLwogCXVuc2lnbmVkIGludCBzaXplOwkvKiBzaXplIG9mIHNlY3Rpb24gZnJvbSBlbGYgKi8KQEAgLTc5LDcgKzgzLDcgQEAKICAqIHRoZSB2bWEtdG8tZmlsZW9mZnNldCBtYXAuCiAgKi8KIHN0cnVjdCB2bWFfdG9fZmlsZW9mZnNldF9tYXAgKmNyZWF0ZV92bWFfbWFwKGNvbnN0IHN0cnVjdCBzcHUgKnNwdSwKLQkJCQkJICAgICB1NjQgb2JqZWN0aWQpOworCQkJCQkgICAgIHVuc2lnbmVkIGxvbmcgb2JqZWN0aWQpOwogdW5zaWduZWQgaW50IHZtYV9tYXBfbG9va3VwKHN0cnVjdCB2bWFfdG9fZmlsZW9mZnNldF9tYXAgKm1hcCwKIAkJCSAgICB1bnNpZ25lZCBpbnQgdm1hLCBjb25zdCBzdHJ1Y3Qgc3B1ICphU3B1LAogCQkJICAgIGludCAqZ3JkX3ZhbCk7CkBAIC04OSwxMCArOTMsMTEgQEAKICAqIEVudHJ5IHBvaW50IGZvciBTUFUgcHJvZmlsaW5nLgogICogY3ljbGVzX3Jlc2V0IGlzIHRoZSBTUFVfQ1lDTEVTIGNvdW50IHZhbHVlIHNwZWNpZmllZCBieSB0aGUgdXNlci4KICAqLwotaW50IHN0YXJ0X3NwdV9wcm9maWxpbmcodW5zaWduZWQgaW50IGN5Y2xlc19yZXNldCk7CitpbnQgc3RhcnRfc3B1X3Byb2ZpbGluZ19jeWNsZXModW5zaWduZWQgaW50IGN5Y2xlc19yZXNldCk7Cit2b2lkIHN0YXJ0X3NwdV9wcm9maWxpbmdfZXZlbnRzKHZvaWQpOwogCi12b2lkIHN0b3Bfc3B1X3Byb2ZpbGluZyh2b2lkKTsKLQordm9pZCBzdG9wX3NwdV9wcm9maWxpbmdfY3ljbGVzKHZvaWQpOwordm9pZCBzdG9wX3NwdV9wcm9maWxpbmdfZXZlbnRzKHZvaWQpOwogCiAvKiBhZGQgdGhlIG5lY2Vzc2FyeSBwcm9maWxpbmcgaG9va3MgKi8KIGludCBzcHVfc3luY19zdGFydCh2b2lkKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9vcHJvZmlsZS9jZWxsL3NwdV9wcm9maWxlci5jIGIvYXJjaC9wb3dlcnBjL29wcm9maWxlL2NlbGwvc3B1X3Byb2ZpbGVyLmMKaW5kZXggZGQ0OTljMy4uOTMwNWRkYSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL29wcm9maWxlL2NlbGwvc3B1X3Byb2ZpbGVyLmMKKysrIGIvYXJjaC9wb3dlcnBjL29wcm9maWxlL2NlbGwvc3B1X3Byb2ZpbGVyLmMKQEAgLTE4LDExICsxOCwyMSBAQAogI2luY2x1ZGUgPGFzbS9jZWxsLXBtdS5oPgogI2luY2x1ZGUgInByX3V0aWwuaCIKIAotI2RlZmluZSBUUkFDRV9BUlJBWV9TSVpFIDEwMjQKICNkZWZpbmUgU0NBTEVfU0hJRlQgMTQKIAogc3RhdGljIHUzMiAqc2FtcGxlczsKIAorLyogc3B1X3Byb2ZfcnVubmluZyBpcyBhIGZsYWcgdXNlZCB0byBpbmRpY2F0ZSBpZiBzcHUgcHJvZmlsaW5nIGlzIGVuYWJsZWQKKyAqIG9yIG5vdC4gIEl0IGlzIHNldCBieSB0aGUgcm91dGluZXMgc3RhcnRfc3B1X3Byb2ZpbGluZ19jeWNsZXMoKSBhbmQKKyAqIHN0YXJ0X3NwdV9wcm9maWxpbmdfZXZlbnRzKCkuICBUaGUgZmxhZyBpcyBjbGVhcmVkIGJ5IHRoZSByb3V0aW5lcworICogc3RvcF9zcHVfcHJvZmlsaW5nX2N5Y2xlcygpIGFuZCBzdG9wX3NwdV9wcm9maWxpbmdfZXZlbnRzKCkuICBUaGVzZQorICogcm91dGluZXMgYXJlIGNhbGxlZCB2aWEgZ2xvYmFsX3N0YXJ0KCkgYW5kIGdsb2JhbF9zdG9wKCkgd2hpY2ggYXJlIGNhbGxlZCBpbgorICogb3BfcG93ZXJwY19zdGFydCgpIGFuZCBvcF9wb3dlcnBjX3N0b3AoKS4gIFRoZXNlIHJvdXRpbmVzIGFyZSBjYWxsZWQgb25jZQorICogcGVyIHN5c3RlbSBhcyBhIHJlc3VsdCBvZiB0aGUgdXNlciBzdGFydGluZy9zdG9wcGluZyBvcHJvZmlsZS4gIEhlbmNlLCBvbmx5CisgKiBvbmUgQ1BVIHBlciB1c2VyIGF0IGEgdGltZSB3aWxsIGJlIGNoYW5naW5nICB0aGUgdmFsdWUgb2Ygc3B1X3Byb2ZfcnVubmluZy4KKyAqIEluIGdlbmVyYWwsIE9Qcm9maWxlIGRvZXMgbm90IHByb3RlY3QgYWdhaW5zdCBtdWx0aXBsZSB1c2VycyB0cnlpbmcgdG8gcnVuCisgKiBPUHJvZmlsZSBhdCBhIHRpbWUuCisgKi8KIGludCBzcHVfcHJvZl9ydW5uaW5nOwogc3RhdGljIHVuc2lnbmVkIGludCBwcm9maWxpbmdfaW50ZXJ2YWw7CiAKQEAgLTMxLDggKzQxLDggQEAKIAogI2RlZmluZSBTUFVfUENfTUFTSwkgICAgIDB4RkZGRgogCi1zdGF0aWMgREVGSU5FX1NQSU5MT0NLKHNhbXBsZV9hcnJheV9sb2NrKTsKLXVuc2lnbmVkIGxvbmcgc2FtcGxlX2FycmF5X2xvY2tfZmxhZ3M7CitERUZJTkVfU1BJTkxPQ0sob3Byb2Zfc3B1X3NtcGxfYXJyeV9sY2spOwordW5zaWduZWQgbG9uZyBvcHJvZl9zcHVfc21wbF9hcnJ5X2xja19mbGFnczsKIAogdm9pZCBzZXRfc3B1X3Byb2ZpbGluZ19mcmVxdWVuY3kodW5zaWduZWQgaW50IGZyZXFfa2h6LCB1bnNpZ25lZCBpbnQgY3ljbGVzX3Jlc2V0KQogewpAQCAtNDksNyArNTksNyBAQAogCSAqIG9mIHByZWNpc2lvbi4gIFRoaXMgaXMgY2xvc2UgZW5vdWdoIGZvciB0aGUgcHVycG9zZSBhdCBoYW5kLgogCSAqCiAJICogVGhlIHZhbHVlIG9mIHRoZSB0aW1lb3V0IHNob3VsZCBiZSBzbWFsbCBlbm91Z2ggdGhhdCB0aGUgaHcKLQkgKiB0cmFjZSBidWZmZXIgd2lsbCBub3QgZ2V0IG1vcmUgdGhlbiBhYm91dCAxLzMgZnVsbCBmb3IgdGhlCisJICogdHJhY2UgYnVmZmVyIHdpbGwgbm90IGdldCBtb3JlIHRoYW4gYWJvdXQgMS8zIGZ1bGwgZm9yIHRoZQogCSAqIG1heGltdW0gdXNlciBzcGVjaWZpZWQgKHRoZSBMRlNSIHZhbHVlKSBodyBzYW1wbGluZyBmcmVxdWVuY3kuCiAJICogVGhpcyBpcyB0byBlbnN1cmUgdGhlIHRyYWNlIGJ1ZmZlciB3aWxsIG5ldmVyIGZpbGwgZXZlbiBpZiB0aGUKIAkgKiBrZXJuZWwgdGhyZWFkIHNjaGVkdWxpbmcgdmFyaWVzIHVuZGVyIGEgaGVhdnkgc3lzdGVtIGxvYWQuCkBAIC0xNDUsMTMgKzE1NSwxMyBAQAogCQkgKiBzYW1wbGUgYXJyYXkgbXVzdCBiZSBsb2FkZWQgYW5kIHRoZW4gcHJvY2Vzc2VkIGZvciBhIGdpdmVuCiAJCSAqIGNwdS4JIFRoZSBzYW1wbGUgYXJyYXkgaXMgbm90IHBlciBjcHUuCiAJCSAqLwotCQlzcGluX2xvY2tfaXJxc2F2ZSgmc2FtcGxlX2FycmF5X2xvY2ssCi0JCQkJICBzYW1wbGVfYXJyYXlfbG9ja19mbGFncyk7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZvcHJvZl9zcHVfc21wbF9hcnJ5X2xjaywKKwkJCQkgIG9wcm9mX3NwdV9zbXBsX2FycnlfbGNrX2ZsYWdzKTsKIAkJbnVtX3NhbXBsZXMgPSBjZWxsX3NwdV9wY19jb2xsZWN0aW9uKGNwdSk7CiAKIAkJaWYgKG51bV9zYW1wbGVzID09IDApIHsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNhbXBsZV9hcnJheV9sb2NrLAotCQkJCQkgICAgICAgc2FtcGxlX2FycmF5X2xvY2tfZmxhZ3MpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmb3Byb2Zfc3B1X3NtcGxfYXJyeV9sY2ssCisJCQkJCSAgICAgICBvcHJvZl9zcHVfc21wbF9hcnJ5X2xja19mbGFncyk7CiAJCQljb250aW51ZTsKIAkJfQogCkBAIC0xNjIsOCArMTcyLDggQEAKIAkJCQkJbnVtX3NhbXBsZXMpOwogCQl9CiAKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2FtcGxlX2FycmF5X2xvY2ssCi0JCQkJICAgICAgIHNhbXBsZV9hcnJheV9sb2NrX2ZsYWdzKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmb3Byb2Zfc3B1X3NtcGxfYXJyeV9sY2ssCisJCQkJICAgICAgIG9wcm9mX3NwdV9zbXBsX2FycnlfbGNrX2ZsYWdzKTsKIAogCX0KIAlzbXBfd21iKCk7CS8qIGluc3VyZSBzcHUgZXZlbnQgYnVmZmVyIHVwZGF0ZXMgYXJlIHdyaXR0ZW4gKi8KQEAgLTE4MiwxMyArMTkyLDEzIEBACiAKIHN0YXRpYyBzdHJ1Y3QgaHJ0aW1lciB0aW1lcjsKIC8qCi0gKiBFbnRyeSBwb2ludCBmb3IgU1BVIHByb2ZpbGluZy4KKyAqIEVudHJ5IHBvaW50IGZvciBTUFUgY3ljbGUgcHJvZmlsaW5nLgogICogTk9URTogIFNQVSBwcm9maWxpbmcgaXMgZG9uZSBzeXN0ZW0td2lkZSwgbm90IHBlci1DUFUuCiAgKgogICogY3ljbGVzX3Jlc2V0IGlzIHRoZSBjb3VudCB2YWx1ZSBzcGVjaWZpZWQgYnkgdGhlIHVzZXIgd2hlbgogICogc2V0dGluZyB1cCBPUHJvZmlsZSB0byBjb3VudCBTUFVfQ1lDTEVTLgogICovCi1pbnQgc3RhcnRfc3B1X3Byb2ZpbGluZyh1bnNpZ25lZCBpbnQgY3ljbGVzX3Jlc2V0KQoraW50IHN0YXJ0X3NwdV9wcm9maWxpbmdfY3ljbGVzKHVuc2lnbmVkIGludCBjeWNsZXNfcmVzZXQpCiB7CiAJa3RpbWVfdCBrdDsKIApAQCAtMjEyLDEwICsyMjIsMzAgQEAKIAlyZXR1cm4gMDsKIH0KIAotdm9pZCBzdG9wX3NwdV9wcm9maWxpbmcodm9pZCkKKy8qCisgKiBFbnRyeSBwb2ludCBmb3IgU1BVIGV2ZW50IHByb2ZpbGluZy4KKyAqIE5PVEU6ICBTUFUgcHJvZmlsaW5nIGlzIGRvbmUgc3lzdGVtLXdpZGUsIG5vdCBwZXItQ1BVLgorICoKKyAqIGN5Y2xlc19yZXNldCBpcyB0aGUgY291bnQgdmFsdWUgc3BlY2lmaWVkIGJ5IHRoZSB1c2VyIHdoZW4KKyAqIHNldHRpbmcgdXAgT1Byb2ZpbGUgdG8gY291bnQgU1BVX0NZQ0xFUy4KKyAqLwordm9pZCBzdGFydF9zcHVfcHJvZmlsaW5nX2V2ZW50cyh2b2lkKQoreworCXNwdV9wcm9mX3J1bm5pbmcgPSAxOworCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmc3B1X3dvcmssIERFRkFVTFRfVElNRVJfRVhQSVJFKTsKKworCXJldHVybjsKK30KKwordm9pZCBzdG9wX3NwdV9wcm9maWxpbmdfY3ljbGVzKHZvaWQpCiB7CiAJc3B1X3Byb2ZfcnVubmluZyA9IDA7CiAJaHJ0aW1lcl9jYW5jZWwoJnRpbWVyKTsKIAlrZnJlZShzYW1wbGVzKTsKLQlwcl9kZWJ1ZygiU1BVX1BST0Y6IHN0b3Bfc3B1X3Byb2ZpbGluZyBpc3N1ZWRcbiIpOworCXByX2RlYnVnKCJTUFVfUFJPRjogc3RvcF9zcHVfcHJvZmlsaW5nX2N5Y2xlcyBpc3N1ZWRcbiIpOworfQorCit2b2lkIHN0b3Bfc3B1X3Byb2ZpbGluZ19ldmVudHModm9pZCkKK3sKKwlzcHVfcHJvZl9ydW5uaW5nID0gMDsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9vcHJvZmlsZS9jb21tb24uYyBiL2FyY2gvcG93ZXJwYy9vcHJvZmlsZS9jb21tb24uYwppbmRleCAxNzgwN2FjLi4yMWYxNmVkIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvb3Byb2ZpbGUvY29tbW9uLmMKKysrIGIvYXJjaC9wb3dlcnBjL29wcm9maWxlL2NvbW1vbi5jCkBAIC0xMzIsNiArMTMyLDI4IEBACiAJb3Byb2ZpbGVmc19jcmVhdGVfdWxvbmcoc2IsIHJvb3QsICJtbWNyMCIsICZzeXMubW1jcjApOwogCW9wcm9maWxlZnNfY3JlYXRlX3Vsb25nKHNiLCByb290LCAibW1jcjEiLCAmc3lzLm1tY3IxKTsKIAlvcHJvZmlsZWZzX2NyZWF0ZV91bG9uZyhzYiwgcm9vdCwgIm1tY3JhIiwgJnN5cy5tbWNyYSk7CisjaWZkZWYgQ09ORklHX09QUk9GSUxFX0NFTEwKKwkvKiBjcmVhdGUgYSBmaWxlIHRoZSB1c2VyIHRvb2wgY2FuIGNoZWNrIHRvIHNlZSB3aGF0IGxldmVsIG9mIHByb2ZpbGluZworCSAqIHN1cHBvcnQgZXhpdHMgd2l0aCB0aGlzIGtlcm5lbC4gSW5pdGlhbGl6ZSBiaXQgbWFzayB0byBpbmRpY2F0ZQorCSAqIHdoYXQgc3VwcG9ydCB0aGUga2VybmVsIGhhczoKKwkgKiBiaXQgMCAgICAgIC0gIFN1cHBvcnRzIFNQVSBldmVudCBwcm9maWxpbmcgaW4gYWRkaXRpb24gdG8gUFBVCisJICogICAgICAgICAgICAgICBldmVudCBhbmQgY3ljbGVzOyBhbmQgU1BVIGN5Y2xlIHByb2ZpbGluZworCSAqIGJpdHMgMS0zMSAgLSAgQ3VycmVudGx5IHVudXNlZC4KKwkgKgorCSAqIElmIHRoZSBmaWxlIGRvZXMgbm90IGV4aXN0LCB0aGVuIHRoZSBrZXJuZWwgb25seSBzdXBwb3J0cyBTUFUKKwkgKiBjeWNsZSBwcm9maWxpbmcsIFBQVSBldmVudCBhbmQgY3ljbGUgcHJvZmlsaW5nLgorCSAqLworCW9wcm9maWxlZnNfY3JlYXRlX3Vsb25nKHNiLCByb290LCAiY2VsbF9zdXBwb3J0IiwgJnN5cy5jZWxsX3N1cHBvcnQpOworCXN5cy5jZWxsX3N1cHBvcnQgPSAweDE7IC8qIE5vdGUsIHRoZSB1c2VyIE9Qcm9maWxlIHRvb2wgbXVzdCBjaGVjaworCQkJCSAqIHRoYXQgdGhpcyBiaXQgaXMgc2V0IGJlZm9yZSBhdHRlbXB0aW5nIHRvCisJCQkJICogdXNlciBTUFUgZXZlbnQgcHJvZmlsaW5nLiAgT2xkZXIga2VybmVscworCQkJCSAqIHdpbGwgbm90IGhhdmUgdGhpcyBmaWxlLCBoZW5jZSB0aGUgdXNlcgorCQkJCSAqIHRvb2wgaXMgbm90IGFsbG93ZWQgdG8gZG8gU1BVIGV2ZW50CisJCQkJICogcHJvZmlsaW5nIG9uIG9sZGVyIGtlcm5lbHMuICBPbGRlciBrZXJuZWxzCisJCQkJICogd2lsbCBhY2NlcHQgU1BVIGV2ZW50cyBidXQgY29sbGVjdGVkIGRhdGEKKwkJCQkgKiBpcyBnYXJiYWdlLgorCQkJCSAqLworI2VuZGlmCiAjZW5kaWYKIAogCWZvciAoaSA9IDA7IGkgPCBtb2RlbC0+bnVtX2NvdW50ZXJzOyArK2kpIHsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9vcHJvZmlsZS9vcF9tb2RlbF9jZWxsLmMgYi9hcmNoL3Bvd2VycGMvb3Byb2ZpbGUvb3BfbW9kZWxfY2VsbC5jCmluZGV4IDI1YTRlYzIuLmFlMDZjNjIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9vcHJvZmlsZS9vcF9tb2RlbF9jZWxsLmMKKysrIGIvYXJjaC9wb3dlcnBjL29wcm9maWxlL29wX21vZGVsX2NlbGwuYwpAQCAtNDAsMTQgKzQwLDE1IEBACiAjaW5jbHVkZSAiLi4vcGxhdGZvcm1zL2NlbGwvaW50ZXJydXB0LmgiCiAjaW5jbHVkZSAiY2VsbC9wcl91dGlsLmgiCiAKLXN0YXRpYyB2b2lkIGNlbGxfZ2xvYmFsX3N0b3Bfc3B1KHZvaWQpOworI2RlZmluZSBQUFVfUFJPRklMSU5HICAgICAgICAgICAgMAorI2RlZmluZSBTUFVfUFJPRklMSU5HX0NZQ0xFUyAgICAgMQorI2RlZmluZSBTUFVfUFJPRklMSU5HX0VWRU5UUyAgICAgMgogCi0vKgotICogc3B1X2N5Y2xlX3Jlc2V0IGlzIHRoZSBudW1iZXIgb2YgY3ljbGVzIGJldHdlZW4gc2FtcGxlcy4KLSAqIFRoaXMgdmFyaWFibGUgaXMgdXNlZCBmb3IgU1BVIHByb2ZpbGluZyBhbmQgc2hvdWxkIE9OTFkgYmUgc2V0Ci0gKiBhdCB0aGUgYmVnaW5uaW5nIG9mIGNlbGxfcmVnX3NldHVwOyBvdGhlcndpc2UsIGl0J3MgcmVhZC1vbmx5LgotICovCi1zdGF0aWMgdW5zaWduZWQgaW50IHNwdV9jeWNsZV9yZXNldDsKKyNkZWZpbmUgU1BVX0VWRU5UX05VTV9TVEFSVCAgICAgIDQxMDAKKyNkZWZpbmUgU1BVX0VWRU5UX05VTV9TVE9QICAgICAgIDQzOTkKKyNkZWZpbmUgU1BVX1BST0ZJTEVfRVZFTlRfQUREUiAgICAgICAgICA0MzYzICAvKiBzcHUsIGFkZHJlc3MgdHJhY2UsIGRlY2ltYWwgKi8KKyNkZWZpbmUgU1BVX1BST0ZJTEVfRVZFTlRfQUREUl9NQVNLX0EgICAweDE0NiAvKiBzdWIgdW5pdCBzZXQgdG8gemVybyAqLworI2RlZmluZSBTUFVfUFJPRklMRV9FVkVOVF9BRERSX01BU0tfQiAgIDB4MTg2IC8qIHN1YiB1bml0IHNldCB0byB6ZXJvICovCiAKICNkZWZpbmUgTlVNX1NQVVNfUEVSX05PREUgICAgOAogI2RlZmluZSBTUFVfQ1lDTEVTX0VWRU5UX05VTSAyCS8qICBldmVudCBudW1iZXIgZm9yIFNQVV9DWUNMRVMgKi8KQEAgLTY2LDYgKzY3LDIxIEBACiAKICNkZWZpbmUgTUFYX1NQVV9DT1VOVCAweEZGRkZGRgkvKiBtYXhpbXVtIDI0IGJpdCBMRlNSIHZhbHVlICovCiAKKy8qIE1pbnVtdW0gSFcgaW50ZXJ2YWwgdGltZXIgc2V0dGluZyB0byBzZW5kIHZhbHVlIHRvIHRyYWNlIGJ1ZmZlciBpcyAxMCBjeWNsZS4KKyAqIFRvIGNvbmZpZ3VyZSBjb3VudGVyIHRvIHNlbmQgdmFsdWUgZXZlcnkgTiBjeWNsZXMgc2V0IGNvdW50ZXIgdG8KKyAqIDJeMzIgLSAxIC0gTi4KKyAqLworI2RlZmluZSBOVU1fSU5URVJWQUxfQ1lDICAweEZGRkZGRkZGIC0gMTAKKworLyoKKyAqIHNwdV9jeWNsZV9yZXNldCBpcyB0aGUgbnVtYmVyIG9mIGN5Y2xlcyBiZXR3ZWVuIHNhbXBsZXMuCisgKiBUaGlzIHZhcmlhYmxlIGlzIHVzZWQgZm9yIFNQVSBwcm9maWxpbmcgYW5kIHNob3VsZCBPTkxZIGJlIHNldAorICogYXQgdGhlIGJlZ2lubmluZyBvZiBjZWxsX3JlZ19zZXR1cDsgb3RoZXJ3aXNlLCBpdCdzIHJlYWQtb25seS4KKyAqLworc3RhdGljIHVuc2lnbmVkIGludCBzcHVfY3ljbGVfcmVzZXQ7CitzdGF0aWMgdW5zaWduZWQgaW50IHByb2ZpbGluZ19tb2RlOworc3RhdGljIGludCBzcHVfZXZudF9waHlzX3NwdV9pbmR4OworCiBzdHJ1Y3QgcG1jX2NudHJsX2RhdGEgewogCXVuc2lnbmVkIGxvbmcgdmNudHI7CiAJdW5zaWduZWQgbG9uZyBldm50czsKQEAgLTEwNSw2ICsxMjEsOCBAQAogCXUxNiB0cmFjZV9tb2RlOwogCXUxNiBmcmVlemU7CiAJdTE2IGNvdW50X21vZGU7CisJdTE2IHNwdV9hZGRyX3RyYWNlOworCXU4ICB0cmFjZV9idWZfb3ZmbHc7CiB9OwogCiBzdGF0aWMgc3RydWN0IHsKQEAgLTEyMiw3ICsxNDAsNyBAQAogI2RlZmluZSBHRVRfSU5QVVRfQ09OVFJPTCh4KSAoKHggJiAweDAwMDAwMDA0KSA+PiAyKQogCiBzdGF0aWMgREVGSU5FX1BFUl9DUFUodW5zaWduZWQgbG9uZ1tOUl9QSFlTX0NUUlNdLCBwbWNfdmFsdWVzKTsKLQorc3RhdGljIHVuc2lnbmVkIGxvbmcgc3B1X3BtX2NudFtNQVhfTlVNTk9ERVMgKiBOVU1fU1BVU19QRVJfTk9ERV07CiBzdGF0aWMgc3RydWN0IHBtY19jbnRybF9kYXRhIHBtY19jbnRybFtOVU1fVEhSRUFEU11bTlJfUEhZU19DVFJTXTsKIAogLyoKQEAgLTE1Miw2ICsxNzAsNyBAQAogCiBzdGF0aWMgdTMyIHZpcnRfY250cl9pbnRlcl9tYXNrOwogc3RhdGljIHN0cnVjdCB0aW1lcl9saXN0IHRpbWVyX3ZpcnRfY250cjsKK3N0YXRpYyBzdHJ1Y3QgdGltZXJfbGlzdCB0aW1lcl9zcHVfZXZlbnRfc3dhcDsKIAogLyoKICAqIHBtX3NpZ25hbCBuZWVkcyB0byBiZSBnbG9iYWwgc2luY2UgaXQgaXMgaW5pdGlhbGl6ZWQgaW4KQEAgLTE2NSw3ICsxODQsNyBAQAogc3RhdGljIHUzMiByZXNldF92YWx1ZVtOUl9QSFlTX0NUUlNdOwogc3RhdGljIGludCBudW1fY291bnRlcnM7CiBzdGF0aWMgaW50IG9wcm9maWxlX3J1bm5pbmc7Ci1zdGF0aWMgREVGSU5FX1NQSU5MT0NLKHZpcnRfY250cl9sb2NrKTsKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soY250cl9sb2NrKTsKIAogc3RhdGljIHUzMiBjdHJfZW5hYmxlZDsKIApAQCAtMzM2LDEzICszNTUsMTMgQEAKIAlmb3IgKGkgPSAwOyBpIDwgTlVNX0RFQlVHX0JVU19XT1JEUzsgaSsrKSB7CiAJCWlmIChidXNfd29yZCAmICgxIDw8IGkpKSB7CiAJCQlwbV9yZWdzLmRlYnVnX2J1c19jb250cm9sIHw9Ci0JCQkgICAgKGJ1c190eXBlIDw8ICgzMCAtICgyICogaSkpKTsKKwkJCQkoYnVzX3R5cGUgPDwgKDMwIC0gKDIgKiBpKSkpOwogCiAJCQlmb3IgKGogPSAwOyBqIDwgTlVNX0lOUFVUX0JVU19XT1JEUzsgaisrKSB7CiAJCQkJaWYgKGlucHV0X2J1c1tqXSA9PSAweGZmKSB7CiAJCQkJCWlucHV0X2J1c1tqXSA9IGk7CiAJCQkJCXBtX3JlZ3MuZ3JvdXBfY29udHJvbCB8PQotCQkJCQkgICAgKGkgPDwgKDMwIC0gKDIgKiBqKSkpOworCQkJCQkJKGkgPDwgKDMwIC0gKDIgKiBqKSkpOwogCiAJCQkJCWJyZWFrOwogCQkJCX0KQEAgLTM2NywxMiArMzg2LDE2IEBACiAJaWYgKHBtX3JlZ3MucG1fY250cmwuc3RvcF9hdF9tYXggPT0gMSkKIAkJdmFsIHw9IENCRV9QTV9TVE9QX0FUX01BWDsKIAotCWlmIChwbV9yZWdzLnBtX2NudHJsLnRyYWNlX21vZGUgPT0gMSkKKwlpZiAocG1fcmVncy5wbV9jbnRybC50cmFjZV9tb2RlICE9IDApCiAJCXZhbCB8PSBDQkVfUE1fVFJBQ0VfTU9ERV9TRVQocG1fcmVncy5wbV9jbnRybC50cmFjZV9tb2RlKTsKIAorCWlmIChwbV9yZWdzLnBtX2NudHJsLnRyYWNlX2J1Zl9vdmZsdyA9PSAxKQorCQl2YWwgfD0gQ0JFX1BNX1RSQUNFX0JVRl9PVkZMVyhwbV9yZWdzLnBtX2NudHJsLnRyYWNlX2J1Zl9vdmZsdyk7CiAJaWYgKHBtX3JlZ3MucG1fY250cmwuZnJlZXplID09IDEpCiAJCXZhbCB8PSBDQkVfUE1fRlJFRVpFX0FMTF9DVFJTOwogCisJdmFsIHw9IENCRV9QTV9TUFVfQUREUl9UUkFDRV9TRVQocG1fcmVncy5wbV9jbnRybC5zcHVfYWRkcl90cmFjZSk7CisKIAkvKgogCSAqIFJvdXRpbmUgc2V0X2NvdW50X21vZGUgbXVzdCBiZSBjYWxsZWQgcHJldmlvdXNseSB0byBzZXQKIAkgKiB0aGUgY291bnQgbW9kZSBiYXNlZCBvbiB0aGUgdXNlciBzZWxlY3Rpb24gb2YgdXNlciBhbmQga2VybmVsLgpAQCAtNDQxLDcgKzQ2NCw3IEBACiAJICogbm90IGJvdGggcGxheWluZyB3aXRoIHRoZSBjb3VudGVycyBvbiB0aGUgc2FtZSBub2RlLgogCSAqLwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnZpcnRfY250cl9sb2NrLCBmbGFncyk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmNudHJfbG9jaywgZmxhZ3MpOwogCiAJcHJldl9oZHdfdGhyZWFkID0gaGR3X3RocmVhZDsKIApAQCAtNDgwLDcgKzUwMyw3IEBACiAJCWNiZV9kaXNhYmxlX3BtX2ludGVycnVwdHMoY3B1KTsKIAkJZm9yIChpID0gMDsgaSA8IG51bV9jb3VudGVyczsgaSsrKSB7CiAJCQlwZXJfY3B1KHBtY192YWx1ZXMsIGNwdSArIHByZXZfaGR3X3RocmVhZClbaV0KLQkJCSAgICA9IGNiZV9yZWFkX2N0cihjcHUsIGkpOworCQkJCT0gY2JlX3JlYWRfY3RyKGNwdSwgaSk7CiAKIAkJCWlmIChwZXJfY3B1KHBtY192YWx1ZXMsIGNwdSArIG5leHRfaGR3X3RocmVhZClbaV0KIAkJCSAgICA9PSAweEZGRkZGRkZGKQpAQCAtNTI3LDcgKzU1MCw3IEBACiAJCWNiZV9lbmFibGVfcG0oY3B1KTsKIAl9CiAKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2aXJ0X2NudHJfbG9jaywgZmxhZ3MpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNudHJfbG9jaywgZmxhZ3MpOwogCiAJbW9kX3RpbWVyKCZ0aW1lcl92aXJ0X2NudHIsIGppZmZpZXMgKyBIWiAvIDEwKTsKIH0KQEAgLTU0MSwzOCArNTY0LDE0NiBAQAogCWFkZF90aW1lcigmdGltZXJfdmlydF9jbnRyKTsKIH0KIAotLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgb25jZSBmb3IgYWxsIGNwdXMgY29tYmluZWQgKi8KLXN0YXRpYyBpbnQgY2VsbF9yZWdfc2V0dXAoc3RydWN0IG9wX2NvdW50ZXJfY29uZmlnICpjdHIsCitzdGF0aWMgaW50IGNlbGxfcmVnX3NldHVwX3NwdV9jeWNsZXMoc3RydWN0IG9wX2NvdW50ZXJfY29uZmlnICpjdHIsCiAJCQlzdHJ1Y3Qgb3Bfc3lzdGVtX2NvbmZpZyAqc3lzLCBpbnQgbnVtX2N0cnMpCiB7Ci0JaW50IGksIGosIGNwdTsKLQlzcHVfY3ljbGVfcmVzZXQgPSAwOwotCi0JaWYgKGN0clswXS5ldmVudCA9PSBTUFVfQ1lDTEVTX0VWRU5UX05VTSkgewotCQlzcHVfY3ljbGVfcmVzZXQgPSBjdHJbMF0uY291bnQ7Ci0KLQkJLyoKLQkJICogRWFjaCBub2RlIHdpbGwgbmVlZCB0byBtYWtlIHRoZSBydGFzIGNhbGwgdG8gc3RhcnQKLQkJICogYW5kIHN0b3AgU1BVIHByb2ZpbGluZy4gIEdldCB0aGUgdG9rZW4gb25jZSBhbmQgc3RvcmUgaXQuCi0JCSAqLwotCQlzcHVfcnRhc190b2tlbiA9IHJ0YXNfdG9rZW4oImlibSxjYmUtc3B1LXBlcmZ0b29scyIpOwotCi0JCWlmICh1bmxpa2VseShzcHVfcnRhc190b2tlbiA9PSBSVEFTX1VOS05PV05fU0VSVklDRSkpIHsKLQkJCXByaW50ayhLRVJOX0VSUgotCQkJICAgICAgICIlczogcnRhcyB0b2tlbiBpYm0sY2JlLXNwdS1wZXJmdG9vbHMgdW5rbm93blxuIiwKLQkJCSAgICAgICBfX2Z1bmNfXyk7Ci0JCQlyZXR1cm4gLUVJTzsKLQkJfQotCX0KLQotCXBtX3J0YXNfdG9rZW4gPSBydGFzX3Rva2VuKCJpYm0sY2JlLXBlcmZ0b29scyIpOworCXNwdV9jeWNsZV9yZXNldCA9IGN0clswXS5jb3VudDsKIAogCS8qCi0JICogRm9yIGFsbCBldmVudHMgZXhjZXRwIFBQVSBDWUNMRXMsIGVhY2ggbm9kZSB3aWxsIG5lZWQgdG8gbWFrZQorCSAqIEVhY2ggbm9kZSB3aWxsIG5lZWQgdG8gbWFrZSB0aGUgcnRhcyBjYWxsIHRvIHN0YXJ0CisJICogYW5kIHN0b3AgU1BVIHByb2ZpbGluZy4gIEdldCB0aGUgdG9rZW4gb25jZSBhbmQgc3RvcmUgaXQuCisJICovCisJc3B1X3J0YXNfdG9rZW4gPSBydGFzX3Rva2VuKCJpYm0sY2JlLXNwdS1wZXJmdG9vbHMiKTsKKworCWlmICh1bmxpa2VseShzcHVfcnRhc190b2tlbiA9PSBSVEFTX1VOS05PV05fU0VSVklDRSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCSAgICAgICAiJXM6IHJ0YXMgdG9rZW4gaWJtLGNiZS1zcHUtcGVyZnRvb2xzIHVua25vd25cbiIsCisJCSAgICAgICBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlPOworCX0KKwlyZXR1cm4gMDsKK30KKworLyogVW5mb3J0dW5hdGVseSwgdGhlIGhhcmR3YXJlIHdpbGwgb25seSBzdXBwb3J0IGV2ZW50IHByb2ZpbGluZworICogb24gb25lIFNQVSBwZXIgbm9kZSBhdCBhIHRpbWUuICBUaGVyZWZvcmUsIHdlIG11c3QgdGltZSBzbGljZQorICogdGhlIHByb2ZpbGluZyBhY3Jvc3MgYWxsIFNQVXMgaW4gdGhlIG5vZGUuICBOb3RlLCB3ZSBkbyB0aGlzCisgKiBpbiBwYXJhbGxlbCBmb3IgZWFjaCBub2RlLiAgVGhlIGZvbGxvd2luZyByb3V0aW5lIGlzIGNhbGxlZAorICogcGVyaW9kaWNhbGx5IGJhc2VkIG9uIGtlcm5lbCB0aW1lciB0byBzd2l0Y2ggd2hpY2ggU1BVIGlzCisgKiBiZWluZyBtb25pdG9yZWQgaW4gYSByb3VuZCByb2JiaW4gZmFzaGlvbi4KKyAqLworc3RhdGljIHZvaWQgc3B1X2V2bnRfc3dhcCh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJaW50IG5vZGU7CisJaW50IGN1cl9waHlzX3NwdSwgbnh0X3BoeXNfc3B1LCBjdXJfc3B1X2V2bnRfcGh5c19zcHVfaW5keDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBjcHU7CisJaW50IHJldDsKKwl1MzIgaW50ZXJydXB0X21hc2s7CisKKworCS8qIGVuYWJsZSBpbnRlcnJ1cHRzIG9uIGNudHIgMCAqLworCWludGVycnVwdF9tYXNrID0gQ0JFX1BNX0NUUl9PVkVSRkxPV19JTlRSKDApOworCisJaGR3X3RocmVhZCA9IDA7CisKKwkvKiBNYWtlIHN1cmUgc3B1IGV2ZW50IGludGVycnVwdCBoYW5kbGVyIGFuZCBzcHUgZXZlbnQgc3dhcAorCSAqIGRvbid0IGFjY2VzcyB0aGUgY291bnRlcnMgc2ltdWx0YW5lb3VzbHkuCisJICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNudHJfbG9jaywgZmxhZ3MpOworCisJY3VyX3NwdV9ldm50X3BoeXNfc3B1X2luZHggPSBzcHVfZXZudF9waHlzX3NwdV9pbmR4OworCisJaWYgKCsrKHNwdV9ldm50X3BoeXNfc3B1X2luZHgpID09IE5VTV9TUFVTX1BFUl9OT0RFKQorCQlzcHVfZXZudF9waHlzX3NwdV9pbmR4ID0gMDsKKworCXBtX3NpZ25hbFswXS5zdWJfdW5pdCA9IHNwdV9ldm50X3BoeXNfc3B1X2luZHg7CisJcG1fc2lnbmFsWzFdLnN1Yl91bml0ID0gc3B1X2V2bnRfcGh5c19zcHVfaW5keDsKKwlwbV9zaWduYWxbMl0uc3ViX3VuaXQgPSBzcHVfZXZudF9waHlzX3NwdV9pbmR4OworCisJLyogc3dpdGNoIHRoZSBTUFUgYmVpbmcgcHJvZmlsZWQgb24gZWFjaCBub2RlICovCisJZm9yX2VhY2hfb25saW5lX2NwdShjcHUpIHsKKwkJaWYgKGNiZV9nZXRfaHdfdGhyZWFkX2lkKGNwdSkpCisJCQljb250aW51ZTsKKworCQlub2RlID0gY2JlX2NwdV90b19ub2RlKGNwdSk7CisJCWN1cl9waHlzX3NwdSA9IChub2RlICogTlVNX1NQVVNfUEVSX05PREUpCisJCQkrIGN1cl9zcHVfZXZudF9waHlzX3NwdV9pbmR4OworCQlueHRfcGh5c19zcHUgPSAobm9kZSAqIE5VTV9TUFVTX1BFUl9OT0RFKQorCQkJKyBzcHVfZXZudF9waHlzX3NwdV9pbmR4OworCisJCS8qCisJCSAqIHN0b3AgY291bnRlcnMsIHNhdmUgY291bnRlciB2YWx1ZXMsIHJlc3RvcmUgY291bnRzCisJCSAqIGZvciBwcmV2aW91cyBwaHlzaWNhbCBTUFUKKwkJICovCisJCWNiZV9kaXNhYmxlX3BtKGNwdSk7CisJCWNiZV9kaXNhYmxlX3BtX2ludGVycnVwdHMoY3B1KTsKKworCQlzcHVfcG1fY250W2N1cl9waHlzX3NwdV0KKwkJCT0gY2JlX3JlYWRfY3RyKGNwdSwgMCk7CisKKwkJLyogcmVzdG9yZSBwcmV2aW91cyBjb3VudCBmb3IgdGhlIG5leHQgc3B1IHRvIHNhbXBsZSAqLworCQkvKiBOT1RFLCBoYXJkd2FyZSBpc3N1ZSwgY291bnRlciB3aWxsIG5vdCBzdGFydCBpZiB0aGUKKwkJICogY291bnRlciB2YWx1ZSBpcyBhdCBtYXggKDB4RkZGRkZGRkYpLgorCQkgKi8KKwkJaWYgKHNwdV9wbV9jbnRbbnh0X3BoeXNfc3B1XSA+PSAweEZGRkZGRkZGKQorCQkJY2JlX3dyaXRlX2N0cihjcHUsIDAsIDB4RkZGRkZGRjApOworCQkgZWxzZQorCQkJIGNiZV93cml0ZV9jdHIoY3B1LCAwLCBzcHVfcG1fY250W254dF9waHlzX3NwdV0pOworCisJCXBtX3J0YXNfcmVzZXRfc2lnbmFscyhjYmVfY3B1X3RvX25vZGUoY3B1KSk7CisKKwkJLyogc2V0dXAgdGhlIGRlYnVnIGJ1cyBtZWFzdXJlIHRoZSBvbmUgZXZlbnQgYW5kCisJCSAqIHRoZSB0d28gZXZlbnRzIHRvIHJvdXRlIHRoZSBuZXh0IFNQVSdzIFBDIG9uCisJCSAqIHRoZSBkZWJ1ZyBidXMKKwkJICovCisJCXJldCA9IHBtX3J0YXNfYWN0aXZhdGVfc2lnbmFscyhjYmVfY3B1X3RvX25vZGUoY3B1KSwgMyk7CisJCWlmIChyZXQpCisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBwbV9ydGFzX2FjdGl2YXRlX3NpZ25hbHMgZmFpbGVkLCAiCisJCQkgICAgICAgIlNQVSBldmVudCBzd2FwXG4iLCBfX2Z1bmNfXyk7CisKKwkJLyogY2xlYXIgdGhlIHRyYWNlIGJ1ZmZlciwgZG9uJ3Qgd2FudCB0byB0YWtlIFBDIGZvcgorCQkgKiBwcmV2aW91cyBTUFUqLworCQljYmVfd3JpdGVfcG0oY3B1LCB0cmFjZV9hZGRyZXNzLCAwKTsKKworCQllbmFibGVfY3RyKGNwdSwgMCwgcG1fcmVncy5wbTA3X2NudHJsKTsKKworCQkvKiBFbmFibGUgaW50ZXJydXB0cyBvbiB0aGUgQ1BVIHRocmVhZCB0aGF0IGlzIHN0YXJ0aW5nICovCisJCWNiZV9lbmFibGVfcG1faW50ZXJydXB0cyhjcHUsIGhkd190aHJlYWQsCisJCQkJCSBpbnRlcnJ1cHRfbWFzayk7CisJCWNiZV9lbmFibGVfcG0oY3B1KTsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjbnRyX2xvY2ssIGZsYWdzKTsKKworCS8qIHN3YXAgYXBwcm94aW1hdGVseSBldmVyeSAwLjEgc2Vjb25kcyAqLworCW1vZF90aW1lcigmdGltZXJfc3B1X2V2ZW50X3N3YXAsIGppZmZpZXMgKyBIWiAvIDI1KTsKK30KKworc3RhdGljIHZvaWQgc3RhcnRfc3B1X2V2ZW50X3N3YXAodm9pZCkKK3sKKwlpbml0X3RpbWVyKCZ0aW1lcl9zcHVfZXZlbnRfc3dhcCk7CisJdGltZXJfc3B1X2V2ZW50X3N3YXAuZnVuY3Rpb24gPSBzcHVfZXZudF9zd2FwOworCXRpbWVyX3NwdV9ldmVudF9zd2FwLmRhdGEgPSAwVUw7CisJdGltZXJfc3B1X2V2ZW50X3N3YXAuZXhwaXJlcyA9IGppZmZpZXMgKyBIWiAvIDI1OworCWFkZF90aW1lcigmdGltZXJfc3B1X2V2ZW50X3N3YXApOworfQorCitzdGF0aWMgaW50IGNlbGxfcmVnX3NldHVwX3NwdV9ldmVudHMoc3RydWN0IG9wX2NvdW50ZXJfY29uZmlnICpjdHIsCisJCQlzdHJ1Y3Qgb3Bfc3lzdGVtX2NvbmZpZyAqc3lzLCBpbnQgbnVtX2N0cnMpCit7CisJaW50IGk7CisKKwkvKiByb3V0aW5lIGlzIGNhbGxlZCBvbmNlIGZvciBhbGwgbm9kZXMgKi8KKworCXNwdV9ldm50X3BoeXNfc3B1X2luZHggPSAwOworCS8qCisJICogRm9yIGFsbCBldmVudHMgZXhjZXB0IFBQVSBDWUNMRXMsIGVhY2ggbm9kZSB3aWxsIG5lZWQgdG8gbWFrZQogCSAqIHRoZSBydGFzIGNiZS1wZXJmdG9vbHMgY2FsbCB0byBzZXR1cCBhbmQgcmVzZXQgdGhlIGRlYnVnIGJ1cy4KIAkgKiBNYWtlIHRoZSB0b2tlbiBsb29rdXAgY2FsbCBvbmNlIGFuZCBzdG9yZSBpdCBpbiB0aGUgZ2xvYmFsCiAJICogdmFyaWFibGUgcG1fcnRhc190b2tlbi4KIAkgKi8KKwlwbV9ydGFzX3Rva2VuID0gcnRhc190b2tlbigiaWJtLGNiZS1wZXJmdG9vbHMiKTsKKwogCWlmICh1bmxpa2VseShwbV9ydGFzX3Rva2VuID09IFJUQVNfVU5LTk9XTl9TRVJWSUNFKSkgewogCQlwcmludGsoS0VSTl9FUlIKIAkJICAgICAgICIlczogcnRhcyB0b2tlbiBpYm0sY2JlLXBlcmZ0b29scyB1bmtub3duXG4iLApAQCAtNTgwLDYgKzcxMSw1OCBAQAogCQlyZXR1cm4gLUVJTzsKIAl9CiAKKwkvKiBzZXR1cCB0aGUgcG1fY29udHJvbCByZWdpc3RlciBzZXR0aW5ncywKKwkgKiBzZXR0aW5ncyB3aWxsIGJlIHdyaXR0ZW4gcGVyIG5vZGUgYnkgdGhlCisJICogY2VsbF9jcHVfc2V0dXAoKSBmdW5jdGlvbi4KKwkgKi8KKwlwbV9yZWdzLnBtX2NudHJsLnRyYWNlX2J1Zl9vdmZsdyA9IDE7CisKKwkvKiBVc2UgdGhlIG9jY3VycmVuY2UgdHJhY2UgbW9kZSB0byBoYXZlIFNQVSBQQyBzYXZlZAorCSAqIHRvIHRoZSB0cmFjZSBidWZmZXIuICBPY2N1cnJlbmNlIGRhdGEgaW4gdHJhY2UgYnVmZmVyCisJICogaXMgbm90IHVzZWQuICBCaXQgMiBtdXN0IGJlIHNldCB0byBzdG9yZSBTUFUgYWRkcmVzc2VzLgorCSAqLworCXBtX3JlZ3MucG1fY250cmwudHJhY2VfbW9kZSA9IDI7CisKKwlwbV9yZWdzLnBtX2NudHJsLnNwdV9hZGRyX3RyYWNlID0gMHgxOyAgLyogdXNpbmcgZGVidWcgYnVzCisJCQkJCQkgICBldmVudCAyICYgMyAqLworCisJLyogc2V0dXAgdGhlIGRlYnVnIGJ1cyBldmVudCBhcnJheSB3aXRoIHRoZSBTUFUgUEMgcm91dGluZyBldmVudHMuCisJKiAgTm90ZSwgcG1fc2lnbmFsWzBdIHdpbGwgYmUgZmlsbGVkIGluIGJ5IHNldF9wbV9ldmVudCgpIGNhbGwgYmVsb3cuCisJKi8KKwlwbV9zaWduYWxbMV0uc2lnbmFsX2dyb3VwID0gU1BVX1BST0ZJTEVfRVZFTlRfQUREUiAvIDEwMDsKKwlwbV9zaWduYWxbMV0uYnVzX3dvcmQgPSBHRVRfQlVTX1dPUkQoU1BVX1BST0ZJTEVfRVZFTlRfQUREUl9NQVNLX0EpOworCXBtX3NpZ25hbFsxXS5iaXQgPSBTUFVfUFJPRklMRV9FVkVOVF9BRERSICUgMTAwOworCXBtX3NpZ25hbFsxXS5zdWJfdW5pdCA9IHNwdV9ldm50X3BoeXNfc3B1X2luZHg7CisKKwlwbV9zaWduYWxbMl0uc2lnbmFsX2dyb3VwID0gU1BVX1BST0ZJTEVfRVZFTlRfQUREUiAvIDEwMDsKKwlwbV9zaWduYWxbMl0uYnVzX3dvcmQgPSBHRVRfQlVTX1dPUkQoU1BVX1BST0ZJTEVfRVZFTlRfQUREUl9NQVNLX0IpOworCXBtX3NpZ25hbFsyXS5iaXQgPSBTUFVfUFJPRklMRV9FVkVOVF9BRERSICUgMTAwOworCXBtX3NpZ25hbFsyXS5zdWJfdW5pdCA9IHNwdV9ldm50X3BoeXNfc3B1X2luZHg7CisKKwkvKiBTZXQgdGhlIHVzZXIgc2VsZWN0ZWQgc3B1IGV2ZW50IHRvIHByb2ZpbGUgb24sCisJICogbm90ZSwgb25seSBvbmUgU1BVIHByb2ZpbGluZyBldmVudCBpcyBzdXBwb3J0ZWQKKwkgKi8KKwludW1fY291bnRlcnMgPSAxOyAgLyogT25seSBzdXBwb3J0IG9uZSBTUFUgZXZlbnQgYXQgYSB0aW1lICovCisJc2V0X3BtX2V2ZW50KDAsIGN0clswXS5ldmVudCwgY3RyWzBdLnVuaXRfbWFzayk7CisKKwlyZXNldF92YWx1ZVswXSA9IDB4RkZGRkZGRkYgLSBjdHJbMF0uY291bnQ7CisKKwkvKiBnbG9iYWwsIHVzZWQgYnkgY2VsbF9jcHVfc2V0dXAgKi8KKwljdHJfZW5hYmxlZCB8PSAxOworCisJLyogSW5pdGlhbGl6ZSB0aGUgY291bnQgZm9yIGVhY2ggU1BVIHRvIHRoZSByZXNldCB2YWx1ZSAqLworCWZvciAoaT0wOyBpIDwgTUFYX05VTU5PREVTICogTlVNX1NQVVNfUEVSX05PREU7IGkrKykKKwkJc3B1X3BtX2NudFtpXSA9IHJlc2V0X3ZhbHVlWzBdOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY2VsbF9yZWdfc2V0dXBfcHB1KHN0cnVjdCBvcF9jb3VudGVyX2NvbmZpZyAqY3RyLAorCQkJc3RydWN0IG9wX3N5c3RlbV9jb25maWcgKnN5cywgaW50IG51bV9jdHJzKQoreworCS8qIHJvdXRpbmUgaXMgY2FsbGVkIG9uY2UgZm9yIGFsbCBub2RlcyAqLworCWludCBpLCBqLCBjcHU7CisKIAludW1fY291bnRlcnMgPSBudW1fY3RyczsKIAogCWlmICh1bmxpa2VseShudW1fY3RycyA+IE5SX1BIWVNfQ1RSUykpIHsKQEAgLTU4OSwxNCArNzcyLDYgQEAKIAkJICAgICAgIF9fZnVuY19fKTsKIAkJcmV0dXJuIC1FSU87CiAJfQotCXBtX3JlZ3MuZ3JvdXBfY29udHJvbCA9IDA7Ci0JcG1fcmVncy5kZWJ1Z19idXNfY29udHJvbCA9IDA7Ci0KLQkvKiBzZXR1cCB0aGUgcG1fY29udHJvbCByZWdpc3RlciAqLwotCW1lbXNldCgmcG1fcmVncy5wbV9jbnRybCwgMCwgc2l6ZW9mKHN0cnVjdCBwbV9jbnRybCkpOwotCXBtX3JlZ3MucG1fY250cmwuc3RvcF9hdF9tYXggPSAxOwotCXBtX3JlZ3MucG1fY250cmwudHJhY2VfbW9kZSA9IDA7Ci0JcG1fcmVncy5wbV9jbnRybC5mcmVlemUgPSAxOwogCiAJc2V0X2NvdW50X21vZGUoc3lzLT5lbmFibGVfa2VybmVsLCBzeXMtPmVuYWJsZV91c2VyKTsKIApAQCAtNjY1LDYgKzg0MCw2MyBAQAogfQogCiAKKy8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIG9uY2UgZm9yIGFsbCBjcHVzIGNvbWJpbmVkICovCitzdGF0aWMgaW50IGNlbGxfcmVnX3NldHVwKHN0cnVjdCBvcF9jb3VudGVyX2NvbmZpZyAqY3RyLAorCQkJc3RydWN0IG9wX3N5c3RlbV9jb25maWcgKnN5cywgaW50IG51bV9jdHJzKQoreworCWludCByZXQ9MDsKKwlzcHVfY3ljbGVfcmVzZXQgPSAwOworCisJLyogaW5pdGlhbGl6ZSB0aGUgc3B1X2Fycl90cmFjZSB2YWx1ZSwgd2lsbCBiZSByZXNldCBpZgorCSAqIGRvaW5nIHNwdSBldmVudCBwcm9maWxpbmcuCisJICovCisJcG1fcmVncy5ncm91cF9jb250cm9sID0gMDsKKwlwbV9yZWdzLmRlYnVnX2J1c19jb250cm9sID0gMDsKKwlwbV9yZWdzLnBtX2NudHJsLnN0b3BfYXRfbWF4ID0gMTsKKwlwbV9yZWdzLnBtX2NudHJsLnRyYWNlX21vZGUgPSAwOworCXBtX3JlZ3MucG1fY250cmwuZnJlZXplID0gMTsKKwlwbV9yZWdzLnBtX2NudHJsLnRyYWNlX2J1Zl9vdmZsdyA9IDA7CisJcG1fcmVncy5wbV9jbnRybC5zcHVfYWRkcl90cmFjZSA9IDA7CisKKwkvKgorCSAqIEZvciBhbGwgZXZlbnRzIGV4Y2VwdCBQUFUgQ1lDTEVzLCBlYWNoIG5vZGUgd2lsbCBuZWVkIHRvIG1ha2UKKwkgKiB0aGUgcnRhcyBjYmUtcGVyZnRvb2xzIGNhbGwgdG8gc2V0dXAgYW5kIHJlc2V0IHRoZSBkZWJ1ZyBidXMuCisJICogTWFrZSB0aGUgdG9rZW4gbG9va3VwIGNhbGwgb25jZSBhbmQgc3RvcmUgaXQgaW4gdGhlIGdsb2JhbAorCSAqIHZhcmlhYmxlIHBtX3J0YXNfdG9rZW4uCisJICovCisJcG1fcnRhc190b2tlbiA9IHJ0YXNfdG9rZW4oImlibSxjYmUtcGVyZnRvb2xzIik7CisKKwlpZiAodW5saWtlbHkocG1fcnRhc190b2tlbiA9PSBSVEFTX1VOS05PV05fU0VSVklDRSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCSAgICAgICAiJXM6IHJ0YXMgdG9rZW4gaWJtLGNiZS1wZXJmdG9vbHMgdW5rbm93blxuIiwKKwkJICAgICAgIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJaWYgKGN0clswXS5ldmVudCA9PSBTUFVfQ1lDTEVTX0VWRU5UX05VTSkgeworCQlwcm9maWxpbmdfbW9kZSA9IFNQVV9QUk9GSUxJTkdfQ1lDTEVTOworCQlyZXQgPSBjZWxsX3JlZ19zZXR1cF9zcHVfY3ljbGVzKGN0ciwgc3lzLCBudW1fY3Rycyk7CisJfSBlbHNlIGlmICgoY3RyWzBdLmV2ZW50ID49IFNQVV9FVkVOVF9OVU1fU1RBUlQpICYmCisJCSAgIChjdHJbMF0uZXZlbnQgPD0gU1BVX0VWRU5UX05VTV9TVE9QKSkgeworCQlwcm9maWxpbmdfbW9kZSA9IFNQVV9QUk9GSUxJTkdfRVZFTlRTOworCQlzcHVfY3ljbGVfcmVzZXQgPSBjdHJbMF0uY291bnQ7CisKKwkJLyogZm9yIFNQVSBldmVudCBwcm9maWxpbmcsIG5lZWQgdG8gc2V0dXAgdGhlCisJCSAqIHBtX3NpZ25hbCBhcnJheSB3aXRoIHRoZSBldmVudHMgdG8gcm91dGUgdGhlCisJCSAqIFNQVSBQQyBiZWZvcmUgbWFraW5nIHRoZSBGVyBjYWxsLiAgTm90ZSwgb25seQorCQkgKiBvbmUgU1BVIGV2ZW50IGZvciBwcm9maWxpbmcgY2FuIGJlIHNwZWNpZmllZAorCQkgKiBhdCBhIHRpbWUuCisJCSAqLworCQljZWxsX3JlZ19zZXR1cF9zcHVfZXZlbnRzKGN0ciwgc3lzLCBudW1fY3Rycyk7CisJfSBlbHNlIHsKKwkJcHJvZmlsaW5nX21vZGUgPSBQUFVfUFJPRklMSU5HOworCQlyZXQgPSBjZWxsX3JlZ19zZXR1cF9wcHUoY3RyLCBzeXMsIG51bV9jdHJzKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCisKIAogLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgb25jZSBmb3IgZWFjaCBjcHUgKi8KIHN0YXRpYyBpbnQgY2VsbF9jcHVfc2V0dXAoc3RydWN0IG9wX2NvdW50ZXJfY29uZmlnICpjbnRyKQpAQCAtNjcyLDggKzkwNCwxMyBAQAogCXUzMiBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CiAJdTMyIG51bV9lbmFibGVkID0gMDsKIAlpbnQgaTsKKwlpbnQgcmV0OwogCi0JaWYgKHNwdV9jeWNsZV9yZXNldCkKKwkvKiBDeWNsZSBiYXNlZCBTUFUgcHJvZmlsaW5nIGRvZXMgbm90IHVzZSB0aGUgcGVyZm9ybWFuY2UKKwkgKiBjb3VudGVycy4gIFRoZSB0cmFjZSBhcnJheSBpcyBjb25maWd1cmVkIHRvIGNvbGxlY3QKKwkgKiB0aGUgZGF0YS4KKwkgKi8KKwlpZiAocHJvZmlsaW5nX21vZGUgPT0gU1BVX1BST0ZJTElOR19DWUNMRVMpCiAJCXJldHVybiAwOwogCiAJLyogVGhlcmUgaXMgb25lIHBlcmZvcm1hbmNlIG1vbml0b3IgcGVyIHByb2Nlc3NvciBjaGlwIChpLmUuIG5vZGUpLApAQCAtNjg2LDcgKzkyMyw2IEBACiAJY2JlX2Rpc2FibGVfcG0oY3B1KTsKIAljYmVfZGlzYWJsZV9wbV9pbnRlcnJ1cHRzKGNwdSk7CiAKLQljYmVfd3JpdGVfcG0oY3B1LCBwbV9pbnRlcnZhbCwgMCk7CiAJY2JlX3dyaXRlX3BtKGNwdSwgcG1fc3RhcnRfc3RvcCwgMCk7CiAJY2JlX3dyaXRlX3BtKGNwdSwgZ3JvdXBfY29udHJvbCwgcG1fcmVncy5ncm91cF9jb250cm9sKTsKIAljYmVfd3JpdGVfcG0oY3B1LCBkZWJ1Z19idXNfY29udHJvbCwgcG1fcmVncy5kZWJ1Z19idXNfY29udHJvbCk7CkBAIC03MDMsNyArOTM5LDIwIEBACiAJICogVGhlIHBtX3J0YXNfYWN0aXZhdGVfc2lnbmFscyB3aWxsIHJldHVybiAtRUlPIGlmIHRoZSBGVwogCSAqIGNhbGwgZmFpbGVkLgogCSAqLwotCXJldHVybiBwbV9ydGFzX2FjdGl2YXRlX3NpZ25hbHMoY2JlX2NwdV90b19ub2RlKGNwdSksIG51bV9lbmFibGVkKTsKKwlpZiAocHJvZmlsaW5nX21vZGUgPT0gU1BVX1BST0ZJTElOR19FVkVOVFMpIHsKKwkJLyogRm9yIFNQVSBldmVudCBwcm9maWxpbmcgYWxzbyBuZWVkIHRvIHNldHVwIHRoZQorCQkgKiBwbSBpbnRlcnZhbCB0aW1lcgorCQkgKi8KKwkJcmV0ID0gcG1fcnRhc19hY3RpdmF0ZV9zaWduYWxzKGNiZV9jcHVfdG9fbm9kZShjcHUpLAorCQkJCQkgICAgICAgbnVtX2VuYWJsZWQrMik7CisJCS8qIHN0b3JlIFBDIGZyb20gZGVidWcgYnVzIHRvIFRyYWNlIGJ1ZmZlciBhcyBvZnRlbgorCQkgKiBhcyBwb3NzaWJsZSAoZXZlcnkgMTAgY3ljbGVzKQorCQkgKi8KKwkJY2JlX3dyaXRlX3BtKGNwdSwgcG1faW50ZXJ2YWwsIE5VTV9JTlRFUlZBTF9DWUMpOworCQlyZXR1cm4gcmV0OworCX0gZWxzZQorCQlyZXR1cm4gcG1fcnRhc19hY3RpdmF0ZV9zaWduYWxzKGNiZV9jcHVfdG9fbm9kZShjcHUpLAorCQkJCQkJbnVtX2VuYWJsZWQpOwogfQogCiAjZGVmaW5lIEVOVFJJRVMJIDMwMwpAQCAtODg1LDcgKzExMzQsMTIyIEBACiB9OwogI2VuZGlmCiAKLXN0YXRpYyBpbnQgY2VsbF9nbG9iYWxfc3RhcnRfc3B1KHN0cnVjdCBvcF9jb3VudGVyX2NvbmZpZyAqY3RyKQorLyoKKyAqIE5vdGUgdGhlIGdlbmVyaWMgT1Byb2ZpbGUgc3RvcCBjYWxscyBkbyBub3Qgc3VwcG9ydCByZXR1cm5pbmcKKyAqIGFuIGVycm9yIG9uIHN0b3AuICBIZW5jZSwgd2lsbCBub3QgcmV0dXJuIGFuIGVycm9yIGlmIHRoZSBGVworICogY2FsbHMgZmFpbCBvbiBzdG9wLglGYWlsdXJlIHRvIHJlc2V0IHRoZSBkZWJ1ZyBidXMgaXMgbm90IGFuIGlzc3VlLgorICogRmFpbHVyZSB0byBkaXNhYmxlIHRoZSBTUFUgcHJvZmlsaW5nIGlzIG5vdCBhbiBpc3N1ZS4gIFRoZSBGVyBjYWxscworICogdG8gZW5hYmxlIHRoZSBwZXJmb3JtYW5jZSBjb3VudGVycyBhbmQgZGVidWcgYnVzIHdpbGwgd29yayBldmVuIGlmCisgKiB0aGUgaGFyZHdhcmUgd2FzIG5vdCBjbGVhbmx5IHJlc2V0LgorICovCitzdGF0aWMgdm9pZCBjZWxsX2dsb2JhbF9zdG9wX3NwdV9jeWNsZXModm9pZCkKK3sKKwlpbnQgc3ViZnVuYywgcnRuX3ZhbHVlOworCXVuc2lnbmVkIGludCBsZnNyX3ZhbHVlOworCWludCBjcHU7CisKKwlvcHJvZmlsZV9ydW5uaW5nID0gMDsKKwlzbXBfd21iKCk7CisKKyNpZmRlZiBDT05GSUdfQ1BVX0ZSRVEKKwljcHVmcmVxX3VucmVnaXN0ZXJfbm90aWZpZXIoJmNwdV9mcmVxX25vdGlmaWVyX2Jsb2NrLAorCQkJCSAgICBDUFVGUkVRX1RSQU5TSVRJT05fTk9USUZJRVIpOworI2VuZGlmCisKKwlmb3JfZWFjaF9vbmxpbmVfY3B1KGNwdSkgeworCQlpZiAoY2JlX2dldF9od190aHJlYWRfaWQoY3B1KSkKKwkJCWNvbnRpbnVlOworCisJCXN1YmZ1bmMgPSAzOwkvKgorCQkJCSAqIDIgLSBhY3RpdmF0ZSBTUFUgdHJhY2luZywKKwkJCQkgKiAzIC0gZGVhY3RpdmF0ZQorCQkJCSAqLworCQlsZnNyX3ZhbHVlID0gMHg4ZjEwMDAwMDsKKworCQlydG5fdmFsdWUgPSBydGFzX2NhbGwoc3B1X3J0YXNfdG9rZW4sIDMsIDEsIE5VTEwsCisJCQkJICAgICAgc3ViZnVuYywgY2JlX2NwdV90b19ub2RlKGNwdSksCisJCQkJICAgICAgbGZzcl92YWx1ZSk7CisKKwkJaWYgKHVubGlrZWx5KHJ0bl92YWx1ZSAhPSAwKSkgeworCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkgICAgICAgIiVzOiBydGFzIGNhbGwgaWJtLGNiZS1zcHUtcGVyZnRvb2xzICIgXAorCQkJICAgICAgICJmYWlsZWQsIHJldHVybiA9ICVkXG4iLAorCQkJICAgICAgIF9fZnVuY19fLCBydG5fdmFsdWUpOworCQl9CisKKwkJLyogRGVhY3RpdmF0ZSB0aGUgc2lnbmFscyAqLworCQlwbV9ydGFzX3Jlc2V0X3NpZ25hbHMoY2JlX2NwdV90b19ub2RlKGNwdSkpOworCX0KKworCXN0b3Bfc3B1X3Byb2ZpbGluZ19jeWNsZXMoKTsKK30KKworc3RhdGljIHZvaWQgY2VsbF9nbG9iYWxfc3RvcF9zcHVfZXZlbnRzKHZvaWQpCit7CisJaW50IGNwdTsKKwlvcHJvZmlsZV9ydW5uaW5nID0gMDsKKworCXN0b3Bfc3B1X3Byb2ZpbGluZ19ldmVudHMoKTsKKwlzbXBfd21iKCk7CisKKwlmb3JfZWFjaF9vbmxpbmVfY3B1KGNwdSkgeworCQlpZiAoY2JlX2dldF9od190aHJlYWRfaWQoY3B1KSkKKwkJCWNvbnRpbnVlOworCisJCWNiZV9zeW5jX2lycShjYmVfY3B1X3RvX25vZGUoY3B1KSk7CisJCS8qIFN0b3AgdGhlIGNvdW50ZXJzICovCisJCWNiZV9kaXNhYmxlX3BtKGNwdSk7CisJCWNiZV93cml0ZV9wbTA3X2NvbnRyb2woY3B1LCAwLCAwKTsKKworCQkvKiBEZWFjdGl2YXRlIHRoZSBzaWduYWxzICovCisJCXBtX3J0YXNfcmVzZXRfc2lnbmFscyhjYmVfY3B1X3RvX25vZGUoY3B1KSk7CisKKwkJLyogRGVhY3RpdmF0ZSBpbnRlcnJ1cHRzICovCisJCWNiZV9kaXNhYmxlX3BtX2ludGVycnVwdHMoY3B1KTsKKwl9CisJZGVsX3RpbWVyX3N5bmMoJnRpbWVyX3NwdV9ldmVudF9zd2FwKTsKK30KKworc3RhdGljIHZvaWQgY2VsbF9nbG9iYWxfc3RvcF9wcHUodm9pZCkKK3sKKwlpbnQgY3B1OworCisJLyoKKwkgKiBUaGlzIHJvdXRpbmUgd2lsbCBiZSBjYWxsZWQgb25jZSBmb3IgdGhlIHN5c3RlbS4KKwkgKiBUaGVyZSBpcyBvbmUgcGVyZm9ybWFuY2UgbW9uaXRvciBwZXIgbm9kZSwgc28gd2UKKwkgKiBvbmx5IG5lZWQgdG8gcGVyZm9ybSB0aGlzIGZ1bmN0aW9uIG9uY2UgcGVyIG5vZGUuCisJICovCisJZGVsX3RpbWVyX3N5bmMoJnRpbWVyX3ZpcnRfY250cik7CisJb3Byb2ZpbGVfcnVubmluZyA9IDA7CisJc21wX3dtYigpOworCisJZm9yX2VhY2hfb25saW5lX2NwdShjcHUpIHsKKwkJaWYgKGNiZV9nZXRfaHdfdGhyZWFkX2lkKGNwdSkpCisJCQljb250aW51ZTsKKworCQljYmVfc3luY19pcnEoY2JlX2NwdV90b19ub2RlKGNwdSkpOworCQkvKiBTdG9wIHRoZSBjb3VudGVycyAqLworCQljYmVfZGlzYWJsZV9wbShjcHUpOworCisJCS8qIERlYWN0aXZhdGUgdGhlIHNpZ25hbHMgKi8KKwkJcG1fcnRhc19yZXNldF9zaWduYWxzKGNiZV9jcHVfdG9fbm9kZShjcHUpKTsKKworCQkvKiBEZWFjdGl2YXRlIGludGVycnVwdHMgKi8KKwkJY2JlX2Rpc2FibGVfcG1faW50ZXJydXB0cyhjcHUpOworCX0KK30KKworc3RhdGljIHZvaWQgY2VsbF9nbG9iYWxfc3RvcCh2b2lkKQoreworCWlmIChwcm9maWxpbmdfbW9kZSA9PSBQUFVfUFJPRklMSU5HKQorCQljZWxsX2dsb2JhbF9zdG9wX3BwdSgpOworCWVsc2UgaWYgKHByb2ZpbGluZ19tb2RlID09IFNQVV9QUk9GSUxJTkdfRVZFTlRTKQorCQljZWxsX2dsb2JhbF9zdG9wX3NwdV9ldmVudHMoKTsKKwllbHNlCisJCWNlbGxfZ2xvYmFsX3N0b3Bfc3B1X2N5Y2xlcygpOworfQorCitzdGF0aWMgaW50IGNlbGxfZ2xvYmFsX3N0YXJ0X3NwdV9jeWNsZXMoc3RydWN0IG9wX2NvdW50ZXJfY29uZmlnICpjdHIpCiB7CiAJaW50IHN1YmZ1bmM7CiAJdW5zaWduZWQgaW50IGxmc3JfdmFsdWU7CkBAIC05NTEsMTggKzEzMTUsMTggQEAKIAogCQkvKiBzdGFydCBwcm9maWxpbmcgKi8KIAkJcmV0ID0gcnRhc19jYWxsKHNwdV9ydGFzX3Rva2VuLCAzLCAxLCBOVUxMLCBzdWJmdW5jLAotCQkgIGNiZV9jcHVfdG9fbm9kZShjcHUpLCBsZnNyX3ZhbHVlKTsKKwkJCQljYmVfY3B1X3RvX25vZGUoY3B1KSwgbGZzcl92YWx1ZSk7CiAKIAkJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkgewogCQkJcHJpbnRrKEtFUk5fRVJSCi0JCQkgICAgICAgIiVzOiBydGFzIGNhbGwgaWJtLGNiZS1zcHUtcGVyZnRvb2xzIGZhaWxlZCwgcmV0dXJuID0gJWRcbiIsCi0JCQkgICAgICAgX19mdW5jX18sIHJldCk7CisJCQkgICAgICAgIiVzOiBydGFzIGNhbGwgaWJtLGNiZS1zcHUtcGVyZnRvb2xzIGZhaWxlZCwgIiBcCisJCQkgICAgICAgInJldHVybiA9ICVkXG4iLCBfX2Z1bmNfXywgcmV0KTsKIAkJCXJ0YXNfZXJyb3IgPSAtRUlPOwogCQkJZ290byBvdXQ7CiAJCX0KIAl9CiAKLQlydGFzX2Vycm9yID0gc3RhcnRfc3B1X3Byb2ZpbGluZyhzcHVfY3ljbGVfcmVzZXQpOworCXJ0YXNfZXJyb3IgPSBzdGFydF9zcHVfcHJvZmlsaW5nX2N5Y2xlcyhzcHVfY3ljbGVfcmVzZXQpOwogCWlmIChydGFzX2Vycm9yKQogCQlnb3RvIG91dF9zdG9wOwogCkBAIC05NzAsMTEgKzEzMzQsNzQgQEAKIAlyZXR1cm4gMDsKIAogb3V0X3N0b3A6Ci0JY2VsbF9nbG9iYWxfc3RvcF9zcHUoKTsJCS8qIGNsZWFuIHVwIHRoZSBQTVUvZGVidWcgYnVzICovCisJY2VsbF9nbG9iYWxfc3RvcF9zcHVfY3ljbGVzKCk7CS8qIGNsZWFuIHVwIHRoZSBQTVUvZGVidWcgYnVzICovCiBvdXQ6CiAJcmV0dXJuIHJ0YXNfZXJyb3I7CiB9CiAKK3N0YXRpYyBpbnQgY2VsbF9nbG9iYWxfc3RhcnRfc3B1X2V2ZW50cyhzdHJ1Y3Qgb3BfY291bnRlcl9jb25maWcgKmN0cikKK3sKKwlpbnQgY3B1OworCXUzMiBpbnRlcnJ1cHRfbWFzayA9IDA7CisJaW50IHJ0biA9IDA7CisKKwloZHdfdGhyZWFkID0gMDsKKworCS8qIHNwdSBldmVudCBwcm9maWxpbmcsIHVzZXMgdGhlIHBlcmZvcm1hbmNlIGNvdW50ZXJzIHRvIGdlbmVyYXRlCisJICogYW4gaW50ZXJydXB0LiAgVGhlIGhhcmR3YXJlIGlzIHNldHVwIHRvIHN0b3JlIHRoZSBTUFUgcHJvZ3JhbQorCSAqIGNvdW50ZXIgaW50byB0aGUgdHJhY2UgYXJyYXkuICBUaGUgb2NjdXJyZW5jZSBtb2RlIGlzIHVzZWQgdG8KKwkgKiBlbmFibGUgc3RvcmluZyBkYXRhIHRvIHRoZSB0cmFjZSBidWZmZXIuICBUaGUgYml0cyBhcmUgc2V0CisJICogdG8gc2VuZC9zdG9yZSB0aGUgU1BVIGFkZHJlc3MgaW4gdGhlIHRyYWNlIGJ1ZmZlci4gIFRoZSBkZWJ1ZworCSAqIGJ1cyBtdXN0IGJlIHNldHVwIHRvIHJvdXRlIHRoZSBTUFUgcHJvZ3JhbSBjb3VudGVyIG9udG8gdGhlCisJICogZGVidWcgYnVzLiAgVGhlIG9jY3VycmVuY2UgZGF0YSBpbiB0aGUgdHJhY2UgYnVmZmVyIGlzIG5vdCB1c2VkLgorCSAqLworCisJLyogVGhpcyByb3V0aW5lIGdldHMgY2FsbGVkIG9uY2UgZm9yIHRoZSBzeXN0ZW0uCisJICogVGhlcmUgaXMgb25lIHBlcmZvcm1hbmNlIG1vbml0b3IgcGVyIG5vZGUsIHNvIHdlCisJICogb25seSBuZWVkIHRvIHBlcmZvcm0gdGhpcyBmdW5jdGlvbiBvbmNlIHBlciBub2RlLgorCSAqLworCisJZm9yX2VhY2hfb25saW5lX2NwdShjcHUpIHsKKwkJaWYgKGNiZV9nZXRfaHdfdGhyZWFkX2lkKGNwdSkpCisJCQljb250aW51ZTsKKworCQkvKgorCQkgKiBTZXR1cCBTUFUgZXZlbnQtYmFzZWQgcHJvZmlsaW5nLgorCQkgKiBTZXQgcGVyZl9tb25fY29udHJvbCBiaXQgMCB0byBhIHplcm8gYmVmb3JlCisJCSAqIGVuYWJsaW5nIHNwdSBjb2xsZWN0aW9uIGhhcmR3YXJlLgorCQkgKgorCQkgKiBPbmx5IHN1cHBvcnQgb25lIFNQVSBldmVudCBvbiBvbmUgU1BVIHBlciBub2RlLgorCQkgKi8KKwkJaWYgKGN0cl9lbmFibGVkICYgMSkgeworCQkJY2JlX3dyaXRlX2N0cihjcHUsIDAsIHJlc2V0X3ZhbHVlWzBdKTsKKwkJCWVuYWJsZV9jdHIoY3B1LCAwLCBwbV9yZWdzLnBtMDdfY250cmwpOworCQkJaW50ZXJydXB0X21hc2sgfD0KKwkJCQlDQkVfUE1fQ1RSX09WRVJGTE9XX0lOVFIoMCk7CisJCX0gZWxzZSB7CisJCQkvKiBEaXNhYmxlIGNvdW50ZXIgKi8KKwkJCWNiZV93cml0ZV9wbTA3X2NvbnRyb2woY3B1LCAwLCAwKTsKKwkJfQorCisJCWNiZV9nZXRfYW5kX2NsZWFyX3BtX2ludGVycnVwdHMoY3B1KTsKKwkJY2JlX2VuYWJsZV9wbV9pbnRlcnJ1cHRzKGNwdSwgaGR3X3RocmVhZCwgaW50ZXJydXB0X21hc2spOworCQljYmVfZW5hYmxlX3BtKGNwdSk7CisKKwkJLyogY2xlYXIgdGhlIHRyYWNlIGJ1ZmZlciAqLworCQljYmVfd3JpdGVfcG0oY3B1LCB0cmFjZV9hZGRyZXNzLCAwKTsKKwl9CisKKwkvKiBTdGFydCB0aGUgdGltZXIgdG8gdGltZSBzbGljZSBjb2xsZWN0aW5nIHRoZSBldmVudCBwcm9maWxlCisJICogb24gZWFjaCBvZiB0aGUgU1BVcy4gIE5vdGUsIGNhbiBjb2xsZWN0IHByb2ZpbGUgb24gb25lIFNQVQorCSAqIHBlciBub2RlIGF0IGEgdGltZS4KKwkgKi8KKwlzdGFydF9zcHVfZXZlbnRfc3dhcCgpOworCXN0YXJ0X3NwdV9wcm9maWxpbmdfZXZlbnRzKCk7CisJb3Byb2ZpbGVfcnVubmluZyA9IDE7CisJc21wX3dtYigpOworCisJcmV0dXJuIHJ0bjsKK30KKwogc3RhdGljIGludCBjZWxsX2dsb2JhbF9zdGFydF9wcHUoc3RydWN0IG9wX2NvdW50ZXJfY29uZmlnICpjdHIpCiB7CiAJdTMyIGNwdSwgaTsKQEAgLTk5NCw4ICsxNDIxLDcgQEAKIAkJCWlmIChjdHJfZW5hYmxlZCAmICgxIDw8IGkpKSB7CiAJCQkJY2JlX3dyaXRlX2N0cihjcHUsIGksIHJlc2V0X3ZhbHVlW2ldKTsKIAkJCQllbmFibGVfY3RyKGNwdSwgaSwgcG1fcmVncy5wbTA3X2NudHJsKTsKLQkJCQlpbnRlcnJ1cHRfbWFzayB8PQotCQkJCSAgICBDQkVfUE1fQ1RSX09WRVJGTE9XX0lOVFIoaSk7CisJCQkJaW50ZXJydXB0X21hc2sgfD0gQ0JFX1BNX0NUUl9PVkVSRkxPV19JTlRSKGkpOwogCQkJfSBlbHNlIHsKIAkJCQkvKiBEaXNhYmxlIGNvdW50ZXIgKi8KIAkJCQljYmVfd3JpdGVfcG0wN19jb250cm9sKGNwdSwgaSwgMCk7CkBAIC0xMDI0LDk5ICsxNDUwLDE2MiBAQAogCiBzdGF0aWMgaW50IGNlbGxfZ2xvYmFsX3N0YXJ0KHN0cnVjdCBvcF9jb3VudGVyX2NvbmZpZyAqY3RyKQogewotCWlmIChzcHVfY3ljbGVfcmVzZXQpCi0JCXJldHVybiBjZWxsX2dsb2JhbF9zdGFydF9zcHUoY3RyKTsKKwlpZiAocHJvZmlsaW5nX21vZGUgPT0gU1BVX1BST0ZJTElOR19DWUNMRVMpCisJCXJldHVybiBjZWxsX2dsb2JhbF9zdGFydF9zcHVfY3ljbGVzKGN0cik7CisJZWxzZSBpZiAocHJvZmlsaW5nX21vZGUgPT0gU1BVX1BST0ZJTElOR19FVkVOVFMpCisJCXJldHVybiBjZWxsX2dsb2JhbF9zdGFydF9zcHVfZXZlbnRzKGN0cik7CiAJZWxzZQogCQlyZXR1cm4gY2VsbF9nbG9iYWxfc3RhcnRfcHB1KGN0cik7CiB9CiAKLS8qCi0gKiBOb3RlIHRoZSBnZW5lcmljIE9Qcm9maWxlIHN0b3AgY2FsbHMgZG8gbm90IHN1cHBvcnQgcmV0dXJuaW5nCi0gKiBhbiBlcnJvciBvbiBzdG9wLiAgSGVuY2UsIHdpbGwgbm90IHJldHVybiBhbiBlcnJvciBpZiB0aGUgRlcKLSAqIGNhbGxzIGZhaWwgb24gc3RvcC4JRmFpbHVyZSB0byByZXNldCB0aGUgZGVidWcgYnVzIGlzIG5vdCBhbiBpc3N1ZS4KLSAqIEZhaWx1cmUgdG8gZGlzYWJsZSB0aGUgU1BVIHByb2ZpbGluZyBpcyBub3QgYW4gaXNzdWUuICBUaGUgRlcgY2FsbHMKLSAqIHRvIGVuYWJsZSB0aGUgcGVyZm9ybWFuY2UgY291bnRlcnMgYW5kIGRlYnVnIGJ1cyB3aWxsIHdvcmsgZXZlbiBpZgotICogdGhlIGhhcmR3YXJlIHdhcyBub3QgY2xlYW5seSByZXNldC4KKworLyogVGhlIFNQVSBpbnRlcnJ1cHQgaGFuZGxlcgorICoKKyAqIFNQVSBldmVudCBwcm9maWxpbmcgd29ya3MgYXMgZm9sbG93czoKKyAqIFRoZSBwbV9zaWduYWxbMF0gaG9sZHMgdGhlIG9uZSBTUFUgZXZlbnQgdG8gYmUgbWVhc3VyZWQuICBJdCBpcyByb3V0ZWQgb24KKyAqIHRoZSBkZWJ1ZyBidXMgdXNpbmcgd29yZCAwIG9yIDEuICBUaGUgdmFsdWUgb2YgcG1fc2lnbmFsWzFdIGFuZAorICogcG1fc2lnbmFsWzJdIGNvbnRhaW4gdGhlIG5lY2Vzc2FyeSBldmVudHMgdG8gcm91dGUgdGhlIFNQVSBwcm9ncmFtCisgKiBjb3VudGVyIGZvciB0aGUgc2VsZWN0ZWQgU1BVIG9udG8gdGhlIGRlYnVnIGJ1cyB1c2luZyB3b3JkcyAyIGFuZCAzLgorICogVGhlIHBtX2ludGVydmFsIHJlZ2lzdGVyIGlzIHNldHVwIHRvIHdyaXRlIHRoZSBTUFUgUEMgdmFsdWUgaW50byB0aGUKKyAqIHRyYWNlIGJ1ZmZlciBhdCB0aGUgbWF4aW11bSByYXRlIHBvc3NpYmxlLiAgVGhlIHRyYWNlIGJ1ZmZlciBpcyBjb25maWd1cmVkCisgKiB0byBzdG9yZSB0aGUgUENzLCB3cmFwcGluZyB3aGVuIGl0IGlzIGZ1bGwuICBUaGUgcGVyZm9ybWFuY2UgY291bnRlciBpcworICogaW50aWFsaXplZCB0byB0aGUgbWF4IGhhcmR3YXJlIGNvdW50IG1pbnVzIHRoZSBudW1iZXIgb2YgZXZlbnRzLCBOLCBiZXR3ZWVuCisgKiBzYW1wbGVzLiAgT25jZSB0aGUgTiBldmVudHMgaGF2ZSBvY2N1cmVkLCBhIEhXIGNvdW50ZXIgb3ZlcmZsb3cgb2NjdXJzCisgKiBjYXVzaW5nIHRoZSBnZW5lcmF0aW9uIG9mIGEgSFcgY291bnRlciBpbnRlcnJ1cHQgd2hpY2ggYWxzbyBzdG9wcyB0aGUKKyAqIHdyaXRpbmcgb2YgdGhlIFNQVSBQQyB2YWx1ZXMgdG8gdGhlIHRyYWNlIGJ1ZmZlci4gIEhlbmNlIHRoZSBsYXN0IFBDCisgKiB3cml0dGVuIHRvIHRoZSB0cmFjZSBidWZmZXIgaXMgdGhlIFNQVSBQQyB0aGF0IHdlIHdhbnQuICBVbmZvcnR1bmF0ZWx5LAorICogd2UgaGF2ZSB0byByZWFkIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgdHJhY2UgYnVmZmVyIHRvIGdldCB0byB0aGUKKyAqIGxhc3QgdmFsdWUgd3JpdHRlbi4gIFdlIGp1c3QgaG9wZSB0aGUgUFBVIGhhcyBub3RoaW5nIGJldHRlciB0byBkbyB0aGVuCisgKiBzZXJ2aWNlIHRoaXMgaW50ZXJydXB0LiBUaGUgUEMgZm9yIHRoZSBzcGVjaWZpYyBTUFUgYmVpbmcgcHJvZmlsZWQgaXMKKyAqIGV4dHJhY3RlZCBmcm9tIHRoZSB0cmFjZSBidWZmZXIgcHJvY2Vzc2VkIGFuZCBzdG9yZWQuICBUaGUgdHJhY2UgYnVmZmVyCisgKiBpcyBjbGVhcmVkLCBpbnRlcnJ1cHRzIGFyZSBjbGVhcmVkLCB0aGUgY291bnRlciBpcyByZXNldCB0byBtYXggLSBOLgorICogQSBrZXJuZWwgdGltZXIgaXMgdXNlZCB0byBwZXJpb2RpY2FsbHkgY2FsbCB0aGUgcm91dGluZSBzcHVfZXZudF9zd2FwKCkKKyAqIHRvIHN3aXRjaCB0byB0aGUgbmV4dCBwaHlzaWNhbCBTUFUgaW4gdGhlIG5vZGUgdG8gcHJvZmlsZSBpbiByb3VuZCByb2JiaW4KKyAqIG9yZGVyLiAgVGhpcyB3YXkgZGF0YSBpcyBjb2xsZWN0ZWQgZm9yIGFsbCBTUFVzIG9uIHRoZSBub2RlLiBJdCBkb2VzIG1lYW4KKyAqIHRoYXQgd2UgbmVlZCB0byB1c2UgYSByZWxhdGl2ZWx5IHNtYWxsIHZhbHVlIG9mIE4gdG8gZW5zdXJlIGVub3VnaCBzYW1wbGVzCisgKiBvbiBlYWNoIFNQVSBhcmUgY29sbGVjdGVkIGVhY2ggU1BVIGlzIGJlaW5nIHByb2ZpbGVkIDEvOCBvZiB0aGUgdGltZS4KKyAqIEl0IG1heSBhbHNvIGJlIG5lY2Vzc2FyeSB0byB1c2UgYSBsb25nZXIgc2FtcGxlIGNvbGxlY3Rpb24gcGVyaW9kLgogICovCi1zdGF0aWMgdm9pZCBjZWxsX2dsb2JhbF9zdG9wX3NwdSh2b2lkKQorc3RhdGljIHZvaWQgY2VsbF9oYW5kbGVfaW50ZXJydXB0X3NwdShzdHJ1Y3QgcHRfcmVncyAqcmVncywKKwkJCQkgICAgICBzdHJ1Y3Qgb3BfY291bnRlcl9jb25maWcgKmN0cikKIHsKLQlpbnQgc3ViZnVuYywgcnRuX3ZhbHVlOwotCXVuc2lnbmVkIGludCBsZnNyX3ZhbHVlOwotCWludCBjcHU7CisJdTMyIGNwdSwgY3B1X3RtcDsKKwl1NjQgdHJhY2VfZW50cnk7CisJdTMyIGludGVycnVwdF9tYXNrOworCXU2NCB0cmFjZV9idWZmZXJbMl07CisJdTY0IGxhc3RfdHJhY2VfYnVmZmVyOworCXUzMiBzYW1wbGU7CisJdTMyIHRyYWNlX2FkZHI7CisJdW5zaWduZWQgbG9uZyBzYW1wbGVfYXJyYXlfbG9ja19mbGFnczsKKwlpbnQgc3B1X251bTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0Jb3Byb2ZpbGVfcnVubmluZyA9IDA7CisJLyogTWFrZSBzdXJlIHNwdSBldmVudCBpbnRlcnJ1cHQgaGFuZGxlciBhbmQgc3B1IGV2ZW50IHN3YXAKKwkgKiBkb24ndCBhY2Nlc3MgdGhlIGNvdW50ZXJzIHNpbXVsdGFuZW91c2x5LgorCSAqLworCWNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY250cl9sb2NrLCBmbGFncyk7CiAKLSNpZmRlZiBDT05GSUdfQ1BVX0ZSRVEKLQljcHVmcmVxX3VucmVnaXN0ZXJfbm90aWZpZXIoJmNwdV9mcmVxX25vdGlmaWVyX2Jsb2NrLAotCQkJCSAgICBDUFVGUkVRX1RSQU5TSVRJT05fTk9USUZJRVIpOwotI2VuZGlmCisJY3B1X3RtcCA9IGNwdTsKKwljYmVfZGlzYWJsZV9wbShjcHUpOwogCi0JZm9yX2VhY2hfb25saW5lX2NwdShjcHUpIHsKLQkJaWYgKGNiZV9nZXRfaHdfdGhyZWFkX2lkKGNwdSkpCi0JCQljb250aW51ZTsKKwlpbnRlcnJ1cHRfbWFzayA9IGNiZV9nZXRfYW5kX2NsZWFyX3BtX2ludGVycnVwdHMoY3B1KTsKIAotCQlzdWJmdW5jID0gMzsJLyoKLQkJCQkgKiAyIC0gYWN0aXZhdGUgU1BVIHRyYWNpbmcsCi0JCQkJICogMyAtIGRlYWN0aXZhdGUKLQkJCQkgKi8KLQkJbGZzcl92YWx1ZSA9IDB4OGYxMDAwMDA7CisJc2FtcGxlID0gMHhBQkNERUY7CisJdHJhY2VfZW50cnkgPSAweGZlZGNiYTsKKwlsYXN0X3RyYWNlX2J1ZmZlciA9IDB4ZGVhZGJlYWY7CiAKLQkJcnRuX3ZhbHVlID0gcnRhc19jYWxsKHNwdV9ydGFzX3Rva2VuLCAzLCAxLCBOVUxMLAotCQkJCSAgICAgIHN1YmZ1bmMsIGNiZV9jcHVfdG9fbm9kZShjcHUpLAotCQkJCSAgICAgIGxmc3JfdmFsdWUpOworCWlmICgob3Byb2ZpbGVfcnVubmluZyA9PSAxKSAmJiAoaW50ZXJydXB0X21hc2sgIT0gMCkpIHsKKwkJLyogZGlzYWJsZSB3cml0ZXMgdG8gdHJhY2UgYnVmZiAqLworCQljYmVfd3JpdGVfcG0oY3B1LCBwbV9pbnRlcnZhbCwgMCk7CiAKLQkJaWYgKHVubGlrZWx5KHJ0bl92YWx1ZSAhPSAwKSkgewotCQkJcHJpbnRrKEtFUk5fRVJSCi0JCQkgICAgICAgIiVzOiBydGFzIGNhbGwgaWJtLGNiZS1zcHUtcGVyZnRvb2xzIGZhaWxlZCwgcmV0dXJuID0gJWRcbiIsCi0JCQkgICAgICAgX19mdW5jX18sIHJ0bl92YWx1ZSk7CisJCS8qIG9ubHkgaGF2ZSBvbmUgcGVyZiBjbnRyIGJlaW5nIHVzZWQsIGNudHIgMCAqLworCQlpZiAoKGludGVycnVwdF9tYXNrICYgQ0JFX1BNX0NUUl9PVkVSRkxPV19JTlRSKDApKQorCQkgICAgJiYgY3RyWzBdLmVuYWJsZWQpCisJCQkvKiBUaGUgU1BVIFBDIHZhbHVlcyB3aWxsIGJlIHJlYWQKKwkJCSAqIGZyb20gdGhlIHRyYWNlIGJ1ZmZlciwgcmVzZXQgY291bnRlcgorCQkJICovCisKKwkJCWNiZV93cml0ZV9jdHIoY3B1LCAwLCByZXNldF92YWx1ZVswXSk7CisKKwkJdHJhY2VfYWRkciA9IGNiZV9yZWFkX3BtKGNwdSwgdHJhY2VfYWRkcmVzcyk7CisKKwkJd2hpbGUgKCEodHJhY2VfYWRkciAmIENCRV9QTV9UUkFDRV9CVUZfRU1QVFkpKSB7CisJCQkvKiBUaGVyZSBpcyBkYXRhIGluIHRoZSB0cmFjZSBidWZmZXIgdG8gcHJvY2VzcworCQkJICogUmVhZCB0aGUgYnVmZmVyIHVudGlsIHlvdSBnZXQgdG8gdGhlIGxhc3QKKwkJCSAqIGVudHJ5LiAgVGhpcyBpcyB0aGUgdmFsdWUgd2Ugd2FudC4KKwkJCSAqLworCisJCQljYmVfcmVhZF90cmFjZV9idWZmZXIoY3B1LCB0cmFjZV9idWZmZXIpOworCQkJdHJhY2VfYWRkciA9IGNiZV9yZWFkX3BtKGNwdSwgdHJhY2VfYWRkcmVzcyk7CiAJCX0KIAotCQkvKiBEZWFjdGl2YXRlIHRoZSBzaWduYWxzICovCi0JCXBtX3J0YXNfcmVzZXRfc2lnbmFscyhjYmVfY3B1X3RvX25vZGUoY3B1KSk7CisJCS8qIFNQVSBBZGRyZXNzIDE2IGJpdCBjb3VudCBmb3JtYXQgZm9yIDEyOCBiaXQKKwkJICogSFcgdHJhY2UgYnVmZmVyIGlzIHVzZWQgZm9yIHRoZSBTUFUgUEMgc3RvcmFnZQorCQkgKiAgICBIRFIgYml0cyAgICAgICAgICAwOjE1CisJCSAqICAgIFNQVSBBZGRyIDAgYml0cyAgIDE2OjMxCisJCSAqICAgIFNQVSBBZGRyIDEgYml0cyAgIDMyOjQ3CisJCSAqICAgIHVudXNlZCBiaXRzICAgICAgIDQ4OjEyNworCQkgKgorCQkgKiBIRFI6IGJpdDQgPSAxIFNQVSBBZGRyZXNzIDAgdmFsaWQKKwkJICogSERSOiBiaXQ1ID0gMSBTUFUgQWRkcmVzcyAxIHZhbGlkCisJCSAqICAtIHVuZm9ydHVuYXRlbHksIHRoZSB2YWxpZCBiaXRzIGRvbid0IHNlZW0gdG8gd29yaworCQkgKgorCQkgKiBOb3RlIHRyYWNlX2J1ZmZlclswXSBob2xkcyBiaXRzIDA6NjMgb2YgdGhlIEhXCisJCSAqIHRyYWNlIGJ1ZmZlciwgdHJhY2VfYnVmZmVyWzFdIGhvbGRzIGJpdHMgNjQ6MTI3CisJCSAqLworCisJCXRyYWNlX2VudHJ5ID0gdHJhY2VfYnVmZmVyWzBdCisJCQkmIDB4MDAwMDAwMDBGRkZGMDAwMDsKKworCQkvKiBvbmx5IHRvcCAxNiBvZiB0aGUgMTggYml0IFNQVSBQQyBhZGRyZXNzCisJCSAqIGlzIHN0b3JlZCBpbiB0cmFjZSBidWZmZXIsIGhlbmNlIHNoaWZ0IHJpZ2h0CisJCSAqIGJ5IDE2IC0yIGJpdHMgKi8KKwkJc2FtcGxlID0gdHJhY2VfZW50cnkgPj4gMTQ7CisJCWxhc3RfdHJhY2VfYnVmZmVyID0gdHJhY2VfYnVmZmVyWzBdOworCisJCXNwdV9udW0gPSBzcHVfZXZudF9waHlzX3NwdV9pbmR4CisJCQkrIChjYmVfY3B1X3RvX25vZGUoY3B1KSAqIE5VTV9TUFVTX1BFUl9OT0RFKTsKKworCQkvKiBtYWtlIHN1cmUgb25seSBvbmUgcHJvY2VzcyBhdCBhIHRpbWUgaXMgY2FsbGluZworCQkgKiBzcHVfc3luY19idWZmZXIoKQorCQkgKi8KKwkJc3Bpbl9sb2NrX2lycXNhdmUoJm9wcm9mX3NwdV9zbXBsX2FycnlfbGNrLAorCQkJCSAgc2FtcGxlX2FycmF5X2xvY2tfZmxhZ3MpOworCQlzcHVfc3luY19idWZmZXIoc3B1X251bSwgJnNhbXBsZSwgMSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm9wcm9mX3NwdV9zbXBsX2FycnlfbGNrLAorCQkJCSAgICAgICBzYW1wbGVfYXJyYXlfbG9ja19mbGFncyk7CisKKwkJc21wX3dtYigpOyAgICAvKiBpbnN1cmUgc3B1IGV2ZW50IGJ1ZmZlciB1cGRhdGVzIGFyZSB3cml0dGVuCisJCQkgICAgICAgKiBkb24ndCB3YW50IGV2ZW50cyBpbnRlcm1pbmdsZWQuLi4gKi8KKworCQkvKiBUaGUgY291bnRlcnMgd2VyZSBmcm96ZW4gYnkgdGhlIGludGVycnVwdC4KKwkJICogUmVlbmFibGUgdGhlIGludGVycnVwdCBhbmQgcmVzdGFydCB0aGUgY291bnRlcnMuCisJCSAqLworCQljYmVfd3JpdGVfcG0oY3B1LCBwbV9pbnRlcnZhbCwgTlVNX0lOVEVSVkFMX0NZQyk7CisJCWNiZV9lbmFibGVfcG1faW50ZXJydXB0cyhjcHUsIGhkd190aHJlYWQsCisJCQkJCSB2aXJ0X2NudHJfaW50ZXJfbWFzayk7CisKKwkJLyogY2xlYXIgdGhlIHRyYWNlIGJ1ZmZlciwgcmUtZW5hYmxlIHdyaXRlcyB0byB0cmFjZSBidWZmICovCisJCWNiZV93cml0ZV9wbShjcHUsIHRyYWNlX2FkZHJlc3MsIDApOworCQljYmVfd3JpdGVfcG0oY3B1LCBwbV9pbnRlcnZhbCwgTlVNX0lOVEVSVkFMX0NZQyk7CisKKwkJLyogVGhlIHdyaXRlcyB0byB0aGUgdmFyaW91cyBwZXJmb3JtYW5jZSBjb3VudGVycyBvbmx5IHdyaXRlcworCQkgKiB0byBhIGxhdGNoLiAgVGhlIG5ldyB2YWx1ZXMgKGludGVycnVwdCBzZXR0aW5nIGJpdHMsIHJlc2V0CisJCSAqIGNvdW50ZXIgdmFsdWUgZXRjLikgYXJlIG5vdCBjb3BpZWQgdG8gdGhlIGFjdHVhbCByZWdpc3RlcnMKKwkJICogdW50aWwgdGhlIHBlcmZvcm1hbmNlIG1vbml0b3IgaXMgZW5hYmxlZC4gIEluIG9yZGVyIHRvIGdldAorCQkgKiB0aGlzIHRvIHdvcmsgYXMgZGVzaXJlZCwgdGhlIHBlcm1vcm1hbmNlIG1vbml0b3IgbmVlZHMgdG8KKwkJICogYmUgZGlzYWJsZWQgd2hpbGUgd3JpdGluZyB0byB0aGUgbGF0Y2hlcy4gIFRoaXMgaXMgYQorCQkgKiBIVyBkZXNpZ24gaXNzdWUuCisJCSAqLworCQl3cml0ZV9wbV9jbnRybChjcHUpOworCQljYmVfZW5hYmxlX3BtKGNwdSk7CiAJfQotCi0Jc3RvcF9zcHVfcHJvZmlsaW5nKCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY250cl9sb2NrLCBmbGFncyk7CiB9CiAKLXN0YXRpYyB2b2lkIGNlbGxfZ2xvYmFsX3N0b3BfcHB1KHZvaWQpCi17Ci0JaW50IGNwdTsKLQotCS8qCi0JICogVGhpcyByb3V0aW5lIHdpbGwgYmUgY2FsbGVkIG9uY2UgZm9yIHRoZSBzeXN0ZW0uCi0JICogVGhlcmUgaXMgb25lIHBlcmZvcm1hbmNlIG1vbml0b3IgcGVyIG5vZGUsIHNvIHdlCi0JICogb25seSBuZWVkIHRvIHBlcmZvcm0gdGhpcyBmdW5jdGlvbiBvbmNlIHBlciBub2RlLgotCSAqLwotCWRlbF90aW1lcl9zeW5jKCZ0aW1lcl92aXJ0X2NudHIpOwotCW9wcm9maWxlX3J1bm5pbmcgPSAwOwotCXNtcF93bWIoKTsKLQotCWZvcl9lYWNoX29ubGluZV9jcHUoY3B1KSB7Ci0JCWlmIChjYmVfZ2V0X2h3X3RocmVhZF9pZChjcHUpKQotCQkJY29udGludWU7Ci0KLQkJY2JlX3N5bmNfaXJxKGNiZV9jcHVfdG9fbm9kZShjcHUpKTsKLQkJLyogU3RvcCB0aGUgY291bnRlcnMgKi8KLQkJY2JlX2Rpc2FibGVfcG0oY3B1KTsKLQotCQkvKiBEZWFjdGl2YXRlIHRoZSBzaWduYWxzICovCi0JCXBtX3J0YXNfcmVzZXRfc2lnbmFscyhjYmVfY3B1X3RvX25vZGUoY3B1KSk7Ci0KLQkJLyogRGVhY3RpdmF0ZSBpbnRlcnJ1cHRzICovCi0JCWNiZV9kaXNhYmxlX3BtX2ludGVycnVwdHMoY3B1KTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIGNlbGxfZ2xvYmFsX3N0b3Aodm9pZCkKLXsKLQlpZiAoc3B1X2N5Y2xlX3Jlc2V0KQotCQljZWxsX2dsb2JhbF9zdG9wX3NwdSgpOwotCWVsc2UKLQkJY2VsbF9nbG9iYWxfc3RvcF9wcHUoKTsKLX0KLQotc3RhdGljIHZvaWQgY2VsbF9oYW5kbGVfaW50ZXJydXB0KHN0cnVjdCBwdF9yZWdzICpyZWdzLAotCQkJCXN0cnVjdCBvcF9jb3VudGVyX2NvbmZpZyAqY3RyKQorc3RhdGljIHZvaWQgY2VsbF9oYW5kbGVfaW50ZXJydXB0X3BwdShzdHJ1Y3QgcHRfcmVncyAqcmVncywKKwkJCQkgICAgICBzdHJ1Y3Qgb3BfY291bnRlcl9jb25maWcgKmN0cikKIHsKIAl1MzIgY3B1OwogCXU2NCBwYzsKQEAgLTExMzIsNyArMTYyMSw3IEBACiAJICogcm91dGluZSBhcmUgbm90IHJ1bm5pbmcgYXQgdGhlIHNhbWUgdGltZS4gU2VlIHRoZQogCSAqIGNlbGxfdmlydHVhbF9jbnRyKCkgcm91dGluZSBmb3IgYWRkaXRpb25hbCBjb21tZW50cy4KIAkgKi8KLQlzcGluX2xvY2tfaXJxc2F2ZSgmdmlydF9jbnRyX2xvY2ssIGZsYWdzKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY250cl9sb2NrLCBmbGFncyk7CiAKIAkvKgogCSAqIE5lZWQgdG8gZGlzYWJsZSBhbmQgcmVlbmFibGUgdGhlIHBlcmZvcm1hbmNlIGNvdW50ZXJzCkBAIC0xMTg1LDcgKzE2NzQsMTYgQEAKIAkJICovCiAJCWNiZV9lbmFibGVfcG0oY3B1KTsKIAl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdmlydF9jbnRyX2xvY2ssIGZsYWdzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjbnRyX2xvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgY2VsbF9oYW5kbGVfaW50ZXJydXB0KHN0cnVjdCBwdF9yZWdzICpyZWdzLAorCQkJCSAgc3RydWN0IG9wX2NvdW50ZXJfY29uZmlnICpjdHIpCit7CisJaWYgKHByb2ZpbGluZ19tb2RlID09IFBQVV9QUk9GSUxJTkcpCisJCWNlbGxfaGFuZGxlX2ludGVycnVwdF9wcHUocmVncywgY3RyKTsKKwllbHNlCisJCWNlbGxfaGFuZGxlX2ludGVycnVwdF9zcHUocmVncywgY3RyKTsKIH0KIAogLyoKQEAgLTExOTUsNyArMTY5Myw4IEBACiAgKi8KIHN0YXRpYyBpbnQgY2VsbF9zeW5jX3N0YXJ0KHZvaWQpCiB7Ci0JaWYgKHNwdV9jeWNsZV9yZXNldCkKKwlpZiAoKHByb2ZpbGluZ19tb2RlID09IFNQVV9QUk9GSUxJTkdfQ1lDTEVTKSB8fAorCSAgICAocHJvZmlsaW5nX21vZGUgPT0gU1BVX1BST0ZJTElOR19FVkVOVFMpKQogCQlyZXR1cm4gc3B1X3N5bmNfc3RhcnQoKTsKIAllbHNlCiAJCXJldHVybiBET19HRU5FUklDX1NZTkM7CkBAIC0xMjAzLDcgKzE3MDIsOCBAQAogCiBzdGF0aWMgaW50IGNlbGxfc3luY19zdG9wKHZvaWQpCiB7Ci0JaWYgKHNwdV9jeWNsZV9yZXNldCkKKwlpZiAoKHByb2ZpbGluZ19tb2RlID09IFNQVV9QUk9GSUxJTkdfQ1lDTEVTKSB8fAorCSAgICAocHJvZmlsaW5nX21vZGUgPT0gU1BVX1BST0ZJTElOR19FVkVOVFMpKQogCQlyZXR1cm4gc3B1X3N5bmNfc3RvcCgpOwogCWVsc2UKIAkJcmV0dXJuIDE7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvb3Byb2ZpbGUvb3BfbW9kZWxfcGE2dC5jIGIvYXJjaC9wb3dlcnBjL29wcm9maWxlL29wX21vZGVsX3BhNnQuYwppbmRleCBjNDBkZTQ2Li40MmY3NzhkIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvb3Byb2ZpbGUvb3BfbW9kZWxfcGE2dC5jCisrKyBiL2FyY2gvcG93ZXJwYy9vcHJvZmlsZS9vcF9tb2RlbF9wYTZ0LmMKQEAgLTEzMiw3ICsxMzIsNyBAQAogCWZvciAocG1jID0gMDsgcG1jIDwgY3VyX2NwdV9zcGVjLT5udW1fcG1jczsgcG1jKyspIHsKIAkJLyogY291bnRlcnMgYXJlIDQwIGJpdC4gTW92ZSB0byBjcHV0YWJsZSBhdCBzb21lIHBvaW50PyAqLwogCQlyZXNldF92YWx1ZVtwbWNdID0gKDB4MVVMIDw8IDM5KSAtIGN0cltwbWNdLmNvdW50OwotCQlwcl9kZWJ1ZygicmVzZXRfdmFsdWUgZm9yIHBtYyV1IGluaXRlZCB0byAweCVseFxuIiwKKwkJcHJfZGVidWcoInJlc2V0X3ZhbHVlIGZvciBwbWMldSBpbml0ZWQgdG8gMHglbGx4XG4iLAogCQkJCSBwbWMsIHJlc2V0X3ZhbHVlW3BtY10pOwogCX0KIApAQCAtMTc3LDcgKzE3Nyw3IEBACiAKIAlvcHJvZmlsZV9ydW5uaW5nID0gMTsKIAotCXByX2RlYnVnKCJzdGFydCBvbiBjcHUgJWQsIG1tY3IwICVseFxuIiwgc21wX3Byb2Nlc3Nvcl9pZCgpLCBtbWNyMCk7CisJcHJfZGVidWcoInN0YXJ0IG9uIGNwdSAlZCwgbW1jcjAgJWxseFxuIiwgc21wX3Byb2Nlc3Nvcl9pZCgpLCBtbWNyMCk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTE5Myw3ICsxOTMsNyBAQAogCiAJb3Byb2ZpbGVfcnVubmluZyA9IDA7CiAKLQlwcl9kZWJ1Zygic3RvcCBvbiBjcHUgJWQsIG1tY3IwICVseFxuIiwgc21wX3Byb2Nlc3Nvcl9pZCgpLCBtbWNyMCk7CisJcHJfZGVidWcoInN0b3Agb24gY3B1ICVkLCBtbWNyMCAlbGx4XG4iLCBzbXBfcHJvY2Vzc29yX2lkKCksIG1tY3IwKTsKIH0KIAogLyogaGFuZGxlIHRoZSBwZXJmbW9uIG92ZXJmbG93IHZlY3RvciAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy81MTJ4L2Nsb2NrLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzUxMngvY2xvY2suYwppbmRleCBmNDE2MDE0Li4xYmNmZjk0IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzUxMngvY2xvY2suYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzUxMngvY2xvY2suYwpAQCAtNTYsMTIgKzU2LDEyIEBACiAJaW50IGRldl9tYXRjaCA9IDA7CiAJaW50IGlkX21hdGNoID0gMDsKIAotCWlmIChkZXYgPT0gTlVMTCAmJiBpZCA9PSBOVUxMKQorCWlmIChkZXYgPT0gTlVMTCB8fCBpZCA9PSBOVUxMKQogCQlyZXR1cm4gTlVMTDsKIAogCW11dGV4X2xvY2soJmNsb2Nrc19tdXRleCk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeShwLCAmY2xvY2tzLCBub2RlKSB7Ci0JCWlmIChkZXYgJiYgZGV2ID09IHAtPmRldikKKwkJaWYgKGRldiA9PSBwLT5kZXYpCiAJCQlkZXZfbWF0Y2grKzsKIAkJaWYgKHN0cmNtcChpZCwgcC0+bmFtZSkgPT0gMCkKIAkJCWlkX21hdGNoKys7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzUyeHgvbXBjNTJ4eF9jb21tb24uYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTJ4eC9tcGM1Mnh4X2NvbW1vbi5jCmluZGV4IGFlN2MzNGYuLjk4MzY3YTAgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTJ4eC9tcGM1Mnh4X2NvbW1vbi5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTJ4eC9tcGM1Mnh4X2NvbW1vbi5jCkBAIC00Miw3ICs0Miw3IEBACiAgKiBmcm9tIGludGVycnVwdCBjb250ZXh0IHdoaWxlIG5vZGUgbWFwcGluZyAod2hpY2ggY2FsbHMgaW9yZW1hcCgpKQogICogY2Fubm90IGJlIHVzZWQgYXQgc3VjaCBwb2ludC4KICAqLwotc3RhdGljIHNwaW5sb2NrX3QgbXBjNTJ4eF9sb2NrID0gU1BJTl9MT0NLX1VOTE9DS0VEOworc3RhdGljIERFRklORV9TUElOTE9DSyhtcGM1Mnh4X2xvY2spOwogc3RhdGljIHN0cnVjdCBtcGM1Mnh4X2dwdCBfX2lvbWVtICptcGM1Mnh4X3dkdDsKIHN0YXRpYyBzdHJ1Y3QgbXBjNTJ4eF9jZG0gX19pb21lbSAqbXBjNTJ4eF9jZG07CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTJ4eC9tcGM1Mnh4X2dwaW8uYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTJ4eC9tcGM1Mnh4X2dwaW8uYwppbmRleCA4YTQ1NWViLi4wN2Y4OWFlIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzUyeHgvbXBjNTJ4eF9ncGlvLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy81Mnh4L21wYzUyeHhfZ3Bpby5jCkBAIC0zNjMsMTEgKzM2Myw4IEBACiB7CiAJc3RydWN0IG9mX21tX2dwaW9fY2hpcCAqbW1fZ2MgPSB0b19vZl9tbV9ncGlvX2NoaXAoZ2MpOwogCXN0cnVjdCBtcGM1Mnh4X2dwdCBfX2lvbWVtICpyZWdzID0gbW1fZ2MtPnJlZ3M7Ci0JdW5zaWduZWQgaW50IHJldDsKIAogCXJldHVybiAoaW5fYmUzMigmcmVncy0+c3RhdHVzKSAmICgxIDw8ICgzMSAtIDIzKSkpID8gMSA6IDA7Ci0KLQlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgdm9pZApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy81Mnh4L21wYzUyeHhfcGljLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzUyeHgvbXBjNTJ4eF9waWMuYwppbmRleCA3Mjg2NWU4Li4wYTA5M2YwIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzUyeHgvbXBjNTJ4eF9waWMuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzUyeHgvbXBjNTJ4eF9waWMuYwpAQCAtMTk2LDYgKzE5Niw3IEBACiAKIHN0YXRpYyBpbnQgbXBjNTJ4eF9leHRpcnFfc2V0X3R5cGUodW5zaWduZWQgaW50IHZpcnEsIHVuc2lnbmVkIGludCBmbG93X3R5cGUpCiB7CisJc3RydWN0IGlycV9kZXNjICpkZXNjID0gZ2V0X2lycV9kZXNjKHZpcnEpOwogCXUzMiBjdHJsX3JlZywgdHlwZTsKIAlpbnQgaXJxOwogCWludCBsMmlycTsKQEAgLTIyMiw2ICsyMjMsMTEgQEAKIAkJdHlwZSA9IDA7CiAJfQogCisJZGVzYy0+c3RhdHVzICY9IH4oSVJRX1RZUEVfU0VOU0VfTUFTSyB8IElSUV9MRVZFTCk7CisJZGVzYy0+c3RhdHVzIHw9IGZsb3dfdHlwZSAmIElSUV9UWVBFX1NFTlNFX01BU0s7CisJaWYgKGZsb3dfdHlwZSAmIChJUlFfVFlQRV9MRVZFTF9ISUdIIHwgSVJRX1RZUEVfTEVWRUxfTE9XKSkKKwkJZGVzYy0+c3RhdHVzIHw9IElSUV9MRVZFTDsKKwogCWN0cmxfcmVnID0gaW5fYmUzMigmaW50ci0+Y3RybCk7CiAJY3RybF9yZWcgJj0gfigweDMgPDwgKDIyIC0gKGwyaXJxICogMikpKTsKIAljdHJsX3JlZyB8PSAodHlwZSA8PCAoMjIgLSAobDJpcnEgKiAyKSkpOwpAQCAtMjMxLDcgKzIzNyw3IEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgbXBjNTJ4eF9leHRpcnFfaXJxY2hpcCA9IHsKLQkudHlwZW5hbWUgPSAiIE1QQzUyeHggSVJRWzAtM10gIiwKKwkudHlwZW5hbWUgPSAiTVBDNTJ4eCBFeHRlcm5hbCIsCiAJLm1hc2sgPSBtcGM1Mnh4X2V4dGlycV9tYXNrLAogCS51bm1hc2sgPSBtcGM1Mnh4X2V4dGlycV91bm1hc2ssCiAJLmFjayA9IG1wYzUyeHhfZXh0aXJxX2FjaywKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9NYWtlZmlsZSBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9NYWtlZmlsZQppbmRleCBiYTUwMjhlLi4wNTE3NzdjIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvTWFrZWZpbGUKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L01ha2VmaWxlCkBAIC0zLDYgKzMsNyBAQAogIwogb2JqLXkJCQkJOj0gbWlzYy5vIHVzYi5vCiBvYmotJChDT05GSUdfU1VTUEVORCkJCSs9IHN1c3BlbmQubyBzdXNwZW5kLWFzbS5vCitvYmotJChDT05GSUdfTUNVX01QQzgzNDlFTUlUWCkJKz0gbWN1X21wYzgzNDllbWl0eC5vCiBvYmotJChDT05GSUdfTVBDODMxeF9SREIpCSs9IG1wYzgzMXhfcmRiLm8KIG9iai0kKENPTkZJR19NUEM4MzJ4X1JEQikJKz0gbXBjODMyeF9yZGIubwogb2JqLSQoQ09ORklHX01QQzgzNHhfTURTKQkrPSBtcGM4MzR4X21kcy5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9jaGlwcy9tY3VfbXBjODM0OWVtaXR4LmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvbWN1X21wYzgzNDllbWl0eC5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL2kyYy9jaGlwcy9tY3VfbXBjODM0OWVtaXR4LmMKcmVuYW1lIHRvIGFyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9tY3VfbXBjODM0OWVtaXR4LmMKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9tcGM4MzF4X3JkYi5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L21wYzgzMXhfcmRiLmMKaW5kZXggYTQyOGY4ZC4uNTE3N2JkZCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L21wYzgzMXhfcmRiLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L21wYzgzMXhfcmRiLmMKQEAgLTQyLDcgKzQyLDcgQEAKIAltcGM4MzF4X3VzYl9jZmcoKTsKIH0KIAotdm9pZCBfX2luaXQgbXBjODMxeF9yZGJfaW5pdF9JUlEodm9pZCkKK3N0YXRpYyB2b2lkIF9faW5pdCBtcGM4MzF4X3JkYl9pbml0X0lSUSh2b2lkKQogewogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9tcGM4MzJ4X21kcy5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L21wYzgzMnhfbWRzLmMKaW5kZXggZWM0MzQ3Ny4uZWMwYjQwMWIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9tcGM4MzJ4X21kcy5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9tcGM4MzJ4X21kcy5jCkBAIC00OSw4ICs0OSw2IEBACiAjZGVmaW5lIERCRyhmbXQuLi4pCiAjZW5kaWYKIAotc3RhdGljIHU4ICpiY3NyX3JlZ3MgPSBOVUxMOwotCiAvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBTZXR1cCB0aGUgYXJjaGl0ZWN0dXJlCkBAIC01OSwxMyArNTcsMTQgQEAKIHN0YXRpYyB2b2lkIF9faW5pdCBtcGM4MzJ4X3N5c19zZXR1cF9hcmNoKHZvaWQpCiB7CiAJc3RydWN0IGRldmljZV9ub2RlICpucDsKKwl1OCBfX2lvbWVtICpiY3NyX3JlZ3MgPSBOVUxMOwogCiAJaWYgKHBwY19tZC5wcm9ncmVzcykKIAkJcHBjX21kLnByb2dyZXNzKCJtcGM4MzJ4X3N5c19zZXR1cF9hcmNoKCkiLCAwKTsKIAogCS8qIE1hcCBCQ1NSIGFyZWEgKi8KIAlucCA9IG9mX2ZpbmRfbm9kZV9ieV9uYW1lKE5VTEwsICJiY3NyIik7Ci0JaWYgKG5wICE9IDApIHsKKwlpZiAobnApIHsKIAkJc3RydWN0IHJlc291cmNlIHJlczsKIAogCQlvZl9hZGRyZXNzX3RvX3Jlc291cmNlKG5wLCAwLCAmcmVzKTsKQEAgLTkzLDkgKzkyLDkgQEAKIAkJCSE9IE5VTEwpewogCQkvKiBSZXNldCB0aGUgRXRoZXJuZXQgUEhZcyAqLwogI2RlZmluZSBCQ1NSOF9GRVRIX1JTVCAweDUwCi0JCWJjc3JfcmVnc1s4XSAmPSB+QkNTUjhfRkVUSF9SU1Q7CisJCWNscmJpdHM4KCZiY3NyX3JlZ3NbOF0sIEJDU1I4X0ZFVEhfUlNUKTsKIAkJdWRlbGF5KDEwMDApOwotCQliY3NyX3JlZ3NbOF0gfD0gQkNTUjhfRkVUSF9SU1Q7CisJCXNldGJpdHM4KCZiY3NyX3JlZ3NbOF0sIEJDU1I4X0ZFVEhfUlNUKTsKIAkJaW91bm1hcChiY3NyX3JlZ3MpOwogCQlvZl9ub2RlX3B1dChucCk7CiAJfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L21wYzgzMnhfcmRiLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvbXBjODMyeF9yZGIuYwppbmRleCAwMzAwMjY4Li4yYTEyOTVmIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvbXBjODMyeF9yZGIuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvbXBjODMyeF9yZGIuYwpAQCAtMzgsNiArMzgsNyBAQAogI2RlZmluZSBEQkcoZm10Li4uKQogI2VuZGlmCiAKKyNpZmRlZiBDT05GSUdfUVVJQ0NfRU5HSU5FCiBzdGF0aWMgdm9pZCBtcGM4M3h4X3NwaV9hY3RpdmF0ZV9jcyh1OCBjcywgdTggcG9sYXJpdHkpCiB7CiAJcHJfZGVidWcoIiVzICVkICVkXG4iLCBfX2Z1bmNfXywgY3MsIHBvbGFyaXR5KTsKQEAgLTc3LDggKzc4LDggQEAKIAkJCSAgICBtcGM4M3h4X3NwaV9hY3RpdmF0ZV9jcywKIAkJCSAgICBtcGM4M3h4X3NwaV9kZWFjdGl2YXRlX2NzKTsKIH0KLQogbWFjaGluZV9kZXZpY2VfaW5pdGNhbGwobXBjODMyeF9yZGIsIG1wYzgzMnhfc3BpX2luaXQpOworI2VuZGlmIC8qIENPTkZJR19RVUlDQ19FTkdJTkUgKi8KIAogLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtMTMwLDcgKzEzMSw3IEBACiB9CiBtYWNoaW5lX2RldmljZV9pbml0Y2FsbChtcGM4MzJ4X3JkYiwgbXBjODMyeF9kZWNsYXJlX29mX3BsYXRmb3JtX2RldmljZXMpOwogCi12b2lkIF9faW5pdCBtcGM4MzJ4X3JkYl9pbml0X0lSUSh2b2lkKQorc3RhdGljIHZvaWQgX19pbml0IG1wYzgzMnhfcmRiX2luaXRfSVJRKHZvaWQpCiB7CiAKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L21wYzgzNnhfbWRzLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvbXBjODM2eF9tZHMuYwppbmRleCA5ZDQ2ZTViLi4wOWU5ZDZmIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvbXBjODM2eF9tZHMuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvbXBjODM2eF9tZHMuYwpAQCAtMTgsNiArMTgsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9yZWJvb3QuaD4KQEAgLTQzLDYgKzQ0LDcgQEAKICNpbmNsdWRlIDxhc20vdWRiZy5oPgogI2luY2x1ZGUgPHN5c2Rldi9mc2xfc29jLmg+CiAjaW5jbHVkZSA8c3lzZGV2L2ZzbF9wY2kuaD4KKyNpbmNsdWRlIDxzeXNkZXYvc2ltcGxlX2dwaW8uaD4KICNpbmNsdWRlIDxhc20vcWUuaD4KICNpbmNsdWRlIDxhc20vcWVfaWMuaD4KIApAQCAtNTUsOCArNTcsNiBAQAogI2RlZmluZSBEQkcoZm10Li4uKQogI2VuZGlmCiAKLXN0YXRpYyB1OCAqYmNzcl9yZWdzID0gTlVMTDsKLQogLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogU2V0dXAgdGhlIGFyY2hpdGVjdHVyZQpAQCAtNjUsMTMgKzY1LDE0IEBACiBzdGF0aWMgdm9pZCBfX2luaXQgbXBjODM2eF9tZHNfc2V0dXBfYXJjaCh2b2lkKQogewogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7CisJdTggX19pb21lbSAqYmNzcl9yZWdzID0gTlVMTDsKIAogCWlmIChwcGNfbWQucHJvZ3Jlc3MpCiAJCXBwY19tZC5wcm9ncmVzcygibXBjODM2eF9tZHNfc2V0dXBfYXJjaCgpIiwgMCk7CiAKIAkvKiBNYXAgQkNTUiBhcmVhICovCiAJbnAgPSBvZl9maW5kX25vZGVfYnlfbmFtZShOVUxMLCAiYmNzciIpOwotCWlmIChucCAhPSAwKSB7CisJaWYgKG5wKSB7CiAJCXN0cnVjdCByZXNvdXJjZSByZXM7CiAKIAkJb2ZfYWRkcmVzc190b19yZXNvdXJjZShucCwgMCwgJnJlcyk7CkBAIC05Myw2ICs5NCwxNiBAQAogCiAJCWZvciAobnAgPSBOVUxMOyAobnAgPSBvZl9maW5kX25vZGVfYnlfbmFtZShucCwgInVjYyIpKSAhPSBOVUxMOykKIAkJCXBhcl9pb19vZl9jb25maWcobnApOworI2lmZGVmIENPTkZJR19RRV9VU0IKKwkJLyogTXVzdCBmaXh1cCBQYXIgSU8gYmVmb3JlIFFFIEdQSU8gY2hpcHMgYXJlIHJlZ2lzdGVyZWQuICovCisJCXBhcl9pb19jb25maWdfcGluKDEsICAyLCAxLCAwLCAzLCAwKTsgLyogVVNCT0UgICovCisJCXBhcl9pb19jb25maWdfcGluKDEsICAzLCAxLCAwLCAzLCAwKTsgLyogVVNCVFAgICovCisJCXBhcl9pb19jb25maWdfcGluKDEsICA4LCAxLCAwLCAxLCAwKTsgLyogVVNCVE4gICovCisJCXBhcl9pb19jb25maWdfcGluKDEsIDEwLCAyLCAwLCAzLCAwKTsgLyogVVNCUlhEICovCisJCXBhcl9pb19jb25maWdfcGluKDEsICA5LCAyLCAxLCAzLCAwKTsgLyogVVNCUlAgICovCisJCXBhcl9pb19jb25maWdfcGluKDEsIDExLCAyLCAxLCAzLCAwKTsgLyogVVNCUk4gICovCisJCXBhcl9pb19jb25maWdfcGluKDIsIDIwLCAyLCAwLCAxLCAwKTsgLyogQ0xLMjEgICovCisjZW5kaWYgLyogQ09ORklHX1FFX1VTQiAqLwogCX0KIAogCWlmICgobnAgPSBvZl9maW5kX2NvbXBhdGlibGVfbm9kZShOVUxMLCAibmV0d29yayIsICJ1Y2NfZ2V0aCIpKQpAQCAtMTUxLDYgKzE2Miw3MCBAQAogfQogbWFjaGluZV9kZXZpY2VfaW5pdGNhbGwobXBjODM2eF9tZHMsIG1wYzgzNnhfZGVjbGFyZV9vZl9wbGF0Zm9ybV9kZXZpY2VzKTsKIAorI2lmZGVmIENPTkZJR19RRV9VU0IKK3N0YXRpYyBpbnQgX19pbml0IG1wYzgzNnhfdXNiX2NmZyh2b2lkKQoreworCXU4IF9faW9tZW0gKmJjc3I7CisJc3RydWN0IGRldmljZV9ub2RlICpucDsKKwljb25zdCBjaGFyICptb2RlOworCWludCByZXQgPSAwOworCisJbnAgPSBvZl9maW5kX2NvbXBhdGlibGVfbm9kZShOVUxMLCBOVUxMLCAiZnNsLG1wYzgzNjBtZHMtYmNzciIpOworCWlmICghbnApCisJCXJldHVybiAtRU5PREVWOworCisJYmNzciA9IG9mX2lvbWFwKG5wLCAwKTsKKwlvZl9ub2RlX3B1dChucCk7CisJaWYgKCFiY3NyKQorCQlyZXR1cm4gLUVOT01FTTsKKworCW5wID0gb2ZfZmluZF9jb21wYXRpYmxlX25vZGUoTlVMTCwgTlVMTCwgImZzbCxtcGM4MzIzLXFlLXVzYiIpOworCWlmICghbnApIHsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBlcnI7CisJfQorCisjZGVmaW5lIEJDU1I4X1RTRUMxTV9NQVNLCSgweDMgPDwgNikKKyNkZWZpbmUgQkNTUjhfVFNFQzFNX1JHTUlJCSgweDAgPDwgNikKKyNkZWZpbmUgQkNTUjhfVFNFQzJNX01BU0sJKDB4MyA8PCA0KQorI2RlZmluZSBCQ1NSOF9UU0VDMk1fUkdNSUkJKDB4MCA8PCA0KQorCS8qCisJICogRGVmYXVsdCBpcyBHTUlJICgyKSwgYnV0IHdlIHNob3VsZCBzZXQgaXQgdG8gUkdNSUkgKDApIGlmIHdlIHVzZQorCSAqIFVTQiAoRXRoIFBIWSBpcyBpbiBSR01JSSBtb2RlIGFueXdheSkuCisJICovCisJY2xyc2V0Yml0c184KCZiY3NyWzhdLCBCQ1NSOF9UU0VDMU1fTUFTSyB8IEJDU1I4X1RTRUMyTV9NQVNLLAorCQkJICAgICAgIEJDU1I4X1RTRUMxTV9SR01JSSB8IEJDU1I4X1RTRUMyTV9SR01JSSk7CisKKyNkZWZpbmUgQkNTUjEzX1VTQk1BU0sJMHgwZgorI2RlZmluZSBCQ1NSMTNfblVTQkVOCTB4MDggLyogMSAtIERpc2FibGUsIDAgLSBFbmFibGUJCQkqLworI2RlZmluZSBCQ1NSMTNfVVNCU1BFRUQJMHgwNCAvKiAxIC0gRnVsbCwgMCAtIExvdwkJCSovCisjZGVmaW5lIEJDU1IxM19VU0JNT0RFCTB4MDIgLyogMSAtIEhvc3QsIDAgLSBGdW5jdGlvbgkJCSovCisjZGVmaW5lIEJDU1IxM19uVVNCVkNDCTB4MDEgLyogMSAtIGdldHMgVkJVUywgMCAtIHN1cHBsaWVzIFZCVVMgCSovCisKKwljbHJzZXRiaXRzXzgoJmJjc3JbMTNdLCBCQ1NSMTNfVVNCTUFTSywgQkNTUjEzX1VTQlNQRUVEKTsKKworCW1vZGUgPSBvZl9nZXRfcHJvcGVydHkobnAsICJtb2RlIiwgTlVMTCk7CisJaWYgKG1vZGUgJiYgIXN0cmNtcChtb2RlLCAicGVyaXBoZXJhbCIpKSB7CisJCXNldGJpdHM4KCZiY3NyWzEzXSwgQkNTUjEzX25VU0JWQ0MpOworCQlxZV91c2JfY2xvY2tfc2V0KFFFX0NMSzIxLCA0ODAwMDAwMCk7CisJfSBlbHNlIHsKKwkJc2V0Yml0czgoJmJjc3JbMTNdLCBCQ1NSMTNfVVNCTU9ERSk7CisJCS8qCisJCSAqIFRoZSBCQ1NSIEdQSU9zIGFyZSB1c2VkIHRvIGNvbnRyb2wgcG93ZXIgYW5kCisJCSAqIHNwZWVkIG9mIHRoZSBVU0IgdHJhbnNjZWl2ZXIuIFRoaXMgaXMgbmVlZGVkIGZvcgorCQkgKiB0aGUgVVNCIEhvc3Qgb25seS4KKwkJICovCisJCXNpbXBsZV9ncGlvY2hpcF9pbml0KCJmc2wsbXBjODM2MG1kcy1iY3NyLWdwaW8iKTsKKwl9CisKKwlvZl9ub2RlX3B1dChucCk7CitlcnI6CisJaW91bm1hcChiY3NyKTsKKwlyZXR1cm4gcmV0OworfQorbWFjaGluZV9hcmNoX2luaXRjYWxsKG1wYzgzNnhfbWRzLCBtcGM4MzZ4X3VzYl9jZmcpOworI2VuZGlmIC8qIENPTkZJR19RRV9VU0IgKi8KKwogc3RhdGljIHZvaWQgX19pbml0IG1wYzgzNnhfbWRzX2luaXRfSVJRKHZvaWQpCiB7CiAJc3RydWN0IGRldmljZV9ub2RlICpucDsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9tcGM4MzZ4X3Jkay5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L21wYzgzNnhfcmRrLmMKaW5kZXggYTUyNzNiYi4uYjAwOTBhYSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L21wYzgzNnhfcmRrLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L21wYzgzNnhfcmRrLmMKQEAgLTUxLDggKzUxLDkgQEAKIAlmb3JfZWFjaF9jb21wYXRpYmxlX25vZGUobnAsICJwY2kiLCAiZnNsLG1wYzgzNDktcGNpIikKIAkJbXBjODN4eF9hZGRfYnJpZGdlKG5wKTsKICNlbmRpZgotCisjaWZkZWYgQ09ORklHX1FVSUNDX0VOR0lORQogCXFlX3Jlc2V0KCk7CisjZW5kaWYKIH0KIAogc3RhdGljIHZvaWQgX19pbml0IG1wYzgzNnhfcmRrX2luaXRfSVJRKHZvaWQpCkBAIC03MSwxMyArNzIsMTQgQEAKIAkgKi8KIAlpcGljX3NldF9kZWZhdWx0X3ByaW9yaXR5KCk7CiAJb2Zfbm9kZV9wdXQobnApOwotCisjaWZkZWYgQ09ORklHX1FVSUNDX0VOR0lORQogCW5wID0gb2ZfZmluZF9jb21wYXRpYmxlX25vZGUoTlVMTCwgTlVMTCwgImZzbCxxZS1pYyIpOwogCWlmICghbnApCiAJCXJldHVybjsKIAogCXFlX2ljX2luaXQobnAsIDAsIHFlX2ljX2Nhc2NhZGVfbG93X2lwaWMsIHFlX2ljX2Nhc2NhZGVfaGlnaF9pcGljKTsKIAlvZl9ub2RlX3B1dChucCk7CisjZW5kaWYKIH0KIAogLyoKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9tcGM4Mzd4X21kcy5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L21wYzgzN3hfbWRzLmMKaW5kZXggOGJiMTNjOC4uNTMwZWY5OSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L21wYzgzN3hfbWRzLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L21wYzgzN3hfbWRzLmMKQEAgLTI2LDcgKzI2LDYgQEAKICNkZWZpbmUgQkNTUjEyX1VTQl9TRVJfTUFTSwkweDhhCiAjZGVmaW5lIEJDU1IxMl9VU0JfU0VSX1BJTgkweDgwCiAjZGVmaW5lIEJDU1IxMl9VU0JfU0VSX0RFVklDRQkweDAyCi1leHRlcm4gaW50IG1wYzgzN3hfdXNiX2NmZyh2b2lkKTsKIAogc3RhdGljIGludCBtcGM4Mzd4bWRzX3VzYl9jZmcodm9pZCkKIHsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9tcGM4Mzd4X3JkYi5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L21wYzgzN3hfcmRiLmMKaW5kZXggZGEwMzBhZi4uMWQwOTY1NCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L21wYzgzN3hfcmRiLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L21wYzgzN3hfcmRiLmMKQEAgLTIxLDggKzIxLDYgQEAKIAogI2luY2x1ZGUgIm1wYzgzeHguaCIKIAotZXh0ZXJuIGludCBtcGM4Mzd4X3VzYl9jZmcodm9pZCk7Ci0KIC8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIFNldHVwIHRoZSBhcmNoaXRlY3R1cmUKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9tcGM4M3h4LmggYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvbXBjODN4eC5oCmluZGV4IDJhN2NiYWIuLjgzY2ZlNTEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9tcGM4M3h4LmgKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L21wYzgzeHguaApAQCAtNjEsNiArNjEsNyBAQAogCiBleHRlcm4gdm9pZCBtcGM4M3h4X3Jlc3RhcnQoY2hhciAqY21kKTsKIGV4dGVybiBsb25nIG1wYzgzeHhfdGltZV9pbml0KHZvaWQpOworZXh0ZXJuIGludCBtcGM4Mzd4X3VzYl9jZmcodm9pZCk7CiBleHRlcm4gaW50IG1wYzgzNHhfdXNiX2NmZyh2b2lkKTsKIGV4dGVybiBpbnQgbXBjODMxeF91c2JfY2ZnKHZvaWQpOwogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvbXBjODV4eF9kcy5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L21wYzg1eHhfZHMuYwppbmRleCBhODMwMWM4Li43MzI2ZDkwIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvbXBjODV4eF9kcy5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9tcGM4NXh4X2RzLmMKQEAgLTE0OCw2ICsxNDgsOSBAQAogLyoKICAqIFNldHVwIHRoZSBhcmNoaXRlY3R1cmUKICAqLworI2lmZGVmIENPTkZJR19TTVAKK2V4dGVybiB2b2lkIF9faW5pdCBtcGM4NXh4X3NtcF9pbml0KHZvaWQpOworI2VuZGlmCiBzdGF0aWMgdm9pZCBfX2luaXQgbXBjODV4eF9kc19zZXR1cF9hcmNoKHZvaWQpCiB7CiAjaWZkZWYgQ09ORklHX1BDSQpAQCAtMTczLDYgKzE3NiwxMCBAQAogCXBwY19tZC5wY2lfZXhjbHVkZV9kZXZpY2UgPSBtcGM4NXh4X2V4Y2x1ZGVfZGV2aWNlOwogI2VuZGlmCiAKKyNpZmRlZiBDT05GSUdfU01QCisJbXBjODV4eF9zbXBfaW5pdCgpOworI2VuZGlmCisKIAlwcmludGsoIk1QQzg1eHggRFMgYm9hcmQgZnJvbSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvclxuIik7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9zbXAuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9zbXAuYwppbmRleCBkNjUyYzcxLi43OWEwZGYxIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvc21wLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L3NtcC5jCkBAIC01OCw2ICs1OCw3IEBACiAKIAlpZiAoY3B1X3JlbF9hZGRyID09IE5VTEwpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJObyBjcHUtcmVsZWFzZS1hZGRyIGZvciBjcHUgJWRcbiIsIG5yKTsKKwkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogCQlyZXR1cm47CiAJfQogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL0tjb25maWcgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL0tjb25maWcKaW5kZXggNDdlOTU2Yy4uMjAwYjljYiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9LY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvS2NvbmZpZwpAQCAtMzEyLDQgKzMxMiwyNiBAQAogCSAgU2F5IFkgaGVyZSBpZiB5b3UncmUgZ29pbmcgdG8gdXNlIGhhcmR3YXJlIHRoYXQgY29ubmVjdHMgdG8gdGhlCiAJICBNUEM4MzF4LzgzNHgvODM3eC84NTcyLzg2MTAgR1BJT3MuCiAKK2NvbmZpZyBTSU1QTEVfR1BJTworCWJvb2wgIlN1cHBvcnQgZm9yIHNpbXBsZSwgbWVtb3J5LW1hcHBlZCBHUElPIGNvbnRyb2xsZXJzIgorCWRlcGVuZHMgb24gUFBDCisJc2VsZWN0IEdFTkVSSUNfR1BJTworCXNlbGVjdCBBUkNIX1JFUVVJUkVfR1BJT0xJQgorCWhlbHAKKwkgIFNheSBZIGhlcmUgdG8gc3VwcG9ydCBzaW1wbGUsIG1lbW9yeS1tYXBwZWQgR1BJTyBjb250cm9sbGVycy4KKwkgIFRoZXNlIGFyZSB1c3VhbGx5IEJDU1JzIHVzZWQgdG8gY29udHJvbCBib2FyZCdzIHN3aXRjaGVzLCBMRURzLAorCSAgY2hpcC1zZWxlY3RzLCBFdGhlcm5ldC9VU0IgUEhZJ3MgcG93ZXIgYW5kIHZhcmlvdXMgb3RoZXIgc21hbGwKKwkgIG9uLWJvYXJkIHBlcmlwaGVyYWxzLgorCitjb25maWcgTUNVX01QQzgzNDlFTUlUWAorCXRyaXN0YXRlICJNUEM4MzQ5RS1tSVRYIE1DVSBkcml2ZXIiCisJZGVwZW5kcyBvbiBJMkMgJiYgUFBDXzgzeHgKKwlzZWxlY3QgR0VORVJJQ19HUElPCisJc2VsZWN0IEFSQ0hfUkVRVUlSRV9HUElPTElCCisJaGVscAorCSAgU2F5IFkgaGVyZSB0byBlbmFibGUgc29mdCBwb3dlci1vZmYgZnVuY3Rpb25hbGl0eSBvbiB0aGUgRnJlZXNjYWxlCisJICBib2FyZHMgd2l0aCB0aGUgTVBDODM0OUUtbUlUWC1jb21wYXRpYmxlIE1DVSBjaGlwcy4gVGhpcyBkcml2ZXIgd2lsbAorCSAgYWxzbyByZWdpc3RlciBNQ1UgR1BJT3Mgd2l0aCB0aGUgZ2VuZXJpYyBHUElPIEFQSSwgc28geW91J2xsIGFibGUKKwkgIHRvIHVzZSBNQ1UgcGlucyBhcyBHUElPcy4KKwogZW5kbWVudQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9LY29uZmlnLmNwdXR5cGUgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL0tjb25maWcuY3B1dHlwZQppbmRleCAzZDBjNzc2Li5lODY4YjVjIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL0tjb25maWcuY3B1dHlwZQorKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL0tjb25maWcuY3B1dHlwZQpAQCAtMjMxLDcgKzIzMSw3IEBACiAJICBJZiBpbiBkb3VidCwgc2F5IFkgaGVyZS4KIAogY29uZmlnIFNNUAotCWRlcGVuZHMgb24gUFBDX1NURF9NTVUKKwlkZXBlbmRzIG9uIFBQQ19TVERfTU1VIHx8IEZTTF9CT09LRQogCWJvb2wgIlN5bW1ldHJpYyBtdWx0aS1wcm9jZXNzaW5nIHN1cHBvcnQiCiAJLS0taGVscC0tLQogCSAgVGhpcyBlbmFibGVzIHN1cHBvcnQgZm9yIHN5c3RlbXMgd2l0aCBtb3JlIHRoYW4gb25lIENQVS4gSWYgeW91IGhhdmUKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9iZWF0X2h0YWIuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9iZWF0X2h0YWIuYwppbmRleCAyZTY3YmQ4Li4zNWIxZWM0IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvYmVhdF9odGFiLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2JlYXRfaHRhYi5jCkBAIC00NCw4ICs0NCw4IEBACiAKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGJlYXRfcmVhZF9tYXNrKHVuc2lnbmVkIGhwdGVfZ3JvdXApCiB7Ci0JdW5zaWduZWQgbG9uZyBocHRlX3ZbNV07CiAJdW5zaWduZWQgbG9uZyBybWFzayA9IDA7CisJdTY0IGhwdGVfdls1XTsKIAogCWJlYXRfcmVhZF9odGFiX2VudHJpZXMoMCwgaHB0ZV9ncm91cCArIDAsIGhwdGVfdik7CiAJaWYgKCEoaHB0ZV92WzBdICYgSFBURV9WX0JPTFRFRCkpCkBAIC05Myw4ICs5Myw3IEBACiAJCQkJICBpbnQgcHNpemUsIGludCBzc2l6ZSkKIHsKIAl1bnNpZ25lZCBsb25nIGxwYXJfcmM7Ci0JdW5zaWduZWQgbG9uZyBzbG90OwotCXVuc2lnbmVkIGxvbmcgaHB0ZV92LCBocHRlX3I7CisJdTY0IGhwdGVfdiwgaHB0ZV9yLCBzbG90OwogCiAJLyogc2FtZSBhcyBpc2VyaWVzICovCiAJaWYgKHZmbGFncyAmIEhQVEVfVl9TRUNPTkRBUlkpCkBAIC0xNTMsOCArMTUyLDkgQEAKIAogc3RhdGljIHVuc2lnbmVkIGxvbmcgYmVhdF9scGFyX2hwdGVfZ2V0d29yZDAodW5zaWduZWQgbG9uZyBzbG90KQogewotCXVuc2lnbmVkIGxvbmcgZHdvcmQwLCBkd29yZFs1XTsKKwl1bnNpZ25lZCBsb25nIGR3b3JkMDsKIAl1bnNpZ25lZCBsb25nIGxwYXJfcmM7CisJdTY0IGR3b3JkWzVdOwogCiAJbHBhcl9yYyA9IGJlYXRfcmVhZF9odGFiX2VudHJpZXMoMCwgc2xvdCAmIH4zVUwsIGR3b3JkKTsKIApAQCAtMTcwLDcgKzE3MCw3IEBACiAJdW5zaWduZWQgbG9uZyBzaXplX2J5dGVzID0gMVVMIDw8IHBwYzY0X3BmdF9zaXplOwogCXVuc2lnbmVkIGxvbmcgaHB0ZV9jb3VudCA9IHNpemVfYnl0ZXMgPj4gNDsKIAlpbnQgaTsKLQl1bnNpZ25lZCBsb25nIGR1bW15MCwgZHVtbXkxOworCXU2NCBkdW1teTAsIGR1bW15MTsKIAogCS8qIFRPRE86IFVzZSBidWxrIGNhbGwgKi8KIAlmb3IgKGkgPSAwOyBpIDwgaHB0ZV9jb3VudDsgaSsrKQpAQCAtMTg5LDcgKzE4OSw4IEBACiAJCQkJICAgIGludCBwc2l6ZSwgaW50IHNzaXplLCBpbnQgbG9jYWwpCiB7CiAJdW5zaWduZWQgbG9uZyBscGFyX3JjOwotCXVuc2lnbmVkIGxvbmcgZHVtbXkwLCBkdW1teTEsIHdhbnRfdjsKKwl1NjQgZHVtbXkwLCBkdW1teTE7CisJdW5zaWduZWQgbG9uZyB3YW50X3Y7CiAKIAl3YW50X3YgPSBocHRlX2VuY29kZV92KHZhLCBwc2l6ZSwgTU1VX1NFR1NJWkVfMjU2TSk7CiAKQEAgLTI1NSw3ICsyNTYsOCBAQAogCQkJCQkgIHVuc2lnbmVkIGxvbmcgZWEsCiAJCQkJCSAgaW50IHBzaXplLCBpbnQgc3NpemUpCiB7Ci0JdW5zaWduZWQgbG9uZyBscGFyX3JjLCBzbG90LCB2c2lkLCB2YSwgZHVtbXkwLCBkdW1teTE7CisJdW5zaWduZWQgbG9uZyBscGFyX3JjLCBzbG90LCB2c2lkLCB2YTsKKwl1NjQgZHVtbXkwLCBkdW1teTE7CiAKIAl2c2lkID0gZ2V0X2tlcm5lbF92c2lkKGVhLCBNTVVfU0VHU0laRV8yNTZNKTsKIAl2YSA9ICh2c2lkIDw8IDI4KSB8IChlYSAmIDB4MGZmZmZmZmYpOwpAQCAtMjc2LDcgKzI3OCw3IEBACiB7CiAJdW5zaWduZWQgbG9uZyB3YW50X3Y7CiAJdW5zaWduZWQgbG9uZyBscGFyX3JjOwotCXVuc2lnbmVkIGxvbmcgZHVtbXkxLCBkdW1teTI7CisJdTY0IGR1bW15MSwgZHVtbXkyOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlEQkdfTE9XKCIgICAgaW52YWwgOiBzbG90PSVseCwgdmE9JTAxNmx4LCBwc2l6ZTogJWQsIGxvY2FsOiAlZFxuIiwKQEAgLTMxNSw4ICszMTcsNyBAQAogCQkJCSAgaW50IHBzaXplLCBpbnQgc3NpemUpCiB7CiAJdW5zaWduZWQgbG9uZyBscGFyX3JjOwotCXVuc2lnbmVkIGxvbmcgc2xvdDsKLQl1bnNpZ25lZCBsb25nIGhwdGVfdiwgaHB0ZV9yOworCXU2NCBocHRlX3YsIGhwdGVfciwgc2xvdDsKIAogCS8qIHNhbWUgYXMgaXNlcmllcyAqLwogCWlmICh2ZmxhZ3MgJiBIUFRFX1ZfU0VDT05EQVJZKQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2JlYXRfaW50ZXJydXB0LmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvYmVhdF9pbnRlcnJ1cHQuYwppbmRleCAxOTJhOTM1Li43MjI1NDg0IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvYmVhdF9pbnRlcnJ1cHQuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvYmVhdF9pbnRlcnJ1cHQuYwpAQCAtOTksNyArOTksNyBAQAogCWVyciA9IGJlYXRfZG93bmNvdW50X29mX2ludGVycnVwdChpcnFfcGx1Zyk7CiAJaWYgKGVyciAhPSAwKSB7CiAJCWlmICgoZXJyICYgMHhGRkZGRkZGRikgIT0gMHhGRkZGRkZGNSkgLyogLTExOiB3cm9uZyBzdGF0ZSAqLwotCQkJcGFuaWMoIkZhaWxlZCB0byBkb3duY291bnQgSVJRISBFcnJvciA9ICUxNmx4IiwgZXJyKTsKKwkJCXBhbmljKCJGYWlsZWQgdG8gZG93bmNvdW50IElSUSEgRXJyb3IgPSAlMTZsbHgiLCBlcnIpOwogCiAJCXByaW50ayhLRVJOX0VSUiAiSVJRIG92ZXItZG93bmNvdW50ZWQsIHBsdWcgJWRcbiIsIGlycV9wbHVnKTsKIAl9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvYmVhdF91ZGJnLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvYmVhdF91ZGJnLmMKaW5kZXggNmI0MThmNi4uMzUwNzM1YiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2JlYXRfdWRiZy5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9iZWF0X3VkYmcuYwpAQCAtNDAsOCArNDAsOCBAQAogfQogCiAvKiBCdWZmZXJlZCBjaGFycyBnZXRjICovCi1zdGF0aWMgbG9uZyBpbmJ1ZmxlbjsKLXN0YXRpYyBsb25nIGluYnVmWzJdOwkvKiBtdXN0IGJlIDIgbG9uZ3MgKi8KK3N0YXRpYyB1NjQgaW5idWZsZW47CitzdGF0aWMgdTY0IGluYnVmWzJdOwkvKiBtdXN0IGJlIDIgdTY0cyAqLwogCiBzdGF0aWMgaW50IHVkYmdfZ2V0Y19wb2xsX2JlYXQodm9pZCkKIHsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9jYmVfY3B1ZnJlcS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2NiZV9jcHVmcmVxLmMKaW5kZXggZWM3YzhmNC4uZTY1MDZjZCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2NiZV9jcHVmcmVxLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2NiZV9jcHVmcmVxLmMKQEAgLTExOCw3ICsxMTgsNyBAQAogCXBvbGljeS0+Y3VyID0gY2JlX2ZyZXFzW2N1cl9wbW9kZV0uZnJlcXVlbmN5OwogCiAjaWZkZWYgQ09ORklHX1NNUAotCXBvbGljeS0+Y3B1cyA9IHBlcl9jcHUoY3B1X3NpYmxpbmdfbWFwLCBwb2xpY3ktPmNwdSk7CisJY3B1bWFza19jb3B5KHBvbGljeS0+Y3B1cywgJnBlcl9jcHUoY3B1X3NpYmxpbmdfbWFwLCBwb2xpY3ktPmNwdSkpOwogI2VuZGlmCiAKIAljcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZV9nZXRfYXR0cihjYmVfZnJlcXMsIHBvbGljeS0+Y3B1KTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9jYmVfY3B1ZnJlcV9wZXJ2YXNpdmUuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9jYmVfY3B1ZnJlcV9wZXJ2YXNpdmUuYwppbmRleCA3MGZhN2FlLi4yMDQ3MmU0IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvY2JlX2NwdWZyZXFfcGVydmFzaXZlLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2NiZV9jcHVmcmVxX3BlcnZhc2l2ZS5jCkBAIC01NCw3ICs1NCw3IEBACiB7CiAJc3RydWN0IGNiZV9wbWRfcmVncyBfX2lvbWVtICpwbWRfcmVnczsKIAlzdHJ1Y3QgY2JlX21pY190bV9yZWdzIF9faW9tZW0gKm1pY190bV9yZWdzOwotCXU2NCBmbGFnczsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXU2NCB2YWx1ZTsKICNpZmRlZiBERUJVRwogCWxvbmcgdGltZTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9jZWxsZWJfc2NjX2VwY2kuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9jZWxsZWJfc2NjX2VwY2kuYwppbmRleCAwOGMyODViLi40OGVjODhhIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvY2VsbGViX3NjY19lcGNpLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2NlbGxlYl9zY2NfZXBjaS5jCkBAIC00MDUsNyArNDA1LDcgQEAKIAlob3NlLT5jZmdfYWRkciA9IGlvcmVtYXAoci5zdGFydCwgKHIuZW5kIC0gci5zdGFydCArIDEpKTsKIAlpZiAoIWhvc2UtPmNmZ19hZGRyKQogCQlnb3RvIGVycm9yOwotCXByX2RlYnVnKCJFUENJOiBjZmdfYWRkciBtYXAgMHglMDE2bHgtPjB4JTAxNmx4ICsgMHglMDE2bHhcbiIsCisJcHJfZGVidWcoIkVQQ0k6IGNmZ19hZGRyIG1hcCAweCUwMTZsbHgtPjB4JTAxNmx4ICsgMHglMDE2bGx4XG4iLAogCQkgci5zdGFydCwgKHVuc2lnbmVkIGxvbmcpaG9zZS0+Y2ZnX2FkZHIsIChyLmVuZCAtIHIuc3RhcnQgKyAxKSk7CiAKIAlpZiAob2ZfYWRkcmVzc190b19yZXNvdXJjZShub2RlLCAyLCAmcikpCkBAIC00MTMsNyArNDEzLDcgQEAKIAlob3NlLT5jZmdfZGF0YSA9IGlvcmVtYXAoci5zdGFydCwgKHIuZW5kIC0gci5zdGFydCArIDEpKTsKIAlpZiAoIWhvc2UtPmNmZ19kYXRhKQogCQlnb3RvIGVycm9yOwotCXByX2RlYnVnKCJFUENJOiBjZmdfZGF0YSBtYXAgMHglMDE2bHgtPjB4JTAxNmx4ICsgMHglMDE2bHhcbiIsCisJcHJfZGVidWcoIkVQQ0k6IGNmZ19kYXRhIG1hcCAweCUwMTZsbHgtPjB4JTAxNmx4ICsgMHglMDE2bGx4XG4iLAogCQkgci5zdGFydCwgKHVuc2lnbmVkIGxvbmcpaG9zZS0+Y2ZnX2RhdGEsIChyLmVuZCAtIHIuc3RhcnQgKyAxKSk7CiAKIAlob3NlLT5vcHMgPSAmY2VsbGViX2VwY2lfb3BzOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2NwdWZyZXFfc3B1ZGVtYW5kLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvY3B1ZnJlcV9zcHVkZW1hbmQuYwppbmRleCBhM2M2YzAxLi45NjhjMWMwIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvY3B1ZnJlcV9zcHVkZW1hbmQuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvY3B1ZnJlcV9zcHVkZW1hbmQuYwpAQCAtMTEwLDcgKzExMCw3IEBACiAJCX0KIAogCQkvKiBpbml0aWFsaXplIHNwdV9nb3ZfaW5mbyBmb3IgYWxsIGFmZmVjdGVkIGNwdXMgKi8KLQkJZm9yX2VhY2hfY3B1X21hc2soaSwgcG9saWN5LT5jcHVzKSB7CisJCWZvcl9lYWNoX2NwdShpLCBwb2xpY3ktPmNwdXMpIHsKIAkJCWFmZmVjdGVkX2luZm8gPSAmcGVyX2NwdShzcHVfZ292X2luZm8sIGkpOwogCQkJYWZmZWN0ZWRfaW5mby0+cG9saWN5ID0gcG9saWN5OwogCQl9CkBAIC0xMjcsNyArMTI3LDcgQEAKIAkJc3B1X2dvdl9jYW5jZWxfd29yayhpbmZvKTsKIAogCQkvKiBjbGVhbiBzcHVfZ292X2luZm8gZm9yIGFsbCBhZmZlY3RlZCBjcHVzICovCi0JCWZvcl9lYWNoX2NwdV9tYXNrIChpLCBwb2xpY3ktPmNwdXMpIHsKKwkJZm9yX2VhY2hfY3B1IChpLCBwb2xpY3ktPmNwdXMpIHsKIAkJCWluZm8gPSAmcGVyX2NwdShzcHVfZ292X2luZm8sIGkpOwogCQkJaW5mby0+cG9saWN5ID0gTlVMTDsKIAkJfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2ludGVycnVwdC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2ludGVycnVwdC5jCmluZGV4IDJkNWJiMjIuLjI4YzA0ZGEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9pbnRlcnJ1cHQuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvaW50ZXJydXB0LmMKQEAgLTE0OCw3ICsxNDgsNyBAQAogCiAJaWljID0gJl9fZ2V0X2NwdV92YXIoaWljKTsKIAkqKHVuc2lnbmVkIGxvbmcgKikgJnBlbmRpbmcgPQotCQlpbl9iZTY0KCh1bnNpZ25lZCBsb25nIF9faW9tZW0gKikgJmlpYy0+cmVncy0+cGVuZGluZ19kZXN0cik7CisJCWluX2JlNjQoKHU2NCBfX2lvbWVtICopICZpaWMtPnJlZ3MtPnBlbmRpbmdfZGVzdHIpOwogCWlmICghKHBlbmRpbmcuZmxhZ3MgJiBDQkVfSUlDX0lSUV9WQUxJRCkpCiAJCXJldHVybiBOT19JUlE7CiAJdmlycSA9IGlycV9saW5lYXJfcmV2bWFwKGlpY19ob3N0LCBpaWNfcGVuZGluZ190b19od251bShwZW5kaW5nKSk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvaW8td29ya2Fyb3VuZHMuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9pby13b3JrYXJvdW5kcy5jCmluZGV4IGI1Zjg0ZTguLjA1OWNhZDYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9pby13b3JrYXJvdW5kcy5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9pby13b3JrYXJvdW5kcy5jCkBAIC0xMzAsMTQgKzEzMCwxNCBAQAogCiB9OwogCi1zdGF0aWMgdm9pZCBfX2lvbWVtICppb3dhX2lvcmVtYXAodW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIHNpemUsCitzdGF0aWMgdm9pZCBfX2lvbWVtICppb3dhX2lvcmVtYXAocGh5c19hZGRyX3QgYWRkciwgdW5zaWduZWQgbG9uZyBzaXplLAogCQkJCQkJdW5zaWduZWQgbG9uZyBmbGFncykKIHsKIAlzdHJ1Y3QgaW93YV9idXMgKmJ1czsKIAl2b2lkIF9faW9tZW0gKnJlcyA9IF9faW9yZW1hcChhZGRyLCBzaXplLCBmbGFncyk7CiAJaW50IGJ1c25vOwogCi0JYnVzID0gaW93YV9wY2lfZmluZCgwLCBhZGRyKTsKKwlidXMgPSBpb3dhX3BjaV9maW5kKDAsICh1bnNpZ25lZCBsb25nKWFkZHIpOwogCWlmIChidXMgIT0gTlVMTCkgewogCQlidXNubyA9IGJ1cyAtIGlvd2FfYnVzc2VzOwogCQlQQ0lfU0VUX0FERFJfVE9LRU4ocmVzLCBidXNubyArIDEpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2lvbW11LmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvaW9tbXUuYwppbmRleCA4NmRiNGRkLi5lZTUwMzNlIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvaW9tbXUuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvaW9tbXUuYwpAQCAtMTUwLDggKzE1MCw4IEBACiBzdGF0aWMgdm9pZCBpbnZhbGlkYXRlX3RjZV9jYWNoZShzdHJ1Y3QgY2JlX2lvbW11ICppb21tdSwgdW5zaWduZWQgbG9uZyAqcHRlLAogCQlsb25nIG5fcHRlcykKIHsKLQl1bnNpZ25lZCBsb25nIF9faW9tZW0gKnJlZzsKLQl1bnNpZ25lZCBsb25nIHZhbDsKKwl1NjQgX19pb21lbSAqcmVnOworCXU2NCB2YWw7CiAJbG9uZyBuOwogCiAJcmVnID0gaW9tbXUtPnhsYXRlX3JlZ3MgKyBJT0NfSU9QVF9DYWNoZUludmQ7CkBAIC04NTUsNyArODU1LDcgQEAKIAkgKi8KIAlpZiAobnAgJiYgc2l6ZSA8IGxtYl9lbmRfb2ZfRFJBTSgpKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgImlvbW11OiBmb3JjZS1lbmFibGVkLCBkbWEgd2luZG93IgotCQkgICAgICAgIiAoJWxkTUIpIHNtYWxsZXIgdGhhbiB0b3RhbCBtZW1vcnkgKCVsZE1CKVxuIiwKKwkJICAgICAgICIgKCVsZE1CKSBzbWFsbGVyIHRoYW4gdG90YWwgbWVtb3J5ICglbGxkTUIpXG4iLAogCQkgICAgICAgc2l6ZSA+PiAyMCwgbG1iX2VuZF9vZl9EUkFNKCkgPj4gMjApOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CkBAIC05ODUsNyArOTg1LDcgQEAKIAlhZGRyID0gY2VsbF9pb21tdV9nZXRfZml4ZWRfYWRkcmVzcyhkZXYpICsgZG1hX2lvbW11X2ZpeGVkX2Jhc2U7CiAJYXJjaGRhdGEtPmRtYV9kYXRhID0gKHZvaWQgKilhZGRyOwogCi0JZGV2X2RiZyhkZXYsICJpb21tdTogZml4ZWQgYWRkciA9ICVseFxuIiwgYWRkcik7CisJZGV2X2RiZyhkZXYsICJpb21tdTogZml4ZWQgYWRkciA9ICVsbHhcbiIsIGFkZHIpOwogfQogCiBzdGF0aWMgdm9pZCBpbnNlcnRfMTZNX3B0ZSh1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgKnB0YWIsCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvcmFzLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvcmFzLmMKaW5kZXggN2I0Y2VmYS4uNWY5NjFjNCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3Jhcy5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9yYXMuYwpAQCAtMzgsMTYgKzM4LDE2IEBACiAJLyogVG9kbzogZG8gc29tZSBuaWNlciBwYXJzaW5nIG9mIGJpdHMgYW5kIGJhc2VkIG9uIHRoZW0gZ28gZG93bgogCSAqIHRvIG90aGVyIHN1Yi11bml0cyBGSVJzIGFuZCBub3Qgb25seSBJSUMKIAkgKi8KLQlwcmludGsoS0VSTl9FUlIgIkdsb2JhbCBDaGVja3N0b3AgRklSICAgIDogMHglMDE2bHhcbiIsCisJcHJpbnRrKEtFUk5fRVJSICJHbG9iYWwgQ2hlY2tzdG9wIEZJUiAgICA6IDB4JTAxNmxseFxuIiwKIAkgICAgICAgaW5fYmU2NCgmcHJlZ3MtPmNoZWNrc3RvcF9maXIpKTsKLQlwcmludGsoS0VSTl9FUlIgIkdsb2JhbCBSZWNvdmVyYWJsZSBGSVIgIDogMHglMDE2bHhcbiIsCisJcHJpbnRrKEtFUk5fRVJSICJHbG9iYWwgUmVjb3ZlcmFibGUgRklSICA6IDB4JTAxNmxseFxuIiwKIAkgICAgICAgaW5fYmU2NCgmcHJlZ3MtPmNoZWNrc3RvcF9maXIpKTsKLQlwcmludGsoS0VSTl9FUlIgIkdsb2JhbCBNYWNoaW5lQ2hlY2sgRklSIDogMHglMDE2bHhcbiIsCisJcHJpbnRrKEtFUk5fRVJSICJHbG9iYWwgTWFjaGluZUNoZWNrIEZJUiA6IDB4JTAxNmxseFxuIiwKIAkgICAgICAgaW5fYmU2NCgmcHJlZ3MtPnNwZWNfYXR0X21jaGtfZmlyKSk7CiAKIAlpZiAoaXJlZ3MgPT0gTlVMTCkKIAkJcmV0dXJuOwotCXByaW50ayhLRVJOX0VSUiAiSU9DIEZJUiAgICAgICAgICAgICAgICAgOiAweCUwMTZseFxuIiwKKwlwcmludGsoS0VSTl9FUlIgIklPQyBGSVIgICAgICAgICAgICAgICAgIDogMHglMDE2bGx4XG4iLAogCSAgICAgICBpbl9iZTY0KCZpcmVncy0+aW9jX2ZpcikpOwogCiB9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1X2Jhc2UuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVfYmFzZS5jCmluZGV4IGE1YmRiODkuLmU0ODdhZDYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVfYmFzZS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVfYmFzZS5jCkBAIC0xNTEsNyArMTUxLDcgQEAKIHsKIAlzdHJ1Y3Qgc3B1X3ByaXYyIF9faW9tZW0gKnByaXYyID0gc3B1LT5wcml2MjsKIAotCXByX2RlYnVnKCIlczogYWRkaW5nIFNMQlslZF0gMHglMDE2bHggMHglMDE2bHhcbiIsCisJcHJfZGVidWcoIiVzOiBhZGRpbmcgU0xCWyVkXSAweCUwMTZsbHggMHglMDE2bGx4XG4iLAogCQkJX19mdW5jX18sIHNsYmUsIHNsYi0+dnNpZCwgc2xiLT5lc2lkKTsKIAogCW91dF9iZTY0KCZwcml2Mi0+c2xiX2luZGV4X1csIHNsYmUpOwpAQCAtMjIxLDcgKzIyMSw3IEBACiB7CiAJaW50IHJldDsKIAotCXByX2RlYnVnKCIlcywgJWx4LCAlbHhcbiIsIF9fZnVuY19fLCBkc2lzciwgZWEpOworCXByX2RlYnVnKCIlcywgJWxseCwgJWx4XG4iLCBfX2Z1bmNfXywgZHNpc3IsIGVhKTsKIAogCS8qCiAJICogSGFuZGxlIGtlcm5lbCBzcGFjZSBoYXNoIGZhdWx0cyBpbW1lZGlhdGVseS4gVXNlciBoYXNoCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1X2NhbGxiYWNrcy5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdV9jYWxsYmFja3MuYwppbmRleCAxOWY2YmZkLi5mZWMxNDk1IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1X2NhbGxiYWNrcy5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVfY2FsbGJhY2tzLmMKQEAgLTU0LDcgKzU0LDcgQEAKIAlsb25nICgqc3lzY2FsbCkodTY0IGExLCB1NjQgYTIsIHU2NCBhMywgdTY0IGE0LCB1NjQgYTUsIHU2NCBhNik7CiAKIAlpZiAocy0+bnJfcmV0ID49IEFSUkFZX1NJWkUoc3B1X3N5c2NhbGxfdGFibGUpKSB7Ci0JCXByX2RlYnVnKCIlczogaW52YWxpZCBzeXNjYWxsICMlbGQiLCBfX2Z1bmNfXywgcy0+bnJfcmV0KTsKKwkJcHJfZGVidWcoIiVzOiBpbnZhbGlkIHN5c2NhbGwgIyVsbGQiLCBfX2Z1bmNfXywgcy0+bnJfcmV0KTsKIAkJcmV0dXJuIC1FTk9TWVM7CiAJfQogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvY29yZWR1bXAuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9jb3JlZHVtcC5jCmluZGV4IGFmMTE2YWEuLmM0ZDRhMTkgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9jb3JlZHVtcC5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9jb3JlZHVtcC5jCkBAIC00Miw3ICs0Miw3IEBACiAJCXJldHVybiBzcHVmc19jb3JlZHVtcF9yZWFkW251bV0ucmVhZChjdHgsIGJ1ZmZlciwgc2l6ZSwgb2ZmKTsKIAogCWRhdGEgPSBzcHVmc19jb3JlZHVtcF9yZWFkW251bV0uZ2V0KGN0eCk7Ci0JcmV0ID0gc25wcmludGYoYnVmZmVyLCBzaXplLCAiMHglLjE2bHgiLCBkYXRhKTsKKwlyZXQgPSBzbnByaW50ZihidWZmZXIsIHNpemUsICIweCUuMTZsbHgiLCBkYXRhKTsKIAlpZiAocmV0ID49IHNpemUpCiAJCXJldHVybiBzaXplOwogCXJldHVybiArK3JldDsgLyogY291bnQgdHJhaWxpbmcgTlVMTCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL2ZhdWx0LmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvZmF1bHQuYwppbmRleCBmMDkzYTU4Li5hNGRkM2FlIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvZmF1bHQuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvZmF1bHQuYwpAQCAtMTMyLDcgKzEzMiw3IEBACiAKIAlzcHVjdHhfc3dpdGNoX3N0YXRlKGN0eCwgU1BVX1VUSUxfSU9XQUlUKTsKIAotCXByX2RlYnVnKCJjdHggJXA6IGVhICUwMTZseCwgZHNpc3IgJTAxNmx4IHN0YXRlICVkXG4iLCBjdHgsIGVhLAorCXByX2RlYnVnKCJjdHggJXA6IGVhICUwMTZsbHgsIGRzaXNyICUwMTZsbHggc3RhdGUgJWRcbiIsIGN0eCwgZWEsCiAJCWRzaXNyLCBjdHgtPnN0YXRlKTsKIAogCWN0eC0+c3RhdHMuaGFzaF9mbHQrKzsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9maWxlLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvZmlsZS5jCmluZGV4IDcxMDZiNjMuLjBkYTdmMmIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9maWxlLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL2ZpbGUuYwpAQCAtMTY1NCw3ICsxNjU0LDcgQEAKIAogc3RhdGljIGludCBzcHVmc19jaGVja192YWxpZF9kbWEoc3RydWN0IG1mY19kbWFfY29tbWFuZCAqY21kKQogewotCXByX2RlYnVnKCJxdWV1ZWluZyBETUEgJXggJWx4ICV4ICV4ICV4XG4iLCBjbWQtPmxzYSwKKwlwcl9kZWJ1ZygicXVldWVpbmcgRE1BICV4ICVsbHggJXggJXggJXhcbiIsIGNtZC0+bHNhLAogCQkgY21kLT5lYSwgY21kLT5zaXplLCBjbWQtPnRhZywgY21kLT5jbWQpOwogCiAJc3dpdGNoIChjbWQtPmNtZCkgewpAQCAtMTY3MSw3ICsxNjcxLDcgQEAKIAl9CiAKIAlpZiAoKGNtZC0+bHNhICYgMHhmKSAhPSAoY21kLT5lYSAmMHhmKSkgewotCQlwcl9kZWJ1ZygiaW52YWxpZCBETUEgYWxpZ25tZW50LCBlYSAlbHggbHNhICV4XG4iLAorCQlwcl9kZWJ1ZygiaW52YWxpZCBETUEgYWxpZ25tZW50LCBlYSAlbGx4IGxzYSAleFxuIiwKIAkJCQljbWQtPmVhLCBjbWQtPmxzYSk7CiAJCXJldHVybiAtRUlPOwogCX0KQEAgLTI2MzMsNyArMjYzMyw3IEBACiAJfQogCiAJc2VxX3ByaW50ZihzLCAiJWMgZmxncyglbHgpIHNmbGdzKCVseCkgcHJpKCVkKSB0cyglZCkgc3B1KCUwMmQpIgotCQkiICVjICVseCAlbHggJWx4ICVseCAleCAleFxuIiwKKwkJIiAlYyAlbGx4ICVsbHggJWxseCAlbGx4ICV4ICV4XG4iLAogCQljdHgtPnN0YXRlID09IFNQVV9TVEFURV9TQVZFRCA/ICdTJyA6ICdSJywKIAkJY3R4LT5mbGFncywKIAkJY3R4LT5zY2hlZF9mbGFncywKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9zcHVmcy5oIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL3NwdWZzLmgKaW5kZXggMTVjNjJkMy4uM2JmOTA4ZSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL3NwdWZzLmgKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL3NwdWZzLmgKQEAgLTMxNCw3ICszMTQsNyBAQAogICoJd2UgbmVlZCB0byBjYWxsIHNwdV9yZWxlYXNlKGN0eCkgYmVmb3JlIHNsZWVwaW5nLCBhbmQKICAqCXRoZW4gc3B1X2FjcXVpcmUoY3R4KSB3aGVuIGF3b2tlbi4KICAqCi0gKiAJUmV0dXJucyB3aXRoIHN0YXRlX211dGV4IHJlLWFjcXVpcmVkIHdoZW4gc3VjY2Vzc2Z1bGwgb3IKKyAqIAlSZXR1cm5zIHdpdGggc3RhdGVfbXV0ZXggcmUtYWNxdWlyZWQgd2hlbiBzdWNjZXNzZnVsIG9yCiAgKiAJd2l0aCAtRVJFU1RBUlRTWVMgYW5kIHRoZSBzdGF0ZV9tdXRleCBkcm9wcGVkIHdoZW4gaW50ZXJydXB0ZWQuCiAgKi8KIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9mc2xfdWxpMTU3NS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9mc2xfdWxpMTU3NS5jCmluZGV4IDhjNjE5OTYuLjFkYjZiOWUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvZnNsX3VsaTE1NzUuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2ZzbF91bGkxNTc1LmMKQEAgLTI0OSw2ICsyNDksNyBAQAogREVDTEFSRV9QQ0lfRklYVVBfSEVBREVSKFBDSV9WRU5ET1JfSURfQUwsIDB4NTIyOSwgcXVpcmtfdWxpNTIyOSk7CiBERUNMQVJFX1BDSV9GSVhVUF9GSU5BTChQQ0lfVkVORE9SX0lEX0FMLCAweDUyNDksIHF1aXJrX2ZpbmFsX3VsaTUyNDkpOwogREVDTEFSRV9QQ0lfRklYVVBfRklOQUwoUENJX1ZFTkRPUl9JRF9BTCwgMHgxNTc1LCBxdWlya19maW5hbF91bGkxNTc1KTsKK0RFQ0xBUkVfUENJX0ZJWFVQX1JFU1VNRShQQ0lfVkVORE9SX0lEX0FMLCAweDUyMjksIHF1aXJrX3VsaTUyMjkpOwogCiBzdGF0aWMgdm9pZCBfX2RldmluaXQgaHBjZF9xdWlya191bGkxNTc1KHN0cnVjdCBwY2lfZGV2ICpkZXYpCiB7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvS2NvbmZpZyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy9LY29uZmlnCmluZGV4IGVkMzc1M2QuLjdkZGQwYTIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy9LY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy9LY29uZmlnCkBAIC0xMCwxOCArMTAsMjEgQEAKIGNvbmZpZyBWSU9EQVNECiAJdHJpc3RhdGUgImlTZXJpZXMgVmlydHVhbCBJL08gZGlzayBzdXBwb3J0IgogCWRlcGVuZHMgb24gQkxPQ0sKKwlzZWxlY3QgVklPUEFUSAogCWhlbHAKIAkgIElmIHlvdSBhcmUgcnVubmluZyBvbiBhbiBpU2VyaWVzIHN5c3RlbSBhbmQgeW91IHdhbnQgdG8gdXNlCiAJICB2aXJ0dWFsIGRpc2tzIGNyZWF0ZWQgYW5kIG1hbmFnZWQgYnkgT1MvNDAwLCBzYXkgWS4KIAogY29uZmlnIFZJT0NECiAJdHJpc3RhdGUgImlTZXJpZXMgVmlydHVhbCBJL08gQ0Qgc3VwcG9ydCIKKwlzZWxlY3QgVklPUEFUSAogCWhlbHAKIAkgIElmIHlvdSBhcmUgcnVubmluZyBMaW51eCBvbiBhbiBJQk0gaVNlcmllcyBzeXN0ZW0gYW5kIHlvdSB3YW50IHRvCiAJICByZWFkIGEgQ0QgZHJpdmUgb3duZWQgYnkgT1MvNDAwLCBzYXkgWSBoZXJlLgogCiBjb25maWcgVklPVEFQRQogCXRyaXN0YXRlICJpU2VyaWVzIFZpcnR1YWwgVGFwZSBTdXBwb3J0IgorCXNlbGVjdCBWSU9QQVRICiAJaGVscAogCSAgSWYgeW91IGFyZSBydW5uaW5nIExpbnV4IG9uIGFuIGlTZXJpZXMgc3lzdGVtIGFuZCB5b3Ugd2FudCBMaW51eAogCSAgdG8gcmVhZCBhbmQvb3Igd3JpdGUgYSB0YXBlIGRyaXZlIG93bmVkIGJ5IE9TLzQwMCwgc2F5IFkgaGVyZS4KQEAgLTMwLDUgKzMzLDMgQEAKIAogY29uZmlnIFZJT1BBVEgKIAlib29sCi0JZGVwZW5kcyBvbiBWSU9EQVNEIHx8IFZJT0NEIHx8IFZJT1RBUEUgfHwgSVNFUklFU19WRVRICi0JZGVmYXVsdCB5CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvaW9tbXUuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy9pb21tdS5jCmluZGV4IGJiZTgyOGYuLjZlZDc1YmYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy9pb21tdS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy9pb21tdS5jCkBAIC02Niw3ICs2Niw3IEBACiAKIAkJcmMgPSBIdkNhbGxYbV9zZXRUY2UoKHU2NCl0YmwtPml0X2luZGV4LCAodTY0KWluZGV4LCB0Y2UpOwogCQlpZiAocmMpCi0JCQlwYW5pYygiUENJX0RNQTogSHZDYWxsWG1fc2V0VGNlIGZhaWxlZCwgUmM6IDB4JWx4XG4iLAorCQkJcGFuaWMoIlBDSV9ETUE6IEh2Q2FsbFhtX3NldFRjZSBmYWlsZWQsIFJjOiAweCVsbHhcbiIsCiAJCQkJCXJjKTsKIAkJaW5kZXgrKzsKIAkJdWFkZHIgKz0gVENFX1BBR0VfU0laRTsKQEAgLTgxLDcgKzgxLDcgQEAKIAl3aGlsZSAobnBhZ2VzLS0pIHsKIAkJcmMgPSBIdkNhbGxYbV9zZXRUY2UoKHU2NCl0YmwtPml0X2luZGV4LCAodTY0KWluZGV4LCAwKTsKIAkJaWYgKHJjKQotCQkJcGFuaWMoIlBDSV9ETUE6IEh2Q2FsbFhtX3NldFRjZSBmYWlsZWQsIFJjOiAweCVseFxuIiwKKwkJCXBhbmljKCJQQ0lfRE1BOiBIdkNhbGxYbV9zZXRUY2UgZmFpbGVkLCBSYzogMHglbGx4XG4iLAogCQkJCQlyYyk7CiAJCWluZGV4Kys7CiAJfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL3NldHVwLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvc2V0dXAuYwppbmRleCA3MGI2ODhjLi4yNDUxOWI5IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvc2V0dXAuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvc2V0dXAuYwpAQCAtMjMsNiArMjMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CiAjaW5jbHVkZSA8bGludXgva2Rldl90Lmg+CisjaW5jbHVkZSA8bGludXgva2V4ZWMuaD4KICNpbmNsdWRlIDxsaW51eC9tYWpvci5oPgogI2luY2x1ZGUgPGxpbnV4L3Jvb3RfZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CkBAIC02MzgsNiArNjM5LDEzIEBACiAJcmV0dXJuIDE7CiB9CiAKKyNpZmRlZiBDT05GSUdfS0VYRUMKK3N0YXRpYyBpbnQgaXNlcmllc19rZXhlY19wcmVwYXJlKHN0cnVjdCBraW1hZ2UgKmltYWdlKQoreworCXJldHVybiAtRU5PU1lTOworfQorI2VuZGlmCisKIGRlZmluZV9tYWNoaW5lKGlzZXJpZXMpIHsKIAkubmFtZQkJCT0gImlTZXJpZXMiLAogCS5zZXR1cF9hcmNoCQk9IGlTZXJpZXNfc2V0dXBfYXJjaCwKQEAgLTY1OCw2ICs2NjYsOSBAQAogCS5wcm9iZQkJCT0gaXNlcmllc19wcm9iZSwKIAkuaW9yZW1hcAkJPSBpc2VyaWVzX2lvcmVtYXAsCiAJLmlvdW5tYXAJCT0gaXNlcmllc19pb3VubWFwLAorI2lmZGVmIENPTkZJR19LRVhFQworCS5tYWNoaW5lX2tleGVjX3ByZXBhcmUJPSBpc2VyaWVzX2tleGVjX3ByZXBhcmUsCisjZW5kaWYKIAkvKiBYWFggSW1wbGVtZW50IGVuYWJsZV9wbWNzIGZvciBpU2VyaWVzICovCiB9OwogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bhc2VtaS9jcHVmcmVxLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bhc2VtaS9jcHVmcmVxLmMKaW5kZXggNTg1NTZiMC4uYmUyNTI3YSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wYXNlbWkvY3B1ZnJlcS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcGFzZW1pL2NwdWZyZXEuYwpAQCAtMTEyLDcgKzExMiw3IEBACiAKIHN0YXRpYyB2b2lkIHNldF9hc3RhdGUoaW50IGNwdSwgdW5zaWduZWQgaW50IGFzdGF0ZSkKIHsKLQl1NjQgZmxhZ3M7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCS8qIFJldHVybiBpZiBjYWxsZWQgYmVmb3JlIGluaXQgaGFzIHJ1biAqLwogCWlmICh1bmxpa2VseSghc2RjYXNyX21hcGJhc2UpKQpAQCAtMjEzLDcgKzIxMyw3IEBACiAJcHJfZGVidWcoImN1cnJlbnQgYXN0YXRlIGlzIGF0ICVkXG4iLGN1cl9hc3RhdGUpOwogCiAJcG9saWN5LT5jdXIgPSBwYXNfZnJlcXNbY3VyX2FzdGF0ZV0uZnJlcXVlbmN5OwotCXBvbGljeS0+Y3B1cyA9IGNwdV9vbmxpbmVfbWFwOworCWNwdW1hc2tfY29weShwb2xpY3ktPmNwdXMsICZjcHVfb25saW5lX21hcCk7CiAKIAlwcGNfcHJvY19mcmVxID0gcG9saWN5LT5jdXIgKiAxMDAwdWw7CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcGFzZW1pL2RtYV9saWIuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcGFzZW1pL2RtYV9saWIuYwppbmRleCAyMTdhZjMyLi5hNjE1MmQ5IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bhc2VtaS9kbWFfbGliLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wYXNlbWkvZG1hX2xpYi5jCkBAIC01MDksNyArNTA5LDcgQEAKICAqLwogaW50IHBhc2VtaV9kbWFfaW5pdCh2b2lkKQogewotCXN0YXRpYyBzcGlubG9ja190IGluaXRfbG9jayA9IFNQSU5fTE9DS19VTkxPQ0tFRDsKKwlzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGluaXRfbG9jayk7CiAJc3RydWN0IHBjaV9kZXYgKmlvYl9wZGV2OwogCXN0cnVjdCBwY2lfZGV2ICpwZGV2OwogCXN0cnVjdCByZXNvdXJjZSByZXM7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL2NwdWZyZXFfNjQuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvY3B1ZnJlcV82NC5jCmluZGV4IDRkZmI0YmMuLmJlYjM4MzMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvY3B1ZnJlcV82NC5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvY3B1ZnJlcV82NC5jCkBAIC0zNjIsNyArMzYyLDcgQEAKIAkvKiBzZWNvbmRhcnkgQ1BVcyBhcmUgdGllZCB0byB0aGUgcHJpbWFyeSBvbmUgYnkgdGhlCiAJICogY3B1ZnJlcSBjb3JlIGlmIGluIHRoZSBzZWNvbmRhcnkgcG9saWN5IHdlIHRlbGwgaXQgdGhhdAogCSAqIGl0IGFjdHVhbGx5IG11c3QgYmUgb25lIHBvbGljeSB0b2dldGhlciB3aXRoIGFsbCBvdGhlcnMuICovCi0JcG9saWN5LT5jcHVzID0gY3B1X29ubGluZV9tYXA7CisJY3B1bWFza19jb3B5KHBvbGljeS0+Y3B1cywgJmNwdV9vbmxpbmVfbWFwKTsKIAljcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZV9nZXRfYXR0cihnNV9jcHVfZnJlcXMsIHBvbGljeS0+Y3B1KTsKIAogCXJldHVybiBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZV9jcHVpbmZvKHBvbGljeSwKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvcGNpLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL3BjaS5jCmluZGV4IDU0YjdiNzYuLjA0Y2RkMzIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvcGNpLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm1hYy9wY2kuYwpAQCAtNjYxLDYgKzY2MSw3IEBACiAJCQlwY2lfZmluZF9ob3NlX2Zvcl9PRl9kZXZpY2UobnApOwogCQlpZiAoIWhvc2UpIHsKIAkJCXByaW50ayhLRVJOX0VSUiAiQ2FuJ3QgZmluZCBQQ0kgaG9zZSBmb3IgT0hhcmUyICFcbiIpOworCQkJb2Zfbm9kZV9wdXQobnApOwogCQkJcmV0dXJuOwogCQl9CiAJCWVhcmx5X3JlYWRfY29uZmlnX3dvcmQoaG9zZSwgYnVzLCBkZXZmbiwgUENJX0NPTU1BTkQsICZjbWQpOwpAQCAtNjY5LDYgKzY3MCw3IEBACiAJCWVhcmx5X3dyaXRlX2NvbmZpZ193b3JkKGhvc2UsIGJ1cywgZGV2Zm4sIFBDSV9DT01NQU5ELCBjbWQpOwogCX0KIAloYXNfc2Vjb25kX29oYXJlID0gMTsKKwlvZl9ub2RlX3B1dChucCk7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL3NtcC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm1hYy9zbXAuYwppbmRleCA2YjA3MTFjLi5iZDg4MTdiIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL3NtcC5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvc21wLmMKQEAgLTUzLDcgKzUzLDcgQEAKICNpbmNsdWRlIDxhc20vcG1hY19sb3dfaTJjLmg+CiAjaW5jbHVkZSA8YXNtL3BtYWNfcGZ1bmMuaD4KIAotI2RlZmluZSBERUJVRworI3VuZGVmIERFQlVHCiAKICNpZmRlZiBERUJVRwogI2RlZmluZSBEQkcoZm10Li4uKSB1ZGJnX3ByaW50ZihmbXQpCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL3RpbWUuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvdGltZS5jCmluZGV4IDU5ZWI4NDAuLjE4MTBlNDIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvdGltZS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvdGltZS5jCkBAIC0yNjUsMTIgKzI2NSwxNSBAQAogCXN0cnVjdCByZXNvdXJjZSByc3JjOwogCiAJdmlhcyA9IG9mX2ZpbmRfbm9kZV9ieV9uYW1lKE5VTEwsICJ2aWEtY3VkYSIpOwotCWlmICh2aWFzID09IDApCisJaWYgKHZpYXMgPT0gTlVMTCkKIAkJdmlhcyA9IG9mX2ZpbmRfbm9kZV9ieV9uYW1lKE5VTEwsICJ2aWEtcG11Iik7Ci0JaWYgKHZpYXMgPT0gMCkKKwlpZiAodmlhcyA9PSBOVUxMKQogCQl2aWFzID0gb2ZfZmluZF9ub2RlX2J5X25hbWUoTlVMTCwgInZpYSIpOwotCWlmICh2aWFzID09IDAgfHwgb2ZfYWRkcmVzc190b19yZXNvdXJjZSh2aWFzLCAwLCAmcnNyYykpCisJaWYgKHZpYXMgPT0gTlVMTCB8fCBvZl9hZGRyZXNzX3RvX3Jlc291cmNlKHZpYXMsIDAsICZyc3JjKSkgeworCSAgICAgICAgb2Zfbm9kZV9wdXQodmlhcyk7CiAJCXJldHVybiAwOworCX0KKwlvZl9ub2RlX3B1dCh2aWFzKTsKIAl2aWEgPSBpb3JlbWFwKHJzcmMuc3RhcnQsIHJzcmMuZW5kIC0gcnNyYy5zdGFydCArIDEpOwogCWlmICh2aWEgPT0gTlVMTCkgewogCQlwcmludGsoS0VSTl9FUlIgIkZhaWxlZCB0byBtYXAgVklBIGZvciB0aW1lciBjYWxpYnJhdGlvbiAhXG4iKTsKQEAgLTI5Nyw3ICszMDAsNyBAQAogCXBwY190Yl9mcmVxID0gKGRzdGFydCAtIGRlbmQpICogMTAwIC8gNjsKIAogCWlvdW5tYXAodmlhKTsKLQkKKwogCXJldHVybiAxOwogfQogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9kZXZpY2UtaW5pdC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvZGV2aWNlLWluaXQuYwppbmRleCBkYmMxMjRlLi5iYjAyOGYxIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9kZXZpY2UtaW5pdC5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL2RldmljZS1pbml0LmMKQEAgLTgyLDcgKzgyLDcgQEAKIAkJZ290byBmYWlsX3JpZ2h0czsKIAl9CiAKLQlwcl9kZWJ1ZygiJXM6JWQ6IHB1X2lkICVsdSwgcmlnaHRzICVsdSglbHhoKVxuIiwKKwlwcl9kZWJ1ZygiJXM6JWQ6IHB1X2lkICVsbHUsIHJpZ2h0cyAlbGx1KCVsbHhoKVxuIiwKIAkJX19mdW5jX18sIF9fTElORV9fLCBkZXYtPmxwbS5wdV9pZCwgZGV2LT5scG0ucmlnaHRzLAogCQlkZXYtPmxwbS5yaWdodHMpOwogCkBAIC0zNDgsNyArMzQ4LDcgQEAKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCi0JcHJfZGVidWcoIiVzOiV1OiAoJXU6JXU6JXUpOiBwb3J0ICVsdSBibGtfc2l6ZSAlbHUgbnVtX2Jsb2NrcyAlbHUgIgorCXByX2RlYnVnKCIlczoldTogKCV1OiV1OiV1KTogcG9ydCAlbGx1IGJsa19zaXplICVsbHUgbnVtX2Jsb2NrcyAlbGx1ICIKIAkJICJudW1fcmVnaW9ucyAldVxuIiwgX19mdW5jX18sIF9fTElORV9fLCByZXBvLT5idXNfaW5kZXgsCiAJCSByZXBvLT5kZXZfaW5kZXgsIHJlcG8tPmRldl90eXBlLCBwb3J0LCBibGtfc2l6ZSwgbnVtX2Jsb2NrcywKIAkJIG51bV9yZWdpb25zKTsKQEAgLTM5NCw3ICszOTQsNyBAQAogCQkJcmVzdWx0ID0gLUVOT0RFVjsKIAkJCWdvdG8gZmFpbF9yZWFkX3JlZ2lvbjsKIAkJfQotCQlwcl9kZWJ1ZygiJXM6JXU6IHJlZ2lvbiAldTogaWQgJXUgc3RhcnQgJWx1IHNpemUgJWx1XG4iLAorCQlwcl9kZWJ1ZygiJXM6JXU6IHJlZ2lvbiAldTogaWQgJXUgc3RhcnQgJWxsdSBzaXplICVsbHVcbiIsCiAJCQkgX19mdW5jX18sIF9fTElORV9fLCBpLCBpZCwgc3RhcnQsIHNpemUpOwogCiAJCXAtPnJlZ2lvbnNbaV0uaWQgPSBpZDsKQEAgLTUxOCw2ICs1MTgsNDEgQEAKIAlyZXR1cm4gcmVzdWx0OwogfQogCitzdGF0aWMgaW50IF9faW5pdCBwczNfcmVnaXN0ZXJfcmFtZGlza19kZXZpY2Uodm9pZCkKK3sKKwlpbnQgcmVzdWx0OworCXN0cnVjdCBsYXlvdXQgeworCQlzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlIGRldjsKKwl9ICpwOworCisJcHJfZGVidWcoIiAtPiAlczolZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKKworCXAgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbGF5b3V0KSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIXApCisJCXJldHVybiAtRU5PTUVNOworCisJcC0+ZGV2Lm1hdGNoX2lkID0gUFMzX01BVENIX0lEX0dQVTsKKwlwLT5kZXYubWF0Y2hfc3ViX2lkID0gUFMzX01BVENIX1NVQl9JRF9HUFVfUkFNRElTSzsKKwlwLT5kZXYuZGV2X3R5cGUgPSBQUzNfREVWSUNFX1RZUEVfSU9DMDsKKworCXJlc3VsdCA9IHBzM19zeXN0ZW1fYnVzX2RldmljZV9yZWdpc3RlcigmcC0+ZGV2KTsKKworCWlmIChyZXN1bHQpIHsKKwkJcHJfZGVidWcoIiVzOiVkIHBzM19zeXN0ZW1fYnVzX2RldmljZV9yZWdpc3RlciBmYWlsZWRcbiIsCisJCQlfX2Z1bmNfXywgX19MSU5FX18pOworCQlnb3RvIGZhaWxfZGV2aWNlX3JlZ2lzdGVyOworCX0KKworCXByX2RlYnVnKCIgPC0gJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisJcmV0dXJuIDA7CisKK2ZhaWxfZGV2aWNlX3JlZ2lzdGVyOgorCWtmcmVlKHApOworCXByX2RlYnVnKCIgPC0gJXM6JWQgZmFpbGVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCXJldHVybiByZXN1bHQ7Cit9CisKIC8qKgogICogcHMzX3NldHVwX2R5bmFtaWNfZGV2aWNlIC0gU2V0dXAgYSBkeW5hbWljIGRldmljZSBmcm9tIHRoZSByZXBvc2l0b3J5CiAgKi8KQEAgLTYyNywxMyArNjYyLDEzIEBACiAJCWlmIChyZW0pCiAJCQlicmVhazsKIAl9Ci0JcHJfd2FybmluZygiJXM6JXU6IGRldmljZSAlbHU6JWx1IG5vdCBmb3VuZFxuIiwgX19mdW5jX18sIF9fTElORV9fLAorCXByX3dhcm5pbmcoIiVzOiV1OiBkZXZpY2UgJWxsdTolbGx1IG5vdCBmb3VuZFxuIiwgX19mdW5jX18sIF9fTElORV9fLAogCQkgICBidXNfaWQsIGRldl9pZCk7CiAJcmV0dXJuOwogCiBmb3VuZDoKIAlpZiAocmV0cmllcykKLQkJcHJfZGVidWcoIiVzOiV1OiBkZXZpY2UgJWx1OiVsdSBmb3VuZCBhZnRlciAldSByZXRyaWVzXG4iLAorCQlwcl9kZWJ1ZygiJXM6JXU6IGRldmljZSAlbGx1OiVsbHUgZm91bmQgYWZ0ZXIgJXUgcmV0cmllc1xuIiwKIAkJCSBfX2Z1bmNfXywgX19MSU5FX18sIGJ1c19pZCwgZGV2X2lkLCByZXRyaWVzKTsKIAogCXBzM19zZXR1cF9keW5hbWljX2RldmljZSgmcmVwbyk7CkBAIC02ODAsMTQgKzcxNSwxNCBAQAogCXJlcyA9IGx2MV9zdG9yYWdlX2dldF9hc3luY19zdGF0dXMoUFMzX05PVElGSUNBVElPTl9ERVZfSUQsICZ0YWcsCiAJCQkJCSAgICZzdGF0dXMpOwogCWlmICh0YWcgIT0gZGV2LT50YWcpCi0JCXByX2VycigiJXM6JXU6IHRhZyBtaXNtYXRjaCwgZ290ICVseCwgZXhwZWN0ZWQgJWx4XG4iLAorCQlwcl9lcnIoIiVzOiV1OiB0YWcgbWlzbWF0Y2gsIGdvdCAlbGx4LCBleHBlY3RlZCAlbGx4XG4iLAogCQkgICAgICAgX19mdW5jX18sIF9fTElORV9fLCB0YWcsIGRldi0+dGFnKTsKIAogCWlmIChyZXMpIHsKLQkJcHJfZXJyKCIlczoldTogcmVzICVkIHN0YXR1cyAweCVseFxuIiwgX19mdW5jX18sIF9fTElORV9fLCByZXMsCisJCXByX2VycigiJXM6JXU6IHJlcyAlZCBzdGF0dXMgMHglbGx4XG4iLCBfX2Z1bmNfXywgX19MSU5FX18sIHJlcywKIAkJICAgICAgIHN0YXR1cyk7CiAJfSBlbHNlIHsKLQkJcHJfZGVidWcoIiVzOiV1OiBjb21wbGV0ZWQsIHN0YXR1cyAweCVseFxuIiwgX19mdW5jX18sCisJCXByX2RlYnVnKCIlczoldTogY29tcGxldGVkLCBzdGF0dXMgMHglbGx4XG4iLCBfX2Z1bmNfXywKIAkJCSBfX0xJTkVfXywgc3RhdHVzKTsKIAkJZGV2LT5sdjFfc3RhdHVzID0gc3RhdHVzOwogCQljb21wbGV0ZSgmZGV2LT5kb25lKTsKQEAgLTcyNiw3ICs3NjEsNyBAQAogCX0KIAogCWlmIChkZXYtPmx2MV9zdGF0dXMpIHsKLQkJcHJfZXJyKCIlczoldTogJXMgbm90IGNvbXBsZXRlZCwgc3RhdHVzIDB4JWx4XG4iLCBfX2Z1bmNfXywKKwkJcHJfZXJyKCIlczoldTogJXMgbm90IGNvbXBsZXRlZCwgc3RhdHVzIDB4JWxseFxuIiwgX19mdW5jX18sCiAJCSAgICAgICBfX0xJTkVfXywgb3AsIGRldi0+bHYxX3N0YXR1cyk7CiAJCXJldHVybiAtRUlPOwogCX0KQEAgLTgxNSwxNiArODUwLDE2IEBACiAJCWlmIChyZXMpCiAJCQlicmVhazsKIAotCQlwcl9kZWJ1ZygiJXM6JXU6IG5vdGlmeSBldmVudCB0eXBlIDB4JWx4IGJ1cyBpZCAlbHUgZGV2IGlkICVsdSIKLQkJCSAiIHR5cGUgJWx1IHBvcnQgJWx1XG4iLCBfX2Z1bmNfXywgX19MSU5FX18sCisJCXByX2RlYnVnKCIlczoldTogbm90aWZ5IGV2ZW50IHR5cGUgMHglbGx4IGJ1cyBpZCAlbGx1IGRldiBpZCAlbGx1IgorCQkJICIgdHlwZSAlbGx1IHBvcnQgJWxsdVxuIiwgX19mdW5jX18sIF9fTElORV9fLAogCQkJIG5vdGlmeV9ldmVudC0+ZXZlbnRfdHlwZSwgbm90aWZ5X2V2ZW50LT5idXNfaWQsCiAJCQkgbm90aWZ5X2V2ZW50LT5kZXZfaWQsIG5vdGlmeV9ldmVudC0+ZGV2X3R5cGUsCiAJCQkgbm90aWZ5X2V2ZW50LT5kZXZfcG9ydCk7CiAKIAkJaWYgKG5vdGlmeV9ldmVudC0+ZXZlbnRfdHlwZSAhPSBub3RpZnlfcmVnaW9uX3Byb2JlIHx8CiAJCSAgICBub3RpZnlfZXZlbnQtPmJ1c19pZCAhPSBkZXYuc2JkLmJ1c19pZCkgewotCQkJcHJfd2FybmluZygiJXM6JXU6IGJhZCBub3RpZnlfZXZlbnQ6IGV2ZW50ICVsdSwgIgotCQkJCSAgICJkZXZfaWQgJWx1LCBkZXZfdHlwZSAlbHVcbiIsCisJCQlwcl93YXJuaW5nKCIlczoldTogYmFkIG5vdGlmeV9ldmVudDogZXZlbnQgJWxsdSwgIgorCQkJCSAgICJkZXZfaWQgJWxsdSwgZGV2X3R5cGUgJWxsdVxuIiwKIAkJCQkgICBfX2Z1bmNfXywgX19MSU5FX18sIG5vdGlmeV9ldmVudC0+ZXZlbnRfdHlwZSwKIAkJCQkgICBub3RpZnlfZXZlbnQtPmRldl9pZCwKIAkJCQkgICBub3RpZnlfZXZlbnQtPmRldl90eXBlKTsKQEAgLTk0Niw2ICs5ODEsOCBAQAogCiAJcHMzX3JlZ2lzdGVyX2xwbV9kZXZpY2VzKCk7CiAKKwlwczNfcmVnaXN0ZXJfcmFtZGlza19kZXZpY2UoKTsKKwogCXByX2RlYnVnKCIgPC0gJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9odGFiLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9odGFiLmMKaW5kZXggNmViMWQ0ZC4uMWU4YTFlMyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvaHRhYi5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL2h0YWIuYwpAQCAtNzUsNyArNzUsNyBAQAogCiAJaWYgKHJlc3VsdCkgewogCQkvKiBhbGwgZW50cmllcyBib2x0ZWQgISovCi0JCXByX2luZm8oIiVzOnJlc3VsdD0lZCB2YT0lbHggcGE9JWx4IGl4PSVseCB2PSVseCByPSVseFxuIiwKKwkJcHJfaW5mbygiJXM6cmVzdWx0PSVkIHZhPSVseCBwYT0lbHggaXg9JWx4IHY9JWxseCByPSVsbHhcbiIsCiAJCQlfX2Z1bmNfXywgcmVzdWx0LCB2YSwgcGEsIGhwdGVfZ3JvdXAsIGhwdGVfdiwgaHB0ZV9yKTsKIAkJQlVHKCk7CiAJfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvaW50ZXJydXB0LmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9pbnRlcnJ1cHQuYwppbmRleCBlNTk2MzRmLi44ZWM1Y2NmIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9pbnRlcnJ1cHQuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9pbnRlcnJ1cHQuYwpAQCAtNjAsNiArNjAsOCBAQAogICogZ2l2ZXMgYSB1c2FibGUgcmFuZ2Ugb2YgcGx1ZyB2YWx1ZXMgb2YgIHtOVU1fSVNBX0lOVEVSUlVQVFMuLjYzfS4gIE5vdGUKICAqIHRoYXQgdGhlcmUgaXMgbm8gY29uc3RyYWludCBvbiBob3cgbWFueSBpbiB0aGlzIHNldCBhbiBpbmRpdmlkdWFsIHRocmVhZAogICogY2FuIGFjcXVpcmUuCisgKgorICogVGhlIG1hc2sgaXMgZGVjbGFyZWQgYXMgdW5zaWduZWQgbG9uZyBzbyB3ZSBjYW4gdXNlIHNldC9jbGVhcl9iaXQgb24gaXQuCiAgKi8KIAogI2RlZmluZSBQUzNfQk1QX01JTkFMSUdOIDY0CkBAIC02OCw3ICs3MCw3IEBACiAJc3RydWN0IHsKIAkJdTY0IHN0YXR1czsKIAkJdTY0IHVudXNlZF8xWzNdOwotCQl1NjQgbWFzazsKKwkJdW5zaWduZWQgbG9uZyBtYXNrOwogCQl1NjQgdW51c2VkXzJbM107CiAJfTsKIAl1NjQgaXBpX2RlYnVnX2Jya19tYXNrOwpAQCAtMTAyLDcgKzEwNCw3IEBACiAJc3RydWN0IHBzM19wcml2YXRlICpwZCA9IGdldF9pcnFfY2hpcF9kYXRhKHZpcnEpOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlwcl9kZWJ1ZygiJXM6JWQ6IHRocmVhZF9pZCAlbHUsIHZpcnEgJWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywKKwlwcl9kZWJ1ZygiJXM6JWQ6IHRocmVhZF9pZCAlbGx1LCB2aXJxICVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sCiAJCXBkLT50aHJlYWRfaWQsIHZpcnEpOwogCiAJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwpAQCAtMTIzLDcgKzEyNSw3IEBACiAJc3RydWN0IHBzM19wcml2YXRlICpwZCA9IGdldF9pcnFfY2hpcF9kYXRhKHZpcnEpOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlwcl9kZWJ1ZygiJXM6JWQ6IHRocmVhZF9pZCAlbHUsIHZpcnEgJWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywKKwlwcl9kZWJ1ZygiJXM6JWQ6IHRocmVhZF9pZCAlbGx1LCB2aXJxICVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sCiAJCXBkLT50aHJlYWRfaWQsIHZpcnEpOwogCiAJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwpAQCAtMjIxLDcgKzIyMyw3IEBACiB7CiAJY29uc3Qgc3RydWN0IHBzM19wcml2YXRlICpwZCA9IGdldF9pcnFfY2hpcF9kYXRhKHZpcnEpOwogCi0JcHJfZGVidWcoIiVzOiVkOiBwcGVfaWQgJWx1LCB0aHJlYWRfaWQgJWx1LCB2aXJxICV1XG4iLCBfX2Z1bmNfXywKKwlwcl9kZWJ1ZygiJXM6JWQ6IHBwZV9pZCAlbGx1LCB0aHJlYWRfaWQgJWxsdSwgdmlycSAldVxuIiwgX19mdW5jX18sCiAJCV9fTElORV9fLCBwZC0+cHBlX2lkLCBwZC0+dGhyZWFkX2lkLCB2aXJxKTsKIAogCXNldF9pcnFfY2hpcF9kYXRhKHZpcnEsIE5VTEwpOwpAQCAtMjkxLDcgKzI5Myw3IEBACiAJaW50IHJlc3VsdDsKIAljb25zdCBzdHJ1Y3QgcHMzX3ByaXZhdGUgKnBkID0gZ2V0X2lycV9jaGlwX2RhdGEodmlycSk7CiAKLQlwcl9kZWJ1ZygiJXM6JWQ6IHBwZV9pZCAlbHUsIHRocmVhZF9pZCAlbHUsIHZpcnEgJXVcbiIsIF9fZnVuY19fLAorCXByX2RlYnVnKCIlczolZDogcHBlX2lkICVsbHUsIHRocmVhZF9pZCAlbGx1LCB2aXJxICV1XG4iLCBfX2Z1bmNfXywKIAkJX19MSU5FX18sIHBkLT5wcGVfaWQsIHBkLT50aHJlYWRfaWQsIHZpcnEpOwogCiAJcHMzX2NoaXBfbWFzayh2aXJxKTsKQEAgLTMyMiw3ICszMjQsNyBAQAogaW50IHBzM19ldmVudF9yZWNlaXZlX3BvcnRfc2V0dXAoZW51bSBwczNfY3B1X2JpbmRpbmcgY3B1LCB1bnNpZ25lZCBpbnQgKnZpcnEpCiB7CiAJaW50IHJlc3VsdDsKLQl1bnNpZ25lZCBsb25nIG91dGxldDsKKwl1NjQgb3V0bGV0OwogCiAJcmVzdWx0ID0gbHYxX2NvbnN0cnVjdF9ldmVudF9yZWNlaXZlX3BvcnQoJm91dGxldCk7CiAKQEAgLTQ2OCw3ICs0NzAsNyBAQAogCXVuc2lnbmVkIGludCAqdmlycSkKIHsKIAlpbnQgcmVzdWx0OwotCXVuc2lnbmVkIGxvbmcgb3V0bGV0OworCXU2NCBvdXRsZXQ7CiAKIAlyZXN1bHQgPSBsdjFfY29uc3RydWN0X2lvX2lycV9vdXRsZXQoaW50ZXJydXB0X2lkLCAmb3V0bGV0KTsKIApAQCAtNTI1LDcgKzUyNyw3IEBACiAJdW5zaWduZWQgaW50ICp2aXJxKQogewogCWludCByZXN1bHQ7Ci0JdW5zaWduZWQgbG9uZyBvdXRsZXQ7CisJdTY0IG91dGxldDsKIAl1NjQgbHBhcl9hZGRyOwogCiAJQlVHX09OKCFpc19rZXJuZWxfYWRkcigodTY0KXZpcnRfYWRkcl9ibXApKTsKQEAgLTU4MSw3ICs1ODMsNyBAQAogCXVuc2lnbmVkIGludCBjbGFzcywgdW5zaWduZWQgaW50ICp2aXJxKQogewogCWludCByZXN1bHQ7Ci0JdW5zaWduZWQgbG9uZyBvdXRsZXQ7CisJdTY0IG91dGxldDsKIAogCUJVR19PTihjbGFzcyA+IDIpOwogCkBAIC02OTEsNyArNjkzLDcgQEAKIAogCXBkLT5ibXAuaXBpX2RlYnVnX2Jya19tYXNrID0gMHg4MDAwMDAwMDAwMDAwMDAwVUwgPj4gdmlycTsKIAotCXByX2RlYnVnKCIlczolZDogY3B1ICV1LCB2aXJxICV1LCBtYXNrICVseGhcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywKKwlwcl9kZWJ1ZygiJXM6JWQ6IGNwdSAldSwgdmlycSAldSwgbWFzayAlbGx4aFxuIiwgX19mdW5jX18sIF9fTElORV9fLAogCQljcHUsIHZpcnEsIHBkLT5ibXAuaXBpX2RlYnVnX2Jya19tYXNrKTsKIH0KIApAQCAtNzEwLDcgKzcxMiw3IEBACiAJcGx1ZyAmPSAweDNmOwogCiAJaWYgKHVubGlrZWx5KHBsdWcgPT0gTk9fSVJRKSkgewotCQlwcl9kZWJ1ZygiJXM6JWQ6IG5vIHBsdWcgZm91bmQ6IHRocmVhZF9pZCAlbHVcbiIsIF9fZnVuY19fLAorCQlwcl9kZWJ1ZygiJXM6JWQ6IG5vIHBsdWcgZm91bmQ6IHRocmVhZF9pZCAlbGx1XG4iLCBfX2Z1bmNfXywKIAkJCV9fTElORV9fLCBwZC0+dGhyZWFkX2lkKTsKIAkJZHVtcF9ibXAoJnBlcl9jcHUocHMzX3ByaXZhdGUsIDApKTsKIAkJZHVtcF9ibXAoJnBlcl9jcHUocHMzX3ByaXZhdGUsIDEpKTsKQEAgLTc0NSw3ICs3NDcsNyBAQAogCQlwZC0+dGhyZWFkX2lkID0gZ2V0X2hhcmRfc21wX3Byb2Nlc3Nvcl9pZChjcHUpOwogCQlzcGluX2xvY2tfaW5pdCgmcGQtPmJtcC5sb2NrKTsKIAotCQlwcl9kZWJ1ZygiJXM6JWQ6IHBwZV9pZCAlbHUsIHRocmVhZF9pZCAlbHUsIGJtcCAlbHhoXG4iLAorCQlwcl9kZWJ1ZygiJXM6JWQ6IHBwZV9pZCAlbGx1LCB0aHJlYWRfaWQgJWxsdSwgYm1wICVseGhcbiIsCiAJCQlfX2Z1bmNfXywgX19MSU5FX18sIHBkLT5wcGVfaWQsIHBkLT50aHJlYWRfaWQsCiAJCQlwczNfbW1fcGh5c190b19scGFyKF9fcGEoJnBkLT5ibXApKSk7CiAKQEAgLTc3MCw2ICs3NzIsNiBAQAogCWx2MV9nZXRfbG9naWNhbF9wcGVfaWQoJnBwZV9pZCk7CiAJcmVzdWx0ID0gbHYxX2NvbmZpZ3VyZV9pcnFfc3RhdGVfYml0bWFwKHBwZV9pZCwgdGhyZWFkX2lkLCAwKTsKIAotCURCRygiJXM6JWQ6IGx2MV9jb25maWd1cmVfaXJxX3N0YXRlX2JpdG1hcCAoJWx1OiVsdS8lZCkgJXNcbiIsIF9fZnVuY19fLAorCURCRygiJXM6JWQ6IGx2MV9jb25maWd1cmVfaXJxX3N0YXRlX2JpdG1hcCAoJWxsdTolbGx1LyVkKSAlc1xuIiwgX19mdW5jX18sCiAJCV9fTElORV9fLCBwcGVfaWQsIHRocmVhZF9pZCwgY3B1LCBwczNfcmVzdWx0KHJlc3VsdCkpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvbW0uYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL21tLmMKaW5kZXggYTRkNDlkZC4uNjdkZTZiZjMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL21tLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvbW0uYwpAQCAtNzksOCArNzksOCBAQAogICovCiAKIHN0cnVjdCBtZW1fcmVnaW9uIHsKLQl1bnNpZ25lZCBsb25nIGJhc2U7Ci0JdW5zaWduZWQgbG9uZyBzaXplOworCXU2NCBiYXNlOworCXU2NCBzaXplOwogCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OwogfTsKIApAQCAtMTAzLDkgKzEwMyw5IEBACiAgKi8KIAogc3RydWN0IG1hcCB7Ci0JdW5zaWduZWQgbG9uZyB0b3RhbDsKLQl1bnNpZ25lZCBsb25nIHZhc19pZDsKLQl1bnNpZ25lZCBsb25nIGh0YWJfc2l6ZTsKKwl1NjQgdG90YWw7CisJdTY0IHZhc19pZDsKKwl1NjQgaHRhYl9zaXplOwogCXN0cnVjdCBtZW1fcmVnaW9uIHJtOwogCXN0cnVjdCBtZW1fcmVnaW9uIHIxOwogfTsKQEAgLTExNCwxMyArMTE0LDEzIEBACiBzdGF0aWMgdm9pZCBfX21heWJlX3VudXNlZCBfZGVidWdfZHVtcF9tYXAoY29uc3Qgc3RydWN0IG1hcCAqbSwKIAljb25zdCBjaGFyICpmdW5jLCBpbnQgbGluZSkKIHsKLQlEQkcoIiVzOiVkOiBtYXAudG90YWwgICAgID0gJWx4aFxuIiwgZnVuYywgbGluZSwgbS0+dG90YWwpOwotCURCRygiJXM6JWQ6IG1hcC5ybS5zaXplICAgPSAlbHhoXG4iLCBmdW5jLCBsaW5lLCBtLT5ybS5zaXplKTsKLQlEQkcoIiVzOiVkOiBtYXAudmFzX2lkICAgID0gJWx1XG4iLCBmdW5jLCBsaW5lLCBtLT52YXNfaWQpOwotCURCRygiJXM6JWQ6IG1hcC5odGFiX3NpemUgPSAlbHhoXG4iLCBmdW5jLCBsaW5lLCBtLT5odGFiX3NpemUpOwotCURCRygiJXM6JWQ6IG1hcC5yMS5iYXNlICAgPSAlbHhoXG4iLCBmdW5jLCBsaW5lLCBtLT5yMS5iYXNlKTsKKwlEQkcoIiVzOiVkOiBtYXAudG90YWwgICAgID0gJWxseGhcbiIsIGZ1bmMsIGxpbmUsIG0tPnRvdGFsKTsKKwlEQkcoIiVzOiVkOiBtYXAucm0uc2l6ZSAgID0gJWxseGhcbiIsIGZ1bmMsIGxpbmUsIG0tPnJtLnNpemUpOworCURCRygiJXM6JWQ6IG1hcC52YXNfaWQgICAgPSAlbGx1XG4iLCBmdW5jLCBsaW5lLCBtLT52YXNfaWQpOworCURCRygiJXM6JWQ6IG1hcC5odGFiX3NpemUgPSAlbGx4aFxuIiwgZnVuYywgbGluZSwgbS0+aHRhYl9zaXplKTsKKwlEQkcoIiVzOiVkOiBtYXAucjEuYmFzZSAgID0gJWxseGhcbiIsIGZ1bmMsIGxpbmUsIG0tPnIxLmJhc2UpOwogCURCRygiJXM6JWQ6IG1hcC5yMS5vZmZzZXQgPSAlbHhoXG4iLCBmdW5jLCBsaW5lLCBtLT5yMS5vZmZzZXQpOwotCURCRygiJXM6JWQ6IG1hcC5yMS5zaXplICAgPSAlbHhoXG4iLCBmdW5jLCBsaW5lLCBtLT5yMS5zaXplKTsKKwlEQkcoIiVzOiVkOiBtYXAucjEuc2l6ZSAgID0gJWxseGhcbiIsIGZ1bmMsIGxpbmUsIG0tPnIxLnNpemUpOwogfQogCiBzdGF0aWMgc3RydWN0IG1hcCBtYXA7CkBAIC0xNDYsMTEgKzE0NiwxMSBAQAogdm9pZCBfX2luaXQgcHMzX21tX3Zhc19jcmVhdGUodW5zaWduZWQgbG9uZyogaHRhYl9zaXplKQogewogCWludCByZXN1bHQ7Ci0JdW5zaWduZWQgbG9uZyBzdGFydF9hZGRyZXNzOwotCXVuc2lnbmVkIGxvbmcgc2l6ZTsKLQl1bnNpZ25lZCBsb25nIGFjY2Vzc19yaWdodDsKLQl1bnNpZ25lZCBsb25nIG1heF9wYWdlX3NpemU7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1NjQgc3RhcnRfYWRkcmVzczsKKwl1NjQgc2l6ZTsKKwl1NjQgYWNjZXNzX3JpZ2h0OworCXU2NCBtYXhfcGFnZV9zaXplOworCXU2NCBmbGFnczsKIAogCXJlc3VsdCA9IGx2MV9xdWVyeV9sb2dpY2FsX3BhcnRpdGlvbl9hZGRyZXNzX3JlZ2lvbl9pbmZvKDAsCiAJCSZzdGFydF9hZGRyZXNzLCAmc2l6ZSwgJmFjY2Vzc19yaWdodCwgJm1heF9wYWdlX3NpemUsCkBAIC0xNjQsNyArMTY0LDcgQEAKIAl9CiAKIAlpZiAobWF4X3BhZ2Vfc2l6ZSA8IFBBR0VfU0hJRlRfMTZNKSB7Ci0JCURCRygiJXM6JWQ6IGJhZCBtYXhfcGFnZV9zaXplICVseGhcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywKKwkJREJHKCIlczolZDogYmFkIG1heF9wYWdlX3NpemUgJWxseGhcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywKIAkJCW1heF9wYWdlX3NpemUpOwogCQlnb3RvIGZhaWw7CiAJfQpAQCAtMjA4LDcgKzIwOCw3IEBACiB7CiAJaW50IHJlc3VsdDsKIAotCURCRygiJXM6JWQ6IG1hcC52YXNfaWQgICAgPSAlbHVcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywgbWFwLnZhc19pZCk7CisJREJHKCIlczolZDogbWFwLnZhc19pZCAgICA9ICVsbHVcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywgbWFwLnZhc19pZCk7CiAKIAlpZiAobWFwLnZhc19pZCkgewogCQlyZXN1bHQgPSBsdjFfc2VsZWN0X3ZpcnR1YWxfYWRkcmVzc19zcGFjZSgwKTsKQEAgLTIzNSwxNSArMjM1LDE0IEBACiBzdGF0aWMgaW50IHBzM19tbV9yZWdpb25fY3JlYXRlKHN0cnVjdCBtZW1fcmVnaW9uICpyLCB1bnNpZ25lZCBsb25nIHNpemUpCiB7CiAJaW50IHJlc3VsdDsKLQl1bnNpZ25lZCBsb25nIG11aWQ7CisJdTY0IG11aWQ7CiAKIAlyLT5zaXplID0gX0FMSUdOX0RPV04oc2l6ZSwgMSA8PCBQQUdFX1NISUZUXzE2TSk7CiAKIAlEQkcoIiVzOiVkIHJlcXVlc3RlZCAgJWx4aFxuIiwgX19mdW5jX18sIF9fTElORV9fLCBzaXplKTsKLQlEQkcoIiVzOiVkIGFjdHVhbCAgICAgJWx4aFxuIiwgX19mdW5jX18sIF9fTElORV9fLCByLT5zaXplKTsKLQlEQkcoIiVzOiVkIGRpZmZlcmVuY2UgJWx4aCAoJWx1TUIpXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sCi0JCSh1bnNpZ25lZCBsb25nKShzaXplIC0gci0+c2l6ZSksCi0JCShzaXplIC0gci0+c2l6ZSkgLyAxMDI0IC8gMTAyNCk7CisJREJHKCIlczolZCBhY3R1YWwgICAgICVsbHhoXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sIHItPnNpemUpOworCURCRygiJXM6JWQgZGlmZmVyZW5jZSAlbGx4aCAoJWxsdU1CKVxuIiwgX19mdW5jX18sIF9fTElORV9fLAorCQlzaXplIC0gci0+c2l6ZSwgKHNpemUgLSByLT5zaXplKSAvIDEwMjQgLyAxMDI0KTsKIAogCWlmIChyLT5zaXplID09IDApIHsKIAkJREJHKCIlczolZDogc2l6ZSA9PSAwXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwpAQCAtMjc3LDcgKzI3Niw3IEBACiB7CiAJaW50IHJlc3VsdDsKIAotCURCRygiJXM6JWQ6IHItPmJhc2UgPSAlbHhoXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sIHItPmJhc2UpOworCURCRygiJXM6JWQ6IHItPmJhc2UgPSAlbGx4aFxuIiwgX19mdW5jX18sIF9fTElORV9fLCByLT5iYXNlKTsKIAlpZiAoci0+YmFzZSkgewogCQlyZXN1bHQgPSBsdjFfcmVsZWFzZV9tZW1vcnkoci0+YmFzZSk7CiAJCUJVR19PTihyZXN1bHQpOwpAQCAtMzU1LDcgKzM1NCw3IEBACiBzdGF0aWMgdm9pZCAgX19tYXliZV91bnVzZWQgX2RtYV9kdW1wX3JlZ2lvbihjb25zdCBzdHJ1Y3QgcHMzX2RtYV9yZWdpb24gKnIsCiAJY29uc3QgY2hhciAqZnVuYywgaW50IGxpbmUpCiB7Ci0JREJHKCIlczolZDogZGV2ICAgICAgICAlbHU6JWx1XG4iLCBmdW5jLCBsaW5lLCByLT5kZXYtPmJ1c19pZCwKKwlEQkcoIiVzOiVkOiBkZXYgICAgICAgICVsbHU6JWxsdVxuIiwgZnVuYywgbGluZSwgci0+ZGV2LT5idXNfaWQsCiAJCXItPmRldi0+ZGV2X2lkKTsKIAlEQkcoIiVzOiVkOiBwYWdlX3NpemUgICV1XG4iLCBmdW5jLCBsaW5lLCByLT5wYWdlX3NpemUpOwogCURCRygiJXM6JWQ6IGJ1c19hZGRyICAgJWx4aFxuIiwgZnVuYywgbGluZSwgci0+YnVzX2FkZHIpOwpAQCAtMzkwLDcgKzM4OSw3IEBACiBzdGF0aWMgdm9pZCBfZG1hX2R1bXBfY2h1bmsgKGNvbnN0IHN0cnVjdCBkbWFfY2h1bmsqIGMsIGNvbnN0IGNoYXIqIGZ1bmMsCiAJaW50IGxpbmUpCiB7Ci0JREJHKCIlczolZDogci5kZXYgICAgICAgICVsdTolbHVcbiIsIGZ1bmMsIGxpbmUsCisJREJHKCIlczolZDogci5kZXYgICAgICAgICVsbHU6JWxsdVxuIiwgZnVuYywgbGluZSwKIAkJYy0+cmVnaW9uLT5kZXYtPmJ1c19pZCwgYy0+cmVnaW9uLT5kZXYtPmRldl9pZCk7CiAJREJHKCIlczolZDogci5idXNfYWRkciAgICVseGhcbiIsIGZ1bmMsIGxpbmUsIGMtPnJlZ2lvbi0+YnVzX2FkZHIpOwogCURCRygiJXM6JWQ6IHIucGFnZV9zaXplICAldVxuIiwgZnVuYywgbGluZSwgYy0+cmVnaW9uLT5wYWdlX3NpemUpOwpAQCAtNTk2LDcgKzU5NSw3IEBACiAKIAkvKiBidWlsZCBpb3B0ZXMgZm9yIHRoZSBhcmVhICovCiAJcGFnZXMgPSBsZW4gPj4gci0+cGFnZV9zaXplOwotCURCRygiJXM6IHBnc2l6ZT0lI3ggbGVuPSUjbHggcGFnZXM9JSN4IGlvcHRlZmxhZz0lI2x4XG4iLCBfX2Z1bmNfXywKKwlEQkcoIiVzOiBwZ3NpemU9JSN4IGxlbj0lI2x4IHBhZ2VzPSUjeCBpb3B0ZWZsYWc9JSNsbHhcbiIsIF9fZnVuY19fLAogCSAgICByLT5wYWdlX3NpemUsIHItPmxlbiwgcGFnZXMsIGlvcHRlX2ZsYWcpOwogCWZvciAoaW9wYWdlID0gMDsgaW9wYWdlIDwgcGFnZXM7IGlvcGFnZSsrKSB7CiAJCW9mZnNldCA9ICgxIDw8IHItPnBhZ2Vfc2l6ZSkgKiBpb3BhZ2U7CkBAIC02NDgsMTMgKzY0NywxNCBAQAogc3RhdGljIGludCBkbWFfc2JfcmVnaW9uX2NyZWF0ZShzdHJ1Y3QgcHMzX2RtYV9yZWdpb24gKnIpCiB7CiAJaW50IHJlc3VsdDsKKwl1NjQgYnVzX2FkZHI7CiAKIAlEQkcoIiAtPiAlczolZDpcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CiAKIAlCVUdfT04oIXIpOwogCiAJaWYgKCFyLT5kZXYtPmJ1c19pZCkgewotCQlwcl9pbmZvKCIlczolZDogJWx1OiVsdSBubyBkbWFcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywKKwkJcHJfaW5mbygiJXM6JWQ6ICVsbHU6JWxsdSBubyBkbWFcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywKIAkJCXItPmRldi0+YnVzX2lkLCByLT5kZXYtPmRldl9pZCk7CiAJCXJldHVybiAwOwogCX0KQEAgLTY3MSw3ICs2NzEsOCBAQAogCiAJcmVzdWx0ID0gbHYxX2FsbG9jYXRlX2RldmljZV9kbWFfcmVnaW9uKHItPmRldi0+YnVzX2lkLCByLT5kZXYtPmRldl9pZCwKIAkJcm91bmR1cF9wb3dfb2ZfdHdvKHItPmxlbiksIHItPnBhZ2Vfc2l6ZSwgci0+cmVnaW9uX3R5cGUsCi0JCSZyLT5idXNfYWRkcik7CisJCSZidXNfYWRkcik7CisJci0+YnVzX2FkZHIgPSBidXNfYWRkcjsKIAogCWlmIChyZXN1bHQpIHsKIAkJREJHKCIlczolZDogbHYxX2FsbG9jYXRlX2RldmljZV9kbWFfcmVnaW9uIGZhaWxlZDogJXNcbiIsCkBAIC02ODUsNiArNjg2LDcgQEAKIHN0YXRpYyBpbnQgZG1hX2lvYzBfcmVnaW9uX2NyZWF0ZShzdHJ1Y3QgcHMzX2RtYV9yZWdpb24gKnIpCiB7CiAJaW50IHJlc3VsdDsKKwl1NjQgYnVzX2FkZHI7CiAKIAlJTklUX0xJU1RfSEVBRCgmci0+Y2h1bmtfbGlzdC5oZWFkKTsKIAlzcGluX2xvY2tfaW5pdCgmci0+Y2h1bmtfbGlzdC5sb2NrKTsKQEAgLTY5Miw3ICs2OTQsOCBAQAogCXJlc3VsdCA9IGx2MV9hbGxvY2F0ZV9pb19zZWdtZW50KDAsCiAJCQkJCSByLT5sZW4sCiAJCQkJCSByLT5wYWdlX3NpemUsCi0JCQkJCSAmci0+YnVzX2FkZHIpOworCQkJCQkgJmJ1c19hZGRyKTsKKwlyLT5idXNfYWRkciA9IGJ1c19hZGRyOwogCWlmIChyZXN1bHQpIHsKIAkJREJHKCIlczolZDogbHYxX2FsbG9jYXRlX2lvX3NlZ21lbnQgZmFpbGVkOiAlc1xuIiwKIAkJCV9fZnVuY19fLCBfX0xJTkVfXywgcHMzX3Jlc3VsdChyZXN1bHQpKTsKQEAgLTcyMCw3ICs3MjMsNyBAQAogCUJVR19PTighcik7CiAKIAlpZiAoIXItPmRldi0+YnVzX2lkKSB7Ci0JCXByX2luZm8oIiVzOiVkOiAlbHU6JWx1IG5vIGRtYVxuIiwgX19mdW5jX18sIF9fTElORV9fLAorCQlwcl9pbmZvKCIlczolZDogJWxsdTolbGx1IG5vIGRtYVxuIiwgX19mdW5jX18sIF9fTElORV9fLAogCQkJci0+ZGV2LT5idXNfaWQsIHItPmRldi0+ZGV2X2lkKTsKIAkJcmV0dXJuIDA7CiAJfQpAQCAtNzc3LDcgKzc4MCw3IEBACiAgKi8KIAogc3RhdGljIGludCBkbWFfc2JfbWFwX2FyZWEoc3RydWN0IHBzM19kbWFfcmVnaW9uICpyLCB1bnNpZ25lZCBsb25nIHZpcnRfYWRkciwKLQkgICB1bnNpZ25lZCBsb25nIGxlbiwgdW5zaWduZWQgbG9uZyAqYnVzX2FkZHIsCisJICAgdW5zaWduZWQgbG9uZyBsZW4sIGRtYV9hZGRyX3QgKmJ1c19hZGRyLAogCSAgIHU2NCBpb3B0ZV9mbGFnKQogewogCWludCByZXN1bHQ7CkBAIC04MDAsNyArODAzLDcgQEAKIAkJREJHKCIlczolZCBscGFyX2FkZHIgJWx4aFxuIiwgX19mdW5jX18sIF9fTElORV9fLAogCQkJbHBhcl9hZGRyKTsKIAkJREJHKCIlczolZCBsZW4gICAgICAgJWx4aFxuIiwgX19mdW5jX18sIF9fTElORV9fLCBsZW4pOwotCQlEQkcoIiVzOiVkIGJ1c19hZGRyICAlbHhoICglbHhoKVxuIiwgX19mdW5jX18sIF9fTElORV9fLAorCQlEQkcoIiVzOiVkIGJ1c19hZGRyICAlbGx4aCAoJWx4aClcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywKIAkJKmJ1c19hZGRyLCBsZW4pOwogCX0KIApAQCAtODMyLDcgKzgzNSw3IEBACiB9CiAKIHN0YXRpYyBpbnQgZG1hX2lvYzBfbWFwX2FyZWEoc3RydWN0IHBzM19kbWFfcmVnaW9uICpyLCB1bnNpZ25lZCBsb25nIHZpcnRfYWRkciwKLQkgICAgIHVuc2lnbmVkIGxvbmcgbGVuLCB1bnNpZ25lZCBsb25nICpidXNfYWRkciwKKwkgICAgIHVuc2lnbmVkIGxvbmcgbGVuLCBkbWFfYWRkcl90ICpidXNfYWRkciwKIAkgICAgIHU2NCBpb3B0ZV9mbGFnKQogewogCWludCByZXN1bHQ7CkBAIC04NzIsNyArODc1LDcgQEAKIAkJcmV0dXJuIHJlc3VsdDsKIAl9CiAJKmJ1c19hZGRyID0gYy0+YnVzX2FkZHIgKyBwaHlzX2FkZHIgLSBhbGlnbmVkX3BoeXM7Ci0JREJHKCIlczogdmE9JSNseCBwYT0lI2x4IGFfcGE9JSNseCBidXM9JSNseFxuIiwgX19mdW5jX18sCisJREJHKCIlczogdmE9JSNseCBwYT0lI2x4IGFfcGE9JSNseCBidXM9JSNsbHhcbiIsIF9fZnVuY19fLAogCSAgICB2aXJ0X2FkZHIsIHBoeXNfYWRkciwgYWxpZ25lZF9waHlzLCAqYnVzX2FkZHIpOwogCWMtPnVzYWdlX2NvdW50ID0gMTsKIApAQCAtODg5LDcgKzg5Miw3IEBACiAgKiBUaGlzIGlzIHRoZSBjb21tb24gZG1hIHVubWFwIHJvdXRpbmUuCiAgKi8KIAotc3RhdGljIGludCBkbWFfc2JfdW5tYXBfYXJlYShzdHJ1Y3QgcHMzX2RtYV9yZWdpb24gKnIsIHVuc2lnbmVkIGxvbmcgYnVzX2FkZHIsCitzdGF0aWMgaW50IGRtYV9zYl91bm1hcF9hcmVhKHN0cnVjdCBwczNfZG1hX3JlZ2lvbiAqciwgZG1hX2FkZHJfdCBidXNfYWRkciwKIAl1bnNpZ25lZCBsb25nIGxlbikKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwpAQCAtOTAzLDcgKzkwNiw3IEBACiAJCQkxIDw8IHItPnBhZ2Vfc2l6ZSk7CiAJCXVuc2lnbmVkIGxvbmcgYWxpZ25lZF9sZW4gPSBfQUxJR05fVVAobGVuICsgYnVzX2FkZHIKIAkJCS0gYWxpZ25lZF9idXMsIDEgPDwgci0+cGFnZV9zaXplKTsKLQkJREJHKCIlczolZDogbm90IGZvdW5kOiBidXNfYWRkciAlbHhoXG4iLAorCQlEQkcoIiVzOiVkOiBub3QgZm91bmQ6IGJ1c19hZGRyICVsbHhoXG4iLAogCQkJX19mdW5jX18sIF9fTElORV9fLCBidXNfYWRkcik7CiAJCURCRygiJXM6JWQ6IG5vdCBmb3VuZDogbGVuICVseGhcbiIsCiAJCQlfX2Z1bmNfXywgX19MSU5FX18sIGxlbik7CkBAIC05MjYsMTIgKzkyOSwxMiBAQAogfQogCiBzdGF0aWMgaW50IGRtYV9pb2MwX3VubWFwX2FyZWEoc3RydWN0IHBzM19kbWFfcmVnaW9uICpyLAotCQkJdW5zaWduZWQgbG9uZyBidXNfYWRkciwgdW5zaWduZWQgbG9uZyBsZW4pCisJCQlkbWFfYWRkcl90IGJ1c19hZGRyLCB1bnNpZ25lZCBsb25nIGxlbikKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXN0cnVjdCBkbWFfY2h1bmsgKmM7CiAKLQlEQkcoIiVzOiBzdGFydCBhPSUjbHggbD0lI2x4XG4iLCBfX2Z1bmNfXywgYnVzX2FkZHIsIGxlbik7CisJREJHKCIlczogc3RhcnQgYT0lI2xseCBsPSUjbHhcbiIsIF9fZnVuY19fLCBidXNfYWRkciwgbGVuKTsKIAlzcGluX2xvY2tfaXJxc2F2ZSgmci0+Y2h1bmtfbGlzdC5sb2NrLCBmbGFncyk7CiAJYyA9IGRtYV9maW5kX2NodW5rKHIsIGJ1c19hZGRyLCBsZW4pOwogCkBAIC05NDEsNyArOTQ0LDcgQEAKIAkJdW5zaWduZWQgbG9uZyBhbGlnbmVkX2xlbiA9IF9BTElHTl9VUChsZW4gKyBidXNfYWRkcgogCQkJCQkJICAgICAgLSBhbGlnbmVkX2J1cywKIAkJCQkJCSAgICAgIDEgPDwgci0+cGFnZV9zaXplKTsKLQkJREJHKCIlczolZDogbm90IGZvdW5kOiBidXNfYWRkciAlbHhoXG4iLAorCQlEQkcoIiVzOiVkOiBub3QgZm91bmQ6IGJ1c19hZGRyICVsbHhoXG4iLAogCQkgICAgX19mdW5jX18sIF9fTElORV9fLCBidXNfYWRkcik7CiAJCURCRygiJXM6JWQ6IG5vdCBmb3VuZDogbGVuICVseGhcbiIsCiAJCSAgICBfX2Z1bmNfXywgX19MSU5FX18sIGxlbik7CkBAIC05NzUsNyArOTc4LDggQEAKIHN0YXRpYyBpbnQgZG1hX3NiX3JlZ2lvbl9jcmVhdGVfbGluZWFyKHN0cnVjdCBwczNfZG1hX3JlZ2lvbiAqcikKIHsKIAlpbnQgcmVzdWx0OwotCXVuc2lnbmVkIGxvbmcgdmlydF9hZGRyLCBsZW4sIHRtcDsKKwl1bnNpZ25lZCBsb25nIHZpcnRfYWRkciwgbGVuOworCWRtYV9hZGRyX3QgdG1wOwogCiAJaWYgKHItPmxlbiA+IDE2KjEwMjQqMTAyNCkgewkvKiBGSVhNRTogbmVlZCBwcm9wZXIgZml4ICovCiAJCS8qIGZvcmNlIDE2TSBkbWEgcGFnZXMgZm9yIGxpbmVhciBtYXBwaW5nICovCkBAIC0xMDI3LDcgKzEwMzEsOCBAQAogc3RhdGljIGludCBkbWFfc2JfcmVnaW9uX2ZyZWVfbGluZWFyKHN0cnVjdCBwczNfZG1hX3JlZ2lvbiAqcikKIHsKIAlpbnQgcmVzdWx0OwotCXVuc2lnbmVkIGxvbmcgYnVzX2FkZHIsIGxlbiwgbHBhcl9hZGRyOworCWRtYV9hZGRyX3QgYnVzX2FkZHI7CisJdW5zaWduZWQgbG9uZyBsZW4sIGxwYXJfYWRkcjsKIAogCWlmIChyLT5vZmZzZXQgPCBtYXAucm0uc2l6ZSkgewogCQkvKiBVbm1hcCAocGFydCBvZikgMXN0IFJBTSBjaHVuayAqLwpAQCAtMTA3Miw3ICsxMDc3LDcgQEAKICAqLwogCiBzdGF0aWMgaW50IGRtYV9zYl9tYXBfYXJlYV9saW5lYXIoc3RydWN0IHBzM19kbWFfcmVnaW9uICpyLAotCXVuc2lnbmVkIGxvbmcgdmlydF9hZGRyLCB1bnNpZ25lZCBsb25nIGxlbiwgdW5zaWduZWQgbG9uZyAqYnVzX2FkZHIsCisJdW5zaWduZWQgbG9uZyB2aXJ0X2FkZHIsIHVuc2lnbmVkIGxvbmcgbGVuLCBkbWFfYWRkcl90ICpidXNfYWRkciwKIAl1NjQgaW9wdGVfZmxhZykKIHsKIAl1bnNpZ25lZCBsb25nIHBoeXNfYWRkciA9IGlzX2tlcm5lbF9hZGRyKHZpcnRfYWRkcikgPyBfX3BhKHZpcnRfYWRkcikKQEAgLTEwOTEsNyArMTA5Niw3IEBACiAgKi8KIAogc3RhdGljIGludCBkbWFfc2JfdW5tYXBfYXJlYV9saW5lYXIoc3RydWN0IHBzM19kbWFfcmVnaW9uICpyLAotCXVuc2lnbmVkIGxvbmcgYnVzX2FkZHIsIHVuc2lnbmVkIGxvbmcgbGVuKQorCWRtYV9hZGRyX3QgYnVzX2FkZHIsIHVuc2lnbmVkIGxvbmcgbGVuKQogewogCXJldHVybiAwOwogfTsKQEAgLTExNjksMTMgKzExNzQsMTMgQEAKIEVYUE9SVF9TWU1CT0wocHMzX2RtYV9yZWdpb25fZnJlZSk7CiAKIGludCBwczNfZG1hX21hcChzdHJ1Y3QgcHMzX2RtYV9yZWdpb24gKnIsIHVuc2lnbmVkIGxvbmcgdmlydF9hZGRyLAotCXVuc2lnbmVkIGxvbmcgbGVuLCB1bnNpZ25lZCBsb25nICpidXNfYWRkciwKKwl1bnNpZ25lZCBsb25nIGxlbiwgZG1hX2FkZHJfdCAqYnVzX2FkZHIsCiAJdTY0IGlvcHRlX2ZsYWcpCiB7CiAJcmV0dXJuIHItPnJlZ2lvbl9vcHMtPm1hcChyLCB2aXJ0X2FkZHIsIGxlbiwgYnVzX2FkZHIsIGlvcHRlX2ZsYWcpOwogfQogCi1pbnQgcHMzX2RtYV91bm1hcChzdHJ1Y3QgcHMzX2RtYV9yZWdpb24gKnIsIHVuc2lnbmVkIGxvbmcgYnVzX2FkZHIsCitpbnQgcHMzX2RtYV91bm1hcChzdHJ1Y3QgcHMzX2RtYV9yZWdpb24gKnIsIGRtYV9hZGRyX3QgYnVzX2FkZHIsCiAJdW5zaWduZWQgbG9uZyBsZW4pCiB7CiAJcmV0dXJuIHItPnJlZ2lvbl9vcHMtPnVubWFwKHIsIGJ1c19hZGRyLCBsZW4pOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvb3MtYXJlYS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvb3MtYXJlYS5jCmluZGV4IDFkMjAxNzguLmUxYzgzYzIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL29zLWFyZWEuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9vcy1hcmVhLmMKQEAgLTMwNiw3ICszMDYsNyBAQAogewogCXByX2RlYnVnKCIlczolZDogcC5ib290X2ZsYWc6ICAgICAgICV1XG4iLCBmdW5jLCBsaW5lLCBwLT5ib290X2ZsYWcpOwogCXByX2RlYnVnKCIlczolZDogcC5udW1fcGFyYW1zOiAgICAgICV1XG4iLCBmdW5jLCBsaW5lLCBwLT5udW1fcGFyYW1zKTsKLQlwcl9kZWJ1ZygiJXM6JWQ6IHAucnRjX2RpZmYgICAgICAgICAlbGRcbiIsIGZ1bmMsIGxpbmUsIHAtPnJ0Y19kaWZmKTsKKwlwcl9kZWJ1ZygiJXM6JWQ6IHAucnRjX2RpZmYgICAgICAgICAlbGxkXG4iLCBmdW5jLCBsaW5lLCBwLT5ydGNfZGlmZik7CiAJcHJfZGVidWcoIiVzOiVkOiBwLmF2X211bHRpX291dCAgICAgJXVcbiIsIGZ1bmMsIGxpbmUsIHAtPmF2X211bHRpX291dCk7CiAJcHJfZGVidWcoIiVzOiVkOiBwLmN0cmxfYnV0dG9uOiAgICAgJXVcbiIsIGZ1bmMsIGxpbmUsIHAtPmN0cmxfYnV0dG9uKTsKIAlwcl9kZWJ1ZygiJXM6JWQ6IHAuc3RhdGljX2lwX2FkZHI6ICAldS4ldS4ldS4ldVxuIiwgZnVuYywgbGluZSwKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL3JlcG9zaXRvcnkuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL3JlcG9zaXRvcnkuYwppbmRleCAyMjA2M2FkLi41ZTMwNGMyIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9yZXBvc2l0b3J5LmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvcmVwb3NpdG9yeS5jCkBAIC00NCw3ICs0NCw3IEBACiAJCXNbaV0gPSAoaW5baV0gPD0gMTI2ICYmIGluW2ldID49IDMyKSA/IGluW2ldIDogJy4nOwogCXNbaV0gPSAwOwogCi0JcHJfZGVidWcoIiVzOiVkOiAlcyUwMTZseCA6ICVzXG4iLCBmdW5jLCBsaW5lLCBoZHIsIG4sIHMpOworCXByX2RlYnVnKCIlczolZDogJXMlMDE2bGx4IDogJXNcbiIsIGZ1bmMsIGxpbmUsIGhkciwgbiwgcyk7CiAjZW5kaWYKIH0KIApAQCAtNzAsOCArNzAsOCBAQAogCV9kdW1wX2ZpZWxkKCJuMjogIiwgbjIsIGZ1bmMsIGxpbmUpOwogCV9kdW1wX2ZpZWxkKCJuMzogIiwgbjMsIGZ1bmMsIGxpbmUpOwogCV9kdW1wX2ZpZWxkKCJuNDogIiwgbjQsIGZ1bmMsIGxpbmUpOwotCXByX2RlYnVnKCIlczolZDogdjE6ICUwMTZseFxuIiwgZnVuYywgbGluZSwgdjEpOwotCXByX2RlYnVnKCIlczolZDogdjI6ICUwMTZseFxuIiwgZnVuYywgbGluZSwgdjIpOworCXByX2RlYnVnKCIlczolZDogdjE6ICUwMTZsbHhcbiIsIGZ1bmMsIGxpbmUsIHYxKTsKKwlwcl9kZWJ1ZygiJXM6JWQ6IHYyOiAlMDE2bGx4XG4iLCBmdW5jLCBsaW5lLCB2Mik7CiB9CiAKIC8qKgpAQCAtMTQ5LDEwICsxNDksMTAgQEAKIAkJKl92MiA9IHYyOwogCiAJaWYgKHYxICYmICFfdjEpCi0JCXByX2RlYnVnKCIlczolZDogd2FybmluZzogZGlzY2FyZGluZyBub24temVybyB2MTogJTAxNmx4XG4iLAorCQlwcl9kZWJ1ZygiJXM6JWQ6IHdhcm5pbmc6IGRpc2NhcmRpbmcgbm9uLXplcm8gdjE6ICUwMTZsbHhcbiIsCiAJCQlfX2Z1bmNfXywgX19MSU5FX18sIHYxKTsKIAlpZiAodjIgJiYgIV92MikKLQkJcHJfZGVidWcoIiVzOiVkOiB3YXJuaW5nOiBkaXNjYXJkaW5nIG5vbi16ZXJvIHYyOiAlMDE2bHhcbiIsCisJCXByX2RlYnVnKCIlczolZDogd2FybmluZzogZGlzY2FyZGluZyBub24temVybyB2MjogJTAxNmxseFxuIiwKIAkJCV9fZnVuY19fLCBfX0xJTkVfXywgdjIpOwogCiAJcmV0dXJuIDA7CkBAIC0zMjcsNyArMzI3LDcgQEAKIAkJcmV0dXJuIHJlc3VsdDsKIAl9CiAKLQlwcl9kZWJ1ZygiJXM6JWQ6IGJ1c190eXBlICV1LCBidXNfaW5kZXggJXUsIGJ1c19pZCAlbHUsIG51bV9kZXYgJXVcbiIsCisJcHJfZGVidWcoIiVzOiVkOiBidXNfdHlwZSAldSwgYnVzX2luZGV4ICV1LCBidXNfaWQgJWxsdSwgbnVtX2RldiAldVxuIiwKIAkJX19mdW5jX18sIF9fTElORV9fLCB0bXAuYnVzX3R5cGUsIHRtcC5idXNfaW5kZXgsIHRtcC5idXNfaWQsCiAJCW51bV9kZXYpOwogCkBAIC0zNTMsNyArMzUzLDcgQEAKIAkJcmV0dXJuIHJlc3VsdDsKIAl9CiAKLQlwcl9kZWJ1ZygiJXM6JWQ6IGZvdW5kOiBkZXZfdHlwZSAldSwgZGV2X2luZGV4ICV1LCBkZXZfaWQgJWx1XG4iLAorCXByX2RlYnVnKCIlczolZDogZm91bmQ6IGRldl90eXBlICV1LCBkZXZfaW5kZXggJXUsIGRldl9pZCAlbGx1XG4iLAogCQlfX2Z1bmNfXywgX19MSU5FX18sIHRtcC5kZXZfdHlwZSwgdG1wLmRldl9pbmRleCwgdG1wLmRldl9pZCk7CiAKIAkqcmVwbyA9IHRtcDsKQEAgLTM2Nyw3ICszNjcsNyBAQAogCXN0cnVjdCBwczNfcmVwb3NpdG9yeV9kZXZpY2UgdG1wOwogCXVuc2lnbmVkIGludCBudW1fZGV2OwogCi0JcHJfZGVidWcoIiAtPiAlczoldTogZmluZCBkZXZpY2UgYnkgaWQgJWx1OiVsdVxuIiwgX19mdW5jX18sIF9fTElORV9fLAorCXByX2RlYnVnKCIgLT4gJXM6JXU6IGZpbmQgZGV2aWNlIGJ5IGlkICVsbHU6JWxsdVxuIiwgX19mdW5jX18sIF9fTElORV9fLAogCQkgYnVzX2lkLCBkZXZfaWQpOwogCiAJZm9yICh0bXAuYnVzX2luZGV4ID0gMDsgdG1wLmJ1c19pbmRleCA8IDEwOyB0bXAuYnVzX2luZGV4KyspIHsKQEAgLTM4Miw3ICszODIsNyBAQAogCQlpZiAodG1wLmJ1c19pZCA9PSBidXNfaWQpCiAJCQlnb3RvIGZvdW5kX2J1czsKIAotCQlwcl9kZWJ1ZygiJXM6JXU6IHNraXAsIGJ1c19pZCAlbHVcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywKKwkJcHJfZGVidWcoIiVzOiV1OiBza2lwLCBidXNfaWQgJWxsdVxuIiwgX19mdW5jX18sIF9fTElORV9fLAogCQkJIHRtcC5idXNfaWQpOwogCX0KIAlwcl9kZWJ1ZygiIDwtICVzOiV1OiBidXMgbm90IGZvdW5kXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwpAQCAtNDE2LDcgKzQxNiw3IEBACiAJCWlmICh0bXAuZGV2X2lkID09IGRldl9pZCkKIAkJCWdvdG8gZm91bmRfZGV2OwogCi0JCXByX2RlYnVnKCIlczoldTogc2tpcCwgZGV2X2lkICVsdVxuIiwgX19mdW5jX18sIF9fTElORV9fLAorCQlwcl9kZWJ1ZygiJXM6JXU6IHNraXAsIGRldl9pZCAlbGx1XG4iLCBfX2Z1bmNfXywgX19MSU5FX18sCiAJCQkgdG1wLmRldl9pZCk7CiAJfQogCXByX2RlYnVnKCIgPC0gJXM6JXU6IGRldiBub3QgZm91bmRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CkBAIC00MzAsNyArNDMwLDcgQEAKIAkJcmV0dXJuIHJlc3VsdDsKIAl9CiAKLQlwcl9kZWJ1ZygiIDwtICVzOiV1OiBmb3VuZDogdHlwZSAoJXU6JXUpIGluZGV4ICgldToldSkgaWQgKCVsdTolbHUpXG4iLAorCXByX2RlYnVnKCIgPC0gJXM6JXU6IGZvdW5kOiB0eXBlICgldToldSkgaW5kZXggKCV1OiV1KSBpZCAoJWxsdTolbGx1KVxuIiwKIAkJIF9fZnVuY19fLCBfX0xJTkVfXywgdG1wLmJ1c190eXBlLCB0bXAuZGV2X3R5cGUsIHRtcC5idXNfaW5kZXgsCiAJCSB0bXAuZGV2X2luZGV4LCB0bXAuYnVzX2lkLCB0bXAuZGV2X2lkKTsKIAkqcmVwbyA9IHRtcDsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL3NldHVwLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9zZXR1cC5jCmluZGV4IDM1ZjNlODUuLjMzMzFjY2IgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL3NldHVwLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvc2V0dXAuYwpAQCAtMTg2LDcgKzE4Niw3IEBACiAjZGVmaW5lIHByZWFsbG9jX3BzM2ZsYXNoX2JvdW5jZV9idWZmZXIoKQlkbyB7IH0gd2hpbGUgKDApCiAjZW5kaWYKIAotc3RhdGljIGludCBwczNfc2V0X2RhYnIodTY0IGRhYnIpCitzdGF0aWMgaW50IHBzM19zZXRfZGFicih1bnNpZ25lZCBsb25nIGRhYnIpCiB7CiAJZW51bSB7REFCUl9VU0VSID0gMSwgREFCUl9LRVJORUwgPSAyLH07CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL3NwdS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvc3B1LmMKaW5kZXggY2NhZTNkNC4uYjNjNmE5OSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvc3B1LmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvc3B1LmMKQEAgLTE0OSw3ICsxNDksNyBAQAogCiBzdGF0aWMgdW5zaWduZWQgbG9uZyBnZXRfdmFzX2lkKHZvaWQpCiB7Ci0JdW5zaWduZWQgbG9uZyBpZDsKKwl1NjQgaWQ7CiAKIAlsdjFfZ2V0X2xvZ2ljYWxfcHBlX2lkKCZpZCk7CiAJbHYxX2dldF92aXJ0dWFsX2FkZHJlc3Nfc3BhY2VfaWRfb2ZfcHBlKGlkLCAmaWQpOwpAQCAtMTYwLDE0ICsxNjAsMTggQEAKIHN0YXRpYyBpbnQgX19pbml0IGNvbnN0cnVjdF9zcHUoc3RydWN0IHNwdSAqc3B1KQogewogCWludCByZXN1bHQ7Ci0JdW5zaWduZWQgbG9uZyB1bnVzZWQ7CisJdTY0IHVudXNlZDsKKwl1NjQgcHJvYmxlbV9waHlzOworCXU2NCBsb2NhbF9zdG9yZV9waHlzOwogCiAJcmVzdWx0ID0gbHYxX2NvbnN0cnVjdF9sb2dpY2FsX3NwZShQQUdFX1NISUZULCBQQUdFX1NISUZULCBQQUdFX1NISUZULAogCQlQQUdFX1NISUZULCBQQUdFX1NISUZULCBnZXRfdmFzX2lkKCksIFNQRV9UWVBFX0xPR0lDQUwsCi0JCSZzcHVfcGRhdGEoc3B1KS0+cHJpdjJfYWRkciwgJnNwdS0+cHJvYmxlbV9waHlzLAotCQkmc3B1LT5sb2NhbF9zdG9yZV9waHlzLCAmdW51c2VkLAorCQkmc3B1X3BkYXRhKHNwdSktPnByaXYyX2FkZHIsICZwcm9ibGVtX3BoeXMsCisJCSZsb2NhbF9zdG9yZV9waHlzLCAmdW51c2VkLAogCQkmc3B1X3BkYXRhKHNwdSktPnNoYWRvd19hZGRyLAogCQkmc3B1X3BkYXRhKHNwdSktPnNwZV9pZCk7CisJc3B1LT5wcm9ibGVtX3BoeXMgPSBwcm9ibGVtX3BoeXM7CisJc3B1LT5sb2NhbF9zdG9yZV9waHlzID0gbG9jYWxfc3RvcmVfcGh5czsKIAogCWlmIChyZXN1bHQpIHsKIAkJcHJfZGVidWcoIiVzOiVkOiBsdjFfY29uc3RydWN0X2xvZ2ljYWxfc3BlIGZhaWxlZDogJXNcbiIsCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9zeXN0ZW0tYnVzLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9zeXN0ZW0tYnVzLmMKaW5kZXggZWUwZDIyOS4uNTgzMTFhOCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvc3lzdGVtLWJ1cy5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL3N5c3RlbS1idXMuYwpAQCAtMTgyLDcgKzE4Miw3IEBACiAJY2FzZSBQUzNfTUFUQ0hfSURfU1lTVEVNX01BTkFHRVI6CiAJCXByX2RlYnVnKCIlczolZDogdW5zdXBwb3J0ZWQgbWF0Y2hfaWQ6ICV1XG4iLCBfX2Z1bmNfXywKIAkJCV9fTElORV9fLCBkZXYtPm1hdGNoX2lkKTsKLQkJcHJfZGVidWcoIiVzOiVkOiBidXNfaWQ6ICVsdVxuIiwgX19mdW5jX18sIF9fTElORV9fLAorCQlwcl9kZWJ1ZygiJXM6JWQ6IGJ1c19pZDogJWxsdVxuIiwgX19mdW5jX18sIF9fTElORV9fLAogCQkJZGV2LT5idXNfaWQpOwogCQlCVUcoKTsKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0yMjAsNyArMjIwLDcgQEAKIAljYXNlIFBTM19NQVRDSF9JRF9TWVNURU1fTUFOQUdFUjoKIAkJcHJfZGVidWcoIiVzOiVkOiB1bnN1cHBvcnRlZCBtYXRjaF9pZDogJXVcbiIsIF9fZnVuY19fLAogCQkJX19MSU5FX18sIGRldi0+bWF0Y2hfaWQpOwotCQlwcl9kZWJ1ZygiJXM6JWQ6IGJ1c19pZDogJWx1XG4iLCBfX2Z1bmNfXywgX19MSU5FX18sCisJCXByX2RlYnVnKCIlczolZDogYnVzX2lkOiAlbGx1XG4iLCBfX2Z1bmNfXywgX19MSU5FX18sCiAJCQlkZXYtPmJ1c19pZCk7CiAJCUJVRygpOwogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTI0MCw3ICsyNDAsNyBAQAogc3RhdGljIHZvaWQgX2R1bXBfbW1pb19yZWdpb24oY29uc3Qgc3RydWN0IHBzM19tbWlvX3JlZ2lvbiogciwKIAljb25zdCBjaGFyKiBmdW5jLCBpbnQgbGluZSkKIHsKLQlwcl9kZWJ1ZygiJXM6JWQ6IGRldiAgICAgICAlbHU6JWx1XG4iLCBmdW5jLCBsaW5lLCByLT5kZXYtPmJ1c19pZCwKKwlwcl9kZWJ1ZygiJXM6JWQ6IGRldiAgICAgICAlbGx1OiVsbHVcbiIsIGZ1bmMsIGxpbmUsIHItPmRldi0+YnVzX2lkLAogCQlyLT5kZXYtPmRldl9pZCk7CiAJcHJfZGVidWcoIiVzOiVkOiBidXNfYWRkciAgJWx4aFxuIiwgZnVuYywgbGluZSwgci0+YnVzX2FkZHIpOwogCXByX2RlYnVnKCIlczolZDogbGVuICAgICAgICVseGhcbiIsIGZ1bmMsIGxpbmUsIHItPmxlbik7CkBAIC0yNTAsOSArMjUwLDExIEBACiBzdGF0aWMgaW50IHBzM19zYl9tbWlvX3JlZ2lvbl9jcmVhdGUoc3RydWN0IHBzM19tbWlvX3JlZ2lvbiAqcikKIHsKIAlpbnQgcmVzdWx0OworCXU2NCBscGFyX2FkZHI7CiAKIAlyZXN1bHQgPSBsdjFfbWFwX2RldmljZV9tbWlvX3JlZ2lvbihyLT5kZXYtPmJ1c19pZCwgci0+ZGV2LT5kZXZfaWQsCi0JCXItPmJ1c19hZGRyLCByLT5sZW4sIHItPnBhZ2Vfc2l6ZSwgJnItPmxwYXJfYWRkcik7CisJCXItPmJ1c19hZGRyLCByLT5sZW4sIHItPnBhZ2Vfc2l6ZSwgJmxwYXJfYWRkcik7CisJci0+bHBhcl9hZGRyID0gbHBhcl9hZGRyOwogCiAJaWYgKHJlc3VsdCkgewogCQlwcl9kZWJ1ZygiJXM6JWQ6IGx2MV9tYXBfZGV2aWNlX21taW9fcmVnaW9uIGZhaWxlZDogJXNcbiIsCkBAIC01NjgsNyArNTcwLDcgQEAKIHsKIAlzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYgPSBwczNfZGV2X3RvX3N5c3RlbV9idXNfZGV2KF9kZXYpOwogCWludCByZXN1bHQ7Ci0JdW5zaWduZWQgbG9uZyBidXNfYWRkcjsKKwlkbWFfYWRkcl90IGJ1c19hZGRyOwogCXZvaWQgKnB0ciA9IHBhZ2VfYWRkcmVzcyhwYWdlKSArIG9mZnNldDsKIAogCXJlc3VsdCA9IHBzM19kbWFfbWFwKGRldi0+ZF9yZWdpb24sICh1bnNpZ25lZCBsb25nKXB0ciwgc2l6ZSwKQEAgLTU5MCw3ICs1OTIsNyBAQAogewogCXN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldiA9IHBzM19kZXZfdG9fc3lzdGVtX2J1c19kZXYoX2Rldik7CiAJaW50IHJlc3VsdDsKLQl1bnNpZ25lZCBsb25nIGJ1c19hZGRyOworCWRtYV9hZGRyX3QgYnVzX2FkZHI7CiAJdTY0IGlvcHRlX2ZsYWc7CiAJdm9pZCAqcHRyID0gcGFnZV9hZGRyZXNzKHBhZ2UpICsgb2Zmc2V0OwogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvaW9tbXUuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9pb21tdS5jCmluZGV4IGM5MDgxN2EuLjNlZTAxYjQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9pb21tdS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9pb21tdS5jCkBAIC0xMjcsMTAgKzEyNywxMCBAQAogCQl9CiAKIAkJaWYgKHJjICYmIHByaW50a19yYXRlbGltaXQoKSkgewotCQkJcHJpbnRrKCJ0Y2VfYnVpbGRfcFNlcmllc0xQOiBwbHBhcl90Y2VfcHV0IGZhaWxlZC4gcmM9JWxkXG4iLCByYyk7Ci0JCQlwcmludGsoIlx0aW5kZXggICA9IDB4JWx4XG4iLCAodTY0KXRibC0+aXRfaW5kZXgpOwotCQkJcHJpbnRrKCJcdHRjZW51bSAgPSAweCVseFxuIiwgKHU2NCl0Y2VudW0pOwotCQkJcHJpbnRrKCJcdHRjZSB2YWwgPSAweCVseFxuIiwgdGNlICk7CisJCQlwcmludGsoInRjZV9idWlsZF9wU2VyaWVzTFA6IHBscGFyX3RjZV9wdXQgZmFpbGVkLiByYz0lbGxkXG4iLCByYyk7CisJCQlwcmludGsoIlx0aW5kZXggICA9IDB4JWxseFxuIiwgKHU2NCl0YmwtPml0X2luZGV4KTsKKwkJCXByaW50aygiXHR0Y2VudW0gID0gMHglbGx4XG4iLCAodTY0KXRjZW51bSk7CisJCQlwcmludGsoIlx0dGNlIHZhbCA9IDB4JWxseFxuIiwgdGNlICk7CiAJCQlzaG93X3N0YWNrKGN1cnJlbnQsICh1bnNpZ25lZCBsb25nICopX19nZXRfU1AoKSk7CiAJCX0KIApAQCAtMjEwLDEwICsyMTAsMTAgQEAKIAl9CiAKIAlpZiAocmMgJiYgcHJpbnRrX3JhdGVsaW1pdCgpKSB7Ci0JCXByaW50aygidGNlX2J1aWxkbXVsdGlfcFNlcmllc0xQOiBwbHBhcl90Y2VfcHV0IGZhaWxlZC4gcmM9JWxkXG4iLCByYyk7Ci0JCXByaW50aygiXHRpbmRleCAgID0gMHglbHhcbiIsICh1NjQpdGJsLT5pdF9pbmRleCk7Ci0JCXByaW50aygiXHRucGFnZXMgID0gMHglbHhcbiIsICh1NjQpbnBhZ2VzKTsKLQkJcHJpbnRrKCJcdHRjZVswXSB2YWwgPSAweCVseFxuIiwgdGNlcFswXSk7CisJCXByaW50aygidGNlX2J1aWxkbXVsdGlfcFNlcmllc0xQOiBwbHBhcl90Y2VfcHV0IGZhaWxlZC4gcmM9JWxsZFxuIiwgcmMpOworCQlwcmludGsoIlx0aW5kZXggICA9IDB4JWxseFxuIiwgKHU2NCl0YmwtPml0X2luZGV4KTsKKwkJcHJpbnRrKCJcdG5wYWdlcyAgPSAweCVsbHhcbiIsICh1NjQpbnBhZ2VzKTsKKwkJcHJpbnRrKCJcdHRjZVswXSB2YWwgPSAweCVsbHhcbiIsIHRjZXBbMF0pOwogCQlzaG93X3N0YWNrKGN1cnJlbnQsICh1bnNpZ25lZCBsb25nICopX19nZXRfU1AoKSk7CiAJfQogCXJldHVybiByZXQ7CkBAIC0yMjcsOSArMjI3LDkgQEAKIAkJcmMgPSBwbHBhcl90Y2VfcHV0KCh1NjQpdGJsLT5pdF9pbmRleCwgKHU2NCl0Y2VudW0gPDwgMTIsIDApOwogCiAJCWlmIChyYyAmJiBwcmludGtfcmF0ZWxpbWl0KCkpIHsKLQkJCXByaW50aygidGNlX2ZyZWVfcFNlcmllc0xQOiBwbHBhcl90Y2VfcHV0IGZhaWxlZC4gcmM9JWxkXG4iLCByYyk7Ci0JCQlwcmludGsoIlx0aW5kZXggICA9IDB4JWx4XG4iLCAodTY0KXRibC0+aXRfaW5kZXgpOwotCQkJcHJpbnRrKCJcdHRjZW51bSAgPSAweCVseFxuIiwgKHU2NCl0Y2VudW0pOworCQkJcHJpbnRrKCJ0Y2VfZnJlZV9wU2VyaWVzTFA6IHBscGFyX3RjZV9wdXQgZmFpbGVkLiByYz0lbGxkXG4iLCByYyk7CisJCQlwcmludGsoIlx0aW5kZXggICA9IDB4JWxseFxuIiwgKHU2NCl0YmwtPml0X2luZGV4KTsKKwkJCXByaW50aygiXHR0Y2VudW0gID0gMHglbGx4XG4iLCAodTY0KXRjZW51bSk7CiAJCQlzaG93X3N0YWNrKGN1cnJlbnQsICh1bnNpZ25lZCBsb25nICopX19nZXRfU1AoKSk7CiAJCX0KIApAQCAtMjQ2LDkgKzI0Niw5IEBACiAKIAlpZiAocmMgJiYgcHJpbnRrX3JhdGVsaW1pdCgpKSB7CiAJCXByaW50aygidGNlX2ZyZWVtdWx0aV9wU2VyaWVzTFA6IHBscGFyX3RjZV9zdHVmZiBmYWlsZWRcbiIpOwotCQlwcmludGsoIlx0cmMgICAgICA9ICVsZFxuIiwgcmMpOwotCQlwcmludGsoIlx0aW5kZXggICA9IDB4JWx4XG4iLCAodTY0KXRibC0+aXRfaW5kZXgpOwotCQlwcmludGsoIlx0bnBhZ2VzICA9IDB4JWx4XG4iLCAodTY0KW5wYWdlcyk7CisJCXByaW50aygiXHRyYyAgICAgID0gJWxsZFxuIiwgcmMpOworCQlwcmludGsoIlx0aW5kZXggICA9IDB4JWxseFxuIiwgKHU2NCl0YmwtPml0X2luZGV4KTsKKwkJcHJpbnRrKCJcdG5wYWdlcyAgPSAweCVsbHhcbiIsICh1NjQpbnBhZ2VzKTsKIAkJc2hvd19zdGFjayhjdXJyZW50LCAodW5zaWduZWQgbG9uZyAqKV9fZ2V0X1NQKCkpOwogCX0KIH0KQEAgLTI2MSwxMCArMjYxLDkgQEAKIAlyYyA9IHBscGFyX3RjZV9nZXQoKHU2NCl0YmwtPml0X2luZGV4LCAodTY0KXRjZW51bSA8PCAxMiwgJnRjZV9yZXQpOwogCiAJaWYgKHJjICYmIHByaW50a19yYXRlbGltaXQoKSkgewotCQlwcmludGsoInRjZV9nZXRfcFNlcmllc0xQOiBwbHBhcl90Y2VfZ2V0IGZhaWxlZC4gcmM9JWxkXG4iLAotCQkJcmMpOwotCQlwcmludGsoIlx0aW5kZXggICA9IDB4JWx4XG4iLCAodTY0KXRibC0+aXRfaW5kZXgpOwotCQlwcmludGsoIlx0dGNlbnVtICA9IDB4JWx4XG4iLCAodTY0KXRjZW51bSk7CisJCXByaW50aygidGNlX2dldF9wU2VyaWVzTFA6IHBscGFyX3RjZV9nZXQgZmFpbGVkLiByYz0lbGxkXG4iLCByYyk7CisJCXByaW50aygiXHRpbmRleCAgID0gMHglbGx4XG4iLCAodTY0KXRibC0+aXRfaW5kZXgpOworCQlwcmludGsoIlx0dGNlbnVtICA9IDB4JWxseFxuIiwgKHU2NCl0Y2VudW0pOwogCQlzaG93X3N0YWNrKGN1cnJlbnQsICh1bnNpZ25lZCBsb25nICopX19nZXRfU1AoKSk7CiAJfQogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvc3lzZGV2L01ha2VmaWxlIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9NYWtlZmlsZQppbmRleCA1YWZjZTExLi5iMzNiMjhhIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvc3lzZGV2L01ha2VmaWxlCisrKyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvTWFrZWZpbGUKQEAgLTE3LDYgKzE3LDcgQEAKIG9iai0kKENPTkZJR19GU0xfTEJDKQkJKz0gZnNsX2xiYy5vCiBvYmotJChDT05GSUdfRlNMX0dUTSkJCSs9IGZzbF9ndG0ubwogb2JqLSQoQ09ORklHX01QQzh4eHhfR1BJTykJKz0gbXBjOHh4eF9ncGlvLm8KK29iai0kKENPTkZJR19TSU1QTEVfR1BJTykJKz0gc2ltcGxlX2dwaW8ubwogb2JqLSQoQ09ORklHX1JBUElESU8pCQkrPSBmc2xfcmlvLm8KIG9iai0kKENPTkZJR19UU0kxMDhfQlJJREdFKQkrPSB0c2kxMDhfcGNpLm8gdHNpMTA4X2Rldi5vCiBvYmotJChDT05GSUdfUVVJQ0NfRU5HSU5FKQkrPSBxZV9saWIvCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvc3lzZGV2L2ZzbF9wY2kuYyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvZnNsX3BjaS5jCmluZGV4IGQ1ZjlhZTAuLjk4MTdmNjMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvZnNsX3BjaS5jCisrKyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvZnNsX3BjaS5jCkBAIC0yOCw2NSArMjgsMTA3IEBACiAjaW5jbHVkZSA8c3lzZGV2L2ZzbF9wY2kuaD4KIAogI2lmIGRlZmluZWQoQ09ORklHX1BQQ184NXh4KSB8fCBkZWZpbmVkKENPTkZJR19QUENfODZ4eCkKK3N0YXRpYyBpbnQgX19pbml0IHNldHVwX29uZV9hdG11KHN0cnVjdCBjY3NyX3BjaSBfX2lvbWVtICpwY2ksCisJdW5zaWduZWQgaW50IGluZGV4LCBjb25zdCBzdHJ1Y3QgcmVzb3VyY2UgKnJlcywKKwlyZXNvdXJjZV9zaXplX3Qgb2Zmc2V0KQoreworCXJlc291cmNlX3NpemVfdCBwY2lfYWRkciA9IHJlcy0+c3RhcnQgLSBvZmZzZXQ7CisJcmVzb3VyY2Vfc2l6ZV90IHBoeXNfYWRkciA9IHJlcy0+c3RhcnQ7CisJcmVzb3VyY2Vfc2l6ZV90IHNpemUgPSByZXMtPmVuZCAtIHJlcy0+c3RhcnQgKyAxOworCXUzMiBmbGFncyA9IDB4ODAwNDQwMDA7IC8qIGVuYWJsZSAmIG1lbSBSL1cgKi8KKwl1bnNpZ25lZCBpbnQgaTsKKworCXByX2RlYnVnKCJQQ0kgTUVNIHJlc291cmNlIHN0YXJ0IDB4JTAxNmxseCwgc2l6ZSAweCUwMTZsbHguXG4iLAorCQkodTY0KXJlcy0+c3RhcnQsICh1NjQpc2l6ZSk7CisKKwlpZiAocmVzLT5mbGFncyAmIElPUkVTT1VSQ0VfUFJFRkVUQ0gpCisJCWZsYWdzIHw9IDB4MTAwMDAwMDA7IC8qIGVuYWJsZSByZWxheGVkIG9yZGVyaW5nICovCisKKwlmb3IgKGkgPSAwOyBzaXplID4gMDsgaSsrKSB7CisJCXVuc2lnbmVkIGludCBiaXRzID0gbWluKF9faWxvZzIoc2l6ZSksCisJCQkJCV9fZmZzKHBjaV9hZGRyIHwgcGh5c19hZGRyKSk7CisKKwkJaWYgKGluZGV4ICsgaSA+PSA1KQorCQkJcmV0dXJuIC0xOworCisJCW91dF9iZTMyKCZwY2ktPnBvd1tpbmRleCArIGldLnBvdGFyLCBwY2lfYWRkciA+PiAxMik7CisJCW91dF9iZTMyKCZwY2ktPnBvd1tpbmRleCArIGldLnBvdGVhciwgKHU2NClwY2lfYWRkciA+PiA0NCk7CisJCW91dF9iZTMyKCZwY2ktPnBvd1tpbmRleCArIGldLnBvd2JhciwgcGh5c19hZGRyID4+IDEyKTsKKwkJb3V0X2JlMzIoJnBjaS0+cG93W2luZGV4ICsgaV0ucG93YXIsIGZsYWdzIHwgKGJpdHMgLSAxKSk7CisKKwkJcGNpX2FkZHIgKz0gKHJlc291cmNlX3NpemVfdCkxVSA8PCBiaXRzOworCQlwaHlzX2FkZHIgKz0gKHJlc291cmNlX3NpemVfdCkxVSA8PCBiaXRzOworCQlzaXplIC09IChyZXNvdXJjZV9zaXplX3QpMVUgPDwgYml0czsKKwl9CisKKwlyZXR1cm4gaTsKK30KKwogLyogYXRtdSBzZXR1cCBmb3IgZnNsIHBjaS9wY2llIGNvbnRyb2xsZXIgKi8KLXZvaWQgX19pbml0IHNldHVwX3BjaV9hdG11KHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSwgc3RydWN0IHJlc291cmNlICpyc3JjKQorc3RhdGljIHZvaWQgX19pbml0IHNldHVwX3BjaV9hdG11KHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSwKKwkJCQkgIHN0cnVjdCByZXNvdXJjZSAqcnNyYykKIHsKIAlzdHJ1Y3QgY2Nzcl9wY2kgX19pb21lbSAqcGNpOwotCWludCBpOworCWludCBpLCBqLCBuOwogCiAJcHJfZGVidWcoIlBDSSBtZW1vcnkgbWFwIHN0YXJ0IDB4JTAxNmxseCwgc2l6ZSAweCUwMTZsbHhcbiIsCiAJCSAgICAodTY0KXJzcmMtPnN0YXJ0LCAodTY0KXJzcmMtPmVuZCAtICh1NjQpcnNyYy0+c3RhcnQgKyAxKTsKIAlwY2kgPSBpb3JlbWFwKHJzcmMtPnN0YXJ0LCByc3JjLT5lbmQgLSByc3JjLT5zdGFydCArIDEpOworCWlmICghcGNpKSB7CisJICAgIGRldl9lcnIoaG9zZS0+cGFyZW50LCAiVW5hYmxlIHRvIG1hcCBBVE1VIHJlZ2lzdGVyc1xuIik7CisJICAgIHJldHVybjsKKwl9CiAKLQkvKiBEaXNhYmxlIGFsbCB3aW5kb3dzIChleGNlcHQgcG93YXIwIHNpbmNlIGl0cyBpZ25vcmVkKSAqLworCS8qIERpc2FibGUgYWxsIHdpbmRvd3MgKGV4Y2VwdCBwb3dhcjAgc2luY2UgaXQncyBpZ25vcmVkKSAqLwogCWZvcihpID0gMTsgaSA8IDU7IGkrKykKIAkJb3V0X2JlMzIoJnBjaS0+cG93W2ldLnBvd2FyLCAwKTsKIAlmb3IoaSA9IDA7IGkgPCAzOyBpKyspCiAJCW91dF9iZTMyKCZwY2ktPnBpd1tpXS5waXdhciwgMCk7CiAKIAkvKiBTZXR1cCBvdXRib3VuZCBNRU0gd2luZG93ICovCi0JZm9yKGkgPSAwOyBpIDwgMzsgaSsrKQotCQlpZiAoaG9zZS0+bWVtX3Jlc291cmNlc1tpXS5mbGFncyAmIElPUkVTT1VSQ0VfTUVNKXsKLQkJCXJlc291cmNlX3NpemVfdCBwY2lfYWRkcl9zdGFydCA9Ci0JCQkJIGhvc2UtPm1lbV9yZXNvdXJjZXNbaV0uc3RhcnQgLQotCQkJCSBob3NlLT5wY2lfbWVtX29mZnNldDsKLQkJCXByX2RlYnVnKCJQQ0kgTUVNIHJlc291cmNlIHN0YXJ0IDB4JTAxNmxseCwgc2l6ZSAweCUwMTZsbHguXG4iLAotCQkJCSh1NjQpaG9zZS0+bWVtX3Jlc291cmNlc1tpXS5zdGFydCwKLQkJCQkodTY0KWhvc2UtPm1lbV9yZXNvdXJjZXNbaV0uZW5kCi0JCQkJICAtICh1NjQpaG9zZS0+bWVtX3Jlc291cmNlc1tpXS5zdGFydCArIDEpOwotCQkJb3V0X2JlMzIoJnBjaS0+cG93W2krMV0ucG90YXIsIChwY2lfYWRkcl9zdGFydCA+PiAxMikpOwotCQkJb3V0X2JlMzIoJnBjaS0+cG93W2krMV0ucG90ZWFyLCAwKTsKLQkJCW91dF9iZTMyKCZwY2ktPnBvd1tpKzFdLnBvd2JhciwKLQkJCQkoaG9zZS0+bWVtX3Jlc291cmNlc1tpXS5zdGFydCA+PiAxMikpOwotCQkJLyogRW5hYmxlLCBNZW0gUi9XICovCi0JCQlvdXRfYmUzMigmcGNpLT5wb3dbaSsxXS5wb3dhciwgMHg4MDA0NDAwMAotCQkJCXwgKF9faWxvZzIoaG9zZS0+bWVtX3Jlc291cmNlc1tpXS5lbmQKLQkJCQktIGhvc2UtPm1lbV9yZXNvdXJjZXNbaV0uc3RhcnQgKyAxKSAtIDEpKTsKLQkJfQorCWZvcihpID0gMCwgaiA9IDE7IGkgPCAzOyBpKyspIHsKKwkJaWYgKCEoaG9zZS0+bWVtX3Jlc291cmNlc1tpXS5mbGFncyAmIElPUkVTT1VSQ0VfTUVNKSkKKwkJCWNvbnRpbnVlOworCisJCW4gPSBzZXR1cF9vbmVfYXRtdShwY2ksIGosICZob3NlLT5tZW1fcmVzb3VyY2VzW2ldLAorCQkJCSAgIGhvc2UtPnBjaV9tZW1fb2Zmc2V0KTsKKworCQlpZiAobiA8IDAgfHwgaiA+PSA1KSB7CisJCQlwcl9lcnIoIlJhbiBvdXQgb2Ygb3V0Ym91bmQgUENJIEFUTVVzIGZvciByZXNvdXJjZSAlZCFcbiIsIGkpOworCQkJaG9zZS0+bWVtX3Jlc291cmNlc1tpXS5mbGFncyB8PSBJT1JFU09VUkNFX0RJU0FCTEVEOworCQl9IGVsc2UKKwkJCWogKz0gbjsKKwl9CiAKIAkvKiBTZXR1cCBvdXRib3VuZCBJTyB3aW5kb3cgKi8KLQlpZiAoaG9zZS0+aW9fcmVzb3VyY2UuZmxhZ3MgJiBJT1JFU09VUkNFX0lPKXsKLQkJcHJfZGVidWcoIlBDSSBJTyByZXNvdXJjZSBzdGFydCAweCUwMTZsbHgsIHNpemUgMHglMDE2bGx4LCAiCi0JCQkgInBoeSBiYXNlIDB4JTAxNmxseC5cbiIsCi0JCQkodTY0KWhvc2UtPmlvX3Jlc291cmNlLnN0YXJ0LAotCQkJKHU2NClob3NlLT5pb19yZXNvdXJjZS5lbmQgLSAodTY0KWhvc2UtPmlvX3Jlc291cmNlLnN0YXJ0ICsgMSwKLQkJCSh1NjQpaG9zZS0+aW9fYmFzZV9waHlzKTsKLQkJb3V0X2JlMzIoJnBjaS0+cG93W2krMV0ucG90YXIsIChob3NlLT5pb19yZXNvdXJjZS5zdGFydCA+PiAxMikpOwotCQlvdXRfYmUzMigmcGNpLT5wb3dbaSsxXS5wb3RlYXIsIDApOwotCQlvdXRfYmUzMigmcGNpLT5wb3dbaSsxXS5wb3diYXIsIChob3NlLT5pb19iYXNlX3BoeXMgPj4gMTIpKTsKLQkJLyogRW5hYmxlLCBJTyBSL1cgKi8KLQkJb3V0X2JlMzIoJnBjaS0+cG93W2krMV0ucG93YXIsIDB4ODAwODgwMDAKLQkJCXwgKF9faWxvZzIoaG9zZS0+aW9fcmVzb3VyY2UuZW5kCi0JCQktIGhvc2UtPmlvX3Jlc291cmNlLnN0YXJ0ICsgMSkgLSAxKSk7CisJaWYgKGhvc2UtPmlvX3Jlc291cmNlLmZsYWdzICYgSU9SRVNPVVJDRV9JTykgeworCQlpZiAoaiA+PSA1KSB7CisJCQlwcl9lcnIoIlJhbiBvdXQgb2Ygb3V0Ym91bmQgUENJIEFUTVVzIGZvciBJTyByZXNvdXJjZVxuIik7CisJCX0gZWxzZSB7CisJCQlwcl9kZWJ1ZygiUENJIElPIHJlc291cmNlIHN0YXJ0IDB4JTAxNmxseCwgc2l6ZSAweCUwMTZsbHgsICIKKwkJCQkgInBoeSBiYXNlIDB4JTAxNmxseC5cbiIsCisJCQkJKHU2NClob3NlLT5pb19yZXNvdXJjZS5zdGFydCwKKwkJCQkodTY0KWhvc2UtPmlvX3Jlc291cmNlLmVuZCAtICh1NjQpaG9zZS0+aW9fcmVzb3VyY2Uuc3RhcnQgKyAxLAorCQkJCSh1NjQpaG9zZS0+aW9fYmFzZV9waHlzKTsKKwkJCW91dF9iZTMyKCZwY2ktPnBvd1tqXS5wb3RhciwgKGhvc2UtPmlvX3Jlc291cmNlLnN0YXJ0ID4+IDEyKSk7CisJCQlvdXRfYmUzMigmcGNpLT5wb3dbal0ucG90ZWFyLCAwKTsKKwkJCW91dF9iZTMyKCZwY2ktPnBvd1tqXS5wb3diYXIsIChob3NlLT5pb19iYXNlX3BoeXMgPj4gMTIpKTsKKwkJCS8qIEVuYWJsZSwgSU8gUi9XICovCisJCQlvdXRfYmUzMigmcGNpLT5wb3dbal0ucG93YXIsIDB4ODAwODgwMDAKKwkJCQl8IChfX2lsb2cyKGhvc2UtPmlvX3Jlc291cmNlLmVuZAorCQkJCS0gaG9zZS0+aW9fcmVzb3VyY2Uuc3RhcnQgKyAxKSAtIDEpKTsKKwkJfQogCX0KIAogCS8qIFNldHVwIDJHIGluYm91bmQgTWVtb3J5IFdpbmRvdyBAIDEgKi8KIAlvdXRfYmUzMigmcGNpLT5waXdbMl0ucGl0YXIsIDB4MDAwMDAwMDApOwogCW91dF9iZTMyKCZwY2ktPnBpd1syXS5waXdiYXIsMHgwMDAwMDAwMCk7CiAJb3V0X2JlMzIoJnBjaS0+cGl3WzJdLnBpd2FyLCBQSVdBUl8yRyk7CisKKwlpb3VubWFwKHBjaSk7CiB9CiAKLXZvaWQgX19pbml0IHNldHVwX3BjaV9jbWQoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlKQorc3RhdGljIHZvaWQgX19pbml0IHNldHVwX3BjaV9jbWQoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlKQogewogCXUxNiBjbWQ7CiAJaW50IGNhcF94OwpAQCAtMTMwLDcgKzE3Miw3IEBACiAJcmV0dXJuIDsKIH0KIAotaW50IF9faW5pdCBmc2xfcGNpZV9jaGVja19saW5rKHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSkKK3N0YXRpYyBpbnQgX19pbml0IGZzbF9wY2llX2NoZWNrX2xpbmsoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlKQogewogCXUzMiB2YWw7CiAJZWFybHlfcmVhZF9jb25maWdfZHdvcmQoaG9zZSwgMCwgMCwgUENJRV9MVFNTTSwgJnZhbCk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvc3lzZGV2L2ZzbF9zb2MuaCBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvZnNsX3NvYy5oCmluZGV4IDYwZjdmMjIuLjljNzQ0ZTQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvZnNsX3NvYy5oCisrKyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvZnNsX3NvYy5oCkBAIC01LDggKzUsMTMgQEAKICNpbmNsdWRlIDxhc20vbW11Lmg+CiAKIGV4dGVybiBwaHlzX2FkZHJfdCBnZXRfaW1tcmJhc2Uodm9pZCk7CisjaWYgZGVmaW5lZChDT05GSUdfQ1BNMikgfHwgZGVmaW5lZChDT05GSUdfUVVJQ0NfRU5HSU5FKSB8fCBkZWZpbmVkKENPTkZJR184eHgpCiBleHRlcm4gdTMyIGdldF9icmdmcmVxKHZvaWQpOwogZXh0ZXJuIHUzMiBnZXRfYmF1ZHJhdGUodm9pZCk7CisjZWxzZQorc3RhdGljIGlubGluZSB1MzIgZ2V0X2JyZ2ZyZXEodm9pZCkgeyByZXR1cm4gLTE7IH0KK3N0YXRpYyBpbmxpbmUgdTMyIGdldF9iYXVkcmF0ZSh2b2lkKSB7IHJldHVybiAtMTsgfQorI2VuZGlmCiBleHRlcm4gdTMyIGZzbF9nZXRfc3lzX2ZyZXEodm9pZCk7CiAKIHN0cnVjdCBzcGlfYm9hcmRfaW5mbzsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvbXBpYy5jIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9tcGljLmMKaW5kZXggM2UwZDg5ZC4uYTM1Mjk3ZCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9tcGljLmMKKysrIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9tcGljLmMKQEAgLTQzNSw3ICs0MzUsNyBAQAogCQlhZGRyID0gYWRkciB8ICgodTY0KXJlYWRsKGJhc2UgKyBIVF9NU0lfQUREUl9ISSkgPDwgMzIpOwogCX0KIAotCXByaW50ayhLRVJOX0RFQlVHICJtcGljOiAgIC0gSFQ6JTAyeC4leCAlcyBNU0kgbWFwcGluZyBmb3VuZCBAIDB4JWx4XG4iLAorCXByaW50ayhLRVJOX0RFQlVHICJtcGljOiAgIC0gSFQ6JTAyeC4leCAlcyBNU0kgbWFwcGluZyBmb3VuZCBAIDB4JWxseFxuIiwKIAkJUENJX1NMT1QoZGV2Zm4pLCBQQ0lfRlVOQyhkZXZmbiksCiAJCWZsYWdzICYgSFRfTVNJX0ZMQUdTX0VOQUJMRSA/ICJlbmFibGVkIiA6ICJkaXNhYmxlZCIsIGFkZHIpOwogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvc3lzZGV2L3FlX2xpYi9LY29uZmlnIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9xZV9saWIvS2NvbmZpZwppbmRleCA3NmZmYmM0Li40MWFjM2RmIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvc3lzZGV2L3FlX2xpYi9LY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvcWVfbGliL0tjb25maWcKQEAgLTIyLDUgKzIyLDYgQEAKIAogY29uZmlnIFFFX1VTQgogCWJvb2wKKwlkZWZhdWx0IHkgaWYgVVNCX0dBREdFVF9GU0xfUUUKIAloZWxwCi0JICBRRSBVU0IgSG9zdCBDb250cm9sbGVyIHN1cHBvcnQKKwkgIFFFIFVTQiBDb250cm9sbGVyIHN1cHBvcnQKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvcWVfbGliL2dwaW8uYyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvcWVfbGliL2dwaW8uYwppbmRleCA4ZTVhMGJjLi4zNDg1Mjg4IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvc3lzZGV2L3FlX2xpYi9ncGlvLmMKKysrIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9xZV9saWIvZ3Bpby5jCkBAIC0xNCw2ICsxNCw3IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9vZi5oPgogI2luY2x1ZGUgPGxpbnV4L29mX2dwaW8uaD4KQEAgLTI0LDggKzI1LDE0IEBACiAJc3RydWN0IG9mX21tX2dwaW9fY2hpcCBtbV9nYzsKIAlzcGlubG9ja190IGxvY2s7CiAKKwl1bnNpZ25lZCBsb25nIHBpbl9mbGFnc1tRRV9QSU9fUElOU107CisjZGVmaW5lIFFFX1BJTl9SRVFVRVNURUQgMAorCiAJLyogc2hhZG93ZWQgZGF0YSByZWdpc3RlciB0byBjbGVhci9zZXQgYml0cyBzYWZlbHkgKi8KIAl1MzIgY3BkYXRhOworCisJLyogc2F2ZWRfcmVncyB1c2VkIHRvIHJlc3RvcmUgZGVkaWNhdGVkIGZ1bmN0aW9ucyAqLworCXN0cnVjdCBxZV9waW9fcmVncyBzYXZlZF9yZWdzOwogfTsKIAogc3RhdGljIGlubGluZSBzdHJ1Y3QgcWVfZ3Bpb19jaGlwICoKQEAgLTQwLDYgKzQ3LDEyIEBACiAJc3RydWN0IHFlX3Bpb19yZWdzIF9faW9tZW0gKnJlZ3MgPSBtbV9nYy0+cmVnczsKIAogCXFlX2djLT5jcGRhdGEgPSBpbl9iZTMyKCZyZWdzLT5jcGRhdGEpOworCXFlX2djLT5zYXZlZF9yZWdzLmNwZGF0YSA9IHFlX2djLT5jcGRhdGE7CisJcWVfZ2MtPnNhdmVkX3JlZ3MuY3BkaXIxID0gaW5fYmUzMigmcmVncy0+Y3BkaXIxKTsKKwlxZV9nYy0+c2F2ZWRfcmVncy5jcGRpcjIgPSBpbl9iZTMyKCZyZWdzLT5jcGRpcjIpOworCXFlX2djLT5zYXZlZF9yZWdzLmNwcGFyMSA9IGluX2JlMzIoJnJlZ3MtPmNwcGFyMSk7CisJcWVfZ2MtPnNhdmVkX3JlZ3MuY3BwYXIyID0gaW5fYmUzMigmcmVncy0+Y3BwYXIyKTsKKwlxZV9nYy0+c2F2ZWRfcmVncy5jcG9kciA9IGluX2JlMzIoJnJlZ3MtPmNwb2RyKTsKIH0KIAogc3RhdGljIGludCBxZV9ncGlvX2dldChzdHJ1Y3QgZ3Bpb19jaGlwICpnYywgdW5zaWduZWQgaW50IGdwaW8pCkBAIC0xMDMsNiArMTE2LDE4OCBAQAogCXJldHVybiAwOwogfQogCitzdHJ1Y3QgcWVfcGluIHsKKwkvKgorCSAqIFRoZSBxZV9ncGlvX2NoaXAgbmFtZSBpcyB1bmZvcnR1bmF0ZSwgd2Ugc2hvdWxkIGNoYW5nZSB0aGF0IHRvCisJICogc29tZXRoaW5nIGxpa2UgcWVfcGlvX2NvbnRyb2xsZXIuIFNvbWVkYXkuCisJICovCisJc3RydWN0IHFlX2dwaW9fY2hpcCAqY29udHJvbGxlcjsKKwlpbnQgbnVtOworfTsKKworLyoqCisgKiBxZV9waW5fcmVxdWVzdCAtIFJlcXVlc3QgYSBRRSBwaW4KKyAqIEBucDoJCWRldmljZSBub2RlIHRvIGdldCBhIHBpbiBmcm9tCisgKiBAaW5kZXg6CWluZGV4IG9mIGEgcGluIGluIHRoZSBkZXZpY2UgdHJlZQorICogQ29udGV4dDoJbm9uLWF0b21pYworICoKKyAqIFRoaXMgZnVuY3Rpb24gcmV0dXJuIHFlX3BpbiBzbyB0aGF0IHlvdSBjb3VsZCB1c2UgaXQgd2l0aCB0aGUgcmVzdCBvZgorICogdGhlIFFFIFBpbiBNdWx0aXBsZXhpbmcgQVBJLgorICovCitzdHJ1Y3QgcWVfcGluICpxZV9waW5fcmVxdWVzdChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLCBpbnQgaW5kZXgpCit7CisJc3RydWN0IHFlX3BpbiAqcWVfcGluOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZ2M7CisJc3RydWN0IG9mX2dwaW9fY2hpcCAqb2ZfZ2MgPSBOVUxMOworCXN0cnVjdCBvZl9tbV9ncGlvX2NoaXAgKm1tX2djOworCXN0cnVjdCBxZV9ncGlvX2NoaXAgKnFlX2djOworCWludCBlcnI7CisJaW50IHNpemU7CisJY29uc3Qgdm9pZCAqZ3Bpb19zcGVjOworCWNvbnN0IHUzMiAqZ3Bpb19jZWxsczsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJcWVfcGluID0ga3phbGxvYyhzaXplb2YoKnFlX3BpbiksIEdGUF9LRVJORUwpOworCWlmICghcWVfcGluKSB7CisJCXByX2RlYnVnKCIlczogY2FuJ3QgYWxsb2NhdGUgbWVtb3J5XG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCX0KKworCWVyciA9IG9mX3BhcnNlX3BoYW5kbGVzX3dpdGhfYXJncyhucCwgImdwaW9zIiwgIiNncGlvLWNlbGxzIiwgaW5kZXgsCisJCQkJCSAgJmdjLCAmZ3Bpb19zcGVjKTsKKwlpZiAoZXJyKSB7CisJCXByX2RlYnVnKCIlczogY2FuJ3QgcGFyc2UgZ3Bpb3MgcHJvcGVydHlcbiIsIF9fZnVuY19fKTsKKwkJZ290byBlcnIwOworCX0KKworCWlmICghb2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUoZ2MsICJmc2wsbXBjODMyMy1xZS1wYXJpby1iYW5rIikpIHsKKwkJcHJfZGVidWcoIiVzOiB0cmllZCB0byBnZXQgYSBub24tcWUgcGluXG4iLCBfX2Z1bmNfXyk7CisJCWVyciA9IC1FSU5WQUw7CisJCWdvdG8gZXJyMTsKKwl9CisKKwlvZl9nYyA9IGdjLT5kYXRhOworCWlmICghb2ZfZ2MpIHsKKwkJcHJfZGVidWcoIiVzOiBncGlvIGNvbnRyb2xsZXIgJXMgaXNuJ3QgcmVnaXN0ZXJlZFxuIiwKKwkJCSBucC0+ZnVsbF9uYW1lLCBnYy0+ZnVsbF9uYW1lKTsKKwkJZXJyID0gLUVOT0RFVjsKKwkJZ290byBlcnIxOworCX0KKworCWdwaW9fY2VsbHMgPSBvZl9nZXRfcHJvcGVydHkoZ2MsICIjZ3Bpby1jZWxscyIsICZzaXplKTsKKwlpZiAoIWdwaW9fY2VsbHMgfHwgc2l6ZSAhPSBzaXplb2YoKmdwaW9fY2VsbHMpIHx8CisJCQkqZ3Bpb19jZWxscyAhPSBvZl9nYy0+Z3Bpb19jZWxscykgeworCQlwcl9kZWJ1ZygiJXM6IHdyb25nICNncGlvLWNlbGxzIGZvciAlc1xuIiwKKwkJCSBucC0+ZnVsbF9uYW1lLCBnYy0+ZnVsbF9uYW1lKTsKKwkJZXJyID0gLUVJTlZBTDsKKwkJZ290byBlcnIxOworCX0KKworCWVyciA9IG9mX2djLT54bGF0ZShvZl9nYywgbnAsIGdwaW9fc3BlYywgTlVMTCk7CisJaWYgKGVyciA8IDApCisJCWdvdG8gZXJyMTsKKworCW1tX2djID0gdG9fb2ZfbW1fZ3Bpb19jaGlwKCZvZl9nYy0+Z2MpOworCXFlX2djID0gdG9fcWVfZ3Bpb19jaGlwKG1tX2djKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZxZV9nYy0+bG9jaywgZmxhZ3MpOworCisJaWYgKHRlc3RfYW5kX3NldF9iaXQoUUVfUElOX1JFUVVFU1RFRCwgJnFlX2djLT5waW5fZmxhZ3NbZXJyXSkgPT0gMCkgeworCQlxZV9waW4tPmNvbnRyb2xsZXIgPSBxZV9nYzsKKwkJcWVfcGluLT5udW0gPSBlcnI7CisJCWVyciA9IDA7CisJfSBlbHNlIHsKKwkJZXJyID0gLUVCVVNZOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnFlX2djLT5sb2NrLCBmbGFncyk7CisKKwlpZiAoIWVycikKKwkJcmV0dXJuIHFlX3BpbjsKK2VycjE6CisJb2Zfbm9kZV9wdXQoZ2MpOworZXJyMDoKKwlrZnJlZShxZV9waW4pOworCXByX2RlYnVnKCIlcyBmYWlsZWQgd2l0aCBzdGF0dXMgJWRcbiIsIF9fZnVuY19fLCBlcnIpOworCXJldHVybiBFUlJfUFRSKGVycik7Cit9CitFWFBPUlRfU1lNQk9MKHFlX3Bpbl9yZXF1ZXN0KTsKKworLyoqCisgKiBxZV9waW5fZnJlZSAtIEZyZWUgYSBwaW4KKyAqIEBxZV9waW46CXBvaW50ZXIgdG8gdGhlIHFlX3BpbiBzdHJ1Y3R1cmUKKyAqIENvbnRleHQ6CWFueQorICoKKyAqIFRoaXMgZnVuY3Rpb24gZnJlZXMgdGhlIHFlX3BpbiBzdHJ1Y3R1cmUgYW5kIG1ha2VzIGEgcGluIGF2YWlsYWJsZQorICogZm9yIGZ1cnRoZXIgcWVfcGluX3JlcXVlc3QoKSBjYWxscy4KKyAqLwordm9pZCBxZV9waW5fZnJlZShzdHJ1Y3QgcWVfcGluICpxZV9waW4pCit7CisJc3RydWN0IHFlX2dwaW9fY2hpcCAqcWVfZ2MgPSBxZV9waW4tPmNvbnRyb2xsZXI7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwljb25zdCBpbnQgcGluID0gcWVfcGluLT5udW07CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcWVfZ2MtPmxvY2ssIGZsYWdzKTsKKwl0ZXN0X2FuZF9jbGVhcl9iaXQoUUVfUElOX1JFUVVFU1RFRCwgJnFlX2djLT5waW5fZmxhZ3NbcGluXSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcWVfZ2MtPmxvY2ssIGZsYWdzKTsKKworCWtmcmVlKHFlX3Bpbik7Cit9CitFWFBPUlRfU1lNQk9MKHFlX3Bpbl9mcmVlKTsKKworLyoqCisgKiBxZV9waW5fc2V0X2RlZGljYXRlZCAtIFJldmVydCBhIHBpbiB0byBhIGRlZGljYXRlZCBwZXJpcGhlcmFsIGZ1bmN0aW9uIG1vZGUKKyAqIEBxZV9waW46CXBvaW50ZXIgdG8gdGhlIHFlX3BpbiBzdHJ1Y3R1cmUKKyAqIENvbnRleHQ6CWFueQorICoKKyAqIFRoaXMgZnVuY3Rpb24gcmVzZXRzIGEgcGluIHRvIGEgZGVkaWNhdGVkIHBlcmlwaGVyYWwgZnVuY3Rpb24gdGhhdAorICogaGFzIGJlZW4gc2V0IHVwIGJ5IHRoZSBmaXJtd2FyZS4KKyAqLwordm9pZCBxZV9waW5fc2V0X2RlZGljYXRlZChzdHJ1Y3QgcWVfcGluICpxZV9waW4pCit7CisJc3RydWN0IHFlX2dwaW9fY2hpcCAqcWVfZ2MgPSBxZV9waW4tPmNvbnRyb2xsZXI7CisJc3RydWN0IHFlX3Bpb19yZWdzIF9faW9tZW0gKnJlZ3MgPSBxZV9nYy0+bW1fZ2MucmVnczsKKwlzdHJ1Y3QgcWVfcGlvX3JlZ3MgKnNyZWdzID0gJnFlX2djLT5zYXZlZF9yZWdzOworCWludCBwaW4gPSBxZV9waW4tPm51bTsKKwl1MzIgbWFzazEgPSAxIDw8IChRRV9QSU9fUElOUyAtIChwaW4gKyAxKSk7CisJdTMyIG1hc2syID0gMHgzIDw8IChRRV9QSU9fUElOUyAtIChwaW4gJSAoUUVfUElPX1BJTlMgLyAyKSArIDEpICogMik7CisJYm9vbCBzZWNvbmRfcmVnID0gcGluID4gKFFFX1BJT19QSU5TIC8gMikgLSAxOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcWVfZ2MtPmxvY2ssIGZsYWdzKTsKKworCWlmIChzZWNvbmRfcmVnKSB7CisJCWNscnNldGJpdHNfYmUzMigmcmVncy0+Y3BkaXIyLCBtYXNrMiwgc3JlZ3MtPmNwZGlyMiAmIG1hc2syKTsKKwkJY2xyc2V0Yml0c19iZTMyKCZyZWdzLT5jcHBhcjIsIG1hc2syLCBzcmVncy0+Y3BwYXIyICYgbWFzazIpOworCX0gZWxzZSB7CisJCWNscnNldGJpdHNfYmUzMigmcmVncy0+Y3BkaXIxLCBtYXNrMiwgc3JlZ3MtPmNwZGlyMSAmIG1hc2syKTsKKwkJY2xyc2V0Yml0c19iZTMyKCZyZWdzLT5jcHBhcjEsIG1hc2syLCBzcmVncy0+Y3BwYXIxICYgbWFzazIpOworCX0KKworCWlmIChzcmVncy0+Y3BkYXRhICYgbWFzazEpCisJCXFlX2djLT5jcGRhdGEgfD0gbWFzazE7CisJZWxzZQorCQlxZV9nYy0+Y3BkYXRhICY9IH5tYXNrMTsKKworCW91dF9iZTMyKCZyZWdzLT5jcGRhdGEsIHFlX2djLT5jcGRhdGEpOworCWNscnNldGJpdHNfYmUzMigmcmVncy0+Y3BvZHIsIG1hc2sxLCBzcmVncy0+Y3BvZHIgJiBtYXNrMSk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZxZV9nYy0+bG9jaywgZmxhZ3MpOworfQorRVhQT1JUX1NZTUJPTChxZV9waW5fc2V0X2RlZGljYXRlZCk7CisKKy8qKgorICogcWVfcGluX3NldF9ncGlvIC0gU2V0IGEgcGluIHRvIHRoZSBHUElPIG1vZGUKKyAqIEBxZV9waW46CXBvaW50ZXIgdG8gdGhlIHFlX3BpbiBzdHJ1Y3R1cmUKKyAqIENvbnRleHQ6CWFueQorICoKKyAqIFRoaXMgZnVuY3Rpb24gc2V0cyBhIHBpbiB0byB0aGUgR1BJTyBtb2RlLgorICovCit2b2lkIHFlX3Bpbl9zZXRfZ3BpbyhzdHJ1Y3QgcWVfcGluICpxZV9waW4pCit7CisJc3RydWN0IHFlX2dwaW9fY2hpcCAqcWVfZ2MgPSBxZV9waW4tPmNvbnRyb2xsZXI7CisJc3RydWN0IHFlX3Bpb19yZWdzIF9faW9tZW0gKnJlZ3MgPSBxZV9nYy0+bW1fZ2MucmVnczsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnFlX2djLT5sb2NrLCBmbGFncyk7CisKKwkvKiBMZXQncyBtYWtlIGl0IGlucHV0IGJ5IGRlZmF1bHQsIEdQSU8gQVBJIGlzIGFibGUgdG8gY2hhbmdlIHRoYXQuICovCisJX19wYXJfaW9fY29uZmlnX3BpbihyZWdzLCBxZV9waW4tPm51bSwgUUVfUElPX0RJUl9JTiwgMCwgMCwgMCk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZxZV9nYy0+bG9jaywgZmxhZ3MpOworfQorRVhQT1JUX1NZTUJPTChxZV9waW5fc2V0X2dwaW8pOworCiBzdGF0aWMgaW50IF9faW5pdCBxZV9hZGRfZ3Bpb2NoaXBzKHZvaWQpCiB7CiAJc3RydWN0IGRldmljZV9ub2RlICpucDsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvc2ltcGxlX2dwaW8uYyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvc2ltcGxlX2dwaW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40M2M0NTY5Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9zaW1wbGVfZ3Bpby5jCkBAIC0wLDAgKzEsMTU1IEBACisvKgorICogU2ltcGxlIE1lbW9yeS1NYXBwZWQgR1BJT3MKKyAqCisgKiBDb3B5cmlnaHQgKGMpIE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4gMjAwOC4KKyAqCisgKiBBdXRob3I6IEFudG9uIFZvcm9udHNvdiA8YXZvcm9udHNvdkBydS5tdmlzdGEuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8YXNtL3Byb20uaD4KKyNpbmNsdWRlICJzaW1wbGVfZ3Bpby5oIgorCitzdHJ1Y3QgdThfZ3Bpb19jaGlwIHsKKwlzdHJ1Y3Qgb2ZfbW1fZ3Bpb19jaGlwIG1tX2djOworCXNwaW5sb2NrX3QgbG9jazsKKworCS8qIHNoYWRvd2VkIGRhdGEgcmVnaXN0ZXIgdG8gY2xlYXIvc2V0IGJpdHMgc2FmZWx5ICovCisJdTggZGF0YTsKK307CisKK3N0YXRpYyBzdHJ1Y3QgdThfZ3Bpb19jaGlwICp0b191OF9ncGlvX2NoaXAoc3RydWN0IG9mX21tX2dwaW9fY2hpcCAqbW1fZ2MpCit7CisJcmV0dXJuIGNvbnRhaW5lcl9vZihtbV9nYywgc3RydWN0IHU4X2dwaW9fY2hpcCwgbW1fZ2MpOworfQorCitzdGF0aWMgdTggdThfcGluMm1hc2sodW5zaWduZWQgaW50IHBpbikKK3sKKwlyZXR1cm4gMSA8PCAoOCAtIDEgLSBwaW4pOworfQorCitzdGF0aWMgaW50IHU4X2dwaW9fZ2V0KHN0cnVjdCBncGlvX2NoaXAgKmdjLCB1bnNpZ25lZCBpbnQgZ3BpbykKK3sKKwlzdHJ1Y3Qgb2ZfbW1fZ3Bpb19jaGlwICptbV9nYyA9IHRvX29mX21tX2dwaW9fY2hpcChnYyk7CisKKwlyZXR1cm4gaW5fOChtbV9nYy0+cmVncykgJiB1OF9waW4ybWFzayhncGlvKTsKK30KKworc3RhdGljIHZvaWQgdThfZ3Bpb19zZXQoc3RydWN0IGdwaW9fY2hpcCAqZ2MsIHVuc2lnbmVkIGludCBncGlvLCBpbnQgdmFsKQoreworCXN0cnVjdCBvZl9tbV9ncGlvX2NoaXAgKm1tX2djID0gdG9fb2ZfbW1fZ3Bpb19jaGlwKGdjKTsKKwlzdHJ1Y3QgdThfZ3Bpb19jaGlwICp1OF9nYyA9IHRvX3U4X2dwaW9fY2hpcChtbV9nYyk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ1OF9nYy0+bG9jaywgZmxhZ3MpOworCisJaWYgKHZhbCkKKwkJdThfZ2MtPmRhdGEgfD0gdThfcGluMm1hc2soZ3Bpbyk7CisJZWxzZQorCQl1OF9nYy0+ZGF0YSAmPSB+dThfcGluMm1hc2soZ3Bpbyk7CisKKwlvdXRfOChtbV9nYy0+cmVncywgdThfZ2MtPmRhdGEpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdThfZ2MtPmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIGludCB1OF9ncGlvX2Rpcl9pbihzdHJ1Y3QgZ3Bpb19jaGlwICpnYywgdW5zaWduZWQgaW50IGdwaW8pCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdThfZ3Bpb19kaXJfb3V0KHN0cnVjdCBncGlvX2NoaXAgKmdjLCB1bnNpZ25lZCBpbnQgZ3BpbywgaW50IHZhbCkKK3sKKwl1OF9ncGlvX3NldChnYywgZ3BpbywgdmFsKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgdThfZ3Bpb19zYXZlX3JlZ3Moc3RydWN0IG9mX21tX2dwaW9fY2hpcCAqbW1fZ2MpCit7CisJc3RydWN0IHU4X2dwaW9fY2hpcCAqdThfZ2MgPSB0b191OF9ncGlvX2NoaXAobW1fZ2MpOworCisJdThfZ2MtPmRhdGEgPSBpbl84KG1tX2djLT5yZWdzKTsKK30KKworc3RhdGljIGludCBfX2luaXQgdThfc2ltcGxlX2dwaW9jaGlwX2FkZChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKQoreworCWludCByZXQ7CisJc3RydWN0IHU4X2dwaW9fY2hpcCAqdThfZ2M7CisJc3RydWN0IG9mX21tX2dwaW9fY2hpcCAqbW1fZ2M7CisJc3RydWN0IG9mX2dwaW9fY2hpcCAqb2ZfZ2M7CisJc3RydWN0IGdwaW9fY2hpcCAqZ2M7CisKKwl1OF9nYyA9IGt6YWxsb2Moc2l6ZW9mKCp1OF9nYyksIEdGUF9LRVJORUwpOworCWlmICghdThfZ2MpCisJCXJldHVybiAtRU5PTUVNOworCisJc3Bpbl9sb2NrX2luaXQoJnU4X2djLT5sb2NrKTsKKworCW1tX2djID0gJnU4X2djLT5tbV9nYzsKKwlvZl9nYyA9ICZtbV9nYy0+b2ZfZ2M7CisJZ2MgPSAmb2ZfZ2MtPmdjOworCisJbW1fZ2MtPnNhdmVfcmVncyA9IHU4X2dwaW9fc2F2ZV9yZWdzOworCW9mX2djLT5ncGlvX2NlbGxzID0gMjsKKwlnYy0+bmdwaW8gPSA4OworCWdjLT5kaXJlY3Rpb25faW5wdXQgPSB1OF9ncGlvX2Rpcl9pbjsKKwlnYy0+ZGlyZWN0aW9uX291dHB1dCA9IHU4X2dwaW9fZGlyX291dDsKKwlnYy0+Z2V0ID0gdThfZ3Bpb19nZXQ7CisJZ2MtPnNldCA9IHU4X2dwaW9fc2V0OworCisJcmV0ID0gb2ZfbW1fZ3Bpb2NoaXBfYWRkKG5wLCBtbV9nYyk7CisJaWYgKHJldCkKKwkJZ290byBlcnI7CisJcmV0dXJuIDA7CitlcnI6CisJa2ZyZWUodThfZ2MpOworCXJldHVybiByZXQ7Cit9CisKK3ZvaWQgX19pbml0IHNpbXBsZV9ncGlvY2hpcF9pbml0KGNvbnN0IGNoYXIgKmNvbXBhdGlibGUpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpucDsKKworCWZvcl9lYWNoX2NvbXBhdGlibGVfbm9kZShucCwgTlVMTCwgY29tcGF0aWJsZSkgeworCQlpbnQgcmV0OworCQlzdHJ1Y3QgcmVzb3VyY2UgcjsKKworCQlyZXQgPSBvZl9hZGRyZXNzX3RvX3Jlc291cmNlKG5wLCAwLCAmcik7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycjsKKworCQlzd2l0Y2ggKHJlc291cmNlX3NpemUoJnIpKSB7CisJCWNhc2UgMToKKwkJCXJldCA9IHU4X3NpbXBsZV9ncGlvY2hpcF9hZGQobnApOworCQkJaWYgKHJldCkKKwkJCQlnb3RvIGVycjsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJLyoKKwkJCSAqIFdoZW5ldmVyIHlvdSBuZWVkIHN1cHBvcnQgZm9yIEdQSU8gYmFuayB3aWR0aCA+IDEsCisJCQkgKiBwbGVhc2UganVzdCB0dXJuIHU4XyBjb2RlIGludG8gaHVnZSBtYWNyb3MsIGFuZAorCQkJICogY29uc3RydWN0IG5lZWRlZCB1WF8gY29kZSB3aXRoIGl0LgorCQkJICovCisJCQlyZXQgPSAtRU5PU1lTOworCQkJZ290byBlcnI7CisJCX0KKwkJY29udGludWU7CitlcnI6CisJCXByX2VycigiJXM6IHJlZ2lzdHJhdGlvbiBmYWlsZWQsIHN0YXR1cyAlZFxuIiwKKwkJICAgICAgIG5wLT5mdWxsX25hbWUsIHJldCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9zaW1wbGVfZ3Bpby5oIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9zaW1wbGVfZ3Bpby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhN2IwYzUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L3NpbXBsZV9ncGlvLmgKQEAgLTAsMCArMSwxMiBAQAorI2lmbmRlZiBfX1NZU0RFVl9TSU1QTEVfR1BJT19ICisjZGVmaW5lIF9fU1lTREVWX1NJTVBMRV9HUElPX0gKKworI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisKKyNpZmRlZiBDT05GSUdfU0lNUExFX0dQSU8KK2V4dGVybiB2b2lkIHNpbXBsZV9ncGlvY2hpcF9pbml0KGNvbnN0IGNoYXIgKmNvbXBhdGlibGUpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCBzaW1wbGVfZ3Bpb2NoaXBfaW5pdChjb25zdCBjaGFyICpjb21wYXRpYmxlKSB7fQorI2VuZGlmIC8qIENPTkZJR19TSU1QTEVfR1BJTyAqLworCisjZW5kaWYgLyogX19TWVNERVZfU0lNUExFX0dQSU9fSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL0tjb25maWcgYi9hcmNoL3MzOTAvS2NvbmZpZwppbmRleCAxOTU3N2FlLi42YjBhMzUzIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvS2NvbmZpZworKysgYi9hcmNoL3MzOTAvS2NvbmZpZwpAQCAtNzcsNiArNzcsNyBAQAogY29uZmlnIFMzOTAKIAlkZWZfYm9vbCB5CiAJc2VsZWN0IFVTRV9HRU5FUklDX1NNUF9IRUxQRVJTIGlmIFNNUAorCXNlbGVjdCBIQVZFX1NZU0NBTExfV1JBUFBFUlMKIAlzZWxlY3QgSEFWRV9GVU5DVElPTl9UUkFDRVIKIAlzZWxlY3QgSEFWRV9PUFJPRklMRQogCXNlbGVjdCBIQVZFX0tQUk9CRVMKQEAgLTI5OSw3ICszMDAsNyBAQAogCSAgVGhpcyBvcHRpb24gZW5hYmxlcyB0aGUgY29tcGlsZXIgb3B0aW9ucyAtbXdhcm4tZnJhbWVzaXplIGFuZAogCSAgLW13YXJuLWR5bmFtaWNzdGFjay4gSWYgdGhlIGNvbXBpbGVyIHN1cHBvcnRzIHRoZXNlIG9wdGlvbnMgaXQKIAkgIHdpbGwgZ2VuZXJhdGUgd2FybmluZ3MgZm9yIGZ1bmN0aW9uIHdoaWNoIGVpdGhlciB1c2UgYWxsb2NhIG9yCi0JICBjcmVhdGUgYSBzdGFjayBmcmFtZSBiaWdnZXIgdGhlbiBDT05GSUdfV0FSTl9TVEFDS19TSVpFLgorCSAgY3JlYXRlIGEgc3RhY2sgZnJhbWUgYmlnZ2VyIHRoYW4gQ09ORklHX1dBUk5fU1RBQ0tfU0laRS4KIAogCSAgU2F5IE4gaWYgeW91IGFyZSB1bnN1cmUuCiAKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9LYnVpbGQgYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20vS2J1aWxkCmluZGV4IGYyYWY0MTYuLjYzYTIzNDEgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9LYnVpbGQKKysrIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL0tidWlsZApAQCAtMTMsNCArMTMsMyBAQAogdW5pZmRlZi15ICs9IGRlYnVnLmgKIHVuaWZkZWYteSArPSBjaHBpZC5oCiB1bmlmZGVmLXkgKz0gc2NoaWQuaAotdW5pZmRlZi15ICs9IHN3YWIuaApkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL2J5dGVvcmRlci5oIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL2J5dGVvcmRlci5oCmluZGV4IGI5NWEyYjIuLmEzMzJlNTkgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9ieXRlb3JkZXIuaAorKysgYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20vYnl0ZW9yZGVyLmgKQEAgLTEsNyArMSw2IEBACiAjaWZuZGVmIF9TMzkwX0JZVEVPUkRFUl9ICiAjZGVmaW5lIF9TMzkwX0JZVEVPUkRFUl9ICiAKLSNpbmNsdWRlIDxhc20vc3dhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2J5dGVvcmRlci9iaWdfZW5kaWFuLmg+CiAKICNlbmRpZiAvKiBfUzM5MF9CWVRFT1JERVJfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL2NocGlkLmggYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20vY2hwaWQuaAppbmRleCBkZmUzYzdmLi5mYzcxZDhhIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vY2hwaWQuaAorKysgYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20vY2hwaWQuaApAQCAtOSw3ICs5LDcgQEAKICNkZWZpbmUgX0FTTV9TMzkwX0NIUElEX0ggX0FTTV9TMzkwX0NIUElEX0gKIAogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgotI2luY2x1ZGUgPGFzbS90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAKICNkZWZpbmUgX19NQVhfQ0hQSUQgMjU1CiAKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9jaHNjLmggYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20vY2hzYy5oCmluZGV4IGQzOGQwY2YuLjgwNzk5N2YgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9jaHNjLmgKKysrIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL2Noc2MuaApAQCAtOCw2ICs4LDcgQEAKICNpZm5kZWYgX0FTTV9DSFNDX0gKICNkZWZpbmUgX0FTTV9DSFNDX0gKIAorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8YXNtL2NocGlkLmg+CiAjaW5jbHVkZSA8YXNtL3NjaGlkLmg+CiAKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9jbWIuaCBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9jbWIuaAppbmRleCA1MDE5Njg1Li4zOWFlMDMyIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vY21iLmgKKysrIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL2NtYi5oCkBAIC0xLDUgKzEsOCBAQAogI2lmbmRlZiBTMzkwX0NNQl9ICiAjZGVmaW5lIFMzOTBfQ01CX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKIC8qKgogICogc3RydWN0IGNtYmRhdGEgLSBjaGFubmVsIG1lYXN1cmVtZW50IGJsb2NrIGRhdGEgZm9yIHVzZXIgc3BhY2UKICAqIEBzaXplOiBzaXplIG9mIHRoZSBzdG9yZWQgZGF0YQpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL2Rhc2QuaCBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9kYXNkLmgKaW5kZXggNTViMmI4MC4uZTJkYjZmMSAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL2Rhc2QuaAorKysgYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20vZGFzZC5oCkBAIC0xNCw2ICsxNCw3IEBACiAKICNpZm5kZWYgREFTRF9ICiAjZGVmaW5lIERBU0RfSAorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvaW9jdGwuaD4KIAogI2RlZmluZSBEQVNEX0lPQ1RMX0xFVFRFUiAnRCcKQEAgLTc4LDYgKzc5LDcgQEAKICNkZWZpbmUgREFTRF9GRUFUVVJFX1VTRURJQUcJICAgICAweDAyCiAjZGVmaW5lIERBU0RfRkVBVFVSRV9JTklUSUFMX09OTElORSAgMHgwNAogI2RlZmluZSBEQVNEX0ZFQVRVUkVfRVJQTE9HCSAgICAgMHgwOAorI2RlZmluZSBEQVNEX0ZFQVRVUkVfRkFJTEZBU1QJICAgICAweDEwCiAKICNkZWZpbmUgREFTRF9QQVJUTl9CSVRTIDIKIApkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL2t2bS5oIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL2t2bS5oCmluZGV4IGQ3NDAwMmYuLmUxZjU0NjUgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9rdm0uaAorKysgYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20va3ZtLmgKQEAgLTEzLDcgKzEzLDcgQEAKICAqICAgIEF1dGhvcihzKTogQ2Fyc3RlbiBPdHRlIDxjb3R0ZUBkZS5pYm0uY29tPgogICogICAgICAgICAgICAgICBDaHJpc3RpYW4gQm9ybnRyYWVnZXIgPGJvcm50cmFlZ2VyQGRlLmlibS5jb20+CiAgKi8KLSNpbmNsdWRlIDxhc20vdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogCiAvKiBmb3IgS1ZNX0dFVF9JUlFDSElQIGFuZCBLVk1fU0VUX0lSUUNISVAgKi8KIHN0cnVjdCBrdm1fcGljX3N0YXRlIHsKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9wb3NpeF90eXBlcy5oIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3Bvc2l4X3R5cGVzLmgKaW5kZXggMzk3ZDkzZi4uOGNjMTEzZiAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3Bvc2l4X3R5cGVzLmgKKysrIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3Bvc2l4X3R5cGVzLmgKQEAgLTY4LDExICs2OCw3IEBACiAjZW5kaWYgLyogX19zMzkweF9fICovCiAKIHR5cGVkZWYgc3RydWN0IHsKLSNpZiBkZWZpbmVkKF9fS0VSTkVMX18pIHx8IGRlZmluZWQoX19VU0VfQUxMKQogICAgICAgICBpbnQgICAgIHZhbFsyXTsKLSNlbHNlICAgICAgICAgICAgICAgICAgICAgICAgLyogIWRlZmluZWQoX19LRVJORUxfXykgJiYgIWRlZmluZWQoX19VU0VfQUxMKSovCi0gICAgICAgIGludCAgICAgX192YWxbMl07Ci0jZW5kaWYgICAgICAgICAgICAgICAgICAgICAgIC8qICFkZWZpbmVkKF9fS0VSTkVMX18pICYmICFkZWZpbmVkKF9fVVNFX0FMTCkqLwogfSBfX2tlcm5lbF9mc2lkX3Q7CiAKIApkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3B0cmFjZS5oIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3B0cmFjZS5oCmluZGV4IDUzOTZmOWYuLjg5MjAwMjUgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9wdHJhY2UuaAorKysgYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20vcHRyYWNlLmgKQEAgLTI3MiwxMiArMjcyLDE1IEBACiAjZGVmaW5lIFBTV19BU0NfU0VDT05EQVJZCTB4MDAwMDgwMDAwMDAwMDAwMFVMCiAjZGVmaW5lIFBTV19BU0NfSE9NRQkJMHgwMDAwQzAwMDAwMDAwMDAwVUwKIAotZXh0ZXJuIGxvbmcgcHN3X3VzZXIzMl9iaXRzOwotCiAjZW5kaWYgLyogX19zMzkweF9fICovCiAKKyNpZmRlZiBfX0tFUk5FTF9fCiBleHRlcm4gbG9uZyBwc3dfa2VybmVsX2JpdHM7CiBleHRlcm4gbG9uZyBwc3dfdXNlcl9iaXRzOworI2lmZGVmIENPTkZJR182NEJJVAorZXh0ZXJuIGxvbmcgcHN3X3VzZXIzMl9iaXRzOworI2VuZGlmCisjZW5kaWYKIAogLyogVGhpcyBtYWNybyBtZXJnZXMgYSBORVcgUFNXIG1hc2sgc3BlY2lmaWVkIGJ5IHRoZSB1c2VyIGludG8KICAgIHRoZSBjdXJyZW50bHkgYWN0aXZlIFBTVyBtYXNrIENVUlJFTlQsIG1vZGlmeWluZyBvbmx5IHRob3NlCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vcWV0aC5oIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3FldGguaAppbmRleCA5MzBkMzc4Li4wNmNiZDFlIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vcWV0aC5oCisrKyBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9xZXRoLmgKQEAgLTEwLDYgKzEwLDcgQEAKICAqLwogI2lmbmRlZiBfX0FTTV9TMzkwX1FFVEhfSU9DVExfSF9fCiAjZGVmaW5lIF9fQVNNX1MzOTBfUUVUSF9JT0NUTF9IX18KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+CiAKICNkZWZpbmUgU0lPQ19RRVRIX0FSUF9TRVRfTk9fRU5UUklFUyAgICAoU0lPQ0RFVlBSSVZBVEUpCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vc2NoaWQuaCBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9zY2hpZC5oCmluZGV4IDgyNTUwM2MuLjNlNGQ0MDEgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9zY2hpZC5oCisrKyBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9zY2hpZC5oCkBAIC0xLDYgKzEsOCBAQAogI2lmbmRlZiBBU01fU0NISURfSAogI2RlZmluZSBBU01fU0NISURfSAogCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKwogc3RydWN0IHN1YmNoYW5uZWxfaWQgewogCV9fdTMyIGNzc2lkIDogODsKIAlfX3UzMiA6IDQ7CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vc3dhYi5oIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3N3YWIuaAppbmRleCBiZDkzMjFhLi5lYjE4ZGMxIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vc3dhYi5oCisrKyBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9zd2FiLmgKQEAgLTksNyArOSw3IEBACiAgKiAgICBBdXRob3Iocyk6IE1hcnRpbiBTY2h3aWRlZnNreSAoc2Nod2lkZWZza3lAZGUuaWJtLmNvbSkKICAqLwogCi0jaW5jbHVkZSA8YXNtL3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KIAogI2lmbmRlZiBfX3MzOTB4X18KICMgZGVmaW5lIF9fU1dBQl82NF9USFJVXzMyX18KZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS90eXBlcy5oIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3R5cGVzLmgKaW5kZXggNDFjNTQ3Ni4uM2RjM2ZjMiAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3R5cGVzLmgKKysrIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3R5cGVzLmgKQEAgLTksMTEgKzksNyBAQAogI2lmbmRlZiBfUzM5MF9UWVBFU19ICiAjZGVmaW5lIF9TMzkwX1RZUEVTX0gKIAotI2lmbmRlZiBfX3MzOTB4X18KLSMgaW5jbHVkZSA8YXNtLWdlbmVyaWMvaW50LWxsNjQuaD4KLSNlbHNlCi0jIGluY2x1ZGUgPGFzbS1nZW5lcmljL2ludC1sNjQuaD4KLSNlbmRpZgorI2luY2x1ZGUgPGFzbS1nZW5lcmljL2ludC1sbDY0Lmg+CiAKICNpZm5kZWYgX19BU1NFTUJMWV9fCiAKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvY29tcGF0X3dyYXBwZXIuUyBiL2FyY2gvczM5MC9rZXJuZWwvY29tcGF0X3dyYXBwZXIuUwppbmRleCBmYzJjOTcxLi42MDM1Y2QyIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL2NvbXBhdF93cmFwcGVyLlMKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9jb21wYXRfd3JhcHBlci5TCkBAIC01NDcsNyArNTQ3LDcgQEAKIAkuZ2xvYmwJc3lzMzJfbmV3dW5hbWVfd3JhcHBlcgogc3lzMzJfbmV3dW5hbWVfd3JhcHBlcjoKIAlsbGd0cgklcjIsJXIyCQkJIyBzdHJ1Y3QgbmV3X3V0c25hbWUgKgotCWpnCXMzOTB4X25ld3VuYW1lCQkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAorCWpnCXN5c19zMzkwX25ld3VuYW1lCSMgYnJhbmNoIHRvIHN5c3RlbSBjYWxsCiAKIAkuZ2xvYmwJY29tcGF0X3N5c19hZGp0aW1leF93cmFwcGVyCiBjb21wYXRfc3lzX2FkanRpbWV4X3dyYXBwZXI6CkBAIC02MTUsNyArNjE1LDcgQEAKIAkuZ2xvYmwJc3lzMzJfcGVyc29uYWxpdHlfd3JhcHBlcgogc3lzMzJfcGVyc29uYWxpdHlfd3JhcHBlcjoKIAlsbGdmcgklcjIsJXIyCQkJIyB1bnNpZ25lZCBsb25nCi0JamcJczM5MHhfcGVyc29uYWxpdHkJIyBicmFuY2ggdG8gc3lzdGVtIGNhbGwKKwlqZwlzeXNfczM5MF9wZXJzb25hbGl0eQkjIGJyYW5jaCB0byBzeXN0ZW0gY2FsbAogCiAJLmdsb2JsCXN5czMyX3NldGZzdWlkMTZfd3JhcHBlcgogc3lzMzJfc2V0ZnN1aWQxNl93cmFwcGVyOgpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9lbnRyeS5oIGIvYXJjaC9zMzkwL2tlcm5lbC9lbnRyeS5oCmluZGV4IDZiMTg5NjMuLjk1MGM1OWMgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rZXJuZWwvZW50cnkuaAorKysgYi9hcmNoL3MzOTAva2VybmVsL2VudHJ5LmgKQEAgLTMwLDIzICszMCwyMyBAQAogc3RydWN0IG9sZF9zaWdhY3Rpb247CiBzdHJ1Y3Qgc2VsX2FyZ19zdHJ1Y3Q7CiAKLWxvbmcgc3lzX3BpcGUodW5zaWduZWQgbG9uZyBfX3VzZXIgKmZpbGRlcyk7CiBsb25nIHN5c19tbWFwMihzdHJ1Y3QgbW1hcF9hcmdfc3RydWN0IF9fdXNlciAgKmFyZyk7Ci1sb25nIG9sZF9tbWFwKHN0cnVjdCBtbWFwX2FyZ19zdHJ1Y3QgX191c2VyICphcmcpOworbG9uZyBzeXNfczM5MF9vbGRfbW1hcChzdHJ1Y3QgbW1hcF9hcmdfc3RydWN0IF9fdXNlciAqYXJnKTsKIGxvbmcgc3lzX2lwYyh1aW50IGNhbGwsIGludCBmaXJzdCwgdW5zaWduZWQgbG9uZyBzZWNvbmQsCiAJICAgICB1bnNpZ25lZCBsb25nIHRoaXJkLCB2b2lkIF9fdXNlciAqcHRyKTsKLWxvbmcgczM5MHhfbmV3dW5hbWUoc3RydWN0IG5ld191dHNuYW1lIF9fdXNlciAqbmFtZSk7Ci1sb25nIHMzOTB4X3BlcnNvbmFsaXR5KHVuc2lnbmVkIGxvbmcgcGVyc29uYWxpdHkpOwotbG9uZyBzMzkwX2ZhZHZpc2U2NChpbnQgZmQsIHUzMiBvZmZzZXRfaGlnaCwgdTMyIG9mZnNldF9sb3csCitsb25nIHN5c19zMzkwX25ld3VuYW1lKHN0cnVjdCBuZXdfdXRzbmFtZSBfX3VzZXIgKm5hbWUpOworbG9uZyBzeXNfczM5MF9wZXJzb25hbGl0eSh1bnNpZ25lZCBsb25nIHBlcnNvbmFsaXR5KTsKK2xvbmcgc3lzX3MzOTBfZmFkdmlzZTY0KGludCBmZCwgdTMyIG9mZnNldF9oaWdoLCB1MzIgb2Zmc2V0X2xvdywKIAkJICAgIHNpemVfdCBsZW4sIGludCBhZHZpY2UpOwotbG9uZyBzMzkwX2ZhZHZpc2U2NF82NChzdHJ1Y3QgZmFkdmlzZTY0XzY0X2FyZ3MgX191c2VyICphcmdzKTsKLWxvbmcgczM5MF9mYWxsb2NhdGUoaW50IGZkLCBpbnQgbW9kZSwgbG9mZl90IG9mZnNldCwgdTMyIGxlbl9oaWdoLCB1MzIgbGVuX2xvdyk7Citsb25nIHN5c19zMzkwX2ZhZHZpc2U2NF82NChzdHJ1Y3QgZmFkdmlzZTY0XzY0X2FyZ3MgX191c2VyICphcmdzKTsKK2xvbmcgc3lzX3MzOTBfZmFsbG9jYXRlKGludCBmZCwgaW50IG1vZGUsIGxvZmZfdCBvZmZzZXQsIHUzMiBsZW5faGlnaCwKKwkJCXUzMiBsZW5fbG93KTsKIGxvbmcgc3lzX2Zvcmsodm9pZCk7CiBsb25nIHN5c19jbG9uZSh2b2lkKTsKIGxvbmcgc3lzX3Zmb3JrKHZvaWQpOwogdm9pZCBleGVjdmVfdGFpbCh2b2lkKTsKIGxvbmcgc3lzX2V4ZWN2ZSh2b2lkKTsKLWludCBzeXNfc2lnc3VzcGVuZChpbnQgaGlzdG9yeTAsIGludCBoaXN0b3J5MSwgb2xkX3NpZ3NldF90IG1hc2spOworbG9uZyBzeXNfc2lnc3VzcGVuZChpbnQgaGlzdG9yeTAsIGludCBoaXN0b3J5MSwgb2xkX3NpZ3NldF90IG1hc2spOwogbG9uZyBzeXNfc2lnYWN0aW9uKGludCBzaWcsIGNvbnN0IHN0cnVjdCBvbGRfc2lnYWN0aW9uIF9fdXNlciAqYWN0LAogCQkgICBzdHJ1Y3Qgb2xkX3NpZ2FjdGlvbiBfX3VzZXIgKm9hY3QpOwogbG9uZyBzeXNfc2lnYWx0c3RhY2soY29uc3Qgc3RhY2tfdCBfX3VzZXIgKnVzcywgc3RhY2tfdCBfX3VzZXIgKnVvc3MpOwpAQCAtNTQsNyArNTQsNSBAQAogbG9uZyBzeXNfcnRfc2lncmV0dXJuKHZvaWQpOwogbG9uZyBzeXMzMl9zaWdyZXR1cm4odm9pZCk7CiBsb25nIHN5czMyX3J0X3NpZ3JldHVybih2b2lkKTsKLWxvbmcgb2xkX3NlbGVjdChzdHJ1Y3Qgc2VsX2FyZ19zdHJ1Y3QgX191c2VyICphcmcpOwotbG9uZyBzeXNfcHRyYWNlKGxvbmcgcmVxdWVzdCwgbG9uZyBwaWQsIGxvbmcgYWRkciwgbG9uZyBkYXRhKTsKIAogI2VuZGlmIC8qIF9FTlRSWV9IICovCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL2twcm9iZXMuYyBiL2FyY2gvczM5MC9rZXJuZWwva3Byb2Jlcy5jCmluZGV4IDliOTI4NTYuLmEwMWNmMDIgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rZXJuZWwva3Byb2Jlcy5jCisrKyBiL2FyY2gvczM5MC9rZXJuZWwva3Byb2Jlcy5jCkBAIC0zODIsNyArMzgyLDcgQEAKIAkvKgogCSAqIEl0IGlzIHBvc3NpYmxlIHRvIGhhdmUgbXVsdGlwbGUgaW5zdGFuY2VzIGFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuCiAJICogdGFzayBlaXRoZXIgYmVjYXVzZSBhbiBtdWx0aXBsZSBmdW5jdGlvbnMgaW4gdGhlIGNhbGwgcGF0aAotCSAqIGhhdmUgYSByZXR1cm4gcHJvYmUgaW5zdGFsbGVkIG9uIHRoZW0sIGFuZC9vciBtb3JlIHRoZW4gb25lIHJldHVybgorCSAqIGhhdmUgYSByZXR1cm4gcHJvYmUgaW5zdGFsbGVkIG9uIHRoZW0sIGFuZC9vciBtb3JlIHRoYW4gb25lIHJldHVybgogCSAqIHJldHVybiBwcm9iZSB3YXMgcmVnaXN0ZXJlZCBmb3IgYSB0YXJnZXQgZnVuY3Rpb24uCiAJICoKIAkgKiBXZSBjYW4gaGFuZGxlIHRoaXMgYmVjYXVzZToKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvcHJvY2Vzcy5jIGIvYXJjaC9zMzkwL2tlcm5lbC9wcm9jZXNzLmMKaW5kZXggYjYxMTBiZC4uNWNkMzhhOSAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC9wcm9jZXNzLmMKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9wcm9jZXNzLmMKQEAgLTM5LDYgKzM5LDcgQEAKICNpbmNsdWRlIDxsaW51eC90aWNrLmg+CiAjaW5jbHVkZSA8bGludXgvZWxmY29yZS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbF9zdGF0Lmg+CisjaW5jbHVkZSA8bGludXgvc3lzY2FsbHMuaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgpAQCAtMjI1LDEzICsyMjYsMTMgQEAKICAgICAgICAgcmV0dXJuIDA7CiB9CiAKLWFzbWxpbmthZ2UgbG9uZyBzeXNfZm9yayh2b2lkKQorU1lTQ0FMTF9ERUZJTkUwKGZvcmspCiB7CiAJc3RydWN0IHB0X3JlZ3MgKnJlZ3MgPSB0YXNrX3B0X3JlZ3MoY3VycmVudCk7CiAJcmV0dXJuIGRvX2ZvcmsoU0lHQ0hMRCwgcmVncy0+Z3Byc1sxNV0sIHJlZ3MsIDAsIE5VTEwsIE5VTEwpOwogfQogCi1hc21saW5rYWdlIGxvbmcgc3lzX2Nsb25lKHZvaWQpCitTWVNDQUxMX0RFRklORTAoY2xvbmUpCiB7CiAJc3RydWN0IHB0X3JlZ3MgKnJlZ3MgPSB0YXNrX3B0X3JlZ3MoY3VycmVudCk7CiAJdW5zaWduZWQgbG9uZyBjbG9uZV9mbGFnczsKQEAgLTI1OCw3ICsyNTksNyBAQAogICogZG8gbm90IGhhdmUgZW5vdWdoIGNhbGwtY2xvYmJlcmVkIHJlZ2lzdGVycyB0byBob2xkIGFsbAogICogdGhlIGluZm9ybWF0aW9uIHlvdSBuZWVkLgogICovCi1hc21saW5rYWdlIGxvbmcgc3lzX3Zmb3JrKHZvaWQpCitTWVNDQUxMX0RFRklORTAodmZvcmspCiB7CiAJc3RydWN0IHB0X3JlZ3MgKnJlZ3MgPSB0YXNrX3B0X3JlZ3MoY3VycmVudCk7CiAJcmV0dXJuIGRvX2ZvcmsoQ0xPTkVfVkZPUksgfCBDTE9ORV9WTSB8IFNJR0NITEQsCkBAIC0yNzgsNyArMjc5LDcgQEAKIC8qCiAgKiBzeXNfZXhlY3ZlKCkgZXhlY3V0ZXMgYSBuZXcgcHJvZ3JhbS4KICAqLwotYXNtbGlua2FnZSBsb25nIHN5c19leGVjdmUodm9pZCkKK1NZU0NBTExfREVGSU5FMChleGVjdmUpCiB7CiAJc3RydWN0IHB0X3JlZ3MgKnJlZ3MgPSB0YXNrX3B0X3JlZ3MoY3VycmVudCk7CiAJY2hhciAqZmlsZW5hbWU7CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL3NpZ25hbC5jIGIvYXJjaC9zMzkwL2tlcm5lbC9zaWduYWwuYwppbmRleCA4ZTY4MTJhLi4zY2Y3NGMzIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL3NpZ25hbC5jCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvc2lnbmFsLmMKQEAgLTI1LDYgKzI1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9wZXJzb25hbGl0eS5oPgogI2luY2x1ZGUgPGxpbnV4L2JpbmZtdHMuaD4KICNpbmNsdWRlIDxsaW51eC90cmFjZWhvb2suaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNjYWxscy5oPgogI2luY2x1ZGUgPGFzbS91Y29udGV4dC5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL2xvd2NvcmUuaD4KQEAgLTUzLDggKzU0LDcgQEAKIC8qCiAgKiBBdG9taWNhbGx5IHN3YXAgaW4gdGhlIG5ldyBzaWduYWwgbWFzaywgYW5kIHdhaXQgZm9yIGEgc2lnbmFsLgogICovCi1hc21saW5rYWdlIGludAotc3lzX3NpZ3N1c3BlbmQoaW50IGhpc3RvcnkwLCBpbnQgaGlzdG9yeTEsIG9sZF9zaWdzZXRfdCBtYXNrKQorU1lTQ0FMTF9ERUZJTkUzKHNpZ3N1c3BlbmQsIGludCwgaGlzdG9yeTAsIGludCwgaGlzdG9yeTEsIG9sZF9zaWdzZXRfdCwgbWFzaykKIHsKIAltYXNrICY9IF9CTE9DS0FCTEU7CiAJc3Bpbl9sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7CkBAIC03MCw5ICs3MCw4IEBACiAJcmV0dXJuIC1FUkVTVEFSVE5PSEFORDsKIH0KIAotYXNtbGlua2FnZSBsb25nCi1zeXNfc2lnYWN0aW9uKGludCBzaWcsIGNvbnN0IHN0cnVjdCBvbGRfc2lnYWN0aW9uIF9fdXNlciAqYWN0LAotCSAgICAgIHN0cnVjdCBvbGRfc2lnYWN0aW9uIF9fdXNlciAqb2FjdCkKK1NZU0NBTExfREVGSU5FMyhzaWdhY3Rpb24sIGludCwgc2lnLCBjb25zdCBzdHJ1Y3Qgb2xkX3NpZ2FjdGlvbiBfX3VzZXIgKiwgYWN0LAorCQlzdHJ1Y3Qgb2xkX3NpZ2FjdGlvbiBfX3VzZXIgKiwgb2FjdCkKIHsKIAlzdHJ1Y3Qga19zaWdhY3Rpb24gbmV3X2thLCBvbGRfa2E7CiAJaW50IHJldDsKQEAgLTEwMiwxNSArMTAxLDEzIEBACiAJcmV0dXJuIHJldDsKIH0KIAotYXNtbGlua2FnZSBsb25nCi1zeXNfc2lnYWx0c3RhY2soY29uc3Qgc3RhY2tfdCBfX3VzZXIgKnVzcywgc3RhY2tfdCBfX3VzZXIgKnVvc3MpCitTWVNDQUxMX0RFRklORTIoc2lnYWx0c3RhY2ssIGNvbnN0IHN0YWNrX3QgX191c2VyICosIHVzcywKKwkJc3RhY2tfdCBfX3VzZXIgKiwgdW9zcykKIHsKIAlzdHJ1Y3QgcHRfcmVncyAqcmVncyA9IHRhc2tfcHRfcmVncyhjdXJyZW50KTsKIAlyZXR1cm4gZG9fc2lnYWx0c3RhY2sodXNzLCB1b3NzLCByZWdzLT5ncHJzWzE1XSk7CiB9CiAKLQotCiAvKiBSZXR1cm5zIG5vbi16ZXJvIG9uIGZhdWx0LiAqLwogc3RhdGljIGludCBzYXZlX3NpZ3JlZ3Moc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIF9zaWdyZWdzIF9fdXNlciAqc3JlZ3MpCiB7CkBAIC0xNjQsNyArMTYxLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotYXNtbGlua2FnZSBsb25nIHN5c19zaWdyZXR1cm4odm9pZCkKK1NZU0NBTExfREVGSU5FMChzaWdyZXR1cm4pCiB7CiAJc3RydWN0IHB0X3JlZ3MgKnJlZ3MgPSB0YXNrX3B0X3JlZ3MoY3VycmVudCk7CiAJc2lnZnJhbWUgX191c2VyICpmcmFtZSA9IChzaWdmcmFtZSBfX3VzZXIgKilyZWdzLT5ncHJzWzE1XTsKQEAgLTE5MSw3ICsxODgsNyBAQAogCXJldHVybiAwOwogfQogCi1hc21saW5rYWdlIGxvbmcgc3lzX3J0X3NpZ3JldHVybih2b2lkKQorU1lTQ0FMTF9ERUZJTkUwKHJ0X3NpZ3JldHVybikKIHsKIAlzdHJ1Y3QgcHRfcmVncyAqcmVncyA9IHRhc2tfcHRfcmVncyhjdXJyZW50KTsKIAlydF9zaWdmcmFtZSBfX3VzZXIgKmZyYW1lID0gKHJ0X3NpZ2ZyYW1lIF9fdXNlciAqKXJlZ3MtPmdwcnNbMTVdOwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9zbXAuYyBiL2FyY2gvczM5MC9rZXJuZWwvc21wLmMKaW5kZXggOWMwY2NiNS4uMmQzMzdjYiAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC9zbXAuYworKysgYi9hcmNoL3MzOTAva2VybmVsL3NtcC5jCkBAIC02ODUsNyArNjg1LDggQEAKIAlpZiAoTUFDSElORV9IQVNfSUVFRSkKIAkJbG93Y29yZS0+ZXh0ZW5kZWRfc2F2ZV9hcmVhX2FkZHIgPSAodTMyKSBzYXZlX2FyZWE7CiAjZWxzZQotCUJVR19PTih2ZHNvX2FsbG9jX3Blcl9jcHUoc21wX3Byb2Nlc3Nvcl9pZCgpLCBsb3djb3JlKSk7CisJaWYgKHZkc29fYWxsb2NfcGVyX2NwdShzbXBfcHJvY2Vzc29yX2lkKCksIGxvd2NvcmUpKQorCQlCVUcoKTsKICNlbmRpZgogCXNldF9wcmVmaXgoKHUzMikodW5zaWduZWQgbG9uZykgbG93Y29yZSk7CiAJbG9jYWxfbWNja19lbmFibGUoKTsKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvc3lzX3MzOTAuYyBiL2FyY2gvczM5MC9rZXJuZWwvc3lzX3MzOTAuYwppbmRleCA0ZmU5NTJlLi5jN2FlNGIxIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL3N5c19zMzkwLmMKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9zeXNfczM5MC5jCkBAIC0yOSw2ICsyOSw3IEBACiAjaW5jbHVkZSA8bGludXgvcGVyc29uYWxpdHkuaD4KICNpbmNsdWRlIDxsaW51eC91bmlzdGQuaD4KICNpbmNsdWRlIDxsaW51eC9pcGMuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNjYWxscy5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSAiZW50cnkuaCIKIApAQCAtNzQsNyArNzUsNyBAQAogCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OwogfTsKIAotYXNtbGlua2FnZSBsb25nIHN5c19tbWFwMihzdHJ1Y3QgbW1hcF9hcmdfc3RydWN0IF9fdXNlciAgKmFyZykKK1NZU0NBTExfREVGSU5FMShtbWFwMiwgc3RydWN0IG1tYXBfYXJnX3N0cnVjdCBfX3VzZXIgKiwgYXJnKQogewogCXN0cnVjdCBtbWFwX2FyZ19zdHJ1Y3QgYTsKIAlpbnQgZXJyb3IgPSAtRUZBVUxUOwpAQCAtODYsNyArODcsNyBAQAogCXJldHVybiBlcnJvcjsKIH0KIAotYXNtbGlua2FnZSBsb25nIG9sZF9tbWFwKHN0cnVjdCBtbWFwX2FyZ19zdHJ1Y3QgX191c2VyICphcmcpCitTWVNDQUxMX0RFRklORTEoczM5MF9vbGRfbW1hcCwgc3RydWN0IG1tYXBfYXJnX3N0cnVjdCBfX3VzZXIgKiwgYXJnKQogewogCXN0cnVjdCBtbWFwX2FyZ19zdHJ1Y3QgYTsKIAlsb25nIGVycm9yID0gLUVGQVVMVDsKQEAgLTEwMywzMiArMTA0LDEzIEBACiAJcmV0dXJuIGVycm9yOwogfQogCi0jaWZuZGVmIENPTkZJR182NEJJVAotc3RydWN0IHNlbF9hcmdfc3RydWN0IHsKLQl1bnNpZ25lZCBsb25nIG47Ci0JZmRfc2V0IF9fdXNlciAqaW5wLCAqb3V0cCwgKmV4cDsKLQlzdHJ1Y3QgdGltZXZhbCBfX3VzZXIgKnR2cDsKLX07Ci0KLWFzbWxpbmthZ2UgbG9uZyBvbGRfc2VsZWN0KHN0cnVjdCBzZWxfYXJnX3N0cnVjdCBfX3VzZXIgKmFyZykKLXsKLQlzdHJ1Y3Qgc2VsX2FyZ19zdHJ1Y3QgYTsKLQotCWlmIChjb3B5X2Zyb21fdXNlcigmYSwgYXJnLCBzaXplb2YoYSkpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQkvKiBzeXNfc2VsZWN0KCkgZG9lcyB0aGUgYXBwcm9wcmlhdGUga2VybmVsIGxvY2tpbmcgKi8KLQlyZXR1cm4gc3lzX3NlbGVjdChhLm4sIGEuaW5wLCBhLm91dHAsIGEuZXhwLCBhLnR2cCk7Ci0KLX0KLSNlbmRpZiAvKiBDT05GSUdfNjRCSVQgKi8KLQogLyoKICAqIHN5c19pcGMoKSBpcyB0aGUgZGUtbXVsdGlwbGV4ZXIgZm9yIHRoZSBTeXNWIElQQyBjYWxscy4uCiAgKgogICogVGhpcyBpcyByZWFsbHkgaG9ycmlibHkgdWdseS4KICAqLwotYXNtbGlua2FnZSBsb25nIHN5c19pcGModWludCBjYWxsLCBpbnQgZmlyc3QsIHVuc2lnbmVkIGxvbmcgc2Vjb25kLAotCQkJCSAgdW5zaWduZWQgbG9uZyB0aGlyZCwgdm9pZCBfX3VzZXIgKnB0cikKK1NZU0NBTExfREVGSU5FNShpcGMsIHVpbnQsIGNhbGwsIGludCwgZmlyc3QsIHVuc2lnbmVkIGxvbmcsIHNlY29uZCwKKwkJdW5zaWduZWQgbG9uZywgdGhpcmQsIHZvaWQgX191c2VyICosIHB0cikKIHsKICAgICAgICAgc3RydWN0IGlwY19rbHVkZ2UgdG1wOwogCWludCByZXQ7CkBAIC0xOTQsNyArMTc2LDcgQEAKIH0KIAogI2lmZGVmIENPTkZJR182NEJJVAotYXNtbGlua2FnZSBsb25nIHMzOTB4X25ld3VuYW1lKHN0cnVjdCBuZXdfdXRzbmFtZSBfX3VzZXIgKm5hbWUpCitTWVNDQUxMX0RFRklORTEoczM5MF9uZXd1bmFtZSwgc3RydWN0IG5ld191dHNuYW1lIF9fdXNlciAqLCBuYW1lKQogewogCWludCByZXQgPSBzeXNfbmV3dW5hbWUobmFtZSk7CiAKQEAgLTIwNSw3ICsxODcsNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLWFzbWxpbmthZ2UgbG9uZyBzMzkweF9wZXJzb25hbGl0eSh1bnNpZ25lZCBsb25nIHBlcnNvbmFsaXR5KQorU1lTQ0FMTF9ERUZJTkUxKHMzOTBfcGVyc29uYWxpdHksIHVuc2lnbmVkIGxvbmcsIHBlcnNvbmFsaXR5KQogewogCWludCByZXQ7CiAKQEAgLTIyNCwxNSArMjA2LDEzIEBACiAgKi8KICNpZm5kZWYgQ09ORklHXzY0QklUCiAKLWFzbWxpbmthZ2UgbG9uZwotczM5MF9mYWR2aXNlNjQoaW50IGZkLCB1MzIgb2Zmc2V0X2hpZ2gsIHUzMiBvZmZzZXRfbG93LCBzaXplX3QgbGVuLCBpbnQgYWR2aWNlKQorU1lTQ0FMTF9ERUZJTkU1KHMzOTBfZmFkdmlzZTY0LCBpbnQsIGZkLCB1MzIsIG9mZnNldF9oaWdoLCB1MzIsIG9mZnNldF9sb3csCisJCXNpemVfdCwgbGVuLCBpbnQsIGFkdmljZSkKIHsKIAlyZXR1cm4gc3lzX2ZhZHZpc2U2NChmZCwgKHU2NCkgb2Zmc2V0X2hpZ2ggPDwgMzIgfCBvZmZzZXRfbG93LAogCQkJbGVuLCBhZHZpY2UpOwogfQogCi0jZW5kaWYKLQogc3RydWN0IGZhZHZpc2U2NF82NF9hcmdzIHsKIAlpbnQgZmQ7CiAJbG9uZyBsb25nIG9mZnNldDsKQEAgLTI0MCw4ICsyMjAsNyBAQAogCWludCBhZHZpY2U7CiB9OwogCi1hc21saW5rYWdlIGxvbmcKLXMzOTBfZmFkdmlzZTY0XzY0KHN0cnVjdCBmYWR2aXNlNjRfNjRfYXJncyBfX3VzZXIgKmFyZ3MpCitTWVNDQUxMX0RFRklORTEoczM5MF9mYWR2aXNlNjRfNjQsIHN0cnVjdCBmYWR2aXNlNjRfNjRfYXJncyBfX3VzZXIgKiwgYXJncykKIHsKIAlzdHJ1Y3QgZmFkdmlzZTY0XzY0X2FyZ3MgYTsKIApAQCAtMjUwLDcgKzIyOSw2IEBACiAJcmV0dXJuIHN5c19mYWR2aXNlNjRfNjQoYS5mZCwgYS5vZmZzZXQsIGEubGVuLCBhLmFkdmljZSk7CiB9CiAKLSNpZm5kZWYgQ09ORklHXzY0QklUCiAvKgogICogVGhpcyBpcyBhIHdyYXBwZXIgdG8gY2FsbCBzeXNfZmFsbG9jYXRlKCkuIEZvciAzMSBiaXQgczM5MCB0aGUgbGFzdAogICogNjQgYml0IGFyZ3VtZW50ICJsZW4iIGlzIHNwbGl0IGludG8gdGhlIHVwcGVyIGFuZCBsb3dlciAzMiBiaXRzLiBUaGUKQEAgLTI2Myw5ICsyNDEsMTkgQEAKICAqIHRvCiAgKiAgICVyMjogZmQsICVyMzogbW9kZSwgJXI0LyVyNTogb2Zmc2V0LCA5NiglcjE1KS0xMDMoJXIxNSk6IGxlbgogICovCi1hc21saW5rYWdlIGxvbmcgczM5MF9mYWxsb2NhdGUoaW50IGZkLCBpbnQgbW9kZSwgbG9mZl90IG9mZnNldCwKK1NZU0NBTExfREVGSU5FKHMzOTBfZmFsbG9jYXRlKShpbnQgZmQsIGludCBtb2RlLCBsb2ZmX3Qgb2Zmc2V0LAogCQkJICAgICAgIHUzMiBsZW5faGlnaCwgdTMyIGxlbl9sb3cpCiB7CiAJcmV0dXJuIHN5c19mYWxsb2NhdGUoZmQsIG1vZGUsIG9mZnNldCwgKCh1NjQpbGVuX2hpZ2ggPDwgMzIpIHwgbGVuX2xvdyk7CiB9CisjaWZkZWYgQ09ORklHX0hBVkVfU1lTQ0FMTF9XUkFQUEVSUworYXNtbGlua2FnZSBsb25nIFN5U19zMzkwX2ZhbGxvY2F0ZShsb25nIGZkLCBsb25nIG1vZGUsIGxvZmZfdCBvZmZzZXQsCisJCQkJICAgbG9uZyBsZW5faGlnaCwgbG9uZyBsZW5fbG93KQoreworCXJldHVybiBTWVNDX3MzOTBfZmFsbG9jYXRlKChpbnQpIGZkLCAoaW50KSBtb2RlLCBvZmZzZXQsCisJCQkJICAgKHUzMikgbGVuX2hpZ2gsICh1MzIpIGxlbl9sb3cpOworfQorU1lTQ0FMTF9BTElBUyhzeXNfczM5MF9mYWxsb2NhdGUsIFN5U19zMzkwX2ZhbGxvY2F0ZSk7CisjZW5kaWYKKwogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL3N5c2NhbGxzLlMgYi9hcmNoL3MzOTAva2VybmVsL3N5c2NhbGxzLlMKaW5kZXggMmQ2MTc4Ny4uNzZkMTZlMCAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC9zeXNjYWxscy5TCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvc3lzY2FsbHMuUwpAQCAtOTgsNyArOTgsNyBAQAogU1lTQ0FMTChzeXNfc3dhcG9uLHN5c19zd2Fwb24sc3lzMzJfc3dhcG9uX3dyYXBwZXIpCiBTWVNDQUxMKHN5c19yZWJvb3Qsc3lzX3JlYm9vdCxzeXMzMl9yZWJvb3Rfd3JhcHBlcikKIFNZU0NBTEwoc3lzX25pX3N5c2NhbGwsc3lzX25pX3N5c2NhbGwsb2xkMzJfcmVhZGRpcl93cmFwcGVyKQkvKiBvbGQgcmVhZGRpciBzeXNjYWxsICovCi1TWVNDQUxMKG9sZF9tbWFwLG9sZF9tbWFwLG9sZDMyX21tYXBfd3JhcHBlcikJCQkvKiA5MCAqLworU1lTQ0FMTChzeXNfczM5MF9vbGRfbW1hcCxzeXNfczM5MF9vbGRfbW1hcCxvbGQzMl9tbWFwX3dyYXBwZXIpCS8qIDkwICovCiBTWVNDQUxMKHN5c19tdW5tYXAsc3lzX211bm1hcCxzeXMzMl9tdW5tYXBfd3JhcHBlcikKIFNZU0NBTEwoc3lzX3RydW5jYXRlLHN5c190cnVuY2F0ZSxzeXMzMl90cnVuY2F0ZV93cmFwcGVyKQogU1lTQ0FMTChzeXNfZnRydW5jYXRlLHN5c19mdHJ1bmNhdGUsc3lzMzJfZnRydW5jYXRlX3dyYXBwZXIpCkBAIC0xMzAsNyArMTMwLDcgQEAKIFNZU0NBTEwoc3lzX3NpZ3JldHVybixzeXNfc2lncmV0dXJuLHN5czMyX3NpZ3JldHVybikKIFNZU0NBTEwoc3lzX2Nsb25lLHN5c19jbG9uZSxzeXMzMl9jbG9uZSkJCQkvKiAxMjAgKi8KIFNZU0NBTEwoc3lzX3NldGRvbWFpbm5hbWUsc3lzX3NldGRvbWFpbm5hbWUsc3lzMzJfc2V0ZG9tYWlubmFtZV93cmFwcGVyKQotU1lTQ0FMTChzeXNfbmV3dW5hbWUsczM5MHhfbmV3dW5hbWUsc3lzMzJfbmV3dW5hbWVfd3JhcHBlcikKK1NZU0NBTEwoc3lzX25ld3VuYW1lLHN5c19zMzkwX25ld3VuYW1lLHN5czMyX25ld3VuYW1lX3dyYXBwZXIpCiBOSV9TWVNDQUxMCQkJCQkJCS8qIG1vZGlmeV9sZHQgZm9yIGkzODYgKi8KIFNZU0NBTEwoc3lzX2FkanRpbWV4LHN5c19hZGp0aW1leCxjb21wYXRfc3lzX2FkanRpbWV4X3dyYXBwZXIpCiBTWVNDQUxMKHN5c19tcHJvdGVjdCxzeXNfbXByb3RlY3Qsc3lzMzJfbXByb3RlY3Rfd3JhcHBlcikJLyogMTI1ICovCkBAIC0xNDQsNyArMTQ0LDcgQEAKIFNZU0NBTEwoc3lzX2ZjaGRpcixzeXNfZmNoZGlyLHN5czMyX2ZjaGRpcl93cmFwcGVyKQogU1lTQ0FMTChzeXNfYmRmbHVzaCxzeXNfYmRmbHVzaCxzeXMzMl9iZGZsdXNoX3dyYXBwZXIpCiBTWVNDQUxMKHN5c19zeXNmcyxzeXNfc3lzZnMsc3lzMzJfc3lzZnNfd3JhcHBlcikJCS8qIDEzNSAqLwotU1lTQ0FMTChzeXNfcGVyc29uYWxpdHksczM5MHhfcGVyc29uYWxpdHksc3lzMzJfcGVyc29uYWxpdHlfd3JhcHBlcikKK1NZU0NBTEwoc3lzX3BlcnNvbmFsaXR5LHN5c19zMzkwX3BlcnNvbmFsaXR5LHN5czMyX3BlcnNvbmFsaXR5X3dyYXBwZXIpCiBOSV9TWVNDQUxMCQkJCQkJCS8qIGZvciBhZnNfc3lzY2FsbCAqLwogU1lTQ0FMTChzeXNfc2V0ZnN1aWQxNixzeXNfbmlfc3lzY2FsbCxzeXMzMl9zZXRmc3VpZDE2X3dyYXBwZXIpCS8qIG9sZCBzZXRmc3VpZDE2IHN5c2NhbGwgKi8KIFNZU0NBTEwoc3lzX3NldGZzZ2lkMTYsc3lzX25pX3N5c2NhbGwsc3lzMzJfc2V0ZnNnaWQxNl93cmFwcGVyKQkvKiBvbGQgc2V0ZnNnaWQxNiBzeXNjYWxsICovCkBAIC0yNjEsNyArMjYxLDcgQEAKIFNZU0NBTEwoc3lzX2Vwb2xsX2N0bCxzeXNfZXBvbGxfY3RsLHN5c19lcG9sbF9jdGxfd3JhcHBlcikJLyogMjUwICovCiBTWVNDQUxMKHN5c19lcG9sbF93YWl0LHN5c19lcG9sbF93YWl0LHN5c19lcG9sbF93YWl0X3dyYXBwZXIpCiBTWVNDQUxMKHN5c19zZXRfdGlkX2FkZHJlc3Msc3lzX3NldF90aWRfYWRkcmVzcyxzeXMzMl9zZXRfdGlkX2FkZHJlc3Nfd3JhcHBlcikKLVNZU0NBTEwoczM5MF9mYWR2aXNlNjQsc3lzX2ZhZHZpc2U2NF82NCxzeXMzMl9mYWR2aXNlNjRfd3JhcHBlcikKK1NZU0NBTEwoc3lzX3MzOTBfZmFkdmlzZTY0LHN5c19mYWR2aXNlNjRfNjQsc3lzMzJfZmFkdmlzZTY0X3dyYXBwZXIpCiBTWVNDQUxMKHN5c190aW1lcl9jcmVhdGUsc3lzX3RpbWVyX2NyZWF0ZSxzeXMzMl90aW1lcl9jcmVhdGVfd3JhcHBlcikKIFNZU0NBTEwoc3lzX3RpbWVyX3NldHRpbWUsc3lzX3RpbWVyX3NldHRpbWUsc3lzMzJfdGltZXJfc2V0dGltZV93cmFwcGVyKQkvKiAyNTUgKi8KIFNZU0NBTEwoc3lzX3RpbWVyX2dldHRpbWUsc3lzX3RpbWVyX2dldHRpbWUsc3lzMzJfdGltZXJfZ2V0dGltZV93cmFwcGVyKQpAQCAtMjcyLDcgKzI3Miw3IEBACiBTWVNDQUxMKHN5c19jbG9ja19nZXRyZXMsc3lzX2Nsb2NrX2dldHJlcyxzeXMzMl9jbG9ja19nZXRyZXNfd3JhcHBlcikKIFNZU0NBTEwoc3lzX2Nsb2NrX25hbm9zbGVlcCxzeXNfY2xvY2tfbmFub3NsZWVwLHN5czMyX2Nsb2NrX25hbm9zbGVlcF93cmFwcGVyKQogTklfU1lTQ0FMTAkJCQkJCQkvKiByZXNlcnZlZCBmb3IgdnNlcnZlciAqLwotU1lTQ0FMTChzMzkwX2ZhZHZpc2U2NF82NCxzeXNfbmlfc3lzY2FsbCxzeXMzMl9mYWR2aXNlNjRfNjRfd3JhcHBlcikKK1NZU0NBTEwoc3lzX3MzOTBfZmFkdmlzZTY0XzY0LHN5c19uaV9zeXNjYWxsLHN5czMyX2ZhZHZpc2U2NF82NF93cmFwcGVyKQogU1lTQ0FMTChzeXNfc3RhdGZzNjQsc3lzX3N0YXRmczY0LGNvbXBhdF9zeXNfc3RhdGZzNjRfd3JhcHBlcikKIFNZU0NBTEwoc3lzX2ZzdGF0ZnM2NCxzeXNfZnN0YXRmczY0LGNvbXBhdF9zeXNfZnN0YXRmczY0X3dyYXBwZXIpCiBTWVNDQUxMKHN5c19yZW1hcF9maWxlX3BhZ2VzLHN5c19yZW1hcF9maWxlX3BhZ2VzLHN5czMyX3JlbWFwX2ZpbGVfcGFnZXNfd3JhcHBlcikKQEAgLTMyMiw3ICszMjIsNyBAQAogU1lTQ0FMTChzeXNfZ2V0Y3B1LHN5c19nZXRjcHUsc3lzX2dldGNwdV93cmFwcGVyKQogU1lTQ0FMTChzeXNfZXBvbGxfcHdhaXQsc3lzX2Vwb2xsX3B3YWl0LGNvbXBhdF9zeXNfZXBvbGxfcHdhaXRfd3JhcHBlcikKIFNZU0NBTEwoc3lzX3V0aW1lcyxzeXNfdXRpbWVzLGNvbXBhdF9zeXNfdXRpbWVzX3dyYXBwZXIpCi1TWVNDQUxMKHMzOTBfZmFsbG9jYXRlLHN5c19mYWxsb2NhdGUsc3lzX2ZhbGxvY2F0ZV93cmFwcGVyKQorU1lTQ0FMTChzeXNfczM5MF9mYWxsb2NhdGUsc3lzX2ZhbGxvY2F0ZSxzeXNfZmFsbG9jYXRlX3dyYXBwZXIpCiBTWVNDQUxMKHN5c191dGltZW5zYXQsc3lzX3V0aW1lbnNhdCxjb21wYXRfc3lzX3V0aW1lbnNhdF93cmFwcGVyKQkvKiAzMTUgKi8KIFNZU0NBTEwoc3lzX3NpZ25hbGZkLHN5c19zaWduYWxmZCxjb21wYXRfc3lzX3NpZ25hbGZkX3dyYXBwZXIpCiBOSV9TWVNDQUxMCQkJCQkJLyogMzE3IG9sZCBzeXNfdGltZXJfZmQgKi8KZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvdmRzby5jIGIvYXJjaC9zMzkwL2tlcm5lbC92ZHNvLmMKaW5kZXggMjVhNmE4Mi4uNjkwZTE3OCAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC92ZHNvLmMKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC92ZHNvLmMKQEAgLTMyMiw3ICszMjIsOCBAQAogCXZkc282NF9wYWdlbGlzdFt2ZHNvNjRfcGFnZXMgLSAxXSA9IHZpcnRfdG9fcGFnZSh2ZHNvX2RhdGEpOwogCXZkc282NF9wYWdlbGlzdFt2ZHNvNjRfcGFnZXNdID0gTlVMTDsKICNpZm5kZWYgQ09ORklHX1NNUAotCUJVR19PTih2ZHNvX2FsbG9jX3Blcl9jcHUoMCwgUzM5MF9sb3djb3JlKSk7CisJaWYgKHZkc29fYWxsb2NfcGVyX2NwdSgwLCAmUzM5MF9sb3djb3JlKSkKKwkJQlVHKCk7CiAjZW5kaWYKIAl2ZHNvX2luaXRfY3I1KCk7CiAjZW5kaWYgLyogQ09ORklHXzY0QklUICovCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL3Zkc28zMi9nZXR0aW1lb2ZkYXkuUyBiL2FyY2gvczM5MC9rZXJuZWwvdmRzbzMyL2dldHRpbWVvZmRheS5TCmluZGV4IGMzMmYyOWMuLmFkOGFjZmMgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rZXJuZWwvdmRzbzMyL2dldHRpbWVvZmRheS5TCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvdmRzbzMyL2dldHRpbWVvZmRheS5TCkBAIC0xMywxMCArMTMsNiBAQAogI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgogI2luY2x1ZGUgPGFzbS91bmlzdGQuaD4KIAotI2luY2x1ZGUgPGFzbS92ZHNvLmg+Ci0jaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+Ci0jaW5jbHVkZSA8YXNtL3VuaXN0ZC5oPgotCiAJLnRleHQKIAkuYWxpZ24gNAogCS5nbG9ibCBfX2tlcm5lbF9nZXR0aW1lb2ZkYXkKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rdm0vZGlhZy5jIGIvYXJjaC9zMzkwL2t2bS9kaWFnLmMKaW5kZXggYTA3NzVlMS4uODMwMDMwOSAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2t2bS9kaWFnLmMKKysrIGIvYXJjaC9zMzkwL2t2bS9kaWFnLmMKQEAgLTQ3LDcgKzQ3LDcgQEAKIAl2Y3B1LT5ydW4tPnMzOTBfcmVzZXRfZmxhZ3MgfD0gS1ZNX1MzOTBfUkVTRVRfSVBMOwogCXZjcHUtPnJ1bi0+czM5MF9yZXNldF9mbGFncyB8PSBLVk1fUzM5MF9SRVNFVF9DUFVfSU5JVDsKIAl2Y3B1LT5ydW4tPmV4aXRfcmVhc29uID0gS1ZNX0VYSVRfUzM5MF9SRVNFVDsKLQlWQ1BVX0VWRU5UKHZjcHUsIDMsICJyZXF1ZXN0aW5nIHVzZXJzcGFjZSByZXNldHMgJWx4IiwKKwlWQ1BVX0VWRU5UKHZjcHUsIDMsICJyZXF1ZXN0aW5nIHVzZXJzcGFjZSByZXNldHMgJWxseCIsCiAJICB2Y3B1LT5ydW4tPnMzOTBfcmVzZXRfZmxhZ3MpOwogCXJldHVybiAtRVJFTU9URTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rdm0vaW50ZXJydXB0LmMgYi9hcmNoL3MzOTAva3ZtL2ludGVycnVwdC5jCmluZGV4IDI5NjA3MDIuLmY0ZmUyOGEgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rdm0vaW50ZXJydXB0LmMKKysrIGIvYXJjaC9zMzkwL2t2bS9pbnRlcnJ1cHQuYwpAQCAtMTYwLDcgKzE2MCw3IEBACiAJCWJyZWFrOwogCiAJY2FzZSBLVk1fUzM5MF9JTlRfVklSVElPOgotCQlWQ1BVX0VWRU5UKHZjcHUsIDQsICJpbnRlcnJ1cHQ6IHZpcnRpbyBwYXJtOiV4LHBhcm02NDolbHgiLAorCQlWQ1BVX0VWRU5UKHZjcHUsIDQsICJpbnRlcnJ1cHQ6IHZpcnRpbyBwYXJtOiV4LHBhcm02NDolbGx4IiwKIAkJCSAgIGludGktPmV4dC5leHRfcGFyYW1zLCBpbnRpLT5leHQuZXh0X3BhcmFtczIpOwogCQl2Y3B1LT5zdGF0LmRlbGl2ZXJfdmlydGlvX2ludGVycnVwdCsrOwogCQlyYyA9IHB1dF9ndWVzdF91MTYodmNwdSwgX19MQ19FWFRfSU5UX0NPREUsIDB4MjYwMyk7CkBAIC0zNjAsNyArMzYwLDcgQEAKIAl2Y3B1LT5hcmNoLmNrY190aW1lci5leHBpcmVzID0gamlmZmllcyArIHNsdGltZTsKIAogCWFkZF90aW1lcigmdmNwdS0+YXJjaC5ja2NfdGltZXIpOwotCVZDUFVfRVZFTlQodmNwdSwgNSwgImVuYWJsZWQgd2FpdCB0aW1lcjolbHggamlmZmllcyIsIHNsdGltZSk7CisJVkNQVV9FVkVOVCh2Y3B1LCA1LCAiZW5hYmxlZCB3YWl0IHRpbWVyOiVsbHggamlmZmllcyIsIHNsdGltZSk7CiBub190aW1lcjoKIAlzcGluX2xvY2tfYmgoJnZjcHUtPmFyY2gubG9jYWxfaW50LmZsb2F0X2ludC0+bG9jayk7CiAJc3Bpbl9sb2NrX2JoKCZ2Y3B1LT5hcmNoLmxvY2FsX2ludC5sb2NrKTsKQEAgLTQ5MSw3ICs0OTEsNyBAQAogCiAJc3dpdGNoIChzMzkwaW50LT50eXBlKSB7CiAJY2FzZSBLVk1fUzM5MF9JTlRfVklSVElPOgotCQlWTV9FVkVOVChrdm0sIDUsICJpbmplY3Q6IHZpcnRpbyBwYXJtOiV4LHBhcm02NDolbHgiLAorCQlWTV9FVkVOVChrdm0sIDUsICJpbmplY3Q6IHZpcnRpbyBwYXJtOiV4LHBhcm02NDolbGx4IiwKIAkJCSBzMzkwaW50LT5wYXJtLCBzMzkwaW50LT5wYXJtNjQpOwogCQlpbnRpLT50eXBlID0gczM5MGludC0+dHlwZTsKIAkJaW50aS0+ZXh0LmV4dF9wYXJhbXMgPSBzMzkwaW50LT5wYXJtOwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2t2bS9wcml2LmMgYi9hcmNoL3MzOTAva3ZtL3ByaXYuYwppbmRleCBjY2U0MGZmLi4zNjA1ZGY0NSAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2t2bS9wcml2LmMKKysrIGIvYXJjaC9zMzkwL2t2bS9wcml2LmMKQEAgLTExOCw3ICsxMTgsNyBAQAogCQlnb3RvIG91dDsKIAl9CiAKLQlWQ1BVX0VWRU5UKHZjcHUsIDUsICJzdG9yaW5nIGNwdSBhZGRyZXNzIHRvICVseCIsIHVzZXJhZGRyKTsKKwlWQ1BVX0VWRU5UKHZjcHUsIDUsICJzdG9yaW5nIGNwdSBhZGRyZXNzIHRvICVsbHgiLCB1c2VyYWRkcik7CiBvdXQ6CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3NoL2RyaXZlcnMvcGNpL29wcy1jYXltYW4uYyBiL2FyY2gvc2gvZHJpdmVycy9wY2kvb3BzLWNheW1hbi5jCmluZGV4IDVjY2Y5ZWEuLjM4ZWY3NjIgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvZHJpdmVycy9wY2kvb3BzLWNheW1hbi5jCisrKyBiL2FyY2gvc2gvZHJpdmVycy9wY2kvb3BzLWNheW1hbi5jCkBAIC01LDExICs1LDYgQEAKICNpbmNsdWRlIDxjcHUvaXJxLmg+CiAjaW5jbHVkZSAicGNpLXNoNS5oIgogCi1zdGF0aWMgaW5saW5lIHU4IGJyaWRnZV9zd2l6emxlKHU4IHBpbiwgdTggc2xvdCkKLXsKLQlyZXR1cm4gKCgocGluIC0gMSkgKyBzbG90KSAlIDQpICsgMTsKLX0KLQogaW50IF9faW5pdCBwY2liaW9zX21hcF9wbGF0Zm9ybV9pcnEoc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQogewogCWludCByZXN1bHQgPSAtMTsKQEAgLTQyLDcgKzM3LDcgQEAKIAl3aGlsZSAoZGV2LT5idXMtPm51bWJlciA+IDApIHsKIAogCQlzbG90ID0gcGF0aFtpXS5zbG90ID0gUENJX1NMT1QoZGV2LT5kZXZmbik7Ci0JCXBpbiA9IHBhdGhbaV0ucGluID0gYnJpZGdlX3N3aXp6bGUocGluLCBzbG90KTsKKwkJcGluID0gcGF0aFtpXS5waW4gPSBwY2lfc3dpenpsZV9pbnRlcnJ1cHRfcGluKGRldiwgcGluKTsKIAkJZGV2ID0gZGV2LT5idXMtPnNlbGY7CiAJCWkrKzsKIAkJaWYgKGkgPiAzKSBwYW5pYygiUENJIHBhdGggdG8gcm9vdCBidXMgdG9vIGxvbmchXG4iKTsKQEAgLTU2LDcgKzUxLDcgQEAKIAlpZiAoKHNsb3QgPCAzKSB8fCAoaSA9PSAwKSkgewogCQkvKiBCdXMgMCAoaW5jbC4gUENJLVBDSSBicmlkZ2UgaXRzZWxmKSA6IHBlcmZvcm0gdGhlIGZpbmFsCiAJCSAgIHN3aXp6bGUgbm93LiAqLwotCQlyZXN1bHQgPSBJUlFfSU5UQSArIGJyaWRnZV9zd2l6emxlKHBpbiwgc2xvdCkgLSAxOworCQlyZXN1bHQgPSBJUlFfSU5UQSArIHBjaV9zd2l6emxlX2ludGVycnVwdF9waW4oZGV2LCBwaW4pIC0gMTsKIAl9IGVsc2UgewogCQlpLS07CiAJCXNsb3QgPSBwYXRoW2ldLnNsb3Q7CmRpZmYgLS1naXQgYS9hcmNoL3NoL2RyaXZlcnMvcGNpL3BjaS5jIGIvYXJjaC9zaC9kcml2ZXJzL3BjaS9wY2kuYwppbmRleCBkMzgzOWU2Li5lMzZjN2I4IDEwMDY0NAotLS0gYS9hcmNoL3NoL2RyaXZlcnMvcGNpL3BjaS5jCisrKyBiL2FyY2gvc2gvZHJpdmVycy9wY2kvcGNpLmMKQEAgLTIxLDI2ICsyMSw2IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogCi1zdGF0aWMgaW5saW5lIHU4IGJyaWRnZV9zd2l6emxlKHU4IHBpbiwgdTggc2xvdCkKLXsKLQlyZXR1cm4gKCgocGluIC0gMSkgKyBzbG90KSAlIDQpICsgMTsKLX0KLQotc3RhdGljIHU4IF9faW5pdCBzaW1wbGVfc3dpenpsZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCAqcGlucCkKLXsKLQl1OCBwaW4gPSAqcGlucDsKLQotCXdoaWxlIChkZXYtPmJ1cy0+cGFyZW50KSB7Ci0JCXBpbiA9IGJyaWRnZV9zd2l6emxlKHBpbiwgUENJX1NMT1QoZGV2LT5kZXZmbikpOwotCQkvKiBNb3ZlIHVwIHRoZSBjaGFpbiBvZiBicmlkZ2VzLiAqLwotCQlkZXYgPSBkZXYtPmJ1cy0+c2VsZjsKLQl9Ci0JKnBpbnAgPSBwaW47Ci0KLQkvKiBUaGUgc2xvdCBpcyB0aGUgc2xvdCBvZiB0aGUgbGFzdCBicmlkZ2UuICovCi0JcmV0dXJuIFBDSV9TTE9UKGRldi0+ZGV2Zm4pOwotfQotCiBzdGF0aWMgaW50IF9faW5pdCBwY2liaW9zX2luaXQodm9pZCkKIHsKIAlzdHJ1Y3QgcGNpX2NoYW5uZWwgKnA7CkBAIC02MSw3ICs0MSw3IEBACiAJCWJ1c25vID0gYnVzLT5zdWJvcmRpbmF0ZSArIDE7CiAJfQogCi0JcGNpX2ZpeHVwX2lycXMoc2ltcGxlX3N3aXp6bGUsIHBjaWJpb3NfbWFwX3BsYXRmb3JtX2lycSk7CisJcGNpX2ZpeHVwX2lycXMocGNpX2NvbW1vbl9zd2l6emxlLCBwY2liaW9zX21hcF9wbGF0Zm9ybV9pcnEpOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3NoL2luY2x1ZGUvYXNtL0tidWlsZCBiL2FyY2gvc2gvaW5jbHVkZS9hc20vS2J1aWxkCmluZGV4IGYxYTJhMGQuLjQzOTEwY2QgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvaW5jbHVkZS9hc20vS2J1aWxkCisrKyBiL2FyY2gvc2gvaW5jbHVkZS9hc20vS2J1aWxkCkBAIC02LDQgKzYsMyBAQAogdW5pZmRlZi15ICs9IHVuaXN0ZF82NC5oCiB1bmlmZGVmLXkgKz0gcG9zaXhfdHlwZXNfMzIuaAogdW5pZmRlZi15ICs9IHBvc2l4X3R5cGVzXzY0LmgKLXVuaWZkZWYteSArPSBzd2FiLmgKZGlmZiAtLWdpdCBhL2FyY2gvc2gvaW5jbHVkZS9hc20vYnl0ZW9yZGVyLmggYi9hcmNoL3NoL2luY2x1ZGUvYXNtL2J5dGVvcmRlci5oCmluZGV4IGU5NWM0MWEuLmRiMmY1ZDcgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvaW5jbHVkZS9hc20vYnl0ZW9yZGVyLmgKKysrIGIvYXJjaC9zaC9pbmNsdWRlL2FzbS9ieXRlb3JkZXIuaApAQCAtMSw4ICsxLDYgQEAKICNpZm5kZWYgX19BU01fU0hfQllURU9SREVSX0gKICNkZWZpbmUgX19BU01fU0hfQllURU9SREVSX0gKIAotI2luY2x1ZGUgPGFzbS9zd2FiLmg+Ci0KICNpZmRlZiBfX0xJVFRMRV9FTkRJQU5fXwogI2luY2x1ZGUgPGxpbnV4L2J5dGVvcmRlci9saXR0bGVfZW5kaWFuLmg+CiAjZWxzZQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9pbmNsdWRlL2FzbS9tbXUuaCBiL2FyY2gvc2gvaW5jbHVkZS9hc20vbW11LmgKaW5kZXggZmRjYjkzYi4uNmM0MzYyNSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9pbmNsdWRlL2FzbS9tbXUuaAorKysgYi9hcmNoL3NoL2luY2x1ZGUvYXNtL21tdS5oCkBAIC05LDcgKzksNiBAQAogCW1tX2NvbnRleHRfaWRfdAkJaWQ7CiAJdm9pZAkJCSp2ZHNvOwogI2Vsc2UKLQlzdHJ1Y3Qgdm1fbGlzdF9zdHJ1Y3QJKnZtbGlzdDsKIAl1bnNpZ25lZCBsb25nCQllbmRfYnJrOwogI2VuZGlmCiAjaWZkZWYgQ09ORklHX0JJTkZNVF9FTEZfRkRQSUMKZGlmZiAtLWdpdCBhL2FyY2gvc2gvaW5jbHVkZS9hc20vc3lzY2FsbHNfMzIuaCBiL2FyY2gvc2gvaW5jbHVkZS9hc20vc3lzY2FsbHNfMzIuaAppbmRleCAxMDRjNWU2Li44YjMwMjAwIDEwMDY0NAotLS0gYS9hcmNoL3NoL2luY2x1ZGUvYXNtL3N5c2NhbGxzXzMyLmgKKysrIGIvYXJjaC9zaC9pbmNsdWRlL2FzbS9zeXNjYWxsc18zMi5oCkBAIC0zNiw5ICszNiw5IEBACiBhc21saW5rYWdlIGludCBzeXNfcnRfc2lncmV0dXJuKHVuc2lnbmVkIGxvbmcgcjQsIHVuc2lnbmVkIGxvbmcgcjUsCiAJCQkJdW5zaWduZWQgbG9uZyByNiwgdW5zaWduZWQgbG9uZyByNywKIAkJCQlzdHJ1Y3QgcHRfcmVncyBfX3JlZ3MpOwotYXNtbGlua2FnZSBpbnQgc3lzX3BpcGUodW5zaWduZWQgbG9uZyByNCwgdW5zaWduZWQgbG9uZyByNSwKLQkJCXVuc2lnbmVkIGxvbmcgcjYsIHVuc2lnbmVkIGxvbmcgcjcsCi0JCQlzdHJ1Y3QgcHRfcmVncyBfX3JlZ3MpOworYXNtbGlua2FnZSBpbnQgc3lzX3NoX3BpcGUodW5zaWduZWQgbG9uZyByNCwgdW5zaWduZWQgbG9uZyByNSwKKwkJCSAgIHVuc2lnbmVkIGxvbmcgcjYsIHVuc2lnbmVkIGxvbmcgcjcsCisJCQkgICBzdHJ1Y3QgcHRfcmVncyBfX3JlZ3MpOwogYXNtbGlua2FnZSBzc2l6ZV90IHN5c19wcmVhZF93cmFwcGVyKHVuc2lnbmVkIGludCBmZCwgY2hhciBfX3VzZXIgKmJ1ZiwKIAkJCQkgICAgIHNpemVfdCBjb3VudCwgbG9uZyBkdW1teSwgbG9mZl90IHBvcyk7CiBhc21saW5rYWdlIHNzaXplX3Qgc3lzX3B3cml0ZV93cmFwcGVyKHVuc2lnbmVkIGludCBmZCwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL3N5c19zaDMyLmMgYi9hcmNoL3NoL2tlcm5lbC9zeXNfc2gzMi5jCmluZGV4IGRiYmExZTEuLjYzYmExMjggMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL3N5c19zaDMyLmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvc3lzX3NoMzIuYwpAQCAtMjIsNyArMjIsNyBAQAogICogc3lzX3BpcGUoKSBpcyB0aGUgbm9ybWFsIEMgY2FsbGluZyBzdGFuZGFyZCBmb3IgY3JlYXRpbmcKICAqIGEgcGlwZS4gSXQncyBub3QgdGhlIHdheSBVbml4IHRyYWRpdGlvbmFsbHkgZG9lcyB0aGlzLCB0aG91Z2guCiAgKi8KLWFzbWxpbmthZ2UgaW50IHN5c19waXBlKHVuc2lnbmVkIGxvbmcgcjQsIHVuc2lnbmVkIGxvbmcgcjUsCithc21saW5rYWdlIGludCBzeXNfc2hfcGlwZSh1bnNpZ25lZCBsb25nIHI0LCB1bnNpZ25lZCBsb25nIHI1LAogCXVuc2lnbmVkIGxvbmcgcjYsIHVuc2lnbmVkIGxvbmcgcjcsCiAJc3RydWN0IHB0X3JlZ3MgX19yZWdzKQogewpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvc3lzY2FsbHNfMzIuUyBiL2FyY2gvc2gva2VybmVsL3N5c2NhbGxzXzMyLlMKaW5kZXggMGFmNjkzZS4uZTY3YzE3MyAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvc3lzY2FsbHNfMzIuUworKysgYi9hcmNoL3NoL2tlcm5lbC9zeXNjYWxsc18zMi5TCkBAIC01OCw3ICs1OCw3IEBACiAJLmxvbmcgc3lzX21rZGlyCiAJLmxvbmcgc3lzX3JtZGlyCQkvKiA0MCAqLwogCS5sb25nIHN5c19kdXAKLQkubG9uZyBzeXNfcGlwZQorCS5sb25nIHN5c19zaF9waXBlCiAJLmxvbmcgc3lzX3RpbWVzCiAJLmxvbmcgc3lzX25pX3N5c2NhbGwJLyogb2xkIHByb2Ygc3lzY2FsbCBob2xkZXIgKi8KIAkubG9uZyBzeXNfYnJrCQkvKiA0NSAqLwpAQCAtMTA1LDcgKzEwNSw3IEBACiAJLmxvbmcgc3lzX3VzZWxpYgogCS5sb25nIHN5c19zd2Fwb24KIAkubG9uZyBzeXNfcmVib290Ci0JLmxvbmcgb2xkX3JlYWRkaXIKKwkubG9uZyBzeXNfb2xkX3JlYWRkaXIKIAkubG9uZyBvbGRfbW1hcAkJLyogOTAgKi8KIAkubG9uZyBzeXNfbXVubWFwCiAJLmxvbmcgc3lzX3RydW5jYXRlCmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9zeXNjYWxsc182NC5TIGIvYXJjaC9zaC9rZXJuZWwvc3lzY2FsbHNfNjQuUwppbmRleCAwYjQzNmFhLi41NTdjYjkxIDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9zeXNjYWxsc182NC5TCisrKyBiL2FyY2gvc2gva2VybmVsL3N5c2NhbGxzXzY0LlMKQEAgLTEwOSw3ICsxMDksNyBAQAogCS5sb25nIHN5c191c2VsaWIKIAkubG9uZyBzeXNfc3dhcG9uCiAJLmxvbmcgc3lzX3JlYm9vdAotCS5sb25nIG9sZF9yZWFkZGlyCisJLmxvbmcgc3lzX29sZF9yZWFkZGlyCiAJLmxvbmcgb2xkX21tYXAJCQkvKiA5MCAqLwogCS5sb25nIHN5c19tdW5tYXAKIAkubG9uZyBzeXNfdHJ1bmNhdGUKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvY29uZmlncy9zcGFyYzMyX2RlZmNvbmZpZyBiL2FyY2gvc3BhcmMvY29uZmlncy9zcGFyYzMyX2RlZmNvbmZpZwppbmRleCAyZTNhMTQ5Li4wOWFiNDZlIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2NvbmZpZ3Mvc3BhcmMzMl9kZWZjb25maWcKKysrIGIvYXJjaC9zcGFyYy9jb25maWdzL3NwYXJjMzJfZGVmY29uZmlnCkBAIC0xLDE1ICsxLDIxIEBACiAjCiAjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0Ci0jIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMjUKLSMgVHVlIEFwciAyOSAwMToyODo1OCAyMDA4CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMjgKKyMgVGh1IEphbiAgOCAxNjo0NTo0NCAyMDA5CiAjCisjIENPTkZJR182NEJJVCBpcyBub3Qgc2V0CitDT05GSUdfU1BBUkM9eQorQ09ORklHX1NQQVJDMzI9eQorIyBDT05GSUdfU1BBUkM2NCBpcyBub3Qgc2V0CitDT05GSUdfQVJDSF9ERUZDT05GSUc9ImFyY2gvc3BhcmMvY29uZmlncy9zcGFyYzMyX2RlZmNvbmZpZyIKK0NPTkZJR19CSVRTPTMyCitDT05GSUdfQVVESVRfQVJDSD15CiBDT05GSUdfTU1VPXkKIENPTkZJR19ISUdITUVNPXkKIENPTkZJR19aT05FX0RNQT15CiBDT05GSUdfR0VORVJJQ19JU0FfRE1BPXkKIENPTkZJR19BUkNIX05PX1ZJUlRfVE9fQlVTPXkKIENPTkZJR19PRj15Ci1DT05GSUdfSFo9MTAwCiBDT05GSUdfREVGQ09ORklHX0xJU1Q9Ii9saWIvbW9kdWxlcy8kVU5BTUVfUkVMRUFTRS8uY29uZmlnIgogCiAjCkBAIC02NiwzMSArNzIsMzAgQEAKIENPTkZJR19USU1FUkZEPXkKIENPTkZJR19FVkVOVEZEPXkKIENPTkZJR19TSE1FTT15CitDT05GSUdfQUlPPXkKIENPTkZJR19WTV9FVkVOVF9DT1VOVEVSUz15CitDT05GSUdfUENJX1FVSVJLUz15CiBDT05GSUdfU0xBQj15CiAjIENPTkZJR19TTFVCIGlzIG5vdCBzZXQKICMgQ09ORklHX1NMT0IgaXMgbm90IHNldAogIyBDT05GSUdfUFJPRklMSU5HIGlzIG5vdCBzZXQKLSMgQ09ORklHX01BUktFUlMgaXMgbm90IHNldAogQ09ORklHX0hBVkVfT1BST0ZJTEU9eQotIyBDT05GSUdfSEFWRV9LUFJPQkVTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hBVkVfS1JFVFBST0JFUyBpcyBub3Qgc2V0Ci1DT05GSUdfUFJPQ19QQUdFX01PTklUT1I9eQorQ09ORklHX0hBVkVfQVJDSF9UUkFDRUhPT0s9eQorIyBDT05GSUdfSEFWRV9HRU5FUklDX0RNQV9DT0hFUkVOVCBpcyBub3Qgc2V0CiBDT05GSUdfU0xBQklORk89eQogQ09ORklHX1JUX01VVEVYRVM9eQotIyBDT05GSUdfVElOWV9TSE1FTSBpcyBub3Qgc2V0CiBDT05GSUdfQkFTRV9TTUFMTD0wCiBDT05GSUdfTU9EVUxFUz15CisjIENPTkZJR19NT0RVTEVfRk9SQ0VfTE9BRCBpcyBub3Qgc2V0CiBDT05GSUdfTU9EVUxFX1VOTE9BRD15CiAjIENPTkZJR19NT0RVTEVfRk9SQ0VfVU5MT0FEIGlzIG5vdCBzZXQKICMgQ09ORklHX01PRFZFUlNJT05TIGlzIG5vdCBzZXQKICMgQ09ORklHX01PRFVMRV9TUkNWRVJTSU9OX0FMTCBpcyBub3Qgc2V0Ci1DT05GSUdfS01PRD15CiBDT05GSUdfQkxPQ0s9eQogIyBDT05GSUdfTEJEIGlzIG5vdCBzZXQKICMgQ09ORklHX0JMS19ERVZfSU9fVFJBQ0UgaXMgbm90IHNldAotIyBDT05GSUdfTFNGIGlzIG5vdCBzZXQKICMgQ09ORklHX0JMS19ERVZfQlNHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSU5URUdSSVRZIGlzIG5vdCBzZXQKIAogIwogIyBJTyBTY2hlZHVsZXJzCkBAIC0xMDUsNTkgKzExMCw3MyBAQAogIyBDT05GSUdfREVGQVVMVF9OT09QIGlzIG5vdCBzZXQKIENPTkZJR19ERUZBVUxUX0lPU0NIRUQ9ImNmcSIKIENPTkZJR19DTEFTU0lDX1JDVT15CisjIENPTkZJR19UUkVFX1JDVSBpcyBub3Qgc2V0CisjIENPTkZJR19QUkVFTVBUX1JDVSBpcyBub3Qgc2V0CisjIENPTkZJR19UUkVFX1JDVV9UUkFDRSBpcyBub3Qgc2V0CisjIENPTkZJR19QUkVFTVBUX1JDVV9UUkFDRSBpcyBub3Qgc2V0CisjIENPTkZJR19GUkVFWkVSIGlzIG5vdCBzZXQKIAogIwotIyBHZW5lcmFsIG1hY2hpbmUgc2V0dXAKKyMgUHJvY2Vzc29yIHR5cGUgYW5kIGZlYXR1cmVzCiAjCiAjIENPTkZJR19TTVAgaXMgbm90IHNldAotQ09ORklHX1NQQVJDPXkKLUNPTkZJR19TUEFSQzMyPXkKLUNPTkZJR19TQlVTPXkKLUNPTkZJR19TQlVTQ0hBUj15Ci1DT05GSUdfU0VSSUFMX0NPTlNPTEU9eQotQ09ORklHX1NVTl9BVVhJTz15Ci1DT05GSUdfU1VOX0lPPXkKKyMgQ09ORklHX0haXzEwMCBpcyBub3Qgc2V0CitDT05GSUdfSFpfMjUwPXkKKyMgQ09ORklHX0haXzMwMCBpcyBub3Qgc2V0CisjIENPTkZJR19IWl8xMDAwIGlzIG5vdCBzZXQKK0NPTkZJR19IWj0yNTAKKyMgQ09ORklHX1NDSEVEX0hSVElDSyBpcyBub3Qgc2V0CiBDT05GSUdfUldTRU1fR0VORVJJQ19TUElOTE9DSz15CiBDT05GSUdfR0VORVJJQ19GSU5EX05FWFRfQklUPXkKIENPTkZJR19HRU5FUklDX0hXRUlHSFQ9eQogQ09ORklHX0dFTkVSSUNfQ0FMSUJSQVRFX0RFTEFZPXkKIENPTkZJR19BUkNIX01BWV9IQVZFX1BDX0ZEQz15Ci0jIENPTkZJR19BUkNIX0hBU19JTE9HMl9VMzIgaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9IQVNfSUxPRzJfVTY0IGlzIG5vdCBzZXQKIENPTkZJR19FTVVMQVRFRF9DTVBYQ0hHPXkKLUNPTkZJR19TVU5fUE09eQotIyBDT05GSUdfU1VONCBpcyBub3Qgc2V0Ci1DT05GSUdfUENJPXkKLUNPTkZJR19QQ0lfU1lTQ0FMTD15Ci0jIENPTkZJR19BUkNIX1NVUFBPUlRTX01TSSBpcyBub3Qgc2V0Ci1DT05GSUdfUENJX0xFR0FDWT15Ci0jIENPTkZJR19QQ0lfREVCVUcgaXMgbm90IHNldAotIyBDT05GSUdfTk9fRE1BIGlzIG5vdCBzZXQKLUNPTkZJR19TVU5fT1BFTlBST01GUz1tCi0jIENPTkZJR19TUEFSQ19MRUQgaXMgbm90IHNldAotQ09ORklHX0JJTkZNVF9FTEY9eQotQ09ORklHX0JJTkZNVF9NSVNDPW0KIENPTkZJR19TRUxFQ1RfTUVNT1JZX01PREVMPXkKIENPTkZJR19GTEFUTUVNX01BTlVBTD15CiAjIENPTkZJR19ESVNDT05USUdNRU1fTUFOVUFMIGlzIG5vdCBzZXQKICMgQ09ORklHX1NQQVJTRU1FTV9NQU5VQUwgaXMgbm90IHNldAogQ09ORklHX0ZMQVRNRU09eQogQ09ORklHX0ZMQVRfTk9ERV9NRU1fTUFQPXkKLSMgQ09ORklHX1NQQVJTRU1FTV9TVEFUSUMgaXMgbm90IHNldAotIyBDT05GSUdfU1BBUlNFTUVNX1ZNRU1NQVBfRU5BQkxFIGlzIG5vdCBzZXQKK0NPTkZJR19QQUdFRkxBR1NfRVhURU5ERUQ9eQogQ09ORklHX1NQTElUX1BUTE9DS19DUFVTPTQKLSMgQ09ORklHX1JFU09VUkNFU182NEJJVCBpcyBub3Qgc2V0CisjIENPTkZJR19QSFlTX0FERFJfVF82NEJJVCBpcyBub3Qgc2V0CiBDT05GSUdfWk9ORV9ETUFfRkxBRz0xCiBDT05GSUdfQk9VTkNFPXkKK0NPTkZJR19VTkVWSUNUQUJMRV9MUlU9eQorQ09ORklHX1NVTl9QTT15CisjIENPTkZJR19TUEFSQ19MRUQgaXMgbm90IHNldAorQ09ORklHX1NFUklBTF9DT05TT0xFPXkKIAogIwotIyBOZXR3b3JraW5nCisjIEJ1cyBvcHRpb25zIChQQ0kgZXRjLikKICMKK0NPTkZJR19TQlVTPXkKK0NPTkZJR19TQlVTQ0hBUj15CitDT05GSUdfUENJPXkKK0NPTkZJR19QQ0lfU1lTQ0FMTD15CisjIENPTkZJR19BUkNIX1NVUFBPUlRTX01TSSBpcyBub3Qgc2V0CitDT05GSUdfUENJX0xFR0FDWT15CisjIENPTkZJR19QQ0lfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfUENJX1NUVUIgaXMgbm90IHNldAorIyBDT05GSUdfUENDQVJEIGlzIG5vdCBzZXQKK0NPTkZJR19TVU5fT1BFTlBST01GUz1tCitDT05GSUdfU1BBUkMzMl9QQ0k9eQorCisjCisjIEV4ZWN1dGFibGUgZmlsZSBmb3JtYXRzCisjCitDT05GSUdfQklORk1UX0VMRj15CisjIENPTkZJR19DT1JFX0RVTVBfREVGQVVMVF9FTEZfSEVBREVSUyBpcyBub3Qgc2V0CisjIENPTkZJR19IQVZFX0FPVVQgaXMgbm90IHNldAorQ09ORklHX0JJTkZNVF9NSVNDPW0KIENPTkZJR19ORVQ9eQogCiAjCiAjIE5ldHdvcmtpbmcgb3B0aW9ucwogIworIyBDT05GSUdfTkVUX05TIGlzIG5vdCBzZXQKK0NPTkZJR19DT01QQVRfTkVUX0RFVl9PUFM9eQogQ09ORklHX1BBQ0tFVD15CiAjIENPTkZJR19QQUNLRVRfTU1BUCBpcyBub3Qgc2V0CiBDT05GSUdfVU5JWD15CkBAIC0xNjYsNiArMTg1LDcgQEAKICMgQ09ORklHX1hGUk1fU1VCX1BPTElDWSBpcyBub3Qgc2V0CiAjIENPTkZJR19YRlJNX01JR1JBVEUgaXMgbm90IHNldAogIyBDT05GSUdfWEZSTV9TVEFUSVNUSUNTIGlzIG5vdCBzZXQKK0NPTkZJR19YRlJNX0lQQ09NUD15CiBDT05GSUdfTkVUX0tFWT1tCiAjIENPTkZJR19ORVRfS0VZX01JR1JBVEUgaXMgbm90IHNldAogQ09ORklHX0lORVQ9eQpAQCAtMjIxLDYgKzI0MSw3IEBACiAjIENPTkZJR19USVBDIGlzIG5vdCBzZXQKICMgQ09ORklHX0FUTSBpcyBub3Qgc2V0CiAjIENPTkZJR19CUklER0UgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0RTQSBpcyBub3Qgc2V0CiAjIENPTkZJR19WTEFOXzgwMjFRIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQ05FVCBpcyBub3Qgc2V0CiAjIENPTkZJR19MTEMyIGlzIG5vdCBzZXQKQEAgLTIzMSw2ICsyNTIsNyBAQAogIyBDT05GSUdfRUNPTkVUIGlzIG5vdCBzZXQKICMgQ09ORklHX1dBTl9ST1VURVIgaXMgbm90IHNldAogIyBDT05GSUdfTkVUX1NDSEVEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RDQiBpcyBub3Qgc2V0CiAKICMKICMgTmV0d29yayB0ZXN0aW5nCkBAIC0yNDEsMTQgKzI2MywxNCBAQAogIyBDT05GSUdfSVJEQSBpcyBub3Qgc2V0CiAjIENPTkZJR19CVCBpcyBub3Qgc2V0CiAjIENPTkZJR19BRl9SWFJQQyBpcyBub3Qgc2V0Ci0KLSMKLSMgV2lyZWxlc3MKLSMKKyMgQ09ORklHX1BIT05FVCBpcyBub3Qgc2V0CitDT05GSUdfV0lSRUxFU1M9eQogIyBDT05GSUdfQ0ZHODAyMTEgaXMgbm90IHNldAorQ09ORklHX1dJUkVMRVNTX09MRF9SRUdVTEFUT1JZPXkKICMgQ09ORklHX1dJUkVMRVNTX0VYVCBpcyBub3Qgc2V0CisjIENPTkZJR19MSUI4MDIxMSBpcyBub3Qgc2V0CiAjIENPTkZJR19NQUM4MDIxMSBpcyBub3Qgc2V0Ci0jIENPTkZJR19JRUVFODAyMTEgaXMgbm90IHNldAorIyBDT05GSUdfV0lNQVggaXMgbm90IHNldAogIyBDT05GSUdfUkZLSUxMIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVF85UCBpcyBub3Qgc2V0CiAKQEAgLTI2Miw3ICsyODQsOSBAQAogQ09ORklHX1VFVkVOVF9IRUxQRVJfUEFUSD0iL3NiaW4vaG90cGx1ZyIKIENPTkZJR19TVEFOREFMT05FPXkKIENPTkZJR19QUkVWRU5UX0ZJUk1XQVJFX0JVSUxEPXkKLSMgQ09ORklHX0ZXX0xPQURFUiBpcyBub3Qgc2V0CitDT05GSUdfRldfTE9BREVSPXkKK0NPTkZJR19GSVJNV0FSRV9JTl9LRVJORUw9eQorQ09ORklHX0VYVFJBX0ZJUk1XQVJFPSIiCiAjIENPTkZJR19ERUJVR19EUklWRVIgaXMgbm90IHNldAogIyBDT05GSUdfREVCVUdfREVWUkVTIGlzIG5vdCBzZXQKICMgQ09ORklHX1NZU19IWVBFUlZJU09SIGlzIG5vdCBzZXQKQEAgLTI4NiwxMiArMzEwLDE1IEBACiAjIENPTkZJR19CTEtfREVWX1hJUCBpcyBub3Qgc2V0CiAjIENPTkZJR19DRFJPTV9QS1RDRFZEIGlzIG5vdCBzZXQKICMgQ09ORklHX0FUQV9PVkVSX0VUSCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0hEIGlzIG5vdCBzZXQKIENPTkZJR19NSVNDX0RFVklDRVM9eQogIyBDT05GSUdfUEhBTlRPTSBpcyBub3Qgc2V0CiAjIENPTkZJR19FRVBST01fOTNDWDYgaXMgbm90IHNldAogIyBDT05GSUdfU0dJX0lPQzQgaXMgbm90IHNldAogIyBDT05GSUdfVElGTV9DT1JFIGlzIG5vdCBzZXQKICMgQ09ORklHX0VOQ0xPU1VSRV9TRVJWSUNFUyBpcyBub3Qgc2V0CisjIENPTkZJR19IUF9JTE8gaXMgbm90IHNldAorIyBDT05GSUdfQzJQT1JUIGlzIG5vdCBzZXQKIENPTkZJR19IQVZFX0lERT15CiAjIENPTkZJR19JREUgaXMgbm90IHNldAogCkBAIC0zMzUsNiArMzYyLDcgQEAKICMgQ09ORklHX1NDU0lfU1JQX0FUVFJTIGlzIG5vdCBzZXQKIENPTkZJR19TQ1NJX0xPV0xFVkVMPXkKICMgQ09ORklHX0lTQ1NJX1RDUCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0NYR0IzX0lTQ1NJIGlzIG5vdCBzZXQKICMgQ09ORklHX0JMS19ERVZfM1dfWFhYWF9SQUlEIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfM1dfOVhYWCBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX0FDQVJEIGlzIG5vdCBzZXQKQEAgLTM0OCw2ICszNzYsOCBAQAogIyBDT05GSUdfTUVHQVJBSURfTEVHQUNZIGlzIG5vdCBzZXQKICMgQ09ORklHX01FR0FSQUlEX1NBUyBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX0hQVElPUCBpcyBub3Qgc2V0CisjIENPTkZJR19MSUJGQyBpcyBub3Qgc2V0CisjIENPTkZJR19GQ09FIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfRE1YMzE5MUQgaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9GVVRVUkVfRE9NQUlOIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfSVBTIGlzIG5vdCBzZXQKQEAgLTM2Nyw2ICszOTcsNyBAQAogIyBDT05GSUdfU0NTSV9ERUJVRyBpcyBub3Qgc2V0CiBDT05GSUdfU0NTSV9TVU5FU1A9eQogIyBDT05GSUdfU0NTSV9TUlAgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9ESCBpcyBub3Qgc2V0CiAjIENPTkZJR19BVEEgaXMgbm90IHNldAogIyBDT05GSUdfTUQgaXMgbm90IHNldAogIyBDT05GSUdfRlVTSU9OIGlzIG5vdCBzZXQKQEAgLTM3NCwxMSArNDA1LDE0IEBACiAjCiAjIElFRUUgMTM5NCAoRmlyZVdpcmUpIHN1cHBvcnQKICMKKworIworIyBFbmFibGUgb25seSBvbmUgb2YgdGhlIHR3byBzdGFja3MsIHVubGVzcyB5b3Uga25vdyB3aGF0IHlvdSBhcmUgZG9pbmcKKyMKICMgQ09ORklHX0ZJUkVXSVJFIGlzIG5vdCBzZXQKICMgQ09ORklHX0lFRUUxMzk0IGlzIG5vdCBzZXQKICMgQ09ORklHX0kyTyBpcyBub3Qgc2V0CiBDT05GSUdfTkVUREVWSUNFUz15Ci0jIENPTkZJR19ORVRERVZJQ0VTX01VTFRJUVVFVUUgaXMgbm90IHNldAogQ09ORklHX0RVTU1ZPW0KICMgQ09ORklHX0JPTkRJTkcgaXMgbm90IHNldAogIyBDT05GSUdfTUFDVkxBTiBpcyBub3Qgc2V0CkBAIC00MDIsMTQgKzQzNiwxNiBAQAogIyBDT05GSUdfSUJNX05FV19FTUFDX1JHTUlJIGlzIG5vdCBzZXQKICMgQ09ORklHX0lCTV9ORVdfRU1BQ19UQUggaXMgbm90IHNldAogIyBDT05GSUdfSUJNX05FV19FTUFDX0VNQUM0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0lCTV9ORVdfRU1BQ19OT19GTE9XX0NUUkwgaXMgbm90IHNldAorIyBDT05GSUdfSUJNX05FV19FTUFDX01BTF9DTFJfSUNJTlRTVEFUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lCTV9ORVdfRU1BQ19NQUxfQ09NTU9OX0VSUiBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRfUENJIGlzIG5vdCBzZXQKICMgQ09ORklHX0I0NCBpcyBub3Qgc2V0CisjIENPTkZJR19BVEwyIGlzIG5vdCBzZXQKIENPTkZJR19ORVRERVZfMTAwMD15CiAjIENPTkZJR19BQ0VOSUMgaXMgbm90IHNldAogIyBDT05GSUdfREwySyBpcyBub3Qgc2V0CiAjIENPTkZJR19FMTAwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19FMTAwMEUgaXMgbm90IHNldAotIyBDT05GSUdfRTEwMDBFX0VOQUJMRUQgaXMgbm90IHNldAogIyBDT05GSUdfSVAxMDAwIGlzIG5vdCBzZXQKICMgQ09ORklHX0lHQiBpcyBub3Qgc2V0CiAjIENPTkZJR19NWVJJX1NCVVMgaXMgbm90IHNldApAQCAtNDI1LDE4ICs0NjEsMjUgQEAKICMgQ09ORklHX0JOWDIgaXMgbm90IHNldAogIyBDT05GSUdfUUxBM1hYWCBpcyBub3Qgc2V0CiAjIENPTkZJR19BVEwxIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUTDFFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pNRSBpcyBub3Qgc2V0CiBDT05GSUdfTkVUREVWXzEwMDAwPXkKICMgQ09ORklHX0NIRUxTSU9fVDEgaXMgbm90IHNldAorQ09ORklHX0NIRUxTSU9fVDNfREVQRU5EUz15CiAjIENPTkZJR19DSEVMU0lPX1QzIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VOSUMgaXMgbm90IHNldAogIyBDT05GSUdfSVhHQkUgaXMgbm90IHNldAogIyBDT05GSUdfSVhHQiBpcyBub3Qgc2V0CiAjIENPTkZJR19TMklPIGlzIG5vdCBzZXQKICMgQ09ORklHX01ZUkkxMEdFIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVFhFTl9OSUMgaXMgbm90IHNldAogIyBDT05GSUdfTklVIGlzIG5vdCBzZXQKKyMgQ09ORklHX01MWDRfRU4gaXMgbm90IHNldAogIyBDT05GSUdfTUxYNF9DT1JFIGlzIG5vdCBzZXQKICMgQ09ORklHX1RFSFVUSSBpcyBub3Qgc2V0CiAjIENPTkZJR19CTlgyWCBpcyBub3Qgc2V0CisjIENPTkZJR19RTEdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NGQyBpcyBub3Qgc2V0CiAjIENPTkZJR19UUiBpcyBub3Qgc2V0CiAKICMKQEAgLTQ0NSw2ICs0ODgsMTAgQEAKICMgQ09ORklHX1dMQU5fUFJFODAyMTEgaXMgbm90IHNldAogIyBDT05GSUdfV0xBTl84MDIxMSBpcyBub3Qgc2V0CiAjIENPTkZJR19JV0xXSUZJX0xFRFMgaXMgbm90IHNldAorCisjCisjIEVuYWJsZSBXaU1BWCAoTmV0d29ya2luZyBvcHRpb25zKSB0byBzZWUgdGhlIFdpTUFYIGRyaXZlcnMKKyMKICMgQ09ORklHX1dBTiBpcyBub3Qgc2V0CiAjIENPTkZJR19GRERJIGlzIG5vdCBzZXQKICMgQ09ORklHX0hJUFBJIGlzIG5vdCBzZXQKQEAgLTQ5Miw5ICs1MzksMTEgQEAKIENPTkZJR19NT1VTRV9QUzJfU1lOQVBUSUNTPXkKIENPTkZJR19NT1VTRV9QUzJfTElGRUJPT0s9eQogQ09ORklHX01PVVNFX1BTMl9UUkFDS1BPSU5UPXkKKyMgQ09ORklHX01PVVNFX1BTMl9FTEFOVEVDSCBpcyBub3Qgc2V0CiAjIENPTkZJR19NT1VTRV9QUzJfVE9VQ0hLSVQgaXMgbm90IHNldAogQ09ORklHX01PVVNFX1NFUklBTD1tCiAjIENPTkZJR19NT1VTRV9BUFBMRVRPVUNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX01PVVNFX0JDTTU5NzQgaXMgbm90IHNldAogIyBDT05GSUdfTU9VU0VfVlNYWFhBQSBpcyBub3Qgc2V0CiAjIENPTkZJR19JTlBVVF9KT1lTVElDSyBpcyBub3Qgc2V0CiAjIENPTkZJR19JTlBVVF9UQUJMRVQgaXMgbm90IHNldApAQCAtNTE2LDE1ICs1NjUsMTggQEAKICMgQ2hhcmFjdGVyIGRldmljZXMKICMKIENPTkZJR19WVD15CitDT05GSUdfQ09OU09MRV9UUkFOU0xBVElPTlM9eQogQ09ORklHX1ZUX0NPTlNPTEU9eQogQ09ORklHX0hXX0NPTlNPTEU9eQogIyBDT05GSUdfVlRfSFdfQ09OU09MRV9CSU5ESU5HIGlzIG5vdCBzZXQKK0NPTkZJR19ERVZLTUVNPXkKICMgQ09ORklHX1NFUklBTF9OT05TVEFOREFSRCBpcyBub3Qgc2V0CiAjIENPTkZJR19OT1pPTUkgaXMgbm90IHNldAogCiAjCiAjIFNlcmlhbCBkcml2ZXJzCiAjCisjIENPTkZJR19TRVJJQUxfODI1MCBpcyBub3Qgc2V0CiAKICMKICMgTm9uLTgyNTAgc2VyaWFsIHBvcnQgc3VwcG9ydApAQCAtNTQwLDIzICs1OTIsMjAgQEAKIENPTkZJR19DT05TT0xFX1BPTEw9eQogIyBDT05GSUdfU0VSSUFMX0pTTSBpcyBub3Qgc2V0CiBDT05GSUdfVU5JWDk4X1BUWVM9eQorIyBDT05GSUdfREVWUFRTX01VTFRJUExFX0lOU1RBTkNFUyBpcyBub3Qgc2V0CiBDT05GSUdfTEVHQUNZX1BUWVM9eQogQ09ORklHX0xFR0FDWV9QVFlfQ09VTlQ9MjU2CiAjIENPTkZJR19JUE1JX0hBTkRMRVIgaXMgbm90IHNldAogQ09ORklHX0hXX1JBTkRPTT1tCi1DT05GSUdfSlNfUlRDPW0KICMgQ09ORklHX1IzOTY0IGlzIG5vdCBzZXQKICMgQ09ORklHX0FQUExJQ09NIGlzIG5vdCBzZXQKICMgQ09ORklHX1JBV19EUklWRVIgaXMgbm90IHNldAogIyBDT05GSUdfVENHX1RQTSBpcyBub3Qgc2V0CiBDT05GSUdfREVWUE9SVD15CiAjIENPTkZJR19JMkMgaXMgbm90IHNldAotCi0jCi0jIFNQSSBzdXBwb3J0Ci0jCiAjIENPTkZJR19TUEkgaXMgbm90IHNldAotIyBDT05GSUdfU1BJX01BU1RFUiBpcyBub3Qgc2V0CitDT05GSUdfQVJDSF9XQU5UX09QVElPTkFMX0dQSU9MSUI9eQorIyBDT05GSUdfR1BJT0xJQiBpcyBub3Qgc2V0CiAjIENPTkZJR19XMSBpcyBub3Qgc2V0CiAjIENPTkZJR19QT1dFUl9TVVBQTFkgaXMgbm90IHNldAogQ09ORklHX0hXTU9OPXkKQEAgLTU3NywyNSArNjI2LDM4IEBACiAjIENPTkZJR19TRU5TT1JTX1c4MzYyN0VIRiBpcyBub3Qgc2V0CiAjIENPTkZJR19IV01PTl9ERUJVR19DSElQIGlzIG5vdCBzZXQKICMgQ09ORklHX1RIRVJNQUwgaXMgbm90IHNldAorIyBDT05GSUdfVEhFUk1BTF9IV01PTiBpcyBub3Qgc2V0CiAjIENPTkZJR19XQVRDSERPRyBpcyBub3Qgc2V0CitDT05GSUdfU1NCX1BPU1NJQkxFPXkKIAogIwogIyBTb25pY3MgU2lsaWNvbiBCYWNrcGxhbmUKICMKLUNPTkZJR19TU0JfUE9TU0lCTEU9eQogIyBDT05GSUdfU1NCIGlzIG5vdCBzZXQKIAogIwogIyBNdWx0aWZ1bmN0aW9uIGRldmljZSBkcml2ZXJzCiAjCisjIENPTkZJR19NRkRfQ09SRSBpcyBub3Qgc2V0CiAjIENPTkZJR19NRkRfU001MDEgaXMgbm90IHNldAogIyBDT05GSUdfSFRDX1BBU0lDMyBpcyBub3Qgc2V0CisjIENPTkZJR19NRkRfVE1JTyBpcyBub3Qgc2V0CisjIENPTkZJR19SRUdVTEFUT1IgaXMgbm90IHNldAogCiAjCiAjIE11bHRpbWVkaWEgZGV2aWNlcwogIworCisjCisjIE11bHRpbWVkaWEgY29yZSBzdXBwb3J0CisjCiAjIENPTkZJR19WSURFT19ERVYgaXMgbm90IHNldAogIyBDT05GSUdfRFZCX0NPUkUgaXMgbm90IHNldAorIyBDT05GSUdfVklERU9fTUVESUEgaXMgbm90IHNldAorCisjCisjIE11bHRpbWVkaWEgZHJpdmVycworIwogIyBDT05GSUdfREFCIGlzIG5vdCBzZXQKIAogIwpAQCAtNjE2LDE1ICs2NzgsMTcgQEAKICMKICMgQ09ORklHX1BST01fQ09OU09MRSBpcyBub3Qgc2V0CiBDT05GSUdfRFVNTVlfQ09OU09MRT15Ci0KLSMKLSMgU291bmQKLSMKICMgQ09ORklHX1NPVU5EIGlzIG5vdCBzZXQKIENPTkZJR19ISURfU1VQUE9SVD15CiBDT05GSUdfSElEPXkKICMgQ09ORklHX0hJRF9ERUJVRyBpcyBub3Qgc2V0CiAjIENPTkZJR19ISURSQVcgaXMgbm90IHNldAorIyBDT05GSUdfSElEX1BJRCBpcyBub3Qgc2V0CisKKyMKKyMgU3BlY2lhbCBISUQgZHJpdmVycworIworQ09ORklHX0hJRF9DT01QQVQ9eQogQ09ORklHX1VTQl9TVVBQT1JUPXkKIENPTkZJR19VU0JfQVJDSF9IQVNfSENEPXkKIENPTkZJR19VU0JfQVJDSF9IQVNfT0hDST15CkBAIC02MzIsMzIgKzY5Niw3MSBAQAogIyBDT05GSUdfVVNCIGlzIG5vdCBzZXQKIAogIwotIyBOT1RFOiBVU0JfU1RPUkFHRSBlbmFibGVzIFNDU0ksIGFuZCAnU0NTSSBkaXNrIHN1cHBvcnQnCisjIEVuYWJsZSBIb3N0IG9yIEdhZGdldCBzdXBwb3J0IHRvIHNlZSBJbnZlbnRyYSBvcHRpb25zCisjCisKKyMKKyMgTk9URTogVVNCX1NUT1JBR0UgZGVwZW5kcyBvbiBTQ1NJIGJ1dCBCTEtfREVWX1NEIG1heSBhbHNvIGJlIG5lZWRlZDsKICMKICMgQ09ORklHX1VTQl9HQURHRVQgaXMgbm90IHNldAorCisjCisjIE9URyBhbmQgcmVsYXRlZCBpbmZyYXN0cnVjdHVyZQorIworIyBDT05GSUdfVVdCIGlzIG5vdCBzZXQKICMgQ09ORklHX01NQyBpcyBub3Qgc2V0CiAjIENPTkZJR19NRU1TVElDSyBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVdfTEVEUyBpcyBub3Qgc2V0CisjIENPTkZJR19BQ0NFU1NJQklMSVRZIGlzIG5vdCBzZXQKICMgQ09ORklHX0lORklOSUJBTkQgaXMgbm90IHNldAotIyBDT05GSUdfUlRDX0NMQVNTIGlzIG5vdCBzZXQKK0NPTkZJR19SVENfTElCPXkKK0NPTkZJR19SVENfQ0xBU1M9eQorQ09ORklHX1JUQ19IQ1RPU1lTPXkKK0NPTkZJR19SVENfSENUT1NZU19ERVZJQ0U9InJ0YzAiCisjIENPTkZJR19SVENfREVCVUcgaXMgbm90IHNldAorCisjCisjIFJUQyBpbnRlcmZhY2VzCisjCitDT05GSUdfUlRDX0lOVEZfU1lTRlM9eQorQ09ORklHX1JUQ19JTlRGX1BST0M9eQorQ09ORklHX1JUQ19JTlRGX0RFVj15CisjIENPTkZJR19SVENfSU5URl9ERVZfVUlFX0VNVUwgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9URVNUIGlzIG5vdCBzZXQKKworIworIyBTUEkgUlRDIGRyaXZlcnMKKyMKKworIworIyBQbGF0Zm9ybSBSVEMgZHJpdmVycworIworIyBDT05GSUdfUlRDX0RSVl9EUzEyODYgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9EUzE1MTEgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9EUzE1NTMgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9EUzE3NDIgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9TVEsxN1RBOCBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX000OFQ4NiBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX000OFQzNSBpcyBub3Qgc2V0CitDT05GSUdfUlRDX0RSVl9NNDhUNTk9eQorIyBDT05GSUdfUlRDX0RSVl9CUTQ4MDIgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9WMzAyMCBpcyBub3Qgc2V0CisKKyMKKyMgb24tQ1BVIFJUQyBkcml2ZXJzCisjCisjIENPTkZJR19ETUFERVZJQ0VTIGlzIG5vdCBzZXQKICMgQ09ORklHX1VJTyBpcyBub3Qgc2V0CisjIENPTkZJR19TVEFHSU5HIGlzIG5vdCBzZXQKIAogIwogIyBNaXNjIExpbnV4L1NQQVJDIGRyaXZlcnMKICMKIENPTkZJR19TVU5fT1BFTlBST01JTz1tCi1DT05GSUdfU1VOX01PU1RFS19SVEM9bQotIyBDT05GSUdfU1VOX0JQUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TVU5fVklERU9QSVggaXMgbm90IHNldAogIyBDT05GSUdfVEFEUE9MRV9UUzEwMl9VQ1RSTCBpcyBub3Qgc2V0CiAjIENPTkZJR19TVU5fSlNGTEFTSCBpcyBub3Qgc2V0CiAKICMKLSMgVW5peDk4IFBUWSBzdXBwb3J0Ci0jCi1DT05GSUdfVU5JWDk4X1BUWV9DT1VOVD0yNTYKLQotIwogIyBGaWxlIHN5c3RlbXMKICMKIENPTkZJR19FWFQyX0ZTPXkKQEAgLTY2NiwxMSArNzY5LDEyIEBACiBDT05GSUdfRVhUMl9GU19TRUNVUklUWT15CiAjIENPTkZJR19FWFQyX0ZTX1hJUCBpcyBub3Qgc2V0CiAjIENPTkZJR19FWFQzX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0VYVDRERVZfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRVhUNF9GUyBpcyBub3Qgc2V0CiBDT05GSUdfRlNfTUJDQUNIRT15CiAjIENPTkZJR19SRUlTRVJGU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19KRlNfRlMgaXMgbm90IHNldAogQ09ORklHX0ZTX1BPU0lYX0FDTD15CitDT05GSUdfRklMRV9MT0NLSU5HPXkKICMgQ09ORklHX1hGU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19PQ0ZTMl9GUyBpcyBub3Qgc2V0CiBDT05GSUdfRE5PVElGWT15CkBAIC03MDIsMTQgKzgwNiwxMiBAQAogQ09ORklHX1BST0NfRlM9eQogQ09ORklHX1BST0NfS0NPUkU9eQogQ09ORklHX1BST0NfU1lTQ1RMPXkKK0NPTkZJR19QUk9DX1BBR0VfTU9OSVRPUj15CiBDT05GSUdfU1lTRlM9eQogIyBDT05GSUdfVE1QRlMgaXMgbm90IHNldAogIyBDT05GSUdfSFVHRVRMQl9QQUdFIGlzIG5vdCBzZXQKICMgQ09ORklHX0NPTkZJR0ZTX0ZTIGlzIG5vdCBzZXQKLQotIwotIyBNaXNjZWxsYW5lb3VzIGZpbGVzeXN0ZW1zCi0jCitDT05GSUdfTUlTQ19GSUxFU1lTVEVNUz15CiAjIENPTkZJR19BREZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0FGRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfSEZTX0ZTIGlzIG5vdCBzZXQKQEAgLTcyMCw2ICs4MjIsNyBAQAogIyBDT05GSUdfQ1JBTUZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1ZYRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfTUlOSVhfRlMgaXMgbm90IHNldAorIyBDT05GSUdfT01GU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19IUEZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1FOWDRGU19GUyBpcyBub3Qgc2V0CiBDT05GSUdfUk9NRlNfRlM9bQpAQCAtNzI5LDEzICs4MzIsMTMgQEAKIENPTkZJR19ORlNfRlM9eQogIyBDT05GSUdfTkZTX1YzIGlzIG5vdCBzZXQKICMgQ09ORklHX05GU19WNCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORlNEIGlzIG5vdCBzZXQKIENPTkZJR19ST09UX05GUz15CisjIENPTkZJR19ORlNEIGlzIG5vdCBzZXQKIENPTkZJR19MT0NLRD15CiBDT05GSUdfTkZTX0NPTU1PTj15CiBDT05GSUdfU1VOUlBDPXkKIENPTkZJR19TVU5SUENfR1NTPW0KLSMgQ09ORklHX1NVTlJQQ19CSU5EMzQgaXMgbm90IHNldAorIyBDT05GSUdfU1VOUlBDX1JFR0lTVEVSX1Y0IGlzIG5vdCBzZXQKIENPTkZJR19SUENTRUNfR1NTX0tSQjU9bQogIyBDT05GSUdfUlBDU0VDX0dTU19TUEtNMyBpcyBub3Qgc2V0CiAjIENPTkZJR19TTUJfRlMgaXMgbm90IHNldApAQCAtODA2LDkgKzkwOSwxMiBAQAogIyBDT05GSUdfSEVBREVSU19DSEVDSyBpcyBub3Qgc2V0CiBDT05GSUdfREVCVUdfS0VSTkVMPXkKIENPTkZJR19ERVRFQ1RfU09GVExPQ0tVUD15CisjIENPTkZJR19CT09UUEFSQU1fU09GVExPQ0tVUF9QQU5JQyBpcyBub3Qgc2V0CitDT05GSUdfQk9PVFBBUkFNX1NPRlRMT0NLVVBfUEFOSUNfVkFMVUU9MAogIyBDT05GSUdfU0NIRURfREVCVUcgaXMgbm90IHNldAogIyBDT05GSUdfU0NIRURTVEFUUyBpcyBub3Qgc2V0CiAjIENPTkZJR19USU1FUl9TVEFUUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19PQkpFQ1RTIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX1NMQUIgaXMgbm90IHNldAogIyBDT05GSUdfREVCVUdfUlRfTVVURVhFUyBpcyBub3Qgc2V0CiAjIENPTkZJR19SVF9NVVRFWF9URVNURVIgaXMgbm90IHNldApAQCAtODIyLDM3ICs5MjgsNTkgQEAKICMgQ09ORklHX0RFQlVHX0lORk8gaXMgbm90IHNldAogIyBDT05GSUdfREVCVUdfVk0gaXMgbm90IHNldAogIyBDT05GSUdfREVCVUdfV1JJVEVDT1VOVCBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfTUVNT1JZX0lOSVQ9eQogIyBDT05GSUdfREVCVUdfTElTVCBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19TRyBpcyBub3Qgc2V0Ci1DT05GSUdfRlJBTUVfUE9JTlRFUj15CisjIENPTkZJR19ERUJVR19OT1RJRklFUlMgaXMgbm90IHNldAogIyBDT05GSUdfQk9PVF9QUklOVEtfREVMQVkgaXMgbm90IHNldAogIyBDT05GSUdfUkNVX1RPUlRVUkVfVEVTVCBpcyBub3Qgc2V0CisjIENPTkZJR19SQ1VfQ1BVX1NUQUxMX0RFVEVDVE9SIGlzIG5vdCBzZXQKICMgQ09ORklHX0JBQ0tUUkFDRV9TRUxGX1RFU1QgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfQkxPQ0tfRVhUX0RFVlQgaXMgbm90IHNldAogIyBDT05GSUdfRkFVTFRfSU5KRUNUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZU0NUTF9TWVNDQUxMX0NIRUNLIGlzIG5vdCBzZXQKKworIworIyBUcmFjZXJzCisjCisjIENPTkZJR19TQ0hFRF9UUkFDRVIgaXMgbm90IHNldAorIyBDT05GSUdfQ09OVEVYVF9TV0lUQ0hfVFJBQ0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JPT1RfVFJBQ0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RSQUNFX0JSQU5DSF9QUk9GSUxJTkcgaXMgbm90IHNldAorIyBDT05GSUdfRFlOQU1JQ19QUklOVEtfREVCVUcgaXMgbm90IHNldAogIyBDT05GSUdfU0FNUExFUyBpcyBub3Qgc2V0Ci1DT05GSUdfS0dEQj15CiBDT05GSUdfSEFWRV9BUkNIX0tHREI9eQorQ09ORklHX0tHREI9eQogQ09ORklHX0tHREJfU0VSSUFMX0NPTlNPTEU9eQogQ09ORklHX0tHREJfVEVTVFM9eQogIyBDT05GSUdfS0dEQl9URVNUU19PTl9CT09UIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX1NUQUNLX1VTQUdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NUQUNLX0RFQlVHIGlzIG5vdCBzZXQKIAogIwogIyBTZWN1cml0eSBvcHRpb25zCiAjCiAjIENPTkZJR19LRVlTIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFQ1VSSVRZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFQ1VSSVRZRlMgaXMgbm90IHNldAogIyBDT05GSUdfU0VDVVJJVFlfRklMRV9DQVBBQklMSVRJRVMgaXMgbm90IHNldAogQ09ORklHX0NSWVBUTz15CiAKICMKICMgQ3J5cHRvIGNvcmUgb3IgaGVscGVyCiAjCisjIENPTkZJR19DUllQVE9fRklQUyBpcyBub3Qgc2V0CiBDT05GSUdfQ1JZUFRPX0FMR0FQST15CitDT05GSUdfQ1JZUFRPX0FMR0FQSTI9eQogQ09ORklHX0NSWVBUT19BRUFEPXkKK0NPTkZJR19DUllQVE9fQUVBRDI9eQogQ09ORklHX0NSWVBUT19CTEtDSVBIRVI9eQorQ09ORklHX0NSWVBUT19CTEtDSVBIRVIyPXkKIENPTkZJR19DUllQVE9fSEFTSD15CitDT05GSUdfQ1JZUFRPX0hBU0gyPXkKK0NPTkZJR19DUllQVE9fUk5HMj15CiBDT05GSUdfQ1JZUFRPX01BTkFHRVI9eQorQ09ORklHX0NSWVBUT19NQU5BR0VSMj15CiAjIENPTkZJR19DUllQVE9fR0YxMjhNVUwgaXMgbm90IHNldAogQ09ORklHX0NSWVBUT19OVUxMPW0KICMgQ09ORklHX0NSWVBUT19DUllQVEQgaXMgbm90IHNldApAQCAtODkwLDYgKzEwMTgsMTAgQEAKIENPTkZJR19DUllQVE9fTUQ0PXkKIENPTkZJR19DUllQVE9fTUQ1PXkKIENPTkZJR19DUllQVE9fTUlDSEFFTF9NSUM9bQorIyBDT05GSUdfQ1JZUFRPX1JNRDEyOCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fUk1EMTYwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19STUQyNTYgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1JNRDMyMCBpcyBub3Qgc2V0CiBDT05GSUdfQ1JZUFRPX1NIQTE9eQogQ09ORklHX0NSWVBUT19TSEEyNTY9bQogQ09ORklHX0NSWVBUT19TSEE1MTI9bQpAQCAtOTIxLDE1ICsxMDUzLDIxIEBACiAjCiBDT05GSUdfQ1JZUFRPX0RFRkxBVEU9eQogIyBDT05GSUdfQ1JZUFRPX0xaTyBpcyBub3Qgc2V0CisKKyMKKyMgUmFuZG9tIE51bWJlciBHZW5lcmF0aW9uCisjCisjIENPTkZJR19DUllQVE9fQU5TSV9DUFJORyBpcyBub3Qgc2V0CiAjIENPTkZJR19DUllQVE9fSFcgaXMgbm90IHNldAogCiAjCiAjIExpYnJhcnkgcm91dGluZXMKICMKIENPTkZJR19CSVRSRVZFUlNFPXkKLSMgQ09ORklHX0dFTkVSSUNfRklORF9GSVJTVF9CSVQgaXMgbm90IHNldAorQ09ORklHX0dFTkVSSUNfRklORF9MQVNUX0JJVD15CiAjIENPTkZJR19DUkNfQ0NJVFQgaXMgbm90IHNldAogIyBDT05GSUdfQ1JDMTYgaXMgbm90IHNldAorIyBDT05GSUdfQ1JDX1QxMERJRiBpcyBub3Qgc2V0CiAjIENPTkZJR19DUkNfSVRVX1QgaXMgbm90IHNldAogQ09ORklHX0NSQzMyPXkKICMgQ09ORklHX0NSQzcgaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9LYnVpbGQgYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL0tidWlsZAppbmRleCA5NWUzOGE0Li5kZWViMGZiIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL0tidWlsZAorKysgYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL0tidWlsZApAQCAtMTcsNCArMTcsMyBAQAogaGVhZGVyLXkgKz0gdWN0eC5oCiBoZWFkZXIteSArPSB1dHJhcC5oCiBoZWFkZXIteSArPSB3YXRjaGRvZy5oCi1oZWFkZXIteSArPSBzd2FiLmgKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vYnl0ZW9yZGVyLmggYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL2J5dGVvcmRlci5oCmluZGV4IDQ4YTA0N2MuLmNjYzFiNmIgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vYnl0ZW9yZGVyLmgKKysrIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9ieXRlb3JkZXIuaApAQCAtMSw3ICsxLDYgQEAKICNpZm5kZWYgX1NQQVJDX0JZVEVPUkRFUl9ICiAjZGVmaW5lIF9TUEFSQ19CWVRFT1JERVJfSAogCi0jaW5jbHVkZSA8YXNtL3N3YWIuaD4KICNpbmNsdWRlIDxsaW51eC9ieXRlb3JkZXIvYmlnX2VuZGlhbi5oPgogCiAjZW5kaWYgLyogX1NQQVJDX0JZVEVPUkRFUl9IICovCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL29wbGliXzMyLmggYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL29wbGliXzMyLmgKaW5kZXggNzNkNDU1Mi4uMzNlMzFjZSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9vcGxpYl8zMi5oCisrKyBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vb3BsaWJfMzIuaApAQCAtMTc3LDE3ICsxNzcsNiBAQAogCiAvKiBQUk9NIGRldmljZSB0cmVlIHRyYXZlcnNhbCBmdW5jdGlvbnMuLi4gKi8KIAotI2lmZGVmIFBST01MSUJfSU5URVJOQUwKLQotLyogSW50ZXJuYWwgdmVyc2lvbiBvZiBwcm9tX2dldGNoaWxkLiAqLwotZXh0ZXJuIGludCBfX3Byb21fZ2V0Y2hpbGQoaW50IHBhcmVudF9ub2RlKTsKLQotLyogSW50ZXJuYWwgdmVyc2lvbiBvZiBwcm9tX2dldHNpYmxpbmcuICovCi1leHRlcm4gaW50IF9fcHJvbV9nZXRzaWJsaW5nKGludCBub2RlKTsKLQotI2VuZGlmCi0KLQogLyogR2V0IHRoZSBjaGlsZCBub2RlIG9mIHRoZSBnaXZlbiBub2RlLCBvciB6ZXJvIGlmIG5vIGNoaWxkIGV4aXN0cy4gKi8KIGV4dGVybiBpbnQgcHJvbV9nZXRjaGlsZChpbnQgcGFyZW50X25vZGUpOwogCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL29wbGliXzY0LmggYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL29wbGliXzY0LmgKaW5kZXggNmQyYzJjYS4uYTVkYjAzMSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9vcGxpYl82NC5oCisrKyBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vb3BsaWJfNjQuaApAQCAtMjE4LDE2ICsyMTgsNiBAQAogCiAvKiBQUk9NIGRldmljZSB0cmVlIHRyYXZlcnNhbCBmdW5jdGlvbnMuLi4gKi8KIAotI2lmZGVmIFBST01MSUJfSU5URVJOQUwKLQotLyogSW50ZXJuYWwgdmVyc2lvbiBvZiBwcm9tX2dldGNoaWxkLiAqLwotZXh0ZXJuIGludCBfX3Byb21fZ2V0Y2hpbGQoaW50IHBhcmVudF9ub2RlKTsKLQotLyogSW50ZXJuYWwgdmVyc2lvbiBvZiBwcm9tX2dldHNpYmxpbmcuICovCi1leHRlcm4gaW50IF9fcHJvbV9nZXRzaWJsaW5nKGludCBub2RlKTsKLQotI2VuZGlmCi0KIC8qIEdldCB0aGUgY2hpbGQgbm9kZSBvZiB0aGUgZ2l2ZW4gbm9kZSwgb3IgemVybyBpZiBubyBjaGlsZCBleGlzdHMuICovCiBleHRlcm4gaW50IHByb21fZ2V0Y2hpbGQoaW50IHBhcmVudF9ub2RlKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9zaWduYWwuaCBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vc2lnbmFsLmgKaW5kZXggNDE1MzVlNy4uY2JhNDUyMCAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9zaWduYWwuaAorKysgYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3NpZ25hbC5oCkBAIC04NCw3ICs4NCwxMSBAQAogCiAjZGVmaW5lIF9fT0xEX05TSUcJMzIKICNkZWZpbmUgX19ORVdfTlNJRyAgICAgIDY0CisjaWZkZWYgX19hcmNoNjRfXwogI2RlZmluZSBfTlNJR19CUFcgICAgICAgNjQKKyNlbHNlCisjZGVmaW5lIF9OU0lHX0JQVyAgICAgICAzMgorI2VuZGlmCiAjZGVmaW5lIF9OU0lHX1dPUkRTICAgICAoX19ORVdfTlNJRyAvIF9OU0lHX0JQVykKIAogI2RlZmluZSBTSUdSVE1JTiAgICAgICAzMgpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS90aW1lcl82NC5oIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS90aW1lcl82NC5oCmluZGV4IDViNzc5ZmQuLmVmM2MzNjggMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vdGltZXJfNjQuaAorKysgYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3RpbWVyXzY0LmgKQEAgLTEwLDcgKzEwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAKIHN0cnVjdCBzcGFyYzY0X3RpY2tfb3BzIHsKLQl1bnNpZ25lZCBsb25nICgqZ2V0X3RpY2spKHZvaWQpOworCXVuc2lnbmVkIGxvbmcgbG9uZyAoKmdldF90aWNrKSh2b2lkKTsKIAlpbnQgKCphZGRfY29tcGFyZSkodW5zaWduZWQgbG9uZyk7CiAJdW5zaWduZWQgbG9uZyBzb2Z0aW50X21hc2s7CiAJdm9pZCAoKmRpc2FibGVfaXJxKSh2b2lkKTsKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vdG9wb2xvZ3lfNjQuaCBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vdG9wb2xvZ3lfNjQuaAppbmRleCBiOGE2NWI2Li41YmMwYjhmIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3RvcG9sb2d5XzY0LmgKKysrIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS90b3BvbG9neV82NC5oCkBAIC00Nyw2ICs0NywxMCBAQAogCShwY2lidXNfdG9fbm9kZShidXMpID09IC0xID8gXAogCSBDUFVfTUFTS19BTEwgOiBcCiAJIG5vZGVfdG9fY3B1bWFzayhwY2lidXNfdG9fbm9kZShidXMpKSkKKyNkZWZpbmUgY3B1bWFza19vZl9wY2lidXMoYnVzKQlcCisJKHBjaWJ1c190b19ub2RlKGJ1cykgPT0gLTEgPyBcCisJIENQVV9NQVNLX0FMTF9QVFIgOiBcCisJIGNwdW1hc2tfb2Zfbm9kZShwY2lidXNfdG9fbm9kZShidXMpKSkKIAogI2RlZmluZSBTRF9OT0RFX0lOSVQgKHN0cnVjdCBzY2hlZF9kb21haW4pIHsJCVwKIAkubWluX2ludGVydmFsCQk9IDgsCQkJXApkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS90eXBlcy5oIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS90eXBlcy5oCmluZGV4IDhjMjhmZGUuLjIyMzcxMTg4IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3R5cGVzLmgKKysrIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS90eXBlcy5oCkBAIC0xMSw3ICsxMSw3IEBACiAjaWYgZGVmaW5lZChfX3NwYXJjX18pICYmIGRlZmluZWQoX19hcmNoNjRfXykKIAogLyoqKiBTUEFSQyA2NCBiaXQgKioqLwotI2luY2x1ZGUgPGFzbS1nZW5lcmljL2ludC1sNjQuaD4KKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9pbnQtbGw2NC5oPgogCiAjaWZuZGVmIF9fQVNTRU1CTFlfXwogCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9hdXhpb18zMi5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvYXV4aW9fMzIuYwppbmRleCAwOWM4NTcyLi40NWM0MTIzIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC9hdXhpb18zMi5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL2F1eGlvXzMyLmMKQEAgLTc2LDYgKzc2LDcgQEAKIAkJcmV0dXJuIHNidXNfcmVhZGIoYXV4aW9fcmVnaXN0ZXIpOwogCXJldHVybiAwOwogfQorRVhQT1JUX1NZTUJPTChnZXRfYXV4aW8pOwogCiB2b2lkIHNldF9hdXhpbyh1bnNpZ25lZCBjaGFyIGJpdHNfb24sIHVuc2lnbmVkIGNoYXIgYml0c19vZmYpCiB7CkBAIC0xMDIsNyArMTAzLDcgQEAKIAl9OwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmF1eGlvX2xvY2ssIGZsYWdzKTsKIH0KLQorRVhQT1JUX1NZTUJPTChzZXRfYXV4aW8pOwogCiAvKiBzdW40bSBwb3dlciBjb250cm9sIHJlZ2lzdGVyIChBVVhJTzIpICovCiAKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL2F1eGlvXzY0LmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9hdXhpb182NC5jCmluZGV4IDhiNjczNDcuLjlmNTJkYjIgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL2F1eGlvXzY0LmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvYXV4aW9fNjQuYwpAQCAtNzIsNiArNzIsNyBAQAogCWJpdCA9IChlYnVzID8gQVVYSU9fUENJT19MRUQgOiBBVVhJT19BVVgxX0xFRCk7CiAJX19hdXhpb19zZXRfYml0KGJpdCwgb24sIGVidXMpOwogfQorRVhQT1JUX1NZTUJPTChhdXhpb19zZXRfbGVkKTsKIAogc3RhdGljIHZvaWQgX19hdXhpb19zYnVzX3NldF9sdGUoaW50IG9uKQogewpAQCAtOTAsNiArOTEsNyBAQAogCQlicmVhazsKIAl9CiB9CitFWFBPUlRfU1lNQk9MKGF1eGlvX3NldF9sdGUpOwogCiBzdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCBfX2luaXRkYXRhIGF1eGlvX21hdGNoW10gPSB7CiAJewpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvY3B1LmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9jcHUuYwppbmRleCA2YzJkYTI0Li5mMGI4MjU1IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC9jcHUuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9jcHUuYwpAQCAtNSw2ICs1LDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgogI2luY2x1ZGUgPGxpbnV4L3RocmVhZHMuaD4KQEAgLTIwLDYgKzIxLDcgQEAKICNpbmNsdWRlICJrZXJuZWwuaCIKIAogREVGSU5FX1BFUl9DUFUoY3B1aW5mb19zcGFyYywgX19jcHVfZGF0YSkgPSB7IDAgfTsKK0VYUE9SVF9QRVJfQ1BVX1NZTUJPTChfX2NwdV9kYXRhKTsKIAogc3RydWN0IGNwdV9pbmZvIHsKIAlpbnQgcHNyX3ZlcnM7CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9kcy5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvZHMuYwppbmRleCBmNTJlMDUzLi41N2MzOTg0IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC9kcy5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL2RzLmMKQEAgLTI4Niw3ICsyODYsNyBAQAogCiAJcnAgPSAoc3RydWN0IGRzX21kX3VwZGF0ZV9yZXEgKikgKGRwa3QgKyAxKTsKIAotCXByaW50ayhLRVJOX0lORk8gImRzLSVsdTogTWFjaGluZSBkZXNjcmlwdGlvbiB1cGRhdGUuXG4iLCBkcC0+aWQpOworCXByaW50ayhLRVJOX0lORk8gImRzLSVsbHU6IE1hY2hpbmUgZGVzY3JpcHRpb24gdXBkYXRlLlxuIiwgZHAtPmlkKTsKIAogCW1kZXNjX3VwZGF0ZSgpOwogCkBAIC0zMjUsNyArMzI1LDcgQEAKIAogCXJwID0gKHN0cnVjdCBkc19zaHV0ZG93bl9yZXEgKikgKGRwa3QgKyAxKTsKIAotCXByaW50ayhLRVJOX0FMRVJUICJkcy0lbHU6IFNodXRkb3duIHJlcXVlc3QgZnJvbSAiCisJcHJpbnRrKEtFUk5fQUxFUlQgImRzLSVsbHU6IFNodXRkb3duIHJlcXVlc3QgZnJvbSAiCiAJICAgICAgICJMRE9NIG1hbmFnZXIgcmVjZWl2ZWQuXG4iLCBkcC0+aWQpOwogCiAJbWVtc2V0KCZwa3QsIDAsIHNpemVvZihwa3QpKTsKQEAgLTM2NSw3ICszNjUsNyBAQAogCiAJcnAgPSAoc3RydWN0IGRzX3BhbmljX3JlcSAqKSAoZHBrdCArIDEpOwogCi0JcHJpbnRrKEtFUk5fQUxFUlQgImRzLSVsdTogUGFuaWMgcmVxdWVzdCBmcm9tICIKKwlwcmludGsoS0VSTl9BTEVSVCAiZHMtJWxsdTogUGFuaWMgcmVxdWVzdCBmcm9tICIKIAkgICAgICAgIkxET00gbWFuYWdlciByZWNlaXZlZC5cbiIsIGRwLT5pZCk7CiAKIAltZW1zZXQoJnBrdCwgMCwgc2l6ZW9mKHBrdCkpOwpAQCAtNTQ5LDcgKzU0OSw3IEBACiAJZm9yX2VhY2hfY3B1X21hc2soY3B1LCAqbWFzaykgewogCQlpbnQgZXJyOwogCi0JCXByaW50ayhLRVJOX0lORk8gImRzLSVsdTogU3RhcnRpbmcgY3B1ICVkLi4uXG4iLAorCQlwcmludGsoS0VSTl9JTkZPICJkcy0lbGx1OiBTdGFydGluZyBjcHUgJWQuLi5cbiIsCiAJCSAgICAgICBkcC0+aWQsIGNwdSk7CiAJCWVyciA9IGNwdV91cChjcHUpOwogCQlpZiAoZXJyKSB7CkBAIC01NjUsNyArNTY1LDcgQEAKIAkJCQlyZXMgPSBEUl9DUFVfUkVTX0NQVV9OT1RfUkVTUE9ORElORzsKIAkJCX0KIAotCQkJcHJpbnRrKEtFUk5fSU5GTyAiZHMtJWx1OiBDUFUgc3RhcnR1cCBmYWlsZWQgZXJyPSVkXG4iLAorCQkJcHJpbnRrKEtFUk5fSU5GTyAiZHMtJWxsdTogQ1BVIHN0YXJ0dXAgZmFpbGVkIGVycj0lZFxuIiwKIAkJCSAgICAgICBkcC0+aWQsIGVycik7CiAJCQlkcl9jcHVfbWFyayhyZXNwLCBjcHUsIG5jcHVzLCByZXMsIHN0YXQpOwogCQl9CkBAIC02MDUsNyArNjA1LDcgQEAKIAlmb3JfZWFjaF9jcHVfbWFzayhjcHUsICptYXNrKSB7CiAJCWludCBlcnI7CiAKLQkJcHJpbnRrKEtFUk5fSU5GTyAiZHMtJWx1OiBTaHV0dGluZyBkb3duIGNwdSAlZC4uLlxuIiwKKwkJcHJpbnRrKEtFUk5fSU5GTyAiZHMtJWxsdTogU2h1dHRpbmcgZG93biBjcHUgJWQuLi5cbiIsCiAJCSAgICAgICBkcC0+aWQsIGNwdSk7CiAJCWVyciA9IGNwdV9kb3duKGNwdSk7CiAJCWlmIChlcnIpCkBAIC02ODQsNyArNjg0LDcgQEAKIAogCXJwID0gKHN0cnVjdCBkc19wcmlfbXNnICopIChkcGt0ICsgMSk7CiAKLQlwcmludGsoS0VSTl9JTkZPICJkcy0lbHU6IFBSSSBSRVEgWyVseDolbHhdLCBsZW49JWRcbiIsCisJcHJpbnRrKEtFUk5fSU5GTyAiZHMtJWxsdTogUFJJIFJFUSBbJWxseDolbGx4XSwgbGVuPSVkXG4iLAogCSAgICAgICBkcC0+aWQsIHJwLT5yZXFfbnVtLCBycC0+dHlwZSwgbGVuKTsKIH0KIApAQCAtODE2LDcgKzgxNiw3IEBACiAKIAkJaWYgKGRzX3Zhcl9kb29yYmVsbCA9PSAwIHx8CiAJCSAgICBkc192YXJfcmVzcG9uc2UgIT0gRFNfVkFSX1NVQ0NFU1MpCi0JCQlwcmludGsoS0VSTl9FUlIgImRzLSVsdTogdmFyLWNvbmZpZyBbJXM6JXNdICIKKwkJCXByaW50ayhLRVJOX0VSUiAiZHMtJWxsdTogdmFyLWNvbmZpZyBbJXM6JXNdICIKIAkJCSAgICAgICAiZmFpbGVkLCByZXNwb25zZSglZCkuXG4iLAogCQkJICAgICAgIGRwLT5pZCwgdmFyLCB2YWx1ZSwKIAkJCSAgICAgICBkc192YXJfcmVzcG9uc2UpOwpAQCAtODUwLDcgKzg1MCw3IEBACiAKIHN0YXRpYyB2b2lkIGRzX2Nvbm5fcmVzZXQoc3RydWN0IGRzX2luZm8gKmRwKQogewotCXByaW50ayhLRVJOX0VSUiAiZHMtJWx1OiBkc19jb25uX3Jlc2V0KCkgZnJvbSAlcFxuIiwKKwlwcmludGsoS0VSTl9FUlIgImRzLSVsbHU6IGRzX2Nvbm5fcmVzZXQoKSBmcm9tICVwXG4iLAogCSAgICAgICBkcC0+aWQsIF9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcygwKSk7CiB9CiAKQEAgLTkxMiwxMSArOTEyLDExIEBACiAJCXN0cnVjdCBkc19jYXBfc3RhdGUgKmNwID0gZmluZF9jYXAoZHAsIGFwLT5oYW5kbGUpOwogCiAJCWlmICghY3ApIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiZHMtJWx1OiBSRUcgQUNLIGZvciB1bmtub3duICIKLQkJCSAgICAgICAiaGFuZGxlICVseFxuIiwgZHAtPmlkLCBhcC0+aGFuZGxlKTsKKwkJCXByaW50ayhLRVJOX0VSUiAiZHMtJWxsdTogUkVHIEFDSyBmb3IgdW5rbm93biAiCisJCQkgICAgICAgImhhbmRsZSAlbGx4XG4iLCBkcC0+aWQsIGFwLT5oYW5kbGUpOwogCQkJcmV0dXJuIDA7CiAJCX0KLQkJcHJpbnRrKEtFUk5fSU5GTyAiZHMtJWx1OiBSZWdpc3RlcmVkICVzIHNlcnZpY2UuXG4iLAorCQlwcmludGsoS0VSTl9JTkZPICJkcy0lbGx1OiBSZWdpc3RlcmVkICVzIHNlcnZpY2UuXG4iLAogCQkgICAgICAgZHAtPmlkLCBjcC0+c2VydmljZV9pZCk7CiAJCWNwLT5zdGF0ZSA9IENBUF9TVEFURV9SRUdJU1RFUkVEOwogCX0gZWxzZSBpZiAocGt0LT50eXBlID09IERTX1JFR19OQUNLKSB7CkBAIC05MjQsOCArOTI0LDggQEAKIAkJc3RydWN0IGRzX2NhcF9zdGF0ZSAqY3AgPSBmaW5kX2NhcChkcCwgbnAtPmhhbmRsZSk7CiAKIAkJaWYgKCFjcCkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJkcy0lbHU6IFJFRyBOQUNLIGZvciAiCi0JCQkgICAgICAgInVua25vd24gaGFuZGxlICVseFxuIiwKKwkJCXByaW50ayhLRVJOX0VSUiAiZHMtJWxsdTogUkVHIE5BQ0sgZm9yICIKKwkJCSAgICAgICAidW5rbm93biBoYW5kbGUgJWxseFxuIiwKIAkJCSAgICAgICBkcC0+aWQsIG5wLT5oYW5kbGUpOwogCQkJcmV0dXJuIDA7CiAJCX0KQEAgLTk4Miw4ICs5ODIsOCBAQAogCQlpbnQgcmVxX2xlbiA9IHFwLT5yZXFfbGVuOwogCiAJCWlmICghY3ApIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiZHMtJWx1OiBEYXRhIGZvciB1bmtub3duICIKLQkJCSAgICAgICAiaGFuZGxlICVsdVxuIiwKKwkJCXByaW50ayhLRVJOX0VSUiAiZHMtJWxsdTogRGF0YSBmb3IgdW5rbm93biAiCisJCQkgICAgICAgImhhbmRsZSAlbGx1XG4iLAogCQkJICAgICAgIGRwLT5pZCwgZHBrdC0+aGFuZGxlKTsKIAogCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmRzX2xvY2ssIGZsYWdzKTsKQEAgLTEwODUsNyArMTA4NSw3IEBACiAJfQogCiAJaWYgKGV2ZW50ICE9IExEQ19FVkVOVF9EQVRBX1JFQURZKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgImRzLSVsdTogVW5leHBlY3RlZCBMREMgZXZlbnQgJWRcbiIsCisJCXByaW50ayhLRVJOX1dBUk5JTkcgImRzLSVsbHU6IFVuZXhwZWN0ZWQgTERDIGV2ZW50ICVkXG4iLAogCQkgICAgICAgZHAtPmlkLCBldmVudCk7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRzX2xvY2ssIGZsYWdzKTsKIAkJcmV0dXJuOwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvZW50cnkuUyBiL2FyY2gvc3BhcmMva2VybmVsL2VudHJ5LlMKaW5kZXggZmFmOWNjZC4uZjQxZWNjNSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvZW50cnkuUworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9lbnRyeS5TCkBAIC0xMDg4LDggKzEwODgsOCBAQAogCSBsZAlbJXNwICsgU1RBQ0tGUkFNRV9TWiArIFBUX0kwXSwgJW8wCiAKIAkuYWxpZ24JNAotCS5nbG9ibAlzeXNfcGlwZQotc3lzX3BpcGU6CisJLmdsb2JsCXN5c19zcGFyY19waXBlCitzeXNfc3BhcmNfcGlwZToKIAltb3YJJW83LCAlbDUKIAlhZGQJJXNwLCBTVEFDS0ZSQU1FX1NaLCAlbzAJCSEgcHRfcmVncyAqcmVncyBhcmcKIAljYWxsCXNwYXJjX3BpcGUKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL2lkcHJvbS5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvaWRwcm9tLmMKaW5kZXggYzE2MTM1ZS4uNTc5MjJmNiAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvaWRwcm9tLmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvaWRwcm9tLmMKQEAgLTgsMTEgKzgsMTQgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgPGFzbS9vcGxpYi5oPgogI2luY2x1ZGUgPGFzbS9pZHByb20uaD4KIAogc3RydWN0IGlkcHJvbSAqaWRwcm9tOworRVhQT1JUX1NZTUJPTChpZHByb20pOworCiBzdGF0aWMgc3RydWN0IGlkcHJvbSBpZHByb21fYnVmZmVyOwogCiAjaWZkZWYgQ09ORklHX1NQQVJDMzIKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL2lvbW11LmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9pb21tdS5jCmluZGV4IDFjYzE5OTUuLmQ4OTAwZTEgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL2lvbW11LmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvaW9tbXUuYwpAQCAtNDM0LDcgKzQzNCw3IEBACiAJCXZhbCA9IGlvbW11X3JlYWQobWF0Y2hyZWcpOwogCQlpZiAodW5saWtlbHkodmFsKSkgewogCQkJcHJpbnRrKEtFUk5fV0FSTklORyAic3RyYnVmX2ZsdXNoOiBjdHggZmx1c2ggIgotCQkJICAgICAgICJ0aW1lb3V0IG1hdGNocmVnWyVseF0gY3R4WyVseF1cbiIsCisJCQkgICAgICAgInRpbWVvdXQgbWF0Y2hyZWdbJWxseF0gY3R4WyVseF1cbiIsCiAJCQkgICAgICAgdmFsLCBjdHgpOwogCQkJZ290byBkb19wYWdlX2ZsdXNoOwogCQl9CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9pb3BvcnQuYyBiL2FyY2gvc3BhcmMva2VybmVsL2lvcG9ydC5jCmluZGV4IDdjZTE0ZjAuLjg3ZWEwZDAgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL2lvcG9ydC5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL2lvcG9ydC5jCkBAIC0xMjAsNiArMTIwLDcgQEAKIAlzcHJpbnRmKG5hbWUsICJwaHlzXyUwOHgiLCAodTMyKW9mZnNldCk7CiAJcmV0dXJuIF9zcGFyY19hbGxvY19pbygwLCBvZmZzZXQsIHNpemUsIG5hbWUpOwogfQorRVhQT1JUX1NZTUJPTChpb3JlbWFwKTsKIAogLyoKICAqIENvbWxpbWVudGFyeSB0byBpb3JlbWFwKCkuCkBAIC0xNDEsNiArMTQyLDcgQEAKIAkJa2ZyZWUocmVzKTsKIAl9CiB9CitFWFBPUlRfU1lNQk9MKGlvdW5tYXApOwogCiB2b2lkIF9faW9tZW0gKm9mX2lvcmVtYXAoc3RydWN0IHJlc291cmNlICpyZXMsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LAogCQkJIHVuc2lnbmVkIGxvbmcgc2l6ZSwgY2hhciAqbmFtZSkKQEAgLTIzNyw2ICsyMzksNyBAQAogewogCXByaW50aygic2J1c19zZXRfc2J1czY0OiB1bnN1cHBvcnRlZFxuIik7CiB9CitFWFBPUlRfU1lNQk9MKHNidXNfc2V0X3NidXM2NCk7CiAKIC8qCiAgKiBBbGxvY2F0ZSBhIGNodW5rIG9mIG1lbW9yeSBzdWl0YWJsZSBmb3IgRE1BLgpAQCAtNDM2LDYgKzQzOSw3IEBACiAJKnBiYSA9IHZpcnRfdG9fcGh5cyh2YSk7IC8qIGVxdWFscyB2aXJ0X3RvX2J1cyAoUi5JLlAuKSBmb3IgdXMuICovCiAJcmV0dXJuICh2b2lkICopIHJlcy0+c3RhcnQ7CiB9CitFWFBPUlRfU1lNQk9MKHBjaV9hbGxvY19jb25zaXN0ZW50KTsKIAogLyogRnJlZSBhbmQgdW5tYXAgYSBjb25zaXN0ZW50IERNQSBidWZmZXIuCiAgKiBjcHVfYWRkciBpcyB3aGF0IHdhcyByZXR1cm5lZCBmcm9tIHBjaV9hbGxvY19jb25zaXN0ZW50LApAQCAtNDc3LDYgKzQ4MSw3IEBACiAKIAlmcmVlX3BhZ2VzKHBncCwgZ2V0X29yZGVyKG4pKTsKIH0KK0VYUE9SVF9TWU1CT0wocGNpX2ZyZWVfY29uc2lzdGVudCk7CiAKIC8qIE1hcCBhIHNpbmdsZSBidWZmZXIgb2YgdGhlIGluZGljYXRlZCBzaXplIGZvciBETUEgaW4gc3RyZWFtaW5nIG1vZGUuCiAgKiBUaGUgMzItYml0IGJ1cyBhZGRyZXNzIHRvIHVzZSBpcyByZXR1cm5lZC4KQEAgLTQ5MSw2ICs0OTYsNyBAQAogCS8qIElJZXAgaXMgd3JpdGUtdGhyb3VnaCwgbm90IGZsdXNoaW5nLiAqLwogCXJldHVybiB2aXJ0X3RvX3BoeXMocHRyKTsKIH0KK0VYUE9SVF9TWU1CT0wocGNpX21hcF9zaW5nbGUpOwogCiAvKiBVbm1hcCBhIHNpbmdsZSBzdHJlYW1pbmcgbW9kZSBETUEgdHJhbnNsYXRpb24uICBUaGUgZG1hX2FkZHIgYW5kIHNpemUKICAqIG11c3QgbWF0Y2ggd2hhdCB3YXMgcHJvdmlkZWQgZm9yIGluIGEgcHJldmlvdXMgcGNpX21hcF9zaW5nbGUgY2FsbC4gIEFsbApAQCAtNTA4LDYgKzUxNCw3IEBACiAJCSAgICAoc2l6ZSArIFBBR0VfU0laRS0xKSAmIFBBR0VfTUFTSyk7CiAJfQogfQorRVhQT1JUX1NZTUJPTChwY2lfdW5tYXBfc2luZ2xlKTsKIAogLyoKICAqIFNhbWUgYXMgcGNpX21hcF9zaW5nbGUsIGJ1dCB3aXRoIHBhZ2VzLgpAQCAtNTE5LDYgKzUyNiw3IEBACiAJLyogSUllcCBpcyB3cml0ZS10aHJvdWdoLCBub3QgZmx1c2hpbmcuICovCiAJcmV0dXJuIHBhZ2VfdG9fcGh5cyhwYWdlKSArIG9mZnNldDsKIH0KK0VYUE9SVF9TWU1CT0wocGNpX21hcF9wYWdlKTsKIAogdm9pZCBwY2lfdW5tYXBfcGFnZShzdHJ1Y3QgcGNpX2RldiAqaHdkZXYsCiAJCQlkbWFfYWRkcl90IGRtYV9hZGRyZXNzLCBzaXplX3Qgc2l6ZSwgaW50IGRpcmVjdGlvbikKQEAgLTUyNiw2ICs1MzQsNyBAQAogCUJVR19PTihkaXJlY3Rpb24gPT0gUENJX0RNQV9OT05FKTsKIAkvKiBtbXVfaW52YWxfZG1hX2FyZWEgWFhYICovCiB9CitFWFBPUlRfU1lNQk9MKHBjaV91bm1hcF9wYWdlKTsKIAogLyogTWFwIGEgc2V0IG9mIGJ1ZmZlcnMgZGVzY3JpYmVkIGJ5IHNjYXR0ZXJsaXN0IGluIHN0cmVhbWluZwogICogbW9kZSBmb3IgRE1BLiAgVGhpcyBpcyB0aGUgc2NhdGhlci1nYXRoZXIgdmVyc2lvbiBvZiB0aGUKQEAgLTU1Nyw2ICs1NjYsNyBAQAogCX0KIAlyZXR1cm4gbmVudHM7CiB9CitFWFBPUlRfU1lNQk9MKHBjaV9tYXBfc2cpOwogCiAvKiBVbm1hcCBhIHNldCBvZiBzdHJlYW1pbmcgbW9kZSBETUEgdHJhbnNsYXRpb25zLgogICogQWdhaW4sIGNwdSByZWFkIHJ1bGVzIGNvbmNlcm5pbmcgY2FsbHMgaGVyZSBhcmUgdGhlIHNhbWUgYXMgZm9yCkBAIC01NzgsNiArNTg4LDcgQEAKIAkJfQogCX0KIH0KK0VYUE9SVF9TWU1CT0wocGNpX3VubWFwX3NnKTsKIAogLyogTWFrZSBwaHlzaWNhbCBtZW1vcnkgY29uc2lzdGVudCBmb3IgYSBzaW5nbGUKICAqIHN0cmVhbWluZyBtb2RlIERNQSB0cmFuc2xhdGlvbiBiZWZvcmUgb3IgYWZ0ZXIgYSB0cmFuc2Zlci4KQEAgLTU5Nyw2ICs2MDgsNyBAQAogCQkgICAgKHNpemUgKyBQQUdFX1NJWkUtMSkgJiBQQUdFX01BU0spOwogCX0KIH0KK0VYUE9SVF9TWU1CT0wocGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KTsKIAogdm9pZCBwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2Uoc3RydWN0IHBjaV9kZXYgKmh3ZGV2LCBkbWFfYWRkcl90IGJhLCBzaXplX3Qgc2l6ZSwgaW50IGRpcmVjdGlvbikKIHsKQEAgLTYwNiw2ICs2MTgsNyBAQAogCQkgICAgKHNpemUgKyBQQUdFX1NJWkUtMSkgJiBQQUdFX01BU0spOwogCX0KIH0KK0VYUE9SVF9TWU1CT0wocGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKTsKIAogLyogTWFrZSBwaHlzaWNhbCBtZW1vcnkgY29uc2lzdGVudCBmb3IgYSBzZXQgb2Ygc3RyZWFtaW5nCiAgKiBtb2RlIERNQSB0cmFuc2xhdGlvbnMgYWZ0ZXIgYSB0cmFuc2Zlci4KQEAgLTYyOCw2ICs2NDEsNyBAQAogCQl9CiAJfQogfQorRVhQT1JUX1NZTUJPTChwY2lfZG1hX3N5bmNfc2dfZm9yX2NwdSk7CiAKIHZvaWQgcGNpX2RtYV9zeW5jX3NnX2Zvcl9kZXZpY2Uoc3RydWN0IHBjaV9kZXYgKmh3ZGV2LCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnbCwgaW50IG5lbnRzLCBpbnQgZGlyZWN0aW9uKQogewpAQCAtNjQ0LDYgKzY1OCw3IEBACiAJCX0KIAl9CiB9CitFWFBPUlRfU1lNQk9MKHBjaV9kbWFfc3luY19zZ19mb3JfZGV2aWNlKTsKICNlbmRpZiAvKiBDT05GSUdfUENJICovCiAKICNpZmRlZiBDT05GSUdfUFJPQ19GUwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvaXJxXzMyLmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9pcnFfMzIuYwppbmRleCAxZWZmOTQyLi40NGRkNWVlIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC9pcnFfMzIuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9pcnFfMzIuYwpAQCAtMjk0LDYgKzI5NCw3IEBACiAJd2hpbGUgKHNwYXJjX2lycVtjcHVfaXJxXS5mbGFncyAmIFNQQVJDX0lSUV9JTlBST0dSRVNTKQogCQljcHVfcmVsYXgoKTsKIH0KK0VYUE9SVF9TWU1CT0woc3luY2hyb25pemVfaXJxKTsKICNlbmRpZiAvKiBTTVAgKi8KIAogdm9pZCB1bmV4cGVjdGVkX2lycShpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICogcmVncykKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL2twcm9iZXMuYyBiL2FyY2gvc3BhcmMva2VybmVsL2twcm9iZXMuYwppbmRleCAyMDFhNmU1Li4zYmM2NTI3IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC9rcHJvYmVzLmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwva3Byb2Jlcy5jCkBAIC01MTcsNyArNTE3LDcgQEAKIAkvKgogCSAqIEl0IGlzIHBvc3NpYmxlIHRvIGhhdmUgbXVsdGlwbGUgaW5zdGFuY2VzIGFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuCiAJICogdGFzayBlaXRoZXIgYmVjYXVzZSBhbiBtdWx0aXBsZSBmdW5jdGlvbnMgaW4gdGhlIGNhbGwgcGF0aAotCSAqIGhhdmUgYSByZXR1cm4gcHJvYmUgaW5zdGFsbGVkIG9uIHRoZW0sIGFuZC9vciBtb3JlIHRoZW4gb25lIHJldHVybgorCSAqIGhhdmUgYSByZXR1cm4gcHJvYmUgaW5zdGFsbGVkIG9uIHRoZW0sIGFuZC9vciBtb3JlIHRoYW4gb25lIHJldHVybgogCSAqIHJldHVybiBwcm9iZSB3YXMgcmVnaXN0ZXJlZCBmb3IgYSB0YXJnZXQgZnVuY3Rpb24uCiAJICoKIAkgKiBXZSBjYW4gaGFuZGxlIHRoaXMgYmVjYXVzZToKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL2xkYy5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvbGRjLmMKaW5kZXggZDY4OTgyMzMuLjZjZTVkMjUgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL2xkYy5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL2xkYy5jCkBAIC02MjUsMjIgKzYyNSwyMyBAQAogc3RhdGljIGludCBwcm9jZXNzX3Zlcl9uYWNrKHN0cnVjdCBsZGNfY2hhbm5lbCAqbHAsIHN0cnVjdCBsZGNfdmVyc2lvbiAqdnApCiB7CiAJc3RydWN0IGxkY192ZXJzaW9uICp2YXA7CisJc3RydWN0IGxkY19wYWNrZXQgKnA7CisJdW5zaWduZWQgbG9uZyBuZXdfdGFpbDsKIAotCWlmICgodnAtPm1ham9yID09IDAgJiYgdnAtPm1pbm9yID09IDApIHx8Ci0JICAgICEodmFwID0gZmluZF9ieV9tYWpvcih2cC0+bWFqb3IpKSkgeworCWlmICh2cC0+bWFqb3IgPT0gMCAmJiB2cC0+bWlub3IgPT0gMCkKIAkJcmV0dXJuIGxkY19hYm9ydChscCk7Ci0JfSBlbHNlIHsKLQkJc3RydWN0IGxkY19wYWNrZXQgKnA7Ci0JCXVuc2lnbmVkIGxvbmcgbmV3X3RhaWw7CiAKLQkJcCA9IGhhbmRzaGFrZV9jb21wb3NlX2N0cmwobHAsIExEQ19JTkZPLCBMRENfVkVSUywKKwl2YXAgPSBmaW5kX2J5X21ham9yKHZwLT5tYWpvcik7CisJaWYgKCF2YXApCisJCXJldHVybiBsZGNfYWJvcnQobHApOworCisJcCA9IGhhbmRzaGFrZV9jb21wb3NlX2N0cmwobHAsIExEQ19JTkZPLCBMRENfVkVSUywKIAkJCQkJICAgdmFwLCBzaXplb2YoKnZhcCksCiAJCQkJCSAgICZuZXdfdGFpbCk7Ci0JCWlmIChwKQotCQkJcmV0dXJuIHNlbmRfdHhfcGFja2V0KGxwLCBwLCBuZXdfdGFpbCk7Ci0JCWVsc2UKLQkJCXJldHVybiBsZGNfYWJvcnQobHApOwotCX0KKwlpZiAoIXApCisJCXJldHVybiBsZGNfYWJvcnQobHApOworCisJcmV0dXJuIHNlbmRfdHhfcGFja2V0KGxwLCBwLCBuZXdfdGFpbCk7CiB9CiAKIHN0YXRpYyBpbnQgcHJvY2Vzc192ZXJzaW9uKHN0cnVjdCBsZGNfY2hhbm5lbCAqbHAsCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9tZGVzYy5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvbWRlc2MuYwppbmRleCAzYzUzOWE2Li4zZjc5ZjBjIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC9tZGVzYy5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL21kZXNjLmMKQEAgLTUzNiwyNCArNTM2LDI0IEBACiAKIAl2ID0gbWRlc2NfZ2V0X3Byb3BlcnR5KGhwLCBwbiwgImhvc3RpZCIsIE5VTEwpOwogCWlmICh2KQotCQlwcmludGsoIlBMQVRGT1JNOiBob3N0aWQgWyUwOGx4XVxuIiwgKnYpOworCQlwcmludGsoIlBMQVRGT1JNOiBob3N0aWQgWyUwOGxseF1cbiIsICp2KTsKIAl2ID0gbWRlc2NfZ2V0X3Byb3BlcnR5KGhwLCBwbiwgInNlcmlhbCMiLCBOVUxMKTsKIAlpZiAodikKLQkJcHJpbnRrKCJQTEFURk9STTogc2VyaWFsIyBbJTA4bHhdXG4iLCAqdik7CisJCXByaW50aygiUExBVEZPUk06IHNlcmlhbCMgWyUwOGxseF1cbiIsICp2KTsKIAl2ID0gbWRlc2NfZ2V0X3Byb3BlcnR5KGhwLCBwbiwgInN0aWNrLWZyZXF1ZW5jeSIsIE5VTEwpOwotCXByaW50aygiUExBVEZPUk06IHN0aWNrLWZyZXF1ZW5jeSBbJTA4bHhdXG4iLCAqdik7CisJcHJpbnRrKCJQTEFURk9STTogc3RpY2stZnJlcXVlbmN5IFslMDhsbHhdXG4iLCAqdik7CiAJdiA9IG1kZXNjX2dldF9wcm9wZXJ0eShocCwgcG4sICJtYWMtYWRkcmVzcyIsIE5VTEwpOwogCWlmICh2KQotCQlwcmludGsoIlBMQVRGT1JNOiBtYWMtYWRkcmVzcyBbJWx4XVxuIiwgKnYpOworCQlwcmludGsoIlBMQVRGT1JNOiBtYWMtYWRkcmVzcyBbJWxseF1cbiIsICp2KTsKIAl2ID0gbWRlc2NfZ2V0X3Byb3BlcnR5KGhwLCBwbiwgIndhdGNoZG9nLXJlc29sdXRpb24iLCBOVUxMKTsKIAlpZiAodikKLQkJcHJpbnRrKCJQTEFURk9STTogd2F0Y2hkb2ctcmVzb2x1dGlvbiBbJWx1IG1zXVxuIiwgKnYpOworCQlwcmludGsoIlBMQVRGT1JNOiB3YXRjaGRvZy1yZXNvbHV0aW9uIFslbGx1IG1zXVxuIiwgKnYpOwogCXYgPSBtZGVzY19nZXRfcHJvcGVydHkoaHAsIHBuLCAid2F0Y2hkb2ctbWF4LXRpbWVvdXQiLCBOVUxMKTsKIAlpZiAodikKLQkJcHJpbnRrKCJQTEFURk9STTogd2F0Y2hkb2ctbWF4LXRpbWVvdXQgWyVsdSBtc11cbiIsICp2KTsKKwkJcHJpbnRrKCJQTEFURk9STTogd2F0Y2hkb2ctbWF4LXRpbWVvdXQgWyVsbHUgbXNdXG4iLCAqdik7CiAJdiA9IG1kZXNjX2dldF9wcm9wZXJ0eShocCwgcG4sICJtYXgtY3B1cyIsIE5VTEwpOwogCWlmICh2KQotCQlwcmludGsoIlBMQVRGT1JNOiBtYXgtY3B1cyBbJWx1XVxuIiwgKnYpOworCQlwcmludGsoIlBMQVRGT1JNOiBtYXgtY3B1cyBbJWxsdV1cbiIsICp2KTsKIAogI2lmZGVmIENPTkZJR19TTVAKIAl7CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9vZl9kZXZpY2VfNjQuYyBiL2FyY2gvc3BhcmMva2VybmVsL29mX2RldmljZV82NC5jCmluZGV4IDQ4NzNmMjguLmI0YTEyYzkgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL29mX2RldmljZV82NC5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL29mX2RldmljZV82NC5jCkBAIC01NTQsNyArNTU0LDcgQEAKIAkJbWVtc2V0KHIsIDAsIHNpemVvZigqcikpOwogCiAJCWlmIChvZl9yZXNvdXJjZV92ZXJib3NlKQotCQkJcHJpbnRrKCIlcyByZWdbJWRdIC0+ICVseFxuIiwKKwkJCXByaW50aygiJXMgcmVnWyVkXSAtPiAlbGx4XG4iLAogCQkJICAgICAgIG9wLT5ub2RlLT5mdWxsX25hbWUsIGluZGV4LAogCQkJICAgICAgIHJlc3VsdCk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL3BjaS5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvcGNpLmMKaW5kZXggYmRiN2MwYS4uNDYzOGZiYSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvcGNpLmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvcGNpLmMKQEAgLTIyMyw3ICsyMjMsNyBAQAogCQkJY29udGludWU7CiAJCWkgPSBhZGRyc1swXSAmIDB4ZmY7CiAJCWlmIChvZnBjaV92ZXJib3NlKQotCQkJcHJpbnRrKCIgIHN0YXJ0OiAlbHgsIGVuZDogJWx4LCBpOiAleFxuIiwKKwkJCXByaW50aygiICBzdGFydDogJWxseCwgZW5kOiAlbGx4LCBpOiAleFxuIiwKIAkJCSAgICAgICBvcF9yZXMtPnN0YXJ0LCBvcF9yZXMtPmVuZCwgaSk7CiAKIAkJaWYgKFBDSV9CQVNFX0FERFJFU1NfMCA8PSBpICYmIGkgPD0gUENJX0JBU0VfQUREUkVTU181KSB7CkBAIC0xMDc3LDYgKzEwNzcsNyBAQAogCiAJcmV0dXJuIChkZXZpY2VfbWFzayAmIGRtYV9hZGRyX21hc2spID09IGRtYV9hZGRyX21hc2s7CiB9CitFWFBPUlRfU1lNQk9MKHBjaV9kbWFfc3VwcG9ydGVkKTsKIAogdm9pZCBwY2lfcmVzb3VyY2VfdG9fdXNlcihjb25zdCBzdHJ1Y3QgcGNpX2RldiAqcGRldiwgaW50IGJhciwKIAkJCSAgY29uc3Qgc3RydWN0IHJlc291cmNlICpycCwgcmVzb3VyY2Vfc2l6ZV90ICpzdGFydCwKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL3BjaV9jb21tb24uYyBiL2FyY2gvc3BhcmMva2VybmVsL3BjaV9jb21tb24uYwppbmRleCAyM2I4ODA4Li42NGU2ZWRmIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC9wY2lfY29tbW9uLmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvcGNpX2NvbW1vbi5jCkBAIC00NTcsNyArNDU3LDcgQEAKIAkJcHJvbV9oYWx0KCk7CiAJfQogCi0JcHJpbnRrKCIlczogUENJIElPWyVseF0gTUVNWyVseF1cbiIsCisJcHJpbnRrKCIlczogUENJIElPWyVsbHhdIE1FTVslbGx4XVxuIiwKIAkgICAgICAgcGJtLT5uYW1lLAogCSAgICAgICBwYm0tPmlvX3NwYWNlLnN0YXJ0LAogCSAgICAgICBwYm0tPm1lbV9zcGFjZS5zdGFydCk7CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9wY2lfbXNpLmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9wY2lfbXNpLmMKaW5kZXggNGVmMjgyZS4uZjFiZTM3YSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvcGNpX21zaS5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL3BjaV9tc2kuYwpAQCAtNDI2LDggKzQyNiw4IEBACiAJCSAgICAgICBwYm0tPm5hbWUsCiAJCSAgICAgICBwYm0tPm1zaV9maXJzdCwgcGJtLT5tc2lfbnVtLCBwYm0tPm1zaV9kYXRhX21hc2ssCiAJCSAgICAgICBwYm0tPm1zaXhfZGF0YV93aWR0aCk7Ci0JCXByaW50ayhLRVJOX0lORk8gIiVzOiBNU0kgYWRkcjMyWzB4JWx4OjB4JXhdICIKLQkJICAgICAgICJhZGRyNjRbMHglbHg6MHgleF1cbiIsCisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBNU0kgYWRkcjMyWzB4JWxseDoweCV4XSAiCisJCSAgICAgICAiYWRkcjY0WzB4JWxseDoweCV4XVxuIiwKIAkJICAgICAgIHBibS0+bmFtZSwKIAkJICAgICAgIHBibS0+bXNpMzJfc3RhcnQsIHBibS0+bXNpMzJfbGVuLAogCQkgICAgICAgcGJtLT5tc2k2NF9zdGFydCwgcGJtLT5tc2k2NF9sZW4pOwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvcGNpX3NjaGl6by5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvcGNpX3NjaGl6by5jCmluZGV4IDQ1ZDlkYmEuLjJiNWNkZGUgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL3BjaV9zY2hpem8uYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9wY2lfc2NoaXpvLmMKQEAgLTc5NCw3ICs3OTQsNyBAQAogCQkgICBwYm0tPmNvbnRyb2xsZXJfcmVncyArIFNDSElaT19TQUZBUklfRVJSTE9HKTsKIAogCWlmICghKGVycmxvZyAmIEJVU19FUlJPUl9VTk1BUCkpIHsKLQkJcHJpbnRrKCIlczogVW5leHBlY3RlZCBTYWZhcmkvSkJVUyBlcnJvciBpbnRlcnJ1cHQsIGVycmxvZ1slMDE2bHhdXG4iLAorCQlwcmludGsoIiVzOiBVbmV4cGVjdGVkIFNhZmFyaS9KQlVTIGVycm9yIGludGVycnVwdCwgZXJybG9nWyUwMTZsbHhdXG4iLAogCQkgICAgICAgcGJtLT5uYW1lLCBlcnJsb2cpOwogCiAJCXJldHVybiBJUlFfSEFORExFRDsKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL3BjaV9zdW40di5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvcGNpX3N1bjR2LmMKaW5kZXggMzRhMWZkZS4uMGVmMGFiMyAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvcGNpX3N1bjR2LmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvcGNpX3N1bjR2LmMKQEAgLTczLDcgKzczLDcgQEAKIAkJaWYgKHVubGlrZWx5KG51bSA8IDApKSB7CiAJCQlpZiAocHJpbnRrX3JhdGVsaW1pdCgpKQogCQkJCXByaW50aygiaW9tbXVfYmF0Y2hfZmx1c2g6IElPTU1VIG1hcCBvZiAiCi0JCQkJICAgICAgICJbJTA4bHg6JTA4bHg6JWx4OiVseDolbHhdIGZhaWxlZCB3aXRoICIKKwkJCQkgICAgICAgIlslMDhseDolMDhsbHg6JWx4OiVseDolbHhdIGZhaWxlZCB3aXRoICIKIAkJCQkgICAgICAgInN0YXR1cyAlbGRcbiIsCiAJCQkJICAgICAgIGRldmhhbmRsZSwgSFZfUENJX1RTQklEKDAsIGVudHJ5KSwKIAkJCQkgICAgICAgbnBhZ2VzLCBwcm90LCBfX3BhKHBnbGlzdCksIG51bSk7CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9wY2ljLmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9wY2ljLmMKaW5kZXggNzVlZDk4Yi4uODVlNzAzNyAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvcGNpYy5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL3BjaWMuYwpAQCAtOTU2LDYgKzk1Niw3IEBACiAJCS8qIGFkZHIgKz0gMTsgKi8KIAl9CiB9CitFWFBPUlRfU1lNQk9MKG91dHNiKTsKIAogdm9pZCBvdXRzdyh1bnNpZ25lZCBsb25nIGFkZHIsIGNvbnN0IHZvaWQgKnNyYywgdW5zaWduZWQgbG9uZyBjb3VudCkKIHsKQEAgLTk2Niw2ICs5NjcsNyBAQAogCQkvKiBhZGRyICs9IDI7ICovCiAJfQogfQorRVhQT1JUX1NZTUJPTChvdXRzdyk7CiAKIHZvaWQgb3V0c2wodW5zaWduZWQgbG9uZyBhZGRyLCBjb25zdCB2b2lkICpzcmMsIHVuc2lnbmVkIGxvbmcgY291bnQpCiB7CkBAIC05NzYsNiArOTc4LDcgQEAKIAkJLyogYWRkciArPSA0OyAqLwogCX0KIH0KK0VYUE9SVF9TWU1CT0wob3V0c2wpOwogCiB2b2lkIGluc2IodW5zaWduZWQgbG9uZyBhZGRyLCB2b2lkICpkc3QsIHVuc2lnbmVkIGxvbmcgY291bnQpCiB7CkBAIC05ODYsNiArOTg5LDcgQEAKIAkJLyogYWRkciArPSAxOyAqLwogCX0KIH0KK0VYUE9SVF9TWU1CT0woaW5zYik7CiAKIHZvaWQgaW5zdyh1bnNpZ25lZCBsb25nIGFkZHIsIHZvaWQgKmRzdCwgdW5zaWduZWQgbG9uZyBjb3VudCkKIHsKQEAgLTk5Niw2ICsxMDAwLDcgQEAKIAkJLyogYWRkciArPSAyOyAqLwogCX0KIH0KK0VYUE9SVF9TWU1CT0woaW5zdyk7CiAKIHZvaWQgaW5zbCh1bnNpZ25lZCBsb25nIGFkZHIsIHZvaWQgKmRzdCwgdW5zaWduZWQgbG9uZyBjb3VudCkKIHsKQEAgLTEwMDksNSArMTAxNCw2IEBACiAJCS8qIGFkZHIgKz0gNDsgKi8KIAl9CiB9CitFWFBPUlRfU1lNQk9MKGluc2wpOwogCiBzdWJzeXNfaW5pdGNhbGwocGNpY19pbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL3Bvd2VyLmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9wb3dlci5jCmluZGV4IDA3NmNhZDcuLmFlODhmMDYgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL3Bvd2VyLmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvcG93ZXIuYwpAQCAtNDAsNyArNDAsNyBAQAogCiAJcG93ZXJfcmVnID0gb2ZfaW9yZW1hcChyZXMsIDAsIDB4NCwgInBvd2VyIik7CiAKLQlwcmludGsoS0VSTl9JTkZPICIlczogQ29udHJvbCByZWcgYXQgJWx4XG4iLAorCXByaW50ayhLRVJOX0lORk8gIiVzOiBDb250cm9sIHJlZyBhdCAlbGx4XG4iLAogCSAgICAgICBvcC0+bm9kZS0+bmFtZSwgcmVzLT5zdGFydCk7CiAKIAlpZiAoaGFzX2J1dHRvbl9pbnRlcnJ1cHQoaXJxLCBvcC0+bm9kZSkpIHsKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL3Byb2Nlc3NfMzIuYyBiL2FyY2gvc3BhcmMva2VybmVsL3Byb2Nlc3NfMzIuYwppbmRleCA1YThkOGNlLi5mNGJlZTM1IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC9wcm9jZXNzXzMyLmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvcHJvY2Vzc18zMi5jCkBAIC00NCw2ICs0NCw3IEBACiAgKiBTZXQgaW4gcG0gcGxhdGZvcm0gZHJpdmVycyAoYXBjLmMgYW5kIHBtYy5jKQogICovCiB2b2lkICgqcG1faWRsZSkodm9pZCk7CitFWFBPUlRfU1lNQk9MKHBtX2lkbGUpOwogCiAvKiAKICAqIFBvd2VyLW9mZiBoYW5kbGVyIGluc3RhbnRpYXRpb24gZm9yIHBtLmggY29tcGxpYW5jZQpAQCAtNjczLDYgKzY3NCw3IEBACiAJCQkgICAgICJnMSIsICJnMiIsICJnMyIsICJvMCIsICJvMSIsICJtZW1vcnkiLCAiY2MiKTsKIAlyZXR1cm4gcmV0dmFsOwogfQorRVhQT1JUX1NZTUJPTChrZXJuZWxfdGhyZWFkKTsKIAogdW5zaWduZWQgbG9uZyBnZXRfd2NoYW4oc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKQogewpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvcHJvY2Vzc182NC5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvcHJvY2Vzc182NC5jCmluZGV4IGQ1ZTJhY2UuLmNjOGI1NjAgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL3Byb2Nlc3NfNjQuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9wcm9jZXNzXzY0LmMKQEAgLTY3OCw2ICs2NzgsNyBAQAogCQkJICAgICAiZzEiLCAiZzIiLCAiZzMiLCAibzAiLCAibzEiLCAibWVtb3J5IiwgImNjIik7CiAJcmV0dXJuIHJldHZhbDsKIH0KK0VYUE9SVF9TWU1CT0woa2VybmVsX3RocmVhZCk7CiAKIHR5cGVkZWYgc3RydWN0IHsKIAl1bmlvbiB7CkBAIC03NDMsNiArNzQ0LDcgQEAKIAl9CiAJcmV0dXJuIDE7CiB9CitFWFBPUlRfU1lNQk9MKGR1bXBfZnB1KTsKIAogLyoKICAqIHNwYXJjX2V4ZWN2ZSgpIGV4ZWN1dGVzIGEgbmV3IHByb2dyYW0gYWZ0ZXIgdGhlIGFzbSBzdHViIGhhcyBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL3Byb21faXJxdHJhbnMuYyBiL2FyY2gvc3BhcmMva2VybmVsL3Byb21faXJxdHJhbnMuYwppbmRleCA5Njk1OGM0Li41NzAyYWQ0IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC9wcm9tX2lycXRyYW5zLmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvcHJvbV9pcnF0cmFucy5jCkBAIC0zNDYsNyArMzQ2LDcgQEAKIAkJCWJyZWFrOwogCX0KIAlpZiAobGltaXQgPD0gMCkgewotCQlwcmludGsoInRvbWF0aWxsb193c3luY19oYW5kbGVyOiBETUEgd29uJ3Qgc3luYyBbJWx4OiVseF1cbiIsCisJCXByaW50aygidG9tYXRpbGxvX3dzeW5jX2hhbmRsZXI6IERNQSB3b24ndCBzeW5jIFslbGx4OiVsbHhdXG4iLAogCQkgICAgICAgdmFsLCBtYXNrKTsKIAl9CiAKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL3BzeWNob19jb21tb24uYyBiL2FyY2gvc3BhcmMva2VybmVsL3BzeWNob19jb21tb24uYwppbmRleCA3OTA5OTY0Li44ZjE0Nzg0NzUgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL3BzeWNob19jb21tb24uYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9wc3ljaG9fY29tbW9uLmMKQEAgLTExLDE5ICsxMSwxOSBAQAogI2luY2x1ZGUgImlvbW11X2NvbW1vbi5oIgogI2luY2x1ZGUgInBzeWNob19jb21tb24uaCIKIAotI2RlZmluZSAgUFNZQ0hPX1NUUkJVRl9DVFJMX0RFTkFCCTB4MDAwMDAwMDAwMDAwMDAwMlVMCi0jZGVmaW5lICBQU1lDSE9fU1RDRVJSX1dSSVRFCQkweDAwMDAwMDAwMDAwMDAwMDJVTAotI2RlZmluZSAgUFNZQ0hPX1NUQ0VSUl9SRUFECQkweDAwMDAwMDAwMDAwMDAwMDFVTAotI2RlZmluZSAgUFNZQ0hPX1NUQ1RBR19QUE4JCTB4MGZmZmZmZmYwMDAwMDAwMFVMCi0jZGVmaW5lICBQU1lDSE9fU1RDVEFHX1ZQTgkJMHgwMDAwMDAwMGZmZmZlMDAwVUwKLSNkZWZpbmUgIFBTWUNIT19TVENUQUdfVkFMSUQJCTB4MDAwMDAwMDAwMDAwMDAwMlVMCi0jZGVmaW5lICBQU1lDSE9fU1RDVEFHX1dSSVRFCQkweDAwMDAwMDAwMDAwMDAwMDFVTAotI2RlZmluZSAgUFNZQ0hPX1NUQ0xJTkVfTElORFgJCTB4MDAwMDAwMDAwMWUwMDAwMFVMCi0jZGVmaW5lICBQU1lDSE9fU1RDTElORV9TUFRSCQkweDAwMDAwMDAwMDAxZjgwMDBVTAotI2RlZmluZSAgUFNZQ0hPX1NUQ0xJTkVfTEFERFIJCTB4MDAwMDAwMDAwMDAwN2YwMFVMCi0jZGVmaW5lICBQU1lDSE9fU1RDTElORV9FUFRSCQkweDAwMDAwMDAwMDAwMDAwZmNVTAotI2RlZmluZSAgUFNZQ0hPX1NUQ0xJTkVfVkFMSUQJCTB4MDAwMDAwMDAwMDAwMDAwMlVMCi0jZGVmaW5lICBQU1lDSE9fU1RDTElORV9GT0ZOCQkweDAwMDAwMDAwMDAwMDAwMDFVTAorI2RlZmluZSAgUFNZQ0hPX1NUUkJVRl9DVFJMX0RFTkFCCTB4MDAwMDAwMDAwMDAwMDAwMlVMTAorI2RlZmluZSAgUFNZQ0hPX1NUQ0VSUl9XUklURQkJMHgwMDAwMDAwMDAwMDAwMDAyVUxMCisjZGVmaW5lICBQU1lDSE9fU1RDRVJSX1JFQUQJCTB4MDAwMDAwMDAwMDAwMDAwMVVMTAorI2RlZmluZSAgUFNZQ0hPX1NUQ1RBR19QUE4JCTB4MGZmZmZmZmYwMDAwMDAwMFVMTAorI2RlZmluZSAgUFNZQ0hPX1NUQ1RBR19WUE4JCTB4MDAwMDAwMDBmZmZmZTAwMFVMTAorI2RlZmluZSAgUFNZQ0hPX1NUQ1RBR19WQUxJRAkJMHgwMDAwMDAwMDAwMDAwMDAyVUxMCisjZGVmaW5lICBQU1lDSE9fU1RDVEFHX1dSSVRFCQkweDAwMDAwMDAwMDAwMDAwMDFVTEwKKyNkZWZpbmUgIFBTWUNIT19TVENMSU5FX0xJTkRYCQkweDAwMDAwMDAwMDFlMDAwMDBVTEwKKyNkZWZpbmUgIFBTWUNIT19TVENMSU5FX1NQVFIJCTB4MDAwMDAwMDAwMDFmODAwMFVMTAorI2RlZmluZSAgUFNZQ0hPX1NUQ0xJTkVfTEFERFIJCTB4MDAwMDAwMDAwMDAwN2YwMFVMTAorI2RlZmluZSAgUFNZQ0hPX1NUQ0xJTkVfRVBUUgkJMHgwMDAwMDAwMDAwMDAwMGZjVUxMCisjZGVmaW5lICBQU1lDSE9fU1RDTElORV9WQUxJRAkJMHgwMDAwMDAwMDAwMDAwMDAyVUxMCisjZGVmaW5lICBQU1lDSE9fU1RDTElORV9GT0ZOCQkweDAwMDAwMDAwMDAwMDAwMDFVTEwKIAogc3RhdGljIERFRklORV9TUElOTE9DSyhzdGNfYnVmX2xvY2spOwogc3RhdGljIHVuc2lnbmVkIGxvbmcgc3RjX2Vycm9yX2J1ZlsxMjhdOwpAQCAtOTQsNyArOTQsNyBAQAogCQlpZiAoc2F3X2Vycm9yICE9IDApIHsKIAkJCXU2NCB0YWd2YWwgPSBzdGNfdGFnX2J1ZltpXTsKIAkJCXU2NCBsaW5ldmFsID0gc3RjX2xpbmVfYnVmW2ldOwotCQkJcHJpbnRrKEtFUk5fRVJSICIlczogU1RDX1RBRyglZClbUEEoJTAxNmx4KVZBKCUwOGx4KSIKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IFNUQ19UQUcoJWQpW1BBKCUwMTZsbHgpVkEoJTA4bGx4KSIKIAkJCSAgICAgICAiViglZClXKCVkKV1cbiIsCiAJCQkgICAgICAgcGJtLT5uYW1lLAogCQkJICAgICAgIGksCkBAIC0xMDIsOCArMTAyLDggQEAKIAkJCSAgICAgICAodGFndmFsICYgUFNZQ0hPX1NUQ1RBR19WUE4pLAogCQkJICAgICAgICgodGFndmFsICYgUFNZQ0hPX1NUQ1RBR19WQUxJRCkgPyAxIDogMCksCiAJCQkgICAgICAgKCh0YWd2YWwgJiBQU1lDSE9fU1RDVEFHX1dSSVRFKSA/IDEgOiAwKSk7Ci0JCQlwcmludGsoS0VSTl9FUlIgIiVzOiBTVENfTElORSglZClbTElEWCglbHgpU1AoJWx4KSIKLQkJCSAgICAgICAiTEFERFIoJWx4KUVQKCVseClWKCVkKUZPRk4oJWQpXVxuIiwKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IFNUQ19MSU5FKCVkKVtMSURYKCVsbHgpU1AoJWxseCkiCisJCQkgICAgICAgIkxBRERSKCVsbHgpRVAoJWxseClWKCVkKUZPRk4oJWQpXVxuIiwKIAkJCSAgICAgICBwYm0tPm5hbWUsCiAJCQkgICAgICAgaSwKIAkJCSAgICAgICAoKGxpbmV2YWwgJiBQU1lDSE9fU1RDTElORV9MSU5EWCkgPj4gMjFVTCksCkBAIC0xNDQsMTAgKzE0NCwxMCBAQAogI2RlZmluZSAgUFNZQ0hPX0lPTU1VX1RBR19XUklURQkgKDB4MVVMIDw8IDIxVUwpCiAjZGVmaW5lICBQU1lDSE9fSU9NTVVfVEFHX1NUUkVBTSAoMHgxVUwgPDwgMjBVTCkKICNkZWZpbmUgIFBTWUNIT19JT01NVV9UQUdfU0laRQkgKDB4MVVMIDw8IDE5VUwpCi0jZGVmaW5lICBQU1lDSE9fSU9NTVVfVEFHX1ZQQUdFCSAweDdmZmZmVUwKKyNkZWZpbmUgIFBTWUNIT19JT01NVV9UQUdfVlBBR0UJIDB4N2ZmZmZVTEwKICNkZWZpbmUgIFBTWUNIT19JT01NVV9EQVRBX1ZBTElEICgxVUwgPDwgMzBVTCkKICNkZWZpbmUgIFBTWUNIT19JT01NVV9EQVRBX0NBQ0hFICgxVUwgPDwgMjhVTCkKLSNkZWZpbmUgIFBTWUNIT19JT01NVV9EQVRBX1BQQUdFIDB4ZmZmZmZmZlVMCisjZGVmaW5lICBQU1lDSE9fSU9NTVVfREFUQV9QUEFHRSAweGZmZmZmZmZVTEwKIAogc3RhdGljIHZvaWQgcHN5Y2hvX2R1bXBfaW9tbXVfdGFnc19hbmRfZGF0YShzdHJ1Y3QgcGNpX3BibV9pbmZvICpwYm0sCiAJCQkJCSAgICB1NjQgKnRhZywgdTY0ICpkYXRhKQpAQCAtMTc5LDE4ICsxNzksMTggQEAKIAkJfQogCiAJCXByaW50ayhLRVJOX0VSUiAiJXM6IElPTU1VIFRBRyglZClbZXJyb3IoJXMpIHdyKCVkKSAiCi0JCSAgICAgICAic3RyKCVkKSBzeiglZEspIHZwZyglMDhseCldXG4iLAorCQkgICAgICAgInN0ciglZCkgc3ooJWRLKSB2cGcoJTA4bGx4KV1cbiIsCiAJCSAgICAgICBwYm0tPm5hbWUsIGksIHR5cGVfc3RyLAogCQkgICAgICAgKCh0YWdfdmFsICYgUFNZQ0hPX0lPTU1VX1RBR19XUklURSkgPyAxIDogMCksCiAJCSAgICAgICAoKHRhZ192YWwgJiBQU1lDSE9fSU9NTVVfVEFHX1NUUkVBTSkgPyAxIDogMCksCiAJCSAgICAgICAoKHRhZ192YWwgJiBQU1lDSE9fSU9NTVVfVEFHX1NJWkUpID8gNjQgOiA4KSwKIAkJICAgICAgICh0YWdfdmFsICYgUFNZQ0hPX0lPTU1VX1RBR19WUEFHRSkgPDwgSU9NTVVfUEFHRV9TSElGVCk7CiAJCXByaW50ayhLRVJOX0VSUiAiJXM6IElPTU1VIERBVEEoJWQpW3ZhbGlkKCVkKSBjYWNoZSglZCkgIgotCQkgICAgICAgInBwZyglMDE2bHgpXVxuIiwKKwkJICAgICAgICJwcGcoJTAxNmxseCldXG4iLAogCQkgICAgICAgcGJtLT5uYW1lLCBpLAogCQkgICAgICAgKChkYXRhX3ZhbCAmIFBTWUNIT19JT01NVV9EQVRBX1ZBTElEKSA/IDEgOiAwKSwKIAkJICAgICAgICgoZGF0YV92YWwgJiBQU1lDSE9fSU9NTVVfREFUQV9DQUNIRSkgPyAxIDogMCksCi0JCSAgICAgICAoZGF0YV92YWwgJiBQU1lDSE9fSU9NTVVfREFUQV9QUEFHRSk8PElPTU1VX1BBR0VfU0hJRlQpOworCQkgICAgICAgKGRhdGFfdmFsICYgUFNZQ0hPX0lPTU1VX0RBVEFfUFBBR0UpIDw8IElPTU1VX1BBR0VfU0hJRlQpOwogCX0KIH0KIApAQCAtMjg1LDIwICsyODUsMjAgQEAKIAlyZXR1cm4gcmV0OwogfQogCi0jZGVmaW5lICBQU1lDSE9fUENJQUZTUl9QTUEJMHg4MDAwMDAwMDAwMDAwMDAwVUwKLSNkZWZpbmUgIFBTWUNIT19QQ0lBRlNSX1BUQQkweDQwMDAwMDAwMDAwMDAwMDBVTAotI2RlZmluZSAgUFNZQ0hPX1BDSUFGU1JfUFJUUlkJMHgyMDAwMDAwMDAwMDAwMDAwVUwKLSNkZWZpbmUgIFBTWUNIT19QQ0lBRlNSX1BQRVJSCTB4MTAwMDAwMDAwMDAwMDAwMFVMCi0jZGVmaW5lICBQU1lDSE9fUENJQUZTUl9TTUEJMHgwODAwMDAwMDAwMDAwMDAwVUwKLSNkZWZpbmUgIFBTWUNIT19QQ0lBRlNSX1NUQQkweDA0MDAwMDAwMDAwMDAwMDBVTAotI2RlZmluZSAgUFNZQ0hPX1BDSUFGU1JfU1JUUlkJMHgwMjAwMDAwMDAwMDAwMDAwVUwKLSNkZWZpbmUgIFBTWUNIT19QQ0lBRlNSX1NQRVJSCTB4MDEwMDAwMDAwMDAwMDAwMFVMCi0jZGVmaW5lICBQU1lDSE9fUENJQUZTUl9SRVNWMQkweDAwZmYwMDAwMDAwMDAwMDBVTAotI2RlZmluZSAgUFNZQ0hPX1BDSUFGU1JfQk1TSwkweDAwMDBmZmZmMDAwMDAwMDBVTAotI2RlZmluZSAgUFNZQ0hPX1BDSUFGU1JfQkxLCTB4MDAwMDAwMDA4MDAwMDAwMFVMCi0jZGVmaW5lICBQU1lDSE9fUENJQUZTUl9SRVNWMgkweDAwMDAwMDAwNDAwMDAwMDBVTAotI2RlZmluZSAgUFNZQ0hPX1BDSUFGU1JfTUlECTB4MDAwMDAwMDAzZTAwMDAwMFVMCi0jZGVmaW5lICBQU1lDSE9fUENJQUZTUl9SRVNWMwkweDAwMDAwMDAwMDFmZmZmZmZVTAorI2RlZmluZSAgUFNZQ0hPX1BDSUFGU1JfUE1BCTB4ODAwMDAwMDAwMDAwMDAwMFVMTAorI2RlZmluZSAgUFNZQ0hPX1BDSUFGU1JfUFRBCTB4NDAwMDAwMDAwMDAwMDAwMFVMTAorI2RlZmluZSAgUFNZQ0hPX1BDSUFGU1JfUFJUUlkJMHgyMDAwMDAwMDAwMDAwMDAwVUxMCisjZGVmaW5lICBQU1lDSE9fUENJQUZTUl9QUEVSUgkweDEwMDAwMDAwMDAwMDAwMDBVTEwKKyNkZWZpbmUgIFBTWUNIT19QQ0lBRlNSX1NNQQkweDA4MDAwMDAwMDAwMDAwMDBVTEwKKyNkZWZpbmUgIFBTWUNIT19QQ0lBRlNSX1NUQQkweDA0MDAwMDAwMDAwMDAwMDBVTEwKKyNkZWZpbmUgIFBTWUNIT19QQ0lBRlNSX1NSVFJZCTB4MDIwMDAwMDAwMDAwMDAwMFVMTAorI2RlZmluZSAgUFNZQ0hPX1BDSUFGU1JfU1BFUlIJMHgwMTAwMDAwMDAwMDAwMDAwVUxMCisjZGVmaW5lICBQU1lDSE9fUENJQUZTUl9SRVNWMQkweDAwZmYwMDAwMDAwMDAwMDBVTEwKKyNkZWZpbmUgIFBTWUNIT19QQ0lBRlNSX0JNU0sJMHgwMDAwZmZmZjAwMDAwMDAwVUxMCisjZGVmaW5lICBQU1lDSE9fUENJQUZTUl9CTEsJMHgwMDAwMDAwMDgwMDAwMDAwVUxMCisjZGVmaW5lICBQU1lDSE9fUENJQUZTUl9SRVNWMgkweDAwMDAwMDAwNDAwMDAwMDBVTEwKKyNkZWZpbmUgIFBTWUNIT19QQ0lBRlNSX01JRAkweDAwMDAwMDAwM2UwMDAwMDBVTEwKKyNkZWZpbmUgIFBTWUNIT19QQ0lBRlNSX1JFU1YzCTB4MDAwMDAwMDAwMWZmZmZmZlVMTAogCiBpcnFyZXR1cm5fdCBwc3ljaG9fcGNpZXJyX2ludHIoaW50IGlycSwgdm9pZCAqZGV2X2lkKQogewpAQCAtMzI2LDEyICszMjYsMTIgQEAKIAkJICAgIkV4Y2Vzc2l2ZSBSZXRyaWVzIiA6CiAJCSAgICgoZXJyb3JfYml0cyAmIFBTWUNIT19QQ0lBRlNSX1BQRVJSKSA/CiAJCSAgICAiUGFyaXR5IEVycm9yIiA6ICI/Pz8iKSkpKSkpOwotCXByaW50ayhLRVJOX0VSUiAiJXM6IGJ5dGVtYXNrWyUwNGx4XSBVUEFfTUlEWyUwMmx4XSB3YXNfYmxvY2soJWQpXG4iLAorCXByaW50ayhLRVJOX0VSUiAiJXM6IGJ5dGVtYXNrWyUwNGxseF0gVVBBX01JRFslMDJsbHhdIHdhc19ibG9jayglZClcbiIsCiAJICAgICAgIHBibS0+bmFtZSwKIAkgICAgICAgKGFmc3IgJiBQU1lDSE9fUENJQUZTUl9CTVNLKSA+PiAzMlVMLAogCSAgICAgICAoYWZzciAmIFBTWUNIT19QQ0lBRlNSX01JRCkgPj4gMjVVTCwKIAkgICAgICAgKGFmc3IgJiBQU1lDSE9fUENJQUZTUl9CTEspID8gMSA6IDApOwotCXByaW50ayhLRVJOX0VSUiAiJXM6IFBDSSBBRkFSIFslMDE2bHhdXG4iLCBwYm0tPm5hbWUsIGFmYXIpOworCXByaW50ayhLRVJOX0VSUiAiJXM6IFBDSSBBRkFSIFslMDE2bGx4XVxuIiwgcGJtLT5uYW1lLCBhZmFyKTsKIAlwcmludGsoS0VSTl9FUlIgIiVzOiBQQ0kgU2Vjb25kYXJ5IGVycm9ycyBbIiwgcGJtLT5uYW1lKTsKIAlyZXBvcnRlZCA9IDA7CiAJaWYgKGFmc3IgJiBQU1lDSE9fUENJQUZTUl9TTUEpIHsKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL3NidXMuYyBiL2FyY2gvc3BhcmMva2VybmVsL3NidXMuYwppbmRleCAyZWFkMzEwLi40MDZlMDg3IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC9zYnVzLmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvc2J1cy5jCkBAIC0xMTcsNiArMTE3LDcgQEAKIAkJdmFsIHw9ICgxVUwgPDwgNFVMKTsKIAl1cGFfd3JpdGVxKHZhbCwgY2ZnX3JlZyk7CiB9CitFWFBPUlRfU1lNQk9MKHNidXNfc2V0X3NidXM2NCk7CiAKIC8qIElOTyBudW1iZXIgdG8gSU1BUCByZWdpc3RlciBvZmZzZXQgZm9yIFNZU0lPIGV4dGVybmFsIElSUSdzLgogICogVGhpcyBzaG91bGQgY29uZm9ybSB0byBib3RoIFN1bmZpcmUvV2lsZGZpcmUgc2VydmVyIGFuZCBGdXNpb24KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL3NldHVwXzMyLmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9zZXR1cF8zMi5jCmluZGV4IGM5NmM2NWQuLjk5OGNhZGIgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL3NldHVwXzMyLmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvc2V0dXBfMzIuYwpAQCAtMTk5LDcgKzE5OSw5IEBACiBleHRlcm4gaW50IHJvb3RfbW91bnRmbGFnczsKIAogY2hhciByZWJvb3RfY29tbWFuZFtDT01NQU5EX0xJTkVfU0laRV07CisKIGVudW0gc3BhcmNfY3B1IHNwYXJjX2NwdV9tb2RlbDsKK0VYUE9SVF9TWU1CT0woc3BhcmNfY3B1X21vZGVsKTsKIAogc3RydWN0IHR0X2VudHJ5ICpzcGFyY190dGFibGU7CiAKQEAgLTM5MSw2ICszOTMsNyBAQAogCiAJcHJvbV9jbWRsaW5lKCk7CiB9CitFWFBPUlRfU1lNQk9MKHN1bl9kb19icmVhayk7CiAKIGludCBzdG9wX2FfZW5hYmxlZCA9IDE7CiAKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL3NldHVwXzY0LmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9zZXR1cF82NC5jCmluZGV4IDU1NWRiNzQuLjQ5ZDA2MWYgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL3NldHVwXzY0LmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvc2V0dXBfNjQuYwpAQCAtNTgsNiArNTgsNyBAQAogICogb3BlcmF0aW9ucyBpbiBhc20vbnM4NzMwMy5oCiAgKi8KIERFRklORV9TUElOTE9DSyhuczg3MzAzX2xvY2spOworRVhQT1JUX1NZTUJPTChuczg3MzAzX2xvY2spOwogCiBzdHJ1Y3Qgc2NyZWVuX2luZm8gc2NyZWVuX2luZm8gPSB7CiAJMCwgMCwJCQkvKiBvcmlnLXgsIG9yaWcteSAqLwpAQCAtNDI1LDUgKzQyNiw3IEBACiAKIAlwcm9tX2NtZGxpbmUoKTsKIH0KK0VYUE9SVF9TWU1CT0woc3VuX2RvX2JyZWFrKTsKIAogaW50IHN0b3BfYV9lbmFibGVkID0gMTsKK0VYUE9SVF9TWU1CT0woc3RvcF9hX2VuYWJsZWQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvc21wXzY0LmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9zbXBfNjQuYwppbmRleCA0NjMyOTc5Li42Y2QxYTViIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC9zbXBfNjQuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9zbXBfNjQuYwpAQCAtNDQ5LDcgKzQ0OSw3IEBACiAJX19hc21fXyBfX3ZvbGF0aWxlX18oIndycHIgJTAsIDB4MCwgJSVwc3RhdGUiCiAJCQkgICAgIDogOiAiciIgKHBzdGF0ZSkpOwogCWlmIChzdHVjayA9PSAwKSB7Ci0JCXByaW50aygiQ1BVWyVkXTogbW9uZG8gc3R1Y2thZ2UgcmVzdWx0WyUwMTZseF1cbiIsCisJCXByaW50aygiQ1BVWyVkXTogbW9uZG8gc3R1Y2thZ2UgcmVzdWx0WyUwMTZsbHhdXG4iLAogCQkgICAgICAgc21wX3Byb2Nlc3Nvcl9pZCgpLCByZXN1bHQpOwogCX0gZWxzZSB7CiAJCXVkZWxheSgyKTsKQEAgLTU4NCw3ICs1ODQsNyBAQAogCQkJLyogQnVzeSBiaXRzIHdpbGwgbm90IGNsZWFyLCBjb250aW51ZSBpbnN0ZWFkCiAJCQkgKiBvZiBmcmVlemluZyB1cCBvbiB0aGlzIGNwdS4KIAkJCSAqLwotCQkJcHJpbnRrKCJDUFVbJWRdOiBtb25kbyBzdHVja2FnZSByZXN1bHRbJTAxNmx4XVxuIiwKKwkJCXByaW50aygiQ1BVWyVkXTogbW9uZG8gc3R1Y2thZ2UgcmVzdWx0WyUwMTZsbHhdXG4iLAogCQkJICAgICAgIHNtcF9wcm9jZXNzb3JfaWQoKSwgZGlzcGF0Y2hfc3RhdCk7CiAJCX0gZWxzZSB7CiAJCQlpbnQgaSwgdGhpc19idXN5X25hY2sgPSAwOwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvc3BhcmNfa3N5bXNfMzIuYyBiL2FyY2gvc3BhcmMva2VybmVsL3NwYXJjX2tzeW1zXzMyLmMKaW5kZXggZTFlOTc2My4uYmFlYWI4NyAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvc3BhcmNfa3N5bXNfMzIuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9zcGFyY19rc3ltc18zMi5jCkBAIC01LDQ5ICs1LDE0IEBACiAgKiBDb3B5cmlnaHQgKEMpIDE5OTYgRWRkaWUgQy4gRG9zdCAoZWNkQHNreW5ldC5iZSkKICAqLwogCi0vKiBUZWxsIHN0cmluZy5oIHdlIGRvbid0IHdhbnQgbWVtY3B5IGV0Yy4gYXMgY3BwIGRlZmluZXMgKi8KLSNkZWZpbmUgRVhQT1JUX1NZTVRBQl9TVFJPUFMKLSNkZWZpbmUgUFJPTUxJQl9JTlRFUk5BTAotCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9pbjYuaD4KLSNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgotI2luY2x1ZGUgPGxpbnV4L21tLmg+Ci0jaW5jbHVkZSA8bGludXgvc3lzY2FsbHMuaD4KLSNpZmRlZiBDT05GSUdfUENJCi0jaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jZW5kaWYKLSNpbmNsdWRlIDxsaW51eC9wbS5oPgotI2lmZGVmIENPTkZJR19ISUdITUVNCi0jaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgotI2VuZGlmCiAKLSNpbmNsdWRlIDxhc20vb3BsaWIuaD4KLSNpbmNsdWRlIDxhc20vZGVsYXkuaD4KLSNpbmNsdWRlIDxhc20vc3lzdGVtLmg+Ci0jaW5jbHVkZSA8YXNtL2F1eGlvLmg+CiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlIDxhc20vaXJxLmg+Ci0jaW5jbHVkZSA8YXNtL2lkcHJvbS5oPgotI2luY2x1ZGUgPGFzbS9oZWFkLmg+Ci0jaW5jbHVkZSA8YXNtL3NtcC5oPgotI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgotI2luY2x1ZGUgPGFzbS9jaGVja3N1bS5oPgotI2lmZGVmIENPTkZJR19TQlVTCisjaW5jbHVkZSA8YXNtL2RlbGF5Lmg+CisjaW5jbHVkZSA8YXNtL2hlYWQuaD4KICNpbmNsdWRlIDxhc20vZG1hLmg+Ci0jZW5kaWYKLSNpbmNsdWRlIDxhc20vaW8tdW5pdC5oPgotI2luY2x1ZGUgPGFzbS9idWcuaD4KLQotZXh0ZXJuIHNwaW5sb2NrX3QgcnRjX2xvY2s7CiAKIHN0cnVjdCBwb2xsIHsKIAlpbnQgZmQ7CkBAIC01NSw3MiArMjAsMTUgQEAKIAlzaG9ydCByZXZlbnRzOwogfTsKIAotZXh0ZXJuIHZvaWQgKCpfX2NvcHlfMXBhZ2UpKHZvaWQgKiwgY29uc3Qgdm9pZCAqKTsKLWV4dGVybiB2b2lkIF9fbWVtbW92ZSh2b2lkICosIGNvbnN0IHZvaWQgKiwgX19rZXJuZWxfc2l6ZV90KTsKLWV4dGVybiB2b2lkICgqYnplcm9fMXBhZ2UpKHZvaWQgKik7Ci1leHRlcm4gdm9pZCAqX19iemVybyh2b2lkICosIHNpemVfdCk7Ci1leHRlcm4gdm9pZCAqX19tZW1zY2FuX3plcm8odm9pZCAqLCBzaXplX3QpOwotZXh0ZXJuIHZvaWQgKl9fbWVtc2Nhbl9nZW5lcmljKHZvaWQgKiwgaW50LCBzaXplX3QpOwotZXh0ZXJuIGludCBfX3N0cm5jbXAoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIF9fa2VybmVsX3NpemVfdCk7Ci0KLWV4dGVybiBpbnQgX19hc2hyZGkzKGludCwgaW50KTsKLWV4dGVybiBpbnQgX19hc2hsZGkzKGludCwgaW50KTsKLWV4dGVybiBpbnQgX19sc2hyZGkzKGludCwgaW50KTsKLWV4dGVybiBpbnQgX19tdWxkaTMoaW50LCBpbnQpOwotZXh0ZXJuIGludCBfX2RpdmRpMyhpbnQsIGludCk7Ci0KLS8qIFByaXZhdGUgZnVuY3Rpb25zIHdpdGggb2RkIGNhbGxpbmcgY29udmVudGlvbnMuICovCi1leHRlcm4gdm9pZCBfX19hdG9taWMyNF9hZGQodm9pZCk7Ci1leHRlcm4gdm9pZCBfX19hdG9taWMyNF9zdWIodm9pZCk7Ci1leHRlcm4gdm9pZCBfX19yd19yZWFkX2VudGVyKHZvaWQpOwotZXh0ZXJuIHZvaWQgX19fcndfcmVhZF90cnkodm9pZCk7Ci1leHRlcm4gdm9pZCBfX19yd19yZWFkX2V4aXQodm9pZCk7Ci1leHRlcm4gdm9pZCBfX19yd193cml0ZV9lbnRlcih2b2lkKTsKLQotLyogQWxpYXMgZnVuY3Rpb25zIHdob3NlIG5hbWVzIGJlZ2luIHdpdGggIi4iIGFuZCBleHBvcnQgdGhlIGFsaWFzZXMuCi0gKiBUaGUgbW9kdWxlIHJlZmVyZW5jZXMgd2lsbCBiZSBmaXhlZCB1cCBieSBtb2R1bGVfZnJvYl9hcmNoX3NlY3Rpb25zLgotICovCi1leHRlcm4gaW50IF9EaXYoaW50LCBpbnQpOwotZXh0ZXJuIGludCBfTXVsKGludCwgaW50KTsKLWV4dGVybiBpbnQgX1JlbShpbnQsIGludCk7Ci1leHRlcm4gdW5zaWduZWQgX1VkaXYodW5zaWduZWQsIHVuc2lnbmVkKTsKLWV4dGVybiB1bnNpZ25lZCBfVW11bCh1bnNpZ25lZCwgdW5zaWduZWQpOwotZXh0ZXJuIHVuc2lnbmVkIF9VcmVtKHVuc2lnbmVkLCB1bnNpZ25lZCk7Ci0KLS8qIHVzZWQgYnkgdmFyaW91cyBkcml2ZXJzICovCi1FWFBPUlRfU1lNQk9MKHNwYXJjX2NwdV9tb2RlbCk7Ci1FWFBPUlRfU1lNQk9MKGtlcm5lbF90aHJlYWQpOwotI2lmZGVmIENPTkZJR19TTVAKLS8vIFhYWCBmaW5kIHdoYXQgdXNlcyAob3IgdXNlZCkgdGhlc2UuICAgQVY6IHNlZSBhc20vc3BpbmxvY2suaAotRVhQT1JUX1NZTUJPTChfX19yd19yZWFkX2VudGVyKTsKLUVYUE9SVF9TWU1CT0woX19fcndfcmVhZF90cnkpOwotRVhQT1JUX1NZTUJPTChfX19yd19yZWFkX2V4aXQpOwotRVhQT1JUX1NZTUJPTChfX19yd193cml0ZV9lbnRlcik7Ci0jZW5kaWYKLQotRVhQT1JUX1NZTUJPTChzcGFyY192YWxpZF9hZGRyX2JpdG1hcCk7Ci1FWFBPUlRfU1lNQk9MKHBoeXNfYmFzZSk7Ci1FWFBPUlRfU1lNQk9MKHBmbl9iYXNlKTsKLQotLyogQXRvbWljIG9wZXJhdGlvbnMuICovCi1FWFBPUlRfU1lNQk9MKF9fX2F0b21pYzI0X2FkZCk7Ci1FWFBPUlRfU1lNQk9MKF9fX2F0b21pYzI0X3N1Yik7Ci0KLS8qIFBlci1DUFUgaW5mb3JtYXRpb24gdGFibGUgKi8KLUVYUE9SVF9QRVJfQ1BVX1NZTUJPTChfX2NwdV9kYXRhKTsKLQotI2lmZGVmIENPTkZJR19TTVAKLS8qIElSUSBpbXBsZW1lbnRhdGlvbi4gKi8KLUVYUE9SVF9TWU1CT0woc3luY2hyb25pemVfaXJxKTsKLSNlbmRpZgotCisvKiBmcm9tIGVudHJ5LlMgKi8KIEVYUE9SVF9TWU1CT0woX191ZGVsYXkpOwogRVhQT1JUX1NZTUJPTChfX25kZWxheSk7Ci1FWFBPUlRfU1lNQk9MKHJ0Y19sb2NrKTsKLUVYUE9SVF9TWU1CT0woc2V0X2F1eGlvKTsKLUVYUE9SVF9TWU1CT0woZ2V0X2F1eGlvKTsKLUVYUE9SVF9TWU1CT0woaW9fcmVtYXBfcGZuX3JhbmdlKTsKIAorLyogZnJvbSBoZWFkXzMyLlMgKi8KK0VYUE9SVF9TWU1CT0woX19yZXRfZWZhdWx0KTsKK0VYUE9SVF9TWU1CT0woZW1wdHlfemVyb19wYWdlKTsKKworLyogRGVmaW5lZCB1c2luZyBtYWdpYyAqLwogI2lmbmRlZiBDT05GSUdfU01QCiBFWFBPUlRfU1lNQk9MKEJURklYVVBfQ0FMTChfX194Y2hnMzIpKTsKICNlbHNlCkBAIC0xMzIsMTIyICs0MCw3IEBACiBFWFBPUlRfU1lNQk9MKEJURklYVVBfQ0FMTChtbXVfZ2V0X3Njc2lfb25lKSk7CiBFWFBPUlRfU1lNQk9MKEJURklYVVBfQ0FMTChtbXVfcmVsZWFzZV9zY3NpX3NnbCkpOwogRVhQT1JUX1NZTUJPTChCVEZJWFVQX0NBTEwobW11X3JlbGVhc2Vfc2NzaV9vbmUpKTsKLQogRVhQT1JUX1NZTUJPTChCVEZJWFVQX0NBTEwocGdwcm90X25vbmNhY2hlZCkpOwogCi0jaWZkZWYgQ09ORklHX1NCVVMKLUVYUE9SVF9TWU1CT0woc2J1c19zZXRfc2J1czY0KTsKLSNlbmRpZgotI2lmZGVmIENPTkZJR19QQ0kKLUVYUE9SVF9TWU1CT0woaW5zYik7Ci1FWFBPUlRfU1lNQk9MKG91dHNiKTsKLUVYUE9SVF9TWU1CT0woaW5zdyk7Ci1FWFBPUlRfU1lNQk9MKG91dHN3KTsKLUVYUE9SVF9TWU1CT0woaW5zbCk7Ci1FWFBPUlRfU1lNQk9MKG91dHNsKTsKLUVYUE9SVF9TWU1CT0wocGNpX2FsbG9jX2NvbnNpc3RlbnQpOwotRVhQT1JUX1NZTUJPTChwY2lfZnJlZV9jb25zaXN0ZW50KTsKLUVYUE9SVF9TWU1CT0wocGNpX21hcF9zaW5nbGUpOwotRVhQT1JUX1NZTUJPTChwY2lfdW5tYXBfc2luZ2xlKTsKLUVYUE9SVF9TWU1CT0wocGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KTsKLUVYUE9SVF9TWU1CT0wocGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKTsKLUVYUE9SVF9TWU1CT0wocGNpX2RtYV9zeW5jX3NnX2Zvcl9jcHUpOwotRVhQT1JUX1NZTUJPTChwY2lfZG1hX3N5bmNfc2dfZm9yX2RldmljZSk7Ci1FWFBPUlRfU1lNQk9MKHBjaV9tYXBfc2cpOwotRVhQT1JUX1NZTUJPTChwY2lfdW5tYXBfc2cpOwotRVhQT1JUX1NZTUJPTChwY2lfbWFwX3BhZ2UpOwotRVhQT1JUX1NZTUJPTChwY2lfdW5tYXBfcGFnZSk7Ci0vKiBBY3R1YWxseSwgaW9yZW1hcC9pb3VubWFwIGFyZSBub3QgUENJIHNwZWNpZmljLiBCdXQgaXQgaXMgb2sgZm9yIGRyaXZlcnMuICovCi1FWFBPUlRfU1lNQk9MKGlvcmVtYXApOwotRVhQT1JUX1NZTUJPTChpb3VubWFwKTsKLSNlbmRpZgotCi0vKiBpbiBhcmNoL3NwYXJjL21tL2hpZ2htZW0uYyAqLwotI2lmZGVmIENPTkZJR19ISUdITUVNCi1FWFBPUlRfU1lNQk9MKGttYXBfYXRvbWljKTsKLUVYUE9SVF9TWU1CT0woa3VubWFwX2F0b21pYyk7Ci0jZW5kaWYKLQotLyogcHJvbSBzeW1ib2xzICovCi1FWFBPUlRfU1lNQk9MKGlkcHJvbSk7Ci1FWFBPUlRfU1lNQk9MKHByb21fcm9vdF9ub2RlKTsKLUVYUE9SVF9TWU1CT0wocHJvbV9nZXRjaGlsZCk7Ci1FWFBPUlRfU1lNQk9MKHByb21fZ2V0c2libGluZyk7Ci1FWFBPUlRfU1lNQk9MKHByb21fc2VhcmNoc2libGluZ3MpOwotRVhQT1JUX1NZTUJPTChwcm9tX2ZpcnN0cHJvcCk7Ci1FWFBPUlRfU1lNQk9MKHByb21fbmV4dHByb3ApOwotRVhQT1JUX1NZTUJPTChwcm9tX2dldHByb3BsZW4pOwotRVhQT1JUX1NZTUJPTChwcm9tX2dldHByb3BlcnR5KTsKLUVYUE9SVF9TWU1CT0wocHJvbV9ub2RlX2hhc19wcm9wZXJ0eSk7Ci1FWFBPUlRfU1lNQk9MKHByb21fc2V0cHJvcCk7CisvKiBFeHBvcnRpbmcgYSBzeW1ib2wgZnJvbSAvaW5pdC9tYWluLmMgKi8KIEVYUE9SVF9TWU1CT0woc2F2ZWRfY29tbWFuZF9saW5lKTsKLUVYUE9SVF9TWU1CT0wocHJvbV9hcHBseV9vYmlvX3Jhbmdlcyk7Ci1FWFBPUlRfU1lNQk9MKHByb21fZmV2YWwpOwotRVhQT1JUX1NZTUJPTChwcm9tX2dldGJvb2wpOwotRVhQT1JUX1NZTUJPTChwcm9tX2dldHN0cmluZyk7Ci1FWFBPUlRfU1lNQk9MKHByb21fZ2V0aW50KTsKLUVYUE9SVF9TWU1CT0wocHJvbV9nZXRpbnRkZWZhdWx0KTsKLUVYUE9SVF9TWU1CT0wocHJvbV9maW5kZGV2aWNlKTsKLUVYUE9SVF9TWU1CT0wocm9tdmVjKTsKLUVYUE9SVF9TWU1CT0woX19wcm9tX2dldGNoaWxkKTsKLUVYUE9SVF9TWU1CT0woX19wcm9tX2dldHNpYmxpbmcpOwotCi0vKiBzcGFyYyBsaWJyYXJ5IHN5bWJvbHMgKi8KLUVYUE9SVF9TWU1CT0wobWVtc2Nhbik7Ci1FWFBPUlRfU1lNQk9MKHN0cmxlbik7Ci1FWFBPUlRfU1lNQk9MKHN0cm5jbXApOwotRVhQT1JUX1NZTUJPTChwYWdlX2tlcm5lbCk7Ci0KLS8qIFNwZWNpYWwgaW50ZXJuYWwgdmVyc2lvbnMgb2YgbGlicmFyeSBmdW5jdGlvbnMuICovCi1FWFBPUlRfU1lNQk9MKF9fY29weV8xcGFnZSk7Ci1FWFBPUlRfU1lNQk9MKF9fbWVtY3B5KTsKLUVYUE9SVF9TWU1CT0woX19tZW1zZXQpOwotRVhQT1JUX1NZTUJPTChiemVyb18xcGFnZSk7Ci1FWFBPUlRfU1lNQk9MKF9fYnplcm8pOwotRVhQT1JUX1NZTUJPTChfX21lbXNjYW5femVybyk7Ci1FWFBPUlRfU1lNQk9MKF9fbWVtc2Nhbl9nZW5lcmljKTsKLUVYUE9SVF9TWU1CT0woX19zdHJuY21wKTsKLUVYUE9SVF9TWU1CT0woX19tZW1tb3ZlKTsKLQotLyogTW92aW5nIGRhdGEgdG8vZnJvbSB1c2Vyc3BhY2UuICovCi1FWFBPUlRfU1lNQk9MKF9fY29weV91c2VyKTsKLUVYUE9SVF9TWU1CT0woX19zdHJuY3B5X2Zyb21fdXNlcik7Ci1FWFBPUlRfU1lNQk9MKF9fc3Rybmxlbl91c2VyKTsKLQotLyogTmV0d29ya2luZyBoZWxwZXIgcm91dGluZXMuICovCi1FWFBPUlRfU1lNQk9MKF9fY3N1bV9wYXJ0aWFsX2NvcHlfc3BhcmNfZ2VuZXJpYyk7Ci1FWFBPUlRfU1lNQk9MKGNzdW1fcGFydGlhbCk7Ci0KLS8qIENhY2hlIGZsdXNoaW5nLiAgKi8KLUVYUE9SVF9TWU1CT0woc3BhcmNfZmx1c2hfcGFnZV90b19yYW0pOwotCi0vKiBGb3Igd2hlbiBzZXJpYWwgc3R1ZmYgaXMgYnVpbHQgYXMgbW9kdWxlcy4gKi8KLUVYUE9SVF9TWU1CT0woc3VuX2RvX2JyZWFrKTsKLQotRVhQT1JUX1NZTUJPTChfX3JldF9lZmF1bHQpOwotCi1FWFBPUlRfU1lNQk9MKG1lbWNtcCk7Ci1FWFBPUlRfU1lNQk9MKG1lbWNweSk7Ci1FWFBPUlRfU1lNQk9MKG1lbXNldCk7Ci1FWFBPUlRfU1lNQk9MKG1lbW1vdmUpOwotRVhQT1JUX1NZTUJPTChfX2FzaHJkaTMpOwotRVhQT1JUX1NZTUJPTChfX2FzaGxkaTMpOwotRVhQT1JUX1NZTUJPTChfX2xzaHJkaTMpOwotRVhQT1JUX1NZTUJPTChfX211bGRpMyk7Ci1FWFBPUlRfU1lNQk9MKF9fZGl2ZGkzKTsKLQotRVhQT1JUX1NZTUJPTChfUmVtKTsKLUVYUE9SVF9TWU1CT0woX1VyZW0pOwotRVhQT1JUX1NZTUJPTChfTXVsKTsKLUVYUE9SVF9TWU1CT0woX1VtdWwpOwotRVhQT1JUX1NZTUJPTChfRGl2KTsKLUVYUE9SVF9TWU1CT0woX1VkaXYpOwotCi0jaWZkZWYgQ09ORklHX0RFQlVHX0JVR1ZFUkJPU0UKLUVYUE9SVF9TWU1CT0woZG9fQlVHKTsKLSNlbmRpZgotCi0vKiBTdW4gUG93ZXIgTWFuYWdlbWVudCBJZGxlIEhhbmRsZXIgKi8KLUVYUE9SVF9TWU1CT0wocG1faWRsZSk7Ci0KLUVYUE9SVF9TWU1CT0woZW1wdHlfemVyb19wYWdlKTsKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL3NwYXJjX2tzeW1zXzY0LmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9zcGFyY19rc3ltc182NC5jCmluZGV4IDAxMzMyMTEuLjBmMjYwNjYgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL3NwYXJjX2tzeW1zXzY0LmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvc3BhcmNfa3N5bXNfNjQuYwpAQCAtNSw1MCArNSwxNSBAQAogICogQ29weXJpZ2h0IChDKSAxOTk5IEpha3ViIEplbGluZWsgKGpqQHVsdHJhLmxpbnV4LmN6KQogICovCiAKLS8qIFRlbGwgc3RyaW5nLmggd2UgZG9uJ3Qgd2FudCBtZW1jcHkgZXRjLiBhcyBjcHAgZGVmaW5lcyAqLwotI2RlZmluZSBFWFBPUlRfU1lNVEFCX1NUUk9QUwotI2RlZmluZSBQUk9NTElCX0lOVEVSTkFMCi0KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvaW42Lmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvZnNfc3RydWN0Lmg+Ci0jaW5jbHVkZSA8bGludXgvZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9tbS5oPgotI2luY2x1ZGUgPGxpbnV4L3NvY2tldC5oPgotI2luY2x1ZGUgPGxpbnV4L3N5c2NhbGxzLmg+Ci0jaW5jbHVkZSA8bGludXgvcGVyY3B1Lmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L3J3c2VtLmg+Ci0jaW5jbHVkZSA8bmV0L2NvbXBhdC5oPgogCi0jaW5jbHVkZSA8YXNtL29wbGliLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgotI2luY2x1ZGUgPGFzbS9hdXhpby5oPgotI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+Ci0jaW5jbHVkZSA8YXNtL2lycS5oPgotI2luY2x1ZGUgPGFzbS9pZHByb20uaD4KLSNpbmNsdWRlIDxhc20vZWxmLmg+Ci0jaW5jbHVkZSA8YXNtL2hlYWQuaD4KLSNpbmNsdWRlIDxhc20vc21wLmg+Ci0jaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgotI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+Ci0jaW5jbHVkZSA8YXNtL2NoZWNrc3VtLmg+Ci0jaW5jbHVkZSA8YXNtL2ZwdW1hY3JvLmg+Ci0jaW5jbHVkZSA8YXNtL3BnYWxsb2MuaD4KLSNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgotI2lmZGVmIENPTkZJR19TQlVTCi0jaW5jbHVkZSA8YXNtL2RtYS5oPgotI2VuZGlmCi0jaW5jbHVkZSA8YXNtL25zODczMDMuaD4KLSNpbmNsdWRlIDxhc20vdGltZXIuaD4KICNpbmNsdWRlIDxhc20vY3B1ZGF0YS5oPgotI2luY2x1ZGUgPGFzbS9mdHJhY2UuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9zcGl0ZmlyZS5oPgorI2luY2x1ZGUgPGFzbS9vcGxpYi5oPgogI2luY2x1ZGUgPGFzbS9oeXBlcnZpc29yLmg+CiAKIHN0cnVjdCBwb2xsIHsKQEAgLTU3LDExNCArMjIsMjQgQEAKIAlzaG9ydCByZXZlbnRzOwogfTsKIAotZXh0ZXJuIHZvaWQgZGllX2lmX2tlcm5lbChjaGFyICpzdHIsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKLWV4dGVybiBwaWRfdCBrZXJuZWxfdGhyZWFkKGludCAoKmZuKSh2b2lkICopLCB2b2lkICogYXJnLCB1bnNpZ25lZCBsb25nIGZsYWdzKTsKLWV4dGVybiB2b2lkICpfX2J6ZXJvKHZvaWQgKiwgc2l6ZV90KTsKLWV4dGVybiB2b2lkICpfX21lbXNjYW5femVybyh2b2lkICosIHNpemVfdCk7Ci1leHRlcm4gdm9pZCAqX19tZW1zY2FuX2dlbmVyaWModm9pZCAqLCBpbnQsIHNpemVfdCk7Ci1leHRlcm4gX19rZXJuZWxfc2l6ZV90IHN0cmxlbihjb25zdCBjaGFyICopOwotZXh0ZXJuIHZvaWQgc3lzX3NpZ3N1c3BlbmQodm9pZCk7Ci1leHRlcm4gaW50IGNvbXBhdF9zeXNfaW9jdGwodW5zaWduZWQgaW50IGZkLCB1bnNpZ25lZCBpbnQgY21kLCB1MzIgYXJnKTsKLWV4dGVybiBpbnQgKCpoYW5kbGVfbWF0aGVtdSkoc3RydWN0IHB0X3JlZ3MgKiwgc3RydWN0IGZwdXN0YXRlICopOwotZXh0ZXJuIGxvbmcgc3BhcmMzMl9vcGVuKGNvbnN0IGNoYXIgX191c2VyICogZmlsZW5hbWUsIGludCBmbGFncywgaW50IG1vZGUpOwotZXh0ZXJuIGludCBpb19yZW1hcF9wZm5fcmFuZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgZnJvbSwKLQl1bnNpZ25lZCBsb25nIHBmbiwgdW5zaWduZWQgbG9uZyBzaXplLCBwZ3Byb3RfdCBwcm90KTsKLQotZXh0ZXJuIGludCBfX2FzaHJkaTMoaW50LCBpbnQpOwotCi1leHRlcm4gaW50IGR1bXBfZnB1IChzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MsIGVsZl9mcHJlZ3NldF90ICogZnByZWdzKTsKLQotZXh0ZXJuIHZvaWQgeG9yX3Zpc18yKHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcgKiwgdW5zaWduZWQgbG9uZyAqKTsKLWV4dGVybiB2b2lkIHhvcl92aXNfMyh1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nICosIHVuc2lnbmVkIGxvbmcgKiwKLQkJICAgICAgdW5zaWduZWQgbG9uZyAqKTsKLWV4dGVybiB2b2lkIHhvcl92aXNfNCh1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nICosIHVuc2lnbmVkIGxvbmcgKiwKLQkJICAgICAgdW5zaWduZWQgbG9uZyAqLCB1bnNpZ25lZCBsb25nICopOwotZXh0ZXJuIHZvaWQgeG9yX3Zpc181KHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcgKiwgdW5zaWduZWQgbG9uZyAqLAotCQkgICAgICB1bnNpZ25lZCBsb25nICosIHVuc2lnbmVkIGxvbmcgKiwgdW5zaWduZWQgbG9uZyAqKTsKLQotZXh0ZXJuIHZvaWQgeG9yX25pYWdhcmFfMih1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nICosIHVuc2lnbmVkIGxvbmcgKik7Ci1leHRlcm4gdm9pZCB4b3JfbmlhZ2FyYV8zKHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcgKiwgdW5zaWduZWQgbG9uZyAqLAotCQkJICB1bnNpZ25lZCBsb25nICopOwotZXh0ZXJuIHZvaWQgeG9yX25pYWdhcmFfNCh1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nICosIHVuc2lnbmVkIGxvbmcgKiwKLQkJCSAgdW5zaWduZWQgbG9uZyAqLCB1bnNpZ25lZCBsb25nICopOwotZXh0ZXJuIHZvaWQgeG9yX25pYWdhcmFfNSh1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nICosIHVuc2lnbmVkIGxvbmcgKiwKLQkJCSAgdW5zaWduZWQgbG9uZyAqLCB1bnNpZ25lZCBsb25nICosIHVuc2lnbmVkIGxvbmcgKik7Ci0KLS8qIFBlci1DUFUgaW5mb3JtYXRpb24gdGFibGUgKi8KLUVYUE9SVF9QRVJfQ1BVX1NZTUJPTChfX2NwdV9kYXRhKTsKLQotLyogdXNlZCBieSB2YXJpb3VzIGRyaXZlcnMgKi8KLSNpZmRlZiBDT05GSUdfU01QCi0vKiBPdXQgb2YgbGluZSBydy1sb2NraW5nIGltcGxlbWVudGF0aW9uLiAqLwotRVhQT1JUX1NZTUJPTChfX3JlYWRfbG9jayk7Ci1FWFBPUlRfU1lNQk9MKF9fcmVhZF91bmxvY2spOwotRVhQT1JUX1NZTUJPTChfX3dyaXRlX2xvY2spOwotRVhQT1JUX1NZTUJPTChfX3dyaXRlX3VubG9jayk7Ci1FWFBPUlRfU1lNQk9MKF9fd3JpdGVfdHJ5bG9jayk7Ci0jZW5kaWYgLyogQ09ORklHX1NNUCAqLwotCi0jaWZkZWYgQ09ORklHX01DT1VOVAotRVhQT1JUX1NZTUJPTChfbWNvdW50KTsKLSNlbmRpZgotCi1FWFBPUlRfU1lNQk9MKHNwYXJjNjRfZ2V0X2Nsb2NrX3RpY2spOwotCi0vKiBSVyBzZW1hcGhvcmVzICovCi1FWFBPUlRfU1lNQk9MKF9fZG93bl9yZWFkKTsKLUVYUE9SVF9TWU1CT0woX19kb3duX3JlYWRfdHJ5bG9jayk7Ci1FWFBPUlRfU1lNQk9MKF9fZG93bl93cml0ZSk7Ci1FWFBPUlRfU1lNQk9MKF9fZG93bl93cml0ZV90cnlsb2NrKTsKLUVYUE9SVF9TWU1CT0woX191cF9yZWFkKTsKLUVYUE9SVF9TWU1CT0woX191cF93cml0ZSk7Ci1FWFBPUlRfU1lNQk9MKF9fZG93bmdyYWRlX3dyaXRlKTsKLQotLyogQXRvbWljIGNvdW50ZXIgaW1wbGVtZW50YXRpb24uICovCi1FWFBPUlRfU1lNQk9MKGF0b21pY19hZGQpOwotRVhQT1JUX1NZTUJPTChhdG9taWNfYWRkX3JldCk7Ci1FWFBPUlRfU1lNQk9MKGF0b21pY19zdWIpOwotRVhQT1JUX1NZTUJPTChhdG9taWNfc3ViX3JldCk7Ci1FWFBPUlRfU1lNQk9MKGF0b21pYzY0X2FkZCk7Ci1FWFBPUlRfU1lNQk9MKGF0b21pYzY0X2FkZF9yZXQpOwotRVhQT1JUX1NZTUJPTChhdG9taWM2NF9zdWIpOwotRVhQT1JUX1NZTUJPTChhdG9taWM2NF9zdWJfcmV0KTsKLQotLyogQXRvbWljIGJpdCBvcGVyYXRpb25zLiAqLwotRVhQT1JUX1NZTUJPTCh0ZXN0X2FuZF9zZXRfYml0KTsKLUVYUE9SVF9TWU1CT0wodGVzdF9hbmRfY2xlYXJfYml0KTsKLUVYUE9SVF9TWU1CT0wodGVzdF9hbmRfY2hhbmdlX2JpdCk7Ci1FWFBPUlRfU1lNQk9MKHNldF9iaXQpOwotRVhQT1JUX1NZTUJPTChjbGVhcl9iaXQpOwotRVhQT1JUX1NZTUJPTChjaGFuZ2VfYml0KTsKLQorLyogZnJvbSBoZWxwZXJzLlMgKi8KIEVYUE9SVF9TWU1CT0woX19mbHVzaHdfdXNlcik7CitFWFBPUlRfU1lNQk9MX0dQTChyZWFsX2hhcmRfc21wX3Byb2Nlc3Nvcl9pZCk7CiAKKy8qIGZyb20gaGVhZF82NC5TICovCitFWFBPUlRfU1lNQk9MKF9fcmV0X2VmYXVsdCk7CiBFWFBPUlRfU1lNQk9MKHRsYl90eXBlKTsKIEVYUE9SVF9TWU1CT0woc3VuNHZfY2hpcF90eXBlKTsKLUVYUE9SVF9TWU1CT0woZ2V0X2ZiX3VubWFwcGVkX2FyZWEpOwotRVhQT1JUX1NZTUJPTChmbHVzaF9pY2FjaGVfcmFuZ2UpOworRVhQT1JUX1NZTUJPTChwcm9tX3Jvb3Rfbm9kZSk7CiAKLUVYUE9SVF9TWU1CT0woZmx1c2hfZGNhY2hlX3BhZ2UpOwotI2lmZGVmIERDQUNIRV9BTElBU0lOR19QT1NTSUJMRQotRVhQT1JUX1NZTUJPTChfX2ZsdXNoX2RjYWNoZV9yYW5nZSk7Ci0jZW5kaWYKLQorLyogZnJvbSBodmNhbGxzLlMgKi8KIEVYUE9SVF9TWU1CT0woc3VuNHZfbmlhZ2FyYV9nZXRwZXJmKTsKIEVYUE9SVF9TWU1CT0woc3VuNHZfbmlhZ2FyYV9zZXRwZXJmKTsKIEVYUE9SVF9TWU1CT0woc3VuNHZfbmlhZ2FyYTJfZ2V0cGVyZik7CiBFWFBPUlRfU1lNQk9MKHN1bjR2X25pYWdhcmEyX3NldHBlcmYpOwogCi1FWFBPUlRfU1lNQk9MKGF1eGlvX3NldF9sZWQpOwotRVhQT1JUX1NZTUJPTChhdXhpb19zZXRfbHRlKTsKLSNpZmRlZiBDT05GSUdfU0JVUwotRVhQT1JUX1NZTUJPTChzYnVzX3NldF9zYnVzNjQpOwotI2VuZGlmCi1FWFBPUlRfU1lNQk9MKG91dHNiKTsKLUVYUE9SVF9TWU1CT0wob3V0c3cpOwotRVhQT1JUX1NZTUJPTChvdXRzbCk7Ci1FWFBPUlRfU1lNQk9MKGluc2IpOwotRVhQT1JUX1NZTUJPTChpbnN3KTsKLUVYUE9SVF9TWU1CT0woaW5zbCk7CiAjaWZkZWYgQ09ORklHX1BDSQorLyogaW5saW5lIGZ1bmN0aW9ucyBpbiBhc20vcGNpXzY0LmggKi8KIEVYUE9SVF9TWU1CT0wocGNpX2FsbG9jX2NvbnNpc3RlbnQpOwogRVhQT1JUX1NZTUJPTChwY2lfZnJlZV9jb25zaXN0ZW50KTsKIEVYUE9SVF9TWU1CT0wocGNpX21hcF9zaW5nbGUpOwpAQCAtMTczLDExMiArNDgsNyBAQAogRVhQT1JUX1NZTUJPTChwY2lfdW5tYXBfc2cpOwogRVhQT1JUX1NZTUJPTChwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUpOwogRVhQT1JUX1NZTUJPTChwY2lfZG1hX3N5bmNfc2dfZm9yX2NwdSk7Ci1FWFBPUlRfU1lNQk9MKHBjaV9kbWFfc3VwcG9ydGVkKTsKICNlbmRpZgogCi0vKiBJL08gZGV2aWNlIG1tYXBpbmcgb24gU3BhcmM2NC4gKi8KLUVYUE9SVF9TWU1CT0woaW9fcmVtYXBfcGZuX3JhbmdlKTsKLQotRVhQT1JUX1NZTUJPTChkdW1wX2ZwdSk7Ci0KLS8qIG1hdGgtZW11IHdhbnRzIHRoaXMgKi8KLUVYUE9SVF9TWU1CT0woZGllX2lmX2tlcm5lbCk7Ci0KLS8qIEtlcm5lbCB0aHJlYWQgY3JlYXRpb24uICovCi1FWFBPUlRfU1lNQk9MKGtlcm5lbF90aHJlYWQpOwotCi0vKiBwcm9tIHN5bWJvbHMgKi8KLUVYUE9SVF9TWU1CT0woaWRwcm9tKTsKLUVYUE9SVF9TWU1CT0wocHJvbV9yb290X25vZGUpOwotRVhQT1JUX1NZTUJPTChwcm9tX2dldGNoaWxkKTsKLUVYUE9SVF9TWU1CT0wocHJvbV9nZXRzaWJsaW5nKTsKLUVYUE9SVF9TWU1CT0wocHJvbV9zZWFyY2hzaWJsaW5ncyk7Ci1FWFBPUlRfU1lNQk9MKHByb21fZmlyc3Rwcm9wKTsKLUVYUE9SVF9TWU1CT0wocHJvbV9uZXh0cHJvcCk7Ci1FWFBPUlRfU1lNQk9MKHByb21fZ2V0cHJvcGxlbik7Ci1FWFBPUlRfU1lNQk9MKHByb21fZ2V0cHJvcGVydHkpOwotRVhQT1JUX1NZTUJPTChwcm9tX25vZGVfaGFzX3Byb3BlcnR5KTsKLUVYUE9SVF9TWU1CT0wocHJvbV9zZXRwcm9wKTsKKy8qIEV4cG9ydGluZyBhIHN5bWJvbCBmcm9tIC9pbml0L21haW4uYyAqLwogRVhQT1JUX1NZTUJPTChzYXZlZF9jb21tYW5kX2xpbmUpOwotRVhQT1JUX1NZTUJPTChwcm9tX2ZpbmRkZXZpY2UpOwotRVhQT1JUX1NZTUJPTChwcm9tX2ZldmFsKTsKLUVYUE9SVF9TWU1CT0wocHJvbV9nZXRib29sKTsKLUVYUE9SVF9TWU1CT0wocHJvbV9nZXRzdHJpbmcpOwotRVhQT1JUX1NZTUJPTChwcm9tX2dldGludCk7Ci1FWFBPUlRfU1lNQk9MKHByb21fZ2V0aW50ZGVmYXVsdCk7Ci1FWFBPUlRfU1lNQk9MKF9fcHJvbV9nZXRjaGlsZCk7Ci1FWFBPUlRfU1lNQk9MKF9fcHJvbV9nZXRzaWJsaW5nKTsKLQotLyogc3BhcmMgbGlicmFyeSBzeW1ib2xzICovCi1FWFBPUlRfU1lNQk9MKHN0cmxlbik7Ci1FWFBPUlRfU1lNQk9MKF9fc3RybGVuX3VzZXIpOwotRVhQT1JUX1NZTUJPTChfX3N0cm5sZW5fdXNlcik7Ci0KLS8qIFNwZWNpYWwgaW50ZXJuYWwgdmVyc2lvbnMgb2YgbGlicmFyeSBmdW5jdGlvbnMuICovCi1FWFBPUlRfU1lNQk9MKF9jbGVhcl9wYWdlKTsKLUVYUE9SVF9TWU1CT0woY2xlYXJfdXNlcl9wYWdlKTsKLUVYUE9SVF9TWU1CT0woY29weV91c2VyX3BhZ2UpOwotRVhQT1JUX1NZTUJPTChfX2J6ZXJvKTsKLUVYUE9SVF9TWU1CT0woX19tZW1zY2FuX3plcm8pOwotRVhQT1JUX1NZTUJPTChfX21lbXNjYW5fZ2VuZXJpYyk7Ci1FWFBPUlRfU1lNQk9MKF9fbWVtc2V0KTsKLQotRVhQT1JUX1NZTUJPTChjc3VtX3BhcnRpYWwpOwotRVhQT1JUX1NZTUJPTChjc3VtX3BhcnRpYWxfY29weV9ub2NoZWNrKTsKLUVYUE9SVF9TWU1CT0woX19jc3VtX3BhcnRpYWxfY29weV9mcm9tX3VzZXIpOwotRVhQT1JUX1NZTUJPTChfX2NzdW1fcGFydGlhbF9jb3B5X3RvX3VzZXIpOwotRVhQT1JUX1NZTUJPTChpcF9mYXN0X2NzdW0pOwotCi0vKiBNb3ZpbmcgZGF0YSB0by9mcm9tL2luIHVzZXJzcGFjZS4gKi8KLUVYUE9SVF9TWU1CT0woX19fY29weV90b191c2VyKTsKLUVYUE9SVF9TWU1CT0woX19fY29weV9mcm9tX3VzZXIpOwotRVhQT1JUX1NZTUJPTChfX19jb3B5X2luX3VzZXIpOwotRVhQT1JUX1NZTUJPTChjb3B5X3RvX3VzZXJfZml4dXApOwotRVhQT1JUX1NZTUJPTChjb3B5X2Zyb21fdXNlcl9maXh1cCk7Ci1FWFBPUlRfU1lNQk9MKGNvcHlfaW5fdXNlcl9maXh1cCk7Ci1FWFBPUlRfU1lNQk9MKF9fc3RybmNweV9mcm9tX3VzZXIpOwotRVhQT1JUX1NZTUJPTChfX2NsZWFyX3VzZXIpOwotCi0vKiBWYXJpb3VzIGFkZHJlc3MgY29udmVyc2lvbiBtYWNyb3MgdXNlIHRoaXMuICovCi1FWFBPUlRfU1lNQk9MKHNwYXJjNjRfdmFsaWRfYWRkcl9iaXRtYXApOwotCi0vKiBObyB2ZXJzaW9uIGluZm9ybWF0aW9uIG9uIHRoaXMsIGhlYXZpbHkgdXNlZCBpbiBpbmxpbmUgYXNtLAotICogYW5kIHdpbGwgYWx3YXlzIGJlICd2b2lkIF9fcmV0X2VmYXVsdCh2b2lkKScuCi0gKi8KLUVYUE9SVF9TWU1CT0woX19yZXRfZWZhdWx0KTsKLQotLyogTm8gdmVyc2lvbiBpbmZvcm1hdGlvbiBvbiB0aGVzZSwgYXMgZ2NjIHByb2R1Y2VzIHN1Y2ggc3ltYm9scy4gKi8KLUVYUE9SVF9TWU1CT0wobWVtY21wKTsKLUVYUE9SVF9TWU1CT0wobWVtY3B5KTsKLUVYUE9SVF9TWU1CT0wobWVtc2V0KTsKLUVYUE9SVF9TWU1CT0wobWVtbW92ZSk7Ci1FWFBPUlRfU1lNQk9MKHN0cm5jbXApOwotCi12b2lkIFZJU2VudGVyKHZvaWQpOwotLyogUkFJRCBjb2RlIG5lZWRzIHRoaXMgKi8KLUVYUE9SVF9TWU1CT0woVklTZW50ZXIpOwotCi0vKiBmb3IgaW5wdXQva2V5YmRldiAqLwotRVhQT1JUX1NZTUJPTChzdW5fZG9fYnJlYWspOwotRVhQT1JUX1NZTUJPTChzdG9wX2FfZW5hYmxlZCk7Ci0KLSNpZmRlZiBDT05GSUdfREVCVUdfQlVHVkVSQk9TRQotRVhQT1JUX1NZTUJPTChkb19CVUcpOwotI2VuZGlmCi0KLS8qIGZvciBuczg3MDMgKi8KLUVYUE9SVF9TWU1CT0wobnM4NzMwM19sb2NrKTsKLQotRVhQT1JUX1NZTUJPTCh0aWNrX29wcyk7Ci0KLUVYUE9SVF9TWU1CT0woeG9yX3Zpc18yKTsKLUVYUE9SVF9TWU1CT0woeG9yX3Zpc18zKTsKLUVYUE9SVF9TWU1CT0woeG9yX3Zpc180KTsKLUVYUE9SVF9TWU1CT0woeG9yX3Zpc181KTsKLQotRVhQT1JUX1NZTUJPTCh4b3JfbmlhZ2FyYV8yKTsKLUVYUE9SVF9TWU1CT0woeG9yX25pYWdhcmFfMyk7Ci1FWFBPUlRfU1lNQk9MKHhvcl9uaWFnYXJhXzQpOwotRVhQT1JUX1NZTUJPTCh4b3JfbmlhZ2FyYV81KTsKLQotRVhQT1JUX1NZTUJPTF9HUEwocmVhbF9oYXJkX3NtcF9wcm9jZXNzb3JfaWQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvc3VuNGRfc21wLmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9zdW40ZF9zbXAuYwppbmRleCAxNmFiMGNiLi41MGFmYWVkIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC9zdW40ZF9zbXAuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9zdW40ZF9zbXAuYwpAQCAtNjAsNyArNjAsNyBAQAogI2RlZmluZSBTTVBfUFJJTlRLKHgpCiAjZW5kaWYKIAotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHN3YXAodm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqcHRyLCB1bnNpZ25lZCBsb25nIHZhbCkKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBzdW40ZF9zd2FwKHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKnB0ciwgdW5zaWduZWQgbG9uZyB2YWwpCiB7CiAJX19hc21fXyBfX3ZvbGF0aWxlX18oInN3YXAgWyUxXSwgJTBcblx0IiA6CiAJCQkgICAgICI9JnIiICh2YWwpLCAiPSZyIiAocHRyKSA6CkBAIC0xMTUsNyArMTE1LDcgQEAKIAlsb2NhbF9mbHVzaF90bGJfYWxsKCk7CiAKIAkvKiBBbGxvdyBtYXN0ZXIgdG8gY29udGludWUuICovCi0Jc3dhcCgodW5zaWduZWQgbG9uZyAqKSZjcHVfY2FsbGluX21hcFtjcHVpZF0sIDEpOworCXN1bjRkX3N3YXAoKHVuc2lnbmVkIGxvbmcgKikmY3B1X2NhbGxpbl9tYXBbY3B1aWRdLCAxKTsKIAlsb2NhbF9mbHVzaF9jYWNoZV9hbGwoKTsKIAlsb2NhbF9mbHVzaF90bGJfYWxsKCk7CiAJCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9zdW40bV9zbXAuYyBiL2FyY2gvc3BhcmMva2VybmVsL3N1bjRtX3NtcC5jCmluZGV4IDRmOGQ2MDUuLjgwNDAzNzYgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL3N1bjRtX3NtcC5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL3N1bjRtX3NtcC5jCkBAIC01NCw3ICs1NCw4IEBACiAjZGVmaW5lIFNNUF9QUklOVEsoeCkKICNlbmRpZgogCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgc3dhcCh2b2xhdGlsZSB1bnNpZ25lZCBsb25nICpwdHIsIHVuc2lnbmVkIGxvbmcgdmFsKQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nCitzd2FwX3Vsb25nKHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKnB0ciwgdW5zaWduZWQgbG9uZyB2YWwpCiB7CiAJX19hc21fXyBfX3ZvbGF0aWxlX18oInN3YXAgWyUxXSwgJTBcblx0IiA6CiAJCQkgICAgICI9JnIiICh2YWwpLCAiPSZyIiAocHRyKSA6CkBAIC05MCw3ICs5MSw3IEBACiAJICogdG8gY2FsbCB0aGUgc2NoZWR1bGVyIGNvZGUuCiAJICovCiAJLyogQWxsb3cgbWFzdGVyIHRvIGNvbnRpbnVlLiAqLwotCXN3YXAoJmNwdV9jYWxsaW5fbWFwW2NwdWlkXSwgMSk7CisJc3dhcF91bG9uZygmY3B1X2NhbGxpbl9tYXBbY3B1aWRdLCAxKTsKIAogCS8qIFhYWDogV2hhdCdzIHVwIHdpdGggYWxsIHRoZSBmbHVzaGVzPyAqLwogCWxvY2FsX2ZsdXNoX2NhY2hlX2FsbCgpOwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvc3lzX3NwYXJjXzY0LmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9zeXNfc3BhcmNfNjQuYwppbmRleCAzOTc0OWUzLi4wOTA1OGZjIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC9zeXNfc3BhcmNfNjQuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9zeXNfc3BhcmNfNjQuYwpAQCAtMjMsNiArMjMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lwYy5oPgogI2luY2x1ZGUgPGxpbnV4L3BlcnNvbmFsaXR5Lmg+CiAjaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS91dHJhcC5oPgpAQCAtMzU0LDYgKzM1NSw3IEBACiAKIAlyZXR1cm4gYWRkcjsKIH0KK0VYUE9SVF9TWU1CT0woZ2V0X2ZiX3VubWFwcGVkX2FyZWEpOwogCiAvKiBFc3NlbnRpYWxseSB0aGUgc2FtZSBhcyBQb3dlclBDLi4uICovCiB2b2lkIGFyY2hfcGlja19tbWFwX2xheW91dChzdHJ1Y3QgbW1fc3RydWN0ICptbSkKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL3N5c2NhbGxzLlMgYi9hcmNoL3NwYXJjL2tlcm5lbC9zeXNjYWxscy5TCmluZGV4IDdhNjc4NmEuLjg3ZjVhM2IgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL3N5c2NhbGxzLlMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvc3lzY2FsbHMuUwpAQCAtMjAsNyArMjAsNyBAQAogCSBhZGQJJXNwLCBQVFJFR1NfT0ZGLCAlbzAKIAogCS5hbGlnbgkzMgotc3lzX3BpcGU6CitzeXNfc3BhcmNfcGlwZToKIAliYSxwdAkleGNjLCBzcGFyY19waXBlCiAJIGFkZAklc3AsIFBUUkVHU19PRkYsICVvMAogc3lzX25pc19zeXNjYWxsOgpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvc3lzdGJsc18zMi5TIGIvYXJjaC9zcGFyYy9rZXJuZWwvc3lzdGJsc18zMi5TCmluZGV4IDdkMDgwNzUuLmRjY2M5NWQgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL3N5c3RibHNfMzIuUworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9zeXN0YmxzXzMyLlMKQEAgLTI0LDcgKzI0LDcgQEAKIC8qMjUqLwkubG9uZyBzeXNfdm1zcGxpY2UsIHN5c19wdHJhY2UsIHN5c19hbGFybSwgc3lzX3NpZ2FsdHN0YWNrLCBzeXNfcGF1c2UKIC8qMzAqLwkubG9uZyBzeXNfdXRpbWUsIHN5c19sY2hvd24sIHN5c19mY2hvd24sIHN5c19hY2Nlc3MsIHN5c19uaWNlCiAvKjM1Ki8JLmxvbmcgc3lzX2Nob3duLCBzeXNfc3luYywgc3lzX2tpbGwsIHN5c19uZXdzdGF0LCBzeXNfc2VuZGZpbGUKLS8qNDAqLwkubG9uZyBzeXNfbmV3bHN0YXQsIHN5c19kdXAsIHN5c19waXBlLCBzeXNfdGltZXMsIHN5c19nZXR1aWQKKy8qNDAqLwkubG9uZyBzeXNfbmV3bHN0YXQsIHN5c19kdXAsIHN5c19zcGFyY19waXBlLCBzeXNfdGltZXMsIHN5c19nZXR1aWQKIC8qNDUqLwkubG9uZyBzeXNfdW1vdW50LCBzeXNfc2V0Z2lkMTYsIHN5c19nZXRnaWQxNiwgc3lzX3NpZ25hbCwgc3lzX2dldGV1aWQxNgogLyo1MCovCS5sb25nIHN5c19nZXRlZ2lkMTYsIHN5c19hY2N0LCBzeXNfbmlzX3N5c2NhbGwsIHN5c19nZXRnaWQsIHN5c19pb2N0bAogLyo1NSovCS5sb25nIHN5c19yZWJvb3QsIHN5c19tbWFwMiwgc3lzX3N5bWxpbmssIHN5c19yZWFkbGluaywgc3lzX2V4ZWN2ZQpAQCAtNTYsNyArNTYsNyBAQAogLyoxODUqLwkubG9uZyBzeXNfc2V0cGdpZCwgc3lzX2ZyZW1vdmV4YXR0ciwgc3lzX3RraWxsLCBzeXNfZXhpdF9ncm91cCwgc3lzX25ld3VuYW1lCiAvKjE5MCovCS5sb25nIHN5c19pbml0X21vZHVsZSwgc3lzX3BlcnNvbmFsaXR5LCBzcGFyY19yZW1hcF9maWxlX3BhZ2VzLCBzeXNfZXBvbGxfY3JlYXRlLCBzeXNfZXBvbGxfY3RsCiAvKjE5NSovCS5sb25nIHN5c19lcG9sbF93YWl0LCBzeXNfaW9wcmlvX3NldCwgc3lzX2dldHBwaWQsIHNwYXJjX3NpZ2FjdGlvbiwgc3lzX3NnZXRtYXNrCi0vKjIwMCovCS5sb25nIHN5c19zc2V0bWFzaywgc3lzX3NpZ3N1c3BlbmQsIHN5c19uZXdsc3RhdCwgc3lzX3VzZWxpYiwgb2xkX3JlYWRkaXIKKy8qMjAwKi8JLmxvbmcgc3lzX3NzZXRtYXNrLCBzeXNfc2lnc3VzcGVuZCwgc3lzX25ld2xzdGF0LCBzeXNfdXNlbGliLCBzeXNfb2xkX3JlYWRkaXIKIC8qMjA1Ki8JLmxvbmcgc3lzX3JlYWRhaGVhZCwgc3lzX3NvY2tldGNhbGwsIHN5c19zeXNsb2csIHN5c19sb29rdXBfZGNvb2tpZSwgc3lzX2ZhZHZpc2U2NAogLyoyMTAqLwkubG9uZyBzeXNfZmFkdmlzZTY0XzY0LCBzeXNfdGdraWxsLCBzeXNfd2FpdHBpZCwgc3lzX3N3YXBvZmYsIHN5c19zeXNpbmZvCiAvKjIxNSovCS5sb25nIHN5c19pcGMsIHN5c19zaWdyZXR1cm4sIHN5c19jbG9uZSwgc3lzX2lvcHJpb19nZXQsIHN5c19hZGp0aW1leApkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvc3lzdGJsc182NC5TIGIvYXJjaC9zcGFyYy9rZXJuZWwvc3lzdGJsc182NC5TCmluZGV4IDlmYzc4Y2YuLmU2MDA3YmIzIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC9zeXN0YmxzXzY0LlMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvc3lzdGJsc182NC5TCkBAIC0yNiw3ICsyNiw3IEBACiAvKjI1Ki8JLndvcmQgc3lzMzJfdm1zcGxpY2UsIGNvbXBhdF9zeXNfcHRyYWNlLCBzeXNfYWxhcm0sIHN5czMyX3NpZ2FsdHN0YWNrLCBzeXNfcGF1c2UKIC8qMzAqLwkud29yZCBjb21wYXRfc3lzX3V0aW1lLCBzeXNfbGNob3duLCBzeXNfZmNob3duLCBzeXMzMl9hY2Nlc3MsIHN5czMyX25pY2UKIAkud29yZCBzeXNfY2hvd24sIHN5c19zeW5jLCBzeXMzMl9raWxsLCBjb21wYXRfc3lzX25ld3N0YXQsIHN5czMyX3NlbmRmaWxlCi0vKjQwKi8JLndvcmQgY29tcGF0X3N5c19uZXdsc3RhdCwgc3lzX2R1cCwgc3lzX3BpcGUsIGNvbXBhdF9zeXNfdGltZXMsIHN5c19nZXR1aWQKKy8qNDAqLwkud29yZCBjb21wYXRfc3lzX25ld2xzdGF0LCBzeXNfZHVwLCBzeXNfc3BhcmNfcGlwZSwgY29tcGF0X3N5c190aW1lcywgc3lzX2dldHVpZAogCS53b3JkIHN5czMyX3Vtb3VudCwgc3lzX3NldGdpZDE2LCBzeXNfZ2V0Z2lkMTYsIHN5czMyX3NpZ25hbCwgc3lzX2dldGV1aWQxNgogLyo1MCovCS53b3JkIHN5c19nZXRlZ2lkMTYsIHN5c19hY2N0LCBzeXNfbmlzX3N5c2NhbGwsIHN5c19nZXRnaWQsIGNvbXBhdF9zeXNfaW9jdGwKIAkud29yZCBzeXMzMl9yZWJvb3QsIHN5czMyX21tYXAyLCBzeXNfc3ltbGluaywgc3lzMzJfcmVhZGxpbmssIHN5czMyX2V4ZWN2ZQpAQCAtMTAwLDcgKzEwMCw3IEBACiAvKjI1Ki8JLndvcmQgc3lzX3Ztc3BsaWNlLCBzeXNfcHRyYWNlLCBzeXNfYWxhcm0sIHN5c19zaWdhbHRzdGFjaywgc3lzX25pc19zeXNjYWxsCiAvKjMwKi8JLndvcmQgc3lzX3V0aW1lLCBzeXNfbmlzX3N5c2NhbGwsIHN5c19uaXNfc3lzY2FsbCwgc3lzX2FjY2Vzcywgc3lzX25pY2UKIAkud29yZCBzeXNfbmlzX3N5c2NhbGwsIHN5c19zeW5jLCBzeXNfa2lsbCwgc3lzX25ld3N0YXQsIHN5c19zZW5kZmlsZTY0Ci0vKjQwKi8JLndvcmQgc3lzX25ld2xzdGF0LCBzeXNfZHVwLCBzeXNfcGlwZSwgc3lzX3RpbWVzLCBzeXNfbmlzX3N5c2NhbGwKKy8qNDAqLwkud29yZCBzeXNfbmV3bHN0YXQsIHN5c19kdXAsIHN5c19zcGFyY19waXBlLCBzeXNfdGltZXMsIHN5c19uaXNfc3lzY2FsbAogCS53b3JkIHN5c191bW91bnQsIHN5c19zZXRnaWQsIHN5c19nZXRnaWQsIHN5c19zaWduYWwsIHN5c19nZXRldWlkCiAvKjUwKi8JLndvcmQgc3lzX2dldGVnaWQsIHN5c19hY2N0LCBzeXNfbWVtb3J5X29yZGVyaW5nLCBzeXNfbmlzX3N5c2NhbGwsIHN5c19pb2N0bAogCS53b3JkIHN5c19yZWJvb3QsIHN5c19uaXNfc3lzY2FsbCwgc3lzX3N5bWxpbmssIHN5c19yZWFkbGluaywgc3lzX2V4ZWN2ZQpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvdGltZV8zMi5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvdGltZV8zMi5jCmluZGV4IDAwZjczODMuLjYxNGFjN2IgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL3RpbWVfMzIuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC90aW1lXzMyLmMKQEAgLTQ4LDYgKzQ4LDggQEAKICNpbmNsdWRlICJpcnEuaCIKIAogREVGSU5FX1NQSU5MT0NLKHJ0Y19sb2NrKTsKK0VYUE9SVF9TWU1CT0wocnRjX2xvY2spOworCiBzdGF0aWMgaW50IHNldF9ydGNfbW1zcyh1bnNpZ25lZCBsb25nKTsKIHN0YXRpYyBpbnQgc2J1c19kb19zZXR0aW1lb2ZkYXkoc3RydWN0IHRpbWVzcGVjICp0dik7CiAKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL3RpbWVfNjQuYyBiL2FyY2gvc3BhcmMva2VybmVsL3RpbWVfNjQuYwppbmRleCA5ZGY4ZjA5Li4yZGIzYzIyIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC90aW1lXzY0LmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvdGltZV82NC5jCkBAIC0xMDYsNyArMTA2LDcgQEAKIAl0aWNrX2Rpc2FibGVfaXJxKCk7CiB9CiAKLXN0YXRpYyB1bnNpZ25lZCBsb25nIHRpY2tfZ2V0X3RpY2sodm9pZCkKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGxvbmcgdGlja19nZXRfdGljayh2b2lkKQogewogCXVuc2lnbmVkIGxvbmcgcmV0OwogCkBAIC0xNzYsNiArMTc2LDcgQEAKIH07CiAKIHN0cnVjdCBzcGFyYzY0X3RpY2tfb3BzICp0aWNrX29wcyBfX3JlYWRfbW9zdGx5ID0gJnRpY2tfb3BlcmF0aW9uczsKK0VYUE9SVF9TWU1CT0wodGlja19vcHMpOwogCiBzdGF0aWMgdm9pZCBzdGlja19kaXNhYmxlX2lycSh2b2lkKQogewpAQCAtMjA4LDcgKzIwOSw3IEBACiAJc3RpY2tfZGlzYWJsZV9pcnEoKTsKIH0KIAotc3RhdGljIHVuc2lnbmVkIGxvbmcgc3RpY2tfZ2V0X3RpY2sodm9pZCkKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGxvbmcgc3RpY2tfZ2V0X3RpY2sodm9pZCkKIHsKIAl1bnNpZ25lZCBsb25nIHJldDsKIApAQCAtMzUyLDcgKzM1Myw3IEBACiAJaGJ0aWNrX2Rpc2FibGVfaXJxKCk7CiB9CiAKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGhidGlja19nZXRfdGljayh2b2lkKQorc3RhdGljIHVuc2lnbmVkIGxvbmcgbG9uZyBoYnRpY2tfZ2V0X3RpY2sodm9pZCkKIHsKIAlyZXR1cm4gX19oYmlyZF9yZWFkX3N0aWNrKCkgJiB+VElDS19QUklWX0JJVDsKIH0KQEAgLTQyMiw3ICs0MjMsNyBAQAogewogCXN0cnVjdCByZXNvdXJjZSAqcjsKIAotCXByaW50ayhLRVJOX0lORk8gIiVzOiBSVEMgcmVncyBhdCAweCVseFxuIiwKKwlwcmludGsoS0VSTl9JTkZPICIlczogUlRDIHJlZ3MgYXQgMHglbGx4XG4iLAogCSAgICAgICBvcC0+bm9kZS0+ZnVsbF9uYW1lLCBvcC0+cmVzb3VyY2VbMF0uc3RhcnQpOwogCiAJLyogVGhlIENNT1MgUlRDIGRyaXZlciBvbmx5IGFjY2VwdHMgSU9SRVNPVVJDRV9JTywgc28gY29ucwpAQCAtNDc4LDcgKzQ3OSw3IEBACiBzdGF0aWMgaW50IF9fZGV2aW5pdCBicTQ4MDJfcHJvYmUoc3RydWN0IG9mX2RldmljZSAqb3AsIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoKQogewogCi0JcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEJRNDgwMiByZWdzIGF0IDB4JWx4XG4iLAorCXByaW50ayhLRVJOX0lORk8gIiVzOiBCUTQ4MDIgcmVncyBhdCAweCVsbHhcbiIsCiAJICAgICAgIG9wLT5ub2RlLT5mdWxsX25hbWUsIG9wLT5yZXNvdXJjZVswXS5zdGFydCk7CiAKIAlydGNfYnE0ODAyX2RldmljZS5yZXNvdXJjZSA9ICZvcC0+cmVzb3VyY2VbMF07CkBAIC01NDIsNyArNTQzLDcgQEAKIAkgICAgc3RyY21wKGRwLT5wYXJlbnQtPnBhcmVudC0+bmFtZSwgImNlbnRyYWwiKSAhPSAwKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCXByaW50ayhLRVJOX0lORk8gIiVzOiBNb3N0ZWsgcmVncyBhdCAweCVseFxuIiwKKwlwcmludGsoS0VSTl9JTkZPICIlczogTW9zdGVrIHJlZ3MgYXQgMHglbGx4XG4iLAogCSAgICAgICBkcC0+ZnVsbF9uYW1lLCBvcC0+cmVzb3VyY2VbMF0uc3RhcnQpOwogCiAJbTQ4dDU5X3J0Yy5yZXNvdXJjZSA9ICZvcC0+cmVzb3VyY2VbMF07CkBAIC02MzksNiArNjQwLDcgQEAKIAkJcmV0dXJuIGZ0LT5jbG9ja190aWNrX3JlZjsKIAlyZXR1cm4gY3B1X2RhdGEoY3B1KS5jbG9ja190aWNrOwogfQorRVhQT1JUX1NZTUJPTChzcGFyYzY0X2dldF9jbG9ja190aWNrKTsKIAogI2lmZGVmIENPTkZJR19DUFVfRlJFUQogCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC90cmFwc18zMi5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvdHJhcHNfMzIuYwppbmRleCAyMTM2NDViLi4zNTgyODMzIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC90cmFwc18zMi5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL3RyYXBzXzMyLmMKQEAgLTQyNCw2ICs0MjQsNyBAQAogICAgICAgICAvLyBidXN0X3NwaW5sb2NrcygxKTsgICBYWFggTm90IGluIG91ciBvcmlnaW5hbCBCVUcoKQogICAgICAgICBwcmludGsoImtlcm5lbCBCVUcgYXQgJXM6JWQhXG4iLCBmaWxlLCBsaW5lKTsKIH0KK0VYUE9SVF9TWU1CT0woZG9fQlVHKTsKICNlbmRpZgogCiAvKiBTaW5jZSB3ZSBoYXZlIG91ciBtYXBwaW5ncyBzZXQgdXAsIG9uIG11bHRpcHJvY2Vzc29ycyB3ZSBjYW4gc3BpbiB0aGVtCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC90cmFwc182NC5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvdHJhcHNfNjQuYwppbmRleCA0NjM4YWYyLi5jMmQxNTNkIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC90cmFwc182NC5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL3RyYXBzXzY0LmMKQEAgLTEyOCw2ICsxMjgsNyBAQAogCWJ1c3Rfc3BpbmxvY2tzKDEpOwogCXByaW50aygia2VybmVsIEJVRyBhdCAlczolZCFcbiIsIGZpbGUsIGxpbmUpOwogfQorRVhQT1JUX1NZTUJPTChkb19CVUcpOwogI2VuZGlmCiAKIHN0YXRpYyBERUZJTkVfU1BJTkxPQ0soZGltbV9oYW5kbGVyX2xvY2spOwpAQCAtMTE2OCwyMCArMTE2OSwyMCBAQAogCX0KIAogCS8qIE5vdyBkdW1wIHRoZSBjYWNoZSBzbmFwc2hvdHMuICovCi0JcHJpbnRrKCIlcyIgIkVSUk9SKCVkKTogRC1jYWNoZSBpZHhbJXhdIHRhZ1slMDE2bHhdIHV0YWdbJTAxNmx4XSBzdGFnWyUwMTZseF1cbiIsCisJcHJpbnRrKCIlcyIgIkVSUk9SKCVkKTogRC1jYWNoZSBpZHhbJXhdIHRhZ1slMDE2bGx4XSB1dGFnWyUwMTZsbHhdIHN0YWdbJTAxNmxseF1cbiIsCiAJICAgICAgIChyZWNvdmVyYWJsZSA/IEtFUk5fV0FSTklORyA6IEtFUk5fQ1JJVCksIHNtcF9wcm9jZXNzb3JfaWQoKSwKIAkgICAgICAgKGludCkgaW5mby0+ZGNhY2hlX2luZGV4LAogCSAgICAgICBpbmZvLT5kY2FjaGVfdGFnLAogCSAgICAgICBpbmZvLT5kY2FjaGVfdXRhZywKIAkgICAgICAgaW5mby0+ZGNhY2hlX3N0YWcpOwotCXByaW50aygiJXMiICJFUlJPUiglZCk6IEQtY2FjaGUgZGF0YTBbJTAxNmx4XSBkYXRhMVslMDE2bHhdIGRhdGEyWyUwMTZseF0gZGF0YTNbJTAxNmx4XVxuIiwKKwlwcmludGsoIiVzIiAiRVJST1IoJWQpOiBELWNhY2hlIGRhdGEwWyUwMTZsbHhdIGRhdGExWyUwMTZsbHhdIGRhdGEyWyUwMTZsbHhdIGRhdGEzWyUwMTZsbHhdXG4iLAogCSAgICAgICAocmVjb3ZlcmFibGUgPyBLRVJOX1dBUk5JTkcgOiBLRVJOX0NSSVQpLCBzbXBfcHJvY2Vzc29yX2lkKCksCiAJICAgICAgIGluZm8tPmRjYWNoZV9kYXRhWzBdLAogCSAgICAgICBpbmZvLT5kY2FjaGVfZGF0YVsxXSwKIAkgICAgICAgaW5mby0+ZGNhY2hlX2RhdGFbMl0sCiAJICAgICAgIGluZm8tPmRjYWNoZV9kYXRhWzNdKTsKLQlwcmludGsoIiVzIiAiRVJST1IoJWQpOiBJLWNhY2hlIGlkeFsleF0gdGFnWyUwMTZseF0gdXRhZ1slMDE2bHhdIHN0YWdbJTAxNmx4XSAiCi0JICAgICAgICJ1WyUwMTZseF0gbFslMDE2bHhdXG4iLAorCXByaW50aygiJXMiICJFUlJPUiglZCk6IEktY2FjaGUgaWR4WyV4XSB0YWdbJTAxNmxseF0gdXRhZ1slMDE2bGx4XSBzdGFnWyUwMTZsbHhdICIKKwkgICAgICAgInVbJTAxNmxseF0gbFslMDE2bGx4XVxuIiwKIAkgICAgICAgKHJlY292ZXJhYmxlID8gS0VSTl9XQVJOSU5HIDogS0VSTl9DUklUKSwgc21wX3Byb2Nlc3Nvcl9pZCgpLAogCSAgICAgICAoaW50KSBpbmZvLT5pY2FjaGVfaW5kZXgsCiAJICAgICAgIGluZm8tPmljYWNoZV90YWcsCkBAIC0xMTg5LDIyICsxMTkwLDIyIEBACiAJICAgICAgIGluZm8tPmljYWNoZV9zdGFnLAogCSAgICAgICBpbmZvLT5pY2FjaGVfdXBwZXIsCiAJICAgICAgIGluZm8tPmljYWNoZV9sb3dlcik7Ci0JcHJpbnRrKCIlcyIgIkVSUk9SKCVkKTogSS1jYWNoZSBJTlNOMFslMDE2bHhdIElOU04xWyUwMTZseF0gSU5TTjJbJTAxNmx4XSBJTlNOM1slMDE2bHhdXG4iLAorCXByaW50aygiJXMiICJFUlJPUiglZCk6IEktY2FjaGUgSU5TTjBbJTAxNmxseF0gSU5TTjFbJTAxNmxseF0gSU5TTjJbJTAxNmxseF0gSU5TTjNbJTAxNmxseF1cbiIsCiAJICAgICAgIChyZWNvdmVyYWJsZSA/IEtFUk5fV0FSTklORyA6IEtFUk5fQ1JJVCksIHNtcF9wcm9jZXNzb3JfaWQoKSwKIAkgICAgICAgaW5mby0+aWNhY2hlX2RhdGFbMF0sCiAJICAgICAgIGluZm8tPmljYWNoZV9kYXRhWzFdLAogCSAgICAgICBpbmZvLT5pY2FjaGVfZGF0YVsyXSwKIAkgICAgICAgaW5mby0+aWNhY2hlX2RhdGFbM10pOwotCXByaW50aygiJXMiICJFUlJPUiglZCk6IEktY2FjaGUgSU5TTjRbJTAxNmx4XSBJTlNONVslMDE2bHhdIElOU042WyUwMTZseF0gSU5TTjdbJTAxNmx4XVxuIiwKKwlwcmludGsoIiVzIiAiRVJST1IoJWQpOiBJLWNhY2hlIElOU040WyUwMTZsbHhdIElOU041WyUwMTZsbHhdIElOU042WyUwMTZsbHhdIElOU043WyUwMTZsbHhdXG4iLAogCSAgICAgICAocmVjb3ZlcmFibGUgPyBLRVJOX1dBUk5JTkcgOiBLRVJOX0NSSVQpLCBzbXBfcHJvY2Vzc29yX2lkKCksCiAJICAgICAgIGluZm8tPmljYWNoZV9kYXRhWzRdLAogCSAgICAgICBpbmZvLT5pY2FjaGVfZGF0YVs1XSwKIAkgICAgICAgaW5mby0+aWNhY2hlX2RhdGFbNl0sCiAJICAgICAgIGluZm8tPmljYWNoZV9kYXRhWzddKTsKLQlwcmludGsoIiVzIiAiRVJST1IoJWQpOiBFLWNhY2hlIGlkeFsleF0gdGFnWyUwMTZseF1cbiIsCisJcHJpbnRrKCIlcyIgIkVSUk9SKCVkKTogRS1jYWNoZSBpZHhbJXhdIHRhZ1slMDE2bGx4XVxuIiwKIAkgICAgICAgKHJlY292ZXJhYmxlID8gS0VSTl9XQVJOSU5HIDogS0VSTl9DUklUKSwgc21wX3Byb2Nlc3Nvcl9pZCgpLAogCSAgICAgICAoaW50KSBpbmZvLT5lY2FjaGVfaW5kZXgsIGluZm8tPmVjYWNoZV90YWcpOwotCXByaW50aygiJXMiICJFUlJPUiglZCk6IEUtY2FjaGUgZGF0YTBbJTAxNmx4XSBkYXRhMVslMDE2bHhdIGRhdGEyWyUwMTZseF0gZGF0YTNbJTAxNmx4XVxuIiwKKwlwcmludGsoIiVzIiAiRVJST1IoJWQpOiBFLWNhY2hlIGRhdGEwWyUwMTZsbHhdIGRhdGExWyUwMTZsbHhdIGRhdGEyWyUwMTZsbHhdIGRhdGEzWyUwMTZsbHhdXG4iLAogCSAgICAgICAocmVjb3ZlcmFibGUgPyBLRVJOX1dBUk5JTkcgOiBLRVJOX0NSSVQpLCBzbXBfcHJvY2Vzc29yX2lkKCksCiAJICAgICAgIGluZm8tPmVjYWNoZV9kYXRhWzBdLAogCSAgICAgICBpbmZvLT5lY2FjaGVfZGF0YVsxXSwKQEAgLTE3OTQsNyArMTc5NSw3IEBACiAJaW50IGNudDsKIAogCXByaW50aygiJXM6IFJlcG9ydGluZyBvbiBjcHUgJWRcbiIsIHBmeCwgY3B1KTsKLQlwcmludGsoIiVzOiBlcnJfaGFuZGxlWyVseF0gZXJyX3N0aWNrWyVseF0gZXJyX3R5cGVbJTA4eDolc11cbiIsCisJcHJpbnRrKCIlczogZXJyX2hhbmRsZVslbGx4XSBlcnJfc3RpY2tbJWxseF0gZXJyX3R5cGVbJTA4eDolc11cbiIsCiAJICAgICAgIHBmeCwKIAkgICAgICAgZW50LT5lcnJfaGFuZGxlLCBlbnQtPmVycl9zdGljaywKIAkgICAgICAgZW50LT5lcnJfdHlwZSwKQEAgLTE4MTgsNyArMTgxOSw3IEBACiAJCSJwcml2aWxlZ2VkIiA6ICIiKSwKIAkgICAgICAgKChlbnQtPmVycl9hdHRycyAmIFNVTjRWX0VSUl9BVFRSU19SRVNfUVVFVUVfRlVMTCkgPwogCQkicXVldWUtZnVsbCIgOiAiIikpOwotCXByaW50aygiJXM6IGVycl9yYWRkclslMDE2bHhdIGVycl9zaXplWyV1XSBlcnJfY3B1WyV1XVxuIiwKKwlwcmludGsoIiVzOiBlcnJfcmFkZHJbJTAxNmxseF0gZXJyX3NpemVbJXVdIGVycl9jcHVbJXVdXG4iLAogCSAgICAgICBwZngsCiAJICAgICAgIGVudC0+ZXJyX3JhZGRyLCBlbnQtPmVycl9zaXplLCBlbnQtPmVycl9jcHUpOwogCkBAIC0yMjYxLDYgKzIyNjIsNyBAQAogCQlkb19leGl0KFNJR0tJTEwpOwogCWRvX2V4aXQoU0lHU0VHVik7CiB9CitFWFBPUlRfU1lNQk9MKGRpZV9pZl9rZXJuZWwpOwogCiAjZGVmaW5lIFZJU19PUENPREVfTUFTSwkoKDB4MyA8PCAzMCkgfCAoMHgzZiA8PCAxOSkpCiAjZGVmaW5lIFZJU19PUENPREVfVkFMCSgoMHgyIDw8IDMwKSB8ICgweDM2IDw8IDE5KSkKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL3VuYWxpZ25lZF82NC5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvdW5hbGlnbmVkXzY0LmMKaW5kZXggMjAzZGRmYS4uMzc5MjA5OSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvdW5hbGlnbmVkXzY0LmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvdW5hbGlnbmVkXzY0LmMKQEAgLTU4OSw3ICs1ODksNiBAQAogCXVuc2lnbmVkIGxvbmcgcGMgPSByZWdzLT50cGM7CiAJdW5zaWduZWQgbG9uZyB0c3RhdGUgPSByZWdzLT50c3RhdGU7CiAJdTMyIGluc247Ci0JdTMyIGZpcnN0LCBzZWNvbmQ7CiAJdTY0IHZhbHVlOwogCXU4IGZyZWc7CiAJaW50IGZsYWc7CkBAIC02MDEsMTUgKzYwMCwyMCBAQAogCQlwYyA9ICh1MzIpcGM7CiAJaWYgKGdldF91c2VyKGluc24sICh1MzIgX191c2VyICopIHBjKSAhPSAtRUZBVUxUKSB7CiAJCWludCBhc2kgPSBkZWNvZGVfYXNpKGluc24sIHJlZ3MpOworCQl1MzIgZmlyc3QsIHNlY29uZDsKKwkJaW50IGVycjsKKwogCQlpZiAoKGFzaSA+IEFTSV9TTkZMKSB8fAogCQkgICAgKGFzaSA8IEFTSV9QKSkKIAkJCWdvdG8gZGFleDsKLQkJaWYgKGdldF91c2VyKGZpcnN0LCAodTMyIF9fdXNlciAqKXNmYXIpIHx8Ci0JCSAgICAgZ2V0X3VzZXIoc2Vjb25kLCAodTMyIF9fdXNlciAqKShzZmFyICsgNCkpKSB7Ci0JCQlpZiAoYXNpICYgMHgyKSAvKiBORiAqLyB7Ci0JCQkJZmlyc3QgPSAwOyBzZWNvbmQgPSAwOwotCQkJfSBlbHNlCisJCWZpcnN0ID0gc2Vjb25kID0gMDsKKwkJZXJyID0gZ2V0X3VzZXIoZmlyc3QsICh1MzIgX191c2VyICopc2Zhcik7CisJCWlmICghZXJyKQorCQkJZXJyID0gZ2V0X3VzZXIoc2Vjb25kLCAodTMyIF9fdXNlciAqKShzZmFyICsgNCkpOworCQlpZiAoZXJyKSB7CisJCQlpZiAoIShhc2kgJiAweDIpKQogCQkJCWdvdG8gZGFleDsKKwkJCWZpcnN0ID0gc2Vjb25kID0gMDsKIAkJfQogCQlzYXZlX2FuZF9jbGVhcl9mcHUoKTsKIAkJZnJlZyA9ICgoaW5zbiA+PiAyNSkgJiAweDFlKSB8ICgoaW5zbiA+PiAyMCkgJiAweDIwKTsKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL3Zpby5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvdmlvLmMKaW5kZXggOTJiMWY4ZS4uNzUzZDEyOCAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvdmlvLmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvdmlvLmMKQEAgLTI2MywxMCArMjYzLDEwIEBACiAJCWRldl9zZXRfbmFtZSgmdmRldi0+ZGV2LCAiJXMiLCBidXNfaWRfbmFtZSk7CiAJCXZkZXYtPmRldl9ubyA9IH4odTY0KTA7CiAJfSBlbHNlIGlmICghY2ZnX2hhbmRsZSkgewotCQlkZXZfc2V0X25hbWUoJnZkZXYtPmRldiwgIiVzLSVsdSIsIGJ1c19pZF9uYW1lLCAqaWQpOworCQlkZXZfc2V0X25hbWUoJnZkZXYtPmRldiwgIiVzLSVsbHUiLCBidXNfaWRfbmFtZSwgKmlkKTsKIAkJdmRldi0+ZGV2X25vID0gKmlkOwogCX0gZWxzZSB7Ci0JCWRldl9zZXRfbmFtZSgmdmRldi0+ZGV2LCAiJXMtJWx1LSVsdSIsIGJ1c19pZF9uYW1lLAorCQlkZXZfc2V0X25hbWUoJnZkZXYtPmRldiwgIiVzLSVsbHUtJWxsdSIsIGJ1c19pZF9uYW1lLAogCQkJICAgICAqY2ZnX2hhbmRsZSwgKmlkKTsKIAkJdmRldi0+ZGV2X25vID0gKmNmZ19oYW5kbGU7CiAJfQpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvdmlvaHMuYyBiL2FyY2gvc3BhcmMva2VybmVsL3Zpb2hzLmMKaW5kZXggNzA4ZmExNy4uYWE2YWM3MCAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvdmlvaHMuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC92aW9ocy5jCkBAIC0zMzcsOCArMzM3LDEwIEBACiAJdmlvZGJnKEhTLCAiR09UIFZFUlNJT04gTkFDSyBtYWpbJXVdIG1pblsldV0gZGV2Y2xhc3NbJXVdXG4iLAogCSAgICAgICBwa3QtPm1ham9yLCBwa3QtPm1pbm9yLCBwa3QtPmRldl9jbGFzcyk7CiAKLQlpZiAoKHBrdC0+bWFqb3IgPT0gMCAmJiBwa3QtPm1pbm9yID09IDApIHx8Ci0JICAgICEobnZlciA9IGZpbmRfYnlfbWFqb3IodmlvLCBwa3QtPm1ham9yKSkpCisJaWYgKHBrdC0+bWFqb3IgPT0gMCAmJiBwa3QtPm1pbm9yID09IDApCisJCXJldHVybiBoYW5kc2hha2VfZmFpbHVyZSh2aW8pOworCW52ZXIgPSBmaW5kX2J5X21ham9yKHZpbywgcGt0LT5tYWpvcik7CisJaWYgKCFudmVyKQogCQlyZXR1cm4gaGFuZHNoYWtlX2ZhaWx1cmUodmlvKTsKIAogCWlmIChzZW5kX3ZlcnNpb24odmlvLCBudmVyLT5tYWpvciwgbnZlci0+bWlub3IpIDwgMCkKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvbGliL01ha2VmaWxlIGIvYXJjaC9zcGFyYy9saWIvTWFrZWZpbGUKaW5kZXggMzc1MDE2ZS4uMjczZmM4NSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9saWIvTWFrZWZpbGUKKysrIGIvYXJjaC9zcGFyYy9saWIvTWFrZWZpbGUKQEAgLTQyLDMgKzQyLDQgQEAKIAogb2JqLXkgICAgICAgICAgICAgICAgICs9IGlvbWFwLm8KIG9iai0kKENPTkZJR19TUEFSQzMyKSArPSBhdG9taWMzMi5vCitvYmoteSAgICAgICAgICAgICAgICAgKz0ga3N5bXMubwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9saWIvUGVlQ2VlSS5jIGIvYXJjaC9zcGFyYy9saWIvUGVlQ2VlSS5jCmluZGV4IDQ2MDUzZTYuLjY1MjlmODYgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMvbGliL1BlZUNlZUkuYworKysgYi9hcmNoL3NwYXJjL2xpYi9QZWVDZWVJLmMKQEAgLTQsNiArNCw4IEBACiAgKiBDb3B5cmlnaHQgKEMpIDE5OTcgRGF2aWQgUy4gTWlsbGVyIChkYXZlbUBjYWlwLnJ1dGdlcnMuZWR1KQogICovCiAKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKwogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KIApAQCAtMTUsNiArMTcsNyBAQAogCXdoaWxlIChjb3VudC0tKQogCQlvdXRiKCpwKyssIGFkZHIpOwogfQorRVhQT1JUX1NZTUJPTChvdXRzYik7CiAKIHZvaWQgb3V0c3codW5zaWduZWQgbG9uZyBfX2FkZHIsIGNvbnN0IHZvaWQgKnNyYywgdW5zaWduZWQgbG9uZyBjb3VudCkKIHsKQEAgLTI1LDYgKzI4LDcgQEAKIAkJc3JjICs9IHNpemVvZih1MTYpOwogCX0KIH0KK0VYUE9SVF9TWU1CT0wob3V0c3cpOwogCiB2b2lkIG91dHNsKHVuc2lnbmVkIGxvbmcgX19hZGRyLCBjb25zdCB2b2lkICpzcmMsIHVuc2lnbmVkIGxvbmcgY291bnQpCiB7CkBAIC03OCw2ICs4Miw3IEBACiAJCWJyZWFrOwogCX0KIH0KK0VYUE9SVF9TWU1CT0wob3V0c2wpOwogCiB2b2lkIGluc2IodW5zaWduZWQgbG9uZyBfX2FkZHIsIHZvaWQgKmRzdCwgdW5zaWduZWQgbG9uZyBjb3VudCkKIHsKQEAgLTEwNSw2ICsxMTAsNyBAQAogCQkJKnBiKysgPSBpbmIoYWRkcik7CiAJfQogfQorRVhQT1JUX1NZTUJPTChpbnNiKTsKIAogdm9pZCBpbnN3KHVuc2lnbmVkIGxvbmcgX19hZGRyLCB2b2lkICpkc3QsIHVuc2lnbmVkIGxvbmcgY291bnQpCiB7CkBAIC0xMzIsNiArMTM4LDcgQEAKIAkJCSpwcyA9IGxlMTZfdG9fY3B1KGludyhhZGRyKSk7CiAJfQogfQorRVhQT1JUX1NZTUJPTChpbnN3KTsKIAogdm9pZCBpbnNsKHVuc2lnbmVkIGxvbmcgX19hZGRyLCB2b2lkICpkc3QsIHVuc2lnbmVkIGxvbmcgY291bnQpCiB7CkBAIC0yMDAsNCArMjA3LDUgQEAKIAkJfQogCX0KIH0KK0VYUE9SVF9TWU1CT0woaW5zbCk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvbGliL2tzeW1zLmMgYi9hcmNoL3NwYXJjL2xpYi9rc3ltcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwNGIxMjYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3NwYXJjL2xpYi9rc3ltcy5jCkBAIC0wLDAgKzEsMTk2IEBACisvKgorICogRXhwb3J0IG9mIHN5bWJvbHMgZGVmaW5lZCBpbiBhc3NlbWJsZXIKKyAqLworCisvKiBUZWxsIHN0cmluZy5oIHdlIGRvbid0IHdhbnQgbWVtY3B5IGV0Yy4gYXMgY3BwIGRlZmluZXMgKi8KKyNkZWZpbmUgRVhQT1JUX1NZTVRBQl9TVFJPUFMKKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNpbmNsdWRlIDxhc20vY2hlY2tzdW0uaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9mdHJhY2UuaD4KKworLyogc3RyaW5nIGZ1bmN0aW9ucyAqLworRVhQT1JUX1NZTUJPTChzdHJsZW4pOworRVhQT1JUX1NZTUJPTChfX3N0cmxlbl91c2VyKTsKK0VYUE9SVF9TWU1CT0woX19zdHJubGVuX3VzZXIpOworRVhQT1JUX1NZTUJPTChzdHJuY21wKTsKKworLyogbWVtKiBmdW5jdGlvbnMgKi8KK2V4dGVybiB2b2lkICpfX21lbXNjYW5femVybyh2b2lkICosIHNpemVfdCk7CitleHRlcm4gdm9pZCAqX19tZW1zY2FuX2dlbmVyaWModm9pZCAqLCBpbnQsIHNpemVfdCk7CitleHRlcm4gdm9pZCAqX19iemVybyh2b2lkICosIHNpemVfdCk7CisKK0VYUE9SVF9TWU1CT0wobWVtc2Nhbik7CitFWFBPUlRfU1lNQk9MKF9fbWVtc2Nhbl96ZXJvKTsKK0VYUE9SVF9TWU1CT0woX19tZW1zY2FuX2dlbmVyaWMpOworRVhQT1JUX1NZTUJPTChtZW1jbXApOworRVhQT1JUX1NZTUJPTChtZW1jcHkpOworRVhQT1JUX1NZTUJPTChtZW1zZXQpOworRVhQT1JUX1NZTUJPTChfX21lbXNldCk7CitFWFBPUlRfU1lNQk9MKG1lbW1vdmUpOworRVhQT1JUX1NZTUJPTChfX2J6ZXJvKTsKKworLyogTW92aW5nIGRhdGEgdG8vZnJvbS9pbiB1c2Vyc3BhY2UuICovCitFWFBPUlRfU1lNQk9MKF9fc3RybmNweV9mcm9tX3VzZXIpOworCisvKiBOZXR3b3JraW5nIGhlbHBlciByb3V0aW5lcy4gKi8KK0VYUE9SVF9TWU1CT0woY3N1bV9wYXJ0aWFsKTsKKworI2lmZGVmIENPTkZJR19NQ09VTlQKK0VYUE9SVF9TWU1CT0woX21jb3VudCk7CisjZW5kaWYKKworLyoKKyAqIHNwYXJjCisgKi8KKyNpZmRlZiBDT05GSUdfU1BBUkMzMgorZXh0ZXJuIGludCBfX2FzaHJkaTMoaW50LCBpbnQpOworZXh0ZXJuIGludCBfX2FzaGxkaTMoaW50LCBpbnQpOworZXh0ZXJuIGludCBfX2xzaHJkaTMoaW50LCBpbnQpOworZXh0ZXJuIGludCBfX211bGRpMyhpbnQsIGludCk7CitleHRlcm4gaW50IF9fZGl2ZGkzKGludCwgaW50KTsKKworZXh0ZXJuIHZvaWQgKCpfX2NvcHlfMXBhZ2UpKHZvaWQgKiwgY29uc3Qgdm9pZCAqKTsKK2V4dGVybiB2b2lkICgqYnplcm9fMXBhZ2UpKHZvaWQgKik7CisKK2V4dGVybiBpbnQgX19zdHJuY21wKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBfX2tlcm5lbF9zaXplX3QpOworCitleHRlcm4gdm9pZCBfX19yd19yZWFkX2VudGVyKHZvaWQpOworZXh0ZXJuIHZvaWQgX19fcndfcmVhZF90cnkodm9pZCk7CitleHRlcm4gdm9pZCBfX19yd19yZWFkX2V4aXQodm9pZCk7CitleHRlcm4gdm9pZCBfX19yd193cml0ZV9lbnRlcih2b2lkKTsKK2V4dGVybiB2b2lkIF9fX2F0b21pYzI0X2FkZCh2b2lkKTsKK2V4dGVybiB2b2lkIF9fX2F0b21pYzI0X3N1Yih2b2lkKTsKKworLyogQWxpYXMgZnVuY3Rpb25zIHdob3NlIG5hbWVzIGJlZ2luIHdpdGggIi4iIGFuZCBleHBvcnQgdGhlIGFsaWFzZXMuCisgKiBUaGUgbW9kdWxlIHJlZmVyZW5jZXMgd2lsbCBiZSBmaXhlZCB1cCBieSBtb2R1bGVfZnJvYl9hcmNoX3NlY3Rpb25zLgorICovCitleHRlcm4gaW50IF9EaXYoaW50LCBpbnQpOworZXh0ZXJuIGludCBfTXVsKGludCwgaW50KTsKK2V4dGVybiBpbnQgX1JlbShpbnQsIGludCk7CitleHRlcm4gdW5zaWduZWQgX1VkaXYodW5zaWduZWQsIHVuc2lnbmVkKTsKK2V4dGVybiB1bnNpZ25lZCBfVW11bCh1bnNpZ25lZCwgdW5zaWduZWQpOworZXh0ZXJuIHVuc2lnbmVkIF9VcmVtKHVuc2lnbmVkLCB1bnNpZ25lZCk7CisKKy8qIE5ldHdvcmtpbmcgaGVscGVyIHJvdXRpbmVzLiAqLworRVhQT1JUX1NZTUJPTChfX2NzdW1fcGFydGlhbF9jb3B5X3NwYXJjX2dlbmVyaWMpOworCisvKiBTcGVjaWFsIGludGVybmFsIHZlcnNpb25zIG9mIGxpYnJhcnkgZnVuY3Rpb25zLiAqLworRVhQT1JUX1NZTUJPTChfX2NvcHlfMXBhZ2UpOworRVhQT1JUX1NZTUJPTChfX21lbWNweSk7CitFWFBPUlRfU1lNQk9MKF9fbWVtbW92ZSk7CitFWFBPUlRfU1lNQk9MKGJ6ZXJvXzFwYWdlKTsKKworLyogc3RyaW5nIGZ1bmN0aW9ucyAqLworRVhQT1JUX1NZTUJPTChfX3N0cm5jbXApOworCisvKiBNb3ZpbmcgZGF0YSB0by9mcm9tL2luIHVzZXJzcGFjZS4gKi8KK0VYUE9SVF9TWU1CT0woX19jb3B5X3VzZXIpOworCisvKiBVc2VkIGJ5IGFzbS9zcGlubG9jay5oICovCisjaWZkZWYgQ09ORklHX1NNUAorRVhQT1JUX1NZTUJPTChfX19yd19yZWFkX2VudGVyKTsKK0VYUE9SVF9TWU1CT0woX19fcndfcmVhZF90cnkpOworRVhQT1JUX1NZTUJPTChfX19yd19yZWFkX2V4aXQpOworRVhQT1JUX1NZTUJPTChfX19yd193cml0ZV9lbnRlcik7CisjZW5kaWYKKworLyogQXRvbWljIG9wZXJhdGlvbnMuICovCitFWFBPUlRfU1lNQk9MKF9fX2F0b21pYzI0X2FkZCk7CitFWFBPUlRfU1lNQk9MKF9fX2F0b21pYzI0X3N1Yik7CisKK0VYUE9SVF9TWU1CT0woX19hc2hyZGkzKTsKK0VYUE9SVF9TWU1CT0woX19hc2hsZGkzKTsKK0VYUE9SVF9TWU1CT0woX19sc2hyZGkzKTsKK0VYUE9SVF9TWU1CT0woX19tdWxkaTMpOworRVhQT1JUX1NZTUJPTChfX2RpdmRpMyk7CisKK0VYUE9SVF9TWU1CT0woX1JlbSk7CitFWFBPUlRfU1lNQk9MKF9VcmVtKTsKK0VYUE9SVF9TWU1CT0woX011bCk7CitFWFBPUlRfU1lNQk9MKF9VbXVsKTsKK0VYUE9SVF9TWU1CT0woX0Rpdik7CitFWFBPUlRfU1lNQk9MKF9VZGl2KTsKKyNlbmRpZgorCisvKgorICogc3BhcmM2NAorICovCisjaWZkZWYgQ09ORklHX1NQQVJDNjQKKy8qIE5ldHdvcmtpbmcgaGVscGVyIHJvdXRpbmVzLiAqLworRVhQT1JUX1NZTUJPTChjc3VtX3BhcnRpYWxfY29weV9ub2NoZWNrKTsKK0VYUE9SVF9TWU1CT0woX19jc3VtX3BhcnRpYWxfY29weV9mcm9tX3VzZXIpOworRVhQT1JUX1NZTUJPTChfX2NzdW1fcGFydGlhbF9jb3B5X3RvX3VzZXIpOworRVhQT1JUX1NZTUJPTChpcF9mYXN0X2NzdW0pOworCisvKiBNb3ZpbmcgZGF0YSB0by9mcm9tL2luIHVzZXJzcGFjZS4gKi8KK0VYUE9SVF9TWU1CT0woX19fY29weV90b191c2VyKTsKK0VYUE9SVF9TWU1CT0woX19fY29weV9mcm9tX3VzZXIpOworRVhQT1JUX1NZTUJPTChfX19jb3B5X2luX3VzZXIpOworRVhQT1JUX1NZTUJPTChfX2NsZWFyX3VzZXIpOworCisvKiBSVyBzZW1hcGhvcmVzICovCitFWFBPUlRfU1lNQk9MKF9fZG93bl9yZWFkKTsKK0VYUE9SVF9TWU1CT0woX19kb3duX3JlYWRfdHJ5bG9jayk7CitFWFBPUlRfU1lNQk9MKF9fZG93bl93cml0ZSk7CitFWFBPUlRfU1lNQk9MKF9fZG93bl93cml0ZV90cnlsb2NrKTsKK0VYUE9SVF9TWU1CT0woX191cF9yZWFkKTsKK0VYUE9SVF9TWU1CT0woX191cF93cml0ZSk7CitFWFBPUlRfU1lNQk9MKF9fZG93bmdyYWRlX3dyaXRlKTsKKworLyogQXRvbWljIGNvdW50ZXIgaW1wbGVtZW50YXRpb24uICovCitFWFBPUlRfU1lNQk9MKGF0b21pY19hZGQpOworRVhQT1JUX1NZTUJPTChhdG9taWNfYWRkX3JldCk7CitFWFBPUlRfU1lNQk9MKGF0b21pY19zdWIpOworRVhQT1JUX1NZTUJPTChhdG9taWNfc3ViX3JldCk7CitFWFBPUlRfU1lNQk9MKGF0b21pYzY0X2FkZCk7CitFWFBPUlRfU1lNQk9MKGF0b21pYzY0X2FkZF9yZXQpOworRVhQT1JUX1NZTUJPTChhdG9taWM2NF9zdWIpOworRVhQT1JUX1NZTUJPTChhdG9taWM2NF9zdWJfcmV0KTsKKworLyogQXRvbWljIGJpdCBvcGVyYXRpb25zLiAqLworRVhQT1JUX1NZTUJPTCh0ZXN0X2FuZF9zZXRfYml0KTsKK0VYUE9SVF9TWU1CT0wodGVzdF9hbmRfY2xlYXJfYml0KTsKK0VYUE9SVF9TWU1CT0wodGVzdF9hbmRfY2hhbmdlX2JpdCk7CitFWFBPUlRfU1lNQk9MKHNldF9iaXQpOworRVhQT1JUX1NZTUJPTChjbGVhcl9iaXQpOworRVhQT1JUX1NZTUJPTChjaGFuZ2VfYml0KTsKKworLyogU3BlY2lhbCBpbnRlcm5hbCB2ZXJzaW9ucyBvZiBsaWJyYXJ5IGZ1bmN0aW9ucy4gKi8KK0VYUE9SVF9TWU1CT0woX2NsZWFyX3BhZ2UpOworRVhQT1JUX1NZTUJPTChjbGVhcl91c2VyX3BhZ2UpOworRVhQT1JUX1NZTUJPTChjb3B5X3VzZXJfcGFnZSk7CisKKy8qIFJBSUQgY29kZSBuZWVkcyB0aGlzICovCit2b2lkIFZJU2VudGVyKHZvaWQpOworRVhQT1JUX1NZTUJPTChWSVNlbnRlcik7CisKK2V4dGVybiB2b2lkIHhvcl92aXNfMih1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nICosIHVuc2lnbmVkIGxvbmcgKik7CitleHRlcm4gdm9pZCB4b3JfdmlzXzModW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZyAqLCB1bnNpZ25lZCBsb25nICosCisJCXVuc2lnbmVkIGxvbmcgKik7CitleHRlcm4gdm9pZCB4b3JfdmlzXzQodW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZyAqLCB1bnNpZ25lZCBsb25nICosCisJCXVuc2lnbmVkIGxvbmcgKiwgdW5zaWduZWQgbG9uZyAqKTsKK2V4dGVybiB2b2lkIHhvcl92aXNfNSh1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nICosIHVuc2lnbmVkIGxvbmcgKiwKKwkJdW5zaWduZWQgbG9uZyAqLCB1bnNpZ25lZCBsb25nICosIHVuc2lnbmVkIGxvbmcgKik7CitFWFBPUlRfU1lNQk9MKHhvcl92aXNfMik7CitFWFBPUlRfU1lNQk9MKHhvcl92aXNfMyk7CitFWFBPUlRfU1lNQk9MKHhvcl92aXNfNCk7CitFWFBPUlRfU1lNQk9MKHhvcl92aXNfNSk7CisKK2V4dGVybiB2b2lkIHhvcl9uaWFnYXJhXzIodW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZyAqLCB1bnNpZ25lZCBsb25nICopOworZXh0ZXJuIHZvaWQgeG9yX25pYWdhcmFfMyh1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nICosIHVuc2lnbmVkIGxvbmcgKiwKKwkJdW5zaWduZWQgbG9uZyAqKTsKK2V4dGVybiB2b2lkIHhvcl9uaWFnYXJhXzQodW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZyAqLCB1bnNpZ25lZCBsb25nICosCisJCXVuc2lnbmVkIGxvbmcgKiwgdW5zaWduZWQgbG9uZyAqKTsKK2V4dGVybiB2b2lkIHhvcl9uaWFnYXJhXzUodW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZyAqLCB1bnNpZ25lZCBsb25nICosCisJCXVuc2lnbmVkIGxvbmcgKiwgdW5zaWduZWQgbG9uZyAqLCB1bnNpZ25lZCBsb25nICopOworCitFWFBPUlRfU1lNQk9MKHhvcl9uaWFnYXJhXzIpOworRVhQT1JUX1NZTUJPTCh4b3JfbmlhZ2FyYV8zKTsKK0VYUE9SVF9TWU1CT0woeG9yX25pYWdhcmFfNCk7CitFWFBPUlRfU1lNQk9MKHhvcl9uaWFnYXJhXzUpOworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2xpYi91c2VyX2ZpeHVwLmMgYi9hcmNoL3NwYXJjL2xpYi91c2VyX2ZpeHVwLmMKaW5kZXggMDVhMzYxYi4uYWM5NmFlMiAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9saWIvdXNlcl9maXh1cC5jCisrKyBiL2FyY2gvc3BhcmMvbGliL3VzZXJfZml4dXAuYwpAQCAtNyw2ICs3LDggQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KIAogLyogQ2FsY3VsYXRpbmcgdGhlIGV4YWN0IGZhdWx0IGFkZHJlc3Mgd2hlbiB1c2luZwpAQCAtNDAsNiArNDIsNyBAQAogCiAJcmV0dXJuIHNpemU7CiB9CitFWFBPUlRfU1lNQk9MKGNvcHlfZnJvbV91c2VyX2ZpeHVwKTsKIAogdW5zaWduZWQgbG9uZyBjb3B5X3RvX3VzZXJfZml4dXAodm9pZCBfX3VzZXIgKnRvLCBjb25zdCB2b2lkICpmcm9tLCB1bnNpZ25lZCBsb25nIHNpemUpCiB7CkBAIC00Nyw2ICs1MCw3IEBACiAKIAlyZXR1cm4gY29tcHV0ZV9zaXplKCh1bnNpZ25lZCBsb25nKSB0bywgc2l6ZSwgJm9mZnNldCk7CiB9CitFWFBPUlRfU1lNQk9MKGNvcHlfdG9fdXNlcl9maXh1cCk7CiAKIHVuc2lnbmVkIGxvbmcgY29weV9pbl91c2VyX2ZpeHVwKHZvaWQgX191c2VyICp0bywgdm9pZCBfX3VzZXIgKmZyb20sIHVuc2lnbmVkIGxvbmcgc2l6ZSkKIHsKQEAgLTY0LDMgKzY4LDQgQEAKIAogCXJldHVybiBzaXplOwogfQorRVhQT1JUX1NZTUJPTChjb3B5X2luX3VzZXJfZml4dXApOwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9tbS9mYXVsdF8zMi5jIGIvYXJjaC9zcGFyYy9tbS9mYXVsdF8zMi5jCmluZGV4IGE1MDdlMTEuLjEyZTQ0N2YgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMvbW0vZmF1bHRfMzIuYworKysgYi9hcmNoL3NwYXJjL21tL2ZhdWx0XzMyLmMKQEAgLTI4Myw3ICsyODMsOCBAQAogCS8qIElzIHRoaXMgaW4gZXhfdGFibGU/ICovCiBub19jb250ZXh0OgogCWcyID0gcmVncy0+dV9yZWdzW1VSRUdfRzJdOwotCWlmICghZnJvbV91c2VyICYmIChmaXh1cCA9IHNlYXJjaF9leHRhYmxlc19yYW5nZShyZWdzLT5wYywgJmcyKSkpIHsKKwlpZiAoIWZyb21fdXNlcikgeworCQlmaXh1cCA9IHNlYXJjaF9leHRhYmxlc19yYW5nZShyZWdzLT5wYywgJmcyKTsKIAkJaWYgKGZpeHVwID4gMTApIHsgLyogVmFsdWVzIGJlbG93IGFyZSByZXNlcnZlZCBmb3Igb3RoZXIgdGhpbmdzICovCiAJCQlleHRlcm4gY29uc3QgdW5zaWduZWQgX19tZW1zZXRfc3RhcnRbXTsKIAkJCWV4dGVybiBjb25zdCB1bnNpZ25lZCBfX21lbXNldF9lbmRbXTsKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvbW0vZ2VuZXJpY18zMi5jIGIvYXJjaC9zcGFyYy9tbS9nZW5lcmljXzMyLmMKaW5kZXggYTI4OTI2MS4uNWVkY2FjMSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9tbS9nZW5lcmljXzMyLmMKKysrIGIvYXJjaC9zcGFyYy9tbS9nZW5lcmljXzMyLmMKQEAgLTk1LDMgKzk1LDQgQEAKIAlmbHVzaF90bGJfcmFuZ2Uodm1hLCBiZWcsIGVuZCk7CiAJcmV0dXJuIGVycm9yOwogfQorRVhQT1JUX1NZTUJPTChpb19yZW1hcF9wZm5fcmFuZ2UpOwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9tbS9nZW5lcmljXzY0LmMgYi9hcmNoL3NwYXJjL21tL2dlbmVyaWNfNjQuYwppbmRleCBmMzYyYzIwLi4wNGYyYmY0IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL21tL2dlbmVyaWNfNjQuYworKysgYi9hcmNoL3NwYXJjL21tL2dlbmVyaWNfNjQuYwpAQCAtMTYxLDMgKzE2MSw0IEBACiAJZmx1c2hfdGxiX3JhbmdlKHZtYSwgYmVnLCBlbmQpOwogCXJldHVybiBlcnJvcjsKIH0KK0VYUE9SVF9TWU1CT0woaW9fcmVtYXBfcGZuX3JhbmdlKTsKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvbW0vaGlnaG1lbS5jIGIvYXJjaC9zcGFyYy9tbS9oaWdobWVtLmMKaW5kZXggMDFmYzZjMi4uNzUyZDBjOSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9tbS9oaWdobWVtLmMKKysrIGIvYXJjaC9zcGFyYy9tbS9oaWdobWVtLmMKQEAgLTYyLDYgKzYyLDcgQEAKIAogCXJldHVybiAodm9pZCopIHZhZGRyOwogfQorRVhQT1JUX1NZTUJPTChrbWFwX2F0b21pYyk7CiAKIHZvaWQga3VubWFwX2F0b21pYyh2b2lkICprdmFkZHIsIGVudW0ga21fdHlwZSB0eXBlKQogewpAQCAtOTgsNiArOTksNyBAQAogCiAJcGFnZWZhdWx0X2VuYWJsZSgpOwogfQorRVhQT1JUX1NZTUJPTChrdW5tYXBfYXRvbWljKTsKIAogLyogV2UgbWF5IGJlIGZlZCBhIHBhZ2V0YWJsZSBoZXJlIGJ5IHB0ZXBfdG9feHh4IGFuZCBvdGhlcnMuICovCiBzdHJ1Y3QgcGFnZSAqa21hcF9hdG9taWNfdG9fcGFnZSh2b2lkICpwdHIpCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL21tL2luaXRfMzIuYyBiL2FyY2gvc3BhcmMvbW0vaW5pdF8zMi5jCmluZGV4IGZlYzkyNjAuLmNiYjI4MmQgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMvbW0vaW5pdF8zMi5jCisrKyBiL2FyY2gvc3BhcmMvbW0vaW5pdF8zMi5jCkBAIC0zOCwxMSArMzgsMTYgQEAKIERFRklORV9QRVJfQ1BVKHN0cnVjdCBtbXVfZ2F0aGVyLCBtbXVfZ2F0aGVycyk7CiAKIHVuc2lnbmVkIGxvbmcgKnNwYXJjX3ZhbGlkX2FkZHJfYml0bWFwOworRVhQT1JUX1NZTUJPTChzcGFyY192YWxpZF9hZGRyX2JpdG1hcCk7CiAKIHVuc2lnbmVkIGxvbmcgcGh5c19iYXNlOworRVhQT1JUX1NZTUJPTChwaHlzX2Jhc2UpOworCiB1bnNpZ25lZCBsb25nIHBmbl9iYXNlOworRVhQT1JUX1NZTUJPTChwZm5fYmFzZSk7CiAKIHVuc2lnbmVkIGxvbmcgcGFnZV9rZXJuZWw7CitFWFBPUlRfU1lNQk9MKHBhZ2Vfa2VybmVsKTsKIAogc3RydWN0IHNwYXJjX3BoeXNfYmFua3Mgc3BfYmFua3NbU1BBUkNfUEhZU19CQU5LUysxXTsKIHVuc2lnbmVkIGxvbmcgc3BhcmNfdW5tYXBwZWRfYmFzZTsKQEAgLTUyMiwzICs1MjcsNCBAQAogCWlmICh2YWRkcikKIAkJX19mbHVzaF9wYWdlX3RvX3JhbSh2YWRkcik7CiB9CitFWFBPUlRfU1lNQk9MKHNwYXJjX2ZsdXNoX3BhZ2VfdG9fcmFtKTsKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvbW0vaW5pdF82NC5jIGIvYXJjaC9zcGFyYy9tbS9pbml0XzY0LmMKaW5kZXggNmVhNzNkYS4uMDAzNzNjZSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9tbS9pbml0XzY0LmMKKysrIGIvYXJjaC9zcGFyYy9tbS9pbml0XzY0LmMKQEAgLTE0Niw2ICsxNDYsNyBAQAogfQogCiB1bnNpZ25lZCBsb25nICpzcGFyYzY0X3ZhbGlkX2FkZHJfYml0bWFwIF9fcmVhZF9tb3N0bHk7CitFWFBPUlRfU1lNQk9MKHNwYXJjNjRfdmFsaWRfYWRkcl9iaXRtYXApOwogCiAvKiBLZXJuZWwgcGh5c2ljYWwgYWRkcmVzcyBiYXNlIGFuZCBzaXplIGluIGJ5dGVzLiAgKi8KIHVuc2lnbmVkIGxvbmcga2Vybl9iYXNlIF9fcmVhZF9tb3N0bHk7CkBAIC0yNTgsMjEgKzI1OSwxNiBAQAogdW5zaWduZWQgbG9uZyBfUEFHRV9BTExfU1pfQklUUyBfX3JlYWRfbW9zdGx5OwogdW5zaWduZWQgbG9uZyBfUEFHRV9TWkJJVFMgX19yZWFkX21vc3RseTsKIAotdm9pZCB1cGRhdGVfbW11X2NhY2hlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHB0ZV90IHB0ZSkKK3N0YXRpYyB2b2lkIGZsdXNoX2RjYWNoZSh1bnNpZ25lZCBsb25nIHBmbikKIHsKLQlzdHJ1Y3QgbW1fc3RydWN0ICptbTsKLQlzdHJ1Y3QgdHNiICp0c2I7Ci0JdW5zaWduZWQgbG9uZyB0YWcsIGZsYWdzOwotCXVuc2lnbmVkIGxvbmcgdHNiX2luZGV4LCB0c2JfaGFzaF9zaGlmdDsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKIAotCWlmICh0bGJfdHlwZSAhPSBoeXBlcnZpc29yKSB7Ci0JCXVuc2lnbmVkIGxvbmcgcGZuID0gcHRlX3BmbihwdGUpOworCXBhZ2UgPSBwZm5fdG9fcGFnZShwZm4pOworCWlmIChwYWdlICYmIHBhZ2VfbWFwcGluZyhwYWdlKSkgewogCQl1bnNpZ25lZCBsb25nIHBnX2ZsYWdzOwotCQlzdHJ1Y3QgcGFnZSAqcGFnZTsKIAotCQlpZiAocGZuX3ZhbGlkKHBmbikgJiYKLQkJICAgIChwYWdlID0gcGZuX3RvX3BhZ2UocGZuKSwgcGFnZV9tYXBwaW5nKHBhZ2UpKSAmJgotCQkgICAgKChwZ19mbGFncyA9IHBhZ2UtPmZsYWdzKSAmICgxVUwgPDwgUEdfZGNhY2hlX2RpcnR5KSkpIHsKKwkJcGdfZmxhZ3MgPSBwYWdlLT5mbGFnczsKKwkJaWYgKHBnX2ZsYWdzICYgKDFVTCA8PCBQR19kY2FjaGVfZGlydHkpKSB7CiAJCQlpbnQgY3B1ID0gKChwZ19mbGFncyA+PiBQR19kY2FjaGVfY3B1X3NoaWZ0KSAmCiAJCQkJICAgUEdfZGNhY2hlX2NwdV9tYXNrKTsKIAkJCWludCB0aGlzX2NwdSA9IGdldF9jcHUoKTsKQEAgLTI5MCw2ICsyODYsMjEgQEAKIAkJCXB1dF9jcHUoKTsKIAkJfQogCX0KK30KKwordm9pZCB1cGRhdGVfbW11X2NhY2hlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHB0ZV90IHB0ZSkKK3sKKwlzdHJ1Y3QgbW1fc3RydWN0ICptbTsKKwlzdHJ1Y3QgdHNiICp0c2I7CisJdW5zaWduZWQgbG9uZyB0YWcsIGZsYWdzOworCXVuc2lnbmVkIGxvbmcgdHNiX2luZGV4LCB0c2JfaGFzaF9zaGlmdDsKKworCWlmICh0bGJfdHlwZSAhPSBoeXBlcnZpc29yKSB7CisJCXVuc2lnbmVkIGxvbmcgcGZuID0gcHRlX3BmbihwdGUpOworCisJCWlmIChwZm5fdmFsaWQocGZuKSkKKwkJCWZsdXNoX2RjYWNoZShwZm4pOworCX0KIAogCW1tID0gdm1hLT52bV9tbTsKIApAQCAtMzU5LDYgKzM3MCw3IEBACiBvdXQ6CiAJcHV0X2NwdSgpOwogfQorRVhQT1JUX1NZTUJPTChmbHVzaF9kY2FjaGVfcGFnZSk7CiAKIHZvaWQgX19rcHJvYmVzIGZsdXNoX2ljYWNoZV9yYW5nZSh1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCkKIHsKQEAgLTM4Niw2ICszOTgsNyBAQAogCQl9CiAJfQogfQorRVhQT1JUX1NZTUJPTChmbHVzaF9pY2FjaGVfcmFuZ2UpOwogCiB2b2lkIG1tdV9pbmZvKHN0cnVjdCBzZXFfZmlsZSAqbSkKIHsKQEAgLTU4OSw2ICs2MDIsNyBAQAogCQkJCQkgICAgICAgImkiIChBU0lfRENBQ0hFX0lOVkFMSURBVEUpKTsKIAl9CiB9CitFWFBPUlRfU1lNQk9MKF9fZmx1c2hfZGNhY2hlX3JhbmdlKTsKIAogLyogZ2V0X25ld19tbXVfY29udGV4dCgpIHVzZXMgImNhY2hlICsgMSIuICAqLwogREVGSU5FX1NQSU5MT0NLKGN0eF9hbGxvY19sb2NrKTsKQEAgLTc2OSw4ICs3ODMsOCBAQAogCXJldHVybiAtMTsKIH0KIAotc3RhdGljIHVuc2lnbmVkIGxvbmcgbmlkX3JhbmdlKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kLAotCQkJICAgICAgIGludCAqbmlkKQorc3RhdGljIHVuc2lnbmVkIGxvbmcgbG9uZyBuaWRfcmFuZ2UodW5zaWduZWQgbG9uZyBsb25nIHN0YXJ0LAorCQkJCSAgICB1bnNpZ25lZCBsb25nIGxvbmcgZW5kLCBpbnQgKm5pZCkKIHsKIAkqbmlkID0gZmluZF9ub2RlKHN0YXJ0KTsKIAlzdGFydCArPSBQQUdFX1NJWkU7CkBAIC03ODgsOCArODAyLDggQEAKIAlyZXR1cm4gc3RhcnQ7CiB9CiAjZWxzZQotc3RhdGljIHVuc2lnbmVkIGxvbmcgbmlkX3JhbmdlKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kLAotCQkJICAgICAgIGludCAqbmlkKQorc3RhdGljIHVuc2lnbmVkIGxvbmcgbG9uZyBuaWRfcmFuZ2UodW5zaWduZWQgbG9uZyBsb25nIHN0YXJ0LAorCQkJCSAgICB1bnNpZ25lZCBsb25nIGxvbmcgZW5kLCBpbnQgKm5pZCkKIHsKIAkqbmlkID0gMDsKIAlyZXR1cm4gZW5kOwpAQCAtMTAxNiw4ICsxMDMwLDggQEAKIAkJdmFsID0gbWRlc2NfZ2V0X3Byb3BlcnR5KG1kLCBub2RlLCAiYWRkcmVzcy1tYXNrIiwgTlVMTCk7CiAJCW0tPm1hc2sgPSAqdmFsOwogCi0JCW51bWFkYmcoIk1MR1JPVVBbJWRdOiBub2RlWyVseF0gbGF0ZW5jeVslbHhdICIKLQkJCSJtYXRjaFslbHhdIG1hc2tbJWx4XVxuIiwKKwkJbnVtYWRiZygiTUxHUk9VUFslZF06IG5vZGVbJWxseF0gbGF0ZW5jeVslbGx4XSAiCisJCQkibWF0Y2hbJWxseF0gbWFza1slbGx4XVxuIiwKIAkJCWNvdW50IC0gMSwgbS0+bm9kZSwgbS0+bGF0ZW5jeSwgbS0+bWF0Y2gsIG0tPm1hc2spOwogCX0KIApAQCAtMTA1Niw3ICsxMDcwLDcgQEAKIAkJCQkJICJhZGRyZXNzLWNvbmdydWVuY2Utb2Zmc2V0IiwgTlVMTCk7CiAJCW0tPm9mZnNldCA9ICp2YWw7CiAKLQkJbnVtYWRiZygiTUJMT0NLWyVkXTogYmFzZVslbHhdIHNpemVbJWx4XSBvZmZzZXRbJWx4XVxuIiwKKwkJbnVtYWRiZygiTUJMT0NLWyVkXTogYmFzZVslbGx4XSBzaXplWyVsbHhdIG9mZnNldFslbGx4XVxuIiwKIAkJCWNvdW50IC0gMSwgbS0+YmFzZSwgbS0+c2l6ZSwgbS0+b2Zmc2V0KTsKIAl9CiAKQEAgLTExMjcsNyArMTE0MSw3IEBACiAJbi0+bWFzayA9IGNhbmRpZGF0ZS0+bWFzazsKIAluLT52YWwgPSBjYW5kaWRhdGUtPm1hdGNoOwogCi0JbnVtYWRiZygiTlVNQSBOT0RFWyVkXTogbWFza1slbHhdIHZhbFslbHhdIChsYXRlbmN5WyVseF0pXG4iLAorCW51bWFkYmcoIk5VTUEgTk9ERVslZF06IG1hc2tbJWx4XSB2YWxbJWx4XSAobGF0ZW5jeVslbGx4XSlcbiIsCiAJCWluZGV4LCBuLT5tYXNrLCBuLT52YWwsIGNhbmRpZGF0ZS0+bGF0ZW5jeSk7CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvcHJvbS9pbml0XzMyLmMgYi9hcmNoL3NwYXJjL3Byb20vaW5pdF8zMi5jCmluZGV4IDg3MzIxN2MuLjYxOTNjMzMgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMvcHJvbS9pbml0XzMyLmMKKysrIGIvYXJjaC9zcGFyYy9wcm9tL2luaXRfMzIuYwpAQCAtOCwxNiArOCwyMCBAQAogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjaW5jbHVkZSA8YXNtL29wZW5wcm9tLmg+CiAjaW5jbHVkZSA8YXNtL29wbGliLmg+CiAKIHN0cnVjdCBsaW51eF9yb212ZWMgKnJvbXZlYzsKK0VYUE9SVF9TWU1CT0wocm9tdmVjKTsKKwogZW51bSBwcm9tX21ham9yX3ZlcnNpb24gcHJvbV92ZXJzOwogdW5zaWduZWQgaW50IHByb21fcmV2LCBwcm9tX3ByZXY7CiAKIC8qIFRoZSByb290IG5vZGUgb2YgdGhlIHByb20gZGV2aWNlIHRyZWUuICovCiBpbnQgcHJvbV9yb290X25vZGU7CitFWFBPUlRfU1lNQk9MKHByb21fcm9vdF9ub2RlKTsKIAogLyogUG9pbnRlciB0byB0aGUgZGV2aWNlIHRyZWUgb3BlcmF0aW9ucyBzdHJ1Y3R1cmUuICovCiBzdHJ1Y3QgbGludXhfbm9kZW9wcyAqcHJvbV9ub2Rlb3BzOwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9wcm9tL21pc2NfMzIuYyBiL2FyY2gvc3BhcmMvcHJvbS9taXNjXzMyLmMKaW5kZXggY2Y2YzNmNi4uNGQ2MWM1NCAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9wcm9tL21pc2NfMzIuYworKysgYi9hcmNoL3NwYXJjL3Byb20vbWlzY18zMi5jCkBAIC04LDYgKzgsOCBAQAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKwogI2luY2x1ZGUgPGFzbS9vcGVucHJvbS5oPgogI2luY2x1ZGUgPGFzbS9vcGxpYi5oPgogI2luY2x1ZGUgPGFzbS9hdXhpby5oPgpAQCAtNDQsNiArNDYsNyBAQAogCXJlc3RvcmVfY3VycmVudCgpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByb21fbG9jaywgZmxhZ3MpOwogfQorRVhQT1JUX1NZTUJPTChwcm9tX2ZldmFsKTsKIAogLyogRHJvcCBpbnRvIHRoZSBwcm9tLCB3aXRoIHRoZSBjaGFuY2UgdG8gY29udGludWUgd2l0aCB0aGUgJ2dvJwogICogcHJvbSBjb21tYW5kLgpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9wcm9tL21pc2NfNjQuYyBiL2FyY2gvc3BhcmMvcHJvbS9taXNjXzY0LmMKaW5kZXggOWIwYzA3Ni4uZWVkZmZiNCAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9wcm9tL21pc2NfNjQuYworKysgYi9hcmNoL3NwYXJjL3Byb20vbWlzY182NC5jCkBAIC0xMSw2ICsxMSw4IEBACiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCiAjaW5jbHVkZSA8YXNtL29wZW5wcm9tLmg+CiAjaW5jbHVkZSA8YXNtL29wbGliLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgpAQCAtNTQsNiArNTYsNyBAQAogCXAxMjc1X2NtZCgiaW50ZXJwcmV0IiwgUDEyNzVfQVJHKDAsIFAxMjc1X0FSR19JTl9TVFJJTkcpIHwKIAkJICBQMTI3NV9JTk9VVCgxLCAxKSwgZnN0cmluZyk7CiB9CitFWFBPUlRfU1lNQk9MKHByb21fZmV2YWwpOwogCiAjaWZkZWYgQ09ORklHX1NNUAogZXh0ZXJuIHZvaWQgc21wX2NhcHR1cmUodm9pZCk7CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL3Byb20vcmFuZ2VzLmMgYi9hcmNoL3NwYXJjL3Byb20vcmFuZ2VzLmMKaW5kZXggNjQ1NzlhMy4uY2Q1NzkwOCAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9wcm9tL3Jhbmdlcy5jCisrKyBiL2FyY2gvc3BhcmMvcHJvbS9yYW5nZXMuYwpAQCAtNiw2ICs2LDggQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCiAjaW5jbHVkZSA8YXNtL29wZW5wcm9tLmg+CiAjaW5jbHVkZSA8YXNtL29wbGliLmg+CiAjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CkBAIC02Miw2ICs2NCw3IEBACiAJaWYobnVtX29iaW9fcmFuZ2VzKQogCQlwcm9tX2FkanVzdF9yZWdzKHJlZ3MsIG5yZWdzLCBwcm9tbGliX29iaW9fcmFuZ2VzLCBudW1fb2Jpb19yYW5nZXMpOwogfQorRVhQT1JUX1NZTUJPTChwcm9tX2FwcGx5X29iaW9fcmFuZ2VzKTsKIAogdm9pZCBfX2luaXQgcHJvbV9yYW5nZXNfaW5pdCh2b2lkKQogewpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9wcm9tL3RyZWVfMzIuYyBiL2FyY2gvc3BhcmMvcHJvbS90cmVlXzMyLmMKaW5kZXggNmQ4MTg3My4uNjQ2ZDI0NCAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9wcm9tL3RyZWVfMzIuYworKysgYi9hcmNoL3NwYXJjL3Byb20vdHJlZV8zMi5jCkBAIC01LDEzICs1LDEyIEBACiAgKiBDb3B5cmlnaHQgKEMpIDE5OTUgRGF2aWQgUy4gTWlsbGVyIChkYXZlbUBjYWlwLnJ1dGdlcnMuZWR1KQogICovCiAKLSNkZWZpbmUgUFJPTUxJQl9JTlRFUk5BTAotCiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlIDxhc20vb3BlbnByb20uaD4KICNpbmNsdWRlIDxhc20vb3BsaWIuaD4KQEAgLTUwLDYgKzQ5LDcgQEAKIAogCXJldHVybiBjbm9kZTsKIH0KK0VYUE9SVF9TWU1CT0wocHJvbV9nZXRjaGlsZCk7CiAKIC8qIEludGVybmFsIHZlcnNpb24gb2YgcHJvbV9nZXRzaWJsaW5nIHRoYXQgZG9lcyBub3QgYWx0ZXIgcmV0dXJuIHZhbHVlcy4gKi8KIGludCBfX3Byb21fZ2V0c2libGluZyhpbnQgbm9kZSkKQEAgLTgxLDYgKzgxLDcgQEAKIAogCXJldHVybiBzaWJub2RlOwogfQorRVhQT1JUX1NZTUJPTChwcm9tX2dldHNpYmxpbmcpOwogCiAvKiBSZXR1cm4gdGhlIGxlbmd0aCBpbiBieXRlcyBvZiBwcm9wZXJ0eSAncHJvcCcgYXQgbm9kZSAnbm9kZScuCiAgKiBSZXR1cm4gLTEgb24gZXJyb3IuCkBAIC05OSw2ICsxMDAsNyBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByb21fbG9jaywgZmxhZ3MpOwogCXJldHVybiByZXQ7CiB9CitFWFBPUlRfU1lNQk9MKHByb21fZ2V0cHJvcGxlbik7CiAKIC8qIEFjcXVpcmUgYSBwcm9wZXJ0eSAncHJvcCcgYXQgbm9kZSAnbm9kZScgYW5kIHBsYWNlIGl0IGluCiAgKiAnYnVmZmVyJyB3aGljaCBoYXMgYSBzaXplIG9mICdidWZzaXplJy4gIElmIHRoZSBhY3F1aXNpdGlvbgpAQCAtMTE5LDYgKzEyMSw3IEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJvbV9sb2NrLCBmbGFncyk7CiAJcmV0dXJuIHJldDsKIH0KK0VYUE9SVF9TWU1CT0wocHJvbV9nZXRwcm9wZXJ0eSk7CiAKIC8qIEFjcXVpcmUgYW4gaW50ZWdlciBwcm9wZXJ0eSBhbmQgcmV0dXJuIGl0cyB2YWx1ZS4gIFJldHVybnMgLTEKICAqIG9uIGZhaWx1cmUuCkBAIC0xMzIsNiArMTM1LDcgQEAKIAogCXJldHVybiAtMTsKIH0KK0VYUE9SVF9TWU1CT0wocHJvbV9nZXRpbnQpOwogCiAvKiBBY3F1aXJlIGFuIGludGVnZXIgcHJvcGVydHksIHVwb24gZXJyb3IgcmV0dXJuIHRoZSBwYXNzZWQgZGVmYXVsdAogICogaW50ZWdlci4KQEAgLTE0NSw2ICsxNDksNyBAQAogCiAJcmV0dXJuIHJldHZhbDsKIH0KK0VYUE9SVF9TWU1CT0wocHJvbV9nZXRpbnRkZWZhdWx0KTsKIAogLyogQWNxdWlyZSBhIGJvb2xlYW4gcHJvcGVydHksIDE9VFJVRSAwPUZBTFNFLiAqLwogaW50IHByb21fZ2V0Ym9vbChpbnQgbm9kZSwgY2hhciAqcHJvcCkKQEAgLTE1NSw2ICsxNjAsNyBAQAogCWlmKHJldHZhbCA9PSAtMSkgcmV0dXJuIDA7CiAJcmV0dXJuIDE7CiB9CitFWFBPUlRfU1lNQk9MKHByb21fZ2V0Ym9vbCk7CiAKIC8qIEFjcXVpcmUgYSBwcm9wZXJ0eSB3aG9zZSB2YWx1ZSBpcyBhIHN0cmluZywgcmV0dXJucyBhIG51bGwKICAqIHN0cmluZyBvbiBlcnJvci4gIFRoZSBjaGFyIHBvaW50ZXIgaXMgdGhlIHVzZXIgc3VwcGxpZWQgc3RyaW5nCkBAIC0xNjksNiArMTc1LDcgQEAKIAl1c2VyX2J1ZlswXSA9IDA7CiAJcmV0dXJuOwogfQorRVhQT1JUX1NZTUJPTChwcm9tX2dldHN0cmluZyk7CiAKIAogLyogRG9lcyB0aGUgZGV2aWNlIGF0IG5vZGUgJ25vZGUnIGhhdmUgbmFtZSAnbmFtZSc/CkBAIC0yMDQsNiArMjExLDcgQEAKIAogCXJldHVybiAwOwogfQorRVhQT1JUX1NZTUJPTChwcm9tX3NlYXJjaHNpYmxpbmdzKTsKIAogLyogSW50ZXJhbCB2ZXJzaW9uIG9mIG5leHRwcm9wIHRoYXQgZG9lcyBub3QgYWx0ZXIgcmV0dXJuIHZhbHVlcy4gKi8KIGNoYXIgKiBfX3Byb21fbmV4dHByb3AoaW50IG5vZGUsIGNoYXIgKiBvcHJvcCkKQEAgLTIyOCw2ICsyMzYsNyBAQAogCiAJcmV0dXJuIF9fcHJvbV9uZXh0cHJvcChub2RlLCAiIik7CiB9CitFWFBPUlRfU1lNQk9MKHByb21fZmlyc3Rwcm9wKTsKIAogLyogUmV0dXJuIHRoZSBwcm9wZXJ0eSB0eXBlIHN0cmluZyBhZnRlciBwcm9wZXJ0eSB0eXBlICdvcHJvcCcKICAqIGF0IG5vZGUgJ25vZGUnIC4gIFJldHVybnMgZW1wdHkgc3RyaW5nIGlmIG5vIG1vcmUKQEAgLTI0MCw2ICsyNDksNyBAQAogCiAJcmV0dXJuIF9fcHJvbV9uZXh0cHJvcChub2RlLCBvcHJvcCk7CiB9CitFWFBPUlRfU1lNQk9MKHByb21fbmV4dHByb3ApOwogCiBpbnQgcHJvbV9maW5kZGV2aWNlKGNoYXIgKm5hbWUpCiB7CkBAIC0yODcsNiArMjk3LDcgQEAKIAl9CiAJcmV0dXJuIG5vZGU7CiB9CitFWFBPUlRfU1lNQk9MKHByb21fZmluZGRldmljZSk7CiAKIGludCBwcm9tX25vZGVfaGFzX3Byb3BlcnR5KGludCBub2RlLCBjaGFyICpwcm9wKQogewpAQCAtMjk5LDYgKzMxMCw3IEBACiAJfSB3aGlsZSAoKmN1cnJlbnRfcHJvcGVydHkpOwogCXJldHVybiAwOwogfQorRVhQT1JUX1NZTUJPTChwcm9tX25vZGVfaGFzX3Byb3BlcnR5KTsKIAogLyogU2V0IHByb3BlcnR5ICdwbmFtZScgYXQgbm9kZSAnbm9kZScgdG8gdmFsdWUgJ3ZhbHVlJyB3aGljaCBoYXMgYSBsZW5ndGgKICAqIG9mICdzaXplJyBieXRlcy4gIFJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoZSBwcm9tIGFjY2VwdGVkLgpAQCAtMzE2LDYgKzMyOCw3IEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJvbV9sb2NrLCBmbGFncyk7CiAJcmV0dXJuIHJldDsKIH0KK0VYUE9SVF9TWU1CT0wocHJvbV9zZXRwcm9wKTsKIAogaW50IHByb21faW5zdDJwa2coaW50IGluc3QpCiB7CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL3Byb20vdHJlZV82NC5jIGIvYXJjaC9zcGFyYy9wcm9tL3RyZWVfNjQuYwppbmRleCAyODFhZWE0Li44ZWE3M2RkIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL3Byb20vdHJlZV82NC5jCisrKyBiL2FyY2gvc3BhcmMvcHJvbS90cmVlXzY0LmMKQEAgLTEwLDYgKzEwLDcgQEAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlIDxhc20vb3BlbnByb20uaD4KICNpbmNsdWRlIDxhc20vb3BsaWIuaD4KQEAgLTMyLDYgKzMzLDcgQEAKIAlpZihjbm9kZSA9PSAtMSkgcmV0dXJuIDA7CiAJcmV0dXJuIChpbnQpY25vZGU7CiB9CitFWFBPUlRfU1lNQk9MKHByb21fZ2V0Y2hpbGQpOwogCiBpbmxpbmUgaW50IHByb21fZ2V0cGFyZW50KGludCBub2RlKQogewpAQCAtNjMsNiArNjUsNyBAQAogCiAJcmV0dXJuIHNpYm5vZGU7CiB9CitFWFBPUlRfU1lNQk9MKHByb21fZ2V0c2libGluZyk7CiAKIC8qIFJldHVybiB0aGUgbGVuZ3RoIGluIGJ5dGVzIG9mIHByb3BlcnR5ICdwcm9wJyBhdCBub2RlICdub2RlJy4KICAqIFJldHVybiAtMSBvbiBlcnJvci4KQEAgLTc1LDYgKzc4LDcgQEAKIAkJCSAgUDEyNzVfSU5PVVQoMiwgMSksIAogCQkJICBub2RlLCBwcm9wKTsKIH0KK0VYUE9SVF9TWU1CT0wocHJvbV9nZXRwcm9wbGVuKTsKIAogLyogQWNxdWlyZSBhIHByb3BlcnR5ICdwcm9wJyBhdCBub2RlICdub2RlJyBhbmQgcGxhY2UgaXQgaW4KICAqICdidWZmZXInIHdoaWNoIGhhcyBhIHNpemUgb2YgJ2J1ZnNpemUnLiAgSWYgdGhlIGFjcXVpc2l0aW9uCkBAIC05Nyw2ICsxMDEsNyBAQAogCQkJCSBub2RlLCBwcm9wLCBidWZmZXIsIFAxMjc1X1NJWkUocGxlbikpOwogCX0KIH0KK0VYUE9SVF9TWU1CT0wocHJvbV9nZXRwcm9wZXJ0eSk7CiAKIC8qIEFjcXVpcmUgYW4gaW50ZWdlciBwcm9wZXJ0eSBhbmQgcmV0dXJuIGl0cyB2YWx1ZS4gIFJldHVybnMgLTEKICAqIG9uIGZhaWx1cmUuCkBAIC0xMTAsNiArMTE1LDcgQEAKIAogCXJldHVybiAtMTsKIH0KK0VYUE9SVF9TWU1CT0wocHJvbV9nZXRpbnQpOwogCiAvKiBBY3F1aXJlIGFuIGludGVnZXIgcHJvcGVydHksIHVwb24gZXJyb3IgcmV0dXJuIHRoZSBwYXNzZWQgZGVmYXVsdAogICogaW50ZWdlci4KQEAgLTEyNCw2ICsxMzAsNyBAQAogCiAJcmV0dXJuIHJldHZhbDsKIH0KK0VYUE9SVF9TWU1CT0wocHJvbV9nZXRpbnRkZWZhdWx0KTsKIAogLyogQWNxdWlyZSBhIGJvb2xlYW4gcHJvcGVydHksIDE9VFJVRSAwPUZBTFNFLiAqLwogaW50IHByb21fZ2V0Ym9vbChpbnQgbm9kZSwgY29uc3QgY2hhciAqcHJvcCkKQEAgLTEzNCw2ICsxNDEsNyBAQAogCWlmKHJldHZhbCA9PSAtMSkgcmV0dXJuIDA7CiAJcmV0dXJuIDE7CiB9CitFWFBPUlRfU1lNQk9MKHByb21fZ2V0Ym9vbCk7CiAKIC8qIEFjcXVpcmUgYSBwcm9wZXJ0eSB3aG9zZSB2YWx1ZSBpcyBhIHN0cmluZywgcmV0dXJucyBhIG51bGwKICAqIHN0cmluZyBvbiBlcnJvci4gIFRoZSBjaGFyIHBvaW50ZXIgaXMgdGhlIHVzZXIgc3VwcGxpZWQgc3RyaW5nCkBAIC0xNDgsNyArMTU2LDcgQEAKIAl1c2VyX2J1ZlswXSA9IDA7CiAJcmV0dXJuOwogfQotCitFWFBPUlRfU1lNQk9MKHByb21fZ2V0c3RyaW5nKTsKIAogLyogRG9lcyB0aGUgZGV2aWNlIGF0IG5vZGUgJ25vZGUnIGhhdmUgbmFtZSAnbmFtZSc/CiAgKiBZRVMgPSAxICAgTk8gPSAwCkBAIC0xODEsNiArMTg5LDcgQEAKIAogCXJldHVybiAwOwogfQorRVhQT1JUX1NZTUJPTChwcm9tX3NlYXJjaHNpYmxpbmdzKTsKIAogLyogUmV0dXJuIHRoZSBmaXJzdCBwcm9wZXJ0eSB0eXBlIGZvciBub2RlICdub2RlJy4KICAqIGJ1ZmZlciBzaG91bGQgYmUgYXQgbGVhc3QgMzJCIGluIGxlbmd0aApAQCAtMTk0LDYgKzIwMyw3IEBACiAJCQkgICAgICAgbm9kZSwgKGNoYXIgKikgMHgwLCBidWZmZXIpOwogCXJldHVybiBidWZmZXI7CiB9CitFWFBPUlRfU1lNQk9MKHByb21fZmlyc3Rwcm9wKTsKIAogLyogUmV0dXJuIHRoZSBwcm9wZXJ0eSB0eXBlIHN0cmluZyBhZnRlciBwcm9wZXJ0eSB0eXBlICdvcHJvcCcKICAqIGF0IG5vZGUgJ25vZGUnIC4gIFJldHVybnMgTlVMTCBzdHJpbmcgaWYgbm8gbW9yZQpAQCAtMjE3LDYgKzIyNyw3IEBACiAJCQkJICAgIG5vZGUsIG9wcm9wLCBidWZmZXIpOyAKIAlyZXR1cm4gYnVmZmVyOwogfQorRVhQT1JUX1NZTUJPTChwcm9tX25leHRwcm9wKTsKIAogaW50CiBwcm9tX2ZpbmRkZXZpY2UoY29uc3QgY2hhciAqbmFtZSkKQEAgLTIyOCw2ICsyMzksNyBAQAogCQkJIFAxMjc1X0lOT1VUKDEsIDEpLCAKIAkJCSBuYW1lKTsKIH0KK0VYUE9SVF9TWU1CT0wocHJvbV9maW5kZGV2aWNlKTsKIAogaW50IHByb21fbm9kZV9oYXNfcHJvcGVydHkoaW50IG5vZGUsIGNvbnN0IGNoYXIgKnByb3ApCiB7CkBAIC0yNDEsNyArMjUzLDggQEAKIAl9IHdoaWxlICgqYnVmKTsKIAlyZXR1cm4gMDsKIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK0VYUE9SVF9TWU1CT0wocHJvbV9ub2RlX2hhc19wcm9wZXJ0eSk7CisKIC8qIFNldCBwcm9wZXJ0eSAncG5hbWUnIGF0IG5vZGUgJ25vZGUnIHRvIHZhbHVlICd2YWx1ZScgd2hpY2ggaGFzIGEgbGVuZ3RoCiAgKiBvZiAnc2l6ZScgYnl0ZXMuICBSZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyB0aGUgcHJvbSBhY2NlcHRlZC4KICAqLwpAQCAtMjY0LDYgKzI3Nyw3IEBACiAJCQkJCSAgUDEyNzVfSU5PVVQoNCwgMSksIAogCQkJCQkgIG5vZGUsIHBuYW1lLCB2YWx1ZSwgUDEyNzVfU0laRShzaXplKSk7CiB9CitFWFBPUlRfU1lNQk9MKHByb21fc2V0cHJvcCk7CiAKIGlubGluZSBpbnQgcHJvbV9pbnN0MnBrZyhpbnQgaW5zdCkKIHsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L0tjb25maWcgYi9hcmNoL3g4Ni9LY29uZmlnCmluZGV4IDg2MmFkYjkuLjczZjdmZTggMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L0tjb25maWcKKysrIGIvYXJjaC94ODYvS2NvbmZpZwpAQCAtMjcsNiArMjcsNyBAQAogCXNlbGVjdCBIQVZFX0lPUkVNQVBfUFJPVAogCXNlbGVjdCBIQVZFX0tQUk9CRVMKIAlzZWxlY3QgQVJDSF9XQU5UX09QVElPTkFMX0dQSU9MSUIKKwlzZWxlY3QgQVJDSF9XQU5UX0ZSQU1FX1BPSU5URVJTCiAJc2VsZWN0IEhBVkVfS1JFVFBST0JFUwogCXNlbGVjdCBIQVZFX0ZUUkFDRV9NQ09VTlRfUkVDT1JECiAJc2VsZWN0IEhBVkVfRFlOQU1JQ19GVFJBQ0UKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL0tidWlsZCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL0tidWlsZAppbmRleCBhOWY4YTgxLi40YThlODBjIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9LYnVpbGQKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vS2J1aWxkCkBAIC0yMiw0ICsyMiwzIEBACiB1bmlmZGVmLXkgKz0gdW5pc3RkXzY0LmgKIHVuaWZkZWYteSArPSB2bTg2LmgKIHVuaWZkZWYteSArPSB2c3lzY2FsbC5oCi11bmlmZGVmLXkgKz0gc3dhYi5oCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9iaXRvcHMuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2JpdG9wcy5oCmluZGV4IDlmYTlkY2QuLmUwMmEzNTkgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2JpdG9wcy5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2JpdG9wcy5oCkBAIC0zMDAsNyArMzAwLDcgQEAKIAlyZXR1cm4gb2xkYml0OwogfQogCi1zdGF0aWMgaW5saW5lIGludCBjb25zdGFudF90ZXN0X2JpdChpbnQgbnIsIGNvbnN0IHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKmFkZHIpCitzdGF0aWMgaW5saW5lIGludCBjb25zdGFudF90ZXN0X2JpdCh1bnNpZ25lZCBpbnQgbnIsIGNvbnN0IHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKmFkZHIpCiB7CiAJcmV0dXJuICgoMVVMIDw8IChuciAlIEJJVFNfUEVSX0xPTkcpKSAmCiAJCSgoKHVuc2lnbmVkIGxvbmcgKilhZGRyKVtuciAvIEJJVFNfUEVSX0xPTkddKSkgIT0gMDsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2J5dGVvcmRlci5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vYnl0ZW9yZGVyLmgKaW5kZXggN2M0OTkxNy4uYjEzYTdhOCAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vYnl0ZW9yZGVyLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vYnl0ZW9yZGVyLmgKQEAgLTEsNyArMSw2IEBACiAjaWZuZGVmIF9BU01fWDg2X0JZVEVPUkRFUl9ICiAjZGVmaW5lIF9BU01fWDg2X0JZVEVPUkRFUl9ICiAKLSNpbmNsdWRlIDxhc20vc3dhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2J5dGVvcmRlci9saXR0bGVfZW5kaWFuLmg+CiAKICNlbmRpZiAvKiBfQVNNX1g4Nl9CWVRFT1JERVJfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vZXM3MDAwL2FwaWMuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2VzNzAwMC9hcGljLmgKaW5kZXggYmM1M2Q1ZS4uYzU4YjljYyAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vZXM3MDAwL2FwaWMuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9lczcwMDAvYXBpYy5oCkBAIC0xLDYgKzEsOCBAQAogI2lmbmRlZiBfX0FTTV9FUzcwMDBfQVBJQ19ICiAjZGVmaW5lIF9fQVNNX0VTNzAwMF9BUElDX0gKIAorI2luY2x1ZGUgPGxpbnV4L2dmcC5oPgorCiAjZGVmaW5lIHhhcGljX3BoeXNfdG9fbG9nX2FwaWNpZChjcHUpIHBlcl9jcHUoeDg2X2Jpb3NfY3B1X2FwaWNpZCwgY3B1KQogI2RlZmluZSBlc3JfZGlzYWJsZSAoMSkKIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vZXM3MDAwL21wcGFyc2UuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2VzNzAwMC9tcHBhcnNlLmgKaW5kZXggZWQ1YTNjYS4uYzE2MjliMCAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vZXM3MDAwL21wcGFyc2UuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9lczcwMDAvbXBwYXJzZS5oCkBAIC0xMCw4ICsxMCw3IEBACiAKICNpZm5kZWYgQ09ORklHX1g4Nl9HRU5FUklDQVJDSAogZXh0ZXJuIGludCBhY3BpX21hZHRfb2VtX2NoZWNrKGNoYXIgKm9lbV9pZCwgY2hhciAqb2VtX3RhYmxlX2lkKTsKLWV4dGVybiBpbnQgbXBzX29lbV9jaGVjayhzdHJ1Y3QgbXBfY29uZmlnX3RhYmxlICptcGMsIGNoYXIgKm9lbSwKLQkJCQljaGFyICpwcm9kdWN0aWQpOworZXh0ZXJuIGludCBtcHNfb2VtX2NoZWNrKHN0cnVjdCBtcGNfdGFibGUgKm1wYywgY2hhciAqb2VtLCBjaGFyICpwcm9kdWN0aWQpOwogI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfQUNQSQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vZ2VuYXBpY18zMi5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vZ2VuYXBpY18zMi5oCmluZGV4IDc0NmYzN2EuLjJjMDViNzMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2dlbmFwaWNfMzIuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9nZW5hcGljXzMyLmgKQEAgLTE1LDkgKzE1LDkgQEAKICAqIENvcHlyaWdodCAyMDAzIEFuZGkgS2xlZW4sIFN1U0UgTGFicy4KICAqLwogCi1zdHJ1Y3QgbXBjX2NvbmZpZ19idXM7Ci1zdHJ1Y3QgbXBfY29uZmlnX3RhYmxlOwotc3RydWN0IG1wY19jb25maWdfcHJvY2Vzc29yOworc3RydWN0IG1wY19idXM7CitzdHJ1Y3QgbXBjX3RhYmxlOworc3RydWN0IG1wY19jcHU7CiAKIHN0cnVjdCBnZW5hcGljIHsKIAljaGFyICpuYW1lOwpAQCAtNTEsNyArNTEsNyBAQAogCS8qIFdoZW4gb25lIG9mIHRoZSBuZXh0IHR3byBob29rcyByZXR1cm5zIDEgdGhlIGdlbmFwaWMKIAkgICBpcyBzd2l0Y2hlZCB0byB0aGlzLiBFc3NlbnRpYWxseSB0aGV5IGFyZSBhZGRpdGlvbmFsIHByb2JlCiAJICAgZnVuY3Rpb25zLiAqLwotCWludCAoKm1wc19vZW1fY2hlY2spKHN0cnVjdCBtcF9jb25maWdfdGFibGUgKm1wYywgY2hhciAqb2VtLAorCWludCAoKm1wc19vZW1fY2hlY2spKHN0cnVjdCBtcGNfdGFibGUgKm1wYywgY2hhciAqb2VtLAogCQkJICAgICBjaGFyICpwcm9kdWN0aWQpOwogCWludCAoKmFjcGlfbWFkdF9vZW1fY2hlY2spKGNoYXIgKm9lbV9pZCwgY2hhciAqb2VtX3RhYmxlX2lkKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vbWFjaC1kZWZhdWx0L21hY2hfbXBwYXJzZS5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vbWFjaC1kZWZhdWx0L21hY2hfbXBwYXJzZS5oCmluZGV4IDhjMWVhMjEyLi5jNzBhMjYzIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9tYWNoLWRlZmF1bHQvbWFjaF9tcHBhcnNlLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vbWFjaC1kZWZhdWx0L21hY2hfbXBwYXJzZS5oCkBAIC0xLDggKzEsOCBAQAogI2lmbmRlZiBfQVNNX1g4Nl9NQUNIX0RFRkFVTFRfTUFDSF9NUFBBUlNFX0gKICNkZWZpbmUgX0FTTV9YODZfTUFDSF9ERUZBVUxUX01BQ0hfTVBQQVJTRV9ICiAKLXN0YXRpYyBpbmxpbmUgaW50IG1wc19vZW1fY2hlY2soc3RydWN0IG1wX2NvbmZpZ190YWJsZSAqbXBjLCBjaGFyICpvZW0sIAotCQljaGFyICpwcm9kdWN0aWQpCitzdGF0aWMgaW5saW5lIGludAorbXBzX29lbV9jaGVjayhzdHJ1Y3QgbXBjX3RhYmxlICptcGMsIGNoYXIgKm9lbSwgY2hhciAqcHJvZHVjdGlkKQogewogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vbWFjaC1kZWZhdWx0L21hY2hfd2FrZWNwdS5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vbWFjaC1kZWZhdWx0L21hY2hfd2FrZWNwdS5oCmluZGV4IGNlYjAxMzYuLjg5ODk3YTYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL21hY2gtZGVmYXVsdC9tYWNoX3dha2VjcHUuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9tYWNoLWRlZmF1bHQvbWFjaF93YWtlY3B1LmgKQEAgLTI0LDcgKzI0LDEzIEBACiB7CiB9CiAKKyNpZmRlZiBDT05GSUdfU01QCiBleHRlcm4gdm9pZCBfX2lucXVpcmVfcmVtb3RlX2FwaWMoaW50IGFwaWNpZCk7CisjZWxzZSAvKiBDT05GSUdfU01QICovCitzdGF0aWMgaW5saW5lIHZvaWQgX19pbnF1aXJlX3JlbW90ZV9hcGljKGludCBhcGljaWQpCit7Cit9CisjZW5kaWYgLyogQ09ORklHX1NNUCAqLwogCiBzdGF0aWMgaW5saW5lIHZvaWQgaW5xdWlyZV9yZW1vdGVfYXBpYyhpbnQgYXBpY2lkKQogewpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vbWFjaC1nZW5lcmljL21hY2hfbXBwYXJzZS5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vbWFjaC1nZW5lcmljL21hY2hfbXBwYXJzZS5oCmluZGV4IDA0OGYxZDQuLjk0NDRhYjggMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL21hY2gtZ2VuZXJpYy9tYWNoX21wcGFyc2UuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9tYWNoLWdlbmVyaWMvbWFjaF9tcHBhcnNlLmgKQEAgLTIsOSArMiw4IEBACiAjZGVmaW5lIF9BU01fWDg2X01BQ0hfR0VORVJJQ19NQUNIX01QUEFSU0VfSAogCiAKLWV4dGVybiBpbnQgbXBzX29lbV9jaGVjayhzdHJ1Y3QgbXBfY29uZmlnX3RhYmxlICptcGMsIGNoYXIgKm9lbSwKLQkJCSBjaGFyICpwcm9kdWN0aWQpOworZXh0ZXJuIGludCBtcHNfb2VtX2NoZWNrKHN0cnVjdCBtcGNfdGFibGUgKiwgY2hhciAqLCBjaGFyICopOwogCi1leHRlcm4gaW50IGFjcGlfbWFkdF9vZW1fY2hlY2soY2hhciAqb2VtX2lkLCBjaGFyICpvZW1fdGFibGVfaWQpOworZXh0ZXJuIGludCBhY3BpX21hZHRfb2VtX2NoZWNrKGNoYXIgKiwgY2hhciAqKTsKIAogI2VuZGlmIC8qIF9BU01fWDg2X01BQ0hfR0VORVJJQ19NQUNIX01QUEFSU0VfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vbWFjaC1nZW5lcmljL21hY2hfbXBzcGVjLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9tYWNoLWdlbmVyaWMvbWFjaF9tcHNwZWMuaAppbmRleCBiYmFiNWNjLi4zYmM0MDcyIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9tYWNoLWdlbmVyaWMvbWFjaF9tcHNwZWMuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9tYWNoLWdlbmVyaWMvbWFjaF9tcHNwZWMuaApAQCAtNyw2ICs3LDYgQEAKIC8qIE1heGltdW0gMjU2IFBDSSBidXNzZXMsIHBsdXMgMSBJU0EgYnVzIGluIGVhY2ggb2YgNCBjYWJpbmV0cy4gKi8KICNkZWZpbmUgTUFYX01QX0JVU1NFUyAyNjAKIAotZXh0ZXJuIHZvaWQgbnVtYXFfbXBzX29lbV9jaGVjayhzdHJ1Y3QgbXBfY29uZmlnX3RhYmxlICptcGMsIGNoYXIgKm9lbSwKLQkJCQljaGFyICpwcm9kdWN0aWQpOworZXh0ZXJuIHZvaWQgbnVtYXFfbXBzX29lbV9jaGVjayhzdHJ1Y3QgbXBjX3RhYmxlICosIGNoYXIgKiwgY2hhciAqKTsKKwogI2VuZGlmIC8qIF9BU01fWDg2X01BQ0hfR0VORVJJQ19NQUNIX01QU1BFQ19IICovCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9tcHNwZWNfZGVmLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9tcHNwZWNfZGVmLmgKaW5kZXggZTNhY2U3ZC4uNTk1NjhiYyAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vbXBzcGVjX2RlZi5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL21wc3BlY19kZWYuaApAQCAtMzksMTcgKzM5LDE3IEBACiAKICNkZWZpbmUgTVBDX1NJR05BVFVSRSAiUENNUCIKIAotc3RydWN0IG1wX2NvbmZpZ190YWJsZSB7Ci0JY2hhciBtcGNfc2lnbmF0dXJlWzRdOwotCXVuc2lnbmVkIHNob3J0IG1wY19sZW5ndGg7CS8qIFNpemUgb2YgdGFibGUgKi8KLQljaGFyIG1wY19zcGVjOwkJCS8qIDB4MDEgKi8KLQljaGFyIG1wY19jaGVja3N1bTsKLQljaGFyIG1wY19vZW1bOF07Ci0JY2hhciBtcGNfcHJvZHVjdGlkWzEyXTsKLQl1bnNpZ25lZCBpbnQgbXBjX29lbXB0cjsJLyogMCBpZiBub3QgcHJlc2VudCAqLwotCXVuc2lnbmVkIHNob3J0IG1wY19vZW1zaXplOwkvKiAwIGlmIG5vdCBwcmVzZW50ICovCi0JdW5zaWduZWQgc2hvcnQgbXBjX29lbWNvdW50OwotCXVuc2lnbmVkIGludCBtcGNfbGFwaWM7CS8qIEFQSUMgYWRkcmVzcyAqLworc3RydWN0IG1wY190YWJsZSB7CisJY2hhciBzaWduYXR1cmVbNF07CisJdW5zaWduZWQgc2hvcnQgbGVuZ3RoOwkJLyogU2l6ZSBvZiB0YWJsZSAqLworCWNoYXIgc3BlYzsJCQkvKiAweDAxICovCisJY2hhciBjaGVja3N1bTsKKwljaGFyIG9lbVs4XTsKKwljaGFyIHByb2R1Y3RpZFsxMl07CisJdW5zaWduZWQgaW50IG9lbXB0cjsJCS8qIDAgaWYgbm90IHByZXNlbnQgKi8KKwl1bnNpZ25lZCBzaG9ydCBvZW1zaXplOwkJLyogMCBpZiBub3QgcHJlc2VudCAqLworCXVuc2lnbmVkIHNob3J0IG9lbWNvdW50OworCXVuc2lnbmVkIGludCBsYXBpYzsJCS8qIEFQSUMgYWRkcmVzcyAqLwogCXVuc2lnbmVkIGludCByZXNlcnZlZDsKIH07CiAKQEAgLTcwLDIwICs3MCwyMCBAQAogI2RlZmluZSBDUFVfTU9ERUxfTUFTSwkJMHgwMEYwCiAjZGVmaW5lIENQVV9GQU1JTFlfTUFTSwkJMHgwRjAwCiAKLXN0cnVjdCBtcGNfY29uZmlnX3Byb2Nlc3NvciB7Ci0JdW5zaWduZWQgY2hhciBtcGNfdHlwZTsKLQl1bnNpZ25lZCBjaGFyIG1wY19hcGljaWQ7CS8qIExvY2FsIEFQSUMgbnVtYmVyICovCi0JdW5zaWduZWQgY2hhciBtcGNfYXBpY3ZlcjsJLyogSXRzIHZlcnNpb25zICovCi0JdW5zaWduZWQgY2hhciBtcGNfY3B1ZmxhZzsKLQl1bnNpZ25lZCBpbnQgbXBjX2NwdWZlYXR1cmU7Ci0JdW5zaWduZWQgaW50IG1wY19mZWF0dXJlZmxhZzsJLyogQ1BVSUQgZmVhdHVyZSB2YWx1ZSAqLwotCXVuc2lnbmVkIGludCBtcGNfcmVzZXJ2ZWRbMl07CitzdHJ1Y3QgbXBjX2NwdSB7CisJdW5zaWduZWQgY2hhciB0eXBlOworCXVuc2lnbmVkIGNoYXIgYXBpY2lkOwkJLyogTG9jYWwgQVBJQyBudW1iZXIgKi8KKwl1bnNpZ25lZCBjaGFyIGFwaWN2ZXI7CQkvKiBJdHMgdmVyc2lvbnMgKi8KKwl1bnNpZ25lZCBjaGFyIGNwdWZsYWc7CisJdW5zaWduZWQgaW50IGNwdWZlYXR1cmU7CisJdW5zaWduZWQgaW50IGZlYXR1cmVmbGFnOwkvKiBDUFVJRCBmZWF0dXJlIHZhbHVlICovCisJdW5zaWduZWQgaW50IHJlc2VydmVkWzJdOwogfTsKIAotc3RydWN0IG1wY19jb25maWdfYnVzIHsKLQl1bnNpZ25lZCBjaGFyIG1wY190eXBlOwotCXVuc2lnbmVkIGNoYXIgbXBjX2J1c2lkOwotCXVuc2lnbmVkIGNoYXIgbXBjX2J1c3R5cGVbNl07CitzdHJ1Y3QgbXBjX2J1cyB7CisJdW5zaWduZWQgY2hhciB0eXBlOworCXVuc2lnbmVkIGNoYXIgYnVzaWQ7CisJdW5zaWduZWQgY2hhciBidXN0eXBlWzZdOwogfTsKIAogLyogTGlzdCBvZiBCdXMgVHlwZSBzdHJpbmcgdmFsdWVzLCBJbnRlbCBNUCBTcGVjLiAqLwpAQCAtMTA4LDIyICsxMDgsMjIgQEAKIAogI2RlZmluZSBNUENfQVBJQ19VU0FCTEUJCTB4MDEKIAotc3RydWN0IG1wY19jb25maWdfaW9hcGljIHsKLQl1bnNpZ25lZCBjaGFyIG1wY190eXBlOwotCXVuc2lnbmVkIGNoYXIgbXBjX2FwaWNpZDsKLQl1bnNpZ25lZCBjaGFyIG1wY19hcGljdmVyOwotCXVuc2lnbmVkIGNoYXIgbXBjX2ZsYWdzOwotCXVuc2lnbmVkIGludCBtcGNfYXBpY2FkZHI7CitzdHJ1Y3QgbXBjX2lvYXBpYyB7CisJdW5zaWduZWQgY2hhciB0eXBlOworCXVuc2lnbmVkIGNoYXIgYXBpY2lkOworCXVuc2lnbmVkIGNoYXIgYXBpY3ZlcjsKKwl1bnNpZ25lZCBjaGFyIGZsYWdzOworCXVuc2lnbmVkIGludCBhcGljYWRkcjsKIH07CiAKLXN0cnVjdCBtcGNfY29uZmlnX2ludHNyYyB7Ci0JdW5zaWduZWQgY2hhciBtcGNfdHlwZTsKLQl1bnNpZ25lZCBjaGFyIG1wY19pcnF0eXBlOwotCXVuc2lnbmVkIHNob3J0IG1wY19pcnFmbGFnOwotCXVuc2lnbmVkIGNoYXIgbXBjX3NyY2J1czsKLQl1bnNpZ25lZCBjaGFyIG1wY19zcmNidXNpcnE7Ci0JdW5zaWduZWQgY2hhciBtcGNfZHN0YXBpYzsKLQl1bnNpZ25lZCBjaGFyIG1wY19kc3RpcnE7CitzdHJ1Y3QgbXBjX2ludHNyYyB7CisJdW5zaWduZWQgY2hhciB0eXBlOworCXVuc2lnbmVkIGNoYXIgaXJxdHlwZTsKKwl1bnNpZ25lZCBzaG9ydCBpcnFmbGFnOworCXVuc2lnbmVkIGNoYXIgc3JjYnVzOworCXVuc2lnbmVkIGNoYXIgc3JjYnVzaXJxOworCXVuc2lnbmVkIGNoYXIgZHN0YXBpYzsKKwl1bnNpZ25lZCBjaGFyIGRzdGlycTsKIH07CiAKIGVudW0gbXBfaXJxX3NvdXJjZV90eXBlcyB7CkBAIC0xMzksMjQgKzEzOSwyNCBAQAogCiAjZGVmaW5lIE1QX0FQSUNfQUxMCTB4RkYKIAotc3RydWN0IG1wY19jb25maWdfbGludHNyYyB7Ci0JdW5zaWduZWQgY2hhciBtcGNfdHlwZTsKLQl1bnNpZ25lZCBjaGFyIG1wY19pcnF0eXBlOwotCXVuc2lnbmVkIHNob3J0IG1wY19pcnFmbGFnOwotCXVuc2lnbmVkIGNoYXIgbXBjX3NyY2J1c2lkOwotCXVuc2lnbmVkIGNoYXIgbXBjX3NyY2J1c2lycTsKLQl1bnNpZ25lZCBjaGFyIG1wY19kZXN0YXBpYzsKLQl1bnNpZ25lZCBjaGFyIG1wY19kZXN0YXBpY2xpbnQ7CitzdHJ1Y3QgbXBjX2xpbnRzcmMgeworCXVuc2lnbmVkIGNoYXIgdHlwZTsKKwl1bnNpZ25lZCBjaGFyIGlycXR5cGU7CisJdW5zaWduZWQgc2hvcnQgaXJxZmxhZzsKKwl1bnNpZ25lZCBjaGFyIHNyY2J1c2lkOworCXVuc2lnbmVkIGNoYXIgc3JjYnVzaXJxOworCXVuc2lnbmVkIGNoYXIgZGVzdGFwaWM7CisJdW5zaWduZWQgY2hhciBkZXN0YXBpY2xpbnQ7CiB9OwogCiAjZGVmaW5lIE1QQ19PRU1fU0lHTkFUVVJFICJfT0VNIgogCi1zdHJ1Y3QgbXBfY29uZmlnX29lbXRhYmxlIHsKLQljaGFyIG9lbV9zaWduYXR1cmVbNF07Ci0JdW5zaWduZWQgc2hvcnQgb2VtX2xlbmd0aDsJLyogU2l6ZSBvZiB0YWJsZSAqLwotCWNoYXIgIG9lbV9yZXY7CQkJLyogMHgwMSAqLwotCWNoYXIgIG9lbV9jaGVja3N1bTsKLQljaGFyICBtcGNfb2VtWzhdOworc3RydWN0IG1wY19vZW10YWJsZSB7CisJY2hhciBzaWduYXR1cmVbNF07CisJdW5zaWduZWQgc2hvcnQgbGVuZ3RoOwkJLyogU2l6ZSBvZiB0YWJsZSAqLworCWNoYXIgIHJldjsJCQkvKiAweDAxICovCisJY2hhciAgY2hlY2tzdW07CisJY2hhciAgbXBjWzhdOwogfTsKIAogLyoKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL210cnIuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL210cnIuaAppbmRleCBjYjk4OGFhLi4xNDA4MGQyIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9tdHJyLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vbXRyci5oCkBAIC01OCwxNSArNTgsMTUgQEAKICNlbmRpZiAvKiAhX19pMzg2X18gKi8KIAogc3RydWN0IG10cnJfdmFyX3JhbmdlIHsKLQl1MzIgYmFzZV9sbzsKLQl1MzIgYmFzZV9oaTsKLQl1MzIgbWFza19sbzsKLQl1MzIgbWFza19oaTsKKwlfX3UzMiBiYXNlX2xvOworCV9fdTMyIGJhc2VfaGk7CisJX191MzIgbWFza19sbzsKKwlfX3UzMiBtYXNrX2hpOwogfTsKIAogLyogSW4gdGhlIEludGVsIHByb2Nlc3NvcidzIE1UUlIgaW50ZXJmYWNlLCB0aGUgTVRSUiB0eXBlIGlzIGFsd2F5cyBoZWxkIGluCiAgICBhbiA4IGJpdCBmaWVsZDogKi8KLXR5cGVkZWYgdTggbXRycl90eXBlOwordHlwZWRlZiBfX3U4IG10cnJfdHlwZTsKIAogI2RlZmluZSBNVFJSX05VTV9GSVhFRF9SQU5HRVMgODgKICNkZWZpbmUgTVRSUl9NQVhfVkFSX1JBTkdFUyAyNTYKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL251bWFxL21wcGFyc2UuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL251bWFxL21wcGFyc2UuaAppbmRleCAyNTIyOTJlLi5hMmVlZWZjIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9udW1hcS9tcHBhcnNlLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vbnVtYXEvbXBwYXJzZS5oCkBAIC0xLDcgKzEsNiBAQAogI2lmbmRlZiBfX0FTTV9OVU1BUV9NUFBBUlNFX0gKICNkZWZpbmUgX19BU01fTlVNQVFfTVBQQVJTRV9ICiAKLWV4dGVybiB2b2lkIG51bWFxX21wc19vZW1fY2hlY2soc3RydWN0IG1wX2NvbmZpZ190YWJsZSAqbXBjLCBjaGFyICpvZW0sCi0JCQkJY2hhciAqcHJvZHVjdGlkKTsKK2V4dGVybiB2b2lkIG51bWFxX21wc19vZW1fY2hlY2soc3RydWN0IG1wY190YWJsZSAqLCBjaGFyICosIGNoYXIgKik7CiAKICNlbmRpZiAvKiBfX0FTTV9OVU1BUV9NUFBBUlNFX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3BndGFibGUuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3BndGFibGUuaAppbmRleCA4M2U2OWY0Li4wNmJiY2JkIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wZ3RhYmxlLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vcGd0YWJsZS5oCkBAIC0zNDEsNiArMzQxLDI1IEBACiAKICNkZWZpbmUgY2Fub25fcGdwcm90KHApIF9fcGdwcm90KHBncHJvdF92YWwocCkgJiBfX3N1cHBvcnRlZF9wdGVfbWFzaykKIAorc3RhdGljIGlubGluZSBpbnQgaXNfbmV3X21lbXR5cGVfYWxsb3dlZCh1bnNpZ25lZCBsb25nIGZsYWdzLAorCQkJCQkJdW5zaWduZWQgbG9uZyBuZXdfZmxhZ3MpCit7CisJLyoKKwkgKiBDZXJ0YWluIG5ldyBtZW10eXBlcyBhcmUgbm90IGFsbG93ZWQgd2l0aCBjZXJ0YWluCisJICogcmVxdWVzdGVkIG1lbXR5cGU6CisJICogLSByZXF1ZXN0IGlzIHVuY2FjaGVkLCByZXR1cm4gY2Fubm90IGJlIHdyaXRlLWJhY2sKKwkgKiAtIHJlcXVlc3QgaXMgd3JpdGUtY29tYmluZSwgcmV0dXJuIGNhbm5vdCBiZSB3cml0ZS1iYWNrCisJICovCisJaWYgKChmbGFncyA9PSBfUEFHRV9DQUNIRV9VQ19NSU5VUyAmJgorCSAgICAgbmV3X2ZsYWdzID09IF9QQUdFX0NBQ0hFX1dCKSB8fAorCSAgICAoZmxhZ3MgPT0gX1BBR0VfQ0FDSEVfV0MgJiYKKwkgICAgIG5ld19mbGFncyA9PSBfUEFHRV9DQUNIRV9XQikpIHsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDE7Cit9CisKICNpZm5kZWYgX19BU1NFTUJMWV9fCiAvKiBJbmRpY2F0ZSB0aGF0IHg4NiBoYXMgaXRzIG93biB0cmFjayBhbmQgdW50cmFjayBwZm4gdm1hIGZ1bmN0aW9ucyAqLwogI2RlZmluZSBfX0hBVkVfUEZOTUFQX1RSQUNLSU5HCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9zZXR1cC5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vc2V0dXAuaAppbmRleCA0ZmNkNTNmLi5lYmU4NThjIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9zZXR1cC5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3NldHVwLmgKQEAgLTI1LDkgKzI1LDkgQEAKIC8qCiAgKiBBbnkgc2V0dXAgcXVpcmtzIHRvIGJlIHBlcmZvcm1lZD8KICAqLwotc3RydWN0IG1wY19jb25maWdfcHJvY2Vzc29yOwotc3RydWN0IG1wY19jb25maWdfYnVzOwotc3RydWN0IG1wX2NvbmZpZ19vZW10YWJsZTsKK3N0cnVjdCBtcGNfY3B1Oworc3RydWN0IG1wY19idXM7CitzdHJ1Y3QgbXBjX29lbXRhYmxlOwogc3RydWN0IHg4Nl9xdWlya3MgewogCWludCAoKmFyY2hfcHJlX3RpbWVfaW5pdCkodm9pZCk7CiAJaW50ICgqYXJjaF90aW1lX2luaXQpKHZvaWQpOwpAQCAtMzksMTAgKzM5LDEwIEBACiAJaW50ICgqbWFjaF9maW5kX3NtcF9jb25maWcpKHVuc2lnbmVkIGludCByZXNlcnZlKTsKIAogCWludCAqbXBjX3JlY29yZDsKLQlpbnQgKCptcGNfYXBpY19pZCkoc3RydWN0IG1wY19jb25maWdfcHJvY2Vzc29yICptKTsKLQl2b2lkICgqbXBjX29lbV9idXNfaW5mbykoc3RydWN0IG1wY19jb25maWdfYnVzICptLCBjaGFyICpuYW1lKTsKLQl2b2lkICgqbXBjX29lbV9wY2lfYnVzKShzdHJ1Y3QgbXBjX2NvbmZpZ19idXMgKm0pOwotCXZvaWQgKCpzbXBfcmVhZF9tcGNfb2VtKShzdHJ1Y3QgbXBfY29uZmlnX29lbXRhYmxlICpvZW10YWJsZSwKKwlpbnQgKCptcGNfYXBpY19pZCkoc3RydWN0IG1wY19jcHUgKm0pOworCXZvaWQgKCptcGNfb2VtX2J1c19pbmZvKShzdHJ1Y3QgbXBjX2J1cyAqbSwgY2hhciAqbmFtZSk7CisJdm9pZCAoKm1wY19vZW1fcGNpX2J1cykoc3RydWN0IG1wY19idXMgKm0pOworCXZvaWQgKCpzbXBfcmVhZF9tcGNfb2VtKShzdHJ1Y3QgbXBjX29lbXRhYmxlICpvZW10YWJsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0IG9lbXNpemUpOwogCWludCAoKnNldHVwX2lvYXBpY19pZHMpKHZvaWQpOwogCWludCAoKnVwZGF0ZV9nZW5hcGljKSh2b2lkKTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3NtcC5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vc21wLmgKaW5kZXggODMwYjlmYy4uMTk5NTNkZiAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vc21wLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vc21wLmgKQEAgLTE4LDkgKzE4LDI2IEBACiAjaW5jbHVkZSA8YXNtL3BkYS5oPgogI2luY2x1ZGUgPGFzbS90aHJlYWRfaW5mby5oPgogCisjaWZkZWYgQ09ORklHX1g4Nl82NAorCitleHRlcm4gY3B1bWFza192YXJfdCBjcHVfY2FsbGluX21hc2s7CitleHRlcm4gY3B1bWFza192YXJfdCBjcHVfY2FsbG91dF9tYXNrOworZXh0ZXJuIGNwdW1hc2tfdmFyX3QgY3B1X2luaXRpYWxpemVkX21hc2s7CitleHRlcm4gY3B1bWFza192YXJfdCBjcHVfc2libGluZ19zZXR1cF9tYXNrOworCisjZWxzZSAvKiBDT05GSUdfWDg2XzMyICovCisKK2V4dGVybiBjcHVtYXNrX3QgY3B1X2NhbGxpbl9tYXA7CiBleHRlcm4gY3B1bWFza190IGNwdV9jYWxsb3V0X21hcDsKIGV4dGVybiBjcHVtYXNrX3QgY3B1X2luaXRpYWxpemVkOwotZXh0ZXJuIGNwdW1hc2tfdCBjcHVfY2FsbGluX21hcDsKK2V4dGVybiBjcHVtYXNrX3QgY3B1X3NpYmxpbmdfc2V0dXBfbWFwOworCisjZGVmaW5lIGNwdV9jYWxsaW5fbWFzawkJKChzdHJ1Y3QgY3B1bWFzayAqKSZjcHVfY2FsbGluX21hcCkKKyNkZWZpbmUgY3B1X2NhbGxvdXRfbWFzawkoKHN0cnVjdCBjcHVtYXNrICopJmNwdV9jYWxsb3V0X21hcCkKKyNkZWZpbmUgY3B1X2luaXRpYWxpemVkX21hc2sJKChzdHJ1Y3QgY3B1bWFzayAqKSZjcHVfaW5pdGlhbGl6ZWQpCisjZGVmaW5lIGNwdV9zaWJsaW5nX3NldHVwX21hc2sJKChzdHJ1Y3QgY3B1bWFzayAqKSZjcHVfc2libGluZ19zZXR1cF9tYXApCisKKyNlbmRpZiAvKiBDT05GSUdfWDg2XzMyICovCiAKIGV4dGVybiB2b2lkICgqbXRycl9ob29rKSh2b2lkKTsKIGV4dGVybiB2b2lkIHphcF9sb3dfbWFwcGluZ3Modm9pZCk7CkBAIC0yOSw3ICs0Niw2IEBACiAKIGV4dGVybiBpbnQgc21wX251bV9zaWJsaW5nczsKIGV4dGVybiB1bnNpZ25lZCBpbnQgbnVtX3Byb2Nlc3NvcnM7Ci1leHRlcm4gY3B1bWFza190IGNwdV9pbml0aWFsaXplZDsKIAogREVDTEFSRV9QRVJfQ1BVKGNwdW1hc2tfdCwgY3B1X3NpYmxpbmdfbWFwKTsKIERFQ0xBUkVfUEVSX0NQVShjcHVtYXNrX3QsIGNwdV9jb3JlX21hcCk7CkBAIC0zOCw2ICs1NCwxNiBAQAogREVDTEFSRV9QRVJfQ1BVKGludCwgY3B1X251bWJlcik7CiAjZW5kaWYKIAorc3RhdGljIGlubGluZSBzdHJ1Y3QgY3B1bWFzayAqY3B1X3NpYmxpbmdfbWFzayhpbnQgY3B1KQoreworCXJldHVybiAmcGVyX2NwdShjcHVfc2libGluZ19tYXAsIGNwdSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGNwdW1hc2sgKmNwdV9jb3JlX21hc2soaW50IGNwdSkKK3sKKwlyZXR1cm4gJnBlcl9jcHUoY3B1X2NvcmVfbWFwLCBjcHUpOworfQorCiBERUNMQVJFX0VBUkxZX1BFUl9DUFUodTE2LCB4ODZfY3B1X3RvX2FwaWNpZCk7CiBERUNMQVJFX0VBUkxZX1BFUl9DUFUodTE2LCB4ODZfYmlvc19jcHVfYXBpY2lkKTsKIApAQCAtMTQ5LDcgKzE3NSw3IEBACiAvKiBXZSBkb24ndCBtYXJrIENQVXMgb25saW5lIHVudGlsIF9fY3B1X3VwKCksIHNvIHdlIG5lZWQgYW5vdGhlciBtZWFzdXJlICovCiBzdGF0aWMgaW5saW5lIGludCBudW1fYm9vdGluZ19jcHVzKHZvaWQpCiB7Ci0JcmV0dXJuIGNwdXNfd2VpZ2h0KGNwdV9jYWxsb3V0X21hcCk7CisJcmV0dXJuIGNwdW1hc2tfd2VpZ2h0KGNwdV9jYWxsb3V0X21hc2spOwogfQogI2Vsc2UKIHN0YXRpYyBpbmxpbmUgdm9pZCBwcmVmaWxsX3Bvc3NpYmxlX21hcCh2b2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vc3VtbWl0L2FwaWMuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3N1bW1pdC9hcGljLmgKaW5kZXggNGJiNWZiMy4uOTNkMmM4NiAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vc3VtbWl0L2FwaWMuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9zdW1taXQvYXBpYy5oCkBAIC0yLDYgKzIsNyBAQAogI2RlZmluZSBfX0FTTV9TVU1NSVRfQVBJQ19ICiAKICNpbmNsdWRlIDxhc20vc21wLmg+CisjaW5jbHVkZSA8bGludXgvZ2ZwLmg+CiAKICNkZWZpbmUgZXNyX2Rpc2FibGUgKDEpCiAjZGVmaW5lIE5PX0JBTEFOQ0VfSVJRICgwKQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vc3VtbWl0L21wcGFyc2UuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3N1bW1pdC9tcHBhcnNlLmgKaW5kZXggMDEzY2U2Zi4uMzgwZTg2YyAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vc3VtbWl0L21wcGFyc2UuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9zdW1taXQvbXBwYXJzZS5oCkBAIC0xMSw3ICsxMSw3IEBACiAjZGVmaW5lIHNldHVwX3N1bW1pdCgpCXt9CiAjZW5kaWYKIAotc3RhdGljIGlubGluZSBpbnQgbXBzX29lbV9jaGVjayhzdHJ1Y3QgbXBfY29uZmlnX3RhYmxlICptcGMsIGNoYXIgKm9lbSwKK3N0YXRpYyBpbmxpbmUgaW50IG1wc19vZW1fY2hlY2soc3RydWN0IG1wY190YWJsZSAqbXBjLCBjaGFyICpvZW0sCiAJCWNoYXIgKnByb2R1Y3RpZCkKIHsKIAlpZiAoIXN0cm5jbXAob2VtLCAiSUJNIEVOU1ciLCA4KSAmJgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2FjcGkvYm9vdC5jIGIvYXJjaC94ODYva2VybmVsL2FjcGkvYm9vdC5jCmluZGV4IDI5ZGMwYzguLmQzNzU5M2MgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9hY3BpL2Jvb3QuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvYWNwaS9ib290LmMKQEAgLTQ3LDcgKzQ3LDcgQEAKICNlbmRpZgogCiBzdGF0aWMgaW50IF9faW5pdGRhdGEgYWNwaV9mb3JjZSA9IDA7Ci0KK3UzMiBhY3BpX3JzZHRfZm9yY2VkOwogI2lmZGVmCUNPTkZJR19BQ1BJCiBpbnQgYWNwaV9kaXNhYmxlZCA9IDA7CiAjZWxzZQpAQCAtMTM3NCw2ICsxMzc0LDE3IEBACiAJCQkgICAgICAgIkludmFsaWQgQklPUyBNQURULCBkaXNhYmxpbmcgQUNQSVxuIik7CiAJCQlkaXNhYmxlX2FjcGkoKTsKIAkJfQorCX0gZWxzZSB7CisJCS8qCisgCQkgKiBBQ1BJIGZvdW5kIG5vIE1BRFQsIGFuZCBzbyBBQ1BJIHdhbnRzIFVQIFBJQyBtb2RlLgorIAkJICogSW4gdGhlIGV2ZW50IGFuIE1QUyB0YWJsZSB3YXMgZm91bmQsIGZvcmdldCBpdC4KKyAJCSAqIEJvb3Qgd2l0aCAiYWNwaT1vZmYiIHRvIHVzZSBNUFMgb24gc3VjaCBhIHN5c3RlbS4KKyAJCSAqLworCQlpZiAoc21wX2ZvdW5kX2NvbmZpZykgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyBQUkVGSVgKKwkJCQkiTm8gQVBJQy10YWJsZSwgZGlzYWJsaW5nIE1QU1xuIik7CisJCQlzbXBfZm91bmRfY29uZmlnID0gMDsKKwkJfQogCX0KIAogCS8qCkBAIC0xODA5LDYgKzE4MjAsMTAgQEAKIAkJCWRpc2FibGVfYWNwaSgpOwogCQlhY3BpX2h0ID0gMTsKIAl9CisJLyogYWNwaT1yc2R0IHVzZSBSU0RUIGluc3RlYWQgb2YgWFNEVCAqLworCWVsc2UgaWYgKHN0cmNtcChhcmcsICJyc2R0IikgPT0gMCkgeworCQlhY3BpX3JzZHRfZm9yY2VkID0gMTsKKwl9CiAJLyogImFjcGk9bm9pcnEiIGRpc2FibGVzIEFDUEkgaW50ZXJydXB0IHJvdXRpbmcgKi8KIAllbHNlIGlmIChzdHJjbXAoYXJnLCAibm9pcnEiKSA9PSAwKSB7CiAJCWFjcGlfbm9pcnFfc2V0KCk7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvYWNwaS9jc3RhdGUuYyBiL2FyY2gveDg2L2tlcm5lbC9hY3BpL2NzdGF0ZS5jCmluZGV4IGMyNTAyZWIuLmJiYmU0YmIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9hY3BpL2NzdGF0ZS5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9hY3BpL2NzdGF0ZS5jCkBAIC01Niw2ICs1Niw3IEBACiBzdGF0aWMgc2hvcnQgbXdhaXRfc3VwcG9ydGVkW0FDUElfUFJPQ0VTU09SX01BWF9QT1dFUl07CiAKICNkZWZpbmUgTVdBSVRfU1VCU1RBVEVfTUFTSwkoMHhmKQorI2RlZmluZSBNV0FJVF9DU1RBVEVfTUFTSwkoMHhmKQogI2RlZmluZSBNV0FJVF9TVUJTVEFURV9TSVpFCSg0KQogCiAjZGVmaW5lIENQVUlEX01XQUlUX0xFQUYgKDUpCkBAIC02NiwzOSArNjcsMjAgQEAKIAogI2RlZmluZSBOQVRJVkVfQ1NUQVRFX0JFWU9ORF9IQUxUCSgyKQogCi1pbnQgYWNwaV9wcm9jZXNzb3JfZmZoX2NzdGF0ZV9wcm9iZSh1bnNpZ25lZCBpbnQgY3B1LAotCQlzdHJ1Y3QgYWNwaV9wcm9jZXNzb3JfY3ggKmN4LCBzdHJ1Y3QgYWNwaV9wb3dlcl9yZWdpc3RlciAqcmVnKQorc3RhdGljIGxvbmcgYWNwaV9wcm9jZXNzb3JfZmZoX2NzdGF0ZV9wcm9iZV9jcHUodm9pZCAqX2N4KQogewotCXN0cnVjdCBjc3RhdGVfZW50cnkgKnBlcmNwdV9lbnRyeTsKLQlzdHJ1Y3QgY3B1aW5mb194ODYgKmMgPSAmY3B1X2RhdGEoY3B1KTsKLQotCWNwdW1hc2tfdCBzYXZlZF9tYXNrOwotCWludCByZXR2YWw7CisJc3RydWN0IGFjcGlfcHJvY2Vzc29yX2N4ICpjeCA9IF9jeDsKKwlsb25nIHJldHZhbDsKIAl1bnNpZ25lZCBpbnQgZWF4LCBlYngsIGVjeCwgZWR4OwogCXVuc2lnbmVkIGludCBlZHhfcGFydDsKIAl1bnNpZ25lZCBpbnQgY3N0YXRlX3R5cGU7IC8qIEMtc3RhdGUgdHlwZSBhbmQgbm90IEFDUEkgQy1zdGF0ZSB0eXBlICovCiAJdW5zaWduZWQgaW50IG51bV9jc3RhdGVfc3VidHlwZTsKIAotCWlmICghY3B1X2NzdGF0ZV9lbnRyeSB8fCBjLT5jcHVpZF9sZXZlbCA8IENQVUlEX01XQUlUX0xFQUYgKQotCQlyZXR1cm4gLTE7Ci0KLQlpZiAocmVnLT5iaXRfb2Zmc2V0ICE9IE5BVElWRV9DU1RBVEVfQkVZT05EX0hBTFQpCi0JCXJldHVybiAtMTsKLQotCXBlcmNwdV9lbnRyeSA9IHBlcl9jcHVfcHRyKGNwdV9jc3RhdGVfZW50cnksIGNwdSk7Ci0JcGVyY3B1X2VudHJ5LT5zdGF0ZXNbY3gtPmluZGV4XS5lYXggPSAwOwotCXBlcmNwdV9lbnRyeS0+c3RhdGVzW2N4LT5pbmRleF0uZWN4ID0gMDsKLQotCS8qIE1ha2Ugc3VyZSB3ZSBhcmUgcnVubmluZyBvbiByaWdodCBDUFUgKi8KLQlzYXZlZF9tYXNrID0gY3VycmVudC0+Y3B1c19hbGxvd2VkOwotCXJldHZhbCA9IHNldF9jcHVzX2FsbG93ZWRfcHRyKGN1cnJlbnQsICZjcHVtYXNrX29mX2NwdShjcHUpKTsKLQlpZiAocmV0dmFsKQotCQlyZXR1cm4gLTE7Ci0KIAljcHVpZChDUFVJRF9NV0FJVF9MRUFGLCAmZWF4LCAmZWJ4LCAmZWN4LCAmZWR4KTsKIAogCS8qIENoZWNrIHdoZXRoZXIgdGhpcyBwYXJ0aWN1bGFyIGN4X3R5cGUgKGluIENTVCkgaXMgc3VwcG9ydGVkIG9yIG5vdCAqLwotCWNzdGF0ZV90eXBlID0gKGN4LT5hZGRyZXNzID4+IE1XQUlUX1NVQlNUQVRFX1NJWkUpICsgMTsKKwljc3RhdGVfdHlwZSA9ICgoY3gtPmFkZHJlc3MgPj4gTVdBSVRfU1VCU1RBVEVfU0laRSkgJgorCQkJTVdBSVRfQ1NUQVRFX01BU0spICsgMTsKIAllZHhfcGFydCA9IGVkeCA+PiAoY3N0YXRlX3R5cGUgKiBNV0FJVF9TVUJTVEFURV9TSVpFKTsKIAludW1fY3N0YXRlX3N1YnR5cGUgPSBlZHhfcGFydCAmIE1XQUlUX1NVQlNUQVRFX01BU0s7CiAKQEAgLTExNCwyMSArOTYsNDUgQEAKIAkJcmV0dmFsID0gLTE7CiAJCWdvdG8gb3V0OwogCX0KLQlwZXJjcHVfZW50cnktPnN0YXRlc1tjeC0+aW5kZXhdLmVjeCA9IE1XQUlUX0VDWF9JTlRFUlJVUFRfQlJFQUs7Ci0KLQkvKiBVc2UgdGhlIGhpbnQgaW4gQ1NUICovCi0JcGVyY3B1X2VudHJ5LT5zdGF0ZXNbY3gtPmluZGV4XS5lYXggPSBjeC0+YWRkcmVzczsKIAogCWlmICghbXdhaXRfc3VwcG9ydGVkW2NzdGF0ZV90eXBlXSkgewogCQltd2FpdF9zdXBwb3J0ZWRbY3N0YXRlX3R5cGVdID0gMTsKLQkJcHJpbnRrKEtFUk5fREVCVUcgIk1vbml0b3ItTXdhaXQgd2lsbCBiZSB1c2VkIHRvIGVudGVyIEMtJWQgIgotCQkgICAgICAgInN0YXRlXG4iLCBjeC0+dHlwZSk7CisJCXByaW50ayhLRVJOX0RFQlVHCisJCQkiTW9uaXRvci1Nd2FpdCB3aWxsIGJlIHVzZWQgdG8gZW50ZXIgQy0lZCAiCisJCQkic3RhdGVcbiIsIGN4LT50eXBlKTsKIAl9Ci0Jc25wcmludGYoY3gtPmRlc2MsIEFDUElfQ1hfREVTQ19MRU4sICJBQ1BJIEZGSCBJTlRFTCBNV0FJVCAweCV4IiwKLQkJIGN4LT5hZGRyZXNzKTsKLQorCXNucHJpbnRmKGN4LT5kZXNjLAorCQkJQUNQSV9DWF9ERVNDX0xFTiwgIkFDUEkgRkZIIElOVEVMIE1XQUlUIDB4JXgiLAorCQkJY3gtPmFkZHJlc3MpOwogb3V0OgotCXNldF9jcHVzX2FsbG93ZWRfcHRyKGN1cnJlbnQsICZzYXZlZF9tYXNrKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCitpbnQgYWNwaV9wcm9jZXNzb3JfZmZoX2NzdGF0ZV9wcm9iZSh1bnNpZ25lZCBpbnQgY3B1LAorCQlzdHJ1Y3QgYWNwaV9wcm9jZXNzb3JfY3ggKmN4LCBzdHJ1Y3QgYWNwaV9wb3dlcl9yZWdpc3RlciAqcmVnKQoreworCXN0cnVjdCBjc3RhdGVfZW50cnkgKnBlcmNwdV9lbnRyeTsKKwlzdHJ1Y3QgY3B1aW5mb194ODYgKmMgPSAmY3B1X2RhdGEoY3B1KTsKKwlsb25nIHJldHZhbDsKKworCWlmICghY3B1X2NzdGF0ZV9lbnRyeSB8fCBjLT5jcHVpZF9sZXZlbCA8IENQVUlEX01XQUlUX0xFQUYpCisJCXJldHVybiAtMTsKKworCWlmIChyZWctPmJpdF9vZmZzZXQgIT0gTkFUSVZFX0NTVEFURV9CRVlPTkRfSEFMVCkKKwkJcmV0dXJuIC0xOworCisJcGVyY3B1X2VudHJ5ID0gcGVyX2NwdV9wdHIoY3B1X2NzdGF0ZV9lbnRyeSwgY3B1KTsKKwlwZXJjcHVfZW50cnktPnN0YXRlc1tjeC0+aW5kZXhdLmVheCA9IDA7CisJcGVyY3B1X2VudHJ5LT5zdGF0ZXNbY3gtPmluZGV4XS5lY3ggPSAwOworCisJLyogTWFrZSBzdXJlIHdlIGFyZSBydW5uaW5nIG9uIHJpZ2h0IENQVSAqLworCisJcmV0dmFsID0gd29ya19vbl9jcHUoY3B1LCBhY3BpX3Byb2Nlc3Nvcl9mZmhfY3N0YXRlX3Byb2JlX2NwdSwgY3gpOworCWlmIChyZXR2YWwgPT0gMCkgeworCQkvKiBVc2UgdGhlIGhpbnQgaW4gQ1NUICovCisJCXBlcmNwdV9lbnRyeS0+c3RhdGVzW2N4LT5pbmRleF0uZWF4ID0gY3gtPmFkZHJlc3M7CisJCXBlcmNwdV9lbnRyeS0+c3RhdGVzW2N4LT5pbmRleF0uZWN4ID0gTVdBSVRfRUNYX0lOVEVSUlVQVF9CUkVBSzsKKwl9CiAJcmV0dXJuIHJldHZhbDsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGFjcGlfcHJvY2Vzc29yX2ZmaF9jc3RhdGVfcHJvYmUpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2FjcGkvc2xlZXAuYyBiL2FyY2gveDg2L2tlcm5lbC9hY3BpL3NsZWVwLmMKaW5kZXggODA2YjRlOS4uNzA3YzFmNiAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2FjcGkvc2xlZXAuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvYWNwaS9zbGVlcC5jCkBAIC0xNTksNiArMTU5LDggQEAKICNlbmRpZgogCQlpZiAoc3RybmNtcChzdHIsICJvbGRfb3JkZXJpbmciLCAxMikgPT0gMCkKIAkJCWFjcGlfb2xkX3N1c3BlbmRfb3JkZXJpbmcoKTsKKwkJaWYgKHN0cm5jbXAoc3RyLCAiczRfbm9udnMiLCA4KSA9PSAwKQorCQkJYWNwaV9zNF9ub19udnMoKTsKIAkJc3RyID0gc3RyY2hyKHN0ciwgJywnKTsKIAkJaWYgKHN0ciAhPSBOVUxMKQogCQkJc3RyICs9IHN0cnNwbihzdHIsICIsIFx0Iik7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvYXBpYy5jIGIvYXJjaC94ODYva2VybmVsL2FwaWMuYwppbmRleCBiMTNkM2M0Li4wZjgzMGU0IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvYXBpYy5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9hcGljLmMKQEAgLTMxLDkgKzMxLDExIEBACiAjaW5jbHVkZSA8bGludXgvZG1pLmg+CiAjaW5jbHVkZSA8bGludXgvZG1hci5oPgogI2luY2x1ZGUgPGxpbnV4L2Z0cmFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgorI2luY2x1ZGUgPGxpbnV4L25taS5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWV4Lmg+CiAKICNpbmNsdWRlIDxhc20vYXRvbWljLmg+Ci0jaW5jbHVkZSA8YXNtL3NtcC5oPgogI2luY2x1ZGUgPGFzbS9tdHJyLmg+CiAjaW5jbHVkZSA8YXNtL21wc3BlYy5oPgogI2luY2x1ZGUgPGFzbS9kZXNjLmg+CkBAIC00MSwxMiArNDMsMTEgQEAKICNpbmNsdWRlIDxhc20vaHBldC5oPgogI2luY2x1ZGUgPGFzbS9wZ2FsbG9jLmg+CiAjaW5jbHVkZSA8YXNtL2k4MjUzLmg+Ci0jaW5jbHVkZSA8YXNtL25taS5oPgogI2luY2x1ZGUgPGFzbS9pZGxlLmg+CiAjaW5jbHVkZSA8YXNtL3Byb3RvLmg+Ci0jaW5jbHVkZSA8YXNtL3RpbWV4Lmg+CiAjaW5jbHVkZSA8YXNtL2FwaWMuaD4KICNpbmNsdWRlIDxhc20vaTgyNTkuaD4KKyNpbmNsdWRlIDxhc20vc21wLmg+CiAKICNpbmNsdWRlIDxtYWNoX2FwaWMuaD4KICNpbmNsdWRlIDxtYWNoX2FwaWNkZWYuaD4KQEAgLTY4Nyw3ICs2ODgsNyBAQAogCQlsb2NhbF9pcnFfZW5hYmxlKCk7CiAKIAlpZiAobGV2dC0+ZmVhdHVyZXMgJiBDTE9DS19FVlRfRkVBVF9EVU1NWSkgewotCQlwcl93YXJuaW5nKCJBUElDIHRpbWVyIGRpc2FibGVkIGR1ZSB0byB2ZXJpZmljYXRpb24gZmFpbHVyZS5cbiIpOworCQlwcl93YXJuaW5nKCJBUElDIHRpbWVyIGRpc2FibGVkIGR1ZSB0byB2ZXJpZmljYXRpb24gZmFpbHVyZVxuIik7CiAJCQlyZXR1cm4gLTE7CiAJfQogCkBAIC0yMDg3LDE0ICsyMDg4LDEyIEBACiAJCS8qIGFyZSB3ZSBiZWluZyBjYWxsZWQgZWFybHkgaW4ga2VybmVsIHN0YXJ0dXA/ICovCiAJCWlmIChiaW9zX2NwdV9hcGljaWQpIHsKIAkJCWlkID0gYmlvc19jcHVfYXBpY2lkW2ldOwotCQl9Ci0JCWVsc2UgaWYgKGkgPCBucl9jcHVfaWRzKSB7CisJCX0gZWxzZSBpZiAoaSA8IG5yX2NwdV9pZHMpIHsKIAkJCWlmIChjcHVfcHJlc2VudChpKSkKIAkJCQlpZCA9IHBlcl9jcHUoeDg2X2Jpb3NfY3B1X2FwaWNpZCwgaSk7CiAJCQllbHNlCiAJCQkJY29udGludWU7Ci0JCX0KLQkJZWxzZQorCQl9IGVsc2UKIAkJCWJyZWFrOwogCiAJCWlmIChpZCAhPSBCQURfQVBJQ0lEKQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2FwbV8zMi5jIGIvYXJjaC94ODYva2VybmVsL2FwbV8zMi5jCmluZGV4IDNhMjY1MjUuLjk4ODA3YmIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9hcG1fMzIuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvYXBtXzMyLmMKQEAgLTE2MCw5ICsxNjAsOSBAQAogICogICAgICAgICBXb3JrIGFyb3VuZCBieXRlIHN3YXAgYnVnIGluIG9uZSBvZiB0aGUgVmFpbydzIEJJT1MncwogICogICAgICAgICAoTWFyYyBCb3VjaGVyIDxtYXJjQG1ic2kuY2E+KS4KICAqICAgICAgICAgRXhwb3NlZCB0aGUgZGlzYWJsZSBmbGFnIHRvIGRtaSBzbyB0aGF0IHdlIGNhbiBoYW5kbGUga25vd24KLSAqICAgICAgICAgYnJva2VuIEFQTSAoQWxhbiBDb3ggPGFsYW5AcmVkaGF0LmNvbT4pLgorICogICAgICAgICBicm9rZW4gQVBNIChBbGFuIENveCA8YWxhbkBseG9yZ3VrLnVrdXUub3JnLnVrPikuCiAgKiAgIDEuMTRhYzogSWYgdGhlIEJJT1Mgc2F5cyAiSSBzbG93ZWQgdGhlIENQVSBkb3duIiB0aGVuIGRvbid0IHNwaW4KLSAqICAgICAgICAgY2FsbGluZyBpdCAtIGluc3RlYWQgaWRsZS4gKEFsYW4gQ294IDxhbGFuQHJlZGhhdC5jb20+KQorICogICAgICAgICBjYWxsaW5nIGl0IC0gaW5zdGVhZCBpZGxlLiAoQWxhbiBDb3ggPGFsYW5AbHhvcmd1ay51a3V1Lm9yZy51az4pCiAgKiAgICAgICAgIElmIGFuIEFQTSBpZGxlIGZhaWxzIGxvZyBpdCBhbmQgaWRsZSBzZW5zaWJseQogICogICAxLjE1OiBEb24ndCBxdWV1ZSBldmVudHMgdG8gY2xpZW50cyB3aG8gb3BlbiB0aGUgZGV2aWNlIE9fV1JPTkxZLgogICogICAgICAgICBEb24ndCBleHBlY3QgcmVwbGllcyBmcm9tIGNsaWVudHMgd2hvIG9wZW4gdGhlIGRldmljZSBPX1JET05MWS4KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9jcHUvY29tbW9uLmMgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NvbW1vbi5jCmluZGV4IDNmOTVhNDAuLjgzNDkyYjEgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9jcHUvY29tbW9uLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2NwdS9jb21tb24uYwpAQCAtNDAsNiArNDAsMjYgQEAKIAogI2luY2x1ZGUgImNwdS5oIgogCisjaWZkZWYgQ09ORklHX1g4Nl82NAorCisvKiBhbGwgb2YgdGhlc2UgbWFza3MgYXJlIGluaXRpYWxpemVkIGluIHNldHVwX2NwdV9sb2NhbF9tYXNrcygpICovCitjcHVtYXNrX3Zhcl90IGNwdV9jYWxsaW5fbWFzazsKK2NwdW1hc2tfdmFyX3QgY3B1X2NhbGxvdXRfbWFzazsKK2NwdW1hc2tfdmFyX3QgY3B1X2luaXRpYWxpemVkX21hc2s7CisKKy8qIHJlcHJlc2VudGluZyBjcHVzIGZvciB3aGljaCBzaWJsaW5nIG1hcHMgY2FuIGJlIGNvbXB1dGVkICovCitjcHVtYXNrX3Zhcl90IGNwdV9zaWJsaW5nX3NldHVwX21hc2s7CisKKyNlbHNlIC8qIENPTkZJR19YODZfMzIgKi8KKworY3B1bWFza190IGNwdV9jYWxsaW5fbWFwOworY3B1bWFza190IGNwdV9jYWxsb3V0X21hcDsKK2NwdW1hc2tfdCBjcHVfaW5pdGlhbGl6ZWQ7CitjcHVtYXNrX3QgY3B1X3NpYmxpbmdfc2V0dXBfbWFwOworCisjZW5kaWYgLyogQ09ORklHX1g4Nl8zMiAqLworCisKIHN0YXRpYyBzdHJ1Y3QgY3B1X2RldiAqdGhpc19jcHUgX19jcHVpbml0ZGF0YTsKIAogI2lmZGVmIENPTkZJR19YODZfNjQKQEAgLTg1Niw4ICs4NzYsNiBAQAogfQogX19zZXR1cCgiY2xlYXJjcHVpZD0iLCBzZXR1cF9kaXNhYmxlY3B1aWQpOwogCi1jcHVtYXNrX3QgY3B1X2luaXRpYWxpemVkIF9fY3B1aW5pdGRhdGEgPSBDUFVfTUFTS19OT05FOwotCiAjaWZkZWYgQ09ORklHX1g4Nl82NAogc3RydWN0IHg4NjY0X3BkYSAqKl9jcHVfcGRhIF9fcmVhZF9tb3N0bHk7CiBFWFBPUlRfU1lNQk9MKF9jcHVfcGRhKTsKQEAgLTk3Niw3ICs5OTQsNyBAQAogCiAJbWUgPSBjdXJyZW50OwogCi0JaWYgKGNwdV90ZXN0X2FuZF9zZXQoY3B1LCBjcHVfaW5pdGlhbGl6ZWQpKQorCWlmIChjcHVtYXNrX3Rlc3RfYW5kX3NldF9jcHUoY3B1LCBjcHVfaW5pdGlhbGl6ZWRfbWFzaykpCiAJCXBhbmljKCJDUFUjJWQgYWxyZWFkeSBpbml0aWFsaXplZCFcbiIsIGNwdSk7CiAKIAlwcmludGsoS0VSTl9JTkZPICJJbml0aWFsaXppbmcgQ1BVIyVkXG4iLCBjcHUpOwpAQCAtMTA4NSw3ICsxMTAzLDcgQEAKIAlzdHJ1Y3QgdHNzX3N0cnVjdCAqdCA9ICZwZXJfY3B1KGluaXRfdHNzLCBjcHUpOwogCXN0cnVjdCB0aHJlYWRfc3RydWN0ICp0aHJlYWQgPSAmY3Vyci0+dGhyZWFkOwogCi0JaWYgKGNwdV90ZXN0X2FuZF9zZXQoY3B1LCBjcHVfaW5pdGlhbGl6ZWQpKSB7CisJaWYgKGNwdW1hc2tfdGVzdF9hbmRfc2V0X2NwdShjcHUsIGNwdV9pbml0aWFsaXplZF9tYXNrKSkgewogCQlwcmludGsoS0VSTl9XQVJOSU5HICJDUFUjJWQgYWxyZWFkeSBpbml0aWFsaXplZCFcbiIsIGNwdSk7CiAJCWZvciAoOzspIGxvY2FsX2lycV9lbmFibGUoKTsKIAl9CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvYWNwaS1jcHVmcmVxLmMgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvYWNwaS1jcHVmcmVxLmMKaW5kZXggMjgxMDJhZC4uNmYxMWUwMiAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2NwdS9jcHVmcmVxL2FjcGktY3B1ZnJlcS5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9hY3BpLWNwdWZyZXEuYwpAQCAtMTQ1LDcgKzE0NSw3IEBACiAKIHN0cnVjdCBkcnZfY21kIHsKIAl1bnNpZ25lZCBpbnQgdHlwZTsKLQljcHVtYXNrX3QgbWFzazsKKwljcHVtYXNrX3Zhcl90IG1hc2s7CiAJZHJ2X2FkZHJfdW5pb24gYWRkcjsKIAl1MzIgdmFsOwogfTsKQEAgLTE5Myw3ICsxOTMsNyBAQAogCWNwdW1hc2tfdCBzYXZlZF9tYXNrID0gY3VycmVudC0+Y3B1c19hbGxvd2VkOwogCWNtZC0+dmFsID0gMDsKIAotCXNldF9jcHVzX2FsbG93ZWRfcHRyKGN1cnJlbnQsICZjbWQtPm1hc2spOworCXNldF9jcHVzX2FsbG93ZWRfcHRyKGN1cnJlbnQsIGNtZC0+bWFzayk7CiAJZG9fZHJ2X3JlYWQoY21kKTsKIAlzZXRfY3B1c19hbGxvd2VkX3B0cihjdXJyZW50LCAmc2F2ZWRfbWFzayk7CiB9CkBAIC0yMDMsOCArMjAzLDggQEAKIAljcHVtYXNrX3Qgc2F2ZWRfbWFzayA9IGN1cnJlbnQtPmNwdXNfYWxsb3dlZDsKIAl1bnNpZ25lZCBpbnQgaTsKIAotCWZvcl9lYWNoX2NwdV9tYXNrX25yKGksIGNtZC0+bWFzaykgewotCQlzZXRfY3B1c19hbGxvd2VkX3B0cihjdXJyZW50LCAmY3B1bWFza19vZl9jcHUoaSkpOworCWZvcl9lYWNoX2NwdShpLCBjbWQtPm1hc2spIHsKKwkJc2V0X2NwdXNfYWxsb3dlZF9wdHIoY3VycmVudCwgY3B1bWFza19vZihpKSk7CiAJCWRvX2Rydl93cml0ZShjbWQpOwogCX0KIApAQCAtMjEyLDIyICsyMTIsMjIgQEAKIAlyZXR1cm47CiB9CiAKLXN0YXRpYyB1MzIgZ2V0X2N1cl92YWwoY29uc3QgY3B1bWFza190ICptYXNrKQorc3RhdGljIHUzMiBnZXRfY3VyX3ZhbChjb25zdCBzdHJ1Y3QgY3B1bWFzayAqbWFzaykKIHsKIAlzdHJ1Y3QgYWNwaV9wcm9jZXNzb3JfcGVyZm9ybWFuY2UgKnBlcmY7CiAJc3RydWN0IGRydl9jbWQgY21kOwogCi0JaWYgKHVubGlrZWx5KGNwdXNfZW1wdHkoKm1hc2spKSkKKwlpZiAodW5saWtlbHkoY3B1bWFza19lbXB0eShtYXNrKSkpCiAJCXJldHVybiAwOwogCi0Jc3dpdGNoIChwZXJfY3B1KGRydl9kYXRhLCBmaXJzdF9jcHUoKm1hc2spKS0+Y3B1X2ZlYXR1cmUpIHsKKwlzd2l0Y2ggKHBlcl9jcHUoZHJ2X2RhdGEsIGNwdW1hc2tfZmlyc3QobWFzaykpLT5jcHVfZmVhdHVyZSkgewogCWNhc2UgU1lTVEVNX0lOVEVMX01TUl9DQVBBQkxFOgogCQljbWQudHlwZSA9IFNZU1RFTV9JTlRFTF9NU1JfQ0FQQUJMRTsKIAkJY21kLmFkZHIubXNyLnJlZyA9IE1TUl9JQTMyX1BFUkZfU1RBVFVTOwogCQlicmVhazsKIAljYXNlIFNZU1RFTV9JT19DQVBBQkxFOgogCQljbWQudHlwZSA9IFNZU1RFTV9JT19DQVBBQkxFOwotCQlwZXJmID0gcGVyX2NwdShkcnZfZGF0YSwgZmlyc3RfY3B1KCptYXNrKSktPmFjcGlfZGF0YTsKKwkJcGVyZiA9IHBlcl9jcHUoZHJ2X2RhdGEsIGNwdW1hc2tfZmlyc3QobWFzaykpLT5hY3BpX2RhdGE7CiAJCWNtZC5hZGRyLmlvLnBvcnQgPSBwZXJmLT5jb250cm9sX3JlZ2lzdGVyLmFkZHJlc3M7CiAJCWNtZC5hZGRyLmlvLmJpdF93aWR0aCA9IHBlcmYtPmNvbnRyb2xfcmVnaXN0ZXIuYml0X3dpZHRoOwogCQlicmVhazsKQEAgLTIzNSw3ICsyMzUsNyBAQAogCQlyZXR1cm4gMDsKIAl9CiAKLQljbWQubWFzayA9ICptYXNrOworCWNwdW1hc2tfY29weShjbWQubWFzaywgbWFzayk7CiAKIAlkcnZfcmVhZCgmY21kKTsKIApAQCAtMjQ0LDYgKzI0NCwzMCBAQAogCXJldHVybiBjbWQudmFsOwogfQogCitzdHJ1Y3QgcGVyZl9jdXIgeworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCXUzMiBsbzsKKwkJCXUzMiBoaTsKKwkJfSBzcGxpdDsKKwkJdTY0IHdob2xlOworCX0gYXBlcmZfY3VyLCBtcGVyZl9jdXI7Cit9OworCisKK3N0YXRpYyBsb25nIHJlYWRfbWVhc3VyZWRfcGVyZl9jdHJzKHZvaWQgKl9jdXIpCit7CisJc3RydWN0IHBlcmZfY3VyICpjdXIgPSBfY3VyOworCisJcmRtc3IoTVNSX0lBMzJfQVBFUkYsIGN1ci0+YXBlcmZfY3VyLnNwbGl0LmxvLCBjdXItPmFwZXJmX2N1ci5zcGxpdC5oaSk7CisJcmRtc3IoTVNSX0lBMzJfTVBFUkYsIGN1ci0+bXBlcmZfY3VyLnNwbGl0LmxvLCBjdXItPm1wZXJmX2N1ci5zcGxpdC5oaSk7CisKKwl3cm1zcihNU1JfSUEzMl9BUEVSRiwgMCwgMCk7CisJd3Jtc3IoTVNSX0lBMzJfTVBFUkYsIDAsIDApOworCisJcmV0dXJuIDA7Cit9CisKIC8qCiAgKiBSZXR1cm4gdGhlIG1lYXN1cmVkIGFjdGl2ZSAoQzApIGZyZXF1ZW5jeSBvbiB0aGlzIENQVSBzaW5jZSBsYXN0IGNhbGwKICAqIHRvIHRoaXMgZnVuY3Rpb24uCkBAIC0yNjAsMzEgKzI4NCwxMiBAQAogc3RhdGljIHVuc2lnbmVkIGludCBnZXRfbWVhc3VyZWRfcGVyZihzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSwKIAkJCQkgICAgICB1bnNpZ25lZCBpbnQgY3B1KQogewotCXVuaW9uIHsKLQkJc3RydWN0IHsKLQkJCXUzMiBsbzsKLQkJCXUzMiBoaTsKLQkJfSBzcGxpdDsKLQkJdTY0IHdob2xlOwotCX0gYXBlcmZfY3VyLCBtcGVyZl9jdXI7Ci0KLQljcHVtYXNrX3Qgc2F2ZWRfbWFzazsKKwlzdHJ1Y3QgcGVyZl9jdXIgY3VyOwogCXVuc2lnbmVkIGludCBwZXJmX3BlcmNlbnQ7CiAJdW5zaWduZWQgaW50IHJldHZhbDsKIAotCXNhdmVkX21hc2sgPSBjdXJyZW50LT5jcHVzX2FsbG93ZWQ7Ci0Jc2V0X2NwdXNfYWxsb3dlZF9wdHIoY3VycmVudCwgJmNwdW1hc2tfb2ZfY3B1KGNwdSkpOwotCWlmIChnZXRfY3B1KCkgIT0gY3B1KSB7Ci0JCS8qIFdlIHdlcmUgbm90IGFibGUgdG8gcnVuIG9uIHJlcXVlc3RlZCBwcm9jZXNzb3IgKi8KLQkJcHV0X2NwdSgpOworCWlmICghd29ya19vbl9jcHUoY3B1LCByZWFkX21lYXN1cmVkX3BlcmZfY3RycywgJmN1cikpCiAJCXJldHVybiAwOwotCX0KLQotCXJkbXNyKE1TUl9JQTMyX0FQRVJGLCBhcGVyZl9jdXIuc3BsaXQubG8sIGFwZXJmX2N1ci5zcGxpdC5oaSk7Ci0JcmRtc3IoTVNSX0lBMzJfTVBFUkYsIG1wZXJmX2N1ci5zcGxpdC5sbywgbXBlcmZfY3VyLnNwbGl0LmhpKTsKLQotCXdybXNyKE1TUl9JQTMyX0FQRVJGLCAwLDApOwotCXdybXNyKE1TUl9JQTMyX01QRVJGLCAwLDApOwogCiAjaWZkZWYgX19pMzg2X18KIAkvKgpAQCAtMjkyLDM3ICsyOTcsMzkgQEAKIAkgKiBHZXQgYW4gYXBwcm94aW1hdGUgdmFsdWUuIFJldHVybiBmYWlsdXJlIGluIGNhc2Ugd2UgY2Fubm90IGdldAogCSAqIGFuIGFwcHJveGltYXRlIHZhbHVlLgogCSAqLwotCWlmICh1bmxpa2VseShhcGVyZl9jdXIuc3BsaXQuaGkgfHwgbXBlcmZfY3VyLnNwbGl0LmhpKSkgeworCWlmICh1bmxpa2VseShjdXIuYXBlcmZfY3VyLnNwbGl0LmhpIHx8IGN1ci5tcGVyZl9jdXIuc3BsaXQuaGkpKSB7CiAJCWludCBzaGlmdF9jb3VudDsKIAkJdTMyIGg7CiAKLQkJaCA9IG1heF90KHUzMiwgYXBlcmZfY3VyLnNwbGl0LmhpLCBtcGVyZl9jdXIuc3BsaXQuaGkpOworCQloID0gbWF4X3QodTMyLCBjdXIuYXBlcmZfY3VyLnNwbGl0LmhpLCBjdXIubXBlcmZfY3VyLnNwbGl0LmhpKTsKIAkJc2hpZnRfY291bnQgPSBmbHMoaCk7CiAKLQkJYXBlcmZfY3VyLndob2xlID4+PSBzaGlmdF9jb3VudDsKLQkJbXBlcmZfY3VyLndob2xlID4+PSBzaGlmdF9jb3VudDsKKwkJY3VyLmFwZXJmX2N1ci53aG9sZSA+Pj0gc2hpZnRfY291bnQ7CisJCWN1ci5tcGVyZl9jdXIud2hvbGUgPj49IHNoaWZ0X2NvdW50OwogCX0KIAotCWlmICgoKHVuc2lnbmVkIGxvbmcpKC0xKSAvIDEwMCkgPCBhcGVyZl9jdXIuc3BsaXQubG8pIHsKKwlpZiAoKCh1bnNpZ25lZCBsb25nKSgtMSkgLyAxMDApIDwgY3VyLmFwZXJmX2N1ci5zcGxpdC5sbykgewogCQlpbnQgc2hpZnRfY291bnQgPSA3OwotCQlhcGVyZl9jdXIuc3BsaXQubG8gPj49IHNoaWZ0X2NvdW50OwotCQltcGVyZl9jdXIuc3BsaXQubG8gPj49IHNoaWZ0X2NvdW50OworCQljdXIuYXBlcmZfY3VyLnNwbGl0LmxvID4+PSBzaGlmdF9jb3VudDsKKwkJY3VyLm1wZXJmX2N1ci5zcGxpdC5sbyA+Pj0gc2hpZnRfY291bnQ7CiAJfQogCi0JaWYgKGFwZXJmX2N1ci5zcGxpdC5sbyAmJiBtcGVyZl9jdXIuc3BsaXQubG8pCi0JCXBlcmZfcGVyY2VudCA9IChhcGVyZl9jdXIuc3BsaXQubG8gKiAxMDApIC8gbXBlcmZfY3VyLnNwbGl0LmxvOworCWlmIChjdXIuYXBlcmZfY3VyLnNwbGl0LmxvICYmIGN1ci5tcGVyZl9jdXIuc3BsaXQubG8pCisJCXBlcmZfcGVyY2VudCA9IChjdXIuYXBlcmZfY3VyLnNwbGl0LmxvICogMTAwKSAvCisJCQkJY3VyLm1wZXJmX2N1ci5zcGxpdC5sbzsKIAllbHNlCiAJCXBlcmZfcGVyY2VudCA9IDA7CiAKICNlbHNlCi0JaWYgKHVubGlrZWx5KCgodW5zaWduZWQgbG9uZykoLTEpIC8gMTAwKSA8IGFwZXJmX2N1ci53aG9sZSkpIHsKKwlpZiAodW5saWtlbHkoKCh1bnNpZ25lZCBsb25nKSgtMSkgLyAxMDApIDwgY3VyLmFwZXJmX2N1ci53aG9sZSkpIHsKIAkJaW50IHNoaWZ0X2NvdW50ID0gNzsKLQkJYXBlcmZfY3VyLndob2xlID4+PSBzaGlmdF9jb3VudDsKLQkJbXBlcmZfY3VyLndob2xlID4+PSBzaGlmdF9jb3VudDsKKwkJY3VyLmFwZXJmX2N1ci53aG9sZSA+Pj0gc2hpZnRfY291bnQ7CisJCWN1ci5tcGVyZl9jdXIud2hvbGUgPj49IHNoaWZ0X2NvdW50OwogCX0KIAotCWlmIChhcGVyZl9jdXIud2hvbGUgJiYgbXBlcmZfY3VyLndob2xlKQotCQlwZXJmX3BlcmNlbnQgPSAoYXBlcmZfY3VyLndob2xlICogMTAwKSAvIG1wZXJmX2N1ci53aG9sZTsKKwlpZiAoY3VyLmFwZXJmX2N1ci53aG9sZSAmJiBjdXIubXBlcmZfY3VyLndob2xlKQorCQlwZXJmX3BlcmNlbnQgPSAoY3VyLmFwZXJmX2N1ci53aG9sZSAqIDEwMCkgLworCQkJCWN1ci5tcGVyZl9jdXIud2hvbGU7CiAJZWxzZQogCQlwZXJmX3BlcmNlbnQgPSAwOwogCkBAIC0zMzAsMTAgKzMzNyw2IEBACiAKIAlyZXR2YWwgPSBwZXJfY3B1KGRydl9kYXRhLCBwb2xpY3ktPmNwdSktPm1heF9mcmVxICogcGVyZl9wZXJjZW50IC8gMTAwOwogCi0JcHV0X2NwdSgpOwotCXNldF9jcHVzX2FsbG93ZWRfcHRyKGN1cnJlbnQsICZzYXZlZF9tYXNrKTsKLQotCWRwcmludGsoImNwdSAlZDogcGVyZm9ybWFuY2UgcGVyY2VudCAlZFxuIiwgY3B1LCBwZXJmX3BlcmNlbnQpOwogCXJldHVybiByZXR2YWw7CiB9CiAKQEAgLTM1MSw3ICszNTQsNyBAQAogCX0KIAogCWNhY2hlZF9mcmVxID0gZGF0YS0+ZnJlcV90YWJsZVtkYXRhLT5hY3BpX2RhdGEtPnN0YXRlXS5mcmVxdWVuY3k7Ci0JZnJlcSA9IGV4dHJhY3RfZnJlcShnZXRfY3VyX3ZhbCgmY3B1bWFza19vZl9jcHUoY3B1KSksIGRhdGEpOworCWZyZXEgPSBleHRyYWN0X2ZyZXEoZ2V0X2N1cl92YWwoY3B1bWFza19vZihjcHUpKSwgZGF0YSk7CiAJaWYgKGZyZXEgIT0gY2FjaGVkX2ZyZXEpIHsKIAkJLyoKIAkJICogVGhlIGRyZWFkZWQgQklPUyBmcmVxdWVuY3kgY2hhbmdlIGJlaGluZCBvdXIgYmFjay4KQEAgLTM4Niw3ICszODksNiBAQAogCXN0cnVjdCBhY3BpX2NwdWZyZXFfZGF0YSAqZGF0YSA9IHBlcl9jcHUoZHJ2X2RhdGEsIHBvbGljeS0+Y3B1KTsKIAlzdHJ1Y3QgYWNwaV9wcm9jZXNzb3JfcGVyZm9ybWFuY2UgKnBlcmY7CiAJc3RydWN0IGNwdWZyZXFfZnJlcXMgZnJlcXM7Ci0JY3B1bWFza190IG9ubGluZV9wb2xpY3lfY3B1czsKIAlzdHJ1Y3QgZHJ2X2NtZCBjbWQ7CiAJdW5zaWduZWQgaW50IG5leHRfc3RhdGUgPSAwOyAvKiBJbmRleCBpbnRvIGZyZXFfdGFibGUgKi8KIAl1bnNpZ25lZCBpbnQgbmV4dF9wZXJmX3N0YXRlID0gMDsgLyogSW5kZXggaW50byBwZXJmIHRhYmxlICovCkBAIC00MDEsMjAgKzQwMywxOCBAQAogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKKwlpZiAodW5saWtlbHkoIWFsbG9jX2NwdW1hc2tfdmFyKCZjbWQubWFzaywgR0ZQX0tFUk5FTCkpKQorCQlyZXR1cm4gLUVOT01FTTsKKwogCXBlcmYgPSBkYXRhLT5hY3BpX2RhdGE7CiAJcmVzdWx0ID0gY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGVfdGFyZ2V0KHBvbGljeSwKIAkJCQkJCWRhdGEtPmZyZXFfdGFibGUsCiAJCQkJCQl0YXJnZXRfZnJlcSwKIAkJCQkJCXJlbGF0aW9uLCAmbmV4dF9zdGF0ZSk7Ci0JaWYgKHVubGlrZWx5KHJlc3VsdCkpCi0JCXJldHVybiAtRU5PREVWOwotCi0jaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVCi0JLyogY3B1ZnJlcSBob2xkcyB0aGUgaG90cGx1ZyBsb2NrLCBzbyB3ZSBhcmUgc2FmZSBmcm9tIGhlcmUgb24gKi8KLQljcHVzX2FuZChvbmxpbmVfcG9saWN5X2NwdXMsIGNwdV9vbmxpbmVfbWFwLCBwb2xpY3ktPmNwdXMpOwotI2Vsc2UKLQlvbmxpbmVfcG9saWN5X2NwdXMgPSBwb2xpY3ktPmNwdXM7Ci0jZW5kaWYKKwlpZiAodW5saWtlbHkocmVzdWx0KSkgeworCQlyZXN1bHQgPSAtRU5PREVWOworCQlnb3RvIG91dDsKKwl9CiAKIAluZXh0X3BlcmZfc3RhdGUgPSBkYXRhLT5mcmVxX3RhYmxlW25leHRfc3RhdGVdLmluZGV4OwogCWlmIChwZXJmLT5zdGF0ZSA9PSBuZXh0X3BlcmZfc3RhdGUpIHsKQEAgLTQyNSw3ICs0MjUsNyBAQAogCQl9IGVsc2UgewogCQkJZHByaW50aygiQWxyZWFkeSBhdCB0YXJnZXQgc3RhdGUgKFAlZClcbiIsCiAJCQkJbmV4dF9wZXJmX3N0YXRlKTsKLQkJCXJldHVybiAwOworCQkJZ290byBvdXQ7CiAJCX0KIAl9CiAKQEAgLTQ0NCwxOSArNDQ0LDE5IEBACiAJCWNtZC52YWwgPSAodTMyKSBwZXJmLT5zdGF0ZXNbbmV4dF9wZXJmX3N0YXRlXS5jb250cm9sOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlyZXR1cm4gLUVOT0RFVjsKKwkJcmVzdWx0ID0gLUVOT0RFVjsKKwkJZ290byBvdXQ7CiAJfQogCi0JY3B1c19jbGVhcihjbWQubWFzayk7Ci0KKwkvKiBjcHVmcmVxIGhvbGRzIHRoZSBob3RwbHVnIGxvY2ssIHNvIHdlIGFyZSBzYWZlIGZyb20gaGVyZSBvbiAqLwogCWlmIChwb2xpY3ktPnNoYXJlZF90eXBlICE9IENQVUZSRVFfU0hBUkVEX1RZUEVfQU5ZKQotCQljbWQubWFzayA9IG9ubGluZV9wb2xpY3lfY3B1czsKKwkJY3B1bWFza19hbmQoY21kLm1hc2ssIGNwdV9vbmxpbmVfbWFzaywgcG9saWN5LT5jcHVzKTsKIAllbHNlCi0JCWNwdV9zZXQocG9saWN5LT5jcHUsIGNtZC5tYXNrKTsKKwkJY3B1bWFza19jb3B5KGNtZC5tYXNrLCBjcHVtYXNrX29mKHBvbGljeS0+Y3B1KSk7CiAKIAlmcmVxcy5vbGQgPSBwZXJmLT5zdGF0ZXNbcGVyZi0+c3RhdGVdLmNvcmVfZnJlcXVlbmN5ICogMTAwMDsKIAlmcmVxcy5uZXcgPSBkYXRhLT5mcmVxX3RhYmxlW25leHRfc3RhdGVdLmZyZXF1ZW5jeTsKLQlmb3JfZWFjaF9jcHVfbWFza19ucihpLCBjbWQubWFzaykgeworCWZvcl9lYWNoX2NwdShpLCBjbWQubWFzaykgewogCQlmcmVxcy5jcHUgPSBpOwogCQljcHVmcmVxX25vdGlmeV90cmFuc2l0aW9uKCZmcmVxcywgQ1BVRlJFUV9QUkVDSEFOR0UpOwogCX0KQEAgLTQ2NCwxOSArNDY0LDIyIEBACiAJZHJ2X3dyaXRlKCZjbWQpOwogCiAJaWYgKGFjcGlfcHN0YXRlX3N0cmljdCkgewotCQlpZiAoIWNoZWNrX2ZyZXFzKCZjbWQubWFzaywgZnJlcXMubmV3LCBkYXRhKSkgeworCQlpZiAoIWNoZWNrX2ZyZXFzKGNtZC5tYXNrLCBmcmVxcy5uZXcsIGRhdGEpKSB7CiAJCQlkcHJpbnRrKCJhY3BpX2NwdWZyZXFfdGFyZ2V0IGZhaWxlZCAoJWQpXG4iLAogCQkJCXBvbGljeS0+Y3B1KTsKLQkJCXJldHVybiAtRUFHQUlOOworCQkJcmVzdWx0ID0gLUVBR0FJTjsKKwkJCWdvdG8gb3V0OwogCQl9CiAJfQogCi0JZm9yX2VhY2hfY3B1X21hc2tfbnIoaSwgY21kLm1hc2spIHsKKwlmb3JfZWFjaF9jcHUoaSwgY21kLm1hc2spIHsKIAkJZnJlcXMuY3B1ID0gaTsKIAkJY3B1ZnJlcV9ub3RpZnlfdHJhbnNpdGlvbigmZnJlcXMsIENQVUZSRVFfUE9TVENIQU5HRSk7CiAJfQogCXBlcmYtPnN0YXRlID0gbmV4dF9wZXJmX3N0YXRlOwogCitvdXQ6CisJZnJlZV9jcHVtYXNrX3ZhcihjbWQubWFzayk7CiAJcmV0dXJuIHJlc3VsdDsKIH0KIApAQCAtNjI2LDE1ICs2MjksMTUgQEAKIAkgKi8KIAlpZiAocG9saWN5LT5zaGFyZWRfdHlwZSA9PSBDUFVGUkVRX1NIQVJFRF9UWVBFX0FMTCB8fAogCSAgICBwb2xpY3ktPnNoYXJlZF90eXBlID09IENQVUZSRVFfU0hBUkVEX1RZUEVfQU5ZKSB7Ci0JCWNwdW1hc2tfY29weSgmcG9saWN5LT5jcHVzLCBwZXJmLT5zaGFyZWRfY3B1X21hcCk7CisJCWNwdW1hc2tfY29weShwb2xpY3ktPmNwdXMsIHBlcmYtPnNoYXJlZF9jcHVfbWFwKTsKIAl9Ci0JY3B1bWFza19jb3B5KCZwb2xpY3ktPnJlbGF0ZWRfY3B1cywgcGVyZi0+c2hhcmVkX2NwdV9tYXApOworCWNwdW1hc2tfY29weShwb2xpY3ktPnJlbGF0ZWRfY3B1cywgcGVyZi0+c2hhcmVkX2NwdV9tYXApOwogCiAjaWZkZWYgQ09ORklHX1NNUAogCWRtaV9jaGVja19zeXN0ZW0oc3dfYW55X2J1Z19kbWlfdGFibGUpOwotCWlmIChiaW9zX3dpdGhfc3dfYW55X2J1ZyAmJiBjcHVzX3dlaWdodChwb2xpY3ktPmNwdXMpID09IDEpIHsKKwlpZiAoYmlvc193aXRoX3N3X2FueV9idWcgJiYgY3B1bWFza193ZWlnaHQocG9saWN5LT5jcHVzKSA9PSAxKSB7CiAJCXBvbGljeS0+c2hhcmVkX3R5cGUgPSBDUFVGUkVRX1NIQVJFRF9UWVBFX0FMTDsKLQkJcG9saWN5LT5jcHVzID0gcGVyX2NwdShjcHVfY29yZV9tYXAsIGNwdSk7CisJCWNwdW1hc2tfY29weShwb2xpY3ktPmNwdXMsIGNwdV9jb3JlX21hc2soY3B1KSk7CiAJfQogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9sb25naGF1bC5jIGIvYXJjaC94ODYva2VybmVsL2NwdS9jcHVmcmVxL2xvbmdoYXVsLmMKaW5kZXggYjA0NjE4NS4uYTRjZmY1ZCAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2NwdS9jcHVmcmVxL2xvbmdoYXVsLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2NwdS9jcHVmcmVxL2xvbmdoYXVsLmMKQEAgLTk4Miw3ICs5ODIsNyBAQAogCWNhc2UgMTA6CiAJCXByaW50ayhLRVJOX0VSUiBQRlggIlVzZSBhY3BpLWNwdWZyZXEgZHJpdmVyIGZvciBWSUEgQzdcbiIpOwogCWRlZmF1bHQ6Ci0JCTs7CisJCTsKIAl9CiAKIAlyZXR1cm4gLUVOT0RFVjsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9wNC1jbG9ja21vZC5jIGIvYXJjaC94ODYva2VybmVsL2NwdS9jcHVmcmVxL3A0LWNsb2NrbW9kLmMKaW5kZXggYmVlYTQ0Ni4uYjU4NWUwNGMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9wNC1jbG9ja21vZC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9wNC1jbG9ja21vZC5jCkBAIC0xMjIsNyArMTIyLDcgQEAKIAkJcmV0dXJuIDA7CiAKIAkvKiBub3RpZmllcnMgKi8KLQlmb3JfZWFjaF9jcHVfbWFza19ucihpLCBwb2xpY3ktPmNwdXMpIHsKKwlmb3JfZWFjaF9jcHUoaSwgcG9saWN5LT5jcHVzKSB7CiAJCWZyZXFzLmNwdSA9IGk7CiAJCWNwdWZyZXFfbm90aWZ5X3RyYW5zaXRpb24oJmZyZXFzLCBDUFVGUkVRX1BSRUNIQU5HRSk7CiAJfQpAQCAtMTMwLDExICsxMzAsMTEgQEAKIAkvKiBydW4gb24gZWFjaCBsb2dpY2FsIENQVSwgc2VlIHNlY3Rpb24gMTMuMTUuMyBvZiBJQTMyIEludGVsIEFyY2hpdGVjdHVyZSBTb2Z0d2FyZQogCSAqIERldmVsb3BlcidzIE1hbnVhbCwgVm9sdW1lIDMKIAkgKi8KLQlmb3JfZWFjaF9jcHVfbWFza19ucihpLCBwb2xpY3ktPmNwdXMpCisJZm9yX2VhY2hfY3B1KGksIHBvbGljeS0+Y3B1cykKIAkJY3B1ZnJlcV9wNF9zZXRkYyhpLCBwNGNsb2NrbW9kX3RhYmxlW25ld3N0YXRlXS5pbmRleCk7CiAKIAkvKiBub3RpZmllcnMgKi8KLQlmb3JfZWFjaF9jcHVfbWFza19ucihpLCBwb2xpY3ktPmNwdXMpIHsKKwlmb3JfZWFjaF9jcHUoaSwgcG9saWN5LT5jcHVzKSB7CiAJCWZyZXFzLmNwdSA9IGk7CiAJCWNwdWZyZXFfbm90aWZ5X3RyYW5zaXRpb24oJmZyZXFzLCBDUFVGUkVRX1BPU1RDSEFOR0UpOwogCX0KQEAgLTIwMyw3ICsyMDMsNyBAQAogCXVuc2lnbmVkIGludCBpOwogCiAjaWZkZWYgQ09ORklHX1NNUAotCXBvbGljeS0+Y3B1cyA9IHBlcl9jcHUoY3B1X3NpYmxpbmdfbWFwLCBwb2xpY3ktPmNwdSk7CisJY3B1bWFza19jb3B5KHBvbGljeS0+Y3B1cywgJnBlcl9jcHUoY3B1X3NpYmxpbmdfbWFwLCBwb2xpY3ktPmNwdSkpOwogI2VuZGlmCiAKIAkvKiBFcnJhdGEgd29ya2Fyb3VuZCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2NwdS9jcHVmcmVxL3Bvd2Vybm93LWs4LmMgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvcG93ZXJub3ctazguYwppbmRleCBjM2M5YWRiLi41YzI4YjM3IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvcG93ZXJub3ctazguYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvcG93ZXJub3ctazguYwpAQCAtMTE5OSwxMCArMTE5OSwxMCBAQAogCXNldF9jcHVzX2FsbG93ZWRfcHRyKGN1cnJlbnQsICZvbGRtYXNrKTsKIAogCWlmIChjcHVfZmFtaWx5ID09IENQVV9IV19QU1RBVEUpCi0JCXBvbC0+Y3B1cyA9IGNwdW1hc2tfb2ZfY3B1KHBvbC0+Y3B1KTsKKwkJY3B1bWFza19jb3B5KHBvbC0+Y3B1cywgY3B1bWFza19vZihwb2wtPmNwdSkpOwogCWVsc2UKLQkJcG9sLT5jcHVzID0gcGVyX2NwdShjcHVfY29yZV9tYXAsIHBvbC0+Y3B1KTsKLQlkYXRhLT5hdmFpbGFibGVfY29yZXMgPSAmKHBvbC0+Y3B1cyk7CisJCWNwdW1hc2tfY29weShwb2wtPmNwdXMsICZwZXJfY3B1KGNwdV9jb3JlX21hcCwgcG9sLT5jcHUpKTsKKwlkYXRhLT5hdmFpbGFibGVfY29yZXMgPSBwb2wtPmNwdXM7CiAKIAkvKiBUYWtlIGEgY3J1ZGUgZ3Vlc3MgaGVyZS4KIAkgKiBUaGF0IGd1ZXNzIHdhcyBpbiBtaWNyb3NlY29uZHMsIHNvIG11bHRpcGx5IHdpdGggMTAwMCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2NwdS9jcHVmcmVxL3Bvd2Vybm93LWs4LmggYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvcG93ZXJub3ctazguaAppbmRleCA2NWNmYjVkLi44ZWNjNzViIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvcG93ZXJub3ctazguaAorKysgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvcG93ZXJub3ctazguaApAQCAtNTMsNyArNTMsNyBAQAogCS8qIHdlIG5lZWQgdG8ga2VlcCB0cmFjayBvZiBhc3NvY2lhdGVkIGNvcmVzLCBidXQgbGV0IGNwdWZyZXEKIAkgKiBoYW5kbGUgaG90cGx1ZyBldmVudHMgLSBzbyBqdXN0IHBvaW50IGF0IGNwdWZyZXEgcG9sLT5jcHVzCiAJICogc3RydWN0dXJlICovCi0JY3B1bWFza190ICphdmFpbGFibGVfY29yZXM7CisJc3RydWN0IGNwdW1hc2sgKmF2YWlsYWJsZV9jb3JlczsKIH07CiAKIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2NwdS9jcHVmcmVxL3NwZWVkc3RlcC1jZW50cmluby5jIGIvYXJjaC94ODYva2VybmVsL2NwdS9jcHVmcmVxL3NwZWVkc3RlcC1jZW50cmluby5jCmluZGV4IGYwZWE2ZmEuLmYwODk5ODIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9zcGVlZHN0ZXAtY2VudHJpbm8uYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvc3BlZWRzdGVwLWNlbnRyaW5vLmMKQEAgLTQ1OCwxMSArNDU4LDYgQEAKICAqCiAgKiBTZXRzIGEgbmV3IENQVUZyZXEgcG9saWN5LgogICovCi1zdHJ1Y3QgYWxsbWFza3MgewotCWNwdW1hc2tfdAkJc2F2ZWRfbWFzazsKLQljcHVtYXNrX3QJCWNvdmVyZWRfY3B1czsKLX07Ci0KIHN0YXRpYyBpbnQgY2VudHJpbm9fdGFyZ2V0IChzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSwKIAkJCSAgICB1bnNpZ25lZCBpbnQgdGFyZ2V0X2ZyZXEsCiAJCQkgICAgdW5zaWduZWQgaW50IHJlbGF0aW9uKQpAQCAtNDcyLDEyICs0NjcsMTUgQEAKIAlzdHJ1Y3QgY3B1ZnJlcV9mcmVxcwlmcmVxczsKIAlpbnQJCQlyZXR2YWwgPSAwOwogCXVuc2lnbmVkIGludAkJaiwgaywgZmlyc3RfY3B1LCB0bXA7Ci0JQ1BVTUFTS19BTExPQyhhbGxtYXNrcyk7Ci0JQ1BVTUFTS19QVFIoc2F2ZWRfbWFzaywgYWxsbWFza3MpOwotCUNQVU1BU0tfUFRSKGNvdmVyZWRfY3B1cywgYWxsbWFza3MpOworCWNwdW1hc2tfdmFyX3Qgc2F2ZWRfbWFzaywgY292ZXJlZF9jcHVzOwogCi0JaWYgKHVubGlrZWx5KGFsbG1hc2tzID09IE5VTEwpKQorCWlmICh1bmxpa2VseSghYWxsb2NfY3B1bWFza192YXIoJnNhdmVkX21hc2ssIEdGUF9LRVJORUwpKSkKIAkJcmV0dXJuIC1FTk9NRU07CisJaWYgKHVubGlrZWx5KCFhbGxvY19jcHVtYXNrX3ZhcigmY292ZXJlZF9jcHVzLCBHRlBfS0VSTkVMKSkpIHsKKwkJZnJlZV9jcHVtYXNrX3ZhcihzYXZlZF9tYXNrKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCWNwdW1hc2tfY29weShzYXZlZF9tYXNrLCAmY3VycmVudC0+Y3B1c19hbGxvd2VkKTsKIAogCWlmICh1bmxpa2VseShwZXJfY3B1KGNlbnRyaW5vX21vZGVsLCBjcHUpID09IE5VTEwpKSB7CiAJCXJldHZhbCA9IC1FTk9ERVY7CkBAIC00OTMsMTEgKzQ5MSw5IEBACiAJCWdvdG8gb3V0OwogCX0KIAotCSpzYXZlZF9tYXNrID0gY3VycmVudC0+Y3B1c19hbGxvd2VkOwogCWZpcnN0X2NwdSA9IDE7Ci0JY3B1c19jbGVhcigqY292ZXJlZF9jcHVzKTsKLQlmb3JfZWFjaF9jcHVfbWFza19ucihqLCBwb2xpY3ktPmNwdXMpIHsKLQkJY29uc3QgY3B1bWFza190ICptYXNrOworCWZvcl9lYWNoX2NwdShqLCBwb2xpY3ktPmNwdXMpIHsKKwkJY29uc3Qgc3RydWN0IGNwdW1hc2sgKm1hc2s7CiAKIAkJLyogY3B1ZnJlcSBob2xkcyB0aGUgaG90cGx1ZyBsb2NrLCBzbyB3ZSBhcmUgc2FmZSBoZXJlICovCiAJCWlmICghY3B1X29ubGluZShqKSkKQEAgLTUwOCw5ICs1MDQsOSBAQAogCQkgKiBNYWtlIHN1cmUgd2UgYXJlIHJ1bm5pbmcgb24gQ1BVIHRoYXQgd2FudHMgdG8gY2hhbmdlIGZyZXEKIAkJICovCiAJCWlmIChwb2xpY3ktPnNoYXJlZF90eXBlID09IENQVUZSRVFfU0hBUkVEX1RZUEVfQU5ZKQotCQkJbWFzayA9ICZwb2xpY3ktPmNwdXM7CisJCQltYXNrID0gcG9saWN5LT5jcHVzOwogCQllbHNlCi0JCQltYXNrID0gJmNwdW1hc2tfb2ZfY3B1KGopOworCQkJbWFzayA9IGNwdW1hc2tfb2Yoaik7CiAKIAkJc2V0X2NwdXNfYWxsb3dlZF9wdHIoY3VycmVudCwgbWFzayk7CiAJCXByZWVtcHRfZGlzYWJsZSgpOwpAQCAtNTQyLDcgKzUzOCw3IEBACiAJCQlkcHJpbnRrKCJ0YXJnZXQ9JWRrSHogb2xkPSVkIG5ldz0lZCBtc3I9JTA0eFxuIiwKIAkJCQl0YXJnZXRfZnJlcSwgZnJlcXMub2xkLCBmcmVxcy5uZXcsIG1zcik7CiAKLQkJCWZvcl9lYWNoX2NwdV9tYXNrX25yKGssIHBvbGljeS0+Y3B1cykgeworCQkJZm9yX2VhY2hfY3B1KGssIHBvbGljeS0+Y3B1cykgewogCQkJCWlmICghY3B1X29ubGluZShrKSkKIAkJCQkJY29udGludWU7CiAJCQkJZnJlcXMuY3B1ID0gazsKQEAgLTU2Nyw3ICs1NjMsNyBAQAogCQlwcmVlbXB0X2VuYWJsZSgpOwogCX0KIAotCWZvcl9lYWNoX2NwdV9tYXNrX25yKGssIHBvbGljeS0+Y3B1cykgeworCWZvcl9lYWNoX2NwdShrLCBwb2xpY3ktPmNwdXMpIHsKIAkJaWYgKCFjcHVfb25saW5lKGspKQogCQkJY29udGludWU7CiAJCWZyZXFzLmNwdSA9IGs7CkBAIC01OTAsNyArNTg2LDcgQEAKIAkJdG1wID0gZnJlcXMubmV3OwogCQlmcmVxcy5uZXcgPSBmcmVxcy5vbGQ7CiAJCWZyZXFzLm9sZCA9IHRtcDsKLQkJZm9yX2VhY2hfY3B1X21hc2tfbnIoaiwgcG9saWN5LT5jcHVzKSB7CisJCWZvcl9lYWNoX2NwdShqLCBwb2xpY3ktPmNwdXMpIHsKIAkJCWlmICghY3B1X29ubGluZShqKSkKIAkJCQljb250aW51ZTsKIAkJCWNwdWZyZXFfbm90aWZ5X3RyYW5zaXRpb24oJmZyZXFzLCBDUFVGUkVRX1BSRUNIQU5HRSk7CkBAIC02MDUsNyArNjAxLDggQEAKIAlwcmVlbXB0X2VuYWJsZSgpOwogCXNldF9jcHVzX2FsbG93ZWRfcHRyKGN1cnJlbnQsIHNhdmVkX21hc2spOwogb3V0OgotCUNQVU1BU0tfRlJFRShhbGxtYXNrcyk7CisJZnJlZV9jcHVtYXNrX3ZhcihzYXZlZF9tYXNrKTsKKwlmcmVlX2NwdW1hc2tfdmFyKGNvdmVyZWRfY3B1cyk7CiAJcmV0dXJuIHJldHZhbDsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2NwdS9jcHVmcmVxL3NwZWVkc3RlcC1pY2guYyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9zcGVlZHN0ZXAtaWNoLmMKaW5kZXggMDRkMDM3Ni4uZGVkYzFlOSAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2NwdS9jcHVmcmVxL3NwZWVkc3RlcC1pY2guYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvc3BlZWRzdGVwLWljaC5jCkBAIC0yMjksNyArMjI5LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHVuc2lnbmVkIGludCBfc3BlZWRzdGVwX2dldChjb25zdCBjcHVtYXNrX3QgKmNwdXMpCitzdGF0aWMgdW5zaWduZWQgaW50IF9zcGVlZHN0ZXBfZ2V0KGNvbnN0IHN0cnVjdCBjcHVtYXNrICpjcHVzKQogewogCXVuc2lnbmVkIGludCBzcGVlZDsKIAljcHVtYXNrX3QgY3B1c19hbGxvd2VkOwpAQCAtMjQ0LDcgKzI0NCw3IEBACiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgc3BlZWRzdGVwX2dldCh1bnNpZ25lZCBpbnQgY3B1KQogewotCXJldHVybiBfc3BlZWRzdGVwX2dldCgmY3B1bWFza19vZl9jcHUoY3B1KSk7CisJcmV0dXJuIF9zcGVlZHN0ZXBfZ2V0KGNwdW1hc2tfb2YoY3B1KSk7CiB9CiAKIC8qKgpAQCAtMjY3LDcgKzI2Nyw3IEBACiAJaWYgKGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlX3RhcmdldChwb2xpY3ksICZzcGVlZHN0ZXBfZnJlcXNbMF0sIHRhcmdldF9mcmVxLCByZWxhdGlvbiwgJm5ld3N0YXRlKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlmcmVxcy5vbGQgPSBfc3BlZWRzdGVwX2dldCgmcG9saWN5LT5jcHVzKTsKKwlmcmVxcy5vbGQgPSBfc3BlZWRzdGVwX2dldChwb2xpY3ktPmNwdXMpOwogCWZyZXFzLm5ldyA9IHNwZWVkc3RlcF9mcmVxc1tuZXdzdGF0ZV0uZnJlcXVlbmN5OwogCWZyZXFzLmNwdSA9IHBvbGljeS0+Y3B1OwogCkBAIC0yNzksMjAgKzI3OSwyMCBAQAogCiAJY3B1c19hbGxvd2VkID0gY3VycmVudC0+Y3B1c19hbGxvd2VkOwogCi0JZm9yX2VhY2hfY3B1X21hc2tfbnIoaSwgcG9saWN5LT5jcHVzKSB7CisJZm9yX2VhY2hfY3B1KGksIHBvbGljeS0+Y3B1cykgewogCQlmcmVxcy5jcHUgPSBpOwogCQljcHVmcmVxX25vdGlmeV90cmFuc2l0aW9uKCZmcmVxcywgQ1BVRlJFUV9QUkVDSEFOR0UpOwogCX0KIAogCS8qIHN3aXRjaCB0byBwaHlzaWNhbCBDUFUgd2hlcmUgc3RhdGUgaXMgdG8gYmUgY2hhbmdlZCAqLwotCXNldF9jcHVzX2FsbG93ZWRfcHRyKGN1cnJlbnQsICZwb2xpY3ktPmNwdXMpOworCXNldF9jcHVzX2FsbG93ZWRfcHRyKGN1cnJlbnQsIHBvbGljeS0+Y3B1cyk7CiAKIAlzcGVlZHN0ZXBfc2V0X3N0YXRlKG5ld3N0YXRlKTsKIAogCS8qIGFsbG93IHRvIGJlIHJ1biBvbiBhbGwgQ1BVcyAqLwogCXNldF9jcHVzX2FsbG93ZWRfcHRyKGN1cnJlbnQsICZjcHVzX2FsbG93ZWQpOwogCi0JZm9yX2VhY2hfY3B1X21hc2tfbnIoaSwgcG9saWN5LT5jcHVzKSB7CisJZm9yX2VhY2hfY3B1KGksIHBvbGljeS0+Y3B1cykgewogCQlmcmVxcy5jcHUgPSBpOwogCQljcHVmcmVxX25vdGlmeV90cmFuc2l0aW9uKCZmcmVxcywgQ1BVRlJFUV9QT1NUQ0hBTkdFKTsKIAl9CkBAIC0zMjIsMTEgKzMyMiwxMSBAQAogCiAJLyogb25seSBydW4gb24gQ1BVIHRvIGJlIHNldCwgb3Igb24gaXRzIHNpYmxpbmcgKi8KICNpZmRlZiBDT05GSUdfU01QCi0JcG9saWN5LT5jcHVzID0gcGVyX2NwdShjcHVfc2libGluZ19tYXAsIHBvbGljeS0+Y3B1KTsKKwljcHVtYXNrX2NvcHkocG9saWN5LT5jcHVzLCAmcGVyX2NwdShjcHVfc2libGluZ19tYXAsIHBvbGljeS0+Y3B1KSk7CiAjZW5kaWYKIAogCWNwdXNfYWxsb3dlZCA9IGN1cnJlbnQtPmNwdXNfYWxsb3dlZDsKLQlzZXRfY3B1c19hbGxvd2VkX3B0cihjdXJyZW50LCAmcG9saWN5LT5jcHVzKTsKKwlzZXRfY3B1c19hbGxvd2VkX3B0cihjdXJyZW50LCBwb2xpY3ktPmNwdXMpOwogCiAJLyogZGV0ZWN0IGxvdyBhbmQgaGlnaCBmcmVxdWVuY3kgYW5kIHRyYW5zaXRpb24gbGF0ZW5jeSAqLwogCXJlc3VsdCA9IHNwZWVkc3RlcF9nZXRfZnJlcXMoc3BlZWRzdGVwX3Byb2Nlc3NvciwKQEAgLTMzOSw3ICszMzksNyBAQAogCQlyZXR1cm4gcmVzdWx0OwogCiAJLyogZ2V0IGN1cnJlbnQgc3BlZWQgc2V0dGluZyAqLwotCXNwZWVkID0gX3NwZWVkc3RlcF9nZXQoJnBvbGljeS0+Y3B1cyk7CisJc3BlZWQgPSBfc3BlZWRzdGVwX2dldChwb2xpY3ktPmNwdXMpOwogCWlmICghc3BlZWQpCiAJCXJldHVybiAtRUlPOwogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L21jaGVjay9tY2VfMzIuYyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvbWNoZWNrL21jZV8zMi5jCmluZGV4IDBlYmYzZmMuLmRmYWViY2UgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9jcHUvbWNoZWNrL21jZV8zMi5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvbWNoZWNrL21jZV8zMi5jCkBAIC0xLDYgKzEsNiBAQAogLyoKICAqIG1jZS5jIC0geDg2IE1hY2hpbmUgQ2hlY2sgRXhjZXB0aW9uIFJlcG9ydGluZwotICogKGMpIDIwMDIgQWxhbiBDb3ggPGFsYW5AcmVkaGF0LmNvbT4sIERhdmUgSm9uZXMgPGRhdmVqQHJlZGhhdC5jb20+CisgKiAoYykgMjAwMiBBbGFuIENveCA8YWxhbkBseG9yZ3VrLnVrdXUub3JnLnVrPiwgRGF2ZSBKb25lcyA8ZGF2ZWpAcmVkaGF0LmNvbT4KICAqLwogCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2NwdS9tY2hlY2svbWNlX2FtZF82NC5jIGIvYXJjaC94ODYva2VybmVsL2NwdS9tY2hlY2svbWNlX2FtZF82NC5jCmluZGV4IGE1YTVlMDUuLjhhZThjNGYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9jcHUvbWNoZWNrL21jZV9hbWRfNjQuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L21jaGVjay9tY2VfYW1kXzY0LmMKQEAgLTQ2Miw3ICs0NjIsNyBAQAogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyBsb25nIGxvY2FsX2FsbG9jYXRlX3RocmVzaG9sZF9ibG9ja3Modm9pZCAqX2JhbmspCitzdGF0aWMgX19jcHVpbml0IGxvbmcgbG9jYWxfYWxsb2NhdGVfdGhyZXNob2xkX2Jsb2Nrcyh2b2lkICpfYmFuaykKIHsKIAl1bnNpZ25lZCBpbnQgKmJhbmsgPSBfYmFuazsKIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2NwdS9tY2hlY2svcDUuYyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvbWNoZWNrL3A1LmMKaW5kZXggYmZhNTgxNy4uYzlmNzdlYSAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2NwdS9tY2hlY2svcDUuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L21jaGVjay9wNS5jCkBAIC0xLDYgKzEsNiBAQAogLyoKICAqIFA1IHNwZWNpZmljIE1hY2hpbmUgQ2hlY2sgRXhjZXB0aW9uIFJlcG9ydGluZwotICogKEMpIENvcHlyaWdodCAyMDAyIEFsYW4gQ294IDxhbGFuQHJlZGhhdC5jb20+CisgKiAoQykgQ29weXJpZ2h0IDIwMDIgQWxhbiBDb3ggPGFsYW5AbHhvcmd1ay51a3V1Lm9yZy51az4KICAqLwogCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2NwdS9tY2hlY2svcDYuYyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvbWNoZWNrL3A2LmMKaW5kZXggNjJlZmM5Yy4uMmFjNTJkNyAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2NwdS9tY2hlY2svcDYuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L21jaGVjay9wNi5jCkBAIC0xLDYgKzEsNiBAQAogLyoKICAqIFA2IHNwZWNpZmljIE1hY2hpbmUgQ2hlY2sgRXhjZXB0aW9uIFJlcG9ydGluZwotICogKEMpIENvcHlyaWdodCAyMDAyIEFsYW4gQ294IDxhbGFuQHJlZGhhdC5jb20+CisgKiAoQykgQ29weXJpZ2h0IDIwMDIgQWxhbiBDb3ggPGFsYW5AbHhvcmd1ay51a3V1Lm9yZy51az4KICAqLwogCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2NwdS9tY2hlY2svd2luY2hpcC5jIGIvYXJjaC94ODYva2VybmVsL2NwdS9tY2hlY2svd2luY2hpcC5jCmluZGV4IGYyYmUzZTEuLjJhMDQzZDggMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9jcHUvbWNoZWNrL3dpbmNoaXAuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L21jaGVjay93aW5jaGlwLmMKQEAgLTEsNiArMSw2IEBACiAvKgogICogSURUIFdpbmNoaXAgc3BlY2lmaWMgTWFjaGluZSBDaGVjayBFeGNlcHRpb24gUmVwb3J0aW5nCi0gKiAoQykgQ29weXJpZ2h0IDIwMDIgQWxhbiBDb3ggPGFsYW5AcmVkaGF0LmNvbT4KKyAqIChDKSBDb3B5cmlnaHQgMjAwMiBBbGFuIENveCA8YWxhbkBseG9yZ3VrLnVrdXUub3JnLnVrPgogICovCiAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvZTgyMC5jIGIvYXJjaC94ODYva2VybmVsL2U4MjAuYwppbmRleCA2NWExMzk0Li5lODU4MjY4IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvZTgyMC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9lODIwLmMKQEAgLTY2NSw2ICs2NjUsMjcgQEAKIH0KICNlbmRpZgogCisjaWZkZWYgQ09ORklHX0hJQkVSTkFUSU9OCisvKioKKyAqIE1hcmsgQUNQSSBOVlMgbWVtb3J5IHJlZ2lvbiwgc28gdGhhdCB3ZSBjYW4gc2F2ZS9yZXN0b3JlIGl0IGR1cmluZworICogaGliZXJuYXRpb24gYW5kIHRoZSBzdWJzZXF1ZW50IHJlc3VtZS4KKyAqLworc3RhdGljIGludCBfX2luaXQgZTgyMF9tYXJrX252c19tZW1vcnkodm9pZCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBlODIwLm5yX21hcDsgaSsrKSB7CisJCXN0cnVjdCBlODIwZW50cnkgKmVpID0gJmU4MjAubWFwW2ldOworCisJCWlmIChlaS0+dHlwZSA9PSBFODIwX05WUykKKwkJCWhpYmVybmF0ZV9udnNfcmVnaXN0ZXIoZWktPmFkZHIsIGVpLT5zaXplKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KK2NvcmVfaW5pdGNhbGwoZTgyMF9tYXJrX252c19tZW1vcnkpOworI2VuZGlmCisKIC8qCiAgKiBFYXJseSByZXNlcnZlZCBtZW1vcnkgYXJlYXMuCiAgKi8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9lYXJseS1xdWlya3MuYyBiL2FyY2gveDg2L2tlcm5lbC9lYXJseS1xdWlya3MuYwppbmRleCA3NDRhYTdmLi43NmI4Y2Q5IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvZWFybHktcXVpcmtzLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2Vhcmx5LXF1aXJrcy5jCkBAIC0yMDEsNiArMjAxLDEyIEBACiAJdm9pZCAoKmYpKGludCBudW0sIGludCBzbG90LCBpbnQgZnVuYyk7CiB9OwogCisvKgorICogT25seSB3b3JrcyBmb3IgZGV2aWNlcyBvbiB0aGUgcm9vdCBidXMuIElmIHlvdSBhZGQgYW55IGRldmljZXMKKyAqIG5vdCBvbiBidXMgMCByZWFkZCBhbm90aGVyIGxvb3AgbGV2ZWwgaW4gZWFybHlfcXVpcmtzKCkuIEJ1dAorICogYmUgY2FyZWZ1bCBiZWNhdXNlIGF0IGxlYXN0IHRoZSBOdmlkaWEgcXVpcmsgaGVyZSByZWxpZXMgb24KKyAqIG9ubHkgbWF0Y2hpbmcgb24gYnVzIDAuCisgKi8KIHN0YXRpYyBzdHJ1Y3QgY2hpcHNldCBlYXJseV9xcmtbXSBfX2luaXRkYXRhID0gewogCXsgUENJX1ZFTkRPUl9JRF9OVklESUEsIFBDSV9BTllfSUQsCiAJICBQQ0lfQ0xBU1NfQlJJREdFX1BDSSwgUENJX0FOWV9JRCwgUUZMQUdfQVBQTFlfT05DRSwgbnZpZGlhX2J1Z3MgfSwKQEAgLTI2NywxNyArMjczLDE3IEBACiAKIHZvaWQgX19pbml0IGVhcmx5X3F1aXJrcyh2b2lkKQogewotCWludCBudW0sIHNsb3QsIGZ1bmM7CisJaW50IHNsb3QsIGZ1bmM7CiAKIAlpZiAoIWVhcmx5X3BjaV9hbGxvd2VkKCkpCiAJCXJldHVybjsKIAogCS8qIFBvb3IgbWFuJ3MgUENJIGRpc2NvdmVyeSAqLwotCWZvciAobnVtID0gMDsgbnVtIDwgMzI7IG51bSsrKQotCQlmb3IgKHNsb3QgPSAwOyBzbG90IDwgMzI7IHNsb3QrKykKLQkJCWZvciAoZnVuYyA9IDA7IGZ1bmMgPCA4OyBmdW5jKyspIHsKLQkJCQkvKiBPbmx5IHByb2JlIGZ1bmN0aW9uIDAgb24gc2luZ2xlIGZuIGRldmljZXMgKi8KLQkJCQlpZiAoY2hlY2tfZGV2X3F1aXJrKG51bSwgc2xvdCwgZnVuYykpCi0JCQkJCWJyZWFrOwotCQkJfQorCS8qIE9ubHkgc2NhbiB0aGUgcm9vdCBidXMgKi8KKwlmb3IgKHNsb3QgPSAwOyBzbG90IDwgMzI7IHNsb3QrKykKKwkJZm9yIChmdW5jID0gMDsgZnVuYyA8IDg7IGZ1bmMrKykgeworCQkJLyogT25seSBwcm9iZSBmdW5jdGlvbiAwIG9uIHNpbmdsZSBmbiBkZXZpY2VzICovCisJCQlpZiAoY2hlY2tfZGV2X3F1aXJrKDAsIHNsb3QsIGZ1bmMpKQorCQkJCWJyZWFrOworCQl9CiB9CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvZW50cnlfMzIuUyBiL2FyY2gveDg2L2tlcm5lbC9lbnRyeV8zMi5TCmluZGV4IGQ2ZjA0OTAuLjQ2NDY5MDIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9lbnRyeV8zMi5TCisrKyBiL2FyY2gveDg2L2tlcm5lbC9lbnRyeV8zMi5TCkBAIC0xMjAzLDcgKzEyMDMsNiBAQAogCXB1c2hsICVlYXgKIAlDRklfQURKVVNUX0NGQV9PRkZTRVQgNAogCVNBVkVfQUxMCi0JVFJBQ0VfSVJRU19PRkYKIAl4b3JsICVlZHgsJWVkeAkJIyB6ZXJvIGVycm9yIGNvZGUKIAltb3ZsICVlc3AsJWVheAkJIyBwdF9yZWdzIHBvaW50ZXIKIAljYWxsIGRvX25taQpAQCAtMTI0NCw3ICsxMjQzLDYgQEAKIAlwdXNobCAlZWF4CiAJQ0ZJX0FESlVTVF9DRkFfT0ZGU0VUIDQKIAlTQVZFX0FMTAotCVRSQUNFX0lSUVNfT0ZGCiAJRklYVVBfRVNQRklYX1NUQUNLCQkjICVlYXggPT0gJWVzcAogCXhvcmwgJWVkeCwlZWR4CQkJIyB6ZXJvIGVycm9yIGNvZGUKIAljYWxsIGRvX25taQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2hlYWRfNjQuUyBiL2FyY2gveDg2L2tlcm5lbC9oZWFkXzY0LlMKaW5kZXggMjZjZmRjMS4uMGUyNzVkNCAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2hlYWRfNjQuUworKysgYi9hcmNoL3g4Ni9rZXJuZWwvaGVhZF82NC5TCkBAIC0zMDUsNyArMzA1LDcgQEAKIAljYWxsIGR1bXBfc3RhY2sKICNpZmRlZiBDT05GSUdfS0FMTFNZTVMJCiAJbGVhcSBlYXJseV9pZHRfcmlwbXNnKCVyaXApLCVyZGkKLQltb3ZxIDgoJXJzcCksJXJzaQkjIGdldCByaXAgYWdhaW4KKwltb3ZxIDAoJXJzcCksJXJzaQkjIGdldCByaXAgYWdhaW4KIAljYWxsIF9fcHJpbnRfc3ltYm9sCiAjZW5kaWYKICNlbmRpZiAvKiBFQVJMWV9QUklOVEsgKi8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9pODI1OS5jIGIvYXJjaC94ODYva2VybmVsL2k4MjU5LmMKaW5kZXggNGI4YTUzZC4uMTFkNTA5MyAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2k4MjU5LmMKKysrIGIvYXJjaC94ODYva2VybmVsL2k4MjU5LmMKQEAgLTExLDE1ICsxMSwxNSBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbF9zdGF0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3lzZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8bGludXgvYWNwaS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KIAotI2luY2x1ZGUgPGFzbS9hY3BpLmg+CiAjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vdGltZXIuaD4KICNpbmNsdWRlIDxhc20vaHdfaXJxLmg+CiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KLSNpbmNsdWRlIDxhc20vZGVsYXkuaD4KICNpbmNsdWRlIDxhc20vZGVzYy5oPgogI2luY2x1ZGUgPGFzbS9hcGljLmg+CiAjaW5jbHVkZSA8YXNtL2FyY2hfaG9va3MuaD4KQEAgLTMyMyw3ICszMjMsNyBAQAogCW91dGJfcGljKDB4MTEsIFBJQ19NQVNURVJfQ01EKTsJLyogSUNXMTogc2VsZWN0IDgyNTlBLTEgaW5pdCAqLwogCiAJLyogSUNXMjogODI1OUEtMSBJUjAtNyBtYXBwZWQgdG8gMHgzMC0weDM3IG9uIHg4Ni02NCwKLQkgICAgICAgICAgICAgICAgICAgICAgIHRvIDB4MjAtMHgyNyBvbiBpMzg2ICovCisJICAgdG8gMHgyMC0weDI3IG9uIGkzODYgKi8KIAlvdXRiX3BpYyhJUlEwX1ZFQ1RPUiwgUElDX01BU1RFUl9JTVIpOwogCiAJLyogODI1OUEtMSAodGhlIG1hc3RlcikgaGFzIGEgc2xhdmUgb24gSVIyICovCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvaW9fYXBpYy5jIGIvYXJjaC94ODYva2VybmVsL2lvX2FwaWMuYwppbmRleCAzNjM5NDQyLi4xYzRhMTMwIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvaW9fYXBpYy5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9pb19hcGljLmMKQEAgLTEyOSw3ICsxMjksNiBAQAogCW5vZGUgPSBjcHVfdG9fbm9kZShjcHUpOwogCiAJcGluID0ga3phbGxvY19ub2RlKHNpemVvZigqcGluKSwgR0ZQX0FUT01JQywgbm9kZSk7Ci0JcHJpbnRrKEtFUk5fREVCVUcgIiAgYWxsb2MgaXJxXzJfcGluIG9uIGNwdSAlZCBub2RlICVkXG4iLCBjcHUsIG5vZGUpOwogCiAJcmV0dXJuIHBpbjsKIH0KQEAgLTIyNyw3ICsyMjYsNiBAQAogCQkJY3B1bWFza19jbGVhcihjZmctPm9sZF9kb21haW4pOwogCQl9CiAJfQotCXByaW50ayhLRVJOX0RFQlVHICIgIGFsbG9jIGlycV9jZmcgb24gY3B1ICVkIG5vZGUgJWRcbiIsIGNwdSwgbm9kZSk7CiAKIAlyZXR1cm4gY2ZnOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2lvcG9ydC5jIGIvYXJjaC94ODYva2VybmVsL2lvcG9ydC5jCmluZGV4IDE5MTkxNDMuLmIxMjIwOGYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9pb3BvcnQuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvaW9wb3J0LmMKQEAgLTM1LDggKzM1LDggQEAKICAqLwogYXNtbGlua2FnZSBsb25nIHN5c19pb3Blcm0odW5zaWduZWQgbG9uZyBmcm9tLCB1bnNpZ25lZCBsb25nIG51bSwgaW50IHR1cm5fb24pCiB7Ci0Jc3RydWN0IHRocmVhZF9zdHJ1Y3QgKiB0ID0gJmN1cnJlbnQtPnRocmVhZDsKLQlzdHJ1Y3QgdHNzX3N0cnVjdCAqIHRzczsKKwlzdHJ1Y3QgdGhyZWFkX3N0cnVjdCAqdCA9ICZjdXJyZW50LT50aHJlYWQ7CisJc3RydWN0IHRzc19zdHJ1Y3QgKnRzczsKIAl1bnNpZ25lZCBpbnQgaSwgbWF4X2xvbmcsIGJ5dGVzLCBieXRlc191cGRhdGVkOwogCiAJaWYgKChmcm9tICsgbnVtIDw9IGZyb20pIHx8IChmcm9tICsgbnVtID4gSU9fQklUTUFQX0JJVFMpKQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2lycS5jIGIvYXJjaC94ODYva2VybmVsL2lycS5jCmluZGV4IGJjZTUzZTEuLjM5NzNlMmQgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9pcnEuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvaXJxLmMKQEAgLTUsMTAgKzUsMTAgQEAKICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWxfc3RhdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvc21wLmg+CiAKICNpbmNsdWRlIDxhc20vYXBpYy5oPgogI2luY2x1ZGUgPGFzbS9pb19hcGljLmg+Ci0jaW5jbHVkZSA8YXNtL3NtcC5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KIAogYXRvbWljX3QgaXJxX2Vycl9jb3VudDsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9pcnFfMzIuYyBiL2FyY2gveDg2L2tlcm5lbC9pcnFfMzIuYwppbmRleCA5ZGM1NTg4Li43NGI5ZmY3IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvaXJxXzMyLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2lycV8zMi5jCkBAIC0xNSw5ICsxNSw5IEBACiAjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KICNpbmNsdWRlIDxsaW51eC9jcHUuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KIAogI2luY2x1ZGUgPGFzbS9hcGljLmg+Ci0jaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KIAogREVGSU5FX1BFUl9DUFVfU0hBUkVEX0FMSUdORUQoaXJxX2NwdXN0YXRfdCwgaXJxX3N0YXQpOwogRVhQT1JUX1BFUl9DUFVfU1lNQk9MKGlycV9zdGF0KTsKQEAgLTkzLDcgKzkzLDcgQEAKIAkJcmV0dXJuIDA7CiAKIAkvKiBidWlsZCB0aGUgc3RhY2sgZnJhbWUgb24gdGhlIElSUSBzdGFjayAqLwotCWlzcCA9ICh1MzIgKikgKChjaGFyKilpcnFjdHggKyBzaXplb2YoKmlycWN0eCkpOworCWlzcCA9ICh1MzIgKikgKChjaGFyICopaXJxY3R4ICsgc2l6ZW9mKCppcnFjdHgpKTsKIAlpcnFjdHgtPnRpbmZvLnRhc2sgPSBjdXJjdHgtPnRpbmZvLnRhc2s7CiAJaXJxY3R4LT50aW5mby5wcmV2aW91c19lc3AgPSBjdXJyZW50X3N0YWNrX3BvaW50ZXI7CiAKQEAgLTEzNyw3ICsxMzcsNyBAQAogCiAJaGFyZGlycV9jdHhbY3B1XSA9IGlycWN0eDsKIAotCWlycWN0eCA9ICh1bmlvbiBpcnFfY3R4KikgJnNvZnRpcnFfc3RhY2tbY3B1KlRIUkVBRF9TSVpFXTsKKwlpcnFjdHggPSAodW5pb24gaXJxX2N0eCAqKSAmc29mdGlycV9zdGFja1tjcHUqVEhSRUFEX1NJWkVdOwogCWlycWN0eC0+dGluZm8udGFzawkJPSBOVUxMOwogCWlycWN0eC0+dGluZm8uZXhlY19kb21haW4JPSBOVUxMOwogCWlycWN0eC0+dGluZm8uY3B1CQk9IGNwdTsKQEAgLTE0Nyw3ICsxNDcsNyBAQAogCXNvZnRpcnFfY3R4W2NwdV0gPSBpcnFjdHg7CiAKIAlwcmludGsoS0VSTl9ERUJVRyAiQ1BVICV1IGlycXN0YWNrcywgaGFyZD0lcCBzb2Z0PSVwXG4iLAotCSAgICAgICBjcHUsaGFyZGlycV9jdHhbY3B1XSxzb2Z0aXJxX2N0eFtjcHVdKTsKKwkgICAgICAgY3B1LCBoYXJkaXJxX2N0eFtjcHVdLCBzb2Z0aXJxX2N0eFtjcHVdKTsKIH0KIAogdm9pZCBpcnFfY3R4X2V4aXQoaW50IGNwdSkKQEAgLTE3NCw3ICsxNzQsNyBAQAogCQlpcnFjdHgtPnRpbmZvLnByZXZpb3VzX2VzcCA9IGN1cnJlbnRfc3RhY2tfcG9pbnRlcjsKIAogCQkvKiBidWlsZCB0aGUgc3RhY2sgZnJhbWUgb24gdGhlIHNvZnRpcnEgc3RhY2sgKi8KLQkJaXNwID0gKHUzMiopICgoY2hhciopaXJxY3R4ICsgc2l6ZW9mKCppcnFjdHgpKTsKKwkJaXNwID0gKHUzMiAqKSAoKGNoYXIgKilpcnFjdHggKyBzaXplb2YoKmlycWN0eCkpOwogCiAJCWNhbGxfb25fc3RhY2soX19kb19zb2Z0aXJxLCBpc3ApOwogCQkvKgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2lycV82NC5jIGIvYXJjaC94ODYva2VybmVsL2lycV82NC5jCmluZGV4IDYzODNkNTAuLjYzYzg4ZTYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9pcnFfNjQuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvaXJxXzY0LmMKQEAgLTE0LDEwICsxNCwxMCBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvZnRyYWNlLmg+Ci0jaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvc21wLmg+CiAjaW5jbHVkZSA8YXNtL2lvX2FwaWMuaD4KICNpbmNsdWRlIDxhc20vaWRsZS5oPgotI2luY2x1ZGUgPGFzbS9zbXAuaD4KIAogLyoKICAqIFByb2JhYmlsaXN0aWMgc3RhY2sgb3ZlcmZsb3cgY2hlY2s6CkBAIC0xNDIsMTggKzE0MiwxOCBAQAogCiBhc21saW5rYWdlIHZvaWQgZG9fc29mdGlycSh2b2lkKQogewotIAlfX3UzMiBwZW5kaW5nOwotIAl1bnNpZ25lZCBsb25nIGZsYWdzOworCV9fdTMyIHBlbmRpbmc7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotIAlpZiAoaW5faW50ZXJydXB0KCkpCi0gCQlyZXR1cm47CisJaWYgKGluX2ludGVycnVwdCgpKQorCQlyZXR1cm47CiAKLSAJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotIAlwZW5kaW5nID0gbG9jYWxfc29mdGlycV9wZW5kaW5nKCk7Ci0gCS8qIFN3aXRjaCB0byBpbnRlcnJ1cHQgc3RhY2sgKi8KLSAJaWYgKHBlbmRpbmcpIHsKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJcGVuZGluZyA9IGxvY2FsX3NvZnRpcnFfcGVuZGluZygpOworCS8qIFN3aXRjaCB0byBpbnRlcnJ1cHQgc3RhY2sgKi8KKwlpZiAocGVuZGluZykgewogCQljYWxsX3NvZnRpcnEoKTsKIAkJV0FSTl9PTl9PTkNFKHNvZnRpcnFfY291bnQoKSk7CiAJfQotIAlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2lycWluaXRfMzIuYyBiL2FyY2gveDg2L2tlcm5lbC9pcnFpbml0XzMyLmMKaW5kZXggODQ3MjMyOS4uMTUwN2FkNGUgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9pcnFpbml0XzMyLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2lycWluaXRfMzIuYwpAQCAtOSwxOCArOSwxOCBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbF9zdGF0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3lzZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogCiAjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vdGltZXIuaD4KICNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgotI2luY2x1ZGUgPGFzbS9kZWxheS5oPgogI2luY2x1ZGUgPGFzbS9kZXNjLmg+CiAjaW5jbHVkZSA8YXNtL2FwaWMuaD4KICNpbmNsdWRlIDxhc20vYXJjaF9ob29rcy5oPgogI2luY2x1ZGUgPGFzbS9pODI1OS5oPgotCisjaW5jbHVkZSA8YXNtL3RyYXBzLmg+CiAKIAogLyoKQEAgLTM0LDEyICszNCwxMCBAQAogICogbGVhZHMgdG8gcmFjZXMuIElCTSBkZXNpZ25lcnMgd2hvIGNhbWUgdXAgd2l0aCBpdCBzaG91bGQKICAqIGJlIHNob3QuCiAgKi8KLSAKIAogc3RhdGljIGlycXJldHVybl90IG1hdGhfZXJyb3JfaXJxKGludCBjcGwsIHZvaWQgKmRldl9pZCkKIHsKLQlleHRlcm4gdm9pZCBtYXRoX2Vycm9yKHZvaWQgX191c2VyICopOwotCW91dGIoMCwweEYwKTsKKwlvdXRiKDAsIDB4RjApOwogCWlmIChpZ25vcmVfZnB1X2lycSB8fCAhYm9vdF9jcHVfZGF0YS5oYXJkX21hdGgpCiAJCXJldHVybiBJUlFfTk9ORTsKIAltYXRoX2Vycm9yKCh2b2lkIF9fdXNlciAqKWdldF9pcnFfcmVncygpLT5pcCk7CkBAIC01Niw3ICs1NCw3IEBACiAJLm5hbWUgPSAiZnB1IiwKIH07CiAKLXZvaWQgX19pbml0IGluaXRfSVNBX2lycXMgKHZvaWQpCit2b2lkIF9faW5pdCBpbml0X0lTQV9pcnFzKHZvaWQpCiB7CiAJaW50IGk7CiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9pcnFpbml0XzY0LmMgYi9hcmNoL3g4Ni9rZXJuZWwvaXJxaW5pdF82NC5jCmluZGV4IDMxZWJmZTMuLmRhNDgxYTEgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9pcnFpbml0XzY0LmMKKysrIGIvYXJjaC94ODYva2VybmVsL2lycWluaXRfNjQuYwpAQCAtMTEsMTQgKzExLDE0IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsX3N0YXQuaD4KICNpbmNsdWRlIDxsaW51eC9zeXNkZXYuaD4KICNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9hY3BpLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogCi0jaW5jbHVkZSA8YXNtL2FjcGkuaD4KICNpbmNsdWRlIDxhc20vYXRvbWljLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9od19pcnEuaD4KICNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgotI2luY2x1ZGUgPGFzbS9kZWxheS5oPgogI2luY2x1ZGUgPGFzbS9kZXNjLmg+CiAjaW5jbHVkZSA8YXNtL2FwaWMuaD4KICNpbmNsdWRlIDxhc20vaTgyNTkuaD4KQEAgLTgxLDcgKzgxLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotdm9pZCBfX2luaXQgaW5pdF9JU0FfaXJxcyh2b2lkKQorc3RhdGljIHZvaWQgX19pbml0IGluaXRfSVNBX2lycXModm9pZCkKIHsKIAlpbnQgaTsKIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2twcm9iZXMuYyBiL2FyY2gveDg2L2tlcm5lbC9rcHJvYmVzLmMKaW5kZXggZWVhZDZmOC4uZTk0OGIyOCAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2twcm9iZXMuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwva3Byb2Jlcy5jCkBAIC00NDYsNyArNDQ2LDcgQEAKIHN0YXRpYyB2b2lkIF9fa3Byb2JlcyBzZXR1cF9zaW5nbGVzdGVwKHN0cnVjdCBrcHJvYmUgKnAsIHN0cnVjdCBwdF9yZWdzICpyZWdzLAogCQkJCSAgICAgICBzdHJ1Y3Qga3Byb2JlX2N0bGJsayAqa2NiKQogewotI2lmICFkZWZpbmVkKENPTkZJR19QUkVFTVBUKSB8fCBkZWZpbmVkKENPTkZJR19QTSkKKyNpZiAhZGVmaW5lZChDT05GSUdfUFJFRU1QVCkgfHwgZGVmaW5lZChDT05GSUdfRlJFRVpFUikKIAlpZiAocC0+YWluc24uYm9vc3RhYmxlID09IDEgJiYgIXAtPnBvc3RfaGFuZGxlcikgewogCQkvKiBCb29zdCB1cCAtLSB3ZSBjYW4gZXhlY3V0ZSBjb3BpZWQgaW5zdHJ1Y3Rpb25zIGRpcmVjdGx5ICovCiAJCXJlc2V0X2N1cnJlbnRfa3Byb2JlKCk7CkBAIC02OTUsNyArNjk1LDcgQEAKIAkvKgogCSAqIEl0IGlzIHBvc3NpYmxlIHRvIGhhdmUgbXVsdGlwbGUgaW5zdGFuY2VzIGFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuCiAJICogdGFzayBlaXRoZXIgYmVjYXVzZSBtdWx0aXBsZSBmdW5jdGlvbnMgaW4gdGhlIGNhbGwgcGF0aCBoYXZlCi0JICogcmV0dXJuIHByb2JlcyBpbnN0YWxsZWQgb24gdGhlbSwgYW5kL29yIG1vcmUgdGhlbiBvbmUKKwkgKiByZXR1cm4gcHJvYmVzIGluc3RhbGxlZCBvbiB0aGVtLCBhbmQvb3IgbW9yZSB0aGFuIG9uZQogCSAqIHJldHVybiBwcm9iZSB3YXMgcmVnaXN0ZXJlZCBmb3IgYSB0YXJnZXQgZnVuY3Rpb24uCiAJICoKIAkgKiBXZSBjYW4gaGFuZGxlIHRoaXMgYmVjYXVzZToKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9tZmdwdF8zMi5jIGIvYXJjaC94ODYva2VybmVsL21mZ3B0XzMyLmMKaW5kZXggYzEyMzE0Yy4uODgxNWYzYyAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL21mZ3B0XzMyLmMKKysrIGIvYXJjaC94ODYva2VybmVsL21mZ3B0XzMyLmMKQEAgLTI1Miw3ICsyNTIsNyBAQAogLyoKICAqIFRoZSBNRlBHVCB0aW1lcnMgb24gdGhlIENTNTUzNiBwcm92aWRlIHVzIHdpdGggc3VpdGFibGUgdGltZXJzIHRvIHVzZQogICogYXMgY2xvY2sgZXZlbnQgc291cmNlcyAtIG5vdCBhcyBnb29kIGFzIGEgSFBFVCBvciBBUElDLCBidXQgY2VydGFpbmx5Ci0gKiBiZXR0ZXIgdGhlbiB0aGUgUElULiAgVGhpcyBpc24ndCBhIGdlbmVyYWwgcHVycG9zZSBNRkdQVCBkcml2ZXIsIGJ1dAorICogYmV0dGVyIHRoYW4gdGhlIFBJVC4gIFRoaXMgaXNuJ3QgYSBnZW5lcmFsIHB1cnBvc2UgTUZHUFQgZHJpdmVyLCBidXQKICAqIGEgc2ltcGxpZmllZCBvbmUgZGVzaWduZWQgc3BlY2lmaWNhbGx5IHRvIGFjdCBhcyBhIGNsb2NrIGV2ZW50IHNvdXJjZS4KICAqIEZvciBmdWxsIGRldGFpbHMgYWJvdXQgdGhlIE1GR1BULCBwbGVhc2UgY29uc3VsdCB0aGUgQ1M1NTM2IGRhdGEgc2hlZXQuCiAgKi8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9tcHBhcnNlLmMgYi9hcmNoL3g4Ni9rZXJuZWwvbXBwYXJzZS5jCmluZGV4IGM1YzViOGQuLmE2NDlhNGMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9tcHBhcnNlLmMKKysrIGIvYXJjaC94ODYva2VybmVsL21wcGFyc2UuYwpAQCAtMiw3ICsyLDcgQEAKICAqCUludGVsIE11bHRpcHJvY2Vzc29yIFNwZWNpZmljYXRpb24gMS4xIGFuZCAxLjQKICAqCWNvbXBsaWFudCBNUC10YWJsZSBwYXJzaW5nIHJvdXRpbmVzLgogICoKLSAqCShjKSAxOTk1IEFsYW4gQ294LCBCdWlsZGluZyAjMyA8YWxhbkByZWRoYXQuY29tPgorICoJKGMpIDE5OTUgQWxhbiBDb3gsIEJ1aWxkaW5nICMzIDxhbGFuQGx4b3JndWsudWt1dS5vcmcudWs+CiAgKgkoYykgMTk5OCwgMTk5OSwgMjAwMCBJbmdvIE1vbG5hciA8bWluZ29AcmVkaGF0LmNvbT4KICAqICAgICAgKGMpIDIwMDggQWxleGV5IFN0YXJpa292c2tpeSA8YXN0YXJpa292c2tpeUBzdXNlLmRlPgogICovCkBAIC0xNyw3ICsxNyw2IEBACiAjaW5jbHVkZSA8bGludXgvYWNwaS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgotI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KIAogI2luY2x1ZGUgPGFzbS9tdHJyLmg+CiAjaW5jbHVkZSA8YXNtL21wc3BlYy5oPgpAQCAtMjgsNiArMjcsNyBAQAogI2luY2x1ZGUgPGFzbS9lODIwLmg+CiAjaW5jbHVkZSA8YXNtL3RyYW1wb2xpbmUuaD4KICNpbmNsdWRlIDxhc20vc2V0dXAuaD4KKyNpbmNsdWRlIDxhc20vc21wLmg+CiAKICNpbmNsdWRlIDxtYWNoX2FwaWMuaD4KICNpZmRlZiBDT05GSUdfWDg2XzMyCkBAIC00OSwxMiArNDksMTIgQEAKIAlyZXR1cm4gc3VtICYgMHhGRjsKIH0KIAotc3RhdGljIHZvaWQgX19pbml0IE1QX3Byb2Nlc3Nvcl9pbmZvKHN0cnVjdCBtcGNfY29uZmlnX3Byb2Nlc3NvciAqbSkKK3N0YXRpYyB2b2lkIF9faW5pdCBNUF9wcm9jZXNzb3JfaW5mbyhzdHJ1Y3QgbXBjX2NwdSAqbSkKIHsKIAlpbnQgYXBpY2lkOwogCWNoYXIgKmJvb3R1cF9jcHUgPSAiIjsKIAotCWlmICghKG0tPm1wY19jcHVmbGFnICYgQ1BVX0VOQUJMRUQpKSB7CisJaWYgKCEobS0+Y3B1ZmxhZyAmIENQVV9FTkFCTEVEKSkgewogCQlkaXNhYmxlZF9jcHVzKys7CiAJCXJldHVybjsKIAl9CkBAIC02Miw1NCArNjIsNTQgQEAKIAlpZiAoeDg2X3F1aXJrcy0+bXBjX2FwaWNfaWQpCiAJCWFwaWNpZCA9IHg4Nl9xdWlya3MtPm1wY19hcGljX2lkKG0pOwogCWVsc2UKLQkJYXBpY2lkID0gbS0+bXBjX2FwaWNpZDsKKwkJYXBpY2lkID0gbS0+YXBpY2lkOwogCi0JaWYgKG0tPm1wY19jcHVmbGFnICYgQ1BVX0JPT1RQUk9DRVNTT1IpIHsKKwlpZiAobS0+Y3B1ZmxhZyAmIENQVV9CT09UUFJPQ0VTU09SKSB7CiAJCWJvb3R1cF9jcHUgPSAiIChCb290dXAtQ1BVKSI7Ci0JCWJvb3RfY3B1X3BoeXNpY2FsX2FwaWNpZCA9IG0tPm1wY19hcGljaWQ7CisJCWJvb3RfY3B1X3BoeXNpY2FsX2FwaWNpZCA9IG0tPmFwaWNpZDsKIAl9CiAKLQlwcmludGsoS0VSTl9JTkZPICJQcm9jZXNzb3IgIyVkJXNcbiIsIG0tPm1wY19hcGljaWQsIGJvb3R1cF9jcHUpOwotCWdlbmVyaWNfcHJvY2Vzc29yX2luZm8oYXBpY2lkLCBtLT5tcGNfYXBpY3Zlcik7CisJcHJpbnRrKEtFUk5fSU5GTyAiUHJvY2Vzc29yICMlZCVzXG4iLCBtLT5hcGljaWQsIGJvb3R1cF9jcHUpOworCWdlbmVyaWNfcHJvY2Vzc29yX2luZm8oYXBpY2lkLCBtLT5hcGljdmVyKTsKIH0KIAogI2lmZGVmIENPTkZJR19YODZfSU9fQVBJQwotc3RhdGljIHZvaWQgX19pbml0IE1QX2J1c19pbmZvKHN0cnVjdCBtcGNfY29uZmlnX2J1cyAqbSkKK3N0YXRpYyB2b2lkIF9faW5pdCBNUF9idXNfaW5mbyhzdHJ1Y3QgbXBjX2J1cyAqbSkKIHsKIAljaGFyIHN0cls3XTsKLQltZW1jcHkoc3RyLCBtLT5tcGNfYnVzdHlwZSwgNik7CisJbWVtY3B5KHN0ciwgbS0+YnVzdHlwZSwgNik7CiAJc3RyWzZdID0gMDsKIAogCWlmICh4ODZfcXVpcmtzLT5tcGNfb2VtX2J1c19pbmZvKQogCQl4ODZfcXVpcmtzLT5tcGNfb2VtX2J1c19pbmZvKG0sIHN0cik7CiAJZWxzZQotCQlhcGljX3ByaW50ayhBUElDX1ZFUkJPU0UsICJCdXMgIyVkIGlzICVzXG4iLCBtLT5tcGNfYnVzaWQsIHN0cik7CisJCWFwaWNfcHJpbnRrKEFQSUNfVkVSQk9TRSwgIkJ1cyAjJWQgaXMgJXNcbiIsIG0tPmJ1c2lkLCBzdHIpOwogCiAjaWYgTUFYX01QX0JVU1NFUyA8IDI1NgotCWlmIChtLT5tcGNfYnVzaWQgPj0gTUFYX01QX0JVU1NFUykgeworCWlmIChtLT5idXNpZCA+PSBNQVhfTVBfQlVTU0VTKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIk1QIHRhYmxlIGJ1c2lkIHZhbHVlICglZCkgZm9yIGJ1c3R5cGUgJXMgIgogCQkgICAgICAgIiBpcyB0b28gbGFyZ2UsIG1heC4gc3VwcG9ydGVkIGlzICVkXG4iLAotCQkgICAgICAgbS0+bXBjX2J1c2lkLCBzdHIsIE1BWF9NUF9CVVNTRVMgLSAxKTsKKwkJICAgICAgIG0tPmJ1c2lkLCBzdHIsIE1BWF9NUF9CVVNTRVMgLSAxKTsKIAkJcmV0dXJuOwogCX0KICNlbmRpZgogCiAJaWYgKHN0cm5jbXAoc3RyLCBCVVNUWVBFX0lTQSwgc2l6ZW9mKEJVU1RZUEVfSVNBKSAtIDEpID09IDApIHsKLQkJc2V0X2JpdChtLT5tcGNfYnVzaWQsIG1wX2J1c19ub3RfcGNpKTsKKwkJc2V0X2JpdChtLT5idXNpZCwgbXBfYnVzX25vdF9wY2kpOwogI2lmIGRlZmluZWQoQ09ORklHX0VJU0EpIHx8IGRlZmluZWQoQ09ORklHX01DQSkKLQkJbXBfYnVzX2lkX3RvX3R5cGVbbS0+bXBjX2J1c2lkXSA9IE1QX0JVU19JU0E7CisJCW1wX2J1c19pZF90b190eXBlW20tPmJ1c2lkXSA9IE1QX0JVU19JU0E7CiAjZW5kaWYKIAl9IGVsc2UgaWYgKHN0cm5jbXAoc3RyLCBCVVNUWVBFX1BDSSwgc2l6ZW9mKEJVU1RZUEVfUENJKSAtIDEpID09IDApIHsKIAkJaWYgKHg4Nl9xdWlya3MtPm1wY19vZW1fcGNpX2J1cykKIAkJCXg4Nl9xdWlya3MtPm1wY19vZW1fcGNpX2J1cyhtKTsKIAotCQljbGVhcl9iaXQobS0+bXBjX2J1c2lkLCBtcF9idXNfbm90X3BjaSk7CisJCWNsZWFyX2JpdChtLT5idXNpZCwgbXBfYnVzX25vdF9wY2kpOwogI2lmIGRlZmluZWQoQ09ORklHX0VJU0EpIHx8IGRlZmluZWQoQ09ORklHX01DQSkKLQkJbXBfYnVzX2lkX3RvX3R5cGVbbS0+bXBjX2J1c2lkXSA9IE1QX0JVU19QQ0k7CisJCW1wX2J1c19pZF90b190eXBlW20tPmJ1c2lkXSA9IE1QX0JVU19QQ0k7CiAJfSBlbHNlIGlmIChzdHJuY21wKHN0ciwgQlVTVFlQRV9FSVNBLCBzaXplb2YoQlVTVFlQRV9FSVNBKSAtIDEpID09IDApIHsKLQkJbXBfYnVzX2lkX3RvX3R5cGVbbS0+bXBjX2J1c2lkXSA9IE1QX0JVU19FSVNBOworCQltcF9idXNfaWRfdG9fdHlwZVttLT5idXNpZF0gPSBNUF9CVVNfRUlTQTsKIAl9IGVsc2UgaWYgKHN0cm5jbXAoc3RyLCBCVVNUWVBFX01DQSwgc2l6ZW9mKEJVU1RZUEVfTUNBKSAtIDEpID09IDApIHsKLQkJbXBfYnVzX2lkX3RvX3R5cGVbbS0+bXBjX2J1c2lkXSA9IE1QX0JVU19NQ0E7CisJCW1wX2J1c19pZF90b190eXBlW20tPmJ1c2lkXSA9IE1QX0JVU19NQ0E7CiAjZW5kaWYKIAl9IGVsc2UKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiVW5rbm93biBidXN0eXBlICVzIC0gaWdub3JpbmdcbiIsIHN0cik7CkBAIC0xMzMsMzIgKzEzMywzMSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBfX2luaXQgTVBfaW9hcGljX2luZm8oc3RydWN0IG1wY19jb25maWdfaW9hcGljICptKQorc3RhdGljIHZvaWQgX19pbml0IE1QX2lvYXBpY19pbmZvKHN0cnVjdCBtcGNfaW9hcGljICptKQogewotCWlmICghKG0tPm1wY19mbGFncyAmIE1QQ19BUElDX1VTQUJMRSkpCisJaWYgKCEobS0+ZmxhZ3MgJiBNUENfQVBJQ19VU0FCTEUpKQogCQlyZXR1cm47CiAKIAlwcmludGsoS0VSTl9JTkZPICJJL08gQVBJQyAjJWQgVmVyc2lvbiAlZCBhdCAweCVYLlxuIiwKLQkgICAgICAgbS0+bXBjX2FwaWNpZCwgbS0+bXBjX2FwaWN2ZXIsIG0tPm1wY19hcGljYWRkcik7CisJICAgICAgIG0tPmFwaWNpZCwgbS0+YXBpY3ZlciwgbS0+YXBpY2FkZHIpOwogCi0JaWYgKGJhZF9pb2FwaWMobS0+bXBjX2FwaWNhZGRyKSkKKwlpZiAoYmFkX2lvYXBpYyhtLT5hcGljYWRkcikpCiAJCXJldHVybjsKIAotCW1wX2lvYXBpY3NbbnJfaW9hcGljc10ubXBfYXBpY2FkZHIgPSBtLT5tcGNfYXBpY2FkZHI7Ci0JbXBfaW9hcGljc1tucl9pb2FwaWNzXS5tcF9hcGljaWQgPSBtLT5tcGNfYXBpY2lkOwotCW1wX2lvYXBpY3NbbnJfaW9hcGljc10ubXBfdHlwZSA9IG0tPm1wY190eXBlOwotCW1wX2lvYXBpY3NbbnJfaW9hcGljc10ubXBfYXBpY3ZlciA9IG0tPm1wY19hcGljdmVyOwotCW1wX2lvYXBpY3NbbnJfaW9hcGljc10ubXBfZmxhZ3MgPSBtLT5tcGNfZmxhZ3M7CisJbXBfaW9hcGljc1tucl9pb2FwaWNzXS5tcF9hcGljYWRkciA9IG0tPmFwaWNhZGRyOworCW1wX2lvYXBpY3NbbnJfaW9hcGljc10ubXBfYXBpY2lkID0gbS0+YXBpY2lkOworCW1wX2lvYXBpY3NbbnJfaW9hcGljc10ubXBfdHlwZSA9IG0tPnR5cGU7CisJbXBfaW9hcGljc1tucl9pb2FwaWNzXS5tcF9hcGljdmVyID0gbS0+YXBpY3ZlcjsKKwltcF9pb2FwaWNzW25yX2lvYXBpY3NdLm1wX2ZsYWdzID0gbS0+ZmxhZ3M7CiAJbnJfaW9hcGljcysrOwogfQogCi1zdGF0aWMgdm9pZCBwcmludF9NUF9pbnRzcmNfaW5mbyhzdHJ1Y3QgbXBjX2NvbmZpZ19pbnRzcmMgKm0pCitzdGF0aWMgdm9pZCBwcmludF9NUF9pbnRzcmNfaW5mbyhzdHJ1Y3QgbXBjX2ludHNyYyAqbSkKIHsKIAlhcGljX3ByaW50ayhBUElDX1ZFUkJPU0UsICJJbnQ6IHR5cGUgJWQsIHBvbCAlZCwgdHJpZyAlZCwgYnVzICUwMngsIgogCQkiIElSUSAlMDJ4LCBBUElDIElEICV4LCBBUElDIElOVCAlMDJ4XG4iLAotCQltLT5tcGNfaXJxdHlwZSwgbS0+bXBjX2lycWZsYWcgJiAzLAotCQkobS0+bXBjX2lycWZsYWcgPj4gMikgJiAzLCBtLT5tcGNfc3JjYnVzLAotCQltLT5tcGNfc3JjYnVzaXJxLCBtLT5tcGNfZHN0YXBpYywgbS0+bXBjX2RzdGlycSk7CisJCW0tPmlycXR5cGUsIG0tPmlycWZsYWcgJiAzLCAobS0+aXJxZmxhZyA+PiAyKSAmIDMsIG0tPnNyY2J1cywKKwkJbS0+c3JjYnVzaXJxLCBtLT5kc3RhcGljLCBtLT5kc3RpcnEpOwogfQogCiBzdGF0aWMgdm9pZCBfX2luaXQgcHJpbnRfbXBfaXJxX2luZm8oc3RydWN0IG1wX2NvbmZpZ19pbnRzcmMgKm1wX2lycSkKQEAgLTE3MCw1MiArMTY5LDUyIEBACiAJCW1wX2lycS0+bXBfc3JjYnVzaXJxLCBtcF9pcnEtPm1wX2RzdGFwaWMsIG1wX2lycS0+bXBfZHN0aXJxKTsKIH0KIAotc3RhdGljIHZvaWQgX19pbml0IGFzc2lnbl90b19tcF9pcnEoc3RydWN0IG1wY19jb25maWdfaW50c3JjICptLAorc3RhdGljIHZvaWQgX19pbml0IGFzc2lnbl90b19tcF9pcnEoc3RydWN0IG1wY19pbnRzcmMgKm0sCiAJCQkJICAgIHN0cnVjdCBtcF9jb25maWdfaW50c3JjICptcF9pcnEpCiB7Ci0JbXBfaXJxLT5tcF9kc3RhcGljID0gbS0+bXBjX2RzdGFwaWM7Ci0JbXBfaXJxLT5tcF90eXBlID0gbS0+bXBjX3R5cGU7Ci0JbXBfaXJxLT5tcF9pcnF0eXBlID0gbS0+bXBjX2lycXR5cGU7Ci0JbXBfaXJxLT5tcF9pcnFmbGFnID0gbS0+bXBjX2lycWZsYWc7Ci0JbXBfaXJxLT5tcF9zcmNidXMgPSBtLT5tcGNfc3JjYnVzOwotCW1wX2lycS0+bXBfc3JjYnVzaXJxID0gbS0+bXBjX3NyY2J1c2lycTsKLQltcF9pcnEtPm1wX2RzdGlycSA9IG0tPm1wY19kc3RpcnE7CisJbXBfaXJxLT5tcF9kc3RhcGljID0gbS0+ZHN0YXBpYzsKKwltcF9pcnEtPm1wX3R5cGUgPSBtLT50eXBlOworCW1wX2lycS0+bXBfaXJxdHlwZSA9IG0tPmlycXR5cGU7CisJbXBfaXJxLT5tcF9pcnFmbGFnID0gbS0+aXJxZmxhZzsKKwltcF9pcnEtPm1wX3NyY2J1cyA9IG0tPnNyY2J1czsKKwltcF9pcnEtPm1wX3NyY2J1c2lycSA9IG0tPnNyY2J1c2lycTsKKwltcF9pcnEtPm1wX2RzdGlycSA9IG0tPmRzdGlycTsKIH0KIAogc3RhdGljIHZvaWQgX19pbml0IGFzc2lnbl90b19tcGNfaW50c3JjKHN0cnVjdCBtcF9jb25maWdfaW50c3JjICptcF9pcnEsCi0JCQkJCXN0cnVjdCBtcGNfY29uZmlnX2ludHNyYyAqbSkKKwkJCQkJc3RydWN0IG1wY19pbnRzcmMgKm0pCiB7Ci0JbS0+bXBjX2RzdGFwaWMgPSBtcF9pcnEtPm1wX2RzdGFwaWM7Ci0JbS0+bXBjX3R5cGUgPSBtcF9pcnEtPm1wX3R5cGU7Ci0JbS0+bXBjX2lycXR5cGUgPSBtcF9pcnEtPm1wX2lycXR5cGU7Ci0JbS0+bXBjX2lycWZsYWcgPSBtcF9pcnEtPm1wX2lycWZsYWc7Ci0JbS0+bXBjX3NyY2J1cyA9IG1wX2lycS0+bXBfc3JjYnVzOwotCW0tPm1wY19zcmNidXNpcnEgPSBtcF9pcnEtPm1wX3NyY2J1c2lycTsKLQltLT5tcGNfZHN0aXJxID0gbXBfaXJxLT5tcF9kc3RpcnE7CisJbS0+ZHN0YXBpYyA9IG1wX2lycS0+bXBfZHN0YXBpYzsKKwltLT50eXBlID0gbXBfaXJxLT5tcF90eXBlOworCW0tPmlycXR5cGUgPSBtcF9pcnEtPm1wX2lycXR5cGU7CisJbS0+aXJxZmxhZyA9IG1wX2lycS0+bXBfaXJxZmxhZzsKKwltLT5zcmNidXMgPSBtcF9pcnEtPm1wX3NyY2J1czsKKwltLT5zcmNidXNpcnEgPSBtcF9pcnEtPm1wX3NyY2J1c2lycTsKKwltLT5kc3RpcnEgPSBtcF9pcnEtPm1wX2RzdGlycTsKIH0KIAogc3RhdGljIGludCBfX2luaXQgbXBfaXJxX21wY19pbnRzcmNfY21wKHN0cnVjdCBtcF9jb25maWdfaW50c3JjICptcF9pcnEsCi0JCQkJCXN0cnVjdCBtcGNfY29uZmlnX2ludHNyYyAqbSkKKwkJCQkJc3RydWN0IG1wY19pbnRzcmMgKm0pCiB7Ci0JaWYgKG1wX2lycS0+bXBfZHN0YXBpYyAhPSBtLT5tcGNfZHN0YXBpYykKKwlpZiAobXBfaXJxLT5tcF9kc3RhcGljICE9IG0tPmRzdGFwaWMpCiAJCXJldHVybiAxOwotCWlmIChtcF9pcnEtPm1wX3R5cGUgIT0gbS0+bXBjX3R5cGUpCisJaWYgKG1wX2lycS0+bXBfdHlwZSAhPSBtLT50eXBlKQogCQlyZXR1cm4gMjsKLQlpZiAobXBfaXJxLT5tcF9pcnF0eXBlICE9IG0tPm1wY19pcnF0eXBlKQorCWlmIChtcF9pcnEtPm1wX2lycXR5cGUgIT0gbS0+aXJxdHlwZSkKIAkJcmV0dXJuIDM7Ci0JaWYgKG1wX2lycS0+bXBfaXJxZmxhZyAhPSBtLT5tcGNfaXJxZmxhZykKKwlpZiAobXBfaXJxLT5tcF9pcnFmbGFnICE9IG0tPmlycWZsYWcpCiAJCXJldHVybiA0OwotCWlmIChtcF9pcnEtPm1wX3NyY2J1cyAhPSBtLT5tcGNfc3JjYnVzKQorCWlmIChtcF9pcnEtPm1wX3NyY2J1cyAhPSBtLT5zcmNidXMpCiAJCXJldHVybiA1OwotCWlmIChtcF9pcnEtPm1wX3NyY2J1c2lycSAhPSBtLT5tcGNfc3JjYnVzaXJxKQorCWlmIChtcF9pcnEtPm1wX3NyY2J1c2lycSAhPSBtLT5zcmNidXNpcnEpCiAJCXJldHVybiA2OwotCWlmIChtcF9pcnEtPm1wX2RzdGlycSAhPSBtLT5tcGNfZHN0aXJxKQorCWlmIChtcF9pcnEtPm1wX2RzdGlycSAhPSBtLT5kc3RpcnEpCiAJCXJldHVybiA3OwogCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBNUF9pbnRzcmNfaW5mbyhzdHJ1Y3QgbXBjX2NvbmZpZ19pbnRzcmMgKm0pCitzdGF0aWMgdm9pZCBfX2luaXQgTVBfaW50c3JjX2luZm8oc3RydWN0IG1wY19pbnRzcmMgKm0pCiB7CiAJaW50IGk7CiAKQEAgLTIzMyw1NyArMjMyLDU1IEBACiAKICNlbmRpZgogCi1zdGF0aWMgdm9pZCBfX2luaXQgTVBfbGludHNyY19pbmZvKHN0cnVjdCBtcGNfY29uZmlnX2xpbnRzcmMgKm0pCitzdGF0aWMgdm9pZCBfX2luaXQgTVBfbGludHNyY19pbmZvKHN0cnVjdCBtcGNfbGludHNyYyAqbSkKIHsKIAlhcGljX3ByaW50ayhBUElDX1ZFUkJPU0UsICJMaW50OiB0eXBlICVkLCBwb2wgJWQsIHRyaWcgJWQsIGJ1cyAlMDJ4LCIKIAkJIiBJUlEgJTAyeCwgQVBJQyBJRCAleCwgQVBJQyBMSU5UICUwMnhcbiIsCi0JCW0tPm1wY19pcnF0eXBlLCBtLT5tcGNfaXJxZmxhZyAmIDMsCi0JCShtLT5tcGNfaXJxZmxhZyA+PiAyKSAmIDMsIG0tPm1wY19zcmNidXNpZCwKLQkJbS0+bXBjX3NyY2J1c2lycSwgbS0+bXBjX2Rlc3RhcGljLCBtLT5tcGNfZGVzdGFwaWNsaW50KTsKKwkJbS0+aXJxdHlwZSwgbS0+aXJxZmxhZyAmIDMsIChtLT5pcnFmbGFnID4+IDIpICYgMywgbS0+c3JjYnVzaWQsCisJCW0tPnNyY2J1c2lycSwgbS0+ZGVzdGFwaWMsIG0tPmRlc3RhcGljbGludCk7CiB9CiAKIC8qCiAgKiBSZWFkL3BhcnNlIHRoZSBNUEMKICAqLwogCi1zdGF0aWMgaW50IF9faW5pdCBzbXBfY2hlY2tfbXBjKHN0cnVjdCBtcF9jb25maWdfdGFibGUgKm1wYywgY2hhciAqb2VtLAotCQkJCWNoYXIgKnN0cikKK3N0YXRpYyBpbnQgX19pbml0IHNtcF9jaGVja19tcGMoc3RydWN0IG1wY190YWJsZSAqbXBjLCBjaGFyICpvZW0sIGNoYXIgKnN0cikKIHsKIAotCWlmIChtZW1jbXAobXBjLT5tcGNfc2lnbmF0dXJlLCBNUENfU0lHTkFUVVJFLCA0KSkgeworCWlmIChtZW1jbXAobXBjLT5zaWduYXR1cmUsIE1QQ19TSUdOQVRVUkUsIDQpKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiTVBUQUJMRTogYmFkIHNpZ25hdHVyZSBbJWMlYyVjJWNdIVxuIiwKLQkJICAgICAgIG1wYy0+bXBjX3NpZ25hdHVyZVswXSwgbXBjLT5tcGNfc2lnbmF0dXJlWzFdLAotCQkgICAgICAgbXBjLT5tcGNfc2lnbmF0dXJlWzJdLCBtcGMtPm1wY19zaWduYXR1cmVbM10pOworCQkgICAgICAgbXBjLT5zaWduYXR1cmVbMF0sIG1wYy0+c2lnbmF0dXJlWzFdLAorCQkgICAgICAgbXBjLT5zaWduYXR1cmVbMl0sIG1wYy0+c2lnbmF0dXJlWzNdKTsKIAkJcmV0dXJuIDA7CiAJfQotCWlmIChtcGZfY2hlY2tzdW0oKHVuc2lnbmVkIGNoYXIgKiltcGMsIG1wYy0+bXBjX2xlbmd0aCkpIHsKKwlpZiAobXBmX2NoZWNrc3VtKCh1bnNpZ25lZCBjaGFyICopbXBjLCBtcGMtPmxlbmd0aCkpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJNUFRBQkxFOiBjaGVja3N1bSBlcnJvciFcbiIpOwogCQlyZXR1cm4gMDsKIAl9Ci0JaWYgKG1wYy0+bXBjX3NwZWMgIT0gMHgwMSAmJiBtcGMtPm1wY19zcGVjICE9IDB4MDQpIHsKKwlpZiAobXBjLT5zcGVjICE9IDB4MDEgJiYgbXBjLT5zcGVjICE9IDB4MDQpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJNUFRBQkxFOiBiYWQgdGFibGUgdmVyc2lvbiAoJWQpISFcbiIsCi0JCSAgICAgICBtcGMtPm1wY19zcGVjKTsKKwkJICAgICAgIG1wYy0+c3BlYyk7CiAJCXJldHVybiAwOwogCX0KLQlpZiAoIW1wYy0+bXBjX2xhcGljKSB7CisJaWYgKCFtcGMtPmxhcGljKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiTVBUQUJMRTogbnVsbCBsb2NhbCBBUElDIGFkZHJlc3MhXG4iKTsKIAkJcmV0dXJuIDA7CiAJfQotCW1lbWNweShvZW0sIG1wYy0+bXBjX29lbSwgOCk7CisJbWVtY3B5KG9lbSwgbXBjLT5vZW0sIDgpOwogCW9lbVs4XSA9IDA7CiAJcHJpbnRrKEtFUk5fSU5GTyAiTVBUQUJMRTogT0VNIElEOiAlc1xuIiwgb2VtKTsKIAotCW1lbWNweShzdHIsIG1wYy0+bXBjX3Byb2R1Y3RpZCwgMTIpOworCW1lbWNweShzdHIsIG1wYy0+cHJvZHVjdGlkLCAxMik7CiAJc3RyWzEyXSA9IDA7CiAKIAlwcmludGsoS0VSTl9JTkZPICJNUFRBQkxFOiBQcm9kdWN0IElEOiAlc1xuIiwgc3RyKTsKIAotCXByaW50ayhLRVJOX0lORk8gIk1QVEFCTEU6IEFQSUMgYXQ6IDB4JVhcbiIsIG1wYy0+bXBjX2xhcGljKTsKKwlwcmludGsoS0VSTl9JTkZPICJNUFRBQkxFOiBBUElDIGF0OiAweCVYXG4iLCBtcGMtPmxhcGljKTsKIAogCXJldHVybiAxOwogfQogCi1zdGF0aWMgaW50IF9faW5pdCBzbXBfcmVhZF9tcGMoc3RydWN0IG1wX2NvbmZpZ190YWJsZSAqbXBjLCB1bnNpZ25lZCBlYXJseSkKK3N0YXRpYyBpbnQgX19pbml0IHNtcF9yZWFkX21wYyhzdHJ1Y3QgbXBjX3RhYmxlICptcGMsIHVuc2lnbmVkIGVhcmx5KQogewogCWNoYXIgc3RyWzE2XTsKIAljaGFyIG9lbVsxMF07CkBAIC0zMDgsMTQgKzMwNSwxNCBAQAogI2VuZGlmCiAJLyogc2F2ZSB0aGUgbG9jYWwgQVBJQyBhZGRyZXNzLCBpdCBtaWdodCBiZSBub24tZGVmYXVsdCAqLwogCWlmICghYWNwaV9sYXBpYykKLQkJbXBfbGFwaWNfYWRkciA9IG1wYy0+bXBjX2xhcGljOworCQltcF9sYXBpY19hZGRyID0gbXBjLT5sYXBpYzsKIAogCWlmIChlYXJseSkKIAkJcmV0dXJuIDE7CiAKLQlpZiAobXBjLT5tcGNfb2VtcHRyICYmIHg4Nl9xdWlya3MtPnNtcF9yZWFkX21wY19vZW0pIHsKLQkJc3RydWN0IG1wX2NvbmZpZ19vZW10YWJsZSAqb2VtX3RhYmxlID0gKHN0cnVjdCBtcF9jb25maWdfb2VtdGFibGUgKikodW5zaWduZWQgbG9uZyltcGMtPm1wY19vZW1wdHI7Ci0JCXg4Nl9xdWlya3MtPnNtcF9yZWFkX21wY19vZW0ob2VtX3RhYmxlLCBtcGMtPm1wY19vZW1zaXplKTsKKwlpZiAobXBjLT5vZW1wdHIgJiYgeDg2X3F1aXJrcy0+c21wX3JlYWRfbXBjX29lbSkgeworCQlzdHJ1Y3QgbXBjX29lbXRhYmxlICpvZW1fdGFibGUgPSAodm9pZCAqKShsb25nKW1wYy0+b2VtcHRyOworCQl4ODZfcXVpcmtzLT5zbXBfcmVhZF9tcGNfb2VtKG9lbV90YWJsZSwgbXBjLT5vZW1zaXplKTsKIAl9CiAKIAkvKgpAQCAtMzI0LDEyICszMjEsMTEgQEAKIAlpZiAoeDg2X3F1aXJrcy0+bXBjX3JlY29yZCkKIAkJKng4Nl9xdWlya3MtPm1wY19yZWNvcmQgPSAwOwogCi0Jd2hpbGUgKGNvdW50IDwgbXBjLT5tcGNfbGVuZ3RoKSB7CisJd2hpbGUgKGNvdW50IDwgbXBjLT5sZW5ndGgpIHsKIAkJc3dpdGNoICgqbXB0KSB7CiAJCWNhc2UgTVBfUFJPQ0VTU09SOgogCQkJewotCQkJCXN0cnVjdCBtcGNfY29uZmlnX3Byb2Nlc3NvciAqbSA9Ci0JCQkJICAgIChzdHJ1Y3QgbXBjX2NvbmZpZ19wcm9jZXNzb3IgKiltcHQ7CisJCQkJc3RydWN0IG1wY19jcHUgKm0gPSAoc3RydWN0IG1wY19jcHUgKiltcHQ7CiAJCQkJLyogQUNQSSBtYXkgaGF2ZSBhbHJlYWR5IHByb3ZpZGVkIHRoaXMgZGF0YSAqLwogCQkJCWlmICghYWNwaV9sYXBpYykKIAkJCQkJTVBfcHJvY2Vzc29yX2luZm8obSk7CkBAIC0zMzksOCArMzM1LDcgQEAKIAkJCX0KIAkJY2FzZSBNUF9CVVM6CiAJCQl7Ci0JCQkJc3RydWN0IG1wY19jb25maWdfYnVzICptID0KLQkJCQkgICAgKHN0cnVjdCBtcGNfY29uZmlnX2J1cyAqKW1wdDsKKwkJCQlzdHJ1Y3QgbXBjX2J1cyAqbSA9IChzdHJ1Y3QgbXBjX2J1cyAqKW1wdDsKICNpZmRlZiBDT05GSUdfWDg2X0lPX0FQSUMKIAkJCQlNUF9idXNfaW5mbyhtKTsKICNlbmRpZgpAQCAtMzUxLDMwICszNDYsMjggQEAKIAkJY2FzZSBNUF9JT0FQSUM6CiAJCQl7CiAjaWZkZWYgQ09ORklHX1g4Nl9JT19BUElDCi0JCQkJc3RydWN0IG1wY19jb25maWdfaW9hcGljICptID0KLQkJCQkgICAgKHN0cnVjdCBtcGNfY29uZmlnX2lvYXBpYyAqKW1wdDsKKwkJCQlzdHJ1Y3QgbXBjX2lvYXBpYyAqbSA9IChzdHJ1Y3QgbXBjX2lvYXBpYyAqKW1wdDsKIAkJCQlNUF9pb2FwaWNfaW5mbyhtKTsKICNlbmRpZgotCQkJCW1wdCArPSBzaXplb2Yoc3RydWN0IG1wY19jb25maWdfaW9hcGljKTsKLQkJCQljb3VudCArPSBzaXplb2Yoc3RydWN0IG1wY19jb25maWdfaW9hcGljKTsKKwkJCQltcHQgKz0gc2l6ZW9mKHN0cnVjdCBtcGNfaW9hcGljKTsKKwkJCQljb3VudCArPSBzaXplb2Yoc3RydWN0IG1wY19pb2FwaWMpOwogCQkJCWJyZWFrOwogCQkJfQogCQljYXNlIE1QX0lOVFNSQzoKIAkJCXsKICNpZmRlZiBDT05GSUdfWDg2X0lPX0FQSUMKLQkJCQlzdHJ1Y3QgbXBjX2NvbmZpZ19pbnRzcmMgKm0gPQotCQkJCSAgICAoc3RydWN0IG1wY19jb25maWdfaW50c3JjICopbXB0OworCQkJCXN0cnVjdCBtcGNfaW50c3JjICptID0gKHN0cnVjdCBtcGNfaW50c3JjICopbXB0OwogCiAJCQkJTVBfaW50c3JjX2luZm8obSk7CiAjZW5kaWYKLQkJCQltcHQgKz0gc2l6ZW9mKHN0cnVjdCBtcGNfY29uZmlnX2ludHNyYyk7Ci0JCQkJY291bnQgKz0gc2l6ZW9mKHN0cnVjdCBtcGNfY29uZmlnX2ludHNyYyk7CisJCQkJbXB0ICs9IHNpemVvZihzdHJ1Y3QgbXBjX2ludHNyYyk7CisJCQkJY291bnQgKz0gc2l6ZW9mKHN0cnVjdCBtcGNfaW50c3JjKTsKIAkJCQlicmVhazsKIAkJCX0KIAkJY2FzZSBNUF9MSU5UU1JDOgogCQkJewotCQkJCXN0cnVjdCBtcGNfY29uZmlnX2xpbnRzcmMgKm0gPQotCQkJCSAgICAoc3RydWN0IG1wY19jb25maWdfbGludHNyYyAqKW1wdDsKKwkJCQlzdHJ1Y3QgbXBjX2xpbnRzcmMgKm0gPQorCQkJCSAgICAoc3RydWN0IG1wY19saW50c3JjICopbXB0OwogCQkJCU1QX2xpbnRzcmNfaW5mbyhtKTsKIAkJCQltcHQgKz0gc2l6ZW9mKCptKTsKIAkJCQljb3VudCArPSBzaXplb2YoKm0pOwpAQCAtMzg1LDggKzM3OCw4IEBACiAJCQlwcmludGsoS0VSTl9FUlIgIllvdXIgbXB0YWJsZSBpcyB3cm9uZywgY29udGFjdCB5b3VyIEhXIHZlbmRvciFcbiIpOwogCQkJcHJpbnRrKEtFUk5fRVJSICJ0eXBlICV4XG4iLCAqbXB0KTsKIAkJCXByaW50X2hleF9kdW1wKEtFUk5fRVJSLCAiICAiLCBEVU1QX1BSRUZJWF9BRERSRVNTLCAxNiwKLQkJCQkJMSwgbXBjLCBtcGMtPm1wY19sZW5ndGgsIDEpOwotCQkJY291bnQgPSBtcGMtPm1wY19sZW5ndGg7CisJCQkJCTEsIG1wYywgbXBjLT5sZW5ndGgsIDEpOworCQkJY291bnQgPSBtcGMtPmxlbmd0aDsKIAkJCWJyZWFrOwogCQl9CiAJCWlmICh4ODZfcXVpcmtzLT5tcGNfcmVjb3JkKQpAQCAtNDE3LDE2ICs0MTAsMTYgQEAKIAogc3RhdGljIHZvaWQgX19pbml0IGNvbnN0cnVjdF9kZWZhdWx0X2lvaXJxX21wdGFibGUoaW50IG1wY19kZWZhdWx0X3R5cGUpCiB7Ci0Jc3RydWN0IG1wY19jb25maWdfaW50c3JjIGludHNyYzsKKwlzdHJ1Y3QgbXBjX2ludHNyYyBpbnRzcmM7CiAJaW50IGk7CiAJaW50IEVMQ1JfZmFsbGJhY2sgPSAwOwogCi0JaW50c3JjLm1wY190eXBlID0gTVBfSU5UU1JDOwotCWludHNyYy5tcGNfaXJxZmxhZyA9IDA7CS8qIGNvbmZvcm1pbmcgKi8KLQlpbnRzcmMubXBjX3NyY2J1cyA9IDA7Ci0JaW50c3JjLm1wY19kc3RhcGljID0gbXBfaW9hcGljc1swXS5tcF9hcGljaWQ7CisJaW50c3JjLnR5cGUgPSBNUF9JTlRTUkM7CisJaW50c3JjLmlycWZsYWcgPSAwOwkvKiBjb25mb3JtaW5nICovCisJaW50c3JjLnNyY2J1cyA9IDA7CisJaW50c3JjLmRzdGFwaWMgPSBtcF9pb2FwaWNzWzBdLm1wX2FwaWNpZDsKIAotCWludHNyYy5tcGNfaXJxdHlwZSA9IG1wX0lOVDsKKwlpbnRzcmMuaXJxdHlwZSA9IG1wX0lOVDsKIAogCS8qCiAJICogIElmIHRydWUsIHdlIGhhdmUgYW4gSVNBL1BDSSBzeXN0ZW0gd2l0aCBubyBJUlEgZW50cmllcwpAQCAtNDY5LDMwICs0NjIsMzAgQEAKIAkJCSAqICBpcnFmbGFnIGZpZWxkIChsZXZlbCBzZW5zaXRpdmUsIGFjdGl2ZSBoaWdoIHBvbGFyaXR5KS4KIAkJCSAqLwogCQkJaWYgKEVMQ1JfdHJpZ2dlcihpKSkKLQkJCQlpbnRzcmMubXBjX2lycWZsYWcgPSAxMzsKKwkJCQlpbnRzcmMuaXJxZmxhZyA9IDEzOwogCQkJZWxzZQotCQkJCWludHNyYy5tcGNfaXJxZmxhZyA9IDA7CisJCQkJaW50c3JjLmlycWZsYWcgPSAwOwogCQl9CiAKLQkJaW50c3JjLm1wY19zcmNidXNpcnEgPSBpOwotCQlpbnRzcmMubXBjX2RzdGlycSA9IGkgPyBpIDogMjsJLyogSVJRMCB0byBJTlRJTjIgKi8KKwkJaW50c3JjLnNyY2J1c2lycSA9IGk7CisJCWludHNyYy5kc3RpcnEgPSBpID8gaSA6IDI7CS8qIElSUTAgdG8gSU5USU4yICovCiAJCU1QX2ludHNyY19pbmZvKCZpbnRzcmMpOwogCX0KIAotCWludHNyYy5tcGNfaXJxdHlwZSA9IG1wX0V4dElOVDsKLQlpbnRzcmMubXBjX3NyY2J1c2lycSA9IDA7Ci0JaW50c3JjLm1wY19kc3RpcnEgPSAwOwkvKiA4MjU5QSB0byBJTlRJTjAgKi8KKwlpbnRzcmMuaXJxdHlwZSA9IG1wX0V4dElOVDsKKwlpbnRzcmMuc3JjYnVzaXJxID0gMDsKKwlpbnRzcmMuZHN0aXJxID0gMDsJLyogODI1OUEgdG8gSU5USU4wICovCiAJTVBfaW50c3JjX2luZm8oJmludHNyYyk7CiB9CiAKIAogc3RhdGljIHZvaWQgX19pbml0IGNvbnN0cnVjdF9pb2FwaWNfdGFibGUoaW50IG1wY19kZWZhdWx0X3R5cGUpCiB7Ci0Jc3RydWN0IG1wY19jb25maWdfaW9hcGljIGlvYXBpYzsKLQlzdHJ1Y3QgbXBjX2NvbmZpZ19idXMgYnVzOworCXN0cnVjdCBtcGNfaW9hcGljIGlvYXBpYzsKKwlzdHJ1Y3QgbXBjX2J1cyBidXM7CiAKLQlidXMubXBjX3R5cGUgPSBNUF9CVVM7Ci0JYnVzLm1wY19idXNpZCA9IDA7CisJYnVzLnR5cGUgPSBNUF9CVVM7CisJYnVzLmJ1c2lkID0gMDsKIAlzd2l0Y2ggKG1wY19kZWZhdWx0X3R5cGUpIHsKIAlkZWZhdWx0OgogCQlwcmludGsoS0VSTl9FUlIgIj8/P1xuVW5rbm93biBzdGFuZGFyZCBjb25maWd1cmF0aW9uICVkXG4iLApAQCAtNTAwLDI5ICs0OTMsMjkgQEAKIAkJLyogZmFsbCB0aHJvdWdoICovCiAJY2FzZSAxOgogCWNhc2UgNToKLQkJbWVtY3B5KGJ1cy5tcGNfYnVzdHlwZSwgIklTQSAgICIsIDYpOworCQltZW1jcHkoYnVzLmJ1c3R5cGUsICJJU0EgICAiLCA2KTsKIAkJYnJlYWs7CiAJY2FzZSAyOgogCWNhc2UgNjoKIAljYXNlIDM6Ci0JCW1lbWNweShidXMubXBjX2J1c3R5cGUsICJFSVNBICAiLCA2KTsKKwkJbWVtY3B5KGJ1cy5idXN0eXBlLCAiRUlTQSAgIiwgNik7CiAJCWJyZWFrOwogCWNhc2UgNDoKIAljYXNlIDc6Ci0JCW1lbWNweShidXMubXBjX2J1c3R5cGUsICJNQ0EgICAiLCA2KTsKKwkJbWVtY3B5KGJ1cy5idXN0eXBlLCAiTUNBICAgIiwgNik7CiAJfQogCU1QX2J1c19pbmZvKCZidXMpOwogCWlmIChtcGNfZGVmYXVsdF90eXBlID4gNCkgewotCQlidXMubXBjX2J1c2lkID0gMTsKLQkJbWVtY3B5KGJ1cy5tcGNfYnVzdHlwZSwgIlBDSSAgICIsIDYpOworCQlidXMuYnVzaWQgPSAxOworCQltZW1jcHkoYnVzLmJ1c3R5cGUsICJQQ0kgICAiLCA2KTsKIAkJTVBfYnVzX2luZm8oJmJ1cyk7CiAJfQogCi0JaW9hcGljLm1wY190eXBlID0gTVBfSU9BUElDOwotCWlvYXBpYy5tcGNfYXBpY2lkID0gMjsKLQlpb2FwaWMubXBjX2FwaWN2ZXIgPSBtcGNfZGVmYXVsdF90eXBlID4gNCA/IDB4MTAgOiAweDAxOwotCWlvYXBpYy5tcGNfZmxhZ3MgPSBNUENfQVBJQ19VU0FCTEU7Ci0JaW9hcGljLm1wY19hcGljYWRkciA9IDB4RkVDMDAwMDA7CisJaW9hcGljLnR5cGUgPSBNUF9JT0FQSUM7CisJaW9hcGljLmFwaWNpZCA9IDI7CisJaW9hcGljLmFwaWN2ZXIgPSBtcGNfZGVmYXVsdF90eXBlID4gNCA/IDB4MTAgOiAweDAxOworCWlvYXBpYy5mbGFncyA9IE1QQ19BUElDX1VTQUJMRTsKKwlpb2FwaWMuYXBpY2FkZHIgPSAweEZFQzAwMDAwOwogCU1QX2lvYXBpY19pbmZvKCZpb2FwaWMpOwogCiAJLyoKQEAgLTUzNiw4ICs1MjksOCBAQAogCiBzdGF0aWMgaW5saW5lIHZvaWQgX19pbml0IGNvbnN0cnVjdF9kZWZhdWx0X0lTQV9tcHRhYmxlKGludCBtcGNfZGVmYXVsdF90eXBlKQogewotCXN0cnVjdCBtcGNfY29uZmlnX3Byb2Nlc3NvciBwcm9jZXNzb3I7Ci0Jc3RydWN0IG1wY19jb25maWdfbGludHNyYyBsaW50c3JjOworCXN0cnVjdCBtcGNfY3B1IHByb2Nlc3NvcjsKKwlzdHJ1Y3QgbXBjX2xpbnRzcmMgbGludHNyYzsKIAlpbnQgbGludHR5cGVzWzJdID0geyBtcF9FeHRJTlQsIG1wX05NSSB9OwogCWludCBpOwogCkBAIC01NDksMzAgKzU0MiwzMCBAQAogCS8qCiAJICogMiBDUFVzLCBudW1iZXJlZCAwICYgMS4KIAkgKi8KLQlwcm9jZXNzb3IubXBjX3R5cGUgPSBNUF9QUk9DRVNTT1I7CisJcHJvY2Vzc29yLnR5cGUgPSBNUF9QUk9DRVNTT1I7CiAJLyogRWl0aGVyIGFuIGludGVncmF0ZWQgQVBJQyBvciBhIGRpc2NyZXRlIDgyNDg5RFguICovCi0JcHJvY2Vzc29yLm1wY19hcGljdmVyID0gbXBjX2RlZmF1bHRfdHlwZSA+IDQgPyAweDEwIDogMHgwMTsKLQlwcm9jZXNzb3IubXBjX2NwdWZsYWcgPSBDUFVfRU5BQkxFRDsKLQlwcm9jZXNzb3IubXBjX2NwdWZlYXR1cmUgPSAoYm9vdF9jcHVfZGF0YS54ODYgPDwgOCkgfAorCXByb2Nlc3Nvci5hcGljdmVyID0gbXBjX2RlZmF1bHRfdHlwZSA+IDQgPyAweDEwIDogMHgwMTsKKwlwcm9jZXNzb3IuY3B1ZmxhZyA9IENQVV9FTkFCTEVEOworCXByb2Nlc3Nvci5jcHVmZWF0dXJlID0gKGJvb3RfY3B1X2RhdGEueDg2IDw8IDgpIHwKIAkgICAgKGJvb3RfY3B1X2RhdGEueDg2X21vZGVsIDw8IDQpIHwgYm9vdF9jcHVfZGF0YS54ODZfbWFzazsKLQlwcm9jZXNzb3IubXBjX2ZlYXR1cmVmbGFnID0gYm9vdF9jcHVfZGF0YS54ODZfY2FwYWJpbGl0eVswXTsKLQlwcm9jZXNzb3IubXBjX3Jlc2VydmVkWzBdID0gMDsKLQlwcm9jZXNzb3IubXBjX3Jlc2VydmVkWzFdID0gMDsKKwlwcm9jZXNzb3IuZmVhdHVyZWZsYWcgPSBib290X2NwdV9kYXRhLng4Nl9jYXBhYmlsaXR5WzBdOworCXByb2Nlc3Nvci5yZXNlcnZlZFswXSA9IDA7CisJcHJvY2Vzc29yLnJlc2VydmVkWzFdID0gMDsKIAlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7Ci0JCXByb2Nlc3Nvci5tcGNfYXBpY2lkID0gaTsKKwkJcHJvY2Vzc29yLmFwaWNpZCA9IGk7CiAJCU1QX3Byb2Nlc3Nvcl9pbmZvKCZwcm9jZXNzb3IpOwogCX0KIAogCWNvbnN0cnVjdF9pb2FwaWNfdGFibGUobXBjX2RlZmF1bHRfdHlwZSk7CiAKLQlsaW50c3JjLm1wY190eXBlID0gTVBfTElOVFNSQzsKLQlsaW50c3JjLm1wY19pcnFmbGFnID0gMDsJLyogY29uZm9ybWluZyAqLwotCWxpbnRzcmMubXBjX3NyY2J1c2lkID0gMDsKLQlsaW50c3JjLm1wY19zcmNidXNpcnEgPSAwOwotCWxpbnRzcmMubXBjX2Rlc3RhcGljID0gTVBfQVBJQ19BTEw7CisJbGludHNyYy50eXBlID0gTVBfTElOVFNSQzsKKwlsaW50c3JjLmlycWZsYWcgPSAwOwkJLyogY29uZm9ybWluZyAqLworCWxpbnRzcmMuc3JjYnVzaWQgPSAwOworCWxpbnRzcmMuc3JjYnVzaXJxID0gMDsKKwlsaW50c3JjLmRlc3RhcGljID0gTVBfQVBJQ19BTEw7CiAJZm9yIChpID0gMDsgaSA8IDI7IGkrKykgewotCQlsaW50c3JjLm1wY19pcnF0eXBlID0gbGludHR5cGVzW2ldOwotCQlsaW50c3JjLm1wY19kZXN0YXBpY2xpbnQgPSBpOworCQlsaW50c3JjLmlycXR5cGUgPSBsaW50dHlwZXNbaV07CisJCWxpbnRzcmMuZGVzdGFwaWNsaW50ID0gaTsKIAkJTVBfbGludHNyY19pbmZvKCZsaW50c3JjKTsKIAl9CiB9CkBAIC02NTcsMTUgKzY1MCwxNSBAQAogCQkgKiBJU0EgZGVmYXVsdHMgYW5kIGhvcGUgaXQgd2lsbCB3b3JrLgogCQkgKi8KIAkJaWYgKCFtcF9pcnFfZW50cmllcykgewotCQkJc3RydWN0IG1wY19jb25maWdfYnVzIGJ1czsKKwkJCXN0cnVjdCBtcGNfYnVzIGJ1czsKIAogCQkJcHJpbnRrKEtFUk5fRVJSICJCSU9TIGJ1Zywgbm8gZXhwbGljaXQgSVJRIGVudHJpZXMsICIKIAkJCSAgICAgICAidXNpbmcgZGVmYXVsdCBtcHRhYmxlLiAiCiAJCQkgICAgICAgIih0ZWxsIHlvdXIgaHcgdmVuZG9yKVxuIik7CiAKLQkJCWJ1cy5tcGNfdHlwZSA9IE1QX0JVUzsKLQkJCWJ1cy5tcGNfYnVzaWQgPSAwOwotCQkJbWVtY3B5KGJ1cy5tcGNfYnVzdHlwZSwgIklTQSAgICIsIDYpOworCQkJYnVzLnR5cGUgPSBNUF9CVVM7CisJCQlidXMuYnVzaWQgPSAwOworCQkJbWVtY3B5KGJ1cy5idXN0eXBlLCAiSVNBICAgIiwgNik7CiAJCQlNUF9idXNfaW5mbygmYnVzKTsKIAogCQkJY29uc3RydWN0X2RlZmF1bHRfaW9pcnFfbXB0YWJsZSgwKTsKQEAgLTgwMywxNCArNzk2LDE0IEBACiAjaWZkZWYgQ09ORklHX1g4Nl9JT19BUElDCiBzdGF0aWMgdTggX19pbml0ZGF0YSBpcnFfdXNlZFtNQVhfSVJRX1NPVVJDRVNdOwogCi1zdGF0aWMgaW50ICBfX2luaXQgZ2V0X01QX2ludHNyY19pbmRleChzdHJ1Y3QgbXBjX2NvbmZpZ19pbnRzcmMgKm0pCitzdGF0aWMgaW50ICBfX2luaXQgZ2V0X01QX2ludHNyY19pbmRleChzdHJ1Y3QgbXBjX2ludHNyYyAqbSkKIHsKIAlpbnQgaTsKIAotCWlmIChtLT5tcGNfaXJxdHlwZSAhPSBtcF9JTlQpCisJaWYgKG0tPmlycXR5cGUgIT0gbXBfSU5UKQogCQlyZXR1cm4gMDsKIAotCWlmIChtLT5tcGNfaXJxZmxhZyAhPSAweDBmKQorCWlmIChtLT5pcnFmbGFnICE9IDB4MGYpCiAJCXJldHVybiAwOwogCiAJLyogbm90IGxlZ2FjeSAqLwpAQCAtODIyLDkgKzgxNSw5IEBACiAJCWlmIChtcF9pcnFzW2ldLm1wX2lycWZsYWcgIT0gMHgwZikKIAkJCWNvbnRpbnVlOwogCi0JCWlmIChtcF9pcnFzW2ldLm1wX3NyY2J1cyAhPSBtLT5tcGNfc3JjYnVzKQorCQlpZiAobXBfaXJxc1tpXS5tcF9zcmNidXMgIT0gbS0+c3JjYnVzKQogCQkJY29udGludWU7Ci0JCWlmIChtcF9pcnFzW2ldLm1wX3NyY2J1c2lycSAhPSBtLT5tcGNfc3JjYnVzaXJxKQorCQlpZiAobXBfaXJxc1tpXS5tcF9zcmNidXNpcnEgIT0gbS0+c3JjYnVzaXJxKQogCQkJY29udGludWU7CiAJCWlmIChpcnFfdXNlZFtpXSkgewogCQkJLyogYWxyZWFkeSBjbGFpbWVkICovCkBAIC04NDAsMTAgKzgzMywxMCBAQAogCiAjZGVmaW5lIFNQQVJFX1NMT1RfTlVNIDIwCiAKLXN0YXRpYyBzdHJ1Y3QgbXBjX2NvbmZpZ19pbnRzcmMgX19pbml0ZGF0YSAqbV9zcGFyZVtTUEFSRV9TTE9UX05VTV07CitzdGF0aWMgc3RydWN0IG1wY19pbnRzcmMgX19pbml0ZGF0YSAqbV9zcGFyZVtTUEFSRV9TTE9UX05VTV07CiAjZW5kaWYKIAotc3RhdGljIGludCAgX19pbml0IHJlcGxhY2VfaW50c3JjX2FsbChzdHJ1Y3QgbXBfY29uZmlnX3RhYmxlICptcGMsCitzdGF0aWMgaW50ICBfX2luaXQgcmVwbGFjZV9pbnRzcmNfYWxsKHN0cnVjdCBtcGNfdGFibGUgKm1wYywKIAkJCQkJdW5zaWduZWQgbG9uZyBtcGNfbmV3X3BoeXMsCiAJCQkJCXVuc2lnbmVkIGxvbmcgbXBjX25ld19sZW5ndGgpCiB7CkBAIC04NTUsMzYgKzg0OCwzMyBAQAogCWludCBjb3VudCA9IHNpemVvZigqbXBjKTsKIAl1bnNpZ25lZCBjaGFyICptcHQgPSAoKHVuc2lnbmVkIGNoYXIgKiltcGMpICsgY291bnQ7CiAKLQlwcmludGsoS0VSTl9JTkZPICJtcGNfbGVuZ3RoICV4XG4iLCBtcGMtPm1wY19sZW5ndGgpOwotCXdoaWxlIChjb3VudCA8IG1wYy0+bXBjX2xlbmd0aCkgeworCXByaW50ayhLRVJOX0lORk8gIm1wY19sZW5ndGggJXhcbiIsIG1wYy0+bGVuZ3RoKTsKKwl3aGlsZSAoY291bnQgPCBtcGMtPmxlbmd0aCkgewogCQlzd2l0Y2ggKCptcHQpIHsKIAkJY2FzZSBNUF9QUk9DRVNTT1I6CiAJCQl7Ci0JCQkJc3RydWN0IG1wY19jb25maWdfcHJvY2Vzc29yICptID0KLQkJCQkgICAgKHN0cnVjdCBtcGNfY29uZmlnX3Byb2Nlc3NvciAqKW1wdDsKKwkJCQlzdHJ1Y3QgbXBjX2NwdSAqbSA9IChzdHJ1Y3QgbXBjX2NwdSAqKW1wdDsKIAkJCQltcHQgKz0gc2l6ZW9mKCptKTsKIAkJCQljb3VudCArPSBzaXplb2YoKm0pOwogCQkJCWJyZWFrOwogCQkJfQogCQljYXNlIE1QX0JVUzoKIAkJCXsKLQkJCQlzdHJ1Y3QgbXBjX2NvbmZpZ19idXMgKm0gPQotCQkJCSAgICAoc3RydWN0IG1wY19jb25maWdfYnVzICopbXB0OworCQkJCXN0cnVjdCBtcGNfYnVzICptID0gKHN0cnVjdCBtcGNfYnVzICopbXB0OwogCQkJCW1wdCArPSBzaXplb2YoKm0pOwogCQkJCWNvdW50ICs9IHNpemVvZigqbSk7CiAJCQkJYnJlYWs7CiAJCQl9CiAJCWNhc2UgTVBfSU9BUElDOgogCQkJewotCQkJCW1wdCArPSBzaXplb2Yoc3RydWN0IG1wY19jb25maWdfaW9hcGljKTsKLQkJCQljb3VudCArPSBzaXplb2Yoc3RydWN0IG1wY19jb25maWdfaW9hcGljKTsKKwkJCQltcHQgKz0gc2l6ZW9mKHN0cnVjdCBtcGNfaW9hcGljKTsKKwkJCQljb3VudCArPSBzaXplb2Yoc3RydWN0IG1wY19pb2FwaWMpOwogCQkJCWJyZWFrOwogCQkJfQogCQljYXNlIE1QX0lOVFNSQzoKIAkJCXsKICNpZmRlZiBDT05GSUdfWDg2X0lPX0FQSUMKLQkJCQlzdHJ1Y3QgbXBjX2NvbmZpZ19pbnRzcmMgKm0gPQotCQkJCSAgICAoc3RydWN0IG1wY19jb25maWdfaW50c3JjICopbXB0OworCQkJCXN0cnVjdCBtcGNfaW50c3JjICptID0gKHN0cnVjdCBtcGNfaW50c3JjICopbXB0OwogCiAJCQkJcHJpbnRrKEtFUk5fSU5GTyAiT0xEICIpOwogCQkJCXByaW50X01QX2ludHNyY19pbmZvKG0pOwpAQCAtOTA1LDE0ICs4OTUsMTQgQEAKIAkJCQkJbnJfbV9zcGFyZSsrOwogCQkJCX0KICNlbmRpZgotCQkJCW1wdCArPSBzaXplb2Yoc3RydWN0IG1wY19jb25maWdfaW50c3JjKTsKLQkJCQljb3VudCArPSBzaXplb2Yoc3RydWN0IG1wY19jb25maWdfaW50c3JjKTsKKwkJCQltcHQgKz0gc2l6ZW9mKHN0cnVjdCBtcGNfaW50c3JjKTsKKwkJCQljb3VudCArPSBzaXplb2Yoc3RydWN0IG1wY19pbnRzcmMpOwogCQkJCWJyZWFrOwogCQkJfQogCQljYXNlIE1QX0xJTlRTUkM6CiAJCQl7Ci0JCQkJc3RydWN0IG1wY19jb25maWdfbGludHNyYyAqbSA9Ci0JCQkJICAgIChzdHJ1Y3QgbXBjX2NvbmZpZ19saW50c3JjICopbXB0OworCQkJCXN0cnVjdCBtcGNfbGludHNyYyAqbSA9CisJCQkJICAgIChzdHJ1Y3QgbXBjX2xpbnRzcmMgKiltcHQ7CiAJCQkJbXB0ICs9IHNpemVvZigqbSk7CiAJCQkJY291bnQgKz0gc2l6ZW9mKCptKTsKIAkJCQlicmVhazsKQEAgLTkyMiw3ICs5MTIsNyBAQAogCQkJcHJpbnRrKEtFUk5fRVJSICJZb3VyIG1wdGFibGUgaXMgd3JvbmcsIGNvbnRhY3QgeW91ciBIVyB2ZW5kb3IhXG4iKTsKIAkJCXByaW50ayhLRVJOX0VSUiAidHlwZSAleFxuIiwgKm1wdCk7CiAJCQlwcmludF9oZXhfZHVtcChLRVJOX0VSUiwgIiAgIiwgRFVNUF9QUkVGSVhfQUREUkVTUywgMTYsCi0JCQkJCTEsIG1wYywgbXBjLT5tcGNfbGVuZ3RoLCAxKTsKKwkJCQkJMSwgbXBjLCBtcGMtPmxlbmd0aCwgMSk7CiAJCQlnb3RvIG91dDsKIAkJfQogCX0KQEAgLTk0NCw5ICs5MzQsOCBAQAogCQkJYXNzaWduX3RvX21wY19pbnRzcmMoJm1wX2lycXNbaV0sIG1fc3BhcmVbbnJfbV9zcGFyZV0pOwogCQkJbV9zcGFyZVtucl9tX3NwYXJlXSA9IE5VTEw7CiAJCX0gZWxzZSB7Ci0JCQlzdHJ1Y3QgbXBjX2NvbmZpZ19pbnRzcmMgKm0gPQotCQkJICAgIChzdHJ1Y3QgbXBjX2NvbmZpZ19pbnRzcmMgKiltcHQ7Ci0JCQljb3VudCArPSBzaXplb2Yoc3RydWN0IG1wY19jb25maWdfaW50c3JjKTsKKwkJCXN0cnVjdCBtcGNfaW50c3JjICptID0gKHN0cnVjdCBtcGNfaW50c3JjICopbXB0OworCQkJY291bnQgKz0gc2l6ZW9mKHN0cnVjdCBtcGNfaW50c3JjKTsKIAkJCWlmICghbXBjX25ld19waHlzKSB7CiAJCQkJcHJpbnRrKEtFUk5fSU5GTyAiTm8gc3BhcmUgc2xvdHMsIHRyeSB0byBhcHBlbmQuLi50YWtlIHlvdXIgcmlzaywgbmV3IG1wY19sZW5ndGggJXhcbiIsIGNvdW50KTsKIAkJCX0gZWxzZSB7CkBAIC05NTgsMTcgKzk0NywxNiBAQAogCQkJCX0KIAkJCX0KIAkJCWFzc2lnbl90b19tcGNfaW50c3JjKCZtcF9pcnFzW2ldLCBtKTsKLQkJCW1wYy0+bXBjX2xlbmd0aCA9IGNvdW50OwotCQkJbXB0ICs9IHNpemVvZihzdHJ1Y3QgbXBjX2NvbmZpZ19pbnRzcmMpOworCQkJbXBjLT5sZW5ndGggPSBjb3VudDsKKwkJCW1wdCArPSBzaXplb2Yoc3RydWN0IG1wY19pbnRzcmMpOwogCQl9CiAJCXByaW50X21wX2lycV9pbmZvKCZtcF9pcnFzW2ldKTsKIAl9CiAjZW5kaWYKIG91dDoKIAkvKiB1cGRhdGUgY2hlY2tzdW0gKi8KLQltcGMtPm1wY19jaGVja3N1bSA9IDA7Ci0JbXBjLT5tcGNfY2hlY2tzdW0gLT0gbXBmX2NoZWNrc3VtKCh1bnNpZ25lZCBjaGFyICopbXBjLAotCQkJCQkgICBtcGMtPm1wY19sZW5ndGgpOworCW1wYy0+Y2hlY2tzdW0gPSAwOworCW1wYy0+Y2hlY2tzdW0gLT0gbXBmX2NoZWNrc3VtKCh1bnNpZ25lZCBjaGFyICopbXBjLCBtcGMtPmxlbmd0aCk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTEwMTQsOCArMTAwMiw3IEBACiAJY2hhciBzdHJbMTZdOwogCWNoYXIgb2VtWzEwXTsKIAlzdHJ1Y3QgaW50ZWxfbXBfZmxvYXRpbmcgKm1wZjsKLQlzdHJ1Y3QgbXBfY29uZmlnX3RhYmxlICptcGM7Ci0Jc3RydWN0IG1wX2NvbmZpZ190YWJsZSAqbXBjX25ldzsKKwlzdHJ1Y3QgbXBjX3RhYmxlICptcGMsICptcGNfbmV3OwogCiAJaWYgKCFlbmFibGVfdXBkYXRlX21wdGFibGUpCiAJCXJldHVybiAwOwpAQCAtMTA0MSw3ICsxMDI4LDcgQEAKIAlwcmludGsoS0VSTl9JTkZPICJtcGY6ICVseFxuIiwgdmlydF90b19waHlzKG1wZikpOwogCXByaW50ayhLRVJOX0lORk8gIm1wZl9waHlzcHRyOiAleFxuIiwgbXBmLT5tcGZfcGh5c3B0cik7CiAKLQlpZiAobXBjX25ld19waHlzICYmIG1wYy0+bXBjX2xlbmd0aCA+IG1wY19uZXdfbGVuZ3RoKSB7CisJaWYgKG1wY19uZXdfcGh5cyAmJiBtcGMtPmxlbmd0aCA+IG1wY19uZXdfbGVuZ3RoKSB7CiAJCW1wY19uZXdfcGh5cyA9IDA7CiAJCXByaW50ayhLRVJOX0lORk8gIm1wY19uZXdfbGVuZ3RoIGlzICVsZCwgcGxlYXNlIHVzZSBhbGxvY19tcHRhYmxlPThrXG4iLAogCQkJIG1wY19uZXdfbGVuZ3RoKTsKQEAgLTEwNTAsMTAgKzEwMzcsMTAgQEAKIAlpZiAoIW1wY19uZXdfcGh5cykgewogCQl1bnNpZ25lZCBjaGFyIG9sZCwgbmV3OwogCQkvKiBjaGVjayBpZiB3ZSBjYW4gY2hhbmdlIHRoZSBwb3N0aW9uICovCi0JCW1wYy0+bXBjX2NoZWNrc3VtID0gMDsKLQkJb2xkID0gbXBmX2NoZWNrc3VtKCh1bnNpZ25lZCBjaGFyICopbXBjLCBtcGMtPm1wY19sZW5ndGgpOwotCQltcGMtPm1wY19jaGVja3N1bSA9IDB4ZmY7Ci0JCW5ldyA9IG1wZl9jaGVja3N1bSgodW5zaWduZWQgY2hhciAqKW1wYywgbXBjLT5tcGNfbGVuZ3RoKTsKKwkJbXBjLT5jaGVja3N1bSA9IDA7CisJCW9sZCA9IG1wZl9jaGVja3N1bSgodW5zaWduZWQgY2hhciAqKW1wYywgbXBjLT5sZW5ndGgpOworCQltcGMtPmNoZWNrc3VtID0gMHhmZjsKKwkJbmV3ID0gbXBmX2NoZWNrc3VtKCh1bnNpZ25lZCBjaGFyICopbXBjLCBtcGMtPmxlbmd0aCk7CiAJCWlmIChvbGQgPT0gbmV3KSB7CiAJCQlwcmludGsoS0VSTl9JTkZPICJtcGMgaXMgcmVhZG9ubHksIHBsZWFzZSB0cnkgYWxsb2NfbXB0YWJsZSBpbnN0ZWFkXG4iKTsKIAkJCXJldHVybiAwOwpAQCAtMTA2Miw3ICsxMDQ5LDcgQEAKIAl9IGVsc2UgewogCQltcGYtPm1wZl9waHlzcHRyID0gbXBjX25ld19waHlzOwogCQltcGNfbmV3ID0gcGh5c190b192aXJ0KG1wY19uZXdfcGh5cyk7Ci0JCW1lbWNweShtcGNfbmV3LCBtcGMsIG1wYy0+bXBjX2xlbmd0aCk7CisJCW1lbWNweShtcGNfbmV3LCBtcGMsIG1wYy0+bGVuZ3RoKTsKIAkJbXBjID0gbXBjX25ldzsKIAkJLyogY2hlY2sgaWYgd2UgY2FuIG1vZGlmeSB0aGF0ICovCiAJCWlmIChtcGNfbmV3X3BoeXMgLSBtcGYtPm1wZl9waHlzcHRyKSB7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvbm1pLmMgYi9hcmNoL3g4Ni9rZXJuZWwvbm1pLmMKaW5kZXggNDVhMDljYy4uNzIyODk3OSAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL25taS5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9ubWkuYwpAQCAtMjYsNyArMjYsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbF9zdGF0Lmg+CiAjaW5jbHVkZSA8bGludXgva2RlYnVnLmg+CiAjaW5jbHVkZSA8bGludXgvc21wLmg+Ci0jaW5jbHVkZSA8bGludXgvbm1pLmg+CiAKICNpbmNsdWRlIDxhc20vaTgyNTkuaD4KICNpbmNsdWRlIDxhc20vaW9fYXBpYy5oPgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL251bWFxXzMyLmMgYi9hcmNoL3g4Ni9rZXJuZWwvbnVtYXFfMzIuYwppbmRleCAwZGVlYTM3Li5mMjE5MWQ0IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvbnVtYXFfMzIuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvbnVtYXFfMzIuYwpAQCAtMTE3LDE2ICsxMTcsMTUgQEAKIH0KIAogLyogeDg2X3F1aXJrcyBtZW1iZXIgKi8KLXN0YXRpYyBpbnQgbXBjX2FwaWNfaWQoc3RydWN0IG1wY19jb25maWdfcHJvY2Vzc29yICptKQorc3RhdGljIGludCBtcGNfYXBpY19pZChzdHJ1Y3QgbXBjX2NwdSAqbSkKIHsKIAlpbnQgcXVhZCA9IHRyYW5zbGF0aW9uX3RhYmxlW21wY19yZWNvcmRdLT50cmFuc19xdWFkOwotCWludCBsb2dpY2FsX2FwaWNpZCA9IGdlbmVyYXRlX2xvZ2ljYWxfYXBpY2lkKHF1YWQsIG0tPm1wY19hcGljaWQpOworCWludCBsb2dpY2FsX2FwaWNpZCA9IGdlbmVyYXRlX2xvZ2ljYWxfYXBpY2lkKHF1YWQsIG0tPmFwaWNpZCk7CiAKIAlwcmludGsoS0VSTl9ERUJVRyAiUHJvY2Vzc29yICMlZCAldToldSBBUElDIHZlcnNpb24gJWQgKHF1YWQgJWQsIGFwaWMgJWQpXG4iLAotCSAgICAgICBtLT5tcGNfYXBpY2lkLAotCSAgICAgICAobS0+bXBjX2NwdWZlYXR1cmUgJiBDUFVfRkFNSUxZX01BU0spID4+IDgsCi0JICAgICAgIChtLT5tcGNfY3B1ZmVhdHVyZSAmIENQVV9NT0RFTF9NQVNLKSA+PiA0LAotCSAgICAgICBtLT5tcGNfYXBpY3ZlciwgcXVhZCwgbG9naWNhbF9hcGljaWQpOworCSAgICAgICBtLT5hcGljaWQsIChtLT5jcHVmZWF0dXJlICYgQ1BVX0ZBTUlMWV9NQVNLKSA+PiA4LAorCSAgICAgICAobS0+Y3B1ZmVhdHVyZSAmIENQVV9NT0RFTF9NQVNLKSA+PiA0LAorCSAgICAgICBtLT5hcGljdmVyLCBxdWFkLCBsb2dpY2FsX2FwaWNpZCk7CiAJcmV0dXJuIGxvZ2ljYWxfYXBpY2lkOwogfQogCkBAIC0xMzUsMjYgKzEzNCwyNiBAQAogaW50IG1wX2J1c19pZF90b19sb2NhbFtNQVhfTVBfQlVTU0VTXTsKIAogLyogeDg2X3F1aXJrcyBtZW1iZXIgKi8KLXN0YXRpYyB2b2lkIG1wY19vZW1fYnVzX2luZm8oc3RydWN0IG1wY19jb25maWdfYnVzICptLCBjaGFyICpuYW1lKQorc3RhdGljIHZvaWQgbXBjX29lbV9idXNfaW5mbyhzdHJ1Y3QgbXBjX2J1cyAqbSwgY2hhciAqbmFtZSkKIHsKIAlpbnQgcXVhZCA9IHRyYW5zbGF0aW9uX3RhYmxlW21wY19yZWNvcmRdLT50cmFuc19xdWFkOwogCWludCBsb2NhbCA9IHRyYW5zbGF0aW9uX3RhYmxlW21wY19yZWNvcmRdLT50cmFuc19sb2NhbDsKIAotCW1wX2J1c19pZF90b19ub2RlW20tPm1wY19idXNpZF0gPSBxdWFkOwotCW1wX2J1c19pZF90b19sb2NhbFttLT5tcGNfYnVzaWRdID0gbG9jYWw7CisJbXBfYnVzX2lkX3RvX25vZGVbbS0+YnVzaWRdID0gcXVhZDsKKwltcF9idXNfaWRfdG9fbG9jYWxbbS0+YnVzaWRdID0gbG9jYWw7CiAJcHJpbnRrKEtFUk5fSU5GTyAiQnVzICMlZCBpcyAlcyAobm9kZSAlZClcbiIsCi0JICAgICAgIG0tPm1wY19idXNpZCwgbmFtZSwgcXVhZCk7CisJICAgICAgIG0tPmJ1c2lkLCBuYW1lLCBxdWFkKTsKIH0KIAogaW50IHF1YWRfbG9jYWxfdG9fbXBfYnVzX2lkIFtOUl9DUFVTLzRdWzRdOwogCiAvKiB4ODZfcXVpcmtzIG1lbWJlciAqLwotc3RhdGljIHZvaWQgbXBjX29lbV9wY2lfYnVzKHN0cnVjdCBtcGNfY29uZmlnX2J1cyAqbSkKK3N0YXRpYyB2b2lkIG1wY19vZW1fcGNpX2J1cyhzdHJ1Y3QgbXBjX2J1cyAqbSkKIHsKIAlpbnQgcXVhZCA9IHRyYW5zbGF0aW9uX3RhYmxlW21wY19yZWNvcmRdLT50cmFuc19xdWFkOwogCWludCBsb2NhbCA9IHRyYW5zbGF0aW9uX3RhYmxlW21wY19yZWNvcmRdLT50cmFuc19sb2NhbDsKIAotCXF1YWRfbG9jYWxfdG9fbXBfYnVzX2lkW3F1YWRdW2xvY2FsXSA9IG0tPm1wY19idXNpZDsKKwlxdWFkX2xvY2FsX3RvX21wX2J1c19pZFtxdWFkXVtsb2NhbF0gPSBtLT5idXNpZDsKIH0KIAogc3RhdGljIHZvaWQgX19pbml0IE1QX3RyYW5zbGF0aW9uX2luZm8oc3RydWN0IG1wY19jb25maWdfdHJhbnNsYXRpb24gKm0pCkBAIC0xODYsNyArMTg1LDcgQEAKICAqIFJlYWQvcGFyc2UgdGhlIE1QQyBvZW0gdGFibGVzCiAgKi8KIAotc3RhdGljIHZvaWQgX19pbml0IHNtcF9yZWFkX21wY19vZW0oc3RydWN0IG1wX2NvbmZpZ19vZW10YWJsZSAqb2VtdGFibGUsCitzdGF0aWMgdm9pZCBfX2luaXQgc21wX3JlYWRfbXBjX29lbShzdHJ1Y3QgbXBjX29lbXRhYmxlICpvZW10YWJsZSwKIAkJCQkgICAgdW5zaWduZWQgc2hvcnQgb2Vtc2l6ZSkKIHsKIAlpbnQgY291bnQgPSBzaXplb2YoKm9lbXRhYmxlKTsJLyogdGhlIGhlYWRlciBzaXplICovCkBAIC0xOTUsMTggKzE5NCwxOCBAQAogCW1wY19yZWNvcmQgPSAwOwogCXByaW50ayhLRVJOX0lORk8gIkZvdW5kIGFuIE9FTSBNUEMgdGFibGUgYXQgJThwIC0gcGFyc2luZyBpdCAuLi4gXG4iLAogCSAgICAgICBvZW10YWJsZSk7Ci0JaWYgKG1lbWNtcChvZW10YWJsZS0+b2VtX3NpZ25hdHVyZSwgTVBDX09FTV9TSUdOQVRVUkUsIDQpKSB7CisJaWYgKG1lbWNtcChvZW10YWJsZS0+c2lnbmF0dXJlLCBNUENfT0VNX1NJR05BVFVSRSwgNCkpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORwogCQkgICAgICAgIlNNUCBtcGMgb2VtdGFibGU6IGJhZCBzaWduYXR1cmUgWyVjJWMlYyVjXSFcbiIsCi0JCSAgICAgICBvZW10YWJsZS0+b2VtX3NpZ25hdHVyZVswXSwgb2VtdGFibGUtPm9lbV9zaWduYXR1cmVbMV0sCi0JCSAgICAgICBvZW10YWJsZS0+b2VtX3NpZ25hdHVyZVsyXSwgb2VtdGFibGUtPm9lbV9zaWduYXR1cmVbM10pOworCQkgICAgICAgb2VtdGFibGUtPnNpZ25hdHVyZVswXSwgb2VtdGFibGUtPnNpZ25hdHVyZVsxXSwKKwkJICAgICAgIG9lbXRhYmxlLT5zaWduYXR1cmVbMl0sIG9lbXRhYmxlLT5zaWduYXR1cmVbM10pOwogCQlyZXR1cm47CiAJfQotCWlmIChtcGZfY2hlY2tzdW0oKHVuc2lnbmVkIGNoYXIgKilvZW10YWJsZSwgb2VtdGFibGUtPm9lbV9sZW5ndGgpKSB7CisJaWYgKG1wZl9jaGVja3N1bSgodW5zaWduZWQgY2hhciAqKW9lbXRhYmxlLCBvZW10YWJsZS0+bGVuZ3RoKSkgewogCQlwcmludGsoS0VSTl9XQVJOSU5HICJTTVAgb2VtIG1wdGFibGU6IGNoZWNrc3VtIGVycm9yIVxuIik7CiAJCXJldHVybjsKIAl9Ci0Jd2hpbGUgKGNvdW50IDwgb2VtdGFibGUtPm9lbV9sZW5ndGgpIHsKKwl3aGlsZSAoY291bnQgPCBvZW10YWJsZS0+bGVuZ3RoKSB7CiAJCXN3aXRjaCAoKm9lbXB0cikgewogCQljYXNlIE1QX1RSQU5TTEFUSU9OOgogCQkJewpAQCAtMjYwLDggKzI1OSw3IEBACiAJLnVwZGF0ZV9nZW5hcGljCQk9IG51bWFxX3VwZGF0ZV9nZW5hcGljLAogfTsKIAotdm9pZCBudW1hcV9tcHNfb2VtX2NoZWNrKHN0cnVjdCBtcF9jb25maWdfdGFibGUgKm1wYywgY2hhciAqb2VtLAotCQkJCSBjaGFyICpwcm9kdWN0aWQpCit2b2lkIG51bWFxX21wc19vZW1fY2hlY2soc3RydWN0IG1wY190YWJsZSAqbXBjLCBjaGFyICpvZW0sIGNoYXIgKnByb2R1Y3RpZCkKIHsKIAlpZiAoc3RybmNtcChvZW0sICJJQk0gTlVNQSIsIDgpKQogCQlwcmludGsoIldhcm5pbmchICBOb3QgYSBOVU1BLVEgc3lzdGVtIVxuIik7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvcGNpLWRtYS5jIGIvYXJjaC94ODYva2VybmVsL3BjaS1kbWEuYwppbmRleCAxOWExMDQ0Li5iMjU0Mjg1IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvcGNpLWRtYS5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9wY2ktZG1hLmMKQEAgLTM4LDcgKzM4LDcgQEAKICAgIGJlIHByb2JhYmx5IGEgc21hbGxlciBETUEgbWFzaywgYnV0IHRoaXMgaXMgYnVnLXRvLWJ1ZyBjb21wYXRpYmxlCiAgICB0byBvbGRlciBpMzg2LiAqLwogc3RydWN0IGRldmljZSB4ODZfZG1hX2ZhbGxiYWNrX2RldiA9IHsKLQkuYnVzX2lkID0gImZhbGxiYWNrIGRldmljZSIsCisJLmluaXRfbmFtZSA9ICJmYWxsYmFjayBkZXZpY2UiLAogCS5jb2hlcmVudF9kbWFfbWFzayA9IERNQV8zMkJJVF9NQVNLLAogCS5kbWFfbWFzayA9ICZ4ODZfZG1hX2ZhbGxiYWNrX2Rldi5jb2hlcmVudF9kbWFfbWFzaywKIH07CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvcHJvY2Vzc18zMi5jIGIvYXJjaC94ODYva2VybmVsL3Byb2Nlc3NfMzIuYwppbmRleCAzYmExNTVkLi5hNTQ2ZjU1IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvcHJvY2Vzc18zMi5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9wcm9jZXNzXzMyLmMKQEAgLTM5LDExICszOSwxMiBAQAogI2luY2x1ZGUgPGxpbnV4L3ByY3RsLmg+CiAjaW5jbHVkZSA8bGludXgvZG1pLmg+CiAjaW5jbHVkZSA8bGludXgvZnRyYWNlLmg+CisjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgva2RlYnVnLmg+CiAKLSNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9sZHQuaD4KICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CiAjaW5jbHVkZSA8YXNtL2kzODcuaD4KQEAgLTU2LDEwICs1Nyw4IEBACiAKICNpbmNsdWRlIDxhc20vdGxiZmx1c2guaD4KICNpbmNsdWRlIDxhc20vY3B1Lmg+Ci0jaW5jbHVkZSA8YXNtL2tkZWJ1Zy5oPgogI2luY2x1ZGUgPGFzbS9pZGxlLmg+CiAjaW5jbHVkZSA8YXNtL3N5c2NhbGxzLmg+Ci0jaW5jbHVkZSA8YXNtL3NtcC5oPgogI2luY2x1ZGUgPGFzbS9kcy5oPgogCiBhc21saW5rYWdlIHZvaWQgcmV0X2Zyb21fZm9yayh2b2lkKSBfX2FzbV9fKCJyZXRfZnJvbV9mb3JrIik7CkBAIC0yMDUsNyArMjA0LDcgQEAKIC8qCiAgKiBDcmVhdGUgYSBrZXJuZWwgdGhyZWFkCiAgKi8KLWludCBrZXJuZWxfdGhyZWFkKGludCAoKmZuKSh2b2lkICopLCB2b2lkICogYXJnLCB1bnNpZ25lZCBsb25nIGZsYWdzKQoraW50IGtlcm5lbF90aHJlYWQoaW50ICgqZm4pKHZvaWQgKiksIHZvaWQgKmFyZywgdW5zaWduZWQgbG9uZyBmbGFncykKIHsKIAlzdHJ1Y3QgcHRfcmVncyByZWdzOwogCkBAIC0yNjYsNyArMjY1LDcgQEAKIAl0c2stPnRocmVhZC5kZWJ1Z3JlZzMgPSAwOwogCXRzay0+dGhyZWFkLmRlYnVncmVnNiA9IDA7CiAJdHNrLT50aHJlYWQuZGVidWdyZWc3ID0gMDsKLQltZW1zZXQodHNrLT50aHJlYWQudGxzX2FycmF5LCAwLCBzaXplb2YodHNrLT50aHJlYWQudGxzX2FycmF5KSk7CQorCW1lbXNldCh0c2stPnRocmVhZC50bHNfYXJyYXksIDAsIHNpemVvZih0c2stPnRocmVhZC50bHNfYXJyYXkpKTsKIAljbGVhcl90c2tfdGhyZWFkX2ZsYWcodHNrLCBUSUZfREVCVUcpOwogCS8qCiAJICogRm9yZ2V0IGNvcHJvY2Vzc29yIHN0YXRlLi4KQEAgLTI5Myw5ICsyOTIsOSBAQAogCiBpbnQgY29weV90aHJlYWQoaW50IG5yLCB1bnNpZ25lZCBsb25nIGNsb25lX2ZsYWdzLCB1bnNpZ25lZCBsb25nIHNwLAogCXVuc2lnbmVkIGxvbmcgdW51c2VkLAotCXN0cnVjdCB0YXNrX3N0cnVjdCAqIHAsIHN0cnVjdCBwdF9yZWdzICogcmVncykKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewotCXN0cnVjdCBwdF9yZWdzICogY2hpbGRyZWdzOworCXN0cnVjdCBwdF9yZWdzICpjaGlsZHJlZ3M7CiAJc3RydWN0IHRhc2tfc3RydWN0ICp0c2s7CiAJaW50IGVycjsKIApAQCAtMzQ3LDcgKzM0Niw3IEBACiB2b2lkCiBzdGFydF90aHJlYWQoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHVuc2lnbmVkIGxvbmcgbmV3X2lwLCB1bnNpZ25lZCBsb25nIG5ld19zcCkKIHsKLQlfX2FzbV9fKCJtb3ZsICUwLCAlJWdzIiA6OiAiciIoMCkpOworCV9fYXNtX18oIm1vdmwgJTAsICUlZ3MiIDogOiAiciIoMCkpOwogCXJlZ3MtPmZzCQk9IDA7CiAJc2V0X2ZzKFVTRVJfRFMpOwogCXJlZ3MtPmRzCQk9IF9fVVNFUl9EUzsKQEAgLTYzOCw3ICs2MzcsNyBAQAogYXNtbGlua2FnZSBpbnQgc3lzX2V4ZWN2ZShzdHJ1Y3QgcHRfcmVncyByZWdzKQogewogCWludCBlcnJvcjsKLQljaGFyICogZmlsZW5hbWU7CisJY2hhciAqZmlsZW5hbWU7CiAKIAlmaWxlbmFtZSA9IGdldG5hbWUoKGNoYXIgX191c2VyICopIHJlZ3MuYngpOwogCWVycm9yID0gUFRSX0VSUihmaWxlbmFtZSk7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvc2V0dXBfcGVyY3B1LmMgYi9hcmNoL3g4Ni9rZXJuZWwvc2V0dXBfcGVyY3B1LmMKaW5kZXggYTRiNjE5Yy4uNTVjNDYwNyAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL3NldHVwX3BlcmNwdS5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9zZXR1cF9wZXJjcHUuYwpAQCAtNSwxMiArNSwxMSBAQAogI2luY2x1ZGUgPGxpbnV4L3BlcmNwdS5oPgogI2luY2x1ZGUgPGxpbnV4L2tleGVjLmg+CiAjaW5jbHVkZSA8bGludXgvY3Jhc2hfZHVtcC5oPgotI2luY2x1ZGUgPGFzbS9zbXAuaD4KLSNpbmNsdWRlIDxhc20vcGVyY3B1Lmg+CisjaW5jbHVkZSA8bGludXgvc21wLmg+CisjaW5jbHVkZSA8bGludXgvdG9wb2xvZ3kuaD4KICNpbmNsdWRlIDxhc20vc2VjdGlvbnMuaD4KICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CiAjaW5jbHVkZSA8YXNtL3NldHVwLmg+Ci0jaW5jbHVkZSA8YXNtL3RvcG9sb2d5Lmg+CiAjaW5jbHVkZSA8YXNtL21wc3BlYy5oPgogI2luY2x1ZGUgPGFzbS9hcGljZGVmLmg+CiAjaW5jbHVkZSA8YXNtL2hpZ2htZW0uaD4KQEAgLTIwLDggKzE5LDggQEAKIHVuc2lnbmVkIGRpc2FibGVkX2NwdXMgX19jcHVpbml0ZGF0YTsKIC8qIFByb2Nlc3NvciB0aGF0IGlzIGRvaW5nIHRoZSBib290IHVwICovCiB1bnNpZ25lZCBpbnQgYm9vdF9jcHVfcGh5c2ljYWxfYXBpY2lkID0gLTFVOwotdW5zaWduZWQgaW50IG1heF9waHlzaWNhbF9hcGljaWQ7CiBFWFBPUlRfU1lNQk9MKGJvb3RfY3B1X3BoeXNpY2FsX2FwaWNpZCk7Cit1bnNpZ25lZCBpbnQgbWF4X3BoeXNpY2FsX2FwaWNpZDsKIAogLyogQml0bWFzayBvZiBwaHlzaWNhbGx5IGV4aXN0aW5nIENQVXMgKi8KIHBoeXNpZF9tYXNrX3QgcGh5c19jcHVfcHJlc2VudF9tYXA7CkBAIC0xMzEsNyArMTMwLDI3IEBACiAJLyogcG9pbnQgdG8gbmV3IHBvaW50ZXIgdGFibGUgKi8KIAlfY3B1X3BkYSA9IG5ld19jcHVfcGRhOwogfQotI2VuZGlmCisKKyNlbmRpZiAvKiBDT05GSUdfU01QICYmIENPTkZJR19YODZfNjQgKi8KKworI2lmZGVmIENPTkZJR19YODZfNjQKKworLyogY29ycmVjdGx5IHNpemUgdGhlIGxvY2FsIGNwdSBtYXNrcyAqLworc3RhdGljIHZvaWQgc2V0dXBfY3B1X2xvY2FsX21hc2tzKHZvaWQpCit7CisJYWxsb2NfYm9vdG1lbV9jcHVtYXNrX3ZhcigmY3B1X2luaXRpYWxpemVkX21hc2spOworCWFsbG9jX2Jvb3RtZW1fY3B1bWFza192YXIoJmNwdV9jYWxsaW5fbWFzayk7CisJYWxsb2NfYm9vdG1lbV9jcHVtYXNrX3ZhcigmY3B1X2NhbGxvdXRfbWFzayk7CisJYWxsb2NfYm9vdG1lbV9jcHVtYXNrX3ZhcigmY3B1X3NpYmxpbmdfc2V0dXBfbWFzayk7Cit9CisKKyNlbHNlIC8qIENPTkZJR19YODZfMzIgKi8KKworc3RhdGljIGlubGluZSB2b2lkIHNldHVwX2NwdV9sb2NhbF9tYXNrcyh2b2lkKQoreworfQorCisjZW5kaWYgLyogQ09ORklHX1g4Nl8zMiAqLwogCiAvKgogICogR3JlYXQgZnV0dXJlIHBsYW46CkBAIC0xODcsNiArMjA2LDkgQEAKIAogCS8qIFNldHVwIG5vZGUgdG8gY3B1bWFzayBtYXAgKi8KIAlzZXR1cF9ub2RlX3RvX2NwdW1hc2tfbWFwKCk7CisKKwkvKiBTZXR1cCBjcHUgaW5pdGlhbGl6ZWQsIGNhbGxpbiwgY2FsbG91dCBtYXNrcyAqLworCXNldHVwX2NwdV9sb2NhbF9tYXNrcygpOwogfQogCiAjZW5kaWYKQEAgLTI4MCw4ICszMDIsOCBAQAogCiAJY3B1bGlzdF9zY25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgbWFzayk7CiAJcHJpbnRrKEtFUk5fREVCVUcgIiVzIGNwdSAlZCBub2RlICVkOiBtYXNrIG5vdyAlc1xuIiwKLQkJZW5hYmxlPyAibnVtYV9hZGRfY3B1IjoibnVtYV9yZW1vdmVfY3B1IiwgY3B1LCBub2RlLCBidWYpOwotIH0KKwkJZW5hYmxlID8gIm51bWFfYWRkX2NwdSIgOiAibnVtYV9yZW1vdmVfY3B1IiwgY3B1LCBub2RlLCBidWYpOworfQogCiB2b2lkIF9fY3B1aW5pdCBudW1hX2FkZF9jcHUoaW50IGNwdSkKIHsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9zbXAuYyBiL2FyY2gveDg2L2tlcm5lbC9zbXAuYwppbmRleCBiZWVhMjY0OWEuLmU2ZmFhMzMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9zbXAuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvc21wLmMKQEAgLTEsNyArMSw3IEBACiAvKgogICoJSW50ZWwgU01QIHN1cHBvcnQgcm91dGluZXMuCiAgKgotICoJKGMpIDE5OTUgQWxhbiBDb3gsIEJ1aWxkaW5nICMzIDxhbGFuQHJlZGhhdC5jb20+CisgKgkoYykgMTk5NSBBbGFuIENveCwgQnVpbGRpbmcgIzMgPGFsYW5AbHhvcmd1ay51a3V1Lm9yZy51az4KICAqCShjKSAxOTk4LTk5LCAyMDAwIEluZ28gTW9sbmFyIDxtaW5nb0ByZWRoYXQuY29tPgogICogICAgICAoYykgMjAwMiwyMDAzIEFuZGkgS2xlZW4sIFN1U0UgTGFicy4KICAqCkBAIC0xMjgsMTYgKzEyOCwyMyBAQAogCiB2b2lkIG5hdGl2ZV9zZW5kX2NhbGxfZnVuY19pcGkoY29uc3Qgc3RydWN0IGNwdW1hc2sgKm1hc2spCiB7Ci0JY3B1bWFza190IGFsbGJ1dHNlbGY7CisJY3B1bWFza192YXJfdCBhbGxidXRzZWxmOwogCi0JYWxsYnV0c2VsZiA9IGNwdV9vbmxpbmVfbWFwOwotCWNwdV9jbGVhcihzbXBfcHJvY2Vzc29yX2lkKCksIGFsbGJ1dHNlbGYpOworCWlmICghYWxsb2NfY3B1bWFza192YXIoJmFsbGJ1dHNlbGYsIEdGUF9BVE9NSUMpKSB7CisJCXNlbmRfSVBJX21hc2sobWFzaywgQ0FMTF9GVU5DVElPTl9WRUNUT1IpOworCQlyZXR1cm47CisJfQogCi0JaWYgKGNwdXNfZXF1YWwoKm1hc2ssIGFsbGJ1dHNlbGYpICYmCi0JICAgIGNwdXNfZXF1YWwoY3B1X29ubGluZV9tYXAsIGNwdV9jYWxsb3V0X21hcCkpCisJY3B1bWFza19jb3B5KGFsbGJ1dHNlbGYsIGNwdV9vbmxpbmVfbWFzayk7CisJY3B1bWFza19jbGVhcl9jcHUoc21wX3Byb2Nlc3Nvcl9pZCgpLCBhbGxidXRzZWxmKTsKKworCWlmIChjcHVtYXNrX2VxdWFsKG1hc2ssIGFsbGJ1dHNlbGYpICYmCisJICAgIGNwdW1hc2tfZXF1YWwoY3B1X29ubGluZV9tYXNrLCBjcHVfY2FsbG91dF9tYXNrKSkKIAkJc2VuZF9JUElfYWxsYnV0c2VsZihDQUxMX0ZVTkNUSU9OX1ZFQ1RPUik7CiAJZWxzZQogCQlzZW5kX0lQSV9tYXNrKG1hc2ssIENBTExfRlVOQ1RJT05fVkVDVE9SKTsKKworCWZyZWVfY3B1bWFza192YXIoYWxsYnV0c2VsZik7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvc21wYm9vdC5jIGIvYXJjaC94ODYva2VybmVsL3NtcGJvb3QuYwppbmRleCA2YmQ0ZDliLi5iYjFhM2IxIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvc21wYm9vdC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9zbXBib290LmMKQEAgLTEsNyArMSw3IEBACiAvKgogICoJeDg2IFNNUCBib290aW5nIGZ1bmN0aW9ucwogICoKLSAqCShjKSAxOTk1IEFsYW4gQ294LCBCdWlsZGluZyAjMyA8YWxhbkByZWRoYXQuY29tPgorICoJKGMpIDE5OTUgQWxhbiBDb3gsIEJ1aWxkaW5nICMzIDxhbGFuQGx4b3JndWsudWt1dS5vcmcudWs+CiAgKgkoYykgMTk5OCwgMTk5OSwgMjAwMCBJbmdvIE1vbG5hciA8bWluZ29AcmVkaGF0LmNvbT4KICAqCUNvcHlyaWdodCAyMDAxIEFuZGkgS2xlZW4sIFN1U0UgTGFicy4KICAqCkBAIC0xMDIsOSArMTAyLDYgQEAKIC8qIExhc3QgbGV2ZWwgY2FjaGUgSUQgb2YgZWFjaCBsb2dpY2FsIENQVSAqLwogREVGSU5FX1BFUl9DUFUodTE2LCBjcHVfbGxjX2lkKSA9IEJBRF9BUElDSUQ7CiAKLWNwdW1hc2tfdCBjcHVfY2FsbGluX21hcDsKLWNwdW1hc2tfdCBjcHVfY2FsbG91dF9tYXA7Ci0KIC8qIHJlcHJlc2VudGluZyBIVCBzaWJsaW5ncyBvZiBlYWNoIGxvZ2ljYWwgQ1BVICovCiBERUZJTkVfUEVSX0NQVShjcHVtYXNrX3QsIGNwdV9zaWJsaW5nX21hcCk7CiBFWFBPUlRfUEVSX0NQVV9TWU1CT0woY3B1X3NpYmxpbmdfbWFwKTsKQEAgLTEyMCw5ICsxMTcsNiBAQAogc3RhdGljIGF0b21pY190IGluaXRfZGVhc3NlcnRlZDsKIAogCi0vKiByZXByZXNlbnRpbmcgY3B1cyBmb3Igd2hpY2ggc2libGluZyBtYXBzIGNhbiBiZSBjb21wdXRlZCAqLwotc3RhdGljIGNwdW1hc2tfdCBjcHVfc2libGluZ19zZXR1cF9tYXA7Ci0KIC8qIFNldCBpZiB3ZSBmaW5kIGEgQiBzdGVwcGluZyBDUFUgKi8KIHN0YXRpYyBpbnQgX19jcHVpbml0ZGF0YSBzbXBfYl9zdGVwcGluZzsKIApAQCAtMTQwLDcgKzEzNCw3IEBACiBzdGF0aWMgdm9pZCBtYXBfY3B1X3RvX25vZGUoaW50IGNwdSwgaW50IG5vZGUpCiB7CiAJcHJpbnRrKEtFUk5fSU5GTyAiTWFwcGluZyBjcHUgJWQgdG8gbm9kZSAlZFxuIiwgY3B1LCBub2RlKTsKLQljcHVfc2V0KGNwdSwgbm9kZV90b19jcHVtYXNrX21hcFtub2RlXSk7CisJY3B1bWFza19zZXRfY3B1KGNwdSwgJm5vZGVfdG9fY3B1bWFza19tYXBbbm9kZV0pOwogCWNwdV90b19ub2RlX21hcFtjcHVdID0gbm9kZTsKIH0KIApAQCAtMTUxLDcgKzE0NSw3IEBACiAKIAlwcmludGsoS0VSTl9JTkZPICJVbm1hcHBpbmcgY3B1ICVkIGZyb20gYWxsIG5vZGVzXG4iLCBjcHUpOwogCWZvciAobm9kZSA9IDA7IG5vZGUgPCBNQVhfTlVNTk9ERVM7IG5vZGUrKykKLQkJY3B1X2NsZWFyKGNwdSwgbm9kZV90b19jcHVtYXNrX21hcFtub2RlXSk7CisJCWNwdW1hc2tfY2xlYXJfY3B1KGNwdSwgJm5vZGVfdG9fY3B1bWFza19tYXBbbm9kZV0pOwogCWNwdV90b19ub2RlX21hcFtjcHVdID0gMDsKIH0KICNlbHNlIC8qICEoQ09ORklHX05VTUEgJiYgQ09ORklHX1g4Nl8zMikgKi8KQEAgLTIwOSw3ICsyMDMsNyBAQAogCSAqLwogCXBoeXNfaWQgPSByZWFkX2FwaWNfaWQoKTsKIAljcHVpZCA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKLQlpZiAoY3B1X2lzc2V0KGNwdWlkLCBjcHVfY2FsbGluX21hcCkpIHsKKwlpZiAoY3B1bWFza190ZXN0X2NwdShjcHVpZCwgY3B1X2NhbGxpbl9tYXNrKSkgewogCQlwYW5pYygiJXM6IHBoeXMgQ1BVIyVkLCBDUFUjJWQgYWxyZWFkeSBwcmVzZW50Pz9cbiIsIF9fZnVuY19fLAogCQkJCQlwaHlzX2lkLCBjcHVpZCk7CiAJfQpAQCAtMjMxLDcgKzIyNSw3IEBACiAJCS8qCiAJCSAqIEhhcyB0aGUgYm9vdCBDUFUgZmluaXNoZWQgaXQncyBTVEFSVFVQIHNlcXVlbmNlPwogCQkgKi8KLQkJaWYgKGNwdV9pc3NldChjcHVpZCwgY3B1X2NhbGxvdXRfbWFwKSkKKwkJaWYgKGNwdW1hc2tfdGVzdF9jcHUoY3B1aWQsIGNwdV9jYWxsb3V0X21hc2spKQogCQkJYnJlYWs7CiAJCWNwdV9yZWxheCgpOwogCX0KQEAgLTI3NCw3ICsyNjgsNyBAQAogCS8qCiAJICogQWxsb3cgdGhlIG1hc3RlciB0byBjb250aW51ZS4KIAkgKi8KLQljcHVfc2V0KGNwdWlkLCBjcHVfY2FsbGluX21hcCk7CisJY3B1bWFza19zZXRfY3B1KGNwdWlkLCBjcHVfY2FsbGluX21hc2spOwogfQogCiBzdGF0aWMgaW50IF9fY3B1aW5pdGRhdGEgdW5zYWZlX3NtcDsKQEAgLTMzMiw3ICszMjYsNyBAQAogCWlwaV9jYWxsX2xvY2soKTsKIAlsb2NrX3ZlY3Rvcl9sb2NrKCk7CiAJX19zZXR1cF92ZWN0b3JfaXJxKHNtcF9wcm9jZXNzb3JfaWQoKSk7Ci0JY3B1X3NldChzbXBfcHJvY2Vzc29yX2lkKCksIGNwdV9vbmxpbmVfbWFwKTsKKwlzZXRfY3B1X29ubGluZShzbXBfcHJvY2Vzc29yX2lkKCksIHRydWUpOwogCXVubG9ja192ZWN0b3JfbG9jaygpOwogCWlwaV9jYWxsX3VubG9jaygpOwogCXBlcl9jcHUoY3B1X3N0YXRlLCBzbXBfcHJvY2Vzc29yX2lkKCkpID0gQ1BVX09OTElORTsKQEAgLTQzOCw1MCArNDMyLDUyIEBACiAJaW50IGk7CiAJc3RydWN0IGNwdWluZm9feDg2ICpjID0gJmNwdV9kYXRhKGNwdSk7CiAKLQljcHVfc2V0KGNwdSwgY3B1X3NpYmxpbmdfc2V0dXBfbWFwKTsKKwljcHVtYXNrX3NldF9jcHUoY3B1LCBjcHVfc2libGluZ19zZXR1cF9tYXNrKTsKIAogCWlmIChzbXBfbnVtX3NpYmxpbmdzID4gMSkgewotCQlmb3JfZWFjaF9jcHVfbWFza19ucihpLCBjcHVfc2libGluZ19zZXR1cF9tYXApIHsKLQkJCWlmIChjLT5waHlzX3Byb2NfaWQgPT0gY3B1X2RhdGEoaSkucGh5c19wcm9jX2lkICYmCi0JCQkgICAgYy0+Y3B1X2NvcmVfaWQgPT0gY3B1X2RhdGEoaSkuY3B1X2NvcmVfaWQpIHsKLQkJCQljcHVfc2V0KGksIHBlcl9jcHUoY3B1X3NpYmxpbmdfbWFwLCBjcHUpKTsKLQkJCQljcHVfc2V0KGNwdSwgcGVyX2NwdShjcHVfc2libGluZ19tYXAsIGkpKTsKLQkJCQljcHVfc2V0KGksIHBlcl9jcHUoY3B1X2NvcmVfbWFwLCBjcHUpKTsKLQkJCQljcHVfc2V0KGNwdSwgcGVyX2NwdShjcHVfY29yZV9tYXAsIGkpKTsKLQkJCQljcHVfc2V0KGksIGMtPmxsY19zaGFyZWRfbWFwKTsKLQkJCQljcHVfc2V0KGNwdSwgY3B1X2RhdGEoaSkubGxjX3NoYXJlZF9tYXApOworCQlmb3JfZWFjaF9jcHUoaSwgY3B1X3NpYmxpbmdfc2V0dXBfbWFzaykgeworCQkJc3RydWN0IGNwdWluZm9feDg2ICpvID0gJmNwdV9kYXRhKGkpOworCisJCQlpZiAoYy0+cGh5c19wcm9jX2lkID09IG8tPnBoeXNfcHJvY19pZCAmJgorCQkJICAgIGMtPmNwdV9jb3JlX2lkID09IG8tPmNwdV9jb3JlX2lkKSB7CisJCQkJY3B1bWFza19zZXRfY3B1KGksIGNwdV9zaWJsaW5nX21hc2soY3B1KSk7CisJCQkJY3B1bWFza19zZXRfY3B1KGNwdSwgY3B1X3NpYmxpbmdfbWFzayhpKSk7CisJCQkJY3B1bWFza19zZXRfY3B1KGksIGNwdV9jb3JlX21hc2soY3B1KSk7CisJCQkJY3B1bWFza19zZXRfY3B1KGNwdSwgY3B1X2NvcmVfbWFzayhpKSk7CisJCQkJY3B1bWFza19zZXRfY3B1KGksICZjLT5sbGNfc2hhcmVkX21hcCk7CisJCQkJY3B1bWFza19zZXRfY3B1KGNwdSwgJm8tPmxsY19zaGFyZWRfbWFwKTsKIAkJCX0KIAkJfQogCX0gZWxzZSB7Ci0JCWNwdV9zZXQoY3B1LCBwZXJfY3B1KGNwdV9zaWJsaW5nX21hcCwgY3B1KSk7CisJCWNwdW1hc2tfc2V0X2NwdShjcHUsIGNwdV9zaWJsaW5nX21hc2soY3B1KSk7CiAJfQogCi0JY3B1X3NldChjcHUsIGMtPmxsY19zaGFyZWRfbWFwKTsKKwljcHVtYXNrX3NldF9jcHUoY3B1LCAmYy0+bGxjX3NoYXJlZF9tYXApOwogCiAJaWYgKGN1cnJlbnRfY3B1X2RhdGEueDg2X21heF9jb3JlcyA9PSAxKSB7Ci0JCXBlcl9jcHUoY3B1X2NvcmVfbWFwLCBjcHUpID0gcGVyX2NwdShjcHVfc2libGluZ19tYXAsIGNwdSk7CisJCWNwdW1hc2tfY29weShjcHVfY29yZV9tYXNrKGNwdSksIGNwdV9zaWJsaW5nX21hc2soY3B1KSk7CiAJCWMtPmJvb3RlZF9jb3JlcyA9IDE7CiAJCXJldHVybjsKIAl9CiAKLQlmb3JfZWFjaF9jcHVfbWFza19ucihpLCBjcHVfc2libGluZ19zZXR1cF9tYXApIHsKKwlmb3JfZWFjaF9jcHUoaSwgY3B1X3NpYmxpbmdfc2V0dXBfbWFzaykgewogCQlpZiAocGVyX2NwdShjcHVfbGxjX2lkLCBjcHUpICE9IEJBRF9BUElDSUQgJiYKIAkJICAgIHBlcl9jcHUoY3B1X2xsY19pZCwgY3B1KSA9PSBwZXJfY3B1KGNwdV9sbGNfaWQsIGkpKSB7Ci0JCQljcHVfc2V0KGksIGMtPmxsY19zaGFyZWRfbWFwKTsKLQkJCWNwdV9zZXQoY3B1LCBjcHVfZGF0YShpKS5sbGNfc2hhcmVkX21hcCk7CisJCQljcHVtYXNrX3NldF9jcHUoaSwgJmMtPmxsY19zaGFyZWRfbWFwKTsKKwkJCWNwdW1hc2tfc2V0X2NwdShjcHUsICZjcHVfZGF0YShpKS5sbGNfc2hhcmVkX21hcCk7CiAJCX0KIAkJaWYgKGMtPnBoeXNfcHJvY19pZCA9PSBjcHVfZGF0YShpKS5waHlzX3Byb2NfaWQpIHsKLQkJCWNwdV9zZXQoaSwgcGVyX2NwdShjcHVfY29yZV9tYXAsIGNwdSkpOwotCQkJY3B1X3NldChjcHUsIHBlcl9jcHUoY3B1X2NvcmVfbWFwLCBpKSk7CisJCQljcHVtYXNrX3NldF9jcHUoaSwgY3B1X2NvcmVfbWFzayhjcHUpKTsKKwkJCWNwdW1hc2tfc2V0X2NwdShjcHUsIGNwdV9jb3JlX21hc2soaSkpOwogCQkJLyoKIAkJCSAqICBEb2VzIHRoaXMgbmV3IGNwdSBicmluZ3VwIGEgbmV3IGNvcmU/CiAJCQkgKi8KLQkJCWlmIChjcHVzX3dlaWdodChwZXJfY3B1KGNwdV9zaWJsaW5nX21hcCwgY3B1KSkgPT0gMSkgeworCQkJaWYgKGNwdW1hc2tfd2VpZ2h0KGNwdV9zaWJsaW5nX21hc2soY3B1KSkgPT0gMSkgewogCQkJCS8qCiAJCQkJICogZm9yIGVhY2ggY29yZSBpbiBwYWNrYWdlLCBpbmNyZW1lbnQKIAkJCQkgKiB0aGUgYm9vdGVkX2NvcmVzIGZvciB0aGlzIG5ldyBjcHUKIAkJCQkgKi8KLQkJCQlpZiAoZmlyc3RfY3B1KHBlcl9jcHUoY3B1X3NpYmxpbmdfbWFwLCBpKSkgPT0gaSkKKwkJCQlpZiAoY3B1bWFza19maXJzdChjcHVfc2libGluZ19tYXNrKGkpKSA9PSBpKQogCQkJCQljLT5ib290ZWRfY29yZXMrKzsKIAkJCQkvKgogCQkJCSAqIGluY3JlbWVudCB0aGUgY29yZSBjb3VudCBmb3IgYWxsCkBAIC01MDQsNyArNTAwLDcgQEAKIAkgKiBBbmQgZm9yIHBvd2VyIHNhdmluZ3MsIHdlIHJldHVybiBjcHVfY29yZV9tYXAKIAkgKi8KIAlpZiAoc2NoZWRfbWNfcG93ZXJfc2F2aW5ncyB8fCBzY2hlZF9zbXRfcG93ZXJfc2F2aW5ncykKLQkJcmV0dXJuICZwZXJfY3B1KGNwdV9jb3JlX21hcCwgY3B1KTsKKwkJcmV0dXJuIGNwdV9jb3JlX21hc2soY3B1KTsKIAllbHNlCiAJCXJldHVybiAmYy0+bGxjX3NoYXJlZF9tYXA7CiB9CkBAIC01MjMsNyArNTE5LDcgQEAKIAkgKi8KIAlwcl9kZWJ1ZygiQmVmb3JlIGJvZ29taXBzLlxuIik7CiAJZm9yX2VhY2hfcG9zc2libGVfY3B1KGNwdSkKLQkJaWYgKGNwdV9pc3NldChjcHUsIGNwdV9jYWxsb3V0X21hcCkpCisJCWlmIChjcHVtYXNrX3Rlc3RfY3B1KGNwdSwgY3B1X2NhbGxvdXRfbWFzaykpCiAJCQlib2dvc3VtICs9IGNwdV9kYXRhKGNwdSkubG9vcHNfcGVyX2ppZmZ5OwogCXByaW50ayhLRVJOX0lORk8KIAkJIlRvdGFsIG9mICVkIHByb2Nlc3NvcnMgYWN0aXZhdGVkICglbHUuJTAybHUgQm9nb01JUFMpLlxuIiwKQEAgLTkwNCwxOSArOTAwLDE5IEBACiAJCSAqIGFsbG93IEFQcyB0byBzdGFydCBpbml0aWFsaXppbmcuCiAJCSAqLwogCQlwcl9kZWJ1ZygiQmVmb3JlIENhbGxvdXQgJWQuXG4iLCBjcHUpOwotCQljcHVfc2V0KGNwdSwgY3B1X2NhbGxvdXRfbWFwKTsKKwkJY3B1bWFza19zZXRfY3B1KGNwdSwgY3B1X2NhbGxvdXRfbWFzayk7CiAJCXByX2RlYnVnKCJBZnRlciBDYWxsb3V0ICVkLlxuIiwgY3B1KTsKIAogCQkvKgogCQkgKiBXYWl0IDVzIHRvdGFsIGZvciBhIHJlc3BvbnNlCiAJCSAqLwogCQlmb3IgKHRpbWVvdXQgPSAwOyB0aW1lb3V0IDwgNTAwMDA7IHRpbWVvdXQrKykgewotCQkJaWYgKGNwdV9pc3NldChjcHUsIGNwdV9jYWxsaW5fbWFwKSkKKwkJCWlmIChjcHVtYXNrX3Rlc3RfY3B1KGNwdSwgY3B1X2NhbGxpbl9tYXNrKSkKIAkJCQlicmVhazsJLyogSXQgaGFzIGJvb3RlZCAqLwogCQkJdWRlbGF5KDEwMCk7CiAJCX0KIAotCQlpZiAoY3B1X2lzc2V0KGNwdSwgY3B1X2NhbGxpbl9tYXApKSB7CisJCWlmIChjcHVtYXNrX3Rlc3RfY3B1KGNwdSwgY3B1X2NhbGxpbl9tYXNrKSkgewogCQkJLyogbnVtYmVyIENQVXMgbG9naWNhbGx5LCBzdGFydGluZyBmcm9tIDEgKEJTUCBpcyAwKSAqLwogCQkJcHJfZGVidWcoIk9LLlxuIik7CiAJCQlwcmludGsoS0VSTl9JTkZPICJDUFUlZDogIiwgY3B1KTsKQEAgLTk0MSw5ICs5MzcsMTQgQEAKIAlpZiAoYm9vdF9lcnJvcikgewogCQkvKiBUcnkgdG8gcHV0IHRoaW5ncyBiYWNrIHRoZSB3YXkgdGhleSB3ZXJlIGJlZm9yZSAuLi4gKi8KIAkJbnVtYV9yZW1vdmVfY3B1KGNwdSk7IC8qIHdhcyBzZXQgYnkgbnVtYV9hZGRfY3B1ICovCi0JCWNwdV9jbGVhcihjcHUsIGNwdV9jYWxsb3V0X21hcCk7IC8qIHdhcyBzZXQgYnkgZG9fYm9vdF9jcHUoKSAqLwotCQljcHVfY2xlYXIoY3B1LCBjcHVfaW5pdGlhbGl6ZWQpOyAvKiB3YXMgc2V0IGJ5IGNwdV9pbml0KCkgKi8KLQkJY3B1X2NsZWFyKGNwdSwgY3B1X3ByZXNlbnRfbWFwKTsKKworCQkvKiB3YXMgc2V0IGJ5IGRvX2Jvb3RfY3B1KCkgKi8KKwkJY3B1bWFza19jbGVhcl9jcHUoY3B1LCBjcHVfY2FsbG91dF9tYXNrKTsKKworCQkvKiB3YXMgc2V0IGJ5IGNwdV9pbml0KCkgKi8KKwkJY3B1bWFza19jbGVhcl9jcHUoY3B1LCBjcHVfaW5pdGlhbGl6ZWRfbWFzayk7CisKKwkJc2V0X2NwdV9wcmVzZW50KGNwdSwgZmFsc2UpOwogCQlwZXJfY3B1KHg4Nl9jcHVfdG9fYXBpY2lkLCBjcHUpID0gQkFEX0FQSUNJRDsKIAl9CiAKQEAgLTk3Nyw3ICs5NzgsNyBAQAogCS8qCiAJICogQWxyZWFkeSBib290ZWQgQ1BVPwogCSAqLwotCWlmIChjcHVfaXNzZXQoY3B1LCBjcHVfY2FsbGluX21hcCkpIHsKKwlpZiAoY3B1bWFza190ZXN0X2NwdShjcHUsIGNwdV9jYWxsaW5fbWFzaykpIHsKIAkJcHJfZGVidWcoImRvX2Jvb3RfY3B1ICVkIEFscmVhZHkgc3RhcnRlZFxuIiwgY3B1KTsKIAkJcmV0dXJuIC1FTk9TWVM7CiAJfQpAQCAtMTAzMiw4ICsxMDMzLDkgQEAKICAqLwogc3RhdGljIF9faW5pdCB2b2lkIGRpc2FibGVfc21wKHZvaWQpCiB7Ci0JY3B1X3ByZXNlbnRfbWFwID0gY3B1bWFza19vZl9jcHUoMCk7Ci0JY3B1X3Bvc3NpYmxlX21hcCA9IGNwdW1hc2tfb2ZfY3B1KDApOworCS8qIHVzZSB0aGUgcmVhZC93cml0ZSBwb2ludGVycyB0byB0aGUgcHJlc2VudCBhbmQgcG9zc2libGUgbWFwcyAqLworCWNwdW1hc2tfY29weSgmY3B1X3ByZXNlbnRfbWFwLCBjcHVtYXNrX29mKDApKTsKKwljcHVtYXNrX2NvcHkoJmNwdV9wb3NzaWJsZV9tYXAsIGNwdW1hc2tfb2YoMCkpOwogCXNtcGJvb3RfY2xlYXJfaW9fYXBpY19pcnFzKCk7CiAKIAlpZiAoc21wX2ZvdW5kX2NvbmZpZykKQEAgLTEwNDEsOCArMTA0Myw4IEBACiAJZWxzZQogCQlwaHlzaWRfc2V0X21hc2tfb2ZfcGh5c2lkKDAsICZwaHlzX2NwdV9wcmVzZW50X21hcCk7CiAJbWFwX2NwdV90b19sb2dpY2FsX2FwaWNpZCgpOwotCWNwdV9zZXQoMCwgcGVyX2NwdShjcHVfc2libGluZ19tYXAsIDApKTsKLQljcHVfc2V0KDAsIHBlcl9jcHUoY3B1X2NvcmVfbWFwLCAwKSk7CisJY3B1bWFza19zZXRfY3B1KDAsIGNwdV9zaWJsaW5nX21hc2soMCkpOworCWNwdW1hc2tfc2V0X2NwdSgwLCBjcHVfY29yZV9tYXNrKDApKTsKIH0KIAogLyoKQEAgLTEwNjQsMTQgKzEwNjYsMTQgQEAKIAkJbnIgPSAwOwogCQlmb3JfZWFjaF9wcmVzZW50X2NwdShjcHUpIHsKIAkJCWlmIChuciA+PSA4KQotCQkJCWNwdV9jbGVhcihjcHUsIGNwdV9wcmVzZW50X21hcCk7CisJCQkJc2V0X2NwdV9wcmVzZW50KGNwdSwgZmFsc2UpOwogCQkJbnIrKzsKIAkJfQogCiAJCW5yID0gMDsKIAkJZm9yX2VhY2hfcG9zc2libGVfY3B1KGNwdSkgewogCQkJaWYgKG5yID49IDgpCi0JCQkJY3B1X2NsZWFyKGNwdSwgY3B1X3Bvc3NpYmxlX21hcCk7CisJCQkJc2V0X2NwdV9wb3NzaWJsZShjcHUsIGZhbHNlKTsKIAkJCW5yKys7CiAJCX0KIApAQCAtMTE2Nyw3ICsxMTY5LDcgQEAKIAlwcmVlbXB0X2Rpc2FibGUoKTsKIAlzbXBfY3B1X2luZGV4X2RlZmF1bHQoKTsKIAljdXJyZW50X2NwdV9kYXRhID0gYm9vdF9jcHVfZGF0YTsKLQljcHVfY2FsbGluX21hcCA9IGNwdW1hc2tfb2ZfY3B1KDApOworCWNwdW1hc2tfY29weShjcHVfY2FsbGluX21hc2ssIGNwdW1hc2tfb2YoMCkpOwogCW1iKCk7CiAJLyoKIAkgKiBTZXR1cCBib290IENQVSBpbmZvcm1hdGlvbgpAQCAtMTI0Miw4ICsxMjQ0LDggQEAKIAlpbml0X2dkdChtZSk7CiAjZW5kaWYKIAlzd2l0Y2hfdG9fbmV3X2dkdCgpOwotCS8qIGFscmVhZHkgc2V0IG1lIGluIGNwdV9vbmxpbmVfbWFwIGluIGJvb3RfY3B1X2luaXQoKSAqLwotCWNwdV9zZXQobWUsIGNwdV9jYWxsb3V0X21hcCk7CisJLyogYWxyZWFkeSBzZXQgbWUgaW4gY3B1X29ubGluZV9tYXNrIGluIGJvb3RfY3B1X2luaXQoKSAqLworCWNwdW1hc2tfc2V0X2NwdShtZSwgY3B1X2NhbGxvdXRfbWFzayk7CiAJcGVyX2NwdShjcHVfc3RhdGUsIG1lKSA9IENQVV9PTkxJTkU7CiB9CiAKQEAgLTEzMTEsNyArMTMxMyw3IEBACiAJCXBvc3NpYmxlLCBtYXhfdChpbnQsIHBvc3NpYmxlIC0gbnVtX3Byb2Nlc3NvcnMsIDApKTsKIAogCWZvciAoaSA9IDA7IGkgPCBwb3NzaWJsZTsgaSsrKQotCQljcHVfc2V0KGksIGNwdV9wb3NzaWJsZV9tYXApOworCQlzZXRfY3B1X3Bvc3NpYmxlKGksIHRydWUpOwogCiAJbnJfY3B1X2lkcyA9IHBvc3NpYmxlOwogfQpAQCAtMTMyMywzMSArMTMyNSwzMSBAQAogCWludCBzaWJsaW5nOwogCXN0cnVjdCBjcHVpbmZvX3g4NiAqYyA9ICZjcHVfZGF0YShjcHUpOwogCi0JZm9yX2VhY2hfY3B1X21hc2tfbnIoc2libGluZywgcGVyX2NwdShjcHVfY29yZV9tYXAsIGNwdSkpIHsKLQkJY3B1X2NsZWFyKGNwdSwgcGVyX2NwdShjcHVfY29yZV9tYXAsIHNpYmxpbmcpKTsKKwlmb3JfZWFjaF9jcHUoc2libGluZywgY3B1X2NvcmVfbWFzayhjcHUpKSB7CisJCWNwdW1hc2tfY2xlYXJfY3B1KGNwdSwgY3B1X2NvcmVfbWFzayhzaWJsaW5nKSk7CiAJCS8qLwogCQkgKiBsYXN0IHRocmVhZCBzaWJsaW5nIGluIHRoaXMgY3B1IGNvcmUgZ29pbmcgZG93bgogCQkgKi8KLQkJaWYgKGNwdXNfd2VpZ2h0KHBlcl9jcHUoY3B1X3NpYmxpbmdfbWFwLCBjcHUpKSA9PSAxKQorCQlpZiAoY3B1bWFza193ZWlnaHQoY3B1X3NpYmxpbmdfbWFzayhjcHUpKSA9PSAxKQogCQkJY3B1X2RhdGEoc2libGluZykuYm9vdGVkX2NvcmVzLS07CiAJfQogCi0JZm9yX2VhY2hfY3B1X21hc2tfbnIoc2libGluZywgcGVyX2NwdShjcHVfc2libGluZ19tYXAsIGNwdSkpCi0JCWNwdV9jbGVhcihjcHUsIHBlcl9jcHUoY3B1X3NpYmxpbmdfbWFwLCBzaWJsaW5nKSk7Ci0JY3B1c19jbGVhcihwZXJfY3B1KGNwdV9zaWJsaW5nX21hcCwgY3B1KSk7Ci0JY3B1c19jbGVhcihwZXJfY3B1KGNwdV9jb3JlX21hcCwgY3B1KSk7CisJZm9yX2VhY2hfY3B1KHNpYmxpbmcsIGNwdV9zaWJsaW5nX21hc2soY3B1KSkKKwkJY3B1bWFza19jbGVhcl9jcHUoY3B1LCBjcHVfc2libGluZ19tYXNrKHNpYmxpbmcpKTsKKwljcHVtYXNrX2NsZWFyKGNwdV9zaWJsaW5nX21hc2soY3B1KSk7CisJY3B1bWFza19jbGVhcihjcHVfY29yZV9tYXNrKGNwdSkpOwogCWMtPnBoeXNfcHJvY19pZCA9IDA7CiAJYy0+Y3B1X2NvcmVfaWQgPSAwOwotCWNwdV9jbGVhcihjcHUsIGNwdV9zaWJsaW5nX3NldHVwX21hcCk7CisJY3B1bWFza19jbGVhcl9jcHUoY3B1LCBjcHVfc2libGluZ19zZXR1cF9tYXNrKTsKIH0KIAogc3RhdGljIHZvaWQgX19yZWYgcmVtb3ZlX2NwdV9mcm9tX21hcHMoaW50IGNwdSkKIHsKLQljcHVfY2xlYXIoY3B1LCBjcHVfb25saW5lX21hcCk7Ci0JY3B1X2NsZWFyKGNwdSwgY3B1X2NhbGxvdXRfbWFwKTsKLQljcHVfY2xlYXIoY3B1LCBjcHVfY2FsbGluX21hcCk7CisJc2V0X2NwdV9vbmxpbmUoY3B1LCBmYWxzZSk7CisJY3B1bWFza19jbGVhcl9jcHUoY3B1LCBjcHVfY2FsbG91dF9tYXNrKTsKKwljcHVtYXNrX2NsZWFyX2NwdShjcHUsIGNwdV9jYWxsaW5fbWFzayk7CiAJLyogd2FzIHNldCBieSBjcHVfaW5pdCgpICovCi0JY3B1X2NsZWFyKGNwdSwgY3B1X2luaXRpYWxpemVkKTsKKwljcHVtYXNrX2NsZWFyX2NwdShjcHUsIGNwdV9pbml0aWFsaXplZF9tYXNrKTsKIAludW1hX3JlbW92ZV9jcHUoY3B1KTsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL3N5c2NhbGxfdGFibGVfMzIuUyBiL2FyY2gveDg2L2tlcm5lbC9zeXNjYWxsX3RhYmxlXzMyLlMKaW5kZXggZDQ0Mzk1Zi4uZTJlODZhMCAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL3N5c2NhbGxfdGFibGVfMzIuUworKysgYi9hcmNoL3g4Ni9rZXJuZWwvc3lzY2FsbF90YWJsZV8zMi5TCkBAIC04OCw3ICs4OCw3IEBACiAJLmxvbmcgc3lzX3VzZWxpYgogCS5sb25nIHN5c19zd2Fwb24KIAkubG9uZyBzeXNfcmVib290Ci0JLmxvbmcgb2xkX3JlYWRkaXIKKwkubG9uZyBzeXNfb2xkX3JlYWRkaXIKIAkubG9uZyBvbGRfbW1hcAkJLyogOTAgKi8KIAkubG9uZyBzeXNfbXVubWFwCiAJLmxvbmcgc3lzX3RydW5jYXRlCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvdGltZV8zMi5jIGIvYXJjaC94ODYva2VybmVsL3RpbWVfMzIuYwppbmRleCA2NTMwOWU0Li4zOTg1Y2FjIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvdGltZV8zMi5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC90aW1lXzMyLmMKQEAgLTEwNSw4ICsxMDUsOCBAQAogCQloaWdoIGJpdCBvZiB0aGUgUFBJIHBvcnQgQiAoMHg2MSkuICBOb3RlIHRoYXQgc29tZSBQUy8ycywKIAkJbm90YWJseSB0aGUgNTVTWCwgd29yayBmaW5lIGlmIHRoaXMgaXMgcmVtb3ZlZC4gICovCiAKLQkJdTggaXJxX3YgPSBpbmJfcCggMHg2MSApOwkvKiByZWFkIHRoZSBjdXJyZW50IHN0YXRlICovCi0JCW91dGJfcCggaXJxX3Z8MHg4MCwgMHg2MSApOwkvKiByZXNldCB0aGUgSVJRICovCisJCXU4IGlycV92ID0gaW5iX3AoMHg2MSk7CQkvKiByZWFkIHRoZSBjdXJyZW50IHN0YXRlICovCisJCW91dGJfcChpcnFfdiB8IDB4ODAsIDB4NjEpOwkvKiByZXNldCB0aGUgSVJRICovCiAJfQogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC90aW1lXzY0LmMgYi9hcmNoL3g4Ni9rZXJuZWwvdGltZV82NC5jCmluZGV4IDg5MWU3YTcuLmU2ZTY5NWEgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC90aW1lXzY0LmMKKysrIGIvYXJjaC94ODYva2VybmVsL3RpbWVfNjQuYwpAQCAtMTcsMTAgKzE3LDEwIEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvdGltZS5oPgogI2luY2x1ZGUgPGxpbnV4L21jYS5oPgorI2luY2x1ZGUgPGxpbnV4L25taS5oPgogCiAjaW5jbHVkZSA8YXNtL2k4MjUzLmg+CiAjaW5jbHVkZSA8YXNtL2hwZXQuaD4KLSNpbmNsdWRlIDxhc20vbm1pLmg+CiAjaW5jbHVkZSA8YXNtL3ZndG9kLmg+CiAjaW5jbHVkZSA8YXNtL3RpbWUuaD4KICNpbmNsdWRlIDxhc20vdGltZXIuaD4KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC90cmFwcy5jIGIvYXJjaC94ODYva2VybmVsL3RyYXBzLmMKaW5kZXggYzlhNjY2Yy4uOThjMmQwNTUgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC90cmFwcy5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC90cmFwcy5jCkBAIC02Myw5ICs2Myw2IEBACiAjZWxzZQogI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3ItZmxhZ3MuaD4KICNpbmNsdWRlIDxhc20vYXJjaF9ob29rcy5oPgotI2luY2x1ZGUgPGFzbS9ubWkuaD4KLSNpbmNsdWRlIDxhc20vc21wLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL3RyYXBzLmg+CiAKICNpbmNsdWRlICJjcHUvbWNoZWNrL21jZS5oIgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL3Zpc3dzX3F1aXJrcy5jIGIvYXJjaC94ODYva2VybmVsL3Zpc3dzX3F1aXJrcy5jCmluZGV4IDBjOTY2N2YuLmQ4MDFkMDYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC92aXN3c19xdWlya3MuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvdmlzd3NfcXVpcmtzLmMKQEAgLTE3NiwzMyArMTc2LDMxIEBACiAgKiBObyBwcm9ibGVtIGZvciBMaW51eC4KICAqLwogCi1zdGF0aWMgdm9pZCBfX2luaXQgTVBfcHJvY2Vzc29yX2luZm8oc3RydWN0IG1wY19jb25maWdfcHJvY2Vzc29yICptKQorc3RhdGljIHZvaWQgX19pbml0IE1QX3Byb2Nlc3Nvcl9pbmZvKHN0cnVjdCBtcGNfY3B1ICptKQogewogCWludCB2ZXIsIGxvZ2ljYWxfYXBpY2lkOwogCXBoeXNpZF9tYXNrX3QgYXBpY19jcHVzOwogCi0JaWYgKCEobS0+bXBjX2NwdWZsYWcgJiBDUFVfRU5BQkxFRCkpCisJaWYgKCEobS0+Y3B1ZmxhZyAmIENQVV9FTkFCTEVEKSkKIAkJcmV0dXJuOwogCi0JbG9naWNhbF9hcGljaWQgPSBtLT5tcGNfYXBpY2lkOworCWxvZ2ljYWxfYXBpY2lkID0gbS0+YXBpY2lkOwogCXByaW50ayhLRVJOX0lORk8gIiVzQ1BVICMlZCAldToldSBBUElDIHZlcnNpb24gJWRcbiIsCi0JICAgICAgIG0tPm1wY19jcHVmbGFnICYgQ1BVX0JPT1RQUk9DRVNTT1IgPyAiQm9vdHVwICIgOiAiIiwKLQkgICAgICAgbS0+bXBjX2FwaWNpZCwKLQkgICAgICAgKG0tPm1wY19jcHVmZWF0dXJlICYgQ1BVX0ZBTUlMWV9NQVNLKSA+PiA4LAotCSAgICAgICAobS0+bXBjX2NwdWZlYXR1cmUgJiBDUFVfTU9ERUxfTUFTSykgPj4gNCwKLQkgICAgICAgbS0+bXBjX2FwaWN2ZXIpOworCSAgICAgICBtLT5jcHVmbGFnICYgQ1BVX0JPT1RQUk9DRVNTT1IgPyAiQm9vdHVwICIgOiAiIiwKKwkgICAgICAgbS0+YXBpY2lkLCAobS0+Y3B1ZmVhdHVyZSAmIENQVV9GQU1JTFlfTUFTSykgPj4gOCwKKwkgICAgICAgKG0tPmNwdWZlYXR1cmUgJiBDUFVfTU9ERUxfTUFTSykgPj4gNCwgbS0+YXBpY3Zlcik7CiAKLQlpZiAobS0+bXBjX2NwdWZsYWcgJiBDUFVfQk9PVFBST0NFU1NPUikKLQkJYm9vdF9jcHVfcGh5c2ljYWxfYXBpY2lkID0gbS0+bXBjX2FwaWNpZDsKKwlpZiAobS0+Y3B1ZmxhZyAmIENQVV9CT09UUFJPQ0VTU09SKQorCQlib290X2NwdV9waHlzaWNhbF9hcGljaWQgPSBtLT5hcGljaWQ7CiAKLQl2ZXIgPSBtLT5tcGNfYXBpY3ZlcjsKLQlpZiAoKHZlciA+PSAweDE0ICYmIG0tPm1wY19hcGljaWQgPj0gMHhmZikgfHwgbS0+bXBjX2FwaWNpZCA+PSAweGYpIHsKKwl2ZXIgPSBtLT5hcGljdmVyOworCWlmICgodmVyID49IDB4MTQgJiYgbS0+YXBpY2lkID49IDB4ZmYpIHx8IG0tPmFwaWNpZCA+PSAweGYpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJQcm9jZXNzb3IgIyVkIElOVkFMSUQuIChNYXggSUQ6ICVkKS5cbiIsCi0JCQltLT5tcGNfYXBpY2lkLCBNQVhfQVBJQ1MpOworCQkJbS0+YXBpY2lkLCBNQVhfQVBJQ1MpOwogCQlyZXR1cm47CiAJfQogCi0JYXBpY19jcHVzID0gYXBpY2lkX3RvX2NwdV9wcmVzZW50KG0tPm1wY19hcGljaWQpOworCWFwaWNfY3B1cyA9IGFwaWNpZF90b19jcHVfcHJlc2VudChtLT5hcGljaWQpOwogCXBoeXNpZHNfb3IocGh5c19jcHVfcHJlc2VudF9tYXAsIHBoeXNfY3B1X3ByZXNlbnRfbWFwLCBhcGljX2NwdXMpOwogCS8qCiAJICogVmFsaWRhdGUgdmVyc2lvbgpAQCAtMjEwLDE1ICsyMDgsMTUgQEAKIAlpZiAodmVyID09IDB4MCkgewogCQlwcmludGsoS0VSTl9FUlIgIkJJT1MgYnVnLCBBUElDIHZlcnNpb24gaXMgMCBmb3IgQ1BVIyVkISAiCiAJCQkiZml4aW5nIHVwIHRvIDB4MTAuICh0ZWxsIHlvdXIgaHcgdmVuZG9yKVxuIiwKLQkJCW0tPm1wY19hcGljaWQpOworCQkJbS0+YXBpY2lkKTsKIAkJdmVyID0gMHgxMDsKIAl9Ci0JYXBpY192ZXJzaW9uW20tPm1wY19hcGljaWRdID0gdmVyOworCWFwaWNfdmVyc2lvblttLT5hcGljaWRdID0gdmVyOwogfQogCiBzdGF0aWMgaW50IF9faW5pdCB2aXN3c19maW5kX3NtcF9jb25maWcodW5zaWduZWQgaW50IHJlc2VydmUpCiB7Ci0Jc3RydWN0IG1wY19jb25maWdfcHJvY2Vzc29yICptcCA9IHBoeXNfdG9fdmlydChDT19DUFVfVEFCX1BIWVMpOworCXN0cnVjdCBtcGNfY3B1ICptcCA9IHBoeXNfdG9fdmlydChDT19DUFVfVEFCX1BIWVMpOwogCXVuc2lnbmVkIHNob3J0IG5jcHVzID0gcmVhZHcocGh5c190b192aXJ0KENPX0NQVV9OVU1fUEhZUykpOwogCiAJaWYgKG5jcHVzID4gQ09fQ1BVX01BWCkgewpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvbWFjaC1nZW5lcmljL2VzNzAwMC5jIGIvYXJjaC94ODYvbWFjaC1nZW5lcmljL2VzNzAwMC5jCmluZGV4IDRiYTVjY2EuLmMyZGVkMTQgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L21hY2gtZ2VuZXJpYy9lczcwMDAuYworKysgYi9hcmNoL3g4Ni9tYWNoLWdlbmVyaWMvZXM3MDAwLmMKQEAgLTQzLDEyICs0MywxMiBAQAogCXJldHVybjsKIH0KIAotc3RhdGljIF9faW5pdCBpbnQgbXBzX29lbV9jaGVjayhzdHJ1Y3QgbXBfY29uZmlnX3RhYmxlICptcGMsIGNoYXIgKm9lbSwKLQkJY2hhciAqcHJvZHVjdGlkKQorc3RhdGljIF9faW5pdCBpbnQKK21wc19vZW1fY2hlY2soc3RydWN0IG1wY190YWJsZSAqbXBjLCBjaGFyICpvZW0sIGNoYXIgKnByb2R1Y3RpZCkKIHsKLQlpZiAobXBjLT5tcGNfb2VtcHRyKSB7Ci0JCXN0cnVjdCBtcF9jb25maWdfb2VtdGFibGUgKm9lbV90YWJsZSA9Ci0JCQkoc3RydWN0IG1wX2NvbmZpZ19vZW10YWJsZSAqKW1wYy0+bXBjX29lbXB0cjsKKwlpZiAobXBjLT5vZW1wdHIpIHsKKwkJc3RydWN0IG1wY19vZW10YWJsZSAqb2VtX3RhYmxlID0KKwkJCShzdHJ1Y3QgbXBjX29lbXRhYmxlICopbXBjLT5vZW1wdHI7CiAJCWlmICghc3RybmNtcChvZW0sICJVTklTWVMiLCA2KSkKIAkJCXJldHVybiBwYXJzZV91bmlzeXNfb2VtKChjaGFyICopb2VtX3RhYmxlKTsKIAl9CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9tYWNoLWdlbmVyaWMvbnVtYXEuYyBiL2FyY2gveDg2L21hY2gtZ2VuZXJpYy9udW1hcS5jCmluZGV4IDUxMWQ3OTQuLjM2NzllMjIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L21hY2gtZ2VuZXJpYy9udW1hcS5jCisrKyBiL2FyY2gveDg2L21hY2gtZ2VuZXJpYy9udW1hcS5jCkBAIC0xOSw4ICsxOSw3IEBACiAjaW5jbHVkZSA8YXNtL251bWFxL3dha2VjcHUuaD4KICNpbmNsdWRlIDxhc20vbnVtYXEuaD4KIAotc3RhdGljIGludCBtcHNfb2VtX2NoZWNrKHN0cnVjdCBtcF9jb25maWdfdGFibGUgKm1wYywgY2hhciAqb2VtLAotCQljaGFyICpwcm9kdWN0aWQpCitzdGF0aWMgaW50IG1wc19vZW1fY2hlY2soc3RydWN0IG1wY190YWJsZSAqbXBjLCBjaGFyICpvZW0sIGNoYXIgKnByb2R1Y3RpZCkKIHsKIAludW1hcV9tcHNfb2VtX2NoZWNrKG1wYywgb2VtLCBwcm9kdWN0aWQpOwogCXJldHVybiBmb3VuZF9udW1hcTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L21hY2gtZ2VuZXJpYy9wcm9iZS5jIGIvYXJjaC94ODYvbWFjaC1nZW5lcmljL3Byb2JlLmMKaW5kZXggYzM0NmQ5ZC4uMTVhMzhkYSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvbWFjaC1nZW5lcmljL3Byb2JlLmMKKysrIGIvYXJjaC94ODYvbWFjaC1nZW5lcmljL3Byb2JlLmMKQEAgLTExMCw4ICsxMTAsNyBAQAogCiAvKiBUaGVzZSBmdW5jdGlvbnMgY2FuIHN3aXRjaCB0aGUgQVBJQyBldmVuIGFmdGVyIHRoZSBpbml0aWFsIC0+cHJvYmUoKSAqLwogCi1pbnQgX19pbml0IG1wc19vZW1fY2hlY2soc3RydWN0IG1wX2NvbmZpZ190YWJsZSAqbXBjLCBjaGFyICpvZW0sCi0JCQkJIGNoYXIgKnByb2R1Y3RpZCkKK2ludCBfX2luaXQgbXBzX29lbV9jaGVjayhzdHJ1Y3QgbXBjX3RhYmxlICptcGMsIGNoYXIgKm9lbSwgY2hhciAqcHJvZHVjdGlkKQogewogCWludCBpOwogCWZvciAoaSA9IDA7IGFwaWNfcHJvYmVbaV07ICsraSkgewpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvbW0vZmF1bHQuYyBiL2FyY2gveDg2L21tL2ZhdWx0LmMKaW5kZXggOWUyNjhiNmIuLjkwZGZhZTUgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L21tL2ZhdWx0LmMKKysrIGIvYXJjaC94ODYvbW0vZmF1bHQuYwpAQCAtNTM0LDcgKzUzNCw3IEBACiAJICAgaGFwcGVuIHdpdGhpbiBhIHJhY2UgaW4gcGFnZSB0YWJsZSB1cGRhdGUuIEluIHRoZSBsYXRlcgogCSAgIGNhc2UganVzdCBmbHVzaC4gKi8KIAotCXBnZCA9IHBnZF9vZmZzZXQoY3VycmVudC0+bW0gPzogJmluaXRfbW0sIGFkZHJlc3MpOworCXBnZCA9IHBnZF9vZmZzZXQoY3VycmVudC0+YWN0aXZlX21tLCBhZGRyZXNzKTsKIAlwZ2RfcmVmID0gcGdkX29mZnNldF9rKGFkZHJlc3MpOwogCWlmIChwZ2Rfbm9uZSgqcGdkX3JlZikpCiAJCXJldHVybiAtMTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L21tL2luaXRfMzIuYyBiL2FyY2gveDg2L21tL2luaXRfMzIuYwppbmRleCA1NDRkNzI0Li44OGYxYjEwIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9tbS9pbml0XzMyLmMKKysrIGIvYXJjaC94ODYvbW0vaW5pdF8zMi5jCkBAIC0zMjgsNiArMzI4LDggQEAKIHsKIAlpZiAocGFnZW5yIDw9IDI1NikKIAkJcmV0dXJuIDE7CisJaWYgKGlvbWVtX2lzX2V4Y2x1c2l2ZShwYWdlbnIgPDwgUEFHRV9TSElGVCkpCisJCXJldHVybiAwOwogCWlmICghcGFnZV9pc19yYW0ocGFnZW5yKSkKIAkJcmV0dXJuIDE7CiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9tbS9pbml0XzY0LmMgYi9hcmNoL3g4Ni9tbS9pbml0XzY0LmMKaW5kZXggNTRjNDM3ZS4uMjNmNjhlNyAxMDA2NDQKLS0tIGEvYXJjaC94ODYvbW0vaW5pdF82NC5jCisrKyBiL2FyY2gveDg2L21tL2luaXRfNjQuYwpAQCAtODg4LDYgKzg4OCw4IEBACiB7CiAJaWYgKHBhZ2VuciA8PSAyNTYpCiAJCXJldHVybiAxOworCWlmIChpb21lbV9pc19leGNsdXNpdmUocGFnZW5yIDw8IFBBR0VfU0hJRlQpKQorCQlyZXR1cm4gMDsKIAlpZiAoIXBhZ2VfaXNfcmFtKHBhZ2VucikpCiAJCXJldHVybiAxOwogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvbW0vazh0b3BvbG9neV82NC5jIGIvYXJjaC94ODYvbW0vazh0b3BvbG9neV82NC5jCmluZGV4IDQxZjFiNWMuLjI2OGY4MjUgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L21tL2s4dG9wb2xvZ3lfNjQuYworKysgYi9hcmNoL3g4Ni9tbS9rOHRvcG9sb2d5XzY0LmMKQEAgLTgxLDcgKzgxLDYgQEAKIAl1bnNpZ25lZCBudW1ub2RlcywgY29yZXMsIGJpdHMsIGFwaWNpZF9iYXNlOwogCXVuc2lnbmVkIGxvbmcgcHJldmJhc2U7CiAJc3RydWN0IGJvb3Rub2RlIG5vZGVzWzhdOwotCXVuc2lnbmVkIGNoYXIgbm9kZWlkc1s4XTsKIAlpbnQgaSwgaiwgbmIsIGZvdW5kID0gMDsKIAl1MzIgbm9kZWlkLCByZWc7CiAKQEAgLTExMCw3ICsxMDksNiBAQAogCQlsaW1pdCA9IHJlYWRfcGNpX2NvbmZpZygwLCBuYiwgMSwgMHg0NCArIGkqOCk7CiAKIAkJbm9kZWlkID0gbGltaXQgJiA3OwotCQlub2RlaWRzW2ldID0gbm9kZWlkOwogCQlpZiAoKGJhc2UgJiAzKSA9PSAwKSB7CiAJCQlpZiAoaSA8IG51bW5vZGVzKQogCQkJCXByaW50aygiU2tpcHBpbmcgZGlzYWJsZWQgbm9kZSAlZFxuIiwgaSk7CkBAIC0xNzksOSArMTc3LDYgQEAKIAogCQlub2Rlc1tub2RlaWRdLnN0YXJ0ID0gYmFzZTsKIAkJbm9kZXNbbm9kZWlkXS5lbmQgPSBsaW1pdDsKLQkJZTgyMF9yZWdpc3Rlcl9hY3RpdmVfcmVnaW9ucyhub2RlaWQsCi0JCQkJbm9kZXNbbm9kZWlkXS5zdGFydCA+PiBQQUdFX1NISUZULAotCQkJCW5vZGVzW25vZGVpZF0uZW5kID4+IFBBR0VfU0hJRlQpOwogCiAJCXByZXZiYXNlID0gYmFzZTsKIApAQCAtMjExLDEyICsyMDYsMTUgQEAKIAl9CiAKIAlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7Ci0JCWlmIChub2Rlc1tpXS5zdGFydCAhPSBub2Rlc1tpXS5lbmQpIHsKLQkJCW5vZGVpZCA9IG5vZGVpZHNbaV07Ci0JCQlmb3IgKGogPSBhcGljaWRfYmFzZTsgaiA8IGNvcmVzICsgYXBpY2lkX2Jhc2U7IGorKykKLQkJCQlhcGljaWRfdG9fbm9kZVsobm9kZWlkIDw8IGJpdHMpICsgal0gPSBpOwotCQkJc2V0dXBfbm9kZV9ib290bWVtKGksIG5vZGVzW2ldLnN0YXJ0LCBub2Rlc1tpXS5lbmQpOwotCQl9CisJCWlmIChub2Rlc1tpXS5zdGFydCA9PSBub2Rlc1tpXS5lbmQpCisJCQljb250aW51ZTsKKworCQllODIwX3JlZ2lzdGVyX2FjdGl2ZV9yZWdpb25zKGksCisJCQkJbm9kZXNbaV0uc3RhcnQgPj4gUEFHRV9TSElGVCwKKwkJCQlub2Rlc1tpXS5lbmQgPj4gUEFHRV9TSElGVCk7CisJCWZvciAoaiA9IGFwaWNpZF9iYXNlOyBqIDwgY29yZXMgKyBhcGljaWRfYmFzZTsgaisrKQorCQkJYXBpY2lkX3RvX25vZGVbKGkgPDwgYml0cykgKyBqXSA9IGk7CisJCXNldHVwX25vZGVfYm9vdG1lbShpLCBub2Rlc1tpXS5zdGFydCwgbm9kZXNbaV0uZW5kKTsKIAl9CiAKIAludW1hX2luaXRfYXJyYXkoKTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L21tL251bWFfMzIuYyBiL2FyY2gveDg2L21tL251bWFfMzIuYwppbmRleCA4NTE4YzY3Li5kMWY3NDM5IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9tbS9udW1hXzMyLmMKKysrIGIvYXJjaC94ODYvbW0vbnVtYV8zMi5jCkBAIC0yMzksNyArMjM5LDcgQEAKIAkJc3RhcnRfcGZuID0gbm9kZV9yZW1hcF9zdGFydF9wZm5bbm9kZV07CiAJCXNpemUgPSBub2RlX3JlbWFwX3NpemVbbm9kZV07CiAKLQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBub2RlICVkXG4iLCBfX0ZVTkNUSU9OX18sIG5vZGUpOworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IG5vZGUgJWRcbiIsIF9fZnVuY19fLCBub2RlKTsKIAogCQlmb3IgKHBmbiA9IDA7IHBmbiA8IHNpemU7IHBmbiArPSBQVFJTX1BFUl9QVEUpIHsKIAkJCXVuc2lnbmVkIGxvbmcgdmFkZHIgPSBzdGFydF92YSArIChwZm4gPDwgUEFHRV9TSElGVCk7CkBAIC0yNTEsNyArMjUxLDcgQEAKIAkJCQkJCVBBR0VfS0VSTkVMX0xBUkdFX0VYRUMpKTsKIAogCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAlMDhseCAtPiBwZm4gJTA4bHhcbiIsCi0JCQkJX19GVU5DVElPTl9fLCB2YWRkciwgc3RhcnRfcGZuICsgcGZuKTsKKwkJCQlfX2Z1bmNfXywgdmFkZHIsIHN0YXJ0X3BmbiArIHBmbik7CiAJCX0KIAl9CiB9CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9tbS9wYXQuYyBiL2FyY2gveDg2L21tL3BhdC5jCmluZGV4IDg1Y2JkM2MuLjhiMDhmYjkgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L21tL3BhdC5jCisrKyBiL2FyY2gveDg2L21tL3BhdC5jCkBAIC02MDEsMTIgKzYwMSwxMyBAQAogICogUmVzZXJ2ZWQgbm9uIFJBTSByZWdpb25zIG9ubHkgYW5kIGFmdGVyIHN1Y2Nlc3NmdWwgcmVzZXJ2ZV9tZW10eXBlLAogICogdGhpcyBmdW5jIGFsc28ga2VlcHMgaWRlbnRpdHkgbWFwcGluZyAoaWYgYW55KSBpbiBzeW5jIHdpdGggdGhpcyBuZXcgcHJvdC4KICAqLwotc3RhdGljIGludCByZXNlcnZlX3Bmbl9yYW5nZSh1NjQgcGFkZHIsIHVuc2lnbmVkIGxvbmcgc2l6ZSwgcGdwcm90X3Qgdm1hX3Byb3QpCitzdGF0aWMgaW50IHJlc2VydmVfcGZuX3JhbmdlKHU2NCBwYWRkciwgdW5zaWduZWQgbG9uZyBzaXplLCBwZ3Byb3RfdCAqdm1hX3Byb3QsCisJCQkJaW50IHN0cmljdF9wcm90KQogewogCWludCBpc19yYW0gPSAwOwogCWludCBpZF9zeiwgcmV0OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdW5zaWduZWQgbG9uZyB3YW50X2ZsYWdzID0gKHBncHJvdF92YWwodm1hX3Byb3QpICYgX1BBR0VfQ0FDSEVfTUFTSyk7CisJdW5zaWduZWQgbG9uZyB3YW50X2ZsYWdzID0gKHBncHJvdF92YWwoKnZtYV9wcm90KSAmIF9QQUdFX0NBQ0hFX01BU0spOwogCiAJaXNfcmFtID0gcGFnZXJhbmdlX2lzX3JhbShwYWRkciwgcGFkZHIgKyBzaXplKTsKIApAQCAtNjI1LDE1ICs2MjYsMjQgQEAKIAkJcmV0dXJuIHJldDsKIAogCWlmIChmbGFncyAhPSB3YW50X2ZsYWdzKSB7Ci0JCWZyZWVfbWVtdHlwZShwYWRkciwgcGFkZHIgKyBzaXplKTsKLQkJcHJpbnRrKEtFUk5fRVJSCi0JCSIlczolZCBtYXAgcGZuIGV4cGVjdGVkIG1hcHBpbmcgdHlwZSAlcyBmb3IgJUx4LSVMeCwgZ290ICVzXG4iLAotCQkJY3VycmVudC0+Y29tbSwgY3VycmVudC0+cGlkLAotCQkJY2F0dHJfbmFtZSh3YW50X2ZsYWdzKSwKLQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpcGFkZHIsCi0JCQkodW5zaWduZWQgbG9uZyBsb25nKShwYWRkciArIHNpemUpLAotCQkJY2F0dHJfbmFtZShmbGFncykpOwotCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKHN0cmljdF9wcm90IHx8ICFpc19uZXdfbWVtdHlwZV9hbGxvd2VkKHdhbnRfZmxhZ3MsIGZsYWdzKSkgeworCQkJZnJlZV9tZW10eXBlKHBhZGRyLCBwYWRkciArIHNpemUpOworCQkJcHJpbnRrKEtFUk5fRVJSICIlczolZCBtYXAgcGZuIGV4cGVjdGVkIG1hcHBpbmcgdHlwZSAlcyIKKwkJCQkiIGZvciAlTHgtJUx4LCBnb3QgJXNcbiIsCisJCQkJY3VycmVudC0+Y29tbSwgY3VycmVudC0+cGlkLAorCQkJCWNhdHRyX25hbWUod2FudF9mbGFncyksCisJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylwYWRkciwKKwkJCQkodW5zaWduZWQgbG9uZyBsb25nKShwYWRkciArIHNpemUpLAorCQkJCWNhdHRyX25hbWUoZmxhZ3MpKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCS8qCisJCSAqIFdlIGFsbG93IHJldHVybmluZyBkaWZmZXJlbnQgdHlwZSB0aGFuIHRoZSBvbmUgcmVxdWVzdGVkIGluCisJCSAqIG5vbiBzdHJpY3QgY2FzZS4KKwkJICovCisJCSp2bWFfcHJvdCA9IF9fcGdwcm90KChwZ3Byb3RfdmFsKCp2bWFfcHJvdCkgJgorCQkJCSAgICAgICh+X1BBR0VfQ0FDSEVfTUFTSykpIHwKKwkJCQkgICAgIGZsYWdzKTsKIAl9CiAKIAkvKiBOZWVkIHRvIGtlZXAgaWRlbnRpdHkgbWFwcGluZyBpbiBzeW5jICovCkBAIC02ODksNiArNjk5LDcgQEAKIAl1bnNpZ25lZCBsb25nIHZtYV9zdGFydCA9IHZtYS0+dm1fc3RhcnQ7CiAJdW5zaWduZWQgbG9uZyB2bWFfZW5kID0gdm1hLT52bV9lbmQ7CiAJdW5zaWduZWQgbG9uZyB2bWFfc2l6ZSA9IHZtYV9lbmQgLSB2bWFfc3RhcnQ7CisJcGdwcm90X3QgcGdwcm90OwogCiAJaWYgKCFwYXRfZW5hYmxlZCkKIAkJcmV0dXJuIDA7CkBAIC03MDIsNyArNzEzLDggQEAKIAkJCVdBUk5fT05fT05DRSgxKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9Ci0JCXJldHVybiByZXNlcnZlX3Bmbl9yYW5nZShwYWRkciwgdm1hX3NpemUsIF9fcGdwcm90KHByb3QpKTsKKwkJcGdwcm90ID0gX19wZ3Byb3QocHJvdCk7CisJCXJldHVybiByZXNlcnZlX3Bmbl9yYW5nZShwYWRkciwgdm1hX3NpemUsICZwZ3Byb3QsIDEpOwogCX0KIAogCS8qIHJlc2VydmUgZW50aXJlIHZtYSBwYWdlIGJ5IHBhZ2UsIHVzaW5nIHBmbiBhbmQgcHJvdCBmcm9tIHB0ZSAqLwpAQCAtNzEwLDcgKzcyMiw4IEBACiAJCWlmIChmb2xsb3dfcGh5cyh2bWEsIHZtYV9zdGFydCArIGksIDAsICZwcm90LCAmcGFkZHIpKQogCQkJY29udGludWU7CiAKLQkJcmV0dmFsID0gcmVzZXJ2ZV9wZm5fcmFuZ2UocGFkZHIsIFBBR0VfU0laRSwgX19wZ3Byb3QocHJvdCkpOworCQlwZ3Byb3QgPSBfX3BncHJvdChwcm90KTsKKwkJcmV0dmFsID0gcmVzZXJ2ZV9wZm5fcmFuZ2UocGFkZHIsIFBBR0VfU0laRSwgJnBncHJvdCwgMSk7CiAJCWlmIChyZXR2YWwpCiAJCQlnb3RvIGNsZWFudXBfcmV0OwogCX0KQEAgLTc0MSw3ICs3NTQsNyBAQAogICogTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gY2FuIGJlIGNhbGxlZCB3aXRoIGNhbGxlciB0cnlpbmcgdG8gbWFwIG9ubHkgYQogICogc3VicmFuZ2UvcGFnZSBpbnNpZGUgdGhlIHZtYS4KICAqLwotaW50IHRyYWNrX3Bmbl92bWFfbmV3KHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCBwZ3Byb3RfdCBwcm90LAoraW50IHRyYWNrX3Bmbl92bWFfbmV3KHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCBwZ3Byb3RfdCAqcHJvdCwKIAkJCXVuc2lnbmVkIGxvbmcgcGZuLCB1bnNpZ25lZCBsb25nIHNpemUpCiB7CiAJaW50IHJldHZhbCA9IDA7CkBAIC03NTgsMTQgKzc3MSwxNCBAQAogCWlmIChpc19saW5lYXJfcGZuX21hcHBpbmcodm1hKSkgewogCQkvKiByZXNlcnZlIHRoZSB3aG9sZSBjaHVuayBzdGFydGluZyBmcm9tIHZtX3Bnb2ZmICovCiAJCXBhZGRyID0gKHJlc291cmNlX3NpemVfdCl2bWEtPnZtX3Bnb2ZmIDw8IFBBR0VfU0hJRlQ7Ci0JCXJldHVybiByZXNlcnZlX3Bmbl9yYW5nZShwYWRkciwgdm1hX3NpemUsIHByb3QpOworCQlyZXR1cm4gcmVzZXJ2ZV9wZm5fcmFuZ2UocGFkZHIsIHZtYV9zaXplLCBwcm90LCAwKTsKIAl9CiAKIAkvKiByZXNlcnZlIHBhZ2UgYnkgcGFnZSB1c2luZyBwZm4gYW5kIHNpemUgKi8KIAliYXNlX3BhZGRyID0gKHJlc291cmNlX3NpemVfdClwZm4gPDwgUEFHRV9TSElGVDsKIAlmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSArPSBQQUdFX1NJWkUpIHsKIAkJcGFkZHIgPSBiYXNlX3BhZGRyICsgaTsKLQkJcmV0dmFsID0gcmVzZXJ2ZV9wZm5fcmFuZ2UocGFkZHIsIFBBR0VfU0laRSwgcHJvdCk7CisJCXJldHZhbCA9IHJlc2VydmVfcGZuX3JhbmdlKHBhZGRyLCBQQUdFX1NJWkUsIHByb3QsIDApOwogCQlpZiAocmV0dmFsKQogCQkJZ290byBjbGVhbnVwX3JldDsKIAl9CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9vcHJvZmlsZS9vcF9tb2RlbF9hbWQuYyBiL2FyY2gveDg2L29wcm9maWxlL29wX21vZGVsX2FtZC5jCmluZGV4IDk4NjU4ZjIuLjhmZGYwNmUgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L29wcm9maWxlL29wX21vZGVsX2FtZC5jCisrKyBiL2FyY2gveDg2L29wcm9maWxlL29wX21vZGVsX2FtZC5jCkBAIC0yLDcgKzIsNyBAQAogICogQGZpbGUgb3BfbW9kZWxfYW1kLmMKICAqIGF0aGxvbiAvIEs3IC8gSzggLyBGYW1pbHkgMTBoIG1vZGVsLXNwZWNpZmljIE1TUiBvcGVyYXRpb25zCiAgKgotICogQHJlbWFyayBDb3B5cmlnaHQgMjAwMi0yMDA4IE9Qcm9maWxlIGF1dGhvcnMKKyAqIEByZW1hcmsgQ29weXJpZ2h0IDIwMDItMjAwOSBPUHJvZmlsZSBhdXRob3JzCiAgKiBAcmVtYXJrIFJlYWQgdGhlIGZpbGUgQ09QWUlORwogICoKICAqIEBhdXRob3IgSm9obiBMZXZvbgpAQCAtMTAsNyArMTAsNyBAQAogICogQGF1dGhvciBHcmF5ZG9uIEhvYXJlCiAgKiBAYXV0aG9yIFJvYmVydCBSaWNodGVyIDxyb2JlcnQucmljaHRlckBhbWQuY29tPgogICogQGF1dGhvciBCYXJyeSBLYXNpbmRvcmYKLSovCisgKi8KIAogI2luY2x1ZGUgPGxpbnV4L29wcm9maWxlLmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CkBAIC02MCw1MyArNjAsMTAgQEAKICNkZWZpbmUgSUJTX09QX0xPV19WQUxJRF9CSVQJCSgxVUxMPDwxOCkJLyogYml0IDE4ICovCiAjZGVmaW5lIElCU19PUF9MT1dfRU5BQkxFCQkoMVVMTDw8MTcpCS8qIGJpdCAxNyAqLwogCi0vKiBDb2RlcyB1c2VkIGluIGNwdV9idWZmZXIuYyAqLwotLyogVGhpcyBwcm9kdWNlcyBkdXBsaWNhdGUgY29kZSwgbmVlZCB0byBiZSBmaXhlZCAqLwotI2RlZmluZSBJQlNfRkVUQ0hfQkVHSU4gMwotI2RlZmluZSBJQlNfT1BfQkVHSU4gICAgNAorI2RlZmluZSBJQlNfRkVUQ0hfU0laRQk2CisjZGVmaW5lIElCU19PUF9TSVpFCTEyCiAKLS8qCi0gKiBUaGUgZnVuY3Rpb24gaW50ZXJmYWNlIG5lZWRzIHRvIGJlIGZpeGVkLCBzb21ldGhpbmcgbGlrZSBhZGQKLSAqIGRhdGEuIFNob3VsZCB0aGVuIGJlIGFkZGVkIHRvIGxpbnV4L29wcm9maWxlLmguCi0gKi8KLWV4dGVybiB2b2lkCi1vcHJvZmlsZV9hZGRfaWJzX3NhbXBsZShzdHJ1Y3QgcHRfcmVncyAqIGNvbnN0IHJlZ3MsCi0JCQl1bnNpZ25lZCBpbnQgKiBjb25zdCBpYnNfc2FtcGxlLCBpbnQgaWJzX2NvZGUpOwotCi1zdHJ1Y3QgaWJzX2ZldGNoX3NhbXBsZSB7Ci0JLyogTVNSQzAwMV8xMDMxIElCUyBGZXRjaCBMaW5lYXIgQWRkcmVzcyBSZWdpc3RlciAqLwotCXVuc2lnbmVkIGludCBpYnNfZmV0Y2hfbGluX2FkZHJfbG93OwotCXVuc2lnbmVkIGludCBpYnNfZmV0Y2hfbGluX2FkZHJfaGlnaDsKLQkvKiBNU1JDMDAxXzEwMzAgSUJTIEZldGNoIENvbnRyb2wgUmVnaXN0ZXIgKi8KLQl1bnNpZ25lZCBpbnQgaWJzX2ZldGNoX2N0bF9sb3c7Ci0JdW5zaWduZWQgaW50IGlic19mZXRjaF9jdGxfaGlnaDsKLQkvKiBNU1JDMDAxXzEwMzIgSUJTIEZldGNoIFBoeXNpY2FsIEFkZHJlc3MgUmVnaXN0ZXIgKi8KLQl1bnNpZ25lZCBpbnQgaWJzX2ZldGNoX3BoeXNfYWRkcl9sb3c7Ci0JdW5zaWduZWQgaW50IGlic19mZXRjaF9waHlzX2FkZHJfaGlnaDsKLX07Ci0KLXN0cnVjdCBpYnNfb3Bfc2FtcGxlIHsKLQkvKiBNU1JDMDAxXzEwMzQgSUJTIE9wIExvZ2ljYWwgQWRkcmVzcyBSZWdpc3RlciAoSWJzUklQKSAqLwotCXVuc2lnbmVkIGludCBpYnNfb3BfcmlwX2xvdzsKLQl1bnNpZ25lZCBpbnQgaWJzX29wX3JpcF9oaWdoOwotCS8qIE1TUkMwMDFfMTAzNSBJQlMgT3AgRGF0YSBSZWdpc3RlciAqLwotCXVuc2lnbmVkIGludCBpYnNfb3BfZGF0YTFfbG93OwotCXVuc2lnbmVkIGludCBpYnNfb3BfZGF0YTFfaGlnaDsKLQkvKiBNU1JDMDAxXzEwMzYgSUJTIE9wIERhdGEgMiBSZWdpc3RlciAqLwotCXVuc2lnbmVkIGludCBpYnNfb3BfZGF0YTJfbG93OwotCXVuc2lnbmVkIGludCBpYnNfb3BfZGF0YTJfaGlnaDsKLQkvKiBNU1JDMDAxXzEwMzcgSUJTIE9wIERhdGEgMyBSZWdpc3RlciAqLwotCXVuc2lnbmVkIGludCBpYnNfb3BfZGF0YTNfbG93OwotCXVuc2lnbmVkIGludCBpYnNfb3BfZGF0YTNfaGlnaDsKLQkvKiBNU1JDMDAxXzEwMzggSUJTIERDIExpbmVhciBBZGRyZXNzIFJlZ2lzdGVyIChJYnNEY0xpbkFkKSAqLwotCXVuc2lnbmVkIGludCBpYnNfZGNfbGluZWFyX2xvdzsKLQl1bnNpZ25lZCBpbnQgaWJzX2RjX2xpbmVhcl9oaWdoOwotCS8qIE1TUkMwMDFfMTAzOSBJQlMgREMgUGh5c2ljYWwgQWRkcmVzcyBSZWdpc3RlciAoSWJzRGNQaHlzQWQpICovCi0JdW5zaWduZWQgaW50IGlic19kY19waHlzX2xvdzsKLQl1bnNpZ25lZCBpbnQgaWJzX2RjX3BoeXNfaGlnaDsKLX07Ci0KLXN0YXRpYyBpbnQgaWJzX2FsbG93ZWQ7CS8qIEFNRCBGYW1pbHkxMGggYW5kIGxhdGVyICovCitzdGF0aWMgaW50IGhhc19pYnM7CS8qIEFNRCBGYW1pbHkxMGggYW5kIGxhdGVyICovCiAKIHN0cnVjdCBvcF9pYnNfY29uZmlnIHsKIAl1bnNpZ25lZCBsb25nIG9wX2VuYWJsZWQ7CkBAIC0xOTcsMzEgKzE1NCwyOSBAQAogb3BfYW1kX2hhbmRsZV9pYnMoc3RydWN0IHB0X3JlZ3MgKiBjb25zdCByZWdzLAogCQkgIHN0cnVjdCBvcF9tc3JzIGNvbnN0ICogY29uc3QgbXNycykKIHsKLQl1bnNpZ25lZCBpbnQgbG93LCBoaWdoOwotCXN0cnVjdCBpYnNfZmV0Y2hfc2FtcGxlIGlic19mZXRjaDsKLQlzdHJ1Y3QgaWJzX29wX3NhbXBsZSBpYnNfb3A7CisJdTMyIGxvdywgaGlnaDsKKwl1NjQgbXNyOworCXN0cnVjdCBvcF9lbnRyeSBlbnRyeTsKIAotCWlmICghaWJzX2FsbG93ZWQpCisJaWYgKCFoYXNfaWJzKQogCQlyZXR1cm4gMTsKIAogCWlmIChpYnNfY29uZmlnLmZldGNoX2VuYWJsZWQpIHsKIAkJcmRtc3IoTVNSX0FNRDY0X0lCU0ZFVENIQ1RMLCBsb3csIGhpZ2gpOwogCQlpZiAoaGlnaCAmIElCU19GRVRDSF9ISUdIX1ZBTElEX0JJVCkgewotCQkJaWJzX2ZldGNoLmlic19mZXRjaF9jdGxfaGlnaCA9IGhpZ2g7Ci0JCQlpYnNfZmV0Y2guaWJzX2ZldGNoX2N0bF9sb3cgPSBsb3c7Ci0JCQlyZG1zcihNU1JfQU1ENjRfSUJTRkVUQ0hMSU5BRCwgbG93LCBoaWdoKTsKLQkJCWlic19mZXRjaC5pYnNfZmV0Y2hfbGluX2FkZHJfaGlnaCA9IGhpZ2g7Ci0JCQlpYnNfZmV0Y2guaWJzX2ZldGNoX2xpbl9hZGRyX2xvdyA9IGxvdzsKLQkJCXJkbXNyKE1TUl9BTUQ2NF9JQlNGRVRDSFBIWVNBRCwgbG93LCBoaWdoKTsKLQkJCWlic19mZXRjaC5pYnNfZmV0Y2hfcGh5c19hZGRyX2hpZ2ggPSBoaWdoOwotCQkJaWJzX2ZldGNoLmlic19mZXRjaF9waHlzX2FkZHJfbG93ID0gbG93OwotCi0JCQlvcHJvZmlsZV9hZGRfaWJzX3NhbXBsZShyZWdzLAotCQkJCQkJKHVuc2lnbmVkIGludCAqKSZpYnNfZmV0Y2gsCi0JCQkJCQlJQlNfRkVUQ0hfQkVHSU4pOworCQkJcmRtc3JsKE1TUl9BTUQ2NF9JQlNGRVRDSExJTkFELCBtc3IpOworCQkJb3Byb2ZpbGVfd3JpdGVfcmVzZXJ2ZSgmZW50cnksIHJlZ3MsIG1zciwKKwkJCQkJICAgICAgIElCU19GRVRDSF9DT0RFLCBJQlNfRkVUQ0hfU0laRSk7CisJCQlvcHJvZmlsZV9hZGRfZGF0YSgmZW50cnksICh1MzIpbXNyKTsKKwkJCW9wcm9maWxlX2FkZF9kYXRhKCZlbnRyeSwgKHUzMikobXNyID4+IDMyKSk7CisJCQlvcHJvZmlsZV9hZGRfZGF0YSgmZW50cnksIGxvdyk7CisJCQlvcHJvZmlsZV9hZGRfZGF0YSgmZW50cnksIGhpZ2gpOworCQkJcmRtc3JsKE1TUl9BTUQ2NF9JQlNGRVRDSFBIWVNBRCwgbXNyKTsKKwkJCW9wcm9maWxlX2FkZF9kYXRhKCZlbnRyeSwgKHUzMiltc3IpOworCQkJb3Byb2ZpbGVfYWRkX2RhdGEoJmVudHJ5LCAodTMyKShtc3IgPj4gMzIpKTsKKwkJCW9wcm9maWxlX3dyaXRlX2NvbW1pdCgmZW50cnkpOwogCiAJCQkvKiByZWVuYWJsZSB0aGUgSVJRICovCi0JCQlyZG1zcihNU1JfQU1ENjRfSUJTRkVUQ0hDVEwsIGxvdywgaGlnaCk7CiAJCQloaWdoICY9IH5JQlNfRkVUQ0hfSElHSF9WQUxJRF9CSVQ7CiAJCQloaWdoIHw9IElCU19GRVRDSF9ISUdIX0VOQUJMRTsKIAkJCWxvdyAmPSBJQlNfRkVUQ0hfTE9XX01BWF9DTlRfTUFTSzsKQEAgLTIzMiwzMCArMTg3LDI5IEBACiAJaWYgKGlic19jb25maWcub3BfZW5hYmxlZCkgewogCQlyZG1zcihNU1JfQU1ENjRfSUJTT1BDVEwsIGxvdywgaGlnaCk7CiAJCWlmIChsb3cgJiBJQlNfT1BfTE9XX1ZBTElEX0JJVCkgewotCQkJcmRtc3IoTVNSX0FNRDY0X0lCU09QUklQLCBsb3csIGhpZ2gpOwotCQkJaWJzX29wLmlic19vcF9yaXBfbG93ID0gbG93OwotCQkJaWJzX29wLmlic19vcF9yaXBfaGlnaCA9IGhpZ2g7Ci0JCQlyZG1zcihNU1JfQU1ENjRfSUJTT1BEQVRBLCBsb3csIGhpZ2gpOwotCQkJaWJzX29wLmlic19vcF9kYXRhMV9sb3cgPSBsb3c7Ci0JCQlpYnNfb3AuaWJzX29wX2RhdGExX2hpZ2ggPSBoaWdoOwotCQkJcmRtc3IoTVNSX0FNRDY0X0lCU09QREFUQTIsIGxvdywgaGlnaCk7Ci0JCQlpYnNfb3AuaWJzX29wX2RhdGEyX2xvdyA9IGxvdzsKLQkJCWlic19vcC5pYnNfb3BfZGF0YTJfaGlnaCA9IGhpZ2g7Ci0JCQlyZG1zcihNU1JfQU1ENjRfSUJTT1BEQVRBMywgbG93LCBoaWdoKTsKLQkJCWlic19vcC5pYnNfb3BfZGF0YTNfbG93ID0gbG93OwotCQkJaWJzX29wLmlic19vcF9kYXRhM19oaWdoID0gaGlnaDsKLQkJCXJkbXNyKE1TUl9BTUQ2NF9JQlNEQ0xJTkFELCBsb3csIGhpZ2gpOwotCQkJaWJzX29wLmlic19kY19saW5lYXJfbG93ID0gbG93OwotCQkJaWJzX29wLmlic19kY19saW5lYXJfaGlnaCA9IGhpZ2g7Ci0JCQlyZG1zcihNU1JfQU1ENjRfSUJTRENQSFlTQUQsIGxvdywgaGlnaCk7Ci0JCQlpYnNfb3AuaWJzX2RjX3BoeXNfbG93ID0gbG93OwotCQkJaWJzX29wLmlic19kY19waHlzX2hpZ2ggPSBoaWdoOworCQkJcmRtc3JsKE1TUl9BTUQ2NF9JQlNPUFJJUCwgbXNyKTsKKwkJCW9wcm9maWxlX3dyaXRlX3Jlc2VydmUoJmVudHJ5LCByZWdzLCBtc3IsCisJCQkJCSAgICAgICBJQlNfT1BfQ09ERSwgSUJTX09QX1NJWkUpOworCQkJb3Byb2ZpbGVfYWRkX2RhdGEoJmVudHJ5LCAodTMyKW1zcik7CisJCQlvcHJvZmlsZV9hZGRfZGF0YSgmZW50cnksICh1MzIpKG1zciA+PiAzMikpOworCQkJcmRtc3JsKE1TUl9BTUQ2NF9JQlNPUERBVEEsIG1zcik7CisJCQlvcHJvZmlsZV9hZGRfZGF0YSgmZW50cnksICh1MzIpbXNyKTsKKwkJCW9wcm9maWxlX2FkZF9kYXRhKCZlbnRyeSwgKHUzMikobXNyID4+IDMyKSk7CisJCQlyZG1zcmwoTVNSX0FNRDY0X0lCU09QREFUQTIsIG1zcik7CisJCQlvcHJvZmlsZV9hZGRfZGF0YSgmZW50cnksICh1MzIpbXNyKTsKKwkJCW9wcm9maWxlX2FkZF9kYXRhKCZlbnRyeSwgKHUzMikobXNyID4+IDMyKSk7CisJCQlyZG1zcmwoTVNSX0FNRDY0X0lCU09QREFUQTMsIG1zcik7CisJCQlvcHJvZmlsZV9hZGRfZGF0YSgmZW50cnksICh1MzIpbXNyKTsKKwkJCW9wcm9maWxlX2FkZF9kYXRhKCZlbnRyeSwgKHUzMikobXNyID4+IDMyKSk7CisJCQlyZG1zcmwoTVNSX0FNRDY0X0lCU0RDTElOQUQsIG1zcik7CisJCQlvcHJvZmlsZV9hZGRfZGF0YSgmZW50cnksICh1MzIpbXNyKTsKKwkJCW9wcm9maWxlX2FkZF9kYXRhKCZlbnRyeSwgKHUzMikobXNyID4+IDMyKSk7CisJCQlyZG1zcmwoTVNSX0FNRDY0X0lCU0RDUEhZU0FELCBtc3IpOworCQkJb3Byb2ZpbGVfYWRkX2RhdGEoJmVudHJ5LCAodTMyKW1zcik7CisJCQlvcHJvZmlsZV9hZGRfZGF0YSgmZW50cnksICh1MzIpKG1zciA+PiAzMikpOworCQkJb3Byb2ZpbGVfd3JpdGVfY29tbWl0KCZlbnRyeSk7CiAKIAkJCS8qIHJlZW5hYmxlIHRoZSBJUlEgKi8KLQkJCW9wcm9maWxlX2FkZF9pYnNfc2FtcGxlKHJlZ3MsCi0JCQkJCQkodW5zaWduZWQgaW50ICopJmlic19vcCwKLQkJCQkJCUlCU19PUF9CRUdJTik7Ci0JCQlyZG1zcihNU1JfQU1ENjRfSUJTT1BDVEwsIGxvdywgaGlnaCk7CiAJCQloaWdoID0gMDsKIAkJCWxvdyAmPSB+SUJTX09QX0xPV19WQUxJRF9CSVQ7CiAJCQlsb3cgfD0gSUJTX09QX0xPV19FTkFCTEU7CkBAIC0zMDUsMTQgKzI1OSwxNCBAQAogCX0KIAogI2lmZGVmIENPTkZJR19PUFJPRklMRV9JQlMKLQlpZiAoaWJzX2FsbG93ZWQgJiYgaWJzX2NvbmZpZy5mZXRjaF9lbmFibGVkKSB7CisJaWYgKGhhc19pYnMgJiYgaWJzX2NvbmZpZy5mZXRjaF9lbmFibGVkKSB7CiAJCWxvdyA9IChpYnNfY29uZmlnLm1heF9jbnRfZmV0Y2ggPj4gNCkgJiAweEZGRkY7CiAJCWhpZ2ggPSAoKGlic19jb25maWcucmFuZF9lbiAmIDB4MSkgPDwgMjUpIC8qIGJpdCA1NyAqLwogCQkJKyBJQlNfRkVUQ0hfSElHSF9FTkFCTEU7CiAJCXdybXNyKE1TUl9BTUQ2NF9JQlNGRVRDSENUTCwgbG93LCBoaWdoKTsKIAl9CiAKLQlpZiAoaWJzX2FsbG93ZWQgJiYgaWJzX2NvbmZpZy5vcF9lbmFibGVkKSB7CisJaWYgKGhhc19pYnMgJiYgaWJzX2NvbmZpZy5vcF9lbmFibGVkKSB7CiAJCWxvdyA9ICgoaWJzX2NvbmZpZy5tYXhfY250X29wID4+IDQpICYgMHhGRkZGKQogCQkJKyAoKGlic19jb25maWcuZGlzcGF0Y2hlZF9vcHMgJiAweDEpIDw8IDE5KSAvKiBiaXQgMTkgKi8KIAkJCSsgSUJTX09QX0xPV19FTkFCTEU7CkBAIC0zNDEsMTQgKzI5NSwxNCBAQAogCX0KIAogI2lmZGVmIENPTkZJR19PUFJPRklMRV9JQlMKLQlpZiAoaWJzX2FsbG93ZWQgJiYgaWJzX2NvbmZpZy5mZXRjaF9lbmFibGVkKSB7CisJaWYgKGhhc19pYnMgJiYgaWJzX2NvbmZpZy5mZXRjaF9lbmFibGVkKSB7CiAJCS8qIGNsZWFyIG1heCBjb3VudCBhbmQgZW5hYmxlICovCiAJCWxvdyA9IDA7CiAJCWhpZ2ggPSAwOwogCQl3cm1zcihNU1JfQU1ENjRfSUJTRkVUQ0hDVEwsIGxvdywgaGlnaCk7CiAJfQogCi0JaWYgKGlic19hbGxvd2VkICYmIGlic19jb25maWcub3BfZW5hYmxlZCkgeworCWlmIChoYXNfaWJzICYmIGlic19jb25maWcub3BfZW5hYmxlZCkgewogCQkvKiBjbGVhciBtYXggY291bnQgYW5kIGVuYWJsZSAqLwogCQlsb3cgPSAwOwogCQloaWdoID0gMDsKQEAgLTQwOSw2ICszNjMsNyBAQAogCQkJCSAgICAgICB8IElCU0NUTF9MVlRPRkZTRVRWQUwpOwogCQlwY2lfcmVhZF9jb25maWdfZHdvcmQoY3B1X2NmZywgSUJTQ1RMLCAmdmFsdWUpOwogCQlpZiAodmFsdWUgIT0gKGlic19laWx2dF9vZmYgfCBJQlNDVExfTFZUT0ZGU0VUVkFMKSkgeworCQkJcGNpX2Rldl9wdXQoY3B1X2NmZyk7CiAJCQlwcmludGsoS0VSTl9ERUJVRyAiRmFpbGVkIHRvIHNldHVwIElCUyBMVlQgb2Zmc2V0LCAiCiAJCQkJIklCU0NUTCA9IDB4JTA4eCIsIHZhbHVlKTsKIAkJCXJldHVybiAxOwpAQCAtNDM2LDIwICszOTEsMjAgQEAKIC8qIHVuaW5pdGlhbGl6ZSB0aGUgQVBJQyBmb3IgdGhlIElCUyBpbnRlcnJ1cHRzIGlmIG5lZWRlZCAqLwogc3RhdGljIHZvaWQgY2xlYXJfaWJzX25taSh2b2lkKQogewotCWlmIChpYnNfYWxsb3dlZCkKKwlpZiAoaGFzX2licykKIAkJb25fZWFjaF9jcHUoYXBpY19jbGVhcl9pYnNfbm1pX3Blcl9jcHUsIE5VTEwsIDEpOwogfQogCiAvKiBpbml0aWFsaXplIHRoZSBBUElDIGZvciB0aGUgSUJTIGludGVycnVwdHMgaWYgYXZhaWxhYmxlICovCiBzdGF0aWMgdm9pZCBpYnNfaW5pdCh2b2lkKQogewotCWlic19hbGxvd2VkID0gYm9vdF9jcHVfaGFzKFg4Nl9GRUFUVVJFX0lCUyk7CisJaGFzX2licyA9IGJvb3RfY3B1X2hhcyhYODZfRkVBVFVSRV9JQlMpOwogCi0JaWYgKCFpYnNfYWxsb3dlZCkKKwlpZiAoIWhhc19pYnMpCiAJCXJldHVybjsKIAogCWlmIChpbml0X2lic19ubWkoKSkgewotCQlpYnNfYWxsb3dlZCA9IDA7CisJCWhhc19pYnMgPSAwOwogCQlyZXR1cm47CiAJfQogCkBAIC00NTgsNyArNDEzLDcgQEAKIAogc3RhdGljIHZvaWQgaWJzX2V4aXQodm9pZCkKIHsKLQlpZiAoIWlic19hbGxvd2VkKQorCWlmICghaGFzX2licykKIAkJcmV0dXJuOwogCiAJY2xlYXJfaWJzX25taSgpOwpAQCAtNDc4LDcgKzQzMyw3IEBACiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAotCWlmICghaWJzX2FsbG93ZWQpCisJaWYgKCFoYXNfaWJzKQogCQlyZXR1cm4gcmV0OwogCiAJLyogbW9kZWwgc3BlY2lmaWMgZmlsZXMgKi8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L3BjaS9hY3BpLmMgYi9hcmNoL3g4Ni9wY2kvYWNwaS5jCmluZGV4IDllNTc1MmYuLmMwZWNmMjUgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3BjaS9hY3BpLmMKKysrIGIvYXJjaC94ODYvcGNpL2FjcGkuYwpAQCAtMjEwLDExICsyMTAsMTAgQEAKIAlpZiAoYnVzICYmIG5vZGUgIT0gLTEpIHsKICNpZmRlZiBDT05GSUdfQUNQSV9OVU1BCiAJCWlmIChweG0gPj0gMCkKLQkJCXByaW50ayhLRVJOX0RFQlVHICJidXMgJTAyeCAtPiBweG0gJWQgLT4gbm9kZSAlZFxuIiwKLQkJCQlidXNudW0sIHB4bSwgbm9kZSk7CisJCQlkZXZfcHJpbnRrKEtFUk5fREVCVUcsICZidXMtPmRldiwKKwkJCQkgICAib24gTlVNQSBub2RlICVkIChweG0gJWQpXG4iLCBub2RlLCBweG0pOwogI2Vsc2UKLQkJcHJpbnRrKEtFUk5fREVCVUcgImJ1cyAlMDJ4IC0+IG5vZGUgJWRcbiIsCi0JCQlidXNudW0sIG5vZGUpOworCQlkZXZfcHJpbnRrKEtFUk5fREVCVUcsICZidXMtPmRldiwgIm9uIE5VTUEgbm9kZSAlZFxuIiwgbm9kZSk7CiAjZW5kaWYKIAl9CiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3BjaS9jb21tb24uYyBiL2FyY2gveDg2L3BjaS9jb21tb24uYwppbmRleCA2MmRkYjczLi44MmQyMmZjIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9wY2kvY29tbW9uLmMKKysrIGIvYXJjaC94ODYvcGNpL2NvbW1vbi5jCkBAIC01NTEsMTcgKzU1MSwyNSBAQAogCWlmICgoZXJyID0gcGNpX2VuYWJsZV9yZXNvdXJjZXMoZGV2LCBtYXNrKSkgPCAwKQogCQlyZXR1cm4gZXJyOwogCi0JaWYgKCFkZXYtPm1zaV9lbmFibGVkKQorCWlmICghcGNpX2Rldl9tc2lfZW5hYmxlZChkZXYpKQogCQlyZXR1cm4gcGNpYmlvc19lbmFibGVfaXJxKGRldik7CiAJcmV0dXJuIDA7CiB9CiAKIHZvaWQgcGNpYmlvc19kaXNhYmxlX2RldmljZSAoc3RydWN0IHBjaV9kZXYgKmRldikKIHsKLQlpZiAoIWRldi0+bXNpX2VuYWJsZWQgJiYgcGNpYmlvc19kaXNhYmxlX2lycSkKKwlpZiAoIXBjaV9kZXZfbXNpX2VuYWJsZWQoZGV2KSAmJiBwY2liaW9zX2Rpc2FibGVfaXJxKQogCQlwY2liaW9zX2Rpc2FibGVfaXJxKGRldik7CiB9CiAKK2ludCBwY2lfZXh0X2NmZ19hdmFpbChzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCWlmIChyYXdfcGNpX2V4dF9vcHMpCisJCXJldHVybiAxOworCWVsc2UKKwkJcmV0dXJuIDA7Cit9CisKIHN0cnVjdCBwY2lfYnVzICogX19kZXZpbml0IHBjaV9zY2FuX2J1c19vbl9ub2RlKGludCBidXNubywgc3RydWN0IHBjaV9vcHMgKm9wcywgaW50IG5vZGUpCiB7CiAJc3RydWN0IHBjaV9idXMgKmJ1cyA9IE5VTEw7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9wY2kvaTM4Ni5jIGIvYXJjaC94ODYvcGNpL2kzODYuYwppbmRleCBlNTFiZjJjLi41ZWFkODA4IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9wY2kvaTM4Ni5jCisrKyBiL2FyY2gveDg2L3BjaS9pMzg2LmMKQEAgLTEyOSw3ICsxMjksNyBAQAogCQkJCXByID0gcGNpX2ZpbmRfcGFyZW50X3Jlc291cmNlKGRldiwgcik7CiAJCQkJaWYgKCFyLT5zdGFydCB8fCAhcHIgfHwKIAkJCQkgICAgcmVxdWVzdF9yZXNvdXJjZShwciwgcikgPCAwKSB7Ci0JCQkJCWRldl9lcnIoJmRldi0+ZGV2LCAiQkFSICVkOiBjYW4ndCBhbGxvY2F0ZSByZXNvdXJjZVxuIiwgaWR4KTsKKwkJCQkJZGV2X2luZm8oJmRldi0+ZGV2LCAiQkFSICVkOiBjYW4ndCBhbGxvY2F0ZSByZXNvdXJjZVxuIiwgaWR4KTsKIAkJCQkJLyoKIAkJCQkJICogU29tZXRoaW5nIGlzIHdyb25nIHdpdGggdGhlIHJlZ2lvbi4KIAkJCQkJICogSW52YWxpZGF0ZSB0aGUgcmVzb3VyY2UgdG8gcHJldmVudApAQCAtMTcwLDcgKzE3MCw3IEBACiAJCQkJCXItPmZsYWdzLCBkaXNhYmxlZCwgcGFzcyk7CiAJCQkJcHIgPSBwY2lfZmluZF9wYXJlbnRfcmVzb3VyY2UoZGV2LCByKTsKIAkJCQlpZiAoIXByIHx8IHJlcXVlc3RfcmVzb3VyY2UocHIsIHIpIDwgMCkgewotCQkJCQlkZXZfZXJyKCZkZXYtPmRldiwgIkJBUiAlZDogY2FuJ3QgYWxsb2NhdGUgcmVzb3VyY2VcbiIsIGlkeCk7CisJCQkJCWRldl9pbmZvKCZkZXYtPmRldiwgIkJBUiAlZDogY2FuJ3QgYWxsb2NhdGUgcmVzb3VyY2VcbiIsIGlkeCk7CiAJCQkJCS8qIFdlJ2xsIGFzc2lnbiBhIG5ldyBhZGRyZXNzIGxhdGVyICovCiAJCQkJCXItPmVuZCAtPSByLT5zdGFydDsKIAkJCQkJci0+c3RhcnQgPSAwOwpAQCAtMzE0LDE3ICszMTQsNyBAQAogCQlyZXR1cm4gcmV0dmFsOwogCiAJaWYgKGZsYWdzICE9IG5ld19mbGFncykgewotCQkvKgotCQkgKiBEbyBub3QgZmFsbGJhY2sgdG8gY2VydGFpbiBtZW1vcnkgdHlwZXMgd2l0aCBjZXJ0YWluCi0JCSAqIHJlcXVlc3RlZCB0eXBlOgotCQkgKiAtIHJlcXVlc3QgaXMgdW5jYWNoZWQsIHJldHVybiBjYW5ub3QgYmUgd3JpdGUtYmFjawotCQkgKiAtIHJlcXVlc3QgaXMgdW5jYWNoZWQsIHJldHVybiBjYW5ub3QgYmUgd3JpdGUtY29tYmluZQotCQkgKiAtIHJlcXVlc3QgaXMgd3JpdGUtY29tYmluZSwgcmV0dXJuIGNhbm5vdCBiZSB3cml0ZS1iYWNrCi0JCSAqLwotCQlpZiAoKGZsYWdzID09IF9QQUdFX0NBQ0hFX1VDX01JTlVTICYmCi0JCSAgICAgKG5ld19mbGFncyA9PSBfUEFHRV9DQUNIRV9XQikpIHx8Ci0JCSAgICAoZmxhZ3MgPT0gX1BBR0VfQ0FDSEVfV0MgJiYKLQkJICAgICBuZXdfZmxhZ3MgPT0gX1BBR0VfQ0FDSEVfV0IpKSB7CisJCWlmICghaXNfbmV3X21lbXR5cGVfYWxsb3dlZChmbGFncywgbmV3X2ZsYWdzKSkgewogCQkJZnJlZV9tZW10eXBlKGFkZHIsIGFkZHIrbGVuKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9wY2kvaW5pdC5jIGIvYXJjaC94ODYvcGNpL2luaXQuYwppbmRleCBiZWMzYjA0Li4yNWExZjhlIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9wY2kvaW5pdC5jCisrKyBiL2FyY2gveDg2L3BjaS9pbml0LmMKQEAgLTEyLDcgKzEyLDggQEAKIAl0eXBlID0gcGNpX2RpcmVjdF9wcm9iZSgpOwogI2VuZGlmCiAKLQlwY2lfbW1jZmdfZWFybHlfaW5pdCgpOworCWlmICghKHBjaV9wcm9iZSAmIFBDSV9QUk9CRV9OT0VBUkxZKSkKKwkJcGNpX21tY2ZnX2Vhcmx5X2luaXQoKTsKIAogI2lmZGVmIENPTkZJR19QQ0lfT0xQQwogCWlmICghcGNpX29scGNfaW5pdCgpKQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvcGNpL2lycS5jIGIvYXJjaC94ODYvcGNpL2lycS5jCmluZGV4IDM3M2I5YWYuLjQwNjQzNDUgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3BjaS9pcnEuYworKysgYi9hcmNoL3g4Ni9wY2kvaXJxLmMKQEAgLTUzMyw3ICs1MzMsNyBAQAogewogCXN0cnVjdCBwY2lfZGV2ICpicmlkZ2U7CiAJaW50IHBpbiA9IHBjaV9nZXRfaW50ZXJydXB0X3BpbihkZXYsICZicmlkZ2UpOwotCXJldHVybiBwY2liaW9zX3NldF9pcnFfcm91dGluZyhicmlkZ2UsIHBpbiwgaXJxKTsKKwlyZXR1cm4gcGNpYmlvc19zZXRfaXJxX3JvdXRpbmcoYnJpZGdlLCBwaW4gLSAxLCBpcnEpOwogfQogCiAjZW5kaWYKQEAgLTg4Nyw3ICs4ODcsNiBAQAogCQlkZXZfZGJnKCZkZXYtPmRldiwgIm5vIGludGVycnVwdCBwaW5cbiIpOwogCQlyZXR1cm4gMDsKIAl9Ci0JcGluID0gcGluIC0gMTsKIAogCS8qIEZpbmQgSVJRIHJvdXRpbmcgZW50cnkgKi8KIApAQCAtODk3LDE3ICs4OTYsMTcgQEAKIAlpbmZvID0gcGlycV9nZXRfaW5mbyhkZXYpOwogCWlmICghaW5mbykgewogCQlkZXZfZGJnKCZkZXYtPmRldiwgIlBDSSBJTlQgJWMgbm90IGZvdW5kIGluIHJvdXRpbmcgdGFibGVcbiIsCi0JCQknQScgKyBwaW4pOworCQkJJ0EnICsgcGluIC0gMSk7CiAJCXJldHVybiAwOwogCX0KLQlwaXJxID0gaW5mby0+aXJxW3Bpbl0ubGluazsKLQltYXNrID0gaW5mby0+aXJxW3Bpbl0uYml0bWFwOworCXBpcnEgPSBpbmZvLT5pcnFbcGluIC0gMV0ubGluazsKKwltYXNrID0gaW5mby0+aXJxW3BpbiAtIDFdLmJpdG1hcDsKIAlpZiAoIXBpcnEpIHsKLQkJZGV2X2RiZygmZGV2LT5kZXYsICJQQ0kgSU5UICVjIG5vdCByb3V0ZWRcbiIsICdBJyArIHBpbik7CisJCWRldl9kYmcoJmRldi0+ZGV2LCAiUENJIElOVCAlYyBub3Qgcm91dGVkXG4iLCAnQScgKyBwaW4gLSAxKTsKIAkJcmV0dXJuIDA7CiAJfQogCWRldl9kYmcoJmRldi0+ZGV2LCAiUENJIElOVCAlYyAtPiBQSVJRICUwMngsIG1hc2sgJTA0eCwgZXhjbCAlMDR4IiwKLQkJJ0EnICsgcGluLCBwaXJxLCBtYXNrLCBwaXJxX3RhYmxlLT5leGNsdXNpdmVfaXJxcyk7CisJCSdBJyArIHBpbiAtIDEsIHBpcnEsIG1hc2ssIHBpcnFfdGFibGUtPmV4Y2x1c2l2ZV9pcnFzKTsKIAltYXNrICY9IHBjaWJpb3NfaXJxX21hc2s7CiAKIAkvKiBXb3JrIGFyb3VuZCBicm9rZW4gSFAgUGF2aWxpb24gTm90ZWJvb2tzIHdoaWNoIGFzc2lnbiBVU0IgdG8KQEAgLTk0OSw3ICs5NDgsNyBAQAogCQkJCW5ld2lycSA9IGk7CiAJCX0KIAl9Ci0JZGV2X2RiZygmZGV2LT5kZXYsICJQQ0kgSU5UICVjIC0+IG5ld2lycSAlZCIsICdBJyArIHBpbiwgbmV3aXJxKTsKKwlkZXZfZGJnKCZkZXYtPmRldiwgIlBDSSBJTlQgJWMgLT4gbmV3aXJxICVkIiwgJ0EnICsgcGluIC0gMSwgbmV3aXJxKTsKIAogCS8qIENoZWNrIGlmIGl0IGlzIGhhcmRjb2RlZCAqLwogCWlmICgocGlycSAmIDB4ZjApID09IDB4ZjApIHsKQEAgLTk3NywxOCArOTc2LDE4IEBACiAJCQlyZXR1cm4gMDsKIAkJfQogCX0KLQlkZXZfaW5mbygmZGV2LT5kZXYsICIlcyBQQ0kgSU5UICVjIC0+IElSUSAlZFxuIiwgbXNnLCAnQScgKyBwaW4sIGlycSk7CisJZGV2X2luZm8oJmRldi0+ZGV2LCAiJXMgUENJIElOVCAlYyAtPiBJUlEgJWRcbiIsIG1zZywgJ0EnICsgcGluIC0gMSwgaXJxKTsKIAogCS8qIFVwZGF0ZSBJUlEgZm9yIGFsbCBkZXZpY2VzIHdpdGggdGhlIHNhbWUgcGlycSB2YWx1ZSAqLwogCXdoaWxlICgoZGV2MiA9IHBjaV9nZXRfZGV2aWNlKFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIGRldjIpKSAhPSBOVUxMKSB7CiAJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldjIsIFBDSV9JTlRFUlJVUFRfUElOLCAmcGluKTsKIAkJaWYgKCFwaW4pCiAJCQljb250aW51ZTsKLQkJcGluLS07CisKIAkJaW5mbyA9IHBpcnFfZ2V0X2luZm8oZGV2Mik7CiAJCWlmICghaW5mbykKIAkJCWNvbnRpbnVlOwotCQlpZiAoaW5mby0+aXJxW3Bpbl0ubGluayA9PSBwaXJxKSB7CisJCWlmIChpbmZvLT5pcnFbcGluIC0gMV0ubGluayA9PSBwaXJxKSB7CiAJCQkvKgogCQkJICogV2UgcmVmdXNlIHRvIG92ZXJyaWRlIHRoZSBkZXYtPmlycQogCQkJICogaW5mb3JtYXRpb24uIEdpdmUgYSB3YXJuaW5nIQpAQCAtMTA0Miw2ICsxMDQxLDkgQEAKIAlkZXYgPSBOVUxMOwogCXdoaWxlICgoZGV2ID0gcGNpX2dldF9kZXZpY2UoUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgZGV2KSkgIT0gTlVMTCkgewogCQlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIFBDSV9JTlRFUlJVUFRfUElOLCAmcGluKTsKKwkJaWYgKCFwaW4pCisJCQljb250aW51ZTsKKwogI2lmZGVmIENPTkZJR19YODZfSU9fQVBJQwogCQkvKgogCQkgKiBSZWNhbGN1bGF0ZSBJUlEgbnVtYmVycyBpZiB3ZSB1c2UgdGhlIEkvTyBBUElDLgpAQCAtMTA0OSwxNSArMTA1MSwxMSBAQAogCQlpZiAoaW9fYXBpY19hc3NpZ25fcGNpX2lycXMpIHsKIAkJCWludCBpcnE7CiAKLQkJCWlmICghcGluKQotCQkJCWNvbnRpbnVlOwotCiAJCQkvKgogCQkJICogaW50ZXJydXB0IHBpbnMgYXJlIG51bWJlcmVkIHN0YXJ0aW5nIGZyb20gMQogCQkJICovCi0JCQlwaW4tLTsKIAkJCWlycSA9IElPX0FQSUNfZ2V0X1BDSV9pcnFfdmVjdG9yKGRldi0+YnVzLT5udW1iZXIsCi0JCQkJUENJX1NMT1QoZGV2LT5kZXZmbiksIHBpbik7CisJCQkJUENJX1NMT1QoZGV2LT5kZXZmbiksIHBpbiAtIDEpOwogCQkJLyoKIAkJCSAqIEJ1c3NlcyBiZWhpbmQgYnJpZGdlcyBhcmUgdHlwaWNhbGx5IG5vdCBsaXN0ZWQgaW4gdGhlCiAJCQkgKiBNUC10YWJsZS4gIEluIHRoaXMgY2FzZSB3ZSBoYXZlIHRvIGxvb2sgdXAgdGhlIElSUQpAQCAtMTA3MCwyMiArMTA2OCwyMiBAQAogCQkJCXN0cnVjdCBwY2lfZGV2ICpicmlkZ2UgPSBkZXYtPmJ1cy0+c2VsZjsKIAkJCQlpbnQgYnVzOwogCi0JCQkJcGluID0gKHBpbiArIFBDSV9TTE9UKGRldi0+ZGV2Zm4pKSAlIDQ7CisJCQkJcGluID0gcGNpX3N3aXp6bGVfaW50ZXJydXB0X3BpbihkZXYsIHBpbik7CiAJCQkJYnVzID0gYnJpZGdlLT5idXMtPm51bWJlcjsKIAkJCQlpcnEgPSBJT19BUElDX2dldF9QQ0lfaXJxX3ZlY3RvcihidXMsCi0JCQkJCQlQQ0lfU0xPVChicmlkZ2UtPmRldmZuKSwgcGluKTsKKwkJCQkJCVBDSV9TTE9UKGJyaWRnZS0+ZGV2Zm4pLCBwaW4gLSAxKTsKIAkJCQlpZiAoaXJxID49IDApCiAJCQkJCWRldl93YXJuKCZkZXYtPmRldiwKIAkJCQkJCSJ1c2luZyBicmlkZ2UgJXMgSU5UICVjIHRvICIKIAkJCQkJCQkiZ2V0IElSUSAlZFxuIiwKIAkJCQkJCSBwY2lfbmFtZShicmlkZ2UpLAotCQkJCQkJICdBJyArIHBpbiwgaXJxKTsKKwkJCQkJCSAnQScgKyBwaW4gLSAxLCBpcnEpOwogCQkJfQogCQkJaWYgKGlycSA+PSAwKSB7CiAJCQkJZGV2X2luZm8oJmRldi0+ZGV2LAogCQkJCQkiUENJLT5BUElDIElSUSB0cmFuc2Zvcm06IElOVCAlYyAiCiAJCQkJCQkiLT4gSVJRICVkXG4iLAotCQkJCQknQScgKyBwaW4sIGlycSk7CisJCQkJCSdBJyArIHBpbiAtIDEsIGlycSk7CiAJCQkJZGV2LT5pcnEgPSBpcnE7CiAJCQl9CiAJCX0KQEAgLTEwOTMsNyArMTA5MSw3IEBACiAJCS8qCiAJCSAqIFN0aWxsIG5vIElSUT8gVHJ5IHRvIGxvb2t1cCBvbmUuLi4KIAkJICovCi0JCWlmIChwaW4gJiYgIWRldi0+aXJxKQorCQlpZiAoIWRldi0+aXJxKQogCQkJcGNpYmlvc19sb29rdXBfaXJxKGRldiwgMCk7CiAJfQogfQpAQCAtMTIyMCwxMiArMTIxOCwxMCBAQAogCWlmIChwaW4gJiYgIXBjaWJpb3NfbG9va3VwX2lycShkZXYsIDEpICYmICFkZXYtPmlycSkgewogCQljaGFyICptc2cgPSAiIjsKIAotCQlwaW4tLTsgLyogaW50ZXJydXB0IHBpbnMgYXJlIG51bWJlcmVkIHN0YXJ0aW5nIGZyb20gMSAqLwotCiAJCWlmIChpb19hcGljX2Fzc2lnbl9wY2lfaXJxcykgewogCQkJaW50IGlycTsKIAotCQkJaXJxID0gSU9fQVBJQ19nZXRfUENJX2lycV92ZWN0b3IoZGV2LT5idXMtPm51bWJlciwgUENJX1NMT1QoZGV2LT5kZXZmbiksIHBpbik7CisJCQlpcnEgPSBJT19BUElDX2dldF9QQ0lfaXJxX3ZlY3RvcihkZXYtPmJ1cy0+bnVtYmVyLCBQQ0lfU0xPVChkZXYtPmRldmZuKSwgcGluIC0gMSk7CiAJCQkvKgogCQkJICogQnVzc2VzIGJlaGluZCBicmlkZ2VzIGFyZSB0eXBpY2FsbHkgbm90IGxpc3RlZCBpbiB0aGUgTVAtdGFibGUuCiAJCQkgKiBJbiB0aGlzIGNhc2Ugd2UgaGF2ZSB0byBsb29rIHVwIHRoZSBJUlEgYmFzZWQgb24gdGhlIHBhcmVudCBidXMsCkBAIC0xMjM2LDIwICsxMjMyLDIwIEBACiAJCQl3aGlsZSAoaXJxIDwgMCAmJiBkZXYtPmJ1cy0+cGFyZW50KSB7IC8qIGdvIGJhY2sgdG8gdGhlIGJyaWRnZSAqLwogCQkJCXN0cnVjdCBwY2lfZGV2ICpicmlkZ2UgPSBkZXYtPmJ1cy0+c2VsZjsKIAotCQkJCXBpbiA9IChwaW4gKyBQQ0lfU0xPVChkZXYtPmRldmZuKSkgJSA0OworCQkJCXBpbiA9IHBjaV9zd2l6emxlX2ludGVycnVwdF9waW4oZGV2LCBwaW4pOwogCQkJCWlycSA9IElPX0FQSUNfZ2V0X1BDSV9pcnFfdmVjdG9yKGJyaWRnZS0+YnVzLT5udW1iZXIsCi0JCQkJCQlQQ0lfU0xPVChicmlkZ2UtPmRldmZuKSwgcGluKTsKKwkJCQkJCVBDSV9TTE9UKGJyaWRnZS0+ZGV2Zm4pLCBwaW4gLSAxKTsKIAkJCQlpZiAoaXJxID49IDApCiAJCQkJCWRldl93YXJuKCZkZXYtPmRldiwgInVzaW5nIGJyaWRnZSAlcyAiCiAJCQkJCQkgIklOVCAlYyB0byBnZXQgSVJRICVkXG4iLAotCQkJCQkJIHBjaV9uYW1lKGJyaWRnZSksICdBJyArIHBpbiwKKwkJCQkJCSBwY2lfbmFtZShicmlkZ2UpLCAnQScgKyBwaW4gLSAxLAogCQkJCQkJIGlycSk7CiAJCQkJZGV2ID0gYnJpZGdlOwogCQkJfQogCQkJZGV2ID0gdGVtcF9kZXY7CiAJCQlpZiAoaXJxID49IDApIHsKIAkJCQlkZXZfaW5mbygmZGV2LT5kZXYsICJQQ0ktPkFQSUMgSVJRIHRyYW5zZm9ybTogIgotCQkJCQkgIklOVCAlYyAtPiBJUlEgJWRcbiIsICdBJyArIHBpbiwgaXJxKTsKKwkJCQkJICJJTlQgJWMgLT4gSVJRICVkXG4iLCAnQScgKyBwaW4gLSAxLCBpcnEpOwogCQkJCWRldi0+aXJxID0gaXJxOwogCQkJCXJldHVybiAwOwogCQkJfSBlbHNlCkBAIC0xMjY4LDcgKzEyNjQsNyBAQAogCQkJcmV0dXJuIDA7CiAKIAkJZGV2X3dhcm4oJmRldi0+ZGV2LCAiY2FuJ3QgZmluZCBJUlEgZm9yIFBDSSBJTlQgJWMlc1xuIiwKLQkJCSAnQScgKyBwaW4sIG1zZyk7CisJCQkgJ0EnICsgcGluIC0gMSwgbXNnKTsKIAl9CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9wY2kvdmlzd3MuYyBiL2FyY2gveDg2L3BjaS92aXN3cy5jCmluZGV4IDE2ZDBjMGUuLmJjZWFkN2EgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3BjaS92aXN3cy5jCisrKyBiL2FyY2gveDg2L3BjaS92aXN3cy5jCkBAIC0yNCwyNCArMjQsNiBAQAogCiB1bnNpZ25lZCBpbnQgcGNpX2J1czAsIHBjaV9idXMxOwogCi1zdGF0aWMgaW5saW5lIHU4IGJyaWRnZV9zd2l6emxlKHU4IHBpbiwgdTggc2xvdCkgCi17Ci0JcmV0dXJuICgoKHBpbiAtIDEpICsgc2xvdCkgJSA0KSArIDE7Ci19Ci0KLXN0YXRpYyB1OCBfX2luaXQgdmlzd3Nfc3dpenpsZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCAqcGlucCkKLXsKLQl1OCBwaW4gPSAqcGlucDsKLQotCXdoaWxlIChkZXYtPmJ1cy0+c2VsZikgewkvKiBNb3ZlIHVwIHRoZSBjaGFpbiBvZiBicmlkZ2VzLiAqLwotCQlwaW4gPSBicmlkZ2Vfc3dpenpsZShwaW4sIFBDSV9TTE9UKGRldi0+ZGV2Zm4pKTsKLQkJZGV2ID0gZGV2LT5idXMtPnNlbGY7Ci0JfQotCSpwaW5wID0gcGluOwotCi0JcmV0dXJuIFBDSV9TTE9UKGRldi0+ZGV2Zm4pOwotfQotCiBzdGF0aWMgaW50IF9faW5pdCB2aXN3c19tYXBfaXJxKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKIHsKIAlpbnQgaXJxLCBidXMgPSBkZXYtPmJ1cy0+bnVtYmVyOwpAQCAtMTA2LDcgKzg4LDcgQEAKIAlyYXdfcGNpX29wcyA9ICZwY2lfZGlyZWN0X2NvbmYxOwogCXBjaV9zY2FuX2J1c193aXRoX3N5c2RhdGEocGNpX2J1czApOwogCXBjaV9zY2FuX2J1c193aXRoX3N5c2RhdGEocGNpX2J1czEpOwotCXBjaV9maXh1cF9pcnFzKHZpc3dzX3N3aXp6bGUsIHZpc3dzX21hcF9pcnEpOworCXBjaV9maXh1cF9pcnFzKHBjaV9jb21tb25fc3dpenpsZSwgdmlzd3NfbWFwX2lycSk7CiAJcGNpYmlvc19yZXNvdXJjZV9zdXJ2ZXkoKTsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2FyY2gveHRlbnNhL01ha2VmaWxlIGIvYXJjaC94dGVuc2EvTWFrZWZpbGUKaW5kZXggMDE1YjZiMi4uMWRhNTVmZSAxMDA2NDQKLS0tIGEvYXJjaC94dGVuc2EvTWFrZWZpbGUKKysrIGIvYXJjaC94dGVuc2EvTWFrZWZpbGUKQEAgLTMzLDYgKzMzLDE1IEBACiAKIEtCVUlMRF9DRkxBR1MgKz0gLXBpcGUgLW1sb25nY2FsbHMKIAordmFyZGlycyA6PSAkKHBhdHN1YnN0ICUsYXJjaC94dGVuc2EvdmFyaWFudHMvJS8sJCh2YXJpYW50LXkpKQorcGxmZGlycyA6PSAkKHBhdHN1YnN0ICUsYXJjaC94dGVuc2EvcGxhdGZvcm1zLyUvLCQocGxhdGZvcm0teSkpCisKK2lmZXEgKCQoS0JVSUxEX1NSQyksKQorS0JVSUxEX0NQUEZMQUdTICs9ICQocGF0c3Vic3QgJSwtSSVpbmNsdWRlLCQodmFyZGlycykgJChwbGZkaXJzKSkKK2Vsc2UKK0tCVUlMRF9DUFBGTEFHUyArPSAkKHBhdHN1YnN0ICUsLUkkKHNyY3RyZWUpLyVpbmNsdWRlLCQodmFyZGlycykgJChwbGZkaXJzKSkKK2VuZGlmCisKIEtCVUlMRF9ERUZDT05GSUcgOj0gaXNzX2RlZmNvbmZpZwogCiAjIHJhbWRpc2svaW5pdHJkIHN1cHBvcnQKQEAgLTY2LDIxICs3NSw2IEBACiAKIGJvb3QJCTo9IGFyY2gveHRlbnNhL2Jvb3QKIAotYXJjaGluYwkJOj0gaW5jbHVkZS9hc20teHRlbnNhCi0KLWFyY2hwcmVwYXJlOiAkKGFyY2hpbmMpLy5wbGF0Zm9ybQotCi0jIFVwZGF0ZSBwcm9jZXNzb3IgdmFyaWFudCBhbmQgcGxhdGZvcm0gc3ltbGlua3MgaWYgc29tZXRoaW5nIHdoaWNoIGFmZmVjdHMKLSMgdGhlbSBjaGFuZ2VkLgotCi0kKGFyY2hpbmMpLy5wbGF0Zm9ybTogJCh3aWxkY2FyZCBpbmNsdWRlL2NvbmZpZy9hcmNoLyouaCkgaW5jbHVkZS9jb25maWcvYXV0by5jb25mCi0JQGVjaG8gJyAgU1lNTElOSyAkKGFyY2hpbmMpL3ZhcmlhbnQgLT4gJChhcmNoaW5jKS92YXJpYW50LSQoVkFSSUFOVCknCi0JJChRKW1rZGlyIC1wICQoYXJjaGluYykKLQkkKFEpbG4gLWZzbiAkKHNyY3RyZWUpLyQoYXJjaGluYykvdmFyaWFudC0kKFZBUklBTlQpICQoYXJjaGluYykvdmFyaWFudAotCUBlY2hvICcgIFNZTUxJTksgJChhcmNoaW5jKS9wbGF0Zm9ybSAtPiAkKGFyY2hpbmMpL3BsYXRmb3JtLSQoUExBVEZPUk0pJwotCSQoUSlsbiAtZnNuICQoc3JjdHJlZSkvJChhcmNoaW5jKS9wbGF0Zm9ybS0kKFBMQVRGT1JNKSAkKGFyY2hpbmMpL3BsYXRmb3JtCi0JQHRvdWNoICRACi0KIAogYWxsOiB6SW1hZ2UKIApAQCAtODksMTAgKzgzLDYgQEAKIHpJbWFnZSB6SW1hZ2UuaW5pdHJkOiB2bWxpbnV4CiAJJChRKSQoTUFLRSkgJChidWlsZCk9JChib290KSAkQAogCi1DTEVBTl9GSUxFUwkrPSBhcmNoL3h0ZW5zYS92bWxpbnV4LmxkcyAgICAgICAgICAgICAgICAgICAgICBcCi0JCSAgICQoYXJjaGluYykvcGxhdGZvcm0gJChhcmNoaW5jKS92YXJpYW50CVwKLQkJICAgJChhcmNoaW5jKS8ucGxhdGZvcm0KLQogZGVmaW5lIGFyY2hoZWxwCiAgIEBlY2hvICcqIHpJbWFnZSAgICAgIC0gQ29tcHJlc3NlZCBrZXJuZWwgaW1hZ2UgKGFyY2gveHRlbnNhL2Jvb3QvaW1hZ2VzL3pJbWFnZS4qKScKIGVuZGVmCmRpZmYgLS1naXQgYS9hcmNoL3h0ZW5zYS9ib290L2Jvb3QtZWxmL2Jvb3QubGRzLlMgYi9hcmNoL3h0ZW5zYS9ib290L2Jvb3QtZWxmL2Jvb3QubGRzLlMKaW5kZXggODQ5ZGZjYS4uNGU1M2I3NCAxMDA2NDQKLS0tIGEvYXJjaC94dGVuc2EvYm9vdC9ib290LWVsZi9ib290Lmxkcy5TCisrKyBiL2FyY2gveHRlbnNhL2Jvb3QvYm9vdC1lbGYvYm9vdC5sZHMuUwpAQCAtMSw0ICsxLDQgQEAKLSNpbmNsdWRlIDxhc20vdmFyaWFudC9jb3JlLmg+CisjaW5jbHVkZSA8dmFyaWFudC9jb3JlLmg+CiBPVVRQVVRfQVJDSCh4dGVuc2EpCiBFTlRSWShfUmVzZXRWZWN0b3IpCiAKZGlmZiAtLWdpdCBhL2FyY2gveHRlbnNhL2Jvb3QvYm9vdC1yZWRib290L2Jvb3RzdHJhcC5TIGIvYXJjaC94dGVuc2EvYm9vdC9ib290LXJlZGJvb3QvYm9vdHN0cmFwLlMKaW5kZXggODQ4NDgxMi4uNTU4MmU4YyAxMDA2NDQKLS0tIGEvYXJjaC94dGVuc2EvYm9vdC9ib290LXJlZGJvb3QvYm9vdHN0cmFwLlMKKysrIGIvYXJjaC94dGVuc2EvYm9vdC9ib290LXJlZGJvb3QvYm9vdHN0cmFwLlMKQEAgLTEsNCArMSw0IEBACi0jaW5jbHVkZSA8YXNtL3ZhcmlhbnQvY29yZS5oPgorI2luY2x1ZGUgPHZhcmlhbnQvY29yZS5oPgogI2luY2x1ZGUgPGFzbS9yZWdzLmg+CiAjaW5jbHVkZSA8YXNtL2FzbW1hY3JvLmg+CiAjaW5jbHVkZSA8YXNtL2NhY2hlYXNtLmg+CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2EvS2J1aWxkIGIvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vS2J1aWxkCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS14dGVuc2EvS2J1aWxkCnJlbmFtZSB0byBhcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9LYnVpbGQKZGlmZiAtLWdpdCBhL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL2FzbW1hY3JvLmggYi9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9hc21tYWNyby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1NTMyMGYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9hc21tYWNyby5oCkBAIC0wLDAgKzEsMTUzIEBACisvKgorICogaW5jbHVkZS9hc20teHRlbnNhL2FzbW1hY3JvLmgKKyAqCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgVGVuc2lsaWNhIEluYy4KKyAqLworCisjaWZuZGVmIF9YVEVOU0FfQVNNTUFDUk9fSAorI2RlZmluZSBfWFRFTlNBX0FTTU1BQ1JPX0gKKworI2luY2x1ZGUgPHZhcmlhbnQvY29yZS5oPgorCisvKgorICogU29tZSBsaXR0bGUgaGVscGVycyBmb3IgbG9vcHMuIFVzZSB6ZXJvLW92ZXJoZWFkLWxvb3BzCisgKiB3aGVyZSBhcHBsaWNhYmxlIGFuZCBpZiBzdXBwb3J0ZWQgYnkgdGhlIHByb2Nlc3Nvci4KKyAqCisgKiBfX2xvb3BpIGFyLCBhdCwgc2l6ZSwgaW5jCisgKiAgICAgICAgIGFyCXJlZ2lzdGVyIGluaXRpYWxpemVkIHdpdGggdGhlIHN0YXJ0IGFkZHJlc3MKKyAqCSAgIGF0CXNjcmF0Y2ggcmVnaXN0ZXIgdXNlZCBieSBtYWNybworICoJICAgc2l6ZQlzaXplIGltbWVkaWF0ZSB2YWx1ZQorICoJICAgaW5jCWluY3JlbWVudAorICoKKyAqIF9fbG9vcHMgYXIsIGFzLCBhdCwgaW5jX2xvZzJbLCBtYXNrX2xvZzJdWywgY29uZF1bLCBuY29uZF0KKyAqCSAgIGFyCXJlZ2lzdGVyIGluaXRpYWxpemVkIHdpdGggdGhlIHN0YXJ0IGFkZHJlc3MKKyAqCSAgIGFzCXJlZ2lzdGVyIGluaXRpYWxpemVkIHdpdGggdGhlIHNpemUKKyAqCSAgIGF0CXNjcmF0Y2ggcmVnaXN0ZXIgdXNlIGJ5IG1hY3JvCisgKgkgICBpbmNfbG9nMglpbmNyZW1lbnQgW2luIGxvZzJdCisgKgkgICBtYXNrX2xvZzIJbWFzayBbaW4gbG9nMl0KKyAqCSAgIGNvbmQJCXRydWUgY29uZGl0aW9uICh1c2VkIGluIGxvb3AnY29uZCcpCisgKgkgICBuY29uZAlmYWxzZSBjb25kaXRpb24gKHVzZWQgaW4gYiduY29uZCcpCisgKgorICogX19sb29wICBhcworICoJICAgcmVzdGFydCBsb29wLiAnYXMnIHJlZ2lzdGVyIG11c3Qgbm90IGhhdmUgYmVlbiBtb2RpZmllZCEKKyAqCisgKiBfX2VuZGxhIGFyLCBhdCwgaW5jcgorICoJICAgYXIJc3RhcnQgYWRkcmVzcyAobW9kaWZpZWQpCisgKgkgICBhcwlzY3JhdGNoIHJlZ2lzdGVyIHVzZWQgYnkgbWFjcm8KKyAqCSAgIGluYwlpbmNyZW1lbnQKKyAqLworCisvKgorICogbG9vcCBmb3IgZ2l2ZW4gc2l6ZSBhcyBpbW1lZGlhdGUKKyAqLworCisJLm1hY3JvCV9fbG9vcGkgYXIsIGF0LCBzaXplLCBpbmNyCisKKyNpZiBYQ0hBTF9IQVZFX0xPT1BTCisJCW1vdmkJXGF0LCAoKFxzaXplICsgXGluY3IgLSAxKSAvIChcaW5jcikpCisJCWxvb3AJXGF0LCA5OWYKKyNlbHNlCisJCWFkZGkJXGF0LCBcYXIsIFxzaXplCisJCTk4OgorI2VuZGlmCisKKwkuZW5kbQorCisvKgorICogbG9vcCBmb3IgZ2l2ZW4gc2l6ZSBpbiByZWdpc3RlcgorICovCisKKwkubWFjcm8JX19sb29wcwlhciwgYXMsIGF0LCBpbmNyX2xvZzIsIG1hc2tfbG9nMiwgY29uZCwgbmNvbmQKKworI2lmIFhDSEFMX0hBVkVfTE9PUFMKKwkJLmlmZ3QgXGluY3JfbG9nMiAtIDEKKwkJCWFkZGkJXGF0LCBcYXMsICgxIDw8IFxpbmNyX2xvZzIpIC0gMQorCQkJLmlmbmMgXG1hc2tfbG9nMiwKKwkJCQlleHR1aQlcYXQsIFxhdCwgXGluY3JfbG9nMiwgXG1hc2tfbG9nMgorCQkJLmVsc2UKKwkJCQlzcmxpCVxhdCwgXGF0LCBcaW5jcl9sb2cyCisJCQkuZW5kaWYKKwkJLmVuZGlmCisJCWxvb3BcY29uZAlcYXQsIDk5ZgorI2Vsc2UKKwkJLmlmbmMgXG1hc2tfbG9nMiwKKwkJCWV4dHVpCVxhdCwgXGFzLCBcaW5jcl9sb2cyLCBcbWFza19sb2cyCisJCS5lbHNlCisJCQkuaWZuYyBcbmNvbmQsCisJCQkJc3JsaQlcYXQsIFxhcywgXGluY3JfbG9nMgorCQkJLmVuZGlmCisJCS5lbmRpZgorCQkuaWZuYyBcbmNvbmQsCisJCQliXG5jb25kCVxhdCwgOTlmCisKKwkJLmVuZGlmCisJCS5pZm5jIFxtYXNrX2xvZzIsCisJCQlzbGxpCVxhdCwgXGF0LCBcaW5jcl9sb2cyCisJCQlhZGQJXGF0LCBcYXIsIFxhdAorCQkuZWxzZQorCQkJYWRkCVxhdCwgXGFyLCBcYXMKKwkJLmVuZGlmCisjZW5kaWYKKwkJOTg6CisKKwkuZW5kbQorCisvKgorICogbG9vcCBmcm9tIGFyIHRvIGF4CisgKi8KKworCS5tYWNybwlfX2xvb3B0CWFyLCBhcywgYXQsIGluY3JfbG9nMgorCisjaWYgWENIQUxfSEFWRV9MT09QUworCQlzdWIJXGF0LCBcYXMsIFxhcgorCQkuaWZndAlcaW5jcl9sb2cyIC0gMQorCQkJYWRkaQlcYXQsIFxhdCwgKDEgPDwgXGluY3JfbG9nMikgLSAxCisJCQlzcmxpCVxhdCwgXGF0LCBcaW5jcl9sb2cyCisJCS5lbmRpZgorCQlsb29wCVxhdCwgOTlmCisjZWxzZQorCQk5ODoKKyNlbmRpZgorCisJLmVuZG0KKworLyoKKyAqIHJlc3RhcnQgbG9vcC4gcmVnaXN0ZXJzIG11c3QgYmUgdW5jaGFuZ2VkCisgKi8KKworCS5tYWNybwlfX2xvb3AJYXMKKworI2lmIFhDSEFMX0hBVkVfTE9PUFMKKwkJbG9vcAlcYXMsIDk5ZgorI2Vsc2UKKwkJOTg6CisjZW5kaWYKKworCS5lbmRtCisKKy8qCisgKiBlbmQgb2YgbG9vcCB3aXRoIG5vIGluY3JlbWVudCBvZiB0aGUgYWRkcmVzcy4KKyAqLworCisJLm1hY3JvCV9fZW5kbAlhciwgYXMKKyNpZiAhWENIQUxfSEFWRV9MT09QUworCQlibHR1CVxhciwgXGFzLCA5OGIKKyNlbmRpZgorCQk5OToKKwkuZW5kbQorCisvKgorICogZW5kIG9mIGxvb3Agd2l0aCBpbmNyZW1lbnQgb2YgdGhlIGFkZHJlc3MuCisgKi8KKworCS5tYWNybwlfX2VuZGxhCWFyLCBhcywgaW5jcgorCQlhZGRpCVxhciwgXGFyLCBcaW5jcgorCQlfX2VuZGwJXGFyIFxhcworCS5lbmRtCisKKworI2VuZGlmIC8qIF9YVEVOU0FfQVNNTUFDUk9fSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL2F0b21pYy5oIGIvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vYXRvbWljLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLXh0ZW5zYS9hdG9taWMuaApyZW5hbWUgdG8gYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vYXRvbWljLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9hdXh2ZWMuaCBiL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL2F1eHZlYy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS14dGVuc2EvYXV4dmVjLmgKcmVuYW1lIHRvIGFyY2gveHRlbnNhL2luY2x1ZGUvYXNtL2F1eHZlYy5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2EvYml0b3BzLmggYi9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9iaXRvcHMuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20teHRlbnNhL2JpdG9wcy5oCnJlbmFtZSB0byBhcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9iaXRvcHMuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL2Jvb3RwYXJhbS5oIGIvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vYm9vdHBhcmFtLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLXh0ZW5zYS9ib290cGFyYW0uaApyZW5hbWUgdG8gYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vYm9vdHBhcmFtLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9idWcuaCBiL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL2J1Zy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS14dGVuc2EvYnVnLmgKcmVuYW1lIHRvIGFyY2gveHRlbnNhL2luY2x1ZGUvYXNtL2J1Zy5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2EvYnVncy5oIGIvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vYnVncy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS14dGVuc2EvYnVncy5oCnJlbmFtZSB0byBhcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9idWdzLmgKZGlmZiAtLWdpdCBhL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL2J5dGVvcmRlci5oIGIvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vYnl0ZW9yZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTRlYjYzMQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL2J5dGVvcmRlci5oCkBAIC0wLDAgKzEsMTIgQEAKKyNpZm5kZWYgX1hURU5TQV9CWVRFT1JERVJfSAorI2RlZmluZSBfWFRFTlNBX0JZVEVPUkRFUl9ICisKKyNpZmRlZiBfX1hURU5TQV9FTF9fCisjaW5jbHVkZSA8bGludXgvYnl0ZW9yZGVyL2xpdHRsZV9lbmRpYW4uaD4KKyNlbGlmIGRlZmluZWQoX19YVEVOU0FfRUJfXykKKyNpbmNsdWRlIDxsaW51eC9ieXRlb3JkZXIvYmlnX2VuZGlhbi5oPgorI2Vsc2UKKyMgZXJyb3IgcHJvY2Vzc29yIGJ5dGUgb3JkZXIgdW5kZWZpbmVkIQorI2VuZGlmCisKKyNlbmRpZiAvKiBfWFRFTlNBX0JZVEVPUkRFUl9IICovCmRpZmYgLS1naXQgYS9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9jYWNoZS5oIGIvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vY2FjaGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDRjOTg5Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vY2FjaGUuaApAQCAtMCwwICsxLDMzIEBACisvKgorICogaW5jbHVkZS9hc20teHRlbnNhL2NhY2hlLmgKKyAqCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAoQykgMjAwMSAtIDIwMDUgVGVuc2lsaWNhIEluYy4KKyAqLworCisjaWZuZGVmIF9YVEVOU0FfQ0FDSEVfSAorI2RlZmluZSBfWFRFTlNBX0NBQ0hFX0gKKworI2luY2x1ZGUgPHZhcmlhbnQvY29yZS5oPgorCisjZGVmaW5lIEwxX0NBQ0hFX1NISUZUCVhDSEFMX0RDQUNIRV9MSU5FV0lEVEgKKyNkZWZpbmUgTDFfQ0FDSEVfQllURVMJWENIQUxfRENBQ0hFX0xJTkVTSVpFCisjZGVmaW5lIFNNUF9DQUNIRV9CWVRFUwlMMV9DQUNIRV9CWVRFUworCisjZGVmaW5lIERDQUNIRV9XQVlfU0laRQkoWENIQUxfRENBQ0hFX1NJWkUvWENIQUxfRENBQ0hFX1dBWVMpCisjZGVmaW5lIElDQUNIRV9XQVlfU0laRQkoWENIQUxfSUNBQ0hFX1NJWkUvWENIQUxfSUNBQ0hFX1dBWVMpCisjZGVmaW5lIERDQUNIRV9XQVlfU0hJRlQgKFhDSEFMX0RDQUNIRV9TRVRXSURUSCArIFhDSEFMX0RDQUNIRV9MSU5FV0lEVEgpCisjZGVmaW5lIElDQUNIRV9XQVlfU0hJRlQgKFhDSEFMX0lDQUNIRV9TRVRXSURUSCArIFhDSEFMX0lDQUNIRV9MSU5FV0lEVEgpCisKKy8qIE1heGltdW0gY2FjaGUgc2l6ZSBwZXIgd2F5LiAqLworI2lmIERDQUNIRV9XQVlfU0laRSA+PSBJQ0FDSEVfV0FZX1NJWkUKKyMgZGVmaW5lIENBQ0hFX1dBWV9TSVpFIERDQUNIRV9XQVlfU0laRQorI2Vsc2UKKyMgZGVmaW5lIENBQ0hFX1dBWV9TSVpFIElDQUNIRV9XQVlfU0laRQorI2VuZGlmCisKKworI2VuZGlmCS8qIF9YVEVOU0FfQ0FDSEVfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL2NhY2hlYXNtLmggYi9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9jYWNoZWFzbS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS14dGVuc2EvY2FjaGVhc20uaApyZW5hbWUgdG8gYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vY2FjaGVhc20uaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL2NhY2hlZmx1c2guaCBiL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL2NhY2hlZmx1c2guaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20teHRlbnNhL2NhY2hlZmx1c2guaApyZW5hbWUgdG8gYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vY2FjaGVmbHVzaC5oCmRpZmYgLS1naXQgYS9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9jaGVja3N1bS5oIGIvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vY2hlY2tzdW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODRkM2YwCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vY2hlY2tzdW0uaApAQCAtMCwwICsxLDI1MCBAQAorLyoKKyAqIGluY2x1ZGUvYXNtLXh0ZW5zYS9jaGVja3N1bS5oCisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxIC0gMjAwNSBUZW5zaWxpY2EgSW5jLgorICovCisKKyNpZm5kZWYgX1hURU5TQV9DSEVDS1NVTV9ICisjZGVmaW5lIF9YVEVOU0FfQ0hFQ0tTVU1fSAorCisjaW5jbHVkZSA8bGludXgvaW42Lmg+CisjaW5jbHVkZSA8dmFyaWFudC9jb3JlLmg+CisKKy8qCisgKiBjb21wdXRlcyB0aGUgY2hlY2tzdW0gb2YgYSBtZW1vcnkgYmxvY2sgYXQgYnVmZiwgbGVuZ3RoIGxlbiwKKyAqIGFuZCBhZGRzIGluICJzdW0iICgzMi1iaXQpCisgKgorICogcmV0dXJucyBhIDMyLWJpdCBudW1iZXIgc3VpdGFibGUgZm9yIGZlZWRpbmcgaW50byBpdHNlbGYKKyAqIG9yIGNzdW1fdGNwdWRwX21hZ2ljCisgKgorICogdGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCB3aXRoIGV2ZW4gbGVuZ3RocywgZXhjZXB0CisgKiBmb3IgdGhlIGxhc3QgZnJhZ21lbnQsIHdoaWNoIG1heSBiZSBvZGQKKyAqCisgKiBpdCdzIGJlc3QgdG8gaGF2ZSBidWZmIGFsaWduZWQgb24gYSAzMi1iaXQgYm91bmRhcnkKKyAqLworYXNtbGlua2FnZSBfX3dzdW0gY3N1bV9wYXJ0aWFsKGNvbnN0IHZvaWQgKmJ1ZmYsIGludCBsZW4sIF9fd3N1bSBzdW0pOworCisvKgorICogdGhlIHNhbWUgYXMgY3N1bV9wYXJ0aWFsLCBidXQgY29waWVzIGZyb20gc3JjIHdoaWxlIGl0CisgKiBjaGVja3N1bXMsIGFuZCBoYW5kbGVzIHVzZXItc3BhY2UgcG9pbnRlciBleGNlcHRpb25zIGNvcnJlY3RseSwgd2hlbiBuZWVkZWQuCisgKgorICogaGVyZSBldmVuIG1vcmUgaW1wb3J0YW50IHRvIGFsaWduIHNyYyBhbmQgZHN0IG9uIGEgMzItYml0IChvciBldmVuCisgKiBiZXR0ZXIgNjQtYml0KSBib3VuZGFyeQorICovCisKK2FzbWxpbmthZ2UgX193c3VtIGNzdW1fcGFydGlhbF9jb3B5X2dlbmVyaWMoY29uc3Qgdm9pZCAqc3JjLCB2b2lkICpkc3QsIGludCBsZW4sIF9fd3N1bSBzdW0sCisJCQkJCQkgICBpbnQgKnNyY19lcnJfcHRyLCBpbnQgKmRzdF9lcnJfcHRyKTsKKworLyoKKyAqCU5vdGU6IHdoZW4geW91IGdldCBhIE5VTEwgcG9pbnRlciBleGNlcHRpb24gaGVyZSB0aGlzIG1lYW5zIHNvbWVvbmUKKyAqCXBhc3NlZCBpbiBhbiBpbmNvcnJlY3Qga2VybmVsIGFkZHJlc3MgdG8gb25lIG9mIHRoZXNlIGZ1bmN0aW9ucy4KKyAqCisgKglJZiB5b3UgdXNlIHRoZXNlIGZ1bmN0aW9ucyBkaXJlY3RseSBwbGVhc2UgZG9uJ3QgZm9yZ2V0IHRoZSBhY2Nlc3Nfb2soKS4KKyAqLworc3RhdGljIGlubGluZQorX193c3VtIGNzdW1fcGFydGlhbF9jb3B5X25vY2hlY2soY29uc3Qgdm9pZCAqc3JjLCB2b2lkICpkc3QsCisJCQkJCWludCBsZW4sIF9fd3N1bSBzdW0pCit7CisJcmV0dXJuIGNzdW1fcGFydGlhbF9jb3B5X2dlbmVyaWMoc3JjLCBkc3QsIGxlbiwgc3VtLCBOVUxMLCBOVUxMKTsKK30KKworc3RhdGljIGlubGluZQorX193c3VtIGNzdW1fcGFydGlhbF9jb3B5X2Zyb21fdXNlcihjb25zdCB2b2lkIF9fdXNlciAqc3JjLCB2b2lkICpkc3QsCisJCQkJCQlpbnQgbGVuLCBfX3dzdW0gc3VtLCBpbnQgKmVycl9wdHIpCit7CisJcmV0dXJuIGNzdW1fcGFydGlhbF9jb3B5X2dlbmVyaWMoKF9fZm9yY2UgY29uc3Qgdm9pZCAqKXNyYywgZHN0LAorCQkJCQlsZW4sIHN1bSwgZXJyX3B0ciwgTlVMTCk7Cit9CisKKy8qCisgKglGb2xkIGEgcGFydGlhbCBjaGVja3N1bQorICovCisKK3N0YXRpYyBfX2lubGluZV9fIF9fc3VtMTYgY3N1bV9mb2xkKF9fd3N1bSBzdW0pCit7CisJdW5zaWduZWQgaW50IF9fZHVtbXk7CisJX19hc21fXygiZXh0dWkJJTEsICUwLCAxNiwgMTZcblx0IgorCQkiZXh0dWkJJTAgLCUwLCAwLCAxNlxuXHQiCisJCSJhZGQJJTAsICUwLCAlMVxuXHQiCisJCSJzbGxpCSUxLCAlMCwgMTZcblx0IgorCQkiYWRkCSUwLCAlMCwgJTFcblx0IgorCQkiZXh0dWkJJTAsICUwLCAxNiwgMTZcblx0IgorCQkibmVnCSUwLCAlMFxuXHQiCisJCSJhZGRpCSUwLCAlMCwgLTFcblx0IgorCQkiZXh0dWkJJTAsICUwLCAwLCAxNlxuXHQiCisJCTogIj1yIiAoc3VtKSwgIj0mciIgKF9fZHVtbXkpCisJCTogIjAiIChzdW0pKTsKKwlyZXR1cm4gKF9fZm9yY2UgX19zdW0xNilzdW07Cit9CisKKy8qCisgKglUaGlzIGlzIGEgdmVyc2lvbiBvZiBpcF9jb21wdXRlX2NzdW0oKSBvcHRpbWl6ZWQgZm9yIElQIGhlYWRlcnMsCisgKgl3aGljaCBhbHdheXMgY2hlY2tzdW0gb24gNCBvY3RldCBib3VuZGFyaWVzLgorICovCitzdGF0aWMgX19pbmxpbmVfXyBfX3N1bTE2IGlwX2Zhc3RfY3N1bShjb25zdCB2b2lkICppcGgsIHVuc2lnbmVkIGludCBpaGwpCit7CisJdW5zaWduZWQgaW50IHN1bSwgdG1wLCBlbmRhZGRyOworCisJX19hc21fXyBfX3ZvbGF0aWxlX18oCisJCSJzdWIJCSUwLCAlMCwgJTBcblx0IgorI2lmIFhDSEFMX0hBVkVfTE9PUFMKKwkJImxvb3BndHoJJTIsIDJmXG5cdCIKKyNlbHNlCisJCSJiZXF6CQklMiwgMmZcblx0IgorCQkic2xsaQkJJTQsICUyLCAyXG5cdCIKKwkJImFkZAkJJTQsICU0LCAlMVxuXHQiCisJCSIwOlx0IgorI2VuZGlmCisJCSJsMzJpCQklMywgJTEsIDBcblx0IgorCQkiYWRkCQklMCwgJTAsICUzXG5cdCIKKwkJImJnZXUJCSUwLCAlMywgMWZcblx0IgorCQkiYWRkaQkJJTAsICUwLCAxXG5cdCIKKwkJIjE6XHQiCisJCSJhZGRpCQklMSwgJTEsIDRcblx0IgorI2lmICFYQ0hBTF9IQVZFX0xPT1BTCisJCSJibHQJCSUxLCAlNCwgMGJcblx0IgorI2VuZGlmCisJCSIyOlx0IgorCS8qIFNpbmNlIHRoZSBpbnB1dCByZWdpc3RlcnMgd2hpY2ggYXJlIGxvYWRlZCB3aXRoIGlwaCBhbmQgaWhsCisJICAgYXJlIG1vZGlmaWVkLCB3ZSBtdXN0IGFsc28gc3BlY2lmeSB0aGVtIGFzIG91dHB1dHMsIG9yIGdjYworCSAgIHdpbGwgYXNzdW1lIHRoZXkgY29udGFpbiB0aGVpciBvcmlnaW5hbCB2YWx1ZXMuICovCisJCTogIj1yIiAoc3VtKSwgIj1yIiAoaXBoKSwgIj1yIiAoaWhsKSwgIj0mciIgKHRtcCksICI9JnIiIChlbmRhZGRyKQorCQk6ICIxIiAoaXBoKSwgIjIiIChpaGwpKTsKKworCXJldHVybgljc3VtX2ZvbGQoc3VtKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX193c3VtIGNzdW1fdGNwdWRwX25vZm9sZChfX2JlMzIgc2FkZHIsIF9fYmUzMiBkYWRkciwKKwkJCQkJCSAgIHVuc2lnbmVkIHNob3J0IGxlbiwKKwkJCQkJCSAgIHVuc2lnbmVkIHNob3J0IHByb3RvLAorCQkJCQkJICAgX193c3VtIHN1bSkKK3sKKworI2lmZGVmIF9fWFRFTlNBX0VMX18KKwl1bnNpZ25lZCBsb25nIGxlbl9wcm90byA9IChsZW4gKyBwcm90bykgPDwgODsKKyNlbGlmIGRlZmluZWQoX19YVEVOU0FfRUJfXykKKwl1bnNpZ25lZCBsb25nIGxlbl9wcm90byA9IGxlbiArIHByb3RvOworI2Vsc2UKKyMgZXJyb3IgcHJvY2Vzc29yIGJ5dGUgb3JkZXIgdW5kZWZpbmVkIQorI2VuZGlmCisJX19hc21fXygiYWRkCSUwLCAlMCwgJTFcblx0IgorCQkiYmdldQklMCwgJTEsIDFmXG5cdCIKKwkJImFkZGkJJTAsICUwLCAxXG5cdCIKKwkJIjE6XHQiCisJCSJhZGQJJTAsICUwLCAlMlxuXHQiCisJCSJiZ2V1CSUwLCAlMiwgMWZcblx0IgorCQkiYWRkaQklMCwgJTAsIDFcblx0IgorCQkiMTpcdCIKKwkJImFkZAklMCwgJTAsICUzXG5cdCIKKwkJImJnZXUJJTAsICUzLCAxZlxuXHQiCisJCSJhZGRpCSUwLCAlMCwgMVxuXHQiCisJCSIxOlx0IgorCQk6ICI9ciIgKHN1bSksICI9ciIgKGxlbl9wcm90bykKKwkJOiAiciIgKGRhZGRyKSwgInIiIChzYWRkciksICIxIiAobGVuX3Byb3RvKSwgIjAiIChzdW0pKTsKKwlyZXR1cm4gc3VtOworfQorCisvKgorICogY29tcHV0ZXMgdGhlIGNoZWNrc3VtIG9mIHRoZSBUQ1AvVURQIHBzZXVkby1oZWFkZXIKKyAqIHJldHVybnMgYSAxNi1iaXQgY2hlY2tzdW0sIGFscmVhZHkgY29tcGxlbWVudGVkCisgKi8KK3N0YXRpYyBfX2lubGluZV9fIF9fc3VtMTYgY3N1bV90Y3B1ZHBfbWFnaWMoX19iZTMyIHNhZGRyLCBfX2JlMzIgZGFkZHIsCisJCQkJCQkgICAgICAgdW5zaWduZWQgc2hvcnQgbGVuLAorCQkJCQkJICAgICAgIHVuc2lnbmVkIHNob3J0IHByb3RvLAorCQkJCQkJICAgICAgIF9fd3N1bSBzdW0pCit7CisJcmV0dXJuIGNzdW1fZm9sZChjc3VtX3RjcHVkcF9ub2ZvbGQoc2FkZHIsZGFkZHIsbGVuLHByb3RvLHN1bSkpOworfQorCisvKgorICogdGhpcyByb3V0aW5lIGlzIHVzZWQgZm9yIG1pc2NlbGxhbmVvdXMgSVAtbGlrZSBjaGVja3N1bXMsIG1haW5seQorICogaW4gaWNtcC5jCisgKi8KKworc3RhdGljIF9faW5saW5lX18gX19zdW0xNiBpcF9jb21wdXRlX2NzdW0oY29uc3Qgdm9pZCAqYnVmZiwgaW50IGxlbikKK3sKKyAgICByZXR1cm4gY3N1bV9mb2xkIChjc3VtX3BhcnRpYWwoYnVmZiwgbGVuLCAwKSk7Cit9CisKKyNkZWZpbmUgX0hBVkVfQVJDSF9JUFY2X0NTVU0KK3N0YXRpYyBfX2lubGluZV9fIF9fc3VtMTYgY3N1bV9pcHY2X21hZ2ljKGNvbnN0IHN0cnVjdCBpbjZfYWRkciAqc2FkZHIsCisJCQkJCSAgY29uc3Qgc3RydWN0IGluNl9hZGRyICpkYWRkciwKKwkJCQkJICBfX3UzMiBsZW4sIHVuc2lnbmVkIHNob3J0IHByb3RvLAorCQkJCQkgIF9fd3N1bSBzdW0pCit7CisJdW5zaWduZWQgaW50IF9fZHVtbXk7CisJX19hc21fXygibDMyaQklMSwgJTIsIDBcblx0IgorCQkiYWRkCSUwLCAlMCwgJTFcblx0IgorCQkiYmdldQklMCwgJTEsIDFmXG5cdCIKKwkJImFkZGkJJTAsICUwLCAxXG5cdCIKKwkJIjE6XHQiCisJCSJsMzJpCSUxLCAlMiwgNFxuXHQiCisJCSJhZGQJJTAsICUwLCAlMVxuXHQiCisJCSJiZ2V1CSUwLCAlMSwgMWZcblx0IgorCQkiYWRkaQklMCwgJTAsIDFcblx0IgorCQkiMTpcdCIKKwkJImwzMmkJJTEsICUyLCA4XG5cdCIKKwkJImFkZAklMCwgJTAsICUxXG5cdCIKKwkJImJnZXUJJTAsICUxLCAxZlxuXHQiCisJCSJhZGRpCSUwLCAlMCwgMVxuXHQiCisJCSIxOlx0IgorCQkibDMyaQklMSwgJTIsIDEyXG5cdCIKKwkJImFkZAklMCwgJTAsICUxXG5cdCIKKwkJImJnZXUJJTAsICUxLCAxZlxuXHQiCisJCSJhZGRpCSUwLCAlMCwgMVxuXHQiCisJCSIxOlx0IgorCQkibDMyaQklMSwgJTMsIDBcblx0IgorCQkiYWRkCSUwLCAlMCwgJTFcblx0IgorCQkiYmdldQklMCwgJTEsIDFmXG5cdCIKKwkJImFkZGkJJTAsICUwLCAxXG5cdCIKKwkJIjE6XHQiCisJCSJsMzJpCSUxLCAlMywgNFxuXHQiCisJCSJhZGQJJTAsICUwLCAlMVxuXHQiCisJCSJiZ2V1CSUwLCAlMSwgMWZcblx0IgorCQkiYWRkaQklMCwgJTAsIDFcblx0IgorCQkiMTpcdCIKKwkJImwzMmkJJTEsICUzLCA4XG5cdCIKKwkJImFkZAklMCwgJTAsICUxXG5cdCIKKwkJImJnZXUJJTAsICUxLCAxZlxuXHQiCisJCSJhZGRpCSUwLCAlMCwgMVxuXHQiCisJCSIxOlx0IgorCQkibDMyaQklMSwgJTMsIDEyXG5cdCIKKwkJImFkZAklMCwgJTAsICUxXG5cdCIKKwkJImJnZXUJJTAsICUxLCAxZlxuXHQiCisJCSJhZGRpCSUwLCAlMCwgMVxuXHQiCisJCSIxOlx0IgorCQkiYWRkCSUwLCAlMCwgJTRcblx0IgorCQkiYmdldQklMCwgJTQsIDFmXG5cdCIKKwkJImFkZGkJJTAsICUwLCAxXG5cdCIKKwkJIjE6XHQiCisJCSJhZGQJJTAsICUwLCAlNVxuXHQiCisJCSJiZ2V1CSUwLCAlNSwgMWZcblx0IgorCQkiYWRkaQklMCwgJTAsIDFcblx0IgorCQkiMTpcdCIKKwkJOiAiPXIiIChzdW0pLCAiPSZyIiAoX19kdW1teSkKKwkJOiAiciIgKHNhZGRyKSwgInIiIChkYWRkciksCisJCSAgInIiIChodG9ubChsZW4pKSwgInIiIChodG9ubChwcm90bykpLCAiMCIgKHN1bSkpOworCisJcmV0dXJuIGNzdW1fZm9sZChzdW0pOworfQorCisvKgorICoJQ29weSBhbmQgY2hlY2tzdW0gdG8gdXNlcgorICovCisjZGVmaW5lIEhBVkVfQ1NVTV9DT1BZX1VTRVIKK3N0YXRpYyBfX2lubGluZV9fIF9fd3N1bSBjc3VtX2FuZF9jb3B5X3RvX3VzZXIoY29uc3Qgdm9pZCAqc3JjLCB2b2lkIF9fdXNlciAqZHN0LAorCQkJCSAgICBpbnQgbGVuLCBfX3dzdW0gc3VtLCBpbnQgKmVycl9wdHIpCit7CisJaWYgKGFjY2Vzc19vayhWRVJJRllfV1JJVEUsIGRzdCwgbGVuKSkKKwkJcmV0dXJuIGNzdW1fcGFydGlhbF9jb3B5X2dlbmVyaWMoc3JjLCBkc3QsIGxlbiwgc3VtLCBOVUxMLCBlcnJfcHRyKTsKKworCWlmIChsZW4pCisJCSplcnJfcHRyID0gLUVGQVVMVDsKKworCXJldHVybiAoX19mb3JjZSBfX3dzdW0pLTE7IC8qIGludmFsaWQgY2hlY2tzdW0gKi8KK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vY29wcm9jZXNzb3IuaCBiL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL2NvcHJvY2Vzc29yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjVhMjg1ZAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL2NvcHJvY2Vzc29yLmgKQEAgLTAsMCArMSwxNzcgQEAKKy8qCisgKiBpbmNsdWRlL2FzbS14dGVuc2EvY29wcm9jZXNzb3IuaAorICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMyAtIDIwMDcgVGVuc2lsaWNhIEluYy4KKyAqLworCisKKyNpZm5kZWYgX1hURU5TQV9DT1BST0NFU1NPUl9ICisjZGVmaW5lIF9YVEVOU0FfQ09QUk9DRVNTT1JfSAorCisjaW5jbHVkZSA8bGludXgvc3RyaW5naWZ5Lmg+CisjaW5jbHVkZSA8dmFyaWFudC90aWUuaD4KKyNpbmNsdWRlIDxhc20vdHlwZXMuaD4KKworI2lmZGVmIF9fQVNTRU1CTFlfXworIyBpbmNsdWRlIDx2YXJpYW50L3RpZS1hc20uaD4KKworLm1hY3JvCXhjaGFsX3NhX3N0YXJ0ICBhIGIKKwkuc2V0IC5MeGNoYWxfcG9mc18sIDAKKwkuc2V0IC5MeGNoYWxfb2ZzXywgMAorLmVuZG0KKworLm1hY3JvCXhjaGFsX3NhX2FsaWduICBwdHIgbWlub2ZzIG1heG9mcyBvZnNhbGlnbiB0b3RhbGlnbgorCS5zZXQJLkx4Y2hhbF9vZnNfLCAuTHhjaGFsX29mc18gKyAuTHhjaGFsX3BvZnNfICsgXHRvdGFsaWduIC0gMQorCS5zZXQJLkx4Y2hhbF9vZnNfLCAoLkx4Y2hhbF9vZnNfICYgLVx0b3RhbGlnbikgLSAuTHhjaGFsX3BvZnNfCisuZW5kbQorCisjZGVmaW5lIF9TRUxFQ1QJKCAgWFRIQUxfU0FTX1RJRSB8IFhUSEFMX1NBU19PUFQgXAorCQkgfCBYVEhBTF9TQVNfQ0MgXAorCQkgfCBYVEhBTF9TQVNfQ0FMUiB8IFhUSEFMX1NBU19DQUxFICkKKworLm1hY3JvIHNhdmVfeHRyZWdzX29wdCBwdHIgY2xiIGF0MSBhdDIgYXQzIGF0NCBvZmZzZXQKKwkuaWYgWFRSRUdTX09QVF9TSVpFID4gMAorCQlhZGRpCVxjbGIsIFxwdHIsIFxvZmZzZXQKKwkJeGNoYWxfbmNwX3N0b3JlIFxjbGIgXGF0MSBcYXQyIFxhdDMgXGF0NCBzZWxlY3Q9X1NFTEVDVAorCS5lbmRpZgorLmVuZG0KKworLm1hY3JvIGxvYWRfeHRyZWdzX29wdCBwdHIgY2xiIGF0MSBhdDIgYXQzIGF0NCBvZmZzZXQKKwkuaWYgWFRSRUdTX09QVF9TSVpFID4gMAorCQlhZGRpCVxjbGIsIFxwdHIsIFxvZmZzZXQKKwkJeGNoYWxfbmNwX2xvYWQgXGNsYiBcYXQxIFxhdDIgXGF0MyBcYXQ0IHNlbGVjdD1fU0VMRUNUCisJLmVuZGlmCisuZW5kbQorI3VuZGVmIF9TRUxFQ1QKKworI2RlZmluZSBfU0VMRUNUCSggIFhUSEFMX1NBU19USUUgfCBYVEhBTF9TQVNfT1BUIFwKKwkJIHwgWFRIQUxfU0FTX05PQ0MgXAorCQkgfCBYVEhBTF9TQVNfQ0FMUiB8IFhUSEFMX1NBU19DQUxFIHwgWFRIQUxfU0FTX0dMT0IgKQorCisubWFjcm8gc2F2ZV94dHJlZ3NfdXNlciBwdHIgY2xiIGF0MSBhdDIgYXQzIGF0NCBvZmZzZXQKKwkuaWYgWFRSRUdTX1VTRVJfU0laRSA+IDAKKwkJYWRkaQlcY2xiLCBccHRyLCBcb2Zmc2V0CisJCXhjaGFsX25jcF9zdG9yZSBcY2xiIFxhdDEgXGF0MiBcYXQzIFxhdDQgc2VsZWN0PV9TRUxFQ1QKKwkuZW5kaWYKKy5lbmRtCisKKy5tYWNybyBsb2FkX3h0cmVnc191c2VyIHB0ciBjbGIgYXQxIGF0MiBhdDMgYXQ0IG9mZnNldAorCS5pZiBYVFJFR1NfVVNFUl9TSVpFID4gMAorCQlhZGRpCVxjbGIsIFxwdHIsIFxvZmZzZXQKKwkJeGNoYWxfbmNwX2xvYWQgXGNsYiBcYXQxIFxhdDIgXGF0MyBcYXQ0IHNlbGVjdD1fU0VMRUNUCisJLmVuZGlmCisuZW5kbQorI3VuZGVmIF9TRUxFQ1QKKworCisKKyNlbmRpZgkvKiBfX0FTU0VNQkxZX18gKi8KKworLyoKKyAqIFhURU5TQV9IQVZFX0NPUFJPQ0VTU09SKHgpIHJldHVybnMgMSBpZiBjb3Byb2Nlc3NvciB4IGlzIGNvbmZpZ3VyZWQuCisgKgorICogWFRFTlNBX0hBVkVfSU9fUE9SVCh4KSByZXR1cm5zIDEgaWYgaW8tcG9ydCB4IGlzIGNvbmZpZ3VyZWQuCisgKgorICovCisKKyNkZWZpbmUgWFRFTlNBX0hBVkVfQ09QUk9DRVNTT1IoeCkJCQkJCVwKKwkoKFhDSEFMX0NQX01BU0sgXiBYQ0hBTF9DUF9QT1JUX01BU0spICYgKDEgPDwgKHgpKSkKKyNkZWZpbmUgWFRFTlNBX0hBVkVfQ09QUk9DRVNTT1JTCQkJCQlcCisJKFhDSEFMX0NQX01BU0sgXiBYQ0hBTF9DUF9QT1JUX01BU0spCisjZGVmaW5lIFhURU5TQV9IQVZFX0lPX1BPUlQoeCkJCQkJCQlcCisJKFhDSEFMX0NQX1BPUlRfTUFTSyAmICgxIDw8ICh4KSkpCisjZGVmaW5lIFhURU5TQV9IQVZFX0lPX1BPUlRTCQkJCQkJXAorCVhDSEFMX0NQX1BPUlRfTUFTSworCisjaWZuZGVmIF9fQVNTRU1CTFlfXworCisKKyNpZiBYQ0hBTF9IQVZFX0NQCisKKyNkZWZpbmUgUlNSX0NQRU5BQkxFKHgpCWRvIHsJCQkJCQkgIFwKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygicnNyICUwLCIgX19zdHJpbmdpZnkoQ1BFTkFCTEUpIDogIj1hIiAoeCkpOyBcCisJfSB3aGlsZSgwKTsKKyNkZWZpbmUgV1NSX0NQRU5BQkxFKHgpCWRvIHsJCQkJCQkgIFwKKyAgCV9fYXNtX18gX192b2xhdGlsZV9fKCJ3c3IgJTAsIiBfX3N0cmluZ2lmeShDUEVOQUJMRSkgIjsgcnN5bmMiIAkgIFwKKwkgICAgCQkgICAgIDo6ICJhIiAoeCkpOwkJCQkgIFwKKwl9IHdoaWxlKDApOworCisjZW5kaWYgLyogWENIQUxfSEFWRV9DUCAqLworCisKKy8qCisgKiBBZGRpdGlvbmFsIHJlZ2lzdGVycy4KKyAqIFdlIGRlZmluZSB0aHJlZSB0eXBlcyBvZiBhZGRpdGlvbmFsIHJlZ2lzdGVyczoKKyAqICBleHQ6IGV4dHJhIHJlZ2lzdGVycyB0aGF0IGFyZSB1c2VkIGJ5IHRoZSBjb21waWxlcgorICogIGNwbjogb3B0aW9uYWwgcmVnaXN0ZXJzIHRoYXQgY2FuIGJlIHVzZWQgYnkgYSB1c2VyIGFwcGxpY2F0aW9uCisgKiAgY3BYOiBjb3Byb2Nlc3NvciByZWdpc3RlcnMgdGhhdCBjYW4gb25seSBiZSB1c2VkIGlmIHRoZSBjb3JyZXNwb25kaW5nCisgKiAgICAgICBDUEVOQUJMRSBiaXQgaXMgc2V0LgorICovCisKKyNkZWZpbmUgWENIQUxfU0FfUkVHKGxpc3QsY2MsYWJpLHR5cGUseSxuYW1lLHosYWxpZ24sc2l6ZSwuLi4pCVwKKwlfX1JFRyAjIyBsaXN0IChjYywgYWJpLCB0eXBlLCBuYW1lLCBzaXplLCBhbGlnbikKKworI2RlZmluZSBfX1JFRzAoY2MsYWJpLHQsbmFtZSxzLGEpCV9fUkVHMF8gIyMgY2MgKGFiaSxuYW1lKQorI2RlZmluZSBfX1JFRzEoY2MsYWJpLHQsbmFtZSxzLGEpCV9fUkVHMV8gIyMgY2MgKG5hbWUpCisjZGVmaW5lIF9fUkVHMihjYyxhYmksdHlwZSwuLi4pCQlfX1JFRzJfICMjIHR5cGUgKF9fVkFfQVJHU19fKQorCisjZGVmaW5lIF9fUkVHMF8wKGFiaSxuYW1lKQorI2RlZmluZSBfX1JFRzBfMShhYmksbmFtZSkJCV9fUkVHMF8xICMjIGFiaSAobmFtZSkKKyNkZWZpbmUgX19SRUcwXzEwKG5hbWUpCV9fdTMyIG5hbWU7CisjZGVmaW5lIF9fUkVHMF8xMShuYW1lKQlfX3UzMiBuYW1lOworI2RlZmluZSBfX1JFRzBfMTIobmFtZSkKKworI2RlZmluZSBfX1JFRzFfMChuYW1lKQlfX3UzMiBuYW1lOworI2RlZmluZSBfX1JFRzFfMShuYW1lKQorCisjZGVmaW5lIF9fUkVHMl8wKG4scyxhKQlfX3UzMiBuYW1lOworI2RlZmluZSBfX1JFRzJfMShuLHMsYSkJdW5zaWduZWQgY2hhciBuW3NdIF9fYXR0cmlidXRlX18gKChhbGlnbmVkKGEpKSk7CisjZGVmaW5lIF9fUkVHMl8yKG4scyxhKSB1bnNpZ25lZCBjaGFyIG5bc10gX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQoYSkpKTsKKwordHlwZWRlZiBzdHJ1Y3QgeyBYQ0hBTF9OQ1BfU0FfTElTVCgwKSB9IHh0cmVnc19vcHRfdAorCV9fYXR0cmlidXRlX18gKChhbGlnbmVkIChYQ0hBTF9OQ1BfU0FfQUxJR04pKSk7Cit0eXBlZGVmIHN0cnVjdCB7IFhDSEFMX05DUF9TQV9MSVNUKDEpIH0geHRyZWdzX3VzZXJfdAorCV9fYXR0cmlidXRlX18gKChhbGlnbmVkIChYQ0hBTF9OQ1BfU0FfQUxJR04pKSk7CisKKyNpZiBYVEVOU0FfSEFWRV9DT1BST0NFU1NPUlMKKwordHlwZWRlZiBzdHJ1Y3QgeyBYQ0hBTF9DUDBfU0FfTElTVCgyKSB9IHh0cmVnc19jcDBfdAorCV9fYXR0cmlidXRlX18gKChhbGlnbmVkIChYQ0hBTF9DUDBfU0FfQUxJR04pKSk7Cit0eXBlZGVmIHN0cnVjdCB7IFhDSEFMX0NQMV9TQV9MSVNUKDIpIH0geHRyZWdzX2NwMV90CisJX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQgKFhDSEFMX0NQMV9TQV9BTElHTikpKTsKK3R5cGVkZWYgc3RydWN0IHsgWENIQUxfQ1AyX1NBX0xJU1QoMikgfSB4dHJlZ3NfY3AyX3QKKwlfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCAoWENIQUxfQ1AyX1NBX0FMSUdOKSkpOwordHlwZWRlZiBzdHJ1Y3QgeyBYQ0hBTF9DUDNfU0FfTElTVCgyKSB9IHh0cmVnc19jcDNfdAorCV9fYXR0cmlidXRlX18gKChhbGlnbmVkIChYQ0hBTF9DUDNfU0FfQUxJR04pKSk7Cit0eXBlZGVmIHN0cnVjdCB7IFhDSEFMX0NQNF9TQV9MSVNUKDIpIH0geHRyZWdzX2NwNF90CisJX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQgKFhDSEFMX0NQNF9TQV9BTElHTikpKTsKK3R5cGVkZWYgc3RydWN0IHsgWENIQUxfQ1A1X1NBX0xJU1QoMikgfSB4dHJlZ3NfY3A1X3QKKwlfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCAoWENIQUxfQ1A1X1NBX0FMSUdOKSkpOwordHlwZWRlZiBzdHJ1Y3QgeyBYQ0hBTF9DUDZfU0FfTElTVCgyKSB9IHh0cmVnc19jcDZfdAorCV9fYXR0cmlidXRlX18gKChhbGlnbmVkIChYQ0hBTF9DUDZfU0FfQUxJR04pKSk7Cit0eXBlZGVmIHN0cnVjdCB7IFhDSEFMX0NQN19TQV9MSVNUKDIpIH0geHRyZWdzX2NwN190CisJX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQgKFhDSEFMX0NQN19TQV9BTElHTikpKTsKKworZXh0ZXJuIHN0cnVjdCB0aHJlYWRfaW5mbyogY29wcm9jZXNzb3Jfb3duZXJbWENIQUxfQ1BfTUFYXTsKK2V4dGVybiB2b2lkIGNvcHJvY2Vzc29yX3NhdmUodm9pZCosIGludCk7CitleHRlcm4gdm9pZCBjb3Byb2Nlc3Nvcl9sb2FkKHZvaWQqLCBpbnQpOworZXh0ZXJuIHZvaWQgY29wcm9jZXNzb3JfZmx1c2goc3RydWN0IHRocmVhZF9pbmZvKiwgaW50KTsKK2V4dGVybiB2b2lkIGNvcHJvY2Vzc29yX3Jlc3RvcmUoc3RydWN0IHRocmVhZF9pbmZvKiwgaW50KTsKKworZXh0ZXJuIHZvaWQgY29wcm9jZXNzb3JfcmVsZWFzZV9hbGwoc3RydWN0IHRocmVhZF9pbmZvKik7CitleHRlcm4gdm9pZCBjb3Byb2Nlc3Nvcl9mbHVzaF9hbGwoc3RydWN0IHRocmVhZF9pbmZvKik7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjb3Byb2Nlc3Nvcl9jbGVhcl9jcGVuYWJsZSh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgaSA9IDA7CisJV1NSX0NQRU5BQkxFKGkpOworfQorCisjZW5kaWYJLyogWFRFTlNBX0hBVkVfQ09QUk9DRVNTT1JTICovCisKKyNlbmRpZgkvKiAhX19BU1NFTUJMWV9fICovCisjZW5kaWYJLyogX1hURU5TQV9DT1BST0NFU1NPUl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2EvY3B1bWFzay5oIGIvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vY3B1bWFzay5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS14dGVuc2EvY3B1bWFzay5oCnJlbmFtZSB0byBhcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9jcHVtYXNrLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9jcHV0aW1lLmggYi9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9jcHV0aW1lLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLXh0ZW5zYS9jcHV0aW1lLmgKcmVuYW1lIHRvIGFyY2gveHRlbnNhL2luY2x1ZGUvYXNtL2NwdXRpbWUuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL2N1cnJlbnQuaCBiL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL2N1cnJlbnQuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20teHRlbnNhL2N1cnJlbnQuaApyZW5hbWUgdG8gYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vY3VycmVudC5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2EvZGVsYXkuaCBiL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL2RlbGF5LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLXh0ZW5zYS9kZWxheS5oCnJlbmFtZSB0byBhcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9kZWxheS5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2EvZGV2aWNlLmggYi9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9kZXZpY2UuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20teHRlbnNhL2RldmljZS5oCnJlbmFtZSB0byBhcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9kZXZpY2UuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL2RpdjY0LmggYi9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9kaXY2NC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS14dGVuc2EvZGl2NjQuaApyZW5hbWUgdG8gYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vZGl2NjQuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL2RtYS1tYXBwaW5nLmggYi9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9kbWEtbWFwcGluZy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS14dGVuc2EvZG1hLW1hcHBpbmcuaApyZW5hbWUgdG8gYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vZG1hLW1hcHBpbmcuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL2RtYS5oIGIvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vZG1hLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLXh0ZW5zYS9kbWEuaApyZW5hbWUgdG8gYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vZG1hLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9lbGYuaCBiL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL2VsZi5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS14dGVuc2EvZWxmLmgKcmVuYW1lIHRvIGFyY2gveHRlbnNhL2luY2x1ZGUvYXNtL2VsZi5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2EvZW1lcmdlbmN5LXJlc3RhcnQuaCBiL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL2VtZXJnZW5jeS1yZXN0YXJ0LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLXh0ZW5zYS9lbWVyZ2VuY3ktcmVzdGFydC5oCnJlbmFtZSB0byBhcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9lbWVyZ2VuY3ktcmVzdGFydC5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2EvZXJybm8uaCBiL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL2Vycm5vLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLXh0ZW5zYS9lcnJuby5oCnJlbmFtZSB0byBhcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9lcnJuby5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2EvZmIuaCBiL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL2ZiLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLXh0ZW5zYS9mYi5oCnJlbmFtZSB0byBhcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9mYi5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2EvZmNudGwuaCBiL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL2ZjbnRsLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLXh0ZW5zYS9mY250bC5oCnJlbmFtZSB0byBhcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9mY250bC5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2EvZnV0ZXguaCBiL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL2Z1dGV4LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLXh0ZW5zYS9mdXRleC5oCnJlbmFtZSB0byBhcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9mdXRleC5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2EvaGFyZGlycS5oIGIvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vaGFyZGlycS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS14dGVuc2EvaGFyZGlycS5oCnJlbmFtZSB0byBhcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9oYXJkaXJxLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9oaWdobWVtLmggYi9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9oaWdobWVtLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLXh0ZW5zYS9oaWdobWVtLmgKcmVuYW1lIHRvIGFyY2gveHRlbnNhL2luY2x1ZGUvYXNtL2hpZ2htZW0uaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL2h3X2lycS5oIGIvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vaHdfaXJxLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLXh0ZW5zYS9od19pcnEuaApyZW5hbWUgdG8gYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vaHdfaXJxLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9pby5oIGIvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vaW8uaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20teHRlbnNhL2lvLmgKcmVuYW1lIHRvIGFyY2gveHRlbnNhL2luY2x1ZGUvYXNtL2lvLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9pb2N0bC5oIGIvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vaW9jdGwuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20teHRlbnNhL2lvY3RsLmgKcmVuYW1lIHRvIGFyY2gveHRlbnNhL2luY2x1ZGUvYXNtL2lvY3RsLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9pb2N0bHMuaCBiL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL2lvY3Rscy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS14dGVuc2EvaW9jdGxzLmgKcmVuYW1lIHRvIGFyY2gveHRlbnNhL2luY2x1ZGUvYXNtL2lvY3Rscy5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2EvaXBjYnVmLmggYi9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9pcGNidWYuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20teHRlbnNhL2lwY2J1Zi5oCnJlbmFtZSB0byBhcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9pcGNidWYuaApkaWZmIC0tZ2l0IGEvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vaXJxLmggYi9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9pcnEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjIwZDFlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vaXJxLmgKQEAgLTAsMCArMSwzMCBAQAorLyoKKyAqIGluY2x1ZGUvYXNtLXh0ZW5zYS9pcnEuaAorICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMSAtIDIwMDUgVGVuc2lsaWNhIEluYy4KKyAqLworCisjaWZuZGVmIF9YVEVOU0FfSVJRX0gKKyNkZWZpbmUgX1hURU5TQV9JUlFfSAorCisjaW5jbHVkZSA8cGxhdGZvcm0vaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDx2YXJpYW50L2NvcmUuaD4KKworI2lmbmRlZiBQTEFURk9STV9OUl9JUlFTCisjIGRlZmluZSBQTEFURk9STV9OUl9JUlFTIDAKKyNlbmRpZgorI2RlZmluZSBYVEVOU0FfTlJfSVJRUyBYQ0hBTF9OVU1fSU5URVJSVVBUUworI2RlZmluZSBOUl9JUlFTIChYVEVOU0FfTlJfSVJRUyArIFBMQVRGT1JNX05SX0lSUVMpCisKK3N0YXRpYyBfX2lubGluZV9fIGludCBpcnFfY2Fub25pY2FsaXplKGludCBpcnEpCit7CisJcmV0dXJuIChpcnEpOworfQorCitzdHJ1Y3QgaXJxYWN0aW9uOworCisjZW5kaWYJLyogX1hURU5TQV9JUlFfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL2lycV9yZWdzLmggYi9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9pcnFfcmVncy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS14dGVuc2EvaXJxX3JlZ3MuaApyZW5hbWUgdG8gYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vaXJxX3JlZ3MuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL2tkZWJ1Zy5oIGIvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20va2RlYnVnLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLXh0ZW5zYS9rZGVidWcuaApyZW5hbWUgdG8gYXJjaC94dGVuc2EvaW5jbHVkZS9hc20va2RlYnVnLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9rbWFwX3R5cGVzLmggYi9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9rbWFwX3R5cGVzLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLXh0ZW5zYS9rbWFwX3R5cGVzLmgKcmVuYW1lIHRvIGFyY2gveHRlbnNhL2luY2x1ZGUvYXNtL2ttYXBfdHlwZXMuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL2xpbmthZ2UuaCBiL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL2xpbmthZ2UuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20teHRlbnNhL2xpbmthZ2UuaApyZW5hbWUgdG8gYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vbGlua2FnZS5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2EvbG9jYWwuaCBiL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL2xvY2FsLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLXh0ZW5zYS9sb2NhbC5oCnJlbmFtZSB0byBhcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9sb2NhbC5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2EvbW1hbi5oIGIvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vbW1hbi5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS14dGVuc2EvbW1hbi5oCnJlbmFtZSB0byBhcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9tbWFuLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9tbXUuaCBiL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL21tdS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS14dGVuc2EvbW11LmgKcmVuYW1lIHRvIGFyY2gveHRlbnNhL2luY2x1ZGUvYXNtL21tdS5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2EvbW11X2NvbnRleHQuaCBiL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL21tdV9jb250ZXh0LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLXh0ZW5zYS9tbXVfY29udGV4dC5oCnJlbmFtZSB0byBhcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9tbXVfY29udGV4dC5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2EvbW9kdWxlLmggYi9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9tb2R1bGUuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20teHRlbnNhL21vZHVsZS5oCnJlbmFtZSB0byBhcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9tb2R1bGUuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL21zZ2J1Zi5oIGIvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vbXNnYnVmLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLXh0ZW5zYS9tc2didWYuaApyZW5hbWUgdG8gYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vbXNnYnVmLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9tdXRleC5oIGIvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vbXV0ZXguaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20teHRlbnNhL211dGV4LmgKcmVuYW1lIHRvIGFyY2gveHRlbnNhL2luY2x1ZGUvYXNtL211dGV4LmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9wYWdlLmggYi9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9wYWdlLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLXh0ZW5zYS9wYWdlLmgKcmVuYW1lIHRvIGFyY2gveHRlbnNhL2luY2x1ZGUvYXNtL3BhZ2UuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL3BhcmFtLmggYi9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9wYXJhbS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS14dGVuc2EvcGFyYW0uaApyZW5hbWUgdG8gYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vcGFyYW0uaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL3BjaS1icmlkZ2UuaCBiL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL3BjaS1icmlkZ2UuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20teHRlbnNhL3BjaS1icmlkZ2UuaApyZW5hbWUgdG8gYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vcGNpLWJyaWRnZS5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2EvcGNpLmggYi9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9wY2kuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20teHRlbnNhL3BjaS5oCnJlbmFtZSB0byBhcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9wY2kuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL3BlcmNwdS5oIGIvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vcGVyY3B1LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLXh0ZW5zYS9wZXJjcHUuaApyZW5hbWUgdG8gYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vcGVyY3B1LmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9wZ2FsbG9jLmggYi9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9wZ2FsbG9jLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLXh0ZW5zYS9wZ2FsbG9jLmgKcmVuYW1lIHRvIGFyY2gveHRlbnNhL2luY2x1ZGUvYXNtL3BnYWxsb2MuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL3BndGFibGUuaCBiL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL3BndGFibGUuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20teHRlbnNhL3BndGFibGUuaApyZW5hbWUgdG8gYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vcGd0YWJsZS5oCmRpZmYgLS1naXQgYS9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9wbGF0Zm9ybS5oIGIvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vcGxhdGZvcm0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lM2Q1YTQ4Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vcGxhdGZvcm0uaApAQCAtMCwwICsxLDg5IEBACisvKgorICogUGxhdGZvcm0gc3BlY2lmaWMgZnVuY3Rpb25zCisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbAorICogUHVibGljIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZgorICogdGhpcyBhcmNoaXZlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxIC0gMjAwNSBUZW5zaWxpY2EgSW5jLgorICovCisKKyNpZm5kZWYgX1hURU5TQV9QTEFURk9STV9ICisjZGVmaW5lIF9YVEVOU0FfUExBVEZPUk1fSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKworI2luY2x1ZGUgPGFzbS9ib290cGFyYW0uaD4KKworLyoKKyAqIHBsYXRmb3JtX2luaXQgaXMgY2FsbGVkIGJlZm9yZSB0aGUgbW11IGlzIGluaXRpYWxpemVkIHRvIGdpdmUgdGhlCisgKiBwbGF0Zm9ybSBhIGVhcmx5IGhvb2stdXAuIGJwX3RhZ190IGlzIGEgbGlzdCBvZiBjb25maWd1cmF0aW9uIHRhZ3MKKyAqIHBhc3NlZCBmcm9tIHRoZSBib290LWxvYWRlci4KKyAqLworZXh0ZXJuIHZvaWQgcGxhdGZvcm1faW5pdChicF90YWdfdCopOworCisvKgorICogcGxhdGZvcm1fc2V0dXAgaXMgY2FsbGVkIGZyb20gc2V0dXBfYXJjaCB3aXRoIGEgcG9pbnRlciB0byB0aGUgY29tbWFuZC1saW5lCisgKiBzdHJpbmcuCisgKi8KK2V4dGVybiB2b2lkIHBsYXRmb3JtX3NldHVwIChjaGFyICoqKTsKKworLyoKKyAqIHBsYXRmb3JtX2luaXRfaXJxIGlzIGNhbGxlZCBmcm9tIGluaXRfSVJRLgorICovCitleHRlcm4gdm9pZCBwbGF0Zm9ybV9pbml0X2lycSAodm9pZCk7CisKKy8qCisgKiBwbGF0Zm9ybV9yZXN0YXJ0IGlzIGNhbGxlZCB0byByZXN0YXJ0IHRoZSBzeXN0ZW0uCisgKi8KK2V4dGVybiB2b2lkIHBsYXRmb3JtX3Jlc3RhcnQgKHZvaWQpOworCisvKgorICogcGxhdGZvcm1faGFsdCBpcyBjYWxsZWQgdG8gc3RvcCB0aGUgc3lzdGVtIGFuZCBoYWx0LgorICovCitleHRlcm4gdm9pZCBwbGF0Zm9ybV9oYWx0ICh2b2lkKTsKKworLyoKKyAqIHBsYXRmb3JtX3Bvd2VyX29mZiBpcyBjYWxsZWQgdG8gc3RvcCB0aGUgc3lzdGVtIGFuZCBwb3dlciBpdCBvZmYuCisgKi8KK2V4dGVybiB2b2lkIHBsYXRmb3JtX3Bvd2VyX29mZiAodm9pZCk7CisKKy8qCisgKiBwbGF0Zm9ybV9pZGxlIGlzIGNhbGxlZCBmcm9tIHRoZSBpZGxlIGZ1bmN0aW9uLgorICovCitleHRlcm4gdm9pZCBwbGF0Zm9ybV9pZGxlICh2b2lkKTsKKworLyoKKyAqIHBsYXRmb3JtX2hlYXJ0YmVhdCBpcyBjYWxsZWQgZXZlcnkgSFoKKyAqLworZXh0ZXJuIHZvaWQgcGxhdGZvcm1faGVhcnRiZWF0ICh2b2lkKTsKKworLyoKKyAqIHBsYXRmb3JtX3BjaWJpb3NfaW5pdCBpcyBjYWxsZWQgdG8gYWxsb3cgdGhlIHBsYXRmb3JtIHRvIHNldHVwIHRoZSBwY2kgYnVzLgorICovCitleHRlcm4gdm9pZCBwbGF0Zm9ybV9wY2liaW9zX2luaXQgKHZvaWQpOworCisvKgorICogcGxhdGZvcm1fcGNpYmlvc19maXh1cCBhbGxvd3MgdG8gbW9kaWZ5IHRoZSBQQ0kgY29uZmlndXJhdGlvbi4KKyAqLworZXh0ZXJuIGludCBwbGF0Zm9ybV9wY2liaW9zX2ZpeHVwICh2b2lkKTsKKworLyoKKyAqIHBsYXRmb3JtX2NhbGlicmF0ZV9jY291bnQgY2FsaWJyYXRlcyBjcHUgY2xvY2sgZnJlcSAoQ09ORklHX1hURU5TQV9DQUxJQlJBVEUpCisgKi8KK2V4dGVybiB2b2lkIHBsYXRmb3JtX2NhbGlicmF0ZV9jY291bnQgKHZvaWQpOworCisvKgorICogcGxhdGZvcm1fZ2V0X3J0Y190aW1lIHJldHVybnMgUlRDIHNlY29uZHMgKHJldHVybnMgMCBmb3Igbm8gZXJyb3IpCisgKi8KK2V4dGVybiBpbnQgcGxhdGZvcm1fZ2V0X3J0Y190aW1lKHRpbWVfdCopOworCisvKgorICogcGxhdGZvcm1fc2V0X3J0Y190aW1lIHNldCBSVEMgc2Vjb25kcyAocmV0dXJucyAwIGZvciBubyBlcnJvcikKKyAqLworZXh0ZXJuIGludCBwbGF0Zm9ybV9zZXRfcnRjX3RpbWUodGltZV90KTsKKworCisjZW5kaWYJLyogX1hURU5TQV9QTEFURk9STV9IICovCisKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9wb2xsLmggYi9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9wb2xsLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLXh0ZW5zYS9wb2xsLmgKcmVuYW1lIHRvIGFyY2gveHRlbnNhL2luY2x1ZGUvYXNtL3BvbGwuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL3Bvc2l4X3R5cGVzLmggYi9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9wb3NpeF90eXBlcy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS14dGVuc2EvcG9zaXhfdHlwZXMuaApyZW5hbWUgdG8gYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vcG9zaXhfdHlwZXMuaApkaWZmIC0tZ2l0IGEvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vcHJvY2Vzc29yLmggYi9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9wcm9jZXNzb3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzM4N2QzCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vcHJvY2Vzc29yLmgKQEAgLTAsMCArMSwxOTMgQEAKKy8qCisgKiBpbmNsdWRlL2FzbS14dGVuc2EvcHJvY2Vzc29yLmgKKyAqCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEgLSAyMDA1IFRlbnNpbGljYSBJbmMuCisgKi8KKworI2lmbmRlZiBfWFRFTlNBX1BST0NFU1NPUl9ICisjZGVmaW5lIF9YVEVOU0FfUFJPQ0VTU09SX0gKKworI2luY2x1ZGUgPHZhcmlhbnQvY29yZS5oPgorI2luY2x1ZGUgPGFzbS9jb3Byb2Nlc3Nvci5oPgorCisjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KKyNpbmNsdWRlIDxhc20vcHRyYWNlLmg+CisjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CisjaW5jbHVkZSA8YXNtL3JlZ3MuaD4KKworLyogQXNzZXJ0aW9ucy4gKi8KKworI2lmIChYQ0hBTF9IQVZFX1dJTkRPV0VEICE9IDEpCisjIGVycm9yIExpbnV4IHJlcXVpcmVzIHRoZSBYdGVuc2EgV2luZG93ZWQgUmVnaXN0ZXJzIE9wdGlvbi4KKyNlbmRpZgorCisvKgorICogVXNlciBzcGFjZSBwcm9jZXNzIHNpemU6IDEgR0IuCisgKiBXaW5kb3dlZCBjYWxsIEFCSSByZXF1aXJlcyBjYWxsZXIgYW5kIGNhbGxlZSB0byBiZSBsb2NhdGVkIHdpdGhpbiB0aGUgc2FtZQorICogMSBHQiByZWdpb24uIFRoZSBDIGNvbXBpbGVyIHBsYWNlcyB0cmFtcG9saW5lIGNvZGUgb24gdGhlIHN0YWNrIGZvciBzb3VyY2VzCisgKiB0aGF0IHRha2UgdGhlIGFkZHJlc3Mgb2YgYSBuZXN0ZWQgQyBmdW5jdGlvbiAoYSBmZWF0dXJlIHVzZWQgYnkgZ2xpYmMpLCBzbworICogdGhlIDEgR0IgcmVxdWlyZW1lbnQgYXBwbGllcyB0byB0aGUgc3RhY2sgYXMgd2VsbC4KKyAqLworCisjZGVmaW5lIFRBU0tfU0laRQlfX1hURU5TQV9VTF9DT05TVCgweDQwMDAwMDAwKQorI2RlZmluZSBTVEFDS19UT1AJVEFTS19TSVpFCisjZGVmaW5lIFNUQUNLX1RPUF9NQVgJU1RBQ0tfVE9QCisKKy8qCisgKiBHZW5lcmFsIGV4Y2VwdGlvbiBjYXVzZSBhc3NpZ25lZCB0byBkZWJ1ZyBleGNlcHRpb25zLiBEZWJ1ZyBleGNlcHRpb25zIGdvCisgKiB0byB0aGVpciBvd24gdmVjdG9yLCByYXRoZXIgdGhhbiB0aGUgZ2VuZXJhbCBleGNlcHRpb24gdmVjdG9ycyAodXNlciwKKyAqIGtlcm5lbCwgZG91YmxlKTsgYW5kIHRoZWlyIHNwZWNpZmljIGNhdXNlcyBhcmUgcmVwb3J0ZWQgdmlhIERFQlVHQ0FVU0UKKyAqIHJhdGhlciB0aGFuIEVYQ0NBVVNFLiAgSG93ZXZlciBpdCBpcyBzb21ldGltZXMgY29udmVuaWVudCB0byByZWRpcmVjdCBkZWJ1ZworICogZXhjZXB0aW9ucyB0byB0aGUgZ2VuZXJhbCBleGNlcHRpb24gbWVjaGFuaXNtLiAgVG8gZG8gdGhpcywgYW4gb3RoZXJ3aXNlCisgKiB1bnVzZWQgRVhDQ0FVU0UgdmFsdWUgd2FzIGFzc2lnbmVkIHRvIGRlYnVnIGV4Y2VwdGlvbnMgZm9yIHRoaXMgcHVycG9zZS4KKyAqLworCisjZGVmaW5lIEVYQ0NBVVNFX01BUFBFRF9ERUJVRwk2MworCisvKgorICogV2UgdXNlIERFUEMgYWxzbyBhcyBhIGZsYWcgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiBkb3VibGUgYW5kIHJlZ3VsYXIKKyAqIGV4Y2VwdGlvbnMuIEZvciBwZXJmb3JtYW5jZSByZWFzb25zLCBERVBDIG1pZ2h0IGNvbnRhaW4gdGhlIHZhbHVlIG9mCisgKiBFWENDQVVTRSBmb3IgcmVndWxhciBleGNlcHRpb25zLCBzbyB3ZSB1c2UgdGhpcyBkZWZpbml0aW9uIHRvIG1hcmsgYQorICogdmFsaWQgZG91YmxlIGV4Y2VwdGlvbiBhZGRyZXNzLgorICogKE5vdGU6IFdlIHVzZSBpdCBpbiBiZ2V1aSwgc28gaXQgc2hvdWxkIGJlIDY0LCAxMjgsIG9yIDI1NikKKyAqLworCisjZGVmaW5lIFZBTElEX0RPVUJMRV9FWENFUFRJT05fQUREUkVTUwk2NAorCisvKiBMT0NLTEVWRUwgZGVmaW5lcyB0aGUgaW50ZXJydXB0IGxldmVsIHRoYXQgbWFza3MgYWxsCisgKiBnZW5lcmFsLXB1cnBvc2UgaW50ZXJydXB0cy4KKyAqLworI2RlZmluZSBMT0NLTEVWRUwgMQorCisvKiBXU0JJVFMgYW5kIFdCQklUUyBhcmUgdGhlIHdpZHRoIG9mIHRoZSBXSU5ET1dTVEFSVCBhbmQgV0lORE9XQkFTRQorICogcmVnaXN0ZXJzCisgKi8KKyNkZWZpbmUgV1NCSVRTICAoWENIQUxfTlVNX0FSRUdTIC8gNCkgICAgICAvKiB3aWR0aCBvZiBXSU5ET1dTVEFSVCBpbiBiaXRzICovCisjZGVmaW5lIFdCQklUUyAgKFhDSEFMX05VTV9BUkVHU19MT0cyIC0gMikgLyogd2lkdGggb2YgV0lORE9XQkFTRSBpbiBiaXRzICovCisKKyNpZm5kZWYgX19BU1NFTUJMWV9fCisKKy8qIEJ1aWxkIGEgdmFsaWQgcmV0dXJuIGFkZHJlc3MgZm9yIHRoZSBzcGVjaWZpZWQgY2FsbCB3aW5zaXplLgorICogd2luc2l6ZSBtdXN0IGJlIDEgKGNhbGw0KSwgMiAoY2FsbDgpLCBvciAzIChjYWxsMTIpCisgKi8KKyNkZWZpbmUgTUFLRV9SQV9GT1JfQ0FMTChyYSx3cykgICAoKChyYSkgJiAweDNmZmZmZmZmKSB8ICh3cykgPDwgMzApCisKKy8qIENvbnZlcnQgcmV0dXJuIGFkZHJlc3MgdG8gYSB2YWxpZCBwYworICogTm90ZTogV2UgYXNzdW1lIHRoYXQgdGhlIHN0YWNrIHBvaW50ZXIgaXMgaW4gdGhlIHNhbWUgMUdCIHJhbmdlcyBhcyB0aGUgcmEKKyAqLworI2RlZmluZSBNQUtFX1BDX0ZST01fUkEocmEsc3ApICAgICgoKHJhKSAmIDB4M2ZmZmZmZmYpIHwgKChzcCkgJiAweGMwMDAwMDAwKSkKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVuc2lnbmVkIGxvbmcgc2VnOworfSBtbV9zZWdtZW50X3Q7CisKK3N0cnVjdCB0aHJlYWRfc3RydWN0IHsKKworCS8qIGtlcm5lbCdzIHJldHVybiBhZGRyZXNzIGFuZCBzdGFjayBwb2ludGVyIGZvciBjb250ZXh0IHN3aXRjaGluZyAqLworCXVuc2lnbmVkIGxvbmcgcmE7IC8qIGtlcm5lbCdzIGEwOiByZXR1cm4gYWRkcmVzcyBhbmQgd2luZG93IGNhbGwgc2l6ZSAqLworCXVuc2lnbmVkIGxvbmcgc3A7IC8qIGtlcm5lbCdzIGExOiBzdGFjayBwb2ludGVyICovCisKKwltbV9zZWdtZW50X3QgY3VycmVudF9kczsgICAgLyogc2VlIHVhY2Nlc3MuaCBmb3IgZXhhbXBsZSB1c2VzICovCisKKwkvKiBzdHJ1Y3QgeHRlbnNhX2NwdWluZm8gaW5mbzsgKi8KKworCXVuc2lnbmVkIGxvbmcgYmFkX3ZhZGRyOyAvKiBsYXN0IHVzZXIgZmF1bHQgKi8KKwl1bnNpZ25lZCBsb25nIGJhZF91YWRkcjsgLyogbGFzdCBrZXJuZWwgZmF1bHQgYWNjZXNzaW5nIHVzZXIgc3BhY2UgKi8KKwl1bnNpZ25lZCBsb25nIGVycm9yX2NvZGU7CisKKwl1bnNpZ25lZCBsb25nIGlicmVha1tYQ0hBTF9OVU1fSUJSRUFLXTsKKwl1bnNpZ25lZCBsb25nIGRicmVha2FbWENIQUxfTlVNX0RCUkVBS107CisJdW5zaWduZWQgbG9uZyBkYnJlYWtjW1hDSEFMX05VTV9EQlJFQUtdOworCisJLyogTWFrZSBzdHJ1Y3R1cmUgMTYgYnl0ZXMgYWxpZ25lZC4gKi8KKwlpbnQgYWxpZ25bMF0gX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQoMTYpKSk7Cit9OworCisKKy8qCisgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIG1hY3JvIHRoYXQgcmV0dXJucyBjdXJyZW50CisgKiBpbnN0cnVjdGlvbiBwb2ludGVyICgicHJvZ3JhbSBjb3VudGVyIikuCisgKi8KKyNkZWZpbmUgY3VycmVudF90ZXh0X2FkZHIoKSAgKHsgX19sYWJlbF9fIF9sOyBfbDogJiZfbDt9KQorCisKKy8qIFRoaXMgZGVjaWRlcyB3aGVyZSB0aGUga2VybmVsIHdpbGwgc2VhcmNoIGZvciBhIGZyZWUgY2h1bmsgb2Ygdm0KKyAqIHNwYWNlIGR1cmluZyBtbWFwJ3MuCisgKi8KKyNkZWZpbmUgVEFTS19VTk1BUFBFRF9CQVNFCShUQVNLX1NJWkUgLyAyKQorCisjZGVmaW5lIElOSVRfVEhSRUFEICBcCit7CQkJCQkJCQkJXAorCXJhOgkJMCwgCQkJCQkJXAorCXNwOgkJc2l6ZW9mKGluaXRfc3RhY2spICsgKGxvbmcpICZpbml0X3N0YWNrLAlcCisJY3VycmVudF9kczoJezB9LAkJCQkJCVwKKwkvKmluZm86CQl7MH0sICovCQkJCQkJXAorCWJhZF92YWRkcjoJMCwJCQkJCQlcCisJYmFkX3VhZGRyOgkwLAkJCQkJCVwKKwllcnJvcl9jb2RlOgkwLAkJCQkJCVwKK30KKworCisvKgorICogRG8gbmVjZXNzYXJ5IHNldHVwIHRvIHN0YXJ0IHVwIGEgbmV3bHkgZXhlY3V0ZWQgdGhyZWFkLgorICogTm90ZTogV2Ugc2V0LXVwIHBzIGFzIGlmIHdlIGRpZCBhIGNhbGw0IHRvIHRoZSBuZXcgcGMuCisgKiAgICAgICBzZXRfdGhyZWFkX3N0YXRlIGluIHNpZ25hbC5jIGRlcGVuZHMgb24gaXQuCisgKi8KKyNkZWZpbmUgVVNFUl9QU19WQUxVRSAoKDEgPDwgUFNfV09FX0JJVCkgfAkJCQlcCisgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IFBTX0NBTExJTkNfU0hJRlQpIHwJCQlcCisgICAgICAgICAgICAgICAgICAgICAgIChVU0VSX1JJTkcgPDwgUFNfUklOR19TSElGVCkgfAkJCVwKKyAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgUFNfVU1fQklUKSB8CQkJCVwKKyAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgUFNfRVhDTV9CSVQpKQorCisvKiBDbGVhcmluZyBhMCB0ZXJtaW5hdGVzIHRoZSBiYWNrdHJhY2UuICovCisjZGVmaW5lIHN0YXJ0X3RocmVhZChyZWdzLCBuZXdfcGMsIG5ld19zcCkgXAorCXJlZ3MtPnBjID0gbmV3X3BjOyBcCisJcmVncy0+cHMgPSBVU0VSX1BTX1ZBTFVFOyBcCisJcmVncy0+YXJlZ1sxXSA9IG5ld19zcDsgXAorCXJlZ3MtPmFyZWdbMF0gPSAwOyBcCisJcmVncy0+d21hc2sgPSAxOyBcCisJcmVncy0+ZGVwYyA9IDA7IFwKKwlyZWdzLT53aW5kb3diYXNlID0gMDsgXAorCXJlZ3MtPndpbmRvd3N0YXJ0ID0gMTsKKworLyogRm9yd2FyZCBkZWNsYXJhdGlvbiAqLworc3RydWN0IHRhc2tfc3RydWN0Oworc3RydWN0IG1tX3N0cnVjdDsKKworLyogRnJlZSBhbGwgcmVzb3VyY2VzIGhlbGQgYnkgYSB0aHJlYWQuICovCisjZGVmaW5lIHJlbGVhc2VfdGhyZWFkKHRocmVhZCkgZG8geyB9IHdoaWxlKDApCisKKy8qIFByZXBhcmUgdG8gY29weSB0aHJlYWQgc3RhdGUgLSB1bmxhenkgYWxsIGxhenkgc3RhdHVzICovCitleHRlcm4gdm9pZCBwcmVwYXJlX3RvX2NvcHkoc3RydWN0IHRhc2tfc3RydWN0Kik7CisKKy8qIENyZWF0ZSBhIGtlcm5lbCB0aHJlYWQgd2l0aG91dCByZW1vdmluZyBpdCBmcm9tIHRhc2tsaXN0cyAqLworZXh0ZXJuIGludCBrZXJuZWxfdGhyZWFkKGludCAoKmZuKSh2b2lkICopLCB2b2lkICogYXJnLCB1bnNpZ25lZCBsb25nIGZsYWdzKTsKKworLyogQ29weSBhbmQgcmVsZWFzZSBhbGwgc2VnbWVudCBpbmZvIGFzc29jaWF0ZWQgd2l0aCBhIFZNICovCisjZGVmaW5lIGNvcHlfc2VnbWVudHMocCwgbW0pCWRvIHsgfSB3aGlsZSgwKQorI2RlZmluZSByZWxlYXNlX3NlZ21lbnRzKG1tKQlkbyB7IH0gd2hpbGUoMCkKKyNkZWZpbmUgZm9yZ2V0X3NlZ21lbnRzKCkJZG8geyB9IHdoaWxlICgwKQorCisjZGVmaW5lIHRocmVhZF9zYXZlZF9wYyh0c2spCSh0YXNrX3B0X3JlZ3ModHNrKS0+cGMpCisKK2V4dGVybiB1bnNpZ25lZCBsb25nIGdldF93Y2hhbihzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApOworCisjZGVmaW5lIEtTVEtfRUlQKHRzaykJCSh0YXNrX3B0X3JlZ3ModHNrKS0+cGMpCisjZGVmaW5lIEtTVEtfRVNQKHRzaykJCSh0YXNrX3B0X3JlZ3ModHNrKS0+YXJlZ1sxXSkKKworI2RlZmluZSBjcHVfcmVsYXgoKSAgYmFycmllcigpCisKKy8qIFNwZWNpYWwgcmVnaXN0ZXIgYWNjZXNzLiAqLworCisjZGVmaW5lIFdTUih2LHNyKSBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIndzciAlMCwiX19zdHJpbmdpZnkoc3IpIDo6ICJhIih2KSk7CisjZGVmaW5lIFJTUih2LHNyKSBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoInJzciAlMCwiX19zdHJpbmdpZnkoc3IpIDogIj1hIih2KSk7CisKKyNkZWZpbmUgc2V0X3NyKHgsc3IpICh7dW5zaWduZWQgaW50IHY9KHVuc2lnbmVkIGludCl4OyBXU1Iodixzcik7fSkKKyNkZWZpbmUgZ2V0X3NyKHNyKSAoe3Vuc2lnbmVkIGludCB2OyBSU1Iodixzcik7IHY7IH0pCisKKyNlbmRpZgkvKiBfX0FTU0VNQkxZX18gKi8KKyNlbmRpZgkvKiBfWFRFTlNBX1BST0NFU1NPUl9IICovCmRpZmYgLS1naXQgYS9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9wdHJhY2UuaCBiL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL3B0cmFjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwNWUxZTYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9wdHJhY2UuaApAQCAtMCwwICsxLDEzNSBAQAorLyoKKyAqIGluY2x1ZGUvYXNtLXh0ZW5zYS9wdHJhY2UuaAorICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMSAtIDIwMDUgVGVuc2lsaWNhIEluYy4KKyAqLworCisjaWZuZGVmIF9YVEVOU0FfUFRSQUNFX0gKKyNkZWZpbmUgX1hURU5TQV9QVFJBQ0VfSAorCisvKgorICogS2VybmVsIHN0YWNrCisgKgorICogCQkrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rICAtLS0tLS0tLSBTVEFDS19TSVpFCisgKiAJCXwgICAgIHJlZ2lzdGVyIGZpbGUgICAgIHwgIHwKKyAqIAkJKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKyAgfAorICogCQl8ICAgIHN0cnVjdCBwdF9yZWdzICAgICB8ICB8CisgKiAJCSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsgIHwgLS0tLS0tIFBUX1JFR1NfT0ZGU0VUCisgKiBkb3VibGUgCTogIDE2IGJ5dGVzIHNwaWxsIGFyZWEgIDogIHwgIF4KKyAqIGV4Y2V0aW9uIAk6LSAtIC0gLSAtIC0gLSAtIC0gLSAtIC06ICB8ICB8CisgKiBmcmFtZQk6ICAgIHN0cnVjdCBwdF9yZWdzICAgICA6ICB8ICB8CisgKiAJCTotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLTogIHwgIHwKKyAqIAkJfCAgICAgICAgICAgICAgICAgICAgICAgfCAgfCAgfAorICogCQl8ICAgICBtZW1vcnkgc3RhY2sgICAgICB8ICB8ICB8CisgKiAJCXwgICAgICAgICAgICAgICAgICAgICAgIHwgIHwgIHwKKyAqIAkJfiAgICAgICAgICAgICAgICAgICAgICAgfiAgfiAgfgorICogCQl+ICAgICAgICAgICAgICAgICAgICAgICB+ICB+ICB+CisgKiAJCXwgICAgICAgICAgICAgICAgICAgICAgIHwgIHwgIHwKKyAqIAkJfCAgICAgICAgICAgICAgICAgICAgICAgfCAgfCAgfAorICogCQkrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rICB8ICB8IC0tLSBTVEFDS19CSUFTCisgKiAJCXwgIHN0cnVjdCB0YXNrX3N0cnVjdCAgIHwgIHwgIHwgIF4KKyAqICBjdXJyZW50IC0tPiArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rICB8ICB8ICB8CisgKiAJCXwgIHN0cnVjdCB0aHJlYWRfaW5mbyAgIHwgIHwgIHwgIHwKKyAqCQkrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rIC0tLS0tLS0tCisgKi8KKworI2RlZmluZSBLRVJORUxfU1RBQ0tfU0laRSAoMiAqIFBBR0VfU0laRSkKKworLyogIE9mZnNldHMgZm9yIGV4Y2VwdGlvbl9oYW5kbGVyc1tdICgzIHggNjQtZW50cmllcyB4IDQtYnl0ZSB0YWJsZXMpLiAqLworCisjZGVmaW5lIEVYQ19UQUJMRV9LU1RLCQkweDAwNAkvKiBLZXJuZWwgU3RhY2sgKi8KKyNkZWZpbmUgRVhDX1RBQkxFX0RPVUJMRV9TQVZFCTB4MDA4CS8qIERvdWJsZSBleGNlcHRpb24gc2F2ZSBhcmVhIGZvciBhMCAqLworI2RlZmluZSBFWENfVEFCTEVfRklYVVAJCTB4MDBjCS8qIEZpeHVwIGhhbmRsZXIgKi8KKyNkZWZpbmUgRVhDX1RBQkxFX1BBUkFNCQkweDAxMAkvKiBGb3IgcGFzc2luZyBhIHBhcmFtZXRlciB0byBmaXh1cCAqLworI2RlZmluZSBFWENfVEFCTEVfU1lTQ0FMTF9TQVZFCTB4MDE0CS8qIEZvciBmYXN0IHN5c2NhbGwgaGFuZGxlciAqLworI2RlZmluZSBFWENfVEFCTEVfRkFTVF9VU0VSCTB4MTAwCS8qIEZhc3QgdXNlciBleGNlcHRpb24gaGFuZGxlciAqLworI2RlZmluZSBFWENfVEFCTEVfRkFTVF9LRVJORUwJMHgyMDAJLyogRmFzdCBrZXJuZWwgZXhjZXB0aW9uIGhhbmRsZXIgKi8KKyNkZWZpbmUgRVhDX1RBQkxFX0RFRkFVTFQJMHgzMDAJLyogRGVmYXVsdCBDLUhhbmRsZXIgKi8KKyNkZWZpbmUgRVhDX1RBQkxFX1NJWkUJCTB4NDAwCisKKy8qIFJlZ2lzdGVycyB1c2VkIGJ5IHN0cmFjZSAqLworCisjZGVmaW5lIFJFR19BX0JBU0UJMHgwMDAwCisjZGVmaW5lIFJFR19BUl9CQVNFCTB4MDEwMAorI2RlZmluZSBSRUdfUEMJCTB4MDAyMAorI2RlZmluZSBSRUdfUFMJCTB4MDJlNgorI2RlZmluZSBSRUdfV0IJCTB4MDI0OAorI2RlZmluZSBSRUdfV1MJCTB4MDI0OQorI2RlZmluZSBSRUdfTEJFRwkweDAyMDAKKyNkZWZpbmUgUkVHX0xFTkQJMHgwMjAxCisjZGVmaW5lIFJFR19MQ09VTlQJMHgwMjAyCisjZGVmaW5lIFJFR19TQVIJCTB4MDIwMworCisjZGVmaW5lIFNZU0NBTExfTlIJMHgwMGZmCisKKy8qIE90aGVyIFBUUkFDRV8gdmFsdWVzIGRlZmluZWQgaW4gPGxpbnV4L3B0cmFjZS5oPiB1c2luZyB2YWx1ZXMgMC05LDE2LDE3LDI0ICovCisKKyNkZWZpbmUgUFRSQUNFX0dFVFJFR1MJCTEyCisjZGVmaW5lIFBUUkFDRV9TRVRSRUdTCQkxMworI2RlZmluZSBQVFJBQ0VfR0VUWFRSRUdTCTE4CisjZGVmaW5lIFBUUkFDRV9TRVRYVFJFR1MJMTkKKworI2lmZGVmIF9fS0VSTkVMX18KKworI2lmbmRlZiBfX0FTU0VNQkxZX18KKworLyoKKyAqIFRoaXMgc3RydWN0IGRlZmluZXMgdGhlIHdheSB0aGUgcmVnaXN0ZXJzIGFyZSBzdG9yZWQgb24gdGhlCisgKiBrZXJuZWwgc3RhY2sgZHVyaW5nIGEgc3lzdGVtIGNhbGwgb3Igb3RoZXIga2VybmVsIGVudHJ5LgorICovCitzdHJ1Y3QgcHRfcmVncyB7CisJdW5zaWduZWQgbG9uZyBwYzsJCS8qICAgNCAqLworCXVuc2lnbmVkIGxvbmcgcHM7CQkvKiAgIDggKi8KKwl1bnNpZ25lZCBsb25nIGRlcGM7CQkvKiAgMTIgKi8KKwl1bnNpZ25lZCBsb25nIGV4Y2NhdXNlOwkJLyogIDE2ICovCisJdW5zaWduZWQgbG9uZyBleGN2YWRkcjsJCS8qICAyMCAqLworCXVuc2lnbmVkIGxvbmcgZGVidWdjYXVzZTsJLyogIDI0ICovCisJdW5zaWduZWQgbG9uZyB3bWFzazsJCS8qICAyOCAqLworCXVuc2lnbmVkIGxvbmcgbGJlZzsJCS8qICAzMiAqLworCXVuc2lnbmVkIGxvbmcgbGVuZDsJCS8qICAzNiAqLworCXVuc2lnbmVkIGxvbmcgbGNvdW50OwkJLyogIDQwICovCisJdW5zaWduZWQgbG9uZyBzYXI7CQkvKiAgNDQgKi8KKwl1bnNpZ25lZCBsb25nIHdpbmRvd2Jhc2U7CS8qICA0OCAqLworCXVuc2lnbmVkIGxvbmcgd2luZG93c3RhcnQ7CS8qICA1MiAqLworCXVuc2lnbmVkIGxvbmcgc3lzY2FsbDsJCS8qICA1NiAqLworCXVuc2lnbmVkIGxvbmcgaWNvdW50bGV2ZWw7CS8qICA2MCAqLworCWludCByZXNlcnZlZFsxXTsJCS8qICA2NCAqLworCisJLyogQWRkaXRpb25hbCBjb25maWd1cmFibGUgcmVnaXN0ZXJzIHRoYXQgYXJlIHVzZWQgYnkgdGhlIGNvbXBpbGVyLiAqLworCXh0cmVnc19vcHRfdCB4dHJlZ3Nfb3B0OworCisJLyogTWFrZSBzdXJlIHRoZSBhcmVnIGZpZWxkIGlzIDE2IGJ5dGVzIGFsaWduZWQuICovCisJaW50IGFsaWduWzBdIF9fYXR0cmlidXRlX18gKChhbGlnbmVkKDE2KSkpOworCisJLyogY3VycmVudCByZWdpc3RlciBmcmFtZS4KKwkgKiBOb3RlOiBUaGUgRVNGIGZvciBrZXJuZWwgZXhjZXB0aW9ucyBlbmRzIGFmdGVyIDE2IHJlZ2lzdGVycyEKKwkgKi8KKwl1bnNpZ25lZCBsb25nIGFyZWdbMTZdOwkJLyogMTI4ICg2NCkgKi8KK307CisKKyNpbmNsdWRlIDx2YXJpYW50L2NvcmUuaD4KKworIyBkZWZpbmUgdGFza19wdF9yZWdzKHRzaykgKChzdHJ1Y3QgcHRfcmVncyopIFwKKyAgKHRhc2tfc3RhY2tfcGFnZSh0c2spICsgS0VSTkVMX1NUQUNLX1NJWkUgLSAoWENIQUxfTlVNX0FSRUdTLTE2KSo0KSAtIDEpCisjIGRlZmluZSB1c2VyX21vZGUocmVncykgKCgocmVncyktPnBzICYgMHgwMDAwMDAyMCkhPTApCisjIGRlZmluZSBpbnN0cnVjdGlvbl9wb2ludGVyKHJlZ3MpICgocmVncyktPnBjKQorZXh0ZXJuIHZvaWQgc2hvd19yZWdzKHN0cnVjdCBwdF9yZWdzICopOworCisjIGlmbmRlZiBDT05GSUdfU01QCisjICBkZWZpbmUgcHJvZmlsZV9wYyhyZWdzKSBpbnN0cnVjdGlvbl9wb2ludGVyKHJlZ3MpCisjIGVuZGlmCisKKyNlbHNlCS8qIF9fQVNTRU1CTFlfXyAqLworCisjIGluY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgorI2RlZmluZSBQVF9SRUdTX09GRlNFVAkgIChLRVJORUxfU1RBQ0tfU0laRSAtIFBUX1VTRVJfU0laRSkKKworI2VuZGlmCS8qICFfX0FTU0VNQkxZX18gKi8KKworI2VuZGlmICAvKiBfX0tFUk5FTF9fICovCisKKyNlbmRpZgkvKiBfWFRFTlNBX1BUUkFDRV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2EvcmVncy5oIGIvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vcmVncy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS14dGVuc2EvcmVncy5oCnJlbmFtZSB0byBhcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9yZWdzLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9yZXNvdXJjZS5oIGIvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vcmVzb3VyY2UuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20teHRlbnNhL3Jlc291cmNlLmgKcmVuYW1lIHRvIGFyY2gveHRlbnNhL2luY2x1ZGUvYXNtL3Jlc291cmNlLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9ybWFwLmggYi9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9ybWFwLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLXh0ZW5zYS9ybWFwLmgKcmVuYW1lIHRvIGFyY2gveHRlbnNhL2luY2x1ZGUvYXNtL3JtYXAuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL3J3c2VtLmggYi9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9yd3NlbS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS14dGVuc2EvcndzZW0uaApyZW5hbWUgdG8gYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vcndzZW0uaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL3NjYXR0ZXJsaXN0LmggYi9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9zY2F0dGVybGlzdC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS14dGVuc2Evc2NhdHRlcmxpc3QuaApyZW5hbWUgdG8gYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vc2NhdHRlcmxpc3QuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL3NlY3Rpb25zLmggYi9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9zZWN0aW9ucy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS14dGVuc2Evc2VjdGlvbnMuaApyZW5hbWUgdG8gYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vc2VjdGlvbnMuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL3NlZ21lbnQuaCBiL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL3NlZ21lbnQuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20teHRlbnNhL3NlZ21lbnQuaApyZW5hbWUgdG8gYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vc2VnbWVudC5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2Evc2VtYnVmLmggYi9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9zZW1idWYuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20teHRlbnNhL3NlbWJ1Zi5oCnJlbmFtZSB0byBhcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9zZW1idWYuaApkaWZmIC0tZ2l0IGEvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vc2VyaWFsLmggYi9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9zZXJpYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOGEyNDkzCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vc2VyaWFsLmgKQEAgLTAsMCArMSwxOCBAQAorLyoKKyAqIGluY2x1ZGUvYXNtLXh0ZW5zYS9zZXJpYWwuaAorICoKKyAqIENvbmZpZ3VyYXRpb24gZGV0YWlscyBmb3IgODI1MCwgMTY0NTAsIDE2NTUwLCBldGMuIHNlcmlhbCBwb3J0cworICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMSAtIDIwMDUgVGVuc2lsaWNhIEluYy4KKyAqLworCisjaWZuZGVmIF9YVEVOU0FfU0VSSUFMX0gKKyNkZWZpbmUgX1hURU5TQV9TRVJJQUxfSAorCisjaW5jbHVkZSA8cGxhdGZvcm0vc2VyaWFsLmg+CisKKyNlbmRpZgkvKiBfWFRFTlNBX1NFUklBTF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2Evc2V0dXAuaCBiL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL3NldHVwLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLXh0ZW5zYS9zZXR1cC5oCnJlbmFtZSB0byBhcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9zZXR1cC5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2Evc2htYnVmLmggYi9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9zaG1idWYuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20teHRlbnNhL3NobWJ1Zi5oCnJlbmFtZSB0byBhcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9zaG1idWYuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL3NobXBhcmFtLmggYi9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9zaG1wYXJhbS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS14dGVuc2Evc2htcGFyYW0uaApyZW5hbWUgdG8gYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vc2htcGFyYW0uaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL3NpZ2NvbnRleHQuaCBiL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL3NpZ2NvbnRleHQuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20teHRlbnNhL3NpZ2NvbnRleHQuaApyZW5hbWUgdG8gYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vc2lnY29udGV4dC5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2Evc2lnaW5mby5oIGIvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vc2lnaW5mby5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS14dGVuc2Evc2lnaW5mby5oCnJlbmFtZSB0byBhcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9zaWdpbmZvLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9zaWduYWwuaCBiL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL3NpZ25hbC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS14dGVuc2Evc2lnbmFsLmgKcmVuYW1lIHRvIGFyY2gveHRlbnNhL2luY2x1ZGUvYXNtL3NpZ25hbC5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2Evc21wLmggYi9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9zbXAuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20teHRlbnNhL3NtcC5oCnJlbmFtZSB0byBhcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9zbXAuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL3NvY2tldC5oIGIvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vc29ja2V0LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLXh0ZW5zYS9zb2NrZXQuaApyZW5hbWUgdG8gYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vc29ja2V0LmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9zb2NraW9zLmggYi9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9zb2NraW9zLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLXh0ZW5zYS9zb2NraW9zLmgKcmVuYW1lIHRvIGFyY2gveHRlbnNhL2luY2x1ZGUvYXNtL3NvY2tpb3MuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL3NwaW5sb2NrLmggYi9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9zcGlubG9jay5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS14dGVuc2Evc3BpbmxvY2suaApyZW5hbWUgdG8gYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vc3BpbmxvY2suaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL3N0YXQuaCBiL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL3N0YXQuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20teHRlbnNhL3N0YXQuaApyZW5hbWUgdG8gYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vc3RhdC5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2Evc3RhdGZzLmggYi9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9zdGF0ZnMuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20teHRlbnNhL3N0YXRmcy5oCnJlbmFtZSB0byBhcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9zdGF0ZnMuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL3N0cmluZy5oIGIvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vc3RyaW5nLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLXh0ZW5zYS9zdHJpbmcuaApyZW5hbWUgdG8gYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vc3RyaW5nLmgKZGlmZiAtLWdpdCBhL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL3N3YWIuaCBiL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL3N3YWIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTBiNjk3Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vc3dhYi5oCkBAIC0wLDAgKzEsNzAgQEAKKy8qCisgKiBpbmNsdWRlL2FzbS14dGVuc2Evc3dhYi5oCisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxIC0gMjAwNSBUZW5zaWxpY2EgSW5jLgorICovCisKKyNpZm5kZWYgX1hURU5TQV9TV0FCX0gKKyNkZWZpbmUgX1hURU5TQV9TV0FCX0gKKworI2luY2x1ZGUgPGFzbS90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CisKKyNkZWZpbmUgX19TV0FCXzY0X1RIUlVfMzJfXworCitzdGF0aWMgaW5saW5lIF9fYXR0cmlidXRlX2NvbnN0X18gX191MzIgX19hcmNoX3N3YWIzMihfX3UzMiB4KQoreworICAgIF9fdTMyIHJlczsKKyAgICAvKiBpbnN0cnVjdGlvbiBzZXF1ZW5jZSBmcm9tIFh0ZW5zYSBJU0EgcmVsZWFzZSAyLzIwMDAgKi8KKyAgICBfX2FzbV9fKCJzc2FpICAgICA4ICAgICAgICAgICBcblx0IgorCSAgICAic3JsaSAgICAgJTAsICUxLCAxNiAgXG5cdCIKKwkgICAgInNyYyAgICAgICUwLCAlMCwgJTEgIFxuXHQiCisJICAgICJzcmMgICAgICAlMCwgJTAsICUwICBcblx0IgorCSAgICAic3JjICAgICAgJTAsICUxLCAlMCAgXG4iCisJICAgIDogIj0mYSIgKHJlcykKKwkgICAgOiAiYSIgKHgpCisJICAgICk7CisgICAgcmV0dXJuIHJlczsKK30KKyNkZWZpbmUgX19hcmNoX3N3YWIzMiBfX2FyY2hfc3dhYjMyCisKK3N0YXRpYyBpbmxpbmUgX19hdHRyaWJ1dGVfY29uc3RfXyBfX3UxNiBfX2FyY2hfc3dhYjE2KF9fdTE2IHgpCit7CisgICAgLyogR2l2ZW4gdGhhdCAnc2hvcnQnIHZhbHVlcyBhcmUgc2lnbmVkIChpLmUuLCBjYW4gYmUgbmVnYXRpdmUpLAorICAgICAqIHdlIGNhbm5vdCBhc3N1bWUgdGhhdCB0aGUgdXBwZXIgMTYtYml0cyBvZiB0aGUgcmVnaXN0ZXIgYXJlCisgICAgICogemVyby4gIFdlIGFyZSBjYXJlZnVsIHRvIG1hc2sgdmFsdWVzIGFmdGVyIHNoaWZ0aW5nLgorICAgICAqLworCisgICAgLyogVGhlcmUgZXhpc3RzIGFuIGFub21hbHkgYmV0d2VlbiB4dC1nY2MgYW5kIHh0LXhjYy4gIHh0LWdjYworICAgICAqIGluc2VydHMgYW4gZXh0dWkgaW5zdHJ1Y3Rpb24gYWZ0ZXIgcHV0dGluZyB0aGlzIGZ1bmN0aW9uIGlubGluZQorICAgICAqIHRvIGVuc3VyZSB0aGF0IGl0IHVzZXMgb25seSB0aGUgbGVhc3Qtc2lnbmlmaWNhbnQgMTYgYml0cyBvZgorICAgICAqIHRoZSByZXN1bHQuICB4dC14Y2MgZG9lc24ndCB1c2UgYW4gZXh0dWksIGJ1dCBhc3N1bWVzIHRoZQorICAgICAqIF9fYXNtX18gbWFjcm8gZm9sbG93cyBjb252ZW50aW9uIHRoYXQgdGhlIHVwcGVyIDE2IGJpdHMgb2YgYW4KKyAgICAgKiAndW5zaWduZWQgc2hvcnQnIHJlc3VsdCBhcmUgc3RpbGwgemVyby4gIFRoaXMgbWFjcm8gZG9lc24ndAorICAgICAqIGZvbGxvdyBjb252ZW50aW9uOyBpbmRlZWQsIGl0IGxlYXZlcyBnYXJiYWdlIGluIHRoZSB1cHBvcnQgMTYKKyAgICAgKiBiaXRzIG9mIHRoZSByZWdpc3Rlci4KKworICAgICAqIERlY2xhcmluZyB0aGUgdGVtcG9yYXJ5IHZhcmlhYmxlcyAncmVzJyBhbmQgJ3RtcCcgdG8gYmUgMzItYml0CisgICAgICogdHlwZXMgd2hpbGUgdGhlIHJldHVybiB0eXBlIG9mIHRoZSBmdW5jdGlvbiBpcyBhIDE2LWJpdCB0eXBlCisgICAgICogZm9yY2VzIGJvdGggY29tcGlsZXJzIHRvIGluc2VydCBleGFjdGx5IG9uZSBleHR1aSBpbnN0cnVjdGlvbgorICAgICAqIChvciBlcXVpdmFsZW50KSB0byBtYXNrIG9mZiB0aGUgdXBwZXIgMTYgYml0cy4gKi8KKworICAgIF9fdTMyIHJlczsKKyAgICBfX3UzMiB0bXA7CisKKyAgICBfX2FzbV9fKCJleHR1aSAgICAlMSwgJTIsIDgsIDhcblx0IgorCSAgICAic2xsaSAgICAgJTAsICUyLCA4ICAgXG5cdCIKKwkgICAgIm9yICAgICAgICUwLCAlMCwgJTEgIFxuIgorCSAgICA6ICI9JmEiIChyZXMpLCAiPSZhIiAodG1wKQorCSAgICA6ICJhIiAoeCkKKwkgICAgKTsKKworICAgIHJldHVybiByZXM7Cit9CisjZGVmaW5lIF9fYXJjaF9zd2FiMTYgX19hcmNoX3N3YWIxNgorCisjZW5kaWYgLyogX1hURU5TQV9TV0FCX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9zeXNjYWxsLmggYi9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9zeXNjYWxsLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLXh0ZW5zYS9zeXNjYWxsLmgKcmVuYW1lIHRvIGFyY2gveHRlbnNhL2luY2x1ZGUvYXNtL3N5c2NhbGwuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL3N5c3RlbS5oIGIvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vc3lzdGVtLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLXh0ZW5zYS9zeXN0ZW0uaApyZW5hbWUgdG8gYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vc3lzdGVtLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS90ZXJtYml0cy5oIGIvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vdGVybWJpdHMuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20teHRlbnNhL3Rlcm1iaXRzLmgKcmVuYW1lIHRvIGFyY2gveHRlbnNhL2luY2x1ZGUvYXNtL3Rlcm1iaXRzLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS90ZXJtaW9zLmggYi9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS90ZXJtaW9zLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLXh0ZW5zYS90ZXJtaW9zLmgKcmVuYW1lIHRvIGFyY2gveHRlbnNhL2luY2x1ZGUvYXNtL3Rlcm1pb3MuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL3RocmVhZF9pbmZvLmggYi9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS90aHJlYWRfaW5mby5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS14dGVuc2EvdGhyZWFkX2luZm8uaApyZW5hbWUgdG8gYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vdGhyZWFkX2luZm8uaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL3RpbWV4LmggYi9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS90aW1leC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS14dGVuc2EvdGltZXguaApyZW5hbWUgdG8gYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vdGltZXguaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL3RsYi5oIGIvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vdGxiLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLXh0ZW5zYS90bGIuaApyZW5hbWUgdG8gYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vdGxiLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS90bGJmbHVzaC5oIGIvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vdGxiZmx1c2guaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20teHRlbnNhL3RsYmZsdXNoLmgKcmVuYW1lIHRvIGFyY2gveHRlbnNhL2luY2x1ZGUvYXNtL3RsYmZsdXNoLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS90b3BvbG9neS5oIGIvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vdG9wb2xvZ3kuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20teHRlbnNhL3RvcG9sb2d5LmgKcmVuYW1lIHRvIGFyY2gveHRlbnNhL2luY2x1ZGUvYXNtL3RvcG9sb2d5LmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS90eXBlcy5oIGIvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vdHlwZXMuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20teHRlbnNhL3R5cGVzLmgKcmVuYW1lIHRvIGFyY2gveHRlbnNhL2luY2x1ZGUvYXNtL3R5cGVzLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS91YWNjZXNzLmggYi9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS91YWNjZXNzLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLXh0ZW5zYS91YWNjZXNzLmgKcmVuYW1lIHRvIGFyY2gveHRlbnNhL2luY2x1ZGUvYXNtL3VhY2Nlc3MuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL3Vjb250ZXh0LmggYi9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS91Y29udGV4dC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS14dGVuc2EvdWNvbnRleHQuaApyZW5hbWUgdG8gYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vdWNvbnRleHQuaApkaWZmIC0tZ2l0IGEvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vdW5hbGlnbmVkLmggYi9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS91bmFsaWduZWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTdlZDA0Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vdW5hbGlnbmVkLmgKQEAgLTAsMCArMSwyOSBAQAorLyoKKyAqIFh0ZW5zYSBkb2Vzbid0IGhhbmRsZSB1bmFsaWduZWQgYWNjZXNzZXMgZWZmaWNpZW50bHkuCisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxIC0gMjAwNSBUZW5zaWxpY2EgSW5jLgorICovCisjaWZuZGVmIF9BU01fWFRFTlNBX1VOQUxJR05FRF9ICisjZGVmaW5lIF9BU01fWFRFTlNBX1VOQUxJR05FRF9ICisKKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisKKyNpZmRlZiBfX0xJVFRMRV9FTkRJQU4KKyMgaW5jbHVkZSA8bGludXgvdW5hbGlnbmVkL2xlX3N0cnVjdC5oPgorIyBpbmNsdWRlIDxsaW51eC91bmFsaWduZWQvYmVfYnl0ZXNoaWZ0Lmg+CisjIGluY2x1ZGUgPGxpbnV4L3VuYWxpZ25lZC9nZW5lcmljLmg+CisjIGRlZmluZSBnZXRfdW5hbGlnbmVkCV9fZ2V0X3VuYWxpZ25lZF9sZQorIyBkZWZpbmUgcHV0X3VuYWxpZ25lZAlfX3B1dF91bmFsaWduZWRfbGUKKyNlbHNlCisjIGluY2x1ZGUgPGxpbnV4L3VuYWxpZ25lZC9iZV9zdHJ1Y3QuaD4KKyMgaW5jbHVkZSA8bGludXgvdW5hbGlnbmVkL2xlX2J5dGVzaGlmdC5oPgorIyBpbmNsdWRlIDxsaW51eC91bmFsaWduZWQvZ2VuZXJpYy5oPgorIyBkZWZpbmUgZ2V0X3VuYWxpZ25lZAlfX2dldF91bmFsaWduZWRfYmUKKyMgZGVmaW5lIHB1dF91bmFsaWduZWQJX19wdXRfdW5hbGlnbmVkX2JlCisjZW5kaWYKKworI2VuZGlmCS8qIF9BU01fWFRFTlNBX1VOQUxJR05FRF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2EvdW5pc3RkLmggYi9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS91bmlzdGQuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20teHRlbnNhL3VuaXN0ZC5oCnJlbmFtZSB0byBhcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS91bmlzdGQuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL3VzZXIuaCBiL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL3VzZXIuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20teHRlbnNhL3VzZXIuaApyZW5hbWUgdG8gYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vdXNlci5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2EvdmdhLmggYi9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS92Z2EuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20teHRlbnNhL3ZnYS5oCnJlbmFtZSB0byBhcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS92Z2EuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL3hvci5oIGIvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20veG9yLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLXh0ZW5zYS94b3IuaApyZW5hbWUgdG8gYXJjaC94dGVuc2EvaW5jbHVkZS9hc20veG9yLmgKZGlmZiAtLWdpdCBhL2FyY2gveHRlbnNhL2tlcm5lbC9lbnRyeS5TIGIvYXJjaC94dGVuc2Eva2VybmVsL2VudHJ5LlMKaW5kZXggZGZkMzVkYy4uYTUxZDM2YSAxMDA2NDQKLS0tIGEvYXJjaC94dGVuc2Eva2VybmVsL2VudHJ5LlMKKysrIGIvYXJjaC94dGVuc2Eva2VybmVsL2VudHJ5LlMKQEAgLTI1LDcgKzI1LDcgQEAKICNpbmNsdWRlIDxhc20vcGFnZS5oPgogI2luY2x1ZGUgPGFzbS9zaWduYWwuaD4KICNpbmNsdWRlIDxhc20vdGxiZmx1c2guaD4KLSNpbmNsdWRlIDxhc20vdmFyaWFudC90aWUtYXNtLmg+CisjaW5jbHVkZSA8dmFyaWFudC90aWUtYXNtLmg+CiAKIC8qIFVuaW1wbGVtZW50ZWQgZmVhdHVyZXMuICovCiAKZGlmZiAtLWdpdCBhL2FyY2gveHRlbnNhL2tlcm5lbC92bWxpbnV4Lmxkcy5TIGIvYXJjaC94dGVuc2Eva2VybmVsL3ZtbGludXgubGRzLlMKaW5kZXggNTFmNGZiNi4uZDUwNjc3NCAxMDA2NDQKLS0tIGEvYXJjaC94dGVuc2Eva2VybmVsL3ZtbGludXgubGRzLlMKKysrIGIvYXJjaC94dGVuc2Eva2VybmVsL3ZtbGludXgubGRzLlMKQEAgLTE2LDcgKzE2LDcgQEAKIAogI2luY2x1ZGUgPGFzbS1nZW5lcmljL3ZtbGludXgubGRzLmg+CiAKLSNpbmNsdWRlIDxhc20vdmFyaWFudC9jb3JlLmg+CisjaW5jbHVkZSA8dmFyaWFudC9jb3JlLmg+CiBPVVRQVVRfQVJDSCh4dGVuc2EpCiBFTlRSWShfc3RhcnQpCiAKZGlmZiAtLWdpdCBhL2FyY2gveHRlbnNhL2xpYi9jaGVja3N1bS5TIGIvYXJjaC94dGVuc2EvbGliL2NoZWNrc3VtLlMKaW5kZXggOWQ5Y2Q5OS4uZGYzOTdmOSAxMDA2NDQKLS0tIGEvYXJjaC94dGVuc2EvbGliL2NoZWNrc3VtLlMKKysrIGIvYXJjaC94dGVuc2EvbGliL2NoZWNrc3VtLlMKQEAgLTE2LDcgKzE2LDcgQEAKIAogI2luY2x1ZGUgPGFzbS9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KLSNpbmNsdWRlIDxhc20vdmFyaWFudC9jb3JlLmg+CisjaW5jbHVkZSA8dmFyaWFudC9jb3JlLmg+CiAKIC8qCiAgKiBjb21wdXRlcyBhIHBhcnRpYWwgY2hlY2tzdW0sIGUuZy4gZm9yIFRDUC9VRFAgZnJhZ21lbnRzCmRpZmYgLS1naXQgYS9hcmNoL3h0ZW5zYS9saWIvbWVtY29weS5TIGIvYXJjaC94dGVuc2EvbGliL21lbWNvcHkuUwppbmRleCBkZGRhOGY0Li5lYTU5ZGNkIDEwMDY0NAotLS0gYS9hcmNoL3h0ZW5zYS9saWIvbWVtY29weS5TCisrKyBiL2FyY2gveHRlbnNhL2xpYi9tZW1jb3B5LlMKQEAgLTksNyArOSw3IEBACiAgKiBDb3B5cmlnaHQgKEMpIDIwMDIgLSAyMDA1IFRlbnNpbGljYSBJbmMuCiAgKi8KIAotI2luY2x1ZGUgPGFzbS92YXJpYW50L2NvcmUuaD4KKyNpbmNsdWRlIDx2YXJpYW50L2NvcmUuaD4KIAogCS5tYWNybwlzcmNfYglyLCB3MCwgdzEKICNpZmRlZiBfX1hURU5TQV9FQl9fCmRpZmYgLS1naXQgYS9hcmNoL3h0ZW5zYS9saWIvbWVtc2V0LlMgYi9hcmNoL3h0ZW5zYS9saWIvbWVtc2V0LlMKaW5kZXggNTZhMTc0OS4uMTBiOGM0MCAxMDA2NDQKLS0tIGEvYXJjaC94dGVuc2EvbGliL21lbXNldC5TCisrKyBiL2FyY2gveHRlbnNhL2xpYi9tZW1zZXQuUwpAQCAtMTEsNyArMTEsNyBAQAogICogIENvcHlyaWdodCAoQykgMjAwMiBUZW5zaWxpY2EgSW5jLgogICovCiAKLSNpbmNsdWRlIDxhc20vdmFyaWFudC9jb3JlLmg+CisjaW5jbHVkZSA8dmFyaWFudC9jb3JlLmg+CiAKIC8qCiAgKiB2b2lkICptZW1zZXQodm9pZCAqZHN0LCBpbnQgYywgc2l6ZV90IGxlbmd0aCkKZGlmZiAtLWdpdCBhL2FyY2gveHRlbnNhL2xpYi9zdHJuY3B5X3VzZXIuUyBiL2FyY2gveHRlbnNhL2xpYi9zdHJuY3B5X3VzZXIuUwppbmRleCBiMjY1NWQ5Li45ZjYwM2NkIDEwMDY0NAotLS0gYS9hcmNoL3h0ZW5zYS9saWIvc3RybmNweV91c2VyLlMKKysrIGIvYXJjaC94dGVuc2EvbGliL3N0cm5jcHlfdXNlci5TCkBAIC0xMSw3ICsxMSw3IEBACiAgKiAgQ29weXJpZ2h0IChDKSAyMDAyIFRlbnNpbGljYSBJbmMuCiAgKi8KIAotI2luY2x1ZGUgPGFzbS92YXJpYW50L2NvcmUuaD4KKyNpbmNsdWRlIDx2YXJpYW50L2NvcmUuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogCiAvKiBMb2FkIG9yIHN0b3JlIGluc3RydWN0aW9ucyB0aGF0IG1heSBjYXVzZSBleGNlcHRpb25zIHVzZSB0aGUgRVggbWFjcm8uICovCmRpZmYgLS1naXQgYS9hcmNoL3h0ZW5zYS9saWIvc3Rybmxlbl91c2VyLlMgYi9hcmNoL3h0ZW5zYS9saWIvc3Rybmxlbl91c2VyLlMKaW5kZXggYWQzZjYxNi4uMjNmMmE4OSAxMDA2NDQKLS0tIGEvYXJjaC94dGVuc2EvbGliL3N0cm5sZW5fdXNlci5TCisrKyBiL2FyY2gveHRlbnNhL2xpYi9zdHJubGVuX3VzZXIuUwpAQCAtMTEsNyArMTEsNyBAQAogICogIENvcHlyaWdodCAoQykgMjAwMiBUZW5zaWxpY2EgSW5jLgogICovCiAKLSNpbmNsdWRlIDxhc20vdmFyaWFudC9jb3JlLmg+CisjaW5jbHVkZSA8dmFyaWFudC9jb3JlLmg+CiAKIC8qIExvYWQgb3Igc3RvcmUgaW5zdHJ1Y3Rpb25zIHRoYXQgbWF5IGNhdXNlIGV4Y2VwdGlvbnMgdXNlIHRoZSBFWCBtYWNyby4gKi8KIApkaWZmIC0tZ2l0IGEvYXJjaC94dGVuc2EvbGliL3VzZXJjb3B5LlMgYi9hcmNoL3h0ZW5zYS9saWIvdXNlcmNvcHkuUwppbmRleCBhOGFiMWQ0Li40NmQ2MDMxIDEwMDY0NAotLS0gYS9hcmNoL3h0ZW5zYS9saWIvdXNlcmNvcHkuUworKysgYi9hcmNoL3h0ZW5zYS9saWIvdXNlcmNvcHkuUwpAQCAtNTMsNyArNTMsNyBAQAogICoJYTExLyBvcmlnaW5hbCBsZW5ndGgKICAqLwogCi0jaW5jbHVkZSA8YXNtL3ZhcmlhbnQvY29yZS5oPgorI2luY2x1ZGUgPHZhcmlhbnQvY29yZS5oPgogCiAjaWZkZWYgX19YVEVOU0FfRUJfXwogI2RlZmluZSBBTElHTihSLCBXMCwgVzEpIHNyYwlSLCBXMCwgVzEKZGlmZiAtLWdpdCBhL2FyY2gveHRlbnNhL3BsYXRmb3Jtcy9pc3MvY29uc29sZS5jIGIvYXJjaC94dGVuc2EvcGxhdGZvcm1zL2lzcy9jb25zb2xlLmMKaW5kZXggOTE0MWUzNi4uZWZlZDg4OSAxMDA2NDQKLS0tIGEvYXJjaC94dGVuc2EvcGxhdGZvcm1zL2lzcy9jb25zb2xlLmMKKysrIGIvYXJjaC94dGVuc2EvcGxhdGZvcm1zL2lzcy9jb25zb2xlLmMKQEAgLTEsNSArMSw1IEBACiAvKgotICogYXJjaC94dGVuc2EvcGxhdGZvcm0taXNzL2NvbnNvbGUuYworICogYXJjaC94dGVuc2EvcGxhdGZvcm1zL2lzcy9jb25zb2xlLmMKICAqCiAgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwogICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQpAQCAtMjQsNyArMjQsNyBAQAogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL2lycS5oPgogCi0jaW5jbHVkZSA8YXNtL3BsYXRmb3JtL3NpbWNhbGwuaD4KKyNpbmNsdWRlIDxwbGF0Zm9ybS9zaW1jYWxsLmg+CiAKICNpbmNsdWRlIDxsaW51eC90dHkuaD4KICNpbmNsdWRlIDxsaW51eC90dHlfZmxpcC5oPgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL3BsYXRmb3JtLWlzcy9oYXJkd2FyZS5oIGIvYXJjaC94dGVuc2EvcGxhdGZvcm1zL2lzcy9pbmNsdWRlL3BsYXRmb3JtL2hhcmR3YXJlLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLXh0ZW5zYS9wbGF0Zm9ybS1pc3MvaGFyZHdhcmUuaApyZW5hbWUgdG8gYXJjaC94dGVuc2EvcGxhdGZvcm1zL2lzcy9pbmNsdWRlL3BsYXRmb3JtL2hhcmR3YXJlLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9wbGF0Zm9ybS1pc3Mvc2ltY2FsbC5oIGIvYXJjaC94dGVuc2EvcGxhdGZvcm1zL2lzcy9pbmNsdWRlL3BsYXRmb3JtL3NpbWNhbGwuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20teHRlbnNhL3BsYXRmb3JtLWlzcy9zaW1jYWxsLmgKcmVuYW1lIHRvIGFyY2gveHRlbnNhL3BsYXRmb3Jtcy9pc3MvaW5jbHVkZS9wbGF0Zm9ybS9zaW1jYWxsLmgKZGlmZiAtLWdpdCBhL2FyY2gveHRlbnNhL3BsYXRmb3Jtcy9pc3MvaW8uYyBiL2FyY2gveHRlbnNhL3BsYXRmb3Jtcy9pc3MvaW8uYwppbmRleCA1YjE2MWE1Li41NzFkMGIyIDEwMDY0NAotLS0gYS9hcmNoL3h0ZW5zYS9wbGF0Zm9ybXMvaXNzL2lvLmMKKysrIGIvYXJjaC94dGVuc2EvcGxhdGZvcm1zL2lzcy9pby5jCkBAIC0zLDcgKzMsNyBAQAogI2lmIDAKIAogI2luY2x1ZGUgPGFzbS9pby5oPgotI2luY2x1ZGUgPHh0ZW5zYS9zaW1jYWxsLmg+CisjaW5jbHVkZSA8cGxhdGZvcm0vcGxhdGZvcm0taXNzL3NpbWNhbGwuaD4KIAogZXh0ZXJuIGludCBfX3NpbWMgKCk7CiAKZGlmZiAtLWdpdCBhL2FyY2gveHRlbnNhL3BsYXRmb3Jtcy9pc3MvbmV0d29yay5jIGIvYXJjaC94dGVuc2EvcGxhdGZvcm1zL2lzcy9uZXR3b3JrLmMKaW5kZXggNjRmMDU3ZC4uZWRhZDQxNSAxMDA2NDQKLS0tIGEvYXJjaC94dGVuc2EvcGxhdGZvcm1zL2lzcy9uZXR3b3JrLmMKKysrIGIvYXJjaC94dGVuc2EvcGxhdGZvcm1zL2lzcy9uZXR3b3JrLmMKQEAgLTEsNiArMSw2IEBACiAvKgogICoKLSAqIGFyY2gveHRlbnNhL3BsYXRmb3JtLWlzcy9uZXR3b3JrLmMKKyAqIGFyY2gveHRlbnNhL3BsYXRmb3Jtcy9pc3MvbmV0d29yay5jCiAgKgogICogUGxhdGZvcm0gc3BlY2lmaWMgaW5pdGlhbGl6YXRpb24uCiAgKgpAQCAtMzMsNyArMzMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3J0bmV0bGluay5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogCi0jaW5jbHVkZSA8YXNtL3BsYXRmb3JtL3NpbWNhbGwuaD4KKyNpbmNsdWRlIDxwbGF0Zm9ybS9zaW1jYWxsLmg+CiAKICNkZWZpbmUgRFJJVkVSX05BTUUgImlzcy1uZXRkZXYiCiAjZGVmaW5lIEVUSF9NQVhfUEFDS0VUIDE1MDAKZGlmZiAtLWdpdCBhL2FyY2gveHRlbnNhL3BsYXRmb3Jtcy94dDIwMDAvTWFrZWZpbGUgYi9hcmNoL3h0ZW5zYS9wbGF0Zm9ybXMveHQyMDAwL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0ZDAxOGUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3h0ZW5zYS9wbGF0Zm9ybXMveHQyMDAwL01ha2VmaWxlCkBAIC0wLDAgKzEsNSBAQAorIworIyBNYWtlZmlsZSBmb3IgdGhlIFRlbnNpbGljYSBYVDIwMDAgRW11bGF0aW9uIEJvYXJkCisjCisKK29iai15IAkJCT0gc2V0dXAubwpkaWZmIC0tZ2l0IGEvYXJjaC94dGVuc2EvcGxhdGZvcm1zL3h0MjAwMC9pbmNsdWRlL3BsYXRmb3JtL2hhcmR3YXJlLmggYi9hcmNoL3h0ZW5zYS9wbGF0Zm9ybXMveHQyMDAwL2luY2x1ZGUvcGxhdGZvcm0vaGFyZHdhcmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTQ1OWFkCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC94dGVuc2EvcGxhdGZvcm1zL3h0MjAwMC9pbmNsdWRlL3BsYXRmb3JtL2hhcmR3YXJlLmgKQEAgLTAsMCArMSw1NSBAQAorLyoKKyAqIHBsYXRmb3JtL2hhcmR3YXJlLmgKKyAqCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEgVGVuc2lsaWNhIEluYy4KKyAqLworCisvKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBoYXJkd2FyZSBjb25maWd1cmF0aW9uIG9mIHRoZSBYVDIwMDAgYm9hcmQuCisgKi8KKworI2lmbmRlZiBfWFRFTlNBX1hUMjAwMF9IQVJEV0FSRV9ICisjZGVmaW5lIF9YVEVOU0FfWFQyMDAwX0hBUkRXQVJFX0gKKworI2luY2x1ZGUgPHZhcmlhbnQvY29yZS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorCisvKiAKKyAqIE1lbW9yeSBjb25maWd1cmF0aW9uLgorICovCisKKyNkZWZpbmUgUExBVEZPUk1fREVGQVVMVF9NRU1fU1RBUlQgMHgwMDAwMDAwMAorI2RlZmluZSBQTEFURk9STV9ERUZBVUxUX01FTV9TSVpFIDB4MDgwMDAwMDAKKworLyoKKyAqIE51bWJlciBvZiBwbGF0Zm9ybSBJUlFzCisgKi8KKyNkZWZpbmUgUExBVEZPUk1fTlJfSVJRUyAzCisvKgorICogT24tYm9hcmQgY29tcG9uZW50cy4KKyAqLworCisjZGVmaW5lIFNPTklDODM5MzRfSU5UTlVNCVhDSEFMX0VYVElOVDNfTlVNCisjZGVmaW5lIFNPTklDODM5MzRfQUREUgkJSU9BRERSKDB4MGQwMzAwMDApCisKKy8qCisgKiBWMy1QQ0kKKyAqLworCisvKiBUaGUgWFQyMDAwIHVzZXMgdGhlIFYzIGFzIGEgY2FzY2FkZWQgaW50ZXJydXB0IGNvbnRyb2xsZXIgZm9yIHRoZSBQQ0kgYnVzICovCisKKyNkZWZpbmUgSVJRX1BDSV9BCQkoWENIQUxfTlVNX0lOVEVSUlVQVFMgKyAwKQorI2RlZmluZSBJUlFfUENJX0IJCShYQ0hBTF9OVU1fSU5URVJSVVBUUyArIDEpCisjZGVmaW5lIElSUV9QQ0lfQwkJKFhDSEFMX05VTV9JTlRFUlJVUFRTICsgMikKKworLyoKKyAqIFZhcmlvdXMgb3RoZXIgY29tcG9uZW50cy4KKyAqLworCisjZGVmaW5lIFhUMjAwMF9MRURfQUREUgkJSU9BRERSKDB4MGQwNDAwMDApCisKKyNlbmRpZiAvKiBfWFRFTlNBX1hUMjAwMF9IQVJEV0FSRV9IICovCmRpZmYgLS1naXQgYS9hcmNoL3h0ZW5zYS9wbGF0Zm9ybXMveHQyMDAwL2luY2x1ZGUvcGxhdGZvcm0vc2VyaWFsLmggYi9hcmNoL3h0ZW5zYS9wbGF0Zm9ybXMveHQyMDAwL2luY2x1ZGUvcGxhdGZvcm0vc2VyaWFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzIyNmNmNwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveHRlbnNhL3BsYXRmb3Jtcy94dDIwMDAvaW5jbHVkZS9wbGF0Zm9ybS9zZXJpYWwuaApAQCAtMCwwICsxLDI4IEBACisvKgorICogcGxhdGZvcm0vc2VyaWFsLmgKKyAqCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEgVGVuc2lsaWNhIEluYy4KKyAqLworCisjaWZuZGVmIF9YVEVOU0FfWFQyMDAwX1NFUklBTF9ICisjZGVmaW5lIF9YVEVOU0FfWFQyMDAwX1NFUklBTF9ICisKKyNpbmNsdWRlIDx2YXJpYW50L2NvcmUuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKworLyogIE5hdGlvbmFsLVNlbWkgUEMxNjU1MkQgRFVBUlQ6ICAqLworCisjZGVmaW5lIERVQVJUMTY1NTJfMV9JTlROVU0JWENIQUxfRVhUSU5UNF9OVU0KKyNkZWZpbmUgRFVBUlQxNjU1Ml8yX0lOVE5VTQlYQ0hBTF9FWFRJTlQ1X05VTQorCisjZGVmaW5lIERVQVJUMTY1NTJfMV9BRERSCUlPQUREUigweDBkMDUwMDIwKQkvKiBjaGFubmVsIDEgKi8KKyNkZWZpbmUgRFVBUlQxNjU1Ml8yX0FERFIJSU9BRERSKDB4MGQwNTAwMDApCS8qIGNoYW5uZWwgMiAqLworCisjZGVmaW5lIERVQVJUMTY1NTJfWFRBTF9GUkVRCTE4NDMyMDAwCS8qIGNyeXN0YWwgZnJlcXVlbmN5IGluIEh6ICovCisjZGVmaW5lIEJBU0VfQkFVRCAoIERVQVJUMTY1NTJfWFRBTF9GUkVRIC8gMTYgKQorCisjZW5kaWYgLyogX1hURU5TQV9YVDIwMDBfU0VSSUFMX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gveHRlbnNhL3BsYXRmb3Jtcy94dDIwMDAvc2V0dXAuYyBiL2FyY2gveHRlbnNhL3BsYXRmb3Jtcy94dDIwMDAvc2V0dXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTgzOTQwCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC94dGVuc2EvcGxhdGZvcm1zL3h0MjAwMC9zZXR1cC5jCkBAIC0wLDAgKzEsMTgxIEBACisvKgorICogYXJjaC94dGVuc2EvcGxhdGZvcm1zL3h0MjAwMC9zZXR1cC5jCisgKgorICogUGxhdGZvcm0gc3BlY2lmaWMgZnVuY3Rpb25zIGZvciB0aGUgWFQyMDAwIGJvYXJkLgorICoKKyAqIEF1dGhvcnM6CUNocmlzIFphbmtlbCA8Y2hyaXNAemFua2VsLm5ldD4KKyAqCQlKb2UgVGF5bG9yIDxqb2VAdGVuc2lsaWNhLmNvbT4KKyAqCisgKiBDb3B5cmlnaHQgMjAwMSAtIDIwMDQgVGVuc2lsaWNhIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqLworI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3JlYm9vdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tkZXZfdC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvbWFqb3IuaD4KKyNpbmNsdWRlIDxsaW51eC9jb25zb2xlLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmdpZnkuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWxfODI1MC5oPgorCisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorI2luY2x1ZGUgPGFzbS9wbGF0Zm9ybS5oPgorI2luY2x1ZGUgPGFzbS9ib290cGFyYW0uaD4KKyNpbmNsdWRlIDxwbGF0Zm9ybS9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPHBsYXRmb3JtL3NlcmlhbC5oPgorCisvKiBBc3N1bWVzIHMgcG9pbnRzIHRvIGFuIDgtY2hyIHN0cmluZy4gIE5vIGNoZWNraW5nIGZvciBOVUxMLiAqLworCitzdGF0aWMgdm9pZCBsZWRfcHJpbnQgKGludCBmLCBjaGFyICpzKQoreworCXVuc2lnbmVkIGxvbmcqIGxlZF9hZGRyID0gKHVuc2lnbmVkIGxvbmcqKSAoWFQyMDAwX0xFRF9BRERSICsgMHhFMCkgKyBmOworCWludCBpOworCWZvciAoaSA9IGY7IGkgPCA4OyBpKyspCisJCWlmICgoKmxlZF9hZGRyKysgPSAqcysrKSA9PSAwKQorCQkgICAgYnJlYWs7Cit9CisKK3ZvaWQgcGxhdGZvcm1faGFsdCh2b2lkKQoreworCWxlZF9wcmludCAoMCwgIiAgSEFMVCAgIik7CisJbG9jYWxfaXJxX2Rpc2FibGUoKTsKKwl3aGlsZSAoMSk7Cit9CisKK3ZvaWQgcGxhdGZvcm1fcG93ZXJfb2ZmKHZvaWQpCit7CisJbGVkX3ByaW50ICgwLCAiUE9XRVJPRkYiKTsKKwlsb2NhbF9pcnFfZGlzYWJsZSgpOworCXdoaWxlICgxKTsKK30KKwordm9pZCBwbGF0Zm9ybV9yZXN0YXJ0KHZvaWQpCit7CisJLyogRmx1c2ggYW5kIHJlc2V0IHRoZSBtbXUsIHNpbXVsYXRlIGEgcHJvY2Vzc29yIHJlc2V0LCBhbmQKKwkgKiBqdW1wIHRvIHRoZSByZXNldCB2ZWN0b3IuICovCisKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIm1vdmkJYTIsIDE1XG5cdCIKKwkJCSAgICAgICJ3c3IJYTIsICIgX19zdHJpbmdpZnkoSUNPVU5UTEVWRUwpICJcblx0IgorCQkJICAgICAgIm1vdmkJYTIsIDBcblx0IgorCQkJICAgICAgIndzcglhMiwgIiBfX3N0cmluZ2lmeShJQ09VTlQpICJcblx0IgorCQkJICAgICAgIndzcglhMiwgIiBfX3N0cmluZ2lmeShJQlJFQUtFTkFCTEUpICJcblx0IgorCQkJICAgICAgIndzcglhMiwgIiBfX3N0cmluZ2lmeShMQ09VTlQpICJcblx0IgorCQkJICAgICAgIm1vdmkJYTIsIDB4MWZcblx0IgorCQkJICAgICAgIndzcglhMiwgIiBfX3N0cmluZ2lmeShQUykgIlxuXHQiCisJCQkgICAgICAiaXN5bmNcblx0IgorCQkJICAgICAgImp4CSUwXG5cdCIKKwkJCSAgICAgIDoKKwkJCSAgICAgIDogImEiIChYQ0hBTF9SRVNFVF9WRUNUT1JfVkFERFIpCisJCQkgICAgICA6ICJhMiIKKwkJCSAgICAgICk7CisKKwkvKiBjb250cm9sIG5ldmVyIGdldHMgaGVyZSAqLworfQorCit2b2lkIF9faW5pdCBwbGF0Zm9ybV9zZXR1cChjaGFyKiogY21kbGluZSkKK3sKKwlsZWRfcHJpbnQgKDAsICJMSU5VWCAgICIpOworfQorCisvKiBlYXJseSBpbml0aWFsaXphdGlvbiAqLworCitleHRlcm4gc3lzbWVtX2luZm9fdCBfX2luaXRkYXRhIHN5c21lbTsKKwordm9pZCBwbGF0Zm9ybV9pbml0KGJwX3RhZ190KiBmaXJzdCkKK3sKKwkvKiBTZXQgZGVmYXVsdCBtZW1vcnkgYmxvY2sgaWYgbm90IHByb3ZpZGVkIGJ5IHRoZSBib290bG9hZGVyLiAqLworCisJaWYgKHN5c21lbS5ucl9iYW5rcyA9PSAwKSB7CisJCXN5c21lbS5ucl9iYW5rcyA9IDE7CisJCXN5c21lbS5iYW5rWzBdLnN0YXJ0ID0gUExBVEZPUk1fREVGQVVMVF9NRU1fU1RBUlQ7CisJCXN5c21lbS5iYW5rWzBdLmVuZCA9IFBMQVRGT1JNX0RFRkFVTFRfTUVNX1NUQVJUCisJCQkJICAgICArIFBMQVRGT1JNX0RFRkFVTFRfTUVNX1NJWkU7CisJfQorfQorCisvKiBIZWFydGJlYXQuIExldCB0aGUgTEVEIGJsaW5rLiAqLworCit2b2lkIHBsYXRmb3JtX2hlYXJ0YmVhdCh2b2lkKQoreworCXN0YXRpYyBpbnQgaT0wLCB0ID0gMDsKKworCWlmICgtLXQgPCAwKQorCXsKKwkJdCA9IDU5OworCQlsZWRfcHJpbnQoNywgaSA/ICIuIjogIiAiKTsKKwkJaSBePSAxOworCX0KK30KKworLy8jZGVmaW5lIFJTX1RBQkxFX1NJWkUgMgorLy8jZGVmaW5lIFNURF9DT01fRkxBR1MgKEFTWU5DX0JPT1RfQVVUT0NPTkZ8QVNZTkNfU0tJUF9URVNUKQorCisjZGVmaW5lIF9TRVJJQUxfUE9SVChfYmFzZSxfaXJxKQkJCQkJXAorewkJCQkJCQkJCVwKKwkubWFwYmFzZQk9IChfYmFzZSksCQkJCQlcCisJLm1lbWJhc2UJPSAodm9pZCopKF9iYXNlKSwJCQkJXAorCS5pcnEJCT0gKF9pcnEpLAkJCQkJXAorCS51YXJ0Y2xrCT0gRFVBUlQxNjU1Ml9YVEFMX0ZSRVEsCQkJCVwKKwkuaW90eXBlCQk9IFVQSU9fTUVNLAkJCQkJXAorCS5mbGFncwkJPSBVUEZfQk9PVF9BVVRPQ09ORiwJCQkJXAorCS5yZWdzaGlmdAk9IDIsCQkJCQkJXAorfQorCitzdGF0aWMgc3RydWN0IHBsYXRfc2VyaWFsODI1MF9wb3J0IHh0MjAwMF9zZXJpYWxfZGF0YVtdID0geworI2lmIFhDSEFMX0hBVkVfQkUKKwlfU0VSSUFMX1BPUlQoRFVBUlQxNjU1Ml8xX0FERFIgKyAzLCBEVUFSVDE2NTUyXzFfSU5UTlVNKSwKKwlfU0VSSUFMX1BPUlQoRFVBUlQxNjU1Ml8yX0FERFIgKyAzLCBEVUFSVDE2NTUyXzJfSU5UTlVNKSwKKyNlbHNlCisJX1NFUklBTF9QT1JUKERVQVJUMTY1NTJfMV9BRERSLCBEVUFSVDE2NTUyXzFfSU5UTlVNKSwKKwlfU0VSSUFMX1BPUlQoRFVBUlQxNjU1Ml8yX0FERFIsIERVQVJUMTY1NTJfMl9JTlROVU0pLAorI2VuZGlmCisJeyB9Cit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSB4dDIwMDBfc2VyaWFsODI1MF9kZXZpY2UgPSB7CisJLm5hbWUJCT0gInNlcmlhbDgyNTAiLAorCS5pZAkJPSBQTEFUODI1MF9ERVZfUExBVEZPUk0sCisJLmRldgkJPSB7CisJICAgIC5wbGF0Zm9ybV9kYXRhID0geHQyMDAwX3NlcmlhbF9kYXRhLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHh0MjAwMF9zb25pY19yZXNbXSA9IHsKKwl7CisJCS5zdGFydCA9IFNPTklDODM5MzRfQUREUiwKKwkJLmVuZCAgID0gU09OSUM4MzkzNF9BRERSICsgMHhmZiwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwl7CisJCS5zdGFydCA9IFNPTklDODM5MzRfSU5UTlVNLAorCQkuZW5kID0gU09OSUM4MzkzNF9JTlROVU0sCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSB4dDIwMDBfc29uaWNfZGV2aWNlID0geworCS5uYW1lCQk9ICJ4dHNvbmljIiwKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoeHQyMDAwX3NvbmljX3JlcyksCisJLnJlc291cmNlCQk9IHh0MjAwMF9zb25pY19yZXMsCit9OworCitzdGF0aWMgaW50IF9faW5pdCB4dDIwMDBfc2V0dXBfZGV2aW5pdCh2b2lkKQoreworCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmeHQyMDAwX3NlcmlhbDgyNTBfZGV2aWNlKTsKKwlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJnh0MjAwMF9zb25pY19kZXZpY2UpOworCisJcmV0dXJuIDA7Cit9CisKK2RldmljZV9pbml0Y2FsbCh4dDIwMDBfc2V0dXBfZGV2aW5pdCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2EvdmFyaWFudC1kYzIzMmIvY29yZS5oIGIvYXJjaC94dGVuc2EvdmFyaWFudHMvZGMyMzJiL2luY2x1ZGUvdmFyaWFudC9jb3JlLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLXh0ZW5zYS92YXJpYW50LWRjMjMyYi9jb3JlLmgKcmVuYW1lIHRvIGFyY2gveHRlbnNhL3ZhcmlhbnRzL2RjMjMyYi9pbmNsdWRlL3ZhcmlhbnQvY29yZS5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2EvdmFyaWFudC1kYzIzMmIvdGllLWFzbS5oIGIvYXJjaC94dGVuc2EvdmFyaWFudHMvZGMyMzJiL2luY2x1ZGUvdmFyaWFudC90aWUtYXNtLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLXh0ZW5zYS92YXJpYW50LWRjMjMyYi90aWUtYXNtLmgKcmVuYW1lIHRvIGFyY2gveHRlbnNhL3ZhcmlhbnRzL2RjMjMyYi9pbmNsdWRlL3ZhcmlhbnQvdGllLWFzbS5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2EvdmFyaWFudC1kYzIzMmIvdGllLmggYi9hcmNoL3h0ZW5zYS92YXJpYW50cy9kYzIzMmIvaW5jbHVkZS92YXJpYW50L3RpZS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS14dGVuc2EvdmFyaWFudC1kYzIzMmIvdGllLmgKcmVuYW1lIHRvIGFyY2gveHRlbnNhL3ZhcmlhbnRzL2RjMjMyYi9pbmNsdWRlL3ZhcmlhbnQvdGllLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS92YXJpYW50LWZzZi9jb3JlLmggYi9hcmNoL3h0ZW5zYS92YXJpYW50cy9mc2YvaW5jbHVkZS92YXJpYW50L2NvcmUuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20teHRlbnNhL3ZhcmlhbnQtZnNmL2NvcmUuaApyZW5hbWUgdG8gYXJjaC94dGVuc2EvdmFyaWFudHMvZnNmL2luY2x1ZGUvdmFyaWFudC9jb3JlLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS92YXJpYW50LWZzZi90aWUtYXNtLmggYi9hcmNoL3h0ZW5zYS92YXJpYW50cy9mc2YvaW5jbHVkZS92YXJpYW50L3RpZS1hc20uaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20teHRlbnNhL3ZhcmlhbnQtZnNmL3RpZS1hc20uaApyZW5hbWUgdG8gYXJjaC94dGVuc2EvdmFyaWFudHMvZnNmL2luY2x1ZGUvdmFyaWFudC90aWUtYXNtLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS92YXJpYW50LWZzZi90aWUuaCBiL2FyY2gveHRlbnNhL3ZhcmlhbnRzL2ZzZi9pbmNsdWRlL3ZhcmlhbnQvdGllLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLXh0ZW5zYS92YXJpYW50LWZzZi90aWUuaApyZW5hbWUgdG8gYXJjaC94dGVuc2EvdmFyaWFudHMvZnNmL2luY2x1ZGUvdmFyaWFudC90aWUuaApkaWZmIC0tZ2l0IGEvYmxvY2svS2NvbmZpZyBiL2Jsb2NrL0tjb25maWcKaW5kZXggYWMwOTU2Zi4uMGNiYjNiOCAxMDA2NDQKLS0tIGEvYmxvY2svS2NvbmZpZworKysgYi9ibG9jay9LY29uZmlnCkBAIC0zNiw2ICszNiwxMiBAQAogCSAgVGhpcyBvcHRpb24gYWxzbyBlbmFibGVzIHN1cHBvcnQgZm9yIHNpbmdsZSBmaWxlcyBsYXJnZXIgdGhhbgogCSAgMlRCLgogCisJICBUaGUgZXh0NCBmaWxlc3lzdGVtIHJlcXVpcmVzIHRoYXQgdGhpcyBmZWF0dXJlIGJlIGVuYWJsZWQgaW4KKwkgIG9yZGVyIHRvIHN1cHBvcnQgZmlsZXN5c3RlbXMgdGhhdCBoYXZlIHRoZSBodWdlX2ZpbGUgZmVhdHVyZQorCSAgZW5hYmxlZC4gICAgT3RoZXJ3aXNlLCBpdCB3aWxsIHJlZnVzZSB0byBtb3VudCBhbnkgZmlsZXN5c3RlbXMKKwkgIHRoYXQgdXNlIHRoZSBodWdlX2ZpbGUgZmVhdHVyZSwgd2hpY2ggaXMgZW5hYmxlZCBieSBkZWZhdWx0CisJICBieSBta2UyZnMuZXh0NC4gICBUaGUgR0ZTMiBmaWxlc3lzdGVtIGFsc28gcmVxdWlyZXMgdGhpcyBmZWF0dXJlLgorCiAJICBJZiB1bnN1cmUsIHNheSBOLgogCiBjb25maWcgQkxLX0RFVl9JT19UUkFDRQpkaWZmIC0tZ2l0IGEvYmxvY2svYmxrLW1hcC5jIGIvYmxvY2svYmxrLW1hcC5jCmluZGV4IDI5OTA0NDcuLmYxMDM3MjkgMTAwNjQ0Ci0tLSBhL2Jsb2NrL2Jsay1tYXAuYworKysgYi9ibG9jay9ibGstbWFwLmMKQEAgLTQyLDcgKzQyLDcgQEAKIAogc3RhdGljIGludCBfX2Jsa19ycV9tYXBfdXNlcihzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgc3RydWN0IHJlcXVlc3QgKnJxLAogCQkJICAgICBzdHJ1Y3QgcnFfbWFwX2RhdGEgKm1hcF9kYXRhLCB2b2lkIF9fdXNlciAqdWJ1ZiwKLQkJCSAgICAgdW5zaWduZWQgaW50IGxlbiwgaW50IG51bGxfbWFwcGVkLCBnZnBfdCBnZnBfbWFzaykKKwkJCSAgICAgdW5zaWduZWQgaW50IGxlbiwgZ2ZwX3QgZ2ZwX21hc2spCiB7CiAJdW5zaWduZWQgbG9uZyB1YWRkcjsKIAlzdHJ1Y3QgYmlvICpiaW8sICpvcmlnX2JpbzsKQEAgLTYzLDcgKzYzLDcgQEAKIAlpZiAoSVNfRVJSKGJpbykpCiAJCXJldHVybiBQVFJfRVJSKGJpbyk7CiAKLQlpZiAobnVsbF9tYXBwZWQpCisJaWYgKG1hcF9kYXRhICYmIG1hcF9kYXRhLT5udWxsX21hcHBlZCkKIAkJYmlvLT5iaV9mbGFncyB8PSAoMSA8PCBCSU9fTlVMTF9NQVBQRUQpOwogCiAJb3JpZ19iaW8gPSBiaW87CkBAIC0xMTQsMTcgKzExNCwxNSBAQAogewogCXVuc2lnbmVkIGxvbmcgYnl0ZXNfcmVhZCA9IDA7CiAJc3RydWN0IGJpbyAqYmlvID0gTlVMTDsKLQlpbnQgcmV0LCBudWxsX21hcHBlZCA9IDA7CisJaW50IHJldDsKIAogCWlmIChsZW4gPiAocS0+bWF4X2h3X3NlY3RvcnMgPDwgOSkpCiAJCXJldHVybiAtRUlOVkFMOwogCWlmICghbGVuKQogCQlyZXR1cm4gLUVJTlZBTDsKLQlpZiAoIXVidWYpIHsKLQkJaWYgKCFtYXBfZGF0YSB8fCBycV9kYXRhX2RpcihycSkgIT0gUkVBRCkKLQkJCXJldHVybiAtRUlOVkFMOwotCQludWxsX21hcHBlZCA9IDE7Ci0JfQorCisJaWYgKCF1YnVmICYmICghbWFwX2RhdGEgfHwgIW1hcF9kYXRhLT5udWxsX21hcHBlZCkpCisJCXJldHVybiAtRUlOVkFMOwogCiAJd2hpbGUgKGJ5dGVzX3JlYWQgIT0gbGVuKSB7CiAJCXVuc2lnbmVkIGxvbmcgbWFwX2xlbiwgZW5kLCBzdGFydDsKQEAgLTE0MywxMyArMTQxLDE2IEBACiAJCQltYXBfbGVuIC09IFBBR0VfU0laRTsKIAogCQlyZXQgPSBfX2Jsa19ycV9tYXBfdXNlcihxLCBycSwgbWFwX2RhdGEsIHVidWYsIG1hcF9sZW4sCi0JCQkJCW51bGxfbWFwcGVkLCBnZnBfbWFzayk7CisJCQkJCWdmcF9tYXNrKTsKIAkJaWYgKHJldCA8IDApCiAJCQlnb3RvIHVubWFwX3JxOwogCQlpZiAoIWJpbykKIAkJCWJpbyA9IHJxLT5iaW87CiAJCWJ5dGVzX3JlYWQgKz0gcmV0OwogCQl1YnVmICs9IHJldDsKKworCQlpZiAobWFwX2RhdGEpCisJCQltYXBfZGF0YS0+b2Zmc2V0ICs9IHJldDsKIAl9CiAKIAlpZiAoIWJpb19mbGFnZ2VkKGJpbywgQklPX1VTRVJfTUFQUEVEKSkKZGlmZiAtLWdpdCBhL2NyeXB0by9hc3luY190eC9hc3luY190eC5jIGIvY3J5cHRvL2FzeW5jX3R4L2FzeW5jX3R4LmMKaW5kZXggZGNiZjFiZS4uZjIxMTQ3ZiAxMDA2NDQKLS0tIGEvY3J5cHRvL2FzeW5jX3R4L2FzeW5jX3R4LmMKKysrIGIvY3J5cHRvL2FzeW5jX3R4L2FzeW5jX3R4LmMKQEAgLTI4LDM1MSArMjgsMTggQEAKICNpbmNsdWRlIDxsaW51eC9hc3luY190eC5oPgogCiAjaWZkZWYgQ09ORklHX0RNQV9FTkdJTkUKLXN0YXRpYyBlbnVtIGRtYV9zdGF0ZV9jbGllbnQKLWRtYV9jaGFubmVsX2FkZF9yZW1vdmUoc3RydWN0IGRtYV9jbGllbnQgKmNsaWVudCwKLQlzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4sIGVudW0gZG1hX3N0YXRlIHN0YXRlKTsKLQotc3RhdGljIHN0cnVjdCBkbWFfY2xpZW50IGFzeW5jX3R4X2RtYSA9IHsKLQkuZXZlbnRfY2FsbGJhY2sgPSBkbWFfY2hhbm5lbF9hZGRfcmVtb3ZlLAotCS8qIC5jYXBfbWFzayA9PSAwIGRlZmF1bHRzIHRvIGFsbCBjaGFubmVscyAqLwotfTsKLQotLyoqCi0gKiBkbWFfY2FwX21hc2tfYWxsIC0gZW5hYmxlIGl0ZXJhdGlvbiBvdmVyIGFsbCBvcGVyYXRpb24gdHlwZXMKLSAqLwotc3RhdGljIGRtYV9jYXBfbWFza190IGRtYV9jYXBfbWFza19hbGw7Ci0KLS8qKgotICogY2hhbl9yZWZfcGVyY3B1IC0gdHJhY2tzIGNoYW5uZWwgYWxsb2NhdGlvbnMgcGVyIGNvcmUvb3BlcnRpb24KLSAqLwotc3RydWN0IGNoYW5fcmVmX3BlcmNwdSB7Ci0Jc3RydWN0IGRtYV9jaGFuX3JlZiAqcmVmOwotfTsKLQotc3RhdGljIGludCBjaGFubmVsX3RhYmxlX2luaXRpYWxpemVkOwotc3RhdGljIHN0cnVjdCBjaGFuX3JlZl9wZXJjcHUgKmNoYW5uZWxfdGFibGVbRE1BX1RYX1RZUEVfRU5EXTsKLQotLyoqCi0gKiBhc3luY190eF9sb2NrIC0gcHJvdGVjdCBtb2RpZmljYXRpb24gb2YgYXN5bmNfdHhfbWFzdGVyX2xpc3QgYW5kIHNlcmlhbGl6ZQotICoJcmViYWxhbmNlIG9wZXJhdGlvbnMKLSAqLwotc3RhdGljIHNwaW5sb2NrX3QgYXN5bmNfdHhfbG9jazsKLQotc3RhdGljIExJU1RfSEVBRChhc3luY190eF9tYXN0ZXJfbGlzdCk7Ci0KLS8qIGFzeW5jX3R4X2lzc3VlX3BlbmRpbmdfYWxsIC0gc3RhcnQgYWxsIHRyYW5zYWN0aW9ucyBvbiBhbGwgY2hhbm5lbHMgKi8KLXZvaWQgYXN5bmNfdHhfaXNzdWVfcGVuZGluZ19hbGwodm9pZCkKK3N0YXRpYyBpbnQgX19pbml0IGFzeW5jX3R4X2luaXQodm9pZCkKIHsKLQlzdHJ1Y3QgZG1hX2NoYW5fcmVmICpyZWY7Ci0KLQlyY3VfcmVhZF9sb2NrKCk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UocmVmLCAmYXN5bmNfdHhfbWFzdGVyX2xpc3QsIG5vZGUpCi0JCXJlZi0+Y2hhbi0+ZGV2aWNlLT5kZXZpY2VfaXNzdWVfcGVuZGluZyhyZWYtPmNoYW4pOwotCXJjdV9yZWFkX3VubG9jaygpOwotfQotRVhQT1JUX1NZTUJPTF9HUEwoYXN5bmNfdHhfaXNzdWVfcGVuZGluZ19hbGwpOwotCi0vKiBkbWFfd2FpdF9mb3JfYXN5bmNfdHggLSBzcGluIHdhaXQgZm9yIGEgdHJhbnNjYXRpb24gdG8gY29tcGxldGUKLSAqIEB0eDogdHJhbnNhY3Rpb24gdG8gd2FpdCBvbgotICovCi1lbnVtIGRtYV9zdGF0dXMKLWRtYV93YWl0X2Zvcl9hc3luY190eChzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKnR4KQotewotCWVudW0gZG1hX3N0YXR1cyBzdGF0dXM7Ci0Jc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICppdGVyOwotCXN0cnVjdCBkbWFfYXN5bmNfdHhfZGVzY3JpcHRvciAqcGFyZW50OwotCi0JaWYgKCF0eCkKLQkJcmV0dXJuIERNQV9TVUNDRVNTOwotCi0JLyogcG9sbCB0aHJvdWdoIHRoZSBkZXBlbmRlbmN5IGNoYWluLCByZXR1cm4gd2hlbiB0eCBpcyBjb21wbGV0ZSAqLwotCWRvIHsKLQkJaXRlciA9IHR4OwotCi0JCS8qIGZpbmQgdGhlIHJvb3Qgb2YgdGhlIHVuc3VibWl0dGVkIGRlcGVuZGVuY3kgY2hhaW4gKi8KLQkJZG8gewotCQkJcGFyZW50ID0gaXRlci0+cGFyZW50OwotCQkJaWYgKCFwYXJlbnQpCi0JCQkJYnJlYWs7Ci0JCQllbHNlCi0JCQkJaXRlciA9IHBhcmVudDsKLQkJfSB3aGlsZSAocGFyZW50KTsKLQotCQkvKiB0aGVyZSBpcyBhIHNtYWxsIHdpbmRvdyBmb3IgLT5wYXJlbnQgPT0gTlVMTCBhbmQKLQkJICogLT5jb29raWUgPT0gLUVCVVNZCi0JCSAqLwotCQl3aGlsZSAoaXRlci0+Y29va2llID09IC1FQlVTWSkKLQkJCWNwdV9yZWxheCgpOwotCi0JCXN0YXR1cyA9IGRtYV9zeW5jX3dhaXQoaXRlci0+Y2hhbiwgaXRlci0+Y29va2llKTsKLQl9IHdoaWxlIChzdGF0dXMgPT0gRE1BX0lOX1BST0dSRVNTIHx8IChpdGVyICE9IHR4KSk7Ci0KLQlyZXR1cm4gc3RhdHVzOwotfQotRVhQT1JUX1NZTUJPTF9HUEwoZG1hX3dhaXRfZm9yX2FzeW5jX3R4KTsKLQotLyogYXN5bmNfdHhfcnVuX2RlcGVuZGVuY2llcyAtIGhlbHBlciByb3V0aW5lIGZvciBkbWEgZHJpdmVycyB0byBwcm9jZXNzCi0gKgkoc3RhcnQpIGRlcGVuZGVudCBvcGVyYXRpb25zIG9uIHRoZWlyIHRhcmdldCBjaGFubmVsCi0gKiBAdHg6IHRyYW5zYWN0aW9uIHdpdGggZGVwZW5kZW5jaWVzCi0gKi8KLXZvaWQgYXN5bmNfdHhfcnVuX2RlcGVuZGVuY2llcyhzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKnR4KQotewotCXN0cnVjdCBkbWFfYXN5bmNfdHhfZGVzY3JpcHRvciAqZGVwID0gdHgtPm5leHQ7Ci0Jc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICpkZXBfbmV4dDsKLQlzdHJ1Y3QgZG1hX2NoYW4gKmNoYW47Ci0KLQlpZiAoIWRlcCkKLQkJcmV0dXJuOwotCi0JY2hhbiA9IGRlcC0+Y2hhbjsKLQotCS8qIGtlZXAgc3VibWl0dGluZyB1cCB1bnRpbCBhIGNoYW5uZWwgc3dpdGNoIGlzIGRldGVjdGVkCi0JICogaW4gdGhhdCBjYXNlIHdlIHdpbGwgYmUgY2FsbGVkIGFnYWluIGFzIGEgcmVzdWx0IG9mCi0JICogcHJvY2Vzc2luZyB0aGUgaW50ZXJydXB0IGZyb20gYXN5bmNfdHhfY2hhbm5lbF9zd2l0Y2gKLQkgKi8KLQlmb3IgKDsgZGVwOyBkZXAgPSBkZXBfbmV4dCkgewotCQlzcGluX2xvY2tfYmgoJmRlcC0+bG9jayk7Ci0JCWRlcC0+cGFyZW50ID0gTlVMTDsKLQkJZGVwX25leHQgPSBkZXAtPm5leHQ7Ci0JCWlmIChkZXBfbmV4dCAmJiBkZXBfbmV4dC0+Y2hhbiA9PSBjaGFuKQotCQkJZGVwLT5uZXh0ID0gTlVMTDsgLyogLT5uZXh0IHdpbGwgYmUgc3VibWl0dGVkICovCi0JCWVsc2UKLQkJCWRlcF9uZXh0ID0gTlVMTDsgLyogc3VibWl0IGN1cnJlbnQgZGVwIGFuZCB0ZXJtaW5hdGUgKi8KLQkJc3Bpbl91bmxvY2tfYmgoJmRlcC0+bG9jayk7Ci0KLQkJZGVwLT50eF9zdWJtaXQoZGVwKTsKLQl9Ci0KLQljaGFuLT5kZXZpY2UtPmRldmljZV9pc3N1ZV9wZW5kaW5nKGNoYW4pOwotfQotRVhQT1JUX1NZTUJPTF9HUEwoYXN5bmNfdHhfcnVuX2RlcGVuZGVuY2llcyk7Ci0KLXN0YXRpYyB2b2lkCi1mcmVlX2RtYV9jaGFuX3JlZihzdHJ1Y3QgcmN1X2hlYWQgKnJjdSkKLXsKLQlzdHJ1Y3QgZG1hX2NoYW5fcmVmICpyZWY7Ci0JcmVmID0gY29udGFpbmVyX29mKHJjdSwgc3RydWN0IGRtYV9jaGFuX3JlZiwgcmN1KTsKLQlrZnJlZShyZWYpOwotfQotCi1zdGF0aWMgdm9pZAotaW5pdF9kbWFfY2hhbl9yZWYoc3RydWN0IGRtYV9jaGFuX3JlZiAqcmVmLCBzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4pCi17Ci0JSU5JVF9MSVNUX0hFQUQoJnJlZi0+bm9kZSk7Ci0JSU5JVF9SQ1VfSEVBRCgmcmVmLT5yY3UpOwotCXJlZi0+Y2hhbiA9IGNoYW47Ci0JYXRvbWljX3NldCgmcmVmLT5jb3VudCwgMCk7Ci19Ci0KLS8qKgotICogZ2V0X2NoYW5fcmVmX2J5X2NhcCAtIHJldHVybnMgdGhlIG50aCBjaGFubmVsIG9mIHRoZSBnaXZlbiBjYXBhYmlsaXR5Ci0gKiAJZGVmYXVsdHMgdG8gcmV0dXJuaW5nIHRoZSBjaGFubmVsIHdpdGggdGhlIGRlc2lyZWQgY2FwYWJpbGl0eSBhbmQgdGhlCi0gKiAJbG93ZXN0IHJlZmVyZW5jZSBjb3VudCBpZiB0aGUgaW5kZXggY2FuIG5vdCBiZSBzYXRpc2ZpZWQKLSAqIEBjYXA6IGNhcGFiaWxpdHkgdG8gbWF0Y2gKLSAqIEBpbmRleDogbnRoIGNoYW5uZWwgZGVzaXJlZCwgcGFzc2luZyAtMSBoYXMgdGhlIGVmZmVjdCBvZiBmb3JjaW5nIHRoZQotICogIGRlZmF1bHQgcmV0dXJuIHZhbHVlCi0gKi8KLXN0YXRpYyBzdHJ1Y3QgZG1hX2NoYW5fcmVmICoKLWdldF9jaGFuX3JlZl9ieV9jYXAoZW51bSBkbWFfdHJhbnNhY3Rpb25fdHlwZSBjYXAsIGludCBpbmRleCkKLXsKLQlzdHJ1Y3QgZG1hX2NoYW5fcmVmICpyZXRfcmVmID0gTlVMTCwgKm1pbl9yZWYgPSBOVUxMLCAqcmVmOwotCi0JcmN1X3JlYWRfbG9jaygpOwotCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KHJlZiwgJmFzeW5jX3R4X21hc3Rlcl9saXN0LCBub2RlKQotCQlpZiAoZG1hX2hhc19jYXAoY2FwLCByZWYtPmNoYW4tPmRldmljZS0+Y2FwX21hc2spKSB7Ci0JCQlpZiAoIW1pbl9yZWYpCi0JCQkJbWluX3JlZiA9IHJlZjsKLQkJCWVsc2UgaWYgKGF0b21pY19yZWFkKCZyZWYtPmNvdW50KSA8Ci0JCQkJYXRvbWljX3JlYWQoJm1pbl9yZWYtPmNvdW50KSkKLQkJCQltaW5fcmVmID0gcmVmOwotCi0JCQlpZiAoaW5kZXgtLSA9PSAwKSB7Ci0JCQkJcmV0X3JlZiA9IHJlZjsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCXJjdV9yZWFkX3VubG9jaygpOwotCi0JaWYgKCFyZXRfcmVmKQotCQlyZXRfcmVmID0gbWluX3JlZjsKLQotCWlmIChyZXRfcmVmKQotCQlhdG9taWNfaW5jKCZyZXRfcmVmLT5jb3VudCk7Ci0KLQlyZXR1cm4gcmV0X3JlZjsKLX0KLQotLyoqCi0gKiBhc3luY190eF9yZWJhbGFuY2UgLSByZWRpc3RyaWJ1dGUgdGhlIGF2YWlsYWJsZSBjaGFubmVscywgb3B0aW1pemUKLSAqIGZvciBjcHUgaXNvbGF0aW9uIGluIHRoZSBTTVAgY2FzZSwgYW5kIG9wZXJ0YWlvbiBpc29sYXRpb24gaW4gdGhlCi0gKiB1bmlwcm9jZXNzb3IgY2FzZQotICovCi1zdGF0aWMgdm9pZCBhc3luY190eF9yZWJhbGFuY2Uodm9pZCkKLXsKLQlpbnQgY3B1LCBjYXAsIGNwdV9pZHggPSAwOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlpZiAoIWNoYW5uZWxfdGFibGVfaW5pdGlhbGl6ZWQpCi0JCXJldHVybjsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZhc3luY190eF9sb2NrLCBmbGFncyk7Ci0KLQkvKiB1bmRvIHRoZSBsYXN0IGRpc3RyaWJ1dGlvbiAqLwotCWZvcl9lYWNoX2RtYV9jYXBfbWFzayhjYXAsIGRtYV9jYXBfbWFza19hbGwpCi0JCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShjcHUpIHsKLQkJCXN0cnVjdCBkbWFfY2hhbl9yZWYgKnJlZiA9Ci0JCQkJcGVyX2NwdV9wdHIoY2hhbm5lbF90YWJsZVtjYXBdLCBjcHUpLT5yZWY7Ci0JCQlpZiAocmVmKSB7Ci0JCQkJYXRvbWljX3NldCgmcmVmLT5jb3VudCwgMCk7Ci0JCQkJcGVyX2NwdV9wdHIoY2hhbm5lbF90YWJsZVtjYXBdLCBjcHUpLT5yZWYgPQotCQkJCQkJCQkJTlVMTDsKLQkJCX0KLQkJfQotCi0JZm9yX2VhY2hfZG1hX2NhcF9tYXNrKGNhcCwgZG1hX2NhcF9tYXNrX2FsbCkKLQkJZm9yX2VhY2hfb25saW5lX2NwdShjcHUpIHsKLQkJCXN0cnVjdCBkbWFfY2hhbl9yZWYgKm5ldzsKLQkJCWlmIChOUl9DUFVTID4gMSkKLQkJCQluZXcgPSBnZXRfY2hhbl9yZWZfYnlfY2FwKGNhcCwgY3B1X2lkeCsrKTsKLQkJCWVsc2UKLQkJCQluZXcgPSBnZXRfY2hhbl9yZWZfYnlfY2FwKGNhcCwgLTEpOwotCi0JCQlwZXJfY3B1X3B0cihjaGFubmVsX3RhYmxlW2NhcF0sIGNwdSktPnJlZiA9IG5ldzsKLQkJfQotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXN5bmNfdHhfbG9jaywgZmxhZ3MpOwotfQotCi1zdGF0aWMgZW51bSBkbWFfc3RhdGVfY2xpZW50Ci1kbWFfY2hhbm5lbF9hZGRfcmVtb3ZlKHN0cnVjdCBkbWFfY2xpZW50ICpjbGllbnQsCi0Jc3RydWN0IGRtYV9jaGFuICpjaGFuLCBlbnVtIGRtYV9zdGF0ZSBzdGF0ZSkKLXsKLQl1bnNpZ25lZCBsb25nIGZvdW5kLCBmbGFnczsKLQlzdHJ1Y3QgZG1hX2NoYW5fcmVmICptYXN0ZXJfcmVmLCAqcmVmOwotCWVudW0gZG1hX3N0YXRlX2NsaWVudCBhY2sgPSBETUFfRFVQOyAvKiBkZWZhdWx0OiB0YWtlIG5vIGFjdGlvbiAqLwotCi0Jc3dpdGNoIChzdGF0ZSkgewotCWNhc2UgRE1BX1JFU09VUkNFX0FWQUlMQUJMRToKLQkJZm91bmQgPSAwOwotCQlyY3VfcmVhZF9sb2NrKCk7Ci0JCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KHJlZiwgJmFzeW5jX3R4X21hc3Rlcl9saXN0LCBub2RlKQotCQkJaWYgKHJlZi0+Y2hhbiA9PSBjaGFuKSB7Ci0JCQkJZm91bmQgPSAxOwotCQkJCWJyZWFrOwotCQkJfQotCQlyY3VfcmVhZF91bmxvY2soKTsKLQotCQlwcl9kZWJ1ZygiYXN5bmNfdHg6IGRtYSByZXNvdXJjZSBhdmFpbGFibGUgWyVzXVxuIiwKLQkJCWZvdW5kID8gIm9sZCIgOiAibmV3Iik7Ci0KLQkJaWYgKCFmb3VuZCkKLQkJCWFjayA9IERNQV9BQ0s7Ci0JCWVsc2UKLQkJCWJyZWFrOwotCi0JCS8qIGFkZCB0aGUgY2hhbm5lbCB0byB0aGUgZ2VuZXJpYyBtYW5hZ2VtZW50IGxpc3QgKi8KLQkJbWFzdGVyX3JlZiA9IGttYWxsb2Moc2l6ZW9mKCptYXN0ZXJfcmVmKSwgR0ZQX0tFUk5FTCk7Ci0JCWlmIChtYXN0ZXJfcmVmKSB7Ci0JCQkvKiBrZWVwIGEgcmVmZXJlbmNlIHVudGlsIGFzeW5jX3R4IGlzIHVubG9hZGVkICovCi0JCQlkbWFfY2hhbl9nZXQoY2hhbik7Ci0JCQlpbml0X2RtYV9jaGFuX3JlZihtYXN0ZXJfcmVmLCBjaGFuKTsKLQkJCXNwaW5fbG9ja19pcnFzYXZlKCZhc3luY190eF9sb2NrLCBmbGFncyk7Ci0JCQlsaXN0X2FkZF90YWlsX3JjdSgmbWFzdGVyX3JlZi0+bm9kZSwKLQkJCQkmYXN5bmNfdHhfbWFzdGVyX2xpc3QpOwotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXN5bmNfdHhfbG9jaywKLQkJCQlmbGFncyk7Ci0JCX0gZWxzZSB7Ci0JCQlwcmludGsoS0VSTl9XQVJOSU5HICJhc3luY190eDogdW5hYmxlIHRvIGNyZWF0ZSIKLQkJCQkiIG5ldyBtYXN0ZXIgZW50cnkgaW4gcmVzcG9uc2UgdG8iCi0JCQkJIiBhIERNQV9SRVNPVVJDRV9BRERFRCBldmVudCIKLQkJCQkiICgtRU5PTUVNKVxuIik7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCi0JCWFzeW5jX3R4X3JlYmFsYW5jZSgpOwotCQlicmVhazsKLQljYXNlIERNQV9SRVNPVVJDRV9SRU1PVkVEOgotCQlmb3VuZCA9IDA7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZhc3luY190eF9sb2NrLCBmbGFncyk7Ci0JCWxpc3RfZm9yX2VhY2hfZW50cnkocmVmLCAmYXN5bmNfdHhfbWFzdGVyX2xpc3QsIG5vZGUpCi0JCQlpZiAocmVmLT5jaGFuID09IGNoYW4pIHsKLQkJCQkvKiBwZXJtaXQgYmFja2luZyBkZXZpY2VzIHRvIGdvIGF3YXkgKi8KLQkJCQlkbWFfY2hhbl9wdXQocmVmLT5jaGFuKTsKLQkJCQlsaXN0X2RlbF9yY3UoJnJlZi0+bm9kZSk7Ci0JCQkJY2FsbF9yY3UoJnJlZi0+cmN1LCBmcmVlX2RtYV9jaGFuX3JlZik7Ci0JCQkJZm91bmQgPSAxOwotCQkJCWJyZWFrOwotCQkJfQotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhc3luY190eF9sb2NrLCBmbGFncyk7Ci0KLQkJcHJfZGVidWcoImFzeW5jX3R4OiBkbWEgcmVzb3VyY2UgcmVtb3ZlZCBbJXNdXG4iLAotCQkJZm91bmQgPyAib3VycyIgOiAibm90IG91cnMiKTsKLQotCQlpZiAoZm91bmQpCi0JCQlhY2sgPSBETUFfQUNLOwotCQllbHNlCi0JCQlicmVhazsKLQotCQlhc3luY190eF9yZWJhbGFuY2UoKTsKLQkJYnJlYWs7Ci0JY2FzZSBETUFfUkVTT1VSQ0VfU1VTUEVORDoKLQljYXNlIERNQV9SRVNPVVJDRV9SRVNVTUU6Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgImFzeW5jX3R4OiBkb2VzIG5vdCBzdXBwb3J0IGRtYSBjaGFubmVsIgotCQkJIiBzdXNwZW5kL3Jlc3VtZVxuIik7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCUJVRygpOwotCX0KLQotCXJldHVybiBhY2s7Ci19Ci0KLXN0YXRpYyBpbnQgX19pbml0Ci1hc3luY190eF9pbml0KHZvaWQpCi17Ci0JZW51bSBkbWFfdHJhbnNhY3Rpb25fdHlwZSBjYXA7Ci0KLQlzcGluX2xvY2tfaW5pdCgmYXN5bmNfdHhfbG9jayk7Ci0JYml0bWFwX2ZpbGwoZG1hX2NhcF9tYXNrX2FsbC5iaXRzLCBETUFfVFhfVFlQRV9FTkQpOwotCi0JLyogYW4gaW50ZXJydXB0IHdpbGwgbmV2ZXIgYmUgYW4gZXhwbGljaXQgb3BlcmF0aW9uIHR5cGUuCi0JICogY2xlYXJpbmcgdGhpcyBiaXQgcHJldmVudHMgYWxsb2NhdGlvbiB0byBhIHNsb3QgaW4gJ2NoYW5uZWxfdGFibGUnCi0JICovCi0JY2xlYXJfYml0KERNQV9JTlRFUlJVUFQsIGRtYV9jYXBfbWFza19hbGwuYml0cyk7Ci0KLQlmb3JfZWFjaF9kbWFfY2FwX21hc2soY2FwLCBkbWFfY2FwX21hc2tfYWxsKSB7Ci0JCWNoYW5uZWxfdGFibGVbY2FwXSA9IGFsbG9jX3BlcmNwdShzdHJ1Y3QgY2hhbl9yZWZfcGVyY3B1KTsKLQkJaWYgKCFjaGFubmVsX3RhYmxlW2NhcF0pCi0JCQlnb3RvIGVycjsKLQl9Ci0KLQljaGFubmVsX3RhYmxlX2luaXRpYWxpemVkID0gMTsKLQlkbWFfYXN5bmNfY2xpZW50X3JlZ2lzdGVyKCZhc3luY190eF9kbWEpOwotCWRtYV9hc3luY19jbGllbnRfY2hhbl9yZXF1ZXN0KCZhc3luY190eF9kbWEpOworCWRtYWVuZ2luZV9nZXQoKTsKIAogCXByaW50ayhLRVJOX0lORk8gImFzeW5jX3R4OiBhcGkgaW5pdGlhbGl6ZWQgKGFzeW5jKVxuIik7CiAKIAlyZXR1cm4gMDsKLWVycjoKLQlwcmludGsoS0VSTl9FUlIgImFzeW5jX3R4OiBpbml0aWFsaXphdGlvbiBmYWlsdXJlXG4iKTsKLQotCXdoaWxlICgtLWNhcCA+PSAwKQotCQlmcmVlX3BlcmNwdShjaGFubmVsX3RhYmxlW2NhcF0pOwotCi0JcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBhc3luY190eF9leGl0KHZvaWQpCiB7Ci0JZW51bSBkbWFfdHJhbnNhY3Rpb25fdHlwZSBjYXA7Ci0KLQljaGFubmVsX3RhYmxlX2luaXRpYWxpemVkID0gMDsKLQotCWZvcl9lYWNoX2RtYV9jYXBfbWFzayhjYXAsIGRtYV9jYXBfbWFza19hbGwpCi0JCWlmIChjaGFubmVsX3RhYmxlW2NhcF0pCi0JCQlmcmVlX3BlcmNwdShjaGFubmVsX3RhYmxlW2NhcF0pOwotCi0JZG1hX2FzeW5jX2NsaWVudF91bnJlZ2lzdGVyKCZhc3luY190eF9kbWEpOworCWRtYWVuZ2luZV9wdXQoKTsKIH0KIAogLyoqCkBAIC0zODcsMTYgKzU0LDkgQEAKIHsKIAkvKiBzZWUgaWYgd2UgY2FuIGtlZXAgdGhlIGNoYWluIG9uIG9uZSBjaGFubmVsICovCiAJaWYgKGRlcGVuZF90eCAmJgotCQlkbWFfaGFzX2NhcCh0eF90eXBlLCBkZXBlbmRfdHgtPmNoYW4tPmRldmljZS0+Y2FwX21hc2spKQorCSAgICBkbWFfaGFzX2NhcCh0eF90eXBlLCBkZXBlbmRfdHgtPmNoYW4tPmRldmljZS0+Y2FwX21hc2spKQogCQlyZXR1cm4gZGVwZW5kX3R4LT5jaGFuOwotCWVsc2UgaWYgKGxpa2VseShjaGFubmVsX3RhYmxlX2luaXRpYWxpemVkKSkgewotCQlzdHJ1Y3QgZG1hX2NoYW5fcmVmICpyZWY7Ci0JCWludCBjcHUgPSBnZXRfY3B1KCk7Ci0JCXJlZiA9IHBlcl9jcHVfcHRyKGNoYW5uZWxfdGFibGVbdHhfdHlwZV0sIGNwdSktPnJlZjsKLQkJcHV0X2NwdSgpOwotCQlyZXR1cm4gcmVmID8gcmVmLT5jaGFuIDogTlVMTDsKLQl9IGVsc2UKLQkJcmV0dXJuIE5VTEw7CisJcmV0dXJuIGRtYV9maW5kX2NoYW5uZWwodHhfdHlwZSk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChfX2FzeW5jX3R4X2ZpbmRfY2hhbm5lbCk7CiAjZWxzZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9LY29uZmlnIGIvZHJpdmVycy9LY29uZmlnCmluZGV4IDJmNTU3ZjUuLjAwY2Y5NTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvS2NvbmZpZworKysgYi9kcml2ZXJzL0tjb25maWcKQEAgLTEwNyw0ICsxMDcsNiBAQAogc291cmNlICJkcml2ZXJzL3hlbi9LY29uZmlnIgogCiBzb3VyY2UgImRyaXZlcnMvc3RhZ2luZy9LY29uZmlnIgorCitzb3VyY2UgImRyaXZlcnMvcGxhdGZvcm0vS2NvbmZpZyIKIGVuZG1lbnUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvTWFrZWZpbGUgYi9kcml2ZXJzL01ha2VmaWxlCmluZGV4IGZjZWI3MWEuLmMxYmY0MTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9NYWtlZmlsZQpAQCAtMTgsNiArMTgsOSBAQAogCiBvYmotJChDT05GSUdfWEVOKQkJKz0geGVuLwogCisjIHJlZ3VsYXRvcnMgZWFybHksIHNpbmNlIHNvbWUgc3Vic3lzdGVtcyByZWx5IG9uIHRoZW0gdG8gaW5pdGlhbGl6ZQorb2JqLSQoQ09ORklHX1JFR1VMQVRPUikJCSs9IHJlZ3VsYXRvci8KKwogIyBjaGFyLyBjb21lcyBiZWZvcmUgc2VyaWFsLyBldGMgc28gdGhhdCB0aGUgVlQgY29uc29sZSBpcyB0aGUgYm9vdC10aW1lCiAjIGRlZmF1bHQuCiBvYmoteQkJCQkrPSBjaGFyLwpAQCAtNTcsNiArNjAsNyBAQAogb2JqLSQoQ09ORklHX1BBUklERSkgCQkrPSBibG9jay9wYXJpZGUvCiBvYmotJChDT05GSUdfVEMpCQkrPSB0Yy8KIG9iai0kKENPTkZJR19VV0IpCQkrPSB1d2IvCitvYmotJChDT05GSUdfVVNCX09UR19VVElMUykJKz0gdXNiL290Zy8KIG9iai0kKENPTkZJR19VU0IpCQkrPSB1c2IvCiBvYmotJChDT05GSUdfVVNCX01VU0JfSERSQykJKz0gdXNiL211c2IvCiBvYmotJChDT05GSUdfUENJKQkJKz0gdXNiLwpAQCAtMTAwLDUgKzEwNCw1IEBACiBvYmotJChDT05GSUdfT0YpCQkrPSBvZi8KIG9iai0kKENPTkZJR19TU0IpCQkrPSBzc2IvCiBvYmotJChDT05GSUdfVklSVElPKQkJKz0gdmlydGlvLwotb2JqLSQoQ09ORklHX1JFR1VMQVRPUikJCSs9IHJlZ3VsYXRvci8KIG9iai0kKENPTkZJR19TVEFHSU5HKQkJKz0gc3RhZ2luZy8KK29iai15CQkJCSs9IHBsYXRmb3JtLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL0tjb25maWcgYi9kcml2ZXJzL2FjcGkvS2NvbmZpZwppbmRleCBiMDI0M2ZkLi5kN2Y5ODM5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvS2NvbmZpZworKysgYi9kcml2ZXJzL2FjcGkvS2NvbmZpZwpAQCAtMTk2LDkwICsxOTYsNiBAQAogCWRlcGVuZHMgb24gKFg4NiB8fCBJQTY0KQogCWRlZmF1bHQgeSBpZiBJQTY0X0dFTkVSSUMgfHwgSUE2NF9TR0lfU04yCiAKLWNvbmZpZyBBQ1BJX1dNSQotCXRyaXN0YXRlICJXTUkgKEVYUEVSSU1FTlRBTCkiCi0JZGVwZW5kcyBvbiBYODYKLQlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTAotCWhlbHAKLQkgIFRoaXMgZHJpdmVyIGFkZHMgc3VwcG9ydCBmb3IgdGhlIEFDUEktV01JIChXaW5kb3dzIE1hbmFnZW1lbnQKLQkgIEluc3RydW1lbnRhdGlvbikgbWFwcGVyIGRldmljZSAoUE5QMEMxNCkgZm91bmQgb24gc29tZSBzeXN0ZW1zLgotCi0JICBBQ1BJLVdNSSBpcyBhIHByb3ByaWV0YXJ5IGV4dGVuc2lvbiB0byBBQ1BJIHRvIGV4cG9zZSBwYXJ0cyBvZiB0aGUKLQkgIEFDUEkgZmlybXdhcmUgdG8gdXNlcnNwYWNlIC0gdGhpcyBpcyBkb25lIHRocm91Z2ggdmFyaW91cyB2ZW5kb3IKLQkgIGRlZmluZWQgbWV0aG9kcyBhbmQgZGF0YSBibG9ja3MgaW4gYSBQTlAwQzE0IGRldmljZSwgd2hpY2ggYXJlIHRoZW4KLQkgIG1hZGUgYXZhaWxhYmxlIGZvciB1c2Vyc3BhY2UgdG8gY2FsbC4KLQotCSAgVGhlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgaW4gTGludXggY3VycmVudGx5IG9ubHkgZXhwb3NlcyB0aGlzIHRvCi0JICBvdGhlciBrZXJuZWwgc3BhY2UgZHJpdmVycy4KLQotCSAgVGhpcyBkcml2ZXIgaXMgYSByZXF1aXJlZCBkZXBlbmRlbmN5IHRvIGJ1aWxkIHRoZSBmaXJtd2FyZSBzcGVjaWZpYwotCSAgZHJpdmVycyBuZWVkZWQgb24gbWFueSBtYWNoaW5lcywgaW5jbHVkaW5nIEFjZXIgYW5kIEhQIGxhcHRvcHMuCi0KLQkgIEl0IGlzIHNhZmUgdG8gZW5hYmxlIHRoaXMgZHJpdmVyIGV2ZW4gaWYgeW91ciBEU0RUIGRvZXNuJ3QgZGVmaW5lCi0JICBhbnkgQUNQSS1XTUkgZGV2aWNlcy4KLQotY29uZmlnIEFDUElfQVNVUwotICAgICAgICB0cmlzdGF0ZSAiQVNVUy9NZWRpb24gTGFwdG9wIEV4dHJhcyIKLQlkZXBlbmRzIG9uIFg4NgotCXNlbGVjdCBCQUNLTElHSFRfQ0xBU1NfREVWSUNFCi0gICAgICAgIC0tLWhlbHAtLS0KLSAgICAgICAgICBUaGlzIGRyaXZlciBwcm92aWRlcyBzdXBwb3J0IGZvciBleHRyYSBmZWF0dXJlcyBvZiBBQ1BJLWNvbXBhdGlibGUKLSAgICAgICAgICBBU1VTIGxhcHRvcHMuIEFzIHNvbWUgb2YgTWVkaW9uIGxhcHRvcHMgYXJlIG1hZGUgYnkgQVNVUywgaXQgbWF5IGFsc28KLSAgICAgICAgICBzdXBwb3J0IHNvbWUgTWVkaW9uIGxhcHRvcHMgKHN1Y2ggYXMgOTY3NSBmb3IgZXhhbXBsZSkuICBJdCBtYWtlcyBhbGwKLSAgICAgICAgICB0aGUgZXh0cmEgYnV0dG9ucyBnZW5lcmF0ZSBzdGFuZGFyZCBBQ1BJIGV2ZW50cyB0aGF0IGdvIHRocm91Z2gKLSAgICAgICAgICAvcHJvYy9hY3BpL2V2ZW50cywgYW5kIChvbiBzb21lIG1vZGVscykgYWRkcyBzdXBwb3J0IGZvciBjaGFuZ2luZyB0aGUKLSAgICAgICAgICBkaXNwbGF5IGJyaWdodG5lc3MgYW5kIG91dHB1dCwgc3dpdGNoaW5nIHRoZSBMQ0QgYmFja2xpZ2h0IG9uIGFuZCBvZmYsCi0gICAgICAgICAgYW5kIG1vc3QgaW1wb3J0YW50bHksIGFsbG93cyB5b3UgdG8gYmxpbmsgdGhvc2UgZmFuY3kgTEVEcyBpbnRlbmRlZAotICAgICAgICAgIGZvciByZXBvcnRpbmcgbWFpbCBhbmQgd2lyZWxlc3Mgc3RhdHVzLgotCi0JICBOb3RlOiBkaXNwbGF5IHN3aXRjaGluZyBjb2RlIGlzIGN1cnJlbnRseSBjb25zaWRlcmVkIEVYUEVSSU1FTlRBTCwKLQkgIHRveWluZyB3aXRoIHRoZXNlIHZhbHVlcyBtYXkgZXZlbiBsb2NrIHlvdXIgbWFjaGluZS4KLQotICAgICAgICAgIEFsbCBzZXR0aW5ncyBhcmUgY2hhbmdlZCB2aWEgL3Byb2MvYWNwaS9hc3VzIGRpcmVjdG9yeSBlbnRyaWVzLiBPd25lcgotICAgICAgICAgIGFuZCBncm91cCBmb3IgdGhlc2UgZW50cmllcyBjYW4gYmUgc2V0IHdpdGggYXN1c191aWQgYW5kIGFzdXNfZ2lkCi0gICAgICAgICAgcGFyYW1ldGVycy4KLQotICAgICAgICAgIE1vcmUgaW5mb3JtYXRpb24gYW5kIGEgdXNlcnNwYWNlIGRhZW1vbiBmb3IgaGFuZGxpbmcgdGhlIGV4dHJhIGJ1dHRvbnMKLSAgICAgICAgICBhdCA8aHR0cDovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy9hY3BpNGFzdXMvPi4KLQotICAgICAgICAgIElmIHlvdSBoYXZlIGFuIEFDUEktY29tcGF0aWJsZSBBU1VTIGxhcHRvcCwgc2F5IFkgb3IgTSBoZXJlLiBUaGlzCi0gICAgICAgICAgZHJpdmVyIGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50LCBzbyBpZiB5b3VyIGxhcHRvcCBpcyB1bnN1cHBvcnRlZCBvcgotICAgICAgICAgIHNvbWV0aGluZyB3b3JrcyBub3QgcXVpdGUgYXMgZXhwZWN0ZWQsIHBsZWFzZSB1c2UgdGhlIG1haWxpbmcgbGlzdAotICAgICAgICAgIGF2YWlsYWJsZSBvbiB0aGUgYWJvdmUgcGFnZSAoYWNwaTRhc3VzLXVzZXJAbGlzdHMuc291cmNlZm9yZ2UubmV0KS4KLQotCSAgTk9URTogVGhpcyBkcml2ZXIgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBwcm9iYWJseSBiZSByZW1vdmVkIHNvb24sCi0JICB1c2UgYXN1cy1sYXB0b3AgaW5zdGVhZC4KLQotY29uZmlnIEFDUElfVE9TSElCQQotCXRyaXN0YXRlICJUb3NoaWJhIExhcHRvcCBFeHRyYXMiCi0JZGVwZW5kcyBvbiBYODYgJiYgSU5QVVQKLQlzZWxlY3QgSU5QVVRfUE9MTERFVgotCXNlbGVjdCBORVQKLQlzZWxlY3QgUkZLSUxMCi0Jc2VsZWN0IEJBQ0tMSUdIVF9DTEFTU19ERVZJQ0UKLQktLS1oZWxwLS0tCi0JICBUaGlzIGRyaXZlciBhZGRzIHN1cHBvcnQgZm9yIGFjY2VzcyB0byBjZXJ0YWluIHN5c3RlbSBzZXR0aW5ncwotCSAgb24gImxlZ2FjeSBmcmVlIiBUb3NoaWJhIGxhcHRvcHMuICBUaGVzZSBsYXB0b3BzIGNhbiBiZSByZWNvZ25pemVkIGJ5Ci0JICB0aGVpciBsYWNrIG9mIGEgQklPUyBzZXR1cCBtZW51IGFuZCBBUE0gc3VwcG9ydC4KLQotCSAgT24gdGhlc2UgbWFjaGluZXMsIGFsbCBzeXN0ZW0gY29uZmlndXJhdGlvbiBpcyBoYW5kbGVkIHRocm91Z2ggdGhlCi0JICBBQ1BJLiAgVGhpcyBkcml2ZXIgaXMgcmVxdWlyZWQgZm9yIGFjY2VzcyB0byBjb250cm9scyBub3QgY292ZXJlZAotCSAgYnkgdGhlIGdlbmVyYWwgQUNQSSBkcml2ZXJzLCBzdWNoIGFzIExDRCBicmlnaHRuZXNzLCB2aWRlbyBvdXRwdXQsCi0JICBldGMuCi0KLQkgIFRoaXMgZHJpdmVyIGRpZmZlcnMgZnJvbSB0aGUgbm9uLUFDUEkgVG9zaGliYSBsYXB0b3AgZHJpdmVyIChsb2NhdGVkCi0JICB1bmRlciAiUHJvY2Vzc29yIHR5cGUgYW5kIGZlYXR1cmVzIikgaW4gc2V2ZXJhbCBhc3BlY3RzLgotCSAgQ29uZmlndXJhdGlvbiBpcyBhY2Nlc3NlZCBieSByZWFkaW5nIGFuZCB3cml0aW5nIHRleHQgZmlsZXMgaW4gdGhlCi0JICAvcHJvYyB0cmVlIGluc3RlYWQgb2YgYnkgcHJvZ3JhbSBpbnRlcmZhY2UgdG8gL2Rldi4gIEZ1cnRoZXJtb3JlLCBubwotCSAgcG93ZXIgbWFuYWdlbWVudCBmdW5jdGlvbnMgYXJlIGV4cG9zZWQsIGFzIHRob3NlIGFyZSBoYW5kbGVkIGJ5IHRoZQotCSAgZ2VuZXJhbCBBQ1BJIGRyaXZlcnMuCi0KLQkgIE1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBkcml2ZXIgaXMgYXZhaWxhYmxlIGF0Ci0JICA8aHR0cDovL21lbWViZWFtLm9yZy90b3lzL1Rvc2hpYmFBY3BpRHJpdmVyPi4KLQotCSAgSWYgeW91IGhhdmUgYSBsZWdhY3kgZnJlZSBUb3NoaWJhIGxhcHRvcCAoc3VjaCBhcyB0aGUgTGlicmV0dG8gTDEKLQkgIHNlcmllcyksIHNheSBZLgotCiBjb25maWcgQUNQSV9DVVNUT01fRFNEVF9GSUxFCiAJc3RyaW5nICJDdXN0b20gRFNEVCBUYWJsZSBmaWxlIHRvIGluY2x1ZGUiCiAJZGVmYXVsdCAiIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL01ha2VmaWxlIGIvZHJpdmVycy9hY3BpL01ha2VmaWxlCmluZGV4IDNjMGM5MzMuLjY1ZDkwYzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2FjcGkvTWFrZWZpbGUKQEAgLTIsMTUgKzIsOCBAQAogIyBNYWtlZmlsZSBmb3IgdGhlIExpbnV4IEFDUEkgaW50ZXJwcmV0ZXIKICMKIAotZXhwb3J0IEFDUElfQ0ZMQUdTCi0KLUFDUElfQ0ZMQUdTCTo9IC1PcwotCi1pZmRlZiBDT05GSUdfQUNQSV9ERUJVRwotICBBQ1BJX0NGTEFHUwkrPSAtREFDUElfREVCVUdfT1VUUFVUCi1lbmRpZgotCi1FWFRSQV9DRkxBR1MJKz0gJChBQ1BJX0NGTEFHUykKK2NjZmxhZ3MteQkJCTo9IC1PcworY2NmbGFncy0kKENPTkZJR19BQ1BJX0RFQlVHKQkrPSAtREFDUElfREVCVUdfT1VUUFVUCiAKICMKICMgQUNQSSBCb290LVRpbWUgVGFibGUgUGFyc2luZwpAQCAtMjIsOSArMTUsMTMgQEAKICMgQUNQSSBDb3JlIFN1YnN5c3RlbSAoSW50ZXJwcmV0ZXIpCiAjCiBvYmoteQkJCQkrPSBvc2wubyB1dGlscy5vIHJlYm9vdC5vXAotCQkJCSAgIGRpc3BhdGNoZXIvIGV2ZW50cy8gZXhlY3V0ZXIvIGhhcmR3YXJlLyBcCi0JCQkJICAgbmFtZXNwYWNlLyBwYXJzZXIvIHJlc291cmNlcy8gdGFibGVzLyBcCi0JCQkJICAgdXRpbGl0aWVzLworCQkJCQlhY3BpY2EvCisKKyMgc2xlZXAgcmVsYXRlZCBmaWxlcworb2JqLXkJCQkJKz0gd2FrZXVwLm8KK29iai15CQkJCSs9IHNsZWVwLm8KK29iai0kKENPTkZJR19BQ1BJX1NMRUVQKQkrPSBwcm9jLm8KKwogCiAjCiAjIEFDUEkgQnVzIGFuZCBEZXZpY2UgRHJpdmVycwpAQCAtMzUsNyArMzIsNiBAQAogcHJvY2Vzc29yLW9ianMJKz0gcHJvY2Vzc29yX3BlcmZsaWIubwogZW5kaWYKIAotb2JqLXkJCQkJKz0gc2xlZXAvCiBvYmoteQkJCQkrPSBidXMubyBnbHVlLm8KIG9iai15CQkJCSs9IHNjYW4ubwogIyBLZWVwIEVDIGRyaXZlciBmaXJzdC4gSW5pdGlhbGl6YXRpb24gb2Ygb3RoZXJzIGRlcGVuZCBvbiBpdC4KQEAgLTU5LDkgKzU1LDYgQEAKIG9iai0kKENPTkZJR19BQ1BJX1NZU1RFTSkJKz0gc3lzdGVtLm8gZXZlbnQubwogb2JqLSQoQ09ORklHX0FDUElfREVCVUcpCSs9IGRlYnVnLm8KIG9iai0kKENPTkZJR19BQ1BJX05VTUEpCQkrPSBudW1hLm8KLW9iai0kKENPTkZJR19BQ1BJX1dNSSkJCSs9IHdtaS5vCi1vYmotJChDT05GSUdfQUNQSV9BU1VTKQkJKz0gYXN1c19hY3BpLm8KLW9iai0kKENPTkZJR19BQ1BJX1RPU0hJQkEpCSs9IHRvc2hpYmFfYWNwaS5vCiBvYmotJChDT05GSUdfQUNQSV9IT1RQTFVHX01FTU9SWSkJKz0gYWNwaV9tZW1ob3RwbHVnLm8KIG9iai0kKENPTkZJR19BQ1BJX1BST0NGU19QT1dFUikJKz0gY21fc2JzLm8KIG9iai0kKENPTkZJR19BQ1BJX1NCUykJCSs9IHNic2hjLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpX21lbWhvdHBsdWcuYyBiL2RyaXZlcnMvYWNwaS9hY3BpX21lbWhvdHBsdWcuYwppbmRleCA2M2ExN2I1Li43YTBmNGFhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYWNwaV9tZW1ob3RwbHVnLmMKKysrIGIvZHJpdmVycy9hY3BpL2FjcGlfbWVtaG90cGx1Zy5jCkBAIC0yMCw3ICsyMCw3IEBACiAgKgogICoKICAqIEFDUEkgYmFzZWQgSG90UGx1ZyBkcml2ZXIgdGhhdCBzdXBwb3J0cyBNZW1vcnkgSG90cGx1ZwotICogVGhpcyBkcml2ZXIgZmllbGRzIG5vdGlmaWNhdGlvbnMgZnJvbSBmaXJtYXJlIGZvciBtZW1vcnkgYWRkCisgKiBUaGlzIGRyaXZlciBmaWVsZHMgbm90aWZpY2F0aW9ucyBmcm9tIGZpcm13YXJlIGZvciBtZW1vcnkgYWRkCiAgKiBhbmQgcmVtb3ZlIG9wZXJhdGlvbnMgYW5kIGFsZXJ0cyB0aGUgVk0gb2YgdGhlIGFmZmVjdGVkIG1lbW9yeQogICogcmFuZ2VzLgogICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL01ha2VmaWxlIGIvZHJpdmVycy9hY3BpL2FjcGljYS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjIzMjk4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS9NYWtlZmlsZQpAQCAtMCwwICsxLDQ0IEBACisjCisjIE1ha2VmaWxlIGZvciBBQ1BJQ0EgQ29yZSBpbnRlcnByZXRlcgorIworCitjY2ZsYWdzLXkJCQk6PSAtT3MKK2NjZmxhZ3MtJChDT05GSUdfQUNQSV9ERUJVRykJKz0gLURBQ1BJX0RFQlVHX09VVFBVVAorCitvYmoteSA6PSBkc2ZpZWxkLm8gICBkc210aGRhdC5vICBkc29wY29kZS5vICBkc3dleGVjLm8gIGRzd3Njb3BlLm8gXAorCSBkc21ldGhvZC5vICBkc29iamVjdC5vICBkc3V0aWxzLm8gICBkc3dsb2FkLm8gIGRzd3N0YXRlLm8gXAorCSBkc2luaXQubworCitvYmoteSArPSBldmV2ZW50Lm8gIGV2cmVnaW9uLm8gIGV2c2NpLm8gICAgZXZ4ZmV2bnQubyBcCisJIGV2bWlzYy5vICAgZXZyZ25pbmkubyAgZXZ4ZmFjZS5vICBldnhmcmVnbi5vIFwKKwkgZXZncGUubyAgICBldmdwZWJsay5vCisKK29iai15ICs9IGV4Y29uZmlnLm8gIGV4ZmllbGQubyAgZXhuYW1lcy5vICAgZXhvcGFyZzYubyAgZXhyZXNvbHYubyAgZXhzdG9yb2Iub1wKKwkgZXhjb252cnQubyAgZXhmbGRpby5vICBleG9wYXJnMS5vICBleHByZXAubyAgICBleHJlc29wLm8gICBleHN5c3RlbS5vXAorCSBleGNyZWF0ZS5vICBleG1pc2MubyAgIGV4b3BhcmcyLm8gIGV4cmVnaW9uLm8gIGV4c3RvcmUubyAgIGV4dXRpbHMubyBcCisJIGV4ZHVtcC5vICAgIGV4bXV0ZXgubyAgZXhvcGFyZzMubyAgZXhyZXNudGUubyAgZXhzdG9yZW4ubworCitvYmoteSArPSBod2FjcGkubyAgaHdncGUubyAgaHdyZWdzLm8gIGh3c2xlZXAubyBod3hmYWNlLm8KKworb2JqLSQoQUNQSV9GVVRVUkVfVVNBR0UpICs9IGh3dGltZXIubworCitvYmoteSArPSBuc2FjY2Vzcy5vICBuc2xvYWQubyAgICBuc3NlYXJjaC5vICBuc3hmZXZhbC5vIFwKKwkgbnNhbGxvYy5vICAgbnNldmFsLm8gICAgbnNuYW1lcy5vICAgbnN1dGlscy5vICAgbnN4Zm5hbWUubyBcCisJIG5zZHVtcC5vICAgIG5zaW5pdC5vICAgIG5zb2JqZWN0Lm8gIG5zd2Fsay5vICAgIG5zeGZvYmoubyAgXAorCSBuc3BhcnNlLm8gICBuc3ByZWRlZi5vCisKK29iai0kKEFDUElfRlVUVVJFX1VTQUdFKSArPSBuc2R1bXBkdi5vCisKK29iai15ICs9IHBzYXJncy5vICAgIHBzcGFyc2UubyAgcHNsb29wLm8gcHN0cmVlLm8gICBwc3dhbGsubyAgXAorCSBwc29wY29kZS5vICBwc3Njb3BlLm8gIHBzdXRpbHMubyAgcHN4ZmFjZS5vCisKK29iai15ICs9IHJzYWRkci5vIHJzY3JlYXRlLm8gcnNpbmZvLm8gcnNpby5vIHJzbGlzdC5vIHJzbWlzYy5vIHJzeGZhY2UubyBcCisJIHJzY2FsYy5vICByc2lycS5vICByc21lbW9yeS5vICByc3V0aWxzLm8KKworb2JqLSQoQUNQSV9GVVRVUkVfVVNBR0UpICs9IHJzZHVtcC5vCisKK29iai15ICs9IHRieGZhY2UubyB0Ymluc3RhbC5vIHRidXRpbHMubyB0YmZpbmQubyB0YmZhZHQubyB0Ynhmcm9vdC5vCisKK29iai15ICs9IHV0YWxsb2MubyB1dGRlYnVnLm8gdXRldmFsLm8gdXRpbml0Lm8gdXRtaXNjLm8gdXR4ZmFjZS5vIFwKKwkJdXRjb3B5Lm8gdXRkZWxldGUubyB1dGdsb2JhbC5vIHV0bWF0aC5vIHV0b2JqZWN0Lm8gXAorCQl1dHN0YXRlLm8gdXRtdXRleC5vIHV0b2JqZWN0Lm8gdXRyZXNyYy5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2FjY29tbW9uLmggYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2FjY29tbW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2IyMDc4NgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvYWNjb21tb24uaApAQCAtMCwwICsxLDYzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogTmFtZTogYWNjb21tb24uaCAtIENvbW1vbiBpbmNsdWRlIGZpbGVzIGZvciBnZW5lcmF0aW9uIG9mIEFDUElDQSBzb3VyY2UKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA4LCBJbnRlbCBDb3JwLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAorICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgYXQgbWluaW11bSBhIGRpc2NsYWltZXIKKyAqICAgIHN1YnN0YW50aWFsbHkgc2ltaWxhciB0byB0aGUgIk5PIFdBUlJBTlRZIiBkaXNjbGFpbWVyIGJlbG93CisgKiAgICAoIkRpc2NsYWltZXIiKSBhbmQgYW55IHJlZGlzdHJpYnV0aW9uIG11c3QgYmUgY29uZGl0aW9uZWQgdXBvbgorICogICAgaW5jbHVkaW5nIGEgc3Vic3RhbnRpYWxseSBzaW1pbGFyIERpc2NsYWltZXIgcmVxdWlyZW1lbnQgZm9yIGZ1cnRoZXIKKyAqICAgIGJpbmFyeSByZWRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcworICogICAgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBOTyBXQVJSQU5UWQorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcKKyAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgorICovCisKKyNpZm5kZWYgX19BQ0NPTU1PTl9IX18KKyNkZWZpbmUgX19BQ0NPTU1PTl9IX18KKworLyoKKyAqIENvbW1vbiBzZXQgb2YgaW5jbHVkZXMgZm9yIGFsbCBBQ1BJQ0Egc291cmNlIGZpbGVzLgorICogV2UgcHV0IHRoZW0gaGVyZSBiZWNhdXNlIHdlIGRvbid0IHdhbnQgdG8gZHVwbGljYXRlIHRoZW0KKyAqIGluIHRoZSB0aGUgc291cmNlIGNvZGUgYWdhaW4gYW5kIGFnYWluLgorICoKKyAqIE5vdGU6IFRoZSBvcmRlciBvZiB0aGVzZSBpbmNsdWRlIGZpbGVzIGlzIGltcG9ydGFudC4KKyAqLworI2luY2x1ZGUgImFjY29uZmlnLmgiCQkvKiBHbG9iYWwgY29uZmlndXJhdGlvbiBjb25zdGFudHMgKi8KKyNpbmNsdWRlICJhY21hY3Jvcy5oIgkJLyogQyBtYWNyb3MgKi8KKyNpbmNsdWRlICJhY2xvY2FsLmgiCQkvKiBJbnRlcm5hbCBkYXRhIHR5cGVzICovCisjaW5jbHVkZSAiYWNvYmplY3QuaCIJCS8qIEFDUEkgaW50ZXJuYWwgb2JqZWN0ICovCisjaW5jbHVkZSAiYWNzdHJ1Y3QuaCIJCS8qIENvbW1vbiBzdHJ1Y3R1cmVzICovCisjaW5jbHVkZSAiYWNnbG9iYWwuaCIJCS8qIEFsbCBnbG9iYWwgdmFyaWFibGVzICovCisjaW5jbHVkZSAiYWNod2FyZS5oIgkJLyogSGFyZHdhcmUgZGVmaW5lcyBhbmQgaW50ZXJmYWNlcyAqLworI2luY2x1ZGUgImFjdXRpbHMuaCIJCS8qIFV0aWxpdHkgaW50ZXJmYWNlcyAqLworCisjZW5kaWYJCQkJLyogX19BQ0NPTU1PTl9IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvYWNjb25maWcuaCBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvYWNjb25maWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjc3N2ZiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS9hY2NvbmZpZy5oCkBAIC0wLDAgKzEsMjE3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogTmFtZTogYWNjb25maWcuaCAtIEdsb2JhbCBjb25maWd1cmF0aW9uIGNvbnN0YW50cworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDgsIEludGVsIENvcnAuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCisgKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSBhdCBtaW5pbXVtIGEgZGlzY2xhaW1lcgorICogICAgc3Vic3RhbnRpYWxseSBzaW1pbGFyIHRvIHRoZSAiTk8gV0FSUkFOVFkiIGRpc2NsYWltZXIgYmVsb3cKKyAqICAgICgiRGlzY2xhaW1lciIpIGFuZCBhbnkgcmVkaXN0cmlidXRpb24gbXVzdCBiZSBjb25kaXRpb25lZCB1cG9uCisgKiAgICBpbmNsdWRpbmcgYSBzdWJzdGFudGlhbGx5IHNpbWlsYXIgRGlzY2xhaW1lciByZXF1aXJlbWVudCBmb3IgZnVydGhlcgorICogICAgYmluYXJ5IHJlZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzCisgKiAgICBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIE5PIFdBUlJBTlRZCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORworICogSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCisgKi8KKworI2lmbmRlZiBfQUNDT05GSUdfSAorI2RlZmluZSBfQUNDT05GSUdfSAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29uZmlndXJhdGlvbiBvcHRpb25zCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogQUNQSV9ERUJVR19PVVRQVVQgICAgLSBUaGlzIHN3aXRjaCBlbmFibGVzIGFsbCB0aGUgZGVidWcgZmFjaWxpdGllcyBvZiB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgQUNQSSBzdWJzeXN0ZW0uICBUaGlzIGluY2x1ZGVzIHRoZSBERUJVR19QUklOVCBvdXRwdXQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVtZW50cy4gIFdoZW4gZGlzYWJsZWQsIGFsbCBERUJVR19QUklOVAorICogICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZW1lbnRzIGFyZSBjb21waWxlZCBvdXQuCisgKgorICogQUNQSV9BUFBMSUNBVElPTiAgICAgLSBVc2UgdGhpcyBzd2l0Y2ggaWYgdGhlIHN1YnN5c3RlbSBpcyBnb2luZyB0byBiZSBydW4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgYXQgdGhlIGFwcGxpY2F0aW9uIGxldmVsLgorICoKKyAqLworCisvKgorICogT1MgbmFtZSwgdXNlZCBmb3IgdGhlIF9PUyBvYmplY3QuICBUaGUgX09TIG9iamVjdCBpcyBlc3NlbnRpYWxseSBvYnNvbGV0ZSwKKyAqIGJ1dCB0aGVyZSBpcyBhIGxhcmdlIGJhc2Ugb2YgQVNML0FNTCBjb2RlIGluIGV4aXN0aW5nIG1hY2hpbmVzIHRoYXQgY2hlY2sKKyAqIGZvciB0aGUgc3RyaW5nIGJlbG93LiAgVGhlIHVzZSBvZiB0aGlzIHN0cmluZyB1c3VhbGx5IGd1YXJhbnRlZXMgdGhhdAorICogdGhlIEFTTCB3aWxsIGV4ZWN1dGUgZG93biB0aGUgbW9zdCB0ZXN0ZWQgY29kZSBwYXRoLiAgQWxzbywgdGhlcmUgaXMgc29tZQorICogY29kZSB0aGF0IHdpbGwgbm90IGV4ZWN1dGUgdGhlIF9PU0kgbWV0aG9kIHVubGVzcyBfT1MgbWF0Y2hlcyB0aGUgc3RyaW5nCisgKiBiZWxvdy4gIFRoZXJlZm9yZSwgY2hhbmdlIHRoaXMgc3RyaW5nIGF0IHlvdXIgb3duIHJpc2suCisgKi8KKyNkZWZpbmUgQUNQSV9PU19OQU1FICAgICAgICAgICAgICAgICAgICAiTWljcm9zb2Z0IFdpbmRvd3MgTlQiCisKKy8qIE1heGltdW0gb2JqZWN0cyBpbiB0aGUgdmFyaW91cyBvYmplY3QgY2FjaGVzICovCisKKyNkZWZpbmUgQUNQSV9NQVhfU1RBVEVfQ0FDSEVfREVQVEggICAgICA5NgkvKiBTdGF0ZSBvYmplY3RzICovCisjZGVmaW5lIEFDUElfTUFYX1BBUlNFX0NBQ0hFX0RFUFRIICAgICAgOTYJLyogUGFyc2UgdHJlZSBvYmplY3RzICovCisjZGVmaW5lIEFDUElfTUFYX0VYVFBBUlNFX0NBQ0hFX0RFUFRIICAgOTYJLyogUGFyc2UgdHJlZSBvYmplY3RzICovCisjZGVmaW5lIEFDUElfTUFYX09CSkVDVF9DQUNIRV9ERVBUSCAgICAgOTYJLyogSW50ZXJwcmV0ZXIgb3BlcmFuZCBvYmplY3RzICovCisjZGVmaW5lIEFDUElfTUFYX05BTUVTUEFDRV9DQUNIRV9ERVBUSCAgOTYJLyogTmFtZXNwYWNlIG9iamVjdHMgKi8KKworLyoKKyAqIFNob3VsZCB0aGUgc3Vic3lzdGVtIGFib3J0IHRoZSBsb2FkaW5nIG9mIGFuIEFDUEkgdGFibGUgaWYgdGhlCisgKiB0YWJsZSBjaGVja3N1bSBpcyBpbmNvcnJlY3Q/CisgKi8KKyNkZWZpbmUgQUNQSV9DSEVDS1NVTV9BQk9SVCAgICAgICAgICAgICBGQUxTRQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogU3Vic3lzdGVtIENvbnN0YW50cworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogVmVyc2lvbiBvZiBBQ1BJIHN1cHBvcnRlZCAqLworCisjZGVmaW5lIEFDUElfQ0FfU1VQUE9SVF9MRVZFTCAgICAgICAgICAgMworCisvKiBNYXhpbXVtIGNvdW50IGZvciBhIHNlbWFwaG9yZSBvYmplY3QgKi8KKworI2RlZmluZSBBQ1BJX01BWF9TRU1BUEhPUkVfQ09VTlQgICAgICAgIDI1NgorCisvKiBNYXhpbXVtIG9iamVjdCByZWZlcmVuY2UgY291bnQgKGRldGVjdHMgb2JqZWN0IGRlbGV0aW9uIGlzc3VlcykgKi8KKworI2RlZmluZSBBQ1BJX01BWF9SRUZFUkVOQ0VfQ09VTlQgICAgICAgIDB4MTAwMAorCisvKiBTaXplIG9mIGNhY2hlZCBtZW1vcnkgbWFwcGluZyBmb3Igc3lzdGVtIG1lbW9yeSBvcGVyYXRpb24gcmVnaW9uICovCisKKyNkZWZpbmUgQUNQSV9TWVNNRU1fUkVHSU9OX1dJTkRPV19TSVpFICA0MDk2CisKKy8qIG93bmVyX2lkIHRyYWNraW5nLiA4IGVudHJpZXMgYWxsb3dzIGZvciAyNTUgb3duZXJfaWRzICovCisKKyNkZWZpbmUgQUNQSV9OVU1fT1dORVJJRF9NQVNLUyAgICAgICAgICA4CisKKy8qIFNpemUgb2YgdGhlIHJvb3QgdGFibGUgYXJyYXkgaXMgaW5jcmVhc2VkIGJ5IHRoaXMgaW5jcmVtZW50ICovCisKKyNkZWZpbmUgQUNQSV9ST09UX1RBQkxFX1NJWkVfSU5DUkVNRU5UICA0CisKKy8qIE1heGltdW0gbnVtYmVyIG9mIFdoaWxlKCkgbG9vcCBpdGVyYXRpb25zIGJlZm9yZSBmb3JjZWQgYWJvcnQgKi8KKworI2RlZmluZSBBQ1BJX01BWF9MT09QX0lURVJBVElPTlMgICAgICAgIDB4RkZGRgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQUNQSSBTcGVjaWZpY2F0aW9uIGNvbnN0YW50cyAoRG8gbm90IGNoYW5nZSB1bmxlc3MgdGhlIHNwZWNpZmljYXRpb24gY2hhbmdlcykKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIE51bWJlciBvZiBkaXN0aW5jdCBHUEUgcmVnaXN0ZXIgYmxvY2tzIGFuZCByZWdpc3RlciB3aWR0aCAqLworCisjZGVmaW5lIEFDUElfTUFYX0dQRV9CTE9DS1MgICAgICAgICAgICAgMgorI2RlZmluZSBBQ1BJX0dQRV9SRUdJU1RFUl9XSURUSCAgICAgICAgIDgKKworLyogTWV0aG9kIGluZm8gKGluIFdBTEtfU1RBVEUpLCBjb250YWluaW5nIGxvY2FsIHZhcmlhYmxlcyBhbmQgYXJndW1ldG5zICovCisKKyNkZWZpbmUgQUNQSV9NRVRIT0RfTlVNX0xPQ0FMUyAgICAgICAgICA4CisjZGVmaW5lIEFDUElfTUVUSE9EX01BWF9MT0NBTCAgICAgICAgICAgNworCisjZGVmaW5lIEFDUElfTUVUSE9EX05VTV9BUkdTICAgICAgICAgICAgNworI2RlZmluZSBBQ1BJX01FVEhPRF9NQVhfQVJHICAgICAgICAgICAgIDYKKworLyogTGVuZ3RoIG9mIF9ISUQsIF9VSUQsIF9DSUQsIGFuZCBVVUlEIHZhbHVlcyAqLworCisjZGVmaW5lIEFDUElfREVWSUNFX0lEX0xFTkdUSCAgICAgICAgICAgMHgwOQorI2RlZmluZSBBQ1BJX01BWF9DSURfTEVOR1RIICAgICAgICAgICAgIDQ4CisjZGVmaW5lIEFDUElfVVVJRF9MRU5HVEggICAgICAgICAgICAgICAgMTYKKworLyoKKyAqIE9wZXJhbmQgU3RhY2sgKGluIFdBTEtfU1RBVEUpLCBNdXN0IGJlIGxhcmdlIGVub3VnaCB0byBjb250YWluIE1FVEhPRF9NQVhfQVJHCisgKi8KKyNkZWZpbmUgQUNQSV9PQkpfTlVNX09QRVJBTkRTICAgICAgICAgICA4CisjZGVmaW5lIEFDUElfT0JKX01BWF9PUEVSQU5EICAgICAgICAgICAgNworCisvKiBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIFJlc3VsdCBTdGFjayBmcmFtZSwgY2FuIGJlIGFuIGFyYml0cmFyeSB2YWx1ZSAqLworCisjZGVmaW5lIEFDUElfUkVTVUxUU19GUkFNRV9PQkpfTlVNICAgICAgOAorCisvKgorICogTWF4aW1hbCBudW1iZXIgb2YgZWxlbWVudHMgdGhlIFJlc3VsdCBTdGFjayBjYW4gY29udGFpbiwKKyAqIGl0IG1heSBiZSBhbiBhcmJpdHJheSB2YWx1ZSBub3QgZXhjZWVkaW5nIHRoZSB0eXBlcyBvZgorICogcmVzdWx0X3NpemUgYW5kIHJlc3VsdF9jb3VudCAobm93IHU4KS4KKyAqLworI2RlZmluZSBBQ1BJX1JFU1VMVFNfT0JKX05VTV9NQVggICAgICAgIDI1NQorCisvKiBOYW1lcyB3aXRoaW4gdGhlIG5hbWVzcGFjZSBhcmUgNCBieXRlcyBsb25nICovCisKKyNkZWZpbmUgQUNQSV9OQU1FX1NJWkUgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIEFDUElfUEFUSF9TRUdNRU5UX0xFTkdUSCAgICAgICAgNQkvKiA0IGNoYXJzIGZvciBuYW1lICsgMSBjaGFyIGZvciBzZXBhcmF0b3IgKi8KKyNkZWZpbmUgQUNQSV9QQVRIX1NFUEFSQVRPUiAgICAgICAgICAgICAnLicKKworLyogU2l6ZXMgZm9yIEFDUEkgdGFibGUgaGVhZGVycyAqLworCisjZGVmaW5lIEFDUElfT0VNX0lEX1NJWkUgICAgICAgICAgICAgICAgNgorI2RlZmluZSBBQ1BJX09FTV9UQUJMRV9JRF9TSVpFICAgICAgICAgIDgKKworLyogQ29uc3RhbnRzIHVzZWQgaW4gc2VhcmNoaW5nIGZvciB0aGUgUlNEUCBpbiBsb3cgbWVtb3J5ICovCisKKyNkZWZpbmUgQUNQSV9FQkRBX1BUUl9MT0NBVElPTiAgICAgICAgICAweDAwMDAwNDBFCS8qIFBoeXNpY2FsIEFkZHJlc3MgKi8KKyNkZWZpbmUgQUNQSV9FQkRBX1BUUl9MRU5HVEggICAgICAgICAgICAyCisjZGVmaW5lIEFDUElfRUJEQV9XSU5ET1dfU0laRSAgICAgICAgICAgMTAyNAorI2RlZmluZSBBQ1BJX0hJX1JTRFBfV0lORE9XX0JBU0UgICAgICAgIDB4MDAwRTAwMDAJLyogUGh5c2ljYWwgQWRkcmVzcyAqLworI2RlZmluZSBBQ1BJX0hJX1JTRFBfV0lORE9XX1NJWkUgICAgICAgIDB4MDAwMjAwMDAKKyNkZWZpbmUgQUNQSV9SU0RQX1NDQU5fU1RFUCAgICAgICAgICAgICAxNgorCisvKiBPcGVyYXRpb24gcmVnaW9ucyAqLworCisjZGVmaW5lIEFDUElfTlVNX1BSRURFRklORURfUkVHSU9OUyAgICAgOAorI2RlZmluZSBBQ1BJX1VTRVJfUkVHSU9OX0JFR0lOICAgICAgICAgIDB4ODAKKworLyogTWF4aW11bSBzcGFjZV9pZHMgZm9yIE9wZXJhdGlvbiBSZWdpb25zICovCisKKyNkZWZpbmUgQUNQSV9NQVhfQUREUkVTU19TUEFDRSAgICAgICAgICAyNTUKKworLyogQXJyYXkgc2l6ZXMuICBVc2VkIGZvciByYW5nZSBjaGVja2luZyBhbHNvICovCisKKyNkZWZpbmUgQUNQSV9NQVhfTUFUQ0hfT1BDT0RFICAgICAgICAgICA1CisKKy8qIFJTRFAgY2hlY2tzdW1zICovCisKKyNkZWZpbmUgQUNQSV9SU0RQX0NIRUNLU1VNX0xFTkdUSCAgICAgICAyMAorI2RlZmluZSBBQ1BJX1JTRFBfWENIRUNLU1VNX0xFTkdUSCAgICAgIDM2CisKKy8qIFNNQnVzIGJpZGlyZWN0aW9uYWwgYnVmZmVyIHNpemUgKi8KKworI2RlZmluZSBBQ1BJX1NNQlVTX0JVRkZFUl9TSVpFICAgICAgICAgIDM0CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBBQ1BJIEFNTCBEZWJ1Z2dlcgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBBQ1BJX0RFQlVHR0VSX01BWF9BUkdTICAgICAgICAgIDgJLyogTXVzdCBiZSBtYXggbWV0aG9kIGFyZ3MgKyAxICovCisKKyNkZWZpbmUgQUNQSV9ERUJVR0dFUl9DT01NQU5EX1BST01QVCAgICAnLScKKyNkZWZpbmUgQUNQSV9ERUJVR0dFUl9FWEVDVVRFX1BST01QVCAgICAnJScKKworI2VuZGlmCQkJCS8qIF9BQ0NPTkZJR19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FjcGkvYWNkZWJ1Zy5oIGIvZHJpdmVycy9hY3BpL2FjcGljYS9hY2RlYnVnLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYWNwaS9hY2RlYnVnLmgKcmVuYW1lIHRvIGRyaXZlcnMvYWNwaS9hY3BpY2EvYWNkZWJ1Zy5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FjcGkvYWNkaXNwYXQuaCBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvYWNkaXNwYXQuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hY3BpL2FjZGlzcGF0LmgKcmVuYW1lIHRvIGRyaXZlcnMvYWNwaS9hY3BpY2EvYWNkaXNwYXQuaApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS9hY2V2ZW50cy5oIGIvZHJpdmVycy9hY3BpL2FjcGljYS9hY2V2ZW50cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3ZTIwMTMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2FjZXZlbnRzLmgKQEAgLTAsMCArMSwyMTggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBOYW1lOiBhY2V2ZW50cy5oIC0gRXZlbnQgc3ViY29tcG9uZW50IHByb3RvdHlwZXMgYW5kIGRlZmluZXMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA4LCBJbnRlbCBDb3JwLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAorICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgYXQgbWluaW11bSBhIGRpc2NsYWltZXIKKyAqICAgIHN1YnN0YW50aWFsbHkgc2ltaWxhciB0byB0aGUgIk5PIFdBUlJBTlRZIiBkaXNjbGFpbWVyIGJlbG93CisgKiAgICAoIkRpc2NsYWltZXIiKSBhbmQgYW55IHJlZGlzdHJpYnV0aW9uIG11c3QgYmUgY29uZGl0aW9uZWQgdXBvbgorICogICAgaW5jbHVkaW5nIGEgc3Vic3RhbnRpYWxseSBzaW1pbGFyIERpc2NsYWltZXIgcmVxdWlyZW1lbnQgZm9yIGZ1cnRoZXIKKyAqICAgIGJpbmFyeSByZWRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcworICogICAgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBOTyBXQVJSQU5UWQorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcKKyAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgorICovCisKKyNpZm5kZWYgX19BQ0VWRU5UU19IX18KKyNkZWZpbmUgX19BQ0VWRU5UU19IX18KKworLyoKKyAqIGV2ZXZlbnQKKyAqLworYWNwaV9zdGF0dXMgYWNwaV9ldl9pbml0aWFsaXplX2V2ZW50cyh2b2lkKTsKKworYWNwaV9zdGF0dXMgYWNwaV9ldl9pbnN0YWxsX3hydXB0X2hhbmRsZXJzKHZvaWQpOworCithY3BpX3N0YXR1cyBhY3BpX2V2X2luc3RhbGxfZmFkdF9ncGVzKHZvaWQpOworCit1MzIgYWNwaV9ldl9maXhlZF9ldmVudF9kZXRlY3Qodm9pZCk7CisKKy8qCisgKiBldm1pc2MKKyAqLwordTggYWNwaV9ldl9pc19ub3RpZnlfb2JqZWN0KHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlKTsKKworYWNwaV9zdGF0dXMgYWNwaV9ldl9hY3F1aXJlX2dsb2JhbF9sb2NrKHUxNiB0aW1lb3V0KTsKKworYWNwaV9zdGF0dXMgYWNwaV9ldl9yZWxlYXNlX2dsb2JhbF9sb2NrKHZvaWQpOworCithY3BpX3N0YXR1cyBhY3BpX2V2X2luaXRfZ2xvYmFsX2xvY2tfaGFuZGxlcih2b2lkKTsKKwordTMyIGFjcGlfZXZfZ2V0X2dwZV9udW1iZXJfaW5kZXgodTMyIGdwZV9udW1iZXIpOworCithY3BpX3N0YXR1cworYWNwaV9ldl9xdWV1ZV9ub3RpZnlfcmVxdWVzdChzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZSwKKwkJCSAgICAgdTMyIG5vdGlmeV92YWx1ZSk7CisKKy8qCisgKiBldmdwZSAtIEdQRSBoYW5kbGluZyBhbmQgZGlzcGF0Y2gKKyAqLworYWNwaV9zdGF0dXMKK2FjcGlfZXZfdXBkYXRlX2dwZV9lbmFibGVfbWFza3Moc3RydWN0IGFjcGlfZ3BlX2V2ZW50X2luZm8gKmdwZV9ldmVudF9pbmZvLAorCQkJCXU4IHR5cGUpOworCithY3BpX3N0YXR1cworYWNwaV9ldl9lbmFibGVfZ3BlKHN0cnVjdCBhY3BpX2dwZV9ldmVudF9pbmZvICpncGVfZXZlbnRfaW5mbywKKwkJICAgdTggd3JpdGVfdG9faGFyZHdhcmUpOworCithY3BpX3N0YXR1cyBhY3BpX2V2X2Rpc2FibGVfZ3BlKHN0cnVjdCBhY3BpX2dwZV9ldmVudF9pbmZvICpncGVfZXZlbnRfaW5mbyk7CisKK3N0cnVjdCBhY3BpX2dwZV9ldmVudF9pbmZvICphY3BpX2V2X2dldF9ncGVfZXZlbnRfaW5mbyhhY3BpX2hhbmRsZSBncGVfZGV2aWNlLAorCQkJCQkJICAgICAgIHUzMiBncGVfbnVtYmVyKTsKKworLyoKKyAqIGV2Z3BlYmxrCisgKi8KK3U4IGFjcGlfZXZfdmFsaWRfZ3BlX2V2ZW50KHN0cnVjdCBhY3BpX2dwZV9ldmVudF9pbmZvICpncGVfZXZlbnRfaW5mbyk7CisKK2FjcGlfc3RhdHVzCithY3BpX2V2X3dhbGtfZ3BlX2xpc3QoYWNwaV9ncGVfY2FsbGJhY2sgZ3BlX3dhbGtfY2FsbGJhY2ssIHZvaWQgKmNvbnRleHQpOworCithY3BpX3N0YXR1cworYWNwaV9ldl9kZWxldGVfZ3BlX2hhbmRsZXJzKHN0cnVjdCBhY3BpX2dwZV94cnVwdF9pbmZvICpncGVfeHJ1cHRfaW5mbywKKwkJCSAgICBzdHJ1Y3QgYWNwaV9ncGVfYmxvY2tfaW5mbyAqZ3BlX2Jsb2NrLAorCQkJICAgIHZvaWQgKmNvbnRleHQpOworCithY3BpX3N0YXR1cworYWNwaV9ldl9jcmVhdGVfZ3BlX2Jsb2NrKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpncGVfZGV2aWNlLAorCQkJIHN0cnVjdCBhY3BpX2dlbmVyaWNfYWRkcmVzcyAqZ3BlX2Jsb2NrX2FkZHJlc3MsCisJCQkgdTMyIHJlZ2lzdGVyX2NvdW50LAorCQkJIHU4IGdwZV9ibG9ja19iYXNlX251bWJlciwKKwkJCSB1MzIgaW50ZXJydXB0X251bWJlciwKKwkJCSBzdHJ1Y3QgYWNwaV9ncGVfYmxvY2tfaW5mbyAqKnJldHVybl9ncGVfYmxvY2spOworCithY3BpX3N0YXR1cworYWNwaV9ldl9pbml0aWFsaXplX2dwZV9ibG9jayhzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqZ3BlX2RldmljZSwKKwkJCSAgICAgc3RydWN0IGFjcGlfZ3BlX2Jsb2NrX2luZm8gKmdwZV9ibG9jayk7CisKK2FjcGlfc3RhdHVzIGFjcGlfZXZfZGVsZXRlX2dwZV9ibG9jayhzdHJ1Y3QgYWNwaV9ncGVfYmxvY2tfaW5mbyAqZ3BlX2Jsb2NrKTsKKwordTMyCithY3BpX2V2X2dwZV9kaXNwYXRjaChzdHJ1Y3QgYWNwaV9ncGVfZXZlbnRfaW5mbyAqZ3BlX2V2ZW50X2luZm8sCisJCSAgICAgdTMyIGdwZV9udW1iZXIpOworCit1MzIgYWNwaV9ldl9ncGVfZGV0ZWN0KHN0cnVjdCBhY3BpX2dwZV94cnVwdF9pbmZvICpncGVfeHJ1cHRfbGlzdCk7CisKK2FjcGlfc3RhdHVzCithY3BpX2V2X3NldF9ncGVfdHlwZShzdHJ1Y3QgYWNwaV9ncGVfZXZlbnRfaW5mbyAqZ3BlX2V2ZW50X2luZm8sIHU4IHR5cGUpOworCithY3BpX3N0YXR1cworYWNwaV9ldl9jaGVja19mb3Jfd2FrZV9vbmx5X2dwZShzdHJ1Y3QgYWNwaV9ncGVfZXZlbnRfaW5mbyAqZ3BlX2V2ZW50X2luZm8pOworCithY3BpX3N0YXR1cyBhY3BpX2V2X2dwZV9pbml0aWFsaXplKHZvaWQpOworCisvKgorICogZXZyZWdpb24gLSBBZGRyZXNzIFNwYWNlIGhhbmRsaW5nCisgKi8KK2FjcGlfc3RhdHVzIGFjcGlfZXZfaW5zdGFsbF9yZWdpb25faGFuZGxlcnModm9pZCk7CisKK2FjcGlfc3RhdHVzIGFjcGlfZXZfaW5pdGlhbGl6ZV9vcF9yZWdpb25zKHZvaWQpOworCithY3BpX3N0YXR1cworYWNwaV9ldl9hZGRyZXNzX3NwYWNlX2Rpc3BhdGNoKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnJlZ2lvbl9vYmosCisJCQkgICAgICAgdTMyIGZ1bmN0aW9uLAorCQkJICAgICAgIGFjcGlfcGh5c2ljYWxfYWRkcmVzcyBhZGRyZXNzLAorCQkJICAgICAgIHUzMiBiaXRfd2lkdGgsIGFjcGlfaW50ZWdlciAqIHZhbHVlKTsKKworYWNwaV9zdGF0dXMKK2FjcGlfZXZfYXR0YWNoX3JlZ2lvbih1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpoYW5kbGVyX29iaiwKKwkJICAgICAgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqcmVnaW9uX29iaiwKKwkJICAgICAgdTggYWNwaV9uc19pc19sb2NrZWQpOworCit2b2lkCithY3BpX2V2X2RldGFjaF9yZWdpb24odW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqcmVnaW9uX29iaiwKKwkJICAgICAgdTggYWNwaV9uc19pc19sb2NrZWQpOworCithY3BpX3N0YXR1cworYWNwaV9ldl9pbnN0YWxsX3NwYWNlX2hhbmRsZXIoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGUsCisJCQkgICAgICBhY3BpX2Fkcl9zcGFjZV90eXBlIHNwYWNlX2lkLAorCQkJICAgICAgYWNwaV9hZHJfc3BhY2VfaGFuZGxlciBoYW5kbGVyLAorCQkJICAgICAgYWNwaV9hZHJfc3BhY2Vfc2V0dXAgc2V0dXAsIHZvaWQgKmNvbnRleHQpOworCithY3BpX3N0YXR1cworYWNwaV9ldl9leGVjdXRlX3JlZ19tZXRob2RzKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlLAorCQkJICAgIGFjcGlfYWRyX3NwYWNlX3R5cGUgc3BhY2VfaWQpOworCithY3BpX3N0YXR1cworYWNwaV9ldl9leGVjdXRlX3JlZ19tZXRob2QodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqcmVnaW9uX29iaiwgdTMyIGZ1bmN0aW9uKTsKKworLyoKKyAqIGV2cmVnaW5pIC0gUmVnaW9uIGluaXRpYWxpemF0aW9uIGFuZCBzZXR1cAorICovCithY3BpX3N0YXR1cworYWNwaV9ldl9zeXN0ZW1fbWVtb3J5X3JlZ2lvbl9zZXR1cChhY3BpX2hhbmRsZSBoYW5kbGUsCisJCQkJICAgdTMyIGZ1bmN0aW9uLAorCQkJCSAgIHZvaWQgKmhhbmRsZXJfY29udGV4dCwKKwkJCQkgICB2b2lkICoqcmVnaW9uX2NvbnRleHQpOworCithY3BpX3N0YXR1cworYWNwaV9ldl9pb19zcGFjZV9yZWdpb25fc2V0dXAoYWNwaV9oYW5kbGUgaGFuZGxlLAorCQkJICAgICAgdTMyIGZ1bmN0aW9uLAorCQkJICAgICAgdm9pZCAqaGFuZGxlcl9jb250ZXh0LCB2b2lkICoqcmVnaW9uX2NvbnRleHQpOworCithY3BpX3N0YXR1cworYWNwaV9ldl9wY2lfY29uZmlnX3JlZ2lvbl9zZXR1cChhY3BpX2hhbmRsZSBoYW5kbGUsCisJCQkJdTMyIGZ1bmN0aW9uLAorCQkJCXZvaWQgKmhhbmRsZXJfY29udGV4dCwgdm9pZCAqKnJlZ2lvbl9jb250ZXh0KTsKKworYWNwaV9zdGF0dXMKK2FjcGlfZXZfY21vc19yZWdpb25fc2V0dXAoYWNwaV9oYW5kbGUgaGFuZGxlLAorCQkJICB1MzIgZnVuY3Rpb24sCisJCQkgIHZvaWQgKmhhbmRsZXJfY29udGV4dCwgdm9pZCAqKnJlZ2lvbl9jb250ZXh0KTsKKworYWNwaV9zdGF0dXMKK2FjcGlfZXZfcGNpX2Jhcl9yZWdpb25fc2V0dXAoYWNwaV9oYW5kbGUgaGFuZGxlLAorCQkJICAgICB1MzIgZnVuY3Rpb24sCisJCQkgICAgIHZvaWQgKmhhbmRsZXJfY29udGV4dCwgdm9pZCAqKnJlZ2lvbl9jb250ZXh0KTsKKworYWNwaV9zdGF0dXMKK2FjcGlfZXZfZGVmYXVsdF9yZWdpb25fc2V0dXAoYWNwaV9oYW5kbGUgaGFuZGxlLAorCQkJICAgICB1MzIgZnVuY3Rpb24sCisJCQkgICAgIHZvaWQgKmhhbmRsZXJfY29udGV4dCwgdm9pZCAqKnJlZ2lvbl9jb250ZXh0KTsKKworYWNwaV9zdGF0dXMKK2FjcGlfZXZfaW5pdGlhbGl6ZV9yZWdpb24odW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqcmVnaW9uX29iaiwKKwkJCSAgdTggYWNwaV9uc19sb2NrZWQpOworCisvKgorICogZXZzY2kgLSBTQ0kgKFN5c3RlbSBDb250cm9sIEludGVycnVwdCkgaGFuZGxpbmcvZGlzcGF0Y2gKKyAqLwordTMyIEFDUElfU1lTVEVNX1hGQUNFIGFjcGlfZXZfZ3BlX3hydXB0X2hhbmRsZXIodm9pZCAqY29udGV4dCk7CisKK3UzMiBhY3BpX2V2X2luc3RhbGxfc2NpX2hhbmRsZXIodm9pZCk7CisKK2FjcGlfc3RhdHVzIGFjcGlfZXZfcmVtb3ZlX3NjaV9oYW5kbGVyKHZvaWQpOworCit1MzIgYWNwaV9ldl9pbml0aWFsaXplX3NDSSh1MzIgcHJvZ3JhbV9zQ0kpOworCit2b2lkIGFjcGlfZXZfdGVybWluYXRlKHZvaWQpOworCisjZW5kaWYJCQkJLyogX19BQ0VWRU5UU19IX18gICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2FjZ2xvYmFsLmggYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2FjZ2xvYmFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGRiNDBmNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvYWNnbG9iYWwuaApAQCAtMCwwICsxLDM5NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIE5hbWU6IGFjZ2xvYmFsLmggLSBEZWNsYXJhdGlvbnMgZm9yIGdsb2JhbCB2YXJpYWJsZXMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA4LCBJbnRlbCBDb3JwLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAorICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgYXQgbWluaW11bSBhIGRpc2NsYWltZXIKKyAqICAgIHN1YnN0YW50aWFsbHkgc2ltaWxhciB0byB0aGUgIk5PIFdBUlJBTlRZIiBkaXNjbGFpbWVyIGJlbG93CisgKiAgICAoIkRpc2NsYWltZXIiKSBhbmQgYW55IHJlZGlzdHJpYnV0aW9uIG11c3QgYmUgY29uZGl0aW9uZWQgdXBvbgorICogICAgaW5jbHVkaW5nIGEgc3Vic3RhbnRpYWxseSBzaW1pbGFyIERpc2NsYWltZXIgcmVxdWlyZW1lbnQgZm9yIGZ1cnRoZXIKKyAqICAgIGJpbmFyeSByZWRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcworICogICAgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBOTyBXQVJSQU5UWQorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcKKyAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgorICovCisKKyNpZm5kZWYgX19BQ0dMT0JBTF9IX18KKyNkZWZpbmUgX19BQ0dMT0JBTF9IX18KKworLyoKKyAqIEVuc3VyZSB0aGF0IHRoZSBnbG9iYWxzIGFyZSBhY3R1YWxseSBkZWZpbmVkIGFuZCBpbml0aWFsaXplZCBvbmx5IG9uY2UuCisgKgorICogVGhlIHVzZSBvZiB0aGVzZSBtYWNyb3MgYWxsb3dzIGEgc2luZ2xlIGxpc3Qgb2YgZ2xvYmFscyAoaGVyZSkgaW4gb3JkZXIKKyAqIHRvIHNpbXBsaWZ5IG1haW50ZW5hbmNlIG9mIHRoZSBjb2RlLgorICovCisjaWZkZWYgREVGSU5FX0FDUElfR0xPQkFMUworI2RlZmluZSBBQ1BJX0VYVEVSTgorI2RlZmluZSBBQ1BJX0lOSVRfR0xPQkFMKGEsYikgYT1iCisjZWxzZQorI2RlZmluZSBBQ1BJX0VYVEVSTiBleHRlcm4KKyNkZWZpbmUgQUNQSV9JTklUX0dMT0JBTChhLGIpIGEKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBSdW50aW1lIGNvbmZpZ3VyYXRpb24gKHN0YXRpYyBkZWZhdWx0cyB0aGF0IGNhbiBiZSBvdmVycmlkZW4gYXQgcnVudGltZSkKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIEVuYWJsZSAic2xhY2siIGluIHRoZSBBTUwgaW50ZXJwcmV0ZXI/ICBEZWZhdWx0IGlzIEZBTFNFLCBhbmQgdGhlCisgKiBpbnRlcnByZXRlciBzdHJpY3RseSBmb2xsb3dzIHRoZSBBQ1BJIHNwZWNpZmljYXRpb24uICBTZXR0aW5nIHRvIFRSVUUKKyAqIGFsbG93cyB0aGUgaW50ZXJwcmV0ZXIgdG8gaWdub3JlIGNlcnRhaW4gZXJyb3JzIGFuZC9vciBiYWQgQU1MIGNvbnN0cnVjdHMuCisgKgorICogQ3VycmVudGx5LCB0aGVzZSBmZWF0dXJlcyBhcmUgZW5hYmxlZCBieSB0aGlzIGZsYWc6CisgKgorICogMSkgQWxsb3cgImltcGxpY2l0IHJldHVybiIgb2YgbGFzdCB2YWx1ZSBpbiBhIGNvbnRyb2wgbWV0aG9kCisgKiAyKSBBbGxvdyBhY2Nlc3MgYmV5b25kIHRoZSBlbmQgb2YgYW4gb3BlcmF0aW9uIHJlZ2lvbgorICogMykgQWxsb3cgYWNjZXNzIHRvIHVuaW5pdGlhbGl6ZWQgbG9jYWxzL2FyZ3MgKGF1dG8taW5pdCB0byBpbnRlZ2VyIDApCisgKiA0KSBBbGxvdyBBTlkgb2JqZWN0IHR5cGUgdG8gYmUgYSBzb3VyY2Ugb3BlcmFuZCBmb3IgdGhlIFN0b3JlKCkgb3BlcmF0b3IKKyAqIDUpIEFsbG93IHVucmVzb2x2ZWQgcmVmZXJlbmNlcyAoaW52YWxpZCB0YXJnZXQgbmFtZSkgaW4gcGFja2FnZSBvYmplY3RzCisgKiA2KSBFbmFibGUgd2FybmluZyBtZXNzYWdlcyBmb3IgYmVoYXZpb3IgdGhhdCBpcyBub3QgQUNQSSBzcGVjIGNvbXBsaWFudAorICovCitBQ1BJX0VYVEVSTiB1OCBBQ1BJX0lOSVRfR0xPQkFMKGFjcGlfZ2JsX2VuYWJsZV9pbnRlcnByZXRlcl9zbGFjaywgRkFMU0UpOworCisvKgorICogQXV0b21hdGljYWxseSBzZXJpYWxpemUgQUxMIGNvbnRyb2wgbWV0aG9kcz8gRGVmYXVsdCBpcyBGQUxTRSwgbWVhbmluZworICogdG8gdXNlIHRoZSBTZXJpYWxpemVkL25vdF9zZXJpYWxpemVkIG1ldGhvZCBmbGFncyBvbiBhIHBlciBtZXRob2QgYmFzaXMuCisgKiBPbmx5IGNoYW5nZSB0aGlzIGlmIHRoZSBBU0wgY29kZSBpcyBwb29ybHkgd3JpdHRlbiBhbmQgY2Fubm90IGhhbmRsZQorICogcmVlbnRyYW5jeSBldmVuIHRob3VnaCBtZXRob2RzIGFyZSBtYXJrZWQgIk5vdFNlcmlhbGl6ZWQiLgorICovCitBQ1BJX0VYVEVSTiB1OCBBQ1BJX0lOSVRfR0xPQkFMKGFjcGlfZ2JsX2FsbF9tZXRob2RzX3NlcmlhbGl6ZWQsIEZBTFNFKTsKKworLyoKKyAqIENyZWF0ZSB0aGUgcHJlZGVmaW5lZCBfT1NJIG1ldGhvZCBpbiB0aGUgbmFtZXNwYWNlPyBEZWZhdWx0IGlzIFRSVUUKKyAqIGJlY2F1c2UgQUNQSSBDQSBpcyBmdWxseSBjb21wYXRpYmxlIHdpdGggb3RoZXIgQUNQSSBpbXBsZW1lbnRhdGlvbnMuCisgKiBDaGFuZ2luZyB0aGlzIHdpbGwgcmV2ZXJ0IEFDUEkgQ0EgKGFuZCBtYWNoaW5lIEFTTCkgdG8gcHJlLU9TSSBiZWhhdmlvci4KKyAqLworQUNQSV9FWFRFUk4gdTggQUNQSV9JTklUX0dMT0JBTChhY3BpX2dibF9jcmVhdGVfb3NpX21ldGhvZCwgVFJVRSk7CisKKy8qCisgKiBEaXNhYmxlIHdha2V1cCBHUEVzIGR1cmluZyBydW50aW1lPyBEZWZhdWx0IGlzIFRSVUUgYmVjYXVzZSBXQUtFIGFuZAorICogUlVOVElNRSBHUEVzIHNob3VsZCBuZXZlciBiZSBzaGFyZWQsIGFuZCBXQUtFIEdQRXMgc2hvdWxkIHR5cGljYWxseSBvbmx5CisgKiBiZSBlbmFibGVkIGp1c3QgYmVmb3JlIGdvaW5nIHRvIHNsZWVwLgorICovCitBQ1BJX0VYVEVSTiB1OCBBQ1BJX0lOSVRfR0xPQkFMKGFjcGlfZ2JsX2xlYXZlX3dha2VfZ3Blc19kaXNhYmxlZCwgVFJVRSk7CisKKy8qCisgKiBPcHRpb25hbGx5IHVzZSBkZWZhdWx0IHZhbHVlcyBmb3IgdGhlIEFDUEkgcmVnaXN0ZXIgd2lkdGhzLiBTZXQgdGhpcyB0bworICogVFJVRSB0byB1c2UgdGhlIGRlZmF1bHRzLCBpZiBhbiBGQURUIGNvbnRhaW5zIGluY29ycmVjdCB3aWR0aHMvbGVuZ3Rocy4KKyAqLworQUNQSV9FWFRFUk4gdTggQUNQSV9JTklUX0dMT0JBTChhY3BpX2dibF91c2VfZGVmYXVsdF9yZWdpc3Rlcl93aWR0aHMsIFRSVUUpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBEZWJ1ZyBzdXBwb3J0CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFJ1bnRpbWUgY29uZmlndXJhdGlvbiBvZiBkZWJ1ZyBwcmludCBsZXZlbHMgKi8KKworZXh0ZXJuIHUzMiBhY3BpX2RiZ19sZXZlbDsKK2V4dGVybiB1MzIgYWNwaV9kYmdfbGF5ZXI7CisKKy8qIFByb2NlZHVyZSBuZXN0aW5nIGxldmVsIGZvciBkZWJ1ZyBvdXRwdXQgKi8KKworZXh0ZXJuIHUzMiBhY3BpX2dibF9uZXN0aW5nX2xldmVsOworCisvKiBTdXBwb3J0IGZvciBkeW5hbWljIGNvbnRyb2wgbWV0aG9kIHRyYWNpbmcgbWVjaGFuaXNtICovCisKK0FDUElfRVhURVJOIHUzMiBhY3BpX2dibF9vcmlnaW5hbF9kYmdfbGV2ZWw7CitBQ1BJX0VYVEVSTiB1MzIgYWNwaV9nYmxfb3JpZ2luYWxfZGJnX2xheWVyOworQUNQSV9FWFRFUk4gYWNwaV9uYW1lIGFjcGlfZ2JsX3RyYWNlX21ldGhvZF9uYW1lOworQUNQSV9FWFRFUk4gdTMyIGFjcGlfZ2JsX3RyYWNlX2RiZ19sZXZlbDsKK0FDUElfRVhURVJOIHUzMiBhY3BpX2dibF90cmFjZV9kYmdfbGF5ZXI7CitBQ1BJX0VYVEVSTiB1MzIgYWNwaV9nYmxfdHJhY2VfZmxhZ3M7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEFDUEkgVGFibGUgZ2xvYmFscworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0IGlzIHRoZSBtYXN0ZXIgbGlzdCBvZiBBQ1BJIHRhYmxlcyBmb3VuZCBpbiB0aGUKKyAqIFJTRFQvWFNEVC4KKyAqCisgKiBhY3BpX2dibF9GQURUIGlzIGEgbG9jYWwgY29weSBvZiB0aGUgRkFEVCwgY29udmVydGVkIHRvIGEgY29tbW9uIGZvcm1hdC4KKyAqLworQUNQSV9FWFRFUk4gc3RydWN0IGFjcGlfaW50ZXJuYWxfcnNkdCBhY3BpX2dibF9yb290X3RhYmxlX2xpc3Q7CitBQ1BJX0VYVEVSTiBzdHJ1Y3QgYWNwaV90YWJsZV9mYWR0IGFjcGlfZ2JsX0ZBRFQ7CitBQ1BJX0VYVEVSTiBzdHJ1Y3QgYWNwaV90YWJsZV9mYWNzICphY3BpX2dibF9GQUNTOworCisvKiBUaGVzZSBhZGRyZXNzZXMgYXJlIGNhbGN1bGF0ZWQgZnJvbSBGQURUIGFkZHJlc3MgdmFsdWVzICovCisKK0FDUElfRVhURVJOIHN0cnVjdCBhY3BpX2dlbmVyaWNfYWRkcmVzcyBhY3BpX2dibF94cG0xYV9lbmFibGU7CitBQ1BJX0VYVEVSTiBzdHJ1Y3QgYWNwaV9nZW5lcmljX2FkZHJlc3MgYWNwaV9nYmxfeHBtMWJfZW5hYmxlOworCisvKgorICogSGFuZGxlIGJvdGggQUNQSSAxLjAgYW5kIEFDUEkgMi4wIEludGVnZXIgd2lkdGhzLiBUaGUgaW50ZWdlciB3aWR0aCBpcworICogZGV0ZXJtaW5lZCBieSB0aGUgcmV2aXNpb24gb2YgdGhlIERTRFQ6IElmIHRoZSBEU0RUIHJldmlzaW9uIGlzIGxlc3MgdGhhbgorICogMiwgdXNlIG9ubHkgdGhlIGxvd2VyIDMyIGJpdHMgb2YgdGhlIGludGVybmFsIDY0LWJpdCBJbnRlZ2VyLgorICovCitBQ1BJX0VYVEVSTiB1OCBhY3BpX2dibF9pbnRlZ2VyX2JpdF93aWR0aDsKK0FDUElfRVhURVJOIHU4IGFjcGlfZ2JsX2ludGVnZXJfYnl0ZV93aWR0aDsKK0FDUElfRVhURVJOIHU4IGFjcGlfZ2JsX2ludGVnZXJfbnliYmxlX3dpZHRoOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBNdXR1YWwgZXhsdXNpb24gd2l0aGluIEFDUElDQSBzdWJzeXN0ZW0KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIFByZWRlZmluZWQgbXV0ZXggb2JqZWN0cy4gVGhpcyBhcnJheSBjb250YWlucyB0aGUKKyAqIGFjdHVhbCBPUyBtdXRleCBoYW5kbGVzLCBpbmRleGVkIGJ5IHRoZSBsb2NhbCBBQ1BJX01VVEVYX0hBTkRMRXMuCisgKiAoVGhlIHRhYmxlIG1hcHMgbG9jYWwgaGFuZGxlcyB0byB0aGUgcmVhbCBPUyBoYW5kbGVzKQorICovCitBQ1BJX0VYVEVSTiBzdHJ1Y3QgYWNwaV9tdXRleF9pbmZvIGFjcGlfZ2JsX211dGV4X2luZm9bQUNQSV9OVU1fTVVURVhdOworCisvKgorICogR2xvYmFsIGxvY2sgbXV0ZXggaXMgYW4gYWN0dWFsIEFNTCBtdXRleCBvYmplY3QKKyAqIEdsb2JhbCBsb2NrIHNlbWFwaG9yZSB3b3JrcyBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBIVyBnbG9iYWwgbG9jaworICovCitBQ1BJX0VYVEVSTiB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICphY3BpX2dibF9nbG9iYWxfbG9ja19tdXRleDsKK0FDUElfRVhURVJOIGFjcGlfc2VtYXBob3JlIGFjcGlfZ2JsX2dsb2JhbF9sb2NrX3NlbWFwaG9yZTsKK0FDUElfRVhURVJOIHUxNiBhY3BpX2dibF9nbG9iYWxfbG9ja19oYW5kbGU7CitBQ1BJX0VYVEVSTiB1OCBhY3BpX2dibF9nbG9iYWxfbG9ja19hY3F1aXJlZDsKK0FDUElfRVhURVJOIHU4IGFjcGlfZ2JsX2dsb2JhbF9sb2NrX3ByZXNlbnQ7CisKKy8qCisgKiBTcGlubG9ja3MgYXJlIHVzZWQgZm9yIGludGVyZmFjZXMgdGhhdCBjYW4gYmUgcG9zc2libHkgY2FsbGVkIGF0CisgKiBpbnRlcnJ1cHQgbGV2ZWwKKyAqLworQUNQSV9FWFRFUk4gc3BpbmxvY2tfdCBfYWNwaV9nYmxfZ3BlX2xvY2s7CS8qIEZvciBHUEUgZGF0YSBzdHJ1Y3RzIGFuZCByZWdpc3RlcnMgKi8KK0FDUElfRVhURVJOIHNwaW5sb2NrX3QgX2FjcGlfZ2JsX2hhcmR3YXJlX2xvY2s7CS8qIEZvciBBQ1BJIEgvVyBleGNlcHQgR1BFIHJlZ2lzdGVycyAqLworI2RlZmluZSBhY3BpX2dibF9ncGVfbG9jawkmX2FjcGlfZ2JsX2dwZV9sb2NrCisjZGVmaW5lIGFjcGlfZ2JsX2hhcmR3YXJlX2xvY2sJJl9hY3BpX2dibF9oYXJkd2FyZV9sb2NrCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIE1pc2NlbGxhbmVvdXMgZ2xvYmFscworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZkZWYgQUNQSV9EQkdfVFJBQ0tfQUxMT0NBVElPTlMKKworLyogTGlzdHMgZm9yIHRyYWNraW5nIG1lbW9yeSBhbGxvY2F0aW9ucyAqLworCitBQ1BJX0VYVEVSTiBzdHJ1Y3QgYWNwaV9tZW1vcnlfbGlzdCAqYWNwaV9nYmxfZ2xvYmFsX2xpc3Q7CitBQ1BJX0VYVEVSTiBzdHJ1Y3QgYWNwaV9tZW1vcnlfbGlzdCAqYWNwaV9nYmxfbnNfbm9kZV9saXN0OworQUNQSV9FWFRFUk4gdTggYWNwaV9nYmxfZGlzcGxheV9maW5hbF9tZW1fc3RhdHM7CisjZW5kaWYKKworLyogT2JqZWN0IGNhY2hlcyAqLworCitBQ1BJX0VYVEVSTiBhY3BpX2NhY2hlX3QgKmFjcGlfZ2JsX25hbWVzcGFjZV9jYWNoZTsKK0FDUElfRVhURVJOIGFjcGlfY2FjaGVfdCAqYWNwaV9nYmxfc3RhdGVfY2FjaGU7CitBQ1BJX0VYVEVSTiBhY3BpX2NhY2hlX3QgKmFjcGlfZ2JsX3BzX25vZGVfY2FjaGU7CitBQ1BJX0VYVEVSTiBhY3BpX2NhY2hlX3QgKmFjcGlfZ2JsX3BzX25vZGVfZXh0X2NhY2hlOworQUNQSV9FWFRFUk4gYWNwaV9jYWNoZV90ICphY3BpX2dibF9vcGVyYW5kX2NhY2hlOworCisvKiBHbG9iYWwgaGFuZGxlcnMgKi8KKworQUNQSV9FWFRFUk4gc3RydWN0IGFjcGlfb2JqZWN0X25vdGlmeV9oYW5kbGVyIGFjcGlfZ2JsX2RldmljZV9ub3RpZnk7CitBQ1BJX0VYVEVSTiBzdHJ1Y3QgYWNwaV9vYmplY3Rfbm90aWZ5X2hhbmRsZXIgYWNwaV9nYmxfc3lzdGVtX25vdGlmeTsKK0FDUElfRVhURVJOIGFjcGlfZXhjZXB0aW9uX2hhbmRsZXIgYWNwaV9nYmxfZXhjZXB0aW9uX2hhbmRsZXI7CitBQ1BJX0VYVEVSTiBhY3BpX2luaXRfaGFuZGxlciBhY3BpX2dibF9pbml0X2hhbmRsZXI7CitBQ1BJX0VYVEVSTiBhY3BpX3RibF9oYW5kbGVyIGFjcGlfZ2JsX3RhYmxlX2hhbmRsZXI7CitBQ1BJX0VYVEVSTiB2b2lkICphY3BpX2dibF90YWJsZV9oYW5kbGVyX2NvbnRleHQ7CitBQ1BJX0VYVEVSTiBzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICphY3BpX2dibF9icmVha3BvaW50X3dhbGs7CisKKy8qIE93bmVyIElEIHN1cHBvcnQgKi8KKworQUNQSV9FWFRFUk4gdTMyIGFjcGlfZ2JsX293bmVyX2lkX21hc2tbQUNQSV9OVU1fT1dORVJJRF9NQVNLU107CitBQ1BJX0VYVEVSTiB1OCBhY3BpX2dibF9sYXN0X293bmVyX2lkX2luZGV4OworQUNQSV9FWFRFUk4gdTggYWNwaV9nYmxfbmV4dF9vd25lcl9pZF9vZmZzZXQ7CisKKy8qIE1pc2MgKi8KKworQUNQSV9FWFRFUk4gdTMyIGFjcGlfZ2JsX29yaWdpbmFsX21vZGU7CitBQ1BJX0VYVEVSTiB1MzIgYWNwaV9nYmxfcnNkcF9vcmlnaW5hbF9sb2NhdGlvbjsKK0FDUElfRVhURVJOIHUzMiBhY3BpX2dibF9uc19sb29rdXBfY291bnQ7CitBQ1BJX0VYVEVSTiB1MzIgYWNwaV9nYmxfcHNfZmluZF9jb3VudDsKK0FDUElfRVhURVJOIHUxNiBhY3BpX2dibF9wbTFfZW5hYmxlX3JlZ2lzdGVyX3NhdmU7CitBQ1BJX0VYVEVSTiB1OCBhY3BpX2dibF9kZWJ1Z2dlcl9jb25maWd1cmF0aW9uOworQUNQSV9FWFRFUk4gdTggYWNwaV9nYmxfc3RlcF90b19uZXh0X2NhbGw7CitBQ1BJX0VYVEVSTiB1OCBhY3BpX2dibF9hY3BpX2hhcmR3YXJlX3ByZXNlbnQ7CitBQ1BJX0VYVEVSTiB1OCBhY3BpX2dibF9ldmVudHNfaW5pdGlhbGl6ZWQ7CitBQ1BJX0VYVEVSTiB1OCBhY3BpX2dibF9zeXN0ZW1fYXdha2VfYW5kX3J1bm5pbmc7CisKKyNpZm5kZWYgREVGSU5FX0FDUElfR0xPQkFMUworCisvKiBPdGhlciBtaXNjZWxsYW5lb3VzICovCisKK2V4dGVybiB1OCBhY3BpX2dibF9zaHV0ZG93bjsKK2V4dGVybiB1MzIgYWNwaV9nYmxfc3RhcnR1cF9mbGFnczsKK2V4dGVybiBjb25zdCBjaGFyICphY3BpX2dibF9zbGVlcF9zdGF0ZV9uYW1lc1tBQ1BJX1NfU1RBVEVfQ09VTlRdOworZXh0ZXJuIGNvbnN0IGNoYXIgKmFjcGlfZ2JsX2hpZ2hlc3RfZHN0YXRlX25hbWVzWzRdOworZXh0ZXJuIGNvbnN0IHN0cnVjdCBhY3BpX29wY29kZV9pbmZvIGFjcGlfZ2JsX2FtbF9vcF9pbmZvW0FNTF9OVU1fT1BDT0RFU107CitleHRlcm4gY29uc3QgY2hhciAqYWNwaV9nYmxfcmVnaW9uX3R5cGVzW0FDUElfTlVNX1BSRURFRklORURfUkVHSU9OU107CisKKyNlbmRpZgorCisvKiBFeGNlcHRpb24gY29kZXMgKi8KKworZXh0ZXJuIGNoYXIgY29uc3QgKmFjcGlfZ2JsX2V4Y2VwdGlvbl9uYW1lc19lbnZbXTsKK2V4dGVybiBjaGFyIGNvbnN0ICphY3BpX2dibF9leGNlcHRpb25fbmFtZXNfcGdtW107CitleHRlcm4gY2hhciBjb25zdCAqYWNwaV9nYmxfZXhjZXB0aW9uX25hbWVzX3RibFtdOworZXh0ZXJuIGNoYXIgY29uc3QgKmFjcGlfZ2JsX2V4Y2VwdGlvbl9uYW1lc19hbWxbXTsKK2V4dGVybiBjaGFyIGNvbnN0ICphY3BpX2dibF9leGNlcHRpb25fbmFtZXNfY3RybFtdOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBOYW1lc3BhY2UgZ2xvYmFscworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWYgIWRlZmluZWQgKEFDUElfTk9fTUVUSE9EX0VYRUNVVElPTikgfHwgZGVmaW5lZCAoQUNQSV9DT05TVEFOVF9FVkFMX09OTFkpCisjZGVmaW5lIE5VTV9QUkVERUZJTkVEX05BTUVTICAgICAgICAgICAgMTAKKyNlbHNlCisjZGVmaW5lIE5VTV9QUkVERUZJTkVEX05BTUVTICAgICAgICAgICAgOQorI2VuZGlmCisKK0FDUElfRVhURVJOIHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlIGFjcGlfZ2JsX3Jvb3Rfbm9kZV9zdHJ1Y3Q7CitBQ1BJX0VYVEVSTiBzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqYWNwaV9nYmxfcm9vdF9ub2RlOworQUNQSV9FWFRFUk4gc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKmFjcGlfZ2JsX2ZhZHRfZ3BlX2RldmljZTsKKworZXh0ZXJuIGNvbnN0IHU4IGFjcGlfZ2JsX25zX3Byb3BlcnRpZXNbQUNQSV9OVU1fTlNfVFlQRVNdOworZXh0ZXJuIGNvbnN0IHN0cnVjdCBhY3BpX3ByZWRlZmluZWRfbmFtZXMKKyAgICBhY3BpX2dibF9wcmVfZGVmaW5lZF9uYW1lc1tOVU1fUFJFREVGSU5FRF9OQU1FU107CisKKyNpZmRlZiBBQ1BJX0RFQlVHX09VVFBVVAorQUNQSV9FWFRFUk4gdTMyIGFjcGlfZ2JsX2N1cnJlbnRfbm9kZV9jb3VudDsKK0FDUElfRVhURVJOIHUzMiBhY3BpX2dibF9jdXJyZW50X25vZGVfc2l6ZTsKK0FDUElfRVhURVJOIHUzMiBhY3BpX2dibF9tYXhfY29uY3VycmVudF9ub2RlX2NvdW50OworQUNQSV9FWFRFUk4gYWNwaV9zaXplICphY3BpX2dibF9lbnRyeV9zdGFja19wb2ludGVyOworQUNQSV9FWFRFUk4gYWNwaV9zaXplICphY3BpX2dibF9sb3dlc3Rfc3RhY2tfcG9pbnRlcjsKK0FDUElfRVhURVJOIHUzMiBhY3BpX2dibF9kZWVwZXN0X25lc3Rpbmc7CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogSW50ZXJwcmV0ZXIgZ2xvYmFscworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitBQ1BJX0VYVEVSTiBzdHJ1Y3QgYWNwaV90aHJlYWRfc3RhdGUgKmFjcGlfZ2JsX2N1cnJlbnRfd2Fsa19saXN0OworCisvKiBDb250cm9sIG1ldGhvZCBzaW5nbGUgc3RlcCBmbGFnICovCisKK0FDUElfRVhURVJOIHU4IGFjcGlfZ2JsX2NtX3NpbmdsZV9zdGVwOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBIYXJkd2FyZSBnbG9iYWxzCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2V4dGVybiBzdHJ1Y3QgYWNwaV9iaXRfcmVnaXN0ZXJfaW5mbworICAgIGFjcGlfZ2JsX2JpdF9yZWdpc3Rlcl9pbmZvW0FDUElfTlVNX0JJVFJFR107CitBQ1BJX0VYVEVSTiB1OCBhY3BpX2dibF9zbGVlcF90eXBlX2E7CitBQ1BJX0VYVEVSTiB1OCBhY3BpX2dibF9zbGVlcF90eXBlX2I7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEV2ZW50IGFuZCBHUEUgZ2xvYmFscworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitleHRlcm4gc3RydWN0IGFjcGlfZml4ZWRfZXZlbnRfaW5mbworICAgIGFjcGlfZ2JsX2ZpeGVkX2V2ZW50X2luZm9bQUNQSV9OVU1fRklYRURfRVZFTlRTXTsKK0FDUElfRVhURVJOIHN0cnVjdCBhY3BpX2ZpeGVkX2V2ZW50X2hhbmRsZXIKKyAgICBhY3BpX2dibF9maXhlZF9ldmVudF9oYW5kbGVyc1tBQ1BJX05VTV9GSVhFRF9FVkVOVFNdOworQUNQSV9FWFRFUk4gc3RydWN0IGFjcGlfZ3BlX3hydXB0X2luZm8gKmFjcGlfZ2JsX2dwZV94cnVwdF9saXN0X2hlYWQ7CitBQ1BJX0VYVEVSTiBzdHJ1Y3QgYWNwaV9ncGVfYmxvY2tfaW5mbworKmFjcGlfZ2JsX2dwZV9mYWR0X2Jsb2Nrc1tBQ1BJX01BWF9HUEVfQkxPQ0tTXTsKK0FDUElfRVhURVJOIHUzMiBhY3BpX2N1cnJlbnRfZ3BlX2NvdW50OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBEZWJ1Z2dlciBnbG9iYWxzCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK0FDUElfRVhURVJOIHU4IGFjcGlfZ2JsX2RiX291dHB1dF9mbGFnczsKKworI2lmZGVmIEFDUElfRElTQVNTRU1CTEVSCisKK0FDUElfRVhURVJOIHU4IGFjcGlfZ2JsX2RiX29wdF9kaXNhc207CitBQ1BJX0VYVEVSTiB1OCBhY3BpX2dibF9kYl9vcHRfdmVyYm9zZTsKKyNlbmRpZgorCisjaWZkZWYgQUNQSV9ERUJVR0dFUgorCitleHRlcm4gdTggYWNwaV9nYmxfbWV0aG9kX2V4ZWN1dGluZzsKK2V4dGVybiB1OCBhY3BpX2dibF9hYm9ydF9tZXRob2Q7CitleHRlcm4gdTggYWNwaV9nYmxfZGJfdGVybWluYXRlX3RocmVhZHM7CisKK0FDUElfRVhURVJOIGludCBvcHRpbmQ7CitBQ1BJX0VYVEVSTiBjaGFyICpvcHRhcmc7CisKK0FDUElfRVhURVJOIHU4IGFjcGlfZ2JsX2RiX29wdF90YWJsZXM7CitBQ1BJX0VYVEVSTiB1OCBhY3BpX2dibF9kYl9vcHRfc3RhdHM7CitBQ1BJX0VYVEVSTiB1OCBhY3BpX2dibF9kYl9vcHRfaW5pX21ldGhvZHM7CisKK0FDUElfRVhURVJOIGNoYXIgKmFjcGlfZ2JsX2RiX2FyZ3NbQUNQSV9ERUJVR0dFUl9NQVhfQVJHU107CitBQ1BJX0VYVEVSTiBjaGFyIGFjcGlfZ2JsX2RiX2xpbmVfYnVmWzgwXTsKK0FDUElfRVhURVJOIGNoYXIgYWNwaV9nYmxfZGJfcGFyc2VkX2J1Zls4MF07CitBQ1BJX0VYVEVSTiBjaGFyIGFjcGlfZ2JsX2RiX3Njb3BlX2J1Zls0MF07CitBQ1BJX0VYVEVSTiBjaGFyIGFjcGlfZ2JsX2RiX2RlYnVnX2ZpbGVuYW1lWzQwXTsKK0FDUElfRVhURVJOIHU4IGFjcGlfZ2JsX2RiX291dHB1dF90b19maWxlOworQUNQSV9FWFRFUk4gY2hhciAqYWNwaV9nYmxfZGJfYnVmZmVyOworQUNQSV9FWFRFUk4gY2hhciAqYWNwaV9nYmxfZGJfZmlsZW5hbWU7CitBQ1BJX0VYVEVSTiB1MzIgYWNwaV9nYmxfZGJfZGVidWdfbGV2ZWw7CitBQ1BJX0VYVEVSTiB1MzIgYWNwaV9nYmxfZGJfY29uc29sZV9kZWJ1Z19sZXZlbDsKK0FDUElfRVhURVJOIHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqYWNwaV9nYmxfZGJfdGFibGVfcHRyOworQUNQSV9FWFRFUk4gc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKmFjcGlfZ2JsX2RiX3Njb3BlX25vZGU7CisKKy8qCisgKiBTdGF0aXN0aWMgZ2xvYmFscworICovCitBQ1BJX0VYVEVSTiB1MTYgYWNwaV9nYmxfb2JqX3R5cGVfY291bnRbQUNQSV9UWVBFX05TX05PREVfTUFYICsgMV07CitBQ1BJX0VYVEVSTiB1MTYgYWNwaV9nYmxfbm9kZV90eXBlX2NvdW50W0FDUElfVFlQRV9OU19OT0RFX01BWCArIDFdOworQUNQSV9FWFRFUk4gdTE2IGFjcGlfZ2JsX29ial90eXBlX2NvdW50X21pc2M7CitBQ1BJX0VYVEVSTiB1MTYgYWNwaV9nYmxfbm9kZV90eXBlX2NvdW50X21pc2M7CitBQ1BJX0VYVEVSTiB1MzIgYWNwaV9nYmxfbnVtX25vZGVzOworQUNQSV9FWFRFUk4gdTMyIGFjcGlfZ2JsX251bV9vYmplY3RzOworCitBQ1BJX0VYVEVSTiB1MzIgYWNwaV9nYmxfc2l6ZV9vZl9wYXJzZV90cmVlOworQUNQSV9FWFRFUk4gdTMyIGFjcGlfZ2JsX3NpemVfb2ZfbWV0aG9kX3RyZWVzOworQUNQSV9FWFRFUk4gdTMyIGFjcGlfZ2JsX3NpemVfb2Zfbm9kZV9lbnRyaWVzOworQUNQSV9FWFRFUk4gdTMyIGFjcGlfZ2JsX3NpemVfb2ZfYWNwaV9vYmplY3RzOworCisjZW5kaWYJCQkJLyogQUNQSV9ERUJVR0dFUiAqLworCisjZW5kaWYJCQkJLyogX19BQ0dMT0JBTF9IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvYWNod2FyZS5oIGIvZHJpdmVycy9hY3BpL2FjcGljYS9hY2h3YXJlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNThjNjlkYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvYWNod2FyZS5oCkBAIC0wLDAgKzEsMTE5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogTmFtZTogYWNod2FyZS5oIC0tIGhhcmR3YXJlIHNwZWNpZmljIGludGVyZmFjZXMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA4LCBJbnRlbCBDb3JwLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAorICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgYXQgbWluaW11bSBhIGRpc2NsYWltZXIKKyAqICAgIHN1YnN0YW50aWFsbHkgc2ltaWxhciB0byB0aGUgIk5PIFdBUlJBTlRZIiBkaXNjbGFpbWVyIGJlbG93CisgKiAgICAoIkRpc2NsYWltZXIiKSBhbmQgYW55IHJlZGlzdHJpYnV0aW9uIG11c3QgYmUgY29uZGl0aW9uZWQgdXBvbgorICogICAgaW5jbHVkaW5nIGEgc3Vic3RhbnRpYWxseSBzaW1pbGFyIERpc2NsYWltZXIgcmVxdWlyZW1lbnQgZm9yIGZ1cnRoZXIKKyAqICAgIGJpbmFyeSByZWRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcworICogICAgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBOTyBXQVJSQU5UWQorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcKKyAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgorICovCisKKyNpZm5kZWYgX19BQ0hXQVJFX0hfXworI2RlZmluZSBfX0FDSFdBUkVfSF9fCisKKy8qIFZhbHVlcyBmb3IgdGhlIF9TU1QgcHJlZGVmaW5lZCBtZXRob2QgKi8KKworI2RlZmluZSBBQ1BJX1NTVF9JTkRJQ0FUT1JfT0ZGICAwCisjZGVmaW5lIEFDUElfU1NUX1dPUktJTkcgICAgICAgIDEKKyNkZWZpbmUgQUNQSV9TU1RfV0FLSU5HICAgICAgICAgMgorI2RlZmluZSBBQ1BJX1NTVF9TTEVFUElORyAgICAgICAzCisjZGVmaW5lIEFDUElfU1NUX1NMRUVQX0NPTlRFWFQgIDQKKworLyoKKyAqIGh3YWNwaSAtIGhpZ2ggbGV2ZWwgZnVuY3Rpb25zCisgKi8KK2FjcGlfc3RhdHVzIGFjcGlfaHdfc2V0X21vZGUodTMyIG1vZGUpOworCit1MzIgYWNwaV9od19nZXRfbW9kZSh2b2lkKTsKKworLyoKKyAqIGh3cmVncyAtIEFDUEkgUmVnaXN0ZXIgSS9PCisgKi8KK3N0cnVjdCBhY3BpX2JpdF9yZWdpc3Rlcl9pbmZvICphY3BpX2h3X2dldF9iaXRfcmVnaXN0ZXJfaW5mbyh1MzIgcmVnaXN0ZXJfaWQpOworCithY3BpX3N0YXR1cworYWNwaV9od19yZWdpc3Rlcl9yZWFkKHUzMiByZWdpc3Rlcl9pZCwgdTMyICogcmV0dXJuX3ZhbHVlKTsKKworYWNwaV9zdGF0dXMgYWNwaV9od19yZWdpc3Rlcl93cml0ZSh1MzIgcmVnaXN0ZXJfaWQsIHUzMiB2YWx1ZSk7CisKK2FjcGlfc3RhdHVzIGFjcGlfaHdfY2xlYXJfYWNwaV9zdGF0dXModm9pZCk7CisKKy8qCisgKiBod2dwZSAtIEdQRSBzdXBwb3J0CisgKi8KK2FjcGlfc3RhdHVzIGFjcGlfaHdfbG93X2Rpc2FibGVfZ3BlKHN0cnVjdCBhY3BpX2dwZV9ldmVudF9pbmZvICpncGVfZXZlbnRfaW5mbyk7CisKK2FjcGlfc3RhdHVzCithY3BpX2h3X3dyaXRlX2dwZV9lbmFibGVfcmVnKHN0cnVjdCBhY3BpX2dwZV9ldmVudF9pbmZvICpncGVfZXZlbnRfaW5mbyk7CisKK2FjcGlfc3RhdHVzCithY3BpX2h3X2Rpc2FibGVfZ3BlX2Jsb2NrKHN0cnVjdCBhY3BpX2dwZV94cnVwdF9pbmZvICpncGVfeHJ1cHRfaW5mbywKKwkJCSAgc3RydWN0IGFjcGlfZ3BlX2Jsb2NrX2luZm8gKmdwZV9ibG9jaywgdm9pZCAqY29udGV4dCk7CisKK2FjcGlfc3RhdHVzIGFjcGlfaHdfY2xlYXJfZ3BlKHN0cnVjdCBhY3BpX2dwZV9ldmVudF9pbmZvICpncGVfZXZlbnRfaW5mbyk7CisKK2FjcGlfc3RhdHVzCithY3BpX2h3X2NsZWFyX2dwZV9ibG9jayhzdHJ1Y3QgYWNwaV9ncGVfeHJ1cHRfaW5mbyAqZ3BlX3hydXB0X2luZm8sCisJCQlzdHJ1Y3QgYWNwaV9ncGVfYmxvY2tfaW5mbyAqZ3BlX2Jsb2NrLCB2b2lkICpjb250ZXh0KTsKKworYWNwaV9zdGF0dXMKK2FjcGlfaHdfZ2V0X2dwZV9zdGF0dXMoc3RydWN0IGFjcGlfZ3BlX2V2ZW50X2luZm8gKmdwZV9ldmVudF9pbmZvLAorCQkgICAgICAgYWNwaV9ldmVudF9zdGF0dXMgKiBldmVudF9zdGF0dXMpOworCithY3BpX3N0YXR1cyBhY3BpX2h3X2Rpc2FibGVfYWxsX2dwZXModm9pZCk7CisKK2FjcGlfc3RhdHVzIGFjcGlfaHdfZW5hYmxlX2FsbF9ydW50aW1lX2dwZXModm9pZCk7CisKK2FjcGlfc3RhdHVzIGFjcGlfaHdfZW5hYmxlX2FsbF93YWtldXBfZ3Blcyh2b2lkKTsKKworYWNwaV9zdGF0dXMKK2FjcGlfaHdfZW5hYmxlX3J1bnRpbWVfZ3BlX2Jsb2NrKHN0cnVjdCBhY3BpX2dwZV94cnVwdF9pbmZvICpncGVfeHJ1cHRfaW5mbywKKwkJCQkgc3RydWN0IGFjcGlfZ3BlX2Jsb2NrX2luZm8gKmdwZV9ibG9jaywKKwkJCQkgdm9pZCAqY29udGV4dCk7CisKKyNpZmRlZglBQ1BJX0ZVVFVSRV9VU0FHRQorLyoKKyAqIGh3dGltZXIgLSBBQ1BJIFRpbWVyIHByb3RvdHlwZXMKKyAqLworYWNwaV9zdGF0dXMgYWNwaV9nZXRfdGltZXJfcmVzb2x1dGlvbih1MzIgKiByZXNvbHV0aW9uKTsKKworYWNwaV9zdGF0dXMgYWNwaV9nZXRfdGltZXIodTMyICogdGlja3MpOworCithY3BpX3N0YXR1cworYWNwaV9nZXRfdGltZXJfZHVyYXRpb24odTMyIHN0YXJ0X3RpY2tzLCB1MzIgZW5kX3RpY2tzLCB1MzIgKiB0aW1lX2VsYXBzZWQpOworI2VuZGlmCQkJCS8qIEFDUElfRlVUVVJFX1VTQUdFICovCisKKyNlbmRpZgkJCQkvKiBfX0FDSFdBUkVfSF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FjcGkvYWNpbnRlcnAuaCBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvYWNpbnRlcnAuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hY3BpL2FjaW50ZXJwLmgKcmVuYW1lIHRvIGRyaXZlcnMvYWNwaS9hY3BpY2EvYWNpbnRlcnAuaApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS9hY2xvY2FsLmggYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2FjbG9jYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTJkMDI3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS9hY2xvY2FsLmgKQEAgLTAsMCArMSw5OTAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBOYW1lOiBhY2xvY2FsLmggLSBJbnRlcm5hbCBkYXRhIHR5cGVzIHVzZWQgYWNyb3NzIHRoZSBBQ1BJIHN1YnN5c3RlbQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDgsIEludGVsIENvcnAuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCisgKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSBhdCBtaW5pbXVtIGEgZGlzY2xhaW1lcgorICogICAgc3Vic3RhbnRpYWxseSBzaW1pbGFyIHRvIHRoZSAiTk8gV0FSUkFOVFkiIGRpc2NsYWltZXIgYmVsb3cKKyAqICAgICgiRGlzY2xhaW1lciIpIGFuZCBhbnkgcmVkaXN0cmlidXRpb24gbXVzdCBiZSBjb25kaXRpb25lZCB1cG9uCisgKiAgICBpbmNsdWRpbmcgYSBzdWJzdGFudGlhbGx5IHNpbWlsYXIgRGlzY2xhaW1lciByZXF1aXJlbWVudCBmb3IgZnVydGhlcgorICogICAgYmluYXJ5IHJlZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzCisgKiAgICBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIE5PIFdBUlJBTlRZCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORworICogSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCisgKi8KKworI2lmbmRlZiBfX0FDTE9DQUxfSF9fCisjZGVmaW5lIF9fQUNMT0NBTF9IX18KKworLyogYWNwaXNyYzpzdHJ1Y3RfZGVmcyAtLSBmb3IgYWNwaXNyYyBjb252ZXJzaW9uICovCisKKyNkZWZpbmUgQUNQSV9TRVJJQUxJWkVEICAgICAgICAgICAgICAgICAweEZGCisKK3R5cGVkZWYgdTMyIGFjcGlfbXV0ZXhfaGFuZGxlOworI2RlZmluZSBBQ1BJX0dMT0JBTF9MT0NLICAgICAgICAgICAgICAgIChhY3BpX3NlbWFwaG9yZSkgKC0xKQorCisvKiBUb3RhbCBudW1iZXIgb2YgYW1sIG9wY29kZXMgZGVmaW5lZCAqLworCisjZGVmaW5lIEFNTF9OVU1fT1BDT0RFUyAgICAgICAgICAgICAgICAgMHg3RgorCisvKiBGb3J3YXJkIGRlY2xhcmF0aW9ucyAqLworCitzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlOworc3RydWN0IGFjcGlfb2JqX211dGV4OwordW5pb24gYWNwaV9wYXJzZV9vYmplY3Q7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIE11dGV4IHR5cGVkZWZzIGFuZCBzdHJ1Y3RzCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBQcmVkZWZpbmVkIGhhbmRsZXMgZm9yIHRoZSBtdXRleCBvYmplY3RzIHVzZWQgd2l0aGluIHRoZSBzdWJzeXN0ZW0KKyAqIEFsbCBtdXRleCBvYmplY3RzIGFyZSBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQgYnkgYWNwaV91dF9tdXRleF9pbml0aWFsaXplLgorICoKKyAqIFRoZSBhY3F1aXJlL3JlbGVhc2Ugb3JkZXJpbmcgcHJvdG9jb2wgaXMgaW1wbGllZCB2aWEgdGhpcyBsaXN0LiBNdXRleGVzCisgKiB3aXRoIGEgbG93ZXIgdmFsdWUgbXVzdCBiZSBhY3F1aXJlZCBiZWZvcmUgbXV0ZXhlcyB3aXRoIGEgaGlnaGVyIHZhbHVlLgorICoKKyAqIE5PVEU6IGFueSBjaGFuZ2VzIGhlcmUgbXVzdCBiZSByZWZsZWN0ZWQgaW4gdGhlIGFjcGlfZ2JsX211dGV4X25hbWVzCisgKiB0YWJsZSBiZWxvdyBhbHNvIQorICovCisjZGVmaW5lIEFDUElfTVRYX0lOVEVSUFJFVEVSICAgICAgICAgICAgMAkvKiBBTUwgSW50ZXJwcmV0ZXIsIG1haW4gbG9jayAqLworI2RlZmluZSBBQ1BJX01UWF9OQU1FU1BBQ0UgICAgICAgICAgICAgIDEJLyogQUNQSSBOYW1lc3BhY2UgKi8KKyNkZWZpbmUgQUNQSV9NVFhfVEFCTEVTICAgICAgICAgICAgICAgICAyCS8qIERhdGEgZm9yIEFDUEkgdGFibGVzICovCisjZGVmaW5lIEFDUElfTVRYX0VWRU5UUyAgICAgICAgICAgICAgICAgMwkvKiBEYXRhIGZvciBBQ1BJIGV2ZW50cyAqLworI2RlZmluZSBBQ1BJX01UWF9DQUNIRVMgICAgICAgICAgICAgICAgIDQJLyogSW50ZXJuYWwgY2FjaGVzLCBnZW5lcmFsIHB1cnBvc2VzICovCisjZGVmaW5lIEFDUElfTVRYX01FTU9SWSAgICAgICAgICAgICAgICAgNQkvKiBEZWJ1ZyBtZW1vcnkgdHJhY2tpbmcgbGlzdHMgKi8KKyNkZWZpbmUgQUNQSV9NVFhfREVCVUdfQ01EX0NPTVBMRVRFICAgICA2CS8qIEFNTCBkZWJ1Z2dlciAqLworI2RlZmluZSBBQ1BJX01UWF9ERUJVR19DTURfUkVBRFkgICAgICAgIDcJLyogQU1MIGRlYnVnZ2VyICovCisKKyNkZWZpbmUgQUNQSV9NQVhfTVVURVggICAgICAgICAgICAgICAgICA3CisjZGVmaW5lIEFDUElfTlVNX01VVEVYICAgICAgICAgICAgICAgICAgQUNQSV9NQVhfTVVURVgrMQorCisjaWYgZGVmaW5lZChBQ1BJX0RFQlVHX09VVFBVVCkgfHwgZGVmaW5lZChBQ1BJX0RFQlVHR0VSKQorI2lmZGVmIERFRklORV9BQ1BJX0dMT0JBTFMKKworLyogRGVidWcgbmFtZXMgZm9yIHRoZSBtdXRleGVzIGFib3ZlICovCisKK3N0YXRpYyBjaGFyICphY3BpX2dibF9tdXRleF9uYW1lc1tBQ1BJX05VTV9NVVRFWF0gPSB7CisJIkFDUElfTVRYX0ludGVycHJldGVyIiwKKwkiQUNQSV9NVFhfTmFtZXNwYWNlIiwKKwkiQUNQSV9NVFhfVGFibGVzIiwKKwkiQUNQSV9NVFhfRXZlbnRzIiwKKwkiQUNQSV9NVFhfQ2FjaGVzIiwKKwkiQUNQSV9NVFhfTWVtb3J5IiwKKwkiQUNQSV9NVFhfQ29tbWFuZENvbXBsZXRlIiwKKwkiQUNQSV9NVFhfQ29tbWFuZFJlYWR5IgorfTsKKworI2VuZGlmCisjZW5kaWYKKworLyoKKyAqIFByZWRlZmluZWQgaGFuZGxlcyBmb3Igc3BpbmxvY2tzIHVzZWQgd2l0aGluIHRoZSBzdWJzeXN0ZW0uCisgKiBUaGVzZSBzcGlubG9ja3MgYXJlIGNyZWF0ZWQgYnkgYWNwaV91dF9tdXRleF9pbml0aWFsaXplCisgKi8KKyNkZWZpbmUgQUNQSV9MT0NLX0dQRVMgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEFDUElfTE9DS19IQVJEV0FSRSAgICAgICAgICAgICAgMQorCisjZGVmaW5lIEFDUElfTUFYX0xPQ0sgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBBQ1BJX05VTV9MT0NLICAgICAgICAgICAgICAgICAgIEFDUElfTUFYX0xPQ0srMQorCisvKiBUaGlzIFRocmVhZCBJRCBtZWFucyB0aGF0IHRoZSBtdXRleCBpcyBub3QgaW4gdXNlICh1bmxvY2tlZCkgKi8KKworI2RlZmluZSBBQ1BJX01VVEVYX05PVF9BQ1FVSVJFRCAgICAgICAgIChhY3BpX3RocmVhZF9pZCkgMAorCisvKiBUYWJsZSBmb3IgdGhlIGdsb2JhbCBtdXRleGVzICovCisKK3N0cnVjdCBhY3BpX211dGV4X2luZm8geworCWFjcGlfbXV0ZXggbXV0ZXg7CisJdTMyIHVzZV9jb3VudDsKKwlhY3BpX3RocmVhZF9pZCB0aHJlYWRfaWQ7Cit9OworCisvKiBMb2NrIGZsYWcgcGFyYW1ldGVyIGZvciB2YXJpb3VzIGludGVyZmFjZXMgKi8KKworI2RlZmluZSBBQ1BJX01UWF9ET19OT1RfTE9DSyAgICAgICAgICAgIDAKKyNkZWZpbmUgQUNQSV9NVFhfTE9DSyAgICAgICAgICAgICAgICAgICAxCisKKy8qIEZpZWxkIGFjY2VzcyBncmFudWxhcml0aWVzICovCisKKyNkZWZpbmUgQUNQSV9GSUVMRF9CWVRFX0dSQU5VTEFSSVRZICAgICAxCisjZGVmaW5lIEFDUElfRklFTERfV09SRF9HUkFOVUxBUklUWSAgICAgMgorI2RlZmluZSBBQ1BJX0ZJRUxEX0RXT1JEX0dSQU5VTEFSSVRZICAgIDQKKyNkZWZpbmUgQUNQSV9GSUVMRF9RV09SRF9HUkFOVUxBUklUWSAgICA4CisKKyNkZWZpbmUgQUNQSV9FTlRSWV9OT1RfRk9VTkQgICAgICAgICAgICBOVUxMCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIE5hbWVzcGFjZSB0eXBlZGVmcyBhbmQgc3RydWN0cworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBPcGVyYXRpb25hbCBtb2RlcyBvZiB0aGUgQU1MIGludGVycHJldGVyL3NjYW5uZXIgKi8KKwordHlwZWRlZiBlbnVtIHsKKwlBQ1BJX0lNT0RFX0xPQURfUEFTUzEgPSAweDAxLAorCUFDUElfSU1PREVfTE9BRF9QQVNTMiA9IDB4MDIsCisJQUNQSV9JTU9ERV9FWEVDVVRFID0gMHgwMworfSBhY3BpX2ludGVycHJldGVyX21vZGU7CisKKy8qCisgKiBUaGUgTmFtZXNwYWNlIE5vZGUgZGVzY3JpYmVzIGEgbmFtZWQgb2JqZWN0IHRoYXQgYXBwZWFycyBpbiB0aGUgQU1MLgorICogZGVzY3JpcHRvcl90eXBlIGlzIHVzZWQgdG8gZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIGludGVybmFsIGRlc2NyaXB0b3JzLgorICoKKyAqIFRoZSBub2RlIGlzIG9wdGltaXplZCBmb3IgYm90aCAzMi1iaXQgYW5kIDY0LWJpdCBwbGF0Zm9ybXM6CisgKiAyMCBieXRlcyBmb3IgdGhlIDMyLWJpdCBjYXNlLCAzMiBieXRlcyBmb3IgdGhlIDY0LWJpdCBjYXNlLgorICoKKyAqIE5vdGU6IFRoZSBkZXNjcmlwdG9yX3R5cGUgYW5kIFR5cGUgZmllbGRzIG11c3QgYXBwZWFyIGluIHRoZSBpZGVudGljYWwKKyAqIHBvc2l0aW9uIGluIGJvdGggdGhlIHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlIGFuZCB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0CisgKiBzdHJ1Y3R1cmVzLgorICovCitzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSB7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqZWN0OwkvKiBJbnRlcnByZXRlciBvYmplY3QgKi8KKwl1OCBkZXNjcmlwdG9yX3R5cGU7CS8qIERpZmZlcmVudGlhdGUgb2JqZWN0IGRlc2NyaXB0b3IgdHlwZXMgKi8KKwl1OCB0eXBlOwkJLyogQUNQSSBUeXBlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG5hbWUgKi8KKwl1OCBmbGFnczsJCS8qIE1pc2NlbGxhbmVvdXMgZmxhZ3MgKi8KKwlhY3BpX293bmVyX2lkIG93bmVyX2lkOwkvKiBOb2RlIGNyZWF0b3IgKi8KKwl1bmlvbiBhY3BpX25hbWVfdW5pb24gbmFtZTsJLyogQUNQSSBOYW1lLCBhbHdheXMgNCBjaGFycyBwZXIgQUNQSSBzcGVjICovCisJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKmNoaWxkOwkvKiBGaXJzdCBjaGlsZCAqLworCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpwZWVyOwkvKiBQZWVyLiBQYXJlbnQgaWYgQU5PQkpfRU5EX09GX1BFRVJfTElTVCBzZXQgKi8KKworCS8qCisJICogVGhlIGZvbGxvd2luZyBmaWVsZHMgYXJlIHVzZWQgYnkgdGhlIEFTTCBjb21waWxlciBhbmQgZGlzYXNzZW1ibGVyIG9ubHkKKwkgKi8KKyNpZmRlZiBBQ1BJX0xBUkdFX05BTUVTUEFDRV9OT0RFCisJdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKm9wOworCXUzMiB2YWx1ZTsKKwl1MzIgbGVuZ3RoOworI2VuZGlmCit9OworCisvKiBOYW1lc3BhY2UgTm9kZSBmbGFncyAqLworCisjZGVmaW5lIEFOT0JKX0VORF9PRl9QRUVSX0xJU1QgICAgICAgICAgMHgwMQkvKiBFbmQtb2YtbGlzdCwgUGVlciBmaWVsZCBwb2ludHMgdG8gcGFyZW50ICovCisjZGVmaW5lIEFOT0JKX1RFTVBPUkFSWSAgICAgICAgICAgICAgICAgMHgwMgkvKiBOb2RlIGlzIGNyZWF0ZSBieSBhIG1ldGhvZCBhbmQgaXMgdGVtcG9yYXJ5ICovCisjZGVmaW5lIEFOT0JKX01FVEhPRF9BUkcgICAgICAgICAgICAgICAgMHgwNAkvKiBOb2RlIGlzIGEgbWV0aG9kIGFyZ3VtZW50ICovCisjZGVmaW5lIEFOT0JKX01FVEhPRF9MT0NBTCAgICAgICAgICAgICAgMHgwOAkvKiBOb2RlIGlzIGEgbWV0aG9kIGxvY2FsICovCisjZGVmaW5lIEFOT0JKX1NVQlRSRUVfSEFTX0lOSSAgICAgICAgICAgMHgxMAkvKiBVc2VkIHRvIG9wdGltaXplIGRldmljZSBpbml0aWFsaXphdGlvbiAqLworI2RlZmluZSBBTk9CSl9FVkFMVUFURUQgICAgICAgICAgICAgICAgIDB4MjAJLyogU2V0IG9uIGZpcnN0IGV2YWx1YXRpb24gb2Ygbm9kZSAqLworCisjZGVmaW5lIEFOT0JKX0lTX0VYVEVSTkFMICAgICAgICAgICAgICAgMHgwOAkvKiBpX2FTTCBvbmx5OiBUaGlzIG9iamVjdCBjcmVhdGVkIHZpYSBFeHRlcm5hbCgpICovCisjZGVmaW5lIEFOT0JKX01FVEhPRF9OT19SRVRWQUwgICAgICAgICAgMHgxMAkvKiBpX2FTTCBvbmx5OiBNZXRob2QgaGFzIG5vIHJldHVybiB2YWx1ZSAqLworI2RlZmluZSBBTk9CSl9NRVRIT0RfU09NRV9OT19SRVRWQUwgICAgIDB4MjAJLyogaV9hU0wgb25seTogTWV0aG9kIGhhcyBhdCBsZWFzdCBvbmUgcmV0dXJuIHZhbHVlICovCisjZGVmaW5lIEFOT0JKX0lTX0JJVF9PRkZTRVQgICAgICAgICAgICAgMHg0MAkvKiBpX2FTTCBvbmx5OiBSZWZlcmVuY2UgaXMgYSBiaXQgb2Zmc2V0ICovCisjZGVmaW5lIEFOT0JKX0lTX1JFRkVSRU5DRUQgICAgICAgICAgICAgMHg4MAkvKiBpX2FTTCBvbmx5OiBPYmplY3Qgd2FzIHJlZmVyZW5jZWQgKi8KKworLyogT25lIGludGVybmFsIFJTRFQgZm9yIHRhYmxlIG1hbmFnZW1lbnQgKi8KKworc3RydWN0IGFjcGlfaW50ZXJuYWxfcnNkdCB7CisJc3RydWN0IGFjcGlfdGFibGVfZGVzYyAqdGFibGVzOworCXUzMiBjb3VudDsKKwl1MzIgc2l6ZTsKKwl1OCBmbGFnczsKK307CisKKy8qIEZsYWdzIGZvciBhYm92ZSAqLworCisjZGVmaW5lIEFDUElfUk9PVF9PUklHSU5fVU5LTk9XTiAgICAgICAgKDApCS8qIH5PUklHSU5fQUxMT0NBVEVEICovCisjZGVmaW5lIEFDUElfUk9PVF9PUklHSU5fQUxMT0NBVEVEICAgICAgKDEpCisjZGVmaW5lIEFDUElfUk9PVF9BTExPV19SRVNJWkUgICAgICAgICAgKDIpCisKKy8qIFByZWRlZmluZWQgKGZpeGVkKSB0YWJsZSBpbmRleGVzICovCisKKyNkZWZpbmUgQUNQSV9UQUJMRV9JTkRFWF9EU0RUICAgICAgICAgICAoMCkKKyNkZWZpbmUgQUNQSV9UQUJMRV9JTkRFWF9GQUNTICAgICAgICAgICAoMSkKKworc3RydWN0IGFjcGlfZmluZF9jb250ZXh0IHsKKwljaGFyICpzZWFyY2hfZm9yOworCWFjcGlfaGFuZGxlICpsaXN0OworCXUzMiAqY291bnQ7Cit9OworCitzdHJ1Y3QgYWNwaV9uc19zZWFyY2hfZGF0YSB7CisJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGU7Cit9OworCisvKiBPYmplY3QgdHlwZXMgdXNlZCBkdXJpbmcgcGFja2FnZSBjb3BpZXMgKi8KKworI2RlZmluZSBBQ1BJX0NPUFlfVFlQRV9TSU1QTEUgICAgICAgICAgIDAKKyNkZWZpbmUgQUNQSV9DT1BZX1RZUEVfUEFDS0FHRSAgICAgICAgICAxCisKKy8qIEluZm8gc3RydWN0dXJlIHVzZWQgdG8gY29udmVydCBleHRlcm5hbDwtPmludGVybmFsIG5hbWVzdHJpbmdzICovCisKK3N0cnVjdCBhY3BpX25hbWVzdHJpbmdfaW5mbyB7CisJY29uc3QgY2hhciAqZXh0ZXJuYWxfbmFtZTsKKwljb25zdCBjaGFyICpuZXh0X2V4dGVybmFsX2NoYXI7CisJY2hhciAqaW50ZXJuYWxfbmFtZTsKKwl1MzIgbGVuZ3RoOworCXUzMiBudW1fc2VnbWVudHM7CisJdTMyIG51bV9jYXJhdHM7CisJdTggZnVsbHlfcXVhbGlmaWVkOworfTsKKworLyogRmllbGQgY3JlYXRpb24gaW5mbyAqLworCitzdHJ1Y3QgYWNwaV9jcmVhdGVfZmllbGRfaW5mbyB7CisJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKnJlZ2lvbl9ub2RlOworCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpmaWVsZF9ub2RlOworCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpyZWdpc3Rlcl9ub2RlOworCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpkYXRhX3JlZ2lzdGVyX25vZGU7CisJdTMyIGJhbmtfdmFsdWU7CisJdTMyIGZpZWxkX2JpdF9wb3NpdGlvbjsKKwl1MzIgZmllbGRfYml0X2xlbmd0aDsKKwl1OCBmaWVsZF9mbGFnczsKKwl1OCBhdHRyaWJ1dGU7CisJdTggZmllbGRfdHlwZTsKK307CisKK3R5cGVkZWYKK2FjcGlfc3RhdHVzKCpBQ1BJX0lOVEVSTkFMX01FVEhPRCkgKHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKiB3YWxrX3N0YXRlKTsKKworLyoKKyAqIEJpdG1hcHBlZCBBQ1BJIHR5cGVzLiAgVXNlZCBpbnRlcm5hbGx5IG9ubHkKKyAqLworI2RlZmluZSBBQ1BJX0JUWVBFX0FOWSAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgQUNQSV9CVFlQRV9JTlRFR0VSICAgICAgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIEFDUElfQlRZUEVfU1RSSU5HICAgICAgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBBQ1BJX0JUWVBFX0JVRkZFUiAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgQUNQSV9CVFlQRV9QQUNLQUdFICAgICAgICAgICAgICAweDAwMDAwMDA4CisjZGVmaW5lIEFDUElfQlRZUEVfRklFTERfVU5JVCAgICAgICAgICAgMHgwMDAwMDAxMAorI2RlZmluZSBBQ1BJX0JUWVBFX0RFVklDRSAgICAgICAgICAgICAgIDB4MDAwMDAwMjAKKyNkZWZpbmUgQUNQSV9CVFlQRV9FVkVOVCAgICAgICAgICAgICAgICAweDAwMDAwMDQwCisjZGVmaW5lIEFDUElfQlRZUEVfTUVUSE9EICAgICAgICAgICAgICAgMHgwMDAwMDA4MAorI2RlZmluZSBBQ1BJX0JUWVBFX01VVEVYICAgICAgICAgICAgICAgIDB4MDAwMDAxMDAKKyNkZWZpbmUgQUNQSV9CVFlQRV9SRUdJT04gICAgICAgICAgICAgICAweDAwMDAwMjAwCisjZGVmaW5lIEFDUElfQlRZUEVfUE9XRVIgICAgICAgICAgICAgICAgMHgwMDAwMDQwMAorI2RlZmluZSBBQ1BJX0JUWVBFX1BST0NFU1NPUiAgICAgICAgICAgIDB4MDAwMDA4MDAKKyNkZWZpbmUgQUNQSV9CVFlQRV9USEVSTUFMICAgICAgICAgICAgICAweDAwMDAxMDAwCisjZGVmaW5lIEFDUElfQlRZUEVfQlVGRkVSX0ZJRUxEICAgICAgICAgMHgwMDAwMjAwMAorI2RlZmluZSBBQ1BJX0JUWVBFX0REQl9IQU5ETEUgICAgICAgICAgIDB4MDAwMDQwMDAKKyNkZWZpbmUgQUNQSV9CVFlQRV9ERUJVR19PQkpFQ1QgICAgICAgICAweDAwMDA4MDAwCisjZGVmaW5lIEFDUElfQlRZUEVfUkVGRVJFTkNFICAgICAgICAgICAgMHgwMDAxMDAwMAorI2RlZmluZSBBQ1BJX0JUWVBFX1JFU09VUkNFICAgICAgICAgICAgIDB4MDAwMjAwMDAKKworI2RlZmluZSBBQ1BJX0JUWVBFX0NPTVBVVEVfREFUQSAgICAgICAgIChBQ1BJX0JUWVBFX0lOVEVHRVIgfCBBQ1BJX0JUWVBFX1NUUklORyB8IEFDUElfQlRZUEVfQlVGRkVSKQorCisjZGVmaW5lIEFDUElfQlRZUEVfREFUQSAgICAgICAgICAgICAgICAgKEFDUElfQlRZUEVfQ09NUFVURV9EQVRBICB8IEFDUElfQlRZUEVfUEFDS0FHRSkKKyNkZWZpbmUgQUNQSV9CVFlQRV9EQVRBX1JFRkVSRU5DRSAgICAgICAoQUNQSV9CVFlQRV9EQVRBIHwgQUNQSV9CVFlQRV9SRUZFUkVOQ0UgfCBBQ1BJX0JUWVBFX0REQl9IQU5ETEUpCisjZGVmaW5lIEFDUElfQlRZUEVfREVWSUNFX09CSkVDVFMgICAgICAgKEFDUElfQlRZUEVfREVWSUNFIHwgQUNQSV9CVFlQRV9USEVSTUFMIHwgQUNQSV9CVFlQRV9QUk9DRVNTT1IpCisjZGVmaW5lIEFDUElfQlRZUEVfT0JKRUNUU19BTkRfUkVGUyAgICAgMHgwMDAxRkZGRgkvKiBBUkcgb3IgTE9DQUwgKi8KKyNkZWZpbmUgQUNQSV9CVFlQRV9BTExfT0JKRUNUUyAgICAgICAgICAweDAwMDBGRkZGCisKKy8qCisgKiBJbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgZm9yIEFDUEkgcHJlZGVmaW5lZCBuYW1lcy4KKyAqIEVhY2ggZW50cnkgaW4gdGhlIHRhYmxlIGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgaXRlbXM6CisgKgorICogTmFtZSAgICAgICAgICAgICAgICAgLSBUaGUgQUNQSSByZXNlcnZlZCBuYW1lCisgKiBwYXJhbV9jb3VudCAgICAgICAgICAtIE51bWJlciBvZiBhcmd1bWVudHMgdG8gdGhlIG1ldGhvZAorICogZXhwZWN0ZWRfcmV0dXJuX2J0eXBlcyAtIEFsbG93ZWQgdHlwZShzKSBmb3IgdGhlIHJldHVybiB2YWx1ZQorICovCitzdHJ1Y3QgYWNwaV9uYW1lX2luZm8geworCWNoYXIgbmFtZVtBQ1BJX05BTUVfU0laRV07CisJdTggcGFyYW1fY291bnQ7CisJdTggZXhwZWN0ZWRfYnR5cGVzOworfTsKKworLyoKKyAqIFNlY29uZGFyeSBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmVzIGZvciBBQ1BJIHByZWRlZmluZWQgb2JqZWN0cyB0aGF0IHJldHVybgorICogcGFja2FnZSBvYmplY3RzLiBUaGlzIHN0cnVjdHVyZSBhcHBlYXJzIGFzIHRoZSBuZXh0IGVudHJ5IGluIHRoZSB0YWJsZQorICogYWZ0ZXIgdGhlIE5BTUVfSU5GTyBzdHJ1Y3R1cmUgYWJvdmUuCisgKgorICogVGhlIHJlYXNvbiBmb3IgdGhpcyBpcyB0byBtaW5pbWl6ZSB0aGUgc2l6ZSBvZiB0aGUgcHJlZGVmaW5lZCBuYW1lIHRhYmxlLgorICovCisKKy8qCisgKiBVc2VkIGZvciBBQ1BJX1BUWVBFMV9GSVhFRCwgQUNQSV9QVFlQRTFfVkFSLCBBQ1BJX1BUWVBFMiwKKyAqIEFDUElfUFRZUEUyX01JTiwgQUNQSV9QVFlQRTJfUEtHX0NPVU5ULCBBQ1BJX1BUWVBFMl9DT1VOVAorICovCitzdHJ1Y3QgYWNwaV9wYWNrYWdlX2luZm8geworCXU4IHR5cGU7CisJdTggb2JqZWN0X3R5cGUxOworCXU4IGNvdW50MTsKKwl1OCBvYmplY3RfdHlwZTI7CisJdTggY291bnQyOworCXU4IHJlc2VydmVkOworfTsKKworLyogVXNlZCBmb3IgQUNQSV9QVFlQRTJfRklYRUQgKi8KKworc3RydWN0IGFjcGlfcGFja2FnZV9pbmZvMiB7CisJdTggdHlwZTsKKwl1OCBjb3VudDsKKwl1OCBvYmplY3RfdHlwZVs0XTsKK307CisKKy8qIFVzZWQgZm9yIEFDUElfUFRZUEUxX09QVElPTiAqLworCitzdHJ1Y3QgYWNwaV9wYWNrYWdlX2luZm8zIHsKKwl1OCB0eXBlOworCXU4IGNvdW50OworCXU4IG9iamVjdF90eXBlWzJdOworCXU4IHRhaWxfb2JqZWN0X3R5cGU7CisJdTggcmVzZXJ2ZWQ7Cit9OworCit1bmlvbiBhY3BpX3ByZWRlZmluZWRfaW5mbyB7CisJc3RydWN0IGFjcGlfbmFtZV9pbmZvIGluZm87CisJc3RydWN0IGFjcGlfcGFja2FnZV9pbmZvIHJldF9pbmZvOworCXN0cnVjdCBhY3BpX3BhY2thZ2VfaW5mbzIgcmV0X2luZm8yOworCXN0cnVjdCBhY3BpX3BhY2thZ2VfaW5mbzMgcmV0X2luZm8zOworfTsKKworLyoKKyAqIEJpdG1hcHBlZCByZXR1cm4gdmFsdWUgdHlwZXMKKyAqIE5vdGU6IHRoZSBhY3R1YWwgZGF0YSB0eXBlcyBtdXN0IGJlIGNvbnRpZ3VvdXMsIGEgbG9vcCBpbiBuc3ByZWRlZi5jCisgKiBkZXBlbmRzIG9uIHRoaXMuCisgKi8KKyNkZWZpbmUgQUNQSV9SVFlQRV9BTlkgICAgICAgICAgICAgICAgICAweDAwCisjZGVmaW5lIEFDUElfUlRZUEVfTk9ORSAgICAgICAgICAgICAgICAgMHgwMQorI2RlZmluZSBBQ1BJX1JUWVBFX0lOVEVHRVIgICAgICAgICAgICAgIDB4MDIKKyNkZWZpbmUgQUNQSV9SVFlQRV9TVFJJTkcgICAgICAgICAgICAgICAweDA0CisjZGVmaW5lIEFDUElfUlRZUEVfQlVGRkVSICAgICAgICAgICAgICAgMHgwOAorI2RlZmluZSBBQ1BJX1JUWVBFX1BBQ0tBR0UgICAgICAgICAgICAgIDB4MTAKKyNkZWZpbmUgQUNQSV9SVFlQRV9SRUZFUkVOQ0UgICAgICAgICAgICAweDIwCisjZGVmaW5lIEFDUElfUlRZUEVfQUxMICAgICAgICAgICAgICAgICAgMHgzRgorCisjZGVmaW5lIEFDUElfTlVNX1JUWVBFUyAgICAgICAgICAgICAgICAgNQkvKiBOdW1iZXIgb2YgYWN0dWFsIG9iamVjdCB0eXBlcyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBFdmVudCB0eXBlZGVmcyBhbmQgc3RydWN0cworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBEaXNwYXRjaCBpbmZvIGZvciBlYWNoIEdQRSAtLSBlaXRoZXIgYSBtZXRob2Qgb3IgaGFuZGxlciwgY2Fubm90IGJlIGJvdGggKi8KKworc3RydWN0IGFjcGlfaGFuZGxlcl9pbmZvIHsKKwlhY3BpX2V2ZW50X2hhbmRsZXIgYWRkcmVzczsJLyogQWRkcmVzcyBvZiBoYW5kbGVyLCBpZiBhbnkgKi8KKwl2b2lkICpjb250ZXh0OwkJLyogQ29udGV4dCB0byBiZSBwYXNzZWQgdG8gaGFuZGxlciAqLworCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICptZXRob2Rfbm9kZTsJLyogTWV0aG9kIG5vZGUgZm9yIHRoaXMgR1BFIGxldmVsIChzYXZlZCkgKi8KK307CisKK3VuaW9uIGFjcGlfZ3BlX2Rpc3BhdGNoX2luZm8geworCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICptZXRob2Rfbm9kZTsJLyogTWV0aG9kIG5vZGUgZm9yIHRoaXMgR1BFIGxldmVsICovCisJc3RydWN0IGFjcGlfaGFuZGxlcl9pbmZvICpoYW5kbGVyOworfTsKKworLyoKKyAqIEluZm9ybWF0aW9uIGFib3V0IGEgR1BFLCBvbmUgcGVyIGVhY2ggR1BFIGluIGFuIGFycmF5LgorICogTk9URTogSW1wb3J0YW50IHRvIGtlZXAgdGhpcyBzdHJ1Y3QgYXMgc21hbGwgYXMgcG9zc2libGUuCisgKi8KK3N0cnVjdCBhY3BpX2dwZV9ldmVudF9pbmZvIHsKKwl1bmlvbiBhY3BpX2dwZV9kaXNwYXRjaF9pbmZvIGRpc3BhdGNoOwkvKiBFaXRoZXIgTWV0aG9kIG9yIEhhbmRsZXIgKi8KKwlzdHJ1Y3QgYWNwaV9ncGVfcmVnaXN0ZXJfaW5mbyAqcmVnaXN0ZXJfaW5mbzsJLyogQmFja3BvaW50ZXIgdG8gcmVnaXN0ZXIgaW5mbyAqLworCXU4IGZsYWdzOwkJLyogTWlzYyBpbmZvIGFib3V0IHRoaXMgR1BFICovCisJdTggZ3BlX251bWJlcjsJCS8qIFRoaXMgR1BFICovCit9OworCisvKiBJbmZvcm1hdGlvbiBhYm91dCBhIEdQRSByZWdpc3RlciBwYWlyLCBvbmUgcGVyIGVhY2ggc3RhdHVzL2VuYWJsZSBwYWlyIGluIGFuIGFycmF5ICovCisKK3N0cnVjdCBhY3BpX2dwZV9yZWdpc3Rlcl9pbmZvIHsKKwlzdHJ1Y3QgYWNwaV9nZW5lcmljX2FkZHJlc3Mgc3RhdHVzX2FkZHJlc3M7CS8qIEFkZHJlc3Mgb2Ygc3RhdHVzIHJlZyAqLworCXN0cnVjdCBhY3BpX2dlbmVyaWNfYWRkcmVzcyBlbmFibGVfYWRkcmVzczsJLyogQWRkcmVzcyBvZiBlbmFibGUgcmVnICovCisJdTggZW5hYmxlX2Zvcl93YWtlOwkvKiBHUEVzIHRvIGtlZXAgZW5hYmxlZCB3aGVuIHNsZWVwaW5nICovCisJdTggZW5hYmxlX2Zvcl9ydW47CS8qIEdQRXMgdG8ga2VlcCBlbmFibGVkIHdoZW4gcnVubmluZyAqLworCXU4IGJhc2VfZ3BlX251bWJlcjsJLyogQmFzZSBHUEUgbnVtYmVyIGZvciB0aGlzIHJlZ2lzdGVyICovCit9OworCisvKgorICogSW5mb3JtYXRpb24gYWJvdXQgYSBHUEUgcmVnaXN0ZXIgYmxvY2ssIG9uZSBwZXIgZWFjaCBpbnN0YWxsZWQgYmxvY2sgLS0KKyAqIEdQRTAsIEdQRTEsIGFuZCBvbmUgcGVyIGVhY2ggaW5zdGFsbGVkIEdQRSBCbG9jayBEZXZpY2UuCisgKi8KK3N0cnVjdCBhY3BpX2dwZV9ibG9ja19pbmZvIHsKKwlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZTsKKwlzdHJ1Y3QgYWNwaV9ncGVfYmxvY2tfaW5mbyAqcHJldmlvdXM7CisJc3RydWN0IGFjcGlfZ3BlX2Jsb2NrX2luZm8gKm5leHQ7CisJc3RydWN0IGFjcGlfZ3BlX3hydXB0X2luZm8gKnhydXB0X2Jsb2NrOwkvKiBCYWNrcG9pbnRlciB0byBpbnRlcnJ1cHQgYmxvY2sgKi8KKwlzdHJ1Y3QgYWNwaV9ncGVfcmVnaXN0ZXJfaW5mbyAqcmVnaXN0ZXJfaW5mbzsJLyogT25lIHBlciBHUEUgcmVnaXN0ZXIgcGFpciAqLworCXN0cnVjdCBhY3BpX2dwZV9ldmVudF9pbmZvICpldmVudF9pbmZvOwkvKiBPbmUgZm9yIGVhY2ggR1BFICovCisJc3RydWN0IGFjcGlfZ2VuZXJpY19hZGRyZXNzIGJsb2NrX2FkZHJlc3M7CS8qIEJhc2UgYWRkcmVzcyBvZiB0aGUgYmxvY2sgKi8KKwl1MzIgcmVnaXN0ZXJfY291bnQ7CS8qIE51bWJlciBvZiByZWdpc3RlciBwYWlycyBpbiBibG9jayAqLworCXU4IGJsb2NrX2Jhc2VfbnVtYmVyOwkvKiBCYXNlIEdQRSBudW1iZXIgZm9yIHRoaXMgYmxvY2sgKi8KK307CisKKy8qIEluZm9ybWF0aW9uIGFib3V0IEdQRSBpbnRlcnJ1cHQgaGFuZGxlcnMsIG9uZSBwZXIgZWFjaCBpbnRlcnJ1cHQgbGV2ZWwgdXNlZCBmb3IgR1BFcyAqLworCitzdHJ1Y3QgYWNwaV9ncGVfeHJ1cHRfaW5mbyB7CisJc3RydWN0IGFjcGlfZ3BlX3hydXB0X2luZm8gKnByZXZpb3VzOworCXN0cnVjdCBhY3BpX2dwZV94cnVwdF9pbmZvICpuZXh0OworCXN0cnVjdCBhY3BpX2dwZV9ibG9ja19pbmZvICpncGVfYmxvY2tfbGlzdF9oZWFkOwkvKiBMaXN0IG9mIEdQRSBibG9ja3MgZm9yIHRoaXMgeHJ1cHQgKi8KKwl1MzIgaW50ZXJydXB0X251bWJlcjsJLyogU3lzdGVtIGludGVycnVwdCBudW1iZXIgKi8KK307CisKK3N0cnVjdCBhY3BpX2dwZV93YWxrX2luZm8geworCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpncGVfZGV2aWNlOworCXN0cnVjdCBhY3BpX2dwZV9ibG9ja19pbmZvICpncGVfYmxvY2s7Cit9OworCitzdHJ1Y3QgYWNwaV9ncGVfZGV2aWNlX2luZm8geworCXUzMiBpbmRleDsKKwl1MzIgbmV4dF9ibG9ja19iYXNlX2luZGV4OworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqZ3BlX2RldmljZTsKK307CisKK3R5cGVkZWYgYWNwaV9zdGF0dXMoKmFjcGlfZ3BlX2NhbGxiYWNrKSAoc3RydWN0IGFjcGlfZ3BlX3hydXB0X2luZm8gKmdwZV94cnVwdF9pbmZvLAorCQlzdHJ1Y3QgYWNwaV9ncGVfYmxvY2tfaW5mbyAqZ3BlX2Jsb2NrLCB2b2lkICpjb250ZXh0KTsKKworLyogSW5mb3JtYXRpb24gYWJvdXQgZWFjaCBwYXJ0aWN1bGFyIGZpeGVkIGV2ZW50ICovCisKK3N0cnVjdCBhY3BpX2ZpeGVkX2V2ZW50X2hhbmRsZXIgeworCWFjcGlfZXZlbnRfaGFuZGxlciBoYW5kbGVyOwkvKiBBZGRyZXNzIG9mIGhhbmRsZXIuICovCisJdm9pZCAqY29udGV4dDsJCS8qIENvbnRleHQgdG8gYmUgcGFzc2VkIHRvIGhhbmRsZXIgKi8KK307CisKK3N0cnVjdCBhY3BpX2ZpeGVkX2V2ZW50X2luZm8geworCXU4IHN0YXR1c19yZWdpc3Rlcl9pZDsKKwl1OCBlbmFibGVfcmVnaXN0ZXJfaWQ7CisJdTE2IHN0YXR1c19iaXRfbWFzazsKKwl1MTYgZW5hYmxlX2JpdF9tYXNrOworfTsKKworLyogSW5mb3JtYXRpb24gdXNlZCBkdXJpbmcgZmllbGQgcHJvY2Vzc2luZyAqLworCitzdHJ1Y3QgYWNwaV9maWVsZF9pbmZvIHsKKwl1OCBza2lwX2ZpZWxkOworCXU4IGZpZWxkX2ZsYWc7CisJdTMyIHBrZ19sZW5ndGg7Cit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBHZW5lcmljICJzdGF0ZSIgb2JqZWN0IGZvciBzdGFja3MKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBBQ1BJX0NPTlRST0xfTk9STUFMICAgICAgICAgICAgICAgICAgMHhDMAorI2RlZmluZSBBQ1BJX0NPTlRST0xfQ09ORElUSU9OQUxfRVhFQ1VUSU5HICAgMHhDMQorI2RlZmluZSBBQ1BJX0NPTlRST0xfUFJFRElDQVRFX0VYRUNVVElORyAgICAgMHhDMgorI2RlZmluZSBBQ1BJX0NPTlRST0xfUFJFRElDQVRFX0ZBTFNFICAgICAgICAgMHhDMworI2RlZmluZSBBQ1BJX0NPTlRST0xfUFJFRElDQVRFX1RSVUUgICAgICAgICAgMHhDNAorCisjZGVmaW5lIEFDUElfU1RBVEVfQ09NTU9OIFwKKwl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZXh0OyBcCisJdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yX3R5cGU7IC8qIFRvIGRpZmZlcmVudGlhdGUgdmFyaW91cyBpbnRlcm5hbCBvYmpzICovXAorCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3M7IFwKKwl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOyBcCisJdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZTsKKworCS8qIFRoZXJlIGFyZSAyIGJ5dGVzIGF2YWlsYWJsZSBoZXJlIHVudGlsIHRoZSBuZXh0IG5hdHVyYWwgYWxpZ25tZW50IGJvdW5kYXJ5ICovCisKK3N0cnVjdCBhY3BpX2NvbW1vbl9zdGF0ZSB7CitBQ1BJX1NUQVRFX0NPTU1PTn07CisKKy8qCisgKiBVcGRhdGUgc3RhdGUgLSB1c2VkIHRvIHRyYXZlcnNlIGNvbXBsZXggb2JqZWN0cyBzdWNoIGFzIHBhY2thZ2VzCisgKi8KK3N0cnVjdCBhY3BpX3VwZGF0ZV9zdGF0ZSB7CisJQUNQSV9TVEFURV9DT01NT04gdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqZWN0OworfTsKKworLyoKKyAqIFBrZyBzdGF0ZSAtIHVzZWQgdG8gdHJhdmVyc2UgbmVzdGVkIHBhY2thZ2Ugc3RydWN0dXJlcworICovCitzdHJ1Y3QgYWNwaV9wa2dfc3RhdGUgeworCUFDUElfU1RBVEVfQ09NTU9OIHUxNiBpbmRleDsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpzb3VyY2Vfb2JqZWN0OworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKmRlc3Rfb2JqZWN0OworCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGU7CisJdm9pZCAqdGhpc190YXJnZXRfb2JqOworCXUzMiBudW1fcGFja2FnZXM7Cit9OworCisvKgorICogQ29udHJvbCBzdGF0ZSAtIG9uZSBwZXIgaWYvZWxzZSBhbmQgd2hpbGUgY29uc3RydWN0cy4KKyAqIEFsbG93cyBuZXN0aW5nIG9mIHRoZXNlIGNvbnN0cnVjdHMKKyAqLworc3RydWN0IGFjcGlfY29udHJvbF9zdGF0ZSB7CisJQUNQSV9TVEFURV9DT01NT04gdTE2IG9wY29kZTsKKwl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqcHJlZGljYXRlX29wOworCXU4ICphbWxfcHJlZGljYXRlX3N0YXJ0OwkvKiBTdGFydCBvZiBpZi93aGlsZSBwcmVkaWNhdGUgKi8KKwl1OCAqcGFja2FnZV9lbmQ7CS8qIEVuZCBvZiBpZi93aGlsZSBibG9jayAqLworCXUzMiBsb29wX2NvdW50OwkJLyogV2hpbGUoKSBsb29wIGNvdW50ZXIgKi8KK307CisKKy8qCisgKiBTY29wZSBzdGF0ZSAtIGN1cnJlbnQgc2NvcGUgZHVyaW5nIG5hbWVzcGFjZSBsb29rdXBzCisgKi8KK3N0cnVjdCBhY3BpX3Njb3BlX3N0YXRlIHsKKwlBQ1BJX1NUQVRFX0NPTU1PTiBzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZTsKK307CisKK3N0cnVjdCBhY3BpX3BzY29wZV9zdGF0ZSB7CisJQUNQSV9TVEFURV9DT01NT04gdTMyIGFyZ19jb3VudDsJLyogTnVtYmVyIG9mIGZpeGVkIGFyZ3VtZW50cyAqLworCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpvcDsJLyogQ3VycmVudCBvcCBiZWluZyBwYXJzZWQgKi8KKwl1OCAqYXJnX2VuZDsJCS8qIEN1cnJlbnQgYXJndW1lbnQgZW5kICovCisJdTggKnBrZ19lbmQ7CQkvKiBDdXJyZW50IHBhY2thZ2UgZW5kICovCisJdTMyIGFyZ19saXN0OwkJLyogTmV4dCBhcmd1bWVudCB0byBwYXJzZSAqLworfTsKKworLyoKKyAqIFRocmVhZCBzdGF0ZSAtIG9uZSBwZXIgdGhyZWFkIGFjcm9zcyBtdWx0aXBsZSB3YWxrIHN0YXRlcy4gIE11bHRpcGxlIHdhbGsKKyAqIHN0YXRlcyBhcmUgY3JlYXRlZCB3aGVuIHRoZXJlIGFyZSBuZXN0ZWQgY29udHJvbCBtZXRob2RzIGV4ZWN1dGluZy4KKyAqLworc3RydWN0IGFjcGlfdGhyZWFkX3N0YXRlIHsKKwlBQ1BJX1NUQVRFX0NPTU1PTiB1OCBjdXJyZW50X3N5bmNfbGV2ZWw7CS8qIE11dGV4IFN5bmMgKG5lc3RlZCBhY3F1aXJlKSBsZXZlbCAqLworCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGVfbGlzdDsJLyogSGVhZCBvZiBsaXN0IG9mIHdhbGtfc3RhdGVzIGZvciB0aGlzIHRocmVhZCAqLworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKmFjcXVpcmVkX211dGV4X2xpc3Q7CS8qIExpc3Qgb2YgYWxsIGN1cnJlbnRseSBhY3F1aXJlZCBtdXRleGVzICovCisJYWNwaV90aHJlYWRfaWQgdGhyZWFkX2lkOwkvKiBSdW5uaW5nIHRocmVhZCBJRCAqLworfTsKKworLyoKKyAqIFJlc3VsdCB2YWx1ZXMgLSB1c2VkIHRvIGFjY3VtdWxhdGUgdGhlIHJlc3VsdHMgb2YgbmVzdGVkCisgKiBBTUwgYXJndW1lbnRzCisgKi8KK3N0cnVjdCBhY3BpX3Jlc3VsdF92YWx1ZXMgeworCUFDUElfU1RBVEVfQ09NTU9OCisJICAgIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjW0FDUElfUkVTVUxUU19GUkFNRV9PQkpfTlVNXTsKK307CisKK3R5cGVkZWYKK2FjcGlfc3RhdHVzKCphY3BpX3BhcnNlX2Rvd253YXJkcykgKHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKiB3YWxrX3N0YXRlLAorCQkJCSAgICB1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqKiBvdXRfb3ApOworCit0eXBlZGVmIGFjcGlfc3RhdHVzKCphY3BpX3BhcnNlX3Vwd2FyZHMpIChzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICogd2Fsa19zdGF0ZSk7CisKKy8qCisgKiBOb3RpZnkgaW5mbyAtIHVzZWQgdG8gcGFzcyBpbmZvIHRvIHRoZSBkZWZlcnJlZCBub3RpZnkKKyAqIGhhbmRsZXIvZGlzcGF0Y2hlci4KKyAqLworc3RydWN0IGFjcGlfbm90aWZ5X2luZm8geworCUFDUElfU1RBVEVfQ09NTU9OIHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlOworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKmhhbmRsZXJfb2JqOworfTsKKworLyogR2VuZXJpYyBzdGF0ZSBpcyB1bmlvbiBvZiBzdHJ1Y3RzIGFib3ZlICovCisKK3VuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSB7CisJc3RydWN0IGFjcGlfY29tbW9uX3N0YXRlIGNvbW1vbjsKKwlzdHJ1Y3QgYWNwaV9jb250cm9sX3N0YXRlIGNvbnRyb2w7CisJc3RydWN0IGFjcGlfdXBkYXRlX3N0YXRlIHVwZGF0ZTsKKwlzdHJ1Y3QgYWNwaV9zY29wZV9zdGF0ZSBzY29wZTsKKwlzdHJ1Y3QgYWNwaV9wc2NvcGVfc3RhdGUgcGFyc2Vfc2NvcGU7CisJc3RydWN0IGFjcGlfcGtnX3N0YXRlIHBrZzsKKwlzdHJ1Y3QgYWNwaV90aHJlYWRfc3RhdGUgdGhyZWFkOworCXN0cnVjdCBhY3BpX3Jlc3VsdF92YWx1ZXMgcmVzdWx0czsKKwlzdHJ1Y3QgYWNwaV9ub3RpZnlfaW5mbyBub3RpZnk7Cit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBJbnRlcnByZXRlciB0eXBlZGVmcyBhbmQgc3RydWN0cworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit0eXBlZGVmIGFjcGlfc3RhdHVzKCpBQ1BJX0VYRUNVVEVfT1ApIChzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICogd2Fsa19zdGF0ZSk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIFBhcnNlciB0eXBlZGVmcyBhbmQgc3RydWN0cworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogQU1MIG9wY29kZSwgbmFtZSwgYW5kIGFyZ3VtZW50IGxheW91dAorICovCitzdHJ1Y3QgYWNwaV9vcGNvZGVfaW5mbyB7CisjaWYgZGVmaW5lZChBQ1BJX0RJU0FTU0VNQkxFUikgfHwgZGVmaW5lZChBQ1BJX0RFQlVHX09VVFBVVCkKKwljaGFyICpuYW1lOwkJLyogT3Bjb2RlIG5hbWUgKGRpc2Fzc2VtYmxlci9kZWJ1ZyBvbmx5KSAqLworI2VuZGlmCisJdTMyIHBhcnNlX2FyZ3M7CQkvKiBHcmFtbWFyL1BhcnNlIHRpbWUgYXJndW1lbnRzICovCisJdTMyIHJ1bnRpbWVfYXJnczsJLyogSW50ZXJwcmV0IHRpbWUgYXJndW1lbnRzICovCisJdTE2IGZsYWdzOwkJLyogTWlzYyBmbGFncyAqLworCXU4IG9iamVjdF90eXBlOwkJLyogQ29ycmVzcG9uZGluZyBpbnRlcm5hbCBvYmplY3QgdHlwZSAqLworCXU4IGNsYXNzOwkJLyogT3Bjb2RlIGNsYXNzICovCisJdTggdHlwZTsJCS8qIE9wY29kZSB0eXBlICovCit9OworCit1bmlvbiBhY3BpX3BhcnNlX3ZhbHVlIHsKKwlhY3BpX2ludGVnZXIgaW50ZWdlcjsJLyogSW50ZWdlciBjb25zdGFudCAoVXAgdG8gNjQgYml0cykgKi8KKwlzdHJ1Y3QgdWludDY0X3N0cnVjdCBpbnRlZ2VyNjQ7CS8qIFN0cnVjdHVyZSBvdmVybGF5IGZvciAyIDMyLWJpdCBEd29yZHMgKi8KKwl1MzIgc2l6ZTsJCS8qIGJ5dGVsaXN0IG9yIGZpZWxkIHNpemUgKi8KKwljaGFyICpzdHJpbmc7CQkvKiBOVUxMIHRlcm1pbmF0ZWQgc3RyaW5nICovCisJdTggKmJ1ZmZlcjsJCS8qIGJ1ZmZlciBvciBzdHJpbmcgKi8KKwljaGFyICpuYW1lOwkJLyogTlVMTCB0ZXJtaW5hdGVkIHN0cmluZyAqLworCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICphcmc7CS8qIGFyZ3VtZW50cyBhbmQgY29udGFpbmVkIG9wcyAqLworfTsKKworI2lmZGVmIEFDUElfRElTQVNTRU1CTEVSCisjZGVmaW5lIEFDUElfRElTQVNNX09OTFlfTUVNQkVSUyhhKSAgICAgYTsKKyNlbHNlCisjZGVmaW5lIEFDUElfRElTQVNNX09OTFlfTUVNQkVSUyhhKQorI2VuZGlmCisKKyNkZWZpbmUgQUNQSV9QQVJTRV9DT01NT04gXAorCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKnBhcmVudDsgICAgICAgIC8qIFBhcmVudCBvcCAqL1wKKwl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JfdHlwZTsgLyogVG8gZGlmZmVyZW50aWF0ZSB2YXJpb3VzIGludGVybmFsIG9ianMgKi9cCisJdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFnczsgICAgICAgICAgLyogVHlwZSBvZiBPcCAqL1wKKwl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFtbF9vcGNvZGU7ICAgICAvKiBBTUwgb3Bjb2RlICovXAorCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW1sX29mZnNldDsgICAgIC8qIE9mZnNldCBvZiBkZWNsYXJhdGlvbiBpbiBBTUwgKi9cCisJdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqbmV4dDsgICAgICAgICAgLyogTmV4dCBvcCAqL1wKKwlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpub2RlOyAgICAgICAgICAvKiBGb3IgdXNlIGJ5IGludGVycHJldGVyICovXAorCXVuaW9uIGFjcGlfcGFyc2VfdmFsdWUgICAgICAgICAgdmFsdWU7ICAgICAgICAgIC8qIFZhbHVlIG9yIGFyZ3MgYXNzb2NpYXRlZCB3aXRoIHRoZSBvcGNvZGUgKi9cCisJdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdfbGlzdF9sZW5ndGg7IC8qIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgYXJnIGxpc3QgKi9cCisJQUNQSV9ESVNBU01fT05MWV9NRU1CRVJTIChcCisJdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNhc21fZmxhZ3M7ICAgLyogVXNlZCBkdXJpbmcgQU1MIGRpc2Fzc2VtYmx5ICovXAorCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzYXNtX29wY29kZTsgIC8qIFN1YnR5cGUgdXNlZCBmb3IgZGlzYXNzZW1ibHkgKi9cCisJY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbWxfb3BfbmFtZVsxNl0pCS8qIE9wIG5hbWUgKGRlYnVnIG9ubHkpICovCisKKyNkZWZpbmUgQUNQSV9EQVNNX0JVRkZFUiAgICAgICAgICAgICAgICAweDAwCisjZGVmaW5lIEFDUElfREFTTV9SRVNPVVJDRSAgICAgICAgICAgICAgMHgwMQorI2RlZmluZSBBQ1BJX0RBU01fU1RSSU5HICAgICAgICAgICAgICAgIDB4MDIKKyNkZWZpbmUgQUNQSV9EQVNNX1VOSUNPREUgICAgICAgICAgICAgICAweDAzCisjZGVmaW5lIEFDUElfREFTTV9FSVNBSUQgICAgICAgICAgICAgICAgMHgwNAorI2RlZmluZSBBQ1BJX0RBU01fTUFUQ0hPUCAgICAgICAgICAgICAgIDB4MDUKKyNkZWZpbmUgQUNQSV9EQVNNX0xOT1RfUFJFRklYICAgICAgICAgICAweDA2CisjZGVmaW5lIEFDUElfREFTTV9MTk9UX1NVRkZJWCAgICAgICAgICAgMHgwNworI2RlZmluZSBBQ1BJX0RBU01fSUdOT1JFICAgICAgICAgICAgICAgIDB4MDgKKworLyoKKyAqIEdlbmVyaWMgb3BlcmF0aW9uIChmb3IgZXhhbXBsZTogIElmLCBXaGlsZSwgU3RvcmUpCisgKi8KK3N0cnVjdCBhY3BpX3BhcnNlX29ial9jb21tb24geworQUNQSV9QQVJTRV9DT01NT059OworCisvKgorICogRXh0ZW5kZWQgT3AgZm9yIG5hbWVkIG9wcyAoU2NvcGUsIE1ldGhvZCwgZXRjLiksIGRlZmVycmVkIG9wcyAoTWV0aG9kcyBhbmQgb3BfcmVnaW9ucyksCisgKiBhbmQgYnl0ZWxpc3RzLgorICovCitzdHJ1Y3QgYWNwaV9wYXJzZV9vYmpfbmFtZWQgeworCUFDUElfUEFSU0VfQ09NTU9OIHU4ICpwYXRoOworCXU4ICpkYXRhOwkJLyogQU1MIGJvZHkgb3IgYnl0ZWxpc3QgZGF0YSAqLworCXUzMiBsZW5ndGg7CQkvKiBBTUwgbGVuZ3RoICovCisJdTMyIG5hbWU7CQkvKiA0LWJ5dGUgbmFtZSBvciB6ZXJvIGlmIG5vIG5hbWUgKi8KK307CisKKy8qIFRoaXMgdmVyc2lvbiBpcyB1c2VkIGJ5IHRoZSBpX2FTTCBjb21waWxlciBvbmx5ICovCisKKyNkZWZpbmUgQUNQSV9NQVhfUEFSU0VPUF9OQU1FICAgMjAKKworc3RydWN0IGFjcGlfcGFyc2Vfb2JqX2FzbCB7CisJQUNQSV9QQVJTRV9DT01NT04gdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKmNoaWxkOworCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpwYXJlbnRfbWV0aG9kOworCWNoYXIgKmZpbGVuYW1lOworCWNoYXIgKmV4dGVybmFsX25hbWU7CisJY2hhciAqbmFtZXBhdGg7CisJY2hhciBuYW1lX3NlZ1s0XTsKKwl1MzIgZXh0cmFfdmFsdWU7CisJdTMyIGNvbHVtbjsKKwl1MzIgbGluZV9udW1iZXI7CisJdTMyIGxvZ2ljYWxfbGluZV9udW1iZXI7CisJdTMyIGxvZ2ljYWxfYnl0ZV9vZmZzZXQ7CisJdTMyIGVuZF9saW5lOworCXUzMiBlbmRfbG9naWNhbF9saW5lOworCXUzMiBhY3BpX2J0eXBlOworCXUzMiBhbWxfbGVuZ3RoOworCXUzMiBhbWxfc3VidHJlZV9sZW5ndGg7CisJdTMyIGZpbmFsX2FtbF9sZW5ndGg7CisJdTMyIGZpbmFsX2FtbF9vZmZzZXQ7CisJdTMyIGNvbXBpbGVfZmxhZ3M7CisJdTE2IHBhcnNlX29wY29kZTsKKwl1OCBhbWxfb3Bjb2RlX2xlbmd0aDsKKwl1OCBhbWxfcGtnX2xlbl9ieXRlczsKKwl1OCBleHRyYTsKKwljaGFyIHBhcnNlX29wX25hbWVbQUNQSV9NQVhfUEFSU0VPUF9OQU1FXTsKK307CisKK3VuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0IHsKKwlzdHJ1Y3QgYWNwaV9wYXJzZV9vYmpfY29tbW9uIGNvbW1vbjsKKwlzdHJ1Y3QgYWNwaV9wYXJzZV9vYmpfbmFtZWQgbmFtZWQ7CisJc3RydWN0IGFjcGlfcGFyc2Vfb2JqX2FzbCBhc2w7Cit9OworCisvKgorICogUGFyc2Ugc3RhdGUgLSBvbmUgc3RhdGUgcGVyIHBhcnNlciBpbnZvY2F0aW9uIGFuZCBlYWNoIGNvbnRyb2wKKyAqIG1ldGhvZC4KKyAqLworc3RydWN0IGFjcGlfcGFyc2Vfc3RhdGUgeworCXU4ICphbWxfc3RhcnQ7CQkvKiBGaXJzdCBBTUwgYnl0ZSAqLworCXU4ICphbWw7CQkvKiBOZXh0IEFNTCBieXRlICovCisJdTggKmFtbF9lbmQ7CQkvKiAobGFzdCArIDEpIEFNTCBieXRlICovCisJdTggKnBrZ19zdGFydDsJCS8qIEN1cnJlbnQgcGFja2FnZSBiZWdpbiAqLworCXU4ICpwa2dfZW5kOwkJLyogQ3VycmVudCBwYWNrYWdlIGVuZCAqLworCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpzdGFydF9vcDsJLyogUm9vdCBvZiBwYXJzZSB0cmVlICovCisJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKnN0YXJ0X25vZGU7CisJdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICpzY29wZTsJLyogQ3VycmVudCBzY29wZSAqLworCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpzdGFydF9zY29wZTsKKwl1MzIgYW1sX3NpemU7Cit9OworCisvKiBQYXJzZSBvYmplY3QgZmxhZ3MgKi8KKworI2RlZmluZSBBQ1BJX1BBUlNFT1BfR0VORVJJQyAgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgQUNQSV9QQVJTRU9QX05BTUVEICAgICAgICAgICAgICAweDAyCisjZGVmaW5lIEFDUElfUEFSU0VPUF9ERUZFUlJFRCAgICAgICAgICAgMHgwNAorI2RlZmluZSBBQ1BJX1BBUlNFT1BfQllURUxJU1QgICAgICAgICAgIDB4MDgKKyNkZWZpbmUgQUNQSV9QQVJTRU9QX0lOX1NUQUNLICAgICAgICAgICAweDEwCisjZGVmaW5lIEFDUElfUEFSU0VPUF9UQVJHRVQgICAgICAgICAgICAgMHgyMAorI2RlZmluZSBBQ1BJX1BBUlNFT1BfSU5fQ0FDSEUgICAgICAgICAgIDB4ODAKKworLyogUGFyc2Ugb2JqZWN0IGRpc2FzbV9mbGFncyAqLworCisjZGVmaW5lIEFDUElfUEFSU0VPUF9JR05PUkUgICAgICAgICAgICAgMHgwMQorI2RlZmluZSBBQ1BJX1BBUlNFT1BfUEFSQU1MSVNUICAgICAgICAgIDB4MDIKKyNkZWZpbmUgQUNQSV9QQVJTRU9QX0VNUFRZX1RFUk1MSVNUICAgICAweDA0CisjZGVmaW5lIEFDUElfUEFSU0VPUF9TUEVDSUFMICAgICAgICAgICAgMHgxMAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBIYXJkd2FyZSAoQUNQSSByZWdpc3RlcnMpIGFuZCBQTlAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RydWN0IGFjcGlfYml0X3JlZ2lzdGVyX2luZm8geworCXU4IHBhcmVudF9yZWdpc3RlcjsKKwl1OCBiaXRfcG9zaXRpb247CisJdTE2IGFjY2Vzc19iaXRfbWFzazsKK307CisKKy8qCisgKiBTb21lIEFDUEkgcmVnaXN0ZXJzIGhhdmUgYml0cyB0aGF0IG11c3QgYmUgaWdub3JlZCAtLSBtZWFuaW5nIHRoYXQgdGhleQorICogbXVzdCBiZSBwcmVzZXJ2ZWQuCisgKi8KKyNkZWZpbmUgQUNQSV9QTTFfU1RBVFVTX1BSRVNFUlZFRF9CSVRTICAgICAgICAgIDB4MDgwMAkvKiBCaXQgMTEgKi8KKyNkZWZpbmUgQUNQSV9QTTFfQ09OVFJPTF9QUkVTRVJWRURfQklUUyAgICAgICAgIDB4MDIwMAkvKiBCaXQgOSAod2hhdGV2ZXIpICovCisKKy8qCisgKiBSZWdpc3RlciBJRHMKKyAqIFRoZXNlIGFyZSB0aGUgZnVsbCBBQ1BJIHJlZ2lzdGVycworICovCisjZGVmaW5lIEFDUElfUkVHSVNURVJfUE0xX1NUQVRVUyAgICAgICAgICAgICAgICAweDAxCisjZGVmaW5lIEFDUElfUkVHSVNURVJfUE0xX0VOQUJMRSAgICAgICAgICAgICAgICAweDAyCisjZGVmaW5lIEFDUElfUkVHSVNURVJfUE0xX0NPTlRST0wgICAgICAgICAgICAgICAweDAzCisjZGVmaW5lIEFDUElfUkVHSVNURVJfUE0xQV9DT05UUk9MICAgICAgICAgICAgICAweDA0CisjZGVmaW5lIEFDUElfUkVHSVNURVJfUE0xQl9DT05UUk9MICAgICAgICAgICAgICAweDA1CisjZGVmaW5lIEFDUElfUkVHSVNURVJfUE0yX0NPTlRST0wgICAgICAgICAgICAgICAweDA2CisjZGVmaW5lIEFDUElfUkVHSVNURVJfUE1fVElNRVIgICAgICAgICAgICAgICAgICAweDA3CisjZGVmaW5lIEFDUElfUkVHSVNURVJfUFJPQ0VTU09SX0JMT0NLICAgICAgICAgICAweDA4CisjZGVmaW5lIEFDUElfUkVHSVNURVJfU01JX0NPTU1BTkRfQkxPQ0sgICAgICAgICAweDA5CisKKy8qIE1hc2tzIHVzZWQgdG8gYWNjZXNzIHRoZSBiaXRfcmVnaXN0ZXJzICovCisKKyNkZWZpbmUgQUNQSV9CSVRNQVNLX1RJTUVSX1NUQVRVUyAgICAgICAgICAgICAgIDB4MDAwMQorI2RlZmluZSBBQ1BJX0JJVE1BU0tfQlVTX01BU1RFUl9TVEFUVVMgICAgICAgICAgMHgwMDEwCisjZGVmaW5lIEFDUElfQklUTUFTS19HTE9CQUxfTE9DS19TVEFUVVMgICAgICAgICAweDAwMjAKKyNkZWZpbmUgQUNQSV9CSVRNQVNLX1BPV0VSX0JVVFRPTl9TVEFUVVMgICAgICAgIDB4MDEwMAorI2RlZmluZSBBQ1BJX0JJVE1BU0tfU0xFRVBfQlVUVE9OX1NUQVRVUyAgICAgICAgMHgwMjAwCisjZGVmaW5lIEFDUElfQklUTUFTS19SVF9DTE9DS19TVEFUVVMgICAgICAgICAgICAweDA0MDAKKyNkZWZpbmUgQUNQSV9CSVRNQVNLX1BDSUVYUF9XQUtFX1NUQVRVUyAgICAgICAgIDB4NDAwMAkvKiBBQ1BJIDMuMCAqLworI2RlZmluZSBBQ1BJX0JJVE1BU0tfV0FLRV9TVEFUVVMgICAgICAgICAgICAgICAgMHg4MDAwCisKKyNkZWZpbmUgQUNQSV9CSVRNQVNLX0FMTF9GSVhFRF9TVEFUVVMgICAgICAgICAgIChcCisJQUNQSV9CSVRNQVNLX1RJTUVSX1NUQVRVUyAgICAgICAgICB8IFwKKwlBQ1BJX0JJVE1BU0tfQlVTX01BU1RFUl9TVEFUVVMgICAgIHwgXAorCUFDUElfQklUTUFTS19HTE9CQUxfTE9DS19TVEFUVVMgICAgfCBcCisJQUNQSV9CSVRNQVNLX1BPV0VSX0JVVFRPTl9TVEFUVVMgICB8IFwKKwlBQ1BJX0JJVE1BU0tfU0xFRVBfQlVUVE9OX1NUQVRVUyAgIHwgXAorCUFDUElfQklUTUFTS19SVF9DTE9DS19TVEFUVVMgICAgICAgfCBcCisJQUNQSV9CSVRNQVNLX1dBS0VfU1RBVFVTKQorCisjZGVmaW5lIEFDUElfQklUTUFTS19USU1FUl9FTkFCTEUgICAgICAgICAgICAgICAweDAwMDEKKyNkZWZpbmUgQUNQSV9CSVRNQVNLX0dMT0JBTF9MT0NLX0VOQUJMRSAgICAgICAgIDB4MDAyMAorI2RlZmluZSBBQ1BJX0JJVE1BU0tfUE9XRVJfQlVUVE9OX0VOQUJMRSAgICAgICAgMHgwMTAwCisjZGVmaW5lIEFDUElfQklUTUFTS19TTEVFUF9CVVRUT05fRU5BQkxFICAgICAgICAweDAyMDAKKyNkZWZpbmUgQUNQSV9CSVRNQVNLX1JUX0NMT0NLX0VOQUJMRSAgICAgICAgICAgIDB4MDQwMAorI2RlZmluZSBBQ1BJX0JJVE1BU0tfUENJRVhQX1dBS0VfRElTQUJMRSAgICAgICAgMHg0MDAwCS8qIEFDUEkgMy4wICovCisKKyNkZWZpbmUgQUNQSV9CSVRNQVNLX1NDSV9FTkFCTEUgICAgICAgICAgICAgICAgIDB4MDAwMQorI2RlZmluZSBBQ1BJX0JJVE1BU0tfQlVTX01BU1RFUl9STEQgICAgICAgICAgICAgMHgwMDAyCisjZGVmaW5lIEFDUElfQklUTUFTS19HTE9CQUxfTE9DS19SRUxFQVNFICAgICAgICAweDAwMDQKKyNkZWZpbmUgQUNQSV9CSVRNQVNLX1NMRUVQX1RZUEVfWCAgICAgICAgICAgICAgIDB4MUMwMAorI2RlZmluZSBBQ1BJX0JJVE1BU0tfU0xFRVBfRU5BQkxFICAgICAgICAgICAgICAgMHgyMDAwCisKKyNkZWZpbmUgQUNQSV9CSVRNQVNLX0FSQl9ESVNBQkxFICAgICAgICAgICAgICAgIDB4MDAwMQorCisvKiBSYXcgYml0IHBvc2l0aW9uIG9mIGVhY2ggYml0X3JlZ2lzdGVyICovCisKKyNkZWZpbmUgQUNQSV9CSVRQT1NJVElPTl9USU1FUl9TVEFUVVMgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgQUNQSV9CSVRQT1NJVElPTl9CVVNfTUFTVEVSX1NUQVRVUyAgICAgIDB4MDQKKyNkZWZpbmUgQUNQSV9CSVRQT1NJVElPTl9HTE9CQUxfTE9DS19TVEFUVVMgICAgIDB4MDUKKyNkZWZpbmUgQUNQSV9CSVRQT1NJVElPTl9QT1dFUl9CVVRUT05fU1RBVFVTICAgIDB4MDgKKyNkZWZpbmUgQUNQSV9CSVRQT1NJVElPTl9TTEVFUF9CVVRUT05fU1RBVFVTICAgIDB4MDkKKyNkZWZpbmUgQUNQSV9CSVRQT1NJVElPTl9SVF9DTE9DS19TVEFUVVMgICAgICAgIDB4MEEKKyNkZWZpbmUgQUNQSV9CSVRQT1NJVElPTl9QQ0lFWFBfV0FLRV9TVEFUVVMgICAgIDB4MEUJLyogQUNQSSAzLjAgKi8KKyNkZWZpbmUgQUNQSV9CSVRQT1NJVElPTl9XQUtFX1NUQVRVUyAgICAgICAgICAgIDB4MEYKKworI2RlZmluZSBBQ1BJX0JJVFBPU0lUSU9OX1RJTUVSX0VOQUJMRSAgICAgICAgICAgMHgwMAorI2RlZmluZSBBQ1BJX0JJVFBPU0lUSU9OX0dMT0JBTF9MT0NLX0VOQUJMRSAgICAgMHgwNQorI2RlZmluZSBBQ1BJX0JJVFBPU0lUSU9OX1BPV0VSX0JVVFRPTl9FTkFCTEUgICAgMHgwOAorI2RlZmluZSBBQ1BJX0JJVFBPU0lUSU9OX1NMRUVQX0JVVFRPTl9FTkFCTEUgICAgMHgwOQorI2RlZmluZSBBQ1BJX0JJVFBPU0lUSU9OX1JUX0NMT0NLX0VOQUJMRSAgICAgICAgMHgwQQorI2RlZmluZSBBQ1BJX0JJVFBPU0lUSU9OX1BDSUVYUF9XQUtFX0RJU0FCTEUgICAgMHgwRQkvKiBBQ1BJIDMuMCAqLworCisjZGVmaW5lIEFDUElfQklUUE9TSVRJT05fU0NJX0VOQUJMRSAgICAgICAgICAgICAweDAwCisjZGVmaW5lIEFDUElfQklUUE9TSVRJT05fQlVTX01BU1RFUl9STEQgICAgICAgICAweDAxCisjZGVmaW5lIEFDUElfQklUUE9TSVRJT05fR0xPQkFMX0xPQ0tfUkVMRUFTRSAgICAweDAyCisjZGVmaW5lIEFDUElfQklUUE9TSVRJT05fU0xFRVBfVFlQRV9YICAgICAgICAgICAweDBBCisjZGVmaW5lIEFDUElfQklUUE9TSVRJT05fU0xFRVBfRU5BQkxFICAgICAgICAgICAweDBECisKKyNkZWZpbmUgQUNQSV9CSVRQT1NJVElPTl9BUkJfRElTQUJMRSAgICAgICAgICAgIDB4MDAKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogUmVzb3VyY2UgZGVzY3JpcHRvcnMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogcmVzb3VyY2VfdHlwZSB2YWx1ZXMgKi8KKworI2RlZmluZSBBQ1BJX0FERFJFU1NfVFlQRV9NRU1PUllfUkFOR0UgICAgICAgICAgMAorI2RlZmluZSBBQ1BJX0FERFJFU1NfVFlQRV9JT19SQU5HRSAgICAgICAgICAgICAgMQorI2RlZmluZSBBQ1BJX0FERFJFU1NfVFlQRV9CVVNfTlVNQkVSX1JBTkdFICAgICAgMgorCisvKiBSZXNvdXJjZSBkZXNjcmlwdG9yIHR5cGVzIGFuZCBtYXNrcyAqLworCisjZGVmaW5lIEFDUElfUkVTT1VSQ0VfTkFNRV9MQVJHRSAgICAgICAgICAgICAgICAweDgwCisjZGVmaW5lIEFDUElfUkVTT1VSQ0VfTkFNRV9TTUFMTCAgICAgICAgICAgICAgICAweDAwCisKKyNkZWZpbmUgQUNQSV9SRVNPVVJDRV9OQU1FX1NNQUxMX01BU0sgICAgICAgICAgIDB4NzgJLyogQml0cyA2OjMgY29udGFpbiB0aGUgdHlwZSAqLworI2RlZmluZSBBQ1BJX1JFU09VUkNFX05BTUVfU01BTExfTEVOR1RIX01BU0sgICAgMHgwNwkvKiBCaXRzIDI6MCBjb250YWluIHRoZSBsZW5ndGggKi8KKyNkZWZpbmUgQUNQSV9SRVNPVVJDRV9OQU1FX0xBUkdFX01BU0sgICAgICAgICAgIDB4N0YJLyogQml0cyA2OjAgY29udGFpbiB0aGUgdHlwZSAqLworCisvKgorICogU21hbGwgcmVzb3VyY2UgZGVzY3JpcHRvciAibmFtZXMiIGFzIGRlZmluZWQgYnkgdGhlIEFDUEkgc3BlY2lmaWNhdGlvbi4KKyAqIE5vdGU6IEJpdHMgMjowIGFyZSB1c2VkIGZvciB0aGUgZGVzY3JpcHRvciBsZW5ndGgKKyAqLworI2RlZmluZSBBQ1BJX1JFU09VUkNFX05BTUVfSVJRICAgICAgICAgICAgICAgICAgMHgyMAorI2RlZmluZSBBQ1BJX1JFU09VUkNFX05BTUVfRE1BICAgICAgICAgICAgICAgICAgMHgyOAorI2RlZmluZSBBQ1BJX1JFU09VUkNFX05BTUVfU1RBUlRfREVQRU5ERU5UICAgICAgMHgzMAorI2RlZmluZSBBQ1BJX1JFU09VUkNFX05BTUVfRU5EX0RFUEVOREVOVCAgICAgICAgMHgzOAorI2RlZmluZSBBQ1BJX1JFU09VUkNFX05BTUVfSU8gICAgICAgICAgICAgICAgICAgMHg0MAorI2RlZmluZSBBQ1BJX1JFU09VUkNFX05BTUVfRklYRURfSU8gICAgICAgICAgICAgMHg0OAorI2RlZmluZSBBQ1BJX1JFU09VUkNFX05BTUVfUkVTRVJWRURfUzEgICAgICAgICAgMHg1MAorI2RlZmluZSBBQ1BJX1JFU09VUkNFX05BTUVfUkVTRVJWRURfUzIgICAgICAgICAgMHg1OAorI2RlZmluZSBBQ1BJX1JFU09VUkNFX05BTUVfUkVTRVJWRURfUzMgICAgICAgICAgMHg2MAorI2RlZmluZSBBQ1BJX1JFU09VUkNFX05BTUVfUkVTRVJWRURfUzQgICAgICAgICAgMHg2OAorI2RlZmluZSBBQ1BJX1JFU09VUkNFX05BTUVfVkVORE9SX1NNQUxMICAgICAgICAgMHg3MAorI2RlZmluZSBBQ1BJX1JFU09VUkNFX05BTUVfRU5EX1RBRyAgICAgICAgICAgICAgMHg3OAorCisvKgorICogTGFyZ2UgcmVzb3VyY2UgZGVzY3JpcHRvciAibmFtZXMiIGFzIGRlZmluZWQgYnkgdGhlIEFDUEkgc3BlY2lmaWNhdGlvbi4KKyAqIE5vdGU6IGluY2x1ZGVzIHRoZSBMYXJnZSBEZXNjcmlwdG9yIGJpdCBpbiBiaXRbN10KKyAqLworI2RlZmluZSBBQ1BJX1JFU09VUkNFX05BTUVfTUVNT1JZMjQgICAgICAgICAgICAgMHg4MQorI2RlZmluZSBBQ1BJX1JFU09VUkNFX05BTUVfR0VORVJJQ19SRUdJU1RFUiAgICAgMHg4MgorI2RlZmluZSBBQ1BJX1JFU09VUkNFX05BTUVfUkVTRVJWRURfTDEgICAgICAgICAgMHg4MworI2RlZmluZSBBQ1BJX1JFU09VUkNFX05BTUVfVkVORE9SX0xBUkdFICAgICAgICAgMHg4NAorI2RlZmluZSBBQ1BJX1JFU09VUkNFX05BTUVfTUVNT1JZMzIgICAgICAgICAgICAgMHg4NQorI2RlZmluZSBBQ1BJX1JFU09VUkNFX05BTUVfRklYRURfTUVNT1JZMzIgICAgICAgMHg4NgorI2RlZmluZSBBQ1BJX1JFU09VUkNFX05BTUVfQUREUkVTUzMyICAgICAgICAgICAgMHg4NworI2RlZmluZSBBQ1BJX1JFU09VUkNFX05BTUVfQUREUkVTUzE2ICAgICAgICAgICAgMHg4OAorI2RlZmluZSBBQ1BJX1JFU09VUkNFX05BTUVfRVhURU5ERURfSVJRICAgICAgICAgMHg4OQorI2RlZmluZSBBQ1BJX1JFU09VUkNFX05BTUVfQUREUkVTUzY0ICAgICAgICAgICAgMHg4QQorI2RlZmluZSBBQ1BJX1JFU09VUkNFX05BTUVfRVhURU5ERURfQUREUkVTUzY0ICAgMHg4QgorI2RlZmluZSBBQ1BJX1JFU09VUkNFX05BTUVfTEFSR0VfTUFYICAgICAgICAgICAgMHg4QgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBNaXNjZWxsYW5lb3VzCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgQUNQSV9BU0NJSV9aRVJPICAgICAgICAgICAgICAgICAweDMwCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIERlYnVnZ2VyCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0cnVjdCBhY3BpX2RiX21ldGhvZF9pbmZvIHsKKwlhY3BpX2hhbmRsZSBtYWluX3RocmVhZF9nYXRlOworCWFjcGlfaGFuZGxlIHRocmVhZF9jb21wbGV0ZV9nYXRlOworCXUzMiAqdGhyZWFkczsKKwl1MzIgbnVtX3RocmVhZHM7CisJdTMyIG51bV9jcmVhdGVkOworCXUzMiBudW1fY29tcGxldGVkOworCisJY2hhciAqbmFtZTsKKwl1MzIgZmxhZ3M7CisJdTMyIG51bV9sb29wczsKKwljaGFyIHBhdGhuYW1lWzEyOF07CisJY2hhciAqKmFyZ3M7CisKKwkvKgorCSAqIEFyZ3VtZW50cyB0byBiZSBwYXNzZWQgdG8gbWV0aG9kIGZvciB0aGUgY29tbWFuZAorCSAqIFRocmVhZHMgLQorCSAqICAgdGhlIE51bWJlciBvZiB0aHJlYWRzLCBJRCBvZiBjdXJyZW50IHRocmVhZCBhbmQKKwkgKiAgIEluZGV4IG9mIGN1cnJlbnQgdGhyZWFkIGluc2lkZSBhbGwgdGhlbSBjcmVhdGVkLgorCSAqLworCWNoYXIgaW5pdF9hcmdzOworCWNoYXIgKmFyZ3VtZW50c1s0XTsKKwljaGFyIG51bV90aHJlYWRzX3N0clsxMV07CisJY2hhciBpZF9vZl90aHJlYWRfc3RyWzExXTsKKwljaGFyIGluZGV4X29mX3RocmVhZF9zdHJbMTFdOworfTsKKworc3RydWN0IGFjcGlfaW50ZWdyaXR5X2luZm8geworCXUzMiBub2RlczsKKwl1MzIgb2JqZWN0czsKK307CisKKyNkZWZpbmUgQUNQSV9EQl9SRURJUkVDVEFCTEVfT1VUUFVUICAgICAweDAxCisjZGVmaW5lIEFDUElfREJfQ09OU09MRV9PVVRQVVQgICAgICAgICAgMHgwMgorI2RlZmluZSBBQ1BJX0RCX0RVUExJQ0FURV9PVVRQVVQgICAgICAgIDB4MDMKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRGVidWcKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogRW50cnkgZm9yIGEgbWVtb3J5IGFsbG9jYXRpb24gKGRlYnVnIG9ubHkpICovCisKKyNkZWZpbmUgQUNQSV9NRU1fTUFMTE9DICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEFDUElfTUVNX0NBTExPQyAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBBQ1BJX01BWF9NT0RVTEVfTkFNRSAgICAgICAgICAgIDE2CisKKyNkZWZpbmUgQUNQSV9DT01NT05fREVCVUdfTUVNX0hFQURFUiBcCisJc3RydWN0IGFjcGlfZGVidWdfbWVtX2Jsb2NrICAgICAqcHJldmlvdXM7IFwKKwlzdHJ1Y3QgYWNwaV9kZWJ1Z19tZW1fYmxvY2sgICAgICpuZXh0OyBcCisJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplOyBcCisJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQ7IFwKKwl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmU7IFwKKwljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVtBQ1BJX01BWF9NT0RVTEVfTkFNRV07IFwKKwl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jX3R5cGU7CisKK3N0cnVjdCBhY3BpX2RlYnVnX21lbV9oZWFkZXIgeworQUNQSV9DT01NT05fREVCVUdfTUVNX0hFQURFUn07CisKK3N0cnVjdCBhY3BpX2RlYnVnX21lbV9ibG9jayB7CisJQUNQSV9DT01NT05fREVCVUdfTUVNX0hFQURFUiB1NjQgdXNlcl9zcGFjZTsKK307CisKKyNkZWZpbmUgQUNQSV9NRU1fTElTVF9HTE9CQUwgICAgICAgICAgICAwCisjZGVmaW5lIEFDUElfTUVNX0xJU1RfTlNOT0RFICAgICAgICAgICAgMQorI2RlZmluZSBBQ1BJX01FTV9MSVNUX01BWCAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgQUNQSV9OVU1fTUVNX0xJU1RTICAgICAgICAgICAgICAyCisKKyNlbmRpZgkJCQkvKiBfX0FDTE9DQUxfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2FjbWFjcm9zLmggYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2FjbWFjcm9zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWMxMjdlOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvYWNtYWNyb3MuaApAQCAtMCwwICsxLDU3NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIE5hbWU6IGFjbWFjcm9zLmggLSBDIG1hY3JvcyBmb3IgdGhlIGVudGlyZSBzdWJzeXN0ZW0uCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwOCwgSW50ZWwgQ29ycC4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKKyAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIGF0IG1pbmltdW0gYSBkaXNjbGFpbWVyCisgKiAgICBzdWJzdGFudGlhbGx5IHNpbWlsYXIgdG8gdGhlICJOTyBXQVJSQU5UWSIgZGlzY2xhaW1lciBiZWxvdworICogICAgKCJEaXNjbGFpbWVyIikgYW5kIGFueSByZWRpc3RyaWJ1dGlvbiBtdXN0IGJlIGNvbmRpdGlvbmVkIHVwb24KKyAqICAgIGluY2x1ZGluZyBhIHN1YnN0YW50aWFsbHkgc2ltaWxhciBEaXNjbGFpbWVyIHJlcXVpcmVtZW50IGZvciBmdXJ0aGVyCisgKiAgICBiaW5hcnkgcmVkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMKKyAqICAgIG9mIGFueSBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogTk8gV0FSUkFOVFkKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HCisgKiBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KKyAqLworCisjaWZuZGVmIF9fQUNNQUNST1NfSF9fCisjZGVmaW5lIF9fQUNNQUNST1NfSF9fCisKKy8qCisgKiBFeHRyYWN0IGRhdGEgdXNpbmcgYSBwb2ludGVyLiBBbnkgbW9yZSB0aGFuIGEgYnl0ZSBhbmQgd2UKKyAqIGdldCBpbnRvIHBvdGVudGlhbCBhbGlnbWVudCBpc3N1ZXMgLS0gc2VlIHRoZSBTVE9SRSBtYWNyb3MgYmVsb3cuCisgKiBVc2Ugd2l0aCBjYXJlLgorICovCisjZGVmaW5lIEFDUElfR0VUOChwdHIpICAgICAgICAgICAgICAgICAgKkFDUElfQ0FTVF9QVFIgKHU4LCBwdHIpCisjZGVmaW5lIEFDUElfR0VUMTYocHRyKSAgICAgICAgICAgICAgICAgKkFDUElfQ0FTVF9QVFIgKHUxNiwgcHRyKQorI2RlZmluZSBBQ1BJX0dFVDMyKHB0cikgICAgICAgICAgICAgICAgICpBQ1BJX0NBU1RfUFRSICh1MzIsIHB0cikKKyNkZWZpbmUgQUNQSV9HRVQ2NChwdHIpICAgICAgICAgICAgICAgICAqQUNQSV9DQVNUX1BUUiAodTY0LCBwdHIpCisjZGVmaW5lIEFDUElfU0VUOChwdHIpICAgICAgICAgICAgICAgICAgKkFDUElfQ0FTVF9QVFIgKHU4LCBwdHIpCisjZGVmaW5lIEFDUElfU0VUMTYocHRyKSAgICAgICAgICAgICAgICAgKkFDUElfQ0FTVF9QVFIgKHUxNiwgcHRyKQorI2RlZmluZSBBQ1BJX1NFVDMyKHB0cikgICAgICAgICAgICAgICAgICpBQ1BJX0NBU1RfUFRSICh1MzIsIHB0cikKKyNkZWZpbmUgQUNQSV9TRVQ2NChwdHIpICAgICAgICAgICAgICAgICAqQUNQSV9DQVNUX1BUUiAodTY0LCBwdHIpCisKKy8qCisgKiBwcmludGYoKSBmb3JtYXQgaGVscGVycworICovCisKKy8qIFNwbGl0IDY0LWJpdCBpbnRlZ2VyIGludG8gdHdvIDMyLWJpdCB2YWx1ZXMuIFVzZSB3aXRoICU4LjhfeCU4LjhfeCAqLworCisjZGVmaW5lIEFDUElfRk9STUFUX1VJTlQ2NChpKSAgICAgICAgICAgQUNQSV9ISURXT1JEKGkpLCBBQ1BJX0xPRFdPUkQoaSkKKworI2lmIEFDUElfTUFDSElORV9XSURUSCA9PSA2NAorI2RlZmluZSBBQ1BJX0ZPUk1BVF9OQVRJVkVfVUlOVChpKSAgICAgIEFDUElfRk9STUFUX1VJTlQ2NChpKQorI2Vsc2UKKyNkZWZpbmUgQUNQSV9GT1JNQVRfTkFUSVZFX1VJTlQoaSkgICAgICAwLCAoaSkKKyNlbmRpZgorCisvKgorICogTWFjcm9zIGZvciBtb3ZpbmcgZGF0YSBhcm91bmQgdG8vZnJvbSBidWZmZXJzIHRoYXQgYXJlIHBvc3NpYmx5IHVuYWxpZ25lZC4KKyAqIElmIHRoZSBoYXJkd2FyZSBzdXBwb3J0cyB0aGUgdHJhbnNmZXIgb2YgdW5hbGlnbmVkIGRhdGEsIGp1c3QgZG8gdGhlIHN0b3JlLgorICogT3RoZXJ3aXNlLCB3ZSBoYXZlIHRvIG1vdmUgb25lIGJ5dGUgYXQgYSB0aW1lLgorICovCisjaWZkZWYgQUNQSV9CSUdfRU5ESUFOCisvKgorICogTWFjcm9zIGZvciBiaWctZW5kaWFuIG1hY2hpbmVzCisgKi8KKworLyogVGhlc2UgbWFjcm9zIHJldmVyc2UgdGhlIGJ5dGVzIGR1cmluZyB0aGUgbW92ZSwgY29udmVydGluZyBsaXR0bGUtZW5kaWFuIHRvIGJpZyBlbmRpYW4gKi8KKworCQkJICAvKiBCaWcgRW5kaWFuICAgICAgPD09ICAgICAgICBMaXR0bGUgRW5kaWFuICovCisJCQkgIC8qICBIaS4uLkxvICAgICAgICAgICAgICAgICAgICAgTG8uLi5IaSAgICAgKi8KKy8qIDE2LWJpdCBzb3VyY2UsIDE2LzMyLzY0IGRlc3RpbmF0aW9uICovCisKKyNkZWZpbmUgQUNQSV9NT1ZFXzE2X1RPXzE2KGQsIHMpICAgICAgICB7KCggIHU4ICopKHZvaWQgKikoZCkpWzBdID0gKCh1OCAqKSh2b2lkICopKHMpKVsxXTtcCisJCQkJCSAgICgoICB1OCAqKSh2b2lkICopKGQpKVsxXSA9ICgodTggKikodm9pZCAqKShzKSlbMF07fQorCisjZGVmaW5lIEFDUElfTU9WRV8xNl9UT18zMihkLCBzKSAgICAgICAgeygqKHUzMiAqKSh2b2lkICopKGQpKT0wO1wKKwkJCQkJCQkgICAoKHU4ICopKHZvaWQgKikoZCkpWzJdID0gKCh1OCAqKSh2b2lkICopKHMpKVsxXTtcCisJCQkJCQkJICAgKCh1OCAqKSh2b2lkICopKGQpKVszXSA9ICgodTggKikodm9pZCAqKShzKSlbMF07fQorCisjZGVmaW5lIEFDUElfTU9WRV8xNl9UT182NChkLCBzKSAgICAgICAgeygqKHU2NCAqKSh2b2lkICopKGQpKT0wO1wKKwkJCQkJCQkJCSAoKHU4ICopKHZvaWQgKikoZCkpWzZdID0gKCh1OCAqKSh2b2lkICopKHMpKVsxXTtcCisJCQkJCQkJCQkgKCh1OCAqKSh2b2lkICopKGQpKVs3XSA9ICgodTggKikodm9pZCAqKShzKSlbMF07fQorCisvKiAzMi1iaXQgc291cmNlLCAxNi8zMi82NCBkZXN0aW5hdGlvbiAqLworCisjZGVmaW5lIEFDUElfTU9WRV8zMl9UT18xNihkLCBzKSAgICAgICAgQUNQSV9NT1ZFXzE2X1RPXzE2KGQsIHMpCS8qIFRydW5jYXRlIHRvIDE2ICovCisKKyNkZWZpbmUgQUNQSV9NT1ZFXzMyX1RPXzMyKGQsIHMpICAgICAgICB7KCggIHU4ICopKHZvaWQgKikoZCkpWzBdID0gKCh1OCAqKSh2b2lkICopKHMpKVszXTtcCisJCQkJCQkJCQkJICgoICB1OCAqKSh2b2lkICopKGQpKVsxXSA9ICgodTggKikodm9pZCAqKShzKSlbMl07XAorCQkJCQkJCQkJCSAoKCAgdTggKikodm9pZCAqKShkKSlbMl0gPSAoKHU4ICopKHZvaWQgKikocykpWzFdO1wKKwkJCQkJCQkJCQkgKCggIHU4ICopKHZvaWQgKikoZCkpWzNdID0gKCh1OCAqKSh2b2lkICopKHMpKVswXTt9CisKKyNkZWZpbmUgQUNQSV9NT1ZFXzMyX1RPXzY0KGQsIHMpICAgICAgICB7KCoodTY0ICopKHZvaWQgKikoZCkpPTA7XAorCQkJCQkJCQkJCSAgICgodTggKikodm9pZCAqKShkKSlbNF0gPSAoKHU4ICopKHZvaWQgKikocykpWzNdO1wKKwkJCQkJCQkJCQkgICAoKHU4ICopKHZvaWQgKikoZCkpWzVdID0gKCh1OCAqKSh2b2lkICopKHMpKVsyXTtcCisJCQkJCQkJCQkJICAgKCh1OCAqKSh2b2lkICopKGQpKVs2XSA9ICgodTggKikodm9pZCAqKShzKSlbMV07XAorCQkJCQkJCQkJCSAgICgodTggKikodm9pZCAqKShkKSlbN10gPSAoKHU4ICopKHZvaWQgKikocykpWzBdO30KKworLyogNjQtYml0IHNvdXJjZSwgMTYvMzIvNjQgZGVzdGluYXRpb24gKi8KKworI2RlZmluZSBBQ1BJX01PVkVfNjRfVE9fMTYoZCwgcykgICAgICAgIEFDUElfTU9WRV8xNl9UT18xNihkLCBzKQkvKiBUcnVuY2F0ZSB0byAxNiAqLworCisjZGVmaW5lIEFDUElfTU9WRV82NF9UT18zMihkLCBzKSAgICAgICAgQUNQSV9NT1ZFXzMyX1RPXzMyKGQsIHMpCS8qIFRydW5jYXRlIHRvIDMyICovCisKKyNkZWZpbmUgQUNQSV9NT1ZFXzY0X1RPXzY0KGQsIHMpICAgICAgICB7KCggIHU4ICopKHZvaWQgKikoZCkpWzBdID0gKCh1OCAqKSh2b2lkICopKHMpKVs3XTtcCisJCQkJCQkJCQkJICgoICB1OCAqKSh2b2lkICopKGQpKVsxXSA9ICgodTggKikodm9pZCAqKShzKSlbNl07XAorCQkJCQkJCQkJCSAoKCAgdTggKikodm9pZCAqKShkKSlbMl0gPSAoKHU4ICopKHZvaWQgKikocykpWzVdO1wKKwkJCQkJCQkJCQkgKCggIHU4ICopKHZvaWQgKikoZCkpWzNdID0gKCh1OCAqKSh2b2lkICopKHMpKVs0XTtcCisJCQkJCQkJCQkJICgoICB1OCAqKSh2b2lkICopKGQpKVs0XSA9ICgodTggKikodm9pZCAqKShzKSlbM107XAorCQkJCQkJCQkJCSAoKCAgdTggKikodm9pZCAqKShkKSlbNV0gPSAoKHU4ICopKHZvaWQgKikocykpWzJdO1wKKwkJCQkJCQkJCQkgKCggIHU4ICopKHZvaWQgKikoZCkpWzZdID0gKCh1OCAqKSh2b2lkICopKHMpKVsxXTtcCisJCQkJCQkJCQkJICgoICB1OCAqKSh2b2lkICopKGQpKVs3XSA9ICgodTggKikodm9pZCAqKShzKSlbMF07fQorI2Vsc2UKKy8qCisgKiBNYWNyb3MgZm9yIGxpdHRsZS1lbmRpYW4gbWFjaGluZXMKKyAqLworCisjaWZuZGVmIEFDUElfTUlTQUxJR05NRU5UX05PVF9TVVBQT1JURUQKKworLyogVGhlIGhhcmR3YXJlIHN1cHBvcnRzIHVuYWxpZ25lZCB0cmFuc2ZlcnMsIGp1c3QgZG8gdGhlIGxpdHRsZS1lbmRpYW4gbW92ZSAqLworCisvKiAxNi1iaXQgc291cmNlLCAxNi8zMi82NCBkZXN0aW5hdGlvbiAqLworCisjZGVmaW5lIEFDUElfTU9WRV8xNl9UT18xNihkLCBzKSAgICAgICAgKih1MTYgKikodm9pZCAqKShkKSA9ICoodTE2ICopKHZvaWQgKikocykKKyNkZWZpbmUgQUNQSV9NT1ZFXzE2X1RPXzMyKGQsIHMpICAgICAgICAqKHUzMiAqKSh2b2lkICopKGQpID0gKih1MTYgKikodm9pZCAqKShzKQorI2RlZmluZSBBQ1BJX01PVkVfMTZfVE9fNjQoZCwgcykgICAgICAgICoodTY0ICopKHZvaWQgKikoZCkgPSAqKHUxNiAqKSh2b2lkICopKHMpCisKKy8qIDMyLWJpdCBzb3VyY2UsIDE2LzMyLzY0IGRlc3RpbmF0aW9uICovCisKKyNkZWZpbmUgQUNQSV9NT1ZFXzMyX1RPXzE2KGQsIHMpICAgICAgICBBQ1BJX01PVkVfMTZfVE9fMTYoZCwgcykJLyogVHJ1bmNhdGUgdG8gMTYgKi8KKyNkZWZpbmUgQUNQSV9NT1ZFXzMyX1RPXzMyKGQsIHMpICAgICAgICAqKHUzMiAqKSh2b2lkICopKGQpID0gKih1MzIgKikodm9pZCAqKShzKQorI2RlZmluZSBBQ1BJX01PVkVfMzJfVE9fNjQoZCwgcykgICAgICAgICoodTY0ICopKHZvaWQgKikoZCkgPSAqKHUzMiAqKSh2b2lkICopKHMpCisKKy8qIDY0LWJpdCBzb3VyY2UsIDE2LzMyLzY0IGRlc3RpbmF0aW9uICovCisKKyNkZWZpbmUgQUNQSV9NT1ZFXzY0X1RPXzE2KGQsIHMpICAgICAgICBBQ1BJX01PVkVfMTZfVE9fMTYoZCwgcykJLyogVHJ1bmNhdGUgdG8gMTYgKi8KKyNkZWZpbmUgQUNQSV9NT1ZFXzY0X1RPXzMyKGQsIHMpICAgICAgICBBQ1BJX01PVkVfMzJfVE9fMzIoZCwgcykJLyogVHJ1bmNhdGUgdG8gMzIgKi8KKyNkZWZpbmUgQUNQSV9NT1ZFXzY0X1RPXzY0KGQsIHMpICAgICAgICAqKHU2NCAqKSh2b2lkICopKGQpID0gKih1NjQgKikodm9pZCAqKShzKQorCisjZWxzZQorLyoKKyAqIFRoZSBoYXJkd2FyZSBkb2VzIG5vdCBzdXBwb3J0IHVuYWxpZ25lZCB0cmFuc2ZlcnMuIFdlIG11c3QgbW92ZSB0aGUKKyAqIGRhdGEgb25lIGJ5dGUgYXQgYSB0aW1lLiBUaGVzZSBtYWNyb3Mgd29yayB3aGV0aGVyIHRoZSBzb3VyY2Ugb3IKKyAqIHRoZSBkZXN0aW5hdGlvbiAob3IgYm90aCkgaXMvYXJlIHVuYWxpZ25lZC4gKExpdHRsZS1lbmRpYW4gbW92ZSkKKyAqLworCisvKiAxNi1iaXQgc291cmNlLCAxNi8zMi82NCBkZXN0aW5hdGlvbiAqLworCisjZGVmaW5lIEFDUElfTU9WRV8xNl9UT18xNihkLCBzKSAgICAgICAgeygoICB1OCAqKSh2b2lkICopKGQpKVswXSA9ICgodTggKikodm9pZCAqKShzKSlbMF07XAorCQkJCQkJCQkJCSAoKCAgdTggKikodm9pZCAqKShkKSlbMV0gPSAoKHU4ICopKHZvaWQgKikocykpWzFdO30KKworI2RlZmluZSBBQ1BJX01PVkVfMTZfVE9fMzIoZCwgcykgICAgICAgIHsoKih1MzIgKikodm9pZCAqKShkKSkgPSAwOyBBQ1BJX01PVkVfMTZfVE9fMTYoZCwgcyk7fQorI2RlZmluZSBBQ1BJX01PVkVfMTZfVE9fNjQoZCwgcykgICAgICAgIHsoKih1NjQgKikodm9pZCAqKShkKSkgPSAwOyBBQ1BJX01PVkVfMTZfVE9fMTYoZCwgcyk7fQorCisvKiAzMi1iaXQgc291cmNlLCAxNi8zMi82NCBkZXN0aW5hdGlvbiAqLworCisjZGVmaW5lIEFDUElfTU9WRV8zMl9UT18xNihkLCBzKSAgICAgICAgQUNQSV9NT1ZFXzE2X1RPXzE2KGQsIHMpCS8qIFRydW5jYXRlIHRvIDE2ICovCisKKyNkZWZpbmUgQUNQSV9NT1ZFXzMyX1RPXzMyKGQsIHMpICAgICAgICB7KCggIHU4ICopKHZvaWQgKikoZCkpWzBdID0gKCh1OCAqKSh2b2lkICopKHMpKVswXTtcCisJCQkJCQkJCQkJICgoICB1OCAqKSh2b2lkICopKGQpKVsxXSA9ICgodTggKikodm9pZCAqKShzKSlbMV07XAorCQkJCQkJCQkJCSAoKCAgdTggKikodm9pZCAqKShkKSlbMl0gPSAoKHU4ICopKHZvaWQgKikocykpWzJdO1wKKwkJCQkJCQkJCQkgKCggIHU4ICopKHZvaWQgKikoZCkpWzNdID0gKCh1OCAqKSh2b2lkICopKHMpKVszXTt9CisKKyNkZWZpbmUgQUNQSV9NT1ZFXzMyX1RPXzY0KGQsIHMpICAgICAgICB7KCoodTY0ICopKHZvaWQgKikoZCkpID0gMDsgQUNQSV9NT1ZFXzMyX1RPXzMyKGQsIHMpO30KKworLyogNjQtYml0IHNvdXJjZSwgMTYvMzIvNjQgZGVzdGluYXRpb24gKi8KKworI2RlZmluZSBBQ1BJX01PVkVfNjRfVE9fMTYoZCwgcykgICAgICAgIEFDUElfTU9WRV8xNl9UT18xNihkLCBzKQkvKiBUcnVuY2F0ZSB0byAxNiAqLworI2RlZmluZSBBQ1BJX01PVkVfNjRfVE9fMzIoZCwgcykgICAgICAgIEFDUElfTU9WRV8zMl9UT18zMihkLCBzKQkvKiBUcnVuY2F0ZSB0byAzMiAqLworI2RlZmluZSBBQ1BJX01PVkVfNjRfVE9fNjQoZCwgcykgICAgICAgIHsoKCAgdTggKikodm9pZCAqKShkKSlbMF0gPSAoKHU4ICopKHZvaWQgKikocykpWzBdO1wKKwkJCQkJCQkJCQkgKCggIHU4ICopKHZvaWQgKikoZCkpWzFdID0gKCh1OCAqKSh2b2lkICopKHMpKVsxXTtcCisJCQkJCQkJCQkJICgoICB1OCAqKSh2b2lkICopKGQpKVsyXSA9ICgodTggKikodm9pZCAqKShzKSlbMl07XAorCQkJCQkJCQkJCSAoKCAgdTggKikodm9pZCAqKShkKSlbM10gPSAoKHU4ICopKHZvaWQgKikocykpWzNdO1wKKwkJCQkJCQkJCQkgKCggIHU4ICopKHZvaWQgKikoZCkpWzRdID0gKCh1OCAqKSh2b2lkICopKHMpKVs0XTtcCisJCQkJCQkJCQkJICgoICB1OCAqKSh2b2lkICopKGQpKVs1XSA9ICgodTggKikodm9pZCAqKShzKSlbNV07XAorCQkJCQkJCQkJCSAoKCAgdTggKikodm9pZCAqKShkKSlbNl0gPSAoKHU4ICopKHZvaWQgKikocykpWzZdO1wKKwkJCQkJCQkJCQkgKCggIHU4ICopKHZvaWQgKikoZCkpWzddID0gKCh1OCAqKSh2b2lkICopKHMpKVs3XTt9CisjZW5kaWYKKyNlbmRpZgorCisvKiBNYWNyb3MgYmFzZWQgb24gbWFjaGluZSBpbnRlZ2VyIHdpZHRoICovCisKKyNpZiBBQ1BJX01BQ0hJTkVfV0lEVEggPT0gMzIKKyNkZWZpbmUgQUNQSV9NT1ZFX1NJWkVfVE9fMTYoZCwgcykgICAgICAgQUNQSV9NT1ZFXzMyX1RPXzE2KGQsIHMpCisKKyNlbGlmIEFDUElfTUFDSElORV9XSURUSCA9PSA2NAorI2RlZmluZSBBQ1BJX01PVkVfU0laRV9UT18xNihkLCBzKSAgICAgICBBQ1BJX01PVkVfNjRfVE9fMTYoZCwgcykKKworI2Vsc2UKKyNlcnJvciB1bmtub3duIEFDUElfTUFDSElORV9XSURUSAorI2VuZGlmCisKKy8qCisgKiBGYXN0IHBvd2VyLW9mLXR3byBtYXRoIG1hY3JvcyBmb3Igbm9uLW9wdGltaXplZCBjb21waWxlcnMKKyAqLworI2RlZmluZSBfQUNQSV9ESVYodmFsdWUsIHBvd2VyX29mMikgICAgICAoKHUzMikgKCh2YWx1ZSkgPj4gKHBvd2VyX29mMikpKQorI2RlZmluZSBfQUNQSV9NVUwodmFsdWUsIHBvd2VyX29mMikgICAgICAoKHUzMikgKCh2YWx1ZSkgPDwgKHBvd2VyX29mMikpKQorI2RlZmluZSBfQUNQSV9NT0QodmFsdWUsIGRpdmlzb3IpICAgICAgICAoKHUzMikgKCh2YWx1ZSkgJiAoKGRpdmlzb3IpIC0xKSkpCisKKyNkZWZpbmUgQUNQSV9ESVZfMihhKSAgICAgICAgICAgICAgICAgICBfQUNQSV9ESVYoYSwgMSkKKyNkZWZpbmUgQUNQSV9NVUxfMihhKSAgICAgICAgICAgICAgICAgICBfQUNQSV9NVUwoYSwgMSkKKyNkZWZpbmUgQUNQSV9NT0RfMihhKSAgICAgICAgICAgICAgICAgICBfQUNQSV9NT0QoYSwgMikKKworI2RlZmluZSBBQ1BJX0RJVl80KGEpICAgICAgICAgICAgICAgICAgIF9BQ1BJX0RJVihhLCAyKQorI2RlZmluZSBBQ1BJX01VTF80KGEpICAgICAgICAgICAgICAgICAgIF9BQ1BJX01VTChhLCAyKQorI2RlZmluZSBBQ1BJX01PRF80KGEpICAgICAgICAgICAgICAgICAgIF9BQ1BJX01PRChhLCA0KQorCisjZGVmaW5lIEFDUElfRElWXzgoYSkgICAgICAgICAgICAgICAgICAgX0FDUElfRElWKGEsIDMpCisjZGVmaW5lIEFDUElfTVVMXzgoYSkgICAgICAgICAgICAgICAgICAgX0FDUElfTVVMKGEsIDMpCisjZGVmaW5lIEFDUElfTU9EXzgoYSkgICAgICAgICAgICAgICAgICAgX0FDUElfTU9EKGEsIDgpCisKKyNkZWZpbmUgQUNQSV9ESVZfMTYoYSkgICAgICAgICAgICAgICAgICBfQUNQSV9ESVYoYSwgNCkKKyNkZWZpbmUgQUNQSV9NVUxfMTYoYSkgICAgICAgICAgICAgICAgICBfQUNQSV9NVUwoYSwgNCkKKyNkZWZpbmUgQUNQSV9NT0RfMTYoYSkgICAgICAgICAgICAgICAgICBfQUNQSV9NT0QoYSwgMTYpCisKKyNkZWZpbmUgQUNQSV9ESVZfMzIoYSkgICAgICAgICAgICAgICAgICBfQUNQSV9ESVYoYSwgNSkKKyNkZWZpbmUgQUNQSV9NVUxfMzIoYSkgICAgICAgICAgICAgICAgICBfQUNQSV9NVUwoYSwgNSkKKyNkZWZpbmUgQUNQSV9NT0RfMzIoYSkgICAgICAgICAgICAgICAgICBfQUNQSV9NT0QoYSwgMzIpCisKKy8qCisgKiBSb3VuZGluZyBtYWNyb3MgKFBvd2VyIG9mIHR3byBib3VuZGFyaWVzIG9ubHkpCisgKi8KKyNkZWZpbmUgQUNQSV9ST1VORF9ET1dOKHZhbHVlLCBib3VuZGFyeSkgICAgICgoKGFjcGlfc2l6ZSkodmFsdWUpKSAmIFwKKwkJCQkJCSh+KCgoYWNwaV9zaXplKSBib3VuZGFyeSktMSkpKQorCisjZGVmaW5lIEFDUElfUk9VTkRfVVAodmFsdWUsIGJvdW5kYXJ5KQkgICAgICgoKChhY3BpX3NpemUpKHZhbHVlKSkgKyBcCisJCQkJCQkoKChhY3BpX3NpemUpIGJvdW5kYXJ5KS0xKSkgJiBcCisJCQkJCQkofigoKGFjcGlfc2l6ZSkgYm91bmRhcnkpLTEpKSkKKworLyogTm90ZTogc2l6ZW9mKGFjcGlfc2l6ZSkgZXZhbHVhdGVzIHRvIGVpdGhlciA0IG9yIDggKDMyLSB2cyA2NC1iaXQgbW9kZSkgKi8KKworI2RlZmluZSBBQ1BJX1JPVU5EX0RPV05fVE9fMzJCSVQoYSkgICAgICAgICBBQ1BJX1JPVU5EX0RPV04oYSwgNCkKKyNkZWZpbmUgQUNQSV9ST1VORF9ET1dOX1RPXzY0QklUKGEpICAgICAgICAgQUNQSV9ST1VORF9ET1dOKGEsIDgpCisjZGVmaW5lIEFDUElfUk9VTkRfRE9XTl9UT19OQVRJVkVfV09SRChhKSAgIEFDUElfUk9VTkRfRE9XTihhLCBzaXplb2YoYWNwaV9zaXplKSkKKworI2RlZmluZSBBQ1BJX1JPVU5EX1VQX1RPXzMyQklUKGEpICAgICAgICAgICBBQ1BJX1JPVU5EX1VQKGEsIDQpCisjZGVmaW5lIEFDUElfUk9VTkRfVVBfVE9fNjRCSVQoYSkgICAgICAgICAgIEFDUElfUk9VTkRfVVAoYSwgOCkKKyNkZWZpbmUgQUNQSV9ST1VORF9VUF9UT19OQVRJVkVfV09SRChhKSAgICAgQUNQSV9ST1VORF9VUChhLCBzaXplb2YoYWNwaV9zaXplKSkKKworI2RlZmluZSBBQ1BJX1JPVU5EX0JJVFNfVVBfVE9fQllURVMoYSkgICAgICBBQ1BJX0RJVl84KChhKSArIDcpCisjZGVmaW5lIEFDUElfUk9VTkRfQklUU19ET1dOX1RPX0JZVEVTKGEpICAgIEFDUElfRElWXzgoKGEpKQorCisjZGVmaW5lIEFDUElfUk9VTkRfVVBfVE9fMUsoYSkgICAgICAgICAgICAgICgoKGEpICsgMTAyMykgPj4gMTApCisKKy8qIEdlbmVyaWMgKG5vbi1wb3dlci1vZi10d28pIHJvdW5kaW5nICovCisKKyNkZWZpbmUgQUNQSV9ST1VORF9VUF9UTyh2YWx1ZSwgYm91bmRhcnkpICAgKCgodmFsdWUpICsgKChib3VuZGFyeSktMSkpIC8gKGJvdW5kYXJ5KSkKKworI2RlZmluZSBBQ1BJX0lTX01JU0FMSUdORUQodmFsdWUpCSAgICAoKChhY3BpX3NpemUpIHZhbHVlKSAmIChzaXplb2YoYWNwaV9zaXplKS0xKSkKKworLyoKKyAqIEJpdG1hc2sgY3JlYXRpb24KKyAqIEJpdCBwb3NpdGlvbnMgc3RhcnQgYXQgemVyby4KKyAqIE1BU0tfQklUU19BQk9WRSBjcmVhdGVzIGEgbWFzayBzdGFydGluZyBBVCB0aGUgcG9zaXRpb24gYW5kIGFib3ZlCisgKiBNQVNLX0JJVFNfQkVMT1cgY3JlYXRlcyBhIG1hc2sgc3RhcnRpbmcgb25lIGJpdCBCRUxPVyB0aGUgcG9zaXRpb24KKyAqLworI2RlZmluZSBBQ1BJX01BU0tfQklUU19BQk9WRShwb3NpdGlvbikgICAgICAofigoQUNQSV9JTlRFR0VSX01BWCkgPDwgKCh1MzIpIChwb3NpdGlvbikpKSkKKyNkZWZpbmUgQUNQSV9NQVNLX0JJVFNfQkVMT1cocG9zaXRpb24pICAgICAgKChBQ1BJX0lOVEVHRVJfTUFYKSA8PCAoKHUzMikgKHBvc2l0aW9uKSkpCisKKy8qIEJpdGZpZWxkcyB3aXRoaW4gQUNQSSByZWdpc3RlcnMgKi8KKworI2RlZmluZSBBQ1BJX1JFR0lTVEVSX1BSRVBBUkVfQklUUyh2YWwsIHBvcywgbWFzaykgICAgICAoKHZhbCA8PCBwb3MpICYgbWFzaykKKyNkZWZpbmUgQUNQSV9SRUdJU1RFUl9JTlNFUlRfVkFMVUUocmVnLCBwb3MsIG1hc2ssIHZhbCkgIHJlZyA9IChyZWcgJiAofihtYXNrKSkpIHwgQUNQSV9SRUdJU1RFUl9QUkVQQVJFX0JJVFModmFsLCBwb3MsIG1hc2spCisKKyNkZWZpbmUgQUNQSV9JTlNFUlRfQklUUyh0YXJnZXQsIG1hc2ssIHNvdXJjZSkgICAgICAgICAgdGFyZ2V0ID0gKCh0YXJnZXQgJiAofihtYXNrKSkpIHwgKHNvdXJjZSAmIG1hc2spKQorCisvKgorICogQSBzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSBjYW4gYXBwZWFyIGluIHNvbWUgY29udGV4dHMKKyAqIHdoZXJlIGEgcG9pbnRlciB0byBhIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgY2FuIGFsc28KKyAqIGFwcGVhci4gVGhpcyBtYWNybyBpcyB1c2VkIHRvIGRpc3Rpbmd1aXNoIHRoZW0uCisgKgorICogVGhlICJEZXNjcmlwdG9yIiBmaWVsZCBpcyB0aGUgZmlyc3QgZmllbGQgaW4gYm90aCBzdHJ1Y3R1cmVzLgorICovCisjZGVmaW5lIEFDUElfR0VUX0RFU0NSSVBUT1JfVFlQRShkKSAgICAgKCgodW5pb24gYWNwaV9kZXNjcmlwdG9yICopKHZvaWQgKikoZCkpLT5jb21tb24uZGVzY3JpcHRvcl90eXBlKQorI2RlZmluZSBBQ1BJX1NFVF9ERVNDUklQVE9SX1RZUEUoZCwgdCkgICgoKHVuaW9uIGFjcGlfZGVzY3JpcHRvciAqKSh2b2lkICopKGQpKS0+Y29tbW9uLmRlc2NyaXB0b3JfdHlwZSA9IHQpCisKKy8qIE1hY3JvIHRvIHRlc3QgdGhlIG9iamVjdCB0eXBlICovCisKKyNkZWZpbmUgQUNQSV9HRVRfT0JKRUNUX1RZUEUoZCkgICAgICAgICAoKCh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICopKHZvaWQgKikoZCkpLT5jb21tb24udHlwZSkKKworLyoKKyAqIE1hY3JvcyBmb3IgdGhlIG1hc3RlciBBTUwgb3Bjb2RlIHRhYmxlCisgKi8KKyNpZiBkZWZpbmVkIChBQ1BJX0RJU0FTU0VNQkxFUikgfHwgZGVmaW5lZCAoQUNQSV9ERUJVR19PVVRQVVQpCisjZGVmaW5lIEFDUElfT1AobmFtZSwgUGFyZ3MsIElhcmdzLCBvYmpfdHlwZSwgY2xhc3MsIHR5cGUsIGZsYWdzKSBcCisJe25hbWUsICh1MzIpKFBhcmdzKSwgKHUzMikoSWFyZ3MpLCAodTMyKShmbGFncyksIG9ial90eXBlLCBjbGFzcywgdHlwZX0KKyNlbHNlCisjZGVmaW5lIEFDUElfT1AobmFtZSwgUGFyZ3MsIElhcmdzLCBvYmpfdHlwZSwgY2xhc3MsIHR5cGUsIGZsYWdzKSBcCisJeyh1MzIpKFBhcmdzKSwgKHUzMikoSWFyZ3MpLCAodTMyKShmbGFncyksIG9ial90eXBlLCBjbGFzcywgdHlwZX0KKyNlbmRpZgorCisjZGVmaW5lIEFSR19UWVBFX1dJRFRIICAgICAgICAgICAgICAgICAgNQorI2RlZmluZSBBUkdfMSh4KSAgICAgICAgICAgICAgICAgICAgICAgICgodTMyKSh4KSkKKyNkZWZpbmUgQVJHXzIoeCkgICAgICAgICAgICAgICAgICAgICAgICAoKHUzMikoeCkgPDwgKDEgKiBBUkdfVFlQRV9XSURUSCkpCisjZGVmaW5lIEFSR18zKHgpICAgICAgICAgICAgICAgICAgICAgICAgKCh1MzIpKHgpIDw8ICgyICogQVJHX1RZUEVfV0lEVEgpKQorI2RlZmluZSBBUkdfNCh4KSAgICAgICAgICAgICAgICAgICAgICAgICgodTMyKSh4KSA8PCAoMyAqIEFSR19UWVBFX1dJRFRIKSkKKyNkZWZpbmUgQVJHXzUoeCkgICAgICAgICAgICAgICAgICAgICAgICAoKHUzMikoeCkgPDwgKDQgKiBBUkdfVFlQRV9XSURUSCkpCisjZGVmaW5lIEFSR182KHgpICAgICAgICAgICAgICAgICAgICAgICAgKCh1MzIpKHgpIDw8ICg1ICogQVJHX1RZUEVfV0lEVEgpKQorCisjZGVmaW5lIEFSR0lfTElTVDEoYSkgICAgICAgICAgICAgICAgICAgKEFSR18xKGEpKQorI2RlZmluZSBBUkdJX0xJU1QyKGEsIGIpICAgICAgICAgICAgICAgIChBUkdfMShiKXxBUkdfMihhKSkKKyNkZWZpbmUgQVJHSV9MSVNUMyhhLCBiLCBjKSAgICAgICAgICAgICAoQVJHXzEoYyl8QVJHXzIoYil8QVJHXzMoYSkpCisjZGVmaW5lIEFSR0lfTElTVDQoYSwgYiwgYywgZCkgICAgICAgICAgKEFSR18xKGQpfEFSR18yKGMpfEFSR18zKGIpfEFSR180KGEpKQorI2RlZmluZSBBUkdJX0xJU1Q1KGEsIGIsIGMsIGQsIGUpICAgICAgIChBUkdfMShlKXxBUkdfMihkKXxBUkdfMyhjKXxBUkdfNChiKXxBUkdfNShhKSkKKyNkZWZpbmUgQVJHSV9MSVNUNihhLCBiLCBjLCBkLCBlLCBmKSAgICAoQVJHXzEoZil8QVJHXzIoZSl8QVJHXzMoZCl8QVJHXzQoYyl8QVJHXzUoYil8QVJHXzYoYSkpCisKKyNkZWZpbmUgQVJHUF9MSVNUMShhKSAgICAgICAgICAgICAgICAgICAoQVJHXzEoYSkpCisjZGVmaW5lIEFSR1BfTElTVDIoYSwgYikgICAgICAgICAgICAgICAgKEFSR18xKGEpfEFSR18yKGIpKQorI2RlZmluZSBBUkdQX0xJU1QzKGEsIGIsIGMpICAgICAgICAgICAgIChBUkdfMShhKXxBUkdfMihiKXxBUkdfMyhjKSkKKyNkZWZpbmUgQVJHUF9MSVNUNChhLCBiLCBjLCBkKSAgICAgICAgICAoQVJHXzEoYSl8QVJHXzIoYil8QVJHXzMoYyl8QVJHXzQoZCkpCisjZGVmaW5lIEFSR1BfTElTVDUoYSwgYiwgYywgZCwgZSkgICAgICAgKEFSR18xKGEpfEFSR18yKGIpfEFSR18zKGMpfEFSR180KGQpfEFSR181KGUpKQorI2RlZmluZSBBUkdQX0xJU1Q2KGEsIGIsIGMsIGQsIGUsIGYpICAgIChBUkdfMShhKXxBUkdfMihiKXxBUkdfMyhjKXxBUkdfNChkKXxBUkdfNShlKXxBUkdfNihmKSkKKworI2RlZmluZSBHRVRfQ1VSUkVOVF9BUkdfVFlQRShsaXN0KSAgICAgIChsaXN0ICYgKCh1MzIpIDB4MUYpKQorI2RlZmluZSBJTkNSRU1FTlRfQVJHX0xJU1QobGlzdCkgICAgICAgIChsaXN0ID4+PSAoKHUzMikgQVJHX1RZUEVfV0lEVEgpKQorCisvKgorICogQXNjaWkgZXJyb3IgbWVzc2FnZXMgY2FuIGJlIGNvbmZpZ3VyZWQgb3V0CisgKi8KKyNpZm5kZWYgQUNQSV9OT19FUlJPUl9NRVNTQUdFUworCisvKgorICogRXJyb3IgcmVwb3J0aW5nLiBDYWxsZXJzIG1vZHVsZSBhbmQgbGluZSBudW1iZXIgYXJlIGluc2VydGVkIGJ5IEFFX0lORk8sCisgKiB0aGUgcGxpc3QgY29udGFpbnMgYSBzZXQgb2YgcGFyZW5zIHRvIGFsbG93IHZhcmlhYmxlLWxlbmd0aCBsaXN0cy4KKyAqIFRoZXNlIG1hY3JvcyBhcmUgdXNlZCBmb3IgYm90aCB0aGUgZGVidWcgYW5kIG5vbi1kZWJ1ZyB2ZXJzaW9ucyBvZiB0aGUgY29kZS4KKyAqLworI2RlZmluZSBBQ1BJX0VSUk9SX05BTUVTUEFDRShzLCBlKSAgICAgIGFjcGlfbnNfcmVwb3J0X2Vycm9yIChBRV9JTkZPLCBzLCBlKTsKKyNkZWZpbmUgQUNQSV9FUlJPUl9NRVRIT0QocywgbiwgcCwgZSkgICBhY3BpX25zX3JlcG9ydF9tZXRob2RfZXJyb3IgKEFFX0lORk8sIHMsIG4sIHAsIGUpOworCisjZWxzZQorCisvKiBObyBlcnJvciBtZXNzYWdlcyAqLworCisjZGVmaW5lIEFDUElfRVJST1JfTkFNRVNQQUNFKHMsIGUpCisjZGVmaW5lIEFDUElfRVJST1JfTUVUSE9EKHMsIG4sIHAsIGUpCisjZW5kaWYJCS8qIEFDUElfTk9fRVJST1JfTUVTU0FHRVMgKi8KKworLyoKKyAqIERlYnVnIG1hY3JvcyB0aGF0IGFyZSBjb25kaXRpb25hbGx5IGNvbXBpbGVkCisgKi8KKyNpZmRlZiBBQ1BJX0RFQlVHX09VVFBVVAorCisvKgorICogRnVuY3Rpb24gZW50cnkgdHJhY2luZworICovCisjaWZkZWYgQ09ORklHX0FDUElfREVCVUdfRlVOQ19UUkFDRQorCisjZGVmaW5lIEFDUElfRlVOQ1RJT05fVFJBQ0UoYSkgICAgICAgICAgQUNQSV9GVU5DVElPTl9OQU1FKGEpIFwKKwkJCSAgYWNwaV91dF90cmFjZShBQ1BJX0RFQlVHX1BBUkFNRVRFUlMpCisjZGVmaW5lIEFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKGEsIGIpICAgQUNQSV9GVU5DVElPTl9OQU1FKGEpIFwKKwkJCQkJICAgYWNwaV91dF90cmFjZV9wdHIoQUNQSV9ERUJVR19QQVJBTUVURVJTLCAodm9pZCAqKWIpCisjZGVmaW5lIEFDUElfRlVOQ1RJT05fVFJBQ0VfVTMyKGEsIGIpICAgQUNQSV9GVU5DVElPTl9OQU1FKGEpIFwKKwkJCQkJCQkgYWNwaV91dF90cmFjZV91MzIoQUNQSV9ERUJVR19QQVJBTUVURVJTLCAodTMyKWIpCisjZGVmaW5lIEFDUElfRlVOQ1RJT05fVFJBQ0VfU1RSKGEsIGIpICAgQUNQSV9GVU5DVElPTl9OQU1FKGEpIFwKKwkJCQkJCQkJCSAgYWNwaV91dF90cmFjZV9zdHIoQUNQSV9ERUJVR19QQVJBTUVURVJTLCAoY2hhciAqKWIpCisKKyNkZWZpbmUgQUNQSV9GVU5DVElPTl9FTlRSWSgpICAgICAgICAgICBhY3BpX3V0X3RyYWNrX3N0YWNrX3B0cigpCisKKy8qCisgKiBGdW5jdGlvbiBleGl0IHRyYWNpbmcuCisgKiBXQVJOSU5HOiBUaGVzZSBtYWNyb3MgaW5jbHVkZSBhIHJldHVybiBzdGF0ZW1lbnQuIFRoaXMgaXMgdXN1YWxseSBjb25zaWRlcmVkCisgKiBiYWQgZm9ybSwgYnV0IGhhdmluZyBhIHNlcGFyYXRlIGV4aXQgbWFjcm8gaXMgdmVyeSB1Z2x5IGFuZCBkaWZmaWN1bHQgdG8gbWFpbnRhaW4uCisgKiBPbmUgb2YgdGhlIEZVTkNUSU9OX1RSQUNFIG1hY3JvcyBhYm92ZSBtdXN0IGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGVzZSBtYWNyb3MKKyAqIHNvIHRoYXQgIl9BY3BpRnVuY3Rpb25OYW1lIiBpcyBkZWZpbmVkLgorICoKKyAqIE5vdGU6IHRoZSBET19XSElMRTAgbWFjcm8gaXMgdXNlZCB0byBwcmV2ZW50IHNvbWUgY29tcGlsZXJzIGZyb20gY29tcGxhaW5pbmcKKyAqIGFib3V0IHRoZXNlIGNvbnN0cnVjdHMuCisgKi8KKyNpZmRlZiBBQ1BJX1VTRV9ET19XSElMRV8wCisjZGVmaW5lIEFDUElfRE9fV0hJTEUwKGEpICAgICAgICAgICAgICAgZG8gYSB3aGlsZSgwKQorI2Vsc2UKKyNkZWZpbmUgQUNQSV9ET19XSElMRTAoYSkgICAgICAgICAgICAgICBhCisjZW5kaWYKKworI2RlZmluZSByZXR1cm5fVk9JRCAgICAgICAgICAgICAgICAgICAgIEFDUElfRE9fV0hJTEUwICh7IFwKKwkJCQkJCQkJCQkJYWNwaV91dF9leGl0IChBQ1BJX0RFQlVHX1BBUkFNRVRFUlMpOyBcCisJCQkJCQkJCQkJCXJldHVybjt9KQorLyoKKyAqIFRoZXJlIGFyZSB0d28gdmVyc2lvbnMgb2YgbW9zdCBvZiB0aGUgcmV0dXJuIG1hY3Jvcy4gVGhlIGRlZmF1bHQgdmVyc2lvbiBpcworICogc2FmZXIsIHNpbmNlIGl0IGF2b2lkcyBzaWRlLWVmZmVjdHMgYnkgZ3VhcmFudGVlaW5nIHRoYXQgdGhlIGFyZ3VtZW50IHdpbGwKKyAqIG5vdCBiZSBldmFsdWF0ZWQgdHdpY2UuCisgKgorICogQSBsZXNzLXNhZmUgdmVyc2lvbiBvZiB0aGUgbWFjcm9zIGlzIHByb3ZpZGVkIGZvciBvcHRpb25hbCB1c2UgaWYgdGhlCisgKiBjb21waWxlciB1c2VzIGV4Y2Vzc2l2ZSBDUFUgc3RhY2sgKGZvciBleGFtcGxlLCB0aGlzIG1heSBoYXBwZW4gaW4gdGhlCisgKiBkZWJ1ZyBjYXNlIGlmIGNvZGUgb3B0aW16YXRpb24gaXMgZGlzYWJsZWQuKQorICovCisjaWZuZGVmIEFDUElfU0lNUExFX1JFVFVSTl9NQUNST1MKKworI2RlZmluZSByZXR1cm5fQUNQSV9TVEFUVVMocykgICAgICAgICAgIEFDUElfRE9fV0hJTEUwICh7IFwKKwkJCQkJCQkJCQkJcmVnaXN0ZXIgYWNwaV9zdGF0dXMgX3MgPSAocyk7IFwKKwkJCQkJCQkJCQkJYWNwaV91dF9zdGF0dXNfZXhpdCAoQUNQSV9ERUJVR19QQVJBTUVURVJTLCBfcyk7IFwKKwkJCQkJCQkJCQkJcmV0dXJuIChfcyk7IH0pCisjZGVmaW5lIHJldHVybl9QVFIocykgICAgICAgICAgICAgICAgICAgQUNQSV9ET19XSElMRTAgKHsgXAorCQkJCQkJCQkJCQlyZWdpc3RlciB2b2lkICpfcyA9ICh2b2lkICopIChzKTsgXAorCQkJCQkJCQkJCQlhY3BpX3V0X3B0cl9leGl0IChBQ1BJX0RFQlVHX1BBUkFNRVRFUlMsICh1OCAqKSBfcyk7IFwKKwkJCQkJCQkJCQkJcmV0dXJuIChfcyk7IH0pCisjZGVmaW5lIHJldHVybl9WQUxVRShzKSAgICAgICAgICAgICAgICAgQUNQSV9ET19XSElMRTAgKHsgXAorCQkJCQkJCQkJCQlyZWdpc3RlciBhY3BpX2ludGVnZXIgX3MgPSAocyk7IFwKKwkJCQkJCQkJCQkJYWNwaV91dF92YWx1ZV9leGl0IChBQ1BJX0RFQlVHX1BBUkFNRVRFUlMsIF9zKTsgXAorCQkJCQkJCQkJCQlyZXR1cm4gKF9zKTsgfSkKKyNkZWZpbmUgcmV0dXJuX1VJTlQ4KHMpICAgICAgICAgICAgICAgICBBQ1BJX0RPX1dISUxFMCAoeyBcCisJCQkJCQkJCQkJCXJlZ2lzdGVyIHU4IF9zID0gKHU4KSAocyk7IFwKKwkJCQkJCQkJCQkJYWNwaV91dF92YWx1ZV9leGl0IChBQ1BJX0RFQlVHX1BBUkFNRVRFUlMsIChhY3BpX2ludGVnZXIpIF9zKTsgXAorCQkJCQkJCQkJCQlyZXR1cm4gKF9zKTsgfSkKKyNkZWZpbmUgcmV0dXJuX1VJTlQzMihzKSAgICAgICAgICAgICAgICBBQ1BJX0RPX1dISUxFMCAoeyBcCisJCQkJCQkJCQkJCXJlZ2lzdGVyIHUzMiBfcyA9ICh1MzIpIChzKTsgXAorCQkJCQkJCQkJCQlhY3BpX3V0X3ZhbHVlX2V4aXQgKEFDUElfREVCVUdfUEFSQU1FVEVSUywgKGFjcGlfaW50ZWdlcikgX3MpOyBcCisJCQkJCQkJCQkJCXJldHVybiAoX3MpOyB9KQorI2Vsc2UJCQkJLyogVXNlIG9yaWdpbmFsIGxlc3Mtc2FmZSBtYWNyb3MgKi8KKworI2RlZmluZSByZXR1cm5fQUNQSV9TVEFUVVMocykgICAgICAgICAgIEFDUElfRE9fV0hJTEUwICh7IFwKKwkJCQkJCQkJCQkJYWNwaV91dF9zdGF0dXNfZXhpdCAoQUNQSV9ERUJVR19QQVJBTUVURVJTLCAocykpOyBcCisJCQkJCQkJCQkJCXJldHVybigocykpOyB9KQorI2RlZmluZSByZXR1cm5fUFRSKHMpICAgICAgICAgICAgICAgICAgIEFDUElfRE9fV0hJTEUwICh7IFwKKwkJCQkJCQkJCQkJYWNwaV91dF9wdHJfZXhpdCAoQUNQSV9ERUJVR19QQVJBTUVURVJTLCAodTggKikgKHMpKTsgXAorCQkJCQkJCQkJCQlyZXR1cm4oKHMpKTsgfSkKKyNkZWZpbmUgcmV0dXJuX1ZBTFVFKHMpICAgICAgICAgICAgICAgICBBQ1BJX0RPX1dISUxFMCAoeyBcCisJCQkJCQkJCQkJCWFjcGlfdXRfdmFsdWVfZXhpdCAoQUNQSV9ERUJVR19QQVJBTUVURVJTLCAoYWNwaV9pbnRlZ2VyKSAocykpOyBcCisJCQkJCQkJCQkJCXJldHVybigocykpOyB9KQorI2RlZmluZSByZXR1cm5fVUlOVDgocykgICAgICAgICAgICAgICAgIHJldHVybl9WQUxVRShzKQorI2RlZmluZSByZXR1cm5fVUlOVDMyKHMpICAgICAgICAgICAgICAgIHJldHVybl9WQUxVRShzKQorCisjZW5kaWYJCQkJLyogQUNQSV9TSU1QTEVfUkVUVVJOX01BQ1JPUyAqLworCisjZWxzZSAvKiAhQ09ORklHX0FDUElfREVCVUdfRlVOQ19UUkFDRSAqLworCisjZGVmaW5lIEFDUElfRlVOQ1RJT05fVFJBQ0UoYSkKKyNkZWZpbmUgQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIoYSxiKQorI2RlZmluZSBBQ1BJX0ZVTkNUSU9OX1RSQUNFX1UzMihhLGIpCisjZGVmaW5lIEFDUElfRlVOQ1RJT05fVFJBQ0VfU1RSKGEsYikKKyNkZWZpbmUgQUNQSV9GVU5DVElPTl9FWElUCisjZGVmaW5lIEFDUElfRlVOQ1RJT05fU1RBVFVTX0VYSVQocykKKyNkZWZpbmUgQUNQSV9GVU5DVElPTl9WQUxVRV9FWElUKHMpCisjZGVmaW5lIEFDUElfRlVOQ1RJT05fVFJBQ0UoYSkKKyNkZWZpbmUgQUNQSV9GVU5DVElPTl9FTlRSWSgpCisKKyNkZWZpbmUgcmV0dXJuX1ZPSUQgICAgICAgICAgICAgICAgICAgICByZXR1cm4KKyNkZWZpbmUgcmV0dXJuX0FDUElfU1RBVFVTKHMpICAgICAgICAgICByZXR1cm4ocykKKyNkZWZpbmUgcmV0dXJuX1ZBTFVFKHMpICAgICAgICAgICAgICAgICByZXR1cm4ocykKKyNkZWZpbmUgcmV0dXJuX1VJTlQ4KHMpICAgICAgICAgICAgICAgICByZXR1cm4ocykKKyNkZWZpbmUgcmV0dXJuX1VJTlQzMihzKSAgICAgICAgICAgICAgICByZXR1cm4ocykKKyNkZWZpbmUgcmV0dXJuX1BUUihzKSAgICAgICAgICAgICAgICAgICByZXR1cm4ocykKKworI2VuZGlmIC8qIENPTkZJR19BQ1BJX0RFQlVHX0ZVTkNfVFJBQ0UgKi8KKworLyogQ29uZGl0aW9uYWwgZXhlY3V0aW9uICovCisKKyNkZWZpbmUgQUNQSV9ERUJVR19FWEVDKGEpICAgICAgICAgICAgICBhCisjZGVmaW5lIEFDUElfTk9STUFMX0VYRUMoYSkKKworI2RlZmluZSBBQ1BJX0RFQlVHX0RFRklORShhKSAgICAgICAgICAgIGE7CisjZGVmaW5lIEFDUElfREVCVUdfT05MWV9NRU1CRVJTKGEpICAgICAgYTsKKyNkZWZpbmUgX1ZFUkJPU0VfU1RSVUNUVVJFUworCisvKiBTdGFjayBhbmQgYnVmZmVyIGR1bXBpbmcgKi8KKworI2RlZmluZSBBQ1BJX0RVTVBfU1RBQ0tfRU5UUlkoYSkgICAgICAgIGFjcGlfZXhfZHVtcF9vcGVyYW5kKChhKSwgMCkKKyNkZWZpbmUgQUNQSV9EVU1QX09QRVJBTkRTKGEsIGIsIGMpCWFjcGlfZXhfZHVtcF9vcGVyYW5kcyhhLCBiLCBjKQorCisjZGVmaW5lIEFDUElfRFVNUF9FTlRSWShhLCBiKSAgICAgICAgICAgYWNwaV9uc19kdW1wX2VudHJ5IChhLCBiKQorI2RlZmluZSBBQ1BJX0RVTVBfUEFUSE5BTUUoYSwgYiwgYywgZCkgIGFjcGlfbnNfZHVtcF9wYXRobmFtZShhLCBiLCBjLCBkKQorI2RlZmluZSBBQ1BJX0RVTVBfUkVTT1VSQ0VfTElTVChhKSAgICAgIGFjcGlfcnNfZHVtcF9yZXNvdXJjZV9saXN0KGEpCisjZGVmaW5lIEFDUElfRFVNUF9CVUZGRVIoYSwgYikgICAgICAgICAgYWNwaV91dF9kdW1wX2J1ZmZlcigodTggKikgYSwgYiwgREJfQllURV9ESVNQTEFZLCBfQ09NUE9ORU5UKQorCisjZWxzZQorLyoKKyAqIFRoaXMgaXMgdGhlIG5vbi1kZWJ1ZyBjYXNlIC0tIG1ha2UgZXZlcnl0aGluZyBnbyBhd2F5LAorICogbGVhdmluZyBubyBleGVjdXRhYmxlIGRlYnVnIGNvZGUhCisgKi8KKyNkZWZpbmUgQUNQSV9ERUJVR19FWEVDKGEpCisjZGVmaW5lIEFDUElfTk9STUFMX0VYRUMoYSkgICAgICAgICAgICAgYTsKKworI2RlZmluZSBBQ1BJX0RFQlVHX0RFRklORShhKQkJZG8geyB9IHdoaWxlKDApCisjZGVmaW5lIEFDUElfREVCVUdfT05MWV9NRU1CRVJTKGEpCWRvIHsgfSB3aGlsZSgwKQorI2RlZmluZSBBQ1BJX0ZVTkNUSU9OX1RSQUNFKGEpCQlkbyB7IH0gd2hpbGUoMCkKKyNkZWZpbmUgQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIoYSwgYikJZG8geyB9IHdoaWxlKDApCisjZGVmaW5lIEFDUElfRlVOQ1RJT05fVFJBQ0VfVTMyKGEsIGIpCWRvIHsgfSB3aGlsZSgwKQorI2RlZmluZSBBQ1BJX0ZVTkNUSU9OX1RSQUNFX1NUUihhLCBiKQlkbyB7IH0gd2hpbGUoMCkKKyNkZWZpbmUgQUNQSV9GVU5DVElPTl9FWElUCQlkbyB7IH0gd2hpbGUoMCkKKyNkZWZpbmUgQUNQSV9GVU5DVElPTl9TVEFUVVNfRVhJVChzKQlkbyB7IH0gd2hpbGUoMCkKKyNkZWZpbmUgQUNQSV9GVU5DVElPTl9WQUxVRV9FWElUKHMpCWRvIHsgfSB3aGlsZSgwKQorI2RlZmluZSBBQ1BJX0ZVTkNUSU9OX0VOVFJZKCkJCWRvIHsgfSB3aGlsZSgwKQorI2RlZmluZSBBQ1BJX0RVTVBfU1RBQ0tfRU5UUlkoYSkJZG8geyB9IHdoaWxlKDApCisjZGVmaW5lIEFDUElfRFVNUF9PUEVSQU5EUyhhLCBiLCBjKSAgICAgZG8geyB9IHdoaWxlKDApCisjZGVmaW5lIEFDUElfRFVNUF9FTlRSWShhLCBiKQkJZG8geyB9IHdoaWxlKDApCisjZGVmaW5lIEFDUElfRFVNUF9UQUJMRVMoYSwgYikJCWRvIHsgfSB3aGlsZSgwKQorI2RlZmluZSBBQ1BJX0RVTVBfUEFUSE5BTUUoYSwgYiwgYywgZCkJZG8geyB9IHdoaWxlKDApCisjZGVmaW5lIEFDUElfRFVNUF9SRVNPVVJDRV9MSVNUKGEpCWRvIHsgfSB3aGlsZSgwKQorI2RlZmluZSBBQ1BJX0RVTVBfQlVGRkVSKGEsIGIpCQlkbyB7IH0gd2hpbGUoMCkKKworI2RlZmluZSByZXR1cm5fVk9JRCAgICAgICAgICAgICAgICAgICAgIHJldHVybgorI2RlZmluZSByZXR1cm5fQUNQSV9TVEFUVVMocykgICAgICAgICAgIHJldHVybihzKQorI2RlZmluZSByZXR1cm5fVkFMVUUocykgICAgICAgICAgICAgICAgIHJldHVybihzKQorI2RlZmluZSByZXR1cm5fVUlOVDgocykgICAgICAgICAgICAgICAgIHJldHVybihzKQorI2RlZmluZSByZXR1cm5fVUlOVDMyKHMpICAgICAgICAgICAgICAgIHJldHVybihzKQorI2RlZmluZSByZXR1cm5fUFRSKHMpICAgICAgICAgICAgICAgICAgIHJldHVybihzKQorCisjZW5kaWYJCQkJLyogQUNQSV9ERUJVR19PVVRQVVQgKi8KKworLyoKKyAqIFNvbWUgY29kZSBvbmx5IGdldHMgZXhlY3V0ZWQgd2hlbiB0aGUgZGVidWdnZXIgaXMgYnVpbHQgaW4uCisgKiBOb3RlIHRoYXQgdGhpcyBpcyBlbnRpcmVseSBpbmRlcGVuZGVudCBvZiB3aGV0aGVyIHRoZQorICogREVCVUdfUFJJTlQgc3R1ZmYgKHNldCBieSBBQ1BJX0RFQlVHX09VVFBVVCkgaXMgb24sIG9yIG5vdC4KKyAqLworI2lmZGVmIEFDUElfREVCVUdHRVIKKyNkZWZpbmUgQUNQSV9ERUJVR0dFUl9FWEVDKGEpICAgICAgICAgICBhCisjZWxzZQorI2RlZmluZSBBQ1BJX0RFQlVHR0VSX0VYRUMoYSkKKyNlbmRpZgorCisjaWZkZWYgQUNQSV9ERUJVR19PVVRQVVQKKy8qCisgKiAxKSBTZXQgbmFtZSB0byBibGFua3MKKyAqIDIpIENvcHkgdGhlIG9iamVjdCBuYW1lCisgKi8KKyNkZWZpbmUgQUNQSV9BRERfT0JKRUNUX05BTUUoYSxiKSAgICAgICBBQ1BJX01FTVNFVCAoYS0+Y29tbW9uLm5hbWUsICcgJywgc2l6ZW9mIChhLT5jb21tb24ubmFtZSkpO1wKKwkJCQkJCQkJCQlBQ1BJX1NUUk5DUFkgKGEtPmNvbW1vbi5uYW1lLCBhY3BpX2dibF9uc190eXBlX25hbWVzW2JdLCBzaXplb2YgKGEtPmNvbW1vbi5uYW1lKSkKKyNlbHNlCisKKyNkZWZpbmUgQUNQSV9BRERfT0JKRUNUX05BTUUoYSxiKQorI2VuZGlmCisKKy8qCisgKiBNZW1vcnkgYWxsb2NhdGlvbiB0cmFja2luZyAoREVCVUcgT05MWSkKKyAqLworI2RlZmluZSBBQ1BJX01FTV9QQVJBTUVURVJTICAgICAgICAgX0NPTVBPTkVOVCwgX2FjcGlfbW9kdWxlX25hbWUsIF9fTElORV9fCisKKyNpZm5kZWYgQUNQSV9EQkdfVFJBQ0tfQUxMT0NBVElPTlMKKworLyogTWVtb3J5IGFsbG9jYXRpb24gKi8KKworI2lmbmRlZiBBQ1BJX0FMTE9DQVRFCisjZGVmaW5lIEFDUElfQUxMT0NBVEUoYSkgICAgICAgICAgICBhY3BpX3V0X2FsbG9jYXRlKChhY3BpX3NpemUpKGEpLCBBQ1BJX01FTV9QQVJBTUVURVJTKQorI2VuZGlmCisjaWZuZGVmIEFDUElfQUxMT0NBVEVfWkVST0VECisjZGVmaW5lIEFDUElfQUxMT0NBVEVfWkVST0VEKGEpICAgICBhY3BpX3V0X2FsbG9jYXRlX3plcm9lZCgoYWNwaV9zaXplKShhKSwgQUNQSV9NRU1fUEFSQU1FVEVSUykKKyNlbmRpZgorI2lmbmRlZiBBQ1BJX0ZSRUUKKyNkZWZpbmUgQUNQSV9GUkVFKGEpICAgICAgICAgICAgICAgIGFjcGlvX29zX2ZyZWUoYSkKKyNlbmRpZgorI2RlZmluZSBBQ1BJX01FTV9UUkFDS0lORyhhKQorCisjZWxzZQorCisvKiBNZW1vcnkgYWxsb2NhdGlvbiAqLworCisjZGVmaW5lIEFDUElfQUxMT0NBVEUoYSkgICAgICAgICAgICBhY3BpX3V0X2FsbG9jYXRlX2FuZF90cmFjaygoYWNwaV9zaXplKShhKSwgQUNQSV9NRU1fUEFSQU1FVEVSUykKKyNkZWZpbmUgQUNQSV9BTExPQ0FURV9aRVJPRUQoYSkgICAgIGFjcGlfdXRfYWxsb2NhdGVfemVyb2VkX2FuZF90cmFjaygoYWNwaV9zaXplKShhKSwgQUNQSV9NRU1fUEFSQU1FVEVSUykKKyNkZWZpbmUgQUNQSV9GUkVFKGEpICAgICAgICAgICAgICAgIGFjcGlfdXRfZnJlZV9hbmRfdHJhY2soYSwgQUNQSV9NRU1fUEFSQU1FVEVSUykKKyNkZWZpbmUgQUNQSV9NRU1fVFJBQ0tJTkcoYSkgICAgICAgIGEKKworI2VuZGlmCQkJCS8qIEFDUElfREJHX1RSQUNLX0FMTE9DQVRJT05TICovCisKKy8qIFByZWVtcHRpb24gcG9pbnQgKi8KKyNpZm5kZWYgQUNQSV9QUkVFTVBUSU9OX1BPSU5UCisjZGVmaW5lIEFDUElfUFJFRU1QVElPTl9QT0lOVCgpIC8qIG5vIHByZWVtcHRpb24gKi8KKyNlbmRpZgorCisjZW5kaWYJCQkJLyogQUNNQUNST1NfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS9hY25hbWVzcC5oIGIvZHJpdmVycy9hY3BpL2FjcGljYS9hY25hbWVzcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2Y2I1YjQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2FjbmFtZXNwLmgKQEAgLTAsMCArMSwzMjQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBOYW1lOiBhY25hbWVzcC5oIC0gTmFtZXNwYWNlIHN1YmNvbXBvbmVudCBwcm90b3R5cGVzIGFuZCBkZWZpbmVzCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwOCwgSW50ZWwgQ29ycC4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKKyAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIGF0IG1pbmltdW0gYSBkaXNjbGFpbWVyCisgKiAgICBzdWJzdGFudGlhbGx5IHNpbWlsYXIgdG8gdGhlICJOTyBXQVJSQU5UWSIgZGlzY2xhaW1lciBiZWxvdworICogICAgKCJEaXNjbGFpbWVyIikgYW5kIGFueSByZWRpc3RyaWJ1dGlvbiBtdXN0IGJlIGNvbmRpdGlvbmVkIHVwb24KKyAqICAgIGluY2x1ZGluZyBhIHN1YnN0YW50aWFsbHkgc2ltaWxhciBEaXNjbGFpbWVyIHJlcXVpcmVtZW50IGZvciBmdXJ0aGVyCisgKiAgICBiaW5hcnkgcmVkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMKKyAqICAgIG9mIGFueSBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogTk8gV0FSUkFOVFkKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HCisgKiBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KKyAqLworCisjaWZuZGVmIF9fQUNOQU1FU1BfSF9fCisjZGVmaW5lIF9fQUNOQU1FU1BfSF9fCisKKy8qIFRvIHNlYXJjaCB0aGUgZW50aXJlIG5hbWUgc3BhY2UsIHBhc3MgdGhpcyBhcyBzZWFyY2hfYmFzZSAqLworCisjZGVmaW5lIEFDUElfTlNfQUxMICAgICAgICAgICAgICAgICAoKGFjcGlfaGFuZGxlKTApCisKKy8qCisgKiBFbGVtZW50cyBvZiBhY3BpX25zX3Byb3BlcnRpZXMgYXJlIGJpdCBzaWduaWZpY2FudAorICogYW5kIHNob3VsZCBiZSBvbmUtdG8tb25lIHdpdGggdmFsdWVzIG9mIGFjcGlfb2JqZWN0X3R5cGUKKyAqLworI2RlZmluZSBBQ1BJX05TX05PUk1BTCAgICAgICAgICAgICAgMAorI2RlZmluZSBBQ1BJX05TX05FV1NDT1BFICAgICAgICAgICAgMQkvKiBhIGRlZmluaXRpb24gb2YgdGhpcyB0eXBlIG9wZW5zIGEgbmFtZSBzY29wZSAqLworI2RlZmluZSBBQ1BJX05TX0xPQ0FMICAgICAgICAgICAgICAgMgkvKiBzdXBwcmVzcyBzZWFyY2ggb2YgZW5jbG9zaW5nIHNjb3BlcyAqLworCisvKiBGbGFncyBmb3IgYWNwaV9uc19sb29rdXAsIGFjcGlfbnNfc2VhcmNoX2FuZF9lbnRlciAqLworCisjZGVmaW5lIEFDUElfTlNfTk9fVVBTRUFSQ0ggICAgICAgICAwCisjZGVmaW5lIEFDUElfTlNfU0VBUkNIX1BBUkVOVCAgICAgICAweDAxCisjZGVmaW5lIEFDUElfTlNfRE9OVF9PUEVOX1NDT1BFICAgICAweDAyCisjZGVmaW5lIEFDUElfTlNfTk9fUEVFUl9TRUFSQ0ggICAgICAweDA0CisjZGVmaW5lIEFDUElfTlNfRVJST1JfSUZfRk9VTkQgICAgICAweDA4CisjZGVmaW5lIEFDUElfTlNfUFJFRklYX0lTX1NDT1BFICAgICAweDEwCisjZGVmaW5lIEFDUElfTlNfRVhURVJOQUwgICAgICAgICAgICAweDIwCisjZGVmaW5lIEFDUElfTlNfVEVNUE9SQVJZICAgICAgICAgICAweDQwCisKKy8qIEZsYWdzIGZvciBhY3BpX25zX3dhbGtfbmFtZXNwYWNlICovCisKKyNkZWZpbmUgQUNQSV9OU19XQUxLX05PX1VOTE9DSyAgICAgIDAKKyNkZWZpbmUgQUNQSV9OU19XQUxLX1VOTE9DSyAgICAgICAgIDB4MDEKKyNkZWZpbmUgQUNQSV9OU19XQUxLX1RFTVBfTk9ERVMgICAgIDB4MDIKKworLyoKKyAqIG5zaW5pdCAtIE5hbWVzcGFjZSBpbml0aWFsaXphdGlvbgorICovCithY3BpX3N0YXR1cyBhY3BpX25zX2luaXRpYWxpemVfb2JqZWN0cyh2b2lkKTsKKworYWNwaV9zdGF0dXMgYWNwaV9uc19pbml0aWFsaXplX2RldmljZXModm9pZCk7CisKKy8qCisgKiBuc2xvYWQgLSAgTmFtZXNwYWNlIGxvYWRpbmcKKyAqLworYWNwaV9zdGF0dXMgYWNwaV9uc19sb2FkX25hbWVzcGFjZSh2b2lkKTsKKworYWNwaV9zdGF0dXMKK2FjcGlfbnNfbG9hZF90YWJsZSh1MzIgdGFibGVfaW5kZXgsIHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlKTsKKworLyoKKyAqIG5zd2FsayAtIHdhbGsgdGhlIG5hbWVzcGFjZQorICovCithY3BpX3N0YXR1cworYWNwaV9uc193YWxrX25hbWVzcGFjZShhY3BpX29iamVjdF90eXBlIHR5cGUsCisJCSAgICAgICBhY3BpX2hhbmRsZSBzdGFydF9vYmplY3QsCisJCSAgICAgICB1MzIgbWF4X2RlcHRoLAorCQkgICAgICAgdTMyIGZsYWdzLAorCQkgICAgICAgYWNwaV93YWxrX2NhbGxiYWNrIHVzZXJfZnVuY3Rpb24sCisJCSAgICAgICB2b2lkICpjb250ZXh0LCB2b2lkICoqcmV0dXJuX3ZhbHVlKTsKKworc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKmFjcGlfbnNfZ2V0X25leHRfbm9kZShhY3BpX29iamVjdF90eXBlIHR5cGUsIHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlCisJCQkJCQkgICpwYXJlbnQsIHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlCisJCQkJCQkgICpjaGlsZCk7CisKKy8qCisgKiBuc3BhcnNlIC0gdGFibGUgcGFyc2luZworICovCithY3BpX3N0YXR1cworYWNwaV9uc19wYXJzZV90YWJsZSh1MzIgdGFibGVfaW5kZXgsIHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpzdGFydF9ub2RlKTsKKworYWNwaV9zdGF0dXMKK2FjcGlfbnNfb25lX2NvbXBsZXRlX3BhcnNlKHUzMiBwYXNzX251bWJlciwKKwkJCSAgIHUzMiB0YWJsZV9pbmRleCwKKwkJCSAgIHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpzdGFydF9ub2RlKTsKKworLyoKKyAqIG5zYWNjZXNzIC0gVG9wLWxldmVsIG5hbWVzcGFjZSBhY2Nlc3MKKyAqLworYWNwaV9zdGF0dXMgYWNwaV9uc19yb290X2luaXRpYWxpemUodm9pZCk7CisKK2FjcGlfc3RhdHVzCithY3BpX25zX2xvb2t1cCh1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgKnNjb3BlX2luZm8sCisJICAgICAgIGNoYXIgKm5hbWUsCisJICAgICAgIGFjcGlfb2JqZWN0X3R5cGUgdHlwZSwKKwkgICAgICAgYWNwaV9pbnRlcnByZXRlcl9tb2RlIGludGVycHJldGVyX21vZGUsCisJICAgICAgIHUzMiBmbGFncywKKwkgICAgICAgc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSwKKwkgICAgICAgc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKipyZXRfbm9kZSk7CisKKy8qCisgKiBuc2FsbG9jIC0gTmFtZWQgb2JqZWN0IGFsbG9jYXRpb24vZGVhbGxvY2F0aW9uCisgKi8KK3N0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICphY3BpX25zX2NyZWF0ZV9ub2RlKHUzMiBuYW1lKTsKKwordm9pZCBhY3BpX25zX2RlbGV0ZV9ub2RlKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlKTsKKwordm9pZAorYWNwaV9uc19kZWxldGVfbmFtZXNwYWNlX3N1YnRyZWUoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKnBhcmVudF9oYW5kbGUpOworCit2b2lkIGFjcGlfbnNfZGVsZXRlX25hbWVzcGFjZV9ieV9vd25lcihhY3BpX293bmVyX2lkIG93bmVyX2lkKTsKKwordm9pZCBhY3BpX25zX2RldGFjaF9vYmplY3Qoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGUpOworCit2b2lkIGFjcGlfbnNfZGVsZXRlX2NoaWxkcmVuKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpwYXJlbnQpOworCitpbnQgYWNwaV9uc19jb21wYXJlX25hbWVzKGNoYXIgKm5hbWUxLCBjaGFyICpuYW1lMik7CisKKy8qCisgKiBuc2R1bXAgLSBOYW1lc3BhY2UgZHVtcC9wcmludCB1dGlsaXRpZXMKKyAqLworI2lmZGVmCUFDUElfRlVUVVJFX1VTQUdFCit2b2lkIGFjcGlfbnNfZHVtcF90YWJsZXMoYWNwaV9oYW5kbGUgc2VhcmNoX2Jhc2UsIHUzMiBtYXhfZGVwdGgpOworI2VuZGlmCQkJCS8qIEFDUElfRlVUVVJFX1VTQUdFICovCisKK3ZvaWQgYWNwaV9uc19kdW1wX2VudHJ5KGFjcGlfaGFuZGxlIGhhbmRsZSwgdTMyIGRlYnVnX2xldmVsKTsKKwordm9pZAorYWNwaV9uc19kdW1wX3BhdGhuYW1lKGFjcGlfaGFuZGxlIGhhbmRsZSwgY2hhciAqbXNnLCB1MzIgbGV2ZWwsIHUzMiBjb21wb25lbnQpOworCit2b2lkIGFjcGlfbnNfcHJpbnRfcGF0aG5hbWUodTMyIG51bV9zZWdtZW50cywgY2hhciAqcGF0aG5hbWUpOworCithY3BpX3N0YXR1cworYWNwaV9uc19kdW1wX29uZV9vYmplY3QoYWNwaV9oYW5kbGUgb2JqX2hhbmRsZSwKKwkJCXUzMiBsZXZlbCwgdm9pZCAqY29udGV4dCwgdm9pZCAqKnJldHVybl92YWx1ZSk7CisKKyNpZmRlZglBQ1BJX0ZVVFVSRV9VU0FHRQordm9pZAorYWNwaV9uc19kdW1wX29iamVjdHMoYWNwaV9vYmplY3RfdHlwZSB0eXBlLAorCQkgICAgIHU4IGRpc3BsYXlfdHlwZSwKKwkJICAgICB1MzIgbWF4X2RlcHRoLAorCQkgICAgIGFjcGlfb3duZXJfaWQgb3duZXJfaWQsIGFjcGlfaGFuZGxlIHN0YXJ0X2hhbmRsZSk7CisjZW5kaWYJCQkJLyogQUNQSV9GVVRVUkVfVVNBR0UgKi8KKworLyoKKyAqIG5zZXZhbCAtIE5hbWVzcGFjZSBldmFsdWF0aW9uIGZ1bmN0aW9ucworICovCithY3BpX3N0YXR1cyBhY3BpX25zX2V2YWx1YXRlKHN0cnVjdCBhY3BpX2V2YWx1YXRlX2luZm8gKmluZm8pOworCisvKgorICogbnNwcmVkZWYgLSBTdXBwb3J0IGZvciBwcmVkZWZpbmVkL3Jlc2VydmVkIG5hbWVzCisgKi8KK2FjcGlfc3RhdHVzCithY3BpX25zX2NoZWNrX3ByZWRlZmluZWRfbmFtZXMoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGUsCisJCQkgICAgICAgdTMyIHVzZXJfcGFyYW1fY291bnQsCisJCQkgICAgICAgYWNwaV9zdGF0dXMgcmV0dXJuX3N0YXR1cywKKwkJCSAgICAgICB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICoqcmV0dXJuX29iamVjdCk7CisKK2NvbnN0IHVuaW9uIGFjcGlfcHJlZGVmaW5lZF9pbmZvICphY3BpX25zX2NoZWNrX2Zvcl9wcmVkZWZpbmVkX25hbWUoc3RydWN0CisJCQkJCQkJCSAgICBhY3BpX25hbWVzcGFjZV9ub2RlCisJCQkJCQkJCSAgICAqbm9kZSk7CisKK3ZvaWQKK2FjcGlfbnNfY2hlY2tfcGFyYW1ldGVyX2NvdW50KGNoYXIgKnBhdGhuYW1lLAorCQkJICAgICAgc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGUsCisJCQkgICAgICB1MzIgdXNlcl9wYXJhbV9jb3VudCwKKwkJCSAgICAgIGNvbnN0IHVuaW9uIGFjcGlfcHJlZGVmaW5lZF9pbmZvICppbmZvKTsKKworLyoKKyAqIG5zbmFtZXMgLSBOYW1lIGFuZCBTY29wZSBtYW5pcHVsYXRpb24KKyAqLwordTMyIGFjcGlfbnNfb3BlbnNfc2NvcGUoYWNwaV9vYmplY3RfdHlwZSB0eXBlKTsKKworYWNwaV9zdGF0dXMKK2FjcGlfbnNfYnVpbGRfZXh0ZXJuYWxfcGF0aChzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZSwKKwkJCSAgICBhY3BpX3NpemUgc2l6ZSwgY2hhciAqbmFtZV9idWZmZXIpOworCitjaGFyICphY3BpX25zX2dldF9leHRlcm5hbF9wYXRobmFtZShzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZSk7CisKK2NoYXIgKmFjcGlfbnNfbmFtZV9vZl9jdXJyZW50X3Njb3BlKHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUpOworCithY3BpX3N0YXR1cworYWNwaV9uc19oYW5kbGVfdG9fcGF0aG5hbWUoYWNwaV9oYW5kbGUgdGFyZ2V0X2hhbmRsZSwKKwkJCSAgIHN0cnVjdCBhY3BpX2J1ZmZlciAqYnVmZmVyKTsKKwordTgKK2FjcGlfbnNfcGF0dGVybl9tYXRjaChzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqb2JqX25vZGUsIGNoYXIgKnNlYXJjaF9mb3IpOworCithY3BpX3N0YXR1cworYWNwaV9uc19nZXRfbm9kZShzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqcHJlZml4X25vZGUsCisJCSBjb25zdCBjaGFyICpleHRlcm5hbF9wYXRobmFtZSwKKwkJIHUzMiBmbGFncywgc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKipvdXRfbm9kZSk7CisKK2FjcGlfc2l6ZSBhY3BpX25zX2dldF9wYXRobmFtZV9sZW5ndGgoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGUpOworCisvKgorICogbnNvYmplY3QgLSBPYmplY3QgbWFuYWdlbWVudCBmb3IgbmFtZXNwYWNlIG5vZGVzCisgKi8KK2FjcGlfc3RhdHVzCithY3BpX25zX2F0dGFjaF9vYmplY3Qoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGUsCisJCSAgICAgIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9iamVjdCwgYWNwaV9vYmplY3RfdHlwZSB0eXBlKTsKKwordW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0KHN0cnVjdAorCQkJCQkJICAgICAgIGFjcGlfbmFtZXNwYWNlX25vZGUKKwkJCQkJCSAgICAgICAqbm9kZSk7CisKK3VuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKmFjcGlfbnNfZ2V0X3NlY29uZGFyeV9vYmplY3QodW5pb24KKwkJCQkJCQlhY3BpX29wZXJhbmRfb2JqZWN0CisJCQkJCQkJKm9ial9kZXNjKTsKKworYWNwaV9zdGF0dXMKK2FjcGlfbnNfYXR0YWNoX2RhdGEoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGUsCisJCSAgICBhY3BpX29iamVjdF9oYW5kbGVyIGhhbmRsZXIsIHZvaWQgKmRhdGEpOworCithY3BpX3N0YXR1cworYWNwaV9uc19kZXRhY2hfZGF0YShzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZSwKKwkJICAgIGFjcGlfb2JqZWN0X2hhbmRsZXIgaGFuZGxlcik7CisKK2FjcGlfc3RhdHVzCithY3BpX25zX2dldF9hdHRhY2hlZF9kYXRhKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlLAorCQkJICBhY3BpX29iamVjdF9oYW5kbGVyIGhhbmRsZXIsIHZvaWQgKipkYXRhKTsKKworLyoKKyAqIG5zc2VhcmNoIC0gTmFtZXNwYWNlIHNlYXJjaGluZyBhbmQgZW50cnkKKyAqLworYWNwaV9zdGF0dXMKK2FjcGlfbnNfc2VhcmNoX2FuZF9lbnRlcih1MzIgZW50cnlfbmFtZSwKKwkJCSBzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlLAorCQkJIHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlLAorCQkJIGFjcGlfaW50ZXJwcmV0ZXJfbW9kZSBpbnRlcnByZXRlcl9tb2RlLAorCQkJIGFjcGlfb2JqZWN0X3R5cGUgdHlwZSwKKwkJCSB1MzIgZmxhZ3MsIHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICoqcmV0X25vZGUpOworCithY3BpX3N0YXR1cworYWNwaV9uc19zZWFyY2hfb25lX3Njb3BlKHUzMiBlbnRyeV9uYW1lLAorCQkJIHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlLAorCQkJIGFjcGlfb2JqZWN0X3R5cGUgdHlwZSwKKwkJCSBzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqKnJldF9ub2RlKTsKKwordm9pZAorYWNwaV9uc19pbnN0YWxsX25vZGUoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSwKKwkJICAgICBzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqcGFyZW50X25vZGUsCisJCSAgICAgc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGUsIGFjcGlfb2JqZWN0X3R5cGUgdHlwZSk7CisKKy8qCisgKiBuc3V0aWxzIC0gVXRpbGl0eSBmdW5jdGlvbnMKKyAqLwordTggYWNwaV9uc192YWxpZF9yb290X3ByZWZpeChjaGFyIHByZWZpeCk7CisKK2FjcGlfb2JqZWN0X3R5cGUgYWNwaV9uc19nZXRfdHlwZShzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZSk7CisKK3UzMiBhY3BpX25zX2xvY2FsKGFjcGlfb2JqZWN0X3R5cGUgdHlwZSk7CisKK3ZvaWQKK2FjcGlfbnNfcmVwb3J0X2Vycm9yKGNvbnN0IGNoYXIgKm1vZHVsZV9uYW1lLAorCQkgICAgIHUzMiBsaW5lX251bWJlciwKKwkJICAgICBjb25zdCBjaGFyICppbnRlcm5hbF9uYW1lLCBhY3BpX3N0YXR1cyBsb29rdXBfc3RhdHVzKTsKKwordm9pZAorYWNwaV9uc19yZXBvcnRfbWV0aG9kX2Vycm9yKGNvbnN0IGNoYXIgKm1vZHVsZV9uYW1lLAorCQkJICAgIHUzMiBsaW5lX251bWJlciwKKwkJCSAgICBjb25zdCBjaGFyICptZXNzYWdlLAorCQkJICAgIHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlLAorCQkJICAgIGNvbnN0IGNoYXIgKnBhdGgsIGFjcGlfc3RhdHVzIGxvb2t1cF9zdGF0dXMpOworCit2b2lkCithY3BpX25zX3ByaW50X25vZGVfcGF0aG5hbWUoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGUsIGNvbnN0IGNoYXIgKm1zZyk7CisKK2FjcGlfc3RhdHVzIGFjcGlfbnNfYnVpbGRfaW50ZXJuYWxfbmFtZShzdHJ1Y3QgYWNwaV9uYW1lc3RyaW5nX2luZm8gKmluZm8pOworCit2b2lkIGFjcGlfbnNfZ2V0X2ludGVybmFsX25hbWVfbGVuZ3RoKHN0cnVjdCBhY3BpX25hbWVzdHJpbmdfaW5mbyAqaW5mbyk7CisKK2FjcGlfc3RhdHVzCithY3BpX25zX2ludGVybmFsaXplX25hbWUoY29uc3QgY2hhciAqZG90dGVkX25hbWUsIGNoYXIgKipjb252ZXJ0ZWRfbmFtZSk7CisKK2FjcGlfc3RhdHVzCithY3BpX25zX2V4dGVybmFsaXplX25hbWUodTMyIGludGVybmFsX25hbWVfbGVuZ3RoLAorCQkJIGNvbnN0IGNoYXIgKmludGVybmFsX25hbWUsCisJCQkgdTMyICogY29udmVydGVkX25hbWVfbGVuZ3RoLCBjaGFyICoqY29udmVydGVkX25hbWUpOworCitzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqYWNwaV9uc19tYXBfaGFuZGxlX3RvX25vZGUoYWNwaV9oYW5kbGUgaGFuZGxlKTsKKworYWNwaV9oYW5kbGUgYWNwaV9uc19jb252ZXJ0X2VudHJ5X3RvX2hhbmRsZShzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZSk7CisKK3ZvaWQgYWNwaV9uc190ZXJtaW5hdGUodm9pZCk7CisKK3N0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICphY3BpX25zX2dldF9wYXJlbnRfbm9kZShzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZQorCQkJCQkJICAgICpub2RlKTsKKworc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKmFjcGlfbnNfZ2V0X25leHRfdmFsaWRfbm9kZShzdHJ1Y3QKKwkJCQkJCQlhY3BpX25hbWVzcGFjZV9ub2RlCisJCQkJCQkJKm5vZGUpOworCisjZW5kaWYJCQkJLyogX19BQ05BTUVTUF9IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYWNwaS9hY29iamVjdC5oIGIvZHJpdmVycy9hY3BpL2FjcGljYS9hY29iamVjdC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FjcGkvYWNvYmplY3QuaApyZW5hbWUgdG8gZHJpdmVycy9hY3BpL2FjcGljYS9hY29iamVjdC5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FjcGkvYWNvcGNvZGUuaCBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvYWNvcGNvZGUuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hY3BpL2Fjb3Bjb2RlLmgKcmVuYW1lIHRvIGRyaXZlcnMvYWNwaS9hY3BpY2EvYWNvcGNvZGUuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL2FjcGFyc2VyLmggYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2FjcGFyc2VyLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYWNwaS9hY3BhcnNlci5oCnJlbmFtZSB0byBkcml2ZXJzL2FjcGkvYWNwaWNhL2FjcGFyc2VyLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYWNwaS9hY3ByZWRlZi5oIGIvZHJpdmVycy9hY3BpL2FjcGljYS9hY3ByZWRlZi5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FjcGkvYWNwcmVkZWYuaApyZW5hbWUgdG8gZHJpdmVycy9hY3BpL2FjcGljYS9hY3ByZWRlZi5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FjcGkvYWNyZXNyYy5oIGIvZHJpdmVycy9hY3BpL2FjcGljYS9hY3Jlc3JjLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYWNwaS9hY3Jlc3JjLmgKcmVuYW1lIHRvIGRyaXZlcnMvYWNwaS9hY3BpY2EvYWNyZXNyYy5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FjcGkvYWNzdHJ1Y3QuaCBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvYWNzdHJ1Y3QuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hY3BpL2Fjc3RydWN0LmgKcmVuYW1lIHRvIGRyaXZlcnMvYWNwaS9hY3BpY2EvYWNzdHJ1Y3QuaApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS9hY3RhYmxlcy5oIGIvZHJpdmVycy9hY3BpL2FjcGljYS9hY3RhYmxlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjZTZlMzMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2FjdGFibGVzLmgKQEAgLTAsMCArMSwxMTcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBOYW1lOiBhY3RhYmxlcy5oIC0gQUNQSSB0YWJsZSBtYW5hZ2VtZW50CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwOCwgSW50ZWwgQ29ycC4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKKyAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIGF0IG1pbmltdW0gYSBkaXNjbGFpbWVyCisgKiAgICBzdWJzdGFudGlhbGx5IHNpbWlsYXIgdG8gdGhlICJOTyBXQVJSQU5UWSIgZGlzY2xhaW1lciBiZWxvdworICogICAgKCJEaXNjbGFpbWVyIikgYW5kIGFueSByZWRpc3RyaWJ1dGlvbiBtdXN0IGJlIGNvbmRpdGlvbmVkIHVwb24KKyAqICAgIGluY2x1ZGluZyBhIHN1YnN0YW50aWFsbHkgc2ltaWxhciBEaXNjbGFpbWVyIHJlcXVpcmVtZW50IGZvciBmdXJ0aGVyCisgKiAgICBiaW5hcnkgcmVkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMKKyAqICAgIG9mIGFueSBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogTk8gV0FSUkFOVFkKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HCisgKiBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KKyAqLworCisjaWZuZGVmIF9fQUNUQUJMRVNfSF9fCisjZGVmaW5lIF9fQUNUQUJMRVNfSF9fCisKK2FjcGlfc3RhdHVzIGFjcGlfYWxsb2NhdGVfcm9vdF90YWJsZSh1MzIgaW5pdGlhbF90YWJsZV9jb3VudCk7CisKKy8qCisgKiB0YmZhZHQgLSBGQURUIHBhcnNlL2NvbnZlcnQvdmFsaWRhdGUKKyAqLwordm9pZCBhY3BpX3RiX3BhcnNlX2ZhZHQodTMyIHRhYmxlX2luZGV4LCB1OCBmbGFncyk7CisKK3ZvaWQgYWNwaV90Yl9jcmVhdGVfbG9jYWxfZmFkdChzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKnRhYmxlLCB1MzIgbGVuZ3RoKTsKKworLyoKKyAqIHRiZmluZCAtIGZpbmQgQUNQSSB0YWJsZQorICovCithY3BpX3N0YXR1cworYWNwaV90Yl9maW5kX3RhYmxlKGNoYXIgKnNpZ25hdHVyZSwKKwkJICAgY2hhciAqb2VtX2lkLCBjaGFyICpvZW1fdGFibGVfaWQsIHUzMiAqdGFibGVfaW5kZXgpOworCisvKgorICogdGJpbnN0YWwgLSBUYWJsZSByZW1vdmFsIGFuZCBkZWxldGlvbgorICovCithY3BpX3N0YXR1cyBhY3BpX3RiX3Jlc2l6ZV9yb290X3RhYmxlX2xpc3Qodm9pZCk7CisKK2FjcGlfc3RhdHVzIGFjcGlfdGJfdmVyaWZ5X3RhYmxlKHN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgKnRhYmxlX2Rlc2MpOworCithY3BpX3N0YXR1cworYWNwaV90Yl9hZGRfdGFibGUoc3RydWN0IGFjcGlfdGFibGVfZGVzYyAqdGFibGVfZGVzYywgdTMyICp0YWJsZV9pbmRleCk7CisKK2FjcGlfc3RhdHVzCithY3BpX3RiX3N0b3JlX3RhYmxlKGFjcGlfcGh5c2ljYWxfYWRkcmVzcyBhZGRyZXNzLAorCQkgICAgc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICp0YWJsZSwKKwkJICAgIHUzMiBsZW5ndGgsIHU4IGZsYWdzLCB1MzIgKnRhYmxlX2luZGV4KTsKKwordm9pZCBhY3BpX3RiX2RlbGV0ZV90YWJsZShzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjICp0YWJsZV9kZXNjKTsKKwordm9pZCBhY3BpX3RiX3Rlcm1pbmF0ZSh2b2lkKTsKKwordm9pZCBhY3BpX3RiX2RlbGV0ZV9uYW1lc3BhY2VfYnlfb3duZXIodTMyIHRhYmxlX2luZGV4KTsKKworYWNwaV9zdGF0dXMgYWNwaV90Yl9hbGxvY2F0ZV9vd25lcl9pZCh1MzIgdGFibGVfaW5kZXgpOworCithY3BpX3N0YXR1cyBhY3BpX3RiX3JlbGVhc2Vfb3duZXJfaWQodTMyIHRhYmxlX2luZGV4KTsKKworYWNwaV9zdGF0dXMgYWNwaV90Yl9nZXRfb3duZXJfaWQodTMyIHRhYmxlX2luZGV4LCBhY3BpX293bmVyX2lkICpvd25lcl9pZCk7CisKK3U4IGFjcGlfdGJfaXNfdGFibGVfbG9hZGVkKHUzMiB0YWJsZV9pbmRleCk7CisKK3ZvaWQgYWNwaV90Yl9zZXRfdGFibGVfbG9hZGVkX2ZsYWcodTMyIHRhYmxlX2luZGV4LCB1OCBpc19sb2FkZWQpOworCisvKgorICogdGJ1dGlscyAtIHRhYmxlIG1hbmFnZXIgdXRpbGl0aWVzCisgKi8KK2FjcGlfc3RhdHVzIGFjcGlfdGJfaW5pdGlhbGl6ZV9mYWNzKHZvaWQpOworCit1OCBhY3BpX3RiX3RhYmxlc19sb2FkZWQodm9pZCk7CisKK3ZvaWQKK2FjcGlfdGJfcHJpbnRfdGFibGVfaGVhZGVyKGFjcGlfcGh5c2ljYWxfYWRkcmVzcyBhZGRyZXNzLAorCQkJICAgc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICpoZWFkZXIpOworCit1OCBhY3BpX3RiX2NoZWNrc3VtKHU4ICpidWZmZXIsIHUzMiBsZW5ndGgpOworCithY3BpX3N0YXR1cworYWNwaV90Yl92ZXJpZnlfY2hlY2tzdW0oc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICp0YWJsZSwgdTMyIGxlbmd0aCk7CisKK3ZvaWQKK2FjcGlfdGJfaW5zdGFsbF90YWJsZShhY3BpX3BoeXNpY2FsX2FkZHJlc3MgYWRkcmVzcywKKwkJICAgICAgdTggZmxhZ3MsIGNoYXIgKnNpZ25hdHVyZSwgdTMyIHRhYmxlX2luZGV4KTsKKworYWNwaV9zdGF0dXMKK2FjcGlfdGJfcGFyc2Vfcm9vdF90YWJsZShhY3BpX3BoeXNpY2FsX2FkZHJlc3MgcnNkcF9hZGRyZXNzLCB1OCBmbGFncyk7CisKKyNlbmRpZgkJCQkvKiBfX0FDVEFCTEVTX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS9hY3V0aWxzLmggYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2FjdXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MGQ4ODEzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS9hY3V0aWxzLmgKQEAgLTAsMCArMSw1NDkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBOYW1lOiBhY3V0aWxzLmggLS0gcHJvdG90eXBlcyBmb3IgdGhlIGNvbW1vbiAoc3Vic3lzdGVtLXdpZGUpIHByb2NlZHVyZXMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA4LCBJbnRlbCBDb3JwLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAorICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgYXQgbWluaW11bSBhIGRpc2NsYWltZXIKKyAqICAgIHN1YnN0YW50aWFsbHkgc2ltaWxhciB0byB0aGUgIk5PIFdBUlJBTlRZIiBkaXNjbGFpbWVyIGJlbG93CisgKiAgICAoIkRpc2NsYWltZXIiKSBhbmQgYW55IHJlZGlzdHJpYnV0aW9uIG11c3QgYmUgY29uZGl0aW9uZWQgdXBvbgorICogICAgaW5jbHVkaW5nIGEgc3Vic3RhbnRpYWxseSBzaW1pbGFyIERpc2NsYWltZXIgcmVxdWlyZW1lbnQgZm9yIGZ1cnRoZXIKKyAqICAgIGJpbmFyeSByZWRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcworICogICAgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBOTyBXQVJSQU5UWQorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcKKyAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgorICovCisKKyNpZm5kZWYgX0FDVVRJTFNfSAorI2RlZmluZSBfQUNVVElMU19ICisKK2V4dGVybiBjb25zdCB1OCBhY3BpX2dibF9yZXNvdXJjZV9hbWxfc2l6ZXNbXTsKKworLyogU3RyaW5ncyB1c2VkIGJ5IHRoZSBkaXNhc3NlbWJsZXIgYW5kIGRlYnVnZ2VyIHJlc291cmNlIGR1bXAgcm91dGluZXMgKi8KKworI2lmIGRlZmluZWQoQUNQSV9ESVNBU1NFTUJMRVIpIHx8IGRlZmluZWQgKEFDUElfREVCVUdHRVIpCisKK2V4dGVybiBjb25zdCBjaGFyICphY3BpX2dibF9ibV9kZWNvZGVbXTsKK2V4dGVybiBjb25zdCBjaGFyICphY3BpX2dibF9jb25maWdfZGVjb2RlW107CitleHRlcm4gY29uc3QgY2hhciAqYWNwaV9nYmxfY29uc3VtZV9kZWNvZGVbXTsKK2V4dGVybiBjb25zdCBjaGFyICphY3BpX2dibF9kZWNfZGVjb2RlW107CitleHRlcm4gY29uc3QgY2hhciAqYWNwaV9nYmxfaGVfZGVjb2RlW107CitleHRlcm4gY29uc3QgY2hhciAqYWNwaV9nYmxfaW9fZGVjb2RlW107CitleHRlcm4gY29uc3QgY2hhciAqYWNwaV9nYmxfbGxfZGVjb2RlW107CitleHRlcm4gY29uc3QgY2hhciAqYWNwaV9nYmxfbWF4X2RlY29kZVtdOworZXh0ZXJuIGNvbnN0IGNoYXIgKmFjcGlfZ2JsX21lbV9kZWNvZGVbXTsKK2V4dGVybiBjb25zdCBjaGFyICphY3BpX2dibF9taW5fZGVjb2RlW107CitleHRlcm4gY29uc3QgY2hhciAqYWNwaV9nYmxfbXRwX2RlY29kZVtdOworZXh0ZXJuIGNvbnN0IGNoYXIgKmFjcGlfZ2JsX3JuZ19kZWNvZGVbXTsKK2V4dGVybiBjb25zdCBjaGFyICphY3BpX2dibF9yd19kZWNvZGVbXTsKK2V4dGVybiBjb25zdCBjaGFyICphY3BpX2dibF9zaHJfZGVjb2RlW107CitleHRlcm4gY29uc3QgY2hhciAqYWNwaV9nYmxfc2l6X2RlY29kZVtdOworZXh0ZXJuIGNvbnN0IGNoYXIgKmFjcGlfZ2JsX3Ryc19kZWNvZGVbXTsKK2V4dGVybiBjb25zdCBjaGFyICphY3BpX2dibF90dHBfZGVjb2RlW107CitleHRlcm4gY29uc3QgY2hhciAqYWNwaV9nYmxfdHlwX2RlY29kZVtdOworI2VuZGlmCisKKy8qIFR5cGVzIGZvciBSZXNvdXJjZSBkZXNjcmlwdG9yIGVudHJpZXMgKi8KKworI2RlZmluZSBBQ1BJX0lOVkFMSURfUkVTT1VSQ0UgICAgICAgICAgIDAKKyNkZWZpbmUgQUNQSV9GSVhFRF9MRU5HVEggICAgICAgICAgICAgICAxCisjZGVmaW5lIEFDUElfVkFSSUFCTEVfTEVOR1RIICAgICAgICAgICAgMgorI2RlZmluZSBBQ1BJX1NNQUxMX1ZBUklBQkxFX0xFTkdUSCAgICAgIDMKKwordHlwZWRlZgorYWNwaV9zdGF0dXMoKmFjcGlfd2Fsa19hbWxfY2FsbGJhY2spICh1OCAqIGFtbCwKKwkJCQkgICAgICB1MzIgbGVuZ3RoLAorCQkJCSAgICAgIHUzMiBvZmZzZXQsCisJCQkJICAgICAgdTggcmVzb3VyY2VfaW5kZXgsIHZvaWQgKipjb250ZXh0KTsKKwordHlwZWRlZgorYWNwaV9zdGF0dXMoKmFjcGlfcGtnX2NhbGxiYWNrKSAodTggb2JqZWN0X3R5cGUsCisJCQkJIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKiBzb3VyY2Vfb2JqZWN0LAorCQkJCSB1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgKiBzdGF0ZSwKKwkJCQkgdm9pZCAqY29udGV4dCk7CisKK3N0cnVjdCBhY3BpX3BrZ19pbmZvIHsKKwl1OCAqZnJlZV9zcGFjZTsKKwlhY3BpX3NpemUgbGVuZ3RoOworCXUzMiBvYmplY3Rfc3BhY2U7CisJdTMyIG51bV9wYWNrYWdlczsKK307CisKKyNkZWZpbmUgUkVGX0lOQ1JFTUVOVCAgICAgICAodTE2KSAwCisjZGVmaW5lIFJFRl9ERUNSRU1FTlQgICAgICAgKHUxNikgMQorI2RlZmluZSBSRUZfRk9SQ0VfREVMRVRFICAgICh1MTYpIDIKKworLyogYWNwaV91dF9kdW1wX2J1ZmZlciAqLworCisjZGVmaW5lIERCX0JZVEVfRElTUExBWSAgICAgMQorI2RlZmluZSBEQl9XT1JEX0RJU1BMQVkgICAgIDIKKyNkZWZpbmUgREJfRFdPUkRfRElTUExBWSAgICA0CisjZGVmaW5lIERCX1FXT1JEX0RJU1BMQVkgICAgOAorCisvKgorICogdXRnbG9iYWwgLSBHbG9iYWwgZGF0YSBzdHJ1Y3R1cmVzIGFuZCBwcm9jZWR1cmVzCisgKi8KK2FjcGlfc3RhdHVzIGFjcGlfdXRfaW5pdF9nbG9iYWxzKHZvaWQpOworCisjaWYgZGVmaW5lZChBQ1BJX0RFQlVHX09VVFBVVCkgfHwgZGVmaW5lZChBQ1BJX0RFQlVHR0VSKQorCitjaGFyICphY3BpX3V0X2dldF9tdXRleF9uYW1lKHUzMiBtdXRleF9pZCk7CisKK2NvbnN0IGNoYXIgKmFjcGlfdXRfZ2V0X25vdGlmeV9uYW1lKHUzMiBub3RpZnlfdmFsdWUpOworCisjZW5kaWYKKworY2hhciAqYWNwaV91dF9nZXRfdHlwZV9uYW1lKGFjcGlfb2JqZWN0X3R5cGUgdHlwZSk7CisKK2NoYXIgKmFjcGlfdXRfZ2V0X25vZGVfbmFtZSh2b2lkICpvYmplY3QpOworCitjaGFyICphY3BpX3V0X2dldF9kZXNjcmlwdG9yX25hbWUodm9pZCAqb2JqZWN0KTsKKworY29uc3QgY2hhciAqYWNwaV91dF9nZXRfcmVmZXJlbmNlX25hbWUodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqZWN0KTsKKworY2hhciAqYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZSh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYyk7CisKK2NoYXIgKmFjcGlfdXRfZ2V0X3JlZ2lvbl9uYW1lKHU4IHNwYWNlX2lkKTsKKworY2hhciAqYWNwaV91dF9nZXRfZXZlbnRfbmFtZSh1MzIgZXZlbnRfaWQpOworCitjaGFyIGFjcGlfdXRfaGV4X3RvX2FzY2lpX2NoYXIoYWNwaV9pbnRlZ2VyIGludGVnZXIsIHUzMiBwb3NpdGlvbik7CisKK3U4IGFjcGlfdXRfdmFsaWRfb2JqZWN0X3R5cGUoYWNwaV9vYmplY3RfdHlwZSB0eXBlKTsKKworLyoKKyAqIHV0aW5pdCAtIG1pc2NlbGxhbmVvdXMgaW5pdGlhbGl6YXRpb24gYW5kIHNodXRkb3duCisgKi8KK2FjcGlfc3RhdHVzIGFjcGlfdXRfaGFyZHdhcmVfaW5pdGlhbGl6ZSh2b2lkKTsKKwordm9pZCBhY3BpX3V0X3N1YnN5c3RlbV9zaHV0ZG93bih2b2lkKTsKKworLyoKKyAqIHV0Y2xpYiAtIExvY2FsIGltcGxlbWVudGF0aW9ucyBvZiBDIGxpYnJhcnkgZnVuY3Rpb25zCisgKi8KKyNpZm5kZWYgQUNQSV9VU0VfU1lTVEVNX0NMSUJSQVJZCisKK2FjcGlfc2l6ZSBhY3BpX3V0X3N0cmxlbihjb25zdCBjaGFyICpzdHJpbmcpOworCitjaGFyICphY3BpX3V0X3N0cmNweShjaGFyICpkc3Rfc3RyaW5nLCBjb25zdCBjaGFyICpzcmNfc3RyaW5nKTsKKworY2hhciAqYWNwaV91dF9zdHJuY3B5KGNoYXIgKmRzdF9zdHJpbmcsCisJCSAgICAgIGNvbnN0IGNoYXIgKnNyY19zdHJpbmcsIGFjcGlfc2l6ZSBjb3VudCk7CisKK2ludCBhY3BpX3V0X21lbWNtcChjb25zdCBjaGFyICpidWZmZXIxLCBjb25zdCBjaGFyICpidWZmZXIyLCBhY3BpX3NpemUgY291bnQpOworCitpbnQgYWNwaV91dF9zdHJuY21wKGNvbnN0IGNoYXIgKnN0cmluZzEsIGNvbnN0IGNoYXIgKnN0cmluZzIsIGFjcGlfc2l6ZSBjb3VudCk7CisKK2ludCBhY3BpX3V0X3N0cmNtcChjb25zdCBjaGFyICpzdHJpbmcxLCBjb25zdCBjaGFyICpzdHJpbmcyKTsKKworY2hhciAqYWNwaV91dF9zdHJjYXQoY2hhciAqZHN0X3N0cmluZywgY29uc3QgY2hhciAqc3JjX3N0cmluZyk7CisKK2NoYXIgKmFjcGlfdXRfc3RybmNhdChjaGFyICpkc3Rfc3RyaW5nLAorCQkgICAgICBjb25zdCBjaGFyICpzcmNfc3RyaW5nLCBhY3BpX3NpemUgY291bnQpOworCit1MzIgYWNwaV91dF9zdHJ0b3VsKGNvbnN0IGNoYXIgKnN0cmluZywgY2hhciAqKnRlcm1pbmF0b3IsIHUzMiBiYXNlKTsKKworY2hhciAqYWNwaV91dF9zdHJzdHIoY2hhciAqc3RyaW5nMSwgY2hhciAqc3RyaW5nMik7CisKK3ZvaWQgKmFjcGlfdXRfbWVtY3B5KHZvaWQgKmRlc3QsIGNvbnN0IHZvaWQgKnNyYywgYWNwaV9zaXplIGNvdW50KTsKKwordm9pZCAqYWNwaV91dF9tZW1zZXQodm9pZCAqZGVzdCwgdTggdmFsdWUsIGFjcGlfc2l6ZSBjb3VudCk7CisKK2ludCBhY3BpX3V0X3RvX3VwcGVyKGludCBjKTsKKworaW50IGFjcGlfdXRfdG9fbG93ZXIoaW50IGMpOworCitleHRlcm4gY29uc3QgdTggX2FjcGlfY3R5cGVbXTsKKworI2RlZmluZSBfQUNQSV9YQSAgICAgMHgwMAkvKiBleHRyYSBhbHBoYWJldGljIC0gbm90IHN1cHBvcnRlZCAqLworI2RlZmluZSBfQUNQSV9YUyAgICAgMHg0MAkvKiBleHRyYSBzcGFjZSAqLworI2RlZmluZSBfQUNQSV9CQiAgICAgMHgwMAkvKiBCRUwsIEJTLCBldGMuIC0gbm90IHN1cHBvcnRlZCAqLworI2RlZmluZSBfQUNQSV9DTiAgICAgMHgyMAkvKiBDUiwgRkYsIEhULCBOTCwgVlQgKi8KKyNkZWZpbmUgX0FDUElfREkgICAgIDB4MDQJLyogJzAnLSc5JyAqLworI2RlZmluZSBfQUNQSV9MTyAgICAgMHgwMgkvKiAnYSctJ3onICovCisjZGVmaW5lIF9BQ1BJX1BVICAgICAweDEwCS8qIHB1bmN0dWF0aW9uICovCisjZGVmaW5lIF9BQ1BJX1NQICAgICAweDA4CS8qIHNwYWNlICovCisjZGVmaW5lIF9BQ1BJX1VQICAgICAweDAxCS8qICdBJy0nWicgKi8KKyNkZWZpbmUgX0FDUElfWEQgICAgIDB4ODAJLyogJzAnLSc5JywgJ0EnLSdGJywgJ2EnLSdmJyAqLworCisjZGVmaW5lIEFDUElfSVNfRElHSVQoYykgIChfYWNwaV9jdHlwZVsodW5zaWduZWQgY2hhcikoYyldICYgKF9BQ1BJX0RJKSkKKyNkZWZpbmUgQUNQSV9JU19TUEFDRShjKSAgKF9hY3BpX2N0eXBlWyh1bnNpZ25lZCBjaGFyKShjKV0gJiAoX0FDUElfU1ApKQorI2RlZmluZSBBQ1BJX0lTX1hESUdJVChjKSAoX2FjcGlfY3R5cGVbKHVuc2lnbmVkIGNoYXIpKGMpXSAmIChfQUNQSV9YRCkpCisjZGVmaW5lIEFDUElfSVNfVVBQRVIoYykgIChfYWNwaV9jdHlwZVsodW5zaWduZWQgY2hhcikoYyldICYgKF9BQ1BJX1VQKSkKKyNkZWZpbmUgQUNQSV9JU19MT1dFUihjKSAgKF9hY3BpX2N0eXBlWyh1bnNpZ25lZCBjaGFyKShjKV0gJiAoX0FDUElfTE8pKQorI2RlZmluZSBBQ1BJX0lTX1BSSU5UKGMpICAoX2FjcGlfY3R5cGVbKHVuc2lnbmVkIGNoYXIpKGMpXSAmIChfQUNQSV9MTyB8IF9BQ1BJX1VQIHwgX0FDUElfREkgfCBfQUNQSV9TUCB8IF9BQ1BJX1BVKSkKKyNkZWZpbmUgQUNQSV9JU19BTFBIQShjKSAgKF9hY3BpX2N0eXBlWyh1bnNpZ25lZCBjaGFyKShjKV0gJiAoX0FDUElfTE8gfCBfQUNQSV9VUCkpCisKKyNlbmRpZgkJCQkvKiBBQ1BJX1VTRV9TWVNURU1fQ0xJQlJBUlkgKi8KKworLyoKKyAqIHV0Y29weSAtIE9iamVjdCBjb25zdHJ1Y3Rpb24gYW5kIGNvbnZlcnNpb24gaW50ZXJmYWNlcworICovCithY3BpX3N0YXR1cworYWNwaV91dF9idWlsZF9zaW1wbGVfb2JqZWN0KHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9iaiwKKwkJCSAgICB1bmlvbiBhY3BpX29iamVjdCAqdXNlcl9vYmosCisJCQkgICAgdTggKiBkYXRhX3NwYWNlLCB1MzIgKiBidWZmZXJfc3BhY2VfdXNlZCk7CisKK2FjcGlfc3RhdHVzCithY3BpX3V0X2J1aWxkX3BhY2thZ2Vfb2JqZWN0KHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9iaiwKKwkJCSAgICAgdTggKiBidWZmZXIsIHUzMiAqIHNwYWNlX3VzZWQpOworCithY3BpX3N0YXR1cworYWNwaV91dF9jb3B5X2lvYmplY3RfdG9fZW9iamVjdCh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmosCisJCQkJc3RydWN0IGFjcGlfYnVmZmVyICpyZXRfYnVmZmVyKTsKKworYWNwaV9zdGF0dXMKK2FjcGlfdXRfY29weV9lb2JqZWN0X3RvX2lvYmplY3QodW5pb24gYWNwaV9vYmplY3QgKm9iaiwKKwkJCQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICoqaW50ZXJuYWxfb2JqKTsKKworYWNwaV9zdGF0dXMKK2FjcGlfdXRfY29weV9pc2ltcGxlX3RvX2lzaW1wbGUodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqc291cmNlX29iaiwKKwkJCQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpkZXN0X29iaik7CisKK2FjcGlfc3RhdHVzCithY3BpX3V0X2NvcHlfaW9iamVjdF90b19pb2JqZWN0KHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnNvdXJjZV9kZXNjLAorCQkJCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKipkZXN0X2Rlc2MsCisJCQkJc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSk7CisKKy8qCisgKiB1dGNyZWF0ZSAtIE9iamVjdCBjcmVhdGlvbgorICovCithY3BpX3N0YXR1cworYWNwaV91dF91cGRhdGVfb2JqZWN0X3JlZmVyZW5jZSh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmplY3QsIHUxNiBhY3Rpb24pOworCisvKgorICogdXRkZWJ1ZyAtIERlYnVnIGludGVyZmFjZXMKKyAqLwordm9pZCBhY3BpX3V0X2luaXRfc3RhY2tfcHRyX3RyYWNlKHZvaWQpOworCit2b2lkIGFjcGlfdXRfdHJhY2tfc3RhY2tfcHRyKHZvaWQpOworCit2b2lkCithY3BpX3V0X3RyYWNlKHUzMiBsaW5lX251bWJlciwKKwkgICAgICBjb25zdCBjaGFyICpmdW5jdGlvbl9uYW1lLAorCSAgICAgIGNvbnN0IGNoYXIgKm1vZHVsZV9uYW1lLCB1MzIgY29tcG9uZW50X2lkKTsKKwordm9pZAorYWNwaV91dF90cmFjZV9wdHIodTMyIGxpbmVfbnVtYmVyLAorCQkgIGNvbnN0IGNoYXIgKmZ1bmN0aW9uX25hbWUsCisJCSAgY29uc3QgY2hhciAqbW9kdWxlX25hbWUsIHUzMiBjb21wb25lbnRfaWQsIHZvaWQgKnBvaW50ZXIpOworCit2b2lkCithY3BpX3V0X3RyYWNlX3UzMih1MzIgbGluZV9udW1iZXIsCisJCSAgY29uc3QgY2hhciAqZnVuY3Rpb25fbmFtZSwKKwkJICBjb25zdCBjaGFyICptb2R1bGVfbmFtZSwgdTMyIGNvbXBvbmVudF9pZCwgdTMyIGludGVnZXIpOworCit2b2lkCithY3BpX3V0X3RyYWNlX3N0cih1MzIgbGluZV9udW1iZXIsCisJCSAgY29uc3QgY2hhciAqZnVuY3Rpb25fbmFtZSwKKwkJICBjb25zdCBjaGFyICptb2R1bGVfbmFtZSwgdTMyIGNvbXBvbmVudF9pZCwgY2hhciAqc3RyaW5nKTsKKwordm9pZAorYWNwaV91dF9leGl0KHUzMiBsaW5lX251bWJlciwKKwkgICAgIGNvbnN0IGNoYXIgKmZ1bmN0aW9uX25hbWUsCisJICAgICBjb25zdCBjaGFyICptb2R1bGVfbmFtZSwgdTMyIGNvbXBvbmVudF9pZCk7CisKK3ZvaWQKK2FjcGlfdXRfc3RhdHVzX2V4aXQodTMyIGxpbmVfbnVtYmVyLAorCQkgICAgY29uc3QgY2hhciAqZnVuY3Rpb25fbmFtZSwKKwkJICAgIGNvbnN0IGNoYXIgKm1vZHVsZV9uYW1lLAorCQkgICAgdTMyIGNvbXBvbmVudF9pZCwgYWNwaV9zdGF0dXMgc3RhdHVzKTsKKwordm9pZAorYWNwaV91dF92YWx1ZV9leGl0KHUzMiBsaW5lX251bWJlciwKKwkJICAgY29uc3QgY2hhciAqZnVuY3Rpb25fbmFtZSwKKwkJICAgY29uc3QgY2hhciAqbW9kdWxlX25hbWUsCisJCSAgIHUzMiBjb21wb25lbnRfaWQsIGFjcGlfaW50ZWdlciB2YWx1ZSk7CisKK3ZvaWQKK2FjcGlfdXRfcHRyX2V4aXQodTMyIGxpbmVfbnVtYmVyLAorCQkgY29uc3QgY2hhciAqZnVuY3Rpb25fbmFtZSwKKwkJIGNvbnN0IGNoYXIgKm1vZHVsZV9uYW1lLCB1MzIgY29tcG9uZW50X2lkLCB1OCAqcHRyKTsKKwordm9pZCBhY3BpX3V0X2R1bXBfYnVmZmVyKHU4ICogYnVmZmVyLCB1MzIgY291bnQsIHUzMiBkaXNwbGF5LCB1MzIgY29tcG9uZW50X2lkKTsKKwordm9pZCBhY3BpX3V0X2R1bXBfYnVmZmVyMih1OCAqIGJ1ZmZlciwgdTMyIGNvdW50LCB1MzIgZGlzcGxheSk7CisKK3ZvaWQgYWNwaV91dF9yZXBvcnRfZXJyb3IoY2hhciAqbW9kdWxlX25hbWUsIHUzMiBsaW5lX251bWJlcik7CisKK3ZvaWQgYWNwaV91dF9yZXBvcnRfaW5mbyhjaGFyICptb2R1bGVfbmFtZSwgdTMyIGxpbmVfbnVtYmVyKTsKKwordm9pZCBhY3BpX3V0X3JlcG9ydF93YXJuaW5nKGNoYXIgKm1vZHVsZV9uYW1lLCB1MzIgbGluZV9udW1iZXIpOworCisvKgorICogdXRkZWxldGUgLSBPYmplY3QgZGVsZXRpb24gYW5kIHJlZmVyZW5jZSBjb3VudHMKKyAqLwordm9pZCBhY3BpX3V0X2FkZF9yZWZlcmVuY2UodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqZWN0KTsKKwordm9pZCBhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqZWN0KTsKKwordm9pZCBhY3BpX3V0X2RlbGV0ZV9pbnRlcm5hbF9wYWNrYWdlX29iamVjdCh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmplY3QpOworCit2b2lkIGFjcGlfdXRfZGVsZXRlX2ludGVybmFsX3NpbXBsZV9vYmplY3QodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqZWN0KTsKKwordm9pZCBhY3BpX3V0X2RlbGV0ZV9pbnRlcm5hbF9vYmplY3RfbGlzdCh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICoqb2JqX2xpc3QpOworCisvKgorICogdXRldmFsIC0gb2JqZWN0IGV2YWx1YXRpb24KKyAqLworYWNwaV9zdGF0dXMgYWNwaV91dF9vc2lfaW1wbGVtZW50YXRpb24oc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSk7CisKK2FjcGlfc3RhdHVzCithY3BpX3V0X2V2YWx1YXRlX29iamVjdChzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqcHJlZml4X25vZGUsCisJCQljaGFyICpwYXRoLAorCQkJdTMyIGV4cGVjdGVkX3JldHVybl9idHlwZXMsCisJCQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICoqcmV0dXJuX2Rlc2MpOworCithY3BpX3N0YXR1cworYWNwaV91dF9ldmFsdWF0ZV9udW1lcmljX29iamVjdChjaGFyICpvYmplY3RfbmFtZSwKKwkJCQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqZGV2aWNlX25vZGUsCisJCQkJYWNwaV9pbnRlZ2VyICogYWRkcmVzcyk7CisKK2FjcGlfc3RhdHVzCithY3BpX3V0X2V4ZWN1dGVfSElEKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpkZXZpY2Vfbm9kZSwKKwkJICAgIHN0cnVjdCBhY3BpY2FfZGV2aWNlX2lkICpoaWQpOworCithY3BpX3N0YXR1cworYWNwaV91dF9leGVjdXRlX0NJRChzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqZGV2aWNlX25vZGUsCisJCSAgICBzdHJ1Y3QgYWNwaV9jb21wYXRpYmxlX2lkX2xpc3QgKipyZXR1cm5fY2lkX2xpc3QpOworCithY3BpX3N0YXR1cworYWNwaV91dF9leGVjdXRlX1NUQShzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqZGV2aWNlX25vZGUsCisJCSAgICB1MzIgKiBzdGF0dXNfZmxhZ3MpOworCithY3BpX3N0YXR1cworYWNwaV91dF9leGVjdXRlX1VJRChzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqZGV2aWNlX25vZGUsCisJCSAgICBzdHJ1Y3QgYWNwaWNhX2RldmljZV9pZCAqdWlkKTsKKworYWNwaV9zdGF0dXMKK2FjcGlfdXRfZXhlY3V0ZV9zeGRzKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpkZXZpY2Vfbm9kZSwgdTggKiBoaWdoZXN0KTsKKworLyoKKyAqIHV0b2JqZWN0IC0gaW50ZXJuYWwgb2JqZWN0IGNyZWF0ZS9kZWxldGUvY2FjaGUgcm91dGluZXMKKyAqLwordW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqYWNwaV91dF9jcmVhdGVfaW50ZXJuYWxfb2JqZWN0X2RiZyhjb25zdCBjaGFyCisJCQkJCQkJICAgICAgKm1vZHVsZV9uYW1lLAorCQkJCQkJCSAgICAgIHUzMiBsaW5lX251bWJlciwKKwkJCQkJCQkgICAgICB1MzIgY29tcG9uZW50X2lkLAorCQkJCQkJCSAgICAgIGFjcGlfb2JqZWN0X3R5cGUKKwkJCQkJCQkgICAgICB0eXBlKTsKKwordm9pZCAqYWNwaV91dF9hbGxvY2F0ZV9vYmplY3RfZGVzY19kYmcoY29uc3QgY2hhciAqbW9kdWxlX25hbWUsCisJCQkJICAgICAgIHUzMiBsaW5lX251bWJlciwgdTMyIGNvbXBvbmVudF9pZCk7CisKKyNkZWZpbmUgYWNwaV91dF9jcmVhdGVfaW50ZXJuYWxfb2JqZWN0KHQpIGFjcGlfdXRfY3JlYXRlX2ludGVybmFsX29iamVjdF9kYmcgKF9hY3BpX21vZHVsZV9uYW1lLF9fTElORV9fLF9DT01QT05FTlQsdCkKKyNkZWZpbmUgYWNwaV91dF9hbGxvY2F0ZV9vYmplY3RfZGVzYygpICBhY3BpX3V0X2FsbG9jYXRlX29iamVjdF9kZXNjX2RiZyAoX2FjcGlfbW9kdWxlX25hbWUsX19MSU5FX18sX0NPTVBPTkVOVCkKKwordm9pZCBhY3BpX3V0X2RlbGV0ZV9vYmplY3RfZGVzYyh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmplY3QpOworCit1OCBhY3BpX3V0X3ZhbGlkX2ludGVybmFsX29iamVjdCh2b2lkICpvYmplY3QpOworCit1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICphY3BpX3V0X2NyZWF0ZV9wYWNrYWdlX29iamVjdCh1MzIgY291bnQpOworCit1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICphY3BpX3V0X2NyZWF0ZV9idWZmZXJfb2JqZWN0KGFjcGlfc2l6ZSBidWZmZXJfc2l6ZSk7CisKK3VuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKmFjcGlfdXRfY3JlYXRlX3N0cmluZ19vYmplY3QoYWNwaV9zaXplIHN0cmluZ19zaXplKTsKKworYWNwaV9zdGF0dXMKK2FjcGlfdXRfZ2V0X29iamVjdF9zaXplKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9iaiwgYWNwaV9zaXplICogb2JqX2xlbmd0aCk7CisKKy8qCisgKiB1dHN0YXRlIC0gR2VuZXJpYyBzdGF0ZSBjcmVhdGlvbi9jYWNoZSByb3V0aW5lcworICovCit2b2lkCithY3BpX3V0X3B1c2hfZ2VuZXJpY19zdGF0ZSh1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgKipsaXN0X2hlYWQsCisJCQkgICB1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgKnN0YXRlKTsKKwordW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICphY3BpX3V0X3BvcF9nZW5lcmljX3N0YXRlKHVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZQorCQkJCQkJICAgICoqbGlzdF9oZWFkKTsKKwordW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICphY3BpX3V0X2NyZWF0ZV9nZW5lcmljX3N0YXRlKHZvaWQpOworCitzdHJ1Y3QgYWNwaV90aHJlYWRfc3RhdGUgKmFjcGlfdXRfY3JlYXRlX3RocmVhZF9zdGF0ZSh2b2lkKTsKKwordW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICphY3BpX3V0X2NyZWF0ZV91cGRhdGVfc3RhdGUodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdAorCQkJCQkJICAgICAgKm9iamVjdCwgdTE2IGFjdGlvbik7CisKK3VuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSAqYWNwaV91dF9jcmVhdGVfcGtnX3N0YXRlKHZvaWQgKmludGVybmFsX29iamVjdCwKKwkJCQkJCSAgIHZvaWQgKmV4dGVybmFsX29iamVjdCwKKwkJCQkJCSAgIHUxNiBpbmRleCk7CisKK2FjcGlfc3RhdHVzCithY3BpX3V0X2NyZWF0ZV91cGRhdGVfc3RhdGVfYW5kX3B1c2godW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqZWN0LAorCQkJCSAgICAgdTE2IGFjdGlvbiwKKwkJCQkgICAgIHVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSAqKnN0YXRlX2xpc3QpOworCisjaWZkZWYJQUNQSV9GVVRVUkVfVVNBR0UKK2FjcGlfc3RhdHVzCithY3BpX3V0X2NyZWF0ZV9wa2dfc3RhdGVfYW5kX3B1c2godm9pZCAqaW50ZXJuYWxfb2JqZWN0LAorCQkJCSAgdm9pZCAqZXh0ZXJuYWxfb2JqZWN0LAorCQkJCSAgdTE2IGluZGV4LAorCQkJCSAgdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICoqc3RhdGVfbGlzdCk7CisjZW5kaWYJCQkJLyogQUNQSV9GVVRVUkVfVVNBR0UgKi8KKwordW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICphY3BpX3V0X2NyZWF0ZV9jb250cm9sX3N0YXRlKHZvaWQpOworCit2b2lkIGFjcGlfdXRfZGVsZXRlX2dlbmVyaWNfc3RhdGUodW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICpzdGF0ZSk7CisKKy8qCisgKiB1dG1hdGgKKyAqLworYWNwaV9zdGF0dXMKK2FjcGlfdXRfZGl2aWRlKGFjcGlfaW50ZWdlciBpbl9kaXZpZGVuZCwKKwkgICAgICAgYWNwaV9pbnRlZ2VyIGluX2Rpdmlzb3IsCisJICAgICAgIGFjcGlfaW50ZWdlciAqIG91dF9xdW90aWVudCwgYWNwaV9pbnRlZ2VyICogb3V0X3JlbWFpbmRlcik7CisKK2FjcGlfc3RhdHVzCithY3BpX3V0X3Nob3J0X2RpdmlkZShhY3BpX2ludGVnZXIgaW5fZGl2aWRlbmQsCisJCSAgICAgdTMyIGRpdmlzb3IsCisJCSAgICAgYWNwaV9pbnRlZ2VyICogb3V0X3F1b3RpZW50LCB1MzIgKiBvdXRfcmVtYWluZGVyKTsKKworLyoKKyAqIHV0bWlzYworICovCitjb25zdCBjaGFyICphY3BpX3V0X3ZhbGlkYXRlX2V4Y2VwdGlvbihhY3BpX3N0YXR1cyBzdGF0dXMpOworCit1OCBhY3BpX3V0X2lzX2FtbF90YWJsZShzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKnRhYmxlKTsKKworYWNwaV9zdGF0dXMgYWNwaV91dF9hbGxvY2F0ZV9vd25lcl9pZChhY3BpX293bmVyX2lkICogb3duZXJfaWQpOworCit2b2lkIGFjcGlfdXRfcmVsZWFzZV9vd25lcl9pZChhY3BpX293bmVyX2lkICogb3duZXJfaWQpOworCithY3BpX3N0YXR1cworYWNwaV91dF93YWxrX3BhY2thZ2VfdHJlZSh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpzb3VyY2Vfb2JqZWN0LAorCQkJICB2b2lkICp0YXJnZXRfb2JqZWN0LAorCQkJICBhY3BpX3BrZ19jYWxsYmFjayB3YWxrX2NhbGxiYWNrLCB2b2lkICpjb250ZXh0KTsKKwordm9pZCBhY3BpX3V0X3N0cnVwcihjaGFyICpzcmNfc3RyaW5nKTsKKwordm9pZCBhY3BpX3V0X3ByaW50X3N0cmluZyhjaGFyICpzdHJpbmcsIHU4IG1heF9sZW5ndGgpOworCit1OCBhY3BpX3V0X3ZhbGlkX2FjcGlfbmFtZSh1MzIgbmFtZSk7CisKK2FjcGlfbmFtZSBhY3BpX3V0X3JlcGFpcl9uYW1lKGNoYXIgKm5hbWUpOworCit1OCBhY3BpX3V0X3ZhbGlkX2FjcGlfY2hhcihjaGFyIGNoYXJhY3RlciwgdTMyIHBvc2l0aW9uKTsKKworYWNwaV9zdGF0dXMKK2FjcGlfdXRfc3RydG91bDY0KGNoYXIgKnN0cmluZywgdTMyIGJhc2UsIGFjcGlfaW50ZWdlciAqIHJldF9pbnRlZ2VyKTsKKworLyogVmFsdWVzIGZvciBCYXNlIGFib3ZlICgxNj1IZXgsIDEwPURlY2ltYWwpICovCisKKyNkZWZpbmUgQUNQSV9BTllfQkFTRSAgICAgICAgMAorCit1MzIgYWNwaV91dF9kd29yZF9ieXRlX3N3YXAodTMyIHZhbHVlKTsKKwordm9pZCBhY3BpX3V0X3NldF9pbnRlZ2VyX3dpZHRoKHU4IHJldmlzaW9uKTsKKworI2lmZGVmIEFDUElfREVCVUdfT1VUUFVUCit2b2lkCithY3BpX3V0X2Rpc3BsYXlfaW5pdF9wYXRobmFtZSh1OCB0eXBlLAorCQkJICAgICAgc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm9ial9oYW5kbGUsCisJCQkgICAgICBjaGFyICpwYXRoKTsKKyNlbmRpZgorCisvKgorICogdXRyZXNyYworICovCithY3BpX3N0YXR1cworYWNwaV91dF93YWxrX2FtbF9yZXNvdXJjZXModTggKiBhbWwsCisJCQkgICBhY3BpX3NpemUgYW1sX2xlbmd0aCwKKwkJCSAgIGFjcGlfd2Fsa19hbWxfY2FsbGJhY2sgdXNlcl9mdW5jdGlvbiwKKwkJCSAgIHZvaWQgKipjb250ZXh0KTsKKworYWNwaV9zdGF0dXMgYWNwaV91dF92YWxpZGF0ZV9yZXNvdXJjZSh2b2lkICphbWwsIHU4ICogcmV0dXJuX2luZGV4KTsKKwordTMyIGFjcGlfdXRfZ2V0X2Rlc2NyaXB0b3JfbGVuZ3RoKHZvaWQgKmFtbCk7CisKK3UxNiBhY3BpX3V0X2dldF9yZXNvdXJjZV9sZW5ndGgodm9pZCAqYW1sKTsKKwordTggYWNwaV91dF9nZXRfcmVzb3VyY2VfaGVhZGVyX2xlbmd0aCh2b2lkICphbWwpOworCit1OCBhY3BpX3V0X2dldF9yZXNvdXJjZV90eXBlKHZvaWQgKmFtbCk7CisKK2FjcGlfc3RhdHVzCithY3BpX3V0X2dldF9yZXNvdXJjZV9lbmRfdGFnKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjLAorCQkJICAgICB1OCAqKiBlbmRfdGFnKTsKKworLyoKKyAqIHV0bXV0ZXggLSBtdXRleCBzdXBwb3J0CisgKi8KK2FjcGlfc3RhdHVzIGFjcGlfdXRfbXV0ZXhfaW5pdGlhbGl6ZSh2b2lkKTsKKwordm9pZCBhY3BpX3V0X211dGV4X3Rlcm1pbmF0ZSh2b2lkKTsKKworYWNwaV9zdGF0dXMgYWNwaV91dF9hY3F1aXJlX211dGV4KGFjcGlfbXV0ZXhfaGFuZGxlIG11dGV4X2lkKTsKKworYWNwaV9zdGF0dXMgYWNwaV91dF9yZWxlYXNlX211dGV4KGFjcGlfbXV0ZXhfaGFuZGxlIG11dGV4X2lkKTsKKworLyoKKyAqIHV0YWxsb2MgLSBtZW1vcnkgYWxsb2NhdGlvbiBhbmQgb2JqZWN0IGNhY2hpbmcKKyAqLworYWNwaV9zdGF0dXMgYWNwaV91dF9jcmVhdGVfY2FjaGVzKHZvaWQpOworCithY3BpX3N0YXR1cyBhY3BpX3V0X2RlbGV0ZV9jYWNoZXModm9pZCk7CisKK2FjcGlfc3RhdHVzIGFjcGlfdXRfdmFsaWRhdGVfYnVmZmVyKHN0cnVjdCBhY3BpX2J1ZmZlciAqYnVmZmVyKTsKKworYWNwaV9zdGF0dXMKK2FjcGlfdXRfaW5pdGlhbGl6ZV9idWZmZXIoc3RydWN0IGFjcGlfYnVmZmVyICpidWZmZXIsCisJCQkgIGFjcGlfc2l6ZSByZXF1aXJlZF9sZW5ndGgpOworCit2b2lkICphY3BpX3V0X2FsbG9jYXRlKGFjcGlfc2l6ZSBzaXplLAorCQkgICAgICAgdTMyIGNvbXBvbmVudCwgY29uc3QgY2hhciAqbW9kdWxlLCB1MzIgbGluZSk7CisKK3ZvaWQgKmFjcGlfdXRfYWxsb2NhdGVfemVyb2VkKGFjcGlfc2l6ZSBzaXplLAorCQkJICAgICAgdTMyIGNvbXBvbmVudCwgY29uc3QgY2hhciAqbW9kdWxlLCB1MzIgbGluZSk7CisKKyNpZmRlZiBBQ1BJX0RCR19UUkFDS19BTExPQ0FUSU9OUwordm9pZCAqYWNwaV91dF9hbGxvY2F0ZV9hbmRfdHJhY2soYWNwaV9zaXplIHNpemUsCisJCQkJIHUzMiBjb21wb25lbnQsIGNvbnN0IGNoYXIgKm1vZHVsZSwgdTMyIGxpbmUpOworCit2b2lkICphY3BpX3V0X2FsbG9jYXRlX3plcm9lZF9hbmRfdHJhY2soYWNwaV9zaXplIHNpemUsCisJCQkJCXUzMiBjb21wb25lbnQsCisJCQkJCWNvbnN0IGNoYXIgKm1vZHVsZSwgdTMyIGxpbmUpOworCit2b2lkCithY3BpX3V0X2ZyZWVfYW5kX3RyYWNrKHZvaWQgKmFkZHJlc3MsCisJCSAgICAgICB1MzIgY29tcG9uZW50LCBjb25zdCBjaGFyICptb2R1bGUsIHUzMiBsaW5lKTsKKworI2lmZGVmCUFDUElfRlVUVVJFX1VTQUdFCit2b2lkIGFjcGlfdXRfZHVtcF9hbGxvY2F0aW9uX2luZm8odm9pZCk7CisjZW5kaWYJCQkJLyogQUNQSV9GVVRVUkVfVVNBR0UgKi8KKwordm9pZCBhY3BpX3V0X2R1bXBfYWxsb2NhdGlvbnModTMyIGNvbXBvbmVudCwgY29uc3QgY2hhciAqbW9kdWxlKTsKKworYWNwaV9zdGF0dXMKK2FjcGlfdXRfY3JlYXRlX2xpc3QoY2hhciAqbGlzdF9uYW1lLAorCQkgICAgdTE2IG9iamVjdF9zaXplLCBzdHJ1Y3QgYWNwaV9tZW1vcnlfbGlzdCAqKnJldHVybl9jYWNoZSk7CisKKyNlbmRpZgorCisjZW5kaWYJCQkJLyogX0FDVVRJTFNfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL2FtbGNvZGUuaCBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvYW1sY29kZS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FjcGkvYW1sY29kZS5oCnJlbmFtZSB0byBkcml2ZXJzL2FjcGkvYWNwaWNhL2FtbGNvZGUuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL2FtbHJlc3JjLmggYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2FtbHJlc3JjLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYWNwaS9hbWxyZXNyYy5oCnJlbmFtZSB0byBkcml2ZXJzL2FjcGkvYWNwaWNhL2FtbHJlc3JjLmgKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvZHNmaWVsZC5jIGIvZHJpdmVycy9hY3BpL2FjcGljYS9kc2ZpZWxkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTNlMjdiYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvZHNmaWVsZC5jCkBAIC0wLDAgKzEsNjUwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogTW9kdWxlIE5hbWU6IGRzZmllbGQgLSBEaXNwYXRjaGVyIGZpZWxkIHJvdXRpbmVzCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwOCwgSW50ZWwgQ29ycC4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKKyAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIGF0IG1pbmltdW0gYSBkaXNjbGFpbWVyCisgKiAgICBzdWJzdGFudGlhbGx5IHNpbWlsYXIgdG8gdGhlICJOTyBXQVJSQU5UWSIgZGlzY2xhaW1lciBiZWxvdworICogICAgKCJEaXNjbGFpbWVyIikgYW5kIGFueSByZWRpc3RyaWJ1dGlvbiBtdXN0IGJlIGNvbmRpdGlvbmVkIHVwb24KKyAqICAgIGluY2x1ZGluZyBhIHN1YnN0YW50aWFsbHkgc2ltaWxhciBEaXNjbGFpbWVyIHJlcXVpcmVtZW50IGZvciBmdXJ0aGVyCisgKiAgICBiaW5hcnkgcmVkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMKKyAqICAgIG9mIGFueSBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogTk8gV0FSUkFOVFkKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HCisgKiBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KKyAqLworCisjaW5jbHVkZSA8YWNwaS9hY3BpLmg+CisjaW5jbHVkZSAiYWNjb21tb24uaCIKKyNpbmNsdWRlICJhbWxjb2RlLmgiCisjaW5jbHVkZSAiYWNkaXNwYXQuaCIKKyNpbmNsdWRlICJhY2ludGVycC5oIgorI2luY2x1ZGUgImFjbmFtZXNwLmgiCisjaW5jbHVkZSAiYWNwYXJzZXIuaCIKKworI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfRElTUEFUQ0hFUgorQUNQSV9NT0RVTEVfTkFNRSgiZHNmaWVsZCIpCisKKy8qIExvY2FsIHByb3RvdHlwZXMgKi8KK3N0YXRpYyBhY3BpX3N0YXR1cworYWNwaV9kc19nZXRfZmllbGRfbmFtZXMoc3RydWN0IGFjcGlfY3JlYXRlX2ZpZWxkX2luZm8gKmluZm8sCisJCQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlLAorCQkJdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKmFyZyk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfZHNfY3JlYXRlX2J1ZmZlcl9maWVsZAorICoKKyAqIFBBUkFNRVRFUlM6ICBPcCAgICAgICAgICAgICAgICAgIC0gQ3VycmVudCBwYXJzZSBvcCAoY3JlYXRlX3hYRmllbGQpCisgKiAgICAgICAgICAgICAgd2Fsa19zdGF0ZSAgICAgICAgICAtIEN1cnJlbnQgc3RhdGUKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IEV4ZWN1dGUgdGhlIGNyZWF0ZV9maWVsZCBvcGVyYXRvcnM6CisgKiAgICAgICAgICAgICAgY3JlYXRlX2JpdF9maWVsZF9vcCwKKyAqICAgICAgICAgICAgICBjcmVhdGVfYnl0ZV9maWVsZF9vcCwKKyAqICAgICAgICAgICAgICBjcmVhdGVfd29yZF9maWVsZF9vcCwKKyAqICAgICAgICAgICAgICBjcmVhdGVfZHdvcmRfZmllbGRfb3AsCisgKiAgICAgICAgICAgICAgY3JlYXRlX3F3b3JkX2ZpZWxkX29wLAorICogICAgICAgICAgICAgIGNyZWF0ZV9maWVsZF9vcCAgICAgKGFsbCBvZiB3aGljaCBkZWZpbmUgYSBmaWVsZCBpbiBhIGJ1ZmZlcikKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCithY3BpX3N0YXR1cworYWNwaV9kc19jcmVhdGVfYnVmZmVyX2ZpZWxkKHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpvcCwKKwkJCSAgICBzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKQoreworCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICphcmc7CisJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGU7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjOworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnNlY29uZF9kZXNjID0gTlVMTDsKKwl1MzIgZmxhZ3M7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGRzX2NyZWF0ZV9idWZmZXJfZmllbGQpOworCisJLyoKKwkgKiBHZXQgdGhlIG5hbWVfc3RyaW5nIGFyZ3VtZW50IChuYW1lIG9mIHRoZSBuZXcgYnVmZmVyX2ZpZWxkKQorCSAqLworCWlmIChvcC0+Y29tbW9uLmFtbF9vcGNvZGUgPT0gQU1MX0NSRUFURV9GSUVMRF9PUCkgeworCisJCS8qIEZvciBjcmVhdGVfZmllbGQsIG5hbWUgaXMgdGhlIDR0aCBhcmd1bWVudCAqLworCisJCWFyZyA9IGFjcGlfcHNfZ2V0X2FyZyhvcCwgMyk7CisJfSBlbHNlIHsKKwkJLyogRm9yIGFsbCBvdGhlciBjcmVhdGVfeFhYRmllbGQgb3BlcmF0b3JzLCBuYW1lIGlzIHRoZSAzcmQgYXJndW1lbnQgKi8KKworCQlhcmcgPSBhY3BpX3BzX2dldF9hcmcob3AsIDIpOworCX0KKworCWlmICghYXJnKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfTk9fT1BFUkFORCk7CisJfQorCisJaWYgKHdhbGtfc3RhdGUtPmRlZmVycmVkX25vZGUpIHsKKwkJbm9kZSA9IHdhbGtfc3RhdGUtPmRlZmVycmVkX25vZGU7CisJCXN0YXR1cyA9IEFFX09LOworCX0gZWxzZSB7CisJCS8qIEV4ZWN1dGUgZmxhZyBzaG91bGQgYWx3YXlzIGJlIHNldCB3aGVuIHRoaXMgZnVuY3Rpb24gaXMgZW50ZXJlZCAqLworCisJCWlmICghKHdhbGtfc3RhdGUtPnBhcnNlX2ZsYWdzICYgQUNQSV9QQVJTRV9FWEVDVVRFKSkgeworCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9JTlRFUk5BTCk7CisJCX0KKworCQkvKiBDcmVhdGluZyBuZXcgbmFtZXNwYWNlIG5vZGUsIHNob3VsZCBub3QgYWxyZWFkeSBleGlzdCAqLworCisJCWZsYWdzID0gQUNQSV9OU19OT19VUFNFQVJDSCB8IEFDUElfTlNfRE9OVF9PUEVOX1NDT1BFIHwKKwkJICAgIEFDUElfTlNfRVJST1JfSUZfRk9VTkQ7CisKKwkJLyogTWFyayBub2RlIHRlbXBvcmFyeSBpZiB3ZSBhcmUgZXhlY3V0aW5nIGEgbWV0aG9kICovCisKKwkJaWYgKHdhbGtfc3RhdGUtPm1ldGhvZF9ub2RlKSB7CisJCQlmbGFncyB8PSBBQ1BJX05TX1RFTVBPUkFSWTsKKwkJfQorCisJCS8qIEVudGVyIHRoZSBuYW1lX3N0cmluZyBpbnRvIHRoZSBuYW1lc3BhY2UgKi8KKworCQlzdGF0dXMgPQorCQkgICAgYWNwaV9uc19sb29rdXAod2Fsa19zdGF0ZS0+c2NvcGVfaW5mbywKKwkJCQkgICBhcmctPmNvbW1vbi52YWx1ZS5zdHJpbmcsIEFDUElfVFlQRV9BTlksCisJCQkJICAgQUNQSV9JTU9ERV9MT0FEX1BBU1MxLCBmbGFncywgd2Fsa19zdGF0ZSwKKwkJCQkgICAmbm9kZSk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJQUNQSV9FUlJPUl9OQU1FU1BBQ0UoYXJnLT5jb21tb24udmFsdWUuc3RyaW5nLCBzdGF0dXMpOworCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CisJCX0KKwl9CisKKwkvKgorCSAqIFdlIGNvdWxkIHB1dCB0aGUgcmV0dXJuZWQgb2JqZWN0IChOb2RlKSBvbiB0aGUgb2JqZWN0IHN0YWNrIGZvciBsYXRlciwKKwkgKiBidXQgZm9yIG5vdywgd2Ugd2lsbCBwdXQgaXQgaW4gdGhlICJvcCIgb2JqZWN0IHRoYXQgdGhlIHBhcnNlciB1c2VzLAorCSAqIHNvIHdlIGNhbiBnZXQgaXQgYWdhaW4gYXQgdGhlIGVuZCBvZiB0aGlzIHNjb3BlLgorCSAqLworCW9wLT5jb21tb24ubm9kZSA9IG5vZGU7CisKKwkvKgorCSAqIElmIHRoZXJlIGlzIG5vIG9iamVjdCBhdHRhY2hlZCB0byB0aGUgbm9kZSwgdGhpcyBub2RlIHdhcyBqdXN0IGNyZWF0ZWQKKwkgKiBhbmQgd2UgbmVlZCB0byBjcmVhdGUgdGhlIGZpZWxkIG9iamVjdC4gT3RoZXJ3aXNlLCB0aGlzIHdhcyBhIGxvb2t1cAorCSAqIG9mIGFuIGV4aXN0aW5nIG5vZGUgYW5kIHdlIGRvbid0IHdhbnQgdG8gY3JlYXRlIHRoZSBmaWVsZCBvYmplY3QgYWdhaW4uCisJICovCisJb2JqX2Rlc2MgPSBhY3BpX25zX2dldF9hdHRhY2hlZF9vYmplY3Qobm9kZSk7CisJaWYgKG9ial9kZXNjKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CisJfQorCisJLyoKKwkgKiBUaGUgRmllbGQgZGVmaW5pdGlvbiBpcyBub3QgZnVsbHkgcGFyc2VkIGF0IHRoaXMgdGltZS4KKwkgKiAoV2UgbXVzdCBzYXZlIHRoZSBhZGRyZXNzIG9mIHRoZSBBTUwgZm9yIHRoZSBidWZmZXIgYW5kIGluZGV4IG9wZXJhbmRzKQorCSAqLworCisJLyogQ3JlYXRlIHRoZSBidWZmZXIgZmllbGQgb2JqZWN0ICovCisKKwlvYmpfZGVzYyA9IGFjcGlfdXRfY3JlYXRlX2ludGVybmFsX29iamVjdChBQ1BJX1RZUEVfQlVGRkVSX0ZJRUxEKTsKKwlpZiAoIW9ial9kZXNjKSB7CisJCXN0YXR1cyA9IEFFX05PX01FTU9SWTsKKwkJZ290byBjbGVhbnVwOworCX0KKworCS8qCisJICogUmVtZW1iZXIgbG9jYXRpb24gaW4gQU1MIHN0cmVhbSBvZiB0aGUgZmllbGQgdW5pdCBvcGNvZGUgYW5kIG9wZXJhbmRzIC0tCisJICogc2luY2UgdGhlIGJ1ZmZlciBhbmQgaW5kZXggb3BlcmFuZHMgbXVzdCBiZSBldmFsdWF0ZWQuCisJICovCisJc2Vjb25kX2Rlc2MgPSBvYmpfZGVzYy0+Y29tbW9uLm5leHRfb2JqZWN0OworCXNlY29uZF9kZXNjLT5leHRyYS5hbWxfc3RhcnQgPSBvcC0+bmFtZWQuZGF0YTsKKwlzZWNvbmRfZGVzYy0+ZXh0cmEuYW1sX2xlbmd0aCA9IG9wLT5uYW1lZC5sZW5ndGg7CisJb2JqX2Rlc2MtPmJ1ZmZlcl9maWVsZC5ub2RlID0gbm9kZTsKKworCS8qIEF0dGFjaCBjb25zdHJ1Y3RlZCBmaWVsZCBkZXNjcmlwdG9ycyB0byBwYXJlbnQgbm9kZSAqLworCisJc3RhdHVzID0gYWNwaV9uc19hdHRhY2hfb2JqZWN0KG5vZGUsIG9ial9kZXNjLCBBQ1BJX1RZUEVfQlVGRkVSX0ZJRUxEKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJZ290byBjbGVhbnVwOworCX0KKworICAgICAgY2xlYW51cDoKKworCS8qIFJlbW92ZSBsb2NhbCByZWZlcmVuY2UgdG8gdGhlIG9iamVjdCAqLworCisJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKG9ial9kZXNjKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9kc19nZXRfZmllbGRfbmFtZXMKKyAqCisgKiBQQVJBTUVURVJTOiAgSW5mbyAgICAgICAgICAgIC0gY3JlYXRlX2ZpZWxkIGluZm8gc3RydWN0dXJlCisgKiAgYCAgICAgICAgICAgd2Fsa19zdGF0ZSAgICAgIC0gQ3VycmVudCBtZXRob2Qgc3RhdGUKKyAqICAgICAgICAgICAgICBBcmcgICAgICAgICAgICAgLSBGaXJzdCBwYXJzZXIgYXJnIGZvciB0aGUgZmllbGQgbmFtZSBsaXN0CisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBQcm9jZXNzIGFsbCBuYW1lZCBmaWVsZHMgaW4gYSBmaWVsZCBkZWNsYXJhdGlvbi4gIE5hbWVzIGFyZQorICogICAgICAgICAgICAgIGVudGVyZWQgaW50byB0aGUgbmFtZXNwYWNlLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBhY3BpX3N0YXR1cworYWNwaV9kc19nZXRfZmllbGRfbmFtZXMoc3RydWN0IGFjcGlfY3JlYXRlX2ZpZWxkX2luZm8gKmluZm8sCisJCQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlLAorCQkJdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKmFyZykKK3sKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJYWNwaV9pbnRlZ2VyIHBvc2l0aW9uOworCisJQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIoZHNfZ2V0X2ZpZWxkX25hbWVzLCBpbmZvKTsKKworCS8qIEZpcnN0IGZpZWxkIHN0YXJ0cyBhdCBiaXQgemVybyAqLworCisJaW5mby0+ZmllbGRfYml0X3Bvc2l0aW9uID0gMDsKKworCS8qIFByb2Nlc3MgYWxsIGVsZW1lbnRzIGluIHRoZSBmaWVsZCBsaXN0IChvZiBwYXJzZSBub2RlcykgKi8KKworCXdoaWxlIChhcmcpIHsKKwkJLyoKKwkJICogVGhyZWUgdHlwZXMgb2YgZmllbGQgZWxlbWVudHMgYXJlIGhhbmRsZWQ6CisJCSAqIDEpIE9mZnNldCAtIHNwZWNpZmllcyBhIGJpdCBvZmZzZXQKKwkJICogMikgYWNjZXNzX2FzIC0gY2hhbmdlcyB0aGUgYWNjZXNzIG1vZGUKKwkJICogMykgTmFtZSAtIEVudGVycyBhIG5ldyBuYW1lZCBmaWVsZCBpbnRvIHRoZSBuYW1lc3BhY2UKKwkJICovCisJCXN3aXRjaCAoYXJnLT5jb21tb24uYW1sX29wY29kZSkgeworCQljYXNlIEFNTF9JTlRfUkVTRVJWRURGSUVMRF9PUDoKKworCQkJcG9zaXRpb24gPSAoYWNwaV9pbnRlZ2VyKSBpbmZvLT5maWVsZF9iaXRfcG9zaXRpb24KKwkJCSAgICArIChhY3BpX2ludGVnZXIpIGFyZy0+Y29tbW9uLnZhbHVlLnNpemU7CisKKwkJCWlmIChwb3NpdGlvbiA+IEFDUElfVUlOVDMyX01BWCkgeworCQkJCUFDUElfRVJST1IoKEFFX0lORk8sCisJCQkJCSAgICAiQml0IG9mZnNldCB3aXRoaW4gZmllbGQgdG9vIGxhcmdlICg+IDB4RkZGRkZGRkYpIikpOworCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9TVVBQT1JUKTsKKwkJCX0KKworCQkJaW5mby0+ZmllbGRfYml0X3Bvc2l0aW9uID0gKHUzMikgcG9zaXRpb247CisJCQlicmVhazsKKworCQljYXNlIEFNTF9JTlRfQUNDRVNTRklFTERfT1A6CisKKwkJCS8qCisJCQkgKiBHZXQgYSBuZXcgYWNjZXNzX3R5cGUgYW5kIGFjY2Vzc19hdHRyaWJ1dGUgLS0gdG8gYmUgdXNlZCBmb3IgYWxsCisJCQkgKiBmaWVsZCB1bml0cyB0aGF0IGZvbGxvdywgdW50aWwgZmllbGQgZW5kIG9yIGFub3RoZXIgYWNjZXNzX2FzCisJCQkgKiBrZXl3b3JkLgorCQkJICoKKwkJCSAqIEluIGZpZWxkX2ZsYWdzLCBwcmVzZXJ2ZSB0aGUgZmxhZyBiaXRzIG90aGVyIHRoYW4gdGhlCisJCQkgKiBBQ0NFU1NfVFlQRSBiaXRzCisJCQkgKi8KKwkJCWluZm8tPmZpZWxkX2ZsYWdzID0gKHU4KQorCQkJICAgICgoaW5mby0+CisJCQkgICAgICBmaWVsZF9mbGFncyAmIH4oQU1MX0ZJRUxEX0FDQ0VTU19UWVBFX01BU0spKSB8CisJCQkgICAgICgodTgpICgodTMyKSBhcmctPmNvbW1vbi52YWx1ZS5pbnRlZ2VyID4+IDgpKSk7CisKKwkJCWluZm8tPmF0dHJpYnV0ZSA9ICh1OCkgKGFyZy0+Y29tbW9uLnZhbHVlLmludGVnZXIpOworCQkJYnJlYWs7CisKKwkJY2FzZSBBTUxfSU5UX05BTUVERklFTERfT1A6CisKKwkJCS8qIExvb2t1cCB0aGUgbmFtZSwgaXQgc2hvdWxkIGFscmVhZHkgZXhpc3QgKi8KKworCQkJc3RhdHVzID0gYWNwaV9uc19sb29rdXAod2Fsa19zdGF0ZS0+c2NvcGVfaW5mbywKKwkJCQkJCShjaGFyICopJmFyZy0+bmFtZWQubmFtZSwKKwkJCQkJCWluZm8tPmZpZWxkX3R5cGUsCisJCQkJCQlBQ1BJX0lNT0RFX0VYRUNVVEUsCisJCQkJCQlBQ1BJX05TX0RPTlRfT1BFTl9TQ09QRSwKKwkJCQkJCXdhbGtfc3RhdGUsICZpbmZvLT5maWVsZF9ub2RlKTsKKwkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJCUFDUElfRVJST1JfTkFNRVNQQUNFKChjaGFyICopJmFyZy0+bmFtZWQubmFtZSwKKwkJCQkJCSAgICAgc3RhdHVzKTsKKwkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKKwkJCX0gZWxzZSB7CisJCQkJYXJnLT5jb21tb24ubm9kZSA9IGluZm8tPmZpZWxkX25vZGU7CisJCQkJaW5mby0+ZmllbGRfYml0X2xlbmd0aCA9IGFyZy0+Y29tbW9uLnZhbHVlLnNpemU7CisKKwkJCQkvKgorCQkJCSAqIElmIHRoZXJlIGlzIG5vIG9iamVjdCBhdHRhY2hlZCB0byB0aGUgbm9kZSwgdGhpcyBub2RlIHdhcworCQkJCSAqIGp1c3QgY3JlYXRlZCBhbmQgd2UgbmVlZCB0byBjcmVhdGUgdGhlIGZpZWxkIG9iamVjdC4KKwkJCQkgKiBPdGhlcndpc2UsIHRoaXMgd2FzIGEgbG9va3VwIG9mIGFuIGV4aXN0aW5nIG5vZGUgYW5kIHdlCisJCQkJICogZG9uJ3Qgd2FudCB0byBjcmVhdGUgdGhlIGZpZWxkIG9iamVjdCBhZ2Fpbi4KKwkJCQkgKi8KKwkJCQlpZiAoIWFjcGlfbnNfZ2V0X2F0dGFjaGVkX29iamVjdAorCQkJCSAgICAoaW5mby0+ZmllbGRfbm9kZSkpIHsKKwkJCQkJc3RhdHVzID0gYWNwaV9leF9wcmVwX2ZpZWxkX3ZhbHVlKGluZm8pOworCQkJCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworCQkJCQl9CisJCQkJfQorCQkJfQorCisJCQkvKiBLZWVwIHRyYWNrIG9mIGJpdCBwb3NpdGlvbiBmb3IgdGhlIG5leHQgZmllbGQgKi8KKworCQkJcG9zaXRpb24gPSAoYWNwaV9pbnRlZ2VyKSBpbmZvLT5maWVsZF9iaXRfcG9zaXRpb24KKwkJCSAgICArIChhY3BpX2ludGVnZXIpIGFyZy0+Y29tbW9uLnZhbHVlLnNpemU7CisKKwkJCWlmIChwb3NpdGlvbiA+IEFDUElfVUlOVDMyX01BWCkgeworCQkJCUFDUElfRVJST1IoKEFFX0lORk8sCisJCQkJCSAgICAiRmllbGQgWyU0LjRzXSBiaXQgb2Zmc2V0IHRvbyBsYXJnZSAoPiAweEZGRkZGRkZGKSIsCisJCQkJCSAgICBBQ1BJX0NBU1RfUFRSKGNoYXIsCisJCQkJCQkJICAmaW5mby0+ZmllbGRfbm9kZS0+CisJCQkJCQkJICBuYW1lKSkpOworCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9TVVBQT1JUKTsKKwkJCX0KKworCQkJaW5mby0+ZmllbGRfYml0X3Bvc2l0aW9uICs9IGluZm8tPmZpZWxkX2JpdF9sZW5ndGg7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCisJCQlBQ1BJX0VSUk9SKChBRV9JTkZPLAorCQkJCSAgICAiSW52YWxpZCBvcGNvZGUgaW4gZmllbGQgbGlzdDogJVgiLAorCQkJCSAgICBhcmctPmNvbW1vbi5hbWxfb3Bjb2RlKSk7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX0JBRF9PUENPREUpOworCQl9CisKKwkJYXJnID0gYXJnLT5jb21tb24ubmV4dDsKKwl9CisKKwlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX2RzX2NyZWF0ZV9maWVsZAorICoKKyAqIFBBUkFNRVRFUlM6ICBPcCAgICAgICAgICAgICAgLSBPcCBjb250YWluaW5nIHRoZSBGaWVsZCBkZWZpbml0aW9uIGFuZCBhcmdzCisgKiAgICAgICAgICAgICAgcmVnaW9uX25vZGUgICAgIC0gT2JqZWN0IGZvciB0aGUgY29udGFpbmluZyBPcGVyYXRpb24gUmVnaW9uCisgKiAgYCAgICAgICAgICAgd2Fsa19zdGF0ZSAgICAgIC0gQ3VycmVudCBtZXRob2Qgc3RhdGUKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IENyZWF0ZSBhIG5ldyBmaWVsZCBpbiB0aGUgc3BlY2lmaWVkIG9wZXJhdGlvbiByZWdpb24KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCithY3BpX3N0YXR1cworYWNwaV9kc19jcmVhdGVfZmllbGQodW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKm9wLAorCQkgICAgIHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpyZWdpb25fbm9kZSwKKwkJICAgICBzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKQoreworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqYXJnOworCXN0cnVjdCBhY3BpX2NyZWF0ZV9maWVsZF9pbmZvIGluZm87CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUihkc19jcmVhdGVfZmllbGQsIG9wKTsKKworCS8qIEZpcnN0IGFyZyBpcyB0aGUgbmFtZSBvZiB0aGUgcGFyZW50IG9wX3JlZ2lvbiAobXVzdCBhbHJlYWR5IGV4aXN0KSAqLworCisJYXJnID0gb3AtPmNvbW1vbi52YWx1ZS5hcmc7CisJaWYgKCFyZWdpb25fbm9kZSkgeworCQlzdGF0dXMgPQorCQkgICAgYWNwaV9uc19sb29rdXAod2Fsa19zdGF0ZS0+c2NvcGVfaW5mbywKKwkJCQkgICBhcmctPmNvbW1vbi52YWx1ZS5uYW1lLCBBQ1BJX1RZUEVfUkVHSU9OLAorCQkJCSAgIEFDUElfSU1PREVfRVhFQ1VURSwgQUNQSV9OU19TRUFSQ0hfUEFSRU5ULAorCQkJCSAgIHdhbGtfc3RhdGUsICZyZWdpb25fbm9kZSk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJQUNQSV9FUlJPUl9OQU1FU1BBQ0UoYXJnLT5jb21tb24udmFsdWUubmFtZSwgc3RhdHVzKTsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworCQl9CisJfQorCisJLyogU2Vjb25kIGFyZyBpcyB0aGUgZmllbGQgZmxhZ3MgKi8KKworCWFyZyA9IGFyZy0+Y29tbW9uLm5leHQ7CisJaW5mby5maWVsZF9mbGFncyA9ICh1OCkgYXJnLT5jb21tb24udmFsdWUuaW50ZWdlcjsKKwlpbmZvLmF0dHJpYnV0ZSA9IDA7CisKKwkvKiBFYWNoIHJlbWFpbmluZyBhcmcgaXMgYSBOYW1lZCBGaWVsZCAqLworCisJaW5mby5maWVsZF90eXBlID0gQUNQSV9UWVBFX0xPQ0FMX1JFR0lPTl9GSUVMRDsKKwlpbmZvLnJlZ2lvbl9ub2RlID0gcmVnaW9uX25vZGU7CisKKwlzdGF0dXMgPSBhY3BpX2RzX2dldF9maWVsZF9uYW1lcygmaW5mbywgd2Fsa19zdGF0ZSwgYXJnLT5jb21tb24ubmV4dCk7CisKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9kc19pbml0X2ZpZWxkX29iamVjdHMKKyAqCisgKiBQQVJBTUVURVJTOiAgT3AgICAgICAgICAgICAgIC0gT3AgY29udGFpbmluZyB0aGUgRmllbGQgZGVmaW5pdGlvbiBhbmQgYXJncworICogIGAgICAgICAgICAgIHdhbGtfc3RhdGUgICAgICAtIEN1cnJlbnQgbWV0aG9kIHN0YXRlCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBGb3IgZWFjaCAiRmllbGQgVW5pdCIgbmFtZSBpbiB0aGUgYXJndW1lbnQgbGlzdCB0aGF0IGlzCisgKiAgICAgICAgICAgICAgcGFydCBvZiB0aGUgZmllbGQgZGVjbGFyYXRpb24sIGVudGVyIHRoZSBuYW1lIGludG8gdGhlCisgKiAgICAgICAgICAgICAgbmFtZXNwYWNlLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2FjcGlfc3RhdHVzCithY3BpX2RzX2luaXRfZmllbGRfb2JqZWN0cyh1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqb3AsCisJCQkgICBzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKQoreworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqYXJnID0gTlVMTDsKKwlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZTsKKwl1OCB0eXBlID0gMDsKKwl1MzIgZmxhZ3M7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUihkc19pbml0X2ZpZWxkX29iamVjdHMsIG9wKTsKKworCS8qIEV4ZWN1dGUgZmxhZyBzaG91bGQgYWx3YXlzIGJlIHNldCB3aGVuIHRoaXMgZnVuY3Rpb24gaXMgZW50ZXJlZCAqLworCisJaWYgKCEod2Fsa19zdGF0ZS0+cGFyc2VfZmxhZ3MgJiBBQ1BJX1BBUlNFX0VYRUNVVEUpKSB7CisJCWlmICh3YWxrX3N0YXRlLT5wYXJzZV9mbGFncyAmIEFDUElfUEFSU0VfREVGRVJSRURfT1ApIHsKKworCQkJLyogYmFua19maWVsZCBPcCBpcyBkZWZlcnJlZCwganVzdCByZXR1cm4gT0sgKi8KKworCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKKwkJfQorCisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfSU5URVJOQUwpOworCX0KKworCS8qCisJICogR2V0IHRoZSBmaWVsZF9saXN0IGFyZ3VtZW50IGZvciB0aGlzIG9wY29kZS4gVGhpcyBpcyB0aGUgc3RhcnQgb2YgdGhlCisJICogbGlzdCBvZiBmaWVsZCBlbGVtZW50cy4KKwkgKi8KKwlzd2l0Y2ggKHdhbGtfc3RhdGUtPm9wY29kZSkgeworCWNhc2UgQU1MX0ZJRUxEX09QOgorCQlhcmcgPSBhY3BpX3BzX2dldF9hcmcob3AsIDIpOworCQl0eXBlID0gQUNQSV9UWVBFX0xPQ0FMX1JFR0lPTl9GSUVMRDsKKwkJYnJlYWs7CisKKwljYXNlIEFNTF9CQU5LX0ZJRUxEX09QOgorCQlhcmcgPSBhY3BpX3BzX2dldF9hcmcob3AsIDQpOworCQl0eXBlID0gQUNQSV9UWVBFX0xPQ0FMX0JBTktfRklFTEQ7CisJCWJyZWFrOworCisJY2FzZSBBTUxfSU5ERVhfRklFTERfT1A6CisJCWFyZyA9IGFjcGlfcHNfZ2V0X2FyZyhvcCwgMyk7CisJCXR5cGUgPSBBQ1BJX1RZUEVfTE9DQUxfSU5ERVhfRklFTEQ7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9QQVJBTUVURVIpOworCX0KKworCS8qIENyZWF0aW5nIG5ldyBuYW1lc3BhY2Ugbm9kZShzKSwgc2hvdWxkIG5vdCBhbHJlYWR5IGV4aXN0ICovCisKKwlmbGFncyA9IEFDUElfTlNfTk9fVVBTRUFSQ0ggfCBBQ1BJX05TX0RPTlRfT1BFTl9TQ09QRSB8CisJICAgIEFDUElfTlNfRVJST1JfSUZfRk9VTkQ7CisKKwkvKiBNYXJrIG5vZGUocykgdGVtcG9yYXJ5IGlmIHdlIGFyZSBleGVjdXRpbmcgYSBtZXRob2QgKi8KKworCWlmICh3YWxrX3N0YXRlLT5tZXRob2Rfbm9kZSkgeworCQlmbGFncyB8PSBBQ1BJX05TX1RFTVBPUkFSWTsKKwl9CisKKwkvKgorCSAqIFdhbGsgdGhlIGxpc3Qgb2YgZW50cmllcyBpbiB0aGUgZmllbGRfbGlzdAorCSAqIE5vdGU6IGZpZWxkX2xpc3QgY2FuIGJlIG9mIHplcm8gbGVuZ3RoLiBJbiB0aGlzIGNhc2UsIEFyZyB3aWxsIGJlIE5VTEwuCisJICovCisJd2hpbGUgKGFyZykgeworCQkvKgorCQkgKiBJZ25vcmUgT0ZGU0VUIGFuZCBBQ0NFU1NBUyB0ZXJtcyBoZXJlOyB3ZSBhcmUgb25seSBpbnRlcmVzdGVkIGluIHRoZQorCQkgKiBmaWVsZCBuYW1lcyBpbiBvcmRlciB0byBlbnRlciB0aGVtIGludG8gdGhlIG5hbWVzcGFjZS4KKwkJICovCisJCWlmIChhcmctPmNvbW1vbi5hbWxfb3Bjb2RlID09IEFNTF9JTlRfTkFNRURGSUVMRF9PUCkgeworCQkJc3RhdHVzID0gYWNwaV9uc19sb29rdXAod2Fsa19zdGF0ZS0+c2NvcGVfaW5mbywKKwkJCQkJCShjaGFyICopJmFyZy0+bmFtZWQubmFtZSwgdHlwZSwKKwkJCQkJCUFDUElfSU1PREVfTE9BRF9QQVNTMSwgZmxhZ3MsCisJCQkJCQl3YWxrX3N0YXRlLCAmbm9kZSk7CisJCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCQlBQ1BJX0VSUk9SX05BTUVTUEFDRSgoY2hhciAqKSZhcmctPm5hbWVkLm5hbWUsCisJCQkJCQkgICAgIHN0YXR1cyk7CisJCQkJaWYgKHN0YXR1cyAhPSBBRV9BTFJFQURZX0VYSVNUUykgeworCQkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKKwkJCQl9CisKKwkJCQkvKiBOYW1lIGFscmVhZHkgZXhpc3RzLCBqdXN0IGlnbm9yZSB0aGlzIGVycm9yICovCisKKwkJCQlzdGF0dXMgPSBBRV9PSzsKKwkJCX0KKworCQkJYXJnLT5jb21tb24ubm9kZSA9IG5vZGU7CisJCX0KKworCQkvKiBHZXQgdGhlIG5leHQgZmllbGQgZWxlbWVudCBpbiB0aGUgbGlzdCAqLworCisJCWFyZyA9IGFyZy0+Y29tbW9uLm5leHQ7CisJfQorCisJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9kc19jcmVhdGVfYmFua19maWVsZAorICoKKyAqIFBBUkFNRVRFUlM6ICBPcCAgICAgICAgICAgICAgLSBPcCBjb250YWluaW5nIHRoZSBGaWVsZCBkZWZpbml0aW9uIGFuZCBhcmdzCisgKiAgICAgICAgICAgICAgcmVnaW9uX25vZGUgICAgIC0gT2JqZWN0IGZvciB0aGUgY29udGFpbmluZyBPcGVyYXRpb24gUmVnaW9uCisgKiAgICAgICAgICAgICAgd2Fsa19zdGF0ZSAgICAgIC0gQ3VycmVudCBtZXRob2Qgc3RhdGUKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IENyZWF0ZSBhIG5ldyBiYW5rIGZpZWxkIGluIHRoZSBzcGVjaWZpZWQgb3BlcmF0aW9uIHJlZ2lvbgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2FjcGlfc3RhdHVzCithY3BpX2RzX2NyZWF0ZV9iYW5rX2ZpZWxkKHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpvcCwKKwkJCSAgc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKnJlZ2lvbl9ub2RlLAorCQkJICBzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKQoreworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqYXJnOworCXN0cnVjdCBhY3BpX2NyZWF0ZV9maWVsZF9pbmZvIGluZm87CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUihkc19jcmVhdGVfYmFua19maWVsZCwgb3ApOworCisJLyogRmlyc3QgYXJnIGlzIHRoZSBuYW1lIG9mIHRoZSBwYXJlbnQgb3BfcmVnaW9uIChtdXN0IGFscmVhZHkgZXhpc3QpICovCisKKwlhcmcgPSBvcC0+Y29tbW9uLnZhbHVlLmFyZzsKKwlpZiAoIXJlZ2lvbl9ub2RlKSB7CisJCXN0YXR1cyA9CisJCSAgICBhY3BpX25zX2xvb2t1cCh3YWxrX3N0YXRlLT5zY29wZV9pbmZvLAorCQkJCSAgIGFyZy0+Y29tbW9uLnZhbHVlLm5hbWUsIEFDUElfVFlQRV9SRUdJT04sCisJCQkJICAgQUNQSV9JTU9ERV9FWEVDVVRFLCBBQ1BJX05TX1NFQVJDSF9QQVJFTlQsCisJCQkJICAgd2Fsa19zdGF0ZSwgJnJlZ2lvbl9ub2RlKTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQlBQ1BJX0VSUk9SX05BTUVTUEFDRShhcmctPmNvbW1vbi52YWx1ZS5uYW1lLCBzdGF0dXMpOworCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CisJCX0KKwl9CisKKwkvKiBTZWNvbmQgYXJnIGlzIHRoZSBCYW5rIFJlZ2lzdGVyIChGaWVsZCkgKG11c3QgYWxyZWFkeSBleGlzdCkgKi8KKworCWFyZyA9IGFyZy0+Y29tbW9uLm5leHQ7CisJc3RhdHVzID0KKwkgICAgYWNwaV9uc19sb29rdXAod2Fsa19zdGF0ZS0+c2NvcGVfaW5mbywgYXJnLT5jb21tb24udmFsdWUuc3RyaW5nLAorCQkJICAgQUNQSV9UWVBFX0FOWSwgQUNQSV9JTU9ERV9FWEVDVVRFLAorCQkJICAgQUNQSV9OU19TRUFSQ0hfUEFSRU5ULCB3YWxrX3N0YXRlLAorCQkJICAgJmluZm8ucmVnaXN0ZXJfbm9kZSk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCUFDUElfRVJST1JfTkFNRVNQQUNFKGFyZy0+Y29tbW9uLnZhbHVlLnN0cmluZywgc3RhdHVzKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CisJfQorCisJLyoKKwkgKiBUaGlyZCBhcmcgaXMgdGhlIGJhbmtfdmFsdWUKKwkgKiBUaGlzIGFyZyBpcyBhIHRlcm1fYXJnLCBub3QgYSBjb25zdGFudAorCSAqIEl0IHdpbGwgYmUgZXZhbHVhdGVkIGxhdGVyLCBieSBhY3BpX2RzX2V2YWxfYmFua19maWVsZF9vcGVyYW5kcworCSAqLworCWFyZyA9IGFyZy0+Y29tbW9uLm5leHQ7CisKKwkvKiBGb3VydGggYXJnIGlzIHRoZSBmaWVsZCBmbGFncyAqLworCisJYXJnID0gYXJnLT5jb21tb24ubmV4dDsKKwlpbmZvLmZpZWxkX2ZsYWdzID0gKHU4KSBhcmctPmNvbW1vbi52YWx1ZS5pbnRlZ2VyOworCisJLyogRWFjaCByZW1haW5pbmcgYXJnIGlzIGEgTmFtZWQgRmllbGQgKi8KKworCWluZm8uZmllbGRfdHlwZSA9IEFDUElfVFlQRV9MT0NBTF9CQU5LX0ZJRUxEOworCWluZm8ucmVnaW9uX25vZGUgPSByZWdpb25fbm9kZTsKKworCS8qCisJICogVXNlIEluZm8uZGF0YV9yZWdpc3Rlcl9ub2RlIHRvIHN0b3JlIGJhbmtfZmllbGQgT3AKKwkgKiBJdCdzIHNhZmUgYmVjYXVzZSBkYXRhX3JlZ2lzdGVyX25vZGUgd2lsbCBuZXZlciBiZSB1c2VkIHdoZW4gY3JlYXRlIGJhbmsgZmllbGQKKwkgKiBXZSBzdG9yZSBhbWxfc3RhcnQgYW5kIGFtbF9sZW5ndGggaW4gdGhlIGJhbmtfZmllbGQgT3AgZm9yIGxhdGUgZXZhbHVhdGlvbgorCSAqIFVzZWQgaW4gYWNwaV9leF9wcmVwX2ZpZWxkX3ZhbHVlKEluZm8pCisJICoKKwkgKiBUQkQ6IE9yLCBzaG91bGQgd2UgYWRkIGEgZmllbGQgaW4gc3RydWN0IGFjcGlfY3JlYXRlX2ZpZWxkX2luZm8sIGxpa2UgInZvaWQgKlBhcmVudE9wIj8KKwkgKi8KKwlpbmZvLmRhdGFfcmVnaXN0ZXJfbm9kZSA9IChzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqKW9wOworCisJc3RhdHVzID0gYWNwaV9kc19nZXRfZmllbGRfbmFtZXMoJmluZm8sIHdhbGtfc3RhdGUsIGFyZy0+Y29tbW9uLm5leHQpOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX2RzX2NyZWF0ZV9pbmRleF9maWVsZAorICoKKyAqIFBBUkFNRVRFUlM6ICBPcCAgICAgICAgICAgICAgLSBPcCBjb250YWluaW5nIHRoZSBGaWVsZCBkZWZpbml0aW9uIGFuZCBhcmdzCisgKiAgICAgICAgICAgICAgcmVnaW9uX25vZGUgICAgIC0gT2JqZWN0IGZvciB0aGUgY29udGFpbmluZyBPcGVyYXRpb24gUmVnaW9uCisgKiAgYCAgICAgICAgICAgd2Fsa19zdGF0ZSAgICAgIC0gQ3VycmVudCBtZXRob2Qgc3RhdGUKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IENyZWF0ZSBhIG5ldyBpbmRleCBmaWVsZCBpbiB0aGUgc3BlY2lmaWVkIG9wZXJhdGlvbiByZWdpb24KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCithY3BpX3N0YXR1cworYWNwaV9kc19jcmVhdGVfaW5kZXhfZmllbGQodW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKm9wLAorCQkJICAgc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKnJlZ2lvbl9ub2RlLAorCQkJICAgc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSkKK3sKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKmFyZzsKKwlzdHJ1Y3QgYWNwaV9jcmVhdGVfZmllbGRfaW5mbyBpbmZvOworCisJQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIoZHNfY3JlYXRlX2luZGV4X2ZpZWxkLCBvcCk7CisKKwkvKiBGaXJzdCBhcmcgaXMgdGhlIG5hbWUgb2YgdGhlIEluZGV4IHJlZ2lzdGVyIChtdXN0IGFscmVhZHkgZXhpc3QpICovCisKKwlhcmcgPSBvcC0+Y29tbW9uLnZhbHVlLmFyZzsKKwlzdGF0dXMgPQorCSAgICBhY3BpX25zX2xvb2t1cCh3YWxrX3N0YXRlLT5zY29wZV9pbmZvLCBhcmctPmNvbW1vbi52YWx1ZS5zdHJpbmcsCisJCQkgICBBQ1BJX1RZUEVfQU5ZLCBBQ1BJX0lNT0RFX0VYRUNVVEUsCisJCQkgICBBQ1BJX05TX1NFQVJDSF9QQVJFTlQsIHdhbGtfc3RhdGUsCisJCQkgICAmaW5mby5yZWdpc3Rlcl9ub2RlKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJQUNQSV9FUlJPUl9OQU1FU1BBQ0UoYXJnLT5jb21tb24udmFsdWUuc3RyaW5nLCBzdGF0dXMpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKKwl9CisKKwkvKiBTZWNvbmQgYXJnIGlzIHRoZSBkYXRhIHJlZ2lzdGVyIChtdXN0IGFscmVhZHkgZXhpc3QpICovCisKKwlhcmcgPSBhcmctPmNvbW1vbi5uZXh0OworCXN0YXR1cyA9CisJICAgIGFjcGlfbnNfbG9va3VwKHdhbGtfc3RhdGUtPnNjb3BlX2luZm8sIGFyZy0+Y29tbW9uLnZhbHVlLnN0cmluZywKKwkJCSAgIEFDUElfVFlQRV9BTlksIEFDUElfSU1PREVfRVhFQ1VURSwKKwkJCSAgIEFDUElfTlNfU0VBUkNIX1BBUkVOVCwgd2Fsa19zdGF0ZSwKKwkJCSAgICZpbmZvLmRhdGFfcmVnaXN0ZXJfbm9kZSk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCUFDUElfRVJST1JfTkFNRVNQQUNFKGFyZy0+Y29tbW9uLnZhbHVlLnN0cmluZywgc3RhdHVzKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CisJfQorCisJLyogTmV4dCBhcmcgaXMgdGhlIGZpZWxkIGZsYWdzICovCisKKwlhcmcgPSBhcmctPmNvbW1vbi5uZXh0OworCWluZm8uZmllbGRfZmxhZ3MgPSAodTgpIGFyZy0+Y29tbW9uLnZhbHVlLmludGVnZXI7CisKKwkvKiBFYWNoIHJlbWFpbmluZyBhcmcgaXMgYSBOYW1lZCBGaWVsZCAqLworCisJaW5mby5maWVsZF90eXBlID0gQUNQSV9UWVBFX0xPQ0FMX0lOREVYX0ZJRUxEOworCWluZm8ucmVnaW9uX25vZGUgPSByZWdpb25fbm9kZTsKKworCXN0YXR1cyA9IGFjcGlfZHNfZ2V0X2ZpZWxkX25hbWVzKCZpbmZvLCB3YWxrX3N0YXRlLCBhcmctPmNvbW1vbi5uZXh0KTsKKworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS9kc2luaXQuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvZHNpbml0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWIxNDRiMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvZHNpbml0LmMKQEAgLTAsMCArMSwyMDUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBNb2R1bGUgTmFtZTogZHNpbml0IC0gT2JqZWN0IGluaXRpYWxpemF0aW9uIG5hbWVzcGFjZSB3YWxrCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwOCwgSW50ZWwgQ29ycC4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKKyAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIGF0IG1pbmltdW0gYSBkaXNjbGFpbWVyCisgKiAgICBzdWJzdGFudGlhbGx5IHNpbWlsYXIgdG8gdGhlICJOTyBXQVJSQU5UWSIgZGlzY2xhaW1lciBiZWxvdworICogICAgKCJEaXNjbGFpbWVyIikgYW5kIGFueSByZWRpc3RyaWJ1dGlvbiBtdXN0IGJlIGNvbmRpdGlvbmVkIHVwb24KKyAqICAgIGluY2x1ZGluZyBhIHN1YnN0YW50aWFsbHkgc2ltaWxhciBEaXNjbGFpbWVyIHJlcXVpcmVtZW50IGZvciBmdXJ0aGVyCisgKiAgICBiaW5hcnkgcmVkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMKKyAqICAgIG9mIGFueSBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogTk8gV0FSUkFOVFkKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HCisgKiBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KKyAqLworCisjaW5jbHVkZSA8YWNwaS9hY3BpLmg+CisjaW5jbHVkZSAiYWNjb21tb24uaCIKKyNpbmNsdWRlICJhY2Rpc3BhdC5oIgorI2luY2x1ZGUgImFjbmFtZXNwLmgiCisjaW5jbHVkZSAiYWN0YWJsZXMuaCIKKworI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfRElTUEFUQ0hFUgorQUNQSV9NT0RVTEVfTkFNRSgiZHNpbml0IikKKworLyogTG9jYWwgcHJvdG90eXBlcyAqLworc3RhdGljIGFjcGlfc3RhdHVzCithY3BpX2RzX2luaXRfb25lX29iamVjdChhY3BpX2hhbmRsZSBvYmpfaGFuZGxlLAorCQkJdTMyIGxldmVsLCB2b2lkICpjb250ZXh0LCB2b2lkICoqcmV0dXJuX3ZhbHVlKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9kc19pbml0X29uZV9vYmplY3QKKyAqCisgKiBQQVJBTUVURVJTOiAgb2JqX2hhbmRsZSAgICAgIC0gTm9kZSBmb3IgdGhlIG9iamVjdAorICogICAgICAgICAgICAgIExldmVsICAgICAgICAgICAtIEN1cnJlbnQgbmVzdGluZyBsZXZlbAorICogICAgICAgICAgICAgIENvbnRleHQgICAgICAgICAtIFBvaW50cyB0byBhIGluaXQgaW5mbyBzdHJ1Y3QKKyAqICAgICAgICAgICAgICByZXR1cm5fdmFsdWUgICAgLSBOb3QgdXNlZAorICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogQ2FsbGJhY2sgZnJvbSBhY3BpX3dhbGtfbmFtZXNwYWNlLiBJbnZva2VkIGZvciBldmVyeSBvYmplY3QKKyAqICAgICAgICAgICAgICB3aXRoaW4gdGhlIG5hbWVzcGFjZS4KKyAqCisgKiAgICAgICAgICAgICAgQ3VycmVudGx5LCB0aGUgb25seSBvYmplY3RzIHRoYXQgcmVxdWlyZSBpbml0aWFsaXphdGlvbiBhcmU6CisgKiAgICAgICAgICAgICAgMSkgTWV0aG9kcworICogICAgICAgICAgICAgIDIpIE9wZXJhdGlvbiBSZWdpb25zCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGFjcGlfc3RhdHVzCithY3BpX2RzX2luaXRfb25lX29iamVjdChhY3BpX2hhbmRsZSBvYmpfaGFuZGxlLAorCQkJdTMyIGxldmVsLCB2b2lkICpjb250ZXh0LCB2b2lkICoqcmV0dXJuX3ZhbHVlKQoreworCXN0cnVjdCBhY3BpX2luaXRfd2Fsa19pbmZvICppbmZvID0KKwkgICAgKHN0cnVjdCBhY3BpX2luaXRfd2Fsa19pbmZvICopY29udGV4dDsKKwlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZSA9CisJICAgIChzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqKW9ial9oYW5kbGU7CisJYWNwaV9vYmplY3RfdHlwZSB0eXBlOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKworCUFDUElfRlVOQ1RJT05fRU5UUlkoKTsKKworCS8qCisJICogV2UgYXJlIG9ubHkgaW50ZXJlc3RlZCBpbiBOUyBub2RlcyBvd25lZCBieSB0aGUgdGFibGUgdGhhdAorCSAqIHdhcyBqdXN0IGxvYWRlZAorCSAqLworCWlmIChub2RlLT5vd25lcl9pZCAhPSBpbmZvLT5vd25lcl9pZCkgeworCQlyZXR1cm4gKEFFX09LKTsKKwl9CisKKwlpbmZvLT5vYmplY3RfY291bnQrKzsKKworCS8qIEFuZCBldmVuIHRoZW4sIHdlIGFyZSBvbmx5IGludGVyZXN0ZWQgaW4gYSBmZXcgb2JqZWN0IHR5cGVzICovCisKKwl0eXBlID0gYWNwaV9uc19nZXRfdHlwZShvYmpfaGFuZGxlKTsKKworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgQUNQSV9UWVBFX1JFR0lPTjoKKworCQlzdGF0dXMgPSBhY3BpX2RzX2luaXRpYWxpemVfcmVnaW9uKG9ial9oYW5kbGUpOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCUFDUElfRVhDRVBUSU9OKChBRV9JTkZPLCBzdGF0dXMsCisJCQkJCSJEdXJpbmcgUmVnaW9uIGluaXRpYWxpemF0aW9uICVwIFslNC40c10iLAorCQkJCQlvYmpfaGFuZGxlLAorCQkJCQlhY3BpX3V0X2dldF9ub2RlX25hbWUob2JqX2hhbmRsZSkpKTsKKwkJfQorCisJCWluZm8tPm9wX3JlZ2lvbl9jb3VudCsrOworCQlicmVhazsKKworCWNhc2UgQUNQSV9UWVBFX01FVEhPRDoKKworCQlpbmZvLT5tZXRob2RfY291bnQrKzsKKwkJYnJlYWs7CisKKwljYXNlIEFDUElfVFlQRV9ERVZJQ0U6CisKKwkJaW5mby0+ZGV2aWNlX2NvdW50Kys7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJLyoKKwkgKiBXZSBpZ25vcmUgZXJyb3JzIGZyb20gYWJvdmUsIGFuZCBhbHdheXMgcmV0dXJuIE9LLCBzaW5jZQorCSAqIHdlIGRvbid0IHdhbnQgdG8gYWJvcnQgdGhlIHdhbGsgb24gYSBzaW5nbGUgZXJyb3IuCisJICovCisJcmV0dXJuIChBRV9PSyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfZHNfaW5pdGlhbGl6ZV9vYmplY3RzCisgKgorICogUEFSQU1FVEVSUzogIHRhYmxlX2Rlc2MgICAgICAtIERlc2NyaXB0b3IgZm9yIHBhcmVudCBBQ1BJIHRhYmxlCisgKiAgICAgICAgICAgICAgc3RhcnRfbm9kZSAgICAgIC0gUm9vdCBvZiBzdWJ0cmVlIHRvIGJlIGluaXRpYWxpemVkLgorICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogV2FsayB0aGUgbmFtZXNwYWNlIHN0YXJ0aW5nIGF0ICJTdGFydE5vZGUiIGFuZCBwZXJmb3JtIGFueQorICogICAgICAgICAgICAgIG5lY2Vzc2FyeSBpbml0aWFsaXphdGlvbiBvbiB0aGUgb2JqZWN0cyBmb3VuZCB0aGVyZWluCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworYWNwaV9zdGF0dXMKK2FjcGlfZHNfaW5pdGlhbGl6ZV9vYmplY3RzKHUzMiB0YWJsZV9pbmRleCwKKwkJCSAgIHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICogc3RhcnRfbm9kZSkKK3sKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJc3RydWN0IGFjcGlfaW5pdF93YWxrX2luZm8gaW5mbzsKKwlzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKnRhYmxlOworCWFjcGlfb3duZXJfaWQgb3duZXJfaWQ7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGRzX2luaXRpYWxpemVfb2JqZWN0cyk7CisKKwlzdGF0dXMgPSBhY3BpX3RiX2dldF9vd25lcl9pZCh0YWJsZV9pbmRleCwgJm93bmVyX2lkKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CisJfQorCisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9ESVNQQVRDSCwKKwkJCSAgIioqKiogU3RhcnRpbmcgaW5pdGlhbGl6YXRpb24gb2YgbmFtZXNwYWNlIG9iamVjdHMgKioqKlxuIikpOworCUFDUElfREVCVUdfUFJJTlRfUkFXKChBQ1BJX0RCX0lOSVQsICJQYXJzaW5nIGFsbCBDb250cm9sIE1ldGhvZHM6IikpOworCisJaW5mby5tZXRob2RfY291bnQgPSAwOworCWluZm8ub3BfcmVnaW9uX2NvdW50ID0gMDsKKwlpbmZvLm9iamVjdF9jb3VudCA9IDA7CisJaW5mby5kZXZpY2VfY291bnQgPSAwOworCWluZm8udGFibGVfaW5kZXggPSB0YWJsZV9pbmRleDsKKwlpbmZvLm93bmVyX2lkID0gb3duZXJfaWQ7CisKKwkvKiBXYWxrIGVudGlyZSBuYW1lc3BhY2UgZnJvbSB0aGUgc3VwcGxpZWQgcm9vdCAqLworCisJc3RhdHVzID0gYWNwaV93YWxrX25hbWVzcGFjZShBQ1BJX1RZUEVfQU5ZLCBzdGFydF9ub2RlLCBBQ1BJX1VJTlQzMl9NQVgsCisJCQkJICAgICBhY3BpX2RzX2luaXRfb25lX29iamVjdCwgJmluZm8sIE5VTEwpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlBQ1BJX0VYQ0VQVElPTigoQUVfSU5GTywgc3RhdHVzLCAiRHVyaW5nIFdhbGtOYW1lc3BhY2UiKSk7CisJfQorCisJc3RhdHVzID0gYWNwaV9nZXRfdGFibGVfYnlfaW5kZXgodGFibGVfaW5kZXgsICZ0YWJsZSk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworCX0KKworCUFDUElfREVCVUdfUFJJTlRfUkFXKChBQ1BJX0RCX0lOSVQsCisJCQkgICAgICAiXG5UYWJsZSBbJTQuNHNdKGlkICU0LjRYKSAtICVoZCBPYmplY3RzIHdpdGggJWhkIERldmljZXMgJWhkIE1ldGhvZHMgJWhkIFJlZ2lvbnNcbiIsCisJCQkgICAgICB0YWJsZS0+c2lnbmF0dXJlLCBvd25lcl9pZCwgaW5mby5vYmplY3RfY291bnQsCisJCQkgICAgICBpbmZvLmRldmljZV9jb3VudCwgaW5mby5tZXRob2RfY291bnQsCisJCQkgICAgICBpbmZvLm9wX3JlZ2lvbl9jb3VudCkpOworCisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9ESVNQQVRDSCwKKwkJCSAgIiVoZCBNZXRob2RzLCAlaGQgUmVnaW9uc1xuIiwgaW5mby5tZXRob2RfY291bnQsCisJCQkgIGluZm8ub3BfcmVnaW9uX2NvdW50KSk7CisKKwlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS9kc21ldGhvZC5jIGIvZHJpdmVycy9hY3BpL2FjcGljYS9kc21ldGhvZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0YjhiOGUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2RzbWV0aG9kLmMKQEAgLTAsMCArMSw2MjkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBNb2R1bGUgTmFtZTogZHNtZXRob2QgLSBQYXJzZXIvSW50ZXJwcmV0ZXIgaW50ZXJmYWNlIC0gY29udHJvbCBtZXRob2QgcGFyc2luZworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDgsIEludGVsIENvcnAuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCisgKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSBhdCBtaW5pbXVtIGEgZGlzY2xhaW1lcgorICogICAgc3Vic3RhbnRpYWxseSBzaW1pbGFyIHRvIHRoZSAiTk8gV0FSUkFOVFkiIGRpc2NsYWltZXIgYmVsb3cKKyAqICAgICgiRGlzY2xhaW1lciIpIGFuZCBhbnkgcmVkaXN0cmlidXRpb24gbXVzdCBiZSBjb25kaXRpb25lZCB1cG9uCisgKiAgICBpbmNsdWRpbmcgYSBzdWJzdGFudGlhbGx5IHNpbWlsYXIgRGlzY2xhaW1lciByZXF1aXJlbWVudCBmb3IgZnVydGhlcgorICogICAgYmluYXJ5IHJlZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzCisgKiAgICBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIE5PIFdBUlJBTlRZCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORworICogSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCisgKi8KKworI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgorI2luY2x1ZGUgImFjY29tbW9uLmgiCisjaW5jbHVkZSAiYW1sY29kZS5oIgorI2luY2x1ZGUgImFjZGlzcGF0LmgiCisjaW5jbHVkZSAiYWNpbnRlcnAuaCIKKyNpbmNsdWRlICJhY25hbWVzcC5oIgorI2lmZGVmCUFDUElfRElTQVNTRU1CTEVSCisjaW5jbHVkZSA8YWNwaS9hY2Rpc2FzbS5oPgorI2VuZGlmCisKKyNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX0RJU1BBVENIRVIKK0FDUElfTU9EVUxFX05BTUUoImRzbWV0aG9kIikKKworLyogTG9jYWwgcHJvdG90eXBlcyAqLworc3RhdGljIGFjcGlfc3RhdHVzCithY3BpX2RzX2NyZWF0ZV9tZXRob2RfbXV0ZXgodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqbWV0aG9kX2Rlc2MpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX2RzX21ldGhvZF9lcnJvcgorICoKKyAqIFBBUkFNRVRFUlM6ICBTdGF0dXMgICAgICAgICAgLSBFeGVjdXRpb24gc3RhdHVzCisgKiAgICAgICAgICAgICAgd2Fsa19zdGF0ZSAgICAgIC0gQ3VycmVudCBzdGF0ZQorICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogQ2FsbGVkIG9uIG1ldGhvZCBlcnJvci4gSW52b2tlIHRoZSBnbG9iYWwgZXhjZXB0aW9uIGhhbmRsZXIgaWYKKyAqICAgICAgICAgICAgICBwcmVzZW50LCBkdW1wIHRoZSBtZXRob2QgZGF0YSBpZiB0aGUgZGlzYXNzZW1ibGVyIGlzIGNvbmZpZ3VyZWQKKyAqCisgKiAgICAgICAgICAgICAgTm90ZTogQWxsb3dzIHRoZSBleGNlcHRpb24gaGFuZGxlciB0byBjaGFuZ2UgdGhlIHN0YXR1cyBjb2RlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworYWNwaV9zdGF0dXMKK2FjcGlfZHNfbWV0aG9kX2Vycm9yKGFjcGlfc3RhdHVzIHN0YXR1cywgc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSkKK3sKKwlBQ1BJX0ZVTkNUSU9OX0VOVFJZKCk7CisKKwkvKiBJZ25vcmUgQUVfT0sgYW5kIGNvbnRyb2wgZXhjZXB0aW9uIGNvZGVzICovCisKKwlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykgfHwgKHN0YXR1cyAmIEFFX0NPREVfQ09OVFJPTCkpIHsKKwkJcmV0dXJuIChzdGF0dXMpOworCX0KKworCS8qIEludm9rZSB0aGUgZ2xvYmFsIGV4Y2VwdGlvbiBoYW5kbGVyICovCisKKwlpZiAoYWNwaV9nYmxfZXhjZXB0aW9uX2hhbmRsZXIpIHsKKworCQkvKiBFeGl0IHRoZSBpbnRlcnByZXRlciwgYWxsb3cgaGFuZGxlciB0byBleGVjdXRlIG1ldGhvZHMgKi8KKworCQlhY3BpX2V4X2V4aXRfaW50ZXJwcmV0ZXIoKTsKKworCQkvKgorCQkgKiBIYW5kbGVyIGNhbiBtYXAgdGhlIGV4Y2VwdGlvbiBjb2RlIHRvIGFueXRoaW5nIGl0IHdhbnRzLCBpbmNsdWRpbmcKKwkJICogQUVfT0ssIGluIHdoaWNoIGNhc2UgdGhlIGV4ZWN1dGluZyBtZXRob2Qgd2lsbCBub3QgYmUgYWJvcnRlZC4KKwkJICovCisJCXN0YXR1cyA9IGFjcGlfZ2JsX2V4Y2VwdGlvbl9oYW5kbGVyKHN0YXR1cywKKwkJCQkJCSAgICB3YWxrX3N0YXRlLT5tZXRob2Rfbm9kZSA/CisJCQkJCQkgICAgd2Fsa19zdGF0ZS0+bWV0aG9kX25vZGUtPgorCQkJCQkJICAgIG5hbWUuaW50ZWdlciA6IDAsCisJCQkJCQkgICAgd2Fsa19zdGF0ZS0+b3Bjb2RlLAorCQkJCQkJICAgIHdhbGtfc3RhdGUtPmFtbF9vZmZzZXQsCisJCQkJCQkgICAgTlVMTCk7CisJCWFjcGlfZXhfZW50ZXJfaW50ZXJwcmV0ZXIoKTsKKwl9CisKKwlhY3BpX2RzX2NsZWFyX2ltcGxpY2l0X3JldHVybih3YWxrX3N0YXRlKTsKKworI2lmZGVmIEFDUElfRElTQVNTRU1CTEVSCisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisKKwkJLyogRGlzcGxheSBtZXRob2QgbG9jYWxzL2FyZ3MgaWYgZGlzYXNzZW1ibGVyIGlzIHByZXNlbnQgKi8KKworCQlhY3BpX2RtX2R1bXBfbWV0aG9kX2luZm8oc3RhdHVzLCB3YWxrX3N0YXRlLCB3YWxrX3N0YXRlLT5vcCk7CisJfQorI2VuZGlmCisKKwlyZXR1cm4gKHN0YXR1cyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfZHNfY3JlYXRlX21ldGhvZF9tdXRleAorICoKKyAqIFBBUkFNRVRFUlM6ICBvYmpfZGVzYyAgICAgICAgICAgIC0gVGhlIG1ldGhvZCBvYmplY3QKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IENyZWF0ZSBhIG11dGV4IG9iamVjdCBmb3IgYSBzZXJpYWxpemVkIGNvbnRyb2wgbWV0aG9kCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGFjcGlfc3RhdHVzCithY3BpX2RzX2NyZWF0ZV9tZXRob2RfbXV0ZXgodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqbWV0aG9kX2Rlc2MpCit7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqbXV0ZXhfZGVzYzsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGRzX2NyZWF0ZV9tZXRob2RfbXV0ZXgpOworCisJLyogQ3JlYXRlIHRoZSBuZXcgbXV0ZXggb2JqZWN0ICovCisKKwltdXRleF9kZXNjID0gYWNwaV91dF9jcmVhdGVfaW50ZXJuYWxfb2JqZWN0KEFDUElfVFlQRV9NVVRFWCk7CisJaWYgKCFtdXRleF9kZXNjKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT19NRU1PUlkpOworCX0KKworCS8qIENyZWF0ZSB0aGUgYWN0dWFsIE9TIE11dGV4ICovCisKKwlzdGF0dXMgPSBhY3BpX29zX2NyZWF0ZV9tdXRleCgmbXV0ZXhfZGVzYy0+bXV0ZXgub3NfbXV0ZXgpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKKwl9CisKKwltdXRleF9kZXNjLT5tdXRleC5zeW5jX2xldmVsID0gbWV0aG9kX2Rlc2MtPm1ldGhvZC5zeW5jX2xldmVsOworCW1ldGhvZF9kZXNjLT5tZXRob2QubXV0ZXggPSBtdXRleF9kZXNjOworCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfZHNfYmVnaW5fbWV0aG9kX2V4ZWN1dGlvbgorICoKKyAqIFBBUkFNRVRFUlM6ICBtZXRob2Rfbm9kZSAgICAgICAgIC0gTm9kZSBvZiB0aGUgbWV0aG9kCisgKiAgICAgICAgICAgICAgb2JqX2Rlc2MgICAgICAgICAgICAtIFRoZSBtZXRob2Qgb2JqZWN0CisgKiAgICAgICAgICAgICAgd2Fsa19zdGF0ZSAgICAgICAgICAtIGN1cnJlbnQgc3RhdGUsIE5VTEwgaWYgbm90IHlldCBleGVjdXRpbmcKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSBtZXRob2QuCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBQcmVwYXJlIGEgbWV0aG9kIGZvciBleGVjdXRpb24uICBQYXJzZXMgdGhlIG1ldGhvZCBpZiBuZWNlc3NhcnksCisgKiAgICAgICAgICAgICAgaW5jcmVtZW50cyB0aGUgdGhyZWFkIGNvdW50LCBhbmQgd2FpdHMgYXQgdGhlIG1ldGhvZCBzZW1hcGhvcmUKKyAqICAgICAgICAgICAgICBmb3IgY2xlYXJhbmNlIHRvIGV4ZWN1dGUuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworYWNwaV9zdGF0dXMKK2FjcGlfZHNfYmVnaW5fbWV0aG9kX2V4ZWN1dGlvbihzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbWV0aG9kX25vZGUsCisJCQkgICAgICAgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2MsCisJCQkgICAgICAgc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSkKK3sKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKGRzX2JlZ2luX21ldGhvZF9leGVjdXRpb24sIG1ldGhvZF9ub2RlKTsKKworCWlmICghbWV0aG9kX25vZGUpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05VTExfRU5UUlkpOworCX0KKworCS8qIFByZXZlbnQgd3JhcGFyb3VuZCBvZiB0aHJlYWQgY291bnQgKi8KKworCWlmIChvYmpfZGVzYy0+bWV0aG9kLnRocmVhZF9jb3VudCA9PSBBQ1BJX1VJTlQ4X01BWCkgeworCQlBQ1BJX0VSUk9SKChBRV9JTkZPLAorCQkJICAgICJNZXRob2QgcmVhY2hlZCBtYXhpbXVtIHJlZW50cmFuY3kgbGltaXQgKDI1NSkiKSk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfTUVUSE9EX0xJTUlUKTsKKwl9CisKKwkvKgorCSAqIElmIHRoaXMgbWV0aG9kIGlzIHNlcmlhbGl6ZWQsIHdlIG5lZWQgdG8gYWNxdWlyZSB0aGUgbWV0aG9kIG11dGV4LgorCSAqLworCWlmIChvYmpfZGVzYy0+bWV0aG9kLm1ldGhvZF9mbGFncyAmIEFNTF9NRVRIT0RfU0VSSUFMSVpFRCkgeworCQkvKgorCQkgKiBDcmVhdGUgYSBtdXRleCBmb3IgdGhlIG1ldGhvZCBpZiBpdCBpcyBkZWZpbmVkIHRvIGJlIFNlcmlhbGl6ZWQKKwkJICogYW5kIGEgbXV0ZXggaGFzIG5vdCBhbHJlYWR5IGJlZW4gY3JlYXRlZC4gV2UgZGVmZXIgdGhlIG11dGV4IGNyZWF0aW9uCisJCSAqIHVudGlsIGEgbWV0aG9kIGlzIGFjdHVhbGx5IGV4ZWN1dGVkLCB0byBtaW5pbWl6ZSB0aGUgb2JqZWN0IGNvdW50CisJCSAqLworCQlpZiAoIW9ial9kZXNjLT5tZXRob2QubXV0ZXgpIHsKKwkJCXN0YXR1cyA9IGFjcGlfZHNfY3JlYXRlX21ldGhvZF9tdXRleChvYmpfZGVzYyk7CisJCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKKwkJCX0KKwkJfQorCisJCS8qCisJCSAqIFRoZSBjdXJyZW50X3N5bmNfbGV2ZWwgKHBlci10aHJlYWQpIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvCisJCSAqIHRoZSBzeW5jIGxldmVsIG9mIHRoZSBtZXRob2QuIFRoaXMgbWVjaGFuaXNtIHByb3ZpZGVzIHNvbWUKKwkJICogZGVhZGxvY2sgcHJldmVudGlvbgorCQkgKgorCQkgKiBUb3AtbGV2ZWwgbWV0aG9kIGludm9jYXRpb24gaGFzIG5vIHdhbGsgc3RhdGUgYXQgdGhpcyBwb2ludAorCQkgKi8KKwkJaWYgKHdhbGtfc3RhdGUgJiYKKwkJICAgICh3YWxrX3N0YXRlLT50aHJlYWQtPmN1cnJlbnRfc3luY19sZXZlbCA+CisJCSAgICAgb2JqX2Rlc2MtPm1ldGhvZC5tdXRleC0+bXV0ZXguc3luY19sZXZlbCkpIHsKKwkJCUFDUElfRVJST1IoKEFFX0lORk8sCisJCQkJICAgICJDYW5ub3QgYWNxdWlyZSBNdXRleCBmb3IgbWV0aG9kIFslNC40c10sIGN1cnJlbnQgU3luY0xldmVsIGlzIHRvbyBsYXJnZSAoJWQpIiwKKwkJCQkgICAgYWNwaV91dF9nZXRfbm9kZV9uYW1lKG1ldGhvZF9ub2RlKSwKKwkJCQkgICAgd2Fsa19zdGF0ZS0+dGhyZWFkLT5jdXJyZW50X3N5bmNfbGV2ZWwpKTsKKworCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9NVVRFWF9PUkRFUik7CisJCX0KKworCQkvKgorCQkgKiBPYnRhaW4gdGhlIG1ldGhvZCBtdXRleCBpZiBuZWNlc3NhcnkuIERvIG5vdCBhY3F1aXJlIG11dGV4IGZvciBhCisJCSAqIHJlY3Vyc2l2ZSBjYWxsLgorCQkgKi8KKwkJaWYgKCF3YWxrX3N0YXRlIHx8CisJCSAgICAhb2JqX2Rlc2MtPm1ldGhvZC5tdXRleC0+bXV0ZXgudGhyZWFkX2lkIHx8CisJCSAgICAod2Fsa19zdGF0ZS0+dGhyZWFkLT50aHJlYWRfaWQgIT0KKwkJICAgICBvYmpfZGVzYy0+bWV0aG9kLm11dGV4LT5tdXRleC50aHJlYWRfaWQpKSB7CisJCQkvKgorCQkJICogQWNxdWlyZSB0aGUgbWV0aG9kIG11dGV4LiBUaGlzIHJlbGVhc2VzIHRoZSBpbnRlcnByZXRlciBpZiB3ZQorCQkJICogYmxvY2sgKGFuZCByZWFjcXVpcmVzIGl0IGJlZm9yZSBpdCByZXR1cm5zKQorCQkJICovCisJCQlzdGF0dXMgPQorCQkJICAgIGFjcGlfZXhfc3lzdGVtX3dhaXRfbXV0ZXgob2JqX2Rlc2MtPm1ldGhvZC5tdXRleC0+CisJCQkJCQkgICAgICBtdXRleC5vc19tdXRleCwKKwkJCQkJCSAgICAgIEFDUElfV0FJVF9GT1JFVkVSKTsKKwkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworCQkJfQorCisJCQkvKiBVcGRhdGUgdGhlIG11dGV4IGFuZCB3YWxrIGluZm8gYW5kIHNhdmUgdGhlIG9yaWdpbmFsIHN5bmNfbGV2ZWwgKi8KKworCQkJaWYgKHdhbGtfc3RhdGUpIHsKKwkJCQlvYmpfZGVzYy0+bWV0aG9kLm11dGV4LT5tdXRleC4KKwkJCQkgICAgb3JpZ2luYWxfc3luY19sZXZlbCA9CisJCQkJICAgIHdhbGtfc3RhdGUtPnRocmVhZC0+Y3VycmVudF9zeW5jX2xldmVsOworCisJCQkJb2JqX2Rlc2MtPm1ldGhvZC5tdXRleC0+bXV0ZXgudGhyZWFkX2lkID0KKwkJCQkgICAgd2Fsa19zdGF0ZS0+dGhyZWFkLT50aHJlYWRfaWQ7CisJCQkJd2Fsa19zdGF0ZS0+dGhyZWFkLT5jdXJyZW50X3N5bmNfbGV2ZWwgPQorCQkJCSAgICBvYmpfZGVzYy0+bWV0aG9kLnN5bmNfbGV2ZWw7CisJCQl9IGVsc2UgeworCQkJCW9ial9kZXNjLT5tZXRob2QubXV0ZXgtPm11dGV4LgorCQkJCSAgICBvcmlnaW5hbF9zeW5jX2xldmVsID0KKwkJCQkgICAgb2JqX2Rlc2MtPm1ldGhvZC5tdXRleC0+bXV0ZXguc3luY19sZXZlbDsKKwkJCX0KKwkJfQorCisJCS8qIEFsd2F5cyBpbmNyZWFzZSBhY3F1aXNpdGlvbiBkZXB0aCAqLworCisJCW9ial9kZXNjLT5tZXRob2QubXV0ZXgtPm11dGV4LmFjcXVpc2l0aW9uX2RlcHRoKys7CisJfQorCisJLyoKKwkgKiBBbGxvY2F0ZSBhbiBPd25lciBJRCBmb3IgdGhpcyBtZXRob2QsIG9ubHkgaWYgdGhpcyBpcyB0aGUgZmlyc3QgdGhyZWFkCisJICogdG8gYmVnaW4gY29uY3VycmVudCBleGVjdXRpb24uIFdlIG9ubHkgbmVlZCBvbmUgb3duZXJfaWQsIGV2ZW4gaWYgdGhlCisJICogbWV0aG9kIGlzIGludm9rZWQgcmVjdXJzaXZlbHkuCisJICovCisJaWYgKCFvYmpfZGVzYy0+bWV0aG9kLm93bmVyX2lkKSB7CisJCXN0YXR1cyA9IGFjcGlfdXRfYWxsb2NhdGVfb3duZXJfaWQoJm9ial9kZXNjLT5tZXRob2Qub3duZXJfaWQpOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCWdvdG8gY2xlYW51cDsKKwkJfQorCX0KKworCS8qCisJICogSW5jcmVtZW50IHRoZSBtZXRob2QgcGFyc2UgdHJlZSB0aHJlYWQgY291bnQgc2luY2UgaXQgaGFzIGJlZW4KKwkgKiByZWVudGVyZWQgb25lIG1vcmUgdGltZSAoZXZlbiBpZiBpdCBpcyB0aGUgc2FtZSB0aHJlYWQpCisJICovCisJb2JqX2Rlc2MtPm1ldGhvZC50aHJlYWRfY291bnQrKzsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKKworICAgICAgY2xlYW51cDoKKwkvKiBPbiBlcnJvciwgbXVzdCByZWxlYXNlIHRoZSBtZXRob2QgbXV0ZXggKGlmIHByZXNlbnQpICovCisKKwlpZiAob2JqX2Rlc2MtPm1ldGhvZC5tdXRleCkgeworCQlhY3BpX29zX3JlbGVhc2VfbXV0ZXgob2JqX2Rlc2MtPm1ldGhvZC5tdXRleC0+bXV0ZXgub3NfbXV0ZXgpOworCX0KKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9kc19jYWxsX2NvbnRyb2xfbWV0aG9kCisgKgorICogUEFSQU1FVEVSUzogIFRocmVhZCAgICAgICAgICAgICAgLSBJbmZvIGZvciB0aGlzIHRocmVhZAorICogICAgICAgICAgICAgIHRoaXNfd2Fsa19zdGF0ZSAgICAgLSBDdXJyZW50IHdhbGsgc3RhdGUKKyAqICAgICAgICAgICAgICBPcCAgICAgICAgICAgICAgICAgIC0gQ3VycmVudCBPcCB0byBiZSB3YWxrZWQKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IFRyYW5zZmVyIGV4ZWN1dGlvbiB0byBhIGNhbGxlZCBjb250cm9sIG1ldGhvZAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2FjcGlfc3RhdHVzCithY3BpX2RzX2NhbGxfY29udHJvbF9tZXRob2Qoc3RydWN0IGFjcGlfdGhyZWFkX3N0YXRlICp0aHJlYWQsCisJCQkgICAgc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqdGhpc193YWxrX3N0YXRlLAorCQkJICAgIHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpvcCkKK3sKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm1ldGhvZF9ub2RlOworCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKm5leHRfd2Fsa19zdGF0ZSA9IE5VTEw7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2M7CisJc3RydWN0IGFjcGlfZXZhbHVhdGVfaW5mbyAqaW5mbzsKKwl1MzIgaTsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKGRzX2NhbGxfY29udHJvbF9tZXRob2QsIHRoaXNfd2Fsa19zdGF0ZSk7CisKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0RJU1BBVENILAorCQkJICAiQ2FsbGluZyBtZXRob2QgJXAsIGN1cnJlbnRzdGF0ZT0lcFxuIiwKKwkJCSAgdGhpc193YWxrX3N0YXRlLT5wcmV2X29wLCB0aGlzX3dhbGtfc3RhdGUpKTsKKworCS8qCisJICogR2V0IHRoZSBuYW1lc3BhY2UgZW50cnkgZm9yIHRoZSBjb250cm9sIG1ldGhvZCB3ZSBhcmUgYWJvdXQgdG8gY2FsbAorCSAqLworCW1ldGhvZF9ub2RlID0gdGhpc193YWxrX3N0YXRlLT5tZXRob2RfY2FsbF9ub2RlOworCWlmICghbWV0aG9kX25vZGUpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05VTExfRU5UUlkpOworCX0KKworCW9ial9kZXNjID0gYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0KG1ldGhvZF9ub2RlKTsKKwlpZiAoIW9ial9kZXNjKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OVUxMX09CSkVDVCk7CisJfQorCisJLyogSW5pdCBmb3IgbmV3IG1ldGhvZCwgcG9zc2libHkgd2FpdCBvbiBtZXRob2QgbXV0ZXggKi8KKworCXN0YXR1cyA9IGFjcGlfZHNfYmVnaW5fbWV0aG9kX2V4ZWN1dGlvbihtZXRob2Rfbm9kZSwgb2JqX2Rlc2MsCisJCQkJCQl0aGlzX3dhbGtfc3RhdGUpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKKwl9CisKKwkvKiBCZWdpbiBtZXRob2QgcGFyc2UvZXhlY3V0aW9uLiBDcmVhdGUgYSBuZXcgd2FsayBzdGF0ZSAqLworCisJbmV4dF93YWxrX3N0YXRlID0gYWNwaV9kc19jcmVhdGVfd2Fsa19zdGF0ZShvYmpfZGVzYy0+bWV0aG9kLm93bmVyX2lkLAorCQkJCQkJICAgIE5VTEwsIG9ial9kZXNjLCB0aHJlYWQpOworCWlmICghbmV4dF93YWxrX3N0YXRlKSB7CisJCXN0YXR1cyA9IEFFX05PX01FTU9SWTsKKwkJZ290byBjbGVhbnVwOworCX0KKworCS8qCisJICogVGhlIHJlc29sdmVkIGFyZ3VtZW50cyB3ZXJlIHB1dCBvbiB0aGUgcHJldmlvdXMgd2FsayBzdGF0ZSdzIG9wZXJhbmQKKwkgKiBzdGFjay4gT3BlcmFuZHMgb24gdGhlIHByZXZpb3VzIHdhbGsgc3RhdGUgc3RhY2sgYWx3YXlzCisJICogc3RhcnQgYXQgaW5kZXggMC4gQWxzbywgbnVsbCB0ZXJtaW5hdGUgdGhlIGxpc3Qgb2YgYXJndW1lbnRzCisJICovCisJdGhpc193YWxrX3N0YXRlLT5vcGVyYW5kc1t0aGlzX3dhbGtfc3RhdGUtPm51bV9vcGVyYW5kc10gPSBOVUxMOworCisJLyoKKwkgKiBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSB0aGUgZXZhbHVhdGlvbiBpbmZvcm1hdGlvbiBibG9jaworCSAqIFRCRDogdGhpcyBpcyBzb21ld2hhdCBpbmVmZmljaWVudCwgc2hvdWxkIGNoYW5nZSBpbnRlcmZhY2UgdG8KKwkgKiBkc19pbml0X2FtbF93YWxrLiBGb3Igbm93LCBrZWVwcyB0aGlzIHN0cnVjdCBvZmYgdGhlIENQVSBzdGFjaworCSAqLworCWluZm8gPSBBQ1BJX0FMTE9DQVRFX1pFUk9FRChzaXplb2Yoc3RydWN0IGFjcGlfZXZhbHVhdGVfaW5mbykpOworCWlmICghaW5mbykgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9fTUVNT1JZKTsKKwl9CisKKwlpbmZvLT5wYXJhbWV0ZXJzID0gJnRoaXNfd2Fsa19zdGF0ZS0+b3BlcmFuZHNbMF07CisKKwlzdGF0dXMgPSBhY3BpX2RzX2luaXRfYW1sX3dhbGsobmV4dF93YWxrX3N0YXRlLCBOVUxMLCBtZXRob2Rfbm9kZSwKKwkJCQkgICAgICAgb2JqX2Rlc2MtPm1ldGhvZC5hbWxfc3RhcnQsCisJCQkJICAgICAgIG9ial9kZXNjLT5tZXRob2QuYW1sX2xlbmd0aCwgaW5mbywKKwkJCQkgICAgICAgQUNQSV9JTU9ERV9FWEVDVVRFKTsKKworCUFDUElfRlJFRShpbmZvKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJZ290byBjbGVhbnVwOworCX0KKworCS8qCisJICogRGVsZXRlIHRoZSBvcGVyYW5kcyBvbiB0aGUgcHJldmlvdXMgd2Fsa3N0YXRlIG9wZXJhbmQgc3RhY2sKKwkgKiAodGhleSB3ZXJlIGNvcGllZCB0byBuZXcgb2JqZWN0cykKKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgb2JqX2Rlc2MtPm1ldGhvZC5wYXJhbV9jb3VudDsgaSsrKSB7CisJCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZSh0aGlzX3dhbGtfc3RhdGUtPm9wZXJhbmRzW2ldKTsKKwkJdGhpc193YWxrX3N0YXRlLT5vcGVyYW5kc1tpXSA9IE5VTEw7CisJfQorCisJLyogQ2xlYXIgdGhlIG9wZXJhbmQgc3RhY2sgKi8KKworCXRoaXNfd2Fsa19zdGF0ZS0+bnVtX29wZXJhbmRzID0gMDsKKworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRElTUEFUQ0gsCisJCQkgICIqKioqIEJlZ2luIG5lc3RlZCBleGVjdXRpb24gb2YgWyU0LjRzXSAqKioqIFdhbGtTdGF0ZT0lcFxuIiwKKwkJCSAgbWV0aG9kX25vZGUtPm5hbWUuYXNjaWksIG5leHRfd2Fsa19zdGF0ZSkpOworCisJLyogSW52b2tlIGFuIGludGVybmFsIG1ldGhvZCBpZiBuZWNlc3NhcnkgKi8KKworCWlmIChvYmpfZGVzYy0+bWV0aG9kLm1ldGhvZF9mbGFncyAmIEFNTF9NRVRIT0RfSU5URVJOQUxfT05MWSkgeworCQlzdGF0dXMgPSBvYmpfZGVzYy0+bWV0aG9kLmltcGxlbWVudGF0aW9uKG5leHRfd2Fsa19zdGF0ZSk7CisJCWlmIChzdGF0dXMgPT0gQUVfT0spIHsKKwkJCXN0YXR1cyA9IEFFX0NUUkxfVEVSTUlOQVRFOworCQl9CisJfQorCisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CisKKyAgICAgIGNsZWFudXA6CisKKwkvKiBPbiBlcnJvciwgd2UgbXVzdCB0ZXJtaW5hdGUgdGhlIG1ldGhvZCBwcm9wZXJseSAqLworCisJYWNwaV9kc190ZXJtaW5hdGVfY29udHJvbF9tZXRob2Qob2JqX2Rlc2MsIG5leHRfd2Fsa19zdGF0ZSk7CisJaWYgKG5leHRfd2Fsa19zdGF0ZSkgeworCQlhY3BpX2RzX2RlbGV0ZV93YWxrX3N0YXRlKG5leHRfd2Fsa19zdGF0ZSk7CisJfQorCisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfZHNfcmVzdGFydF9jb250cm9sX21ldGhvZAorICoKKyAqIFBBUkFNRVRFUlM6ICB3YWxrX3N0YXRlICAgICAgICAgIC0gU3RhdGUgZm9yIHByZWVtcHRlZCBtZXRob2QgKGNhbGxlcikKKyAqICAgICAgICAgICAgICByZXR1cm5fZGVzYyAgICAgICAgIC0gUmV0dXJuIHZhbHVlIGZyb20gdGhlIGNhbGxlZCBtZXRob2QKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IFJlc3RhcnQgYSBtZXRob2QgdGhhdCB3YXMgcHJlZW1wdGVkIGJ5IGFub3RoZXIgKG5lc3RlZCkgbWV0aG9kCisgKiAgICAgICAgICAgICAgaW52b2NhdGlvbi4gIEhhbmRsZSB0aGUgcmV0dXJuIHZhbHVlIChpZiBhbnkpIGZyb20gdGhlIGNhbGxlZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCithY3BpX3N0YXR1cworYWNwaV9kc19yZXN0YXJ0X2NvbnRyb2xfbWV0aG9kKHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUsCisJCQkgICAgICAgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqcmV0dXJuX2Rlc2MpCit7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCWludCBzYW1lX2FzX2ltcGxpY2l0X3JldHVybjsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKGRzX3Jlc3RhcnRfY29udHJvbF9tZXRob2QsIHdhbGtfc3RhdGUpOworCisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9ESVNQQVRDSCwKKwkJCSAgIioqKipSZXN0YXJ0IFslNC40c10gT3AgJXAgUmV0dXJuVmFsdWVGcm9tQ2FsbGVlICVwXG4iLAorCQkJICBhY3BpX3V0X2dldF9ub2RlX25hbWUod2Fsa19zdGF0ZS0+bWV0aG9kX25vZGUpLAorCQkJICB3YWxrX3N0YXRlLT5tZXRob2RfY2FsbF9vcCwgcmV0dXJuX2Rlc2MpKTsKKworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRElTUEFUQ0gsCisJCQkgICIgICAgUmV0dXJuRnJvbVRoaXNNZXRob2RVc2VkPz0lWCBSZXNTdGFjayAlcCBXYWxrICVwXG4iLAorCQkJICB3YWxrX3N0YXRlLT5yZXR1cm5fdXNlZCwKKwkJCSAgd2Fsa19zdGF0ZS0+cmVzdWx0cywgd2Fsa19zdGF0ZSkpOworCisJLyogRGlkIHRoZSBjYWxsZWQgbWV0aG9kIHJldHVybiBhIHZhbHVlPyAqLworCisJaWYgKHJldHVybl9kZXNjKSB7CisKKwkJLyogSXMgdGhlIGltcGxpY2l0IHJldHVybiBvYmplY3QgdGhlIHNhbWUgYXMgdGhlIHJldHVybiBkZXNjPyAqLworCisJCXNhbWVfYXNfaW1wbGljaXRfcmV0dXJuID0KKwkJICAgICh3YWxrX3N0YXRlLT5pbXBsaWNpdF9yZXR1cm5fb2JqID09IHJldHVybl9kZXNjKTsKKworCQkvKiBBcmUgd2UgYWN0dWFsbHkgZ29pbmcgdG8gdXNlIHRoZSByZXR1cm4gdmFsdWU/ICovCisKKwkJaWYgKHdhbGtfc3RhdGUtPnJldHVybl91c2VkKSB7CisKKwkJCS8qIFNhdmUgdGhlIHJldHVybiB2YWx1ZSBmcm9tIHRoZSBwcmV2aW91cyBtZXRob2QgKi8KKworCQkJc3RhdHVzID0gYWNwaV9kc19yZXN1bHRfcHVzaChyZXR1cm5fZGVzYywgd2Fsa19zdGF0ZSk7CisJCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UocmV0dXJuX2Rlc2MpOworCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworCQkJfQorCisJCQkvKgorCQkJICogU2F2ZSBhcyBUSElTIG1ldGhvZCdzIHJldHVybiB2YWx1ZSBpbiBjYXNlIGl0IGlzIHJldHVybmVkCisJCQkgKiBpbW1lZGlhdGVseSB0byB5ZXQgYW5vdGhlciBtZXRob2QKKwkJCSAqLworCQkJd2Fsa19zdGF0ZS0+cmV0dXJuX2Rlc2MgPSByZXR1cm5fZGVzYzsKKwkJfQorCisJCS8qCisJCSAqIFRoZSBmb2xsb3dpbmcgY29kZSBpcyB0aGUgb3B0aW9uYWwgc3VwcG9ydCBmb3IgdGhlIHNvLWNhbGxlZAorCQkgKiAiaW1wbGljaXQgcmV0dXJuIi4gU29tZSBBTUwgY29kZSBhc3N1bWVzIHRoYXQgdGhlIGxhc3QgdmFsdWUgb2YgdGhlCisJCSAqIG1ldGhvZCBpcyAiaW1wbGljaXRseSIgcmV0dXJuZWQgdG8gdGhlIGNhbGxlciwgaW4gdGhlIGFic2VuY2Ugb2YgYW4KKwkJICogZXhwbGljaXQgcmV0dXJuIHZhbHVlLgorCQkgKgorCQkgKiBKdXN0IHNhdmUgdGhlIGxhc3QgcmVzdWx0IG9mIHRoZSBtZXRob2QgYXMgdGhlIHJldHVybiB2YWx1ZS4KKwkJICoKKwkJICogTk9URTogdGhpcyBpcyBvcHRpb25hbCBiZWNhdXNlIHRoZSBBU0wgbGFuZ3VhZ2UgZG9lcyBub3QgYWN0dWFsbHkKKwkJICogc3VwcG9ydCB0aGlzIGJlaGF2aW9yLgorCQkgKi8KKwkJZWxzZSBpZiAoIWFjcGlfZHNfZG9faW1wbGljaXRfcmV0dXJuCisJCQkgKHJldHVybl9kZXNjLCB3YWxrX3N0YXRlLCBGQUxTRSkKKwkJCSB8fCBzYW1lX2FzX2ltcGxpY2l0X3JldHVybikgeworCQkJLyoKKwkJCSAqIERlbGV0ZSB0aGUgcmV0dXJuIHZhbHVlIGlmIGl0IHdpbGwgbm90IGJlIHVzZWQgYnkgdGhlCisJCQkgKiBjYWxsaW5nIG1ldGhvZCBvciByZW1vdmUgb25lIHJlZmVyZW5jZSBpZiB0aGUgZXhwbGljaXQgcmV0dXJuCisJCQkgKiBpcyB0aGUgc2FtZSBhcyB0aGUgaW1wbGljaXQgcmV0dXJuIHZhbHVlLgorCQkJICovCisJCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UocmV0dXJuX2Rlc2MpOworCQl9CisJfQorCisJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9kc190ZXJtaW5hdGVfY29udHJvbF9tZXRob2QKKyAqCisgKiBQQVJBTUVURVJTOiAgbWV0aG9kX2Rlc2MgICAgICAgICAtIE1ldGhvZCBvYmplY3QKKyAqICAgICAgICAgICAgICB3YWxrX3N0YXRlICAgICAgICAgIC0gU3RhdGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBtZXRob2QKKyAqCisgKiBSRVRVUk46ICAgICAgTm9uZQorICoKKyAqIERFU0NSSVBUSU9OOiBUZXJtaW5hdGUgYSBjb250cm9sIG1ldGhvZC4gIERlbGV0ZSBldmVyeXRoaW5nIHRoYXQgdGhlIG1ldGhvZAorICogICAgICAgICAgICAgIGNyZWF0ZWQsIGRlbGV0ZSBhbGwgbG9jYWxzIGFuZCBhcmd1bWVudHMsIGFuZCBkZWxldGUgdGhlIHBhcnNlCisgKiAgICAgICAgICAgICAgdHJlZSBpZiByZXF1ZXN0ZWQuCisgKgorICogTVVURVg6ICAgICAgIEludGVycHJldGVyIGlzIGxvY2tlZAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQKK2FjcGlfZHNfdGVybWluYXRlX2NvbnRyb2xfbWV0aG9kKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm1ldGhvZF9kZXNjLAorCQkJCSBzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKQoreworCisJQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIoZHNfdGVybWluYXRlX2NvbnRyb2xfbWV0aG9kLCB3YWxrX3N0YXRlKTsKKworCS8qIG1ldGhvZF9kZXNjIGlzIHJlcXVpcmVkLCB3YWxrX3N0YXRlIGlzIG9wdGlvbmFsICovCisKKwlpZiAoIW1ldGhvZF9kZXNjKSB7CisJCXJldHVybl9WT0lEOworCX0KKworCWlmICh3YWxrX3N0YXRlKSB7CisKKwkJLyogRGVsZXRlIGFsbCBhcmd1bWVudHMgYW5kIGxvY2FscyAqLworCisJCWFjcGlfZHNfbWV0aG9kX2RhdGFfZGVsZXRlX2FsbCh3YWxrX3N0YXRlKTsKKworCQkvKgorCQkgKiBJZiBtZXRob2QgaXMgc2VyaWFsaXplZCwgcmVsZWFzZSB0aGUgbXV0ZXggYW5kIHJlc3RvcmUgdGhlCisJCSAqIGN1cnJlbnQgc3luYyBsZXZlbCBmb3IgdGhpcyB0aHJlYWQKKwkJICovCisJCWlmIChtZXRob2RfZGVzYy0+bWV0aG9kLm11dGV4KSB7CisKKwkJCS8qIEFjcXVpc2l0aW9uIERlcHRoIGhhbmRsZXMgcmVjdXJzaXZlIGNhbGxzICovCisKKwkJCW1ldGhvZF9kZXNjLT5tZXRob2QubXV0ZXgtPm11dGV4LmFjcXVpc2l0aW9uX2RlcHRoLS07CisJCQlpZiAoIW1ldGhvZF9kZXNjLT5tZXRob2QubXV0ZXgtPm11dGV4LmFjcXVpc2l0aW9uX2RlcHRoKSB7CisJCQkJd2Fsa19zdGF0ZS0+dGhyZWFkLT5jdXJyZW50X3N5bmNfbGV2ZWwgPQorCQkJCSAgICBtZXRob2RfZGVzYy0+bWV0aG9kLm11dGV4LT5tdXRleC4KKwkJCQkgICAgb3JpZ2luYWxfc3luY19sZXZlbDsKKworCQkJCWFjcGlfb3NfcmVsZWFzZV9tdXRleChtZXRob2RfZGVzYy0+bWV0aG9kLgorCQkJCQkJICAgICAgbXV0ZXgtPm11dGV4Lm9zX211dGV4KTsKKwkJCQltZXRob2RfZGVzYy0+bWV0aG9kLm11dGV4LT5tdXRleC50aHJlYWRfaWQgPSBOVUxMOworCQkJfQorCQl9CisKKwkJLyoKKwkJICogRGVsZXRlIGFueSBuYW1lc3BhY2Ugb2JqZWN0cyBjcmVhdGVkIGFueXdoZXJlIHdpdGhpbgorCQkgKiB0aGUgbmFtZXNwYWNlIGJ5IHRoZSBleGVjdXRpb24gb2YgdGhpcyBtZXRob2QKKwkJICovCisJCWFjcGlfbnNfZGVsZXRlX25hbWVzcGFjZV9ieV9vd25lcihtZXRob2RfZGVzYy0+bWV0aG9kLm93bmVyX2lkKTsKKwl9CisKKwkvKiBEZWNyZW1lbnQgdGhlIHRocmVhZCBjb3VudCBvbiB0aGUgbWV0aG9kICovCisKKwlpZiAobWV0aG9kX2Rlc2MtPm1ldGhvZC50aHJlYWRfY291bnQpIHsKKwkJbWV0aG9kX2Rlc2MtPm1ldGhvZC50aHJlYWRfY291bnQtLTsKKwl9IGVsc2UgeworCQlBQ1BJX0VSUk9SKChBRV9JTkZPLCAiSW52YWxpZCB6ZXJvIHRocmVhZCBjb3VudCBpbiBtZXRob2QiKSk7CisJfQorCisJLyogQXJlIHRoZXJlIGFueSBvdGhlciB0aHJlYWRzIGN1cnJlbnRseSBleGVjdXRpbmcgdGhpcyBtZXRob2Q/ICovCisKKwlpZiAobWV0aG9kX2Rlc2MtPm1ldGhvZC50aHJlYWRfY291bnQpIHsKKwkJLyoKKwkJICogQWRkaXRpb25hbCB0aHJlYWRzLiBEbyBub3QgcmVsZWFzZSB0aGUgb3duZXJfaWQgaW4gdGhpcyBjYXNlLAorCQkgKiB3ZSBpbW1lZGlhdGVseSByZXVzZSBpdCBmb3IgdGhlIG5leHQgdGhyZWFkIGV4ZWN1dGluZyB0aGlzIG1ldGhvZAorCQkgKi8KKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9ESVNQQVRDSCwKKwkJCQkgICIqKiogQ29tcGxldGVkIGV4ZWN1dGlvbiBvZiBvbmUgdGhyZWFkLCAlZCB0aHJlYWRzIHJlbWFpbmluZ1xuIiwKKwkJCQkgIG1ldGhvZF9kZXNjLT5tZXRob2QudGhyZWFkX2NvdW50KSk7CisJfSBlbHNlIHsKKwkJLyogVGhpcyBpcyB0aGUgb25seSBleGVjdXRpbmcgdGhyZWFkIGZvciB0aGlzIG1ldGhvZCAqLworCisJCS8qCisJCSAqIFN1cHBvcnQgdG8gZHluYW1pY2FsbHkgY2hhbmdlIGEgbWV0aG9kIGZyb20gbm90X3NlcmlhbGl6ZWQgdG8KKwkJICogU2VyaWFsaXplZCBpZiBpdCBhcHBlYXJzIHRoYXQgdGhlIG1ldGhvZCBpcyBpbmNvcnJlY3RseSB3cml0dGVuIGFuZAorCQkgKiBkb2VzIG5vdCBzdXBwb3J0IG11bHRpcGxlIHRocmVhZCBleGVjdXRpb24uIFRoZSBiZXN0IGV4YW1wbGUgb2YgdGhpcworCQkgKiBpcyBpZiBzdWNoIGEgbWV0aG9kIGNyZWF0ZXMgbmFtZXNwYWNlIG9iamVjdHMgYW5kIGJsb2Nrcy4gQSBzZWNvbmQKKwkJICogdGhyZWFkIHdpbGwgZmFpbCB3aXRoIGFuIEFFX0FMUkVBRFlfRVhJU1RTIGV4Y2VwdGlvbgorCQkgKgorCQkgKiBUaGlzIGNvZGUgaXMgaGVyZSBiZWNhdXNlIHdlIG11c3Qgd2FpdCB1bnRpbCB0aGUgbGFzdCB0aHJlYWQgZXhpdHMKKwkJICogYmVmb3JlIGNyZWF0aW5nIHRoZSBzeW5jaHJvbml6YXRpb24gc2VtYXBob3JlLgorCQkgKi8KKwkJaWYgKChtZXRob2RfZGVzYy0+bWV0aG9kLm1ldGhvZF9mbGFncyAmIEFNTF9NRVRIT0RfU0VSSUFMSVpFRCkKKwkJICAgICYmICghbWV0aG9kX2Rlc2MtPm1ldGhvZC5tdXRleCkpIHsKKwkJCSh2b2lkKWFjcGlfZHNfY3JlYXRlX21ldGhvZF9tdXRleChtZXRob2RfZGVzYyk7CisJCX0KKworCQkvKiBObyBtb3JlIHRocmVhZHMsIHdlIGNhbiBmcmVlIHRoZSBvd25lcl9pZCAqLworCisJCWFjcGlfdXRfcmVsZWFzZV9vd25lcl9pZCgmbWV0aG9kX2Rlc2MtPm1ldGhvZC5vd25lcl9pZCk7CisJfQorCisJcmV0dXJuX1ZPSUQ7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2RzbXRoZGF0LmMgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2RzbXRoZGF0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGEwZjU0NgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvZHNtdGhkYXQuYwpAQCAtMCwwICsxLDcxOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBNb2R1bGUgTmFtZTogZHNtdGhkYXQgLSBjb250cm9sIG1ldGhvZCBhcmd1bWVudHMgYW5kIGxvY2FsIHZhcmlhYmxlcworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA4LCBJbnRlbCBDb3JwLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAorICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgYXQgbWluaW11bSBhIGRpc2NsYWltZXIKKyAqICAgIHN1YnN0YW50aWFsbHkgc2ltaWxhciB0byB0aGUgIk5PIFdBUlJBTlRZIiBkaXNjbGFpbWVyIGJlbG93CisgKiAgICAoIkRpc2NsYWltZXIiKSBhbmQgYW55IHJlZGlzdHJpYnV0aW9uIG11c3QgYmUgY29uZGl0aW9uZWQgdXBvbgorICogICAgaW5jbHVkaW5nIGEgc3Vic3RhbnRpYWxseSBzaW1pbGFyIERpc2NsYWltZXIgcmVxdWlyZW1lbnQgZm9yIGZ1cnRoZXIKKyAqICAgIGJpbmFyeSByZWRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcworICogICAgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBOTyBXQVJSQU5UWQorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcKKyAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgorICovCisKKyNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KKyNpbmNsdWRlICJhY2NvbW1vbi5oIgorI2luY2x1ZGUgImFjZGlzcGF0LmgiCisjaW5jbHVkZSAiYWNuYW1lc3AuaCIKKyNpbmNsdWRlICJhY2ludGVycC5oIgorCisjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9ESVNQQVRDSEVSCitBQ1BJX01PRFVMRV9OQU1FKCJkc210aGRhdCIpCisKKy8qIExvY2FsIHByb3RvdHlwZXMgKi8KK3N0YXRpYyB2b2lkCithY3BpX2RzX21ldGhvZF9kYXRhX2RlbGV0ZV92YWx1ZSh1OCB0eXBlLAorCQkJCSB1MzIgaW5kZXgsIHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUpOworCitzdGF0aWMgYWNwaV9zdGF0dXMKK2FjcGlfZHNfbWV0aG9kX2RhdGFfc2V0X3ZhbHVlKHU4IHR5cGUsCisJCQkgICAgICB1MzIgaW5kZXgsCisJCQkgICAgICB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmplY3QsCisJCQkgICAgICBzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKTsKKworI2lmZGVmIEFDUElfT0JTT0xFVEVfRlVOQ1RJT05TCithY3BpX29iamVjdF90eXBlCithY3BpX2RzX21ldGhvZF9kYXRhX2dldF90eXBlKHUxNiBvcGNvZGUsCisJCQkgICAgIHUzMiBpbmRleCwgc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSk7CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9kc19tZXRob2RfZGF0YV9pbml0CisgKgorICogUEFSQU1FVEVSUzogIHdhbGtfc3RhdGUgICAgICAgICAgLSBDdXJyZW50IHdhbGsgc3RhdGUgb2JqZWN0CisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBJbml0aWFsaXplIHRoZSBkYXRhIHN0cnVjdHVyZXMgdGhhdCBob2xkIHRoZSBtZXRob2QncyBhcmd1bWVudHMKKyAqICAgICAgICAgICAgICBhbmQgbG9jYWxzLiAgVGhlIGRhdGEgc3RydWN0IGlzIGFuIGFycmF5IG9mIG5hbWVzcGFjZSBub2RlcyBmb3IKKyAqICAgICAgICAgICAgICBlYWNoIC0gdGhpcyBhbGxvd3MgcmVmX29mIGFuZCBkZV9yZWZfb2YgdG8gd29yayBwcm9wZXJseSBmb3IgdGhlc2UKKyAqICAgICAgICAgICAgICBzcGVjaWFsIGRhdGEgdHlwZXMuCisgKgorICogTk9URVM6ICAgICAgIHdhbGtfc3RhdGUgZmllbGRzIGFyZSBpbml0aWFsaXplZCB0byB6ZXJvIGJ5IHRoZQorICogICAgICAgICAgICAgIEFDUElfQUxMT0NBVEVfWkVST0VEKCkuCisgKgorICogICAgICAgICAgICAgIEEgcHNldWRvLU5hbWVzcGFjZSBOb2RlIGlzIGFzc2lnbmVkIHRvIGVhY2ggYXJndW1lbnQgYW5kIGxvY2FsCisgKiAgICAgICAgICAgICAgc28gdGhhdCByZWZfb2YoKSBjYW4gcmV0dXJuIGEgcG9pbnRlciB0byB0aGUgTm9kZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIGFjcGlfZHNfbWV0aG9kX2RhdGFfaW5pdChzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKQoreworCXUzMiBpOworCisJQUNQSV9GVU5DVElPTl9UUkFDRShkc19tZXRob2RfZGF0YV9pbml0KTsKKworCS8qIEluaXQgdGhlIG1ldGhvZCBhcmd1bWVudHMgKi8KKworCWZvciAoaSA9IDA7IGkgPCBBQ1BJX01FVEhPRF9OVU1fQVJHUzsgaSsrKSB7CisJCUFDUElfTU9WRV8zMl9UT18zMigmd2Fsa19zdGF0ZS0+YXJndW1lbnRzW2ldLm5hbWUsCisJCQkJICAgTkFNRU9GX0FSR19OVEUpOworCQl3YWxrX3N0YXRlLT5hcmd1bWVudHNbaV0ubmFtZS5pbnRlZ2VyIHw9IChpIDw8IDI0KTsKKwkJd2Fsa19zdGF0ZS0+YXJndW1lbnRzW2ldLmRlc2NyaXB0b3JfdHlwZSA9IEFDUElfREVTQ19UWVBFX05BTUVEOworCQl3YWxrX3N0YXRlLT5hcmd1bWVudHNbaV0udHlwZSA9IEFDUElfVFlQRV9BTlk7CisJCXdhbGtfc3RhdGUtPmFyZ3VtZW50c1tpXS5mbGFncyA9CisJCSAgICBBTk9CSl9FTkRfT0ZfUEVFUl9MSVNUIHwgQU5PQkpfTUVUSE9EX0FSRzsKKwl9CisKKwkvKiBJbml0IHRoZSBtZXRob2QgbG9jYWxzICovCisKKwlmb3IgKGkgPSAwOyBpIDwgQUNQSV9NRVRIT0RfTlVNX0xPQ0FMUzsgaSsrKSB7CisJCUFDUElfTU9WRV8zMl9UT18zMigmd2Fsa19zdGF0ZS0+bG9jYWxfdmFyaWFibGVzW2ldLm5hbWUsCisJCQkJICAgTkFNRU9GX0xPQ0FMX05URSk7CisKKwkJd2Fsa19zdGF0ZS0+bG9jYWxfdmFyaWFibGVzW2ldLm5hbWUuaW50ZWdlciB8PSAoaSA8PCAyNCk7CisJCXdhbGtfc3RhdGUtPmxvY2FsX3ZhcmlhYmxlc1tpXS5kZXNjcmlwdG9yX3R5cGUgPQorCQkgICAgQUNQSV9ERVNDX1RZUEVfTkFNRUQ7CisJCXdhbGtfc3RhdGUtPmxvY2FsX3ZhcmlhYmxlc1tpXS50eXBlID0gQUNQSV9UWVBFX0FOWTsKKwkJd2Fsa19zdGF0ZS0+bG9jYWxfdmFyaWFibGVzW2ldLmZsYWdzID0KKwkJICAgIEFOT0JKX0VORF9PRl9QRUVSX0xJU1QgfCBBTk9CSl9NRVRIT0RfTE9DQUw7CisJfQorCisJcmV0dXJuX1ZPSUQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfZHNfbWV0aG9kX2RhdGFfZGVsZXRlX2FsbAorICoKKyAqIFBBUkFNRVRFUlM6ICB3YWxrX3N0YXRlICAgICAgICAgIC0gQ3VycmVudCB3YWxrIHN0YXRlIG9iamVjdAorICoKKyAqIFJFVFVSTjogICAgICBOb25lCisgKgorICogREVTQ1JJUFRJT046IERlbGV0ZSBtZXRob2QgbG9jYWxzIGFuZCBhcmd1bWVudHMuICBBcmd1bWVudHMgYXJlIG9ubHkKKyAqICAgICAgICAgICAgICBkZWxldGVkIGlmIHRoaXMgbWV0aG9kIHdhcyBjYWxsZWQgZnJvbSBhbm90aGVyIG1ldGhvZC4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIGFjcGlfZHNfbWV0aG9kX2RhdGFfZGVsZXRlX2FsbChzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKQoreworCXUzMiBpbmRleDsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0UoZHNfbWV0aG9kX2RhdGFfZGVsZXRlX2FsbCk7CisKKwkvKiBEZXRhY2ggdGhlIGxvY2FscyAqLworCisJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgQUNQSV9NRVRIT0RfTlVNX0xPQ0FMUzsgaW5kZXgrKykgeworCQlpZiAod2Fsa19zdGF0ZS0+bG9jYWxfdmFyaWFibGVzW2luZGV4XS5vYmplY3QpIHsKKwkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVhFQywgIkRlbGV0aW5nIExvY2FsJWQ9JXBcbiIsCisJCQkJCSAgaW5kZXgsCisJCQkJCSAgd2Fsa19zdGF0ZS0+bG9jYWxfdmFyaWFibGVzW2luZGV4XS4KKwkJCQkJICBvYmplY3QpKTsKKworCQkJLyogRGV0YWNoIG9iamVjdCAoaWYgcHJlc2VudCkgYW5kIHJlbW92ZSBhIHJlZmVyZW5jZSAqLworCisJCQlhY3BpX25zX2RldGFjaF9vYmplY3QoJndhbGtfc3RhdGUtPgorCQkJCQkgICAgICBsb2NhbF92YXJpYWJsZXNbaW5kZXhdKTsKKwkJfQorCX0KKworCS8qIERldGFjaCB0aGUgYXJndW1lbnRzICovCisKKwlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBBQ1BJX01FVEhPRF9OVU1fQVJHUzsgaW5kZXgrKykgeworCQlpZiAod2Fsa19zdGF0ZS0+YXJndW1lbnRzW2luZGV4XS5vYmplY3QpIHsKKwkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVhFQywgIkRlbGV0aW5nIEFyZyVkPSVwXG4iLAorCQkJCQkgIGluZGV4LAorCQkJCQkgIHdhbGtfc3RhdGUtPmFyZ3VtZW50c1tpbmRleF0ub2JqZWN0KSk7CisKKwkJCS8qIERldGFjaCBvYmplY3QgKGlmIHByZXNlbnQpIGFuZCByZW1vdmUgYSByZWZlcmVuY2UgKi8KKworCQkJYWNwaV9uc19kZXRhY2hfb2JqZWN0KCZ3YWxrX3N0YXRlLT5hcmd1bWVudHNbaW5kZXhdKTsKKwkJfQorCX0KKworCXJldHVybl9WT0lEOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX2RzX21ldGhvZF9kYXRhX2luaXRfYXJncworICoKKyAqIFBBUkFNRVRFUlM6ICAqUGFyYW1zICAgICAgICAgLSBQb2ludGVyIHRvIGEgcGFyYW1ldGVyIGxpc3QgZm9yIHRoZSBtZXRob2QKKyAqICAgICAgICAgICAgICBtYXhfcGFyYW1fY291bnQgLSBUaGUgYXJnIGNvdW50IGZvciB0aGlzIG1ldGhvZAorICogICAgICAgICAgICAgIHdhbGtfc3RhdGUgICAgICAtIEN1cnJlbnQgd2FsayBzdGF0ZSBvYmplY3QKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IEluaXRpYWxpemUgYXJndW1lbnRzIGZvciBhIG1ldGhvZC4gIFRoZSBwYXJhbWV0ZXIgbGlzdCBpcyBhIGxpc3QKKyAqICAgICAgICAgICAgICBvZiBBQ1BJIG9wZXJhbmQgb2JqZWN0cywgZWl0aGVyIG51bGwgdGVybWluYXRlZCBvciB3aG9zZSBsZW5ndGgKKyAqICAgICAgICAgICAgICBpcyBkZWZpbmVkIGJ5IG1heF9wYXJhbV9jb3VudC4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCithY3BpX3N0YXR1cworYWNwaV9kc19tZXRob2RfZGF0YV9pbml0X2FyZ3ModW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKnBhcmFtcywKKwkJCSAgICAgIHUzMiBtYXhfcGFyYW1fY291bnQsCisJCQkgICAgICBzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKQoreworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwl1MzIgaW5kZXggPSAwOworCisJQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIoZHNfbWV0aG9kX2RhdGFfaW5pdF9hcmdzLCBwYXJhbXMpOworCisJaWYgKCFwYXJhbXMpIHsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FWEVDLAorCQkJCSAgIk5vIHBhcmFtIGxpc3QgcGFzc2VkIHRvIG1ldGhvZFxuIikpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOworCX0KKworCS8qIENvcHkgcGFzc2VkIHBhcmFtZXRlcnMgaW50byB0aGUgbmV3IG1ldGhvZCBzdGFjayBmcmFtZSAqLworCisJd2hpbGUgKChpbmRleCA8IEFDUElfTUVUSE9EX05VTV9BUkdTKSAmJgorCSAgICAgICAoaW5kZXggPCBtYXhfcGFyYW1fY291bnQpICYmIHBhcmFtc1tpbmRleF0pIHsKKwkJLyoKKwkJICogQSB2YWxpZCBwYXJhbWV0ZXIuCisJCSAqIFN0b3JlIHRoZSBhcmd1bWVudCBpbiB0aGUgbWV0aG9kL3dhbGsgZGVzY3JpcHRvci4KKwkJICogRG8gbm90IGNvcHkgdGhlIGFyZyBpbiBvcmRlciB0byBpbXBsZW1lbnQgY2FsbCBieSByZWZlcmVuY2UKKwkJICovCisJCXN0YXR1cyA9IGFjcGlfZHNfbWV0aG9kX2RhdGFfc2V0X3ZhbHVlKEFDUElfUkVGQ0xBU1NfQVJHLCBpbmRleCwKKwkJCQkJCSAgICAgICBwYXJhbXNbaW5kZXhdLAorCQkJCQkJICAgICAgIHdhbGtfc3RhdGUpOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworCQl9CisKKwkJaW5kZXgrKzsKKwl9CisKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VYRUMsICIlZCBhcmdzIHBhc3NlZCB0byBtZXRob2RcbiIsIGluZGV4KSk7CisJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9kc19tZXRob2RfZGF0YV9nZXRfbm9kZQorICoKKyAqIFBBUkFNRVRFUlM6ICBUeXBlICAgICAgICAgICAgICAgIC0gRWl0aGVyIEFDUElfUkVGQ0xBU1NfTE9DQUwgb3IKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUNQSV9SRUZDTEFTU19BUkcKKyAqICAgICAgICAgICAgICBJbmRleCAgICAgICAgICAgICAgIC0gV2hpY2ggTG9jYWwgb3IgQXJnIHdob3NlIHR5cGUgdG8gZ2V0CisgKiAgICAgICAgICAgICAgd2Fsa19zdGF0ZSAgICAgICAgICAtIEN1cnJlbnQgd2FsayBzdGF0ZSBvYmplY3QKKyAqICAgICAgICAgICAgICBOb2RlICAgICAgICAgICAgICAgIC0gV2hlcmUgdGhlIG5vZGUgaXMgcmV0dXJuZWQuCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cyBhbmQgbm9kZQorICoKKyAqIERFU0NSSVBUSU9OOiBHZXQgdGhlIE5vZGUgYXNzb2NpYXRlZCB3aXRoIGEgbG9jYWwgb3IgYXJnLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2FjcGlfc3RhdHVzCithY3BpX2RzX21ldGhvZF9kYXRhX2dldF9ub2RlKHU4IHR5cGUsCisJCQkgICAgIHUzMiBpbmRleCwKKwkJCSAgICAgc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSwKKwkJCSAgICAgc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKipub2RlKQoreworCUFDUElfRlVOQ1RJT05fVFJBQ0UoZHNfbWV0aG9kX2RhdGFfZ2V0X25vZGUpOworCisJLyoKKwkgKiBNZXRob2QgTG9jYWxzIGFuZCBBcmd1bWVudHMgYXJlIHN1cHBvcnRlZAorCSAqLworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgQUNQSV9SRUZDTEFTU19MT0NBTDoKKworCQlpZiAoaW5kZXggPiBBQ1BJX01FVEhPRF9NQVhfTE9DQUwpIHsKKwkJCUFDUElfRVJST1IoKEFFX0lORk8sCisJCQkJICAgICJMb2NhbCBpbmRleCAlZCBpcyBpbnZhbGlkIChtYXggJWQpIiwKKwkJCQkgICAgaW5kZXgsIEFDUElfTUVUSE9EX01BWF9MT0NBTCkpOworCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9JTlZBTElEX0lOREVYKTsKKwkJfQorCisJCS8qIFJldHVybiBhIHBvaW50ZXIgdG8gdGhlIHBzZXVkby1ub2RlICovCisKKwkJKm5vZGUgPSAmd2Fsa19zdGF0ZS0+bG9jYWxfdmFyaWFibGVzW2luZGV4XTsKKwkJYnJlYWs7CisKKwljYXNlIEFDUElfUkVGQ0xBU1NfQVJHOgorCisJCWlmIChpbmRleCA+IEFDUElfTUVUSE9EX01BWF9BUkcpIHsKKwkJCUFDUElfRVJST1IoKEFFX0lORk8sCisJCQkJICAgICJBcmcgaW5kZXggJWQgaXMgaW52YWxpZCAobWF4ICVkKSIsCisJCQkJICAgIGluZGV4LCBBQ1BJX01FVEhPRF9NQVhfQVJHKSk7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX0lOVkFMSURfSU5ERVgpOworCQl9CisKKwkJLyogUmV0dXJuIGEgcG9pbnRlciB0byB0aGUgcHNldWRvLW5vZGUgKi8KKworCQkqbm9kZSA9ICZ3YWxrX3N0YXRlLT5hcmd1bWVudHNbaW5kZXhdOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCUFDUElfRVJST1IoKEFFX0lORk8sICJUeXBlICVkIGlzIGludmFsaWQiLCB0eXBlKSk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9UWVBFKTsKKwl9CisKKwlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX2RzX21ldGhvZF9kYXRhX3NldF92YWx1ZQorICoKKyAqIFBBUkFNRVRFUlM6ICBUeXBlICAgICAgICAgICAgICAgIC0gRWl0aGVyIEFDUElfUkVGQ0xBU1NfTE9DQUwgb3IKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUNQSV9SRUZDTEFTU19BUkcKKyAqICAgICAgICAgICAgICBJbmRleCAgICAgICAgICAgICAgIC0gV2hpY2ggTG9jYWwgb3IgQXJnIHRvIGdldAorICogICAgICAgICAgICAgIE9iamVjdCAgICAgICAgICAgICAgLSBPYmplY3QgdG8gYmUgaW5zZXJ0ZWQgaW50byB0aGUgc3RhY2sgZW50cnkKKyAqICAgICAgICAgICAgICB3YWxrX3N0YXRlICAgICAgICAgIC0gQ3VycmVudCB3YWxrIHN0YXRlIG9iamVjdAorICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogSW5zZXJ0IGFuIG9iamVjdCBvbnRvIHRoZSBtZXRob2Qgc3RhY2sgYXQgZW50cnkgT3Bjb2RlOkluZGV4LgorICogICAgICAgICAgICAgIE5vdGU6IFRoZXJlIGlzIG5vICJpbXBsaWNpdCBjb252ZXJzaW9uIiBmb3IgbG9jYWxzLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBhY3BpX3N0YXR1cworYWNwaV9kc19tZXRob2RfZGF0YV9zZXRfdmFsdWUodTggdHlwZSwKKwkJCSAgICAgIHUzMiBpbmRleCwKKwkJCSAgICAgIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9iamVjdCwKKwkJCSAgICAgIHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUpCit7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlOworCisJQUNQSV9GVU5DVElPTl9UUkFDRShkc19tZXRob2RfZGF0YV9zZXRfdmFsdWUpOworCisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FWEVDLAorCQkJICAiTmV3T2JqICVwIFR5cGUgJTIuMlgsIFJlZnM9JWQgWyVzXVxuIiwgb2JqZWN0LAorCQkJICB0eXBlLCBvYmplY3QtPmNvbW1vbi5yZWZlcmVuY2VfY291bnQsCisJCQkgIGFjcGlfdXRfZ2V0X3R5cGVfbmFtZShvYmplY3QtPmNvbW1vbi50eXBlKSkpOworCisJLyogR2V0IHRoZSBuYW1lc3BhY2Ugbm9kZSBmb3IgdGhlIGFyZy9sb2NhbCAqLworCisJc3RhdHVzID0gYWNwaV9kc19tZXRob2RfZGF0YV9nZXRfbm9kZSh0eXBlLCBpbmRleCwgd2Fsa19zdGF0ZSwgJm5vZGUpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKKwl9CisKKwkvKgorCSAqIEluY3JlbWVudCByZWYgY291bnQgc28gb2JqZWN0IGNhbid0IGJlIGRlbGV0ZWQgd2hpbGUgaW5zdGFsbGVkLgorCSAqIE5PVEU6IFdlIGRvIG5vdCBjb3B5IHRoZSBvYmplY3QgaW4gb3JkZXIgdG8gcHJlc2VydmUgdGhlIGNhbGwgYnkKKwkgKiByZWZlcmVuY2Ugc2VtYW50aWNzIG9mIEFDUEkgQ29udHJvbCBNZXRob2QgaW52b2NhdGlvbi4KKwkgKiAoU2VlIEFDUEkgU3BlY2lmaWNhdGlvbiAyLjBfYykKKwkgKi8KKwlhY3BpX3V0X2FkZF9yZWZlcmVuY2Uob2JqZWN0KTsKKworCS8qIEluc3RhbGwgdGhlIG9iamVjdCAqLworCisJbm9kZS0+b2JqZWN0ID0gb2JqZWN0OworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX2RzX21ldGhvZF9kYXRhX2dldF92YWx1ZQorICoKKyAqIFBBUkFNRVRFUlM6ICBUeXBlICAgICAgICAgICAgICAgIC0gRWl0aGVyIEFDUElfUkVGQ0xBU1NfTE9DQUwgb3IKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUNQSV9SRUZDTEFTU19BUkcKKyAqICAgICAgICAgICAgICBJbmRleCAgICAgICAgICAgICAgIC0gV2hpY2ggbG9jYWxfdmFyIG9yIGFyZ3VtZW50IHRvIGdldAorICogICAgICAgICAgICAgIHdhbGtfc3RhdGUgICAgICAgICAgLSBDdXJyZW50IHdhbGsgc3RhdGUgb2JqZWN0CisgKiAgICAgICAgICAgICAgZGVzdF9kZXNjICAgICAgICAgICAtIFdoZXJlIEFyZyBvciBMb2NhbCB2YWx1ZSBpcyByZXR1cm5lZAorICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogUmV0cmlldmUgdmFsdWUgb2Ygc2VsZWN0ZWQgQXJnIG9yIExvY2FsIGZvciB0aGlzIG1ldGhvZAorICogICAgICAgICAgICAgIFVzZWQgb25seSBpbiBhY3BpX2V4X3Jlc29sdmVfdG9fdmFsdWUoKS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCithY3BpX3N0YXR1cworYWNwaV9kc19tZXRob2RfZGF0YV9nZXRfdmFsdWUodTggdHlwZSwKKwkJCSAgICAgIHUzMiBpbmRleCwKKwkJCSAgICAgIHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUsCisJCQkgICAgICB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICoqZGVzdF9kZXNjKQoreworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZTsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmplY3Q7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGRzX21ldGhvZF9kYXRhX2dldF92YWx1ZSk7CisKKwkvKiBWYWxpZGF0ZSB0aGUgb2JqZWN0IGRlc2NyaXB0b3IgKi8KKworCWlmICghZGVzdF9kZXNjKSB7CisJCUFDUElfRVJST1IoKEFFX0lORk8sICJOdWxsIG9iamVjdCBkZXNjcmlwdG9yIHBvaW50ZXIiKSk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfUEFSQU1FVEVSKTsKKwl9CisKKwkvKiBHZXQgdGhlIG5hbWVzcGFjZSBub2RlIGZvciB0aGUgYXJnL2xvY2FsICovCisKKwlzdGF0dXMgPSBhY3BpX2RzX21ldGhvZF9kYXRhX2dldF9ub2RlKHR5cGUsIGluZGV4LCB3YWxrX3N0YXRlLCAmbm9kZSk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworCX0KKworCS8qIEdldCB0aGUgb2JqZWN0IGZyb20gdGhlIG5vZGUgKi8KKworCW9iamVjdCA9IG5vZGUtPm9iamVjdDsKKworCS8qIEV4YW1pbmUgdGhlIHJldHVybmVkIG9iamVjdCwgaXQgbXVzdCBiZSB2YWxpZC4gKi8KKworCWlmICghb2JqZWN0KSB7CisJCS8qCisJCSAqIEluZGV4IHBvaW50cyB0byB1bmluaXRpYWxpemVkIG9iamVjdC4KKwkJICogVGhpcyBtZWFucyB0aGF0IGVpdGhlciAxKSBUaGUgZXhwZWN0ZWQgYXJndW1lbnQgd2FzCisJCSAqIG5vdCBwYXNzZWQgdG8gdGhlIG1ldGhvZCwgb3IgMikgQSBsb2NhbCB2YXJpYWJsZQorCQkgKiB3YXMgcmVmZXJlbmNlZCBieSB0aGUgbWV0aG9kICh2aWEgdGhlIEFTTCkKKwkJICogYmVmb3JlIGl0IHdhcyBpbml0aWFsaXplZC4gIEVpdGhlciBjYXNlIGlzIGFuIGVycm9yLgorCQkgKi8KKworCQkvKiBJZiBzbGFjayBlbmFibGVkLCBpbml0IHRoZSBsb2NhbF94L2FyZ194IHRvIGFuIEludGVnZXIgb2YgdmFsdWUgemVybyAqLworCisJCWlmIChhY3BpX2dibF9lbmFibGVfaW50ZXJwcmV0ZXJfc2xhY2spIHsKKwkJCW9iamVjdCA9CisJCQkgICAgYWNwaV91dF9jcmVhdGVfaW50ZXJuYWxfb2JqZWN0KEFDUElfVFlQRV9JTlRFR0VSKTsKKwkJCWlmICghb2JqZWN0KSB7CisJCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX01FTU9SWSk7CisJCQl9CisKKwkJCW9iamVjdC0+aW50ZWdlci52YWx1ZSA9IDA7CisJCQlub2RlLT5vYmplY3QgPSBvYmplY3Q7CisJCX0KKworCQkvKiBPdGhlcndpc2UsIHJldHVybiB0aGUgZXJyb3IgKi8KKworCQllbHNlCisJCQlzd2l0Y2ggKHR5cGUpIHsKKwkJCWNhc2UgQUNQSV9SRUZDTEFTU19BUkc6CisKKwkJCQlBQ1BJX0VSUk9SKChBRV9JTkZPLAorCQkJCQkgICAgIlVuaW5pdGlhbGl6ZWQgQXJnWyVkXSBhdCBub2RlICVwIiwKKwkJCQkJICAgIGluZGV4LCBub2RlKSk7CisKKwkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX1VOSU5JVElBTElaRURfQVJHKTsKKworCQkJY2FzZSBBQ1BJX1JFRkNMQVNTX0xPQ0FMOgorCisJCQkJQUNQSV9FUlJPUigoQUVfSU5GTywKKwkJCQkJICAgICJVbmluaXRpYWxpemVkIExvY2FsWyVkXSBhdCBub2RlICVwIiwKKwkJCQkJICAgIGluZGV4LCBub2RlKSk7CisKKwkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX1VOSU5JVElBTElaRURfTE9DQUwpOworCisJCQlkZWZhdWx0OgorCisJCQkJQUNQSV9FUlJPUigoQUVfSU5GTywKKwkJCQkJICAgICJOb3QgYSBBcmcvTG9jYWwgb3Bjb2RlOiAlWCIsCisJCQkJCSAgICB0eXBlKSk7CisJCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9JTlRFUk5BTCk7CisJCQl9CisJfQorCisJLyoKKwkgKiBUaGUgSW5kZXggcG9pbnRzIHRvIGFuIGluaXRpYWxpemVkIGFuZCB2YWxpZCBvYmplY3QuCisJICogUmV0dXJuIGFuIGFkZGl0aW9uYWwgcmVmZXJlbmNlIHRvIHRoZSBvYmplY3QKKwkgKi8KKwkqZGVzdF9kZXNjID0gb2JqZWN0OworCWFjcGlfdXRfYWRkX3JlZmVyZW5jZShvYmplY3QpOworCisJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9kc19tZXRob2RfZGF0YV9kZWxldGVfdmFsdWUKKyAqCisgKiBQQVJBTUVURVJTOiAgVHlwZSAgICAgICAgICAgICAgICAtIEVpdGhlciBBQ1BJX1JFRkNMQVNTX0xPQ0FMIG9yCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFDUElfUkVGQ0xBU1NfQVJHCisgKiAgICAgICAgICAgICAgSW5kZXggICAgICAgICAgICAgICAtIFdoaWNoIGxvY2FsX3ZhciBvciBhcmd1bWVudCB0byBkZWxldGUKKyAqICAgICAgICAgICAgICB3YWxrX3N0YXRlICAgICAgICAgIC0gQ3VycmVudCB3YWxrIHN0YXRlIG9iamVjdAorICoKKyAqIFJFVFVSTjogICAgICBOb25lCisgKgorICogREVTQ1JJUFRJT046IERlbGV0ZSB0aGUgZW50cnkgYXQgT3Bjb2RlOkluZGV4LiAgSW5zZXJ0cworICogICAgICAgICAgICAgIGEgbnVsbCBpbnRvIHRoZSBzdGFjayBzbG90IGFmdGVyIHRoZSBvYmplY3QgaXMgZGVsZXRlZC4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZAorYWNwaV9kc19tZXRob2RfZGF0YV9kZWxldGVfdmFsdWUodTggdHlwZSwKKwkJCQkgdTMyIGluZGV4LCBzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKQoreworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZTsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmplY3Q7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGRzX21ldGhvZF9kYXRhX2RlbGV0ZV92YWx1ZSk7CisKKwkvKiBHZXQgdGhlIG5hbWVzcGFjZSBub2RlIGZvciB0aGUgYXJnL2xvY2FsICovCisKKwlzdGF0dXMgPSBhY3BpX2RzX21ldGhvZF9kYXRhX2dldF9ub2RlKHR5cGUsIGluZGV4LCB3YWxrX3N0YXRlLCAmbm9kZSk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXJldHVybl9WT0lEOworCX0KKworCS8qIEdldCB0aGUgYXNzb2NpYXRlZCBvYmplY3QgKi8KKworCW9iamVjdCA9IGFjcGlfbnNfZ2V0X2F0dGFjaGVkX29iamVjdChub2RlKTsKKworCS8qCisJICogVW5kZWZpbmUgdGhlIEFyZyBvciBMb2NhbCBieSBzZXR0aW5nIGl0cyBkZXNjcmlwdG9yCisJICogcG9pbnRlciB0byBOVUxMLiBMb2NhbHMvQXJncyBjYW4gY29udGFpbiBib3RoCisJICogQUNQSV9PUEVSQU5EX09CSkVDVFMgYW5kIEFDUElfTkFNRVNQQUNFX05PREVzCisJICovCisJbm9kZS0+b2JqZWN0ID0gTlVMTDsKKworCWlmICgob2JqZWN0KSAmJgorCSAgICAoQUNQSV9HRVRfREVTQ1JJUFRPUl9UWVBFKG9iamVjdCkgPT0gQUNQSV9ERVNDX1RZUEVfT1BFUkFORCkpIHsKKwkJLyoKKwkJICogVGhlcmUgaXMgYSB2YWxpZCBvYmplY3QuCisJCSAqIERlY3JlbWVudCB0aGUgcmVmZXJlbmNlIGNvdW50IGJ5IG9uZSB0byBiYWxhbmNlIHRoZQorCQkgKiBpbmNyZW1lbnQgd2hlbiB0aGUgb2JqZWN0IHdhcyBzdG9yZWQuCisJCSAqLworCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2Uob2JqZWN0KTsKKwl9CisKKwlyZXR1cm5fVk9JRDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9kc19zdG9yZV9vYmplY3RfdG9fbG9jYWwKKyAqCisgKiBQQVJBTUVURVJTOiAgVHlwZSAgICAgICAgICAgICAgICAtIEVpdGhlciBBQ1BJX1JFRkNMQVNTX0xPQ0FMIG9yCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFDUElfUkVGQ0xBU1NfQVJHCisgKiAgICAgICAgICAgICAgSW5kZXggICAgICAgICAgICAgICAtIFdoaWNoIExvY2FsIG9yIEFyZyB0byBzZXQKKyAqICAgICAgICAgICAgICBvYmpfZGVzYyAgICAgICAgICAgIC0gVmFsdWUgdG8gYmUgc3RvcmVkCisgKiAgICAgICAgICAgICAgd2Fsa19zdGF0ZSAgICAgICAgICAtIEN1cnJlbnQgd2FsayBzdGF0ZQorICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogU3RvcmUgYSB2YWx1ZSBpbiBhbiBBcmcgb3IgTG9jYWwuICBUaGUgb2JqX2Rlc2MgaXMgaW5zdGFsbGVkCisgKiAgICAgICAgICAgICAgYXMgdGhlIG5ldyB2YWx1ZSBmb3IgdGhlIEFyZyBvciBMb2NhbCBhbmQgdGhlIHJlZmVyZW5jZSBjb3VudAorICogICAgICAgICAgICAgIGZvciBvYmpfZGVzYyBpcyBpbmNyZW1lbnRlZC4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCithY3BpX3N0YXR1cworYWNwaV9kc19zdG9yZV9vYmplY3RfdG9fbG9jYWwodTggdHlwZSwKKwkJCSAgICAgIHUzMiBpbmRleCwKKwkJCSAgICAgIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjLAorCQkJICAgICAgc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSkKK3sKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGU7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqY3VycmVudF9vYmpfZGVzYzsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpuZXdfb2JqX2Rlc2M7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGRzX3N0b3JlX29iamVjdF90b19sb2NhbCk7CisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FWEVDLCAiVHlwZT0lMi4yWCBJbmRleD0lZCBPYmo9JXBcbiIsCisJCQkgIHR5cGUsIGluZGV4LCBvYmpfZGVzYykpOworCisJLyogUGFyYW1ldGVyIHZhbGlkYXRpb24gKi8KKworCWlmICghb2JqX2Rlc2MpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9QQVJBTUVURVIpOworCX0KKworCS8qIEdldCB0aGUgbmFtZXNwYWNlIG5vZGUgZm9yIHRoZSBhcmcvbG9jYWwgKi8KKworCXN0YXR1cyA9IGFjcGlfZHNfbWV0aG9kX2RhdGFfZ2V0X25vZGUodHlwZSwgaW5kZXgsIHdhbGtfc3RhdGUsICZub2RlKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CisJfQorCisJY3VycmVudF9vYmpfZGVzYyA9IGFjcGlfbnNfZ2V0X2F0dGFjaGVkX29iamVjdChub2RlKTsKKwlpZiAoY3VycmVudF9vYmpfZGVzYyA9PSBvYmpfZGVzYykgeworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VYRUMsICJPYmo9JXAgYWxyZWFkeSBpbnN0YWxsZWQhXG4iLAorCQkJCSAgb2JqX2Rlc2MpKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CisJfQorCisJLyoKKwkgKiBJZiB0aGUgcmVmZXJlbmNlIGNvdW50IG9uIHRoZSBvYmplY3QgaXMgbW9yZSB0aGFuIG9uZSwgd2UgbXVzdAorCSAqIHRha2UgYSBjb3B5IG9mIHRoZSBvYmplY3QgYmVmb3JlIHdlIHN0b3JlLiAgQSByZWZlcmVuY2UgY291bnQKKwkgKiBvZiBleGFjdGx5IDEgbWVhbnMgdGhhdCB0aGUgb2JqZWN0IHdhcyBqdXN0IGNyZWF0ZWQgZHVyaW5nIHRoZQorCSAqIGV2YWx1YXRpb24gb2YgYW4gZXhwcmVzc2lvbiwgYW5kIHdlIGNhbiBzYWZlbHkgdXNlIGl0IHNpbmNlIGl0CisJICogaXMgbm90IHVzZWQgYW55d2hlcmUgZWxzZS4KKwkgKi8KKwluZXdfb2JqX2Rlc2MgPSBvYmpfZGVzYzsKKwlpZiAob2JqX2Rlc2MtPmNvbW1vbi5yZWZlcmVuY2VfY291bnQgPiAxKSB7CisJCXN0YXR1cyA9CisJCSAgICBhY3BpX3V0X2NvcHlfaW9iamVjdF90b19pb2JqZWN0KG9ial9kZXNjLCAmbmV3X29ial9kZXNjLAorCQkJCQkJICAgIHdhbGtfc3RhdGUpOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworCQl9CisJfQorCisJLyoKKwkgKiBJZiB0aGVyZSBpcyBhbiBvYmplY3QgYWxyZWFkeSBpbiB0aGlzIHNsb3QsIHdlIGVpdGhlcgorCSAqIGhhdmUgdG8gZGVsZXRlIGl0LCBvciBpZiB0aGlzIGlzIGFuIGFyZ3VtZW50IGFuZCB0aGVyZQorCSAqIGlzIGFuIG9iamVjdCByZWZlcmVuY2Ugc3RvcmVkIHRoZXJlLCB3ZSBoYXZlIHRvIGRvCisJICogYW4gaW5kaXJlY3Qgc3RvcmUhCisJICovCisJaWYgKGN1cnJlbnRfb2JqX2Rlc2MpIHsKKwkJLyoKKwkJICogQ2hlY2sgZm9yIGFuIGluZGlyZWN0IHN0b3JlIGlmIGFuIGFyZ3VtZW50CisJCSAqIGNvbnRhaW5zIGFuIG9iamVjdCByZWZlcmVuY2UgKHN0b3JlZCBhcyBhbiBOb2RlKS4KKwkJICogV2UgZG9uJ3QgYWxsb3cgdGhpcyBhdXRvbWF0aWMgZGVyZWZlcmVuY2luZyBmb3IKKwkJICogbG9jYWxzLCBzaW5jZSBhIHN0b3JlIHRvIGEgbG9jYWwgc2hvdWxkIG92ZXJ3cml0ZQorCQkgKiBhbnl0aGluZyB0aGVyZSwgaW5jbHVkaW5nIGFuIG9iamVjdCByZWZlcmVuY2UuCisJCSAqCisJCSAqIElmIGJvdGggQXJnMCBhbmQgTG9jYWwwIGNvbnRhaW4gcmVmX29mIChMb2NhbDQpOgorCQkgKgorCQkgKiBTdG9yZSAoMSwgQXJnMCkgICAgICAgICAgICAgLSBDYXVzZXMgaW5kaXJlY3Qgc3RvcmUgdG8gbG9jYWw0CisJCSAqIFN0b3JlICgxLCBMb2NhbDApICAgICAgICAgICAtIFN0b3JlcyAxIGluIGxvY2FsMCwgb3ZlcndyaXRpbmcKKwkJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHJlZmVyZW5jZSB0byBsb2NhbDQKKwkJICogU3RvcmUgKDEsIGRlX3JlZm9mIChMb2NhbDApKSAtIENhdXNlcyBpbmRpcmVjdCBzdG9yZSB0byBsb2NhbDQKKwkJICoKKwkJICogV2VpcmQsIGJ1dCB0cnVlLgorCQkgKi8KKwkJaWYgKHR5cGUgPT0gQUNQSV9SRUZDTEFTU19BUkcpIHsKKwkJCS8qCisJCQkgKiBJZiB3ZSBoYXZlIGEgdmFsaWQgcmVmZXJlbmNlIG9iamVjdCB0aGF0IGNhbWUgZnJvbSByZWZfb2YoKSwKKwkJCSAqIGRvIHRoZSBpbmRpcmVjdCBzdG9yZQorCQkJICovCisJCQlpZiAoKEFDUElfR0VUX0RFU0NSSVBUT1JfVFlQRShjdXJyZW50X29ial9kZXNjKSA9PQorCQkJICAgICBBQ1BJX0RFU0NfVFlQRV9PUEVSQU5EKQorCQkJICAgICYmIChjdXJyZW50X29ial9kZXNjLT5jb21tb24udHlwZSA9PQorCQkJCUFDUElfVFlQRV9MT0NBTF9SRUZFUkVOQ0UpCisJCQkgICAgJiYgKGN1cnJlbnRfb2JqX2Rlc2MtPnJlZmVyZW5jZS5jbGFzcyA9PQorCQkJCUFDUElfUkVGQ0xBU1NfUkVGT0YpKSB7CisJCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FWEVDLAorCQkJCQkJICAiQXJnICglcCkgaXMgYW4gT2JqUmVmKE5vZGUpLCBzdG9yaW5nIGluIG5vZGUgJXBcbiIsCisJCQkJCQkgIG5ld19vYmpfZGVzYywKKwkJCQkJCSAgY3VycmVudF9vYmpfZGVzYykpOworCisJCQkJLyoKKwkJCQkgKiBTdG9yZSB0aGlzIG9iamVjdCB0byB0aGUgTm9kZSAocGVyZm9ybSB0aGUgaW5kaXJlY3Qgc3RvcmUpCisJCQkJICogTk9URTogTm8gaW1wbGljaXQgY29udmVyc2lvbiBpcyBwZXJmb3JtZWQsIGFzIHBlciB0aGUgQUNQSQorCQkJCSAqIHNwZWNpZmljYXRpb24gcnVsZXMgb24gc3RvcmluZyB0byBMb2NhbHMvQXJncy4KKwkJCQkgKi8KKwkJCQlzdGF0dXMgPQorCQkJCSAgICBhY3BpX2V4X3N0b3JlX29iamVjdF90b19ub2RlKG5ld19vYmpfZGVzYywKKwkJCQkJCQkJIGN1cnJlbnRfb2JqX2Rlc2MtPgorCQkJCQkJCQkgcmVmZXJlbmNlLgorCQkJCQkJCQkgb2JqZWN0LAorCQkJCQkJCQkgd2Fsa19zdGF0ZSwKKwkJCQkJCQkJIEFDUElfTk9fSU1QTElDSVRfQ09OVkVSU0lPTik7CisKKwkJCQkvKiBSZW1vdmUgbG9jYWwgcmVmZXJlbmNlIGlmIHdlIGNvcGllZCB0aGUgb2JqZWN0IGFib3ZlICovCisKKwkJCQlpZiAobmV3X29ial9kZXNjICE9IG9ial9kZXNjKSB7CisJCQkJCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZShuZXdfb2JqX2Rlc2MpOworCQkJCX0KKwkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKKwkJCX0KKwkJfQorCisJCS8qIERlbGV0ZSB0aGUgZXhpc3Rpbmcgb2JqZWN0IGJlZm9yZSBzdG9yaW5nIHRoZSBuZXcgb25lICovCisKKwkJYWNwaV9kc19tZXRob2RfZGF0YV9kZWxldGVfdmFsdWUodHlwZSwgaW5kZXgsIHdhbGtfc3RhdGUpOworCX0KKworCS8qCisJICogSW5zdGFsbCB0aGUgT2JqIGRlc2NyaXB0b3IgKCpuZXdfb2JqX2Rlc2MpIGludG8KKwkgKiB0aGUgZGVzY3JpcHRvciBmb3IgdGhlIEFyZyBvciBMb2NhbC4KKwkgKiAoaW5jcmVtZW50cyB0aGUgb2JqZWN0IHJlZmVyZW5jZSBjb3VudCBieSBvbmUpCisJICovCisJc3RhdHVzID0KKwkgICAgYWNwaV9kc19tZXRob2RfZGF0YV9zZXRfdmFsdWUodHlwZSwgaW5kZXgsIG5ld19vYmpfZGVzYywKKwkJCQkJICB3YWxrX3N0YXRlKTsKKworCS8qIFJlbW92ZSBsb2NhbCByZWZlcmVuY2UgaWYgd2UgY29waWVkIHRoZSBvYmplY3QgYWJvdmUgKi8KKworCWlmIChuZXdfb2JqX2Rlc2MgIT0gb2JqX2Rlc2MpIHsKKwkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKG5ld19vYmpfZGVzYyk7CisJfQorCisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Cit9CisKKyNpZmRlZiBBQ1BJX09CU09MRVRFX0ZVTkNUSU9OUworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9kc19tZXRob2RfZGF0YV9nZXRfdHlwZQorICoKKyAqIFBBUkFNRVRFUlM6ICBPcGNvZGUgICAgICAgICAgICAgIC0gRWl0aGVyIEFNTF9MT0NBTF9PUCBvciBBTUxfQVJHX09QCisgKiAgICAgICAgICAgICAgSW5kZXggICAgICAgICAgICAgICAtIFdoaWNoIExvY2FsIG9yIEFyZyB3aG9zZSB0eXBlIHRvIGdldAorICogICAgICAgICAgICAgIHdhbGtfc3RhdGUgICAgICAgICAgLSBDdXJyZW50IHdhbGsgc3RhdGUgb2JqZWN0CisgKgorICogUkVUVVJOOiAgICAgIERhdGEgdHlwZSBvZiBjdXJyZW50IHZhbHVlIG9mIHRoZSBzZWxlY3RlZCBBcmcgb3IgTG9jYWwKKyAqCisgKiBERVNDUklQVElPTjogR2V0IHRoZSB0eXBlIG9mIHRoZSBvYmplY3Qgc3RvcmVkIGluIHRoZSBMb2NhbCBvciBBcmcKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCithY3BpX29iamVjdF90eXBlCithY3BpX2RzX21ldGhvZF9kYXRhX2dldF90eXBlKHUxNiBvcGNvZGUsCisJCQkgICAgIHUzMiBpbmRleCwgc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSkKK3sKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGU7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqZWN0OworCisJQUNQSV9GVU5DVElPTl9UUkFDRShkc19tZXRob2RfZGF0YV9nZXRfdHlwZSk7CisKKwkvKiBHZXQgdGhlIG5hbWVzcGFjZSBub2RlIGZvciB0aGUgYXJnL2xvY2FsICovCisKKwlzdGF0dXMgPSBhY3BpX2RzX21ldGhvZF9kYXRhX2dldF9ub2RlKG9wY29kZSwgaW5kZXgsIHdhbGtfc3RhdGUsICZub2RlKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuX1ZBTFVFKChBQ1BJX1RZUEVfTk9UX0ZPVU5EKSk7CisJfQorCisJLyogR2V0IHRoZSBvYmplY3QgKi8KKworCW9iamVjdCA9IGFjcGlfbnNfZ2V0X2F0dGFjaGVkX29iamVjdChub2RlKTsKKwlpZiAoIW9iamVjdCkgeworCisJCS8qIFVuaW5pdGlhbGl6ZWQgbG9jYWwvYXJnLCByZXR1cm4gVFlQRV9BTlkgKi8KKworCQlyZXR1cm5fVkFMVUUoQUNQSV9UWVBFX0FOWSk7CisJfQorCisJLyogR2V0IHRoZSBvYmplY3QgdHlwZSAqLworCisJcmV0dXJuX1ZBTFVFKEFDUElfR0VUX09CSkVDVF9UWVBFKG9iamVjdCkpOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2Rzb2JqZWN0LmMgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2Rzb2JqZWN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTVjNjI4ZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvZHNvYmplY3QuYwpAQCAtMCwwICsxLDgxMyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIE1vZHVsZSBOYW1lOiBkc29iamVjdCAtIERpc3BhdGNoZXIgb2JqZWN0IG1hbmFnZW1lbnQgcm91dGluZXMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA4LCBJbnRlbCBDb3JwLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAorICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgYXQgbWluaW11bSBhIGRpc2NsYWltZXIKKyAqICAgIHN1YnN0YW50aWFsbHkgc2ltaWxhciB0byB0aGUgIk5PIFdBUlJBTlRZIiBkaXNjbGFpbWVyIGJlbG93CisgKiAgICAoIkRpc2NsYWltZXIiKSBhbmQgYW55IHJlZGlzdHJpYnV0aW9uIG11c3QgYmUgY29uZGl0aW9uZWQgdXBvbgorICogICAgaW5jbHVkaW5nIGEgc3Vic3RhbnRpYWxseSBzaW1pbGFyIERpc2NsYWltZXIgcmVxdWlyZW1lbnQgZm9yIGZ1cnRoZXIKKyAqICAgIGJpbmFyeSByZWRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcworICogICAgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBOTyBXQVJSQU5UWQorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcKKyAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgorICovCisKKyNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KKyNpbmNsdWRlICJhY2NvbW1vbi5oIgorI2luY2x1ZGUgImFjcGFyc2VyLmgiCisjaW5jbHVkZSAiYW1sY29kZS5oIgorI2luY2x1ZGUgImFjZGlzcGF0LmgiCisjaW5jbHVkZSAiYWNuYW1lc3AuaCIKKyNpbmNsdWRlICJhY2ludGVycC5oIgorCisjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9ESVNQQVRDSEVSCitBQ1BJX01PRFVMRV9OQU1FKCJkc29iamVjdCIpCisKKy8qIExvY2FsIHByb3RvdHlwZXMgKi8KK3N0YXRpYyBhY3BpX3N0YXR1cworYWNwaV9kc19idWlsZF9pbnRlcm5hbF9vYmplY3Qoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSwKKwkJCSAgICAgIHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpvcCwKKwkJCSAgICAgIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKipvYmpfZGVzY19wdHIpOworCisjaWZuZGVmIEFDUElfTk9fTUVUSE9EX0VYRUNVVElPTgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9kc19idWlsZF9pbnRlcm5hbF9vYmplY3QKKyAqCisgKiBQQVJBTUVURVJTOiAgd2Fsa19zdGF0ZSAgICAgIC0gQ3VycmVudCB3YWxrIHN0YXRlCisgKiAgICAgICAgICAgICAgT3AgICAgICAgICAgICAgIC0gUGFyc2VyIG9iamVjdCB0byBiZSB0cmFuc2xhdGVkCisgKiAgICAgICAgICAgICAgb2JqX2Rlc2NfcHRyICAgIC0gV2hlcmUgdGhlIEFDUEkgaW50ZXJuYWwgb2JqZWN0IGlzIHJldHVybmVkCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBUcmFuc2xhdGUgYSBwYXJzZXIgT3Agb2JqZWN0IHRvIHRoZSBlcXVpdmFsZW50IG5hbWVzcGFjZSBvYmplY3QKKyAqICAgICAgICAgICAgICBTaW1wbGUgb2JqZWN0cyBhcmUgYW55IG9iamVjdHMgb3RoZXIgdGhhbiBhIHBhY2thZ2Ugb2JqZWN0IQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBhY3BpX3N0YXR1cworYWNwaV9kc19idWlsZF9pbnRlcm5hbF9vYmplY3Qoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSwKKwkJCSAgICAgIHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpvcCwKKwkJCSAgICAgIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKipvYmpfZGVzY19wdHIpCit7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2M7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCisJQUNQSV9GVU5DVElPTl9UUkFDRShkc19idWlsZF9pbnRlcm5hbF9vYmplY3QpOworCisJKm9ial9kZXNjX3B0ciA9IE5VTEw7CisJaWYgKG9wLT5jb21tb24uYW1sX29wY29kZSA9PSBBTUxfSU5UX05BTUVQQVRIX09QKSB7CisJCS8qCisJCSAqIFRoaXMgaXMgYSBuYW1lZCBvYmplY3QgcmVmZXJlbmNlLiBJZiB0aGlzIG5hbWUgd2FzCisJCSAqIHByZXZpb3VzbHkgbG9va2VkIHVwIGluIHRoZSBuYW1lc3BhY2UsIGl0IHdhcyBzdG9yZWQgaW4gdGhpcyBvcC4KKwkJICogT3RoZXJ3aXNlLCBnbyBhaGVhZCBhbmQgbG9vayBpdCB1cCBub3cKKwkJICovCisJCWlmICghb3AtPmNvbW1vbi5ub2RlKSB7CisJCQlzdGF0dXMgPSBhY3BpX25zX2xvb2t1cCh3YWxrX3N0YXRlLT5zY29wZV9pbmZvLAorCQkJCQkJb3AtPmNvbW1vbi52YWx1ZS5zdHJpbmcsCisJCQkJCQlBQ1BJX1RZUEVfQU5ZLAorCQkJCQkJQUNQSV9JTU9ERV9FWEVDVVRFLAorCQkJCQkJQUNQSV9OU19TRUFSQ0hfUEFSRU5UIHwKKwkJCQkJCUFDUElfTlNfRE9OVF9PUEVOX1NDT1BFLCBOVUxMLAorCQkJCQkJQUNQSV9DQVNUX0lORElSRUNUX1BUUihzdHJ1Y3QKKwkJCQkJCQkJICAgICAgIGFjcGlfbmFtZXNwYWNlX25vZGUsCisJCQkJCQkJCSAgICAgICAmKG9wLT4KKwkJCQkJCQkJCSBjb21tb24uCisJCQkJCQkJCQkgbm9kZSkpKTsKKwkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCisJCQkJLyogQ2hlY2sgaWYgd2UgYXJlIHJlc29sdmluZyBhIG5hbWVkIHJlZmVyZW5jZSB3aXRoaW4gYSBwYWNrYWdlICovCisKKwkJCQlpZiAoKHN0YXR1cyA9PSBBRV9OT1RfRk9VTkQpCisJCQkJICAgICYmIChhY3BpX2dibF9lbmFibGVfaW50ZXJwcmV0ZXJfc2xhY2spCisJCQkJICAgICYmCisJCQkJICAgICgob3AtPmNvbW1vbi5wYXJlbnQtPmNvbW1vbi5hbWxfb3Bjb2RlID09CisJCQkJICAgICAgQU1MX1BBQ0tBR0VfT1ApCisJCQkJICAgICB8fCAob3AtPmNvbW1vbi5wYXJlbnQtPmNvbW1vbi5hbWxfb3Bjb2RlID09CisJCQkJCSBBTUxfVkFSX1BBQ0tBR0VfT1ApKSkgeworCQkJCQkvKgorCQkJCQkgKiBXZSBkaWRuJ3QgZmluZCB0aGUgdGFyZ2V0IGFuZCB3ZSBhcmUgcG9wdWxhdGluZyBlbGVtZW50cworCQkJCQkgKiBvZiBhIHBhY2thZ2UgLSBpZ25vcmUgaWYgc2xhY2sgZW5hYmxlZC4gU29tZSBBU0wgY29kZQorCQkJCQkgKiBjb250YWlucyBkYW5nbGluZyBpbnZhbGlkIHJlZmVyZW5jZXMgaW4gcGFja2FnZXMgYW5kCisJCQkJCSAqIGV4cGVjdHMgdGhhdCBubyBleGNlcHRpb24gd2lsbCBiZSBpc3N1ZWQuIExlYXZlIHRoZQorCQkJCQkgKiBlbGVtZW50IGFzIGEgbnVsbCBlbGVtZW50LiBJdCBjYW5ub3QgYmUgdXNlZCwgYnV0IGl0CisJCQkJCSAqIGNhbiBiZSBvdmVyd3JpdHRlbiBieSBzdWJzZXF1ZW50IEFTTCBjb2RlIC0gdGhpcyBpcworCQkJCQkgKiB0eXBpY2FsbHkgdGhlIGNhc2UuCisJCQkJCSAqLworCQkJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sCisJCQkJCQkJICAiSWdub3JpbmcgdW5yZXNvbHZlZCByZWZlcmVuY2UgaW4gcGFja2FnZSBbJTQuNHNdXG4iLAorCQkJCQkJCSAgd2Fsa19zdGF0ZS0+CisJCQkJCQkJICBzY29wZV9pbmZvLT5zY29wZS4KKwkJCQkJCQkgIG5vZGUtPm5hbWUuYXNjaWkpKTsKKworCQkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOworCQkJCX0gZWxzZSB7CisJCQkJCUFDUElfRVJST1JfTkFNRVNQQUNFKG9wLT5jb21tb24udmFsdWUuCisJCQkJCQkJICAgICBzdHJpbmcsIHN0YXR1cyk7CisJCQkJfQorCisJCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CisJCQl9CisJCX0KKworCQkvKiBTcGVjaWFsIG9iamVjdCByZXNvbHV0aW9uIGZvciBlbGVtZW50cyBvZiBhIHBhY2thZ2UgKi8KKworCQlpZiAoKG9wLT5jb21tb24ucGFyZW50LT5jb21tb24uYW1sX29wY29kZSA9PSBBTUxfUEFDS0FHRV9PUCkgfHwKKwkJICAgIChvcC0+Y29tbW9uLnBhcmVudC0+Y29tbW9uLmFtbF9vcGNvZGUgPT0KKwkJICAgICBBTUxfVkFSX1BBQ0tBR0VfT1ApKSB7CisJCQkvKgorCQkJICogQXR0ZW1wdCB0byByZXNvbHZlIHRoZSBub2RlIHRvIGEgdmFsdWUgYmVmb3JlIHdlIGluc2VydCBpdCBpbnRvCisJCQkgKiB0aGUgcGFja2FnZS4gSWYgdGhpcyBpcyBhIHJlZmVyZW5jZSB0byBhIGNvbW1vbiBkYXRhIHR5cGUsCisJCQkgKiByZXNvbHZlIGl0IGltbWVkaWF0ZWx5LiBBY2NvcmRpbmcgdG8gdGhlIEFDUEkgc3BlYywgcGFja2FnZQorCQkJICogZWxlbWVudHMgY2FuIG9ubHkgYmUgImRhdGEgb2JqZWN0cyIgb3IgbWV0aG9kIHJlZmVyZW5jZXMuCisJCQkgKiBBdHRlbXB0IHRvIHJlc29sdmUgdG8gYW4gSW50ZWdlciwgQnVmZmVyLCBTdHJpbmcgb3IgUGFja2FnZS4KKwkJCSAqIElmIGNhbm5vdCwgcmV0dXJuIHRoZSBuYW1lZCByZWZlcmVuY2UgKGZvciB0aGluZ3MgbGlrZSBEZXZpY2VzLAorCQkJICogTWV0aG9kcywgZXRjLikgQnVmZmVyIEZpZWxkcyBhbmQgRmllbGRzIHdpbGwgcmVzb2x2ZSB0byBzaW1wbGUKKwkJCSAqIG9iamVjdHMgKGludC9idWYvc3RyL3BrZykuCisJCQkgKgorCQkJICogTk9URTogUmVmZXJlbmNlcyB0byB0aGluZ3MgbGlrZSBEZXZpY2VzLCBNZXRob2RzLCBNdXRleGVzLCBldGMuCisJCQkgKiB3aWxsIHJlbWFpbiBhcyBuYW1lZCByZWZlcmVuY2VzLiBUaGlzIGJlaGF2aW9yIGlzIG5vdCBkZXNjcmliZWQKKwkJCSAqIGluIHRoZSBBQ1BJIHNwZWMsIGJ1dCBpdCBhcHBlYXJzIHRvIGJlIGFuIG92ZXJzaWdodC4KKwkJCSAqLworCQkJb2JqX2Rlc2MgPQorCQkJICAgIEFDUElfQ0FTVF9QVFIodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCwKKwkJCQkJICBvcC0+Y29tbW9uLm5vZGUpOworCisJCQlzdGF0dXMgPQorCQkJICAgIGFjcGlfZXhfcmVzb2x2ZV9ub2RlX3RvX3ZhbHVlKEFDUElfQ0FTVF9JTkRJUkVDVF9QVFIKKwkJCQkJCQkgIChzdHJ1Y3QKKwkJCQkJCQkgICBhY3BpX25hbWVzcGFjZV9ub2RlLAorCQkJCQkJCSAgICZvYmpfZGVzYyksCisJCQkJCQkJICB3YWxrX3N0YXRlKTsKKwkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworCQkJfQorCisJCQlzd2l0Y2ggKG9wLT5jb21tb24ubm9kZS0+dHlwZSkgeworCQkJCS8qCisJCQkJICogRm9yIHRoZXNlIHR5cGVzLCB3ZSBuZWVkIHRoZSBhY3R1YWwgbm9kZSwgbm90IHRoZSBzdWJvYmplY3QuCisJCQkJICogSG93ZXZlciwgdGhlIHN1Ym9iamVjdCBkaWQgbm90IGdldCBhbiBleHRyYSByZWZlcmVuY2UgY291bnQgYWJvdmUuCisJCQkJICoKKwkJCQkgKiBUQkQ6IHNob3VsZCBleF9yZXNvbHZlX25vZGVfdG9fdmFsdWUgYmUgY2hhbmdlZCB0byBmaXggdGhpcz8KKwkJCQkgKi8KKwkJCWNhc2UgQUNQSV9UWVBFX0RFVklDRToKKwkJCWNhc2UgQUNQSV9UWVBFX1RIRVJNQUw6CisKKwkJCQlhY3BpX3V0X2FkZF9yZWZlcmVuY2Uob3AtPmNvbW1vbi5ub2RlLT5vYmplY3QpOworCisJCQkJLypsaW50IC1mYWxsdGhyb3VnaCAqLworCQkJCS8qCisJCQkJICogRm9yIHRoZXNlIHR5cGVzLCB3ZSBuZWVkIHRoZSBhY3R1YWwgbm9kZSwgbm90IHRoZSBzdWJvYmplY3QuCisJCQkJICogVGhlIHN1Ym9iamVjdCBnb3QgYW4gZXh0cmEgcmVmZXJlbmNlIGNvdW50IGluIGV4X3Jlc29sdmVfbm9kZV90b192YWx1ZS4KKwkJCQkgKi8KKwkJCWNhc2UgQUNQSV9UWVBFX01VVEVYOgorCQkJY2FzZSBBQ1BJX1RZUEVfTUVUSE9EOgorCQkJY2FzZSBBQ1BJX1RZUEVfUE9XRVI6CisJCQljYXNlIEFDUElfVFlQRV9QUk9DRVNTT1I6CisJCQljYXNlIEFDUElfVFlQRV9FVkVOVDoKKwkJCWNhc2UgQUNQSV9UWVBFX1JFR0lPTjoKKworCQkJCS8qIFdlIHdpbGwgY3JlYXRlIGEgcmVmZXJlbmNlIG9iamVjdCBmb3IgdGhlc2UgdHlwZXMgYmVsb3cgKi8KKwkJCQlicmVhazsKKworCQkJZGVmYXVsdDoKKwkJCQkvKgorCQkJCSAqIEFsbCBvdGhlciB0eXBlcyAtIHRoZSBub2RlIHdhcyByZXNvbHZlZCB0byBhbiBhY3R1YWwKKwkJCQkgKiBvYmplY3QsIHdlIGFyZSBkb25lLgorCQkJCSAqLworCQkJCWdvdG8gZXhpdDsKKwkJCX0KKwkJfQorCX0KKworCS8qIENyZWF0ZSBhbmQgaW5pdCBhIG5ldyBpbnRlcm5hbCBBQ1BJIG9iamVjdCAqLworCisJb2JqX2Rlc2MgPSBhY3BpX3V0X2NyZWF0ZV9pbnRlcm5hbF9vYmplY3QoKGFjcGlfcHNfZ2V0X29wY29kZV9pbmZvCisJCQkJCQkgICAob3AtPmNvbW1vbi5hbWxfb3Bjb2RlKSktPgorCQkJCQkJICBvYmplY3RfdHlwZSk7CisJaWYgKCFvYmpfZGVzYykgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9fTUVNT1JZKTsKKwl9CisKKwlzdGF0dXMgPQorCSAgICBhY3BpX2RzX2luaXRfb2JqZWN0X2Zyb21fb3Aod2Fsa19zdGF0ZSwgb3AsIG9wLT5jb21tb24uYW1sX29wY29kZSwKKwkJCQkJJm9ial9kZXNjKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKG9ial9kZXNjKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CisJfQorCisgICAgICBleGl0OgorCSpvYmpfZGVzY19wdHIgPSBvYmpfZGVzYzsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9kc19idWlsZF9pbnRlcm5hbF9idWZmZXJfb2JqCisgKgorICogUEFSQU1FVEVSUzogIHdhbGtfc3RhdGUgICAgICAtIEN1cnJlbnQgd2FsayBzdGF0ZQorICogICAgICAgICAgICAgIE9wICAgICAgICAgICAgICAtIFBhcnNlciBvYmplY3QgdG8gYmUgdHJhbnNsYXRlZAorICogICAgICAgICAgICAgIGJ1ZmZlcl9sZW5ndGggICAtIExlbmd0aCBvZiB0aGUgYnVmZmVyCisgKiAgICAgICAgICAgICAgb2JqX2Rlc2NfcHRyICAgIC0gV2hlcmUgdGhlIEFDUEkgaW50ZXJuYWwgb2JqZWN0IGlzIHJldHVybmVkCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBUcmFuc2xhdGUgYSBwYXJzZXIgT3AgcGFja2FnZSBvYmplY3QgdG8gdGhlIGVxdWl2YWxlbnQKKyAqICAgICAgICAgICAgICBuYW1lc3BhY2Ugb2JqZWN0CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworYWNwaV9zdGF0dXMKK2FjcGlfZHNfYnVpbGRfaW50ZXJuYWxfYnVmZmVyX29iaihzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlLAorCQkJCSAgdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKm9wLAorCQkJCSAgdTMyIGJ1ZmZlcl9sZW5ndGgsCisJCQkJICB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICoqb2JqX2Rlc2NfcHRyKQoreworCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICphcmc7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2M7CisJdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKmJ5dGVfbGlzdDsKKwl1MzIgYnl0ZV9saXN0X2xlbmd0aCA9IDA7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGRzX2J1aWxkX2ludGVybmFsX2J1ZmZlcl9vYmopOworCisJLyoKKwkgKiBJZiB3ZSBhcmUgZXZhbHVhdGluZyBhIE5hbWVkIGJ1ZmZlciBvYmplY3QgIk5hbWUgKHh4eHgsIEJ1ZmZlcikiLgorCSAqIFRoZSBidWZmZXIgb2JqZWN0IGFscmVhZHkgZXhpc3RzIChmcm9tIHRoZSBOUyBub2RlKSwgb3RoZXJ3aXNlIGl0IG11c3QKKwkgKiBiZSBjcmVhdGVkLgorCSAqLworCW9ial9kZXNjID0gKm9ial9kZXNjX3B0cjsKKwlpZiAoIW9ial9kZXNjKSB7CisKKwkJLyogQ3JlYXRlIGEgbmV3IGJ1ZmZlciBvYmplY3QgKi8KKworCQlvYmpfZGVzYyA9IGFjcGlfdXRfY3JlYXRlX2ludGVybmFsX29iamVjdChBQ1BJX1RZUEVfQlVGRkVSKTsKKwkJKm9ial9kZXNjX3B0ciA9IG9ial9kZXNjOworCQlpZiAoIW9ial9kZXNjKSB7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9fTUVNT1JZKTsKKwkJfQorCX0KKworCS8qCisJICogU2Vjb25kIGFyZyBpcyB0aGUgYnVmZmVyIGRhdGEgKG9wdGlvbmFsKSBieXRlX2xpc3QgY2FuIGJlIGVpdGhlcgorCSAqIGluZGl2aWR1YWwgYnl0ZXMgb3IgYSBzdHJpbmcgaW5pdGlhbGl6ZXIuICBJbiBlaXRoZXIgY2FzZSwgYQorCSAqIGJ5dGVfbGlzdCBhcHBlYXJzIGluIHRoZSBBTUwuCisJICovCisJYXJnID0gb3AtPmNvbW1vbi52YWx1ZS5hcmc7CS8qIHNraXAgZmlyc3QgYXJnICovCisKKwlieXRlX2xpc3QgPSBhcmctPm5hbWVkLm5leHQ7CisJaWYgKGJ5dGVfbGlzdCkgeworCQlpZiAoYnl0ZV9saXN0LT5jb21tb24uYW1sX29wY29kZSAhPSBBTUxfSU5UX0JZVEVMSVNUX09QKSB7CisJCQlBQ1BJX0VSUk9SKChBRV9JTkZPLAorCQkJCSAgICAiRXhwZWN0aW5nIGJ5dGVsaXN0LCBnb3QgQU1MIG9wY29kZSAlWCBpbiBvcCAlcCIsCisJCQkJICAgIGJ5dGVfbGlzdC0+Y29tbW9uLmFtbF9vcGNvZGUsIGJ5dGVfbGlzdCkpOworCisJCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2Uob2JqX2Rlc2MpOworCQkJcmV0dXJuIChBRV9UWVBFKTsKKwkJfQorCisJCWJ5dGVfbGlzdF9sZW5ndGggPSAodTMyKSBieXRlX2xpc3QtPmNvbW1vbi52YWx1ZS5pbnRlZ2VyOworCX0KKworCS8qCisJICogVGhlIGJ1ZmZlciBsZW5ndGggKG51bWJlciBvZiBieXRlcykgd2lsbCBiZSB0aGUgbGFyZ2VyIG9mOgorCSAqIDEpIFRoZSBzcGVjaWZpZWQgYnVmZmVyIGxlbmd0aCBhbmQKKwkgKiAyKSBUaGUgbGVuZ3RoIG9mIHRoZSBpbml0aWFsaXplciBieXRlIGxpc3QKKwkgKi8KKwlvYmpfZGVzYy0+YnVmZmVyLmxlbmd0aCA9IGJ1ZmZlcl9sZW5ndGg7CisJaWYgKGJ5dGVfbGlzdF9sZW5ndGggPiBidWZmZXJfbGVuZ3RoKSB7CisJCW9ial9kZXNjLT5idWZmZXIubGVuZ3RoID0gYnl0ZV9saXN0X2xlbmd0aDsKKwl9CisKKwkvKiBBbGxvY2F0ZSB0aGUgYnVmZmVyICovCisKKwlpZiAob2JqX2Rlc2MtPmJ1ZmZlci5sZW5ndGggPT0gMCkgeworCQlvYmpfZGVzYy0+YnVmZmVyLnBvaW50ZXIgPSBOVUxMOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VYRUMsCisJCQkJICAiQnVmZmVyIGRlZmluZWQgd2l0aCB6ZXJvIGxlbmd0aCBpbiBBTUwsIGNyZWF0aW5nXG4iKSk7CisJfSBlbHNlIHsKKwkJb2JqX2Rlc2MtPmJ1ZmZlci5wb2ludGVyID0KKwkJICAgIEFDUElfQUxMT0NBVEVfWkVST0VEKG9ial9kZXNjLT5idWZmZXIubGVuZ3RoKTsKKwkJaWYgKCFvYmpfZGVzYy0+YnVmZmVyLnBvaW50ZXIpIHsKKwkJCWFjcGlfdXRfZGVsZXRlX29iamVjdF9kZXNjKG9ial9kZXNjKTsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT19NRU1PUlkpOworCQl9CisKKwkJLyogSW5pdGlhbGl6ZSBidWZmZXIgZnJvbSB0aGUgYnl0ZV9saXN0IChpZiBwcmVzZW50KSAqLworCisJCWlmIChieXRlX2xpc3QpIHsKKwkJCUFDUElfTUVNQ1BZKG9ial9kZXNjLT5idWZmZXIucG9pbnRlciwKKwkJCQkgICAgYnl0ZV9saXN0LT5uYW1lZC5kYXRhLCBieXRlX2xpc3RfbGVuZ3RoKTsKKwkJfQorCX0KKworCW9ial9kZXNjLT5idWZmZXIuZmxhZ3MgfD0gQU9QT0JKX0RBVEFfVkFMSUQ7CisJb3AtPmNvbW1vbi5ub2RlID0gQUNQSV9DQVNUX1BUUihzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSwgb2JqX2Rlc2MpOworCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfZHNfYnVpbGRfaW50ZXJuYWxfcGFja2FnZV9vYmoKKyAqCisgKiBQQVJBTUVURVJTOiAgd2Fsa19zdGF0ZSAgICAgIC0gQ3VycmVudCB3YWxrIHN0YXRlCisgKiAgICAgICAgICAgICAgT3AgICAgICAgICAgICAgIC0gUGFyc2VyIG9iamVjdCB0byBiZSB0cmFuc2xhdGVkCisgKiAgICAgICAgICAgICAgZWxlbWVudF9jb3VudCAgIC0gTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBwYWNrYWdlIC0gdGhpcyBpcworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBudW1fZWxlbWVudHMgYXJndW1lbnQgdG8gUGFja2FnZSgpCisgKiAgICAgICAgICAgICAgb2JqX2Rlc2NfcHRyICAgIC0gV2hlcmUgdGhlIEFDUEkgaW50ZXJuYWwgb2JqZWN0IGlzIHJldHVybmVkCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBUcmFuc2xhdGUgYSBwYXJzZXIgT3AgcGFja2FnZSBvYmplY3QgdG8gdGhlIGVxdWl2YWxlbnQKKyAqICAgICAgICAgICAgICBuYW1lc3BhY2Ugb2JqZWN0CisgKgorICogTk9URTogVGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgcGFja2FnZSB3aWxsIGJlIGFsd2F5cyBiZSB0aGUgbnVtX2VsZW1lbnRzCisgKiBjb3VudCwgcmVnYXJkbGVzcyBvZiB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBwYWNrYWdlIGxpc3QuIElmCisgKiBudW1fZWxlbWVudHMgaXMgc21hbGxlciwgb25seSB0aGF0IG1hbnkgcGFja2FnZSBsaXN0IGVsZW1lbnRzIGFyZSB1c2VkLgorICogaWYgbnVtX2VsZW1lbnRzIGlzIGxhcmdlciwgdGhlIFBhY2thZ2Ugb2JqZWN0IGlzIHBhZGRlZCBvdXQgd2l0aAorICogb2JqZWN0cyBvZiB0eXBlIFVuaW5pdGlhbGl6ZWQgKGFzIHBlciBBQ1BJIHNwZWMuKQorICoKKyAqIEV2ZW4gdGhvdWdoIHRoZSBBU0wgY29tcGlsZXJzIGRvIG5vdCBhbGxvdyBudW1fZWxlbWVudHMgdG8gYmUgc21hbGxlcgorICogdGhhbiB0aGUgUGFja2FnZSBsaXN0IGxlbmd0aCAoZm9yIHRoZSBmaXhlZCBsZW5ndGggcGFja2FnZSBvcGNvZGUpLCBzb21lCisgKiBCSU9TIGNvZGUgbW9kaWZpZXMgdGhlIEFNTCBvbiB0aGUgZmx5IHRvIGFkanVzdCB0aGUgbnVtX2VsZW1lbnRzLCBhbmQKKyAqIHRoaXMgY29kZSBjb21wZW5zYXRlcyBmb3IgdGhhdC4gVGhpcyBhbHNvIHByb3ZpZGVzIGNvbXBhdGliaWxpdHkgd2l0aAorICogb3RoZXIgQU1MIGludGVycHJldGVycy4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCithY3BpX3N0YXR1cworYWNwaV9kc19idWlsZF9pbnRlcm5hbF9wYWNrYWdlX29iaihzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlLAorCQkJCSAgIHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpvcCwKKwkJCQkgICB1MzIgZWxlbWVudF9jb3VudCwKKwkJCQkgICB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICoqb2JqX2Rlc2NfcHRyKQoreworCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICphcmc7CisJdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKnBhcmVudDsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYyA9IE5VTEw7CisJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CisJdW5zaWduZWQgaTsKKwl1MTYgaW5kZXg7CisJdTE2IHJlZmVyZW5jZV9jb3VudDsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0UoZHNfYnVpbGRfaW50ZXJuYWxfcGFja2FnZV9vYmopOworCisJLyogRmluZCB0aGUgcGFyZW50IG9mIGEgcG9zc2libHkgbmVzdGVkIHBhY2thZ2UgKi8KKworCXBhcmVudCA9IG9wLT5jb21tb24ucGFyZW50OworCXdoaWxlICgocGFyZW50LT5jb21tb24uYW1sX29wY29kZSA9PSBBTUxfUEFDS0FHRV9PUCkgfHwKKwkgICAgICAgKHBhcmVudC0+Y29tbW9uLmFtbF9vcGNvZGUgPT0gQU1MX1ZBUl9QQUNLQUdFX09QKSkgeworCQlwYXJlbnQgPSBwYXJlbnQtPmNvbW1vbi5wYXJlbnQ7CisJfQorCisJLyoKKwkgKiBJZiB3ZSBhcmUgZXZhbHVhdGluZyBhIE5hbWVkIHBhY2thZ2Ugb2JqZWN0ICJOYW1lICh4eHh4LCBQYWNrYWdlKSIsCisJICogdGhlIHBhY2thZ2Ugb2JqZWN0IGFscmVhZHkgZXhpc3RzLCBvdGhlcndpc2UgaXQgbXVzdCBiZSBjcmVhdGVkLgorCSAqLworCW9ial9kZXNjID0gKm9ial9kZXNjX3B0cjsKKwlpZiAoIW9ial9kZXNjKSB7CisJCW9ial9kZXNjID0gYWNwaV91dF9jcmVhdGVfaW50ZXJuYWxfb2JqZWN0KEFDUElfVFlQRV9QQUNLQUdFKTsKKwkJKm9ial9kZXNjX3B0ciA9IG9ial9kZXNjOworCQlpZiAoIW9ial9kZXNjKSB7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9fTUVNT1JZKTsKKwkJfQorCisJCW9ial9kZXNjLT5wYWNrYWdlLm5vZGUgPSBwYXJlbnQtPmNvbW1vbi5ub2RlOworCX0KKworCS8qCisJICogQWxsb2NhdGUgdGhlIGVsZW1lbnQgYXJyYXkgKGFycmF5IG9mIHBvaW50ZXJzIHRvIHRoZSBpbmRpdmlkdWFsCisJICogb2JqZWN0cykgYmFzZWQgb24gdGhlIG51bV9lbGVtZW50cyBwYXJhbWV0ZXIuIEFkZCBhbiBleHRyYSBwb2ludGVyIHNsb3QKKwkgKiBzbyB0aGF0IHRoZSBsaXN0IGlzIGFsd2F5cyBudWxsIHRlcm1pbmF0ZWQuCisJICovCisJb2JqX2Rlc2MtPnBhY2thZ2UuZWxlbWVudHMgPSBBQ1BJX0FMTE9DQVRFX1pFUk9FRCgoKGFjcGlfc2l6ZSkKKwkJCQkJCQkgICBlbGVtZW50X2NvdW50ICsKKwkJCQkJCQkgICAxKSAqIHNpemVvZih2b2lkICopKTsKKworCWlmICghb2JqX2Rlc2MtPnBhY2thZ2UuZWxlbWVudHMpIHsKKwkJYWNwaV91dF9kZWxldGVfb2JqZWN0X2Rlc2Mob2JqX2Rlc2MpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9fTUVNT1JZKTsKKwl9CisKKwlvYmpfZGVzYy0+cGFja2FnZS5jb3VudCA9IGVsZW1lbnRfY291bnQ7CisKKwkvKgorCSAqIEluaXRpYWxpemUgdGhlIGVsZW1lbnRzIG9mIHRoZSBwYWNrYWdlLCB1cCB0byB0aGUgbnVtX2VsZW1lbnRzIGNvdW50LgorCSAqIFBhY2thZ2UgaXMgYXV0b21hdGljYWxseSBwYWRkZWQgd2l0aCB1bmluaXRpYWxpemVkIChOVUxMKSBlbGVtZW50cworCSAqIGlmIG51bV9lbGVtZW50cyBpcyBncmVhdGVyIHRoYW4gdGhlIHBhY2thZ2UgbGlzdCBsZW5ndGguIExpa2V3aXNlLAorCSAqIFBhY2thZ2UgaXMgdHJ1bmNhdGVkIGlmIG51bV9lbGVtZW50cyBpcyBsZXNzIHRoYW4gdGhlIGxpc3QgbGVuZ3RoLgorCSAqLworCWFyZyA9IG9wLT5jb21tb24udmFsdWUuYXJnOworCWFyZyA9IGFyZy0+Y29tbW9uLm5leHQ7CisJZm9yIChpID0gMDsgYXJnICYmIChpIDwgZWxlbWVudF9jb3VudCk7IGkrKykgeworCQlpZiAoYXJnLT5jb21tb24uYW1sX29wY29kZSA9PSBBTUxfSU5UX1JFVFVSTl9WQUxVRV9PUCkgeworCQkJaWYgKGFyZy0+Y29tbW9uLm5vZGUtPnR5cGUgPT0gQUNQSV9UWVBFX01FVEhPRCkgeworCQkJCS8qCisJCQkJICogQSBtZXRob2QgcmVmZXJlbmNlICJsb29rcyIgdG8gdGhlIHBhcnNlciB0byBiZSBhIG1ldGhvZAorCQkJCSAqIGludm9jYXRpb24sIHNvIHdlIHNwZWNpYWwgY2FzZSBpdCBoZXJlCisJCQkJICovCisJCQkJYXJnLT5jb21tb24uYW1sX29wY29kZSA9IEFNTF9JTlRfTkFNRVBBVEhfT1A7CisJCQkJc3RhdHVzID0KKwkJCQkgICAgYWNwaV9kc19idWlsZF9pbnRlcm5hbF9vYmplY3Qod2Fsa19zdGF0ZSwKKwkJCQkJCQkJICBhcmcsCisJCQkJCQkJCSAgJm9ial9kZXNjLT4KKwkJCQkJCQkJICBwYWNrYWdlLgorCQkJCQkJCQkgIGVsZW1lbnRzW2ldKTsKKwkJCX0gZWxzZSB7CisJCQkJLyogVGhpcyBwYWNrYWdlIGVsZW1lbnQgaXMgYWxyZWFkeSBidWlsdCwganVzdCBnZXQgaXQgKi8KKworCQkJCW9ial9kZXNjLT5wYWNrYWdlLmVsZW1lbnRzW2ldID0KKwkJCQkgICAgQUNQSV9DQVNUX1BUUih1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0LAorCQkJCQkJICBhcmctPmNvbW1vbi5ub2RlKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXN0YXR1cyA9IGFjcGlfZHNfYnVpbGRfaW50ZXJuYWxfb2JqZWN0KHdhbGtfc3RhdGUsIGFyZywKKwkJCQkJCQkgICAgICAgJm9ial9kZXNjLT4KKwkJCQkJCQkgICAgICAgcGFja2FnZS4KKwkJCQkJCQkgICAgICAgZWxlbWVudHNbaV0pOworCQl9CisKKwkJaWYgKCpvYmpfZGVzY19wdHIpIHsKKworCQkJLyogRXhpc3RpbmcgcGFja2FnZSwgZ2V0IGV4aXN0aW5nIHJlZmVyZW5jZSBjb3VudCAqLworCisJCQlyZWZlcmVuY2VfY291bnQgPQorCQkJICAgICgqb2JqX2Rlc2NfcHRyKS0+Y29tbW9uLnJlZmVyZW5jZV9jb3VudDsKKwkJCWlmIChyZWZlcmVuY2VfY291bnQgPiAxKSB7CisKKwkJCQkvKiBNYWtlIG5ldyBlbGVtZW50IHJlZiBjb3VudCBtYXRjaCBvcmlnaW5hbCByZWYgY291bnQgKi8KKworCQkJCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IChyZWZlcmVuY2VfY291bnQgLSAxKTsKKwkJCQkgICAgIGluZGV4KyspIHsKKwkJCQkJYWNwaV91dF9hZGRfcmVmZXJlbmNlKChvYmpfZGVzYy0+CisJCQkJCQkJICAgICAgIHBhY2thZ2UuCisJCQkJCQkJICAgICAgIGVsZW1lbnRzW2ldKSk7CisJCQkJfQorCQkJfQorCQl9CisKKwkJYXJnID0gYXJnLT5jb21tb24ubmV4dDsKKwl9CisKKwkvKiBDaGVjayBmb3IgbWF0Y2ggYmV0d2VlbiBudW1fZWxlbWVudHMgYW5kIGFjdHVhbCBsZW5ndGggb2YgcGFja2FnZV9saXN0ICovCisKKwlpZiAoYXJnKSB7CisJCS8qCisJCSAqIG51bV9lbGVtZW50cyB3YXMgZXhoYXVzdGVkLCBidXQgdGhlcmUgYXJlIHJlbWFpbmluZyBlbGVtZW50cyBpbiB0aGUKKwkJICogcGFja2FnZV9saXN0LgorCQkgKgorCQkgKiBOb3RlOiB0ZWNobmljYWxseSwgdGhpcyBpcyBhbiBlcnJvciwgZnJvbSBBQ1BJIHNwZWM6ICJJdCBpcyBhbiBlcnJvcgorCQkgKiBmb3IgTnVtRWxlbWVudHMgdG8gYmUgbGVzcyB0aGFuIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlCisJCSAqIFBhY2thZ2VMaXN0Ii4gSG93ZXZlciwgZm9yIG5vdywgd2UganVzdCBwcmludCBhbiBlcnJvciBtZXNzYWdlIGFuZAorCQkgKiBubyBleGNlcHRpb24gaXMgcmV0dXJuZWQuCisJCSAqLworCQl3aGlsZSAoYXJnKSB7CisKKwkJCS8qIEZpbmQgb3V0IGhvdyBtYW55IGVsZW1lbnRzIHRoZXJlIHJlYWxseSBhcmUgKi8KKworCQkJaSsrOworCQkJYXJnID0gYXJnLT5jb21tb24ubmV4dDsKKwkJfQorCisJCUFDUElfV0FSTklORygoQUVfSU5GTywKKwkJCSAgICAiUGFja2FnZSBMaXN0IGxlbmd0aCAoJVgpIGxhcmdlciB0aGFuIE51bUVsZW1lbnRzIGNvdW50ICglWCksIHRydW5jYXRlZFxuIiwKKwkJCSAgICBpLCBlbGVtZW50X2NvdW50KSk7CisJfSBlbHNlIGlmIChpIDwgZWxlbWVudF9jb3VudCkgeworCQkvKgorCQkgKiBBcmcgbGlzdCAoZWxlbWVudHMpIHdhcyBleGhhdXN0ZWQsIGJ1dCB3ZSBkaWQgbm90IHJlYWNoIG51bV9lbGVtZW50cyBjb3VudC4KKwkJICogTm90ZTogdGhpcyBpcyBub3QgYW4gZXJyb3IsIHRoZSBwYWNrYWdlIGlzIHBhZGRlZCBvdXQgd2l0aCBOVUxMcy4KKwkJICovCisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywKKwkJCQkgICJQYWNrYWdlIExpc3QgbGVuZ3RoICglWCkgc21hbGxlciB0aGFuIE51bUVsZW1lbnRzIGNvdW50ICglWCksIHBhZGRlZCB3aXRoIG51bGwgZWxlbWVudHNcbiIsCisJCQkJICBpLCBlbGVtZW50X2NvdW50KSk7CisJfQorCisJb2JqX2Rlc2MtPnBhY2thZ2UuZmxhZ3MgfD0gQU9QT0JKX0RBVEFfVkFMSUQ7CisJb3AtPmNvbW1vbi5ub2RlID0gQUNQSV9DQVNUX1BUUihzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSwgb2JqX2Rlc2MpOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX2RzX2NyZWF0ZV9ub2RlCisgKgorICogUEFSQU1FVEVSUzogIHdhbGtfc3RhdGUgICAgICAtIEN1cnJlbnQgd2FsayBzdGF0ZQorICogICAgICAgICAgICAgIE5vZGUgICAgICAgICAgICAtIE5TIE5vZGUgdG8gYmUgaW5pdGlhbGl6ZWQKKyAqICAgICAgICAgICAgICBPcCAgICAgICAgICAgICAgLSBQYXJzZXIgb2JqZWN0IHRvIGJlIHRyYW5zbGF0ZWQKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IENyZWF0ZSB0aGUgb2JqZWN0IHRvIGJlIGFzc29jaWF0ZWQgd2l0aCBhIG5hbWVzcGFjZSBub2RlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworYWNwaV9zdGF0dXMKK2FjcGlfZHNfY3JlYXRlX25vZGUoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSwKKwkJICAgIHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlLAorCQkgICAgdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKm9wKQoreworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYzsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKGRzX2NyZWF0ZV9ub2RlLCBvcCk7CisKKwkvKgorCSAqIEJlY2F1c2Ugb2YgdGhlIGV4ZWN1dGlvbiBwYXNzIHRocm91Z2ggdGhlIG5vbi1jb250cm9sLW1ldGhvZAorCSAqIHBhcnRzIG9mIHRoZSB0YWJsZSwgd2UgY2FuIGFycml2ZSBoZXJlIHR3aWNlLiAgT25seSBpbml0CisJICogdGhlIG5hbWVkIG9iamVjdCBub2RlIHRoZSBmaXJzdCB0aW1lIHRocm91Z2gKKwkgKi8KKwlpZiAoYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0KG5vZGUpKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CisJfQorCisJaWYgKCFvcC0+Y29tbW9uLnZhbHVlLmFyZykgeworCisJCS8qIE5vIGFyZ3VtZW50cywgdGhlcmUgaXMgbm90aGluZyB0byBkbyAqLworCisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CisJfQorCisJLyogQnVpbGQgYW4gaW50ZXJuYWwgb2JqZWN0IGZvciB0aGUgYXJndW1lbnQocykgKi8KKworCXN0YXR1cyA9IGFjcGlfZHNfYnVpbGRfaW50ZXJuYWxfb2JqZWN0KHdhbGtfc3RhdGUsIG9wLT5jb21tb24udmFsdWUuYXJnLAorCQkJCQkgICAgICAgJm9ial9kZXNjKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CisJfQorCisJLyogUmUtdHlwZSB0aGUgb2JqZWN0IGFjY29yZGluZyB0byBpdHMgYXJndW1lbnQgKi8KKworCW5vZGUtPnR5cGUgPSBBQ1BJX0dFVF9PQkpFQ1RfVFlQRShvYmpfZGVzYyk7CisKKwkvKiBBdHRhY2ggb2JqIHRvIG5vZGUgKi8KKworCXN0YXR1cyA9IGFjcGlfbnNfYXR0YWNoX29iamVjdChub2RlLCBvYmpfZGVzYywgbm9kZS0+dHlwZSk7CisKKwkvKiBSZW1vdmUgbG9jYWwgcmVmZXJlbmNlIHRvIHRoZSBvYmplY3QgKi8KKworCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZShvYmpfZGVzYyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Cit9CisKKyNlbmRpZgkJCQkvKiBBQ1BJX05PX01FVEhPRF9FWEVDVVRJT04gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9kc19pbml0X29iamVjdF9mcm9tX29wCisgKgorICogUEFSQU1FVEVSUzogIHdhbGtfc3RhdGUgICAgICAtIEN1cnJlbnQgd2FsayBzdGF0ZQorICogICAgICAgICAgICAgIE9wICAgICAgICAgICAgICAtIFBhcnNlciBvcCB1c2VkIHRvIGluaXQgdGhlIGludGVybmFsIG9iamVjdAorICogICAgICAgICAgICAgIE9wY29kZSAgICAgICAgICAtIEFNTCBvcGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBvYmplY3QKKyAqICAgICAgICAgICAgICByZXRfb2JqX2Rlc2MgICAgLSBOYW1lc3BhY2Ugb2JqZWN0IHRvIGJlIGluaXRpYWxpemVkCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBJbml0aWFsaXplIGEgbmFtZXNwYWNlIG9iamVjdCBmcm9tIGEgcGFyc2VyIE9wIGFuZCBpdHMKKyAqICAgICAgICAgICAgICBhc3NvY2lhdGVkIGFyZ3VtZW50cy4gIFRoZSBuYW1lc3BhY2Ugb2JqZWN0IGlzIGEgbW9yZSBjb21wYWN0CisgKiAgICAgICAgICAgICAgcmVwcmVzZW50YXRpb24gb2YgdGhlIE9wIGFuZCBpdHMgYXJndW1lbnRzLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2FjcGlfc3RhdHVzCithY3BpX2RzX2luaXRfb2JqZWN0X2Zyb21fb3Aoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSwKKwkJCSAgICB1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqb3AsCisJCQkgICAgdTE2IG9wY29kZSwKKwkJCSAgICB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICoqcmV0X29ial9kZXNjKQoreworCWNvbnN0IHN0cnVjdCBhY3BpX29wY29kZV9pbmZvICpvcF9pbmZvOworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjOworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOworCisJQUNQSV9GVU5DVElPTl9UUkFDRShkc19pbml0X29iamVjdF9mcm9tX29wKTsKKworCW9ial9kZXNjID0gKnJldF9vYmpfZGVzYzsKKwlvcF9pbmZvID0gYWNwaV9wc19nZXRfb3Bjb2RlX2luZm8ob3Bjb2RlKTsKKwlpZiAob3BfaW5mby0+Y2xhc3MgPT0gQU1MX0NMQVNTX1VOS05PV04pIHsKKworCQkvKiBVbmtub3duIG9wY29kZSAqLworCisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9UWVBFKTsKKwl9CisKKwkvKiBQZXJmb3JtIHBlci1vYmplY3QgaW5pdGlhbGl6YXRpb24gKi8KKworCXN3aXRjaCAoQUNQSV9HRVRfT0JKRUNUX1RZUEUob2JqX2Rlc2MpKSB7CisJY2FzZSBBQ1BJX1RZUEVfQlVGRkVSOgorCisJCS8qCisJCSAqIERlZmVyIGV2YWx1YXRpb24gb2YgQnVmZmVyIHRlcm1fYXJnIG9wZXJhbmQKKwkJICovCisJCW9ial9kZXNjLT5idWZmZXIubm9kZSA9CisJCSAgICBBQ1BJX0NBU1RfUFRSKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlLAorCQkJCSAgd2Fsa19zdGF0ZS0+b3BlcmFuZHNbMF0pOworCQlvYmpfZGVzYy0+YnVmZmVyLmFtbF9zdGFydCA9IG9wLT5uYW1lZC5kYXRhOworCQlvYmpfZGVzYy0+YnVmZmVyLmFtbF9sZW5ndGggPSBvcC0+bmFtZWQubGVuZ3RoOworCQlicmVhazsKKworCWNhc2UgQUNQSV9UWVBFX1BBQ0tBR0U6CisKKwkJLyoKKwkJICogRGVmZXIgZXZhbHVhdGlvbiBvZiBQYWNrYWdlIHRlcm1fYXJnIG9wZXJhbmQKKwkJICovCisJCW9ial9kZXNjLT5wYWNrYWdlLm5vZGUgPQorCQkgICAgQUNQSV9DQVNUX1BUUihzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSwKKwkJCQkgIHdhbGtfc3RhdGUtPm9wZXJhbmRzWzBdKTsKKwkJb2JqX2Rlc2MtPnBhY2thZ2UuYW1sX3N0YXJ0ID0gb3AtPm5hbWVkLmRhdGE7CisJCW9ial9kZXNjLT5wYWNrYWdlLmFtbF9sZW5ndGggPSBvcC0+bmFtZWQubGVuZ3RoOworCQlicmVhazsKKworCWNhc2UgQUNQSV9UWVBFX0lOVEVHRVI6CisKKwkJc3dpdGNoIChvcF9pbmZvLT50eXBlKSB7CisJCWNhc2UgQU1MX1RZUEVfQ09OU1RBTlQ6CisJCQkvKgorCQkJICogUmVzb2x2ZSBBTUwgQ29uc3RhbnRzIGhlcmUgLSBBTkQgT05MWSBIRVJFIQorCQkJICogQWxsIGNvbnN0YW50cyBhcmUgaW50ZWdlcnMuCisJCQkgKiBXZSBtYXJrIHRoZSBpbnRlZ2VyIHdpdGggYSBmbGFnIHRoYXQgaW5kaWNhdGVzIHRoYXQgaXQgc3RhcnRlZAorCQkJICogbGlmZSBhcyBhIGNvbnN0YW50IC0tIHNvIHRoYXQgc3RvcmVzIHRvIGNvbnN0YW50cyB3aWxsIHBlcmZvcm0KKwkJCSAqIGFzIGV4cGVjdGVkIChub29wKS4gemVyb19vcCBpcyB1c2VkIGFzIGEgcGxhY2Vob2xkZXIgZm9yIG9wdGlvbmFsCisJCQkgKiB0YXJnZXQgb3BlcmFuZHMuCisJCQkgKi8KKwkJCW9ial9kZXNjLT5jb21tb24uZmxhZ3MgPSBBT1BPQkpfQU1MX0NPTlNUQU5UOworCisJCQlzd2l0Y2ggKG9wY29kZSkgeworCQkJY2FzZSBBTUxfWkVST19PUDoKKworCQkJCW9ial9kZXNjLT5pbnRlZ2VyLnZhbHVlID0gMDsKKwkJCQlicmVhazsKKworCQkJY2FzZSBBTUxfT05FX09QOgorCisJCQkJb2JqX2Rlc2MtPmludGVnZXIudmFsdWUgPSAxOworCQkJCWJyZWFrOworCisJCQljYXNlIEFNTF9PTkVTX09QOgorCisJCQkJb2JqX2Rlc2MtPmludGVnZXIudmFsdWUgPSBBQ1BJX0lOVEVHRVJfTUFYOworCisJCQkJLyogVHJ1bmNhdGUgdmFsdWUgaWYgd2UgYXJlIGV4ZWN1dGluZyBmcm9tIGEgMzItYml0IEFDUEkgdGFibGUgKi8KKworI2lmbmRlZiBBQ1BJX05PX01FVEhPRF9FWEVDVVRJT04KKwkJCQlhY3BpX2V4X3RydW5jYXRlX2ZvcjMyYml0X3RhYmxlKG9ial9kZXNjKTsKKyNlbmRpZgorCQkJCWJyZWFrOworCisJCQljYXNlIEFNTF9SRVZJU0lPTl9PUDoKKworCQkJCW9ial9kZXNjLT5pbnRlZ2VyLnZhbHVlID0gQUNQSV9DQV9WRVJTSU9OOworCQkJCWJyZWFrOworCisJCQlkZWZhdWx0OgorCisJCQkJQUNQSV9FUlJPUigoQUVfSU5GTywKKwkJCQkJICAgICJVbmtub3duIGNvbnN0YW50IG9wY29kZSAlWCIsCisJCQkJCSAgICBvcGNvZGUpKTsKKwkJCQlzdGF0dXMgPSBBRV9BTUxfT1BFUkFORF9UWVBFOworCQkJCWJyZWFrOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBBTUxfVFlQRV9MSVRFUkFMOgorCisJCQlvYmpfZGVzYy0+aW50ZWdlci52YWx1ZSA9IG9wLT5jb21tb24udmFsdWUuaW50ZWdlcjsKKyNpZm5kZWYgQUNQSV9OT19NRVRIT0RfRVhFQ1VUSU9OCisJCQlhY3BpX2V4X3RydW5jYXRlX2ZvcjMyYml0X3RhYmxlKG9ial9kZXNjKTsKKyNlbmRpZgorCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCUFDUElfRVJST1IoKEFFX0lORk8sICJVbmtub3duIEludGVnZXIgdHlwZSAlWCIsCisJCQkJICAgIG9wX2luZm8tPnR5cGUpKTsKKwkJCXN0YXR1cyA9IEFFX0FNTF9PUEVSQU5EX1RZUEU7CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKworCWNhc2UgQUNQSV9UWVBFX1NUUklORzoKKworCQlvYmpfZGVzYy0+c3RyaW5nLnBvaW50ZXIgPSBvcC0+Y29tbW9uLnZhbHVlLnN0cmluZzsKKwkJb2JqX2Rlc2MtPnN0cmluZy5sZW5ndGggPQorCQkgICAgKHUzMikgQUNQSV9TVFJMRU4ob3AtPmNvbW1vbi52YWx1ZS5zdHJpbmcpOworCisJCS8qCisJCSAqIFRoZSBzdHJpbmcgaXMgY29udGFpbmVkIGluIHRoZSBBQ1BJIHRhYmxlLCBkb24ndCBldmVyIHRyeQorCQkgKiB0byBkZWxldGUgaXQKKwkJICovCisJCW9ial9kZXNjLT5jb21tb24uZmxhZ3MgfD0gQU9QT0JKX1NUQVRJQ19QT0lOVEVSOworCQlicmVhazsKKworCWNhc2UgQUNQSV9UWVBFX01FVEhPRDoKKwkJYnJlYWs7CisKKwljYXNlIEFDUElfVFlQRV9MT0NBTF9SRUZFUkVOQ0U6CisKKwkJc3dpdGNoIChvcF9pbmZvLT50eXBlKSB7CisJCWNhc2UgQU1MX1RZUEVfTE9DQUxfVkFSSUFCTEU6CisKKwkJCS8qIExvY2FsIElEICgwLTcpIGlzIChBTUwgb3Bjb2RlIC0gYmFzZSBBTUxfTE9DQUxfT1ApICovCisKKwkJCW9ial9kZXNjLT5yZWZlcmVuY2UudmFsdWUgPSBvcGNvZGUgLSBBTUxfTE9DQUxfT1A7CisJCQlvYmpfZGVzYy0+cmVmZXJlbmNlLmNsYXNzID0gQUNQSV9SRUZDTEFTU19MT0NBTDsKKworI2lmbmRlZiBBQ1BJX05PX01FVEhPRF9FWEVDVVRJT04KKwkJCXN0YXR1cyA9CisJCQkgICAgYWNwaV9kc19tZXRob2RfZGF0YV9nZXRfbm9kZShBQ1BJX1JFRkNMQVNTX0xPQ0FMLAorCQkJCQkJCSBvYmpfZGVzYy0+cmVmZXJlbmNlLgorCQkJCQkJCSB2YWx1ZSwgd2Fsa19zdGF0ZSwKKwkJCQkJCQkgQUNQSV9DQVNUX0lORElSRUNUX1BUUgorCQkJCQkJCSAoc3RydWN0CisJCQkJCQkJICBhY3BpX25hbWVzcGFjZV9ub2RlLAorCQkJCQkJCSAgJm9ial9kZXNjLT5yZWZlcmVuY2UuCisJCQkJCQkJICBvYmplY3QpKTsKKyNlbmRpZgorCQkJYnJlYWs7CisKKwkJY2FzZSBBTUxfVFlQRV9NRVRIT0RfQVJHVU1FTlQ6CisKKwkJCS8qIEFyZyBJRCAoMC02KSBpcyAoQU1MIG9wY29kZSAtIGJhc2UgQU1MX0FSR19PUCkgKi8KKworCQkJb2JqX2Rlc2MtPnJlZmVyZW5jZS52YWx1ZSA9IG9wY29kZSAtIEFNTF9BUkdfT1A7CisJCQlvYmpfZGVzYy0+cmVmZXJlbmNlLmNsYXNzID0gQUNQSV9SRUZDTEFTU19BUkc7CisKKyNpZm5kZWYgQUNQSV9OT19NRVRIT0RfRVhFQ1VUSU9OCisJCQlzdGF0dXMgPSBhY3BpX2RzX21ldGhvZF9kYXRhX2dldF9ub2RlKEFDUElfUkVGQ0xBU1NfQVJHLAorCQkJCQkJCSAgICAgIG9ial9kZXNjLT4KKwkJCQkJCQkgICAgICByZWZlcmVuY2UudmFsdWUsCisJCQkJCQkJICAgICAgd2Fsa19zdGF0ZSwKKwkJCQkJCQkgICAgICBBQ1BJX0NBU1RfSU5ESVJFQ1RfUFRSCisJCQkJCQkJICAgICAgKHN0cnVjdAorCQkJCQkJCSAgICAgICBhY3BpX25hbWVzcGFjZV9ub2RlLAorCQkJCQkJCSAgICAgICAmb2JqX2Rlc2MtPgorCQkJCQkJCSAgICAgICByZWZlcmVuY2UuCisJCQkJCQkJICAgICAgIG9iamVjdCkpOworI2VuZGlmCisJCQlicmVhazsKKworCQlkZWZhdWx0OgkvKiBPYmplY3QgbmFtZSBvciBEZWJ1ZyBvYmplY3QgKi8KKworCQkJc3dpdGNoIChvcC0+Y29tbW9uLmFtbF9vcGNvZGUpIHsKKwkJCWNhc2UgQU1MX0lOVF9OQU1FUEFUSF9PUDoKKworCQkJCS8qIE5vZGUgd2FzIHNhdmVkIGluIE9wICovCisKKwkJCQlvYmpfZGVzYy0+cmVmZXJlbmNlLm5vZGUgPSBvcC0+Y29tbW9uLm5vZGU7CisJCQkJb2JqX2Rlc2MtPnJlZmVyZW5jZS5vYmplY3QgPQorCQkJCSAgICBvcC0+Y29tbW9uLm5vZGUtPm9iamVjdDsKKwkJCQlvYmpfZGVzYy0+cmVmZXJlbmNlLmNsYXNzID0gQUNQSV9SRUZDTEFTU19OQU1FOworCQkJCWJyZWFrOworCisJCQljYXNlIEFNTF9ERUJVR19PUDoKKworCQkJCW9ial9kZXNjLT5yZWZlcmVuY2UuY2xhc3MgPSBBQ1BJX1JFRkNMQVNTX0RFQlVHOworCQkJCWJyZWFrOworCisJCQlkZWZhdWx0OgorCisJCQkJQUNQSV9FUlJPUigoQUVfSU5GTywKKwkJCQkJICAgICJVbmltcGxlbWVudGVkIHJlZmVyZW5jZSB0eXBlIGZvciBBTUwgb3Bjb2RlOiAlNC40WCIsCisJCQkJCSAgICBvcGNvZGUpKTsKKwkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX09QRVJBTkRfVFlQRSk7CisJCQl9CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKworCWRlZmF1bHQ6CisKKwkJQUNQSV9FUlJPUigoQUVfSU5GTywgIlVuaW1wbGVtZW50ZWQgZGF0YSB0eXBlOiAlWCIsCisJCQkgICAgQUNQSV9HRVRfT0JKRUNUX1RZUEUob2JqX2Rlc2MpKSk7CisKKwkJc3RhdHVzID0gQUVfQU1MX09QRVJBTkRfVFlQRTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2Rzb3Bjb2RlLmMgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2Rzb3Bjb2RlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGMzYjRkZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvZHNvcGNvZGUuYwpAQCAtMCwwICsxLDE0NjkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBNb2R1bGUgTmFtZTogZHNvcGNvZGUgLSBEaXNwYXRjaGVyIE9wIFJlZ2lvbiBzdXBwb3J0IGFuZCBoYW5kbGluZyBvZgorICogICAgICAgICAgICAgICAgICAgICAgICAgImNvbnRyb2wiIG9wY29kZXMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA4LCBJbnRlbCBDb3JwLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAorICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgYXQgbWluaW11bSBhIGRpc2NsYWltZXIKKyAqICAgIHN1YnN0YW50aWFsbHkgc2ltaWxhciB0byB0aGUgIk5PIFdBUlJBTlRZIiBkaXNjbGFpbWVyIGJlbG93CisgKiAgICAoIkRpc2NsYWltZXIiKSBhbmQgYW55IHJlZGlzdHJpYnV0aW9uIG11c3QgYmUgY29uZGl0aW9uZWQgdXBvbgorICogICAgaW5jbHVkaW5nIGEgc3Vic3RhbnRpYWxseSBzaW1pbGFyIERpc2NsYWltZXIgcmVxdWlyZW1lbnQgZm9yIGZ1cnRoZXIKKyAqICAgIGJpbmFyeSByZWRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcworICogICAgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBOTyBXQVJSQU5UWQorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcKKyAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgorICovCisKKyNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KKyNpbmNsdWRlICJhY2NvbW1vbi5oIgorI2luY2x1ZGUgImFjcGFyc2VyLmgiCisjaW5jbHVkZSAiYW1sY29kZS5oIgorI2luY2x1ZGUgImFjZGlzcGF0LmgiCisjaW5jbHVkZSAiYWNpbnRlcnAuaCIKKyNpbmNsdWRlICJhY25hbWVzcC5oIgorI2luY2x1ZGUgImFjZXZlbnRzLmgiCisjaW5jbHVkZSAiYWN0YWJsZXMuaCIKKworI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfRElTUEFUQ0hFUgorQUNQSV9NT0RVTEVfTkFNRSgiZHNvcGNvZGUiKQorCisvKiBMb2NhbCBwcm90b3R5cGVzICovCitzdGF0aWMgYWNwaV9zdGF0dXMKK2FjcGlfZHNfZXhlY3V0ZV9hcmd1bWVudHMoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGUsCisJCQkgIHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpzY29wZV9ub2RlLAorCQkJICB1MzIgYW1sX2xlbmd0aCwgdTggKiBhbWxfc3RhcnQpOworCitzdGF0aWMgYWNwaV9zdGF0dXMKK2FjcGlfZHNfaW5pdF9idWZmZXJfZmllbGQodTE2IGFtbF9vcGNvZGUsCisJCQkgIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjLAorCQkJICB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpidWZmZXJfZGVzYywKKwkJCSAgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2Zmc2V0X2Rlc2MsCisJCQkgIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKmxlbmd0aF9kZXNjLAorCQkJICB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpyZXN1bHRfZGVzYyk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfZHNfZXhlY3V0ZV9hcmd1bWVudHMKKyAqCisgKiBQQVJBTUVURVJTOiAgTm9kZSAgICAgICAgICAgICAgICAtIE9iamVjdCBOUyBub2RlCisgKiAgICAgICAgICAgICAgc2NvcGVfbm9kZSAgICAgICAgICAtIFBhcmVudCBOUyBub2RlCisgKiAgICAgICAgICAgICAgYW1sX2xlbmd0aCAgICAgICAgICAtIExlbmd0aCBvZiBleGVjdXRhYmxlIEFNTAorICogICAgICAgICAgICAgIGFtbF9zdGFydCAgICAgICAgICAgLSBQb2ludGVyIHRvIHRoZSBBTUwKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzLgorICoKKyAqIERFU0NSSVBUSU9OOiBMYXRlIChkZWZlcnJlZCkgZXhlY3V0aW9uIG9mIHJlZ2lvbiBvciBmaWVsZCBhcmd1bWVudHMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgYWNwaV9zdGF0dXMKK2FjcGlfZHNfZXhlY3V0ZV9hcmd1bWVudHMoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGUsCisJCQkgIHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpzY29wZV9ub2RlLAorCQkJICB1MzIgYW1sX2xlbmd0aCwgdTggKiBhbWxfc3RhcnQpCit7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpvcDsKKwlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlOworCisJQUNQSV9GVU5DVElPTl9UUkFDRShkc19leGVjdXRlX2FyZ3VtZW50cyk7CisKKwkvKgorCSAqIEFsbG9jYXRlIGEgbmV3IHBhcnNlciBvcCB0byBiZSB0aGUgcm9vdCBvZiB0aGUgcGFyc2VkIHRyZWUKKwkgKi8KKwlvcCA9IGFjcGlfcHNfYWxsb2Nfb3AoQU1MX0lOVF9FVkFMX1NVQlRSRUVfT1ApOworCWlmICghb3ApIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX01FTU9SWSk7CisJfQorCisJLyogU2F2ZSB0aGUgTm9kZSBmb3IgdXNlIGluIGFjcGlfcHNfcGFyc2VfYW1sICovCisKKwlvcC0+Y29tbW9uLm5vZGUgPSBzY29wZV9ub2RlOworCisJLyogQ3JlYXRlIGFuZCBpbml0aWFsaXplIGEgbmV3IHBhcnNlciBzdGF0ZSAqLworCisJd2Fsa19zdGF0ZSA9IGFjcGlfZHNfY3JlYXRlX3dhbGtfc3RhdGUoMCwgTlVMTCwgTlVMTCwgTlVMTCk7CisJaWYgKCF3YWxrX3N0YXRlKSB7CisJCXN0YXR1cyA9IEFFX05PX01FTU9SWTsKKwkJZ290byBjbGVhbnVwOworCX0KKworCXN0YXR1cyA9IGFjcGlfZHNfaW5pdF9hbWxfd2Fsayh3YWxrX3N0YXRlLCBvcCwgTlVMTCwgYW1sX3N0YXJ0LAorCQkJCSAgICAgICBhbWxfbGVuZ3RoLCBOVUxMLCBBQ1BJX0lNT0RFX0xPQURfUEFTUzEpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlhY3BpX2RzX2RlbGV0ZV93YWxrX3N0YXRlKHdhbGtfc3RhdGUpOworCQlnb3RvIGNsZWFudXA7CisJfQorCisJLyogTWFyayB0aGlzIHBhcnNlIGFzIGEgZGVmZXJyZWQgb3Bjb2RlICovCisKKwl3YWxrX3N0YXRlLT5wYXJzZV9mbGFncyA9IEFDUElfUEFSU0VfREVGRVJSRURfT1A7CisJd2Fsa19zdGF0ZS0+ZGVmZXJyZWRfbm9kZSA9IG5vZGU7CisKKwkvKiBQYXNzMTogUGFyc2UgdGhlIGVudGlyZSBkZWNsYXJhdGlvbiAqLworCisJc3RhdHVzID0gYWNwaV9wc19wYXJzZV9hbWwod2Fsa19zdGF0ZSk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCWdvdG8gY2xlYW51cDsKKwl9CisKKwkvKiBHZXQgYW5kIGluaXQgdGhlIE9wIGNyZWF0ZWQgYWJvdmUgKi8KKworCW9wLT5jb21tb24ubm9kZSA9IG5vZGU7CisJYWNwaV9wc19kZWxldGVfcGFyc2VfdHJlZShvcCk7CisKKwkvKiBFdmFsdWF0ZSB0aGUgZGVmZXJyZWQgYXJndW1lbnRzICovCisKKwlvcCA9IGFjcGlfcHNfYWxsb2Nfb3AoQU1MX0lOVF9FVkFMX1NVQlRSRUVfT1ApOworCWlmICghb3ApIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX01FTU9SWSk7CisJfQorCisJb3AtPmNvbW1vbi5ub2RlID0gc2NvcGVfbm9kZTsKKworCS8qIENyZWF0ZSBhbmQgaW5pdGlhbGl6ZSBhIG5ldyBwYXJzZXIgc3RhdGUgKi8KKworCXdhbGtfc3RhdGUgPSBhY3BpX2RzX2NyZWF0ZV93YWxrX3N0YXRlKDAsIE5VTEwsIE5VTEwsIE5VTEwpOworCWlmICghd2Fsa19zdGF0ZSkgeworCQlzdGF0dXMgPSBBRV9OT19NRU1PUlk7CisJCWdvdG8gY2xlYW51cDsKKwl9CisKKwkvKiBFeGVjdXRlIHRoZSBvcGNvZGUgYW5kIGFyZ3VtZW50cyAqLworCisJc3RhdHVzID0gYWNwaV9kc19pbml0X2FtbF93YWxrKHdhbGtfc3RhdGUsIG9wLCBOVUxMLCBhbWxfc3RhcnQsCisJCQkJICAgICAgIGFtbF9sZW5ndGgsIE5VTEwsIEFDUElfSU1PREVfRVhFQ1VURSk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCWFjcGlfZHNfZGVsZXRlX3dhbGtfc3RhdGUod2Fsa19zdGF0ZSk7CisJCWdvdG8gY2xlYW51cDsKKwl9CisKKwkvKiBNYXJrIHRoaXMgZXhlY3V0aW9uIGFzIGEgZGVmZXJyZWQgb3Bjb2RlICovCisKKwl3YWxrX3N0YXRlLT5kZWZlcnJlZF9ub2RlID0gbm9kZTsKKwlzdGF0dXMgPSBhY3BpX3BzX3BhcnNlX2FtbCh3YWxrX3N0YXRlKTsKKworICAgICAgY2xlYW51cDoKKwlhY3BpX3BzX2RlbGV0ZV9wYXJzZV90cmVlKG9wKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9kc19nZXRfYnVmZmVyX2ZpZWxkX2FyZ3VtZW50cworICoKKyAqIFBBUkFNRVRFUlM6ICBvYmpfZGVzYyAgICAgICAgLSBBIHZhbGlkIGJ1ZmZlcl9maWVsZCBvYmplY3QKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzLgorICoKKyAqIERFU0NSSVBUSU9OOiBHZXQgYnVmZmVyX2ZpZWxkIEJ1ZmZlciBhbmQgSW5kZXguIFRoaXMgaW1wbGVtZW50cyB0aGUgbGF0ZQorICogICAgICAgICAgICAgIGV2YWx1YXRpb24gb2YgdGhlc2UgZmllbGQgYXR0cmlidXRlcy4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCithY3BpX3N0YXR1cworYWNwaV9kc19nZXRfYnVmZmVyX2ZpZWxkX2FyZ3VtZW50cyh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYykKK3sKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpleHRyYV9kZXNjOworCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKGRzX2dldF9idWZmZXJfZmllbGRfYXJndW1lbnRzLCBvYmpfZGVzYyk7CisKKwlpZiAob2JqX2Rlc2MtPmNvbW1vbi5mbGFncyAmIEFPUE9CSl9EQVRBX1ZBTElEKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CisJfQorCisJLyogR2V0IHRoZSBBTUwgcG9pbnRlciAobWV0aG9kIG9iamVjdCkgYW5kIGJ1ZmZlcl9maWVsZCBub2RlICovCisKKwlleHRyYV9kZXNjID0gYWNwaV9uc19nZXRfc2Vjb25kYXJ5X29iamVjdChvYmpfZGVzYyk7CisJbm9kZSA9IG9ial9kZXNjLT5idWZmZXJfZmllbGQubm9kZTsKKworCUFDUElfREVCVUdfRVhFQyhhY3BpX3V0X2Rpc3BsYXlfaW5pdF9wYXRobmFtZQorCQkJKEFDUElfVFlQRV9CVUZGRVJfRklFTEQsIG5vZGUsIE5VTEwpKTsKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VYRUMsICJbJTQuNHNdIEJ1ZmZlckZpZWxkIEFyZyBJbml0XG4iLAorCQkJICBhY3BpX3V0X2dldF9ub2RlX25hbWUobm9kZSkpKTsKKworCS8qIEV4ZWN1dGUgdGhlIEFNTCBjb2RlIGZvciB0aGUgdGVybV9hcmcgYXJndW1lbnRzICovCisKKwlzdGF0dXMgPSBhY3BpX2RzX2V4ZWN1dGVfYXJndW1lbnRzKG5vZGUsIGFjcGlfbnNfZ2V0X3BhcmVudF9ub2RlKG5vZGUpLAorCQkJCQkgICBleHRyYV9kZXNjLT5leHRyYS5hbWxfbGVuZ3RoLAorCQkJCQkgICBleHRyYV9kZXNjLT5leHRyYS5hbWxfc3RhcnQpOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX2RzX2dldF9iYW5rX2ZpZWxkX2FyZ3VtZW50cworICoKKyAqIFBBUkFNRVRFUlM6ICBvYmpfZGVzYyAgICAgICAgLSBBIHZhbGlkIGJhbmtfZmllbGQgb2JqZWN0CisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cy4KKyAqCisgKiBERVNDUklQVElPTjogR2V0IGJhbmtfZmllbGQgYmFua192YWx1ZS4gVGhpcyBpbXBsZW1lbnRzIHRoZSBsYXRlCisgKiAgICAgICAgICAgICAgZXZhbHVhdGlvbiBvZiB0aGVzZSBmaWVsZCBhdHRyaWJ1dGVzLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2FjcGlfc3RhdHVzCithY3BpX2RzX2dldF9iYW5rX2ZpZWxkX2FyZ3VtZW50cyh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYykKK3sKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpleHRyYV9kZXNjOworCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKGRzX2dldF9iYW5rX2ZpZWxkX2FyZ3VtZW50cywgb2JqX2Rlc2MpOworCisJaWYgKG9ial9kZXNjLT5jb21tb24uZmxhZ3MgJiBBT1BPQkpfREFUQV9WQUxJRCkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOworCX0KKworCS8qIEdldCB0aGUgQU1MIHBvaW50ZXIgKG1ldGhvZCBvYmplY3QpIGFuZCBiYW5rX2ZpZWxkIG5vZGUgKi8KKworCWV4dHJhX2Rlc2MgPSBhY3BpX25zX2dldF9zZWNvbmRhcnlfb2JqZWN0KG9ial9kZXNjKTsKKwlub2RlID0gb2JqX2Rlc2MtPmJhbmtfZmllbGQubm9kZTsKKworCUFDUElfREVCVUdfRVhFQyhhY3BpX3V0X2Rpc3BsYXlfaW5pdF9wYXRobmFtZQorCQkJKEFDUElfVFlQRV9MT0NBTF9CQU5LX0ZJRUxELCBub2RlLCBOVUxMKSk7CisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FWEVDLCAiWyU0LjRzXSBCYW5rRmllbGQgQXJnIEluaXRcbiIsCisJCQkgIGFjcGlfdXRfZ2V0X25vZGVfbmFtZShub2RlKSkpOworCisJLyogRXhlY3V0ZSB0aGUgQU1MIGNvZGUgZm9yIHRoZSB0ZXJtX2FyZyBhcmd1bWVudHMgKi8KKworCXN0YXR1cyA9IGFjcGlfZHNfZXhlY3V0ZV9hcmd1bWVudHMobm9kZSwgYWNwaV9uc19nZXRfcGFyZW50X25vZGUobm9kZSksCisJCQkJCSAgIGV4dHJhX2Rlc2MtPmV4dHJhLmFtbF9sZW5ndGgsCisJCQkJCSAgIGV4dHJhX2Rlc2MtPmV4dHJhLmFtbF9zdGFydCk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfZHNfZ2V0X2J1ZmZlcl9hcmd1bWVudHMKKyAqCisgKiBQQVJBTUVURVJTOiAgb2JqX2Rlc2MgICAgICAgIC0gQSB2YWxpZCBCdWZmZXIgb2JqZWN0CisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cy4KKyAqCisgKiBERVNDUklQVElPTjogR2V0IEJ1ZmZlciBsZW5ndGggYW5kIGluaXRpYWxpemVyIGJ5dGUgbGlzdC4gIFRoaXMgaW1wbGVtZW50cworICogICAgICAgICAgICAgIHRoZSBsYXRlIGV2YWx1YXRpb24gb2YgdGhlc2UgYXR0cmlidXRlcy4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCithY3BpX3N0YXR1cyBhY3BpX2RzX2dldF9idWZmZXJfYXJndW1lbnRzKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjKQoreworCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKGRzX2dldF9idWZmZXJfYXJndW1lbnRzLCBvYmpfZGVzYyk7CisKKwlpZiAob2JqX2Rlc2MtPmNvbW1vbi5mbGFncyAmIEFPUE9CSl9EQVRBX1ZBTElEKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CisJfQorCisJLyogR2V0IHRoZSBCdWZmZXIgbm9kZSAqLworCisJbm9kZSA9IG9ial9kZXNjLT5idWZmZXIubm9kZTsKKwlpZiAoIW5vZGUpIHsKKwkJQUNQSV9FUlJPUigoQUVfSU5GTywKKwkJCSAgICAiTm8gcG9pbnRlciBiYWNrIHRvIE5TIG5vZGUgaW4gYnVmZmVyIG9iaiAlcCIsCisJCQkgICAgb2JqX2Rlc2MpKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9JTlRFUk5BTCk7CisJfQorCisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FWEVDLCAiQnVmZmVyIEFyZyBJbml0XG4iKSk7CisKKwkvKiBFeGVjdXRlIHRoZSBBTUwgY29kZSBmb3IgdGhlIHRlcm1fYXJnIGFyZ3VtZW50cyAqLworCisJc3RhdHVzID0gYWNwaV9kc19leGVjdXRlX2FyZ3VtZW50cyhub2RlLCBub2RlLAorCQkJCQkgICBvYmpfZGVzYy0+YnVmZmVyLmFtbF9sZW5ndGgsCisJCQkJCSAgIG9ial9kZXNjLT5idWZmZXIuYW1sX3N0YXJ0KTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9kc19nZXRfcGFja2FnZV9hcmd1bWVudHMKKyAqCisgKiBQQVJBTUVURVJTOiAgb2JqX2Rlc2MgICAgICAgIC0gQSB2YWxpZCBQYWNrYWdlIG9iamVjdAorICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMuCisgKgorICogREVTQ1JJUFRJT046IEdldCBQYWNrYWdlIGxlbmd0aCBhbmQgaW5pdGlhbGl6ZXIgYnl0ZSBsaXN0LiAgVGhpcyBpbXBsZW1lbnRzCisgKiAgICAgICAgICAgICAgdGhlIGxhdGUgZXZhbHVhdGlvbiBvZiB0aGVzZSBhdHRyaWJ1dGVzLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2FjcGlfc3RhdHVzIGFjcGlfZHNfZ2V0X3BhY2thZ2VfYXJndW1lbnRzKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjKQoreworCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKGRzX2dldF9wYWNrYWdlX2FyZ3VtZW50cywgb2JqX2Rlc2MpOworCisJaWYgKG9ial9kZXNjLT5jb21tb24uZmxhZ3MgJiBBT1BPQkpfREFUQV9WQUxJRCkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOworCX0KKworCS8qIEdldCB0aGUgUGFja2FnZSBub2RlICovCisKKwlub2RlID0gb2JqX2Rlc2MtPnBhY2thZ2Uubm9kZTsKKwlpZiAoIW5vZGUpIHsKKwkJQUNQSV9FUlJPUigoQUVfSU5GTywKKwkJCSAgICAiTm8gcG9pbnRlciBiYWNrIHRvIE5TIG5vZGUgaW4gcGFja2FnZSAlcCIsCisJCQkgICAgb2JqX2Rlc2MpKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9JTlRFUk5BTCk7CisJfQorCisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FWEVDLCAiUGFja2FnZSBBcmcgSW5pdFxuIikpOworCisJLyogRXhlY3V0ZSB0aGUgQU1MIGNvZGUgZm9yIHRoZSB0ZXJtX2FyZyBhcmd1bWVudHMgKi8KKworCXN0YXR1cyA9IGFjcGlfZHNfZXhlY3V0ZV9hcmd1bWVudHMobm9kZSwgbm9kZSwKKwkJCQkJICAgb2JqX2Rlc2MtPnBhY2thZ2UuYW1sX2xlbmd0aCwKKwkJCQkJICAgb2JqX2Rlc2MtPnBhY2thZ2UuYW1sX3N0YXJ0KTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfZHNfZ2V0X3JlZ2lvbl9hcmd1bWVudHMKKyAqCisgKiBQQVJBTUVURVJTOiAgb2JqX2Rlc2MgICAgICAgIC0gQSB2YWxpZCByZWdpb24gb2JqZWN0CisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cy4KKyAqCisgKiBERVNDUklQVElPTjogR2V0IHJlZ2lvbiBhZGRyZXNzIGFuZCBsZW5ndGguICBUaGlzIGltcGxlbWVudHMgdGhlIGxhdGUKKyAqICAgICAgICAgICAgICBldmFsdWF0aW9uIG9mIHRoZXNlIHJlZ2lvbiBhdHRyaWJ1dGVzLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCithY3BpX3N0YXR1cyBhY3BpX2RzX2dldF9yZWdpb25fYXJndW1lbnRzKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjKQoreworCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpleHRyYV9kZXNjOworCisJQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIoZHNfZ2V0X3JlZ2lvbl9hcmd1bWVudHMsIG9ial9kZXNjKTsKKworCWlmIChvYmpfZGVzYy0+cmVnaW9uLmZsYWdzICYgQU9QT0JKX0RBVEFfVkFMSUQpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKKwl9CisKKwlleHRyYV9kZXNjID0gYWNwaV9uc19nZXRfc2Vjb25kYXJ5X29iamVjdChvYmpfZGVzYyk7CisJaWYgKCFleHRyYV9kZXNjKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT1RfRVhJU1QpOworCX0KKworCS8qIEdldCB0aGUgUmVnaW9uIG5vZGUgKi8KKworCW5vZGUgPSBvYmpfZGVzYy0+cmVnaW9uLm5vZGU7CisKKwlBQ1BJX0RFQlVHX0VYRUMoYWNwaV91dF9kaXNwbGF5X2luaXRfcGF0aG5hbWUKKwkJCShBQ1BJX1RZUEVfUkVHSU9OLCBub2RlLCBOVUxMKSk7CisKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VYRUMsICJbJTQuNHNdIE9wUmVnaW9uIEFyZyBJbml0IGF0IEFNTCAlcFxuIiwKKwkJCSAgYWNwaV91dF9nZXRfbm9kZV9uYW1lKG5vZGUpLAorCQkJICBleHRyYV9kZXNjLT5leHRyYS5hbWxfc3RhcnQpKTsKKworCS8qIEV4ZWN1dGUgdGhlIGFyZ3VtZW50IEFNTCAqLworCisJc3RhdHVzID0gYWNwaV9kc19leGVjdXRlX2FyZ3VtZW50cyhub2RlLCBhY3BpX25zX2dldF9wYXJlbnRfbm9kZShub2RlKSwKKwkJCQkJICAgZXh0cmFfZGVzYy0+ZXh0cmEuYW1sX2xlbmd0aCwKKwkJCQkJICAgZXh0cmFfZGVzYy0+ZXh0cmEuYW1sX3N0YXJ0KTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CisJfQorCisJLyogVmFsaWRhdGUgdGhlIHJlZ2lvbiBhZGRyZXNzL2xlbmd0aCB2aWEgdGhlIGhvc3QgT1MgKi8KKworCXN0YXR1cyA9IGFjcGlfb3NfdmFsaWRhdGVfYWRkcmVzcyhvYmpfZGVzYy0+cmVnaW9uLnNwYWNlX2lkLAorCQkJCQkgIG9ial9kZXNjLT5yZWdpb24uYWRkcmVzcywKKwkJCQkJICAoYWNwaV9zaXplKSBvYmpfZGVzYy0+cmVnaW9uLmxlbmd0aCwKKwkJCQkJICBhY3BpX3V0X2dldF9ub2RlX25hbWUobm9kZSkpOworCisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCS8qCisJCSAqIEludmFsaWQgYWRkcmVzcy9sZW5ndGguIFdlIHdpbGwgZW1pdCBhbiBlcnJvciBtZXNzYWdlIGFuZCBtYXJrCisJCSAqIHRoZSByZWdpb24gYXMgaW52YWxpZCwgc28gdGhhdCBpdCB3aWxsIGNhdXNlIGFuIGFkZGl0aW9uYWwgZXJyb3IgaWYKKwkJICogaXQgaXMgZXZlciB1c2VkLiBUaGVuIHJldHVybiBBRV9PSy4KKwkJICovCisJCUFDUElfRVhDRVBUSU9OKChBRV9JTkZPLCBzdGF0dXMsCisJCQkJIkR1cmluZyBhZGRyZXNzIHZhbGlkYXRpb24gb2YgT3BSZWdpb24gWyU0LjRzXSIsCisJCQkJbm9kZS0+bmFtZS5hc2NpaSkpOworCQlvYmpfZGVzYy0+Y29tbW9uLmZsYWdzIHw9IEFPUE9CSl9JTlZBTElEOworCQlzdGF0dXMgPSBBRV9PSzsKKwl9CisKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9kc19pbml0aWFsaXplX3JlZ2lvbgorICoKKyAqIFBBUkFNRVRFUlM6ICBvYmpfaGFuZGxlICAgICAgLSBSZWdpb24gbmFtZXNwYWNlIG5vZGUKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IEZyb250IGVuZCB0byBldl9pbml0aWFsaXplX3JlZ2lvbgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2FjcGlfc3RhdHVzIGFjcGlfZHNfaW5pdGlhbGl6ZV9yZWdpb24oYWNwaV9oYW5kbGUgb2JqX2hhbmRsZSkKK3sKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYzsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisKKwlvYmpfZGVzYyA9IGFjcGlfbnNfZ2V0X2F0dGFjaGVkX29iamVjdChvYmpfaGFuZGxlKTsKKworCS8qIE5hbWVzcGFjZSBpcyBOT1QgbG9ja2VkICovCisKKwlzdGF0dXMgPSBhY3BpX2V2X2luaXRpYWxpemVfcmVnaW9uKG9ial9kZXNjLCBGQUxTRSk7CisJcmV0dXJuIChzdGF0dXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX2RzX2luaXRfYnVmZmVyX2ZpZWxkCisgKgorICogUEFSQU1FVEVSUzogIGFtbF9vcGNvZGUgICAgICAtIGNyZWF0ZV94eHhfZmllbGQKKyAqICAgICAgICAgICAgICBvYmpfZGVzYyAgICAgICAgLSBidWZmZXJfZmllbGQgb2JqZWN0CisgKiAgICAgICAgICAgICAgYnVmZmVyX2Rlc2MgICAgIC0gSG9zdCBCdWZmZXIKKyAqICAgICAgICAgICAgICBvZmZzZXRfZGVzYyAgICAgLSBPZmZzZXQgaW50byBidWZmZXIKKyAqICAgICAgICAgICAgICBsZW5ndGhfZGVzYyAgICAgLSBMZW5ndGggb2YgZmllbGQgKENSRUFURV9GSUVMRF9PUCBvbmx5KQorICogICAgICAgICAgICAgIHJlc3VsdF9kZXNjICAgICAtIFdoZXJlIHRvIHN0b3JlIHRoZSByZXN1bHQKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IFBlcmZvcm0gYWN0dWFsIGluaXRpYWxpemF0aW9uIG9mIGEgYnVmZmVyIGZpZWxkCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGFjcGlfc3RhdHVzCithY3BpX2RzX2luaXRfYnVmZmVyX2ZpZWxkKHUxNiBhbWxfb3Bjb2RlLAorCQkJICB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYywKKwkJCSAgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqYnVmZmVyX2Rlc2MsCisJCQkgIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9mZnNldF9kZXNjLAorCQkJICB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpsZW5ndGhfZGVzYywKKwkJCSAgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqcmVzdWx0X2Rlc2MpCit7CisJdTMyIG9mZnNldDsKKwl1MzIgYml0X29mZnNldDsKKwl1MzIgYml0X2NvdW50OworCXU4IGZpZWxkX2ZsYWdzOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKGRzX2luaXRfYnVmZmVyX2ZpZWxkLCBvYmpfZGVzYyk7CisKKwkvKiBIb3N0IG9iamVjdCBtdXN0IGJlIGEgQnVmZmVyICovCisKKwlpZiAoQUNQSV9HRVRfT0JKRUNUX1RZUEUoYnVmZmVyX2Rlc2MpICE9IEFDUElfVFlQRV9CVUZGRVIpIHsKKwkJQUNQSV9FUlJPUigoQUVfSU5GTywKKwkJCSAgICAiVGFyZ2V0IG9mIENyZWF0ZSBGaWVsZCBpcyBub3QgYSBCdWZmZXIgb2JqZWN0IC0gJXMiLAorCQkJICAgIGFjcGlfdXRfZ2V0X29iamVjdF90eXBlX25hbWUoYnVmZmVyX2Rlc2MpKSk7CisKKwkJc3RhdHVzID0gQUVfQU1MX09QRVJBTkRfVFlQRTsKKwkJZ290byBjbGVhbnVwOworCX0KKworCS8qCisJICogVGhlIGxhc3QgcGFyYW1ldGVyIHRvIGFsbCBvZiB0aGVzZSBvcGNvZGVzIChyZXN1bHRfZGVzYykgc3RhcnRlZAorCSAqIG91dCBhcyBhIG5hbWVfc3RyaW5nLCBhbmQgc2hvdWxkIHRoZXJlZm9yZSBub3cgYmUgYSBOUyBub2RlCisJICogYWZ0ZXIgcmVzb2x1dGlvbiBpbiBhY3BpX2V4X3Jlc29sdmVfb3BlcmFuZHMoKS4KKwkgKi8KKwlpZiAoQUNQSV9HRVRfREVTQ1JJUFRPUl9UWVBFKHJlc3VsdF9kZXNjKSAhPSBBQ1BJX0RFU0NfVFlQRV9OQU1FRCkgeworCQlBQ1BJX0VSUk9SKChBRV9JTkZPLAorCQkJICAgICIoJXMpIGRlc3RpbmF0aW9uIG5vdCBhIE5TIE5vZGUgWyVzXSIsCisJCQkgICAgYWNwaV9wc19nZXRfb3Bjb2RlX25hbWUoYW1sX29wY29kZSksCisJCQkgICAgYWNwaV91dF9nZXRfZGVzY3JpcHRvcl9uYW1lKHJlc3VsdF9kZXNjKSkpOworCisJCXN0YXR1cyA9IEFFX0FNTF9PUEVSQU5EX1RZUEU7CisJCWdvdG8gY2xlYW51cDsKKwl9CisKKwlvZmZzZXQgPSAodTMyKSBvZmZzZXRfZGVzYy0+aW50ZWdlci52YWx1ZTsKKworCS8qCisJICogU2V0dXAgdGhlIEJpdCBvZmZzZXRzIGFuZCBjb3VudHMsIGFjY29yZGluZyB0byB0aGUgb3Bjb2RlCisJICovCisJc3dpdGNoIChhbWxfb3Bjb2RlKSB7CisJY2FzZSBBTUxfQ1JFQVRFX0ZJRUxEX09QOgorCisJCS8qIE9mZnNldCBpcyBpbiBiaXRzLCBjb3VudCBpcyBpbiBiaXRzICovCisKKwkJZmllbGRfZmxhZ3MgPSBBTUxfRklFTERfQUNDRVNTX0JZVEU7CisJCWJpdF9vZmZzZXQgPSBvZmZzZXQ7CisJCWJpdF9jb3VudCA9ICh1MzIpIGxlbmd0aF9kZXNjLT5pbnRlZ2VyLnZhbHVlOworCisJCS8qIE11c3QgaGF2ZSBhIHZhbGlkICg+MCkgYml0IGNvdW50ICovCisKKwkJaWYgKGJpdF9jb3VudCA9PSAwKSB7CisJCQlBQ1BJX0VSUk9SKChBRV9JTkZPLAorCQkJCSAgICAiQXR0ZW1wdCB0byBDcmVhdGVGaWVsZCBvZiBsZW5ndGggemVybyIpKTsKKwkJCXN0YXR1cyA9IEFFX0FNTF9PUEVSQU5EX1ZBTFVFOworCQkJZ290byBjbGVhbnVwOworCQl9CisJCWJyZWFrOworCisJY2FzZSBBTUxfQ1JFQVRFX0JJVF9GSUVMRF9PUDoKKworCQkvKiBPZmZzZXQgaXMgaW4gYml0cywgRmllbGQgaXMgb25lIGJpdCAqLworCisJCWJpdF9vZmZzZXQgPSBvZmZzZXQ7CisJCWJpdF9jb3VudCA9IDE7CisJCWZpZWxkX2ZsYWdzID0gQU1MX0ZJRUxEX0FDQ0VTU19CWVRFOworCQlicmVhazsKKworCWNhc2UgQU1MX0NSRUFURV9CWVRFX0ZJRUxEX09QOgorCisJCS8qIE9mZnNldCBpcyBpbiBieXRlcywgZmllbGQgaXMgb25lIGJ5dGUgKi8KKworCQliaXRfb2Zmc2V0ID0gOCAqIG9mZnNldDsKKwkJYml0X2NvdW50ID0gODsKKwkJZmllbGRfZmxhZ3MgPSBBTUxfRklFTERfQUNDRVNTX0JZVEU7CisJCWJyZWFrOworCisJY2FzZSBBTUxfQ1JFQVRFX1dPUkRfRklFTERfT1A6CisKKwkJLyogT2Zmc2V0IGlzIGluIGJ5dGVzLCBmaWVsZCBpcyBvbmUgd29yZCAqLworCisJCWJpdF9vZmZzZXQgPSA4ICogb2Zmc2V0OworCQliaXRfY291bnQgPSAxNjsKKwkJZmllbGRfZmxhZ3MgPSBBTUxfRklFTERfQUNDRVNTX1dPUkQ7CisJCWJyZWFrOworCisJY2FzZSBBTUxfQ1JFQVRFX0RXT1JEX0ZJRUxEX09QOgorCisJCS8qIE9mZnNldCBpcyBpbiBieXRlcywgZmllbGQgaXMgb25lIGR3b3JkICovCisKKwkJYml0X29mZnNldCA9IDggKiBvZmZzZXQ7CisJCWJpdF9jb3VudCA9IDMyOworCQlmaWVsZF9mbGFncyA9IEFNTF9GSUVMRF9BQ0NFU1NfRFdPUkQ7CisJCWJyZWFrOworCisJY2FzZSBBTUxfQ1JFQVRFX1FXT1JEX0ZJRUxEX09QOgorCisJCS8qIE9mZnNldCBpcyBpbiBieXRlcywgZmllbGQgaXMgb25lIHF3b3JkICovCisKKwkJYml0X29mZnNldCA9IDggKiBvZmZzZXQ7CisJCWJpdF9jb3VudCA9IDY0OworCQlmaWVsZF9mbGFncyA9IEFNTF9GSUVMRF9BQ0NFU1NfUVdPUkQ7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKworCQlBQ1BJX0VSUk9SKChBRV9JTkZPLAorCQkJICAgICJVbmtub3duIGZpZWxkIGNyZWF0aW9uIG9wY29kZSAlMDJ4IiwgYW1sX29wY29kZSkpOworCQlzdGF0dXMgPSBBRV9BTUxfQkFEX09QQ09ERTsKKwkJZ290byBjbGVhbnVwOworCX0KKworCS8qIEVudGlyZSBmaWVsZCBtdXN0IGZpdCB3aXRoaW4gdGhlIGN1cnJlbnQgbGVuZ3RoIG9mIHRoZSBidWZmZXIgKi8KKworCWlmICgoYml0X29mZnNldCArIGJpdF9jb3VudCkgPiAoOCAqICh1MzIpIGJ1ZmZlcl9kZXNjLT5idWZmZXIubGVuZ3RoKSkgeworCQlBQ1BJX0VSUk9SKChBRV9JTkZPLAorCQkJICAgICJGaWVsZCBbJTQuNHNdIGF0ICVkIGV4Y2VlZHMgQnVmZmVyIFslNC40c10gc2l6ZSAlZCAoYml0cykiLAorCQkJICAgIGFjcGlfdXRfZ2V0X25vZGVfbmFtZShyZXN1bHRfZGVzYyksCisJCQkgICAgYml0X29mZnNldCArIGJpdF9jb3VudCwKKwkJCSAgICBhY3BpX3V0X2dldF9ub2RlX25hbWUoYnVmZmVyX2Rlc2MtPmJ1ZmZlci5ub2RlKSwKKwkJCSAgICA4ICogKHUzMikgYnVmZmVyX2Rlc2MtPmJ1ZmZlci5sZW5ndGgpKTsKKwkJc3RhdHVzID0gQUVfQU1MX0JVRkZFUl9MSU1JVDsKKwkJZ290byBjbGVhbnVwOworCX0KKworCS8qCisJICogSW5pdGlhbGl6ZSBhcmVhcyBvZiB0aGUgZmllbGQgb2JqZWN0IHRoYXQgYXJlIGNvbW1vbiB0byBhbGwgZmllbGRzCisJICogRm9yIGZpZWxkX2ZsYWdzLCB1c2UgTE9DS19SVUxFID0gMCAoTk9fTE9DSyksCisJICogVVBEQVRFX1JVTEUgPSAwIChVUERBVEVfUFJFU0VSVkUpCisJICovCisJc3RhdHVzID0gYWNwaV9leF9wcmVwX2NvbW1vbl9maWVsZF9vYmplY3Qob2JqX2Rlc2MsIGZpZWxkX2ZsYWdzLCAwLAorCQkJCQkJICBiaXRfb2Zmc2V0LCBiaXRfY291bnQpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlnb3RvIGNsZWFudXA7CisJfQorCisJb2JqX2Rlc2MtPmJ1ZmZlcl9maWVsZC5idWZmZXJfb2JqID0gYnVmZmVyX2Rlc2M7CisKKwkvKiBSZWZlcmVuY2UgY291bnQgZm9yIGJ1ZmZlcl9kZXNjIGluaGVyaXRzIG9ial9kZXNjIGNvdW50ICovCisKKwlidWZmZXJfZGVzYy0+Y29tbW9uLnJlZmVyZW5jZV9jb3VudCA9ICh1MTYpCisJICAgIChidWZmZXJfZGVzYy0+Y29tbW9uLnJlZmVyZW5jZV9jb3VudCArCisJICAgICBvYmpfZGVzYy0+Y29tbW9uLnJlZmVyZW5jZV9jb3VudCk7CisKKyAgICAgIGNsZWFudXA6CisKKwkvKiBBbHdheXMgZGVsZXRlIHRoZSBvcGVyYW5kcyAqLworCisJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKG9mZnNldF9kZXNjKTsKKwlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UoYnVmZmVyX2Rlc2MpOworCisJaWYgKGFtbF9vcGNvZGUgPT0gQU1MX0NSRUFURV9GSUVMRF9PUCkgeworCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UobGVuZ3RoX2Rlc2MpOworCX0KKworCS8qIE9uIGZhaWx1cmUsIGRlbGV0ZSB0aGUgcmVzdWx0IGRlc2NyaXB0b3IgKi8KKworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UocmVzdWx0X2Rlc2MpOwkvKiBSZXN1bHQgZGVzY3JpcHRvciAqLworCX0gZWxzZSB7CisJCS8qIE5vdyB0aGUgYWRkcmVzcyBhbmQgbGVuZ3RoIGFyZSB2YWxpZCBmb3IgdGhpcyBidWZmZXJfZmllbGQgKi8KKworCQlvYmpfZGVzYy0+YnVmZmVyX2ZpZWxkLmZsYWdzIHw9IEFPUE9CSl9EQVRBX1ZBTElEOworCX0KKworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX2RzX2V2YWxfYnVmZmVyX2ZpZWxkX29wZXJhbmRzCisgKgorICogUEFSQU1FVEVSUzogIHdhbGtfc3RhdGUgICAgICAtIEN1cnJlbnQgd2FsaworICogICAgICAgICAgICAgIE9wICAgICAgICAgICAgICAtIEEgdmFsaWQgYnVmZmVyX2ZpZWxkIE9wIG9iamVjdAorICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogR2V0IGJ1ZmZlcl9maWVsZCBCdWZmZXIgYW5kIEluZGV4CisgKiAgICAgICAgICAgICAgQ2FsbGVkIGZyb20gYWNwaV9kc19leGVjX2VuZF9vcCBkdXJpbmcgYnVmZmVyX2ZpZWxkIHBhcnNlIHRyZWUgd2FsaworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2FjcGlfc3RhdHVzCithY3BpX2RzX2V2YWxfYnVmZmVyX2ZpZWxkX29wZXJhbmRzKHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUsCisJCQkJICAgdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKm9wKQoreworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYzsKKwlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZTsKKwl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqbmV4dF9vcDsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKGRzX2V2YWxfYnVmZmVyX2ZpZWxkX29wZXJhbmRzLCBvcCk7CisKKwkvKgorCSAqIFRoaXMgaXMgd2hlcmUgd2UgZXZhbHVhdGUgdGhlIGFkZHJlc3MgYW5kIGxlbmd0aCBmaWVsZHMgb2YgdGhlCisJICogY3JlYXRlX3h4eF9maWVsZCBkZWNsYXJhdGlvbgorCSAqLworCW5vZGUgPSBvcC0+Y29tbW9uLm5vZGU7CisKKwkvKiBuZXh0X29wIHBvaW50cyB0byB0aGUgb3AgdGhhdCBob2xkcyB0aGUgQnVmZmVyICovCisKKwluZXh0X29wID0gb3AtPmNvbW1vbi52YWx1ZS5hcmc7CisKKwkvKiBFdmFsdWF0ZS9jcmVhdGUgdGhlIGFkZHJlc3MgYW5kIGxlbmd0aCBvcGVyYW5kcyAqLworCisJc3RhdHVzID0gYWNwaV9kc19jcmVhdGVfb3BlcmFuZHMod2Fsa19zdGF0ZSwgbmV4dF9vcCk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworCX0KKworCW9ial9kZXNjID0gYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0KG5vZGUpOworCWlmICghb2JqX2Rlc2MpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PVF9FWElTVCk7CisJfQorCisJLyogUmVzb2x2ZSB0aGUgb3BlcmFuZHMgKi8KKworCXN0YXR1cyA9IGFjcGlfZXhfcmVzb2x2ZV9vcGVyYW5kcyhvcC0+Y29tbW9uLmFtbF9vcGNvZGUsCisJCQkJCSAgQUNQSV9XQUxLX09QRVJBTkRTLCB3YWxrX3N0YXRlKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJQUNQSV9FUlJPUigoQUVfSU5GTywgIiglcykgYmFkIG9wZXJhbmQocykgKCVYKSIsCisJCQkgICAgYWNwaV9wc19nZXRfb3Bjb2RlX25hbWUob3AtPmNvbW1vbi5hbWxfb3Bjb2RlKSwKKwkJCSAgICBzdGF0dXMpKTsKKworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKKwl9CisKKwkvKiBJbml0aWFsaXplIHRoZSBCdWZmZXIgRmllbGQgKi8KKworCWlmIChvcC0+Y29tbW9uLmFtbF9vcGNvZGUgPT0gQU1MX0NSRUFURV9GSUVMRF9PUCkgeworCisJCS8qIE5PVEU6IFNsaWdodGx5IGRpZmZlcmVudCBvcGVyYW5kcyBmb3IgdGhpcyBvcGNvZGUgKi8KKworCQlzdGF0dXMgPQorCQkgICAgYWNwaV9kc19pbml0X2J1ZmZlcl9maWVsZChvcC0+Y29tbW9uLmFtbF9vcGNvZGUsIG9ial9kZXNjLAorCQkJCQkgICAgICB3YWxrX3N0YXRlLT5vcGVyYW5kc1swXSwKKwkJCQkJICAgICAgd2Fsa19zdGF0ZS0+b3BlcmFuZHNbMV0sCisJCQkJCSAgICAgIHdhbGtfc3RhdGUtPm9wZXJhbmRzWzJdLAorCQkJCQkgICAgICB3YWxrX3N0YXRlLT5vcGVyYW5kc1szXSk7CisJfSBlbHNlIHsKKwkJLyogQWxsIG90aGVyLCBjcmVhdGVfeHh4X2ZpZWxkIG9wY29kZXMgKi8KKworCQlzdGF0dXMgPQorCQkgICAgYWNwaV9kc19pbml0X2J1ZmZlcl9maWVsZChvcC0+Y29tbW9uLmFtbF9vcGNvZGUsIG9ial9kZXNjLAorCQkJCQkgICAgICB3YWxrX3N0YXRlLT5vcGVyYW5kc1swXSwKKwkJCQkJICAgICAgd2Fsa19zdGF0ZS0+b3BlcmFuZHNbMV0sIE5VTEwsCisJCQkJCSAgICAgIHdhbGtfc3RhdGUtPm9wZXJhbmRzWzJdKTsKKwl9CisKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9kc19ldmFsX3JlZ2lvbl9vcGVyYW5kcworICoKKyAqIFBBUkFNRVRFUlM6ICB3YWxrX3N0YXRlICAgICAgLSBDdXJyZW50IHdhbGsKKyAqICAgICAgICAgICAgICBPcCAgICAgICAgICAgICAgLSBBIHZhbGlkIHJlZ2lvbiBPcCBvYmplY3QKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IEdldCByZWdpb24gYWRkcmVzcyBhbmQgbGVuZ3RoCisgKiAgICAgICAgICAgICAgQ2FsbGVkIGZyb20gYWNwaV9kc19leGVjX2VuZF9vcCBkdXJpbmcgb3BfcmVnaW9uIHBhcnNlIHRyZWUgd2FsaworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2FjcGlfc3RhdHVzCithY3BpX2RzX2V2YWxfcmVnaW9uX29wZXJhbmRzKHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUsCisJCQkgICAgIHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpvcCkKK3sKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2M7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb3BlcmFuZF9kZXNjOworCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlOworCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpuZXh0X29wOworCisJQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIoZHNfZXZhbF9yZWdpb25fb3BlcmFuZHMsIG9wKTsKKworCS8qCisJICogVGhpcyBpcyB3aGVyZSB3ZSBldmFsdWF0ZSB0aGUgYWRkcmVzcyBhbmQgbGVuZ3RoIGZpZWxkcyBvZiB0aGUKKwkgKiBvcF9yZWdpb24gZGVjbGFyYXRpb24KKwkgKi8KKwlub2RlID0gb3AtPmNvbW1vbi5ub2RlOworCisJLyogbmV4dF9vcCBwb2ludHMgdG8gdGhlIG9wIHRoYXQgaG9sZHMgdGhlIHNwYWNlX2lEICovCisKKwluZXh0X29wID0gb3AtPmNvbW1vbi52YWx1ZS5hcmc7CisKKwkvKiBuZXh0X29wIHBvaW50cyB0byBhZGRyZXNzIG9wICovCisKKwluZXh0X29wID0gbmV4dF9vcC0+Y29tbW9uLm5leHQ7CisKKwkvKiBFdmFsdWF0ZS9jcmVhdGUgdGhlIGFkZHJlc3MgYW5kIGxlbmd0aCBvcGVyYW5kcyAqLworCisJc3RhdHVzID0gYWNwaV9kc19jcmVhdGVfb3BlcmFuZHMod2Fsa19zdGF0ZSwgbmV4dF9vcCk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworCX0KKworCS8qIFJlc29sdmUgdGhlIGxlbmd0aCBhbmQgYWRkcmVzcyBvcGVyYW5kcyB0byBudW1iZXJzICovCisKKwlzdGF0dXMgPSBhY3BpX2V4X3Jlc29sdmVfb3BlcmFuZHMob3AtPmNvbW1vbi5hbWxfb3Bjb2RlLAorCQkJCQkgIEFDUElfV0FMS19PUEVSQU5EUywgd2Fsa19zdGF0ZSk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworCX0KKworCW9ial9kZXNjID0gYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0KG5vZGUpOworCWlmICghb2JqX2Rlc2MpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PVF9FWElTVCk7CisJfQorCisJLyoKKwkgKiBHZXQgdGhlIGxlbmd0aCBvcGVyYW5kIGFuZCBzYXZlIGl0CisJICogKGF0IFRvcCBvZiBzdGFjaykKKwkgKi8KKwlvcGVyYW5kX2Rlc2MgPSB3YWxrX3N0YXRlLT5vcGVyYW5kc1t3YWxrX3N0YXRlLT5udW1fb3BlcmFuZHMgLSAxXTsKKworCW9ial9kZXNjLT5yZWdpb24ubGVuZ3RoID0gKHUzMikgb3BlcmFuZF9kZXNjLT5pbnRlZ2VyLnZhbHVlOworCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZShvcGVyYW5kX2Rlc2MpOworCisJLyoKKwkgKiBHZXQgdGhlIGFkZHJlc3MgYW5kIHNhdmUgaXQKKwkgKiAoYXQgdG9wIG9mIHN0YWNrIC0gMSkKKwkgKi8KKwlvcGVyYW5kX2Rlc2MgPSB3YWxrX3N0YXRlLT5vcGVyYW5kc1t3YWxrX3N0YXRlLT5udW1fb3BlcmFuZHMgLSAyXTsKKworCW9ial9kZXNjLT5yZWdpb24uYWRkcmVzcyA9IChhY3BpX3BoeXNpY2FsX2FkZHJlc3MpCisJICAgIG9wZXJhbmRfZGVzYy0+aW50ZWdlci52YWx1ZTsKKwlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2Uob3BlcmFuZF9kZXNjKTsKKworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVhFQywgIlJnbk9iaiAlcCBBZGRyICU4LjhYJTguOFggTGVuICVYXG4iLAorCQkJICBvYmpfZGVzYywKKwkJCSAgQUNQSV9GT1JNQVRfTkFUSVZFX1VJTlQob2JqX2Rlc2MtPnJlZ2lvbi5hZGRyZXNzKSwKKwkJCSAgb2JqX2Rlc2MtPnJlZ2lvbi5sZW5ndGgpKTsKKworCS8qIE5vdyB0aGUgYWRkcmVzcyBhbmQgbGVuZ3RoIGFyZSB2YWxpZCBmb3IgdGhpcyBvcHJlZ2lvbiAqLworCisJb2JqX2Rlc2MtPnJlZ2lvbi5mbGFncyB8PSBBT1BPQkpfREFUQV9WQUxJRDsKKworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX2RzX2V2YWxfdGFibGVfcmVnaW9uX29wZXJhbmRzCisgKgorICogUEFSQU1FVEVSUzogIHdhbGtfc3RhdGUgICAgICAtIEN1cnJlbnQgd2FsaworICogICAgICAgICAgICAgIE9wICAgICAgICAgICAgICAtIEEgdmFsaWQgcmVnaW9uIE9wIG9iamVjdAorICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogR2V0IHJlZ2lvbiBhZGRyZXNzIGFuZCBsZW5ndGgKKyAqICAgICAgICAgICAgICBDYWxsZWQgZnJvbSBhY3BpX2RzX2V4ZWNfZW5kX29wIGR1cmluZyBkYXRhX3RhYmxlX3JlZ2lvbiBwYXJzZSB0cmVlIHdhbGsKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCithY3BpX3N0YXR1cworYWNwaV9kc19ldmFsX3RhYmxlX3JlZ2lvbl9vcGVyYW5kcyhzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlLAorCQkJCSAgIHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpvcCkKK3sKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2M7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKm9wZXJhbmQ7CisJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGU7CisJdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKm5leHRfb3A7CisJdTMyIHRhYmxlX2luZGV4OworCXN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqdGFibGU7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUihkc19ldmFsX3RhYmxlX3JlZ2lvbl9vcGVyYW5kcywgb3ApOworCisJLyoKKwkgKiBUaGlzIGlzIHdoZXJlIHdlIGV2YWx1YXRlIHRoZSBzaWduYXR1cmVfc3RyaW5nIGFuZCBvZW1faURTdHJpbmcKKwkgKiBhbmQgb2VtX3RhYmxlX2lEU3RyaW5nIG9mIHRoZSBkYXRhX3RhYmxlX3JlZ2lvbiBkZWNsYXJhdGlvbgorCSAqLworCW5vZGUgPSBvcC0+Y29tbW9uLm5vZGU7CisKKwkvKiBuZXh0X29wIHBvaW50cyB0byBzaWduYXR1cmVfc3RyaW5nIG9wICovCisKKwluZXh0X29wID0gb3AtPmNvbW1vbi52YWx1ZS5hcmc7CisKKwkvKgorCSAqIEV2YWx1YXRlL2NyZWF0ZSB0aGUgc2lnbmF0dXJlX3N0cmluZyBhbmQgb2VtX2lEU3RyaW5nCisJICogYW5kIG9lbV90YWJsZV9pRFN0cmluZyBvcGVyYW5kcworCSAqLworCXN0YXR1cyA9IGFjcGlfZHNfY3JlYXRlX29wZXJhbmRzKHdhbGtfc3RhdGUsIG5leHRfb3ApOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKKwl9CisKKwkvKgorCSAqIFJlc29sdmUgdGhlIHNpZ25hdHVyZV9zdHJpbmcgYW5kIG9lbV9pRFN0cmluZworCSAqIGFuZCBvZW1fdGFibGVfaURTdHJpbmcgb3BlcmFuZHMKKwkgKi8KKwlzdGF0dXMgPSBhY3BpX2V4X3Jlc29sdmVfb3BlcmFuZHMob3AtPmNvbW1vbi5hbWxfb3Bjb2RlLAorCQkJCQkgIEFDUElfV0FMS19PUEVSQU5EUywgd2Fsa19zdGF0ZSk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworCX0KKworCW9wZXJhbmQgPSAmd2Fsa19zdGF0ZS0+b3BlcmFuZHNbMF07CisKKwkvKiBGaW5kIHRoZSBBQ1BJIHRhYmxlICovCisKKwlzdGF0dXMgPSBhY3BpX3RiX2ZpbmRfdGFibGUob3BlcmFuZFswXS0+c3RyaW5nLnBvaW50ZXIsCisJCQkJICAgIG9wZXJhbmRbMV0tPnN0cmluZy5wb2ludGVyLAorCQkJCSAgICBvcGVyYW5kWzJdLT5zdHJpbmcucG9pbnRlciwgJnRhYmxlX2luZGV4KTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CisJfQorCisJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKG9wZXJhbmRbMF0pOworCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZShvcGVyYW5kWzFdKTsKKwlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2Uob3BlcmFuZFsyXSk7CisKKwlzdGF0dXMgPSBhY3BpX2dldF90YWJsZV9ieV9pbmRleCh0YWJsZV9pbmRleCwgJnRhYmxlKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CisJfQorCisJb2JqX2Rlc2MgPSBhY3BpX25zX2dldF9hdHRhY2hlZF9vYmplY3Qobm9kZSk7CisJaWYgKCFvYmpfZGVzYykgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9UX0VYSVNUKTsKKwl9CisKKwlvYmpfZGVzYy0+cmVnaW9uLmFkZHJlc3MgPQorCSAgICAoYWNwaV9waHlzaWNhbF9hZGRyZXNzKSBBQ1BJX1RPX0lOVEVHRVIodGFibGUpOworCW9ial9kZXNjLT5yZWdpb24ubGVuZ3RoID0gdGFibGUtPmxlbmd0aDsKKworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVhFQywgIlJnbk9iaiAlcCBBZGRyICU4LjhYJTguOFggTGVuICVYXG4iLAorCQkJICBvYmpfZGVzYywKKwkJCSAgQUNQSV9GT1JNQVRfTkFUSVZFX1VJTlQob2JqX2Rlc2MtPnJlZ2lvbi5hZGRyZXNzKSwKKwkJCSAgb2JqX2Rlc2MtPnJlZ2lvbi5sZW5ndGgpKTsKKworCS8qIE5vdyB0aGUgYWRkcmVzcyBhbmQgbGVuZ3RoIGFyZSB2YWxpZCBmb3IgdGhpcyBvcHJlZ2lvbiAqLworCisJb2JqX2Rlc2MtPnJlZ2lvbi5mbGFncyB8PSBBT1BPQkpfREFUQV9WQUxJRDsKKworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX2RzX2V2YWxfZGF0YV9vYmplY3Rfb3BlcmFuZHMKKyAqCisgKiBQQVJBTUVURVJTOiAgd2Fsa19zdGF0ZSAgICAgIC0gQ3VycmVudCB3YWxrCisgKiAgICAgICAgICAgICAgT3AgICAgICAgICAgICAgIC0gQSB2YWxpZCBkYXRhX29iamVjdCBPcCBvYmplY3QKKyAqICAgICAgICAgICAgICBvYmpfZGVzYyAgICAgICAgLSBkYXRhX29iamVjdAorICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogR2V0IHRoZSBvcGVyYW5kcyBhbmQgY29tcGxldGUgdGhlIGZvbGxvd2luZyBkYXRhIG9iamVjdCB0eXBlczoKKyAqICAgICAgICAgICAgICBCdWZmZXIsIFBhY2thZ2UuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworYWNwaV9zdGF0dXMKK2FjcGlfZHNfZXZhbF9kYXRhX29iamVjdF9vcGVyYW5kcyhzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlLAorCQkJCSAgdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKm9wLAorCQkJCSAgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2MpCit7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKmFyZ19kZXNjOworCXUzMiBsZW5ndGg7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGRzX2V2YWxfZGF0YV9vYmplY3Rfb3BlcmFuZHMpOworCisJLyogVGhlIGZpcnN0IG9wZXJhbmQgKGZvciBhbGwgb2YgdGhlc2UgZGF0YSBvYmplY3RzKSBpcyB0aGUgbGVuZ3RoICovCisKKwkvKgorCSAqIFNldCBwcm9wZXIgaW5kZXggaW50byBvcGVyYW5kIHN0YWNrIGZvciBhY3BpX2RzX29ial9zdGFja19wdXNoCisJICogaW52b2tlZCBpbnNpZGUgYWNwaV9kc19jcmVhdGVfb3BlcmFuZC4KKwkgKi8KKwl3YWxrX3N0YXRlLT5vcGVyYW5kX2luZGV4ID0gd2Fsa19zdGF0ZS0+bnVtX29wZXJhbmRzOworCisJc3RhdHVzID0gYWNwaV9kc19jcmVhdGVfb3BlcmFuZCh3YWxrX3N0YXRlLCBvcC0+Y29tbW9uLnZhbHVlLmFyZywgMSk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworCX0KKworCXN0YXR1cyA9IGFjcGlfZXhfcmVzb2x2ZV9vcGVyYW5kcyh3YWxrX3N0YXRlLT5vcGNvZGUsCisJCQkJCSAgJih3YWxrX3N0YXRlLT4KKwkJCQkJICAgIG9wZXJhbmRzW3dhbGtfc3RhdGUtPm51bV9vcGVyYW5kcyAtCisJCQkJCQkgICAgIDFdKSwgd2Fsa19zdGF0ZSk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworCX0KKworCS8qIEV4dHJhY3QgbGVuZ3RoIG9wZXJhbmQgKi8KKworCWFyZ19kZXNjID0gd2Fsa19zdGF0ZS0+b3BlcmFuZHNbd2Fsa19zdGF0ZS0+bnVtX29wZXJhbmRzIC0gMV07CisJbGVuZ3RoID0gKHUzMikgYXJnX2Rlc2MtPmludGVnZXIudmFsdWU7CisKKwkvKiBDbGVhbnVwIGZvciBsZW5ndGggb3BlcmFuZCAqLworCisJc3RhdHVzID0gYWNwaV9kc19vYmpfc3RhY2tfcG9wKDEsIHdhbGtfc3RhdGUpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKKwl9CisKKwlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UoYXJnX2Rlc2MpOworCisJLyoKKwkgKiBDcmVhdGUgdGhlIGFjdHVhbCBkYXRhIG9iamVjdAorCSAqLworCXN3aXRjaCAob3AtPmNvbW1vbi5hbWxfb3Bjb2RlKSB7CisJY2FzZSBBTUxfQlVGRkVSX09QOgorCisJCXN0YXR1cyA9CisJCSAgICBhY3BpX2RzX2J1aWxkX2ludGVybmFsX2J1ZmZlcl9vYmood2Fsa19zdGF0ZSwgb3AsIGxlbmd0aCwKKwkJCQkJCSAgICAgICZvYmpfZGVzYyk7CisJCWJyZWFrOworCisJY2FzZSBBTUxfUEFDS0FHRV9PUDoKKwljYXNlIEFNTF9WQVJfUEFDS0FHRV9PUDoKKworCQlzdGF0dXMgPQorCQkgICAgYWNwaV9kc19idWlsZF9pbnRlcm5hbF9wYWNrYWdlX29iaih3YWxrX3N0YXRlLCBvcCwgbGVuZ3RoLAorCQkJCQkJICAgICAgICZvYmpfZGVzYyk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9CQURfT1BDT0RFKTsKKwl9CisKKwlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpIHsKKwkJLyoKKwkJICogUmV0dXJuIHRoZSBvYmplY3QgaW4gdGhlIHdhbGtfc3RhdGUsIHVubGVzcyB0aGUgcGFyZW50IGlzIGEgcGFja2FnZSAtCisJCSAqIGluIHRoaXMgY2FzZSwgdGhlIHJldHVybiBvYmplY3Qgd2lsbCBiZSBzdG9yZWQgaW4gdGhlIHBhcnNlIHRyZWUKKwkJICogZm9yIHRoZSBwYWNrYWdlLgorCQkgKi8KKwkJaWYgKCghb3AtPmNvbW1vbi5wYXJlbnQpIHx8CisJCSAgICAoKG9wLT5jb21tb24ucGFyZW50LT5jb21tb24uYW1sX29wY29kZSAhPSBBTUxfUEFDS0FHRV9PUCkgJiYKKwkJICAgICAob3AtPmNvbW1vbi5wYXJlbnQtPmNvbW1vbi5hbWxfb3Bjb2RlICE9CisJCSAgICAgIEFNTF9WQVJfUEFDS0FHRV9PUCkKKwkJICAgICAmJiAob3AtPmNvbW1vbi5wYXJlbnQtPmNvbW1vbi5hbWxfb3Bjb2RlICE9IEFNTF9OQU1FX09QKSkpIHsKKwkJCXdhbGtfc3RhdGUtPnJlc3VsdF9vYmogPSBvYmpfZGVzYzsKKwkJfQorCX0KKworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX2RzX2V2YWxfYmFua19maWVsZF9vcGVyYW5kcworICoKKyAqIFBBUkFNRVRFUlM6ICB3YWxrX3N0YXRlICAgICAgLSBDdXJyZW50IHdhbGsKKyAqICAgICAgICAgICAgICBPcCAgICAgICAgICAgICAgLSBBIHZhbGlkIGJhbmtfZmllbGQgT3Agb2JqZWN0CisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBHZXQgYmFua19maWVsZCBiYW5rX3ZhbHVlCisgKiAgICAgICAgICAgICAgQ2FsbGVkIGZyb20gYWNwaV9kc19leGVjX2VuZF9vcCBkdXJpbmcgYmFua19maWVsZCBwYXJzZSB0cmVlIHdhbGsKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCithY3BpX3N0YXR1cworYWNwaV9kc19ldmFsX2JhbmtfZmllbGRfb3BlcmFuZHMoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSwKKwkJCQkgdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKm9wKQoreworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYzsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvcGVyYW5kX2Rlc2M7CisJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGU7CisJdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKm5leHRfb3A7CisJdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKmFyZzsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKGRzX2V2YWxfYmFua19maWVsZF9vcGVyYW5kcywgb3ApOworCisJLyoKKwkgKiBUaGlzIGlzIHdoZXJlIHdlIGV2YWx1YXRlIHRoZSBiYW5rX3ZhbHVlIGZpZWxkIG9mIHRoZQorCSAqIGJhbmtfZmllbGQgZGVjbGFyYXRpb24KKwkgKi8KKworCS8qIG5leHRfb3AgcG9pbnRzIHRvIHRoZSBvcCB0aGF0IGhvbGRzIHRoZSBSZWdpb24gKi8KKworCW5leHRfb3AgPSBvcC0+Y29tbW9uLnZhbHVlLmFyZzsKKworCS8qIG5leHRfb3AgcG9pbnRzIHRvIHRoZSBvcCB0aGF0IGhvbGRzIHRoZSBCYW5rIFJlZ2lzdGVyICovCisKKwluZXh0X29wID0gbmV4dF9vcC0+Y29tbW9uLm5leHQ7CisKKwkvKiBuZXh0X29wIHBvaW50cyB0byB0aGUgb3AgdGhhdCBob2xkcyB0aGUgQmFuayBWYWx1ZSAqLworCisJbmV4dF9vcCA9IG5leHRfb3AtPmNvbW1vbi5uZXh0OworCisJLyoKKwkgKiBTZXQgcHJvcGVyIGluZGV4IGludG8gb3BlcmFuZCBzdGFjayBmb3IgYWNwaV9kc19vYmpfc3RhY2tfcHVzaAorCSAqIGludm9rZWQgaW5zaWRlIGFjcGlfZHNfY3JlYXRlX29wZXJhbmQuCisJICoKKwkgKiBXZSB1c2Ugd2Fsa19zdGF0ZS0+T3BlcmFuZHNbMF0gdG8gc3RvcmUgdGhlIGV2YWx1YXRlZCBiYW5rX3ZhbHVlCisJICovCisJd2Fsa19zdGF0ZS0+b3BlcmFuZF9pbmRleCA9IDA7CisKKwlzdGF0dXMgPSBhY3BpX2RzX2NyZWF0ZV9vcGVyYW5kKHdhbGtfc3RhdGUsIG5leHRfb3AsIDApOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKKwl9CisKKwlzdGF0dXMgPSBhY3BpX2V4X3Jlc29sdmVfdG9fdmFsdWUoJndhbGtfc3RhdGUtPm9wZXJhbmRzWzBdLCB3YWxrX3N0YXRlKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CisJfQorCisJQUNQSV9EVU1QX09QRVJBTkRTKEFDUElfV0FMS19PUEVSQU5EUywKKwkJCSAgIGFjcGlfcHNfZ2V0X29wY29kZV9uYW1lKG9wLT5jb21tb24uYW1sX29wY29kZSksIDEpOworCS8qCisJICogR2V0IHRoZSBiYW5rX3ZhbHVlIG9wZXJhbmQgYW5kIHNhdmUgaXQKKwkgKiAoYXQgVG9wIG9mIHN0YWNrKQorCSAqLworCW9wZXJhbmRfZGVzYyA9IHdhbGtfc3RhdGUtPm9wZXJhbmRzWzBdOworCisJLyogQXJnIHBvaW50cyB0byB0aGUgc3RhcnQgQmFuayBGaWVsZCAqLworCisJYXJnID0gYWNwaV9wc19nZXRfYXJnKG9wLCA0KTsKKwl3aGlsZSAoYXJnKSB7CisKKwkJLyogSWdub3JlIE9GRlNFVCBhbmQgQUNDRVNTQVMgdGVybXMgaGVyZSAqLworCisJCWlmIChhcmctPmNvbW1vbi5hbWxfb3Bjb2RlID09IEFNTF9JTlRfTkFNRURGSUVMRF9PUCkgeworCQkJbm9kZSA9IGFyZy0+Y29tbW9uLm5vZGU7CisKKwkJCW9ial9kZXNjID0gYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0KG5vZGUpOworCQkJaWYgKCFvYmpfZGVzYykgeworCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT1RfRVhJU1QpOworCQkJfQorCisJCQlvYmpfZGVzYy0+YmFua19maWVsZC52YWx1ZSA9CisJCQkgICAgKHUzMikgb3BlcmFuZF9kZXNjLT5pbnRlZ2VyLnZhbHVlOworCQl9CisKKwkJLyogTW92ZSB0byBuZXh0IGZpZWxkIGluIHRoZSBsaXN0ICovCisKKwkJYXJnID0gYXJnLT5jb21tb24ubmV4dDsKKwl9CisKKwlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2Uob3BlcmFuZF9kZXNjKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9kc19leGVjX2JlZ2luX2NvbnRyb2xfb3AKKyAqCisgKiBQQVJBTUVURVJTOiAgd2Fsa19saXN0ICAgICAgIC0gVGhlIGxpc3QgdGhhdCBvd25zIHRoZSB3YWxrIHN0YWNrCisgKiAgICAgICAgICAgICAgT3AgICAgICAgICAgICAgIC0gVGhlIGNvbnRyb2wgT3AKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IEhhbmRsZXMgYWxsIGNvbnRyb2wgb3BzIGVuY291bnRlcmVkIGR1cmluZyBjb250cm9sIG1ldGhvZAorICogICAgICAgICAgICAgIGV4ZWN1dGlvbi4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCithY3BpX3N0YXR1cworYWNwaV9kc19leGVjX2JlZ2luX2NvbnRyb2xfb3Aoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSwKKwkJCSAgICAgIHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpvcCkKK3sKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKKwl1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgKmNvbnRyb2xfc3RhdGU7CisKKwlBQ1BJX0ZVTkNUSU9OX05BTUUoZHNfZXhlY19iZWdpbl9jb250cm9sX29wKTsKKworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRElTUEFUQ0gsICJPcD0lcCBPcGNvZGU9JTIuMlggU3RhdGU9JXBcbiIsIG9wLAorCQkJICBvcC0+Y29tbW9uLmFtbF9vcGNvZGUsIHdhbGtfc3RhdGUpKTsKKworCXN3aXRjaCAob3AtPmNvbW1vbi5hbWxfb3Bjb2RlKSB7CisJY2FzZSBBTUxfV0hJTEVfT1A6CisKKwkJLyoKKwkJICogSWYgdGhpcyBpcyBhbiBhZGRpdGlvbmFsIGl0ZXJhdGlvbiBvZiBhIHdoaWxlIGxvb3AsIGNvbnRpbnVlLgorCQkgKiBUaGVyZSBpcyBubyBuZWVkIHRvIGFsbG9jYXRlIGEgbmV3IGNvbnRyb2wgc3RhdGUuCisJCSAqLworCQlpZiAod2Fsa19zdGF0ZS0+Y29udHJvbF9zdGF0ZSkgeworCQkJaWYgKHdhbGtfc3RhdGUtPmNvbnRyb2xfc3RhdGUtPmNvbnRyb2wuYW1sX3ByZWRpY2F0ZV9zdGFydAorCQkJCT09ICh3YWxrX3N0YXRlLT5wYXJzZXJfc3RhdGUuYW1sIC0gMSkpIHsKKworCQkJCS8qIFJlc2V0IHRoZSBzdGF0ZSB0byBzdGFydC1vZi1sb29wICovCisKKwkJCQl3YWxrX3N0YXRlLT5jb250cm9sX3N0YXRlLT5jb21tb24uc3RhdGUgPQorCQkJCSAgICBBQ1BJX0NPTlRST0xfQ09ORElUSU9OQUxfRVhFQ1VUSU5HOworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJLypsaW50IC1mYWxsdGhyb3VnaCAqLworCisJY2FzZSBBTUxfSUZfT1A6CisKKwkJLyoKKwkJICogSUYvV0hJTEU6IENyZWF0ZSBhIG5ldyBjb250cm9sIHN0YXRlIHRvIG1hbmFnZSB0aGVzZQorCQkgKiBjb25zdHJ1Y3RzLiBXZSBuZWVkIHRvIG1hbmFnZSB0aGVzZSBhcyBhIHN0YWNrLCBpbiBvcmRlcgorCQkgKiB0byBoYW5kbGUgbmVzdGluZy4KKwkJICovCisJCWNvbnRyb2xfc3RhdGUgPSBhY3BpX3V0X2NyZWF0ZV9jb250cm9sX3N0YXRlKCk7CisJCWlmICghY29udHJvbF9zdGF0ZSkgeworCQkJc3RhdHVzID0gQUVfTk9fTUVNT1JZOworCQkJYnJlYWs7CisJCX0KKwkJLyoKKwkJICogU2F2ZSBhIHBvaW50ZXIgdG8gdGhlIHByZWRpY2F0ZSBmb3IgbXVsdGlwbGUgZXhlY3V0aW9ucworCQkgKiBvZiBhIGxvb3AKKwkJICovCisJCWNvbnRyb2xfc3RhdGUtPmNvbnRyb2wuYW1sX3ByZWRpY2F0ZV9zdGFydCA9CisJCSAgICB3YWxrX3N0YXRlLT5wYXJzZXJfc3RhdGUuYW1sIC0gMTsKKwkJY29udHJvbF9zdGF0ZS0+Y29udHJvbC5wYWNrYWdlX2VuZCA9CisJCSAgICB3YWxrX3N0YXRlLT5wYXJzZXJfc3RhdGUucGtnX2VuZDsKKwkJY29udHJvbF9zdGF0ZS0+Y29udHJvbC5vcGNvZGUgPSBvcC0+Y29tbW9uLmFtbF9vcGNvZGU7CisKKwkJLyogUHVzaCB0aGUgY29udHJvbCBzdGF0ZSBvbiB0aGlzIHdhbGsncyBjb250cm9sIHN0YWNrICovCisKKwkJYWNwaV91dF9wdXNoX2dlbmVyaWNfc3RhdGUoJndhbGtfc3RhdGUtPmNvbnRyb2xfc3RhdGUsCisJCQkJCSAgIGNvbnRyb2xfc3RhdGUpOworCQlicmVhazsKKworCWNhc2UgQU1MX0VMU0VfT1A6CisKKwkJLyogUHJlZGljYXRlIGlzIGluIHRoZSBzdGF0ZSBvYmplY3QgKi8KKwkJLyogSWYgcHJlZGljYXRlIGlzIHRydWUsIHRoZSBJRiB3YXMgZXhlY3V0ZWQsIGlnbm9yZSBFTFNFIHBhcnQgKi8KKworCQlpZiAod2Fsa19zdGF0ZS0+bGFzdF9wcmVkaWNhdGUpIHsKKwkJCXN0YXR1cyA9IEFFX0NUUkxfVFJVRTsKKwkJfQorCisJCWJyZWFrOworCisJY2FzZSBBTUxfUkVUVVJOX09QOgorCisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIChzdGF0dXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX2RzX2V4ZWNfZW5kX2NvbnRyb2xfb3AKKyAqCisgKiBQQVJBTUVURVJTOiAgd2Fsa19saXN0ICAgICAgIC0gVGhlIGxpc3QgdGhhdCBvd25zIHRoZSB3YWxrIHN0YWNrCisgKiAgICAgICAgICAgICAgT3AgICAgICAgICAgICAgIC0gVGhlIGNvbnRyb2wgT3AKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IEhhbmRsZXMgYWxsIGNvbnRyb2wgb3BzIGVuY291bnRlcmVkIGR1cmluZyBjb250cm9sIG1ldGhvZAorICogICAgICAgICAgICAgIGV4ZWN1dGlvbi4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCithY3BpX3N0YXR1cworYWNwaV9kc19leGVjX2VuZF9jb250cm9sX29wKHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKiB3YWxrX3N0YXRlLAorCQkJICAgIHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICogb3ApCit7CisJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CisJdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICpjb250cm9sX3N0YXRlOworCisJQUNQSV9GVU5DVElPTl9OQU1FKGRzX2V4ZWNfZW5kX2NvbnRyb2xfb3ApOworCisJc3dpdGNoIChvcC0+Y29tbW9uLmFtbF9vcGNvZGUpIHsKKwljYXNlIEFNTF9JRl9PUDoKKworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0RJU1BBVENILCAiW0lGX09QXSBPcD0lcFxuIiwgb3ApKTsKKworCQkvKgorCQkgKiBTYXZlIHRoZSByZXN1bHQgb2YgdGhlIHByZWRpY2F0ZSBpbiBjYXNlIHRoZXJlIGlzIGFuCisJCSAqIEVMU0UgdG8gY29tZQorCQkgKi8KKwkJd2Fsa19zdGF0ZS0+bGFzdF9wcmVkaWNhdGUgPQorCQkgICAgKHU4KSB3YWxrX3N0YXRlLT5jb250cm9sX3N0YXRlLT5jb21tb24udmFsdWU7CisKKwkJLyoKKwkJICogUG9wIHRoZSBjb250cm9sIHN0YXRlIHRoYXQgd2FzIGNyZWF0ZWQgYXQgdGhlIHN0YXJ0CisJCSAqIG9mIHRoZSBJRiBhbmQgZnJlZSBpdAorCQkgKi8KKwkJY29udHJvbF9zdGF0ZSA9CisJCSAgICBhY3BpX3V0X3BvcF9nZW5lcmljX3N0YXRlKCZ3YWxrX3N0YXRlLT5jb250cm9sX3N0YXRlKTsKKwkJYWNwaV91dF9kZWxldGVfZ2VuZXJpY19zdGF0ZShjb250cm9sX3N0YXRlKTsKKwkJYnJlYWs7CisKKwljYXNlIEFNTF9FTFNFX09QOgorCisJCWJyZWFrOworCisJY2FzZSBBTUxfV0hJTEVfT1A6CisKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9ESVNQQVRDSCwgIltXSElMRV9PUF0gT3A9JXBcbiIsIG9wKSk7CisKKwkJY29udHJvbF9zdGF0ZSA9IHdhbGtfc3RhdGUtPmNvbnRyb2xfc3RhdGU7CisJCWlmIChjb250cm9sX3N0YXRlLT5jb21tb24udmFsdWUpIHsKKworCQkJLyogUHJlZGljYXRlIHdhcyB0cnVlLCB0aGUgYm9keSBvZiB0aGUgbG9vcCB3YXMganVzdCBleGVjdXRlZCAqLworCisJCQkvKgorCQkJICogVGhpcyBsb29wIGNvdW50ZXIgbWVjaGFuaXNtIGFsbG93cyB0aGUgaW50ZXJwcmV0ZXIgdG8gZXNjYXBlCisJCQkgKiBwb3NzaWJseSBpbmZpbml0ZSBsb29wcy4gVGhpcyBjYW4gb2NjdXIgaW4gcG9vcmx5IHdyaXR0ZW4gQU1MCisJCQkgKiB3aGVuIHRoZSBoYXJkd2FyZSBkb2VzIG5vdCByZXNwb25kIHdpdGhpbiBhIHdoaWxlIGxvb3AgYW5kIHRoZQorCQkJICogbG9vcCBkb2VzIG5vdCBpbXBsZW1lbnQgYSB0aW1lb3V0LgorCQkJICovCisJCQljb250cm9sX3N0YXRlLT5jb250cm9sLmxvb3BfY291bnQrKzsKKwkJCWlmIChjb250cm9sX3N0YXRlLT5jb250cm9sLmxvb3BfY291bnQgPgorCQkJCUFDUElfTUFYX0xPT1BfSVRFUkFUSU9OUykgeworCQkJCXN0YXR1cyA9IEFFX0FNTF9JTkZJTklURV9MT09QOworCQkJCWJyZWFrOworCQkJfQorCisJCQkvKgorCQkJICogR28gYmFjayBhbmQgZXZhbHVhdGUgdGhlIHByZWRpY2F0ZSBhbmQgbWF5YmUgZXhlY3V0ZSB0aGUgbG9vcAorCQkJICogYW5vdGhlciB0aW1lCisJCQkgKi8KKwkJCXN0YXR1cyA9IEFFX0NUUkxfUEVORElORzsKKwkJCXdhbGtfc3RhdGUtPmFtbF9sYXN0X3doaWxlID0KKwkJCSAgICBjb250cm9sX3N0YXRlLT5jb250cm9sLmFtbF9wcmVkaWNhdGVfc3RhcnQ7CisJCQlicmVhazsKKwkJfQorCisJCS8qIFByZWRpY2F0ZSB3YXMgZmFsc2UsIHRlcm1pbmF0ZSB0aGlzIHdoaWxlIGxvb3AgKi8KKworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0RJU1BBVENILAorCQkJCSAgIltXSElMRV9PUF0gdGVybWluYXRpb24hIE9wPSVwXG4iLCBvcCkpOworCisJCS8qIFBvcCB0aGlzIGNvbnRyb2wgc3RhdGUgYW5kIGZyZWUgaXQgKi8KKworCQljb250cm9sX3N0YXRlID0KKwkJICAgIGFjcGlfdXRfcG9wX2dlbmVyaWNfc3RhdGUoJndhbGtfc3RhdGUtPmNvbnRyb2xfc3RhdGUpOworCQlhY3BpX3V0X2RlbGV0ZV9nZW5lcmljX3N0YXRlKGNvbnRyb2xfc3RhdGUpOworCQlicmVhazsKKworCWNhc2UgQU1MX1JFVFVSTl9PUDoKKworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0RJU1BBVENILAorCQkJCSAgIltSRVRVUk5fT1BdIE9wPSVwIEFyZz0lcFxuIiwgb3AsCisJCQkJICBvcC0+Y29tbW9uLnZhbHVlLmFyZykpOworCisJCS8qCisJCSAqIE9uZSBvcHRpb25hbCBvcGVyYW5kIC0tIHRoZSByZXR1cm4gdmFsdWUKKwkJICogSXQgY2FuIGJlIGVpdGhlciBhbiBpbW1lZGlhdGUgb3BlcmFuZCBvciBhIHJlc3VsdCB0aGF0CisJCSAqIGhhcyBiZWVuIGJ1YmJsZWQgdXAgdGhlIHRyZWUKKwkJICovCisJCWlmIChvcC0+Y29tbW9uLnZhbHVlLmFyZykgeworCisJCQkvKiBTaW5jZSB3ZSBoYXZlIGEgcmVhbCBSZXR1cm4oKSwgZGVsZXRlIGFueSBpbXBsaWNpdCByZXR1cm4gKi8KKworCQkJYWNwaV9kc19jbGVhcl9pbXBsaWNpdF9yZXR1cm4od2Fsa19zdGF0ZSk7CisKKwkJCS8qIFJldHVybiBzdGF0ZW1lbnQgaGFzIGFuIGltbWVkaWF0ZSBvcGVyYW5kICovCisKKwkJCXN0YXR1cyA9CisJCQkgICAgYWNwaV9kc19jcmVhdGVfb3BlcmFuZHMod2Fsa19zdGF0ZSwKKwkJCQkJCSAgICBvcC0+Y29tbW9uLnZhbHVlLmFyZyk7CisJCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCQlyZXR1cm4gKHN0YXR1cyk7CisJCQl9CisKKwkJCS8qCisJCQkgKiBJZiB2YWx1ZSBiZWluZyByZXR1cm5lZCBpcyBhIFJlZmVyZW5jZSAoc3VjaCBhcworCQkJICogYW4gYXJnIG9yIGxvY2FsKSwgcmVzb2x2ZSBpdCBub3cgYmVjYXVzZSBpdCBtYXkKKwkJCSAqIGNlYXNlIHRvIGV4aXN0IGF0IHRoZSBlbmQgb2YgdGhlIG1ldGhvZC4KKwkJCSAqLworCQkJc3RhdHVzID0KKwkJCSAgICBhY3BpX2V4X3Jlc29sdmVfdG9fdmFsdWUoJndhbGtfc3RhdGUtPm9wZXJhbmRzWzBdLAorCQkJCQkJICAgICB3YWxrX3N0YXRlKTsKKwkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJCXJldHVybiAoc3RhdHVzKTsKKwkJCX0KKworCQkJLyoKKwkJCSAqIEdldCB0aGUgcmV0dXJuIHZhbHVlIGFuZCBzYXZlIGFzIHRoZSBsYXN0IHJlc3VsdAorCQkJICogdmFsdWUuICBUaGlzIGlzIHRoZSBvbmx5IHBsYWNlIHdoZXJlIHdhbGtfc3RhdGUtPnJldHVybl9kZXNjCisJCQkgKiBpcyBzZXQgdG8gYW55dGhpbmcgb3RoZXIgdGhhbiB6ZXJvIQorCQkJICovCisJCQl3YWxrX3N0YXRlLT5yZXR1cm5fZGVzYyA9IHdhbGtfc3RhdGUtPm9wZXJhbmRzWzBdOworCQl9IGVsc2UgaWYgKHdhbGtfc3RhdGUtPnJlc3VsdF9jb3VudCkgeworCisJCQkvKiBTaW5jZSB3ZSBoYXZlIGEgcmVhbCBSZXR1cm4oKSwgZGVsZXRlIGFueSBpbXBsaWNpdCByZXR1cm4gKi8KKworCQkJYWNwaV9kc19jbGVhcl9pbXBsaWNpdF9yZXR1cm4od2Fsa19zdGF0ZSk7CisKKwkJCS8qCisJCQkgKiBUaGUgcmV0dXJuIHZhbHVlIGhhcyBjb21lIGZyb20gYSBwcmV2aW91cyBjYWxjdWxhdGlvbi4KKwkJCSAqCisJCQkgKiBJZiB2YWx1ZSBiZWluZyByZXR1cm5lZCBpcyBhIFJlZmVyZW5jZSAoc3VjaCBhcworCQkJICogYW4gYXJnIG9yIGxvY2FsKSwgcmVzb2x2ZSBpdCBub3cgYmVjYXVzZSBpdCBtYXkKKwkJCSAqIGNlYXNlIHRvIGV4aXN0IGF0IHRoZSBlbmQgb2YgdGhlIG1ldGhvZC4KKwkJCSAqCisJCQkgKiBBbGxvdyByZWZlcmVuY2VzIGNyZWF0ZWQgYnkgdGhlIEluZGV4IG9wZXJhdG9yIHRvIHJldHVybiB1bmNoYW5nZWQuCisJCQkgKi8KKwkJCWlmICgoQUNQSV9HRVRfREVTQ1JJUFRPUl9UWVBFCisJCQkgICAgICh3YWxrX3N0YXRlLT5yZXN1bHRzLT5yZXN1bHRzLm9ial9kZXNjWzBdKSA9PQorCQkJICAgICBBQ1BJX0RFU0NfVFlQRV9PUEVSQU5EKQorCQkJICAgICYmCisJCQkgICAgKEFDUElfR0VUX09CSkVDVF9UWVBFCisJCQkgICAgICh3YWxrX3N0YXRlLT5yZXN1bHRzLT5yZXN1bHRzLm9ial9kZXNjWzBdKSA9PQorCQkJICAgICBBQ1BJX1RZUEVfTE9DQUxfUkVGRVJFTkNFKQorCQkJICAgICYmICgod2Fsa19zdGF0ZS0+cmVzdWx0cy0+cmVzdWx0cy5vYmpfZGVzY1swXSktPgorCQkJCXJlZmVyZW5jZS5jbGFzcyAhPSBBQ1BJX1JFRkNMQVNTX0lOREVYKSkgeworCQkJCXN0YXR1cyA9CisJCQkJICAgIGFjcGlfZXhfcmVzb2x2ZV90b192YWx1ZSgmd2Fsa19zdGF0ZS0+CisJCQkJCQkJICAgICByZXN1bHRzLT5yZXN1bHRzLgorCQkJCQkJCSAgICAgb2JqX2Rlc2NbMF0sCisJCQkJCQkJICAgICB3YWxrX3N0YXRlKTsKKwkJCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCQkJcmV0dXJuIChzdGF0dXMpOworCQkJCX0KKwkJCX0KKworCQkJd2Fsa19zdGF0ZS0+cmV0dXJuX2Rlc2MgPQorCQkJICAgIHdhbGtfc3RhdGUtPnJlc3VsdHMtPnJlc3VsdHMub2JqX2Rlc2NbMF07CisJCX0gZWxzZSB7CisJCQkvKiBObyByZXR1cm4gb3BlcmFuZCAqLworCisJCQlpZiAod2Fsa19zdGF0ZS0+bnVtX29wZXJhbmRzKSB7CisJCQkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKHdhbGtfc3RhdGUtPgorCQkJCQkJCSBvcGVyYW5kc1swXSk7CisJCQl9CisKKwkJCXdhbGtfc3RhdGUtPm9wZXJhbmRzWzBdID0gTlVMTDsKKwkJCXdhbGtfc3RhdGUtPm51bV9vcGVyYW5kcyA9IDA7CisJCQl3YWxrX3N0YXRlLT5yZXR1cm5fZGVzYyA9IE5VTEw7CisJCX0KKworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0RJU1BBVENILAorCQkJCSAgIkNvbXBsZXRlZCBSRVRVUk5fT1AgU3RhdGU9JXAsIFJldFZhbD0lcFxuIiwKKwkJCQkgIHdhbGtfc3RhdGUsIHdhbGtfc3RhdGUtPnJldHVybl9kZXNjKSk7CisKKwkJLyogRW5kIHRoZSBjb250cm9sIG1ldGhvZCBleGVjdXRpb24gcmlnaHQgbm93ICovCisKKwkJc3RhdHVzID0gQUVfQ1RSTF9URVJNSU5BVEU7CisJCWJyZWFrOworCisJY2FzZSBBTUxfTk9PUF9PUDoKKworCQkvKiBKdXN0IGRvIG5vdGhpbmchICovCisJCWJyZWFrOworCisJY2FzZSBBTUxfQlJFQUtfUE9JTlRfT1A6CisKKwkJLyogQ2FsbCB1cCB0byB0aGUgT1Mgc2VydmljZSBsYXllciB0byBoYW5kbGUgdGhpcyAqLworCisJCXN0YXR1cyA9CisJCSAgICBhY3BpX29zX3NpZ25hbChBQ1BJX1NJR05BTF9CUkVBS1BPSU5ULAorCQkJCSAgICJFeGVjdXRlZCBBTUwgQnJlYWtwb2ludCBvcGNvZGUiKTsKKworCQkvKiBJZiBhbmQgd2hlbiBpdCByZXR1cm5zLCBhbGwgZG9uZS4gKi8KKworCQlicmVhazsKKworCWNhc2UgQU1MX0JSRUFLX09QOgorCWNhc2UgQU1MX0NPTlRJTlVFX09QOgkvKiBBQ1BJIDIuMCAqLworCisJCS8qIFBvcCBhbmQgZGVsZXRlIGNvbnRyb2wgc3RhdGVzIHVudGlsIHdlIGZpbmQgYSB3aGlsZSAqLworCisJCXdoaWxlICh3YWxrX3N0YXRlLT5jb250cm9sX3N0YXRlICYmCisJCSAgICAgICAod2Fsa19zdGF0ZS0+Y29udHJvbF9zdGF0ZS0+Y29udHJvbC5vcGNvZGUgIT0KKwkJCUFNTF9XSElMRV9PUCkpIHsKKwkJCWNvbnRyb2xfc3RhdGUgPQorCQkJICAgIGFjcGlfdXRfcG9wX2dlbmVyaWNfc3RhdGUoJndhbGtfc3RhdGUtPgorCQkJCQkJICAgICAgY29udHJvbF9zdGF0ZSk7CisJCQlhY3BpX3V0X2RlbGV0ZV9nZW5lcmljX3N0YXRlKGNvbnRyb2xfc3RhdGUpOworCQl9CisKKwkJLyogTm8gd2hpbGUgZm91bmQ/ICovCisKKwkJaWYgKCF3YWxrX3N0YXRlLT5jb250cm9sX3N0YXRlKSB7CisJCQlyZXR1cm4gKEFFX0FNTF9OT19XSElMRSk7CisJCX0KKworCQkvKiBXYXM6IHdhbGtfc3RhdGUtPmFtbF9sYXN0X3doaWxlID0gd2Fsa19zdGF0ZS0+Y29udHJvbF9zdGF0ZS0+Q29udHJvbC5hbWxfcHJlZGljYXRlX3N0YXJ0OyAqLworCisJCXdhbGtfc3RhdGUtPmFtbF9sYXN0X3doaWxlID0KKwkJICAgIHdhbGtfc3RhdGUtPmNvbnRyb2xfc3RhdGUtPmNvbnRyb2wucGFja2FnZV9lbmQ7CisKKwkJLyogUmV0dXJuIHN0YXR1cyBkZXBlbmRpbmcgb24gb3Bjb2RlICovCisKKwkJaWYgKG9wLT5jb21tb24uYW1sX29wY29kZSA9PSBBTUxfQlJFQUtfT1ApIHsKKwkJCXN0YXR1cyA9IEFFX0NUUkxfQlJFQUs7CisJCX0gZWxzZSB7CisJCQlzdGF0dXMgPSBBRV9DVFJMX0NPTlRJTlVFOworCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKworCQlBQ1BJX0VSUk9SKChBRV9JTkZPLCAiVW5rbm93biBjb250cm9sIG9wY29kZT0lWCBPcD0lcCIsCisJCQkgICAgb3AtPmNvbW1vbi5hbWxfb3Bjb2RlLCBvcCkpOworCisJCXN0YXR1cyA9IEFFX0FNTF9CQURfT1BDT0RFOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gKHN0YXR1cyk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2RzdXRpbHMuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvZHN1dGlscy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhYmMyM2EKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2RzdXRpbHMuYwpAQCAtMCwwICsxLDg2OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBNb2R1bGUgTmFtZTogZHN1dGlscyAtIERpc3BhdGNoZXIgdXRpbGl0aWVzCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDgsIEludGVsIENvcnAuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCisgKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSBhdCBtaW5pbXVtIGEgZGlzY2xhaW1lcgorICogICAgc3Vic3RhbnRpYWxseSBzaW1pbGFyIHRvIHRoZSAiTk8gV0FSUkFOVFkiIGRpc2NsYWltZXIgYmVsb3cKKyAqICAgICgiRGlzY2xhaW1lciIpIGFuZCBhbnkgcmVkaXN0cmlidXRpb24gbXVzdCBiZSBjb25kaXRpb25lZCB1cG9uCisgKiAgICBpbmNsdWRpbmcgYSBzdWJzdGFudGlhbGx5IHNpbWlsYXIgRGlzY2xhaW1lciByZXF1aXJlbWVudCBmb3IgZnVydGhlcgorICogICAgYmluYXJ5IHJlZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzCisgKiAgICBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIE5PIFdBUlJBTlRZCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORworICogSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCisgKi8KKworI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgorI2luY2x1ZGUgImFjY29tbW9uLmgiCisjaW5jbHVkZSAiYWNwYXJzZXIuaCIKKyNpbmNsdWRlICJhbWxjb2RlLmgiCisjaW5jbHVkZSAiYWNkaXNwYXQuaCIKKyNpbmNsdWRlICJhY2ludGVycC5oIgorI2luY2x1ZGUgImFjbmFtZXNwLmgiCisjaW5jbHVkZSAiYWNkZWJ1Zy5oIgorCisjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9ESVNQQVRDSEVSCitBQ1BJX01PRFVMRV9OQU1FKCJkc3V0aWxzIikKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9kc19jbGVhcl9pbXBsaWNpdF9yZXR1cm4KKyAqCisgKiBQQVJBTUVURVJTOiAgd2Fsa19zdGF0ZSAgICAgICAgICAtIEN1cnJlbnQgU3RhdGUKKyAqCisgKiBSRVRVUk46ICAgICAgTm9uZS4KKyAqCisgKiBERVNDUklQVElPTjogQ2xlYXIgYW5kIHJlbW92ZSBhIHJlZmVyZW5jZSBvbiBhbiBpbXBsaWNpdCByZXR1cm4gdmFsdWUuICBVc2VkCisgKiAgICAgICAgICAgICAgdG8gZGVsZXRlICJzdGFsZSIgcmV0dXJuIHZhbHVlcyAoaWYgZW5hYmxlZCwgdGhlIHJldHVybiB2YWx1ZQorICogICAgICAgICAgICAgIGZyb20gZXZlcnkgb3BlcmF0b3IgaXMgc2F2ZWQgYXQgbGVhc3QgbW9tZW50YXJpbHksIGluIGNhc2UgdGhlCisgKiAgICAgICAgICAgICAgcGFyZW50IG1ldGhvZCBleGl0cy4pCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYWNwaV9kc19jbGVhcl9pbXBsaWNpdF9yZXR1cm4oc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSkKK3sKKwlBQ1BJX0ZVTkNUSU9OX05BTUUoZHNfY2xlYXJfaW1wbGljaXRfcmV0dXJuKTsKKworCS8qCisJICogU2xhY2sgbXVzdCBiZSBlbmFibGVkIGZvciB0aGlzIGZlYXR1cmUKKwkgKi8KKwlpZiAoIWFjcGlfZ2JsX2VuYWJsZV9pbnRlcnByZXRlcl9zbGFjaykgeworCQlyZXR1cm47CisJfQorCisJaWYgKHdhbGtfc3RhdGUtPmltcGxpY2l0X3JldHVybl9vYmopIHsKKwkJLyoKKwkJICogRGVsZXRlIGFueSAic3RhbGUiIGltcGxpY2l0IHJldHVybi4gSG93ZXZlciwgaW4KKwkJICogY29tcGxleCBzdGF0ZW1lbnRzLCB0aGUgaW1wbGljaXQgcmV0dXJuIHZhbHVlIGNhbiBiZQorCQkgKiBidWJibGVkIHVwIHNldmVyYWwgbGV2ZWxzLgorCQkgKi8KKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9ESVNQQVRDSCwKKwkJCQkgICJSZW1vdmluZyByZWZlcmVuY2Ugb24gc3RhbGUgaW1wbGljaXQgcmV0dXJuIG9iaiAlcFxuIiwKKwkJCQkgIHdhbGtfc3RhdGUtPmltcGxpY2l0X3JldHVybl9vYmopKTsKKworCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2Uod2Fsa19zdGF0ZS0+aW1wbGljaXRfcmV0dXJuX29iaik7CisJCXdhbGtfc3RhdGUtPmltcGxpY2l0X3JldHVybl9vYmogPSBOVUxMOworCX0KK30KKworI2lmbmRlZiBBQ1BJX05PX01FVEhPRF9FWEVDVVRJT04KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfZHNfZG9faW1wbGljaXRfcmV0dXJuCisgKgorICogUEFSQU1FVEVSUzogIHJldHVybl9kZXNjICAgICAgICAgLSBUaGUgcmV0dXJuIHZhbHVlCisgKiAgICAgICAgICAgICAgd2Fsa19zdGF0ZSAgICAgICAgICAtIEN1cnJlbnQgU3RhdGUKKyAqICAgICAgICAgICAgICBhZGRfcmVmZXJlbmNlICAgICAgIC0gVHJ1ZSBpZiBhIHJlZmVyZW5jZSBzaG91bGQgYmUgYWRkZWQgdG8gdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvYmplY3QKKyAqCisgKiBSRVRVUk46ICAgICAgVFJVRSBpZiBpbXBsaWNpdCByZXR1cm4gZW5hYmxlZCwgRkFMU0Ugb3RoZXJ3aXNlCisgKgorICogREVTQ1JJUFRJT046IEltcGxlbWVudHMgdGhlIG9wdGlvbmFsICJpbXBsaWNpdCByZXR1cm4iLiAgV2Ugc2F2ZSB0aGUgcmVzdWx0CisgKiAgICAgICAgICAgICAgb2YgZXZlcnkgQVNMIG9wZXJhdG9yIGFuZCBjb250cm9sIG1ldGhvZCBpbnZvY2F0aW9uIGluIGNhc2UgdGhlCisgKiAgICAgICAgICAgICAgcGFyZW50IG1ldGhvZCBleGl0LiAgQmVmb3JlIHN0b3JpbmcgYSBuZXcgcmV0dXJuIHZhbHVlLCB3ZQorICogICAgICAgICAgICAgIGRlbGV0ZSB0aGUgcHJldmlvdXMgcmV0dXJuIHZhbHVlLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3U4CithY3BpX2RzX2RvX2ltcGxpY2l0X3JldHVybih1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpyZXR1cm5fZGVzYywKKwkJCSAgIHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUsIHU4IGFkZF9yZWZlcmVuY2UpCit7CisJQUNQSV9GVU5DVElPTl9OQU1FKGRzX2RvX2ltcGxpY2l0X3JldHVybik7CisKKwkvKgorCSAqIFNsYWNrIG11c3QgYmUgZW5hYmxlZCBmb3IgdGhpcyBmZWF0dXJlLCBhbmQgd2UgbXVzdAorCSAqIGhhdmUgYSB2YWxpZCByZXR1cm4gb2JqZWN0CisJICovCisJaWYgKCghYWNwaV9nYmxfZW5hYmxlX2ludGVycHJldGVyX3NsYWNrKSB8fCAoIXJldHVybl9kZXNjKSkgeworCQlyZXR1cm4gKEZBTFNFKTsKKwl9CisKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0RJU1BBVENILAorCQkJICAiUmVzdWx0ICVwIHdpbGwgYmUgaW1wbGljaXRseSByZXR1cm5lZDsgUHJldj0lcFxuIiwKKwkJCSAgcmV0dXJuX2Rlc2MsIHdhbGtfc3RhdGUtPmltcGxpY2l0X3JldHVybl9vYmopKTsKKworCS8qCisJICogRGVsZXRlIGFueSAic3RhbGUiIGltcGxpY2l0IHJldHVybiB2YWx1ZSBmaXJzdC4gSG93ZXZlciwgaW4KKwkgKiBjb21wbGV4IHN0YXRlbWVudHMsIHRoZSBpbXBsaWNpdCByZXR1cm4gdmFsdWUgY2FuIGJlCisJICogYnViYmxlZCB1cCBzZXZlcmFsIGxldmVscywgc28gd2UgZG9uJ3QgY2xlYXIgdGhlIHZhbHVlIGlmIGl0CisJICogaXMgdGhlIHNhbWUgYXMgdGhlIHJldHVybl9kZXNjLgorCSAqLworCWlmICh3YWxrX3N0YXRlLT5pbXBsaWNpdF9yZXR1cm5fb2JqKSB7CisJCWlmICh3YWxrX3N0YXRlLT5pbXBsaWNpdF9yZXR1cm5fb2JqID09IHJldHVybl9kZXNjKSB7CisJCQlyZXR1cm4gKFRSVUUpOworCQl9CisJCWFjcGlfZHNfY2xlYXJfaW1wbGljaXRfcmV0dXJuKHdhbGtfc3RhdGUpOworCX0KKworCS8qIFNhdmUgdGhlIGltcGxpY2l0IHJldHVybiB2YWx1ZSwgYWRkIGEgcmVmZXJlbmNlIGlmIHJlcXVlc3RlZCAqLworCisJd2Fsa19zdGF0ZS0+aW1wbGljaXRfcmV0dXJuX29iaiA9IHJldHVybl9kZXNjOworCWlmIChhZGRfcmVmZXJlbmNlKSB7CisJCWFjcGlfdXRfYWRkX3JlZmVyZW5jZShyZXR1cm5fZGVzYyk7CisJfQorCisJcmV0dXJuIChUUlVFKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9kc19pc19yZXN1bHRfdXNlZAorICoKKyAqIFBBUkFNRVRFUlM6ICBPcCAgICAgICAgICAgICAgICAgIC0gQ3VycmVudCBPcAorICogICAgICAgICAgICAgIHdhbGtfc3RhdGUgICAgICAgICAgLSBDdXJyZW50IFN0YXRlCisgKgorICogUkVUVVJOOiAgICAgIFRSVUUgaWYgcmVzdWx0IGlzIHVzZWQsIEZBTFNFIG90aGVyd2lzZQorICoKKyAqIERFU0NSSVBUSU9OOiBDaGVjayBpZiBhIHJlc3VsdCBvYmplY3Qgd2lsbCBiZSB1c2VkIGJ5IHRoZSBwYXJlbnQKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit1OAorYWNwaV9kc19pc19yZXN1bHRfdXNlZCh1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqIG9wLAorCQkgICAgICAgc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqIHdhbGtfc3RhdGUpCit7CisJY29uc3Qgc3RydWN0IGFjcGlfb3Bjb2RlX2luZm8gKnBhcmVudF9pbmZvOworCisJQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIoZHNfaXNfcmVzdWx0X3VzZWQsIG9wKTsKKworCS8qIE11c3QgaGF2ZSBib3RoIGFuIE9wIGFuZCBhIFJlc3VsdCBPYmplY3QgKi8KKworCWlmICghb3ApIHsKKwkJQUNQSV9FUlJPUigoQUVfSU5GTywgIk51bGwgT3AiKSk7CisJCXJldHVybl9VSU5UOChUUlVFKTsKKwl9CisKKwkvKgorCSAqIFdlIGtub3cgdGhhdCB0aGlzIG9wZXJhdG9yIGlzIG5vdCBhCisJICogUmV0dXJuKCkgb3BlcmF0b3IgKHdvdWxkIG5vdCBjb21lIGhlcmUuKSBUaGUgZm9sbG93aW5nIGNvZGUgaXMgdGhlCisJICogb3B0aW9uYWwgc3VwcG9ydCBmb3IgYSBzby1jYWxsZWQgImltcGxpY2l0IHJldHVybiIuIFNvbWUgQU1MIGNvZGUKKwkgKiBhc3N1bWVzIHRoYXQgdGhlIGxhc3QgdmFsdWUgb2YgdGhlIG1ldGhvZCBpcyAiaW1wbGljaXRseSIgcmV0dXJuZWQKKwkgKiB0byB0aGUgY2FsbGVyLiBKdXN0IHNhdmUgdGhlIGxhc3QgcmVzdWx0IGFzIHRoZSByZXR1cm4gdmFsdWUuCisJICogTk9URTogdGhpcyBpcyBvcHRpb25hbCBiZWNhdXNlIHRoZSBBU0wgbGFuZ3VhZ2UgZG9lcyBub3QgYWN0dWFsbHkKKwkgKiBzdXBwb3J0IHRoaXMgYmVoYXZpb3IuCisJICovCisJKHZvaWQpYWNwaV9kc19kb19pbXBsaWNpdF9yZXR1cm4od2Fsa19zdGF0ZS0+cmVzdWx0X29iaiwgd2Fsa19zdGF0ZSwKKwkJCQkJIFRSVUUpOworCisJLyoKKwkgKiBOb3cgZGV0ZXJtaW5lIGlmIHRoZSBwYXJlbnQgd2lsbCB1c2UgdGhlIHJlc3VsdAorCSAqCisJICogSWYgdGhlcmUgaXMgbm8gcGFyZW50LCBvciB0aGUgcGFyZW50IGlzIGEgc2NvcGVfb3AsIHdlIGFyZSBleGVjdXRpbmcKKwkgKiBhdCB0aGUgbWV0aG9kIGxldmVsLiBBbiBleGVjdXRpbmcgbWV0aG9kIHR5cGljYWxseSBoYXMgbm8gcGFyZW50LAorCSAqIHNpbmNlIGVhY2ggbWV0aG9kIGlzIHBhcnNlZCBzZXBhcmF0ZWx5LiAgQSBtZXRob2QgaW52b2tlZCBleHRlcm5hbGx5CisJICogdmlhIGV4ZWN1dGVfY29udHJvbF9tZXRob2QgaGFzIGEgc2NvcGVfb3AgYXMgdGhlIHBhcmVudC4KKwkgKi8KKwlpZiAoKCFvcC0+Y29tbW9uLnBhcmVudCkgfHwKKwkgICAgKG9wLT5jb21tb24ucGFyZW50LT5jb21tb24uYW1sX29wY29kZSA9PSBBTUxfU0NPUEVfT1ApKSB7CisKKwkJLyogTm8gcGFyZW50LCB0aGUgcmV0dXJuIHZhbHVlIGNhbm5vdCBwb3NzaWJseSBiZSB1c2VkICovCisKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9ESVNQQVRDSCwKKwkJCQkgICJBdCBNZXRob2QgbGV2ZWwsIHJlc3VsdCBvZiBbJXNdIG5vdCB1c2VkXG4iLAorCQkJCSAgYWNwaV9wc19nZXRfb3Bjb2RlX25hbWUob3AtPmNvbW1vbi4KKwkJCQkJCQkgIGFtbF9vcGNvZGUpKSk7CisJCXJldHVybl9VSU5UOChGQUxTRSk7CisJfQorCisJLyogR2V0IGluZm8gb24gdGhlIHBhcmVudC4gVGhlIHJvb3Rfb3AgaXMgQU1MX1NDT1BFICovCisKKwlwYXJlbnRfaW5mbyA9CisJICAgIGFjcGlfcHNfZ2V0X29wY29kZV9pbmZvKG9wLT5jb21tb24ucGFyZW50LT5jb21tb24uYW1sX29wY29kZSk7CisJaWYgKHBhcmVudF9pbmZvLT5jbGFzcyA9PSBBTUxfQ0xBU1NfVU5LTk9XTikgeworCQlBQ1BJX0VSUk9SKChBRV9JTkZPLCAiVW5rbm93biBwYXJlbnQgb3Bjb2RlIE9wPSVwIiwgb3ApKTsKKwkJcmV0dXJuX1VJTlQ4KEZBTFNFKTsKKwl9CisKKwkvKgorCSAqIERlY2lkZSB3aGF0IHRvIGRvIHdpdGggdGhlIHJlc3VsdCBiYXNlZCBvbiB0aGUgcGFyZW50LiAgSWYKKwkgKiB0aGUgcGFyZW50IG9wY29kZSB3aWxsIG5vdCB1c2UgdGhlIHJlc3VsdCwgZGVsZXRlIHRoZSBvYmplY3QuCisJICogT3RoZXJ3aXNlIGxlYXZlIGl0IGFzIGlzLCBpdCB3aWxsIGJlIGRlbGV0ZWQgd2hlbiBpdCBpcyB1c2VkCisJICogYXMgYW4gb3BlcmFuZCBsYXRlci4KKwkgKi8KKwlzd2l0Y2ggKHBhcmVudF9pbmZvLT5jbGFzcykgeworCWNhc2UgQU1MX0NMQVNTX0NPTlRST0w6CisKKwkJc3dpdGNoIChvcC0+Y29tbW9uLnBhcmVudC0+Y29tbW9uLmFtbF9vcGNvZGUpIHsKKwkJY2FzZSBBTUxfUkVUVVJOX09QOgorCisJCQkvKiBOZXZlciBkZWxldGUgdGhlIHJldHVybiB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggYSByZXR1cm4gb3Bjb2RlICovCisKKwkJCWdvdG8gcmVzdWx0X3VzZWQ7CisKKwkJY2FzZSBBTUxfSUZfT1A6CisJCWNhc2UgQU1MX1dISUxFX09QOgorCisJCQkvKgorCQkJICogSWYgd2UgYXJlIGV4ZWN1dGluZyB0aGUgcHJlZGljYXRlIEFORCB0aGlzIGlzIHRoZSBwcmVkaWNhdGUgb3AsCisJCQkgKiB3ZSB3aWxsIHVzZSB0aGUgcmV0dXJuIHZhbHVlCisJCQkgKi8KKwkJCWlmICgod2Fsa19zdGF0ZS0+Y29udHJvbF9zdGF0ZS0+Y29tbW9uLnN0YXRlID09CisJCQkgICAgIEFDUElfQ09OVFJPTF9QUkVESUNBVEVfRVhFQ1VUSU5HKQorCQkJICAgICYmICh3YWxrX3N0YXRlLT5jb250cm9sX3N0YXRlLT5jb250cm9sLgorCQkJCXByZWRpY2F0ZV9vcCA9PSBvcCkpIHsKKwkJCQlnb3RvIHJlc3VsdF91c2VkOworCQkJfQorCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCS8qIElnbm9yZSBvdGhlciBjb250cm9sIG9wY29kZXMgKi8KKwkJCWJyZWFrOworCQl9CisKKwkJLyogVGhlIGdlbmVyYWwgY29udHJvbCBvcGNvZGUgcmV0dXJucyBubyByZXN1bHQgKi8KKworCQlnb3RvIHJlc3VsdF9ub3RfdXNlZDsKKworCWNhc2UgQU1MX0NMQVNTX0NSRUFURToKKworCQkvKgorCQkgKiBUaGVzZSBvcGNvZGVzIGFsbG93IHRlcm1fYXJnKHMpIGFzIG9wZXJhbmRzIGFuZCB0aGVyZWZvcmUKKwkJICogdGhlIG9wZXJhbmRzIGNhbiBiZSBtZXRob2QgY2FsbHMuICBUaGUgcmVzdWx0IGlzIHVzZWQuCisJCSAqLworCQlnb3RvIHJlc3VsdF91c2VkOworCisJY2FzZSBBTUxfQ0xBU1NfTkFNRURfT0JKRUNUOgorCisJCWlmICgob3AtPmNvbW1vbi5wYXJlbnQtPmNvbW1vbi5hbWxfb3Bjb2RlID09IEFNTF9SRUdJT05fT1ApIHx8CisJCSAgICAob3AtPmNvbW1vbi5wYXJlbnQtPmNvbW1vbi5hbWxfb3Bjb2RlID09IEFNTF9EQVRBX1JFR0lPTl9PUCkKKwkJICAgIHx8IChvcC0+Y29tbW9uLnBhcmVudC0+Y29tbW9uLmFtbF9vcGNvZGUgPT0gQU1MX1BBQ0tBR0VfT1ApCisJCSAgICB8fCAob3AtPmNvbW1vbi5wYXJlbnQtPmNvbW1vbi5hbWxfb3Bjb2RlID09CisJCQlBTUxfVkFSX1BBQ0tBR0VfT1ApCisJCSAgICB8fCAob3AtPmNvbW1vbi5wYXJlbnQtPmNvbW1vbi5hbWxfb3Bjb2RlID09IEFNTF9CVUZGRVJfT1ApCisJCSAgICB8fCAob3AtPmNvbW1vbi5wYXJlbnQtPmNvbW1vbi5hbWxfb3Bjb2RlID09CisJCQlBTUxfSU5UX0VWQUxfU1VCVFJFRV9PUCkKKwkJICAgIHx8IChvcC0+Y29tbW9uLnBhcmVudC0+Y29tbW9uLmFtbF9vcGNvZGUgPT0KKwkJCUFNTF9CQU5LX0ZJRUxEX09QKSkgeworCQkJLyoKKwkJCSAqIFRoZXNlIG9wY29kZXMgYWxsb3cgdGVybV9hcmcocykgYXMgb3BlcmFuZHMgYW5kIHRoZXJlZm9yZQorCQkJICogdGhlIG9wZXJhbmRzIGNhbiBiZSBtZXRob2QgY2FsbHMuICBUaGUgcmVzdWx0IGlzIHVzZWQuCisJCQkgKi8KKwkJCWdvdG8gcmVzdWx0X3VzZWQ7CisJCX0KKworCQlnb3RvIHJlc3VsdF9ub3RfdXNlZDsKKworCWRlZmF1bHQ6CisKKwkJLyoKKwkJICogSW4gYWxsIG90aGVyIGNhc2VzLiB0aGUgcGFyZW50IHdpbGwgYWN0dWFsbHkgdXNlIHRoZSByZXR1cm4KKwkJICogb2JqZWN0LCBzbyBrZWVwIGl0LgorCQkgKi8KKwkJZ290byByZXN1bHRfdXNlZDsKKwl9CisKKyAgICAgIHJlc3VsdF91c2VkOgorCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRElTUEFUQ0gsCisJCQkgICJSZXN1bHQgb2YgWyVzXSB1c2VkIGJ5IFBhcmVudCBbJXNdIE9wPSVwXG4iLAorCQkJICBhY3BpX3BzX2dldF9vcGNvZGVfbmFtZShvcC0+Y29tbW9uLmFtbF9vcGNvZGUpLAorCQkJICBhY3BpX3BzX2dldF9vcGNvZGVfbmFtZShvcC0+Y29tbW9uLnBhcmVudC0+Y29tbW9uLgorCQkJCQkJICBhbWxfb3Bjb2RlKSwgb3ApKTsKKworCXJldHVybl9VSU5UOChUUlVFKTsKKworICAgICAgcmVzdWx0X25vdF91c2VkOgorCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRElTUEFUQ0gsCisJCQkgICJSZXN1bHQgb2YgWyVzXSBub3QgdXNlZCBieSBQYXJlbnQgWyVzXSBPcD0lcFxuIiwKKwkJCSAgYWNwaV9wc19nZXRfb3Bjb2RlX25hbWUob3AtPmNvbW1vbi5hbWxfb3Bjb2RlKSwKKwkJCSAgYWNwaV9wc19nZXRfb3Bjb2RlX25hbWUob3AtPmNvbW1vbi5wYXJlbnQtPmNvbW1vbi4KKwkJCQkJCSAgYW1sX29wY29kZSksIG9wKSk7CisKKwlyZXR1cm5fVUlOVDgoRkFMU0UpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX2RzX2RlbGV0ZV9yZXN1bHRfaWZfbm90X3VzZWQKKyAqCisgKiBQQVJBTUVURVJTOiAgT3AgICAgICAgICAgICAgIC0gQ3VycmVudCBwYXJzZSBPcAorICogICAgICAgICAgICAgIHJlc3VsdF9vYmogICAgICAtIFJlc3VsdCBvZiB0aGUgb3BlcmF0aW9uCisgKiAgICAgICAgICAgICAgd2Fsa19zdGF0ZSAgICAgIC0gQ3VycmVudCBzdGF0ZQorICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogVXNlZCBhZnRlciBpbnRlcnByZXRhdGlvbiBvZiBhbiBvcGNvZGUuICBJZiB0aGVyZSBpcyBhbiBpbnRlcm5hbAorICogICAgICAgICAgICAgIHJlc3VsdCBkZXNjcmlwdG9yLCBjaGVjayBpZiB0aGUgcGFyZW50IG9wY29kZSB3aWxsIGFjdHVhbGx5IHVzZQorICogICAgICAgICAgICAgIHRoaXMgcmVzdWx0LiAgSWYgbm90LCBkZWxldGUgdGhlIHJlc3VsdCBub3cgc28gdGhhdCBpdCB3aWxsCisgKiAgICAgICAgICAgICAgbm90IGJlY29tZSBvcnBoYW5lZC4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkCithY3BpX2RzX2RlbGV0ZV9yZXN1bHRfaWZfbm90X3VzZWQodW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKm9wLAorCQkJCSAgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqcmVzdWx0X29iaiwKKwkJCQkgIHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUpCit7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2M7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCisJQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIoZHNfZGVsZXRlX3Jlc3VsdF9pZl9ub3RfdXNlZCwgcmVzdWx0X29iaik7CisKKwlpZiAoIW9wKSB7CisJCUFDUElfRVJST1IoKEFFX0lORk8sICJOdWxsIE9wIikpOworCQlyZXR1cm5fVk9JRDsKKwl9CisKKwlpZiAoIXJlc3VsdF9vYmopIHsKKwkJcmV0dXJuX1ZPSUQ7CisJfQorCisJaWYgKCFhY3BpX2RzX2lzX3Jlc3VsdF91c2VkKG9wLCB3YWxrX3N0YXRlKSkgeworCisJCS8qIE11c3QgcG9wIHRoZSByZXN1bHQgc3RhY2sgKG9ial9kZXNjIHNob3VsZCBiZSBlcXVhbCB0byByZXN1bHRfb2JqKSAqLworCisJCXN0YXR1cyA9IGFjcGlfZHNfcmVzdWx0X3BvcCgmb2JqX2Rlc2MsIHdhbGtfc3RhdGUpOworCQlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpIHsKKwkJCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZShyZXN1bHRfb2JqKTsKKwkJfQorCX0KKworCXJldHVybl9WT0lEOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX2RzX3Jlc29sdmVfb3BlcmFuZHMKKyAqCisgKiBQQVJBTUVURVJTOiAgd2Fsa19zdGF0ZSAgICAgICAgICAtIEN1cnJlbnQgd2FsayBzdGF0ZSB3aXRoIG9wZXJhbmRzIG9uIHN0YWNrCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBSZXNvbHZlIGFsbCBvcGVyYW5kcyB0byB0aGVpciB2YWx1ZXMuICBVc2VkIHRvIHByZXBhcmUKKyAqICAgICAgICAgICAgICBhcmd1bWVudHMgdG8gYSBjb250cm9sIG1ldGhvZCBpbnZvY2F0aW9uIChhIGNhbGwgZnJvbSBvbmUKKyAqICAgICAgICAgICAgICBtZXRob2QgdG8gYW5vdGhlci4pCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworYWNwaV9zdGF0dXMgYWNwaV9kc19yZXNvbHZlX29wZXJhbmRzKHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUpCit7CisJdTMyIGk7CisJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUihkc19yZXNvbHZlX29wZXJhbmRzLCB3YWxrX3N0YXRlKTsKKworCS8qCisJICogQXR0ZW1wdCB0byByZXNvbHZlIGVhY2ggb2YgdGhlIHZhbGlkIG9wZXJhbmRzCisJICogTWV0aG9kIGFyZ3VtZW50cyBhcmUgcGFzc2VkIGJ5IHJlZmVyZW5jZSwgbm90IGJ5IHZhbHVlLiAgVGhpcyBtZWFucworCSAqIHRoYXQgdGhlIGFjdHVhbCBvYmplY3RzIGFyZSBwYXNzZWQsIG5vdCBjb3BpZXMgb2YgdGhlIG9iamVjdHMuCisJICovCisJZm9yIChpID0gMDsgaSA8IHdhbGtfc3RhdGUtPm51bV9vcGVyYW5kczsgaSsrKSB7CisJCXN0YXR1cyA9CisJCSAgICBhY3BpX2V4X3Jlc29sdmVfdG9fdmFsdWUoJndhbGtfc3RhdGUtPm9wZXJhbmRzW2ldLAorCQkJCQkgICAgIHdhbGtfc3RhdGUpOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCWJyZWFrOworCQl9CisJfQorCisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfZHNfY2xlYXJfb3BlcmFuZHMKKyAqCisgKiBQQVJBTUVURVJTOiAgd2Fsa19zdGF0ZSAgICAgICAgICAtIEN1cnJlbnQgd2FsayBzdGF0ZSB3aXRoIG9wZXJhbmRzIG9uIHN0YWNrCisgKgorICogUkVUVVJOOiAgICAgIE5vbmUKKyAqCisgKiBERVNDUklQVElPTjogQ2xlYXIgYWxsIG9wZXJhbmRzIG9uIHRoZSBjdXJyZW50IHdhbGsgc3RhdGUgb3BlcmFuZCBzdGFjay4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIGFjcGlfZHNfY2xlYXJfb3BlcmFuZHMoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSkKK3sKKwl1MzIgaTsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKGRzX2NsZWFyX29wZXJhbmRzLCB3YWxrX3N0YXRlKTsKKworCS8qIFJlbW92ZSBhIHJlZmVyZW5jZSBvbiBlYWNoIG9wZXJhbmQgb24gdGhlIHN0YWNrICovCisKKwlmb3IgKGkgPSAwOyBpIDwgd2Fsa19zdGF0ZS0+bnVtX29wZXJhbmRzOyBpKyspIHsKKwkJLyoKKwkJICogUmVtb3ZlIGEgcmVmZXJlbmNlIHRvIGFsbCBvcGVyYW5kcywgaW5jbHVkaW5nIGJvdGgKKwkJICogIkFyZ3VtZW50cyIgYW5kICJUYXJnZXRzIi4KKwkJICovCisJCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZSh3YWxrX3N0YXRlLT5vcGVyYW5kc1tpXSk7CisJCXdhbGtfc3RhdGUtPm9wZXJhbmRzW2ldID0gTlVMTDsKKwl9CisKKwl3YWxrX3N0YXRlLT5udW1fb3BlcmFuZHMgPSAwOworCXJldHVybl9WT0lEOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfZHNfY3JlYXRlX29wZXJhbmQKKyAqCisgKiBQQVJBTUVURVJTOiAgd2Fsa19zdGF0ZSAgICAgIC0gQ3VycmVudCB3YWxrIHN0YXRlCisgKiAgICAgICAgICAgICAgQXJnICAgICAgICAgICAgIC0gUGFyc2Ugb2JqZWN0IGZvciB0aGUgYXJndW1lbnQKKyAqICAgICAgICAgICAgICBhcmdfaW5kZXggICAgICAgLSBXaGljaCBhcmd1bWVudCAoemVybyBiYXNlZCkKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IFRyYW5zbGF0ZSBhIHBhcnNlIHRyZWUgb2JqZWN0IHRoYXQgaXMgYW4gYXJndW1lbnQgdG8gYW4gQU1MCisgKiAgICAgICAgICAgICAgb3Bjb2RlIHRvIHRoZSBlcXVpdmFsZW50IGludGVycHJldGVyIG9iamVjdC4gIFRoaXMgbWF5IGluY2x1ZGUKKyAqICAgICAgICAgICAgICBsb29raW5nIHVwIGEgbmFtZSBvciBlbnRlcmluZyBhIG5ldyBuYW1lIGludG8gdGhlIGludGVybmFsCisgKiAgICAgICAgICAgICAgbmFtZXNwYWNlLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2FjcGlfc3RhdHVzCithY3BpX2RzX2NyZWF0ZV9vcGVyYW5kKHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUsCisJCSAgICAgICB1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqYXJnLCB1MzIgYXJnX2luZGV4KQoreworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOworCWNoYXIgKm5hbWVfc3RyaW5nOworCXUzMiBuYW1lX2xlbmd0aDsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYzsKKwl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqcGFyZW50X29wOworCXUxNiBvcGNvZGU7CisJYWNwaV9pbnRlcnByZXRlcl9tb2RlIGludGVycHJldGVyX21vZGU7CisJY29uc3Qgc3RydWN0IGFjcGlfb3Bjb2RlX2luZm8gKm9wX2luZm87CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUihkc19jcmVhdGVfb3BlcmFuZCwgYXJnKTsKKworCS8qIEEgdmFsaWQgbmFtZSBtdXN0IGJlIGxvb2tlZCB1cCBpbiB0aGUgbmFtZXNwYWNlICovCisKKwlpZiAoKGFyZy0+Y29tbW9uLmFtbF9vcGNvZGUgPT0gQU1MX0lOVF9OQU1FUEFUSF9PUCkgJiYKKwkgICAgKGFyZy0+Y29tbW9uLnZhbHVlLnN0cmluZykgJiYKKwkgICAgIShhcmctPmNvbW1vbi5mbGFncyAmIEFDUElfUEFSU0VPUF9JTl9TVEFDSykpIHsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9ESVNQQVRDSCwgIkdldHRpbmcgYSBuYW1lOiBBcmc9JXBcbiIsCisJCQkJICBhcmcpKTsKKworCQkvKiBHZXQgdGhlIGVudGlyZSBuYW1lIHN0cmluZyBmcm9tIHRoZSBBTUwgc3RyZWFtICovCisKKwkJc3RhdHVzID0KKwkJICAgIGFjcGlfZXhfZ2V0X25hbWVfc3RyaW5nKEFDUElfVFlQRV9BTlksCisJCQkJCSAgICBhcmctPmNvbW1vbi52YWx1ZS5idWZmZXIsCisJCQkJCSAgICAmbmFtZV9zdHJpbmcsICZuYW1lX2xlbmd0aCk7CisKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKKwkJfQorCisJCS8qIEFsbCBwcmVmaXhlcyBoYXZlIGJlZW4gaGFuZGxlZCwgYW5kIHRoZSBuYW1lIGlzIGluIG5hbWVfc3RyaW5nICovCisKKwkJLyoKKwkJICogU3BlY2lhbCBoYW5kbGluZyBmb3IgYnVmZmVyX2ZpZWxkIGRlY2xhcmF0aW9ucy4gVGhpcyBpcyBhIGRlZmVycmVkCisJCSAqIG9wY29kZSB0aGF0IHVuZm9ydHVuYXRlbHkgZGVmaW5lcyB0aGUgZmllbGQgbmFtZSBhcyB0aGUgbGFzdAorCQkgKiBwYXJhbWV0ZXIgaW5zdGVhZCBvZiB0aGUgZmlyc3QuICBXZSBnZXQgaGVyZSB3aGVuIHdlIGFyZSBwZXJmb3JtaW5nCisJCSAqIHRoZSBkZWZlcnJlZCBleGVjdXRpb24sIHNvIHRoZSBhY3R1YWwgbmFtZSBvZiB0aGUgZmllbGQgaXMgYWxyZWFkeQorCQkgKiBpbiB0aGUgbmFtZXNwYWNlLiAgV2UgZG9uJ3Qgd2FudCB0byBhdHRlbXB0IHRvIGxvb2sgaXQgdXAgYWdhaW4KKwkJICogYmVjYXVzZSB3ZSBtYXkgYmUgZXhlY3V0aW5nIGluIGEgZGlmZmVyZW50IHNjb3BlIHRoYW4gd2hlcmUgdGhlCisJCSAqIGFjdHVhbCBvcGNvZGUgZXhpc3RzLgorCQkgKi8KKwkJaWYgKCh3YWxrX3N0YXRlLT5kZWZlcnJlZF9ub2RlKSAmJgorCQkgICAgKHdhbGtfc3RhdGUtPmRlZmVycmVkX25vZGUtPnR5cGUgPT0gQUNQSV9UWVBFX0JVRkZFUl9GSUVMRCkKKwkJICAgICYmIChhcmdfaW5kZXggPT0KKwkJCSh1MzIpICgod2Fsa19zdGF0ZS0+b3Bjb2RlID09CisJCQkJQU1MX0NSRUFURV9GSUVMRF9PUCkgPyAzIDogMikpKSB7CisJCQlvYmpfZGVzYyA9CisJCQkgICAgQUNQSV9DQVNUX1BUUih1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0LAorCQkJCQkgIHdhbGtfc3RhdGUtPmRlZmVycmVkX25vZGUpOworCQkJc3RhdHVzID0gQUVfT0s7CisJCX0gZWxzZSB7CS8qIEFsbCBvdGhlciBvcGNvZGVzICovCisKKwkJCS8qCisJCQkgKiBEaWZmZXJlbnRpYXRlIGJldHdlZW4gYSBuYW1lc3BhY2UgImNyZWF0ZSIgb3BlcmF0aW9uCisJCQkgKiB2ZXJzdXMgYSAibG9va3VwIiBvcGVyYXRpb24gKElNT0RFX0xPQURfUEFTUzIgdnMuCisJCQkgKiBJTU9ERV9FWEVDVVRFKSBpbiBvcmRlciB0byBzdXBwb3J0IHRoZSBjcmVhdGlvbiBvZgorCQkJICogbmFtZXNwYWNlIG9iamVjdHMgZHVyaW5nIHRoZSBleGVjdXRpb24gb2YgY29udHJvbCBtZXRob2RzLgorCQkJICovCisJCQlwYXJlbnRfb3AgPSBhcmctPmNvbW1vbi5wYXJlbnQ7CisJCQlvcF9pbmZvID0KKwkJCSAgICBhY3BpX3BzX2dldF9vcGNvZGVfaW5mbyhwYXJlbnRfb3AtPmNvbW1vbi4KKwkJCQkJCSAgICBhbWxfb3Bjb2RlKTsKKwkJCWlmICgob3BfaW5mby0+ZmxhZ3MgJiBBTUxfTlNOT0RFKQorCQkJICAgICYmIChwYXJlbnRfb3AtPmNvbW1vbi5hbWxfb3Bjb2RlICE9CisJCQkJQU1MX0lOVF9NRVRIT0RDQUxMX09QKQorCQkJICAgICYmIChwYXJlbnRfb3AtPmNvbW1vbi5hbWxfb3Bjb2RlICE9IEFNTF9SRUdJT05fT1ApCisJCQkgICAgJiYgKHBhcmVudF9vcC0+Y29tbW9uLmFtbF9vcGNvZGUgIT0KKwkJCQlBTUxfSU5UX05BTUVQQVRIX09QKSkgeworCisJCQkJLyogRW50ZXIgbmFtZSBpbnRvIG5hbWVzcGFjZSBpZiBub3QgZm91bmQgKi8KKworCQkJCWludGVycHJldGVyX21vZGUgPSBBQ1BJX0lNT0RFX0xPQURfUEFTUzI7CisJCQl9IGVsc2UgeworCQkJCS8qIFJldHVybiBhIGZhaWx1cmUgaWYgbmFtZSBub3QgZm91bmQgKi8KKworCQkJCWludGVycHJldGVyX21vZGUgPSBBQ1BJX0lNT0RFX0VYRUNVVEU7CisJCQl9CisKKwkJCXN0YXR1cyA9CisJCQkgICAgYWNwaV9uc19sb29rdXAod2Fsa19zdGF0ZS0+c2NvcGVfaW5mbywgbmFtZV9zdHJpbmcsCisJCQkJCSAgIEFDUElfVFlQRV9BTlksIGludGVycHJldGVyX21vZGUsCisJCQkJCSAgIEFDUElfTlNfU0VBUkNIX1BBUkVOVCB8CisJCQkJCSAgIEFDUElfTlNfRE9OVF9PUEVOX1NDT1BFLCB3YWxrX3N0YXRlLAorCQkJCQkgICBBQ1BJX0NBU1RfSU5ESVJFQ1RfUFRSKHN0cnVjdAorCQkJCQkJCQkgIGFjcGlfbmFtZXNwYWNlX25vZGUsCisJCQkJCQkJCSAgJm9ial9kZXNjKSk7CisJCQkvKgorCQkJICogVGhlIG9ubHkgY2FzZSB3aGVyZSB3ZSBwYXNzIHRocm91Z2ggKGlnbm9yZSkgYSBOT1RfRk9VTkQKKwkJCSAqIGVycm9yIGlzIGZvciB0aGUgY29uZF9yZWZfb2Ygb3Bjb2RlLgorCQkJICovCisJCQlpZiAoc3RhdHVzID09IEFFX05PVF9GT1VORCkgeworCQkJCWlmIChwYXJlbnRfb3AtPmNvbW1vbi5hbWxfb3Bjb2RlID09CisJCQkJICAgIEFNTF9DT05EX1JFRl9PRl9PUCkgeworCQkJCQkvKgorCQkJCQkgKiBGb3IgdGhlIENvbmRpdGlvbmFsIFJlZmVyZW5jZSBvcCwgaXQncyBPSyBpZgorCQkJCQkgKiB0aGUgbmFtZSBpcyBub3QgZm91bmQ7ICBXZSBqdXN0IG5lZWQgYSB3YXkgdG8KKwkJCQkJICogaW5kaWNhdGUgdGhpcyB0byB0aGUgaW50ZXJwcmV0ZXIsIHNldCB0aGUKKwkJCQkJICogb2JqZWN0IHRvIHRoZSByb290CisJCQkJCSAqLworCQkJCQlvYmpfZGVzYyA9IEFDUElfQ0FTVF9QVFIodW5pb24KKwkJCQkJCQkJIGFjcGlfb3BlcmFuZF9vYmplY3QsCisJCQkJCQkJCSBhY3BpX2dibF9yb290X25vZGUpOworCQkJCQlzdGF0dXMgPSBBRV9PSzsKKwkJCQl9IGVsc2UgeworCQkJCQkvKgorCQkJCQkgKiBXZSBqdXN0IHBsYWluIGRpZG4ndCBmaW5kIGl0IC0tIHdoaWNoIGlzIGEKKwkJCQkJICogdmVyeSBzZXJpb3VzIGVycm9yIGF0IHRoaXMgcG9pbnQKKwkJCQkJICovCisJCQkJCXN0YXR1cyA9IEFFX0FNTF9OQU1FX05PVF9GT1VORDsKKwkJCQl9CisJCQl9CisKKwkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJCUFDUElfRVJST1JfTkFNRVNQQUNFKG5hbWVfc3RyaW5nLCBzdGF0dXMpOworCQkJfQorCQl9CisKKwkJLyogRnJlZSB0aGUgbmFtZXN0cmluZyBjcmVhdGVkIGFib3ZlICovCisKKwkJQUNQSV9GUkVFKG5hbWVfc3RyaW5nKTsKKworCQkvKiBDaGVjayBzdGF0dXMgZnJvbSB0aGUgbG9va3VwICovCisKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKKwkJfQorCisJCS8qIFB1dCB0aGUgcmVzdWx0aW5nIG9iamVjdCBvbnRvIHRoZSBjdXJyZW50IG9iamVjdCBzdGFjayAqLworCisJCXN0YXR1cyA9IGFjcGlfZHNfb2JqX3N0YWNrX3B1c2gob2JqX2Rlc2MsIHdhbGtfc3RhdGUpOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworCQl9CisJCUFDUElfREVCVUdHRVJfRVhFQyhhY3BpX2RiX2Rpc3BsYXlfYXJndW1lbnRfb2JqZWN0CisJCQkJICAgKG9ial9kZXNjLCB3YWxrX3N0YXRlKSk7CisJfSBlbHNlIHsKKwkJLyogQ2hlY2sgZm9yIG51bGwgbmFtZSBjYXNlICovCisKKwkJaWYgKChhcmctPmNvbW1vbi5hbWxfb3Bjb2RlID09IEFNTF9JTlRfTkFNRVBBVEhfT1ApICYmCisJCSAgICAhKGFyZy0+Y29tbW9uLmZsYWdzICYgQUNQSV9QQVJTRU9QX0lOX1NUQUNLKSkgeworCQkJLyoKKwkJCSAqIElmIHRoZSBuYW1lIGlzIG51bGwsIHRoaXMgbWVhbnMgdGhhdCB0aGlzIGlzIGFuCisJCQkgKiBvcHRpb25hbCByZXN1bHQgcGFyYW1ldGVyIHRoYXQgd2FzIG5vdCBzcGVjaWZpZWQKKwkJCSAqIGluIHRoZSBvcmlnaW5hbCBBU0wuICBDcmVhdGUgYSBaZXJvIENvbnN0YW50IGZvciBhCisJCQkgKiBwbGFjZWhvbGRlci4gIChTdG9yZSB0byBhIGNvbnN0YW50IGlzIGEgTm9vcC4pCisJCQkgKi8KKwkJCW9wY29kZSA9IEFNTF9aRVJPX09QOwkvKiBIYXMgbm8gYXJndW1lbnRzISAqLworCisJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0RJU1BBVENILAorCQkJCQkgICJOdWxsIG5hbWVwYXRoOiBBcmc9JXBcbiIsIGFyZykpOworCQl9IGVsc2UgeworCQkJb3Bjb2RlID0gYXJnLT5jb21tb24uYW1sX29wY29kZTsKKwkJfQorCisJCS8qIEdldCB0aGUgb2JqZWN0IHR5cGUgb2YgdGhlIGFyZ3VtZW50ICovCisKKwkJb3BfaW5mbyA9IGFjcGlfcHNfZ2V0X29wY29kZV9pbmZvKG9wY29kZSk7CisJCWlmIChvcF9pbmZvLT5vYmplY3RfdHlwZSA9PSBBQ1BJX1RZUEVfSU5WQUxJRCkgeworCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PVF9JTVBMRU1FTlRFRCk7CisJCX0KKworCQlpZiAoKG9wX2luZm8tPmZsYWdzICYgQU1MX0hBU19SRVRWQUwpCisJCSAgICB8fCAoYXJnLT5jb21tb24uZmxhZ3MgJiBBQ1BJX1BBUlNFT1BfSU5fU1RBQ0spKSB7CisJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0RJU1BBVENILAorCQkJCQkgICJBcmd1bWVudCBwcmV2aW91c2x5IGNyZWF0ZWQsIGFscmVhZHkgc3RhY2tlZFxuIikpOworCisJCQlBQ1BJX0RFQlVHR0VSX0VYRUMoYWNwaV9kYl9kaXNwbGF5X2FyZ3VtZW50X29iamVjdAorCQkJCQkgICAod2Fsa19zdGF0ZS0+CisJCQkJCSAgICBvcGVyYW5kc1t3YWxrX3N0YXRlLT5udW1fb3BlcmFuZHMgLQorCQkJCQkJICAgICAxXSwgd2Fsa19zdGF0ZSkpOworCisJCQkvKgorCQkJICogVXNlIHZhbHVlIHRoYXQgd2FzIGFscmVhZHkgcHJldmlvdXNseSByZXR1cm5lZAorCQkJICogYnkgdGhlIGV2YWx1YXRpb24gb2YgdGhpcyBhcmd1bWVudAorCQkJICovCisJCQlzdGF0dXMgPSBhY3BpX2RzX3Jlc3VsdF9wb3AoJm9ial9kZXNjLCB3YWxrX3N0YXRlKTsKKwkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJCS8qCisJCQkJICogT25seSBlcnJvciBpcyB1bmRlcmZsb3csIGFuZCB0aGlzIGluZGljYXRlcworCQkJCSAqIGEgbWlzc2luZyBvciBudWxsIG9wZXJhbmQhCisJCQkJICovCisJCQkJQUNQSV9FWENFUFRJT04oKEFFX0lORk8sIHN0YXR1cywKKwkJCQkJCSJNaXNzaW5nIG9yIG51bGwgb3BlcmFuZCIpKTsKKwkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8qIENyZWF0ZSBhbiBBQ1BJX0lOVEVSTkFMX09CSkVDVCBmb3IgdGhlIGFyZ3VtZW50ICovCisKKwkJCW9ial9kZXNjID0KKwkJCSAgICBhY3BpX3V0X2NyZWF0ZV9pbnRlcm5hbF9vYmplY3Qob3BfaW5mby0+CisJCQkJCQkJICAgb2JqZWN0X3R5cGUpOworCQkJaWYgKCFvYmpfZGVzYykgeworCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT19NRU1PUlkpOworCQkJfQorCisJCQkvKiBJbml0aWFsaXplIHRoZSBuZXcgb2JqZWN0ICovCisKKwkJCXN0YXR1cyA9CisJCQkgICAgYWNwaV9kc19pbml0X29iamVjdF9mcm9tX29wKHdhbGtfc3RhdGUsIGFyZywgb3Bjb2RlLAorCQkJCQkJCSZvYmpfZGVzYyk7CisJCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCQlhY3BpX3V0X2RlbGV0ZV9vYmplY3RfZGVzYyhvYmpfZGVzYyk7CisJCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CisJCQl9CisJCX0KKworCQkvKiBQdXQgdGhlIG9wZXJhbmQgb2JqZWN0IG9uIHRoZSBvYmplY3Qgc3RhY2sgKi8KKworCQlzdGF0dXMgPSBhY3BpX2RzX29ial9zdGFja19wdXNoKG9ial9kZXNjLCB3YWxrX3N0YXRlKTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKKwkJfQorCisJCUFDUElfREVCVUdHRVJfRVhFQyhhY3BpX2RiX2Rpc3BsYXlfYXJndW1lbnRfb2JqZWN0CisJCQkJICAgKG9ial9kZXNjLCB3YWxrX3N0YXRlKSk7CisJfQorCisJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9kc19jcmVhdGVfb3BlcmFuZHMKKyAqCisgKiBQQVJBTUVURVJTOiAgd2Fsa19zdGF0ZSAgICAgICAgICAtIEN1cnJlbnQgc3RhdGUKKyAqICAgICAgICAgICAgICBmaXJzdF9hcmcgICAgICAgICAgIC0gRmlyc3QgYXJndW1lbnQgb2YgYSBwYXJzZXIgYXJndW1lbnQgdHJlZQorICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogQ29udmVydCBhbiBvcGVyYXRvcidzIGFyZ3VtZW50cyBmcm9tIGEgcGFyc2UgdHJlZSBmb3JtYXQgdG8KKyAqICAgICAgICAgICAgICBuYW1lc3BhY2Ugb2JqZWN0cyBhbmQgcGxhY2UgdGhvc2UgYXJndW1lbnQgb2JqZWN0IG9uIHRoZSBvYmplY3QKKyAqICAgICAgICAgICAgICBzdGFjayBpbiBwcmVwYXJhdGlvbiBmb3IgZXZhbHVhdGlvbiBieSB0aGUgaW50ZXJwcmV0ZXIuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworYWNwaV9zdGF0dXMKK2FjcGlfZHNfY3JlYXRlX29wZXJhbmRzKHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUsCisJCQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqZmlyc3RfYXJnKQoreworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOworCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICphcmc7CisJdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKmFyZ3VtZW50c1tBQ1BJX09CSl9OVU1fT1BFUkFORFNdOworCXUzMiBhcmdfY291bnQgPSAwOworCXUzMiBpbmRleCA9IHdhbGtfc3RhdGUtPm51bV9vcGVyYW5kczsKKwl1MzIgaTsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKGRzX2NyZWF0ZV9vcGVyYW5kcywgZmlyc3RfYXJnKTsKKworCS8qIEdldCBhbGwgYXJndW1lbnRzIGluIHRoZSBsaXN0ICovCisKKwlhcmcgPSBmaXJzdF9hcmc7CisJd2hpbGUgKGFyZykgeworCQlpZiAoaW5kZXggPj0gQUNQSV9PQkpfTlVNX09QRVJBTkRTKSB7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX0RBVEEpOworCQl9CisKKwkJYXJndW1lbnRzW2luZGV4XSA9IGFyZzsKKwkJd2Fsa19zdGF0ZS0+b3BlcmFuZHNbaW5kZXhdID0gTlVMTDsKKworCQkvKiBNb3ZlIG9uIHRvIG5leHQgYXJndW1lbnQsIGlmIGFueSAqLworCisJCWFyZyA9IGFyZy0+Y29tbW9uLm5leHQ7CisJCWFyZ19jb3VudCsrOworCQlpbmRleCsrOworCX0KKworCWluZGV4LS07CisKKwkvKiBJdCBpcyB0aGUgYXBwcm9wcmlhdGUgb3JkZXIgdG8gZ2V0IG9iamVjdHMgZnJvbSB0aGUgUmVzdWx0IHN0YWNrICovCisKKwlmb3IgKGkgPSAwOyBpIDwgYXJnX2NvdW50OyBpKyspIHsKKwkJYXJnID0gYXJndW1lbnRzW2luZGV4XTsKKworCQkvKiBGb3JjZSB0aGUgZmlsbGluZyBvZiB0aGUgb3BlcmFuZCBzdGFjayBpbiBpbnZlcnNlIG9yZGVyICovCisKKwkJd2Fsa19zdGF0ZS0+b3BlcmFuZF9pbmRleCA9ICh1OCkgaW5kZXg7CisKKwkJc3RhdHVzID0gYWNwaV9kc19jcmVhdGVfb3BlcmFuZCh3YWxrX3N0YXRlLCBhcmcsIGluZGV4KTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQlnb3RvIGNsZWFudXA7CisJCX0KKworCQlpbmRleC0tOworCisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRElTUEFUQ0gsCisJCQkJICAiQXJnICMlZCAoJXApIGRvbmUsIEFyZzE9JXBcbiIsIGluZGV4LCBhcmcsCisJCQkJICBmaXJzdF9hcmcpKTsKKwl9CisKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKKworICAgICAgY2xlYW51cDoKKwkvKgorCSAqIFdlIG11c3QgdW5kbyBldmVyeXRoaW5nIGRvbmUgYWJvdmU7IG1lYW5pbmcgdGhhdCB3ZSBtdXN0CisJICogcG9wIGV2ZXJ5dGhpbmcgb2ZmIG9mIHRoZSBvcGVyYW5kIHN0YWNrIGFuZCBkZWxldGUgdGhvc2UKKwkgKiBvYmplY3RzCisJICovCisJYWNwaV9kc19vYmpfc3RhY2tfcG9wX2FuZF9kZWxldGUoYXJnX2NvdW50LCB3YWxrX3N0YXRlKTsKKworCUFDUElfRVhDRVBUSU9OKChBRV9JTkZPLCBzdGF0dXMsICJXaGlsZSBjcmVhdGluZyBBcmcgJWQiLCBpbmRleCkpOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9kc19ldmFsdWF0ZV9uYW1lX3BhdGgKKyAqCisgKiBQQVJBTUVURVJTOiAgd2Fsa19zdGF0ZSAgICAgIC0gQ3VycmVudCBzdGF0ZSBvZiB0aGUgcGFyc2UgdHJlZSB3YWxrLAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBvcGNvZGUgb2YgY3VycmVudCBvcGVyYXRpb24gc2hvdWxkIGJlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1MX0lOVF9OQU1FUEFUSF9PUAorICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogVHJhbnNsYXRlIHRoZSAtbmFtZV9wYXRoLSBwYXJzZSB0cmVlIG9iamVjdCB0byB0aGUgZXF1aXZhbGVudAorICogICAgICAgICAgICAgIGludGVycHJldGVyIG9iamVjdCwgY29udmVydCBpdCB0byB2YWx1ZSwgaWYgbmVlZGVkLCBkdXBsaWNhdGUKKyAqICAgICAgICAgICAgICBpdCwgaWYgbmVlZGVkLCBhbmQgcHVzaCBpdCBvbnRvIHRoZSBjdXJyZW50IHJlc3VsdCBzdGFjay4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworYWNwaV9zdGF0dXMgYWNwaV9kc19ldmFsdWF0ZV9uYW1lX3BhdGgoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSkKK3sKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKKwl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqb3AgPSB3YWxrX3N0YXRlLT5vcDsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICoqb3BlcmFuZCA9ICZ3YWxrX3N0YXRlLT5vcGVyYW5kc1swXTsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpuZXdfb2JqX2Rlc2M7CisJdTggdHlwZTsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKGRzX2V2YWx1YXRlX25hbWVfcGF0aCwgd2Fsa19zdGF0ZSk7CisKKwlpZiAoIW9wLT5jb21tb24ucGFyZW50KSB7CisKKwkJLyogVGhpcyBoYXBwZW5zIGFmdGVyIGNlcnRhaW4gZXhjZXB0aW9uIHByb2Nlc3NpbmcgKi8KKworCQlnb3RvIGV4aXQ7CisJfQorCisJaWYgKChvcC0+Y29tbW9uLnBhcmVudC0+Y29tbW9uLmFtbF9vcGNvZGUgPT0gQU1MX1BBQ0tBR0VfT1ApIHx8CisJICAgIChvcC0+Y29tbW9uLnBhcmVudC0+Y29tbW9uLmFtbF9vcGNvZGUgPT0gQU1MX1ZBUl9QQUNLQUdFX09QKSB8fAorCSAgICAob3AtPmNvbW1vbi5wYXJlbnQtPmNvbW1vbi5hbWxfb3Bjb2RlID09IEFNTF9SRUZfT0ZfT1ApKSB7CisKKwkJLyogVEJEOiBTaG91bGQgd2Ugc3BlY2lmeSB0aGlzIGZlYXR1cmUgYXMgYSBiaXQgb2Ygb3BfaW5mby0+RmxhZ3Mgb2YgdGhlc2Ugb3Bjb2Rlcz8gKi8KKworCQlnb3RvIGV4aXQ7CisJfQorCisJc3RhdHVzID0gYWNwaV9kc19jcmVhdGVfb3BlcmFuZCh3YWxrX3N0YXRlLCBvcCwgMCk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCWdvdG8gZXhpdDsKKwl9CisKKwlpZiAob3AtPmNvbW1vbi5mbGFncyAmIEFDUElfUEFSU0VPUF9UQVJHRVQpIHsKKwkJbmV3X29ial9kZXNjID0gKm9wZXJhbmQ7CisJCWdvdG8gcHVzaF9yZXN1bHQ7CisJfQorCisJdHlwZSA9IEFDUElfR0VUX09CSkVDVF9UWVBFKCpvcGVyYW5kKTsKKworCXN0YXR1cyA9IGFjcGlfZXhfcmVzb2x2ZV90b192YWx1ZShvcGVyYW5kLCB3YWxrX3N0YXRlKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJZ290byBleGl0OworCX0KKworCWlmICh0eXBlID09IEFDUElfVFlQRV9JTlRFR0VSKSB7CisKKwkJLyogSXQgd2FzIGluY3JlbWVudGVkIGJ5IGFjcGlfZXhfcmVzb2x2ZV90b192YWx1ZSAqLworCisJCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZSgqb3BlcmFuZCk7CisKKwkJc3RhdHVzID0KKwkJICAgIGFjcGlfdXRfY29weV9pb2JqZWN0X3RvX2lvYmplY3QoKm9wZXJhbmQsICZuZXdfb2JqX2Rlc2MsCisJCQkJCQkgICAgd2Fsa19zdGF0ZSk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJZ290byBleGl0OworCQl9CisJfSBlbHNlIHsKKwkJLyoKKwkJICogVGhlIG9iamVjdCBlaXRoZXIgd2FzIGFuZXcgY3JlYXRlZCBvciBpcworCQkgKiBhIE5hbWVzcGFjZSBub2RlIC0gZG9uJ3QgZGVjcmVtZW50IGl0LgorCQkgKi8KKwkJbmV3X29ial9kZXNjID0gKm9wZXJhbmQ7CisJfQorCisJLyogQ2xlYW51cCBmb3IgbmFtZS1wYXRoIG9wZXJhbmQgKi8KKworCXN0YXR1cyA9IGFjcGlfZHNfb2JqX3N0YWNrX3BvcCgxLCB3YWxrX3N0YXRlKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJd2Fsa19zdGF0ZS0+cmVzdWx0X29iaiA9IG5ld19vYmpfZGVzYzsKKwkJZ290byBleGl0OworCX0KKworICAgICAgcHVzaF9yZXN1bHQ6CisKKwl3YWxrX3N0YXRlLT5yZXN1bHRfb2JqID0gbmV3X29ial9kZXNjOworCisJc3RhdHVzID0gYWNwaV9kc19yZXN1bHRfcHVzaCh3YWxrX3N0YXRlLT5yZXN1bHRfb2JqLCB3YWxrX3N0YXRlKTsKKwlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpIHsKKworCQkvKiBGb3JjZSB0byB0YWtlIGl0IGZyb20gc3RhY2sgKi8KKworCQlvcC0+Y29tbW9uLmZsYWdzIHw9IEFDUElfUEFSU0VPUF9JTl9TVEFDSzsKKwl9CisKKyAgICAgIGV4aXQ6CisKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvZHN3ZXhlYy5jIGIvZHJpdmVycy9hY3BpL2FjcGljYS9kc3dleGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzUwZTY2NQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvZHN3ZXhlYy5jCkBAIC0wLDAgKzEsNzQ2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogTW9kdWxlIE5hbWU6IGRzd2V4ZWMgLSBEaXNwYXRjaGVyIG1ldGhvZCBleGVjdXRpb24gY2FsbGJhY2tzOworICogICAgICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaCB0byBpbnRlcnByZXRlci4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA4LCBJbnRlbCBDb3JwLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAorICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgYXQgbWluaW11bSBhIGRpc2NsYWltZXIKKyAqICAgIHN1YnN0YW50aWFsbHkgc2ltaWxhciB0byB0aGUgIk5PIFdBUlJBTlRZIiBkaXNjbGFpbWVyIGJlbG93CisgKiAgICAoIkRpc2NsYWltZXIiKSBhbmQgYW55IHJlZGlzdHJpYnV0aW9uIG11c3QgYmUgY29uZGl0aW9uZWQgdXBvbgorICogICAgaW5jbHVkaW5nIGEgc3Vic3RhbnRpYWxseSBzaW1pbGFyIERpc2NsYWltZXIgcmVxdWlyZW1lbnQgZm9yIGZ1cnRoZXIKKyAqICAgIGJpbmFyeSByZWRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcworICogICAgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBOTyBXQVJSQU5UWQorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcKKyAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgorICovCisKKyNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KKyNpbmNsdWRlICJhY2NvbW1vbi5oIgorI2luY2x1ZGUgImFjcGFyc2VyLmgiCisjaW5jbHVkZSAiYW1sY29kZS5oIgorI2luY2x1ZGUgImFjZGlzcGF0LmgiCisjaW5jbHVkZSAiYWNpbnRlcnAuaCIKKyNpbmNsdWRlICJhY25hbWVzcC5oIgorI2luY2x1ZGUgImFjZGVidWcuaCIKKworI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfRElTUEFUQ0hFUgorQUNQSV9NT0RVTEVfTkFNRSgiZHN3ZXhlYyIpCisKKy8qCisgKiBEaXNwYXRjaCB0YWJsZSBmb3Igb3Bjb2RlIGNsYXNzZXMKKyAqLworc3RhdGljIEFDUElfRVhFQ1VURV9PUCBhY3BpX2dibF9vcF90eXBlX2Rpc3BhdGNoW10gPSB7CisJYWNwaV9leF9vcGNvZGVfMEFfMFRfMVIsCisJYWNwaV9leF9vcGNvZGVfMUFfMFRfMFIsCisJYWNwaV9leF9vcGNvZGVfMUFfMFRfMVIsCisJYWNwaV9leF9vcGNvZGVfMUFfMVRfMFIsCisJYWNwaV9leF9vcGNvZGVfMUFfMVRfMVIsCisJYWNwaV9leF9vcGNvZGVfMkFfMFRfMFIsCisJYWNwaV9leF9vcGNvZGVfMkFfMFRfMVIsCisJYWNwaV9leF9vcGNvZGVfMkFfMVRfMVIsCisJYWNwaV9leF9vcGNvZGVfMkFfMlRfMVIsCisJYWNwaV9leF9vcGNvZGVfM0FfMFRfMFIsCisJYWNwaV9leF9vcGNvZGVfM0FfMVRfMVIsCisJYWNwaV9leF9vcGNvZGVfNkFfMFRfMVIKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX2RzX2dldF9wcmVkaWNhdGVfdmFsdWUKKyAqCisgKiBQQVJBTUVURVJTOiAgd2Fsa19zdGF0ZSAgICAgIC0gQ3VycmVudCBzdGF0ZSBvZiB0aGUgcGFyc2UgdHJlZSB3YWxrCisgKiAgICAgICAgICAgICAgcmVzdWx0X29iaiAgICAgIC0gaWYgbm9uLXplcm8sIHBvcCByZXN1bHQgZnJvbSByZXN1bHQgc3RhY2sKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IEdldCB0aGUgcmVzdWx0IG9mIGEgcHJlZGljYXRlIGV2YWx1YXRpb24KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworYWNwaV9zdGF0dXMKK2FjcGlfZHNfZ2V0X3ByZWRpY2F0ZV92YWx1ZShzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlLAorCQkJICAgIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnJlc3VsdF9vYmopCit7CisJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2M7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqbG9jYWxfb2JqX2Rlc2MgPSBOVUxMOworCisJQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIoZHNfZ2V0X3ByZWRpY2F0ZV92YWx1ZSwgd2Fsa19zdGF0ZSk7CisKKwl3YWxrX3N0YXRlLT5jb250cm9sX3N0YXRlLT5jb21tb24uc3RhdGUgPSAwOworCisJaWYgKHJlc3VsdF9vYmopIHsKKwkJc3RhdHVzID0gYWNwaV9kc19yZXN1bHRfcG9wKCZvYmpfZGVzYywgd2Fsa19zdGF0ZSk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJQUNQSV9FWENFUFRJT04oKEFFX0lORk8sIHN0YXR1cywKKwkJCQkJIkNvdWxkIG5vdCBnZXQgcmVzdWx0IGZyb20gcHJlZGljYXRlIGV2YWx1YXRpb24iKSk7CisKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworCQl9CisJfSBlbHNlIHsKKwkJc3RhdHVzID0gYWNwaV9kc19jcmVhdGVfb3BlcmFuZCh3YWxrX3N0YXRlLCB3YWxrX3N0YXRlLT5vcCwgMCk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CisJCX0KKworCQlzdGF0dXMgPQorCQkgICAgYWNwaV9leF9yZXNvbHZlX3RvX3ZhbHVlKCZ3YWxrX3N0YXRlLT5vcGVyYW5kc1swXSwKKwkJCQkJICAgICB3YWxrX3N0YXRlKTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKKwkJfQorCisJCW9ial9kZXNjID0gd2Fsa19zdGF0ZS0+b3BlcmFuZHNbMF07CisJfQorCisJaWYgKCFvYmpfZGVzYykgeworCQlBQ1BJX0VSUk9SKChBRV9JTkZPLAorCQkJICAgICJObyBwcmVkaWNhdGUgT2JqRGVzYz0lcCBTdGF0ZT0lcCIsCisJCQkgICAgb2JqX2Rlc2MsIHdhbGtfc3RhdGUpKTsKKworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX05PX09QRVJBTkQpOworCX0KKworCS8qCisJICogUmVzdWx0IG9mIHByZWRpY2F0ZSBldmFsdWF0aW9uIG11c3QgYmUgYW4gSW50ZWdlcgorCSAqIG9iamVjdC4gSW1wbGljaXRseSBjb252ZXJ0IHRoZSBhcmd1bWVudCBpZiBuZWNlc3NhcnkuCisJICovCisJc3RhdHVzID0gYWNwaV9leF9jb252ZXJ0X3RvX2ludGVnZXIob2JqX2Rlc2MsICZsb2NhbF9vYmpfZGVzYywgMTYpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlnb3RvIGNsZWFudXA7CisJfQorCisJaWYgKEFDUElfR0VUX09CSkVDVF9UWVBFKGxvY2FsX29ial9kZXNjKSAhPSBBQ1BJX1RZUEVfSU5URUdFUikgeworCQlBQ1BJX0VSUk9SKChBRV9JTkZPLAorCQkJICAgICJCYWQgcHJlZGljYXRlIChub3QgYW4gaW50ZWdlcikgT2JqRGVzYz0lcCBTdGF0ZT0lcCBUeXBlPSVYIiwKKwkJCSAgICBvYmpfZGVzYywgd2Fsa19zdGF0ZSwKKwkJCSAgICBBQ1BJX0dFVF9PQkpFQ1RfVFlQRShvYmpfZGVzYykpKTsKKworCQlzdGF0dXMgPSBBRV9BTUxfT1BFUkFORF9UWVBFOworCQlnb3RvIGNsZWFudXA7CisJfQorCisJLyogVHJ1bmNhdGUgdGhlIHByZWRpY2F0ZSB0byAzMi1iaXRzIGlmIG5lY2Vzc2FyeSAqLworCisJYWNwaV9leF90cnVuY2F0ZV9mb3IzMmJpdF90YWJsZShsb2NhbF9vYmpfZGVzYyk7CisKKwkvKgorCSAqIFNhdmUgdGhlIHJlc3VsdCBvZiB0aGUgcHJlZGljYXRlIGV2YWx1YXRpb24gb24KKwkgKiB0aGUgY29udHJvbCBzdGFjaworCSAqLworCWlmIChsb2NhbF9vYmpfZGVzYy0+aW50ZWdlci52YWx1ZSkgeworCQl3YWxrX3N0YXRlLT5jb250cm9sX3N0YXRlLT5jb21tb24udmFsdWUgPSBUUlVFOworCX0gZWxzZSB7CisJCS8qCisJCSAqIFByZWRpY2F0ZSBpcyBGQUxTRSwgd2Ugd2lsbCBqdXN0IHRvc3MgdGhlCisJCSAqIHJlc3Qgb2YgdGhlIHBhY2thZ2UKKwkJICovCisJCXdhbGtfc3RhdGUtPmNvbnRyb2xfc3RhdGUtPmNvbW1vbi52YWx1ZSA9IEZBTFNFOworCQlzdGF0dXMgPSBBRV9DVFJMX0ZBTFNFOworCX0KKworCS8qIFByZWRpY2F0ZSBjYW4gYmUgdXNlZCBmb3IgYW4gaW1wbGljaXQgcmV0dXJuIHZhbHVlICovCisKKwkodm9pZClhY3BpX2RzX2RvX2ltcGxpY2l0X3JldHVybihsb2NhbF9vYmpfZGVzYywgd2Fsa19zdGF0ZSwgVFJVRSk7CisKKyAgICAgIGNsZWFudXA6CisKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VYRUMsICJDb21wbGV0ZWQgYSBwcmVkaWNhdGUgZXZhbD0lWCBPcD0lcFxuIiwKKwkJCSAgd2Fsa19zdGF0ZS0+Y29udHJvbF9zdGF0ZS0+Y29tbW9uLnZhbHVlLAorCQkJICB3YWxrX3N0YXRlLT5vcCkpOworCisJLyogQnJlYWsgdG8gZGVidWdnZXIgdG8gZGlzcGxheSByZXN1bHQgKi8KKworCUFDUElfREVCVUdHRVJfRVhFQyhhY3BpX2RiX2Rpc3BsYXlfcmVzdWx0X29iamVjdAorCQkJICAgKGxvY2FsX29ial9kZXNjLCB3YWxrX3N0YXRlKSk7CisKKwkvKgorCSAqIERlbGV0ZSB0aGUgcHJlZGljYXRlIHJlc3VsdCBvYmplY3QgKHdlIGtub3cgdGhhdAorCSAqIHdlIGRvbid0IG5lZWQgaXQgYW55bW9yZSkKKwkgKi8KKwlpZiAobG9jYWxfb2JqX2Rlc2MgIT0gb2JqX2Rlc2MpIHsKKwkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKGxvY2FsX29ial9kZXNjKTsKKwl9CisJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKG9ial9kZXNjKTsKKworCXdhbGtfc3RhdGUtPmNvbnRyb2xfc3RhdGUtPmNvbW1vbi5zdGF0ZSA9IEFDUElfQ09OVFJPTF9OT1JNQUw7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX2RzX2V4ZWNfYmVnaW5fb3AKKyAqCisgKiBQQVJBTUVURVJTOiAgd2Fsa19zdGF0ZSAgICAgIC0gQ3VycmVudCBzdGF0ZSBvZiB0aGUgcGFyc2UgdHJlZSB3YWxrCisgKiAgICAgICAgICAgICAgb3V0X29wICAgICAgICAgIC0gV2hlcmUgdG8gcmV0dXJuIG9wIGlmIGEgbmV3IG9uZSBpcyBjcmVhdGVkCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBEZXNjZW5kaW5nIGNhbGxiYWNrIHVzZWQgZHVyaW5nIHRoZSBleGVjdXRpb24gb2YgY29udHJvbAorICogICAgICAgICAgICAgIG1ldGhvZHMuICBUaGlzIGlzIHdoZXJlIG1vc3Qgb3BlcmF0b3JzIGFuZCBvcGVyYW5kcyBhcmUKKyAqICAgICAgICAgICAgICBkaXNwYXRjaGVkIHRvIHRoZSBpbnRlcnByZXRlci4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworYWNwaV9zdGF0dXMKK2FjcGlfZHNfZXhlY19iZWdpbl9vcChzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlLAorCQkgICAgICB1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqKm91dF9vcCkKK3sKKwl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqb3A7CisJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CisJdTMyIG9wY29kZV9jbGFzczsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKGRzX2V4ZWNfYmVnaW5fb3AsIHdhbGtfc3RhdGUpOworCisJb3AgPSB3YWxrX3N0YXRlLT5vcDsKKwlpZiAoIW9wKSB7CisJCXN0YXR1cyA9IGFjcGlfZHNfbG9hZDJfYmVnaW5fb3Aod2Fsa19zdGF0ZSwgb3V0X29wKTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQlnb3RvIGVycm9yX2V4aXQ7CisJCX0KKworCQlvcCA9ICpvdXRfb3A7CisJCXdhbGtfc3RhdGUtPm9wID0gb3A7CisJCXdhbGtfc3RhdGUtPm9wY29kZSA9IG9wLT5jb21tb24uYW1sX29wY29kZTsKKwkJd2Fsa19zdGF0ZS0+b3BfaW5mbyA9CisJCSAgICBhY3BpX3BzX2dldF9vcGNvZGVfaW5mbyhvcC0+Y29tbW9uLmFtbF9vcGNvZGUpOworCisJCWlmIChhY3BpX25zX29wZW5zX3Njb3BlKHdhbGtfc3RhdGUtPm9wX2luZm8tPm9iamVjdF90eXBlKSkgeworCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9ESVNQQVRDSCwKKwkJCQkJICAiKCVzKSBQb3BwaW5nIHNjb3BlIGZvciBPcCAlcFxuIiwKKwkJCQkJICBhY3BpX3V0X2dldF90eXBlX25hbWUod2Fsa19zdGF0ZS0+CisJCQkJCQkJCW9wX2luZm8tPgorCQkJCQkJCQlvYmplY3RfdHlwZSksCisJCQkJCSAgb3ApKTsKKworCQkJc3RhdHVzID0gYWNwaV9kc19zY29wZV9zdGFja19wb3Aod2Fsa19zdGF0ZSk7CisJCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCQlnb3RvIGVycm9yX2V4aXQ7CisJCQl9CisJCX0KKwl9CisKKwlpZiAob3AgPT0gd2Fsa19zdGF0ZS0+b3JpZ2luKSB7CisJCWlmIChvdXRfb3ApIHsKKwkJCSpvdXRfb3AgPSBvcDsKKwkJfQorCisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CisJfQorCisJLyoKKwkgKiBJZiB0aGUgcHJldmlvdXMgb3Bjb2RlIHdhcyBhIGNvbmRpdGlvbmFsLCB0aGlzIG9wY29kZQorCSAqIG11c3QgYmUgdGhlIGJlZ2lubmluZyBvZiB0aGUgYXNzb2NpYXRlZCBwcmVkaWNhdGUuCisJICogU2F2ZSB0aGlzIGtub3dsZWRnZSBpbiB0aGUgY3VycmVudCBzY29wZSBkZXNjcmlwdG9yCisJICovCisJaWYgKCh3YWxrX3N0YXRlLT5jb250cm9sX3N0YXRlKSAmJgorCSAgICAod2Fsa19zdGF0ZS0+Y29udHJvbF9zdGF0ZS0+Y29tbW9uLnN0YXRlID09CisJICAgICBBQ1BJX0NPTlRST0xfQ09ORElUSU9OQUxfRVhFQ1VUSU5HKSkgeworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VYRUMsCisJCQkJICAiRXhlYyBwcmVkaWNhdGUgT3A9JXAgU3RhdGU9JXBcbiIsIG9wLAorCQkJCSAgd2Fsa19zdGF0ZSkpOworCisJCXdhbGtfc3RhdGUtPmNvbnRyb2xfc3RhdGUtPmNvbW1vbi5zdGF0ZSA9CisJCSAgICBBQ1BJX0NPTlRST0xfUFJFRElDQVRFX0VYRUNVVElORzsKKworCQkvKiBTYXZlIHN0YXJ0IG9mIHByZWRpY2F0ZSAqLworCisJCXdhbGtfc3RhdGUtPmNvbnRyb2xfc3RhdGUtPmNvbnRyb2wucHJlZGljYXRlX29wID0gb3A7CisJfQorCisJb3Bjb2RlX2NsYXNzID0gd2Fsa19zdGF0ZS0+b3BfaW5mby0+Y2xhc3M7CisKKwkvKiBXZSB3YW50IHRvIHNlbmQgbmFtZXBhdGhzIHRvIHRoZSBsb2FkIGNvZGUgKi8KKworCWlmIChvcC0+Y29tbW9uLmFtbF9vcGNvZGUgPT0gQU1MX0lOVF9OQU1FUEFUSF9PUCkgeworCQlvcGNvZGVfY2xhc3MgPSBBTUxfQ0xBU1NfTkFNRURfT0JKRUNUOworCX0KKworCS8qCisJICogSGFuZGxlIHRoZSBvcGNvZGUgYmFzZWQgdXBvbiB0aGUgb3Bjb2RlIHR5cGUKKwkgKi8KKwlzd2l0Y2ggKG9wY29kZV9jbGFzcykgeworCWNhc2UgQU1MX0NMQVNTX0NPTlRST0w6CisKKwkJc3RhdHVzID0gYWNwaV9kc19leGVjX2JlZ2luX2NvbnRyb2xfb3Aod2Fsa19zdGF0ZSwgb3ApOworCQlicmVhazsKKworCWNhc2UgQU1MX0NMQVNTX05BTUVEX09CSkVDVDoKKworCQlpZiAod2Fsa19zdGF0ZS0+d2Fsa190eXBlICYgQUNQSV9XQUxLX01FVEhPRCkgeworCQkJLyoKKwkJCSAqIEZvdW5kIGEgbmFtZWQgb2JqZWN0IGRlY2xhcmF0aW9uIGR1cmluZyBtZXRob2QgZXhlY3V0aW9uOworCQkJICogd2UgbXVzdCBlbnRlciB0aGlzIG9iamVjdCBpbnRvIHRoZSBuYW1lc3BhY2UuICBUaGUgY3JlYXRlZAorCQkJICogb2JqZWN0IGlzIHRlbXBvcmFyeSBhbmQgd2lsbCBiZSBkZWxldGVkIHVwb24gY29tcGxldGlvbiBvZgorCQkJICogdGhlIGV4ZWN1dGlvbiBvZiB0aGlzIG1ldGhvZC4KKwkJCSAqLworCQkJc3RhdHVzID0gYWNwaV9kc19sb2FkMl9iZWdpbl9vcCh3YWxrX3N0YXRlLCBOVUxMKTsKKwkJfQorCisJCWJyZWFrOworCisJY2FzZSBBTUxfQ0xBU1NfRVhFQ1VURToKKwljYXNlIEFNTF9DTEFTU19DUkVBVEU6CisKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwkvKiBOb3RoaW5nIHRvIGRvIGhlcmUgZHVyaW5nIG1ldGhvZCBleGVjdXRpb24gKi8KKworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworCisgICAgICBlcnJvcl9leGl0OgorCXN0YXR1cyA9IGFjcGlfZHNfbWV0aG9kX2Vycm9yKHN0YXR1cywgd2Fsa19zdGF0ZSk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX2RzX2V4ZWNfZW5kX29wCisgKgorICogUEFSQU1FVEVSUzogIHdhbGtfc3RhdGUgICAgICAtIEN1cnJlbnQgc3RhdGUgb2YgdGhlIHBhcnNlIHRyZWUgd2FsaworICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogQXNjZW5kaW5nIGNhbGxiYWNrIHVzZWQgZHVyaW5nIHRoZSBleGVjdXRpb24gb2YgY29udHJvbAorICogICAgICAgICAgICAgIG1ldGhvZHMuICBUaGUgb25seSB0aGluZyB3ZSByZWFsbHkgbmVlZCB0byBkbyBoZXJlIGlzIHRvCisgKiAgICAgICAgICAgICAgbm90aWNlIHRoZSBiZWdpbm5pbmcgb2YgSUYsIEVMU0UsIGFuZCBXSElMRSBibG9ja3MuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2FjcGlfc3RhdHVzIGFjcGlfZHNfZXhlY19lbmRfb3Aoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSkKK3sKKwl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqb3A7CisJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CisJdTMyIG9wX3R5cGU7CisJdTMyIG9wX2NsYXNzOworCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpuZXh0X29wOworCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpmaXJzdF9hcmc7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUihkc19leGVjX2VuZF9vcCwgd2Fsa19zdGF0ZSk7CisKKwlvcCA9IHdhbGtfc3RhdGUtPm9wOworCW9wX3R5cGUgPSB3YWxrX3N0YXRlLT5vcF9pbmZvLT50eXBlOworCW9wX2NsYXNzID0gd2Fsa19zdGF0ZS0+b3BfaW5mby0+Y2xhc3M7CisKKwlpZiAob3BfY2xhc3MgPT0gQU1MX0NMQVNTX1VOS05PV04pIHsKKwkJQUNQSV9FUlJPUigoQUVfSU5GTywgIlVua25vd24gb3Bjb2RlICVYIiwKKwkJCSAgICBvcC0+Y29tbW9uLmFtbF9vcGNvZGUpKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PVF9JTVBMRU1FTlRFRCk7CisJfQorCisJZmlyc3RfYXJnID0gb3AtPmNvbW1vbi52YWx1ZS5hcmc7CisKKwkvKiBJbml0IHRoZSB3YWxrIHN0YXRlICovCisKKwl3YWxrX3N0YXRlLT5udW1fb3BlcmFuZHMgPSAwOworCXdhbGtfc3RhdGUtPm9wZXJhbmRfaW5kZXggPSAwOworCXdhbGtfc3RhdGUtPnJldHVybl9kZXNjID0gTlVMTDsKKwl3YWxrX3N0YXRlLT5yZXN1bHRfb2JqID0gTlVMTDsKKworCS8qIENhbGwgZGVidWdnZXIgZm9yIHNpbmdsZSBzdGVwIHN1cHBvcnQgKERFQlVHIGJ1aWxkIG9ubHkpICovCisKKwlBQ1BJX0RFQlVHR0VSX0VYRUMoc3RhdHVzID0KKwkJCSAgIGFjcGlfZGJfc2luZ2xlX3N0ZXAod2Fsa19zdGF0ZSwgb3AsIG9wX2NsYXNzKSk7CisJQUNQSV9ERUJVR0dFUl9FWEVDKGlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJICAgcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7fQorCSkgOworCisJLyogRGVjb2RlIHRoZSBPcGNvZGUgQ2xhc3MgKi8KKworCXN3aXRjaCAob3BfY2xhc3MpIHsKKwljYXNlIEFNTF9DTEFTU19BUkdVTUVOVDoJLyogQ29uc3RhbnRzLCBsaXRlcmFscywgZXRjLiAqLworCisJCWlmICh3YWxrX3N0YXRlLT5vcGNvZGUgPT0gQU1MX0lOVF9OQU1FUEFUSF9PUCkgeworCQkJc3RhdHVzID0gYWNwaV9kc19ldmFsdWF0ZV9uYW1lX3BhdGgod2Fsa19zdGF0ZSk7CisJCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCQlnb3RvIGNsZWFudXA7CisJCQl9CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIEFNTF9DTEFTU19FWEVDVVRFOgkvKiBNb3N0IG9wZXJhdG9ycyB3aXRoIGFyZ3VtZW50cyAqLworCisJCS8qIEJ1aWxkIHJlc29sdmVkIG9wZXJhbmQgc3RhY2sgKi8KKworCQlzdGF0dXMgPSBhY3BpX2RzX2NyZWF0ZV9vcGVyYW5kcyh3YWxrX3N0YXRlLCBmaXJzdF9hcmcpOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCWdvdG8gY2xlYW51cDsKKwkJfQorCisJCS8qCisJCSAqIEFsbCBvcGNvZGVzIHJlcXVpcmUgb3BlcmFuZCByZXNvbHV0aW9uLCB3aXRoIHRoZSBvbmx5IGV4Y2VwdGlvbnMKKwkJICogYmVpbmcgdGhlIG9iamVjdF90eXBlIGFuZCBzaXplX29mIG9wZXJhdG9ycy4KKwkJICovCisJCWlmICghKHdhbGtfc3RhdGUtPm9wX2luZm8tPmZsYWdzICYgQU1MX05PX09QRVJBTkRfUkVTT0xWRSkpIHsKKworCQkJLyogUmVzb2x2ZSBhbGwgb3BlcmFuZHMgKi8KKworCQkJc3RhdHVzID0gYWNwaV9leF9yZXNvbHZlX29wZXJhbmRzKHdhbGtfc3RhdGUtPm9wY29kZSwKKwkJCQkJCQkgICYod2Fsa19zdGF0ZS0+CisJCQkJCQkJICAgIG9wZXJhbmRzCisJCQkJCQkJICAgIFt3YWxrX3N0YXRlLT4KKwkJCQkJCQkgICAgIG51bV9vcGVyYW5kcyAtIDFdKSwKKwkJCQkJCQkgIHdhbGtfc3RhdGUpOworCQl9CisKKwkJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCQkvKgorCQkJICogRGlzcGF0Y2ggdGhlIHJlcXVlc3QgdG8gdGhlIGFwcHJvcHJpYXRlIGludGVycHJldGVyIGhhbmRsZXIKKwkJCSAqIHJvdXRpbmUuICBUaGVyZSBpcyBvbmUgcm91dGluZSBwZXIgb3Bjb2RlICJ0eXBlIiBiYXNlZCB1cG9uIHRoZQorCQkJICogbnVtYmVyIG9mIG9wY29kZSBhcmd1bWVudHMgYW5kIHJldHVybiB0eXBlLgorCQkJICovCisJCQlzdGF0dXMgPQorCQkJICAgIGFjcGlfZ2JsX29wX3R5cGVfZGlzcGF0Y2hbb3BfdHlwZV0gKHdhbGtfc3RhdGUpOworCQl9IGVsc2UgeworCQkJLyoKKwkJCSAqIFRyZWF0IGNvbnN0cnVjdHMgb2YgdGhlIGZvcm0gIlN0b3JlKExvY2FsWCxMb2NhbFgpIiBhcyBub29wcyB3aGVuIHRoZQorCQkJICogTG9jYWwgaXMgdW5pbml0aWFsaXplZC4KKwkJCSAqLworCQkJaWYgKChzdGF0dXMgPT0gQUVfQU1MX1VOSU5JVElBTElaRURfTE9DQUwpICYmCisJCQkgICAgKHdhbGtfc3RhdGUtPm9wY29kZSA9PSBBTUxfU1RPUkVfT1ApICYmCisJCQkgICAgKHdhbGtfc3RhdGUtPm9wZXJhbmRzWzBdLT5jb21tb24udHlwZSA9PQorCQkJICAgICBBQ1BJX1RZUEVfTE9DQUxfUkVGRVJFTkNFKQorCQkJICAgICYmICh3YWxrX3N0YXRlLT5vcGVyYW5kc1sxXS0+Y29tbW9uLnR5cGUgPT0KKwkJCQlBQ1BJX1RZUEVfTE9DQUxfUkVGRVJFTkNFKQorCQkJICAgICYmICh3YWxrX3N0YXRlLT5vcGVyYW5kc1swXS0+cmVmZXJlbmNlLmNsYXNzID09CisJCQkJd2Fsa19zdGF0ZS0+b3BlcmFuZHNbMV0tPnJlZmVyZW5jZS5jbGFzcykKKwkJCSAgICAmJiAod2Fsa19zdGF0ZS0+b3BlcmFuZHNbMF0tPnJlZmVyZW5jZS52YWx1ZSA9PQorCQkJCXdhbGtfc3RhdGUtPm9wZXJhbmRzWzFdLT5yZWZlcmVuY2UudmFsdWUpKSB7CisJCQkJc3RhdHVzID0gQUVfT0s7CisJCQl9IGVsc2UgeworCQkJCUFDUElfRVhDRVBUSU9OKChBRV9JTkZPLCBzdGF0dXMsCisJCQkJCQkiV2hpbGUgcmVzb2x2aW5nIG9wZXJhbmRzIGZvciBbJXNdIiwKKwkJCQkJCWFjcGlfcHNfZ2V0X29wY29kZV9uYW1lCisJCQkJCQkod2Fsa19zdGF0ZS0+b3Bjb2RlKSkpOworCQkJfQorCQl9CisKKwkJLyogQWx3YXlzIGRlbGV0ZSB0aGUgYXJndW1lbnQgb2JqZWN0cyBhbmQgY2xlYXIgdGhlIG9wZXJhbmQgc3RhY2sgKi8KKworCQlhY3BpX2RzX2NsZWFyX29wZXJhbmRzKHdhbGtfc3RhdGUpOworCisJCS8qCisJCSAqIElmIGEgcmVzdWx0IG9iamVjdCB3YXMgcmV0dXJuZWQgZnJvbSBhYm92ZSwgcHVzaCBpdCBvbiB0aGUKKwkJICogY3VycmVudCByZXN1bHQgc3RhY2sKKwkJICovCisJCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSAmJiB3YWxrX3N0YXRlLT5yZXN1bHRfb2JqKSB7CisJCQlzdGF0dXMgPQorCQkJICAgIGFjcGlfZHNfcmVzdWx0X3B1c2god2Fsa19zdGF0ZS0+cmVzdWx0X29iaiwKKwkJCQkJCXdhbGtfc3RhdGUpOworCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKworCQlzd2l0Y2ggKG9wX3R5cGUpIHsKKwkJY2FzZSBBTUxfVFlQRV9DT05UUk9MOgkvKiBUeXBlIDEgb3Bjb2RlLCBJRi9FTFNFL1dISUxFL05PT1AgKi8KKworCQkJLyogMSBPcGVyYW5kLCAwIGV4dGVybmFsX3Jlc3VsdCwgMCBpbnRlcm5hbF9yZXN1bHQgKi8KKworCQkJc3RhdHVzID0gYWNwaV9kc19leGVjX2VuZF9jb250cm9sX29wKHdhbGtfc3RhdGUsIG9wKTsKKworCQkJYnJlYWs7CisKKwkJY2FzZSBBTUxfVFlQRV9NRVRIT0RfQ0FMTDoKKworCQkJLyoKKwkJCSAqIElmIHRoZSBtZXRob2QgaXMgcmVmZXJlbmNlZCBmcm9tIHdpdGhpbiBhIHBhY2thZ2UKKwkJCSAqIGRlY2xhcmF0aW9uLCBpdCBpcyBub3QgYSBpbnZvY2F0aW9uIG9mIHRoZSBtZXRob2QsIGp1c3QKKwkJCSAqIGEgcmVmZXJlbmNlIHRvIGl0LgorCQkJICovCisJCQlpZiAoKG9wLT5hc2wucGFyZW50KSAmJgorCQkJICAgICgob3AtPmFzbC5wYXJlbnQtPmFzbC5hbWxfb3Bjb2RlID09IEFNTF9QQUNLQUdFX09QKQorCQkJICAgICB8fCAob3AtPmFzbC5wYXJlbnQtPmFzbC5hbWxfb3Bjb2RlID09CisJCQkJIEFNTF9WQVJfUEFDS0FHRV9PUCkpKSB7CisJCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9ESVNQQVRDSCwKKwkJCQkJCSAgIk1ldGhvZCBSZWZlcmVuY2UgaW4gYSBQYWNrYWdlLCBPcD0lcFxuIiwKKwkJCQkJCSAgb3ApKTsKKworCQkJCW9wLT5jb21tb24ubm9kZSA9CisJCQkJICAgIChzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqKW9wLT5hc2wudmFsdWUuCisJCQkJICAgIGFyZy0+YXNsLm5vZGU7CisJCQkJYWNwaV91dF9hZGRfcmVmZXJlbmNlKG9wLT5hc2wudmFsdWUuYXJnLT5hc2wuCisJCQkJCQkgICAgICBub2RlLT5vYmplY3QpOworCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CisJCQl9CisKKwkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRElTUEFUQ0gsCisJCQkJCSAgIk1ldGhvZCBpbnZvY2F0aW9uLCBPcD0lcFxuIiwgb3ApKTsKKworCQkJLyoKKwkJCSAqIChBTUxfTUVUSE9EQ0FMTCkgT3AtPkFzbC5WYWx1ZS5BcmctPkFzbC5Ob2RlIGNvbnRhaW5zCisJCQkgKiB0aGUgbWV0aG9kIE5vZGUgcG9pbnRlcgorCQkJICovCisJCQkvKiBuZXh0X29wIHBvaW50cyB0byB0aGUgb3AgdGhhdCBob2xkcyB0aGUgbWV0aG9kIG5hbWUgKi8KKworCQkJbmV4dF9vcCA9IGZpcnN0X2FyZzsKKworCQkJLyogbmV4dF9vcCBwb2ludHMgdG8gZmlyc3QgYXJndW1lbnQgb3AgKi8KKworCQkJbmV4dF9vcCA9IG5leHRfb3AtPmNvbW1vbi5uZXh0OworCisJCQkvKgorCQkJICogR2V0IHRoZSBtZXRob2QncyBhcmd1bWVudHMgYW5kIHB1dCB0aGVtIG9uIHRoZSBvcGVyYW5kIHN0YWNrCisJCQkgKi8KKwkJCXN0YXR1cyA9IGFjcGlfZHNfY3JlYXRlX29wZXJhbmRzKHdhbGtfc3RhdGUsIG5leHRfb3ApOworCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCS8qCisJCQkgKiBTaW5jZSB0aGUgb3BlcmFuZHMgd2lsbCBiZSBwYXNzZWQgdG8gYW5vdGhlciBjb250cm9sIG1ldGhvZCwKKwkJCSAqIHdlIG11c3QgcmVzb2x2ZSBhbGwgbG9jYWwgcmVmZXJlbmNlcyBoZXJlIChMb2NhbCB2YXJpYWJsZXMsCisJCQkgKiBhcmd1bWVudHMgdG8gKnRoaXMqIG1ldGhvZCwgZXRjLikKKwkJCSAqLworCQkJc3RhdHVzID0gYWNwaV9kc19yZXNvbHZlX29wZXJhbmRzKHdhbGtfc3RhdGUpOworCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisKKwkJCQkvKiBPbiBlcnJvciwgY2xlYXIgYWxsIHJlc29sdmVkIG9wZXJhbmRzICovCisKKwkJCQlhY3BpX2RzX2NsZWFyX29wZXJhbmRzKHdhbGtfc3RhdGUpOworCQkJCWJyZWFrOworCQkJfQorCisJCQkvKgorCQkJICogVGVsbCB0aGUgd2FsayBsb29wIHRvIHByZWVtcHQgdGhpcyBydW5uaW5nIG1ldGhvZCBhbmQKKwkJCSAqIGV4ZWN1dGUgdGhlIG5ldyBtZXRob2QKKwkJCSAqLworCQkJc3RhdHVzID0gQUVfQ1RSTF9UUkFOU0ZFUjsKKworCQkJLyoKKwkJCSAqIFJldHVybiBub3c7IHdlIGRvbid0IHdhbnQgdG8gZGlzdHVyYiBhbnl0aGluZywKKwkJCSAqIGVzcGVjaWFsbHkgdGhlIG9wZXJhbmQgY291bnQhCisJCQkgKi8KKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworCisJCWNhc2UgQU1MX1RZUEVfQ1JFQVRFX0ZJRUxEOgorCisJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VYRUMsCisJCQkJCSAgIkV4ZWN1dGluZyBDcmVhdGVGaWVsZCBCdWZmZXIvSW5kZXggT3A9JXBcbiIsCisJCQkJCSAgb3ApKTsKKworCQkJc3RhdHVzID0gYWNwaV9kc19sb2FkMl9lbmRfb3Aod2Fsa19zdGF0ZSk7CisJCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJc3RhdHVzID0KKwkJCSAgICBhY3BpX2RzX2V2YWxfYnVmZmVyX2ZpZWxkX29wZXJhbmRzKHdhbGtfc3RhdGUsIG9wKTsKKwkJCWJyZWFrOworCisJCWNhc2UgQU1MX1RZUEVfQ1JFQVRFX09CSkVDVDoKKworCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FWEVDLAorCQkJCQkgICJFeGVjdXRpbmcgQ3JlYXRlT2JqZWN0IChCdWZmZXIvUGFja2FnZSkgT3A9JXBcbiIsCisJCQkJCSAgb3ApKTsKKworCQkJc3dpdGNoIChvcC0+Y29tbW9uLnBhcmVudC0+Y29tbW9uLmFtbF9vcGNvZGUpIHsKKwkJCWNhc2UgQU1MX05BTUVfT1A6CisKKwkJCQkvKgorCQkJCSAqIFB1dCB0aGUgTm9kZSBvbiB0aGUgb2JqZWN0IHN0YWNrIChDb250YWlucyB0aGUgQUNQSSBOYW1lCisJCQkJICogb2YgdGhpcyBvYmplY3QpCisJCQkJICovCisJCQkJd2Fsa19zdGF0ZS0+b3BlcmFuZHNbMF0gPQorCQkJCSAgICAodm9pZCAqKW9wLT5jb21tb24ucGFyZW50LT5jb21tb24ubm9kZTsKKwkJCQl3YWxrX3N0YXRlLT5udW1fb3BlcmFuZHMgPSAxOworCisJCQkJc3RhdHVzID0gYWNwaV9kc19jcmVhdGVfbm9kZSh3YWxrX3N0YXRlLAorCQkJCQkJCSAgICAgb3AtPmNvbW1vbi5wYXJlbnQtPgorCQkJCQkJCSAgICAgY29tbW9uLm5vZGUsCisJCQkJCQkJICAgICBvcC0+Y29tbW9uLnBhcmVudCk7CisJCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8qIEZhbGwgdGhyb3VnaCAqLworCQkJCS8qbGludCAtZmFsbHRocm91Z2ggKi8KKworCQkJY2FzZSBBTUxfSU5UX0VWQUxfU1VCVFJFRV9PUDoKKworCQkJCXN0YXR1cyA9CisJCQkJICAgIGFjcGlfZHNfZXZhbF9kYXRhX29iamVjdF9vcGVyYW5kcworCQkJCSAgICAod2Fsa19zdGF0ZSwgb3AsCisJCQkJICAgICBhY3BpX25zX2dldF9hdHRhY2hlZF9vYmplY3Qob3AtPmNvbW1vbi4KKwkJCQkJCQkJIHBhcmVudC0+Y29tbW9uLgorCQkJCQkJCQkgbm9kZSkpOworCQkJCWJyZWFrOworCisJCQlkZWZhdWx0OgorCisJCQkJc3RhdHVzID0KKwkJCQkgICAgYWNwaV9kc19ldmFsX2RhdGFfb2JqZWN0X29wZXJhbmRzCisJCQkJICAgICh3YWxrX3N0YXRlLCBvcCwgTlVMTCk7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCS8qCisJCQkgKiBJZiBhIHJlc3VsdCBvYmplY3Qgd2FzIHJldHVybmVkIGZyb20gYWJvdmUsIHB1c2ggaXQgb24gdGhlCisJCQkgKiBjdXJyZW50IHJlc3VsdCBzdGFjaworCQkJICovCisJCQlpZiAod2Fsa19zdGF0ZS0+cmVzdWx0X29iaikgeworCQkJCXN0YXR1cyA9CisJCQkJICAgIGFjcGlfZHNfcmVzdWx0X3B1c2god2Fsa19zdGF0ZS0+cmVzdWx0X29iaiwKKwkJCQkJCQl3YWxrX3N0YXRlKTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgQU1MX1RZUEVfTkFNRURfRklFTEQ6CisJCWNhc2UgQU1MX1RZUEVfTkFNRURfQ09NUExFWDoKKwkJY2FzZSBBTUxfVFlQRV9OQU1FRF9TSU1QTEU6CisJCWNhc2UgQU1MX1RZUEVfTkFNRURfTk9fT0JKOgorCisJCQlzdGF0dXMgPSBhY3BpX2RzX2xvYWQyX2VuZF9vcCh3YWxrX3N0YXRlKTsKKwkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJCWJyZWFrOworCQkJfQorCisJCQlpZiAob3AtPmNvbW1vbi5hbWxfb3Bjb2RlID09IEFNTF9SRUdJT05fT1ApIHsKKwkJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VYRUMsCisJCQkJCQkgICJFeGVjdXRpbmcgT3BSZWdpb24gQWRkcmVzcy9MZW5ndGggT3A9JXBcbiIsCisJCQkJCQkgIG9wKSk7CisKKwkJCQlzdGF0dXMgPQorCQkJCSAgICBhY3BpX2RzX2V2YWxfcmVnaW9uX29wZXJhbmRzKHdhbGtfc3RhdGUsCisJCQkJCQkJCSBvcCk7CisJCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0gZWxzZSBpZiAob3AtPmNvbW1vbi5hbWxfb3Bjb2RlID09IEFNTF9EQVRBX1JFR0lPTl9PUCkgeworCQkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVhFQywKKwkJCQkJCSAgIkV4ZWN1dGluZyBEYXRhVGFibGVSZWdpb24gU3RyaW5ncyBPcD0lcFxuIiwKKwkJCQkJCSAgb3ApKTsKKworCQkJCXN0YXR1cyA9CisJCQkJICAgIGFjcGlfZHNfZXZhbF90YWJsZV9yZWdpb25fb3BlcmFuZHMKKwkJCQkgICAgKHdhbGtfc3RhdGUsIG9wKTsKKwkJCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfSBlbHNlIGlmIChvcC0+Y29tbW9uLmFtbF9vcGNvZGUgPT0gQU1MX0JBTktfRklFTERfT1ApIHsKKwkJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VYRUMsCisJCQkJCQkgICJFeGVjdXRpbmcgQmFua0ZpZWxkIE9wPSVwXG4iLAorCQkJCQkJICBvcCkpOworCisJCQkJc3RhdHVzID0KKwkJCQkgICAgYWNwaV9kc19ldmFsX2JhbmtfZmllbGRfb3BlcmFuZHMod2Fsa19zdGF0ZSwKKwkJCQkJCQkJICAgICBvcCk7CisJCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgQU1MX1RZUEVfVU5ERUZJTkVEOgorCisJCQlBQ1BJX0VSUk9SKChBRV9JTkZPLAorCQkJCSAgICAiVW5kZWZpbmVkIG9wY29kZSB0eXBlIE9wPSVwIiwgb3ApKTsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT1RfSU1QTEVNRU5URUQpOworCisJCWNhc2UgQU1MX1RZUEVfQk9HVVM6CisKKwkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRElTUEFUQ0gsCisJCQkJCSAgIkludGVybmFsIG9wY29kZT0lWCB0eXBlIE9wPSVwXG4iLAorCQkJCQkgIHdhbGtfc3RhdGUtPm9wY29kZSwgb3ApKTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisKKwkJCUFDUElfRVJST1IoKEFFX0lORk8sCisJCQkJICAgICJVbmltcGxlbWVudGVkIG9wY29kZSwgY2xhc3M9JVggdHlwZT0lWCBPcGNvZGU9JVggT3A9JXAiLAorCQkJCSAgICBvcF9jbGFzcywgb3BfdHlwZSwgb3AtPmNvbW1vbi5hbWxfb3Bjb2RlLAorCQkJCSAgICBvcCkpOworCisJCQlzdGF0dXMgPSBBRV9OT1RfSU1QTEVNRU5URUQ7CisJCQlicmVhazsKKwkJfQorCX0KKworCS8qCisJICogQUNQSSAyLjAgc3VwcG9ydCBmb3IgNjQtYml0IGludGVnZXJzOiBUcnVuY2F0ZSBudW1lcmljCisJICogcmVzdWx0IHZhbHVlIGlmIHdlIGFyZSBleGVjdXRpbmcgZnJvbSBhIDMyLWJpdCBBQ1BJIHRhYmxlCisJICovCisJYWNwaV9leF90cnVuY2F0ZV9mb3IzMmJpdF90YWJsZSh3YWxrX3N0YXRlLT5yZXN1bHRfb2JqKTsKKworCS8qCisJICogQ2hlY2sgaWYgd2UganVzdCBjb21wbGV0ZWQgdGhlIGV2YWx1YXRpb24gb2YgYQorCSAqIGNvbmRpdGlvbmFsIHByZWRpY2F0ZQorCSAqLworCWlmICgoQUNQSV9TVUNDRVNTKHN0YXR1cykpICYmCisJICAgICh3YWxrX3N0YXRlLT5jb250cm9sX3N0YXRlKSAmJgorCSAgICAod2Fsa19zdGF0ZS0+Y29udHJvbF9zdGF0ZS0+Y29tbW9uLnN0YXRlID09CisJICAgICBBQ1BJX0NPTlRST0xfUFJFRElDQVRFX0VYRUNVVElORykgJiYKKwkgICAgKHdhbGtfc3RhdGUtPmNvbnRyb2xfc3RhdGUtPmNvbnRyb2wucHJlZGljYXRlX29wID09IG9wKSkgeworCQlzdGF0dXMgPQorCQkgICAgYWNwaV9kc19nZXRfcHJlZGljYXRlX3ZhbHVlKHdhbGtfc3RhdGUsCisJCQkJCQl3YWxrX3N0YXRlLT5yZXN1bHRfb2JqKTsKKwkJd2Fsa19zdGF0ZS0+cmVzdWx0X29iaiA9IE5VTEw7CisJfQorCisgICAgICBjbGVhbnVwOgorCisJaWYgKHdhbGtfc3RhdGUtPnJlc3VsdF9vYmopIHsKKworCQkvKiBCcmVhayB0byBkZWJ1Z2dlciB0byBkaXNwbGF5IHJlc3VsdCAqLworCisJCUFDUElfREVCVUdHRVJfRVhFQyhhY3BpX2RiX2Rpc3BsYXlfcmVzdWx0X29iamVjdAorCQkJCSAgICh3YWxrX3N0YXRlLT5yZXN1bHRfb2JqLCB3YWxrX3N0YXRlKSk7CisKKwkJLyoKKwkJICogRGVsZXRlIHRoZSByZXN1bHQgb3AgaWYgYW5kIG9ubHkgaWY6CisJCSAqIFBhcmVudCB3aWxsIG5vdCB1c2UgdGhlIHJlc3VsdCAtLSBzdWNoIGFzIGFueQorCQkgKiBub24tbmVzdGVkIHR5cGUyIG9wIGluIGEgbWV0aG9kIChwYXJlbnQgd2lsbCBiZSBtZXRob2QpCisJCSAqLworCQlhY3BpX2RzX2RlbGV0ZV9yZXN1bHRfaWZfbm90X3VzZWQob3AsIHdhbGtfc3RhdGUtPnJlc3VsdF9vYmosCisJCQkJCQkgIHdhbGtfc3RhdGUpOworCX0KKyNpZmRlZiBfVU5ERVJfREVWRUxPUE1FTlQKKworCWlmICh3YWxrX3N0YXRlLT5wYXJzZXJfc3RhdGUuYW1sID09IHdhbGtfc3RhdGUtPnBhcnNlcl9zdGF0ZS5hbWxfZW5kKSB7CisJCWFjcGlfZGJfbWV0aG9kX2VuZCh3YWxrX3N0YXRlKTsKKwl9CisjZW5kaWYKKworCS8qIEludm9rZSBleGNlcHRpb24gaGFuZGxlciBvbiBlcnJvciAqLworCisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXN0YXR1cyA9IGFjcGlfZHNfbWV0aG9kX2Vycm9yKHN0YXR1cywgd2Fsa19zdGF0ZSk7CisJfQorCisJLyogQWx3YXlzIGNsZWFyIHRoZSBvYmplY3Qgc3RhY2sgKi8KKworCXdhbGtfc3RhdGUtPm51bV9vcGVyYW5kcyA9IDA7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2Rzd2xvYWQuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvZHN3bG9hZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwMjNjZWEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2Rzd2xvYWQuYwpAQCAtMCwwICsxLDEyMDMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBNb2R1bGUgTmFtZTogZHN3bG9hZCAtIERpc3BhdGNoZXIgbmFtZXNwYWNlIGxvYWQgY2FsbGJhY2tzCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwOCwgSW50ZWwgQ29ycC4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKKyAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIGF0IG1pbmltdW0gYSBkaXNjbGFpbWVyCisgKiAgICBzdWJzdGFudGlhbGx5IHNpbWlsYXIgdG8gdGhlICJOTyBXQVJSQU5UWSIgZGlzY2xhaW1lciBiZWxvdworICogICAgKCJEaXNjbGFpbWVyIikgYW5kIGFueSByZWRpc3RyaWJ1dGlvbiBtdXN0IGJlIGNvbmRpdGlvbmVkIHVwb24KKyAqICAgIGluY2x1ZGluZyBhIHN1YnN0YW50aWFsbHkgc2ltaWxhciBEaXNjbGFpbWVyIHJlcXVpcmVtZW50IGZvciBmdXJ0aGVyCisgKiAgICBiaW5hcnkgcmVkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMKKyAqICAgIG9mIGFueSBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogTk8gV0FSUkFOVFkKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HCisgKiBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KKyAqLworCisjaW5jbHVkZSA8YWNwaS9hY3BpLmg+CisjaW5jbHVkZSAiYWNjb21tb24uaCIKKyNpbmNsdWRlICJhY3BhcnNlci5oIgorI2luY2x1ZGUgImFtbGNvZGUuaCIKKyNpbmNsdWRlICJhY2Rpc3BhdC5oIgorI2luY2x1ZGUgImFjaW50ZXJwLmgiCisjaW5jbHVkZSAiYWNuYW1lc3AuaCIKKyNpbmNsdWRlICJhY2V2ZW50cy5oIgorCisjaWZkZWYgQUNQSV9BU0xfQ09NUElMRVIKKyNpbmNsdWRlIDxhY3BpL2FjZGlzYXNtLmg+CisjZW5kaWYKKworI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfRElTUEFUQ0hFUgorQUNQSV9NT0RVTEVfTkFNRSgiZHN3bG9hZCIpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfZHNfaW5pdF9jYWxsYmFja3MKKyAqCisgKiBQQVJBTUVURVJTOiAgd2Fsa19zdGF0ZSAgICAgIC0gQ3VycmVudCBzdGF0ZSBvZiB0aGUgcGFyc2UgdHJlZSB3YWxrCisgKiAgICAgICAgICAgICAgcGFzc19udW1iZXIgICAgIC0gMSwgMiwgb3IgMworICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogSW5pdCB3YWxrIHN0YXRlIGNhbGxiYWNrcworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCithY3BpX3N0YXR1cworYWNwaV9kc19pbml0X2NhbGxiYWNrcyhzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlLCB1MzIgcGFzc19udW1iZXIpCit7CisKKwlzd2l0Y2ggKHBhc3NfbnVtYmVyKSB7CisJY2FzZSAxOgorCQl3YWxrX3N0YXRlLT5wYXJzZV9mbGFncyA9IEFDUElfUEFSU0VfTE9BRF9QQVNTMSB8CisJCSAgICBBQ1BJX1BBUlNFX0RFTEVURV9UUkVFOworCQl3YWxrX3N0YXRlLT5kZXNjZW5kaW5nX2NhbGxiYWNrID0gYWNwaV9kc19sb2FkMV9iZWdpbl9vcDsKKwkJd2Fsa19zdGF0ZS0+YXNjZW5kaW5nX2NhbGxiYWNrID0gYWNwaV9kc19sb2FkMV9lbmRfb3A7CisJCWJyZWFrOworCisJY2FzZSAyOgorCQl3YWxrX3N0YXRlLT5wYXJzZV9mbGFncyA9IEFDUElfUEFSU0VfTE9BRF9QQVNTMSB8CisJCSAgICBBQ1BJX1BBUlNFX0RFTEVURV9UUkVFOworCQl3YWxrX3N0YXRlLT5kZXNjZW5kaW5nX2NhbGxiYWNrID0gYWNwaV9kc19sb2FkMl9iZWdpbl9vcDsKKwkJd2Fsa19zdGF0ZS0+YXNjZW5kaW5nX2NhbGxiYWNrID0gYWNwaV9kc19sb2FkMl9lbmRfb3A7CisJCWJyZWFrOworCisJY2FzZSAzOgorI2lmbmRlZiBBQ1BJX05PX01FVEhPRF9FWEVDVVRJT04KKwkJd2Fsa19zdGF0ZS0+cGFyc2VfZmxhZ3MgfD0gQUNQSV9QQVJTRV9FWEVDVVRFIHwKKwkJICAgIEFDUElfUEFSU0VfREVMRVRFX1RSRUU7CisJCXdhbGtfc3RhdGUtPmRlc2NlbmRpbmdfY2FsbGJhY2sgPSBhY3BpX2RzX2V4ZWNfYmVnaW5fb3A7CisJCXdhbGtfc3RhdGUtPmFzY2VuZGluZ19jYWxsYmFjayA9IGFjcGlfZHNfZXhlY19lbmRfb3A7CisjZW5kaWYKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gKEFFX0JBRF9QQVJBTUVURVIpOworCX0KKworCXJldHVybiAoQUVfT0spOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX2RzX2xvYWQxX2JlZ2luX29wCisgKgorICogUEFSQU1FVEVSUzogIHdhbGtfc3RhdGUgICAgICAtIEN1cnJlbnQgc3RhdGUgb2YgdGhlIHBhcnNlIHRyZWUgd2FsaworICogICAgICAgICAgICAgIG91dF9vcCAgICAgICAgICAtIFdoZXJlIHRvIHJldHVybiBvcCBpZiBhIG5ldyBvbmUgaXMgY3JlYXRlZAorICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogRGVzY2VuZGluZyBjYWxsYmFjayB1c2VkIGR1cmluZyB0aGUgbG9hZGluZyBvZiBBQ1BJIHRhYmxlcy4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCithY3BpX3N0YXR1cworYWNwaV9kc19sb2FkMV9iZWdpbl9vcChzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICogd2Fsa19zdGF0ZSwKKwkJICAgICAgIHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICoqIG91dF9vcCkKK3sKKwl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqb3A7CisJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGU7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCWFjcGlfb2JqZWN0X3R5cGUgb2JqZWN0X3R5cGU7CisJY2hhciAqcGF0aDsKKwl1MzIgZmxhZ3M7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGRzX2xvYWQxX2JlZ2luX29wKTsKKworCW9wID0gd2Fsa19zdGF0ZS0+b3A7CisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9ESVNQQVRDSCwgIk9wPSVwIFN0YXRlPSVwXG4iLCBvcCwKKwkJCSAgd2Fsa19zdGF0ZSkpOworCisJLyogV2UgYXJlIG9ubHkgaW50ZXJlc3RlZCBpbiBvcGNvZGVzIHRoYXQgaGF2ZSBhbiBhc3NvY2lhdGVkIG5hbWUgKi8KKworCWlmIChvcCkgeworCQlpZiAoISh3YWxrX3N0YXRlLT5vcF9pbmZvLT5mbGFncyAmIEFNTF9OQU1FRCkpIHsKKwkJCSpvdXRfb3AgPSBvcDsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CisJCX0KKworCQkvKiBDaGVjayBpZiB0aGlzIG9iamVjdCBoYXMgYWxyZWFkeSBiZWVuIGluc3RhbGxlZCBpbiB0aGUgbmFtZXNwYWNlICovCisKKwkJaWYgKG9wLT5jb21tb24ubm9kZSkgeworCQkJKm91dF9vcCA9IG9wOworCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKKwkJfQorCX0KKworCXBhdGggPSBhY3BpX3BzX2dldF9uZXh0X25hbWVzdHJpbmcoJndhbGtfc3RhdGUtPnBhcnNlcl9zdGF0ZSk7CisKKwkvKiBNYXAgdGhlIHJhdyBvcGNvZGUgaW50byBhbiBpbnRlcm5hbCBvYmplY3QgdHlwZSAqLworCisJb2JqZWN0X3R5cGUgPSB3YWxrX3N0YXRlLT5vcF9pbmZvLT5vYmplY3RfdHlwZTsKKworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRElTUEFUQ0gsCisJCQkgICJTdGF0ZT0lcCBPcD0lcCBbJXNdXG4iLCB3YWxrX3N0YXRlLCBvcCwKKwkJCSAgYWNwaV91dF9nZXRfdHlwZV9uYW1lKG9iamVjdF90eXBlKSkpOworCisJc3dpdGNoICh3YWxrX3N0YXRlLT5vcGNvZGUpIHsKKwljYXNlIEFNTF9TQ09QRV9PUDoKKworCQkvKgorCQkgKiBUaGUgdGFyZ2V0IG5hbWUgb2YgdGhlIFNjb3BlKCkgb3BlcmF0b3IgbXVzdCBleGlzdCBhdCB0aGlzIHBvaW50IHNvCisJCSAqIHRoYXQgd2UgY2FuIGFjdHVhbGx5IG9wZW4gdGhlIHNjb3BlIHRvIGVudGVyIG5ldyBuYW1lcyB1bmRlcm5lYXRoIGl0LgorCQkgKiBBbGxvdyBzZWFyY2gtdG8tcm9vdCBmb3Igc2luZ2xlIG5hbWVzZWdzLgorCQkgKi8KKwkJc3RhdHVzID0KKwkJICAgIGFjcGlfbnNfbG9va3VwKHdhbGtfc3RhdGUtPnNjb3BlX2luZm8sIHBhdGgsIG9iamVjdF90eXBlLAorCQkJCSAgIEFDUElfSU1PREVfRVhFQ1VURSwgQUNQSV9OU19TRUFSQ0hfUEFSRU5ULAorCQkJCSAgIHdhbGtfc3RhdGUsICYobm9kZSkpOworI2lmZGVmIEFDUElfQVNMX0NPTVBJTEVSCisJCWlmIChzdGF0dXMgPT0gQUVfTk9UX0ZPVU5EKSB7CisJCQkvKgorCQkJICogVGFibGUgZGlzYXNzZW1ibHk6CisJCQkgKiBUYXJnZXQgb2YgU2NvcGUoKSBub3QgZm91bmQuIEdlbmVyYXRlIGFuIEV4dGVybmFsIGZvciBpdCwgYW5kCisJCQkgKiBpbnNlcnQgdGhlIG5hbWUgaW50byB0aGUgbmFtZXNwYWNlLgorCQkJICovCisJCQlhY3BpX2RtX2FkZF90b19leHRlcm5hbF9saXN0KHBhdGgsIEFDUElfVFlQRV9ERVZJQ0UsIDApOworCQkJc3RhdHVzID0KKwkJCSAgICBhY3BpX25zX2xvb2t1cCh3YWxrX3N0YXRlLT5zY29wZV9pbmZvLCBwYXRoLAorCQkJCQkgICBvYmplY3RfdHlwZSwgQUNQSV9JTU9ERV9MT0FEX1BBU1MxLAorCQkJCQkgICBBQ1BJX05TX1NFQVJDSF9QQVJFTlQsIHdhbGtfc3RhdGUsCisJCQkJCSAgICZub2RlKTsKKwkJfQorI2VuZGlmCisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJQUNQSV9FUlJPUl9OQU1FU1BBQ0UocGF0aCwgc3RhdHVzKTsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworCQl9CisKKwkJLyoKKwkJICogQ2hlY2sgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIHRhcmdldCBpcworCQkgKiBvbmUgb2YgdGhlIG9wY29kZXMgdGhhdCBhY3R1YWxseSBvcGVucyBhIHNjb3BlCisJCSAqLworCQlzd2l0Y2ggKG5vZGUtPnR5cGUpIHsKKwkJY2FzZSBBQ1BJX1RZUEVfQU5ZOgorCQljYXNlIEFDUElfVFlQRV9MT0NBTF9TQ09QRToJLyogU2NvcGUgICovCisJCWNhc2UgQUNQSV9UWVBFX0RFVklDRToKKwkJY2FzZSBBQ1BJX1RZUEVfUE9XRVI6CisJCWNhc2UgQUNQSV9UWVBFX1BST0NFU1NPUjoKKwkJY2FzZSBBQ1BJX1RZUEVfVEhFUk1BTDoKKworCQkJLyogVGhlc2UgYXJlIGFjY2VwdGFibGUgdHlwZXMgKi8KKwkJCWJyZWFrOworCisJCWNhc2UgQUNQSV9UWVBFX0lOVEVHRVI6CisJCWNhc2UgQUNQSV9UWVBFX1NUUklORzoKKwkJY2FzZSBBQ1BJX1RZUEVfQlVGRkVSOgorCisJCQkvKgorCQkJICogVGhlc2UgdHlwZXMgd2Ugd2lsbCBhbGxvdywgYnV0IHdlIHdpbGwgY2hhbmdlIHRoZSB0eXBlLiBUaGlzCisJCQkgKiBlbmFibGVzIHNvbWUgZXhpc3RpbmcgY29kZSBvZiB0aGUgZm9ybToKKwkJCSAqCisJCQkgKiAgTmFtZSAoREVCLCAwKQorCQkJICogIFNjb3BlIChERUIpIHsgLi4uIH0KKwkJCSAqCisJCQkgKiBOb3RlOiBzaWxlbnRseSBjaGFuZ2UgdGhlIHR5cGUgaGVyZS4gT24gdGhlIHNlY29uZCBwYXNzLCB3ZSB3aWxsIHJlcG9ydAorCQkJICogYSB3YXJuaW5nCisJCQkgKi8KKwkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywKKwkJCQkJICAiVHlwZSBvdmVycmlkZSAtIFslNC40c10gaGFkIGludmFsaWQgdHlwZSAoJXMpIGZvciBTY29wZSBvcGVyYXRvciwgY2hhbmdlZCB0byAoU2NvcGUpXG4iLAorCQkJCQkgIHBhdGgsCisJCQkJCSAgYWNwaV91dF9nZXRfdHlwZV9uYW1lKG5vZGUtPnR5cGUpKSk7CisKKwkJCW5vZGUtPnR5cGUgPSBBQ1BJX1RZUEVfQU5ZOworCQkJd2Fsa19zdGF0ZS0+c2NvcGVfaW5mby0+Y29tbW9uLnZhbHVlID0gQUNQSV9UWVBFX0FOWTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisKKwkJCS8qIEFsbCBvdGhlciB0eXBlcyBhcmUgYW4gZXJyb3IgKi8KKworCQkJQUNQSV9FUlJPUigoQUVfSU5GTywKKwkJCQkgICAgIkludmFsaWQgdHlwZSAoJXMpIGZvciB0YXJnZXQgb2YgU2NvcGUgb3BlcmF0b3IgWyU0LjRzXSAoQ2Fubm90IG92ZXJyaWRlKSIsCisJCQkJICAgIGFjcGlfdXRfZ2V0X3R5cGVfbmFtZShub2RlLT50eXBlKSwgcGF0aCkpOworCisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX09QRVJBTkRfVFlQRSk7CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQkvKgorCQkgKiBGb3IgYWxsIG90aGVyIG5hbWVkIG9wY29kZXMsIHdlIHdpbGwgZW50ZXIgdGhlIG5hbWUgaW50bworCQkgKiB0aGUgbmFtZXNwYWNlLgorCQkgKgorCQkgKiBTZXR1cCB0aGUgc2VhcmNoIGZsYWdzLgorCQkgKiBTaW5jZSB3ZSBhcmUgZW50ZXJpbmcgYSBuYW1lIGludG8gdGhlIG5hbWVzcGFjZSwgd2UgZG8gbm90IHdhbnQgdG8KKwkJICogZW5hYmxlIHRoZSBzZWFyY2gtdG8tcm9vdCB1cHNlYXJjaC4KKwkJICoKKwkJICogVGhlcmUgYXJlIG9ubHkgdHdvIGNvbmRpdGlvbnMgd2hlcmUgaXQgaXMgYWNjZXB0YWJsZSB0aGF0IHRoZSBuYW1lCisJCSAqIGFscmVhZHkgZXhpc3RzOgorCQkgKiAgICAxKSB0aGUgU2NvcGUoKSBvcGVyYXRvciBjYW4gcmVvcGVuIGEgc2NvcGluZyBvYmplY3QgdGhhdCB3YXMKKwkJICogICAgICAgcHJldmlvdXNseSBkZWZpbmVkIChTY29wZSwgTWV0aG9kLCBEZXZpY2UsIGV0Yy4pCisJCSAqICAgIDIpIFdoZW5ldmVyIHdlIGFyZSBwYXJzaW5nIGEgZGVmZXJyZWQgb3Bjb2RlIChvcF9yZWdpb24sIEJ1ZmZlciwKKwkJICogICAgICAgYnVmZmVyX2ZpZWxkLCBvciBQYWNrYWdlKSwgdGhlIG5hbWUgb2YgdGhlIG9iamVjdCBpcyBhbHJlYWR5CisJCSAqICAgICAgIGluIHRoZSBuYW1lc3BhY2UuCisJCSAqLworCQlpZiAod2Fsa19zdGF0ZS0+ZGVmZXJyZWRfbm9kZSkgeworCisJCQkvKiBUaGlzIG5hbWUgaXMgYWxyZWFkeSBpbiB0aGUgbmFtZXNwYWNlLCBnZXQgdGhlIG5vZGUgKi8KKworCQkJbm9kZSA9IHdhbGtfc3RhdGUtPmRlZmVycmVkX25vZGU7CisJCQlzdGF0dXMgPSBBRV9PSzsKKwkJCWJyZWFrOworCQl9CisKKwkJLyoKKwkJICogSWYgd2UgYXJlIGV4ZWN1dGluZyBhIG1ldGhvZCwgZG8gbm90IGNyZWF0ZSBhbnkgbmFtZXNwYWNlIG9iamVjdHMKKwkJICogZHVyaW5nIHRoZSBsb2FkIHBoYXNlLCBvbmx5IGR1cmluZyBleGVjdXRpb24uCisJCSAqLworCQlpZiAod2Fsa19zdGF0ZS0+bWV0aG9kX25vZGUpIHsKKwkJCW5vZGUgPSBOVUxMOworCQkJc3RhdHVzID0gQUVfT0s7CisJCQlicmVhazsKKwkJfQorCisJCWZsYWdzID0gQUNQSV9OU19OT19VUFNFQVJDSDsKKwkJaWYgKCh3YWxrX3N0YXRlLT5vcGNvZGUgIT0gQU1MX1NDT1BFX09QKSAmJgorCQkgICAgKCEod2Fsa19zdGF0ZS0+cGFyc2VfZmxhZ3MgJiBBQ1BJX1BBUlNFX0RFRkVSUkVEX09QKSkpIHsKKwkJCWZsYWdzIHw9IEFDUElfTlNfRVJST1JfSUZfRk9VTkQ7CisJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0RJU1BBVENILAorCQkJCQkgICJbJXNdIENhbm5vdCBhbHJlYWR5IGV4aXN0XG4iLAorCQkJCQkgIGFjcGlfdXRfZ2V0X3R5cGVfbmFtZShvYmplY3RfdHlwZSkpKTsKKwkJfSBlbHNlIHsKKwkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRElTUEFUQ0gsCisJCQkJCSAgIlslc10gQm90aCBGaW5kIG9yIENyZWF0ZSBhbGxvd2VkXG4iLAorCQkJCQkgIGFjcGlfdXRfZ2V0X3R5cGVfbmFtZShvYmplY3RfdHlwZSkpKTsKKwkJfQorCisJCS8qCisJCSAqIEVudGVyIHRoZSBuYW1lZCB0eXBlIGludG8gdGhlIGludGVybmFsIG5hbWVzcGFjZS4gV2UgZW50ZXIgdGhlIG5hbWUKKwkJICogYXMgd2UgZ28gZG93bndhcmQgaW4gdGhlIHBhcnNlIHRyZWUuIEFueSBuZWNlc3Nhcnkgc3Vib2JqZWN0cyB0aGF0CisJCSAqIGludm9sdmUgYXJndW1lbnRzIHRvIHRoZSBvcGNvZGUgbXVzdCBiZSBjcmVhdGVkIGFzIHdlIGdvIGJhY2sgdXAgdGhlCisJCSAqIHBhcnNlIHRyZWUgbGF0ZXIuCisJCSAqLworCQlzdGF0dXMgPQorCQkgICAgYWNwaV9uc19sb29rdXAod2Fsa19zdGF0ZS0+c2NvcGVfaW5mbywgcGF0aCwgb2JqZWN0X3R5cGUsCisJCQkJICAgQUNQSV9JTU9ERV9MT0FEX1BBU1MxLCBmbGFncywgd2Fsa19zdGF0ZSwKKwkJCQkgICAmbm9kZSk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJaWYgKHN0YXR1cyA9PSBBRV9BTFJFQURZX0VYSVNUUykgeworCisJCQkJLyogVGhlIG5hbWUgYWxyZWFkeSBleGlzdHMgaW4gdGhpcyBzY29wZSAqLworCisJCQkJaWYgKG5vZGUtPmZsYWdzICYgQU5PQkpfSVNfRVhURVJOQUwpIHsKKwkJCQkJLyoKKwkJCQkJICogQWxsb3cgb25lIGNyZWF0ZSBvbiBhbiBvYmplY3Qgb3Igc2VnbWVudCB0aGF0IHdhcworCQkJCQkgKiBwcmV2aW91c2x5IGRlY2xhcmVkIEV4dGVybmFsCisJCQkJCSAqLworCQkJCQlub2RlLT5mbGFncyAmPSB+QU5PQkpfSVNfRVhURVJOQUw7CisJCQkJCW5vZGUtPnR5cGUgPSAodTgpIG9iamVjdF90eXBlOworCisJCQkJCS8qIEp1c3QgcmV0eXBlZCBhIG5vZGUsIHByb2JhYmx5IHdpbGwgbmVlZCB0byBvcGVuIGEgc2NvcGUgKi8KKworCQkJCQlpZiAoYWNwaV9uc19vcGVuc19zY29wZShvYmplY3RfdHlwZSkpIHsKKwkJCQkJCXN0YXR1cyA9CisJCQkJCQkgICAgYWNwaV9kc19zY29wZV9zdGFja19wdXNoCisJCQkJCQkgICAgKG5vZGUsIG9iamVjdF90eXBlLAorCQkJCQkJICAgICB3YWxrX3N0YXRlKTsKKwkJCQkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJCQkJCXJldHVybl9BQ1BJX1NUQVRVUworCQkJCQkJCSAgICAoc3RhdHVzKTsKKwkJCQkJCX0KKwkJCQkJfQorCisJCQkJCXN0YXR1cyA9IEFFX09LOworCQkJCX0KKwkJCX0KKworCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQkJQUNQSV9FUlJPUl9OQU1FU1BBQ0UocGF0aCwgc3RhdHVzKTsKKwkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKKwkJCX0KKwkJfQorCQlicmVhazsKKwl9CisKKwkvKiBDb21tb24gZXhpdCAqLworCisJaWYgKCFvcCkgeworCisJCS8qIENyZWF0ZSBhIG5ldyBvcCAqLworCisJCW9wID0gYWNwaV9wc19hbGxvY19vcCh3YWxrX3N0YXRlLT5vcGNvZGUpOworCQlpZiAoIW9wKSB7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9fTUVNT1JZKTsKKwkJfQorCX0KKworCS8qIEluaXRpYWxpemUgdGhlIG9wICovCisKKyNpZiAoZGVmaW5lZCAoQUNQSV9OT19NRVRIT0RfRVhFQ1VUSU9OKSB8fCBkZWZpbmVkIChBQ1BJX0NPTlNUQU5UX0VWQUxfT05MWSkpCisJb3AtPm5hbWVkLnBhdGggPSBBQ1BJX0NBU1RfUFRSKHU4LCBwYXRoKTsKKyNlbmRpZgorCisJaWYgKG5vZGUpIHsKKwkJLyoKKwkJICogUHV0IHRoZSBOb2RlIGluIHRoZSAib3AiIG9iamVjdCB0aGF0IHRoZSBwYXJzZXIgdXNlcywgc28gd2UKKwkJICogY2FuIGdldCBpdCBhZ2FpbiBxdWlja2x5IHdoZW4gdGhpcyBzY29wZSBpcyBjbG9zZWQKKwkJICovCisJCW9wLT5jb21tb24ubm9kZSA9IG5vZGU7CisJCW9wLT5uYW1lZC5uYW1lID0gbm9kZS0+bmFtZS5pbnRlZ2VyOworCX0KKworCWFjcGlfcHNfYXBwZW5kX2FyZyhhY3BpX3BzX2dldF9wYXJlbnRfc2NvcGUoJndhbGtfc3RhdGUtPnBhcnNlcl9zdGF0ZSksCisJCQkgICBvcCk7CisJKm91dF9vcCA9IG9wOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX2RzX2xvYWQxX2VuZF9vcAorICoKKyAqIFBBUkFNRVRFUlM6ICB3YWxrX3N0YXRlICAgICAgLSBDdXJyZW50IHN0YXRlIG9mIHRoZSBwYXJzZSB0cmVlIHdhbGsKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IEFzY2VuZGluZyBjYWxsYmFjayB1c2VkIGR1cmluZyB0aGUgbG9hZGluZyBvZiB0aGUgbmFtZXNwYWNlLAorICogICAgICAgICAgICAgIGJvdGggY29udHJvbCBtZXRob2RzIGFuZCBldmVyeXRoaW5nIGVsc2UuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworYWNwaV9zdGF0dXMgYWNwaV9kc19sb2FkMV9lbmRfb3Aoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSkKK3sKKwl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqb3A7CisJYWNwaV9vYmplY3RfdHlwZSBvYmplY3RfdHlwZTsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0UoZHNfbG9hZDFfZW5kX29wKTsKKworCW9wID0gd2Fsa19zdGF0ZS0+b3A7CisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9ESVNQQVRDSCwgIk9wPSVwIFN0YXRlPSVwXG4iLCBvcCwKKwkJCSAgd2Fsa19zdGF0ZSkpOworCisJLyogV2UgYXJlIG9ubHkgaW50ZXJlc3RlZCBpbiBvcGNvZGVzIHRoYXQgaGF2ZSBhbiBhc3NvY2lhdGVkIG5hbWUgKi8KKworCWlmICghKHdhbGtfc3RhdGUtPm9wX2luZm8tPmZsYWdzICYgKEFNTF9OQU1FRCB8IEFNTF9GSUVMRCkpKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CisJfQorCisJLyogR2V0IHRoZSBvYmplY3QgdHlwZSB0byBkZXRlcm1pbmUgaWYgd2Ugc2hvdWxkIHBvcCB0aGUgc2NvcGUgKi8KKworCW9iamVjdF90eXBlID0gd2Fsa19zdGF0ZS0+b3BfaW5mby0+b2JqZWN0X3R5cGU7CisKKyNpZm5kZWYgQUNQSV9OT19NRVRIT0RfRVhFQ1VUSU9OCisJaWYgKHdhbGtfc3RhdGUtPm9wX2luZm8tPmZsYWdzICYgQU1MX0ZJRUxEKSB7CisJCS8qCisJCSAqIElmIHdlIGFyZSBleGVjdXRpbmcgYSBtZXRob2QsIGRvIG5vdCBjcmVhdGUgYW55IG5hbWVzcGFjZSBvYmplY3RzCisJCSAqIGR1cmluZyB0aGUgbG9hZCBwaGFzZSwgb25seSBkdXJpbmcgZXhlY3V0aW9uLgorCQkgKi8KKwkJaWYgKCF3YWxrX3N0YXRlLT5tZXRob2Rfbm9kZSkgeworCQkJaWYgKHdhbGtfc3RhdGUtPm9wY29kZSA9PSBBTUxfRklFTERfT1AgfHwKKwkJCSAgICB3YWxrX3N0YXRlLT5vcGNvZGUgPT0gQU1MX0JBTktfRklFTERfT1AgfHwKKwkJCSAgICB3YWxrX3N0YXRlLT5vcGNvZGUgPT0gQU1MX0lOREVYX0ZJRUxEX09QKSB7CisJCQkJc3RhdHVzID0KKwkJCQkgICAgYWNwaV9kc19pbml0X2ZpZWxkX29iamVjdHMob3AsIHdhbGtfc3RhdGUpOworCQkJfQorCQl9CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworCX0KKworCS8qCisJICogSWYgd2UgYXJlIGV4ZWN1dGluZyBhIG1ldGhvZCwgZG8gbm90IGNyZWF0ZSBhbnkgbmFtZXNwYWNlIG9iamVjdHMKKwkgKiBkdXJpbmcgdGhlIGxvYWQgcGhhc2UsIG9ubHkgZHVyaW5nIGV4ZWN1dGlvbi4KKwkgKi8KKwlpZiAoIXdhbGtfc3RhdGUtPm1ldGhvZF9ub2RlKSB7CisJCWlmIChvcC0+Y29tbW9uLmFtbF9vcGNvZGUgPT0gQU1MX1JFR0lPTl9PUCkgeworCQkJc3RhdHVzID0KKwkJCSAgICBhY3BpX2V4X2NyZWF0ZV9yZWdpb24ob3AtPm5hbWVkLmRhdGEsCisJCQkJCQkgIG9wLT5uYW1lZC5sZW5ndGgsCisJCQkJCQkgIChhY3BpX2Fkcl9zcGFjZV90eXBlKSAoKG9wLT4KKwkJCQkJCQkJCSAgY29tbW9uLgorCQkJCQkJCQkJICB2YWx1ZS4KKwkJCQkJCQkJCSAgYXJnKS0+CisJCQkJCQkJCQkgY29tbW9uLgorCQkJCQkJCQkJIHZhbHVlLgorCQkJCQkJCQkJIGludGVnZXIpLAorCQkJCQkJICB3YWxrX3N0YXRlKTsKKwkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworCQkJfQorCQl9IGVsc2UgaWYgKG9wLT5jb21tb24uYW1sX29wY29kZSA9PSBBTUxfREFUQV9SRUdJT05fT1ApIHsKKwkJCXN0YXR1cyA9CisJCQkgICAgYWNwaV9leF9jcmVhdGVfcmVnaW9uKG9wLT5uYW1lZC5kYXRhLAorCQkJCQkJICBvcC0+bmFtZWQubGVuZ3RoLAorCQkJCQkJICBSRUdJT05fREFUQV9UQUJMRSwKKwkJCQkJCSAgd2Fsa19zdGF0ZSk7CisJCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKKwkJCX0KKwkJfQorCX0KKyNlbmRpZgorCisJaWYgKG9wLT5jb21tb24uYW1sX29wY29kZSA9PSBBTUxfTkFNRV9PUCkgeworCisJCS8qIEZvciBOYW1lIG9wY29kZSwgZ2V0IHRoZSBvYmplY3QgdHlwZSBmcm9tIHRoZSBhcmd1bWVudCAqLworCisJCWlmIChvcC0+Y29tbW9uLnZhbHVlLmFyZykgeworCQkJb2JqZWN0X3R5cGUgPSAoYWNwaV9wc19nZXRfb3Bjb2RlX2luZm8oKG9wLT5jb21tb24uCisJCQkJCQkJCXZhbHVlLmFyZyktPgorCQkJCQkJCSAgICAgICBjb21tb24uCisJCQkJCQkJICAgICAgIGFtbF9vcGNvZGUpKS0+CisJCQkgICAgb2JqZWN0X3R5cGU7CisKKwkJCS8qIFNldCBub2RlIHR5cGUgaWYgd2UgaGF2ZSBhIG5hbWVzcGFjZSBub2RlICovCisKKwkJCWlmIChvcC0+Y29tbW9uLm5vZGUpIHsKKwkJCQlvcC0+Y29tbW9uLm5vZGUtPnR5cGUgPSAodTgpIG9iamVjdF90eXBlOworCQkJfQorCQl9CisJfQorCisJLyoKKwkgKiBJZiB3ZSBhcmUgZXhlY3V0aW5nIGEgbWV0aG9kLCBkbyBub3QgY3JlYXRlIGFueSBuYW1lc3BhY2Ugb2JqZWN0cworCSAqIGR1cmluZyB0aGUgbG9hZCBwaGFzZSwgb25seSBkdXJpbmcgZXhlY3V0aW9uLgorCSAqLworCWlmICghd2Fsa19zdGF0ZS0+bWV0aG9kX25vZGUpIHsKKwkJaWYgKG9wLT5jb21tb24uYW1sX29wY29kZSA9PSBBTUxfTUVUSE9EX09QKSB7CisJCQkvKgorCQkJICogbWV0aG9kX29wIHBrZ19sZW5ndGggbmFtZV9zdHJpbmcgbWV0aG9kX2ZsYWdzIHRlcm1fbGlzdAorCQkJICoKKwkJCSAqIE5vdGU6IFdlIG11c3QgY3JlYXRlIHRoZSBtZXRob2Qgbm9kZS9vYmplY3QgcGFpciBhcyBzb29uIGFzIHdlCisJCQkgKiBzZWUgdGhlIG1ldGhvZCBkZWNsYXJhdGlvbi4gVGhpcyBhbGxvd3MgbGF0ZXIgcGFzczEgcGFyc2luZworCQkJICogb2YgaW52b2NhdGlvbnMgb2YgdGhlIG1ldGhvZCAobmVlZCB0byBrbm93IHRoZSBudW1iZXIgb2YKKwkJCSAqIGFyZ3VtZW50cy4pCisJCQkgKi8KKwkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRElTUEFUQ0gsCisJCQkJCSAgIkxPQURJTkctTWV0aG9kOiBTdGF0ZT0lcCBPcD0lcCBOYW1lZE9iaj0lcFxuIiwKKwkJCQkJICB3YWxrX3N0YXRlLCBvcCwgb3AtPm5hbWVkLm5vZGUpKTsKKworCQkJaWYgKCFhY3BpX25zX2dldF9hdHRhY2hlZF9vYmplY3Qob3AtPm5hbWVkLm5vZGUpKSB7CisJCQkJd2Fsa19zdGF0ZS0+b3BlcmFuZHNbMF0gPQorCQkJCSAgICBBQ1BJX0NBU1RfUFRSKHZvaWQsIG9wLT5uYW1lZC5ub2RlKTsKKwkJCQl3YWxrX3N0YXRlLT5udW1fb3BlcmFuZHMgPSAxOworCisJCQkJc3RhdHVzID0KKwkJCQkgICAgYWNwaV9kc19jcmVhdGVfb3BlcmFuZHMod2Fsa19zdGF0ZSwKKwkJCQkJCQkgICAgb3AtPmNvbW1vbi52YWx1ZS4KKwkJCQkJCQkgICAgYXJnKTsKKwkJCQlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpIHsKKwkJCQkJc3RhdHVzID0KKwkJCQkJICAgIGFjcGlfZXhfY3JlYXRlX21ldGhvZChvcC0+bmFtZWQuCisJCQkJCQkJCSAgZGF0YSwKKwkJCQkJCQkJICBvcC0+bmFtZWQuCisJCQkJCQkJCSAgbGVuZ3RoLAorCQkJCQkJCQkgIHdhbGtfc3RhdGUpOworCQkJCX0KKworCQkJCXdhbGtfc3RhdGUtPm9wZXJhbmRzWzBdID0gTlVMTDsKKwkJCQl3YWxrX3N0YXRlLT5udW1fb3BlcmFuZHMgPSAwOworCisJCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCS8qIFBvcCB0aGUgc2NvcGUgc3RhY2sgKG9ubHkgaWYgbG9hZGluZyBhIHRhYmxlKSAqLworCisJaWYgKCF3YWxrX3N0YXRlLT5tZXRob2Rfbm9kZSAmJiBhY3BpX25zX29wZW5zX3Njb3BlKG9iamVjdF90eXBlKSkgeworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0RJU1BBVENILAorCQkJCSAgIiglcyk6IFBvcHBpbmcgc2NvcGUgZm9yIE9wICVwXG4iLAorCQkJCSAgYWNwaV91dF9nZXRfdHlwZV9uYW1lKG9iamVjdF90eXBlKSwgb3ApKTsKKworCQlzdGF0dXMgPSBhY3BpX2RzX3Njb3BlX3N0YWNrX3BvcCh3YWxrX3N0YXRlKTsKKwl9CisKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9kc19sb2FkMl9iZWdpbl9vcAorICoKKyAqIFBBUkFNRVRFUlM6ICB3YWxrX3N0YXRlICAgICAgLSBDdXJyZW50IHN0YXRlIG9mIHRoZSBwYXJzZSB0cmVlIHdhbGsKKyAqICAgICAgICAgICAgICBvdXRfb3AgICAgICAgICAgLSBXaGVyIHRvIHJldHVybiBvcCBpZiBhIG5ldyBvbmUgaXMgY3JlYXRlZAorICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogRGVzY2VuZGluZyBjYWxsYmFjayB1c2VkIGR1cmluZyB0aGUgbG9hZGluZyBvZiBBQ1BJIHRhYmxlcy4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCithY3BpX3N0YXR1cworYWNwaV9kc19sb2FkMl9iZWdpbl9vcChzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlLAorCQkgICAgICAgdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKipvdXRfb3ApCit7CisJdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKm9wOworCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwlhY3BpX29iamVjdF90eXBlIG9iamVjdF90eXBlOworCWNoYXIgKmJ1ZmZlcl9wdHI7CisJdTMyIGZsYWdzOworCisJQUNQSV9GVU5DVElPTl9UUkFDRShkc19sb2FkMl9iZWdpbl9vcCk7CisKKwlvcCA9IHdhbGtfc3RhdGUtPm9wOworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRElTUEFUQ0gsICJPcD0lcCBTdGF0ZT0lcFxuIiwgb3AsCisJCQkgIHdhbGtfc3RhdGUpKTsKKworCWlmIChvcCkgeworCQlpZiAoKHdhbGtfc3RhdGUtPmNvbnRyb2xfc3RhdGUpICYmCisJCSAgICAod2Fsa19zdGF0ZS0+Y29udHJvbF9zdGF0ZS0+Y29tbW9uLnN0YXRlID09CisJCSAgICAgQUNQSV9DT05UUk9MX0NPTkRJVElPTkFMX0VYRUNVVElORykpIHsKKworCQkJLyogV2UgYXJlIGV4ZWN1dGluZyBhIHdoaWxlIGxvb3Agb3V0c2lkZSBvZiBhIG1ldGhvZCAqLworCisJCQlzdGF0dXMgPSBhY3BpX2RzX2V4ZWNfYmVnaW5fb3Aod2Fsa19zdGF0ZSwgb3V0X29wKTsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworCQl9CisKKwkJLyogV2Ugb25seSBjYXJlIGFib3V0IE5hbWVzcGFjZSBvcGNvZGVzIGhlcmUgKi8KKworCQlpZiAoKCEod2Fsa19zdGF0ZS0+b3BfaW5mby0+ZmxhZ3MgJiBBTUxfTlNPUENPREUpICYmCisJCSAgICAgKHdhbGtfc3RhdGUtPm9wY29kZSAhPSBBTUxfSU5UX05BTUVQQVRIX09QKSkgfHwKKwkJICAgICghKHdhbGtfc3RhdGUtPm9wX2luZm8tPmZsYWdzICYgQU1MX05BTUVEKSkpIHsKKyNpZmRlZiBBQ1BJX0VOQUJMRV9NT0RVTEVfTEVWRUxfQ09ERQorCQkJaWYgKCh3YWxrX3N0YXRlLT5vcF9pbmZvLT5jbGFzcyA9PSBBTUxfQ0xBU1NfRVhFQ1VURSkgfHwKKwkJCSAgICAod2Fsa19zdGF0ZS0+b3BfaW5mby0+Y2xhc3MgPT0gQU1MX0NMQVNTX0NPTlRST0wpKSB7CisJCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9ESVNQQVRDSCwKKwkJCQkJCSAgIkJlZ2luL0VYRUM6ICVzIChmbCAlOC44WClcbiIsCisJCQkJCQkgIHdhbGtfc3RhdGUtPm9wX2luZm8tPm5hbWUsCisJCQkJCQkgIHdhbGtfc3RhdGUtPm9wX2luZm8tPmZsYWdzKSk7CisKKwkJCQkvKiBFeGVjdXRpbmcgYSB0eXBlMSBvciB0eXBlMiBvcGNvZGUgb3V0c2lkZSBvZiBhIG1ldGhvZCAqLworCisJCQkJc3RhdHVzID0KKwkJCQkgICAgYWNwaV9kc19leGVjX2JlZ2luX29wKHdhbGtfc3RhdGUsIG91dF9vcCk7CisJCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CisJCQl9CisjZW5kaWYKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CisJCX0KKworCQkvKiBHZXQgdGhlIG5hbWUgd2UgYXJlIGdvaW5nIHRvIGVudGVyIG9yIGxvb2t1cCBpbiB0aGUgbmFtZXNwYWNlICovCisKKwkJaWYgKHdhbGtfc3RhdGUtPm9wY29kZSA9PSBBTUxfSU5UX05BTUVQQVRIX09QKSB7CisKKwkJCS8qIEZvciBOYW1lcGF0aCBvcCwgZ2V0IHRoZSBwYXRoIHN0cmluZyAqLworCisJCQlidWZmZXJfcHRyID0gb3AtPmNvbW1vbi52YWx1ZS5zdHJpbmc7CisJCQlpZiAoIWJ1ZmZlcl9wdHIpIHsKKworCQkJCS8qIE5vIG5hbWUsIGp1c3QgZXhpdCAqLworCisJCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8qIEdldCBuYW1lIGZyb20gdGhlIG9wICovCisKKwkJCWJ1ZmZlcl9wdHIgPSBBQ1BJX0NBU1RfUFRSKGNoYXIsICZvcC0+bmFtZWQubmFtZSk7CisJCX0KKwl9IGVsc2UgeworCQkvKiBHZXQgdGhlIG5hbWVzdHJpbmcgZnJvbSB0aGUgcmF3IEFNTCAqLworCisJCWJ1ZmZlcl9wdHIgPQorCQkgICAgYWNwaV9wc19nZXRfbmV4dF9uYW1lc3RyaW5nKCZ3YWxrX3N0YXRlLT5wYXJzZXJfc3RhdGUpOworCX0KKworCS8qIE1hcCB0aGUgb3Bjb2RlIGludG8gYW4gaW50ZXJuYWwgb2JqZWN0IHR5cGUgKi8KKworCW9iamVjdF90eXBlID0gd2Fsa19zdGF0ZS0+b3BfaW5mby0+b2JqZWN0X3R5cGU7CisKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0RJU1BBVENILAorCQkJICAiU3RhdGU9JXAgT3A9JXAgVHlwZT0lWFxuIiwgd2Fsa19zdGF0ZSwgb3AsCisJCQkgIG9iamVjdF90eXBlKSk7CisKKwlzd2l0Y2ggKHdhbGtfc3RhdGUtPm9wY29kZSkgeworCWNhc2UgQU1MX0ZJRUxEX09QOgorCWNhc2UgQU1MX0JBTktfRklFTERfT1A6CisJY2FzZSBBTUxfSU5ERVhfRklFTERfT1A6CisKKwkJbm9kZSA9IE5VTEw7CisJCXN0YXR1cyA9IEFFX09LOworCQlicmVhazsKKworCWNhc2UgQU1MX0lOVF9OQU1FUEFUSF9PUDoKKwkJLyoKKwkJICogVGhlIG5hbWVfcGF0aCBpcyBhbiBvYmplY3QgcmVmZXJlbmNlIHRvIGFuIGV4aXN0aW5nIG9iamVjdC4KKwkJICogRG9uJ3QgZW50ZXIgdGhlIG5hbWUgaW50byB0aGUgbmFtZXNwYWNlLCBidXQgbG9vayBpdCB1cAorCQkgKiBmb3IgdXNlIGxhdGVyLgorCQkgKi8KKwkJc3RhdHVzID0KKwkJICAgIGFjcGlfbnNfbG9va3VwKHdhbGtfc3RhdGUtPnNjb3BlX2luZm8sIGJ1ZmZlcl9wdHIsCisJCQkJICAgb2JqZWN0X3R5cGUsIEFDUElfSU1PREVfRVhFQ1VURSwKKwkJCQkgICBBQ1BJX05TX1NFQVJDSF9QQVJFTlQsIHdhbGtfc3RhdGUsICYobm9kZSkpOworCQlicmVhazsKKworCWNhc2UgQU1MX1NDT1BFX09QOgorCQkvKgorCQkgKiBUaGUgUGF0aCBpcyBhbiBvYmplY3QgcmVmZXJlbmNlIHRvIGFuIGV4aXN0aW5nIG9iamVjdC4KKwkJICogRG9uJ3QgZW50ZXIgdGhlIG5hbWUgaW50byB0aGUgbmFtZXNwYWNlLCBidXQgbG9vayBpdCB1cAorCQkgKiBmb3IgdXNlIGxhdGVyLgorCQkgKi8KKwkJc3RhdHVzID0KKwkJICAgIGFjcGlfbnNfbG9va3VwKHdhbGtfc3RhdGUtPnNjb3BlX2luZm8sIGJ1ZmZlcl9wdHIsCisJCQkJICAgb2JqZWN0X3R5cGUsIEFDUElfSU1PREVfRVhFQ1VURSwKKwkJCQkgICBBQ1BJX05TX1NFQVJDSF9QQVJFTlQsIHdhbGtfc3RhdGUsICYobm9kZSkpOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKyNpZmRlZiBBQ1BJX0FTTF9DT01QSUxFUgorCQkJaWYgKHN0YXR1cyA9PSBBRV9OT1RfRk9VTkQpIHsKKwkJCQlzdGF0dXMgPSBBRV9PSzsKKwkJCX0gZWxzZSB7CisJCQkJQUNQSV9FUlJPUl9OQU1FU1BBQ0UoYnVmZmVyX3B0ciwgc3RhdHVzKTsKKwkJCX0KKyNlbHNlCisJCQlBQ1BJX0VSUk9SX05BTUVTUEFDRShidWZmZXJfcHRyLCBzdGF0dXMpOworI2VuZGlmCisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKKwkJfQorCisJCS8qCisJCSAqIFdlIG11c3QgY2hlY2sgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIHRhcmdldCBpcworCQkgKiBvbmUgb2YgdGhlIG9wY29kZXMgdGhhdCBhY3R1YWxseSBvcGVucyBhIHNjb3BlCisJCSAqLworCQlzd2l0Y2ggKG5vZGUtPnR5cGUpIHsKKwkJY2FzZSBBQ1BJX1RZUEVfQU5ZOgorCQljYXNlIEFDUElfVFlQRV9MT0NBTF9TQ09QRToJLyogU2NvcGUgKi8KKwkJY2FzZSBBQ1BJX1RZUEVfREVWSUNFOgorCQljYXNlIEFDUElfVFlQRV9QT1dFUjoKKwkJY2FzZSBBQ1BJX1RZUEVfUFJPQ0VTU09SOgorCQljYXNlIEFDUElfVFlQRV9USEVSTUFMOgorCisJCQkvKiBUaGVzZSBhcmUgYWNjZXB0YWJsZSB0eXBlcyAqLworCQkJYnJlYWs7CisKKwkJY2FzZSBBQ1BJX1RZUEVfSU5URUdFUjoKKwkJY2FzZSBBQ1BJX1RZUEVfU1RSSU5HOgorCQljYXNlIEFDUElfVFlQRV9CVUZGRVI6CisKKwkJCS8qCisJCQkgKiBUaGVzZSB0eXBlcyB3ZSB3aWxsIGFsbG93LCBidXQgd2Ugd2lsbCBjaGFuZ2UgdGhlIHR5cGUuIFRoaXMKKwkJCSAqIGVuYWJsZXMgc29tZSBleGlzdGluZyBjb2RlIG9mIHRoZSBmb3JtOgorCQkJICoKKwkJCSAqICBOYW1lIChERUIsIDApCisJCQkgKiAgU2NvcGUgKERFQikgeyAuLi4gfQorCQkJICovCisJCQlBQ1BJX1dBUk5JTkcoKEFFX0lORk8sCisJCQkJICAgICAgIlR5cGUgb3ZlcnJpZGUgLSBbJTQuNHNdIGhhZCBpbnZhbGlkIHR5cGUgKCVzKSBmb3IgU2NvcGUgb3BlcmF0b3IsIGNoYW5nZWQgdG8gKFNjb3BlKSIsCisJCQkJICAgICAgYnVmZmVyX3B0ciwKKwkJCQkgICAgICBhY3BpX3V0X2dldF90eXBlX25hbWUobm9kZS0+dHlwZSkpKTsKKworCQkJbm9kZS0+dHlwZSA9IEFDUElfVFlQRV9BTlk7CisJCQl3YWxrX3N0YXRlLT5zY29wZV9pbmZvLT5jb21tb24udmFsdWUgPSBBQ1BJX1RZUEVfQU5ZOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKworCQkJLyogQWxsIG90aGVyIHR5cGVzIGFyZSBhbiBlcnJvciAqLworCisJCQlBQ1BJX0VSUk9SKChBRV9JTkZPLAorCQkJCSAgICAiSW52YWxpZCB0eXBlICglcykgZm9yIHRhcmdldCBvZiBTY29wZSBvcGVyYXRvciBbJTQuNHNdIiwKKwkJCQkgICAgYWNwaV91dF9nZXRfdHlwZV9uYW1lKG5vZGUtPnR5cGUpLAorCQkJCSAgICBidWZmZXJfcHRyKSk7CisKKwkJCXJldHVybiAoQUVfQU1MX09QRVJBTkRfVFlQRSk7CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCisJCS8qIEFsbCBvdGhlciBvcGNvZGVzICovCisKKwkJaWYgKG9wICYmIG9wLT5jb21tb24ubm9kZSkgeworCisJCQkvKiBUaGlzIG9wL25vZGUgd2FzIHByZXZpb3VzbHkgZW50ZXJlZCBpbnRvIHRoZSBuYW1lc3BhY2UgKi8KKworCQkJbm9kZSA9IG9wLT5jb21tb24ubm9kZTsKKworCQkJaWYgKGFjcGlfbnNfb3BlbnNfc2NvcGUob2JqZWN0X3R5cGUpKSB7CisJCQkJc3RhdHVzID0KKwkJCQkgICAgYWNwaV9kc19zY29wZV9zdGFja19wdXNoKG5vZGUsIG9iamVjdF90eXBlLAorCQkJCQkJCSAgICAgd2Fsa19zdGF0ZSk7CisJCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworCQkJCX0KKwkJCX0KKworCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKKwkJfQorCisJCS8qCisJCSAqIEVudGVyIHRoZSBuYW1lZCB0eXBlIGludG8gdGhlIGludGVybmFsIG5hbWVzcGFjZS4gV2UgZW50ZXIgdGhlIG5hbWUKKwkJICogYXMgd2UgZ28gZG93bndhcmQgaW4gdGhlIHBhcnNlIHRyZWUuIEFueSBuZWNlc3Nhcnkgc3Vib2JqZWN0cyB0aGF0CisJCSAqIGludm9sdmUgYXJndW1lbnRzIHRvIHRoZSBvcGNvZGUgbXVzdCBiZSBjcmVhdGVkIGFzIHdlIGdvIGJhY2sgdXAgdGhlCisJCSAqIHBhcnNlIHRyZWUgbGF0ZXIuCisJCSAqCisJCSAqIE5vdGU6IE5hbWUgbWF5IGFscmVhZHkgZXhpc3QgaWYgd2UgYXJlIGV4ZWN1dGluZyBhIGRlZmVycmVkIG9wY29kZS4KKwkJICovCisJCWlmICh3YWxrX3N0YXRlLT5kZWZlcnJlZF9ub2RlKSB7CisKKwkJCS8qIFRoaXMgbmFtZSBpcyBhbHJlYWR5IGluIHRoZSBuYW1lc3BhY2UsIGdldCB0aGUgbm9kZSAqLworCisJCQlub2RlID0gd2Fsa19zdGF0ZS0+ZGVmZXJyZWRfbm9kZTsKKwkJCXN0YXR1cyA9IEFFX09LOworCQkJYnJlYWs7CisJCX0KKworCQlmbGFncyA9IEFDUElfTlNfTk9fVVBTRUFSQ0g7CisJCWlmICh3YWxrX3N0YXRlLT5wYXNzX251bWJlciA9PSBBQ1BJX0lNT0RFX0VYRUNVVEUpIHsKKworCQkJLyogRXhlY3V0aW9uIG1vZGUsIG5vZGUgY2Fubm90IGFscmVhZHkgZXhpc3QsIG5vZGUgaXMgdGVtcG9yYXJ5ICovCisKKwkJCWZsYWdzIHw9IChBQ1BJX05TX0VSUk9SX0lGX0ZPVU5EIHwgQUNQSV9OU19URU1QT1JBUlkpOworCQl9CisKKwkJLyogQWRkIG5ldyBlbnRyeSBvciBsb29rdXAgZXhpc3RpbmcgZW50cnkgKi8KKworCQlzdGF0dXMgPQorCQkgICAgYWNwaV9uc19sb29rdXAod2Fsa19zdGF0ZS0+c2NvcGVfaW5mbywgYnVmZmVyX3B0ciwKKwkJCQkgICBvYmplY3RfdHlwZSwgQUNQSV9JTU9ERV9MT0FEX1BBU1MyLCBmbGFncywKKwkJCQkgICB3YWxrX3N0YXRlLCAmbm9kZSk7CisKKwkJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpICYmIChmbGFncyAmIEFDUElfTlNfVEVNUE9SQVJZKSkgeworCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9ESVNQQVRDSCwKKwkJCQkJICAiKioqTmV3IE5vZGUgWyU0LjRzXSAlcCBpcyB0ZW1wb3JhcnlcbiIsCisJCQkJCSAgYWNwaV91dF9nZXRfbm9kZV9uYW1lKG5vZGUpLCBub2RlKSk7CisJCX0KKwkJYnJlYWs7CisJfQorCisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCUFDUElfRVJST1JfTkFNRVNQQUNFKGJ1ZmZlcl9wdHIsIHN0YXR1cyk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworCX0KKworCWlmICghb3ApIHsKKworCQkvKiBDcmVhdGUgYSBuZXcgb3AgKi8KKworCQlvcCA9IGFjcGlfcHNfYWxsb2Nfb3Aod2Fsa19zdGF0ZS0+b3Bjb2RlKTsKKwkJaWYgKCFvcCkgeworCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX01FTU9SWSk7CisJCX0KKworCQkvKiBJbml0aWFsaXplIHRoZSBuZXcgb3AgKi8KKworCQlpZiAobm9kZSkgeworCQkJb3AtPm5hbWVkLm5hbWUgPSBub2RlLT5uYW1lLmludGVnZXI7CisJCX0KKwkJKm91dF9vcCA9IG9wOworCX0KKworCS8qCisJICogUHV0IHRoZSBOb2RlIGluIHRoZSAib3AiIG9iamVjdCB0aGF0IHRoZSBwYXJzZXIgdXNlcywgc28gd2UKKwkgKiBjYW4gZ2V0IGl0IGFnYWluIHF1aWNrbHkgd2hlbiB0aGlzIHNjb3BlIGlzIGNsb3NlZAorCSAqLworCW9wLT5jb21tb24ubm9kZSA9IG5vZGU7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfZHNfbG9hZDJfZW5kX29wCisgKgorICogUEFSQU1FVEVSUzogIHdhbGtfc3RhdGUgICAgICAtIEN1cnJlbnQgc3RhdGUgb2YgdGhlIHBhcnNlIHRyZWUgd2FsaworICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogQXNjZW5kaW5nIGNhbGxiYWNrIHVzZWQgZHVyaW5nIHRoZSBsb2FkaW5nIG9mIHRoZSBuYW1lc3BhY2UsCisgKiAgICAgICAgICAgICAgYm90aCBjb250cm9sIG1ldGhvZHMgYW5kIGV2ZXJ5dGhpbmcgZWxzZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCithY3BpX3N0YXR1cyBhY3BpX2RzX2xvYWQyX2VuZF9vcChzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKQoreworCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpvcDsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKKwlhY3BpX29iamVjdF90eXBlIG9iamVjdF90eXBlOworCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlOworCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICphcmc7CisJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5ld19ub2RlOworI2lmbmRlZiBBQ1BJX05PX01FVEhPRF9FWEVDVVRJT04KKwl1MzIgaTsKKwl1OCByZWdpb25fc3BhY2U7CisjZW5kaWYKKworCUFDUElfRlVOQ1RJT05fVFJBQ0UoZHNfbG9hZDJfZW5kX29wKTsKKworCW9wID0gd2Fsa19zdGF0ZS0+b3A7CisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9ESVNQQVRDSCwgIk9wY29kZSBbJXNdIE9wICVwIFN0YXRlICVwXG4iLAorCQkJICB3YWxrX3N0YXRlLT5vcF9pbmZvLT5uYW1lLCBvcCwgd2Fsa19zdGF0ZSkpOworCisJLyogQ2hlY2sgaWYgb3Bjb2RlIGhhZCBhbiBhc3NvY2lhdGVkIG5hbWVzcGFjZSBvYmplY3QgKi8KKworCWlmICghKHdhbGtfc3RhdGUtPm9wX2luZm8tPmZsYWdzICYgQU1MX05TT0JKRUNUKSkgeworI2lmbmRlZiBBQ1BJX05PX01FVEhPRF9FWEVDVVRJT04KKyNpZmRlZiBBQ1BJX0VOQUJMRV9NT0RVTEVfTEVWRUxfQ09ERQorCQkvKiBObyBuYW1lc3BhY2Ugb2JqZWN0LiBFeGVjdXRhYmxlIG9wY29kZT8gKi8KKworCQlpZiAoKHdhbGtfc3RhdGUtPm9wX2luZm8tPmNsYXNzID09IEFNTF9DTEFTU19FWEVDVVRFKSB8fAorCQkgICAgKHdhbGtfc3RhdGUtPm9wX2luZm8tPmNsYXNzID09IEFNTF9DTEFTU19DT05UUk9MKSkgeworCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9ESVNQQVRDSCwKKwkJCQkJICAiRW5kL0VYRUM6ICAgJXMgKGZsICU4LjhYKVxuIiwKKwkJCQkJICB3YWxrX3N0YXRlLT5vcF9pbmZvLT5uYW1lLAorCQkJCQkgIHdhbGtfc3RhdGUtPm9wX2luZm8tPmZsYWdzKSk7CisKKwkJCS8qIEV4ZWN1dGluZyBhIHR5cGUxIG9yIHR5cGUyIG9wY29kZSBvdXRzaWRlIG9mIGEgbWV0aG9kICovCisKKwkJCXN0YXR1cyA9IGFjcGlfZHNfZXhlY19lbmRfb3Aod2Fsa19zdGF0ZSk7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKKwkJfQorI2VuZGlmCisjZW5kaWYKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKKwl9CisKKwlpZiAob3AtPmNvbW1vbi5hbWxfb3Bjb2RlID09IEFNTF9TQ09QRV9PUCkgeworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0RJU1BBVENILAorCQkJCSAgIkVuZGluZyBzY29wZSBPcD0lcCBTdGF0ZT0lcFxuIiwgb3AsCisJCQkJICB3YWxrX3N0YXRlKSk7CisJfQorCisJb2JqZWN0X3R5cGUgPSB3YWxrX3N0YXRlLT5vcF9pbmZvLT5vYmplY3RfdHlwZTsKKworCS8qCisJICogR2V0IHRoZSBOb2RlL25hbWUgZnJvbSB0aGUgZWFybGllciBsb29rdXAKKwkgKiAoSXQgd2FzIHNhdmVkIGluIHRoZSAqb3Agc3RydWN0dXJlKQorCSAqLworCW5vZGUgPSBvcC0+Y29tbW9uLm5vZGU7CisKKwkvKgorCSAqIFB1dCB0aGUgTm9kZSBvbiB0aGUgb2JqZWN0IHN0YWNrIChDb250YWlucyB0aGUgQUNQSSBOYW1lIG9mCisJICogdGhpcyBvYmplY3QpCisJICovCisJd2Fsa19zdGF0ZS0+b3BlcmFuZHNbMF0gPSAodm9pZCAqKW5vZGU7CisJd2Fsa19zdGF0ZS0+bnVtX29wZXJhbmRzID0gMTsKKworCS8qIFBvcCB0aGUgc2NvcGUgc3RhY2sgKi8KKworCWlmIChhY3BpX25zX29wZW5zX3Njb3BlKG9iamVjdF90eXBlKSAmJgorCSAgICAob3AtPmNvbW1vbi5hbWxfb3Bjb2RlICE9IEFNTF9JTlRfTUVUSE9EQ0FMTF9PUCkpIHsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9ESVNQQVRDSCwKKwkJCQkgICIoJXMpIFBvcHBpbmcgc2NvcGUgZm9yIE9wICVwXG4iLAorCQkJCSAgYWNwaV91dF9nZXRfdHlwZV9uYW1lKG9iamVjdF90eXBlKSwgb3ApKTsKKworCQlzdGF0dXMgPSBhY3BpX2RzX3Njb3BlX3N0YWNrX3BvcCh3YWxrX3N0YXRlKTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQlnb3RvIGNsZWFudXA7CisJCX0KKwl9CisKKwkvKgorCSAqIE5hbWVkIG9wZXJhdGlvbnMgYXJlIGFzIGZvbGxvd3M6CisJICoKKwkgKiBBTUxfQUxJQVMKKwkgKiBBTUxfQkFOS0ZJRUxECisJICogQU1MX0NSRUFURUJJVEZJRUxECisJICogQU1MX0NSRUFURUJZVEVGSUVMRAorCSAqIEFNTF9DUkVBVEVEV09SREZJRUxECisJICogQU1MX0NSRUFURUZJRUxECisJICogQU1MX0NSRUFURVFXT1JERklFTEQKKwkgKiBBTUxfQ1JFQVRFV09SREZJRUxECisJICogQU1MX0RBVEFfUkVHSU9OCisJICogQU1MX0RFVklDRQorCSAqIEFNTF9FVkVOVAorCSAqIEFNTF9GSUVMRAorCSAqIEFNTF9JTkRFWEZJRUxECisJICogQU1MX01FVEhPRAorCSAqIEFNTF9NRVRIT0RDQUxMCisJICogQU1MX01VVEVYCisJICogQU1MX05BTUUKKwkgKiBBTUxfTkFNRURGSUVMRAorCSAqIEFNTF9PUFJFR0lPTgorCSAqIEFNTF9QT1dFUlJFUworCSAqIEFNTF9QUk9DRVNTT1IKKwkgKiBBTUxfU0NPUEUKKwkgKiBBTUxfVEhFUk1BTFpPTkUKKwkgKi8KKworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRElTUEFUQ0gsCisJCQkgICJDcmVhdGUtTG9hZCBbJXNdIFN0YXRlPSVwIE9wPSVwIE5hbWVkT2JqPSVwXG4iLAorCQkJICBhY3BpX3BzX2dldF9vcGNvZGVfbmFtZShvcC0+Y29tbW9uLmFtbF9vcGNvZGUpLAorCQkJICB3YWxrX3N0YXRlLCBvcCwgbm9kZSkpOworCisJLyogRGVjb2RlIHRoZSBvcGNvZGUgKi8KKworCWFyZyA9IG9wLT5jb21tb24udmFsdWUuYXJnOworCisJc3dpdGNoICh3YWxrX3N0YXRlLT5vcF9pbmZvLT50eXBlKSB7CisjaWZuZGVmIEFDUElfTk9fTUVUSE9EX0VYRUNVVElPTgorCisJY2FzZSBBTUxfVFlQRV9DUkVBVEVfRklFTEQ6CisJCS8qCisJCSAqIENyZWF0ZSB0aGUgZmllbGQgb2JqZWN0LCBidXQgdGhlIGZpZWxkIGJ1ZmZlciBhbmQgaW5kZXggbXVzdAorCQkgKiBiZSBldmFsdWF0ZWQgbGF0ZXIgZHVyaW5nIHRoZSBleGVjdXRpb24gcGhhc2UKKwkJICovCisJCXN0YXR1cyA9IGFjcGlfZHNfY3JlYXRlX2J1ZmZlcl9maWVsZChvcCwgd2Fsa19zdGF0ZSk7CisJCWJyZWFrOworCisJY2FzZSBBTUxfVFlQRV9OQU1FRF9GSUVMRDoKKwkJLyoKKwkJICogSWYgd2UgYXJlIGV4ZWN1dGluZyBhIG1ldGhvZCwgaW5pdGlhbGl6ZSB0aGUgZmllbGQKKwkJICovCisJCWlmICh3YWxrX3N0YXRlLT5tZXRob2Rfbm9kZSkgeworCQkJc3RhdHVzID0gYWNwaV9kc19pbml0X2ZpZWxkX29iamVjdHMob3AsIHdhbGtfc3RhdGUpOworCQl9CisKKwkJc3dpdGNoIChvcC0+Y29tbW9uLmFtbF9vcGNvZGUpIHsKKwkJY2FzZSBBTUxfSU5ERVhfRklFTERfT1A6CisKKwkJCXN0YXR1cyA9CisJCQkgICAgYWNwaV9kc19jcmVhdGVfaW5kZXhfZmllbGQob3AsCisJCQkJCQkgICAgICAgKGFjcGlfaGFuZGxlKSBhcmctPgorCQkJCQkJICAgICAgIGNvbW1vbi5ub2RlLCB3YWxrX3N0YXRlKTsKKwkJCWJyZWFrOworCisJCWNhc2UgQU1MX0JBTktfRklFTERfT1A6CisKKwkJCXN0YXR1cyA9CisJCQkgICAgYWNwaV9kc19jcmVhdGVfYmFua19maWVsZChvcCwgYXJnLT5jb21tb24ubm9kZSwKKwkJCQkJCSAgICAgIHdhbGtfc3RhdGUpOworCQkJYnJlYWs7CisKKwkJY2FzZSBBTUxfRklFTERfT1A6CisKKwkJCXN0YXR1cyA9CisJCQkgICAgYWNwaV9kc19jcmVhdGVfZmllbGQob3AsIGFyZy0+Y29tbW9uLm5vZGUsCisJCQkJCQkgd2Fsa19zdGF0ZSk7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJLyogQWxsIE5BTUVEX0ZJRUxEIG9wY29kZXMgbXVzdCBiZSBoYW5kbGVkIGFib3ZlICovCisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKworCWNhc2UgQU1MX1RZUEVfTkFNRURfU0lNUExFOgorCisJCXN0YXR1cyA9IGFjcGlfZHNfY3JlYXRlX29wZXJhbmRzKHdhbGtfc3RhdGUsIGFyZyk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJZ290byBjbGVhbnVwOworCQl9CisKKwkJc3dpdGNoIChvcC0+Y29tbW9uLmFtbF9vcGNvZGUpIHsKKwkJY2FzZSBBTUxfUFJPQ0VTU09SX09QOgorCisJCQlzdGF0dXMgPSBhY3BpX2V4X2NyZWF0ZV9wcm9jZXNzb3Iod2Fsa19zdGF0ZSk7CisJCQlicmVhazsKKworCQljYXNlIEFNTF9QT1dFUl9SRVNfT1A6CisKKwkJCXN0YXR1cyA9IGFjcGlfZXhfY3JlYXRlX3Bvd2VyX3Jlc291cmNlKHdhbGtfc3RhdGUpOworCQkJYnJlYWs7CisKKwkJY2FzZSBBTUxfTVVURVhfT1A6CisKKwkJCXN0YXR1cyA9IGFjcGlfZXhfY3JlYXRlX211dGV4KHdhbGtfc3RhdGUpOworCQkJYnJlYWs7CisKKwkJY2FzZSBBTUxfRVZFTlRfT1A6CisKKwkJCXN0YXR1cyA9IGFjcGlfZXhfY3JlYXRlX2V2ZW50KHdhbGtfc3RhdGUpOworCQkJYnJlYWs7CisKKwkJY2FzZSBBTUxfQUxJQVNfT1A6CisKKwkJCXN0YXR1cyA9IGFjcGlfZXhfY3JlYXRlX2FsaWFzKHdhbGtfc3RhdGUpOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCS8qIFVua25vd24gb3Bjb2RlICovCisKKwkJCXN0YXR1cyA9IEFFX09LOworCQkJZ290byBjbGVhbnVwOworCQl9CisKKwkJLyogRGVsZXRlIG9wZXJhbmRzICovCisKKwkJZm9yIChpID0gMTsgaSA8IHdhbGtfc3RhdGUtPm51bV9vcGVyYW5kczsgaSsrKSB7CisJCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2Uod2Fsa19zdGF0ZS0+b3BlcmFuZHNbaV0pOworCQkJd2Fsa19zdGF0ZS0+b3BlcmFuZHNbaV0gPSBOVUxMOworCQl9CisKKwkJYnJlYWs7CisjZW5kaWYJCQkJLyogQUNQSV9OT19NRVRIT0RfRVhFQ1VUSU9OICovCisKKwljYXNlIEFNTF9UWVBFX05BTUVEX0NPTVBMRVg6CisKKwkJc3dpdGNoIChvcC0+Y29tbW9uLmFtbF9vcGNvZGUpIHsKKyNpZm5kZWYgQUNQSV9OT19NRVRIT0RfRVhFQ1VUSU9OCisJCWNhc2UgQU1MX1JFR0lPTl9PUDoKKwkJY2FzZSBBTUxfREFUQV9SRUdJT05fT1A6CisKKwkJCWlmIChvcC0+Y29tbW9uLmFtbF9vcGNvZGUgPT0gQU1MX1JFR0lPTl9PUCkgeworCQkJCXJlZ2lvbl9zcGFjZSA9IChhY3BpX2Fkcl9zcGFjZV90eXBlKQorCQkJCSAgICAoKG9wLT5jb21tb24udmFsdWUuYXJnKS0+Y29tbW9uLnZhbHVlLgorCQkJCSAgICAgaW50ZWdlcik7CisJCQl9IGVsc2UgeworCQkJCXJlZ2lvbl9zcGFjZSA9IFJFR0lPTl9EQVRBX1RBQkxFOworCQkJfQorCisJCQkvKgorCQkJICogSWYgd2UgYXJlIGV4ZWN1dGluZyBhIG1ldGhvZCwgaW5pdGlhbGl6ZSB0aGUgcmVnaW9uCisJCQkgKi8KKwkJCWlmICh3YWxrX3N0YXRlLT5tZXRob2Rfbm9kZSkgeworCQkJCXN0YXR1cyA9CisJCQkJICAgIGFjcGlfZXhfY3JlYXRlX3JlZ2lvbihvcC0+bmFtZWQuZGF0YSwKKwkJCQkJCQkgIG9wLT5uYW1lZC5sZW5ndGgsCisJCQkJCQkJICByZWdpb25fc3BhY2UsCisJCQkJCQkJICB3YWxrX3N0YXRlKTsKKwkJCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCQkJcmV0dXJuIChzdGF0dXMpOworCQkJCX0KKwkJCX0KKworCQkJLyoKKwkJCSAqIFRoZSBvcF9yZWdpb24gaXMgbm90IGZ1bGx5IHBhcnNlZCBhdCB0aGlzIHRpbWUuIE9ubHkgdmFsaWQKKwkJCSAqIGFyZ3VtZW50IGlzIHRoZSBzcGFjZV9pZC4gKFdlIG11c3Qgc2F2ZSB0aGUgYWRkcmVzcyBvZiB0aGUKKwkJCSAqIEFNTCBvZiB0aGUgYWRkcmVzcyBhbmQgbGVuZ3RoIG9wZXJhbmRzKQorCQkJICovCisKKwkJCS8qCisJCQkgKiBJZiB3ZSBoYXZlIGEgdmFsaWQgcmVnaW9uLCBpbml0aWFsaXplIGl0CisJCQkgKiBOYW1lc3BhY2UgaXMgTk9UIGxvY2tlZCBhdCB0aGlzIHBvaW50LgorCQkJICovCisJCQlzdGF0dXMgPQorCQkJICAgIGFjcGlfZXZfaW5pdGlhbGl6ZV9yZWdpb24KKwkJCSAgICAoYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0KG5vZGUpLCBGQUxTRSk7CisJCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCQkvKgorCQkJCSAqICBJZiBBRV9OT1RfRVhJU1QgaXMgcmV0dXJuZWQsIGl0IGlzIG5vdCBmYXRhbAorCQkJCSAqICBiZWNhdXNlIG1hbnkgcmVnaW9ucyBnZXQgY3JlYXRlZCBiZWZvcmUgYSBoYW5kbGVyCisJCQkJICogIGlzIGluc3RhbGxlZCBmb3Igc2FpZCByZWdpb24uCisJCQkJICovCisJCQkJaWYgKEFFX05PVF9FWElTVCA9PSBzdGF0dXMpIHsKKwkJCQkJc3RhdHVzID0gQUVfT0s7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBBTUxfTkFNRV9PUDoKKworCQkJc3RhdHVzID0gYWNwaV9kc19jcmVhdGVfbm9kZSh3YWxrX3N0YXRlLCBub2RlLCBvcCk7CisJCQlicmVhazsKKworCQljYXNlIEFNTF9NRVRIT0RfT1A6CisJCQkvKgorCQkJICogbWV0aG9kX29wIHBrZ19sZW5ndGggbmFtZV9zdHJpbmcgbWV0aG9kX2ZsYWdzIHRlcm1fbGlzdAorCQkJICoKKwkJCSAqIE5vdGU6IFdlIG11c3QgY3JlYXRlIHRoZSBtZXRob2Qgbm9kZS9vYmplY3QgcGFpciBhcyBzb29uIGFzIHdlCisJCQkgKiBzZWUgdGhlIG1ldGhvZCBkZWNsYXJhdGlvbi4gVGhpcyBhbGxvd3MgbGF0ZXIgcGFzczEgcGFyc2luZworCQkJICogb2YgaW52b2NhdGlvbnMgb2YgdGhlIG1ldGhvZCAobmVlZCB0byBrbm93IHRoZSBudW1iZXIgb2YKKwkJCSAqIGFyZ3VtZW50cy4pCisJCQkgKi8KKwkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRElTUEFUQ0gsCisJCQkJCSAgIkxPQURJTkctTWV0aG9kOiBTdGF0ZT0lcCBPcD0lcCBOYW1lZE9iaj0lcFxuIiwKKwkJCQkJICB3YWxrX3N0YXRlLCBvcCwgb3AtPm5hbWVkLm5vZGUpKTsKKworCQkJaWYgKCFhY3BpX25zX2dldF9hdHRhY2hlZF9vYmplY3Qob3AtPm5hbWVkLm5vZGUpKSB7CisJCQkJd2Fsa19zdGF0ZS0+b3BlcmFuZHNbMF0gPQorCQkJCSAgICBBQ1BJX0NBU1RfUFRSKHZvaWQsIG9wLT5uYW1lZC5ub2RlKTsKKwkJCQl3YWxrX3N0YXRlLT5udW1fb3BlcmFuZHMgPSAxOworCisJCQkJc3RhdHVzID0KKwkJCQkgICAgYWNwaV9kc19jcmVhdGVfb3BlcmFuZHMod2Fsa19zdGF0ZSwKKwkJCQkJCQkgICAgb3AtPmNvbW1vbi52YWx1ZS4KKwkJCQkJCQkgICAgYXJnKTsKKwkJCQlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpIHsKKwkJCQkJc3RhdHVzID0KKwkJCQkJICAgIGFjcGlfZXhfY3JlYXRlX21ldGhvZChvcC0+bmFtZWQuCisJCQkJCQkJCSAgZGF0YSwKKwkJCQkJCQkJICBvcC0+bmFtZWQuCisJCQkJCQkJCSAgbGVuZ3RoLAorCQkJCQkJCQkgIHdhbGtfc3RhdGUpOworCQkJCX0KKwkJCQl3YWxrX3N0YXRlLT5vcGVyYW5kc1swXSA9IE5VTEw7CisJCQkJd2Fsa19zdGF0ZS0+bnVtX29wZXJhbmRzID0gMDsKKworCQkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKworI2VuZGlmCQkJCS8qIEFDUElfTk9fTUVUSE9EX0VYRUNVVElPTiAqLworCisJCWRlZmF1bHQ6CisJCQkvKiBBbGwgTkFNRURfQ09NUExFWCBvcGNvZGVzIG11c3QgYmUgaGFuZGxlZCBhYm92ZSAqLworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIEFNTF9DTEFTU19JTlRFUk5BTDoKKworCQkvKiBjYXNlIEFNTF9JTlRfTkFNRVBBVEhfT1A6ICovCisJCWJyZWFrOworCisJY2FzZSBBTUxfQ0xBU1NfTUVUSE9EX0NBTEw6CisKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9ESVNQQVRDSCwKKwkJCQkgICJSRVNPTFZJTkctTWV0aG9kQ2FsbDogU3RhdGU9JXAgT3A9JXAgTmFtZWRPYmo9JXBcbiIsCisJCQkJICB3YWxrX3N0YXRlLCBvcCwgbm9kZSkpOworCisJCS8qCisJCSAqIExvb2t1cCB0aGUgbWV0aG9kIG5hbWUgYW5kIHNhdmUgdGhlIE5vZGUKKwkJICovCisJCXN0YXR1cyA9CisJCSAgICBhY3BpX25zX2xvb2t1cCh3YWxrX3N0YXRlLT5zY29wZV9pbmZvLAorCQkJCSAgIGFyZy0+Y29tbW9uLnZhbHVlLnN0cmluZywgQUNQSV9UWVBFX0FOWSwKKwkJCQkgICBBQ1BJX0lNT0RFX0xPQURfUEFTUzIsCisJCQkJICAgQUNQSV9OU19TRUFSQ0hfUEFSRU5UIHwKKwkJCQkgICBBQ1BJX05TX0RPTlRfT1BFTl9TQ09QRSwgd2Fsa19zdGF0ZSwKKwkJCQkgICAmKG5ld19ub2RlKSk7CisJCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkgeworCQkJLyoKKwkJCSAqIE1ha2Ugc3VyZSB0aGF0IHdoYXQgd2UgZm91bmQgaXMgaW5kZWVkIGEgbWV0aG9kCisJCQkgKiBXZSBkaWRuJ3Qgc2VhcmNoIGZvciBhIG1ldGhvZCBvbiBwdXJwb3NlLCB0byBzZWUgaWYgdGhlIG5hbWUKKwkJCSAqIHdvdWxkIHJlc29sdmUKKwkJCSAqLworCQkJaWYgKG5ld19ub2RlLT50eXBlICE9IEFDUElfVFlQRV9NRVRIT0QpIHsKKwkJCQlzdGF0dXMgPSBBRV9BTUxfT1BFUkFORF9UWVBFOworCQkJfQorCisJCQkvKiBXZSBjb3VsZCBwdXQgdGhlIHJldHVybmVkIG9iamVjdCAoTm9kZSkgb24gdGhlIG9iamVjdCBzdGFjayBmb3IKKwkJCSAqIGxhdGVyLCBidXQgZm9yIG5vdywgd2Ugd2lsbCBwdXQgaXQgaW4gdGhlICJvcCIgb2JqZWN0IHRoYXQgdGhlCisJCQkgKiBwYXJzZXIgdXNlcywgc28gd2UgY2FuIGdldCBpdCBhZ2FpbiBhdCB0aGUgZW5kIG9mIHRoaXMgc2NvcGUKKwkJCSAqLworCQkJb3AtPmNvbW1vbi5ub2RlID0gbmV3X25vZGU7CisJCX0gZWxzZSB7CisJCQlBQ1BJX0VSUk9SX05BTUVTUEFDRShhcmctPmNvbW1vbi52YWx1ZS5zdHJpbmcsIHN0YXR1cyk7CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKyAgICAgIGNsZWFudXA6CisKKwkvKiBSZW1vdmUgdGhlIE5vZGUgcHVzaGVkIGF0IHRoZSB2ZXJ5IGJlZ2lubmluZyAqLworCisJd2Fsa19zdGF0ZS0+b3BlcmFuZHNbMF0gPSBOVUxMOworCXdhbGtfc3RhdGUtPm51bV9vcGVyYW5kcyA9IDA7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2Rzd3Njb3BlLmMgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2Rzd3Njb3BlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTA4NjQ1ZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvZHN3c2NvcGUuYwpAQCAtMCwwICsxLDIxNCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIE1vZHVsZSBOYW1lOiBkc3dzY29wZSAtIFNjb3BlIHN0YWNrIG1hbmlwdWxhdGlvbgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDgsIEludGVsIENvcnAuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCisgKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSBhdCBtaW5pbXVtIGEgZGlzY2xhaW1lcgorICogICAgc3Vic3RhbnRpYWxseSBzaW1pbGFyIHRvIHRoZSAiTk8gV0FSUkFOVFkiIGRpc2NsYWltZXIgYmVsb3cKKyAqICAgICgiRGlzY2xhaW1lciIpIGFuZCBhbnkgcmVkaXN0cmlidXRpb24gbXVzdCBiZSBjb25kaXRpb25lZCB1cG9uCisgKiAgICBpbmNsdWRpbmcgYSBzdWJzdGFudGlhbGx5IHNpbWlsYXIgRGlzY2xhaW1lciByZXF1aXJlbWVudCBmb3IgZnVydGhlcgorICogICAgYmluYXJ5IHJlZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzCisgKiAgICBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIE5PIFdBUlJBTlRZCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORworICogSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCisgKi8KKworI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgorI2luY2x1ZGUgImFjY29tbW9uLmgiCisjaW5jbHVkZSAiYWNkaXNwYXQuaCIKKworI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfRElTUEFUQ0hFUgorQUNQSV9NT0RVTEVfTkFNRSgiZHN3c2NvcGUiKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX2RzX3Njb3BlX3N0YWNrX2NsZWFyCisgKgorICogUEFSQU1FVEVSUzogIHdhbGtfc3RhdGUgICAgICAtIEN1cnJlbnQgc3RhdGUKKyAqCisgKiBSRVRVUk46ICAgICAgTm9uZQorICoKKyAqIERFU0NSSVBUSU9OOiBQb3AgKGFuZCBmcmVlKSBldmVyeXRoaW5nIG9uIHRoZSBzY29wZSBzdGFjayBleGNlcHQgdGhlCisgKiAgICAgICAgICAgICAgcm9vdCBzY29wZSBvYmplY3QgKHdoaWNoIHJlbWFpbnMgYXQgdGhlIHN0YWNrIHRvcC4pCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYWNwaV9kc19zY29wZV9zdGFja19jbGVhcihzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKQoreworCXVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSAqc2NvcGVfaW5mbzsKKworCUFDUElfRlVOQ1RJT05fTkFNRShkc19zY29wZV9zdGFja19jbGVhcik7CisKKwl3aGlsZSAod2Fsa19zdGF0ZS0+c2NvcGVfaW5mbykgeworCisJCS8qIFBvcCBhIHNjb3BlIG9mZiB0aGUgc3RhY2sgKi8KKworCQlzY29wZV9pbmZvID0gd2Fsa19zdGF0ZS0+c2NvcGVfaW5mbzsKKwkJd2Fsa19zdGF0ZS0+c2NvcGVfaW5mbyA9IHNjb3BlX2luZm8tPnNjb3BlLm5leHQ7CisKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FWEVDLAorCQkJCSAgIlBvcHBlZCBvYmplY3QgdHlwZSAoJXMpXG4iLAorCQkJCSAgYWNwaV91dF9nZXRfdHlwZV9uYW1lKHNjb3BlX2luZm8tPmNvbW1vbi4KKwkJCQkJCQl2YWx1ZSkpKTsKKwkJYWNwaV91dF9kZWxldGVfZ2VuZXJpY19zdGF0ZShzY29wZV9pbmZvKTsKKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfZHNfc2NvcGVfc3RhY2tfcHVzaAorICoKKyAqIFBBUkFNRVRFUlM6ICBOb2RlICAgICAgICAgICAgLSBOYW1lIHRvIGJlIG1hZGUgY3VycmVudAorICogICAgICAgICAgICAgIFR5cGUgICAgICAgICAgICAtIFR5cGUgb2YgZnJhbWUgYmVpbmcgcHVzaGVkCisgKiAgICAgICAgICAgICAgd2Fsa19zdGF0ZSAgICAgIC0gQ3VycmVudCBzdGF0ZQorICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogUHVzaCB0aGUgY3VycmVudCBzY29wZSBvbiB0aGUgc2NvcGUgc3RhY2ssIGFuZCBtYWtlIHRoZQorICogICAgICAgICAgICAgIHBhc3NlZCBOb2RlIGN1cnJlbnQuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworYWNwaV9zdGF0dXMKK2FjcGlfZHNfc2NvcGVfc3RhY2tfcHVzaChzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZSwKKwkJCSBhY3BpX29iamVjdF90eXBlIHR5cGUsCisJCQkgc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSkKK3sKKwl1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgKnNjb3BlX2luZm87CisJdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICpvbGRfc2NvcGVfaW5mbzsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0UoZHNfc2NvcGVfc3RhY2tfcHVzaCk7CisKKwlpZiAoIW5vZGUpIHsKKworCQkvKiBJbnZhbGlkIHNjb3BlICAgKi8KKworCQlBQ1BJX0VSUk9SKChBRV9JTkZPLCAiTnVsbCBzY29wZSBwYXJhbWV0ZXIiKSk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfUEFSQU1FVEVSKTsKKwl9CisKKwkvKiBNYWtlIHN1cmUgb2JqZWN0IHR5cGUgaXMgdmFsaWQgKi8KKworCWlmICghYWNwaV91dF92YWxpZF9vYmplY3RfdHlwZSh0eXBlKSkgeworCQlBQ1BJX1dBUk5JTkcoKEFFX0lORk8sICJJbnZhbGlkIG9iamVjdCB0eXBlOiAweCVYIiwgdHlwZSkpOworCX0KKworCS8qIEFsbG9jYXRlIGEgbmV3IHNjb3BlIG9iamVjdCAqLworCisJc2NvcGVfaW5mbyA9IGFjcGlfdXRfY3JlYXRlX2dlbmVyaWNfc3RhdGUoKTsKKwlpZiAoIXNjb3BlX2luZm8pIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX01FTU9SWSk7CisJfQorCisJLyogSW5pdCBuZXcgc2NvcGUgb2JqZWN0ICovCisKKwlzY29wZV9pbmZvLT5jb21tb24uZGVzY3JpcHRvcl90eXBlID0gQUNQSV9ERVNDX1RZUEVfU1RBVEVfV1NDT1BFOworCXNjb3BlX2luZm8tPnNjb3BlLm5vZGUgPSBub2RlOworCXNjb3BlX2luZm8tPmNvbW1vbi52YWx1ZSA9ICh1MTYpIHR5cGU7CisKKwl3YWxrX3N0YXRlLT5zY29wZV9kZXB0aCsrOworCisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FWEVDLAorCQkJICAiWyUuMmRdIFB1c2hlZCBzY29wZSAiLAorCQkJICAodTMyKSB3YWxrX3N0YXRlLT5zY29wZV9kZXB0aCkpOworCisJb2xkX3Njb3BlX2luZm8gPSB3YWxrX3N0YXRlLT5zY29wZV9pbmZvOworCWlmIChvbGRfc2NvcGVfaW5mbykgeworCQlBQ1BJX0RFQlVHX1BSSU5UX1JBVygoQUNQSV9EQl9FWEVDLAorCQkJCSAgICAgICJbJTQuNHNdICglcykiLAorCQkJCSAgICAgIGFjcGlfdXRfZ2V0X25vZGVfbmFtZShvbGRfc2NvcGVfaW5mby0+CisJCQkJCQkJICAgIHNjb3BlLm5vZGUpLAorCQkJCSAgICAgIGFjcGlfdXRfZ2V0X3R5cGVfbmFtZShvbGRfc2NvcGVfaW5mby0+CisJCQkJCQkJICAgIGNvbW1vbi52YWx1ZSkpKTsKKwl9IGVsc2UgeworCQlBQ1BJX0RFQlVHX1BSSU5UX1JBVygoQUNQSV9EQl9FWEVDLCAiW1xcX19fXSAoJXMpIiwgIlJPT1QiKSk7CisJfQorCisJQUNQSV9ERUJVR19QUklOVF9SQVcoKEFDUElfREJfRVhFQywKKwkJCSAgICAgICIsIE5ldyBzY29wZSAtPiBbJTQuNHNdICglcylcbiIsCisJCQkgICAgICBhY3BpX3V0X2dldF9ub2RlX25hbWUoc2NvcGVfaW5mby0+c2NvcGUubm9kZSksCisJCQkgICAgICBhY3BpX3V0X2dldF90eXBlX25hbWUoc2NvcGVfaW5mby0+Y29tbW9uLnZhbHVlKSkpOworCisJLyogUHVzaCBuZXcgc2NvcGUgb2JqZWN0IG9udG8gc3RhY2sgKi8KKworCWFjcGlfdXRfcHVzaF9nZW5lcmljX3N0YXRlKCZ3YWxrX3N0YXRlLT5zY29wZV9pbmZvLCBzY29wZV9pbmZvKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX2RzX3Njb3BlX3N0YWNrX3BvcAorICoKKyAqIFBBUkFNRVRFUlM6ICB3YWxrX3N0YXRlICAgICAgLSBDdXJyZW50IHN0YXRlCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBQb3AgdGhlIHNjb3BlIHN0YWNrIG9uY2UuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworYWNwaV9zdGF0dXMgYWNwaV9kc19zY29wZV9zdGFja19wb3Aoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSkKK3sKKwl1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgKnNjb3BlX2luZm87CisJdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICpuZXdfc2NvcGVfaW5mbzsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0UoZHNfc2NvcGVfc3RhY2tfcG9wKTsKKworCS8qCisJICogUG9wIHNjb3BlIGluZm8gb2JqZWN0IG9mZiB0aGUgc3RhY2suCisJICovCisJc2NvcGVfaW5mbyA9IGFjcGlfdXRfcG9wX2dlbmVyaWNfc3RhdGUoJndhbGtfc3RhdGUtPnNjb3BlX2luZm8pOworCWlmICghc2NvcGVfaW5mbykgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfU1RBQ0tfVU5ERVJGTE9XKTsKKwl9CisKKwl3YWxrX3N0YXRlLT5zY29wZV9kZXB0aC0tOworCisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FWEVDLAorCQkJICAiWyUuMmRdIFBvcHBlZCBzY29wZSBbJTQuNHNdICglcyksIE5ldyBzY29wZSAtPiAiLAorCQkJICAodTMyKSB3YWxrX3N0YXRlLT5zY29wZV9kZXB0aCwKKwkJCSAgYWNwaV91dF9nZXRfbm9kZV9uYW1lKHNjb3BlX2luZm8tPnNjb3BlLm5vZGUpLAorCQkJICBhY3BpX3V0X2dldF90eXBlX25hbWUoc2NvcGVfaW5mby0+Y29tbW9uLnZhbHVlKSkpOworCisJbmV3X3Njb3BlX2luZm8gPSB3YWxrX3N0YXRlLT5zY29wZV9pbmZvOworCWlmIChuZXdfc2NvcGVfaW5mbykgeworCQlBQ1BJX0RFQlVHX1BSSU5UX1JBVygoQUNQSV9EQl9FWEVDLAorCQkJCSAgICAgICJbJTQuNHNdICglcylcbiIsCisJCQkJICAgICAgYWNwaV91dF9nZXRfbm9kZV9uYW1lKG5ld19zY29wZV9pbmZvLT4KKwkJCQkJCQkgICAgc2NvcGUubm9kZSksCisJCQkJICAgICAgYWNwaV91dF9nZXRfdHlwZV9uYW1lKG5ld19zY29wZV9pbmZvLT4KKwkJCQkJCQkgICAgY29tbW9uLnZhbHVlKSkpOworCX0gZWxzZSB7CisJCUFDUElfREVCVUdfUFJJTlRfUkFXKChBQ1BJX0RCX0VYRUMsICJbXFxfX19dIChST09UKVxuIikpOworCX0KKworCWFjcGlfdXRfZGVsZXRlX2dlbmVyaWNfc3RhdGUoc2NvcGVfaW5mbyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvZHN3c3RhdGUuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvZHN3c3RhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MGY5MmJmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS9kc3dzdGF0ZS5jCkBAIC0wLDAgKzEsNzUzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogTW9kdWxlIE5hbWU6IGRzd3N0YXRlIC0gRGlzcGF0Y2hlciBwYXJzZSB0cmVlIHdhbGsgbWFuYWdlbWVudCByb3V0aW5lcworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDgsIEludGVsIENvcnAuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCisgKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSBhdCBtaW5pbXVtIGEgZGlzY2xhaW1lcgorICogICAgc3Vic3RhbnRpYWxseSBzaW1pbGFyIHRvIHRoZSAiTk8gV0FSUkFOVFkiIGRpc2NsYWltZXIgYmVsb3cKKyAqICAgICgiRGlzY2xhaW1lciIpIGFuZCBhbnkgcmVkaXN0cmlidXRpb24gbXVzdCBiZSBjb25kaXRpb25lZCB1cG9uCisgKiAgICBpbmNsdWRpbmcgYSBzdWJzdGFudGlhbGx5IHNpbWlsYXIgRGlzY2xhaW1lciByZXF1aXJlbWVudCBmb3IgZnVydGhlcgorICogICAgYmluYXJ5IHJlZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzCisgKiAgICBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIE5PIFdBUlJBTlRZCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORworICogSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCisgKi8KKworI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgorI2luY2x1ZGUgImFjY29tbW9uLmgiCisjaW5jbHVkZSAiYWNwYXJzZXIuaCIKKyNpbmNsdWRlICJhY2Rpc3BhdC5oIgorI2luY2x1ZGUgImFjbmFtZXNwLmgiCisKKyNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX0RJU1BBVENIRVIKK0FDUElfTU9EVUxFX05BTUUoImRzd3N0YXRlIikKKworICAvKiBMb2NhbCBwcm90b3R5cGVzICovCitzdGF0aWMgYWNwaV9zdGF0dXMgYWNwaV9kc19yZXN1bHRfc3RhY2tfcHVzaChzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3cyk7CitzdGF0aWMgYWNwaV9zdGF0dXMgYWNwaV9kc19yZXN1bHRfc3RhY2tfcG9wKHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndzKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9kc19yZXN1bHRfcG9wCisgKgorICogUEFSQU1FVEVSUzogIE9iamVjdCAgICAgICAgICAgICAgLSBXaGVyZSB0byByZXR1cm4gdGhlIHBvcHBlZCBvYmplY3QKKyAqICAgICAgICAgICAgICB3YWxrX3N0YXRlICAgICAgICAgIC0gQ3VycmVudCBXYWxrIHN0YXRlCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBQb3AgYW4gb2JqZWN0IG9mZiB0aGUgdG9wIG9mIHRoaXMgd2FsaydzIHJlc3VsdCBzdGFjaworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2FjcGlfc3RhdHVzCithY3BpX2RzX3Jlc3VsdF9wb3AodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKm9iamVjdCwKKwkJICAgc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSkKK3sKKwl1MzIgaW5kZXg7CisJdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICpzdGF0ZTsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisKKwlBQ1BJX0ZVTkNUSU9OX05BTUUoZHNfcmVzdWx0X3BvcCk7CisKKwlzdGF0ZSA9IHdhbGtfc3RhdGUtPnJlc3VsdHM7CisKKwkvKiBJbmNvcnJlY3Qgc3RhdGUgb2YgcmVzdWx0IHN0YWNrICovCisKKwlpZiAoc3RhdGUgJiYgIXdhbGtfc3RhdGUtPnJlc3VsdF9jb3VudCkgeworCQlBQ1BJX0VSUk9SKChBRV9JTkZPLCAiTm8gcmVzdWx0cyBvbiByZXN1bHQgc3RhY2siKSk7CisJCXJldHVybiAoQUVfQU1MX0lOVEVSTkFMKTsKKwl9CisKKwlpZiAoIXN0YXRlICYmIHdhbGtfc3RhdGUtPnJlc3VsdF9jb3VudCkgeworCQlBQ1BJX0VSUk9SKChBRV9JTkZPLCAiTm8gcmVzdWx0IHN0YXRlIGZvciByZXN1bHQgc3RhY2siKSk7CisJCXJldHVybiAoQUVfQU1MX0lOVEVSTkFMKTsKKwl9CisKKwkvKiBFbXB0eSByZXN1bHQgc3RhY2sgKi8KKworCWlmICghc3RhdGUpIHsKKwkJQUNQSV9FUlJPUigoQUVfSU5GTywgIlJlc3VsdCBzdGFjayBpcyBlbXB0eSEgU3RhdGU9JXAiLAorCQkJICAgIHdhbGtfc3RhdGUpKTsKKwkJcmV0dXJuIChBRV9BTUxfTk9fUkVUVVJOX1ZBTFVFKTsKKwl9CisKKwkvKiBSZXR1cm4gb2JqZWN0IG9mIHRoZSB0b3AgZWxlbWVudCBhbmQgY2xlYW4gdGhhdCB0b3AgZWxlbWVudCByZXN1bHQgc3RhY2sgKi8KKworCXdhbGtfc3RhdGUtPnJlc3VsdF9jb3VudC0tOworCWluZGV4ID0gd2Fsa19zdGF0ZS0+cmVzdWx0X2NvdW50ICUgQUNQSV9SRVNVTFRTX0ZSQU1FX09CSl9OVU07CisKKwkqb2JqZWN0ID0gc3RhdGUtPnJlc3VsdHMub2JqX2Rlc2NbaW5kZXhdOworCWlmICghKm9iamVjdCkgeworCQlBQ1BJX0VSUk9SKChBRV9JTkZPLAorCQkJICAgICJObyByZXN1bHQgb2JqZWN0cyBvbiByZXN1bHQgc3RhY2ssIFN0YXRlPSVwIiwKKwkJCSAgICB3YWxrX3N0YXRlKSk7CisJCXJldHVybiAoQUVfQU1MX05PX1JFVFVSTl9WQUxVRSk7CisJfQorCisJc3RhdGUtPnJlc3VsdHMub2JqX2Rlc2NbaW5kZXhdID0gTlVMTDsKKwlpZiAoaW5kZXggPT0gMCkgeworCQlzdGF0dXMgPSBhY3BpX2RzX3Jlc3VsdF9zdGFja19wb3Aod2Fsa19zdGF0ZSk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJcmV0dXJuIChzdGF0dXMpOworCQl9CisJfQorCisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FWEVDLAorCQkJICAiT2JqPSVwIFslc10gSW5kZXg9JVggU3RhdGU9JXAgTnVtPSVYXG4iLCAqb2JqZWN0LAorCQkJICBhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lKCpvYmplY3QpLAorCQkJICBpbmRleCwgd2Fsa19zdGF0ZSwgd2Fsa19zdGF0ZS0+cmVzdWx0X2NvdW50KSk7CisKKwlyZXR1cm4gKEFFX09LKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9kc19yZXN1bHRfcHVzaAorICoKKyAqIFBBUkFNRVRFUlM6ICBPYmplY3QgICAgICAgICAgICAgIC0gV2hlcmUgdG8gcmV0dXJuIHRoZSBwb3BwZWQgb2JqZWN0CisgKiAgICAgICAgICAgICAgd2Fsa19zdGF0ZSAgICAgICAgICAtIEN1cnJlbnQgV2FsayBzdGF0ZQorICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogUHVzaCBhbiBvYmplY3Qgb250byB0aGUgY3VycmVudCByZXN1bHQgc3RhY2sKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCithY3BpX3N0YXR1cworYWNwaV9kc19yZXN1bHRfcHVzaCh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICogb2JqZWN0LAorCQkgICAgc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqIHdhbGtfc3RhdGUpCit7CisJdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICpzdGF0ZTsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJdTMyIGluZGV4OworCisJQUNQSV9GVU5DVElPTl9OQU1FKGRzX3Jlc3VsdF9wdXNoKTsKKworCWlmICh3YWxrX3N0YXRlLT5yZXN1bHRfY291bnQgPiB3YWxrX3N0YXRlLT5yZXN1bHRfc2l6ZSkgeworCQlBQ1BJX0VSUk9SKChBRV9JTkZPLCAiUmVzdWx0IHN0YWNrIGlzIGZ1bGwiKSk7CisJCXJldHVybiAoQUVfQU1MX0lOVEVSTkFMKTsKKwl9IGVsc2UgaWYgKHdhbGtfc3RhdGUtPnJlc3VsdF9jb3VudCA9PSB3YWxrX3N0YXRlLT5yZXN1bHRfc2l6ZSkgeworCisJCS8qIEV4dGVuZCB0aGUgcmVzdWx0IHN0YWNrICovCisKKwkJc3RhdHVzID0gYWNwaV9kc19yZXN1bHRfc3RhY2tfcHVzaCh3YWxrX3N0YXRlKTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQlBQ1BJX0VSUk9SKChBRV9JTkZPLAorCQkJCSAgICAiRmFpbGVkIHRvIGV4dGVuZCB0aGUgcmVzdWx0IHN0YWNrIikpOworCQkJcmV0dXJuIChzdGF0dXMpOworCQl9CisJfQorCisJaWYgKCEod2Fsa19zdGF0ZS0+cmVzdWx0X2NvdW50IDwgd2Fsa19zdGF0ZS0+cmVzdWx0X3NpemUpKSB7CisJCUFDUElfRVJST1IoKEFFX0lORk8sICJObyBmcmVlIGVsZW1lbnRzIGluIHJlc3VsdCBzdGFjayIpKTsKKwkJcmV0dXJuIChBRV9BTUxfSU5URVJOQUwpOworCX0KKworCXN0YXRlID0gd2Fsa19zdGF0ZS0+cmVzdWx0czsKKwlpZiAoIXN0YXRlKSB7CisJCUFDUElfRVJST1IoKEFFX0lORk8sICJObyByZXN1bHQgc3RhY2sgZnJhbWUgZHVyaW5nIHB1c2giKSk7CisJCXJldHVybiAoQUVfQU1MX0lOVEVSTkFMKTsKKwl9CisKKwlpZiAoIW9iamVjdCkgeworCQlBQ1BJX0VSUk9SKChBRV9JTkZPLAorCQkJICAgICJOdWxsIE9iamVjdCEgT2JqPSVwIFN0YXRlPSVwIE51bT0lWCIsCisJCQkgICAgb2JqZWN0LCB3YWxrX3N0YXRlLCB3YWxrX3N0YXRlLT5yZXN1bHRfY291bnQpKTsKKwkJcmV0dXJuIChBRV9CQURfUEFSQU1FVEVSKTsKKwl9CisKKwkvKiBBc3NpZ24gdGhlIGFkZHJlc3Mgb2Ygb2JqZWN0IHRvIHRoZSB0b3AgZnJlZSBlbGVtZW50IG9mIHJlc3VsdCBzdGFjayAqLworCisJaW5kZXggPSB3YWxrX3N0YXRlLT5yZXN1bHRfY291bnQgJSBBQ1BJX1JFU1VMVFNfRlJBTUVfT0JKX05VTTsKKwlzdGF0ZS0+cmVzdWx0cy5vYmpfZGVzY1tpbmRleF0gPSBvYmplY3Q7CisJd2Fsa19zdGF0ZS0+cmVzdWx0X2NvdW50Kys7CisKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VYRUMsICJPYmo9JXAgWyVzXSBTdGF0ZT0lcCBOdW09JVggQ3VyPSVYXG4iLAorCQkJICBvYmplY3QsCisJCQkgIGFjcGlfdXRfZ2V0X29iamVjdF90eXBlX25hbWUoKHVuaW9uCisJCQkJCQkJYWNwaV9vcGVyYW5kX29iamVjdCAqKQorCQkJCQkJICAgICAgIG9iamVjdCksIHdhbGtfc3RhdGUsCisJCQkgIHdhbGtfc3RhdGUtPnJlc3VsdF9jb3VudCwKKwkJCSAgd2Fsa19zdGF0ZS0+Y3VycmVudF9yZXN1bHQpKTsKKworCXJldHVybiAoQUVfT0spOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX2RzX3Jlc3VsdF9zdGFja19wdXNoCisgKgorICogUEFSQU1FVEVSUzogIHdhbGtfc3RhdGUgICAgICAgICAgLSBDdXJyZW50IFdhbGsgc3RhdGUKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IFB1c2ggYW4gb2JqZWN0IG9udG8gdGhlIHdhbGtfc3RhdGUgcmVzdWx0IHN0YWNrCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGFjcGlfc3RhdHVzIGFjcGlfZHNfcmVzdWx0X3N0YWNrX3B1c2goc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSkKK3sKKwl1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgKnN0YXRlOworCisJQUNQSV9GVU5DVElPTl9OQU1FKGRzX3Jlc3VsdF9zdGFja19wdXNoKTsKKworCS8qIENoZWNrIGZvciBzdGFjayBvdmVyZmxvdyAqLworCisJaWYgKCgodTMyKSB3YWxrX3N0YXRlLT5yZXN1bHRfc2l6ZSArIEFDUElfUkVTVUxUU19GUkFNRV9PQkpfTlVNKSA+CisJICAgIEFDUElfUkVTVUxUU19PQkpfTlVNX01BWCkgeworCQlBQ1BJX0VSUk9SKChBRV9JTkZPLCAiUmVzdWx0IHN0YWNrIG92ZXJmbG93OiBTdGF0ZT0lcCBOdW09JVgiLAorCQkJICAgIHdhbGtfc3RhdGUsIHdhbGtfc3RhdGUtPnJlc3VsdF9zaXplKSk7CisJCXJldHVybiAoQUVfU1RBQ0tfT1ZFUkZMT1cpOworCX0KKworCXN0YXRlID0gYWNwaV91dF9jcmVhdGVfZ2VuZXJpY19zdGF0ZSgpOworCWlmICghc3RhdGUpIHsKKwkJcmV0dXJuIChBRV9OT19NRU1PUlkpOworCX0KKworCXN0YXRlLT5jb21tb24uZGVzY3JpcHRvcl90eXBlID0gQUNQSV9ERVNDX1RZUEVfU1RBVEVfUkVTVUxUOworCWFjcGlfdXRfcHVzaF9nZW5lcmljX3N0YXRlKCZ3YWxrX3N0YXRlLT5yZXN1bHRzLCBzdGF0ZSk7CisKKwkvKiBJbmNyZWFzZSB0aGUgbGVuZ3RoIG9mIHRoZSByZXN1bHQgc3RhY2sgYnkgdGhlIGxlbmd0aCBvZiBmcmFtZSAqLworCisJd2Fsa19zdGF0ZS0+cmVzdWx0X3NpemUgKz0gQUNQSV9SRVNVTFRTX0ZSQU1FX09CSl9OVU07CisKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VYRUMsICJSZXN1bHRzPSVwIFN0YXRlPSVwXG4iLAorCQkJICBzdGF0ZSwgd2Fsa19zdGF0ZSkpOworCisJcmV0dXJuIChBRV9PSyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfZHNfcmVzdWx0X3N0YWNrX3BvcAorICoKKyAqIFBBUkFNRVRFUlM6ICB3YWxrX3N0YXRlICAgICAgICAgIC0gQ3VycmVudCBXYWxrIHN0YXRlCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBQb3AgYW4gb2JqZWN0IG9mZiBvZiB0aGUgd2Fsa19zdGF0ZSByZXN1bHQgc3RhY2sKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgYWNwaV9zdGF0dXMgYWNwaV9kc19yZXN1bHRfc3RhY2tfcG9wKHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUpCit7CisJdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICpzdGF0ZTsKKworCUFDUElfRlVOQ1RJT05fTkFNRShkc19yZXN1bHRfc3RhY2tfcG9wKTsKKworCS8qIENoZWNrIGZvciBzdGFjayB1bmRlcmZsb3cgKi8KKworCWlmICh3YWxrX3N0YXRlLT5yZXN1bHRzID09IE5VTEwpIHsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FWEVDLAorCQkJCSAgIlJlc3VsdCBzdGFjayB1bmRlcmZsb3cgLSBTdGF0ZT0lcFxuIiwKKwkJCQkgIHdhbGtfc3RhdGUpKTsKKwkJcmV0dXJuIChBRV9BTUxfTk9fT1BFUkFORCk7CisJfQorCisJaWYgKHdhbGtfc3RhdGUtPnJlc3VsdF9zaXplIDwgQUNQSV9SRVNVTFRTX0ZSQU1FX09CSl9OVU0pIHsKKwkJQUNQSV9FUlJPUigoQUVfSU5GTywgIkluc3VmZmljaWVudCByZXN1bHQgc3RhY2sgc2l6ZSIpKTsKKwkJcmV0dXJuIChBRV9BTUxfSU5URVJOQUwpOworCX0KKworCXN0YXRlID0gYWNwaV91dF9wb3BfZ2VuZXJpY19zdGF0ZSgmd2Fsa19zdGF0ZS0+cmVzdWx0cyk7CisJYWNwaV91dF9kZWxldGVfZ2VuZXJpY19zdGF0ZShzdGF0ZSk7CisKKwkvKiBEZWNyZWFzZSB0aGUgbGVuZ3RoIG9mIHJlc3VsdCBzdGFjayBieSB0aGUgbGVuZ3RoIG9mIGZyYW1lICovCisKKwl3YWxrX3N0YXRlLT5yZXN1bHRfc2l6ZSAtPSBBQ1BJX1JFU1VMVFNfRlJBTUVfT0JKX05VTTsKKworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVhFQywKKwkJCSAgIlJlc3VsdD0lcCBSZW1haW5pbmdSZXN1bHRzPSVYIFN0YXRlPSVwXG4iLAorCQkJICBzdGF0ZSwgd2Fsa19zdGF0ZS0+cmVzdWx0X2NvdW50LCB3YWxrX3N0YXRlKSk7CisKKwlyZXR1cm4gKEFFX09LKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9kc19vYmpfc3RhY2tfcHVzaAorICoKKyAqIFBBUkFNRVRFUlM6ICBPYmplY3QgICAgICAgICAgICAgIC0gT2JqZWN0IHRvIHB1c2gKKyAqICAgICAgICAgICAgICB3YWxrX3N0YXRlICAgICAgICAgIC0gQ3VycmVudCBXYWxrIHN0YXRlCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBQdXNoIGFuIG9iamVjdCBvbnRvIHRoaXMgd2FsaydzIG9iamVjdC9vcGVyYW5kIHN0YWNrCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworYWNwaV9zdGF0dXMKK2FjcGlfZHNfb2JqX3N0YWNrX3B1c2godm9pZCAqb2JqZWN0LCBzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICogd2Fsa19zdGF0ZSkKK3sKKwlBQ1BJX0ZVTkNUSU9OX05BTUUoZHNfb2JqX3N0YWNrX3B1c2gpOworCisJLyogQ2hlY2sgZm9yIHN0YWNrIG92ZXJmbG93ICovCisKKwlpZiAod2Fsa19zdGF0ZS0+bnVtX29wZXJhbmRzID49IEFDUElfT0JKX05VTV9PUEVSQU5EUykgeworCQlBQ1BJX0VSUk9SKChBRV9JTkZPLAorCQkJICAgICJPYmplY3Qgc3RhY2sgb3ZlcmZsb3chIE9iaj0lcCBTdGF0ZT0lcCAjT3BzPSVYIiwKKwkJCSAgICBvYmplY3QsIHdhbGtfc3RhdGUsIHdhbGtfc3RhdGUtPm51bV9vcGVyYW5kcykpOworCQlyZXR1cm4gKEFFX1NUQUNLX09WRVJGTE9XKTsKKwl9CisKKwkvKiBQdXQgdGhlIG9iamVjdCBvbnRvIHRoZSBzdGFjayAqLworCisJd2Fsa19zdGF0ZS0+b3BlcmFuZHNbd2Fsa19zdGF0ZS0+b3BlcmFuZF9pbmRleF0gPSBvYmplY3Q7CisJd2Fsa19zdGF0ZS0+bnVtX29wZXJhbmRzKys7CisKKwkvKiBGb3IgdGhlIHVzdWFsIG9yZGVyIG9mIGZpbGxpbmcgdGhlIG9wZXJhbmQgc3RhY2sgKi8KKworCXdhbGtfc3RhdGUtPm9wZXJhbmRfaW5kZXgrKzsKKworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVhFQywgIk9iaj0lcCBbJXNdIFN0YXRlPSVwICNPcHM9JVhcbiIsCisJCQkgIG9iamVjdCwKKwkJCSAgYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZSgodW5pb24KKwkJCQkJCQlhY3BpX29wZXJhbmRfb2JqZWN0ICopCisJCQkJCQkgICAgICAgb2JqZWN0KSwgd2Fsa19zdGF0ZSwKKwkJCSAgd2Fsa19zdGF0ZS0+bnVtX29wZXJhbmRzKSk7CisKKwlyZXR1cm4gKEFFX09LKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9kc19vYmpfc3RhY2tfcG9wCisgKgorICogUEFSQU1FVEVSUzogIHBvcF9jb3VudCAgICAgICAgICAgLSBOdW1iZXIgb2Ygb2JqZWN0cy9lbnRyaWVzIHRvIHBvcAorICogICAgICAgICAgICAgIHdhbGtfc3RhdGUgICAgICAgICAgLSBDdXJyZW50IFdhbGsgc3RhdGUKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IFBvcCB0aGlzIHdhbGsncyBvYmplY3Qgc3RhY2suICBPYmplY3RzIG9uIHRoZSBzdGFjayBhcmUgTk9UCisgKiAgICAgICAgICAgICAgZGVsZXRlZCBieSB0aGlzIHJvdXRpbmUuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworYWNwaV9zdGF0dXMKK2FjcGlfZHNfb2JqX3N0YWNrX3BvcCh1MzIgcG9wX2NvdW50LCBzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICogd2Fsa19zdGF0ZSkKK3sKKwl1MzIgaTsKKworCUFDUElfRlVOQ1RJT05fTkFNRShkc19vYmpfc3RhY2tfcG9wKTsKKworCWZvciAoaSA9IDA7IGkgPCBwb3BfY291bnQ7IGkrKykgeworCisJCS8qIENoZWNrIGZvciBzdGFjayB1bmRlcmZsb3cgKi8KKworCQlpZiAod2Fsa19zdGF0ZS0+bnVtX29wZXJhbmRzID09IDApIHsKKwkJCUFDUElfRVJST1IoKEFFX0lORk8sCisJCQkJICAgICJPYmplY3Qgc3RhY2sgdW5kZXJmbG93ISBDb3VudD0lWCBTdGF0ZT0lcCAjT3BzPSVYIiwKKwkJCQkgICAgcG9wX2NvdW50LCB3YWxrX3N0YXRlLAorCQkJCSAgICB3YWxrX3N0YXRlLT5udW1fb3BlcmFuZHMpKTsKKwkJCXJldHVybiAoQUVfU1RBQ0tfVU5ERVJGTE9XKTsKKwkJfQorCisJCS8qIEp1c3Qgc2V0IHRoZSBzdGFjayBlbnRyeSB0byBudWxsICovCisKKwkJd2Fsa19zdGF0ZS0+bnVtX29wZXJhbmRzLS07CisJCXdhbGtfc3RhdGUtPm9wZXJhbmRzW3dhbGtfc3RhdGUtPm51bV9vcGVyYW5kc10gPSBOVUxMOworCX0KKworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVhFQywgIkNvdW50PSVYIFN0YXRlPSVwICNPcHM9JVhcbiIsCisJCQkgIHBvcF9jb3VudCwgd2Fsa19zdGF0ZSwgd2Fsa19zdGF0ZS0+bnVtX29wZXJhbmRzKSk7CisKKwlyZXR1cm4gKEFFX09LKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9kc19vYmpfc3RhY2tfcG9wX2FuZF9kZWxldGUKKyAqCisgKiBQQVJBTUVURVJTOiAgcG9wX2NvdW50ICAgICAgICAgICAtIE51bWJlciBvZiBvYmplY3RzL2VudHJpZXMgdG8gcG9wCisgKiAgICAgICAgICAgICAgd2Fsa19zdGF0ZSAgICAgICAgICAtIEN1cnJlbnQgV2FsayBzdGF0ZQorICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogUG9wIHRoaXMgd2FsaydzIG9iamVjdCBzdGFjayBhbmQgZGVsZXRlIGVhY2ggb2JqZWN0IHRoYXQgaXMKKyAqICAgICAgICAgICAgICBwb3BwZWQgb2ZmLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQKK2FjcGlfZHNfb2JqX3N0YWNrX3BvcF9hbmRfZGVsZXRlKHUzMiBwb3BfY291bnQsCisJCQkJIHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUpCit7CisJczMyIGk7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2M7CisKKwlBQ1BJX0ZVTkNUSU9OX05BTUUoZHNfb2JqX3N0YWNrX3BvcF9hbmRfZGVsZXRlKTsKKworCWlmIChwb3BfY291bnQgPT0gMCkgeworCQlyZXR1cm47CisJfQorCisJZm9yIChpID0gKHMzMikgcG9wX2NvdW50IC0gMTsgaSA+PSAwOyBpLS0pIHsKKwkJaWYgKHdhbGtfc3RhdGUtPm51bV9vcGVyYW5kcyA9PSAwKSB7CisJCQlyZXR1cm47CisJCX0KKworCQkvKiBQb3AgdGhlIHN0YWNrIGFuZCBkZWxldGUgYW4gb2JqZWN0IGlmIHByZXNlbnQgaW4gdGhpcyBzdGFjayBlbnRyeSAqLworCisJCXdhbGtfc3RhdGUtPm51bV9vcGVyYW5kcy0tOworCQlvYmpfZGVzYyA9IHdhbGtfc3RhdGUtPm9wZXJhbmRzW2ldOworCQlpZiAob2JqX2Rlc2MpIHsKKwkJCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZSh3YWxrX3N0YXRlLT5vcGVyYW5kc1tpXSk7CisJCQl3YWxrX3N0YXRlLT5vcGVyYW5kc1tpXSA9IE5VTEw7CisJCX0KKwl9CisKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VYRUMsICJDb3VudD0lWCBTdGF0ZT0lcCAjT3BzPSVYXG4iLAorCQkJICBwb3BfY291bnQsIHdhbGtfc3RhdGUsIHdhbGtfc3RhdGUtPm51bV9vcGVyYW5kcykpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX2RzX2dldF9jdXJyZW50X3dhbGtfc3RhdGUKKyAqCisgKiBQQVJBTUVURVJTOiAgVGhyZWFkICAgICAgICAgIC0gR2V0IGN1cnJlbnQgYWN0aXZlIHN0YXRlIGZvciB0aGlzIFRocmVhZAorICoKKyAqIFJFVFVSTjogICAgICBQb2ludGVyIHRvIHRoZSBjdXJyZW50IHdhbGsgc3RhdGUKKyAqCisgKiBERVNDUklQVElPTjogR2V0IHRoZSB3YWxrIHN0YXRlIHRoYXQgaXMgYXQgdGhlIGhlYWQgb2YgdGhlIGxpc3QgKHRoZSAiY3VycmVudCIKKyAqICAgICAgICAgICAgICB3YWxrIHN0YXRlLikKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICphY3BpX2RzX2dldF9jdXJyZW50X3dhbGtfc3RhdGUoc3RydWN0IGFjcGlfdGhyZWFkX3N0YXRlCisJCQkJCQkgICAgICAgKnRocmVhZCkKK3sKKwlBQ1BJX0ZVTkNUSU9OX05BTUUoZHNfZ2V0X2N1cnJlbnRfd2Fsa19zdGF0ZSk7CisKKwlpZiAoIXRocmVhZCkgeworCQlyZXR1cm4gKE5VTEwpOworCX0KKworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfUEFSU0UsICJDdXJyZW50IFdhbGtTdGF0ZSAlcFxuIiwKKwkJCSAgdGhyZWFkLT53YWxrX3N0YXRlX2xpc3QpKTsKKworCXJldHVybiAodGhyZWFkLT53YWxrX3N0YXRlX2xpc3QpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX2RzX3B1c2hfd2Fsa19zdGF0ZQorICoKKyAqIFBBUkFNRVRFUlM6ICB3YWxrX3N0YXRlICAgICAgLSBTdGF0ZSB0byBwdXNoCisgKiAgICAgICAgICAgICAgVGhyZWFkICAgICAgICAgIC0gVGhyZWFkIHN0YXRlIG9iamVjdAorICoKKyAqIFJFVFVSTjogICAgICBOb25lCisgKgorICogREVTQ1JJUFRJT046IFBsYWNlIHRoZSBUaHJlYWQgc3RhdGUgYXQgdGhlIGhlYWQgb2YgdGhlIHN0YXRlIGxpc3QKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkCithY3BpX2RzX3B1c2hfd2Fsa19zdGF0ZShzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlLAorCQkJc3RydWN0IGFjcGlfdGhyZWFkX3N0YXRlICp0aHJlYWQpCit7CisJQUNQSV9GVU5DVElPTl9UUkFDRShkc19wdXNoX3dhbGtfc3RhdGUpOworCisJd2Fsa19zdGF0ZS0+bmV4dCA9IHRocmVhZC0+d2Fsa19zdGF0ZV9saXN0OworCXRocmVhZC0+d2Fsa19zdGF0ZV9saXN0ID0gd2Fsa19zdGF0ZTsKKworCXJldHVybl9WT0lEOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX2RzX3BvcF93YWxrX3N0YXRlCisgKgorICogUEFSQU1FVEVSUzogIFRocmVhZCAgICAgIC0gQ3VycmVudCB0aHJlYWQgc3RhdGUKKyAqCisgKiBSRVRVUk46ICAgICAgQSB3YWxrX3N0YXRlIG9iamVjdCBwb3BwZWQgZnJvbSB0aGUgdGhyZWFkJ3Mgc3RhY2sKKyAqCisgKiBERVNDUklQVElPTjogUmVtb3ZlIGFuZCByZXR1cm4gdGhlIHdhbGtzdGF0ZSBvYmplY3QgdGhhdCBpcyBhdCB0aGUgaGVhZCBvZgorICogICAgICAgICAgICAgIHRoZSB3YWxrIHN0YWNrIGZvciB0aGUgZ2l2ZW4gd2FsayBsaXN0LiAgTlVMTCBpbmRpY2F0ZXMgdGhhdAorICogICAgICAgICAgICAgIHRoZSBsaXN0IGlzIGVtcHR5LgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKmFjcGlfZHNfcG9wX3dhbGtfc3RhdGUoc3RydWN0IGFjcGlfdGhyZWFkX3N0YXRlICp0aHJlYWQpCit7CisJc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZTsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0UoZHNfcG9wX3dhbGtfc3RhdGUpOworCisJd2Fsa19zdGF0ZSA9IHRocmVhZC0+d2Fsa19zdGF0ZV9saXN0OworCisJaWYgKHdhbGtfc3RhdGUpIHsKKworCQkvKiBOZXh0IHdhbGsgc3RhdGUgYmVjb21lcyB0aGUgY3VycmVudCB3YWxrIHN0YXRlICovCisKKwkJdGhyZWFkLT53YWxrX3N0YXRlX2xpc3QgPSB3YWxrX3N0YXRlLT5uZXh0OworCisJCS8qCisJCSAqIERvbid0IGNsZWFyIHRoZSBORVhUIGZpZWxkLCB0aGlzIHNlcnZlcyBhcyBhbiBpbmRpY2F0b3IKKwkJICogdGhhdCB0aGVyZSBpcyBhIHBhcmVudCBXQUxLIFNUQVRFCisJCSAqIERvIE5vdDogd2Fsa19zdGF0ZS0+TmV4dCA9IE5VTEw7CisJCSAqLworCX0KKworCXJldHVybl9QVFIod2Fsa19zdGF0ZSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfZHNfY3JlYXRlX3dhbGtfc3RhdGUKKyAqCisgKiBQQVJBTUVURVJTOiAgb3duZXJfaWQgICAgICAgIC0gSUQgZm9yIG9iamVjdCBjcmVhdGlvbgorICogICAgICAgICAgICAgIE9yaWdpbiAgICAgICAgICAtIFN0YXJ0aW5nIHBvaW50IGZvciB0aGlzIHdhbGsKKyAqICAgICAgICAgICAgICBtZXRob2RfZGVzYyAgICAgLSBNZXRob2Qgb2JqZWN0CisgKiAgICAgICAgICAgICAgVGhyZWFkICAgICAgICAgIC0gQ3VycmVudCB0aHJlYWQgc3RhdGUKKyAqCisgKiBSRVRVUk46ICAgICAgUG9pbnRlciB0byB0aGUgbmV3IHdhbGsgc3RhdGUuCisgKgorICogREVTQ1JJUFRJT046IEFsbG9jYXRlIGFuZCBpbml0aWFsaXplIGEgbmV3IHdhbGsgc3RhdGUuICBUaGUgY3VycmVudCB3YWxrCisgKiAgICAgICAgICAgICAgc3RhdGUgaXMgc2V0IHRvIHRoaXMgbmV3IHN0YXRlLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKmFjcGlfZHNfY3JlYXRlX3dhbGtfc3RhdGUoYWNwaV9vd25lcl9pZCBvd25lcl9pZCwgdW5pb24gYWNwaV9wYXJzZV9vYmplY3QKKwkJCQkJCSAgKm9yaWdpbiwgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdAorCQkJCQkJICAqbWV0aG9kX2Rlc2MsIHN0cnVjdCBhY3BpX3RocmVhZF9zdGF0ZQorCQkJCQkJICAqdGhyZWFkKQoreworCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGU7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGRzX2NyZWF0ZV93YWxrX3N0YXRlKTsKKworCXdhbGtfc3RhdGUgPSBBQ1BJX0FMTE9DQVRFX1pFUk9FRChzaXplb2Yoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSkpOworCWlmICghd2Fsa19zdGF0ZSkgeworCQlyZXR1cm5fUFRSKE5VTEwpOworCX0KKworCXdhbGtfc3RhdGUtPmRlc2NyaXB0b3JfdHlwZSA9IEFDUElfREVTQ19UWVBFX1dBTEs7CisJd2Fsa19zdGF0ZS0+bWV0aG9kX2Rlc2MgPSBtZXRob2RfZGVzYzsKKwl3YWxrX3N0YXRlLT5vd25lcl9pZCA9IG93bmVyX2lkOworCXdhbGtfc3RhdGUtPm9yaWdpbiA9IG9yaWdpbjsKKwl3YWxrX3N0YXRlLT50aHJlYWQgPSB0aHJlYWQ7CisKKwl3YWxrX3N0YXRlLT5wYXJzZXJfc3RhdGUuc3RhcnRfb3AgPSBvcmlnaW47CisKKwkvKiBJbml0IHRoZSBtZXRob2QgYXJncy9sb2NhbCAqLworCisjaWYgKCFkZWZpbmVkIChBQ1BJX05PX01FVEhPRF9FWEVDVVRJT04pICYmICFkZWZpbmVkIChBQ1BJX0NPTlNUQU5UX0VWQUxfT05MWSkpCisJYWNwaV9kc19tZXRob2RfZGF0YV9pbml0KHdhbGtfc3RhdGUpOworI2VuZGlmCisKKwkvKiBQdXQgdGhlIG5ldyBzdGF0ZSBhdCB0aGUgaGVhZCBvZiB0aGUgd2FsayBsaXN0ICovCisKKwlpZiAodGhyZWFkKSB7CisJCWFjcGlfZHNfcHVzaF93YWxrX3N0YXRlKHdhbGtfc3RhdGUsIHRocmVhZCk7CisJfQorCisJcmV0dXJuX1BUUih3YWxrX3N0YXRlKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9kc19pbml0X2FtbF93YWxrCisgKgorICogUEFSQU1FVEVSUzogIHdhbGtfc3RhdGUgICAgICAtIE5ldyBzdGF0ZSB0byBiZSBpbml0aWFsaXplZAorICogICAgICAgICAgICAgIE9wICAgICAgICAgICAgICAtIEN1cnJlbnQgcGFyc2Ugb3AKKyAqICAgICAgICAgICAgICBtZXRob2Rfbm9kZSAgICAgLSBDb250cm9sIG1ldGhvZCBOUyBub2RlLCBpZiBhbnkKKyAqICAgICAgICAgICAgICBhbWxfc3RhcnQgICAgICAgLSBTdGFydCBvZiBBTUwKKyAqICAgICAgICAgICAgICBhbWxfbGVuZ3RoICAgICAgLSBMZW5ndGggb2YgQU1MCisgKiAgICAgICAgICAgICAgSW5mbyAgICAgICAgICAgIC0gTWV0aG9kIGluZm8gYmxvY2sgKHBhcmFtcywgZXRjLikKKyAqICAgICAgICAgICAgICBwYXNzX251bWJlciAgICAgLSAxLCAyLCBvciAzCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBJbml0aWFsaXplIGEgd2FsayBzdGF0ZSBmb3IgYSBwYXNzIDEgb3IgMiBwYXJzZSB0cmVlIHdhbGsKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCithY3BpX3N0YXR1cworYWNwaV9kc19pbml0X2FtbF93YWxrKHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUsCisJCSAgICAgIHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpvcCwKKwkJICAgICAgc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm1ldGhvZF9ub2RlLAorCQkgICAgICB1OCAqIGFtbF9zdGFydCwKKwkJICAgICAgdTMyIGFtbF9sZW5ndGgsCisJCSAgICAgIHN0cnVjdCBhY3BpX2V2YWx1YXRlX2luZm8gKmluZm8sIHU4IHBhc3NfbnVtYmVyKQoreworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwlzdHJ1Y3QgYWNwaV9wYXJzZV9zdGF0ZSAqcGFyc2VyX3N0YXRlID0gJndhbGtfc3RhdGUtPnBhcnNlcl9zdGF0ZTsKKwl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqZXh0cmFfb3A7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGRzX2luaXRfYW1sX3dhbGspOworCisJd2Fsa19zdGF0ZS0+cGFyc2VyX3N0YXRlLmFtbCA9CisJICAgIHdhbGtfc3RhdGUtPnBhcnNlcl9zdGF0ZS5hbWxfc3RhcnQgPSBhbWxfc3RhcnQ7CisJd2Fsa19zdGF0ZS0+cGFyc2VyX3N0YXRlLmFtbF9lbmQgPQorCSAgICB3YWxrX3N0YXRlLT5wYXJzZXJfc3RhdGUucGtnX2VuZCA9IGFtbF9zdGFydCArIGFtbF9sZW5ndGg7CisKKwkvKiBUaGUgbmV4dF9vcCBvZiB0aGUgbmV4dF93YWxrIHdpbGwgYmUgdGhlIGJlZ2lubmluZyBvZiB0aGUgbWV0aG9kICovCisKKwl3YWxrX3N0YXRlLT5uZXh0X29wID0gTlVMTDsKKwl3YWxrX3N0YXRlLT5wYXNzX251bWJlciA9IHBhc3NfbnVtYmVyOworCisJaWYgKGluZm8pIHsKKwkJd2Fsa19zdGF0ZS0+cGFyYW1zID0gaW5mby0+cGFyYW1ldGVyczsKKwkJd2Fsa19zdGF0ZS0+Y2FsbGVyX3JldHVybl9kZXNjID0gJmluZm8tPnJldHVybl9vYmplY3Q7CisJfQorCisJc3RhdHVzID0gYWNwaV9wc19pbml0X3Njb3BlKCZ3YWxrX3N0YXRlLT5wYXJzZXJfc3RhdGUsIG9wKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CisJfQorCisJaWYgKG1ldGhvZF9ub2RlKSB7CisJCXdhbGtfc3RhdGUtPnBhcnNlcl9zdGF0ZS5zdGFydF9ub2RlID0gbWV0aG9kX25vZGU7CisJCXdhbGtfc3RhdGUtPndhbGtfdHlwZSA9IEFDUElfV0FMS19NRVRIT0Q7CisJCXdhbGtfc3RhdGUtPm1ldGhvZF9ub2RlID0gbWV0aG9kX25vZGU7CisJCXdhbGtfc3RhdGUtPm1ldGhvZF9kZXNjID0KKwkJICAgIGFjcGlfbnNfZ2V0X2F0dGFjaGVkX29iamVjdChtZXRob2Rfbm9kZSk7CisKKwkJLyogUHVzaCBzdGFydCBzY29wZSBvbiBzY29wZSBzdGFjayBhbmQgbWFrZSBpdCBjdXJyZW50ICAqLworCisJCXN0YXR1cyA9CisJCSAgICBhY3BpX2RzX3Njb3BlX3N0YWNrX3B1c2gobWV0aG9kX25vZGUsIEFDUElfVFlQRV9NRVRIT0QsCisJCQkJCSAgICAgd2Fsa19zdGF0ZSk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CisJCX0KKworCQkvKiBJbml0IHRoZSBtZXRob2QgYXJndW1lbnRzICovCisKKwkJc3RhdHVzID0gYWNwaV9kc19tZXRob2RfZGF0YV9pbml0X2FyZ3Mod2Fsa19zdGF0ZS0+cGFyYW1zLAorCQkJCQkJICAgICAgIEFDUElfTUVUSE9EX05VTV9BUkdTLAorCQkJCQkJICAgICAgIHdhbGtfc3RhdGUpOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworCQl9CisJfSBlbHNlIHsKKwkJLyoKKwkJICogU2V0dXAgdGhlIGN1cnJlbnQgc2NvcGUuCisJCSAqIEZpbmQgYSBOYW1lZCBPcCB0aGF0IGhhcyBhIG5hbWVzcGFjZSBub2RlIGFzc29jaWF0ZWQgd2l0aCBpdC4KKwkJICogc2VhcmNoIHVwd2FyZHMgZnJvbSB0aGlzIE9wLiAgQ3VycmVudCBzY29wZSBpcyB0aGUgZmlyc3QKKwkJICogT3Agd2l0aCBhIG5hbWVzcGFjZSBub2RlLgorCQkgKi8KKwkJZXh0cmFfb3AgPSBwYXJzZXJfc3RhdGUtPnN0YXJ0X29wOworCQl3aGlsZSAoZXh0cmFfb3AgJiYgIWV4dHJhX29wLT5jb21tb24ubm9kZSkgeworCQkJZXh0cmFfb3AgPSBleHRyYV9vcC0+Y29tbW9uLnBhcmVudDsKKwkJfQorCisJCWlmICghZXh0cmFfb3ApIHsKKwkJCXBhcnNlcl9zdGF0ZS0+c3RhcnRfbm9kZSA9IE5VTEw7CisJCX0gZWxzZSB7CisJCQlwYXJzZXJfc3RhdGUtPnN0YXJ0X25vZGUgPSBleHRyYV9vcC0+Y29tbW9uLm5vZGU7CisJCX0KKworCQlpZiAocGFyc2VyX3N0YXRlLT5zdGFydF9ub2RlKSB7CisKKwkJCS8qIFB1c2ggc3RhcnQgc2NvcGUgb24gc2NvcGUgc3RhY2sgYW5kIG1ha2UgaXQgY3VycmVudCAgKi8KKworCQkJc3RhdHVzID0KKwkJCSAgICBhY3BpX2RzX3Njb3BlX3N0YWNrX3B1c2gocGFyc2VyX3N0YXRlLT5zdGFydF9ub2RlLAorCQkJCQkJICAgICBwYXJzZXJfc3RhdGUtPnN0YXJ0X25vZGUtPgorCQkJCQkJICAgICB0eXBlLCB3YWxrX3N0YXRlKTsKKwkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworCQkJfQorCQl9CisJfQorCisJc3RhdHVzID0gYWNwaV9kc19pbml0X2NhbGxiYWNrcyh3YWxrX3N0YXRlLCBwYXNzX251bWJlcik7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfZHNfZGVsZXRlX3dhbGtfc3RhdGUKKyAqCisgKiBQQVJBTUVURVJTOiAgd2Fsa19zdGF0ZSAgICAgIC0gU3RhdGUgdG8gZGVsZXRlCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBEZWxldGUgYSB3YWxrIHN0YXRlIGluY2x1ZGluZyBhbGwgaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmVzCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBhY3BpX2RzX2RlbGV0ZV93YWxrX3N0YXRlKHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUpCit7CisJdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICpzdGF0ZTsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKGRzX2RlbGV0ZV93YWxrX3N0YXRlLCB3YWxrX3N0YXRlKTsKKworCWlmICghd2Fsa19zdGF0ZSkgeworCQlyZXR1cm47CisJfQorCisJaWYgKHdhbGtfc3RhdGUtPmRlc2NyaXB0b3JfdHlwZSAhPSBBQ1BJX0RFU0NfVFlQRV9XQUxLKSB7CisJCUFDUElfRVJST1IoKEFFX0lORk8sICIlcCBpcyBub3QgYSB2YWxpZCB3YWxrIHN0YXRlIiwKKwkJCSAgICB3YWxrX3N0YXRlKSk7CisJCXJldHVybjsKKwl9CisKKwkvKiBUaGVyZSBzaG91bGQgbm90IGJlIGFueSBvcGVuIHNjb3BlcyAqLworCisJaWYgKHdhbGtfc3RhdGUtPnBhcnNlcl9zdGF0ZS5zY29wZSkgeworCQlBQ1BJX0VSUk9SKChBRV9JTkZPLCAiJXAgd2FsayBzdGlsbCBoYXMgYSBzY29wZSBsaXN0IiwKKwkJCSAgICB3YWxrX3N0YXRlKSk7CisJCWFjcGlfcHNfY2xlYW51cF9zY29wZSgmd2Fsa19zdGF0ZS0+cGFyc2VyX3N0YXRlKTsKKwl9CisKKwkvKiBBbHdheXMgbXVzdCBmcmVlIGFueSBsaW5rZWQgY29udHJvbCBzdGF0ZXMgKi8KKworCXdoaWxlICh3YWxrX3N0YXRlLT5jb250cm9sX3N0YXRlKSB7CisJCXN0YXRlID0gd2Fsa19zdGF0ZS0+Y29udHJvbF9zdGF0ZTsKKwkJd2Fsa19zdGF0ZS0+Y29udHJvbF9zdGF0ZSA9IHN0YXRlLT5jb21tb24ubmV4dDsKKworCQlhY3BpX3V0X2RlbGV0ZV9nZW5lcmljX3N0YXRlKHN0YXRlKTsKKwl9CisKKwkvKiBBbHdheXMgbXVzdCBmcmVlIGFueSBsaW5rZWQgcGFyc2Ugc3RhdGVzICovCisKKwl3aGlsZSAod2Fsa19zdGF0ZS0+c2NvcGVfaW5mbykgeworCQlzdGF0ZSA9IHdhbGtfc3RhdGUtPnNjb3BlX2luZm87CisJCXdhbGtfc3RhdGUtPnNjb3BlX2luZm8gPSBzdGF0ZS0+Y29tbW9uLm5leHQ7CisKKwkJYWNwaV91dF9kZWxldGVfZ2VuZXJpY19zdGF0ZShzdGF0ZSk7CisJfQorCisJLyogQWx3YXlzIG11c3QgZnJlZSBhbnkgc3RhY2tlZCByZXN1bHQgc3RhdGVzICovCisKKwl3aGlsZSAod2Fsa19zdGF0ZS0+cmVzdWx0cykgeworCQlzdGF0ZSA9IHdhbGtfc3RhdGUtPnJlc3VsdHM7CisJCXdhbGtfc3RhdGUtPnJlc3VsdHMgPSBzdGF0ZS0+Y29tbW9uLm5leHQ7CisKKwkJYWNwaV91dF9kZWxldGVfZ2VuZXJpY19zdGF0ZShzdGF0ZSk7CisJfQorCisJQUNQSV9GUkVFKHdhbGtfc3RhdGUpOworCXJldHVybl9WT0lEOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS9ldmV2ZW50LmMgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2V2ZXZlbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDNlZGQ5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS9ldmV2ZW50LmMKQEAgLTAsMCArMSwzMTMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBNb2R1bGUgTmFtZTogZXZldmVudCAtIEZpeGVkIEV2ZW50IGhhbmRsaW5nIGFuZCBkaXNwYXRjaAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDgsIEludGVsIENvcnAuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCisgKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSBhdCBtaW5pbXVtIGEgZGlzY2xhaW1lcgorICogICAgc3Vic3RhbnRpYWxseSBzaW1pbGFyIHRvIHRoZSAiTk8gV0FSUkFOVFkiIGRpc2NsYWltZXIgYmVsb3cKKyAqICAgICgiRGlzY2xhaW1lciIpIGFuZCBhbnkgcmVkaXN0cmlidXRpb24gbXVzdCBiZSBjb25kaXRpb25lZCB1cG9uCisgKiAgICBpbmNsdWRpbmcgYSBzdWJzdGFudGlhbGx5IHNpbWlsYXIgRGlzY2xhaW1lciByZXF1aXJlbWVudCBmb3IgZnVydGhlcgorICogICAgYmluYXJ5IHJlZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzCisgKiAgICBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIE5PIFdBUlJBTlRZCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORworICogSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCisgKi8KKworI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgorI2luY2x1ZGUgImFjY29tbW9uLmgiCisjaW5jbHVkZSAiYWNldmVudHMuaCIKKworI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfRVZFTlRTCitBQ1BJX01PRFVMRV9OQU1FKCJldmV2ZW50IikKKworLyogTG9jYWwgcHJvdG90eXBlcyAqLworc3RhdGljIGFjcGlfc3RhdHVzIGFjcGlfZXZfZml4ZWRfZXZlbnRfaW5pdGlhbGl6ZSh2b2lkKTsKKworc3RhdGljIHUzMiBhY3BpX2V2X2ZpeGVkX2V2ZW50X2Rpc3BhdGNoKHUzMiBldmVudCk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfZXZfaW5pdGlhbGl6ZV9ldmVudHMKKyAqCisgKiBQQVJBTUVURVJTOiAgTm9uZQorICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogSW5pdGlhbGl6ZSBnbG9iYWwgZGF0YSBzdHJ1Y3R1cmVzIGZvciBBQ1BJIGV2ZW50cyAoRml4ZWQsIEdQRSkKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCithY3BpX3N0YXR1cyBhY3BpX2V2X2luaXRpYWxpemVfZXZlbnRzKHZvaWQpCit7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCisJQUNQSV9GVU5DVElPTl9UUkFDRShldl9pbml0aWFsaXplX2V2ZW50cyk7CisKKwkvKgorCSAqIEluaXRpYWxpemUgdGhlIEZpeGVkIGFuZCBHZW5lcmFsIFB1cnBvc2UgRXZlbnRzLiBUaGlzIGlzIGRvbmUgcHJpb3IgdG8KKwkgKiBlbmFibGluZyBTQ0lzIHRvIHByZXZlbnQgaW50ZXJydXB0cyBmcm9tIG9jY3VycmluZyBiZWZvcmUgdGhlIGhhbmRsZXJzCisJICogYXJlIGluc3RhbGxlZC4KKwkgKi8KKwlzdGF0dXMgPSBhY3BpX2V2X2ZpeGVkX2V2ZW50X2luaXRpYWxpemUoKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJQUNQSV9FWENFUFRJT04oKEFFX0lORk8sIHN0YXR1cywKKwkJCQkiVW5hYmxlIHRvIGluaXRpYWxpemUgZml4ZWQgZXZlbnRzIikpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKKwl9CisKKwlzdGF0dXMgPSBhY3BpX2V2X2dwZV9pbml0aWFsaXplKCk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCUFDUElfRVhDRVBUSU9OKChBRV9JTkZPLCBzdGF0dXMsCisJCQkJIlVuYWJsZSB0byBpbml0aWFsaXplIGdlbmVyYWwgcHVycG9zZSBldmVudHMiKSk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworCX0KKworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX2V2X2luc3RhbGxfZmFkdF9ncGVzCisgKgorICogUEFSQU1FVEVSUzogIE5vbmUKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IENvbXBsZXRlcyBpbml0aWFsaXphdGlvbiBvZiB0aGUgRkFEVC1kZWZpbmVkIEdQRSBibG9ja3MKKyAqICAgICAgICAgICAgICAoMCBhbmQgMSkuIFRoaXMgY2F1c2VzIHRoZSBfUFJXIG1ldGhvZHMgdG8gYmUgcnVuLCBzbyB0aGUgSFcKKyAqICAgICAgICAgICAgICBtdXN0IGJlIGZ1bGx5IGluaXRpYWxpemVkIGF0IHRoaXMgcG9pbnQsIGluY2x1ZGluZyBnbG9iYWwgbG9jaworICogICAgICAgICAgICAgIHN1cHBvcnQuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworYWNwaV9zdGF0dXMgYWNwaV9ldl9pbnN0YWxsX2ZhZHRfZ3Blcyh2b2lkKQoreworCWFjcGlfc3RhdHVzIHN0YXR1czsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0UoZXZfaW5zdGFsbF9mYWR0X2dwZXMpOworCisJLyogTmFtZXNwYWNlIG11c3QgYmUgbG9ja2VkICovCisKKwlzdGF0dXMgPSBhY3BpX3V0X2FjcXVpcmVfbXV0ZXgoQUNQSV9NVFhfTkFNRVNQQUNFKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuIChzdGF0dXMpOworCX0KKworCS8qIEZBRFQgR1BFIEJsb2NrIDAgKi8KKworCSh2b2lkKWFjcGlfZXZfaW5pdGlhbGl6ZV9ncGVfYmxvY2soYWNwaV9nYmxfZmFkdF9ncGVfZGV2aWNlLAorCQkJCQkgICBhY3BpX2dibF9ncGVfZmFkdF9ibG9ja3NbMF0pOworCisJLyogRkFEVCBHUEUgQmxvY2sgMSAqLworCisJKHZvaWQpYWNwaV9ldl9pbml0aWFsaXplX2dwZV9ibG9jayhhY3BpX2dibF9mYWR0X2dwZV9kZXZpY2UsCisJCQkJCSAgIGFjcGlfZ2JsX2dwZV9mYWR0X2Jsb2Nrc1sxXSk7CisKKwkodm9pZClhY3BpX3V0X3JlbGVhc2VfbXV0ZXgoQUNQSV9NVFhfTkFNRVNQQUNFKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX2V2X2luc3RhbGxfeHJ1cHRfaGFuZGxlcnMKKyAqCisgKiBQQVJBTUVURVJTOiAgTm9uZQorICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogSW5zdGFsbCBpbnRlcnJ1cHQgaGFuZGxlcnMgZm9yIHRoZSBTQ0kgYW5kIEdsb2JhbCBMb2NrCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworYWNwaV9zdGF0dXMgYWNwaV9ldl9pbnN0YWxsX3hydXB0X2hhbmRsZXJzKHZvaWQpCit7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCisJQUNQSV9GVU5DVElPTl9UUkFDRShldl9pbnN0YWxsX3hydXB0X2hhbmRsZXJzKTsKKworCS8qIEluc3RhbGwgdGhlIFNDSSBoYW5kbGVyICovCisKKwlzdGF0dXMgPSBhY3BpX2V2X2luc3RhbGxfc2NpX2hhbmRsZXIoKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJQUNQSV9FWENFUFRJT04oKEFFX0lORk8sIHN0YXR1cywKKwkJCQkiVW5hYmxlIHRvIGluc3RhbGwgU3lzdGVtIENvbnRyb2wgSW50ZXJydXB0IGhhbmRsZXIiKSk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworCX0KKworCS8qIEluc3RhbGwgdGhlIGhhbmRsZXIgZm9yIHRoZSBHbG9iYWwgTG9jayAqLworCisJc3RhdHVzID0gYWNwaV9ldl9pbml0X2dsb2JhbF9sb2NrX2hhbmRsZXIoKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJQUNQSV9FWENFUFRJT04oKEFFX0lORk8sIHN0YXR1cywKKwkJCQkiVW5hYmxlIHRvIGluaXRpYWxpemUgR2xvYmFsIExvY2sgaGFuZGxlciIpKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CisJfQorCisJYWNwaV9nYmxfZXZlbnRzX2luaXRpYWxpemVkID0gVFJVRTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9ldl9maXhlZF9ldmVudF9pbml0aWFsaXplCisgKgorICogUEFSQU1FVEVSUzogIE5vbmUKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IEluc3RhbGwgdGhlIGZpeGVkIGV2ZW50IGhhbmRsZXJzIGFuZCBlbmFibGUgdGhlIGZpeGVkIGV2ZW50cy4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgYWNwaV9zdGF0dXMgYWNwaV9ldl9maXhlZF9ldmVudF9pbml0aWFsaXplKHZvaWQpCit7CisJdTMyIGk7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCisJLyoKKwkgKiBJbml0aWFsaXplIHRoZSBzdHJ1Y3R1cmUgdGhhdCBrZWVwcyB0cmFjayBvZiBmaXhlZCBldmVudCBoYW5kbGVycyBhbmQKKwkgKiBlbmFibGUgdGhlIGZpeGVkIGV2ZW50cy4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgQUNQSV9OVU1fRklYRURfRVZFTlRTOyBpKyspIHsKKwkJYWNwaV9nYmxfZml4ZWRfZXZlbnRfaGFuZGxlcnNbaV0uaGFuZGxlciA9IE5VTEw7CisJCWFjcGlfZ2JsX2ZpeGVkX2V2ZW50X2hhbmRsZXJzW2ldLmNvbnRleHQgPSBOVUxMOworCisJCS8qIEVuYWJsZSB0aGUgZml4ZWQgZXZlbnQgKi8KKworCQlpZiAoYWNwaV9nYmxfZml4ZWRfZXZlbnRfaW5mb1tpXS5lbmFibGVfcmVnaXN0ZXJfaWQgIT0gMHhGRikgeworCQkJc3RhdHVzID0KKwkJCSAgICBhY3BpX3NldF9yZWdpc3RlcihhY3BpX2dibF9maXhlZF9ldmVudF9pbmZvW2ldLgorCQkJCQkgICAgICBlbmFibGVfcmVnaXN0ZXJfaWQsIDApOworCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQkJcmV0dXJuIChzdGF0dXMpOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuIChBRV9PSyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfZXZfZml4ZWRfZXZlbnRfZGV0ZWN0CisgKgorICogUEFSQU1FVEVSUzogIE5vbmUKKyAqCisgKiBSRVRVUk46ICAgICAgSU5URVJSVVBUX0hBTkRMRUQgb3IgSU5URVJSVVBUX05PVF9IQU5ETEVECisgKgorICogREVTQ1JJUFRJT046IENoZWNrcyB0aGUgUE0gc3RhdHVzIHJlZ2lzdGVyIGZvciBhY3RpdmUgZml4ZWQgZXZlbnRzCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordTMyIGFjcGlfZXZfZml4ZWRfZXZlbnRfZGV0ZWN0KHZvaWQpCit7CisJdTMyIGludF9zdGF0dXMgPSBBQ1BJX0lOVEVSUlVQVF9OT1RfSEFORExFRDsKKwl1MzIgZml4ZWRfc3RhdHVzOworCXUzMiBmaXhlZF9lbmFibGU7CisJdTMyIGk7CisKKwlBQ1BJX0ZVTkNUSU9OX05BTUUoZXZfZml4ZWRfZXZlbnRfZGV0ZWN0KTsKKworCS8qCisJICogUmVhZCB0aGUgZml4ZWQgZmVhdHVyZSBzdGF0dXMgYW5kIGVuYWJsZSByZWdpc3RlcnMsIGFzIGFsbCB0aGUgY2FzZXMKKwkgKiBkZXBlbmQgb24gdGhlaXIgdmFsdWVzLiBJZ25vcmUgZXJyb3JzIGhlcmUuCisJICovCisJKHZvaWQpYWNwaV9od19yZWdpc3Rlcl9yZWFkKEFDUElfUkVHSVNURVJfUE0xX1NUQVRVUywgJmZpeGVkX3N0YXR1cyk7CisJKHZvaWQpYWNwaV9od19yZWdpc3Rlcl9yZWFkKEFDUElfUkVHSVNURVJfUE0xX0VOQUJMRSwgJmZpeGVkX2VuYWJsZSk7CisKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lOVEVSUlVQVFMsCisJCQkgICJGaXhlZCBFdmVudCBCbG9jazogRW5hYmxlICUwOFggU3RhdHVzICUwOFhcbiIsCisJCQkgIGZpeGVkX2VuYWJsZSwgZml4ZWRfc3RhdHVzKSk7CisKKwkvKgorCSAqIENoZWNrIGZvciBhbGwgcG9zc2libGUgRml4ZWQgRXZlbnRzIGFuZCBkaXNwYXRjaCB0aG9zZSB0aGF0IGFyZSBhY3RpdmUKKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgQUNQSV9OVU1fRklYRURfRVZFTlRTOyBpKyspIHsKKworCQkvKiBCb3RoIHRoZSBzdGF0dXMgYW5kIGVuYWJsZSBiaXRzIG11c3QgYmUgb24gZm9yIHRoaXMgZXZlbnQgKi8KKworCQlpZiAoKGZpeGVkX3N0YXR1cyAmIGFjcGlfZ2JsX2ZpeGVkX2V2ZW50X2luZm9baV0uCisJCSAgICAgc3RhdHVzX2JpdF9tYXNrKQorCQkgICAgJiYgKGZpeGVkX2VuYWJsZSAmIGFjcGlfZ2JsX2ZpeGVkX2V2ZW50X2luZm9baV0uCisJCQllbmFibGVfYml0X21hc2spKSB7CisKKwkJCS8qIEZvdW5kIGFuIGFjdGl2ZSAoc2lnbmFsbGVkKSBldmVudCAqLworCQkJYWNwaV9vc19maXhlZF9ldmVudF9jb3VudChpKTsKKwkJCWludF9zdGF0dXMgfD0gYWNwaV9ldl9maXhlZF9ldmVudF9kaXNwYXRjaChpKTsKKwkJfQorCX0KKworCXJldHVybiAoaW50X3N0YXR1cyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfZXZfZml4ZWRfZXZlbnRfZGlzcGF0Y2gKKyAqCisgKiBQQVJBTUVURVJTOiAgRXZlbnQgICAgICAgICAgICAgICAtIEV2ZW50IHR5cGUKKyAqCisgKiBSRVRVUk46ICAgICAgSU5URVJSVVBUX0hBTkRMRUQgb3IgSU5URVJSVVBUX05PVF9IQU5ETEVECisgKgorICogREVTQ1JJUFRJT046IENsZWFycyB0aGUgc3RhdHVzIGJpdCBmb3IgdGhlIHJlcXVlc3RlZCBldmVudCwgY2FsbHMgdGhlCisgKiAgICAgICAgICAgICAgaGFuZGxlciB0aGF0IHByZXZpb3VzbHkgcmVnaXN0ZXJlZCBmb3IgdGhlIGV2ZW50LgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB1MzIgYWNwaV9ldl9maXhlZF9ldmVudF9kaXNwYXRjaCh1MzIgZXZlbnQpCit7CisKKwlBQ1BJX0ZVTkNUSU9OX0VOVFJZKCk7CisKKwkvKiBDbGVhciB0aGUgc3RhdHVzIGJpdCAqLworCisJKHZvaWQpYWNwaV9zZXRfcmVnaXN0ZXIoYWNwaV9nYmxfZml4ZWRfZXZlbnRfaW5mb1tldmVudF0uCisJCQkJc3RhdHVzX3JlZ2lzdGVyX2lkLCAxKTsKKworCS8qCisJICogTWFrZSBzdXJlIHdlJ3ZlIGdvdCBhIGhhbmRsZXIuIElmIG5vdCwgcmVwb3J0IGFuIGVycm9yLiBUaGUgZXZlbnQgaXMKKwkgKiBkaXNhYmxlZCB0byBwcmV2ZW50IGZ1cnRoZXIgaW50ZXJydXB0cy4KKwkgKi8KKwlpZiAoTlVMTCA9PSBhY3BpX2dibF9maXhlZF9ldmVudF9oYW5kbGVyc1tldmVudF0uaGFuZGxlcikgeworCQkodm9pZClhY3BpX3NldF9yZWdpc3RlcihhY3BpX2dibF9maXhlZF9ldmVudF9pbmZvW2V2ZW50XS4KKwkJCQkJZW5hYmxlX3JlZ2lzdGVyX2lkLCAwKTsKKworCQlBQ1BJX0VSUk9SKChBRV9JTkZPLAorCQkJICAgICJObyBpbnN0YWxsZWQgaGFuZGxlciBmb3IgZml4ZWQgZXZlbnQgWyUwOFhdIiwKKwkJCSAgICBldmVudCkpOworCisJCXJldHVybiAoQUNQSV9JTlRFUlJVUFRfTk9UX0hBTkRMRUQpOworCX0KKworCS8qIEludm9rZSB0aGUgRml4ZWQgRXZlbnQgaGFuZGxlciAqLworCisJcmV0dXJuICgoYWNwaV9nYmxfZml4ZWRfZXZlbnRfaGFuZGxlcnNbZXZlbnRdLgorCQkgaGFuZGxlcikgKGFjcGlfZ2JsX2ZpeGVkX2V2ZW50X2hhbmRsZXJzW2V2ZW50XS5jb250ZXh0KSk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2V2Z3BlLmMgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2V2Z3BlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjM0NWNlZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXZncGUuYwpAQCAtMCwwICsxLDcyMiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIE1vZHVsZSBOYW1lOiBldmdwZSAtIEdlbmVyYWwgUHVycG9zZSBFdmVudCBoYW5kbGluZyBhbmQgZGlzcGF0Y2gKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA4LCBJbnRlbCBDb3JwLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAorICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgYXQgbWluaW11bSBhIGRpc2NsYWltZXIKKyAqICAgIHN1YnN0YW50aWFsbHkgc2ltaWxhciB0byB0aGUgIk5PIFdBUlJBTlRZIiBkaXNjbGFpbWVyIGJlbG93CisgKiAgICAoIkRpc2NsYWltZXIiKSBhbmQgYW55IHJlZGlzdHJpYnV0aW9uIG11c3QgYmUgY29uZGl0aW9uZWQgdXBvbgorICogICAgaW5jbHVkaW5nIGEgc3Vic3RhbnRpYWxseSBzaW1pbGFyIERpc2NsYWltZXIgcmVxdWlyZW1lbnQgZm9yIGZ1cnRoZXIKKyAqICAgIGJpbmFyeSByZWRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcworICogICAgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBOTyBXQVJSQU5UWQorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcKKyAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgorICovCisKKyNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KKyNpbmNsdWRlICJhY2NvbW1vbi5oIgorI2luY2x1ZGUgImFjZXZlbnRzLmgiCisjaW5jbHVkZSAiYWNuYW1lc3AuaCIKKworI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfRVZFTlRTCitBQ1BJX01PRFVMRV9OQU1FKCJldmdwZSIpCisKKy8qIExvY2FsIHByb3RvdHlwZXMgKi8KK3N0YXRpYyB2b2lkIEFDUElfU1lTVEVNX1hGQUNFIGFjcGlfZXZfYXN5bmNoX2V4ZWN1dGVfZ3BlX21ldGhvZCh2b2lkICpjb250ZXh0KTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9ldl9zZXRfZ3BlX3R5cGUKKyAqCisgKiBQQVJBTUVURVJTOiAgZ3BlX2V2ZW50X2luZm8gICAgICAgICAgLSBHUEUgdG8gc2V0CisgKiAgICAgICAgICAgICAgVHlwZSAgICAgICAgICAgICAgICAgICAgLSBOZXcgdHlwZQorICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogU2V0cyB0aGUgbmV3IHR5cGUgZm9yIHRoZSBHUEUgKHdha2UsIHJ1biwgb3Igd2FrZS9ydW4pCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworYWNwaV9zdGF0dXMKK2FjcGlfZXZfc2V0X2dwZV90eXBlKHN0cnVjdCBhY3BpX2dwZV9ldmVudF9pbmZvICpncGVfZXZlbnRfaW5mbywgdTggdHlwZSkKK3sKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGV2X3NldF9ncGVfdHlwZSk7CisKKwkvKiBWYWxpZGF0ZSB0eXBlIGFuZCB1cGRhdGUgcmVnaXN0ZXIgZW5hYmxlIG1hc2tzICovCisKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIEFDUElfR1BFX1RZUEVfV0FLRToKKwljYXNlIEFDUElfR1BFX1RZUEVfUlVOVElNRToKKwljYXNlIEFDUElfR1BFX1RZUEVfV0FLRV9SVU46CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9QQVJBTUVURVIpOworCX0KKworCS8qIERpc2FibGUgdGhlIEdQRSBpZiBjdXJyZW50bHkgZW5hYmxlZCAqLworCisJc3RhdHVzID0gYWNwaV9ldl9kaXNhYmxlX2dwZShncGVfZXZlbnRfaW5mbyk7CisKKwkvKiBUeXBlIHdhcyB2YWxpZGF0ZWQgYWJvdmUgKi8KKworCWdwZV9ldmVudF9pbmZvLT5mbGFncyAmPSB+QUNQSV9HUEVfVFlQRV9NQVNLOwkvKiBDbGVhciB0eXBlIGJpdHMgKi8KKwlncGVfZXZlbnRfaW5mby0+ZmxhZ3MgfD0gdHlwZTsJLyogSW5zZXJ0IHR5cGUgKi8KKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9ldl91cGRhdGVfZ3BlX2VuYWJsZV9tYXNrcworICoKKyAqIFBBUkFNRVRFUlM6ICBncGVfZXZlbnRfaW5mbyAgICAgICAgICAtIEdQRSB0byB1cGRhdGUKKyAqICAgICAgICAgICAgICBUeXBlICAgICAgICAgICAgICAgICAgICAtIFdoYXQgdG8gZG86IEFDUElfR1BFX0RJU0FCTEUgb3IKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFDUElfR1BFX0VOQUJMRQorICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogVXBkYXRlcyBHUEUgcmVnaXN0ZXIgZW5hYmxlIG1hc2tzIGJhc2VkIG9uIHRoZSBHUEUgdHlwZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2FjcGlfc3RhdHVzCithY3BpX2V2X3VwZGF0ZV9ncGVfZW5hYmxlX21hc2tzKHN0cnVjdCBhY3BpX2dwZV9ldmVudF9pbmZvICpncGVfZXZlbnRfaW5mbywKKwkJCQl1OCB0eXBlKQoreworCXN0cnVjdCBhY3BpX2dwZV9yZWdpc3Rlcl9pbmZvICpncGVfcmVnaXN0ZXJfaW5mbzsKKwl1OCByZWdpc3Rlcl9iaXQ7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGV2X3VwZGF0ZV9ncGVfZW5hYmxlX21hc2tzKTsKKworCWdwZV9yZWdpc3Rlcl9pbmZvID0gZ3BlX2V2ZW50X2luZm8tPnJlZ2lzdGVyX2luZm87CisJaWYgKCFncGVfcmVnaXN0ZXJfaW5mbykgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9UX0VYSVNUKTsKKwl9CisJcmVnaXN0ZXJfYml0ID0gKHU4KQorCSAgICAoMSA8PAorCSAgICAgKGdwZV9ldmVudF9pbmZvLT5ncGVfbnVtYmVyIC0gZ3BlX3JlZ2lzdGVyX2luZm8tPmJhc2VfZ3BlX251bWJlcikpOworCisJLyogMSkgRGlzYWJsZSBjYXNlLiBTaW1wbHkgY2xlYXIgYWxsIGVuYWJsZSBiaXRzICovCisKKwlpZiAodHlwZSA9PSBBQ1BJX0dQRV9ESVNBQkxFKSB7CisJCUFDUElfQ0xFQVJfQklUKGdwZV9yZWdpc3Rlcl9pbmZvLT5lbmFibGVfZm9yX3dha2UsCisJCQkgICAgICAgcmVnaXN0ZXJfYml0KTsKKwkJQUNQSV9DTEVBUl9CSVQoZ3BlX3JlZ2lzdGVyX2luZm8tPmVuYWJsZV9mb3JfcnVuLCByZWdpc3Rlcl9iaXQpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOworCX0KKworCS8qIDIpIEVuYWJsZSBjYXNlLiBTZXQvQ2xlYXIgdGhlIGFwcHJvcHJpYXRlIGVuYWJsZSBiaXRzICovCisKKwlzd2l0Y2ggKGdwZV9ldmVudF9pbmZvLT5mbGFncyAmIEFDUElfR1BFX1RZUEVfTUFTSykgeworCWNhc2UgQUNQSV9HUEVfVFlQRV9XQUtFOgorCQlBQ1BJX1NFVF9CSVQoZ3BlX3JlZ2lzdGVyX2luZm8tPmVuYWJsZV9mb3Jfd2FrZSwgcmVnaXN0ZXJfYml0KTsKKwkJQUNQSV9DTEVBUl9CSVQoZ3BlX3JlZ2lzdGVyX2luZm8tPmVuYWJsZV9mb3JfcnVuLCByZWdpc3Rlcl9iaXQpOworCQlicmVhazsKKworCWNhc2UgQUNQSV9HUEVfVFlQRV9SVU5USU1FOgorCQlBQ1BJX0NMRUFSX0JJVChncGVfcmVnaXN0ZXJfaW5mby0+ZW5hYmxlX2Zvcl93YWtlLAorCQkJICAgICAgIHJlZ2lzdGVyX2JpdCk7CisJCUFDUElfU0VUX0JJVChncGVfcmVnaXN0ZXJfaW5mby0+ZW5hYmxlX2Zvcl9ydW4sIHJlZ2lzdGVyX2JpdCk7CisJCWJyZWFrOworCisJY2FzZSBBQ1BJX0dQRV9UWVBFX1dBS0VfUlVOOgorCQlBQ1BJX1NFVF9CSVQoZ3BlX3JlZ2lzdGVyX2luZm8tPmVuYWJsZV9mb3Jfd2FrZSwgcmVnaXN0ZXJfYml0KTsKKwkJQUNQSV9TRVRfQklUKGdwZV9yZWdpc3Rlcl9pbmZvLT5lbmFibGVfZm9yX3J1biwgcmVnaXN0ZXJfYml0KTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX1BBUkFNRVRFUik7CisJfQorCisJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9ldl9lbmFibGVfZ3BlCisgKgorICogUEFSQU1FVEVSUzogIGdwZV9ldmVudF9pbmZvICAgICAgICAgIC0gR1BFIHRvIGVuYWJsZQorICogICAgICAgICAgICAgIHdyaXRlX3RvX2hhcmR3YXJlICAgICAgIC0gRW5hYmxlIG5vdywgb3IganVzdCBtYXJrIGRhdGEgc3RydWN0cworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFdBS0UgR1BFcyBzaG91bGQgYmUgZGVmZXJyZWQpCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBFbmFibGUgYSBHUEUgYmFzZWQgb24gdGhlIEdQRSB0eXBlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworYWNwaV9zdGF0dXMKK2FjcGlfZXZfZW5hYmxlX2dwZShzdHJ1Y3QgYWNwaV9ncGVfZXZlbnRfaW5mbyAqZ3BlX2V2ZW50X2luZm8sCisJCSAgIHU4IHdyaXRlX3RvX2hhcmR3YXJlKQoreworCWFjcGlfc3RhdHVzIHN0YXR1czsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0UoZXZfZW5hYmxlX2dwZSk7CisKKwkvKiBNYWtlIHN1cmUgSFcgZW5hYmxlIG1hc2tzIGFyZSB1cGRhdGVkICovCisKKwlzdGF0dXMgPQorCSAgICBhY3BpX2V2X3VwZGF0ZV9ncGVfZW5hYmxlX21hc2tzKGdwZV9ldmVudF9pbmZvLCBBQ1BJX0dQRV9FTkFCTEUpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKKwl9CisKKwkvKiBNYXJrIHdha2UtZW5hYmxlZCBvciBIVyBlbmFibGUsIG9yIGJvdGggKi8KKworCXN3aXRjaCAoZ3BlX2V2ZW50X2luZm8tPmZsYWdzICYgQUNQSV9HUEVfVFlQRV9NQVNLKSB7CisJY2FzZSBBQ1BJX0dQRV9UWVBFX1dBS0U6CisKKwkJQUNQSV9TRVRfQklUKGdwZV9ldmVudF9pbmZvLT5mbGFncywgQUNQSV9HUEVfV0FLRV9FTkFCTEVEKTsKKwkJYnJlYWs7CisKKwljYXNlIEFDUElfR1BFX1RZUEVfV0FLRV9SVU46CisKKwkJQUNQSV9TRVRfQklUKGdwZV9ldmVudF9pbmZvLT5mbGFncywgQUNQSV9HUEVfV0FLRV9FTkFCTEVEKTsKKworCQkvKmxpbnQgLWZhbGx0aHJvdWdoICovCisKKwljYXNlIEFDUElfR1BFX1RZUEVfUlVOVElNRToKKworCQlBQ1BJX1NFVF9CSVQoZ3BlX2V2ZW50X2luZm8tPmZsYWdzLCBBQ1BJX0dQRV9SVU5fRU5BQkxFRCk7CisKKwkJaWYgKHdyaXRlX3RvX2hhcmR3YXJlKSB7CisKKwkJCS8qIENsZWFyIHRoZSBHUEUgKG9mIHN0YWxlIGV2ZW50cyksIHRoZW4gZW5hYmxlIGl0ICovCisKKwkJCXN0YXR1cyA9IGFjcGlfaHdfY2xlYXJfZ3BlKGdwZV9ldmVudF9pbmZvKTsKKwkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworCQkJfQorCisJCQkvKiBFbmFibGUgdGhlIHJlcXVlc3RlZCBydW50aW1lIEdQRSAqLworCisJCQlzdGF0dXMgPSBhY3BpX2h3X3dyaXRlX2dwZV9lbmFibGVfcmVnKGdwZV9ldmVudF9pbmZvKTsKKwkJfQorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfUEFSQU1FVEVSKTsKKwl9CisKKwlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX2V2X2Rpc2FibGVfZ3BlCisgKgorICogUEFSQU1FVEVSUzogIGdwZV9ldmVudF9pbmZvICAgICAgICAgIC0gR1BFIHRvIGRpc2FibGUKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IERpc2FibGUgYSBHUEUgYmFzZWQgb24gdGhlIEdQRSB0eXBlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworYWNwaV9zdGF0dXMgYWNwaV9ldl9kaXNhYmxlX2dwZShzdHJ1Y3QgYWNwaV9ncGVfZXZlbnRfaW5mbyAqZ3BlX2V2ZW50X2luZm8pCit7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCisJQUNQSV9GVU5DVElPTl9UUkFDRShldl9kaXNhYmxlX2dwZSk7CisKKwkvKiBNYWtlIHN1cmUgSFcgZW5hYmxlIG1hc2tzIGFyZSB1cGRhdGVkICovCisKKwlzdGF0dXMgPQorCSAgICBhY3BpX2V2X3VwZGF0ZV9ncGVfZW5hYmxlX21hc2tzKGdwZV9ldmVudF9pbmZvLCBBQ1BJX0dQRV9ESVNBQkxFKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CisJfQorCisJLyogQ2xlYXIgdGhlIGFwcHJvcHJpYXRlIGVuYWJsZWQgZmxhZ3MgZm9yIHRoaXMgR1BFICovCisKKwlzd2l0Y2ggKGdwZV9ldmVudF9pbmZvLT5mbGFncyAmIEFDUElfR1BFX1RZUEVfTUFTSykgeworCWNhc2UgQUNQSV9HUEVfVFlQRV9XQUtFOgorCQlBQ1BJX0NMRUFSX0JJVChncGVfZXZlbnRfaW5mby0+ZmxhZ3MsIEFDUElfR1BFX1dBS0VfRU5BQkxFRCk7CisJCWJyZWFrOworCisJY2FzZSBBQ1BJX0dQRV9UWVBFX1dBS0VfUlVOOgorCQlBQ1BJX0NMRUFSX0JJVChncGVfZXZlbnRfaW5mby0+ZmxhZ3MsIEFDUElfR1BFX1dBS0VfRU5BQkxFRCk7CisKKwkJLyogZmFsbHRocm91Z2ggKi8KKworCWNhc2UgQUNQSV9HUEVfVFlQRV9SVU5USU1FOgorCisJCS8qIERpc2FibGUgdGhlIHJlcXVlc3RlZCBydW50aW1lIEdQRSAqLworCisJCUFDUElfQ0xFQVJfQklUKGdwZV9ldmVudF9pbmZvLT5mbGFncywgQUNQSV9HUEVfUlVOX0VOQUJMRUQpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCS8qCisJICogRXZlbiBpZiB3ZSBkb24ndCBrbm93IHRoZSBHUEUgdHlwZSwgbWFrZSBzdXJlIHRoYXQgd2UgYWx3YXlzCisJICogZGlzYWJsZSBpdC4gbG93X2Rpc2FibGVfZ3BlIHdpbGwganVzdCBjbGVhciB0aGUgZW5hYmxlIGJpdCBmb3IgdGhpcworCSAqIEdQRSBhbmQgd3JpdGUgaXQuIEl0IHdpbGwgbm90IHdyaXRlIG91dCB0aGUgY3VycmVudCBHUEUgZW5hYmxlIG1hc2ssCisJICogc2luY2UgdGhpcyBtYXkgaW5hZHZlcnRlbnRseSBlbmFibGUgR1BFcyB0b28gZWFybHksIGlmIGEgcm9ndWUgR1BFIGhhcworCSAqIGNvbWUgaW4gZHVyaW5nIEFDUElDQSBpbml0aWFsaXphdGlvbiAtIHBvc3NpYmx5IGFzIGEgcmVzdWx0IG9mIEFNTCBvcgorCSAqIG90aGVyIGNvZGUgdGhhdCBoYXMgZW5hYmxlZCB0aGUgR1BFLgorCSAqLworCXN0YXR1cyA9IGFjcGlfaHdfbG93X2Rpc2FibGVfZ3BlKGdwZV9ldmVudF9pbmZvKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9ldl9nZXRfZ3BlX2V2ZW50X2luZm8KKyAqCisgKiBQQVJBTUVURVJTOiAgZ3BlX2RldmljZSAgICAgICAgICAtIERldmljZSBub2RlLiBOVUxMIGZvciBHUEUwL0dQRTEKKyAqICAgICAgICAgICAgICBncGVfbnVtYmVyICAgICAgICAgIC0gUmF3IEdQRSBudW1iZXIKKyAqCisgKiBSRVRVUk46ICAgICAgQSBHUEUgZXZlbnRfaW5mbyBzdHJ1Y3QuIE5VTEwgaWYgbm90IGEgdmFsaWQgR1BFCisgKgorICogREVTQ1JJUFRJT046IFJldHVybnMgdGhlIGV2ZW50X2luZm8gc3RydWN0IGFzc29jaWF0ZWQgd2l0aCB0aGlzIEdQRS4KKyAqICAgICAgICAgICAgICBWYWxpZGF0ZXMgdGhlIGdwZV9ibG9jayBhbmQgdGhlIGdwZV9udW1iZXIKKyAqCisgKiAgICAgICAgICAgICAgU2hvdWxkIGJlIGNhbGxlZCBvbmx5IHdoZW4gdGhlIEdQRSBsaXN0cyBhcmUgc2VtYXBob3JlIGxvY2tlZAorICogICAgICAgICAgICAgIGFuZCBub3Qgc3ViamVjdCB0byBjaGFuZ2UuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RydWN0IGFjcGlfZ3BlX2V2ZW50X2luZm8gKmFjcGlfZXZfZ2V0X2dwZV9ldmVudF9pbmZvKGFjcGlfaGFuZGxlIGdwZV9kZXZpY2UsCisJCQkJCQkgICAgICAgdTMyIGdwZV9udW1iZXIpCit7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2M7CisJc3RydWN0IGFjcGlfZ3BlX2Jsb2NrX2luZm8gKmdwZV9ibG9jazsKKwl1MzIgaTsKKworCUFDUElfRlVOQ1RJT05fRU5UUlkoKTsKKworCS8qIEEgTlVMTCBncGVfYmxvY2sgbWVhbnMgdXNlIHRoZSBGQURULWRlZmluZWQgR1BFIGJsb2NrKHMpICovCisKKwlpZiAoIWdwZV9kZXZpY2UpIHsKKworCQkvKiBFeGFtaW5lIEdQRSBCbG9jayAwIGFuZCAxIChUaGVzZSBibG9ja3MgYXJlIHBlcm1hbmVudCkgKi8KKworCQlmb3IgKGkgPSAwOyBpIDwgQUNQSV9NQVhfR1BFX0JMT0NLUzsgaSsrKSB7CisJCQlncGVfYmxvY2sgPSBhY3BpX2dibF9ncGVfZmFkdF9ibG9ja3NbaV07CisJCQlpZiAoZ3BlX2Jsb2NrKSB7CisJCQkJaWYgKChncGVfbnVtYmVyID49IGdwZV9ibG9jay0+YmxvY2tfYmFzZV9udW1iZXIpCisJCQkJICAgICYmIChncGVfbnVtYmVyIDwKKwkJCQkJZ3BlX2Jsb2NrLT5ibG9ja19iYXNlX251bWJlciArCisJCQkJCShncGVfYmxvY2stPnJlZ2lzdGVyX2NvdW50ICogOCkpKSB7CisJCQkJCXJldHVybiAoJmdwZV9ibG9jay0+CisJCQkJCQlldmVudF9pbmZvW2dwZV9udW1iZXIgLQorCQkJCQkJCSAgIGdwZV9ibG9jay0+CisJCQkJCQkJICAgYmxvY2tfYmFzZV9udW1iZXJdKTsKKwkJCQl9CisJCQl9CisJCX0KKworCQkvKiBUaGUgZ3BlX251bWJlciB3YXMgbm90IGluIHRoZSByYW5nZSBvZiBlaXRoZXIgRkFEVCBHUEUgYmxvY2sgKi8KKworCQlyZXR1cm4gKE5VTEwpOworCX0KKworCS8qIEEgTm9uLU5VTEwgZ3BlX2RldmljZSBtZWFucyB0aGlzIGlzIGEgR1BFIEJsb2NrIERldmljZSAqLworCisJb2JqX2Rlc2MgPSBhY3BpX25zX2dldF9hdHRhY2hlZF9vYmplY3QoKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICopCisJCQkJCSAgICAgICBncGVfZGV2aWNlKTsKKwlpZiAoIW9ial9kZXNjIHx8ICFvYmpfZGVzYy0+ZGV2aWNlLmdwZV9ibG9jaykgeworCQlyZXR1cm4gKE5VTEwpOworCX0KKworCWdwZV9ibG9jayA9IG9ial9kZXNjLT5kZXZpY2UuZ3BlX2Jsb2NrOworCisJaWYgKChncGVfbnVtYmVyID49IGdwZV9ibG9jay0+YmxvY2tfYmFzZV9udW1iZXIpICYmCisJICAgIChncGVfbnVtYmVyIDwKKwkgICAgIGdwZV9ibG9jay0+YmxvY2tfYmFzZV9udW1iZXIgKyAoZ3BlX2Jsb2NrLT5yZWdpc3Rlcl9jb3VudCAqIDgpKSkgeworCQlyZXR1cm4gKCZncGVfYmxvY2stPgorCQkJZXZlbnRfaW5mb1tncGVfbnVtYmVyIC0gZ3BlX2Jsb2NrLT5ibG9ja19iYXNlX251bWJlcl0pOworCX0KKworCXJldHVybiAoTlVMTCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfZXZfZ3BlX2RldGVjdAorICoKKyAqIFBBUkFNRVRFUlM6ICBncGVfeHJ1cHRfbGlzdCAgICAgIC0gSW50ZXJydXB0IGJsb2NrIGZvciB0aGlzIGludGVycnVwdC4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FuIGhhdmUgbXVsdGlwbGUgR1BFIGJsb2NrcyBhdHRhY2hlZC4KKyAqCisgKiBSRVRVUk46ICAgICAgSU5URVJSVVBUX0hBTkRMRUQgb3IgSU5URVJSVVBUX05PVF9IQU5ETEVECisgKgorICogREVTQ1JJUFRJT046IERldGVjdCBpZiBhbnkgR1AgZXZlbnRzIGhhdmUgb2NjdXJyZWQuIFRoaXMgZnVuY3Rpb24gaXMKKyAqICAgICAgICAgICAgICBleGVjdXRlZCBhdCBpbnRlcnJ1cHQgbGV2ZWwuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordTMyIGFjcGlfZXZfZ3BlX2RldGVjdChzdHJ1Y3QgYWNwaV9ncGVfeHJ1cHRfaW5mbyAqIGdwZV94cnVwdF9saXN0KQoreworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwlzdHJ1Y3QgYWNwaV9ncGVfYmxvY2tfaW5mbyAqZ3BlX2Jsb2NrOworCXN0cnVjdCBhY3BpX2dwZV9yZWdpc3Rlcl9pbmZvICpncGVfcmVnaXN0ZXJfaW5mbzsKKwl1MzIgaW50X3N0YXR1cyA9IEFDUElfSU5URVJSVVBUX05PVF9IQU5ETEVEOworCXU4IGVuYWJsZWRfc3RhdHVzX2J5dGU7CisJdTMyIHN0YXR1c19yZWc7CisJdTMyIGVuYWJsZV9yZWc7CisJYWNwaV9jcHVfZmxhZ3MgZmxhZ3M7CisJdTMyIGk7CisJdTMyIGo7CisKKwlBQ1BJX0ZVTkNUSU9OX05BTUUoZXZfZ3BlX2RldGVjdCk7CisKKwkvKiBDaGVjayBmb3IgdGhlIGNhc2Ugd2hlcmUgdGhlcmUgYXJlIG5vIEdQRXMgKi8KKworCWlmICghZ3BlX3hydXB0X2xpc3QpIHsKKwkJcmV0dXJuIChpbnRfc3RhdHVzKTsKKwl9CisKKwkvKgorCSAqIFdlIG5lZWQgdG8gb2J0YWluIHRoZSBHUEUgbG9jayBmb3IgYm90aCB0aGUgZGF0YSBzdHJ1Y3RzIGFuZCByZWdpc3RlcnMKKwkgKiBOb3RlOiBOb3QgbmVjZXNzYXJ5IHRvIG9idGFpbiB0aGUgaGFyZHdhcmUgbG9jaywgc2luY2UgdGhlIEdQRQorCSAqIHJlZ2lzdGVycyBhcmUgb3duZWQgYnkgdGhlIGdwZV9sb2NrLgorCSAqLworCWZsYWdzID0gYWNwaV9vc19hY3F1aXJlX2xvY2soYWNwaV9nYmxfZ3BlX2xvY2spOworCisJLyogRXhhbWluZSBhbGwgR1BFIGJsb2NrcyBhdHRhY2hlZCB0byB0aGlzIGludGVycnVwdCBsZXZlbCAqLworCisJZ3BlX2Jsb2NrID0gZ3BlX3hydXB0X2xpc3QtPmdwZV9ibG9ja19saXN0X2hlYWQ7CisJd2hpbGUgKGdwZV9ibG9jaykgeworCQkvKgorCQkgKiBSZWFkIGFsbCBvZiB0aGUgOC1iaXQgR1BFIHN0YXR1cyBhbmQgZW5hYmxlIHJlZ2lzdGVycyBpbiB0aGlzIEdQRQorCQkgKiBibG9jaywgc2F2aW5nIGFsbCBvZiB0aGVtLiBGaW5kIGFsbCBjdXJyZW50bHkgYWN0aXZlIEdQIGV2ZW50cy4KKwkJICovCisJCWZvciAoaSA9IDA7IGkgPCBncGVfYmxvY2stPnJlZ2lzdGVyX2NvdW50OyBpKyspIHsKKworCQkJLyogR2V0IHRoZSBuZXh0IHN0YXR1cy9lbmFibGUgcGFpciAqLworCisJCQlncGVfcmVnaXN0ZXJfaW5mbyA9ICZncGVfYmxvY2stPnJlZ2lzdGVyX2luZm9baV07CisKKwkJCS8qIFJlYWQgdGhlIFN0YXR1cyBSZWdpc3RlciAqLworCisJCQlzdGF0dXMgPQorCQkJICAgIGFjcGlfcmVhZCgmc3RhdHVzX3JlZywKKwkJCQkgICAgICAmZ3BlX3JlZ2lzdGVyX2luZm8tPnN0YXR1c19hZGRyZXNzKTsKKwkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJCWdvdG8gdW5sb2NrX2FuZF9leGl0OworCQkJfQorCisJCQkvKiBSZWFkIHRoZSBFbmFibGUgUmVnaXN0ZXIgKi8KKworCQkJc3RhdHVzID0KKwkJCSAgICBhY3BpX3JlYWQoJmVuYWJsZV9yZWcsCisJCQkJICAgICAgJmdwZV9yZWdpc3Rlcl9pbmZvLT5lbmFibGVfYWRkcmVzcyk7CisJCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCQlnb3RvIHVubG9ja19hbmRfZXhpdDsKKwkJCX0KKworCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTlRFUlJVUFRTLAorCQkJCQkgICJSZWFkIEdQRSBSZWdpc3RlciBhdCBHUEUlWDogU3RhdHVzPSUwMlgsIEVuYWJsZT0lMDJYXG4iLAorCQkJCQkgIGdwZV9yZWdpc3Rlcl9pbmZvLT5iYXNlX2dwZV9udW1iZXIsCisJCQkJCSAgc3RhdHVzX3JlZywgZW5hYmxlX3JlZykpOworCisJCQkvKiBDaGVjayBpZiB0aGVyZSBpcyBhbnl0aGluZyBhY3RpdmUgYXQgYWxsIGluIHRoaXMgcmVnaXN0ZXIgKi8KKworCQkJZW5hYmxlZF9zdGF0dXNfYnl0ZSA9ICh1OCkgKHN0YXR1c19yZWcgJiBlbmFibGVfcmVnKTsKKwkJCWlmICghZW5hYmxlZF9zdGF0dXNfYnl0ZSkgeworCisJCQkJLyogTm8gYWN0aXZlIEdQRXMgaW4gdGhpcyByZWdpc3RlciwgbW92ZSBvbiAqLworCisJCQkJY29udGludWU7CisJCQl9CisKKwkJCS8qIE5vdyBsb29rIGF0IHRoZSBpbmRpdmlkdWFsIEdQRXMgaW4gdGhpcyBieXRlIHJlZ2lzdGVyICovCisKKwkJCWZvciAoaiA9IDA7IGogPCBBQ1BJX0dQRV9SRUdJU1RFUl9XSURUSDsgaisrKSB7CisKKwkJCQkvKiBFeGFtaW5lIG9uZSBHUEUgYml0ICovCisKKwkJCQlpZiAoZW5hYmxlZF9zdGF0dXNfYnl0ZSAmICgxIDw8IGopKSB7CisJCQkJCS8qCisJCQkJCSAqIEZvdW5kIGFuIGFjdGl2ZSBHUEUuIERpc3BhdGNoIHRoZSBldmVudCB0byBhIGhhbmRsZXIKKwkJCQkJICogb3IgbWV0aG9kLgorCQkJCQkgKi8KKwkJCQkJaW50X3N0YXR1cyB8PQorCQkJCQkgICAgYWNwaV9ldl9ncGVfZGlzcGF0Y2goJmdwZV9ibG9jay0+CisJCQkJCQlldmVudF9pbmZvWygoYWNwaV9zaXplKSBpICogQUNQSV9HUEVfUkVHSVNURVJfV0lEVEgpICsgal0sIGogKyBncGVfcmVnaXN0ZXJfaW5mby0+YmFzZV9ncGVfbnVtYmVyKTsKKwkJCQl9CisJCQl9CisJCX0KKworCQlncGVfYmxvY2sgPSBncGVfYmxvY2stPm5leHQ7CisJfQorCisgICAgICB1bmxvY2tfYW5kX2V4aXQ6CisKKwlhY3BpX29zX3JlbGVhc2VfbG9jayhhY3BpX2dibF9ncGVfbG9jaywgZmxhZ3MpOworCXJldHVybiAoaW50X3N0YXR1cyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfZXZfYXN5bmNoX2V4ZWN1dGVfZ3BlX21ldGhvZAorICoKKyAqIFBBUkFNRVRFUlM6ICBDb250ZXh0IChncGVfZXZlbnRfaW5mbykgLSBJbmZvIGZvciB0aGlzIEdQRQorICoKKyAqIFJFVFVSTjogICAgICBOb25lCisgKgorICogREVTQ1JJUFRJT046IFBlcmZvcm0gdGhlIGFjdHVhbCBleGVjdXRpb24gb2YgYSBHUEUgY29udHJvbCBtZXRob2QuIFRoaXMKKyAqICAgICAgICAgICAgICBmdW5jdGlvbiBpcyBjYWxsZWQgZnJvbSBhbiBpbnZvY2F0aW9uIG9mIGFjcGlfb3NfZXhlY3V0ZSBhbmQKKyAqICAgICAgICAgICAgICB0aGVyZWZvcmUgZG9lcyBOT1QgZXhlY3V0ZSBhdCBpbnRlcnJ1cHQgbGV2ZWwgLSBzbyB0aGF0CisgKiAgICAgICAgICAgICAgdGhlIGNvbnRyb2wgbWV0aG9kIGl0c2VsZiBpcyBub3QgZXhlY3V0ZWQgaW4gdGhlIGNvbnRleHQgb2YKKyAqICAgICAgICAgICAgICBhbiBpbnRlcnJ1cHQgaGFuZGxlci4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgYWNwaV9ldl9hc3luY2hfZW5hYmxlX2dwZSh2b2lkICpjb250ZXh0KTsKKworc3RhdGljIHZvaWQgQUNQSV9TWVNURU1fWEZBQ0UgYWNwaV9ldl9hc3luY2hfZXhlY3V0ZV9ncGVfbWV0aG9kKHZvaWQgKmNvbnRleHQpCit7CisJc3RydWN0IGFjcGlfZ3BlX2V2ZW50X2luZm8gKmdwZV9ldmVudF9pbmZvID0gKHZvaWQgKiljb250ZXh0OworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwlzdHJ1Y3QgYWNwaV9ncGVfZXZlbnRfaW5mbyBsb2NhbF9ncGVfZXZlbnRfaW5mbzsKKwlzdHJ1Y3QgYWNwaV9ldmFsdWF0ZV9pbmZvICppbmZvOworCisJQUNQSV9GVU5DVElPTl9UUkFDRShldl9hc3luY2hfZXhlY3V0ZV9ncGVfbWV0aG9kKTsKKworCXN0YXR1cyA9IGFjcGlfdXRfYWNxdWlyZV9tdXRleChBQ1BJX01UWF9FVkVOVFMpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm5fVk9JRDsKKwl9CisKKwkvKiBNdXN0IHJldmFsaWRhdGUgdGhlIGdwZV9udW1iZXIvZ3BlX2Jsb2NrICovCisKKwlpZiAoIWFjcGlfZXZfdmFsaWRfZ3BlX2V2ZW50KGdwZV9ldmVudF9pbmZvKSkgeworCQlzdGF0dXMgPSBhY3BpX3V0X3JlbGVhc2VfbXV0ZXgoQUNQSV9NVFhfRVZFTlRTKTsKKwkJcmV0dXJuX1ZPSUQ7CisJfQorCisJLyogU2V0IHRoZSBHUEUgZmxhZ3MgZm9yIHJldHVybiB0byBlbmFibGVkIHN0YXRlICovCisKKwkodm9pZClhY3BpX2V2X2VuYWJsZV9ncGUoZ3BlX2V2ZW50X2luZm8sIEZBTFNFKTsKKworCS8qCisJICogVGFrZSBhIHNuYXBzaG90IG9mIHRoZSBHUEUgaW5mbyBmb3IgdGhpcyBsZXZlbCAtIHdlIGNvcHkgdGhlIGluZm8gdG8KKwkgKiBwcmV2ZW50IGEgcmFjZSBjb25kaXRpb24gd2l0aCByZW1vdmVfaGFuZGxlci9yZW1vdmVfYmxvY2suCisJICovCisJQUNQSV9NRU1DUFkoJmxvY2FsX2dwZV9ldmVudF9pbmZvLCBncGVfZXZlbnRfaW5mbywKKwkJICAgIHNpemVvZihzdHJ1Y3QgYWNwaV9ncGVfZXZlbnRfaW5mbykpOworCisJc3RhdHVzID0gYWNwaV91dF9yZWxlYXNlX211dGV4KEFDUElfTVRYX0VWRU5UUyk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXJldHVybl9WT0lEOworCX0KKworCS8qCisJICogTXVzdCBjaGVjayBmb3IgY29udHJvbCBtZXRob2QgdHlwZSBkaXNwYXRjaCBvbmUgbW9yZSB0aW1lIHRvIGF2b2lkIGEKKwkgKiByYWNlIHdpdGggZXZfZ3BlX2luc3RhbGxfaGFuZGxlcgorCSAqLworCWlmICgobG9jYWxfZ3BlX2V2ZW50X2luZm8uZmxhZ3MgJiBBQ1BJX0dQRV9ESVNQQVRDSF9NQVNLKSA9PQorCSAgICBBQ1BJX0dQRV9ESVNQQVRDSF9NRVRIT0QpIHsKKworCQkvKiBBbGxvY2F0ZSB0aGUgZXZhbHVhdGlvbiBpbmZvcm1hdGlvbiBibG9jayAqLworCisJCWluZm8gPSBBQ1BJX0FMTE9DQVRFX1pFUk9FRChzaXplb2Yoc3RydWN0IGFjcGlfZXZhbHVhdGVfaW5mbykpOworCQlpZiAoIWluZm8pIHsKKwkJCXN0YXR1cyA9IEFFX05PX01FTU9SWTsKKwkJfSBlbHNlIHsKKwkJCS8qCisJCQkgKiBJbnZva2UgdGhlIEdQRSBNZXRob2QgKF9MeHgsIF9FeHgpIGkuZS4sIGV2YWx1YXRlIHRoZSBfTHh4L19FeHgKKwkJCSAqIGNvbnRyb2wgbWV0aG9kIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhpcyBHUEUKKwkJCSAqLworCQkJaW5mby0+cHJlZml4X25vZGUgPQorCQkJICAgIGxvY2FsX2dwZV9ldmVudF9pbmZvLmRpc3BhdGNoLm1ldGhvZF9ub2RlOworCQkJaW5mby0+ZmxhZ3MgPSBBQ1BJX0lHTk9SRV9SRVRVUk5fVkFMVUU7CisKKwkJCXN0YXR1cyA9IGFjcGlfbnNfZXZhbHVhdGUoaW5mbyk7CisJCQlBQ1BJX0ZSRUUoaW5mbyk7CisJCX0KKworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCUFDUElfRVhDRVBUSU9OKChBRV9JTkZPLCBzdGF0dXMsCisJCQkJCSJ3aGlsZSBldmFsdWF0aW5nIEdQRSBtZXRob2QgWyU0LjRzXSIsCisJCQkJCWFjcGlfdXRfZ2V0X25vZGVfbmFtZQorCQkJCQkobG9jYWxfZ3BlX2V2ZW50X2luZm8uZGlzcGF0Y2guCisJCQkJCSBtZXRob2Rfbm9kZSkpKTsKKwkJfQorCX0KKwkvKiBEZWZlciBlbmFibGluZyBvZiBHUEUgdW50aWwgYWxsIG5vdGlmeSBoYW5kbGVycyBhcmUgZG9uZSAqLworCWFjcGlfb3NfZXhlY3V0ZShPU0xfTk9USUZZX0hBTkRMRVIsIGFjcGlfZXZfYXN5bmNoX2VuYWJsZV9ncGUsCisJCQkJZ3BlX2V2ZW50X2luZm8pOworCXJldHVybl9WT0lEOworfQorCitzdGF0aWMgdm9pZCBhY3BpX2V2X2FzeW5jaF9lbmFibGVfZ3BlKHZvaWQgKmNvbnRleHQpCit7CisJc3RydWN0IGFjcGlfZ3BlX2V2ZW50X2luZm8gKmdwZV9ldmVudF9pbmZvID0gY29udGV4dDsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJaWYgKChncGVfZXZlbnRfaW5mby0+ZmxhZ3MgJiBBQ1BJX0dQRV9YUlVQVF9UWVBFX01BU0spID09CisJICAgIEFDUElfR1BFX0xFVkVMX1RSSUdHRVJFRCkgeworCQkvKgorCQkgKiBHUEUgaXMgbGV2ZWwtdHJpZ2dlcmVkLCB3ZSBjbGVhciB0aGUgR1BFIHN0YXR1cyBiaXQgYWZ0ZXIgaGFuZGxpbmcKKwkJICogdGhlIGV2ZW50LgorCQkgKi8KKwkJc3RhdHVzID0gYWNwaV9od19jbGVhcl9ncGUoZ3BlX2V2ZW50X2luZm8pOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCXJldHVybl9WT0lEOworCQl9CisJfQorCisJLyogRW5hYmxlIHRoaXMgR1BFICovCisJKHZvaWQpYWNwaV9od193cml0ZV9ncGVfZW5hYmxlX3JlZyhncGVfZXZlbnRfaW5mbyk7CisJcmV0dXJuX1ZPSUQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfZXZfZ3BlX2Rpc3BhdGNoCisgKgorICogUEFSQU1FVEVSUzogIGdwZV9ldmVudF9pbmZvICAtIEluZm8gZm9yIHRoaXMgR1BFCisgKiAgICAgICAgICAgICAgZ3BlX251bWJlciAgICAgIC0gTnVtYmVyIHJlbGF0aXZlIHRvIHRoZSBwYXJlbnQgR1BFIGJsb2NrCisgKgorICogUkVUVVJOOiAgICAgIElOVEVSUlVQVF9IQU5ETEVEIG9yIElOVEVSUlVQVF9OT1RfSEFORExFRAorICoKKyAqIERFU0NSSVBUSU9OOiBEaXNwYXRjaCBhIEdlbmVyYWwgUHVycG9zZSBFdmVudCB0byBlaXRoZXIgYSBmdW5jdGlvbiAoZS5nLiBFQykKKyAqICAgICAgICAgICAgICBvciBtZXRob2QgKGUuZy4gX0x4eC9fRXh4KSBoYW5kbGVyLgorICoKKyAqICAgICAgICAgICAgICBUaGlzIGZ1bmN0aW9uIGV4ZWN1dGVzIGF0IGludGVycnVwdCBsZXZlbC4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit1MzIKK2FjcGlfZXZfZ3BlX2Rpc3BhdGNoKHN0cnVjdCBhY3BpX2dwZV9ldmVudF9pbmZvICpncGVfZXZlbnRfaW5mbywgdTMyIGdwZV9udW1iZXIpCit7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCisJQUNQSV9GVU5DVElPTl9UUkFDRShldl9ncGVfZGlzcGF0Y2gpOworCisJYWNwaV9vc19ncGVfY291bnQoZ3BlX251bWJlcik7CisKKwkvKgorCSAqIElmIGVkZ2UtdHJpZ2dlcmVkLCBjbGVhciB0aGUgR1BFIHN0YXR1cyBiaXQgbm93LiBOb3RlIHRoYXQKKwkgKiBsZXZlbC10cmlnZ2VyZWQgZXZlbnRzIGFyZSBjbGVhcmVkIGFmdGVyIHRoZSBHUEUgaXMgc2VydmljZWQuCisJICovCisJaWYgKChncGVfZXZlbnRfaW5mby0+ZmxhZ3MgJiBBQ1BJX0dQRV9YUlVQVF9UWVBFX01BU0spID09CisJICAgIEFDUElfR1BFX0VER0VfVFJJR0dFUkVEKSB7CisJCXN0YXR1cyA9IGFjcGlfaHdfY2xlYXJfZ3BlKGdwZV9ldmVudF9pbmZvKTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQlBQ1BJX0VYQ0VQVElPTigoQUVfSU5GTywgc3RhdHVzLAorCQkJCQkiVW5hYmxlIHRvIGNsZWFyIEdQRVslMlhdIiwKKwkJCQkJZ3BlX251bWJlcikpOworCQkJcmV0dXJuX1VJTlQzMihBQ1BJX0lOVEVSUlVQVF9OT1RfSEFORExFRCk7CisJCX0KKwl9CisKKwkvKgorCSAqIERpc3BhdGNoIHRoZSBHUEUgdG8gZWl0aGVyIGFuIGluc3RhbGxlZCBoYW5kbGVyLCBvciB0aGUgY29udHJvbCBtZXRob2QKKwkgKiBhc3NvY2lhdGVkIHdpdGggdGhpcyBHUEUgKF9MeHggb3IgX0V4eCkuIElmIGEgaGFuZGxlciBleGlzdHMsIHdlIGludm9rZQorCSAqIGl0IGFuZCBkbyBub3QgYXR0ZW1wdCB0byBydW4gdGhlIG1ldGhvZC4gSWYgdGhlcmUgaXMgbmVpdGhlciBhIGhhbmRsZXIKKwkgKiBub3IgYSBtZXRob2QsIHdlIGRpc2FibGUgdGhpcyBHUEUgdG8gcHJldmVudCBmdXJ0aGVyIHN1Y2ggcG9pbnRsZXNzCisJICogZXZlbnRzIGZyb20gZmlyaW5nLgorCSAqLworCXN3aXRjaCAoZ3BlX2V2ZW50X2luZm8tPmZsYWdzICYgQUNQSV9HUEVfRElTUEFUQ0hfTUFTSykgeworCWNhc2UgQUNQSV9HUEVfRElTUEFUQ0hfSEFORExFUjoKKworCQkvKgorCQkgKiBJbnZva2UgdGhlIGluc3RhbGxlZCBoYW5kbGVyIChhdCBpbnRlcnJ1cHQgbGV2ZWwpCisJCSAqIElnbm9yZSByZXR1cm4gc3RhdHVzIGZvciBub3cuCisJCSAqIFRCRDogbGVhdmUgR1BFIGRpc2FibGVkIG9uIGVycm9yPworCQkgKi8KKwkJKHZvaWQpZ3BlX2V2ZW50X2luZm8tPmRpc3BhdGNoLmhhbmRsZXItPmFkZHJlc3MoZ3BlX2V2ZW50X2luZm8tPgorCQkJCQkJCQlkaXNwYXRjaC4KKwkJCQkJCQkJaGFuZGxlci0+CisJCQkJCQkJCWNvbnRleHQpOworCisJCS8qIEl0IGlzIG5vdyBzYWZlIHRvIGNsZWFyIGxldmVsLXRyaWdnZXJlZCBldmVudHMuICovCisKKwkJaWYgKChncGVfZXZlbnRfaW5mby0+ZmxhZ3MgJiBBQ1BJX0dQRV9YUlVQVF9UWVBFX01BU0spID09CisJCSAgICBBQ1BJX0dQRV9MRVZFTF9UUklHR0VSRUQpIHsKKwkJCXN0YXR1cyA9IGFjcGlfaHdfY2xlYXJfZ3BlKGdwZV9ldmVudF9pbmZvKTsKKwkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJCUFDUElfRVhDRVBUSU9OKChBRV9JTkZPLCBzdGF0dXMsCisJCQkJCQkiVW5hYmxlIHRvIGNsZWFyIEdQRVslMlhdIiwKKwkJCQkJCWdwZV9udW1iZXIpKTsKKwkJCQlyZXR1cm5fVUlOVDMyKEFDUElfSU5URVJSVVBUX05PVF9IQU5ETEVEKTsKKwkJCX0KKwkJfQorCQlicmVhazsKKworCWNhc2UgQUNQSV9HUEVfRElTUEFUQ0hfTUVUSE9EOgorCisJCS8qCisJCSAqIERpc2FibGUgdGhlIEdQRSwgc28gaXQgZG9lc24ndCBrZWVwIGZpcmluZyBiZWZvcmUgdGhlIG1ldGhvZCBoYXMgYQorCQkgKiBjaGFuY2UgdG8gcnVuIChpdCBydW5zIGFzeW5jaHJvbm91c2x5IHdpdGggaW50ZXJydXB0cyBlbmFibGVkKS4KKwkJICovCisJCXN0YXR1cyA9IGFjcGlfZXZfZGlzYWJsZV9ncGUoZ3BlX2V2ZW50X2luZm8pOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCUFDUElfRVhDRVBUSU9OKChBRV9JTkZPLCBzdGF0dXMsCisJCQkJCSJVbmFibGUgdG8gZGlzYWJsZSBHUEVbJTJYXSIsCisJCQkJCWdwZV9udW1iZXIpKTsKKwkJCXJldHVybl9VSU5UMzIoQUNQSV9JTlRFUlJVUFRfTk9UX0hBTkRMRUQpOworCQl9CisKKwkJLyoKKwkJICogRXhlY3V0ZSB0aGUgbWV0aG9kIGFzc29jaWF0ZWQgd2l0aCB0aGUgR1BFCisJCSAqIE5PVEU6IExldmVsLXRyaWdnZXJlZCBHUEVzIGFyZSBjbGVhcmVkIGFmdGVyIHRoZSBtZXRob2QgY29tcGxldGVzLgorCQkgKi8KKwkJc3RhdHVzID0gYWNwaV9vc19leGVjdXRlKE9TTF9HUEVfSEFORExFUiwKKwkJCQkJIGFjcGlfZXZfYXN5bmNoX2V4ZWN1dGVfZ3BlX21ldGhvZCwKKwkJCQkJIGdwZV9ldmVudF9pbmZvKTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQlBQ1BJX0VYQ0VQVElPTigoQUVfSU5GTywgc3RhdHVzLAorCQkJCQkiVW5hYmxlIHRvIHF1ZXVlIGhhbmRsZXIgZm9yIEdQRVslMlhdIC0gZXZlbnQgZGlzYWJsZWQiLAorCQkJCQlncGVfbnVtYmVyKSk7CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCisJCS8qIE5vIGhhbmRsZXIgb3IgbWV0aG9kIHRvIHJ1biEgKi8KKworCQlBQ1BJX0VSUk9SKChBRV9JTkZPLAorCQkJICAgICJObyBoYW5kbGVyIG9yIG1ldGhvZCBmb3IgR1BFWyUyWF0sIGRpc2FibGluZyBldmVudCIsCisJCQkgICAgZ3BlX251bWJlcikpOworCisJCS8qCisJCSAqIERpc2FibGUgdGhlIEdQRS4gVGhlIEdQRSB3aWxsIHJlbWFpbiBkaXNhYmxlZCB1bnRpbCB0aGUgQUNQSUNBCisJCSAqIENvcmUgU3Vic3lzdGVtIGlzIHJlc3RhcnRlZCwgb3IgYSBoYW5kbGVyIGlzIGluc3RhbGxlZC4KKwkJICovCisJCXN0YXR1cyA9IGFjcGlfZXZfZGlzYWJsZV9ncGUoZ3BlX2V2ZW50X2luZm8pOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCUFDUElfRVhDRVBUSU9OKChBRV9JTkZPLCBzdGF0dXMsCisJCQkJCSJVbmFibGUgdG8gZGlzYWJsZSBHUEVbJTJYXSIsCisJCQkJCWdwZV9udW1iZXIpKTsKKwkJCXJldHVybl9VSU5UMzIoQUNQSV9JTlRFUlJVUFRfTk9UX0hBTkRMRUQpOworCQl9CisJCWJyZWFrOworCX0KKworCXJldHVybl9VSU5UMzIoQUNQSV9JTlRFUlJVUFRfSEFORExFRCk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2V2Z3BlYmxrLmMgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2V2Z3BlYmxrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDg0Y2MwNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXZncGVibGsuYwpAQCAtMCwwICsxLDEyMjcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBNb2R1bGUgTmFtZTogZXZncGVibGsgLSBHUEUgYmxvY2sgY3JlYXRpb24gYW5kIGluaXRpYWxpemF0aW9uLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDgsIEludGVsIENvcnAuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCisgKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSBhdCBtaW5pbXVtIGEgZGlzY2xhaW1lcgorICogICAgc3Vic3RhbnRpYWxseSBzaW1pbGFyIHRvIHRoZSAiTk8gV0FSUkFOVFkiIGRpc2NsYWltZXIgYmVsb3cKKyAqICAgICgiRGlzY2xhaW1lciIpIGFuZCBhbnkgcmVkaXN0cmlidXRpb24gbXVzdCBiZSBjb25kaXRpb25lZCB1cG9uCisgKiAgICBpbmNsdWRpbmcgYSBzdWJzdGFudGlhbGx5IHNpbWlsYXIgRGlzY2xhaW1lciByZXF1aXJlbWVudCBmb3IgZnVydGhlcgorICogICAgYmluYXJ5IHJlZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzCisgKiAgICBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIE5PIFdBUlJBTlRZCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORworICogSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCisgKi8KKworI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgorI2luY2x1ZGUgImFjY29tbW9uLmgiCisjaW5jbHVkZSAiYWNldmVudHMuaCIKKyNpbmNsdWRlICJhY25hbWVzcC5oIgorCisjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9FVkVOVFMKK0FDUElfTU9EVUxFX05BTUUoImV2Z3BlYmxrIikKKworLyogTG9jYWwgcHJvdG90eXBlcyAqLworc3RhdGljIGFjcGlfc3RhdHVzCithY3BpX2V2X3NhdmVfbWV0aG9kX2luZm8oYWNwaV9oYW5kbGUgb2JqX2hhbmRsZSwKKwkJCSB1MzIgbGV2ZWwsIHZvaWQgKm9ial9kZXNjLCB2b2lkICoqcmV0dXJuX3ZhbHVlKTsKKworc3RhdGljIGFjcGlfc3RhdHVzCithY3BpX2V2X21hdGNoX3Byd19hbmRfZ3BlKGFjcGlfaGFuZGxlIG9ial9oYW5kbGUsCisJCQkgIHUzMiBsZXZlbCwgdm9pZCAqaW5mbywgdm9pZCAqKnJldHVybl92YWx1ZSk7CisKK3N0YXRpYyBzdHJ1Y3QgYWNwaV9ncGVfeHJ1cHRfaW5mbyAqYWNwaV9ldl9nZXRfZ3BlX3hydXB0X2Jsb2NrKHUzMgorCQkJCQkJCSAgICAgICBpbnRlcnJ1cHRfbnVtYmVyKTsKKworc3RhdGljIGFjcGlfc3RhdHVzCithY3BpX2V2X2RlbGV0ZV9ncGVfeHJ1cHQoc3RydWN0IGFjcGlfZ3BlX3hydXB0X2luZm8gKmdwZV94cnVwdCk7CisKK3N0YXRpYyBhY3BpX3N0YXR1cworYWNwaV9ldl9pbnN0YWxsX2dwZV9ibG9jayhzdHJ1Y3QgYWNwaV9ncGVfYmxvY2tfaW5mbyAqZ3BlX2Jsb2NrLAorCQkJICB1MzIgaW50ZXJydXB0X251bWJlcik7CisKK3N0YXRpYyBhY3BpX3N0YXR1cworYWNwaV9ldl9jcmVhdGVfZ3BlX2luZm9fYmxvY2tzKHN0cnVjdCBhY3BpX2dwZV9ibG9ja19pbmZvICpncGVfYmxvY2spOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX2V2X3ZhbGlkX2dwZV9ldmVudAorICoKKyAqIFBBUkFNRVRFUlM6ICBncGVfZXZlbnRfaW5mbyAgICAgICAgICAgICAgLSBJbmZvIGZvciB0aGlzIEdQRQorICoKKyAqIFJFVFVSTjogICAgICBUUlVFIGlmIHRoZSBncGVfZXZlbnQgaXMgdmFsaWQKKyAqCisgKiBERVNDUklQVElPTjogVmFsaWRhdGUgYSBHUEUgZXZlbnQuIERPIE5PVCBDQUxMIEZST00gSU5URVJSVVBUIExFVkVMLgorICogICAgICAgICAgICAgIFNob3VsZCBiZSBjYWxsZWQgb25seSB3aGVuIHRoZSBHUEUgbGlzdHMgYXJlIHNlbWFwaG9yZSBsb2NrZWQKKyAqICAgICAgICAgICAgICBhbmQgbm90IHN1YmplY3QgdG8gY2hhbmdlLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3U4IGFjcGlfZXZfdmFsaWRfZ3BlX2V2ZW50KHN0cnVjdCBhY3BpX2dwZV9ldmVudF9pbmZvICpncGVfZXZlbnRfaW5mbykKK3sKKwlzdHJ1Y3QgYWNwaV9ncGVfeHJ1cHRfaW5mbyAqZ3BlX3hydXB0X2Jsb2NrOworCXN0cnVjdCBhY3BpX2dwZV9ibG9ja19pbmZvICpncGVfYmxvY2s7CisKKwlBQ1BJX0ZVTkNUSU9OX0VOVFJZKCk7CisKKwkvKiBObyBuZWVkIGZvciBzcGluIGxvY2sgc2luY2Ugd2UgYXJlIG5vdCBjaGFuZ2luZyBhbnkgbGlzdCBlbGVtZW50cyAqLworCisJLyogV2FsayB0aGUgR1BFIGludGVycnVwdCBsZXZlbHMgKi8KKworCWdwZV94cnVwdF9ibG9jayA9IGFjcGlfZ2JsX2dwZV94cnVwdF9saXN0X2hlYWQ7CisJd2hpbGUgKGdwZV94cnVwdF9ibG9jaykgeworCQlncGVfYmxvY2sgPSBncGVfeHJ1cHRfYmxvY2stPmdwZV9ibG9ja19saXN0X2hlYWQ7CisKKwkJLyogV2FsayB0aGUgR1BFIGJsb2NrcyBvbiB0aGlzIGludGVycnVwdCBsZXZlbCAqLworCisJCXdoaWxlIChncGVfYmxvY2spIHsKKwkJCWlmICgoJmdwZV9ibG9jay0+ZXZlbnRfaW5mb1swXSA8PSBncGVfZXZlbnRfaW5mbykgJiYKKwkJCSAgICAoJmdwZV9ibG9jay0+CisJCQkgICAgIGV2ZW50X2luZm9bKChhY3BpX3NpemUpIGdwZV9ibG9jay0+CisJCQkJCSByZWdpc3Rlcl9jb3VudCkgKiA4XSA+CisJCQkgICAgIGdwZV9ldmVudF9pbmZvKSkgeworCQkJCXJldHVybiAoVFJVRSk7CisJCQl9CisKKwkJCWdwZV9ibG9jayA9IGdwZV9ibG9jay0+bmV4dDsKKwkJfQorCisJCWdwZV94cnVwdF9ibG9jayA9IGdwZV94cnVwdF9ibG9jay0+bmV4dDsKKwl9CisKKwlyZXR1cm4gKEZBTFNFKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9ldl93YWxrX2dwZV9saXN0CisgKgorICogUEFSQU1FVEVSUzogIGdwZV93YWxrX2NhbGxiYWNrICAgLSBSb3V0aW5lIGNhbGxlZCBmb3IgZWFjaCBHUEUgYmxvY2sKKyAqICAgICAgICAgICAgICBDb250ZXh0ICAgICAgICAgICAgIC0gVmFsdWUgcGFzc2VkIHRvIGNhbGxiYWNrCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBXYWxrIHRoZSBHUEUgbGlzdHMuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworYWNwaV9zdGF0dXMKK2FjcGlfZXZfd2Fsa19ncGVfbGlzdChhY3BpX2dwZV9jYWxsYmFjayBncGVfd2Fsa19jYWxsYmFjaywgdm9pZCAqY29udGV4dCkKK3sKKwlzdHJ1Y3QgYWNwaV9ncGVfYmxvY2tfaW5mbyAqZ3BlX2Jsb2NrOworCXN0cnVjdCBhY3BpX2dwZV94cnVwdF9pbmZvICpncGVfeHJ1cHRfaW5mbzsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKKwlhY3BpX2NwdV9mbGFncyBmbGFnczsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0UoZXZfd2Fsa19ncGVfbGlzdCk7CisKKwlmbGFncyA9IGFjcGlfb3NfYWNxdWlyZV9sb2NrKGFjcGlfZ2JsX2dwZV9sb2NrKTsKKworCS8qIFdhbGsgdGhlIGludGVycnVwdCBsZXZlbCBkZXNjcmlwdG9yIGxpc3QgKi8KKworCWdwZV94cnVwdF9pbmZvID0gYWNwaV9nYmxfZ3BlX3hydXB0X2xpc3RfaGVhZDsKKwl3aGlsZSAoZ3BlX3hydXB0X2luZm8pIHsKKworCQkvKiBXYWxrIGFsbCBHcGUgQmxvY2tzIGF0dGFjaGVkIHRvIHRoaXMgaW50ZXJydXB0IGxldmVsICovCisKKwkJZ3BlX2Jsb2NrID0gZ3BlX3hydXB0X2luZm8tPmdwZV9ibG9ja19saXN0X2hlYWQ7CisJCXdoaWxlIChncGVfYmxvY2spIHsKKworCQkJLyogT25lIGNhbGxiYWNrIHBlciBHUEUgYmxvY2sgKi8KKworCQkJc3RhdHVzID0KKwkJCSAgICBncGVfd2Fsa19jYWxsYmFjayhncGVfeHJ1cHRfaW5mbywgZ3BlX2Jsb2NrLAorCQkJCQkgICAgICBjb250ZXh0KTsKKwkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJCWlmIChzdGF0dXMgPT0gQUVfQ1RSTF9FTkQpIHsJLyogQ2FsbGJhY2sgYWJvcnQgKi8KKwkJCQkJc3RhdHVzID0gQUVfT0s7CisJCQkJfQorCQkJCWdvdG8gdW5sb2NrX2FuZF9leGl0OworCQkJfQorCisJCQlncGVfYmxvY2sgPSBncGVfYmxvY2stPm5leHQ7CisJCX0KKworCQlncGVfeHJ1cHRfaW5mbyA9IGdwZV94cnVwdF9pbmZvLT5uZXh0OworCX0KKworICAgICAgdW5sb2NrX2FuZF9leGl0OgorCWFjcGlfb3NfcmVsZWFzZV9sb2NrKGFjcGlfZ2JsX2dwZV9sb2NrLCBmbGFncyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfZXZfZGVsZXRlX2dwZV9oYW5kbGVycworICoKKyAqIFBBUkFNRVRFUlM6ICBncGVfeHJ1cHRfaW5mbyAgICAgIC0gR1BFIEludGVycnVwdCBpbmZvCisgKiAgICAgICAgICAgICAgZ3BlX2Jsb2NrICAgICAgICAgICAtIEdwZSBCbG9jayBpbmZvCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBEZWxldGUgYWxsIEhhbmRsZXIgb2JqZWN0cyBmb3VuZCBpbiB0aGUgR1BFIGRhdGEgc3RydWN0cy4KKyAqICAgICAgICAgICAgICBVc2VkIG9ubHkgcHJpb3IgdG8gdGVybWluYXRpb24uCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworYWNwaV9zdGF0dXMKK2FjcGlfZXZfZGVsZXRlX2dwZV9oYW5kbGVycyhzdHJ1Y3QgYWNwaV9ncGVfeHJ1cHRfaW5mbyAqZ3BlX3hydXB0X2luZm8sCisJCQkgICAgc3RydWN0IGFjcGlfZ3BlX2Jsb2NrX2luZm8gKmdwZV9ibG9jaywKKwkJCSAgICB2b2lkICpjb250ZXh0KQoreworCXN0cnVjdCBhY3BpX2dwZV9ldmVudF9pbmZvICpncGVfZXZlbnRfaW5mbzsKKwl1MzIgaTsKKwl1MzIgajsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0UoZXZfZGVsZXRlX2dwZV9oYW5kbGVycyk7CisKKwkvKiBFeGFtaW5lIGVhY2ggR1BFIFJlZ2lzdGVyIHdpdGhpbiB0aGUgYmxvY2sgKi8KKworCWZvciAoaSA9IDA7IGkgPCBncGVfYmxvY2stPnJlZ2lzdGVyX2NvdW50OyBpKyspIHsKKworCQkvKiBOb3cgbG9vayBhdCB0aGUgaW5kaXZpZHVhbCBHUEVzIGluIHRoaXMgYnl0ZSByZWdpc3RlciAqLworCisJCWZvciAoaiA9IDA7IGogPCBBQ1BJX0dQRV9SRUdJU1RFUl9XSURUSDsgaisrKSB7CisJCQlncGVfZXZlbnRfaW5mbyA9CisJCQkgICAgJmdwZV9ibG9jay0+CisJCQkgICAgZXZlbnRfaW5mb1soKGFjcGlfc2l6ZSkgaSAqCisJCQkJCUFDUElfR1BFX1JFR0lTVEVSX1dJRFRIKSArIGpdOworCisJCQlpZiAoKGdwZV9ldmVudF9pbmZvLT5mbGFncyAmIEFDUElfR1BFX0RJU1BBVENIX01BU0spID09CisJCQkgICAgQUNQSV9HUEVfRElTUEFUQ0hfSEFORExFUikgeworCQkJCUFDUElfRlJFRShncGVfZXZlbnRfaW5mby0+ZGlzcGF0Y2guaGFuZGxlcik7CisJCQkJZ3BlX2V2ZW50X2luZm8tPmRpc3BhdGNoLmhhbmRsZXIgPSBOVUxMOworCQkJCWdwZV9ldmVudF9pbmZvLT5mbGFncyAmPQorCQkJCSAgICB+QUNQSV9HUEVfRElTUEFUQ0hfTUFTSzsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfZXZfc2F2ZV9tZXRob2RfaW5mbworICoKKyAqIFBBUkFNRVRFUlM6ICBDYWxsYmFjayBmcm9tIHdhbGtfbmFtZXNwYWNlCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBDYWxsZWQgZnJvbSBhY3BpX3dhbGtfbmFtZXNwYWNlLiBFeHBlY3RzIGVhY2ggb2JqZWN0IHRvIGJlIGEKKyAqICAgICAgICAgICAgICBjb250cm9sIG1ldGhvZCB1bmRlciB0aGUgX0dQRSBwb3J0aW9uIG9mIHRoZSBuYW1lc3BhY2UuCisgKiAgICAgICAgICAgICAgRXh0cmFjdCB0aGUgbmFtZSBhbmQgR1BFIHR5cGUgZnJvbSB0aGUgb2JqZWN0LCBzYXZpbmcgdGhpcworICogICAgICAgICAgICAgIGluZm9ybWF0aW9uIGZvciBxdWljayBsb29rdXAgZHVyaW5nIEdQRSBkaXNwYXRjaAorICoKKyAqICAgICAgICAgICAgICBUaGUgbmFtZSBvZiBlYWNoIEdQRSBjb250cm9sIG1ldGhvZCBpcyBvZiB0aGUgZm9ybToKKyAqICAgICAgICAgICAgICAiX0x4eCIgb3IgIl9FeHgiCisgKiAgICAgICAgICAgICAgV2hlcmU6CisgKiAgICAgICAgICAgICAgICAgIEwgICAgICAtIG1lYW5zIHRoYXQgdGhlIEdQRSBpcyBsZXZlbCB0cmlnZ2VyZWQKKyAqICAgICAgICAgICAgICAgICAgRSAgICAgIC0gbWVhbnMgdGhhdCB0aGUgR1BFIGlzIGVkZ2UgdHJpZ2dlcmVkCisgKiAgICAgICAgICAgICAgICAgIHh4ICAgICAtIGlzIHRoZSBHUEUgbnVtYmVyIFtpbiBIRVhdCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGFjcGlfc3RhdHVzCithY3BpX2V2X3NhdmVfbWV0aG9kX2luZm8oYWNwaV9oYW5kbGUgb2JqX2hhbmRsZSwKKwkJCSB1MzIgbGV2ZWwsIHZvaWQgKm9ial9kZXNjLCB2b2lkICoqcmV0dXJuX3ZhbHVlKQoreworCXN0cnVjdCBhY3BpX2dwZV9ibG9ja19pbmZvICpncGVfYmxvY2sgPSAodm9pZCAqKW9ial9kZXNjOworCXN0cnVjdCBhY3BpX2dwZV9ldmVudF9pbmZvICpncGVfZXZlbnRfaW5mbzsKKwl1MzIgZ3BlX251bWJlcjsKKwljaGFyIG5hbWVbQUNQSV9OQU1FX1NJWkUgKyAxXTsKKwl1OCB0eXBlOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0UoZXZfc2F2ZV9tZXRob2RfaW5mbyk7CisKKwkvKgorCSAqIF9MeHggYW5kIF9FeHggR1BFIG1ldGhvZCBzdXBwb3J0CisJICoKKwkgKiAxKSBFeHRyYWN0IHRoZSBuYW1lIGZyb20gdGhlIG9iamVjdCBhbmQgY29udmVydCB0byBhIHN0cmluZworCSAqLworCUFDUElfTU9WRV8zMl9UT18zMihuYW1lLAorCQkJICAgJigoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKilvYmpfaGFuZGxlKS0+bmFtZS4KKwkJCSAgIGludGVnZXIpOworCW5hbWVbQUNQSV9OQU1FX1NJWkVdID0gMDsKKworCS8qCisJICogMikgRWRnZS9MZXZlbCBkZXRlcm1pbmF0aW9uIGlzIGJhc2VkIG9uIHRoZSAybmQgY2hhcmFjdGVyCisJICogICAgb2YgdGhlIG1ldGhvZCBuYW1lCisJICoKKwkgKiBOT1RFOiBEZWZhdWx0IEdQRSB0eXBlIGlzIFJVTlRJTUUuIE1heSBiZSBjaGFuZ2VkIGxhdGVyIHRvIFdBS0UKKwkgKiBpZiBhIF9QUlcgb2JqZWN0IGlzIGZvdW5kIHRoYXQgcG9pbnRzIHRvIHRoaXMgR1BFLgorCSAqLworCXN3aXRjaCAobmFtZVsxXSkgeworCWNhc2UgJ0wnOgorCQl0eXBlID0gQUNQSV9HUEVfTEVWRUxfVFJJR0dFUkVEOworCQlicmVhazsKKworCWNhc2UgJ0UnOgorCQl0eXBlID0gQUNQSV9HUEVfRURHRV9UUklHR0VSRUQ7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJLyogVW5rbm93biBtZXRob2QgdHlwZSwganVzdCBpZ25vcmUgaXQhICovCisKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9MT0FELAorCQkJCSAgIklnbm9yaW5nIHVua25vd24gR1BFIG1ldGhvZCB0eXBlOiAlcyAobmFtZSBub3Qgb2YgZm9ybSBfTHh4IG9yIF9FeHgpIiwKKwkJCQkgIG5hbWUpKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKKwl9CisKKwkvKiBDb252ZXJ0IHRoZSBsYXN0IHR3byBjaGFyYWN0ZXJzIG9mIHRoZSBuYW1lIHRvIHRoZSBHUEUgTnVtYmVyICovCisKKwlncGVfbnVtYmVyID0gQUNQSV9TVFJUT1VMKCZuYW1lWzJdLCBOVUxMLCAxNik7CisJaWYgKGdwZV9udW1iZXIgPT0gQUNQSV9VSU5UMzJfTUFYKSB7CisKKwkJLyogQ29udmVyc2lvbiBmYWlsZWQ7IGludmFsaWQgbWV0aG9kLCBqdXN0IGlnbm9yZSBpdCAqLworCisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfTE9BRCwKKwkJCQkgICJDb3VsZCBub3QgZXh0cmFjdCBHUEUgbnVtYmVyIGZyb20gbmFtZTogJXMgKG5hbWUgaXMgbm90IG9mIGZvcm0gX0x4eCBvciBfRXh4KSIsCisJCQkJICBuYW1lKSk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CisJfQorCisJLyogRW5zdXJlIHRoYXQgd2UgaGF2ZSBhIHZhbGlkIEdQRSBudW1iZXIgZm9yIHRoaXMgR1BFIGJsb2NrICovCisKKwlpZiAoKGdwZV9udW1iZXIgPCBncGVfYmxvY2stPmJsb2NrX2Jhc2VfbnVtYmVyKSB8fAorCSAgICAoZ3BlX251bWJlciA+PQorCSAgICAgKGdwZV9ibG9jay0+YmxvY2tfYmFzZV9udW1iZXIgKworCSAgICAgIChncGVfYmxvY2stPnJlZ2lzdGVyX2NvdW50ICogOCkpKSkgeworCQkvKgorCQkgKiBOb3QgdmFsaWQgZm9yIHRoaXMgR1BFIGJsb2NrLCBqdXN0IGlnbm9yZSBpdC4gSG93ZXZlciwgaXQgbWF5IGJlCisJCSAqIHZhbGlkIGZvciBhIGRpZmZlcmVudCBHUEUgYmxvY2ssIHNpbmNlIEdQRTAgYW5kIEdQRTEgbWV0aG9kcyBib3RoCisJCSAqIGFwcGVhciB1bmRlciBcX0dQRS4KKwkJICovCisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CisJfQorCisJLyoKKwkgKiBOb3cgd2UgY2FuIGFkZCB0aGlzIGluZm9ybWF0aW9uIHRvIHRoZSBncGVfZXZlbnRfaW5mbyBibG9jayBmb3IgdXNlCisJICogZHVyaW5nIGRpc3BhdGNoIG9mIHRoaXMgR1BFLiBEZWZhdWx0IHR5cGUgaXMgUlVOVElNRSwgYWx0aG91Z2ggdGhpcyBtYXkKKwkgKiBjaGFuZ2Ugd2hlbiB0aGUgX1BSVyBtZXRob2RzIGFyZSBleGVjdXRlZCBsYXRlci4KKwkgKi8KKwlncGVfZXZlbnRfaW5mbyA9CisJICAgICZncGVfYmxvY2stPmV2ZW50X2luZm9bZ3BlX251bWJlciAtIGdwZV9ibG9jay0+YmxvY2tfYmFzZV9udW1iZXJdOworCisJZ3BlX2V2ZW50X2luZm8tPmZsYWdzID0gKHU4KQorCSAgICAodHlwZSB8IEFDUElfR1BFX0RJU1BBVENIX01FVEhPRCB8IEFDUElfR1BFX1RZUEVfUlVOVElNRSk7CisKKwlncGVfZXZlbnRfaW5mby0+ZGlzcGF0Y2gubWV0aG9kX25vZGUgPQorCSAgICAoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKilvYmpfaGFuZGxlOworCisJLyogVXBkYXRlIGVuYWJsZSBtYXNrLCBidXQgZG9uJ3QgZW5hYmxlIHRoZSBIVyBHUEUgYXMgb2YgeWV0ICovCisKKwlzdGF0dXMgPSBhY3BpX2V2X2VuYWJsZV9ncGUoZ3BlX2V2ZW50X2luZm8sIEZBTFNFKTsKKworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfTE9BRCwKKwkJCSAgIlJlZ2lzdGVyZWQgR1BFIG1ldGhvZCAlcyBhcyBHUEUgbnVtYmVyIDB4JS4yWFxuIiwKKwkJCSAgbmFtZSwgZ3BlX251bWJlcikpOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX2V2X21hdGNoX3Byd19hbmRfZ3BlCisgKgorICogUEFSQU1FVEVSUzogIENhbGxiYWNrIGZyb20gd2Fsa19uYW1lc3BhY2UKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzLiBOT1RFOiBXZSBpZ25vcmUgZXJyb3JzIHNvIHRoYXQgdGhlIF9QUlcgd2FsayBpcworICogICAgICAgICAgICAgIG5vdCBhYm9ydGVkIG9uIGEgc2luZ2xlIF9QUlcgZmFpbHVyZS4KKyAqCisgKiBERVNDUklQVElPTjogQ2FsbGVkIGZyb20gYWNwaV93YWxrX25hbWVzcGFjZS4gRXhwZWN0cyBlYWNoIG9iamVjdCB0byBiZSBhCisgKiAgICAgICAgICAgICAgRGV2aWNlLiBSdW4gdGhlIF9QUlcgbWV0aG9kLiBJZiBwcmVzZW50LCBleHRyYWN0IHRoZSBHUEUKKyAqICAgICAgICAgICAgICBudW1iZXIgYW5kIG1hcmsgdGhlIEdQRSBhcyBhIFdBS0UgR1BFLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBhY3BpX3N0YXR1cworYWNwaV9ldl9tYXRjaF9wcndfYW5kX2dwZShhY3BpX2hhbmRsZSBvYmpfaGFuZGxlLAorCQkJICB1MzIgbGV2ZWwsIHZvaWQgKmluZm8sIHZvaWQgKipyZXR1cm5fdmFsdWUpCit7CisJc3RydWN0IGFjcGlfZ3BlX3dhbGtfaW5mbyAqZ3BlX2luZm8gPSAodm9pZCAqKWluZm87CisJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKmdwZV9kZXZpY2U7CisJc3RydWN0IGFjcGlfZ3BlX2Jsb2NrX2luZm8gKmdwZV9ibG9jazsKKwlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqdGFyZ2V0X2dwZV9kZXZpY2U7CisJc3RydWN0IGFjcGlfZ3BlX2V2ZW50X2luZm8gKmdwZV9ldmVudF9pbmZvOworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnBrZ19kZXNjOworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjOworCXUzMiBncGVfbnVtYmVyOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0UoZXZfbWF0Y2hfcHJ3X2FuZF9ncGUpOworCisJLyogQ2hlY2sgZm9yIGEgX1BSVyBtZXRob2QgdW5kZXIgdGhpcyBkZXZpY2UgKi8KKworCXN0YXR1cyA9IGFjcGlfdXRfZXZhbHVhdGVfb2JqZWN0KG9ial9oYW5kbGUsIE1FVEhPRF9OQU1FX19QUlcsCisJCQkJCSBBQ1BJX0JUWVBFX1BBQ0tBR0UsICZwa2dfZGVzYyk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisKKwkJLyogSWdub3JlIGFsbCBlcnJvcnMgZnJvbSBfUFJXLCB3ZSBkb24ndCB3YW50IHRvIGFib3J0IHRoZSBzdWJzeXN0ZW0gKi8KKworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOworCX0KKworCS8qIFRoZSByZXR1cm5lZCBfUFJXIHBhY2thZ2UgbXVzdCBoYXZlIGF0IGxlYXN0IHR3byBlbGVtZW50cyAqLworCisJaWYgKHBrZ19kZXNjLT5wYWNrYWdlLmNvdW50IDwgMikgeworCQlnb3RvIGNsZWFudXA7CisJfQorCisJLyogRXh0cmFjdCBwb2ludGVycyBmcm9tIHRoZSBpbnB1dCBjb250ZXh0ICovCisKKwlncGVfZGV2aWNlID0gZ3BlX2luZm8tPmdwZV9kZXZpY2U7CisJZ3BlX2Jsb2NrID0gZ3BlX2luZm8tPmdwZV9ibG9jazsKKworCS8qCisJICogVGhlIF9QUlcgb2JqZWN0IG11c3QgcmV0dXJuIGEgcGFja2FnZSwgd2UgYXJlIG9ubHkgaW50ZXJlc3RlZCBpbiB0aGUKKwkgKiBmaXJzdCBlbGVtZW50CisJICovCisJb2JqX2Rlc2MgPSBwa2dfZGVzYy0+cGFja2FnZS5lbGVtZW50c1swXTsKKworCWlmIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRShvYmpfZGVzYykgPT0gQUNQSV9UWVBFX0lOVEVHRVIpIHsKKworCQkvKiBVc2UgRkFEVC1kZWZpbmVkIEdQRSBkZXZpY2UgKGZyb20gZGVmaW5pdGlvbiBvZiBfUFJXKSAqLworCisJCXRhcmdldF9ncGVfZGV2aWNlID0gYWNwaV9nYmxfZmFkdF9ncGVfZGV2aWNlOworCisJCS8qIEludGVnZXIgaXMgdGhlIEdQRSBudW1iZXIgaW4gdGhlIEZBRFQgZGVzY3JpYmVkIEdQRSBibG9ja3MgKi8KKworCQlncGVfbnVtYmVyID0gKHUzMikgb2JqX2Rlc2MtPmludGVnZXIudmFsdWU7CisJfSBlbHNlIGlmIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRShvYmpfZGVzYykgPT0gQUNQSV9UWVBFX1BBQ0tBR0UpIHsKKworCQkvKiBQYWNrYWdlIGNvbnRhaW5zIGEgR1BFIHJlZmVyZW5jZSBhbmQgR1BFIG51bWJlciB3aXRoaW4gYSBHUEUgYmxvY2sgKi8KKworCQlpZiAoKG9ial9kZXNjLT5wYWNrYWdlLmNvdW50IDwgMikgfHwKKwkJICAgIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRShvYmpfZGVzYy0+cGFja2FnZS5lbGVtZW50c1swXSkgIT0KKwkJICAgICBBQ1BJX1RZUEVfTE9DQUxfUkVGRVJFTkNFKQorCQkgICAgfHwgKEFDUElfR0VUX09CSkVDVF9UWVBFKG9ial9kZXNjLT5wYWNrYWdlLmVsZW1lbnRzWzFdKSAhPQorCQkJQUNQSV9UWVBFX0lOVEVHRVIpKSB7CisJCQlnb3RvIGNsZWFudXA7CisJCX0KKworCQkvKiBHZXQgR1BFIGJsb2NrIHJlZmVyZW5jZSBhbmQgZGVjb2RlICovCisKKwkJdGFyZ2V0X2dwZV9kZXZpY2UgPQorCQkgICAgb2JqX2Rlc2MtPnBhY2thZ2UuZWxlbWVudHNbMF0tPnJlZmVyZW5jZS5ub2RlOworCQlncGVfbnVtYmVyID0gKHUzMikgb2JqX2Rlc2MtPnBhY2thZ2UuZWxlbWVudHNbMV0tPmludGVnZXIudmFsdWU7CisJfSBlbHNlIHsKKwkJLyogVW5rbm93biB0eXBlLCBqdXN0IGlnbm9yZSBpdCAqLworCisJCWdvdG8gY2xlYW51cDsKKwl9CisKKwkvKgorCSAqIElzIHRoaXMgR1BFIHdpdGhpbiB0aGlzIGJsb2NrPworCSAqCisJICogVFJVRSBpZiBhbmQgb25seSBpZiB0aGVzZSBjb25kaXRpb25zIGFyZSB0cnVlOgorCSAqICAgICAxKSBUaGUgR1BFIGRldmljZXMgbWF0Y2guCisJICogICAgIDIpIFRoZSBHUEUgaW5kZXgobnVtYmVyKSBpcyB3aXRoaW4gdGhlIHJhbmdlIG9mIHRoZSBHcGUgQmxvY2sKKwkgKiAgICAgICAgICBhc3NvY2lhdGVkIHdpdGggdGhlIEdQRSBkZXZpY2UuCisJICovCisJaWYgKChncGVfZGV2aWNlID09IHRhcmdldF9ncGVfZGV2aWNlKSAmJgorCSAgICAoZ3BlX251bWJlciA+PSBncGVfYmxvY2stPmJsb2NrX2Jhc2VfbnVtYmVyKSAmJgorCSAgICAoZ3BlX251bWJlciA8CisJICAgICBncGVfYmxvY2stPmJsb2NrX2Jhc2VfbnVtYmVyICsgKGdwZV9ibG9jay0+cmVnaXN0ZXJfY291bnQgKiA4KSkpIHsKKwkJZ3BlX2V2ZW50X2luZm8gPQorCQkgICAgJmdwZV9ibG9jay0+ZXZlbnRfaW5mb1tncGVfbnVtYmVyIC0KKwkJCQkJICAgZ3BlX2Jsb2NrLT5ibG9ja19iYXNlX251bWJlcl07CisKKwkJLyogTWFyayBHUEUgZm9yIFdBS0UtT05MWSBidXQgV0FLRV9ESVNBQkxFRCAqLworCisJCWdwZV9ldmVudF9pbmZvLT5mbGFncyAmPQorCQkgICAgfihBQ1BJX0dQRV9XQUtFX0VOQUJMRUQgfCBBQ1BJX0dQRV9SVU5fRU5BQkxFRCk7CisKKwkJc3RhdHVzID0KKwkJICAgIGFjcGlfZXZfc2V0X2dwZV90eXBlKGdwZV9ldmVudF9pbmZvLCBBQ1BJX0dQRV9UWVBFX1dBS0UpOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCWdvdG8gY2xlYW51cDsKKwkJfQorCisJCXN0YXR1cyA9CisJCSAgICBhY3BpX2V2X3VwZGF0ZV9ncGVfZW5hYmxlX21hc2tzKGdwZV9ldmVudF9pbmZvLAorCQkJCQkJICAgIEFDUElfR1BFX0RJU0FCTEUpOworCX0KKworICAgICAgY2xlYW51cDoKKwlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UocGtnX2Rlc2MpOworCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfZXZfZ2V0X2dwZV94cnVwdF9ibG9jaworICoKKyAqIFBBUkFNRVRFUlM6ICBpbnRlcnJ1cHRfbnVtYmVyICAgICAtIEludGVycnVwdCBmb3IgYSBHUEUgYmxvY2sKKyAqCisgKiBSRVRVUk46ICAgICAgQSBHUEUgaW50ZXJydXB0IGJsb2NrCisgKgorICogREVTQ1JJUFRJT046IEdldCBvciBDcmVhdGUgYSBHUEUgaW50ZXJydXB0IGJsb2NrLiBUaGVyZSBpcyBvbmUgaW50ZXJydXB0CisgKiAgICAgICAgICAgICAgYmxvY2sgcGVyIHVuaXF1ZSBpbnRlcnJ1cHQgbGV2ZWwgdXNlZCBmb3IgR1BFcy4gU2hvdWxkIGJlCisgKiAgICAgICAgICAgICAgY2FsbGVkIG9ubHkgd2hlbiB0aGUgR1BFIGxpc3RzIGFyZSBzZW1hcGhvcmUgbG9ja2VkIGFuZCBub3QKKyAqICAgICAgICAgICAgICBzdWJqZWN0IHRvIGNoYW5nZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgc3RydWN0IGFjcGlfZ3BlX3hydXB0X2luZm8gKmFjcGlfZXZfZ2V0X2dwZV94cnVwdF9ibG9jayh1MzIKKwkJCQkJCQkgICAgICAgaW50ZXJydXB0X251bWJlcikKK3sKKwlzdHJ1Y3QgYWNwaV9ncGVfeHJ1cHRfaW5mbyAqbmV4dF9ncGVfeHJ1cHQ7CisJc3RydWN0IGFjcGlfZ3BlX3hydXB0X2luZm8gKmdwZV94cnVwdDsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJYWNwaV9jcHVfZmxhZ3MgZmxhZ3M7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGV2X2dldF9ncGVfeHJ1cHRfYmxvY2spOworCisJLyogTm8gbmVlZCBmb3IgbG9jayBzaW5jZSB3ZSBhcmUgbm90IGNoYW5naW5nIGFueSBsaXN0IGVsZW1lbnRzIGhlcmUgKi8KKworCW5leHRfZ3BlX3hydXB0ID0gYWNwaV9nYmxfZ3BlX3hydXB0X2xpc3RfaGVhZDsKKwl3aGlsZSAobmV4dF9ncGVfeHJ1cHQpIHsKKwkJaWYgKG5leHRfZ3BlX3hydXB0LT5pbnRlcnJ1cHRfbnVtYmVyID09IGludGVycnVwdF9udW1iZXIpIHsKKwkJCXJldHVybl9QVFIobmV4dF9ncGVfeHJ1cHQpOworCQl9CisKKwkJbmV4dF9ncGVfeHJ1cHQgPSBuZXh0X2dwZV94cnVwdC0+bmV4dDsKKwl9CisKKwkvKiBOb3QgZm91bmQsIG11c3QgYWxsb2NhdGUgYSBuZXcgeHJ1cHQgZGVzY3JpcHRvciAqLworCisJZ3BlX3hydXB0ID0gQUNQSV9BTExPQ0FURV9aRVJPRUQoc2l6ZW9mKHN0cnVjdCBhY3BpX2dwZV94cnVwdF9pbmZvKSk7CisJaWYgKCFncGVfeHJ1cHQpIHsKKwkJcmV0dXJuX1BUUihOVUxMKTsKKwl9CisKKwlncGVfeHJ1cHQtPmludGVycnVwdF9udW1iZXIgPSBpbnRlcnJ1cHRfbnVtYmVyOworCisJLyogSW5zdGFsbCBuZXcgaW50ZXJydXB0IGRlc2NyaXB0b3Igd2l0aCBzcGluIGxvY2sgKi8KKworCWZsYWdzID0gYWNwaV9vc19hY3F1aXJlX2xvY2soYWNwaV9nYmxfZ3BlX2xvY2spOworCWlmIChhY3BpX2dibF9ncGVfeHJ1cHRfbGlzdF9oZWFkKSB7CisJCW5leHRfZ3BlX3hydXB0ID0gYWNwaV9nYmxfZ3BlX3hydXB0X2xpc3RfaGVhZDsKKwkJd2hpbGUgKG5leHRfZ3BlX3hydXB0LT5uZXh0KSB7CisJCQluZXh0X2dwZV94cnVwdCA9IG5leHRfZ3BlX3hydXB0LT5uZXh0OworCQl9CisKKwkJbmV4dF9ncGVfeHJ1cHQtPm5leHQgPSBncGVfeHJ1cHQ7CisJCWdwZV94cnVwdC0+cHJldmlvdXMgPSBuZXh0X2dwZV94cnVwdDsKKwl9IGVsc2UgeworCQlhY3BpX2dibF9ncGVfeHJ1cHRfbGlzdF9oZWFkID0gZ3BlX3hydXB0OworCX0KKwlhY3BpX29zX3JlbGVhc2VfbG9jayhhY3BpX2dibF9ncGVfbG9jaywgZmxhZ3MpOworCisJLyogSW5zdGFsbCBuZXcgaW50ZXJydXB0IGhhbmRsZXIgaWYgbm90IFNDSV9JTlQgKi8KKworCWlmIChpbnRlcnJ1cHRfbnVtYmVyICE9IGFjcGlfZ2JsX0ZBRFQuc2NpX2ludGVycnVwdCkgeworCQlzdGF0dXMgPSBhY3BpX29zX2luc3RhbGxfaW50ZXJydXB0X2hhbmRsZXIoaW50ZXJydXB0X251bWJlciwKKwkJCQkJCQkgICBhY3BpX2V2X2dwZV94cnVwdF9oYW5kbGVyLAorCQkJCQkJCSAgIGdwZV94cnVwdCk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJQUNQSV9FUlJPUigoQUVfSU5GTywKKwkJCQkgICAgIkNvdWxkIG5vdCBpbnN0YWxsIEdQRSBpbnRlcnJ1cHQgaGFuZGxlciBhdCBsZXZlbCAweCVYIiwKKwkJCQkgICAgaW50ZXJydXB0X251bWJlcikpOworCQkJcmV0dXJuX1BUUihOVUxMKTsKKwkJfQorCX0KKworCXJldHVybl9QVFIoZ3BlX3hydXB0KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9ldl9kZWxldGVfZ3BlX3hydXB0CisgKgorICogUEFSQU1FVEVSUzogIGdwZV94cnVwdCAgICAgICAtIEEgR1BFIGludGVycnVwdCBpbmZvIGJsb2NrCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBSZW1vdmUgYW5kIGZyZWUgYSBncGVfeHJ1cHQgYmxvY2suIFJlbW92ZSBhbiBhc3NvY2lhdGVkCisgKiAgICAgICAgICAgICAgaW50ZXJydXB0IGhhbmRsZXIgaWYgbm90IHRoZSBTQ0kgaW50ZXJydXB0LgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBhY3BpX3N0YXR1cworYWNwaV9ldl9kZWxldGVfZ3BlX3hydXB0KHN0cnVjdCBhY3BpX2dwZV94cnVwdF9pbmZvICpncGVfeHJ1cHQpCit7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCWFjcGlfY3B1X2ZsYWdzIGZsYWdzOworCisJQUNQSV9GVU5DVElPTl9UUkFDRShldl9kZWxldGVfZ3BlX3hydXB0KTsKKworCS8qIFdlIG5ldmVyIHdhbnQgdG8gcmVtb3ZlIHRoZSBTQ0kgaW50ZXJydXB0IGhhbmRsZXIgKi8KKworCWlmIChncGVfeHJ1cHQtPmludGVycnVwdF9udW1iZXIgPT0gYWNwaV9nYmxfRkFEVC5zY2lfaW50ZXJydXB0KSB7CisJCWdwZV94cnVwdC0+Z3BlX2Jsb2NrX2xpc3RfaGVhZCA9IE5VTEw7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CisJfQorCisJLyogRGlzYWJsZSB0aGlzIGludGVycnVwdCAqLworCisJc3RhdHVzID0KKwkgICAgYWNwaV9vc19yZW1vdmVfaW50ZXJydXB0X2hhbmRsZXIoZ3BlX3hydXB0LT5pbnRlcnJ1cHRfbnVtYmVyLAorCQkJCQkgICAgIGFjcGlfZXZfZ3BlX3hydXB0X2hhbmRsZXIpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKKwl9CisKKwkvKiBVbmxpbmsgdGhlIGludGVycnVwdCBibG9jayB3aXRoIGxvY2sgKi8KKworCWZsYWdzID0gYWNwaV9vc19hY3F1aXJlX2xvY2soYWNwaV9nYmxfZ3BlX2xvY2spOworCWlmIChncGVfeHJ1cHQtPnByZXZpb3VzKSB7CisJCWdwZV94cnVwdC0+cHJldmlvdXMtPm5leHQgPSBncGVfeHJ1cHQtPm5leHQ7CisJfSBlbHNlIHsKKwkJLyogTm8gcHJldmlvdXMsIHVwZGF0ZSBsaXN0IGhlYWQgKi8KKworCQlhY3BpX2dibF9ncGVfeHJ1cHRfbGlzdF9oZWFkID0gZ3BlX3hydXB0LT5uZXh0OworCX0KKworCWlmIChncGVfeHJ1cHQtPm5leHQpIHsKKwkJZ3BlX3hydXB0LT5uZXh0LT5wcmV2aW91cyA9IGdwZV94cnVwdC0+cHJldmlvdXM7CisJfQorCWFjcGlfb3NfcmVsZWFzZV9sb2NrKGFjcGlfZ2JsX2dwZV9sb2NrLCBmbGFncyk7CisKKwkvKiBGcmVlIHRoZSBibG9jayAqLworCisJQUNQSV9GUkVFKGdwZV94cnVwdCk7CisJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9ldl9pbnN0YWxsX2dwZV9ibG9jaworICoKKyAqIFBBUkFNRVRFUlM6ICBncGVfYmxvY2sgICAgICAgICAgICAgICAtIE5ldyBHUEUgYmxvY2sKKyAqICAgICAgICAgICAgICBpbnRlcnJ1cHRfbnVtYmVyICAgICAgICAtIFhydXB0IHRvIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGlzCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUEUgYmxvY2sKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IEluc3RhbGwgbmV3IEdQRSBibG9jayB3aXRoIG11dGV4IHN1cHBvcnQKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgYWNwaV9zdGF0dXMKK2FjcGlfZXZfaW5zdGFsbF9ncGVfYmxvY2soc3RydWN0IGFjcGlfZ3BlX2Jsb2NrX2luZm8gKmdwZV9ibG9jaywKKwkJCSAgdTMyIGludGVycnVwdF9udW1iZXIpCit7CisJc3RydWN0IGFjcGlfZ3BlX2Jsb2NrX2luZm8gKm5leHRfZ3BlX2Jsb2NrOworCXN0cnVjdCBhY3BpX2dwZV94cnVwdF9pbmZvICpncGVfeHJ1cHRfYmxvY2s7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCWFjcGlfY3B1X2ZsYWdzIGZsYWdzOworCisJQUNQSV9GVU5DVElPTl9UUkFDRShldl9pbnN0YWxsX2dwZV9ibG9jayk7CisKKwlzdGF0dXMgPSBhY3BpX3V0X2FjcXVpcmVfbXV0ZXgoQUNQSV9NVFhfRVZFTlRTKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CisJfQorCisJZ3BlX3hydXB0X2Jsb2NrID0gYWNwaV9ldl9nZXRfZ3BlX3hydXB0X2Jsb2NrKGludGVycnVwdF9udW1iZXIpOworCWlmICghZ3BlX3hydXB0X2Jsb2NrKSB7CisJCXN0YXR1cyA9IEFFX05PX01FTU9SWTsKKwkJZ290byB1bmxvY2tfYW5kX2V4aXQ7CisJfQorCisJLyogSW5zdGFsbCB0aGUgbmV3IGJsb2NrIGF0IHRoZSBlbmQgb2YgdGhlIGxpc3Qgd2l0aCBsb2NrICovCisKKwlmbGFncyA9IGFjcGlfb3NfYWNxdWlyZV9sb2NrKGFjcGlfZ2JsX2dwZV9sb2NrKTsKKwlpZiAoZ3BlX3hydXB0X2Jsb2NrLT5ncGVfYmxvY2tfbGlzdF9oZWFkKSB7CisJCW5leHRfZ3BlX2Jsb2NrID0gZ3BlX3hydXB0X2Jsb2NrLT5ncGVfYmxvY2tfbGlzdF9oZWFkOworCQl3aGlsZSAobmV4dF9ncGVfYmxvY2stPm5leHQpIHsKKwkJCW5leHRfZ3BlX2Jsb2NrID0gbmV4dF9ncGVfYmxvY2stPm5leHQ7CisJCX0KKworCQluZXh0X2dwZV9ibG9jay0+bmV4dCA9IGdwZV9ibG9jazsKKwkJZ3BlX2Jsb2NrLT5wcmV2aW91cyA9IG5leHRfZ3BlX2Jsb2NrOworCX0gZWxzZSB7CisJCWdwZV94cnVwdF9ibG9jay0+Z3BlX2Jsb2NrX2xpc3RfaGVhZCA9IGdwZV9ibG9jazsKKwl9CisKKwlncGVfYmxvY2stPnhydXB0X2Jsb2NrID0gZ3BlX3hydXB0X2Jsb2NrOworCWFjcGlfb3NfcmVsZWFzZV9sb2NrKGFjcGlfZ2JsX2dwZV9sb2NrLCBmbGFncyk7CisKKyAgICAgIHVubG9ja19hbmRfZXhpdDoKKwlzdGF0dXMgPSBhY3BpX3V0X3JlbGVhc2VfbXV0ZXgoQUNQSV9NVFhfRVZFTlRTKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9ldl9kZWxldGVfZ3BlX2Jsb2NrCisgKgorICogUEFSQU1FVEVSUzogIGdwZV9ibG9jayAgICAgICAgICAgLSBFeGlzdGluZyBHUEUgYmxvY2sKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IFJlbW92ZSBhIEdQRSBibG9jaworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2FjcGlfc3RhdHVzIGFjcGlfZXZfZGVsZXRlX2dwZV9ibG9jayhzdHJ1Y3QgYWNwaV9ncGVfYmxvY2tfaW5mbyAqZ3BlX2Jsb2NrKQoreworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwlhY3BpX2NwdV9mbGFncyBmbGFnczsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0UoZXZfaW5zdGFsbF9ncGVfYmxvY2spOworCisJc3RhdHVzID0gYWNwaV91dF9hY3F1aXJlX211dGV4KEFDUElfTVRYX0VWRU5UUyk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworCX0KKworCS8qIERpc2FibGUgYWxsIEdQRXMgaW4gdGhpcyBibG9jayAqLworCisJc3RhdHVzID0KKwkgICAgYWNwaV9od19kaXNhYmxlX2dwZV9ibG9jayhncGVfYmxvY2stPnhydXB0X2Jsb2NrLCBncGVfYmxvY2ssIE5VTEwpOworCisJaWYgKCFncGVfYmxvY2stPnByZXZpb3VzICYmICFncGVfYmxvY2stPm5leHQpIHsKKworCQkvKiBUaGlzIGlzIHRoZSBsYXN0IGdwZV9ibG9jayBvbiB0aGlzIGludGVycnVwdCAqLworCisJCXN0YXR1cyA9IGFjcGlfZXZfZGVsZXRlX2dwZV94cnVwdChncGVfYmxvY2stPnhydXB0X2Jsb2NrKTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQlnb3RvIHVubG9ja19hbmRfZXhpdDsKKwkJfQorCX0gZWxzZSB7CisJCS8qIFJlbW92ZSB0aGUgYmxvY2sgb24gdGhpcyBpbnRlcnJ1cHQgd2l0aCBsb2NrICovCisKKwkJZmxhZ3MgPSBhY3BpX29zX2FjcXVpcmVfbG9jayhhY3BpX2dibF9ncGVfbG9jayk7CisJCWlmIChncGVfYmxvY2stPnByZXZpb3VzKSB7CisJCQlncGVfYmxvY2stPnByZXZpb3VzLT5uZXh0ID0gZ3BlX2Jsb2NrLT5uZXh0OworCQl9IGVsc2UgeworCQkJZ3BlX2Jsb2NrLT54cnVwdF9ibG9jay0+Z3BlX2Jsb2NrX2xpc3RfaGVhZCA9CisJCQkgICAgZ3BlX2Jsb2NrLT5uZXh0OworCQl9CisKKwkJaWYgKGdwZV9ibG9jay0+bmV4dCkgeworCQkJZ3BlX2Jsb2NrLT5uZXh0LT5wcmV2aW91cyA9IGdwZV9ibG9jay0+cHJldmlvdXM7CisJCX0KKwkJYWNwaV9vc19yZWxlYXNlX2xvY2soYWNwaV9nYmxfZ3BlX2xvY2ssIGZsYWdzKTsKKwl9CisKKwlhY3BpX2N1cnJlbnRfZ3BlX2NvdW50IC09CisJICAgIGdwZV9ibG9jay0+cmVnaXN0ZXJfY291bnQgKiBBQ1BJX0dQRV9SRUdJU1RFUl9XSURUSDsKKworCS8qIEZyZWUgdGhlIGdwZV9ibG9jayAqLworCisJQUNQSV9GUkVFKGdwZV9ibG9jay0+cmVnaXN0ZXJfaW5mbyk7CisJQUNQSV9GUkVFKGdwZV9ibG9jay0+ZXZlbnRfaW5mbyk7CisJQUNQSV9GUkVFKGdwZV9ibG9jayk7CisKKyAgICAgIHVubG9ja19hbmRfZXhpdDoKKwlzdGF0dXMgPSBhY3BpX3V0X3JlbGVhc2VfbXV0ZXgoQUNQSV9NVFhfRVZFTlRTKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9ldl9jcmVhdGVfZ3BlX2luZm9fYmxvY2tzCisgKgorICogUEFSQU1FVEVSUzogIGdwZV9ibG9jayAgIC0gTmV3IEdQRSBibG9jaworICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogQ3JlYXRlIHRoZSByZWdpc3Rlcl9pbmZvIGFuZCBldmVudF9pbmZvIGJsb2NrcyBmb3IgdGhpcyBHUEUgYmxvY2sKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgYWNwaV9zdGF0dXMKK2FjcGlfZXZfY3JlYXRlX2dwZV9pbmZvX2Jsb2NrcyhzdHJ1Y3QgYWNwaV9ncGVfYmxvY2tfaW5mbyAqZ3BlX2Jsb2NrKQoreworCXN0cnVjdCBhY3BpX2dwZV9yZWdpc3Rlcl9pbmZvICpncGVfcmVnaXN0ZXJfaW5mbyA9IE5VTEw7CisJc3RydWN0IGFjcGlfZ3BlX2V2ZW50X2luZm8gKmdwZV9ldmVudF9pbmZvID0gTlVMTDsKKwlzdHJ1Y3QgYWNwaV9ncGVfZXZlbnRfaW5mbyAqdGhpc19ldmVudDsKKwlzdHJ1Y3QgYWNwaV9ncGVfcmVnaXN0ZXJfaW5mbyAqdGhpc19yZWdpc3RlcjsKKwl1MzIgaTsKKwl1MzIgajsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGV2X2NyZWF0ZV9ncGVfaW5mb19ibG9ja3MpOworCisJLyogQWxsb2NhdGUgdGhlIEdQRSByZWdpc3RlciBpbmZvcm1hdGlvbiBibG9jayAqLworCisJZ3BlX3JlZ2lzdGVyX2luZm8gPSBBQ1BJX0FMTE9DQVRFX1pFUk9FRCgoYWNwaV9zaXplKSBncGVfYmxvY2stPgorCQkJCQkJIHJlZ2lzdGVyX2NvdW50ICoKKwkJCQkJCSBzaXplb2Yoc3RydWN0CisJCQkJCQkJYWNwaV9ncGVfcmVnaXN0ZXJfaW5mbykpOworCWlmICghZ3BlX3JlZ2lzdGVyX2luZm8pIHsKKwkJQUNQSV9FUlJPUigoQUVfSU5GTywKKwkJCSAgICAiQ291bGQgbm90IGFsbG9jYXRlIHRoZSBHcGVSZWdpc3RlckluZm8gdGFibGUiKSk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT19NRU1PUlkpOworCX0KKworCS8qCisJICogQWxsb2NhdGUgdGhlIEdQRSBldmVudF9pbmZvIGJsb2NrLiBUaGVyZSBhcmUgZWlnaHQgZGlzdGluY3QgR1BFcworCSAqIHBlciByZWdpc3Rlci4gSW5pdGlhbGl6YXRpb24gdG8gemVyb3MgaXMgc3VmZmljaWVudC4KKwkgKi8KKwlncGVfZXZlbnRfaW5mbyA9IEFDUElfQUxMT0NBVEVfWkVST0VEKCgoYWNwaV9zaXplKSBncGVfYmxvY2stPgorCQkJCQkgICAgICAgcmVnaXN0ZXJfY291bnQgKgorCQkJCQkgICAgICAgQUNQSV9HUEVfUkVHSVNURVJfV0lEVEgpICoKKwkJCQkJICAgICAgc2l6ZW9mKHN0cnVjdAorCQkJCQkJICAgICBhY3BpX2dwZV9ldmVudF9pbmZvKSk7CisJaWYgKCFncGVfZXZlbnRfaW5mbykgeworCQlBQ1BJX0VSUk9SKChBRV9JTkZPLAorCQkJICAgICJDb3VsZCBub3QgYWxsb2NhdGUgdGhlIEdwZUV2ZW50SW5mbyB0YWJsZSIpKTsKKwkJc3RhdHVzID0gQUVfTk9fTUVNT1JZOworCQlnb3RvIGVycm9yX2V4aXQ7CisJfQorCisJLyogU2F2ZSB0aGUgbmV3IEluZm8gYXJyYXlzIGluIHRoZSBHUEUgYmxvY2sgKi8KKworCWdwZV9ibG9jay0+cmVnaXN0ZXJfaW5mbyA9IGdwZV9yZWdpc3Rlcl9pbmZvOworCWdwZV9ibG9jay0+ZXZlbnRfaW5mbyA9IGdwZV9ldmVudF9pbmZvOworCisJLyoKKwkgKiBJbml0aWFsaXplIHRoZSBHUEUgUmVnaXN0ZXIgYW5kIEV2ZW50IHN0cnVjdHVyZXMuIEEgZ29hbCBvZiB0aGVzZQorCSAqIHRhYmxlcyBpcyB0byBoaWRlIHRoZSBmYWN0IHRoYXQgdGhlcmUgYXJlIHR3byBzZXBhcmF0ZSBHUEUgcmVnaXN0ZXIKKwkgKiBzZXRzIGluIGEgZ2l2ZW4gR1BFIGhhcmR3YXJlIGJsb2NrLCB0aGUgc3RhdHVzIHJlZ2lzdGVycyBvY2N1cHkgdGhlCisJICogZmlyc3QgaGFsZiwgYW5kIHRoZSBlbmFibGUgcmVnaXN0ZXJzIG9jY3VweSB0aGUgc2Vjb25kIGhhbGYuCisJICovCisJdGhpc19yZWdpc3RlciA9IGdwZV9yZWdpc3Rlcl9pbmZvOworCXRoaXNfZXZlbnQgPSBncGVfZXZlbnRfaW5mbzsKKworCWZvciAoaSA9IDA7IGkgPCBncGVfYmxvY2stPnJlZ2lzdGVyX2NvdW50OyBpKyspIHsKKworCQkvKiBJbml0IHRoZSByZWdpc3Rlcl9pbmZvIGZvciB0aGlzIEdQRSByZWdpc3RlciAoOCBHUEVzKSAqLworCisJCXRoaXNfcmVnaXN0ZXItPmJhc2VfZ3BlX251bWJlciA9CisJCSAgICAodTgpIChncGVfYmxvY2stPmJsb2NrX2Jhc2VfbnVtYmVyICsKKwkJCSAgKGkgKiBBQ1BJX0dQRV9SRUdJU1RFUl9XSURUSCkpOworCisJCXRoaXNfcmVnaXN0ZXItPnN0YXR1c19hZGRyZXNzLmFkZHJlc3MgPQorCQkgICAgZ3BlX2Jsb2NrLT5ibG9ja19hZGRyZXNzLmFkZHJlc3MgKyBpOworCisJCXRoaXNfcmVnaXN0ZXItPmVuYWJsZV9hZGRyZXNzLmFkZHJlc3MgPQorCQkgICAgZ3BlX2Jsb2NrLT5ibG9ja19hZGRyZXNzLmFkZHJlc3MgKyBpICsKKwkJICAgIGdwZV9ibG9jay0+cmVnaXN0ZXJfY291bnQ7CisKKwkJdGhpc19yZWdpc3Rlci0+c3RhdHVzX2FkZHJlc3Muc3BhY2VfaWQgPQorCQkgICAgZ3BlX2Jsb2NrLT5ibG9ja19hZGRyZXNzLnNwYWNlX2lkOworCQl0aGlzX3JlZ2lzdGVyLT5lbmFibGVfYWRkcmVzcy5zcGFjZV9pZCA9CisJCSAgICBncGVfYmxvY2stPmJsb2NrX2FkZHJlc3Muc3BhY2VfaWQ7CisJCXRoaXNfcmVnaXN0ZXItPnN0YXR1c19hZGRyZXNzLmJpdF93aWR0aCA9CisJCSAgICBBQ1BJX0dQRV9SRUdJU1RFUl9XSURUSDsKKwkJdGhpc19yZWdpc3Rlci0+ZW5hYmxlX2FkZHJlc3MuYml0X3dpZHRoID0KKwkJICAgIEFDUElfR1BFX1JFR0lTVEVSX1dJRFRIOworCQl0aGlzX3JlZ2lzdGVyLT5zdGF0dXNfYWRkcmVzcy5iaXRfb2Zmc2V0ID0gMDsKKwkJdGhpc19yZWdpc3Rlci0+ZW5hYmxlX2FkZHJlc3MuYml0X29mZnNldCA9IDA7CisKKwkJLyogSW5pdCB0aGUgZXZlbnRfaW5mbyBmb3IgZWFjaCBHUEUgd2l0aGluIHRoaXMgcmVnaXN0ZXIgKi8KKworCQlmb3IgKGogPSAwOyBqIDwgQUNQSV9HUEVfUkVHSVNURVJfV0lEVEg7IGorKykgeworCQkJdGhpc19ldmVudC0+Z3BlX251bWJlciA9CisJCQkgICAgKHU4KSAodGhpc19yZWdpc3Rlci0+YmFzZV9ncGVfbnVtYmVyICsgaik7CisJCQl0aGlzX2V2ZW50LT5yZWdpc3Rlcl9pbmZvID0gdGhpc19yZWdpc3RlcjsKKwkJCXRoaXNfZXZlbnQrKzsKKwkJfQorCisJCS8qIERpc2FibGUgYWxsIEdQRXMgd2l0aGluIHRoaXMgcmVnaXN0ZXIgKi8KKworCQlzdGF0dXMgPSBhY3BpX3dyaXRlKDB4MDAsICZ0aGlzX3JlZ2lzdGVyLT5lbmFibGVfYWRkcmVzcyk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJZ290byBlcnJvcl9leGl0OworCQl9CisKKwkJLyogQ2xlYXIgYW55IHBlbmRpbmcgR1BFIGV2ZW50cyB3aXRoaW4gdGhpcyByZWdpc3RlciAqLworCisJCXN0YXR1cyA9IGFjcGlfd3JpdGUoMHhGRiwgJnRoaXNfcmVnaXN0ZXItPnN0YXR1c19hZGRyZXNzKTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQlnb3RvIGVycm9yX2V4aXQ7CisJCX0KKworCQl0aGlzX3JlZ2lzdGVyKys7CisJfQorCisJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKKworICAgICAgZXJyb3JfZXhpdDoKKwlpZiAoZ3BlX3JlZ2lzdGVyX2luZm8pIHsKKwkJQUNQSV9GUkVFKGdwZV9yZWdpc3Rlcl9pbmZvKTsKKwl9CisJaWYgKGdwZV9ldmVudF9pbmZvKSB7CisJCUFDUElfRlJFRShncGVfZXZlbnRfaW5mbyk7CisJfQorCisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfZXZfY3JlYXRlX2dwZV9ibG9jaworICoKKyAqIFBBUkFNRVRFUlM6ICBncGVfZGV2aWNlICAgICAgICAgIC0gSGFuZGxlIHRvIHRoZSBwYXJlbnQgR1BFIGJsb2NrCisgKiAgICAgICAgICAgICAgZ3BlX2Jsb2NrX2FkZHJlc3MgICAtIEFkZHJlc3MgYW5kIHNwYWNlX2lECisgKiAgICAgICAgICAgICAgcmVnaXN0ZXJfY291bnQgICAgICAtIE51bWJlciBvZiBHUEUgcmVnaXN0ZXIgcGFpcnMgaW4gdGhlIGJsb2NrCisgKiAgICAgICAgICAgICAgZ3BlX2Jsb2NrX2Jhc2VfbnVtYmVyIC0gU3RhcnRpbmcgR1BFIG51bWJlciBmb3IgdGhlIGJsb2NrCisgKiAgICAgICAgICAgICAgaW50ZXJydXB0X251bWJlciAgICAtIEgvVyBpbnRlcnJ1cHQgZm9yIHRoZSBibG9jaworICogICAgICAgICAgICAgIHJldHVybl9ncGVfYmxvY2sgICAgLSBXaGVyZSB0aGUgbmV3IGJsb2NrIGRlc2NyaXB0b3IgaXMgcmV0dXJuZWQKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IENyZWF0ZSBhbmQgSW5zdGFsbCBhIGJsb2NrIG9mIEdQRSByZWdpc3RlcnMuIEFsbCBHUEVzIHdpdGhpbgorICogICAgICAgICAgICAgIHRoZSBibG9jayBhcmUgZGlzYWJsZWQgYXQgZXhpdC4KKyAqICAgICAgICAgICAgICBOb3RlOiBBc3N1bWVzIG5hbWVzcGFjZSBpcyBsb2NrZWQuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworYWNwaV9zdGF0dXMKK2FjcGlfZXZfY3JlYXRlX2dwZV9ibG9jayhzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqZ3BlX2RldmljZSwKKwkJCSBzdHJ1Y3QgYWNwaV9nZW5lcmljX2FkZHJlc3MgKmdwZV9ibG9ja19hZGRyZXNzLAorCQkJIHUzMiByZWdpc3Rlcl9jb3VudCwKKwkJCSB1OCBncGVfYmxvY2tfYmFzZV9udW1iZXIsCisJCQkgdTMyIGludGVycnVwdF9udW1iZXIsCisJCQkgc3RydWN0IGFjcGlfZ3BlX2Jsb2NrX2luZm8gKipyZXR1cm5fZ3BlX2Jsb2NrKQoreworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwlzdHJ1Y3QgYWNwaV9ncGVfYmxvY2tfaW5mbyAqZ3BlX2Jsb2NrOworCisJQUNQSV9GVU5DVElPTl9UUkFDRShldl9jcmVhdGVfZ3BlX2Jsb2NrKTsKKworCWlmICghcmVnaXN0ZXJfY291bnQpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKKwl9CisKKwkvKiBBbGxvY2F0ZSBhIG5ldyBHUEUgYmxvY2sgKi8KKworCWdwZV9ibG9jayA9IEFDUElfQUxMT0NBVEVfWkVST0VEKHNpemVvZihzdHJ1Y3QgYWNwaV9ncGVfYmxvY2tfaW5mbykpOworCWlmICghZ3BlX2Jsb2NrKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT19NRU1PUlkpOworCX0KKworCS8qIEluaXRpYWxpemUgdGhlIG5ldyBHUEUgYmxvY2sgKi8KKworCWdwZV9ibG9jay0+bm9kZSA9IGdwZV9kZXZpY2U7CisJZ3BlX2Jsb2NrLT5yZWdpc3Rlcl9jb3VudCA9IHJlZ2lzdGVyX2NvdW50OworCWdwZV9ibG9jay0+YmxvY2tfYmFzZV9udW1iZXIgPSBncGVfYmxvY2tfYmFzZV9udW1iZXI7CisKKwlBQ1BJX01FTUNQWSgmZ3BlX2Jsb2NrLT5ibG9ja19hZGRyZXNzLCBncGVfYmxvY2tfYWRkcmVzcywKKwkJICAgIHNpemVvZihzdHJ1Y3QgYWNwaV9nZW5lcmljX2FkZHJlc3MpKTsKKworCS8qCisJICogQ3JlYXRlIHRoZSByZWdpc3Rlcl9pbmZvIGFuZCBldmVudF9pbmZvIHN1Yi1zdHJ1Y3R1cmVzCisJICogTm90ZTogZGlzYWJsZXMgYW5kIGNsZWFycyBhbGwgR1BFcyBpbiB0aGUgYmxvY2sKKwkgKi8KKwlzdGF0dXMgPSBhY3BpX2V2X2NyZWF0ZV9ncGVfaW5mb19ibG9ja3MoZ3BlX2Jsb2NrKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJQUNQSV9GUkVFKGdwZV9ibG9jayk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworCX0KKworCS8qIEluc3RhbGwgdGhlIG5ldyBibG9jayBpbiB0aGUgZ2xvYmFsIGxpc3RzICovCisKKwlzdGF0dXMgPSBhY3BpX2V2X2luc3RhbGxfZ3BlX2Jsb2NrKGdwZV9ibG9jaywgaW50ZXJydXB0X251bWJlcik7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCUFDUElfRlJFRShncGVfYmxvY2spOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKKwl9CisKKwkvKiBGaW5kIGFsbCBHUEUgbWV0aG9kcyAoX0x4eCwgX0V4eCkgZm9yIHRoaXMgYmxvY2sgKi8KKworCXN0YXR1cyA9IGFjcGlfbnNfd2Fsa19uYW1lc3BhY2UoQUNQSV9UWVBFX01FVEhPRCwgZ3BlX2RldmljZSwKKwkJCQkJQUNQSV9VSU5UMzJfTUFYLCBBQ1BJX05TX1dBTEtfTk9fVU5MT0NLLAorCQkJCQlhY3BpX2V2X3NhdmVfbWV0aG9kX2luZm8sIGdwZV9ibG9jaywKKwkJCQkJTlVMTCk7CisKKwkvKiBSZXR1cm4gdGhlIG5ldyBibG9jayAqLworCisJaWYgKHJldHVybl9ncGVfYmxvY2spIHsKKwkJKCpyZXR1cm5fZ3BlX2Jsb2NrKSA9IGdwZV9ibG9jazsKKwl9CisKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lOSVQsCisJCQkgICJHUEUgJTAyWCB0byAlMDJYIFslNC40c10gJXUgcmVncyBvbiBpbnQgMHglWFxuIiwKKwkJCSAgKHUzMikgZ3BlX2Jsb2NrLT5ibG9ja19iYXNlX251bWJlciwKKwkJCSAgKHUzMikgKGdwZV9ibG9jay0+YmxvY2tfYmFzZV9udW1iZXIgKworCQkJCSAoKGdwZV9ibG9jay0+cmVnaXN0ZXJfY291bnQgKgorCQkJCSAgIEFDUElfR1BFX1JFR0lTVEVSX1dJRFRIKSAtIDEpKSwKKwkJCSAgZ3BlX2RldmljZS0+bmFtZS5hc2NpaSwgZ3BlX2Jsb2NrLT5yZWdpc3Rlcl9jb3VudCwKKwkJCSAgaW50ZXJydXB0X251bWJlcikpOworCisJLyogVXBkYXRlIGdsb2JhbCBjb3VudCBvZiBjdXJyZW50bHkgYXZhaWxhYmxlIEdQRXMgKi8KKworCWFjcGlfY3VycmVudF9ncGVfY291bnQgKz0gcmVnaXN0ZXJfY291bnQgKiBBQ1BJX0dQRV9SRUdJU1RFUl9XSURUSDsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX2V2X2luaXRpYWxpemVfZ3BlX2Jsb2NrCisgKgorICogUEFSQU1FVEVSUzogIGdwZV9kZXZpY2UgICAgICAgICAgLSBIYW5kbGUgdG8gdGhlIHBhcmVudCBHUEUgYmxvY2sKKyAqICAgICAgICAgICAgICBncGVfYmxvY2sgICAgICAgICAgIC0gR3BlIEJsb2NrIGluZm8KKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IEluaXRpYWxpemUgYW5kIGVuYWJsZSBhIEdQRSBibG9jay4gRmlyc3QgZmluZCBhbmQgcnVuIGFueQorICogICAgICAgICAgICAgIF9QUlQgbWV0aG9kcyBhc3NvY2lhdGVkIHdpdGggdGhlIGJsb2NrLCB0aGVuIGVuYWJsZSB0aGUKKyAqICAgICAgICAgICAgICBhcHByb3ByaWF0ZSBHUEVzLgorICogICAgICAgICAgICAgIE5vdGU6IEFzc3VtZXMgbmFtZXNwYWNlIGlzIGxvY2tlZC4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCithY3BpX3N0YXR1cworYWNwaV9ldl9pbml0aWFsaXplX2dwZV9ibG9jayhzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqZ3BlX2RldmljZSwKKwkJCSAgICAgc3RydWN0IGFjcGlfZ3BlX2Jsb2NrX2luZm8gKmdwZV9ibG9jaykKK3sKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJc3RydWN0IGFjcGlfZ3BlX2V2ZW50X2luZm8gKmdwZV9ldmVudF9pbmZvOworCXN0cnVjdCBhY3BpX2dwZV93YWxrX2luZm8gZ3BlX2luZm87CisJdTMyIHdha2VfZ3BlX2NvdW50OworCXUzMiBncGVfZW5hYmxlZF9jb3VudDsKKwl1MzIgaTsKKwl1MzIgajsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0UoZXZfaW5pdGlhbGl6ZV9ncGVfYmxvY2spOworCisJLyogSWdub3JlIGEgbnVsbCBHUEUgYmxvY2sgKGUuZy4sIGlmIG5vIEdQRSBibG9jayAxIGV4aXN0cykgKi8KKworCWlmICghZ3BlX2Jsb2NrKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CisJfQorCisJLyoKKwkgKiBSdW50aW1lIG9wdGlvbjogU2hvdWxkIHdha2UgR1BFcyBiZSBlbmFibGVkIGF0IHJ1bnRpbWU/ICBUaGUgZGVmYXVsdAorCSAqIGlzIG5vLCB0aGV5IHNob3VsZCBvbmx5IGJlIGVuYWJsZWQganVzdCBhcyB0aGUgbWFjaGluZSBnb2VzIHRvIHNsZWVwLgorCSAqLworCWlmIChhY3BpX2dibF9sZWF2ZV93YWtlX2dwZXNfZGlzYWJsZWQpIHsKKwkJLyoKKwkJICogRGlmZmVyZW50aWF0ZSBydW50aW1lIHZzIHdha2UgR1BFcywgdmlhIHRoZSBfUFJXIGNvbnRyb2wgbWV0aG9kcy4KKwkJICogRWFjaCBHUEUgdGhhdCBoYXMgb25lIG9yIG1vcmUgX1BSV3MgdGhhdCByZWZlcmVuY2UgaXQgaXMgYnkKKwkJICogZGVmaW5pdGlvbiBhIHdha2UgR1BFIGFuZCB3aWxsIG5vdCBiZSBlbmFibGVkIHdoaWxlIHRoZSBtYWNoaW5lCisJCSAqIGlzIHJ1bm5pbmcuCisJCSAqLworCQlncGVfaW5mby5ncGVfYmxvY2sgPSBncGVfYmxvY2s7CisJCWdwZV9pbmZvLmdwZV9kZXZpY2UgPSBncGVfZGV2aWNlOworCisJCXN0YXR1cyA9CisJCSAgICBhY3BpX25zX3dhbGtfbmFtZXNwYWNlKEFDUElfVFlQRV9ERVZJQ0UsIEFDUElfUk9PVF9PQkpFQ1QsCisJCQkJCSAgIEFDUElfVUlOVDMyX01BWCwgQUNQSV9OU19XQUxLX1VOTE9DSywKKwkJCQkJICAgYWNwaV9ldl9tYXRjaF9wcndfYW5kX2dwZSwgJmdwZV9pbmZvLAorCQkJCQkgICBOVUxMKTsKKwl9CisKKwkvKgorCSAqIEVuYWJsZSBhbGwgR1BFcyBpbiB0aGlzIGJsb2NrIHRoYXQgaGF2ZSB0aGVzZSBhdHRyaWJ1dGVzOgorCSAqIDEpIGFyZSAicnVudGltZSIgb3IgInJ1bi93YWtlIiBHUEVzLCBhbmQKKwkgKiAyKSBoYXZlIGEgY29ycmVzcG9uZGluZyBfTHh4IG9yIF9FeHggbWV0aG9kCisJICoKKwkgKiBBbnkgb3RoZXIgR1BFcyB3aXRoaW4gdGhpcyBibG9jayBtdXN0IGJlIGVuYWJsZWQgdmlhIHRoZSBhY3BpX2VuYWJsZV9ncGUoKQorCSAqIGV4dGVybmFsIGludGVyZmFjZS4KKwkgKi8KKwl3YWtlX2dwZV9jb3VudCA9IDA7CisJZ3BlX2VuYWJsZWRfY291bnQgPSAwOworCisJZm9yIChpID0gMDsgaSA8IGdwZV9ibG9jay0+cmVnaXN0ZXJfY291bnQ7IGkrKykgeworCQlmb3IgKGogPSAwOyBqIDwgODsgaisrKSB7CisKKwkJCS8qIEdldCB0aGUgaW5mbyBibG9jayBmb3IgdGhpcyBwYXJ0aWN1bGFyIEdQRSAqLworCisJCQlncGVfZXZlbnRfaW5mbyA9CisJCQkgICAgJmdwZV9ibG9jay0+CisJCQkgICAgZXZlbnRfaW5mb1soKGFjcGlfc2l6ZSkgaSAqCisJCQkJCUFDUElfR1BFX1JFR0lTVEVSX1dJRFRIKSArIGpdOworCisJCQlpZiAoKChncGVfZXZlbnRfaW5mby0+ZmxhZ3MgJiBBQ1BJX0dQRV9ESVNQQVRDSF9NQVNLKSA9PQorCQkJICAgICBBQ1BJX0dQRV9ESVNQQVRDSF9NRVRIT0QpCisJCQkgICAgJiYgKGdwZV9ldmVudF9pbmZvLT5mbGFncyAmIEFDUElfR1BFX1RZUEVfUlVOVElNRSkpIHsKKwkJCQlncGVfZW5hYmxlZF9jb3VudCsrOworCQkJfQorCisJCQlpZiAoZ3BlX2V2ZW50X2luZm8tPmZsYWdzICYgQUNQSV9HUEVfVFlQRV9XQUtFKSB7CisJCQkJd2FrZV9ncGVfY291bnQrKzsKKwkJCX0KKwkJfQorCX0KKworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5JVCwKKwkJCSAgIkZvdW5kICV1IFdha2UsIEVuYWJsZWQgJXUgUnVudGltZSBHUEVzIGluIHRoaXMgYmxvY2tcbiIsCisJCQkgIHdha2VfZ3BlX2NvdW50LCBncGVfZW5hYmxlZF9jb3VudCkpOworCisJLyogRW5hYmxlIGFsbCB2YWxpZCBydW50aW1lIEdQRXMgZm91bmQgYWJvdmUgKi8KKworCXN0YXR1cyA9IGFjcGlfaHdfZW5hYmxlX3J1bnRpbWVfZ3BlX2Jsb2NrKE5VTEwsIGdwZV9ibG9jaywgTlVMTCk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCUFDUElfRVJST1IoKEFFX0lORk8sICJDb3VsZCBub3QgZW5hYmxlIEdQRXMgaW4gR3BlQmxvY2sgJXAiLAorCQkJICAgIGdwZV9ibG9jaykpOworCX0KKworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX2V2X2dwZV9pbml0aWFsaXplCisgKgorICogUEFSQU1FVEVSUzogIE5vbmUKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IEluaXRpYWxpemUgdGhlIEdQRSBkYXRhIHN0cnVjdHVyZXMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCithY3BpX3N0YXR1cyBhY3BpX2V2X2dwZV9pbml0aWFsaXplKHZvaWQpCit7CisJdTMyIHJlZ2lzdGVyX2NvdW50MCA9IDA7CisJdTMyIHJlZ2lzdGVyX2NvdW50MSA9IDA7CisJdTMyIGdwZV9udW1iZXJfbWF4ID0gMDsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGV2X2dwZV9pbml0aWFsaXplKTsKKworCXN0YXR1cyA9IGFjcGlfdXRfYWNxdWlyZV9tdXRleChBQ1BJX01UWF9OQU1FU1BBQ0UpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKKwl9CisKKwkvKgorCSAqIEluaXRpYWxpemUgdGhlIEdQRSBCbG9jayhzKSBkZWZpbmVkIGluIHRoZSBGQURUCisJICoKKwkgKiBXaHkgdGhlIEdQRSByZWdpc3RlciBibG9jayBsZW5ndGhzIGFyZSBkaXZpZGVkIGJ5IDI6ICBGcm9tIHRoZSBBQ1BJIFNwZWMsCisJICogc2VjdGlvbiAiR2VuZXJhbC1QdXJwb3NlIEV2ZW50IFJlZ2lzdGVycyIsIHdlIGhhdmU6CisJICoKKwkgKiAiRWFjaCByZWdpc3RlciBibG9jayBjb250YWlucyB0d28gcmVnaXN0ZXJzIG9mIGVxdWFsIGxlbmd0aAorCSAqICBHUEV4X1NUUyBhbmQgR1BFeF9FTiAod2hlcmUgeCBpcyAwIG9yIDEpLiBUaGUgbGVuZ3RoIG9mIHRoZQorCSAqICBHUEUwX1NUUyBhbmQgR1BFMF9FTiByZWdpc3RlcnMgaXMgZXF1YWwgdG8gaGFsZiB0aGUgR1BFMF9MRU4KKwkgKiAgVGhlIGxlbmd0aCBvZiB0aGUgR1BFMV9TVFMgYW5kIEdQRTFfRU4gcmVnaXN0ZXJzIGlzIGVxdWFsIHRvCisJICogIGhhbGYgdGhlIEdQRTFfTEVOLiBJZiBhIGdlbmVyaWMgcmVnaXN0ZXIgYmxvY2sgaXMgbm90IHN1cHBvcnRlZAorCSAqICB0aGVuIGl0cyByZXNwZWN0aXZlIGJsb2NrIHBvaW50ZXIgYW5kIGJsb2NrIGxlbmd0aCB2YWx1ZXMgaW4gdGhlCisJICogIEZBRFQgdGFibGUgY29udGFpbiB6ZXJvcy4gVGhlIEdQRTBfTEVOIGFuZCBHUEUxX0xFTiBkbyBub3QgbmVlZAorCSAqICB0byBiZSB0aGUgc2FtZSBzaXplLiIKKwkgKi8KKworCS8qCisJICogRGV0ZXJtaW5lIHRoZSBtYXhpbXVtIEdQRSBudW1iZXIgZm9yIHRoaXMgbWFjaGluZS4KKwkgKgorCSAqIE5vdGU6IGJvdGggR1BFMCBhbmQgR1BFMSBhcmUgb3B0aW9uYWwsIGFuZCBlaXRoZXIgY2FuIGV4aXN0IHdpdGhvdXQKKwkgKiB0aGUgb3RoZXIuCisJICoKKwkgKiBJZiBFSVRIRVIgdGhlIHJlZ2lzdGVyIGxlbmd0aCBPUiB0aGUgYmxvY2sgYWRkcmVzcyBhcmUgemVybywgdGhlbiB0aGF0CisJICogcGFydGljdWxhciBibG9jayBpcyBub3Qgc3VwcG9ydGVkLgorCSAqLworCWlmIChhY3BpX2dibF9GQURULmdwZTBfYmxvY2tfbGVuZ3RoICYmCisJICAgIGFjcGlfZ2JsX0ZBRFQueGdwZTBfYmxvY2suYWRkcmVzcykgeworCisJCS8qIEdQRSBibG9jayAwIGV4aXN0cyAoaGFzIGJvdGggbGVuZ3RoIGFuZCBhZGRyZXNzID4gMCkgKi8KKworCQlyZWdpc3Rlcl9jb3VudDAgPSAodTE2KSAoYWNwaV9nYmxfRkFEVC5ncGUwX2Jsb2NrX2xlbmd0aCAvIDIpOworCisJCWdwZV9udW1iZXJfbWF4ID0KKwkJICAgIChyZWdpc3Rlcl9jb3VudDAgKiBBQ1BJX0dQRV9SRUdJU1RFUl9XSURUSCkgLSAxOworCisJCS8qIEluc3RhbGwgR1BFIEJsb2NrIDAgKi8KKworCQlzdGF0dXMgPSBhY3BpX2V2X2NyZWF0ZV9ncGVfYmxvY2soYWNwaV9nYmxfZmFkdF9ncGVfZGV2aWNlLAorCQkJCQkJICAmYWNwaV9nYmxfRkFEVC54Z3BlMF9ibG9jaywKKwkJCQkJCSAgcmVnaXN0ZXJfY291bnQwLCAwLAorCQkJCQkJICBhY3BpX2dibF9GQURULnNjaV9pbnRlcnJ1cHQsCisJCQkJCQkgICZhY3BpX2dibF9ncGVfZmFkdF9ibG9ja3NbMF0pOworCisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJQUNQSV9FWENFUFRJT04oKEFFX0lORk8sIHN0YXR1cywKKwkJCQkJIkNvdWxkIG5vdCBjcmVhdGUgR1BFIEJsb2NrIDAiKSk7CisJCX0KKwl9CisKKwlpZiAoYWNwaV9nYmxfRkFEVC5ncGUxX2Jsb2NrX2xlbmd0aCAmJgorCSAgICBhY3BpX2dibF9GQURULnhncGUxX2Jsb2NrLmFkZHJlc3MpIHsKKworCQkvKiBHUEUgYmxvY2sgMSBleGlzdHMgKGhhcyBib3RoIGxlbmd0aCBhbmQgYWRkcmVzcyA+IDApICovCisKKwkJcmVnaXN0ZXJfY291bnQxID0gKHUxNikgKGFjcGlfZ2JsX0ZBRFQuZ3BlMV9ibG9ja19sZW5ndGggLyAyKTsKKworCQkvKiBDaGVjayBmb3IgR1BFMC9HUEUxIG92ZXJsYXAgKGlmIGJvdGggYmFua3MgZXhpc3QpICovCisKKwkJaWYgKChyZWdpc3Rlcl9jb3VudDApICYmCisJCSAgICAoZ3BlX251bWJlcl9tYXggPj0gYWNwaV9nYmxfRkFEVC5ncGUxX2Jhc2UpKSB7CisJCQlBQ1BJX0VSUk9SKChBRV9JTkZPLAorCQkJCSAgICAiR1BFMCBibG9jayAoR1BFIDAgdG8gJWQpIG92ZXJsYXBzIHRoZSBHUEUxIGJsb2NrIChHUEUgJWQgdG8gJWQpIC0gSWdub3JpbmcgR1BFMSIsCisJCQkJICAgIGdwZV9udW1iZXJfbWF4LCBhY3BpX2dibF9GQURULmdwZTFfYmFzZSwKKwkJCQkgICAgYWNwaV9nYmxfRkFEVC5ncGUxX2Jhc2UgKworCQkJCSAgICAoKHJlZ2lzdGVyX2NvdW50MSAqCisJCQkJICAgICAgQUNQSV9HUEVfUkVHSVNURVJfV0lEVEgpIC0gMSkpKTsKKworCQkJLyogSWdub3JlIEdQRTEgYmxvY2sgYnkgc2V0dGluZyB0aGUgcmVnaXN0ZXIgY291bnQgdG8gemVybyAqLworCisJCQlyZWdpc3Rlcl9jb3VudDEgPSAwOworCQl9IGVsc2UgeworCQkJLyogSW5zdGFsbCBHUEUgQmxvY2sgMSAqLworCisJCQlzdGF0dXMgPQorCQkJICAgIGFjcGlfZXZfY3JlYXRlX2dwZV9ibG9jayhhY3BpX2dibF9mYWR0X2dwZV9kZXZpY2UsCisJCQkJCQkgICAgICZhY3BpX2dibF9GQURULnhncGUxX2Jsb2NrLAorCQkJCQkJICAgICByZWdpc3Rlcl9jb3VudDEsCisJCQkJCQkgICAgIGFjcGlfZ2JsX0ZBRFQuZ3BlMV9iYXNlLAorCQkJCQkJICAgICBhY3BpX2dibF9GQURULgorCQkJCQkJICAgICBzY2lfaW50ZXJydXB0LAorCQkJCQkJICAgICAmYWNwaV9nYmxfZ3BlX2ZhZHRfYmxvY2tzCisJCQkJCQkgICAgIFsxXSk7CisKKwkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJCUFDUElfRVhDRVBUSU9OKChBRV9JTkZPLCBzdGF0dXMsCisJCQkJCQkiQ291bGQgbm90IGNyZWF0ZSBHUEUgQmxvY2sgMSIpKTsKKwkJCX0KKworCQkJLyoKKwkJCSAqIEdQRTAgYW5kIEdQRTEgZG8gbm90IGhhdmUgdG8gYmUgY29udGlndW91cyBpbiB0aGUgR1BFIG51bWJlcgorCQkJICogc3BhY2UuIEhvd2V2ZXIsIEdQRTAgYWx3YXlzIHN0YXJ0cyBhdCBHUEUgbnVtYmVyIHplcm8uCisJCQkgKi8KKwkJCWdwZV9udW1iZXJfbWF4ID0gYWNwaV9nYmxfRkFEVC5ncGUxX2Jhc2UgKworCQkJICAgICgocmVnaXN0ZXJfY291bnQxICogQUNQSV9HUEVfUkVHSVNURVJfV0lEVEgpIC0gMSk7CisJCX0KKwl9CisKKwkvKiBFeGl0IGlmIHRoZXJlIGFyZSBubyBHUEUgcmVnaXN0ZXJzICovCisKKwlpZiAoKHJlZ2lzdGVyX2NvdW50MCArIHJlZ2lzdGVyX2NvdW50MSkgPT0gMCkgeworCisJCS8qIEdQRXMgYXJlIG5vdCByZXF1aXJlZCBieSBBQ1BJLCB0aGlzIGlzIE9LICovCisKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTklULAorCQkJCSAgIlRoZXJlIGFyZSBubyBHUEUgYmxvY2tzIGRlZmluZWQgaW4gdGhlIEZBRFRcbiIpKTsKKwkJc3RhdHVzID0gQUVfT0s7CisJCWdvdG8gY2xlYW51cDsKKwl9CisKKwkvKiBDaGVjayBmb3IgTWF4IEdQRSBudW1iZXIgb3V0LW9mLXJhbmdlICovCisKKwlpZiAoZ3BlX251bWJlcl9tYXggPiBBQ1BJX0dQRV9NQVgpIHsKKwkJQUNQSV9FUlJPUigoQUVfSU5GTywKKwkJCSAgICAiTWF4aW11bSBHUEUgbnVtYmVyIGZyb20gRkFEVCBpcyB0b28gbGFyZ2U6IDB4JVgiLAorCQkJICAgIGdwZV9udW1iZXJfbWF4KSk7CisJCXN0YXR1cyA9IEFFX0JBRF9WQUxVRTsKKwkJZ290byBjbGVhbnVwOworCX0KKworICAgICAgY2xlYW51cDoKKwkodm9pZClhY3BpX3V0X3JlbGVhc2VfbXV0ZXgoQUNQSV9NVFhfTkFNRVNQQUNFKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS9ldm1pc2MuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXZtaXNjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWY4OTMwNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXZtaXNjLmMKQEAgLTAsMCArMSw2MjEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBNb2R1bGUgTmFtZTogZXZtaXNjIC0gTWlzY2VsbGFuZW91cyBldmVudCBtYW5hZ2VyIHN1cHBvcnQgZnVuY3Rpb25zCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwOCwgSW50ZWwgQ29ycC4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKKyAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIGF0IG1pbmltdW0gYSBkaXNjbGFpbWVyCisgKiAgICBzdWJzdGFudGlhbGx5IHNpbWlsYXIgdG8gdGhlICJOTyBXQVJSQU5UWSIgZGlzY2xhaW1lciBiZWxvdworICogICAgKCJEaXNjbGFpbWVyIikgYW5kIGFueSByZWRpc3RyaWJ1dGlvbiBtdXN0IGJlIGNvbmRpdGlvbmVkIHVwb24KKyAqICAgIGluY2x1ZGluZyBhIHN1YnN0YW50aWFsbHkgc2ltaWxhciBEaXNjbGFpbWVyIHJlcXVpcmVtZW50IGZvciBmdXJ0aGVyCisgKiAgICBiaW5hcnkgcmVkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMKKyAqICAgIG9mIGFueSBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogTk8gV0FSUkFOVFkKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HCisgKiBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KKyAqLworCisjaW5jbHVkZSA8YWNwaS9hY3BpLmg+CisjaW5jbHVkZSAiYWNjb21tb24uaCIKKyNpbmNsdWRlICJhY2V2ZW50cy5oIgorI2luY2x1ZGUgImFjbmFtZXNwLmgiCisjaW5jbHVkZSAiYWNpbnRlcnAuaCIKKworI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfRVZFTlRTCitBQ1BJX01PRFVMRV9OQU1FKCJldm1pc2MiKQorCisvKiBMb2NhbCBwcm90b3R5cGVzICovCitzdGF0aWMgdm9pZCBBQ1BJX1NZU1RFTV9YRkFDRSBhY3BpX2V2X25vdGlmeV9kaXNwYXRjaCh2b2lkICpjb250ZXh0KTsKKworc3RhdGljIHUzMiBhY3BpX2V2X2dsb2JhbF9sb2NrX2hhbmRsZXIodm9pZCAqY29udGV4dCk7CisKK3N0YXRpYyBhY3BpX3N0YXR1cyBhY3BpX2V2X3JlbW92ZV9nbG9iYWxfbG9ja19oYW5kbGVyKHZvaWQpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX2V2X2lzX25vdGlmeV9vYmplY3QKKyAqCisgKiBQQVJBTUVURVJTOiAgTm9kZSAgICAgICAgICAgIC0gTm9kZSB0byBjaGVjaworICoKKyAqIFJFVFVSTjogICAgICBUUlVFIGlmIG5vdGlmaWVzIGFsbG93ZWQgb24gdGhpcyBvYmplY3QKKyAqCisgKiBERVNDUklQVElPTjogQ2hlY2sgdHlwZSBvZiBub2RlIGZvciBhIG9iamVjdCB0aGF0IHN1cHBvcnRzIG5vdGlmaWVzLgorICoKKyAqICAgICAgICAgICAgICBUQkQ6IFRoaXMgY291bGQgYmUgcmVwbGFjZWQgYnkgYSBmbGFnIGJpdCBpbiB0aGUgbm9kZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit1OCBhY3BpX2V2X2lzX25vdGlmeV9vYmplY3Qoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGUpCit7CisJc3dpdGNoIChub2RlLT50eXBlKSB7CisJY2FzZSBBQ1BJX1RZUEVfREVWSUNFOgorCWNhc2UgQUNQSV9UWVBFX1BST0NFU1NPUjoKKwljYXNlIEFDUElfVFlQRV9USEVSTUFMOgorCQkvKgorCQkgKiBUaGVzZSBhcmUgdGhlIE9OTFkgb2JqZWN0cyB0aGF0IGNhbiByZWNlaXZlIEFDUEkgbm90aWZpY2F0aW9ucworCQkgKi8KKwkJcmV0dXJuIChUUlVFKTsKKworCWRlZmF1bHQ6CisJCXJldHVybiAoRkFMU0UpOworCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9ldl9xdWV1ZV9ub3RpZnlfcmVxdWVzdAorICoKKyAqIFBBUkFNRVRFUlM6ICBOb2RlICAgICAgICAgICAgLSBOUyBub2RlIGZvciB0aGUgbm90aWZpZWQgb2JqZWN0CisgKiAgICAgICAgICAgICAgbm90aWZ5X3ZhbHVlICAgIC0gVmFsdWUgZnJvbSB0aGUgTm90aWZ5KCkgcmVxdWVzdAorICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogRGlzcGF0Y2ggYSBkZXZpY2Ugbm90aWZpY2F0aW9uIGV2ZW50IHRvIGEgcHJldmlvdXNseQorICogICAgICAgICAgICAgIGluc3RhbGxlZCBoYW5kbGVyLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2FjcGlfc3RhdHVzCithY3BpX2V2X3F1ZXVlX25vdGlmeV9yZXF1ZXN0KHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICogbm9kZSwKKwkJCSAgICAgdTMyIG5vdGlmeV92YWx1ZSkKK3sKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYzsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpoYW5kbGVyX29iaiA9IE5VTEw7CisJdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICpub3RpZnlfaW5mbzsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKKworCUFDUElfRlVOQ1RJT05fTkFNRShldl9xdWV1ZV9ub3RpZnlfcmVxdWVzdCk7CisKKwkvKgorCSAqIEZvciB2YWx1ZSAzIChFamVjdGlvbiBSZXF1ZXN0KSwgc29tZSBkZXZpY2UgbWV0aG9kIG1heSBuZWVkIHRvIGJlIHJ1bi4KKwkgKiBGb3IgdmFsdWUgMiAoRGV2aWNlIFdha2UpIGlmIF9QUlcgZXhpc3RzLCB0aGUgX1BTMCBtZXRob2QgbWF5IG5lZWQKKwkgKiAgIHRvIGJlIHJ1bi4KKwkgKiBGb3IgdmFsdWUgMHg4MCAoU3RhdHVzIENoYW5nZSkgb24gdGhlIHBvd2VyIGJ1dHRvbiBvciBzbGVlcCBidXR0b24sCisJICogICBpbml0aWF0ZSBzb2Z0LW9mZiBvciBzbGVlcCBvcGVyYXRpb24/CisJICovCisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLAorCQkJICAiRGlzcGF0Y2hpbmcgTm90aWZ5IG9uIFslNC40c10gTm9kZSAlcCBWYWx1ZSAweCUyLjJYICglcylcbiIsCisJCQkgIGFjcGlfdXRfZ2V0X25vZGVfbmFtZShub2RlKSwgbm9kZSwgbm90aWZ5X3ZhbHVlLAorCQkJICBhY3BpX3V0X2dldF9ub3RpZnlfbmFtZShub3RpZnlfdmFsdWUpKSk7CisKKwkvKiBHZXQgdGhlIG5vdGlmeSBvYmplY3QgYXR0YWNoZWQgdG8gdGhlIE5TIE5vZGUgKi8KKworCW9ial9kZXNjID0gYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0KG5vZGUpOworCWlmIChvYmpfZGVzYykgeworCisJCS8qIFdlIGhhdmUgdGhlIG5vdGlmeSBvYmplY3QsIEdldCB0aGUgcmlnaHQgaGFuZGxlciAqLworCisJCXN3aXRjaCAobm9kZS0+dHlwZSkgeworCisJCQkvKiBOb3RpZnkgYWxsb3dlZCBvbmx5IG9uIHRoZXNlIHR5cGVzICovCisKKwkJY2FzZSBBQ1BJX1RZUEVfREVWSUNFOgorCQljYXNlIEFDUElfVFlQRV9USEVSTUFMOgorCQljYXNlIEFDUElfVFlQRV9QUk9DRVNTT1I6CisKKwkJCWlmIChub3RpZnlfdmFsdWUgPD0gQUNQSV9NQVhfU1lTX05PVElGWSkgeworCQkJCWhhbmRsZXJfb2JqID0KKwkJCQkgICAgb2JqX2Rlc2MtPmNvbW1vbl9ub3RpZnkuc3lzdGVtX25vdGlmeTsKKwkJCX0gZWxzZSB7CisJCQkJaGFuZGxlcl9vYmogPQorCQkJCSAgICBvYmpfZGVzYy0+Y29tbW9uX25vdGlmeS5kZXZpY2Vfbm90aWZ5OworCQkJfQorCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKworCQkJLyogQWxsIG90aGVyIHR5cGVzIGFyZSBub3Qgc3VwcG9ydGVkICovCisKKwkJCXJldHVybiAoQUVfVFlQRSk7CisJCX0KKwl9CisKKwkvKgorCSAqIElmIHRoZXJlIGlzIGFueSBoYW5kbGVyIHRvIHJ1biwgc2NoZWR1bGUgdGhlIGRpc3BhdGNoZXIuCisJICogQ2hlY2sgZm9yOgorCSAqIDEpIEdsb2JhbCBzeXN0ZW0gbm90aWZ5IGhhbmRsZXIKKwkgKiAyKSBHbG9iYWwgZGV2aWNlIG5vdGlmeSBoYW5kbGVyCisJICogMykgUGVyLWRldmljZSBub3RpZnkgaGFuZGxlcgorCSAqLworCWlmICgoYWNwaV9nYmxfc3lzdGVtX25vdGlmeS5oYW5kbGVyCisJICAgICAmJiAobm90aWZ5X3ZhbHVlIDw9IEFDUElfTUFYX1NZU19OT1RJRlkpKQorCSAgICB8fCAoYWNwaV9nYmxfZGV2aWNlX25vdGlmeS5oYW5kbGVyCisJCSYmIChub3RpZnlfdmFsdWUgPiBBQ1BJX01BWF9TWVNfTk9USUZZKSkgfHwgaGFuZGxlcl9vYmopIHsKKwkJbm90aWZ5X2luZm8gPSBhY3BpX3V0X2NyZWF0ZV9nZW5lcmljX3N0YXRlKCk7CisJCWlmICghbm90aWZ5X2luZm8pIHsKKwkJCXJldHVybiAoQUVfTk9fTUVNT1JZKTsKKwkJfQorCisJCWlmICghaGFuZGxlcl9vYmopIHsKKwkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywKKwkJCQkJICAiRXhlY3V0aW5nIHN5c3RlbSBub3RpZnkgaGFuZGxlciBmb3IgTm90aWZ5ICglNC40cywgJVgpIG5vZGUgJXBcbiIsCisJCQkJCSAgYWNwaV91dF9nZXRfbm9kZV9uYW1lKG5vZGUpLAorCQkJCQkgIG5vdGlmeV92YWx1ZSwgbm9kZSkpOworCQl9CisKKwkJbm90aWZ5X2luZm8tPmNvbW1vbi5kZXNjcmlwdG9yX3R5cGUgPQorCQkgICAgQUNQSV9ERVNDX1RZUEVfU1RBVEVfTk9USUZZOworCQlub3RpZnlfaW5mby0+bm90aWZ5Lm5vZGUgPSBub2RlOworCQlub3RpZnlfaW5mby0+bm90aWZ5LnZhbHVlID0gKHUxNikgbm90aWZ5X3ZhbHVlOworCQlub3RpZnlfaW5mby0+bm90aWZ5LmhhbmRsZXJfb2JqID0gaGFuZGxlcl9vYmo7CisKKwkJc3RhdHVzID0KKwkJICAgIGFjcGlfb3NfZXhlY3V0ZShPU0xfTk9USUZZX0hBTkRMRVIsIGFjcGlfZXZfbm90aWZ5X2Rpc3BhdGNoLAorCQkJCSAgICBub3RpZnlfaW5mbyk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJYWNwaV91dF9kZWxldGVfZ2VuZXJpY19zdGF0ZShub3RpZnlfaW5mbyk7CisJCX0KKwl9IGVsc2UgeworCQkvKiBUaGVyZSBpcyBubyBub3RpZnkgaGFuZGxlciAocGVyLWRldmljZSBvciBzeXN0ZW0pIGZvciB0aGlzIGRldmljZSAqLworCisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywKKwkJCQkgICJObyBub3RpZnkgaGFuZGxlciBmb3IgTm90aWZ5ICglNC40cywgJVgpIG5vZGUgJXBcbiIsCisJCQkJICBhY3BpX3V0X2dldF9ub2RlX25hbWUobm9kZSksIG5vdGlmeV92YWx1ZSwKKwkJCQkgIG5vZGUpKTsKKwl9CisKKwlyZXR1cm4gKHN0YXR1cyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfZXZfbm90aWZ5X2Rpc3BhdGNoCisgKgorICogUEFSQU1FVEVSUzogIENvbnRleHQgICAgICAgICAtIFRvIGJlIHBhc3NlZCB0byB0aGUgbm90aWZ5IGhhbmRsZXIKKyAqCisgKiBSRVRVUk46ICAgICAgTm9uZS4KKyAqCisgKiBERVNDUklQVElPTjogRGlzcGF0Y2ggYSBkZXZpY2Ugbm90aWZpY2F0aW9uIGV2ZW50IHRvIGEgcHJldmlvdXNseQorICogICAgICAgICAgICAgIGluc3RhbGxlZCBoYW5kbGVyLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkIEFDUElfU1lTVEVNX1hGQUNFIGFjcGlfZXZfbm90aWZ5X2Rpc3BhdGNoKHZvaWQgKmNvbnRleHQpCit7CisJdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICpub3RpZnlfaW5mbyA9CisJICAgICh1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgKiljb250ZXh0OworCWFjcGlfbm90aWZ5X2hhbmRsZXIgZ2xvYmFsX2hhbmRsZXIgPSBOVUxMOworCXZvaWQgKmdsb2JhbF9jb250ZXh0ID0gTlVMTDsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpoYW5kbGVyX29iajsKKworCUFDUElfRlVOQ1RJT05fRU5UUlkoKTsKKworCS8qCisJICogV2Ugd2lsbCBpbnZva2UgYSBnbG9iYWwgbm90aWZ5IGhhbmRsZXIgaWYgaW5zdGFsbGVkLiBUaGlzIGlzIGRvbmUKKwkgKiBfYmVmb3JlXyB3ZSBpbnZva2UgdGhlIHBlci1kZXZpY2UgaGFuZGxlciBhdHRhY2hlZCB0byB0aGUgZGV2aWNlLgorCSAqLworCWlmIChub3RpZnlfaW5mby0+bm90aWZ5LnZhbHVlIDw9IEFDUElfTUFYX1NZU19OT1RJRlkpIHsKKworCQkvKiBHbG9iYWwgc3lzdGVtIG5vdGlmaWNhdGlvbiBoYW5kbGVyICovCisKKwkJaWYgKGFjcGlfZ2JsX3N5c3RlbV9ub3RpZnkuaGFuZGxlcikgeworCQkJZ2xvYmFsX2hhbmRsZXIgPSBhY3BpX2dibF9zeXN0ZW1fbm90aWZ5LmhhbmRsZXI7CisJCQlnbG9iYWxfY29udGV4dCA9IGFjcGlfZ2JsX3N5c3RlbV9ub3RpZnkuY29udGV4dDsKKwkJfQorCX0gZWxzZSB7CisJCS8qIEdsb2JhbCBkcml2ZXIgbm90aWZpY2F0aW9uIGhhbmRsZXIgKi8KKworCQlpZiAoYWNwaV9nYmxfZGV2aWNlX25vdGlmeS5oYW5kbGVyKSB7CisJCQlnbG9iYWxfaGFuZGxlciA9IGFjcGlfZ2JsX2RldmljZV9ub3RpZnkuaGFuZGxlcjsKKwkJCWdsb2JhbF9jb250ZXh0ID0gYWNwaV9nYmxfZGV2aWNlX25vdGlmeS5jb250ZXh0OworCQl9CisJfQorCisJLyogSW52b2tlIHRoZSBzeXN0ZW0gaGFuZGxlciBmaXJzdCwgaWYgcHJlc2VudCAqLworCisJaWYgKGdsb2JhbF9oYW5kbGVyKSB7CisJCWdsb2JhbF9oYW5kbGVyKG5vdGlmeV9pbmZvLT5ub3RpZnkubm9kZSwKKwkJCSAgICAgICBub3RpZnlfaW5mby0+bm90aWZ5LnZhbHVlLCBnbG9iYWxfY29udGV4dCk7CisJfQorCisJLyogTm93IGludm9rZSB0aGUgcGVyLWRldmljZSBoYW5kbGVyLCBpZiBwcmVzZW50ICovCisKKwloYW5kbGVyX29iaiA9IG5vdGlmeV9pbmZvLT5ub3RpZnkuaGFuZGxlcl9vYmo7CisJaWYgKGhhbmRsZXJfb2JqKSB7CisJCWhhbmRsZXJfb2JqLT5ub3RpZnkuaGFuZGxlcihub3RpZnlfaW5mby0+bm90aWZ5Lm5vZGUsCisJCQkJCSAgICBub3RpZnlfaW5mby0+bm90aWZ5LnZhbHVlLAorCQkJCQkgICAgaGFuZGxlcl9vYmotPm5vdGlmeS5jb250ZXh0KTsKKwl9CisKKwkvKiBBbGwgZG9uZSB3aXRoIHRoZSBpbmZvIG9iamVjdCAqLworCisJYWNwaV91dF9kZWxldGVfZ2VuZXJpY19zdGF0ZShub3RpZnlfaW5mbyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfZXZfZ2xvYmFsX2xvY2tfaGFuZGxlcgorICoKKyAqIFBBUkFNRVRFUlM6ICBDb250ZXh0ICAgICAgICAgLSBGcm9tIHRocmVhZCBpbnRlcmZhY2UsIG5vdCB1c2VkCisgKgorICogUkVUVVJOOiAgICAgIEFDUElfSU5URVJSVVBUX0hBTkRMRUQKKyAqCisgKiBERVNDUklQVElPTjogSW52b2tlZCBkaXJlY3RseSBmcm9tIHRoZSBTQ0kgaGFuZGxlciB3aGVuIGEgZ2xvYmFsIGxvY2sKKyAqICAgICAgICAgICAgICByZWxlYXNlIGludGVycnVwdCBvY2N1cnMuIEF0dGVtcHQgdG8gYWNxdWlyZSB0aGUgZ2xvYmFsIGxvY2ssCisgKiAgICAgICAgICAgICAgaWYgc3VjY2Vzc2Z1bCwgc2lnbmFsIHRoZSB0aHJlYWQgd2FpdGluZyBmb3IgdGhlIGxvY2suCisgKgorICogTk9URTogQXNzdW1lcyB0aGF0IHRoZSBzZW1hcGhvcmUgY2FuIGJlIHNpZ25hbGVkIGZyb20gaW50ZXJydXB0IGxldmVsLiBJZgorICogdGhpcyBpcyBub3QgcG9zc2libGUgZm9yIHNvbWUgcmVhc29uLCBhIHNlcGFyYXRlIHRocmVhZCB3aWxsIGhhdmUgdG8gYmUKKyAqIHNjaGVkdWxlZCB0byBkbyB0aGlzLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB1MzIgYWNwaV9ldl9nbG9iYWxfbG9ja19oYW5kbGVyKHZvaWQgKmNvbnRleHQpCit7CisJdTggYWNxdWlyZWQgPSBGQUxTRTsKKworCS8qCisJICogQXR0ZW1wdCB0byBnZXQgdGhlIGxvY2suCisJICoKKwkgKiBJZiB3ZSBkb24ndCBnZXQgaXQgbm93LCBpdCB3aWxsIGJlIG1hcmtlZCBwZW5kaW5nIGFuZCB3ZSB3aWxsCisJICogdGFrZSBhbm90aGVyIGludGVycnVwdCB3aGVuIGl0IGJlY29tZXMgZnJlZS4KKwkgKi8KKwlBQ1BJX0FDUVVJUkVfR0xPQkFMX0xPQ0soYWNwaV9nYmxfRkFDUywgYWNxdWlyZWQpOworCWlmIChhY3F1aXJlZCkgeworCisJCS8qIEdvdCB0aGUgbG9jaywgbm93IHdha2UgYWxsIHRocmVhZHMgd2FpdGluZyBmb3IgaXQgKi8KKworCQlhY3BpX2dibF9nbG9iYWxfbG9ja19hY3F1aXJlZCA9IFRSVUU7CisJCS8qIFNlbmQgYSB1bml0IHRvIHRoZSBzZW1hcGhvcmUgKi8KKworCQlpZiAoQUNQSV9GQUlMVVJFCisJCSAgICAoYWNwaV9vc19zaWduYWxfc2VtYXBob3JlCisJCSAgICAgKGFjcGlfZ2JsX2dsb2JhbF9sb2NrX3NlbWFwaG9yZSwgMSkpKSB7CisJCQlBQ1BJX0VSUk9SKChBRV9JTkZPLAorCQkJCSAgICAiQ291bGQgbm90IHNpZ25hbCBHbG9iYWwgTG9jayBzZW1hcGhvcmUiKSk7CisJCX0KKwl9CisKKwlyZXR1cm4gKEFDUElfSU5URVJSVVBUX0hBTkRMRUQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX2V2X2luaXRfZ2xvYmFsX2xvY2tfaGFuZGxlcgorICoKKyAqIFBBUkFNRVRFUlM6ICBOb25lCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBJbnN0YWxsIGEgaGFuZGxlciBmb3IgdGhlIGdsb2JhbCBsb2NrIHJlbGVhc2UgZXZlbnQKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCithY3BpX3N0YXR1cyBhY3BpX2V2X2luaXRfZ2xvYmFsX2xvY2tfaGFuZGxlcih2b2lkKQoreworCWFjcGlfc3RhdHVzIHN0YXR1czsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0UoZXZfaW5pdF9nbG9iYWxfbG9ja19oYW5kbGVyKTsKKworCS8qIEF0dGVtcHQgaW5zdGFsbGF0aW9uIG9mIHRoZSBnbG9iYWwgbG9jayBoYW5kbGVyICovCisKKwlzdGF0dXMgPSBhY3BpX2luc3RhbGxfZml4ZWRfZXZlbnRfaGFuZGxlcihBQ1BJX0VWRU5UX0dMT0JBTCwKKwkJCQkJCSAgYWNwaV9ldl9nbG9iYWxfbG9ja19oYW5kbGVyLAorCQkJCQkJICBOVUxMKTsKKworCS8qCisJICogSWYgdGhlIGdsb2JhbCBsb2NrIGRvZXMgbm90IGV4aXN0IG9uIHRoaXMgcGxhdGZvcm0sIHRoZSBhdHRlbXB0IHRvCisJICogZW5hYmxlIEdCTF9TVEFUVVMgd2lsbCBmYWlsICh0aGUgR0JMX0VOQUJMRSBiaXQgd2lsbCBub3Qgc3RpY2spLgorCSAqIE1hcCB0byBBRV9PSywgYnV0IG1hcmsgZ2xvYmFsIGxvY2sgYXMgbm90IHByZXNlbnQuIEFueSBhdHRlbXB0IHRvCisJICogYWN0dWFsbHkgdXNlIHRoZSBnbG9iYWwgbG9jayB3aWxsIGJlIGZsYWdnZWQgd2l0aCBhbiBlcnJvci4KKwkgKi8KKwlpZiAoc3RhdHVzID09IEFFX05PX0hBUkRXQVJFX1JFU1BPTlNFKSB7CisJCUFDUElfRVJST1IoKEFFX0lORk8sCisJCQkgICAgIk5vIHJlc3BvbnNlIGZyb20gR2xvYmFsIExvY2sgaGFyZHdhcmUsIGRpc2FibGluZyBsb2NrIikpOworCisJCWFjcGlfZ2JsX2dsb2JhbF9sb2NrX3ByZXNlbnQgPSBGQUxTRTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKKwl9CisKKwlhY3BpX2dibF9nbG9iYWxfbG9ja19wcmVzZW50ID0gVFJVRTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9ldl9yZW1vdmVfZ2xvYmFsX2xvY2tfaGFuZGxlcgorICoKKyAqIFBBUkFNRVRFUlM6ICBOb25lCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBSZW1vdmUgdGhlIGhhbmRsZXIgZm9yIHRoZSBHbG9iYWwgTG9jaworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBhY3BpX3N0YXR1cyBhY3BpX2V2X3JlbW92ZV9nbG9iYWxfbG9ja19oYW5kbGVyKHZvaWQpCit7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCisJQUNQSV9GVU5DVElPTl9UUkFDRShldl9yZW1vdmVfZ2xvYmFsX2xvY2tfaGFuZGxlcik7CisKKwlhY3BpX2dibF9nbG9iYWxfbG9ja19wcmVzZW50ID0gRkFMU0U7CisJc3RhdHVzID0gYWNwaV9yZW1vdmVfZml4ZWRfZXZlbnRfaGFuZGxlcihBQ1BJX0VWRU5UX0dMT0JBTCwKKwkJCQkJCSBhY3BpX2V2X2dsb2JhbF9sb2NrX2hhbmRsZXIpOworCisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9ldl9hY3F1aXJlX2dsb2JhbF9sb2NrCisgKgorICogUEFSQU1FVEVSUzogIFRpbWVvdXQgICAgICAgICAtIE1heCB0aW1lIHRvIHdhaXQgZm9yIHRoZSBsb2NrLCBpbiBtaWxsaXNlYy4KKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IEF0dGVtcHQgdG8gZ2FpbiBvd25lcnNoaXAgb2YgdGhlIEdsb2JhbCBMb2NrLgorICoKKyAqIE1VVEVYOiAgICAgICBJbnRlcnByZXRlciBtdXN0IGJlIGxvY2tlZAorICoKKyAqIE5vdGU6IFRoZSBvcmlnaW5hbCBpbXBsZW1lbnRhdGlvbiBhbGxvd2VkIG11bHRpcGxlIHRocmVhZHMgdG8gImFjcXVpcmUiIHRoZQorICogR2xvYmFsIExvY2ssIGFuZCB0aGUgT1Mgd291bGQgaG9sZCB0aGUgbG9jayB1bnRpbCB0aGUgbGFzdCB0aHJlYWQgaGFkCisgKiByZWxlYXNlZCBpdC4gSG93ZXZlciwgdGhpcyBjb3VsZCBwb3RlbnRpYWxseSBzdGFydmUgdGhlIEJJT1Mgb3V0IG9mIHRoZQorICogbG9jaywgZXNwZWNpYWxseSBpbiB0aGUgY2FzZSB3aGVyZSB0aGVyZSBpcyBhIHRpZ2h0IGhhbmRzaGFrZSBiZXR3ZWVuIHRoZQorICogRW1iZWRkZWQgQ29udHJvbGxlciBkcml2ZXIgYW5kIHRoZSBCSU9TLiBUaGVyZWZvcmUsIHRoaXMgaW1wbGVtZW50YXRpb24KKyAqIGFsbG93cyBvbmx5IG9uZSB0aHJlYWQgdG8gYWNxdWlyZSB0aGUgSFcgR2xvYmFsIExvY2sgYXQgYSB0aW1lLCBhbmQgbWFrZXMKKyAqIHRoZSBnbG9iYWwgbG9jayBhcHBlYXIgYXMgYSBzdGFuZGFyZCBtdXRleCBvbiB0aGUgT1Mgc2lkZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYWNwaV90aHJlYWRfaWQgYWNwaV9ldl9nbG9iYWxfbG9ja190aHJlYWRfaWQ7CitzdGF0aWMgaW50IGFjcGlfZXZfZ2xvYmFsX2xvY2tfYWNxdWlyZWQ7CisKK2FjcGlfc3RhdHVzIGFjcGlfZXZfYWNxdWlyZV9nbG9iYWxfbG9jayh1MTYgdGltZW91dCkKK3sKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKKwl1OCBhY3F1aXJlZCA9IEZBTFNFOworCisJQUNQSV9GVU5DVElPTl9UUkFDRShldl9hY3F1aXJlX2dsb2JhbF9sb2NrKTsKKworCS8qCisJICogT25seSBvbmUgdGhyZWFkIGNhbiBhY3F1aXJlIHRoZSBHTCBhdCBhIHRpbWUsIHRoZSBnbG9iYWxfbG9ja19tdXRleAorCSAqIGVuZm9yY2VzIHRoaXMuIFRoaXMgaW50ZXJmYWNlIHJlbGVhc2VzIHRoZSBpbnRlcnByZXRlciBpZiB3ZSBtdXN0IHdhaXQuCisJICovCisJc3RhdHVzID0gYWNwaV9leF9zeXN0ZW1fd2FpdF9tdXRleCgKKwkJCWFjcGlfZ2JsX2dsb2JhbF9sb2NrX211dGV4LT5tdXRleC5vc19tdXRleCwgMCk7CisJaWYgKHN0YXR1cyA9PSBBRV9USU1FKSB7CisJCWlmIChhY3BpX2V2X2dsb2JhbF9sb2NrX3RocmVhZF9pZCA9PSBhY3BpX29zX2dldF90aHJlYWRfaWQoKSkgeworCQkJYWNwaV9ldl9nbG9iYWxfbG9ja19hY3F1aXJlZCsrOworCQkJcmV0dXJuIEFFX09LOworCQl9CisJfQorCisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXN0YXR1cyA9IGFjcGlfZXhfc3lzdGVtX3dhaXRfbXV0ZXgoCisJCQkJYWNwaV9nYmxfZ2xvYmFsX2xvY2tfbXV0ZXgtPm11dGV4Lm9zX211dGV4LAorCQkJCXRpbWVvdXQpOworCX0KKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CisJfQorCisJYWNwaV9ldl9nbG9iYWxfbG9ja190aHJlYWRfaWQgPSBhY3BpX29zX2dldF90aHJlYWRfaWQoKTsKKwlhY3BpX2V2X2dsb2JhbF9sb2NrX2FjcXVpcmVkKys7CisKKwkvKgorCSAqIFVwZGF0ZSB0aGUgZ2xvYmFsIGxvY2sgaGFuZGxlIGFuZCBjaGVjayBmb3Igd3JhcGFyb3VuZC4gVGhlIGhhbmRsZSBpcworCSAqIG9ubHkgdXNlZCBmb3IgdGhlIGV4dGVybmFsIGdsb2JhbCBsb2NrIGludGVyZmFjZXMsIGJ1dCBpdCBpcyB1cGRhdGVkCisJICogaGVyZSB0byBwcm9wZXJseSBoYW5kbGUgdGhlIGNhc2Ugd2hlcmUgYSBzaW5nbGUgdGhyZWFkIG1heSBhY3F1aXJlIHRoZQorCSAqIGxvY2sgdmlhIGJvdGggdGhlIEFNTCBhbmQgdGhlIGFjcGlfYWNxdWlyZV9nbG9iYWxfbG9jayBpbnRlcmZhY2VzLiBUaGUKKwkgKiBoYW5kbGUgaXMgdGhlcmVmb3JlIHVwZGF0ZWQgb24gdGhlIGZpcnN0IGFjcXVpcmUgZnJvbSBhIGdpdmVuIHRocmVhZAorCSAqIHJlZ2FyZGxlc3Mgb2Ygd2hlcmUgdGhlIGFjcXVpc2l0aW9uIHJlcXVlc3Qgb3JpZ2luYXRlZC4KKwkgKi8KKwlhY3BpX2dibF9nbG9iYWxfbG9ja19oYW5kbGUrKzsKKwlpZiAoYWNwaV9nYmxfZ2xvYmFsX2xvY2tfaGFuZGxlID09IDApIHsKKwkJYWNwaV9nYmxfZ2xvYmFsX2xvY2tfaGFuZGxlID0gMTsKKwl9CisKKwkvKgorCSAqIE1ha2Ugc3VyZSB0aGF0IGEgZ2xvYmFsIGxvY2sgYWN0dWFsbHkgZXhpc3RzLiBJZiBub3QsIGp1c3QgdHJlYXQgdGhlCisJICogbG9jayBhcyBhIHN0YW5kYXJkIG11dGV4LgorCSAqLworCWlmICghYWNwaV9nYmxfZ2xvYmFsX2xvY2tfcHJlc2VudCkgeworCQlhY3BpX2dibF9nbG9iYWxfbG9ja19hY3F1aXJlZCA9IFRSVUU7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CisJfQorCisJLyogQXR0ZW1wdCB0byBhY3F1aXJlIHRoZSBhY3R1YWwgaGFyZHdhcmUgbG9jayAqLworCisJQUNQSV9BQ1FVSVJFX0dMT0JBTF9MT0NLKGFjcGlfZ2JsX0ZBQ1MsIGFjcXVpcmVkKTsKKwlpZiAoYWNxdWlyZWQpIHsKKworCQkvKiBXZSBnb3QgdGhlIGxvY2sgKi8KKworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VYRUMsCisJCQkJICAiQWNxdWlyZWQgaGFyZHdhcmUgR2xvYmFsIExvY2tcbiIpKTsKKworCQlhY3BpX2dibF9nbG9iYWxfbG9ja19hY3F1aXJlZCA9IFRSVUU7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CisJfQorCisJLyoKKwkgKiBEaWQgbm90IGdldCB0aGUgbG9jay4gVGhlIHBlbmRpbmcgYml0IHdhcyBzZXQgYWJvdmUsIGFuZCB3ZSBtdXN0IG5vdworCSAqIHdhaXQgdW50aWwgd2UgZ2V0IHRoZSBnbG9iYWwgbG9jayByZWxlYXNlZCBpbnRlcnJ1cHQuCisJICovCisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FWEVDLCAiV2FpdGluZyBmb3IgaGFyZHdhcmUgR2xvYmFsIExvY2tcbiIpKTsKKworCS8qCisJICogV2FpdCBmb3IgaGFuZHNoYWtlIHdpdGggdGhlIGdsb2JhbCBsb2NrIGludGVycnVwdCBoYW5kbGVyLgorCSAqIFRoaXMgaW50ZXJmYWNlIHJlbGVhc2VzIHRoZSBpbnRlcnByZXRlciBpZiB3ZSBtdXN0IHdhaXQuCisJICovCisJc3RhdHVzID0gYWNwaV9leF9zeXN0ZW1fd2FpdF9zZW1hcGhvcmUoYWNwaV9nYmxfZ2xvYmFsX2xvY2tfc2VtYXBob3JlLAorCQkJCQkgICAgICAgQUNQSV9XQUlUX0ZPUkVWRVIpOworCisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfZXZfcmVsZWFzZV9nbG9iYWxfbG9jaworICoKKyAqIFBBUkFNRVRFUlM6ICBOb25lCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBSZWxlYXNlcyBvd25lcnNoaXAgb2YgdGhlIEdsb2JhbCBMb2NrLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2FjcGlfc3RhdHVzIGFjcGlfZXZfcmVsZWFzZV9nbG9iYWxfbG9jayh2b2lkKQoreworCXU4IHBlbmRpbmcgPSBGQUxTRTsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0UoZXZfcmVsZWFzZV9nbG9iYWxfbG9jayk7CisKKwkvKiBMb2NrIG11c3QgYmUgYWxyZWFkeSBhY3F1aXJlZCAqLworCisJaWYgKCFhY3BpX2dibF9nbG9iYWxfbG9ja19hY3F1aXJlZCkgeworCQlBQ1BJX1dBUk5JTkcoKEFFX0lORk8sCisJCQkgICAgICAiQ2Fubm90IHJlbGVhc2UgdGhlIEFDUEkgR2xvYmFsIExvY2ssIGl0IGhhcyBub3QgYmVlbiBhY3F1aXJlZCIpKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PVF9BQ1FVSVJFRCk7CisJfQorCisJYWNwaV9ldl9nbG9iYWxfbG9ja19hY3F1aXJlZC0tOworCWlmIChhY3BpX2V2X2dsb2JhbF9sb2NrX2FjcXVpcmVkID4gMCkgeworCQlyZXR1cm4gQUVfT0s7CisJfQorCisJaWYgKGFjcGlfZ2JsX2dsb2JhbF9sb2NrX3ByZXNlbnQpIHsKKworCQkvKiBBbGxvdyBhbnkgdGhyZWFkIHRvIHJlbGVhc2UgdGhlIGxvY2sgKi8KKworCQlBQ1BJX1JFTEVBU0VfR0xPQkFMX0xPQ0soYWNwaV9nYmxfRkFDUywgcGVuZGluZyk7CisKKwkJLyoKKwkJICogSWYgdGhlIHBlbmRpbmcgYml0IHdhcyBzZXQsIHdlIG11c3Qgd3JpdGUgR0JMX1JMUyB0byB0aGUgY29udHJvbAorCQkgKiByZWdpc3RlcgorCQkgKi8KKwkJaWYgKHBlbmRpbmcpIHsKKwkJCXN0YXR1cyA9CisJCQkgICAgYWNwaV9zZXRfcmVnaXN0ZXIoQUNQSV9CSVRSRUdfR0xPQkFMX0xPQ0tfUkVMRUFTRSwKKwkJCQkJICAgICAgMSk7CisJCX0KKworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VYRUMsCisJCQkJICAiUmVsZWFzZWQgaGFyZHdhcmUgR2xvYmFsIExvY2tcbiIpKTsKKwl9CisKKwlhY3BpX2dibF9nbG9iYWxfbG9ja19hY3F1aXJlZCA9IEZBTFNFOworCisJLyogUmVsZWFzZSB0aGUgbG9jYWwgR0wgbXV0ZXggKi8KKwlhY3BpX2V2X2dsb2JhbF9sb2NrX3RocmVhZF9pZCA9IE5VTEw7CisJYWNwaV9ldl9nbG9iYWxfbG9ja19hY3F1aXJlZCA9IDA7CisJYWNwaV9vc19yZWxlYXNlX211dGV4KGFjcGlfZ2JsX2dsb2JhbF9sb2NrX211dGV4LT5tdXRleC5vc19tdXRleCk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9ldl90ZXJtaW5hdGUKKyAqCisgKiBQQVJBTUVURVJTOiAgbm9uZQorICoKKyAqIFJFVFVSTjogICAgICBub25lCisgKgorICogREVTQ1JJUFRJT046IERpc2FibGUgZXZlbnRzIGFuZCBmcmVlIG1lbW9yeSBhbGxvY2F0ZWQgZm9yIHRhYmxlIHN0b3JhZ2UuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBhY3BpX2V2X3Rlcm1pbmF0ZSh2b2lkKQoreworCXUzMiBpOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0UoZXZfdGVybWluYXRlKTsKKworCWlmIChhY3BpX2dibF9ldmVudHNfaW5pdGlhbGl6ZWQpIHsKKwkJLyoKKwkJICogRGlzYWJsZSBhbGwgZXZlbnQtcmVsYXRlZCBmdW5jdGlvbmFsaXR5LiBJbiBhbGwgY2FzZXMsIG9uIGVycm9yLAorCQkgKiBwcmludCBhIG1lc3NhZ2UgYnV0IG9idmlvdXNseSB3ZSBkb24ndCBhYm9ydC4KKwkJICovCisKKwkJLyogRGlzYWJsZSBhbGwgZml4ZWQgZXZlbnRzICovCisKKwkJZm9yIChpID0gMDsgaSA8IEFDUElfTlVNX0ZJWEVEX0VWRU5UUzsgaSsrKSB7CisJCQlzdGF0dXMgPSBhY3BpX2Rpc2FibGVfZXZlbnQoaSwgMCk7CisJCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCQlBQ1BJX0VSUk9SKChBRV9JTkZPLAorCQkJCQkgICAgIkNvdWxkIG5vdCBkaXNhYmxlIGZpeGVkIGV2ZW50ICVkIiwKKwkJCQkJICAgICh1MzIpIGkpKTsKKwkJCX0KKwkJfQorCisJCS8qIERpc2FibGUgYWxsIEdQRXMgaW4gYWxsIEdQRSBibG9ja3MgKi8KKworCQlzdGF0dXMgPSBhY3BpX2V2X3dhbGtfZ3BlX2xpc3QoYWNwaV9od19kaXNhYmxlX2dwZV9ibG9jaywgTlVMTCk7CisKKwkJLyogUmVtb3ZlIFNDSSBoYW5kbGVyICovCisKKwkJc3RhdHVzID0gYWNwaV9ldl9yZW1vdmVfc2NpX2hhbmRsZXIoKTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQlBQ1BJX0VSUk9SKChBRV9JTkZPLCAiQ291bGQgbm90IHJlbW92ZSBTQ0kgaGFuZGxlciIpKTsKKwkJfQorCisJCXN0YXR1cyA9IGFjcGlfZXZfcmVtb3ZlX2dsb2JhbF9sb2NrX2hhbmRsZXIoKTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQlBQ1BJX0VSUk9SKChBRV9JTkZPLAorCQkJCSAgICAiQ291bGQgbm90IHJlbW92ZSBHbG9iYWwgTG9jayBoYW5kbGVyIikpOworCQl9CisJfQorCisJLyogRGVhbGxvY2F0ZSBhbGwgaGFuZGxlciBvYmplY3RzIGluc3RhbGxlZCB3aXRoaW4gR1BFIGluZm8gc3RydWN0cyAqLworCisJc3RhdHVzID0gYWNwaV9ldl93YWxrX2dwZV9saXN0KGFjcGlfZXZfZGVsZXRlX2dwZV9oYW5kbGVycywgTlVMTCk7CisKKwkvKiBSZXR1cm4gdG8gb3JpZ2luYWwgbW9kZSBpZiBuZWNlc3NhcnkgKi8KKworCWlmIChhY3BpX2dibF9vcmlnaW5hbF9tb2RlID09IEFDUElfU1lTX01PREVfTEVHQUNZKSB7CisJCXN0YXR1cyA9IGFjcGlfZGlzYWJsZSgpOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCUFDUElfV0FSTklORygoQUVfSU5GTywgIkFjcGlEaXNhYmxlIGZhaWxlZCIpKTsKKwkJfQorCX0KKwlyZXR1cm5fVk9JRDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXZyZWdpb24uYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXZyZWdpb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjVjMDg4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS9ldnJlZ2lvbi5jCkBAIC0wLDAgKzEsMTA3MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIE1vZHVsZSBOYW1lOiBldnJlZ2lvbiAtIEFDUEkgYWRkcmVzc19zcGFjZSAob3BfcmVnaW9uKSBoYW5kbGVyIGRpc3BhdGNoCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwOCwgSW50ZWwgQ29ycC4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKKyAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIGF0IG1pbmltdW0gYSBkaXNjbGFpbWVyCisgKiAgICBzdWJzdGFudGlhbGx5IHNpbWlsYXIgdG8gdGhlICJOTyBXQVJSQU5UWSIgZGlzY2xhaW1lciBiZWxvdworICogICAgKCJEaXNjbGFpbWVyIikgYW5kIGFueSByZWRpc3RyaWJ1dGlvbiBtdXN0IGJlIGNvbmRpdGlvbmVkIHVwb24KKyAqICAgIGluY2x1ZGluZyBhIHN1YnN0YW50aWFsbHkgc2ltaWxhciBEaXNjbGFpbWVyIHJlcXVpcmVtZW50IGZvciBmdXJ0aGVyCisgKiAgICBiaW5hcnkgcmVkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMKKyAqICAgIG9mIGFueSBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogTk8gV0FSUkFOVFkKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HCisgKiBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KKyAqLworCisjaW5jbHVkZSA8YWNwaS9hY3BpLmg+CisjaW5jbHVkZSAiYWNjb21tb24uaCIKKyNpbmNsdWRlICJhY2V2ZW50cy5oIgorI2luY2x1ZGUgImFjbmFtZXNwLmgiCisjaW5jbHVkZSAiYWNpbnRlcnAuaCIKKworI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfRVZFTlRTCitBQ1BJX01PRFVMRV9OQU1FKCJldnJlZ2lvbiIpCisKKy8qIExvY2FsIHByb3RvdHlwZXMgKi8KK3N0YXRpYyBhY3BpX3N0YXR1cworYWNwaV9ldl9yZWdfcnVuKGFjcGlfaGFuZGxlIG9ial9oYW5kbGUsCisJCXUzMiBsZXZlbCwgdm9pZCAqY29udGV4dCwgdm9pZCAqKnJldHVybl92YWx1ZSk7CisKK3N0YXRpYyBhY3BpX3N0YXR1cworYWNwaV9ldl9pbnN0YWxsX2hhbmRsZXIoYWNwaV9oYW5kbGUgb2JqX2hhbmRsZSwKKwkJCXUzMiBsZXZlbCwgdm9pZCAqY29udGV4dCwgdm9pZCAqKnJldHVybl92YWx1ZSk7CisKKy8qIFRoZXNlIGFyZSB0aGUgYWRkcmVzcyBzcGFjZXMgdGhhdCB3aWxsIGdldCBkZWZhdWx0IGhhbmRsZXJzICovCisKKyNkZWZpbmUgQUNQSV9OVU1fREVGQVVMVF9TUEFDRVMgICAgIDQKKworc3RhdGljIHU4IGFjcGlfZ2JsX2RlZmF1bHRfYWRkcmVzc19zcGFjZXNbQUNQSV9OVU1fREVGQVVMVF9TUEFDRVNdID0geworCUFDUElfQURSX1NQQUNFX1NZU1RFTV9NRU1PUlksCisJQUNQSV9BRFJfU1BBQ0VfU1lTVEVNX0lPLAorCUFDUElfQURSX1NQQUNFX1BDSV9DT05GSUcsCisJQUNQSV9BRFJfU1BBQ0VfREFUQV9UQUJMRQorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9ldl9pbnN0YWxsX3JlZ2lvbl9oYW5kbGVycworICoKKyAqIFBBUkFNRVRFUlM6ICBOb25lCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBJbnN0YWxscyB0aGUgY29yZSBzdWJzeXN0ZW0gZGVmYXVsdCBhZGRyZXNzIHNwYWNlIGhhbmRsZXJzLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2FjcGlfc3RhdHVzIGFjcGlfZXZfaW5zdGFsbF9yZWdpb25faGFuZGxlcnModm9pZCkKK3sKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJdTMyIGk7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGV2X2luc3RhbGxfcmVnaW9uX2hhbmRsZXJzKTsKKworCXN0YXR1cyA9IGFjcGlfdXRfYWNxdWlyZV9tdXRleChBQ1BJX01UWF9OQU1FU1BBQ0UpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKKwl9CisKKwkvKgorCSAqIEFsbCBhZGRyZXNzIHNwYWNlcyAoUENJIENvbmZpZywgRUMsIFNNQnVzKSBhcmUgc2NvcGUgZGVwZW5kZW50IGFuZAorCSAqIHJlZ2lzdHJhdGlvbiBtdXN0IG9jY3VyIGZvciBhIHNwZWNpZmljIGRldmljZS4KKwkgKgorCSAqIEluIHRoZSBjYXNlIG9mIHRoZSBzeXN0ZW0gbWVtb3J5IGFuZCBJTyBhZGRyZXNzIHNwYWNlcyB0aGVyZSBpcworCSAqIGN1cnJlbnRseSBubyBkZXZpY2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBhZGRyZXNzIHNwYWNlLiBGb3IgdGhlc2Ugd2UKKwkgKiB1c2UgdGhlIHJvb3QuCisJICoKKwkgKiBXZSBpbnN0YWxsIHRoZSBkZWZhdWx0IFBDSSBjb25maWcgc3BhY2UgaGFuZGxlciBhdCB0aGUgcm9vdCBzbyB0aGF0CisJICogdGhpcyBzcGFjZSBpcyBpbW1lZGlhdGVseSBhdmFpbGFibGUgZXZlbiB0aG91Z2ggdGhlIHdlIGhhdmUgbm90CisJICogZW51bWVyYXRlZCBhbGwgdGhlIFBDSSBSb290IEJ1c2VzIHlldC4gVGhpcyBpcyB0byBjb25mb3JtIHRvIHRoZSBBQ1BJCisJICogc3BlY2lmaWNhdGlvbiB3aGljaCBzdGF0ZXMgdGhhdCB0aGUgUENJIGNvbmZpZyBzcGFjZSBtdXN0IGJlIGFsd2F5cworCSAqIGF2YWlsYWJsZSAtLSBldmVuIHRob3VnaCB3ZSBhcmUgbm93aGVyZSBuZWFyIHJlYWR5IHRvIGZpbmQgdGhlIFBDSSByb290CisJICogYnVzZXMgYXQgdGhpcyBwb2ludC4KKwkgKgorCSAqIE5PVEU6IFdlIGlnbm9yZSBBRV9BTFJFQURZX0VYSVNUUyBiZWNhdXNlIHRoaXMgbWVhbnMgdGhhdCBhIGhhbmRsZXIKKwkgKiBoYXMgYWxyZWFkeSBiZWVuIGluc3RhbGxlZCAodmlhIGFjcGlfaW5zdGFsbF9hZGRyZXNzX3NwYWNlX2hhbmRsZXIpLgorCSAqIFNpbWlsYXIgZm9yIEFFX1NBTUVfSEFORExFUi4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgQUNQSV9OVU1fREVGQVVMVF9TUEFDRVM7IGkrKykgeworCQlzdGF0dXMgPSBhY3BpX2V2X2luc3RhbGxfc3BhY2VfaGFuZGxlcihhY3BpX2dibF9yb290X25vZGUsCisJCQkJCQkgICAgICAgYWNwaV9nYmxfZGVmYXVsdF9hZGRyZXNzX3NwYWNlcworCQkJCQkJICAgICAgIFtpXSwKKwkJCQkJCSAgICAgICBBQ1BJX0RFRkFVTFRfSEFORExFUiwKKwkJCQkJCSAgICAgICBOVUxMLCBOVUxMKTsKKwkJc3dpdGNoIChzdGF0dXMpIHsKKwkJY2FzZSBBRV9PSzoKKwkJY2FzZSBBRV9TQU1FX0hBTkRMRVI6CisJCWNhc2UgQUVfQUxSRUFEWV9FWElTVFM6CisKKwkJCS8qIFRoZXNlIGV4Y2VwdGlvbnMgYXJlIGFsbCBPSyAqLworCisJCQlzdGF0dXMgPSBBRV9PSzsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisKKwkJCWdvdG8gdW5sb2NrX2FuZF9leGl0OworCQl9CisJfQorCisgICAgICB1bmxvY2tfYW5kX2V4aXQ6CisJKHZvaWQpYWNwaV91dF9yZWxlYXNlX211dGV4KEFDUElfTVRYX05BTUVTUEFDRSk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfZXZfaW5pdGlhbGl6ZV9vcF9yZWdpb25zCisgKgorICogUEFSQU1FVEVSUzogIE5vbmUKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IEV4ZWN1dGUgX1JFRyBtZXRob2RzIGZvciBhbGwgT3BlcmF0aW9uIFJlZ2lvbnMgdGhhdCBoYXZlCisgKiAgICAgICAgICAgICAgYW4gaW5zdGFsbGVkIGRlZmF1bHQgcmVnaW9uIGhhbmRsZXIuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworYWNwaV9zdGF0dXMgYWNwaV9ldl9pbml0aWFsaXplX29wX3JlZ2lvbnModm9pZCkKK3sKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJdTMyIGk7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGV2X2luaXRpYWxpemVfb3BfcmVnaW9ucyk7CisKKwlzdGF0dXMgPSBhY3BpX3V0X2FjcXVpcmVfbXV0ZXgoQUNQSV9NVFhfTkFNRVNQQUNFKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CisJfQorCisJLyogUnVuIHRoZSBfUkVHIG1ldGhvZHMgZm9yIG9wX3JlZ2lvbnMgaW4gZWFjaCBkZWZhdWx0IGFkZHJlc3Mgc3BhY2UgKi8KKworCWZvciAoaSA9IDA7IGkgPCBBQ1BJX05VTV9ERUZBVUxUX1NQQUNFUzsgaSsrKSB7CisJCS8qCisJCSAqIFRCRDogTWFrZSBzdXJlIGhhbmRsZXIgaXMgdGhlIERFRkFVTFQgaGFuZGxlciwgb3RoZXJ3aXNlCisJCSAqIF9SRUcgd2lsbCBoYXZlIGFscmVhZHkgYmVlbiBydW4uCisJCSAqLworCQlzdGF0dXMgPSBhY3BpX2V2X2V4ZWN1dGVfcmVnX21ldGhvZHMoYWNwaV9nYmxfcm9vdF9ub2RlLAorCQkJCQkJICAgICBhY3BpX2dibF9kZWZhdWx0X2FkZHJlc3Nfc3BhY2VzCisJCQkJCQkgICAgIFtpXSk7CisJfQorCisJKHZvaWQpYWNwaV91dF9yZWxlYXNlX211dGV4KEFDUElfTVRYX05BTUVTUEFDRSk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfZXZfZXhlY3V0ZV9yZWdfbWV0aG9kCisgKgorICogUEFSQU1FVEVSUzogIHJlZ2lvbl9vYmogICAgICAgICAgLSBSZWdpb24gb2JqZWN0CisgKiAgICAgICAgICAgICAgRnVuY3Rpb24gICAgICAgICAgICAtIFBhc3NlZCB0byBfUkVHOiBPbiAoMSkgb3IgT2ZmICgwKQorICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogRXhlY3V0ZSBfUkVHIG1ldGhvZCBmb3IgYSByZWdpb24KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCithY3BpX3N0YXR1cworYWNwaV9ldl9leGVjdXRlX3JlZ19tZXRob2QodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqcmVnaW9uX29iaiwgdTMyIGZ1bmN0aW9uKQoreworCXN0cnVjdCBhY3BpX2V2YWx1YXRlX2luZm8gKmluZm87CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqYXJnc1szXTsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpyZWdpb25fb2JqMjsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGV2X2V4ZWN1dGVfcmVnX21ldGhvZCk7CisKKwlyZWdpb25fb2JqMiA9IGFjcGlfbnNfZ2V0X3NlY29uZGFyeV9vYmplY3QocmVnaW9uX29iaik7CisJaWYgKCFyZWdpb25fb2JqMikgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9UX0VYSVNUKTsKKwl9CisKKwlpZiAocmVnaW9uX29iajItPmV4dHJhLm1ldGhvZF9SRUcgPT0gTlVMTCkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOworCX0KKworCS8qIEFsbG9jYXRlIGFuZCBpbml0aWFsaXplIHRoZSBldmFsdWF0aW9uIGluZm9ybWF0aW9uIGJsb2NrICovCisKKwlpbmZvID0gQUNQSV9BTExPQ0FURV9aRVJPRUQoc2l6ZW9mKHN0cnVjdCBhY3BpX2V2YWx1YXRlX2luZm8pKTsKKwlpZiAoIWluZm8pIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX01FTU9SWSk7CisJfQorCisJaW5mby0+cHJlZml4X25vZGUgPSByZWdpb25fb2JqMi0+ZXh0cmEubWV0aG9kX1JFRzsKKwlpbmZvLT5wYXRobmFtZSA9IE5VTEw7CisJaW5mby0+cGFyYW1ldGVycyA9IGFyZ3M7CisJaW5mby0+ZmxhZ3MgPSBBQ1BJX0lHTk9SRV9SRVRVUk5fVkFMVUU7CisKKwkvKgorCSAqIFRoZSBfUkVHIG1ldGhvZCBoYXMgdHdvIGFyZ3VtZW50czoKKwkgKgorCSAqIEFyZzAgLSBJbnRlZ2VyOgorCSAqICBPcGVyYXRpb24gcmVnaW9uIHNwYWNlIElEIFNhbWUgdmFsdWUgYXMgcmVnaW9uX29iai0+UmVnaW9uLnNwYWNlX2lkCisJICoKKwkgKiBBcmcxIC0gSW50ZWdlcjoKKwkgKiAgY29ubmVjdGlvbiBzdGF0dXMgMSBmb3IgY29ubmVjdGluZyB0aGUgaGFuZGxlciwgMCBmb3IgZGlzY29ubmVjdGluZworCSAqICB0aGUgaGFuZGxlciAoUGFzc2VkIGFzIGEgcGFyYW1ldGVyKQorCSAqLworCWFyZ3NbMF0gPSBhY3BpX3V0X2NyZWF0ZV9pbnRlcm5hbF9vYmplY3QoQUNQSV9UWVBFX0lOVEVHRVIpOworCWlmICghYXJnc1swXSkgeworCQlzdGF0dXMgPSBBRV9OT19NRU1PUlk7CisJCWdvdG8gY2xlYW51cDE7CisJfQorCisJYXJnc1sxXSA9IGFjcGlfdXRfY3JlYXRlX2ludGVybmFsX29iamVjdChBQ1BJX1RZUEVfSU5URUdFUik7CisJaWYgKCFhcmdzWzFdKSB7CisJCXN0YXR1cyA9IEFFX05PX01FTU9SWTsKKwkJZ290byBjbGVhbnVwMjsKKwl9CisKKwkvKiBTZXR1cCB0aGUgcGFyYW1ldGVyIG9iamVjdHMgKi8KKworCWFyZ3NbMF0tPmludGVnZXIudmFsdWUgPSByZWdpb25fb2JqLT5yZWdpb24uc3BhY2VfaWQ7CisJYXJnc1sxXS0+aW50ZWdlci52YWx1ZSA9IGZ1bmN0aW9uOworCWFyZ3NbMl0gPSBOVUxMOworCisJLyogRXhlY3V0ZSB0aGUgbWV0aG9kLCBubyByZXR1cm4gdmFsdWUgKi8KKworCUFDUElfREVCVUdfRVhFQyhhY3BpX3V0X2Rpc3BsYXlfaW5pdF9wYXRobmFtZQorCQkJKEFDUElfVFlQRV9NRVRIT0QsIGluZm8tPnByZWZpeF9ub2RlLCBOVUxMKSk7CisKKwlzdGF0dXMgPSBhY3BpX25zX2V2YWx1YXRlKGluZm8pOworCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZShhcmdzWzFdKTsKKworICAgICAgY2xlYW51cDI6CisJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKGFyZ3NbMF0pOworCisgICAgICBjbGVhbnVwMToKKwlBQ1BJX0ZSRUUoaW5mbyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfZXZfYWRkcmVzc19zcGFjZV9kaXNwYXRjaAorICoKKyAqIFBBUkFNRVRFUlM6ICByZWdpb25fb2JqICAgICAgICAgIC0gSW50ZXJuYWwgcmVnaW9uIG9iamVjdAorICogICAgICAgICAgICAgIEZ1bmN0aW9uICAgICAgICAgICAgLSBSZWFkIG9yIFdyaXRlIG9wZXJhdGlvbgorICogICAgICAgICAgICAgIEFkZHJlc3MgICAgICAgICAgICAgLSBXaGVyZSBpbiB0aGUgc3BhY2UgdG8gcmVhZCBvciB3cml0ZQorICogICAgICAgICAgICAgIGJpdF93aWR0aCAgICAgICAgICAgLSBGaWVsZCB3aWR0aCBpbiBiaXRzICg4LCAxNiwgMzIsIG9yIDY0KQorICogICAgICAgICAgICAgIFZhbHVlICAgICAgICAgICAgICAgLSBQb2ludGVyIHRvIGluIG9yIG91dCB2YWx1ZSwgbXVzdCBiZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdWxsIDY0LWJpdCBhY3BpX2ludGVnZXIKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IERpc3BhdGNoIGFuIGFkZHJlc3Mgc3BhY2Ugb3Igb3BlcmF0aW9uIHJlZ2lvbiBhY2Nlc3MgdG8KKyAqICAgICAgICAgICAgICBhIHByZXZpb3VzbHkgaW5zdGFsbGVkIGhhbmRsZXIuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworYWNwaV9zdGF0dXMKK2FjcGlfZXZfYWRkcmVzc19zcGFjZV9kaXNwYXRjaCh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpyZWdpb25fb2JqLAorCQkJICAgICAgIHUzMiBmdW5jdGlvbiwKKwkJCSAgICAgICBhY3BpX3BoeXNpY2FsX2FkZHJlc3MgYWRkcmVzcywKKwkJCSAgICAgICB1MzIgYml0X3dpZHRoLCBhY3BpX2ludGVnZXIgKiB2YWx1ZSkKK3sKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJYWNwaV9hZHJfc3BhY2VfaGFuZGxlciBoYW5kbGVyOworCWFjcGlfYWRyX3NwYWNlX3NldHVwIHJlZ2lvbl9zZXR1cDsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpoYW5kbGVyX2Rlc2M7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqcmVnaW9uX29iajI7CisJdm9pZCAqcmVnaW9uX2NvbnRleHQgPSBOVUxMOworCisJQUNQSV9GVU5DVElPTl9UUkFDRShldl9hZGRyZXNzX3NwYWNlX2Rpc3BhdGNoKTsKKworCXJlZ2lvbl9vYmoyID0gYWNwaV9uc19nZXRfc2Vjb25kYXJ5X29iamVjdChyZWdpb25fb2JqKTsKKwlpZiAoIXJlZ2lvbl9vYmoyKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT1RfRVhJU1QpOworCX0KKworCS8qIEVuc3VyZSB0aGF0IHRoZXJlIGlzIGEgaGFuZGxlciBhc3NvY2lhdGVkIHdpdGggdGhpcyByZWdpb24gKi8KKworCWhhbmRsZXJfZGVzYyA9IHJlZ2lvbl9vYmotPnJlZ2lvbi5oYW5kbGVyOworCWlmICghaGFuZGxlcl9kZXNjKSB7CisJCUFDUElfRVJST1IoKEFFX0lORk8sCisJCQkgICAgIk5vIGhhbmRsZXIgZm9yIFJlZ2lvbiBbJTQuNHNdICglcCkgWyVzXSIsCisJCQkgICAgYWNwaV91dF9nZXRfbm9kZV9uYW1lKHJlZ2lvbl9vYmotPnJlZ2lvbi5ub2RlKSwKKwkJCSAgICByZWdpb25fb2JqLAorCQkJICAgIGFjcGlfdXRfZ2V0X3JlZ2lvbl9uYW1lKHJlZ2lvbl9vYmotPnJlZ2lvbi4KKwkJCQkJCSAgICBzcGFjZV9pZCkpKTsKKworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9UX0VYSVNUKTsKKwl9CisKKwkvKgorCSAqIEl0IG1heSBiZSB0aGUgY2FzZSB0aGF0IHRoZSByZWdpb24gaGFzIG5ldmVyIGJlZW4gaW5pdGlhbGl6ZWQuCisJICogU29tZSB0eXBlcyBvZiByZWdpb25zIHJlcXVpcmUgc3BlY2lhbCBpbml0IGNvZGUKKwkgKi8KKwlpZiAoIShyZWdpb25fb2JqLT5yZWdpb24uZmxhZ3MgJiBBT1BPQkpfU0VUVVBfQ09NUExFVEUpKSB7CisKKwkJLyogVGhpcyByZWdpb24gaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkIHlldCwgZG8gaXQgKi8KKworCQlyZWdpb25fc2V0dXAgPSBoYW5kbGVyX2Rlc2MtPmFkZHJlc3Nfc3BhY2Uuc2V0dXA7CisJCWlmICghcmVnaW9uX3NldHVwKSB7CisKKwkJCS8qIE5vIGluaXRpYWxpemF0aW9uIHJvdXRpbmUsIGV4aXQgd2l0aCBlcnJvciAqLworCisJCQlBQ1BJX0VSUk9SKChBRV9JTkZPLAorCQkJCSAgICAiTm8gaW5pdCByb3V0aW5lIGZvciByZWdpb24oJXApIFslc10iLAorCQkJCSAgICByZWdpb25fb2JqLAorCQkJCSAgICBhY3BpX3V0X2dldF9yZWdpb25fbmFtZShyZWdpb25fb2JqLT5yZWdpb24uCisJCQkJCQkJICAgIHNwYWNlX2lkKSkpOworCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PVF9FWElTVCk7CisJCX0KKworCQkvKgorCQkgKiBXZSBtdXN0IGV4aXQgdGhlIGludGVycHJldGVyIGJlY2F1c2UgdGhlIHJlZ2lvbiBzZXR1cCB3aWxsCisJCSAqIHBvdGVudGlhbGx5IGV4ZWN1dGUgY29udHJvbCBtZXRob2RzIChmb3IgZXhhbXBsZSwgdGhlIF9SRUcgbWV0aG9kCisJCSAqIGZvciB0aGlzIHJlZ2lvbikKKwkJICovCisJCWFjcGlfZXhfZXhpdF9pbnRlcnByZXRlcigpOworCisJCXN0YXR1cyA9IHJlZ2lvbl9zZXR1cChyZWdpb25fb2JqLCBBQ1BJX1JFR0lPTl9BQ1RJVkFURSwKKwkJCQkgICAgICBoYW5kbGVyX2Rlc2MtPmFkZHJlc3Nfc3BhY2UuY29udGV4dCwKKwkJCQkgICAgICAmcmVnaW9uX2NvbnRleHQpOworCisJCS8qIFJlLWVudGVyIHRoZSBpbnRlcnByZXRlciAqLworCisJCWFjcGlfZXhfZW50ZXJfaW50ZXJwcmV0ZXIoKTsKKworCQkvKiBDaGVjayBmb3IgZmFpbHVyZSBvZiB0aGUgUmVnaW9uIFNldHVwICovCisKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQlBQ1BJX0VYQ0VQVElPTigoQUVfSU5GTywgc3RhdHVzLAorCQkJCQkiRHVyaW5nIHJlZ2lvbiBpbml0aWFsaXphdGlvbjogWyVzXSIsCisJCQkJCWFjcGlfdXRfZ2V0X3JlZ2lvbl9uYW1lKHJlZ2lvbl9vYmotPgorCQkJCQkJCQlyZWdpb24uCisJCQkJCQkJCXNwYWNlX2lkKSkpOworCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CisJCX0KKworCQkvKiBSZWdpb24gaW5pdGlhbGl6YXRpb24gbWF5IGhhdmUgYmVlbiBjb21wbGV0ZWQgYnkgcmVnaW9uX3NldHVwICovCisKKwkJaWYgKCEocmVnaW9uX29iai0+cmVnaW9uLmZsYWdzICYgQU9QT0JKX1NFVFVQX0NPTVBMRVRFKSkgeworCQkJcmVnaW9uX29iai0+cmVnaW9uLmZsYWdzIHw9IEFPUE9CSl9TRVRVUF9DT01QTEVURTsKKworCQkJaWYgKHJlZ2lvbl9vYmoyLT5leHRyYS5yZWdpb25fY29udGV4dCkgeworCisJCQkJLyogVGhlIGhhbmRsZXIgZm9yIHRoaXMgcmVnaW9uIHdhcyBhbHJlYWR5IGluc3RhbGxlZCAqLworCisJCQkJQUNQSV9GUkVFKHJlZ2lvbl9jb250ZXh0KTsKKwkJCX0gZWxzZSB7CisJCQkJLyoKKwkJCQkgKiBTYXZlIHRoZSByZXR1cm5lZCBjb250ZXh0IGZvciB1c2UgaW4gYWxsIGFjY2Vzc2VzIHRvCisJCQkJICogdGhpcyBwYXJ0aWN1bGFyIHJlZ2lvbgorCQkJCSAqLworCQkJCXJlZ2lvbl9vYmoyLT5leHRyYS5yZWdpb25fY29udGV4dCA9CisJCQkJICAgIHJlZ2lvbl9jb250ZXh0OworCQkJfQorCQl9CisJfQorCisJLyogV2UgaGF2ZSBldmVyeXRoaW5nIHdlIG5lZWQsIHdlIGNhbiBpbnZva2UgdGhlIGFkZHJlc3Mgc3BhY2UgaGFuZGxlciAqLworCisJaGFuZGxlciA9IGhhbmRsZXJfZGVzYy0+YWRkcmVzc19zcGFjZS5oYW5kbGVyOworCisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9PUFJFR0lPTiwKKwkJCSAgIkhhbmRsZXIgJXAgKEAlcCkgQWRkcmVzcyAlOC44WCU4LjhYIFslc11cbiIsCisJCQkgICZyZWdpb25fb2JqLT5yZWdpb24uaGFuZGxlci0+YWRkcmVzc19zcGFjZSwgaGFuZGxlciwKKwkJCSAgQUNQSV9GT1JNQVRfTkFUSVZFX1VJTlQoYWRkcmVzcyksCisJCQkgIGFjcGlfdXRfZ2V0X3JlZ2lvbl9uYW1lKHJlZ2lvbl9vYmotPnJlZ2lvbi4KKwkJCQkJCSAgc3BhY2VfaWQpKSk7CisKKwlpZiAoIShoYW5kbGVyX2Rlc2MtPmFkZHJlc3Nfc3BhY2UuaGFuZGxlcl9mbGFncyAmCisJICAgICAgQUNQSV9BRERSX0hBTkRMRVJfREVGQVVMVF9JTlNUQUxMRUQpKSB7CisJCS8qCisJCSAqIEZvciBoYW5kbGVycyBvdGhlciB0aGFuIHRoZSBkZWZhdWx0IChzdXBwbGllZCkgaGFuZGxlcnMsIHdlIG11c3QKKwkJICogZXhpdCB0aGUgaW50ZXJwcmV0ZXIgYmVjYXVzZSB0aGUgaGFuZGxlciAqbWlnaHQqIGJsb2NrIC0tIHdlIGRvbid0CisJCSAqIGtub3cgd2hhdCBpdCB3aWxsIGRvLCBzbyB3ZSBjYW4ndCBob2xkIHRoZSBsb2NrIG9uIHRoZSBpbnRlcHJldGVyLgorCQkgKi8KKwkJYWNwaV9leF9leGl0X2ludGVycHJldGVyKCk7CisJfQorCisJLyogQ2FsbCB0aGUgaGFuZGxlciAqLworCisJc3RhdHVzID0gaGFuZGxlcihmdW5jdGlvbiwgYWRkcmVzcywgYml0X3dpZHRoLCB2YWx1ZSwKKwkJCSBoYW5kbGVyX2Rlc2MtPmFkZHJlc3Nfc3BhY2UuY29udGV4dCwKKwkJCSByZWdpb25fb2JqMi0+ZXh0cmEucmVnaW9uX2NvbnRleHQpOworCisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCUFDUElfRVhDRVBUSU9OKChBRV9JTkZPLCBzdGF0dXMsICJSZXR1cm5lZCBieSBIYW5kbGVyIGZvciBbJXNdIiwKKwkJCQlhY3BpX3V0X2dldF9yZWdpb25fbmFtZShyZWdpb25fb2JqLT5yZWdpb24uCisJCQkJCQkJc3BhY2VfaWQpKSk7CisJfQorCisJaWYgKCEoaGFuZGxlcl9kZXNjLT5hZGRyZXNzX3NwYWNlLmhhbmRsZXJfZmxhZ3MgJgorCSAgICAgIEFDUElfQUREUl9IQU5ETEVSX0RFRkFVTFRfSU5TVEFMTEVEKSkgeworCQkvKgorCQkgKiBXZSBqdXN0IHJldHVybmVkIGZyb20gYSBub24tZGVmYXVsdCBoYW5kbGVyLCB3ZSBtdXN0IHJlLWVudGVyIHRoZQorCQkgKiBpbnRlcnByZXRlcgorCQkgKi8KKwkJYWNwaV9leF9lbnRlcl9pbnRlcnByZXRlcigpOworCX0KKworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX2V2X2RldGFjaF9yZWdpb24KKyAqCisgKiBQQVJBTUVURVJTOiAgcmVnaW9uX29iaiAgICAgICAgICAtIFJlZ2lvbiBPYmplY3QKKyAqICAgICAgICAgICAgICBhY3BpX25zX2lzX2xvY2tlZCAgIC0gTmFtZXNwYWNlIFJlZ2lvbiBBbHJlYWR5IExvY2tlZD8KKyAqCisgKiBSRVRVUk46ICAgICAgTm9uZQorICoKKyAqIERFU0NSSVBUSU9OOiBCcmVhayB0aGUgYXNzb2NpYXRpb24gYmV0d2VlbiB0aGUgaGFuZGxlciBhbmQgdGhlIHJlZ2lvbgorICogICAgICAgICAgICAgIHRoaXMgaXMgYSB0d28gd2F5IGFzc29jaWF0aW9uLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQKK2FjcGlfZXZfZGV0YWNoX3JlZ2lvbih1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpyZWdpb25fb2JqLAorCQkgICAgICB1OCBhY3BpX25zX2lzX2xvY2tlZCkKK3sKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpoYW5kbGVyX29iajsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYzsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICoqbGFzdF9vYmpfcHRyOworCWFjcGlfYWRyX3NwYWNlX3NldHVwIHJlZ2lvbl9zZXR1cDsKKwl2b2lkICoqcmVnaW9uX2NvbnRleHQ7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqcmVnaW9uX29iajI7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCisJQUNQSV9GVU5DVElPTl9UUkFDRShldl9kZXRhY2hfcmVnaW9uKTsKKworCXJlZ2lvbl9vYmoyID0gYWNwaV9uc19nZXRfc2Vjb25kYXJ5X29iamVjdChyZWdpb25fb2JqKTsKKwlpZiAoIXJlZ2lvbl9vYmoyKSB7CisJCXJldHVybl9WT0lEOworCX0KKwlyZWdpb25fY29udGV4dCA9ICZyZWdpb25fb2JqMi0+ZXh0cmEucmVnaW9uX2NvbnRleHQ7CisKKwkvKiBHZXQgdGhlIGFkZHJlc3MgaGFuZGxlciBmcm9tIHRoZSByZWdpb24gb2JqZWN0ICovCisKKwloYW5kbGVyX29iaiA9IHJlZ2lvbl9vYmotPnJlZ2lvbi5oYW5kbGVyOworCWlmICghaGFuZGxlcl9vYmopIHsKKworCQkvKiBUaGlzIHJlZ2lvbiBoYXMgbm8gaGFuZGxlciwgYWxsIGRvbmUgKi8KKworCQlyZXR1cm5fVk9JRDsKKwl9CisKKwkvKiBGaW5kIHRoaXMgcmVnaW9uIGluIHRoZSBoYW5kbGVyJ3MgbGlzdCAqLworCisJb2JqX2Rlc2MgPSBoYW5kbGVyX29iai0+YWRkcmVzc19zcGFjZS5yZWdpb25fbGlzdDsKKwlsYXN0X29ial9wdHIgPSAmaGFuZGxlcl9vYmotPmFkZHJlc3Nfc3BhY2UucmVnaW9uX2xpc3Q7CisKKwl3aGlsZSAob2JqX2Rlc2MpIHsKKworCQkvKiBJcyB0aGlzIHRoZSBjb3JyZWN0IFJlZ2lvbj8gKi8KKworCQlpZiAob2JqX2Rlc2MgPT0gcmVnaW9uX29iaikgeworCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9PUFJFR0lPTiwKKwkJCQkJICAiUmVtb3ZpbmcgUmVnaW9uICVwIGZyb20gYWRkcmVzcyBoYW5kbGVyICVwXG4iLAorCQkJCQkgIHJlZ2lvbl9vYmosIGhhbmRsZXJfb2JqKSk7CisKKwkJCS8qIFRoaXMgaXMgaXQsIHJlbW92ZSBpdCBmcm9tIHRoZSBoYW5kbGVyJ3MgbGlzdCAqLworCisJCQkqbGFzdF9vYmpfcHRyID0gb2JqX2Rlc2MtPnJlZ2lvbi5uZXh0OworCQkJb2JqX2Rlc2MtPnJlZ2lvbi5uZXh0ID0gTlVMTDsJLyogTXVzdCBjbGVhciBmaWVsZCAqLworCisJCQlpZiAoYWNwaV9uc19pc19sb2NrZWQpIHsKKwkJCQlzdGF0dXMgPQorCQkJCSAgICBhY3BpX3V0X3JlbGVhc2VfbXV0ZXgoQUNQSV9NVFhfTkFNRVNQQUNFKTsKKwkJCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCQkJcmV0dXJuX1ZPSUQ7CisJCQkJfQorCQkJfQorCisJCQkvKiBOb3cgc3RvcCByZWdpb24gYWNjZXNzZXMgYnkgZXhlY3V0aW5nIHRoZSBfUkVHIG1ldGhvZCAqLworCisJCQlzdGF0dXMgPSBhY3BpX2V2X2V4ZWN1dGVfcmVnX21ldGhvZChyZWdpb25fb2JqLCAwKTsKKwkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJCUFDUElfRVhDRVBUSU9OKChBRV9JTkZPLCBzdGF0dXMsCisJCQkJCQkiZnJvbSByZWdpb24gX1JFRywgWyVzXSIsCisJCQkJCQlhY3BpX3V0X2dldF9yZWdpb25fbmFtZQorCQkJCQkJKHJlZ2lvbl9vYmotPnJlZ2lvbi5zcGFjZV9pZCkpKTsKKwkJCX0KKworCQkJaWYgKGFjcGlfbnNfaXNfbG9ja2VkKSB7CisJCQkJc3RhdHVzID0KKwkJCQkgICAgYWNwaV91dF9hY3F1aXJlX211dGV4KEFDUElfTVRYX05BTUVTUEFDRSk7CisJCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQkJCXJldHVybl9WT0lEOworCQkJCX0KKwkJCX0KKworCQkJLyoKKwkJCSAqIElmIHRoZSByZWdpb24gaGFzIGJlZW4gYWN0aXZhdGVkLCBjYWxsIHRoZSBzZXR1cCBoYW5kbGVyIHdpdGgKKwkJCSAqIHRoZSBkZWFjdGl2YXRlIG5vdGlmaWNhdGlvbgorCQkJICovCisJCQlpZiAocmVnaW9uX29iai0+cmVnaW9uLmZsYWdzICYgQU9QT0JKX1NFVFVQX0NPTVBMRVRFKSB7CisJCQkJcmVnaW9uX3NldHVwID0gaGFuZGxlcl9vYmotPmFkZHJlc3Nfc3BhY2Uuc2V0dXA7CisJCQkJc3RhdHVzID0KKwkJCQkgICAgcmVnaW9uX3NldHVwKHJlZ2lvbl9vYmosCisJCQkJCQkgQUNQSV9SRUdJT05fREVBQ1RJVkFURSwKKwkJCQkJCSBoYW5kbGVyX29iai0+YWRkcmVzc19zcGFjZS4KKwkJCQkJCSBjb250ZXh0LCByZWdpb25fY29udGV4dCk7CisKKwkJCQkvKiBJbml0IHJvdXRpbmUgbWF5IGZhaWwsIEp1c3QgaWdub3JlIGVycm9ycyAqLworCisJCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQkJCUFDUElfRVhDRVBUSU9OKChBRV9JTkZPLCBzdGF0dXMsCisJCQkJCQkJImZyb20gcmVnaW9uIGhhbmRsZXIgLSBkZWFjdGl2YXRlLCBbJXNdIiwKKwkJCQkJCQlhY3BpX3V0X2dldF9yZWdpb25fbmFtZQorCQkJCQkJCShyZWdpb25fb2JqLT5yZWdpb24uCisJCQkJCQkJIHNwYWNlX2lkKSkpOworCQkJCX0KKworCQkJCXJlZ2lvbl9vYmotPnJlZ2lvbi5mbGFncyAmPQorCQkJCSAgICB+KEFPUE9CSl9TRVRVUF9DT01QTEVURSk7CisJCQl9CisKKwkJCS8qCisJCQkgKiBSZW1vdmUgaGFuZGxlciByZWZlcmVuY2UgaW4gdGhlIHJlZ2lvbgorCQkJICoKKwkJCSAqIE5PVEU6IHRoaXMgZG9lc24ndCBtZWFuIHRoYXQgdGhlIHJlZ2lvbiBnb2VzIGF3YXksIHRoZSByZWdpb24KKwkJCSAqIGlzIGp1c3QgaW5hY2Nlc3NpYmxlIGFzIGluZGljYXRlZCB0byB0aGUgX1JFRyBtZXRob2QKKwkJCSAqCisJCQkgKiBJZiB0aGUgcmVnaW9uIGlzIG9uIHRoZSBoYW5kbGVyJ3MgbGlzdCwgdGhpcyBtdXN0IGJlIHRoZQorCQkJICogcmVnaW9uJ3MgaGFuZGxlcgorCQkJICovCisJCQlyZWdpb25fb2JqLT5yZWdpb24uaGFuZGxlciA9IE5VTEw7CisJCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UoaGFuZGxlcl9vYmopOworCisJCQlyZXR1cm5fVk9JRDsKKwkJfQorCisJCS8qIFdhbGsgdGhlIGxpbmtlZCBsaXN0IG9mIGhhbmRsZXJzICovCisKKwkJbGFzdF9vYmpfcHRyID0gJm9ial9kZXNjLT5yZWdpb24ubmV4dDsKKwkJb2JqX2Rlc2MgPSBvYmpfZGVzYy0+cmVnaW9uLm5leHQ7CisJfQorCisJLyogSWYgd2UgZ2V0IGhlcmUsIHRoZSByZWdpb24gd2FzIG5vdCBpbiB0aGUgaGFuZGxlcidzIHJlZ2lvbiBsaXN0ICovCisKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX09QUkVHSU9OLAorCQkJICAiQ2Fubm90IHJlbW92ZSByZWdpb24gJXAgZnJvbSBhZGRyZXNzIGhhbmRsZXIgJXBcbiIsCisJCQkgIHJlZ2lvbl9vYmosIGhhbmRsZXJfb2JqKSk7CisKKwlyZXR1cm5fVk9JRDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9ldl9hdHRhY2hfcmVnaW9uCisgKgorICogUEFSQU1FVEVSUzogIGhhbmRsZXJfb2JqICAgICAgICAgLSBIYW5kbGVyIE9iamVjdAorICogICAgICAgICAgICAgIHJlZ2lvbl9vYmogICAgICAgICAgLSBSZWdpb24gT2JqZWN0CisgKiAgICAgICAgICAgICAgYWNwaV9uc19pc19sb2NrZWQgICAtIE5hbWVzcGFjZSBSZWdpb24gQWxyZWFkeSBMb2NrZWQ/CisgKgorICogUkVUVVJOOiAgICAgIE5vbmUKKyAqCisgKiBERVNDUklQVElPTjogQ3JlYXRlIHRoZSBhc3NvY2lhdGlvbiBiZXR3ZWVuIHRoZSBoYW5kbGVyIGFuZCB0aGUgcmVnaW9uCisgKiAgICAgICAgICAgICAgdGhpcyBpcyBhIHR3byB3YXkgYXNzb2NpYXRpb24uCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworYWNwaV9zdGF0dXMKK2FjcGlfZXZfYXR0YWNoX3JlZ2lvbih1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpoYW5kbGVyX29iaiwKKwkJICAgICAgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqcmVnaW9uX29iaiwKKwkJICAgICAgdTggYWNwaV9uc19pc19sb2NrZWQpCit7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGV2X2F0dGFjaF9yZWdpb24pOworCisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9PUFJFR0lPTiwKKwkJCSAgIkFkZGluZyBSZWdpb24gWyU0LjRzXSAlcCB0byBhZGRyZXNzIGhhbmRsZXIgJXAgWyVzXVxuIiwKKwkJCSAgYWNwaV91dF9nZXRfbm9kZV9uYW1lKHJlZ2lvbl9vYmotPnJlZ2lvbi5ub2RlKSwKKwkJCSAgcmVnaW9uX29iaiwgaGFuZGxlcl9vYmosCisJCQkgIGFjcGlfdXRfZ2V0X3JlZ2lvbl9uYW1lKHJlZ2lvbl9vYmotPnJlZ2lvbi4KKwkJCQkJCSAgc3BhY2VfaWQpKSk7CisKKwkvKiBMaW5rIHRoaXMgcmVnaW9uIHRvIHRoZSBmcm9udCBvZiB0aGUgaGFuZGxlcidzIGxpc3QgKi8KKworCXJlZ2lvbl9vYmotPnJlZ2lvbi5uZXh0ID0gaGFuZGxlcl9vYmotPmFkZHJlc3Nfc3BhY2UucmVnaW9uX2xpc3Q7CisJaGFuZGxlcl9vYmotPmFkZHJlc3Nfc3BhY2UucmVnaW9uX2xpc3QgPSByZWdpb25fb2JqOworCisJLyogSW5zdGFsbCB0aGUgcmVnaW9uJ3MgaGFuZGxlciAqLworCisJaWYgKHJlZ2lvbl9vYmotPnJlZ2lvbi5oYW5kbGVyKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTFJFQURZX0VYSVNUUyk7CisJfQorCisJcmVnaW9uX29iai0+cmVnaW9uLmhhbmRsZXIgPSBoYW5kbGVyX29iajsKKwlhY3BpX3V0X2FkZF9yZWZlcmVuY2UoaGFuZGxlcl9vYmopOworCisJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9ldl9pbnN0YWxsX2hhbmRsZXIKKyAqCisgKiBQQVJBTUVURVJTOiAgd2Fsa19uYW1lc3BhY2UgY2FsbGJhY2sKKyAqCisgKiBERVNDUklQVElPTjogVGhpcyByb3V0aW5lIGluc3RhbGxzIGFuIGFkZHJlc3MgaGFuZGxlciBpbnRvIG9iamVjdHMgdGhhdCBhcmUKKyAqICAgICAgICAgICAgICBvZiB0eXBlIFJlZ2lvbiBvciBEZXZpY2UuCisgKgorICogICAgICAgICAgICAgIElmIHRoZSBPYmplY3QgaXMgYSBEZXZpY2UsIGFuZCB0aGUgZGV2aWNlIGhhcyBhIGhhbmRsZXIgb2YKKyAqICAgICAgICAgICAgICB0aGUgc2FtZSB0eXBlIHRoZW4gdGhlIHNlYXJjaCBpcyB0ZXJtaW5hdGVkIGluIHRoYXQgYnJhbmNoLgorICoKKyAqICAgICAgICAgICAgICBUaGlzIGlzIGJlY2F1c2UgdGhlIGV4aXN0aW5nIGhhbmRsZXIgaXMgY2xvc2VyIGluIHByb3hpbWl0eQorICogICAgICAgICAgICAgIHRvIGFueSBtb3JlIHJlZ2lvbnMgdGhhbiB0aGUgb25lIHdlIGFyZSB0cnlpbmcgdG8gaW5zdGFsbC4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgYWNwaV9zdGF0dXMKK2FjcGlfZXZfaW5zdGFsbF9oYW5kbGVyKGFjcGlfaGFuZGxlIG9ial9oYW5kbGUsCisJCQl1MzIgbGV2ZWwsIHZvaWQgKmNvbnRleHQsIHZvaWQgKipyZXR1cm5fdmFsdWUpCit7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqaGFuZGxlcl9vYmo7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqbmV4dF9oYW5kbGVyX29iajsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYzsKKwlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZTsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisKKwlBQ1BJX0ZVTkNUSU9OX05BTUUoZXZfaW5zdGFsbF9oYW5kbGVyKTsKKworCWhhbmRsZXJfb2JqID0gKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKiljb250ZXh0OworCisJLyogUGFyYW1ldGVyIHZhbGlkYXRpb24gKi8KKworCWlmICghaGFuZGxlcl9vYmopIHsKKwkJcmV0dXJuIChBRV9PSyk7CisJfQorCisJLyogQ29udmVydCBhbmQgdmFsaWRhdGUgdGhlIGRldmljZSBoYW5kbGUgKi8KKworCW5vZGUgPSBhY3BpX25zX21hcF9oYW5kbGVfdG9fbm9kZShvYmpfaGFuZGxlKTsKKwlpZiAoIW5vZGUpIHsKKwkJcmV0dXJuIChBRV9CQURfUEFSQU1FVEVSKTsKKwl9CisKKwkvKgorCSAqIFdlIG9ubHkgY2FyZSBhYm91dCByZWdpb25zIGFuZCBvYmplY3RzIHRoYXQgYXJlIGFsbG93ZWQgdG8gaGF2ZQorCSAqIGFkZHJlc3Mgc3BhY2UgaGFuZGxlcnMKKwkgKi8KKwlpZiAoKG5vZGUtPnR5cGUgIT0gQUNQSV9UWVBFX0RFVklDRSkgJiYKKwkgICAgKG5vZGUtPnR5cGUgIT0gQUNQSV9UWVBFX1JFR0lPTikgJiYgKG5vZGUgIT0gYWNwaV9nYmxfcm9vdF9ub2RlKSkgeworCQlyZXR1cm4gKEFFX09LKTsKKwl9CisKKwkvKiBDaGVjayBmb3IgYW4gZXhpc3RpbmcgaW50ZXJuYWwgb2JqZWN0ICovCisKKwlvYmpfZGVzYyA9IGFjcGlfbnNfZ2V0X2F0dGFjaGVkX29iamVjdChub2RlKTsKKwlpZiAoIW9ial9kZXNjKSB7CisKKwkJLyogTm8gb2JqZWN0LCBqdXN0IGV4aXQgKi8KKworCQlyZXR1cm4gKEFFX09LKTsKKwl9CisKKwkvKiBEZXZpY2VzIGFyZSBoYW5kbGVkIGRpZmZlcmVudCB0aGFuIHJlZ2lvbnMgKi8KKworCWlmIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRShvYmpfZGVzYykgPT0gQUNQSV9UWVBFX0RFVklDRSkgeworCisJCS8qIENoZWNrIGlmIHRoaXMgRGV2aWNlIGFscmVhZHkgaGFzIGEgaGFuZGxlciBmb3IgdGhpcyBhZGRyZXNzIHNwYWNlICovCisKKwkJbmV4dF9oYW5kbGVyX29iaiA9IG9ial9kZXNjLT5kZXZpY2UuaGFuZGxlcjsKKwkJd2hpbGUgKG5leHRfaGFuZGxlcl9vYmopIHsKKworCQkJLyogRm91bmQgYSBoYW5kbGVyLCBpcyBpdCBmb3IgdGhlIHNhbWUgYWRkcmVzcyBzcGFjZT8gKi8KKworCQkJaWYgKG5leHRfaGFuZGxlcl9vYmotPmFkZHJlc3Nfc3BhY2Uuc3BhY2VfaWQgPT0KKwkJCSAgICBoYW5kbGVyX29iai0+YWRkcmVzc19zcGFjZS5zcGFjZV9pZCkgeworCQkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfT1BSRUdJT04sCisJCQkJCQkgICJGb3VuZCBoYW5kbGVyIGZvciByZWdpb24gWyVzXSBpbiBkZXZpY2UgJXAoJXApIGhhbmRsZXIgJXBcbiIsCisJCQkJCQkgIGFjcGlfdXRfZ2V0X3JlZ2lvbl9uYW1lCisJCQkJCQkgIChoYW5kbGVyX29iai0+YWRkcmVzc19zcGFjZS4KKwkJCQkJCSAgIHNwYWNlX2lkKSwgb2JqX2Rlc2MsCisJCQkJCQkgIG5leHRfaGFuZGxlcl9vYmosCisJCQkJCQkgIGhhbmRsZXJfb2JqKSk7CisKKwkJCQkvKgorCQkJCSAqIFNpbmNlIHRoZSBvYmplY3Qgd2UgZm91bmQgaXQgb24gd2FzIGEgZGV2aWNlLCB0aGVuIGl0CisJCQkJICogbWVhbnMgdGhhdCBzb21lb25lIGhhcyBhbHJlYWR5IGluc3RhbGxlZCBhIGhhbmRsZXIgZm9yCisJCQkJICogdGhlIGJyYW5jaCBvZiB0aGUgbmFtZXNwYWNlIGZyb20gdGhpcyBkZXZpY2Ugb24uIEp1c3QKKwkJCQkgKiBiYWlsIG91dCB0ZWxsaW5nIHRoZSB3YWxrIHJvdXRpbmUgdG8gbm90IHRyYXZlcnNlIHRoaXMKKwkJCQkgKiBicmFuY2guIFRoaXMgcHJlc2VydmVzIHRoZSBzY29waW5nIHJ1bGUgZm9yIGhhbmRsZXJzLgorCQkJCSAqLworCQkJCXJldHVybiAoQUVfQ1RSTF9ERVBUSCk7CisJCQl9CisKKwkJCS8qIFdhbGsgdGhlIGxpbmtlZCBsaXN0IG9mIGhhbmRsZXJzIGF0dGFjaGVkIHRvIHRoaXMgZGV2aWNlICovCisKKwkJCW5leHRfaGFuZGxlcl9vYmogPSBuZXh0X2hhbmRsZXJfb2JqLT5hZGRyZXNzX3NwYWNlLm5leHQ7CisJCX0KKworCQkvKgorCQkgKiBBcyBsb25nIGFzIHRoZSBkZXZpY2UgZGlkbid0IGhhdmUgYSBoYW5kbGVyIGZvciB0aGlzIHNwYWNlIHdlCisJCSAqIGRvbid0IGNhcmUgYWJvdXQgaXQuIFdlIGp1c3QgaWdub3JlIGl0IGFuZCBwcm9jZWVkLgorCQkgKi8KKwkJcmV0dXJuIChBRV9PSyk7CisJfQorCisJLyogT2JqZWN0IGlzIGEgUmVnaW9uICovCisKKwlpZiAob2JqX2Rlc2MtPnJlZ2lvbi5zcGFjZV9pZCAhPSBoYW5kbGVyX29iai0+YWRkcmVzc19zcGFjZS5zcGFjZV9pZCkgeworCisJCS8qIFRoaXMgcmVnaW9uIGlzIGZvciBhIGRpZmZlcmVudCBhZGRyZXNzIHNwYWNlLCBqdXN0IGlnbm9yZSBpdCAqLworCisJCXJldHVybiAoQUVfT0spOworCX0KKworCS8qCisJICogTm93IHdlIGhhdmUgYSByZWdpb24gYW5kIGl0IGlzIGZvciB0aGUgaGFuZGxlcidzIGFkZHJlc3Mgc3BhY2UgdHlwZS4KKwkgKgorCSAqIEZpcnN0IGRpc2Nvbm5lY3QgcmVnaW9uIGZvciBhbnkgcHJldmlvdXMgaGFuZGxlciAoaWYgYW55KQorCSAqLworCWFjcGlfZXZfZGV0YWNoX3JlZ2lvbihvYmpfZGVzYywgRkFMU0UpOworCisJLyogQ29ubmVjdCB0aGUgcmVnaW9uIHRvIHRoZSBuZXcgaGFuZGxlciAqLworCisJc3RhdHVzID0gYWNwaV9ldl9hdHRhY2hfcmVnaW9uKGhhbmRsZXJfb2JqLCBvYmpfZGVzYywgRkFMU0UpOworCXJldHVybiAoc3RhdHVzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9ldl9pbnN0YWxsX3NwYWNlX2hhbmRsZXIKKyAqCisgKiBQQVJBTUVURVJTOiAgTm9kZSAgICAgICAgICAgIC0gTmFtZXNwYWNlIG5vZGUgZm9yIHRoZSBkZXZpY2UKKyAqICAgICAgICAgICAgICBzcGFjZV9pZCAgICAgICAgLSBUaGUgYWRkcmVzcyBzcGFjZSBJRAorICogICAgICAgICAgICAgIEhhbmRsZXIgICAgICAgICAtIEFkZHJlc3Mgb2YgdGhlIGhhbmRsZXIKKyAqICAgICAgICAgICAgICBTZXR1cCAgICAgICAgICAgLSBBZGRyZXNzIG9mIHRoZSBzZXR1cCBmdW5jdGlvbgorICogICAgICAgICAgICAgIENvbnRleHQgICAgICAgICAtIFZhbHVlIHBhc3NlZCB0byB0aGUgaGFuZGxlciBvbiBlYWNoIGFjY2VzcworICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogSW5zdGFsbCBhIGhhbmRsZXIgZm9yIGFsbCBvcF9yZWdpb25zIG9mIGEgZ2l2ZW4gc3BhY2VfaWQuCisgKiAgICAgICAgICAgICAgQXNzdW1lcyBuYW1lc3BhY2UgaXMgbG9ja2VkCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworYWNwaV9zdGF0dXMKK2FjcGlfZXZfaW5zdGFsbF9zcGFjZV9oYW5kbGVyKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICogbm9kZSwKKwkJCSAgICAgIGFjcGlfYWRyX3NwYWNlX3R5cGUgc3BhY2VfaWQsCisJCQkgICAgICBhY3BpX2Fkcl9zcGFjZV9oYW5kbGVyIGhhbmRsZXIsCisJCQkgICAgICBhY3BpX2Fkcl9zcGFjZV9zZXR1cCBzZXR1cCwgdm9pZCAqY29udGV4dCkKK3sKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYzsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpoYW5kbGVyX29iajsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJYWNwaV9vYmplY3RfdHlwZSB0eXBlOworCXU4IGZsYWdzID0gMDsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0UoZXZfaW5zdGFsbF9zcGFjZV9oYW5kbGVyKTsKKworCS8qCisJICogVGhpcyByZWdpc3RyYXRpb24gaXMgdmFsaWQgZm9yIG9ubHkgdGhlIHR5cGVzIGJlbG93IGFuZCB0aGUgcm9vdC4gVGhpcworCSAqIGlzIHdoZXJlIHRoZSBkZWZhdWx0IGhhbmRsZXJzIGdldCBwbGFjZWQuCisJICovCisJaWYgKChub2RlLT50eXBlICE9IEFDUElfVFlQRV9ERVZJQ0UpICYmCisJICAgIChub2RlLT50eXBlICE9IEFDUElfVFlQRV9QUk9DRVNTT1IpICYmCisJICAgIChub2RlLT50eXBlICE9IEFDUElfVFlQRV9USEVSTUFMKSAmJiAobm9kZSAhPSBhY3BpX2dibF9yb290X25vZGUpKSB7CisJCXN0YXR1cyA9IEFFX0JBRF9QQVJBTUVURVI7CisJCWdvdG8gdW5sb2NrX2FuZF9leGl0OworCX0KKworCWlmIChoYW5kbGVyID09IEFDUElfREVGQVVMVF9IQU5ETEVSKSB7CisJCWZsYWdzID0gQUNQSV9BRERSX0hBTkRMRVJfREVGQVVMVF9JTlNUQUxMRUQ7CisKKwkJc3dpdGNoIChzcGFjZV9pZCkgeworCQljYXNlIEFDUElfQURSX1NQQUNFX1NZU1RFTV9NRU1PUlk6CisJCQloYW5kbGVyID0gYWNwaV9leF9zeXN0ZW1fbWVtb3J5X3NwYWNlX2hhbmRsZXI7CisJCQlzZXR1cCA9IGFjcGlfZXZfc3lzdGVtX21lbW9yeV9yZWdpb25fc2V0dXA7CisJCQlicmVhazsKKworCQljYXNlIEFDUElfQURSX1NQQUNFX1NZU1RFTV9JTzoKKwkJCWhhbmRsZXIgPSBhY3BpX2V4X3N5c3RlbV9pb19zcGFjZV9oYW5kbGVyOworCQkJc2V0dXAgPSBhY3BpX2V2X2lvX3NwYWNlX3JlZ2lvbl9zZXR1cDsKKwkJCWJyZWFrOworCisJCWNhc2UgQUNQSV9BRFJfU1BBQ0VfUENJX0NPTkZJRzoKKwkJCWhhbmRsZXIgPSBhY3BpX2V4X3BjaV9jb25maWdfc3BhY2VfaGFuZGxlcjsKKwkJCXNldHVwID0gYWNwaV9ldl9wY2lfY29uZmlnX3JlZ2lvbl9zZXR1cDsKKwkJCWJyZWFrOworCisJCWNhc2UgQUNQSV9BRFJfU1BBQ0VfQ01PUzoKKwkJCWhhbmRsZXIgPSBhY3BpX2V4X2Ntb3Nfc3BhY2VfaGFuZGxlcjsKKwkJCXNldHVwID0gYWNwaV9ldl9jbW9zX3JlZ2lvbl9zZXR1cDsKKwkJCWJyZWFrOworCisJCWNhc2UgQUNQSV9BRFJfU1BBQ0VfUENJX0JBUl9UQVJHRVQ6CisJCQloYW5kbGVyID0gYWNwaV9leF9wY2lfYmFyX3NwYWNlX2hhbmRsZXI7CisJCQlzZXR1cCA9IGFjcGlfZXZfcGNpX2Jhcl9yZWdpb25fc2V0dXA7CisJCQlicmVhazsKKworCQljYXNlIEFDUElfQURSX1NQQUNFX0RBVEFfVEFCTEU6CisJCQloYW5kbGVyID0gYWNwaV9leF9kYXRhX3RhYmxlX3NwYWNlX2hhbmRsZXI7CisJCQlzZXR1cCA9IE5VTEw7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJc3RhdHVzID0gQUVfQkFEX1BBUkFNRVRFUjsKKwkJCWdvdG8gdW5sb2NrX2FuZF9leGl0OworCQl9CisJfQorCisJLyogSWYgdGhlIGNhbGxlciBoYXNuJ3Qgc3BlY2lmaWVkIGEgc2V0dXAgcm91dGluZSwgdXNlIHRoZSBkZWZhdWx0ICovCisKKwlpZiAoIXNldHVwKSB7CisJCXNldHVwID0gYWNwaV9ldl9kZWZhdWx0X3JlZ2lvbl9zZXR1cDsKKwl9CisKKwkvKiBDaGVjayBmb3IgYW4gZXhpc3RpbmcgaW50ZXJuYWwgb2JqZWN0ICovCisKKwlvYmpfZGVzYyA9IGFjcGlfbnNfZ2V0X2F0dGFjaGVkX29iamVjdChub2RlKTsKKwlpZiAob2JqX2Rlc2MpIHsKKwkJLyoKKwkJICogVGhlIGF0dGFjaGVkIGRldmljZSBvYmplY3QgYWxyZWFkeSBleGlzdHMuIE1ha2Ugc3VyZSB0aGUgaGFuZGxlcgorCQkgKiBpcyBub3QgYWxyZWFkeSBpbnN0YWxsZWQuCisJCSAqLworCQloYW5kbGVyX29iaiA9IG9ial9kZXNjLT5kZXZpY2UuaGFuZGxlcjsKKworCQkvKiBXYWxrIHRoZSBoYW5kbGVyIGxpc3QgZm9yIHRoaXMgZGV2aWNlICovCisKKwkJd2hpbGUgKGhhbmRsZXJfb2JqKSB7CisKKwkJCS8qIFNhbWUgc3BhY2VfaWQgaW5kaWNhdGVzIGEgaGFuZGxlciBhbHJlYWR5IGluc3RhbGxlZCAqLworCisJCQlpZiAoaGFuZGxlcl9vYmotPmFkZHJlc3Nfc3BhY2Uuc3BhY2VfaWQgPT0gc3BhY2VfaWQpIHsKKwkJCQlpZiAoaGFuZGxlcl9vYmotPmFkZHJlc3Nfc3BhY2UuaGFuZGxlciA9PQorCQkJCSAgICBoYW5kbGVyKSB7CisJCQkJCS8qCisJCQkJCSAqIEl0IGlzIChyZWxhdGl2ZWx5KSBPSyB0byBhdHRlbXB0IHRvIGluc3RhbGwgdGhlIFNBTUUKKwkJCQkJICogaGFuZGxlciB0d2ljZS4gVGhpcyBjYW4gZWFzaWx5IGhhcHBlbiB3aXRoIHRoZQorCQkJCQkgKiBQQ0lfQ29uZmlnIHNwYWNlLgorCQkJCQkgKi8KKwkJCQkJc3RhdHVzID0gQUVfU0FNRV9IQU5ETEVSOworCQkJCQlnb3RvIHVubG9ja19hbmRfZXhpdDsKKwkJCQl9IGVsc2UgeworCQkJCQkvKiBBIGhhbmRsZXIgaXMgYWxyZWFkeSBpbnN0YWxsZWQgKi8KKworCQkJCQlzdGF0dXMgPSBBRV9BTFJFQURZX0VYSVNUUzsKKwkJCQl9CisJCQkJZ290byB1bmxvY2tfYW5kX2V4aXQ7CisJCQl9CisKKwkJCS8qIFdhbGsgdGhlIGxpbmtlZCBsaXN0IG9mIGhhbmRsZXJzICovCisKKwkJCWhhbmRsZXJfb2JqID0gaGFuZGxlcl9vYmotPmFkZHJlc3Nfc3BhY2UubmV4dDsKKwkJfQorCX0gZWxzZSB7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfT1BSRUdJT04sCisJCQkJICAiQ3JlYXRpbmcgb2JqZWN0IG9uIERldmljZSAlcCB3aGlsZSBpbnN0YWxsaW5nIGhhbmRsZXJcbiIsCisJCQkJICBub2RlKSk7CisKKwkJLyogb2JqX2Rlc2MgZG9lcyBub3QgZXhpc3QsIGNyZWF0ZSBvbmUgKi8KKworCQlpZiAobm9kZS0+dHlwZSA9PSBBQ1BJX1RZUEVfQU5ZKSB7CisJCQl0eXBlID0gQUNQSV9UWVBFX0RFVklDRTsKKwkJfSBlbHNlIHsKKwkJCXR5cGUgPSBub2RlLT50eXBlOworCQl9CisKKwkJb2JqX2Rlc2MgPSBhY3BpX3V0X2NyZWF0ZV9pbnRlcm5hbF9vYmplY3QodHlwZSk7CisJCWlmICghb2JqX2Rlc2MpIHsKKwkJCXN0YXR1cyA9IEFFX05PX01FTU9SWTsKKwkJCWdvdG8gdW5sb2NrX2FuZF9leGl0OworCQl9CisKKwkJLyogSW5pdCBuZXcgZGVzY3JpcHRvciAqLworCisJCW9ial9kZXNjLT5jb21tb24udHlwZSA9ICh1OCkgdHlwZTsKKworCQkvKiBBdHRhY2ggdGhlIG5ldyBvYmplY3QgdG8gdGhlIE5vZGUgKi8KKworCQlzdGF0dXMgPSBhY3BpX25zX2F0dGFjaF9vYmplY3Qobm9kZSwgb2JqX2Rlc2MsIHR5cGUpOworCisJCS8qIFJlbW92ZSBsb2NhbCByZWZlcmVuY2UgdG8gdGhlIG9iamVjdCAqLworCisJCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZShvYmpfZGVzYyk7CisKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQlnb3RvIHVubG9ja19hbmRfZXhpdDsKKwkJfQorCX0KKworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfT1BSRUdJT04sCisJCQkgICJJbnN0YWxsaW5nIGFkZHJlc3MgaGFuZGxlciBmb3IgcmVnaW9uICVzKCVYKSBvbiBEZXZpY2UgJTQuNHMgJXAoJXApXG4iLAorCQkJICBhY3BpX3V0X2dldF9yZWdpb25fbmFtZShzcGFjZV9pZCksIHNwYWNlX2lkLAorCQkJICBhY3BpX3V0X2dldF9ub2RlX25hbWUobm9kZSksIG5vZGUsIG9ial9kZXNjKSk7CisKKwkvKgorCSAqIEluc3RhbGwgdGhlIGhhbmRsZXIKKwkgKgorCSAqIEF0IHRoaXMgcG9pbnQgdGhlcmUgaXMgbm8gZXhpc3RpbmcgaGFuZGxlci4gSnVzdCBhbGxvY2F0ZSB0aGUgb2JqZWN0CisJICogZm9yIHRoZSBoYW5kbGVyIGFuZCBsaW5rIGl0IGludG8gdGhlIGxpc3QuCisJICovCisJaGFuZGxlcl9vYmogPQorCSAgICBhY3BpX3V0X2NyZWF0ZV9pbnRlcm5hbF9vYmplY3QoQUNQSV9UWVBFX0xPQ0FMX0FERFJFU1NfSEFORExFUik7CisJaWYgKCFoYW5kbGVyX29iaikgeworCQlzdGF0dXMgPSBBRV9OT19NRU1PUlk7CisJCWdvdG8gdW5sb2NrX2FuZF9leGl0OworCX0KKworCS8qIEluaXQgaGFuZGxlciBvYmogKi8KKworCWhhbmRsZXJfb2JqLT5hZGRyZXNzX3NwYWNlLnNwYWNlX2lkID0gKHU4KSBzcGFjZV9pZDsKKwloYW5kbGVyX29iai0+YWRkcmVzc19zcGFjZS5oYW5kbGVyX2ZsYWdzID0gZmxhZ3M7CisJaGFuZGxlcl9vYmotPmFkZHJlc3Nfc3BhY2UucmVnaW9uX2xpc3QgPSBOVUxMOworCWhhbmRsZXJfb2JqLT5hZGRyZXNzX3NwYWNlLm5vZGUgPSBub2RlOworCWhhbmRsZXJfb2JqLT5hZGRyZXNzX3NwYWNlLmhhbmRsZXIgPSBoYW5kbGVyOworCWhhbmRsZXJfb2JqLT5hZGRyZXNzX3NwYWNlLmNvbnRleHQgPSBjb250ZXh0OworCWhhbmRsZXJfb2JqLT5hZGRyZXNzX3NwYWNlLnNldHVwID0gc2V0dXA7CisKKwkvKiBJbnN0YWxsIGF0IGhlYWQgb2YgRGV2aWNlLmFkZHJlc3Nfc3BhY2UgbGlzdCAqLworCisJaGFuZGxlcl9vYmotPmFkZHJlc3Nfc3BhY2UubmV4dCA9IG9ial9kZXNjLT5kZXZpY2UuaGFuZGxlcjsKKworCS8qCisJICogVGhlIERldmljZSBvYmplY3QgaXMgdGhlIGZpcnN0IHJlZmVyZW5jZSBvbiB0aGUgaGFuZGxlcl9vYmouCisJICogRWFjaCByZWdpb24gdGhhdCB1c2VzIHRoZSBoYW5kbGVyIGFkZHMgYSByZWZlcmVuY2UuCisJICovCisJb2JqX2Rlc2MtPmRldmljZS5oYW5kbGVyID0gaGFuZGxlcl9vYmo7CisKKwkvKgorCSAqIFdhbGsgdGhlIG5hbWVzcGFjZSBmaW5kaW5nIGFsbCBvZiB0aGUgcmVnaW9ucyB0aGlzCisJICogaGFuZGxlciB3aWxsIG1hbmFnZS4KKwkgKgorCSAqIFN0YXJ0IGF0IHRoZSBkZXZpY2UgYW5kIHNlYXJjaCB0aGUgYnJhbmNoIHRvd2FyZAorCSAqIHRoZSBsZWFmIG5vZGVzIHVudGlsIGVpdGhlciB0aGUgbGVhZiBpcyBlbmNvdW50ZXJlZCBvcgorCSAqIGEgZGV2aWNlIGlzIGRldGVjdGVkIHRoYXQgaGFzIGFuIGFkZHJlc3MgaGFuZGxlciBvZiB0aGUKKwkgKiBzYW1lIHR5cGUuCisJICoKKwkgKiBJbiBlaXRoZXIgY2FzZSwgYmFjayB1cCBhbmQgc2VhcmNoIGRvd24gdGhlIHJlbWFpbmRlcgorCSAqIG9mIHRoZSBicmFuY2gKKwkgKi8KKwlzdGF0dXMgPSBhY3BpX25zX3dhbGtfbmFtZXNwYWNlKEFDUElfVFlQRV9BTlksIG5vZGUsIEFDUElfVUlOVDMyX01BWCwKKwkJCQkJQUNQSV9OU19XQUxLX1VOTE9DSywKKwkJCQkJYWNwaV9ldl9pbnN0YWxsX2hhbmRsZXIsIGhhbmRsZXJfb2JqLAorCQkJCQlOVUxMKTsKKworICAgICAgdW5sb2NrX2FuZF9leGl0OgorCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX2V2X2V4ZWN1dGVfcmVnX21ldGhvZHMKKyAqCisgKiBQQVJBTUVURVJTOiAgTm9kZSAgICAgICAgICAgIC0gTmFtZXNwYWNlIG5vZGUgZm9yIHRoZSBkZXZpY2UKKyAqICAgICAgICAgICAgICBzcGFjZV9pZCAgICAgICAgLSBUaGUgYWRkcmVzcyBzcGFjZSBJRAorICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogUnVuIGFsbCBfUkVHIG1ldGhvZHMgZm9yIHRoZSBpbnB1dCBTcGFjZSBJRDsKKyAqICAgICAgICAgICAgICBOb3RlOiBhc3N1bWVzIG5hbWVzcGFjZSBpcyBsb2NrZWQsIG9yIHN5c3RlbSBpbml0IHRpbWUuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworYWNwaV9zdGF0dXMKK2FjcGlfZXZfZXhlY3V0ZV9yZWdfbWV0aG9kcyhzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZSwKKwkJCSAgICBhY3BpX2Fkcl9zcGFjZV90eXBlIHNwYWNlX2lkKQoreworCWFjcGlfc3RhdHVzIHN0YXR1czsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0UoZXZfZXhlY3V0ZV9yZWdfbWV0aG9kcyk7CisKKwkvKgorCSAqIFJ1biBhbGwgX1JFRyBtZXRob2RzIGZvciBhbGwgT3BlcmF0aW9uIFJlZ2lvbnMgZm9yIHRoaXMgc3BhY2UgSUQuIFRoaXMKKwkgKiBpcyBhIHNlcGFyYXRlIHdhbGsgaW4gb3JkZXIgdG8gaGFuZGxlIGFueSBpbnRlcmRlcGVuZGVuY2llcyBiZXR3ZWVuCisJICogcmVnaW9ucyBhbmQgX1JFRyBtZXRob2RzLiAoaS5lLiBoYW5kbGVycyBtdXN0IGJlIGluc3RhbGxlZCBmb3IgYWxsCisJICogcmVnaW9ucyBvZiB0aGlzIFNwYWNlIElEIGJlZm9yZSB3ZSBjYW4gcnVuIGFueSBfUkVHIG1ldGhvZHMpCisJICovCisJc3RhdHVzID0gYWNwaV9uc193YWxrX25hbWVzcGFjZShBQ1BJX1RZUEVfQU5ZLCBub2RlLCBBQ1BJX1VJTlQzMl9NQVgsCisJCQkJCUFDUElfTlNfV0FMS19VTkxPQ0ssIGFjcGlfZXZfcmVnX3J1biwKKwkJCQkJJnNwYWNlX2lkLCBOVUxMKTsKKworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX2V2X3JlZ19ydW4KKyAqCisgKiBQQVJBTUVURVJTOiAgd2Fsa19uYW1lc3BhY2UgY2FsbGJhY2sKKyAqCisgKiBERVNDUklQVElPTjogUnVuIF9SRUcgbWV0aG9kIGZvciByZWdpb24gb2JqZWN0cyBvZiB0aGUgcmVxdWVzdGVkIHNwYWNlX2lECisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGFjcGlfc3RhdHVzCithY3BpX2V2X3JlZ19ydW4oYWNwaV9oYW5kbGUgb2JqX2hhbmRsZSwKKwkJdTMyIGxldmVsLCB2b2lkICpjb250ZXh0LCB2b2lkICoqcmV0dXJuX3ZhbHVlKQoreworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjOworCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlOworCWFjcGlfYWRyX3NwYWNlX3R5cGUgc3BhY2VfaWQ7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCisJc3BhY2VfaWQgPSAqQUNQSV9DQVNUX1BUUihhY3BpX2Fkcl9zcGFjZV90eXBlLCBjb250ZXh0KTsKKworCS8qIENvbnZlcnQgYW5kIHZhbGlkYXRlIHRoZSBkZXZpY2UgaGFuZGxlICovCisKKwlub2RlID0gYWNwaV9uc19tYXBfaGFuZGxlX3RvX25vZGUob2JqX2hhbmRsZSk7CisJaWYgKCFub2RlKSB7CisJCXJldHVybiAoQUVfQkFEX1BBUkFNRVRFUik7CisJfQorCisJLyoKKwkgKiBXZSBvbmx5IGNhcmUgYWJvdXQgcmVnaW9ucy5hbmQgb2JqZWN0cyB0aGF0IGFyZSBhbGxvd2VkIHRvIGhhdmUgYWRkcmVzcworCSAqIHNwYWNlIGhhbmRsZXJzCisJICovCisJaWYgKChub2RlLT50eXBlICE9IEFDUElfVFlQRV9SRUdJT04pICYmIChub2RlICE9IGFjcGlfZ2JsX3Jvb3Rfbm9kZSkpIHsKKwkJcmV0dXJuIChBRV9PSyk7CisJfQorCisJLyogQ2hlY2sgZm9yIGFuIGV4aXN0aW5nIGludGVybmFsIG9iamVjdCAqLworCisJb2JqX2Rlc2MgPSBhY3BpX25zX2dldF9hdHRhY2hlZF9vYmplY3Qobm9kZSk7CisJaWYgKCFvYmpfZGVzYykgeworCisJCS8qIE5vIG9iamVjdCwganVzdCBleGl0ICovCisKKwkJcmV0dXJuIChBRV9PSyk7CisJfQorCisJLyogT2JqZWN0IGlzIGEgUmVnaW9uICovCisKKwlpZiAob2JqX2Rlc2MtPnJlZ2lvbi5zcGFjZV9pZCAhPSBzcGFjZV9pZCkgeworCisJCS8qIFRoaXMgcmVnaW9uIGlzIGZvciBhIGRpZmZlcmVudCBhZGRyZXNzIHNwYWNlLCBqdXN0IGlnbm9yZSBpdCAqLworCisJCXJldHVybiAoQUVfT0spOworCX0KKworCXN0YXR1cyA9IGFjcGlfZXZfZXhlY3V0ZV9yZWdfbWV0aG9kKG9ial9kZXNjLCAxKTsKKwlyZXR1cm4gKHN0YXR1cyk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2V2cmduaW5pLmMgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2V2cmduaW5pLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjNmMWZiNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXZyZ25pbmkuYwpAQCAtMCwwICsxLDY4NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIE1vZHVsZSBOYW1lOiBldnJnbmluaS0gQUNQSSBhZGRyZXNzX3NwYWNlIChvcF9yZWdpb24pIGluaXQKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA4LCBJbnRlbCBDb3JwLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAorICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgYXQgbWluaW11bSBhIGRpc2NsYWltZXIKKyAqICAgIHN1YnN0YW50aWFsbHkgc2ltaWxhciB0byB0aGUgIk5PIFdBUlJBTlRZIiBkaXNjbGFpbWVyIGJlbG93CisgKiAgICAoIkRpc2NsYWltZXIiKSBhbmQgYW55IHJlZGlzdHJpYnV0aW9uIG11c3QgYmUgY29uZGl0aW9uZWQgdXBvbgorICogICAgaW5jbHVkaW5nIGEgc3Vic3RhbnRpYWxseSBzaW1pbGFyIERpc2NsYWltZXIgcmVxdWlyZW1lbnQgZm9yIGZ1cnRoZXIKKyAqICAgIGJpbmFyeSByZWRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcworICogICAgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBOTyBXQVJSQU5UWQorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcKKyAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgorICovCisKKyNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KKyNpbmNsdWRlICJhY2NvbW1vbi5oIgorI2luY2x1ZGUgImFjZXZlbnRzLmgiCisjaW5jbHVkZSAiYWNuYW1lc3AuaCIKKworI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfRVZFTlRTCitBQ1BJX01PRFVMRV9OQU1FKCJldnJnbmluaSIpCisKKy8qIExvY2FsIHByb3RvdHlwZXMgKi8KK3N0YXRpYyB1OCBhY3BpX2V2X21hdGNoX3BjaV9yb290X2JyaWRnZShjaGFyICppZCk7CisKK3N0YXRpYyB1OCBhY3BpX2V2X2lzX3BjaV9yb290X2JyaWRnZShzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZSk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfZXZfc3lzdGVtX21lbW9yeV9yZWdpb25fc2V0dXAKKyAqCisgKiBQQVJBTUVURVJTOiAgSGFuZGxlICAgICAgICAgICAgICAtIFJlZ2lvbiB3ZSBhcmUgaW50ZXJlc3RlZCBpbgorICogICAgICAgICAgICAgIEZ1bmN0aW9uICAgICAgICAgICAgLSBTdGFydCBvciBzdG9wCisgKiAgICAgICAgICAgICAgaGFuZGxlcl9jb250ZXh0ICAgICAtIEFkZHJlc3Mgc3BhY2UgaGFuZGxlciBjb250ZXh0CisgKiAgICAgICAgICAgICAgcmVnaW9uX2NvbnRleHQgICAgICAtIFJlZ2lvbiBzcGVjaWZpYyBjb250ZXh0CisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBTZXR1cCBhIHN5c3RlbV9tZW1vcnkgb3BlcmF0aW9uIHJlZ2lvbgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2FjcGlfc3RhdHVzCithY3BpX2V2X3N5c3RlbV9tZW1vcnlfcmVnaW9uX3NldHVwKGFjcGlfaGFuZGxlIGhhbmRsZSwKKwkJCQkgICB1MzIgZnVuY3Rpb24sCisJCQkJICAgdm9pZCAqaGFuZGxlcl9jb250ZXh0LCB2b2lkICoqcmVnaW9uX2NvbnRleHQpCit7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqcmVnaW9uX2Rlc2MgPQorCSAgICAodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKWhhbmRsZTsKKwlzdHJ1Y3QgYWNwaV9tZW1fc3BhY2VfY29udGV4dCAqbG9jYWxfcmVnaW9uX2NvbnRleHQ7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGV2X3N5c3RlbV9tZW1vcnlfcmVnaW9uX3NldHVwKTsKKworCWlmIChmdW5jdGlvbiA9PSBBQ1BJX1JFR0lPTl9ERUFDVElWQVRFKSB7CisJCWlmICgqcmVnaW9uX2NvbnRleHQpIHsKKwkJCWxvY2FsX3JlZ2lvbl9jb250ZXh0ID0KKwkJCSAgICAoc3RydWN0IGFjcGlfbWVtX3NwYWNlX2NvbnRleHQgKikqcmVnaW9uX2NvbnRleHQ7CisKKwkJCS8qIERlbGV0ZSBhIGNhY2hlZCBtYXBwaW5nIGlmIHByZXNlbnQgKi8KKworCQkJaWYgKGxvY2FsX3JlZ2lvbl9jb250ZXh0LT5tYXBwZWRfbGVuZ3RoKSB7CisJCQkJYWNwaV9vc191bm1hcF9tZW1vcnkobG9jYWxfcmVnaW9uX2NvbnRleHQtPgorCQkJCQkJICAgICBtYXBwZWRfbG9naWNhbF9hZGRyZXNzLAorCQkJCQkJICAgICBsb2NhbF9yZWdpb25fY29udGV4dC0+CisJCQkJCQkgICAgIG1hcHBlZF9sZW5ndGgpOworCQkJfQorCQkJQUNQSV9GUkVFKGxvY2FsX3JlZ2lvbl9jb250ZXh0KTsKKwkJCSpyZWdpb25fY29udGV4dCA9IE5VTEw7CisJCX0KKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKKwl9CisKKwkvKiBDcmVhdGUgYSBuZXcgY29udGV4dCAqLworCisJbG9jYWxfcmVnaW9uX2NvbnRleHQgPQorCSAgICBBQ1BJX0FMTE9DQVRFX1pFUk9FRChzaXplb2Yoc3RydWN0IGFjcGlfbWVtX3NwYWNlX2NvbnRleHQpKTsKKwlpZiAoIShsb2NhbF9yZWdpb25fY29udGV4dCkpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX01FTU9SWSk7CisJfQorCisJLyogU2F2ZSB0aGUgcmVnaW9uIGxlbmd0aCBhbmQgYWRkcmVzcyBmb3IgdXNlIGluIHRoZSBoYW5kbGVyICovCisKKwlsb2NhbF9yZWdpb25fY29udGV4dC0+bGVuZ3RoID0gcmVnaW9uX2Rlc2MtPnJlZ2lvbi5sZW5ndGg7CisJbG9jYWxfcmVnaW9uX2NvbnRleHQtPmFkZHJlc3MgPSByZWdpb25fZGVzYy0+cmVnaW9uLmFkZHJlc3M7CisKKwkqcmVnaW9uX2NvbnRleHQgPSBsb2NhbF9yZWdpb25fY29udGV4dDsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX2V2X2lvX3NwYWNlX3JlZ2lvbl9zZXR1cAorICoKKyAqIFBBUkFNRVRFUlM6ICBIYW5kbGUgICAgICAgICAgICAgIC0gUmVnaW9uIHdlIGFyZSBpbnRlcmVzdGVkIGluCisgKiAgICAgICAgICAgICAgRnVuY3Rpb24gICAgICAgICAgICAtIFN0YXJ0IG9yIHN0b3AKKyAqICAgICAgICAgICAgICBoYW5kbGVyX2NvbnRleHQgICAgIC0gQWRkcmVzcyBzcGFjZSBoYW5kbGVyIGNvbnRleHQKKyAqICAgICAgICAgICAgICByZWdpb25fY29udGV4dCAgICAgIC0gUmVnaW9uIHNwZWNpZmljIGNvbnRleHQKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IFNldHVwIGEgSU8gb3BlcmF0aW9uIHJlZ2lvbgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2FjcGlfc3RhdHVzCithY3BpX2V2X2lvX3NwYWNlX3JlZ2lvbl9zZXR1cChhY3BpX2hhbmRsZSBoYW5kbGUsCisJCQkgICAgICB1MzIgZnVuY3Rpb24sCisJCQkgICAgICB2b2lkICpoYW5kbGVyX2NvbnRleHQsIHZvaWQgKipyZWdpb25fY29udGV4dCkKK3sKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGV2X2lvX3NwYWNlX3JlZ2lvbl9zZXR1cCk7CisKKwlpZiAoZnVuY3Rpb24gPT0gQUNQSV9SRUdJT05fREVBQ1RJVkFURSkgeworCQkqcmVnaW9uX2NvbnRleHQgPSBOVUxMOworCX0gZWxzZSB7CisJCSpyZWdpb25fY29udGV4dCA9IGhhbmRsZXJfY29udGV4dDsKKwl9CisKKwlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX2V2X3BjaV9jb25maWdfcmVnaW9uX3NldHVwCisgKgorICogUEFSQU1FVEVSUzogIEhhbmRsZSAgICAgICAgICAgICAgLSBSZWdpb24gd2UgYXJlIGludGVyZXN0ZWQgaW4KKyAqICAgICAgICAgICAgICBGdW5jdGlvbiAgICAgICAgICAgIC0gU3RhcnQgb3Igc3RvcAorICogICAgICAgICAgICAgIGhhbmRsZXJfY29udGV4dCAgICAgLSBBZGRyZXNzIHNwYWNlIGhhbmRsZXIgY29udGV4dAorICogICAgICAgICAgICAgIHJlZ2lvbl9jb250ZXh0ICAgICAgLSBSZWdpb24gc3BlY2lmaWMgY29udGV4dAorICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogU2V0dXAgYSBQQ0lfQ29uZmlnIG9wZXJhdGlvbiByZWdpb24KKyAqCisgKiBNVVRFWDogICAgICAgQXNzdW1lcyBuYW1lc3BhY2UgaXMgbm90IGxvY2tlZAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2FjcGlfc3RhdHVzCithY3BpX2V2X3BjaV9jb25maWdfcmVnaW9uX3NldHVwKGFjcGlfaGFuZGxlIGhhbmRsZSwKKwkJCQl1MzIgZnVuY3Rpb24sCisJCQkJdm9pZCAqaGFuZGxlcl9jb250ZXh0LCB2b2lkICoqcmVnaW9uX2NvbnRleHQpCit7CisJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CisJYWNwaV9pbnRlZ2VyIHBjaV92YWx1ZTsKKwlzdHJ1Y3QgYWNwaV9wY2lfaWQgKnBjaV9pZCA9ICpyZWdpb25fY29udGV4dDsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpoYW5kbGVyX29iajsKKwlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqcGFyZW50X25vZGU7CisJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKnBjaV9yb290X25vZGU7CisJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKnBjaV9kZXZpY2Vfbm9kZTsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpyZWdpb25fb2JqID0KKwkgICAgKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKiloYW5kbGU7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGV2X3BjaV9jb25maWdfcmVnaW9uX3NldHVwKTsKKworCWhhbmRsZXJfb2JqID0gcmVnaW9uX29iai0+cmVnaW9uLmhhbmRsZXI7CisJaWYgKCFoYW5kbGVyX29iaikgeworCQkvKgorCQkgKiBObyBpbnN0YWxsZWQgaGFuZGxlci4gVGhpcyBzaG91bGRuJ3QgaGFwcGVuIGJlY2F1c2UgdGhlIGRpc3BhdGNoCisJCSAqIHJvdXRpbmUgY2hlY2tzIGJlZm9yZSB3ZSBnZXQgaGVyZSwgYnV0IHdlIGNoZWNrIGFnYWluIGp1c3QgaW4gY2FzZS4KKwkJICovCisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfT1BSRUdJT04sCisJCQkJICAiQXR0ZW1wdGluZyB0byBpbml0IGEgcmVnaW9uICVwLCB3aXRoIG5vIGhhbmRsZXJcbiIsCisJCQkJICByZWdpb25fb2JqKSk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT1RfRVhJU1QpOworCX0KKworCSpyZWdpb25fY29udGV4dCA9IE5VTEw7CisJaWYgKGZ1bmN0aW9uID09IEFDUElfUkVHSU9OX0RFQUNUSVZBVEUpIHsKKwkJaWYgKHBjaV9pZCkgeworCQkJQUNQSV9GUkVFKHBjaV9pZCk7CisJCX0KKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CisJfQorCisJcGFyZW50X25vZGUgPSBhY3BpX25zX2dldF9wYXJlbnRfbm9kZShyZWdpb25fb2JqLT5yZWdpb24ubm9kZSk7CisKKwkvKgorCSAqIEdldCB0aGUgX1NFRyBhbmQgX0JCTiB2YWx1ZXMgZnJvbSB0aGUgZGV2aWNlIHVwb24gd2hpY2ggdGhlIGhhbmRsZXIKKwkgKiBpcyBpbnN0YWxsZWQuCisJICoKKwkgKiBXZSBuZWVkIHRvIGdldCB0aGUgX1NFRyBhbmQgX0JCTiBvYmplY3RzIHJlbGF0aXZlIHRvIHRoZSBQQ0kgQlVTIGRldmljZS4KKwkgKiBUaGlzIGlzIHRoZSBkZXZpY2UgdGhlIGhhbmRsZXIgaGFzIGJlZW4gcmVnaXN0ZXJlZCB0byBoYW5kbGUuCisJICovCisKKwkvKgorCSAqIElmIHRoZSBhZGRyZXNzX3NwYWNlLk5vZGUgaXMgc3RpbGwgcG9pbnRpbmcgdG8gdGhlIHJvb3QsIHdlIG5lZWQKKwkgKiB0byBzY2FuIHVwd2FyZCBmb3IgYSBQQ0kgUm9vdCBicmlkZ2UgYW5kIHJlLWFzc29jaWF0ZSB0aGUgb3BfcmVnaW9uCisJICogaGFuZGxlcnMgd2l0aCB0aGF0IGRldmljZS4KKwkgKi8KKwlpZiAoaGFuZGxlcl9vYmotPmFkZHJlc3Nfc3BhY2Uubm9kZSA9PSBhY3BpX2dibF9yb290X25vZGUpIHsKKworCQkvKiBTdGFydCBzZWFyY2ggZnJvbSB0aGUgcGFyZW50IG9iamVjdCAqLworCisJCXBjaV9yb290X25vZGUgPSBwYXJlbnRfbm9kZTsKKwkJd2hpbGUgKHBjaV9yb290X25vZGUgIT0gYWNwaV9nYmxfcm9vdF9ub2RlKSB7CisKKwkJCS8qIEdldCB0aGUgX0hJRC9fQ0lEIGluIG9yZGVyIHRvIGRldGVjdCBhIHJvb3RfYnJpZGdlICovCisKKwkJCWlmIChhY3BpX2V2X2lzX3BjaV9yb290X2JyaWRnZShwY2lfcm9vdF9ub2RlKSkgeworCisJCQkJLyogSW5zdGFsbCBhIGhhbmRsZXIgZm9yIHRoaXMgUENJIHJvb3QgYnJpZGdlICovCisKKwkJCQlzdGF0dXMgPQorCQkJCSAgICBhY3BpX2luc3RhbGxfYWRkcmVzc19zcGFjZV9oYW5kbGVyKChhY3BpX2hhbmRsZSkgcGNpX3Jvb3Rfbm9kZSwgQUNQSV9BRFJfU1BBQ0VfUENJX0NPTkZJRywgQUNQSV9ERUZBVUxUX0hBTkRMRVIsIE5VTEwsIE5VTEwpOworCQkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJCQlpZiAoc3RhdHVzID09IEFFX1NBTUVfSEFORExFUikgeworCQkJCQkJLyoKKwkJCQkJCSAqIEl0IGlzIE9LIGlmIHRoZSBoYW5kbGVyIGlzIGFscmVhZHkgaW5zdGFsbGVkIG9uIHRoZQorCQkJCQkJICogcm9vdCBicmlkZ2UuIFN0aWxsIG5lZWQgdG8gcmV0dXJuIGEgY29udGV4dCBvYmplY3QKKwkJCQkJCSAqIGZvciB0aGUgbmV3IFBDSV9Db25maWcgb3BlcmF0aW9uIHJlZ2lvbiwgaG93ZXZlci4KKwkJCQkJCSAqLworCQkJCQkJc3RhdHVzID0gQUVfT0s7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlBQ1BJX0VYQ0VQVElPTigoQUVfSU5GTywgc3RhdHVzLAorCQkJCQkJCQkiQ291bGQgbm90IGluc3RhbGwgUGNpQ29uZmlnIGhhbmRsZXIgZm9yIFJvb3QgQnJpZGdlICU0LjRzIiwKKwkJCQkJCQkJYWNwaV91dF9nZXRfbm9kZV9uYW1lCisJCQkJCQkJCShwY2lfcm9vdF9ub2RlKSkpOworCQkJCQl9CisJCQkJfQorCQkJCWJyZWFrOworCQkJfQorCisJCQlwY2lfcm9vdF9ub2RlID0gYWNwaV9uc19nZXRfcGFyZW50X25vZGUocGNpX3Jvb3Rfbm9kZSk7CisJCX0KKworCQkvKiBQQ0kgcm9vdCBicmlkZ2Ugbm90IGZvdW5kLCB1c2UgbmFtZXNwYWNlIHJvb3Qgbm9kZSAqLworCX0gZWxzZSB7CisJCXBjaV9yb290X25vZGUgPSBoYW5kbGVyX29iai0+YWRkcmVzc19zcGFjZS5ub2RlOworCX0KKworCS8qCisJICogSWYgdGhpcyByZWdpb24gaXMgbm93IGluaXRpYWxpemVkLCB3ZSBhcmUgZG9uZS4KKwkgKiAoaW5zdGFsbF9hZGRyZXNzX3NwYWNlX2hhbmRsZXIgY291bGQgaGF2ZSBpbml0aWFsaXplZCBpdCkKKwkgKi8KKwlpZiAocmVnaW9uX29iai0+cmVnaW9uLmZsYWdzICYgQU9QT0JKX1NFVFVQX0NPTVBMRVRFKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CisJfQorCisJLyogUmVnaW9uIGlzIHN0aWxsIG5vdCBpbml0aWFsaXplZC4gQ3JlYXRlIGEgbmV3IGNvbnRleHQgKi8KKworCXBjaV9pZCA9IEFDUElfQUxMT0NBVEVfWkVST0VEKHNpemVvZihzdHJ1Y3QgYWNwaV9wY2lfaWQpKTsKKwlpZiAoIXBjaV9pZCkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9fTUVNT1JZKTsKKwl9CisKKwkvKgorCSAqIEZvciBQQ0lfQ29uZmlnIHNwYWNlIGFjY2Vzcywgd2UgbmVlZCB0aGUgc2VnbWVudCwgYnVzLCBkZXZpY2UgYW5kCisJICogZnVuY3Rpb24gbnVtYmVycy4gQWNxdWlyZSB0aGVtIGhlcmUuCisJICoKKwkgKiBGaW5kIHRoZSBwYXJlbnQgZGV2aWNlIG9iamVjdC4gKFRoaXMgYWxsb3dzIHRoZSBvcGVyYXRpb24gcmVnaW9uIHRvIGJlCisJICogd2l0aGluIGEgc3Vic2NvcGUgdW5kZXIgdGhlIGRldmljZSwgc3VjaCBhcyBhIGNvbnRyb2wgbWV0aG9kLikKKwkgKi8KKwlwY2lfZGV2aWNlX25vZGUgPSByZWdpb25fb2JqLT5yZWdpb24ubm9kZTsKKwl3aGlsZSAocGNpX2RldmljZV9ub2RlICYmIChwY2lfZGV2aWNlX25vZGUtPnR5cGUgIT0gQUNQSV9UWVBFX0RFVklDRSkpIHsKKwkJcGNpX2RldmljZV9ub2RlID0gYWNwaV9uc19nZXRfcGFyZW50X25vZGUocGNpX2RldmljZV9ub2RlKTsKKwl9CisKKwlpZiAoIXBjaV9kZXZpY2Vfbm9kZSkgeworCQlBQ1BJX0ZSRUUocGNpX2lkKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9PUEVSQU5EX1RZUEUpOworCX0KKworCS8qCisJICogR2V0IHRoZSBQQ0kgZGV2aWNlIGFuZCBmdW5jdGlvbiBudW1iZXJzIGZyb20gdGhlIF9BRFIgb2JqZWN0IGNvbnRhaW5lZAorCSAqIGluIHRoZSBwYXJlbnQncyBzY29wZS4KKwkgKi8KKwlzdGF0dXMgPQorCSAgICBhY3BpX3V0X2V2YWx1YXRlX251bWVyaWNfb2JqZWN0KE1FVEhPRF9OQU1FX19BRFIsIHBjaV9kZXZpY2Vfbm9kZSwKKwkJCQkJICAgICZwY2lfdmFsdWUpOworCisJLyoKKwkgKiBUaGUgZGVmYXVsdCBpcyB6ZXJvLCBhbmQgc2luY2UgdGhlIGFsbG9jYXRpb24gYWJvdmUgemVyb2VkIHRoZSBkYXRhLAorCSAqIGp1c3QgZG8gbm90aGluZyBvbiBmYWlsdXJlLgorCSAqLworCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkgeworCQlwY2lfaWQtPmRldmljZSA9IEFDUElfSElXT1JEKEFDUElfTE9EV09SRChwY2lfdmFsdWUpKTsKKwkJcGNpX2lkLT5mdW5jdGlvbiA9IEFDUElfTE9XT1JEKEFDUElfTE9EV09SRChwY2lfdmFsdWUpKTsKKwl9CisKKwkvKiBUaGUgUENJIHNlZ21lbnQgbnVtYmVyIGNvbWVzIGZyb20gdGhlIF9TRUcgbWV0aG9kICovCisKKwlzdGF0dXMgPQorCSAgICBhY3BpX3V0X2V2YWx1YXRlX251bWVyaWNfb2JqZWN0KE1FVEhPRF9OQU1FX19TRUcsIHBjaV9yb290X25vZGUsCisJCQkJCSAgICAmcGNpX3ZhbHVlKTsKKwlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpIHsKKwkJcGNpX2lkLT5zZWdtZW50ID0gQUNQSV9MT1dPUkQocGNpX3ZhbHVlKTsKKwl9CisKKwkvKiBUaGUgUENJIGJ1cyBudW1iZXIgY29tZXMgZnJvbSB0aGUgX0JCTiBtZXRob2QgKi8KKworCXN0YXR1cyA9CisJICAgIGFjcGlfdXRfZXZhbHVhdGVfbnVtZXJpY19vYmplY3QoTUVUSE9EX05BTUVfX0JCTiwgcGNpX3Jvb3Rfbm9kZSwKKwkJCQkJICAgICZwY2lfdmFsdWUpOworCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkgeworCQlwY2lfaWQtPmJ1cyA9IEFDUElfTE9XT1JEKHBjaV92YWx1ZSk7CisJfQorCisJLyogQ29tcGxldGUgdGhpcyBkZXZpY2UncyBwY2lfaWQgKi8KKworCWFjcGlfb3NfZGVyaXZlX3BjaV9pZChwY2lfcm9vdF9ub2RlLCByZWdpb25fb2JqLT5yZWdpb24ubm9kZSwgJnBjaV9pZCk7CisKKwkqcmVnaW9uX2NvbnRleHQgPSBwY2lfaWQ7CisJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9ldl9tYXRjaF9wY2lfcm9vdF9icmlkZ2UKKyAqCisgKiBQQVJBTUVURVJTOiAgSWQgICAgICAgICAgICAgIC0gVGhlIEhJRC9DSUQgaW4gc3RyaW5nIGZvcm1hdAorICoKKyAqIFJFVFVSTjogICAgICBUUlVFIGlmIHRoZSBJZCBpcyBhIG1hdGNoIGZvciBhIFBDSS9QQ0ktRXhwcmVzcyBSb290IEJyaWRnZQorICoKKyAqIERFU0NSSVBUSU9OOiBEZXRlcm1pbmUgaWYgdGhlIGlucHV0IElEIGlzIGEgUENJIFJvb3QgQnJpZGdlIElELgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB1OCBhY3BpX2V2X21hdGNoX3BjaV9yb290X2JyaWRnZShjaGFyICppZCkKK3sKKworCS8qCisJICogQ2hlY2sgaWYgdGhpcyBpcyBhIFBDSSByb290LgorCSAqIEFDUEkgMy4wKzogY2hlY2sgZm9yIGEgUENJIEV4cHJlc3Mgcm9vdCBhbHNvLgorCSAqLworCWlmICghKEFDUElfU1RSTkNNUChpZCwKKwkJCSAgIFBDSV9ST09UX0hJRF9TVFJJTkcsCisJCQkgICBzaXplb2YoUENJX1JPT1RfSElEX1NUUklORykpKSB8fAorCSAgICAhKEFDUElfU1RSTkNNUChpZCwKKwkJCSAgIFBDSV9FWFBSRVNTX1JPT1RfSElEX1NUUklORywKKwkJCSAgIHNpemVvZihQQ0lfRVhQUkVTU19ST09UX0hJRF9TVFJJTkcpKSkpIHsKKwkJcmV0dXJuIChUUlVFKTsKKwl9CisKKwlyZXR1cm4gKEZBTFNFKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9ldl9pc19wY2lfcm9vdF9icmlkZ2UKKyAqCisgKiBQQVJBTUVURVJTOiAgTm9kZSAgICAgICAgICAgIC0gRGV2aWNlIG5vZGUgYmVpbmcgZXhhbWluZWQKKyAqCisgKiBSRVRVUk46ICAgICAgVFJVRSBpZiBkZXZpY2UgaXMgYSBQQ0kvUENJLUV4cHJlc3MgUm9vdCBCcmlkZ2UKKyAqCisgKiBERVNDUklQVElPTjogRGV0ZXJtaW5lIGlmIHRoZSBpbnB1dCBkZXZpY2UgcmVwcmVzZW50cyBhIFBDSSBSb290IEJyaWRnZSBieQorICogICAgICAgICAgICAgIGV4YW1pbmluZyB0aGUgX0hJRCBhbmQgX0NJRCBmb3IgdGhlIGRldmljZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdTggYWNwaV9ldl9pc19wY2lfcm9vdF9icmlkZ2Uoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGUpCit7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCXN0cnVjdCBhY3BpY2FfZGV2aWNlX2lkIGhpZDsKKwlzdHJ1Y3QgYWNwaV9jb21wYXRpYmxlX2lkX2xpc3QgKmNpZDsKKwl1MzIgaTsKKworCS8qIEdldCB0aGUgX0hJRCBhbmQgY2hlY2sgZm9yIGEgUENJIFJvb3QgQnJpZGdlICovCisKKwlzdGF0dXMgPSBhY3BpX3V0X2V4ZWN1dGVfSElEKG5vZGUsICZoaWQpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm4gKEZBTFNFKTsKKwl9CisKKwlpZiAoYWNwaV9ldl9tYXRjaF9wY2lfcm9vdF9icmlkZ2UoaGlkLnZhbHVlKSkgeworCQlyZXR1cm4gKFRSVUUpOworCX0KKworCS8qIFRoZSBfSElEIGRpZCBub3QgbWF0Y2guIEdldCB0aGUgX0NJRCBhbmQgY2hlY2sgZm9yIGEgUENJIFJvb3QgQnJpZGdlICovCisKKwlzdGF0dXMgPSBhY3BpX3V0X2V4ZWN1dGVfQ0lEKG5vZGUsICZjaWQpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm4gKEZBTFNFKTsKKwl9CisKKwkvKiBDaGVjayBhbGwgX0NJRHMgaW4gdGhlIHJldHVybmVkIGxpc3QgKi8KKworCWZvciAoaSA9IDA7IGkgPCBjaWQtPmNvdW50OyBpKyspIHsKKwkJaWYgKGFjcGlfZXZfbWF0Y2hfcGNpX3Jvb3RfYnJpZGdlKGNpZC0+aWRbaV0udmFsdWUpKSB7CisJCQlBQ1BJX0ZSRUUoY2lkKTsKKwkJCXJldHVybiAoVFJVRSk7CisJCX0KKwl9CisKKwlBQ1BJX0ZSRUUoY2lkKTsKKwlyZXR1cm4gKEZBTFNFKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9ldl9wY2lfYmFyX3JlZ2lvbl9zZXR1cAorICoKKyAqIFBBUkFNRVRFUlM6ICBIYW5kbGUgICAgICAgICAgICAgIC0gUmVnaW9uIHdlIGFyZSBpbnRlcmVzdGVkIGluCisgKiAgICAgICAgICAgICAgRnVuY3Rpb24gICAgICAgICAgICAtIFN0YXJ0IG9yIHN0b3AKKyAqICAgICAgICAgICAgICBoYW5kbGVyX2NvbnRleHQgICAgIC0gQWRkcmVzcyBzcGFjZSBoYW5kbGVyIGNvbnRleHQKKyAqICAgICAgICAgICAgICByZWdpb25fY29udGV4dCAgICAgIC0gUmVnaW9uIHNwZWNpZmljIGNvbnRleHQKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IFNldHVwIGEgcGNpX2JBUiBvcGVyYXRpb24gcmVnaW9uCisgKgorICogTVVURVg6ICAgICAgIEFzc3VtZXMgbmFtZXNwYWNlIGlzIG5vdCBsb2NrZWQKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCithY3BpX3N0YXR1cworYWNwaV9ldl9wY2lfYmFyX3JlZ2lvbl9zZXR1cChhY3BpX2hhbmRsZSBoYW5kbGUsCisJCQkgICAgIHUzMiBmdW5jdGlvbiwKKwkJCSAgICAgdm9pZCAqaGFuZGxlcl9jb250ZXh0LCB2b2lkICoqcmVnaW9uX2NvbnRleHQpCit7CisJQUNQSV9GVU5DVElPTl9UUkFDRShldl9wY2lfYmFyX3JlZ2lvbl9zZXR1cCk7CisKKwlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX2V2X2Ntb3NfcmVnaW9uX3NldHVwCisgKgorICogUEFSQU1FVEVSUzogIEhhbmRsZSAgICAgICAgICAgICAgLSBSZWdpb24gd2UgYXJlIGludGVyZXN0ZWQgaW4KKyAqICAgICAgICAgICAgICBGdW5jdGlvbiAgICAgICAgICAgIC0gU3RhcnQgb3Igc3RvcAorICogICAgICAgICAgICAgIGhhbmRsZXJfY29udGV4dCAgICAgLSBBZGRyZXNzIHNwYWNlIGhhbmRsZXIgY29udGV4dAorICogICAgICAgICAgICAgIHJlZ2lvbl9jb250ZXh0ICAgICAgLSBSZWdpb24gc3BlY2lmaWMgY29udGV4dAorICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogU2V0dXAgYSBDTU9TIG9wZXJhdGlvbiByZWdpb24KKyAqCisgKiBNVVRFWDogICAgICAgQXNzdW1lcyBuYW1lc3BhY2UgaXMgbm90IGxvY2tlZAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2FjcGlfc3RhdHVzCithY3BpX2V2X2Ntb3NfcmVnaW9uX3NldHVwKGFjcGlfaGFuZGxlIGhhbmRsZSwKKwkJCSAgdTMyIGZ1bmN0aW9uLAorCQkJICB2b2lkICpoYW5kbGVyX2NvbnRleHQsIHZvaWQgKipyZWdpb25fY29udGV4dCkKK3sKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGV2X2Ntb3NfcmVnaW9uX3NldHVwKTsKKworCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfZXZfZGVmYXVsdF9yZWdpb25fc2V0dXAKKyAqCisgKiBQQVJBTUVURVJTOiAgSGFuZGxlICAgICAgICAgICAgICAtIFJlZ2lvbiB3ZSBhcmUgaW50ZXJlc3RlZCBpbgorICogICAgICAgICAgICAgIEZ1bmN0aW9uICAgICAgICAgICAgLSBTdGFydCBvciBzdG9wCisgKiAgICAgICAgICAgICAgaGFuZGxlcl9jb250ZXh0ICAgICAtIEFkZHJlc3Mgc3BhY2UgaGFuZGxlciBjb250ZXh0CisgKiAgICAgICAgICAgICAgcmVnaW9uX2NvbnRleHQgICAgICAtIFJlZ2lvbiBzcGVjaWZpYyBjb250ZXh0CisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBEZWZhdWx0IHJlZ2lvbiBpbml0aWFsaXphdGlvbgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2FjcGlfc3RhdHVzCithY3BpX2V2X2RlZmF1bHRfcmVnaW9uX3NldHVwKGFjcGlfaGFuZGxlIGhhbmRsZSwKKwkJCSAgICAgdTMyIGZ1bmN0aW9uLAorCQkJICAgICB2b2lkICpoYW5kbGVyX2NvbnRleHQsIHZvaWQgKipyZWdpb25fY29udGV4dCkKK3sKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGV2X2RlZmF1bHRfcmVnaW9uX3NldHVwKTsKKworCWlmIChmdW5jdGlvbiA9PSBBQ1BJX1JFR0lPTl9ERUFDVElWQVRFKSB7CisJCSpyZWdpb25fY29udGV4dCA9IE5VTEw7CisJfSBlbHNlIHsKKwkJKnJlZ2lvbl9jb250ZXh0ID0gaGFuZGxlcl9jb250ZXh0OworCX0KKworCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfZXZfaW5pdGlhbGl6ZV9yZWdpb24KKyAqCisgKiBQQVJBTUVURVJTOiAgcmVnaW9uX29iaiAgICAgIC0gUmVnaW9uIHdlIGFyZSBpbml0aWFsaXppbmcKKyAqICAgICAgICAgICAgICBhY3BpX25zX2xvY2tlZCAgLSBJcyBuYW1lc3BhY2UgbG9ja2VkPworICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogSW5pdGlhbGl6ZXMgdGhlIHJlZ2lvbiwgZmluZHMgYW55IF9SRUcgbWV0aG9kcyBhbmQgc2F2ZXMgdGhlbQorICogICAgICAgICAgICAgIGZvciBleGVjdXRpb24gYXQgYSBsYXRlciB0aW1lCisgKgorICogICAgICAgICAgICAgIEdldCB0aGUgYXBwcm9wcmlhdGUgYWRkcmVzcyBzcGFjZSBoYW5kbGVyIGZvciBhIG5ld2x5CisgKiAgICAgICAgICAgICAgY3JlYXRlZCByZWdpb24uCisgKgorICogICAgICAgICAgICAgIFRoaXMgYWxzbyBwZXJmb3JtcyBhZGRyZXNzIHNwYWNlIHNwZWNpZmljIGluaXRpYWxpemF0aW9uLiBGb3IKKyAqICAgICAgICAgICAgICBleGFtcGxlLCBQQ0kgcmVnaW9ucyBtdXN0IGhhdmUgYW4gX0FEUiBvYmplY3QgdGhhdCBjb250YWlucworICogICAgICAgICAgICAgIGEgUENJIGFkZHJlc3MgaW4gdGhlIHNjb3BlIG9mIHRoZSBkZWZpbml0aW9uLiBUaGlzIGFkZHJlc3MgaXMKKyAqICAgICAgICAgICAgICByZXF1aXJlZCB0byBwZXJmb3JtIGFuIGFjY2VzcyB0byBQQ0kgY29uZmlnIHNwYWNlLgorICoKKyAqIE1VVEVYOiAgICAgICBJbnRlcnByZXRlciBzaG91bGQgYmUgdW5sb2NrZWQsIGJlY2F1c2Ugd2UgbWF5IHJ1biB0aGUgX1JFRworICogICAgICAgICAgICAgIG1ldGhvZCBmb3IgdGhpcyByZWdpb24uCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworYWNwaV9zdGF0dXMKK2FjcGlfZXZfaW5pdGlhbGl6ZV9yZWdpb24odW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqcmVnaW9uX29iaiwKKwkJCSAgdTggYWNwaV9uc19sb2NrZWQpCit7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqaGFuZGxlcl9vYmo7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2M7CisJYWNwaV9hZHJfc3BhY2VfdHlwZSBzcGFjZV9pZDsKKwlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZTsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm1ldGhvZF9ub2RlOworCWFjcGlfbmFtZSAqcmVnX25hbWVfcHRyID0gKGFjcGlfbmFtZSAqKSBNRVRIT0RfTkFNRV9fUkVHOworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnJlZ2lvbl9vYmoyOworCisJQUNQSV9GVU5DVElPTl9UUkFDRV9VMzIoZXZfaW5pdGlhbGl6ZV9yZWdpb24sIGFjcGlfbnNfbG9ja2VkKTsKKworCWlmICghcmVnaW9uX29iaikgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX1BBUkFNRVRFUik7CisJfQorCisJaWYgKHJlZ2lvbl9vYmotPmNvbW1vbi5mbGFncyAmIEFPUE9CSl9PQkpFQ1RfSU5JVElBTElaRUQpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKKwl9CisKKwlyZWdpb25fb2JqMiA9IGFjcGlfbnNfZ2V0X3NlY29uZGFyeV9vYmplY3QocmVnaW9uX29iaik7CisJaWYgKCFyZWdpb25fb2JqMikgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9UX0VYSVNUKTsKKwl9CisKKwlub2RlID0gYWNwaV9uc19nZXRfcGFyZW50X25vZGUocmVnaW9uX29iai0+cmVnaW9uLm5vZGUpOworCXNwYWNlX2lkID0gcmVnaW9uX29iai0+cmVnaW9uLnNwYWNlX2lkOworCisJLyogU2V0dXAgZGVmYXVsdHMgKi8KKworCXJlZ2lvbl9vYmotPnJlZ2lvbi5oYW5kbGVyID0gTlVMTDsKKwlyZWdpb25fb2JqMi0+ZXh0cmEubWV0aG9kX1JFRyA9IE5VTEw7CisJcmVnaW9uX29iai0+Y29tbW9uLmZsYWdzICY9IH4oQU9QT0JKX1NFVFVQX0NPTVBMRVRFKTsKKwlyZWdpb25fb2JqLT5jb21tb24uZmxhZ3MgfD0gQU9QT0JKX09CSkVDVF9JTklUSUFMSVpFRDsKKworCS8qIEZpbmQgYW55ICJfUkVHIiBtZXRob2QgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcmVnaW9uIGRlZmluaXRpb24gKi8KKworCXN0YXR1cyA9CisJICAgIGFjcGlfbnNfc2VhcmNoX29uZV9zY29wZSgqcmVnX25hbWVfcHRyLCBub2RlLCBBQ1BJX1RZUEVfTUVUSE9ELAorCQkJCSAgICAgJm1ldGhvZF9ub2RlKTsKKwlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpIHsKKwkJLyoKKwkJICogVGhlIF9SRUcgbWV0aG9kIGlzIG9wdGlvbmFsIGFuZCB0aGVyZSBjYW4gYmUgb25seSBvbmUgcGVyIHJlZ2lvbgorCQkgKiBkZWZpbml0aW9uLiBUaGlzIHdpbGwgYmUgZXhlY3V0ZWQgd2hlbiB0aGUgaGFuZGxlciBpcyBhdHRhY2hlZAorCQkgKiBvciByZW1vdmVkCisJCSAqLworCQlyZWdpb25fb2JqMi0+ZXh0cmEubWV0aG9kX1JFRyA9IG1ldGhvZF9ub2RlOworCX0KKworCS8qCisJICogVGhlIGZvbGxvd2luZyBsb29wIGRlcGVuZHMgdXBvbiB0aGUgcm9vdCBOb2RlIGhhdmluZyBubyBwYXJlbnQKKwkgKiBpZTogYWNwaV9nYmxfcm9vdF9ub2RlLT5wYXJlbnRfZW50cnkgYmVpbmcgc2V0IHRvIE5VTEwKKwkgKi8KKwl3aGlsZSAobm9kZSkgeworCisJCS8qIENoZWNrIHRvIHNlZSBpZiBhIGhhbmRsZXIgZXhpc3RzICovCisKKwkJaGFuZGxlcl9vYmogPSBOVUxMOworCQlvYmpfZGVzYyA9IGFjcGlfbnNfZ2V0X2F0dGFjaGVkX29iamVjdChub2RlKTsKKwkJaWYgKG9ial9kZXNjKSB7CisKKwkJCS8qIENhbiBvbmx5IGJlIGEgaGFuZGxlciBpZiB0aGUgb2JqZWN0IGV4aXN0cyAqLworCisJCQlzd2l0Y2ggKG5vZGUtPnR5cGUpIHsKKwkJCWNhc2UgQUNQSV9UWVBFX0RFVklDRToKKworCQkJCWhhbmRsZXJfb2JqID0gb2JqX2Rlc2MtPmRldmljZS5oYW5kbGVyOworCQkJCWJyZWFrOworCisJCQljYXNlIEFDUElfVFlQRV9QUk9DRVNTT1I6CisKKwkJCQloYW5kbGVyX29iaiA9IG9ial9kZXNjLT5wcm9jZXNzb3IuaGFuZGxlcjsKKwkJCQlicmVhazsKKworCQkJY2FzZSBBQ1BJX1RZUEVfVEhFUk1BTDoKKworCQkJCWhhbmRsZXJfb2JqID0gb2JqX2Rlc2MtPnRoZXJtYWxfem9uZS5oYW5kbGVyOworCQkJCWJyZWFrOworCisJCQlkZWZhdWx0OgorCQkJCS8qIElnbm9yZSBvdGhlciBvYmplY3RzICovCisJCQkJYnJlYWs7CisJCQl9CisKKwkJCXdoaWxlIChoYW5kbGVyX29iaikgeworCisJCQkJLyogSXMgdGhpcyBoYW5kbGVyIG9mIHRoZSBjb3JyZWN0IHR5cGU/ICovCisKKwkJCQlpZiAoaGFuZGxlcl9vYmotPmFkZHJlc3Nfc3BhY2Uuc3BhY2VfaWQgPT0KKwkJCQkgICAgc3BhY2VfaWQpIHsKKworCQkJCQkvKiBGb3VuZCBjb3JyZWN0IGhhbmRsZXIgKi8KKworCQkJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX09QUkVHSU9OLAorCQkJCQkJCSAgIkZvdW5kIGhhbmRsZXIgJXAgZm9yIHJlZ2lvbiAlcCBpbiBvYmogJXBcbiIsCisJCQkJCQkJICBoYW5kbGVyX29iaiwKKwkJCQkJCQkgIHJlZ2lvbl9vYmosCisJCQkJCQkJICBvYmpfZGVzYykpOworCisJCQkJCXN0YXR1cyA9CisJCQkJCSAgICBhY3BpX2V2X2F0dGFjaF9yZWdpb24oaGFuZGxlcl9vYmosCisJCQkJCQkJCSAgcmVnaW9uX29iaiwKKwkJCQkJCQkJICBhY3BpX25zX2xvY2tlZCk7CisKKwkJCQkJLyoKKwkJCQkJICogVGVsbCBhbGwgdXNlcnMgdGhhdCB0aGlzIHJlZ2lvbiBpcyB1c2FibGUgYnkgcnVubmluZyB0aGUgX1JFRworCQkJCQkgKiBtZXRob2QKKwkJCQkJICovCisJCQkJCWlmIChhY3BpX25zX2xvY2tlZCkgeworCQkJCQkJc3RhdHVzID0KKwkJCQkJCSAgICBhY3BpX3V0X3JlbGVhc2VfbXV0ZXgKKwkJCQkJCSAgICAoQUNQSV9NVFhfTkFNRVNQQUNFKTsKKwkJCQkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJCQkJCXJldHVybl9BQ1BJX1NUQVRVUworCQkJCQkJCSAgICAoc3RhdHVzKTsKKwkJCQkJCX0KKwkJCQkJfQorCisJCQkJCXN0YXR1cyA9CisJCQkJCSAgICBhY3BpX2V2X2V4ZWN1dGVfcmVnX21ldGhvZAorCQkJCQkgICAgKHJlZ2lvbl9vYmosIDEpOworCisJCQkJCWlmIChhY3BpX25zX2xvY2tlZCkgeworCQkJCQkJc3RhdHVzID0KKwkJCQkJCSAgICBhY3BpX3V0X2FjcXVpcmVfbXV0ZXgKKwkJCQkJCSAgICAoQUNQSV9NVFhfTkFNRVNQQUNFKTsKKwkJCQkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJCQkJCXJldHVybl9BQ1BJX1NUQVRVUworCQkJCQkJCSAgICAoc3RhdHVzKTsKKwkJCQkJCX0KKwkJCQkJfQorCisJCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CisJCQkJfQorCisJCQkJLyogVHJ5IG5leHQgaGFuZGxlciBpbiB0aGUgbGlzdCAqLworCisJCQkJaGFuZGxlcl9vYmogPSBoYW5kbGVyX29iai0+YWRkcmVzc19zcGFjZS5uZXh0OworCQkJfQorCQl9CisKKwkJLyogVGhpcyBub2RlIGRvZXMgbm90IGhhdmUgdGhlIGhhbmRsZXIgd2UgbmVlZDsgUG9wIHVwIG9uZSBsZXZlbCAqLworCisJCW5vZGUgPSBhY3BpX25zX2dldF9wYXJlbnRfbm9kZShub2RlKTsKKwl9CisKKwkvKiBJZiB3ZSBnZXQgaGVyZSwgdGhlcmUgaXMgbm8gaGFuZGxlciBmb3IgdGhpcyByZWdpb24gKi8KKworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfT1BSRUdJT04sCisJCQkgICJObyBoYW5kbGVyIGZvciBSZWdpb25UeXBlICVzKCVYKSAoUmVnaW9uT2JqICVwKVxuIiwKKwkJCSAgYWNwaV91dF9nZXRfcmVnaW9uX25hbWUoc3BhY2VfaWQpLCBzcGFjZV9pZCwKKwkJCSAgcmVnaW9uX29iaikpOworCisJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PVF9FWElTVCk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2V2c2NpLmMgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2V2c2NpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTY3YjM1NgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXZzY2kuYwpAQCAtMCwwICsxLDE4MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBNb2R1bGUgTmFtZTogZXZzY2kgLSBTeXN0ZW0gQ29udHJvbCBJbnRlcnJ1cHQgY29uZmlndXJhdGlvbiBhbmQKKyAqICAgICAgICAgICAgICAgICAgICAgIGxlZ2FjeSB0byBBQ1BJIG1vZGUgc3RhdGUgdHJhbnNpdGlvbiBmdW5jdGlvbnMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwOCwgSW50ZWwgQ29ycC4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKKyAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIGF0IG1pbmltdW0gYSBkaXNjbGFpbWVyCisgKiAgICBzdWJzdGFudGlhbGx5IHNpbWlsYXIgdG8gdGhlICJOTyBXQVJSQU5UWSIgZGlzY2xhaW1lciBiZWxvdworICogICAgKCJEaXNjbGFpbWVyIikgYW5kIGFueSByZWRpc3RyaWJ1dGlvbiBtdXN0IGJlIGNvbmRpdGlvbmVkIHVwb24KKyAqICAgIGluY2x1ZGluZyBhIHN1YnN0YW50aWFsbHkgc2ltaWxhciBEaXNjbGFpbWVyIHJlcXVpcmVtZW50IGZvciBmdXJ0aGVyCisgKiAgICBiaW5hcnkgcmVkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMKKyAqICAgIG9mIGFueSBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogTk8gV0FSUkFOVFkKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HCisgKiBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KKyAqLworCisjaW5jbHVkZSA8YWNwaS9hY3BpLmg+CisjaW5jbHVkZSAiYWNjb21tb24uaCIKKyNpbmNsdWRlICJhY2V2ZW50cy5oIgorCisjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9FVkVOVFMKK0FDUElfTU9EVUxFX05BTUUoImV2c2NpIikKKworLyogTG9jYWwgcHJvdG90eXBlcyAqLworc3RhdGljIHUzMiBBQ1BJX1NZU1RFTV9YRkFDRSBhY3BpX2V2X3NjaV94cnVwdF9oYW5kbGVyKHZvaWQgKmNvbnRleHQpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX2V2X3NjaV94cnVwdF9oYW5kbGVyCisgKgorICogUEFSQU1FVEVSUzogIENvbnRleHQgICAtIENhbGxpbmcgQ29udGV4dAorICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMgY29kZSBpbmRpY2F0ZXMgd2hldGhlciBpbnRlcnJ1cHQgd2FzIGhhbmRsZWQuCisgKgorICogREVTQ1JJUFRJT046IEludGVycnVwdCBoYW5kbGVyIHRoYXQgd2lsbCBmaWd1cmUgb3V0IHdoYXQgZnVuY3Rpb24gb3IKKyAqICAgICAgICAgICAgICBjb250cm9sIG1ldGhvZCB0byBjYWxsIHRvIGRlYWwgd2l0aCBhIFNDSS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdTMyIEFDUElfU1lTVEVNX1hGQUNFIGFjcGlfZXZfc2NpX3hydXB0X2hhbmRsZXIodm9pZCAqY29udGV4dCkKK3sKKwlzdHJ1Y3QgYWNwaV9ncGVfeHJ1cHRfaW5mbyAqZ3BlX3hydXB0X2xpc3QgPSBjb250ZXh0OworCXUzMiBpbnRlcnJ1cHRfaGFuZGxlZCA9IEFDUElfSU5URVJSVVBUX05PVF9IQU5ETEVEOworCisJQUNQSV9GVU5DVElPTl9UUkFDRShldl9zY2lfeHJ1cHRfaGFuZGxlcik7CisKKwkvKgorCSAqIFdlIGFyZSBndWFyYW50ZWVkIGJ5IHRoZSBBQ1BJIENBIGluaXRpYWxpemF0aW9uL3NodXRkb3duIGNvZGUgdGhhdAorCSAqIGlmIHRoaXMgaW50ZXJydXB0IGhhbmRsZXIgaXMgaW5zdGFsbGVkLCBBQ1BJIGlzIGVuYWJsZWQuCisJICovCisKKwkvKgorCSAqIEZpeGVkIEV2ZW50czoKKwkgKiBDaGVjayBmb3IgYW5kIGRpc3BhdGNoIGFueSBGaXhlZCBFdmVudHMgdGhhdCBoYXZlIG9jY3VycmVkCisJICovCisJaW50ZXJydXB0X2hhbmRsZWQgfD0gYWNwaV9ldl9maXhlZF9ldmVudF9kZXRlY3QoKTsKKworCS8qCisJICogR2VuZXJhbCBQdXJwb3NlIEV2ZW50czoKKwkgKiBDaGVjayBmb3IgYW5kIGRpc3BhdGNoIGFueSBHUEVzIHRoYXQgaGF2ZSBvY2N1cnJlZAorCSAqLworCWludGVycnVwdF9oYW5kbGVkIHw9IGFjcGlfZXZfZ3BlX2RldGVjdChncGVfeHJ1cHRfbGlzdCk7CisKKwlyZXR1cm5fVUlOVDMyKGludGVycnVwdF9oYW5kbGVkKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9ldl9ncGVfeHJ1cHRfaGFuZGxlcgorICoKKyAqIFBBUkFNRVRFUlM6ICBDb250ZXh0ICAgLSBDYWxsaW5nIENvbnRleHQKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzIGNvZGUgaW5kaWNhdGVzIHdoZXRoZXIgaW50ZXJydXB0IHdhcyBoYW5kbGVkLgorICoKKyAqIERFU0NSSVBUSU9OOiBIYW5kbGVyIGZvciBHUEUgQmxvY2sgRGV2aWNlIGludGVycnVwdHMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit1MzIgQUNQSV9TWVNURU1fWEZBQ0UgYWNwaV9ldl9ncGVfeHJ1cHRfaGFuZGxlcih2b2lkICpjb250ZXh0KQoreworCXN0cnVjdCBhY3BpX2dwZV94cnVwdF9pbmZvICpncGVfeHJ1cHRfbGlzdCA9IGNvbnRleHQ7CisJdTMyIGludGVycnVwdF9oYW5kbGVkID0gQUNQSV9JTlRFUlJVUFRfTk9UX0hBTkRMRUQ7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGV2X2dwZV94cnVwdF9oYW5kbGVyKTsKKworCS8qCisJICogV2UgYXJlIGd1YXJhbnRlZWQgYnkgdGhlIEFDUEkgQ0EgaW5pdGlhbGl6YXRpb24vc2h1dGRvd24gY29kZSB0aGF0CisJICogaWYgdGhpcyBpbnRlcnJ1cHQgaGFuZGxlciBpcyBpbnN0YWxsZWQsIEFDUEkgaXMgZW5hYmxlZC4KKwkgKi8KKworCS8qIEdQRXM6IENoZWNrIGZvciBhbmQgZGlzcGF0Y2ggYW55IEdQRXMgdGhhdCBoYXZlIG9jY3VycmVkICovCisKKwlpbnRlcnJ1cHRfaGFuZGxlZCB8PSBhY3BpX2V2X2dwZV9kZXRlY3QoZ3BlX3hydXB0X2xpc3QpOworCisJcmV0dXJuX1VJTlQzMihpbnRlcnJ1cHRfaGFuZGxlZCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9ldl9pbnN0YWxsX3NjaV9oYW5kbGVyCisgKgorICogUEFSQU1FVEVSUzogIG5vbmUKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IEluc3RhbGxzIFNDSSBoYW5kbGVyLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3UzMiBhY3BpX2V2X2luc3RhbGxfc2NpX2hhbmRsZXIodm9pZCkKK3sKKwl1MzIgc3RhdHVzID0gQUVfT0s7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGV2X2luc3RhbGxfc2NpX2hhbmRsZXIpOworCisJc3RhdHVzID0KKwkgICAgYWNwaV9vc19pbnN0YWxsX2ludGVycnVwdF9oYW5kbGVyKCh1MzIpIGFjcGlfZ2JsX0ZBRFQuc2NpX2ludGVycnVwdCwKKwkJCQkJICAgICAgYWNwaV9ldl9zY2lfeHJ1cHRfaGFuZGxlciwKKwkJCQkJICAgICAgYWNwaV9nYmxfZ3BlX3hydXB0X2xpc3RfaGVhZCk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9ldl9yZW1vdmVfc2NpX2hhbmRsZXIKKyAqCisgKiBQQVJBTUVURVJTOiAgbm9uZQorICoKKyAqIFJFVFVSTjogICAgICBFX09LIGlmIGhhbmRsZXIgdW5pbnN0YWxsZWQgT0ssIEVfRVJST1IgaWYgaGFuZGxlciB3YXMgbm90CisgKiAgICAgICAgICAgICAgaW5zdGFsbGVkIHRvIGJlZ2luIHdpdGgKKyAqCisgKiBERVNDUklQVElPTjogUmVtb3ZlIHRoZSBTQ0kgaW50ZXJydXB0IGhhbmRsZXIuIE5vIGZ1cnRoZXIgU0NJcyB3aWxsIGJlCisgKiAgICAgICAgICAgICAgdGFrZW4uCisgKgorICogTm90ZTogIEl0IGRvZXNuJ3Qgc2VlbSBpbXBvcnRhbnQgdG8gZGlzYWJsZSBhbGwgZXZlbnRzIG9yIHNldCB0aGUgZXZlbnQKKyAqICAgICAgICBlbmFibGUgcmVnaXN0ZXJzIHRvIHRoZWlyIG9yaWdpbmFsIHZhbHVlcy4gVGhlIE9TIHNob3VsZCBkaXNhYmxlCisgKiAgICAgICAgdGhlIFNDSSBpbnRlcnJ1cHQgbGV2ZWwgd2hlbiB0aGUgaGFuZGxlciBpcyByZW1vdmVkLCBzbyBubyBtb3JlCisgKiAgICAgICAgZXZlbnRzIHdpbGwgY29tZSBpbi4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCithY3BpX3N0YXR1cyBhY3BpX2V2X3JlbW92ZV9zY2lfaGFuZGxlcih2b2lkKQoreworCWFjcGlfc3RhdHVzIHN0YXR1czsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0UoZXZfcmVtb3ZlX3NjaV9oYW5kbGVyKTsKKworCS8qIEp1c3QgbGV0IHRoZSBPUyByZW1vdmUgdGhlIGhhbmRsZXIgYW5kIGRpc2FibGUgdGhlIGxldmVsICovCisKKwlzdGF0dXMgPQorCSAgICBhY3BpX29zX3JlbW92ZV9pbnRlcnJ1cHRfaGFuZGxlcigodTMyKSBhY3BpX2dibF9GQURULnNjaV9pbnRlcnJ1cHQsCisJCQkJCSAgICAgYWNwaV9ldl9zY2lfeHJ1cHRfaGFuZGxlcik7CisKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXZ4ZmFjZS5jIGIvZHJpdmVycy9hY3BpL2FjcGljYS9ldnhmYWNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2FjYTkwMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXZ4ZmFjZS5jCkBAIC0wLDAgKzEsODIxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogTW9kdWxlIE5hbWU6IGV2eGZhY2UgLSBFeHRlcm5hbCBpbnRlcmZhY2VzIGZvciBBQ1BJIGV2ZW50cworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDgsIEludGVsIENvcnAuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCisgKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSBhdCBtaW5pbXVtIGEgZGlzY2xhaW1lcgorICogICAgc3Vic3RhbnRpYWxseSBzaW1pbGFyIHRvIHRoZSAiTk8gV0FSUkFOVFkiIGRpc2NsYWltZXIgYmVsb3cKKyAqICAgICgiRGlzY2xhaW1lciIpIGFuZCBhbnkgcmVkaXN0cmlidXRpb24gbXVzdCBiZSBjb25kaXRpb25lZCB1cG9uCisgKiAgICBpbmNsdWRpbmcgYSBzdWJzdGFudGlhbGx5IHNpbWlsYXIgRGlzY2xhaW1lciByZXF1aXJlbWVudCBmb3IgZnVydGhlcgorICogICAgYmluYXJ5IHJlZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzCisgKiAgICBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIE5PIFdBUlJBTlRZCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORworICogSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCisgKi8KKworI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgorI2luY2x1ZGUgImFjY29tbW9uLmgiCisjaW5jbHVkZSAiYWNuYW1lc3AuaCIKKyNpbmNsdWRlICJhY2V2ZW50cy5oIgorI2luY2x1ZGUgImFjaW50ZXJwLmgiCisKKyNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX0VWRU5UUworQUNQSV9NT0RVTEVfTkFNRSgiZXZ4ZmFjZSIpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfaW5zdGFsbF9leGNlcHRpb25faGFuZGxlcgorICoKKyAqIFBBUkFNRVRFUlM6ICBIYW5kbGVyICAgICAgICAgLSBQb2ludGVyIHRvIHRoZSBoYW5kbGVyIGZ1bmN0aW9uIGZvciB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudAorICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogU2F2ZXMgdGhlIHBvaW50ZXIgdG8gdGhlIGhhbmRsZXIgZnVuY3Rpb24KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEFDUElfRlVUVVJFX1VTQUdFCithY3BpX3N0YXR1cyBhY3BpX2luc3RhbGxfZXhjZXB0aW9uX2hhbmRsZXIoYWNwaV9leGNlcHRpb25faGFuZGxlciBoYW5kbGVyKQoreworCWFjcGlfc3RhdHVzIHN0YXR1czsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0UoYWNwaV9pbnN0YWxsX2V4Y2VwdGlvbl9oYW5kbGVyKTsKKworCXN0YXR1cyA9IGFjcGlfdXRfYWNxdWlyZV9tdXRleChBQ1BJX01UWF9FVkVOVFMpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKKwl9CisKKwkvKiBEb24ndCBhbGxvdyB0d28gaGFuZGxlcnMuICovCisKKwlpZiAoYWNwaV9nYmxfZXhjZXB0aW9uX2hhbmRsZXIpIHsKKwkJc3RhdHVzID0gQUVfQUxSRUFEWV9FWElTVFM7CisJCWdvdG8gY2xlYW51cDsKKwl9CisKKwkvKiBJbnN0YWxsIHRoZSBoYW5kbGVyICovCisKKwlhY3BpX2dibF9leGNlcHRpb25faGFuZGxlciA9IGhhbmRsZXI7CisKKyAgICAgIGNsZWFudXA6CisJKHZvaWQpYWNwaV91dF9yZWxlYXNlX211dGV4KEFDUElfTVRYX0VWRU5UUyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Cit9CisKK0FDUElfRVhQT1JUX1NZTUJPTChhY3BpX2luc3RhbGxfZXhjZXB0aW9uX2hhbmRsZXIpCisjZW5kaWYJCQkJLyogIEFDUElfRlVUVVJFX1VTQUdFICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9pbnN0YWxsX2ZpeGVkX2V2ZW50X2hhbmRsZXIKKyAqCisgKiBQQVJBTUVURVJTOiAgRXZlbnQgICAgICAgICAgIC0gRXZlbnQgdHlwZSB0byBlbmFibGUuCisgKiAgICAgICAgICAgICAgSGFuZGxlciAgICAgICAgIC0gUG9pbnRlciB0byB0aGUgaGFuZGxlciBmdW5jdGlvbiBmb3IgdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQKKyAqICAgICAgICAgICAgICBDb250ZXh0ICAgICAgICAgLSBWYWx1ZSBwYXNzZWQgdG8gdGhlIGhhbmRsZXIgb24gZWFjaCBHUEUKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IFNhdmVzIHRoZSBwb2ludGVyIHRvIHRoZSBoYW5kbGVyIGZ1bmN0aW9uIGFuZCB0aGVuIGVuYWJsZXMgdGhlCisgKiAgICAgICAgICAgICAgZXZlbnQuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2FjcGlfc3RhdHVzCithY3BpX2luc3RhbGxfZml4ZWRfZXZlbnRfaGFuZGxlcih1MzIgZXZlbnQsCisJCQkJIGFjcGlfZXZlbnRfaGFuZGxlciBoYW5kbGVyLCB2b2lkICpjb250ZXh0KQoreworCWFjcGlfc3RhdHVzIHN0YXR1czsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0UoYWNwaV9pbnN0YWxsX2ZpeGVkX2V2ZW50X2hhbmRsZXIpOworCisJLyogUGFyYW1ldGVyIHZhbGlkYXRpb24gKi8KKworCWlmIChldmVudCA+IEFDUElfRVZFTlRfTUFYKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfUEFSQU1FVEVSKTsKKwl9CisKKwlzdGF0dXMgPSBhY3BpX3V0X2FjcXVpcmVfbXV0ZXgoQUNQSV9NVFhfRVZFTlRTKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CisJfQorCisJLyogRG9uJ3QgYWxsb3cgdHdvIGhhbmRsZXJzLiAqLworCisJaWYgKE5VTEwgIT0gYWNwaV9nYmxfZml4ZWRfZXZlbnRfaGFuZGxlcnNbZXZlbnRdLmhhbmRsZXIpIHsKKwkJc3RhdHVzID0gQUVfQUxSRUFEWV9FWElTVFM7CisJCWdvdG8gY2xlYW51cDsKKwl9CisKKwkvKiBJbnN0YWxsIHRoZSBoYW5kbGVyIGJlZm9yZSBlbmFibGluZyB0aGUgZXZlbnQgKi8KKworCWFjcGlfZ2JsX2ZpeGVkX2V2ZW50X2hhbmRsZXJzW2V2ZW50XS5oYW5kbGVyID0gaGFuZGxlcjsKKwlhY3BpX2dibF9maXhlZF9ldmVudF9oYW5kbGVyc1tldmVudF0uY29udGV4dCA9IGNvbnRleHQ7CisKKwlzdGF0dXMgPSBhY3BpX2NsZWFyX2V2ZW50KGV2ZW50KTsKKwlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpCisJCXN0YXR1cyA9IGFjcGlfZW5hYmxlX2V2ZW50KGV2ZW50LCAwKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJQUNQSV9XQVJOSU5HKChBRV9JTkZPLCAiQ291bGQgbm90IGVuYWJsZSBmaXhlZCBldmVudCAlWCIsCisJCQkgICAgICBldmVudCkpOworCisJCS8qIFJlbW92ZSB0aGUgaGFuZGxlciAqLworCisJCWFjcGlfZ2JsX2ZpeGVkX2V2ZW50X2hhbmRsZXJzW2V2ZW50XS5oYW5kbGVyID0gTlVMTDsKKwkJYWNwaV9nYmxfZml4ZWRfZXZlbnRfaGFuZGxlcnNbZXZlbnRdLmNvbnRleHQgPSBOVUxMOworCX0gZWxzZSB7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywKKwkJCQkgICJFbmFibGVkIGZpeGVkIGV2ZW50ICVYLCBIYW5kbGVyPSVwXG4iLCBldmVudCwKKwkJCQkgIGhhbmRsZXIpKTsKKwl9CisKKyAgICAgIGNsZWFudXA6CisJKHZvaWQpYWNwaV91dF9yZWxlYXNlX211dGV4KEFDUElfTVRYX0VWRU5UUyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Cit9CisKK0FDUElfRVhQT1JUX1NZTUJPTChhY3BpX2luc3RhbGxfZml4ZWRfZXZlbnRfaGFuZGxlcikKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9yZW1vdmVfZml4ZWRfZXZlbnRfaGFuZGxlcgorICoKKyAqIFBBUkFNRVRFUlM6ICBFdmVudCAgICAgICAgICAgLSBFdmVudCB0eXBlIHRvIGRpc2FibGUuCisgKiAgICAgICAgICAgICAgSGFuZGxlciAgICAgICAgIC0gQWRkcmVzcyBvZiB0aGUgaGFuZGxlcgorICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogRGlzYWJsZXMgdGhlIGV2ZW50IGFuZCB1bnJlZ2lzdGVycyB0aGUgZXZlbnQgaGFuZGxlci4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYWNwaV9zdGF0dXMKK2FjcGlfcmVtb3ZlX2ZpeGVkX2V2ZW50X2hhbmRsZXIodTMyIGV2ZW50LCBhY3BpX2V2ZW50X2hhbmRsZXIgaGFuZGxlcikKK3sKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0UoYWNwaV9yZW1vdmVfZml4ZWRfZXZlbnRfaGFuZGxlcik7CisKKwkvKiBQYXJhbWV0ZXIgdmFsaWRhdGlvbiAqLworCisJaWYgKGV2ZW50ID4gQUNQSV9FVkVOVF9NQVgpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9QQVJBTUVURVIpOworCX0KKworCXN0YXR1cyA9IGFjcGlfdXRfYWNxdWlyZV9tdXRleChBQ1BJX01UWF9FVkVOVFMpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKKwl9CisKKwkvKiBEaXNhYmxlIHRoZSBldmVudCBiZWZvcmUgcmVtb3ZpbmcgdGhlIGhhbmRsZXIgKi8KKworCXN0YXR1cyA9IGFjcGlfZGlzYWJsZV9ldmVudChldmVudCwgMCk7CisKKwkvKiBBbHdheXMgUmVtb3ZlIHRoZSBoYW5kbGVyICovCisKKwlhY3BpX2dibF9maXhlZF9ldmVudF9oYW5kbGVyc1tldmVudF0uaGFuZGxlciA9IE5VTEw7CisJYWNwaV9nYmxfZml4ZWRfZXZlbnRfaGFuZGxlcnNbZXZlbnRdLmNvbnRleHQgPSBOVUxMOworCisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCUFDUElfV0FSTklORygoQUVfSU5GTywKKwkJCSAgICAgICJDb3VsZCBub3Qgd3JpdGUgdG8gZml4ZWQgZXZlbnQgZW5hYmxlIHJlZ2lzdGVyICVYIiwKKwkJCSAgICAgIGV2ZW50KSk7CisJfSBlbHNlIHsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLCAiRGlzYWJsZWQgZml4ZWQgZXZlbnQgJVhcbiIsCisJCQkJICBldmVudCkpOworCX0KKworCSh2b2lkKWFjcGlfdXRfcmVsZWFzZV9tdXRleChBQ1BJX01UWF9FVkVOVFMpOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworfQorCitBQ1BJX0VYUE9SVF9TWU1CT0woYWNwaV9yZW1vdmVfZml4ZWRfZXZlbnRfaGFuZGxlcikKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9pbnN0YWxsX25vdGlmeV9oYW5kbGVyCisgKgorICogUEFSQU1FVEVSUzogIERldmljZSAgICAgICAgICAtIFRoZSBkZXZpY2UgZm9yIHdoaWNoIG5vdGlmaWVzIHdpbGwgYmUgaGFuZGxlZAorICogICAgICAgICAgICAgIGhhbmRsZXJfdHlwZSAgICAtIFRoZSB0eXBlIG9mIGhhbmRsZXI6CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQ1BJX1NZU1RFTV9OT1RJRlk6IHN5c3RlbV9oYW5kbGVyICgwMC03ZikKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFDUElfREVWSUNFX05PVElGWTogZHJpdmVyX2hhbmRsZXIgKDgwLWZmKQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUNQSV9BTExfTk9USUZZOiAgYm90aCBzeXN0ZW0gYW5kIGRldmljZQorICogICAgICAgICAgICAgIEhhbmRsZXIgICAgICAgICAtIEFkZHJlc3Mgb2YgdGhlIGhhbmRsZXIKKyAqICAgICAgICAgICAgICBDb250ZXh0ICAgICAgICAgLSBWYWx1ZSBwYXNzZWQgdG8gdGhlIGhhbmRsZXIgb24gZWFjaCBHUEUKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IEluc3RhbGwgYSBoYW5kbGVyIGZvciBub3RpZmllcyBvbiBhbiBBQ1BJIGRldmljZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCithY3BpX3N0YXR1cworYWNwaV9pbnN0YWxsX25vdGlmeV9oYW5kbGVyKGFjcGlfaGFuZGxlIGRldmljZSwKKwkJCSAgICB1MzIgaGFuZGxlcl90eXBlLAorCQkJICAgIGFjcGlfbm90aWZ5X2hhbmRsZXIgaGFuZGxlciwgdm9pZCAqY29udGV4dCkKK3sKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYzsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpub3RpZnlfb2JqOworCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0UoYWNwaV9pbnN0YWxsX25vdGlmeV9oYW5kbGVyKTsKKworCS8qIFBhcmFtZXRlciB2YWxpZGF0aW9uICovCisKKwlpZiAoKCFkZXZpY2UpIHx8CisJICAgICghaGFuZGxlcikgfHwgKGhhbmRsZXJfdHlwZSA+IEFDUElfTUFYX05PVElGWV9IQU5ETEVSX1RZUEUpKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfUEFSQU1FVEVSKTsKKwl9CisKKwlzdGF0dXMgPSBhY3BpX3V0X2FjcXVpcmVfbXV0ZXgoQUNQSV9NVFhfTkFNRVNQQUNFKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CisJfQorCisJLyogQ29udmVydCBhbmQgdmFsaWRhdGUgdGhlIGRldmljZSBoYW5kbGUgKi8KKworCW5vZGUgPSBhY3BpX25zX21hcF9oYW5kbGVfdG9fbm9kZShkZXZpY2UpOworCWlmICghbm9kZSkgeworCQlzdGF0dXMgPSBBRV9CQURfUEFSQU1FVEVSOworCQlnb3RvIHVubG9ja19hbmRfZXhpdDsKKwl9CisKKwkvKgorCSAqIFJvb3QgT2JqZWN0OgorCSAqIFJlZ2lzdGVyaW5nIGEgbm90aWZ5IGhhbmRsZXIgb24gdGhlIHJvb3Qgb2JqZWN0IGluZGljYXRlcyB0aGF0IHRoZQorCSAqIGNhbGxlciB3aXNoZXMgdG8gcmVjZWl2ZSBub3RpZmljYXRpb25zIGZvciBhbGwgb2JqZWN0cy4gTm90ZSB0aGF0CisJICogb25seSBvbmUgPGV4dGVybmFsPiBnbG9iYWwgaGFuZGxlciBjYW4gYmUgcmVnc2l0ZXJlZCAocGVyIG5vdGlmeSB0eXBlKS4KKwkgKi8KKwlpZiAoZGV2aWNlID09IEFDUElfUk9PVF9PQkpFQ1QpIHsKKworCQkvKiBNYWtlIHN1cmUgdGhlIGhhbmRsZXIgaXMgbm90IGFscmVhZHkgaW5zdGFsbGVkICovCisKKwkJaWYgKCgoaGFuZGxlcl90eXBlICYgQUNQSV9TWVNURU1fTk9USUZZKSAmJgorCQkgICAgIGFjcGlfZ2JsX3N5c3RlbV9ub3RpZnkuaGFuZGxlcikgfHwKKwkJICAgICgoaGFuZGxlcl90eXBlICYgQUNQSV9ERVZJQ0VfTk9USUZZKSAmJgorCQkgICAgIGFjcGlfZ2JsX2RldmljZV9ub3RpZnkuaGFuZGxlcikpIHsKKwkJCXN0YXR1cyA9IEFFX0FMUkVBRFlfRVhJU1RTOworCQkJZ290byB1bmxvY2tfYW5kX2V4aXQ7CisJCX0KKworCQlpZiAoaGFuZGxlcl90eXBlICYgQUNQSV9TWVNURU1fTk9USUZZKSB7CisJCQlhY3BpX2dibF9zeXN0ZW1fbm90aWZ5Lm5vZGUgPSBub2RlOworCQkJYWNwaV9nYmxfc3lzdGVtX25vdGlmeS5oYW5kbGVyID0gaGFuZGxlcjsKKwkJCWFjcGlfZ2JsX3N5c3RlbV9ub3RpZnkuY29udGV4dCA9IGNvbnRleHQ7CisJCX0KKworCQlpZiAoaGFuZGxlcl90eXBlICYgQUNQSV9ERVZJQ0VfTk9USUZZKSB7CisJCQlhY3BpX2dibF9kZXZpY2Vfbm90aWZ5Lm5vZGUgPSBub2RlOworCQkJYWNwaV9nYmxfZGV2aWNlX25vdGlmeS5oYW5kbGVyID0gaGFuZGxlcjsKKwkJCWFjcGlfZ2JsX2RldmljZV9ub3RpZnkuY29udGV4dCA9IGNvbnRleHQ7CisJCX0KKworCQkvKiBHbG9iYWwgbm90aWZ5IGhhbmRsZXIgaW5zdGFsbGVkICovCisJfQorCisJLyoKKwkgKiBBbGwgT3RoZXIgT2JqZWN0czoKKwkgKiBDYWxsZXIgd2lsbCBvbmx5IHJlY2VpdmUgbm90aWZpY2F0aW9ucyBzcGVjaWZpYyB0byB0aGUgdGFyZ2V0IG9iamVjdC4KKwkgKiBOb3RlIHRoYXQgb25seSBjZXJ0YWluIG9iamVjdCB0eXBlcyBjYW4gcmVjZWl2ZSBub3RpZmljYXRpb25zLgorCSAqLworCWVsc2UgeworCQkvKiBOb3RpZmllcyBhbGxvd2VkIG9uIHRoaXMgb2JqZWN0PyAqLworCisJCWlmICghYWNwaV9ldl9pc19ub3RpZnlfb2JqZWN0KG5vZGUpKSB7CisJCQlzdGF0dXMgPSBBRV9UWVBFOworCQkJZ290byB1bmxvY2tfYW5kX2V4aXQ7CisJCX0KKworCQkvKiBDaGVjayBmb3IgYW4gZXhpc3RpbmcgaW50ZXJuYWwgb2JqZWN0ICovCisKKwkJb2JqX2Rlc2MgPSBhY3BpX25zX2dldF9hdHRhY2hlZF9vYmplY3Qobm9kZSk7CisJCWlmIChvYmpfZGVzYykgeworCisJCQkvKiBPYmplY3QgZXhpc3RzIC0gbWFrZSBzdXJlIHRoZXJlJ3Mgbm8gaGFuZGxlciAqLworCisJCQlpZiAoKChoYW5kbGVyX3R5cGUgJiBBQ1BJX1NZU1RFTV9OT1RJRlkpICYmCisJCQkgICAgIG9ial9kZXNjLT5jb21tb25fbm90aWZ5LnN5c3RlbV9ub3RpZnkpIHx8CisJCQkgICAgKChoYW5kbGVyX3R5cGUgJiBBQ1BJX0RFVklDRV9OT1RJRlkpICYmCisJCQkgICAgIG9ial9kZXNjLT5jb21tb25fbm90aWZ5LmRldmljZV9ub3RpZnkpKSB7CisJCQkJc3RhdHVzID0gQUVfQUxSRUFEWV9FWElTVFM7CisJCQkJZ290byB1bmxvY2tfYW5kX2V4aXQ7CisJCQl9CisJCX0gZWxzZSB7CisJCQkvKiBDcmVhdGUgYSBuZXcgb2JqZWN0ICovCisKKwkJCW9ial9kZXNjID0gYWNwaV91dF9jcmVhdGVfaW50ZXJuYWxfb2JqZWN0KG5vZGUtPnR5cGUpOworCQkJaWYgKCFvYmpfZGVzYykgeworCQkJCXN0YXR1cyA9IEFFX05PX01FTU9SWTsKKwkJCQlnb3RvIHVubG9ja19hbmRfZXhpdDsKKwkJCX0KKworCQkJLyogQXR0YWNoIG5ldyBvYmplY3QgdG8gdGhlIE5vZGUgKi8KKworCQkJc3RhdHVzID0KKwkJCSAgICBhY3BpX25zX2F0dGFjaF9vYmplY3QoZGV2aWNlLCBvYmpfZGVzYywgbm9kZS0+dHlwZSk7CisKKwkJCS8qIFJlbW92ZSBsb2NhbCByZWZlcmVuY2UgdG8gdGhlIG9iamVjdCAqLworCisJCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2Uob2JqX2Rlc2MpOworCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQkJZ290byB1bmxvY2tfYW5kX2V4aXQ7CisJCQl9CisJCX0KKworCQkvKiBJbnN0YWxsIHRoZSBoYW5kbGVyICovCisKKwkJbm90aWZ5X29iaiA9CisJCSAgICBhY3BpX3V0X2NyZWF0ZV9pbnRlcm5hbF9vYmplY3QoQUNQSV9UWVBFX0xPQ0FMX05PVElGWSk7CisJCWlmICghbm90aWZ5X29iaikgeworCQkJc3RhdHVzID0gQUVfTk9fTUVNT1JZOworCQkJZ290byB1bmxvY2tfYW5kX2V4aXQ7CisJCX0KKworCQlub3RpZnlfb2JqLT5ub3RpZnkubm9kZSA9IG5vZGU7CisJCW5vdGlmeV9vYmotPm5vdGlmeS5oYW5kbGVyID0gaGFuZGxlcjsKKwkJbm90aWZ5X29iai0+bm90aWZ5LmNvbnRleHQgPSBjb250ZXh0OworCisJCWlmIChoYW5kbGVyX3R5cGUgJiBBQ1BJX1NZU1RFTV9OT1RJRlkpIHsKKwkJCW9ial9kZXNjLT5jb21tb25fbm90aWZ5LnN5c3RlbV9ub3RpZnkgPSBub3RpZnlfb2JqOworCQl9CisKKwkJaWYgKGhhbmRsZXJfdHlwZSAmIEFDUElfREVWSUNFX05PVElGWSkgeworCQkJb2JqX2Rlc2MtPmNvbW1vbl9ub3RpZnkuZGV2aWNlX25vdGlmeSA9IG5vdGlmeV9vYmo7CisJCX0KKworCQlpZiAoaGFuZGxlcl90eXBlID09IEFDUElfQUxMX05PVElGWSkgeworCisJCQkvKiBFeHRyYSByZWYgaWYgaW5zdGFsbGVkIGluIGJvdGggKi8KKworCQkJYWNwaV91dF9hZGRfcmVmZXJlbmNlKG5vdGlmeV9vYmopOworCQl9CisJfQorCisgICAgICB1bmxvY2tfYW5kX2V4aXQ6CisJKHZvaWQpYWNwaV91dF9yZWxlYXNlX211dGV4KEFDUElfTVRYX05BTUVTUEFDRSk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Cit9CisKK0FDUElfRVhQT1JUX1NZTUJPTChhY3BpX2luc3RhbGxfbm90aWZ5X2hhbmRsZXIpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfcmVtb3ZlX25vdGlmeV9oYW5kbGVyCisgKgorICogUEFSQU1FVEVSUzogIERldmljZSAgICAgICAgICAtIFRoZSBkZXZpY2UgZm9yIHdoaWNoIG5vdGlmaWVzIHdpbGwgYmUgaGFuZGxlZAorICogICAgICAgICAgICAgIGhhbmRsZXJfdHlwZSAgICAtIFRoZSB0eXBlIG9mIGhhbmRsZXI6CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQ1BJX1NZU1RFTV9OT1RJRlk6IHN5c3RlbV9oYW5kbGVyICgwMC03ZikKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFDUElfREVWSUNFX05PVElGWTogZHJpdmVyX2hhbmRsZXIgKDgwLWZmKQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUNQSV9BTExfTk9USUZZOiAgYm90aCBzeXN0ZW0gYW5kIGRldmljZQorICogICAgICAgICAgICAgIEhhbmRsZXIgICAgICAgICAtIEFkZHJlc3Mgb2YgdGhlIGhhbmRsZXIKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IFJlbW92ZSBhIGhhbmRsZXIgZm9yIG5vdGlmaWVzIG9uIGFuIEFDUEkgZGV2aWNlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2FjcGlfc3RhdHVzCithY3BpX3JlbW92ZV9ub3RpZnlfaGFuZGxlcihhY3BpX2hhbmRsZSBkZXZpY2UsCisJCQkgICB1MzIgaGFuZGxlcl90eXBlLCBhY3BpX25vdGlmeV9oYW5kbGVyIGhhbmRsZXIpCit7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqbm90aWZ5X29iajsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYzsKKwlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZTsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGFjcGlfcmVtb3ZlX25vdGlmeV9oYW5kbGVyKTsKKworCS8qIFBhcmFtZXRlciB2YWxpZGF0aW9uICovCisKKwlpZiAoKCFkZXZpY2UpIHx8CisJICAgICghaGFuZGxlcikgfHwgKGhhbmRsZXJfdHlwZSA+IEFDUElfTUFYX05PVElGWV9IQU5ETEVSX1RZUEUpKSB7CisJCXN0YXR1cyA9IEFFX0JBRF9QQVJBTUVURVI7CisJCWdvdG8gZXhpdDsKKwl9CisKKwlzdGF0dXMgPSBhY3BpX3V0X2FjcXVpcmVfbXV0ZXgoQUNQSV9NVFhfTkFNRVNQQUNFKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJZ290byBleGl0OworCX0KKworCS8qIENvbnZlcnQgYW5kIHZhbGlkYXRlIHRoZSBkZXZpY2UgaGFuZGxlICovCisKKwlub2RlID0gYWNwaV9uc19tYXBfaGFuZGxlX3RvX25vZGUoZGV2aWNlKTsKKwlpZiAoIW5vZGUpIHsKKwkJc3RhdHVzID0gQUVfQkFEX1BBUkFNRVRFUjsKKwkJZ290byB1bmxvY2tfYW5kX2V4aXQ7CisJfQorCisJLyogUm9vdCBPYmplY3QgKi8KKworCWlmIChkZXZpY2UgPT0gQUNQSV9ST09UX09CSkVDVCkgeworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sCisJCQkJICAiUmVtb3Zpbmcgbm90aWZ5IGhhbmRsZXIgZm9yIG5hbWVzcGFjZSByb290IG9iamVjdFxuIikpOworCisJCWlmICgoKGhhbmRsZXJfdHlwZSAmIEFDUElfU1lTVEVNX05PVElGWSkgJiYKKwkJICAgICAhYWNwaV9nYmxfc3lzdGVtX25vdGlmeS5oYW5kbGVyKSB8fAorCQkgICAgKChoYW5kbGVyX3R5cGUgJiBBQ1BJX0RFVklDRV9OT1RJRlkpICYmCisJCSAgICAgIWFjcGlfZ2JsX2RldmljZV9ub3RpZnkuaGFuZGxlcikpIHsKKwkJCXN0YXR1cyA9IEFFX05PVF9FWElTVDsKKwkJCWdvdG8gdW5sb2NrX2FuZF9leGl0OworCQl9CisKKwkJLyogTWFrZSBzdXJlIGFsbCBkZWZlcnJlZCB0YXNrcyBhcmUgY29tcGxldGVkICovCisKKwkJKHZvaWQpYWNwaV91dF9yZWxlYXNlX211dGV4KEFDUElfTVRYX05BTUVTUEFDRSk7CisJCWFjcGlfb3Nfd2FpdF9ldmVudHNfY29tcGxldGUoTlVMTCk7CisJCXN0YXR1cyA9IGFjcGlfdXRfYWNxdWlyZV9tdXRleChBQ1BJX01UWF9OQU1FU1BBQ0UpOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCWdvdG8gZXhpdDsKKwkJfQorCisJCWlmIChoYW5kbGVyX3R5cGUgJiBBQ1BJX1NZU1RFTV9OT1RJRlkpIHsKKwkJCWFjcGlfZ2JsX3N5c3RlbV9ub3RpZnkubm9kZSA9IE5VTEw7CisJCQlhY3BpX2dibF9zeXN0ZW1fbm90aWZ5LmhhbmRsZXIgPSBOVUxMOworCQkJYWNwaV9nYmxfc3lzdGVtX25vdGlmeS5jb250ZXh0ID0gTlVMTDsKKwkJfQorCisJCWlmIChoYW5kbGVyX3R5cGUgJiBBQ1BJX0RFVklDRV9OT1RJRlkpIHsKKwkJCWFjcGlfZ2JsX2RldmljZV9ub3RpZnkubm9kZSA9IE5VTEw7CisJCQlhY3BpX2dibF9kZXZpY2Vfbm90aWZ5LmhhbmRsZXIgPSBOVUxMOworCQkJYWNwaV9nYmxfZGV2aWNlX25vdGlmeS5jb250ZXh0ID0gTlVMTDsKKwkJfQorCX0KKworCS8qIEFsbCBPdGhlciBPYmplY3RzICovCisKKwllbHNlIHsKKwkJLyogTm90aWZpZXMgYWxsb3dlZCBvbiB0aGlzIG9iamVjdD8gKi8KKworCQlpZiAoIWFjcGlfZXZfaXNfbm90aWZ5X29iamVjdChub2RlKSkgeworCQkJc3RhdHVzID0gQUVfVFlQRTsKKwkJCWdvdG8gdW5sb2NrX2FuZF9leGl0OworCQl9CisKKwkJLyogQ2hlY2sgZm9yIGFuIGV4aXN0aW5nIGludGVybmFsIG9iamVjdCAqLworCisJCW9ial9kZXNjID0gYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0KG5vZGUpOworCQlpZiAoIW9ial9kZXNjKSB7CisJCQlzdGF0dXMgPSBBRV9OT1RfRVhJU1Q7CisJCQlnb3RvIHVubG9ja19hbmRfZXhpdDsKKwkJfQorCisJCS8qIE9iamVjdCBleGlzdHMgLSBtYWtlIHN1cmUgdGhlcmUncyBhbiBleGlzdGluZyBoYW5kbGVyICovCisKKwkJaWYgKGhhbmRsZXJfdHlwZSAmIEFDUElfU1lTVEVNX05PVElGWSkgeworCQkJbm90aWZ5X29iaiA9IG9ial9kZXNjLT5jb21tb25fbm90aWZ5LnN5c3RlbV9ub3RpZnk7CisJCQlpZiAoIW5vdGlmeV9vYmopIHsKKwkJCQlzdGF0dXMgPSBBRV9OT1RfRVhJU1Q7CisJCQkJZ290byB1bmxvY2tfYW5kX2V4aXQ7CisJCQl9CisKKwkJCWlmIChub3RpZnlfb2JqLT5ub3RpZnkuaGFuZGxlciAhPSBoYW5kbGVyKSB7CisJCQkJc3RhdHVzID0gQUVfQkFEX1BBUkFNRVRFUjsKKwkJCQlnb3RvIHVubG9ja19hbmRfZXhpdDsKKwkJCX0KKwkJCS8qIE1ha2Ugc3VyZSBhbGwgZGVmZXJyZWQgdGFza3MgYXJlIGNvbXBsZXRlZCAqLworCisJCQkodm9pZClhY3BpX3V0X3JlbGVhc2VfbXV0ZXgoQUNQSV9NVFhfTkFNRVNQQUNFKTsKKwkJCWFjcGlfb3Nfd2FpdF9ldmVudHNfY29tcGxldGUoTlVMTCk7CisJCQlzdGF0dXMgPSBhY3BpX3V0X2FjcXVpcmVfbXV0ZXgoQUNQSV9NVFhfTkFNRVNQQUNFKTsKKwkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJCWdvdG8gZXhpdDsKKwkJCX0KKworCQkJLyogUmVtb3ZlIHRoZSBoYW5kbGVyICovCisJCQlvYmpfZGVzYy0+Y29tbW9uX25vdGlmeS5zeXN0ZW1fbm90aWZ5ID0gTlVMTDsKKwkJCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZShub3RpZnlfb2JqKTsKKwkJfQorCisJCWlmIChoYW5kbGVyX3R5cGUgJiBBQ1BJX0RFVklDRV9OT1RJRlkpIHsKKwkJCW5vdGlmeV9vYmogPSBvYmpfZGVzYy0+Y29tbW9uX25vdGlmeS5kZXZpY2Vfbm90aWZ5OworCQkJaWYgKCFub3RpZnlfb2JqKSB7CisJCQkJc3RhdHVzID0gQUVfTk9UX0VYSVNUOworCQkJCWdvdG8gdW5sb2NrX2FuZF9leGl0OworCQkJfQorCisJCQlpZiAobm90aWZ5X29iai0+bm90aWZ5LmhhbmRsZXIgIT0gaGFuZGxlcikgeworCQkJCXN0YXR1cyA9IEFFX0JBRF9QQVJBTUVURVI7CisJCQkJZ290byB1bmxvY2tfYW5kX2V4aXQ7CisJCQl9CisJCQkvKiBNYWtlIHN1cmUgYWxsIGRlZmVycmVkIHRhc2tzIGFyZSBjb21wbGV0ZWQgKi8KKworCQkJKHZvaWQpYWNwaV91dF9yZWxlYXNlX211dGV4KEFDUElfTVRYX05BTUVTUEFDRSk7CisJCQlhY3BpX29zX3dhaXRfZXZlbnRzX2NvbXBsZXRlKE5VTEwpOworCQkJc3RhdHVzID0gYWNwaV91dF9hY3F1aXJlX211dGV4KEFDUElfTVRYX05BTUVTUEFDRSk7CisJCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCQlnb3RvIGV4aXQ7CisJCQl9CisKKwkJCS8qIFJlbW92ZSB0aGUgaGFuZGxlciAqLworCQkJb2JqX2Rlc2MtPmNvbW1vbl9ub3RpZnkuZGV2aWNlX25vdGlmeSA9IE5VTEw7CisJCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2Uobm90aWZ5X29iaik7CisJCX0KKwl9CisKKyAgICAgIHVubG9ja19hbmRfZXhpdDoKKwkodm9pZClhY3BpX3V0X3JlbGVhc2VfbXV0ZXgoQUNQSV9NVFhfTkFNRVNQQUNFKTsKKyAgICAgIGV4aXQ6CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKQorCQlBQ1BJX0VYQ0VQVElPTigoQUVfSU5GTywgc3RhdHVzLCAiUmVtb3Zpbmcgbm90aWZ5IGhhbmRsZXIiKSk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Cit9CisKK0FDUElfRVhQT1JUX1NZTUJPTChhY3BpX3JlbW92ZV9ub3RpZnlfaGFuZGxlcikKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9pbnN0YWxsX2dwZV9oYW5kbGVyCisgKgorICogUEFSQU1FVEVSUzogIGdwZV9kZXZpY2UgICAgICAtIE5hbWVzcGFjZSBub2RlIGZvciB0aGUgR1BFIChOVUxMIGZvciBGQURUCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmaW5lZCBHUEVzKQorICogICAgICAgICAgICAgIGdwZV9udW1iZXIgICAgICAtIFRoZSBHUEUgbnVtYmVyIHdpdGhpbiB0aGUgR1BFIGJsb2NrCisgKiAgICAgICAgICAgICAgVHlwZSAgICAgICAgICAgIC0gV2hldGhlciB0aGlzIEdQRSBzaG91bGQgYmUgdHJlYXRlZCBhcyBhbgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVkZ2UtIG9yIGxldmVsLXRyaWdnZXJlZCBpbnRlcnJ1cHQuCisgKiAgICAgICAgICAgICAgQWRkcmVzcyAgICAgICAgIC0gQWRkcmVzcyBvZiB0aGUgaGFuZGxlcgorICogICAgICAgICAgICAgIENvbnRleHQgICAgICAgICAtIFZhbHVlIHBhc3NlZCB0byB0aGUgaGFuZGxlciBvbiBlYWNoIEdQRQorICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogSW5zdGFsbCBhIGhhbmRsZXIgZm9yIGEgR2VuZXJhbCBQdXJwb3NlIEV2ZW50LgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCithY3BpX3N0YXR1cworYWNwaV9pbnN0YWxsX2dwZV9oYW5kbGVyKGFjcGlfaGFuZGxlIGdwZV9kZXZpY2UsCisJCQkgdTMyIGdwZV9udW1iZXIsCisJCQkgdTMyIHR5cGUsIGFjcGlfZXZlbnRfaGFuZGxlciBhZGRyZXNzLCB2b2lkICpjb250ZXh0KQoreworCXN0cnVjdCBhY3BpX2dwZV9ldmVudF9pbmZvICpncGVfZXZlbnRfaW5mbzsKKwlzdHJ1Y3QgYWNwaV9oYW5kbGVyX2luZm8gKmhhbmRsZXI7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCWFjcGlfY3B1X2ZsYWdzIGZsYWdzOworCisJQUNQSV9GVU5DVElPTl9UUkFDRShhY3BpX2luc3RhbGxfZ3BlX2hhbmRsZXIpOworCisJLyogUGFyYW1ldGVyIHZhbGlkYXRpb24gKi8KKworCWlmICgoIWFkZHJlc3MpIHx8ICh0eXBlID4gQUNQSV9HUEVfWFJVUFRfVFlQRV9NQVNLKSkgeworCQlzdGF0dXMgPSBBRV9CQURfUEFSQU1FVEVSOworCQlnb3RvIGV4aXQ7CisJfQorCisJc3RhdHVzID0gYWNwaV91dF9hY3F1aXJlX211dGV4KEFDUElfTVRYX0VWRU5UUyk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCWdvdG8gZXhpdDsKKwl9CisKKwkvKiBFbnN1cmUgdGhhdCB3ZSBoYXZlIGEgdmFsaWQgR1BFIG51bWJlciAqLworCisJZ3BlX2V2ZW50X2luZm8gPSBhY3BpX2V2X2dldF9ncGVfZXZlbnRfaW5mbyhncGVfZGV2aWNlLCBncGVfbnVtYmVyKTsKKwlpZiAoIWdwZV9ldmVudF9pbmZvKSB7CisJCXN0YXR1cyA9IEFFX0JBRF9QQVJBTUVURVI7CisJCWdvdG8gdW5sb2NrX2FuZF9leGl0OworCX0KKworCS8qIE1ha2Ugc3VyZSB0aGF0IHRoZXJlIGlzbid0IGEgaGFuZGxlciB0aGVyZSBhbHJlYWR5ICovCisKKwlpZiAoKGdwZV9ldmVudF9pbmZvLT5mbGFncyAmIEFDUElfR1BFX0RJU1BBVENIX01BU0spID09CisJICAgIEFDUElfR1BFX0RJU1BBVENIX0hBTkRMRVIpIHsKKwkJc3RhdHVzID0gQUVfQUxSRUFEWV9FWElTVFM7CisJCWdvdG8gdW5sb2NrX2FuZF9leGl0OworCX0KKworCS8qIEFsbG9jYXRlIGFuZCBpbml0IGhhbmRsZXIgb2JqZWN0ICovCisKKwloYW5kbGVyID0gQUNQSV9BTExPQ0FURV9aRVJPRUQoc2l6ZW9mKHN0cnVjdCBhY3BpX2hhbmRsZXJfaW5mbykpOworCWlmICghaGFuZGxlcikgeworCQlzdGF0dXMgPSBBRV9OT19NRU1PUlk7CisJCWdvdG8gdW5sb2NrX2FuZF9leGl0OworCX0KKworCWhhbmRsZXItPmFkZHJlc3MgPSBhZGRyZXNzOworCWhhbmRsZXItPmNvbnRleHQgPSBjb250ZXh0OworCWhhbmRsZXItPm1ldGhvZF9ub2RlID0gZ3BlX2V2ZW50X2luZm8tPmRpc3BhdGNoLm1ldGhvZF9ub2RlOworCisJLyogRGlzYWJsZSB0aGUgR1BFIGJlZm9yZSBpbnN0YWxsaW5nIHRoZSBoYW5kbGVyICovCisKKwlzdGF0dXMgPSBhY3BpX2V2X2Rpc2FibGVfZ3BlKGdwZV9ldmVudF9pbmZvKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJZ290byB1bmxvY2tfYW5kX2V4aXQ7CisJfQorCisJLyogSW5zdGFsbCB0aGUgaGFuZGxlciAqLworCisJZmxhZ3MgPSBhY3BpX29zX2FjcXVpcmVfbG9jayhhY3BpX2dibF9ncGVfbG9jayk7CisJZ3BlX2V2ZW50X2luZm8tPmRpc3BhdGNoLmhhbmRsZXIgPSBoYW5kbGVyOworCisJLyogU2V0dXAgdXAgZGlzcGF0Y2ggZmxhZ3MgdG8gaW5kaWNhdGUgaGFuZGxlciAodnMuIG1ldGhvZCkgKi8KKworCWdwZV9ldmVudF9pbmZvLT5mbGFncyAmPSB+KEFDUElfR1BFX1hSVVBUX1RZUEVfTUFTSyB8IEFDUElfR1BFX0RJU1BBVENIX01BU0spOwkvKiBDbGVhciBiaXRzICovCisJZ3BlX2V2ZW50X2luZm8tPmZsYWdzIHw9ICh1OCkgKHR5cGUgfCBBQ1BJX0dQRV9ESVNQQVRDSF9IQU5ETEVSKTsKKworCWFjcGlfb3NfcmVsZWFzZV9sb2NrKGFjcGlfZ2JsX2dwZV9sb2NrLCBmbGFncyk7CisKKyAgICAgIHVubG9ja19hbmRfZXhpdDoKKwkodm9pZClhY3BpX3V0X3JlbGVhc2VfbXV0ZXgoQUNQSV9NVFhfRVZFTlRTKTsKKyAgICAgIGV4aXQ6CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKQorCQlBQ1BJX0VYQ0VQVElPTigoQUVfSU5GTywgc3RhdHVzLAorCQkJCSJJbnN0YWxsaW5nIG5vdGlmeSBoYW5kbGVyIGZhaWxlZCIpKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKK30KKworQUNQSV9FWFBPUlRfU1lNQk9MKGFjcGlfaW5zdGFsbF9ncGVfaGFuZGxlcikKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9yZW1vdmVfZ3BlX2hhbmRsZXIKKyAqCisgKiBQQVJBTUVURVJTOiAgZ3BlX2RldmljZSAgICAgIC0gTmFtZXNwYWNlIG5vZGUgZm9yIHRoZSBHUEUgKE5VTEwgZm9yIEZBRFQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZpbmVkIEdQRXMpCisgKiAgICAgICAgICAgICAgZ3BlX251bWJlciAgICAgIC0gVGhlIGV2ZW50IHRvIHJlbW92ZSBhIGhhbmRsZXIKKyAqICAgICAgICAgICAgICBBZGRyZXNzICAgICAgICAgLSBBZGRyZXNzIG9mIHRoZSBoYW5kbGVyCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBSZW1vdmUgYSBoYW5kbGVyIGZvciBhIEdlbmVyYWwgUHVycG9zZSBhY3BpX2V2ZW50LgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCithY3BpX3N0YXR1cworYWNwaV9yZW1vdmVfZ3BlX2hhbmRsZXIoYWNwaV9oYW5kbGUgZ3BlX2RldmljZSwKKwkJCXUzMiBncGVfbnVtYmVyLCBhY3BpX2V2ZW50X2hhbmRsZXIgYWRkcmVzcykKK3sKKwlzdHJ1Y3QgYWNwaV9ncGVfZXZlbnRfaW5mbyAqZ3BlX2V2ZW50X2luZm87CisJc3RydWN0IGFjcGlfaGFuZGxlcl9pbmZvICpoYW5kbGVyOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwlhY3BpX2NwdV9mbGFncyBmbGFnczsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0UoYWNwaV9yZW1vdmVfZ3BlX2hhbmRsZXIpOworCisJLyogUGFyYW1ldGVyIHZhbGlkYXRpb24gKi8KKworCWlmICghYWRkcmVzcykgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX1BBUkFNRVRFUik7CisJfQorCisJc3RhdHVzID0gYWNwaV91dF9hY3F1aXJlX211dGV4KEFDUElfTVRYX0VWRU5UUyk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworCX0KKworCS8qIEVuc3VyZSB0aGF0IHdlIGhhdmUgYSB2YWxpZCBHUEUgbnVtYmVyICovCisKKwlncGVfZXZlbnRfaW5mbyA9IGFjcGlfZXZfZ2V0X2dwZV9ldmVudF9pbmZvKGdwZV9kZXZpY2UsIGdwZV9udW1iZXIpOworCWlmICghZ3BlX2V2ZW50X2luZm8pIHsKKwkJc3RhdHVzID0gQUVfQkFEX1BBUkFNRVRFUjsKKwkJZ290byB1bmxvY2tfYW5kX2V4aXQ7CisJfQorCisJLyogTWFrZSBzdXJlIHRoYXQgYSBoYW5kbGVyIGlzIGluZGVlZCBpbnN0YWxsZWQgKi8KKworCWlmICgoZ3BlX2V2ZW50X2luZm8tPmZsYWdzICYgQUNQSV9HUEVfRElTUEFUQ0hfTUFTSykgIT0KKwkgICAgQUNQSV9HUEVfRElTUEFUQ0hfSEFORExFUikgeworCQlzdGF0dXMgPSBBRV9OT1RfRVhJU1Q7CisJCWdvdG8gdW5sb2NrX2FuZF9leGl0OworCX0KKworCS8qIE1ha2Ugc3VyZSB0aGF0IHRoZSBpbnN0YWxsZWQgaGFuZGxlciBpcyB0aGUgc2FtZSAqLworCisJaWYgKGdwZV9ldmVudF9pbmZvLT5kaXNwYXRjaC5oYW5kbGVyLT5hZGRyZXNzICE9IGFkZHJlc3MpIHsKKwkJc3RhdHVzID0gQUVfQkFEX1BBUkFNRVRFUjsKKwkJZ290byB1bmxvY2tfYW5kX2V4aXQ7CisJfQorCisJLyogRGlzYWJsZSB0aGUgR1BFIGJlZm9yZSByZW1vdmluZyB0aGUgaGFuZGxlciAqLworCisJc3RhdHVzID0gYWNwaV9ldl9kaXNhYmxlX2dwZShncGVfZXZlbnRfaW5mbyk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCWdvdG8gdW5sb2NrX2FuZF9leGl0OworCX0KKworCS8qIE1ha2Ugc3VyZSBhbGwgZGVmZXJyZWQgdGFza3MgYXJlIGNvbXBsZXRlZCAqLworCisJKHZvaWQpYWNwaV91dF9yZWxlYXNlX211dGV4KEFDUElfTVRYX0VWRU5UUyk7CisJYWNwaV9vc193YWl0X2V2ZW50c19jb21wbGV0ZShOVUxMKTsKKwlzdGF0dXMgPSBhY3BpX3V0X2FjcXVpcmVfbXV0ZXgoQUNQSV9NVFhfRVZFTlRTKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CisJfQorCisJLyogUmVtb3ZlIHRoZSBoYW5kbGVyICovCisKKwlmbGFncyA9IGFjcGlfb3NfYWNxdWlyZV9sb2NrKGFjcGlfZ2JsX2dwZV9sb2NrKTsKKwloYW5kbGVyID0gZ3BlX2V2ZW50X2luZm8tPmRpc3BhdGNoLmhhbmRsZXI7CisKKwkvKiBSZXN0b3JlIE1ldGhvZCBub2RlIChpZiBhbnkpLCBzZXQgZGlzcGF0Y2ggZmxhZ3MgKi8KKworCWdwZV9ldmVudF9pbmZvLT5kaXNwYXRjaC5tZXRob2Rfbm9kZSA9IGhhbmRsZXItPm1ldGhvZF9ub2RlOworCWdwZV9ldmVudF9pbmZvLT5mbGFncyAmPSB+QUNQSV9HUEVfRElTUEFUQ0hfTUFTSzsJLyogQ2xlYXIgYml0cyAqLworCWlmIChoYW5kbGVyLT5tZXRob2Rfbm9kZSkgeworCQlncGVfZXZlbnRfaW5mby0+ZmxhZ3MgfD0gQUNQSV9HUEVfRElTUEFUQ0hfTUVUSE9EOworCX0KKwlhY3BpX29zX3JlbGVhc2VfbG9jayhhY3BpX2dibF9ncGVfbG9jaywgZmxhZ3MpOworCisJLyogTm93IHdlIGNhbiBmcmVlIHRoZSBoYW5kbGVyIG9iamVjdCAqLworCisJQUNQSV9GUkVFKGhhbmRsZXIpOworCisgICAgICB1bmxvY2tfYW5kX2V4aXQ6CisJKHZvaWQpYWNwaV91dF9yZWxlYXNlX211dGV4KEFDUElfTVRYX0VWRU5UUyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Cit9CisKK0FDUElfRVhQT1JUX1NZTUJPTChhY3BpX3JlbW92ZV9ncGVfaGFuZGxlcikKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9hY3F1aXJlX2dsb2JhbF9sb2NrCisgKgorICogUEFSQU1FVEVSUzogIFRpbWVvdXQgICAgICAgICAtIEhvdyBsb25nIHRoZSBjYWxsZXIgaXMgd2lsbGluZyB0byB3YWl0CisgKiAgICAgICAgICAgICAgSGFuZGxlICAgICAgICAgIC0gV2hlcmUgdGhlIGhhbmRsZSB0byB0aGUgbG9jayBpcyByZXR1cm5lZAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpZiBhY3F1aXJlZCkKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IEFjcXVpcmUgdGhlIEFDUEkgR2xvYmFsIExvY2sKKyAqCisgKiBOb3RlOiBBbGxvd3MgY2FsbGVycyB3aXRoIHRoZSBzYW1lIHRocmVhZCBJRCB0byBhY3F1aXJlIHRoZSBnbG9iYWwgbG9jaworICogbXVsdGlwbGUgdGltZXMuIEluIG90aGVyIHdvcmRzLCBleHRlcm5hbGx5LCB0aGUgYmVoYXZpb3Igb2YgdGhlIGdsb2JhbCBsb2NrCisgKiBpcyBpZGVudGljYWwgdG8gYW4gQU1MIG11dGV4LiBPbiB0aGUgZmlyc3QgYWNxdWlyZSwgYSBuZXcgaGFuZGxlIGlzCisgKiByZXR1cm5lZC4gT24gYW55IHN1YnNlcXVlbnQgY2FsbHMgdG8gYWNxdWlyZSBieSB0aGUgc2FtZSB0aHJlYWQsIHRoZSBzYW1lCisgKiBoYW5kbGUgaXMgcmV0dXJuZWQuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2FjcGlfc3RhdHVzIGFjcGlfYWNxdWlyZV9nbG9iYWxfbG9jayh1MTYgdGltZW91dCwgdTMyICogaGFuZGxlKQoreworCWFjcGlfc3RhdHVzIHN0YXR1czsKKworCWlmICghaGFuZGxlKSB7CisJCXJldHVybiAoQUVfQkFEX1BBUkFNRVRFUik7CisJfQorCisJLyogTXVzdCBsb2NrIGludGVycHJldGVyIHRvIHByZXZlbnQgcmFjZSBjb25kaXRpb25zICovCisKKwlhY3BpX2V4X2VudGVyX2ludGVycHJldGVyKCk7CisKKwlzdGF0dXMgPSBhY3BpX2V4X2FjcXVpcmVfbXV0ZXhfb2JqZWN0KHRpbWVvdXQsCisJCQkJCSAgICAgIGFjcGlfZ2JsX2dsb2JhbF9sb2NrX211dGV4LAorCQkJCQkgICAgICBhY3BpX29zX2dldF90aHJlYWRfaWQoKSk7CisKKwlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpIHsKKworCQkvKiBSZXR1cm4gdGhlIGdsb2JhbCBsb2NrIGhhbmRsZSAodXBkYXRlZCBpbiBhY3BpX2V2X2FjcXVpcmVfZ2xvYmFsX2xvY2spICovCisKKwkJKmhhbmRsZSA9IGFjcGlfZ2JsX2dsb2JhbF9sb2NrX2hhbmRsZTsKKwl9CisKKwlhY3BpX2V4X2V4aXRfaW50ZXJwcmV0ZXIoKTsKKwlyZXR1cm4gKHN0YXR1cyk7Cit9CisKK0FDUElfRVhQT1JUX1NZTUJPTChhY3BpX2FjcXVpcmVfZ2xvYmFsX2xvY2spCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfcmVsZWFzZV9nbG9iYWxfbG9jaworICoKKyAqIFBBUkFNRVRFUlM6ICBIYW5kbGUgICAgICAtIFJldHVybmVkIGZyb20gYWNwaV9hY3F1aXJlX2dsb2JhbF9sb2NrCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBSZWxlYXNlIHRoZSBBQ1BJIEdsb2JhbCBMb2NrLiBUaGUgaGFuZGxlIG11c3QgYmUgdmFsaWQuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2FjcGlfc3RhdHVzIGFjcGlfcmVsZWFzZV9nbG9iYWxfbG9jayh1MzIgaGFuZGxlKQoreworCWFjcGlfc3RhdHVzIHN0YXR1czsKKworCWlmICghaGFuZGxlIHx8IChoYW5kbGUgIT0gYWNwaV9nYmxfZ2xvYmFsX2xvY2tfaGFuZGxlKSkgeworCQlyZXR1cm4gKEFFX05PVF9BQ1FVSVJFRCk7CisJfQorCisJc3RhdHVzID0gYWNwaV9leF9yZWxlYXNlX211dGV4X29iamVjdChhY3BpX2dibF9nbG9iYWxfbG9ja19tdXRleCk7CisJcmV0dXJuIChzdGF0dXMpOworfQorCitBQ1BJX0VYUE9SVF9TWU1CT0woYWNwaV9yZWxlYXNlX2dsb2JhbF9sb2NrKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS9ldnhmZXZudC5jIGIvZHJpdmVycy9hY3BpL2FjcGljYS9ldnhmZXZudC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1NDg1ZTQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2V2eGZldm50LmMKQEAgLTAsMCArMSw4NzEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBNb2R1bGUgTmFtZTogZXZ4ZmV2bnQgLSBFeHRlcm5hbCBJbnRlcmZhY2VzLCBBQ1BJIGV2ZW50IGRpc2FibGUvZW5hYmxlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwOCwgSW50ZWwgQ29ycC4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKKyAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIGF0IG1pbmltdW0gYSBkaXNjbGFpbWVyCisgKiAgICBzdWJzdGFudGlhbGx5IHNpbWlsYXIgdG8gdGhlICJOTyBXQVJSQU5UWSIgZGlzY2xhaW1lciBiZWxvdworICogICAgKCJEaXNjbGFpbWVyIikgYW5kIGFueSByZWRpc3RyaWJ1dGlvbiBtdXN0IGJlIGNvbmRpdGlvbmVkIHVwb24KKyAqICAgIGluY2x1ZGluZyBhIHN1YnN0YW50aWFsbHkgc2ltaWxhciBEaXNjbGFpbWVyIHJlcXVpcmVtZW50IGZvciBmdXJ0aGVyCisgKiAgICBiaW5hcnkgcmVkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMKKyAqICAgIG9mIGFueSBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogTk8gV0FSUkFOVFkKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HCisgKiBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KKyAqLworCisjaW5jbHVkZSA8YWNwaS9hY3BpLmg+CisjaW5jbHVkZSAiYWNjb21tb24uaCIKKyNpbmNsdWRlICJhY2V2ZW50cy5oIgorI2luY2x1ZGUgImFjbmFtZXNwLmgiCisjaW5jbHVkZSAiYWN0YWJsZXMuaCIKKworI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfRVZFTlRTCitBQ1BJX01PRFVMRV9OQU1FKCJldnhmZXZudCIpCisKKy8qIExvY2FsIHByb3RvdHlwZXMgKi8KK2FjcGlfc3RhdHVzCithY3BpX2V2X2dldF9ncGVfZGV2aWNlKHN0cnVjdCBhY3BpX2dwZV94cnVwdF9pbmZvICpncGVfeHJ1cHRfaW5mbywKKwkJICAgICAgIHN0cnVjdCBhY3BpX2dwZV9ibG9ja19pbmZvICpncGVfYmxvY2ssIHZvaWQgKmNvbnRleHQpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX2VuYWJsZQorICoKKyAqIFBBUkFNRVRFUlM6ICBOb25lCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBUcmFuc2ZlcnMgdGhlIHN5c3RlbSBpbnRvIEFDUEkgbW9kZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCithY3BpX3N0YXR1cyBhY3BpX2VuYWJsZSh2b2lkKQoreworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOworCisJQUNQSV9GVU5DVElPTl9UUkFDRShhY3BpX2VuYWJsZSk7CisKKwkvKiBBQ1BJIHRhYmxlcyBtdXN0IGJlIHByZXNlbnQgKi8KKworCWlmICghYWNwaV90Yl90YWJsZXNfbG9hZGVkKCkpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX0FDUElfVEFCTEVTKTsKKwl9CisKKwkvKiBDaGVjayBjdXJyZW50IG1vZGUgKi8KKworCWlmIChhY3BpX2h3X2dldF9tb2RlKCkgPT0gQUNQSV9TWVNfTU9ERV9BQ1BJKSB7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5JVCwKKwkJCQkgICJTeXN0ZW0gaXMgYWxyZWFkeSBpbiBBQ1BJIG1vZGVcbiIpKTsKKwl9IGVsc2UgeworCQkvKiBUcmFuc2l0aW9uIHRvIEFDUEkgbW9kZSAqLworCisJCXN0YXR1cyA9IGFjcGlfaHdfc2V0X21vZGUoQUNQSV9TWVNfTU9ERV9BQ1BJKTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQlBQ1BJX0VSUk9SKChBRV9JTkZPLAorCQkJCSAgICAiQ291bGQgbm90IHRyYW5zaXRpb24gdG8gQUNQSSBtb2RlIikpOworCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CisJCX0KKworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lOSVQsCisJCQkJICAiVHJhbnNpdGlvbiB0byBBQ1BJIG1vZGUgc3VjY2Vzc2Z1bFxuIikpOworCX0KKworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworfQorCitBQ1BJX0VYUE9SVF9TWU1CT0woYWNwaV9lbmFibGUpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfZGlzYWJsZQorICoKKyAqIFBBUkFNRVRFUlM6ICBOb25lCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBUcmFuc2ZlcnMgdGhlIHN5c3RlbSBpbnRvIExFR0FDWSAobm9uLUFDUEkpIG1vZGUuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2FjcGlfc3RhdHVzIGFjcGlfZGlzYWJsZSh2b2lkKQoreworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOworCisJQUNQSV9GVU5DVElPTl9UUkFDRShhY3BpX2Rpc2FibGUpOworCisJaWYgKGFjcGlfaHdfZ2V0X21vZGUoKSA9PSBBQ1BJX1NZU19NT0RFX0xFR0FDWSkgeworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lOSVQsCisJCQkJICAiU3lzdGVtIGlzIGFscmVhZHkgaW4gbGVnYWN5IChub24tQUNQSSkgbW9kZVxuIikpOworCX0gZWxzZSB7CisJCS8qIFRyYW5zaXRpb24gdG8gTEVHQUNZIG1vZGUgKi8KKworCQlzdGF0dXMgPSBhY3BpX2h3X3NldF9tb2RlKEFDUElfU1lTX01PREVfTEVHQUNZKTsKKworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCUFDUElfRVJST1IoKEFFX0lORk8sCisJCQkJICAgICJDb3VsZCBub3QgZXhpdCBBQ1BJIG1vZGUgdG8gbGVnYWN5IG1vZGUiKSk7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKKwkJfQorCisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5JVCwgIkFDUEkgbW9kZSBkaXNhYmxlZFxuIikpOworCX0KKworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworfQorCitBQ1BJX0VYUE9SVF9TWU1CT0woYWNwaV9kaXNhYmxlKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX2VuYWJsZV9ldmVudAorICoKKyAqIFBBUkFNRVRFUlM6ICBFdmVudCAgICAgICAgICAgLSBUaGUgZml4ZWQgZXZlbnR0byBiZSBlbmFibGVkCisgKiAgICAgICAgICAgICAgRmxhZ3MgICAgICAgICAgIC0gUmVzZXJ2ZWQKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IEVuYWJsZSBhbiBBQ1BJIGV2ZW50IChmaXhlZCkKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYWNwaV9zdGF0dXMgYWNwaV9lbmFibGVfZXZlbnQodTMyIGV2ZW50LCB1MzIgZmxhZ3MpCit7CisJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CisJdTMyIHZhbHVlOworCisJQUNQSV9GVU5DVElPTl9UUkFDRShhY3BpX2VuYWJsZV9ldmVudCk7CisKKwkvKiBEZWNvZGUgdGhlIEZpeGVkIEV2ZW50ICovCisKKwlpZiAoZXZlbnQgPiBBQ1BJX0VWRU5UX01BWCkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX1BBUkFNRVRFUik7CisJfQorCisJLyoKKwkgKiBFbmFibGUgdGhlIHJlcXVlc3RlZCBmaXhlZCBldmVudCAoYnkgd3JpdGluZyBhIG9uZSB0byB0aGUgZW5hYmxlCisJICogcmVnaXN0ZXIgYml0KQorCSAqLworCXN0YXR1cyA9CisJICAgIGFjcGlfc2V0X3JlZ2lzdGVyKGFjcGlfZ2JsX2ZpeGVkX2V2ZW50X2luZm9bZXZlbnRdLgorCQkJICAgICAgZW5hYmxlX3JlZ2lzdGVyX2lkLCAxKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CisJfQorCisJLyogTWFrZSBzdXJlIHRoYXQgdGhlIGhhcmR3YXJlIHJlc3BvbmRlZCAqLworCisJc3RhdHVzID0KKwkgICAgYWNwaV9nZXRfcmVnaXN0ZXIoYWNwaV9nYmxfZml4ZWRfZXZlbnRfaW5mb1tldmVudF0uCisJCQkgICAgICBlbmFibGVfcmVnaXN0ZXJfaWQsICZ2YWx1ZSk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworCX0KKworCWlmICh2YWx1ZSAhPSAxKSB7CisJCUFDUElfRVJST1IoKEFFX0lORk8sCisJCQkgICAgIkNvdWxkIG5vdCBlbmFibGUgJXMgZXZlbnQiLAorCQkJICAgIGFjcGlfdXRfZ2V0X2V2ZW50X25hbWUoZXZlbnQpKSk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT19IQVJEV0FSRV9SRVNQT05TRSk7CisJfQorCisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Cit9CisKK0FDUElfRVhQT1JUX1NZTUJPTChhY3BpX2VuYWJsZV9ldmVudCkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9zZXRfZ3BlX3R5cGUKKyAqCisgKiBQQVJBTUVURVJTOiAgZ3BlX2RldmljZSAgICAgIC0gUGFyZW50IEdQRSBEZXZpY2UKKyAqICAgICAgICAgICAgICBncGVfbnVtYmVyICAgICAgLSBHUEUgbGV2ZWwgd2l0aGluIHRoZSBHUEUgYmxvY2sKKyAqICAgICAgICAgICAgICBUeXBlICAgICAgICAgICAgLSBOZXcgR1BFIHR5cGUKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IFNldCB0aGUgdHlwZSBvZiBhbiBpbmRpdmlkdWFsIEdQRQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCithY3BpX3N0YXR1cyBhY3BpX3NldF9ncGVfdHlwZShhY3BpX2hhbmRsZSBncGVfZGV2aWNlLCB1MzIgZ3BlX251bWJlciwgdTggdHlwZSkKK3sKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKKwlzdHJ1Y3QgYWNwaV9ncGVfZXZlbnRfaW5mbyAqZ3BlX2V2ZW50X2luZm87CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGFjcGlfc2V0X2dwZV90eXBlKTsKKworCS8qIEVuc3VyZSB0aGF0IHdlIGhhdmUgYSB2YWxpZCBHUEUgbnVtYmVyICovCisKKwlncGVfZXZlbnRfaW5mbyA9IGFjcGlfZXZfZ2V0X2dwZV9ldmVudF9pbmZvKGdwZV9kZXZpY2UsIGdwZV9udW1iZXIpOworCWlmICghZ3BlX2V2ZW50X2luZm8pIHsKKwkJc3RhdHVzID0gQUVfQkFEX1BBUkFNRVRFUjsKKwkJZ290byB1bmxvY2tfYW5kX2V4aXQ7CisJfQorCisJaWYgKChncGVfZXZlbnRfaW5mby0+ZmxhZ3MgJiBBQ1BJX0dQRV9UWVBFX01BU0spID09IHR5cGUpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKKwl9CisKKwkvKiBTZXQgdGhlIG5ldyB0eXBlICh3aWxsIGRpc2FibGUgR1BFIGlmIGN1cnJlbnRseSBlbmFibGVkKSAqLworCisJc3RhdHVzID0gYWNwaV9ldl9zZXRfZ3BlX3R5cGUoZ3BlX2V2ZW50X2luZm8sIHR5cGUpOworCisgICAgICB1bmxvY2tfYW5kX2V4aXQ6CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Cit9CisKK0FDUElfRVhQT1JUX1NZTUJPTChhY3BpX3NldF9ncGVfdHlwZSkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9lbmFibGVfZ3BlCisgKgorICogUEFSQU1FVEVSUzogIGdwZV9kZXZpY2UgICAgICAtIFBhcmVudCBHUEUgRGV2aWNlCisgKiAgICAgICAgICAgICAgZ3BlX251bWJlciAgICAgIC0gR1BFIGxldmVsIHdpdGhpbiB0aGUgR1BFIGJsb2NrCisgKiAgICAgICAgICAgICAgRmxhZ3MgICAgICAgICAgIC0gSnVzdCBlbmFibGUsIG9yIGFsc28gd2FrZSBlbmFibGU/CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FsbGVkIGZyb20gSVNSIG9yIG5vdAorICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogRW5hYmxlIGFuIEFDUEkgZXZlbnQgKGdlbmVyYWwgcHVycG9zZSkKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYWNwaV9zdGF0dXMgYWNwaV9lbmFibGVfZ3BlKGFjcGlfaGFuZGxlIGdwZV9kZXZpY2UsIHUzMiBncGVfbnVtYmVyKQoreworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOworCWFjcGlfY3B1X2ZsYWdzIGZsYWdzOworCXN0cnVjdCBhY3BpX2dwZV9ldmVudF9pbmZvICpncGVfZXZlbnRfaW5mbzsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0UoYWNwaV9lbmFibGVfZ3BlKTsKKworCWZsYWdzID0gYWNwaV9vc19hY3F1aXJlX2xvY2soYWNwaV9nYmxfZ3BlX2xvY2spOworCisJLyogRW5zdXJlIHRoYXQgd2UgaGF2ZSBhIHZhbGlkIEdQRSBudW1iZXIgKi8KKworCWdwZV9ldmVudF9pbmZvID0gYWNwaV9ldl9nZXRfZ3BlX2V2ZW50X2luZm8oZ3BlX2RldmljZSwgZ3BlX251bWJlcik7CisJaWYgKCFncGVfZXZlbnRfaW5mbykgeworCQlzdGF0dXMgPSBBRV9CQURfUEFSQU1FVEVSOworCQlnb3RvIHVubG9ja19hbmRfZXhpdDsKKwl9CisKKwkvKiBQZXJmb3JtIHRoZSBlbmFibGUgKi8KKworCXN0YXR1cyA9IGFjcGlfZXZfZW5hYmxlX2dwZShncGVfZXZlbnRfaW5mbywgVFJVRSk7CisKKyAgICAgIHVubG9ja19hbmRfZXhpdDoKKwlhY3BpX29zX3JlbGVhc2VfbG9jayhhY3BpX2dibF9ncGVfbG9jaywgZmxhZ3MpOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworfQorCitBQ1BJX0VYUE9SVF9TWU1CT0woYWNwaV9lbmFibGVfZ3BlKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX2Rpc2FibGVfZ3BlCisgKgorICogUEFSQU1FVEVSUzogIGdwZV9kZXZpY2UgICAgICAtIFBhcmVudCBHUEUgRGV2aWNlCisgKiAgICAgICAgICAgICAgZ3BlX251bWJlciAgICAgIC0gR1BFIGxldmVsIHdpdGhpbiB0aGUgR1BFIGJsb2NrCisgKiAgICAgICAgICAgICAgRmxhZ3MgICAgICAgICAgIC0gSnVzdCBkaXNhYmxlLCBvciBhbHNvIHdha2UgZGlzYWJsZT8KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYWxsZWQgZnJvbSBJU1Igb3Igbm90CisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBEaXNhYmxlIGFuIEFDUEkgZXZlbnQgKGdlbmVyYWwgcHVycG9zZSkKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYWNwaV9zdGF0dXMgYWNwaV9kaXNhYmxlX2dwZShhY3BpX2hhbmRsZSBncGVfZGV2aWNlLCB1MzIgZ3BlX251bWJlcikKK3sKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKKwlhY3BpX2NwdV9mbGFncyBmbGFnczsKKwlzdHJ1Y3QgYWNwaV9ncGVfZXZlbnRfaW5mbyAqZ3BlX2V2ZW50X2luZm87CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGFjcGlfZGlzYWJsZV9ncGUpOworCisJZmxhZ3MgPSBhY3BpX29zX2FjcXVpcmVfbG9jayhhY3BpX2dibF9ncGVfbG9jayk7CisJLyogRW5zdXJlIHRoYXQgd2UgaGF2ZSBhIHZhbGlkIEdQRSBudW1iZXIgKi8KKworCWdwZV9ldmVudF9pbmZvID0gYWNwaV9ldl9nZXRfZ3BlX2V2ZW50X2luZm8oZ3BlX2RldmljZSwgZ3BlX251bWJlcik7CisJaWYgKCFncGVfZXZlbnRfaW5mbykgeworCQlzdGF0dXMgPSBBRV9CQURfUEFSQU1FVEVSOworCQlnb3RvIHVubG9ja19hbmRfZXhpdDsKKwl9CisKKwlzdGF0dXMgPSBhY3BpX2V2X2Rpc2FibGVfZ3BlKGdwZV9ldmVudF9pbmZvKTsKKwordW5sb2NrX2FuZF9leGl0OgorCWFjcGlfb3NfcmVsZWFzZV9sb2NrKGFjcGlfZ2JsX2dwZV9sb2NrLCBmbGFncyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Cit9CisKK0FDUElfRVhQT1JUX1NZTUJPTChhY3BpX2Rpc2FibGVfZ3BlKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX2Rpc2FibGVfZXZlbnQKKyAqCisgKiBQQVJBTUVURVJTOiAgRXZlbnQgICAgICAgICAgIC0gVGhlIGZpeGVkIGV2ZW50dG8gYmUgZW5hYmxlZAorICogICAgICAgICAgICAgIEZsYWdzICAgICAgICAgICAtIFJlc2VydmVkCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBEaXNhYmxlIGFuIEFDUEkgZXZlbnQgKGZpeGVkKQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCithY3BpX3N0YXR1cyBhY3BpX2Rpc2FibGVfZXZlbnQodTMyIGV2ZW50LCB1MzIgZmxhZ3MpCit7CisJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CisJdTMyIHZhbHVlOworCisJQUNQSV9GVU5DVElPTl9UUkFDRShhY3BpX2Rpc2FibGVfZXZlbnQpOworCisJLyogRGVjb2RlIHRoZSBGaXhlZCBFdmVudCAqLworCisJaWYgKGV2ZW50ID4gQUNQSV9FVkVOVF9NQVgpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9QQVJBTUVURVIpOworCX0KKworCS8qCisJICogRGlzYWJsZSB0aGUgcmVxdWVzdGVkIGZpeGVkIGV2ZW50IChieSB3cml0aW5nIGEgemVybyB0byB0aGUgZW5hYmxlCisJICogcmVnaXN0ZXIgYml0KQorCSAqLworCXN0YXR1cyA9CisJICAgIGFjcGlfc2V0X3JlZ2lzdGVyKGFjcGlfZ2JsX2ZpeGVkX2V2ZW50X2luZm9bZXZlbnRdLgorCQkJICAgICAgZW5hYmxlX3JlZ2lzdGVyX2lkLCAwKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CisJfQorCisJc3RhdHVzID0KKwkgICAgYWNwaV9nZXRfcmVnaXN0ZXIoYWNwaV9nYmxfZml4ZWRfZXZlbnRfaW5mb1tldmVudF0uCisJCQkgICAgICBlbmFibGVfcmVnaXN0ZXJfaWQsICZ2YWx1ZSk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworCX0KKworCWlmICh2YWx1ZSAhPSAwKSB7CisJCUFDUElfRVJST1IoKEFFX0lORk8sCisJCQkgICAgIkNvdWxkIG5vdCBkaXNhYmxlICVzIGV2ZW50cyIsCisJCQkgICAgYWNwaV91dF9nZXRfZXZlbnRfbmFtZShldmVudCkpKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX0hBUkRXQVJFX1JFU1BPTlNFKTsKKwl9CisKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKK30KKworQUNQSV9FWFBPUlRfU1lNQk9MKGFjcGlfZGlzYWJsZV9ldmVudCkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9jbGVhcl9ldmVudAorICoKKyAqIFBBUkFNRVRFUlM6ICBFdmVudCAgICAgICAgICAgLSBUaGUgZml4ZWQgZXZlbnQgdG8gYmUgY2xlYXJlZAorICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogQ2xlYXIgYW4gQUNQSSBldmVudCAoZml4ZWQpCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2FjcGlfc3RhdHVzIGFjcGlfY2xlYXJfZXZlbnQodTMyIGV2ZW50KQoreworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOworCisJQUNQSV9GVU5DVElPTl9UUkFDRShhY3BpX2NsZWFyX2V2ZW50KTsKKworCS8qIERlY29kZSB0aGUgRml4ZWQgRXZlbnQgKi8KKworCWlmIChldmVudCA+IEFDUElfRVZFTlRfTUFYKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfUEFSQU1FVEVSKTsKKwl9CisKKwkvKgorCSAqIENsZWFyIHRoZSByZXF1ZXN0ZWQgZml4ZWQgZXZlbnQgKEJ5IHdyaXRpbmcgYSBvbmUgdG8gdGhlIHN0YXR1cworCSAqIHJlZ2lzdGVyIGJpdCkKKwkgKi8KKwlzdGF0dXMgPQorCSAgICBhY3BpX3NldF9yZWdpc3RlcihhY3BpX2dibF9maXhlZF9ldmVudF9pbmZvW2V2ZW50XS4KKwkJCSAgICAgIHN0YXR1c19yZWdpc3Rlcl9pZCwgMSk7CisKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKK30KKworQUNQSV9FWFBPUlRfU1lNQk9MKGFjcGlfY2xlYXJfZXZlbnQpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfY2xlYXJfZ3BlCisgKgorICogUEFSQU1FVEVSUzogIGdwZV9kZXZpY2UgICAgICAtIFBhcmVudCBHUEUgRGV2aWNlCisgKiAgICAgICAgICAgICAgZ3BlX251bWJlciAgICAgIC0gR1BFIGxldmVsIHdpdGhpbiB0aGUgR1BFIGJsb2NrCisgKiAgICAgICAgICAgICAgRmxhZ3MgICAgICAgICAgIC0gQ2FsbGVkIGZyb20gYW4gSVNSIG9yIG5vdAorICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogQ2xlYXIgYW4gQUNQSSBldmVudCAoZ2VuZXJhbCBwdXJwb3NlKQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCithY3BpX3N0YXR1cyBhY3BpX2NsZWFyX2dwZShhY3BpX2hhbmRsZSBncGVfZGV2aWNlLCB1MzIgZ3BlX251bWJlciwgdTMyIGZsYWdzKQoreworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOworCXN0cnVjdCBhY3BpX2dwZV9ldmVudF9pbmZvICpncGVfZXZlbnRfaW5mbzsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0UoYWNwaV9jbGVhcl9ncGUpOworCisJLyogVXNlIHNlbWFwaG9yZSBsb2NrIGlmIG5vdCBleGVjdXRpbmcgYXQgaW50ZXJydXB0IGxldmVsICovCisKKwlpZiAoZmxhZ3MgJiBBQ1BJX05PVF9JU1IpIHsKKwkJc3RhdHVzID0gYWNwaV91dF9hY3F1aXJlX211dGV4KEFDUElfTVRYX0VWRU5UUyk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CisJCX0KKwl9CisKKwkvKiBFbnN1cmUgdGhhdCB3ZSBoYXZlIGEgdmFsaWQgR1BFIG51bWJlciAqLworCisJZ3BlX2V2ZW50X2luZm8gPSBhY3BpX2V2X2dldF9ncGVfZXZlbnRfaW5mbyhncGVfZGV2aWNlLCBncGVfbnVtYmVyKTsKKwlpZiAoIWdwZV9ldmVudF9pbmZvKSB7CisJCXN0YXR1cyA9IEFFX0JBRF9QQVJBTUVURVI7CisJCWdvdG8gdW5sb2NrX2FuZF9leGl0OworCX0KKworCXN0YXR1cyA9IGFjcGlfaHdfY2xlYXJfZ3BlKGdwZV9ldmVudF9pbmZvKTsKKworICAgICAgdW5sb2NrX2FuZF9leGl0OgorCWlmIChmbGFncyAmIEFDUElfTk9UX0lTUikgeworCQkodm9pZClhY3BpX3V0X3JlbGVhc2VfbXV0ZXgoQUNQSV9NVFhfRVZFTlRTKTsKKwl9CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Cit9CisKK0FDUElfRVhQT1JUX1NZTUJPTChhY3BpX2NsZWFyX2dwZSkKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfZ2V0X2V2ZW50X3N0YXR1cworICoKKyAqIFBBUkFNRVRFUlM6ICBFdmVudCAgICAgICAgICAgLSBUaGUgZml4ZWQgZXZlbnQKKyAqICAgICAgICAgICAgICBldmVudF9zdGF0dXMgICAgLSBXaGVyZSB0aGUgY3VycmVudCBzdGF0dXMgb2YgdGhlIGV2ZW50IHdpbGwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZSByZXR1cm5lZAorICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogT2J0YWlucyBhbmQgcmV0dXJucyB0aGUgY3VycmVudCBzdGF0dXMgb2YgdGhlIGV2ZW50CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2FjcGlfc3RhdHVzIGFjcGlfZ2V0X2V2ZW50X3N0YXR1cyh1MzIgZXZlbnQsIGFjcGlfZXZlbnRfc3RhdHVzICogZXZlbnRfc3RhdHVzKQoreworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOworCXUzMiB2YWx1ZTsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0UoYWNwaV9nZXRfZXZlbnRfc3RhdHVzKTsKKworCWlmICghZXZlbnRfc3RhdHVzKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfUEFSQU1FVEVSKTsKKwl9CisKKwkvKiBEZWNvZGUgdGhlIEZpeGVkIEV2ZW50ICovCisKKwlpZiAoZXZlbnQgPiBBQ1BJX0VWRU5UX01BWCkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX1BBUkFNRVRFUik7CisJfQorCisJLyogR2V0IHRoZSBzdGF0dXMgb2YgdGhlIHJlcXVlc3RlZCBmaXhlZCBldmVudCAqLworCisJc3RhdHVzID0KKwkgICAgYWNwaV9nZXRfcmVnaXN0ZXIoYWNwaV9nYmxfZml4ZWRfZXZlbnRfaW5mb1tldmVudF0uCisJCQkgICAgICBlbmFibGVfcmVnaXN0ZXJfaWQsICZ2YWx1ZSk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKQorCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKKworCSpldmVudF9zdGF0dXMgPSB2YWx1ZTsKKworCXN0YXR1cyA9CisJICAgIGFjcGlfZ2V0X3JlZ2lzdGVyKGFjcGlfZ2JsX2ZpeGVkX2V2ZW50X2luZm9bZXZlbnRdLgorCQkJICAgICAgc3RhdHVzX3JlZ2lzdGVyX2lkLCAmdmFsdWUpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CisKKwlpZiAodmFsdWUpCisJCSpldmVudF9zdGF0dXMgfD0gQUNQSV9FVkVOVF9GTEFHX1NFVDsKKworCWlmIChhY3BpX2dibF9maXhlZF9ldmVudF9oYW5kbGVyc1tldmVudF0uaGFuZGxlcikKKwkJKmV2ZW50X3N0YXR1cyB8PSBBQ1BJX0VWRU5UX0ZMQUdfSEFORExFOworCisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Cit9CisKK0FDUElfRVhQT1JUX1NZTUJPTChhY3BpX2dldF9ldmVudF9zdGF0dXMpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfZ2V0X2dwZV9zdGF0dXMKKyAqCisgKiBQQVJBTUVURVJTOiAgZ3BlX2RldmljZSAgICAgIC0gUGFyZW50IEdQRSBEZXZpY2UKKyAqICAgICAgICAgICAgICBncGVfbnVtYmVyICAgICAgLSBHUEUgbGV2ZWwgd2l0aGluIHRoZSBHUEUgYmxvY2sKKyAqICAgICAgICAgICAgICBGbGFncyAgICAgICAgICAgLSBDYWxsZWQgZnJvbSBhbiBJU1Igb3Igbm90CisgKiAgICAgICAgICAgICAgZXZlbnRfc3RhdHVzICAgIC0gV2hlcmUgdGhlIGN1cnJlbnQgc3RhdHVzIG9mIHRoZSBldmVudCB3aWxsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgcmV0dXJuZWQKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IEdldCBzdGF0dXMgb2YgYW4gZXZlbnQgKGdlbmVyYWwgcHVycG9zZSkKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYWNwaV9zdGF0dXMKK2FjcGlfZ2V0X2dwZV9zdGF0dXMoYWNwaV9oYW5kbGUgZ3BlX2RldmljZSwKKwkJICAgIHUzMiBncGVfbnVtYmVyLCB1MzIgZmxhZ3MsIGFjcGlfZXZlbnRfc3RhdHVzICogZXZlbnRfc3RhdHVzKQoreworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOworCXN0cnVjdCBhY3BpX2dwZV9ldmVudF9pbmZvICpncGVfZXZlbnRfaW5mbzsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0UoYWNwaV9nZXRfZ3BlX3N0YXR1cyk7CisKKwkvKiBVc2Ugc2VtYXBob3JlIGxvY2sgaWYgbm90IGV4ZWN1dGluZyBhdCBpbnRlcnJ1cHQgbGV2ZWwgKi8KKworCWlmIChmbGFncyAmIEFDUElfTk9UX0lTUikgeworCQlzdGF0dXMgPSBhY3BpX3V0X2FjcXVpcmVfbXV0ZXgoQUNQSV9NVFhfRVZFTlRTKTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKKwkJfQorCX0KKworCS8qIEVuc3VyZSB0aGF0IHdlIGhhdmUgYSB2YWxpZCBHUEUgbnVtYmVyICovCisKKwlncGVfZXZlbnRfaW5mbyA9IGFjcGlfZXZfZ2V0X2dwZV9ldmVudF9pbmZvKGdwZV9kZXZpY2UsIGdwZV9udW1iZXIpOworCWlmICghZ3BlX2V2ZW50X2luZm8pIHsKKwkJc3RhdHVzID0gQUVfQkFEX1BBUkFNRVRFUjsKKwkJZ290byB1bmxvY2tfYW5kX2V4aXQ7CisJfQorCisJLyogT2J0YWluIHN0YXR1cyBvbiB0aGUgcmVxdWVzdGVkIEdQRSBudW1iZXIgKi8KKworCXN0YXR1cyA9IGFjcGlfaHdfZ2V0X2dwZV9zdGF0dXMoZ3BlX2V2ZW50X2luZm8sIGV2ZW50X3N0YXR1cyk7CisKKwlpZiAoZ3BlX2V2ZW50X2luZm8tPmZsYWdzICYgQUNQSV9HUEVfRElTUEFUQ0hfTUFTSykKKwkJKmV2ZW50X3N0YXR1cyB8PSBBQ1BJX0VWRU5UX0ZMQUdfSEFORExFOworCisgICAgICB1bmxvY2tfYW5kX2V4aXQ6CisJaWYgKGZsYWdzICYgQUNQSV9OT1RfSVNSKSB7CisJCSh2b2lkKWFjcGlfdXRfcmVsZWFzZV9tdXRleChBQ1BJX01UWF9FVkVOVFMpOworCX0KKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKK30KKworQUNQSV9FWFBPUlRfU1lNQk9MKGFjcGlfZ2V0X2dwZV9zdGF0dXMpCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX2luc3RhbGxfZ3BlX2Jsb2NrCisgKgorICogUEFSQU1FVEVSUzogIGdwZV9kZXZpY2UgICAgICAgICAgLSBIYW5kbGUgdG8gdGhlIHBhcmVudCBHUEUgQmxvY2sgRGV2aWNlCisgKiAgICAgICAgICAgICAgZ3BlX2Jsb2NrX2FkZHJlc3MgICAtIEFkZHJlc3MgYW5kIHNwYWNlX2lECisgKiAgICAgICAgICAgICAgcmVnaXN0ZXJfY291bnQgICAgICAtIE51bWJlciBvZiBHUEUgcmVnaXN0ZXIgcGFpcnMgaW4gdGhlIGJsb2NrCisgKiAgICAgICAgICAgICAgaW50ZXJydXB0X251bWJlciAgICAtIEgvVyBpbnRlcnJ1cHQgZm9yIHRoZSBibG9jaworICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogQ3JlYXRlIGFuZCBJbnN0YWxsIGEgYmxvY2sgb2YgR1BFIHJlZ2lzdGVycworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCithY3BpX3N0YXR1cworYWNwaV9pbnN0YWxsX2dwZV9ibG9jayhhY3BpX2hhbmRsZSBncGVfZGV2aWNlLAorCQkgICAgICAgc3RydWN0IGFjcGlfZ2VuZXJpY19hZGRyZXNzICpncGVfYmxvY2tfYWRkcmVzcywKKwkJICAgICAgIHUzMiByZWdpc3Rlcl9jb3VudCwgdTMyIGludGVycnVwdF9udW1iZXIpCit7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjOworCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlOworCXN0cnVjdCBhY3BpX2dwZV9ibG9ja19pbmZvICpncGVfYmxvY2s7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGFjcGlfaW5zdGFsbF9ncGVfYmxvY2spOworCisJaWYgKCghZ3BlX2RldmljZSkgfHwgKCFncGVfYmxvY2tfYWRkcmVzcykgfHwgKCFyZWdpc3Rlcl9jb3VudCkpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9QQVJBTUVURVIpOworCX0KKworCXN0YXR1cyA9IGFjcGlfdXRfYWNxdWlyZV9tdXRleChBQ1BJX01UWF9OQU1FU1BBQ0UpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm4gKHN0YXR1cyk7CisJfQorCisJbm9kZSA9IGFjcGlfbnNfbWFwX2hhbmRsZV90b19ub2RlKGdwZV9kZXZpY2UpOworCWlmICghbm9kZSkgeworCQlzdGF0dXMgPSBBRV9CQURfUEFSQU1FVEVSOworCQlnb3RvIHVubG9ja19hbmRfZXhpdDsKKwl9CisKKwkvKgorCSAqIEZvciB1c2VyLWluc3RhbGxlZCBHUEUgQmxvY2sgRGV2aWNlcywgdGhlIGdwZV9ibG9ja19iYXNlX251bWJlcgorCSAqIGlzIGFsd2F5cyB6ZXJvCisJICovCisJc3RhdHVzID0KKwkgICAgYWNwaV9ldl9jcmVhdGVfZ3BlX2Jsb2NrKG5vZGUsIGdwZV9ibG9ja19hZGRyZXNzLCByZWdpc3Rlcl9jb3VudCwgMCwKKwkJCQkgICAgIGludGVycnVwdF9udW1iZXIsICZncGVfYmxvY2spOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlnb3RvIHVubG9ja19hbmRfZXhpdDsKKwl9CisKKwkvKiBSdW4gdGhlIF9QUlcgbWV0aG9kcyBhbmQgZW5hYmxlIHRoZSBHUEVzICovCisKKwlzdGF0dXMgPSBhY3BpX2V2X2luaXRpYWxpemVfZ3BlX2Jsb2NrKG5vZGUsIGdwZV9ibG9jayk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCWdvdG8gdW5sb2NrX2FuZF9leGl0OworCX0KKworCS8qIEdldCB0aGUgZGV2aWNlX29iamVjdCBhdHRhY2hlZCB0byB0aGUgbm9kZSAqLworCisJb2JqX2Rlc2MgPSBhY3BpX25zX2dldF9hdHRhY2hlZF9vYmplY3Qobm9kZSk7CisJaWYgKCFvYmpfZGVzYykgeworCisJCS8qIE5vIG9iamVjdCwgY3JlYXRlIGEgbmV3IG9uZSAqLworCisJCW9ial9kZXNjID0gYWNwaV91dF9jcmVhdGVfaW50ZXJuYWxfb2JqZWN0KEFDUElfVFlQRV9ERVZJQ0UpOworCQlpZiAoIW9ial9kZXNjKSB7CisJCQlzdGF0dXMgPSBBRV9OT19NRU1PUlk7CisJCQlnb3RvIHVubG9ja19hbmRfZXhpdDsKKwkJfQorCisJCXN0YXR1cyA9CisJCSAgICBhY3BpX25zX2F0dGFjaF9vYmplY3Qobm9kZSwgb2JqX2Rlc2MsIEFDUElfVFlQRV9ERVZJQ0UpOworCisJCS8qIFJlbW92ZSBsb2NhbCByZWZlcmVuY2UgdG8gdGhlIG9iamVjdCAqLworCisJCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZShvYmpfZGVzYyk7CisKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQlnb3RvIHVubG9ja19hbmRfZXhpdDsKKwkJfQorCX0KKworCS8qIEluc3RhbGwgdGhlIEdQRSBibG9jayBpbiB0aGUgZGV2aWNlX29iamVjdCAqLworCisJb2JqX2Rlc2MtPmRldmljZS5ncGVfYmxvY2sgPSBncGVfYmxvY2s7CisKKyAgICAgIHVubG9ja19hbmRfZXhpdDoKKwkodm9pZClhY3BpX3V0X3JlbGVhc2VfbXV0ZXgoQUNQSV9NVFhfTkFNRVNQQUNFKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKK30KKworQUNQSV9FWFBPUlRfU1lNQk9MKGFjcGlfaW5zdGFsbF9ncGVfYmxvY2spCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfcmVtb3ZlX2dwZV9ibG9jaworICoKKyAqIFBBUkFNRVRFUlM6ICBncGVfZGV2aWNlICAgICAgICAgIC0gSGFuZGxlIHRvIHRoZSBwYXJlbnQgR1BFIEJsb2NrIERldmljZQorICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogUmVtb3ZlIGEgcHJldmlvdXNseSBpbnN0YWxsZWQgYmxvY2sgb2YgR1BFIHJlZ2lzdGVycworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCithY3BpX3N0YXR1cyBhY3BpX3JlbW92ZV9ncGVfYmxvY2soYWNwaV9oYW5kbGUgZ3BlX2RldmljZSkKK3sKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYzsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGU7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGFjcGlfcmVtb3ZlX2dwZV9ibG9jayk7CisKKwlpZiAoIWdwZV9kZXZpY2UpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9QQVJBTUVURVIpOworCX0KKworCXN0YXR1cyA9IGFjcGlfdXRfYWNxdWlyZV9tdXRleChBQ1BJX01UWF9OQU1FU1BBQ0UpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm4gKHN0YXR1cyk7CisJfQorCisJbm9kZSA9IGFjcGlfbnNfbWFwX2hhbmRsZV90b19ub2RlKGdwZV9kZXZpY2UpOworCWlmICghbm9kZSkgeworCQlzdGF0dXMgPSBBRV9CQURfUEFSQU1FVEVSOworCQlnb3RvIHVubG9ja19hbmRfZXhpdDsKKwl9CisKKwkvKiBHZXQgdGhlIGRldmljZV9vYmplY3QgYXR0YWNoZWQgdG8gdGhlIG5vZGUgKi8KKworCW9ial9kZXNjID0gYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0KG5vZGUpOworCWlmICghb2JqX2Rlc2MgfHwgIW9ial9kZXNjLT5kZXZpY2UuZ3BlX2Jsb2NrKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OVUxMX09CSkVDVCk7CisJfQorCisJLyogRGVsZXRlIHRoZSBHUEUgYmxvY2sgKGJ1dCBub3QgdGhlIGRldmljZV9vYmplY3QpICovCisKKwlzdGF0dXMgPSBhY3BpX2V2X2RlbGV0ZV9ncGVfYmxvY2sob2JqX2Rlc2MtPmRldmljZS5ncGVfYmxvY2spOworCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkgeworCQlvYmpfZGVzYy0+ZGV2aWNlLmdwZV9ibG9jayA9IE5VTEw7CisJfQorCisgICAgICB1bmxvY2tfYW5kX2V4aXQ6CisJKHZvaWQpYWNwaV91dF9yZWxlYXNlX211dGV4KEFDUElfTVRYX05BTUVTUEFDRSk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Cit9CisKK0FDUElfRVhQT1JUX1NZTUJPTChhY3BpX3JlbW92ZV9ncGVfYmxvY2spCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfZ2V0X2dwZV9kZXZpY2UKKyAqCisgKiBQQVJBTUVURVJTOiAgSW5kZXggICAgICAgICAgICAgICAtIFN5c3RlbSBHUEUgaW5kZXggKDAtY3VycmVudF9ncGVfY291bnQpCisgKiAgICAgICAgICAgICAgZ3BlX2RldmljZSAgICAgICAgICAtIFdoZXJlIHRoZSBwYXJlbnQgR1BFIERldmljZSBpcyByZXR1cm5lZAorICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogT2J0YWluIHRoZSBHUEUgZGV2aWNlIGFzc29jaWF0ZWQgd2l0aCB0aGUgaW5wdXQgaW5kZXguIEEgTlVMTAorICogICAgICAgICAgICAgIGdwZSBkZXZpY2UgaW5kaWNhdGVzIHRoYXQgdGhlIGdwZSBudW1iZXIgaXMgY29udGFpbmVkIGluIG9uZSBvZgorICogICAgICAgICAgICAgIHRoZSBGQURULWRlZmluZWQgZ3BlIGJsb2Nrcy4gT3RoZXJ3aXNlLCB0aGUgR1BFIGJsb2NrIGRldmljZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYWNwaV9zdGF0dXMKK2FjcGlfZ2V0X2dwZV9kZXZpY2UodTMyIGluZGV4LCBhY3BpX2hhbmRsZSAqZ3BlX2RldmljZSkKK3sKKwlzdHJ1Y3QgYWNwaV9ncGVfZGV2aWNlX2luZm8gaW5mbzsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGFjcGlfZ2V0X2dwZV9kZXZpY2UpOworCisJaWYgKCFncGVfZGV2aWNlKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfUEFSQU1FVEVSKTsKKwl9CisKKwlpZiAoaW5kZXggPj0gYWNwaV9jdXJyZW50X2dwZV9jb3VudCkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9UX0VYSVNUKTsKKwl9CisKKwkvKiBTZXR1cCBhbmQgd2FsayB0aGUgR1BFIGxpc3QgKi8KKworCWluZm8uaW5kZXggPSBpbmRleDsKKwlpbmZvLnN0YXR1cyA9IEFFX05PVF9FWElTVDsKKwlpbmZvLmdwZV9kZXZpY2UgPSBOVUxMOworCWluZm8ubmV4dF9ibG9ja19iYXNlX2luZGV4ID0gMDsKKworCXN0YXR1cyA9IGFjcGlfZXZfd2Fsa19ncGVfbGlzdChhY3BpX2V2X2dldF9ncGVfZGV2aWNlLCAmaW5mbyk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworCX0KKworCSpncGVfZGV2aWNlID0gaW5mby5ncGVfZGV2aWNlOworCXJldHVybl9BQ1BJX1NUQVRVUyhpbmZvLnN0YXR1cyk7Cit9CisKK0FDUElfRVhQT1JUX1NZTUJPTChhY3BpX2dldF9ncGVfZGV2aWNlKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX2V2X2dldF9ncGVfZGV2aWNlCisgKgorICogUEFSQU1FVEVSUzogIEdQRV9XQUxLX0NBTExCQUNLCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBNYXRjaGVzIHRoZSBpbnB1dCBHUEUgaW5kZXggKDAtY3VycmVudF9ncGVfY291bnQpIHdpdGggYSBHUEUKKyAqICAgICAgICAgICAgICBibG9jayBkZXZpY2UuIE5VTEwgaWYgdGhlIEdQRSBpcyBvbmUgb2YgdGhlIEZBRFQtZGVmaW5lZCBHUEVzLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCithY3BpX3N0YXR1cworYWNwaV9ldl9nZXRfZ3BlX2RldmljZShzdHJ1Y3QgYWNwaV9ncGVfeHJ1cHRfaW5mbyAqZ3BlX3hydXB0X2luZm8sCisJCSAgICAgICBzdHJ1Y3QgYWNwaV9ncGVfYmxvY2tfaW5mbyAqZ3BlX2Jsb2NrLCB2b2lkICpjb250ZXh0KQoreworCXN0cnVjdCBhY3BpX2dwZV9kZXZpY2VfaW5mbyAqaW5mbyA9IGNvbnRleHQ7CisKKwkvKiBJbmNyZW1lbnQgSW5kZXggYnkgdGhlIG51bWJlciBvZiBHUEVzIGluIHRoaXMgYmxvY2sgKi8KKworCWluZm8tPm5leHRfYmxvY2tfYmFzZV9pbmRleCArPQorCSAgICAoZ3BlX2Jsb2NrLT5yZWdpc3Rlcl9jb3VudCAqIEFDUElfR1BFX1JFR0lTVEVSX1dJRFRIKTsKKworCWlmIChpbmZvLT5pbmRleCA8IGluZm8tPm5leHRfYmxvY2tfYmFzZV9pbmRleCkgeworCQkvKgorCQkgKiBUaGUgR1BFIGluZGV4IGlzIHdpdGhpbiB0aGlzIGJsb2NrLCBnZXQgdGhlIG5vZGUuIExlYXZlIHRoZSBub2RlCisJCSAqIE5VTEwgZm9yIHRoZSBGQURULWRlZmluZWQgR1BFcworCQkgKi8KKwkJaWYgKChncGVfYmxvY2stPm5vZGUpLT50eXBlID09IEFDUElfVFlQRV9ERVZJQ0UpIHsKKwkJCWluZm8tPmdwZV9kZXZpY2UgPSBncGVfYmxvY2stPm5vZGU7CisJCX0KKworCQlpbmZvLT5zdGF0dXMgPSBBRV9PSzsKKwkJcmV0dXJuIChBRV9DVFJMX0VORCk7CisJfQorCisJcmV0dXJuIChBRV9PSyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9kaXNhYmxlX2FsbF9ncGVzCisgKgorICogUEFSQU1FVEVSUzogIE5vbmUKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IERpc2FibGUgYW5kIGNsZWFyIGFsbCBHUEVzIGluIGFsbCBHUEUgYmxvY2tzCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworYWNwaV9zdGF0dXMgYWNwaV9kaXNhYmxlX2FsbF9ncGVzKHZvaWQpCit7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCisJQUNQSV9GVU5DVElPTl9UUkFDRShhY3BpX2Rpc2FibGVfYWxsX2dwZXMpOworCisJc3RhdHVzID0gYWNwaV91dF9hY3F1aXJlX211dGV4KEFDUElfTVRYX0VWRU5UUyk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworCX0KKworCXN0YXR1cyA9IGFjcGlfaHdfZGlzYWJsZV9hbGxfZ3BlcygpOworCSh2b2lkKWFjcGlfdXRfcmVsZWFzZV9tdXRleChBQ1BJX01UWF9FVkVOVFMpOworCisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9lbmFibGVfYWxsX3J1bnRpbWVfZ3BlcworICoKKyAqIFBBUkFNRVRFUlM6ICBOb25lCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBFbmFibGUgYWxsICJydW50aW1lIiBHUEVzLCBpbiBhbGwgR1BFIGJsb2NrcworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2FjcGlfc3RhdHVzIGFjcGlfZW5hYmxlX2FsbF9ydW50aW1lX2dwZXModm9pZCkKK3sKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGFjcGlfZW5hYmxlX2FsbF9ydW50aW1lX2dwZXMpOworCisJc3RhdHVzID0gYWNwaV91dF9hY3F1aXJlX211dGV4KEFDUElfTVRYX0VWRU5UUyk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworCX0KKworCXN0YXR1cyA9IGFjcGlfaHdfZW5hYmxlX2FsbF9ydW50aW1lX2dwZXMoKTsKKwkodm9pZClhY3BpX3V0X3JlbGVhc2VfbXV0ZXgoQUNQSV9NVFhfRVZFTlRTKTsKKworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS9ldnhmcmVnbi5jIGIvZHJpdmVycy9hY3BpL2FjcGljYS9ldnhmcmVnbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3OWU3YTMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2V2eGZyZWduLmMKQEAgLTAsMCArMSwyNTQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBNb2R1bGUgTmFtZTogZXZ4ZnJlZ24gLSBFeHRlcm5hbCBJbnRlcmZhY2VzLCBBQ1BJIE9wZXJhdGlvbiBSZWdpb25zIGFuZAorICogICAgICAgICAgICAgICAgICAgICAgICAgQWRkcmVzcyBTcGFjZXMuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwOCwgSW50ZWwgQ29ycC4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKKyAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIGF0IG1pbmltdW0gYSBkaXNjbGFpbWVyCisgKiAgICBzdWJzdGFudGlhbGx5IHNpbWlsYXIgdG8gdGhlICJOTyBXQVJSQU5UWSIgZGlzY2xhaW1lciBiZWxvdworICogICAgKCJEaXNjbGFpbWVyIikgYW5kIGFueSByZWRpc3RyaWJ1dGlvbiBtdXN0IGJlIGNvbmRpdGlvbmVkIHVwb24KKyAqICAgIGluY2x1ZGluZyBhIHN1YnN0YW50aWFsbHkgc2ltaWxhciBEaXNjbGFpbWVyIHJlcXVpcmVtZW50IGZvciBmdXJ0aGVyCisgKiAgICBiaW5hcnkgcmVkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMKKyAqICAgIG9mIGFueSBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogTk8gV0FSUkFOVFkKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HCisgKiBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KKyAqLworCisjaW5jbHVkZSA8YWNwaS9hY3BpLmg+CisjaW5jbHVkZSAiYWNjb21tb24uaCIKKyNpbmNsdWRlICJhY25hbWVzcC5oIgorI2luY2x1ZGUgImFjZXZlbnRzLmgiCisKKyNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX0VWRU5UUworQUNQSV9NT0RVTEVfTkFNRSgiZXZ4ZnJlZ24iKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX2luc3RhbGxfYWRkcmVzc19zcGFjZV9oYW5kbGVyCisgKgorICogUEFSQU1FVEVSUzogIERldmljZSAgICAgICAgICAtIEhhbmRsZSBmb3IgdGhlIGRldmljZQorICogICAgICAgICAgICAgIHNwYWNlX2lkICAgICAgICAtIFRoZSBhZGRyZXNzIHNwYWNlIElECisgKiAgICAgICAgICAgICAgSGFuZGxlciAgICAgICAgIC0gQWRkcmVzcyBvZiB0aGUgaGFuZGxlcgorICogICAgICAgICAgICAgIFNldHVwICAgICAgICAgICAtIEFkZHJlc3Mgb2YgdGhlIHNldHVwIGZ1bmN0aW9uCisgKiAgICAgICAgICAgICAgQ29udGV4dCAgICAgICAgIC0gVmFsdWUgcGFzc2VkIHRvIHRoZSBoYW5kbGVyIG9uIGVhY2ggYWNjZXNzCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBJbnN0YWxsIGEgaGFuZGxlciBmb3IgYWxsIG9wX3JlZ2lvbnMgb2YgYSBnaXZlbiBzcGFjZV9pZC4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYWNwaV9zdGF0dXMKK2FjcGlfaW5zdGFsbF9hZGRyZXNzX3NwYWNlX2hhbmRsZXIoYWNwaV9oYW5kbGUgZGV2aWNlLAorCQkJCSAgIGFjcGlfYWRyX3NwYWNlX3R5cGUgc3BhY2VfaWQsCisJCQkJICAgYWNwaV9hZHJfc3BhY2VfaGFuZGxlciBoYW5kbGVyLAorCQkJCSAgIGFjcGlfYWRyX3NwYWNlX3NldHVwIHNldHVwLCB2b2lkICpjb250ZXh0KQoreworCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0UoYWNwaV9pbnN0YWxsX2FkZHJlc3Nfc3BhY2VfaGFuZGxlcik7CisKKwkvKiBQYXJhbWV0ZXIgdmFsaWRhdGlvbiAqLworCisJaWYgKCFkZXZpY2UpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9QQVJBTUVURVIpOworCX0KKworCXN0YXR1cyA9IGFjcGlfdXRfYWNxdWlyZV9tdXRleChBQ1BJX01UWF9OQU1FU1BBQ0UpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKKwl9CisKKwkvKiBDb252ZXJ0IGFuZCB2YWxpZGF0ZSB0aGUgZGV2aWNlIGhhbmRsZSAqLworCisJbm9kZSA9IGFjcGlfbnNfbWFwX2hhbmRsZV90b19ub2RlKGRldmljZSk7CisJaWYgKCFub2RlKSB7CisJCXN0YXR1cyA9IEFFX0JBRF9QQVJBTUVURVI7CisJCWdvdG8gdW5sb2NrX2FuZF9leGl0OworCX0KKworCS8qIEluc3RhbGwgdGhlIGhhbmRsZXIgZm9yIGFsbCBSZWdpb25zIGZvciB0aGlzIFNwYWNlIElEICovCisKKwlzdGF0dXMgPQorCSAgICBhY3BpX2V2X2luc3RhbGxfc3BhY2VfaGFuZGxlcihub2RlLCBzcGFjZV9pZCwgaGFuZGxlciwgc2V0dXAsCisJCQkJCSAgY29udGV4dCk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCWdvdG8gdW5sb2NrX2FuZF9leGl0OworCX0KKworCS8qIFJ1biBhbGwgX1JFRyBtZXRob2RzIGZvciB0aGlzIGFkZHJlc3Mgc3BhY2UgKi8KKworCXN0YXR1cyA9IGFjcGlfZXZfZXhlY3V0ZV9yZWdfbWV0aG9kcyhub2RlLCBzcGFjZV9pZCk7CisKKyAgICAgIHVubG9ja19hbmRfZXhpdDoKKwkodm9pZClhY3BpX3V0X3JlbGVhc2VfbXV0ZXgoQUNQSV9NVFhfTkFNRVNQQUNFKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKK30KKworQUNQSV9FWFBPUlRfU1lNQk9MKGFjcGlfaW5zdGFsbF9hZGRyZXNzX3NwYWNlX2hhbmRsZXIpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfcmVtb3ZlX2FkZHJlc3Nfc3BhY2VfaGFuZGxlcgorICoKKyAqIFBBUkFNRVRFUlM6ICBEZXZpY2UgICAgICAgICAgLSBIYW5kbGUgZm9yIHRoZSBkZXZpY2UKKyAqICAgICAgICAgICAgICBzcGFjZV9pZCAgICAgICAgLSBUaGUgYWRkcmVzcyBzcGFjZSBJRAorICogICAgICAgICAgICAgIEhhbmRsZXIgICAgICAgICAtIEFkZHJlc3Mgb2YgdGhlIGhhbmRsZXIKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IFJlbW92ZSBhIHByZXZpb3VzbHkgaW5zdGFsbGVkIGhhbmRsZXIuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2FjcGlfc3RhdHVzCithY3BpX3JlbW92ZV9hZGRyZXNzX3NwYWNlX2hhbmRsZXIoYWNwaV9oYW5kbGUgZGV2aWNlLAorCQkJCSAgYWNwaV9hZHJfc3BhY2VfdHlwZSBzcGFjZV9pZCwKKwkJCQkgIGFjcGlfYWRyX3NwYWNlX2hhbmRsZXIgaGFuZGxlcikKK3sKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYzsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpoYW5kbGVyX29iajsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpyZWdpb25fb2JqOworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKipsYXN0X29ial9wdHI7CisJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGU7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCisJQUNQSV9GVU5DVElPTl9UUkFDRShhY3BpX3JlbW92ZV9hZGRyZXNzX3NwYWNlX2hhbmRsZXIpOworCisJLyogUGFyYW1ldGVyIHZhbGlkYXRpb24gKi8KKworCWlmICghZGV2aWNlKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfUEFSQU1FVEVSKTsKKwl9CisKKwlzdGF0dXMgPSBhY3BpX3V0X2FjcXVpcmVfbXV0ZXgoQUNQSV9NVFhfTkFNRVNQQUNFKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CisJfQorCisJLyogQ29udmVydCBhbmQgdmFsaWRhdGUgdGhlIGRldmljZSBoYW5kbGUgKi8KKworCW5vZGUgPSBhY3BpX25zX21hcF9oYW5kbGVfdG9fbm9kZShkZXZpY2UpOworCWlmICghbm9kZSB8fAorCSAgICAoKG5vZGUtPnR5cGUgIT0gQUNQSV9UWVBFX0RFVklDRSkgJiYKKwkgICAgIChub2RlLT50eXBlICE9IEFDUElfVFlQRV9QUk9DRVNTT1IpICYmCisJICAgICAobm9kZS0+dHlwZSAhPSBBQ1BJX1RZUEVfVEhFUk1BTCkgJiYKKwkgICAgIChub2RlICE9IGFjcGlfZ2JsX3Jvb3Rfbm9kZSkpKSB7CisJCXN0YXR1cyA9IEFFX0JBRF9QQVJBTUVURVI7CisJCWdvdG8gdW5sb2NrX2FuZF9leGl0OworCX0KKworCS8qIE1ha2Ugc3VyZSB0aGUgaW50ZXJuYWwgb2JqZWN0IGV4aXN0cyAqLworCisJb2JqX2Rlc2MgPSBhY3BpX25zX2dldF9hdHRhY2hlZF9vYmplY3Qobm9kZSk7CisJaWYgKCFvYmpfZGVzYykgeworCQlzdGF0dXMgPSBBRV9OT1RfRVhJU1Q7CisJCWdvdG8gdW5sb2NrX2FuZF9leGl0OworCX0KKworCS8qIEZpbmQgdGhlIGFkZHJlc3MgaGFuZGxlciB0aGUgdXNlciByZXF1ZXN0ZWQgKi8KKworCWhhbmRsZXJfb2JqID0gb2JqX2Rlc2MtPmRldmljZS5oYW5kbGVyOworCWxhc3Rfb2JqX3B0ciA9ICZvYmpfZGVzYy0+ZGV2aWNlLmhhbmRsZXI7CisJd2hpbGUgKGhhbmRsZXJfb2JqKSB7CisKKwkJLyogV2UgaGF2ZSBhIGhhbmRsZXIsIHNlZSBpZiB1c2VyIHJlcXVlc3RlZCB0aGlzIG9uZSAqLworCisJCWlmIChoYW5kbGVyX29iai0+YWRkcmVzc19zcGFjZS5zcGFjZV9pZCA9PSBzcGFjZV9pZCkgeworCisJCQkvKiBIYW5kbGVyIG11c3QgYmUgdGhlIHNhbWUgYXMgdGhlIGluc3RhbGxlZCBoYW5kbGVyICovCisKKwkJCWlmIChoYW5kbGVyX29iai0+YWRkcmVzc19zcGFjZS5oYW5kbGVyICE9IGhhbmRsZXIpIHsKKwkJCQlzdGF0dXMgPSBBRV9CQURfUEFSQU1FVEVSOworCQkJCWdvdG8gdW5sb2NrX2FuZF9leGl0OworCQkJfQorCisJCQkvKiBNYXRjaGVkIHNwYWNlX2lkLCBmaXJzdCBkZXJlZmVyZW5jZSB0aGlzIGluIHRoZSBSZWdpb25zICovCisKKwkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfT1BSRUdJT04sCisJCQkJCSAgIlJlbW92aW5nIGFkZHJlc3MgaGFuZGxlciAlcCglcCkgZm9yIHJlZ2lvbiAlcyBvbiBEZXZpY2UgJXAoJXApXG4iLAorCQkJCQkgIGhhbmRsZXJfb2JqLCBoYW5kbGVyLAorCQkJCQkgIGFjcGlfdXRfZ2V0X3JlZ2lvbl9uYW1lKHNwYWNlX2lkKSwKKwkJCQkJICBub2RlLCBvYmpfZGVzYykpOworCisJCQlyZWdpb25fb2JqID0gaGFuZGxlcl9vYmotPmFkZHJlc3Nfc3BhY2UucmVnaW9uX2xpc3Q7CisKKwkJCS8qIFdhbGsgdGhlIGhhbmRsZXIncyByZWdpb24gbGlzdCAqLworCisJCQl3aGlsZSAocmVnaW9uX29iaikgeworCQkJCS8qCisJCQkJICogRmlyc3QgZGlzYXNzb2NpYXRlIHRoZSBoYW5kbGVyIGZyb20gdGhlIHJlZ2lvbi4KKwkJCQkgKgorCQkJCSAqIE5PVEU6IHRoaXMgZG9lc24ndCBtZWFuIHRoYXQgdGhlIHJlZ2lvbiBnb2VzIGF3YXkKKwkJCQkgKiBUaGUgcmVnaW9uIGlzIGp1c3QgaW5hY2Nlc3NpYmxlIGFzIGluZGljYXRlZCB0bworCQkJCSAqIHRoZSBfUkVHIG1ldGhvZAorCQkJCSAqLworCQkJCWFjcGlfZXZfZGV0YWNoX3JlZ2lvbihyZWdpb25fb2JqLCBUUlVFKTsKKworCQkJCS8qCisJCQkJICogV2FsayB0aGUgbGlzdDogSnVzdCBncmFiIHRoZSBoZWFkIGJlY2F1c2UgdGhlCisJCQkJICogZGV0YWNoX3JlZ2lvbiByZW1vdmVkIHRoZSBwcmV2aW91cyBoZWFkLgorCQkJCSAqLworCQkJCXJlZ2lvbl9vYmogPQorCQkJCSAgICBoYW5kbGVyX29iai0+YWRkcmVzc19zcGFjZS5yZWdpb25fbGlzdDsKKworCQkJfQorCisJCQkvKiBSZW1vdmUgdGhpcyBIYW5kbGVyIG9iamVjdCBmcm9tIHRoZSBsaXN0ICovCisKKwkJCSpsYXN0X29ial9wdHIgPSBoYW5kbGVyX29iai0+YWRkcmVzc19zcGFjZS5uZXh0OworCisJCQkvKiBOb3cgd2UgY2FuIGRlbGV0ZSB0aGUgaGFuZGxlciBvYmplY3QgKi8KKworCQkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKGhhbmRsZXJfb2JqKTsKKwkJCWdvdG8gdW5sb2NrX2FuZF9leGl0OworCQl9CisKKwkJLyogV2FsayB0aGUgbGlua2VkIGxpc3Qgb2YgaGFuZGxlcnMgKi8KKworCQlsYXN0X29ial9wdHIgPSAmaGFuZGxlcl9vYmotPmFkZHJlc3Nfc3BhY2UubmV4dDsKKwkJaGFuZGxlcl9vYmogPSBoYW5kbGVyX29iai0+YWRkcmVzc19zcGFjZS5uZXh0OworCX0KKworCS8qIFRoZSBoYW5kbGVyIGRvZXMgbm90IGV4aXN0ICovCisKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX09QUkVHSU9OLAorCQkJICAiVW5hYmxlIHRvIHJlbW92ZSBhZGRyZXNzIGhhbmRsZXIgJXAgZm9yICVzKCVYKSwgRGV2Tm9kZSAlcCwgb2JqICVwXG4iLAorCQkJICBoYW5kbGVyLCBhY3BpX3V0X2dldF9yZWdpb25fbmFtZShzcGFjZV9pZCksIHNwYWNlX2lkLAorCQkJICBub2RlLCBvYmpfZGVzYykpOworCisJc3RhdHVzID0gQUVfTk9UX0VYSVNUOworCisgICAgICB1bmxvY2tfYW5kX2V4aXQ6CisJKHZvaWQpYWNwaV91dF9yZWxlYXNlX211dGV4KEFDUElfTVRYX05BTUVTUEFDRSk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Cit9CisKK0FDUElfRVhQT1JUX1NZTUJPTChhY3BpX3JlbW92ZV9hZGRyZXNzX3NwYWNlX2hhbmRsZXIpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2V4Y29uZmlnLmMgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2V4Y29uZmlnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTMyYmJjMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXhjb25maWcuYwpAQCAtMCwwICsxLDUzNiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIE1vZHVsZSBOYW1lOiBleGNvbmZpZyAtIE5hbWVzcGFjZSByZWNvbmZpZ3VyYXRpb24gKExvYWQvVW5sb2FkIG9wY29kZXMpCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwOCwgSW50ZWwgQ29ycC4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKKyAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIGF0IG1pbmltdW0gYSBkaXNjbGFpbWVyCisgKiAgICBzdWJzdGFudGlhbGx5IHNpbWlsYXIgdG8gdGhlICJOTyBXQVJSQU5UWSIgZGlzY2xhaW1lciBiZWxvdworICogICAgKCJEaXNjbGFpbWVyIikgYW5kIGFueSByZWRpc3RyaWJ1dGlvbiBtdXN0IGJlIGNvbmRpdGlvbmVkIHVwb24KKyAqICAgIGluY2x1ZGluZyBhIHN1YnN0YW50aWFsbHkgc2ltaWxhciBEaXNjbGFpbWVyIHJlcXVpcmVtZW50IGZvciBmdXJ0aGVyCisgKiAgICBiaW5hcnkgcmVkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMKKyAqICAgIG9mIGFueSBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogTk8gV0FSUkFOVFkKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HCisgKiBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KKyAqLworCisjaW5jbHVkZSA8YWNwaS9hY3BpLmg+CisjaW5jbHVkZSAiYWNjb21tb24uaCIKKyNpbmNsdWRlICJhY2ludGVycC5oIgorI2luY2x1ZGUgImFjbmFtZXNwLmgiCisjaW5jbHVkZSAiYWN0YWJsZXMuaCIKKyNpbmNsdWRlICJhY2Rpc3BhdC5oIgorCisjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9FWEVDVVRFUgorQUNQSV9NT0RVTEVfTkFNRSgiZXhjb25maWciKQorCisvKiBMb2NhbCBwcm90b3R5cGVzICovCitzdGF0aWMgYWNwaV9zdGF0dXMKK2FjcGlfZXhfYWRkX3RhYmxlKHUzMiB0YWJsZV9pbmRleCwKKwkJICBzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqcGFyZW50X25vZGUsCisJCSAgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKmRkYl9oYW5kbGUpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X2FkZF90YWJsZQorICoKKyAqIFBBUkFNRVRFUlM6ICBUYWJsZSAgICAgICAgICAgICAgIC0gUG9pbnRlciB0byByYXcgdGFibGUKKyAqICAgICAgICAgICAgICBwYXJlbnRfbm9kZSAgICAgICAgIC0gV2hlcmUgdG8gbG9hZCB0aGUgdGFibGUgKHNjb3BlKQorICogICAgICAgICAgICAgIGRkYl9oYW5kbGUgICAgICAgICAgLSBXaGVyZSB0byByZXR1cm4gdGhlIHRhYmxlIGhhbmRsZS4KKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IENvbW1vbiBmdW5jdGlvbiB0byBJbnN0YWxsIGFuZCBMb2FkIGFuIEFDUEkgdGFibGUgd2l0aCBhCisgKiAgICAgICAgICAgICAgcmV0dXJuZWQgdGFibGUgaGFuZGxlLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBhY3BpX3N0YXR1cworYWNwaV9leF9hZGRfdGFibGUodTMyIHRhYmxlX2luZGV4LAorCQkgIHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpwYXJlbnRfbm9kZSwKKwkJICB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICoqZGRiX2hhbmRsZSkKK3sKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2M7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGV4X2FkZF90YWJsZSk7CisKKwkvKiBDcmVhdGUgYW4gb2JqZWN0IHRvIGJlIHRoZSB0YWJsZSBoYW5kbGUgKi8KKworCW9ial9kZXNjID0gYWNwaV91dF9jcmVhdGVfaW50ZXJuYWxfb2JqZWN0KEFDUElfVFlQRV9MT0NBTF9SRUZFUkVOQ0UpOworCWlmICghb2JqX2Rlc2MpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX01FTU9SWSk7CisJfQorCisJLyogSW5pdCB0aGUgdGFibGUgaGFuZGxlICovCisKKwlvYmpfZGVzYy0+cmVmZXJlbmNlLmNsYXNzID0gQUNQSV9SRUZDTEFTU19UQUJMRTsKKwkqZGRiX2hhbmRsZSA9IG9ial9kZXNjOworCisJLyogSW5zdGFsbCB0aGUgbmV3IHRhYmxlIGludG8gdGhlIGxvY2FsIGRhdGEgc3RydWN0dXJlcyAqLworCisJb2JqX2Rlc2MtPnJlZmVyZW5jZS52YWx1ZSA9IHRhYmxlX2luZGV4OworCisJLyogQWRkIHRoZSB0YWJsZSB0byB0aGUgbmFtZXNwYWNlICovCisKKwlzdGF0dXMgPSBhY3BpX25zX2xvYWRfdGFibGUodGFibGVfaW5kZXgsIHBhcmVudF9ub2RlKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKG9ial9kZXNjKTsKKwkJKmRkYl9oYW5kbGUgPSBOVUxMOworCX0KKworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X2xvYWRfdGFibGVfb3AKKyAqCisgKiBQQVJBTUVURVJTOiAgd2Fsa19zdGF0ZSAgICAgICAgICAtIEN1cnJlbnQgc3RhdGUgd2l0aCBvcGVyYW5kcworICogICAgICAgICAgICAgIHJldHVybl9kZXNjICAgICAgICAgLSBXaGVyZSB0byBzdG9yZSB0aGUgcmV0dXJuIG9iamVjdAorICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogTG9hZCBhbiBBQ1BJIHRhYmxlIGZyb20gdGhlIFJTRFQvWFNEVAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2FjcGlfc3RhdHVzCithY3BpX2V4X2xvYWRfdGFibGVfb3Aoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSwKKwkJICAgICAgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKnJldHVybl9kZXNjKQoreworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICoqb3BlcmFuZCA9ICZ3YWxrX3N0YXRlLT5vcGVyYW5kc1swXTsKKwlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqcGFyZW50X25vZGU7CisJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKnN0YXJ0X25vZGU7CisJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKnBhcmFtZXRlcl9ub2RlID0gTlVMTDsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpkZGJfaGFuZGxlOworCXN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqdGFibGU7CisJdTMyIHRhYmxlX2luZGV4OworCisJQUNQSV9GVU5DVElPTl9UUkFDRShleF9sb2FkX3RhYmxlX29wKTsKKworCS8qIFZhbGlkYXRlIGxlbmd0aHMgZm9yIHRoZSBzaWduYXR1cmVfc3RyaW5nLCBPRU1JRFN0cmluZywgT0VNdGFibGVfaUQgKi8KKworCWlmICgob3BlcmFuZFswXS0+c3RyaW5nLmxlbmd0aCA+IEFDUElfTkFNRV9TSVpFKSB8fAorCSAgICAob3BlcmFuZFsxXS0+c3RyaW5nLmxlbmd0aCA+IEFDUElfT0VNX0lEX1NJWkUpIHx8CisJICAgIChvcGVyYW5kWzJdLT5zdHJpbmcubGVuZ3RoID4gQUNQSV9PRU1fVEFCTEVfSURfU0laRSkpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9QQVJBTUVURVIpOworCX0KKworCS8qIEZpbmQgdGhlIEFDUEkgdGFibGUgaW4gdGhlIFJTRFQvWFNEVCAqLworCisJc3RhdHVzID0gYWNwaV90Yl9maW5kX3RhYmxlKG9wZXJhbmRbMF0tPnN0cmluZy5wb2ludGVyLAorCQkJCSAgICBvcGVyYW5kWzFdLT5zdHJpbmcucG9pbnRlciwKKwkJCQkgICAgb3BlcmFuZFsyXS0+c3RyaW5nLnBvaW50ZXIsICZ0YWJsZV9pbmRleCk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCWlmIChzdGF0dXMgIT0gQUVfTk9UX0ZPVU5EKSB7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKKwkJfQorCisJCS8qIFRhYmxlIG5vdCBmb3VuZCwgcmV0dXJuIGFuIEludGVnZXI9MCBhbmQgQUVfT0sgKi8KKworCQlkZGJfaGFuZGxlID0gYWNwaV91dF9jcmVhdGVfaW50ZXJuYWxfb2JqZWN0KEFDUElfVFlQRV9JTlRFR0VSKTsKKwkJaWYgKCFkZGJfaGFuZGxlKSB7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9fTUVNT1JZKTsKKwkJfQorCisJCWRkYl9oYW5kbGUtPmludGVnZXIudmFsdWUgPSAwOworCQkqcmV0dXJuX2Rlc2MgPSBkZGJfaGFuZGxlOworCisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CisJfQorCisJLyogRGVmYXVsdCBub2RlcyAqLworCisJc3RhcnRfbm9kZSA9IHdhbGtfc3RhdGUtPnNjb3BlX2luZm8tPnNjb3BlLm5vZGU7CisJcGFyZW50X25vZGUgPSBhY3BpX2dibF9yb290X25vZGU7CisKKwkvKiByb290X3BhdGggKG9wdGlvbmFsIHBhcmFtZXRlcikgKi8KKworCWlmIChvcGVyYW5kWzNdLT5zdHJpbmcubGVuZ3RoID4gMCkgeworCQkvKgorCQkgKiBGaW5kIHRoZSBub2RlIHJlZmVyZW5jZWQgYnkgdGhlIHJvb3RfcGF0aF9zdHJpbmcuIFRoaXMgaXMgdGhlCisJCSAqIGxvY2F0aW9uIHdpdGhpbiB0aGUgbmFtZXNwYWNlIHdoZXJlIHRoZSB0YWJsZSB3aWxsIGJlIGxvYWRlZC4KKwkJICovCisJCXN0YXR1cyA9CisJCSAgICBhY3BpX25zX2dldF9ub2RlKHN0YXJ0X25vZGUsIG9wZXJhbmRbM10tPnN0cmluZy5wb2ludGVyLAorCQkJCSAgICAgQUNQSV9OU19TRUFSQ0hfUEFSRU5ULCAmcGFyZW50X25vZGUpOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworCQl9CisJfQorCisJLyogcGFyYW1ldGVyX3BhdGggKG9wdGlvbmFsIHBhcmFtZXRlcikgKi8KKworCWlmIChvcGVyYW5kWzRdLT5zdHJpbmcubGVuZ3RoID4gMCkgeworCQlpZiAoKG9wZXJhbmRbNF0tPnN0cmluZy5wb2ludGVyWzBdICE9ICdcXCcpICYmCisJCSAgICAob3BlcmFuZFs0XS0+c3RyaW5nLnBvaW50ZXJbMF0gIT0gJ14nKSkgeworCQkJLyoKKwkJCSAqIFBhdGggaXMgbm90IGFic29sdXRlLCBzbyBpdCB3aWxsIGJlIHJlbGF0aXZlIHRvIHRoZSBub2RlCisJCQkgKiByZWZlcmVuY2VkIGJ5IHRoZSByb290X3BhdGhfc3RyaW5nIChvciB0aGUgTlMgcm9vdCBpZiBvbWl0dGVkKQorCQkJICovCisJCQlzdGFydF9ub2RlID0gcGFyZW50X25vZGU7CisJCX0KKworCQkvKiBGaW5kIHRoZSBub2RlIHJlZmVyZW5jZWQgYnkgdGhlIHBhcmFtZXRlcl9wYXRoX3N0cmluZyAqLworCisJCXN0YXR1cyA9CisJCSAgICBhY3BpX25zX2dldF9ub2RlKHN0YXJ0X25vZGUsIG9wZXJhbmRbNF0tPnN0cmluZy5wb2ludGVyLAorCQkJCSAgICAgQUNQSV9OU19TRUFSQ0hfUEFSRU5ULCAmcGFyYW1ldGVyX25vZGUpOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworCQl9CisJfQorCisJLyogTG9hZCB0aGUgdGFibGUgaW50byB0aGUgbmFtZXNwYWNlICovCisKKwlzdGF0dXMgPSBhY3BpX2V4X2FkZF90YWJsZSh0YWJsZV9pbmRleCwgcGFyZW50X25vZGUsICZkZGJfaGFuZGxlKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CisJfQorCisJLyogUGFyYW1ldGVyIERhdGEgKG9wdGlvbmFsKSAqLworCisJaWYgKHBhcmFtZXRlcl9ub2RlKSB7CisKKwkJLyogU3RvcmUgdGhlIHBhcmFtZXRlciBkYXRhIGludG8gdGhlIG9wdGlvbmFsIHBhcmFtZXRlciBvYmplY3QgKi8KKworCQlzdGF0dXMgPSBhY3BpX2V4X3N0b3JlKG9wZXJhbmRbNV0sCisJCQkJICAgICAgIEFDUElfQ0FTVF9QVFIodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCwKKwkJCQkJCSAgICAgcGFyYW1ldGVyX25vZGUpLAorCQkJCSAgICAgICB3YWxrX3N0YXRlKTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQkodm9pZClhY3BpX2V4X3VubG9hZF90YWJsZShkZGJfaGFuZGxlKTsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworCQl9CisJfQorCisJc3RhdHVzID0gYWNwaV9nZXRfdGFibGVfYnlfaW5kZXgodGFibGVfaW5kZXgsICZ0YWJsZSk7CisJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCUFDUElfSU5GTygoQUVfSU5GTywKKwkJCSAgICJEeW5hbWljIE9FTSBUYWJsZSBMb2FkIC0gWyUuNHNdIE9lbUlkIFslLjZzXSBPZW1UYWJsZUlkIFslLjhzXSIsCisJCQkgICB0YWJsZS0+c2lnbmF0dXJlLCB0YWJsZS0+b2VtX2lkLAorCQkJICAgdGFibGUtPm9lbV90YWJsZV9pZCkpOworCX0KKworCS8qIEludm9rZSB0YWJsZSBoYW5kbGVyIGlmIHByZXNlbnQgKi8KKworCWlmIChhY3BpX2dibF90YWJsZV9oYW5kbGVyKSB7CisJCSh2b2lkKWFjcGlfZ2JsX3RhYmxlX2hhbmRsZXIoQUNQSV9UQUJMRV9FVkVOVF9MT0FELCB0YWJsZSwKKwkJCQkJICAgICBhY3BpX2dibF90YWJsZV9oYW5kbGVyX2NvbnRleHQpOworCX0KKworCSpyZXR1cm5fZGVzYyA9IGRkYl9oYW5kbGU7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfZXhfbG9hZF9vcAorICoKKyAqIFBBUkFNRVRFUlM6ICBvYmpfZGVzYyAgICAgICAgLSBSZWdpb24gb3IgQnVmZmVyL0ZpZWxkIHdoZXJlIHRoZSB0YWJsZSB3aWxsIGJlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2J0YWluZWQKKyAqICAgICAgICAgICAgICBUYXJnZXQgICAgICAgICAgLSBXaGVyZSBhIGhhbmRsZSB0byB0aGUgdGFibGUgd2lsbCBiZSBzdG9yZWQKKyAqICAgICAgICAgICAgICB3YWxrX3N0YXRlICAgICAgLSBDdXJyZW50IHN0YXRlCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBMb2FkIGFuIEFDUEkgdGFibGUgZnJvbSBhIGZpZWxkIG9yIG9wZXJhdGlvbiByZWdpb24KKyAqCisgKiBOT1RFOiBSZWdpb24gRmllbGRzIChGaWVsZCwgYmFua19maWVsZCwgaW5kZXhfZmllbGRzKSBhcmUgcmVzb2x2ZWQgdG8gYnVmZmVyCisgKiAgICAgICBvYmplY3RzIGJlZm9yZSB0aGlzIGNvZGUgaXMgcmVhY2hlZC4KKyAqCisgKiAgICAgICBJZiBzb3VyY2UgaXMgYW4gb3BlcmF0aW9uIHJlZ2lvbiwgaXQgbXVzdCByZWZlciB0byBzeXN0ZW1fbWVtb3J5LCBhcworICogICAgICAgcGVyIHRoZSBBQ1BJIHNwZWNpZmljYXRpb24uCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworYWNwaV9zdGF0dXMKK2FjcGlfZXhfbG9hZF9vcCh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYywKKwkJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqdGFyZ2V0LAorCQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKQoreworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKmRkYl9oYW5kbGU7CisJc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICp0YWJsZTsKKwlzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjIHRhYmxlX2Rlc2M7CisJdTMyIHRhYmxlX2luZGV4OworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwl1MzIgbGVuZ3RoOworCisJQUNQSV9GVU5DVElPTl9UUkFDRShleF9sb2FkX29wKTsKKworCUFDUElfTUVNU0VUKCZ0YWJsZV9kZXNjLCAwLCBzaXplb2Yoc3RydWN0IGFjcGlfdGFibGVfZGVzYykpOworCisJLyogU291cmNlIE9iamVjdCBjYW4gYmUgZWl0aGVyIGFuIG9wX3JlZ2lvbiBvciBhIEJ1ZmZlci9GaWVsZCAqLworCisJc3dpdGNoIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRShvYmpfZGVzYykpIHsKKwljYXNlIEFDUElfVFlQRV9SRUdJT046CisKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FWEVDLAorCQkJCSAgIkxvYWQgdGFibGUgZnJvbSBSZWdpb24gJXBcbiIsIG9ial9kZXNjKSk7CisKKwkJLyogUmVnaW9uIG11c3QgYmUgc3lzdGVtX21lbW9yeSAoZnJvbSBBQ1BJIHNwZWMpICovCisKKwkJaWYgKG9ial9kZXNjLT5yZWdpb24uc3BhY2VfaWQgIT0gQUNQSV9BRFJfU1BBQ0VfU1lTVEVNX01FTU9SWSkgeworCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9PUEVSQU5EX1RZUEUpOworCQl9CisKKwkJLyoKKwkJICogSWYgdGhlIFJlZ2lvbiBBZGRyZXNzIGFuZCBMZW5ndGggaGF2ZSBub3QgYmVlbiBwcmV2aW91c2x5IGV2YWx1YXRlZCwKKwkJICogZXZhbHVhdGUgdGhlbSBub3cgYW5kIHNhdmUgdGhlIHJlc3VsdHMuCisJCSAqLworCQlpZiAoIShvYmpfZGVzYy0+Y29tbW9uLmZsYWdzICYgQU9QT0JKX0RBVEFfVkFMSUQpKSB7CisJCQlzdGF0dXMgPSBhY3BpX2RzX2dldF9yZWdpb25fYXJndW1lbnRzKG9ial9kZXNjKTsKKwkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworCQkJfQorCQl9CisKKwkJLyoKKwkJICogTWFwIHRoZSB0YWJsZSBoZWFkZXIgYW5kIGdldCB0aGUgYWN0dWFsIHRhYmxlIGxlbmd0aC4gVGhlIHJlZ2lvbgorCQkgKiBsZW5ndGggaXMgbm90IGd1YXJhbnRlZWQgdG8gYmUgdGhlIHNhbWUgYXMgdGhlIHRhYmxlIGxlbmd0aC4KKwkJICovCisJCXRhYmxlID0gYWNwaV9vc19tYXBfbWVtb3J5KG9ial9kZXNjLT5yZWdpb24uYWRkcmVzcywKKwkJCQkJICAgc2l6ZW9mKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlcikpOworCQlpZiAoIXRhYmxlKSB7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9fTUVNT1JZKTsKKwkJfQorCisJCWxlbmd0aCA9IHRhYmxlLT5sZW5ndGg7CisJCWFjcGlfb3NfdW5tYXBfbWVtb3J5KHRhYmxlLCBzaXplb2Yoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyKSk7CisKKwkJLyogTXVzdCBoYXZlIGF0IGxlYXN0IGFuIEFDUEkgdGFibGUgaGVhZGVyICovCisKKwkJaWYgKGxlbmd0aCA8IHNpemVvZihzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIpKSB7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfSU5WQUxJRF9UQUJMRV9MRU5HVEgpOworCQl9CisKKwkJLyoKKwkJICogVGhlIG1lbW9yeSByZWdpb24gaXMgbm90IGd1YXJhbnRlZWQgdG8gcmVtYWluIHN0YWJsZSBhbmQgd2UgbXVzdAorCQkgKiBjb3B5IHRoZSB0YWJsZSB0byBhIGxvY2FsIGJ1ZmZlci4gRm9yIGV4YW1wbGUsIHRoZSBtZW1vcnkgcmVnaW9uCisJCSAqIGlzIGNvcnJ1cHRlZCBhZnRlciBzdXNwZW5kIG9uIHNvbWUgbWFjaGluZXMuIER5bmFtaWNhbGx5IGxvYWRlZAorCQkgKiB0YWJsZXMgYXJlIHVzdWFsbHkgc21hbGwsIHNvIHRoaXMgb3ZlcmhlYWQgaXMgbWluaW1hbC4KKwkJICovCisKKwkJLyogQWxsb2NhdGUgYSBidWZmZXIgZm9yIHRoZSB0YWJsZSAqLworCisJCXRhYmxlX2Rlc2MucG9pbnRlciA9IEFDUElfQUxMT0NBVEUobGVuZ3RoKTsKKwkJaWYgKCF0YWJsZV9kZXNjLnBvaW50ZXIpIHsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT19NRU1PUlkpOworCQl9CisKKwkJLyogTWFwIHRoZSBlbnRpcmUgdGFibGUgYW5kIGNvcHkgaXQgKi8KKworCQl0YWJsZSA9IGFjcGlfb3NfbWFwX21lbW9yeShvYmpfZGVzYy0+cmVnaW9uLmFkZHJlc3MsIGxlbmd0aCk7CisJCWlmICghdGFibGUpIHsKKwkJCUFDUElfRlJFRSh0YWJsZV9kZXNjLnBvaW50ZXIpOworCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX01FTU9SWSk7CisJCX0KKworCQlBQ1BJX01FTUNQWSh0YWJsZV9kZXNjLnBvaW50ZXIsIHRhYmxlLCBsZW5ndGgpOworCQlhY3BpX29zX3VubWFwX21lbW9yeSh0YWJsZSwgbGVuZ3RoKTsKKworCQl0YWJsZV9kZXNjLmFkZHJlc3MgPSBvYmpfZGVzYy0+cmVnaW9uLmFkZHJlc3M7CisJCWJyZWFrOworCisJY2FzZSBBQ1BJX1RZUEVfQlVGRkVSOgkvKiBCdWZmZXIgb3IgcmVzb2x2ZWQgcmVnaW9uX2ZpZWxkICovCisKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FWEVDLAorCQkJCSAgIkxvYWQgdGFibGUgZnJvbSBCdWZmZXIgb3IgRmllbGQgJXBcbiIsCisJCQkJICBvYmpfZGVzYykpOworCisJCS8qIE11c3QgaGF2ZSBhdCBsZWFzdCBhbiBBQ1BJIHRhYmxlIGhlYWRlciAqLworCisJCWlmIChvYmpfZGVzYy0+YnVmZmVyLmxlbmd0aCA8IHNpemVvZihzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIpKSB7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfSU5WQUxJRF9UQUJMRV9MRU5HVEgpOworCQl9CisKKwkJLyogR2V0IHRoZSBhY3R1YWwgdGFibGUgbGVuZ3RoIGZyb20gdGhlIHRhYmxlIGhlYWRlciAqLworCisJCXRhYmxlID0KKwkJICAgIEFDUElfQ0FTVF9QVFIoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyLAorCQkJCSAgb2JqX2Rlc2MtPmJ1ZmZlci5wb2ludGVyKTsKKwkJbGVuZ3RoID0gdGFibGUtPmxlbmd0aDsKKworCQkvKiBUYWJsZSBjYW5ub3QgZXh0ZW5kIGJleW9uZCB0aGUgYnVmZmVyICovCisKKwkJaWYgKGxlbmd0aCA+IG9ial9kZXNjLT5idWZmZXIubGVuZ3RoKSB7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX0JVRkZFUl9MSU1JVCk7CisJCX0KKwkJaWYgKGxlbmd0aCA8IHNpemVvZihzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIpKSB7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfSU5WQUxJRF9UQUJMRV9MRU5HVEgpOworCQl9CisKKwkJLyoKKwkJICogQ29weSB0aGUgdGFibGUgZnJvbSB0aGUgYnVmZmVyIGJlY2F1c2UgdGhlIGJ1ZmZlciBjb3VsZCBiZSBtb2RpZmllZAorCQkgKiBvciBldmVuIGRlbGV0ZWQgaW4gdGhlIGZ1dHVyZQorCQkgKi8KKwkJdGFibGVfZGVzYy5wb2ludGVyID0gQUNQSV9BTExPQ0FURShsZW5ndGgpOworCQlpZiAoIXRhYmxlX2Rlc2MucG9pbnRlcikgeworCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX01FTU9SWSk7CisJCX0KKworCQlBQ1BJX01FTUNQWSh0YWJsZV9kZXNjLnBvaW50ZXIsIHRhYmxlLCBsZW5ndGgpOworCQl0YWJsZV9kZXNjLmFkZHJlc3MgPSBBQ1BJX1RPX0lOVEVHRVIodGFibGVfZGVzYy5wb2ludGVyKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX09QRVJBTkRfVFlQRSk7CisJfQorCisJLyogVmFsaWRhdGUgdGFibGUgY2hlY2tzdW0gKHdpbGwgbm90IGdldCB2YWxpZGF0ZWQgaW4gdGJfYWRkX3RhYmxlKSAqLworCisJc3RhdHVzID0gYWNwaV90Yl92ZXJpZnlfY2hlY2tzdW0odGFibGVfZGVzYy5wb2ludGVyLCBsZW5ndGgpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlBQ1BJX0ZSRUUodGFibGVfZGVzYy5wb2ludGVyKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CisJfQorCisJLyogQ29tcGxldGUgdGhlIHRhYmxlIGRlc2NyaXB0b3IgKi8KKworCXRhYmxlX2Rlc2MubGVuZ3RoID0gbGVuZ3RoOworCXRhYmxlX2Rlc2MuZmxhZ3MgPSBBQ1BJX1RBQkxFX09SSUdJTl9BTExPQ0FURUQ7CisKKwkvKiBJbnN0YWxsIHRoZSBuZXcgdGFibGUgaW50byB0aGUgbG9jYWwgZGF0YSBzdHJ1Y3R1cmVzICovCisKKwlzdGF0dXMgPSBhY3BpX3RiX2FkZF90YWJsZSgmdGFibGVfZGVzYywgJnRhYmxlX2luZGV4KTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJZ290byBjbGVhbnVwOworCX0KKworCS8qCisJICogQWRkIHRoZSB0YWJsZSB0byB0aGUgbmFtZXNwYWNlLgorCSAqCisJICogTm90ZTogTG9hZCB0aGUgdGFibGUgb2JqZWN0cyByZWxhdGl2ZSB0byB0aGUgcm9vdCBvZiB0aGUgbmFtZXNwYWNlLgorCSAqIFRoaXMgYXBwZWFycyB0byBnbyBhZ2FpbnN0IHRoZSBBQ1BJIHNwZWNpZmljYXRpb24sIGJ1dCB3ZSBkbyBpdCBmb3IKKwkgKiBjb21wYXRpYmlsaXR5IHdpdGggb3RoZXIgQUNQSSBpbXBsZW1lbnRhdGlvbnMuCisJICovCisJc3RhdHVzID0KKwkgICAgYWNwaV9leF9hZGRfdGFibGUodGFibGVfaW5kZXgsIGFjcGlfZ2JsX3Jvb3Rfbm9kZSwgJmRkYl9oYW5kbGUpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCisJCS8qIE9uIGVycm9yLCB0YWJsZV9wdHIgd2FzIGRlYWxsb2NhdGVkIGFib3ZlICovCisKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CisJfQorCisJLyogU3RvcmUgdGhlIGRkYl9oYW5kbGUgaW50byB0aGUgVGFyZ2V0IG9wZXJhbmQgKi8KKworCXN0YXR1cyA9IGFjcGlfZXhfc3RvcmUoZGRiX2hhbmRsZSwgdGFyZ2V0LCB3YWxrX3N0YXRlKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJKHZvaWQpYWNwaV9leF91bmxvYWRfdGFibGUoZGRiX2hhbmRsZSk7CisKKwkJLyogdGFibGVfcHRyIHdhcyBkZWFsbG9jYXRlZCBhYm92ZSAqLworCisJCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZShkZGJfaGFuZGxlKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CisJfQorCisJLyogSW52b2tlIHRhYmxlIGhhbmRsZXIgaWYgcHJlc2VudCAqLworCisJaWYgKGFjcGlfZ2JsX3RhYmxlX2hhbmRsZXIpIHsKKwkJKHZvaWQpYWNwaV9nYmxfdGFibGVfaGFuZGxlcihBQ1BJX1RBQkxFX0VWRU5UX0xPQUQsCisJCQkJCSAgICAgdGFibGVfZGVzYy5wb2ludGVyLAorCQkJCQkgICAgIGFjcGlfZ2JsX3RhYmxlX2hhbmRsZXJfY29udGV4dCk7CisJfQorCisgICAgICBjbGVhbnVwOgorCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCisJCS8qIERlbGV0ZSBhbGxvY2F0ZWQgdGFibGUgYnVmZmVyICovCisKKwkJYWNwaV90Yl9kZWxldGVfdGFibGUoJnRhYmxlX2Rlc2MpOworCX0KKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9leF91bmxvYWRfdGFibGUKKyAqCisgKiBQQVJBTUVURVJTOiAgZGRiX2hhbmRsZSAgICAgICAgICAtIEhhbmRsZSB0byBhIHByZXZpb3VzbHkgbG9hZGVkIHRhYmxlCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBVbmxvYWQgYW4gQUNQSSB0YWJsZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2FjcGlfc3RhdHVzIGFjcGlfZXhfdW5sb2FkX3RhYmxlKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKmRkYl9oYW5kbGUpCit7CisJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqdGFibGVfZGVzYyA9IGRkYl9oYW5kbGU7CisJdTMyIHRhYmxlX2luZGV4OworCXN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqdGFibGU7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGV4X3VubG9hZF90YWJsZSk7CisKKwkvKgorCSAqIFZhbGlkYXRlIHRoZSBoYW5kbGUKKwkgKiBBbHRob3VnaCB0aGUgaGFuZGxlIGlzIHBhcnRpYWxseSB2YWxpZGF0ZWQgaW4gYWNwaV9leF9yZWNvbmZpZ3VyYXRpb24oKSwKKwkgKiB3aGVuIGl0IGNhbGxzIGFjcGlfZXhfcmVzb2x2ZV9vcGVyYW5kcygpLCB0aGUgaGFuZGxlIGlzIG1vcmUgY29tcGxldGVseQorCSAqIHZhbGlkYXRlZCBoZXJlLgorCSAqLworCWlmICgoIWRkYl9oYW5kbGUpIHx8CisJICAgIChBQ1BJX0dFVF9ERVNDUklQVE9SX1RZUEUoZGRiX2hhbmRsZSkgIT0gQUNQSV9ERVNDX1RZUEVfT1BFUkFORCkgfHwKKwkgICAgKEFDUElfR0VUX09CSkVDVF9UWVBFKGRkYl9oYW5kbGUpICE9IEFDUElfVFlQRV9MT0NBTF9SRUZFUkVOQ0UpKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfUEFSQU1FVEVSKTsKKwl9CisKKwkvKiBHZXQgdGhlIHRhYmxlIGluZGV4IGZyb20gdGhlIGRkYl9oYW5kbGUgKi8KKworCXRhYmxlX2luZGV4ID0gdGFibGVfZGVzYy0+cmVmZXJlbmNlLnZhbHVlOworCisJLyogSW52b2tlIHRhYmxlIGhhbmRsZXIgaWYgcHJlc2VudCAqLworCisJaWYgKGFjcGlfZ2JsX3RhYmxlX2hhbmRsZXIpIHsKKwkJc3RhdHVzID0gYWNwaV9nZXRfdGFibGVfYnlfaW5kZXgodGFibGVfaW5kZXgsICZ0YWJsZSk7CisJCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkgeworCQkJKHZvaWQpYWNwaV9nYmxfdGFibGVfaGFuZGxlcihBQ1BJX1RBQkxFX0VWRU5UX1VOTE9BRCwKKwkJCQkJCSAgICAgdGFibGUsCisJCQkJCQkgICAgIGFjcGlfZ2JsX3RhYmxlX2hhbmRsZXJfY29udGV4dCk7CisJCX0KKwl9CisKKwkvKgorCSAqIERlbGV0ZSB0aGUgZW50aXJlIG5hbWVzcGFjZSB1bmRlciB0aGlzIHRhYmxlIE5vZGUKKwkgKiAoT2Zmc2V0IGNvbnRhaW5zIHRoZSB0YWJsZV9pZCkKKwkgKi8KKwlhY3BpX3RiX2RlbGV0ZV9uYW1lc3BhY2VfYnlfb3duZXIodGFibGVfaW5kZXgpOworCSh2b2lkKWFjcGlfdGJfcmVsZWFzZV9vd25lcl9pZCh0YWJsZV9pbmRleCk7CisKKwlhY3BpX3RiX3NldF90YWJsZV9sb2FkZWRfZmxhZyh0YWJsZV9pbmRleCwgRkFMU0UpOworCisJLyogVGFibGUgdW5sb2FkZWQsIHJlbW92ZSBhIHJlZmVyZW5jZSB0byB0aGUgZGRiX2hhbmRsZSBvYmplY3QgKi8KKworCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZShkZGJfaGFuZGxlKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS9leGNvbnZydC5jIGIvZHJpdmVycy9hY3BpL2FjcGljYS9leGNvbnZydC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiZTEwMTgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2V4Y29udnJ0LmMKQEAgLTAsMCArMSw2OTIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBNb2R1bGUgTmFtZTogZXhjb252cnQgLSBPYmplY3QgY29udmVyc2lvbiByb3V0aW5lcworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDgsIEludGVsIENvcnAuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCisgKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSBhdCBtaW5pbXVtIGEgZGlzY2xhaW1lcgorICogICAgc3Vic3RhbnRpYWxseSBzaW1pbGFyIHRvIHRoZSAiTk8gV0FSUkFOVFkiIGRpc2NsYWltZXIgYmVsb3cKKyAqICAgICgiRGlzY2xhaW1lciIpIGFuZCBhbnkgcmVkaXN0cmlidXRpb24gbXVzdCBiZSBjb25kaXRpb25lZCB1cG9uCisgKiAgICBpbmNsdWRpbmcgYSBzdWJzdGFudGlhbGx5IHNpbWlsYXIgRGlzY2xhaW1lciByZXF1aXJlbWVudCBmb3IgZnVydGhlcgorICogICAgYmluYXJ5IHJlZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzCisgKiAgICBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIE5PIFdBUlJBTlRZCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORworICogSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCisgKi8KKworI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgorI2luY2x1ZGUgImFjY29tbW9uLmgiCisjaW5jbHVkZSAiYWNpbnRlcnAuaCIKKyNpbmNsdWRlICJhbWxjb2RlLmgiCisKKyNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX0VYRUNVVEVSCitBQ1BJX01PRFVMRV9OQU1FKCJleGNvbnZydCIpCisKKy8qIExvY2FsIHByb3RvdHlwZXMgKi8KK3N0YXRpYyB1MzIKK2FjcGlfZXhfY29udmVydF90b19hc2NpaShhY3BpX2ludGVnZXIgaW50ZWdlciwKKwkJCSB1MTYgYmFzZSwgdTggKiBzdHJpbmcsIHU4IG1heF9sZW5ndGgpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X2NvbnZlcnRfdG9faW50ZWdlcgorICoKKyAqIFBBUkFNRVRFUlM6ICBvYmpfZGVzYyAgICAgICAgLSBPYmplY3QgdG8gYmUgY29udmVydGVkLiBNdXN0IGJlIGFuCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWdlciwgQnVmZmVyLCBvciBTdHJpbmcKKyAqICAgICAgICAgICAgICByZXN1bHRfZGVzYyAgICAgLSBXaGVyZSB0aGUgbmV3IEludGVnZXIgb2JqZWN0IGlzIHJldHVybmVkCisgKiAgICAgICAgICAgICAgRmxhZ3MgICAgICAgICAgIC0gVXNlZCBmb3Igc3RyaW5nIGNvbnZlcnNpb24KKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IENvbnZlcnQgYW4gQUNQSSBPYmplY3QgdG8gYW4gaW50ZWdlci4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCithY3BpX3N0YXR1cworYWNwaV9leF9jb252ZXJ0X3RvX2ludGVnZXIodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2MsCisJCQkgICB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICoqcmVzdWx0X2Rlc2MsIHUzMiBmbGFncykKK3sKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpyZXR1cm5fZGVzYzsKKwl1OCAqcG9pbnRlcjsKKwlhY3BpX2ludGVnZXIgcmVzdWx0OworCXUzMiBpOworCXUzMiBjb3VudDsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUihleF9jb252ZXJ0X3RvX2ludGVnZXIsIG9ial9kZXNjKTsKKworCXN3aXRjaCAoQUNQSV9HRVRfT0JKRUNUX1RZUEUob2JqX2Rlc2MpKSB7CisJY2FzZSBBQ1BJX1RZUEVfSU5URUdFUjoKKworCQkvKiBObyBjb252ZXJzaW9uIG5lY2Vzc2FyeSAqLworCisJCSpyZXN1bHRfZGVzYyA9IG9ial9kZXNjOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOworCisJY2FzZSBBQ1BJX1RZUEVfQlVGRkVSOgorCWNhc2UgQUNQSV9UWVBFX1NUUklORzoKKworCQkvKiBOb3RlOiBUYWtlcyBhZHZhbnRhZ2Ugb2YgY29tbW9uIGJ1ZmZlci9zdHJpbmcgZmllbGRzICovCisKKwkJcG9pbnRlciA9IG9ial9kZXNjLT5idWZmZXIucG9pbnRlcjsKKwkJY291bnQgPSBvYmpfZGVzYy0+YnVmZmVyLmxlbmd0aDsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfVFlQRSk7CisJfQorCisJLyoKKwkgKiBDb252ZXJ0IHRoZSBidWZmZXIvc3RyaW5nIHRvIGFuIGludGVnZXIuIE5vdGUgdGhhdCBib3RoIGJ1ZmZlcnMgYW5kCisJICogc3RyaW5ncyBhcmUgdHJlYXRlZCBhcyByYXcgZGF0YSAtIHdlIGRvbid0IGNvbnZlcnQgYXNjaWkgdG8gaGV4IGZvcgorCSAqIHN0cmluZ3MuCisJICoKKwkgKiBUaGVyZSBhcmUgdHdvIHRlcm1pbmF0aW5nIGNvbmRpdGlvbnMgZm9yIHRoZSBsb29wOgorCSAqIDEpIFRoZSBzaXplIG9mIGFuIGludGVnZXIgaGFzIGJlZW4gcmVhY2hlZCwgb3IKKwkgKiAyKSBUaGUgZW5kIG9mIHRoZSBidWZmZXIgb3Igc3RyaW5nIGhhcyBiZWVuIHJlYWNoZWQKKwkgKi8KKwlyZXN1bHQgPSAwOworCisJLyogU3RyaW5nIGNvbnZlcnNpb24gaXMgZGlmZmVyZW50IHRoYW4gQnVmZmVyIGNvbnZlcnNpb24gKi8KKworCXN3aXRjaCAoQUNQSV9HRVRfT0JKRUNUX1RZUEUob2JqX2Rlc2MpKSB7CisJY2FzZSBBQ1BJX1RZUEVfU1RSSU5HOgorCisJCS8qCisJCSAqIENvbnZlcnQgc3RyaW5nIHRvIGFuIGludGVnZXIgLSBmb3IgbW9zdCBjYXNlcywgdGhlIHN0cmluZyBtdXN0IGJlCisJCSAqIGhleGFkZWNpbWFsIGFzIHBlciB0aGUgQUNQSSBzcGVjaWZpY2F0aW9uLiBUaGUgb25seSBleGNlcHRpb24gKGFzCisJCSAqIG9mIEFDUEkgMy4wKSBpcyB0aGF0IHRoZSB0b19pbnRlZ2VyKCkgb3BlcmF0b3IgYWxsb3dzIGJvdGggZGVjaW1hbAorCQkgKiBhbmQgaGV4YWRlY2ltYWwgc3RyaW5ncyAoaGV4IHByZWZpeGVkIHdpdGggIjB4IikuCisJCSAqLworCQlzdGF0dXMgPSBhY3BpX3V0X3N0cnRvdWw2NCgoY2hhciAqKXBvaW50ZXIsIGZsYWdzLCAmcmVzdWx0KTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgQUNQSV9UWVBFX0JVRkZFUjoKKworCQkvKiBDaGVjayBmb3IgemVyby1sZW5ndGggYnVmZmVyICovCisKKwkJaWYgKCFjb3VudCkgeworCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9CVUZGRVJfTElNSVQpOworCQl9CisKKwkJLyogVHJhbnNmZXIgbm8gbW9yZSB0aGFuIGFuIGludGVnZXIncyB3b3J0aCBvZiBkYXRhICovCisKKwkJaWYgKGNvdW50ID4gYWNwaV9nYmxfaW50ZWdlcl9ieXRlX3dpZHRoKSB7CisJCQljb3VudCA9IGFjcGlfZ2JsX2ludGVnZXJfYnl0ZV93aWR0aDsKKwkJfQorCisJCS8qCisJCSAqIENvbnZlcnQgYnVmZmVyIHRvIGFuIGludGVnZXIgLSB3ZSBzaW1wbHkgZ3JhYiBlbm91Z2ggcmF3IGRhdGEKKwkJICogZnJvbSB0aGUgYnVmZmVyIHRvIGZpbGwgYW4gaW50ZWdlcgorCQkgKi8KKwkJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKwkJCS8qCisJCQkgKiBHZXQgbmV4dCBieXRlIGFuZCBzaGlmdCBpdCBpbnRvIHRoZSBSZXN1bHQuCisJCQkgKiBMaXR0bGUgZW5kaWFuIGlzIHVzZWQsIG1lYW5pbmcgdGhhdCB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUgYnVmZmVyCisJCQkgKiBpcyB0aGUgTFNCIG9mIHRoZSBpbnRlZ2VyCisJCQkgKi8KKwkJCXJlc3VsdCB8PSAoKChhY3BpX2ludGVnZXIpIHBvaW50ZXJbaV0pIDw8IChpICogOCkpOworCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKworCQkvKiBObyBvdGhlciB0eXBlcyBjYW4gZ2V0IGhlcmUgKi8KKwkJYnJlYWs7CisJfQorCisJLyogQ3JlYXRlIGEgbmV3IGludGVnZXIgKi8KKworCXJldHVybl9kZXNjID0gYWNwaV91dF9jcmVhdGVfaW50ZXJuYWxfb2JqZWN0KEFDUElfVFlQRV9JTlRFR0VSKTsKKwlpZiAoIXJldHVybl9kZXNjKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT19NRU1PUlkpOworCX0KKworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVhFQywgIkNvbnZlcnRlZCB2YWx1ZTogJTguOFglOC44WFxuIiwKKwkJCSAgQUNQSV9GT1JNQVRfVUlOVDY0KHJlc3VsdCkpKTsKKworCS8qIFNhdmUgdGhlIFJlc3VsdCAqLworCisJcmV0dXJuX2Rlc2MtPmludGVnZXIudmFsdWUgPSByZXN1bHQ7CisJYWNwaV9leF90cnVuY2F0ZV9mb3IzMmJpdF90YWJsZShyZXR1cm5fZGVzYyk7CisJKnJlc3VsdF9kZXNjID0gcmV0dXJuX2Rlc2M7CisJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9leF9jb252ZXJ0X3RvX2J1ZmZlcgorICoKKyAqIFBBUkFNRVRFUlM6ICBvYmpfZGVzYyAgICAgICAgLSBPYmplY3QgdG8gYmUgY29udmVydGVkLiBNdXN0IGJlIGFuCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWdlciwgQnVmZmVyLCBvciBTdHJpbmcKKyAqICAgICAgICAgICAgICByZXN1bHRfZGVzYyAgICAgLSBXaGVyZSB0aGUgbmV3IGJ1ZmZlciBvYmplY3QgaXMgcmV0dXJuZWQKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IENvbnZlcnQgYW4gQUNQSSBPYmplY3QgdG8gYSBCdWZmZXIKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCithY3BpX3N0YXR1cworYWNwaV9leF9jb252ZXJ0X3RvX2J1ZmZlcih1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYywKKwkJCSAgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKnJlc3VsdF9kZXNjKQoreworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnJldHVybl9kZXNjOworCXU4ICpuZXdfYnVmOworCisJQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIoZXhfY29udmVydF90b19idWZmZXIsIG9ial9kZXNjKTsKKworCXN3aXRjaCAoQUNQSV9HRVRfT0JKRUNUX1RZUEUob2JqX2Rlc2MpKSB7CisJY2FzZSBBQ1BJX1RZUEVfQlVGRkVSOgorCisJCS8qIE5vIGNvbnZlcnNpb24gbmVjZXNzYXJ5ICovCisKKwkJKnJlc3VsdF9kZXNjID0gb2JqX2Rlc2M7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CisKKwljYXNlIEFDUElfVFlQRV9JTlRFR0VSOgorCisJCS8qCisJCSAqIENyZWF0ZSBhIG5ldyBCdWZmZXIgb2JqZWN0LgorCQkgKiBOZWVkIGVub3VnaCBzcGFjZSBmb3Igb25lIGludGVnZXIKKwkJICovCisJCXJldHVybl9kZXNjID0KKwkJICAgIGFjcGlfdXRfY3JlYXRlX2J1ZmZlcl9vYmplY3QoYWNwaV9nYmxfaW50ZWdlcl9ieXRlX3dpZHRoKTsKKwkJaWYgKCFyZXR1cm5fZGVzYykgeworCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX01FTU9SWSk7CisJCX0KKworCQkvKiBDb3B5IHRoZSBpbnRlZ2VyIHRvIHRoZSBidWZmZXIsIExTQiBmaXJzdCAqLworCisJCW5ld19idWYgPSByZXR1cm5fZGVzYy0+YnVmZmVyLnBvaW50ZXI7CisJCUFDUElfTUVNQ1BZKG5ld19idWYsCisJCQkgICAgJm9ial9kZXNjLT5pbnRlZ2VyLnZhbHVlLAorCQkJICAgIGFjcGlfZ2JsX2ludGVnZXJfYnl0ZV93aWR0aCk7CisJCWJyZWFrOworCisJY2FzZSBBQ1BJX1RZUEVfU1RSSU5HOgorCisJCS8qCisJCSAqIENyZWF0ZSBhIG5ldyBCdWZmZXIgb2JqZWN0CisJCSAqIFNpemUgd2lsbCBiZSB0aGUgc3RyaW5nIGxlbmd0aAorCQkgKgorCQkgKiBOT1RFOiBBZGQgb25lIHRvIHRoZSBzdHJpbmcgbGVuZ3RoIHRvIGluY2x1ZGUgdGhlIG51bGwgdGVybWluYXRvci4KKwkJICogVGhlIEFDUEkgc3BlYyBpcyB1bmNsZWFyIG9uIHRoaXMgc3ViamVjdCwgYnV0IHRoZXJlIGlzIGV4aXN0aW5nCisJCSAqIEFTTC9BTUwgY29kZSB0aGF0IGRlcGVuZHMgb24gdGhlIG51bGwgYmVpbmcgdHJhbnNmZXJyZWQgdG8gdGhlIG5ldworCQkgKiBidWZmZXIuCisJCSAqLworCQlyZXR1cm5fZGVzYyA9IGFjcGlfdXRfY3JlYXRlX2J1ZmZlcl9vYmplY3QoKGFjcGlfc2l6ZSkKKwkJCQkJCQkgICBvYmpfZGVzYy0+c3RyaW5nLgorCQkJCQkJCSAgIGxlbmd0aCArIDEpOworCQlpZiAoIXJldHVybl9kZXNjKSB7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9fTUVNT1JZKTsKKwkJfQorCisJCS8qIENvcHkgdGhlIHN0cmluZyB0byB0aGUgYnVmZmVyICovCisKKwkJbmV3X2J1ZiA9IHJldHVybl9kZXNjLT5idWZmZXIucG9pbnRlcjsKKwkJQUNQSV9TVFJOQ1BZKChjaGFyICopbmV3X2J1ZiwgKGNoYXIgKilvYmpfZGVzYy0+c3RyaW5nLnBvaW50ZXIsCisJCQkgICAgIG9ial9kZXNjLT5zdHJpbmcubGVuZ3RoKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfVFlQRSk7CisJfQorCisJLyogTWFyayBidWZmZXIgaW5pdGlhbGl6ZWQgKi8KKworCXJldHVybl9kZXNjLT5jb21tb24uZmxhZ3MgfD0gQU9QT0JKX0RBVEFfVkFMSUQ7CisJKnJlc3VsdF9kZXNjID0gcmV0dXJuX2Rlc2M7CisJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9leF9jb252ZXJ0X3RvX2FzY2lpCisgKgorICogUEFSQU1FVEVSUzogIEludGVnZXIgICAgICAgICAtIFZhbHVlIHRvIGJlIGNvbnZlcnRlZAorICogICAgICAgICAgICAgIEJhc2UgICAgICAgICAgICAtIEFDUElfU1RSSU5HX0RFQ0lNQUwgb3IgQUNQSV9TVFJJTkdfSEVYCisgKiAgICAgICAgICAgICAgU3RyaW5nICAgICAgICAgIC0gV2hlcmUgdGhlIHN0cmluZyBpcyByZXR1cm5lZAorICogICAgICAgICAgICAgIGRhdGFfd2lkdGggICAgICAtIFNpemUgb2YgZGF0YSBpdGVtIHRvIGJlIGNvbnZlcnRlZCwgaW4gYnl0ZXMKKyAqCisgKiBSRVRVUk46ICAgICAgQWN0dWFsIHN0cmluZyBsZW5ndGgKKyAqCisgKiBERVNDUklQVElPTjogQ29udmVydCBhbiBBQ1BJIEludGVnZXIgdG8gYSBoZXggb3IgZGVjaW1hbCBzdHJpbmcKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdTMyCithY3BpX2V4X2NvbnZlcnRfdG9fYXNjaWkoYWNwaV9pbnRlZ2VyIGludGVnZXIsCisJCQkgdTE2IGJhc2UsIHU4ICogc3RyaW5nLCB1OCBkYXRhX3dpZHRoKQoreworCWFjcGlfaW50ZWdlciBkaWdpdDsKKwl1MzIgaTsKKwl1MzIgajsKKwl1MzIgayA9IDA7CisJdTMyIGhleF9sZW5ndGg7CisJdTMyIGRlY2ltYWxfbGVuZ3RoOworCXUzMiByZW1haW5kZXI7CisJdTggc3VwcmVzc196ZXJvczsKKworCUFDUElfRlVOQ1RJT05fRU5UUlkoKTsKKworCXN3aXRjaCAoYmFzZSkgeworCWNhc2UgMTA6CisKKwkJLyogU2V0dXAgbWF4IGxlbmd0aCBmb3IgdGhlIGRlY2ltYWwgbnVtYmVyICovCisKKwkJc3dpdGNoIChkYXRhX3dpZHRoKSB7CisJCWNhc2UgMToKKwkJCWRlY2ltYWxfbGVuZ3RoID0gQUNQSV9NQVg4X0RFQ0lNQUxfRElHSVRTOworCQkJYnJlYWs7CisKKwkJY2FzZSA0OgorCQkJZGVjaW1hbF9sZW5ndGggPSBBQ1BJX01BWDMyX0RFQ0lNQUxfRElHSVRTOworCQkJYnJlYWs7CisKKwkJY2FzZSA4OgorCQlkZWZhdWx0OgorCQkJZGVjaW1hbF9sZW5ndGggPSBBQ1BJX01BWDY0X0RFQ0lNQUxfRElHSVRTOworCQkJYnJlYWs7CisJCX0KKworCQlzdXByZXNzX3plcm9zID0gVFJVRTsJLyogTm8gbGVhZGluZyB6ZXJvcyAqLworCQlyZW1haW5kZXIgPSAwOworCisJCWZvciAoaSA9IGRlY2ltYWxfbGVuZ3RoOyBpID4gMDsgaS0tKSB7CisKKwkJCS8qIERpdmlkZSBieSBudGggZmFjdG9yIG9mIDEwICovCisKKwkJCWRpZ2l0ID0gaW50ZWdlcjsKKwkJCWZvciAoaiA9IDA7IGogPCBpOyBqKyspIHsKKwkJCQkodm9pZClhY3BpX3V0X3Nob3J0X2RpdmlkZShkaWdpdCwgMTAsICZkaWdpdCwKKwkJCQkJCQkgICAmcmVtYWluZGVyKTsKKwkJCX0KKworCQkJLyogSGFuZGxlIGxlYWRpbmcgemVyb3MgKi8KKworCQkJaWYgKHJlbWFpbmRlciAhPSAwKSB7CisJCQkJc3VwcmVzc196ZXJvcyA9IEZBTFNFOworCQkJfQorCisJCQlpZiAoIXN1cHJlc3NfemVyb3MpIHsKKwkJCQlzdHJpbmdba10gPSAodTgpIChBQ1BJX0FTQ0lJX1pFUk8gKyByZW1haW5kZXIpOworCQkJCWsrKzsKKwkJCX0KKwkJfQorCQlicmVhazsKKworCWNhc2UgMTY6CisKKwkJLyogaGV4X2xlbmd0aDogMiBhc2NpaSBoZXggY2hhcnMgcGVyIGRhdGEgYnl0ZSAqLworCisJCWhleF9sZW5ndGggPSBBQ1BJX01VTF8yKGRhdGFfd2lkdGgpOworCQlmb3IgKGkgPSAwLCBqID0gKGhleF9sZW5ndGggLSAxKTsgaSA8IGhleF9sZW5ndGg7IGkrKywgai0tKSB7CisKKwkJCS8qIEdldCBvbmUgaGV4IGRpZ2l0LCBtb3N0IHNpZ25pZmljYW50IGRpZ2l0cyBmaXJzdCAqLworCisJCQlzdHJpbmdba10gPQorCQkJICAgICh1OCkgYWNwaV91dF9oZXhfdG9fYXNjaWlfY2hhcihpbnRlZ2VyLAorCQkJCQkJCSAgIEFDUElfTVVMXzQoaikpOworCQkJaysrOworCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0dXJuICgwKTsKKwl9CisKKwkvKgorCSAqIFNpbmNlIGxlYWRpbmcgemVyb3MgYXJlIHN1cHByZXNzZWQsIHdlIG11c3QgY2hlY2sgZm9yIHRoZSBjYXNlIHdoZXJlCisJICogdGhlIGludGVnZXIgZXF1YWxzIDAKKwkgKgorCSAqIEZpbmFsbHksIG51bGwgdGVybWluYXRlIHRoZSBzdHJpbmcgYW5kIHJldHVybiB0aGUgbGVuZ3RoCisJICovCisJaWYgKCFrKSB7CisJCXN0cmluZ1swXSA9IEFDUElfQVNDSUlfWkVSTzsKKwkJayA9IDE7CisJfQorCisJc3RyaW5nW2tdID0gMDsKKwlyZXR1cm4gKCh1MzIpIGspOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X2NvbnZlcnRfdG9fc3RyaW5nCisgKgorICogUEFSQU1FVEVSUzogIG9ial9kZXNjICAgICAgICAtIE9iamVjdCB0byBiZSBjb252ZXJ0ZWQuIE11c3QgYmUgYW4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLCBCdWZmZXIsIG9yIFN0cmluZworICogICAgICAgICAgICAgIHJlc3VsdF9kZXNjICAgICAtIFdoZXJlIHRoZSBzdHJpbmcgb2JqZWN0IGlzIHJldHVybmVkCisgKiAgICAgICAgICAgICAgVHlwZSAgICAgICAgICAgIC0gU3RyaW5nIGZsYWdzIChiYXNlIGFuZCBjb252ZXJzaW9uIHR5cGUpCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBDb252ZXJ0IGFuIEFDUEkgT2JqZWN0IHRvIGEgc3RyaW5nCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworYWNwaV9zdGF0dXMKK2FjcGlfZXhfY29udmVydF90b19zdHJpbmcodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqIG9ial9kZXNjLAorCQkJICB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICoqIHJlc3VsdF9kZXNjLCB1MzIgdHlwZSkKK3sKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpyZXR1cm5fZGVzYzsKKwl1OCAqbmV3X2J1ZjsKKwl1MzIgaTsKKwl1MzIgc3RyaW5nX2xlbmd0aCA9IDA7CisJdTE2IGJhc2UgPSAxNjsKKwl1OCBzZXBhcmF0b3IgPSAnLCc7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUihleF9jb252ZXJ0X3RvX3N0cmluZywgb2JqX2Rlc2MpOworCisJc3dpdGNoIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRShvYmpfZGVzYykpIHsKKwljYXNlIEFDUElfVFlQRV9TVFJJTkc6CisKKwkJLyogTm8gY29udmVyc2lvbiBuZWNlc3NhcnkgKi8KKworCQkqcmVzdWx0X2Rlc2MgPSBvYmpfZGVzYzsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKKworCWNhc2UgQUNQSV9UWVBFX0lOVEVHRVI6CisKKwkJc3dpdGNoICh0eXBlKSB7CisJCWNhc2UgQUNQSV9FWFBMSUNJVF9DT05WRVJUX0RFQ0lNQUw6CisKKwkJCS8qIE1ha2Ugcm9vbSBmb3IgbWF4aW11bSBkZWNpbWFsIG51bWJlciAqLworCisJCQlzdHJpbmdfbGVuZ3RoID0gQUNQSV9NQVhfREVDSU1BTF9ESUdJVFM7CisJCQliYXNlID0gMTA7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCisJCQkvKiBUd28gaGV4IHN0cmluZyBjaGFyYWN0ZXJzIGZvciBlYWNoIGludGVnZXIgYnl0ZSAqLworCisJCQlzdHJpbmdfbGVuZ3RoID0gQUNQSV9NVUxfMihhY3BpX2dibF9pbnRlZ2VyX2J5dGVfd2lkdGgpOworCQkJYnJlYWs7CisJCX0KKworCQkvKgorCQkgKiBDcmVhdGUgYSBuZXcgU3RyaW5nCisJCSAqIE5lZWQgZW5vdWdoIHNwYWNlIGZvciBvbmUgQVNDSUkgaW50ZWdlciAocGx1cyBudWxsIHRlcm1pbmF0b3IpCisJCSAqLworCQlyZXR1cm5fZGVzYyA9CisJCSAgICBhY3BpX3V0X2NyZWF0ZV9zdHJpbmdfb2JqZWN0KChhY3BpX3NpemUpIHN0cmluZ19sZW5ndGgpOworCQlpZiAoIXJldHVybl9kZXNjKSB7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9fTUVNT1JZKTsKKwkJfQorCisJCW5ld19idWYgPSByZXR1cm5fZGVzYy0+YnVmZmVyLnBvaW50ZXI7CisKKwkJLyogQ29udmVydCBpbnRlZ2VyIHRvIHN0cmluZyAqLworCisJCXN0cmluZ19sZW5ndGggPQorCQkgICAgYWNwaV9leF9jb252ZXJ0X3RvX2FzY2lpKG9ial9kZXNjLT5pbnRlZ2VyLnZhbHVlLCBiYXNlLAorCQkJCQkgICAgIG5ld19idWYsCisJCQkJCSAgICAgYWNwaV9nYmxfaW50ZWdlcl9ieXRlX3dpZHRoKTsKKworCQkvKiBOdWxsIHRlcm1pbmF0ZSBhdCB0aGUgY29ycmVjdCBwbGFjZSAqLworCisJCXJldHVybl9kZXNjLT5zdHJpbmcubGVuZ3RoID0gc3RyaW5nX2xlbmd0aDsKKwkJbmV3X2J1ZltzdHJpbmdfbGVuZ3RoXSA9IDA7CisJCWJyZWFrOworCisJY2FzZSBBQ1BJX1RZUEVfQlVGRkVSOgorCisJCS8qIFNldHVwIHN0cmluZyBsZW5ndGgsIGJhc2UsIGFuZCBzZXBhcmF0b3IgKi8KKworCQlzd2l0Y2ggKHR5cGUpIHsKKwkJY2FzZSBBQ1BJX0VYUExJQ0lUX0NPTlZFUlRfREVDSU1BTDoJLyogVXNlZCBieSB0b19kZWNpbWFsX3N0cmluZyAqLworCQkJLyoKKwkJCSAqIEZyb20gQUNQSTogIklmIERhdGEgaXMgYSBidWZmZXIsIGl0IGlzIGNvbnZlcnRlZCB0byBhIHN0cmluZyBvZgorCQkJICogZGVjaW1hbCB2YWx1ZXMgc2VwYXJhdGVkIGJ5IGNvbW1hcy4iCisJCQkgKi8KKwkJCWJhc2UgPSAxMDsKKworCQkJLyoKKwkJCSAqIENhbGN1bGF0ZSB0aGUgZmluYWwgc3RyaW5nIGxlbmd0aC4gSW5kaXZpZHVhbCBzdHJpbmcgdmFsdWVzCisJCQkgKiBhcmUgdmFyaWFibGUgbGVuZ3RoIChpbmNsdWRlIHNlcGFyYXRvciBmb3IgZWFjaCkKKwkJCSAqLworCQkJZm9yIChpID0gMDsgaSA8IG9ial9kZXNjLT5idWZmZXIubGVuZ3RoOyBpKyspIHsKKwkJCQlpZiAob2JqX2Rlc2MtPmJ1ZmZlci5wb2ludGVyW2ldID49IDEwMCkgeworCQkJCQlzdHJpbmdfbGVuZ3RoICs9IDQ7CisJCQkJfSBlbHNlIGlmIChvYmpfZGVzYy0+YnVmZmVyLnBvaW50ZXJbaV0gPj0gMTApIHsKKwkJCQkJc3RyaW5nX2xlbmd0aCArPSAzOworCQkJCX0gZWxzZSB7CisJCQkJCXN0cmluZ19sZW5ndGggKz0gMjsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIEFDUElfSU1QTElDSVRfQ09OVkVSVF9IRVg6CisJCQkvKgorCQkJICogRnJvbSB0aGUgQUNQSSBzcGVjOgorCQkJICoiVGhlIGVudGlyZSBjb250ZW50cyBvZiB0aGUgYnVmZmVyIGFyZSBjb252ZXJ0ZWQgdG8gYSBzdHJpbmcgb2YKKwkJCSAqIHR3by1jaGFyYWN0ZXIgaGV4YWRlY2ltYWwgbnVtYmVycywgZWFjaCBzZXBhcmF0ZWQgYnkgYSBzcGFjZS4iCisJCQkgKi8KKwkJCXNlcGFyYXRvciA9ICcgJzsKKwkJCXN0cmluZ19sZW5ndGggPSAob2JqX2Rlc2MtPmJ1ZmZlci5sZW5ndGggKiAzKTsKKwkJCWJyZWFrOworCisJCWNhc2UgQUNQSV9FWFBMSUNJVF9DT05WRVJUX0hFWDoJLyogVXNlZCBieSB0b19oZXhfc3RyaW5nICovCisJCQkvKgorCQkJICogRnJvbSBBQ1BJOiAiSWYgRGF0YSBpcyBhIGJ1ZmZlciwgaXQgaXMgY29udmVydGVkIHRvIGEgc3RyaW5nIG9mCisJCQkgKiBoZXhhZGVjaW1hbCB2YWx1ZXMgc2VwYXJhdGVkIGJ5IGNvbW1hcy4iCisJCQkgKi8KKwkJCXN0cmluZ19sZW5ndGggPSAob2JqX2Rlc2MtPmJ1ZmZlci5sZW5ndGggKiAzKTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX1BBUkFNRVRFUik7CisJCX0KKworCQkvKgorCQkgKiBDcmVhdGUgYSBuZXcgc3RyaW5nIG9iamVjdCBhbmQgc3RyaW5nIGJ1ZmZlcgorCQkgKiAoLTEgYmVjYXVzZSBvZiBleHRyYSBzZXBhcmF0b3IgaW5jbHVkZWQgaW4gc3RyaW5nX2xlbmd0aCBmcm9tIGFib3ZlKQorCQkgKiBBbGxvdyBjcmVhdGlvbiBvZiB6ZXJvLWxlbmd0aCBzdHJpbmdzIGZyb20gemVyby1sZW5ndGggYnVmZmVycy4KKwkJICovCisJCWlmIChzdHJpbmdfbGVuZ3RoKSB7CisJCQlzdHJpbmdfbGVuZ3RoLS07CisJCX0KKworCQlyZXR1cm5fZGVzYyA9IGFjcGlfdXRfY3JlYXRlX3N0cmluZ19vYmplY3QoKGFjcGlfc2l6ZSkKKwkJCQkJCQkgICBzdHJpbmdfbGVuZ3RoKTsKKwkJaWYgKCFyZXR1cm5fZGVzYykgeworCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX01FTU9SWSk7CisJCX0KKworCQluZXdfYnVmID0gcmV0dXJuX2Rlc2MtPmJ1ZmZlci5wb2ludGVyOworCisJCS8qCisJCSAqIENvbnZlcnQgYnVmZmVyIGJ5dGVzIHRvIGhleCBvciBkZWNpbWFsIHZhbHVlcworCQkgKiAoc2VwYXJhdGVkIGJ5IGNvbW1hcyBvciBzcGFjZXMpCisJCSAqLworCQlmb3IgKGkgPSAwOyBpIDwgb2JqX2Rlc2MtPmJ1ZmZlci5sZW5ndGg7IGkrKykgeworCQkJbmV3X2J1ZiArPSBhY3BpX2V4X2NvbnZlcnRfdG9fYXNjaWkoKGFjcGlfaW50ZWdlcikKKwkJCQkJCQkgICAgb2JqX2Rlc2MtPmJ1ZmZlci4KKwkJCQkJCQkgICAgcG9pbnRlcltpXSwgYmFzZSwKKwkJCQkJCQkgICAgbmV3X2J1ZiwgMSk7CisJCQkqbmV3X2J1ZisrID0gc2VwYXJhdG9yOwkvKiBlYWNoIHNlcGFyYXRlZCBieSBhIGNvbW1hIG9yIHNwYWNlICovCisJCX0KKworCQkvKgorCQkgKiBOdWxsIHRlcm1pbmF0ZSB0aGUgc3RyaW5nCisJCSAqIChvdmVyd3JpdGVzIGZpbmFsIGNvbW1hL3NwYWNlIGZyb20gYWJvdmUpCisJCSAqLworCQlpZiAob2JqX2Rlc2MtPmJ1ZmZlci5sZW5ndGgpIHsKKwkJCW5ld19idWYtLTsKKwkJfQorCQkqbmV3X2J1ZiA9IDA7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX1RZUEUpOworCX0KKworCSpyZXN1bHRfZGVzYyA9IHJldHVybl9kZXNjOworCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfZXhfY29udmVydF90b190YXJnZXRfdHlwZQorICoKKyAqIFBBUkFNRVRFUlM6ICBkZXN0aW5hdGlvbl90eXBlICAgIC0gQ3VycmVudCB0eXBlIG9mIHRoZSBkZXN0aW5hdGlvbgorICogICAgICAgICAgICAgIHNvdXJjZV9kZXNjICAgICAgICAgLSBTb3VyY2Ugb2JqZWN0IHRvIGJlIGNvbnZlcnRlZC4KKyAqICAgICAgICAgICAgICByZXN1bHRfZGVzYyAgICAgICAgIC0gV2hlcmUgdGhlIGNvbnZlcnRlZCBvYmplY3QgaXMgcmV0dXJuZWQKKyAqICAgICAgICAgICAgICB3YWxrX3N0YXRlICAgICAgICAgIC0gQ3VycmVudCBtZXRob2Qgc3RhdGUKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IEltcGxlbWVudHMgImltcGxpY2l0IGNvbnZlcnNpb24iIHJ1bGVzIGZvciBzdG9yaW5nIGFuIG9iamVjdC4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCithY3BpX3N0YXR1cworYWNwaV9leF9jb252ZXJ0X3RvX3RhcmdldF90eXBlKGFjcGlfb2JqZWN0X3R5cGUgZGVzdGluYXRpb25fdHlwZSwKKwkJCSAgICAgICB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpzb3VyY2VfZGVzYywKKwkJCSAgICAgICB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICoqcmVzdWx0X2Rlc2MsCisJCQkgICAgICAgc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSkKK3sKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0UoZXhfY29udmVydF90b190YXJnZXRfdHlwZSk7CisKKwkvKiBEZWZhdWx0IGJlaGF2aW9yICovCisKKwkqcmVzdWx0X2Rlc2MgPSBzb3VyY2VfZGVzYzsKKworCS8qCisJICogSWYgcmVxdWlyZWQgYnkgdGhlIHRhcmdldCwKKwkgKiBwZXJmb3JtIGltcGxpY2l0IGNvbnZlcnNpb24gb24gdGhlIHNvdXJjZSBiZWZvcmUgd2Ugc3RvcmUgaXQuCisJICovCisJc3dpdGNoIChHRVRfQ1VSUkVOVF9BUkdfVFlQRSh3YWxrX3N0YXRlLT5vcF9pbmZvLT5ydW50aW1lX2FyZ3MpKSB7CisJY2FzZSBBUkdJX1NJTVBMRV9UQVJHRVQ6CisJY2FzZSBBUkdJX0ZJWEVEX1RBUkdFVDoKKwljYXNlIEFSR0lfSU5URUdFUl9SRUY6CS8qIEhhbmRsZXMgSW5jcmVtZW50LCBEZWNyZW1lbnQgY2FzZXMgKi8KKworCQlzd2l0Y2ggKGRlc3RpbmF0aW9uX3R5cGUpIHsKKwkJY2FzZSBBQ1BJX1RZUEVfTE9DQUxfUkVHSU9OX0ZJRUxEOgorCQkJLyoKKwkJCSAqIE5hbWVkIGZpZWxkIGNhbiBhbHdheXMgaGFuZGxlIGNvbnZlcnNpb25zCisJCQkgKi8KKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQkvKiBObyBjb252ZXJzaW9uIGFsbG93ZWQgZm9yIHRoZXNlIHR5cGVzICovCisKKwkJCWlmIChkZXN0aW5hdGlvbl90eXBlICE9CisJCQkgICAgQUNQSV9HRVRfT0JKRUNUX1RZUEUoc291cmNlX2Rlc2MpKSB7CisJCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLAorCQkJCQkJICAiRXhwbGljaXQgb3BlcmF0b3IsIHdpbGwgc3RvcmUgKCVzKSBvdmVyIGV4aXN0aW5nIHR5cGUgKCVzKVxuIiwKKwkJCQkJCSAgYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZQorCQkJCQkJICAoc291cmNlX2Rlc2MpLAorCQkJCQkJICBhY3BpX3V0X2dldF90eXBlX25hbWUKKwkJCQkJCSAgKGRlc3RpbmF0aW9uX3R5cGUpKSk7CisJCQkJc3RhdHVzID0gQUVfVFlQRTsKKwkJCX0KKwkJfQorCQlicmVhazsKKworCWNhc2UgQVJHSV9UQVJHRVRSRUY6CisKKwkJc3dpdGNoIChkZXN0aW5hdGlvbl90eXBlKSB7CisJCWNhc2UgQUNQSV9UWVBFX0lOVEVHRVI6CisJCWNhc2UgQUNQSV9UWVBFX0JVRkZFUl9GSUVMRDoKKwkJY2FzZSBBQ1BJX1RZUEVfTE9DQUxfQkFOS19GSUVMRDoKKwkJY2FzZSBBQ1BJX1RZUEVfTE9DQUxfSU5ERVhfRklFTEQ6CisJCQkvKgorCQkJICogVGhlc2UgdHlwZXMgcmVxdWlyZSBhbiBJbnRlZ2VyIG9wZXJhbmQuIFdlIGNhbiBjb252ZXJ0CisJCQkgKiBhIEJ1ZmZlciBvciBhIFN0cmluZyB0byBhbiBJbnRlZ2VyIGlmIG5lY2Vzc2FyeS4KKwkJCSAqLworCQkJc3RhdHVzID0KKwkJCSAgICBhY3BpX2V4X2NvbnZlcnRfdG9faW50ZWdlcihzb3VyY2VfZGVzYywgcmVzdWx0X2Rlc2MsCisJCQkJCQkgICAgICAgMTYpOworCQkJYnJlYWs7CisKKwkJY2FzZSBBQ1BJX1RZUEVfU1RSSU5HOgorCQkJLyoKKwkJCSAqIFRoZSBvcGVyYW5kIG11c3QgYmUgYSBTdHJpbmcuIFdlIGNhbiBjb252ZXJ0IGFuCisJCQkgKiBJbnRlZ2VyIG9yIEJ1ZmZlciBpZiBuZWNlc3NhcnkKKwkJCSAqLworCQkJc3RhdHVzID0KKwkJCSAgICBhY3BpX2V4X2NvbnZlcnRfdG9fc3RyaW5nKHNvdXJjZV9kZXNjLCByZXN1bHRfZGVzYywKKwkJCQkJCSAgICAgIEFDUElfSU1QTElDSVRfQ09OVkVSVF9IRVgpOworCQkJYnJlYWs7CisKKwkJY2FzZSBBQ1BJX1RZUEVfQlVGRkVSOgorCQkJLyoKKwkJCSAqIFRoZSBvcGVyYW5kIG11c3QgYmUgYSBCdWZmZXIuIFdlIGNhbiBjb252ZXJ0IGFuCisJCQkgKiBJbnRlZ2VyIG9yIFN0cmluZyBpZiBuZWNlc3NhcnkKKwkJCSAqLworCQkJc3RhdHVzID0KKwkJCSAgICBhY3BpX2V4X2NvbnZlcnRfdG9fYnVmZmVyKHNvdXJjZV9kZXNjLCByZXN1bHRfZGVzYyk7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJQUNQSV9FUlJPUigoQUVfSU5GTywKKwkJCQkgICAgIkJhZCBkZXN0aW5hdGlvbiB0eXBlIGR1cmluZyBjb252ZXJzaW9uOiAlWCIsCisJCQkJICAgIGRlc3RpbmF0aW9uX3R5cGUpKTsKKwkJCXN0YXR1cyA9IEFFX0FNTF9JTlRFUk5BTDsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCisJY2FzZSBBUkdJX1JFRkVSRU5DRToKKwkJLyoKKwkJICogY3JlYXRlX3h4eHhfZmllbGQgY2FzZXMgLSB3ZSBhcmUgc3RvcmluZyB0aGUgZmllbGQgb2JqZWN0IGludG8gdGhlIG5hbWUKKwkJICovCisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJQUNQSV9FUlJPUigoQUVfSU5GTywKKwkJCSAgICAiVW5rbm93biBUYXJnZXQgdHlwZSBJRCAweCVYIEFtbE9wY29kZSAlWCBEZXN0VHlwZSAlcyIsCisJCQkgICAgR0VUX0NVUlJFTlRfQVJHX1RZUEUod2Fsa19zdGF0ZS0+b3BfaW5mby0+CisJCQkJCQkgcnVudGltZV9hcmdzKSwKKwkJCSAgICB3YWxrX3N0YXRlLT5vcGNvZGUsCisJCQkgICAgYWNwaV91dF9nZXRfdHlwZV9uYW1lKGRlc3RpbmF0aW9uX3R5cGUpKSk7CisJCXN0YXR1cyA9IEFFX0FNTF9JTlRFUk5BTDsKKwl9CisKKwkvKgorCSAqIFNvdXJjZS10by1UYXJnZXQgY29udmVyc2lvbiBzZW1hbnRpY3M6CisJICoKKwkgKiBJZiBjb252ZXJzaW9uIHRvIHRoZSB0YXJnZXQgdHlwZSBjYW5ub3QgYmUgcGVyZm9ybWVkLCB0aGVuIHNpbXBseQorCSAqIG92ZXJ3cml0ZSB0aGUgdGFyZ2V0IHdpdGggdGhlIG5ldyBvYmplY3QgYW5kIHR5cGUuCisJICovCisJaWYgKHN0YXR1cyA9PSBBRV9UWVBFKSB7CisJCXN0YXR1cyA9IEFFX09LOworCX0KKworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS9leGNyZWF0ZS5jIGIvZHJpdmVycy9hY3BpL2FjcGljYS9leGNyZWF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1N2FkMjUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2V4Y3JlYXRlLmMKQEAgLTAsMCArMSw1MjIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBNb2R1bGUgTmFtZTogZXhjcmVhdGUgLSBOYW1lZCBvYmplY3QgY3JlYXRpb24KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA4LCBJbnRlbCBDb3JwLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAorICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgYXQgbWluaW11bSBhIGRpc2NsYWltZXIKKyAqICAgIHN1YnN0YW50aWFsbHkgc2ltaWxhciB0byB0aGUgIk5PIFdBUlJBTlRZIiBkaXNjbGFpbWVyIGJlbG93CisgKiAgICAoIkRpc2NsYWltZXIiKSBhbmQgYW55IHJlZGlzdHJpYnV0aW9uIG11c3QgYmUgY29uZGl0aW9uZWQgdXBvbgorICogICAgaW5jbHVkaW5nIGEgc3Vic3RhbnRpYWxseSBzaW1pbGFyIERpc2NsYWltZXIgcmVxdWlyZW1lbnQgZm9yIGZ1cnRoZXIKKyAqICAgIGJpbmFyeSByZWRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcworICogICAgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBOTyBXQVJSQU5UWQorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcKKyAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgorICovCisKKyNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KKyNpbmNsdWRlICJhY2NvbW1vbi5oIgorI2luY2x1ZGUgImFjaW50ZXJwLmgiCisjaW5jbHVkZSAiYW1sY29kZS5oIgorI2luY2x1ZGUgImFjbmFtZXNwLmgiCisKKyNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX0VYRUNVVEVSCitBQ1BJX01PRFVMRV9OQU1FKCJleGNyZWF0ZSIpCisjaWZuZGVmIEFDUElfTk9fTUVUSE9EX0VYRUNVVElPTgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9leF9jcmVhdGVfYWxpYXMKKyAqCisgKiBQQVJBTUVURVJTOiAgd2Fsa19zdGF0ZSAgICAgICAgICAgLSBDdXJyZW50IHN0YXRlLCBjb250YWlucyBvcGVyYW5kcworICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogQ3JlYXRlIGEgbmV3IG5hbWVkIGFsaWFzCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2FjcGlfc3RhdHVzIGFjcGlfZXhfY3JlYXRlX2FsaWFzKHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUpCit7CisJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKnRhcmdldF9ub2RlOworCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICphbGlhc19ub2RlOworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOworCisJQUNQSV9GVU5DVElPTl9UUkFDRShleF9jcmVhdGVfYWxpYXMpOworCisJLyogR2V0IHRoZSBzb3VyY2UvYWxpYXMgb3BlcmFuZHMgKGJvdGggbmFtZXNwYWNlIG5vZGVzKSAqLworCisJYWxpYXNfbm9kZSA9IChzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqKXdhbGtfc3RhdGUtPm9wZXJhbmRzWzBdOworCXRhcmdldF9ub2RlID0gKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICopd2Fsa19zdGF0ZS0+b3BlcmFuZHNbMV07CisKKwlpZiAoKHRhcmdldF9ub2RlLT50eXBlID09IEFDUElfVFlQRV9MT0NBTF9BTElBUykgfHwKKwkgICAgKHRhcmdldF9ub2RlLT50eXBlID09IEFDUElfVFlQRV9MT0NBTF9NRVRIT0RfQUxJQVMpKSB7CisJCS8qCisJCSAqIERlcmVmZXJlbmNlIGFuIGV4aXN0aW5nIGFsaWFzIHNvIHRoYXQgd2UgZG9uJ3QgY3JlYXRlIGEgY2hhaW4KKwkJICogb2YgYWxpYXNlcy4gIFdpdGggdGhpcyBjb2RlLCB3ZSBndWFyYW50ZWUgdGhhdCBhbiBhbGlhcyBpcworCQkgKiBhbHdheXMgZXhhY3RseSBvbmUgbGV2ZWwgb2YgaW5kaXJlY3Rpb24gYXdheSBmcm9tIHRoZQorCQkgKiBhY3R1YWwgYWxpYXNlZCBuYW1lLgorCQkgKi8KKwkJdGFyZ2V0X25vZGUgPQorCQkgICAgQUNQSV9DQVNUX1BUUihzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSwKKwkJCQkgIHRhcmdldF9ub2RlLT5vYmplY3QpOworCX0KKworCS8qCisJICogRm9yIG9iamVjdHMgdGhhdCBjYW4gbmV2ZXIgY2hhbmdlIChpLmUuLCB0aGUgTlMgbm9kZSB3aWxsCisJICogcGVybWFuZW50bHkgcG9pbnQgdG8gdGhlIHNhbWUgb2JqZWN0KSwgd2UgY2FuIHNpbXBseSBhdHRhY2gKKwkgKiB0aGUgb2JqZWN0IHRvIHRoZSBuZXcgTlMgbm9kZS4gIEZvciBvdGhlciBvYmplY3RzIChzdWNoIGFzCisJICogSW50ZWdlcnMsIGJ1ZmZlcnMsIGV0Yy4pLCB3ZSBoYXZlIHRvIHBvaW50IHRoZSBBbGlhcyBub2RlCisJICogdG8gdGhlIG9yaWdpbmFsIE5vZGUuCisJICovCisJc3dpdGNoICh0YXJnZXRfbm9kZS0+dHlwZSkgeworCisJCS8qIEZvciB0aGVzZSB0eXBlcywgdGhlIHN1Yi1vYmplY3QgY2FuIGNoYW5nZSBkeW5hbWljYWxseSB2aWEgYSBTdG9yZSAqLworCisJY2FzZSBBQ1BJX1RZUEVfSU5URUdFUjoKKwljYXNlIEFDUElfVFlQRV9TVFJJTkc6CisJY2FzZSBBQ1BJX1RZUEVfQlVGRkVSOgorCWNhc2UgQUNQSV9UWVBFX1BBQ0tBR0U6CisJY2FzZSBBQ1BJX1RZUEVfQlVGRkVSX0ZJRUxEOgorCisJCS8qCisJCSAqIFRoZXNlIHR5cGVzIG9wZW4gYSBuZXcgc2NvcGUsIHNvIHdlIG5lZWQgdGhlIE5TIG5vZGUgaW4gb3JkZXIgdG8gYWNjZXNzCisJCSAqIGFueSBjaGlsZHJlbi4KKwkJICovCisJY2FzZSBBQ1BJX1RZUEVfREVWSUNFOgorCWNhc2UgQUNQSV9UWVBFX1BPV0VSOgorCWNhc2UgQUNQSV9UWVBFX1BST0NFU1NPUjoKKwljYXNlIEFDUElfVFlQRV9USEVSTUFMOgorCWNhc2UgQUNQSV9UWVBFX0xPQ0FMX1NDT1BFOgorCisJCS8qCisJCSAqIFRoZSBuZXcgYWxpYXMgaGFzIHRoZSB0eXBlIEFMSUFTIGFuZCBwb2ludHMgdG8gdGhlIG9yaWdpbmFsCisJCSAqIE5TIG5vZGUsIG5vdCB0aGUgb2JqZWN0IGl0c2VsZi4KKwkJICovCisJCWFsaWFzX25vZGUtPnR5cGUgPSBBQ1BJX1RZUEVfTE9DQUxfQUxJQVM7CisJCWFsaWFzX25vZGUtPm9iamVjdCA9CisJCSAgICBBQ1BJX0NBU1RfUFRSKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QsIHRhcmdldF9ub2RlKTsKKwkJYnJlYWs7CisKKwljYXNlIEFDUElfVFlQRV9NRVRIT0Q6CisKKwkJLyoKKwkJICogQ29udHJvbCBtZXRob2QgYWxpYXNlcyBuZWVkIHRvIGJlIGRpZmZlcmVudGlhdGVkCisJCSAqLworCQlhbGlhc19ub2RlLT50eXBlID0gQUNQSV9UWVBFX0xPQ0FMX01FVEhPRF9BTElBUzsKKwkJYWxpYXNfbm9kZS0+b2JqZWN0ID0KKwkJICAgIEFDUElfQ0FTVF9QVFIodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCwgdGFyZ2V0X25vZGUpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisKKwkJLyogQXR0YWNoIHRoZSBvcmlnaW5hbCBzb3VyY2Ugb2JqZWN0IHRvIHRoZSBuZXcgQWxpYXMgTm9kZSAqLworCisJCS8qCisJCSAqIFRoZSBuZXcgYWxpYXMgYXNzdW1lcyB0aGUgdHlwZSBvZiB0aGUgdGFyZ2V0LCBhbmQgaXQgcG9pbnRzCisJCSAqIHRvIHRoZSBzYW1lIG9iamVjdC4gIFRoZSByZWZlcmVuY2UgY291bnQgb2YgdGhlIG9iamVjdCBoYXMgYW4KKwkJICogYWRkaXRpb25hbCByZWZlcmVuY2UgdG8gcHJldmVudCBkZWxldGlvbiBvdXQgZnJvbSB1bmRlciBlaXRoZXIgdGhlCisJCSAqIHRhcmdldCBub2RlIG9yIHRoZSBhbGlhcyBOb2RlCisJCSAqLworCQlzdGF0dXMgPSBhY3BpX25zX2F0dGFjaF9vYmplY3QoYWxpYXNfbm9kZSwKKwkJCQkJICAgICAgIGFjcGlfbnNfZ2V0X2F0dGFjaGVkX29iamVjdAorCQkJCQkgICAgICAgKHRhcmdldF9ub2RlKSwKKwkJCQkJICAgICAgIHRhcmdldF9ub2RlLT50eXBlKTsKKwkJYnJlYWs7CisJfQorCisJLyogU2luY2UgYm90aCBvcGVyYW5kcyBhcmUgTm9kZXMsIHdlIGRvbid0IG5lZWQgdG8gZGVsZXRlIHRoZW0gKi8KKworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X2NyZWF0ZV9ldmVudAorICoKKyAqIFBBUkFNRVRFUlM6ICB3YWxrX3N0YXRlICAgICAgICAgIC0gQ3VycmVudCBzdGF0ZQorICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogQ3JlYXRlIGEgbmV3IGV2ZW50IG9iamVjdAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2FjcGlfc3RhdHVzIGFjcGlfZXhfY3JlYXRlX2V2ZW50KHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUpCit7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjOworCisJQUNQSV9GVU5DVElPTl9UUkFDRShleF9jcmVhdGVfZXZlbnQpOworCisJb2JqX2Rlc2MgPSBhY3BpX3V0X2NyZWF0ZV9pbnRlcm5hbF9vYmplY3QoQUNQSV9UWVBFX0VWRU5UKTsKKwlpZiAoIW9ial9kZXNjKSB7CisJCXN0YXR1cyA9IEFFX05PX01FTU9SWTsKKwkJZ290byBjbGVhbnVwOworCX0KKworCS8qCisJICogQ3JlYXRlIHRoZSBhY3R1YWwgT1Mgc2VtYXBob3JlLCB3aXRoIHplcm8gaW5pdGlhbCB1bml0cyAtLSBtZWFuaW5nCisJICogdGhhdCB0aGUgZXZlbnQgaXMgY3JlYXRlZCBpbiBhbiB1bnNpZ25hbGxlZCBzdGF0ZQorCSAqLworCXN0YXR1cyA9IGFjcGlfb3NfY3JlYXRlX3NlbWFwaG9yZShBQ1BJX05PX1VOSVRfTElNSVQsIDAsCisJCQkJCSAgJm9ial9kZXNjLT5ldmVudC5vc19zZW1hcGhvcmUpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlnb3RvIGNsZWFudXA7CisJfQorCisJLyogQXR0YWNoIG9iamVjdCB0byB0aGUgTm9kZSAqLworCisJc3RhdHVzID0KKwkgICAgYWNwaV9uc19hdHRhY2hfb2JqZWN0KChzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqKXdhbGtfc3RhdGUtPgorCQkJCSAgb3BlcmFuZHNbMF0sIG9ial9kZXNjLCBBQ1BJX1RZUEVfRVZFTlQpOworCisgICAgICBjbGVhbnVwOgorCS8qCisJICogUmVtb3ZlIGxvY2FsIHJlZmVyZW5jZSB0byB0aGUgb2JqZWN0IChvbiBlcnJvciwgd2lsbCBjYXVzZSBkZWxldGlvbgorCSAqIG9mIGJvdGggb2JqZWN0IGFuZCBzZW1hcGhvcmUgaWYgcHJlc2VudC4pCisJICovCisJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKG9ial9kZXNjKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9leF9jcmVhdGVfbXV0ZXgKKyAqCisgKiBQQVJBTUVURVJTOiAgd2Fsa19zdGF0ZSAgICAgICAgICAtIEN1cnJlbnQgc3RhdGUKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IENyZWF0ZSBhIG5ldyBtdXRleCBvYmplY3QKKyAqCisgKiAgICAgICAgICAgICAgTXV0ZXggKE5hbWVbMF0sIHN5bmNfbGV2ZWxbMV0pCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworYWNwaV9zdGF0dXMgYWNwaV9leF9jcmVhdGVfbXV0ZXgoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSkKK3sKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYzsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKGV4X2NyZWF0ZV9tdXRleCwgQUNQSV9XQUxLX09QRVJBTkRTKTsKKworCS8qIENyZWF0ZSB0aGUgbmV3IG11dGV4IG9iamVjdCAqLworCisJb2JqX2Rlc2MgPSBhY3BpX3V0X2NyZWF0ZV9pbnRlcm5hbF9vYmplY3QoQUNQSV9UWVBFX01VVEVYKTsKKwlpZiAoIW9ial9kZXNjKSB7CisJCXN0YXR1cyA9IEFFX05PX01FTU9SWTsKKwkJZ290byBjbGVhbnVwOworCX0KKworCS8qIENyZWF0ZSB0aGUgYWN0dWFsIE9TIE11dGV4ICovCisKKwlzdGF0dXMgPSBhY3BpX29zX2NyZWF0ZV9tdXRleCgmb2JqX2Rlc2MtPm11dGV4Lm9zX211dGV4KTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJZ290byBjbGVhbnVwOworCX0KKworCS8qIEluaXQgb2JqZWN0IGFuZCBhdHRhY2ggdG8gTlMgbm9kZSAqLworCisJb2JqX2Rlc2MtPm11dGV4LnN5bmNfbGV2ZWwgPQorCSAgICAodTgpIHdhbGtfc3RhdGUtPm9wZXJhbmRzWzFdLT5pbnRlZ2VyLnZhbHVlOworCW9ial9kZXNjLT5tdXRleC5ub2RlID0KKwkgICAgKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICopd2Fsa19zdGF0ZS0+b3BlcmFuZHNbMF07CisKKwlzdGF0dXMgPQorCSAgICBhY3BpX25zX2F0dGFjaF9vYmplY3Qob2JqX2Rlc2MtPm11dGV4Lm5vZGUsIG9ial9kZXNjLAorCQkJCSAgQUNQSV9UWVBFX01VVEVYKTsKKworICAgICAgY2xlYW51cDoKKwkvKgorCSAqIFJlbW92ZSBsb2NhbCByZWZlcmVuY2UgdG8gdGhlIG9iamVjdCAob24gZXJyb3IsIHdpbGwgY2F1c2UgZGVsZXRpb24KKwkgKiBvZiBib3RoIG9iamVjdCBhbmQgc2VtYXBob3JlIGlmIHByZXNlbnQuKQorCSAqLworCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZShvYmpfZGVzYyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfZXhfY3JlYXRlX3JlZ2lvbgorICoKKyAqIFBBUkFNRVRFUlM6ICBhbWxfc3RhcnQgICAgICAgICAgIC0gUG9pbnRlciB0byB0aGUgcmVnaW9uIGRlY2xhcmF0aW9uIEFNTAorICogICAgICAgICAgICAgIGFtbF9sZW5ndGggICAgICAgICAgLSBNYXggbGVuZ3RoIG9mIHRoZSBkZWNsYXJhdGlvbiBBTUwKKyAqICAgICAgICAgICAgICByZWdpb25fc3BhY2UgICAgICAgIC0gc3BhY2VfaUQgZm9yIHRoZSByZWdpb24KKyAqICAgICAgICAgICAgICB3YWxrX3N0YXRlICAgICAgICAgIC0gQ3VycmVudCBzdGF0ZQorICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogQ3JlYXRlIGEgbmV3IG9wZXJhdGlvbiByZWdpb24gb2JqZWN0CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworYWNwaV9zdGF0dXMKK2FjcGlfZXhfY3JlYXRlX3JlZ2lvbih1OCAqIGFtbF9zdGFydCwKKwkJICAgICAgdTMyIGFtbF9sZW5ndGgsCisJCSAgICAgIHU4IHJlZ2lvbl9zcGFjZSwgc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSkKK3sKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2M7CisJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGU7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqcmVnaW9uX29iajI7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGV4X2NyZWF0ZV9yZWdpb24pOworCisJLyogR2V0IHRoZSBOYW1lc3BhY2UgTm9kZSAqLworCisJbm9kZSA9IHdhbGtfc3RhdGUtPm9wLT5jb21tb24ubm9kZTsKKworCS8qCisJICogSWYgdGhlIHJlZ2lvbiBvYmplY3QgaXMgYWxyZWFkeSBhdHRhY2hlZCB0byB0aGlzIG5vZGUsCisJICoganVzdCByZXR1cm4KKwkgKi8KKwlpZiAoYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0KG5vZGUpKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CisJfQorCisJLyoKKwkgKiBTcGFjZSBJRCBtdXN0IGJlIG9uZSBvZiB0aGUgcHJlZGVmaW5lZCBJRHMsIG9yIGluIHRoZSB1c2VyLWRlZmluZWQKKwkgKiByYW5nZQorCSAqLworCWlmICgocmVnaW9uX3NwYWNlID49IEFDUElfTlVNX1BSRURFRklORURfUkVHSU9OUykgJiYKKwkgICAgKHJlZ2lvbl9zcGFjZSA8IEFDUElfVVNFUl9SRUdJT05fQkVHSU4pKSB7CisJCUFDUElfRVJST1IoKEFFX0lORk8sICJJbnZhbGlkIEFkZHJlc3NTcGFjZSB0eXBlICVYIiwKKwkJCSAgICByZWdpb25fc3BhY2UpKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9JTlZBTElEX1NQQUNFX0lEKTsKKwl9CisKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0xPQUQsICJSZWdpb24gVHlwZSAtICVzICglWClcbiIsCisJCQkgIGFjcGlfdXRfZ2V0X3JlZ2lvbl9uYW1lKHJlZ2lvbl9zcGFjZSksIHJlZ2lvbl9zcGFjZSkpOworCisJLyogQ3JlYXRlIHRoZSByZWdpb24gZGVzY3JpcHRvciAqLworCisJb2JqX2Rlc2MgPSBhY3BpX3V0X2NyZWF0ZV9pbnRlcm5hbF9vYmplY3QoQUNQSV9UWVBFX1JFR0lPTik7CisJaWYgKCFvYmpfZGVzYykgeworCQlzdGF0dXMgPSBBRV9OT19NRU1PUlk7CisJCWdvdG8gY2xlYW51cDsKKwl9CisKKwkvKgorCSAqIFJlbWVtYmVyIGxvY2F0aW9uIGluIEFNTCBzdHJlYW0gb2YgYWRkcmVzcyAmIGxlbmd0aAorCSAqIG9wZXJhbmRzIHNpbmNlIHRoZXkgbmVlZCB0byBiZSBldmFsdWF0ZWQgYXQgcnVuIHRpbWUuCisJICovCisJcmVnaW9uX29iajIgPSBvYmpfZGVzYy0+Y29tbW9uLm5leHRfb2JqZWN0OworCXJlZ2lvbl9vYmoyLT5leHRyYS5hbWxfc3RhcnQgPSBhbWxfc3RhcnQ7CisJcmVnaW9uX29iajItPmV4dHJhLmFtbF9sZW5ndGggPSBhbWxfbGVuZ3RoOworCisJLyogSW5pdCB0aGUgcmVnaW9uIGZyb20gdGhlIG9wZXJhbmRzICovCisKKwlvYmpfZGVzYy0+cmVnaW9uLnNwYWNlX2lkID0gcmVnaW9uX3NwYWNlOworCW9ial9kZXNjLT5yZWdpb24uYWRkcmVzcyA9IDA7CisJb2JqX2Rlc2MtPnJlZ2lvbi5sZW5ndGggPSAwOworCW9ial9kZXNjLT5yZWdpb24ubm9kZSA9IG5vZGU7CisKKwkvKiBJbnN0YWxsIHRoZSBuZXcgcmVnaW9uIG9iamVjdCBpbiB0aGUgcGFyZW50IE5vZGUgKi8KKworCXN0YXR1cyA9IGFjcGlfbnNfYXR0YWNoX29iamVjdChub2RlLCBvYmpfZGVzYywgQUNQSV9UWVBFX1JFR0lPTik7CisKKyAgICAgIGNsZWFudXA6CisKKwkvKiBSZW1vdmUgbG9jYWwgcmVmZXJlbmNlIHRvIHRoZSBvYmplY3QgKi8KKworCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZShvYmpfZGVzYyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfZXhfY3JlYXRlX3Byb2Nlc3NvcgorICoKKyAqIFBBUkFNRVRFUlM6ICB3YWxrX3N0YXRlICAgICAgICAgIC0gQ3VycmVudCBzdGF0ZQorICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogQ3JlYXRlIGEgbmV3IHByb2Nlc3NvciBvYmplY3QgYW5kIHBvcHVsYXRlIHRoZSBmaWVsZHMKKyAqCisgKiAgICAgICAgICAgICAgUHJvY2Vzc29yIChOYW1lWzBdLCBjcHVfaURbMV0sIHBibG9ja19hZGRyWzJdLCBwYmxvY2tfbGVuZ3RoWzNdKQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2FjcGlfc3RhdHVzIGFjcGlfZXhfY3JlYXRlX3Byb2Nlc3NvcihzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKQoreworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKipvcGVyYW5kID0gJndhbGtfc3RhdGUtPm9wZXJhbmRzWzBdOworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKGV4X2NyZWF0ZV9wcm9jZXNzb3IsIHdhbGtfc3RhdGUpOworCisJLyogQ3JlYXRlIHRoZSBwcm9jZXNzb3Igb2JqZWN0ICovCisKKwlvYmpfZGVzYyA9IGFjcGlfdXRfY3JlYXRlX2ludGVybmFsX29iamVjdChBQ1BJX1RZUEVfUFJPQ0VTU09SKTsKKwlpZiAoIW9ial9kZXNjKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT19NRU1PUlkpOworCX0KKworCS8qIEluaXRpYWxpemUgdGhlIHByb2Nlc3NvciBvYmplY3QgZnJvbSB0aGUgb3BlcmFuZHMgKi8KKworCW9ial9kZXNjLT5wcm9jZXNzb3IucHJvY19pZCA9ICh1OCkgb3BlcmFuZFsxXS0+aW50ZWdlci52YWx1ZTsKKwlvYmpfZGVzYy0+cHJvY2Vzc29yLmxlbmd0aCA9ICh1OCkgb3BlcmFuZFszXS0+aW50ZWdlci52YWx1ZTsKKwlvYmpfZGVzYy0+cHJvY2Vzc29yLmFkZHJlc3MgPQorCSAgICAoYWNwaV9pb19hZGRyZXNzKSBvcGVyYW5kWzJdLT5pbnRlZ2VyLnZhbHVlOworCisJLyogSW5zdGFsbCB0aGUgcHJvY2Vzc29yIG9iamVjdCBpbiB0aGUgcGFyZW50IE5vZGUgKi8KKworCXN0YXR1cyA9IGFjcGlfbnNfYXR0YWNoX29iamVjdCgoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKilvcGVyYW5kWzBdLAorCQkJCSAgICAgICBvYmpfZGVzYywgQUNQSV9UWVBFX1BST0NFU1NPUik7CisKKwkvKiBSZW1vdmUgbG9jYWwgcmVmZXJlbmNlIHRvIHRoZSBvYmplY3QgKi8KKworCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZShvYmpfZGVzYyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfZXhfY3JlYXRlX3Bvd2VyX3Jlc291cmNlCisgKgorICogUEFSQU1FVEVSUzogIHdhbGtfc3RhdGUgICAgICAgICAgLSBDdXJyZW50IHN0YXRlCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBDcmVhdGUgYSBuZXcgcG93ZXJfcmVzb3VyY2Ugb2JqZWN0IGFuZCBwb3B1bGF0ZSB0aGUgZmllbGRzCisgKgorICogICAgICAgICAgICAgIHBvd2VyX3Jlc291cmNlIChOYW1lWzBdLCBzeXN0ZW1fbGV2ZWxbMV0sIHJlc291cmNlX29yZGVyWzJdKQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2FjcGlfc3RhdHVzIGFjcGlfZXhfY3JlYXRlX3Bvd2VyX3Jlc291cmNlKHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUpCit7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKm9wZXJhbmQgPSAmd2Fsa19zdGF0ZS0+b3BlcmFuZHNbMF07CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjOworCisJQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIoZXhfY3JlYXRlX3Bvd2VyX3Jlc291cmNlLCB3YWxrX3N0YXRlKTsKKworCS8qIENyZWF0ZSB0aGUgcG93ZXIgcmVzb3VyY2Ugb2JqZWN0ICovCisKKwlvYmpfZGVzYyA9IGFjcGlfdXRfY3JlYXRlX2ludGVybmFsX29iamVjdChBQ1BJX1RZUEVfUE9XRVIpOworCWlmICghb2JqX2Rlc2MpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX01FTU9SWSk7CisJfQorCisJLyogSW5pdGlhbGl6ZSB0aGUgcG93ZXIgb2JqZWN0IGZyb20gdGhlIG9wZXJhbmRzICovCisKKwlvYmpfZGVzYy0+cG93ZXJfcmVzb3VyY2Uuc3lzdGVtX2xldmVsID0gKHU4KSBvcGVyYW5kWzFdLT5pbnRlZ2VyLnZhbHVlOworCW9ial9kZXNjLT5wb3dlcl9yZXNvdXJjZS5yZXNvdXJjZV9vcmRlciA9CisJICAgICh1MTYpIG9wZXJhbmRbMl0tPmludGVnZXIudmFsdWU7CisKKwkvKiBJbnN0YWxsIHRoZSAgcG93ZXIgcmVzb3VyY2Ugb2JqZWN0IGluIHRoZSBwYXJlbnQgTm9kZSAqLworCisJc3RhdHVzID0gYWNwaV9uc19hdHRhY2hfb2JqZWN0KChzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqKW9wZXJhbmRbMF0sCisJCQkJICAgICAgIG9ial9kZXNjLCBBQ1BJX1RZUEVfUE9XRVIpOworCisJLyogUmVtb3ZlIGxvY2FsIHJlZmVyZW5jZSB0byB0aGUgb2JqZWN0ICovCisKKwlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2Uob2JqX2Rlc2MpOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfZXhfY3JlYXRlX21ldGhvZAorICoKKyAqIFBBUkFNRVRFUlM6ICBhbWxfc3RhcnQgICAgICAgLSBGaXJzdCBieXRlIG9mIHRoZSBtZXRob2QncyBBTUwKKyAqICAgICAgICAgICAgICBhbWxfbGVuZ3RoICAgICAgLSBBTUwgYnl0ZSBjb3VudCBmb3IgdGhpcyBtZXRob2QKKyAqICAgICAgICAgICAgICB3YWxrX3N0YXRlICAgICAgLSBDdXJyZW50IHN0YXRlCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBDcmVhdGUgYSBuZXcgbWV0aG9kIG9iamVjdAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2FjcGlfc3RhdHVzCithY3BpX2V4X2NyZWF0ZV9tZXRob2QodTggKiBhbWxfc3RhcnQsCisJCSAgICAgIHUzMiBhbWxfbGVuZ3RoLCBzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKQoreworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKipvcGVyYW5kID0gJndhbGtfc3RhdGUtPm9wZXJhbmRzWzBdOworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwl1OCBtZXRob2RfZmxhZ3M7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUihleF9jcmVhdGVfbWV0aG9kLCB3YWxrX3N0YXRlKTsKKworCS8qIENyZWF0ZSBhIG5ldyBtZXRob2Qgb2JqZWN0ICovCisKKwlvYmpfZGVzYyA9IGFjcGlfdXRfY3JlYXRlX2ludGVybmFsX29iamVjdChBQ1BJX1RZUEVfTUVUSE9EKTsKKwlpZiAoIW9ial9kZXNjKSB7CisJCXN0YXR1cyA9IEFFX05PX01FTU9SWTsKKwkJZ290byBleGl0OworCX0KKworCS8qIFNhdmUgdGhlIG1ldGhvZCdzIEFNTCBwb2ludGVyIGFuZCBsZW5ndGggICovCisKKwlvYmpfZGVzYy0+bWV0aG9kLmFtbF9zdGFydCA9IGFtbF9zdGFydDsKKwlvYmpfZGVzYy0+bWV0aG9kLmFtbF9sZW5ndGggPSBhbWxfbGVuZ3RoOworCisJLyoKKwkgKiBEaXNhc3NlbWJsZSB0aGUgbWV0aG9kIGZsYWdzLiBTcGxpdCBvZmYgdGhlIEFyZyBDb3VudAorCSAqIGZvciBlZmZpY2llbmN5CisJICovCisJbWV0aG9kX2ZsYWdzID0gKHU4KSBvcGVyYW5kWzFdLT5pbnRlZ2VyLnZhbHVlOworCisJb2JqX2Rlc2MtPm1ldGhvZC5tZXRob2RfZmxhZ3MgPQorCSAgICAodTgpIChtZXRob2RfZmxhZ3MgJiB+QU1MX01FVEhPRF9BUkdfQ09VTlQpOworCW9ial9kZXNjLT5tZXRob2QucGFyYW1fY291bnQgPQorCSAgICAodTgpIChtZXRob2RfZmxhZ3MgJiBBTUxfTUVUSE9EX0FSR19DT1VOVCk7CisKKwkvKgorCSAqIEdldCB0aGUgc3luY19sZXZlbC4gSWYgbWV0aG9kIGlzIHNlcmlhbGl6ZWQsIGEgbXV0ZXggd2lsbCBiZQorCSAqIGNyZWF0ZWQgZm9yIHRoaXMgbWV0aG9kIHdoZW4gaXQgaXMgcGFyc2VkLgorCSAqLworCWlmIChtZXRob2RfZmxhZ3MgJiBBTUxfTUVUSE9EX1NFUklBTElaRUQpIHsKKwkJLyoKKwkJICogQUNQSSAxLjA6IHN5bmNfbGV2ZWwgPSAwCisJCSAqIEFDUEkgMi4wOiBzeW5jX2xldmVsID0gc3luY19sZXZlbCBpbiBtZXRob2QgZGVjbGFyYXRpb24KKwkJICovCisJCW9ial9kZXNjLT5tZXRob2Quc3luY19sZXZlbCA9ICh1OCkKKwkJICAgICgobWV0aG9kX2ZsYWdzICYgQU1MX01FVEhPRF9TWU5DSF9MRVZFTCkgPj4gNCk7CisJfQorCisJLyogQXR0YWNoIHRoZSBuZXcgb2JqZWN0IHRvIHRoZSBtZXRob2QgTm9kZSAqLworCisJc3RhdHVzID0gYWNwaV9uc19hdHRhY2hfb2JqZWN0KChzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqKW9wZXJhbmRbMF0sCisJCQkJICAgICAgIG9ial9kZXNjLCBBQ1BJX1RZUEVfTUVUSE9EKTsKKworCS8qIFJlbW92ZSBsb2NhbCByZWZlcmVuY2UgdG8gdGhlIG9iamVjdCAqLworCisJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKG9ial9kZXNjKTsKKworICAgICAgZXhpdDoKKwkvKiBSZW1vdmUgYSByZWZlcmVuY2UgdG8gdGhlIG9wZXJhbmQgKi8KKworCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZShvcGVyYW5kWzFdKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXhkdW1wLmMgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2V4ZHVtcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhMzEzNTcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2V4ZHVtcC5jCkBAIC0wLDAgKzEsMTA2MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIE1vZHVsZSBOYW1lOiBleGR1bXAgLSBJbnRlcnByZXRlciBkZWJ1ZyBvdXRwdXQgcm91dGluZXMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA4LCBJbnRlbCBDb3JwLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAorICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgYXQgbWluaW11bSBhIGRpc2NsYWltZXIKKyAqICAgIHN1YnN0YW50aWFsbHkgc2ltaWxhciB0byB0aGUgIk5PIFdBUlJBTlRZIiBkaXNjbGFpbWVyIGJlbG93CisgKiAgICAoIkRpc2NsYWltZXIiKSBhbmQgYW55IHJlZGlzdHJpYnV0aW9uIG11c3QgYmUgY29uZGl0aW9uZWQgdXBvbgorICogICAgaW5jbHVkaW5nIGEgc3Vic3RhbnRpYWxseSBzaW1pbGFyIERpc2NsYWltZXIgcmVxdWlyZW1lbnQgZm9yIGZ1cnRoZXIKKyAqICAgIGJpbmFyeSByZWRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcworICogICAgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBOTyBXQVJSQU5UWQorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcKKyAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgorICovCisKKyNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KKyNpbmNsdWRlICJhY2NvbW1vbi5oIgorI2luY2x1ZGUgImFjaW50ZXJwLmgiCisjaW5jbHVkZSAiYW1sY29kZS5oIgorI2luY2x1ZGUgImFjbmFtZXNwLmgiCisKKyNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX0VYRUNVVEVSCitBQ1BJX01PRFVMRV9OQU1FKCJleGR1bXAiKQorCisvKgorICogVGhlIGZvbGxvd2luZyByb3V0aW5lcyBhcmUgdXNlZCBmb3IgZGVidWcgb3V0cHV0IG9ubHkKKyAqLworI2lmIGRlZmluZWQoQUNQSV9ERUJVR19PVVRQVVQpIHx8IGRlZmluZWQoQUNQSV9ERUJVR0dFUikKKy8qIExvY2FsIHByb3RvdHlwZXMgKi8KK3N0YXRpYyB2b2lkIGFjcGlfZXhfb3V0X3N0cmluZyhjaGFyICp0aXRsZSwgY2hhciAqdmFsdWUpOworCitzdGF0aWMgdm9pZCBhY3BpX2V4X291dF9wb2ludGVyKGNoYXIgKnRpdGxlLCB2b2lkICp2YWx1ZSk7CisKK3N0YXRpYyB2b2lkCithY3BpX2V4X2R1bXBfb2JqZWN0KHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjLAorCQkgICAgc3RydWN0IGFjcGlfZXhkdW1wX2luZm8gKmluZm8pOworCitzdGF0aWMgdm9pZCBhY3BpX2V4X2R1bXBfcmVmZXJlbmNlX29iaih1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYyk7CisKK3N0YXRpYyB2b2lkCithY3BpX2V4X2R1bXBfcGFja2FnZV9vYmoodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2MsCisJCQkgdTMyIGxldmVsLCB1MzIgaW5kZXgpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIE9iamVjdCBEZXNjcmlwdG9yIGluZm8gdGFibGVzCisgKgorICogTm90ZTogVGhlIGZpcnN0IHRhYmxlIGVudHJ5IG11c3QgYmUgYW4gSU5JVCBvcGNvZGUgYW5kIG11c3QgY29udGFpbgorICogdGhlIHRhYmxlIGxlbmd0aCAobnVtYmVyIG9mIHRhYmxlIGVudHJpZXMpCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHN0cnVjdCBhY3BpX2V4ZHVtcF9pbmZvIGFjcGlfZXhfZHVtcF9pbnRlZ2VyWzJdID0geworCXtBQ1BJX0VYRF9JTklULCBBQ1BJX0VYRF9UQUJMRV9TSVpFKGFjcGlfZXhfZHVtcF9pbnRlZ2VyKSwgTlVMTH0sCisJe0FDUElfRVhEX1VJTlQ2NCwgQUNQSV9FWERfT0ZGU0VUKGludGVnZXIudmFsdWUpLCAiVmFsdWUifQorfTsKKworc3RhdGljIHN0cnVjdCBhY3BpX2V4ZHVtcF9pbmZvIGFjcGlfZXhfZHVtcF9zdHJpbmdbNF0gPSB7CisJe0FDUElfRVhEX0lOSVQsIEFDUElfRVhEX1RBQkxFX1NJWkUoYWNwaV9leF9kdW1wX3N0cmluZyksIE5VTEx9LAorCXtBQ1BJX0VYRF9VSU5UMzIsIEFDUElfRVhEX09GRlNFVChzdHJpbmcubGVuZ3RoKSwgIkxlbmd0aCJ9LAorCXtBQ1BJX0VYRF9QT0lOVEVSLCBBQ1BJX0VYRF9PRkZTRVQoc3RyaW5nLnBvaW50ZXIpLCAiUG9pbnRlciJ9LAorCXtBQ1BJX0VYRF9TVFJJTkcsIDAsIE5VTEx9Cit9OworCitzdGF0aWMgc3RydWN0IGFjcGlfZXhkdW1wX2luZm8gYWNwaV9leF9kdW1wX2J1ZmZlcls1XSA9IHsKKwl7QUNQSV9FWERfSU5JVCwgQUNQSV9FWERfVEFCTEVfU0laRShhY3BpX2V4X2R1bXBfYnVmZmVyKSwgTlVMTH0sCisJe0FDUElfRVhEX1VJTlQzMiwgQUNQSV9FWERfT0ZGU0VUKGJ1ZmZlci5sZW5ndGgpLCAiTGVuZ3RoIn0sCisJe0FDUElfRVhEX1BPSU5URVIsIEFDUElfRVhEX09GRlNFVChidWZmZXIucG9pbnRlciksICJQb2ludGVyIn0sCisJe0FDUElfRVhEX1BPSU5URVIsIEFDUElfRVhEX09GRlNFVChidWZmZXIubm9kZSksICJQYXJlbnQgTm9kZSJ9LAorCXtBQ1BJX0VYRF9CVUZGRVIsIDAsIE5VTEx9Cit9OworCitzdGF0aWMgc3RydWN0IGFjcGlfZXhkdW1wX2luZm8gYWNwaV9leF9kdW1wX3BhY2thZ2VbNV0gPSB7CisJe0FDUElfRVhEX0lOSVQsIEFDUElfRVhEX1RBQkxFX1NJWkUoYWNwaV9leF9kdW1wX3BhY2thZ2UpLCBOVUxMfSwKKwl7QUNQSV9FWERfVUlOVDgsIEFDUElfRVhEX09GRlNFVChwYWNrYWdlLmZsYWdzKSwgIkZsYWdzIn0sCisJe0FDUElfRVhEX1VJTlQzMiwgQUNQSV9FWERfT0ZGU0VUKHBhY2thZ2UuY291bnQpLCAiRWxlbWVudHMifSwKKwl7QUNQSV9FWERfUE9JTlRFUiwgQUNQSV9FWERfT0ZGU0VUKHBhY2thZ2UuZWxlbWVudHMpLCAiRWxlbWVudCBMaXN0In0sCisJe0FDUElfRVhEX1BBQ0tBR0UsIDAsIE5VTEx9Cit9OworCitzdGF0aWMgc3RydWN0IGFjcGlfZXhkdW1wX2luZm8gYWNwaV9leF9kdW1wX2RldmljZVs0XSA9IHsKKwl7QUNQSV9FWERfSU5JVCwgQUNQSV9FWERfVEFCTEVfU0laRShhY3BpX2V4X2R1bXBfZGV2aWNlKSwgTlVMTH0sCisJe0FDUElfRVhEX1BPSU5URVIsIEFDUElfRVhEX09GRlNFVChkZXZpY2UuaGFuZGxlciksICJIYW5kbGVyIn0sCisJe0FDUElfRVhEX1BPSU5URVIsIEFDUElfRVhEX09GRlNFVChkZXZpY2Uuc3lzdGVtX25vdGlmeSksCisJICJTeXN0ZW0gTm90aWZ5In0sCisJe0FDUElfRVhEX1BPSU5URVIsIEFDUElfRVhEX09GRlNFVChkZXZpY2UuZGV2aWNlX25vdGlmeSksCisJICJEZXZpY2UgTm90aWZ5In0KK307CisKK3N0YXRpYyBzdHJ1Y3QgYWNwaV9leGR1bXBfaW5mbyBhY3BpX2V4X2R1bXBfZXZlbnRbMl0gPSB7CisJe0FDUElfRVhEX0lOSVQsIEFDUElfRVhEX1RBQkxFX1NJWkUoYWNwaV9leF9kdW1wX2V2ZW50KSwgTlVMTH0sCisJe0FDUElfRVhEX1BPSU5URVIsIEFDUElfRVhEX09GRlNFVChldmVudC5vc19zZW1hcGhvcmUpLCAiT3NTZW1hcGhvcmUifQorfTsKKworc3RhdGljIHN0cnVjdCBhY3BpX2V4ZHVtcF9pbmZvIGFjcGlfZXhfZHVtcF9tZXRob2RbOF0gPSB7CisJe0FDUElfRVhEX0lOSVQsIEFDUElfRVhEX1RBQkxFX1NJWkUoYWNwaV9leF9kdW1wX21ldGhvZCksIE5VTEx9LAorCXtBQ1BJX0VYRF9VSU5UOCwgQUNQSV9FWERfT0ZGU0VUKG1ldGhvZC5wYXJhbV9jb3VudCksICJQYXJhbUNvdW50In0sCisJe0FDUElfRVhEX1VJTlQ4LCBBQ1BJX0VYRF9PRkZTRVQobWV0aG9kLnN5bmNfbGV2ZWwpLCAiU3luYyBMZXZlbCJ9LAorCXtBQ1BJX0VYRF9QT0lOVEVSLCBBQ1BJX0VYRF9PRkZTRVQobWV0aG9kLm11dGV4KSwgIk11dGV4In0sCisJe0FDUElfRVhEX1VJTlQ4LCBBQ1BJX0VYRF9PRkZTRVQobWV0aG9kLm93bmVyX2lkKSwgIk93bmVyIElkIn0sCisJe0FDUElfRVhEX1VJTlQ4LCBBQ1BJX0VYRF9PRkZTRVQobWV0aG9kLnRocmVhZF9jb3VudCksICJUaHJlYWQgQ291bnQifSwKKwl7QUNQSV9FWERfVUlOVDMyLCBBQ1BJX0VYRF9PRkZTRVQobWV0aG9kLmFtbF9sZW5ndGgpLCAiQW1sIExlbmd0aCJ9LAorCXtBQ1BJX0VYRF9QT0lOVEVSLCBBQ1BJX0VYRF9PRkZTRVQobWV0aG9kLmFtbF9zdGFydCksICJBbWwgU3RhcnQifQorfTsKKworc3RhdGljIHN0cnVjdCBhY3BpX2V4ZHVtcF9pbmZvIGFjcGlfZXhfZHVtcF9tdXRleFs1XSA9IHsKKwl7QUNQSV9FWERfSU5JVCwgQUNQSV9FWERfVEFCTEVfU0laRShhY3BpX2V4X2R1bXBfbXV0ZXgpLCBOVUxMfSwKKwl7QUNQSV9FWERfVUlOVDgsIEFDUElfRVhEX09GRlNFVChtdXRleC5zeW5jX2xldmVsKSwgIlN5bmMgTGV2ZWwifSwKKwl7QUNQSV9FWERfUE9JTlRFUiwgQUNQSV9FWERfT0ZGU0VUKG11dGV4Lm93bmVyX3RocmVhZCksICJPd25lciBUaHJlYWQifSwKKwl7QUNQSV9FWERfVUlOVDE2LCBBQ1BJX0VYRF9PRkZTRVQobXV0ZXguYWNxdWlzaXRpb25fZGVwdGgpLAorCSAiQWNxdWlyZSBEZXB0aCJ9LAorCXtBQ1BJX0VYRF9QT0lOVEVSLCBBQ1BJX0VYRF9PRkZTRVQobXV0ZXgub3NfbXV0ZXgpLCAiT3NNdXRleCJ9Cit9OworCitzdGF0aWMgc3RydWN0IGFjcGlfZXhkdW1wX2luZm8gYWNwaV9leF9kdW1wX3JlZ2lvbls3XSA9IHsKKwl7QUNQSV9FWERfSU5JVCwgQUNQSV9FWERfVEFCTEVfU0laRShhY3BpX2V4X2R1bXBfcmVnaW9uKSwgTlVMTH0sCisJe0FDUElfRVhEX1VJTlQ4LCBBQ1BJX0VYRF9PRkZTRVQocmVnaW9uLnNwYWNlX2lkKSwgIlNwYWNlIElkIn0sCisJe0FDUElfRVhEX1VJTlQ4LCBBQ1BJX0VYRF9PRkZTRVQocmVnaW9uLmZsYWdzKSwgIkZsYWdzIn0sCisJe0FDUElfRVhEX0FERFJFU1MsIEFDUElfRVhEX09GRlNFVChyZWdpb24uYWRkcmVzcyksICJBZGRyZXNzIn0sCisJe0FDUElfRVhEX1VJTlQzMiwgQUNQSV9FWERfT0ZGU0VUKHJlZ2lvbi5sZW5ndGgpLCAiTGVuZ3RoIn0sCisJe0FDUElfRVhEX1BPSU5URVIsIEFDUElfRVhEX09GRlNFVChyZWdpb24uaGFuZGxlciksICJIYW5kbGVyIn0sCisJe0FDUElfRVhEX1BPSU5URVIsIEFDUElfRVhEX09GRlNFVChyZWdpb24ubmV4dCksICJOZXh0In0KK307CisKK3N0YXRpYyBzdHJ1Y3QgYWNwaV9leGR1bXBfaW5mbyBhY3BpX2V4X2R1bXBfcG93ZXJbNV0gPSB7CisJe0FDUElfRVhEX0lOSVQsIEFDUElfRVhEX1RBQkxFX1NJWkUoYWNwaV9leF9kdW1wX3Bvd2VyKSwgTlVMTH0sCisJe0FDUElfRVhEX1VJTlQzMiwgQUNQSV9FWERfT0ZGU0VUKHBvd2VyX3Jlc291cmNlLnN5c3RlbV9sZXZlbCksCisJICJTeXN0ZW0gTGV2ZWwifSwKKwl7QUNQSV9FWERfVUlOVDMyLCBBQ1BJX0VYRF9PRkZTRVQocG93ZXJfcmVzb3VyY2UucmVzb3VyY2Vfb3JkZXIpLAorCSAiUmVzb3VyY2UgT3JkZXIifSwKKwl7QUNQSV9FWERfUE9JTlRFUiwgQUNQSV9FWERfT0ZGU0VUKHBvd2VyX3Jlc291cmNlLnN5c3RlbV9ub3RpZnkpLAorCSAiU3lzdGVtIE5vdGlmeSJ9LAorCXtBQ1BJX0VYRF9QT0lOVEVSLCBBQ1BJX0VYRF9PRkZTRVQocG93ZXJfcmVzb3VyY2UuZGV2aWNlX25vdGlmeSksCisJICJEZXZpY2UgTm90aWZ5In0KK307CisKK3N0YXRpYyBzdHJ1Y3QgYWNwaV9leGR1bXBfaW5mbyBhY3BpX2V4X2R1bXBfcHJvY2Vzc29yWzddID0geworCXtBQ1BJX0VYRF9JTklULCBBQ1BJX0VYRF9UQUJMRV9TSVpFKGFjcGlfZXhfZHVtcF9wcm9jZXNzb3IpLCBOVUxMfSwKKwl7QUNQSV9FWERfVUlOVDgsIEFDUElfRVhEX09GRlNFVChwcm9jZXNzb3IucHJvY19pZCksICJQcm9jZXNzb3IgSUQifSwKKwl7QUNQSV9FWERfVUlOVDgsIEFDUElfRVhEX09GRlNFVChwcm9jZXNzb3IubGVuZ3RoKSwgIkxlbmd0aCJ9LAorCXtBQ1BJX0VYRF9BRERSRVNTLCBBQ1BJX0VYRF9PRkZTRVQocHJvY2Vzc29yLmFkZHJlc3MpLCAiQWRkcmVzcyJ9LAorCXtBQ1BJX0VYRF9QT0lOVEVSLCBBQ1BJX0VYRF9PRkZTRVQocHJvY2Vzc29yLnN5c3RlbV9ub3RpZnkpLAorCSAiU3lzdGVtIE5vdGlmeSJ9LAorCXtBQ1BJX0VYRF9QT0lOVEVSLCBBQ1BJX0VYRF9PRkZTRVQocHJvY2Vzc29yLmRldmljZV9ub3RpZnkpLAorCSAiRGV2aWNlIE5vdGlmeSJ9LAorCXtBQ1BJX0VYRF9QT0lOVEVSLCBBQ1BJX0VYRF9PRkZTRVQocHJvY2Vzc29yLmhhbmRsZXIpLCAiSGFuZGxlciJ9Cit9OworCitzdGF0aWMgc3RydWN0IGFjcGlfZXhkdW1wX2luZm8gYWNwaV9leF9kdW1wX3RoZXJtYWxbNF0gPSB7CisJe0FDUElfRVhEX0lOSVQsIEFDUElfRVhEX1RBQkxFX1NJWkUoYWNwaV9leF9kdW1wX3RoZXJtYWwpLCBOVUxMfSwKKwl7QUNQSV9FWERfUE9JTlRFUiwgQUNQSV9FWERfT0ZGU0VUKHRoZXJtYWxfem9uZS5zeXN0ZW1fbm90aWZ5KSwKKwkgIlN5c3RlbSBOb3RpZnkifSwKKwl7QUNQSV9FWERfUE9JTlRFUiwgQUNQSV9FWERfT0ZGU0VUKHRoZXJtYWxfem9uZS5kZXZpY2Vfbm90aWZ5KSwKKwkgIkRldmljZSBOb3RpZnkifSwKKwl7QUNQSV9FWERfUE9JTlRFUiwgQUNQSV9FWERfT0ZGU0VUKHRoZXJtYWxfem9uZS5oYW5kbGVyKSwgIkhhbmRsZXIifQorfTsKKworc3RhdGljIHN0cnVjdCBhY3BpX2V4ZHVtcF9pbmZvIGFjcGlfZXhfZHVtcF9idWZmZXJfZmllbGRbM10gPSB7CisJe0FDUElfRVhEX0lOSVQsIEFDUElfRVhEX1RBQkxFX1NJWkUoYWNwaV9leF9kdW1wX2J1ZmZlcl9maWVsZCksIE5VTEx9LAorCXtBQ1BJX0VYRF9GSUVMRCwgMCwgTlVMTH0sCisJe0FDUElfRVhEX1BPSU5URVIsIEFDUElfRVhEX09GRlNFVChidWZmZXJfZmllbGQuYnVmZmVyX29iaiksCisJICJCdWZmZXIgT2JqZWN0In0KK307CisKK3N0YXRpYyBzdHJ1Y3QgYWNwaV9leGR1bXBfaW5mbyBhY3BpX2V4X2R1bXBfcmVnaW9uX2ZpZWxkWzNdID0geworCXtBQ1BJX0VYRF9JTklULCBBQ1BJX0VYRF9UQUJMRV9TSVpFKGFjcGlfZXhfZHVtcF9yZWdpb25fZmllbGQpLCBOVUxMfSwKKwl7QUNQSV9FWERfRklFTEQsIDAsIE5VTEx9LAorCXtBQ1BJX0VYRF9QT0lOVEVSLCBBQ1BJX0VYRF9PRkZTRVQoZmllbGQucmVnaW9uX29iaiksICJSZWdpb24gT2JqZWN0In0KK307CisKK3N0YXRpYyBzdHJ1Y3QgYWNwaV9leGR1bXBfaW5mbyBhY3BpX2V4X2R1bXBfYmFua19maWVsZFs1XSA9IHsKKwl7QUNQSV9FWERfSU5JVCwgQUNQSV9FWERfVEFCTEVfU0laRShhY3BpX2V4X2R1bXBfYmFua19maWVsZCksIE5VTEx9LAorCXtBQ1BJX0VYRF9GSUVMRCwgMCwgTlVMTH0sCisJe0FDUElfRVhEX1VJTlQzMiwgQUNQSV9FWERfT0ZGU0VUKGJhbmtfZmllbGQudmFsdWUpLCAiVmFsdWUifSwKKwl7QUNQSV9FWERfUE9JTlRFUiwgQUNQSV9FWERfT0ZGU0VUKGJhbmtfZmllbGQucmVnaW9uX29iaiksCisJICJSZWdpb24gT2JqZWN0In0sCisJe0FDUElfRVhEX1BPSU5URVIsIEFDUElfRVhEX09GRlNFVChiYW5rX2ZpZWxkLmJhbmtfb2JqKSwgIkJhbmsgT2JqZWN0In0KK307CisKK3N0YXRpYyBzdHJ1Y3QgYWNwaV9leGR1bXBfaW5mbyBhY3BpX2V4X2R1bXBfaW5kZXhfZmllbGRbNV0gPSB7CisJe0FDUElfRVhEX0lOSVQsIEFDUElfRVhEX1RBQkxFX1NJWkUoYWNwaV9leF9kdW1wX2JhbmtfZmllbGQpLCBOVUxMfSwKKwl7QUNQSV9FWERfRklFTEQsIDAsIE5VTEx9LAorCXtBQ1BJX0VYRF9VSU5UMzIsIEFDUElfRVhEX09GRlNFVChpbmRleF9maWVsZC52YWx1ZSksICJWYWx1ZSJ9LAorCXtBQ1BJX0VYRF9QT0lOVEVSLCBBQ1BJX0VYRF9PRkZTRVQoaW5kZXhfZmllbGQuaW5kZXhfb2JqKSwKKwkgIkluZGV4IE9iamVjdCJ9LAorCXtBQ1BJX0VYRF9QT0lOVEVSLCBBQ1BJX0VYRF9PRkZTRVQoaW5kZXhfZmllbGQuZGF0YV9vYmopLCAiRGF0YSBPYmplY3QifQorfTsKKworc3RhdGljIHN0cnVjdCBhY3BpX2V4ZHVtcF9pbmZvIGFjcGlfZXhfZHVtcF9yZWZlcmVuY2VbOF0gPSB7CisJe0FDUElfRVhEX0lOSVQsIEFDUElfRVhEX1RBQkxFX1NJWkUoYWNwaV9leF9kdW1wX3JlZmVyZW5jZSksIE5VTEx9LAorCXtBQ1BJX0VYRF9VSU5UOCwgQUNQSV9FWERfT0ZGU0VUKHJlZmVyZW5jZS5jbGFzcyksICJDbGFzcyJ9LAorCXtBQ1BJX0VYRF9VSU5UOCwgQUNQSV9FWERfT0ZGU0VUKHJlZmVyZW5jZS50YXJnZXRfdHlwZSksICJUYXJnZXQgVHlwZSJ9LAorCXtBQ1BJX0VYRF9VSU5UMzIsIEFDUElfRVhEX09GRlNFVChyZWZlcmVuY2UudmFsdWUpLCAiVmFsdWUifSwKKwl7QUNQSV9FWERfUE9JTlRFUiwgQUNQSV9FWERfT0ZGU0VUKHJlZmVyZW5jZS5vYmplY3QpLCAiT2JqZWN0IERlc2MifSwKKwl7QUNQSV9FWERfUE9JTlRFUiwgQUNQSV9FWERfT0ZGU0VUKHJlZmVyZW5jZS5ub2RlKSwgIk5vZGUifSwKKwl7QUNQSV9FWERfUE9JTlRFUiwgQUNQSV9FWERfT0ZGU0VUKHJlZmVyZW5jZS53aGVyZSksICJXaGVyZSJ9LAorCXtBQ1BJX0VYRF9SRUZFUkVOQ0UsIDAsIE5VTEx9Cit9OworCitzdGF0aWMgc3RydWN0IGFjcGlfZXhkdW1wX2luZm8gYWNwaV9leF9kdW1wX2FkZHJlc3NfaGFuZGxlcls2XSA9IHsKKwl7QUNQSV9FWERfSU5JVCwgQUNQSV9FWERfVEFCTEVfU0laRShhY3BpX2V4X2R1bXBfYWRkcmVzc19oYW5kbGVyKSwKKwkgTlVMTH0sCisJe0FDUElfRVhEX1VJTlQ4LCBBQ1BJX0VYRF9PRkZTRVQoYWRkcmVzc19zcGFjZS5zcGFjZV9pZCksICJTcGFjZSBJZCJ9LAorCXtBQ1BJX0VYRF9QT0lOVEVSLCBBQ1BJX0VYRF9PRkZTRVQoYWRkcmVzc19zcGFjZS5uZXh0KSwgIk5leHQifSwKKwl7QUNQSV9FWERfUE9JTlRFUiwgQUNQSV9FWERfT0ZGU0VUKGFkZHJlc3Nfc3BhY2UucmVnaW9uX2xpc3QpLAorCSAiUmVnaW9uIExpc3QifSwKKwl7QUNQSV9FWERfUE9JTlRFUiwgQUNQSV9FWERfT0ZGU0VUKGFkZHJlc3Nfc3BhY2Uubm9kZSksICJOb2RlIn0sCisJe0FDUElfRVhEX1BPSU5URVIsIEFDUElfRVhEX09GRlNFVChhZGRyZXNzX3NwYWNlLmNvbnRleHQpLCAiQ29udGV4dCJ9Cit9OworCitzdGF0aWMgc3RydWN0IGFjcGlfZXhkdW1wX2luZm8gYWNwaV9leF9kdW1wX25vdGlmeVszXSA9IHsKKwl7QUNQSV9FWERfSU5JVCwgQUNQSV9FWERfVEFCTEVfU0laRShhY3BpX2V4X2R1bXBfbm90aWZ5KSwgTlVMTH0sCisJe0FDUElfRVhEX1BPSU5URVIsIEFDUElfRVhEX09GRlNFVChub3RpZnkubm9kZSksICJOb2RlIn0sCisJe0FDUElfRVhEX1BPSU5URVIsIEFDUElfRVhEX09GRlNFVChub3RpZnkuY29udGV4dCksICJDb250ZXh0In0KK307CisKKy8qIE1pc2NlbGxhbmVvdXMgdGFibGVzICovCisKK3N0YXRpYyBzdHJ1Y3QgYWNwaV9leGR1bXBfaW5mbyBhY3BpX2V4X2R1bXBfY29tbW9uWzRdID0geworCXtBQ1BJX0VYRF9JTklULCBBQ1BJX0VYRF9UQUJMRV9TSVpFKGFjcGlfZXhfZHVtcF9jb21tb24pLCBOVUxMfSwKKwl7QUNQSV9FWERfVFlQRSwgMCwgTlVMTH0sCisJe0FDUElfRVhEX1VJTlQxNiwgQUNQSV9FWERfT0ZGU0VUKGNvbW1vbi5yZWZlcmVuY2VfY291bnQpLAorCSAiUmVmZXJlbmNlIENvdW50In0sCisJe0FDUElfRVhEX1VJTlQ4LCBBQ1BJX0VYRF9PRkZTRVQoY29tbW9uLmZsYWdzKSwgIkZsYWdzIn0KK307CisKK3N0YXRpYyBzdHJ1Y3QgYWNwaV9leGR1bXBfaW5mbyBhY3BpX2V4X2R1bXBfZmllbGRfY29tbW9uWzddID0geworCXtBQ1BJX0VYRF9JTklULCBBQ1BJX0VYRF9UQUJMRV9TSVpFKGFjcGlfZXhfZHVtcF9maWVsZF9jb21tb24pLCBOVUxMfSwKKwl7QUNQSV9FWERfVUlOVDgsIEFDUElfRVhEX09GRlNFVChjb21tb25fZmllbGQuZmllbGRfZmxhZ3MpLAorCSAiRmllbGQgRmxhZ3MifSwKKwl7QUNQSV9FWERfVUlOVDgsIEFDUElfRVhEX09GRlNFVChjb21tb25fZmllbGQuYWNjZXNzX2J5dGVfd2lkdGgpLAorCSAiQWNjZXNzIEJ5dGUgV2lkdGgifSwKKwl7QUNQSV9FWERfVUlOVDMyLCBBQ1BJX0VYRF9PRkZTRVQoY29tbW9uX2ZpZWxkLmJpdF9sZW5ndGgpLAorCSAiQml0IExlbmd0aCJ9LAorCXtBQ1BJX0VYRF9VSU5UOCwgQUNQSV9FWERfT0ZGU0VUKGNvbW1vbl9maWVsZC5zdGFydF9maWVsZF9iaXRfb2Zmc2V0KSwKKwkgIkZpZWxkIEJpdCBPZmZzZXQifSwKKwl7QUNQSV9FWERfVUlOVDMyLCBBQ1BJX0VYRF9PRkZTRVQoY29tbW9uX2ZpZWxkLmJhc2VfYnl0ZV9vZmZzZXQpLAorCSAiQmFzZSBCeXRlIE9mZnNldCJ9LAorCXtBQ1BJX0VYRF9QT0lOVEVSLCBBQ1BJX0VYRF9PRkZTRVQoY29tbW9uX2ZpZWxkLm5vZGUpLCAiUGFyZW50IE5vZGUifQorfTsKKworc3RhdGljIHN0cnVjdCBhY3BpX2V4ZHVtcF9pbmZvIGFjcGlfZXhfZHVtcF9ub2RlWzVdID0geworCXtBQ1BJX0VYRF9JTklULCBBQ1BJX0VYRF9UQUJMRV9TSVpFKGFjcGlfZXhfZHVtcF9ub2RlKSwgTlVMTH0sCisJe0FDUElfRVhEX1VJTlQ4LCBBQ1BJX0VYRF9OU09GRlNFVChmbGFncyksICJGbGFncyJ9LAorCXtBQ1BJX0VYRF9VSU5UOCwgQUNQSV9FWERfTlNPRkZTRVQob3duZXJfaWQpLCAiT3duZXIgSWQifSwKKwl7QUNQSV9FWERfUE9JTlRFUiwgQUNQSV9FWERfTlNPRkZTRVQoY2hpbGQpLCAiQ2hpbGQgTGlzdCJ9LAorCXtBQ1BJX0VYRF9QT0lOVEVSLCBBQ1BJX0VYRF9OU09GRlNFVChwZWVyKSwgIk5leHQgUGVlciJ9Cit9OworCisvKiBEaXNwYXRjaCB0YWJsZSwgaW5kZXhlZCBieSBvYmplY3QgdHlwZSAqLworCitzdGF0aWMgc3RydWN0IGFjcGlfZXhkdW1wX2luZm8gKmFjcGlfZXhfZHVtcF9pbmZvW10gPSB7CisJTlVMTCwKKwlhY3BpX2V4X2R1bXBfaW50ZWdlciwKKwlhY3BpX2V4X2R1bXBfc3RyaW5nLAorCWFjcGlfZXhfZHVtcF9idWZmZXIsCisJYWNwaV9leF9kdW1wX3BhY2thZ2UsCisJTlVMTCwKKwlhY3BpX2V4X2R1bXBfZGV2aWNlLAorCWFjcGlfZXhfZHVtcF9ldmVudCwKKwlhY3BpX2V4X2R1bXBfbWV0aG9kLAorCWFjcGlfZXhfZHVtcF9tdXRleCwKKwlhY3BpX2V4X2R1bXBfcmVnaW9uLAorCWFjcGlfZXhfZHVtcF9wb3dlciwKKwlhY3BpX2V4X2R1bXBfcHJvY2Vzc29yLAorCWFjcGlfZXhfZHVtcF90aGVybWFsLAorCWFjcGlfZXhfZHVtcF9idWZmZXJfZmllbGQsCisJTlVMTCwKKwlOVUxMLAorCWFjcGlfZXhfZHVtcF9yZWdpb25fZmllbGQsCisJYWNwaV9leF9kdW1wX2JhbmtfZmllbGQsCisJYWNwaV9leF9kdW1wX2luZGV4X2ZpZWxkLAorCWFjcGlfZXhfZHVtcF9yZWZlcmVuY2UsCisJTlVMTCwKKwlOVUxMLAorCWFjcGlfZXhfZHVtcF9ub3RpZnksCisJYWNwaV9leF9kdW1wX2FkZHJlc3NfaGFuZGxlciwKKwlOVUxMLAorCU5VTEwsCisJTlVMTAorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9leF9kdW1wX29iamVjdAorICoKKyAqIFBBUkFNRVRFUlM6ICBvYmpfZGVzYyAgICAgICAgICAgIC0gRGVzY3JpcHRvciB0byBkdW1wCisgKiAgICAgICAgICAgICAgSW5mbyAgICAgICAgICAgICAgICAtIEluZm8gdGFibGUgY29ycmVzcG9uZGluZyB0byB0aGlzIG9iamVjdAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlCisgKgorICogUkVUVVJOOiAgICAgIE5vbmUKKyAqCisgKiBERVNDUklQVElPTjogV2FsayB0aGUgaW5mbyB0YWJsZSBmb3IgdGhpcyBvYmplY3QKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZAorYWNwaV9leF9kdW1wX29iamVjdCh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYywKKwkJICAgIHN0cnVjdCBhY3BpX2V4ZHVtcF9pbmZvICppbmZvKQoreworCXU4ICp0YXJnZXQ7CisJY2hhciAqbmFtZTsKKwl1OCBjb3VudDsKKworCWlmICghaW5mbykgeworCQlhY3BpX29zX3ByaW50ZgorCQkgICAgKCJFeER1bXBPYmplY3Q6IERpc3BsYXkgbm90IGltcGxlbWVudGVkIGZvciBvYmplY3QgdHlwZSAlc1xuIiwKKwkJICAgICBhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lKG9ial9kZXNjKSk7CisJCXJldHVybjsKKwl9CisKKwkvKiBGaXJzdCB0YWJsZSBlbnRyeSBtdXN0IGNvbnRhaW4gdGhlIHRhYmxlIGxlbmd0aCAoIyBvZiB0YWJsZSBlbnRyaWVzKSAqLworCisJY291bnQgPSBpbmZvLT5vZmZzZXQ7CisKKwl3aGlsZSAoY291bnQpIHsKKwkJdGFyZ2V0ID0gQUNQSV9BRERfUFRSKHU4LCBvYmpfZGVzYywgaW5mby0+b2Zmc2V0KTsKKwkJbmFtZSA9IGluZm8tPm5hbWU7CisKKwkJc3dpdGNoIChpbmZvLT5vcGNvZGUpIHsKKwkJY2FzZSBBQ1BJX0VYRF9JTklUOgorCQkJYnJlYWs7CisKKwkJY2FzZSBBQ1BJX0VYRF9UWVBFOgorCQkJYWNwaV9leF9vdXRfc3RyaW5nKCJUeXBlIiwKKwkJCQkJICAgYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZQorCQkJCQkgICAob2JqX2Rlc2MpKTsKKwkJCWJyZWFrOworCisJCWNhc2UgQUNQSV9FWERfVUlOVDg6CisKKwkJCWFjcGlfb3NfcHJpbnRmKCIlMjBzIDogJTIuMlhcbiIsIG5hbWUsICp0YXJnZXQpOworCQkJYnJlYWs7CisKKwkJY2FzZSBBQ1BJX0VYRF9VSU5UMTY6CisKKwkJCWFjcGlfb3NfcHJpbnRmKCIlMjBzIDogJTQuNFhcbiIsIG5hbWUsCisJCQkJICAgICAgIEFDUElfR0VUMTYodGFyZ2V0KSk7CisJCQlicmVhazsKKworCQljYXNlIEFDUElfRVhEX1VJTlQzMjoKKworCQkJYWNwaV9vc19wcmludGYoIiUyMHMgOiAlOC44WFxuIiwgbmFtZSwKKwkJCQkgICAgICAgQUNQSV9HRVQzMih0YXJnZXQpKTsKKwkJCWJyZWFrOworCisJCWNhc2UgQUNQSV9FWERfVUlOVDY0OgorCisJCQlhY3BpX29zX3ByaW50ZigiJTIwcyA6ICU4LjhYJTguOFhcbiIsICJWYWx1ZSIsCisJCQkJICAgICAgIEFDUElfRk9STUFUX1VJTlQ2NChBQ1BJX0dFVDY0KHRhcmdldCkpKTsKKwkJCWJyZWFrOworCisJCWNhc2UgQUNQSV9FWERfUE9JTlRFUjoKKwkJY2FzZSBBQ1BJX0VYRF9BRERSRVNTOgorCisJCQlhY3BpX2V4X291dF9wb2ludGVyKG5hbWUsCisJCQkJCSAgICAqQUNQSV9DQVNUX1BUUih2b2lkICosIHRhcmdldCkpOworCQkJYnJlYWs7CisKKwkJY2FzZSBBQ1BJX0VYRF9TVFJJTkc6CisKKwkJCWFjcGlfdXRfcHJpbnRfc3RyaW5nKG9ial9kZXNjLT5zdHJpbmcucG9pbnRlciwKKwkJCQkJICAgICBBQ1BJX1VJTlQ4X01BWCk7CisJCQlhY3BpX29zX3ByaW50ZigiXG4iKTsKKwkJCWJyZWFrOworCisJCWNhc2UgQUNQSV9FWERfQlVGRkVSOgorCisJCQlBQ1BJX0RVTVBfQlVGRkVSKG9ial9kZXNjLT5idWZmZXIucG9pbnRlciwKKwkJCQkJIG9ial9kZXNjLT5idWZmZXIubGVuZ3RoKTsKKwkJCWJyZWFrOworCisJCWNhc2UgQUNQSV9FWERfUEFDS0FHRToKKworCQkJLyogRHVtcCB0aGUgcGFja2FnZSBjb250ZW50cyAqLworCisJCQlhY3BpX29zX3ByaW50ZigiXG5QYWNrYWdlIENvbnRlbnRzOlxuIik7CisJCQlhY3BpX2V4X2R1bXBfcGFja2FnZV9vYmoob2JqX2Rlc2MsIDAsIDApOworCQkJYnJlYWs7CisKKwkJY2FzZSBBQ1BJX0VYRF9GSUVMRDoKKworCQkJYWNwaV9leF9kdW1wX29iamVjdChvYmpfZGVzYywKKwkJCQkJICAgIGFjcGlfZXhfZHVtcF9maWVsZF9jb21tb24pOworCQkJYnJlYWs7CisKKwkJY2FzZSBBQ1BJX0VYRF9SRUZFUkVOQ0U6CisKKwkJCWFjcGlfZXhfb3V0X3N0cmluZygiQ2xhc3MgTmFtZSIsCisJCQkJCSAgIChjaGFyICopCisJCQkJCSAgIGFjcGlfdXRfZ2V0X3JlZmVyZW5jZV9uYW1lCisJCQkJCSAgIChvYmpfZGVzYykpOworCQkJYWNwaV9leF9kdW1wX3JlZmVyZW5jZV9vYmoob2JqX2Rlc2MpOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWFjcGlfb3NfcHJpbnRmKCIqKioqIEludmFsaWQgdGFibGUgb3Bjb2RlIFslWF0gKioqKlxuIiwKKwkJCQkgICAgICAgaW5mby0+b3Bjb2RlKTsKKwkJCXJldHVybjsKKwkJfQorCisJCWluZm8rKzsKKwkJY291bnQtLTsKKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfZXhfZHVtcF9vcGVyYW5kCisgKgorICogUEFSQU1FVEVSUzogICpvYmpfZGVzYyAgICAgICAtIFBvaW50ZXIgdG8gZW50cnkgdG8gYmUgZHVtcGVkCisgKiAgICAgICAgICAgICAgRGVwdGggICAgICAgICAgIC0gQ3VycmVudCBuZXN0aW5nIGRlcHRoCisgKgorICogUkVUVVJOOiAgICAgIE5vbmUKKyAqCisgKiBERVNDUklQVElPTjogRHVtcCBhbiBvcGVyYW5kIG9iamVjdAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgYWNwaV9leF9kdW1wX29wZXJhbmQodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2MsIHUzMiBkZXB0aCkKK3sKKwl1MzIgbGVuZ3RoOworCXUzMiBpbmRleDsKKworCUFDUElfRlVOQ1RJT05fTkFNRShleF9kdW1wX29wZXJhbmQpCisKKwkgICAgaWYgKCEoKEFDUElfTFZfRVhFQyAmIGFjcGlfZGJnX2xldmVsKQorCQkgICYmIChfQ09NUE9ORU5UICYgYWNwaV9kYmdfbGF5ZXIpKSkgeworCQlyZXR1cm47CisJfQorCisJaWYgKCFvYmpfZGVzYykgeworCisJCS8qIFRoaXMgY291bGQgYmUgYSBudWxsIGVsZW1lbnQgb2YgYSBwYWNrYWdlICovCisKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FWEVDLCAiTnVsbCBPYmplY3QgRGVzY3JpcHRvclxuIikpOworCQlyZXR1cm47CisJfQorCisJaWYgKEFDUElfR0VUX0RFU0NSSVBUT1JfVFlQRShvYmpfZGVzYykgPT0gQUNQSV9ERVNDX1RZUEVfTkFNRUQpIHsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FWEVDLCAiJXAgTmFtZXNwYWNlIE5vZGU6ICIsCisJCQkJICBvYmpfZGVzYykpOworCQlBQ1BJX0RVTVBfRU5UUlkob2JqX2Rlc2MsIEFDUElfTFZfRVhFQyk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoQUNQSV9HRVRfREVTQ1JJUFRPUl9UWVBFKG9ial9kZXNjKSAhPSBBQ1BJX0RFU0NfVFlQRV9PUEVSQU5EKSB7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVhFQywKKwkJCQkgICIlcCBpcyBub3QgYSBub2RlIG9yIG9wZXJhbmQgb2JqZWN0OiBbJXNdXG4iLAorCQkJCSAgb2JqX2Rlc2MsCisJCQkJICBhY3BpX3V0X2dldF9kZXNjcmlwdG9yX25hbWUob2JqX2Rlc2MpKSk7CisJCUFDUElfRFVNUF9CVUZGRVIob2JqX2Rlc2MsIHNpemVvZih1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0KSk7CisJCXJldHVybjsKKwl9CisKKwkvKiBvYmpfZGVzYyBpcyBhIHZhbGlkIG9iamVjdCAqLworCisJaWYgKGRlcHRoID4gMCkgeworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VYRUMsICIlKnNbJXVdICVwICIsCisJCQkJICBkZXB0aCwgIiAiLCBkZXB0aCwgb2JqX2Rlc2MpKTsKKwl9IGVsc2UgeworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VYRUMsICIlcCAiLCBvYmpfZGVzYykpOworCX0KKworCS8qIERlY29kZSBvYmplY3QgdHlwZSAqLworCisJc3dpdGNoIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRShvYmpfZGVzYykpIHsKKwljYXNlIEFDUElfVFlQRV9MT0NBTF9SRUZFUkVOQ0U6CisKKwkJYWNwaV9vc19wcmludGYoIlJlZmVyZW5jZTogWyVzXSAiLAorCQkJICAgICAgIGFjcGlfdXRfZ2V0X3JlZmVyZW5jZV9uYW1lKG9ial9kZXNjKSk7CisKKwkJc3dpdGNoIChvYmpfZGVzYy0+cmVmZXJlbmNlLmNsYXNzKSB7CisJCWNhc2UgQUNQSV9SRUZDTEFTU19ERUJVRzoKKworCQkJYWNwaV9vc19wcmludGYoIlxuIik7CisJCQlicmVhazsKKworCQljYXNlIEFDUElfUkVGQ0xBU1NfSU5ERVg6CisKKwkJCWFjcGlfb3NfcHJpbnRmKCIlcFxuIiwgb2JqX2Rlc2MtPnJlZmVyZW5jZS5vYmplY3QpOworCQkJYnJlYWs7CisKKwkJY2FzZSBBQ1BJX1JFRkNMQVNTX1RBQkxFOgorCisJCQlhY3BpX29zX3ByaW50ZigiVGFibGUgSW5kZXggJVhcbiIsCisJCQkJICAgICAgIG9ial9kZXNjLT5yZWZlcmVuY2UudmFsdWUpOworCQkJYnJlYWs7CisKKwkJY2FzZSBBQ1BJX1JFRkNMQVNTX1JFRk9GOgorCisJCQlhY3BpX29zX3ByaW50ZigiJXAgWyVzXVxuIiwgb2JqX2Rlc2MtPnJlZmVyZW5jZS5vYmplY3QsCisJCQkJICAgICAgIGFjcGlfdXRfZ2V0X3R5cGVfbmFtZSgoKHVuaW9uCisJCQkJCQkJICAgICAgIGFjcGlfb3BlcmFuZF9vYmplY3QKKwkJCQkJCQkgICAgICAgKikKKwkJCQkJCQkgICAgICBvYmpfZGVzYy0+CisJCQkJCQkJICAgICAgcmVmZXJlbmNlLgorCQkJCQkJCSAgICAgIG9iamVjdCktPmNvbW1vbi4KKwkJCQkJCQkgICAgIHR5cGUpKTsKKwkJCWJyZWFrOworCisJCWNhc2UgQUNQSV9SRUZDTEFTU19BUkc6CisKKwkJCWFjcGlfb3NfcHJpbnRmKCIlWCIsIG9ial9kZXNjLT5yZWZlcmVuY2UudmFsdWUpOworCisJCQlpZiAoQUNQSV9HRVRfT0JKRUNUX1RZUEUob2JqX2Rlc2MpID09IEFDUElfVFlQRV9JTlRFR0VSKSB7CisKKwkJCQkvKiBWYWx1ZSBpcyBhbiBJbnRlZ2VyICovCisKKwkJCQlhY3BpX29zX3ByaW50ZigiIHZhbHVlIGlzIFslOC44WCU4Ljh4XSIsCisJCQkJCSAgICAgICBBQ1BJX0ZPUk1BVF9VSU5UNjQob2JqX2Rlc2MtPgorCQkJCQkJCQkgIGludGVnZXIuCisJCQkJCQkJCSAgdmFsdWUpKTsKKwkJCX0KKworCQkJYWNwaV9vc19wcmludGYoIlxuIik7CisJCQlicmVhazsKKworCQljYXNlIEFDUElfUkVGQ0xBU1NfTE9DQUw6CisKKwkJCWFjcGlfb3NfcHJpbnRmKCIlWCIsIG9ial9kZXNjLT5yZWZlcmVuY2UudmFsdWUpOworCisJCQlpZiAoQUNQSV9HRVRfT0JKRUNUX1RZUEUob2JqX2Rlc2MpID09IEFDUElfVFlQRV9JTlRFR0VSKSB7CisKKwkJCQkvKiBWYWx1ZSBpcyBhbiBJbnRlZ2VyICovCisKKwkJCQlhY3BpX29zX3ByaW50ZigiIHZhbHVlIGlzIFslOC44WCU4Ljh4XSIsCisJCQkJCSAgICAgICBBQ1BJX0ZPUk1BVF9VSU5UNjQob2JqX2Rlc2MtPgorCQkJCQkJCQkgIGludGVnZXIuCisJCQkJCQkJCSAgdmFsdWUpKTsKKwkJCX0KKworCQkJYWNwaV9vc19wcmludGYoIlxuIik7CisJCQlicmVhazsKKworCQljYXNlIEFDUElfUkVGQ0xBU1NfTkFNRToKKworCQkJYWNwaV9vc19wcmludGYoIi0gWyU0LjRzXVxuIiwKKwkJCQkgICAgICAgb2JqX2Rlc2MtPnJlZmVyZW5jZS5ub2RlLT5uYW1lLmFzY2lpKTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CS8qIFVua25vd24gcmVmZXJlbmNlIGNsYXNzICovCisKKwkJCWFjcGlfb3NfcHJpbnRmKCIlMi4yWFxuIiwgb2JqX2Rlc2MtPnJlZmVyZW5jZS5jbGFzcyk7CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKworCWNhc2UgQUNQSV9UWVBFX0JVRkZFUjoKKworCQlhY3BpX29zX3ByaW50ZigiQnVmZmVyIGxlbmd0aCAlLjJYIEAgJXBcbiIsCisJCQkgICAgICAgb2JqX2Rlc2MtPmJ1ZmZlci5sZW5ndGgsCisJCQkgICAgICAgb2JqX2Rlc2MtPmJ1ZmZlci5wb2ludGVyKTsKKworCQkvKiBEZWJ1ZyBvbmx5IC0tIGR1bXAgdGhlIGJ1ZmZlciBjb250ZW50cyAqLworCisJCWlmIChvYmpfZGVzYy0+YnVmZmVyLnBvaW50ZXIpIHsKKwkJCWxlbmd0aCA9IG9ial9kZXNjLT5idWZmZXIubGVuZ3RoOworCQkJaWYgKGxlbmd0aCA+IDEyOCkgeworCQkJCWxlbmd0aCA9IDEyODsKKwkJCX0KKworCQkJYWNwaV9vc19wcmludGYKKwkJCSAgICAoIkJ1ZmZlciBDb250ZW50czogKGRpc3BsYXlpbmcgbGVuZ3RoIDB4JS4yWClcbiIsCisJCQkgICAgIGxlbmd0aCk7CisJCQlBQ1BJX0RVTVBfQlVGRkVSKG9ial9kZXNjLT5idWZmZXIucG9pbnRlciwgbGVuZ3RoKTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgQUNQSV9UWVBFX0lOVEVHRVI6CisKKwkJYWNwaV9vc19wcmludGYoIkludGVnZXIgJTguOFglOC44WFxuIiwKKwkJCSAgICAgICBBQ1BJX0ZPUk1BVF9VSU5UNjQob2JqX2Rlc2MtPmludGVnZXIudmFsdWUpKTsKKwkJYnJlYWs7CisKKwljYXNlIEFDUElfVFlQRV9QQUNLQUdFOgorCisJCWFjcGlfb3NfcHJpbnRmKCJQYWNrYWdlIFtMZW4gJVhdIEVsZW1lbnRBcnJheSAlcFxuIiwKKwkJCSAgICAgICBvYmpfZGVzYy0+cGFja2FnZS5jb3VudCwKKwkJCSAgICAgICBvYmpfZGVzYy0+cGFja2FnZS5lbGVtZW50cyk7CisKKwkJLyoKKwkJICogSWYgZWxlbWVudHMgZXhpc3QsIHBhY2thZ2UgZWxlbWVudCBwb2ludGVyIGlzIHZhbGlkLAorCQkgKiBhbmQgZGVidWdfbGV2ZWwgZXhjZWVkcyAxLCBkdW1wIHBhY2thZ2UncyBlbGVtZW50cy4KKwkJICovCisJCWlmIChvYmpfZGVzYy0+cGFja2FnZS5jb3VudCAmJgorCQkgICAgb2JqX2Rlc2MtPnBhY2thZ2UuZWxlbWVudHMgJiYgYWNwaV9kYmdfbGV2ZWwgPiAxKSB7CisJCQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBvYmpfZGVzYy0+cGFja2FnZS5jb3VudDsKKwkJCSAgICAgaW5kZXgrKykgeworCQkJCWFjcGlfZXhfZHVtcF9vcGVyYW5kKG9ial9kZXNjLT5wYWNrYWdlLgorCQkJCQkJICAgICBlbGVtZW50c1tpbmRleF0sCisJCQkJCQkgICAgIGRlcHRoICsgMSk7CisJCQl9CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIEFDUElfVFlQRV9SRUdJT046CisKKwkJYWNwaV9vc19wcmludGYoIlJlZ2lvbiAlcyAoJVgpIiwKKwkJCSAgICAgICBhY3BpX3V0X2dldF9yZWdpb25fbmFtZShvYmpfZGVzYy0+cmVnaW9uLgorCQkJCQkJICAgICAgIHNwYWNlX2lkKSwKKwkJCSAgICAgICBvYmpfZGVzYy0+cmVnaW9uLnNwYWNlX2lkKTsKKworCQkvKgorCQkgKiBJZiB0aGUgYWRkcmVzcyBhbmQgbGVuZ3RoIGhhdmUgbm90IGJlZW4gZXZhbHVhdGVkLAorCQkgKiBkb24ndCBwcmludCB0aGVtLgorCQkgKi8KKwkJaWYgKCEob2JqX2Rlc2MtPnJlZ2lvbi5mbGFncyAmIEFPUE9CSl9EQVRBX1ZBTElEKSkgeworCQkJYWNwaV9vc19wcmludGYoIlxuIik7CisJCX0gZWxzZSB7CisJCQlhY3BpX29zX3ByaW50ZigiIGJhc2UgJTguOFglOC44WCBMZW5ndGggJVhcbiIsCisJCQkJICAgICAgIEFDUElfRk9STUFUX05BVElWRV9VSU5UKG9ial9kZXNjLT5yZWdpb24uCisJCQkJCQkJICAgICAgIGFkZHJlc3MpLAorCQkJCSAgICAgICBvYmpfZGVzYy0+cmVnaW9uLmxlbmd0aCk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIEFDUElfVFlQRV9TVFJJTkc6CisKKwkJYWNwaV9vc19wcmludGYoIlN0cmluZyBsZW5ndGggJVggQCAlcCAiLAorCQkJICAgICAgIG9ial9kZXNjLT5zdHJpbmcubGVuZ3RoLAorCQkJICAgICAgIG9ial9kZXNjLT5zdHJpbmcucG9pbnRlcik7CisKKwkJYWNwaV91dF9wcmludF9zdHJpbmcob2JqX2Rlc2MtPnN0cmluZy5wb2ludGVyLCBBQ1BJX1VJTlQ4X01BWCk7CisJCWFjcGlfb3NfcHJpbnRmKCJcbiIpOworCQlicmVhazsKKworCWNhc2UgQUNQSV9UWVBFX0xPQ0FMX0JBTktfRklFTEQ6CisKKwkJYWNwaV9vc19wcmludGYoIkJhbmtGaWVsZFxuIik7CisJCWJyZWFrOworCisJY2FzZSBBQ1BJX1RZUEVfTE9DQUxfUkVHSU9OX0ZJRUxEOgorCisJCWFjcGlfb3NfcHJpbnRmCisJCSAgICAoIlJlZ2lvbkZpZWxkOiBCaXRzPSVYIEFjY1dpZHRoPSVYIExvY2s9JVggVXBkYXRlPSVYIGF0IGJ5dGU9JVggYml0PSVYIG9mIGJlbG93OlxuIiwKKwkJICAgICBvYmpfZGVzYy0+ZmllbGQuYml0X2xlbmd0aCwKKwkJICAgICBvYmpfZGVzYy0+ZmllbGQuYWNjZXNzX2J5dGVfd2lkdGgsCisJCSAgICAgb2JqX2Rlc2MtPmZpZWxkLmZpZWxkX2ZsYWdzICYgQU1MX0ZJRUxEX0xPQ0tfUlVMRV9NQVNLLAorCQkgICAgIG9ial9kZXNjLT5maWVsZC5maWVsZF9mbGFncyAmIEFNTF9GSUVMRF9VUERBVEVfUlVMRV9NQVNLLAorCQkgICAgIG9ial9kZXNjLT5maWVsZC5iYXNlX2J5dGVfb2Zmc2V0LAorCQkgICAgIG9ial9kZXNjLT5maWVsZC5zdGFydF9maWVsZF9iaXRfb2Zmc2V0KTsKKworCQlhY3BpX2V4X2R1bXBfb3BlcmFuZChvYmpfZGVzYy0+ZmllbGQucmVnaW9uX29iaiwgZGVwdGggKyAxKTsKKwkJYnJlYWs7CisKKwljYXNlIEFDUElfVFlQRV9MT0NBTF9JTkRFWF9GSUVMRDoKKworCQlhY3BpX29zX3ByaW50ZigiSW5kZXhGaWVsZFxuIik7CisJCWJyZWFrOworCisJY2FzZSBBQ1BJX1RZUEVfQlVGRkVSX0ZJRUxEOgorCisJCWFjcGlfb3NfcHJpbnRmKCJCdWZmZXJGaWVsZDogJVggYml0cyBhdCBieXRlICVYIGJpdCAlWCBvZlxuIiwKKwkJCSAgICAgICBvYmpfZGVzYy0+YnVmZmVyX2ZpZWxkLmJpdF9sZW5ndGgsCisJCQkgICAgICAgb2JqX2Rlc2MtPmJ1ZmZlcl9maWVsZC5iYXNlX2J5dGVfb2Zmc2V0LAorCQkJICAgICAgIG9ial9kZXNjLT5idWZmZXJfZmllbGQuc3RhcnRfZmllbGRfYml0X29mZnNldCk7CisKKwkJaWYgKCFvYmpfZGVzYy0+YnVmZmVyX2ZpZWxkLmJ1ZmZlcl9vYmopIHsKKwkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVhFQywgIipOVUxMKlxuIikpOworCQl9IGVsc2UKKwkJICAgIGlmIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRShvYmpfZGVzYy0+YnVmZmVyX2ZpZWxkLmJ1ZmZlcl9vYmopCisJCQkhPSBBQ1BJX1RZUEVfQlVGRkVSKSB7CisJCQlhY3BpX29zX3ByaW50ZigiKm5vdCBhIEJ1ZmZlcipcbiIpOworCQl9IGVsc2UgeworCQkJYWNwaV9leF9kdW1wX29wZXJhbmQob2JqX2Rlc2MtPmJ1ZmZlcl9maWVsZC5idWZmZXJfb2JqLAorCQkJCQkgICAgIGRlcHRoICsgMSk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIEFDUElfVFlQRV9FVkVOVDoKKworCQlhY3BpX29zX3ByaW50ZigiRXZlbnRcbiIpOworCQlicmVhazsKKworCWNhc2UgQUNQSV9UWVBFX01FVEhPRDoKKworCQlhY3BpX29zX3ByaW50ZigiTWV0aG9kKCVYKSBAICVwOiVYXG4iLAorCQkJICAgICAgIG9ial9kZXNjLT5tZXRob2QucGFyYW1fY291bnQsCisJCQkgICAgICAgb2JqX2Rlc2MtPm1ldGhvZC5hbWxfc3RhcnQsCisJCQkgICAgICAgb2JqX2Rlc2MtPm1ldGhvZC5hbWxfbGVuZ3RoKTsKKwkJYnJlYWs7CisKKwljYXNlIEFDUElfVFlQRV9NVVRFWDoKKworCQlhY3BpX29zX3ByaW50ZigiTXV0ZXhcbiIpOworCQlicmVhazsKKworCWNhc2UgQUNQSV9UWVBFX0RFVklDRToKKworCQlhY3BpX29zX3ByaW50ZigiRGV2aWNlXG4iKTsKKwkJYnJlYWs7CisKKwljYXNlIEFDUElfVFlQRV9QT1dFUjoKKworCQlhY3BpX29zX3ByaW50ZigiUG93ZXJcbiIpOworCQlicmVhazsKKworCWNhc2UgQUNQSV9UWVBFX1BST0NFU1NPUjoKKworCQlhY3BpX29zX3ByaW50ZigiUHJvY2Vzc29yXG4iKTsKKwkJYnJlYWs7CisKKwljYXNlIEFDUElfVFlQRV9USEVSTUFMOgorCisJCWFjcGlfb3NfcHJpbnRmKCJUaGVybWFsXG4iKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQkvKiBVbmtub3duIFR5cGUgKi8KKworCQlhY3BpX29zX3ByaW50ZigiVW5rbm93biBUeXBlICVYXG4iLAorCQkJICAgICAgIEFDUElfR0VUX09CSkVDVF9UWVBFKG9ial9kZXNjKSk7CisJCWJyZWFrOworCX0KKworCXJldHVybjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9leF9kdW1wX29wZXJhbmRzCisgKgorICogUEFSQU1FVEVSUzoJT3BlcmFuZHMJICAgIC0gQSBsaXN0IG9mIE9wZXJhbmQgb2JqZWN0cworICoJCW9wY29kZV9uYW1lCSAgICAtIEFNTCBvcGNvZGUgbmFtZQorICoJCW51bV9vcGVyYW5kcwkgICAgLSBPcGVyYW5kIGNvdW50IGZvciB0aGlzIG9wY29kZQorICoKKyAqIERFU0NSSVBUSU9OOiBEdW1wIHRoZSBvcGVyYW5kcyBhc3NvY2lhdGVkIHdpdGggdGhlIG9wY29kZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQKK2FjcGlfZXhfZHVtcF9vcGVyYW5kcyh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICoqb3BlcmFuZHMsCisJCSAgICAgIGNvbnN0IGNoYXIgKm9wY29kZV9uYW1lLCB1MzIgbnVtX29wZXJhbmRzKQoreworCUFDUElfRlVOQ1RJT05fTkFNRShleF9kdW1wX29wZXJhbmRzKTsKKworCWlmICghb3Bjb2RlX25hbWUpIHsKKwkJb3Bjb2RlX25hbWUgPSAiVU5LTk9XTiI7CisJfQorCisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FWEVDLAorCQkJICAiKioqKiBTdGFydCBvcGVyYW5kIGR1bXAgZm9yIG9wY29kZSBbJXNdLCAlZCBvcGVyYW5kc1xuIiwKKwkJCSAgb3Bjb2RlX25hbWUsIG51bV9vcGVyYW5kcykpOworCisJaWYgKG51bV9vcGVyYW5kcyA9PSAwKSB7CisJCW51bV9vcGVyYW5kcyA9IDE7CisJfQorCisJLyogRHVtcCB0aGUgaW5kaXZpZHVhbCBvcGVyYW5kcyAqLworCisJd2hpbGUgKG51bV9vcGVyYW5kcykgeworCQlhY3BpX2V4X2R1bXBfb3BlcmFuZCgqb3BlcmFuZHMsIDApOworCQlvcGVyYW5kcysrOworCQludW1fb3BlcmFuZHMtLTsKKwl9CisKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VYRUMsCisJCQkgICIqKioqIEVuZCBvcGVyYW5kIGR1bXAgZm9yIFslc11cbiIsIG9wY29kZV9uYW1lKSk7CisJcmV0dXJuOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X291dCogZnVuY3Rpb25zCisgKgorICogUEFSQU1FVEVSUzogIFRpdGxlICAgICAgICAgICAgICAgLSBEZXNjcmlwdGl2ZSB0ZXh0CisgKiAgICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgICAtIFZhbHVlIHRvIGJlIGRpc3BsYXllZAorICoKKyAqIERFU0NSSVBUSU9OOiBPYmplY3QgZHVtcCBvdXRwdXQgZm9ybWF0dGluZyBmdW5jdGlvbnMuICBUaGVzZSBmdW5jdGlvbnMKKyAqICAgICAgICAgICAgICByZWR1Y2UgdGhlIG51bWJlciBvZiBmb3JtYXQgc3RyaW5ncyByZXF1aXJlZCBhbmQga2VlcHMgdGhlbQorICogICAgICAgICAgICAgIGFsbCBpbiBvbmUgcGxhY2UgZm9yIGVhc3kgbW9kaWZpY2F0aW9uLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkIGFjcGlfZXhfb3V0X3N0cmluZyhjaGFyICp0aXRsZSwgY2hhciAqdmFsdWUpCit7CisJYWNwaV9vc19wcmludGYoIiUyMHMgOiAlc1xuIiwgdGl0bGUsIHZhbHVlKTsKK30KKworc3RhdGljIHZvaWQgYWNwaV9leF9vdXRfcG9pbnRlcihjaGFyICp0aXRsZSwgdm9pZCAqdmFsdWUpCit7CisJYWNwaV9vc19wcmludGYoIiUyMHMgOiAlcFxuIiwgdGl0bGUsIHZhbHVlKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9leF9kdW1wX25hbWVzcGFjZV9ub2RlCisgKgorICogUEFSQU1FVEVSUzogIE5vZGUgICAgICAgICAgICAgICAgLSBEZXNjcmlwdG9yIHRvIGR1bXAKKyAqICAgICAgICAgICAgICBGbGFncyAgICAgICAgICAgICAgIC0gRm9yY2UgZGlzcGxheSBpZiBUUlVFCisgKgorICogREVTQ1JJUFRJT046IER1bXBzIHRoZSBtZW1iZXJzIG9mIHRoZSBnaXZlbi5Ob2RlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBhY3BpX2V4X2R1bXBfbmFtZXNwYWNlX25vZGUoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGUsIHUzMiBmbGFncykKK3sKKworCUFDUElfRlVOQ1RJT05fRU5UUlkoKTsKKworCWlmICghZmxhZ3MpIHsKKwkJaWYgKCEoKEFDUElfTFZfT0JKRUNUUyAmIGFjcGlfZGJnX2xldmVsKQorCQkgICAgICAmJiAoX0NPTVBPTkVOVCAmIGFjcGlfZGJnX2xheWVyKSkpIHsKKwkJCXJldHVybjsKKwkJfQorCX0KKworCWFjcGlfb3NfcHJpbnRmKCIlMjBzIDogJTQuNHNcbiIsICJOYW1lIiwgYWNwaV91dF9nZXRfbm9kZV9uYW1lKG5vZGUpKTsKKwlhY3BpX2V4X291dF9zdHJpbmcoIlR5cGUiLCBhY3BpX3V0X2dldF90eXBlX25hbWUobm9kZS0+dHlwZSkpOworCWFjcGlfZXhfb3V0X3BvaW50ZXIoIkF0dGFjaGVkIE9iamVjdCIsCisJCQkgICAgYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0KG5vZGUpKTsKKwlhY3BpX2V4X291dF9wb2ludGVyKCJQYXJlbnQiLCBhY3BpX25zX2dldF9wYXJlbnRfbm9kZShub2RlKSk7CisKKwlhY3BpX2V4X2R1bXBfb2JqZWN0KEFDUElfQ0FTVF9QVFIodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCwgbm9kZSksCisJCQkgICAgYWNwaV9leF9kdW1wX25vZGUpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X2R1bXBfcmVmZXJlbmNlX29iagorICoKKyAqIFBBUkFNRVRFUlM6ICBPYmplY3QgICAgICAgICAgICAgIC0gRGVzY3JpcHRvciB0byBkdW1wCisgKgorICogREVTQ1JJUFRJT046IER1bXBzIGEgcmVmZXJlbmNlIG9iamVjdAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkIGFjcGlfZXhfZHVtcF9yZWZlcmVuY2Vfb2JqKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjKQoreworCXN0cnVjdCBhY3BpX2J1ZmZlciByZXRfYnVmOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKworCXJldF9idWYubGVuZ3RoID0gQUNQSV9BTExPQ0FURV9MT0NBTF9CVUZGRVI7CisKKwlpZiAob2JqX2Rlc2MtPnJlZmVyZW5jZS5jbGFzcyA9PSBBQ1BJX1JFRkNMQVNTX05BTUUpIHsKKwkJYWNwaV9vc19wcmludGYoIiAlcCAiLCBvYmpfZGVzYy0+cmVmZXJlbmNlLm5vZGUpOworCisJCXN0YXR1cyA9CisJCSAgICBhY3BpX25zX2hhbmRsZV90b19wYXRobmFtZShvYmpfZGVzYy0+cmVmZXJlbmNlLm5vZGUsCisJCQkJCSAgICAgICAmcmV0X2J1Zik7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJYWNwaV9vc19wcmludGYoIiBDb3VsZCBub3QgY29udmVydCBuYW1lIHRvIHBhdGhuYW1lXG4iKTsKKwkJfSBlbHNlIHsKKwkJCWFjcGlfb3NfcHJpbnRmKCIlc1xuIiwgKGNoYXIgKilyZXRfYnVmLnBvaW50ZXIpOworCQkJQUNQSV9GUkVFKHJldF9idWYucG9pbnRlcik7CisJCX0KKwl9IGVsc2UgaWYgKG9ial9kZXNjLT5yZWZlcmVuY2Uub2JqZWN0KSB7CisJCWlmIChBQ1BJX0dFVF9ERVNDUklQVE9SX1RZUEUob2JqX2Rlc2MpID09CisJCSAgICBBQ1BJX0RFU0NfVFlQRV9PUEVSQU5EKSB7CisJCQlhY3BpX29zX3ByaW50ZigiIFRhcmdldDogJXAiLAorCQkJCSAgICAgICBvYmpfZGVzYy0+cmVmZXJlbmNlLm9iamVjdCk7CisJCQlpZiAob2JqX2Rlc2MtPnJlZmVyZW5jZS5jbGFzcyA9PSBBQ1BJX1JFRkNMQVNTX1RBQkxFKSB7CisJCQkJYWNwaV9vc19wcmludGYoIiBUYWJsZSBJbmRleDogJVhcbiIsCisJCQkJCSAgICAgICBvYmpfZGVzYy0+cmVmZXJlbmNlLnZhbHVlKTsKKwkJCX0gZWxzZSB7CisJCQkJYWNwaV9vc19wcmludGYoIiBUYXJnZXQ6ICVwIFslc11cbiIsCisJCQkJCSAgICAgICBvYmpfZGVzYy0+cmVmZXJlbmNlLm9iamVjdCwKKwkJCQkJICAgICAgIGFjcGlfdXRfZ2V0X3R5cGVfbmFtZSgoKHVuaW9uCisJCQkJCQkJCSAgICAgICBhY3BpX29wZXJhbmRfb2JqZWN0CisJCQkJCQkJCSAgICAgICAqKQorCQkJCQkJCQkgICAgICBvYmpfZGVzYy0+CisJCQkJCQkJCSAgICAgIHJlZmVyZW5jZS4KKwkJCQkJCQkJICAgICAgb2JqZWN0KS0+CisJCQkJCQkJCSAgICAgY29tbW9uLgorCQkJCQkJCQkgICAgIHR5cGUpKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWFjcGlfb3NfcHJpbnRmKCIgVGFyZ2V0OiAlcFxuIiwKKwkJCQkgICAgICAgb2JqX2Rlc2MtPnJlZmVyZW5jZS5vYmplY3QpOworCQl9CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X2R1bXBfcGFja2FnZV9vYmoKKyAqCisgKiBQQVJBTUVURVJTOiAgb2JqX2Rlc2MgICAgICAgICAgICAtIERlc2NyaXB0b3IgdG8gZHVtcAorICogICAgICAgICAgICAgIExldmVsICAgICAgICAgICAgICAgLSBJbmRlbnRhdGlvbiBMZXZlbAorICogICAgICAgICAgICAgIEluZGV4ICAgICAgICAgICAgICAgLSBQYWNrYWdlIGluZGV4IGZvciB0aGlzIG9iamVjdAorICoKKyAqIERFU0NSSVBUSU9OOiBEdW1wcyB0aGUgZWxlbWVudHMgb2YgdGhlIHBhY2thZ2UKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZAorYWNwaV9leF9kdW1wX3BhY2thZ2Vfb2JqKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjLAorCQkJIHUzMiBsZXZlbCwgdTMyIGluZGV4KQoreworCXUzMiBpOworCisJLyogSW5kZW50YXRpb24gYW5kIGluZGV4IG91dHB1dCAqLworCisJaWYgKGxldmVsID4gMCkgeworCQlmb3IgKGkgPSAwOyBpIDwgbGV2ZWw7IGkrKykgeworCQkJYWNwaV9vc19wcmludGYoIiAiKTsKKwkJfQorCisJCWFjcGlfb3NfcHJpbnRmKCJbJS4yZF0gIiwgaW5kZXgpOworCX0KKworCWFjcGlfb3NfcHJpbnRmKCIlcCAiLCBvYmpfZGVzYyk7CisKKwkvKiBOdWxsIHBhY2thZ2UgZWxlbWVudHMgYXJlIGFsbG93ZWQgKi8KKworCWlmICghb2JqX2Rlc2MpIHsKKwkJYWNwaV9vc19wcmludGYoIltOdWxsIE9iamVjdF1cbiIpOworCQlyZXR1cm47CisJfQorCisJLyogUGFja2FnZXMgbWF5IG9ubHkgY29udGFpbiBhIGZldyBvYmplY3QgdHlwZXMgKi8KKworCXN3aXRjaCAoQUNQSV9HRVRfT0JKRUNUX1RZUEUob2JqX2Rlc2MpKSB7CisJY2FzZSBBQ1BJX1RZUEVfSU5URUdFUjoKKworCQlhY3BpX29zX3ByaW50ZigiW0ludGVnZXJdID0gJTguOFglOC44WFxuIiwKKwkJCSAgICAgICBBQ1BJX0ZPUk1BVF9VSU5UNjQob2JqX2Rlc2MtPmludGVnZXIudmFsdWUpKTsKKwkJYnJlYWs7CisKKwljYXNlIEFDUElfVFlQRV9TVFJJTkc6CisKKwkJYWNwaV9vc19wcmludGYoIltTdHJpbmddIFZhbHVlOiAiKTsKKwkJZm9yIChpID0gMDsgaSA8IG9ial9kZXNjLT5zdHJpbmcubGVuZ3RoOyBpKyspIHsKKwkJCWFjcGlfb3NfcHJpbnRmKCIlYyIsIG9ial9kZXNjLT5zdHJpbmcucG9pbnRlcltpXSk7CisJCX0KKwkJYWNwaV9vc19wcmludGYoIlxuIik7CisJCWJyZWFrOworCisJY2FzZSBBQ1BJX1RZUEVfQlVGRkVSOgorCisJCWFjcGlfb3NfcHJpbnRmKCJbQnVmZmVyXSBMZW5ndGggJS4yWCA9ICIsCisJCQkgICAgICAgb2JqX2Rlc2MtPmJ1ZmZlci5sZW5ndGgpOworCQlpZiAob2JqX2Rlc2MtPmJ1ZmZlci5sZW5ndGgpIHsKKwkJCWFjcGlfdXRfZHVtcF9idWZmZXIoQUNQSV9DQVNUX1BUUgorCQkJCQkgICAgKHU4LCBvYmpfZGVzYy0+YnVmZmVyLnBvaW50ZXIpLAorCQkJCQkgICAgb2JqX2Rlc2MtPmJ1ZmZlci5sZW5ndGgsCisJCQkJCSAgICBEQl9EV09SRF9ESVNQTEFZLCBfQ09NUE9ORU5UKTsKKwkJfSBlbHNlIHsKKwkJCWFjcGlfb3NfcHJpbnRmKCJcbiIpOworCQl9CisJCWJyZWFrOworCisJY2FzZSBBQ1BJX1RZUEVfUEFDS0FHRToKKworCQlhY3BpX29zX3ByaW50ZigiW1BhY2thZ2VdIENvbnRhaW5zICVkIEVsZW1lbnRzOlxuIiwKKwkJCSAgICAgICBvYmpfZGVzYy0+cGFja2FnZS5jb3VudCk7CisKKwkJZm9yIChpID0gMDsgaSA8IG9ial9kZXNjLT5wYWNrYWdlLmNvdW50OyBpKyspIHsKKwkJCWFjcGlfZXhfZHVtcF9wYWNrYWdlX29iaihvYmpfZGVzYy0+cGFja2FnZS5lbGVtZW50c1tpXSwKKwkJCQkJCSBsZXZlbCArIDEsIGkpOworCQl9CisJCWJyZWFrOworCisJY2FzZSBBQ1BJX1RZUEVfTE9DQUxfUkVGRVJFTkNFOgorCisJCWFjcGlfb3NfcHJpbnRmKCJbT2JqZWN0IFJlZmVyZW5jZV0gVHlwZSBbJXNdICUyLjJYIiwKKwkJCSAgICAgICBhY3BpX3V0X2dldF9yZWZlcmVuY2VfbmFtZShvYmpfZGVzYyksCisJCQkgICAgICAgb2JqX2Rlc2MtPnJlZmVyZW5jZS5jbGFzcyk7CisJCWFjcGlfZXhfZHVtcF9yZWZlcmVuY2Vfb2JqKG9ial9kZXNjKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCisJCWFjcGlfb3NfcHJpbnRmKCJbVW5rbm93biBUeXBlXSAlWFxuIiwKKwkJCSAgICAgICBBQ1BJX0dFVF9PQkpFQ1RfVFlQRShvYmpfZGVzYykpOworCQlicmVhazsKKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfZXhfZHVtcF9vYmplY3RfZGVzY3JpcHRvcgorICoKKyAqIFBBUkFNRVRFUlM6ICBvYmpfZGVzYyAgICAgICAgICAgIC0gRGVzY3JpcHRvciB0byBkdW1wCisgKiAgICAgICAgICAgICAgRmxhZ3MgICAgICAgICAgICAgICAtIEZvcmNlIGRpc3BsYXkgaWYgVFJVRQorICoKKyAqIERFU0NSSVBUSU9OOiBEdW1wcyB0aGUgbWVtYmVycyBvZiB0aGUgb2JqZWN0IGRlc2NyaXB0b3IgZ2l2ZW4uCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZAorYWNwaV9leF9kdW1wX29iamVjdF9kZXNjcmlwdG9yKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjLCB1MzIgZmxhZ3MpCit7CisJQUNQSV9GVU5DVElPTl9UUkFDRShleF9kdW1wX29iamVjdF9kZXNjcmlwdG9yKTsKKworCWlmICghb2JqX2Rlc2MpIHsKKwkJcmV0dXJuX1ZPSUQ7CisJfQorCisJaWYgKCFmbGFncykgeworCQlpZiAoISgoQUNQSV9MVl9PQkpFQ1RTICYgYWNwaV9kYmdfbGV2ZWwpCisJCSAgICAgICYmIChfQ09NUE9ORU5UICYgYWNwaV9kYmdfbGF5ZXIpKSkgeworCQkJcmV0dXJuX1ZPSUQ7CisJCX0KKwl9CisKKwlpZiAoQUNQSV9HRVRfREVTQ1JJUFRPUl9UWVBFKG9ial9kZXNjKSA9PSBBQ1BJX0RFU0NfVFlQRV9OQU1FRCkgeworCQlhY3BpX2V4X2R1bXBfbmFtZXNwYWNlX25vZGUoKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICopCisJCQkJCSAgICBvYmpfZGVzYywgZmxhZ3MpOworCisJCWFjcGlfb3NfcHJpbnRmKCJcbkF0dGFjaGVkIE9iamVjdCAoJXApOlxuIiwKKwkJCSAgICAgICAoKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICopb2JqX2Rlc2MpLT4KKwkJCSAgICAgICBvYmplY3QpOworCisJCWFjcGlfZXhfZHVtcF9vYmplY3RfZGVzY3JpcHRvcigoKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICopCisJCQkJCQlvYmpfZGVzYyktPm9iamVjdCwgZmxhZ3MpOworCQlyZXR1cm5fVk9JRDsKKwl9CisKKwlpZiAoQUNQSV9HRVRfREVTQ1JJUFRPUl9UWVBFKG9ial9kZXNjKSAhPSBBQ1BJX0RFU0NfVFlQRV9PUEVSQU5EKSB7CisJCWFjcGlfb3NfcHJpbnRmCisJCSAgICAoIkV4RHVtcE9iamVjdERlc2NyaXB0b3I6ICVwIGlzIG5vdCBhbiBBQ1BJIG9wZXJhbmQgb2JqZWN0OiBbJXNdXG4iLAorCQkgICAgIG9ial9kZXNjLCBhY3BpX3V0X2dldF9kZXNjcmlwdG9yX25hbWUob2JqX2Rlc2MpKTsKKwkJcmV0dXJuX1ZPSUQ7CisJfQorCisJaWYgKG9ial9kZXNjLT5jb21tb24udHlwZSA+IEFDUElfVFlQRV9OU19OT0RFX01BWCkgeworCQlyZXR1cm5fVk9JRDsKKwl9CisKKwkvKiBDb21tb24gRmllbGRzICovCisKKwlhY3BpX2V4X2R1bXBfb2JqZWN0KG9ial9kZXNjLCBhY3BpX2V4X2R1bXBfY29tbW9uKTsKKworCS8qIE9iamVjdC1zcGVjaWZpYyBmaWVsZHMgKi8KKworCWFjcGlfZXhfZHVtcF9vYmplY3Qob2JqX2Rlc2MsIGFjcGlfZXhfZHVtcF9pbmZvW29ial9kZXNjLT5jb21tb24udHlwZV0pOworCXJldHVybl9WT0lEOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXhmaWVsZC5jIGIvZHJpdmVycy9hY3BpL2FjcGljYS9leGZpZWxkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTM1MmQwMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXhmaWVsZC5jCkBAIC0wLDAgKzEsMzQwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogTW9kdWxlIE5hbWU6IGV4ZmllbGQgLSBBQ1BJIEFNTCAocC1jb2RlKSBleGVjdXRpb24gLSBmaWVsZCBtYW5pcHVsYXRpb24KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA4LCBJbnRlbCBDb3JwLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAorICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgYXQgbWluaW11bSBhIGRpc2NsYWltZXIKKyAqICAgIHN1YnN0YW50aWFsbHkgc2ltaWxhciB0byB0aGUgIk5PIFdBUlJBTlRZIiBkaXNjbGFpbWVyIGJlbG93CisgKiAgICAoIkRpc2NsYWltZXIiKSBhbmQgYW55IHJlZGlzdHJpYnV0aW9uIG11c3QgYmUgY29uZGl0aW9uZWQgdXBvbgorICogICAgaW5jbHVkaW5nIGEgc3Vic3RhbnRpYWxseSBzaW1pbGFyIERpc2NsYWltZXIgcmVxdWlyZW1lbnQgZm9yIGZ1cnRoZXIKKyAqICAgIGJpbmFyeSByZWRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcworICogICAgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBOTyBXQVJSQU5UWQorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcKKyAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgorICovCisKKyNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KKyNpbmNsdWRlICJhY2NvbW1vbi5oIgorI2luY2x1ZGUgImFjZGlzcGF0LmgiCisjaW5jbHVkZSAiYWNpbnRlcnAuaCIKKworI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfRVhFQ1VURVIKK0FDUElfTU9EVUxFX05BTUUoImV4ZmllbGQiKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X3JlYWRfZGF0YV9mcm9tX2ZpZWxkCisgKgorICogUEFSQU1FVEVSUzogIHdhbGtfc3RhdGUgICAgICAgICAgLSBDdXJyZW50IGV4ZWN1dGlvbiBzdGF0ZQorICogICAgICAgICAgICAgIG9ial9kZXNjICAgICAgICAgICAgLSBUaGUgbmFtZWQgZmllbGQKKyAqICAgICAgICAgICAgICByZXRfYnVmZmVyX2Rlc2MgICAgIC0gV2hlcmUgdGhlIHJldHVybiBkYXRhIG9iamVjdCBpcyBzdG9yZWQKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IFJlYWQgZnJvbSBhIG5hbWVkIGZpZWxkLiAgUmV0dXJucyBlaXRoZXIgYW4gSW50ZWdlciBvciBhCisgKiAgICAgICAgICAgICAgQnVmZmVyLCBkZXBlbmRpbmcgb24gdGhlIHNpemUgb2YgdGhlIGZpZWxkLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCithY3BpX3N0YXR1cworYWNwaV9leF9yZWFkX2RhdGFfZnJvbV9maWVsZChzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlLAorCQkJICAgICB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYywKKwkJCSAgICAgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKnJldF9idWZmZXJfZGVzYykKK3sKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqYnVmZmVyX2Rlc2M7CisJYWNwaV9zaXplIGxlbmd0aDsKKwl2b2lkICpidWZmZXI7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUihleF9yZWFkX2RhdGFfZnJvbV9maWVsZCwgb2JqX2Rlc2MpOworCisJLyogUGFyYW1ldGVyIHZhbGlkYXRpb24gKi8KKworCWlmICghb2JqX2Rlc2MpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9OT19PUEVSQU5EKTsKKwl9CisJaWYgKCFyZXRfYnVmZmVyX2Rlc2MpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9QQVJBTUVURVIpOworCX0KKworCWlmIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRShvYmpfZGVzYykgPT0gQUNQSV9UWVBFX0JVRkZFUl9GSUVMRCkgeworCQkvKgorCQkgKiBJZiB0aGUgYnVmZmVyX2ZpZWxkIGFyZ3VtZW50cyBoYXZlIG5vdCBiZWVuIHByZXZpb3VzbHkgZXZhbHVhdGVkLAorCQkgKiBldmFsdWF0ZSB0aGVtIG5vdyBhbmQgc2F2ZSB0aGUgcmVzdWx0cy4KKwkJICovCisJCWlmICghKG9ial9kZXNjLT5jb21tb24uZmxhZ3MgJiBBT1BPQkpfREFUQV9WQUxJRCkpIHsKKwkJCXN0YXR1cyA9IGFjcGlfZHNfZ2V0X2J1ZmZlcl9maWVsZF9hcmd1bWVudHMob2JqX2Rlc2MpOworCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CisJCQl9CisJCX0KKwl9IGVsc2UKKwkgICAgaWYgKChBQ1BJX0dFVF9PQkpFQ1RfVFlQRShvYmpfZGVzYykgPT0gQUNQSV9UWVBFX0xPQ0FMX1JFR0lPTl9GSUVMRCkKKwkJJiYgKG9ial9kZXNjLT5maWVsZC5yZWdpb25fb2JqLT5yZWdpb24uc3BhY2VfaWQgPT0KKwkJICAgIEFDUElfQURSX1NQQUNFX1NNQlVTKSkgeworCQkvKgorCQkgKiBUaGlzIGlzIGFuIFNNQnVzIHJlYWQuICBXZSBtdXN0IGNyZWF0ZSBhIGJ1ZmZlciB0byBob2xkIHRoZSBkYXRhCisJCSAqIGFuZCBkaXJlY3RseSBhY2Nlc3MgdGhlIHJlZ2lvbiBoYW5kbGVyLgorCQkgKi8KKwkJYnVmZmVyX2Rlc2MgPQorCQkgICAgYWNwaV91dF9jcmVhdGVfYnVmZmVyX29iamVjdChBQ1BJX1NNQlVTX0JVRkZFUl9TSVpFKTsKKwkJaWYgKCFidWZmZXJfZGVzYykgeworCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX01FTU9SWSk7CisJCX0KKworCQkvKiBMb2NrIGVudGlyZSB0cmFuc2FjdGlvbiBpZiByZXF1ZXN0ZWQgKi8KKworCQlhY3BpX2V4X2FjcXVpcmVfZ2xvYmFsX2xvY2sob2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5maWVsZF9mbGFncyk7CisKKwkJLyoKKwkJICogUGVyZm9ybSB0aGUgcmVhZC4KKwkJICogTm90ZTogU21idXMgcHJvdG9jb2wgdmFsdWUgaXMgcGFzc2VkIGluIHVwcGVyIDE2LWJpdHMgb2YgRnVuY3Rpb24KKwkJICovCisJCXN0YXR1cyA9IGFjcGlfZXhfYWNjZXNzX3JlZ2lvbihvYmpfZGVzYywgMCwKKwkJCQkJICAgICAgIEFDUElfQ0FTVF9QVFIoYWNwaV9pbnRlZ2VyLAorCQkJCQkJCSAgICAgYnVmZmVyX2Rlc2MtPgorCQkJCQkJCSAgICAgYnVmZmVyLnBvaW50ZXIpLAorCQkJCQkgICAgICAgQUNQSV9SRUFEIHwgKG9ial9kZXNjLT5maWVsZC4KKwkJCQkJCQkgICAgYXR0cmlidXRlIDw8IDE2KSk7CisJCWFjcGlfZXhfcmVsZWFzZV9nbG9iYWxfbG9jayhvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmZpZWxkX2ZsYWdzKTsKKwkJZ290byBleGl0OworCX0KKworCS8qCisJICogQWxsb2NhdGUgYSBidWZmZXIgZm9yIHRoZSBjb250ZW50cyBvZiB0aGUgZmllbGQuCisJICoKKwkgKiBJZiB0aGUgZmllbGQgaXMgbGFyZ2VyIHRoYW4gdGhlIHNpemUgb2YgYW4gYWNwaV9pbnRlZ2VyLCBjcmVhdGUKKwkgKiBhIEJVRkZFUiB0byBob2xkIGl0LiAgT3RoZXJ3aXNlLCB1c2UgYW4gSU5URUdFUi4gIFRoaXMgYWxsb3dzCisJICogdGhlIHVzZSBvZiBhcml0aG1ldGljIG9wZXJhdG9ycyBvbiB0aGUgcmV0dXJuZWQgdmFsdWUgaWYgdGhlCisJICogZmllbGQgc2l6ZSBpcyBlcXVhbCBvciBzbWFsbGVyIHRoYW4gYW4gSW50ZWdlci4KKwkgKgorCSAqIE5vdGU6IEZpZWxkLmxlbmd0aCBpcyBpbiBiaXRzLgorCSAqLworCWxlbmd0aCA9CisJICAgIChhY3BpX3NpemUpIEFDUElfUk9VTkRfQklUU19VUF9UT19CWVRFUyhvYmpfZGVzYy0+ZmllbGQuYml0X2xlbmd0aCk7CisJaWYgKGxlbmd0aCA+IGFjcGlfZ2JsX2ludGVnZXJfYnl0ZV93aWR0aCkgeworCisJCS8qIEZpZWxkIGlzIHRvbyBsYXJnZSBmb3IgYW4gSW50ZWdlciwgY3JlYXRlIGEgQnVmZmVyIGluc3RlYWQgKi8KKworCQlidWZmZXJfZGVzYyA9IGFjcGlfdXRfY3JlYXRlX2J1ZmZlcl9vYmplY3QobGVuZ3RoKTsKKwkJaWYgKCFidWZmZXJfZGVzYykgeworCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX01FTU9SWSk7CisJCX0KKwkJYnVmZmVyID0gYnVmZmVyX2Rlc2MtPmJ1ZmZlci5wb2ludGVyOworCX0gZWxzZSB7CisJCS8qIEZpZWxkIHdpbGwgZml0IHdpdGhpbiBhbiBJbnRlZ2VyIChub3JtYWwgY2FzZSkgKi8KKworCQlidWZmZXJfZGVzYyA9IGFjcGlfdXRfY3JlYXRlX2ludGVybmFsX29iamVjdChBQ1BJX1RZUEVfSU5URUdFUik7CisJCWlmICghYnVmZmVyX2Rlc2MpIHsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT19NRU1PUlkpOworCQl9CisKKwkJbGVuZ3RoID0gYWNwaV9nYmxfaW50ZWdlcl9ieXRlX3dpZHRoOworCQlidWZmZXJfZGVzYy0+aW50ZWdlci52YWx1ZSA9IDA7CisJCWJ1ZmZlciA9ICZidWZmZXJfZGVzYy0+aW50ZWdlci52YWx1ZTsKKwl9CisKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0JGSUVMRCwKKwkJCSAgIkZpZWxkUmVhZCBbVE9dOiAgIE9iaiAlcCwgVHlwZSAlWCwgQnVmICVwLCBCeXRlTGVuICVYXG4iLAorCQkJICBvYmpfZGVzYywgQUNQSV9HRVRfT0JKRUNUX1RZUEUob2JqX2Rlc2MpLCBidWZmZXIsCisJCQkgICh1MzIpIGxlbmd0aCkpOworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfQkZJRUxELAorCQkJICAiRmllbGRSZWFkIFtGUk9NXTogQml0TGVuICVYLCBCaXRPZmYgJVgsIEJ5dGVPZmYgJVhcbiIsCisJCQkgIG9ial9kZXNjLT5jb21tb25fZmllbGQuYml0X2xlbmd0aCwKKwkJCSAgb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5zdGFydF9maWVsZF9iaXRfb2Zmc2V0LAorCQkJICBvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmJhc2VfYnl0ZV9vZmZzZXQpKTsKKworCS8qIExvY2sgZW50aXJlIHRyYW5zYWN0aW9uIGlmIHJlcXVlc3RlZCAqLworCisJYWNwaV9leF9hY3F1aXJlX2dsb2JhbF9sb2NrKG9ial9kZXNjLT5jb21tb25fZmllbGQuZmllbGRfZmxhZ3MpOworCisJLyogUmVhZCBmcm9tIHRoZSBmaWVsZCAqLworCisJc3RhdHVzID0gYWNwaV9leF9leHRyYWN0X2Zyb21fZmllbGQob2JqX2Rlc2MsIGJ1ZmZlciwgKHUzMikgbGVuZ3RoKTsKKwlhY3BpX2V4X3JlbGVhc2VfZ2xvYmFsX2xvY2sob2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5maWVsZF9mbGFncyk7CisKKyAgICAgIGV4aXQ6CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZShidWZmZXJfZGVzYyk7CisJfSBlbHNlIHsKKwkJKnJldF9idWZmZXJfZGVzYyA9IGJ1ZmZlcl9kZXNjOworCX0KKworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X3dyaXRlX2RhdGFfdG9fZmllbGQKKyAqCisgKiBQQVJBTUVURVJTOiAgc291cmNlX2Rlc2MgICAgICAgICAtIENvbnRhaW5zIGRhdGEgdG8gd3JpdGUKKyAqICAgICAgICAgICAgICBvYmpfZGVzYyAgICAgICAgICAgIC0gVGhlIG5hbWVkIGZpZWxkCisgKiAgICAgICAgICAgICAgcmVzdWx0X2Rlc2MgICAgICAgICAtIFdoZXJlIHRoZSByZXR1cm4gdmFsdWUgaXMgcmV0dXJuZWQsIGlmIGFueQorICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogV3JpdGUgdG8gYSBuYW1lZCBmaWVsZAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2FjcGlfc3RhdHVzCithY3BpX2V4X3dyaXRlX2RhdGFfdG9fZmllbGQodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqc291cmNlX2Rlc2MsCisJCQkgICAgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2MsCisJCQkgICAgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKnJlc3VsdF9kZXNjKQoreworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwl1MzIgbGVuZ3RoOworCXZvaWQgKmJ1ZmZlcjsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpidWZmZXJfZGVzYzsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKGV4X3dyaXRlX2RhdGFfdG9fZmllbGQsIG9ial9kZXNjKTsKKworCS8qIFBhcmFtZXRlciB2YWxpZGF0aW9uICovCisKKwlpZiAoIXNvdXJjZV9kZXNjIHx8ICFvYmpfZGVzYykgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX05PX09QRVJBTkQpOworCX0KKworCWlmIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRShvYmpfZGVzYykgPT0gQUNQSV9UWVBFX0JVRkZFUl9GSUVMRCkgeworCQkvKgorCQkgKiBJZiB0aGUgYnVmZmVyX2ZpZWxkIGFyZ3VtZW50cyBoYXZlIG5vdCBiZWVuIHByZXZpb3VzbHkgZXZhbHVhdGVkLAorCQkgKiBldmFsdWF0ZSB0aGVtIG5vdyBhbmQgc2F2ZSB0aGUgcmVzdWx0cy4KKwkJICovCisJCWlmICghKG9ial9kZXNjLT5jb21tb24uZmxhZ3MgJiBBT1BPQkpfREFUQV9WQUxJRCkpIHsKKwkJCXN0YXR1cyA9IGFjcGlfZHNfZ2V0X2J1ZmZlcl9maWVsZF9hcmd1bWVudHMob2JqX2Rlc2MpOworCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CisJCQl9CisJCX0KKwl9IGVsc2UKKwkgICAgaWYgKChBQ1BJX0dFVF9PQkpFQ1RfVFlQRShvYmpfZGVzYykgPT0gQUNQSV9UWVBFX0xPQ0FMX1JFR0lPTl9GSUVMRCkKKwkJJiYgKG9ial9kZXNjLT5maWVsZC5yZWdpb25fb2JqLT5yZWdpb24uc3BhY2VfaWQgPT0KKwkJICAgIEFDUElfQURSX1NQQUNFX1NNQlVTKSkgeworCQkvKgorCQkgKiBUaGlzIGlzIGFuIFNNQnVzIHdyaXRlLiAgV2Ugd2lsbCBieXBhc3MgdGhlIGVudGlyZSBmaWVsZCBtZWNoYW5pc20KKwkJICogYW5kIGhhbmRvZmYgdGhlIGJ1ZmZlciBkaXJlY3RseSB0byB0aGUgaGFuZGxlci4KKwkJICoKKwkJICogU291cmNlIG11c3QgYmUgYSBidWZmZXIgb2Ygc3VmZmljaWVudCBzaXplIChBQ1BJX1NNQlVTX0JVRkZFUl9TSVpFKS4KKwkJICovCisJCWlmIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRShzb3VyY2VfZGVzYykgIT0gQUNQSV9UWVBFX0JVRkZFUikgeworCQkJQUNQSV9FUlJPUigoQUVfSU5GTywKKwkJCQkgICAgIlNNQnVzIHdyaXRlIHJlcXVpcmVzIEJ1ZmZlciwgZm91bmQgdHlwZSAlcyIsCisJCQkJICAgIGFjcGlfdXRfZ2V0X29iamVjdF90eXBlX25hbWUoc291cmNlX2Rlc2MpKSk7CisKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfT1BFUkFORF9UWVBFKTsKKwkJfQorCisJCWlmIChzb3VyY2VfZGVzYy0+YnVmZmVyLmxlbmd0aCA8IEFDUElfU01CVVNfQlVGRkVSX1NJWkUpIHsKKwkJCUFDUElfRVJST1IoKEFFX0lORk8sCisJCQkJICAgICJTTUJ1cyB3cml0ZSByZXF1aXJlcyBCdWZmZXIgb2YgbGVuZ3RoICVYLCBmb3VuZCBsZW5ndGggJVgiLAorCQkJCSAgICBBQ1BJX1NNQlVTX0JVRkZFUl9TSVpFLAorCQkJCSAgICBzb3VyY2VfZGVzYy0+YnVmZmVyLmxlbmd0aCkpOworCisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX0JVRkZFUl9MSU1JVCk7CisJCX0KKworCQlidWZmZXJfZGVzYyA9CisJCSAgICBhY3BpX3V0X2NyZWF0ZV9idWZmZXJfb2JqZWN0KEFDUElfU01CVVNfQlVGRkVSX1NJWkUpOworCQlpZiAoIWJ1ZmZlcl9kZXNjKSB7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9fTUVNT1JZKTsKKwkJfQorCisJCWJ1ZmZlciA9IGJ1ZmZlcl9kZXNjLT5idWZmZXIucG9pbnRlcjsKKwkJQUNQSV9NRU1DUFkoYnVmZmVyLCBzb3VyY2VfZGVzYy0+YnVmZmVyLnBvaW50ZXIsCisJCQkgICAgQUNQSV9TTUJVU19CVUZGRVJfU0laRSk7CisKKwkJLyogTG9jayBlbnRpcmUgdHJhbnNhY3Rpb24gaWYgcmVxdWVzdGVkICovCisKKwkJYWNwaV9leF9hY3F1aXJlX2dsb2JhbF9sb2NrKG9ial9kZXNjLT5jb21tb25fZmllbGQuZmllbGRfZmxhZ3MpOworCisJCS8qCisJCSAqIFBlcmZvcm0gdGhlIHdyaXRlIChyZXR1cm5zIHN0YXR1cyBhbmQgcGVyaGFwcyBkYXRhIGluIHRoZQorCQkgKiBzYW1lIGJ1ZmZlcikKKwkJICogTm90ZTogU01CdXMgcHJvdG9jb2wgdHlwZSBpcyBwYXNzZWQgaW4gdXBwZXIgMTYtYml0cyBvZiBGdW5jdGlvbi4KKwkJICovCisJCXN0YXR1cyA9IGFjcGlfZXhfYWNjZXNzX3JlZ2lvbihvYmpfZGVzYywgMCwKKwkJCQkJICAgICAgIChhY3BpX2ludGVnZXIgKikgYnVmZmVyLAorCQkJCQkgICAgICAgQUNQSV9XUklURSB8IChvYmpfZGVzYy0+ZmllbGQuCisJCQkJCQkJICAgICBhdHRyaWJ1dGUgPDwgMTYpKTsKKwkJYWNwaV9leF9yZWxlYXNlX2dsb2JhbF9sb2NrKG9ial9kZXNjLT5jb21tb25fZmllbGQuZmllbGRfZmxhZ3MpOworCisJCSpyZXN1bHRfZGVzYyA9IGJ1ZmZlcl9kZXNjOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKKwl9CisKKwkvKiBHZXQgYSBwb2ludGVyIHRvIHRoZSBkYXRhIHRvIGJlIHdyaXR0ZW4gKi8KKworCXN3aXRjaCAoQUNQSV9HRVRfT0JKRUNUX1RZUEUoc291cmNlX2Rlc2MpKSB7CisJY2FzZSBBQ1BJX1RZUEVfSU5URUdFUjoKKwkJYnVmZmVyID0gJnNvdXJjZV9kZXNjLT5pbnRlZ2VyLnZhbHVlOworCQlsZW5ndGggPSBzaXplb2Yoc291cmNlX2Rlc2MtPmludGVnZXIudmFsdWUpOworCQlicmVhazsKKworCWNhc2UgQUNQSV9UWVBFX0JVRkZFUjoKKwkJYnVmZmVyID0gc291cmNlX2Rlc2MtPmJ1ZmZlci5wb2ludGVyOworCQlsZW5ndGggPSBzb3VyY2VfZGVzYy0+YnVmZmVyLmxlbmd0aDsKKwkJYnJlYWs7CisKKwljYXNlIEFDUElfVFlQRV9TVFJJTkc6CisJCWJ1ZmZlciA9IHNvdXJjZV9kZXNjLT5zdHJpbmcucG9pbnRlcjsKKwkJbGVuZ3RoID0gc291cmNlX2Rlc2MtPnN0cmluZy5sZW5ndGg7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9PUEVSQU5EX1RZUEUpOworCX0KKworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfQkZJRUxELAorCQkJICAiRmllbGRXcml0ZSBbRlJPTV06IE9iaiAlcCAoJXM6JVgpLCBCdWYgJXAsIEJ5dGVMZW4gJVhcbiIsCisJCQkgIHNvdXJjZV9kZXNjLAorCQkJICBhY3BpX3V0X2dldF90eXBlX25hbWUoQUNQSV9HRVRfT0JKRUNUX1RZUEUKKwkJCQkJCShzb3VyY2VfZGVzYykpLAorCQkJICBBQ1BJX0dFVF9PQkpFQ1RfVFlQRShzb3VyY2VfZGVzYyksIGJ1ZmZlciwgbGVuZ3RoKSk7CisKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0JGSUVMRCwKKwkJCSAgIkZpZWxkV3JpdGUgW1RPXTogICBPYmogJXAgKCVzOiVYKSwgQml0TGVuICVYLCBCaXRPZmYgJVgsIEJ5dGVPZmYgJVhcbiIsCisJCQkgIG9ial9kZXNjLAorCQkJICBhY3BpX3V0X2dldF90eXBlX25hbWUoQUNQSV9HRVRfT0JKRUNUX1RZUEUob2JqX2Rlc2MpKSwKKwkJCSAgQUNQSV9HRVRfT0JKRUNUX1RZUEUob2JqX2Rlc2MpLAorCQkJICBvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmJpdF9sZW5ndGgsCisJCQkgIG9ial9kZXNjLT5jb21tb25fZmllbGQuc3RhcnRfZmllbGRfYml0X29mZnNldCwKKwkJCSAgb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5iYXNlX2J5dGVfb2Zmc2V0KSk7CisKKwkvKiBMb2NrIGVudGlyZSB0cmFuc2FjdGlvbiBpZiByZXF1ZXN0ZWQgKi8KKworCWFjcGlfZXhfYWNxdWlyZV9nbG9iYWxfbG9jayhvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmZpZWxkX2ZsYWdzKTsKKworCS8qIFdyaXRlIHRvIHRoZSBmaWVsZCAqLworCisJc3RhdHVzID0gYWNwaV9leF9pbnNlcnRfaW50b19maWVsZChvYmpfZGVzYywgYnVmZmVyLCBsZW5ndGgpOworCWFjcGlfZXhfcmVsZWFzZV9nbG9iYWxfbG9jayhvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmZpZWxkX2ZsYWdzKTsKKworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS9leGZsZGlvLmMgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2V4ZmxkaW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjU4YWM0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS9leGZsZGlvLmMKQEAgLTAsMCArMSw5NjEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBNb2R1bGUgTmFtZTogZXhmbGRpbyAtIEFtbCBGaWVsZCBJL08KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA4LCBJbnRlbCBDb3JwLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAorICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgYXQgbWluaW11bSBhIGRpc2NsYWltZXIKKyAqICAgIHN1YnN0YW50aWFsbHkgc2ltaWxhciB0byB0aGUgIk5PIFdBUlJBTlRZIiBkaXNjbGFpbWVyIGJlbG93CisgKiAgICAoIkRpc2NsYWltZXIiKSBhbmQgYW55IHJlZGlzdHJpYnV0aW9uIG11c3QgYmUgY29uZGl0aW9uZWQgdXBvbgorICogICAgaW5jbHVkaW5nIGEgc3Vic3RhbnRpYWxseSBzaW1pbGFyIERpc2NsYWltZXIgcmVxdWlyZW1lbnQgZm9yIGZ1cnRoZXIKKyAqICAgIGJpbmFyeSByZWRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcworICogICAgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBOTyBXQVJSQU5UWQorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcKKyAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgorICovCisKKyNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KKyNpbmNsdWRlICJhY2NvbW1vbi5oIgorI2luY2x1ZGUgImFjaW50ZXJwLmgiCisjaW5jbHVkZSAiYW1sY29kZS5oIgorI2luY2x1ZGUgImFjZXZlbnRzLmgiCisjaW5jbHVkZSAiYWNkaXNwYXQuaCIKKworI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfRVhFQ1VURVIKK0FDUElfTU9EVUxFX05BTUUoImV4ZmxkaW8iKQorCisvKiBMb2NhbCBwcm90b3R5cGVzICovCitzdGF0aWMgYWNwaV9zdGF0dXMKK2FjcGlfZXhfZmllbGRfZGF0dW1faW8odW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2MsCisJCSAgICAgICB1MzIgZmllbGRfZGF0dW1fYnl0ZV9vZmZzZXQsCisJCSAgICAgICBhY3BpX2ludGVnZXIgKiB2YWx1ZSwgdTMyIHJlYWRfd3JpdGUpOworCitzdGF0aWMgdTgKK2FjcGlfZXhfcmVnaXN0ZXJfb3ZlcmZsb3codW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2MsCisJCQkgIGFjcGlfaW50ZWdlciB2YWx1ZSk7CisKK3N0YXRpYyBhY3BpX3N0YXR1cworYWNwaV9leF9zZXR1cF9yZWdpb24odW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2MsCisJCSAgICAgdTMyIGZpZWxkX2RhdHVtX2J5dGVfb2Zmc2V0KTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9leF9zZXR1cF9yZWdpb24KKyAqCisgKiBQQVJBTUVURVJTOiAgb2JqX2Rlc2MgICAgICAgICAgICAgICAgLSBGaWVsZCB0byBiZSByZWFkIG9yIHdyaXR0ZW4KKyAqICAgICAgICAgICAgICBmaWVsZF9kYXR1bV9ieXRlX29mZnNldCAtIEJ5dGUgb2Zmc2V0IG9mIHRoaXMgZGF0dW0gd2l0aGluIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50IGZpZWxkCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBDb21tb24gcHJvY2Vzc2luZyBmb3IgYWNwaV9leF9leHRyYWN0X2Zyb21fZmllbGQgYW5kCisgKiAgICAgICAgICAgICAgYWNwaV9leF9pbnNlcnRfaW50b19maWVsZC4gSW5pdGlhbGl6ZSB0aGUgUmVnaW9uIGlmIG5lY2Vzc2FyeSBhbmQKKyAqICAgICAgICAgICAgICB2YWxpZGF0ZSB0aGUgcmVxdWVzdC4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgYWNwaV9zdGF0dXMKK2FjcGlfZXhfc2V0dXBfcmVnaW9uKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjLAorCQkgICAgIHUzMiBmaWVsZF9kYXR1bV9ieXRlX29mZnNldCkKK3sKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpyZ25fZGVzYzsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0VfVTMyKGV4X3NldHVwX3JlZ2lvbiwgZmllbGRfZGF0dW1fYnl0ZV9vZmZzZXQpOworCisJcmduX2Rlc2MgPSBvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLnJlZ2lvbl9vYmo7CisKKwkvKiBXZSBtdXN0IGhhdmUgYSB2YWxpZCByZWdpb24gKi8KKworCWlmIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRShyZ25fZGVzYykgIT0gQUNQSV9UWVBFX1JFR0lPTikgeworCQlBQ1BJX0VSUk9SKChBRV9JTkZPLCAiTmVlZGVkIFJlZ2lvbiwgZm91bmQgdHlwZSAlWCAoJXMpIiwKKwkJCSAgICBBQ1BJX0dFVF9PQkpFQ1RfVFlQRShyZ25fZGVzYyksCisJCQkgICAgYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZShyZ25fZGVzYykpKTsKKworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX09QRVJBTkRfVFlQRSk7CisJfQorCisJLyoKKwkgKiBJZiB0aGUgUmVnaW9uIEFkZHJlc3MgYW5kIExlbmd0aCBoYXZlIG5vdCBiZWVuIHByZXZpb3VzbHkgZXZhbHVhdGVkLAorCSAqIGV2YWx1YXRlIHRoZW0gbm93IGFuZCBzYXZlIHRoZSByZXN1bHRzLgorCSAqLworCWlmICghKHJnbl9kZXNjLT5jb21tb24uZmxhZ3MgJiBBT1BPQkpfREFUQV9WQUxJRCkpIHsKKwkJc3RhdHVzID0gYWNwaV9kc19nZXRfcmVnaW9uX2FyZ3VtZW50cyhyZ25fZGVzYyk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CisJCX0KKwl9CisKKwkvKiBFeGl0IGlmIEFkZHJlc3MvTGVuZ3RoIGhhdmUgYmVlbiBkaXNhbGxvd2VkIGJ5IHRoZSBob3N0IE9TICovCisKKwlpZiAocmduX2Rlc2MtPmNvbW1vbi5mbGFncyAmIEFPUE9CSl9JTlZBTElEKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfSUxMRUdBTF9BRERSRVNTKTsKKwl9CisKKwkvKgorCSAqIEV4aXQgbm93IGZvciBTTUJ1cyBhZGRyZXNzIHNwYWNlLCBpdCBoYXMgYSBub24tbGluZWFyIGFkZHJlc3Mgc3BhY2UKKwkgKiBhbmQgdGhlIHJlcXVlc3QgY2Fubm90IGJlIGRpcmVjdGx5IHZhbGlkYXRlZAorCSAqLworCWlmIChyZ25fZGVzYy0+cmVnaW9uLnNwYWNlX2lkID09IEFDUElfQURSX1NQQUNFX1NNQlVTKSB7CisKKwkJLyogU01CdXMgaGFzIGEgbm9uLWxpbmVhciBhZGRyZXNzIHNwYWNlICovCisKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKKwl9CisjaWZkZWYgQUNQSV9VTkRFUl9ERVZFTE9QTUVOVAorCS8qCisJICogSWYgdGhlIEZpZWxkIGFjY2VzcyBpcyBhbnlfYWNjLCB3ZSBjYW4gbm93IGNvbXB1dGUgdGhlIG9wdGltYWwKKwkgKiBhY2Nlc3MgKGJlY2F1c2Ugd2Uga25vdyBrbm93IHRoZSBsZW5ndGggb2YgdGhlIHBhcmVudCByZWdpb24pCisJICovCisJaWYgKCEob2JqX2Rlc2MtPmNvbW1vbi5mbGFncyAmIEFPUE9CSl9EQVRBX1ZBTElEKSkgeworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworCQl9CisJfQorI2VuZGlmCisKKwkvKgorCSAqIFZhbGlkYXRlIHRoZSByZXF1ZXN0LiAgVGhlIGVudGlyZSByZXF1ZXN0IGZyb20gdGhlIGJ5dGUgb2Zmc2V0IGZvciBhCisJICogbGVuZ3RoIG9mIG9uZSBmaWVsZCBkYXR1bSAoYWNjZXNzIHdpZHRoKSBtdXN0IGZpdCB3aXRoaW4gdGhlIHJlZ2lvbi4KKwkgKiAoUmVnaW9uIGxlbmd0aCBpcyBzcGVjaWZpZWQgaW4gYnl0ZXMpCisJICovCisJaWYgKHJnbl9kZXNjLT5yZWdpb24ubGVuZ3RoIDwKKwkgICAgKG9ial9kZXNjLT5jb21tb25fZmllbGQuYmFzZV9ieXRlX29mZnNldCArCisJICAgICBmaWVsZF9kYXR1bV9ieXRlX29mZnNldCArCisJICAgICBvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmFjY2Vzc19ieXRlX3dpZHRoKSkgeworCQlpZiAoYWNwaV9nYmxfZW5hYmxlX2ludGVycHJldGVyX3NsYWNrKSB7CisJCQkvKgorCQkJICogU2xhY2sgbW9kZSBvbmx5OiAgV2Ugd2lsbCBnbyBhaGVhZCBhbmQgYWxsb3cgYWNjZXNzIHRvIHRoaXMKKwkJCSAqIGZpZWxkIGlmIGl0IGlzIHdpdGhpbiB0aGUgcmVnaW9uIGxlbmd0aCByb3VuZGVkIHVwIHRvIHRoZSBuZXh0CisJCQkgKiBhY2Nlc3Mgd2lkdGggYm91bmRhcnkuIGFjcGlfc2l6ZSBjYXN0IGZvciA2NC1iaXQgY29tcGlsZS4KKwkJCSAqLworCQkJaWYgKEFDUElfUk9VTkRfVVAocmduX2Rlc2MtPnJlZ2lvbi5sZW5ndGgsCisJCQkJCSAgb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC4KKwkJCQkJICBhY2Nlc3NfYnl0ZV93aWR0aCkgPj0KKwkJCSAgICAoKGFjcGlfc2l6ZSkgb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC4KKwkJCSAgICAgYmFzZV9ieXRlX29mZnNldCArCisJCQkgICAgIG9ial9kZXNjLT5jb21tb25fZmllbGQuYWNjZXNzX2J5dGVfd2lkdGggKworCQkJICAgICBmaWVsZF9kYXR1bV9ieXRlX29mZnNldCkpIHsKKwkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOworCQkJfQorCQl9CisKKwkJaWYgKHJnbl9kZXNjLT5yZWdpb24ubGVuZ3RoIDwKKwkJICAgIG9ial9kZXNjLT5jb21tb25fZmllbGQuYWNjZXNzX2J5dGVfd2lkdGgpIHsKKwkJCS8qCisJCQkgKiBUaGlzIGlzIHRoZSBjYXNlIHdoZXJlIHRoZSBhY2Nlc3NfdHlwZSAoYWNjX3dvcmQsIGV0Yy4pIGlzIHdpZGVyCisJCQkgKiB0aGFuIHRoZSByZWdpb24gaXRzZWxmLiAgRm9yIGV4YW1wbGUsIGEgcmVnaW9uIG9mIGxlbmd0aCBvbmUKKwkJCSAqIGJ5dGUsIGFuZCBhIGZpZWxkIHdpdGggRHdvcmQgYWNjZXNzIHNwZWNpZmllZC4KKwkJCSAqLworCQkJQUNQSV9FUlJPUigoQUVfSU5GTywKKwkJCQkgICAgIkZpZWxkIFslNC40c10gYWNjZXNzIHdpZHRoICglZCBieXRlcykgdG9vIGxhcmdlIGZvciByZWdpb24gWyU0LjRzXSAobGVuZ3RoICVYKSIsCisJCQkJICAgIGFjcGlfdXRfZ2V0X25vZGVfbmFtZShvYmpfZGVzYy0+CisJCQkJCQkJICBjb21tb25fZmllbGQubm9kZSksCisJCQkJICAgIG9ial9kZXNjLT5jb21tb25fZmllbGQuYWNjZXNzX2J5dGVfd2lkdGgsCisJCQkJICAgIGFjcGlfdXRfZ2V0X25vZGVfbmFtZShyZ25fZGVzYy0+cmVnaW9uLgorCQkJCQkJCSAgbm9kZSksCisJCQkJICAgIHJnbl9kZXNjLT5yZWdpb24ubGVuZ3RoKSk7CisJCX0KKworCQkvKgorCQkgKiBPZmZzZXQgcm91bmRlZCB1cCB0byBuZXh0IG11bHRpcGxlIG9mIGZpZWxkIHdpZHRoCisJCSAqIGV4Y2VlZHMgcmVnaW9uIGxlbmd0aCwgaW5kaWNhdGUgYW4gZXJyb3IKKwkJICovCisJCUFDUElfRVJST1IoKEFFX0lORk8sCisJCQkgICAgIkZpZWxkIFslNC40c10gQmFzZStPZmZzZXQrV2lkdGggJVgrJVgrJVggaXMgYmV5b25kIGVuZCBvZiByZWdpb24gWyU0LjRzXSAobGVuZ3RoICVYKSIsCisJCQkgICAgYWNwaV91dF9nZXRfbm9kZV9uYW1lKG9ial9kZXNjLT5jb21tb25fZmllbGQubm9kZSksCisJCQkgICAgb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5iYXNlX2J5dGVfb2Zmc2V0LAorCQkJICAgIGZpZWxkX2RhdHVtX2J5dGVfb2Zmc2V0LAorCQkJICAgIG9ial9kZXNjLT5jb21tb25fZmllbGQuYWNjZXNzX2J5dGVfd2lkdGgsCisJCQkgICAgYWNwaV91dF9nZXRfbm9kZV9uYW1lKHJnbl9kZXNjLT5yZWdpb24ubm9kZSksCisJCQkgICAgcmduX2Rlc2MtPnJlZ2lvbi5sZW5ndGgpKTsKKworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX1JFR0lPTl9MSU1JVCk7CisJfQorCisJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9leF9hY2Nlc3NfcmVnaW9uCisgKgorICogUEFSQU1FVEVSUzogIG9ial9kZXNjICAgICAgICAgICAgICAgIC0gRmllbGQgdG8gYmUgcmVhZAorICogICAgICAgICAgICAgIGZpZWxkX2RhdHVtX2J5dGVfb2Zmc2V0IC0gQnl0ZSBvZmZzZXQgb2YgdGhpcyBkYXR1bSB3aXRoaW4gdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQgZmllbGQKKyAqICAgICAgICAgICAgICBWYWx1ZSAgICAgICAgICAgICAgICAgICAtIFdoZXJlIHRvIHN0b3JlIHZhbHVlIChtdXN0IGF0IGxlYXN0CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgc2l6ZSBvZiBhY3BpX2ludGVnZXIpCisgKiAgICAgICAgICAgICAgRnVuY3Rpb24gICAgICAgICAgICAgICAgLSBSZWFkIG9yIFdyaXRlIGZsYWcgcGx1cyBvdGhlciByZWdpb24tCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXBlbmRlbnQgZmxhZ3MKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IFJlYWQgb3IgV3JpdGUgYSBzaW5nbGUgZmllbGQgZGF0dW0gdG8gYW4gT3BlcmF0aW9uIFJlZ2lvbi4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCithY3BpX3N0YXR1cworYWNwaV9leF9hY2Nlc3NfcmVnaW9uKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjLAorCQkgICAgICB1MzIgZmllbGRfZGF0dW1fYnl0ZV9vZmZzZXQsCisJCSAgICAgIGFjcGlfaW50ZWdlciAqIHZhbHVlLCB1MzIgZnVuY3Rpb24pCit7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnJnbl9kZXNjOworCWFjcGlfcGh5c2ljYWxfYWRkcmVzcyBhZGRyZXNzOworCisJQUNQSV9GVU5DVElPTl9UUkFDRShleF9hY2Nlc3NfcmVnaW9uKTsKKworCS8qCisJICogRW5zdXJlIHRoYXQgdGhlIHJlZ2lvbiBvcGVyYW5kcyBhcmUgZnVsbHkgZXZhbHVhdGVkIGFuZCB2ZXJpZnkKKwkgKiB0aGUgdmFsaWRpdHkgb2YgdGhlIHJlcXVlc3QKKwkgKi8KKwlzdGF0dXMgPSBhY3BpX2V4X3NldHVwX3JlZ2lvbihvYmpfZGVzYywgZmllbGRfZGF0dW1fYnl0ZV9vZmZzZXQpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKKwl9CisKKwkvKgorCSAqIFRoZSBwaHlzaWNhbCBhZGRyZXNzIG9mIHRoaXMgZmllbGQgZGF0dW0gaXM6CisJICoKKwkgKiAxKSBUaGUgYmFzZSBvZiB0aGUgcmVnaW9uLCBwbHVzCisJICogMikgVGhlIGJhc2Ugb2Zmc2V0IG9mIHRoZSBmaWVsZCwgcGx1cworCSAqIDMpIFRoZSBjdXJyZW50IG9mZnNldCBpbnRvIHRoZSBmaWVsZAorCSAqLworCXJnbl9kZXNjID0gb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5yZWdpb25fb2JqOworCWFkZHJlc3MgPSByZ25fZGVzYy0+cmVnaW9uLmFkZHJlc3MgKworCSAgICBvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmJhc2VfYnl0ZV9vZmZzZXQgKyBmaWVsZF9kYXR1bV9ieXRlX29mZnNldDsKKworCWlmICgoZnVuY3Rpb24gJiBBQ1BJX0lPX01BU0spID09IEFDUElfUkVBRCkgeworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0JGSUVMRCwgIltSRUFEXSIpKTsKKwl9IGVsc2UgeworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0JGSUVMRCwgIltXUklURV0iKSk7CisJfQorCisJQUNQSV9ERUJVR19QUklOVF9SQVcoKEFDUElfREJfQkZJRUxELAorCQkJICAgICAgIiBSZWdpb24gWyVzOiVYXSwgV2lkdGggJVgsIEJ5dGVCYXNlICVYLCBPZmZzZXQgJVggYXQgJXBcbiIsCisJCQkgICAgICBhY3BpX3V0X2dldF9yZWdpb25fbmFtZShyZ25fZGVzYy0+cmVnaW9uLgorCQkJCQkJICAgICAgc3BhY2VfaWQpLAorCQkJICAgICAgcmduX2Rlc2MtPnJlZ2lvbi5zcGFjZV9pZCwKKwkJCSAgICAgIG9ial9kZXNjLT5jb21tb25fZmllbGQuYWNjZXNzX2J5dGVfd2lkdGgsCisJCQkgICAgICBvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmJhc2VfYnl0ZV9vZmZzZXQsCisJCQkgICAgICBmaWVsZF9kYXR1bV9ieXRlX29mZnNldCwgQUNQSV9DQVNUX1BUUih2b2lkLAorCQkJCQkJCQkgICAgIGFkZHJlc3MpKSk7CisKKwkvKiBJbnZva2UgdGhlIGFwcHJvcHJpYXRlIGFkZHJlc3Nfc3BhY2Uvb3BfcmVnaW9uIGhhbmRsZXIgKi8KKworCXN0YXR1cyA9IGFjcGlfZXZfYWRkcmVzc19zcGFjZV9kaXNwYXRjaChyZ25fZGVzYywgZnVuY3Rpb24sCisJCQkJCQlhZGRyZXNzLAorCQkJCQkJQUNQSV9NVUxfOChvYmpfZGVzYy0+CisJCQkJCQkJICAgY29tbW9uX2ZpZWxkLgorCQkJCQkJCSAgIGFjY2Vzc19ieXRlX3dpZHRoKSwKKwkJCQkJCXZhbHVlKTsKKworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlpZiAoc3RhdHVzID09IEFFX05PVF9JTVBMRU1FTlRFRCkgeworCQkJQUNQSV9FUlJPUigoQUVfSU5GTywKKwkJCQkgICAgIlJlZ2lvbiAlcyglWCkgbm90IGltcGxlbWVudGVkIiwKKwkJCQkgICAgYWNwaV91dF9nZXRfcmVnaW9uX25hbWUocmduX2Rlc2MtPnJlZ2lvbi4KKwkJCQkJCQkgICAgc3BhY2VfaWQpLAorCQkJCSAgICByZ25fZGVzYy0+cmVnaW9uLnNwYWNlX2lkKSk7CisJCX0gZWxzZSBpZiAoc3RhdHVzID09IEFFX05PVF9FWElTVCkgeworCQkJQUNQSV9FUlJPUigoQUVfSU5GTywKKwkJCQkgICAgIlJlZ2lvbiAlcyglWCkgaGFzIG5vIGhhbmRsZXIiLAorCQkJCSAgICBhY3BpX3V0X2dldF9yZWdpb25fbmFtZShyZ25fZGVzYy0+cmVnaW9uLgorCQkJCQkJCSAgICBzcGFjZV9pZCksCisJCQkJICAgIHJnbl9kZXNjLT5yZWdpb24uc3BhY2VfaWQpKTsKKwkJfQorCX0KKworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X3JlZ2lzdGVyX292ZXJmbG93CisgKgorICogUEFSQU1FVEVSUzogIG9ial9kZXNjICAgICAgICAgICAgICAgIC0gUmVnaXN0ZXIoRmllbGQpIHRvIGJlIHdyaXR0ZW4KKyAqICAgICAgICAgICAgICBWYWx1ZSAgICAgICAgICAgICAgICAgICAtIFZhbHVlIHRvIGJlIHN0b3JlZAorICoKKyAqIFJFVFVSTjogICAgICBUUlVFIGlmIHZhbHVlIG92ZXJmbG93cyB0aGUgZmllbGQsIEZBTFNFIG90aGVyd2lzZQorICoKKyAqIERFU0NSSVBUSU9OOiBDaGVjayBpZiBhIHZhbHVlIGlzIG91dCBvZiByYW5nZSBvZiB0aGUgZmllbGQgYmVpbmcgd3JpdHRlbi4KKyAqICAgICAgICAgICAgICBVc2VkIHRvIGNoZWNrIGlmIHRoZSB2YWx1ZXMgd3JpdHRlbiB0byBJbmRleCBhbmQgQmFuayByZWdpc3RlcnMKKyAqICAgICAgICAgICAgICBhcmUgb3V0IG9mIHJhbmdlLiAgTm9ybWFsbHksIHRoZSB2YWx1ZSBpcyBzaW1wbHkgdHJ1bmNhdGVkCisgKiAgICAgICAgICAgICAgdG8gZml0IHRoZSBmaWVsZCwgYnV0IHRoaXMgY2FzZSBpcyBtb3N0IGxpa2VseSBhIHNlcmlvdXMKKyAqICAgICAgICAgICAgICBjb2RpbmcgZXJyb3IgaW4gdGhlIEFTTC4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdTgKK2FjcGlfZXhfcmVnaXN0ZXJfb3ZlcmZsb3codW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2MsCisJCQkgIGFjcGlfaW50ZWdlciB2YWx1ZSkKK3sKKworCWlmIChvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmJpdF9sZW5ndGggPj0gQUNQSV9JTlRFR0VSX0JJVF9TSVpFKSB7CisJCS8qCisJCSAqIFRoZSBmaWVsZCBpcyBsYXJnZSBlbm91Z2ggdG8gaG9sZCB0aGUgbWF4aW11bSBpbnRlZ2VyLCBzbyB3ZSBjYW4KKwkJICogbmV2ZXIgb3ZlcmZsb3cgaXQuCisJCSAqLworCQlyZXR1cm4gKEZBTFNFKTsKKwl9CisKKwlpZiAodmFsdWUgPj0gKChhY3BpX2ludGVnZXIpIDEgPDwgb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5iaXRfbGVuZ3RoKSkgeworCQkvKgorCQkgKiBUaGUgVmFsdWUgaXMgbGFyZ2VyIHRoYW4gdGhlIG1heGltdW0gdmFsdWUgdGhhdCBjYW4gZml0IGludG8KKwkJICogdGhlIHJlZ2lzdGVyLgorCQkgKi8KKwkJcmV0dXJuIChUUlVFKTsKKwl9CisKKwkvKiBUaGUgVmFsdWUgd2lsbCBmaXQgaW50byB0aGUgZmllbGQgd2l0aCBubyB0cnVuY2F0aW9uICovCisKKwlyZXR1cm4gKEZBTFNFKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9leF9maWVsZF9kYXR1bV9pbworICoKKyAqIFBBUkFNRVRFUlM6ICBvYmpfZGVzYyAgICAgICAgICAgICAgICAtIEZpZWxkIHRvIGJlIHJlYWQKKyAqICAgICAgICAgICAgICBmaWVsZF9kYXR1bV9ieXRlX29mZnNldCAtIEJ5dGUgb2Zmc2V0IG9mIHRoaXMgZGF0dW0gd2l0aGluIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50IGZpZWxkCisgKiAgICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgICAgICAgLSBXaGVyZSB0byBzdG9yZSB2YWx1ZSAobXVzdCBiZSA2NCBiaXRzKQorICogICAgICAgICAgICAgIHJlYWRfd3JpdGUgICAgICAgICAgICAgIC0gUmVhZCBvciBXcml0ZSBmbGFnCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBSZWFkIG9yIFdyaXRlIGEgc2luZ2xlIGRhdHVtIG9mIGEgZmllbGQuICBUaGUgZmllbGRfdHlwZSBpcworICogICAgICAgICAgICAgIGRlbXVsdGlwbGV4ZWQgaGVyZSB0byBoYW5kbGUgdGhlIGRpZmZlcmVudCB0eXBlcyBvZiBmaWVsZHMKKyAqICAgICAgICAgICAgICAoYnVmZmVyX2ZpZWxkLCByZWdpb25fZmllbGQsIGluZGV4X2ZpZWxkLCBiYW5rX2ZpZWxkKQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBhY3BpX3N0YXR1cworYWNwaV9leF9maWVsZF9kYXR1bV9pbyh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYywKKwkJICAgICAgIHUzMiBmaWVsZF9kYXR1bV9ieXRlX29mZnNldCwKKwkJICAgICAgIGFjcGlfaW50ZWdlciAqIHZhbHVlLCB1MzIgcmVhZF93cml0ZSkKK3sKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJYWNwaV9pbnRlZ2VyIGxvY2FsX3ZhbHVlOworCisJQUNQSV9GVU5DVElPTl9UUkFDRV9VMzIoZXhfZmllbGRfZGF0dW1faW8sIGZpZWxkX2RhdHVtX2J5dGVfb2Zmc2V0KTsKKworCWlmIChyZWFkX3dyaXRlID09IEFDUElfUkVBRCkgeworCQlpZiAoIXZhbHVlKSB7CisJCQlsb2NhbF92YWx1ZSA9IDA7CisKKwkJCS8qIFRvIHN1cHBvcnQgcmVhZHMgd2l0aG91dCBzYXZpbmcgcmV0dXJuIHZhbHVlICovCisJCQl2YWx1ZSA9ICZsb2NhbF92YWx1ZTsKKwkJfQorCisJCS8qIENsZWFyIHRoZSBlbnRpcmUgcmV0dXJuIGJ1ZmZlciBmaXJzdCwgW1ZlcnkgSW1wb3J0YW50IV0gKi8KKworCQkqdmFsdWUgPSAwOworCX0KKworCS8qCisJICogVGhlIGZvdXIgdHlwZXMgb2YgZmllbGRzIGFyZToKKwkgKgorCSAqIGJ1ZmZlcl9maWVsZCAtIFJlYWQvd3JpdGUgZnJvbS90byBhIEJ1ZmZlcgorCSAqIHJlZ2lvbl9maWVsZCAtIFJlYWQvd3JpdGUgZnJvbS90byBhIE9wZXJhdGlvbiBSZWdpb24uCisJICogYmFua19maWVsZCAgLSBXcml0ZSB0byBhIEJhbmsgUmVnaXN0ZXIsIHRoZW4gcmVhZC93cml0ZSBmcm9tL3RvIGFuCisJICogICAgICAgICAgICAgICBvcGVyYXRpb25fcmVnaW9uCisJICogaW5kZXhfZmllbGQgLSBXcml0ZSB0byBhbiBJbmRleCBSZWdpc3RlciwgdGhlbiByZWFkL3dyaXRlIGZyb20vdG8gYQorCSAqICAgICAgICAgICAgICAgRGF0YSBSZWdpc3RlcgorCSAqLworCXN3aXRjaCAoQUNQSV9HRVRfT0JKRUNUX1RZUEUob2JqX2Rlc2MpKSB7CisJY2FzZSBBQ1BJX1RZUEVfQlVGRkVSX0ZJRUxEOgorCQkvKgorCQkgKiBJZiB0aGUgYnVmZmVyX2ZpZWxkIGFyZ3VtZW50cyBoYXZlIG5vdCBiZWVuIHByZXZpb3VzbHkgZXZhbHVhdGVkLAorCQkgKiBldmFsdWF0ZSB0aGVtIG5vdyBhbmQgc2F2ZSB0aGUgcmVzdWx0cy4KKwkJICovCisJCWlmICghKG9ial9kZXNjLT5jb21tb24uZmxhZ3MgJiBBT1BPQkpfREFUQV9WQUxJRCkpIHsKKwkJCXN0YXR1cyA9IGFjcGlfZHNfZ2V0X2J1ZmZlcl9maWVsZF9hcmd1bWVudHMob2JqX2Rlc2MpOworCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CisJCQl9CisJCX0KKworCQlpZiAocmVhZF93cml0ZSA9PSBBQ1BJX1JFQUQpIHsKKwkJCS8qCisJCQkgKiBDb3B5IHRoZSBkYXRhIGZyb20gdGhlIHNvdXJjZSBidWZmZXIuCisJCQkgKiBMZW5ndGggaXMgdGhlIGZpZWxkIHdpZHRoIGluIGJ5dGVzLgorCQkJICovCisJCQlBQ1BJX01FTUNQWSh2YWx1ZSwKKwkJCQkgICAgKG9ial9kZXNjLT5idWZmZXJfZmllbGQuYnVmZmVyX29iaiktPmJ1ZmZlci4KKwkJCQkgICAgcG9pbnRlciArCisJCQkJICAgIG9ial9kZXNjLT5idWZmZXJfZmllbGQuYmFzZV9ieXRlX29mZnNldCArCisJCQkJICAgIGZpZWxkX2RhdHVtX2J5dGVfb2Zmc2V0LAorCQkJCSAgICBvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmFjY2Vzc19ieXRlX3dpZHRoKTsKKwkJfSBlbHNlIHsKKwkJCS8qCisJCQkgKiBDb3B5IHRoZSBkYXRhIHRvIHRoZSB0YXJnZXQgYnVmZmVyLgorCQkJICogTGVuZ3RoIGlzIHRoZSBmaWVsZCB3aWR0aCBpbiBieXRlcy4KKwkJCSAqLworCQkJQUNQSV9NRU1DUFkoKG9ial9kZXNjLT5idWZmZXJfZmllbGQuYnVmZmVyX29iaiktPmJ1ZmZlci4KKwkJCQkgICAgcG9pbnRlciArCisJCQkJICAgIG9ial9kZXNjLT5idWZmZXJfZmllbGQuYmFzZV9ieXRlX29mZnNldCArCisJCQkJICAgIGZpZWxkX2RhdHVtX2J5dGVfb2Zmc2V0LCB2YWx1ZSwKKwkJCQkgICAgb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5hY2Nlc3NfYnl0ZV93aWR0aCk7CisJCX0KKworCQlzdGF0dXMgPSBBRV9PSzsKKwkJYnJlYWs7CisKKwljYXNlIEFDUElfVFlQRV9MT0NBTF9CQU5LX0ZJRUxEOgorCisJCS8qCisJCSAqIEVuc3VyZSB0aGF0IHRoZSBiYW5rX3ZhbHVlIGlzIG5vdCBiZXlvbmQgdGhlIGNhcGFjaXR5IG9mCisJCSAqIHRoZSByZWdpc3RlcgorCQkgKi8KKwkJaWYgKGFjcGlfZXhfcmVnaXN0ZXJfb3ZlcmZsb3cob2JqX2Rlc2MtPmJhbmtfZmllbGQuYmFua19vYmosCisJCQkJCSAgICAgIChhY3BpX2ludGVnZXIpIG9ial9kZXNjLT4KKwkJCQkJICAgICAgYmFua19maWVsZC52YWx1ZSkpIHsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfUkVHSVNURVJfTElNSVQpOworCQl9CisKKwkJLyoKKwkJICogRm9yIGJhbmtfZmllbGRzLCB3ZSBtdXN0IHdyaXRlIHRoZSBiYW5rX3ZhbHVlIHRvIHRoZSBiYW5rX3JlZ2lzdGVyCisJCSAqIChpdHNlbGYgYSByZWdpb25fZmllbGQpIGJlZm9yZSB3ZSBjYW4gYWNjZXNzIHRoZSBkYXRhLgorCQkgKi8KKwkJc3RhdHVzID0KKwkJICAgIGFjcGlfZXhfaW5zZXJ0X2ludG9fZmllbGQob2JqX2Rlc2MtPmJhbmtfZmllbGQuYmFua19vYmosCisJCQkJCSAgICAgICZvYmpfZGVzYy0+YmFua19maWVsZC52YWx1ZSwKKwkJCQkJICAgICAgc2l6ZW9mKG9ial9kZXNjLT5iYW5rX2ZpZWxkLgorCQkJCQkJICAgICB2YWx1ZSkpOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworCQl9CisKKwkJLyoKKwkJICogTm93IHRoYXQgdGhlIEJhbmsgaGFzIGJlZW4gc2VsZWN0ZWQsIGZhbGwgdGhyb3VnaCB0byB0aGUKKwkJICogcmVnaW9uX2ZpZWxkIGNhc2UgYW5kIHdyaXRlIHRoZSBkYXR1bSB0byB0aGUgT3BlcmF0aW9uIFJlZ2lvbgorCQkgKi8KKworCQkvKmxpbnQgLWZhbGx0aHJvdWdoICovCisKKwljYXNlIEFDUElfVFlQRV9MT0NBTF9SRUdJT05fRklFTEQ6CisJCS8qCisJCSAqIEZvciBzaW1wbGUgcmVnaW9uX2ZpZWxkcywgd2UganVzdCBkaXJlY3RseSBhY2Nlc3MgdGhlIG93bmluZworCQkgKiBPcGVyYXRpb24gUmVnaW9uLgorCQkgKi8KKwkJc3RhdHVzID0KKwkJICAgIGFjcGlfZXhfYWNjZXNzX3JlZ2lvbihvYmpfZGVzYywgZmllbGRfZGF0dW1fYnl0ZV9vZmZzZXQsCisJCQkJCSAgdmFsdWUsIHJlYWRfd3JpdGUpOworCQlicmVhazsKKworCWNhc2UgQUNQSV9UWVBFX0xPQ0FMX0lOREVYX0ZJRUxEOgorCisJCS8qCisJCSAqIEVuc3VyZSB0aGF0IHRoZSBpbmRleF92YWx1ZSBpcyBub3QgYmV5b25kIHRoZSBjYXBhY2l0eSBvZgorCQkgKiB0aGUgcmVnaXN0ZXIKKwkJICovCisJCWlmIChhY3BpX2V4X3JlZ2lzdGVyX292ZXJmbG93KG9ial9kZXNjLT5pbmRleF9maWVsZC5pbmRleF9vYmosCisJCQkJCSAgICAgIChhY3BpX2ludGVnZXIpIG9ial9kZXNjLT4KKwkJCQkJICAgICAgaW5kZXhfZmllbGQudmFsdWUpKSB7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX1JFR0lTVEVSX0xJTUlUKTsKKwkJfQorCisJCS8qIFdyaXRlIHRoZSBpbmRleCB2YWx1ZSB0byB0aGUgaW5kZXhfcmVnaXN0ZXIgKGl0c2VsZiBhIHJlZ2lvbl9maWVsZCkgKi8KKworCQlmaWVsZF9kYXR1bV9ieXRlX29mZnNldCArPSBvYmpfZGVzYy0+aW5kZXhfZmllbGQudmFsdWU7CisKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9CRklFTEQsCisJCQkJICAiV3JpdGUgdG8gSW5kZXggUmVnaXN0ZXI6IFZhbHVlICU4LjhYXG4iLAorCQkJCSAgZmllbGRfZGF0dW1fYnl0ZV9vZmZzZXQpKTsKKworCQlzdGF0dXMgPQorCQkgICAgYWNwaV9leF9pbnNlcnRfaW50b19maWVsZChvYmpfZGVzYy0+aW5kZXhfZmllbGQuaW5kZXhfb2JqLAorCQkJCQkgICAgICAmZmllbGRfZGF0dW1fYnl0ZV9vZmZzZXQsCisJCQkJCSAgICAgIHNpemVvZihmaWVsZF9kYXR1bV9ieXRlX29mZnNldCkpOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworCQl9CisKKwkJaWYgKHJlYWRfd3JpdGUgPT0gQUNQSV9SRUFEKSB7CisKKwkJCS8qIFJlYWQgdGhlIGRhdHVtIGZyb20gdGhlIGRhdGFfcmVnaXN0ZXIgKi8KKworCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9CRklFTEQsCisJCQkJCSAgIlJlYWQgZnJvbSBEYXRhIFJlZ2lzdGVyXG4iKSk7CisKKwkJCXN0YXR1cyA9CisJCQkgICAgYWNwaV9leF9leHRyYWN0X2Zyb21fZmllbGQob2JqX2Rlc2MtPmluZGV4X2ZpZWxkLgorCQkJCQkJICAgICAgIGRhdGFfb2JqLCB2YWx1ZSwKKwkJCQkJCSAgICAgICBzaXplb2YoYWNwaV9pbnRlZ2VyKSk7CisJCX0gZWxzZSB7CisJCQkvKiBXcml0ZSB0aGUgZGF0dW0gdG8gdGhlIGRhdGFfcmVnaXN0ZXIgKi8KKworCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9CRklFTEQsCisJCQkJCSAgIldyaXRlIHRvIERhdGEgUmVnaXN0ZXI6IFZhbHVlICU4LjhYJTguOFhcbiIsCisJCQkJCSAgQUNQSV9GT1JNQVRfVUlOVDY0KCp2YWx1ZSkpKTsKKworCQkJc3RhdHVzID0KKwkJCSAgICBhY3BpX2V4X2luc2VydF9pbnRvX2ZpZWxkKG9ial9kZXNjLT5pbmRleF9maWVsZC4KKwkJCQkJCSAgICAgIGRhdGFfb2JqLCB2YWx1ZSwKKwkJCQkJCSAgICAgIHNpemVvZihhY3BpX2ludGVnZXIpKTsKKwkJfQorCQlicmVhazsKKworCWRlZmF1bHQ6CisKKwkJQUNQSV9FUlJPUigoQUVfSU5GTywgIldyb25nIG9iamVjdCB0eXBlIGluIGZpZWxkIEkvTyAlWCIsCisJCQkgICAgQUNQSV9HRVRfT0JKRUNUX1RZUEUob2JqX2Rlc2MpKSk7CisJCXN0YXR1cyA9IEFFX0FNTF9JTlRFUk5BTDsKKwkJYnJlYWs7CisJfQorCisJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCWlmIChyZWFkX3dyaXRlID09IEFDUElfUkVBRCkgeworCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9CRklFTEQsCisJCQkJCSAgIlZhbHVlIFJlYWQgJTguOFglOC44WCwgV2lkdGggJWRcbiIsCisJCQkJCSAgQUNQSV9GT1JNQVRfVUlOVDY0KCp2YWx1ZSksCisJCQkJCSAgb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC4KKwkJCQkJICBhY2Nlc3NfYnl0ZV93aWR0aCkpOworCQl9IGVsc2UgeworCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9CRklFTEQsCisJCQkJCSAgIlZhbHVlIFdyaXR0ZW4gJTguOFglOC44WCwgV2lkdGggJWRcbiIsCisJCQkJCSAgQUNQSV9GT1JNQVRfVUlOVDY0KCp2YWx1ZSksCisJCQkJCSAgb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC4KKwkJCQkJICBhY2Nlc3NfYnl0ZV93aWR0aCkpOworCQl9CisJfQorCisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfZXhfd3JpdGVfd2l0aF91cGRhdGVfcnVsZQorICoKKyAqIFBBUkFNRVRFUlM6ICBvYmpfZGVzYyAgICAgICAgICAgICAgICAtIEZpZWxkIHRvIGJlIHdyaXR0ZW4KKyAqICAgICAgICAgICAgICBNYXNrICAgICAgICAgICAgICAgICAgICAtIGJpdG1hc2sgd2l0aGluIGZpZWxkIGRhdHVtCisgKiAgICAgICAgICAgICAgZmllbGRfdmFsdWUgICAgICAgICAgICAgLSBWYWx1ZSB0byB3cml0ZQorICogICAgICAgICAgICAgIGZpZWxkX2RhdHVtX2J5dGVfb2Zmc2V0IC0gT2Zmc2V0IG9mIGRhdHVtIHdpdGhpbiBmaWVsZAorICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogQXBwbHkgdGhlIGZpZWxkIHVwZGF0ZSBydWxlIHRvIGEgZmllbGQgd3JpdGUKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCithY3BpX3N0YXR1cworYWNwaV9leF93cml0ZV93aXRoX3VwZGF0ZV9ydWxlKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjLAorCQkJICAgICAgIGFjcGlfaW50ZWdlciBtYXNrLAorCQkJICAgICAgIGFjcGlfaW50ZWdlciBmaWVsZF92YWx1ZSwKKwkJCSAgICAgICB1MzIgZmllbGRfZGF0dW1fYnl0ZV9vZmZzZXQpCit7CisJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CisJYWNwaV9pbnRlZ2VyIG1lcmdlZF92YWx1ZTsKKwlhY3BpX2ludGVnZXIgY3VycmVudF92YWx1ZTsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0VfVTMyKGV4X3dyaXRlX3dpdGhfdXBkYXRlX3J1bGUsIG1hc2spOworCisJLyogU3RhcnQgd2l0aCB0aGUgbmV3IGJpdHMgICovCisKKwltZXJnZWRfdmFsdWUgPSBmaWVsZF92YWx1ZTsKKworCS8qIElmIHRoZSBtYXNrIGlzIGFsbCBvbmVzLCB3ZSBkb24ndCBuZWVkIHRvIHdvcnJ5IGFib3V0IHRoZSB1cGRhdGUgcnVsZSAqLworCisJaWYgKG1hc2sgIT0gQUNQSV9JTlRFR0VSX01BWCkgeworCisJCS8qIERlY29kZSB0aGUgdXBkYXRlIHJ1bGUgKi8KKworCQlzd2l0Y2ggKG9ial9kZXNjLT5jb21tb25fZmllbGQuCisJCQlmaWVsZF9mbGFncyAmIEFNTF9GSUVMRF9VUERBVEVfUlVMRV9NQVNLKSB7CisJCWNhc2UgQU1MX0ZJRUxEX1VQREFURV9QUkVTRVJWRToKKwkJCS8qCisJCQkgKiBDaGVjayBpZiB1cGRhdGUgcnVsZSBuZWVkcyB0byBiZSBhcHBsaWVkIChub3QgaWYgbWFzayBpcyBhbGwKKwkJCSAqIG9uZXMpICBUaGUgbGVmdCBzaGlmdCBkcm9wcyB0aGUgYml0cyB3ZSB3YW50IHRvIGlnbm9yZS4KKwkJCSAqLworCQkJaWYgKCh+bWFzayA8PCAoQUNQSV9NVUxfOChzaXplb2YobWFzaykpIC0KKwkJCQkgICAgICAgQUNQSV9NVUxfOChvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLgorCQkJCQkJICBhY2Nlc3NfYnl0ZV93aWR0aCkpKSAhPSAwKSB7CisJCQkJLyoKKwkJCQkgKiBSZWFkIHRoZSBjdXJyZW50IGNvbnRlbnRzIG9mIHRoZSBieXRlL3dvcmQvZHdvcmQgY29udGFpbmluZworCQkJCSAqIHRoZSBmaWVsZCwgYW5kIG1lcmdlIHdpdGggdGhlIG5ldyBmaWVsZCB2YWx1ZS4KKwkJCQkgKi8KKwkJCQlzdGF0dXMgPQorCQkJCSAgICBhY3BpX2V4X2ZpZWxkX2RhdHVtX2lvKG9ial9kZXNjLAorCQkJCQkJCSAgIGZpZWxkX2RhdHVtX2J5dGVfb2Zmc2V0LAorCQkJCQkJCSAgICZjdXJyZW50X3ZhbHVlLAorCQkJCQkJCSAgIEFDUElfUkVBRCk7CisJCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworCQkJCX0KKworCQkJCW1lcmdlZF92YWx1ZSB8PSAoY3VycmVudF92YWx1ZSAmIH5tYXNrKTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgQU1MX0ZJRUxEX1VQREFURV9XUklURV9BU19PTkVTOgorCisJCQkvKiBTZXQgcG9zaXRpb25zIG91dHNpZGUgdGhlIGZpZWxkIHRvIGFsbCBvbmVzICovCisKKwkJCW1lcmdlZF92YWx1ZSB8PSB+bWFzazsKKwkJCWJyZWFrOworCisJCWNhc2UgQU1MX0ZJRUxEX1VQREFURV9XUklURV9BU19aRVJPUzoKKworCQkJLyogU2V0IHBvc2l0aW9ucyBvdXRzaWRlIHRoZSBmaWVsZCB0byBhbGwgemVyb3MgKi8KKworCQkJbWVyZ2VkX3ZhbHVlICY9IG1hc2s7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCisJCQlBQ1BJX0VSUk9SKChBRV9JTkZPLAorCQkJCSAgICAiVW5rbm93biBVcGRhdGVSdWxlIHZhbHVlOiAlWCIsCisJCQkJICAgIChvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLgorCQkJCSAgICAgZmllbGRfZmxhZ3MgJgorCQkJCSAgICAgQU1MX0ZJRUxEX1VQREFURV9SVUxFX01BU0spKSk7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX09QRVJBTkRfVkFMVUUpOworCQl9CisJfQorCisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9CRklFTEQsCisJCQkgICJNYXNrICU4LjhYJTguOFgsIERhdHVtT2Zmc2V0ICVYLCBXaWR0aCAlWCwgVmFsdWUgJTguOFglOC44WCwgTWVyZ2VkVmFsdWUgJTguOFglOC44WFxuIiwKKwkJCSAgQUNQSV9GT1JNQVRfVUlOVDY0KG1hc2spLAorCQkJICBmaWVsZF9kYXR1bV9ieXRlX29mZnNldCwKKwkJCSAgb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5hY2Nlc3NfYnl0ZV93aWR0aCwKKwkJCSAgQUNQSV9GT1JNQVRfVUlOVDY0KGZpZWxkX3ZhbHVlKSwKKwkJCSAgQUNQSV9GT1JNQVRfVUlOVDY0KG1lcmdlZF92YWx1ZSkpKTsKKworCS8qIFdyaXRlIHRoZSBtZXJnZWQgdmFsdWUgKi8KKworCXN0YXR1cyA9IGFjcGlfZXhfZmllbGRfZGF0dW1faW8ob2JqX2Rlc2MsIGZpZWxkX2RhdHVtX2J5dGVfb2Zmc2V0LAorCQkJCQkmbWVyZ2VkX3ZhbHVlLCBBQ1BJX1dSSVRFKTsKKworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X2V4dHJhY3RfZnJvbV9maWVsZAorICoKKyAqIFBBUkFNRVRFUlM6ICBvYmpfZGVzYyAgICAgICAgICAgIC0gRmllbGQgdG8gYmUgcmVhZAorICogICAgICAgICAgICAgIEJ1ZmZlciAgICAgICAgICAgICAgLSBXaGVyZSB0byBzdG9yZSB0aGUgZmllbGQgZGF0YQorICogICAgICAgICAgICAgIGJ1ZmZlcl9sZW5ndGggICAgICAgLSBMZW5ndGggb2YgQnVmZmVyCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBSZXRyaWV2ZSB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgZ2l2ZW4gZmllbGQKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCithY3BpX3N0YXR1cworYWNwaV9leF9leHRyYWN0X2Zyb21fZmllbGQodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2MsCisJCQkgICB2b2lkICpidWZmZXIsIHUzMiBidWZmZXJfbGVuZ3RoKQoreworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwlhY3BpX2ludGVnZXIgcmF3X2RhdHVtOworCWFjcGlfaW50ZWdlciBtZXJnZWRfZGF0dW07CisJdTMyIGZpZWxkX29mZnNldCA9IDA7CisJdTMyIGJ1ZmZlcl9vZmZzZXQgPSAwOworCXUzMiBidWZmZXJfdGFpbF9iaXRzOworCXUzMiBkYXR1bV9jb3VudDsKKwl1MzIgZmllbGRfZGF0dW1fY291bnQ7CisJdTMyIGk7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGV4X2V4dHJhY3RfZnJvbV9maWVsZCk7CisKKwkvKiBWYWxpZGF0ZSB0YXJnZXQgYnVmZmVyIGFuZCBjbGVhciBpdCAqLworCisJaWYgKGJ1ZmZlcl9sZW5ndGggPAorCSAgICBBQ1BJX1JPVU5EX0JJVFNfVVBfVE9fQllURVMob2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5iaXRfbGVuZ3RoKSkgeworCQlBQ1BJX0VSUk9SKChBRV9JTkZPLAorCQkJICAgICJGaWVsZCBzaXplICVYIChiaXRzKSBpcyB0b28gbGFyZ2UgZm9yIGJ1ZmZlciAoJVgpIiwKKwkJCSAgICBvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmJpdF9sZW5ndGgsIGJ1ZmZlcl9sZW5ndGgpKTsKKworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQlVGRkVSX09WRVJGTE9XKTsKKwl9CisJQUNQSV9NRU1TRVQoYnVmZmVyLCAwLCBidWZmZXJfbGVuZ3RoKTsKKworCS8qIENvbXB1dGUgdGhlIG51bWJlciBvZiBkYXR1bXMgKGFjY2VzcyB3aWR0aCBkYXRhIGl0ZW1zKSAqLworCisJZGF0dW1fY291bnQgPSBBQ1BJX1JPVU5EX1VQX1RPKG9ial9kZXNjLT5jb21tb25fZmllbGQuYml0X2xlbmd0aCwKKwkJCQkgICAgICAgb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5hY2Nlc3NfYml0X3dpZHRoKTsKKwlmaWVsZF9kYXR1bV9jb3VudCA9IEFDUElfUk9VTkRfVVBfVE8ob2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5iaXRfbGVuZ3RoICsKKwkJCQkJICAgICBvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLgorCQkJCQkgICAgIHN0YXJ0X2ZpZWxkX2JpdF9vZmZzZXQsCisJCQkJCSAgICAgb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC4KKwkJCQkJICAgICBhY2Nlc3NfYml0X3dpZHRoKTsKKworCS8qIFByaW1pbmcgcmVhZCBmcm9tIHRoZSBmaWVsZCAqLworCisJc3RhdHVzID0KKwkgICAgYWNwaV9leF9maWVsZF9kYXR1bV9pbyhvYmpfZGVzYywgZmllbGRfb2Zmc2V0LCAmcmF3X2RhdHVtLAorCQkJCSAgIEFDUElfUkVBRCk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworCX0KKwltZXJnZWRfZGF0dW0gPQorCSAgICByYXdfZGF0dW0gPj4gb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5zdGFydF9maWVsZF9iaXRfb2Zmc2V0OworCisJLyogUmVhZCB0aGUgcmVzdCBvZiB0aGUgZmllbGQgKi8KKworCWZvciAoaSA9IDE7IGkgPCBmaWVsZF9kYXR1bV9jb3VudDsgaSsrKSB7CisKKwkJLyogR2V0IG5leHQgaW5wdXQgZGF0dW0gZnJvbSB0aGUgZmllbGQgKi8KKworCQlmaWVsZF9vZmZzZXQgKz0gb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5hY2Nlc3NfYnl0ZV93aWR0aDsKKwkJc3RhdHVzID0gYWNwaV9leF9maWVsZF9kYXR1bV9pbyhvYmpfZGVzYywgZmllbGRfb2Zmc2V0LAorCQkJCQkJJnJhd19kYXR1bSwgQUNQSV9SRUFEKTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKKwkJfQorCisJCS8qCisJCSAqIE1lcmdlIHdpdGggcHJldmlvdXMgZGF0dW0gaWYgbmVjZXNzYXJ5LgorCQkgKgorCQkgKiBOb3RlOiBCZWZvcmUgdGhlIHNoaWZ0LCBjaGVjayBpZiB0aGUgc2hpZnQgdmFsdWUgd2lsbCBiZSBsYXJnZXIgdGhhbgorCQkgKiB0aGUgaW50ZWdlciBzaXplLiBJZiBzbywgdGhlcmUgaXMgbm8gbmVlZCB0byBwZXJmb3JtIHRoZSBvcGVyYXRpb24uCisJCSAqIFRoaXMgYXZvaWRzIHRoZSBkaWZmZXJlbmNlcyBpbiBiZWhhdmlvciBiZXR3ZWVuIGRpZmZlcmVudCBjb21waWxlcnMKKwkJICogY29uY2VybmluZyBzaGlmdCB2YWx1ZXMgbGFyZ2VyIHRoYW4gdGhlIHRhcmdldCBkYXRhIHdpZHRoLgorCQkgKi8KKwkJaWYgKChvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmFjY2Vzc19iaXRfd2lkdGggLQorCQkgICAgIG9ial9kZXNjLT5jb21tb25fZmllbGQuc3RhcnRfZmllbGRfYml0X29mZnNldCkgPAorCQkgICAgQUNQSV9JTlRFR0VSX0JJVF9TSVpFKSB7CisJCQltZXJnZWRfZGF0dW0gfD0KKwkJCSAgICByYXdfZGF0dW0gPDwgKG9ial9kZXNjLT5jb21tb25fZmllbGQuCisJCQkJCSAgYWNjZXNzX2JpdF93aWR0aCAtCisJCQkJCSAgb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC4KKwkJCQkJICBzdGFydF9maWVsZF9iaXRfb2Zmc2V0KTsKKwkJfQorCisJCWlmIChpID09IGRhdHVtX2NvdW50KSB7CisJCQlicmVhazsKKwkJfQorCisJCS8qIFdyaXRlIG1lcmdlZCBkYXR1bSB0byB0YXJnZXQgYnVmZmVyICovCisKKwkJQUNQSV9NRU1DUFkoKChjaGFyICopYnVmZmVyKSArIGJ1ZmZlcl9vZmZzZXQsICZtZXJnZWRfZGF0dW0sCisJCQkgICAgQUNQSV9NSU4ob2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5hY2Nlc3NfYnl0ZV93aWR0aCwKKwkJCQkgICAgIGJ1ZmZlcl9sZW5ndGggLSBidWZmZXJfb2Zmc2V0KSk7CisKKwkJYnVmZmVyX29mZnNldCArPSBvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmFjY2Vzc19ieXRlX3dpZHRoOworCQltZXJnZWRfZGF0dW0gPQorCQkgICAgcmF3X2RhdHVtID4+IG9ial9kZXNjLT5jb21tb25fZmllbGQuc3RhcnRfZmllbGRfYml0X29mZnNldDsKKwl9CisKKwkvKiBNYXNrIG9mZiBhbnkgZXh0cmEgYml0cyBpbiB0aGUgbGFzdCBkYXR1bSAqLworCisJYnVmZmVyX3RhaWxfYml0cyA9IG9ial9kZXNjLT5jb21tb25fZmllbGQuYml0X2xlbmd0aCAlCisJICAgIG9ial9kZXNjLT5jb21tb25fZmllbGQuYWNjZXNzX2JpdF93aWR0aDsKKwlpZiAoYnVmZmVyX3RhaWxfYml0cykgeworCQltZXJnZWRfZGF0dW0gJj0gQUNQSV9NQVNLX0JJVFNfQUJPVkUoYnVmZmVyX3RhaWxfYml0cyk7CisJfQorCisJLyogV3JpdGUgdGhlIGxhc3QgZGF0dW0gdG8gdGhlIGJ1ZmZlciAqLworCisJQUNQSV9NRU1DUFkoKChjaGFyICopYnVmZmVyKSArIGJ1ZmZlcl9vZmZzZXQsICZtZXJnZWRfZGF0dW0sCisJCSAgICBBQ1BJX01JTihvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmFjY2Vzc19ieXRlX3dpZHRoLAorCQkJICAgICBidWZmZXJfbGVuZ3RoIC0gYnVmZmVyX29mZnNldCkpOworCisJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9leF9pbnNlcnRfaW50b19maWVsZAorICoKKyAqIFBBUkFNRVRFUlM6ICBvYmpfZGVzYyAgICAgICAgICAgIC0gRmllbGQgdG8gYmUgd3JpdHRlbgorICogICAgICAgICAgICAgIEJ1ZmZlciAgICAgICAgICAgICAgLSBEYXRhIHRvIGJlIHdyaXR0ZW4KKyAqICAgICAgICAgICAgICBidWZmZXJfbGVuZ3RoICAgICAgIC0gTGVuZ3RoIG9mIEJ1ZmZlcgorICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogU3RvcmUgdGhlIEJ1ZmZlciBjb250ZW50cyBpbnRvIHRoZSBnaXZlbiBmaWVsZAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2FjcGlfc3RhdHVzCithY3BpX2V4X2luc2VydF9pbnRvX2ZpZWxkKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjLAorCQkJICB2b2lkICpidWZmZXIsIHUzMiBidWZmZXJfbGVuZ3RoKQoreworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwlhY3BpX2ludGVnZXIgbWFzazsKKwlhY3BpX2ludGVnZXIgd2lkdGhfbWFzazsKKwlhY3BpX2ludGVnZXIgbWVyZ2VkX2RhdHVtOworCWFjcGlfaW50ZWdlciByYXdfZGF0dW0gPSAwOworCXUzMiBmaWVsZF9vZmZzZXQgPSAwOworCXUzMiBidWZmZXJfb2Zmc2V0ID0gMDsKKwl1MzIgYnVmZmVyX3RhaWxfYml0czsKKwl1MzIgZGF0dW1fY291bnQ7CisJdTMyIGZpZWxkX2RhdHVtX2NvdW50OworCXUzMiBpOworCXUzMiByZXF1aXJlZF9sZW5ndGg7CisJdm9pZCAqbmV3X2J1ZmZlcjsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0UoZXhfaW5zZXJ0X2ludG9fZmllbGQpOworCisJLyogVmFsaWRhdGUgaW5wdXQgYnVmZmVyICovCisKKwluZXdfYnVmZmVyID0gTlVMTDsKKwlyZXF1aXJlZF9sZW5ndGggPQorCSAgICBBQ1BJX1JPVU5EX0JJVFNfVVBfVE9fQllURVMob2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5iaXRfbGVuZ3RoKTsKKwkvKgorCSAqIFdlIG11c3QgaGF2ZSBhIGJ1ZmZlciB0aGF0IGlzIGF0IGxlYXN0IGFzIGxvbmcgYXMgdGhlIGZpZWxkCisJICogd2UgYXJlIHdyaXRpbmcgdG8uICBUaGlzIGlzIGJlY2F1c2UgaW5kaXZpZHVhbCBmaWVsZHMgYXJlCisJICogaW5kaXZpc2libGUgYW5kIHBhcnRpYWwgd3JpdGVzIGFyZSBub3Qgc3VwcG9ydGVkIC0tIGFzIHBlcgorCSAqIHRoZSBBQ1BJIHNwZWNpZmljYXRpb24uCisJICovCisJaWYgKGJ1ZmZlcl9sZW5ndGggPCByZXF1aXJlZF9sZW5ndGgpIHsKKworCQkvKiBXZSBuZWVkIHRvIGNyZWF0ZSBhIG5ldyBidWZmZXIgKi8KKworCQluZXdfYnVmZmVyID0gQUNQSV9BTExPQ0FURV9aRVJPRUQocmVxdWlyZWRfbGVuZ3RoKTsKKwkJaWYgKCFuZXdfYnVmZmVyKSB7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9fTUVNT1JZKTsKKwkJfQorCisJCS8qCisJCSAqIENvcHkgdGhlIG9yaWdpbmFsIGRhdGEgdG8gdGhlIG5ldyBidWZmZXIsIHN0YXJ0aW5nCisJCSAqIGF0IEJ5dGUgemVyby4gIEFsbCB1bnVzZWQgKHVwcGVyKSBieXRlcyBvZiB0aGUKKwkJICogYnVmZmVyIHdpbGwgYmUgMC4KKwkJICovCisJCUFDUElfTUVNQ1BZKChjaGFyICopbmV3X2J1ZmZlciwgKGNoYXIgKilidWZmZXIsIGJ1ZmZlcl9sZW5ndGgpOworCQlidWZmZXIgPSBuZXdfYnVmZmVyOworCQlidWZmZXJfbGVuZ3RoID0gcmVxdWlyZWRfbGVuZ3RoOworCX0KKworCS8qCisJICogQ3JlYXRlIHRoZSBiaXRtYXNrcyB1c2VkIGZvciBiaXQgaW5zZXJ0aW9uLgorCSAqIE5vdGU6IFRoaXMgaWYvZWxzZSBpcyB1c2VkIHRvIGJ5cGFzcyBjb21waWxlciBkaWZmZXJlbmNlcyB3aXRoIHRoZQorCSAqIHNoaWZ0IG9wZXJhdG9yCisJICovCisJaWYgKG9ial9kZXNjLT5jb21tb25fZmllbGQuYWNjZXNzX2JpdF93aWR0aCA9PSBBQ1BJX0lOVEVHRVJfQklUX1NJWkUpIHsKKwkJd2lkdGhfbWFzayA9IEFDUElfSU5URUdFUl9NQVg7CisJfSBlbHNlIHsKKwkJd2lkdGhfbWFzayA9CisJCSAgICBBQ1BJX01BU0tfQklUU19BQk9WRShvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLgorCQkJCQkgYWNjZXNzX2JpdF93aWR0aCk7CisJfQorCisJbWFzayA9IHdpZHRoX21hc2sgJgorCSAgICBBQ1BJX01BU0tfQklUU19CRUxPVyhvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLnN0YXJ0X2ZpZWxkX2JpdF9vZmZzZXQpOworCisJLyogQ29tcHV0ZSB0aGUgbnVtYmVyIG9mIGRhdHVtcyAoYWNjZXNzIHdpZHRoIGRhdGEgaXRlbXMpICovCisKKwlkYXR1bV9jb3VudCA9IEFDUElfUk9VTkRfVVBfVE8ob2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5iaXRfbGVuZ3RoLAorCQkJCSAgICAgICBvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmFjY2Vzc19iaXRfd2lkdGgpOworCisJZmllbGRfZGF0dW1fY291bnQgPSBBQ1BJX1JPVU5EX1VQX1RPKG9ial9kZXNjLT5jb21tb25fZmllbGQuYml0X2xlbmd0aCArCisJCQkJCSAgICAgb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC4KKwkJCQkJICAgICBzdGFydF9maWVsZF9iaXRfb2Zmc2V0LAorCQkJCQkgICAgIG9ial9kZXNjLT5jb21tb25fZmllbGQuCisJCQkJCSAgICAgYWNjZXNzX2JpdF93aWR0aCk7CisKKwkvKiBHZXQgaW5pdGlhbCBEYXR1bSBmcm9tIHRoZSBpbnB1dCBidWZmZXIgKi8KKworCUFDUElfTUVNQ1BZKCZyYXdfZGF0dW0sIGJ1ZmZlciwKKwkJICAgIEFDUElfTUlOKG9ial9kZXNjLT5jb21tb25fZmllbGQuYWNjZXNzX2J5dGVfd2lkdGgsCisJCQkgICAgIGJ1ZmZlcl9sZW5ndGggLSBidWZmZXJfb2Zmc2V0KSk7CisKKwltZXJnZWRfZGF0dW0gPQorCSAgICByYXdfZGF0dW0gPDwgb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5zdGFydF9maWVsZF9iaXRfb2Zmc2V0OworCisJLyogV3JpdGUgdGhlIGVudGlyZSBmaWVsZCAqLworCisJZm9yIChpID0gMTsgaSA8IGZpZWxkX2RhdHVtX2NvdW50OyBpKyspIHsKKworCQkvKiBXcml0ZSBtZXJnZWQgZGF0dW0gdG8gdGhlIHRhcmdldCBmaWVsZCAqLworCisJCW1lcmdlZF9kYXR1bSAmPSBtYXNrOworCQlzdGF0dXMgPSBhY3BpX2V4X3dyaXRlX3dpdGhfdXBkYXRlX3J1bGUob2JqX2Rlc2MsIG1hc2ssCisJCQkJCQkJbWVyZ2VkX2RhdHVtLAorCQkJCQkJCWZpZWxkX29mZnNldCk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJZ290byBleGl0OworCQl9CisKKwkJZmllbGRfb2Zmc2V0ICs9IG9ial9kZXNjLT5jb21tb25fZmllbGQuYWNjZXNzX2J5dGVfd2lkdGg7CisKKwkJLyoKKwkJICogU3RhcnQgbmV3IG91dHB1dCBkYXR1bSBieSBtZXJnaW5nIHdpdGggcHJldmlvdXMgaW5wdXQgZGF0dW0KKwkJICogaWYgbmVjZXNzYXJ5LgorCQkgKgorCQkgKiBOb3RlOiBCZWZvcmUgdGhlIHNoaWZ0LCBjaGVjayBpZiB0aGUgc2hpZnQgdmFsdWUgd2lsbCBiZSBsYXJnZXIgdGhhbgorCQkgKiB0aGUgaW50ZWdlciBzaXplLiBJZiBzbywgdGhlcmUgaXMgbm8gbmVlZCB0byBwZXJmb3JtIHRoZSBvcGVyYXRpb24uCisJCSAqIFRoaXMgYXZvaWRzIHRoZSBkaWZmZXJlbmNlcyBpbiBiZWhhdmlvciBiZXR3ZWVuIGRpZmZlcmVudCBjb21waWxlcnMKKwkJICogY29uY2VybmluZyBzaGlmdCB2YWx1ZXMgbGFyZ2VyIHRoYW4gdGhlIHRhcmdldCBkYXRhIHdpZHRoLgorCQkgKi8KKwkJaWYgKChvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmFjY2Vzc19iaXRfd2lkdGggLQorCQkgICAgIG9ial9kZXNjLT5jb21tb25fZmllbGQuc3RhcnRfZmllbGRfYml0X29mZnNldCkgPAorCQkgICAgQUNQSV9JTlRFR0VSX0JJVF9TSVpFKSB7CisJCQltZXJnZWRfZGF0dW0gPQorCQkJICAgIHJhd19kYXR1bSA+PiAob2JqX2Rlc2MtPmNvbW1vbl9maWVsZC4KKwkJCQkJICBhY2Nlc3NfYml0X3dpZHRoIC0KKwkJCQkJICBvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLgorCQkJCQkgIHN0YXJ0X2ZpZWxkX2JpdF9vZmZzZXQpOworCQl9IGVsc2UgeworCQkJbWVyZ2VkX2RhdHVtID0gMDsKKwkJfQorCisJCW1hc2sgPSB3aWR0aF9tYXNrOworCisJCWlmIChpID09IGRhdHVtX2NvdW50KSB7CisJCQlicmVhazsKKwkJfQorCisJCS8qIEdldCB0aGUgbmV4dCBpbnB1dCBkYXR1bSBmcm9tIHRoZSBidWZmZXIgKi8KKworCQlidWZmZXJfb2Zmc2V0ICs9IG9ial9kZXNjLT5jb21tb25fZmllbGQuYWNjZXNzX2J5dGVfd2lkdGg7CisJCUFDUElfTUVNQ1BZKCZyYXdfZGF0dW0sICgoY2hhciAqKWJ1ZmZlcikgKyBidWZmZXJfb2Zmc2V0LAorCQkJICAgIEFDUElfTUlOKG9ial9kZXNjLT5jb21tb25fZmllbGQuYWNjZXNzX2J5dGVfd2lkdGgsCisJCQkJICAgICBidWZmZXJfbGVuZ3RoIC0gYnVmZmVyX29mZnNldCkpOworCQltZXJnZWRfZGF0dW0gfD0KKwkJICAgIHJhd19kYXR1bSA8PCBvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLnN0YXJ0X2ZpZWxkX2JpdF9vZmZzZXQ7CisJfQorCisJLyogTWFzayBvZmYgYW55IGV4dHJhIGJpdHMgaW4gdGhlIGxhc3QgZGF0dW0gKi8KKworCWJ1ZmZlcl90YWlsX2JpdHMgPSAob2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5iaXRfbGVuZ3RoICsKKwkJCSAgICBvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLnN0YXJ0X2ZpZWxkX2JpdF9vZmZzZXQpICUKKwkgICAgb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5hY2Nlc3NfYml0X3dpZHRoOworCWlmIChidWZmZXJfdGFpbF9iaXRzKSB7CisJCW1hc2sgJj0gQUNQSV9NQVNLX0JJVFNfQUJPVkUoYnVmZmVyX3RhaWxfYml0cyk7CisJfQorCisJLyogV3JpdGUgdGhlIGxhc3QgZGF0dW0gdG8gdGhlIGZpZWxkICovCisKKwltZXJnZWRfZGF0dW0gJj0gbWFzazsKKwlzdGF0dXMgPSBhY3BpX2V4X3dyaXRlX3dpdGhfdXBkYXRlX3J1bGUob2JqX2Rlc2MsCisJCQkJCQltYXNrLCBtZXJnZWRfZGF0dW0sCisJCQkJCQlmaWVsZF9vZmZzZXQpOworCisgICAgICBleGl0OgorCS8qIEZyZWUgdGVtcG9yYXJ5IGJ1ZmZlciBpZiB3ZSB1c2VkIG9uZSAqLworCisJaWYgKG5ld19idWZmZXIpIHsKKwkJQUNQSV9GUkVFKG5ld19idWZmZXIpOworCX0KKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXhtaXNjLmMgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2V4bWlzYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiMDc0N2FjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS9leG1pc2MuYwpAQCAtMCwwICsxLDcyNiBAQAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogTW9kdWxlIE5hbWU6IGV4bWlzYyAtIEFDUEkgQU1MIChwLWNvZGUpIGV4ZWN1dGlvbiAtIHNwZWNpZmljIG9wY29kZXMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA4LCBJbnRlbCBDb3JwLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAorICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgYXQgbWluaW11bSBhIGRpc2NsYWltZXIKKyAqICAgIHN1YnN0YW50aWFsbHkgc2ltaWxhciB0byB0aGUgIk5PIFdBUlJBTlRZIiBkaXNjbGFpbWVyIGJlbG93CisgKiAgICAoIkRpc2NsYWltZXIiKSBhbmQgYW55IHJlZGlzdHJpYnV0aW9uIG11c3QgYmUgY29uZGl0aW9uZWQgdXBvbgorICogICAgaW5jbHVkaW5nIGEgc3Vic3RhbnRpYWxseSBzaW1pbGFyIERpc2NsYWltZXIgcmVxdWlyZW1lbnQgZm9yIGZ1cnRoZXIKKyAqICAgIGJpbmFyeSByZWRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcworICogICAgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBOTyBXQVJSQU5UWQorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcKKyAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgorICovCisKKyNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KKyNpbmNsdWRlICJhY2NvbW1vbi5oIgorI2luY2x1ZGUgImFjaW50ZXJwLmgiCisjaW5jbHVkZSAiYW1sY29kZS5oIgorI2luY2x1ZGUgImFtbHJlc3JjLmgiCisKKyNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX0VYRUNVVEVSCitBQ1BJX01PRFVMRV9OQU1FKCJleG1pc2MiKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X2dldF9vYmplY3RfcmVmZXJlbmNlCisgKgorICogUEFSQU1FVEVSUzogIG9ial9kZXNjICAgICAgICAgICAgLSBDcmVhdGUgYSByZWZlcmVuY2UgdG8gdGhpcyBvYmplY3QKKyAqICAgICAgICAgICAgICByZXR1cm5fZGVzYyAgICAgICAgIC0gV2hlcmUgdG8gc3RvcmUgdGhlIHJlZmVyZW5jZQorICogICAgICAgICAgICAgIHdhbGtfc3RhdGUgICAgICAgICAgLSBDdXJyZW50IHN0YXRlCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBPYnRhaW4gYW5kIHJldHVybiBhICJyZWZlcmVuY2UiIHRvIHRoZSB0YXJnZXQgb2JqZWN0CisgKiAgICAgICAgICAgICAgQ29tbW9uIGNvZGUgZm9yIHRoZSByZWZfb2Zfb3AgYW5kIHRoZSBjb25kX3JlZl9vZl9vcC4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYWNwaV9zdGF0dXMKK2FjcGlfZXhfZ2V0X29iamVjdF9yZWZlcmVuY2UodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2MsCisJCQkgICAgIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKipyZXR1cm5fZGVzYywKKwkJCSAgICAgc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSkKK3sKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpyZWZlcmVuY2Vfb2JqOworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnJlZmVyZW5jZWRfb2JqOworCisJQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIoZXhfZ2V0X29iamVjdF9yZWZlcmVuY2UsIG9ial9kZXNjKTsKKworCSpyZXR1cm5fZGVzYyA9IE5VTEw7CisKKwlzd2l0Y2ggKEFDUElfR0VUX0RFU0NSSVBUT1JfVFlQRShvYmpfZGVzYykpIHsKKwljYXNlIEFDUElfREVTQ19UWVBFX09QRVJBTkQ6CisKKwkJaWYgKEFDUElfR0VUX09CSkVDVF9UWVBFKG9ial9kZXNjKSAhPSBBQ1BJX1RZUEVfTE9DQUxfUkVGRVJFTkNFKSB7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX09QRVJBTkRfVFlQRSk7CisJCX0KKworCQkvKgorCQkgKiBNdXN0IGJlIGEgcmVmZXJlbmNlIHRvIGEgTG9jYWwgb3IgQXJnCisJCSAqLworCQlzd2l0Y2ggKG9ial9kZXNjLT5yZWZlcmVuY2UuY2xhc3MpIHsKKwkJY2FzZSBBQ1BJX1JFRkNMQVNTX0xPQ0FMOgorCQljYXNlIEFDUElfUkVGQ0xBU1NfQVJHOgorCQljYXNlIEFDUElfUkVGQ0xBU1NfREVCVUc6CisKKwkJCS8qIFRoZSByZWZlcmVuY2VkIG9iamVjdCBpcyB0aGUgcHNldWRvLW5vZGUgZm9yIHRoZSBsb2NhbC9hcmcgKi8KKworCQkJcmVmZXJlbmNlZF9vYmogPSBvYmpfZGVzYy0+cmVmZXJlbmNlLm9iamVjdDsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisKKwkJCUFDUElfRVJST1IoKEFFX0lORk8sICJVbmtub3duIFJlZmVyZW5jZSBDbGFzcyAlMi4yWCIsCisJCQkJICAgIG9ial9kZXNjLT5yZWZlcmVuY2UuY2xhc3MpKTsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfSU5URVJOQUwpOworCQl9CisJCWJyZWFrOworCisJY2FzZSBBQ1BJX0RFU0NfVFlQRV9OQU1FRDoKKworCQkvKgorCQkgKiBBIG5hbWVkIHJlZmVyZW5jZSB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gcmVzb2x2ZWQgdG8gYSBOb2RlCisJCSAqLworCQlyZWZlcmVuY2VkX29iaiA9IG9ial9kZXNjOworCQlicmVhazsKKworCWRlZmF1bHQ6CisKKwkJQUNQSV9FUlJPUigoQUVfSU5GTywgIkludmFsaWQgZGVzY3JpcHRvciB0eXBlICVYIiwKKwkJCSAgICBBQ1BJX0dFVF9ERVNDUklQVE9SX1RZUEUob2JqX2Rlc2MpKSk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9UWVBFKTsKKwl9CisKKwkvKiBDcmVhdGUgYSBuZXcgcmVmZXJlbmNlIG9iamVjdCAqLworCisJcmVmZXJlbmNlX29iaiA9CisJICAgIGFjcGlfdXRfY3JlYXRlX2ludGVybmFsX29iamVjdChBQ1BJX1RZUEVfTE9DQUxfUkVGRVJFTkNFKTsKKwlpZiAoIXJlZmVyZW5jZV9vYmopIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX01FTU9SWSk7CisJfQorCisJcmVmZXJlbmNlX29iai0+cmVmZXJlbmNlLmNsYXNzID0gQUNQSV9SRUZDTEFTU19SRUZPRjsKKwlyZWZlcmVuY2Vfb2JqLT5yZWZlcmVuY2Uub2JqZWN0ID0gcmVmZXJlbmNlZF9vYmo7CisJKnJldHVybl9kZXNjID0gcmVmZXJlbmNlX29iajsKKworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVhFQywKKwkJCSAgIk9iamVjdCAlcCBUeXBlIFslc10sIHJldHVybmluZyBSZWZlcmVuY2UgJXBcbiIsCisJCQkgIG9ial9kZXNjLCBhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lKG9ial9kZXNjKSwKKwkJCSAgKnJldHVybl9kZXNjKSk7CisKKwlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X2NvbmNhdF90ZW1wbGF0ZQorICoKKyAqIFBBUkFNRVRFUlM6ICBPcGVyYW5kMCAgICAgICAgICAgIC0gRmlyc3Qgc291cmNlIG9iamVjdAorICogICAgICAgICAgICAgIE9wZXJhbmQxICAgICAgICAgICAgLSBTZWNvbmQgc291cmNlIG9iamVjdAorICogICAgICAgICAgICAgIGFjdHVhbF9yZXR1cm5fZGVzYyAgLSBXaGVyZSB0byBwbGFjZSB0aGUgcmV0dXJuIG9iamVjdAorICogICAgICAgICAgICAgIHdhbGtfc3RhdGUgICAgICAgICAgLSBDdXJyZW50IHdhbGsgc3RhdGUKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IENvbmNhdGVuYXRlIHR3byByZXNvdXJjZSB0ZW1wbGF0ZXMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCithY3BpX3N0YXR1cworYWNwaV9leF9jb25jYXRfdGVtcGxhdGUodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb3BlcmFuZDAsCisJCQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvcGVyYW5kMSwKKwkJCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKiphY3R1YWxfcmV0dXJuX2Rlc2MsCisJCQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKQoreworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpyZXR1cm5fZGVzYzsKKwl1OCAqbmV3X2J1ZjsKKwl1OCAqZW5kX3RhZzsKKwlhY3BpX3NpemUgbGVuZ3RoMDsKKwlhY3BpX3NpemUgbGVuZ3RoMTsKKwlhY3BpX3NpemUgbmV3X2xlbmd0aDsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0UoZXhfY29uY2F0X3RlbXBsYXRlKTsKKworCS8qCisJICogRmluZCB0aGUgZW5kX3RhZyBkZXNjcmlwdG9yIGluIGVhY2ggcmVzb3VyY2UgdGVtcGxhdGUuCisJICogTm90ZTE6IHJldHVybmVkIHBvaW50ZXJzIHBvaW50IFRPIHRoZSBlbmRfdGFnLCBub3QgcGFzdCBpdC4KKwkgKiBOb3RlMjogemVyby1sZW5ndGggYnVmZmVycyBhcmUgYWxsb3dlZDsgdHJlYXRlZCBsaWtlIG9uZSBlbmRfdGFnCisJICovCisKKwkvKiBHZXQgdGhlIGxlbmd0aCBvZiB0aGUgZmlyc3QgcmVzb3VyY2UgdGVtcGxhdGUgKi8KKworCXN0YXR1cyA9IGFjcGlfdXRfZ2V0X3Jlc291cmNlX2VuZF90YWcob3BlcmFuZDAsICZlbmRfdGFnKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CisJfQorCisJbGVuZ3RoMCA9IEFDUElfUFRSX0RJRkYoZW5kX3RhZywgb3BlcmFuZDAtPmJ1ZmZlci5wb2ludGVyKTsKKworCS8qIEdldCB0aGUgbGVuZ3RoIG9mIHRoZSBzZWNvbmQgcmVzb3VyY2UgdGVtcGxhdGUgKi8KKworCXN0YXR1cyA9IGFjcGlfdXRfZ2V0X3Jlc291cmNlX2VuZF90YWcob3BlcmFuZDEsICZlbmRfdGFnKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CisJfQorCisJbGVuZ3RoMSA9IEFDUElfUFRSX0RJRkYoZW5kX3RhZywgb3BlcmFuZDEtPmJ1ZmZlci5wb2ludGVyKTsKKworCS8qIENvbWJpbmUgYm90aCBsZW5ndGhzLCBtaW5pbXVtIHNpemUgd2lsbCBiZSAyIGZvciBlbmRfdGFnICovCisKKwluZXdfbGVuZ3RoID0gbGVuZ3RoMCArIGxlbmd0aDEgKyBzaXplb2Yoc3RydWN0IGFtbF9yZXNvdXJjZV9lbmRfdGFnKTsKKworCS8qIENyZWF0ZSBhIG5ldyBidWZmZXIgb2JqZWN0IGZvciB0aGUgcmVzdWx0ICh3aXRoIG9uZSBlbmRfdGFnKSAqLworCisJcmV0dXJuX2Rlc2MgPSBhY3BpX3V0X2NyZWF0ZV9idWZmZXJfb2JqZWN0KG5ld19sZW5ndGgpOworCWlmICghcmV0dXJuX2Rlc2MpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX01FTU9SWSk7CisJfQorCisJLyoKKwkgKiBDb3B5IHRoZSB0ZW1wbGF0ZXMgdG8gdGhlIG5ldyBidWZmZXIsIDAgZmlyc3QsIHRoZW4gMSBmb2xsb3dzLiBPbmUKKwkgKiBlbmRfdGFnIGRlc2NyaXB0b3IgaXMgY29waWVkIGZyb20gT3BlcmFuZDEuCisJICovCisJbmV3X2J1ZiA9IHJldHVybl9kZXNjLT5idWZmZXIucG9pbnRlcjsKKwlBQ1BJX01FTUNQWShuZXdfYnVmLCBvcGVyYW5kMC0+YnVmZmVyLnBvaW50ZXIsIGxlbmd0aDApOworCUFDUElfTUVNQ1BZKG5ld19idWYgKyBsZW5ndGgwLCBvcGVyYW5kMS0+YnVmZmVyLnBvaW50ZXIsIGxlbmd0aDEpOworCisJLyogSW5zZXJ0IGVuZF90YWcgYW5kIHNldCB0aGUgY2hlY2tzdW0gdG8gemVybywgbWVhbnMgImlnbm9yZSBjaGVja3N1bSIgKi8KKworCW5ld19idWZbbmV3X2xlbmd0aCAtIDFdID0gMDsKKwluZXdfYnVmW25ld19sZW5ndGggLSAyXSA9IEFDUElfUkVTT1VSQ0VfTkFNRV9FTkRfVEFHIHwgMTsKKworCS8qIFJldHVybiB0aGUgY29tcGxldGVkIHJlc291cmNlIHRlbXBsYXRlICovCisKKwkqYWN0dWFsX3JldHVybl9kZXNjID0gcmV0dXJuX2Rlc2M7CisJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9leF9kb19jb25jYXRlbmF0ZQorICoKKyAqIFBBUkFNRVRFUlM6ICBPcGVyYW5kMCAgICAgICAgICAgIC0gRmlyc3Qgc291cmNlIG9iamVjdAorICogICAgICAgICAgICAgIE9wZXJhbmQxICAgICAgICAgICAgLSBTZWNvbmQgc291cmNlIG9iamVjdAorICogICAgICAgICAgICAgIGFjdHVhbF9yZXR1cm5fZGVzYyAgLSBXaGVyZSB0byBwbGFjZSB0aGUgcmV0dXJuIG9iamVjdAorICogICAgICAgICAgICAgIHdhbGtfc3RhdGUgICAgICAgICAgLSBDdXJyZW50IHdhbGsgc3RhdGUKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IENvbmNhdGVuYXRlIHR3byBvYmplY3RzIE9GIFRIRSBTQU1FIFRZUEUuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworYWNwaV9zdGF0dXMKK2FjcGlfZXhfZG9fY29uY2F0ZW5hdGUodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb3BlcmFuZDAsCisJCSAgICAgICB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvcGVyYW5kMSwKKwkJICAgICAgIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKiphY3R1YWxfcmV0dXJuX2Rlc2MsCisJCSAgICAgICBzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKQoreworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKmxvY2FsX29wZXJhbmQxID0gb3BlcmFuZDE7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqcmV0dXJuX2Rlc2M7CisJY2hhciAqbmV3X2J1ZjsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGV4X2RvX2NvbmNhdGVuYXRlKTsKKworCS8qCisJICogQ29udmVydCB0aGUgc2Vjb25kIG9wZXJhbmQgaWYgbmVjZXNzYXJ5LiAgVGhlIGZpcnN0IG9wZXJhbmQKKwkgKiBkZXRlcm1pbmVzIHRoZSB0eXBlIG9mIHRoZSBzZWNvbmQgb3BlcmFuZCwgKFNlZSB0aGUgRGF0YSBUeXBlcworCSAqIHNlY3Rpb24gb2YgdGhlIEFDUEkgc3BlY2lmaWNhdGlvbi4pICBCb3RoIG9iamVjdCB0eXBlcyBhcmUKKwkgKiBndWFyYW50ZWVkIHRvIGJlIGVpdGhlciBJbnRlZ2VyL1N0cmluZy9CdWZmZXIgYnkgdGhlIG9wZXJhbmQKKwkgKiByZXNvbHV0aW9uIG1lY2hhbmlzbS4KKwkgKi8KKwlzd2l0Y2ggKEFDUElfR0VUX09CSkVDVF9UWVBFKG9wZXJhbmQwKSkgeworCWNhc2UgQUNQSV9UWVBFX0lOVEVHRVI6CisJCXN0YXR1cyA9CisJCSAgICBhY3BpX2V4X2NvbnZlcnRfdG9faW50ZWdlcihvcGVyYW5kMSwgJmxvY2FsX29wZXJhbmQxLCAxNik7CisJCWJyZWFrOworCisJY2FzZSBBQ1BJX1RZUEVfU1RSSU5HOgorCQlzdGF0dXMgPSBhY3BpX2V4X2NvbnZlcnRfdG9fc3RyaW5nKG9wZXJhbmQxLCAmbG9jYWxfb3BlcmFuZDEsCisJCQkJCQkgICBBQ1BJX0lNUExJQ0lUX0NPTlZFUlRfSEVYKTsKKwkJYnJlYWs7CisKKwljYXNlIEFDUElfVFlQRV9CVUZGRVI6CisJCXN0YXR1cyA9IGFjcGlfZXhfY29udmVydF90b19idWZmZXIob3BlcmFuZDEsICZsb2NhbF9vcGVyYW5kMSk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJQUNQSV9FUlJPUigoQUVfSU5GTywgIkludmFsaWQgb2JqZWN0IHR5cGU6ICVYIiwKKwkJCSAgICBBQ1BJX0dFVF9PQkpFQ1RfVFlQRShvcGVyYW5kMCkpKTsKKwkJc3RhdHVzID0gQUVfQU1MX0lOVEVSTkFMOworCX0KKworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlnb3RvIGNsZWFudXA7CisJfQorCisJLyoKKwkgKiBCb3RoIG9wZXJhbmRzIGFyZSBub3cga25vd24gdG8gYmUgdGhlIHNhbWUgb2JqZWN0IHR5cGUKKwkgKiAoQm90aCBhcmUgSW50ZWdlciwgU3RyaW5nLCBvciBCdWZmZXIpLCBhbmQgd2UgY2FuIG5vdyBwZXJmb3JtIHRoZQorCSAqIGNvbmNhdGVuYXRpb24uCisJICovCisKKwkvKgorCSAqIFRoZXJlIGFyZSB0aHJlZSBjYXNlcyB0byBoYW5kbGU6CisJICoKKwkgKiAxKSBUd28gSW50ZWdlcnMgY29uY2F0ZW5hdGVkIHRvIHByb2R1Y2UgYSBuZXcgQnVmZmVyCisJICogMikgVHdvIFN0cmluZ3MgY29uY2F0ZW5hdGVkIHRvIHByb2R1Y2UgYSBuZXcgU3RyaW5nCisJICogMykgVHdvIEJ1ZmZlcnMgY29uY2F0ZW5hdGVkIHRvIHByb2R1Y2UgYSBuZXcgQnVmZmVyCisJICovCisJc3dpdGNoIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRShvcGVyYW5kMCkpIHsKKwljYXNlIEFDUElfVFlQRV9JTlRFR0VSOgorCisJCS8qIFJlc3VsdCBvZiB0d28gSW50ZWdlcnMgaXMgYSBCdWZmZXIgKi8KKwkJLyogTmVlZCBlbm91Z2ggYnVmZmVyIHNwYWNlIGZvciB0d28gaW50ZWdlcnMgKi8KKworCQlyZXR1cm5fZGVzYyA9IGFjcGlfdXRfY3JlYXRlX2J1ZmZlcl9vYmplY3QoKGFjcGlfc2l6ZSkKKwkJCQkJCQkgICBBQ1BJX01VTF8yCisJCQkJCQkJICAgKGFjcGlfZ2JsX2ludGVnZXJfYnl0ZV93aWR0aCkpOworCQlpZiAoIXJldHVybl9kZXNjKSB7CisJCQlzdGF0dXMgPSBBRV9OT19NRU1PUlk7CisJCQlnb3RvIGNsZWFudXA7CisJCX0KKworCQluZXdfYnVmID0gKGNoYXIgKilyZXR1cm5fZGVzYy0+YnVmZmVyLnBvaW50ZXI7CisKKwkJLyogQ29weSB0aGUgZmlyc3QgaW50ZWdlciwgTFNCIGZpcnN0ICovCisKKwkJQUNQSV9NRU1DUFkobmV3X2J1ZiwgJm9wZXJhbmQwLT5pbnRlZ2VyLnZhbHVlLAorCQkJICAgIGFjcGlfZ2JsX2ludGVnZXJfYnl0ZV93aWR0aCk7CisKKwkJLyogQ29weSB0aGUgc2Vjb25kIGludGVnZXIgKExTQiBmaXJzdCkgYWZ0ZXIgdGhlIGZpcnN0ICovCisKKwkJQUNQSV9NRU1DUFkobmV3X2J1ZiArIGFjcGlfZ2JsX2ludGVnZXJfYnl0ZV93aWR0aCwKKwkJCSAgICAmbG9jYWxfb3BlcmFuZDEtPmludGVnZXIudmFsdWUsCisJCQkgICAgYWNwaV9nYmxfaW50ZWdlcl9ieXRlX3dpZHRoKTsKKwkJYnJlYWs7CisKKwljYXNlIEFDUElfVFlQRV9TVFJJTkc6CisKKwkJLyogUmVzdWx0IG9mIHR3byBTdHJpbmdzIGlzIGEgU3RyaW5nICovCisKKwkJcmV0dXJuX2Rlc2MgPSBhY3BpX3V0X2NyZWF0ZV9zdHJpbmdfb2JqZWN0KCgoYWNwaV9zaXplKQorCQkJCQkJCSAgICBvcGVyYW5kMC0+c3RyaW5nLgorCQkJCQkJCSAgICBsZW5ndGggKworCQkJCQkJCSAgICBsb2NhbF9vcGVyYW5kMS0+CisJCQkJCQkJICAgIHN0cmluZy5sZW5ndGgpKTsKKwkJaWYgKCFyZXR1cm5fZGVzYykgeworCQkJc3RhdHVzID0gQUVfTk9fTUVNT1JZOworCQkJZ290byBjbGVhbnVwOworCQl9CisKKwkJbmV3X2J1ZiA9IHJldHVybl9kZXNjLT5zdHJpbmcucG9pbnRlcjsKKworCQkvKiBDb25jYXRlbmF0ZSB0aGUgc3RyaW5ncyAqLworCisJCUFDUElfU1RSQ1BZKG5ld19idWYsIG9wZXJhbmQwLT5zdHJpbmcucG9pbnRlcik7CisJCUFDUElfU1RSQ1BZKG5ld19idWYgKyBvcGVyYW5kMC0+c3RyaW5nLmxlbmd0aCwKKwkJCSAgICBsb2NhbF9vcGVyYW5kMS0+c3RyaW5nLnBvaW50ZXIpOworCQlicmVhazsKKworCWNhc2UgQUNQSV9UWVBFX0JVRkZFUjoKKworCQkvKiBSZXN1bHQgb2YgdHdvIEJ1ZmZlcnMgaXMgYSBCdWZmZXIgKi8KKworCQlyZXR1cm5fZGVzYyA9IGFjcGlfdXRfY3JlYXRlX2J1ZmZlcl9vYmplY3QoKChhY3BpX3NpemUpCisJCQkJCQkJICAgIG9wZXJhbmQwLT5idWZmZXIuCisJCQkJCQkJICAgIGxlbmd0aCArCisJCQkJCQkJICAgIGxvY2FsX29wZXJhbmQxLT4KKwkJCQkJCQkgICAgYnVmZmVyLmxlbmd0aCkpOworCQlpZiAoIXJldHVybl9kZXNjKSB7CisJCQlzdGF0dXMgPSBBRV9OT19NRU1PUlk7CisJCQlnb3RvIGNsZWFudXA7CisJCX0KKworCQluZXdfYnVmID0gKGNoYXIgKilyZXR1cm5fZGVzYy0+YnVmZmVyLnBvaW50ZXI7CisKKwkJLyogQ29uY2F0ZW5hdGUgdGhlIGJ1ZmZlcnMgKi8KKworCQlBQ1BJX01FTUNQWShuZXdfYnVmLCBvcGVyYW5kMC0+YnVmZmVyLnBvaW50ZXIsCisJCQkgICAgb3BlcmFuZDAtPmJ1ZmZlci5sZW5ndGgpOworCQlBQ1BJX01FTUNQWShuZXdfYnVmICsgb3BlcmFuZDAtPmJ1ZmZlci5sZW5ndGgsCisJCQkgICAgbG9jYWxfb3BlcmFuZDEtPmJ1ZmZlci5wb2ludGVyLAorCQkJICAgIGxvY2FsX29wZXJhbmQxLT5idWZmZXIubGVuZ3RoKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCisJCS8qIEludmFsaWQgb2JqZWN0IHR5cGUsIHNob3VsZCBub3QgaGFwcGVuIGhlcmUgKi8KKworCQlBQ1BJX0VSUk9SKChBRV9JTkZPLCAiSW52YWxpZCBvYmplY3QgdHlwZTogJVgiLAorCQkJICAgIEFDUElfR0VUX09CSkVDVF9UWVBFKG9wZXJhbmQwKSkpOworCQlzdGF0dXMgPSBBRV9BTUxfSU5URVJOQUw7CisJCWdvdG8gY2xlYW51cDsKKwl9CisKKwkqYWN0dWFsX3JldHVybl9kZXNjID0gcmV0dXJuX2Rlc2M7CisKKyAgICAgIGNsZWFudXA6CisJaWYgKGxvY2FsX29wZXJhbmQxICE9IG9wZXJhbmQxKSB7CisJCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZShsb2NhbF9vcGVyYW5kMSk7CisJfQorCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X2RvX21hdGhfb3AKKyAqCisgKiBQQVJBTUVURVJTOiAgT3Bjb2RlICAgICAgICAgICAgICAtIEFNTCBvcGNvZGUKKyAqICAgICAgICAgICAgICBJbnRlZ2VyMCAgICAgICAgICAgIC0gSW50ZWdlciBvcGVyYW5kICMwCisgKiAgICAgICAgICAgICAgSW50ZWdlcjEgICAgICAgICAgICAtIEludGVnZXIgb3BlcmFuZCAjMQorICoKKyAqIFJFVFVSTjogICAgICBJbnRlZ2VyIHJlc3VsdCBvZiB0aGUgb3BlcmF0aW9uCisgKgorICogREVTQ1JJUFRJT046IEV4ZWN1dGUgYSBtYXRoIEFNTCBvcGNvZGUuIFRoZSBwdXJwb3NlIG9mIGhhdmluZyBhbGwgb2YgdGhlCisgKiAgICAgICAgICAgICAgbWF0aCBmdW5jdGlvbnMgaGVyZSBpcyB0byBwcmV2ZW50IGEgbG90IG9mIHBvaW50ZXIgZGVyZWZlcmVuY2luZworICogICAgICAgICAgICAgIHRvIG9idGFpbiB0aGUgb3BlcmFuZHMuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworYWNwaV9pbnRlZ2VyCithY3BpX2V4X2RvX21hdGhfb3AodTE2IG9wY29kZSwgYWNwaV9pbnRlZ2VyIGludGVnZXIwLCBhY3BpX2ludGVnZXIgaW50ZWdlcjEpCit7CisKKwlBQ1BJX0ZVTkNUSU9OX0VOVFJZKCk7CisKKwlzd2l0Y2ggKG9wY29kZSkgeworCWNhc2UgQU1MX0FERF9PUDoJLyogQWRkIChJbnRlZ2VyMCwgSW50ZWdlcjEsIFJlc3VsdCkgKi8KKworCQlyZXR1cm4gKGludGVnZXIwICsgaW50ZWdlcjEpOworCisJY2FzZSBBTUxfQklUX0FORF9PUDoJLyogQW5kIChJbnRlZ2VyMCwgSW50ZWdlcjEsIFJlc3VsdCkgKi8KKworCQlyZXR1cm4gKGludGVnZXIwICYgaW50ZWdlcjEpOworCisJY2FzZSBBTUxfQklUX05BTkRfT1A6CS8qIE5BbmQgKEludGVnZXIwLCBJbnRlZ2VyMSwgUmVzdWx0KSAqLworCisJCXJldHVybiAofihpbnRlZ2VyMCAmIGludGVnZXIxKSk7CisKKwljYXNlIEFNTF9CSVRfT1JfT1A6CS8qIE9yIChJbnRlZ2VyMCwgSW50ZWdlcjEsIFJlc3VsdCkgKi8KKworCQlyZXR1cm4gKGludGVnZXIwIHwgaW50ZWdlcjEpOworCisJY2FzZSBBTUxfQklUX05PUl9PUDoJLyogTk9yIChJbnRlZ2VyMCwgSW50ZWdlcjEsIFJlc3VsdCkgKi8KKworCQlyZXR1cm4gKH4oaW50ZWdlcjAgfCBpbnRlZ2VyMSkpOworCisJY2FzZSBBTUxfQklUX1hPUl9PUDoJLyogWE9yIChJbnRlZ2VyMCwgSW50ZWdlcjEsIFJlc3VsdCkgKi8KKworCQlyZXR1cm4gKGludGVnZXIwIF4gaW50ZWdlcjEpOworCisJY2FzZSBBTUxfTVVMVElQTFlfT1A6CS8qIE11bHRpcGx5IChJbnRlZ2VyMCwgSW50ZWdlcjEsIFJlc3VsdCkgKi8KKworCQlyZXR1cm4gKGludGVnZXIwICogaW50ZWdlcjEpOworCisJY2FzZSBBTUxfU0hJRlRfTEVGVF9PUDoJLyogc2hpZnRfbGVmdCAoT3BlcmFuZCwgc2hpZnRfY291bnQsIFJlc3VsdCkgKi8KKworCQkvKgorCQkgKiBXZSBuZWVkIHRvIGNoZWNrIGlmIHRoZSBzaGlmdGNvdW50IGlzIGxhcmdlciB0aGFuIHRoZSBpbnRlZ2VyIGJpdAorCQkgKiB3aWR0aCBzaW5jZSB0aGUgYmVoYXZpb3Igb2YgdGhpcyBpcyBub3Qgd2VsbC1kZWZpbmVkIGluIHRoZSBDIGxhbmd1YWdlLgorCQkgKi8KKwkJaWYgKGludGVnZXIxID49IGFjcGlfZ2JsX2ludGVnZXJfYml0X3dpZHRoKSB7CisJCQlyZXR1cm4gKDApOworCQl9CisJCXJldHVybiAoaW50ZWdlcjAgPDwgaW50ZWdlcjEpOworCisJY2FzZSBBTUxfU0hJRlRfUklHSFRfT1A6CS8qIHNoaWZ0X3JpZ2h0IChPcGVyYW5kLCBzaGlmdF9jb3VudCwgUmVzdWx0KSAqLworCisJCS8qCisJCSAqIFdlIG5lZWQgdG8gY2hlY2sgaWYgdGhlIHNoaWZ0Y291bnQgaXMgbGFyZ2VyIHRoYW4gdGhlIGludGVnZXIgYml0CisJCSAqIHdpZHRoIHNpbmNlIHRoZSBiZWhhdmlvciBvZiB0aGlzIGlzIG5vdCB3ZWxsLWRlZmluZWQgaW4gdGhlIEMgbGFuZ3VhZ2UuCisJCSAqLworCQlpZiAoaW50ZWdlcjEgPj0gYWNwaV9nYmxfaW50ZWdlcl9iaXRfd2lkdGgpIHsKKwkJCXJldHVybiAoMCk7CisJCX0KKwkJcmV0dXJuIChpbnRlZ2VyMCA+PiBpbnRlZ2VyMSk7CisKKwljYXNlIEFNTF9TVUJUUkFDVF9PUDoJLyogU3VidHJhY3QgKEludGVnZXIwLCBJbnRlZ2VyMSwgUmVzdWx0KSAqLworCisJCXJldHVybiAoaW50ZWdlcjAgLSBpbnRlZ2VyMSk7CisKKwlkZWZhdWx0OgorCisJCXJldHVybiAoMCk7CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X2RvX2xvZ2ljYWxfbnVtZXJpY19vcAorICoKKyAqIFBBUkFNRVRFUlM6ICBPcGNvZGUgICAgICAgICAgICAgIC0gQU1MIG9wY29kZQorICogICAgICAgICAgICAgIEludGVnZXIwICAgICAgICAgICAgLSBJbnRlZ2VyIG9wZXJhbmQgIzAKKyAqICAgICAgICAgICAgICBJbnRlZ2VyMSAgICAgICAgICAgIC0gSW50ZWdlciBvcGVyYW5kICMxCisgKiAgICAgICAgICAgICAgbG9naWNhbF9yZXN1bHQgICAgICAtIFRSVUUvRkFMU0UgcmVzdWx0IG9mIHRoZSBvcGVyYXRpb24KKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IEV4ZWN1dGUgYSBsb2dpY2FsICJOdW1lcmljIiBBTUwgb3Bjb2RlLiBGb3IgdGhlc2UgTnVtZXJpYworICogICAgICAgICAgICAgIG9wZXJhdG9ycyAoTEFuZCBhbmQgTE9yKSwgYm90aCBvcGVyYW5kcyBtdXN0IGJlIGludGVnZXJzLgorICoKKyAqICAgICAgICAgICAgICBOb3RlOiBjbGVhbmVzdCBtYWNoaW5lIGNvZGUgc2VlbXMgdG8gYmUgcHJvZHVjZWQgYnkgdGhlIGNvZGUKKyAqICAgICAgICAgICAgICBiZWxvdywgcmF0aGVyIHRoYW4gdXNpbmcgc3RhdGVtZW50cyBvZiB0aGUgZm9ybToKKyAqICAgICAgICAgICAgICAgICAgUmVzdWx0ID0gKEludGVnZXIwICYmIEludGVnZXIxKTsKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCithY3BpX3N0YXR1cworYWNwaV9leF9kb19sb2dpY2FsX251bWVyaWNfb3AodTE2IG9wY29kZSwKKwkJCSAgICAgIGFjcGlfaW50ZWdlciBpbnRlZ2VyMCwKKwkJCSAgICAgIGFjcGlfaW50ZWdlciBpbnRlZ2VyMSwgdTggKiBsb2dpY2FsX3Jlc3VsdCkKK3sKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKKwl1OCBsb2NhbF9yZXN1bHQgPSBGQUxTRTsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0UoZXhfZG9fbG9naWNhbF9udW1lcmljX29wKTsKKworCXN3aXRjaCAob3Bjb2RlKSB7CisJY2FzZSBBTUxfTEFORF9PUDoJLyogTEFuZCAoSW50ZWdlcjAsIEludGVnZXIxKSAqLworCisJCWlmIChpbnRlZ2VyMCAmJiBpbnRlZ2VyMSkgeworCQkJbG9jYWxfcmVzdWx0ID0gVFJVRTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgQU1MX0xPUl9PUDoJLyogTE9yIChJbnRlZ2VyMCwgSW50ZWdlcjEpICovCisKKwkJaWYgKGludGVnZXIwIHx8IGludGVnZXIxKSB7CisJCQlsb2NhbF9yZXN1bHQgPSBUUlVFOworCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJc3RhdHVzID0gQUVfQU1MX0lOVEVSTkFMOworCQlicmVhazsKKwl9CisKKwkvKiBSZXR1cm4gdGhlIGxvZ2ljYWwgcmVzdWx0IGFuZCBzdGF0dXMgKi8KKworCSpsb2dpY2FsX3Jlc3VsdCA9IGxvY2FsX3Jlc3VsdDsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9leF9kb19sb2dpY2FsX29wCisgKgorICogUEFSQU1FVEVSUzogIE9wY29kZSAgICAgICAgICAgICAgLSBBTUwgb3Bjb2RlCisgKiAgICAgICAgICAgICAgT3BlcmFuZDAgICAgICAgICAgICAtIG9wZXJhbmQgIzAKKyAqICAgICAgICAgICAgICBPcGVyYW5kMSAgICAgICAgICAgIC0gb3BlcmFuZCAjMQorICogICAgICAgICAgICAgIGxvZ2ljYWxfcmVzdWx0ICAgICAgLSBUUlVFL0ZBTFNFIHJlc3VsdCBvZiB0aGUgb3BlcmF0aW9uCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBFeGVjdXRlIGEgbG9naWNhbCBBTUwgb3Bjb2RlLiBUaGUgcHVycG9zZSBvZiBoYXZpbmcgYWxsIG9mIHRoZQorICogICAgICAgICAgICAgIGZ1bmN0aW9ucyBoZXJlIGlzIHRvIHByZXZlbnQgYSBsb3Qgb2YgcG9pbnRlciBkZXJlZmVyZW5jaW5nCisgKiAgICAgICAgICAgICAgdG8gb2J0YWluIHRoZSBvcGVyYW5kcyBhbmQgdG8gc2ltcGxpZnkgdGhlIGdlbmVyYXRpb24gb2YgdGhlCisgKiAgICAgICAgICAgICAgbG9naWNhbCB2YWx1ZS4gRm9yIHRoZSBOdW1lcmljIG9wZXJhdG9ycyAoTEFuZCBhbmQgTE9yKSwgYm90aAorICogICAgICAgICAgICAgIG9wZXJhbmRzIG11c3QgYmUgaW50ZWdlcnMuIEZvciB0aGUgb3RoZXIgbG9naWNhbCBvcGVyYXRvcnMsCisgKiAgICAgICAgICAgICAgb3BlcmFuZHMgY2FuIGJlIGFueSBjb21iaW5hdGlvbiBvZiBJbnRlZ2VyL1N0cmluZy9CdWZmZXIuIFRoZQorICogICAgICAgICAgICAgIGZpcnN0IG9wZXJhbmQgZGV0ZXJtaW5lcyB0aGUgdHlwZSB0byB3aGljaCB0aGUgc2Vjb25kIG9wZXJhbmQKKyAqICAgICAgICAgICAgICB3aWxsIGJlIGNvbnZlcnRlZC4KKyAqCisgKiAgICAgICAgICAgICAgTm90ZTogY2xlYW5lc3QgbWFjaGluZSBjb2RlIHNlZW1zIHRvIGJlIHByb2R1Y2VkIGJ5IHRoZSBjb2RlCisgKiAgICAgICAgICAgICAgYmVsb3csIHJhdGhlciB0aGFuIHVzaW5nIHN0YXRlbWVudHMgb2YgdGhlIGZvcm06CisgKiAgICAgICAgICAgICAgICAgIFJlc3VsdCA9IChPcGVyYW5kMCA9PSBPcGVyYW5kMSk7CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworYWNwaV9zdGF0dXMKK2FjcGlfZXhfZG9fbG9naWNhbF9vcCh1MTYgb3Bjb2RlLAorCQkgICAgICB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvcGVyYW5kMCwKKwkJICAgICAgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb3BlcmFuZDEsIHU4ICogbG9naWNhbF9yZXN1bHQpCit7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqbG9jYWxfb3BlcmFuZDEgPSBvcGVyYW5kMTsKKwlhY3BpX2ludGVnZXIgaW50ZWdlcjA7CisJYWNwaV9pbnRlZ2VyIGludGVnZXIxOworCXUzMiBsZW5ndGgwOworCXUzMiBsZW5ndGgxOworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOworCXU4IGxvY2FsX3Jlc3VsdCA9IEZBTFNFOworCWludCBjb21wYXJlOworCisJQUNQSV9GVU5DVElPTl9UUkFDRShleF9kb19sb2dpY2FsX29wKTsKKworCS8qCisJICogQ29udmVydCB0aGUgc2Vjb25kIG9wZXJhbmQgaWYgbmVjZXNzYXJ5LiAgVGhlIGZpcnN0IG9wZXJhbmQKKwkgKiBkZXRlcm1pbmVzIHRoZSB0eXBlIG9mIHRoZSBzZWNvbmQgb3BlcmFuZCwgKFNlZSB0aGUgRGF0YSBUeXBlcworCSAqIHNlY3Rpb24gb2YgdGhlIEFDUEkgMy4wKyBzcGVjaWZpY2F0aW9uLikgIEJvdGggb2JqZWN0IHR5cGVzIGFyZQorCSAqIGd1YXJhbnRlZWQgdG8gYmUgZWl0aGVyIEludGVnZXIvU3RyaW5nL0J1ZmZlciBieSB0aGUgb3BlcmFuZAorCSAqIHJlc29sdXRpb24gbWVjaGFuaXNtLgorCSAqLworCXN3aXRjaCAoQUNQSV9HRVRfT0JKRUNUX1RZUEUob3BlcmFuZDApKSB7CisJY2FzZSBBQ1BJX1RZUEVfSU5URUdFUjoKKwkJc3RhdHVzID0KKwkJICAgIGFjcGlfZXhfY29udmVydF90b19pbnRlZ2VyKG9wZXJhbmQxLCAmbG9jYWxfb3BlcmFuZDEsIDE2KTsKKwkJYnJlYWs7CisKKwljYXNlIEFDUElfVFlQRV9TVFJJTkc6CisJCXN0YXR1cyA9IGFjcGlfZXhfY29udmVydF90b19zdHJpbmcob3BlcmFuZDEsICZsb2NhbF9vcGVyYW5kMSwKKwkJCQkJCSAgIEFDUElfSU1QTElDSVRfQ09OVkVSVF9IRVgpOworCQlicmVhazsKKworCWNhc2UgQUNQSV9UWVBFX0JVRkZFUjoKKwkJc3RhdHVzID0gYWNwaV9leF9jb252ZXJ0X3RvX2J1ZmZlcihvcGVyYW5kMSwgJmxvY2FsX29wZXJhbmQxKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlzdGF0dXMgPSBBRV9BTUxfSU5URVJOQUw7CisJCWJyZWFrOworCX0KKworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlnb3RvIGNsZWFudXA7CisJfQorCisJLyoKKwkgKiBUd28gY2FzZXM6IDEpIEJvdGggSW50ZWdlcnMsIDIpIEJvdGggU3RyaW5ncyBvciBCdWZmZXJzCisJICovCisJaWYgKEFDUElfR0VUX09CSkVDVF9UWVBFKG9wZXJhbmQwKSA9PSBBQ1BJX1RZUEVfSU5URUdFUikgeworCQkvKgorCQkgKiAxKSBCb3RoIG9wZXJhbmRzIGFyZSBvZiB0eXBlIGludGVnZXIKKwkJICogICAgTm90ZTogbG9jYWxfb3BlcmFuZDEgbWF5IGhhdmUgY2hhbmdlZCBhYm92ZQorCQkgKi8KKwkJaW50ZWdlcjAgPSBvcGVyYW5kMC0+aW50ZWdlci52YWx1ZTsKKwkJaW50ZWdlcjEgPSBsb2NhbF9vcGVyYW5kMS0+aW50ZWdlci52YWx1ZTsKKworCQlzd2l0Y2ggKG9wY29kZSkgeworCQljYXNlIEFNTF9MRVFVQUxfT1A6CS8qIExFcXVhbCAoT3BlcmFuZDAsIE9wZXJhbmQxKSAqLworCisJCQlpZiAoaW50ZWdlcjAgPT0gaW50ZWdlcjEpIHsKKwkJCQlsb2NhbF9yZXN1bHQgPSBUUlVFOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBBTUxfTEdSRUFURVJfT1A6CS8qIExHcmVhdGVyIChPcGVyYW5kMCwgT3BlcmFuZDEpICovCisKKwkJCWlmIChpbnRlZ2VyMCA+IGludGVnZXIxKSB7CisJCQkJbG9jYWxfcmVzdWx0ID0gVFJVRTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgQU1MX0xMRVNTX09QOgkvKiBMTGVzcyAoT3BlcmFuZDAsIE9wZXJhbmQxKSAqLworCisJCQlpZiAoaW50ZWdlcjAgPCBpbnRlZ2VyMSkgeworCQkJCWxvY2FsX3Jlc3VsdCA9IFRSVUU7CisJCQl9CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJc3RhdHVzID0gQUVfQU1MX0lOVEVSTkFMOworCQkJYnJlYWs7CisJCX0KKwl9IGVsc2UgeworCQkvKgorCQkgKiAyKSBCb3RoIG9wZXJhbmRzIGFyZSBTdHJpbmdzIG9yIGJvdGggYXJlIEJ1ZmZlcnMKKwkJICogICAgTm90ZTogQ29kZSBiZWxvdyB0YWtlcyBhZHZhbnRhZ2Ugb2YgY29tbW9uIEJ1ZmZlci9TdHJpbmcKKwkJICogICAgICAgICAgb2JqZWN0IGZpZWxkcy4gbG9jYWxfb3BlcmFuZDEgbWF5IGhhdmUgY2hhbmdlZCBhYm92ZS4gVXNlCisJCSAqICAgICAgICAgIG1lbWNtcCB0byBoYW5kbGUgbnVsbHMgaW4gYnVmZmVycy4KKwkJICovCisJCWxlbmd0aDAgPSBvcGVyYW5kMC0+YnVmZmVyLmxlbmd0aDsKKwkJbGVuZ3RoMSA9IGxvY2FsX29wZXJhbmQxLT5idWZmZXIubGVuZ3RoOworCisJCS8qIExleGljb2dyYXBoaWMgY29tcGFyZTogY29tcGFyZSB0aGUgZGF0YSBieXRlcyAqLworCisJCWNvbXBhcmUgPSBBQ1BJX01FTUNNUChvcGVyYW5kMC0+YnVmZmVyLnBvaW50ZXIsCisJCQkJICAgICAgbG9jYWxfb3BlcmFuZDEtPmJ1ZmZlci5wb2ludGVyLAorCQkJCSAgICAgIChsZW5ndGgwID4gbGVuZ3RoMSkgPyBsZW5ndGgxIDogbGVuZ3RoMCk7CisKKwkJc3dpdGNoIChvcGNvZGUpIHsKKwkJY2FzZSBBTUxfTEVRVUFMX09QOgkvKiBMRXF1YWwgKE9wZXJhbmQwLCBPcGVyYW5kMSkgKi8KKworCQkJLyogTGVuZ3RoIGFuZCBhbGwgYnl0ZXMgbXVzdCBiZSBlcXVhbCAqLworCisJCQlpZiAoKGxlbmd0aDAgPT0gbGVuZ3RoMSkgJiYgKGNvbXBhcmUgPT0gMCkpIHsKKworCQkJCS8qIExlbmd0aCBhbmQgYWxsIGJ5dGVzIG1hdGNoID09PiBUUlVFICovCisKKwkJCQlsb2NhbF9yZXN1bHQgPSBUUlVFOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBBTUxfTEdSRUFURVJfT1A6CS8qIExHcmVhdGVyIChPcGVyYW5kMCwgT3BlcmFuZDEpICovCisKKwkJCWlmIChjb21wYXJlID4gMCkgeworCQkJCWxvY2FsX3Jlc3VsdCA9IFRSVUU7CisJCQkJZ290byBjbGVhbnVwOwkvKiBUUlVFICovCisJCQl9CisJCQlpZiAoY29tcGFyZSA8IDApIHsKKwkJCQlnb3RvIGNsZWFudXA7CS8qIEZBTFNFICovCisJCQl9CisKKwkJCS8qIEJ5dGVzIG1hdGNoICh0byBzaG9ydGVzdCBsZW5ndGgpLCBjb21wYXJlIGxlbmd0aHMgKi8KKworCQkJaWYgKGxlbmd0aDAgPiBsZW5ndGgxKSB7CisJCQkJbG9jYWxfcmVzdWx0ID0gVFJVRTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgQU1MX0xMRVNTX09QOgkvKiBMTGVzcyAoT3BlcmFuZDAsIE9wZXJhbmQxKSAqLworCisJCQlpZiAoY29tcGFyZSA+IDApIHsKKwkJCQlnb3RvIGNsZWFudXA7CS8qIEZBTFNFICovCisJCQl9CisJCQlpZiAoY29tcGFyZSA8IDApIHsKKwkJCQlsb2NhbF9yZXN1bHQgPSBUUlVFOworCQkJCWdvdG8gY2xlYW51cDsJLyogVFJVRSAqLworCQkJfQorCisJCQkvKiBCeXRlcyBtYXRjaCAodG8gc2hvcnRlc3QgbGVuZ3RoKSwgY29tcGFyZSBsZW5ndGhzICovCisKKwkJCWlmIChsZW5ndGgwIDwgbGVuZ3RoMSkgeworCQkJCWxvY2FsX3Jlc3VsdCA9IFRSVUU7CisJCQl9CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJc3RhdHVzID0gQUVfQU1MX0lOVEVSTkFMOworCQkJYnJlYWs7CisJCX0KKwl9CisKKyAgICAgIGNsZWFudXA6CisKKwkvKiBOZXcgb2JqZWN0IHdhcyBjcmVhdGVkIGlmIGltcGxpY2l0IGNvbnZlcnNpb24gcGVyZm9ybWVkIC0gZGVsZXRlICovCisKKwlpZiAobG9jYWxfb3BlcmFuZDEgIT0gb3BlcmFuZDEpIHsKKwkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKGxvY2FsX29wZXJhbmQxKTsKKwl9CisKKwkvKiBSZXR1cm4gdGhlIGxvZ2ljYWwgcmVzdWx0IGFuZCBzdGF0dXMgKi8KKworCSpsb2dpY2FsX3Jlc3VsdCA9IGxvY2FsX3Jlc3VsdDsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXhtdXRleC5jIGIvZHJpdmVycy9hY3BpL2FjcGljYS9leG11dGV4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDMwMWMxZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXhtdXRleC5jCkBAIC0wLDAgKzEsNDc0IEBACisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBNb2R1bGUgTmFtZTogZXhtdXRleCAtIEFTTCBNdXRleCBBY3F1aXJlL1JlbGVhc2UgZnVuY3Rpb25zCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwOCwgSW50ZWwgQ29ycC4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKKyAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIGF0IG1pbmltdW0gYSBkaXNjbGFpbWVyCisgKiAgICBzdWJzdGFudGlhbGx5IHNpbWlsYXIgdG8gdGhlICJOTyBXQVJSQU5UWSIgZGlzY2xhaW1lciBiZWxvdworICogICAgKCJEaXNjbGFpbWVyIikgYW5kIGFueSByZWRpc3RyaWJ1dGlvbiBtdXN0IGJlIGNvbmRpdGlvbmVkIHVwb24KKyAqICAgIGluY2x1ZGluZyBhIHN1YnN0YW50aWFsbHkgc2ltaWxhciBEaXNjbGFpbWVyIHJlcXVpcmVtZW50IGZvciBmdXJ0aGVyCisgKiAgICBiaW5hcnkgcmVkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMKKyAqICAgIG9mIGFueSBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogTk8gV0FSUkFOVFkKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HCisgKiBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KKyAqLworCisjaW5jbHVkZSA8YWNwaS9hY3BpLmg+CisjaW5jbHVkZSAiYWNjb21tb24uaCIKKyNpbmNsdWRlICJhY2ludGVycC5oIgorI2luY2x1ZGUgImFjZXZlbnRzLmgiCisKKyNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX0VYRUNVVEVSCitBQ1BJX01PRFVMRV9OQU1FKCJleG11dGV4IikKKworLyogTG9jYWwgcHJvdG90eXBlcyAqLworc3RhdGljIHZvaWQKK2FjcGlfZXhfbGlua19tdXRleCh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYywKKwkJICAgc3RydWN0IGFjcGlfdGhyZWFkX3N0YXRlICp0aHJlYWQpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X3VubGlua19tdXRleAorICoKKyAqIFBBUkFNRVRFUlM6ICBvYmpfZGVzYyAgICAgICAgICAgIC0gVGhlIG11dGV4IHRvIGJlIHVubGlua2VkCisgKgorICogUkVUVVJOOiAgICAgIE5vbmUKKyAqCisgKiBERVNDUklQVElPTjogUmVtb3ZlIGEgbXV0ZXggZnJvbSB0aGUgIkFjcXVpcmVkTXV0ZXgiIGxpc3QKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIGFjcGlfZXhfdW5saW5rX211dGV4KHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjKQoreworCXN0cnVjdCBhY3BpX3RocmVhZF9zdGF0ZSAqdGhyZWFkID0gb2JqX2Rlc2MtPm11dGV4Lm93bmVyX3RocmVhZDsKKworCWlmICghdGhyZWFkKSB7CisJCXJldHVybjsKKwl9CisKKwkvKiBEb3VibHkgbGlua2VkIGxpc3QgKi8KKworCWlmIChvYmpfZGVzYy0+bXV0ZXgubmV4dCkgeworCQkob2JqX2Rlc2MtPm11dGV4Lm5leHQpLT5tdXRleC5wcmV2ID0gb2JqX2Rlc2MtPm11dGV4LnByZXY7CisJfQorCisJaWYgKG9ial9kZXNjLT5tdXRleC5wcmV2KSB7CisJCShvYmpfZGVzYy0+bXV0ZXgucHJldiktPm11dGV4Lm5leHQgPSBvYmpfZGVzYy0+bXV0ZXgubmV4dDsKKwl9IGVsc2UgeworCQl0aHJlYWQtPmFjcXVpcmVkX211dGV4X2xpc3QgPSBvYmpfZGVzYy0+bXV0ZXgubmV4dDsKKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfZXhfbGlua19tdXRleAorICoKKyAqIFBBUkFNRVRFUlM6ICBvYmpfZGVzYyAgICAgICAgLSBUaGUgbXV0ZXggdG8gYmUgbGlua2VkCisgKiAgICAgICAgICAgICAgVGhyZWFkICAgICAgICAgIC0gQ3VycmVudCBleGVjdXRpbmcgdGhyZWFkIG9iamVjdAorICoKKyAqIFJFVFVSTjogICAgICBOb25lCisgKgorICogREVTQ1JJUFRJT046IEFkZCBhIG11dGV4IHRvIHRoZSAiQWNxdWlyZWRNdXRleCIgbGlzdCBmb3IgdGhpcyB3YWxrCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQKK2FjcGlfZXhfbGlua19tdXRleCh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYywKKwkJICAgc3RydWN0IGFjcGlfdGhyZWFkX3N0YXRlICp0aHJlYWQpCit7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqbGlzdF9oZWFkOworCisJbGlzdF9oZWFkID0gdGhyZWFkLT5hY3F1aXJlZF9tdXRleF9saXN0OworCisJLyogVGhpcyBvYmplY3Qgd2lsbCBiZSB0aGUgZmlyc3Qgb2JqZWN0IGluIHRoZSBsaXN0ICovCisKKwlvYmpfZGVzYy0+bXV0ZXgucHJldiA9IE5VTEw7CisJb2JqX2Rlc2MtPm11dGV4Lm5leHQgPSBsaXN0X2hlYWQ7CisKKwkvKiBVcGRhdGUgb2xkIGZpcnN0IG9iamVjdCB0byBwb2ludCBiYWNrIHRvIHRoaXMgb2JqZWN0ICovCisKKwlpZiAobGlzdF9oZWFkKSB7CisJCWxpc3RfaGVhZC0+bXV0ZXgucHJldiA9IG9ial9kZXNjOworCX0KKworCS8qIFVwZGF0ZSBsaXN0IGhlYWQgKi8KKworCXRocmVhZC0+YWNxdWlyZWRfbXV0ZXhfbGlzdCA9IG9ial9kZXNjOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X2FjcXVpcmVfbXV0ZXhfb2JqZWN0CisgKgorICogUEFSQU1FVEVSUzogIHRpbWVfZGVzYyAgICAgICAgICAgLSBUaW1lb3V0IGluIG1pbGxpc2Vjb25kcworICogICAgICAgICAgICAgIG9ial9kZXNjICAgICAgICAgICAgLSBNdXRleCBvYmplY3QKKyAqICAgICAgICAgICAgICBUaHJlYWQgICAgICAgICAgICAgIC0gQ3VycmVudCB0aHJlYWQgc3RhdGUKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IEFjcXVpcmUgYW4gQU1MIG11dGV4LCBsb3ctbGV2ZWwgaW50ZXJmYWNlLiBQcm92aWRlcyBhIGNvbW1vbgorICogICAgICAgICAgICAgIHBhdGggdGhhdCBzdXBwb3J0cyBtdWx0aXBsZSBhY3F1aXJlcyBieSB0aGUgc2FtZSB0aHJlYWQuCisgKgorICogTVVURVg6ICAgICAgIEludGVycHJldGVyIG11c3QgYmUgbG9ja2VkCisgKgorICogTk9URTogVGhpcyBpbnRlcmZhY2UgaXMgY2FsbGVkIGZyb20gdGhyZWUgcGxhY2VzOgorICogMSkgRnJvbSBhY3BpX2V4X2FjcXVpcmVfbXV0ZXgsIHZpYSBhbiBBTUwgQWNxdWlyZSgpIG9wZXJhdG9yCisgKiAyKSBGcm9tIGFjcGlfZXhfYWNxdWlyZV9nbG9iYWxfbG9jayB3aGVuIGFuIEFNTCBGaWVsZCBhY2Nlc3MgcmVxdWlyZXMgdGhlCisgKiAgICBnbG9iYWwgbG9jaworICogMykgRnJvbSB0aGUgZXh0ZXJuYWwgaW50ZXJmYWNlLCBhY3BpX2FjcXVpcmVfZ2xvYmFsX2xvY2sKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCithY3BpX3N0YXR1cworYWNwaV9leF9hY3F1aXJlX211dGV4X29iamVjdCh1MTYgdGltZW91dCwKKwkJCSAgICAgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2MsCisJCQkgICAgIGFjcGlfdGhyZWFkX2lkIHRocmVhZF9pZCkKK3sKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUihleF9hY3F1aXJlX211dGV4X29iamVjdCwgb2JqX2Rlc2MpOworCisJaWYgKCFvYmpfZGVzYykgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX1BBUkFNRVRFUik7CisJfQorCisJLyogU3VwcG9ydCBmb3IgbXVsdGlwbGUgYWNxdWlyZXMgYnkgdGhlIG93bmluZyB0aHJlYWQgKi8KKworCWlmIChvYmpfZGVzYy0+bXV0ZXgudGhyZWFkX2lkID09IHRocmVhZF9pZCkgeworCQkvKgorCQkgKiBUaGUgbXV0ZXggaXMgYWxyZWFkeSBvd25lZCBieSB0aGlzIHRocmVhZCwganVzdCBpbmNyZW1lbnQgdGhlCisJCSAqIGFjcXVpc2l0aW9uIGRlcHRoCisJCSAqLworCQlvYmpfZGVzYy0+bXV0ZXguYWNxdWlzaXRpb25fZGVwdGgrKzsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKKwl9CisKKwkvKiBBY3F1aXJlIHRoZSBtdXRleCwgd2FpdCBpZiBuZWNlc3NhcnkuIFNwZWNpYWwgY2FzZSBmb3IgR2xvYmFsIExvY2sgKi8KKworCWlmIChvYmpfZGVzYyA9PSBhY3BpX2dibF9nbG9iYWxfbG9ja19tdXRleCkgeworCQlzdGF0dXMgPSBhY3BpX2V2X2FjcXVpcmVfZ2xvYmFsX2xvY2sodGltZW91dCk7CisJfSBlbHNlIHsKKwkJc3RhdHVzID0gYWNwaV9leF9zeXN0ZW1fd2FpdF9tdXRleChvYmpfZGVzYy0+bXV0ZXgub3NfbXV0ZXgsCisJCQkJCQkgICB0aW1lb3V0KTsKKwl9CisKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKworCQkvKiBJbmNsdWRlcyBmYWlsdXJlIGZyb20gYSB0aW1lb3V0IG9uIHRpbWVfZGVzYyAqLworCisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworCX0KKworCS8qIEFjcXVpcmVkIHRoZSBtdXRleDogdXBkYXRlIG11dGV4IG9iamVjdCAqLworCisJb2JqX2Rlc2MtPm11dGV4LnRocmVhZF9pZCA9IHRocmVhZF9pZDsKKwlvYmpfZGVzYy0+bXV0ZXguYWNxdWlzaXRpb25fZGVwdGggPSAxOworCW9ial9kZXNjLT5tdXRleC5vcmlnaW5hbF9zeW5jX2xldmVsID0gMDsKKwlvYmpfZGVzYy0+bXV0ZXgub3duZXJfdGhyZWFkID0gTlVMTDsJLyogVXNlZCBvbmx5IGZvciBBTUwgQWNxdWlyZSgpICovCisKKwlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X2FjcXVpcmVfbXV0ZXgKKyAqCisgKiBQQVJBTUVURVJTOiAgdGltZV9kZXNjICAgICAgICAgICAtIFRpbWVvdXQgaW50ZWdlcgorICogICAgICAgICAgICAgIG9ial9kZXNjICAgICAgICAgICAgLSBNdXRleCBvYmplY3QKKyAqICAgICAgICAgICAgICB3YWxrX3N0YXRlICAgICAgICAgIC0gQ3VycmVudCBtZXRob2QgZXhlY3V0aW9uIHN0YXRlCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBBY3F1aXJlIGFuIEFNTCBtdXRleAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2FjcGlfc3RhdHVzCithY3BpX2V4X2FjcXVpcmVfbXV0ZXgodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqdGltZV9kZXNjLAorCQkgICAgICB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYywKKwkJICAgICAgc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSkKK3sKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUihleF9hY3F1aXJlX211dGV4LCBvYmpfZGVzYyk7CisKKwlpZiAoIW9ial9kZXNjKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfUEFSQU1FVEVSKTsKKwl9CisKKwkvKiBNdXN0IGhhdmUgYSB2YWxpZCB0aHJlYWQgSUQgKi8KKworCWlmICghd2Fsa19zdGF0ZS0+dGhyZWFkKSB7CisJCUFDUElfRVJST1IoKEFFX0lORk8sCisJCQkgICAgIkNhbm5vdCBhY3F1aXJlIE11dGV4IFslNC40c10sIG51bGwgdGhyZWFkIGluZm8iLAorCQkJICAgIGFjcGlfdXRfZ2V0X25vZGVfbmFtZShvYmpfZGVzYy0+bXV0ZXgubm9kZSkpKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9JTlRFUk5BTCk7CisJfQorCisJLyoKKwkgKiBDdXJyZW50IHN5bmMgbGV2ZWwgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHN5bmMgbGV2ZWwgb2YgdGhlCisJICogbXV0ZXguIFRoaXMgbWVjaGFuaXNtIHByb3ZpZGVzIHNvbWUgZGVhZGxvY2sgcHJldmVudGlvbgorCSAqLworCWlmICh3YWxrX3N0YXRlLT50aHJlYWQtPmN1cnJlbnRfc3luY19sZXZlbCA+IG9ial9kZXNjLT5tdXRleC5zeW5jX2xldmVsKSB7CisJCUFDUElfRVJST1IoKEFFX0lORk8sCisJCQkgICAgIkNhbm5vdCBhY3F1aXJlIE11dGV4IFslNC40c10sIGN1cnJlbnQgU3luY0xldmVsIGlzIHRvbyBsYXJnZSAoJWQpIiwKKwkJCSAgICBhY3BpX3V0X2dldF9ub2RlX25hbWUob2JqX2Rlc2MtPm11dGV4Lm5vZGUpLAorCQkJICAgIHdhbGtfc3RhdGUtPnRocmVhZC0+Y3VycmVudF9zeW5jX2xldmVsKSk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfTVVURVhfT1JERVIpOworCX0KKworCXN0YXR1cyA9IGFjcGlfZXhfYWNxdWlyZV9tdXRleF9vYmplY3QoKHUxNikgdGltZV9kZXNjLT5pbnRlZ2VyLnZhbHVlLAorCQkJCQkgICAgICBvYmpfZGVzYywKKwkJCQkJICAgICAgd2Fsa19zdGF0ZS0+dGhyZWFkLT50aHJlYWRfaWQpOworCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSAmJiBvYmpfZGVzYy0+bXV0ZXguYWNxdWlzaXRpb25fZGVwdGggPT0gMSkgeworCisJCS8qIFNhdmUgVGhyZWFkIG9iamVjdCwgb3JpZ2luYWwvY3VycmVudCBzeW5jIGxldmVscyAqLworCisJCW9ial9kZXNjLT5tdXRleC5vd25lcl90aHJlYWQgPSB3YWxrX3N0YXRlLT50aHJlYWQ7CisJCW9ial9kZXNjLT5tdXRleC5vcmlnaW5hbF9zeW5jX2xldmVsID0KKwkJICAgIHdhbGtfc3RhdGUtPnRocmVhZC0+Y3VycmVudF9zeW5jX2xldmVsOworCQl3YWxrX3N0YXRlLT50aHJlYWQtPmN1cnJlbnRfc3luY19sZXZlbCA9CisJCSAgICBvYmpfZGVzYy0+bXV0ZXguc3luY19sZXZlbDsKKworCQkvKiBMaW5rIHRoZSBtdXRleCB0byB0aGUgY3VycmVudCB0aHJlYWQgZm9yIGZvcmNlLXVubG9jayBhdCBtZXRob2QgZXhpdCAqLworCisJCWFjcGlfZXhfbGlua19tdXRleChvYmpfZGVzYywgd2Fsa19zdGF0ZS0+dGhyZWFkKTsKKwl9CisKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9leF9yZWxlYXNlX211dGV4X29iamVjdAorICoKKyAqIFBBUkFNRVRFUlM6ICBvYmpfZGVzYyAgICAgICAgICAgIC0gVGhlIG9iamVjdCBkZXNjcmlwdG9yIGZvciB0aGlzIG9wCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBSZWxlYXNlIGEgcHJldmlvdXNseSBhY3F1aXJlZCBNdXRleCwgbG93IGxldmVsIGludGVyZmFjZS4KKyAqICAgICAgICAgICAgICBQcm92aWRlcyBhIGNvbW1vbiBwYXRoIHRoYXQgc3VwcG9ydHMgbXVsdGlwbGUgcmVsZWFzZXMgKGFmdGVyCisgKiAgICAgICAgICAgICAgcHJldmlvdXMgbXVsdGlwbGUgYWNxdWlyZXMpIGJ5IHRoZSBzYW1lIHRocmVhZC4KKyAqCisgKiBNVVRFWDogICAgICAgSW50ZXJwcmV0ZXIgbXVzdCBiZSBsb2NrZWQKKyAqCisgKiBOT1RFOiBUaGlzIGludGVyZmFjZSBpcyBjYWxsZWQgZnJvbSB0aHJlZSBwbGFjZXM6CisgKiAxKSBGcm9tIGFjcGlfZXhfcmVsZWFzZV9tdXRleCwgdmlhIGFuIEFNTCBBY3F1aXJlKCkgb3BlcmF0b3IKKyAqIDIpIEZyb20gYWNwaV9leF9yZWxlYXNlX2dsb2JhbF9sb2NrIHdoZW4gYW4gQU1MIEZpZWxkIGFjY2VzcyByZXF1aXJlcyB0aGUKKyAqICAgIGdsb2JhbCBsb2NrCisgKiAzKSBGcm9tIHRoZSBleHRlcm5hbCBpbnRlcmZhY2UsIGFjcGlfcmVsZWFzZV9nbG9iYWxfbG9jaworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2FjcGlfc3RhdHVzIGFjcGlfZXhfcmVsZWFzZV9tdXRleF9vYmplY3QodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2MpCit7CisJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGV4X3JlbGVhc2VfbXV0ZXhfb2JqZWN0KTsKKworCWlmIChvYmpfZGVzYy0+bXV0ZXguYWNxdWlzaXRpb25fZGVwdGggPT0gMCkgeworCQlyZXR1cm4gKEFFX05PVF9BQ1FVSVJFRCk7CisJfQorCisJLyogTWF0Y2ggbXVsdGlwbGUgQWNxdWlyZXMgd2l0aCBtdWx0aXBsZSBSZWxlYXNlcyAqLworCisJb2JqX2Rlc2MtPm11dGV4LmFjcXVpc2l0aW9uX2RlcHRoLS07CisJaWYgKG9ial9kZXNjLT5tdXRleC5hY3F1aXNpdGlvbl9kZXB0aCAhPSAwKSB7CisKKwkJLyogSnVzdCBkZWNyZW1lbnQgdGhlIGRlcHRoIGFuZCByZXR1cm4gKi8KKworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOworCX0KKworCWlmIChvYmpfZGVzYy0+bXV0ZXgub3duZXJfdGhyZWFkKSB7CisKKwkJLyogVW5saW5rIHRoZSBtdXRleCBmcm9tIHRoZSBvd25lcidzIGxpc3QgKi8KKworCQlhY3BpX2V4X3VubGlua19tdXRleChvYmpfZGVzYyk7CisJCW9ial9kZXNjLT5tdXRleC5vd25lcl90aHJlYWQgPSBOVUxMOworCX0KKworCS8qIFJlbGVhc2UgdGhlIG11dGV4LCBzcGVjaWFsIGNhc2UgZm9yIEdsb2JhbCBMb2NrICovCisKKwlpZiAob2JqX2Rlc2MgPT0gYWNwaV9nYmxfZ2xvYmFsX2xvY2tfbXV0ZXgpIHsKKwkJc3RhdHVzID0gYWNwaV9ldl9yZWxlYXNlX2dsb2JhbF9sb2NrKCk7CisJfSBlbHNlIHsKKwkJYWNwaV9vc19yZWxlYXNlX211dGV4KG9ial9kZXNjLT5tdXRleC5vc19tdXRleCk7CisJfQorCisJLyogQ2xlYXIgbXV0ZXggaW5mbyAqLworCisJb2JqX2Rlc2MtPm11dGV4LnRocmVhZF9pZCA9IE5VTEw7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfZXhfcmVsZWFzZV9tdXRleAorICoKKyAqIFBBUkFNRVRFUlM6ICBvYmpfZGVzYyAgICAgICAgICAgIC0gVGhlIG9iamVjdCBkZXNjcmlwdG9yIGZvciB0aGlzIG9wCisgKiAgICAgICAgICAgICAgd2Fsa19zdGF0ZSAgICAgICAgICAtIEN1cnJlbnQgbWV0aG9kIGV4ZWN1dGlvbiBzdGF0ZQorICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogUmVsZWFzZSBhIHByZXZpb3VzbHkgYWNxdWlyZWQgTXV0ZXguCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworYWNwaV9zdGF0dXMKK2FjcGlfZXhfcmVsZWFzZV9tdXRleCh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYywKKwkJICAgICAgc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSkKK3sKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0UoZXhfcmVsZWFzZV9tdXRleCk7CisKKwlpZiAoIW9ial9kZXNjKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfUEFSQU1FVEVSKTsKKwl9CisKKwkvKiBUaGUgbXV0ZXggbXVzdCBoYXZlIGJlZW4gcHJldmlvdXNseSBhY3F1aXJlZCBpbiBvcmRlciB0byByZWxlYXNlIGl0ICovCisKKwlpZiAoIW9ial9kZXNjLT5tdXRleC5vd25lcl90aHJlYWQpIHsKKwkJQUNQSV9FUlJPUigoQUVfSU5GTywKKwkJCSAgICAiQ2Fubm90IHJlbGVhc2UgTXV0ZXggWyU0LjRzXSwgbm90IGFjcXVpcmVkIiwKKwkJCSAgICBhY3BpX3V0X2dldF9ub2RlX25hbWUob2JqX2Rlc2MtPm11dGV4Lm5vZGUpKSk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfTVVURVhfTk9UX0FDUVVJUkVEKTsKKwl9CisKKwkvKgorCSAqIFRoZSBNdXRleCBpcyBvd25lZCwgYnV0IHRoaXMgdGhyZWFkIG11c3QgYmUgdGhlIG93bmVyLgorCSAqIFNwZWNpYWwgY2FzZSBmb3IgR2xvYmFsIExvY2ssIGFueSB0aHJlYWQgY2FuIHJlbGVhc2UKKwkgKi8KKwlpZiAoKG9ial9kZXNjLT5tdXRleC5vd25lcl90aHJlYWQtPnRocmVhZF9pZCAhPQorCSAgICAgd2Fsa19zdGF0ZS0+dGhyZWFkLT50aHJlYWRfaWQpCisJICAgICYmIChvYmpfZGVzYyAhPSBhY3BpX2dibF9nbG9iYWxfbG9ja19tdXRleCkpIHsKKwkJQUNQSV9FUlJPUigoQUVfSU5GTywKKwkJCSAgICAiVGhyZWFkICVsWCBjYW5ub3QgcmVsZWFzZSBNdXRleCBbJTQuNHNdIGFjcXVpcmVkIGJ5IHRocmVhZCAlbFgiLAorCQkJICAgICh1bnNpZ25lZCBsb25nKXdhbGtfc3RhdGUtPnRocmVhZC0+dGhyZWFkX2lkLAorCQkJICAgIGFjcGlfdXRfZ2V0X25vZGVfbmFtZShvYmpfZGVzYy0+bXV0ZXgubm9kZSksCisJCQkgICAgKHVuc2lnbmVkIGxvbmcpb2JqX2Rlc2MtPm11dGV4Lm93bmVyX3RocmVhZC0+CisJCQkgICAgdGhyZWFkX2lkKSk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfTk9UX09XTkVSKTsKKwl9CisKKwkvKiBNdXN0IGhhdmUgYSB2YWxpZCB0aHJlYWQgSUQgKi8KKworCWlmICghd2Fsa19zdGF0ZS0+dGhyZWFkKSB7CisJCUFDUElfRVJST1IoKEFFX0lORk8sCisJCQkgICAgIkNhbm5vdCByZWxlYXNlIE11dGV4IFslNC40c10sIG51bGwgdGhyZWFkIGluZm8iLAorCQkJICAgIGFjcGlfdXRfZ2V0X25vZGVfbmFtZShvYmpfZGVzYy0+bXV0ZXgubm9kZSkpKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9JTlRFUk5BTCk7CisJfQorCisJLyoKKwkgKiBUaGUgc3luYyBsZXZlbCBvZiB0aGUgbXV0ZXggbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIGN1cnJlbnQKKwkgKiBzeW5jIGxldmVsCisJICovCisJaWYgKG9ial9kZXNjLT5tdXRleC5zeW5jX2xldmVsID4gd2Fsa19zdGF0ZS0+dGhyZWFkLT5jdXJyZW50X3N5bmNfbGV2ZWwpIHsKKwkJQUNQSV9FUlJPUigoQUVfSU5GTywKKwkJCSAgICAiQ2Fubm90IHJlbGVhc2UgTXV0ZXggWyU0LjRzXSwgU3luY0xldmVsIG1pc21hdGNoOiBtdXRleCAlZCBjdXJyZW50ICVkIiwKKwkJCSAgICBhY3BpX3V0X2dldF9ub2RlX25hbWUob2JqX2Rlc2MtPm11dGV4Lm5vZGUpLAorCQkJICAgIG9ial9kZXNjLT5tdXRleC5zeW5jX2xldmVsLAorCQkJICAgIHdhbGtfc3RhdGUtPnRocmVhZC0+Y3VycmVudF9zeW5jX2xldmVsKSk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfTVVURVhfT1JERVIpOworCX0KKworCXN0YXR1cyA9IGFjcGlfZXhfcmVsZWFzZV9tdXRleF9vYmplY3Qob2JqX2Rlc2MpOworCisJaWYgKG9ial9kZXNjLT5tdXRleC5hY3F1aXNpdGlvbl9kZXB0aCA9PSAwKSB7CisKKwkJLyogUmVzdG9yZSB0aGUgb3JpZ2luYWwgc3luY19sZXZlbCAqLworCisJCXdhbGtfc3RhdGUtPnRocmVhZC0+Y3VycmVudF9zeW5jX2xldmVsID0KKwkJICAgIG9ial9kZXNjLT5tdXRleC5vcmlnaW5hbF9zeW5jX2xldmVsOworCX0KKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9leF9yZWxlYXNlX2FsbF9tdXRleGVzCisgKgorICogUEFSQU1FVEVSUzogIFRocmVhZCAgICAgICAgICAtIEN1cnJlbnQgZXhlY3V0aW5nIHRocmVhZCBvYmplY3QKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IFJlbGVhc2UgYWxsIG11dGV4ZXMgaGVsZCBieSB0aGlzIHRocmVhZAorICoKKyAqIE5PVEU6IFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGFzIHRoZSB0aHJlYWQgaXMgZXhpdGluZyB0aGUgaW50ZXJwcmV0ZXIuCisgKiBNdXRleGVzIGFyZSBub3QgcmVsZWFzZWQgd2hlbiBhbiBpbmRpdmlkdWFsIGNvbnRyb2wgbWV0aG9kIGlzIGV4aXRlZCwgYnV0CisgKiBvbmx5IHdoZW4gdGhlIHBhcmVudCB0aHJlYWQgYWN0dWFsbHkgZXhpdHMgdGhlIGludGVycHJldGVyLiBUaGlzIGFsbG93cyBvbmUKKyAqIG1ldGhvZCB0byBhY3F1aXJlIGEgbXV0ZXgsIGFuZCBhIGRpZmZlcmVudCBtZXRob2QgdG8gcmVsZWFzZSBpdCwgYXMgbG9uZyBhcworICogdGhpcyBpcyBwZXJmb3JtZWQgdW5kZXJuZWF0aCBhIHNpbmdsZSBwYXJlbnQgY29udHJvbCBtZXRob2QuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBhY3BpX2V4X3JlbGVhc2VfYWxsX211dGV4ZXMoc3RydWN0IGFjcGlfdGhyZWFkX3N0YXRlICp0aHJlYWQpCit7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqbmV4dCA9IHRocmVhZC0+YWNxdWlyZWRfbXV0ZXhfbGlzdDsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYzsKKworCUFDUElfRlVOQ1RJT05fRU5UUlkoKTsKKworCS8qIFRyYXZlcnNlIHRoZSBsaXN0IG9mIG93bmVkIG11dGV4ZXMsIHJlbGVhc2luZyBlYWNoIG9uZSAqLworCisJd2hpbGUgKG5leHQpIHsKKwkJb2JqX2Rlc2MgPSBuZXh0OworCQluZXh0ID0gb2JqX2Rlc2MtPm11dGV4Lm5leHQ7CisKKwkJb2JqX2Rlc2MtPm11dGV4LnByZXYgPSBOVUxMOworCQlvYmpfZGVzYy0+bXV0ZXgubmV4dCA9IE5VTEw7CisJCW9ial9kZXNjLT5tdXRleC5hY3F1aXNpdGlvbl9kZXB0aCA9IDA7CisKKwkJLyogUmVsZWFzZSB0aGUgbXV0ZXgsIHNwZWNpYWwgY2FzZSBmb3IgR2xvYmFsIExvY2sgKi8KKworCQlpZiAob2JqX2Rlc2MgPT0gYWNwaV9nYmxfZ2xvYmFsX2xvY2tfbXV0ZXgpIHsKKworCQkJLyogSWdub3JlIGVycm9ycyAqLworCisJCQkodm9pZClhY3BpX2V2X3JlbGVhc2VfZ2xvYmFsX2xvY2soKTsKKwkJfSBlbHNlIHsKKwkJCWFjcGlfb3NfcmVsZWFzZV9tdXRleChvYmpfZGVzYy0+bXV0ZXgub3NfbXV0ZXgpOworCQl9CisKKwkJLyogTWFyayBtdXRleCB1bm93bmVkICovCisKKwkJb2JqX2Rlc2MtPm11dGV4Lm93bmVyX3RocmVhZCA9IE5VTEw7CisJCW9ial9kZXNjLT5tdXRleC50aHJlYWRfaWQgPSBOVUxMOworCisJCS8qIFVwZGF0ZSBUaHJlYWQgc3luY19sZXZlbCAoTGFzdCBtdXRleCBpcyB0aGUgaW1wb3J0YW50IG9uZSkgKi8KKworCQl0aHJlYWQtPmN1cnJlbnRfc3luY19sZXZlbCA9CisJCSAgICBvYmpfZGVzYy0+bXV0ZXgub3JpZ2luYWxfc3luY19sZXZlbDsKKwl9Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2V4bmFtZXMuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXhuYW1lcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmZGFlMTIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2V4bmFtZXMuYwpAQCAtMCwwICsxLDQzNiBAQAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogTW9kdWxlIE5hbWU6IGV4bmFtZXMgLSBpbnRlcnByZXRlci9zY2FubmVyIG5hbWUgbG9hZC9leGVjdXRlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwOCwgSW50ZWwgQ29ycC4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKKyAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIGF0IG1pbmltdW0gYSBkaXNjbGFpbWVyCisgKiAgICBzdWJzdGFudGlhbGx5IHNpbWlsYXIgdG8gdGhlICJOTyBXQVJSQU5UWSIgZGlzY2xhaW1lciBiZWxvdworICogICAgKCJEaXNjbGFpbWVyIikgYW5kIGFueSByZWRpc3RyaWJ1dGlvbiBtdXN0IGJlIGNvbmRpdGlvbmVkIHVwb24KKyAqICAgIGluY2x1ZGluZyBhIHN1YnN0YW50aWFsbHkgc2ltaWxhciBEaXNjbGFpbWVyIHJlcXVpcmVtZW50IGZvciBmdXJ0aGVyCisgKiAgICBiaW5hcnkgcmVkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMKKyAqICAgIG9mIGFueSBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogTk8gV0FSUkFOVFkKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HCisgKiBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KKyAqLworCisjaW5jbHVkZSA8YWNwaS9hY3BpLmg+CisjaW5jbHVkZSAiYWNjb21tb24uaCIKKyNpbmNsdWRlICJhY2ludGVycC5oIgorI2luY2x1ZGUgImFtbGNvZGUuaCIKKworI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfRVhFQ1VURVIKK0FDUElfTU9EVUxFX05BTUUoImV4bmFtZXMiKQorCisvKiBMb2NhbCBwcm90b3R5cGVzICovCitzdGF0aWMgY2hhciAqYWNwaV9leF9hbGxvY2F0ZV9uYW1lX3N0cmluZyh1MzIgcHJlZml4X2NvdW50LCB1MzIgbnVtX25hbWVfc2Vncyk7CisKK3N0YXRpYyBhY3BpX3N0YXR1cworYWNwaV9leF9uYW1lX3NlZ21lbnQodTggKiogaW5fYW1sX2FkZHJlc3MsIGNoYXIgKm5hbWVfc3RyaW5nKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9leF9hbGxvY2F0ZV9uYW1lX3N0cmluZworICoKKyAqIFBBUkFNRVRFUlM6ICBwcmVmaXhfY291bnQgICAgICAgIC0gQ291bnQgb2YgcGFyZW50IGxldmVscy4gU3BlY2lhbCBjYXNlczoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0xKT09cm9vdCwgIDA9PW5vbmUKKyAqICAgICAgICAgICAgICBudW1fbmFtZV9zZWdzICAgICAgIC0gY291bnQgb2YgNC1jaGFyYWN0ZXIgbmFtZSBzZWdtZW50cworICoKKyAqIFJFVFVSTjogICAgICBBIHBvaW50ZXIgdG8gdGhlIGFsbG9jYXRlZCBzdHJpbmcgc2VnbWVudC4gIFRoaXMgc2VnbWVudCBtdXN0CisgKiAgICAgICAgICAgICAgYmUgZGVsZXRlZCBieSB0aGUgY2FsbGVyLgorICoKKyAqIERFU0NSSVBUSU9OOiBBbGxvY2F0ZSBhIGJ1ZmZlciBmb3IgYSBuYW1lIHN0cmluZy4gRW5zdXJlIGFsbG9jYXRlZCBuYW1lCisgKiAgICAgICAgICAgICAgc3RyaW5nIGlzIGxvbmcgZW5vdWdoLCBhbmQgc2V0IHVwIHByZWZpeCBpZiBhbnkuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGNoYXIgKmFjcGlfZXhfYWxsb2NhdGVfbmFtZV9zdHJpbmcodTMyIHByZWZpeF9jb3VudCwgdTMyIG51bV9uYW1lX3NlZ3MpCit7CisJY2hhciAqdGVtcF9wdHI7CisJY2hhciAqbmFtZV9zdHJpbmc7CisJdTMyIHNpemVfbmVlZGVkOworCisJQUNQSV9GVU5DVElPTl9UUkFDRShleF9hbGxvY2F0ZV9uYW1lX3N0cmluZyk7CisKKwkvKgorCSAqIEFsbG93IHJvb20gZm9yIGFsbCBcIGFuZCBeIHByZWZpeGVzLCBhbGwgc2VnbWVudHMgYW5kIGEgbXVsdGlfbmFtZV9wcmVmaXguCisJICogQWxzbywgb25lIGJ5dGUgZm9yIHRoZSBudWxsIHRlcm1pbmF0b3IuCisJICogVGhpcyBtYXkgYWN0dWFsbHkgYmUgc29tZXdoYXQgbG9uZ2VyIHRoYW4gbmVlZGVkLgorCSAqLworCWlmIChwcmVmaXhfY291bnQgPT0gQUNQSV9VSU5UMzJfTUFYKSB7CisKKwkJLyogU3BlY2lhbCBjYXNlIGZvciByb290ICovCisKKwkJc2l6ZV9uZWVkZWQgPSAxICsgKEFDUElfTkFNRV9TSVpFICogbnVtX25hbWVfc2VncykgKyAyICsgMTsKKwl9IGVsc2UgeworCQlzaXplX25lZWRlZCA9CisJCSAgICBwcmVmaXhfY291bnQgKyAoQUNQSV9OQU1FX1NJWkUgKiBudW1fbmFtZV9zZWdzKSArIDIgKyAxOworCX0KKworCS8qCisJICogQWxsb2NhdGUgYSBidWZmZXIgZm9yIHRoZSBuYW1lLgorCSAqIFRoaXMgYnVmZmVyIG11c3QgYmUgZGVsZXRlZCBieSB0aGUgY2FsbGVyIQorCSAqLworCW5hbWVfc3RyaW5nID0gQUNQSV9BTExPQ0FURShzaXplX25lZWRlZCk7CisJaWYgKCFuYW1lX3N0cmluZykgeworCQlBQ1BJX0VSUk9SKChBRV9JTkZPLAorCQkJICAgICJDb3VsZCBub3QgYWxsb2NhdGUgc2l6ZSAlZCIsIHNpemVfbmVlZGVkKSk7CisJCXJldHVybl9QVFIoTlVMTCk7CisJfQorCisJdGVtcF9wdHIgPSBuYW1lX3N0cmluZzsKKworCS8qIFNldCB1cCBSb290IG9yIFBhcmVudCBwcmVmaXhlcyBpZiBuZWVkZWQgKi8KKworCWlmIChwcmVmaXhfY291bnQgPT0gQUNQSV9VSU5UMzJfTUFYKSB7CisJCSp0ZW1wX3B0cisrID0gQU1MX1JPT1RfUFJFRklYOworCX0gZWxzZSB7CisJCXdoaWxlIChwcmVmaXhfY291bnQtLSkgeworCQkJKnRlbXBfcHRyKysgPSBBTUxfUEFSRU5UX1BSRUZJWDsKKwkJfQorCX0KKworCS8qIFNldCB1cCBEdWFsIG9yIE11bHRpIHByZWZpeGVzIGlmIG5lZWRlZCAqLworCisJaWYgKG51bV9uYW1lX3NlZ3MgPiAyKSB7CisKKwkJLyogU2V0IHVwIG11bHRpIHByZWZpeGVzICAgKi8KKworCQkqdGVtcF9wdHIrKyA9IEFNTF9NVUxUSV9OQU1FX1BSRUZJWF9PUDsKKwkJKnRlbXBfcHRyKysgPSAoY2hhciludW1fbmFtZV9zZWdzOworCX0gZWxzZSBpZiAoMiA9PSBudW1fbmFtZV9zZWdzKSB7CisKKwkJLyogU2V0IHVwIGR1YWwgcHJlZml4ZXMgKi8KKworCQkqdGVtcF9wdHIrKyA9IEFNTF9EVUFMX05BTUVfUFJFRklYOworCX0KKworCS8qCisJICogVGVybWluYXRlIHN0cmluZyBmb2xsb3dpbmcgcHJlZml4ZXMuIGFjcGlfZXhfbmFtZV9zZWdtZW50KCkgd2lsbAorCSAqIGFwcGVuZCB0aGUgc2VnbWVudChzKQorCSAqLworCSp0ZW1wX3B0ciA9IDA7CisKKwlyZXR1cm5fUFRSKG5hbWVfc3RyaW5nKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9leF9uYW1lX3NlZ21lbnQKKyAqCisgKiBQQVJBTUVURVJTOiAgaW5fYW1sX2FkZHJlc3MgIC0gUG9pbnRlciB0byB0aGUgbmFtZSBpbiB0aGUgQU1MIGNvZGUKKyAqICAgICAgICAgICAgICBuYW1lX3N0cmluZyAgICAgLSBXaGVyZSB0byByZXR1cm4gdGhlIG5hbWUuIFRoZSBuYW1lIGlzIGFwcGVuZGVkCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYW55IGV4aXN0aW5nIHN0cmluZyB0byBmb3JtIGEgbmFtZXBhdGgKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IEV4dHJhY3QgYW4gQUNQSSBuYW1lICg0IGJ5dGVzKSBmcm9tIHRoZSBBTUwgYnl0ZSBzdHJlYW0KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgYWNwaV9zdGF0dXMgYWNwaV9leF9uYW1lX3NlZ21lbnQodTggKiogaW5fYW1sX2FkZHJlc3MsIGNoYXIgKm5hbWVfc3RyaW5nKQoreworCWNoYXIgKmFtbF9hZGRyZXNzID0gKHZvaWQgKikqaW5fYW1sX2FkZHJlc3M7CisJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CisJdTMyIGluZGV4OworCWNoYXIgY2hhcl9idWZbNV07CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGV4X25hbWVfc2VnbWVudCk7CisKKwkvKgorCSAqIElmIGZpcnN0IGNoYXJhY3RlciBpcyBhIGRpZ2l0LCB0aGVuIHdlIGtub3cgdGhhdCB3ZSBhcmVuJ3QgbG9va2luZyBhdCBhCisJICogdmFsaWQgbmFtZSBzZWdtZW50CisJICovCisJY2hhcl9idWZbMF0gPSAqYW1sX2FkZHJlc3M7CisKKwlpZiAoJzAnIDw9IGNoYXJfYnVmWzBdICYmIGNoYXJfYnVmWzBdIDw9ICc5JykgeworCQlBQ1BJX0VSUk9SKChBRV9JTkZPLCAiSW52YWxpZCBsZWFkaW5nIGRpZ2l0OiAlYyIsIGNoYXJfYnVmWzBdKSk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9DVFJMX1BFTkRJTkcpOworCX0KKworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfTE9BRCwgIkJ5dGVzIGZyb20gc3RyZWFtOlxuIikpOworCisJZm9yIChpbmRleCA9IDA7IChpbmRleCA8IEFDUElfTkFNRV9TSVpFKQorCSAgICAgJiYgKGFjcGlfdXRfdmFsaWRfYWNwaV9jaGFyKCphbWxfYWRkcmVzcywgMCkpOyBpbmRleCsrKSB7CisJCWNoYXJfYnVmW2luZGV4XSA9ICphbWxfYWRkcmVzcysrOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0xPQUQsICIlY1xuIiwgY2hhcl9idWZbaW5kZXhdKSk7CisJfQorCisJLyogVmFsaWQgbmFtZSBzZWdtZW50ICAqLworCisJaWYgKGluZGV4ID09IDQpIHsKKworCQkvKiBGb3VuZCA0IHZhbGlkIGNoYXJhY3RlcnMgKi8KKworCQljaGFyX2J1Zls0XSA9ICdcMCc7CisKKwkJaWYgKG5hbWVfc3RyaW5nKSB7CisJCQlBQ1BJX1NUUkNBVChuYW1lX3N0cmluZywgY2hhcl9idWYpOworCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9OQU1FUywKKwkJCQkJICAiQXBwZW5kZWQgdG8gLSAlc1xuIiwgbmFtZV9zdHJpbmcpKTsKKwkJfSBlbHNlIHsKKwkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfTkFNRVMsCisJCQkJCSAgIk5vIE5hbWUgc3RyaW5nIC0gJXNcbiIsIGNoYXJfYnVmKSk7CisJCX0KKwl9IGVsc2UgaWYgKGluZGV4ID09IDApIHsKKwkJLyoKKwkJICogRmlyc3QgY2hhcmFjdGVyIHdhcyBub3QgYSB2YWxpZCBuYW1lIGNoYXJhY3RlciwKKwkJICogc28gd2UgYXJlIGxvb2tpbmcgYXQgc29tZXRoaW5nIG90aGVyIHRoYW4gYSBuYW1lLgorCQkgKi8KKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLAorCQkJCSAgIkxlYWRpbmcgY2hhcmFjdGVyIGlzIG5vdCBhbHBoYTogJTAyWGggKG5vdCBhIG5hbWUpXG4iLAorCQkJCSAgY2hhcl9idWZbMF0pKTsKKwkJc3RhdHVzID0gQUVfQ1RSTF9QRU5ESU5HOworCX0gZWxzZSB7CisJCS8qCisJCSAqIFNlZ21lbnQgc3RhcnRlZCB3aXRoIG9uZSBvciBtb3JlIHZhbGlkIGNoYXJhY3RlcnMsIGJ1dCBmZXdlciB0aGFuCisJCSAqIHRoZSByZXF1aXJlZCA0CisJCSAqLworCQlzdGF0dXMgPSBBRV9BTUxfQkFEX05BTUU7CisJCUFDUElfRVJST1IoKEFFX0lORk8sCisJCQkgICAgIkJhZCBjaGFyYWN0ZXIgJTAyeCBpbiBuYW1lLCBhdCAlcCIsCisJCQkgICAgKmFtbF9hZGRyZXNzLCBhbWxfYWRkcmVzcykpOworCX0KKworCSppbl9hbWxfYWRkcmVzcyA9IEFDUElfQ0FTVF9QVFIodTgsIGFtbF9hZGRyZXNzKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9leF9nZXRfbmFtZV9zdHJpbmcKKyAqCisgKiBQQVJBTUVURVJTOiAgZGF0YV90eXBlICAgICAgICAgICAtIE9iamVjdCB0eXBlIHRvIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGlzCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUKKyAqICAgICAgICAgICAgICBpbl9hbWxfYWRkcmVzcyAgICAgIC0gUG9pbnRlciB0byB0aGUgbmFtZXN0cmluZyBpbiB0aGUgQU1MIGNvZGUKKyAqICAgICAgICAgICAgICBvdXRfbmFtZV9zdHJpbmcgICAgIC0gV2hlcmUgdGhlIG5hbWVzdHJpbmcgaXMgcmV0dXJuZWQKKyAqICAgICAgICAgICAgICBvdXRfbmFtZV9sZW5ndGggICAgIC0gTGVuZ3RoIG9mIHRoZSByZXR1cm5lZCBzdHJpbmcKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzLCBuYW1lc3RyaW5nIGFuZCBsZW5ndGgKKyAqCisgKiBERVNDUklQVElPTjogRXh0cmFjdCBhIGZ1bGwgbmFtZXBhdGggZnJvbSB0aGUgQU1MIGJ5dGUgc3RyZWFtLAorICogICAgICAgICAgICAgIGluY2x1ZGluZyBhbnkgcHJlZml4ZXMuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworYWNwaV9zdGF0dXMKK2FjcGlfZXhfZ2V0X25hbWVfc3RyaW5nKGFjcGlfb2JqZWN0X3R5cGUgZGF0YV90eXBlLAorCQkJdTggKiBpbl9hbWxfYWRkcmVzcywKKwkJCWNoYXIgKipvdXRfbmFtZV9zdHJpbmcsIHUzMiAqIG91dF9uYW1lX2xlbmd0aCkKK3sKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKKwl1OCAqYW1sX2FkZHJlc3MgPSBpbl9hbWxfYWRkcmVzczsKKwljaGFyICpuYW1lX3N0cmluZyA9IE5VTEw7CisJdTMyIG51bV9zZWdtZW50czsKKwl1MzIgcHJlZml4X2NvdW50ID0gMDsKKwl1OCBoYXNfcHJlZml4ID0gRkFMU0U7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUihleF9nZXRfbmFtZV9zdHJpbmcsIGFtbF9hZGRyZXNzKTsKKworCWlmIChBQ1BJX1RZUEVfTE9DQUxfUkVHSU9OX0ZJRUxEID09IGRhdGFfdHlwZSB8fAorCSAgICBBQ1BJX1RZUEVfTE9DQUxfQkFOS19GSUVMRCA9PSBkYXRhX3R5cGUgfHwKKwkgICAgQUNQSV9UWVBFX0xPQ0FMX0lOREVYX0ZJRUxEID09IGRhdGFfdHlwZSkgeworCisJCS8qIERpc2FsbG93IHByZWZpeGVzIGZvciB0eXBlcyBhc3NvY2lhdGVkIHdpdGggZmllbGRfdW5pdCBuYW1lcyAqLworCisJCW5hbWVfc3RyaW5nID0gYWNwaV9leF9hbGxvY2F0ZV9uYW1lX3N0cmluZygwLCAxKTsKKwkJaWYgKCFuYW1lX3N0cmluZykgeworCQkJc3RhdHVzID0gQUVfTk9fTUVNT1JZOworCQl9IGVsc2UgeworCQkJc3RhdHVzID0KKwkJCSAgICBhY3BpX2V4X25hbWVfc2VnbWVudCgmYW1sX2FkZHJlc3MsIG5hbWVfc3RyaW5nKTsKKwkJfQorCX0gZWxzZSB7CisJCS8qCisJCSAqIGRhdGFfdHlwZSBpcyBub3QgYSBmaWVsZCBuYW1lLgorCQkgKiBFeGFtaW5lIGZpcnN0IGNoYXJhY3RlciBvZiBuYW1lIGZvciByb290IG9yIHBhcmVudCBwcmVmaXggb3BlcmF0b3JzCisJCSAqLworCQlzd2l0Y2ggKCphbWxfYWRkcmVzcykgeworCQljYXNlIEFNTF9ST09UX1BSRUZJWDoKKworCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9MT0FELAorCQkJCQkgICJSb290UHJlZml4KFxcKSBhdCAlcFxuIiwKKwkJCQkJICBhbWxfYWRkcmVzcykpOworCisJCQkvKgorCQkJICogUmVtZW1iZXIgdGhhdCB3ZSBoYXZlIGEgcm9vdF9wcmVmaXggLS0KKwkJCSAqIHNlZSBjb21tZW50IGluIGFjcGlfZXhfYWxsb2NhdGVfbmFtZV9zdHJpbmcoKQorCQkJICovCisJCQlhbWxfYWRkcmVzcysrOworCQkJcHJlZml4X2NvdW50ID0gQUNQSV9VSU5UMzJfTUFYOworCQkJaGFzX3ByZWZpeCA9IFRSVUU7CisJCQlicmVhazsKKworCQljYXNlIEFNTF9QQVJFTlRfUFJFRklYOgorCisJCQkvKiBJbmNyZW1lbnQgcGFzdCBwb3NzaWJseSBtdWx0aXBsZSBwYXJlbnQgcHJlZml4ZXMgKi8KKworCQkJZG8geworCQkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfTE9BRCwKKwkJCQkJCSAgIlBhcmVudFByZWZpeCAoXikgYXQgJXBcbiIsCisJCQkJCQkgIGFtbF9hZGRyZXNzKSk7CisKKwkJCQlhbWxfYWRkcmVzcysrOworCQkJCXByZWZpeF9jb3VudCsrOworCisJCQl9IHdoaWxlICgqYW1sX2FkZHJlc3MgPT0gQU1MX1BBUkVOVF9QUkVGSVgpOworCisJCQloYXNfcHJlZml4ID0gVFJVRTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisKKwkJCS8qIE5vdCBhIHByZWZpeCBjaGFyYWN0ZXIgKi8KKworCQkJYnJlYWs7CisJCX0KKworCQkvKiBFeGFtaW5lIGZpcnN0IGNoYXJhY3RlciBvZiBuYW1lIGZvciBuYW1lIHNlZ21lbnQgcHJlZml4IG9wZXJhdG9yICovCisKKwkJc3dpdGNoICgqYW1sX2FkZHJlc3MpIHsKKwkJY2FzZSBBTUxfRFVBTF9OQU1FX1BSRUZJWDoKKworCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9MT0FELAorCQkJCQkgICJEdWFsTmFtZVByZWZpeCBhdCAlcFxuIiwKKwkJCQkJICBhbWxfYWRkcmVzcykpOworCisJCQlhbWxfYWRkcmVzcysrOworCQkJbmFtZV9zdHJpbmcgPQorCQkJICAgIGFjcGlfZXhfYWxsb2NhdGVfbmFtZV9zdHJpbmcocHJlZml4X2NvdW50LCAyKTsKKwkJCWlmICghbmFtZV9zdHJpbmcpIHsKKwkJCQlzdGF0dXMgPSBBRV9OT19NRU1PUlk7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCS8qIEluZGljYXRlIHRoYXQgd2UgcHJvY2Vzc2VkIGEgcHJlZml4ICovCisKKwkJCWhhc19wcmVmaXggPSBUUlVFOworCisJCQlzdGF0dXMgPQorCQkJICAgIGFjcGlfZXhfbmFtZV9zZWdtZW50KCZhbWxfYWRkcmVzcywgbmFtZV9zdHJpbmcpOworCQkJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCQkJc3RhdHVzID0KKwkJCQkgICAgYWNwaV9leF9uYW1lX3NlZ21lbnQoJmFtbF9hZGRyZXNzLAorCQkJCQkJCSBuYW1lX3N0cmluZyk7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIEFNTF9NVUxUSV9OQU1FX1BSRUZJWF9PUDoKKworCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9MT0FELAorCQkJCQkgICJNdWx0aU5hbWVQcmVmaXggYXQgJXBcbiIsCisJCQkJCSAgYW1sX2FkZHJlc3MpKTsKKworCQkJLyogRmV0Y2ggY291bnQgb2Ygc2VnbWVudHMgcmVtYWluaW5nIGluIG5hbWUgcGF0aCAqLworCisJCQlhbWxfYWRkcmVzcysrOworCQkJbnVtX3NlZ21lbnRzID0gKmFtbF9hZGRyZXNzOworCisJCQluYW1lX3N0cmluZyA9CisJCQkgICAgYWNwaV9leF9hbGxvY2F0ZV9uYW1lX3N0cmluZyhwcmVmaXhfY291bnQsCisJCQkJCQkJIG51bV9zZWdtZW50cyk7CisJCQlpZiAoIW5hbWVfc3RyaW5nKSB7CisJCQkJc3RhdHVzID0gQUVfTk9fTUVNT1JZOworCQkJCWJyZWFrOworCQkJfQorCisJCQkvKiBJbmRpY2F0ZSB0aGF0IHdlIHByb2Nlc3NlZCBhIHByZWZpeCAqLworCisJCQlhbWxfYWRkcmVzcysrOworCQkJaGFzX3ByZWZpeCA9IFRSVUU7CisKKwkJCXdoaWxlIChudW1fc2VnbWVudHMgJiYKKwkJCSAgICAgICAoc3RhdHVzID0KKwkJCQlhY3BpX2V4X25hbWVfc2VnbWVudCgmYW1sX2FkZHJlc3MsCisJCQkJCQkgICAgIG5hbWVfc3RyaW5nKSkgPT0gQUVfT0spIHsKKwkJCQludW1fc2VnbWVudHMtLTsKKwkJCX0KKworCQkJYnJlYWs7CisKKwkJY2FzZSAwOgorCisJCQkvKiBudWxsX25hbWUgdmFsaWQgYXMgb2YgOC0xMi05OCBBU0wvQU1MIEdyYW1tYXIgVXBkYXRlICovCisKKwkJCWlmIChwcmVmaXhfY291bnQgPT0gQUNQSV9VSU5UMzJfTUFYKSB7CisJCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FWEVDLAorCQkJCQkJICAiTmFtZVNlZyBpcyBcIlxcXCIgZm9sbG93ZWQgYnkgTlVMTFxuIikpOworCQkJfQorCisJCQkvKiBDb25zdW1lIHRoZSBOVUxMIGJ5dGUgKi8KKworCQkJYW1sX2FkZHJlc3MrKzsKKwkJCW5hbWVfc3RyaW5nID0KKwkJCSAgICBhY3BpX2V4X2FsbG9jYXRlX25hbWVfc3RyaW5nKHByZWZpeF9jb3VudCwgMCk7CisJCQlpZiAoIW5hbWVfc3RyaW5nKSB7CisJCQkJc3RhdHVzID0gQUVfTk9fTUVNT1JZOworCQkJCWJyZWFrOworCQkJfQorCisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCisJCQkvKiBOYW1lIHNlZ21lbnQgc3RyaW5nICovCisKKwkJCW5hbWVfc3RyaW5nID0KKwkJCSAgICBhY3BpX2V4X2FsbG9jYXRlX25hbWVfc3RyaW5nKHByZWZpeF9jb3VudCwgMSk7CisJCQlpZiAoIW5hbWVfc3RyaW5nKSB7CisJCQkJc3RhdHVzID0gQUVfTk9fTUVNT1JZOworCQkJCWJyZWFrOworCQkJfQorCisJCQlzdGF0dXMgPQorCQkJICAgIGFjcGlfZXhfbmFtZV9zZWdtZW50KCZhbWxfYWRkcmVzcywgbmFtZV9zdHJpbmcpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoQUVfQ1RSTF9QRU5ESU5HID09IHN0YXR1cyAmJiBoYXNfcHJlZml4KSB7CisKKwkJLyogUmFuIG91dCBvZiBzZWdtZW50cyBhZnRlciBwcm9jZXNzaW5nIGEgcHJlZml4ICovCisKKwkJQUNQSV9FUlJPUigoQUVfSU5GTywgIk1hbGZvcm1lZCBOYW1lIGF0ICVwIiwgbmFtZV9zdHJpbmcpKTsKKwkJc3RhdHVzID0gQUVfQU1MX0JBRF9OQU1FOworCX0KKworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlpZiAobmFtZV9zdHJpbmcpIHsKKwkJCUFDUElfRlJFRShuYW1lX3N0cmluZyk7CisJCX0KKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CisJfQorCisJKm91dF9uYW1lX3N0cmluZyA9IG5hbWVfc3RyaW5nOworCSpvdXRfbmFtZV9sZW5ndGggPSAodTMyKSAoYW1sX2FkZHJlc3MgLSBpbl9hbWxfYWRkcmVzcyk7CisKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXhvcGFyZzEuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXhvcGFyZzEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTMwNDgwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS9leG9wYXJnMS5jCkBAIC0wLDAgKzEsMTA1MCBAQAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogTW9kdWxlIE5hbWU6IGV4b3BhcmcxIC0gQU1MIGV4ZWN1dGlvbiAtIG9wY29kZXMgd2l0aCAxIGFyZ3VtZW50CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwOCwgSW50ZWwgQ29ycC4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKKyAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIGF0IG1pbmltdW0gYSBkaXNjbGFpbWVyCisgKiAgICBzdWJzdGFudGlhbGx5IHNpbWlsYXIgdG8gdGhlICJOTyBXQVJSQU5UWSIgZGlzY2xhaW1lciBiZWxvdworICogICAgKCJEaXNjbGFpbWVyIikgYW5kIGFueSByZWRpc3RyaWJ1dGlvbiBtdXN0IGJlIGNvbmRpdGlvbmVkIHVwb24KKyAqICAgIGluY2x1ZGluZyBhIHN1YnN0YW50aWFsbHkgc2ltaWxhciBEaXNjbGFpbWVyIHJlcXVpcmVtZW50IGZvciBmdXJ0aGVyCisgKiAgICBiaW5hcnkgcmVkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMKKyAqICAgIG9mIGFueSBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogTk8gV0FSUkFOVFkKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HCisgKiBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KKyAqLworCisjaW5jbHVkZSA8YWNwaS9hY3BpLmg+CisjaW5jbHVkZSAiYWNjb21tb24uaCIKKyNpbmNsdWRlICJhY3BhcnNlci5oIgorI2luY2x1ZGUgImFjZGlzcGF0LmgiCisjaW5jbHVkZSAiYWNpbnRlcnAuaCIKKyNpbmNsdWRlICJhbWxjb2RlLmgiCisjaW5jbHVkZSAiYWNuYW1lc3AuaCIKKworI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfRVhFQ1VURVIKK0FDUElfTU9EVUxFX05BTUUoImV4b3BhcmcxIikKKworLyohCisgKiBOYW1pbmcgY29udmVudGlvbiBmb3IgQU1MIGludGVycHJldGVyIGV4ZWN1dGlvbiByb3V0aW5lcy4KKyAqCisgKiBUaGUgcm91dGluZXMgdGhhdCBiZWdpbiBleGVjdXRpb24gb2YgQU1MIG9wY29kZXMgYXJlIG5hbWVkIHdpdGggYSBjb21tb24KKyAqIGNvbnZlbnRpb24gYmFzZWQgdXBvbiB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cywgdGhlIG51bWJlciBvZiB0YXJnZXQgb3BlcmFuZHMsCisgKiBhbmQgd2hldGhlciBvciBub3QgYSB2YWx1ZSBpcyByZXR1cm5lZDoKKyAqCisgKiAgICAgIEFjcGlFeE9wY29kZV94QV95VF96UgorICoKKyAqIFdoZXJlOgorICoKKyAqIHhBIC0gQVJHVU1FTlRTOiAgICBUaGUgbnVtYmVyIG9mIGFyZ3VtZW50cyAoaW5wdXQgb3BlcmFuZHMpIHRoYXQgYXJlCisgKiAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQgZm9yIHRoaXMgb3Bjb2RlIHR5cGUgKDAgdGhyb3VnaCA2IGFyZ3MpLgorICogeVQgLSBUQVJHRVRTOiAgICAgIFRoZSBudW1iZXIgb2YgdGFyZ2V0cyAob3V0cHV0IG9wZXJhbmRzKSB0aGF0IGFyZSByZXF1aXJlZAorICogICAgICAgICAgICAgICAgICAgIGZvciB0aGlzIG9wY29kZSB0eXBlICgwLCAxLCBvciAyIHRhcmdldHMpLgorICogelIgLSBSRVRVUk4gVkFMVUU6IEluZGljYXRlcyB3aGV0aGVyIHRoaXMgb3Bjb2RlIHR5cGUgcmV0dXJucyBhIHZhbHVlCisgKiAgICAgICAgICAgICAgICAgICAgYXMgdGhlIGZ1bmN0aW9uIHJldHVybiAoMCBvciAxKS4KKyAqCisgKiBUaGUgQWNwaUV4T3Bjb2RlKiBmdW5jdGlvbnMgYXJlIGNhbGxlZCB2aWEgdGhlIERpc3BhdGNoZXIgY29tcG9uZW50IHdpdGgKKyAqIGZ1bGx5IHJlc29sdmVkIG9wZXJhbmRzLgorISovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X29wY29kZV8wQV8wVF8xUgorICoKKyAqIFBBUkFNRVRFUlM6ICB3YWxrX3N0YXRlICAgICAgICAgIC0gQ3VycmVudCBzdGF0ZSAoY29udGFpbnMgQU1MIG9wY29kZSkKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IEV4ZWN1dGUgb3BlcmF0b3Igd2l0aCBubyBvcGVyYW5kcywgb25lIHJldHVybiB2YWx1ZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCithY3BpX3N0YXR1cyBhY3BpX2V4X29wY29kZV8wQV8wVF8xUihzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKQoreworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnJldHVybl9kZXNjID0gTlVMTDsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0VfU1RSKGV4X29wY29kZV8wQV8wVF8xUiwKKwkJCQlhY3BpX3BzX2dldF9vcGNvZGVfbmFtZSh3YWxrX3N0YXRlLT5vcGNvZGUpKTsKKworCS8qIEV4YW1pbmUgdGhlIEFNTCBvcGNvZGUgKi8KKworCXN3aXRjaCAod2Fsa19zdGF0ZS0+b3Bjb2RlKSB7CisJY2FzZSBBTUxfVElNRVJfT1A6CS8qICBUaW1lciAoKSAqLworCisJCS8qIENyZWF0ZSBhIHJldHVybiBvYmplY3Qgb2YgdHlwZSBJbnRlZ2VyICovCisKKwkJcmV0dXJuX2Rlc2MgPSBhY3BpX3V0X2NyZWF0ZV9pbnRlcm5hbF9vYmplY3QoQUNQSV9UWVBFX0lOVEVHRVIpOworCQlpZiAoIXJldHVybl9kZXNjKSB7CisJCQlzdGF0dXMgPSBBRV9OT19NRU1PUlk7CisJCQlnb3RvIGNsZWFudXA7CisJCX0KKwkJcmV0dXJuX2Rlc2MtPmludGVnZXIudmFsdWUgPSBhY3BpX29zX2dldF90aW1lcigpOworCQlicmVhazsKKworCWRlZmF1bHQ6CQkvKiAgVW5rbm93biBvcGNvZGUgICovCisKKwkJQUNQSV9FUlJPUigoQUVfSU5GTywgIlVua25vd24gQU1MIG9wY29kZSAlWCIsCisJCQkgICAgd2Fsa19zdGF0ZS0+b3Bjb2RlKSk7CisJCXN0YXR1cyA9IEFFX0FNTF9CQURfT1BDT0RFOworCQlicmVhazsKKwl9CisKKyAgICAgIGNsZWFudXA6CisKKwkvKiBEZWxldGUgcmV0dXJuIG9iamVjdCBvbiBlcnJvciAqLworCisJaWYgKChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgfHwgd2Fsa19zdGF0ZS0+cmVzdWx0X29iaikgeworCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UocmV0dXJuX2Rlc2MpOworCQl3YWxrX3N0YXRlLT5yZXN1bHRfb2JqID0gTlVMTDsKKwl9IGVsc2UgeworCQkvKiBTYXZlIHRoZSByZXR1cm4gdmFsdWUgKi8KKworCQl3YWxrX3N0YXRlLT5yZXN1bHRfb2JqID0gcmV0dXJuX2Rlc2M7CisJfQorCisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfZXhfb3Bjb2RlXzFBXzBUXzBSCisgKgorICogUEFSQU1FVEVSUzogIHdhbGtfc3RhdGUgICAgICAgICAgLSBDdXJyZW50IHN0YXRlIChjb250YWlucyBBTUwgb3Bjb2RlKQorICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogRXhlY3V0ZSBUeXBlIDEgbW9uYWRpYyBvcGVyYXRvciB3aXRoIG51bWVyaWMgb3BlcmFuZCBvbgorICogICAgICAgICAgICAgIG9iamVjdCBzdGFjaworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2FjcGlfc3RhdHVzIGFjcGlfZXhfb3Bjb2RlXzFBXzBUXzBSKHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUpCit7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKm9wZXJhbmQgPSAmd2Fsa19zdGF0ZS0+b3BlcmFuZHNbMF07CisJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1NUUihleF9vcGNvZGVfMUFfMFRfMFIsCisJCQkJYWNwaV9wc19nZXRfb3Bjb2RlX25hbWUod2Fsa19zdGF0ZS0+b3Bjb2RlKSk7CisKKwkvKiBFeGFtaW5lIHRoZSBBTUwgb3Bjb2RlICovCisKKwlzd2l0Y2ggKHdhbGtfc3RhdGUtPm9wY29kZSkgeworCWNhc2UgQU1MX1JFTEVBU0VfT1A6CS8qICBSZWxlYXNlIChtdXRleF9vYmplY3QpICovCisKKwkJc3RhdHVzID0gYWNwaV9leF9yZWxlYXNlX211dGV4KG9wZXJhbmRbMF0sIHdhbGtfc3RhdGUpOworCQlicmVhazsKKworCWNhc2UgQU1MX1JFU0VUX09QOgkvKiAgUmVzZXQgKGV2ZW50X29iamVjdCkgKi8KKworCQlzdGF0dXMgPSBhY3BpX2V4X3N5c3RlbV9yZXNldF9ldmVudChvcGVyYW5kWzBdKTsKKwkJYnJlYWs7CisKKwljYXNlIEFNTF9TSUdOQUxfT1A6CS8qICBTaWduYWwgKGV2ZW50X29iamVjdCkgKi8KKworCQlzdGF0dXMgPSBhY3BpX2V4X3N5c3RlbV9zaWduYWxfZXZlbnQob3BlcmFuZFswXSk7CisJCWJyZWFrOworCisJY2FzZSBBTUxfU0xFRVBfT1A6CS8qICBTbGVlcCAobXNlY190aW1lKSAqLworCisJCXN0YXR1cyA9IGFjcGlfZXhfc3lzdGVtX2RvX3N1c3BlbmQob3BlcmFuZFswXS0+aW50ZWdlci52YWx1ZSk7CisJCWJyZWFrOworCisJY2FzZSBBTUxfU1RBTExfT1A6CS8qICBTdGFsbCAodXNlY190aW1lKSAqLworCisJCXN0YXR1cyA9CisJCSAgICBhY3BpX2V4X3N5c3RlbV9kb19zdGFsbCgodTMyKSBvcGVyYW5kWzBdLT5pbnRlZ2VyLnZhbHVlKTsKKwkJYnJlYWs7CisKKwljYXNlIEFNTF9VTkxPQURfT1A6CS8qICBVbmxvYWQgKEhhbmRsZSkgKi8KKworCQlzdGF0dXMgPSBhY3BpX2V4X3VubG9hZF90YWJsZShvcGVyYW5kWzBdKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgkJLyogIFVua25vd24gb3Bjb2RlICAqLworCisJCUFDUElfRVJST1IoKEFFX0lORk8sICJVbmtub3duIEFNTCBvcGNvZGUgJVgiLAorCQkJICAgIHdhbGtfc3RhdGUtPm9wY29kZSkpOworCQlzdGF0dXMgPSBBRV9BTUxfQkFEX09QQ09ERTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfZXhfb3Bjb2RlXzFBXzFUXzBSCisgKgorICogUEFSQU1FVEVSUzogIHdhbGtfc3RhdGUgICAgICAgICAgLSBDdXJyZW50IHN0YXRlIChjb250YWlucyBBTUwgb3Bjb2RlKQorICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogRXhlY3V0ZSBvcGNvZGUgd2l0aCBvbmUgYXJndW1lbnQsIG9uZSB0YXJnZXQsIGFuZCBubworICogICAgICAgICAgICAgIHJldHVybiB2YWx1ZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCithY3BpX3N0YXR1cyBhY3BpX2V4X29wY29kZV8xQV8xVF8wUihzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKQoreworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKipvcGVyYW5kID0gJndhbGtfc3RhdGUtPm9wZXJhbmRzWzBdOworCisJQUNQSV9GVU5DVElPTl9UUkFDRV9TVFIoZXhfb3Bjb2RlXzFBXzFUXzBSLAorCQkJCWFjcGlfcHNfZ2V0X29wY29kZV9uYW1lKHdhbGtfc3RhdGUtPm9wY29kZSkpOworCisJLyogRXhhbWluZSB0aGUgQU1MIG9wY29kZSAqLworCisJc3dpdGNoICh3YWxrX3N0YXRlLT5vcGNvZGUpIHsKKwljYXNlIEFNTF9MT0FEX09QOgorCisJCXN0YXR1cyA9IGFjcGlfZXhfbG9hZF9vcChvcGVyYW5kWzBdLCBvcGVyYW5kWzFdLCB3YWxrX3N0YXRlKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgkJLyogVW5rbm93biBvcGNvZGUgKi8KKworCQlBQ1BJX0VSUk9SKChBRV9JTkZPLCAiVW5rbm93biBBTUwgb3Bjb2RlICVYIiwKKwkJCSAgICB3YWxrX3N0YXRlLT5vcGNvZGUpKTsKKwkJc3RhdHVzID0gQUVfQU1MX0JBRF9PUENPREU7CisJCWdvdG8gY2xlYW51cDsKKwl9CisKKyAgICAgIGNsZWFudXA6CisKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9leF9vcGNvZGVfMUFfMVRfMVIKKyAqCisgKiBQQVJBTUVURVJTOiAgd2Fsa19zdGF0ZSAgICAgICAgICAtIEN1cnJlbnQgc3RhdGUgKGNvbnRhaW5zIEFNTCBvcGNvZGUpCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBFeGVjdXRlIG9wY29kZSB3aXRoIG9uZSBhcmd1bWVudCwgb25lIHRhcmdldCwgYW5kIGEKKyAqICAgICAgICAgICAgICByZXR1cm4gdmFsdWUuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworYWNwaV9zdGF0dXMgYWNwaV9leF9vcGNvZGVfMUFfMVRfMVIoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSkKK3sKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICoqb3BlcmFuZCA9ICZ3YWxrX3N0YXRlLT5vcGVyYW5kc1swXTsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpyZXR1cm5fZGVzYyA9IE5VTEw7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqcmV0dXJuX2Rlc2MyID0gTlVMTDsKKwl1MzIgdGVtcDMyOworCXUzMiBpOworCWFjcGlfaW50ZWdlciBwb3dlcl9vZl90ZW47CisJYWNwaV9pbnRlZ2VyIGRpZ2l0OworCisJQUNQSV9GVU5DVElPTl9UUkFDRV9TVFIoZXhfb3Bjb2RlXzFBXzFUXzFSLAorCQkJCWFjcGlfcHNfZ2V0X29wY29kZV9uYW1lKHdhbGtfc3RhdGUtPm9wY29kZSkpOworCisJLyogRXhhbWluZSB0aGUgQU1MIG9wY29kZSAqLworCisJc3dpdGNoICh3YWxrX3N0YXRlLT5vcGNvZGUpIHsKKwljYXNlIEFNTF9CSVRfTk9UX09QOgorCWNhc2UgQU1MX0ZJTkRfU0VUX0xFRlRfQklUX09QOgorCWNhc2UgQU1MX0ZJTkRfU0VUX1JJR0hUX0JJVF9PUDoKKwljYXNlIEFNTF9GUk9NX0JDRF9PUDoKKwljYXNlIEFNTF9UT19CQ0RfT1A6CisJY2FzZSBBTUxfQ09ORF9SRUZfT0ZfT1A6CisKKwkJLyogQ3JlYXRlIGEgcmV0dXJuIG9iamVjdCBvZiB0eXBlIEludGVnZXIgZm9yIHRoZXNlIG9wY29kZXMgKi8KKworCQlyZXR1cm5fZGVzYyA9IGFjcGlfdXRfY3JlYXRlX2ludGVybmFsX29iamVjdChBQ1BJX1RZUEVfSU5URUdFUik7CisJCWlmICghcmV0dXJuX2Rlc2MpIHsKKwkJCXN0YXR1cyA9IEFFX05PX01FTU9SWTsKKwkJCWdvdG8gY2xlYW51cDsKKwkJfQorCisJCXN3aXRjaCAod2Fsa19zdGF0ZS0+b3Bjb2RlKSB7CisJCWNhc2UgQU1MX0JJVF9OT1RfT1A6CS8qIE5vdCAoT3BlcmFuZCwgUmVzdWx0KSAgKi8KKworCQkJcmV0dXJuX2Rlc2MtPmludGVnZXIudmFsdWUgPSB+b3BlcmFuZFswXS0+aW50ZWdlci52YWx1ZTsKKwkJCWJyZWFrOworCisJCWNhc2UgQU1MX0ZJTkRfU0VUX0xFRlRfQklUX09QOgkvKiBmaW5kX3NldF9sZWZ0X2JpdCAoT3BlcmFuZCwgUmVzdWx0KSAqLworCisJCQlyZXR1cm5fZGVzYy0+aW50ZWdlci52YWx1ZSA9IG9wZXJhbmRbMF0tPmludGVnZXIudmFsdWU7CisKKwkJCS8qCisJCQkgKiBBY3BpIHNwZWNpZmljYXRpb24gZGVzY3JpYmVzIEludGVnZXIgdHlwZSBhcyBhIGxpdHRsZQorCQkJICogZW5kaWFuIHVuc2lnbmVkIHZhbHVlLCBzbyB0aGlzIGJvdW5kYXJ5IGNvbmRpdGlvbiBpcyB2YWxpZC4KKwkJCSAqLworCQkJZm9yICh0ZW1wMzIgPSAwOyByZXR1cm5fZGVzYy0+aW50ZWdlci52YWx1ZSAmJgorCQkJICAgICB0ZW1wMzIgPCBBQ1BJX0lOVEVHRVJfQklUX1NJWkU7ICsrdGVtcDMyKSB7CisJCQkJcmV0dXJuX2Rlc2MtPmludGVnZXIudmFsdWUgPj49IDE7CisJCQl9CisKKwkJCXJldHVybl9kZXNjLT5pbnRlZ2VyLnZhbHVlID0gdGVtcDMyOworCQkJYnJlYWs7CisKKwkJY2FzZSBBTUxfRklORF9TRVRfUklHSFRfQklUX09QOgkvKiBmaW5kX3NldF9yaWdodF9iaXQgKE9wZXJhbmQsIFJlc3VsdCkgKi8KKworCQkJcmV0dXJuX2Rlc2MtPmludGVnZXIudmFsdWUgPSBvcGVyYW5kWzBdLT5pbnRlZ2VyLnZhbHVlOworCisJCQkvKgorCQkJICogVGhlIEFjcGkgc3BlY2lmaWNhdGlvbiBkZXNjcmliZXMgSW50ZWdlciB0eXBlIGFzIGEgbGl0dGxlCisJCQkgKiBlbmRpYW4gdW5zaWduZWQgdmFsdWUsIHNvIHRoaXMgYm91bmRhcnkgY29uZGl0aW9uIGlzIHZhbGlkLgorCQkJICovCisJCQlmb3IgKHRlbXAzMiA9IDA7IHJldHVybl9kZXNjLT5pbnRlZ2VyLnZhbHVlICYmCisJCQkgICAgIHRlbXAzMiA8IEFDUElfSU5URUdFUl9CSVRfU0laRTsgKyt0ZW1wMzIpIHsKKwkJCQlyZXR1cm5fZGVzYy0+aW50ZWdlci52YWx1ZSA8PD0gMTsKKwkJCX0KKworCQkJLyogU2luY2UgdGhlIGJpdCBwb3NpdGlvbiBpcyBvbmUtYmFzZWQsIHN1YnRyYWN0IGZyb20gMzMgKDY1KSAqLworCisJCQlyZXR1cm5fZGVzYy0+aW50ZWdlci52YWx1ZSA9CisJCQkgICAgdGVtcDMyID09CisJCQkgICAgMCA/IDAgOiAoQUNQSV9JTlRFR0VSX0JJVF9TSVpFICsgMSkgLSB0ZW1wMzI7CisJCQlicmVhazsKKworCQljYXNlIEFNTF9GUk9NX0JDRF9PUDoJLyogZnJvbV9iY2QgKEJDRFZhbHVlLCBSZXN1bHQpICovCisKKwkJCS8qCisJCQkgKiBUaGUgNjQtYml0IEFDUEkgaW50ZWdlciBjYW4gaG9sZCAxNiA0LWJpdCBCQ0QgY2hhcmFjdGVycworCQkJICogKGlmIHRhYmxlIGlzIDMyLWJpdCwgaW50ZWdlciBjYW4gaG9sZCA4IEJDRCBjaGFyYWN0ZXJzKQorCQkJICogQ29udmVydCBlYWNoIDQtYml0IEJDRCB2YWx1ZQorCQkJICovCisJCQlwb3dlcl9vZl90ZW4gPSAxOworCQkJcmV0dXJuX2Rlc2MtPmludGVnZXIudmFsdWUgPSAwOworCQkJZGlnaXQgPSBvcGVyYW5kWzBdLT5pbnRlZ2VyLnZhbHVlOworCisJCQkvKiBDb252ZXJ0IGVhY2ggQkNEIGRpZ2l0IChlYWNoIGlzIG9uZSBueWJibGUgd2lkZSkgKi8KKworCQkJZm9yIChpID0gMDsKKwkJCSAgICAgKGkgPCBhY3BpX2dibF9pbnRlZ2VyX255YmJsZV93aWR0aCkgJiYgKGRpZ2l0ID4gMCk7CisJCQkgICAgIGkrKykgeworCisJCQkJLyogR2V0IHRoZSBsZWFzdCBzaWduaWZpY2FudCA0LWJpdCBCQ0QgZGlnaXQgKi8KKworCQkJCXRlbXAzMiA9ICgodTMyKSBkaWdpdCkgJiAweEY7CisKKwkJCQkvKiBDaGVjayB0aGUgcmFuZ2Ugb2YgdGhlIGRpZ2l0ICovCisKKwkJCQlpZiAodGVtcDMyID4gOSkgeworCQkJCQlBQ1BJX0VSUk9SKChBRV9JTkZPLAorCQkJCQkJICAgICJCQ0QgZGlnaXQgdG9vIGxhcmdlIChub3QgZGVjaW1hbCk6IDB4JVgiLAorCQkJCQkJICAgIHRlbXAzMikpOworCisJCQkJCXN0YXR1cyA9IEFFX0FNTF9OVU1FUklDX09WRVJGTE9XOworCQkJCQlnb3RvIGNsZWFudXA7CisJCQkJfQorCisJCQkJLyogU3VtIHRoZSBkaWdpdCBpbnRvIHRoZSByZXN1bHQgd2l0aCB0aGUgY3VycmVudCBwb3dlciBvZiAxMCAqLworCisJCQkJcmV0dXJuX2Rlc2MtPmludGVnZXIudmFsdWUgKz0KKwkJCQkgICAgKCgoYWNwaV9pbnRlZ2VyKSB0ZW1wMzIpICogcG93ZXJfb2ZfdGVuKTsKKworCQkJCS8qIFNoaWZ0IHRvIG5leHQgQkNEIGRpZ2l0ICovCisKKwkJCQlkaWdpdCA+Pj0gNDsKKworCQkJCS8qIE5leHQgcG93ZXIgb2YgMTAgKi8KKworCQkJCXBvd2VyX29mX3RlbiAqPSAxMDsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgQU1MX1RPX0JDRF9PUDoJLyogdG9fYmNkIChPcGVyYW5kLCBSZXN1bHQpICovCisKKwkJCXJldHVybl9kZXNjLT5pbnRlZ2VyLnZhbHVlID0gMDsKKwkJCWRpZ2l0ID0gb3BlcmFuZFswXS0+aW50ZWdlci52YWx1ZTsKKworCQkJLyogRWFjaCBCQ0QgZGlnaXQgaXMgb25lIG55YmJsZSB3aWRlICovCisKKwkJCWZvciAoaSA9IDA7CisJCQkgICAgIChpIDwgYWNwaV9nYmxfaW50ZWdlcl9ueWJibGVfd2lkdGgpICYmIChkaWdpdCA+IDApOworCQkJICAgICBpKyspIHsKKwkJCQkodm9pZClhY3BpX3V0X3Nob3J0X2RpdmlkZShkaWdpdCwgMTAsICZkaWdpdCwKKwkJCQkJCQkgICAmdGVtcDMyKTsKKworCQkJCS8qCisJCQkJICogSW5zZXJ0IHRoZSBCQ0QgZGlnaXQgdGhhdCByZXNpZGVzIGluIHRoZQorCQkJCSAqIHJlbWFpbmRlciBmcm9tIGFib3ZlCisJCQkJICovCisJCQkJcmV0dXJuX2Rlc2MtPmludGVnZXIudmFsdWUgfD0KKwkJCQkgICAgKCgoYWNwaV9pbnRlZ2VyKSB0ZW1wMzIpIDw8IEFDUElfTVVMXzQoaSkpOworCQkJfQorCisJCQkvKiBPdmVyZmxvdyBpZiB0aGVyZSBpcyBhbnkgZGF0YSBsZWZ0IGluIERpZ2l0ICovCisKKwkJCWlmIChkaWdpdCA+IDApIHsKKwkJCQlBQ1BJX0VSUk9SKChBRV9JTkZPLAorCQkJCQkgICAgIkludGVnZXIgdG9vIGxhcmdlIHRvIGNvbnZlcnQgdG8gQkNEOiAlOC44WCU4LjhYIiwKKwkJCQkJICAgIEFDUElfRk9STUFUX1VJTlQ2NChvcGVyYW5kWzBdLT4KKwkJCQkJCQkgICAgICAgaW50ZWdlci52YWx1ZSkpKTsKKwkJCQlzdGF0dXMgPSBBRV9BTUxfTlVNRVJJQ19PVkVSRkxPVzsKKwkJCQlnb3RvIGNsZWFudXA7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIEFNTF9DT05EX1JFRl9PRl9PUDoJLyogY29uZF9yZWZfb2YgKHNvdXJjZV9vYmplY3QsIFJlc3VsdCkgKi8KKworCQkJLyoKKwkJCSAqIFRoaXMgb3AgaXMgYSBsaXR0bGUgc3RyYW5nZSBiZWNhdXNlIHRoZSBpbnRlcm5hbCByZXR1cm4gdmFsdWUgaXMKKwkJCSAqIGRpZmZlcmVudCB0aGFuIHRoZSByZXR1cm4gdmFsdWUgc3RvcmVkIGluIHRoZSByZXN1bHQgZGVzY3JpcHRvcgorCQkJICogKFRoZXJlIGFyZSByZWFsbHkgdHdvIHJldHVybiB2YWx1ZXMpCisJCQkgKi8KKwkJCWlmICgoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKilvcGVyYW5kWzBdID09CisJCQkgICAgYWNwaV9nYmxfcm9vdF9ub2RlKSB7CisJCQkJLyoKKwkJCQkgKiBUaGlzIG1lYW5zIHRoYXQgdGhlIG9iamVjdCBkb2VzIG5vdCBleGlzdCBpbiB0aGUgbmFtZXNwYWNlLAorCQkJCSAqIHJldHVybiBGQUxTRQorCQkJCSAqLworCQkJCXJldHVybl9kZXNjLT5pbnRlZ2VyLnZhbHVlID0gMDsKKwkJCQlnb3RvIGNsZWFudXA7CisJCQl9CisKKwkJCS8qIEdldCB0aGUgb2JqZWN0IHJlZmVyZW5jZSwgc3RvcmUgaXQsIGFuZCByZW1vdmUgb3VyIHJlZmVyZW5jZSAqLworCisJCQlzdGF0dXMgPSBhY3BpX2V4X2dldF9vYmplY3RfcmVmZXJlbmNlKG9wZXJhbmRbMF0sCisJCQkJCQkJICAgICAgJnJldHVybl9kZXNjMiwKKwkJCQkJCQkgICAgICB3YWxrX3N0YXRlKTsKKwkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJCWdvdG8gY2xlYW51cDsKKwkJCX0KKworCQkJc3RhdHVzID0KKwkJCSAgICBhY3BpX2V4X3N0b3JlKHJldHVybl9kZXNjMiwgb3BlcmFuZFsxXSwgd2Fsa19zdGF0ZSk7CisJCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UocmV0dXJuX2Rlc2MyKTsKKworCQkJLyogVGhlIG9iamVjdCBleGlzdHMgaW4gdGhlIG5hbWVzcGFjZSwgcmV0dXJuIFRSVUUgKi8KKworCQkJcmV0dXJuX2Rlc2MtPmludGVnZXIudmFsdWUgPSBBQ1BJX0lOVEVHRVJfTUFYOworCQkJZ290byBjbGVhbnVwOworCisJCWRlZmF1bHQ6CisJCQkvKiBObyBvdGhlciBvcGNvZGVzIGdldCBoZXJlICovCisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKworCWNhc2UgQU1MX1NUT1JFX09QOgkvKiBTdG9yZSAoU291cmNlLCBUYXJnZXQpICovCisKKwkJLyoKKwkJICogQSBzdG9yZSBvcGVyYW5kIGlzIHR5cGljYWxseSBhIG51bWJlciwgc3RyaW5nLCBidWZmZXIgb3IgbHZhbHVlCisJCSAqIEJlIGNhcmVmdWwgYWJvdXQgZGVsZXRpbmcgdGhlIHNvdXJjZSBvYmplY3QsCisJCSAqIHNpbmNlIHRoZSBvYmplY3QgaXRzZWxmIG1heSBoYXZlIGJlZW4gc3RvcmVkLgorCQkgKi8KKwkJc3RhdHVzID0gYWNwaV9leF9zdG9yZShvcGVyYW5kWzBdLCBvcGVyYW5kWzFdLCB3YWxrX3N0YXRlKTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKKwkJfQorCisJCS8qIEl0IGlzIHBvc3NpYmxlIHRoYXQgdGhlIFN0b3JlIGFscmVhZHkgcHJvZHVjZWQgYSByZXR1cm4gb2JqZWN0ICovCisKKwkJaWYgKCF3YWxrX3N0YXRlLT5yZXN1bHRfb2JqKSB7CisJCQkvKgorCQkJICogTm9ybWFsbHksIHdlIHdvdWxkIHJlbW92ZSBhIHJlZmVyZW5jZSBvbiB0aGUgT3BlcmFuZFswXQorCQkJICogcGFyYW1ldGVyOyBCdXQgc2luY2UgaXQgaXMgYmVpbmcgdXNlZCBhcyB0aGUgaW50ZXJuYWwgcmV0dXJuCisJCQkgKiBvYmplY3QgKG1lYW5pbmcgd2Ugd291bGQgbm9ybWFsbHkgaW5jcmVtZW50IGl0KSwgdGhlIHR3bworCQkJICogY2FuY2VsIG91dCwgYW5kIHdlIHNpbXBseSBkb24ndCBkbyBhbnl0aGluZy4KKwkJCSAqLworCQkJd2Fsa19zdGF0ZS0+cmVzdWx0X29iaiA9IG9wZXJhbmRbMF07CisJCQl3YWxrX3N0YXRlLT5vcGVyYW5kc1swXSA9IE5VTEw7CS8qIFByZXZlbnQgZGVsZXRpb24gKi8KKwkJfQorCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKKworCQkvKgorCQkgKiBBQ1BJIDIuMCBPcGNvZGVzCisJCSAqLworCWNhc2UgQU1MX0NPUFlfT1A6CS8qIENvcHkgKFNvdXJjZSwgVGFyZ2V0KSAqLworCisJCXN0YXR1cyA9CisJCSAgICBhY3BpX3V0X2NvcHlfaW9iamVjdF90b19pb2JqZWN0KG9wZXJhbmRbMF0sICZyZXR1cm5fZGVzYywKKwkJCQkJCSAgICB3YWxrX3N0YXRlKTsKKwkJYnJlYWs7CisKKwljYXNlIEFNTF9UT19ERUNTVFJJTkdfT1A6CS8qIHRvX2RlY2ltYWxfc3RyaW5nIChEYXRhLCBSZXN1bHQpICovCisKKwkJc3RhdHVzID0gYWNwaV9leF9jb252ZXJ0X3RvX3N0cmluZyhvcGVyYW5kWzBdLCAmcmV0dXJuX2Rlc2MsCisJCQkJCQkgICBBQ1BJX0VYUExJQ0lUX0NPTlZFUlRfREVDSU1BTCk7CisJCWlmIChyZXR1cm5fZGVzYyA9PSBvcGVyYW5kWzBdKSB7CisKKwkJCS8qIE5vIGNvbnZlcnNpb24gcGVyZm9ybWVkLCBhZGQgcmVmIHRvIGhhbmRsZSByZXR1cm4gdmFsdWUgKi8KKwkJCWFjcGlfdXRfYWRkX3JlZmVyZW5jZShyZXR1cm5fZGVzYyk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIEFNTF9UT19IRVhTVFJJTkdfT1A6CS8qIHRvX2hleF9zdHJpbmcgKERhdGEsIFJlc3VsdCkgKi8KKworCQlzdGF0dXMgPSBhY3BpX2V4X2NvbnZlcnRfdG9fc3RyaW5nKG9wZXJhbmRbMF0sICZyZXR1cm5fZGVzYywKKwkJCQkJCSAgIEFDUElfRVhQTElDSVRfQ09OVkVSVF9IRVgpOworCQlpZiAocmV0dXJuX2Rlc2MgPT0gb3BlcmFuZFswXSkgeworCisJCQkvKiBObyBjb252ZXJzaW9uIHBlcmZvcm1lZCwgYWRkIHJlZiB0byBoYW5kbGUgcmV0dXJuIHZhbHVlICovCisJCQlhY3BpX3V0X2FkZF9yZWZlcmVuY2UocmV0dXJuX2Rlc2MpOworCQl9CisJCWJyZWFrOworCisJY2FzZSBBTUxfVE9fQlVGRkVSX09QOgkvKiB0b19idWZmZXIgKERhdGEsIFJlc3VsdCkgKi8KKworCQlzdGF0dXMgPSBhY3BpX2V4X2NvbnZlcnRfdG9fYnVmZmVyKG9wZXJhbmRbMF0sICZyZXR1cm5fZGVzYyk7CisJCWlmIChyZXR1cm5fZGVzYyA9PSBvcGVyYW5kWzBdKSB7CisKKwkJCS8qIE5vIGNvbnZlcnNpb24gcGVyZm9ybWVkLCBhZGQgcmVmIHRvIGhhbmRsZSByZXR1cm4gdmFsdWUgKi8KKwkJCWFjcGlfdXRfYWRkX3JlZmVyZW5jZShyZXR1cm5fZGVzYyk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIEFNTF9UT19JTlRFR0VSX09QOgkvKiB0b19pbnRlZ2VyIChEYXRhLCBSZXN1bHQpICovCisKKwkJc3RhdHVzID0gYWNwaV9leF9jb252ZXJ0X3RvX2ludGVnZXIob3BlcmFuZFswXSwgJnJldHVybl9kZXNjLAorCQkJCQkJICAgIEFDUElfQU5ZX0JBU0UpOworCQlpZiAocmV0dXJuX2Rlc2MgPT0gb3BlcmFuZFswXSkgeworCisJCQkvKiBObyBjb252ZXJzaW9uIHBlcmZvcm1lZCwgYWRkIHJlZiB0byBoYW5kbGUgcmV0dXJuIHZhbHVlICovCisJCQlhY3BpX3V0X2FkZF9yZWZlcmVuY2UocmV0dXJuX2Rlc2MpOworCQl9CisJCWJyZWFrOworCisJY2FzZSBBTUxfU0hJRlRfTEVGVF9CSVRfT1A6CS8qIHNoaWZ0X2xlZnRfYml0IChTb3VyY2UsIGJpdF9udW0pICovCisJY2FzZSBBTUxfU0hJRlRfUklHSFRfQklUX09QOgkvKiBzaGlmdF9yaWdodF9iaXQgKFNvdXJjZSwgYml0X251bSkgKi8KKworCQkvKiBUaGVzZSBhcmUgdHdvIG9ic29sZXRlIG9wY29kZXMgKi8KKworCQlBQ1BJX0VSUk9SKChBRV9JTkZPLAorCQkJICAgICIlcyBpcyBvYnNvbGV0ZSBhbmQgbm90IGltcGxlbWVudGVkIiwKKwkJCSAgICBhY3BpX3BzX2dldF9vcGNvZGVfbmFtZSh3YWxrX3N0YXRlLT5vcGNvZGUpKSk7CisJCXN0YXR1cyA9IEFFX1NVUFBPUlQ7CisJCWdvdG8gY2xlYW51cDsKKworCWRlZmF1bHQ6CQkvKiBVbmtub3duIG9wY29kZSAqLworCisJCUFDUElfRVJST1IoKEFFX0lORk8sICJVbmtub3duIEFNTCBvcGNvZGUgJVgiLAorCQkJICAgIHdhbGtfc3RhdGUtPm9wY29kZSkpOworCQlzdGF0dXMgPSBBRV9BTUxfQkFEX09QQ09ERTsKKwkJZ290byBjbGVhbnVwOworCX0KKworCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkgeworCisJCS8qIFN0b3JlIHRoZSByZXR1cm4gdmFsdWUgY29tcHV0ZWQgYWJvdmUgaW50byB0aGUgdGFyZ2V0IG9iamVjdCAqLworCisJCXN0YXR1cyA9IGFjcGlfZXhfc3RvcmUocmV0dXJuX2Rlc2MsIG9wZXJhbmRbMV0sIHdhbGtfc3RhdGUpOworCX0KKworICAgICAgY2xlYW51cDoKKworCS8qIERlbGV0ZSByZXR1cm4gb2JqZWN0IG9uIGVycm9yICovCisKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKHJldHVybl9kZXNjKTsKKwl9CisKKwkvKiBTYXZlIHJldHVybiBvYmplY3Qgb24gc3VjY2VzcyAqLworCisJZWxzZSBpZiAoIXdhbGtfc3RhdGUtPnJlc3VsdF9vYmopIHsKKwkJd2Fsa19zdGF0ZS0+cmVzdWx0X29iaiA9IHJldHVybl9kZXNjOworCX0KKworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X29wY29kZV8xQV8wVF8xUgorICoKKyAqIFBBUkFNRVRFUlM6ICB3YWxrX3N0YXRlICAgICAgICAgIC0gQ3VycmVudCBzdGF0ZSAoY29udGFpbnMgQU1MIG9wY29kZSkKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IEV4ZWN1dGUgb3Bjb2RlIHdpdGggb25lIGFyZ3VtZW50LCBubyB0YXJnZXQsIGFuZCBhIHJldHVybiB2YWx1ZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2FjcGlfc3RhdHVzIGFjcGlfZXhfb3Bjb2RlXzFBXzBUXzFSKHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUpCit7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKm9wZXJhbmQgPSAmd2Fsa19zdGF0ZS0+b3BlcmFuZHNbMF07CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqdGVtcF9kZXNjOworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnJldHVybl9kZXNjID0gTlVMTDsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKKwl1MzIgdHlwZTsKKwlhY3BpX2ludGVnZXIgdmFsdWU7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1NUUihleF9vcGNvZGVfMUFfMFRfMVIsCisJCQkJYWNwaV9wc19nZXRfb3Bjb2RlX25hbWUod2Fsa19zdGF0ZS0+b3Bjb2RlKSk7CisKKwkvKiBFeGFtaW5lIHRoZSBBTUwgb3Bjb2RlICovCisKKwlzd2l0Y2ggKHdhbGtfc3RhdGUtPm9wY29kZSkgeworCWNhc2UgQU1MX0xOT1RfT1A6CS8qIExOb3QgKE9wZXJhbmQpICovCisKKwkJcmV0dXJuX2Rlc2MgPSBhY3BpX3V0X2NyZWF0ZV9pbnRlcm5hbF9vYmplY3QoQUNQSV9UWVBFX0lOVEVHRVIpOworCQlpZiAoIXJldHVybl9kZXNjKSB7CisJCQlzdGF0dXMgPSBBRV9OT19NRU1PUlk7CisJCQlnb3RvIGNsZWFudXA7CisJCX0KKworCQkvKgorCQkgKiBTZXQgcmVzdWx0IHRvIE9ORVMgKFRSVUUpIGlmIFZhbHVlID09IDAuICBOb3RlOgorCQkgKiByZXR1cm5fZGVzYy0+SW50ZWdlci5WYWx1ZSBpcyBpbml0aWFsbHkgPT0gMCAoRkFMU0UpIGZyb20gYWJvdmUuCisJCSAqLworCQlpZiAoIW9wZXJhbmRbMF0tPmludGVnZXIudmFsdWUpIHsKKwkJCXJldHVybl9kZXNjLT5pbnRlZ2VyLnZhbHVlID0gQUNQSV9JTlRFR0VSX01BWDsKKwkJfQorCQlicmVhazsKKworCWNhc2UgQU1MX0RFQ1JFTUVOVF9PUDoJLyogRGVjcmVtZW50IChPcGVyYW5kKSAgKi8KKwljYXNlIEFNTF9JTkNSRU1FTlRfT1A6CS8qIEluY3JlbWVudCAoT3BlcmFuZCkgICovCisKKwkJLyoKKwkJICogQ3JlYXRlIGEgbmV3IGludGVnZXIuICBDYW4ndCBqdXN0IGdldCB0aGUgYmFzZSBpbnRlZ2VyIGFuZAorCQkgKiBpbmNyZW1lbnQgaXQgYmVjYXVzZSBpdCBtYXkgYmUgYW4gQXJnIG9yIEZpZWxkLgorCQkgKi8KKwkJcmV0dXJuX2Rlc2MgPSBhY3BpX3V0X2NyZWF0ZV9pbnRlcm5hbF9vYmplY3QoQUNQSV9UWVBFX0lOVEVHRVIpOworCQlpZiAoIXJldHVybl9kZXNjKSB7CisJCQlzdGF0dXMgPSBBRV9OT19NRU1PUlk7CisJCQlnb3RvIGNsZWFudXA7CisJCX0KKworCQkvKgorCQkgKiBTaW5jZSB3ZSBhcmUgZXhwZWN0aW5nIGEgUmVmZXJlbmNlIG9wZXJhbmQsIGl0IGNhbiBiZSBlaXRoZXIgYQorCQkgKiBOUyBOb2RlIG9yIGFuIGludGVybmFsIG9iamVjdC4KKwkJICovCisJCXRlbXBfZGVzYyA9IG9wZXJhbmRbMF07CisJCWlmIChBQ1BJX0dFVF9ERVNDUklQVE9SX1RZUEUodGVtcF9kZXNjKSA9PQorCQkgICAgQUNQSV9ERVNDX1RZUEVfT1BFUkFORCkgeworCisJCQkvKiBJbnRlcm5hbCByZWZlcmVuY2Ugb2JqZWN0IC0gcHJldmVudCBkZWxldGlvbiAqLworCisJCQlhY3BpX3V0X2FkZF9yZWZlcmVuY2UodGVtcF9kZXNjKTsKKwkJfQorCisJCS8qCisJCSAqIENvbnZlcnQgdGhlIFJlZmVyZW5jZSBvcGVyYW5kIHRvIGFuIEludGVnZXIgKFRoaXMgcmVtb3ZlcyBhCisJCSAqIHJlZmVyZW5jZSBvbiB0aGUgT3BlcmFuZFswXSBvYmplY3QpCisJCSAqCisJCSAqIE5PVEU6ICBXZSB1c2UgTE5PVF9PUCBoZXJlIGluIG9yZGVyIHRvIGZvcmNlIHJlc29sdXRpb24gb2YgdGhlCisJCSAqIHJlZmVyZW5jZSBvcGVyYW5kIHRvIGFuIGFjdHVhbCBpbnRlZ2VyLgorCQkgKi8KKwkJc3RhdHVzID0KKwkJICAgIGFjcGlfZXhfcmVzb2x2ZV9vcGVyYW5kcyhBTUxfTE5PVF9PUCwgJnRlbXBfZGVzYywKKwkJCQkJICAgICB3YWxrX3N0YXRlKTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQlBQ1BJX0VYQ0VQVElPTigoQUVfSU5GTywgc3RhdHVzLAorCQkJCQkiV2hpbGUgcmVzb2x2aW5nIG9wZXJhbmRzIGZvciBbJXNdIiwKKwkJCQkJYWNwaV9wc19nZXRfb3Bjb2RlX25hbWUod2Fsa19zdGF0ZS0+CisJCQkJCQkJCW9wY29kZSkpKTsKKworCQkJZ290byBjbGVhbnVwOworCQl9CisKKwkJLyoKKwkJICogdGVtcF9kZXNjIGlzIG5vdyBndWFyYW50ZWVkIHRvIGJlIGFuIEludGVnZXIgb2JqZWN0IC0tCisJCSAqIFBlcmZvcm0gdGhlIGFjdHVhbCBpbmNyZW1lbnQgb3IgZGVjcmVtZW50CisJCSAqLworCQlpZiAod2Fsa19zdGF0ZS0+b3Bjb2RlID09IEFNTF9JTkNSRU1FTlRfT1ApIHsKKwkJCXJldHVybl9kZXNjLT5pbnRlZ2VyLnZhbHVlID0KKwkJCSAgICB0ZW1wX2Rlc2MtPmludGVnZXIudmFsdWUgKyAxOworCQl9IGVsc2UgeworCQkJcmV0dXJuX2Rlc2MtPmludGVnZXIudmFsdWUgPQorCQkJICAgIHRlbXBfZGVzYy0+aW50ZWdlci52YWx1ZSAtIDE7CisJCX0KKworCQkvKiBGaW5pc2hlZCB3aXRoIHRoaXMgSW50ZWdlciBvYmplY3QgKi8KKworCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UodGVtcF9kZXNjKTsKKworCQkvKgorCQkgKiBTdG9yZSB0aGUgcmVzdWx0IGJhY2sgKGluZGlyZWN0bHkpIHRocm91Z2ggdGhlIG9yaWdpbmFsCisJCSAqIFJlZmVyZW5jZSBvYmplY3QKKwkJICovCisJCXN0YXR1cyA9IGFjcGlfZXhfc3RvcmUocmV0dXJuX2Rlc2MsIG9wZXJhbmRbMF0sIHdhbGtfc3RhdGUpOworCQlicmVhazsKKworCWNhc2UgQU1MX1RZUEVfT1A6CS8qIG9iamVjdF90eXBlIChzb3VyY2Vfb2JqZWN0KSAqLworCisJCS8qCisJCSAqIE5vdGU6IFRoZSBvcGVyYW5kIGlzIG5vdCByZXNvbHZlZCBhdCB0aGlzIHBvaW50IGJlY2F1c2Ugd2Ugd2FudCB0bworCQkgKiBnZXQgdGhlIGFzc29jaWF0ZWQgb2JqZWN0LCBub3QgaXRzIHZhbHVlLiAgRm9yIGV4YW1wbGUsIHdlIGRvbid0CisJCSAqIHdhbnQgdG8gcmVzb2x2ZSBhIGZpZWxkX3VuaXQgdG8gaXRzIHZhbHVlLCB3ZSB3YW50IHRoZSBhY3R1YWwKKwkJICogZmllbGRfdW5pdCBvYmplY3QuCisJCSAqLworCisJCS8qIEdldCB0aGUgdHlwZSBvZiB0aGUgYmFzZSBvYmplY3QgKi8KKworCQlzdGF0dXMgPQorCQkgICAgYWNwaV9leF9yZXNvbHZlX211bHRpcGxlKHdhbGtfc3RhdGUsIG9wZXJhbmRbMF0sICZ0eXBlLAorCQkJCQkgICAgIE5VTEwpOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCWdvdG8gY2xlYW51cDsKKwkJfQorCisJCS8qIEFsbG9jYXRlIGEgZGVzY3JpcHRvciB0byBob2xkIHRoZSB0eXBlLiAqLworCisJCXJldHVybl9kZXNjID0gYWNwaV91dF9jcmVhdGVfaW50ZXJuYWxfb2JqZWN0KEFDUElfVFlQRV9JTlRFR0VSKTsKKwkJaWYgKCFyZXR1cm5fZGVzYykgeworCQkJc3RhdHVzID0gQUVfTk9fTUVNT1JZOworCQkJZ290byBjbGVhbnVwOworCQl9CisKKwkJcmV0dXJuX2Rlc2MtPmludGVnZXIudmFsdWUgPSB0eXBlOworCQlicmVhazsKKworCWNhc2UgQU1MX1NJWkVfT0ZfT1A6CS8qIHNpemVfb2YgKHNvdXJjZV9vYmplY3QpICovCisKKwkJLyoKKwkJICogTm90ZTogVGhlIG9wZXJhbmQgaXMgbm90IHJlc29sdmVkIGF0IHRoaXMgcG9pbnQgYmVjYXVzZSB3ZSB3YW50IHRvCisJCSAqIGdldCB0aGUgYXNzb2NpYXRlZCBvYmplY3QsIG5vdCBpdHMgdmFsdWUuCisJCSAqLworCisJCS8qIEdldCB0aGUgYmFzZSBvYmplY3QgKi8KKworCQlzdGF0dXMgPSBhY3BpX2V4X3Jlc29sdmVfbXVsdGlwbGUod2Fsa19zdGF0ZSwKKwkJCQkJCSAgb3BlcmFuZFswXSwgJnR5cGUsCisJCQkJCQkgICZ0ZW1wX2Rlc2MpOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCWdvdG8gY2xlYW51cDsKKwkJfQorCisJCS8qCisJCSAqIFRoZSB0eXBlIG9mIHRoZSBiYXNlIG9iamVjdCBtdXN0IGJlIGludGVnZXIsIGJ1ZmZlciwgc3RyaW5nLCBvcgorCQkgKiBwYWNrYWdlLiAgQWxsIG90aGVycyBhcmUgbm90IHN1cHBvcnRlZC4KKwkJICoKKwkJICogTk9URTogSW50ZWdlciBpcyBub3Qgc3BlY2lmaWNhbGx5IHN1cHBvcnRlZCBieSB0aGUgQUNQSSBzcGVjLAorCQkgKiBidXQgaXMgc3VwcG9ydGVkIGltcGxpY2l0bHkgdmlhIGltcGxpY2l0IG9wZXJhbmQgY29udmVyc2lvbi4KKwkJICogcmF0aGVyIHRoYW4gYm90aGVyIHdpdGggY29udmVyc2lvbiwgd2UganVzdCB1c2UgdGhlIGJ5dGUgd2lkdGgKKwkJICogZ2xvYmFsICg0IG9yIDggYnl0ZXMpLgorCQkgKi8KKwkJc3dpdGNoICh0eXBlKSB7CisJCWNhc2UgQUNQSV9UWVBFX0lOVEVHRVI6CisJCQl2YWx1ZSA9IGFjcGlfZ2JsX2ludGVnZXJfYnl0ZV93aWR0aDsKKwkJCWJyZWFrOworCisJCWNhc2UgQUNQSV9UWVBFX1NUUklORzoKKwkJCXZhbHVlID0gdGVtcF9kZXNjLT5zdHJpbmcubGVuZ3RoOworCQkJYnJlYWs7CisKKwkJY2FzZSBBQ1BJX1RZUEVfQlVGRkVSOgorCisJCQkvKiBCdWZmZXIgYXJndW1lbnRzIG1heSBub3QgYmUgZXZhbHVhdGVkIGF0IHRoaXMgcG9pbnQgKi8KKworCQkJc3RhdHVzID0gYWNwaV9kc19nZXRfYnVmZmVyX2FyZ3VtZW50cyh0ZW1wX2Rlc2MpOworCQkJdmFsdWUgPSB0ZW1wX2Rlc2MtPmJ1ZmZlci5sZW5ndGg7CisJCQlicmVhazsKKworCQljYXNlIEFDUElfVFlQRV9QQUNLQUdFOgorCisJCQkvKiBQYWNrYWdlIGFyZ3VtZW50cyBtYXkgbm90IGJlIGV2YWx1YXRlZCBhdCB0aGlzIHBvaW50ICovCisKKwkJCXN0YXR1cyA9IGFjcGlfZHNfZ2V0X3BhY2thZ2VfYXJndW1lbnRzKHRlbXBfZGVzYyk7CisJCQl2YWx1ZSA9IHRlbXBfZGVzYy0+cGFja2FnZS5jb3VudDsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlBQ1BJX0VSUk9SKChBRV9JTkZPLAorCQkJCSAgICAiT3BlcmFuZCBtdXN0IGJlIEJ1ZmZlci9JbnRlZ2VyL1N0cmluZy9QYWNrYWdlIC0gZm91bmQgdHlwZSAlcyIsCisJCQkJICAgIGFjcGlfdXRfZ2V0X3R5cGVfbmFtZSh0eXBlKSkpOworCQkJc3RhdHVzID0gQUVfQU1MX09QRVJBTkRfVFlQRTsKKwkJCWdvdG8gY2xlYW51cDsKKwkJfQorCisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJZ290byBjbGVhbnVwOworCQl9CisKKwkJLyoKKwkJICogTm93IHRoYXQgd2UgaGF2ZSB0aGUgc2l6ZSBvZiB0aGUgb2JqZWN0LCBjcmVhdGUgYSByZXN1bHQKKwkJICogb2JqZWN0IHRvIGhvbGQgdGhlIHZhbHVlCisJCSAqLworCQlyZXR1cm5fZGVzYyA9IGFjcGlfdXRfY3JlYXRlX2ludGVybmFsX29iamVjdChBQ1BJX1RZUEVfSU5URUdFUik7CisJCWlmICghcmV0dXJuX2Rlc2MpIHsKKwkJCXN0YXR1cyA9IEFFX05PX01FTU9SWTsKKwkJCWdvdG8gY2xlYW51cDsKKwkJfQorCisJCXJldHVybl9kZXNjLT5pbnRlZ2VyLnZhbHVlID0gdmFsdWU7CisJCWJyZWFrOworCisJY2FzZSBBTUxfUkVGX09GX09QOgkvKiByZWZfb2YgKHNvdXJjZV9vYmplY3QpICovCisKKwkJc3RhdHVzID0KKwkJICAgIGFjcGlfZXhfZ2V0X29iamVjdF9yZWZlcmVuY2Uob3BlcmFuZFswXSwgJnJldHVybl9kZXNjLAorCQkJCQkJIHdhbGtfc3RhdGUpOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCWdvdG8gY2xlYW51cDsKKwkJfQorCQlicmVhazsKKworCWNhc2UgQU1MX0RFUkVGX09GX09QOgkvKiBkZXJlZl9vZiAob2JqX3JlZmVyZW5jZSB8IFN0cmluZykgKi8KKworCQkvKiBDaGVjayBmb3IgYSBtZXRob2QgbG9jYWwgb3IgYXJndW1lbnQsIG9yIHN0YW5kYWxvbmUgU3RyaW5nICovCisKKwkJaWYgKEFDUElfR0VUX0RFU0NSSVBUT1JfVFlQRShvcGVyYW5kWzBdKSA9PQorCQkgICAgQUNQSV9ERVNDX1RZUEVfTkFNRUQpIHsKKwkJCXRlbXBfZGVzYyA9CisJCQkgICAgYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0KChzdHJ1Y3QKKwkJCQkJCQkgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqKQorCQkJCQkJCW9wZXJhbmRbMF0pOworCQkJaWYgKHRlbXBfZGVzYworCQkJICAgICYmCisJCQkgICAgKChBQ1BJX0dFVF9PQkpFQ1RfVFlQRSh0ZW1wX2Rlc2MpID09CisJCQkgICAgICBBQ1BJX1RZUEVfU1RSSU5HKQorCQkJICAgICB8fCAoQUNQSV9HRVRfT0JKRUNUX1RZUEUodGVtcF9kZXNjKSA9PQorCQkJCSBBQ1BJX1RZUEVfTE9DQUxfUkVGRVJFTkNFKSkpIHsKKwkJCQlvcGVyYW5kWzBdID0gdGVtcF9kZXNjOworCQkJCWFjcGlfdXRfYWRkX3JlZmVyZW5jZSh0ZW1wX2Rlc2MpOworCQkJfSBlbHNlIHsKKwkJCQlzdGF0dXMgPSBBRV9BTUxfT1BFUkFORF9UWVBFOworCQkJCWdvdG8gY2xlYW51cDsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXN3aXRjaCAoQUNQSV9HRVRfT0JKRUNUX1RZUEUob3BlcmFuZFswXSkpIHsKKwkJCWNhc2UgQUNQSV9UWVBFX0xPQ0FMX1JFRkVSRU5DRToKKwkJCQkvKgorCQkJCSAqIFRoaXMgaXMgYSBkZXJlZl9vZiAobG9jYWxfeCB8IGFyZ194KQorCQkJCSAqCisJCQkJICogTXVzdCByZXNvbHZlL2RlcmVmZXJlbmNlIHRoZSBsb2NhbC9hcmcgcmVmZXJlbmNlIGZpcnN0CisJCQkJICovCisJCQkJc3dpdGNoIChvcGVyYW5kWzBdLT5yZWZlcmVuY2UuY2xhc3MpIHsKKwkJCQljYXNlIEFDUElfUkVGQ0xBU1NfTE9DQUw6CisJCQkJY2FzZSBBQ1BJX1JFRkNMQVNTX0FSRzoKKworCQkJCQkvKiBTZXQgT3BlcmFuZFswXSB0byB0aGUgdmFsdWUgb2YgdGhlIGxvY2FsL2FyZyAqLworCisJCQkJCXN0YXR1cyA9CisJCQkJCSAgICBhY3BpX2RzX21ldGhvZF9kYXRhX2dldF92YWx1ZQorCQkJCQkgICAgKG9wZXJhbmRbMF0tPnJlZmVyZW5jZS5jbGFzcywKKwkJCQkJICAgICBvcGVyYW5kWzBdLT5yZWZlcmVuY2UudmFsdWUsCisJCQkJCSAgICAgd2Fsa19zdGF0ZSwgJnRlbXBfZGVzYyk7CisJCQkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJCQkJZ290byBjbGVhbnVwOworCQkJCQl9CisKKwkJCQkJLyoKKwkJCQkJICogRGVsZXRlIG91ciByZWZlcmVuY2UgdG8gdGhlIGlucHV0IG9iamVjdCBhbmQKKwkJCQkJICogcG9pbnQgdG8gdGhlIG9iamVjdCBqdXN0IHJldHJpZXZlZAorCQkJCQkgKi8KKwkJCQkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKG9wZXJhbmRbMF0pOworCQkJCQlvcGVyYW5kWzBdID0gdGVtcF9kZXNjOworCQkJCQlicmVhazsKKworCQkJCWNhc2UgQUNQSV9SRUZDTEFTU19SRUZPRjoKKworCQkJCQkvKiBHZXQgdGhlIG9iamVjdCB0byB3aGljaCB0aGUgcmVmZXJlbmNlIHJlZmVycyAqLworCisJCQkJCXRlbXBfZGVzYyA9CisJCQkJCSAgICBvcGVyYW5kWzBdLT5yZWZlcmVuY2Uub2JqZWN0OworCQkJCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2Uob3BlcmFuZFswXSk7CisJCQkJCW9wZXJhbmRbMF0gPSB0ZW1wX2Rlc2M7CisJCQkJCWJyZWFrOworCisJCQkJZGVmYXVsdDoKKworCQkJCQkvKiBNdXN0IGJlIGFuIEluZGV4IG9wIC0gaGFuZGxlZCBiZWxvdyAqLworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgQUNQSV9UWVBFX1NUUklORzoKKwkJCQlicmVhazsKKworCQkJZGVmYXVsdDoKKwkJCQlzdGF0dXMgPSBBRV9BTUxfT1BFUkFORF9UWVBFOworCQkJCWdvdG8gY2xlYW51cDsKKwkJCX0KKwkJfQorCisJCWlmIChBQ1BJX0dFVF9ERVNDUklQVE9SX1RZUEUob3BlcmFuZFswXSkgIT0KKwkJICAgIEFDUElfREVTQ19UWVBFX05BTUVEKSB7CisJCQlpZiAoQUNQSV9HRVRfT0JKRUNUX1RZUEUob3BlcmFuZFswXSkgPT0KKwkJCSAgICBBQ1BJX1RZUEVfU1RSSU5HKSB7CisJCQkJLyoKKwkJCQkgKiBUaGlzIGlzIGEgZGVyZWZfb2YgKFN0cmluZykuIFRoZSBzdHJpbmcgaXMgYSByZWZlcmVuY2UKKwkJCQkgKiB0byBhIG5hbWVkIEFDUEkgb2JqZWN0LgorCQkJCSAqCisJCQkJICogMSkgRmluZCB0aGUgb3duaW5nIE5vZGUKKwkJCQkgKiAyKSBEZXJlZmVyZW5jZSB0aGUgbm9kZSB0byBhbiBhY3R1YWwgb2JqZWN0LiBDb3VsZCBiZSBhCisJCQkJICogICAgRmllbGQsIHNvIHdlIG5lZWQgdG8gcmVzb2x2ZSB0aGUgbm9kZSB0byBhIHZhbHVlLgorCQkJCSAqLworCQkJCXN0YXR1cyA9CisJCQkJICAgIGFjcGlfbnNfZ2V0X25vZGUod2Fsa19zdGF0ZS0+c2NvcGVfaW5mby0+CisJCQkJCQkgICAgIHNjb3BlLm5vZGUsCisJCQkJCQkgICAgIG9wZXJhbmRbMF0tPnN0cmluZy5wb2ludGVyLAorCQkJCQkJICAgICBBQ1BJX05TX1NFQVJDSF9QQVJFTlQsCisJCQkJCQkgICAgIEFDUElfQ0FTVF9JTkRJUkVDVF9QVFIKKwkJCQkJCSAgICAgKHN0cnVjdAorCQkJCQkJICAgICAgYWNwaV9uYW1lc3BhY2Vfbm9kZSwKKwkJCQkJCSAgICAgICZyZXR1cm5fZGVzYykpOworCQkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJCQlnb3RvIGNsZWFudXA7CisJCQkJfQorCisJCQkJc3RhdHVzID0KKwkJCQkgICAgYWNwaV9leF9yZXNvbHZlX25vZGVfdG9fdmFsdWUKKwkJCQkgICAgKEFDUElfQ0FTVF9JTkRJUkVDVF9QVFIKKwkJCQkgICAgIChzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSwgJnJldHVybl9kZXNjKSwKKwkJCQkgICAgIHdhbGtfc3RhdGUpOworCQkJCWdvdG8gY2xlYW51cDsKKwkJCX0KKwkJfQorCisJCS8qIE9wZXJhbmRbMF0gbWF5IGhhdmUgY2hhbmdlZCBmcm9tIHRoZSBjb2RlIGFib3ZlICovCisKKwkJaWYgKEFDUElfR0VUX0RFU0NSSVBUT1JfVFlQRShvcGVyYW5kWzBdKSA9PQorCQkgICAgQUNQSV9ERVNDX1RZUEVfTkFNRUQpIHsKKwkJCS8qCisJCQkgKiBUaGlzIGlzIGEgZGVyZWZfb2YgKG9iamVjdF9yZWZlcmVuY2UpCisJCQkgKiBHZXQgdGhlIGFjdHVhbCBvYmplY3QgZnJvbSB0aGUgTm9kZSAoVGhpcyBpcyB0aGUgZGVyZWZlcmVuY2UpLgorCQkJICogVGhpcyBjYXNlIG1heSBvbmx5IGhhcHBlbiB3aGVuIGEgbG9jYWxfeCBvciBhcmdfeCBpcworCQkJICogZGVyZWZlcmVuY2VkIGFib3ZlLgorCQkJICovCisJCQlyZXR1cm5fZGVzYyA9IGFjcGlfbnNfZ2V0X2F0dGFjaGVkX29iamVjdCgoc3RydWN0CisJCQkJCQkJCSAgIGFjcGlfbmFtZXNwYWNlX25vZGUKKwkJCQkJCQkJICAgKikKKwkJCQkJCQkJICBvcGVyYW5kWzBdKTsKKwkJCWFjcGlfdXRfYWRkX3JlZmVyZW5jZShyZXR1cm5fZGVzYyk7CisJCX0gZWxzZSB7CisJCQkvKgorCQkJICogVGhpcyBtdXN0IGJlIGEgcmVmZXJlbmNlIG9iamVjdCBwcm9kdWNlZCBieSBlaXRoZXIgdGhlCisJCQkgKiBJbmRleCgpIG9yIHJlZl9vZigpIG9wZXJhdG9yCisJCQkgKi8KKwkJCXN3aXRjaCAob3BlcmFuZFswXS0+cmVmZXJlbmNlLmNsYXNzKSB7CisJCQljYXNlIEFDUElfUkVGQ0xBU1NfSU5ERVg6CisKKwkJCQkvKgorCQkJCSAqIFRoZSB0YXJnZXQgdHlwZSBmb3IgdGhlIEluZGV4IG9wZXJhdG9yIG11c3QgYmUKKwkJCQkgKiBlaXRoZXIgYSBCdWZmZXIgb3IgYSBQYWNrYWdlCisJCQkJICovCisJCQkJc3dpdGNoIChvcGVyYW5kWzBdLT5yZWZlcmVuY2UudGFyZ2V0X3R5cGUpIHsKKwkJCQljYXNlIEFDUElfVFlQRV9CVUZGRVJfRklFTEQ6CisKKwkJCQkJdGVtcF9kZXNjID0KKwkJCQkJICAgIG9wZXJhbmRbMF0tPnJlZmVyZW5jZS5vYmplY3Q7CisKKwkJCQkJLyoKKwkJCQkJICogQ3JlYXRlIGEgbmV3IG9iamVjdCB0aGF0IGNvbnRhaW5zIG9uZSBlbGVtZW50IG9mIHRoZQorCQkJCQkgKiBidWZmZXIgLS0gdGhlIGVsZW1lbnQgcG9pbnRlZCB0byBieSB0aGUgaW5kZXguCisJCQkJCSAqCisJCQkJCSAqIE5PVEU6IGluZGV4IGludG8gYSBidWZmZXIgaXMgTk9UIGEgcG9pbnRlciB0byBhCisJCQkJCSAqIHN1Yi1idWZmZXIgb2YgdGhlIG1haW4gYnVmZmVyLCBpdCBpcyBvbmx5IGEgcG9pbnRlciB0byBhCisJCQkJCSAqIHNpbmdsZSBlbGVtZW50IChieXRlKSBvZiB0aGUgYnVmZmVyIQorCQkJCQkgKi8KKwkJCQkJcmV0dXJuX2Rlc2MgPQorCQkJCQkgICAgYWNwaV91dF9jcmVhdGVfaW50ZXJuYWxfb2JqZWN0CisJCQkJCSAgICAoQUNQSV9UWVBFX0lOVEVHRVIpOworCQkJCQlpZiAoIXJldHVybl9kZXNjKSB7CisJCQkJCQlzdGF0dXMgPSBBRV9OT19NRU1PUlk7CisJCQkJCQlnb3RvIGNsZWFudXA7CisJCQkJCX0KKworCQkJCQkvKgorCQkJCQkgKiBTaW5jZSB3ZSBhcmUgcmV0dXJuaW5nIHRoZSB2YWx1ZSBvZiB0aGUgYnVmZmVyIGF0IHRoZQorCQkJCQkgKiBpbmRleGVkIGxvY2F0aW9uLCB3ZSBkb24ndCBuZWVkIHRvIGFkZCBhbiBhZGRpdGlvbmFsCisJCQkJCSAqIHJlZmVyZW5jZSB0byB0aGUgYnVmZmVyIGl0c2VsZi4KKwkJCQkJICovCisJCQkJCXJldHVybl9kZXNjLT5pbnRlZ2VyLnZhbHVlID0KKwkJCQkJICAgIHRlbXBfZGVzYy0+YnVmZmVyLgorCQkJCQkgICAgcG9pbnRlcltvcGVyYW5kWzBdLT5yZWZlcmVuY2UuCisJCQkJCQkgICAgdmFsdWVdOworCQkJCQlicmVhazsKKworCQkJCWNhc2UgQUNQSV9UWVBFX1BBQ0tBR0U6CisKKwkJCQkJLyoKKwkJCQkJICogUmV0dXJuIHRoZSByZWZlcmVuY2VkIGVsZW1lbnQgb2YgdGhlIHBhY2thZ2UuICBXZSBtdXN0CisJCQkJCSAqIGFkZCBhbm90aGVyIHJlZmVyZW5jZSB0byB0aGUgcmVmZXJlbmNlZCBvYmplY3QsIGhvd2V2ZXIuCisJCQkJCSAqLworCQkJCQlyZXR1cm5fZGVzYyA9CisJCQkJCSAgICAqKG9wZXJhbmRbMF0tPnJlZmVyZW5jZS53aGVyZSk7CisJCQkJCWlmIChyZXR1cm5fZGVzYykgeworCQkJCQkJYWNwaV91dF9hZGRfcmVmZXJlbmNlCisJCQkJCQkgICAgKHJldHVybl9kZXNjKTsKKwkJCQkJfQorCQkJCQlicmVhazsKKworCQkJCWRlZmF1bHQ6CisKKwkJCQkJQUNQSV9FUlJPUigoQUVfSU5GTywKKwkJCQkJCSAgICAiVW5rbm93biBJbmRleCBUYXJnZXRUeXBlICVYIGluIHJlZmVyZW5jZSBvYmplY3QgJXAiLAorCQkJCQkJICAgIG9wZXJhbmRbMF0tPnJlZmVyZW5jZS4KKwkJCQkJCSAgICB0YXJnZXRfdHlwZSwgb3BlcmFuZFswXSkpOworCQkJCQlzdGF0dXMgPSBBRV9BTUxfT1BFUkFORF9UWVBFOworCQkJCQlnb3RvIGNsZWFudXA7CisJCQkJfQorCQkJCWJyZWFrOworCisJCQljYXNlIEFDUElfUkVGQ0xBU1NfUkVGT0Y6CisKKwkJCQlyZXR1cm5fZGVzYyA9IG9wZXJhbmRbMF0tPnJlZmVyZW5jZS5vYmplY3Q7CisKKwkJCQlpZiAoQUNQSV9HRVRfREVTQ1JJUFRPUl9UWVBFKHJldHVybl9kZXNjKSA9PQorCQkJCSAgICBBQ1BJX0RFU0NfVFlQRV9OQU1FRCkgeworCQkJCQlyZXR1cm5fZGVzYyA9CisJCQkJCSAgICBhY3BpX25zX2dldF9hdHRhY2hlZF9vYmplY3QoKHN0cnVjdAorCQkJCQkJCQkJIGFjcGlfbmFtZXNwYWNlX25vZGUKKwkJCQkJCQkJCSAqKQorCQkJCQkJCQkJcmV0dXJuX2Rlc2MpOworCQkJCX0KKworCQkJCS8qIEFkZCBhbm90aGVyIHJlZmVyZW5jZSB0byB0aGUgb2JqZWN0ISAqLworCisJCQkJYWNwaV91dF9hZGRfcmVmZXJlbmNlKHJldHVybl9kZXNjKTsKKwkJCQlicmVhazsKKworCQkJZGVmYXVsdDoKKwkJCQlBQ1BJX0VSUk9SKChBRV9JTkZPLAorCQkJCQkgICAgIlVua25vd24gY2xhc3MgaW4gcmVmZXJlbmNlKCVwKSAtICUyLjJYIiwKKwkJCQkJICAgIG9wZXJhbmRbMF0sCisJCQkJCSAgICBvcGVyYW5kWzBdLT5yZWZlcmVuY2UuY2xhc3MpKTsKKworCQkJCXN0YXR1cyA9IEFFX1RZUEU7CisJCQkJZ290byBjbGVhbnVwOworCQkJfQorCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKworCQlBQ1BJX0VSUk9SKChBRV9JTkZPLCAiVW5rbm93biBBTUwgb3Bjb2RlICVYIiwKKwkJCSAgICB3YWxrX3N0YXRlLT5vcGNvZGUpKTsKKwkJc3RhdHVzID0gQUVfQU1MX0JBRF9PUENPREU7CisJCWdvdG8gY2xlYW51cDsKKwl9CisKKyAgICAgIGNsZWFudXA6CisKKwkvKiBEZWxldGUgcmV0dXJuIG9iamVjdCBvbiBlcnJvciAqLworCisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZShyZXR1cm5fZGVzYyk7CisJfQorCisJLyogU2F2ZSByZXR1cm4gb2JqZWN0IG9uIHN1Y2Nlc3MgKi8KKworCWVsc2UgeworCQl3YWxrX3N0YXRlLT5yZXN1bHRfb2JqID0gcmV0dXJuX2Rlc2M7CisJfQorCisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2V4b3BhcmcyLmMgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2V4b3BhcmcyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGI0ZjUxMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXhvcGFyZzIuYwpAQCAtMCwwICsxLDYwNSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIE1vZHVsZSBOYW1lOiBleG9wYXJnMiAtIEFNTCBleGVjdXRpb24gLSBvcGNvZGVzIHdpdGggMiBhcmd1bWVudHMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA4LCBJbnRlbCBDb3JwLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAorICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgYXQgbWluaW11bSBhIGRpc2NsYWltZXIKKyAqICAgIHN1YnN0YW50aWFsbHkgc2ltaWxhciB0byB0aGUgIk5PIFdBUlJBTlRZIiBkaXNjbGFpbWVyIGJlbG93CisgKiAgICAoIkRpc2NsYWltZXIiKSBhbmQgYW55IHJlZGlzdHJpYnV0aW9uIG11c3QgYmUgY29uZGl0aW9uZWQgdXBvbgorICogICAgaW5jbHVkaW5nIGEgc3Vic3RhbnRpYWxseSBzaW1pbGFyIERpc2NsYWltZXIgcmVxdWlyZW1lbnQgZm9yIGZ1cnRoZXIKKyAqICAgIGJpbmFyeSByZWRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcworICogICAgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBOTyBXQVJSQU5UWQorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcKKyAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgorICovCisKKyNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KKyNpbmNsdWRlICJhY2NvbW1vbi5oIgorI2luY2x1ZGUgImFjcGFyc2VyLmgiCisjaW5jbHVkZSAiYWNpbnRlcnAuaCIKKyNpbmNsdWRlICJhY2V2ZW50cy5oIgorI2luY2x1ZGUgImFtbGNvZGUuaCIKKworI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfRVhFQ1VURVIKK0FDUElfTU9EVUxFX05BTUUoImV4b3BhcmcyIikKKworLyohCisgKiBOYW1pbmcgY29udmVudGlvbiBmb3IgQU1MIGludGVycHJldGVyIGV4ZWN1dGlvbiByb3V0aW5lcy4KKyAqCisgKiBUaGUgcm91dGluZXMgdGhhdCBiZWdpbiBleGVjdXRpb24gb2YgQU1MIG9wY29kZXMgYXJlIG5hbWVkIHdpdGggYSBjb21tb24KKyAqIGNvbnZlbnRpb24gYmFzZWQgdXBvbiB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cywgdGhlIG51bWJlciBvZiB0YXJnZXQgb3BlcmFuZHMsCisgKiBhbmQgd2hldGhlciBvciBub3QgYSB2YWx1ZSBpcyByZXR1cm5lZDoKKyAqCisgKiAgICAgIEFjcGlFeE9wY29kZV94QV95VF96UgorICoKKyAqIFdoZXJlOgorICoKKyAqIHhBIC0gQVJHVU1FTlRTOiAgICBUaGUgbnVtYmVyIG9mIGFyZ3VtZW50cyAoaW5wdXQgb3BlcmFuZHMpIHRoYXQgYXJlCisgKiAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQgZm9yIHRoaXMgb3Bjb2RlIHR5cGUgKDEgdGhyb3VnaCA2IGFyZ3MpLgorICogeVQgLSBUQVJHRVRTOiAgICAgIFRoZSBudW1iZXIgb2YgdGFyZ2V0cyAob3V0cHV0IG9wZXJhbmRzKSB0aGF0IGFyZSByZXF1aXJlZAorICogICAgICAgICAgICAgICAgICAgIGZvciB0aGlzIG9wY29kZSB0eXBlICgwLCAxLCBvciAyIHRhcmdldHMpLgorICogelIgLSBSRVRVUk4gVkFMVUU6IEluZGljYXRlcyB3aGV0aGVyIHRoaXMgb3Bjb2RlIHR5cGUgcmV0dXJucyBhIHZhbHVlCisgKiAgICAgICAgICAgICAgICAgICAgYXMgdGhlIGZ1bmN0aW9uIHJldHVybiAoMCBvciAxKS4KKyAqCisgKiBUaGUgQWNwaUV4T3Bjb2RlKiBmdW5jdGlvbnMgYXJlIGNhbGxlZCB2aWEgdGhlIERpc3BhdGNoZXIgY29tcG9uZW50IHdpdGgKKyAqIGZ1bGx5IHJlc29sdmVkIG9wZXJhbmRzLgorISovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X29wY29kZV8yQV8wVF8wUgorICoKKyAqIFBBUkFNRVRFUlM6ICB3YWxrX3N0YXRlICAgICAgICAgIC0gQ3VycmVudCB3YWxrIHN0YXRlCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBFeGVjdXRlIG9wY29kZSB3aXRoIHR3byBhcmd1bWVudHMsIG5vIHRhcmdldCwgYW5kIG5vIHJldHVybgorICogICAgICAgICAgICAgIHZhbHVlLgorICoKKyAqIEFMTE9DQVRJT046ICBEZWxldGVzIGJvdGggb3BlcmFuZHMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYWNwaV9zdGF0dXMgYWNwaV9leF9vcGNvZGVfMkFfMFRfMFIoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSkKK3sKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICoqb3BlcmFuZCA9ICZ3YWxrX3N0YXRlLT5vcGVyYW5kc1swXTsKKwlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZTsKKwl1MzIgdmFsdWU7CisJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1NUUihleF9vcGNvZGVfMkFfMFRfMFIsCisJCQkJYWNwaV9wc19nZXRfb3Bjb2RlX25hbWUod2Fsa19zdGF0ZS0+b3Bjb2RlKSk7CisKKwkvKiBFeGFtaW5lIHRoZSBvcGNvZGUgKi8KKworCXN3aXRjaCAod2Fsa19zdGF0ZS0+b3Bjb2RlKSB7CisJY2FzZSBBTUxfTk9USUZZX09QOgkvKiBOb3RpZnkgKG5vdGlmeV9vYmplY3QsIG5vdGlmeV92YWx1ZSkgKi8KKworCQkvKiBUaGUgZmlyc3Qgb3BlcmFuZCBpcyBhIG5hbWVzcGFjZSBub2RlICovCisKKwkJbm9kZSA9IChzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqKW9wZXJhbmRbMF07CisKKwkJLyogU2Vjb25kIHZhbHVlIGlzIHRoZSBub3RpZnkgdmFsdWUgKi8KKworCQl2YWx1ZSA9ICh1MzIpIG9wZXJhbmRbMV0tPmludGVnZXIudmFsdWU7CisKKwkJLyogQXJlIG5vdGlmaWVzIGFsbG93ZWQgb24gdGhpcyBvYmplY3Q/ICovCisKKwkJaWYgKCFhY3BpX2V2X2lzX25vdGlmeV9vYmplY3Qobm9kZSkpIHsKKwkJCUFDUElfRVJST1IoKEFFX0lORk8sCisJCQkJICAgICJVbmV4cGVjdGVkIG5vdGlmeSBvYmplY3QgdHlwZSBbJXNdIiwKKwkJCQkgICAgYWNwaV91dF9nZXRfdHlwZV9uYW1lKG5vZGUtPnR5cGUpKSk7CisKKwkJCXN0YXR1cyA9IEFFX0FNTF9PUEVSQU5EX1RZUEU7CisJCQlicmVhazsKKwkJfQorI2lmZGVmIEFDUElfR1BFX05PVElGWV9DSEVDSworCQkvKgorCQkgKiBHUEUgbWV0aG9kIHdha2Uvbm90aWZ5IGNoZWNrLiAgSGVyZSwgd2Ugd2FudCB0byBlbnN1cmUgdGhhdCB3ZQorCQkgKiBkb24ndCByZWNlaXZlIGFueSAiRGV2aWNlV2FrZSIgTm90aWZpZXMgZnJvbSBhIEdQRSBfTHh4IG9yIF9FeHgKKwkJICogR1BFIG1ldGhvZCBkdXJpbmcgc3lzdGVtIHJ1bnRpbWUuICBJZiB3ZSBkbywgdGhlIEdQRSBpcyBtYXJrZWQKKwkJICogYXMgIndha2Utb25seSIgYW5kIGRpc2FibGVkLgorCQkgKgorCQkgKiAxKSBJcyB0aGUgTm90aWZ5KCkgdmFsdWUgPT0gZGV2aWNlX3dha2U/CisJCSAqIDIpIElzIHRoaXMgYSBHUEUgZGVmZXJyZWQgbWV0aG9kPyAgKEFuIF9MeHggb3IgX0V4eCBtZXRob2QpCisJCSAqIDMpIERpZCB0aGUgb3JpZ2luYWwgR1BFIGhhcHBlbiBhdCBzeXN0ZW0gcnVudGltZT8KKwkJICogICAgKHZlcnN1cyBkdXJpbmcgd2FrZSkKKwkJICoKKwkJICogSWYgYWxsIHRocmVlIGNhc2VzIGFyZSB0cnVlLCB0aGlzIGlzIGEgd2FrZS1vbmx5IEdQRSB0aGF0IHNob3VsZAorCQkgKiBiZSBkaXNhYmxlZCBhdCBydW50aW1lLgorCQkgKi8KKwkJaWYgKHZhbHVlID09IDIpIHsJLyogZGV2aWNlX3dha2UgKi8KKwkJCXN0YXR1cyA9CisJCQkgICAgYWNwaV9ldl9jaGVja19mb3Jfd2FrZV9vbmx5X2dwZSh3YWxrX3N0YXRlLT4KKwkJCQkJCQkgICAgZ3BlX2V2ZW50X2luZm8pOworCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisKKwkJCQkvKiBBRV9XQUtFX09OTFlfR1BFIG9ubHkgZXJyb3IsIG1lYW5zIGlnbm9yZSB0aGlzIG5vdGlmeSAqLworCisJCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKQorCQkJfQorCQl9CisjZW5kaWYKKworCQkvKgorCQkgKiBEaXNwYXRjaCB0aGUgbm90aWZ5IHRvIHRoZSBhcHByb3ByaWF0ZSBoYW5kbGVyCisJCSAqIE5PVEU6IHRoZSByZXF1ZXN0IGlzIHF1ZXVlZCBmb3IgZXhlY3V0aW9uIGFmdGVyIHRoaXMgbWV0aG9kCisJCSAqIGNvbXBsZXRlcy4gIFRoZSBub3RpZnkgaGFuZGxlcnMgYXJlIE5PVCBpbnZva2VkIHN5bmNocm9ub3VzbHkKKwkJICogZnJvbSB0aGlzIHRocmVhZCAtLSBiZWNhdXNlIGhhbmRsZXJzIG1heSBpbiB0dXJuIHJ1biBvdGhlcgorCQkgKiBjb250cm9sIG1ldGhvZHMuCisJCSAqLworCQlzdGF0dXMgPSBhY3BpX2V2X3F1ZXVlX25vdGlmeV9yZXF1ZXN0KG5vZGUsIHZhbHVlKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCisJCUFDUElfRVJST1IoKEFFX0lORk8sICJVbmtub3duIEFNTCBvcGNvZGUgJVgiLAorCQkJICAgIHdhbGtfc3RhdGUtPm9wY29kZSkpOworCQlzdGF0dXMgPSBBRV9BTUxfQkFEX09QQ09ERTsKKwl9CisKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9leF9vcGNvZGVfMkFfMlRfMVIKKyAqCisgKiBQQVJBTUVURVJTOiAgd2Fsa19zdGF0ZSAgICAgICAgICAtIEN1cnJlbnQgd2FsayBzdGF0ZQorICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogRXhlY3V0ZSBhIGR5YWRpYyBvcGVyYXRvciAoMiBvcGVyYW5kcykgd2l0aCAyIG91dHB1dCB0YXJnZXRzCisgKiAgICAgICAgICAgICAgYW5kIG9uZSBpbXBsaWNpdCByZXR1cm4gdmFsdWUuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworYWNwaV9zdGF0dXMgYWNwaV9leF9vcGNvZGVfMkFfMlRfMVIoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSkKK3sKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICoqb3BlcmFuZCA9ICZ3YWxrX3N0YXRlLT5vcGVyYW5kc1swXTsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpyZXR1cm5fZGVzYzEgPSBOVUxMOworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnJldHVybl9kZXNjMiA9IE5VTEw7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCisJQUNQSV9GVU5DVElPTl9UUkFDRV9TVFIoZXhfb3Bjb2RlXzJBXzJUXzFSLAorCQkJCWFjcGlfcHNfZ2V0X29wY29kZV9uYW1lKHdhbGtfc3RhdGUtPm9wY29kZSkpOworCisJLyogRXhlY3V0ZSB0aGUgb3Bjb2RlICovCisKKwlzd2l0Y2ggKHdhbGtfc3RhdGUtPm9wY29kZSkgeworCWNhc2UgQU1MX0RJVklERV9PUDoKKworCQkvKiBEaXZpZGUgKERpdmlkZW5kLCBEaXZpc29yLCByZW1haW5kZXJfcmVzdWx0IHF1b3RpZW50X3Jlc3VsdCkgKi8KKworCQlyZXR1cm5fZGVzYzEgPQorCQkgICAgYWNwaV91dF9jcmVhdGVfaW50ZXJuYWxfb2JqZWN0KEFDUElfVFlQRV9JTlRFR0VSKTsKKwkJaWYgKCFyZXR1cm5fZGVzYzEpIHsKKwkJCXN0YXR1cyA9IEFFX05PX01FTU9SWTsKKwkJCWdvdG8gY2xlYW51cDsKKwkJfQorCisJCXJldHVybl9kZXNjMiA9CisJCSAgICBhY3BpX3V0X2NyZWF0ZV9pbnRlcm5hbF9vYmplY3QoQUNQSV9UWVBFX0lOVEVHRVIpOworCQlpZiAoIXJldHVybl9kZXNjMikgeworCQkJc3RhdHVzID0gQUVfTk9fTUVNT1JZOworCQkJZ290byBjbGVhbnVwOworCQl9CisKKwkJLyogUXVvdGllbnQgdG8gcmV0dXJuX2Rlc2MxLCByZW1haW5kZXIgdG8gcmV0dXJuX2Rlc2MyICovCisKKwkJc3RhdHVzID0gYWNwaV91dF9kaXZpZGUob3BlcmFuZFswXS0+aW50ZWdlci52YWx1ZSwKKwkJCQkJb3BlcmFuZFsxXS0+aW50ZWdlci52YWx1ZSwKKwkJCQkJJnJldHVybl9kZXNjMS0+aW50ZWdlci52YWx1ZSwKKwkJCQkJJnJldHVybl9kZXNjMi0+aW50ZWdlci52YWx1ZSk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJZ290byBjbGVhbnVwOworCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKworCQlBQ1BJX0VSUk9SKChBRV9JTkZPLCAiVW5rbm93biBBTUwgb3Bjb2RlICVYIiwKKwkJCSAgICB3YWxrX3N0YXRlLT5vcGNvZGUpKTsKKwkJc3RhdHVzID0gQUVfQU1MX0JBRF9PUENPREU7CisJCWdvdG8gY2xlYW51cDsKKwl9CisKKwkvKiBTdG9yZSB0aGUgcmVzdWx0cyB0byB0aGUgdGFyZ2V0IHJlZmVyZW5jZSBvcGVyYW5kcyAqLworCisJc3RhdHVzID0gYWNwaV9leF9zdG9yZShyZXR1cm5fZGVzYzIsIG9wZXJhbmRbMl0sIHdhbGtfc3RhdGUpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlnb3RvIGNsZWFudXA7CisJfQorCisJc3RhdHVzID0gYWNwaV9leF9zdG9yZShyZXR1cm5fZGVzYzEsIG9wZXJhbmRbM10sIHdhbGtfc3RhdGUpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlnb3RvIGNsZWFudXA7CisJfQorCisgICAgICBjbGVhbnVwOgorCS8qCisJICogU2luY2UgdGhlIHJlbWFpbmRlciBpcyBub3QgcmV0dXJuZWQgaW5kaXJlY3RseSwgcmVtb3ZlIGEgcmVmZXJlbmNlIHRvCisJICogaXQuIE9ubHkgdGhlIHF1b3RpZW50IGlzIHJldHVybmVkIGluZGlyZWN0bHkuCisJICovCisJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKHJldHVybl9kZXNjMik7CisKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKworCQkvKiBEZWxldGUgdGhlIHJldHVybiBvYmplY3QgKi8KKworCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UocmV0dXJuX2Rlc2MxKTsKKwl9CisKKwkvKiBTYXZlIHJldHVybiBvYmplY3QgKHRoZSByZW1haW5kZXIpIG9uIHN1Y2Nlc3MgKi8KKworCWVsc2UgeworCQl3YWxrX3N0YXRlLT5yZXN1bHRfb2JqID0gcmV0dXJuX2Rlc2MxOworCX0KKworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X29wY29kZV8yQV8xVF8xUgorICoKKyAqIFBBUkFNRVRFUlM6ICB3YWxrX3N0YXRlICAgICAgICAgIC0gQ3VycmVudCB3YWxrIHN0YXRlCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBFeGVjdXRlIG9wY29kZSB3aXRoIHR3byBhcmd1bWVudHMsIG9uZSB0YXJnZXQsIGFuZCBhIHJldHVybgorICogICAgICAgICAgICAgIHZhbHVlLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2FjcGlfc3RhdHVzIGFjcGlfZXhfb3Bjb2RlXzJBXzFUXzFSKHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUpCit7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKm9wZXJhbmQgPSAmd2Fsa19zdGF0ZS0+b3BlcmFuZHNbMF07CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqcmV0dXJuX2Rlc2MgPSBOVUxMOworCWFjcGlfaW50ZWdlciBpbmRleDsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKKwlhY3BpX3NpemUgbGVuZ3RoOworCisJQUNQSV9GVU5DVElPTl9UUkFDRV9TVFIoZXhfb3Bjb2RlXzJBXzFUXzFSLAorCQkJCWFjcGlfcHNfZ2V0X29wY29kZV9uYW1lKHdhbGtfc3RhdGUtPm9wY29kZSkpOworCisJLyogRXhlY3V0ZSB0aGUgb3Bjb2RlICovCisKKwlpZiAod2Fsa19zdGF0ZS0+b3BfaW5mby0+ZmxhZ3MgJiBBTUxfTUFUSCkgeworCisJCS8qIEFsbCBzaW1wbGUgbWF0aCBvcGNvZGVzIChhZGQsIGV0Yy4pICovCisKKwkJcmV0dXJuX2Rlc2MgPSBhY3BpX3V0X2NyZWF0ZV9pbnRlcm5hbF9vYmplY3QoQUNQSV9UWVBFX0lOVEVHRVIpOworCQlpZiAoIXJldHVybl9kZXNjKSB7CisJCQlzdGF0dXMgPSBBRV9OT19NRU1PUlk7CisJCQlnb3RvIGNsZWFudXA7CisJCX0KKworCQlyZXR1cm5fZGVzYy0+aW50ZWdlci52YWx1ZSA9CisJCSAgICBhY3BpX2V4X2RvX21hdGhfb3Aod2Fsa19zdGF0ZS0+b3Bjb2RlLAorCQkJCSAgICAgICBvcGVyYW5kWzBdLT5pbnRlZ2VyLnZhbHVlLAorCQkJCSAgICAgICBvcGVyYW5kWzFdLT5pbnRlZ2VyLnZhbHVlKTsKKwkJZ290byBzdG9yZV9yZXN1bHRfdG9fdGFyZ2V0OworCX0KKworCXN3aXRjaCAod2Fsa19zdGF0ZS0+b3Bjb2RlKSB7CisJY2FzZSBBTUxfTU9EX09QOgkvKiBNb2QgKERpdmlkZW5kLCBEaXZpc29yLCByZW1haW5kZXJfcmVzdWx0IChBQ1BJIDIuMCkgKi8KKworCQlyZXR1cm5fZGVzYyA9IGFjcGlfdXRfY3JlYXRlX2ludGVybmFsX29iamVjdChBQ1BJX1RZUEVfSU5URUdFUik7CisJCWlmICghcmV0dXJuX2Rlc2MpIHsKKwkJCXN0YXR1cyA9IEFFX05PX01FTU9SWTsKKwkJCWdvdG8gY2xlYW51cDsKKwkJfQorCisJCS8qIHJldHVybl9kZXNjIHdpbGwgY29udGFpbiB0aGUgcmVtYWluZGVyICovCisKKwkJc3RhdHVzID0gYWNwaV91dF9kaXZpZGUob3BlcmFuZFswXS0+aW50ZWdlci52YWx1ZSwKKwkJCQkJb3BlcmFuZFsxXS0+aW50ZWdlci52YWx1ZSwKKwkJCQkJTlVMTCwgJnJldHVybl9kZXNjLT5pbnRlZ2VyLnZhbHVlKTsKKwkJYnJlYWs7CisKKwljYXNlIEFNTF9DT05DQVRfT1A6CS8qIENvbmNhdGVuYXRlIChEYXRhMSwgRGF0YTIsIFJlc3VsdCkgKi8KKworCQlzdGF0dXMgPSBhY3BpX2V4X2RvX2NvbmNhdGVuYXRlKG9wZXJhbmRbMF0sIG9wZXJhbmRbMV0sCisJCQkJCQkmcmV0dXJuX2Rlc2MsIHdhbGtfc3RhdGUpOworCQlicmVhazsKKworCWNhc2UgQU1MX1RPX1NUUklOR19PUDoJLyogdG9fc3RyaW5nIChCdWZmZXIsIExlbmd0aCwgUmVzdWx0KSAoQUNQSSAyLjApICovCisKKwkJLyoKKwkJICogSW5wdXQgb2JqZWN0IGlzIGd1YXJhbnRlZWQgdG8gYmUgYSBidWZmZXIgYXQgdGhpcyBwb2ludCAoaXQgbWF5IGhhdmUKKwkJICogYmVlbiBjb252ZXJ0ZWQuKSAgQ29weSB0aGUgcmF3IGJ1ZmZlciBkYXRhIHRvIGEgbmV3IG9iamVjdCBvZgorCQkgKiB0eXBlIFN0cmluZy4KKwkJICovCisKKwkJLyoKKwkJICogR2V0IHRoZSBsZW5ndGggb2YgdGhlIG5ldyBzdHJpbmcuIEl0IGlzIHRoZSBzbWFsbGVzdCBvZjoKKwkJICogMSkgTGVuZ3RoIG9mIHRoZSBpbnB1dCBidWZmZXIKKwkJICogMikgTWF4IGxlbmd0aCBhcyBzcGVjaWZpZWQgaW4gdGhlIHRvX3N0cmluZyBvcGVyYXRvcgorCQkgKiAzKSBMZW5ndGggb2YgaW5wdXQgYnVmZmVyIHVwIHRvIGEgemVybyBieXRlIChudWxsIHRlcm1pbmF0b3IpCisJCSAqCisJCSAqIE5PVEU6IEEgbGVuZ3RoIG9mIHplcm8gaXMgb2ssIGFuZCB3aWxsIGNyZWF0ZSBhIHplcm8tbGVuZ3RoLCBudWxsCisJCSAqICAgICAgIHRlcm1pbmF0ZWQgc3RyaW5nLgorCQkgKi8KKwkJbGVuZ3RoID0gMDsKKwkJd2hpbGUgKChsZW5ndGggPCBvcGVyYW5kWzBdLT5idWZmZXIubGVuZ3RoKSAmJgorCQkgICAgICAgKGxlbmd0aCA8IG9wZXJhbmRbMV0tPmludGVnZXIudmFsdWUpICYmCisJCSAgICAgICAob3BlcmFuZFswXS0+YnVmZmVyLnBvaW50ZXJbbGVuZ3RoXSkpIHsKKwkJCWxlbmd0aCsrOworCQl9CisKKwkJLyogQWxsb2NhdGUgYSBuZXcgc3RyaW5nIG9iamVjdCAqLworCisJCXJldHVybl9kZXNjID0gYWNwaV91dF9jcmVhdGVfc3RyaW5nX29iamVjdChsZW5ndGgpOworCQlpZiAoIXJldHVybl9kZXNjKSB7CisJCQlzdGF0dXMgPSBBRV9OT19NRU1PUlk7CisJCQlnb3RvIGNsZWFudXA7CisJCX0KKworCQkvKgorCQkgKiBDb3B5IHRoZSByYXcgYnVmZmVyIGRhdGEgd2l0aCBubyB0cmFuc2Zvcm0uCisJCSAqIChOVUxMIHRlcm1pbmF0ZWQgYWxyZWFkeSkKKwkJICovCisJCUFDUElfTUVNQ1BZKHJldHVybl9kZXNjLT5zdHJpbmcucG9pbnRlciwKKwkJCSAgICBvcGVyYW5kWzBdLT5idWZmZXIucG9pbnRlciwgbGVuZ3RoKTsKKwkJYnJlYWs7CisKKwljYXNlIEFNTF9DT05DQVRfUkVTX09QOgorCisJCS8qIGNvbmNhdGVuYXRlX3Jlc190ZW1wbGF0ZSAoQnVmZmVyLCBCdWZmZXIsIFJlc3VsdCkgKEFDUEkgMi4wKSAqLworCisJCXN0YXR1cyA9IGFjcGlfZXhfY29uY2F0X3RlbXBsYXRlKG9wZXJhbmRbMF0sIG9wZXJhbmRbMV0sCisJCQkJCQkgJnJldHVybl9kZXNjLCB3YWxrX3N0YXRlKTsKKwkJYnJlYWs7CisKKwljYXNlIEFNTF9JTkRFWF9PUDoJLyogSW5kZXggKFNvdXJjZSBJbmRleCBSZXN1bHQpICovCisKKwkJLyogQ3JlYXRlIHRoZSBpbnRlcm5hbCByZXR1cm4gb2JqZWN0ICovCisKKwkJcmV0dXJuX2Rlc2MgPQorCQkgICAgYWNwaV91dF9jcmVhdGVfaW50ZXJuYWxfb2JqZWN0KEFDUElfVFlQRV9MT0NBTF9SRUZFUkVOQ0UpOworCQlpZiAoIXJldHVybl9kZXNjKSB7CisJCQlzdGF0dXMgPSBBRV9OT19NRU1PUlk7CisJCQlnb3RvIGNsZWFudXA7CisJCX0KKworCQkvKiBJbml0aWFsaXplIHRoZSBJbmRleCByZWZlcmVuY2Ugb2JqZWN0ICovCisKKwkJaW5kZXggPSBvcGVyYW5kWzFdLT5pbnRlZ2VyLnZhbHVlOworCQlyZXR1cm5fZGVzYy0+cmVmZXJlbmNlLnZhbHVlID0gKHUzMikgaW5kZXg7CisJCXJldHVybl9kZXNjLT5yZWZlcmVuY2UuY2xhc3MgPSBBQ1BJX1JFRkNMQVNTX0lOREVYOworCisJCS8qCisJCSAqIEF0IHRoaXMgcG9pbnQsIHRoZSBTb3VyY2Ugb3BlcmFuZCBpcyBhIFN0cmluZywgQnVmZmVyLCBvciBQYWNrYWdlLgorCQkgKiBWZXJpZnkgdGhhdCB0aGUgaW5kZXggaXMgd2l0aGluIHJhbmdlLgorCQkgKi8KKwkJc3dpdGNoIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRShvcGVyYW5kWzBdKSkgeworCQljYXNlIEFDUElfVFlQRV9TVFJJTkc6CisKKwkJCWlmIChpbmRleCA+PSBvcGVyYW5kWzBdLT5zdHJpbmcubGVuZ3RoKSB7CisJCQkJc3RhdHVzID0gQUVfQU1MX1NUUklOR19MSU1JVDsKKwkJCX0KKworCQkJcmV0dXJuX2Rlc2MtPnJlZmVyZW5jZS50YXJnZXRfdHlwZSA9CisJCQkgICAgQUNQSV9UWVBFX0JVRkZFUl9GSUVMRDsKKwkJCWJyZWFrOworCisJCWNhc2UgQUNQSV9UWVBFX0JVRkZFUjoKKworCQkJaWYgKGluZGV4ID49IG9wZXJhbmRbMF0tPmJ1ZmZlci5sZW5ndGgpIHsKKwkJCQlzdGF0dXMgPSBBRV9BTUxfQlVGRkVSX0xJTUlUOworCQkJfQorCisJCQlyZXR1cm5fZGVzYy0+cmVmZXJlbmNlLnRhcmdldF90eXBlID0KKwkJCSAgICBBQ1BJX1RZUEVfQlVGRkVSX0ZJRUxEOworCQkJYnJlYWs7CisKKwkJY2FzZSBBQ1BJX1RZUEVfUEFDS0FHRToKKworCQkJaWYgKGluZGV4ID49IG9wZXJhbmRbMF0tPnBhY2thZ2UuY291bnQpIHsKKwkJCQlzdGF0dXMgPSBBRV9BTUxfUEFDS0FHRV9MSU1JVDsKKwkJCX0KKworCQkJcmV0dXJuX2Rlc2MtPnJlZmVyZW5jZS50YXJnZXRfdHlwZSA9IEFDUElfVFlQRV9QQUNLQUdFOworCQkJcmV0dXJuX2Rlc2MtPnJlZmVyZW5jZS53aGVyZSA9CisJCQkgICAgJm9wZXJhbmRbMF0tPnBhY2thZ2UuZWxlbWVudHNbaW5kZXhdOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKworCQkJc3RhdHVzID0gQUVfQU1MX0lOVEVSTkFMOworCQkJZ290byBjbGVhbnVwOworCQl9CisKKwkJLyogRmFpbHVyZSBtZWFucyB0aGF0IHRoZSBJbmRleCB3YXMgYmV5b25kIHRoZSBlbmQgb2YgdGhlIG9iamVjdCAqLworCisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJQUNQSV9FWENFUFRJT04oKEFFX0lORk8sIHN0YXR1cywKKwkJCQkJIkluZGV4ICglWCU4LjhYKSBpcyBiZXlvbmQgZW5kIG9mIG9iamVjdCIsCisJCQkJCUFDUElfRk9STUFUX1VJTlQ2NChpbmRleCkpKTsKKwkJCWdvdG8gY2xlYW51cDsKKwkJfQorCisJCS8qCisJCSAqIFNhdmUgdGhlIHRhcmdldCBvYmplY3QgYW5kIGFkZCBhIHJlZmVyZW5jZSB0byBpdCBmb3IgdGhlIGxpZmUKKwkJICogb2YgdGhlIGluZGV4CisJCSAqLworCQlyZXR1cm5fZGVzYy0+cmVmZXJlbmNlLm9iamVjdCA9IG9wZXJhbmRbMF07CisJCWFjcGlfdXRfYWRkX3JlZmVyZW5jZShvcGVyYW5kWzBdKTsKKworCQkvKiBTdG9yZSB0aGUgcmVmZXJlbmNlIHRvIHRoZSBUYXJnZXQgKi8KKworCQlzdGF0dXMgPSBhY3BpX2V4X3N0b3JlKHJldHVybl9kZXNjLCBvcGVyYW5kWzJdLCB3YWxrX3N0YXRlKTsKKworCQkvKiBSZXR1cm4gdGhlIHJlZmVyZW5jZSAqLworCisJCXdhbGtfc3RhdGUtPnJlc3VsdF9vYmogPSByZXR1cm5fZGVzYzsKKwkJZ290byBjbGVhbnVwOworCisJZGVmYXVsdDoKKworCQlBQ1BJX0VSUk9SKChBRV9JTkZPLCAiVW5rbm93biBBTUwgb3Bjb2RlICVYIiwKKwkJCSAgICB3YWxrX3N0YXRlLT5vcGNvZGUpKTsKKwkJc3RhdHVzID0gQUVfQU1MX0JBRF9PUENPREU7CisJCWJyZWFrOworCX0KKworICAgICAgc3RvcmVfcmVzdWx0X3RvX3RhcmdldDoKKworCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkgeworCQkvKgorCQkgKiBTdG9yZSB0aGUgcmVzdWx0IG9mIHRoZSBvcGVyYXRpb24gKHdoaWNoIGlzIG5vdyBpbiByZXR1cm5fZGVzYykgaW50bworCQkgKiB0aGUgVGFyZ2V0IGRlc2NyaXB0b3IuCisJCSAqLworCQlzdGF0dXMgPSBhY3BpX2V4X3N0b3JlKHJldHVybl9kZXNjLCBvcGVyYW5kWzJdLCB3YWxrX3N0YXRlKTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQlnb3RvIGNsZWFudXA7CisJCX0KKworCQlpZiAoIXdhbGtfc3RhdGUtPnJlc3VsdF9vYmopIHsKKwkJCXdhbGtfc3RhdGUtPnJlc3VsdF9vYmogPSByZXR1cm5fZGVzYzsKKwkJfQorCX0KKworICAgICAgY2xlYW51cDoKKworCS8qIERlbGV0ZSByZXR1cm4gb2JqZWN0IG9uIGVycm9yICovCisKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKHJldHVybl9kZXNjKTsKKwkJd2Fsa19zdGF0ZS0+cmVzdWx0X29iaiA9IE5VTEw7CisJfQorCisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfZXhfb3Bjb2RlXzJBXzBUXzFSCisgKgorICogUEFSQU1FVEVSUzogIHdhbGtfc3RhdGUgICAgICAgICAgLSBDdXJyZW50IHdhbGsgc3RhdGUKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IEV4ZWN1dGUgb3Bjb2RlIHdpdGggMiBhcmd1bWVudHMsIG5vIHRhcmdldCwgYW5kIGEgcmV0dXJuIHZhbHVlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworYWNwaV9zdGF0dXMgYWNwaV9leF9vcGNvZGVfMkFfMFRfMVIoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSkKK3sKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICoqb3BlcmFuZCA9ICZ3YWxrX3N0YXRlLT5vcGVyYW5kc1swXTsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpyZXR1cm5fZGVzYyA9IE5VTEw7CisJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CisJdTggbG9naWNhbF9yZXN1bHQgPSBGQUxTRTsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0VfU1RSKGV4X29wY29kZV8yQV8wVF8xUiwKKwkJCQlhY3BpX3BzX2dldF9vcGNvZGVfbmFtZSh3YWxrX3N0YXRlLT5vcGNvZGUpKTsKKworCS8qIENyZWF0ZSB0aGUgaW50ZXJuYWwgcmV0dXJuIG9iamVjdCAqLworCisJcmV0dXJuX2Rlc2MgPSBhY3BpX3V0X2NyZWF0ZV9pbnRlcm5hbF9vYmplY3QoQUNQSV9UWVBFX0lOVEVHRVIpOworCWlmICghcmV0dXJuX2Rlc2MpIHsKKwkJc3RhdHVzID0gQUVfTk9fTUVNT1JZOworCQlnb3RvIGNsZWFudXA7CisJfQorCisJLyogRXhlY3V0ZSB0aGUgT3Bjb2RlICovCisKKwlpZiAod2Fsa19zdGF0ZS0+b3BfaW5mby0+ZmxhZ3MgJiBBTUxfTE9HSUNBTF9OVU1FUklDKSB7CisKKwkJLyogbG9naWNhbF9vcCAoT3BlcmFuZDAsIE9wZXJhbmQxKSAqLworCisJCXN0YXR1cyA9IGFjcGlfZXhfZG9fbG9naWNhbF9udW1lcmljX29wKHdhbGtfc3RhdGUtPm9wY29kZSwKKwkJCQkJCSAgICAgICBvcGVyYW5kWzBdLT5pbnRlZ2VyLgorCQkJCQkJICAgICAgIHZhbHVlLAorCQkJCQkJICAgICAgIG9wZXJhbmRbMV0tPmludGVnZXIuCisJCQkJCQkgICAgICAgdmFsdWUsICZsb2dpY2FsX3Jlc3VsdCk7CisJCWdvdG8gc3RvcmVfbG9naWNhbF9yZXN1bHQ7CisJfSBlbHNlIGlmICh3YWxrX3N0YXRlLT5vcF9pbmZvLT5mbGFncyAmIEFNTF9MT0dJQ0FMKSB7CisKKwkJLyogbG9naWNhbF9vcCAoT3BlcmFuZDAsIE9wZXJhbmQxKSAqLworCisJCXN0YXR1cyA9IGFjcGlfZXhfZG9fbG9naWNhbF9vcCh3YWxrX3N0YXRlLT5vcGNvZGUsIG9wZXJhbmRbMF0sCisJCQkJCSAgICAgICBvcGVyYW5kWzFdLCAmbG9naWNhbF9yZXN1bHQpOworCQlnb3RvIHN0b3JlX2xvZ2ljYWxfcmVzdWx0OworCX0KKworCXN3aXRjaCAod2Fsa19zdGF0ZS0+b3Bjb2RlKSB7CisJY2FzZSBBTUxfQUNRVUlSRV9PUDoJLyogQWNxdWlyZSAobXV0ZXhfb2JqZWN0LCBUaW1lb3V0KSAqLworCisJCXN0YXR1cyA9CisJCSAgICBhY3BpX2V4X2FjcXVpcmVfbXV0ZXgob3BlcmFuZFsxXSwgb3BlcmFuZFswXSwgd2Fsa19zdGF0ZSk7CisJCWlmIChzdGF0dXMgPT0gQUVfVElNRSkgeworCQkJbG9naWNhbF9yZXN1bHQgPSBUUlVFOwkvKiBUUlVFID0gQWNxdWlyZSB0aW1lZCBvdXQgKi8KKwkJCXN0YXR1cyA9IEFFX09LOworCQl9CisJCWJyZWFrOworCisJY2FzZSBBTUxfV0FJVF9PUDoJLyogV2FpdCAoZXZlbnRfb2JqZWN0LCBUaW1lb3V0KSAqLworCisJCXN0YXR1cyA9IGFjcGlfZXhfc3lzdGVtX3dhaXRfZXZlbnQob3BlcmFuZFsxXSwgb3BlcmFuZFswXSk7CisJCWlmIChzdGF0dXMgPT0gQUVfVElNRSkgeworCQkJbG9naWNhbF9yZXN1bHQgPSBUUlVFOwkvKiBUUlVFLCBXYWl0IHRpbWVkIG91dCAqLworCQkJc3RhdHVzID0gQUVfT0s7CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCisJCUFDUElfRVJST1IoKEFFX0lORk8sICJVbmtub3duIEFNTCBvcGNvZGUgJVgiLAorCQkJICAgIHdhbGtfc3RhdGUtPm9wY29kZSkpOworCQlzdGF0dXMgPSBBRV9BTUxfQkFEX09QQ09ERTsKKwkJZ290byBjbGVhbnVwOworCX0KKworICAgICAgc3RvcmVfbG9naWNhbF9yZXN1bHQ6CisJLyoKKwkgKiBTZXQgcmV0dXJuIHZhbHVlIHRvIGFjY29yZGluZyB0byBsb2dpY2FsX3Jlc3VsdC4gbG9naWNhbCBUUlVFIChhbGwgb25lcykKKwkgKiBEZWZhdWx0IGlzIEZBTFNFICh6ZXJvKQorCSAqLworCWlmIChsb2dpY2FsX3Jlc3VsdCkgeworCQlyZXR1cm5fZGVzYy0+aW50ZWdlci52YWx1ZSA9IEFDUElfSU5URUdFUl9NQVg7CisJfQorCisgICAgICBjbGVhbnVwOgorCisJLyogRGVsZXRlIHJldHVybiBvYmplY3Qgb24gZXJyb3IgKi8KKworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UocmV0dXJuX2Rlc2MpOworCX0KKworCS8qIFNhdmUgcmV0dXJuIG9iamVjdCBvbiBzdWNjZXNzICovCisKKwllbHNlIHsKKwkJd2Fsa19zdGF0ZS0+cmVzdWx0X29iaiA9IHJldHVybl9kZXNjOworCX0KKworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS9leG9wYXJnMy5jIGIvZHJpdmVycy9hY3BpL2FjcGljYS9leG9wYXJnMy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2NTIwYmIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2V4b3BhcmczLmMKQEAgLTAsMCArMSwyNzMgQEAKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIE1vZHVsZSBOYW1lOiBleG9wYXJnMyAtIEFNTCBleGVjdXRpb24gLSBvcGNvZGVzIHdpdGggMyBhcmd1bWVudHMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA4LCBJbnRlbCBDb3JwLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAorICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgYXQgbWluaW11bSBhIGRpc2NsYWltZXIKKyAqICAgIHN1YnN0YW50aWFsbHkgc2ltaWxhciB0byB0aGUgIk5PIFdBUlJBTlRZIiBkaXNjbGFpbWVyIGJlbG93CisgKiAgICAoIkRpc2NsYWltZXIiKSBhbmQgYW55IHJlZGlzdHJpYnV0aW9uIG11c3QgYmUgY29uZGl0aW9uZWQgdXBvbgorICogICAgaW5jbHVkaW5nIGEgc3Vic3RhbnRpYWxseSBzaW1pbGFyIERpc2NsYWltZXIgcmVxdWlyZW1lbnQgZm9yIGZ1cnRoZXIKKyAqICAgIGJpbmFyeSByZWRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcworICogICAgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBOTyBXQVJSQU5UWQorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcKKyAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgorICovCisKKyNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KKyNpbmNsdWRlICJhY2NvbW1vbi5oIgorI2luY2x1ZGUgImFjaW50ZXJwLmgiCisjaW5jbHVkZSAiYWNwYXJzZXIuaCIKKyNpbmNsdWRlICJhbWxjb2RlLmgiCisKKyNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX0VYRUNVVEVSCitBQ1BJX01PRFVMRV9OQU1FKCJleG9wYXJnMyIpCisKKy8qIQorICogTmFtaW5nIGNvbnZlbnRpb24gZm9yIEFNTCBpbnRlcnByZXRlciBleGVjdXRpb24gcm91dGluZXMuCisgKgorICogVGhlIHJvdXRpbmVzIHRoYXQgYmVnaW4gZXhlY3V0aW9uIG9mIEFNTCBvcGNvZGVzIGFyZSBuYW1lZCB3aXRoIGEgY29tbW9uCisgKiBjb252ZW50aW9uIGJhc2VkIHVwb24gdGhlIG51bWJlciBvZiBhcmd1bWVudHMsIHRoZSBudW1iZXIgb2YgdGFyZ2V0IG9wZXJhbmRzLAorICogYW5kIHdoZXRoZXIgb3Igbm90IGEgdmFsdWUgaXMgcmV0dXJuZWQ6CisgKgorICogICAgICBBY3BpRXhPcGNvZGVfeEFfeVRfelIKKyAqCisgKiBXaGVyZToKKyAqCisgKiB4QSAtIEFSR1VNRU5UUzogICAgVGhlIG51bWJlciBvZiBhcmd1bWVudHMgKGlucHV0IG9wZXJhbmRzKSB0aGF0IGFyZQorICogICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkIGZvciB0aGlzIG9wY29kZSB0eXBlICgxIHRocm91Z2ggNiBhcmdzKS4KKyAqIHlUIC0gVEFSR0VUUzogICAgICBUaGUgbnVtYmVyIG9mIHRhcmdldHMgKG91dHB1dCBvcGVyYW5kcykgdGhhdCBhcmUgcmVxdWlyZWQKKyAqICAgICAgICAgICAgICAgICAgICBmb3IgdGhpcyBvcGNvZGUgdHlwZSAoMCwgMSwgb3IgMiB0YXJnZXRzKS4KKyAqIHpSIC0gUkVUVVJOIFZBTFVFOiBJbmRpY2F0ZXMgd2hldGhlciB0aGlzIG9wY29kZSB0eXBlIHJldHVybnMgYSB2YWx1ZQorICogICAgICAgICAgICAgICAgICAgIGFzIHRoZSBmdW5jdGlvbiByZXR1cm4gKDAgb3IgMSkuCisgKgorICogVGhlIEFjcGlFeE9wY29kZSogZnVuY3Rpb25zIGFyZSBjYWxsZWQgdmlhIHRoZSBEaXNwYXRjaGVyIGNvbXBvbmVudCB3aXRoCisgKiBmdWxseSByZXNvbHZlZCBvcGVyYW5kcy4KKyEqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9leF9vcGNvZGVfM0FfMFRfMFIKKyAqCisgKiBQQVJBTUVURVJTOiAgd2Fsa19zdGF0ZSAgICAgICAgICAtIEN1cnJlbnQgd2FsayBzdGF0ZQorICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogRXhlY3V0ZSBUcmlhZGljIG9wZXJhdG9yICgzIG9wZXJhbmRzKQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCithY3BpX3N0YXR1cyBhY3BpX2V4X29wY29kZV8zQV8wVF8wUihzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKQoreworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKipvcGVyYW5kID0gJndhbGtfc3RhdGUtPm9wZXJhbmRzWzBdOworCXN0cnVjdCBhY3BpX3NpZ25hbF9mYXRhbF9pbmZvICpmYXRhbDsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0VfU1RSKGV4X29wY29kZV8zQV8wVF8wUiwKKwkJCQlhY3BpX3BzX2dldF9vcGNvZGVfbmFtZSh3YWxrX3N0YXRlLT5vcGNvZGUpKTsKKworCXN3aXRjaCAod2Fsa19zdGF0ZS0+b3Bjb2RlKSB7CisJY2FzZSBBTUxfRkFUQUxfT1A6CS8qIEZhdGFsIChmYXRhbF90eXBlIGZhdGFsX2NvZGUgZmF0YWxfYXJnKSAqLworCisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywKKwkJCQkgICJGYXRhbE9wOiBUeXBlICVYIENvZGUgJVggQXJnICVYIDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDxcbiIsCisJCQkJICAodTMyKSBvcGVyYW5kWzBdLT5pbnRlZ2VyLnZhbHVlLAorCQkJCSAgKHUzMikgb3BlcmFuZFsxXS0+aW50ZWdlci52YWx1ZSwKKwkJCQkgICh1MzIpIG9wZXJhbmRbMl0tPmludGVnZXIudmFsdWUpKTsKKworCQlmYXRhbCA9IEFDUElfQUxMT0NBVEUoc2l6ZW9mKHN0cnVjdCBhY3BpX3NpZ25hbF9mYXRhbF9pbmZvKSk7CisJCWlmIChmYXRhbCkgeworCQkJZmF0YWwtPnR5cGUgPSAodTMyKSBvcGVyYW5kWzBdLT5pbnRlZ2VyLnZhbHVlOworCQkJZmF0YWwtPmNvZGUgPSAodTMyKSBvcGVyYW5kWzFdLT5pbnRlZ2VyLnZhbHVlOworCQkJZmF0YWwtPmFyZ3VtZW50ID0gKHUzMikgb3BlcmFuZFsyXS0+aW50ZWdlci52YWx1ZTsKKwkJfQorCisJCS8qIEFsd2F5cyBzaWduYWwgdGhlIE9TISAqLworCisJCXN0YXR1cyA9IGFjcGlfb3Nfc2lnbmFsKEFDUElfU0lHTkFMX0ZBVEFMLCBmYXRhbCk7CisKKwkJLyogTWlnaHQgcmV0dXJuIHdoaWxlIE9TIGlzIHNodXR0aW5nIGRvd24sIGp1c3QgY29udGludWUgKi8KKworCQlBQ1BJX0ZSRUUoZmF0YWwpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisKKwkJQUNQSV9FUlJPUigoQUVfSU5GTywgIlVua25vd24gQU1MIG9wY29kZSAlWCIsCisJCQkgICAgd2Fsa19zdGF0ZS0+b3Bjb2RlKSk7CisJCXN0YXR1cyA9IEFFX0FNTF9CQURfT1BDT0RFOworCQlnb3RvIGNsZWFudXA7CisJfQorCisgICAgICBjbGVhbnVwOgorCisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfZXhfb3Bjb2RlXzNBXzFUXzFSCisgKgorICogUEFSQU1FVEVSUzogIHdhbGtfc3RhdGUgICAgICAgICAgLSBDdXJyZW50IHdhbGsgc3RhdGUKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IEV4ZWN1dGUgVHJpYWRpYyBvcGVyYXRvciAoMyBvcGVyYW5kcykKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCithY3BpX3N0YXR1cyBhY3BpX2V4X29wY29kZV8zQV8xVF8xUihzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKQoreworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKipvcGVyYW5kID0gJndhbGtfc3RhdGUtPm9wZXJhbmRzWzBdOworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnJldHVybl9kZXNjID0gTlVMTDsKKwljaGFyICpidWZmZXIgPSBOVUxMOworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOworCWFjcGlfaW50ZWdlciBpbmRleDsKKwlhY3BpX3NpemUgbGVuZ3RoOworCisJQUNQSV9GVU5DVElPTl9UUkFDRV9TVFIoZXhfb3Bjb2RlXzNBXzFUXzFSLAorCQkJCWFjcGlfcHNfZ2V0X29wY29kZV9uYW1lKHdhbGtfc3RhdGUtPm9wY29kZSkpOworCisJc3dpdGNoICh3YWxrX3N0YXRlLT5vcGNvZGUpIHsKKwljYXNlIEFNTF9NSURfT1A6CS8qIE1pZCAoU291cmNlWzBdLCBJbmRleFsxXSwgTGVuZ3RoWzJdLCBSZXN1bHRbM10pICovCisKKwkJLyoKKwkJICogQ3JlYXRlIHRoZSByZXR1cm4gb2JqZWN0LiAgVGhlIFNvdXJjZSBvcGVyYW5kIGlzIGd1YXJhbnRlZWQgdG8gYmUKKwkJICogZWl0aGVyIGEgU3RyaW5nIG9yIGEgQnVmZmVyLCBzbyBqdXN0IHVzZSBpdHMgdHlwZS4KKwkJICovCisJCXJldHVybl9kZXNjID0KKwkJICAgIGFjcGlfdXRfY3JlYXRlX2ludGVybmFsX29iamVjdChBQ1BJX0dFVF9PQkpFQ1RfVFlQRQorCQkJCQkJICAgKG9wZXJhbmRbMF0pKTsKKwkJaWYgKCFyZXR1cm5fZGVzYykgeworCQkJc3RhdHVzID0gQUVfTk9fTUVNT1JZOworCQkJZ290byBjbGVhbnVwOworCQl9CisKKwkJLyogR2V0IHRoZSBJbnRlZ2VyIHZhbHVlcyBmcm9tIHRoZSBvYmplY3RzICovCisKKwkJaW5kZXggPSBvcGVyYW5kWzFdLT5pbnRlZ2VyLnZhbHVlOworCQlsZW5ndGggPSAoYWNwaV9zaXplKSBvcGVyYW5kWzJdLT5pbnRlZ2VyLnZhbHVlOworCisJCS8qCisJCSAqIElmIHRoZSBpbmRleCBpcyBiZXlvbmQgdGhlIGxlbmd0aCBvZiB0aGUgU3RyaW5nL0J1ZmZlciwgb3IgaWYgdGhlCisJCSAqIHJlcXVlc3RlZCBsZW5ndGggaXMgemVybywgcmV0dXJuIGEgemVyby1sZW5ndGggU3RyaW5nL0J1ZmZlcgorCQkgKi8KKwkJaWYgKGluZGV4ID49IG9wZXJhbmRbMF0tPnN0cmluZy5sZW5ndGgpIHsKKwkJCWxlbmd0aCA9IDA7CisJCX0KKworCQkvKiBUcnVuY2F0ZSByZXF1ZXN0IGlmIGxhcmdlciB0aGFuIHRoZSBhY3R1YWwgU3RyaW5nL0J1ZmZlciAqLworCisJCWVsc2UgaWYgKChpbmRleCArIGxlbmd0aCkgPiBvcGVyYW5kWzBdLT5zdHJpbmcubGVuZ3RoKSB7CisJCQlsZW5ndGggPSAoYWNwaV9zaXplKSBvcGVyYW5kWzBdLT5zdHJpbmcubGVuZ3RoIC0KKwkJCSAgICAoYWNwaV9zaXplKSBpbmRleDsKKwkJfQorCisJCS8qIFN0cmluZ3MgYWx3YXlzIGhhdmUgYSBzdWItcG9pbnRlciwgbm90IHNvIGZvciBidWZmZXJzICovCisKKwkJc3dpdGNoIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRShvcGVyYW5kWzBdKSkgeworCQljYXNlIEFDUElfVFlQRV9TVFJJTkc6CisKKwkJCS8qIEFsd2F5cyBhbGxvY2F0ZSBhIG5ldyBidWZmZXIgZm9yIHRoZSBTdHJpbmcgKi8KKworCQkJYnVmZmVyID0gQUNQSV9BTExPQ0FURV9aRVJPRUQoKGFjcGlfc2l6ZSkgbGVuZ3RoICsgMSk7CisJCQlpZiAoIWJ1ZmZlcikgeworCQkJCXN0YXR1cyA9IEFFX05PX01FTU9SWTsKKwkJCQlnb3RvIGNsZWFudXA7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIEFDUElfVFlQRV9CVUZGRVI6CisKKwkJCS8qIElmIHRoZSByZXF1ZXN0ZWQgbGVuZ3RoIGlzIHplcm8sIGRvbid0IGFsbG9jYXRlIGEgYnVmZmVyICovCisKKwkJCWlmIChsZW5ndGggPiAwKSB7CisKKwkJCQkvKiBBbGxvY2F0ZSBhIG5ldyBidWZmZXIgZm9yIHRoZSBCdWZmZXIgKi8KKworCQkJCWJ1ZmZlciA9IEFDUElfQUxMT0NBVEVfWkVST0VEKGxlbmd0aCk7CisJCQkJaWYgKCFidWZmZXIpIHsKKwkJCQkJc3RhdHVzID0gQUVfTk9fTUVNT1JZOworCQkJCQlnb3RvIGNsZWFudXA7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoJLyogU2hvdWxkIG5vdCBoYXBwZW4gKi8KKworCQkJc3RhdHVzID0gQUVfQU1MX09QRVJBTkRfVFlQRTsKKwkJCWdvdG8gY2xlYW51cDsKKwkJfQorCisJCWlmIChidWZmZXIpIHsKKworCQkJLyogV2UgaGF2ZSBhIGJ1ZmZlciwgY29weSB0aGUgcG9ydGlvbiByZXF1ZXN0ZWQgKi8KKworCQkJQUNQSV9NRU1DUFkoYnVmZmVyLCBvcGVyYW5kWzBdLT5zdHJpbmcucG9pbnRlciArIGluZGV4LAorCQkJCSAgICBsZW5ndGgpOworCQl9CisKKwkJLyogU2V0IHRoZSBsZW5ndGggb2YgdGhlIG5ldyBTdHJpbmcvQnVmZmVyICovCisKKwkJcmV0dXJuX2Rlc2MtPnN0cmluZy5wb2ludGVyID0gYnVmZmVyOworCQlyZXR1cm5fZGVzYy0+c3RyaW5nLmxlbmd0aCA9ICh1MzIpIGxlbmd0aDsKKworCQkvKiBNYXJrIGJ1ZmZlciBpbml0aWFsaXplZCAqLworCisJCXJldHVybl9kZXNjLT5idWZmZXIuZmxhZ3MgfD0gQU9QT0JKX0RBVEFfVkFMSUQ7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKworCQlBQ1BJX0VSUk9SKChBRV9JTkZPLCAiVW5rbm93biBBTUwgb3Bjb2RlICVYIiwKKwkJCSAgICB3YWxrX3N0YXRlLT5vcGNvZGUpKTsKKwkJc3RhdHVzID0gQUVfQU1MX0JBRF9PUENPREU7CisJCWdvdG8gY2xlYW51cDsKKwl9CisKKwkvKiBTdG9yZSB0aGUgcmVzdWx0IGluIHRoZSB0YXJnZXQgKi8KKworCXN0YXR1cyA9IGFjcGlfZXhfc3RvcmUocmV0dXJuX2Rlc2MsIG9wZXJhbmRbM10sIHdhbGtfc3RhdGUpOworCisgICAgICBjbGVhbnVwOgorCisJLyogRGVsZXRlIHJldHVybiBvYmplY3Qgb24gZXJyb3IgKi8KKworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSB8fCB3YWxrX3N0YXRlLT5yZXN1bHRfb2JqKSB7CisJCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZShyZXR1cm5fZGVzYyk7CisJCXdhbGtfc3RhdGUtPnJlc3VsdF9vYmogPSBOVUxMOworCX0KKworCS8qIFNldCB0aGUgcmV0dXJuIG9iamVjdCBhbmQgZXhpdCAqLworCisJZWxzZSB7CisJCXdhbGtfc3RhdGUtPnJlc3VsdF9vYmogPSByZXR1cm5fZGVzYzsKKwl9CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2V4b3Bhcmc2LmMgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2V4b3Bhcmc2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWU0M2Y3NgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXhvcGFyZzYuYwpAQCAtMCwwICsxLDM0MSBAQAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogTW9kdWxlIE5hbWU6IGV4b3Bhcmc2IC0gQU1MIGV4ZWN1dGlvbiAtIG9wY29kZXMgd2l0aCA2IGFyZ3VtZW50cworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDgsIEludGVsIENvcnAuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCisgKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSBhdCBtaW5pbXVtIGEgZGlzY2xhaW1lcgorICogICAgc3Vic3RhbnRpYWxseSBzaW1pbGFyIHRvIHRoZSAiTk8gV0FSUkFOVFkiIGRpc2NsYWltZXIgYmVsb3cKKyAqICAgICgiRGlzY2xhaW1lciIpIGFuZCBhbnkgcmVkaXN0cmlidXRpb24gbXVzdCBiZSBjb25kaXRpb25lZCB1cG9uCisgKiAgICBpbmNsdWRpbmcgYSBzdWJzdGFudGlhbGx5IHNpbWlsYXIgRGlzY2xhaW1lciByZXF1aXJlbWVudCBmb3IgZnVydGhlcgorICogICAgYmluYXJ5IHJlZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzCisgKiAgICBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIE5PIFdBUlJBTlRZCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORworICogSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCisgKi8KKworI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgorI2luY2x1ZGUgImFjY29tbW9uLmgiCisjaW5jbHVkZSAiYWNpbnRlcnAuaCIKKyNpbmNsdWRlICJhY3BhcnNlci5oIgorI2luY2x1ZGUgImFtbGNvZGUuaCIKKworI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfRVhFQ1VURVIKK0FDUElfTU9EVUxFX05BTUUoImV4b3Bhcmc2IikKKworLyohCisgKiBOYW1pbmcgY29udmVudGlvbiBmb3IgQU1MIGludGVycHJldGVyIGV4ZWN1dGlvbiByb3V0aW5lcy4KKyAqCisgKiBUaGUgcm91dGluZXMgdGhhdCBiZWdpbiBleGVjdXRpb24gb2YgQU1MIG9wY29kZXMgYXJlIG5hbWVkIHdpdGggYSBjb21tb24KKyAqIGNvbnZlbnRpb24gYmFzZWQgdXBvbiB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cywgdGhlIG51bWJlciBvZiB0YXJnZXQgb3BlcmFuZHMsCisgKiBhbmQgd2hldGhlciBvciBub3QgYSB2YWx1ZSBpcyByZXR1cm5lZDoKKyAqCisgKiAgICAgIEFjcGlFeE9wY29kZV94QV95VF96UgorICoKKyAqIFdoZXJlOgorICoKKyAqIHhBIC0gQVJHVU1FTlRTOiAgICBUaGUgbnVtYmVyIG9mIGFyZ3VtZW50cyAoaW5wdXQgb3BlcmFuZHMpIHRoYXQgYXJlCisgKiAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQgZm9yIHRoaXMgb3Bjb2RlIHR5cGUgKDEgdGhyb3VnaCA2IGFyZ3MpLgorICogeVQgLSBUQVJHRVRTOiAgICAgIFRoZSBudW1iZXIgb2YgdGFyZ2V0cyAob3V0cHV0IG9wZXJhbmRzKSB0aGF0IGFyZSByZXF1aXJlZAorICogICAgICAgICAgICAgICAgICAgIGZvciB0aGlzIG9wY29kZSB0eXBlICgwLCAxLCBvciAyIHRhcmdldHMpLgorICogelIgLSBSRVRVUk4gVkFMVUU6IEluZGljYXRlcyB3aGV0aGVyIHRoaXMgb3Bjb2RlIHR5cGUgcmV0dXJucyBhIHZhbHVlCisgKiAgICAgICAgICAgICAgICAgICAgYXMgdGhlIGZ1bmN0aW9uIHJldHVybiAoMCBvciAxKS4KKyAqCisgKiBUaGUgQWNwaUV4T3Bjb2RlKiBmdW5jdGlvbnMgYXJlIGNhbGxlZCB2aWEgdGhlIERpc3BhdGNoZXIgY29tcG9uZW50IHdpdGgKKyAqIGZ1bGx5IHJlc29sdmVkIG9wZXJhbmRzLgorISovCisvKiBMb2NhbCBwcm90b3R5cGVzICovCitzdGF0aWMgdTgKK2FjcGlfZXhfZG9fbWF0Y2godTMyIG1hdGNoX29wLAorCQkgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqcGFja2FnZV9vYmosCisJCSB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICptYXRjaF9vYmopOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X2RvX21hdGNoCisgKgorICogUEFSQU1FVEVSUzogIG1hdGNoX29wICAgICAgICAtIFRoZSBBTUwgbWF0Y2ggb3BlcmFuZAorICogICAgICAgICAgICAgIHBhY2thZ2Vfb2JqICAgICAtIE9iamVjdCBmcm9tIHRoZSB0YXJnZXQgcGFja2FnZQorICogICAgICAgICAgICAgIG1hdGNoX29iaiAgICAgICAtIE9iamVjdCB0byBiZSBtYXRjaGVkCisgKgorICogUkVUVVJOOiAgICAgIFRSVUUgaWYgdGhlIG1hdGNoIGlzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZQorICoKKyAqIERFU0NSSVBUSU9OOiBJbXBsZW1lbnRzIHRoZSBsb3ctbGV2ZWwgbWF0Y2ggZm9yIHRoZSBBU0wgTWF0Y2ggb3BlcmF0b3IuCisgKiAgICAgICAgICAgICAgUGFja2FnZSBlbGVtZW50cyB3aWxsIGJlIGltcGxpY2l0bHkgY29udmVydGVkIHRvIHRoZSB0eXBlIG9mCisgKiAgICAgICAgICAgICAgdGhlIG1hdGNoIG9iamVjdCAoSW50ZWdlci9CdWZmZXIvU3RyaW5nKS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdTgKK2FjcGlfZXhfZG9fbWF0Y2godTMyIG1hdGNoX29wLAorCQkgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqcGFja2FnZV9vYmosCisJCSB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICptYXRjaF9vYmopCit7CisJdTggbG9naWNhbF9yZXN1bHQgPSBUUlVFOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKworCS8qCisJICogTm90ZTogU2luY2UgdGhlIHBhY2thZ2Vfb2JqL21hdGNoX29iaiBvcmRlcmluZyBpcyBvcHBvc2l0ZSB0byB0aGF0IG9mCisJICogdGhlIHN0YW5kYXJkIGxvZ2ljYWwgb3BlcmF0b3JzLCB3ZSBoYXZlIHRvIHJldmVyc2UgdGhlbSB3aGVuIHdlIGNhbGwKKwkgKiBkb19sb2dpY2FsX29wIGluIG9yZGVyIHRvIG1ha2UgdGhlIGltcGxpY2l0IGNvbnZlcnNpb24gcnVsZXMgd29yaworCSAqIGNvcnJlY3RseS4gSG93ZXZlciwgdGhpcyBtZWFucyB3ZSBoYXZlIHRvIGZsaXAgdGhlIGVudGlyZSBlcXVhdGlvbgorCSAqIGFsc28uIEEgYml0IHVnbHkgcGVyaGFwcywgYnV0IG92ZXJhbGwsIGJldHRlciB0aGFuIGZ1c3NpbmcgdGhlCisJICogcGFyYW1ldGVycyBhcm91bmQgYXQgcnVudGltZSwgb3ZlciBhbmQgb3ZlciBhZ2Fpbi4KKwkgKgorCSAqIEJlbG93LCBQW2ldIHJlZmVycyB0byB0aGUgcGFja2FnZSBlbGVtZW50LCBNIHJlZmVycyB0byB0aGUgTWF0Y2ggb2JqZWN0LgorCSAqLworCXN3aXRjaCAobWF0Y2hfb3ApIHsKKwljYXNlIE1BVENIX01UUjoKKworCQkvKiBBbHdheXMgdHJ1ZSAqLworCisJCWJyZWFrOworCisJY2FzZSBNQVRDSF9NRVE6CisKKwkJLyoKKwkJICogVHJ1ZSBpZiBlcXVhbDogKFBbaV0gPT0gTSkKKwkJICogQ2hhbmdlIHRvOiAgICAgKE0gPT0gUFtpXSkKKwkJICovCisJCXN0YXR1cyA9CisJCSAgICBhY3BpX2V4X2RvX2xvZ2ljYWxfb3AoQU1MX0xFUVVBTF9PUCwgbWF0Y2hfb2JqLCBwYWNrYWdlX29iaiwKKwkJCQkJICAmbG9naWNhbF9yZXN1bHQpOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCXJldHVybiAoRkFMU0UpOworCQl9CisJCWJyZWFrOworCisJY2FzZSBNQVRDSF9NTEU6CisKKwkJLyoKKwkJICogVHJ1ZSBpZiBsZXNzIHRoYW4gb3IgZXF1YWw6IChQW2ldIDw9IE0pIChQW2ldIG5vdF9ncmVhdGVyIHRoYW4gTSkKKwkJICogQ2hhbmdlIHRvOiAgICAgICAgICAgICAgICAgIChNID49IFBbaV0pIChNIG5vdF9sZXNzIHRoYW4gUFtpXSkKKwkJICovCisJCXN0YXR1cyA9CisJCSAgICBhY3BpX2V4X2RvX2xvZ2ljYWxfb3AoQU1MX0xMRVNTX09QLCBtYXRjaF9vYmosIHBhY2thZ2Vfb2JqLAorCQkJCQkgICZsb2dpY2FsX3Jlc3VsdCk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJcmV0dXJuIChGQUxTRSk7CisJCX0KKwkJbG9naWNhbF9yZXN1bHQgPSAodTgpICEgbG9naWNhbF9yZXN1bHQ7CisJCWJyZWFrOworCisJY2FzZSBNQVRDSF9NTFQ6CisKKwkJLyoKKwkJICogVHJ1ZSBpZiBsZXNzIHRoYW46IChQW2ldIDwgTSkKKwkJICogQ2hhbmdlIHRvOiAgICAgICAgIChNID4gUFtpXSkKKwkJICovCisJCXN0YXR1cyA9CisJCSAgICBhY3BpX2V4X2RvX2xvZ2ljYWxfb3AoQU1MX0xHUkVBVEVSX09QLCBtYXRjaF9vYmosCisJCQkJCSAgcGFja2FnZV9vYmosICZsb2dpY2FsX3Jlc3VsdCk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJcmV0dXJuIChGQUxTRSk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIE1BVENIX01HRToKKworCQkvKgorCQkgKiBUcnVlIGlmIGdyZWF0ZXIgdGhhbiBvciBlcXVhbDogKFBbaV0gPj0gTSkgKFBbaV0gbm90X2xlc3MgdGhhbiBNKQorCQkgKiBDaGFuZ2UgdG86ICAgICAgICAgICAgICAgICAgICAgKE0gPD0gUFtpXSkgKE0gbm90X2dyZWF0ZXIgdGhhbiBQW2ldKQorCQkgKi8KKwkJc3RhdHVzID0KKwkJICAgIGFjcGlfZXhfZG9fbG9naWNhbF9vcChBTUxfTEdSRUFURVJfT1AsIG1hdGNoX29iaiwKKwkJCQkJICBwYWNrYWdlX29iaiwgJmxvZ2ljYWxfcmVzdWx0KTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQlyZXR1cm4gKEZBTFNFKTsKKwkJfQorCQlsb2dpY2FsX3Jlc3VsdCA9ICh1OCkgISBsb2dpY2FsX3Jlc3VsdDsKKwkJYnJlYWs7CisKKwljYXNlIE1BVENIX01HVDoKKworCQkvKgorCQkgKiBUcnVlIGlmIGdyZWF0ZXIgdGhhbjogKFBbaV0gPiBNKQorCQkgKiBDaGFuZ2UgdG86ICAgICAgICAgICAgKE0gPCBQW2ldKQorCQkgKi8KKwkJc3RhdHVzID0KKwkJICAgIGFjcGlfZXhfZG9fbG9naWNhbF9vcChBTUxfTExFU1NfT1AsIG1hdGNoX29iaiwgcGFja2FnZV9vYmosCisJCQkJCSAgJmxvZ2ljYWxfcmVzdWx0KTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQlyZXR1cm4gKEZBTFNFKTsKKwkJfQorCQlicmVhazsKKworCWRlZmF1bHQ6CisKKwkJLyogVW5kZWZpbmVkICovCisKKwkJcmV0dXJuIChGQUxTRSk7CisJfQorCisJcmV0dXJuIGxvZ2ljYWxfcmVzdWx0OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X29wY29kZV82QV8wVF8xUgorICoKKyAqIFBBUkFNRVRFUlM6ICB3YWxrX3N0YXRlICAgICAgICAgIC0gQ3VycmVudCB3YWxrIHN0YXRlCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBFeGVjdXRlIG9wY29kZSB3aXRoIDYgYXJndW1lbnRzLCBubyB0YXJnZXQsIGFuZCBhIHJldHVybiB2YWx1ZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2FjcGlfc3RhdHVzIGFjcGlfZXhfb3Bjb2RlXzZBXzBUXzFSKHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKiB3YWxrX3N0YXRlKQoreworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKipvcGVyYW5kID0gJndhbGtfc3RhdGUtPm9wZXJhbmRzWzBdOworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnJldHVybl9kZXNjID0gTlVMTDsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKKwlhY3BpX2ludGVnZXIgaW5kZXg7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqdGhpc19lbGVtZW50OworCisJQUNQSV9GVU5DVElPTl9UUkFDRV9TVFIoZXhfb3Bjb2RlXzZBXzBUXzFSLAorCQkJCWFjcGlfcHNfZ2V0X29wY29kZV9uYW1lKHdhbGtfc3RhdGUtPm9wY29kZSkpOworCisJc3dpdGNoICh3YWxrX3N0YXRlLT5vcGNvZGUpIHsKKwljYXNlIEFNTF9NQVRDSF9PUDoKKwkJLyoKKwkJICogTWF0Y2ggKHNlYXJjaF9wa2dbMF0sIG1hdGNoX29wMVsxXSwgbWF0Y2hfb2JqMVsyXSwKKwkJICogICAgICAgICAgICAgICAgICAgICAgbWF0Y2hfb3AyWzNdLCBtYXRjaF9vYmoyWzRdLCBzdGFydF9pbmRleFs1XSkKKwkJICovCisKKwkJLyogVmFsaWRhdGUgYm90aCBNYXRjaCBUZXJtIE9wZXJhdG9ycyAoTVRSLCBNRVEsIGV0Yy4pICovCisKKwkJaWYgKChvcGVyYW5kWzFdLT5pbnRlZ2VyLnZhbHVlID4gTUFYX01BVENIX09QRVJBVE9SKSB8fAorCQkgICAgKG9wZXJhbmRbM10tPmludGVnZXIudmFsdWUgPiBNQVhfTUFUQ0hfT1BFUkFUT1IpKSB7CisJCQlBQ1BJX0VSUk9SKChBRV9JTkZPLCAiTWF0Y2ggb3BlcmF0b3Igb3V0IG9mIHJhbmdlIikpOworCQkJc3RhdHVzID0gQUVfQU1MX09QRVJBTkRfVkFMVUU7CisJCQlnb3RvIGNsZWFudXA7CisJCX0KKworCQkvKiBHZXQgdGhlIHBhY2thZ2Ugc3RhcnRfaW5kZXgsIHZhbGlkYXRlIGFnYWluc3QgdGhlIHBhY2thZ2UgbGVuZ3RoICovCisKKwkJaW5kZXggPSBvcGVyYW5kWzVdLT5pbnRlZ2VyLnZhbHVlOworCQlpZiAoaW5kZXggPj0gb3BlcmFuZFswXS0+cGFja2FnZS5jb3VudCkgeworCQkJQUNQSV9FUlJPUigoQUVfSU5GTywKKwkJCQkgICAgIkluZGV4ICglWCU4LjhYKSBiZXlvbmQgcGFja2FnZSBlbmQgKCVYKSIsCisJCQkJICAgIEFDUElfRk9STUFUX1VJTlQ2NChpbmRleCksCisJCQkJICAgIG9wZXJhbmRbMF0tPnBhY2thZ2UuY291bnQpKTsKKwkJCXN0YXR1cyA9IEFFX0FNTF9QQUNLQUdFX0xJTUlUOworCQkJZ290byBjbGVhbnVwOworCQl9CisKKwkJLyogQ3JlYXRlIGFuIGludGVnZXIgZm9yIHRoZSByZXR1cm4gdmFsdWUgKi8KKworCQlyZXR1cm5fZGVzYyA9IGFjcGlfdXRfY3JlYXRlX2ludGVybmFsX29iamVjdChBQ1BJX1RZUEVfSU5URUdFUik7CisJCWlmICghcmV0dXJuX2Rlc2MpIHsKKwkJCXN0YXR1cyA9IEFFX05PX01FTU9SWTsKKwkJCWdvdG8gY2xlYW51cDsKKworCQl9CisKKwkJLyogRGVmYXVsdCByZXR1cm4gdmFsdWUgaWYgbm8gbWF0Y2ggZm91bmQgKi8KKworCQlyZXR1cm5fZGVzYy0+aW50ZWdlci52YWx1ZSA9IEFDUElfSU5URUdFUl9NQVg7CisKKwkJLyoKKwkJICogRXhhbWluZSBlYWNoIGVsZW1lbnQgdW50aWwgYSBtYXRjaCBpcyBmb3VuZC4gQm90aCBtYXRjaCBjb25kaXRpb25zCisJCSAqIG11c3QgYmUgc2F0aXNmaWVkIGZvciBhIG1hdGNoIHRvIG9jY3VyLiBXaXRoaW4gdGhlIGxvb3AsCisJCSAqICJjb250aW51ZSIgc2lnbmlmaWVzIHRoYXQgdGhlIGN1cnJlbnQgZWxlbWVudCBkb2VzIG5vdCBtYXRjaAorCQkgKiBhbmQgdGhlIG5leHQgc2hvdWxkIGJlIGV4YW1pbmVkLgorCQkgKgorCQkgKiBVcG9uIGZpbmRpbmcgYSBtYXRjaCwgdGhlIGxvb3Agd2lsbCB0ZXJtaW5hdGUgdmlhICJicmVhayIgYXQKKwkJICogdGhlIGJvdHRvbS4gIElmIGl0IHRlcm1pbmF0ZXMgIm5vcm1hbGx5IiwgbWF0Y2hfdmFsdWUgd2lsbCBiZQorCQkgKiBBQ1BJX0lOVEVHRVJfTUFYIChPbmVzKSAoaXRzIGluaXRpYWwgdmFsdWUpIGluZGljYXRpbmcgdGhhdCBubworCQkgKiBtYXRjaCB3YXMgZm91bmQuCisJCSAqLworCQlmb3IgKDsgaW5kZXggPCBvcGVyYW5kWzBdLT5wYWNrYWdlLmNvdW50OyBpbmRleCsrKSB7CisKKwkJCS8qIEdldCB0aGUgY3VycmVudCBwYWNrYWdlIGVsZW1lbnQgKi8KKworCQkJdGhpc19lbGVtZW50ID0gb3BlcmFuZFswXS0+cGFja2FnZS5lbGVtZW50c1tpbmRleF07CisKKwkJCS8qIFRyZWF0IGFueSB1bmluaXRpYWxpemVkIChOVUxMKSBlbGVtZW50cyBhcyBub24tbWF0Y2hpbmcgKi8KKworCQkJaWYgKCF0aGlzX2VsZW1lbnQpIHsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJLyoKKwkJCSAqIEJvdGggbWF0Y2ggY29uZGl0aW9ucyBtdXN0IGJlIHNhdGlzZmllZC4gRXhlY3V0aW9uIG9mIGEgY29udGludWUKKwkJCSAqIChwcm9jZWVkIHRvIG5leHQgaXRlcmF0aW9uIG9mIGVuY2xvc2luZyBmb3IgbG9vcCkgc2lnbmlmaWVzIGEKKwkJCSAqIG5vbi1tYXRjaC4KKwkJCSAqLworCQkJaWYgKCFhY3BpX2V4X2RvX21hdGNoKCh1MzIpIG9wZXJhbmRbMV0tPmludGVnZXIudmFsdWUsCisJCQkJCSAgICAgIHRoaXNfZWxlbWVudCwgb3BlcmFuZFsyXSkpIHsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJaWYgKCFhY3BpX2V4X2RvX21hdGNoKCh1MzIpIG9wZXJhbmRbM10tPmludGVnZXIudmFsdWUsCisJCQkJCSAgICAgIHRoaXNfZWxlbWVudCwgb3BlcmFuZFs0XSkpIHsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJLyogTWF0Y2ggZm91bmQ6IEluZGV4IGlzIHRoZSByZXR1cm4gdmFsdWUgKi8KKworCQkJcmV0dXJuX2Rlc2MtPmludGVnZXIudmFsdWUgPSBpbmRleDsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCisJY2FzZSBBTUxfTE9BRF9UQUJMRV9PUDoKKworCQlzdGF0dXMgPSBhY3BpX2V4X2xvYWRfdGFibGVfb3Aod2Fsa19zdGF0ZSwgJnJldHVybl9kZXNjKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCisJCUFDUElfRVJST1IoKEFFX0lORk8sICJVbmtub3duIEFNTCBvcGNvZGUgJVgiLAorCQkJICAgIHdhbGtfc3RhdGUtPm9wY29kZSkpOworCQlzdGF0dXMgPSBBRV9BTUxfQkFEX09QQ09ERTsKKwkJZ290byBjbGVhbnVwOworCX0KKworICAgICAgY2xlYW51cDoKKworCS8qIERlbGV0ZSByZXR1cm4gb2JqZWN0IG9uIGVycm9yICovCisKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKHJldHVybl9kZXNjKTsKKwl9CisKKwkvKiBTYXZlIHJldHVybiBvYmplY3Qgb24gc3VjY2VzcyAqLworCisJZWxzZSB7CisJCXdhbGtfc3RhdGUtPnJlc3VsdF9vYmogPSByZXR1cm5fZGVzYzsKKwl9CisKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXhwcmVwLmMgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2V4cHJlcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyMjZmNzQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2V4cHJlcC5jCkBAIC0wLDAgKzEsNTkwIEBACisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBNb2R1bGUgTmFtZTogZXhwcmVwIC0gQUNQSSBBTUwgKHAtY29kZSkgZXhlY3V0aW9uIC0gZmllbGQgcHJlcCB1dGlsaXRpZXMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA4LCBJbnRlbCBDb3JwLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAorICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgYXQgbWluaW11bSBhIGRpc2NsYWltZXIKKyAqICAgIHN1YnN0YW50aWFsbHkgc2ltaWxhciB0byB0aGUgIk5PIFdBUlJBTlRZIiBkaXNjbGFpbWVyIGJlbG93CisgKiAgICAoIkRpc2NsYWltZXIiKSBhbmQgYW55IHJlZGlzdHJpYnV0aW9uIG11c3QgYmUgY29uZGl0aW9uZWQgdXBvbgorICogICAgaW5jbHVkaW5nIGEgc3Vic3RhbnRpYWxseSBzaW1pbGFyIERpc2NsYWltZXIgcmVxdWlyZW1lbnQgZm9yIGZ1cnRoZXIKKyAqICAgIGJpbmFyeSByZWRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcworICogICAgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBOTyBXQVJSQU5UWQorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcKKyAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgorICovCisKKyNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KKyNpbmNsdWRlICJhY2NvbW1vbi5oIgorI2luY2x1ZGUgImFjaW50ZXJwLmgiCisjaW5jbHVkZSAiYW1sY29kZS5oIgorI2luY2x1ZGUgImFjbmFtZXNwLmgiCisKKyNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX0VYRUNVVEVSCitBQ1BJX01PRFVMRV9OQU1FKCJleHByZXAiKQorCisvKiBMb2NhbCBwcm90b3R5cGVzICovCitzdGF0aWMgdTMyCithY3BpX2V4X2RlY29kZV9maWVsZF9hY2Nlc3ModW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2MsCisJCQkgICAgdTggZmllbGRfZmxhZ3MsIHUzMiAqIHJldHVybl9ieXRlX2FsaWdubWVudCk7CisKKyNpZmRlZiBBQ1BJX1VOREVSX0RFVkVMT1BNRU5UCisKK3N0YXRpYyB1MzIKK2FjcGlfZXhfZ2VuZXJhdGVfYWNjZXNzKHUzMiBmaWVsZF9iaXRfb2Zmc2V0LAorCQkJdTMyIGZpZWxkX2JpdF9sZW5ndGgsIHUzMiByZWdpb25fbGVuZ3RoKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9leF9nZW5lcmF0ZV9hY2Nlc3MKKyAqCisgKiBQQVJBTUVURVJTOiAgZmllbGRfYml0X29mZnNldCAgICAtIFN0YXJ0IG9mIGZpZWxkIHdpdGhpbiBwYXJlbnQgcmVnaW9uL2J1ZmZlcgorICogICAgICAgICAgICAgIGZpZWxkX2JpdF9sZW5ndGggICAgLSBMZW5ndGggb2YgZmllbGQgaW4gYml0cworICogICAgICAgICAgICAgIHJlZ2lvbl9sZW5ndGggICAgICAgLSBMZW5ndGggb2YgcGFyZW50IGluIGJ5dGVzCisgKgorICogUkVUVVJOOiAgICAgIEZpZWxkIGdyYW51bGFyaXR5ICg4LCAxNiwgMzIgb3IgNjQpIGFuZAorICogICAgICAgICAgICAgIGJ5dGVfYWxpZ25tZW50ICgxLCAyLCAzLCBvciA0KQorICoKKyAqIERFU0NSSVBUSU9OOiBHZW5lcmF0ZSBhbiBvcHRpbWFsIGFjY2VzcyB3aWR0aCBmb3IgZmllbGRzIGRlZmluZWQgd2l0aCB0aGUKKyAqICAgICAgICAgICAgICBhbnlfYWNjIGtleXdvcmQuCisgKgorICogTk9URTogTmVlZCB0byBoYXZlIHRoZSByZWdpb25fbGVuZ3RoIGluIG9yZGVyIHRvIGNoZWNrIGZvciBib3VuZGFyeQorICogICAgICAgY29uZGl0aW9ucyAoZW5kLW9mLXJlZ2lvbikuICBIb3dldmVyLCB0aGUgcmVnaW9uX2xlbmd0aCBpcyBhIGRlZmVycmVkCisgKiAgICAgICBvcGVyYXRpb24uICBUaGVyZWZvcmUsIHRvIGNvbXBsZXRlIHRoaXMgaW1wbGVtZW50YXRpb24sIHRoZSBnZW5lcmF0aW9uCisgKiAgICAgICBvZiB0aGlzIGFjY2VzcyB3aWR0aCBtdXN0IGJlIGRlZmVycmVkIHVudGlsIHRoZSByZWdpb24gbGVuZ3RoIGhhcworICogICAgICAgYmVlbiBldmFsdWF0ZWQuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHUzMgorYWNwaV9leF9nZW5lcmF0ZV9hY2Nlc3ModTMyIGZpZWxkX2JpdF9vZmZzZXQsCisJCQl1MzIgZmllbGRfYml0X2xlbmd0aCwgdTMyIHJlZ2lvbl9sZW5ndGgpCit7CisJdTMyIGZpZWxkX2J5dGVfbGVuZ3RoOworCXUzMiBmaWVsZF9ieXRlX29mZnNldDsKKwl1MzIgZmllbGRfYnl0ZV9lbmRfb2Zmc2V0OworCXUzMiBhY2Nlc3NfYnl0ZV93aWR0aDsKKwl1MzIgZmllbGRfc3RhcnRfb2Zmc2V0OworCXUzMiBmaWVsZF9lbmRfb2Zmc2V0OworCXUzMiBtaW5pbXVtX2FjY2Vzc193aWR0aCA9IDB4RkZGRkZGRkY7CisJdTMyIG1pbmltdW1fYWNjZXNzZXMgPSAweEZGRkZGRkZGOworCXUzMiBhY2Nlc3NlczsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0UoZXhfZ2VuZXJhdGVfYWNjZXNzKTsKKworCS8qIFJvdW5kIEZpZWxkIHN0YXJ0IG9mZnNldCBhbmQgbGVuZ3RoIHRvICJtaW5pbWFsIiBieXRlIGJvdW5kYXJpZXMgKi8KKworCWZpZWxkX2J5dGVfb2Zmc2V0ID0gQUNQSV9ESVZfOChBQ1BJX1JPVU5EX0RPV04oZmllbGRfYml0X29mZnNldCwgOCkpOworCWZpZWxkX2J5dGVfZW5kX29mZnNldCA9IEFDUElfRElWXzgoQUNQSV9ST1VORF9VUChmaWVsZF9iaXRfbGVuZ3RoICsKKwkJCQkJCQkgZmllbGRfYml0X29mZnNldCwgOCkpOworCWZpZWxkX2J5dGVfbGVuZ3RoID0gZmllbGRfYnl0ZV9lbmRfb2Zmc2V0IC0gZmllbGRfYnl0ZV9vZmZzZXQ7CisKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0JGSUVMRCwKKwkJCSAgIkJpdCBsZW5ndGggJWQsIEJpdCBvZmZzZXQgJWRcbiIsCisJCQkgIGZpZWxkX2JpdF9sZW5ndGgsIGZpZWxkX2JpdF9vZmZzZXQpKTsKKworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfQkZJRUxELAorCQkJICAiQnl0ZSBMZW5ndGggJWQsIEJ5dGUgT2Zmc2V0ICVkLCBFbmQgT2Zmc2V0ICVkXG4iLAorCQkJICBmaWVsZF9ieXRlX2xlbmd0aCwgZmllbGRfYnl0ZV9vZmZzZXQsCisJCQkgIGZpZWxkX2J5dGVfZW5kX29mZnNldCkpOworCisJLyoKKwkgKiBJdGVyYXRpdmUgc2VhcmNoIGZvciB0aGUgbWF4aW11bSBhY2Nlc3Mgd2lkdGggdGhhdCBpcyBib3RoIGFsaWduZWQKKwkgKiBhbmQgZG9lcyBub3QgZ28gYmV5b25kIHRoZSBlbmQgb2YgdGhlIHJlZ2lvbgorCSAqCisJICogU3RhcnQgYXQgYnl0ZV9hY2MgYW5kIHdvcmsgdXB3YXJkcyB0byBxd29yZF9hY2MgbWF4LiAoMSwyLDQsOCBieXRlcykKKwkgKi8KKwlmb3IgKGFjY2Vzc19ieXRlX3dpZHRoID0gMTsgYWNjZXNzX2J5dGVfd2lkdGggPD0gODsKKwkgICAgIGFjY2Vzc19ieXRlX3dpZHRoIDw8PSAxKSB7CisJCS8qCisJCSAqIDEpIFJvdW5kIGVuZCBvZmZzZXQgdXAgdG8gbmV4dCBhY2Nlc3MgYm91bmRhcnkgYW5kIG1ha2Ugc3VyZSB0aGF0CisJCSAqICAgIHRoaXMgZG9lcyBub3QgZ28gYmV5b25kIHRoZSBlbmQgb2YgdGhlIHBhcmVudCByZWdpb24uCisJCSAqIDIpIFdoZW4gdGhlIEFjY2VzcyB3aWR0aCBpcyBncmVhdGVyIHRoYW4gdGhlIGZpZWxkX2J5dGVfbGVuZ3RoLCB3ZQorCQkgKiAgICBhcmUgZG9uZS4gKFRoaXMgZG9lcyBub3Qgb3B0aW1pemUgZm9yIHRoZSBwZXJmZWN0bHkgYWxpZ25lZAorCQkgKiAgICBjYXNlIHlldCkuCisJCSAqLworCQlpZiAoQUNQSV9ST1VORF9VUChmaWVsZF9ieXRlX2VuZF9vZmZzZXQsIGFjY2Vzc19ieXRlX3dpZHRoKSA8PQorCQkgICAgcmVnaW9uX2xlbmd0aCkgeworCQkJZmllbGRfc3RhcnRfb2Zmc2V0ID0KKwkJCSAgICBBQ1BJX1JPVU5EX0RPV04oZmllbGRfYnl0ZV9vZmZzZXQsCisJCQkJCSAgICBhY2Nlc3NfYnl0ZV93aWR0aCkgLworCQkJICAgIGFjY2Vzc19ieXRlX3dpZHRoOworCisJCQlmaWVsZF9lbmRfb2Zmc2V0ID0KKwkJCSAgICBBQ1BJX1JPVU5EX1VQKChmaWVsZF9ieXRlX2xlbmd0aCArCisJCQkJCSAgIGZpZWxkX2J5dGVfb2Zmc2V0KSwKKwkJCQkJICBhY2Nlc3NfYnl0ZV93aWR0aCkgLworCQkJICAgIGFjY2Vzc19ieXRlX3dpZHRoOworCisJCQlhY2Nlc3NlcyA9IGZpZWxkX2VuZF9vZmZzZXQgLSBmaWVsZF9zdGFydF9vZmZzZXQ7CisKKwkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfQkZJRUxELAorCQkJCQkgICJBY2Nlc3NXaWR0aCAlZCBlbmQgaXMgd2l0aGluIHJlZ2lvblxuIiwKKwkJCQkJICBhY2Nlc3NfYnl0ZV93aWR0aCkpOworCisJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0JGSUVMRCwKKwkJCQkJICAiRmllbGQgU3RhcnQgJWQsIEZpZWxkIEVuZCAlZCAtLSByZXF1aXJlcyAlZCBhY2Nlc3Nlc1xuIiwKKwkJCQkJICBmaWVsZF9zdGFydF9vZmZzZXQsIGZpZWxkX2VuZF9vZmZzZXQsCisJCQkJCSAgYWNjZXNzZXMpKTsKKworCQkJLyogU2luZ2xlIGFjY2VzcyBpcyBvcHRpbWFsICovCisKKwkJCWlmIChhY2Nlc3NlcyA8PSAxKSB7CisJCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9CRklFTEQsCisJCQkJCQkgICJFbnRpcmUgZmllbGQgY2FuIGJlIGFjY2Vzc2VkIHdpdGggb25lIG9wZXJhdGlvbiBvZiBzaXplICVkXG4iLAorCQkJCQkJICBhY2Nlc3NfYnl0ZV93aWR0aCkpOworCQkJCXJldHVybl9WQUxVRShhY2Nlc3NfYnl0ZV93aWR0aCk7CisJCQl9CisKKwkJCS8qCisJCQkgKiBGaXRzIGluIHRoZSByZWdpb24sIGJ1dCByZXF1aXJlcyBtb3JlIHRoYW4gb25lIHJlYWQvd3JpdGUuCisJCQkgKiB0cnkgdGhlIG5leHQgd2lkZXIgYWNjZXNzIG9uIG5leHQgaXRlcmF0aW9uCisJCQkgKi8KKwkJCWlmIChhY2Nlc3NlcyA8IG1pbmltdW1fYWNjZXNzZXMpIHsKKwkJCQltaW5pbXVtX2FjY2Vzc2VzID0gYWNjZXNzZXM7CisJCQkJbWluaW11bV9hY2Nlc3Nfd2lkdGggPSBhY2Nlc3NfYnl0ZV93aWR0aDsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfQkZJRUxELAorCQkJCQkgICJBY2Nlc3NXaWR0aCAlZCBlbmQgaXMgTk9UIHdpdGhpbiByZWdpb25cbiIsCisJCQkJCSAgYWNjZXNzX2J5dGVfd2lkdGgpKTsKKwkJCWlmIChhY2Nlc3NfYnl0ZV93aWR0aCA9PSAxKSB7CisJCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9CRklFTEQsCisJCQkJCQkgICJGaWVsZCBnb2VzIGJleW9uZCBlbmQtb2YtcmVnaW9uIVxuIikpOworCisJCQkJLyogRmllbGQgZG9lcyBub3QgZml0IGluIHRoZSByZWdpb24gYXQgYWxsICovCisKKwkJCQlyZXR1cm5fVkFMVUUoMCk7CisJCQl9CisKKwkJCS8qCisJCQkgKiBUaGlzIHdpZHRoIGdvZXMgYmV5b25kIHRoZSBlbmQtb2YtcmVnaW9uLCBiYWNrIG9mZiB0bworCQkJICogcHJldmlvdXMgYWNjZXNzCisJCQkgKi8KKwkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfQkZJRUxELAorCQkJCQkgICJCYWNraW5nIG9mZiB0byBwcmV2aW91cyBvcHRpbWFsIGFjY2VzcyB3aWR0aCBvZiAlZFxuIiwKKwkJCQkJICBtaW5pbXVtX2FjY2Vzc193aWR0aCkpOworCQkJcmV0dXJuX1ZBTFVFKG1pbmltdW1fYWNjZXNzX3dpZHRoKTsKKwkJfQorCX0KKworCS8qCisJICogQ291bGQgbm90IHJlYWQvd3JpdGUgZmllbGQgd2l0aCBvbmUgb3BlcmF0aW9uLAorCSAqIGp1c3QgdXNlIG1heCBhY2Nlc3Mgd2lkdGgKKwkgKi8KKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0JGSUVMRCwKKwkJCSAgIkNhbm5vdCBhY2Nlc3MgZmllbGQgaW4gb25lIG9wZXJhdGlvbiwgdXNpbmcgd2lkdGggOFxuIikpOworCXJldHVybl9WQUxVRSg4KTsKK30KKyNlbmRpZgkJCQkvKiBBQ1BJX1VOREVSX0RFVkVMT1BNRU5UICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfZXhfZGVjb2RlX2ZpZWxkX2FjY2VzcworICoKKyAqIFBBUkFNRVRFUlM6ICBvYmpfZGVzYyAgICAgICAgICAgIC0gRmllbGQgb2JqZWN0CisgKiAgICAgICAgICAgICAgZmllbGRfZmxhZ3MgICAgICAgICAtIEVuY29kZWQgZmllbGRmbGFncyAoY29udGFpbnMgYWNjZXNzIGJpdHMpCisgKiAgICAgICAgICAgICAgcmV0dXJuX2J5dGVfYWxpZ25tZW50IC0gV2hlcmUgdGhlIGJ5dGUgYWxpZ25tZW50IGlzIHJldHVybmVkCisgKgorICogUkVUVVJOOiAgICAgIEZpZWxkIGdyYW51bGFyaXR5ICg4LCAxNiwgMzIgb3IgNjQpIGFuZAorICogICAgICAgICAgICAgIGJ5dGVfYWxpZ25tZW50ICgxLCAyLCAzLCBvciA0KQorICoKKyAqIERFU0NSSVBUSU9OOiBEZWNvZGUgdGhlIGFjY2Vzc190eXBlIGJpdHMgb2YgYSBmaWVsZCBkZWZpbml0aW9uLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB1MzIKK2FjcGlfZXhfZGVjb2RlX2ZpZWxkX2FjY2Vzcyh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYywKKwkJCSAgICB1OCBmaWVsZF9mbGFncywgdTMyICogcmV0dXJuX2J5dGVfYWxpZ25tZW50KQoreworCXUzMiBhY2Nlc3M7CisJdTMyIGJ5dGVfYWxpZ25tZW50OworCXUzMiBiaXRfbGVuZ3RoOworCisJQUNQSV9GVU5DVElPTl9UUkFDRShleF9kZWNvZGVfZmllbGRfYWNjZXNzKTsKKworCWFjY2VzcyA9IChmaWVsZF9mbGFncyAmIEFNTF9GSUVMRF9BQ0NFU1NfVFlQRV9NQVNLKTsKKworCXN3aXRjaCAoYWNjZXNzKSB7CisJY2FzZSBBTUxfRklFTERfQUNDRVNTX0FOWToKKworI2lmZGVmIEFDUElfVU5ERVJfREVWRUxPUE1FTlQKKwkJYnl0ZV9hbGlnbm1lbnQgPQorCQkgICAgYWNwaV9leF9nZW5lcmF0ZV9hY2Nlc3Mob2JqX2Rlc2MtPmNvbW1vbl9maWVsZC4KKwkJCQkJICAgIHN0YXJ0X2ZpZWxkX2JpdF9vZmZzZXQsCisJCQkJCSAgICBvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmJpdF9sZW5ndGgsCisJCQkJCSAgICAweEZGRkZGRkZGCisJCQkJCSAgICAvKiBUZW1wIHVudGlsIHdlIHBhc3MgcmVnaW9uX2xlbmd0aCBhcyBwYXJhbWV0ZXIgKi8KKwkJICAgICk7CisJCWJpdF9sZW5ndGggPSBieXRlX2FsaWdubWVudCAqIDg7CisjZW5kaWYKKworCQlieXRlX2FsaWdubWVudCA9IDE7CisJCWJpdF9sZW5ndGggPSA4OworCQlicmVhazsKKworCWNhc2UgQU1MX0ZJRUxEX0FDQ0VTU19CWVRFOgorCWNhc2UgQU1MX0ZJRUxEX0FDQ0VTU19CVUZGRVI6CS8qIEFDUEkgMi4wIChTTUJ1cyBCdWZmZXIpICovCisJCWJ5dGVfYWxpZ25tZW50ID0gMTsKKwkJYml0X2xlbmd0aCA9IDg7CisJCWJyZWFrOworCisJY2FzZSBBTUxfRklFTERfQUNDRVNTX1dPUkQ6CisJCWJ5dGVfYWxpZ25tZW50ID0gMjsKKwkJYml0X2xlbmd0aCA9IDE2OworCQlicmVhazsKKworCWNhc2UgQU1MX0ZJRUxEX0FDQ0VTU19EV09SRDoKKwkJYnl0ZV9hbGlnbm1lbnQgPSA0OworCQliaXRfbGVuZ3RoID0gMzI7CisJCWJyZWFrOworCisJY2FzZSBBTUxfRklFTERfQUNDRVNTX1FXT1JEOgkvKiBBQ1BJIDIuMCAqLworCQlieXRlX2FsaWdubWVudCA9IDg7CisJCWJpdF9sZW5ndGggPSA2NDsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQkvKiBJbnZhbGlkIGZpZWxkIGFjY2VzcyB0eXBlICovCisKKwkJQUNQSV9FUlJPUigoQUVfSU5GTywgIlVua25vd24gZmllbGQgYWNjZXNzIHR5cGUgJVgiLCBhY2Nlc3MpKTsKKwkJcmV0dXJuX1VJTlQzMigwKTsKKwl9CisKKwlpZiAoQUNQSV9HRVRfT0JKRUNUX1RZUEUob2JqX2Rlc2MpID09IEFDUElfVFlQRV9CVUZGRVJfRklFTEQpIHsKKwkJLyoKKwkJICogYnVmZmVyX2ZpZWxkIGFjY2VzcyBjYW4gYmUgb24gYW55IGJ5dGUgYm91bmRhcnksIHNvIHRoZQorCQkgKiBieXRlX2FsaWdubWVudCBpcyBhbHdheXMgMSBieXRlIC0tIHJlZ2FyZGxlc3Mgb2YgYW55IGJ5dGVfYWxpZ25tZW50CisJCSAqIGltcGxpZWQgYnkgdGhlIGZpZWxkIGFjY2VzcyB0eXBlLgorCQkgKi8KKwkJYnl0ZV9hbGlnbm1lbnQgPSAxOworCX0KKworCSpyZXR1cm5fYnl0ZV9hbGlnbm1lbnQgPSBieXRlX2FsaWdubWVudDsKKwlyZXR1cm5fVUlOVDMyKGJpdF9sZW5ndGgpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X3ByZXBfY29tbW9uX2ZpZWxkX29iamVjdAorICoKKyAqIFBBUkFNRVRFUlM6ICBvYmpfZGVzYyAgICAgICAgICAgIC0gVGhlIGZpZWxkIG9iamVjdAorICogICAgICAgICAgICAgIGZpZWxkX2ZsYWdzICAgICAgICAgLSBBY2Nlc3MsIGxvY2tfcnVsZSwgYW5kIHVwZGF0ZV9ydWxlLgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgZm9ybWF0IG9mIGEgZmllbGRfZmxhZyBpcyBkZXNjcmliZWQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIEFDUEkgc3BlY2lmaWNhdGlvbgorICogICAgICAgICAgICAgIGZpZWxkX2F0dHJpYnV0ZSAgICAgLSBTcGVjaWFsIGF0dHJpYnV0ZXMgKG5vdCB1c2VkKQorICogICAgICAgICAgICAgIGZpZWxkX2JpdF9wb3NpdGlvbiAgLSBGaWVsZCBzdGFydCBwb3NpdGlvbgorICogICAgICAgICAgICAgIGZpZWxkX2JpdF9sZW5ndGggICAgLSBGaWVsZCBsZW5ndGggaW4gbnVtYmVyIG9mIGJpdHMKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IEluaXRpYWxpemUgdGhlIGFyZWFzIG9mIHRoZSBmaWVsZCBvYmplY3QgdGhhdCBhcmUgY29tbW9uCisgKiAgICAgICAgICAgICAgdG8gdGhlIHZhcmlvdXMgdHlwZXMgb2YgZmllbGRzLiAgTm90ZTogVGhpcyBpcyB2ZXJ5ICJzZW5zaXRpdmUiCisgKiAgICAgICAgICAgICAgY29kZSBiZWNhdXNlIHdlIGFyZSBzb2x2aW5nIHRoZSBnZW5lcmFsIGNhc2UgZm9yIGZpZWxkCisgKiAgICAgICAgICAgICAgYWxpZ25tZW50LgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2FjcGlfc3RhdHVzCithY3BpX2V4X3ByZXBfY29tbW9uX2ZpZWxkX29iamVjdCh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYywKKwkJCQkgdTggZmllbGRfZmxhZ3MsCisJCQkJIHU4IGZpZWxkX2F0dHJpYnV0ZSwKKwkJCQkgdTMyIGZpZWxkX2JpdF9wb3NpdGlvbiwgdTMyIGZpZWxkX2JpdF9sZW5ndGgpCit7CisJdTMyIGFjY2Vzc19iaXRfd2lkdGg7CisJdTMyIGJ5dGVfYWxpZ25tZW50OworCXUzMiBuZWFyZXN0X2J5dGVfYWRkcmVzczsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0UoZXhfcHJlcF9jb21tb25fZmllbGRfb2JqZWN0KTsKKworCS8qCisJICogTm90ZTogdGhlIHN0cnVjdHVyZSBiZWluZyBpbml0aWFsaXplZCBpcyB0aGUKKwkgKiBBQ1BJX0NPTU1PTl9GSUVMRF9JTkZPOyAgTm8gc3RydWN0dXJlIGZpZWxkcyBvdXRzaWRlIG9mIHRoZSBjb21tb24KKwkgKiBhcmVhIGFyZSBpbml0aWFsaXplZCBieSB0aGlzIHByb2NlZHVyZS4KKwkgKi8KKwlvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmZpZWxkX2ZsYWdzID0gZmllbGRfZmxhZ3M7CisJb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5hdHRyaWJ1dGUgPSBmaWVsZF9hdHRyaWJ1dGU7CisJb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5iaXRfbGVuZ3RoID0gZmllbGRfYml0X2xlbmd0aDsKKworCS8qCisJICogRGVjb2RlIHRoZSBhY2Nlc3MgdHlwZSBzbyB3ZSBjYW4gY29tcHV0ZSBvZmZzZXRzLiAgVGhlIGFjY2VzcyB0eXBlIGdpdmVzCisJICogdHdvIHBpZWNlcyBvZiBpbmZvcm1hdGlvbiAtIHRoZSB3aWR0aCBvZiBlYWNoIGZpZWxkIGFjY2VzcyBhbmQgdGhlCisJICogbmVjZXNzYXJ5IGJ5dGVfYWxpZ25tZW50IChhZGRyZXNzIGdyYW51bGFyaXR5KSBvZiB0aGUgYWNjZXNzLgorCSAqCisJICogRm9yIGFueV9hY2MsIHRoZSBhY2Nlc3NfYml0X3dpZHRoIGlzIHRoZSBsYXJnZXN0IHdpZHRoIHRoYXQgaXMgYm90aAorCSAqIG5lY2Vzc2FyeSBhbmQgcG9zc2libGUgaW4gYW4gYXR0ZW1wdCB0byBhY2Nlc3MgdGhlIHdob2xlIGZpZWxkIGluIG9uZQorCSAqIEkvTyBvcGVyYXRpb24uICBIb3dldmVyLCBmb3IgYW55X2FjYywgdGhlIGJ5dGVfYWxpZ25tZW50IGlzIGFsd2F5cyBvbmUKKwkgKiBieXRlLgorCSAqCisJICogRm9yIGFsbCBCdWZmZXIgRmllbGRzLCB0aGUgYnl0ZV9hbGlnbm1lbnQgaXMgYWx3YXlzIG9uZSBieXRlLgorCSAqCisJICogRm9yIGFsbCBvdGhlciBhY2Nlc3MgdHlwZXMgKEJ5dGUsIFdvcmQsIER3b3JkLCBRd29yZCksIHRoZSBCaXR3aWR0aCBpcworCSAqIHRoZSBzYW1lIChlcXVpdmFsZW50KSBhcyB0aGUgYnl0ZV9hbGlnbm1lbnQuCisJICovCisJYWNjZXNzX2JpdF93aWR0aCA9IGFjcGlfZXhfZGVjb2RlX2ZpZWxkX2FjY2VzcyhvYmpfZGVzYywgZmllbGRfZmxhZ3MsCisJCQkJCQkgICAgICAgJmJ5dGVfYWxpZ25tZW50KTsKKwlpZiAoIWFjY2Vzc19iaXRfd2lkdGgpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9PUEVSQU5EX1ZBTFVFKTsKKwl9CisKKwkvKiBTZXR1cCB3aWR0aCAoYWNjZXNzIGdyYW51bGFyaXR5KSBmaWVsZHMgKi8KKworCW9ial9kZXNjLT5jb21tb25fZmllbGQuYWNjZXNzX2J5dGVfd2lkdGggPSAodTgpCisJICAgIEFDUElfRElWXzgoYWNjZXNzX2JpdF93aWR0aCk7CS8qIDEsICAyLCAgNCwgIDggKi8KKworCW9ial9kZXNjLT5jb21tb25fZmllbGQuYWNjZXNzX2JpdF93aWR0aCA9ICh1OCkgYWNjZXNzX2JpdF93aWR0aDsKKworCS8qCisJICogYmFzZV9ieXRlX29mZnNldCBpcyB0aGUgYWRkcmVzcyBvZiB0aGUgc3RhcnQgb2YgdGhlIGZpZWxkIHdpdGhpbiB0aGUKKwkgKiByZWdpb24uICBJdCBpcyB0aGUgYnl0ZSBhZGRyZXNzIG9mIHRoZSBmaXJzdCAqZGF0dW0qIChmaWVsZC13aWR0aCBkYXRhCisJICogdW5pdCkgb2YgdGhlIGZpZWxkLiAoaS5lLiwgdGhlIGZpcnN0IGRhdHVtIHRoYXQgY29udGFpbnMgYXQgbGVhc3QgdGhlCisJICogZmlyc3QgKmJpdCogb2YgdGhlIGZpZWxkLikKKwkgKgorCSAqIE5vdGU6IGJ5dGVfYWxpZ25tZW50IGlzIGFsd2F5cyBlaXRoZXIgZXF1YWwgdG8gdGhlIGFjY2Vzc19iaXRfd2lkdGggb3IgOAorCSAqIChCeXRlIGFjY2VzcyksIGFuZCBpdCBkZWZpbmVzIHRoZSBhZGRyZXNzaW5nIGdyYW51bGFyaXR5IG9mIHRoZSBwYXJlbnQKKwkgKiByZWdpb24gb3IgYnVmZmVyLgorCSAqLworCW5lYXJlc3RfYnl0ZV9hZGRyZXNzID0KKwkgICAgQUNQSV9ST1VORF9CSVRTX0RPV05fVE9fQllURVMoZmllbGRfYml0X3Bvc2l0aW9uKTsKKwlvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmJhc2VfYnl0ZV9vZmZzZXQgPSAodTMyKQorCSAgICBBQ1BJX1JPVU5EX0RPV04obmVhcmVzdF9ieXRlX2FkZHJlc3MsIGJ5dGVfYWxpZ25tZW50KTsKKworCS8qCisJICogc3RhcnRfZmllbGRfYml0X29mZnNldCBpcyB0aGUgb2Zmc2V0IG9mIHRoZSBmaXJzdCBiaXQgb2YgdGhlIGZpZWxkIHdpdGhpbgorCSAqIGEgZmllbGQgZGF0dW0uCisJICovCisJb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5zdGFydF9maWVsZF9iaXRfb2Zmc2V0ID0gKHU4KQorCSAgICAoZmllbGRfYml0X3Bvc2l0aW9uIC0KKwkgICAgIEFDUElfTVVMXzgob2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5iYXNlX2J5dGVfb2Zmc2V0KSk7CisKKwkvKgorCSAqIERvZXMgdGhlIGVudGlyZSBmaWVsZCBmaXQgd2l0aGluIGEgc2luZ2xlIGZpZWxkIGFjY2VzcyBlbGVtZW50PyAoZGF0dW0pCisJICogKGkuZS4sIHdpdGhvdXQgY3Jvc3NpbmcgYSBkYXR1bSBib3VuZGFyeSkKKwkgKi8KKwlpZiAoKG9ial9kZXNjLT5jb21tb25fZmllbGQuc3RhcnRfZmllbGRfYml0X29mZnNldCArCisJICAgICBmaWVsZF9iaXRfbGVuZ3RoKSA8PSAodTE2KSBhY2Nlc3NfYml0X3dpZHRoKSB7CisJCW9ial9kZXNjLT5jb21tb24uZmxhZ3MgfD0gQU9QT0JKX1NJTkdMRV9EQVRVTTsKKwl9CisKKwlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X3ByZXBfZmllbGRfdmFsdWUKKyAqCisgKiBQQVJBTUVURVJTOiAgSW5mbyAgICAtIENvbnRhaW5zIGFsbCBmaWVsZCBjcmVhdGlvbiBpbmZvCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBDb25zdHJ1Y3QgYSB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0IG9mIHR5cGUgZGVmX2ZpZWxkIGFuZAorICogICAgICAgICAgICAgIGNvbm5lY3QgaXQgdG8gdGhlIHBhcmVudCBOb2RlLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2FjcGlfc3RhdHVzIGFjcGlfZXhfcHJlcF9maWVsZF92YWx1ZShzdHJ1Y3QgYWNwaV9jcmVhdGVfZmllbGRfaW5mbyAqaW5mbykKK3sKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYzsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpzZWNvbmRfZGVzYyA9IE5VTEw7CisJdTMyIHR5cGU7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCisJQUNQSV9GVU5DVElPTl9UUkFDRShleF9wcmVwX2ZpZWxkX3ZhbHVlKTsKKworCS8qIFBhcmFtZXRlciB2YWxpZGF0aW9uICovCisKKwlpZiAoaW5mby0+ZmllbGRfdHlwZSAhPSBBQ1BJX1RZUEVfTE9DQUxfSU5ERVhfRklFTEQpIHsKKwkJaWYgKCFpbmZvLT5yZWdpb25fbm9kZSkgeworCQkJQUNQSV9FUlJPUigoQUVfSU5GTywgIk51bGwgUmVnaW9uTm9kZSIpKTsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfTk9fT1BFUkFORCk7CisJCX0KKworCQl0eXBlID0gYWNwaV9uc19nZXRfdHlwZShpbmZvLT5yZWdpb25fbm9kZSk7CisJCWlmICh0eXBlICE9IEFDUElfVFlQRV9SRUdJT04pIHsKKwkJCUFDUElfRVJST1IoKEFFX0lORk8sCisJCQkJICAgICJOZWVkZWQgUmVnaW9uLCBmb3VuZCB0eXBlICVYICglcykiLAorCQkJCSAgICB0eXBlLCBhY3BpX3V0X2dldF90eXBlX25hbWUodHlwZSkpKTsKKworCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9PUEVSQU5EX1RZUEUpOworCQl9CisJfQorCisJLyogQWxsb2NhdGUgYSBuZXcgZmllbGQgb2JqZWN0ICovCisKKwlvYmpfZGVzYyA9IGFjcGlfdXRfY3JlYXRlX2ludGVybmFsX29iamVjdChpbmZvLT5maWVsZF90eXBlKTsKKwlpZiAoIW9ial9kZXNjKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT19NRU1PUlkpOworCX0KKworCS8qIEluaXRpYWxpemUgYXJlYXMgb2YgdGhlIG9iamVjdCB0aGF0IGFyZSBjb21tb24gdG8gYWxsIGZpZWxkcyAqLworCisJb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5ub2RlID0gaW5mby0+ZmllbGRfbm9kZTsKKwlzdGF0dXMgPSBhY3BpX2V4X3ByZXBfY29tbW9uX2ZpZWxkX29iamVjdChvYmpfZGVzYywgaW5mby0+ZmllbGRfZmxhZ3MsCisJCQkJCQkgIGluZm8tPmF0dHJpYnV0ZSwKKwkJCQkJCSAgaW5mby0+ZmllbGRfYml0X3Bvc2l0aW9uLAorCQkJCQkJICBpbmZvLT5maWVsZF9iaXRfbGVuZ3RoKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJYWNwaV91dF9kZWxldGVfb2JqZWN0X2Rlc2Mob2JqX2Rlc2MpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKKwl9CisKKwkvKiBJbml0aWFsaXplIGFyZWFzIG9mIHRoZSBvYmplY3QgdGhhdCBhcmUgc3BlY2lmaWMgdG8gdGhlIGZpZWxkIHR5cGUgKi8KKworCXN3aXRjaCAoaW5mby0+ZmllbGRfdHlwZSkgeworCWNhc2UgQUNQSV9UWVBFX0xPQ0FMX1JFR0lPTl9GSUVMRDoKKworCQlvYmpfZGVzYy0+ZmllbGQucmVnaW9uX29iaiA9CisJCSAgICBhY3BpX25zX2dldF9hdHRhY2hlZF9vYmplY3QoaW5mby0+cmVnaW9uX25vZGUpOworCisJCS8qIEFuIGFkZGl0aW9uYWwgcmVmZXJlbmNlIGZvciB0aGUgY29udGFpbmVyICovCisKKwkJYWNwaV91dF9hZGRfcmVmZXJlbmNlKG9ial9kZXNjLT5maWVsZC5yZWdpb25fb2JqKTsKKworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0JGSUVMRCwKKwkJCQkgICJSZWdpb25GaWVsZDogQml0T2ZmICVYLCBPZmYgJVgsIEdyYW4gJVgsIFJlZ2lvbiAlcFxuIiwKKwkJCQkgIG9ial9kZXNjLT5maWVsZC5zdGFydF9maWVsZF9iaXRfb2Zmc2V0LAorCQkJCSAgb2JqX2Rlc2MtPmZpZWxkLmJhc2VfYnl0ZV9vZmZzZXQsCisJCQkJICBvYmpfZGVzYy0+ZmllbGQuYWNjZXNzX2J5dGVfd2lkdGgsCisJCQkJICBvYmpfZGVzYy0+ZmllbGQucmVnaW9uX29iaikpOworCQlicmVhazsKKworCWNhc2UgQUNQSV9UWVBFX0xPQ0FMX0JBTktfRklFTEQ6CisKKwkJb2JqX2Rlc2MtPmJhbmtfZmllbGQudmFsdWUgPSBpbmZvLT5iYW5rX3ZhbHVlOworCQlvYmpfZGVzYy0+YmFua19maWVsZC5yZWdpb25fb2JqID0KKwkJICAgIGFjcGlfbnNfZ2V0X2F0dGFjaGVkX29iamVjdChpbmZvLT5yZWdpb25fbm9kZSk7CisJCW9ial9kZXNjLT5iYW5rX2ZpZWxkLmJhbmtfb2JqID0KKwkJICAgIGFjcGlfbnNfZ2V0X2F0dGFjaGVkX29iamVjdChpbmZvLT5yZWdpc3Rlcl9ub2RlKTsKKworCQkvKiBBbiBhZGRpdGlvbmFsIHJlZmVyZW5jZSBmb3IgdGhlIGF0dGFjaGVkIG9iamVjdHMgKi8KKworCQlhY3BpX3V0X2FkZF9yZWZlcmVuY2Uob2JqX2Rlc2MtPmJhbmtfZmllbGQucmVnaW9uX29iaik7CisJCWFjcGlfdXRfYWRkX3JlZmVyZW5jZShvYmpfZGVzYy0+YmFua19maWVsZC5iYW5rX29iaik7CisKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9CRklFTEQsCisJCQkJICAiQmFuayBGaWVsZDogQml0T2ZmICVYLCBPZmYgJVgsIEdyYW4gJVgsIFJlZ2lvbiAlcCwgQmFua1JlZyAlcFxuIiwKKwkJCQkgIG9ial9kZXNjLT5iYW5rX2ZpZWxkLnN0YXJ0X2ZpZWxkX2JpdF9vZmZzZXQsCisJCQkJICBvYmpfZGVzYy0+YmFua19maWVsZC5iYXNlX2J5dGVfb2Zmc2V0LAorCQkJCSAgb2JqX2Rlc2MtPmZpZWxkLmFjY2Vzc19ieXRlX3dpZHRoLAorCQkJCSAgb2JqX2Rlc2MtPmJhbmtfZmllbGQucmVnaW9uX29iaiwKKwkJCQkgIG9ial9kZXNjLT5iYW5rX2ZpZWxkLmJhbmtfb2JqKSk7CisKKwkJLyoKKwkJICogUmVtZW1iZXIgbG9jYXRpb24gaW4gQU1MIHN0cmVhbSBvZiB0aGUgZmllbGQgdW5pdAorCQkgKiBvcGNvZGUgYW5kIG9wZXJhbmRzIC0tIHNpbmNlIHRoZSBiYW5rX3ZhbHVlCisJCSAqIG9wZXJhbmRzIG11c3QgYmUgZXZhbHVhdGVkLgorCQkgKi8KKwkJc2Vjb25kX2Rlc2MgPSBvYmpfZGVzYy0+Y29tbW9uLm5leHRfb2JqZWN0OworCQlzZWNvbmRfZGVzYy0+ZXh0cmEuYW1sX3N0YXJ0ID0KKwkJICAgIEFDUElfQ0FTVF9QVFIodW5pb24gYWNwaV9wYXJzZV9vYmplY3QsCisJCQkJICBpbmZvLT5kYXRhX3JlZ2lzdGVyX25vZGUpLT5uYW1lZC5kYXRhOworCQlzZWNvbmRfZGVzYy0+ZXh0cmEuYW1sX2xlbmd0aCA9CisJCSAgICBBQ1BJX0NBU1RfUFRSKHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0LAorCQkJCSAgaW5mby0+ZGF0YV9yZWdpc3Rlcl9ub2RlKS0+bmFtZWQubGVuZ3RoOworCisJCWJyZWFrOworCisJY2FzZSBBQ1BJX1RZUEVfTE9DQUxfSU5ERVhfRklFTEQ6CisKKwkJLyogR2V0IHRoZSBJbmRleCBhbmQgRGF0YSByZWdpc3RlcnMgKi8KKworCQlvYmpfZGVzYy0+aW5kZXhfZmllbGQuaW5kZXhfb2JqID0KKwkJICAgIGFjcGlfbnNfZ2V0X2F0dGFjaGVkX29iamVjdChpbmZvLT5yZWdpc3Rlcl9ub2RlKTsKKwkJb2JqX2Rlc2MtPmluZGV4X2ZpZWxkLmRhdGFfb2JqID0KKwkJICAgIGFjcGlfbnNfZ2V0X2F0dGFjaGVkX29iamVjdChpbmZvLT5kYXRhX3JlZ2lzdGVyX25vZGUpOworCisJCWlmICghb2JqX2Rlc2MtPmluZGV4X2ZpZWxkLmRhdGFfb2JqCisJCSAgICB8fCAhb2JqX2Rlc2MtPmluZGV4X2ZpZWxkLmluZGV4X29iaikgeworCQkJQUNQSV9FUlJPUigoQUVfSU5GTywKKwkJCQkgICAgIk51bGwgSW5kZXggT2JqZWN0IGR1cmluZyBmaWVsZCBwcmVwIikpOworCQkJYWNwaV91dF9kZWxldGVfb2JqZWN0X2Rlc2Mob2JqX2Rlc2MpOworCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9JTlRFUk5BTCk7CisJCX0KKworCQkvKiBBbiBhZGRpdGlvbmFsIHJlZmVyZW5jZSBmb3IgdGhlIGF0dGFjaGVkIG9iamVjdHMgKi8KKworCQlhY3BpX3V0X2FkZF9yZWZlcmVuY2Uob2JqX2Rlc2MtPmluZGV4X2ZpZWxkLmRhdGFfb2JqKTsKKwkJYWNwaV91dF9hZGRfcmVmZXJlbmNlKG9ial9kZXNjLT5pbmRleF9maWVsZC5pbmRleF9vYmopOworCisJCS8qCisJCSAqIEFwcmlsIDIwMDY6IENoYW5nZWQgdG8gbWF0Y2ggTVMgYmVoYXZpb3IKKwkJICoKKwkJICogVGhlIHZhbHVlIHdyaXR0ZW4gdG8gdGhlIEluZGV4IHJlZ2lzdGVyIGlzIHRoZSBieXRlIG9mZnNldCBvZiB0aGUKKwkJICogdGFyZ2V0IGZpZWxkIGluIHVuaXRzIG9mIHRoZSBncmFudWxhcml0eSBvZiB0aGUgaW5kZXhfZmllbGQKKwkJICoKKwkJICogUHJldmlvdXNseSwgdGhlIHZhbHVlIHdhcyBjYWxjdWxhdGVkIGFzIGFuIGluZGV4IGluIHRlcm1zIG9mIHRoZQorCQkgKiB3aWR0aCBvZiB0aGUgRGF0YSByZWdpc3RlciwgYXMgYmVsb3c6CisJCSAqCisJCSAqICAgICAgb2JqX2Rlc2MtPmluZGV4X2ZpZWxkLlZhbHVlID0gKHUzMikKKwkJICogICAgICAgICAgKEluZm8tPmZpZWxkX2JpdF9wb3NpdGlvbiAvIEFDUElfTVVMXzggKAorCQkgKiAgICAgICAgICAgICAgb2JqX2Rlc2MtPkZpZWxkLmFjY2Vzc19ieXRlX3dpZHRoKSk7CisJCSAqCisJCSAqIEZlYnJ1YXJ5IDIwMDY6IFRyaWVkIHZhbHVlIGFzIGEgYnl0ZSBvZmZzZXQ6CisJCSAqICAgICAgb2JqX2Rlc2MtPmluZGV4X2ZpZWxkLlZhbHVlID0gKHUzMikKKwkJICogICAgICAgICAgQUNQSV9ESVZfOCAoSW5mby0+ZmllbGRfYml0X3Bvc2l0aW9uKTsKKwkJICovCisJCW9ial9kZXNjLT5pbmRleF9maWVsZC52YWx1ZSA9CisJCSAgICAodTMyKSBBQ1BJX1JPVU5EX0RPV04oQUNQSV9ESVZfOChpbmZvLT5maWVsZF9iaXRfcG9zaXRpb24pLAorCQkJCQkgIG9ial9kZXNjLT5pbmRleF9maWVsZC4KKwkJCQkJICBhY2Nlc3NfYnl0ZV93aWR0aCk7CisKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9CRklFTEQsCisJCQkJICAiSW5kZXhGaWVsZDogQml0T2ZmICVYLCBPZmYgJVgsIFZhbHVlICVYLCBHcmFuICVYLCBJbmRleCAlcCwgRGF0YSAlcFxuIiwKKwkJCQkgIG9ial9kZXNjLT5pbmRleF9maWVsZC5zdGFydF9maWVsZF9iaXRfb2Zmc2V0LAorCQkJCSAgb2JqX2Rlc2MtPmluZGV4X2ZpZWxkLmJhc2VfYnl0ZV9vZmZzZXQsCisJCQkJICBvYmpfZGVzYy0+aW5kZXhfZmllbGQudmFsdWUsCisJCQkJICBvYmpfZGVzYy0+ZmllbGQuYWNjZXNzX2J5dGVfd2lkdGgsCisJCQkJICBvYmpfZGVzYy0+aW5kZXhfZmllbGQuaW5kZXhfb2JqLAorCQkJCSAgb2JqX2Rlc2MtPmluZGV4X2ZpZWxkLmRhdGFfb2JqKSk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJLyogTm8gb3RoZXIgdHlwZXMgc2hvdWxkIGdldCBoZXJlICovCisJCWJyZWFrOworCX0KKworCS8qCisJICogU3RvcmUgdGhlIGNvbnN0cnVjdGVkIGRlc2NyaXB0b3IgKG9ial9kZXNjKSBpbnRvIHRoZSBwYXJlbnQgTm9kZSwKKwkgKiBwcmVzZXJ2aW5nIHRoZSBjdXJyZW50IHR5cGUgb2YgdGhhdCBuYW1lZF9vYmouCisJICovCisJc3RhdHVzID0gYWNwaV9uc19hdHRhY2hfb2JqZWN0KGluZm8tPmZpZWxkX25vZGUsIG9ial9kZXNjLAorCQkJCSAgICAgICBhY3BpX25zX2dldF90eXBlKGluZm8tPmZpZWxkX25vZGUpKTsKKworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfQkZJRUxELAorCQkJICAiU2V0IE5hbWVkT2JqICVwIFslNC40c10sIE9iakRlc2MgJXBcbiIsCisJCQkgIGluZm8tPmZpZWxkX25vZGUsCisJCQkgIGFjcGlfdXRfZ2V0X25vZGVfbmFtZShpbmZvLT5maWVsZF9ub2RlKSwgb2JqX2Rlc2MpKTsKKworCS8qIFJlbW92ZSBsb2NhbCByZWZlcmVuY2UgdG8gdGhlIG9iamVjdCAqLworCisJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKG9ial9kZXNjKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXhyZWdpb24uYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXhyZWdpb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NmVjOGZmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS9leHJlZ2lvbi5jCkBAIC0wLDAgKzEsNDk5IEBACisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBNb2R1bGUgTmFtZTogZXhyZWdpb24gLSBBQ1BJIGRlZmF1bHQgb3BfcmVnaW9uIChhZGRyZXNzIHNwYWNlKSBoYW5kbGVycworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDgsIEludGVsIENvcnAuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCisgKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSBhdCBtaW5pbXVtIGEgZGlzY2xhaW1lcgorICogICAgc3Vic3RhbnRpYWxseSBzaW1pbGFyIHRvIHRoZSAiTk8gV0FSUkFOVFkiIGRpc2NsYWltZXIgYmVsb3cKKyAqICAgICgiRGlzY2xhaW1lciIpIGFuZCBhbnkgcmVkaXN0cmlidXRpb24gbXVzdCBiZSBjb25kaXRpb25lZCB1cG9uCisgKiAgICBpbmNsdWRpbmcgYSBzdWJzdGFudGlhbGx5IHNpbWlsYXIgRGlzY2xhaW1lciByZXF1aXJlbWVudCBmb3IgZnVydGhlcgorICogICAgYmluYXJ5IHJlZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzCisgKiAgICBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIE5PIFdBUlJBTlRZCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORworICogSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCisgKi8KKworI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgorI2luY2x1ZGUgImFjY29tbW9uLmgiCisjaW5jbHVkZSAiYWNpbnRlcnAuaCIKKworI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfRVhFQ1VURVIKK0FDUElfTU9EVUxFX05BTUUoImV4cmVnaW9uIikKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9leF9zeXN0ZW1fbWVtb3J5X3NwYWNlX2hhbmRsZXIKKyAqCisgKiBQQVJBTUVURVJTOiAgRnVuY3Rpb24gICAgICAgICAgICAtIFJlYWQgb3IgV3JpdGUgb3BlcmF0aW9uCisgKiAgICAgICAgICAgICAgQWRkcmVzcyAgICAgICAgICAgICAtIFdoZXJlIGluIHRoZSBzcGFjZSB0byByZWFkIG9yIHdyaXRlCisgKiAgICAgICAgICAgICAgYml0X3dpZHRoICAgICAgICAgICAtIEZpZWxkIHdpZHRoIGluIGJpdHMgKDgsIDE2LCBvciAzMikKKyAqICAgICAgICAgICAgICBWYWx1ZSAgICAgICAgICAgICAgIC0gUG9pbnRlciB0byBpbiBvciBvdXQgdmFsdWUKKyAqICAgICAgICAgICAgICBoYW5kbGVyX2NvbnRleHQgICAgIC0gUG9pbnRlciB0byBIYW5kbGVyJ3MgY29udGV4dAorICogICAgICAgICAgICAgIHJlZ2lvbl9jb250ZXh0ICAgICAgLSBQb2ludGVyIHRvIGNvbnRleHQgc3BlY2lmaWMgdG8gdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY2Vzc2VkIHJlZ2lvbgorICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogSGFuZGxlciBmb3IgdGhlIFN5c3RlbSBNZW1vcnkgYWRkcmVzcyBzcGFjZSAoT3AgUmVnaW9uKQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCithY3BpX3N0YXR1cworYWNwaV9leF9zeXN0ZW1fbWVtb3J5X3NwYWNlX2hhbmRsZXIodTMyIGZ1bmN0aW9uLAorCQkJCSAgICBhY3BpX3BoeXNpY2FsX2FkZHJlc3MgYWRkcmVzcywKKwkJCQkgICAgdTMyIGJpdF93aWR0aCwKKwkJCQkgICAgYWNwaV9pbnRlZ2VyICogdmFsdWUsCisJCQkJICAgIHZvaWQgKmhhbmRsZXJfY29udGV4dCwgdm9pZCAqcmVnaW9uX2NvbnRleHQpCit7CisJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CisJdm9pZCAqbG9naWNhbF9hZGRyX3B0ciA9IE5VTEw7CisJc3RydWN0IGFjcGlfbWVtX3NwYWNlX2NvbnRleHQgKm1lbV9pbmZvID0gcmVnaW9uX2NvbnRleHQ7CisJdTMyIGxlbmd0aDsKKwlhY3BpX3NpemUgd2luZG93X3NpemU7CisjaWZkZWYgQUNQSV9NSVNBTElHTk1FTlRfTk9UX1NVUFBPUlRFRAorCXUzMiByZW1haW5kZXI7CisjZW5kaWYKKworCUFDUElfRlVOQ1RJT05fVFJBQ0UoZXhfc3lzdGVtX21lbW9yeV9zcGFjZV9oYW5kbGVyKTsKKworCS8qIFZhbGlkYXRlIGFuZCB0cmFuc2xhdGUgdGhlIGJpdCB3aWR0aCAqLworCisJc3dpdGNoIChiaXRfd2lkdGgpIHsKKwljYXNlIDg6CisJCWxlbmd0aCA9IDE7CisJCWJyZWFrOworCisJY2FzZSAxNjoKKwkJbGVuZ3RoID0gMjsKKwkJYnJlYWs7CisKKwljYXNlIDMyOgorCQlsZW5ndGggPSA0OworCQlicmVhazsKKworCWNhc2UgNjQ6CisJCWxlbmd0aCA9IDg7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJQUNQSV9FUlJPUigoQUVfSU5GTywgIkludmFsaWQgU3lzdGVtTWVtb3J5IHdpZHRoICVkIiwKKwkJCSAgICBiaXRfd2lkdGgpKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9PUEVSQU5EX1ZBTFVFKTsKKwl9CisKKyNpZmRlZiBBQ1BJX01JU0FMSUdOTUVOVF9OT1RfU1VQUE9SVEVECisJLyoKKwkgKiBIYXJkd2FyZSBkb2VzIG5vdCBzdXBwb3J0IG5vbi1hbGlnbmVkIGRhdGEgdHJhbnNmZXJzLCB3ZSBtdXN0IHZlcmlmeQorCSAqIHRoZSByZXF1ZXN0LgorCSAqLworCSh2b2lkKWFjcGlfdXRfc2hvcnRfZGl2aWRlKChhY3BpX2ludGVnZXIpIGFkZHJlc3MsIGxlbmd0aCwgTlVMTCwKKwkJCQkgICAmcmVtYWluZGVyKTsKKwlpZiAocmVtYWluZGVyICE9IDApIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9BTElHTk1FTlQpOworCX0KKyNlbmRpZgorCisJLyoKKwkgKiBEb2VzIHRoZSByZXF1ZXN0IGZpdCBpbnRvIHRoZSBjYWNoZWQgbWVtb3J5IG1hcHBpbmc/CisJICogSXMgMSkgQWRkcmVzcyBiZWxvdyB0aGUgY3VycmVudCBtYXBwaW5nPyBPUgorCSAqICAgIDIpIEFkZHJlc3MgYmV5b25kIHRoZSBjdXJyZW50IG1hcHBpbmc/CisJICovCisJaWYgKChhZGRyZXNzIDwgbWVtX2luZm8tPm1hcHBlZF9waHlzaWNhbF9hZGRyZXNzKSB8fAorCSAgICAoKChhY3BpX2ludGVnZXIpIGFkZHJlc3MgKyBsZW5ndGgpID4gKChhY3BpX2ludGVnZXIpCisJCQkJCQkgIG1lbV9pbmZvLT4KKwkJCQkJCSAgbWFwcGVkX3BoeXNpY2FsX2FkZHJlc3MgKworCQkJCQkJICBtZW1faW5mby0+bWFwcGVkX2xlbmd0aCkpKSB7CisJCS8qCisJCSAqIFRoZSByZXF1ZXN0IGNhbm5vdCBiZSByZXNvbHZlZCBieSB0aGUgY3VycmVudCBtZW1vcnkgbWFwcGluZzsKKwkJICogRGVsZXRlIHRoZSBleGlzdGluZyBtYXBwaW5nIGFuZCBjcmVhdGUgYSBuZXcgb25lLgorCQkgKi8KKwkJaWYgKG1lbV9pbmZvLT5tYXBwZWRfbGVuZ3RoKSB7CisKKwkJCS8qIFZhbGlkIG1hcHBpbmcsIGRlbGV0ZSBpdCAqLworCisJCQlhY3BpX29zX3VubWFwX21lbW9yeShtZW1faW5mby0+bWFwcGVkX2xvZ2ljYWxfYWRkcmVzcywKKwkJCQkJICAgICBtZW1faW5mby0+bWFwcGVkX2xlbmd0aCk7CisJCX0KKworCQkvKgorCQkgKiBEb24ndCBhdHRlbXB0IHRvIG1hcCBtZW1vcnkgYmV5b25kIHRoZSBlbmQgb2YgdGhlIHJlZ2lvbiwgYW5kCisJCSAqIGNvbnN0cmFpbiB0aGUgbWF4aW11bSBtYXBwaW5nIHNpemUgdG8gc29tZXRoaW5nIHJlYXNvbmFibGUuCisJCSAqLworCQl3aW5kb3dfc2l6ZSA9IChhY3BpX3NpemUpCisJCSAgICAoKG1lbV9pbmZvLT5hZGRyZXNzICsgbWVtX2luZm8tPmxlbmd0aCkgLSBhZGRyZXNzKTsKKworCQlpZiAod2luZG93X3NpemUgPiBBQ1BJX1NZU01FTV9SRUdJT05fV0lORE9XX1NJWkUpIHsKKwkJCXdpbmRvd19zaXplID0gQUNQSV9TWVNNRU1fUkVHSU9OX1dJTkRPV19TSVpFOworCQl9CisKKwkJLyogQ3JlYXRlIGEgbmV3IG1hcHBpbmcgc3RhcnRpbmcgYXQgdGhlIGFkZHJlc3MgZ2l2ZW4gKi8KKworCQltZW1faW5mby0+bWFwcGVkX2xvZ2ljYWxfYWRkcmVzcyA9CisJCQlhY3BpX29zX21hcF9tZW1vcnkoKGFjcGlfcGh5c2ljYWxfYWRkcmVzcykgYWRkcmVzcywgd2luZG93X3NpemUpOworCQlpZiAoIW1lbV9pbmZvLT5tYXBwZWRfbG9naWNhbF9hZGRyZXNzKSB7CisJCQlBQ1BJX0VSUk9SKChBRV9JTkZPLAorCQkJCSAgICAiQ291bGQgbm90IG1hcCBtZW1vcnkgYXQgJTguOFglOC44WCwgc2l6ZSAlWCIsCisJCQkJICAgIEFDUElfRk9STUFUX05BVElWRV9VSU5UKGFkZHJlc3MpLAorCQkJCSAgICAodTMyKSB3aW5kb3dfc2l6ZSkpOworCQkJbWVtX2luZm8tPm1hcHBlZF9sZW5ndGggPSAwOworCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX01FTU9SWSk7CisJCX0KKworCQkvKiBTYXZlIHRoZSBwaHlzaWNhbCBhZGRyZXNzIGFuZCBtYXBwaW5nIHNpemUgKi8KKworCQltZW1faW5mby0+bWFwcGVkX3BoeXNpY2FsX2FkZHJlc3MgPSBhZGRyZXNzOworCQltZW1faW5mby0+bWFwcGVkX2xlbmd0aCA9IHdpbmRvd19zaXplOworCX0KKworCS8qCisJICogR2VuZXJhdGUgYSBsb2dpY2FsIHBvaW50ZXIgY29ycmVzcG9uZGluZyB0byB0aGUgYWRkcmVzcyB3ZSB3YW50IHRvCisJICogYWNjZXNzCisJICovCisJbG9naWNhbF9hZGRyX3B0ciA9IG1lbV9pbmZvLT5tYXBwZWRfbG9naWNhbF9hZGRyZXNzICsKKwkgICAgKChhY3BpX2ludGVnZXIpIGFkZHJlc3MgLQorCSAgICAgKGFjcGlfaW50ZWdlcikgbWVtX2luZm8tPm1hcHBlZF9waHlzaWNhbF9hZGRyZXNzKTsKKworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywKKwkJCSAgIlN5c3RlbS1NZW1vcnkgKHdpZHRoICVkKSBSL1cgJWQgQWRkcmVzcz0lOC44WCU4LjhYXG4iLAorCQkJICBiaXRfd2lkdGgsIGZ1bmN0aW9uLAorCQkJICBBQ1BJX0ZPUk1BVF9OQVRJVkVfVUlOVChhZGRyZXNzKSkpOworCisJLyoKKwkgKiBQZXJmb3JtIHRoZSBtZW1vcnkgcmVhZCBvciB3cml0ZQorCSAqCisJICogTm90ZTogRm9yIG1hY2hpbmVzIHRoYXQgZG8gbm90IHN1cHBvcnQgbm9uLWFsaWduZWQgdHJhbnNmZXJzLCB0aGUgdGFyZ2V0CisJICogYWRkcmVzcyB3YXMgY2hlY2tlZCBmb3IgYWxpZ25tZW50IGFib3ZlLiAgV2UgZG8gbm90IGF0dGVtcHQgdG8gYnJlYWsgdGhlCisJICogdHJhbnNmZXIgdXAgaW50byBzbWFsbGVyIChieXRlLXNpemUpIGNodW5rcyBiZWNhdXNlIHRoZSBBTUwgc3BlY2lmaWNhbGx5CisJICogYXNrZWQgZm9yIGEgdHJhbnNmZXIgd2lkdGggdGhhdCB0aGUgaGFyZHdhcmUgbWF5IHJlcXVpcmUuCisJICovCisJc3dpdGNoIChmdW5jdGlvbikgeworCWNhc2UgQUNQSV9SRUFEOgorCisJCSp2YWx1ZSA9IDA7CisJCXN3aXRjaCAoYml0X3dpZHRoKSB7CisJCWNhc2UgODoKKwkJCSp2YWx1ZSA9IChhY3BpX2ludGVnZXIpIEFDUElfR0VUOChsb2dpY2FsX2FkZHJfcHRyKTsKKwkJCWJyZWFrOworCisJCWNhc2UgMTY6CisJCQkqdmFsdWUgPSAoYWNwaV9pbnRlZ2VyKSBBQ1BJX0dFVDE2KGxvZ2ljYWxfYWRkcl9wdHIpOworCQkJYnJlYWs7CisKKwkJY2FzZSAzMjoKKwkJCSp2YWx1ZSA9IChhY3BpX2ludGVnZXIpIEFDUElfR0VUMzIobG9naWNhbF9hZGRyX3B0cik7CisJCQlicmVhazsKKworCQljYXNlIDY0OgorCQkJKnZhbHVlID0gKGFjcGlfaW50ZWdlcikgQUNQSV9HRVQ2NChsb2dpY2FsX2FkZHJfcHRyKTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQkvKiBiaXRfd2lkdGggd2FzIGFscmVhZHkgdmFsaWRhdGVkICovCisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKworCWNhc2UgQUNQSV9XUklURToKKworCQlzd2l0Y2ggKGJpdF93aWR0aCkgeworCQljYXNlIDg6CisJCQlBQ1BJX1NFVDgobG9naWNhbF9hZGRyX3B0cikgPSAodTgpICogdmFsdWU7CisJCQlicmVhazsKKworCQljYXNlIDE2OgorCQkJQUNQSV9TRVQxNihsb2dpY2FsX2FkZHJfcHRyKSA9ICh1MTYpICogdmFsdWU7CisJCQlicmVhazsKKworCQljYXNlIDMyOgorCQkJQUNQSV9TRVQzMihsb2dpY2FsX2FkZHJfcHRyKSA9ICh1MzIpICogdmFsdWU7CisJCQlicmVhazsKKworCQljYXNlIDY0OgorCQkJQUNQSV9TRVQ2NChsb2dpY2FsX2FkZHJfcHRyKSA9ICh1NjQpICogdmFsdWU7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJLyogYml0X3dpZHRoIHdhcyBhbHJlYWR5IHZhbGlkYXRlZCAqLworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlzdGF0dXMgPSBBRV9CQURfUEFSQU1FVEVSOworCQlicmVhazsKKwl9CisKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9leF9zeXN0ZW1faW9fc3BhY2VfaGFuZGxlcgorICoKKyAqIFBBUkFNRVRFUlM6ICBGdW5jdGlvbiAgICAgICAgICAgIC0gUmVhZCBvciBXcml0ZSBvcGVyYXRpb24KKyAqICAgICAgICAgICAgICBBZGRyZXNzICAgICAgICAgICAgIC0gV2hlcmUgaW4gdGhlIHNwYWNlIHRvIHJlYWQgb3Igd3JpdGUKKyAqICAgICAgICAgICAgICBiaXRfd2lkdGggICAgICAgICAgIC0gRmllbGQgd2lkdGggaW4gYml0cyAoOCwgMTYsIG9yIDMyKQorICogICAgICAgICAgICAgIFZhbHVlICAgICAgICAgICAgICAgLSBQb2ludGVyIHRvIGluIG9yIG91dCB2YWx1ZQorICogICAgICAgICAgICAgIGhhbmRsZXJfY29udGV4dCAgICAgLSBQb2ludGVyIHRvIEhhbmRsZXIncyBjb250ZXh0CisgKiAgICAgICAgICAgICAgcmVnaW9uX2NvbnRleHQgICAgICAtIFBvaW50ZXIgdG8gY29udGV4dCBzcGVjaWZpYyB0byB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjZXNzZWQgcmVnaW9uCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBIYW5kbGVyIGZvciB0aGUgU3lzdGVtIElPIGFkZHJlc3Mgc3BhY2UgKE9wIFJlZ2lvbikKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCithY3BpX3N0YXR1cworYWNwaV9leF9zeXN0ZW1faW9fc3BhY2VfaGFuZGxlcih1MzIgZnVuY3Rpb24sCisJCQkJYWNwaV9waHlzaWNhbF9hZGRyZXNzIGFkZHJlc3MsCisJCQkJdTMyIGJpdF93aWR0aCwKKwkJCQlhY3BpX2ludGVnZXIgKiB2YWx1ZSwKKwkJCQl2b2lkICpoYW5kbGVyX2NvbnRleHQsIHZvaWQgKnJlZ2lvbl9jb250ZXh0KQoreworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOworCXUzMiB2YWx1ZTMyOworCisJQUNQSV9GVU5DVElPTl9UUkFDRShleF9zeXN0ZW1faW9fc3BhY2VfaGFuZGxlcik7CisKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sCisJCQkgICJTeXN0ZW0tSU8gKHdpZHRoICVkKSBSL1cgJWQgQWRkcmVzcz0lOC44WCU4LjhYXG4iLAorCQkJICBiaXRfd2lkdGgsIGZ1bmN0aW9uLAorCQkJICBBQ1BJX0ZPUk1BVF9OQVRJVkVfVUlOVChhZGRyZXNzKSkpOworCisJLyogRGVjb2RlIHRoZSBmdW5jdGlvbiBwYXJhbWV0ZXIgKi8KKworCXN3aXRjaCAoZnVuY3Rpb24pIHsKKwljYXNlIEFDUElfUkVBRDoKKworCQlzdGF0dXMgPSBhY3BpX29zX3JlYWRfcG9ydCgoYWNwaV9pb19hZGRyZXNzKSBhZGRyZXNzLAorCQkJCQkgICAmdmFsdWUzMiwgYml0X3dpZHRoKTsKKwkJKnZhbHVlID0gdmFsdWUzMjsKKwkJYnJlYWs7CisKKwljYXNlIEFDUElfV1JJVEU6CisKKwkJc3RhdHVzID0gYWNwaV9vc193cml0ZV9wb3J0KChhY3BpX2lvX2FkZHJlc3MpIGFkZHJlc3MsCisJCQkJCSAgICAodTMyKSAqIHZhbHVlLCBiaXRfd2lkdGgpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXN0YXR1cyA9IEFFX0JBRF9QQVJBTUVURVI7CisJCWJyZWFrOworCX0KKworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X3BjaV9jb25maWdfc3BhY2VfaGFuZGxlcgorICoKKyAqIFBBUkFNRVRFUlM6ICBGdW5jdGlvbiAgICAgICAgICAgIC0gUmVhZCBvciBXcml0ZSBvcGVyYXRpb24KKyAqICAgICAgICAgICAgICBBZGRyZXNzICAgICAgICAgICAgIC0gV2hlcmUgaW4gdGhlIHNwYWNlIHRvIHJlYWQgb3Igd3JpdGUKKyAqICAgICAgICAgICAgICBiaXRfd2lkdGggICAgICAgICAgIC0gRmllbGQgd2lkdGggaW4gYml0cyAoOCwgMTYsIG9yIDMyKQorICogICAgICAgICAgICAgIFZhbHVlICAgICAgICAgICAgICAgLSBQb2ludGVyIHRvIGluIG9yIG91dCB2YWx1ZQorICogICAgICAgICAgICAgIGhhbmRsZXJfY29udGV4dCAgICAgLSBQb2ludGVyIHRvIEhhbmRsZXIncyBjb250ZXh0CisgKiAgICAgICAgICAgICAgcmVnaW9uX2NvbnRleHQgICAgICAtIFBvaW50ZXIgdG8gY29udGV4dCBzcGVjaWZpYyB0byB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjZXNzZWQgcmVnaW9uCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBIYW5kbGVyIGZvciB0aGUgUENJIENvbmZpZyBhZGRyZXNzIHNwYWNlIChPcCBSZWdpb24pCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworYWNwaV9zdGF0dXMKK2FjcGlfZXhfcGNpX2NvbmZpZ19zcGFjZV9oYW5kbGVyKHUzMiBmdW5jdGlvbiwKKwkJCQkgYWNwaV9waHlzaWNhbF9hZGRyZXNzIGFkZHJlc3MsCisJCQkJIHUzMiBiaXRfd2lkdGgsCisJCQkJIGFjcGlfaW50ZWdlciAqIHZhbHVlLAorCQkJCSB2b2lkICpoYW5kbGVyX2NvbnRleHQsIHZvaWQgKnJlZ2lvbl9jb250ZXh0KQoreworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOworCXN0cnVjdCBhY3BpX3BjaV9pZCAqcGNpX2lkOworCXUxNiBwY2lfcmVnaXN0ZXI7CisJdTMyIHZhbHVlMzI7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGV4X3BjaV9jb25maWdfc3BhY2VfaGFuZGxlcik7CisKKwkvKgorCSAqICBUaGUgYXJndW1lbnRzIHRvIGFjcGlfb3MoUmVhZHxXcml0ZSlwY2lfY29uZmlndXJhdGlvbiBhcmU6CisJICoKKwkgKiAgcGNpX3NlZ21lbnQgaXMgdGhlIFBDSSBidXMgc2VnbWVudCByYW5nZSAwLTMxCisJICogIHBjaV9idXMgICAgIGlzIHRoZSBQQ0kgYnVzIG51bWJlciByYW5nZSAwLTI1NQorCSAqICBwY2lfZGV2aWNlICBpcyB0aGUgUENJIGRldmljZSBudW1iZXIgcmFuZ2UgMC0zMQorCSAqICBwY2lfZnVuY3Rpb24gaXMgdGhlIFBDSSBkZXZpY2UgZnVuY3Rpb24gbnVtYmVyCisJICogIHBjaV9yZWdpc3RlciBpcyB0aGUgQ29uZmlnIHNwYWNlIHJlZ2lzdGVyIHJhbmdlIDAtMjU1IGJ5dGVzCisJICoKKwkgKiAgVmFsdWUgLSBpbnB1dCB2YWx1ZSBmb3Igd3JpdGUsIG91dHB1dCBhZGRyZXNzIGZvciByZWFkCisJICoKKwkgKi8KKwlwY2lfaWQgPSAoc3RydWN0IGFjcGlfcGNpX2lkICopcmVnaW9uX2NvbnRleHQ7CisJcGNpX3JlZ2lzdGVyID0gKHUxNikgKHUzMikgYWRkcmVzczsKKworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywKKwkJCSAgIlBjaS1Db25maWcgJWQgKCVkKSBTZWcoJTA0eCkgQnVzKCUwNHgpIERldiglMDR4KSBGdW5jKCUwNHgpIFJlZyglMDR4KVxuIiwKKwkJCSAgZnVuY3Rpb24sIGJpdF93aWR0aCwgcGNpX2lkLT5zZWdtZW50LCBwY2lfaWQtPmJ1cywKKwkJCSAgcGNpX2lkLT5kZXZpY2UsIHBjaV9pZC0+ZnVuY3Rpb24sIHBjaV9yZWdpc3RlcikpOworCisJc3dpdGNoIChmdW5jdGlvbikgeworCWNhc2UgQUNQSV9SRUFEOgorCisJCXN0YXR1cyA9IGFjcGlfb3NfcmVhZF9wY2lfY29uZmlndXJhdGlvbihwY2lfaWQsIHBjaV9yZWdpc3RlciwKKwkJCQkJCQkmdmFsdWUzMiwgYml0X3dpZHRoKTsKKwkJKnZhbHVlID0gdmFsdWUzMjsKKwkJYnJlYWs7CisKKwljYXNlIEFDUElfV1JJVEU6CisKKwkJc3RhdHVzID0gYWNwaV9vc193cml0ZV9wY2lfY29uZmlndXJhdGlvbihwY2lfaWQsIHBjaV9yZWdpc3RlciwKKwkJCQkJCQkgKnZhbHVlLCBiaXRfd2lkdGgpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisKKwkJc3RhdHVzID0gQUVfQkFEX1BBUkFNRVRFUjsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfZXhfY21vc19zcGFjZV9oYW5kbGVyCisgKgorICogUEFSQU1FVEVSUzogIEZ1bmN0aW9uICAgICAgICAgICAgLSBSZWFkIG9yIFdyaXRlIG9wZXJhdGlvbgorICogICAgICAgICAgICAgIEFkZHJlc3MgICAgICAgICAgICAgLSBXaGVyZSBpbiB0aGUgc3BhY2UgdG8gcmVhZCBvciB3cml0ZQorICogICAgICAgICAgICAgIGJpdF93aWR0aCAgICAgICAgICAgLSBGaWVsZCB3aWR0aCBpbiBiaXRzICg4LCAxNiwgb3IgMzIpCisgKiAgICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgICAtIFBvaW50ZXIgdG8gaW4gb3Igb3V0IHZhbHVlCisgKiAgICAgICAgICAgICAgaGFuZGxlcl9jb250ZXh0ICAgICAtIFBvaW50ZXIgdG8gSGFuZGxlcidzIGNvbnRleHQKKyAqICAgICAgICAgICAgICByZWdpb25fY29udGV4dCAgICAgIC0gUG9pbnRlciB0byBjb250ZXh0IHNwZWNpZmljIHRvIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2Nlc3NlZCByZWdpb24KKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IEhhbmRsZXIgZm9yIHRoZSBDTU9TIGFkZHJlc3Mgc3BhY2UgKE9wIFJlZ2lvbikKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCithY3BpX3N0YXR1cworYWNwaV9leF9jbW9zX3NwYWNlX2hhbmRsZXIodTMyIGZ1bmN0aW9uLAorCQkJICAgYWNwaV9waHlzaWNhbF9hZGRyZXNzIGFkZHJlc3MsCisJCQkgICB1MzIgYml0X3dpZHRoLAorCQkJICAgYWNwaV9pbnRlZ2VyICogdmFsdWUsCisJCQkgICB2b2lkICpoYW5kbGVyX2NvbnRleHQsIHZvaWQgKnJlZ2lvbl9jb250ZXh0KQoreworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOworCisJQUNQSV9GVU5DVElPTl9UUkFDRShleF9jbW9zX3NwYWNlX2hhbmRsZXIpOworCisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfZXhfcGNpX2Jhcl9zcGFjZV9oYW5kbGVyCisgKgorICogUEFSQU1FVEVSUzogIEZ1bmN0aW9uICAgICAgICAgICAgLSBSZWFkIG9yIFdyaXRlIG9wZXJhdGlvbgorICogICAgICAgICAgICAgIEFkZHJlc3MgICAgICAgICAgICAgLSBXaGVyZSBpbiB0aGUgc3BhY2UgdG8gcmVhZCBvciB3cml0ZQorICogICAgICAgICAgICAgIGJpdF93aWR0aCAgICAgICAgICAgLSBGaWVsZCB3aWR0aCBpbiBiaXRzICg4LCAxNiwgb3IgMzIpCisgKiAgICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgICAtIFBvaW50ZXIgdG8gaW4gb3Igb3V0IHZhbHVlCisgKiAgICAgICAgICAgICAgaGFuZGxlcl9jb250ZXh0ICAgICAtIFBvaW50ZXIgdG8gSGFuZGxlcidzIGNvbnRleHQKKyAqICAgICAgICAgICAgICByZWdpb25fY29udGV4dCAgICAgIC0gUG9pbnRlciB0byBjb250ZXh0IHNwZWNpZmljIHRvIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2Nlc3NlZCByZWdpb24KKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IEhhbmRsZXIgZm9yIHRoZSBQQ0kgYmFyX3RhcmdldCBhZGRyZXNzIHNwYWNlIChPcCBSZWdpb24pCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworYWNwaV9zdGF0dXMKK2FjcGlfZXhfcGNpX2Jhcl9zcGFjZV9oYW5kbGVyKHUzMiBmdW5jdGlvbiwKKwkJCSAgICAgIGFjcGlfcGh5c2ljYWxfYWRkcmVzcyBhZGRyZXNzLAorCQkJICAgICAgdTMyIGJpdF93aWR0aCwKKwkJCSAgICAgIGFjcGlfaW50ZWdlciAqIHZhbHVlLAorCQkJICAgICAgdm9pZCAqaGFuZGxlcl9jb250ZXh0LCB2b2lkICpyZWdpb25fY29udGV4dCkKK3sKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0UoZXhfcGNpX2Jhcl9zcGFjZV9oYW5kbGVyKTsKKworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X2RhdGFfdGFibGVfc3BhY2VfaGFuZGxlcgorICoKKyAqIFBBUkFNRVRFUlM6ICBGdW5jdGlvbiAgICAgICAgICAgIC0gUmVhZCBvciBXcml0ZSBvcGVyYXRpb24KKyAqICAgICAgICAgICAgICBBZGRyZXNzICAgICAgICAgICAgIC0gV2hlcmUgaW4gdGhlIHNwYWNlIHRvIHJlYWQgb3Igd3JpdGUKKyAqICAgICAgICAgICAgICBiaXRfd2lkdGggICAgICAgICAgIC0gRmllbGQgd2lkdGggaW4gYml0cyAoOCwgMTYsIG9yIDMyKQorICogICAgICAgICAgICAgIFZhbHVlICAgICAgICAgICAgICAgLSBQb2ludGVyIHRvIGluIG9yIG91dCB2YWx1ZQorICogICAgICAgICAgICAgIGhhbmRsZXJfY29udGV4dCAgICAgLSBQb2ludGVyIHRvIEhhbmRsZXIncyBjb250ZXh0CisgKiAgICAgICAgICAgICAgcmVnaW9uX2NvbnRleHQgICAgICAtIFBvaW50ZXIgdG8gY29udGV4dCBzcGVjaWZpYyB0byB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjZXNzZWQgcmVnaW9uCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBIYW5kbGVyIGZvciB0aGUgRGF0YSBUYWJsZSBhZGRyZXNzIHNwYWNlIChPcCBSZWdpb24pCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworYWNwaV9zdGF0dXMKK2FjcGlfZXhfZGF0YV90YWJsZV9zcGFjZV9oYW5kbGVyKHUzMiBmdW5jdGlvbiwKKwkJCQkgYWNwaV9waHlzaWNhbF9hZGRyZXNzIGFkZHJlc3MsCisJCQkJIHUzMiBiaXRfd2lkdGgsCisJCQkJIGFjcGlfaW50ZWdlciAqIHZhbHVlLAorCQkJCSB2b2lkICpoYW5kbGVyX2NvbnRleHQsIHZvaWQgKnJlZ2lvbl9jb250ZXh0KQoreworCUFDUElfRlVOQ1RJT05fVFJBQ0UoZXhfZGF0YV90YWJsZV9zcGFjZV9oYW5kbGVyKTsKKworCS8qIFBlcmZvcm0gdGhlIG1lbW9yeSByZWFkIG9yIHdyaXRlICovCisKKwlzd2l0Y2ggKGZ1bmN0aW9uKSB7CisJY2FzZSBBQ1BJX1JFQUQ6CisKKwkJQUNQSV9NRU1DUFkoQUNQSV9DQVNUX1BUUihjaGFyLCB2YWx1ZSksCisJCQkgICAgQUNQSV9QSFlTQUREUl9UT19QVFIoYWRkcmVzcyksCisJCQkgICAgQUNQSV9ESVZfOChiaXRfd2lkdGgpKTsKKwkJYnJlYWs7CisKKwljYXNlIEFDUElfV1JJVEU6CisJZGVmYXVsdDoKKworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfU1VQUE9SVCk7CisJfQorCisJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXhyZXNudGUuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXhyZXNudGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDYzYTc0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS9leHJlc250ZS5jCkBAIC0wLDAgKzEsMjc4IEBACisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBNb2R1bGUgTmFtZTogZXhyZXNudGUgLSBBTUwgSW50ZXJwcmV0ZXIgb2JqZWN0IHJlc29sdXRpb24KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA4LCBJbnRlbCBDb3JwLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAorICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgYXQgbWluaW11bSBhIGRpc2NsYWltZXIKKyAqICAgIHN1YnN0YW50aWFsbHkgc2ltaWxhciB0byB0aGUgIk5PIFdBUlJBTlRZIiBkaXNjbGFpbWVyIGJlbG93CisgKiAgICAoIkRpc2NsYWltZXIiKSBhbmQgYW55IHJlZGlzdHJpYnV0aW9uIG11c3QgYmUgY29uZGl0aW9uZWQgdXBvbgorICogICAgaW5jbHVkaW5nIGEgc3Vic3RhbnRpYWxseSBzaW1pbGFyIERpc2NsYWltZXIgcmVxdWlyZW1lbnQgZm9yIGZ1cnRoZXIKKyAqICAgIGJpbmFyeSByZWRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcworICogICAgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBOTyBXQVJSQU5UWQorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcKKyAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgorICovCisKKyNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KKyNpbmNsdWRlICJhY2NvbW1vbi5oIgorI2luY2x1ZGUgImFjZGlzcGF0LmgiCisjaW5jbHVkZSAiYWNpbnRlcnAuaCIKKyNpbmNsdWRlICJhY25hbWVzcC5oIgorCisjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9FWEVDVVRFUgorQUNQSV9NT0RVTEVfTkFNRSgiZXhyZXNudGUiKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X3Jlc29sdmVfbm9kZV90b192YWx1ZQorICoKKyAqIFBBUkFNRVRFUlM6ICBvYmplY3RfcHRyICAgICAgLSBQb2ludGVyIHRvIGEgbG9jYXRpb24gdGhhdCBjb250YWlucworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgcG9pbnRlciB0byBhIE5TIG5vZGUsIGFuZCB3aWxsIHJlY2VpdmUgYQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIHJlc29sdmVkIG9iamVjdC4KKyAqICAgICAgICAgICAgICB3YWxrX3N0YXRlICAgICAgLSBDdXJyZW50IHN0YXRlLiAgVmFsaWQgb25seSBpZiBleGVjdXRpbmcgQU1MCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZS4gIE5VTEwgaWYgc2ltcGx5IHJlc29sdmluZyBhbiBvYmplY3QKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IFJlc29sdmUgYSBOYW1lc3BhY2Ugbm9kZSB0byBhIHZhbHVlZCBvYmplY3QKKyAqCisgKiBOb3RlOiBmb3Igc29tZSBvZiB0aGUgZGF0YSB0eXBlcywgdGhlIHBvaW50ZXIgYXR0YWNoZWQgdG8gdGhlIE5vZGUKKyAqIGNhbiBiZSBlaXRoZXIgYSBwb2ludGVyIHRvIGFuIGFjdHVhbCBpbnRlcm5hbCBvYmplY3Qgb3IgYSBwb2ludGVyIGludG8gdGhlCisgKiBBTUwgc3RyZWFtIGl0c2VsZi4gIFRoZXNlIHR5cGVzIGFyZSBjdXJyZW50bHk6CisgKgorICogICAgICBBQ1BJX1RZUEVfSU5URUdFUgorICogICAgICBBQ1BJX1RZUEVfU1RSSU5HCisgKiAgICAgIEFDUElfVFlQRV9CVUZGRVIKKyAqICAgICAgQUNQSV9UWVBFX01VVEVYCisgKiAgICAgIEFDUElfVFlQRV9QQUNLQUdFCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2FjcGlfc3RhdHVzCithY3BpX2V4X3Jlc29sdmVfbm9kZV90b192YWx1ZShzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqKm9iamVjdF9wdHIsCisJCQkgICAgICBzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKQoreworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnNvdXJjZV9kZXNjOworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjID0gTlVMTDsKKwlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZTsKKwlhY3BpX29iamVjdF90eXBlIGVudHJ5X3R5cGU7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGV4X3Jlc29sdmVfbm9kZV90b192YWx1ZSk7CisKKwkvKgorCSAqIFRoZSBzdGFjayBwb2ludGVyIHBvaW50cyB0byBhIHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlIChOb2RlKS4gIEdldCB0aGUKKwkgKiBvYmplY3QgdGhhdCBpcyBhdHRhY2hlZCB0byB0aGUgTm9kZS4KKwkgKi8KKwlub2RlID0gKm9iamVjdF9wdHI7CisJc291cmNlX2Rlc2MgPSBhY3BpX25zX2dldF9hdHRhY2hlZF9vYmplY3Qobm9kZSk7CisJZW50cnlfdHlwZSA9IGFjcGlfbnNfZ2V0X3R5cGUoKGFjcGlfaGFuZGxlKSBub2RlKTsKKworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVhFQywgIkVudHJ5PSVwIFNvdXJjZURlc2M9JXAgWyVzXVxuIiwKKwkJCSAgbm9kZSwgc291cmNlX2Rlc2MsCisJCQkgIGFjcGlfdXRfZ2V0X3R5cGVfbmFtZShlbnRyeV90eXBlKSkpOworCisJaWYgKChlbnRyeV90eXBlID09IEFDUElfVFlQRV9MT0NBTF9BTElBUykgfHwKKwkgICAgKGVudHJ5X3R5cGUgPT0gQUNQSV9UWVBFX0xPQ0FMX01FVEhPRF9BTElBUykpIHsKKworCQkvKiBUaGVyZSBpcyBhbHdheXMgZXhhY3RseSBvbmUgbGV2ZWwgb2YgaW5kaXJlY3Rpb24gKi8KKworCQlub2RlID0gQUNQSV9DQVNUX1BUUihzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSwgbm9kZS0+b2JqZWN0KTsKKwkJc291cmNlX2Rlc2MgPSBhY3BpX25zX2dldF9hdHRhY2hlZF9vYmplY3Qobm9kZSk7CisJCWVudHJ5X3R5cGUgPSBhY3BpX25zX2dldF90eXBlKChhY3BpX2hhbmRsZSkgbm9kZSk7CisJCSpvYmplY3RfcHRyID0gbm9kZTsKKwl9CisKKwkvKgorCSAqIFNldmVyYWwgb2JqZWN0IHR5cGVzIHJlcXVpcmUgbm8gZnVydGhlciBwcm9jZXNzaW5nOgorCSAqIDEpIERldmljZS9UaGVybWFsIG9iamVjdHMgZG9uJ3QgaGF2ZSBhICJyZWFsIiBzdWJvYmplY3QsIHJldHVybiB0aGUgTm9kZQorCSAqIDIpIE1ldGhvZCBsb2NhbHMgYW5kIGFyZ3VtZW50cyBoYXZlIGEgcHNldWRvLU5vZGUKKwkgKiAzKSAxMC8yMDA3OiBBZGRlZCBtZXRob2QgdHlwZSB0byBhc3Npc3Qgd2l0aCBQYWNrYWdlIGNvbnN0cnVjdGlvbi4KKwkgKi8KKwlpZiAoKGVudHJ5X3R5cGUgPT0gQUNQSV9UWVBFX0RFVklDRSkgfHwKKwkgICAgKGVudHJ5X3R5cGUgPT0gQUNQSV9UWVBFX1RIRVJNQUwpIHx8CisJICAgIChlbnRyeV90eXBlID09IEFDUElfVFlQRV9NRVRIT0QpIHx8CisJICAgIChub2RlLT5mbGFncyAmIChBTk9CSl9NRVRIT0RfQVJHIHwgQU5PQkpfTUVUSE9EX0xPQ0FMKSkpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKKwl9CisKKwlpZiAoIXNvdXJjZV9kZXNjKSB7CisJCUFDUElfRVJST1IoKEFFX0lORk8sICJObyBvYmplY3QgYXR0YWNoZWQgdG8gbm9kZSAlcCIsIG5vZGUpKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9OT19PUEVSQU5EKTsKKwl9CisKKwkvKgorCSAqIEFjdGlvbiBpcyBiYXNlZCBvbiB0aGUgdHlwZSBvZiB0aGUgTm9kZSwgd2hpY2ggaW5kaWNhdGVzIHRoZSB0eXBlCisJICogb2YgdGhlIGF0dGFjaGVkIG9iamVjdCBvciBwb2ludGVyCisJICovCisJc3dpdGNoIChlbnRyeV90eXBlKSB7CisJY2FzZSBBQ1BJX1RZUEVfUEFDS0FHRToKKworCQlpZiAoQUNQSV9HRVRfT0JKRUNUX1RZUEUoc291cmNlX2Rlc2MpICE9IEFDUElfVFlQRV9QQUNLQUdFKSB7CisJCQlBQ1BJX0VSUk9SKChBRV9JTkZPLCAiT2JqZWN0IG5vdCBhIFBhY2thZ2UsIHR5cGUgJXMiLAorCQkJCSAgICBhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lKHNvdXJjZV9kZXNjKSkpOworCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9PUEVSQU5EX1RZUEUpOworCQl9CisKKwkJc3RhdHVzID0gYWNwaV9kc19nZXRfcGFja2FnZV9hcmd1bWVudHMoc291cmNlX2Rlc2MpOworCQlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpIHsKKworCQkJLyogUmV0dXJuIGFuIGFkZGl0aW9uYWwgcmVmZXJlbmNlIHRvIHRoZSBvYmplY3QgKi8KKworCQkJb2JqX2Rlc2MgPSBzb3VyY2VfZGVzYzsKKwkJCWFjcGlfdXRfYWRkX3JlZmVyZW5jZShvYmpfZGVzYyk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIEFDUElfVFlQRV9CVUZGRVI6CisKKwkJaWYgKEFDUElfR0VUX09CSkVDVF9UWVBFKHNvdXJjZV9kZXNjKSAhPSBBQ1BJX1RZUEVfQlVGRkVSKSB7CisJCQlBQ1BJX0VSUk9SKChBRV9JTkZPLCAiT2JqZWN0IG5vdCBhIEJ1ZmZlciwgdHlwZSAlcyIsCisJCQkJICAgIGFjcGlfdXRfZ2V0X29iamVjdF90eXBlX25hbWUoc291cmNlX2Rlc2MpKSk7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX09QRVJBTkRfVFlQRSk7CisJCX0KKworCQlzdGF0dXMgPSBhY3BpX2RzX2dldF9idWZmZXJfYXJndW1lbnRzKHNvdXJjZV9kZXNjKTsKKwkJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKSB7CisKKwkJCS8qIFJldHVybiBhbiBhZGRpdGlvbmFsIHJlZmVyZW5jZSB0byB0aGUgb2JqZWN0ICovCisKKwkJCW9ial9kZXNjID0gc291cmNlX2Rlc2M7CisJCQlhY3BpX3V0X2FkZF9yZWZlcmVuY2Uob2JqX2Rlc2MpOworCQl9CisJCWJyZWFrOworCisJY2FzZSBBQ1BJX1RZUEVfU1RSSU5HOgorCisJCWlmIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRShzb3VyY2VfZGVzYykgIT0gQUNQSV9UWVBFX1NUUklORykgeworCQkJQUNQSV9FUlJPUigoQUVfSU5GTywgIk9iamVjdCBub3QgYSBTdHJpbmcsIHR5cGUgJXMiLAorCQkJCSAgICBhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lKHNvdXJjZV9kZXNjKSkpOworCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9PUEVSQU5EX1RZUEUpOworCQl9CisKKwkJLyogUmV0dXJuIGFuIGFkZGl0aW9uYWwgcmVmZXJlbmNlIHRvIHRoZSBvYmplY3QgKi8KKworCQlvYmpfZGVzYyA9IHNvdXJjZV9kZXNjOworCQlhY3BpX3V0X2FkZF9yZWZlcmVuY2Uob2JqX2Rlc2MpOworCQlicmVhazsKKworCWNhc2UgQUNQSV9UWVBFX0lOVEVHRVI6CisKKwkJaWYgKEFDUElfR0VUX09CSkVDVF9UWVBFKHNvdXJjZV9kZXNjKSAhPSBBQ1BJX1RZUEVfSU5URUdFUikgeworCQkJQUNQSV9FUlJPUigoQUVfSU5GTywgIk9iamVjdCBub3QgYSBJbnRlZ2VyLCB0eXBlICVzIiwKKwkJCQkgICAgYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZShzb3VyY2VfZGVzYykpKTsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfT1BFUkFORF9UWVBFKTsKKwkJfQorCisJCS8qIFJldHVybiBhbiBhZGRpdGlvbmFsIHJlZmVyZW5jZSB0byB0aGUgb2JqZWN0ICovCisKKwkJb2JqX2Rlc2MgPSBzb3VyY2VfZGVzYzsKKwkJYWNwaV91dF9hZGRfcmVmZXJlbmNlKG9ial9kZXNjKTsKKwkJYnJlYWs7CisKKwljYXNlIEFDUElfVFlQRV9CVUZGRVJfRklFTEQ6CisJY2FzZSBBQ1BJX1RZUEVfTE9DQUxfUkVHSU9OX0ZJRUxEOgorCWNhc2UgQUNQSV9UWVBFX0xPQ0FMX0JBTktfRklFTEQ6CisJY2FzZSBBQ1BJX1RZUEVfTE9DQUxfSU5ERVhfRklFTEQ6CisKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FWEVDLAorCQkJCSAgIkZpZWxkUmVhZCBOb2RlPSVwIFNvdXJjZURlc2M9JXAgVHlwZT0lWFxuIiwKKwkJCQkgIG5vZGUsIHNvdXJjZV9kZXNjLCBlbnRyeV90eXBlKSk7CisKKwkJc3RhdHVzID0KKwkJICAgIGFjcGlfZXhfcmVhZF9kYXRhX2Zyb21fZmllbGQod2Fsa19zdGF0ZSwgc291cmNlX2Rlc2MsCisJCQkJCQkgJm9ial9kZXNjKTsKKwkJYnJlYWs7CisKKwkJLyogRm9yIHRoZXNlIG9iamVjdHMsIGp1c3QgcmV0dXJuIHRoZSBvYmplY3QgYXR0YWNoZWQgdG8gdGhlIE5vZGUgKi8KKworCWNhc2UgQUNQSV9UWVBFX01VVEVYOgorCWNhc2UgQUNQSV9UWVBFX1BPV0VSOgorCWNhc2UgQUNQSV9UWVBFX1BST0NFU1NPUjoKKwljYXNlIEFDUElfVFlQRV9FVkVOVDoKKwljYXNlIEFDUElfVFlQRV9SRUdJT046CisKKwkJLyogUmV0dXJuIGFuIGFkZGl0aW9uYWwgcmVmZXJlbmNlIHRvIHRoZSBvYmplY3QgKi8KKworCQlvYmpfZGVzYyA9IHNvdXJjZV9kZXNjOworCQlhY3BpX3V0X2FkZF9yZWZlcmVuY2Uob2JqX2Rlc2MpOworCQlicmVhazsKKworCQkvKiBUWVBFX0FOWSBpcyB1bnR5cGVkLCBhbmQgdGh1cyB0aGVyZSBpcyBubyBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIGl0ICovCisKKwljYXNlIEFDUElfVFlQRV9BTlk6CisKKwkJQUNQSV9FUlJPUigoQUVfSU5GTywKKwkJCSAgICAiVW50eXBlZCBlbnRyeSAlcCwgbm8gYXR0YWNoZWQgb2JqZWN0ISIsIG5vZGUpKTsKKworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX09QRVJBTkRfVFlQRSk7CS8qIENhbm5vdCBiZSBBRV9UWVBFICovCisKKwljYXNlIEFDUElfVFlQRV9MT0NBTF9SRUZFUkVOQ0U6CisKKwkJc3dpdGNoIChzb3VyY2VfZGVzYy0+cmVmZXJlbmNlLmNsYXNzKSB7CisJCWNhc2UgQUNQSV9SRUZDTEFTU19UQUJMRToJLyogVGhpcyBpcyBhIGRkYl9oYW5kbGUgKi8KKwkJY2FzZSBBQ1BJX1JFRkNMQVNTX1JFRk9GOgorCQljYXNlIEFDUElfUkVGQ0xBU1NfSU5ERVg6CisKKwkJCS8qIFJldHVybiBhbiBhZGRpdGlvbmFsIHJlZmVyZW5jZSB0byB0aGUgb2JqZWN0ICovCisKKwkJCW9ial9kZXNjID0gc291cmNlX2Rlc2M7CisJCQlhY3BpX3V0X2FkZF9yZWZlcmVuY2Uob2JqX2Rlc2MpOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCS8qIE5vIG5hbWVkIHJlZmVyZW5jZXMgYXJlIGFsbG93ZWQgaGVyZSAqLworCisJCQlBQ1BJX0VSUk9SKChBRV9JTkZPLAorCQkJCSAgICAiVW5zdXBwb3J0ZWQgUmVmZXJlbmNlIHR5cGUgJVgiLAorCQkJCSAgICBzb3VyY2VfZGVzYy0+cmVmZXJlbmNlLmNsYXNzKSk7CisKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfT1BFUkFORF9UWVBFKTsKKwkJfQorCQlicmVhazsKKworCWRlZmF1bHQ6CisKKwkJLyogRGVmYXVsdCBjYXNlIGlzIGZvciB1bmtub3duIHR5cGVzICovCisKKwkJQUNQSV9FUlJPUigoQUVfSU5GTywKKwkJCSAgICAiTm9kZSAlcCAtIFVua25vd24gb2JqZWN0IHR5cGUgJVgiLAorCQkJICAgIG5vZGUsIGVudHJ5X3R5cGUpKTsKKworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX09QRVJBTkRfVFlQRSk7CisKKwl9CQkJLyogc3dpdGNoIChlbnRyeV90eXBlKSAqLworCisJLyogUmV0dXJuIHRoZSBvYmplY3QgZGVzY3JpcHRvciAqLworCisJKm9iamVjdF9wdHIgPSAodm9pZCAqKW9ial9kZXNjOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS9leHJlc29sdi5jIGIvZHJpdmVycy9hY3BpL2FjcGljYS9leHJlc29sdi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2MTA1YTYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2V4cmVzb2x2LmMKQEAgLTAsMCArMSw1NTEgQEAKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIE1vZHVsZSBOYW1lOiBleHJlc29sdiAtIEFNTCBJbnRlcnByZXRlciBvYmplY3QgcmVzb2x1dGlvbgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDgsIEludGVsIENvcnAuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCisgKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSBhdCBtaW5pbXVtIGEgZGlzY2xhaW1lcgorICogICAgc3Vic3RhbnRpYWxseSBzaW1pbGFyIHRvIHRoZSAiTk8gV0FSUkFOVFkiIGRpc2NsYWltZXIgYmVsb3cKKyAqICAgICgiRGlzY2xhaW1lciIpIGFuZCBhbnkgcmVkaXN0cmlidXRpb24gbXVzdCBiZSBjb25kaXRpb25lZCB1cG9uCisgKiAgICBpbmNsdWRpbmcgYSBzdWJzdGFudGlhbGx5IHNpbWlsYXIgRGlzY2xhaW1lciByZXF1aXJlbWVudCBmb3IgZnVydGhlcgorICogICAgYmluYXJ5IHJlZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzCisgKiAgICBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIE5PIFdBUlJBTlRZCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORworICogSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCisgKi8KKworI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgorI2luY2x1ZGUgImFjY29tbW9uLmgiCisjaW5jbHVkZSAiYW1sY29kZS5oIgorI2luY2x1ZGUgImFjZGlzcGF0LmgiCisjaW5jbHVkZSAiYWNpbnRlcnAuaCIKKyNpbmNsdWRlICJhY25hbWVzcC5oIgorCisjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9FWEVDVVRFUgorQUNQSV9NT0RVTEVfTkFNRSgiZXhyZXNvbHYiKQorCisvKiBMb2NhbCBwcm90b3R5cGVzICovCitzdGF0aWMgYWNwaV9zdGF0dXMKK2FjcGlfZXhfcmVzb2x2ZV9vYmplY3RfdG9fdmFsdWUodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKnN0YWNrX3B0ciwKKwkJCQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9leF9yZXNvbHZlX3RvX3ZhbHVlCisgKgorICogUEFSQU1FVEVSUzogICoqc3RhY2tfcHRyICAgICAgICAgLSBQb2ludHMgdG8gZW50cnkgb24gb2JqX3N0YWNrLCB3aGljaCBjYW4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgZWl0aGVyIGFuICh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICopCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIGFuIGFjcGlfaGFuZGxlLgorICogICAgICAgICAgICAgIHdhbGtfc3RhdGUgICAgICAgICAgLSBDdXJyZW50IG1ldGhvZCBzdGF0ZQorICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogQ29udmVydCBSZWZlcmVuY2Ugb2JqZWN0cyB0byB2YWx1ZXMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCithY3BpX3N0YXR1cworYWNwaV9leF9yZXNvbHZlX3RvX3ZhbHVlKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKipzdGFja19wdHIsCisJCQkgc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSkKK3sKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUihleF9yZXNvbHZlX3RvX3ZhbHVlLCBzdGFja19wdHIpOworCisJaWYgKCFzdGFja19wdHIgfHwgISpzdGFja19wdHIpIHsKKwkJQUNQSV9FUlJPUigoQUVfSU5GTywgIkludGVybmFsIC0gbnVsbCBwb2ludGVyIikpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX05PX09QRVJBTkQpOworCX0KKworCS8qCisJICogVGhlIGVudGl0eSBwb2ludGVkIHRvIGJ5IHRoZSBzdGFja19wdHIgY2FuIGJlIGVpdGhlcgorCSAqIDEpIEEgdmFsaWQgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCwgb3IKKwkgKiAyKSBBIHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlIChuYW1lZF9vYmopCisJICovCisJaWYgKEFDUElfR0VUX0RFU0NSSVBUT1JfVFlQRSgqc3RhY2tfcHRyKSA9PSBBQ1BJX0RFU0NfVFlQRV9PUEVSQU5EKSB7CisJCXN0YXR1cyA9IGFjcGlfZXhfcmVzb2x2ZV9vYmplY3RfdG9fdmFsdWUoc3RhY2tfcHRyLCB3YWxrX3N0YXRlKTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKKwkJfQorCisJCWlmICghKnN0YWNrX3B0cikgeworCQkJQUNQSV9FUlJPUigoQUVfSU5GTywgIkludGVybmFsIC0gbnVsbCBwb2ludGVyIikpOworCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9OT19PUEVSQU5EKTsKKwkJfQorCX0KKworCS8qCisJICogT2JqZWN0IG9uIHRoZSBzdGFjayBtYXkgaGF2ZSBjaGFuZ2VkIGlmIGFjcGlfZXhfcmVzb2x2ZV9vYmplY3RfdG9fdmFsdWUoKQorCSAqIHdhcyBjYWxsZWQgKGkuZS4sIHdlIGNhbid0IHVzZSBhbiBfZWxzZV8gaGVyZS4pCisJICovCisJaWYgKEFDUElfR0VUX0RFU0NSSVBUT1JfVFlQRSgqc3RhY2tfcHRyKSA9PSBBQ1BJX0RFU0NfVFlQRV9OQU1FRCkgeworCQlzdGF0dXMgPQorCQkgICAgYWNwaV9leF9yZXNvbHZlX25vZGVfdG9fdmFsdWUoQUNQSV9DQVNUX0lORElSRUNUX1BUUgorCQkJCQkJICAoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUsCisJCQkJCQkgICBzdGFja19wdHIpLCB3YWxrX3N0YXRlKTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKKwkJfQorCX0KKworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVhFQywgIlJlc29sdmVkIG9iamVjdCAlcFxuIiwgKnN0YWNrX3B0cikpOworCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfZXhfcmVzb2x2ZV9vYmplY3RfdG9fdmFsdWUKKyAqCisgKiBQQVJBTUVURVJTOiAgc3RhY2tfcHRyICAgICAgIC0gUG9pbnRlciB0byBhbiBpbnRlcm5hbCBvYmplY3QKKyAqICAgICAgICAgICAgICB3YWxrX3N0YXRlICAgICAgLSBDdXJyZW50IG1ldGhvZCBzdGF0ZQorICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogUmV0cmlldmUgdGhlIHZhbHVlIGZyb20gYW4gaW50ZXJuYWwgb2JqZWN0LiBUaGUgUmVmZXJlbmNlIHR5cGUKKyAqICAgICAgICAgICAgICB1c2VzIHRoZSBhc3NvY2lhdGVkIEFNTCBvcGNvZGUgdG8gZGV0ZXJtaW5lIHRoZSB2YWx1ZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgYWNwaV9zdGF0dXMKK2FjcGlfZXhfcmVzb2x2ZV9vYmplY3RfdG9fdmFsdWUodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKnN0YWNrX3B0ciwKKwkJCQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKQoreworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnN0YWNrX2Rlc2M7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2MgPSBOVUxMOworCXU4IHJlZl90eXBlOworCisJQUNQSV9GVU5DVElPTl9UUkFDRShleF9yZXNvbHZlX29iamVjdF90b192YWx1ZSk7CisKKwlzdGFja19kZXNjID0gKnN0YWNrX3B0cjsKKworCS8qIFRoaXMgaXMgYSB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICovCisKKwlzd2l0Y2ggKEFDUElfR0VUX09CSkVDVF9UWVBFKHN0YWNrX2Rlc2MpKSB7CisJY2FzZSBBQ1BJX1RZUEVfTE9DQUxfUkVGRVJFTkNFOgorCisJCXJlZl90eXBlID0gc3RhY2tfZGVzYy0+cmVmZXJlbmNlLmNsYXNzOworCisJCXN3aXRjaCAocmVmX3R5cGUpIHsKKwkJY2FzZSBBQ1BJX1JFRkNMQVNTX0xPQ0FMOgorCQljYXNlIEFDUElfUkVGQ0xBU1NfQVJHOgorCisJCQkvKgorCQkJICogR2V0IHRoZSBsb2NhbCBmcm9tIHRoZSBtZXRob2QncyBzdGF0ZSBpbmZvCisJCQkgKiBOb3RlOiB0aGlzIGluY3JlbWVudHMgdGhlIGxvY2FsJ3Mgb2JqZWN0IHJlZmVyZW5jZSBjb3VudAorCQkJICovCisJCQlzdGF0dXMgPSBhY3BpX2RzX21ldGhvZF9kYXRhX2dldF92YWx1ZShyZWZfdHlwZSwKKwkJCQkJCQkgICAgICAgc3RhY2tfZGVzYy0+CisJCQkJCQkJICAgICAgIHJlZmVyZW5jZS52YWx1ZSwKKwkJCQkJCQkgICAgICAgd2Fsa19zdGF0ZSwKKwkJCQkJCQkgICAgICAgJm9ial9kZXNjKTsKKwkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworCQkJfQorCisJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VYRUMsCisJCQkJCSAgIltBcmcvTG9jYWwgJVhdIFZhbHVlT2JqIGlzICVwXG4iLAorCQkJCQkgIHN0YWNrX2Rlc2MtPnJlZmVyZW5jZS52YWx1ZSwKKwkJCQkJICBvYmpfZGVzYykpOworCisJCQkvKgorCQkJICogTm93IHdlIGNhbiBkZWxldGUgdGhlIG9yaWdpbmFsIFJlZmVyZW5jZSBPYmplY3QgYW5kCisJCQkgKiByZXBsYWNlIGl0IHdpdGggdGhlIHJlc29sdmVkIHZhbHVlCisJCQkgKi8KKwkJCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZShzdGFja19kZXNjKTsKKwkJCSpzdGFja19wdHIgPSBvYmpfZGVzYzsKKwkJCWJyZWFrOworCisJCWNhc2UgQUNQSV9SRUZDTEFTU19JTkRFWDoKKworCQkJc3dpdGNoIChzdGFja19kZXNjLT5yZWZlcmVuY2UudGFyZ2V0X3R5cGUpIHsKKwkJCWNhc2UgQUNQSV9UWVBFX0JVRkZFUl9GSUVMRDoKKworCQkJCS8qIEp1c3QgcmV0dXJuIC0gZG8gbm90IGRlcmVmZXJlbmNlICovCisJCQkJYnJlYWs7CisKKwkJCWNhc2UgQUNQSV9UWVBFX1BBQ0tBR0U6CisKKwkJCQkvKiBJZiBtZXRob2QgY2FsbCBvciBjb3B5X29iamVjdCAtIGRvIG5vdCBkZXJlZmVyZW5jZSAqLworCisJCQkJaWYgKCh3YWxrX3N0YXRlLT5vcGNvZGUgPT0KKwkJCQkgICAgIEFNTF9JTlRfTUVUSE9EQ0FMTF9PUCkKKwkJCQkgICAgfHwgKHdhbGtfc3RhdGUtPm9wY29kZSA9PSBBTUxfQ09QWV9PUCkpIHsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLyogT3RoZXJ3aXNlLCBkZXJlZmVyZW5jZSB0aGUgcGFja2FnZV9pbmRleCB0byBhIHBhY2thZ2UgZWxlbWVudCAqLworCisJCQkJb2JqX2Rlc2MgPSAqc3RhY2tfZGVzYy0+cmVmZXJlbmNlLndoZXJlOworCQkJCWlmIChvYmpfZGVzYykgeworCQkJCQkvKgorCQkJCQkgKiBWYWxpZCBvYmplY3QgZGVzY3JpcHRvciwgY29weSBwb2ludGVyIHRvIHJldHVybiB2YWx1ZQorCQkJCQkgKiAoaS5lLiwgZGVyZWZlcmVuY2UgdGhlIHBhY2thZ2UgaW5kZXgpCisJCQkJCSAqIERlbGV0ZSB0aGUgcmVmIG9iamVjdCwgaW5jcmVtZW50IHRoZSByZXR1cm5lZCBvYmplY3QKKwkJCQkJICovCisJCQkJCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZShzdGFja19kZXNjKTsKKwkJCQkJYWNwaV91dF9hZGRfcmVmZXJlbmNlKG9ial9kZXNjKTsKKwkJCQkJKnN0YWNrX3B0ciA9IG9ial9kZXNjOworCQkJCX0gZWxzZSB7CisJCQkJCS8qCisJCQkJCSAqIEEgTlVMTCBvYmplY3QgZGVzY3JpcHRvciBtZWFucyBhbiB1bmluaXRpYWxpemVkIGVsZW1lbnQgb2YKKwkJCQkJICogdGhlIHBhY2thZ2UsIGNhbid0IGRlcmVmZXJlbmNlIGl0CisJCQkJCSAqLworCQkJCQlBQ1BJX0VSUk9SKChBRV9JTkZPLAorCQkJCQkJICAgICJBdHRlbXB0IHRvIGRlcmVmZXJlbmNlIGFuIEluZGV4IHRvIE5VTEwgcGFja2FnZSBlbGVtZW50IElkeD0lcCIsCisJCQkJCQkgICAgc3RhY2tfZGVzYykpOworCQkJCQlzdGF0dXMgPSBBRV9BTUxfVU5JTklUSUFMSVpFRF9FTEVNRU5UOworCQkJCX0KKwkJCQlicmVhazsKKworCQkJZGVmYXVsdDoKKworCQkJCS8qIEludmFsaWQgcmVmZXJlbmNlIG9iamVjdCAqLworCisJCQkJQUNQSV9FUlJPUigoQUVfSU5GTywKKwkJCQkJICAgICJVbmtub3duIFRhcmdldFR5cGUgJVggaW4gSW5kZXgvUmVmZXJlbmNlIG9iamVjdCAlcCIsCisJCQkJCSAgICBzdGFja19kZXNjLT5yZWZlcmVuY2UudGFyZ2V0X3R5cGUsCisJCQkJCSAgICBzdGFja19kZXNjKSk7CisJCQkJc3RhdHVzID0gQUVfQU1MX0lOVEVSTkFMOworCQkJCWJyZWFrOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBBQ1BJX1JFRkNMQVNTX1JFRk9GOgorCQljYXNlIEFDUElfUkVGQ0xBU1NfREVCVUc6CisJCWNhc2UgQUNQSV9SRUZDTEFTU19UQUJMRToKKworCQkJLyogSnVzdCBsZWF2ZSB0aGUgb2JqZWN0IGFzLWlzLCBkbyBub3QgZGVyZWZlcmVuY2UgKi8KKworCQkJYnJlYWs7CisKKwkJY2FzZSBBQ1BJX1JFRkNMQVNTX05BTUU6CS8qIFJlZmVyZW5jZSB0byBhIG5hbWVkIG9iamVjdCAqLworCisJCQkvKiBEZXJlZmVyZW5jZSB0aGUgbmFtZSAqLworCisJCQlpZiAoKHN0YWNrX2Rlc2MtPnJlZmVyZW5jZS5ub2RlLT50eXBlID09CisJCQkgICAgIEFDUElfVFlQRV9ERVZJQ0UpCisJCQkgICAgfHwgKHN0YWNrX2Rlc2MtPnJlZmVyZW5jZS5ub2RlLT50eXBlID09CisJCQkJQUNQSV9UWVBFX1RIRVJNQUwpKSB7CisKKwkJCQkvKiBUaGVzZSBub2RlIHR5cGVzIGRvIG5vdCBoYXZlICdyZWFsJyBzdWJvYmplY3RzICovCisKKwkJCQkqc3RhY2tfcHRyID0gKHZvaWQgKilzdGFja19kZXNjLT5yZWZlcmVuY2Uubm9kZTsKKwkJCX0gZWxzZSB7CisJCQkJLyogR2V0IHRoZSBvYmplY3QgcG9pbnRlZCB0byBieSB0aGUgbmFtZXNwYWNlIG5vZGUgKi8KKworCQkJCSpzdGFja19wdHIgPQorCQkJCSAgICAoc3RhY2tfZGVzYy0+cmVmZXJlbmNlLm5vZGUpLT5vYmplY3Q7CisJCQkJYWNwaV91dF9hZGRfcmVmZXJlbmNlKCpzdGFja19wdHIpOworCQkJfQorCisJCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2Uoc3RhY2tfZGVzYyk7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCisJCQlBQ1BJX0VSUk9SKChBRV9JTkZPLAorCQkJCSAgICAiVW5rbm93biBSZWZlcmVuY2UgdHlwZSAlWCBpbiAlcCIsIHJlZl90eXBlLAorCQkJCSAgICBzdGFja19kZXNjKSk7CisJCQlzdGF0dXMgPSBBRV9BTUxfSU5URVJOQUw7CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKworCWNhc2UgQUNQSV9UWVBFX0JVRkZFUjoKKworCQlzdGF0dXMgPSBhY3BpX2RzX2dldF9idWZmZXJfYXJndW1lbnRzKHN0YWNrX2Rlc2MpOworCQlicmVhazsKKworCWNhc2UgQUNQSV9UWVBFX1BBQ0tBR0U6CisKKwkJc3RhdHVzID0gYWNwaV9kc19nZXRfcGFja2FnZV9hcmd1bWVudHMoc3RhY2tfZGVzYyk7CisJCWJyZWFrOworCisJY2FzZSBBQ1BJX1RZUEVfQlVGRkVSX0ZJRUxEOgorCWNhc2UgQUNQSV9UWVBFX0xPQ0FMX1JFR0lPTl9GSUVMRDoKKwljYXNlIEFDUElfVFlQRV9MT0NBTF9CQU5LX0ZJRUxEOgorCWNhc2UgQUNQSV9UWVBFX0xPQ0FMX0lOREVYX0ZJRUxEOgorCisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVhFQywKKwkJCQkgICJGaWVsZFJlYWQgU291cmNlRGVzYz0lcCBUeXBlPSVYXG4iLAorCQkJCSAgc3RhY2tfZGVzYywKKwkJCQkgIEFDUElfR0VUX09CSkVDVF9UWVBFKHN0YWNrX2Rlc2MpKSk7CisKKwkJc3RhdHVzID0KKwkJICAgIGFjcGlfZXhfcmVhZF9kYXRhX2Zyb21fZmllbGQod2Fsa19zdGF0ZSwgc3RhY2tfZGVzYywKKwkJCQkJCSAmb2JqX2Rlc2MpOworCisJCS8qIFJlbW92ZSBhIHJlZmVyZW5jZSB0byB0aGUgb3JpZ2luYWwgb3BlcmFuZCwgdGhlbiBvdmVycmlkZSAqLworCisJCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZSgqc3RhY2tfcHRyKTsKKwkJKnN0YWNrX3B0ciA9ICh2b2lkICopb2JqX2Rlc2M7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfZXhfcmVzb2x2ZV9tdWx0aXBsZQorICoKKyAqIFBBUkFNRVRFUlM6ICB3YWxrX3N0YXRlICAgICAgICAgIC0gQ3VycmVudCBzdGF0ZSAoY29udGFpbnMgQU1MIG9wY29kZSkKKyAqICAgICAgICAgICAgICBPcGVyYW5kICAgICAgICAgICAgIC0gU3RhcnRpbmcgcG9pbnQgZm9yIHJlc29sdXRpb24KKyAqICAgICAgICAgICAgICByZXR1cm5fdHlwZSAgICAgICAgIC0gV2hlcmUgdGhlIG9iamVjdCB0eXBlIGlzIHJldHVybmVkCisgKiAgICAgICAgICAgICAgcmV0dXJuX2Rlc2MgICAgICAgICAtIFdoZXJlIHRoZSByZXNvbHZlZCBvYmplY3QgaXMgcmV0dXJuZWQKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IFJldHVybiB0aGUgYmFzZSBvYmplY3QgYW5kIHR5cGUuICBUcmF2ZXJzZSBhIHJlZmVyZW5jZSBsaXN0IGlmCisgKiAgICAgICAgICAgICAgbmVjZXNzYXJ5IHRvIGdldCB0byB0aGUgYmFzZSBvYmplY3QuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworYWNwaV9zdGF0dXMKK2FjcGlfZXhfcmVzb2x2ZV9tdWx0aXBsZShzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlLAorCQkJIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9wZXJhbmQsCisJCQkgYWNwaV9vYmplY3RfdHlwZSAqIHJldHVybl90eXBlLAorCQkJIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKipyZXR1cm5fZGVzYykKK3sKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYyA9ICh2b2lkICopb3BlcmFuZDsKKwlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZTsKKwlhY3BpX29iamVjdF90eXBlIHR5cGU7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCisJQUNQSV9GVU5DVElPTl9UUkFDRShhY3BpX2V4X3Jlc29sdmVfbXVsdGlwbGUpOworCisJLyogT3BlcmFuZCBjYW4gYmUgZWl0aGVyIGEgbmFtZXNwYWNlIG5vZGUgb3IgYW4gb3BlcmFuZCBkZXNjcmlwdG9yICovCisKKwlzd2l0Y2ggKEFDUElfR0VUX0RFU0NSSVBUT1JfVFlQRShvYmpfZGVzYykpIHsKKwljYXNlIEFDUElfREVTQ19UWVBFX09QRVJBTkQ6CisJCXR5cGUgPSBvYmpfZGVzYy0+Y29tbW9uLnR5cGU7CisJCWJyZWFrOworCisJY2FzZSBBQ1BJX0RFU0NfVFlQRV9OQU1FRDoKKwkJdHlwZSA9ICgoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKilvYmpfZGVzYyktPnR5cGU7CisJCW9ial9kZXNjID0KKwkJICAgIGFjcGlfbnNfZ2V0X2F0dGFjaGVkX29iamVjdCgoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKikKKwkJCQkJCW9ial9kZXNjKTsKKworCQkvKiBJZiB3ZSBoYWQgYW4gQWxpYXMgbm9kZSwgdXNlIHRoZSBhdHRhY2hlZCBvYmplY3QgZm9yIHR5cGUgaW5mbyAqLworCisJCWlmICh0eXBlID09IEFDUElfVFlQRV9MT0NBTF9BTElBUykgeworCQkJdHlwZSA9ICgoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKilvYmpfZGVzYyktPnR5cGU7CisJCQlvYmpfZGVzYyA9CisJCQkgICAgYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0KChzdHJ1Y3QKKwkJCQkJCQkgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqKQorCQkJCQkJCW9ial9kZXNjKTsKKwkJfQorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfT1BFUkFORF9UWVBFKTsKKwl9CisKKwkvKiBJZiB0eXBlIGlzIGFueXRoaW5nIG90aGVyIHRoYW4gYSByZWZlcmVuY2UsIHdlIGFyZSBkb25lICovCisKKwlpZiAodHlwZSAhPSBBQ1BJX1RZUEVfTE9DQUxfUkVGRVJFTkNFKSB7CisJCWdvdG8gZXhpdDsKKwl9CisKKwkvKgorCSAqIEZvciByZWZlcmVuY2Ugb2JqZWN0cyBjcmVhdGVkIHZpYSB0aGUgcmVmX29mLCBJbmRleCwgb3IgTG9hZC9sb2FkX3RhYmxlCisJICogb3BlcmF0b3JzLCB3ZSBuZWVkIHRvIGdldCB0byB0aGUgYmFzZSBvYmplY3QgKGFzIHBlciB0aGUgQUNQSQorCSAqIHNwZWNpZmljYXRpb24gb2YgdGhlIG9iamVjdF90eXBlIGFuZCBzaXplX29mIG9wZXJhdG9ycykuIFRoaXMgbWVhbnMKKwkgKiB0cmF2ZXJzaW5nIHRoZSBsaXN0IG9mIHBvc3NpYmx5IG1hbnkgbmVzdGVkIHJlZmVyZW5jZXMuCisJICovCisJd2hpbGUgKEFDUElfR0VUX09CSkVDVF9UWVBFKG9ial9kZXNjKSA9PSBBQ1BJX1RZUEVfTE9DQUxfUkVGRVJFTkNFKSB7CisJCXN3aXRjaCAob2JqX2Rlc2MtPnJlZmVyZW5jZS5jbGFzcykgeworCQljYXNlIEFDUElfUkVGQ0xBU1NfUkVGT0Y6CisJCWNhc2UgQUNQSV9SRUZDTEFTU19OQU1FOgorCisJCQkvKiBEZXJlZmVyZW5jZSB0aGUgcmVmZXJlbmNlIHBvaW50ZXIgKi8KKworCQkJaWYgKG9ial9kZXNjLT5yZWZlcmVuY2UuY2xhc3MgPT0gQUNQSV9SRUZDTEFTU19SRUZPRikgeworCQkJCW5vZGUgPSBvYmpfZGVzYy0+cmVmZXJlbmNlLm9iamVjdDsKKwkJCX0gZWxzZSB7CS8qIEFNTF9JTlRfTkFNRVBBVEhfT1AgKi8KKworCQkJCW5vZGUgPSBvYmpfZGVzYy0+cmVmZXJlbmNlLm5vZGU7CisJCQl9CisKKwkJCS8qIEFsbCAiUmVmZXJlbmNlcyIgcG9pbnQgdG8gYSBOUyBub2RlICovCisKKwkJCWlmIChBQ1BJX0dFVF9ERVNDUklQVE9SX1RZUEUobm9kZSkgIT0KKwkJCSAgICBBQ1BJX0RFU0NfVFlQRV9OQU1FRCkgeworCQkJCUFDUElfRVJST1IoKEFFX0lORk8sICJOb3QgYSBOUyBub2RlICVwIFslc10iLAorCQkJCQkgICAgbm9kZSwKKwkJCQkJICAgIGFjcGlfdXRfZ2V0X2Rlc2NyaXB0b3JfbmFtZShub2RlKSkpOworCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfSU5URVJOQUwpOworCQkJfQorCisJCQkvKiBHZXQgdGhlIGF0dGFjaGVkIG9iamVjdCAqLworCisJCQlvYmpfZGVzYyA9IGFjcGlfbnNfZ2V0X2F0dGFjaGVkX29iamVjdChub2RlKTsKKwkJCWlmICghb2JqX2Rlc2MpIHsKKworCQkJCS8qIE5vIG9iamVjdCwgdXNlIHRoZSBOUyBub2RlIHR5cGUgKi8KKworCQkJCXR5cGUgPSBhY3BpX25zX2dldF90eXBlKG5vZGUpOworCQkJCWdvdG8gZXhpdDsKKwkJCX0KKworCQkJLyogQ2hlY2sgZm9yIGNpcmN1bGFyIHJlZmVyZW5jZXMgKi8KKworCQkJaWYgKG9ial9kZXNjID09IG9wZXJhbmQpIHsKKwkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX0NJUkNVTEFSX1JFRkVSRU5DRSk7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIEFDUElfUkVGQ0xBU1NfSU5ERVg6CisKKwkJCS8qIEdldCB0aGUgdHlwZSBvZiB0aGlzIHJlZmVyZW5jZSAoaW5kZXggaW50byBhbm90aGVyIG9iamVjdCkgKi8KKworCQkJdHlwZSA9IG9ial9kZXNjLT5yZWZlcmVuY2UudGFyZ2V0X3R5cGU7CisJCQlpZiAodHlwZSAhPSBBQ1BJX1RZUEVfUEFDS0FHRSkgeworCQkJCWdvdG8gZXhpdDsKKwkJCX0KKworCQkJLyoKKwkJCSAqIFRoZSBtYWluIG9iamVjdCBpcyBhIHBhY2thZ2UsIHdlIHdhbnQgdG8gZ2V0IHRoZSB0eXBlCisJCQkgKiBvZiB0aGUgaW5kaXZpZHVhbCBwYWNrYWdlIGVsZW1lbnQgdGhhdCBpcyByZWZlcmVuY2VkIGJ5CisJCQkgKiB0aGUgaW5kZXguCisJCQkgKgorCQkJICogVGhpcyBjb3VsZCBvZiBjb3Vyc2UgaW4gdHVybiBiZSBhbm90aGVyIHJlZmVyZW5jZSBvYmplY3QuCisJCQkgKi8KKwkJCW9ial9kZXNjID0gKihvYmpfZGVzYy0+cmVmZXJlbmNlLndoZXJlKTsKKwkJCWlmICghb2JqX2Rlc2MpIHsKKworCQkJCS8qIE5VTEwgcGFja2FnZSBlbGVtZW50cyBhcmUgYWxsb3dlZCAqLworCisJCQkJdHlwZSA9IDA7CS8qIFVuaW5pdGlhbGl6ZWQgKi8KKwkJCQlnb3RvIGV4aXQ7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIEFDUElfUkVGQ0xBU1NfVEFCTEU6CisKKwkJCXR5cGUgPSBBQ1BJX1RZUEVfRERCX0hBTkRMRTsKKwkJCWdvdG8gZXhpdDsKKworCQljYXNlIEFDUElfUkVGQ0xBU1NfTE9DQUw6CisJCWNhc2UgQUNQSV9SRUZDTEFTU19BUkc6CisKKwkJCWlmIChyZXR1cm5fZGVzYykgeworCQkJCXN0YXR1cyA9CisJCQkJICAgIGFjcGlfZHNfbWV0aG9kX2RhdGFfZ2V0X3ZhbHVlKG9ial9kZXNjLT4KKwkJCQkJCQkJICByZWZlcmVuY2UuCisJCQkJCQkJCSAgY2xhc3MsCisJCQkJCQkJCSAgb2JqX2Rlc2MtPgorCQkJCQkJCQkgIHJlZmVyZW5jZS4KKwkJCQkJCQkJICB2YWx1ZSwKKwkJCQkJCQkJICB3YWxrX3N0YXRlLAorCQkJCQkJCQkgICZvYmpfZGVzYyk7CisJCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworCQkJCX0KKwkJCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2Uob2JqX2Rlc2MpOworCQkJfSBlbHNlIHsKKwkJCQlzdGF0dXMgPQorCQkJCSAgICBhY3BpX2RzX21ldGhvZF9kYXRhX2dldF9ub2RlKG9ial9kZXNjLT4KKwkJCQkJCQkJIHJlZmVyZW5jZS4KKwkJCQkJCQkJIGNsYXNzLAorCQkJCQkJCQkgb2JqX2Rlc2MtPgorCQkJCQkJCQkgcmVmZXJlbmNlLgorCQkJCQkJCQkgdmFsdWUsCisJCQkJCQkJCSB3YWxrX3N0YXRlLAorCQkJCQkJCQkgJm5vZGUpOworCQkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKKwkJCQl9CisKKwkJCQlvYmpfZGVzYyA9IGFjcGlfbnNfZ2V0X2F0dGFjaGVkX29iamVjdChub2RlKTsKKwkJCQlpZiAoIW9ial9kZXNjKSB7CisJCQkJCXR5cGUgPSBBQ1BJX1RZUEVfQU5ZOworCQkJCQlnb3RvIGV4aXQ7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBBQ1BJX1JFRkNMQVNTX0RFQlVHOgorCisJCQkvKiBUaGUgRGVidWcgT2JqZWN0IGlzIG9mIHR5cGUgIkRlYnVnT2JqZWN0IiAqLworCisJCQl0eXBlID0gQUNQSV9UWVBFX0RFQlVHX09CSkVDVDsKKwkJCWdvdG8gZXhpdDsKKworCQlkZWZhdWx0OgorCisJCQlBQ1BJX0VSUk9SKChBRV9JTkZPLAorCQkJCSAgICAiVW5rbm93biBSZWZlcmVuY2UgQ2xhc3MgJTIuMlgiLAorCQkJCSAgICBvYmpfZGVzYy0+cmVmZXJlbmNlLmNsYXNzKSk7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX0lOVEVSTkFMKTsKKwkJfQorCX0KKworCS8qCisJICogTm93IHdlIGFyZSBndWFyYW50ZWVkIHRvIGhhdmUgYW4gb2JqZWN0IHRoYXQgaGFzIG5vdCBiZWVuIGNyZWF0ZWQKKwkgKiB2aWEgdGhlIHJlZl9vZiBvciBJbmRleCBvcGVyYXRvcnMuCisJICovCisJdHlwZSA9IEFDUElfR0VUX09CSkVDVF9UWVBFKG9ial9kZXNjKTsKKworICAgICAgZXhpdDoKKwkvKiBDb252ZXJ0IGludGVybmFsIHR5cGVzIHRvIGV4dGVybmFsIHR5cGVzICovCisKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIEFDUElfVFlQRV9MT0NBTF9SRUdJT05fRklFTEQ6CisJY2FzZSBBQ1BJX1RZUEVfTE9DQUxfQkFOS19GSUVMRDoKKwljYXNlIEFDUElfVFlQRV9MT0NBTF9JTkRFWF9GSUVMRDoKKworCQl0eXBlID0gQUNQSV9UWVBFX0ZJRUxEX1VOSVQ7CisJCWJyZWFrOworCisJY2FzZSBBQ1BJX1RZUEVfTE9DQUxfU0NPUEU6CisKKwkJLyogUGVyIEFDUEkgU3BlY2lmaWNhdGlvbiwgU2NvcGUgaXMgdW50eXBlZCAqLworCisJCXR5cGUgPSBBQ1BJX1RZUEVfQU5ZOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCS8qIE5vIGNoYW5nZSB0byBUeXBlIHJlcXVpcmVkICovCisJCWJyZWFrOworCX0KKworCSpyZXR1cm5fdHlwZSA9IHR5cGU7CisJaWYgKHJldHVybl9kZXNjKSB7CisJCSpyZXR1cm5fZGVzYyA9IG9ial9kZXNjOworCX0KKwlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS9leHJlc29wLmMgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2V4cmVzb3AuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzM4MDI3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS9leHJlc29wLmMKQEAgLTAsMCArMSw3MDEgQEAKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIE1vZHVsZSBOYW1lOiBleHJlc29wIC0gQU1MIEludGVycHJldGVyIG9wZXJhbmQvb2JqZWN0IHJlc29sdXRpb24KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA4LCBJbnRlbCBDb3JwLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAorICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgYXQgbWluaW11bSBhIGRpc2NsYWltZXIKKyAqICAgIHN1YnN0YW50aWFsbHkgc2ltaWxhciB0byB0aGUgIk5PIFdBUlJBTlRZIiBkaXNjbGFpbWVyIGJlbG93CisgKiAgICAoIkRpc2NsYWltZXIiKSBhbmQgYW55IHJlZGlzdHJpYnV0aW9uIG11c3QgYmUgY29uZGl0aW9uZWQgdXBvbgorICogICAgaW5jbHVkaW5nIGEgc3Vic3RhbnRpYWxseSBzaW1pbGFyIERpc2NsYWltZXIgcmVxdWlyZW1lbnQgZm9yIGZ1cnRoZXIKKyAqICAgIGJpbmFyeSByZWRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcworICogICAgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBOTyBXQVJSQU5UWQorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcKKyAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgorICovCisKKyNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KKyNpbmNsdWRlICJhY2NvbW1vbi5oIgorI2luY2x1ZGUgImFtbGNvZGUuaCIKKyNpbmNsdWRlICJhY3BhcnNlci5oIgorI2luY2x1ZGUgImFjaW50ZXJwLmgiCisjaW5jbHVkZSAiYWNuYW1lc3AuaCIKKworI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfRVhFQ1VURVIKK0FDUElfTU9EVUxFX05BTUUoImV4cmVzb3AiKQorCisvKiBMb2NhbCBwcm90b3R5cGVzICovCitzdGF0aWMgYWNwaV9zdGF0dXMKK2FjcGlfZXhfY2hlY2tfb2JqZWN0X3R5cGUoYWNwaV9vYmplY3RfdHlwZSB0eXBlX25lZWRlZCwKKwkJCSAgYWNwaV9vYmplY3RfdHlwZSB0aGlzX3R5cGUsIHZvaWQgKm9iamVjdCk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfZXhfY2hlY2tfb2JqZWN0X3R5cGUKKyAqCisgKiBQQVJBTUVURVJTOiAgdHlwZV9uZWVkZWQgICAgICAgICBPYmplY3QgdHlwZSBuZWVkZWQKKyAqICAgICAgICAgICAgICB0aGlzX3R5cGUgICAgICAgICAgIEFjdHVhbCBvYmplY3QgdHlwZQorICogICAgICAgICAgICAgIE9iamVjdCAgICAgICAgICAgICAgT2JqZWN0IHBvaW50ZXIKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IENoZWNrIHJlcXVpcmVkIHR5cGUgYWdhaW5zdCBhY3R1YWwgdHlwZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBhY3BpX3N0YXR1cworYWNwaV9leF9jaGVja19vYmplY3RfdHlwZShhY3BpX29iamVjdF90eXBlIHR5cGVfbmVlZGVkLAorCQkJICBhY3BpX29iamVjdF90eXBlIHRoaXNfdHlwZSwgdm9pZCAqb2JqZWN0KQoreworCUFDUElfRlVOQ1RJT05fRU5UUlkoKTsKKworCWlmICh0eXBlX25lZWRlZCA9PSBBQ1BJX1RZUEVfQU5ZKSB7CisKKwkJLyogQWxsIHR5cGVzIE9LLCBzbyB3ZSBkb24ndCBwZXJmb3JtIGFueSB0eXBlY2hlY2tzICovCisKKwkJcmV0dXJuIChBRV9PSyk7CisJfQorCisJaWYgKHR5cGVfbmVlZGVkID09IEFDUElfVFlQRV9MT0NBTF9SRUZFUkVOQ0UpIHsKKwkJLyoKKwkJICogQWxsb3cgdGhlIEFNTCAiQ29uc3RhbnQiIG9wY29kZXMgKFplcm8sIE9uZSwgZXRjLikgdG8gYmUgcmVmZXJlbmNlCisJCSAqIG9iamVjdHMgYW5kIHRodXMgYWxsb3cgdGhlbSB0byBiZSB0YXJnZXRzLiAgKEFzIHBlciB0aGUgQUNQSQorCQkgKiBzcGVjaWZpY2F0aW9uLCBhIHN0b3JlIHRvIGEgY29uc3RhbnQgaXMgYSBub29wLikKKwkJICovCisJCWlmICgodGhpc190eXBlID09IEFDUElfVFlQRV9JTlRFR0VSKSAmJgorCQkgICAgKCgodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKW9iamVjdCktPmNvbW1vbi4KKwkJICAgICBmbGFncyAmIEFPUE9CSl9BTUxfQ09OU1RBTlQpKSB7CisJCQlyZXR1cm4gKEFFX09LKTsKKwkJfQorCX0KKworCWlmICh0eXBlX25lZWRlZCAhPSB0aGlzX3R5cGUpIHsKKwkJQUNQSV9FUlJPUigoQUVfSU5GTywKKwkJCSAgICAiTmVlZGVkIHR5cGUgWyVzXSwgZm91bmQgWyVzXSAlcCIsCisJCQkgICAgYWNwaV91dF9nZXRfdHlwZV9uYW1lKHR5cGVfbmVlZGVkKSwKKwkJCSAgICBhY3BpX3V0X2dldF90eXBlX25hbWUodGhpc190eXBlKSwgb2JqZWN0KSk7CisKKwkJcmV0dXJuIChBRV9BTUxfT1BFUkFORF9UWVBFKTsKKwl9CisKKwlyZXR1cm4gKEFFX09LKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9leF9yZXNvbHZlX29wZXJhbmRzCisgKgorICogUEFSQU1FVEVSUzogIE9wY29kZSAgICAgICAgICAgICAgLSBPcGNvZGUgYmVpbmcgaW50ZXJwcmV0ZWQKKyAqICAgICAgICAgICAgICBzdGFja19wdHIgICAgICAgICAgIC0gUG9pbnRlciB0byB0aGUgb3BlcmFuZCBzdGFjayB0byBiZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlZAorICogICAgICAgICAgICAgIHdhbGtfc3RhdGUgICAgICAgICAgLSBDdXJyZW50IHN0YXRlCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBDb252ZXJ0IG11bHRpcGxlIGlucHV0IG9wZXJhbmRzIHRvIHRoZSB0eXBlcyByZXF1aXJlZCBieSB0aGUKKyAqICAgICAgICAgICAgICB0YXJnZXQgb3BlcmF0b3IuCisgKgorICogICAgICBFYWNoIDUtYml0IGdyb3VwIGluIGFyZ190eXBlcyByZXByZXNlbnRzIG9uZSByZXF1aXJlZAorICogICAgICBvcGVyYW5kIGFuZCBpbmRpY2F0ZXMgdGhlIHJlcXVpcmVkIFR5cGUuIFRoZSBjb3JyZXNwb25kaW5nIG9wZXJhbmQKKyAqICAgICAgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gdGhlIHJlcXVpcmVkIHR5cGUgaWYgcG9zc2libGUsIG90aGVyd2lzZSB3ZQorICogICAgICBhYm9ydCB3aXRoIGFuIGV4Y2VwdGlvbi4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCithY3BpX3N0YXR1cworYWNwaV9leF9yZXNvbHZlX29wZXJhbmRzKHUxNiBvcGNvZGUsCisJCQkgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKiBzdGFja19wdHIsCisJCQkgc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqIHdhbGtfc3RhdGUpCit7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2M7CisJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CisJdTggb2JqZWN0X3R5cGU7CisJdTMyIGFyZ190eXBlczsKKwljb25zdCBzdHJ1Y3QgYWNwaV9vcGNvZGVfaW5mbyAqb3BfaW5mbzsKKwl1MzIgdGhpc19hcmdfdHlwZTsKKwlhY3BpX29iamVjdF90eXBlIHR5cGVfbmVlZGVkOworCXUxNiB0YXJnZXRfb3AgPSAwOworCisJQUNQSV9GVU5DVElPTl9UUkFDRV9VMzIoZXhfcmVzb2x2ZV9vcGVyYW5kcywgb3Bjb2RlKTsKKworCW9wX2luZm8gPSBhY3BpX3BzX2dldF9vcGNvZGVfaW5mbyhvcGNvZGUpOworCWlmIChvcF9pbmZvLT5jbGFzcyA9PSBBTUxfQ0xBU1NfVU5LTk9XTikgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX0JBRF9PUENPREUpOworCX0KKworCWFyZ190eXBlcyA9IG9wX2luZm8tPnJ1bnRpbWVfYXJnczsKKwlpZiAoYXJnX3R5cGVzID09IEFSR0lfSU5WQUxJRF9PUENPREUpIHsKKwkJQUNQSV9FUlJPUigoQUVfSU5GTywgIlVua25vd24gQU1MIG9wY29kZSAlWCIsIG9wY29kZSkpOworCisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfSU5URVJOQUwpOworCX0KKworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVhFQywKKwkJCSAgIk9wY29kZSAlWCBbJXNdIFJlcXVpcmVkT3BlcmFuZFR5cGVzPSU4LjhYXG4iLAorCQkJICBvcGNvZGUsIG9wX2luZm8tPm5hbWUsIGFyZ190eXBlcykpOworCisJLyoKKwkgKiBOb3JtYWwgZXhpdCBpcyB3aXRoIChhcmdfdHlwZXMgPT0gMCkgYXQgZW5kIG9mIGFyZ3VtZW50IGxpc3QuCisJICogRnVuY3Rpb24gd2lsbCByZXR1cm4gYW4gZXhjZXB0aW9uIGZyb20gd2l0aGluIHRoZSBsb29wIHVwb24KKwkgKiBmaW5kaW5nIGFuIGVudHJ5IHdoaWNoIGlzIG5vdCAob3IgY2Fubm90IGJlIGNvbnZlcnRlZAorCSAqIHRvKSB0aGUgcmVxdWlyZWQgdHlwZTsgaWYgc3RhY2sgdW5kZXJmbG93czsgb3IgdXBvbgorCSAqIGZpbmRpbmcgYSBOVUxMIHN0YWNrIGVudHJ5ICh3aGljaCBzaG91bGQgbm90IGhhcHBlbikuCisJICovCisJd2hpbGUgKEdFVF9DVVJSRU5UX0FSR19UWVBFKGFyZ190eXBlcykpIHsKKwkJaWYgKCFzdGFja19wdHIgfHwgISpzdGFja19wdHIpIHsKKwkJCUFDUElfRVJST1IoKEFFX0lORk8sICJOdWxsIHN0YWNrIGVudHJ5IGF0ICVwIiwKKwkJCQkgICAgc3RhY2tfcHRyKSk7CisKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfSU5URVJOQUwpOworCQl9CisKKwkJLyogRXh0cmFjdCB1c2VmdWwgaXRlbXMgKi8KKworCQlvYmpfZGVzYyA9ICpzdGFja19wdHI7CisKKwkJLyogRGVjb2RlIHRoZSBkZXNjcmlwdG9yIHR5cGUgKi8KKworCQlzd2l0Y2ggKEFDUElfR0VUX0RFU0NSSVBUT1JfVFlQRShvYmpfZGVzYykpIHsKKwkJY2FzZSBBQ1BJX0RFU0NfVFlQRV9OQU1FRDoKKworCQkJLyogTmFtZXNwYWNlIE5vZGUgKi8KKworCQkJb2JqZWN0X3R5cGUgPQorCQkJICAgICgoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKilvYmpfZGVzYyktPnR5cGU7CisKKwkJCS8qCisJCQkgKiBSZXNvbHZlIGFuIGFsaWFzIG9iamVjdC4gVGhlIGNvbnN0cnVjdGlvbiBvZiB0aGVzZSBvYmplY3RzCisJCQkgKiBndWFyYW50ZWVzIHRoYXQgdGhlcmUgaXMgb25seSBvbmUgbGV2ZWwgb2YgYWxpYXMgaW5kaXJlY3Rpb247CisJCQkgKiB0aHVzLCB0aGUgYXR0YWNoZWQgb2JqZWN0IGlzIGFsd2F5cyB0aGUgYWxpYXNlZCBuYW1lc3BhY2Ugbm9kZQorCQkJICovCisJCQlpZiAob2JqZWN0X3R5cGUgPT0gQUNQSV9UWVBFX0xPQ0FMX0FMSUFTKSB7CisJCQkJb2JqX2Rlc2MgPQorCQkJCSAgICBhY3BpX25zX2dldF9hdHRhY2hlZF9vYmplY3QoKHN0cnVjdAorCQkJCQkJCQkgYWNwaV9uYW1lc3BhY2Vfbm9kZQorCQkJCQkJCQkgKilvYmpfZGVzYyk7CisJCQkJKnN0YWNrX3B0ciA9IG9ial9kZXNjOworCQkJCW9iamVjdF90eXBlID0KKwkJCQkgICAgKChzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqKW9ial9kZXNjKS0+CisJCQkJICAgIHR5cGU7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIEFDUElfREVTQ19UWVBFX09QRVJBTkQ6CisKKwkJCS8qIEFDUEkgaW50ZXJuYWwgb2JqZWN0ICovCisKKwkJCW9iamVjdF90eXBlID0gQUNQSV9HRVRfT0JKRUNUX1RZUEUob2JqX2Rlc2MpOworCisJCQkvKiBDaGVjayBmb3IgYmFkIGFjcGlfb2JqZWN0X3R5cGUgKi8KKworCQkJaWYgKCFhY3BpX3V0X3ZhbGlkX29iamVjdF90eXBlKG9iamVjdF90eXBlKSkgeworCQkJCUFDUElfRVJST1IoKEFFX0lORk8sCisJCQkJCSAgICAiQmFkIG9wZXJhbmQgb2JqZWN0IHR5cGUgWyVYXSIsCisJCQkJCSAgICBvYmplY3RfdHlwZSkpOworCisJCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9PUEVSQU5EX1RZUEUpOworCQkJfQorCisJCQlpZiAob2JqZWN0X3R5cGUgPT0gKHU4KSBBQ1BJX1RZUEVfTE9DQUxfUkVGRVJFTkNFKSB7CisKKwkJCQkvKiBWYWxpZGF0ZSB0aGUgUmVmZXJlbmNlICovCisKKwkJCQlzd2l0Y2ggKG9ial9kZXNjLT5yZWZlcmVuY2UuY2xhc3MpIHsKKwkJCQljYXNlIEFDUElfUkVGQ0xBU1NfREVCVUc6CisKKwkJCQkJdGFyZ2V0X29wID0gQU1MX0RFQlVHX09QOworCisJCQkJCS8qbGludCAtZmFsbHRocm91Z2ggKi8KKworCQkJCWNhc2UgQUNQSV9SRUZDTEFTU19BUkc6CisJCQkJY2FzZSBBQ1BJX1JFRkNMQVNTX0xPQ0FMOgorCQkJCWNhc2UgQUNQSV9SRUZDTEFTU19JTkRFWDoKKwkJCQljYXNlIEFDUElfUkVGQ0xBU1NfUkVGT0Y6CisJCQkJY2FzZSBBQ1BJX1JFRkNMQVNTX1RBQkxFOgkvKiBkZGJfaGFuZGxlIGZyb20gTE9BRF9PUCBvciBMT0FEX1RBQkxFX09QICovCisJCQkJY2FzZSBBQ1BJX1JFRkNMQVNTX05BTUU6CS8qIFJlZmVyZW5jZSB0byBhIG5hbWVkIG9iamVjdCAqLworCisJCQkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVhFQywKKwkJCQkJCQkgICJPcGVyYW5kIGlzIGEgUmVmZXJlbmNlLCBDbGFzcyBbJXNdICUyLjJYXG4iLAorCQkJCQkJCSAgYWNwaV91dF9nZXRfcmVmZXJlbmNlX25hbWUKKwkJCQkJCQkgIChvYmpfZGVzYyksCisJCQkJCQkJICBvYmpfZGVzYy0+cmVmZXJlbmNlLgorCQkJCQkJCSAgY2xhc3MpKTsKKwkJCQkJYnJlYWs7CisKKwkJCQlkZWZhdWx0OgorCisJCQkJCUFDUElfRVJST1IoKEFFX0lORk8sCisJCQkJCQkgICAgIlVua25vd24gUmVmZXJlbmNlIENsYXNzICUyLjJYIGluICVwIiwKKwkJCQkJCSAgICBvYmpfZGVzYy0+cmVmZXJlbmNlLmNsYXNzLAorCQkJCQkJICAgIG9ial9kZXNjKSk7CisKKwkJCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9PUEVSQU5EX1RZUEUpOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisKKwkJCS8qIEludmFsaWQgZGVzY3JpcHRvciAqLworCisJCQlBQ1BJX0VSUk9SKChBRV9JTkZPLCAiSW52YWxpZCBkZXNjcmlwdG9yICVwIFslc10iLAorCQkJCSAgICBvYmpfZGVzYywKKwkJCQkgICAgYWNwaV91dF9nZXRfZGVzY3JpcHRvcl9uYW1lKG9ial9kZXNjKSkpOworCisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX09QRVJBTkRfVFlQRSk7CisJCX0KKworCQkvKiBHZXQgb25lIGFyZ3VtZW50IHR5cGUsIHBvaW50IHRvIHRoZSBuZXh0ICovCisKKwkJdGhpc19hcmdfdHlwZSA9IEdFVF9DVVJSRU5UX0FSR19UWVBFKGFyZ190eXBlcyk7CisJCUlOQ1JFTUVOVF9BUkdfTElTVChhcmdfdHlwZXMpOworCisJCS8qCisJCSAqIEhhbmRsZSBjYXNlcyB3aGVyZSB0aGUgb2JqZWN0IGRvZXMgbm90IG5lZWQgdG8gYmUKKwkJICogcmVzb2x2ZWQgdG8gYSB2YWx1ZQorCQkgKi8KKwkJc3dpdGNoICh0aGlzX2FyZ190eXBlKSB7CisJCWNhc2UgQVJHSV9SRUZfT1JfU1RSSU5HOgkvKiBDYW4gYmUgYSBTdHJpbmcgb3IgUmVmZXJlbmNlICovCisKKwkJCWlmICgoQUNQSV9HRVRfREVTQ1JJUFRPUl9UWVBFKG9ial9kZXNjKSA9PQorCQkJICAgICBBQ1BJX0RFU0NfVFlQRV9PUEVSQU5EKQorCQkJICAgICYmIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRShvYmpfZGVzYykgPT0KKwkJCQlBQ1BJX1RZUEVfU1RSSU5HKSkgeworCQkJCS8qCisJCQkJICogU3RyaW5nIGZvdW5kIC0gdGhlIHN0cmluZyByZWZlcmVuY2VzIGEgbmFtZWQgb2JqZWN0IGFuZAorCQkJCSAqIG11c3QgYmUgcmVzb2x2ZWQgdG8gYSBub2RlCisJCQkJICovCisJCQkJZ290byBuZXh0X29wZXJhbmQ7CisJCQl9CisKKwkJCS8qCisJCQkgKiBFbHNlIG5vdCBhIHN0cmluZyAtIGZhbGwgdGhyb3VnaCB0byB0aGUgbm9ybWFsIFJlZmVyZW5jZQorCQkJICogY2FzZSBiZWxvdworCQkJICovCisJCQkvKmxpbnQgLWZhbGx0aHJvdWdoICovCisKKwkJY2FzZSBBUkdJX1JFRkVSRU5DRToJLyogUmVmZXJlbmNlczogKi8KKwkJY2FzZSBBUkdJX0lOVEVHRVJfUkVGOgorCQljYXNlIEFSR0lfT0JKRUNUX1JFRjoKKwkJY2FzZSBBUkdJX0RFVklDRV9SRUY6CisJCWNhc2UgQVJHSV9UQVJHRVRSRUY6CS8qIEFsbG93cyBpbXBsaWNpdCBjb252ZXJzaW9uIHJ1bGVzIGJlZm9yZSBzdG9yZSAqLworCQljYXNlIEFSR0lfRklYRURfVEFSR0VUOgkvKiBObyBpbXBsaWNpdCBjb252ZXJzaW9uIGJlZm9yZSBzdG9yZSB0byB0YXJnZXQgKi8KKwkJY2FzZSBBUkdJX1NJTVBMRV9UQVJHRVQ6CS8qIE5hbWUsIExvY2FsLCBvciBBcmcgLSBubyBpbXBsaWNpdCBjb252ZXJzaW9uICAqLworCisJCQkvKgorCQkJICogTmVlZCBhbiBvcGVyYW5kIG9mIHR5cGUgQUNQSV9UWVBFX0xPQ0FMX1JFRkVSRU5DRQorCQkJICogQSBOYW1lc3BhY2UgTm9kZSBpcyBPSyBhcy1pcworCQkJICovCisJCQlpZiAoQUNQSV9HRVRfREVTQ1JJUFRPUl9UWVBFKG9ial9kZXNjKSA9PQorCQkJICAgIEFDUElfREVTQ19UWVBFX05BTUVEKSB7CisJCQkJZ290byBuZXh0X29wZXJhbmQ7CisJCQl9CisKKwkJCXN0YXR1cyA9CisJCQkgICAgYWNwaV9leF9jaGVja19vYmplY3RfdHlwZShBQ1BJX1RZUEVfTE9DQUxfUkVGRVJFTkNFLAorCQkJCQkJICAgICAgb2JqZWN0X3R5cGUsIG9ial9kZXNjKTsKKwkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworCQkJfQorCQkJZ290byBuZXh0X29wZXJhbmQ7CisKKwkJY2FzZSBBUkdJX0RBVEFSRUZPQko6CS8qIFN0b3JlIG9wZXJhdG9yIG9ubHkgKi8KKworCQkJLyoKKwkJCSAqIFdlIGRvbid0IHdhbnQgdG8gcmVzb2x2ZSBpbmRleF9vcCByZWZlcmVuY2Ugb2JqZWN0cyBkdXJpbmcKKwkJCSAqIGEgc3RvcmUgYmVjYXVzZSB0aGlzIHdvdWxkIGJlIGFuIGltcGxpY2l0IGRlX3JlZl9vZiBvcGVyYXRpb24uCisJCQkgKiBJbnN0ZWFkLCB3ZSBqdXN0IHdhbnQgdG8gc3RvcmUgdGhlIHJlZmVyZW5jZSBvYmplY3QuCisJCQkgKiAtLSBBbGwgb3RoZXJzIG11c3QgYmUgcmVzb2x2ZWQgYmVsb3cuCisJCQkgKi8KKwkJCWlmICgob3Bjb2RlID09IEFNTF9TVE9SRV9PUCkgJiYKKwkJCSAgICAoQUNQSV9HRVRfT0JKRUNUX1RZUEUoKnN0YWNrX3B0cikgPT0KKwkJCSAgICAgQUNQSV9UWVBFX0xPQ0FMX1JFRkVSRU5DRSkKKwkJCSAgICAmJiAoKCpzdGFja19wdHIpLT5yZWZlcmVuY2UuY2xhc3MgPT0gQUNQSV9SRUZDTEFTU19JTkRFWCkpIHsKKwkJCQlnb3RvIG5leHRfb3BlcmFuZDsKKwkJCX0KKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQkvKiBBbGwgY2FzZXMgY292ZXJlZCBhYm92ZSAqLworCQkJYnJlYWs7CisJCX0KKworCQkvKgorCQkgKiBSZXNvbHZlIHRoaXMgb2JqZWN0IHRvIGEgdmFsdWUKKwkJICovCisJCXN0YXR1cyA9IGFjcGlfZXhfcmVzb2x2ZV90b192YWx1ZShzdGFja19wdHIsIHdhbGtfc3RhdGUpOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworCQl9CisKKwkJLyogR2V0IHRoZSByZXNvbHZlZCBvYmplY3QgKi8KKworCQlvYmpfZGVzYyA9ICpzdGFja19wdHI7CisKKwkJLyoKKwkJICogQ2hlY2sgdGhlIHJlc3VsdGluZyBvYmplY3QgKHZhbHVlKSB0eXBlCisJCSAqLworCQlzd2l0Y2ggKHRoaXNfYXJnX3R5cGUpIHsKKwkJCS8qCisJCQkgKiBGb3IgdGhlIHNpbXBsZSBjYXNlcywgb25seSBvbmUgdHlwZSBvZiByZXNvbHZlZCBvYmplY3QKKwkJCSAqIGlzIGFsbG93ZWQKKwkJCSAqLworCQljYXNlIEFSR0lfTVVURVg6CisKKwkJCS8qIE5lZWQgYW4gb3BlcmFuZCBvZiB0eXBlIEFDUElfVFlQRV9NVVRFWCAqLworCisJCQl0eXBlX25lZWRlZCA9IEFDUElfVFlQRV9NVVRFWDsKKwkJCWJyZWFrOworCisJCWNhc2UgQVJHSV9FVkVOVDoKKworCQkJLyogTmVlZCBhbiBvcGVyYW5kIG9mIHR5cGUgQUNQSV9UWVBFX0VWRU5UICovCisKKwkJCXR5cGVfbmVlZGVkID0gQUNQSV9UWVBFX0VWRU5UOworCQkJYnJlYWs7CisKKwkJY2FzZSBBUkdJX1BBQ0tBR0U6CS8qIFBhY2thZ2UgKi8KKworCQkJLyogTmVlZCBhbiBvcGVyYW5kIG9mIHR5cGUgQUNQSV9UWVBFX1BBQ0tBR0UgKi8KKworCQkJdHlwZV9uZWVkZWQgPSBBQ1BJX1RZUEVfUEFDS0FHRTsKKwkJCWJyZWFrOworCisJCWNhc2UgQVJHSV9BTllUWVBFOgorCisJCQkvKiBBbnkgb3BlcmFuZCB0eXBlIHdpbGwgZG8gKi8KKworCQkJdHlwZV9uZWVkZWQgPSBBQ1BJX1RZUEVfQU5ZOworCQkJYnJlYWs7CisKKwkJY2FzZSBBUkdJX0REQkhBTkRMRToKKworCQkJLyogTmVlZCBhbiBvcGVyYW5kIG9mIHR5cGUgQUNQSV9UWVBFX0REQl9IQU5ETEUgKi8KKworCQkJdHlwZV9uZWVkZWQgPSBBQ1BJX1RZUEVfTE9DQUxfUkVGRVJFTkNFOworCQkJYnJlYWs7CisKKwkJCS8qCisJCQkgKiBUaGUgbW9yZSBjb21wbGV4IGNhc2VzIGFsbG93IG11bHRpcGxlIHJlc29sdmVkIG9iamVjdCB0eXBlcworCQkJICovCisJCWNhc2UgQVJHSV9JTlRFR0VSOgorCisJCQkvKgorCQkJICogTmVlZCBhbiBvcGVyYW5kIG9mIHR5cGUgQUNQSV9UWVBFX0lOVEVHRVIsCisJCQkgKiBCdXQgd2UgY2FuIGltcGxpY2l0bHkgY29udmVydCBmcm9tIGEgU1RSSU5HIG9yIEJVRkZFUgorCQkJICogQWthIC0gIkltcGxpY2l0IFNvdXJjZSBPcGVyYW5kIENvbnZlcnNpb24iCisJCQkgKi8KKwkJCXN0YXR1cyA9CisJCQkgICAgYWNwaV9leF9jb252ZXJ0X3RvX2ludGVnZXIob2JqX2Rlc2MsIHN0YWNrX3B0ciwgMTYpOworCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQkJaWYgKHN0YXR1cyA9PSBBRV9UWVBFKSB7CisJCQkJCUFDUElfRVJST1IoKEFFX0lORk8sCisJCQkJCQkgICAgIk5lZWRlZCBbSW50ZWdlci9TdHJpbmcvQnVmZmVyXSwgZm91bmQgWyVzXSAlcCIsCisJCQkJCQkgICAgYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZQorCQkJCQkJICAgIChvYmpfZGVzYyksIG9ial9kZXNjKSk7CisKKwkJCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9PUEVSQU5EX1RZUEUpOworCQkJCX0KKworCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworCQkJfQorCisJCQlpZiAob2JqX2Rlc2MgIT0gKnN0YWNrX3B0cikgeworCQkJCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZShvYmpfZGVzYyk7CisJCQl9CisJCQlnb3RvIG5leHRfb3BlcmFuZDsKKworCQljYXNlIEFSR0lfQlVGRkVSOgorCisJCQkvKgorCQkJICogTmVlZCBhbiBvcGVyYW5kIG9mIHR5cGUgQUNQSV9UWVBFX0JVRkZFUiwKKwkJCSAqIEJ1dCB3ZSBjYW4gaW1wbGljaXRseSBjb252ZXJ0IGZyb20gYSBTVFJJTkcgb3IgSU5URUdFUgorCQkJICogQWthIC0gIkltcGxpY2l0IFNvdXJjZSBPcGVyYW5kIENvbnZlcnNpb24iCisJCQkgKi8KKwkJCXN0YXR1cyA9IGFjcGlfZXhfY29udmVydF90b19idWZmZXIob2JqX2Rlc2MsIHN0YWNrX3B0cik7CisJCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCQlpZiAoc3RhdHVzID09IEFFX1RZUEUpIHsKKwkJCQkJQUNQSV9FUlJPUigoQUVfSU5GTywKKwkJCQkJCSAgICAiTmVlZGVkIFtJbnRlZ2VyL1N0cmluZy9CdWZmZXJdLCBmb3VuZCBbJXNdICVwIiwKKwkJCQkJCSAgICBhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lCisJCQkJCQkgICAgKG9ial9kZXNjKSwgb2JqX2Rlc2MpKTsKKworCQkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX09QRVJBTkRfVFlQRSk7CisJCQkJfQorCisJCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CisJCQl9CisKKwkJCWlmIChvYmpfZGVzYyAhPSAqc3RhY2tfcHRyKSB7CisJCQkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKG9ial9kZXNjKTsKKwkJCX0KKwkJCWdvdG8gbmV4dF9vcGVyYW5kOworCisJCWNhc2UgQVJHSV9TVFJJTkc6CisKKwkJCS8qCisJCQkgKiBOZWVkIGFuIG9wZXJhbmQgb2YgdHlwZSBBQ1BJX1RZUEVfU1RSSU5HLAorCQkJICogQnV0IHdlIGNhbiBpbXBsaWNpdGx5IGNvbnZlcnQgZnJvbSBhIEJVRkZFUiBvciBJTlRFR0VSCisJCQkgKiBBa2EgLSAiSW1wbGljaXQgU291cmNlIE9wZXJhbmQgQ29udmVyc2lvbiIKKwkJCSAqLworCQkJc3RhdHVzID0gYWNwaV9leF9jb252ZXJ0X3RvX3N0cmluZyhvYmpfZGVzYywgc3RhY2tfcHRyLAorCQkJCQkJCSAgIEFDUElfSU1QTElDSVRfQ09OVkVSVF9IRVgpOworCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQkJaWYgKHN0YXR1cyA9PSBBRV9UWVBFKSB7CisJCQkJCUFDUElfRVJST1IoKEFFX0lORk8sCisJCQkJCQkgICAgIk5lZWRlZCBbSW50ZWdlci9TdHJpbmcvQnVmZmVyXSwgZm91bmQgWyVzXSAlcCIsCisJCQkJCQkgICAgYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZQorCQkJCQkJICAgIChvYmpfZGVzYyksIG9ial9kZXNjKSk7CisKKwkJCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9PUEVSQU5EX1RZUEUpOworCQkJCX0KKworCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworCQkJfQorCisJCQlpZiAob2JqX2Rlc2MgIT0gKnN0YWNrX3B0cikgeworCQkJCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZShvYmpfZGVzYyk7CisJCQl9CisJCQlnb3RvIG5leHRfb3BlcmFuZDsKKworCQljYXNlIEFSR0lfQ09NUFVURURBVEE6CisKKwkJCS8qIE5lZWQgYW4gb3BlcmFuZCBvZiB0eXBlIElOVEVHRVIsIFNUUklORyBvciBCVUZGRVIgKi8KKworCQkJc3dpdGNoIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRShvYmpfZGVzYykpIHsKKwkJCWNhc2UgQUNQSV9UWVBFX0lOVEVHRVI6CisJCQljYXNlIEFDUElfVFlQRV9TVFJJTkc6CisJCQljYXNlIEFDUElfVFlQRV9CVUZGRVI6CisKKwkJCQkvKiBWYWxpZCBvcGVyYW5kICovCisJCQkJYnJlYWs7CisKKwkJCWRlZmF1bHQ6CisJCQkJQUNQSV9FUlJPUigoQUVfSU5GTywKKwkJCQkJICAgICJOZWVkZWQgW0ludGVnZXIvU3RyaW5nL0J1ZmZlcl0sIGZvdW5kIFslc10gJXAiLAorCQkJCQkgICAgYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZQorCQkJCQkgICAgKG9ial9kZXNjKSwgb2JqX2Rlc2MpKTsKKworCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfT1BFUkFORF9UWVBFKTsKKwkJCX0KKwkJCWdvdG8gbmV4dF9vcGVyYW5kOworCisJCWNhc2UgQVJHSV9CVUZGRVJfT1JfU1RSSU5HOgorCisJCQkvKiBOZWVkIGFuIG9wZXJhbmQgb2YgdHlwZSBTVFJJTkcgb3IgQlVGRkVSICovCisKKwkJCXN3aXRjaCAoQUNQSV9HRVRfT0JKRUNUX1RZUEUob2JqX2Rlc2MpKSB7CisJCQljYXNlIEFDUElfVFlQRV9TVFJJTkc6CisJCQljYXNlIEFDUElfVFlQRV9CVUZGRVI6CisKKwkJCQkvKiBWYWxpZCBvcGVyYW5kICovCisJCQkJYnJlYWs7CisKKwkJCWNhc2UgQUNQSV9UWVBFX0lOVEVHRVI6CisKKwkJCQkvKiBIaWdoZXN0IHByaW9yaXR5IGNvbnZlcnNpb24gaXMgdG8gdHlwZSBCdWZmZXIgKi8KKworCQkJCXN0YXR1cyA9CisJCQkJICAgIGFjcGlfZXhfY29udmVydF90b19idWZmZXIob2JqX2Rlc2MsCisJCQkJCQkJICAgICAgc3RhY2tfcHRyKTsKKwkJCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CisJCQkJfQorCisJCQkJaWYgKG9ial9kZXNjICE9ICpzdGFja19wdHIpIHsKKwkJCQkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKG9ial9kZXNjKTsKKwkJCQl9CisJCQkJYnJlYWs7CisKKwkJCWRlZmF1bHQ6CisJCQkJQUNQSV9FUlJPUigoQUVfSU5GTywKKwkJCQkJICAgICJOZWVkZWQgW0ludGVnZXIvU3RyaW5nL0J1ZmZlcl0sIGZvdW5kIFslc10gJXAiLAorCQkJCQkgICAgYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZQorCQkJCQkgICAgKG9ial9kZXNjKSwgb2JqX2Rlc2MpKTsKKworCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfT1BFUkFORF9UWVBFKTsKKwkJCX0KKwkJCWdvdG8gbmV4dF9vcGVyYW5kOworCisJCWNhc2UgQVJHSV9EQVRBT0JKRUNUOgorCQkJLyoKKwkJCSAqIEFSR0lfREFUQU9CSkVDVCBpcyBvbmx5IHVzZWQgYnkgdGhlIHNpemVfb2Ygb3BlcmF0b3IuCisJCQkgKiBOZWVkIGEgYnVmZmVyLCBzdHJpbmcsIHBhY2thZ2UsIG9yIHJlZl9vZiByZWZlcmVuY2UuCisJCQkgKgorCQkJICogVGhlIG9ubHkgcmVmZXJlbmNlIGFsbG93ZWQgaGVyZSBpcyBhIGRpcmVjdCByZWZlcmVuY2UgdG8KKwkJCSAqIGEgbmFtZXNwYWNlIG5vZGUuCisJCQkgKi8KKwkJCXN3aXRjaCAoQUNQSV9HRVRfT0JKRUNUX1RZUEUob2JqX2Rlc2MpKSB7CisJCQljYXNlIEFDUElfVFlQRV9QQUNLQUdFOgorCQkJY2FzZSBBQ1BJX1RZUEVfU1RSSU5HOgorCQkJY2FzZSBBQ1BJX1RZUEVfQlVGRkVSOgorCQkJY2FzZSBBQ1BJX1RZUEVfTE9DQUxfUkVGRVJFTkNFOgorCisJCQkJLyogVmFsaWQgb3BlcmFuZCAqLworCQkJCWJyZWFrOworCisJCQlkZWZhdWx0OgorCQkJCUFDUElfRVJST1IoKEFFX0lORk8sCisJCQkJCSAgICAiTmVlZGVkIFtCdWZmZXIvU3RyaW5nL1BhY2thZ2UvUmVmZXJlbmNlXSwgZm91bmQgWyVzXSAlcCIsCisJCQkJCSAgICBhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lCisJCQkJCSAgICAob2JqX2Rlc2MpLCBvYmpfZGVzYykpOworCisJCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9PUEVSQU5EX1RZUEUpOworCQkJfQorCQkJZ290byBuZXh0X29wZXJhbmQ7CisKKwkJY2FzZSBBUkdJX0NPTVBMRVhPQko6CisKKwkJCS8qIE5lZWQgYSBidWZmZXIgb3IgcGFja2FnZSBvciAoQUNQSSAyLjApIFN0cmluZyAqLworCisJCQlzd2l0Y2ggKEFDUElfR0VUX09CSkVDVF9UWVBFKG9ial9kZXNjKSkgeworCQkJY2FzZSBBQ1BJX1RZUEVfUEFDS0FHRToKKwkJCWNhc2UgQUNQSV9UWVBFX1NUUklORzoKKwkJCWNhc2UgQUNQSV9UWVBFX0JVRkZFUjoKKworCQkJCS8qIFZhbGlkIG9wZXJhbmQgKi8KKwkJCQlicmVhazsKKworCQkJZGVmYXVsdDoKKwkJCQlBQ1BJX0VSUk9SKChBRV9JTkZPLAorCQkJCQkgICAgIk5lZWRlZCBbQnVmZmVyL1N0cmluZy9QYWNrYWdlXSwgZm91bmQgWyVzXSAlcCIsCisJCQkJCSAgICBhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lCisJCQkJCSAgICAob2JqX2Rlc2MpLCBvYmpfZGVzYykpOworCisJCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9PUEVSQU5EX1RZUEUpOworCQkJfQorCQkJZ290byBuZXh0X29wZXJhbmQ7CisKKwkJY2FzZSBBUkdJX1JFR0lPTl9PUl9CVUZGRVI6CS8qIFVzZWQgYnkgTG9hZCgpIG9ubHkgKi8KKworCQkJLyogTmVlZCBhbiBvcGVyYW5kIG9mIHR5cGUgUkVHSU9OIG9yIGEgQlVGRkVSICh3aGljaCBjb3VsZCBiZSBhIHJlc29sdmVkIHJlZ2lvbiBmaWVsZCkgKi8KKworCQkJc3dpdGNoIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRShvYmpfZGVzYykpIHsKKwkJCWNhc2UgQUNQSV9UWVBFX0JVRkZFUjoKKwkJCWNhc2UgQUNQSV9UWVBFX1JFR0lPTjoKKworCQkJCS8qIFZhbGlkIG9wZXJhbmQgKi8KKwkJCQlicmVhazsKKworCQkJZGVmYXVsdDoKKwkJCQlBQ1BJX0VSUk9SKChBRV9JTkZPLAorCQkJCQkgICAgIk5lZWRlZCBbUmVnaW9uL0J1ZmZlcl0sIGZvdW5kIFslc10gJXAiLAorCQkJCQkgICAgYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZQorCQkJCQkgICAgKG9ial9kZXNjKSwgb2JqX2Rlc2MpKTsKKworCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfT1BFUkFORF9UWVBFKTsKKwkJCX0KKwkJCWdvdG8gbmV4dF9vcGVyYW5kOworCisJCWNhc2UgQVJHSV9EQVRBUkVGT0JKOgorCisJCQkvKiBVc2VkIGJ5IHRoZSBTdG9yZSgpIG9wZXJhdG9yIG9ubHkgKi8KKworCQkJc3dpdGNoIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRShvYmpfZGVzYykpIHsKKwkJCWNhc2UgQUNQSV9UWVBFX0lOVEVHRVI6CisJCQljYXNlIEFDUElfVFlQRV9QQUNLQUdFOgorCQkJY2FzZSBBQ1BJX1RZUEVfU1RSSU5HOgorCQkJY2FzZSBBQ1BJX1RZUEVfQlVGRkVSOgorCQkJY2FzZSBBQ1BJX1RZUEVfQlVGRkVSX0ZJRUxEOgorCQkJY2FzZSBBQ1BJX1RZUEVfTE9DQUxfUkVGRVJFTkNFOgorCQkJY2FzZSBBQ1BJX1RZUEVfTE9DQUxfUkVHSU9OX0ZJRUxEOgorCQkJY2FzZSBBQ1BJX1RZUEVfTE9DQUxfQkFOS19GSUVMRDoKKwkJCWNhc2UgQUNQSV9UWVBFX0xPQ0FMX0lOREVYX0ZJRUxEOgorCQkJY2FzZSBBQ1BJX1RZUEVfRERCX0hBTkRMRToKKworCQkJCS8qIFZhbGlkIG9wZXJhbmQgKi8KKwkJCQlicmVhazsKKworCQkJZGVmYXVsdDoKKworCQkJCWlmIChhY3BpX2dibF9lbmFibGVfaW50ZXJwcmV0ZXJfc2xhY2spIHsKKwkJCQkJLyoKKwkJCQkJICogRW5hYmxlIG9yaWdpbmFsIGJlaGF2aW9yIG9mIFN0b3JlKCksIGFsbG93aW5nIGFueSBhbmQgYWxsCisJCQkJCSAqIG9iamVjdHMgYXMgdGhlIHNvdXJjZSBvcGVyYW5kLiAgVGhlIEFDUEkgc3BlYyBkb2VzIG5vdAorCQkJCQkgKiBhbGxvdyB0aGlzLCBob3dldmVyLgorCQkJCQkgKi8KKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJaWYgKHRhcmdldF9vcCA9PSBBTUxfREVCVUdfT1ApIHsKKworCQkJCQkvKiBBbGxvdyBzdG9yZSBvZiBhbnkgb2JqZWN0IHRvIHRoZSBEZWJ1ZyBvYmplY3QgKi8KKworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQlBQ1BJX0VSUk9SKChBRV9JTkZPLAorCQkJCQkgICAgIk5lZWRlZCBJbnRlZ2VyL0J1ZmZlci9TdHJpbmcvUGFja2FnZS9SZWYvRGRiXSwgZm91bmQgWyVzXSAlcCIsCisJCQkJCSAgICBhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lCisJCQkJCSAgICAob2JqX2Rlc2MpLCBvYmpfZGVzYykpOworCisJCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9PUEVSQU5EX1RZUEUpOworCQkJfQorCQkJZ290byBuZXh0X29wZXJhbmQ7CisKKwkJZGVmYXVsdDoKKworCQkJLyogVW5rbm93biB0eXBlICovCisKKwkJCUFDUElfRVJST1IoKEFFX0lORk8sCisJCQkJICAgICJJbnRlcm5hbCAtIFVua25vd24gQVJHSSAocmVxdWlyZWQgb3BlcmFuZCkgdHlwZSAlWCIsCisJCQkJICAgIHRoaXNfYXJnX3R5cGUpKTsKKworCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9QQVJBTUVURVIpOworCQl9CisKKwkJLyoKKwkJICogTWFrZSBzdXJlIHRoYXQgdGhlIG9yaWdpbmFsIG9iamVjdCB3YXMgcmVzb2x2ZWQgdG8gdGhlCisJCSAqIHJlcXVpcmVkIG9iamVjdCB0eXBlIChTaW1wbGUgY2FzZXMgb25seSkuCisJCSAqLworCQlzdGF0dXMgPSBhY3BpX2V4X2NoZWNrX29iamVjdF90eXBlKHR5cGVfbmVlZGVkLAorCQkJCQkJICAgQUNQSV9HRVRfT0JKRUNUX1RZUEUKKwkJCQkJCSAgICgqc3RhY2tfcHRyKSwgKnN0YWNrX3B0cik7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CisJCX0KKworCSAgICAgIG5leHRfb3BlcmFuZDoKKwkJLyoKKwkJICogSWYgbW9yZSBvcGVyYW5kcyBuZWVkZWQsIGRlY3JlbWVudCBzdGFja19wdHIgdG8gcG9pbnQKKwkJICogdG8gbmV4dCBvcGVyYW5kIG9uIHN0YWNrCisJCSAqLworCQlpZiAoR0VUX0NVUlJFTlRfQVJHX1RZUEUoYXJnX3R5cGVzKSkgeworCQkJc3RhY2tfcHRyLS07CisJCX0KKwl9CisKKwlBQ1BJX0RVTVBfT1BFUkFORFMod2Fsa19zdGF0ZS0+b3BlcmFuZHMsCisJCQkgICBhY3BpX3BzX2dldF9vcGNvZGVfbmFtZShvcGNvZGUpLAorCQkJICAgd2Fsa19zdGF0ZS0+bnVtX29wZXJhbmRzKTsKKworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS9leHN0b3JlLmMgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2V4c3RvcmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzVlOWI0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS9leHN0b3JlLmMKQEAgLTAsMCArMSw3MTYgQEAKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIE1vZHVsZSBOYW1lOiBleHN0b3JlIC0gQU1MIEludGVycHJldGVyIG9iamVjdCBzdG9yZSBzdXBwb3J0CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwOCwgSW50ZWwgQ29ycC4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKKyAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIGF0IG1pbmltdW0gYSBkaXNjbGFpbWVyCisgKiAgICBzdWJzdGFudGlhbGx5IHNpbWlsYXIgdG8gdGhlICJOTyBXQVJSQU5UWSIgZGlzY2xhaW1lciBiZWxvdworICogICAgKCJEaXNjbGFpbWVyIikgYW5kIGFueSByZWRpc3RyaWJ1dGlvbiBtdXN0IGJlIGNvbmRpdGlvbmVkIHVwb24KKyAqICAgIGluY2x1ZGluZyBhIHN1YnN0YW50aWFsbHkgc2ltaWxhciBEaXNjbGFpbWVyIHJlcXVpcmVtZW50IGZvciBmdXJ0aGVyCisgKiAgICBiaW5hcnkgcmVkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMKKyAqICAgIG9mIGFueSBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogTk8gV0FSUkFOVFkKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HCisgKiBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KKyAqLworCisjaW5jbHVkZSA8YWNwaS9hY3BpLmg+CisjaW5jbHVkZSAiYWNjb21tb24uaCIKKyNpbmNsdWRlICJhY2Rpc3BhdC5oIgorI2luY2x1ZGUgImFjaW50ZXJwLmgiCisjaW5jbHVkZSAiYW1sY29kZS5oIgorI2luY2x1ZGUgImFjbmFtZXNwLmgiCisKKyNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX0VYRUNVVEVSCitBQ1BJX01PRFVMRV9OQU1FKCJleHN0b3JlIikKKworLyogTG9jYWwgcHJvdG90eXBlcyAqLworc3RhdGljIHZvaWQKK2FjcGlfZXhfZG9fZGVidWdfb2JqZWN0KHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnNvdXJjZV9kZXNjLAorCQkJdTMyIGxldmVsLCB1MzIgaW5kZXgpOworCitzdGF0aWMgYWNwaV9zdGF0dXMKK2FjcGlfZXhfc3RvcmVfb2JqZWN0X3RvX2luZGV4KHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnZhbF9kZXNjLAorCQkJICAgICAgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqZGVzdF9kZXNjLAorCQkJICAgICAgc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfZXhfZG9fZGVidWdfb2JqZWN0CisgKgorICogUEFSQU1FVEVSUzogIHNvdXJjZV9kZXNjICAgICAgICAgLSBWYWx1ZSB0byBiZSBzdG9yZWQKKyAqICAgICAgICAgICAgICBMZXZlbCAgICAgICAgICAgICAgIC0gSW5kZW50YXRpb24gbGV2ZWwgKHVzZWQgZm9yIHBhY2thZ2VzKQorICogICAgICAgICAgICAgIEluZGV4ICAgICAgICAgICAgICAgLSBDdXJyZW50IHBhY2thZ2UgZWxlbWVudCwgemVybyBpZiBub3QgcGtnCisgKgorICogUkVUVVJOOiAgICAgIE5vbmUKKyAqCisgKiBERVNDUklQVElPTjogSGFuZGxlcyBzdG9yZXMgdG8gdGhlIERlYnVnIE9iamVjdC4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZAorYWNwaV9leF9kb19kZWJ1Z19vYmplY3QodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqc291cmNlX2Rlc2MsCisJCQl1MzIgbGV2ZWwsIHUzMiBpbmRleCkKK3sKKwl1MzIgaTsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKGV4X2RvX2RlYnVnX29iamVjdCwgc291cmNlX2Rlc2MpOworCisJLyogUHJpbnQgbGluZSBoZWFkZXIgYXMgbG9uZyBhcyB3ZSBhcmUgbm90IGluIHRoZSBtaWRkbGUgb2YgYW4gb2JqZWN0IGRpc3BsYXkgKi8KKworCWlmICghKChsZXZlbCA+IDApICYmIGluZGV4ID09IDApKSB7CisJCUFDUElfREVCVUdfUFJJTlRfUkFXKChBQ1BJX0RCX0RFQlVHX09CSkVDVCwgIltBQ1BJIERlYnVnXSAlKnMiLAorCQkJCSAgICAgIGxldmVsLCAiICIpKTsKKwl9CisKKwkvKiBEaXNwbGF5IGluZGV4IGZvciBwYWNrYWdlIG91dHB1dCBvbmx5ICovCisKKwlpZiAoaW5kZXggPiAwKSB7CisJCUFDUElfREVCVUdfUFJJTlRfUkFXKChBQ1BJX0RCX0RFQlVHX09CSkVDVCwKKwkJCQkgICAgICAiKCUuMnUpICIsIGluZGV4IC0gMSkpOworCX0KKworCWlmICghc291cmNlX2Rlc2MpIHsKKwkJQUNQSV9ERUJVR19QUklOVF9SQVcoKEFDUElfREJfREVCVUdfT0JKRUNULCAiW051bGwgT2JqZWN0XVxuIikpOworCQlyZXR1cm5fVk9JRDsKKwl9CisKKwlpZiAoQUNQSV9HRVRfREVTQ1JJUFRPUl9UWVBFKHNvdXJjZV9kZXNjKSA9PSBBQ1BJX0RFU0NfVFlQRV9PUEVSQU5EKSB7CisJCUFDUElfREVCVUdfUFJJTlRfUkFXKChBQ1BJX0RCX0RFQlVHX09CSkVDVCwgIiVzICIsCisJCQkJICAgICAgYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZQorCQkJCSAgICAgIChzb3VyY2VfZGVzYykpKTsKKworCQlpZiAoIWFjcGlfdXRfdmFsaWRfaW50ZXJuYWxfb2JqZWN0KHNvdXJjZV9kZXNjKSkgeworCQkJQUNQSV9ERUJVR19QUklOVF9SQVcoKEFDUElfREJfREVCVUdfT0JKRUNULAorCQkJCQkgICAgICAiJXAsIEludmFsaWQgSW50ZXJuYWwgT2JqZWN0IVxuIiwKKwkJCQkJICAgICAgc291cmNlX2Rlc2MpKTsKKwkJCXJldHVybl9WT0lEOworCQl9CisJfSBlbHNlIGlmIChBQ1BJX0dFVF9ERVNDUklQVE9SX1RZUEUoc291cmNlX2Rlc2MpID09CisJCSAgIEFDUElfREVTQ19UWVBFX05BTUVEKSB7CisJCUFDUElfREVCVUdfUFJJTlRfUkFXKChBQ1BJX0RCX0RFQlVHX09CSkVDVCwgIiVzOiAlcFxuIiwKKwkJCQkgICAgICBhY3BpX3V0X2dldF90eXBlX25hbWUoKChzdHJ1Y3QKKwkJCQkJCQkgICAgICBhY3BpX25hbWVzcGFjZV9ub2RlCisJCQkJCQkJICAgICAgKilzb3VyY2VfZGVzYyktPgorCQkJCQkJCSAgICB0eXBlKSwKKwkJCQkgICAgICBzb3VyY2VfZGVzYykpOworCQlyZXR1cm5fVk9JRDsKKwl9IGVsc2UgeworCQlyZXR1cm5fVk9JRDsKKwl9CisKKwkvKiBzb3VyY2VfZGVzYyBpcyBvZiB0eXBlIEFDUElfREVTQ19UWVBFX09QRVJBTkQgKi8KKworCXN3aXRjaCAoQUNQSV9HRVRfT0JKRUNUX1RZUEUoc291cmNlX2Rlc2MpKSB7CisJY2FzZSBBQ1BJX1RZUEVfSU5URUdFUjoKKworCQkvKiBPdXRwdXQgY29ycmVjdCBpbnRlZ2VyIHdpZHRoICovCisKKwkJaWYgKGFjcGlfZ2JsX2ludGVnZXJfYnl0ZV93aWR0aCA9PSA0KSB7CisJCQlBQ1BJX0RFQlVHX1BSSU5UX1JBVygoQUNQSV9EQl9ERUJVR19PQkpFQ1QsICIweCU4LjhYXG4iLAorCQkJCQkgICAgICAodTMyKSBzb3VyY2VfZGVzYy0+aW50ZWdlci4KKwkJCQkJICAgICAgdmFsdWUpKTsKKwkJfSBlbHNlIHsKKwkJCUFDUElfREVCVUdfUFJJTlRfUkFXKChBQ1BJX0RCX0RFQlVHX09CSkVDVCwKKwkJCQkJICAgICAgIjB4JTguOFglOC44WFxuIiwKKwkJCQkJICAgICAgQUNQSV9GT1JNQVRfVUlOVDY0KHNvdXJjZV9kZXNjLT4KKwkJCQkJCQkJIGludGVnZXIuCisJCQkJCQkJCSB2YWx1ZSkpKTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgQUNQSV9UWVBFX0JVRkZFUjoKKworCQlBQ1BJX0RFQlVHX1BSSU5UX1JBVygoQUNQSV9EQl9ERUJVR19PQkpFQ1QsICJbMHglLjJYXVxuIiwKKwkJCQkgICAgICAodTMyKSBzb3VyY2VfZGVzYy0+YnVmZmVyLmxlbmd0aCkpOworCQlBQ1BJX0RVTVBfQlVGRkVSKHNvdXJjZV9kZXNjLT5idWZmZXIucG9pbnRlciwKKwkJCQkgKHNvdXJjZV9kZXNjLT5idWZmZXIubGVuZ3RoIDwKKwkJCQkgIDI1NikgPyBzb3VyY2VfZGVzYy0+YnVmZmVyLmxlbmd0aCA6IDI1Nik7CisJCWJyZWFrOworCisJY2FzZSBBQ1BJX1RZUEVfU1RSSU5HOgorCisJCUFDUElfREVCVUdfUFJJTlRfUkFXKChBQ1BJX0RCX0RFQlVHX09CSkVDVCwgIlsweCUuMlhdIFwiJXNcIlxuIiwKKwkJCQkgICAgICBzb3VyY2VfZGVzYy0+c3RyaW5nLmxlbmd0aCwKKwkJCQkgICAgICBzb3VyY2VfZGVzYy0+c3RyaW5nLnBvaW50ZXIpKTsKKwkJYnJlYWs7CisKKwljYXNlIEFDUElfVFlQRV9QQUNLQUdFOgorCisJCUFDUElfREVCVUdfUFJJTlRfUkFXKChBQ1BJX0RCX0RFQlVHX09CSkVDVCwKKwkJCQkgICAgICAiW0NvbnRhaW5zIDB4JS4yWCBFbGVtZW50c11cbiIsCisJCQkJICAgICAgc291cmNlX2Rlc2MtPnBhY2thZ2UuY291bnQpKTsKKworCQkvKiBPdXRwdXQgdGhlIGVudGlyZSBjb250ZW50cyBvZiB0aGUgcGFja2FnZSAqLworCisJCWZvciAoaSA9IDA7IGkgPCBzb3VyY2VfZGVzYy0+cGFja2FnZS5jb3VudDsgaSsrKSB7CisJCQlhY3BpX2V4X2RvX2RlYnVnX29iamVjdChzb3VyY2VfZGVzYy0+cGFja2FnZS4KKwkJCQkJCWVsZW1lbnRzW2ldLCBsZXZlbCArIDQsIGkgKyAxKTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgQUNQSV9UWVBFX0xPQ0FMX1JFRkVSRU5DRToKKworCQlBQ1BJX0RFQlVHX1BSSU5UX1JBVygoQUNQSV9EQl9ERUJVR19PQkpFQ1QsICJbJXNdICIsCisJCQkJICAgICAgYWNwaV91dF9nZXRfcmVmZXJlbmNlX25hbWUoc291cmNlX2Rlc2MpKSk7CisKKwkJLyogRGVjb2RlIHRoZSByZWZlcmVuY2UgKi8KKworCQlzd2l0Y2ggKHNvdXJjZV9kZXNjLT5yZWZlcmVuY2UuY2xhc3MpIHsKKwkJY2FzZSBBQ1BJX1JFRkNMQVNTX0lOREVYOgorCisJCQlBQ1BJX0RFQlVHX1BSSU5UX1JBVygoQUNQSV9EQl9ERUJVR19PQkpFQ1QsICIweCVYXG4iLAorCQkJCQkgICAgICBzb3VyY2VfZGVzYy0+cmVmZXJlbmNlLnZhbHVlKSk7CisJCQlicmVhazsKKworCQljYXNlIEFDUElfUkVGQ0xBU1NfVEFCTEU6CisKKwkJCUFDUElfREVCVUdfUFJJTlRfUkFXKChBQ1BJX0RCX0RFQlVHX09CSkVDVCwKKwkJCQkJICAgICAgIlRhYmxlIEluZGV4IDB4JVhcbiIsCisJCQkJCSAgICAgIHNvdXJjZV9kZXNjLT5yZWZlcmVuY2UudmFsdWUpKTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCisJCUFDUElfREVCVUdfUFJJTlRfUkFXKChBQ1BJX0RCX0RFQlVHX09CSkVDVCwgIiAgIikpOworCisJCS8qIENoZWNrIGZvciB2YWxpZCBub2RlIGZpcnN0LCB0aGVuIHZhbGlkIG9iamVjdCAqLworCisJCWlmIChzb3VyY2VfZGVzYy0+cmVmZXJlbmNlLm5vZGUpIHsKKwkJCWlmIChBQ1BJX0dFVF9ERVNDUklQVE9SX1RZUEUKKwkJCSAgICAoc291cmNlX2Rlc2MtPnJlZmVyZW5jZS5ub2RlKSAhPQorCQkJICAgIEFDUElfREVTQ19UWVBFX05BTUVEKSB7CisJCQkJQUNQSV9ERUJVR19QUklOVF9SQVcoKEFDUElfREJfREVCVUdfT0JKRUNULAorCQkJCQkJICAgICAgIiAlcCAtIE5vdCBhIHZhbGlkIG5hbWVzcGFjZSBub2RlXG4iLAorCQkJCQkJICAgICAgc291cmNlX2Rlc2MtPnJlZmVyZW5jZS4KKwkJCQkJCSAgICAgIG5vZGUpKTsKKwkJCX0gZWxzZSB7CisJCQkJQUNQSV9ERUJVR19QUklOVF9SQVcoKEFDUElfREJfREVCVUdfT0JKRUNULAorCQkJCQkJICAgICAgIk5vZGUgJXAgWyU0LjRzXSAiLAorCQkJCQkJICAgICAgc291cmNlX2Rlc2MtPnJlZmVyZW5jZS4KKwkJCQkJCSAgICAgIG5vZGUsCisJCQkJCQkgICAgICAoc291cmNlX2Rlc2MtPnJlZmVyZW5jZS4KKwkJCQkJCSAgICAgICBub2RlKS0+bmFtZS5hc2NpaSkpOworCisJCQkJc3dpdGNoICgoc291cmNlX2Rlc2MtPnJlZmVyZW5jZS5ub2RlKS0+dHlwZSkgeworCisJCQkJCS8qIFRoZXNlIHR5cGVzIGhhdmUgbm8gYXR0YWNoZWQgb2JqZWN0ICovCisKKwkJCQljYXNlIEFDUElfVFlQRV9ERVZJQ0U6CisJCQkJCWFjcGlfb3NfcHJpbnRmKCJEZXZpY2VcbiIpOworCQkJCQlicmVhazsKKworCQkJCWNhc2UgQUNQSV9UWVBFX1RIRVJNQUw6CisJCQkJCWFjcGlfb3NfcHJpbnRmKCJUaGVybWFsIFpvbmVcbiIpOworCQkJCQlicmVhazsKKworCQkJCWRlZmF1bHQ6CisJCQkJCWFjcGlfZXhfZG9fZGVidWdfb2JqZWN0KChzb3VyY2VfZGVzYy0+CisJCQkJCQkJCSByZWZlcmVuY2UuCisJCQkJCQkJCSBub2RlKS0+b2JqZWN0LAorCQkJCQkJCQlsZXZlbCArIDQsIDApOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0gZWxzZSBpZiAoc291cmNlX2Rlc2MtPnJlZmVyZW5jZS5vYmplY3QpIHsKKwkJCWlmIChBQ1BJX0dFVF9ERVNDUklQVE9SX1RZUEUKKwkJCSAgICAoc291cmNlX2Rlc2MtPnJlZmVyZW5jZS5vYmplY3QpID09CisJCQkgICAgQUNQSV9ERVNDX1RZUEVfTkFNRUQpIHsKKwkJCQlhY3BpX2V4X2RvX2RlYnVnX29iamVjdCgoKHN0cnVjdAorCQkJCQkJCSAgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqKQorCQkJCQkJCSBzb3VyY2VfZGVzYy0+cmVmZXJlbmNlLgorCQkJCQkJCSBvYmplY3QpLT5vYmplY3QsCisJCQkJCQkJbGV2ZWwgKyA0LCAwKTsKKwkJCX0gZWxzZSB7CisJCQkJYWNwaV9leF9kb19kZWJ1Z19vYmplY3Qoc291cmNlX2Rlc2MtPnJlZmVyZW5jZS4KKwkJCQkJCQlvYmplY3QsIGxldmVsICsgNCwgMCk7CisJCQl9CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCisJCUFDUElfREVCVUdfUFJJTlRfUkFXKChBQ1BJX0RCX0RFQlVHX09CSkVDVCwgIiVwXG4iLAorCQkJCSAgICAgIHNvdXJjZV9kZXNjKSk7CisJCWJyZWFrOworCX0KKworCUFDUElfREVCVUdfUFJJTlRfUkFXKChBQ1BJX0RCX0VYRUMsICJcbiIpKTsKKwlyZXR1cm5fVk9JRDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9leF9zdG9yZQorICoKKyAqIFBBUkFNRVRFUlM6ICAqc291cmNlX2Rlc2MgICAgICAgIC0gVmFsdWUgdG8gYmUgc3RvcmVkCisgKiAgICAgICAgICAgICAgKmRlc3RfZGVzYyAgICAgICAgICAtIFdoZXJlIHRvIHN0b3JlIGl0LiAgTXVzdCBiZSBhbiBOUyBub2RlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIGEgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCBvZiB0eXBlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZmVyZW5jZTsKKyAqICAgICAgICAgICAgICB3YWxrX3N0YXRlICAgICAgICAgIC0gQ3VycmVudCB3YWxrIHN0YXRlCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBTdG9yZSB0aGUgdmFsdWUgZGVzY3JpYmVkIGJ5IHNvdXJjZV9kZXNjIGludG8gdGhlIGxvY2F0aW9uCisgKiAgICAgICAgICAgICAgZGVzY3JpYmVkIGJ5IGRlc3RfZGVzYy4gQ2FsbGVkIGJ5IHZhcmlvdXMgaW50ZXJwcmV0ZXIKKyAqICAgICAgICAgICAgICBmdW5jdGlvbnMgdG8gc3RvcmUgdGhlIHJlc3VsdCBvZiBhbiBvcGVyYXRpb24gaW50bworICogICAgICAgICAgICAgIHRoZSBkZXN0aW5hdGlvbiBvcGVyYW5kIC0tIG5vdCBqdXN0IHNpbXBseSB0aGUgYWN0dWFsICJTdG9yZSIKKyAqICAgICAgICAgICAgICBBU0wgb3BlcmF0b3IuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworYWNwaV9zdGF0dXMKK2FjcGlfZXhfc3RvcmUodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqc291cmNlX2Rlc2MsCisJICAgICAgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqZGVzdF9kZXNjLAorCSAgICAgIHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUpCit7CisJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqcmVmX2Rlc2MgPSBkZXN0X2Rlc2M7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUihleF9zdG9yZSwgZGVzdF9kZXNjKTsKKworCS8qIFZhbGlkYXRlIHBhcmFtZXRlcnMgKi8KKworCWlmICghc291cmNlX2Rlc2MgfHwgIWRlc3RfZGVzYykgeworCQlBQ1BJX0VSUk9SKChBRV9JTkZPLCAiTnVsbCBwYXJhbWV0ZXIiKSk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfTk9fT1BFUkFORCk7CisJfQorCisJLyogZGVzdF9kZXNjIGNhbiBiZSBlaXRoZXIgYSBuYW1lc3BhY2Ugbm9kZSBvciBhbiBBQ1BJIG9iamVjdCAqLworCisJaWYgKEFDUElfR0VUX0RFU0NSSVBUT1JfVFlQRShkZXN0X2Rlc2MpID09IEFDUElfREVTQ19UWVBFX05BTUVEKSB7CisJCS8qCisJCSAqIERlc3QgaXMgYSBuYW1lc3BhY2Ugbm9kZSwKKwkJICogU3RvcmluZyBhbiBvYmplY3QgaW50byBhIE5hbWVkIG5vZGUuCisJCSAqLworCQlzdGF0dXMgPSBhY3BpX2V4X3N0b3JlX29iamVjdF90b19ub2RlKHNvdXJjZV9kZXNjLAorCQkJCQkJICAgICAgKHN0cnVjdAorCQkJCQkJICAgICAgIGFjcGlfbmFtZXNwYWNlX25vZGUgKikKKwkJCQkJCSAgICAgIGRlc3RfZGVzYywgd2Fsa19zdGF0ZSwKKwkJCQkJCSAgICAgIEFDUElfSU1QTElDSVRfQ09OVkVSU0lPTik7CisKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CisJfQorCisJLyogRGVzdGluYXRpb24gb2JqZWN0IG11c3QgYmUgYSBSZWZlcmVuY2Ugb3IgYSBDb25zdGFudCBvYmplY3QgKi8KKworCXN3aXRjaCAoQUNQSV9HRVRfT0JKRUNUX1RZUEUoZGVzdF9kZXNjKSkgeworCWNhc2UgQUNQSV9UWVBFX0xPQ0FMX1JFRkVSRU5DRToKKwkJYnJlYWs7CisKKwljYXNlIEFDUElfVFlQRV9JTlRFR0VSOgorCisJCS8qIEFsbG93IHN0b3JlcyB0byBDb25zdGFudHMgLS0gYSBOb29wIGFzIHBlciBBQ1BJIHNwZWMgKi8KKworCQlpZiAoZGVzdF9kZXNjLT5jb21tb24uZmxhZ3MgJiBBT1BPQkpfQU1MX0NPTlNUQU5UKSB7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOworCQl9CisKKwkJLypsaW50IC1mYWxsdGhyb3VnaCAqLworCisJZGVmYXVsdDoKKworCQkvKiBEZXN0aW5hdGlvbiBpcyBub3QgYSBSZWZlcmVuY2Ugb2JqZWN0ICovCisKKwkJQUNQSV9FUlJPUigoQUVfSU5GTywKKwkJCSAgICAiVGFyZ2V0IGlzIG5vdCBhIFJlZmVyZW5jZSBvciBDb25zdGFudCBvYmplY3QgLSAlcyBbJXBdIiwKKwkJCSAgICBhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lKGRlc3RfZGVzYyksCisJCQkgICAgZGVzdF9kZXNjKSk7CisKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9PUEVSQU5EX1RZUEUpOworCX0KKworCS8qCisJICogRXhhbWluZSB0aGUgUmVmZXJlbmNlIGNsYXNzLiBUaGVzZSBjYXNlcyBhcmUgaGFuZGxlZDoKKwkgKgorCSAqIDEpIFN0b3JlIHRvIE5hbWUgKENoYW5nZSB0aGUgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCBhIG5hbWUpCisJICogMikgU3RvcmUgdG8gYW4gaW5kZXhlZCBhcmVhIG9mIGEgQnVmZmVyIG9yIFBhY2thZ2UKKwkgKiAzKSBTdG9yZSB0byBhIE1ldGhvZCBMb2NhbCBvciBBcmcKKwkgKiA0KSBTdG9yZSB0byB0aGUgZGVidWcgb2JqZWN0CisJICovCisJc3dpdGNoIChyZWZfZGVzYy0+cmVmZXJlbmNlLmNsYXNzKSB7CisJY2FzZSBBQ1BJX1JFRkNMQVNTX1JFRk9GOgorCisJCS8qIFN0b3JpbmcgYW4gb2JqZWN0IGludG8gYSBOYW1lICJjb250YWluZXIiICovCisKKwkJc3RhdHVzID0gYWNwaV9leF9zdG9yZV9vYmplY3RfdG9fbm9kZShzb3VyY2VfZGVzYywKKwkJCQkJCSAgICAgIHJlZl9kZXNjLT5yZWZlcmVuY2UuCisJCQkJCQkgICAgICBvYmplY3QsIHdhbGtfc3RhdGUsCisJCQkJCQkgICAgICBBQ1BJX0lNUExJQ0lUX0NPTlZFUlNJT04pOworCQlicmVhazsKKworCWNhc2UgQUNQSV9SRUZDTEFTU19JTkRFWDoKKworCQkvKiBTdG9yaW5nIHRvIGFuIEluZGV4IChwb2ludGVyIGludG8gYSBwYWNrYWdlciBvciBidWZmZXIpICovCisKKwkJc3RhdHVzID0KKwkJICAgIGFjcGlfZXhfc3RvcmVfb2JqZWN0X3RvX2luZGV4KHNvdXJjZV9kZXNjLCByZWZfZGVzYywKKwkJCQkJCSAgd2Fsa19zdGF0ZSk7CisJCWJyZWFrOworCisJY2FzZSBBQ1BJX1JFRkNMQVNTX0xPQ0FMOgorCWNhc2UgQUNQSV9SRUZDTEFTU19BUkc6CisKKwkJLyogU3RvcmUgdG8gYSBtZXRob2QgbG9jYWwvYXJnICAqLworCisJCXN0YXR1cyA9CisJCSAgICBhY3BpX2RzX3N0b3JlX29iamVjdF90b19sb2NhbChyZWZfZGVzYy0+cmVmZXJlbmNlLmNsYXNzLAorCQkJCQkJICByZWZfZGVzYy0+cmVmZXJlbmNlLnZhbHVlLAorCQkJCQkJICBzb3VyY2VfZGVzYywgd2Fsa19zdGF0ZSk7CisJCWJyZWFrOworCisJY2FzZSBBQ1BJX1JFRkNMQVNTX0RFQlVHOgorCisJCS8qCisJCSAqIFN0b3JpbmcgdG8gdGhlIERlYnVnIG9iamVjdCBjYXVzZXMgdGhlIHZhbHVlIHN0b3JlZCB0byBiZQorCQkgKiBkaXNwbGF5ZWQgYW5kIG90aGVyd2lzZSBoYXMgbm8gZWZmZWN0IC0tIHNlZSBBQ1BJIFNwZWNpZmljYXRpb24KKwkJICovCisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVhFQywKKwkJCQkgICIqKioqIFdyaXRlIHRvIERlYnVnIE9iamVjdDogT2JqZWN0ICVwICVzICoqKio6XG5cbiIsCisJCQkJICBzb3VyY2VfZGVzYywKKwkJCQkgIGFjcGlfdXRfZ2V0X29iamVjdF90eXBlX25hbWUoc291cmNlX2Rlc2MpKSk7CisKKwkJYWNwaV9leF9kb19kZWJ1Z19vYmplY3Qoc291cmNlX2Rlc2MsIDAsIDApOworCQlicmVhazsKKworCWRlZmF1bHQ6CisKKwkJQUNQSV9FUlJPUigoQUVfSU5GTywgIlVua25vd24gUmVmZXJlbmNlIENsYXNzICUyLjJYIiwKKwkJCSAgICByZWZfZGVzYy0+cmVmZXJlbmNlLmNsYXNzKSk7CisJCUFDUElfRFVNUF9FTlRSWShyZWZfZGVzYywgQUNQSV9MVl9JTkZPKTsKKworCQlzdGF0dXMgPSBBRV9BTUxfSU5URVJOQUw7CisJCWJyZWFrOworCX0KKworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X3N0b3JlX29iamVjdF90b19pbmRleAorICoKKyAqIFBBUkFNRVRFUlM6ICAqc291cmNlX2Rlc2MgICAgICAgICAgICAtIFZhbHVlIHRvIGJlIHN0b3JlZAorICogICAgICAgICAgICAgICpkZXN0X2Rlc2MgICAgICAgICAgICAgIC0gTmFtZWQgb2JqZWN0IHRvIHJlY2VpdmUgdGhlIHZhbHVlCisgKiAgICAgICAgICAgICAgd2Fsa19zdGF0ZSAgICAgICAgICAgICAgLSBDdXJyZW50IHdhbGsgc3RhdGUKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IFN0b3JlIHRoZSBvYmplY3QgdG8gaW5kZXhlZCBCdWZmZXIgb3IgUGFja2FnZSBlbGVtZW50CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGFjcGlfc3RhdHVzCithY3BpX2V4X3N0b3JlX29iamVjdF90b19pbmRleCh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpzb3VyY2VfZGVzYywKKwkJCSAgICAgIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKmluZGV4X2Rlc2MsCisJCQkgICAgICBzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKQoreworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjOworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm5ld19kZXNjOworCXU4IHZhbHVlID0gMDsKKwl1MzIgaTsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0UoZXhfc3RvcmVfb2JqZWN0X3RvX2luZGV4KTsKKworCS8qCisJICogRGVzdGluYXRpb24gbXVzdCBiZSBhIHJlZmVyZW5jZSBwb2ludGVyLCBhbmQKKwkgKiBtdXN0IHBvaW50IHRvIGVpdGhlciBhIGJ1ZmZlciBvciBhIHBhY2thZ2UKKwkgKi8KKwlzd2l0Y2ggKGluZGV4X2Rlc2MtPnJlZmVyZW5jZS50YXJnZXRfdHlwZSkgeworCWNhc2UgQUNQSV9UWVBFX1BBQ0tBR0U6CisJCS8qCisJCSAqIFN0b3JpbmcgdG8gYSBwYWNrYWdlIGVsZW1lbnQuIENvcHkgdGhlIG9iamVjdCBhbmQgcmVwbGFjZQorCQkgKiBhbnkgZXhpc3Rpbmcgb2JqZWN0IHdpdGggdGhlIG5ldyBvYmplY3QuIE5vIGltcGxpY2l0CisJCSAqIGNvbnZlcnNpb24gaXMgcGVyZm9ybWVkLgorCQkgKgorCQkgKiBUaGUgb2JqZWN0IGF0ICooaW5kZXhfZGVzYy0+UmVmZXJlbmNlLldoZXJlKSBpcyB0aGUKKwkJICogZWxlbWVudCB3aXRoaW4gdGhlIHBhY2thZ2UgdGhhdCBpcyB0byBiZSBtb2RpZmllZC4KKwkJICogVGhlIHBhcmVudCBwYWNrYWdlIG9iamVjdCBpcyBhdCBpbmRleF9kZXNjLT5SZWZlcmVuY2UuT2JqZWN0CisJCSAqLworCQlvYmpfZGVzYyA9ICooaW5kZXhfZGVzYy0+cmVmZXJlbmNlLndoZXJlKTsKKworCQlpZiAoQUNQSV9HRVRfT0JKRUNUX1RZUEUoc291cmNlX2Rlc2MpID09CisJCSAgICBBQ1BJX1RZUEVfTE9DQUxfUkVGRVJFTkNFCisJCSAgICAmJiBzb3VyY2VfZGVzYy0+cmVmZXJlbmNlLmNsYXNzID09IEFDUElfUkVGQ0xBU1NfVEFCTEUpIHsKKworCQkJLyogVGhpcyBpcyBhIEREQkhhbmRsZSwganVzdCBhZGQgYSByZWZlcmVuY2UgdG8gaXQgKi8KKworCQkJYWNwaV91dF9hZGRfcmVmZXJlbmNlKHNvdXJjZV9kZXNjKTsKKwkJCW5ld19kZXNjID0gc291cmNlX2Rlc2M7CisJCX0gZWxzZSB7CisJCQkvKiBOb3JtYWwgb2JqZWN0LCBjb3B5IGl0ICovCisKKwkJCXN0YXR1cyA9CisJCQkgICAgYWNwaV91dF9jb3B5X2lvYmplY3RfdG9faW9iamVjdChzb3VyY2VfZGVzYywKKwkJCQkJCQkgICAgJm5ld19kZXNjLAorCQkJCQkJCSAgICB3YWxrX3N0YXRlKTsKKwkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworCQkJfQorCQl9CisKKwkJaWYgKG9ial9kZXNjKSB7CisKKwkJCS8qIERlY3JlbWVudCByZWZlcmVuY2UgY291bnQgYnkgdGhlIHJlZiBjb3VudCBvZiB0aGUgcGFyZW50IHBhY2thZ2UgKi8KKworCQkJZm9yIChpID0gMDsgaSA8ICgodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKQorCQkJCQkgaW5kZXhfZGVzYy0+cmVmZXJlbmNlLm9iamVjdCktPmNvbW1vbi4KKwkJCSAgICAgcmVmZXJlbmNlX2NvdW50OyBpKyspIHsKKwkJCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2Uob2JqX2Rlc2MpOworCQkJfQorCQl9CisKKwkJKihpbmRleF9kZXNjLT5yZWZlcmVuY2Uud2hlcmUpID0gbmV3X2Rlc2M7CisKKwkJLyogSW5jcmVtZW50IHJlZiBjb3VudCBieSB0aGUgcmVmIGNvdW50IG9mIHRoZSBwYXJlbnQgcGFja2FnZS0xICovCisKKwkJZm9yIChpID0gMTsgaSA8ICgodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKQorCQkJCSBpbmRleF9kZXNjLT5yZWZlcmVuY2Uub2JqZWN0KS0+Y29tbW9uLgorCQkgICAgIHJlZmVyZW5jZV9jb3VudDsgaSsrKSB7CisJCQlhY3BpX3V0X2FkZF9yZWZlcmVuY2UobmV3X2Rlc2MpOworCQl9CisKKwkJYnJlYWs7CisKKwljYXNlIEFDUElfVFlQRV9CVUZGRVJfRklFTEQ6CisKKwkJLyoKKwkJICogU3RvcmUgaW50byBhIEJ1ZmZlciBvciBTdHJpbmcgKG5vdCBhY3R1YWxseSBhIHJlYWwgYnVmZmVyX2ZpZWxkKQorCQkgKiBhdCBhIGxvY2F0aW9uIGRlZmluZWQgYnkgYW4gSW5kZXguCisJCSAqCisJCSAqIFRoZSBmaXJzdCA4LWJpdCBlbGVtZW50IG9mIHRoZSBzb3VyY2Ugb2JqZWN0IGlzIHdyaXR0ZW4gdG8gdGhlCisJCSAqIDgtYml0IEJ1ZmZlciBsb2NhdGlvbiBkZWZpbmVkIGJ5IHRoZSBJbmRleCBkZXN0aW5hdGlvbiBvYmplY3QsCisJCSAqIGFjY29yZGluZyB0byB0aGUgQUNQSSAyLjAgc3BlY2lmaWNhdGlvbi4KKwkJICovCisKKwkJLyoKKwkJICogTWFrZSBzdXJlIHRoZSB0YXJnZXQgaXMgYSBCdWZmZXIgb3IgU3RyaW5nLiBBbiBlcnJvciBzaG91bGQKKwkJICogbm90IGhhcHBlbiBoZXJlLCBzaW5jZSB0aGUgcmVmZXJlbmNlX29iamVjdCB3YXMgY29uc3RydWN0ZWQKKwkJICogYnkgdGhlIElOREVYX09QIGNvZGUuCisJCSAqLworCQlvYmpfZGVzYyA9IGluZGV4X2Rlc2MtPnJlZmVyZW5jZS5vYmplY3Q7CisJCWlmICgoQUNQSV9HRVRfT0JKRUNUX1RZUEUob2JqX2Rlc2MpICE9IEFDUElfVFlQRV9CVUZGRVIpICYmCisJCSAgICAoQUNQSV9HRVRfT0JKRUNUX1RZUEUob2JqX2Rlc2MpICE9IEFDUElfVFlQRV9TVFJJTkcpKSB7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX09QRVJBTkRfVFlQRSk7CisJCX0KKworCQkvKgorCQkgKiBUaGUgYXNzaWdubWVudCBvZiB0aGUgaW5kaXZpZHVhbCBlbGVtZW50cyB3aWxsIGJlIHNsaWdodGx5CisJCSAqIGRpZmZlcmVudCBmb3IgZWFjaCBzb3VyY2UgdHlwZS4KKwkJICovCisJCXN3aXRjaCAoQUNQSV9HRVRfT0JKRUNUX1RZUEUoc291cmNlX2Rlc2MpKSB7CisJCWNhc2UgQUNQSV9UWVBFX0lOVEVHRVI6CisKKwkJCS8qIFVzZSB0aGUgbGVhc3Qtc2lnbmlmaWNhbnQgYnl0ZSBvZiB0aGUgaW50ZWdlciAqLworCisJCQl2YWx1ZSA9ICh1OCkgKHNvdXJjZV9kZXNjLT5pbnRlZ2VyLnZhbHVlKTsKKwkJCWJyZWFrOworCisJCWNhc2UgQUNQSV9UWVBFX0JVRkZFUjoKKwkJY2FzZSBBQ1BJX1RZUEVfU1RSSU5HOgorCisJCQkvKiBOb3RlOiBUYWtlcyBhZHZhbnRhZ2Ugb2YgY29tbW9uIHN0cmluZy9idWZmZXIgZmllbGRzICovCisKKwkJCXZhbHVlID0gc291cmNlX2Rlc2MtPmJ1ZmZlci5wb2ludGVyWzBdOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKworCQkJLyogQWxsIG90aGVyIHR5cGVzIGFyZSBpbnZhbGlkICovCisKKwkJCUFDUElfRVJST1IoKEFFX0lORk8sCisJCQkJICAgICJTb3VyY2UgbXVzdCBiZSBJbnRlZ2VyL0J1ZmZlci9TdHJpbmcgdHlwZSwgbm90ICVzIiwKKwkJCQkgICAgYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZShzb3VyY2VfZGVzYykpKTsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfT1BFUkFORF9UWVBFKTsKKwkJfQorCisJCS8qIFN0b3JlIHRoZSBzb3VyY2UgdmFsdWUgaW50byB0aGUgdGFyZ2V0IGJ1ZmZlciBieXRlICovCisKKwkJb2JqX2Rlc2MtPmJ1ZmZlci5wb2ludGVyW2luZGV4X2Rlc2MtPnJlZmVyZW5jZS52YWx1ZV0gPSB2YWx1ZTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlBQ1BJX0VSUk9SKChBRV9JTkZPLCAiVGFyZ2V0IGlzIG5vdCBhIFBhY2thZ2Ugb3IgQnVmZmVyRmllbGQiKSk7CisJCXN0YXR1cyA9IEFFX0FNTF9PUEVSQU5EX1RZUEU7CisJCWJyZWFrOworCX0KKworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X3N0b3JlX29iamVjdF90b19ub2RlCisgKgorICogUEFSQU1FVEVSUzogIHNvdXJjZV9kZXNjICAgICAgICAgICAgIC0gVmFsdWUgdG8gYmUgc3RvcmVkCisgKiAgICAgICAgICAgICAgTm9kZSAgICAgICAgICAgICAgICAgICAgLSBOYW1lZCBvYmplY3QgdG8gcmVjZWl2ZSB0aGUgdmFsdWUKKyAqICAgICAgICAgICAgICB3YWxrX3N0YXRlICAgICAgICAgICAgICAtIEN1cnJlbnQgd2FsayBzdGF0ZQorICogICAgICAgICAgICAgIGltcGxpY2l0X2NvbnZlcnNpb24gICAgIC0gUGVyZm9ybSBpbXBsaWNpdCBjb252ZXJzaW9uICh5ZXMvbm8pCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBTdG9yZSB0aGUgb2JqZWN0IHRvIHRoZSBuYW1lZCBvYmplY3QuCisgKgorICogICAgICAgICAgICAgIFRoZSBBc3NpZ25tZW50IG9mIGFuIG9iamVjdCB0byBhIG5hbWVkIG9iamVjdCBpcyBoYW5kbGVkIGhlcmUKKyAqICAgICAgICAgICAgICBUaGUgdmFsdWUgcGFzc2VkIGluIHdpbGwgcmVwbGFjZSB0aGUgY3VycmVudCB2YWx1ZSAoaWYgYW55KQorICogICAgICAgICAgICAgIHdpdGggdGhlIGlucHV0IHZhbHVlLgorICoKKyAqICAgICAgICAgICAgICBXaGVuIHN0b3JpbmcgaW50byBhbiBvYmplY3QgdGhlIGRhdGEgaXMgY29udmVydGVkIHRvIHRoZQorICogICAgICAgICAgICAgIHRhcmdldCBvYmplY3QgdHlwZSB0aGVuIHN0b3JlZCBpbiB0aGUgb2JqZWN0LiAgVGhpcyBtZWFucworICogICAgICAgICAgICAgIHRoYXQgdGhlIHRhcmdldCBvYmplY3QgdHlwZSAoZm9yIGFuIGluaXRpYWxpemVkIHRhcmdldCkgd2lsbAorICogICAgICAgICAgICAgIG5vdCBiZSBjaGFuZ2VkIGJ5IGEgc3RvcmUgb3BlcmF0aW9uLgorICoKKyAqICAgICAgICAgICAgICBBc3N1bWVzIHBhcmFtZXRlcnMgYXJlIGFscmVhZHkgdmFsaWRhdGVkLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2FjcGlfc3RhdHVzCithY3BpX2V4X3N0b3JlX29iamVjdF90b19ub2RlKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnNvdXJjZV9kZXNjLAorCQkJICAgICBzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZSwKKwkJCSAgICAgc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSwKKwkJCSAgICAgdTggaW1wbGljaXRfY29udmVyc2lvbikKK3sKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICp0YXJnZXRfZGVzYzsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpuZXdfZGVzYzsKKwlhY3BpX29iamVjdF90eXBlIHRhcmdldF90eXBlOworCisJQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIoZXhfc3RvcmVfb2JqZWN0X3RvX25vZGUsIHNvdXJjZV9kZXNjKTsKKworCS8qIEdldCBjdXJyZW50IHR5cGUgb2YgdGhlIG5vZGUsIGFuZCBvYmplY3QgYXR0YWNoZWQgdG8gTm9kZSAqLworCisJdGFyZ2V0X3R5cGUgPSBhY3BpX25zX2dldF90eXBlKG5vZGUpOworCXRhcmdldF9kZXNjID0gYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0KG5vZGUpOworCisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FWEVDLCAiU3RvcmluZyAlcCglcykgaW50byBub2RlICVwKCVzKVxuIiwKKwkJCSAgc291cmNlX2Rlc2MsCisJCQkgIGFjcGlfdXRfZ2V0X29iamVjdF90eXBlX25hbWUoc291cmNlX2Rlc2MpLCBub2RlLAorCQkJICBhY3BpX3V0X2dldF90eXBlX25hbWUodGFyZ2V0X3R5cGUpKSk7CisKKwkvKgorCSAqIFJlc29sdmUgdGhlIHNvdXJjZSBvYmplY3QgdG8gYW4gYWN0dWFsIHZhbHVlCisJICogKElmIGl0IGlzIGEgcmVmZXJlbmNlIG9iamVjdCkKKwkgKi8KKwlzdGF0dXMgPSBhY3BpX2V4X3Jlc29sdmVfb2JqZWN0KCZzb3VyY2VfZGVzYywgdGFyZ2V0X3R5cGUsIHdhbGtfc3RhdGUpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKKwl9CisKKwkvKiBJZiBubyBpbXBsaWNpdCBjb252ZXJzaW9uLCBkcm9wIGludG8gdGhlIGRlZmF1bHQgY2FzZSBiZWxvdyAqLworCisJaWYgKCghaW1wbGljaXRfY29udmVyc2lvbikgfHwKKwkgICAgKCh3YWxrX3N0YXRlLT5vcGNvZGUgPT0gQU1MX0NPUFlfT1ApICYmCisJICAgICAodGFyZ2V0X3R5cGUgIT0gQUNQSV9UWVBFX0xPQ0FMX1JFR0lPTl9GSUVMRCkgJiYKKwkgICAgICh0YXJnZXRfdHlwZSAhPSBBQ1BJX1RZUEVfTE9DQUxfQkFOS19GSUVMRCkgJiYKKwkgICAgICh0YXJnZXRfdHlwZSAhPSBBQ1BJX1RZUEVfTE9DQUxfSU5ERVhfRklFTEQpKSkgeworCQkvKgorCQkgKiBGb3JjZSBleGVjdXRpb24gb2YgZGVmYXVsdCAobm8gaW1wbGljaXQgY29udmVyc2lvbikuIE5vdGU6CisJCSAqIGNvcHlfb2JqZWN0IGRvZXMgbm90IHBlcmZvcm0gYW4gaW1wbGljaXQgY29udmVyc2lvbiwgYXMgcGVyIHRoZSBBQ1BJCisJCSAqIHNwZWMgLS0gZXhjZXB0IGluIGNhc2Ugb2YgcmVnaW9uL2JhbmsvaW5kZXggZmllbGRzIC0tIGJlY2F1c2UgdGhlc2UKKwkJICogb2JqZWN0cyBtdXN0IHJldGFpbiB0aGVpciBvcmlnaW5hbCB0eXBlIHBlcm1hbmVudGx5LgorCQkgKi8KKwkJdGFyZ2V0X3R5cGUgPSBBQ1BJX1RZUEVfQU5ZOworCX0KKworCS8qIERvIHRoZSBhY3R1YWwgc3RvcmUgb3BlcmF0aW9uICovCisKKwlzd2l0Y2ggKHRhcmdldF90eXBlKSB7CisJY2FzZSBBQ1BJX1RZUEVfQlVGRkVSX0ZJRUxEOgorCWNhc2UgQUNQSV9UWVBFX0xPQ0FMX1JFR0lPTl9GSUVMRDoKKwljYXNlIEFDUElfVFlQRV9MT0NBTF9CQU5LX0ZJRUxEOgorCWNhc2UgQUNQSV9UWVBFX0xPQ0FMX0lOREVYX0ZJRUxEOgorCisJCS8qIEZvciBmaWVsZHMsIGNvcHkgdGhlIHNvdXJjZSBkYXRhIHRvIHRoZSB0YXJnZXQgZmllbGQuICovCisKKwkJc3RhdHVzID0gYWNwaV9leF93cml0ZV9kYXRhX3RvX2ZpZWxkKHNvdXJjZV9kZXNjLCB0YXJnZXRfZGVzYywKKwkJCQkJCSAgICAgJndhbGtfc3RhdGUtPnJlc3VsdF9vYmopOworCQlicmVhazsKKworCWNhc2UgQUNQSV9UWVBFX0lOVEVHRVI6CisJY2FzZSBBQ1BJX1RZUEVfU1RSSU5HOgorCWNhc2UgQUNQSV9UWVBFX0JVRkZFUjoKKworCQkvKgorCQkgKiBUaGVzZSB0YXJnZXQgdHlwZXMgYXJlIGFsbCBvZiB0eXBlIEludGVnZXIvU3RyaW5nL0J1ZmZlciwgYW5kCisJCSAqIHRoZXJlZm9yZSBzdXBwb3J0IGltcGxpY2l0IGNvbnZlcnNpb24gYmVmb3JlIHRoZSBzdG9yZS4KKwkJICoKKwkJICogQ29weSBhbmQvb3IgY29udmVydCB0aGUgc291cmNlIG9iamVjdCB0byBhIG5ldyB0YXJnZXQgb2JqZWN0CisJCSAqLworCQlzdGF0dXMgPQorCQkgICAgYWNwaV9leF9zdG9yZV9vYmplY3RfdG9fb2JqZWN0KHNvdXJjZV9kZXNjLCB0YXJnZXRfZGVzYywKKwkJCQkJCSAgICZuZXdfZGVzYywgd2Fsa19zdGF0ZSk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CisJCX0KKworCQlpZiAobmV3X2Rlc2MgIT0gdGFyZ2V0X2Rlc2MpIHsKKwkJCS8qCisJCQkgKiBTdG9yZSB0aGUgbmV3IG5ld19kZXNjIGFzIHRoZSBuZXcgdmFsdWUgb2YgdGhlIE5hbWUsIGFuZCBzZXQKKwkJCSAqIHRoZSBOYW1lJ3MgdHlwZSB0byB0aGF0IG9mIHRoZSB2YWx1ZSBiZWluZyBzdG9yZWQgaW4gaXQuCisJCQkgKiBzb3VyY2VfZGVzYyByZWZlcmVuY2UgY291bnQgaXMgaW5jcmVtZW50ZWQgYnkgYXR0YWNoX29iamVjdC4KKwkJCSAqCisJCQkgKiBOb3RlOiBUaGlzIG1heSBjaGFuZ2UgdGhlIHR5cGUgb2YgdGhlIG5vZGUgaWYgYW4gZXhwbGljaXQgc3RvcmUKKwkJCSAqIGhhcyBiZWVuIHBlcmZvcm1lZCBzdWNoIHRoYXQgdGhlIG5vZGUvb2JqZWN0IHR5cGUgaGFzIGJlZW4KKwkJCSAqIGNoYW5nZWQuCisJCQkgKi8KKwkJCXN0YXR1cyA9CisJCQkgICAgYWNwaV9uc19hdHRhY2hfb2JqZWN0KG5vZGUsIG5ld19kZXNjLAorCQkJCQkJICBuZXdfZGVzYy0+Y29tbW9uLnR5cGUpOworCisJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VYRUMsCisJCQkJCSAgIlN0b3JlICVzIGludG8gJXMgdmlhIENvbnZlcnQvQXR0YWNoXG4iLAorCQkJCQkgIGFjcGlfdXRfZ2V0X29iamVjdF90eXBlX25hbWUKKwkJCQkJICAoc291cmNlX2Rlc2MpLAorCQkJCQkgIGFjcGlfdXRfZ2V0X29iamVjdF90eXBlX25hbWUKKwkJCQkJICAobmV3X2Rlc2MpKSk7CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVhFQywKKwkJCQkgICJTdG9yaW5nICVzICglcCkgZGlyZWN0bHkgaW50byBub2RlICglcCkgd2l0aCBubyBpbXBsaWNpdCBjb252ZXJzaW9uXG4iLAorCQkJCSAgYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZShzb3VyY2VfZGVzYyksCisJCQkJICBzb3VyY2VfZGVzYywgbm9kZSkpOworCisJCS8qIE5vIGNvbnZlcnNpb25zIGZvciBhbGwgb3RoZXIgdHlwZXMuICBKdXN0IGF0dGFjaCB0aGUgc291cmNlIG9iamVjdCAqLworCisJCXN0YXR1cyA9IGFjcGlfbnNfYXR0YWNoX29iamVjdChub2RlLCBzb3VyY2VfZGVzYywKKwkJCQkJICAgICAgIEFDUElfR0VUX09CSkVDVF9UWVBFCisJCQkJCSAgICAgICAoc291cmNlX2Rlc2MpKTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2V4c3RvcmVuLmMgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2V4c3RvcmVuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQ1ZDE1MwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXhzdG9yZW4uYwpAQCAtMCwwICsxLDMwNCBAQAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogTW9kdWxlIE5hbWU6IGV4c3RvcmVuIC0gQU1MIEludGVycHJldGVyIG9iamVjdCBzdG9yZSBzdXBwb3J0LAorICogICAgICAgICAgICAgICAgICAgICAgICBTdG9yZSB0byBOb2RlIChuYW1lc3BhY2Ugb2JqZWN0KQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDgsIEludGVsIENvcnAuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCisgKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSBhdCBtaW5pbXVtIGEgZGlzY2xhaW1lcgorICogICAgc3Vic3RhbnRpYWxseSBzaW1pbGFyIHRvIHRoZSAiTk8gV0FSUkFOVFkiIGRpc2NsYWltZXIgYmVsb3cKKyAqICAgICgiRGlzY2xhaW1lciIpIGFuZCBhbnkgcmVkaXN0cmlidXRpb24gbXVzdCBiZSBjb25kaXRpb25lZCB1cG9uCisgKiAgICBpbmNsdWRpbmcgYSBzdWJzdGFudGlhbGx5IHNpbWlsYXIgRGlzY2xhaW1lciByZXF1aXJlbWVudCBmb3IgZnVydGhlcgorICogICAgYmluYXJ5IHJlZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzCisgKiAgICBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIE5PIFdBUlJBTlRZCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORworICogSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCisgKi8KKworI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgorI2luY2x1ZGUgImFjY29tbW9uLmgiCisjaW5jbHVkZSAiYWNpbnRlcnAuaCIKKyNpbmNsdWRlICJhbWxjb2RlLmgiCisKKyNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX0VYRUNVVEVSCitBQ1BJX01PRFVMRV9OQU1FKCJleHN0b3JlbiIpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfZXhfcmVzb2x2ZV9vYmplY3QKKyAqCisgKiBQQVJBTUVURVJTOiAgc291cmNlX2Rlc2NfcHRyICAgICAtIFBvaW50ZXIgdG8gdGhlIHNvdXJjZSBvYmplY3QKKyAqICAgICAgICAgICAgICB0YXJnZXRfdHlwZSAgICAgICAgIC0gQ3VycmVudCB0eXBlIG9mIHRoZSB0YXJnZXQKKyAqICAgICAgICAgICAgICB3YWxrX3N0YXRlICAgICAgICAgIC0gQ3VycmVudCB3YWxrIHN0YXRlCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cywgcmVzb2x2ZWQgb2JqZWN0IGluIHNvdXJjZV9kZXNjX3B0ci4KKyAqCisgKiBERVNDUklQVElPTjogUmVzb2x2ZSBhbiBvYmplY3QuICBJZiB0aGUgb2JqZWN0IGlzIGEgcmVmZXJlbmNlLCBkZXJlZmVyZW5jZQorICogICAgICAgICAgICAgIGl0IGFuZCByZXR1cm4gdGhlIGFjdHVhbCBvYmplY3QgaW4gdGhlIHNvdXJjZV9kZXNjX3B0ci4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYWNwaV9zdGF0dXMKK2FjcGlfZXhfcmVzb2x2ZV9vYmplY3QodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKnNvdXJjZV9kZXNjX3B0ciwKKwkJICAgICAgIGFjcGlfb2JqZWN0X3R5cGUgdGFyZ2V0X3R5cGUsCisJCSAgICAgICBzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKQoreworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnNvdXJjZV9kZXNjID0gKnNvdXJjZV9kZXNjX3B0cjsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0UoZXhfcmVzb2x2ZV9vYmplY3QpOworCisJLyogRW5zdXJlIHdlIGhhdmUgYSBUYXJnZXQgdGhhdCBjYW4gYmUgc3RvcmVkIHRvICovCisKKwlzd2l0Y2ggKHRhcmdldF90eXBlKSB7CisJY2FzZSBBQ1BJX1RZUEVfQlVGRkVSX0ZJRUxEOgorCWNhc2UgQUNQSV9UWVBFX0xPQ0FMX1JFR0lPTl9GSUVMRDoKKwljYXNlIEFDUElfVFlQRV9MT0NBTF9CQU5LX0ZJRUxEOgorCWNhc2UgQUNQSV9UWVBFX0xPQ0FMX0lOREVYX0ZJRUxEOgorCQkvKgorCQkgKiBUaGVzZSBjYXNlcyBhbGwgcmVxdWlyZSBvbmx5IEludGVnZXJzIG9yIHZhbHVlcyB0aGF0CisJCSAqIGNhbiBiZSBjb252ZXJ0ZWQgdG8gSW50ZWdlcnMgKFN0cmluZ3Mgb3IgQnVmZmVycykKKwkJICovCisKKwljYXNlIEFDUElfVFlQRV9JTlRFR0VSOgorCWNhc2UgQUNQSV9UWVBFX1NUUklORzoKKwljYXNlIEFDUElfVFlQRV9CVUZGRVI6CisKKwkJLyoKKwkJICogU3RvcmVzIGludG8gYSBGaWVsZC9SZWdpb24gb3IgaW50byBhIEludGVnZXIvQnVmZmVyL1N0cmluZworCQkgKiBhcmUgYWxsIGVzc2VudGlhbGx5IHRoZSBzYW1lLiAgVGhpcyBjYXNlIGhhbmRsZXMgdGhlCisJCSAqICJpbnRlcmNoYW5nZWFibGUiIHR5cGVzIEludGVnZXIsIFN0cmluZywgYW5kIEJ1ZmZlci4KKwkJICovCisJCWlmIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRShzb3VyY2VfZGVzYykgPT0KKwkJICAgIEFDUElfVFlQRV9MT0NBTF9SRUZFUkVOQ0UpIHsKKworCQkJLyogUmVzb2x2ZSBhIHJlZmVyZW5jZSBvYmplY3QgZmlyc3QgKi8KKworCQkJc3RhdHVzID0KKwkJCSAgICBhY3BpX2V4X3Jlc29sdmVfdG9fdmFsdWUoc291cmNlX2Rlc2NfcHRyLAorCQkJCQkJICAgICB3YWxrX3N0YXRlKTsKKwkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJLyogRm9yIGNvcHlfb2JqZWN0LCBubyBmdXJ0aGVyIHZhbGlkYXRpb24gbmVjZXNzYXJ5ICovCisKKwkJaWYgKHdhbGtfc3RhdGUtPm9wY29kZSA9PSBBTUxfQ09QWV9PUCkgeworCQkJYnJlYWs7CisJCX0KKworCQkvKiBNdXN0IGhhdmUgYSBJbnRlZ2VyLCBCdWZmZXIsIG9yIFN0cmluZyAqLworCisJCWlmICgoQUNQSV9HRVRfT0JKRUNUX1RZUEUoc291cmNlX2Rlc2MpICE9IEFDUElfVFlQRV9JTlRFR0VSKSAmJgorCQkgICAgKEFDUElfR0VUX09CSkVDVF9UWVBFKHNvdXJjZV9kZXNjKSAhPSBBQ1BJX1RZUEVfQlVGRkVSKSAmJgorCQkgICAgKEFDUElfR0VUX09CSkVDVF9UWVBFKHNvdXJjZV9kZXNjKSAhPSBBQ1BJX1RZUEVfU1RSSU5HKSAmJgorCQkgICAgISgoQUNQSV9HRVRfT0JKRUNUX1RZUEUoc291cmNlX2Rlc2MpID09CisJCSAgICAgICBBQ1BJX1RZUEVfTE9DQUxfUkVGRVJFTkNFKQorCQkgICAgICAmJiAoc291cmNlX2Rlc2MtPnJlZmVyZW5jZS5jbGFzcyA9PQorCQkJICBBQ1BJX1JFRkNMQVNTX1RBQkxFKSkpIHsKKworCQkJLyogQ29udmVyc2lvbiBzdWNjZXNzZnVsIGJ1dCBzdGlsbCBub3QgYSB2YWxpZCB0eXBlICovCisKKwkJCUFDUElfRVJST1IoKEFFX0lORk8sCisJCQkJICAgICJDYW5ub3QgYXNzaWduIHR5cGUgJXMgdG8gJXMgKG11c3QgYmUgdHlwZSBJbnQvU3RyL0J1ZikiLAorCQkJCSAgICBhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lKHNvdXJjZV9kZXNjKSwKKwkJCQkgICAgYWNwaV91dF9nZXRfdHlwZV9uYW1lKHRhcmdldF90eXBlKSkpOworCQkJc3RhdHVzID0gQUVfQU1MX09QRVJBTkRfVFlQRTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgQUNQSV9UWVBFX0xPQ0FMX0FMSUFTOgorCWNhc2UgQUNQSV9UWVBFX0xPQ0FMX01FVEhPRF9BTElBUzoKKworCQkvKgorCQkgKiBBbGwgYWxpYXNlcyBzaG91bGQgaGF2ZSBiZWVuIHJlc29sdmVkIGVhcmxpZXIsIGR1cmluZyB0aGUKKwkJICogb3BlcmFuZCByZXNvbHV0aW9uIHBoYXNlLgorCQkgKi8KKwkJQUNQSV9FUlJPUigoQUVfSU5GTywgIlN0b3JlIGludG8gYW4gdW5yZXNvbHZlZCBBbGlhcyBvYmplY3QiKSk7CisJCXN0YXR1cyA9IEFFX0FNTF9JTlRFUk5BTDsKKwkJYnJlYWs7CisKKwljYXNlIEFDUElfVFlQRV9QQUNLQUdFOgorCWRlZmF1bHQ6CisKKwkJLyoKKwkJICogQWxsIG90aGVyIHR5cGVzIHRoYW4gQWxpYXMgYW5kIHRoZSB2YXJpb3VzIEZpZWxkcyBjb21lIGhlcmUsCisJCSAqIGluY2x1ZGluZyB0aGUgdW50eXBlZCBjYXNlIC0gQUNQSV9UWVBFX0FOWS4KKwkJICovCisJCWJyZWFrOworCX0KKworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X3N0b3JlX29iamVjdF90b19vYmplY3QKKyAqCisgKiBQQVJBTUVURVJTOiAgc291cmNlX2Rlc2MgICAgICAgICAtIE9iamVjdCB0byBzdG9yZQorICogICAgICAgICAgICAgIGRlc3RfZGVzYyAgICAgICAgICAgLSBPYmplY3QgdG8gcmVjZWl2ZSBhIGNvcHkgb2YgdGhlIHNvdXJjZQorICogICAgICAgICAgICAgIG5ld19kZXNjICAgICAgICAgICAgLSBOZXcgb2JqZWN0IGlmIGRlc3RfZGVzYyBpcyBvYnNvbGV0ZWQKKyAqICAgICAgICAgICAgICB3YWxrX3N0YXRlICAgICAgICAgIC0gQ3VycmVudCB3YWxrIHN0YXRlCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiAiU3RvcmUiIGFuIG9iamVjdCB0byBhbm90aGVyIG9iamVjdC4gIFRoaXMgbWF5IGluY2x1ZGUKKyAqICAgICAgICAgICAgICBjb252ZXJ0aW5nIHRoZSBzb3VyY2UgdHlwZSB0byB0aGUgdGFyZ2V0IHR5cGUgKGltcGxpY2l0CisgKiAgICAgICAgICAgICAgY29udmVyc2lvbiksIGFuZCBhIGNvcHkgb2YgdGhlIHZhbHVlIG9mIHRoZSBzb3VyY2UgdG8KKyAqICAgICAgICAgICAgICB0aGUgdGFyZ2V0LgorICoKKyAqICAgICAgICAgICAgICBUaGUgQXNzaWdubWVudCBvZiBhbiBvYmplY3QgdG8gYW5vdGhlciAobm90IG5hbWVkKSBvYmplY3QKKyAqICAgICAgICAgICAgICBpcyBoYW5kbGVkIGhlcmUuCisgKiAgICAgICAgICAgICAgVGhlIFNvdXJjZSBwYXNzZWQgaW4gd2lsbCByZXBsYWNlIHRoZSBjdXJyZW50IHZhbHVlIChpZiBhbnkpCisgKiAgICAgICAgICAgICAgd2l0aCB0aGUgaW5wdXQgdmFsdWUuCisgKgorICogICAgICAgICAgICAgIFdoZW4gc3RvcmluZyBpbnRvIGFuIG9iamVjdCB0aGUgZGF0YSBpcyBjb252ZXJ0ZWQgdG8gdGhlCisgKiAgICAgICAgICAgICAgdGFyZ2V0IG9iamVjdCB0eXBlIHRoZW4gc3RvcmVkIGluIHRoZSBvYmplY3QuICBUaGlzIG1lYW5zCisgKiAgICAgICAgICAgICAgdGhhdCB0aGUgdGFyZ2V0IG9iamVjdCB0eXBlIChmb3IgYW4gaW5pdGlhbGl6ZWQgdGFyZ2V0KSB3aWxsCisgKiAgICAgICAgICAgICAgbm90IGJlIGNoYW5nZWQgYnkgYSBzdG9yZSBvcGVyYXRpb24uCisgKgorICogICAgICAgICAgICAgIFRoaXMgbW9kdWxlIGFsbG93cyBkZXN0aW5hdGlvbiB0eXBlcyBvZiBOdW1iZXIsIFN0cmluZywKKyAqICAgICAgICAgICAgICBCdWZmZXIsIGFuZCBQYWNrYWdlLgorICoKKyAqICAgICAgICAgICAgICBBc3N1bWVzIHBhcmFtZXRlcnMgYXJlIGFscmVhZHkgdmFsaWRhdGVkLiAgTk9URTogc291cmNlX2Rlc2MKKyAqICAgICAgICAgICAgICByZXNvbHV0aW9uIChmcm9tIGEgcmVmZXJlbmNlIG9iamVjdCkgbXVzdCBiZSBwZXJmb3JtZWQgYnkKKyAqICAgICAgICAgICAgICB0aGUgY2FsbGVyIGlmIG5lY2Vzc2FyeS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCithY3BpX3N0YXR1cworYWNwaV9leF9zdG9yZV9vYmplY3RfdG9fb2JqZWN0KHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnNvdXJjZV9kZXNjLAorCQkJICAgICAgIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKmRlc3RfZGVzYywKKwkJCSAgICAgICB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICoqbmV3X2Rlc2MsCisJCQkgICAgICAgc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSkKK3sKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICphY3R1YWxfc3JjX2Rlc2M7CisJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUihleF9zdG9yZV9vYmplY3RfdG9fb2JqZWN0LCBzb3VyY2VfZGVzYyk7CisKKwlhY3R1YWxfc3JjX2Rlc2MgPSBzb3VyY2VfZGVzYzsKKwlpZiAoIWRlc3RfZGVzYykgeworCQkvKgorCQkgKiBUaGVyZSBpcyBubyBkZXN0aW5hdGlvbiBvYmplY3QgKEFuIHVuaW5pdGlhbGl6ZWQgbm9kZSBvcgorCQkgKiBwYWNrYWdlIGVsZW1lbnQpLCBzbyB3ZSBjYW4gc2ltcGx5IGNvcHkgdGhlIHNvdXJjZSBvYmplY3QKKwkJICogY3JlYXRpbmcgYSBuZXcgZGVzdGluYXRpb24gb2JqZWN0CisJCSAqLworCQlzdGF0dXMgPQorCQkgICAgYWNwaV91dF9jb3B5X2lvYmplY3RfdG9faW9iamVjdChhY3R1YWxfc3JjX2Rlc2MsIG5ld19kZXNjLAorCQkJCQkJICAgIHdhbGtfc3RhdGUpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKKwl9CisKKwlpZiAoQUNQSV9HRVRfT0JKRUNUX1RZUEUoc291cmNlX2Rlc2MpICE9CisJICAgIEFDUElfR0VUX09CSkVDVF9UWVBFKGRlc3RfZGVzYykpIHsKKwkJLyoKKwkJICogVGhlIHNvdXJjZSB0eXBlIGRvZXMgbm90IG1hdGNoIHRoZSB0eXBlIG9mIHRoZSBkZXN0aW5hdGlvbi4KKwkJICogUGVyZm9ybSB0aGUgImltcGxpY2l0IGNvbnZlcnNpb24iIG9mIHRoZSBzb3VyY2UgdG8gdGhlIGN1cnJlbnQgdHlwZQorCQkgKiBvZiB0aGUgdGFyZ2V0IGFzIHBlciB0aGUgQUNQSSBzcGVjaWZpY2F0aW9uLgorCQkgKgorCQkgKiBJZiBubyBjb252ZXJzaW9uIHBlcmZvcm1lZCwgYWN0dWFsX3NyY19kZXNjID0gc291cmNlX2Rlc2MuCisJCSAqIE90aGVyd2lzZSwgYWN0dWFsX3NyY19kZXNjIGlzIGEgdGVtcG9yYXJ5IG9iamVjdCB0byBob2xkIHRoZQorCQkgKiBjb252ZXJ0ZWQgb2JqZWN0LgorCQkgKi8KKwkJc3RhdHVzID0KKwkJICAgIGFjcGlfZXhfY29udmVydF90b190YXJnZXRfdHlwZShBQ1BJX0dFVF9PQkpFQ1RfVFlQRQorCQkJCQkJICAgKGRlc3RfZGVzYyksIHNvdXJjZV9kZXNjLAorCQkJCQkJICAgJmFjdHVhbF9zcmNfZGVzYywKKwkJCQkJCSAgIHdhbGtfc3RhdGUpOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworCQl9CisKKwkJaWYgKHNvdXJjZV9kZXNjID09IGFjdHVhbF9zcmNfZGVzYykgeworCQkJLyoKKwkJCSAqIE5vIGNvbnZlcnNpb24gd2FzIHBlcmZvcm1lZC4gUmV0dXJuIHRoZSBzb3VyY2VfZGVzYyBhcyB0aGUKKwkJCSAqIG5ldyBvYmplY3QuCisJCQkgKi8KKwkJCSpuZXdfZGVzYyA9IHNvdXJjZV9kZXNjOworCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKKwkJfQorCX0KKworCS8qCisJICogV2Ugbm93IGhhdmUgdHdvIG9iamVjdHMgb2YgaWRlbnRpY2FsIHR5cGVzLCBhbmQgd2UgY2FuIHBlcmZvcm0gYQorCSAqIGNvcHkgb2YgdGhlICp2YWx1ZSogb2YgdGhlIHNvdXJjZSBvYmplY3QuCisJICovCisJc3dpdGNoIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRShkZXN0X2Rlc2MpKSB7CisJY2FzZSBBQ1BJX1RZUEVfSU5URUdFUjoKKworCQlkZXN0X2Rlc2MtPmludGVnZXIudmFsdWUgPSBhY3R1YWxfc3JjX2Rlc2MtPmludGVnZXIudmFsdWU7CisKKwkJLyogVHJ1bmNhdGUgdmFsdWUgaWYgd2UgYXJlIGV4ZWN1dGluZyBmcm9tIGEgMzItYml0IEFDUEkgdGFibGUgKi8KKworCQlhY3BpX2V4X3RydW5jYXRlX2ZvcjMyYml0X3RhYmxlKGRlc3RfZGVzYyk7CisJCWJyZWFrOworCisJY2FzZSBBQ1BJX1RZUEVfU1RSSU5HOgorCisJCXN0YXR1cyA9CisJCSAgICBhY3BpX2V4X3N0b3JlX3N0cmluZ190b19zdHJpbmcoYWN0dWFsX3NyY19kZXNjLCBkZXN0X2Rlc2MpOworCQlicmVhazsKKworCWNhc2UgQUNQSV9UWVBFX0JVRkZFUjoKKworCQlzdGF0dXMgPQorCQkgICAgYWNwaV9leF9zdG9yZV9idWZmZXJfdG9fYnVmZmVyKGFjdHVhbF9zcmNfZGVzYywgZGVzdF9kZXNjKTsKKwkJYnJlYWs7CisKKwljYXNlIEFDUElfVFlQRV9QQUNLQUdFOgorCisJCXN0YXR1cyA9CisJCSAgICBhY3BpX3V0X2NvcHlfaW9iamVjdF90b19pb2JqZWN0KGFjdHVhbF9zcmNfZGVzYywgJmRlc3RfZGVzYywKKwkJCQkJCSAgICB3YWxrX3N0YXRlKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQkvKgorCQkgKiBBbGwgb3RoZXIgdHlwZXMgY29tZSBoZXJlLgorCQkgKi8KKwkJQUNQSV9XQVJOSU5HKChBRV9JTkZPLCAiU3RvcmUgaW50byB0eXBlICVzIG5vdCBpbXBsZW1lbnRlZCIsCisJCQkgICAgICBhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lKGRlc3RfZGVzYykpKTsKKworCQlzdGF0dXMgPSBBRV9OT1RfSU1QTEVNRU5URUQ7CisJCWJyZWFrOworCX0KKworCWlmIChhY3R1YWxfc3JjX2Rlc2MgIT0gc291cmNlX2Rlc2MpIHsKKworCQkvKiBEZWxldGUgdGhlIGludGVybWVkaWF0ZSAodGVtcG9yYXJ5KSBzb3VyY2Ugb2JqZWN0ICovCisKKwkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKGFjdHVhbF9zcmNfZGVzYyk7CisJfQorCisJKm5ld19kZXNjID0gZGVzdF9kZXNjOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS9leHN0b3JvYi5jIGIvZHJpdmVycy9hY3BpL2FjcGljYS9leHN0b3JvYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3MzQwY2MKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2V4c3Rvcm9iLmMKQEAgLTAsMCArMSwyMDkgQEAKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIE1vZHVsZSBOYW1lOiBleHN0b3JvYiAtIEFNTCBJbnRlcnByZXRlciBvYmplY3Qgc3RvcmUgc3VwcG9ydCwgc3RvcmUgdG8gb2JqZWN0CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwOCwgSW50ZWwgQ29ycC4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKKyAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIGF0IG1pbmltdW0gYSBkaXNjbGFpbWVyCisgKiAgICBzdWJzdGFudGlhbGx5IHNpbWlsYXIgdG8gdGhlICJOTyBXQVJSQU5UWSIgZGlzY2xhaW1lciBiZWxvdworICogICAgKCJEaXNjbGFpbWVyIikgYW5kIGFueSByZWRpc3RyaWJ1dGlvbiBtdXN0IGJlIGNvbmRpdGlvbmVkIHVwb24KKyAqICAgIGluY2x1ZGluZyBhIHN1YnN0YW50aWFsbHkgc2ltaWxhciBEaXNjbGFpbWVyIHJlcXVpcmVtZW50IGZvciBmdXJ0aGVyCisgKiAgICBiaW5hcnkgcmVkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMKKyAqICAgIG9mIGFueSBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogTk8gV0FSUkFOVFkKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HCisgKiBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KKyAqLworCisjaW5jbHVkZSA8YWNwaS9hY3BpLmg+CisjaW5jbHVkZSAiYWNjb21tb24uaCIKKyNpbmNsdWRlICJhY2ludGVycC5oIgorCisjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9FWEVDVVRFUgorQUNQSV9NT0RVTEVfTkFNRSgiZXhzdG9yb2IiKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X3N0b3JlX2J1ZmZlcl90b19idWZmZXIKKyAqCisgKiBQQVJBTUVURVJTOiAgc291cmNlX2Rlc2MgICAgICAgICAtIFNvdXJjZSBvYmplY3QgdG8gY29weQorICogICAgICAgICAgICAgIHRhcmdldF9kZXNjICAgICAgICAgLSBEZXN0aW5hdGlvbiBvYmplY3Qgb2YgdGhlIGNvcHkKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IENvcHkgYSBidWZmZXIgb2JqZWN0IHRvIGFub3RoZXIgYnVmZmVyIG9iamVjdC4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYWNwaV9zdGF0dXMKK2FjcGlfZXhfc3RvcmVfYnVmZmVyX3RvX2J1ZmZlcih1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpzb3VyY2VfZGVzYywKKwkJCSAgICAgICB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICp0YXJnZXRfZGVzYykKK3sKKwl1MzIgbGVuZ3RoOworCXU4ICpidWZmZXI7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUihleF9zdG9yZV9idWZmZXJfdG9fYnVmZmVyLCBzb3VyY2VfZGVzYyk7CisKKwkvKiBXZSBrbm93IHRoYXQgc291cmNlX2Rlc2MgaXMgYSBidWZmZXIgYnkgbm93ICovCisKKwlidWZmZXIgPSBBQ1BJX0NBU1RfUFRSKHU4LCBzb3VyY2VfZGVzYy0+YnVmZmVyLnBvaW50ZXIpOworCWxlbmd0aCA9IHNvdXJjZV9kZXNjLT5idWZmZXIubGVuZ3RoOworCisJLyoKKwkgKiBJZiB0YXJnZXQgaXMgYSBidWZmZXIgb2YgbGVuZ3RoIHplcm8gb3IgaXMgYSBzdGF0aWMgYnVmZmVyLAorCSAqIGFsbG9jYXRlIGEgbmV3IGJ1ZmZlciBvZiB0aGUgcHJvcGVyIGxlbmd0aAorCSAqLworCWlmICgodGFyZ2V0X2Rlc2MtPmJ1ZmZlci5sZW5ndGggPT0gMCkgfHwKKwkgICAgKHRhcmdldF9kZXNjLT5jb21tb24uZmxhZ3MgJiBBT1BPQkpfU1RBVElDX1BPSU5URVIpKSB7CisJCXRhcmdldF9kZXNjLT5idWZmZXIucG9pbnRlciA9IEFDUElfQUxMT0NBVEUobGVuZ3RoKTsKKwkJaWYgKCF0YXJnZXRfZGVzYy0+YnVmZmVyLnBvaW50ZXIpIHsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT19NRU1PUlkpOworCQl9CisKKwkJdGFyZ2V0X2Rlc2MtPmJ1ZmZlci5sZW5ndGggPSBsZW5ndGg7CisJfQorCisJLyogQ29weSBzb3VyY2UgYnVmZmVyIHRvIHRhcmdldCBidWZmZXIgKi8KKworCWlmIChsZW5ndGggPD0gdGFyZ2V0X2Rlc2MtPmJ1ZmZlci5sZW5ndGgpIHsKKworCQkvKiBDbGVhciBleGlzdGluZyBidWZmZXIgYW5kIGNvcHkgaW4gdGhlIG5ldyBvbmUgKi8KKworCQlBQ1BJX01FTVNFVCh0YXJnZXRfZGVzYy0+YnVmZmVyLnBvaW50ZXIsIDAsCisJCQkgICAgdGFyZ2V0X2Rlc2MtPmJ1ZmZlci5sZW5ndGgpOworCQlBQ1BJX01FTUNQWSh0YXJnZXRfZGVzYy0+YnVmZmVyLnBvaW50ZXIsIGJ1ZmZlciwgbGVuZ3RoKTsKKworI2lmZGVmIEFDUElfT0JTT0xFVEVfQkVIQVZJT1IKKwkJLyoKKwkJICogTk9URTogQUNQSSB2ZXJzaW9ucyB1cCB0byAzLjAgc3BlY2lmaWVkIHRoYXQgdGhlIGJ1ZmZlciBtdXN0IGJlCisJCSAqIHRydW5jYXRlZCBpZiB0aGUgc3RyaW5nIGlzIHNtYWxsZXIgdGhhbiB0aGUgYnVmZmVyLiAgSG93ZXZlciwgIm90aGVyIgorCQkgKiBpbXBsZW1lbnRhdGlvbnMgb2YgQUNQSSBuZXZlciBkaWQgdGhpcyBhbmQgdGh1cyBiZWNhbWUgdGhlIGRlZmFjdG8KKwkJICogc3RhbmRhcmQuIEFDUEkgMy4wX2EgY2hhbmdlcyB0aGlzIGJlaGF2aW9yIHN1Y2ggdGhhdCB0aGUgYnVmZmVyCisJCSAqIGlzIG5vIGxvbmdlciB0cnVuY2F0ZWQuCisJCSAqLworCisJCS8qCisJCSAqIE9CU09MRVRFIEJFSEFWSU9SOgorCQkgKiBJZiB0aGUgb3JpZ2luYWwgc291cmNlIHdhcyBhIHN0cmluZywgd2UgbXVzdCB0cnVuY2F0ZSB0aGUgYnVmZmVyLAorCQkgKiBhY2NvcmRpbmcgdG8gdGhlIEFDUEkgc3BlYy4gIEludGVnZXItdG8tQnVmZmVyIGFuZCBCdWZmZXItdG8tQnVmZmVyCisJCSAqIGNvcHkgbXVzdCBub3QgdHJ1bmNhdGUgdGhlIG9yaWdpbmFsIGJ1ZmZlci4KKwkJICovCisJCWlmIChvcmlnaW5hbF9zcmNfdHlwZSA9PSBBQ1BJX1RZUEVfU1RSSU5HKSB7CisKKwkJCS8qIFNldCB0aGUgbmV3IGxlbmd0aCBvZiB0aGUgdGFyZ2V0ICovCisKKwkJCXRhcmdldF9kZXNjLT5idWZmZXIubGVuZ3RoID0gbGVuZ3RoOworCQl9CisjZW5kaWYKKwl9IGVsc2UgeworCQkvKiBUcnVuY2F0ZSB0aGUgc291cmNlLCBjb3B5IG9ubHkgd2hhdCB3aWxsIGZpdCAqLworCisJCUFDUElfTUVNQ1BZKHRhcmdldF9kZXNjLT5idWZmZXIucG9pbnRlciwgYnVmZmVyLAorCQkJICAgIHRhcmdldF9kZXNjLT5idWZmZXIubGVuZ3RoKTsKKworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sCisJCQkJICAiVHJ1bmNhdGluZyBzb3VyY2UgYnVmZmVyIGZyb20gJVggdG8gJVhcbiIsCisJCQkJICBsZW5ndGgsIHRhcmdldF9kZXNjLT5idWZmZXIubGVuZ3RoKSk7CisJfQorCisJLyogQ29weSBmbGFncyAqLworCisJdGFyZ2V0X2Rlc2MtPmJ1ZmZlci5mbGFncyA9IHNvdXJjZV9kZXNjLT5idWZmZXIuZmxhZ3M7CisJdGFyZ2V0X2Rlc2MtPmNvbW1vbi5mbGFncyAmPSB+QU9QT0JKX1NUQVRJQ19QT0lOVEVSOworCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfZXhfc3RvcmVfc3RyaW5nX3RvX3N0cmluZworICoKKyAqIFBBUkFNRVRFUlM6ICBzb3VyY2VfZGVzYyAgICAgICAgIC0gU291cmNlIG9iamVjdCB0byBjb3B5CisgKiAgICAgICAgICAgICAgdGFyZ2V0X2Rlc2MgICAgICAgICAtIERlc3RpbmF0aW9uIG9iamVjdCBvZiB0aGUgY29weQorICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogQ29weSBhIFN0cmluZyBvYmplY3QgdG8gYW5vdGhlciBTdHJpbmcgb2JqZWN0CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworYWNwaV9zdGF0dXMKK2FjcGlfZXhfc3RvcmVfc3RyaW5nX3RvX3N0cmluZyh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpzb3VyY2VfZGVzYywKKwkJCSAgICAgICB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICp0YXJnZXRfZGVzYykKK3sKKwl1MzIgbGVuZ3RoOworCXU4ICpidWZmZXI7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUihleF9zdG9yZV9zdHJpbmdfdG9fc3RyaW5nLCBzb3VyY2VfZGVzYyk7CisKKwkvKiBXZSBrbm93IHRoYXQgc291cmNlX2Rlc2MgaXMgYSBzdHJpbmcgYnkgbm93ICovCisKKwlidWZmZXIgPSBBQ1BJX0NBU1RfUFRSKHU4LCBzb3VyY2VfZGVzYy0+c3RyaW5nLnBvaW50ZXIpOworCWxlbmd0aCA9IHNvdXJjZV9kZXNjLT5zdHJpbmcubGVuZ3RoOworCisJLyoKKwkgKiBSZXBsYWNlIGV4aXN0aW5nIHN0cmluZyB2YWx1ZSBpZiBpdCB3aWxsIGZpdCBhbmQgdGhlIHN0cmluZworCSAqIHBvaW50ZXIgaXMgbm90IGEgc3RhdGljIHBvaW50ZXIgKHBhcnQgb2YgYW4gQUNQSSB0YWJsZSkKKwkgKi8KKwlpZiAoKGxlbmd0aCA8IHRhcmdldF9kZXNjLT5zdHJpbmcubGVuZ3RoKSAmJgorCSAgICAoISh0YXJnZXRfZGVzYy0+Y29tbW9uLmZsYWdzICYgQU9QT0JKX1NUQVRJQ19QT0lOVEVSKSkpIHsKKwkJLyoKKwkJICogU3RyaW5nIHdpbGwgZml0IGluIGV4aXN0aW5nIG5vbi1zdGF0aWMgYnVmZmVyLgorCQkgKiBDbGVhciBvbGQgc3RyaW5nIGFuZCBjb3B5IGluIHRoZSBuZXcgb25lCisJCSAqLworCQlBQ1BJX01FTVNFVCh0YXJnZXRfZGVzYy0+c3RyaW5nLnBvaW50ZXIsIDAsCisJCQkgICAgKGFjcGlfc2l6ZSkgdGFyZ2V0X2Rlc2MtPnN0cmluZy5sZW5ndGggKyAxKTsKKwkJQUNQSV9NRU1DUFkodGFyZ2V0X2Rlc2MtPnN0cmluZy5wb2ludGVyLCBidWZmZXIsIGxlbmd0aCk7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogRnJlZSB0aGUgY3VycmVudCBidWZmZXIsIHRoZW4gYWxsb2NhdGUgYSBuZXcgYnVmZmVyCisJCSAqIGxhcmdlIGVub3VnaCB0byBob2xkIHRoZSB2YWx1ZQorCQkgKi8KKwkJaWYgKHRhcmdldF9kZXNjLT5zdHJpbmcucG9pbnRlciAmJgorCQkgICAgKCEodGFyZ2V0X2Rlc2MtPmNvbW1vbi5mbGFncyAmIEFPUE9CSl9TVEFUSUNfUE9JTlRFUikpKSB7CisKKwkJCS8qIE9ubHkgZnJlZSBpZiBub3QgYSBwb2ludGVyIGludG8gdGhlIERTRFQgKi8KKworCQkJQUNQSV9GUkVFKHRhcmdldF9kZXNjLT5zdHJpbmcucG9pbnRlcik7CisJCX0KKworCQl0YXJnZXRfZGVzYy0+c3RyaW5nLnBvaW50ZXIgPSBBQ1BJX0FMTE9DQVRFX1pFUk9FRCgoYWNwaV9zaXplKQorCQkJCQkJCQkgICBsZW5ndGggKyAxKTsKKwkJaWYgKCF0YXJnZXRfZGVzYy0+c3RyaW5nLnBvaW50ZXIpIHsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT19NRU1PUlkpOworCQl9CisKKwkJdGFyZ2V0X2Rlc2MtPmNvbW1vbi5mbGFncyAmPSB+QU9QT0JKX1NUQVRJQ19QT0lOVEVSOworCQlBQ1BJX01FTUNQWSh0YXJnZXRfZGVzYy0+c3RyaW5nLnBvaW50ZXIsIGJ1ZmZlciwgbGVuZ3RoKTsKKwl9CisKKwkvKiBTZXQgdGhlIG5ldyB0YXJnZXQgbGVuZ3RoICovCisKKwl0YXJnZXRfZGVzYy0+c3RyaW5nLmxlbmd0aCA9IGxlbmd0aDsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS9leHN5c3RlbS5jIGIvZHJpdmVycy9hY3BpL2FjcGljYS9leHN5c3RlbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkMDBiOTMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2V4c3lzdGVtLmMKQEAgLTAsMCArMSwzMDMgQEAKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIE1vZHVsZSBOYW1lOiBleHN5c3RlbSAtIEludGVyZmFjZSB0byBPUyBzZXJ2aWNlcworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDgsIEludGVsIENvcnAuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCisgKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSBhdCBtaW5pbXVtIGEgZGlzY2xhaW1lcgorICogICAgc3Vic3RhbnRpYWxseSBzaW1pbGFyIHRvIHRoZSAiTk8gV0FSUkFOVFkiIGRpc2NsYWltZXIgYmVsb3cKKyAqICAgICgiRGlzY2xhaW1lciIpIGFuZCBhbnkgcmVkaXN0cmlidXRpb24gbXVzdCBiZSBjb25kaXRpb25lZCB1cG9uCisgKiAgICBpbmNsdWRpbmcgYSBzdWJzdGFudGlhbGx5IHNpbWlsYXIgRGlzY2xhaW1lciByZXF1aXJlbWVudCBmb3IgZnVydGhlcgorICogICAgYmluYXJ5IHJlZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzCisgKiAgICBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIE5PIFdBUlJBTlRZCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORworICogSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCisgKi8KKworI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgorI2luY2x1ZGUgImFjY29tbW9uLmgiCisjaW5jbHVkZSAiYWNpbnRlcnAuaCIKKworI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfRVhFQ1VURVIKK0FDUElfTU9EVUxFX05BTUUoImV4c3lzdGVtIikKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9leF9zeXN0ZW1fd2FpdF9zZW1hcGhvcmUKKyAqCisgKiBQQVJBTUVURVJTOiAgU2VtYXBob3JlICAgICAgIC0gU2VtYXBob3JlIHRvIHdhaXQgb24KKyAqICAgICAgICAgICAgICBUaW1lb3V0ICAgICAgICAgLSBNYXggdGltZSB0byB3YWl0CisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBJbXBsZW1lbnRzIGEgc2VtYXBob3JlIHdhaXQgd2l0aCBhIGNoZWNrIHRvIHNlZSBpZiB0aGUKKyAqICAgICAgICAgICAgICBzZW1hcGhvcmUgaXMgYXZhaWxhYmxlIGltbWVkaWF0ZWx5LiAgSWYgaXQgaXMgbm90LCB0aGUKKyAqICAgICAgICAgICAgICBpbnRlcnByZXRlciBpcyByZWxlYXNlZCBiZWZvcmUgd2FpdGluZy4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYWNwaV9zdGF0dXMgYWNwaV9leF9zeXN0ZW1fd2FpdF9zZW1hcGhvcmUoYWNwaV9zZW1hcGhvcmUgc2VtYXBob3JlLCB1MTYgdGltZW91dCkKK3sKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGV4X3N5c3RlbV93YWl0X3NlbWFwaG9yZSk7CisKKwlzdGF0dXMgPSBhY3BpX29zX3dhaXRfc2VtYXBob3JlKHNlbWFwaG9yZSwgMSwgQUNQSV9ET19OT1RfV0FJVCk7CisJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworCX0KKworCWlmIChzdGF0dXMgPT0gQUVfVElNRSkgeworCisJCS8qIFdlIG11c3Qgd2FpdCwgc28gdW5sb2NrIHRoZSBpbnRlcnByZXRlciAqLworCisJCWFjcGlfZXhfcmVsaW5xdWlzaF9pbnRlcnByZXRlcigpOworCisJCXN0YXR1cyA9IGFjcGlfb3Nfd2FpdF9zZW1hcGhvcmUoc2VtYXBob3JlLCAxLCB0aW1lb3V0KTsKKworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VYRUMsCisJCQkJICAiKioqIFRocmVhZCBhd2FrZSBhZnRlciBibG9ja2luZywgJXNcbiIsCisJCQkJICBhY3BpX2Zvcm1hdF9leGNlcHRpb24oc3RhdHVzKSkpOworCisJCS8qIFJlYWNxdWlyZSB0aGUgaW50ZXJwcmV0ZXIgKi8KKworCQlhY3BpX2V4X3JlYWNxdWlyZV9pbnRlcnByZXRlcigpOworCX0KKworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X3N5c3RlbV93YWl0X211dGV4CisgKgorICogUEFSQU1FVEVSUzogIE11dGV4ICAgICAgICAgICAtIE11dGV4IHRvIHdhaXQgb24KKyAqICAgICAgICAgICAgICBUaW1lb3V0ICAgICAgICAgLSBNYXggdGltZSB0byB3YWl0CisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBJbXBsZW1lbnRzIGEgbXV0ZXggd2FpdCB3aXRoIGEgY2hlY2sgdG8gc2VlIGlmIHRoZQorICogICAgICAgICAgICAgIG11dGV4IGlzIGF2YWlsYWJsZSBpbW1lZGlhdGVseS4gIElmIGl0IGlzIG5vdCwgdGhlCisgKiAgICAgICAgICAgICAgaW50ZXJwcmV0ZXIgaXMgcmVsZWFzZWQgYmVmb3JlIHdhaXRpbmcuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworYWNwaV9zdGF0dXMgYWNwaV9leF9zeXN0ZW1fd2FpdF9tdXRleChhY3BpX211dGV4IG11dGV4LCB1MTYgdGltZW91dCkKK3sKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGV4X3N5c3RlbV93YWl0X211dGV4KTsKKworCXN0YXR1cyA9IGFjcGlfb3NfYWNxdWlyZV9tdXRleChtdXRleCwgQUNQSV9ET19OT1RfV0FJVCk7CisJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworCX0KKworCWlmIChzdGF0dXMgPT0gQUVfVElNRSkgeworCisJCS8qIFdlIG11c3Qgd2FpdCwgc28gdW5sb2NrIHRoZSBpbnRlcnByZXRlciAqLworCisJCWFjcGlfZXhfcmVsaW5xdWlzaF9pbnRlcnByZXRlcigpOworCisJCXN0YXR1cyA9IGFjcGlfb3NfYWNxdWlyZV9tdXRleChtdXRleCwgdGltZW91dCk7CisKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FWEVDLAorCQkJCSAgIioqKiBUaHJlYWQgYXdha2UgYWZ0ZXIgYmxvY2tpbmcsICVzXG4iLAorCQkJCSAgYWNwaV9mb3JtYXRfZXhjZXB0aW9uKHN0YXR1cykpKTsKKworCQkvKiBSZWFjcXVpcmUgdGhlIGludGVycHJldGVyICovCisKKwkJYWNwaV9leF9yZWFjcXVpcmVfaW50ZXJwcmV0ZXIoKTsKKwl9CisKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9leF9zeXN0ZW1fZG9fc3RhbGwKKyAqCisgKiBQQVJBTUVURVJTOiAgaG93X2xvbmcgICAgICAgIC0gVGhlIGFtb3VudCBvZiB0aW1lIHRvIHN0YWxsLAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIG1pY3Jvc2Vjb25kcworICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogU3VzcGVuZCBydW5uaW5nIHRocmVhZCBmb3Igc3BlY2lmaWVkIGFtb3VudCBvZiB0aW1lLgorICogICAgICAgICAgICAgIE5vdGU6IEFDUEkgc3BlY2lmaWNhdGlvbiByZXF1aXJlcyB0aGF0IFN0YWxsKCkgZG9lcyBub3QKKyAqICAgICAgICAgICAgICByZWxpbnF1aXNoIHRoZSBwcm9jZXNzb3IsIGFuZCBkZWxheXMgbG9uZ2VyIHRoYW4gMTAwIHVzZWMKKyAqICAgICAgICAgICAgICBzaG91bGQgdXNlIFNsZWVwKCkgaW5zdGVhZC4gIFdlIGFsbG93IHN0YWxscyB1cCB0byAyNTUgdXNlYworICogICAgICAgICAgICAgIGZvciBjb21wYXRpYmlsaXR5IHdpdGggb3RoZXIgaW50ZXJwcmV0ZXJzIGFuZCBleGlzdGluZyBCSU9Tcy4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCithY3BpX3N0YXR1cyBhY3BpX2V4X3N5c3RlbV9kb19zdGFsbCh1MzIgaG93X2xvbmcpCit7CisJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CisKKwlBQ1BJX0ZVTkNUSU9OX0VOVFJZKCk7CisKKwlpZiAoaG93X2xvbmcgPiAyNTUpIHsJLyogMjU1IG1pY3Jvc2Vjb25kcyAqLworCQkvKgorCQkgKiBMb25nZXIgdGhhbiAyNTUgdXNlYywgdGhpcyBpcyBhbiBlcnJvcgorCQkgKgorCQkgKiAoQUNQSSBzcGVjaWZpZXMgMTAwIHVzZWMgYXMgbWF4LCBidXQgdGhpcyBnaXZlcyBzb21lIHNsYWNrIGluCisJCSAqIG9yZGVyIHRvIHN1cHBvcnQgZXhpc3RpbmcgQklPU3MpCisJCSAqLworCQlBQ1BJX0VSUk9SKChBRV9JTkZPLCAiVGltZSBwYXJhbWV0ZXIgaXMgdG9vIGxhcmdlICglZCkiLAorCQkJICAgIGhvd19sb25nKSk7CisJCXN0YXR1cyA9IEFFX0FNTF9PUEVSQU5EX1ZBTFVFOworCX0gZWxzZSB7CisJCWFjcGlfb3Nfc3RhbGwoaG93X2xvbmcpOworCX0KKworCXJldHVybiAoc3RhdHVzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9leF9zeXN0ZW1fZG9fc3VzcGVuZAorICoKKyAqIFBBUkFNRVRFUlM6ICBob3dfbG9uZyAgICAgICAgLSBUaGUgYW1vdW50IG9mIHRpbWUgdG8gc3VzcGVuZCwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBtaWxsaXNlY29uZHMKKyAqCisgKiBSRVRVUk46ICAgICAgTm9uZQorICoKKyAqIERFU0NSSVBUSU9OOiBTdXNwZW5kIHJ1bm5pbmcgdGhyZWFkIGZvciBzcGVjaWZpZWQgYW1vdW50IG9mIHRpbWUuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworYWNwaV9zdGF0dXMgYWNwaV9leF9zeXN0ZW1fZG9fc3VzcGVuZChhY3BpX2ludGVnZXIgaG93X2xvbmcpCit7CisJQUNQSV9GVU5DVElPTl9FTlRSWSgpOworCisJLyogU2luY2UgdGhpcyB0aHJlYWQgd2lsbCBzbGVlcCwgd2UgbXVzdCByZWxlYXNlIHRoZSBpbnRlcnByZXRlciAqLworCisJYWNwaV9leF9yZWxpbnF1aXNoX2ludGVycHJldGVyKCk7CisKKwlhY3BpX29zX3NsZWVwKGhvd19sb25nKTsKKworCS8qIEFuZCBub3cgd2UgbXVzdCBnZXQgdGhlIGludGVycHJldGVyIGFnYWluICovCisKKwlhY3BpX2V4X3JlYWNxdWlyZV9pbnRlcnByZXRlcigpOworCXJldHVybiAoQUVfT0spOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X3N5c3RlbV9zaWduYWxfZXZlbnQKKyAqCisgKiBQQVJBTUVURVJTOiAgb2JqX2Rlc2MgICAgICAgIC0gVGhlIG9iamVjdCBkZXNjcmlwdG9yIGZvciB0aGlzIG9wCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBQcm92aWRlcyBhbiBhY2Nlc3MgcG9pbnQgdG8gcGVyZm9ybSBzeW5jaHJvbml6YXRpb24gb3BlcmF0aW9ucworICogICAgICAgICAgICAgIHdpdGhpbiB0aGUgQU1MLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2FjcGlfc3RhdHVzIGFjcGlfZXhfc3lzdGVtX3NpZ25hbF9ldmVudCh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICogb2JqX2Rlc2MpCit7CisJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGV4X3N5c3RlbV9zaWduYWxfZXZlbnQpOworCisJaWYgKG9ial9kZXNjKSB7CisJCXN0YXR1cyA9CisJCSAgICBhY3BpX29zX3NpZ25hbF9zZW1hcGhvcmUob2JqX2Rlc2MtPmV2ZW50Lm9zX3NlbWFwaG9yZSwgMSk7CisJfQorCisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfZXhfc3lzdGVtX3dhaXRfZXZlbnQKKyAqCisgKiBQQVJBTUVURVJTOiAgdGltZV9kZXNjICAgICAgIC0gVGhlICd0aW1lIHRvIGRlbGF5JyBvYmplY3QgZGVzY3JpcHRvcgorICogICAgICAgICAgICAgIG9ial9kZXNjICAgICAgICAtIFRoZSBvYmplY3QgZGVzY3JpcHRvciBmb3IgdGhpcyBvcAorICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogUHJvdmlkZXMgYW4gYWNjZXNzIHBvaW50IHRvIHBlcmZvcm0gc3luY2hyb25pemF0aW9uIG9wZXJhdGlvbnMKKyAqICAgICAgICAgICAgICB3aXRoaW4gdGhlIEFNTC4gIFRoaXMgb3BlcmF0aW9uIGlzIGEgcmVxdWVzdCB0byB3YWl0IGZvciBhbgorICogICAgICAgICAgICAgIGV2ZW50LgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2FjcGlfc3RhdHVzCithY3BpX2V4X3N5c3RlbV93YWl0X2V2ZW50KHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnRpbWVfZGVzYywKKwkJCSAgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2MpCit7CisJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGV4X3N5c3RlbV93YWl0X2V2ZW50KTsKKworCWlmIChvYmpfZGVzYykgeworCQlzdGF0dXMgPQorCQkgICAgYWNwaV9leF9zeXN0ZW1fd2FpdF9zZW1hcGhvcmUob2JqX2Rlc2MtPmV2ZW50Lm9zX3NlbWFwaG9yZSwKKwkJCQkJCSAgKHUxNikgdGltZV9kZXNjLT5pbnRlZ2VyLgorCQkJCQkJICB2YWx1ZSk7CisJfQorCisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfZXhfc3lzdGVtX3Jlc2V0X2V2ZW50CisgKgorICogUEFSQU1FVEVSUzogIG9ial9kZXNjICAgICAgICAtIFRoZSBvYmplY3QgZGVzY3JpcHRvciBmb3IgdGhpcyBvcAorICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogUmVzZXQgYW4gZXZlbnQgdG8gYSBrbm93biBzdGF0ZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCithY3BpX3N0YXR1cyBhY3BpX2V4X3N5c3RlbV9yZXNldF9ldmVudCh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYykKK3sKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKKwlhY3BpX3NlbWFwaG9yZSB0ZW1wX3NlbWFwaG9yZTsKKworCUFDUElfRlVOQ1RJT05fRU5UUlkoKTsKKworCS8qCisJICogV2UgYXJlIGdvaW5nIHRvIHNpbXBseSBkZWxldGUgdGhlIGV4aXN0aW5nIHNlbWFwaG9yZSBhbmQKKwkgKiBjcmVhdGUgYSBuZXcgb25lIQorCSAqLworCXN0YXR1cyA9CisJICAgIGFjcGlfb3NfY3JlYXRlX3NlbWFwaG9yZShBQ1BJX05PX1VOSVRfTElNSVQsIDAsICZ0ZW1wX3NlbWFwaG9yZSk7CisJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCSh2b2lkKWFjcGlfb3NfZGVsZXRlX3NlbWFwaG9yZShvYmpfZGVzYy0+ZXZlbnQub3Nfc2VtYXBob3JlKTsKKwkJb2JqX2Rlc2MtPmV2ZW50Lm9zX3NlbWFwaG9yZSA9IHRlbXBfc2VtYXBob3JlOworCX0KKworCXJldHVybiAoc3RhdHVzKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXh1dGlscy5jIGIvZHJpdmVycy9hY3BpL2FjcGljYS9leHV0aWxzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzJiODVkNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXh1dGlscy5jCkBAIC0wLDAgKzEsNDIxIEBACisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBNb2R1bGUgTmFtZTogZXh1dGlscyAtIGludGVycHJldGVyL3NjYW5uZXIgdXRpbGl0aWVzCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwOCwgSW50ZWwgQ29ycC4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKKyAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIGF0IG1pbmltdW0gYSBkaXNjbGFpbWVyCisgKiAgICBzdWJzdGFudGlhbGx5IHNpbWlsYXIgdG8gdGhlICJOTyBXQVJSQU5UWSIgZGlzY2xhaW1lciBiZWxvdworICogICAgKCJEaXNjbGFpbWVyIikgYW5kIGFueSByZWRpc3RyaWJ1dGlvbiBtdXN0IGJlIGNvbmRpdGlvbmVkIHVwb24KKyAqICAgIGluY2x1ZGluZyBhIHN1YnN0YW50aWFsbHkgc2ltaWxhciBEaXNjbGFpbWVyIHJlcXVpcmVtZW50IGZvciBmdXJ0aGVyCisgKiAgICBiaW5hcnkgcmVkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMKKyAqICAgIG9mIGFueSBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogTk8gV0FSUkFOVFkKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HCisgKiBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KKyAqLworCisvKgorICogREVGSU5FX0FNTF9HTE9CQUxTIGlzIHRlc3RlZCBpbiBhbWxjb2RlLmgKKyAqIHRvIGRldGVybWluZSB3aGV0aGVyIGNlcnRhaW4gZ2xvYmFsIG5hbWVzIHNob3VsZCBiZSAiZGVmaW5lZCIgb3Igb25seQorICogImRlY2xhcmVkIiBpbiB0aGUgY3VycmVudCBjb21waWxhdGlvbi4gIFRoaXMgZW5oYW5jZXMgbWFpbnRhaW5hYmlsaXR5CisgKiBieSBlbmFibGluZyBhIHNpbmdsZSBoZWFkZXIgZmlsZSB0byBlbWJvZHkgYWxsIGtub3dsZWRnZSBvZiB0aGUgbmFtZXMKKyAqIGluIHF1ZXN0aW9uLgorICoKKyAqIEV4YWN0bHkgb25lIG1vZHVsZSBvZiBhbnkgZXhlY3V0YWJsZSBzaG91bGQgI2RlZmluZSBERUZJTkVfR0xPQkFMUworICogYmVmb3JlICNpbmNsdWRpbmcgdGhlIGhlYWRlciBmaWxlcyB3aGljaCB1c2UgdGhpcyBjb252ZW50aW9uLiAgVGhlCisgKiBuYW1lcyBpbiBxdWVzdGlvbiB3aWxsIGJlIGRlZmluZWQgYW5kIGluaXRpYWxpemVkIGluIHRoYXQgbW9kdWxlLAorICogYW5kIGRlY2xhcmVkIGFzIGV4dGVybiBpbiBhbGwgb3RoZXIgbW9kdWxlcyB3aGljaCAjaW5jbHVkZSB0aG9zZQorICogaGVhZGVyIGZpbGVzLgorICovCisKKyNkZWZpbmUgREVGSU5FX0FNTF9HTE9CQUxTCisKKyNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KKyNpbmNsdWRlICJhY2NvbW1vbi5oIgorI2luY2x1ZGUgImFjaW50ZXJwLmgiCisjaW5jbHVkZSAiYW1sY29kZS5oIgorCisjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9FWEVDVVRFUgorQUNQSV9NT0RVTEVfTkFNRSgiZXh1dGlscyIpCisKKy8qIExvY2FsIHByb3RvdHlwZXMgKi8KK3N0YXRpYyB1MzIgYWNwaV9leF9kaWdpdHNfbmVlZGVkKGFjcGlfaW50ZWdlciB2YWx1ZSwgdTMyIGJhc2UpOworCisjaWZuZGVmIEFDUElfTk9fTUVUSE9EX0VYRUNVVElPTgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9leF9lbnRlcl9pbnRlcnByZXRlcgorICoKKyAqIFBBUkFNRVRFUlM6ICBOb25lCisgKgorICogUkVUVVJOOiAgICAgIE5vbmUKKyAqCisgKiBERVNDUklQVElPTjogRW50ZXIgdGhlIGludGVycHJldGVyIGV4ZWN1dGlvbiByZWdpb24uIEZhaWx1cmUgdG8gZW50ZXIKKyAqICAgICAgICAgICAgICB0aGUgaW50ZXJwcmV0ZXIgcmVnaW9uIGlzIGEgZmF0YWwgc3lzdGVtIGVycm9yLiBVc2VkIGluCisgKiAgICAgICAgICAgICAgY29uanVuY3Rpb24gd2l0aCBleGl0X2ludGVycHJldGVyLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgYWNwaV9leF9lbnRlcl9pbnRlcnByZXRlcih2b2lkKQoreworCWFjcGlfc3RhdHVzIHN0YXR1czsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0UoZXhfZW50ZXJfaW50ZXJwcmV0ZXIpOworCisJc3RhdHVzID0gYWNwaV91dF9hY3F1aXJlX211dGV4KEFDUElfTVRYX0lOVEVSUFJFVEVSKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJQUNQSV9FUlJPUigoQUVfSU5GTywKKwkJCSAgICAiQ291bGQgbm90IGFjcXVpcmUgQU1MIEludGVycHJldGVyIG11dGV4IikpOworCX0KKworCXJldHVybl9WT0lEOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X3JlYWNxdWlyZV9pbnRlcnByZXRlcgorICoKKyAqIFBBUkFNRVRFUlM6ICBOb25lCisgKgorICogUkVUVVJOOiAgICAgIE5vbmUKKyAqCisgKiBERVNDUklQVElPTjogUmVhY3F1aXJlIHRoZSBpbnRlcnByZXRlciBleGVjdXRpb24gcmVnaW9uIGZyb20gd2l0aGluIHRoZQorICogICAgICAgICAgICAgIGludGVycHJldGVyIGNvZGUuIEZhaWx1cmUgdG8gZW50ZXIgdGhlIGludGVycHJldGVyIHJlZ2lvbiBpcyBhCisgKiAgICAgICAgICAgICAgZmF0YWwgc3lzdGVtIGVycm9yLiBVc2VkIGluICBjb25qdWN0aW9uIHdpdGgKKyAqICAgICAgICAgICAgICByZWxpbnF1aXNoX2ludGVycHJldGVyCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBhY3BpX2V4X3JlYWNxdWlyZV9pbnRlcnByZXRlcih2b2lkKQoreworCUFDUElfRlVOQ1RJT05fVFJBQ0UoZXhfcmVhY3F1aXJlX2ludGVycHJldGVyKTsKKworCS8qCisJICogSWYgdGhlIGdsb2JhbCBzZXJpYWxpemVkIGZsYWcgaXMgc2V0LCBkbyBub3QgcmVsZWFzZSB0aGUgaW50ZXJwcmV0ZXIsCisJICogc2luY2UgaXQgd2FzIG5vdCBhY3R1YWxseSByZWxlYXNlZCBieSBhY3BpX2V4X3JlbGlucXVpc2hfaW50ZXJwcmV0ZXIuCisJICogVGhpcyBmb3JjZXMgdGhlIGludGVycHJldGVyIHRvIGJlIHNpbmdsZSB0aHJlYWRlZC4KKwkgKi8KKwlpZiAoIWFjcGlfZ2JsX2FsbF9tZXRob2RzX3NlcmlhbGl6ZWQpIHsKKwkJYWNwaV9leF9lbnRlcl9pbnRlcnByZXRlcigpOworCX0KKworCXJldHVybl9WT0lEOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X2V4aXRfaW50ZXJwcmV0ZXIKKyAqCisgKiBQQVJBTUVURVJTOiAgTm9uZQorICoKKyAqIFJFVFVSTjogICAgICBOb25lCisgKgorICogREVTQ1JJUFRJT046IEV4aXQgdGhlIGludGVycHJldGVyIGV4ZWN1dGlvbiByZWdpb24uIFRoaXMgaXMgdGhlIHRvcCBsZXZlbAorICogICAgICAgICAgICAgIHJvdXRpbmUgdXNlZCB0byBleGl0IHRoZSBpbnRlcnByZXRlciB3aGVuIGFsbCBwcm9jZXNzaW5nIGhhcworICogICAgICAgICAgICAgIGJlZW4gY29tcGxldGVkLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgYWNwaV9leF9leGl0X2ludGVycHJldGVyKHZvaWQpCit7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCisJQUNQSV9GVU5DVElPTl9UUkFDRShleF9leGl0X2ludGVycHJldGVyKTsKKworCXN0YXR1cyA9IGFjcGlfdXRfcmVsZWFzZV9tdXRleChBQ1BJX01UWF9JTlRFUlBSRVRFUik7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCUFDUElfRVJST1IoKEFFX0lORk8sCisJCQkgICAgIkNvdWxkIG5vdCByZWxlYXNlIEFNTCBJbnRlcnByZXRlciBtdXRleCIpKTsKKwl9CisKKwlyZXR1cm5fVk9JRDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9leF9yZWxpbnF1aXNoX2ludGVycHJldGVyCisgKgorICogUEFSQU1FVEVSUzogIE5vbmUKKyAqCisgKiBSRVRVUk46ICAgICAgTm9uZQorICoKKyAqIERFU0NSSVBUSU9OOiBFeGl0IHRoZSBpbnRlcnByZXRlciBleGVjdXRpb24gcmVnaW9uLCBmcm9tIHdpdGhpbiB0aGUKKyAqICAgICAgICAgICAgICBpbnRlcnByZXRlciAtIGJlZm9yZSBhdHRlbXB0aW5nIGFuIG9wZXJhdGlvbiB0aGF0IHdpbGwgcG9zc2libHkKKyAqICAgICAgICAgICAgICBibG9jayB0aGUgcnVubmluZyB0aHJlYWQuCisgKgorICogQ2FzZXMgd2hlcmUgdGhlIGludGVycHJldGVyIGlzIHVubG9ja2VkIGludGVybmFsbHkKKyAqICAgICAgMSkgTWV0aG9kIHRvIGJlIGJsb2NrZWQgb24gYSBTbGVlcCgpIEFNTCBvcGNvZGUKKyAqICAgICAgMikgTWV0aG9kIHRvIGJlIGJsb2NrZWQgb24gYW4gQWNxdWlyZSgpIEFNTCBvcGNvZGUKKyAqICAgICAgMykgTWV0aG9kIHRvIGJlIGJsb2NrZWQgb24gYSBXYWl0KCkgQU1MIG9wY29kZQorICogICAgICA0KSBNZXRob2QgdG8gYmUgYmxvY2tlZCB0byBhY3F1aXJlIHRoZSBnbG9iYWwgbG9jaworICogICAgICA1KSBNZXRob2QgdG8gYmUgYmxvY2tlZCB3YWl0aW5nIHRvIGV4ZWN1dGUgYSBzZXJpYWxpemVkIGNvbnRyb2wgbWV0aG9kCisgKiAgICAgICAgICB0aGF0IGlzIGN1cnJlbnRseSBleGVjdXRpbmcKKyAqICAgICAgNikgQWJvdXQgdG8gaW52b2tlIGEgdXNlci1pbnN0YWxsZWQgb3ByZWdpb24gaGFuZGxlcgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgYWNwaV9leF9yZWxpbnF1aXNoX2ludGVycHJldGVyKHZvaWQpCit7CisJQUNQSV9GVU5DVElPTl9UUkFDRShleF9yZWxpbnF1aXNoX2ludGVycHJldGVyKTsKKworCS8qCisJICogSWYgdGhlIGdsb2JhbCBzZXJpYWxpemVkIGZsYWcgaXMgc2V0LCBkbyBub3QgcmVsZWFzZSB0aGUgaW50ZXJwcmV0ZXIuCisJICogVGhpcyBmb3JjZXMgdGhlIGludGVycHJldGVyIHRvIGJlIHNpbmdsZSB0aHJlYWRlZC4KKwkgKi8KKwlpZiAoIWFjcGlfZ2JsX2FsbF9tZXRob2RzX3NlcmlhbGl6ZWQpIHsKKwkJYWNwaV9leF9leGl0X2ludGVycHJldGVyKCk7CisJfQorCisJcmV0dXJuX1ZPSUQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfZXhfdHJ1bmNhdGVfZm9yMzJiaXRfdGFibGUKKyAqCisgKiBQQVJBTUVURVJTOiAgb2JqX2Rlc2MgICAgICAgIC0gT2JqZWN0IHRvIGJlIHRydW5jYXRlZAorICoKKyAqIFJFVFVSTjogICAgICBub25lCisgKgorICogREVTQ1JJUFRJT046IFRydW5jYXRlIGFuIEFDUEkgSW50ZWdlciB0byAzMiBiaXRzIGlmIHRoZSBleGVjdXRpb24gbW9kZSBpcworICogICAgICAgICAgICAgIDMyLWJpdCwgYXMgZGV0ZXJtaW5lZCBieSB0aGUgcmV2aXNpb24gb2YgdGhlIERTRFQuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBhY3BpX2V4X3RydW5jYXRlX2ZvcjMyYml0X3RhYmxlKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjKQoreworCisJQUNQSV9GVU5DVElPTl9FTlRSWSgpOworCisJLyoKKwkgKiBPYmplY3QgbXVzdCBiZSBhIHZhbGlkIG51bWJlciBhbmQgd2UgbXVzdCBiZSBleGVjdXRpbmcKKwkgKiBhIGNvbnRyb2wgbWV0aG9kLiBOUyBub2RlIGNvdWxkIGJlIHRoZXJlIGZvciBBTUxfSU5UX05BTUVQQVRIX09QLgorCSAqLworCWlmICgoIW9ial9kZXNjKSB8fAorCSAgICAoQUNQSV9HRVRfREVTQ1JJUFRPUl9UWVBFKG9ial9kZXNjKSAhPSBBQ1BJX0RFU0NfVFlQRV9PUEVSQU5EKSB8fAorCSAgICAoQUNQSV9HRVRfT0JKRUNUX1RZUEUob2JqX2Rlc2MpICE9IEFDUElfVFlQRV9JTlRFR0VSKSkgeworCQlyZXR1cm47CisJfQorCisJaWYgKGFjcGlfZ2JsX2ludGVnZXJfYnl0ZV93aWR0aCA9PSA0KSB7CisJCS8qCisJCSAqIFdlIGFyZSBydW5uaW5nIGEgbWV0aG9kIHRoYXQgZXhpc3RzIGluIGEgMzItYml0IEFDUEkgdGFibGUuCisJCSAqIFRydW5jYXRlIHRoZSB2YWx1ZSB0byAzMiBiaXRzIGJ5IHplcm9pbmcgb3V0IHRoZSB1cHBlciAzMi1iaXQgZmllbGQKKwkJICovCisJCW9ial9kZXNjLT5pbnRlZ2VyLnZhbHVlICY9IChhY3BpX2ludGVnZXIpIEFDUElfVUlOVDMyX01BWDsKKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfZXhfYWNxdWlyZV9nbG9iYWxfbG9jaworICoKKyAqIFBBUkFNRVRFUlM6ICBmaWVsZF9mbGFncyAgICAgICAgICAgLSBGbGFncyB3aXRoIExvY2sgcnVsZToKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHdheXNfbG9jayBvciBuZXZlcl9sb2NrCisgKgorICogUkVUVVJOOiAgICAgIE5vbmUKKyAqCisgKiBERVNDUklQVElPTjogT2J0YWluIHRoZSBBQ1BJIGhhcmR3YXJlIEdsb2JhbCBMb2NrLCBvbmx5IGlmIHRoZSBmaWVsZAorICogICAgICAgICAgICAgIGZsYWdzIHNwZWNpZml5IHRoYXQgaXQgaXMgdG8gYmUgb2J0YWluZWQgYmVmb3JlIGZpZWxkIGFjY2Vzcy4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIGFjcGlfZXhfYWNxdWlyZV9nbG9iYWxfbG9jayh1MzIgZmllbGRfZmxhZ3MpCit7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCisJQUNQSV9GVU5DVElPTl9UUkFDRShleF9hY3F1aXJlX2dsb2JhbF9sb2NrKTsKKworCS8qIE9ubHkgdXNlIHRoZSBsb2NrIGlmIHRoZSBhbHdheXNfbG9jayBiaXQgaXMgc2V0ICovCisKKwlpZiAoIShmaWVsZF9mbGFncyAmIEFNTF9GSUVMRF9MT0NLX1JVTEVfTUFTSykpIHsKKwkJcmV0dXJuX1ZPSUQ7CisJfQorCisJLyogQXR0ZW1wdCB0byBnZXQgdGhlIGdsb2JhbCBsb2NrLCB3YWl0IGZvcmV2ZXIgKi8KKworCXN0YXR1cyA9IGFjcGlfZXhfYWNxdWlyZV9tdXRleF9vYmplY3QoQUNQSV9XQUlUX0ZPUkVWRVIsCisJCQkJCSAgICAgIGFjcGlfZ2JsX2dsb2JhbF9sb2NrX211dGV4LAorCQkJCQkgICAgICBhY3BpX29zX2dldF90aHJlYWRfaWQoKSk7CisKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJQUNQSV9FWENFUFRJT04oKEFFX0lORk8sIHN0YXR1cywKKwkJCQkiQ291bGQgbm90IGFjcXVpcmUgR2xvYmFsIExvY2siKSk7CisJfQorCisJcmV0dXJuX1ZPSUQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfZXhfcmVsZWFzZV9nbG9iYWxfbG9jaworICoKKyAqIFBBUkFNRVRFUlM6ICBmaWVsZF9mbGFncyAgICAgICAgICAgLSBGbGFncyB3aXRoIExvY2sgcnVsZToKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHdheXNfbG9jayBvciBuZXZlcl9sb2NrCisgKgorICogUkVUVVJOOiAgICAgIE5vbmUKKyAqCisgKiBERVNDUklQVElPTjogUmVsZWFzZSB0aGUgQUNQSSBoYXJkd2FyZSBHbG9iYWwgTG9jaworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgYWNwaV9leF9yZWxlYXNlX2dsb2JhbF9sb2NrKHUzMiBmaWVsZF9mbGFncykKK3sKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGV4X3JlbGVhc2VfZ2xvYmFsX2xvY2spOworCisJLyogT25seSB1c2UgdGhlIGxvY2sgaWYgdGhlIGFsd2F5c19sb2NrIGJpdCBpcyBzZXQgKi8KKworCWlmICghKGZpZWxkX2ZsYWdzICYgQU1MX0ZJRUxEX0xPQ0tfUlVMRV9NQVNLKSkgeworCQlyZXR1cm5fVk9JRDsKKwl9CisKKwkvKiBSZWxlYXNlIHRoZSBnbG9iYWwgbG9jayAqLworCisJc3RhdHVzID0gYWNwaV9leF9yZWxlYXNlX211dGV4X29iamVjdChhY3BpX2dibF9nbG9iYWxfbG9ja19tdXRleCk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisKKwkJLyogUmVwb3J0IHRoZSBlcnJvciwgYnV0IHRoZXJlIGlzbid0IG11Y2ggZWxzZSB3ZSBjYW4gZG8gKi8KKworCQlBQ1BJX0VYQ0VQVElPTigoQUVfSU5GTywgc3RhdHVzLAorCQkJCSJDb3VsZCBub3QgcmVsZWFzZSBHbG9iYWwgTG9jayIpKTsKKwl9CisKKwlyZXR1cm5fVk9JRDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9leF9kaWdpdHNfbmVlZGVkCisgKgorICogUEFSQU1FVEVSUzogIFZhbHVlICAgICAgICAgICAtIFZhbHVlIHRvIGJlIHJlcHJlc2VudGVkCisgKiAgICAgICAgICAgICAgQmFzZSAgICAgICAgICAgIC0gQmFzZSBvZiByZXByZXNlbnRhdGlvbgorICoKKyAqIFJFVFVSTjogICAgICBUaGUgbnVtYmVyIG9mIGRpZ2l0cy4KKyAqCisgKiBERVNDUklQVElPTjogQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgZGlnaXRzIG5lZWRlZCB0byByZXByZXNlbnQgdGhlIFZhbHVlCisgKiAgICAgICAgICAgICAgaW4gdGhlIGdpdmVuIEJhc2UgKFJhZGl4KQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB1MzIgYWNwaV9leF9kaWdpdHNfbmVlZGVkKGFjcGlfaW50ZWdlciB2YWx1ZSwgdTMyIGJhc2UpCit7CisJdTMyIG51bV9kaWdpdHM7CisJYWNwaV9pbnRlZ2VyIGN1cnJlbnRfdmFsdWU7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGV4X2RpZ2l0c19uZWVkZWQpOworCisJLyogYWNwaV9pbnRlZ2VyIGlzIHVuc2lnbmVkLCBzbyB3ZSBkb24ndCB3b3JyeSBhYm91dCBhICctJyBwcmVmaXggKi8KKworCWlmICh2YWx1ZSA9PSAwKSB7CisJCXJldHVybl9VSU5UMzIoMSk7CisJfQorCisJY3VycmVudF92YWx1ZSA9IHZhbHVlOworCW51bV9kaWdpdHMgPSAwOworCisJLyogQ291bnQgdGhlIGRpZ2l0cyBpbiB0aGUgcmVxdWVzdGVkIGJhc2UgKi8KKworCXdoaWxlIChjdXJyZW50X3ZhbHVlKSB7CisJCSh2b2lkKWFjcGlfdXRfc2hvcnRfZGl2aWRlKGN1cnJlbnRfdmFsdWUsIGJhc2UsICZjdXJyZW50X3ZhbHVlLAorCQkJCQkgICBOVUxMKTsKKwkJbnVtX2RpZ2l0cysrOworCX0KKworCXJldHVybl9VSU5UMzIobnVtX2RpZ2l0cyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfZXhfZWlzYV9pZF90b19zdHJpbmcKKyAqCisgKiBQQVJBTUVURVJTOiAgbnVtZXJpY19pZCAgICAgIC0gRUlTQSBJRCB0byBiZSBjb252ZXJ0ZWQKKyAqICAgICAgICAgICAgICBvdXRfc3RyaW5nICAgICAgLSBXaGVyZSB0byBwdXQgdGhlIGNvbnZlcnRlZCBzdHJpbmcgKDggYnl0ZXMpCisgKgorICogUkVUVVJOOiAgICAgIE5vbmUKKyAqCisgKiBERVNDUklQVElPTjogQ29udmVydCBhIG51bWVyaWMgRUlTQSBJRCB0byBzdHJpbmcgcmVwcmVzZW50YXRpb24KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIGFjcGlfZXhfZWlzYV9pZF90b19zdHJpbmcodTMyIG51bWVyaWNfaWQsIGNoYXIgKm91dF9zdHJpbmcpCit7CisJdTMyIGVpc2FfaWQ7CisKKwlBQ1BJX0ZVTkNUSU9OX0VOVFJZKCk7CisKKwkvKiBTd2FwIElEIHRvIGJpZy1lbmRpYW4gdG8gZ2V0IGNvbnRpZ3VvdXMgYml0cyAqLworCisJZWlzYV9pZCA9IGFjcGlfdXRfZHdvcmRfYnl0ZV9zd2FwKG51bWVyaWNfaWQpOworCisJb3V0X3N0cmluZ1swXSA9IChjaGFyKSgnQCcgKyAoKCh1bnNpZ25lZCBsb25nKWVpc2FfaWQgPj4gMjYpICYgMHgxZikpOworCW91dF9zdHJpbmdbMV0gPSAoY2hhcikoJ0AnICsgKChlaXNhX2lkID4+IDIxKSAmIDB4MWYpKTsKKwlvdXRfc3RyaW5nWzJdID0gKGNoYXIpKCdAJyArICgoZWlzYV9pZCA+PiAxNikgJiAweDFmKSk7CisJb3V0X3N0cmluZ1szXSA9IGFjcGlfdXRfaGV4X3RvX2FzY2lpX2NoYXIoKGFjcGlfaW50ZWdlcikgZWlzYV9pZCwgMTIpOworCW91dF9zdHJpbmdbNF0gPSBhY3BpX3V0X2hleF90b19hc2NpaV9jaGFyKChhY3BpX2ludGVnZXIpIGVpc2FfaWQsIDgpOworCW91dF9zdHJpbmdbNV0gPSBhY3BpX3V0X2hleF90b19hc2NpaV9jaGFyKChhY3BpX2ludGVnZXIpIGVpc2FfaWQsIDQpOworCW91dF9zdHJpbmdbNl0gPSBhY3BpX3V0X2hleF90b19hc2NpaV9jaGFyKChhY3BpX2ludGVnZXIpIGVpc2FfaWQsIDApOworCW91dF9zdHJpbmdbN10gPSAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X3Vuc2lnbmVkX2ludGVnZXJfdG9fc3RyaW5nCisgKgorICogUEFSQU1FVEVSUzogIFZhbHVlICAgICAgICAgICAtIFZhbHVlIHRvIGJlIGNvbnZlcnRlZAorICogICAgICAgICAgICAgIG91dF9zdHJpbmcgICAgICAtIFdoZXJlIHRvIHB1dCB0aGUgY29udmVydGVkIHN0cmluZyAoOCBieXRlcykKKyAqCisgKiBSRVRVUk46ICAgICAgTm9uZSwgc3RyaW5nCisgKgorICogREVTQ1JJUFRJT046IENvbnZlcnQgYSBudW1iZXIgdG8gc3RyaW5nIHJlcHJlc2VudGF0aW9uLiBBc3N1bWVzIHN0cmluZworICogICAgICAgICAgICAgIGJ1ZmZlciBpcyBsYXJnZSBlbm91Z2ggdG8gaG9sZCB0aGUgc3RyaW5nLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgYWNwaV9leF91bnNpZ25lZF9pbnRlZ2VyX3RvX3N0cmluZyhhY3BpX2ludGVnZXIgdmFsdWUsIGNoYXIgKm91dF9zdHJpbmcpCit7CisJdTMyIGNvdW50OworCXUzMiBkaWdpdHNfbmVlZGVkOworCXUzMiByZW1haW5kZXI7CisKKwlBQ1BJX0ZVTkNUSU9OX0VOVFJZKCk7CisKKwlkaWdpdHNfbmVlZGVkID0gYWNwaV9leF9kaWdpdHNfbmVlZGVkKHZhbHVlLCAxMCk7CisJb3V0X3N0cmluZ1tkaWdpdHNfbmVlZGVkXSA9IDA7CisKKwlmb3IgKGNvdW50ID0gZGlnaXRzX25lZWRlZDsgY291bnQgPiAwOyBjb3VudC0tKSB7CisJCSh2b2lkKWFjcGlfdXRfc2hvcnRfZGl2aWRlKHZhbHVlLCAxMCwgJnZhbHVlLCAmcmVtYWluZGVyKTsKKwkJb3V0X3N0cmluZ1tjb3VudCAtIDFdID0gKGNoYXIpKCcwJyArIHJlbWFpbmRlcik7CisJfQorfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvaHdhY3BpLmMgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2h3YWNwaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5ZDRmZWEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2h3YWNwaS5jCkBAIC0wLDAgKzEsMTg1IEBACisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBNb2R1bGUgTmFtZTogaHdhY3BpIC0gQUNQSSBIYXJkd2FyZSBJbml0aWFsaXphdGlvbi9Nb2RlIEludGVyZmFjZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDgsIEludGVsIENvcnAuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCisgKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSBhdCBtaW5pbXVtIGEgZGlzY2xhaW1lcgorICogICAgc3Vic3RhbnRpYWxseSBzaW1pbGFyIHRvIHRoZSAiTk8gV0FSUkFOVFkiIGRpc2NsYWltZXIgYmVsb3cKKyAqICAgICgiRGlzY2xhaW1lciIpIGFuZCBhbnkgcmVkaXN0cmlidXRpb24gbXVzdCBiZSBjb25kaXRpb25lZCB1cG9uCisgKiAgICBpbmNsdWRpbmcgYSBzdWJzdGFudGlhbGx5IHNpbWlsYXIgRGlzY2xhaW1lciByZXF1aXJlbWVudCBmb3IgZnVydGhlcgorICogICAgYmluYXJ5IHJlZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzCisgKiAgICBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIE5PIFdBUlJBTlRZCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORworICogSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCisgKi8KKworI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgorI2luY2x1ZGUgImFjY29tbW9uLmgiCisKKyNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX0hBUkRXQVJFCitBQ1BJX01PRFVMRV9OQU1FKCJod2FjcGkiKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfaHdfc2V0X21vZGUKKyAqCisgKiBQQVJBTUVURVJTOiAgTW9kZSAgICAgICAgICAgIC0gU1lTX01PREVfQUNQSSBvciBTWVNfTU9ERV9MRUdBQ1kKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IFRyYW5zaXRpb25zIHRoZSBzeXN0ZW0gaW50byB0aGUgcmVxdWVzdGVkIG1vZGUuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2FjcGlfc3RhdHVzIGFjcGlfaHdfc2V0X21vZGUodTMyIG1vZGUpCit7CisKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJdTMyIHJldHJ5OworCisJQUNQSV9GVU5DVElPTl9UUkFDRShod19zZXRfbW9kZSk7CisKKwkvKgorCSAqIEFDUEkgMi4wIGNsYXJpZmllZCB0aGF0IGlmIFNNSV9DTUQgaW4gRkFEVCBpcyB6ZXJvLAorCSAqIHN5c3RlbSBkb2VzIG5vdCBzdXBwb3J0IG1vZGUgdHJhbnNpdGlvbi4KKwkgKi8KKwlpZiAoIWFjcGlfZ2JsX0ZBRFQuc21pX2NvbW1hbmQpIHsKKwkJQUNQSV9FUlJPUigoQUVfSU5GTywKKwkJCSAgICAiTm8gU01JX0NNRCBpbiBGQURULCBtb2RlIHRyYW5zaXRpb24gZmFpbGVkIikpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9fSEFSRFdBUkVfUkVTUE9OU0UpOworCX0KKworCS8qCisJICogQUNQSSAyLjAgY2xhcmlmaWVkIHRoZSBtZWFuaW5nIG9mIEFDUElfRU5BQkxFIGFuZCBBQ1BJX0RJU0FCTEUKKwkgKiBpbiBGQURUOiBJZiBpdCBpcyB6ZXJvLCBlbmFibGluZyBvciBkaXNhYmxpbmcgaXMgbm90IHN1cHBvcnRlZC4KKwkgKiBBcyBvbGQgc3lzdGVtcyBtYXkgaGF2ZSB1c2VkIHplcm8gZm9yIG1vZGUgdHJhbnNpdGlvbiwKKwkgKiB3ZSBtYWtlIHN1cmUgYm90aCB0aGUgbnVtYmVycyBhcmUgemVybyB0byBkZXRlcm1pbmUgdGhlc2UKKwkgKiB0cmFuc2l0aW9ucyBhcmUgbm90IHN1cHBvcnRlZC4KKwkgKi8KKwlpZiAoIWFjcGlfZ2JsX0ZBRFQuYWNwaV9lbmFibGUgJiYgIWFjcGlfZ2JsX0ZBRFQuYWNwaV9kaXNhYmxlKSB7CisJCUFDUElfRVJST1IoKEFFX0lORk8sCisJCQkgICAgIk5vIEFDUEkgbW9kZSB0cmFuc2l0aW9uIHN1cHBvcnRlZCBpbiB0aGlzIHN5c3RlbSAoZW5hYmxlL2Rpc2FibGUgYm90aCB6ZXJvKSIpKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKKwl9CisKKwlzd2l0Y2ggKG1vZGUpIHsKKwljYXNlIEFDUElfU1lTX01PREVfQUNQSToKKworCQkvKiBCSU9TIHNob3VsZCBoYXZlIGRpc2FibGVkIEFMTCBmaXhlZCBhbmQgR1AgZXZlbnRzICovCisKKwkJc3RhdHVzID0gYWNwaV9vc193cml0ZV9wb3J0KGFjcGlfZ2JsX0ZBRFQuc21pX2NvbW1hbmQsCisJCQkJCSAgICAodTMyKSBhY3BpX2dibF9GQURULmFjcGlfZW5hYmxlLCA4KTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLAorCQkJCSAgIkF0dGVtcHRpbmcgdG8gZW5hYmxlIEFDUEkgbW9kZVxuIikpOworCQlicmVhazsKKworCWNhc2UgQUNQSV9TWVNfTU9ERV9MRUdBQ1k6CisKKwkJLyoKKwkJICogQklPUyBzaG91bGQgY2xlYXIgYWxsIGZpeGVkIHN0YXR1cyBiaXRzIGFuZCByZXN0b3JlIGZpeGVkIGV2ZW50CisJCSAqIGVuYWJsZSBiaXRzIHRvIGRlZmF1bHQKKwkJICovCisJCXN0YXR1cyA9IGFjcGlfb3Nfd3JpdGVfcG9ydChhY3BpX2dibF9GQURULnNtaV9jb21tYW5kLAorCQkJCQkgICAgKHUzMikgYWNwaV9nYmxfRkFEVC5hY3BpX2Rpc2FibGUsCisJCQkJCSAgICA4KTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLAorCQkJCSAgIkF0dGVtcHRpbmcgdG8gZW5hYmxlIExlZ2FjeSAobm9uLUFDUEkpIG1vZGVcbiIpKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX1BBUkFNRVRFUik7CisJfQorCisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCUFDUElfRVhDRVBUSU9OKChBRV9JTkZPLCBzdGF0dXMsCisJCQkJIkNvdWxkIG5vdCB3cml0ZSBBQ1BJIG1vZGUgY2hhbmdlIikpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKKwl9CisKKwkvKgorCSAqIFNvbWUgaGFyZHdhcmUgdGFrZXMgYSBMT05HIHRpbWUgdG8gc3dpdGNoIG1vZGVzLiBHaXZlIHRoZW0gMyBzZWMgdG8KKwkgKiBkbyBzbywgYnV0IGFsbG93IGZhc3RlciBzeXN0ZW1zIHRvIHByb2NlZWQgbW9yZSBxdWlja2x5LgorCSAqLworCXJldHJ5ID0gMzAwMDsKKwl3aGlsZSAocmV0cnkpIHsKKwkJaWYgKGFjcGlfaHdfZ2V0X21vZGUoKSA9PSBtb2RlKSB7CisJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sCisJCQkJCSAgIk1vZGUgJVggc3VjY2Vzc2Z1bGx5IGVuYWJsZWRcbiIsCisJCQkJCSAgbW9kZSkpOworCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKKwkJfQorCQlhY3BpX29zX3N0YWxsKDEwMDApOworCQlyZXRyeS0tOworCX0KKworCUFDUElfRVJST1IoKEFFX0lORk8sICJIYXJkd2FyZSBkaWQgbm90IGNoYW5nZSBtb2RlcyIpKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9fSEFSRFdBUkVfUkVTUE9OU0UpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX2h3X2dldF9tb2RlCisgKgorICogUEFSQU1FVEVSUzogIG5vbmUKKyAqCisgKiBSRVRVUk46ICAgICAgU1lTX01PREVfQUNQSSBvciBTWVNfTU9ERV9MRUdBQ1kKKyAqCisgKiBERVNDUklQVElPTjogUmV0dXJuIGN1cnJlbnQgb3BlcmF0aW5nIHN0YXRlIG9mIHN5c3RlbS4gIERldGVybWluZWQgYnkKKyAqICAgICAgICAgICAgICBxdWVyeWluZyB0aGUgU0NJX0VOIGJpdC4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit1MzIgYWNwaV9od19nZXRfbW9kZSh2b2lkKQoreworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwl1MzIgdmFsdWU7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGh3X2dldF9tb2RlKTsKKworCS8qCisJICogQUNQSSAyLjAgY2xhcmlmaWVkIHRoYXQgaWYgU01JX0NNRCBpbiBGQURUIGlzIHplcm8sCisJICogc3lzdGVtIGRvZXMgbm90IHN1cHBvcnQgbW9kZSB0cmFuc2l0aW9uLgorCSAqLworCWlmICghYWNwaV9nYmxfRkFEVC5zbWlfY29tbWFuZCkgeworCQlyZXR1cm5fVUlOVDMyKEFDUElfU1lTX01PREVfQUNQSSk7CisJfQorCisJc3RhdHVzID0gYWNwaV9nZXRfcmVnaXN0ZXIoQUNQSV9CSVRSRUdfU0NJX0VOQUJMRSwgJnZhbHVlKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuX1VJTlQzMihBQ1BJX1NZU19NT0RFX0xFR0FDWSk7CisJfQorCisJaWYgKHZhbHVlKSB7CisJCXJldHVybl9VSU5UMzIoQUNQSV9TWVNfTU9ERV9BQ1BJKTsKKwl9IGVsc2UgeworCQlyZXR1cm5fVUlOVDMyKEFDUElfU1lTX01PREVfTEVHQUNZKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2h3Z3BlLmMgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2h3Z3BlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjAxM2I2NgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvaHdncGUuYwpAQCAtMCwwICsxLDQ2OSBAQAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogTW9kdWxlIE5hbWU6IGh3Z3BlIC0gTG93IGxldmVsIEdQRSBlbmFibGUvZGlzYWJsZS9jbGVhciBmdW5jdGlvbnMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA4LCBJbnRlbCBDb3JwLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAorICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgYXQgbWluaW11bSBhIGRpc2NsYWltZXIKKyAqICAgIHN1YnN0YW50aWFsbHkgc2ltaWxhciB0byB0aGUgIk5PIFdBUlJBTlRZIiBkaXNjbGFpbWVyIGJlbG93CisgKiAgICAoIkRpc2NsYWltZXIiKSBhbmQgYW55IHJlZGlzdHJpYnV0aW9uIG11c3QgYmUgY29uZGl0aW9uZWQgdXBvbgorICogICAgaW5jbHVkaW5nIGEgc3Vic3RhbnRpYWxseSBzaW1pbGFyIERpc2NsYWltZXIgcmVxdWlyZW1lbnQgZm9yIGZ1cnRoZXIKKyAqICAgIGJpbmFyeSByZWRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcworICogICAgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBOTyBXQVJSQU5UWQorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcKKyAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgorICovCisKKyNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KKyNpbmNsdWRlICJhY2NvbW1vbi5oIgorI2luY2x1ZGUgImFjZXZlbnRzLmgiCisKKyNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX0hBUkRXQVJFCitBQ1BJX01PRFVMRV9OQU1FKCJod2dwZSIpCisKKy8qIExvY2FsIHByb3RvdHlwZXMgKi8KK3N0YXRpYyBhY3BpX3N0YXR1cworYWNwaV9od19lbmFibGVfd2FrZXVwX2dwZV9ibG9jayhzdHJ1Y3QgYWNwaV9ncGVfeHJ1cHRfaW5mbyAqZ3BlX3hydXB0X2luZm8sCisJCQkJc3RydWN0IGFjcGlfZ3BlX2Jsb2NrX2luZm8gKmdwZV9ibG9jaywKKwkJCQl2b2lkICpjb250ZXh0KTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOglhY3BpX2h3X2xvd19kaXNhYmxlX2dwZQorICoKKyAqIFBBUkFNRVRFUlM6CWdwZV9ldmVudF9pbmZvCSAgICAtIEluZm8gYmxvY2sgZm9yIHRoZSBHUEUgdG8gYmUgZGlzYWJsZWQKKyAqCisgKiBSRVRVUk46CVN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBEaXNhYmxlIGEgc2luZ2xlIEdQRSBpbiB0aGUgZW5hYmxlIHJlZ2lzdGVyLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2FjcGlfc3RhdHVzIGFjcGlfaHdfbG93X2Rpc2FibGVfZ3BlKHN0cnVjdCBhY3BpX2dwZV9ldmVudF9pbmZvICpncGVfZXZlbnRfaW5mbykKK3sKKwlzdHJ1Y3QgYWNwaV9ncGVfcmVnaXN0ZXJfaW5mbyAqZ3BlX3JlZ2lzdGVyX2luZm87CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCXUzMiBlbmFibGVfbWFzazsKKworCS8qIEdldCB0aGUgaW5mbyBibG9jayBmb3IgdGhlIGVudGlyZSBHUEUgcmVnaXN0ZXIgKi8KKworCWdwZV9yZWdpc3Rlcl9pbmZvID0gZ3BlX2V2ZW50X2luZm8tPnJlZ2lzdGVyX2luZm87CisJaWYgKCFncGVfcmVnaXN0ZXJfaW5mbykgeworCQlyZXR1cm4gKEFFX05PVF9FWElTVCk7CisJfQorCisJLyogR2V0IGN1cnJlbnQgdmFsdWUgb2YgdGhlIGVuYWJsZSByZWdpc3RlciB0aGF0IGNvbnRhaW5zIHRoaXMgR1BFICovCisKKwlzdGF0dXMgPSBhY3BpX3JlYWQoJmVuYWJsZV9tYXNrLCAmZ3BlX3JlZ2lzdGVyX2luZm8tPmVuYWJsZV9hZGRyZXNzKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuIChzdGF0dXMpOworCX0KKworCS8qIENsZWFyIGp1c3QgdGhlIGJpdCB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoaXMgR1BFICovCisKKwlBQ1BJX0NMRUFSX0JJVChlbmFibGVfbWFzaywKKwkJICAgICAgICgodTMyKSAxIDw8CisJCQkoZ3BlX2V2ZW50X2luZm8tPmdwZV9udW1iZXIgLQorCQkJIGdwZV9yZWdpc3Rlcl9pbmZvLT5iYXNlX2dwZV9udW1iZXIpKSk7CisKKwkvKiBXcml0ZSB0aGUgdXBkYXRlZCBlbmFibGUgbWFzayAqLworCisJc3RhdHVzID0gYWNwaV93cml0ZShlbmFibGVfbWFzaywgJmdwZV9yZWdpc3Rlcl9pbmZvLT5lbmFibGVfYWRkcmVzcyk7CisJcmV0dXJuIChzdGF0dXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfaHdfd3JpdGVfZ3BlX2VuYWJsZV9yZWcKKyAqCisgKiBQQVJBTUVURVJTOiAgZ3BlX2V2ZW50X2luZm8gICAgICAtIEluZm8gYmxvY2sgZm9yIHRoZSBHUEUgdG8gYmUgZW5hYmxlZAorICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogV3JpdGUgYSBHUEUgZW5hYmxlIHJlZ2lzdGVyLiAgTm90ZTogVGhlIGJpdCBmb3IgdGhpcyBHUEUgbXVzdAorICogICAgICAgICAgICAgIGFscmVhZHkgYmUgY2xlYXJlZCBvciBzZXQgaW4gdGhlIHBhcmVudCByZWdpc3RlcgorICogICAgICAgICAgICAgIGVuYWJsZV9mb3JfcnVuIG1hc2suCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworYWNwaV9zdGF0dXMKK2FjcGlfaHdfd3JpdGVfZ3BlX2VuYWJsZV9yZWcoc3RydWN0IGFjcGlfZ3BlX2V2ZW50X2luZm8gKiBncGVfZXZlbnRfaW5mbykKK3sKKwlzdHJ1Y3QgYWNwaV9ncGVfcmVnaXN0ZXJfaW5mbyAqZ3BlX3JlZ2lzdGVyX2luZm87CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCisJQUNQSV9GVU5DVElPTl9FTlRSWSgpOworCisJLyogR2V0IHRoZSBpbmZvIGJsb2NrIGZvciB0aGUgZW50aXJlIEdQRSByZWdpc3RlciAqLworCisJZ3BlX3JlZ2lzdGVyX2luZm8gPSBncGVfZXZlbnRfaW5mby0+cmVnaXN0ZXJfaW5mbzsKKwlpZiAoIWdwZV9yZWdpc3Rlcl9pbmZvKSB7CisJCXJldHVybiAoQUVfTk9UX0VYSVNUKTsKKwl9CisKKwkvKiBXcml0ZSB0aGUgZW50aXJlIEdQRSAocnVudGltZSkgZW5hYmxlIHJlZ2lzdGVyICovCisKKwlzdGF0dXMgPSBhY3BpX3dyaXRlKGdwZV9yZWdpc3Rlcl9pbmZvLT5lbmFibGVfZm9yX3J1biwKKwkJCSAgICAmZ3BlX3JlZ2lzdGVyX2luZm8tPmVuYWJsZV9hZGRyZXNzKTsKKworCXJldHVybiAoc3RhdHVzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX2h3X2NsZWFyX2dwZQorICoKKyAqIFBBUkFNRVRFUlM6ICBncGVfZXZlbnRfaW5mbyAgICAgIC0gSW5mbyBibG9jayBmb3IgdGhlIEdQRSB0byBiZSBjbGVhcmVkCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBDbGVhciB0aGUgc3RhdHVzIGJpdCBmb3IgYSBzaW5nbGUgR1BFLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2FjcGlfc3RhdHVzIGFjcGlfaHdfY2xlYXJfZ3BlKHN0cnVjdCBhY3BpX2dwZV9ldmVudF9pbmZvICogZ3BlX2V2ZW50X2luZm8pCit7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCXU4IHJlZ2lzdGVyX2JpdDsKKworCUFDUElfRlVOQ1RJT05fRU5UUlkoKTsKKworCXJlZ2lzdGVyX2JpdCA9ICh1OCkKKwkgICAgKDEgPDwKKwkgICAgIChncGVfZXZlbnRfaW5mby0+Z3BlX251bWJlciAtCisJICAgICAgZ3BlX2V2ZW50X2luZm8tPnJlZ2lzdGVyX2luZm8tPmJhc2VfZ3BlX251bWJlcikpOworCisJLyoKKwkgKiBXcml0ZSBhIG9uZSB0byB0aGUgYXBwcm9wcmlhdGUgYml0IGluIHRoZSBzdGF0dXMgcmVnaXN0ZXIgdG8KKwkgKiBjbGVhciB0aGlzIEdQRS4KKwkgKi8KKwlzdGF0dXMgPSBhY3BpX3dyaXRlKHJlZ2lzdGVyX2JpdCwKKwkJCSAgICAmZ3BlX2V2ZW50X2luZm8tPnJlZ2lzdGVyX2luZm8tPnN0YXR1c19hZGRyZXNzKTsKKworCXJldHVybiAoc3RhdHVzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX2h3X2dldF9ncGVfc3RhdHVzCisgKgorICogUEFSQU1FVEVSUzogIGdwZV9ldmVudF9pbmZvICAgICAgLSBJbmZvIGJsb2NrIGZvciB0aGUgR1BFIHRvIHF1ZXJpZWQKKyAqICAgICAgICAgICAgICBldmVudF9zdGF0dXMgICAgICAgIC0gV2hlcmUgdGhlIEdQRSBzdGF0dXMgaXMgcmV0dXJuZWQKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IFJldHVybiB0aGUgc3RhdHVzIG9mIGEgc2luZ2xlIEdQRS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCithY3BpX3N0YXR1cworYWNwaV9od19nZXRfZ3BlX3N0YXR1cyhzdHJ1Y3QgYWNwaV9ncGVfZXZlbnRfaW5mbyAqIGdwZV9ldmVudF9pbmZvLAorCQkgICAgICAgYWNwaV9ldmVudF9zdGF0dXMgKiBldmVudF9zdGF0dXMpCit7CisJdTMyIGluX2J5dGU7CisJdTggcmVnaXN0ZXJfYml0OworCXN0cnVjdCBhY3BpX2dwZV9yZWdpc3Rlcl9pbmZvICpncGVfcmVnaXN0ZXJfaW5mbzsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJYWNwaV9ldmVudF9zdGF0dXMgbG9jYWxfZXZlbnRfc3RhdHVzID0gMDsKKworCUFDUElfRlVOQ1RJT05fRU5UUlkoKTsKKworCWlmICghZXZlbnRfc3RhdHVzKSB7CisJCXJldHVybiAoQUVfQkFEX1BBUkFNRVRFUik7CisJfQorCisJLyogR2V0IHRoZSBpbmZvIGJsb2NrIGZvciB0aGUgZW50aXJlIEdQRSByZWdpc3RlciAqLworCisJZ3BlX3JlZ2lzdGVyX2luZm8gPSBncGVfZXZlbnRfaW5mby0+cmVnaXN0ZXJfaW5mbzsKKworCS8qIEdldCB0aGUgcmVnaXN0ZXIgYml0bWFzayBmb3IgdGhpcyBHUEUgKi8KKworCXJlZ2lzdGVyX2JpdCA9ICh1OCkKKwkgICAgKDEgPDwKKwkgICAgIChncGVfZXZlbnRfaW5mby0+Z3BlX251bWJlciAtCisJICAgICAgZ3BlX2V2ZW50X2luZm8tPnJlZ2lzdGVyX2luZm8tPmJhc2VfZ3BlX251bWJlcikpOworCisJLyogR1BFIGN1cnJlbnRseSBlbmFibGVkPyAoZW5hYmxlZCBmb3IgcnVudGltZT8pICovCisKKwlpZiAocmVnaXN0ZXJfYml0ICYgZ3BlX3JlZ2lzdGVyX2luZm8tPmVuYWJsZV9mb3JfcnVuKSB7CisJCWxvY2FsX2V2ZW50X3N0YXR1cyB8PSBBQ1BJX0VWRU5UX0ZMQUdfRU5BQkxFRDsKKwl9CisKKwkvKiBHUEUgZW5hYmxlZCBmb3Igd2FrZT8gKi8KKworCWlmIChyZWdpc3Rlcl9iaXQgJiBncGVfcmVnaXN0ZXJfaW5mby0+ZW5hYmxlX2Zvcl93YWtlKSB7CisJCWxvY2FsX2V2ZW50X3N0YXR1cyB8PSBBQ1BJX0VWRU5UX0ZMQUdfV0FLRV9FTkFCTEVEOworCX0KKworCS8qIEdQRSBjdXJyZW50bHkgYWN0aXZlIChzdGF0dXMgYml0ID09IDEpPyAqLworCisJc3RhdHVzID0gYWNwaV9yZWFkKCZpbl9ieXRlLCAmZ3BlX3JlZ2lzdGVyX2luZm8tPnN0YXR1c19hZGRyZXNzKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJZ290byB1bmxvY2tfYW5kX2V4aXQ7CisJfQorCisJaWYgKHJlZ2lzdGVyX2JpdCAmIGluX2J5dGUpIHsKKwkJbG9jYWxfZXZlbnRfc3RhdHVzIHw9IEFDUElfRVZFTlRfRkxBR19TRVQ7CisJfQorCisJLyogU2V0IHJldHVybiB2YWx1ZSAqLworCisJKCpldmVudF9zdGF0dXMpID0gbG9jYWxfZXZlbnRfc3RhdHVzOworCisgICAgICB1bmxvY2tfYW5kX2V4aXQ6CisJcmV0dXJuIChzdGF0dXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfaHdfZGlzYWJsZV9ncGVfYmxvY2sKKyAqCisgKiBQQVJBTUVURVJTOiAgZ3BlX3hydXB0X2luZm8gICAgICAtIEdQRSBJbnRlcnJ1cHQgaW5mbworICogICAgICAgICAgICAgIGdwZV9ibG9jayAgICAgICAgICAgLSBHcGUgQmxvY2sgaW5mbworICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogRGlzYWJsZSBhbGwgR1BFcyB3aXRoaW4gYSBzaW5nbGUgR1BFIGJsb2NrCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworYWNwaV9zdGF0dXMKK2FjcGlfaHdfZGlzYWJsZV9ncGVfYmxvY2soc3RydWN0IGFjcGlfZ3BlX3hydXB0X2luZm8gKmdwZV94cnVwdF9pbmZvLAorCQkJICBzdHJ1Y3QgYWNwaV9ncGVfYmxvY2tfaW5mbyAqZ3BlX2Jsb2NrLCB2b2lkICpjb250ZXh0KQoreworCXUzMiBpOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKworCS8qIEV4YW1pbmUgZWFjaCBHUEUgUmVnaXN0ZXIgd2l0aGluIHRoZSBibG9jayAqLworCisJZm9yIChpID0gMDsgaSA8IGdwZV9ibG9jay0+cmVnaXN0ZXJfY291bnQ7IGkrKykgeworCisJCS8qIERpc2FibGUgYWxsIEdQRXMgaW4gdGhpcyByZWdpc3RlciAqLworCisJCXN0YXR1cyA9CisJCSAgICBhY3BpX3dyaXRlKDB4MDAsCisJCQkgICAgICAgJmdwZV9ibG9jay0+cmVnaXN0ZXJfaW5mb1tpXS5lbmFibGVfYWRkcmVzcyk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJcmV0dXJuIChzdGF0dXMpOworCQl9CisJfQorCisJcmV0dXJuIChBRV9PSyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9od19jbGVhcl9ncGVfYmxvY2sKKyAqCisgKiBQQVJBTUVURVJTOiAgZ3BlX3hydXB0X2luZm8gICAgICAtIEdQRSBJbnRlcnJ1cHQgaW5mbworICogICAgICAgICAgICAgIGdwZV9ibG9jayAgICAgICAgICAgLSBHcGUgQmxvY2sgaW5mbworICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogQ2xlYXIgc3RhdHVzIGJpdHMgZm9yIGFsbCBHUEVzIHdpdGhpbiBhIHNpbmdsZSBHUEUgYmxvY2sKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCithY3BpX3N0YXR1cworYWNwaV9od19jbGVhcl9ncGVfYmxvY2soc3RydWN0IGFjcGlfZ3BlX3hydXB0X2luZm8gKmdwZV94cnVwdF9pbmZvLAorCQkJc3RydWN0IGFjcGlfZ3BlX2Jsb2NrX2luZm8gKmdwZV9ibG9jaywgdm9pZCAqY29udGV4dCkKK3sKKwl1MzIgaTsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisKKwkvKiBFeGFtaW5lIGVhY2ggR1BFIFJlZ2lzdGVyIHdpdGhpbiB0aGUgYmxvY2sgKi8KKworCWZvciAoaSA9IDA7IGkgPCBncGVfYmxvY2stPnJlZ2lzdGVyX2NvdW50OyBpKyspIHsKKworCQkvKiBDbGVhciBzdGF0dXMgb24gYWxsIEdQRXMgaW4gdGhpcyByZWdpc3RlciAqLworCisJCXN0YXR1cyA9CisJCSAgICBhY3BpX3dyaXRlKDB4RkYsCisJCQkgICAgICAgJmdwZV9ibG9jay0+cmVnaXN0ZXJfaW5mb1tpXS5zdGF0dXNfYWRkcmVzcyk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJcmV0dXJuIChzdGF0dXMpOworCQl9CisJfQorCisJcmV0dXJuIChBRV9PSyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9od19lbmFibGVfcnVudGltZV9ncGVfYmxvY2sKKyAqCisgKiBQQVJBTUVURVJTOiAgZ3BlX3hydXB0X2luZm8gICAgICAtIEdQRSBJbnRlcnJ1cHQgaW5mbworICogICAgICAgICAgICAgIGdwZV9ibG9jayAgICAgICAgICAgLSBHcGUgQmxvY2sgaW5mbworICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogRW5hYmxlIGFsbCAicnVudGltZSIgR1BFcyB3aXRoaW4gYSBzaW5nbGUgR1BFIGJsb2NrLiBJbmNsdWRlcworICogICAgICAgICAgICAgIGNvbWJpbmF0aW9uIHdha2UvcnVuIEdQRXMuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworYWNwaV9zdGF0dXMKK2FjcGlfaHdfZW5hYmxlX3J1bnRpbWVfZ3BlX2Jsb2NrKHN0cnVjdCBhY3BpX2dwZV94cnVwdF9pbmZvICpncGVfeHJ1cHRfaW5mbywKKwkJCQkgc3RydWN0IGFjcGlfZ3BlX2Jsb2NrX2luZm8gKmdwZV9ibG9jaywgdm9pZCAqY29udGV4dCkKK3sKKwl1MzIgaTsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisKKwkvKiBOT1RFOiBhc3N1bWVzIHRoYXQgYWxsIEdQRXMgYXJlIGN1cnJlbnRseSBkaXNhYmxlZCAqLworCisJLyogRXhhbWluZSBlYWNoIEdQRSBSZWdpc3RlciB3aXRoaW4gdGhlIGJsb2NrICovCisKKwlmb3IgKGkgPSAwOyBpIDwgZ3BlX2Jsb2NrLT5yZWdpc3Rlcl9jb3VudDsgaSsrKSB7CisJCWlmICghZ3BlX2Jsb2NrLT5yZWdpc3Rlcl9pbmZvW2ldLmVuYWJsZV9mb3JfcnVuKSB7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIEVuYWJsZSBhbGwgInJ1bnRpbWUiIEdQRXMgaW4gdGhpcyByZWdpc3RlciAqLworCisJCXN0YXR1cyA9IGFjcGlfd3JpdGUoZ3BlX2Jsb2NrLT5yZWdpc3Rlcl9pbmZvW2ldLmVuYWJsZV9mb3JfcnVuLAorCQkJCSAgICAmZ3BlX2Jsb2NrLT5yZWdpc3Rlcl9pbmZvW2ldLgorCQkJCSAgICBlbmFibGVfYWRkcmVzcyk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJcmV0dXJuIChzdGF0dXMpOworCQl9CisJfQorCisJcmV0dXJuIChBRV9PSyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9od19lbmFibGVfd2FrZXVwX2dwZV9ibG9jaworICoKKyAqIFBBUkFNRVRFUlM6ICBncGVfeHJ1cHRfaW5mbyAgICAgIC0gR1BFIEludGVycnVwdCBpbmZvCisgKiAgICAgICAgICAgICAgZ3BlX2Jsb2NrICAgICAgICAgICAtIEdwZSBCbG9jayBpbmZvCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBFbmFibGUgYWxsICJ3YWtlIiBHUEVzIHdpdGhpbiBhIHNpbmdsZSBHUEUgYmxvY2suIEluY2x1ZGVzCisgKiAgICAgICAgICAgICAgY29tYmluYXRpb24gd2FrZS9ydW4gR1BFcy4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgYWNwaV9zdGF0dXMKK2FjcGlfaHdfZW5hYmxlX3dha2V1cF9ncGVfYmxvY2soc3RydWN0IGFjcGlfZ3BlX3hydXB0X2luZm8gKmdwZV94cnVwdF9pbmZvLAorCQkJCXN0cnVjdCBhY3BpX2dwZV9ibG9ja19pbmZvICpncGVfYmxvY2ssCisJCQkJdm9pZCAqY29udGV4dCkKK3sKKwl1MzIgaTsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisKKwkvKiBFeGFtaW5lIGVhY2ggR1BFIFJlZ2lzdGVyIHdpdGhpbiB0aGUgYmxvY2sgKi8KKworCWZvciAoaSA9IDA7IGkgPCBncGVfYmxvY2stPnJlZ2lzdGVyX2NvdW50OyBpKyspIHsKKwkJaWYgKCFncGVfYmxvY2stPnJlZ2lzdGVyX2luZm9baV0uZW5hYmxlX2Zvcl93YWtlKSB7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIEVuYWJsZSBhbGwgIndha2UiIEdQRXMgaW4gdGhpcyByZWdpc3RlciAqLworCisJCXN0YXR1cyA9IGFjcGlfd3JpdGUoZ3BlX2Jsb2NrLT5yZWdpc3Rlcl9pbmZvW2ldLmVuYWJsZV9mb3Jfd2FrZSwKKwkJCQkgICAgJmdwZV9ibG9jay0+cmVnaXN0ZXJfaW5mb1tpXS4KKwkJCQkgICAgZW5hYmxlX2FkZHJlc3MpOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCXJldHVybiAoc3RhdHVzKTsKKwkJfQorCX0KKworCXJldHVybiAoQUVfT0spOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfaHdfZGlzYWJsZV9hbGxfZ3BlcworICoKKyAqIFBBUkFNRVRFUlM6ICBOb25lCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBEaXNhYmxlIGFuZCBjbGVhciBhbGwgR1BFcyBpbiBhbGwgR1BFIGJsb2NrcworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2FjcGlfc3RhdHVzIGFjcGlfaHdfZGlzYWJsZV9hbGxfZ3Blcyh2b2lkKQoreworCWFjcGlfc3RhdHVzIHN0YXR1czsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0UoaHdfZGlzYWJsZV9hbGxfZ3Blcyk7CisKKwlzdGF0dXMgPSBhY3BpX2V2X3dhbGtfZ3BlX2xpc3QoYWNwaV9od19kaXNhYmxlX2dwZV9ibG9jaywgTlVMTCk7CisJc3RhdHVzID0gYWNwaV9ldl93YWxrX2dwZV9saXN0KGFjcGlfaHdfY2xlYXJfZ3BlX2Jsb2NrLCBOVUxMKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX2h3X2VuYWJsZV9hbGxfcnVudGltZV9ncGVzCisgKgorICogUEFSQU1FVEVSUzogIE5vbmUKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IEVuYWJsZSBhbGwgInJ1bnRpbWUiIEdQRXMsIGluIGFsbCBHUEUgYmxvY2tzCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworYWNwaV9zdGF0dXMgYWNwaV9od19lbmFibGVfYWxsX3J1bnRpbWVfZ3Blcyh2b2lkKQoreworCWFjcGlfc3RhdHVzIHN0YXR1czsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0UoaHdfZW5hYmxlX2FsbF9ydW50aW1lX2dwZXMpOworCisJc3RhdHVzID0gYWNwaV9ldl93YWxrX2dwZV9saXN0KGFjcGlfaHdfZW5hYmxlX3J1bnRpbWVfZ3BlX2Jsb2NrLCBOVUxMKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX2h3X2VuYWJsZV9hbGxfd2FrZXVwX2dwZXMKKyAqCisgKiBQQVJBTUVURVJTOiAgTm9uZQorICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogRW5hYmxlIGFsbCAid2FrZXVwIiBHUEVzLCBpbiBhbGwgR1BFIGJsb2NrcworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2FjcGlfc3RhdHVzIGFjcGlfaHdfZW5hYmxlX2FsbF93YWtldXBfZ3Blcyh2b2lkKQoreworCWFjcGlfc3RhdHVzIHN0YXR1czsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0UoaHdfZW5hYmxlX2FsbF93YWtldXBfZ3Blcyk7CisKKwlzdGF0dXMgPSBhY3BpX2V2X3dhbGtfZ3BlX2xpc3QoYWNwaV9od19lbmFibGVfd2FrZXVwX2dwZV9ibG9jaywgTlVMTCk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2h3cmVncy5jIGIvZHJpdmVycy9hY3BpL2FjcGljYS9od3JlZ3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZGM0M2IwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS9od3JlZ3MuYwpAQCAtMCwwICsxLDM1MyBAQAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIE1vZHVsZSBOYW1lOiBod3JlZ3MgLSBSZWFkL3dyaXRlIGFjY2VzcyBmdW5jdGlvbnMgZm9yIHRoZSB2YXJpb3VzIEFDUEkKKyAqICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sIGFuZCBzdGF0dXMgcmVnaXN0ZXJzLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA4LCBJbnRlbCBDb3JwLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAorICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgYXQgbWluaW11bSBhIGRpc2NsYWltZXIKKyAqICAgIHN1YnN0YW50aWFsbHkgc2ltaWxhciB0byB0aGUgIk5PIFdBUlJBTlRZIiBkaXNjbGFpbWVyIGJlbG93CisgKiAgICAoIkRpc2NsYWltZXIiKSBhbmQgYW55IHJlZGlzdHJpYnV0aW9uIG11c3QgYmUgY29uZGl0aW9uZWQgdXBvbgorICogICAgaW5jbHVkaW5nIGEgc3Vic3RhbnRpYWxseSBzaW1pbGFyIERpc2NsYWltZXIgcmVxdWlyZW1lbnQgZm9yIGZ1cnRoZXIKKyAqICAgIGJpbmFyeSByZWRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcworICogICAgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBOTyBXQVJSQU5UWQorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcKKyAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgorICovCisKKyNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KKyNpbmNsdWRlICJhY2NvbW1vbi5oIgorI2luY2x1ZGUgImFjbmFtZXNwLmgiCisjaW5jbHVkZSAiYWNldmVudHMuaCIKKworI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfSEFSRFdBUkUKK0FDUElfTU9EVUxFX05BTUUoImh3cmVncyIpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfaHdfY2xlYXJfYWNwaV9zdGF0dXMKKyAqCisgKiBQQVJBTUVURVJTOiAgTm9uZQorICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogQ2xlYXJzIGFsbCBmaXhlZCBhbmQgZ2VuZXJhbCBwdXJwb3NlIHN0YXR1cyBiaXRzCisgKiAgICAgICAgICAgICAgVEhJUyBGVU5DVElPTiBNVVNUIEJFIENBTExFRCBXSVRIIElOVEVSUlVQVFMgRElTQUJMRUQKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYWNwaV9zdGF0dXMgYWNwaV9od19jbGVhcl9hY3BpX3N0YXR1cyh2b2lkKQoreworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwlhY3BpX2NwdV9mbGFncyBsb2NrX2ZsYWdzID0gMDsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0UoaHdfY2xlYXJfYWNwaV9zdGF0dXMpOworCisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTywgIkFib3V0IHRvIHdyaXRlICUwNFggdG8gJTA0WFxuIiwKKwkJCSAgQUNQSV9CSVRNQVNLX0FMTF9GSVhFRF9TVEFUVVMsCisJCQkgICh1MTYpIGFjcGlfZ2JsX0ZBRFQueHBtMWFfZXZlbnRfYmxvY2suYWRkcmVzcykpOworCisJbG9ja19mbGFncyA9IGFjcGlfb3NfYWNxdWlyZV9sb2NrKGFjcGlfZ2JsX2hhcmR3YXJlX2xvY2spOworCisJc3RhdHVzID0gYWNwaV9od19yZWdpc3Rlcl93cml0ZShBQ1BJX1JFR0lTVEVSX1BNMV9TVEFUVVMsCisJCQkJCUFDUElfQklUTUFTS19BTExfRklYRURfU1RBVFVTKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJZ290byB1bmxvY2tfYW5kX2V4aXQ7CisJfQorCisJLyogQ2xlYXIgdGhlIGZpeGVkIGV2ZW50cyAqLworCisJaWYgKGFjcGlfZ2JsX0ZBRFQueHBtMWJfZXZlbnRfYmxvY2suYWRkcmVzcykgeworCQlzdGF0dXMgPSBhY3BpX3dyaXRlKEFDUElfQklUTUFTS19BTExfRklYRURfU1RBVFVTLAorCQkJCSAgICAmYWNwaV9nYmxfRkFEVC54cG0xYl9ldmVudF9ibG9jayk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJZ290byB1bmxvY2tfYW5kX2V4aXQ7CisJCX0KKwl9CisKKwkvKiBDbGVhciB0aGUgR1BFIEJpdHMgaW4gYWxsIEdQRSByZWdpc3RlcnMgaW4gYWxsIEdQRSBibG9ja3MgKi8KKworCXN0YXR1cyA9IGFjcGlfZXZfd2Fsa19ncGVfbGlzdChhY3BpX2h3X2NsZWFyX2dwZV9ibG9jaywgTlVMTCk7CisKKyAgICAgIHVubG9ja19hbmRfZXhpdDoKKwlhY3BpX29zX3JlbGVhc2VfbG9jayhhY3BpX2dibF9oYXJkd2FyZV9sb2NrLCBsb2NrX2ZsYWdzKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9od19nZXRfcmVnaXN0ZXJfYml0X21hc2sKKyAqCisgKiBQQVJBTUVURVJTOiAgcmVnaXN0ZXJfaWQgICAgICAgICAtIEluZGV4IG9mIEFDUEkgUmVnaXN0ZXIgdG8gYWNjZXNzCisgKgorICogUkVUVVJOOiAgICAgIFRoZSBiaXRtYXNrIHRvIGJlIHVzZWQgd2hlbiBhY2Nlc3NpbmcgdGhlIHJlZ2lzdGVyCisgKgorICogREVTQ1JJUFRJT046IE1hcCByZWdpc3Rlcl9pZCBpbnRvIGEgcmVnaXN0ZXIgYml0bWFzay4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdHJ1Y3QgYWNwaV9iaXRfcmVnaXN0ZXJfaW5mbyAqYWNwaV9od19nZXRfYml0X3JlZ2lzdGVyX2luZm8odTMyIHJlZ2lzdGVyX2lkKQoreworCUFDUElfRlVOQ1RJT05fRU5UUlkoKTsKKworCWlmIChyZWdpc3Rlcl9pZCA+IEFDUElfQklUUkVHX01BWCkgeworCQlBQ1BJX0VSUk9SKChBRV9JTkZPLCAiSW52YWxpZCBCaXRSZWdpc3RlciBJRDogJVgiLAorCQkJICAgIHJlZ2lzdGVyX2lkKSk7CisJCXJldHVybiAoTlVMTCk7CisJfQorCisJcmV0dXJuICgmYWNwaV9nYmxfYml0X3JlZ2lzdGVyX2luZm9bcmVnaXN0ZXJfaWRdKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX2h3X3JlZ2lzdGVyX3JlYWQKKyAqCisgKiBQQVJBTUVURVJTOiAgcmVnaXN0ZXJfaWQgICAgICAgICAtIEFDUEkgUmVnaXN0ZXIgSUQKKyAqICAgICAgICAgICAgICByZXR1cm5fdmFsdWUgICAgICAgIC0gV2hlcmUgdGhlIHJlZ2lzdGVyIHZhbHVlIGlzIHJldHVybmVkCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cyBhbmQgdGhlIHZhbHVlIHJlYWQuCisgKgorICogREVTQ1JJUFRJT046IFJlYWQgZnJvbSB0aGUgc3BlY2lmaWVkIEFDUEkgcmVnaXN0ZXIKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYWNwaV9zdGF0dXMKK2FjcGlfaHdfcmVnaXN0ZXJfcmVhZCh1MzIgcmVnaXN0ZXJfaWQsIHUzMiAqIHJldHVybl92YWx1ZSkKK3sKKwl1MzIgdmFsdWUxID0gMDsKKwl1MzIgdmFsdWUyID0gMDsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGh3X3JlZ2lzdGVyX3JlYWQpOworCisJc3dpdGNoIChyZWdpc3Rlcl9pZCkgeworCWNhc2UgQUNQSV9SRUdJU1RFUl9QTTFfU1RBVFVTOgkvKiAxNi1iaXQgYWNjZXNzICovCisKKwkJc3RhdHVzID0gYWNwaV9yZWFkKCZ2YWx1ZTEsICZhY3BpX2dibF9GQURULnhwbTFhX2V2ZW50X2Jsb2NrKTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQlnb3RvIGV4aXQ7CisJCX0KKworCQkvKiBQTTFCIGlzIG9wdGlvbmFsICovCisKKwkJc3RhdHVzID0gYWNwaV9yZWFkKCZ2YWx1ZTIsICZhY3BpX2dibF9GQURULnhwbTFiX2V2ZW50X2Jsb2NrKTsKKwkJdmFsdWUxIHw9IHZhbHVlMjsKKwkJYnJlYWs7CisKKwljYXNlIEFDUElfUkVHSVNURVJfUE0xX0VOQUJMRToJLyogMTYtYml0IGFjY2VzcyAqLworCisJCXN0YXR1cyA9IGFjcGlfcmVhZCgmdmFsdWUxLCAmYWNwaV9nYmxfeHBtMWFfZW5hYmxlKTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQlnb3RvIGV4aXQ7CisJCX0KKworCQkvKiBQTTFCIGlzIG9wdGlvbmFsICovCisKKwkJc3RhdHVzID0gYWNwaV9yZWFkKCZ2YWx1ZTIsICZhY3BpX2dibF94cG0xYl9lbmFibGUpOworCQl2YWx1ZTEgfD0gdmFsdWUyOworCQlicmVhazsKKworCWNhc2UgQUNQSV9SRUdJU1RFUl9QTTFfQ09OVFJPTDoJLyogMTYtYml0IGFjY2VzcyAqLworCisJCXN0YXR1cyA9IGFjcGlfcmVhZCgmdmFsdWUxLCAmYWNwaV9nYmxfRkFEVC54cG0xYV9jb250cm9sX2Jsb2NrKTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQlnb3RvIGV4aXQ7CisJCX0KKworCQlzdGF0dXMgPSBhY3BpX3JlYWQoJnZhbHVlMiwgJmFjcGlfZ2JsX0ZBRFQueHBtMWJfY29udHJvbF9ibG9jayk7CisJCXZhbHVlMSB8PSB2YWx1ZTI7CisJCWJyZWFrOworCisJY2FzZSBBQ1BJX1JFR0lTVEVSX1BNMl9DT05UUk9MOgkvKiA4LWJpdCBhY2Nlc3MgKi8KKworCQlzdGF0dXMgPSBhY3BpX3JlYWQoJnZhbHVlMSwgJmFjcGlfZ2JsX0ZBRFQueHBtMl9jb250cm9sX2Jsb2NrKTsKKwkJYnJlYWs7CisKKwljYXNlIEFDUElfUkVHSVNURVJfUE1fVElNRVI6CS8qIDMyLWJpdCBhY2Nlc3MgKi8KKworCQlzdGF0dXMgPSBhY3BpX3JlYWQoJnZhbHVlMSwgJmFjcGlfZ2JsX0ZBRFQueHBtX3RpbWVyX2Jsb2NrKTsKKwkJYnJlYWs7CisKKwljYXNlIEFDUElfUkVHSVNURVJfU01JX0NPTU1BTkRfQkxPQ0s6CS8qIDgtYml0IGFjY2VzcyAqLworCisJCXN0YXR1cyA9CisJCSAgICBhY3BpX29zX3JlYWRfcG9ydChhY3BpX2dibF9GQURULnNtaV9jb21tYW5kLCAmdmFsdWUxLCA4KTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlBQ1BJX0VSUk9SKChBRV9JTkZPLCAiVW5rbm93biBSZWdpc3RlciBJRDogJVgiLCByZWdpc3Rlcl9pZCkpOworCQlzdGF0dXMgPSBBRV9CQURfUEFSQU1FVEVSOworCQlicmVhazsKKwl9CisKKyAgICAgIGV4aXQ6CisKKwlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpIHsKKwkJKnJldHVybl92YWx1ZSA9IHZhbHVlMTsKKwl9CisKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX2h3X3JlZ2lzdGVyX3dyaXRlCisgKgorICogUEFSQU1FVEVSUzogIHJlZ2lzdGVyX2lkICAgICAgICAgLSBBQ1BJIFJlZ2lzdGVyIElECisgKiAgICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgICAtIFRoZSB2YWx1ZSB0byB3cml0ZQorICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogV3JpdGUgdG8gdGhlIHNwZWNpZmllZCBBQ1BJIHJlZ2lzdGVyCisgKgorICogTk9URTogSW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBBQ1BJIHNwZWNpZmljYXRpb24sIHRoaXMgZnVuY3Rpb24gYXV0b21hdGljYWxseQorICogcHJlc2VydmVzIHRoZSB2YWx1ZSBvZiB0aGUgZm9sbG93aW5nIGJpdHMsIG1lYW5pbmcgdGhhdCB0aGVzZSBiaXRzIGNhbm5vdCBiZQorICogY2hhbmdlZCB2aWEgdGhpcyBpbnRlcmZhY2U6CisgKgorICogUE0xX0NPTlRST0xbMF0gPSBTQ0lfRU4KKyAqIFBNMV9DT05UUk9MWzldCisgKiBQTTFfU1RBVFVTWzExXQorICoKKyAqIEFDUEkgUmVmZXJlbmNlczoKKyAqIDEpIEhhcmR3YXJlIElnbm9yZWQgQml0czogV2hlbiBzb2Z0d2FyZSB3cml0ZXMgdG8gYSByZWdpc3RlciB3aXRoIGlnbm9yZWQKKyAqICAgICAgYml0IGZpZWxkcywgaXQgcHJlc2VydmVzIHRoZSBpZ25vcmVkIGJpdCBmaWVsZHMKKyAqIDIpIFNDSV9FTjogT1NQTSBhbHdheXMgcHJlc2VydmVzIHRoaXMgYml0IHBvc2l0aW9uCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworYWNwaV9zdGF0dXMgYWNwaV9od19yZWdpc3Rlcl93cml0ZSh1MzIgcmVnaXN0ZXJfaWQsIHUzMiB2YWx1ZSkKK3sKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJdTMyIHJlYWRfdmFsdWU7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGh3X3JlZ2lzdGVyX3dyaXRlKTsKKworCXN3aXRjaCAocmVnaXN0ZXJfaWQpIHsKKwljYXNlIEFDUElfUkVHSVNURVJfUE0xX1NUQVRVUzoJLyogMTYtYml0IGFjY2VzcyAqLworCisJCS8qIFBlcmZvcm0gYSByZWFkIGZpcnN0IHRvIHByZXNlcnZlIGNlcnRhaW4gYml0cyAocGVyIEFDUEkgc3BlYykgKi8KKworCQlzdGF0dXMgPSBhY3BpX2h3X3JlZ2lzdGVyX3JlYWQoQUNQSV9SRUdJU1RFUl9QTTFfU1RBVFVTLAorCQkJCQkgICAgICAgJnJlYWRfdmFsdWUpOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCWdvdG8gZXhpdDsKKwkJfQorCisJCS8qIEluc2VydCB0aGUgYml0cyB0byBiZSBwcmVzZXJ2ZWQgKi8KKworCQlBQ1BJX0lOU0VSVF9CSVRTKHZhbHVlLCBBQ1BJX1BNMV9TVEFUVVNfUFJFU0VSVkVEX0JJVFMsCisJCQkJIHJlYWRfdmFsdWUpOworCisJCS8qIE5vdyB3ZSBjYW4gd3JpdGUgdGhlIGRhdGEgKi8KKworCQlzdGF0dXMgPSBhY3BpX3dyaXRlKHZhbHVlLCAmYWNwaV9nYmxfRkFEVC54cG0xYV9ldmVudF9ibG9jayk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJZ290byBleGl0OworCQl9CisKKwkJLyogUE0xQiBpcyBvcHRpb25hbCAqLworCisJCXN0YXR1cyA9IGFjcGlfd3JpdGUodmFsdWUsICZhY3BpX2dibF9GQURULnhwbTFiX2V2ZW50X2Jsb2NrKTsKKwkJYnJlYWs7CisKKwljYXNlIEFDUElfUkVHSVNURVJfUE0xX0VOQUJMRToJLyogMTYtYml0IGFjY2VzcyAqLworCisJCXN0YXR1cyA9IGFjcGlfd3JpdGUodmFsdWUsICZhY3BpX2dibF94cG0xYV9lbmFibGUpOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCWdvdG8gZXhpdDsKKwkJfQorCisJCS8qIFBNMUIgaXMgb3B0aW9uYWwgKi8KKworCQlzdGF0dXMgPSBhY3BpX3dyaXRlKHZhbHVlLCAmYWNwaV9nYmxfeHBtMWJfZW5hYmxlKTsKKwkJYnJlYWs7CisKKwljYXNlIEFDUElfUkVHSVNURVJfUE0xX0NPTlRST0w6CS8qIDE2LWJpdCBhY2Nlc3MgKi8KKworCQkvKgorCQkgKiBQZXJmb3JtIGEgcmVhZCBmaXJzdCB0byBwcmVzZXJ2ZSBjZXJ0YWluIGJpdHMgKHBlciBBQ1BJIHNwZWMpCisJCSAqLworCQlzdGF0dXMgPSBhY3BpX2h3X3JlZ2lzdGVyX3JlYWQoQUNQSV9SRUdJU1RFUl9QTTFfQ09OVFJPTCwKKwkJCQkJICAgICAgICZyZWFkX3ZhbHVlKTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQlnb3RvIGV4aXQ7CisJCX0KKworCQkvKiBJbnNlcnQgdGhlIGJpdHMgdG8gYmUgcHJlc2VydmVkICovCisKKwkJQUNQSV9JTlNFUlRfQklUUyh2YWx1ZSwgQUNQSV9QTTFfQ09OVFJPTF9QUkVTRVJWRURfQklUUywKKwkJCQkgcmVhZF92YWx1ZSk7CisKKwkJLyogTm93IHdlIGNhbiB3cml0ZSB0aGUgZGF0YSAqLworCisJCXN0YXR1cyA9IGFjcGlfd3JpdGUodmFsdWUsICZhY3BpX2dibF9GQURULnhwbTFhX2NvbnRyb2xfYmxvY2spOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCWdvdG8gZXhpdDsKKwkJfQorCisJCXN0YXR1cyA9IGFjcGlfd3JpdGUodmFsdWUsICZhY3BpX2dibF9GQURULnhwbTFiX2NvbnRyb2xfYmxvY2spOworCQlicmVhazsKKworCWNhc2UgQUNQSV9SRUdJU1RFUl9QTTFBX0NPTlRST0w6CS8qIDE2LWJpdCBhY2Nlc3MgKi8KKworCQlzdGF0dXMgPSBhY3BpX3dyaXRlKHZhbHVlLCAmYWNwaV9nYmxfRkFEVC54cG0xYV9jb250cm9sX2Jsb2NrKTsKKwkJYnJlYWs7CisKKwljYXNlIEFDUElfUkVHSVNURVJfUE0xQl9DT05UUk9MOgkvKiAxNi1iaXQgYWNjZXNzICovCisKKwkJc3RhdHVzID0gYWNwaV93cml0ZSh2YWx1ZSwgJmFjcGlfZ2JsX0ZBRFQueHBtMWJfY29udHJvbF9ibG9jayk7CisJCWJyZWFrOworCisJY2FzZSBBQ1BJX1JFR0lTVEVSX1BNMl9DT05UUk9MOgkvKiA4LWJpdCBhY2Nlc3MgKi8KKworCQlzdGF0dXMgPSBhY3BpX3dyaXRlKHZhbHVlLCAmYWNwaV9nYmxfRkFEVC54cG0yX2NvbnRyb2xfYmxvY2spOworCQlicmVhazsKKworCWNhc2UgQUNQSV9SRUdJU1RFUl9QTV9USU1FUjoJLyogMzItYml0IGFjY2VzcyAqLworCisJCXN0YXR1cyA9IGFjcGlfd3JpdGUodmFsdWUsICZhY3BpX2dibF9GQURULnhwbV90aW1lcl9ibG9jayk7CisJCWJyZWFrOworCisJY2FzZSBBQ1BJX1JFR0lTVEVSX1NNSV9DT01NQU5EX0JMT0NLOgkvKiA4LWJpdCBhY2Nlc3MgKi8KKworCQkvKiBTTUlfQ01EIGlzIGN1cnJlbnRseSBhbHdheXMgaW4gSU8gc3BhY2UgKi8KKworCQlzdGF0dXMgPQorCQkgICAgYWNwaV9vc193cml0ZV9wb3J0KGFjcGlfZ2JsX0ZBRFQuc21pX2NvbW1hbmQsIHZhbHVlLCA4KTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlzdGF0dXMgPSBBRV9CQURfUEFSQU1FVEVSOworCQlicmVhazsKKwl9CisKKyAgICAgIGV4aXQ6CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2h3c2xlZXAuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvaHdzbGVlcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyYWYyYTQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2h3c2xlZXAuYwpAQCAtMCwwICsxLDYyOSBAQAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogTmFtZTogaHdzbGVlcC5jIC0gQUNQSSBIYXJkd2FyZSBTbGVlcC9XYWtlIEludGVyZmFjZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDgsIEludGVsIENvcnAuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCisgKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSBhdCBtaW5pbXVtIGEgZGlzY2xhaW1lcgorICogICAgc3Vic3RhbnRpYWxseSBzaW1pbGFyIHRvIHRoZSAiTk8gV0FSUkFOVFkiIGRpc2NsYWltZXIgYmVsb3cKKyAqICAgICgiRGlzY2xhaW1lciIpIGFuZCBhbnkgcmVkaXN0cmlidXRpb24gbXVzdCBiZSBjb25kaXRpb25lZCB1cG9uCisgKiAgICBpbmNsdWRpbmcgYSBzdWJzdGFudGlhbGx5IHNpbWlsYXIgRGlzY2xhaW1lciByZXF1aXJlbWVudCBmb3IgZnVydGhlcgorICogICAgYmluYXJ5IHJlZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzCisgKiAgICBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIE5PIFdBUlJBTlRZCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORworICogSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCisgKi8KKworI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgorI2luY2x1ZGUgImFjY29tbW9uLmgiCisjaW5jbHVkZSAiYWN0YWJsZXMuaCIKKworI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfSEFSRFdBUkUKK0FDUElfTU9EVUxFX05BTUUoImh3c2xlZXAiKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX3NldF9maXJtd2FyZV93YWtpbmdfdmVjdG9yCisgKgorICogUEFSQU1FVEVSUzogIHBoeXNpY2FsX2FkZHJlc3MgICAgLSAzMi1iaXQgcGh5c2ljYWwgYWRkcmVzcyBvZiBBQ1BJIHJlYWwgbW9kZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeSBwb2ludC4KKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IFNldHMgdGhlIDMyLWJpdCBmaXJtd2FyZV93YWtpbmdfdmVjdG9yIGZpZWxkIG9mIHRoZSBGQUNTCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2FjcGlfc3RhdHVzCithY3BpX3NldF9maXJtd2FyZV93YWtpbmdfdmVjdG9yKHUzMiBwaHlzaWNhbF9hZGRyZXNzKQoreworCUFDUElfRlVOQ1RJT05fVFJBQ0UoYWNwaV9zZXRfZmlybXdhcmVfd2FraW5nX3ZlY3Rvcik7CisKKworCS8qCisJICogQWNjb3JkaW5nIHRvIHRoZSBBQ1BJIHNwZWNpZmljYXRpb24gMi4wYyBhbmQgbGF0ZXIsIHRoZSA2NC1iaXQKKwkgKiB3YWtpbmcgdmVjdG9yIHNob3VsZCBiZSBjbGVhcmVkIGFuZCB0aGUgMzItYml0IHdha2luZyB2ZWN0b3Igc2hvdWxkCisJICogYmUgdXNlZCwgdW5sZXNzIHdlIHdhbnQgdGhlIHdha2UtdXAgY29kZSB0byBiZSBjYWxsZWQgYnkgdGhlIEJJT1MgaW4KKwkgKiBQcm90ZWN0ZWQgTW9kZS4gIFNvbWUgc3lzdGVtcyAoZm9yIGV4YW1wbGUgSFAgZHY1LTEwMDRucikgYXJlIGtub3duCisJICogdG8gZmFpbCB0byByZXN1bWUgaWYgdGhlIDY0LWJpdCB2ZWN0b3IgaXMgdXNlZC4KKwkgKi8KKworCS8qIFNldCB0aGUgMzItYml0IHZlY3RvciAqLworCisJYWNwaV9nYmxfRkFDUy0+ZmlybXdhcmVfd2FraW5nX3ZlY3RvciA9IHBoeXNpY2FsX2FkZHJlc3M7CisKKwkvKiBDbGVhciB0aGUgNjQtYml0IHZlY3RvciBpZiBpdCBleGlzdHMgKi8KKworCWlmICgoYWNwaV9nYmxfRkFDUy0+bGVuZ3RoID4gMzIpICYmIChhY3BpX2dibF9GQUNTLT52ZXJzaW9uID49IDEpKSB7CisJCWFjcGlfZ2JsX0ZBQ1MtPnhmaXJtd2FyZV93YWtpbmdfdmVjdG9yID0gMDsKKwl9CisKKwlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOworfQorCitBQ1BJX0VYUE9SVF9TWU1CT0woYWNwaV9zZXRfZmlybXdhcmVfd2FraW5nX3ZlY3RvcikKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9zZXRfZmlybXdhcmVfd2FraW5nX3ZlY3RvcjY0CisgKgorICogUEFSQU1FVEVSUzogIHBoeXNpY2FsX2FkZHJlc3MgICAgLSA2NC1iaXQgcGh5c2ljYWwgYWRkcmVzcyBvZiBBQ1BJIHByb3RlY3RlZAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlIGVudHJ5IHBvaW50LgorICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogU2V0cyB0aGUgNjQtYml0IFhfZmlybXdhcmVfd2FraW5nX3ZlY3RvciBmaWVsZCBvZiB0aGUgRkFDUywgaWYKKyAqICAgICAgICAgICAgICBpdCBleGlzdHMgaW4gdGhlIHRhYmxlLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCithY3BpX3N0YXR1cworYWNwaV9zZXRfZmlybXdhcmVfd2FraW5nX3ZlY3RvcjY0KHU2NCBwaHlzaWNhbF9hZGRyZXNzKQoreworCUFDUElfRlVOQ1RJT05fVFJBQ0UoYWNwaV9zZXRfZmlybXdhcmVfd2FraW5nX3ZlY3RvcjY0KTsKKworCisJLyogRGV0ZXJtaW5lIGlmIHRoZSA2NC1iaXQgdmVjdG9yIGFjdHVhbGx5IGV4aXN0cyAqLworCisJaWYgKChhY3BpX2dibF9GQUNTLT5sZW5ndGggPD0gMzIpIHx8IChhY3BpX2dibF9GQUNTLT52ZXJzaW9uIDwgMSkpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PVF9FWElTVCk7CisJfQorCisJLyogQ2xlYXIgMzItYml0IHZlY3Rvciwgc2V0IHRoZSA2NC1iaXQgWF8gdmVjdG9yICovCisKKwlhY3BpX2dibF9GQUNTLT5maXJtd2FyZV93YWtpbmdfdmVjdG9yID0gMDsKKwlhY3BpX2dibF9GQUNTLT54ZmlybXdhcmVfd2FraW5nX3ZlY3RvciA9IHBoeXNpY2FsX2FkZHJlc3M7CisKKwlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOworfQorCitBQ1BJX0VYUE9SVF9TWU1CT0woYWNwaV9zZXRfZmlybXdhcmVfd2FraW5nX3ZlY3RvcjY0KQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX2VudGVyX3NsZWVwX3N0YXRlX3ByZXAKKyAqCisgKiBQQVJBTUVURVJTOiAgc2xlZXBfc3RhdGUgICAgICAgICAtIFdoaWNoIHNsZWVwIHN0YXRlIHRvIGVudGVyCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBQcmVwYXJlIHRvIGVudGVyIGEgc3lzdGVtIHNsZWVwIHN0YXRlIChzZWUgQUNQSSAyLjAgc3BlYyBwIDIzMSkKKyAqICAgICAgICAgICAgICBUaGlzIGZ1bmN0aW9uIG11c3QgZXhlY3V0ZSB3aXRoIGludGVycnVwdHMgZW5hYmxlZC4KKyAqICAgICAgICAgICAgICBXZSBicmVhayBzbGVlcGluZyBpbnRvIDIgc3RhZ2VzIHNvIHRoYXQgT1NQTSBjYW4gaGFuZGxlCisgKiAgICAgICAgICAgICAgdmFyaW91cyBPUy1zcGVjaWZpYyB0YXNrcyBiZXR3ZWVuIHRoZSB0d28gc3RlcHMuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2FjcGlfc3RhdHVzIGFjcGlfZW50ZXJfc2xlZXBfc3RhdGVfcHJlcCh1OCBzbGVlcF9zdGF0ZSkKK3sKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJc3RydWN0IGFjcGlfb2JqZWN0X2xpc3QgYXJnX2xpc3Q7CisJdW5pb24gYWNwaV9vYmplY3QgYXJnOworCisJQUNQSV9GVU5DVElPTl9UUkFDRShhY3BpX2VudGVyX3NsZWVwX3N0YXRlX3ByZXApOworCisJLyoKKwkgKiBfUFNXIG1ldGhvZHMgY291bGQgYmUgcnVuIGhlcmUgdG8gZW5hYmxlIHdha2Utb24ga2V5Ym9hcmQsIExBTiwgZXRjLgorCSAqLworCXN0YXR1cyA9IGFjcGlfZ2V0X3NsZWVwX3R5cGVfZGF0YShzbGVlcF9zdGF0ZSwKKwkJCQkJICAmYWNwaV9nYmxfc2xlZXBfdHlwZV9hLAorCQkJCQkgICZhY3BpX2dibF9zbGVlcF90eXBlX2IpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKKwl9CisKKwkvKiBTZXR1cCBwYXJhbWV0ZXIgb2JqZWN0ICovCisKKwlhcmdfbGlzdC5jb3VudCA9IDE7CisJYXJnX2xpc3QucG9pbnRlciA9ICZhcmc7CisKKwlhcmcudHlwZSA9IEFDUElfVFlQRV9JTlRFR0VSOworCWFyZy5pbnRlZ2VyLnZhbHVlID0gc2xlZXBfc3RhdGU7CisKKwkvKiBSdW4gdGhlIF9QVFMgbWV0aG9kICovCisKKwlzdGF0dXMgPSBhY3BpX2V2YWx1YXRlX29iamVjdChOVUxMLCBNRVRIT0RfTkFNRV9fUFRTLCAmYXJnX2xpc3QsIE5VTEwpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSAmJiBzdGF0dXMgIT0gQUVfTk9UX0ZPVU5EKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworCX0KKworCS8qIFNldHVwIHRoZSBhcmd1bWVudCB0byBfU1NUICovCisKKwlzd2l0Y2ggKHNsZWVwX3N0YXRlKSB7CisJY2FzZSBBQ1BJX1NUQVRFX1MwOgorCQlhcmcuaW50ZWdlci52YWx1ZSA9IEFDUElfU1NUX1dPUktJTkc7CisJCWJyZWFrOworCisJY2FzZSBBQ1BJX1NUQVRFX1MxOgorCWNhc2UgQUNQSV9TVEFURV9TMjoKKwljYXNlIEFDUElfU1RBVEVfUzM6CisJCWFyZy5pbnRlZ2VyLnZhbHVlID0gQUNQSV9TU1RfU0xFRVBJTkc7CisJCWJyZWFrOworCisJY2FzZSBBQ1BJX1NUQVRFX1M0OgorCQlhcmcuaW50ZWdlci52YWx1ZSA9IEFDUElfU1NUX1NMRUVQX0NPTlRFWFQ7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYXJnLmludGVnZXIudmFsdWUgPSBBQ1BJX1NTVF9JTkRJQ0FUT1JfT0ZGOwkvKiBEZWZhdWx0IGlzIG9mZiAqLworCQlicmVhazsKKwl9CisKKwkvKgorCSAqIFNldCB0aGUgc3lzdGVtIGluZGljYXRvcnMgdG8gc2hvdyB0aGUgZGVzaXJlZCBzbGVlcCBzdGF0ZS4KKwkgKiBfU1NUIGlzIGFuIG9wdGlvbmFsIG1ldGhvZCAocmV0dXJuIG5vIGVycm9yIGlmIG5vdCBmb3VuZCkKKwkgKi8KKwlzdGF0dXMgPSBhY3BpX2V2YWx1YXRlX29iamVjdChOVUxMLCBNRVRIT0RfTkFNRV9fU1NULCAmYXJnX2xpc3QsIE5VTEwpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSAmJiBzdGF0dXMgIT0gQUVfTk9UX0ZPVU5EKSB7CisJCUFDUElfRVhDRVBUSU9OKChBRV9JTkZPLCBzdGF0dXMsCisJCQkJIldoaWxlIGV4ZWN1dGluZyBtZXRob2QgX1NTVCIpKTsKKwl9CisKKwlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOworfQorCitBQ1BJX0VYUE9SVF9TWU1CT0woYWNwaV9lbnRlcl9zbGVlcF9zdGF0ZV9wcmVwKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX2VudGVyX3NsZWVwX3N0YXRlCisgKgorICogUEFSQU1FVEVSUzogIHNsZWVwX3N0YXRlICAgICAgICAgLSBXaGljaCBzbGVlcCBzdGF0ZSB0byBlbnRlcgorICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogRW50ZXIgYSBzeXN0ZW0gc2xlZXAgc3RhdGUgKHNlZSBBQ1BJIDIuMCBzcGVjIHAgMjMxKQorICogICAgICAgICAgICAgIFRISVMgRlVOQ1RJT04gTVVTVCBCRSBDQUxMRUQgV0lUSCBJTlRFUlJVUFRTIERJU0FCTEVECisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2FjcGlfc3RhdHVzIGFzbWxpbmthZ2UgYWNwaV9lbnRlcl9zbGVlcF9zdGF0ZSh1OCBzbGVlcF9zdGF0ZSkKK3sKKwl1MzIgUE0xQWNvbnRyb2w7CisJdTMyIFBNMUJjb250cm9sOworCXN0cnVjdCBhY3BpX2JpdF9yZWdpc3Rlcl9pbmZvICpzbGVlcF90eXBlX3JlZ19pbmZvOworCXN0cnVjdCBhY3BpX2JpdF9yZWdpc3Rlcl9pbmZvICpzbGVlcF9lbmFibGVfcmVnX2luZm87CisJdTMyIGluX3ZhbHVlOworCXN0cnVjdCBhY3BpX29iamVjdF9saXN0IGFyZ19saXN0OworCXVuaW9uIGFjcGlfb2JqZWN0IGFyZzsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGFjcGlfZW50ZXJfc2xlZXBfc3RhdGUpOworCisJaWYgKChhY3BpX2dibF9zbGVlcF90eXBlX2EgPiBBQ1BJX1NMRUVQX1RZUEVfTUFYKSB8fAorCSAgICAoYWNwaV9nYmxfc2xlZXBfdHlwZV9iID4gQUNQSV9TTEVFUF9UWVBFX01BWCkpIHsKKwkJQUNQSV9FUlJPUigoQUVfSU5GTywgIlNsZWVwIHZhbHVlcyBvdXQgb2YgcmFuZ2U6IEE9JVggQj0lWCIsCisJCQkgICAgYWNwaV9nYmxfc2xlZXBfdHlwZV9hLCBhY3BpX2dibF9zbGVlcF90eXBlX2IpKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9PUEVSQU5EX1ZBTFVFKTsKKwl9CisKKwlzbGVlcF90eXBlX3JlZ19pbmZvID0KKwkgICAgYWNwaV9od19nZXRfYml0X3JlZ2lzdGVyX2luZm8oQUNQSV9CSVRSRUdfU0xFRVBfVFlQRV9BKTsKKwlzbGVlcF9lbmFibGVfcmVnX2luZm8gPQorCSAgICBhY3BpX2h3X2dldF9iaXRfcmVnaXN0ZXJfaW5mbyhBQ1BJX0JJVFJFR19TTEVFUF9FTkFCTEUpOworCisJLyogQ2xlYXIgd2FrZSBzdGF0dXMgKi8KKworCXN0YXR1cyA9IGFjcGlfc2V0X3JlZ2lzdGVyKEFDUElfQklUUkVHX1dBS0VfU1RBVFVTLCAxKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CisJfQorCisJLyogQ2xlYXIgYWxsIGZpeGVkIGFuZCBnZW5lcmFsIHB1cnBvc2Ugc3RhdHVzIGJpdHMgKi8KKworCXN0YXR1cyA9IGFjcGlfaHdfY2xlYXJfYWNwaV9zdGF0dXMoKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CisJfQorCisJLyoKKwkgKiAxKSBEaXNhYmxlL0NsZWFyIGFsbCBHUEVzCisJICogMikgRW5hYmxlIGFsbCB3YWtldXAgR1BFcworCSAqLworCXN0YXR1cyA9IGFjcGlfaHdfZGlzYWJsZV9hbGxfZ3BlcygpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKKwl9CisJYWNwaV9nYmxfc3lzdGVtX2F3YWtlX2FuZF9ydW5uaW5nID0gRkFMU0U7CisKKwlzdGF0dXMgPSBhY3BpX2h3X2VuYWJsZV9hbGxfd2FrZXVwX2dwZXMoKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CisJfQorCisJLyogRXhlY3V0ZSB0aGUgX0dUUyBtZXRob2QgKi8KKworCWFyZ19saXN0LmNvdW50ID0gMTsKKwlhcmdfbGlzdC5wb2ludGVyID0gJmFyZzsKKwlhcmcudHlwZSA9IEFDUElfVFlQRV9JTlRFR0VSOworCWFyZy5pbnRlZ2VyLnZhbHVlID0gc2xlZXBfc3RhdGU7CisKKwlzdGF0dXMgPSBhY3BpX2V2YWx1YXRlX29iamVjdChOVUxMLCBNRVRIT0RfTkFNRV9fR1RTLCAmYXJnX2xpc3QsIE5VTEwpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSAmJiBzdGF0dXMgIT0gQUVfTk9UX0ZPVU5EKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworCX0KKworCS8qIEdldCBjdXJyZW50IHZhbHVlIG9mIFBNMUEgY29udHJvbCAqLworCisJc3RhdHVzID0gYWNwaV9od19yZWdpc3Rlcl9yZWFkKEFDUElfUkVHSVNURVJfUE0xX0NPTlRST0wsICZQTTFBY29udHJvbCk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworCX0KKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lOSVQsCisJCQkgICJFbnRlcmluZyBzbGVlcCBzdGF0ZSBbUyVkXVxuIiwgc2xlZXBfc3RhdGUpKTsKKworCS8qIENsZWFyIFNMUF9FTiBhbmQgU0xQX1RZUCBmaWVsZHMgKi8KKworCVBNMUFjb250cm9sICY9IH4oc2xlZXBfdHlwZV9yZWdfaW5mby0+YWNjZXNzX2JpdF9tYXNrIHwKKwkJCSBzbGVlcF9lbmFibGVfcmVnX2luZm8tPmFjY2Vzc19iaXRfbWFzayk7CisJUE0xQmNvbnRyb2wgPSBQTTFBY29udHJvbDsKKworCS8qIEluc2VydCBTTFBfVFlQIGJpdHMgKi8KKworCVBNMUFjb250cm9sIHw9CisJICAgIChhY3BpX2dibF9zbGVlcF90eXBlX2EgPDwgc2xlZXBfdHlwZV9yZWdfaW5mby0+Yml0X3Bvc2l0aW9uKTsKKwlQTTFCY29udHJvbCB8PQorCSAgICAoYWNwaV9nYmxfc2xlZXBfdHlwZV9iIDw8IHNsZWVwX3R5cGVfcmVnX2luZm8tPmJpdF9wb3NpdGlvbik7CisKKwkvKgorCSAqIFdlIHNwbGl0IHRoZSB3cml0ZXMgb2YgU0xQX1RZUCBhbmQgU0xQX0VOIHRvIHdvcmthcm91bmQKKwkgKiBwb29ybHkgaW1wbGVtZW50ZWQgaGFyZHdhcmUuCisJICovCisKKwkvKiBXcml0ZSAjMTogZmlsbCBpbiBTTFBfVFlQIGRhdGEgKi8KKworCXN0YXR1cyA9IGFjcGlfaHdfcmVnaXN0ZXJfd3JpdGUoQUNQSV9SRUdJU1RFUl9QTTFBX0NPTlRST0wsCisJCQkJCVBNMUFjb250cm9sKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CisJfQorCisJc3RhdHVzID0gYWNwaV9od19yZWdpc3Rlcl93cml0ZShBQ1BJX1JFR0lTVEVSX1BNMUJfQ09OVFJPTCwKKwkJCQkJUE0xQmNvbnRyb2wpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKKwl9CisKKwkvKiBJbnNlcnQgU0xQX0VOQUJMRSBiaXQgKi8KKworCVBNMUFjb250cm9sIHw9IHNsZWVwX2VuYWJsZV9yZWdfaW5mby0+YWNjZXNzX2JpdF9tYXNrOworCVBNMUJjb250cm9sIHw9IHNsZWVwX2VuYWJsZV9yZWdfaW5mby0+YWNjZXNzX2JpdF9tYXNrOworCisJLyogV3JpdGUgIzI6IFNMUF9UWVAgKyBTTFBfRU4gKi8KKworCUFDUElfRkxVU0hfQ1BVX0NBQ0hFKCk7CisKKwlzdGF0dXMgPSBhY3BpX2h3X3JlZ2lzdGVyX3dyaXRlKEFDUElfUkVHSVNURVJfUE0xQV9DT05UUk9MLAorCQkJCQlQTTFBY29udHJvbCk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworCX0KKworCXN0YXR1cyA9IGFjcGlfaHdfcmVnaXN0ZXJfd3JpdGUoQUNQSV9SRUdJU1RFUl9QTTFCX0NPTlRST0wsCisJCQkJCVBNMUJjb250cm9sKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CisJfQorCisJaWYgKHNsZWVwX3N0YXRlID4gQUNQSV9TVEFURV9TMykgeworCQkvKgorCQkgKiBXZSB3YW50ZWQgdG8gc2xlZXAgPiBTMywgYnV0IGl0IGRpZG4ndCBoYXBwZW4gKGJ5IHZpcnR1ZSBvZiB0aGUKKwkJICogZmFjdCB0aGF0IHdlIGFyZSBzdGlsbCBleGVjdXRpbmchKQorCQkgKgorCQkgKiBXYWl0IHRlbiBzZWNvbmRzLCB0aGVuIHRyeSBhZ2Fpbi4gVGhpcyBpcyB0byBnZXQgUzQvUzUgdG8gd29yayBvbgorCQkgKiBhbGwgbWFjaGluZXMuCisJCSAqCisJCSAqIFdlIHdhaXQgc28gbG9uZyB0byBhbGxvdyBjaGlwc2V0cyB0aGF0IHBvbGwgdGhpcyByZWcgdmVyeSBzbG93bHkgdG8KKwkJICogc3RpbGwgcmVhZCB0aGUgcmlnaHQgdmFsdWUuIElkZWFsbHksIHRoaXMgYmxvY2sgd291bGQgZ28KKwkJICogYXdheSBlbnRpcmVseS4KKwkJICovCisJCWFjcGlfb3Nfc3RhbGwoMTAwMDAwMDApOworCisJCXN0YXR1cyA9IGFjcGlfaHdfcmVnaXN0ZXJfd3JpdGUoQUNQSV9SRUdJU1RFUl9QTTFfQ09OVFJPTCwKKwkJCQkJCXNsZWVwX2VuYWJsZV9yZWdfaW5mby0+CisJCQkJCQlhY2Nlc3NfYml0X21hc2spOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworCQl9CisJfQorCisJLyogV2FpdCB1bnRpbCB3ZSBlbnRlciBzbGVlcCBzdGF0ZSAqLworCisJZG8geworCQlzdGF0dXMgPSBhY3BpX2dldF9yZWdpc3Rlcl91bmxvY2tlZChBQ1BJX0JJVFJFR19XQUtFX1NUQVRVUywKKwkJCQkJCSAgICAmaW5fdmFsdWUpOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworCQl9CisKKwkJLyogU3BpbiB1bnRpbCB3ZSB3YWtlICovCisKKwl9IHdoaWxlICghaW5fdmFsdWUpOworCisJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKK30KKworQUNQSV9FWFBPUlRfU1lNQk9MKGFjcGlfZW50ZXJfc2xlZXBfc3RhdGUpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfZW50ZXJfc2xlZXBfc3RhdGVfczRiaW9zCisgKgorICogUEFSQU1FVEVSUzogIE5vbmUKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IFBlcmZvcm0gYSBTNCBiaW9zIHJlcXVlc3QuCisgKiAgICAgICAgICAgICAgVEhJUyBGVU5DVElPTiBNVVNUIEJFIENBTExFRCBXSVRIIElOVEVSUlVQVFMgRElTQUJMRUQKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYWNwaV9zdGF0dXMgYXNtbGlua2FnZSBhY3BpX2VudGVyX3NsZWVwX3N0YXRlX3M0Ymlvcyh2b2lkKQoreworCXUzMiBpbl92YWx1ZTsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGFjcGlfZW50ZXJfc2xlZXBfc3RhdGVfczRiaW9zKTsKKworCXN0YXR1cyA9IGFjcGlfc2V0X3JlZ2lzdGVyKEFDUElfQklUUkVHX1dBS0VfU1RBVFVTLCAxKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CisJfQorCisJc3RhdHVzID0gYWNwaV9od19jbGVhcl9hY3BpX3N0YXR1cygpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKKwl9CisKKwkvKgorCSAqIDEpIERpc2FibGUvQ2xlYXIgYWxsIEdQRXMKKwkgKiAyKSBFbmFibGUgYWxsIHdha2V1cCBHUEVzCisJICovCisJc3RhdHVzID0gYWNwaV9od19kaXNhYmxlX2FsbF9ncGVzKCk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworCX0KKwlhY3BpX2dibF9zeXN0ZW1fYXdha2VfYW5kX3J1bm5pbmcgPSBGQUxTRTsKKworCXN0YXR1cyA9IGFjcGlfaHdfZW5hYmxlX2FsbF93YWtldXBfZ3BlcygpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKKwl9CisKKwlBQ1BJX0ZMVVNIX0NQVV9DQUNIRSgpOworCisJc3RhdHVzID0gYWNwaV9vc193cml0ZV9wb3J0KGFjcGlfZ2JsX0ZBRFQuc21pX2NvbW1hbmQsCisJCQkJICAgICh1MzIpIGFjcGlfZ2JsX0ZBRFQuUzRiaW9zX3JlcXVlc3QsIDgpOworCisJZG8geworCQlhY3BpX29zX3N0YWxsKDEwMDApOworCQlzdGF0dXMgPSBhY3BpX2dldF9yZWdpc3RlcihBQ1BJX0JJVFJFR19XQUtFX1NUQVRVUywgJmluX3ZhbHVlKTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKKwkJfQorCX0gd2hpbGUgKCFpbl92YWx1ZSk7CisKKwlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOworfQorCitBQ1BJX0VYUE9SVF9TWU1CT0woYWNwaV9lbnRlcl9zbGVlcF9zdGF0ZV9zNGJpb3MpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfbGVhdmVfc2xlZXBfc3RhdGVfcHJlcAorICoKKyAqIFBBUkFNRVRFUlM6ICBzbGVlcF9zdGF0ZSAgICAgICAgIC0gV2hpY2ggc2xlZXAgc3RhdGUgd2UgYXJlIGV4aXRpbmcKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IFBlcmZvcm0gdGhlIGZpcnN0IHN0YXRlIG9mIE9TLWluZGVwZW5kZW50IEFDUEkgY2xlYW51cCBhZnRlciBhCisgKiAgICAgICAgICAgICAgc2xlZXAuCisgKiAgICAgICAgICAgICAgQ2FsbGVkIHdpdGggaW50ZXJydXB0cyBESVNBQkxFRC4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYWNwaV9zdGF0dXMgYWNwaV9sZWF2ZV9zbGVlcF9zdGF0ZV9wcmVwKHU4IHNsZWVwX3N0YXRlKQoreworCXN0cnVjdCBhY3BpX29iamVjdF9saXN0IGFyZ19saXN0OworCXVuaW9uIGFjcGlfb2JqZWN0IGFyZzsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJc3RydWN0IGFjcGlfYml0X3JlZ2lzdGVyX2luZm8gKnNsZWVwX3R5cGVfcmVnX2luZm87CisJc3RydWN0IGFjcGlfYml0X3JlZ2lzdGVyX2luZm8gKnNsZWVwX2VuYWJsZV9yZWdfaW5mbzsKKwl1MzIgUE0xQWNvbnRyb2w7CisJdTMyIFBNMUJjb250cm9sOworCisJQUNQSV9GVU5DVElPTl9UUkFDRShhY3BpX2xlYXZlX3NsZWVwX3N0YXRlX3ByZXApOworCisJLyoKKwkgKiBTZXQgU0xQX1RZUEUgYW5kIFNMUF9FTiB0byBzdGF0ZSBTMC4KKwkgKiBUaGlzIGlzIHVuY2xlYXIgZnJvbSB0aGUgQUNQSSBTcGVjLCBidXQgaXQgaXMgcmVxdWlyZWQKKwkgKiBieSBzb21lIG1hY2hpbmVzLgorCSAqLworCXN0YXR1cyA9IGFjcGlfZ2V0X3NsZWVwX3R5cGVfZGF0YShBQ1BJX1NUQVRFX1MwLAorCQkJCQkgICZhY3BpX2dibF9zbGVlcF90eXBlX2EsCisJCQkJCSAgJmFjcGlfZ2JsX3NsZWVwX3R5cGVfYik7CisJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCXNsZWVwX3R5cGVfcmVnX2luZm8gPQorCQkgICAgYWNwaV9od19nZXRfYml0X3JlZ2lzdGVyX2luZm8oQUNQSV9CSVRSRUdfU0xFRVBfVFlQRV9BKTsKKwkJc2xlZXBfZW5hYmxlX3JlZ19pbmZvID0KKwkJICAgIGFjcGlfaHdfZ2V0X2JpdF9yZWdpc3Rlcl9pbmZvKEFDUElfQklUUkVHX1NMRUVQX0VOQUJMRSk7CisKKwkJLyogR2V0IGN1cnJlbnQgdmFsdWUgb2YgUE0xQSBjb250cm9sICovCisKKwkJc3RhdHVzID0gYWNwaV9od19yZWdpc3Rlcl9yZWFkKEFDUElfUkVHSVNURVJfUE0xX0NPTlRST0wsCisJCQkJCSAgICAgICAmUE0xQWNvbnRyb2wpOworCQlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpIHsKKworCQkJLyogQ2xlYXIgU0xQX0VOIGFuZCBTTFBfVFlQIGZpZWxkcyAqLworCisJCQlQTTFBY29udHJvbCAmPSB+KHNsZWVwX3R5cGVfcmVnX2luZm8tPmFjY2Vzc19iaXRfbWFzayB8CisJCQkJCSBzbGVlcF9lbmFibGVfcmVnX2luZm8tPgorCQkJCQkgYWNjZXNzX2JpdF9tYXNrKTsKKwkJCVBNMUJjb250cm9sID0gUE0xQWNvbnRyb2w7CisKKwkJCS8qIEluc2VydCBTTFBfVFlQIGJpdHMgKi8KKworCQkJUE0xQWNvbnRyb2wgfD0KKwkJCSAgICAoYWNwaV9nYmxfc2xlZXBfdHlwZV9hIDw8IHNsZWVwX3R5cGVfcmVnX2luZm8tPgorCQkJICAgICBiaXRfcG9zaXRpb24pOworCQkJUE0xQmNvbnRyb2wgfD0KKwkJCSAgICAoYWNwaV9nYmxfc2xlZXBfdHlwZV9iIDw8IHNsZWVwX3R5cGVfcmVnX2luZm8tPgorCQkJICAgICBiaXRfcG9zaXRpb24pOworCisJCQkvKiBKdXN0IGlnbm9yZSBhbnkgZXJyb3JzICovCisKKwkJCSh2b2lkKWFjcGlfaHdfcmVnaXN0ZXJfd3JpdGUoQUNQSV9SRUdJU1RFUl9QTTFBX0NPTlRST0wsCisJCQkJCQkgICAgIFBNMUFjb250cm9sKTsKKwkJCSh2b2lkKWFjcGlfaHdfcmVnaXN0ZXJfd3JpdGUoQUNQSV9SRUdJU1RFUl9QTTFCX0NPTlRST0wsCisJCQkJCQkgICAgIFBNMUJjb250cm9sKTsKKwkJfQorCX0KKworCS8qIEV4ZWN1dGUgdGhlIF9CRlMgbWV0aG9kICovCisKKwlhcmdfbGlzdC5jb3VudCA9IDE7CisJYXJnX2xpc3QucG9pbnRlciA9ICZhcmc7CisJYXJnLnR5cGUgPSBBQ1BJX1RZUEVfSU5URUdFUjsKKwlhcmcuaW50ZWdlci52YWx1ZSA9IHNsZWVwX3N0YXRlOworCisJc3RhdHVzID0gYWNwaV9ldmFsdWF0ZV9vYmplY3QoTlVMTCwgTUVUSE9EX05BTUVfX0JGUywgJmFyZ19saXN0LCBOVUxMKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykgJiYgc3RhdHVzICE9IEFFX05PVF9GT1VORCkgeworCQlBQ1BJX0VYQ0VQVElPTigoQUVfSU5GTywgc3RhdHVzLCAiRHVyaW5nIE1ldGhvZCBfQkZTIikpOworCX0KKworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX2xlYXZlX3NsZWVwX3N0YXRlCisgKgorICogUEFSQU1FVEVSUzogIHNsZWVwX3N0YXRlICAgICAgICAgLSBXaGljaCBzbGVlcCBzdGF0ZSB3ZSBqdXN0IGV4aXRlZAorICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogUGVyZm9ybSBPUy1pbmRlcGVuZGVudCBBQ1BJIGNsZWFudXAgYWZ0ZXIgYSBzbGVlcAorICogICAgICAgICAgICAgIENhbGxlZCB3aXRoIGludGVycnVwdHMgRU5BQkxFRC4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYWNwaV9zdGF0dXMgYWNwaV9sZWF2ZV9zbGVlcF9zdGF0ZSh1OCBzbGVlcF9zdGF0ZSkKK3sKKwlzdHJ1Y3QgYWNwaV9vYmplY3RfbGlzdCBhcmdfbGlzdDsKKwl1bmlvbiBhY3BpX29iamVjdCBhcmc7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCisJQUNQSV9GVU5DVElPTl9UUkFDRShhY3BpX2xlYXZlX3NsZWVwX3N0YXRlKTsKKworCS8qIEVuc3VyZSBlbnRlcl9zbGVlcF9zdGF0ZV9wcmVwIC0+IGVudGVyX3NsZWVwX3N0YXRlIG9yZGVyaW5nICovCisKKwlhY3BpX2dibF9zbGVlcF90eXBlX2EgPSBBQ1BJX1NMRUVQX1RZUEVfSU5WQUxJRDsKKworCS8qIFNldHVwIHBhcmFtZXRlciBvYmplY3QgKi8KKworCWFyZ19saXN0LmNvdW50ID0gMTsKKwlhcmdfbGlzdC5wb2ludGVyID0gJmFyZzsKKwlhcmcudHlwZSA9IEFDUElfVFlQRV9JTlRFR0VSOworCisJLyogSWdub3JlIGFueSBlcnJvcnMgZnJvbSB0aGVzZSBtZXRob2RzICovCisKKwlhcmcuaW50ZWdlci52YWx1ZSA9IEFDUElfU1NUX1dBS0lORzsKKwlzdGF0dXMgPSBhY3BpX2V2YWx1YXRlX29iamVjdChOVUxMLCBNRVRIT0RfTkFNRV9fU1NULCAmYXJnX2xpc3QsIE5VTEwpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSAmJiBzdGF0dXMgIT0gQUVfTk9UX0ZPVU5EKSB7CisJCUFDUElfRVhDRVBUSU9OKChBRV9JTkZPLCBzdGF0dXMsICJEdXJpbmcgTWV0aG9kIF9TU1QiKSk7CisJfQorCisJLyoKKwkgKiBHUEVzIG11c3QgYmUgZW5hYmxlZCBiZWZvcmUgX1dBSyBpcyBjYWxsZWQgYXMgR1BFcworCSAqIG1pZ2h0IGdldCBmaXJlZCB0aGVyZQorCSAqCisJICogUmVzdG9yZSB0aGUgR1BFczoKKwkgKiAxKSBEaXNhYmxlL0NsZWFyIGFsbCBHUEVzCisJICogMikgRW5hYmxlIGFsbCBydW50aW1lIEdQRXMKKwkgKi8KKwlzdGF0dXMgPSBhY3BpX2h3X2Rpc2FibGVfYWxsX2dwZXMoKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CisJfQorCXN0YXR1cyA9IGFjcGlfaHdfZW5hYmxlX2FsbF9ydW50aW1lX2dwZXMoKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CisJfQorCisJYXJnLmludGVnZXIudmFsdWUgPSBzbGVlcF9zdGF0ZTsKKwlzdGF0dXMgPSBhY3BpX2V2YWx1YXRlX29iamVjdChOVUxMLCBNRVRIT0RfTkFNRV9fV0FLLCAmYXJnX2xpc3QsIE5VTEwpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSAmJiBzdGF0dXMgIT0gQUVfTk9UX0ZPVU5EKSB7CisJCUFDUElfRVhDRVBUSU9OKChBRV9JTkZPLCBzdGF0dXMsICJEdXJpbmcgTWV0aG9kIF9XQUsiKSk7CisJfQorCS8qIFRCRDogX1dBSyAic29tZXRpbWVzIiByZXR1cm5zIHN0dWZmIC0gZG8gd2Ugd2FudCB0byBsb29rIGF0IGl0PyAqLworCisJLyoKKwkgKiBTb21lIEJJT1NlcyBhc3N1bWUgdGhhdCBXQUtfU1RTIHdpbGwgYmUgY2xlYXJlZCBvbiByZXN1bWUgYW5kIHVzZQorCSAqIGl0IHRvIGRldGVybWluZSB3aGV0aGVyIHRoZSBzeXN0ZW0gaXMgcmVib290aW5nIG9yIHJlc3VtaW5nLiBDbGVhcgorCSAqIGl0IGZvciBjb21wYXRpYmlsaXR5LgorCSAqLworCWFjcGlfc2V0X3JlZ2lzdGVyKEFDUElfQklUUkVHX1dBS0VfU1RBVFVTLCAxKTsKKworCWFjcGlfZ2JsX3N5c3RlbV9hd2FrZV9hbmRfcnVubmluZyA9IFRSVUU7CisKKwkvKiBFbmFibGUgcG93ZXIgYnV0dG9uICovCisKKwkodm9pZCkKKwkgICAgYWNwaV9zZXRfcmVnaXN0ZXIoYWNwaV9nYmxfZml4ZWRfZXZlbnRfaW5mbworCQkJICAgICAgW0FDUElfRVZFTlRfUE9XRVJfQlVUVE9OXS5lbmFibGVfcmVnaXN0ZXJfaWQsIDEpOworCisJKHZvaWQpCisJICAgIGFjcGlfc2V0X3JlZ2lzdGVyKGFjcGlfZ2JsX2ZpeGVkX2V2ZW50X2luZm8KKwkJCSAgICAgIFtBQ1BJX0VWRU5UX1BPV0VSX0JVVFRPTl0uc3RhdHVzX3JlZ2lzdGVyX2lkLCAxKTsKKworCWFyZy5pbnRlZ2VyLnZhbHVlID0gQUNQSV9TU1RfV09SS0lORzsKKwlzdGF0dXMgPSBhY3BpX2V2YWx1YXRlX29iamVjdChOVUxMLCBNRVRIT0RfTkFNRV9fU1NULCAmYXJnX2xpc3QsIE5VTEwpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSAmJiBzdGF0dXMgIT0gQUVfTk9UX0ZPVU5EKSB7CisJCUFDUElfRVhDRVBUSU9OKChBRV9JTkZPLCBzdGF0dXMsICJEdXJpbmcgTWV0aG9kIF9TU1QiKSk7CisJfQorCisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Cit9CisKK0FDUElfRVhQT1JUX1NZTUJPTChhY3BpX2xlYXZlX3NsZWVwX3N0YXRlKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS9od3RpbWVyLmMgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2h3dGltZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iN2Y1MjJjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS9od3RpbWVyLmMKQEAgLTAsMCArMSwxODggQEAKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIE5hbWU6IGh3dGltZXIuYyAtIEFDUEkgUG93ZXIgTWFuYWdlbWVudCBUaW1lciBJbnRlcmZhY2UKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA4LCBJbnRlbCBDb3JwLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAorICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgYXQgbWluaW11bSBhIGRpc2NsYWltZXIKKyAqICAgIHN1YnN0YW50aWFsbHkgc2ltaWxhciB0byB0aGUgIk5PIFdBUlJBTlRZIiBkaXNjbGFpbWVyIGJlbG93CisgKiAgICAoIkRpc2NsYWltZXIiKSBhbmQgYW55IHJlZGlzdHJpYnV0aW9uIG11c3QgYmUgY29uZGl0aW9uZWQgdXBvbgorICogICAgaW5jbHVkaW5nIGEgc3Vic3RhbnRpYWxseSBzaW1pbGFyIERpc2NsYWltZXIgcmVxdWlyZW1lbnQgZm9yIGZ1cnRoZXIKKyAqICAgIGJpbmFyeSByZWRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcworICogICAgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBOTyBXQVJSQU5UWQorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcKKyAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgorICovCisKKyNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KKyNpbmNsdWRlICJhY2NvbW1vbi5oIgorCisjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9IQVJEV0FSRQorQUNQSV9NT0RVTEVfTkFNRSgiaHd0aW1lciIpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9nZXRfdGltZXJfcmVzb2x1dGlvbgorICoKKyAqIFBBUkFNRVRFUlM6ICBSZXNvbHV0aW9uICAgICAgICAgIC0gV2hlcmUgdGhlIHJlc29sdXRpb24gaXMgcmV0dXJuZWQKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzIGFuZCB0aW1lciByZXNvbHV0aW9uCisgKgorICogREVTQ1JJUFRJT046IE9idGFpbnMgcmVzb2x1dGlvbiBvZiB0aGUgQUNQSSBQTSBUaW1lciAoMjQgb3IgMzIgYml0cykuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2FjcGlfc3RhdHVzIGFjcGlfZ2V0X3RpbWVyX3Jlc29sdXRpb24odTMyICogcmVzb2x1dGlvbikKK3sKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGFjcGlfZ2V0X3RpbWVyX3Jlc29sdXRpb24pOworCisJaWYgKCFyZXNvbHV0aW9uKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfUEFSQU1FVEVSKTsKKwl9CisKKwlpZiAoKGFjcGlfZ2JsX0ZBRFQuZmxhZ3MgJiBBQ1BJX0ZBRFRfMzJCSVRfVElNRVIpID09IDApIHsKKwkJKnJlc29sdXRpb24gPSAyNDsKKwl9IGVsc2UgeworCQkqcmVzb2x1dGlvbiA9IDMyOworCX0KKworCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7Cit9CisKK0FDUElfRVhQT1JUX1NZTUJPTChhY3BpX2dldF90aW1lcl9yZXNvbHV0aW9uKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfZ2V0X3RpbWVyCisgKgorICogUEFSQU1FVEVSUzogIFRpY2tzICAgICAgICAgICAgICAgLSBXaGVyZSB0aGUgdGltZXIgdmFsdWUgaXMgcmV0dXJuZWQKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzIGFuZCBjdXJyZW50IHRpbWVyIHZhbHVlICh0aWNrcykKKyAqCisgKiBERVNDUklQVElPTjogT2J0YWlucyBjdXJyZW50IHZhbHVlIG9mIEFDUEkgUE0gVGltZXIgKGluIHRpY2tzKS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYWNwaV9zdGF0dXMgYWNwaV9nZXRfdGltZXIodTMyICogdGlja3MpCit7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCisJQUNQSV9GVU5DVElPTl9UUkFDRShhY3BpX2dldF90aW1lcik7CisKKwlpZiAoIXRpY2tzKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfUEFSQU1FVEVSKTsKKwl9CisKKwlzdGF0dXMgPQorCSAgICBhY3BpX2h3X2xvd19sZXZlbF9yZWFkKDMyLCB0aWNrcywgJmFjcGlfZ2JsX0ZBRFQueHBtX3RpbWVyX2Jsb2NrKTsKKworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworfQorCitBQ1BJX0VYUE9SVF9TWU1CT0woYWNwaV9nZXRfdGltZXIpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9nZXRfdGltZXJfZHVyYXRpb24KKyAqCisgKiBQQVJBTUVURVJTOiAgc3RhcnRfdGlja3MgICAgICAgICAtIFN0YXJ0aW5nIHRpbWVzdGFtcAorICogICAgICAgICAgICAgIGVuZF90aWNrcyAgICAgICAgICAgLSBFbmQgdGltZXN0YW1wCisgKiAgICAgICAgICAgICAgdGltZV9lbGFwc2VkICAgICAgICAtIFdoZXJlIHRoZSBlbGFwc2VkIHRpbWUgaXMgcmV0dXJuZWQKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzIGFuZCB0aW1lX2VsYXBzZWQKKyAqCisgKiBERVNDUklQVElPTjogQ29tcHV0ZXMgdGhlIHRpbWUgZWxhcHNlZCAoaW4gbWljcm9zZWNvbmRzKSBiZXR3ZWVuIHR3bworICogICAgICAgICAgICAgIFBNIFRpbWVyIHRpbWUgc3RhbXBzLCB0YWtpbmcgaW50byBhY2NvdW50IHRoZSBwb3NzaWJpbGl0eSBvZgorICogICAgICAgICAgICAgIHJvbGxvdmVycywgdGhlIHRpbWVyIHJlc29sdXRpb24sIGFuZCB0aW1lciBmcmVxdWVuY3kuCisgKgorICogICAgICAgICAgICAgIFRoZSBQTSBUaW1lcidzIGNsb2NrIHRpY2tzIGF0IHJvdWdobHkgMy42IHRpbWVzIHBlcgorICogICAgICAgICAgICAgIF9taWNyb3NlY29uZF8sIGFuZCBpdHMgY2xvY2sgY29udGludWVzIHRocm91Z2ggQ3ggc3RhdGUKKyAqICAgICAgICAgICAgICB0cmFuc2l0aW9ucyAodW5saWtlIG1hbnkgQ1BVIHRpbWVzdGFtcCBjb3VudGVycykgLS0gbWFraW5nIGl0CisgKiAgICAgICAgICAgICAgYSB2ZXJzYXRpbGUgYW5kIGFjY3VyYXRlIHRpbWVyLgorICoKKyAqICAgICAgICAgICAgICBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiBhY2NvbW1vZGF0ZXMgb25seSBhIHNpbmdsZSB0aW1lcgorICogICAgICAgICAgICAgIHJvbGxvdmVyLiAgVGh1cyBmb3IgMjQtYml0IHRpbWVycywgdGhpcyBmdW5jdGlvbiBzaG91bGQgb25seQorICogICAgICAgICAgICAgIGJlIHVzZWQgZm9yIGNhbGN1bGF0aW5nIGR1cmF0aW9ucyBsZXNzIHRoYW4gfjQuNiBzZWNvbmRzCisgKiAgICAgICAgICAgICAgKH4yMCBtaW51dGVzIGZvciAzMi1iaXQgdGltZXJzKSAtLSBjYWxjdWxhdGlvbnMgYmVsb3c6CisgKgorICogICAgICAgICAgICAgIDIqKjI0IFRpY2tzIC8gMyw2MDAsMDAwIFRpY2tzL1NlYyA9IDQuNjYgc2VjCisgKiAgICAgICAgICAgICAgMioqMzIgVGlja3MgLyAzLDYwMCwwMDAgVGlja3MvU2VjID0gMTE5MyBzZWMgb3IgMTkuODggbWludXRlcworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCithY3BpX3N0YXR1cworYWNwaV9nZXRfdGltZXJfZHVyYXRpb24odTMyIHN0YXJ0X3RpY2tzLCB1MzIgZW5kX3RpY2tzLCB1MzIgKiB0aW1lX2VsYXBzZWQpCit7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCXUzMiBkZWx0YV90aWNrczsKKwlhY3BpX2ludGVnZXIgcXVvdGllbnQ7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGFjcGlfZ2V0X3RpbWVyX2R1cmF0aW9uKTsKKworCWlmICghdGltZV9lbGFwc2VkKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfUEFSQU1FVEVSKTsKKwl9CisKKwkvKgorCSAqIENvbXB1dGUgVGljayBEZWx0YToKKwkgKiBIYW5kbGUgKG1heCBvbmUpIHRpbWVyIHJvbGxvdmVycyBvbiAyNC1iaXQgdmVyc3VzIDMyLWJpdCB0aW1lcnMuCisJICovCisJaWYgKHN0YXJ0X3RpY2tzIDwgZW5kX3RpY2tzKSB7CisJCWRlbHRhX3RpY2tzID0gZW5kX3RpY2tzIC0gc3RhcnRfdGlja3M7CisJfSBlbHNlIGlmIChzdGFydF90aWNrcyA+IGVuZF90aWNrcykgeworCQlpZiAoKGFjcGlfZ2JsX0ZBRFQuZmxhZ3MgJiBBQ1BJX0ZBRFRfMzJCSVRfVElNRVIpID09IDApIHsKKworCQkJLyogMjQtYml0IFRpbWVyICovCisKKwkJCWRlbHRhX3RpY2tzID0KKwkJCSAgICAoKCgweDAwRkZGRkZGIC0gc3RhcnRfdGlja3MpICsKKwkJCSAgICAgIGVuZF90aWNrcykgJiAweDAwRkZGRkZGKTsKKwkJfSBlbHNlIHsKKwkJCS8qIDMyLWJpdCBUaW1lciAqLworCisJCQlkZWx0YV90aWNrcyA9ICgweEZGRkZGRkZGIC0gc3RhcnRfdGlja3MpICsgZW5kX3RpY2tzOworCQl9CisJfSBlbHNlIHsJCS8qIHN0YXJ0X3RpY2tzID09IGVuZF90aWNrcyAqLworCisJCSp0aW1lX2VsYXBzZWQgPSAwOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOworCX0KKworCS8qCisJICogQ29tcHV0ZSBEdXJhdGlvbiAoUmVxdWlyZXMgYSA2NC1iaXQgbXVsdGlwbHkgYW5kIGRpdmlkZSk6CisJICoKKwkgKiB0aW1lX2VsYXBzZWQgPSAoZGVsdGFfdGlja3MgKiAxMDAwMDAwKSAvIFBNX1RJTUVSX0ZSRVFVRU5DWTsKKwkgKi8KKwlzdGF0dXMgPSBhY3BpX3V0X3Nob3J0X2RpdmlkZSgoKHU2NCkgZGVsdGFfdGlja3MpICogMTAwMDAwMCwKKwkJCQkgICAgICBQTV9USU1FUl9GUkVRVUVOQ1ksICZxdW90aWVudCwgTlVMTCk7CisKKwkqdGltZV9lbGFwc2VkID0gKHUzMikgcXVvdGllbnQ7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Cit9CisKK0FDUElfRVhQT1JUX1NZTUJPTChhY3BpX2dldF90aW1lcl9kdXJhdGlvbikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvaHd4ZmFjZS5jIGIvZHJpdmVycy9hY3BpL2FjcGljYS9od3hmYWNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWU1OTdjMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvaHd4ZmFjZS5jCkBAIC0wLDAgKzEsNTkzIEBACisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBNb2R1bGUgTmFtZTogaHd4ZmFjZSAtIFB1YmxpYyBBQ1BJQ0EgaGFyZHdhcmUgaW50ZXJmYWNlcworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDgsIEludGVsIENvcnAuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCisgKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSBhdCBtaW5pbXVtIGEgZGlzY2xhaW1lcgorICogICAgc3Vic3RhbnRpYWxseSBzaW1pbGFyIHRvIHRoZSAiTk8gV0FSUkFOVFkiIGRpc2NsYWltZXIgYmVsb3cKKyAqICAgICgiRGlzY2xhaW1lciIpIGFuZCBhbnkgcmVkaXN0cmlidXRpb24gbXVzdCBiZSBjb25kaXRpb25lZCB1cG9uCisgKiAgICBpbmNsdWRpbmcgYSBzdWJzdGFudGlhbGx5IHNpbWlsYXIgRGlzY2xhaW1lciByZXF1aXJlbWVudCBmb3IgZnVydGhlcgorICogICAgYmluYXJ5IHJlZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzCisgKiAgICBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIE5PIFdBUlJBTlRZCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORworICogSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCisgKi8KKworI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgorI2luY2x1ZGUgImFjY29tbW9uLmgiCisjaW5jbHVkZSAiYWNuYW1lc3AuaCIKKworI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfSEFSRFdBUkUKK0FDUElfTU9EVUxFX05BTUUoImh3eGZhY2UiKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfcmVzZXQKKyAqCisgKiBQQVJBTUVURVJTOiAgTm9uZQorICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogU2V0IHJlc2V0IHJlZ2lzdGVyIGluIG1lbW9yeSBvciBJTyBzcGFjZS4gTm90ZTogRG9lcyBub3QKKyAqICAgICAgICAgICAgICBzdXBwb3J0IHJlc2V0IHJlZ2lzdGVyIGluIFBDSSBjb25maWcgc3BhY2UsIHRoaXMgbXVzdCBiZQorICogICAgICAgICAgICAgIGhhbmRsZWQgc2VwYXJhdGVseS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYWNwaV9zdGF0dXMgYWNwaV9yZXNldCh2b2lkKQoreworCXN0cnVjdCBhY3BpX2dlbmVyaWNfYWRkcmVzcyAqcmVzZXRfcmVnOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0UoYWNwaV9yZXNldCk7CisKKwlyZXNldF9yZWcgPSAmYWNwaV9nYmxfRkFEVC5yZXNldF9yZWdpc3RlcjsKKworCS8qIENoZWNrIGlmIHRoZSByZXNldCByZWdpc3RlciBpcyBzdXBwb3J0ZWQgKi8KKworCWlmICghKGFjcGlfZ2JsX0ZBRFQuZmxhZ3MgJiBBQ1BJX0ZBRFRfUkVTRVRfUkVHSVNURVIpIHx8CisJICAgICFyZXNldF9yZWctPmFkZHJlc3MpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PVF9FWElTVCk7CisJfQorCisJLyogV3JpdGUgdGhlIHJlc2V0IHZhbHVlIHRvIHRoZSByZXNldCByZWdpc3RlciAqLworCisJc3RhdHVzID0gYWNwaV93cml0ZShhY3BpX2dibF9GQURULnJlc2V0X3ZhbHVlLCByZXNldF9yZWcpOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworfQorCitBQ1BJX0VYUE9SVF9TWU1CT0woYWNwaV9yZXNldCkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX3JlYWQKKyAqCisgKiBQQVJBTUVURVJTOiAgVmFsdWUgICAgICAgICAgICAgICAtIFdoZXJlIHRoZSB2YWx1ZSBpcyByZXR1cm5lZAorICogICAgICAgICAgICAgIFJlZyAgICAgICAgICAgICAgICAgLSBHQVMgcmVnaXN0ZXIgc3RydWN0dXJlCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBSZWFkIGZyb20gZWl0aGVyIG1lbW9yeSBvciBJTyBzcGFjZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYWNwaV9zdGF0dXMgYWNwaV9yZWFkKHUzMiAqdmFsdWUsIHN0cnVjdCBhY3BpX2dlbmVyaWNfYWRkcmVzcyAqcmVnKQoreworCXUzMiB3aWR0aDsKKwl1NjQgYWRkcmVzczsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisKKwlBQ1BJX0ZVTkNUSU9OX05BTUUoYWNwaV9yZWFkKTsKKworCS8qCisJICogTXVzdCBoYXZlIGEgdmFsaWQgcG9pbnRlciB0byBhIEdBUyBzdHJ1Y3R1cmUsIGFuZAorCSAqIGEgbm9uLXplcm8gYWRkcmVzcyB3aXRoaW4uIEhvd2V2ZXIsIGRvbid0IHJldHVybiBhbiBlcnJvcgorCSAqIGJlY2F1c2UgdGhlIFBNMUEvQiBjb2RlIG11c3Qgbm90IGZhaWwgaWYgQiBpc24ndCBwcmVzZW50LgorCSAqLworCWlmICghcmVnKSB7CisJCXJldHVybiAoQUVfT0spOworCX0KKworCS8qIEdldCBhIGxvY2FsIGNvcHkgb2YgdGhlIGFkZHJlc3MuIEhhbmRsZXMgcG9zc2libGUgYWxpZ25tZW50IGlzc3VlcyAqLworCisJQUNQSV9NT1ZFXzY0X1RPXzY0KCZhZGRyZXNzLCAmcmVnLT5hZGRyZXNzKTsKKwlpZiAoIWFkZHJlc3MpIHsKKwkJcmV0dXJuIChBRV9PSyk7CisJfQorCisJLyogU3VwcG9ydGVkIHdpZHRocyBhcmUgOC8xNi8zMiAqLworCisJd2lkdGggPSByZWctPmJpdF93aWR0aDsKKwlpZiAoKHdpZHRoICE9IDgpICYmICh3aWR0aCAhPSAxNikgJiYgKHdpZHRoICE9IDMyKSkgeworCQlyZXR1cm4gKEFFX1NVUFBPUlQpOworCX0KKworCS8qIEluaXRpYWxpemUgZW50aXJlIDMyLWJpdCByZXR1cm4gdmFsdWUgdG8gemVybyAqLworCisJKnZhbHVlID0gMDsKKworCS8qCisJICogVHdvIGFkZHJlc3Mgc3BhY2VzIHN1cHBvcnRlZDogTWVtb3J5IG9yIElPLgorCSAqIFBDSV9Db25maWcgaXMgbm90IHN1cHBvcnRlZCBoZXJlIGJlY2F1c2UgdGhlIEdBUyBzdHJ1Y3QgaXMgaW5zdWZmaWNpZW50CisJICovCisJc3dpdGNoIChyZWctPnNwYWNlX2lkKSB7CisJY2FzZSBBQ1BJX0FEUl9TUEFDRV9TWVNURU1fTUVNT1JZOgorCisJCXN0YXR1cyA9IGFjcGlfb3NfcmVhZF9tZW1vcnkoKGFjcGlfcGh5c2ljYWxfYWRkcmVzcykgYWRkcmVzcywKKwkJCQkJICAgICB2YWx1ZSwgd2lkdGgpOworCQlicmVhazsKKworCWNhc2UgQUNQSV9BRFJfU1BBQ0VfU1lTVEVNX0lPOgorCisJCXN0YXR1cyA9CisJCSAgICBhY3BpX29zX3JlYWRfcG9ydCgoYWNwaV9pb19hZGRyZXNzKSBhZGRyZXNzLCB2YWx1ZSwgd2lkdGgpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCUFDUElfRVJST1IoKEFFX0lORk8sCisJCQkgICAgIlVuc3VwcG9ydGVkIGFkZHJlc3Mgc3BhY2U6ICVYIiwgcmVnLT5zcGFjZV9pZCkpOworCQlyZXR1cm4gKEFFX0JBRF9QQVJBTUVURVIpOworCX0KKworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU8sCisJCQkgICJSZWFkOiAgJTguOFggd2lkdGggJTJkIGZyb20gJTguOFglOC44WCAoJXMpXG4iLAorCQkJICAqdmFsdWUsIHdpZHRoLCBBQ1BJX0ZPUk1BVF9VSU5UNjQoYWRkcmVzcyksCisJCQkgIGFjcGlfdXRfZ2V0X3JlZ2lvbl9uYW1lKHJlZy0+c3BhY2VfaWQpKSk7CisKKwlyZXR1cm4gKHN0YXR1cyk7Cit9CisKK0FDUElfRVhQT1JUX1NZTUJPTChhY3BpX3JlYWQpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV93cml0ZQorICoKKyAqIFBBUkFNRVRFUlM6ICBWYWx1ZSAgICAgICAgICAgICAgIC0gVG8gYmUgd3JpdHRlbgorICogICAgICAgICAgICAgIFJlZyAgICAgICAgICAgICAgICAgLSBHQVMgcmVnaXN0ZXIgc3RydWN0dXJlCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBXcml0ZSB0byBlaXRoZXIgbWVtb3J5IG9yIElPIHNwYWNlLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCithY3BpX3N0YXR1cyBhY3BpX3dyaXRlKHUzMiB2YWx1ZSwgc3RydWN0IGFjcGlfZ2VuZXJpY19hZGRyZXNzICpyZWcpCit7CisJdTMyIHdpZHRoOworCXU2NCBhZGRyZXNzOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKworCUFDUElfRlVOQ1RJT05fTkFNRShhY3BpX3dyaXRlKTsKKworCS8qCisJICogTXVzdCBoYXZlIGEgdmFsaWQgcG9pbnRlciB0byBhIEdBUyBzdHJ1Y3R1cmUsIGFuZAorCSAqIGEgbm9uLXplcm8gYWRkcmVzcyB3aXRoaW4uIEhvd2V2ZXIsIGRvbid0IHJldHVybiBhbiBlcnJvcgorCSAqIGJlY2F1c2UgdGhlIFBNMUEvQiBjb2RlIG11c3Qgbm90IGZhaWwgaWYgQiBpc24ndCBwcmVzZW50LgorCSAqLworCWlmICghcmVnKSB7CisJCXJldHVybiAoQUVfT0spOworCX0KKworCS8qIEdldCBhIGxvY2FsIGNvcHkgb2YgdGhlIGFkZHJlc3MuIEhhbmRsZXMgcG9zc2libGUgYWxpZ25tZW50IGlzc3VlcyAqLworCisJQUNQSV9NT1ZFXzY0X1RPXzY0KCZhZGRyZXNzLCAmcmVnLT5hZGRyZXNzKTsKKwlpZiAoIWFkZHJlc3MpIHsKKwkJcmV0dXJuIChBRV9PSyk7CisJfQorCisJLyogU3VwcG9ydGVkIHdpZHRocyBhcmUgOC8xNi8zMiAqLworCisJd2lkdGggPSByZWctPmJpdF93aWR0aDsKKwlpZiAoKHdpZHRoICE9IDgpICYmICh3aWR0aCAhPSAxNikgJiYgKHdpZHRoICE9IDMyKSkgeworCQlyZXR1cm4gKEFFX1NVUFBPUlQpOworCX0KKworCS8qCisJICogVHdvIGFkZHJlc3Mgc3BhY2VzIHN1cHBvcnRlZDogTWVtb3J5IG9yIElPLgorCSAqIFBDSV9Db25maWcgaXMgbm90IHN1cHBvcnRlZCBoZXJlIGJlY2F1c2UgdGhlIEdBUyBzdHJ1Y3QgaXMgaW5zdWZmaWNpZW50CisJICovCisJc3dpdGNoIChyZWctPnNwYWNlX2lkKSB7CisJY2FzZSBBQ1BJX0FEUl9TUEFDRV9TWVNURU1fTUVNT1JZOgorCisJCXN0YXR1cyA9IGFjcGlfb3Nfd3JpdGVfbWVtb3J5KChhY3BpX3BoeXNpY2FsX2FkZHJlc3MpIGFkZHJlc3MsCisJCQkJCSAgICAgIHZhbHVlLCB3aWR0aCk7CisJCWJyZWFrOworCisJY2FzZSBBQ1BJX0FEUl9TUEFDRV9TWVNURU1fSU86CisKKwkJc3RhdHVzID0gYWNwaV9vc193cml0ZV9wb3J0KChhY3BpX2lvX2FkZHJlc3MpIGFkZHJlc3MsIHZhbHVlLAorCQkJCQkgICAgd2lkdGgpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCUFDUElfRVJST1IoKEFFX0lORk8sCisJCQkgICAgIlVuc3VwcG9ydGVkIGFkZHJlc3Mgc3BhY2U6ICVYIiwgcmVnLT5zcGFjZV9pZCkpOworCQlyZXR1cm4gKEFFX0JBRF9QQVJBTUVURVIpOworCX0KKworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU8sCisJCQkgICJXcm90ZTogJTguOFggd2lkdGggJTJkICAgdG8gJTguOFglOC44WCAoJXMpXG4iLAorCQkJICB2YWx1ZSwgd2lkdGgsIEFDUElfRk9STUFUX1VJTlQ2NChhZGRyZXNzKSwKKwkJCSAgYWNwaV91dF9nZXRfcmVnaW9uX25hbWUocmVnLT5zcGFjZV9pZCkpKTsKKworCXJldHVybiAoc3RhdHVzKTsKK30KKworQUNQSV9FWFBPUlRfU1lNQk9MKGFjcGlfd3JpdGUpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfZ2V0X3JlZ2lzdGVyX3VubG9ja2VkCisgKgorICogUEFSQU1FVEVSUzogIHJlZ2lzdGVyX2lkICAgICAtIElEIG9mIEFDUEkgYml0X3JlZ2lzdGVyIHRvIGFjY2VzcworICogICAgICAgICAgICAgIHJldHVybl92YWx1ZSAgICAtIFZhbHVlIHRoYXQgd2FzIHJlYWQgZnJvbSB0aGUgcmVnaXN0ZXIKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzIGFuZCB0aGUgdmFsdWUgcmVhZCBmcm9tIHNwZWNpZmllZCBSZWdpc3Rlci4gVmFsdWUKKyAqICAgICAgICAgICAgICByZXR1cm5lZCBpcyBub3JtYWxpemVkIHRvIGJpdDAgKGlzIHNoaWZ0ZWQgYWxsIHRoZSB3YXkgcmlnaHQpCisgKgorICogREVTQ1JJUFRJT046IEFDUEkgYml0X3JlZ2lzdGVyIHJlYWQgZnVuY3Rpb24uIERvZXMgbm90IGFjcXVpcmUgdGhlIEhXIGxvY2suCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2FjcGlfc3RhdHVzIGFjcGlfZ2V0X3JlZ2lzdGVyX3VubG9ja2VkKHUzMiByZWdpc3Rlcl9pZCwgdTMyICpyZXR1cm5fdmFsdWUpCit7CisJdTMyIHJlZ2lzdGVyX3ZhbHVlID0gMDsKKwlzdHJ1Y3QgYWNwaV9iaXRfcmVnaXN0ZXJfaW5mbyAqYml0X3JlZ19pbmZvOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0UoYWNwaV9nZXRfcmVnaXN0ZXJfdW5sb2NrZWQpOworCisJLyogR2V0IHRoZSBpbmZvIHN0cnVjdHVyZSBjb3JyZXNwb25kaW5nIHRvIHRoZSByZXF1ZXN0ZWQgQUNQSSBSZWdpc3RlciAqLworCisJYml0X3JlZ19pbmZvID0gYWNwaV9od19nZXRfYml0X3JlZ2lzdGVyX2luZm8ocmVnaXN0ZXJfaWQpOworCWlmICghYml0X3JlZ19pbmZvKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfUEFSQU1FVEVSKTsKKwl9CisKKwkvKiBSZWFkIGZyb20gdGhlIHJlZ2lzdGVyICovCisKKwlzdGF0dXMgPSBhY3BpX2h3X3JlZ2lzdGVyX3JlYWQoYml0X3JlZ19pbmZvLT5wYXJlbnRfcmVnaXN0ZXIsCisJCQkJICAgICAgICZyZWdpc3Rlcl92YWx1ZSk7CisKKwlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpIHsKKworCQkvKiBOb3JtYWxpemUgdGhlIHZhbHVlIHRoYXQgd2FzIHJlYWQgKi8KKworCQlyZWdpc3Rlcl92YWx1ZSA9CisJCSAgICAoKHJlZ2lzdGVyX3ZhbHVlICYgYml0X3JlZ19pbmZvLT5hY2Nlc3NfYml0X21hc2spCisJCSAgICAgPj4gYml0X3JlZ19pbmZvLT5iaXRfcG9zaXRpb24pOworCisJCSpyZXR1cm5fdmFsdWUgPSByZWdpc3Rlcl92YWx1ZTsKKworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lPLCAiUmVhZCB2YWx1ZSAlOC44WCByZWdpc3RlciAlWFxuIiwKKwkJCQkgIHJlZ2lzdGVyX3ZhbHVlLAorCQkJCSAgYml0X3JlZ19pbmZvLT5wYXJlbnRfcmVnaXN0ZXIpKTsKKwl9CisKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKK30KKworQUNQSV9FWFBPUlRfU1lNQk9MKGFjcGlfZ2V0X3JlZ2lzdGVyX3VubG9ja2VkKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX2dldF9yZWdpc3RlcgorICoKKyAqIFBBUkFNRVRFUlM6ICByZWdpc3Rlcl9pZCAgICAgLSBJRCBvZiBBQ1BJIGJpdF9yZWdpc3RlciB0byBhY2Nlc3MKKyAqICAgICAgICAgICAgICByZXR1cm5fdmFsdWUgICAgLSBWYWx1ZSB0aGF0IHdhcyByZWFkIGZyb20gdGhlIHJlZ2lzdGVyCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cyBhbmQgdGhlIHZhbHVlIHJlYWQgZnJvbSBzcGVjaWZpZWQgUmVnaXN0ZXIuIFZhbHVlCisgKiAgICAgICAgICAgICAgcmV0dXJuZWQgaXMgbm9ybWFsaXplZCB0byBiaXQwIChpcyBzaGlmdGVkIGFsbCB0aGUgd2F5IHJpZ2h0KQorICoKKyAqIERFU0NSSVBUSU9OOiBBQ1BJIGJpdF9yZWdpc3RlciByZWFkIGZ1bmN0aW9uLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCithY3BpX3N0YXR1cyBhY3BpX2dldF9yZWdpc3Rlcih1MzIgcmVnaXN0ZXJfaWQsIHUzMiAqcmV0dXJuX3ZhbHVlKQoreworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwlhY3BpX2NwdV9mbGFncyBmbGFnczsKKworCWZsYWdzID0gYWNwaV9vc19hY3F1aXJlX2xvY2soYWNwaV9nYmxfaGFyZHdhcmVfbG9jayk7CisJc3RhdHVzID0gYWNwaV9nZXRfcmVnaXN0ZXJfdW5sb2NrZWQocmVnaXN0ZXJfaWQsIHJldHVybl92YWx1ZSk7CisJYWNwaV9vc19yZWxlYXNlX2xvY2soYWNwaV9nYmxfaGFyZHdhcmVfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIChzdGF0dXMpOworfQorCitBQ1BJX0VYUE9SVF9TWU1CT0woYWNwaV9nZXRfcmVnaXN0ZXIpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfc2V0X3JlZ2lzdGVyCisgKgorICogUEFSQU1FVEVSUzogIHJlZ2lzdGVyX2lkICAgICAtIElEIG9mIEFDUEkgYml0X3JlZ2lzdGVyIHRvIGFjY2VzcworICogICAgICAgICAgICAgIFZhbHVlICAgICAgICAgICAtIChvbmx5IHVzZWQgb24gd3JpdGUpIHZhbHVlIHRvIHdyaXRlIHRvIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZ2lzdGVyLCBOT1QgcHJlLW5vcm1hbGl6ZWQgdG8gdGhlIGJpdCBwb3MKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IEFDUEkgQml0IFJlZ2lzdGVyIHdyaXRlIGZ1bmN0aW9uLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCithY3BpX3N0YXR1cyBhY3BpX3NldF9yZWdpc3Rlcih1MzIgcmVnaXN0ZXJfaWQsIHUzMiB2YWx1ZSkKK3sKKwl1MzIgcmVnaXN0ZXJfdmFsdWUgPSAwOworCXN0cnVjdCBhY3BpX2JpdF9yZWdpc3Rlcl9pbmZvICpiaXRfcmVnX2luZm87CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCWFjcGlfY3B1X2ZsYWdzIGxvY2tfZmxhZ3M7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1UzMihhY3BpX3NldF9yZWdpc3RlciwgcmVnaXN0ZXJfaWQpOworCisJLyogR2V0IHRoZSBpbmZvIHN0cnVjdHVyZSBjb3JyZXNwb25kaW5nIHRvIHRoZSByZXF1ZXN0ZWQgQUNQSSBSZWdpc3RlciAqLworCisJYml0X3JlZ19pbmZvID0gYWNwaV9od19nZXRfYml0X3JlZ2lzdGVyX2luZm8ocmVnaXN0ZXJfaWQpOworCWlmICghYml0X3JlZ19pbmZvKSB7CisJCUFDUElfRVJST1IoKEFFX0lORk8sICJCYWQgQUNQSSBIVyBSZWdpc3RlcklkOiAlWCIsCisJCQkgICAgcmVnaXN0ZXJfaWQpKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9QQVJBTUVURVIpOworCX0KKworCWxvY2tfZmxhZ3MgPSBhY3BpX29zX2FjcXVpcmVfbG9jayhhY3BpX2dibF9oYXJkd2FyZV9sb2NrKTsKKworCS8qIEFsd2F5cyBkbyBhIHJlZ2lzdGVyIHJlYWQgZmlyc3Qgc28gd2UgY2FuIGluc2VydCB0aGUgbmV3IGJpdHMgICovCisKKwlzdGF0dXMgPSBhY3BpX2h3X3JlZ2lzdGVyX3JlYWQoYml0X3JlZ19pbmZvLT5wYXJlbnRfcmVnaXN0ZXIsCisJCQkJICAgICAgICZyZWdpc3Rlcl92YWx1ZSk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCWdvdG8gdW5sb2NrX2FuZF9leGl0OworCX0KKworCS8qCisJICogRGVjb2RlIHRoZSBSZWdpc3RlciBJRAorCSAqIFJlZ2lzdGVyIElEID0gW1JlZ2lzdGVyIGJsb2NrIElEXSB8IFtiaXQgSURdCisJICoKKwkgKiBDaGVjayBiaXQgSUQgdG8gZmluZSBsb2NhdGUgUmVnaXN0ZXIgb2Zmc2V0LgorCSAqIENoZWNrIE1hc2sgdG8gZGV0ZXJtaW5lIFJlZ2lzdGVyIG9mZnNldCwgYW5kIHRoZW4gcmVhZC13cml0ZS4KKwkgKi8KKwlzd2l0Y2ggKGJpdF9yZWdfaW5mby0+cGFyZW50X3JlZ2lzdGVyKSB7CisJY2FzZSBBQ1BJX1JFR0lTVEVSX1BNMV9TVEFUVVM6CisKKwkJLyoKKwkJICogU3RhdHVzIFJlZ2lzdGVycyBhcmUgZGlmZmVyZW50IGZyb20gdGhlIHJlc3QuIENsZWFyIGJ5CisJCSAqIHdyaXRpbmcgMSwgYW5kIHdyaXRpbmcgMCBoYXMgbm8gZWZmZWN0LiBTbywgdGhlIG9ubHkgcmVsZXZhbnQKKwkJICogaW5mb3JtYXRpb24gaXMgdGhlIHNpbmdsZSBiaXQgd2UncmUgaW50ZXJlc3RlZCBpbiwgYWxsIG90aGVycyBzaG91bGQKKwkJICogYmUgd3JpdHRlbiBhcyAwIHNvIHRoZXkgd2lsbCBiZSBsZWZ0IHVuY2hhbmdlZC4KKwkJICovCisJCXZhbHVlID0gQUNQSV9SRUdJU1RFUl9QUkVQQVJFX0JJVFModmFsdWUsCisJCQkJCQkgICBiaXRfcmVnX2luZm8tPmJpdF9wb3NpdGlvbiwKKwkJCQkJCSAgIGJpdF9yZWdfaW5mby0+CisJCQkJCQkgICBhY2Nlc3NfYml0X21hc2spOworCQlpZiAodmFsdWUpIHsKKwkJCXN0YXR1cyA9CisJCQkgICAgYWNwaV9od19yZWdpc3Rlcl93cml0ZShBQ1BJX1JFR0lTVEVSX1BNMV9TVEFUVVMsCisJCQkJCQkgICAodTE2KSB2YWx1ZSk7CisJCQlyZWdpc3Rlcl92YWx1ZSA9IDA7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIEFDUElfUkVHSVNURVJfUE0xX0VOQUJMRToKKworCQlBQ1BJX1JFR0lTVEVSX0lOU0VSVF9WQUxVRShyZWdpc3Rlcl92YWx1ZSwKKwkJCQkJICAgYml0X3JlZ19pbmZvLT5iaXRfcG9zaXRpb24sCisJCQkJCSAgIGJpdF9yZWdfaW5mby0+YWNjZXNzX2JpdF9tYXNrLAorCQkJCQkgICB2YWx1ZSk7CisKKwkJc3RhdHVzID0gYWNwaV9od19yZWdpc3Rlcl93cml0ZShBQ1BJX1JFR0lTVEVSX1BNMV9FTkFCTEUsCisJCQkJCQkodTE2KSByZWdpc3Rlcl92YWx1ZSk7CisJCWJyZWFrOworCisJY2FzZSBBQ1BJX1JFR0lTVEVSX1BNMV9DT05UUk9MOgorCisJCS8qCisJCSAqIFdyaXRlIHRoZSBQTTEgQ29udHJvbCByZWdpc3Rlci4KKwkJICogTm90ZSB0aGF0IGF0IHRoaXMgbGV2ZWwsIHRoZSBmYWN0IHRoYXQgdGhlcmUgYXJlIGFjdHVhbGx5IFRXTworCQkgKiByZWdpc3RlcnMgKEEgYW5kIEIgLSBhbmQgQiBtYXkgbm90IGV4aXN0KSBpcyBhYnN0cmFjdGVkLgorCQkgKi8KKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTywgIlBNMSBjb250cm9sOiBSZWFkICVYXG4iLAorCQkJCSAgcmVnaXN0ZXJfdmFsdWUpKTsKKworCQlBQ1BJX1JFR0lTVEVSX0lOU0VSVF9WQUxVRShyZWdpc3Rlcl92YWx1ZSwKKwkJCQkJICAgYml0X3JlZ19pbmZvLT5iaXRfcG9zaXRpb24sCisJCQkJCSAgIGJpdF9yZWdfaW5mby0+YWNjZXNzX2JpdF9tYXNrLAorCQkJCQkgICB2YWx1ZSk7CisKKwkJc3RhdHVzID0gYWNwaV9od19yZWdpc3Rlcl93cml0ZShBQ1BJX1JFR0lTVEVSX1BNMV9DT05UUk9MLAorCQkJCQkJKHUxNikgcmVnaXN0ZXJfdmFsdWUpOworCQlicmVhazsKKworCWNhc2UgQUNQSV9SRUdJU1RFUl9QTTJfQ09OVFJPTDoKKworCQlzdGF0dXMgPSBhY3BpX2h3X3JlZ2lzdGVyX3JlYWQoQUNQSV9SRUdJU1RFUl9QTTJfQ09OVFJPTCwKKwkJCQkJICAgICAgICZyZWdpc3Rlcl92YWx1ZSk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJZ290byB1bmxvY2tfYW5kX2V4aXQ7CisJCX0KKworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lPLAorCQkJCSAgIlBNMiBjb250cm9sOiBSZWFkICVYIGZyb20gJTguOFglOC44WFxuIiwKKwkJCQkgIHJlZ2lzdGVyX3ZhbHVlLAorCQkJCSAgQUNQSV9GT1JNQVRfVUlOVDY0KGFjcGlfZ2JsX0ZBRFQuCisJCQkJCQkgICAgIHhwbTJfY29udHJvbF9ibG9jay4KKwkJCQkJCSAgICAgYWRkcmVzcykpKTsKKworCQlBQ1BJX1JFR0lTVEVSX0lOU0VSVF9WQUxVRShyZWdpc3Rlcl92YWx1ZSwKKwkJCQkJICAgYml0X3JlZ19pbmZvLT5iaXRfcG9zaXRpb24sCisJCQkJCSAgIGJpdF9yZWdfaW5mby0+YWNjZXNzX2JpdF9tYXNrLAorCQkJCQkgICB2YWx1ZSk7CisKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTywKKwkJCQkgICJBYm91dCB0byB3cml0ZSAlNC40WCB0byAlOC44WCU4LjhYXG4iLAorCQkJCSAgcmVnaXN0ZXJfdmFsdWUsCisJCQkJICBBQ1BJX0ZPUk1BVF9VSU5UNjQoYWNwaV9nYmxfRkFEVC4KKwkJCQkJCSAgICAgeHBtMl9jb250cm9sX2Jsb2NrLgorCQkJCQkJICAgICBhZGRyZXNzKSkpOworCisJCXN0YXR1cyA9IGFjcGlfaHdfcmVnaXN0ZXJfd3JpdGUoQUNQSV9SRUdJU1RFUl9QTTJfQ09OVFJPTCwKKwkJCQkJCSh1OCkgKHJlZ2lzdGVyX3ZhbHVlKSk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisgICAgICB1bmxvY2tfYW5kX2V4aXQ6CisKKwlhY3BpX29zX3JlbGVhc2VfbG9jayhhY3BpX2dibF9oYXJkd2FyZV9sb2NrLCBsb2NrX2ZsYWdzKTsKKworCS8qIE5vcm1hbGl6ZSB0aGUgdmFsdWUgdGhhdCB3YXMgcmVhZCAqLworCisJQUNQSV9ERUJVR19FWEVDKHJlZ2lzdGVyX3ZhbHVlID0KKwkJCSgocmVnaXN0ZXJfdmFsdWUgJiBiaXRfcmVnX2luZm8tPmFjY2Vzc19iaXRfbWFzaykgPj4KKwkJCSBiaXRfcmVnX2luZm8tPmJpdF9wb3NpdGlvbikpOworCisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTywKKwkJCSAgIlNldCBiaXRzOiAlOC44WCBhY3R1YWwgJTguOFggcmVnaXN0ZXIgJVhcbiIsIHZhbHVlLAorCQkJICByZWdpc3Rlcl92YWx1ZSwgYml0X3JlZ19pbmZvLT5wYXJlbnRfcmVnaXN0ZXIpKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKK30KKworQUNQSV9FWFBPUlRfU1lNQk9MKGFjcGlfc2V0X3JlZ2lzdGVyKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX2dldF9zbGVlcF90eXBlX2RhdGEKKyAqCisgKiBQQVJBTUVURVJTOiAgc2xlZXBfc3RhdGUgICAgICAgICAtIE51bWVyaWMgc2xlZXAgc3RhdGUKKyAqICAgICAgICAgICAgICAqc2xlZXBfdHlwZV9hICAgICAgICAtIFdoZXJlIFNMUF9UWVBhIGlzIHJldHVybmVkCisgKiAgICAgICAgICAgICAgKnNsZWVwX3R5cGVfYiAgICAgICAgLSBXaGVyZSBTTFBfVFlQYiBpcyByZXR1cm5lZAorICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMgLSBBQ1BJIHN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBPYnRhaW4gdGhlIFNMUF9UWVBhIGFuZCBTTFBfVFlQYiB2YWx1ZXMgZm9yIHRoZSByZXF1ZXN0ZWQgc2xlZXAKKyAqICAgICAgICAgICAgICBzdGF0ZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYWNwaV9zdGF0dXMKK2FjcGlfZ2V0X3NsZWVwX3R5cGVfZGF0YSh1OCBzbGVlcF9zdGF0ZSwgdTggKnNsZWVwX3R5cGVfYSwgdTggKnNsZWVwX3R5cGVfYikKK3sKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKKwlzdHJ1Y3QgYWNwaV9ldmFsdWF0ZV9pbmZvICppbmZvOworCisJQUNQSV9GVU5DVElPTl9UUkFDRShhY3BpX2dldF9zbGVlcF90eXBlX2RhdGEpOworCisJLyogVmFsaWRhdGUgcGFyYW1ldGVycyAqLworCisJaWYgKChzbGVlcF9zdGF0ZSA+IEFDUElfU19TVEFURVNfTUFYKSB8fCAhc2xlZXBfdHlwZV9hIHx8ICFzbGVlcF90eXBlX2IpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9QQVJBTUVURVIpOworCX0KKworCS8qIEFsbG9jYXRlIHRoZSBldmFsdWF0aW9uIGluZm9ybWF0aW9uIGJsb2NrICovCisKKwlpbmZvID0gQUNQSV9BTExPQ0FURV9aRVJPRUQoc2l6ZW9mKHN0cnVjdCBhY3BpX2V2YWx1YXRlX2luZm8pKTsKKwlpZiAoIWluZm8pIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX01FTU9SWSk7CisJfQorCisJaW5mby0+cGF0aG5hbWUgPQorCSAgICBBQ1BJX0NBU1RfUFRSKGNoYXIsIGFjcGlfZ2JsX3NsZWVwX3N0YXRlX25hbWVzW3NsZWVwX3N0YXRlXSk7CisKKwkvKiBFdmFsdWF0ZSB0aGUgbmFtZXNwYWNlIG9iamVjdCBjb250YWluaW5nIHRoZSB2YWx1ZXMgZm9yIHRoaXMgc3RhdGUgKi8KKworCXN0YXR1cyA9IGFjcGlfbnNfZXZhbHVhdGUoaW5mbyk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVhFQywKKwkJCQkgICIlcyB3aGlsZSBldmFsdWF0aW5nIFNsZWVwU3RhdGUgWyVzXVxuIiwKKwkJCQkgIGFjcGlfZm9ybWF0X2V4Y2VwdGlvbihzdGF0dXMpLAorCQkJCSAgaW5mby0+cGF0aG5hbWUpKTsKKworCQlnb3RvIGNsZWFudXA7CisJfQorCisJLyogTXVzdCBoYXZlIGEgcmV0dXJuIG9iamVjdCAqLworCisJaWYgKCFpbmZvLT5yZXR1cm5fb2JqZWN0KSB7CisJCUFDUElfRVJST1IoKEFFX0lORk8sICJObyBTbGVlcCBTdGF0ZSBvYmplY3QgcmV0dXJuZWQgZnJvbSBbJXNdIiwKKwkJCSAgICBpbmZvLT5wYXRobmFtZSkpOworCQlzdGF0dXMgPSBBRV9OT1RfRVhJU1Q7CisJfQorCisJLyogSXQgbXVzdCBiZSBvZiB0eXBlIFBhY2thZ2UgKi8KKworCWVsc2UgaWYgKEFDUElfR0VUX09CSkVDVF9UWVBFKGluZm8tPnJldHVybl9vYmplY3QpICE9IEFDUElfVFlQRV9QQUNLQUdFKSB7CisJCUFDUElfRVJST1IoKEFFX0lORk8sCisJCQkgICAgIlNsZWVwIFN0YXRlIHJldHVybiBvYmplY3QgaXMgbm90IGEgUGFja2FnZSIpKTsKKwkJc3RhdHVzID0gQUVfQU1MX09QRVJBTkRfVFlQRTsKKwl9CisKKwkvKgorCSAqIFRoZSBwYWNrYWdlIG11c3QgaGF2ZSBhdCBsZWFzdCB0d28gZWxlbWVudHMuIE5PVEUgKE1hcmNoIDIwMDUpOiBUaGlzCisJICogZ29lcyBhZ2FpbnN0IHRoZSBjdXJyZW50IEFDUEkgc3BlYyB3aGljaCBkZWZpbmVzIHRoaXMgb2JqZWN0IGFzIGEKKwkgKiBwYWNrYWdlIHdpdGggb25lIGVuY29kZWQgRFdPUkQgZWxlbWVudC4gSG93ZXZlciwgZXhpc3RpbmcgcHJhY3RpY2UKKwkgKiBieSBCSU9TIHZlbmRvcnMgc2VlbXMgdG8gYmUgdG8gaGF2ZSAyIG9yIG1vcmUgZWxlbWVudHMsIGF0IGxlYXN0CisJICogb25lIHBlciBzbGVlcCB0eXBlIChBL0IpLgorCSAqLworCWVsc2UgaWYgKGluZm8tPnJldHVybl9vYmplY3QtPnBhY2thZ2UuY291bnQgPCAyKSB7CisJCUFDUElfRVJST1IoKEFFX0lORk8sCisJCQkgICAgIlNsZWVwIFN0YXRlIHJldHVybiBwYWNrYWdlIGRvZXMgbm90IGhhdmUgYXQgbGVhc3QgdHdvIGVsZW1lbnRzIikpOworCQlzdGF0dXMgPSBBRV9BTUxfTk9fT1BFUkFORDsKKwl9CisKKwkvKiBUaGUgZmlyc3QgdHdvIGVsZW1lbnRzIG11c3QgYm90aCBiZSBvZiB0eXBlIEludGVnZXIgKi8KKworCWVsc2UgaWYgKChBQ1BJX0dFVF9PQkpFQ1RfVFlQRShpbmZvLT5yZXR1cm5fb2JqZWN0LT5wYWNrYWdlLmVsZW1lbnRzWzBdKQorCQkgICE9IEFDUElfVFlQRV9JTlRFR0VSKSB8fAorCQkgKEFDUElfR0VUX09CSkVDVF9UWVBFKGluZm8tPnJldHVybl9vYmplY3QtPnBhY2thZ2UuZWxlbWVudHNbMV0pCisJCSAgIT0gQUNQSV9UWVBFX0lOVEVHRVIpKSB7CisJCUFDUElfRVJST1IoKEFFX0lORk8sCisJCQkgICAgIlNsZWVwIFN0YXRlIHJldHVybiBwYWNrYWdlIGVsZW1lbnRzIGFyZSBub3QgYm90aCBJbnRlZ2VycyAoJXMsICVzKSIsCisJCQkgICAgYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZShpbmZvLT5yZXR1cm5fb2JqZWN0LT4KKwkJCQkJCQkgcGFja2FnZS5lbGVtZW50c1swXSksCisJCQkgICAgYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZShpbmZvLT5yZXR1cm5fb2JqZWN0LT4KKwkJCQkJCQkgcGFja2FnZS5lbGVtZW50c1sxXSkpKTsKKwkJc3RhdHVzID0gQUVfQU1MX09QRVJBTkRfVFlQRTsKKwl9IGVsc2UgeworCQkvKiBWYWxpZCBfU3hfIHBhY2thZ2Ugc2l6ZSwgdHlwZSwgYW5kIHZhbHVlICovCisKKwkJKnNsZWVwX3R5cGVfYSA9ICh1OCkKKwkJICAgIChpbmZvLT5yZXR1cm5fb2JqZWN0LT5wYWNrYWdlLmVsZW1lbnRzWzBdKS0+aW50ZWdlci52YWx1ZTsKKwkJKnNsZWVwX3R5cGVfYiA9ICh1OCkKKwkJICAgIChpbmZvLT5yZXR1cm5fb2JqZWN0LT5wYWNrYWdlLmVsZW1lbnRzWzFdKS0+aW50ZWdlci52YWx1ZTsKKwl9CisKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJQUNQSV9FWENFUFRJT04oKEFFX0lORk8sIHN0YXR1cywKKwkJCQkiV2hpbGUgZXZhbHVhdGluZyBTbGVlcFN0YXRlIFslc10sIGJhZCBTbGVlcCBvYmplY3QgJXAgdHlwZSAlcyIsCisJCQkJaW5mby0+cGF0aG5hbWUsIGluZm8tPnJldHVybl9vYmplY3QsCisJCQkJYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZShpbmZvLT4KKwkJCQkJCQkgICAgIHJldHVybl9vYmplY3QpKSk7CisJfQorCisJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKGluZm8tPnJldHVybl9vYmplY3QpOworCisgICAgICBjbGVhbnVwOgorCUFDUElfRlJFRShpbmZvKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKK30KKworQUNQSV9FWFBPUlRfU1lNQk9MKGFjcGlfZ2V0X3NsZWVwX3R5cGVfZGF0YSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvbnNhY2Nlc3MuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvbnNhY2Nlc3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODMwM2ViCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS9uc2FjY2Vzcy5jCkBAIC0wLDAgKzEsNjc2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIE1vZHVsZSBOYW1lOiBuc2FjY2VzcyAtIFRvcC1sZXZlbCBmdW5jdGlvbnMgZm9yIGFjY2Vzc2luZyBBQ1BJIG5hbWVzcGFjZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA4LCBJbnRlbCBDb3JwLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAorICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgYXQgbWluaW11bSBhIGRpc2NsYWltZXIKKyAqICAgIHN1YnN0YW50aWFsbHkgc2ltaWxhciB0byB0aGUgIk5PIFdBUlJBTlRZIiBkaXNjbGFpbWVyIGJlbG93CisgKiAgICAoIkRpc2NsYWltZXIiKSBhbmQgYW55IHJlZGlzdHJpYnV0aW9uIG11c3QgYmUgY29uZGl0aW9uZWQgdXBvbgorICogICAgaW5jbHVkaW5nIGEgc3Vic3RhbnRpYWxseSBzaW1pbGFyIERpc2NsYWltZXIgcmVxdWlyZW1lbnQgZm9yIGZ1cnRoZXIKKyAqICAgIGJpbmFyeSByZWRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcworICogICAgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBOTyBXQVJSQU5UWQorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcKKyAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgorICovCisKKyNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KKyNpbmNsdWRlICJhY2NvbW1vbi5oIgorI2luY2x1ZGUgImFtbGNvZGUuaCIKKyNpbmNsdWRlICJhY25hbWVzcC5oIgorI2luY2x1ZGUgImFjZGlzcGF0LmgiCisKKyNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX05BTUVTUEFDRQorQUNQSV9NT0RVTEVfTkFNRSgibnNhY2Nlc3MiKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX25zX3Jvb3RfaW5pdGlhbGl6ZQorICoKKyAqIFBBUkFNRVRFUlM6ICBOb25lCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSB0aGUgZGVmYXVsdCByb290IG5hbWVkIG9iamVjdHMKKyAqCisgKiBNVVRFWDogICAgICAgTG9ja3MgbmFtZXNwYWNlIGZvciBlbnRpcmUgZXhlY3V0aW9uCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2FjcGlfc3RhdHVzIGFjcGlfbnNfcm9vdF9pbml0aWFsaXplKHZvaWQpCit7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCWNvbnN0IHN0cnVjdCBhY3BpX3ByZWRlZmluZWRfbmFtZXMgKmluaXRfdmFsID0gTlVMTDsKKwlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbmV3X25vZGU7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2M7CisJYWNwaV9zdHJpbmcgdmFsID0gTlVMTDsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0UobnNfcm9vdF9pbml0aWFsaXplKTsKKworCXN0YXR1cyA9IGFjcGlfdXRfYWNxdWlyZV9tdXRleChBQ1BJX01UWF9OQU1FU1BBQ0UpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKKwl9CisKKwkvKgorCSAqIFRoZSBnbG9iYWwgcm9vdCBwdHIgaXMgaW5pdGlhbGx5IE5VTEwsIHNvIGEgbm9uLU5VTEwgdmFsdWUgaW5kaWNhdGVzCisJICogdGhhdCBhY3BpX25zX3Jvb3RfaW5pdGlhbGl6ZSgpIGhhcyBhbHJlYWR5IGJlZW4gY2FsbGVkOyBqdXN0IHJldHVybi4KKwkgKi8KKwlpZiAoYWNwaV9nYmxfcm9vdF9ub2RlKSB7CisJCXN0YXR1cyA9IEFFX09LOworCQlnb3RvIHVubG9ja19hbmRfZXhpdDsKKwl9CisKKwkvKgorCSAqIFRlbGwgdGhlIHJlc3Qgb2YgdGhlIHN1YnN5c3RlbSB0aGF0IHRoZSByb290IGlzIGluaXRpYWxpemVkCisJICogKFRoaXMgaXMgT0sgYmVjYXVzZSB0aGUgbmFtZXNwYWNlIGlzIGxvY2tlZCkKKwkgKi8KKwlhY3BpX2dibF9yb290X25vZGUgPSAmYWNwaV9nYmxfcm9vdF9ub2RlX3N0cnVjdDsKKworCS8qIEVudGVyIHRoZSBwcmUtZGVmaW5lZCBuYW1lcyBpbiB0aGUgbmFtZSB0YWJsZSAqLworCisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLAorCQkJICAiRW50ZXJpbmcgcHJlZGVmaW5lZCBlbnRyaWVzIGludG8gbmFtZXNwYWNlXG4iKSk7CisKKwlmb3IgKGluaXRfdmFsID0gYWNwaV9nYmxfcHJlX2RlZmluZWRfbmFtZXM7IGluaXRfdmFsLT5uYW1lOyBpbml0X3ZhbCsrKSB7CisKKwkJLyogX09TSSBpcyBvcHRpb25hbCBmb3Igbm93LCB3aWxsIGJlIHBlcm1hbmVudCBsYXRlciAqLworCisJCWlmICghQUNQSV9TVFJDTVAoaW5pdF92YWwtPm5hbWUsICJfT1NJIikKKwkJICAgICYmICFhY3BpX2dibF9jcmVhdGVfb3NpX21ldGhvZCkgeworCQkJY29udGludWU7CisJCX0KKworCQlzdGF0dXMgPSBhY3BpX25zX2xvb2t1cChOVUxMLCBpbml0X3ZhbC0+bmFtZSwgaW5pdF92YWwtPnR5cGUsCisJCQkJCUFDUElfSU1PREVfTE9BRF9QQVNTMiwKKwkJCQkJQUNQSV9OU19OT19VUFNFQVJDSCwgTlVMTCwgJm5ld19ub2RlKTsKKworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykgfHwgKCFuZXdfbm9kZSkpIHsJLyogTXVzdCBiZSBvbiBzYW1lIGxpbmUgZm9yIGNvZGUgY29udmVydGVyICovCisJCQlBQ1BJX0VYQ0VQVElPTigoQUVfSU5GTywgc3RhdHVzLAorCQkJCQkiQ291bGQgbm90IGNyZWF0ZSBwcmVkZWZpbmVkIG5hbWUgJXMiLAorCQkJCQlpbml0X3ZhbC0+bmFtZSkpOworCQl9CisKKwkJLyoKKwkJICogTmFtZSBlbnRlcmVkIHN1Y2Nlc3NmdWxseS4KKwkJICogSWYgZW50cnkgaW4gcHJlX2RlZmluZWRfbmFtZXNbXSBzcGVjaWZpZXMgYW4KKwkJICogaW5pdGlhbCB2YWx1ZSwgY3JlYXRlIHRoZSBpbml0aWFsIHZhbHVlLgorCQkgKi8KKwkJaWYgKGluaXRfdmFsLT52YWwpIHsKKwkJCXN0YXR1cyA9IGFjcGlfb3NfcHJlZGVmaW5lZF9vdmVycmlkZShpbml0X3ZhbCwgJnZhbCk7CisJCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCQlBQ1BJX0VSUk9SKChBRV9JTkZPLAorCQkJCQkgICAgIkNvdWxkIG5vdCBvdmVycmlkZSBwcmVkZWZpbmVkICVzIiwKKwkJCQkJICAgIGluaXRfdmFsLT5uYW1lKSk7CisJCQl9CisKKwkJCWlmICghdmFsKSB7CisJCQkJdmFsID0gaW5pdF92YWwtPnZhbDsKKwkJCX0KKworCQkJLyoKKwkJCSAqIEVudHJ5IHJlcXVlc3RzIGFuIGluaXRpYWwgdmFsdWUsIGFsbG9jYXRlIGEKKwkJCSAqIGRlc2NyaXB0b3IgZm9yIGl0LgorCQkJICovCisJCQlvYmpfZGVzYyA9CisJCQkgICAgYWNwaV91dF9jcmVhdGVfaW50ZXJuYWxfb2JqZWN0KGluaXRfdmFsLT50eXBlKTsKKwkJCWlmICghb2JqX2Rlc2MpIHsKKwkJCQlzdGF0dXMgPSBBRV9OT19NRU1PUlk7CisJCQkJZ290byB1bmxvY2tfYW5kX2V4aXQ7CisJCQl9CisKKwkJCS8qCisJCQkgKiBDb252ZXJ0IHZhbHVlIHN0cmluZyBmcm9tIHRhYmxlIGVudHJ5IHRvCisJCQkgKiBpbnRlcm5hbCByZXByZXNlbnRhdGlvbi4gT25seSB0eXBlcyBhY3R1YWxseQorCQkJICogdXNlZCBmb3IgaW5pdGlhbCB2YWx1ZXMgYXJlIGltcGxlbWVudGVkIGhlcmUuCisJCQkgKi8KKwkJCXN3aXRjaCAoaW5pdF92YWwtPnR5cGUpIHsKKwkJCWNhc2UgQUNQSV9UWVBFX01FVEhPRDoKKwkJCQlvYmpfZGVzYy0+bWV0aG9kLnBhcmFtX2NvdW50ID0KKwkJCQkgICAgKHU4KSBBQ1BJX1RPX0lOVEVHRVIodmFsKTsKKwkJCQlvYmpfZGVzYy0+Y29tbW9uLmZsYWdzIHw9IEFPUE9CSl9EQVRBX1ZBTElEOworCisjaWYgZGVmaW5lZCAoQUNQSV9BU0xfQ09NUElMRVIpCisKKwkJCQkvKiBTYXZlIHRoZSBwYXJhbWV0ZXIgY291bnQgZm9yIHRoZSBpX2FTTCBjb21waWxlciAqLworCisJCQkJbmV3X25vZGUtPnZhbHVlID0gb2JqX2Rlc2MtPm1ldGhvZC5wYXJhbV9jb3VudDsKKyNlbHNlCisJCQkJLyogTWFyayB0aGlzIGFzIGEgdmVyeSBTUEVDSUFMIG1ldGhvZCAqLworCisJCQkJb2JqX2Rlc2MtPm1ldGhvZC5tZXRob2RfZmxhZ3MgPQorCQkJCSAgICBBTUxfTUVUSE9EX0lOVEVSTkFMX09OTFk7CisJCQkJb2JqX2Rlc2MtPm1ldGhvZC5pbXBsZW1lbnRhdGlvbiA9CisJCQkJICAgIGFjcGlfdXRfb3NpX2ltcGxlbWVudGF0aW9uOworI2VuZGlmCisJCQkJYnJlYWs7CisKKwkJCWNhc2UgQUNQSV9UWVBFX0lOVEVHRVI6CisKKwkJCQlvYmpfZGVzYy0+aW50ZWdlci52YWx1ZSA9IEFDUElfVE9fSU5URUdFUih2YWwpOworCQkJCWJyZWFrOworCisJCQljYXNlIEFDUElfVFlQRV9TVFJJTkc6CisKKwkJCQkvKgorCQkJCSAqIEJ1aWxkIGFuIG9iamVjdCBhcm91bmQgdGhlIHN0YXRpYyBzdHJpbmcKKwkJCQkgKi8KKwkJCQlvYmpfZGVzYy0+c3RyaW5nLmxlbmd0aCA9CisJCQkJICAgICh1MzIpIEFDUElfU1RSTEVOKHZhbCk7CisJCQkJb2JqX2Rlc2MtPnN0cmluZy5wb2ludGVyID0gdmFsOworCQkJCW9ial9kZXNjLT5jb21tb24uZmxhZ3MgfD0gQU9QT0JKX1NUQVRJQ19QT0lOVEVSOworCQkJCWJyZWFrOworCisJCQljYXNlIEFDUElfVFlQRV9NVVRFWDoKKworCQkJCW9ial9kZXNjLT5tdXRleC5ub2RlID0gbmV3X25vZGU7CisJCQkJb2JqX2Rlc2MtPm11dGV4LnN5bmNfbGV2ZWwgPQorCQkJCSAgICAodTgpIChBQ1BJX1RPX0lOVEVHRVIodmFsKSAtIDEpOworCisJCQkJLyogQ3JlYXRlIGEgbXV0ZXggKi8KKworCQkJCXN0YXR1cyA9CisJCQkJICAgIGFjcGlfb3NfY3JlYXRlX211dGV4KCZvYmpfZGVzYy0+bXV0ZXguCisJCQkJCQkJIG9zX211dGV4KTsKKwkJCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCQkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKG9ial9kZXNjKTsKKwkJCQkJZ290byB1bmxvY2tfYW5kX2V4aXQ7CisJCQkJfQorCisJCQkJLyogU3BlY2lhbCBjYXNlIGZvciBBQ1BJIEdsb2JhbCBMb2NrICovCisKKwkJCQlpZiAoQUNQSV9TVFJDTVAoaW5pdF92YWwtPm5hbWUsICJfR0xfIikgPT0gMCkgeworCQkJCQlhY3BpX2dibF9nbG9iYWxfbG9ja19tdXRleCA9IG9ial9kZXNjOworCisJCQkJCS8qIENyZWF0ZSBhZGRpdGlvbmFsIGNvdW50aW5nIHNlbWFwaG9yZSBmb3IgZ2xvYmFsIGxvY2sgKi8KKworCQkJCQlzdGF0dXMgPQorCQkJCQkgICAgYWNwaV9vc19jcmVhdGVfc2VtYXBob3JlKDEsIDAsCisJCQkJCQkJCSAgICAgJmFjcGlfZ2JsX2dsb2JhbF9sb2NrX3NlbWFwaG9yZSk7CisJCQkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJCQkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlCisJCQkJCQkgICAgKG9ial9kZXNjKTsKKwkJCQkJCWdvdG8gdW5sb2NrX2FuZF9leGl0OworCQkJCQl9CisJCQkJfQorCQkJCWJyZWFrOworCisJCQlkZWZhdWx0OgorCisJCQkJQUNQSV9FUlJPUigoQUVfSU5GTywKKwkJCQkJICAgICJVbnN1cHBvcnRlZCBpbml0aWFsIHR5cGUgdmFsdWUgJVgiLAorCQkJCQkgICAgaW5pdF92YWwtPnR5cGUpKTsKKwkJCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2Uob2JqX2Rlc2MpOworCQkJCW9ial9kZXNjID0gTlVMTDsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJLyogU3RvcmUgcG9pbnRlciB0byB2YWx1ZSBkZXNjcmlwdG9yIGluIHRoZSBOb2RlICovCisKKwkJCXN0YXR1cyA9IGFjcGlfbnNfYXR0YWNoX29iamVjdChuZXdfbm9kZSwgb2JqX2Rlc2MsCisJCQkJCQkgICAgICAgQUNQSV9HRVRfT0JKRUNUX1RZUEUKKwkJCQkJCSAgICAgICAob2JqX2Rlc2MpKTsKKworCQkJLyogUmVtb3ZlIGxvY2FsIHJlZmVyZW5jZSB0byB0aGUgb2JqZWN0ICovCisKKwkJCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZShvYmpfZGVzYyk7CisJCX0KKwl9CisKKyAgICAgIHVubG9ja19hbmRfZXhpdDoKKwkodm9pZClhY3BpX3V0X3JlbGVhc2VfbXV0ZXgoQUNQSV9NVFhfTkFNRVNQQUNFKTsKKworCS8qIFNhdmUgYSBoYW5kbGUgdG8gIl9HUEUiLCBpdCBpcyBhbHdheXMgcHJlc2VudCAqLworCisJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCXN0YXR1cyA9IGFjcGlfbnNfZ2V0X25vZGUoTlVMTCwgIlxcX0dQRSIsIEFDUElfTlNfTk9fVVBTRUFSQ0gsCisJCQkJCSAgJmFjcGlfZ2JsX2ZhZHRfZ3BlX2RldmljZSk7CisJfQorCisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfbnNfbG9va3VwCisgKgorICogUEFSQU1FVEVSUzogIHNjb3BlX2luZm8gICAgICAtIEN1cnJlbnQgc2NvcGUgaW5mbyBibG9jaworICogICAgICAgICAgICAgIFBhdGhuYW1lICAgICAgICAtIFNlYXJjaCBwYXRobmFtZSwgaW4gaW50ZXJuYWwgZm9ybWF0CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFzIHJlcHJlc2VudGVkIGluIHRoZSBBTUwgc3RyZWFtKQorICogICAgICAgICAgICAgIFR5cGUgICAgICAgICAgICAtIFR5cGUgYXNzb2NpYXRlZCB3aXRoIG5hbWUKKyAqICAgICAgICAgICAgICBpbnRlcnByZXRlcl9tb2RlIC0gSU1PREVfTE9BRF9QQVNTMiA9PiBhZGQgbmFtZSBpZiBub3QgZm91bmQKKyAqICAgICAgICAgICAgICBGbGFncyAgICAgICAgICAgLSBGbGFncyBkZXNjcmliaW5nIHRoZSBzZWFyY2ggcmVzdHJpY3Rpb25zCisgKiAgICAgICAgICAgICAgd2Fsa19zdGF0ZSAgICAgIC0gQ3VycmVudCBzdGF0ZSBvZiB0aGUgd2FsaworICogICAgICAgICAgICAgIHJldHVybl9ub2RlICAgICAtIFdoZXJlIHRoZSBOb2RlIGlzIHBsYWNlZCAoaWYgZm91bmQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBjcmVhdGVkIHN1Y2Nlc3NmdWxseSkKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IEZpbmQgb3IgZW50ZXIgdGhlIHBhc3NlZCBuYW1lIGluIHRoZSBuYW1lIHNwYWNlLgorICogICAgICAgICAgICAgIExvZyBhbiBlcnJvciBpZiBuYW1lIG5vdCBmb3VuZCBpbiBFeGVjIG1vZGUuCisgKgorICogTVVURVg6ICAgICAgIEFzc3VtZXMgbmFtZXNwYWNlIGlzIGxvY2tlZC4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCithY3BpX3N0YXR1cworYWNwaV9uc19sb29rdXAodW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICpzY29wZV9pbmZvLAorCSAgICAgICBjaGFyICpwYXRobmFtZSwKKwkgICAgICAgYWNwaV9vYmplY3RfdHlwZSB0eXBlLAorCSAgICAgICBhY3BpX2ludGVycHJldGVyX21vZGUgaW50ZXJwcmV0ZXJfbW9kZSwKKwkgICAgICAgdTMyIGZsYWdzLAorCSAgICAgICBzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlLAorCSAgICAgICBzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqKnJldHVybl9ub2RlKQoreworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwljaGFyICpwYXRoID0gcGF0aG5hbWU7CisJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKnByZWZpeF9ub2RlOworCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpjdXJyZW50X25vZGUgPSBOVUxMOworCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICp0aGlzX25vZGUgPSBOVUxMOworCXUzMiBudW1fc2VnbWVudHM7CisJdTMyIG51bV9jYXJhdHM7CisJYWNwaV9uYW1lIHNpbXBsZV9uYW1lOworCWFjcGlfb2JqZWN0X3R5cGUgdHlwZV90b19jaGVja19mb3I7CisJYWNwaV9vYmplY3RfdHlwZSB0aGlzX3NlYXJjaF90eXBlOworCXUzMiBzZWFyY2hfcGFyZW50X2ZsYWcgPSBBQ1BJX05TX1NFQVJDSF9QQVJFTlQ7CisJdTMyIGxvY2FsX2ZsYWdzOworCisJQUNQSV9GVU5DVElPTl9UUkFDRShuc19sb29rdXApOworCisJaWYgKCFyZXR1cm5fbm9kZSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX1BBUkFNRVRFUik7CisJfQorCisJbG9jYWxfZmxhZ3MgPSBmbGFncyAmIH4oQUNQSV9OU19FUlJPUl9JRl9GT1VORCB8IEFDUElfTlNfU0VBUkNIX1BBUkVOVCk7CisJKnJldHVybl9ub2RlID0gQUNQSV9FTlRSWV9OT1RfRk9VTkQ7CisJYWNwaV9nYmxfbnNfbG9va3VwX2NvdW50Kys7CisKKwlpZiAoIWFjcGlfZ2JsX3Jvb3Rfbm9kZSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9fTkFNRVNQQUNFKTsKKwl9CisKKwkvKgorCSAqIEdldCB0aGUgcHJlZml4IHNjb3BlLgorCSAqIEEgbnVsbCBzY29wZSBtZWFucyB1c2UgdGhlIHJvb3Qgc2NvcGUKKwkgKi8KKwlpZiAoKCFzY29wZV9pbmZvKSB8fCAoIXNjb3BlX2luZm8tPnNjb3BlLm5vZGUpKSB7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfTkFNRVMsCisJCQkJICAiTnVsbCBzY29wZSBwcmVmaXgsIHVzaW5nIHJvb3Qgbm9kZSAoJXApXG4iLAorCQkJCSAgYWNwaV9nYmxfcm9vdF9ub2RlKSk7CisKKwkJcHJlZml4X25vZGUgPSBhY3BpX2dibF9yb290X25vZGU7CisJfSBlbHNlIHsKKwkJcHJlZml4X25vZGUgPSBzY29wZV9pbmZvLT5zY29wZS5ub2RlOworCQlpZiAoQUNQSV9HRVRfREVTQ1JJUFRPUl9UWVBFKHByZWZpeF9ub2RlKSAhPQorCQkgICAgQUNQSV9ERVNDX1RZUEVfTkFNRUQpIHsKKwkJCUFDUElfRVJST1IoKEFFX0lORk8sICIlcCBpcyBub3QgYSBuYW1lc3BhY2Ugbm9kZSBbJXNdIiwKKwkJCQkgICAgcHJlZml4X25vZGUsCisJCQkJICAgIGFjcGlfdXRfZ2V0X2Rlc2NyaXB0b3JfbmFtZShwcmVmaXhfbm9kZSkpKTsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfSU5URVJOQUwpOworCQl9CisKKwkJaWYgKCEoZmxhZ3MgJiBBQ1BJX05TX1BSRUZJWF9JU19TQ09QRSkpIHsKKwkJCS8qCisJCQkgKiBUaGlzIG5vZGUgbWlnaHQgbm90IGJlIGEgYWN0dWFsICJzY29wZSIgbm9kZSAoc3VjaCBhcyBhCisJCQkgKiBEZXZpY2UvTWV0aG9kLCBldGMuKSAgSXQgY291bGQgYmUgYSBQYWNrYWdlIG9yIG90aGVyIG9iamVjdCBub2RlLgorCQkJICogQmFja3VwIHVwIHRoZSB0cmVlIHRvIGZpbmQgdGhlIGNvbnRhaW5pbmcgc2NvcGUgbm9kZS4KKwkJCSAqLworCQkJd2hpbGUgKCFhY3BpX25zX29wZW5zX3Njb3BlKHByZWZpeF9ub2RlLT50eXBlKSAmJgorCQkJICAgICAgIHByZWZpeF9ub2RlLT50eXBlICE9IEFDUElfVFlQRV9BTlkpIHsKKwkJCQlwcmVmaXhfbm9kZSA9CisJCQkJICAgIGFjcGlfbnNfZ2V0X3BhcmVudF9ub2RlKHByZWZpeF9ub2RlKTsKKwkJCX0KKwkJfQorCX0KKworCS8qIFNhdmUgdHlwZSAgIFRCRDogbWF5IGJlIG5vIGxvbmdlciBuZWNlc3NhcnkgKi8KKworCXR5cGVfdG9fY2hlY2tfZm9yID0gdHlwZTsKKworCS8qCisJICogQmVnaW4gZXhhbWluYXRpb24gb2YgdGhlIGFjdHVhbCBwYXRobmFtZQorCSAqLworCWlmICghcGF0aG5hbWUpIHsKKworCQkvKiBBIE51bGwgbmFtZV9wYXRoIGlzIGFsbG93ZWQgYW5kIHJlZmVycyB0byB0aGUgcm9vdCAqLworCisJCW51bV9zZWdtZW50cyA9IDA7CisJCXRoaXNfbm9kZSA9IGFjcGlfZ2JsX3Jvb3Rfbm9kZTsKKwkJcGF0aCA9ICIiOworCisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfTkFNRVMsCisJCQkJICAiTnVsbCBQYXRobmFtZSAoWmVybyBzZWdtZW50cyksIEZsYWdzPSVYXG4iLAorCQkJCSAgZmxhZ3MpKTsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBOYW1lIHBvaW50ZXIgaXMgdmFsaWQgKGFuZCBtdXN0IGJlIGluIGludGVybmFsIG5hbWUgZm9ybWF0KQorCQkgKgorCQkgKiBDaGVjayBmb3Igc2NvcGUgcHJlZml4ZXM6CisJCSAqCisJCSAqIEFzIHJlcHJlc2VudGVkIGluIHRoZSBBTUwgc3RyZWFtLCBhIG5hbWVwYXRoIGNvbnNpc3RzIG9mIGFuCisJCSAqIG9wdGlvbmFsIHNjb3BlIHByZWZpeCBmb2xsb3dlZCBieSBhIG5hbWUgc2VnbWVudCBwYXJ0LgorCQkgKgorCQkgKiBJZiBwcmVzZW50LCB0aGUgc2NvcGUgcHJlZml4IGlzIGVpdGhlciBhIFJvb3QgUHJlZml4IChpbgorCQkgKiB3aGljaCBjYXNlIHRoZSBuYW1lIGlzIGZ1bGx5IHF1YWxpZmllZCksIG9yIG9uZSBvciBtb3JlCisJCSAqIFBhcmVudCBQcmVmaXhlcyAoaW4gd2hpY2ggY2FzZSB0aGUgbmFtZSdzIHNjb3BlIGlzIHJlbGF0aXZlCisJCSAqIHRvIHRoZSBjdXJyZW50IHNjb3BlKS4KKwkJICovCisJCWlmICgqcGF0aCA9PSAodTgpIEFNTF9ST09UX1BSRUZJWCkgeworCisJCQkvKiBQYXRobmFtZSBpcyBmdWxseSBxdWFsaWZpZWQsIHN0YXJ0IGZyb20gdGhlIHJvb3QgKi8KKworCQkJdGhpc19ub2RlID0gYWNwaV9nYmxfcm9vdF9ub2RlOworCQkJc2VhcmNoX3BhcmVudF9mbGFnID0gQUNQSV9OU19OT19VUFNFQVJDSDsKKworCQkJLyogUG9pbnQgdG8gbmFtZSBzZWdtZW50IHBhcnQgKi8KKworCQkJcGF0aCsrOworCisJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX05BTUVTLAorCQkJCQkgICJQYXRoIGlzIGFic29sdXRlIGZyb20gcm9vdCBbJXBdXG4iLAorCQkJCQkgIHRoaXNfbm9kZSkpOworCQl9IGVsc2UgeworCQkJLyogUGF0aG5hbWUgaXMgcmVsYXRpdmUgdG8gY3VycmVudCBzY29wZSwgc3RhcnQgdGhlcmUgKi8KKworCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9OQU1FUywKKwkJCQkJICAiU2VhcmNoaW5nIHJlbGF0aXZlIHRvIHByZWZpeCBzY29wZSBbJTQuNHNdICglcClcbiIsCisJCQkJCSAgYWNwaV91dF9nZXRfbm9kZV9uYW1lKHByZWZpeF9ub2RlKSwKKwkJCQkJICBwcmVmaXhfbm9kZSkpOworCisJCQkvKgorCQkJICogSGFuZGxlIG11bHRpcGxlIFBhcmVudCBQcmVmaXhlcyAoY2FyYXQpIGJ5IGp1c3QgZ2V0dGluZworCQkJICogdGhlIHBhcmVudCBub2RlIGZvciBlYWNoIHByZWZpeCBpbnN0YW5jZS4KKwkJCSAqLworCQkJdGhpc19ub2RlID0gcHJlZml4X25vZGU7CisJCQludW1fY2FyYXRzID0gMDsKKwkJCXdoaWxlICgqcGF0aCA9PSAodTgpIEFNTF9QQVJFTlRfUFJFRklYKSB7CisKKwkJCQkvKiBOYW1lIGlzIGZ1bGx5IHF1YWxpZmllZCwgbm8gc2VhcmNoIHJ1bGVzIGFwcGx5ICovCisKKwkJCQlzZWFyY2hfcGFyZW50X2ZsYWcgPSBBQ1BJX05TX05PX1VQU0VBUkNIOworCQkJCS8qCisJCQkJICogUG9pbnQgcGFzdCB0aGlzIHByZWZpeCB0byB0aGUgbmFtZSBzZWdtZW50CisJCQkJICogcGFydCBvciB0aGUgbmV4dCBQYXJlbnQgUHJlZml4CisJCQkJICovCisJCQkJcGF0aCsrOworCisJCQkJLyogQmFja3VwIHRvIHRoZSBwYXJlbnQgbm9kZSAqLworCisJCQkJbnVtX2NhcmF0cysrOworCQkJCXRoaXNfbm9kZSA9IGFjcGlfbnNfZ2V0X3BhcmVudF9ub2RlKHRoaXNfbm9kZSk7CisJCQkJaWYgKCF0aGlzX25vZGUpIHsKKworCQkJCQkvKiBDdXJyZW50IHNjb3BlIGhhcyBubyBwYXJlbnQgc2NvcGUgKi8KKworCQkJCQlBQ1BJX0VSUk9SKChBRV9JTkZPLAorCQkJCQkJICAgICJBQ1BJIHBhdGggaGFzIHRvbyBtYW55IHBhcmVudCBwcmVmaXhlcyAoXikgLSByZWFjaGVkIGJleW9uZCByb290IG5vZGUiKSk7CisJCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT1RfRk9VTkQpOworCQkJCX0KKwkJCX0KKworCQkJaWYgKHNlYXJjaF9wYXJlbnRfZmxhZyA9PSBBQ1BJX05TX05PX1VQU0VBUkNIKSB7CisJCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9OQU1FUywKKwkJCQkJCSAgIlNlYXJjaCBzY29wZSBpcyBbJTQuNHNdLCBwYXRoIGhhcyAlZCBjYXJhdChzKVxuIiwKKwkJCQkJCSAgYWNwaV91dF9nZXRfbm9kZV9uYW1lCisJCQkJCQkgICh0aGlzX25vZGUpLCBudW1fY2FyYXRzKSk7CisJCQl9CisJCX0KKworCQkvKgorCQkgKiBEZXRlcm1pbmUgdGhlIG51bWJlciBvZiBBQ1BJIG5hbWUgc2VnbWVudHMgaW4gdGhpcyBwYXRobmFtZS4KKwkJICoKKwkJICogVGhlIHNlZ21lbnQgcGFydCBjb25zaXN0cyBvZiBlaXRoZXI6CisJCSAqICAtIEEgTnVsbCBuYW1lIHNlZ21lbnQgKDApCisJCSAqICAtIEEgZHVhbF9uYW1lX3ByZWZpeCBmb2xsb3dlZCBieSB0d28gNC1ieXRlIG5hbWUgc2VnbWVudHMKKwkJICogIC0gQSBtdWx0aV9uYW1lX3ByZWZpeCBmb2xsb3dlZCBieSBhIGJ5dGUgaW5kaWNhdGluZyB0aGUKKwkJICogICAgICBudW1iZXIgb2Ygc2VnbWVudHMgYW5kIHRoZSBzZWdtZW50cyB0aGVtc2VsdmVzLgorCQkgKiAgLSBBIHNpbmdsZSA0LWJ5dGUgbmFtZSBzZWdtZW50CisJCSAqCisJCSAqIEV4YW1pbmUgdGhlIG5hbWUgcHJlZml4IG9wY29kZSwgaWYgYW55LCB0byBkZXRlcm1pbmUgdGhlIG51bWJlciBvZgorCQkgKiBzZWdtZW50cy4KKwkJICovCisJCXN3aXRjaCAoKnBhdGgpIHsKKwkJY2FzZSAwOgorCQkJLyoKKwkJCSAqIE51bGwgbmFtZSBhZnRlciBhIHJvb3Qgb3IgcGFyZW50IHByZWZpeGVzLiBXZSBhbHJlYWR5CisJCQkgKiBoYXZlIHRoZSBjb3JyZWN0IHRhcmdldCBub2RlIGFuZCB0aGVyZSBhcmUgbm8gbmFtZSBzZWdtZW50cy4KKwkJCSAqLworCQkJbnVtX3NlZ21lbnRzID0gMDsKKwkJCXR5cGUgPSB0aGlzX25vZGUtPnR5cGU7CisKKwkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfTkFNRVMsCisJCQkJCSAgIlByZWZpeC1vbmx5IFBhdGhuYW1lIChaZXJvIG5hbWUgc2VnbWVudHMpLCBGbGFncz0lWFxuIiwKKwkJCQkJICBmbGFncykpOworCQkJYnJlYWs7CisKKwkJY2FzZSBBTUxfRFVBTF9OQU1FX1BSRUZJWDoKKworCQkJLyogTW9yZSB0aGFuIG9uZSBuYW1lX3NlZywgc2VhcmNoIHJ1bGVzIGRvIG5vdCBhcHBseSAqLworCisJCQlzZWFyY2hfcGFyZW50X2ZsYWcgPSBBQ1BJX05TX05PX1VQU0VBUkNIOworCisJCQkvKiBUd28gc2VnbWVudHMsIHBvaW50IHRvIGZpcnN0IG5hbWUgc2VnbWVudCAqLworCisJCQludW1fc2VnbWVudHMgPSAyOworCQkJcGF0aCsrOworCisJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX05BTUVTLAorCQkJCQkgICJEdWFsIFBhdGhuYW1lICgyIHNlZ21lbnRzLCBGbGFncz0lWClcbiIsCisJCQkJCSAgZmxhZ3MpKTsKKwkJCWJyZWFrOworCisJCWNhc2UgQU1MX01VTFRJX05BTUVfUFJFRklYX09QOgorCisJCQkvKiBNb3JlIHRoYW4gb25lIG5hbWVfc2VnLCBzZWFyY2ggcnVsZXMgZG8gbm90IGFwcGx5ICovCisKKwkJCXNlYXJjaF9wYXJlbnRfZmxhZyA9IEFDUElfTlNfTk9fVVBTRUFSQ0g7CisKKwkJCS8qIEV4dHJhY3Qgc2VnbWVudCBjb3VudCwgcG9pbnQgdG8gZmlyc3QgbmFtZSBzZWdtZW50ICovCisKKwkJCXBhdGgrKzsKKwkJCW51bV9zZWdtZW50cyA9ICh1MzIpICh1OCkgKiBwYXRoOworCQkJcGF0aCsrOworCisJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX05BTUVTLAorCQkJCQkgICJNdWx0aSBQYXRobmFtZSAoJWQgU2VnbWVudHMsIEZsYWdzPSVYKVxuIiwKKwkJCQkJICBudW1fc2VnbWVudHMsIGZsYWdzKSk7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJLyoKKwkJCSAqIE5vdCBhIE51bGwgbmFtZSwgbm8gRHVhbCBvciBNdWx0aSBwcmVmaXgsIGhlbmNlIHRoZXJlIGlzCisJCQkgKiBvbmx5IG9uZSBuYW1lIHNlZ21lbnQgYW5kIFBhdGhuYW1lIGlzIGFscmVhZHkgcG9pbnRpbmcgdG8gaXQuCisJCQkgKi8KKwkJCW51bV9zZWdtZW50cyA9IDE7CisKKwkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfTkFNRVMsCisJCQkJCSAgIlNpbXBsZSBQYXRobmFtZSAoMSBzZWdtZW50LCBGbGFncz0lWClcbiIsCisJCQkJCSAgZmxhZ3MpKTsKKwkJCWJyZWFrOworCQl9CisKKwkJQUNQSV9ERUJVR19FWEVDKGFjcGlfbnNfcHJpbnRfcGF0aG5hbWUobnVtX3NlZ21lbnRzLCBwYXRoKSk7CisJfQorCisJLyoKKwkgKiBTZWFyY2ggbmFtZXNwYWNlIGZvciBlYWNoIHNlZ21lbnQgb2YgdGhlIG5hbWUuIExvb3AgdGhyb3VnaCBhbmQKKwkgKiB2ZXJpZnkgKG9yIGFkZCB0byB0aGUgbmFtZXNwYWNlKSBlYWNoIG5hbWUgc2VnbWVudC4KKwkgKgorCSAqIFRoZSBvYmplY3QgdHlwZSBpcyBzaWduaWZpY2FudCBvbmx5IGF0IHRoZSBsYXN0IG5hbWUKKwkgKiBzZWdtZW50LiAoV2UgZG9uJ3QgY2FyZSBhYm91dCB0aGUgdHlwZXMgYWxvbmcgdGhlIHBhdGgsIG9ubHkKKwkgKiB0aGUgdHlwZSBvZiB0aGUgZmluYWwgdGFyZ2V0IG9iamVjdC4pCisJICovCisJdGhpc19zZWFyY2hfdHlwZSA9IEFDUElfVFlQRV9BTlk7CisJY3VycmVudF9ub2RlID0gdGhpc19ub2RlOworCXdoaWxlIChudW1fc2VnbWVudHMgJiYgY3VycmVudF9ub2RlKSB7CisJCW51bV9zZWdtZW50cy0tOworCQlpZiAoIW51bV9zZWdtZW50cykgeworCQkJLyoKKwkJCSAqIFRoaXMgaXMgdGhlIGxhc3Qgc2VnbWVudCwgZW5hYmxlIHR5cGVjaGVja2luZworCQkJICovCisJCQl0aGlzX3NlYXJjaF90eXBlID0gdHlwZTsKKworCQkJLyoKKwkJCSAqIE9ubHkgYWxsb3cgYXV0b21hdGljIHBhcmVudCBzZWFyY2ggKHNlYXJjaCBydWxlcykgaWYgdGhlIGNhbGxlcgorCQkJICogcmVxdWVzdGVkIGl0IEFORCB3ZSBoYXZlIGEgc2luZ2xlLCBub24tZnVsbHktcXVhbGlmaWVkIG5hbWVfc2VnCisJCQkgKi8KKwkJCWlmICgoc2VhcmNoX3BhcmVudF9mbGFnICE9IEFDUElfTlNfTk9fVVBTRUFSQ0gpICYmCisJCQkgICAgKGZsYWdzICYgQUNQSV9OU19TRUFSQ0hfUEFSRU5UKSkgeworCQkJCWxvY2FsX2ZsYWdzIHw9IEFDUElfTlNfU0VBUkNIX1BBUkVOVDsKKwkJCX0KKworCQkJLyogU2V0IGVycm9yIGZsYWcgYWNjb3JkaW5nIHRvIGNhbGxlciAqLworCisJCQlpZiAoZmxhZ3MgJiBBQ1BJX05TX0VSUk9SX0lGX0ZPVU5EKSB7CisJCQkJbG9jYWxfZmxhZ3MgfD0gQUNQSV9OU19FUlJPUl9JRl9GT1VORDsKKwkJCX0KKwkJfQorCisJCS8qIEV4dHJhY3Qgb25lIEFDUEkgbmFtZSBmcm9tIHRoZSBmcm9udCBvZiB0aGUgcGF0aG5hbWUgKi8KKworCQlBQ1BJX01PVkVfMzJfVE9fMzIoJnNpbXBsZV9uYW1lLCBwYXRoKTsKKworCQkvKiBUcnkgdG8gZmluZCB0aGUgc2luZ2xlICg0IGNoYXJhY3RlcikgQUNQSSBuYW1lICovCisKKwkJc3RhdHVzID0KKwkJICAgIGFjcGlfbnNfc2VhcmNoX2FuZF9lbnRlcihzaW1wbGVfbmFtZSwgd2Fsa19zdGF0ZSwKKwkJCQkJICAgICBjdXJyZW50X25vZGUsIGludGVycHJldGVyX21vZGUsCisJCQkJCSAgICAgdGhpc19zZWFyY2hfdHlwZSwgbG9jYWxfZmxhZ3MsCisJCQkJCSAgICAgJnRoaXNfbm9kZSk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJaWYgKHN0YXR1cyA9PSBBRV9OT1RfRk9VTkQpIHsKKworCQkJCS8qIE5hbWUgbm90IGZvdW5kIGluIEFDUEkgbmFtZXNwYWNlICovCisKKwkJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX05BTUVTLAorCQkJCQkJICAiTmFtZSBbJTQuNHNdIG5vdCBmb3VuZCBpbiBzY29wZSBbJTQuNHNdICVwXG4iLAorCQkJCQkJICAoY2hhciAqKSZzaW1wbGVfbmFtZSwKKwkJCQkJCSAgKGNoYXIgKikmY3VycmVudF9ub2RlLT5uYW1lLAorCQkJCQkJICBjdXJyZW50X25vZGUpKTsKKwkJCX0KKworCQkJKnJldHVybl9ub2RlID0gdGhpc19ub2RlOworCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CisJCX0KKworCQkvKiBNb3JlIHNlZ21lbnRzIHRvIGZvbGxvdz8gKi8KKworCQlpZiAobnVtX3NlZ21lbnRzID4gMCkgeworCQkJLyoKKwkJCSAqIElmIHdlIGhhdmUgYW4gYWxpYXMgdG8gYW4gb2JqZWN0IHRoYXQgb3BlbnMgYSBzY29wZSAoc3VjaCBhcyBhCisJCQkgKiBkZXZpY2Ugb3IgcHJvY2Vzc29yKSwgd2UgbmVlZCB0byBkZXJlZmVyZW5jZSB0aGUgYWxpYXMgaGVyZSBzbyB0aGF0CisJCQkgKiB3ZSBjYW4gYWNjZXNzIGFueSBjaGlsZHJlbiBvZiB0aGUgb3JpZ2luYWwgbm9kZSAodmlhIHRoZSByZW1haW5pbmcKKwkJCSAqIHNlZ21lbnRzKS4KKwkJCSAqLworCQkJaWYgKHRoaXNfbm9kZS0+dHlwZSA9PSBBQ1BJX1RZUEVfTE9DQUxfQUxJQVMpIHsKKwkJCQlpZiAoIXRoaXNfbm9kZS0+b2JqZWN0KSB7CisJCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT1RfRVhJU1QpOworCQkJCX0KKworCQkJCWlmIChhY3BpX25zX29wZW5zX3Njb3BlCisJCQkJICAgICgoKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICopdGhpc19ub2RlLT4KKwkJCQkgICAgICBvYmplY3QpLT50eXBlKSkgeworCQkJCQl0aGlzX25vZGUgPQorCQkJCQkgICAgKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICopCisJCQkJCSAgICB0aGlzX25vZGUtPm9iamVjdDsKKwkJCQl9CisJCQl9CisJCX0KKworCQkvKiBTcGVjaWFsIGhhbmRsaW5nIGZvciB0aGUgbGFzdCBzZWdtZW50IChudW1fc2VnbWVudHMgPT0gMCkgKi8KKworCQllbHNlIHsKKwkJCS8qCisJCQkgKiBTYW5pdHkgdHlwZWNoZWNrIG9mIHRoZSB0YXJnZXQgb2JqZWN0OgorCQkJICoKKwkJCSAqIElmIDEpIFRoaXMgaXMgdGhlIGxhc3Qgc2VnbWVudCAobnVtX3NlZ21lbnRzID09IDApCisJCQkgKiAgICAyKSBBbmQgd2UgYXJlIGxvb2tpbmcgZm9yIGEgc3BlY2lmaWMgdHlwZQorCQkJICogICAgICAgKE5vdCBjaGVja2luZyBmb3IgVFlQRV9BTlkpCisJCQkgKiAgICAzKSBXaGljaCBpcyBub3QgYW4gYWxpYXMKKwkJCSAqICAgIDQpIFdoaWNoIGlzIG5vdCBhIGxvY2FsIHR5cGUgKFRZUEVfU0NPUEUpCisJCQkgKiAgICA1KSBBbmQgdGhlIHR5cGUgb2YgdGFyZ2V0IG9iamVjdCBpcyBrbm93biAobm90IFRZUEVfQU5ZKQorCQkJICogICAgNikgQW5kIHRhcmdldCBvYmplY3QgZG9lcyBub3QgbWF0Y2ggd2hhdCB3ZSBhcmUgbG9va2luZyBmb3IKKwkJCSAqCisJCQkgKiBUaGVuIHdlIGhhdmUgYSB0eXBlIG1pc21hdGNoLiBKdXN0IHdhcm4gYW5kIGlnbm9yZSBpdC4KKwkJCSAqLworCQkJaWYgKCh0eXBlX3RvX2NoZWNrX2ZvciAhPSBBQ1BJX1RZUEVfQU5ZKSAmJgorCQkJICAgICh0eXBlX3RvX2NoZWNrX2ZvciAhPSBBQ1BJX1RZUEVfTE9DQUxfQUxJQVMpICYmCisJCQkgICAgKHR5cGVfdG9fY2hlY2tfZm9yICE9IEFDUElfVFlQRV9MT0NBTF9NRVRIT0RfQUxJQVMpCisJCQkgICAgJiYgKHR5cGVfdG9fY2hlY2tfZm9yICE9IEFDUElfVFlQRV9MT0NBTF9TQ09QRSkKKwkJCSAgICAmJiAodGhpc19ub2RlLT50eXBlICE9IEFDUElfVFlQRV9BTlkpCisJCQkgICAgJiYgKHRoaXNfbm9kZS0+dHlwZSAhPSB0eXBlX3RvX2NoZWNrX2ZvcikpIHsKKworCQkJCS8qIENvbXBsYWluIGFib3V0IGEgdHlwZSBtaXNtYXRjaCAqLworCisJCQkJQUNQSV9XQVJOSU5HKChBRV9JTkZPLAorCQkJCQkgICAgICAiTnNMb29rdXA6IFR5cGUgbWlzbWF0Y2ggb24gJTQuNHMgKCVzKSwgc2VhcmNoaW5nIGZvciAoJXMpIiwKKwkJCQkJICAgICAgQUNQSV9DQVNUX1BUUihjaGFyLCAmc2ltcGxlX25hbWUpLAorCQkJCQkgICAgICBhY3BpX3V0X2dldF90eXBlX25hbWUodGhpc19ub2RlLT4KKwkJCQkJCQkJICAgIHR5cGUpLAorCQkJCQkgICAgICBhY3BpX3V0X2dldF90eXBlX25hbWUKKwkJCQkJICAgICAgKHR5cGVfdG9fY2hlY2tfZm9yKSkpOworCQkJfQorCisJCQkvKgorCQkJICogSWYgdGhpcyBpcyB0aGUgbGFzdCBuYW1lIHNlZ21lbnQgYW5kIHdlIGFyZSBub3QgbG9va2luZyBmb3IgYQorCQkJICogc3BlY2lmaWMgdHlwZSwgYnV0IHRoZSB0eXBlIG9mIGZvdW5kIG9iamVjdCBpcyBrbm93biwgdXNlIHRoYXQgdHlwZQorCQkJICogdG8gKGxhdGVyKSBzZWUgaWYgaXQgb3BlbnMgYSBzY29wZS4KKwkJCSAqLworCQkJaWYgKHR5cGUgPT0gQUNQSV9UWVBFX0FOWSkgeworCQkJCXR5cGUgPSB0aGlzX25vZGUtPnR5cGU7CisJCQl9CisJCX0KKworCQkvKiBQb2ludCB0byBuZXh0IG5hbWUgc2VnbWVudCBhbmQgbWFrZSB0aGlzIG5vZGUgY3VycmVudCAqLworCisJCXBhdGggKz0gQUNQSV9OQU1FX1NJWkU7CisJCWN1cnJlbnRfbm9kZSA9IHRoaXNfbm9kZTsKKwl9CisKKwkvKgorCSAqIEFsd2F5cyBjaGVjayBpZiB3ZSBuZWVkIHRvIG9wZW4gYSBuZXcgc2NvcGUKKwkgKi8KKwlpZiAoIShmbGFncyAmIEFDUElfTlNfRE9OVF9PUEVOX1NDT1BFKSAmJiAod2Fsa19zdGF0ZSkpIHsKKwkJLyoKKwkJICogSWYgZW50cnkgaXMgYSB0eXBlIHdoaWNoIG9wZW5zIGEgc2NvcGUsIHB1c2ggdGhlIG5ldyBzY29wZSBvbiB0aGUKKwkJICogc2NvcGUgc3RhY2suCisJCSAqLworCQlpZiAoYWNwaV9uc19vcGVuc19zY29wZSh0eXBlKSkgeworCQkJc3RhdHVzID0KKwkJCSAgICBhY3BpX2RzX3Njb3BlX3N0YWNrX3B1c2godGhpc19ub2RlLCB0eXBlLAorCQkJCQkJICAgICB3YWxrX3N0YXRlKTsKKwkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworCQkJfQorCQl9CisJfQorCisJKnJldHVybl9ub2RlID0gdGhpc19ub2RlOworCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL25zYWxsb2MuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvbnNhbGxvYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5NzZkODQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL25zYWxsb2MuYwpAQCAtMCwwICsxLDQ5NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBNb2R1bGUgTmFtZTogbnNhbGxvYyAtIE5hbWVzcGFjZSBhbGxvY2F0aW9uIGFuZCBkZWxldGlvbiB1dGlsaXRpZXMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwOCwgSW50ZWwgQ29ycC4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKKyAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIGF0IG1pbmltdW0gYSBkaXNjbGFpbWVyCisgKiAgICBzdWJzdGFudGlhbGx5IHNpbWlsYXIgdG8gdGhlICJOTyBXQVJSQU5UWSIgZGlzY2xhaW1lciBiZWxvdworICogICAgKCJEaXNjbGFpbWVyIikgYW5kIGFueSByZWRpc3RyaWJ1dGlvbiBtdXN0IGJlIGNvbmRpdGlvbmVkIHVwb24KKyAqICAgIGluY2x1ZGluZyBhIHN1YnN0YW50aWFsbHkgc2ltaWxhciBEaXNjbGFpbWVyIHJlcXVpcmVtZW50IGZvciBmdXJ0aGVyCisgKiAgICBiaW5hcnkgcmVkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMKKyAqICAgIG9mIGFueSBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogTk8gV0FSUkFOVFkKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HCisgKiBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KKyAqLworCisjaW5jbHVkZSA8YWNwaS9hY3BpLmg+CisjaW5jbHVkZSAiYWNjb21tb24uaCIKKyNpbmNsdWRlICJhY25hbWVzcC5oIgorCisjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9OQU1FU1BBQ0UKK0FDUElfTU9EVUxFX05BTUUoIm5zYWxsb2MiKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX25zX2NyZWF0ZV9ub2RlCisgKgorICogUEFSQU1FVEVSUzogIE5hbWUgICAgICAgICAgICAtIE5hbWUgb2YgdGhlIG5ldyBub2RlICg0IGNoYXIgQUNQSSBuYW1lKQorICoKKyAqIFJFVFVSTjogICAgICBOZXcgbmFtZXNwYWNlIG5vZGUgKE51bGwgb24gZmFpbHVyZSkKKyAqCisgKiBERVNDUklQVElPTjogQ3JlYXRlIGEgbmFtZXNwYWNlIG5vZGUKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKmFjcGlfbnNfY3JlYXRlX25vZGUodTMyIG5hbWUpCit7CisJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGU7CisjaWZkZWYgQUNQSV9EQkdfVFJBQ0tfQUxMT0NBVElPTlMKKwl1MzIgdGVtcDsKKyNlbmRpZgorCisJQUNQSV9GVU5DVElPTl9UUkFDRShuc19jcmVhdGVfbm9kZSk7CisKKwlub2RlID0gYWNwaV9vc19hY3F1aXJlX29iamVjdChhY3BpX2dibF9uYW1lc3BhY2VfY2FjaGUpOworCWlmICghbm9kZSkgeworCQlyZXR1cm5fUFRSKE5VTEwpOworCX0KKworCUFDUElfTUVNX1RSQUNLSU5HKGFjcGlfZ2JsX25zX25vZGVfbGlzdC0+dG90YWxfYWxsb2NhdGVkKyspOworCisjaWZkZWYgQUNQSV9EQkdfVFJBQ0tfQUxMT0NBVElPTlMKKwl0ZW1wID0KKwkgICAgYWNwaV9nYmxfbnNfbm9kZV9saXN0LT50b3RhbF9hbGxvY2F0ZWQgLQorCSAgICBhY3BpX2dibF9uc19ub2RlX2xpc3QtPnRvdGFsX2ZyZWVkOworCWlmICh0ZW1wID4gYWNwaV9nYmxfbnNfbm9kZV9saXN0LT5tYXhfb2NjdXBpZWQpIHsKKwkJYWNwaV9nYmxfbnNfbm9kZV9saXN0LT5tYXhfb2NjdXBpZWQgPSB0ZW1wOworCX0KKyNlbmRpZgorCisJbm9kZS0+bmFtZS5pbnRlZ2VyID0gbmFtZTsKKwlBQ1BJX1NFVF9ERVNDUklQVE9SX1RZUEUobm9kZSwgQUNQSV9ERVNDX1RZUEVfTkFNRUQpOworCXJldHVybl9QVFIobm9kZSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfbnNfZGVsZXRlX25vZGUKKyAqCisgKiBQQVJBTUVURVJTOiAgTm9kZSAgICAgICAgICAgIC0gTm9kZSB0byBiZSBkZWxldGVkCisgKgorICogUkVUVVJOOiAgICAgIE5vbmUKKyAqCisgKiBERVNDUklQVElPTjogRGVsZXRlIGEgbmFtZXNwYWNlIG5vZGUKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIGFjcGlfbnNfZGVsZXRlX25vZGUoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGUpCit7CisJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKnBhcmVudF9ub2RlOworCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpwcmV2X25vZGU7CisJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5leHRfbm9kZTsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKG5zX2RlbGV0ZV9ub2RlLCBub2RlKTsKKworCXBhcmVudF9ub2RlID0gYWNwaV9uc19nZXRfcGFyZW50X25vZGUobm9kZSk7CisKKwlwcmV2X25vZGUgPSBOVUxMOworCW5leHRfbm9kZSA9IHBhcmVudF9ub2RlLT5jaGlsZDsKKworCS8qIEZpbmQgdGhlIG5vZGUgdGhhdCBpcyB0aGUgcHJldmlvdXMgcGVlciBpbiB0aGUgcGFyZW50J3MgY2hpbGQgbGlzdCAqLworCisJd2hpbGUgKG5leHRfbm9kZSAhPSBub2RlKSB7CisJCXByZXZfbm9kZSA9IG5leHRfbm9kZTsKKwkJbmV4dF9ub2RlID0gcHJldl9ub2RlLT5wZWVyOworCX0KKworCWlmIChwcmV2X25vZGUpIHsKKworCQkvKiBOb2RlIGlzIG5vdCBmaXJzdCBjaGlsZCwgdW5saW5rIGl0ICovCisKKwkJcHJldl9ub2RlLT5wZWVyID0gbmV4dF9ub2RlLT5wZWVyOworCQlpZiAobmV4dF9ub2RlLT5mbGFncyAmIEFOT0JKX0VORF9PRl9QRUVSX0xJU1QpIHsKKwkJCXByZXZfbm9kZS0+ZmxhZ3MgfD0gQU5PQkpfRU5EX09GX1BFRVJfTElTVDsKKwkJfQorCX0gZWxzZSB7CisJCS8qIE5vZGUgaXMgZmlyc3QgY2hpbGQgKGhhcyBubyBwcmV2aW91cyBwZWVyKSAqLworCisJCWlmIChuZXh0X25vZGUtPmZsYWdzICYgQU5PQkpfRU5EX09GX1BFRVJfTElTVCkgeworCisJCQkvKiBObyBwZWVycyBhdCBhbGwgKi8KKworCQkJcGFyZW50X25vZGUtPmNoaWxkID0gTlVMTDsKKwkJfSBlbHNlIHsJLyogTGluayBwZWVyIGxpc3QgdG8gcGFyZW50ICovCisKKwkJCXBhcmVudF9ub2RlLT5jaGlsZCA9IG5leHRfbm9kZS0+cGVlcjsKKwkJfQorCX0KKworCUFDUElfTUVNX1RSQUNLSU5HKGFjcGlfZ2JsX25zX25vZGVfbGlzdC0+dG90YWxfZnJlZWQrKyk7CisKKwkvKgorCSAqIERldGFjaCBhbiBvYmplY3QgaWYgdGhlcmUgaXMgb25lLCB0aGVuIGRlbGV0ZSB0aGUgbm9kZQorCSAqLworCWFjcGlfbnNfZGV0YWNoX29iamVjdChub2RlKTsKKwkodm9pZClhY3BpX29zX3JlbGVhc2Vfb2JqZWN0KGFjcGlfZ2JsX25hbWVzcGFjZV9jYWNoZSwgbm9kZSk7CisJcmV0dXJuX1ZPSUQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfbnNfaW5zdGFsbF9ub2RlCisgKgorICogUEFSQU1FVEVSUzogIHdhbGtfc3RhdGUgICAgICAtIEN1cnJlbnQgc3RhdGUgb2YgdGhlIHdhbGsKKyAqICAgICAgICAgICAgICBwYXJlbnRfbm9kZSAgICAgLSBUaGUgcGFyZW50IG9mIHRoZSBuZXcgTm9kZQorICogICAgICAgICAgICAgIE5vZGUgICAgICAgICAgICAtIFRoZSBuZXcgTm9kZSB0byBpbnN0YWxsCisgKiAgICAgICAgICAgICAgVHlwZSAgICAgICAgICAgIC0gQUNQSSBvYmplY3QgdHlwZSBvZiB0aGUgbmV3IE5vZGUKKyAqCisgKiBSRVRVUk46ICAgICAgTm9uZQorICoKKyAqIERFU0NSSVBUSU9OOiBJbml0aWFsaXplIGEgbmV3IG5hbWVzcGFjZSBub2RlIGFuZCBpbnN0YWxsIGl0IGFtb25nc3QKKyAqICAgICAgICAgICAgICBpdHMgcGVlcnMuCisgKgorICogICAgICAgICAgICAgIE5vdGU6IEN1cnJlbnQgbmFtZXNwYWNlIGxvb2t1cCBpcyBsaW5lYXIgc2VhcmNoLiBUaGlzIGFwcGVhcnMKKyAqICAgICAgICAgICAgICB0byBiZSBzdWZmaWNpZW50IGFzIG5hbWVzcGFjZSBzZWFyY2hlcyBjb25zdW1lIG9ubHkgYSBzbWFsbAorICogICAgICAgICAgICAgIGZyYWN0aW9uIG9mIHRoZSBleGVjdXRpb24gdGltZSBvZiB0aGUgQUNQSSBzdWJzeXN0ZW0uCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBhY3BpX25zX2luc3RhbGxfbm9kZShzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlLCBzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqcGFyZW50X25vZGUsCS8qIFBhcmVudCAqLworCQkJICBzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZSwJLyogTmV3IENoaWxkICovCisJCQkgIGFjcGlfb2JqZWN0X3R5cGUgdHlwZSkKK3sKKwlhY3BpX293bmVyX2lkIG93bmVyX2lkID0gMDsKKwlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqY2hpbGRfbm9kZTsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0UobnNfaW5zdGFsbF9ub2RlKTsKKworCS8qCisJICogR2V0IHRoZSBvd25lciBJRCBmcm9tIHRoZSBXYWxrIHN0YXRlCisJICogVGhlIG93bmVyIElEIGlzIHVzZWQgdG8gdHJhY2sgdGFibGUgZGVsZXRpb24gYW5kCisJICogZGVsZXRpb24gb2Ygb2JqZWN0cyBjcmVhdGVkIGJ5IG1ldGhvZHMKKwkgKi8KKwlpZiAod2Fsa19zdGF0ZSkgeworCQlvd25lcl9pZCA9IHdhbGtfc3RhdGUtPm93bmVyX2lkOworCX0KKworCS8qIExpbmsgdGhlIG5ldyBlbnRyeSBpbnRvIHRoZSBwYXJlbnQgYW5kIGV4aXN0aW5nIGNoaWxkcmVuICovCisKKwljaGlsZF9ub2RlID0gcGFyZW50X25vZGUtPmNoaWxkOworCWlmICghY2hpbGRfbm9kZSkgeworCQlwYXJlbnRfbm9kZS0+Y2hpbGQgPSBub2RlOworCQlub2RlLT5mbGFncyB8PSBBTk9CSl9FTkRfT0ZfUEVFUl9MSVNUOworCQlub2RlLT5wZWVyID0gcGFyZW50X25vZGU7CisJfSBlbHNlIHsKKwkJd2hpbGUgKCEoY2hpbGRfbm9kZS0+ZmxhZ3MgJiBBTk9CSl9FTkRfT0ZfUEVFUl9MSVNUKSkgeworCQkJY2hpbGRfbm9kZSA9IGNoaWxkX25vZGUtPnBlZXI7CisJCX0KKworCQljaGlsZF9ub2RlLT5wZWVyID0gbm9kZTsKKworCQkvKiBDbGVhciBlbmQtb2YtbGlzdCBmbGFnICovCisKKwkJY2hpbGRfbm9kZS0+ZmxhZ3MgJj0gfkFOT0JKX0VORF9PRl9QRUVSX0xJU1Q7CisJCW5vZGUtPmZsYWdzIHw9IEFOT0JKX0VORF9PRl9QRUVSX0xJU1Q7CisJCW5vZGUtPnBlZXIgPSBwYXJlbnRfbm9kZTsKKwl9CisKKwkvKiBJbml0IHRoZSBuZXcgZW50cnkgKi8KKworCW5vZGUtPm93bmVyX2lkID0gb3duZXJfaWQ7CisJbm9kZS0+dHlwZSA9ICh1OCkgdHlwZTsKKworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfTkFNRVMsCisJCQkgICIlNC40cyAoJXMpIFtOb2RlICVwIE93bmVyICVYXSBhZGRlZCB0byAlNC40cyAoJXMpIFtOb2RlICVwXVxuIiwKKwkJCSAgYWNwaV91dF9nZXRfbm9kZV9uYW1lKG5vZGUpLAorCQkJICBhY3BpX3V0X2dldF90eXBlX25hbWUobm9kZS0+dHlwZSksIG5vZGUsIG93bmVyX2lkLAorCQkJICBhY3BpX3V0X2dldF9ub2RlX25hbWUocGFyZW50X25vZGUpLAorCQkJICBhY3BpX3V0X2dldF90eXBlX25hbWUocGFyZW50X25vZGUtPnR5cGUpLAorCQkJICBwYXJlbnRfbm9kZSkpOworCisJcmV0dXJuX1ZPSUQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfbnNfZGVsZXRlX2NoaWxkcmVuCisgKgorICogUEFSQU1FVEVSUzogIHBhcmVudF9ub2RlICAgICAtIERlbGV0ZSB0aGlzIG9iamVjdHMgY2hpbGRyZW4KKyAqCisgKiBSRVRVUk46ICAgICAgTm9uZS4KKyAqCisgKiBERVNDUklQVElPTjogRGVsZXRlIGFsbCBjaGlsZHJlbiBvZiB0aGUgcGFyZW50IG9iamVjdC4gSW4gb3RoZXIgd29yZHMsCisgKiAgICAgICAgICAgICAgZGVsZXRlcyBhICJzY29wZSIuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBhY3BpX25zX2RlbGV0ZV9jaGlsZHJlbihzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqcGFyZW50X25vZGUpCit7CisJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKmNoaWxkX25vZGU7CisJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5leHRfbm9kZTsKKwl1OCBmbGFnczsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKG5zX2RlbGV0ZV9jaGlsZHJlbiwgcGFyZW50X25vZGUpOworCisJaWYgKCFwYXJlbnRfbm9kZSkgeworCQlyZXR1cm5fVk9JRDsKKwl9CisKKwkvKiBJZiBubyBjaGlsZHJlbiwgYWxsIGRvbmUhICovCisKKwljaGlsZF9ub2RlID0gcGFyZW50X25vZGUtPmNoaWxkOworCWlmICghY2hpbGRfbm9kZSkgeworCQlyZXR1cm5fVk9JRDsKKwl9CisKKwkvKgorCSAqIERlYWxsb2NhdGUgYWxsIGNoaWxkcmVuIGF0IHRoaXMgbGV2ZWwKKwkgKi8KKwlkbyB7CisKKwkJLyogR2V0IHRoZSB0aGluZ3Mgd2UgbmVlZCAqLworCisJCW5leHRfbm9kZSA9IGNoaWxkX25vZGUtPnBlZXI7CisJCWZsYWdzID0gY2hpbGRfbm9kZS0+ZmxhZ3M7CisKKwkJLyogR3JhbmRjaGlsZHJlbiBzaG91bGQgaGF2ZSBhbGwgYmVlbiBkZWxldGVkIGFscmVhZHkgKi8KKworCQlpZiAoY2hpbGRfbm9kZS0+Y2hpbGQpIHsKKwkJCUFDUElfRVJST1IoKEFFX0lORk8sICJGb3VuZCBhIGdyYW5kY2hpbGQhIFA9JXAgQz0lcCIsCisJCQkJICAgIHBhcmVudF9ub2RlLCBjaGlsZF9ub2RlKSk7CisJCX0KKworCQkvKiBOb3cgd2UgY2FuIGZyZWUgdGhpcyBjaGlsZCBvYmplY3QgKi8KKworCQlBQ1BJX01FTV9UUkFDS0lORyhhY3BpX2dibF9uc19ub2RlX2xpc3QtPnRvdGFsX2ZyZWVkKyspOworCisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfQUxMT0NBVElPTlMsCisJCQkJICAiT2JqZWN0ICVwLCBSZW1haW5pbmcgJVhcbiIsIGNoaWxkX25vZGUsCisJCQkJICBhY3BpX2dibF9jdXJyZW50X25vZGVfY291bnQpKTsKKworCQkvKgorCQkgKiBEZXRhY2ggYW4gb2JqZWN0IGlmIHRoZXJlIGlzIG9uZSwgdGhlbiBmcmVlIHRoZSBjaGlsZCBub2RlCisJCSAqLworCQlhY3BpX25zX2RldGFjaF9vYmplY3QoY2hpbGRfbm9kZSk7CisKKwkJLyogTm93IHdlIGNhbiBkZWxldGUgdGhlIG5vZGUgKi8KKworCQkodm9pZClhY3BpX29zX3JlbGVhc2Vfb2JqZWN0KGFjcGlfZ2JsX25hbWVzcGFjZV9jYWNoZSwKKwkJCQkJICAgICBjaGlsZF9ub2RlKTsKKworCQkvKiBBbmQgbW92ZSBvbiB0byB0aGUgbmV4dCBjaGlsZCBpbiB0aGUgbGlzdCAqLworCisJCWNoaWxkX25vZGUgPSBuZXh0X25vZGU7CisKKwl9IHdoaWxlICghKGZsYWdzICYgQU5PQkpfRU5EX09GX1BFRVJfTElTVCkpOworCisJLyogQ2xlYXIgdGhlIHBhcmVudCdzIGNoaWxkIHBvaW50ZXIgKi8KKworCXBhcmVudF9ub2RlLT5jaGlsZCA9IE5VTEw7CisKKwlyZXR1cm5fVk9JRDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9uc19kZWxldGVfbmFtZXNwYWNlX3N1YnRyZWUKKyAqCisgKiBQQVJBTUVURVJTOiAgcGFyZW50X25vZGUgICAgIC0gUm9vdCBvZiB0aGUgc3VidHJlZSB0byBiZSBkZWxldGVkCisgKgorICogUkVUVVJOOiAgICAgIE5vbmUuCisgKgorICogREVTQ1JJUFRJT046IERlbGV0ZSBhIHN1YnRyZWUgb2YgdGhlIG5hbWVzcGFjZS4gIFRoaXMgaW5jbHVkZXMgYWxsIG9iamVjdHMKKyAqICAgICAgICAgICAgICBzdG9yZWQgd2l0aGluIHRoZSBzdWJ0cmVlLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgYWNwaV9uc19kZWxldGVfbmFtZXNwYWNlX3N1YnRyZWUoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKnBhcmVudF9ub2RlKQoreworCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpjaGlsZF9ub2RlID0gTlVMTDsKKwl1MzIgbGV2ZWwgPSAxOworCisJQUNQSV9GVU5DVElPTl9UUkFDRShuc19kZWxldGVfbmFtZXNwYWNlX3N1YnRyZWUpOworCisJaWYgKCFwYXJlbnRfbm9kZSkgeworCQlyZXR1cm5fVk9JRDsKKwl9CisKKwkvKgorCSAqIFRyYXZlcnNlIHRoZSB0cmVlIG9mIG9iamVjdHMgdW50aWwgd2UgYnViYmxlIGJhY2sgdXAKKwkgKiB0byB3aGVyZSB3ZSBzdGFydGVkLgorCSAqLworCXdoaWxlIChsZXZlbCA+IDApIHsKKworCQkvKiBHZXQgdGhlIG5leHQgbm9kZSBpbiB0aGlzIHNjb3BlIChOVUxMIGlmIG5vbmUpICovCisKKwkJY2hpbGRfbm9kZSA9CisJCSAgICBhY3BpX25zX2dldF9uZXh0X25vZGUoQUNQSV9UWVBFX0FOWSwgcGFyZW50X25vZGUsCisJCQkJCSAgY2hpbGRfbm9kZSk7CisJCWlmIChjaGlsZF9ub2RlKSB7CisKKwkJCS8qIEZvdW5kIGEgY2hpbGQgbm9kZSAtIGRldGFjaCBhbnkgYXR0YWNoZWQgb2JqZWN0ICovCisKKwkJCWFjcGlfbnNfZGV0YWNoX29iamVjdChjaGlsZF9ub2RlKTsKKworCQkJLyogQ2hlY2sgaWYgdGhpcyBub2RlIGhhcyBhbnkgY2hpbGRyZW4gKi8KKworCQkJaWYgKGFjcGlfbnNfZ2V0X25leHRfbm9kZQorCQkJICAgIChBQ1BJX1RZUEVfQU5ZLCBjaGlsZF9ub2RlLCBOVUxMKSkgeworCQkJCS8qCisJCQkJICogVGhlcmUgaXMgYXQgbGVhc3Qgb25lIGNoaWxkIG9mIHRoaXMgbm9kZSwKKwkJCQkgKiB2aXNpdCB0aGUgbm9kZQorCQkJCSAqLworCQkJCWxldmVsKys7CisJCQkJcGFyZW50X25vZGUgPSBjaGlsZF9ub2RlOworCQkJCWNoaWxkX25vZGUgPSBOVUxMOworCQkJfQorCQl9IGVsc2UgeworCQkJLyoKKwkJCSAqIE5vIG1vcmUgY2hpbGRyZW4gb2YgdGhpcyBwYXJlbnQgbm9kZS4KKwkJCSAqIE1vdmUgdXAgdG8gdGhlIGdyYW5kcGFyZW50LgorCQkJICovCisJCQlsZXZlbC0tOworCisJCQkvKgorCQkJICogTm93IGRlbGV0ZSBhbGwgb2YgdGhlIGNoaWxkcmVuIG9mIHRoaXMgcGFyZW50CisJCQkgKiBhbGwgYXQgdGhlIHNhbWUgdGltZS4KKwkJCSAqLworCQkJYWNwaV9uc19kZWxldGVfY2hpbGRyZW4ocGFyZW50X25vZGUpOworCisJCQkvKiBOZXcgImxhc3QgY2hpbGQiIGlzIHRoaXMgcGFyZW50IG5vZGUgKi8KKworCQkJY2hpbGRfbm9kZSA9IHBhcmVudF9ub2RlOworCisJCQkvKiBNb3ZlIHVwIHRoZSB0cmVlIHRvIHRoZSBncmFuZHBhcmVudCAqLworCisJCQlwYXJlbnRfbm9kZSA9IGFjcGlfbnNfZ2V0X3BhcmVudF9ub2RlKHBhcmVudF9ub2RlKTsKKwkJfQorCX0KKworCXJldHVybl9WT0lEOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX25zX2RlbGV0ZV9uYW1lc3BhY2VfYnlfb3duZXIKKyAqCisgKiBQQVJBTUVURVJTOiAgb3duZXJfaWQgICAgLSBBbGwgbm9kZXMgd2l0aCB0aGlzIG93bmVyIHdpbGwgYmUgZGVsZXRlZAorICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogRGVsZXRlIGVudHJpZXMgd2l0aGluIHRoZSBuYW1lc3BhY2UgdGhhdCBhcmUgb3duZWQgYnkgYQorICogICAgICAgICAgICAgIHNwZWNpZmljIElELiAgVXNlZCB0byBkZWxldGUgZW50aXJlIEFDUEkgdGFibGVzLiAgQWxsCisgKiAgICAgICAgICAgICAgcmVmZXJlbmNlIGNvdW50cyBhcmUgdXBkYXRlZC4KKyAqCisgKiBNVVRFWDogICAgICAgTG9ja3MgbmFtZXNwYWNlIGR1cmluZyBkZWxldGlvbiB3YWxrLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgYWNwaV9uc19kZWxldGVfbmFtZXNwYWNlX2J5X293bmVyKGFjcGlfb3duZXJfaWQgb3duZXJfaWQpCit7CisJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKmNoaWxkX25vZGU7CisJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKmRlbGV0aW9uX25vZGU7CisJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKnBhcmVudF9ub2RlOworCXUzMiBsZXZlbDsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1UzMihuc19kZWxldGVfbmFtZXNwYWNlX2J5X293bmVyLCBvd25lcl9pZCk7CisKKwlpZiAob3duZXJfaWQgPT0gMCkgeworCQlyZXR1cm5fVk9JRDsKKwl9CisKKwkvKiBMb2NrIG5hbWVzcGFjZSBmb3IgcG9zc2libGUgdXBkYXRlICovCisKKwlzdGF0dXMgPSBhY3BpX3V0X2FjcXVpcmVfbXV0ZXgoQUNQSV9NVFhfTkFNRVNQQUNFKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuX1ZPSUQ7CisJfQorCisJZGVsZXRpb25fbm9kZSA9IE5VTEw7CisJcGFyZW50X25vZGUgPSBhY3BpX2dibF9yb290X25vZGU7CisJY2hpbGRfbm9kZSA9IE5VTEw7CisJbGV2ZWwgPSAxOworCisJLyoKKwkgKiBUcmF2ZXJzZSB0aGUgdHJlZSBvZiBub2RlcyB1bnRpbCB3ZSBidWJibGUgYmFjayB1cAorCSAqIHRvIHdoZXJlIHdlIHN0YXJ0ZWQuCisJICovCisJd2hpbGUgKGxldmVsID4gMCkgeworCQkvKgorCQkgKiBHZXQgdGhlIG5leHQgY2hpbGQgb2YgdGhpcyBwYXJlbnQgbm9kZS4gV2hlbiBjaGlsZF9ub2RlIGlzIE5VTEwsCisJCSAqIHRoZSBmaXJzdCBjaGlsZCBvZiB0aGUgcGFyZW50IGlzIHJldHVybmVkCisJCSAqLworCQljaGlsZF9ub2RlID0KKwkJICAgIGFjcGlfbnNfZ2V0X25leHRfbm9kZShBQ1BJX1RZUEVfQU5ZLCBwYXJlbnRfbm9kZSwKKwkJCQkJICBjaGlsZF9ub2RlKTsKKworCQlpZiAoZGVsZXRpb25fbm9kZSkgeworCQkJYWNwaV9uc19kZWxldGVfY2hpbGRyZW4oZGVsZXRpb25fbm9kZSk7CisJCQlhY3BpX25zX2RlbGV0ZV9ub2RlKGRlbGV0aW9uX25vZGUpOworCQkJZGVsZXRpb25fbm9kZSA9IE5VTEw7CisJCX0KKworCQlpZiAoY2hpbGRfbm9kZSkgeworCQkJaWYgKGNoaWxkX25vZGUtPm93bmVyX2lkID09IG93bmVyX2lkKSB7CisKKwkJCQkvKiBGb3VuZCBhIG1hdGNoaW5nIGNoaWxkIG5vZGUgLSBkZXRhY2ggYW55IGF0dGFjaGVkIG9iamVjdCAqLworCisJCQkJYWNwaV9uc19kZXRhY2hfb2JqZWN0KGNoaWxkX25vZGUpOworCQkJfQorCisJCQkvKiBDaGVjayBpZiB0aGlzIG5vZGUgaGFzIGFueSBjaGlsZHJlbiAqLworCisJCQlpZiAoYWNwaV9uc19nZXRfbmV4dF9ub2RlCisJCQkgICAgKEFDUElfVFlQRV9BTlksIGNoaWxkX25vZGUsIE5VTEwpKSB7CisJCQkJLyoKKwkJCQkgKiBUaGVyZSBpcyBhdCBsZWFzdCBvbmUgY2hpbGQgb2YgdGhpcyBub2RlLAorCQkJCSAqIHZpc2l0IHRoZSBub2RlCisJCQkJICovCisJCQkJbGV2ZWwrKzsKKwkJCQlwYXJlbnRfbm9kZSA9IGNoaWxkX25vZGU7CisJCQkJY2hpbGRfbm9kZSA9IE5VTEw7CisJCQl9IGVsc2UgaWYgKGNoaWxkX25vZGUtPm93bmVyX2lkID09IG93bmVyX2lkKSB7CisJCQkJZGVsZXRpb25fbm9kZSA9IGNoaWxkX25vZGU7CisJCQl9CisJCX0gZWxzZSB7CisJCQkvKgorCQkJICogTm8gbW9yZSBjaGlsZHJlbiBvZiB0aGlzIHBhcmVudCBub2RlLgorCQkJICogTW92ZSB1cCB0byB0aGUgZ3JhbmRwYXJlbnQuCisJCQkgKi8KKwkJCWxldmVsLS07CisJCQlpZiAobGV2ZWwgIT0gMCkgeworCQkJCWlmIChwYXJlbnRfbm9kZS0+b3duZXJfaWQgPT0gb3duZXJfaWQpIHsKKwkJCQkJZGVsZXRpb25fbm9kZSA9IHBhcmVudF9ub2RlOworCQkJCX0KKwkJCX0KKworCQkJLyogTmV3ICJsYXN0IGNoaWxkIiBpcyB0aGlzIHBhcmVudCBub2RlICovCisKKwkJCWNoaWxkX25vZGUgPSBwYXJlbnRfbm9kZTsKKworCQkJLyogTW92ZSB1cCB0aGUgdHJlZSB0byB0aGUgZ3JhbmRwYXJlbnQgKi8KKworCQkJcGFyZW50X25vZGUgPSBhY3BpX25zX2dldF9wYXJlbnRfbm9kZShwYXJlbnRfbm9kZSk7CisJCX0KKwl9CisKKwkodm9pZClhY3BpX3V0X3JlbGVhc2VfbXV0ZXgoQUNQSV9NVFhfTkFNRVNQQUNFKTsKKwlyZXR1cm5fVk9JRDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvbnNkdW1wLmMgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL25zZHVtcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkYTMzYzgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL25zZHVtcC5jCkBAIC0wLDAgKzEsNzA5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogTW9kdWxlIE5hbWU6IG5zZHVtcCAtIHRhYmxlIGR1bXBpbmcgcm91dGluZXMgZm9yIGRlYnVnCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwOCwgSW50ZWwgQ29ycC4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKKyAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIGF0IG1pbmltdW0gYSBkaXNjbGFpbWVyCisgKiAgICBzdWJzdGFudGlhbGx5IHNpbWlsYXIgdG8gdGhlICJOTyBXQVJSQU5UWSIgZGlzY2xhaW1lciBiZWxvdworICogICAgKCJEaXNjbGFpbWVyIikgYW5kIGFueSByZWRpc3RyaWJ1dGlvbiBtdXN0IGJlIGNvbmRpdGlvbmVkIHVwb24KKyAqICAgIGluY2x1ZGluZyBhIHN1YnN0YW50aWFsbHkgc2ltaWxhciBEaXNjbGFpbWVyIHJlcXVpcmVtZW50IGZvciBmdXJ0aGVyCisgKiAgICBiaW5hcnkgcmVkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMKKyAqICAgIG9mIGFueSBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogTk8gV0FSUkFOVFkKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HCisgKiBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KKyAqLworCisjaW5jbHVkZSA8YWNwaS9hY3BpLmg+CisjaW5jbHVkZSAiYWNjb21tb24uaCIKKyNpbmNsdWRlICJhY25hbWVzcC5oIgorCisjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9OQU1FU1BBQ0UKK0FDUElfTU9EVUxFX05BTUUoIm5zZHVtcCIpCisKKy8qIExvY2FsIHByb3RvdHlwZXMgKi8KKyNpZmRlZiBBQ1BJX09CU09MRVRFX0ZVTkNUSU9OUwordm9pZCBhY3BpX25zX2R1bXBfcm9vdF9kZXZpY2VzKHZvaWQpOworCitzdGF0aWMgYWNwaV9zdGF0dXMKK2FjcGlfbnNfZHVtcF9vbmVfZGV2aWNlKGFjcGlfaGFuZGxlIG9ial9oYW5kbGUsCisJCQl1MzIgbGV2ZWwsIHZvaWQgKmNvbnRleHQsIHZvaWQgKipyZXR1cm5fdmFsdWUpOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKEFDUElfREVCVUdfT1VUUFVUKSB8fCBkZWZpbmVkKEFDUElfREVCVUdHRVIpCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX25zX3ByaW50X3BhdGhuYW1lCisgKgorICogUEFSQU1FVEVSUzogIG51bV9zZWdtZW50cyAgICAgICAgLSBOdW1iZXIgb2YgQUNQSSBuYW1lIHNlZ21lbnRzCisgKiAgICAgICAgICAgICAgUGF0aG5hbWUgICAgICAgICAgICAtIFRoZSBjb21wcmVzc2VkIChpbnRlcm5hbCkgcGF0aAorICoKKyAqIFJFVFVSTjogICAgICBOb25lCisgKgorICogREVTQ1JJUFRJT046IFByaW50IGFuIG9iamVjdCdzIGZ1bGwgbmFtZXNwYWNlIHBhdGhuYW1lCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBhY3BpX25zX3ByaW50X3BhdGhuYW1lKHUzMiBudW1fc2VnbWVudHMsIGNoYXIgKnBhdGhuYW1lKQoreworCXUzMiBpOworCisJQUNQSV9GVU5DVElPTl9OQU1FKG5zX3ByaW50X3BhdGhuYW1lKTsKKworCWlmICghKGFjcGlfZGJnX2xldmVsICYgQUNQSV9MVl9OQU1FUykKKwkgICAgfHwgIShhY3BpX2RiZ19sYXllciAmIEFDUElfTkFNRVNQQUNFKSkgeworCQlyZXR1cm47CisJfQorCisJLyogUHJpbnQgdGhlIGVudGlyZSBuYW1lICovCisKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX05BTUVTLCAiWyIpKTsKKworCXdoaWxlIChudW1fc2VnbWVudHMpIHsKKwkJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCQkJQUNQSV9JU19QUklOVChwYXRobmFtZVtpXSkgPworCQkJICAgIGFjcGlfb3NfcHJpbnRmKCIlYyIsIHBhdGhuYW1lW2ldKSA6CisJCQkgICAgYWNwaV9vc19wcmludGYoIj8iKTsKKwkJfQorCisJCXBhdGhuYW1lICs9IEFDUElfTkFNRV9TSVpFOworCQludW1fc2VnbWVudHMtLTsKKwkJaWYgKG51bV9zZWdtZW50cykgeworCQkJYWNwaV9vc19wcmludGYoIi4iKTsKKwkJfQorCX0KKworCWFjcGlfb3NfcHJpbnRmKCJdXG4iKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9uc19kdW1wX3BhdGhuYW1lCisgKgorICogUEFSQU1FVEVSUzogIEhhbmRsZSAgICAgICAgICAgICAgLSBPYmplY3QKKyAqICAgICAgICAgICAgICBNc2cgICAgICAgICAgICAgICAgIC0gUHJlZml4IG1lc3NhZ2UKKyAqICAgICAgICAgICAgICBMZXZlbCAgICAgICAgICAgICAgIC0gRGVzaXJlZCBkZWJ1ZyBsZXZlbAorICogICAgICAgICAgICAgIENvbXBvbmVudCAgICAgICAgICAgLSBDYWxsZXIncyBjb21wb25lbnQgSUQKKyAqCisgKiBSRVRVUk46ICAgICAgTm9uZQorICoKKyAqIERFU0NSSVBUSU9OOiBQcmludCBhbiBvYmplY3QncyBmdWxsIG5hbWVzcGFjZSBwYXRobmFtZQorICogICAgICAgICAgICAgIE1hbmFnZXMgYWxsb2NhdGlvbi9mcmVlaW5nIG9mIGEgcGF0aG5hbWUgYnVmZmVyCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZAorYWNwaV9uc19kdW1wX3BhdGhuYW1lKGFjcGlfaGFuZGxlIGhhbmRsZSwgY2hhciAqbXNnLCB1MzIgbGV2ZWwsIHUzMiBjb21wb25lbnQpCit7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKG5zX2R1bXBfcGF0aG5hbWUpOworCisJLyogRG8gdGhpcyBvbmx5IGlmIHRoZSByZXF1ZXN0ZWQgZGVidWcgbGV2ZWwgYW5kIGNvbXBvbmVudCBhcmUgZW5hYmxlZCAqLworCisJaWYgKCEoYWNwaV9kYmdfbGV2ZWwgJiBsZXZlbCkgfHwgIShhY3BpX2RiZ19sYXllciAmIGNvbXBvbmVudCkpIHsKKwkJcmV0dXJuX1ZPSUQ7CisJfQorCisJLyogQ29udmVydCBoYW5kbGUgdG8gYSBmdWxsIHBhdGhuYW1lIGFuZCBwcmludCBpdCAod2l0aCBzdXBwbGllZCBtZXNzYWdlKSAqLworCisJYWNwaV9uc19wcmludF9ub2RlX3BhdGhuYW1lKGhhbmRsZSwgbXNnKTsKKwlhY3BpX29zX3ByaW50ZigiXG4iKTsKKwlyZXR1cm5fVk9JRDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9uc19kdW1wX29uZV9vYmplY3QKKyAqCisgKiBQQVJBTUVURVJTOiAgb2JqX2hhbmRsZSAgICAgICAgICAtIE5vZGUgdG8gYmUgZHVtcGVkCisgKiAgICAgICAgICAgICAgTGV2ZWwgICAgICAgICAgICAgICAtIE5lc3RpbmcgbGV2ZWwgb2YgdGhlIGhhbmRsZQorICogICAgICAgICAgICAgIENvbnRleHQgICAgICAgICAgICAgLSBQYXNzZWQgaW50byB3YWxrX25hbWVzcGFjZQorICogICAgICAgICAgICAgIHJldHVybl92YWx1ZSAgICAgICAgLSBOb3QgdXNlZAorICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogRHVtcCBhIHNpbmdsZSBOb2RlCisgKiAgICAgICAgICAgICAgVGhpcyBwcm9jZWR1cmUgaXMgYSB1c2VyX2Z1bmN0aW9uIGNhbGxlZCBieSBhY3BpX25zX3dhbGtfbmFtZXNwYWNlLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2FjcGlfc3RhdHVzCithY3BpX25zX2R1bXBfb25lX29iamVjdChhY3BpX2hhbmRsZSBvYmpfaGFuZGxlLAorCQkJdTMyIGxldmVsLCB2b2lkICpjb250ZXh0LCB2b2lkICoqcmV0dXJuX3ZhbHVlKQoreworCXN0cnVjdCBhY3BpX3dhbGtfaW5mbyAqaW5mbyA9IChzdHJ1Y3QgYWNwaV93YWxrX2luZm8gKiljb250ZXh0OworCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICp0aGlzX25vZGU7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2MgPSBOVUxMOworCWFjcGlfb2JqZWN0X3R5cGUgb2JqX3R5cGU7CisJYWNwaV9vYmplY3RfdHlwZSB0eXBlOworCXUzMiBieXRlc190b19kdW1wOworCXUzMiBkYmdfbGV2ZWw7CisJdTMyIGk7CisKKwlBQ1BJX0ZVTkNUSU9OX05BTUUobnNfZHVtcF9vbmVfb2JqZWN0KTsKKworCS8qIElzIG91dHB1dCBlbmFibGVkPyAqLworCisJaWYgKCEoYWNwaV9kYmdfbGV2ZWwgJiBpbmZvLT5kZWJ1Z19sZXZlbCkpIHsKKwkJcmV0dXJuIChBRV9PSyk7CisJfQorCisJaWYgKCFvYmpfaGFuZGxlKSB7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgIk51bGwgb2JqZWN0IGhhbmRsZVxuIikpOworCQlyZXR1cm4gKEFFX09LKTsKKwl9CisKKwl0aGlzX25vZGUgPSBhY3BpX25zX21hcF9oYW5kbGVfdG9fbm9kZShvYmpfaGFuZGxlKTsKKwl0eXBlID0gdGhpc19ub2RlLT50eXBlOworCisJLyogQ2hlY2sgaWYgdGhlIG93bmVyIG1hdGNoZXMgKi8KKworCWlmICgoaW5mby0+b3duZXJfaWQgIT0gQUNQSV9PV05FUl9JRF9NQVgpICYmCisJICAgIChpbmZvLT5vd25lcl9pZCAhPSB0aGlzX25vZGUtPm93bmVyX2lkKSkgeworCQlyZXR1cm4gKEFFX09LKTsKKwl9CisKKwlpZiAoIShpbmZvLT5kaXNwbGF5X3R5cGUgJiBBQ1BJX0RJU1BMQVlfU0hPUlQpKSB7CisKKwkJLyogSW5kZW50IHRoZSBvYmplY3QgYWNjb3JkaW5nIHRvIHRoZSBsZXZlbCAqLworCisJCWFjcGlfb3NfcHJpbnRmKCIlMmQlKnMiLCAodTMyKSBsZXZlbCAtIDEsIChpbnQpbGV2ZWwgKiAyLCAiICIpOworCisJCS8qIENoZWNrIHRoZSBub2RlIHR5cGUgYW5kIG5hbWUgKi8KKworCQlpZiAodHlwZSA+IEFDUElfVFlQRV9MT0NBTF9NQVgpIHsKKwkJCUFDUElfV0FSTklORygoQUVfSU5GTywgIkludmFsaWQgQUNQSSBPYmplY3QgVHlwZSAlMDhYIiwKKwkJCQkgICAgICB0eXBlKSk7CisJCX0KKworCQlpZiAoIWFjcGlfdXRfdmFsaWRfYWNwaV9uYW1lKHRoaXNfbm9kZS0+bmFtZS5pbnRlZ2VyKSkgeworCQkJdGhpc19ub2RlLT5uYW1lLmludGVnZXIgPQorCQkJICAgIGFjcGlfdXRfcmVwYWlyX25hbWUodGhpc19ub2RlLT5uYW1lLmFzY2lpKTsKKworCQkJQUNQSV9XQVJOSU5HKChBRV9JTkZPLCAiSW52YWxpZCBBQ1BJIE5hbWUgJTA4WCIsCisJCQkJICAgICAgdGhpc19ub2RlLT5uYW1lLmludGVnZXIpKTsKKwkJfQorCisJCWFjcGlfb3NfcHJpbnRmKCIlNC40cyIsIGFjcGlfdXRfZ2V0X25vZGVfbmFtZSh0aGlzX25vZGUpKTsKKwl9CisKKwkvKgorCSAqIE5vdyB3ZSBjYW4gcHJpbnQgb3V0IHRoZSBwZXJ0aW5lbnQgaW5mb3JtYXRpb24KKwkgKi8KKwlhY3BpX29zX3ByaW50ZigiICUtMTJzICVwICUyLjJYICIsCisJCSAgICAgICBhY3BpX3V0X2dldF90eXBlX25hbWUodHlwZSksIHRoaXNfbm9kZSwKKwkJICAgICAgIHRoaXNfbm9kZS0+b3duZXJfaWQpOworCisJZGJnX2xldmVsID0gYWNwaV9kYmdfbGV2ZWw7CisJYWNwaV9kYmdfbGV2ZWwgPSAwOworCW9ial9kZXNjID0gYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0KHRoaXNfbm9kZSk7CisJYWNwaV9kYmdfbGV2ZWwgPSBkYmdfbGV2ZWw7CisKKwkvKiBUZW1wIG5vZGVzIGFyZSB0aG9zZSBub2RlcyBjcmVhdGVkIGJ5IGEgY29udHJvbCBtZXRob2QgKi8KKworCWlmICh0aGlzX25vZGUtPmZsYWdzICYgQU5PQkpfVEVNUE9SQVJZKSB7CisJCWFjcGlfb3NfcHJpbnRmKCIoVCkgIik7CisJfQorCisJc3dpdGNoIChpbmZvLT5kaXNwbGF5X3R5cGUgJiBBQ1BJX0RJU1BMQVlfTUFTSykgeworCWNhc2UgQUNQSV9ESVNQTEFZX1NVTU1BUlk6CisKKwkJaWYgKCFvYmpfZGVzYykgeworCisJCQkvKiBObyBhdHRhY2hlZCBvYmplY3QsIHdlIGFyZSBkb25lICovCisKKwkJCWFjcGlfb3NfcHJpbnRmKCJcbiIpOworCQkJcmV0dXJuIChBRV9PSyk7CisJCX0KKworCQlzd2l0Y2ggKHR5cGUpIHsKKwkJY2FzZSBBQ1BJX1RZUEVfUFJPQ0VTU09SOgorCisJCQlhY3BpX29zX3ByaW50ZigiSUQgJVggTGVuICUuNFggQWRkciAlcFxuIiwKKwkJCQkgICAgICAgb2JqX2Rlc2MtPnByb2Nlc3Nvci5wcm9jX2lkLAorCQkJCSAgICAgICBvYmpfZGVzYy0+cHJvY2Vzc29yLmxlbmd0aCwKKwkJCQkgICAgICAgQUNQSV9DQVNUX1BUUih2b2lkLAorCQkJCQkJICAgICBvYmpfZGVzYy0+cHJvY2Vzc29yLgorCQkJCQkJICAgICBhZGRyZXNzKSk7CisJCQlicmVhazsKKworCQljYXNlIEFDUElfVFlQRV9ERVZJQ0U6CisKKwkJCWFjcGlfb3NfcHJpbnRmKCJOb3RpZnkgT2JqZWN0OiAlcFxuIiwgb2JqX2Rlc2MpOworCQkJYnJlYWs7CisKKwkJY2FzZSBBQ1BJX1RZUEVfTUVUSE9EOgorCisJCQlhY3BpX29zX3ByaW50ZigiQXJncyAlWCBMZW4gJS40WCBBbWwgJXBcbiIsCisJCQkJICAgICAgICh1MzIpIG9ial9kZXNjLT5tZXRob2QucGFyYW1fY291bnQsCisJCQkJICAgICAgIG9ial9kZXNjLT5tZXRob2QuYW1sX2xlbmd0aCwKKwkJCQkgICAgICAgb2JqX2Rlc2MtPm1ldGhvZC5hbWxfc3RhcnQpOworCQkJYnJlYWs7CisKKwkJY2FzZSBBQ1BJX1RZUEVfSU5URUdFUjoKKworCQkJYWNwaV9vc19wcmludGYoIj0gJTguOFglOC44WFxuIiwKKwkJCQkgICAgICAgQUNQSV9GT1JNQVRfVUlOVDY0KG9ial9kZXNjLT5pbnRlZ2VyLgorCQkJCQkJCSAgdmFsdWUpKTsKKwkJCWJyZWFrOworCisJCWNhc2UgQUNQSV9UWVBFX1BBQ0tBR0U6CisKKwkJCWlmIChvYmpfZGVzYy0+Y29tbW9uLmZsYWdzICYgQU9QT0JKX0RBVEFfVkFMSUQpIHsKKwkJCQlhY3BpX29zX3ByaW50ZigiRWxlbWVudHMgJS4yWFxuIiwKKwkJCQkJICAgICAgIG9ial9kZXNjLT5wYWNrYWdlLmNvdW50KTsKKwkJCX0gZWxzZSB7CisJCQkJYWNwaV9vc19wcmludGYoIltMZW5ndGggbm90IHlldCBldmFsdWF0ZWRdXG4iKTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgQUNQSV9UWVBFX0JVRkZFUjoKKworCQkJaWYgKG9ial9kZXNjLT5jb21tb24uZmxhZ3MgJiBBT1BPQkpfREFUQV9WQUxJRCkgeworCQkJCWFjcGlfb3NfcHJpbnRmKCJMZW4gJS4yWCIsCisJCQkJCSAgICAgICBvYmpfZGVzYy0+YnVmZmVyLmxlbmd0aCk7CisKKwkJCQkvKiBEdW1wIHNvbWUgb2YgdGhlIGJ1ZmZlciAqLworCisJCQkJaWYgKG9ial9kZXNjLT5idWZmZXIubGVuZ3RoID4gMCkgeworCQkJCQlhY3BpX29zX3ByaW50ZigiID0iKTsKKwkJCQkJZm9yIChpID0gMDsKKwkJCQkJICAgICAoaSA8IG9ial9kZXNjLT5idWZmZXIubGVuZ3RoCisJCQkJCSAgICAgICYmIGkgPCAxMik7IGkrKykgeworCQkJCQkJYWNwaV9vc19wcmludGYoIiAlLjJoWCIsCisJCQkJCQkJICAgICAgIG9ial9kZXNjLT5idWZmZXIuCisJCQkJCQkJICAgICAgIHBvaW50ZXJbaV0pOworCQkJCQl9CisJCQkJfQorCQkJCWFjcGlfb3NfcHJpbnRmKCJcbiIpOworCQkJfSBlbHNlIHsKKwkJCQlhY3BpX29zX3ByaW50ZigiW0xlbmd0aCBub3QgeWV0IGV2YWx1YXRlZF1cbiIpOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBBQ1BJX1RZUEVfU1RSSU5HOgorCisJCQlhY3BpX29zX3ByaW50ZigiTGVuICUuMlggIiwgb2JqX2Rlc2MtPnN0cmluZy5sZW5ndGgpOworCQkJYWNwaV91dF9wcmludF9zdHJpbmcob2JqX2Rlc2MtPnN0cmluZy5wb2ludGVyLCAzMik7CisJCQlhY3BpX29zX3ByaW50ZigiXG4iKTsKKwkJCWJyZWFrOworCisJCWNhc2UgQUNQSV9UWVBFX1JFR0lPTjoKKworCQkJYWNwaV9vc19wcmludGYoIlslc10iLAorCQkJCSAgICAgICBhY3BpX3V0X2dldF9yZWdpb25fbmFtZShvYmpfZGVzYy0+cmVnaW9uLgorCQkJCQkJCSAgICAgICBzcGFjZV9pZCkpOworCQkJaWYgKG9ial9kZXNjLT5yZWdpb24uZmxhZ3MgJiBBT1BPQkpfREFUQV9WQUxJRCkgeworCQkJCWFjcGlfb3NfcHJpbnRmKCIgQWRkciAlOC44WCU4LjhYIExlbiAlLjRYXG4iLAorCQkJCQkgICAgICAgQUNQSV9GT1JNQVRfTkFUSVZFX1VJTlQKKwkJCQkJICAgICAgIChvYmpfZGVzYy0+cmVnaW9uLmFkZHJlc3MpLAorCQkJCQkgICAgICAgb2JqX2Rlc2MtPnJlZ2lvbi5sZW5ndGgpOworCQkJfSBlbHNlIHsKKwkJCQlhY3BpX29zX3ByaW50ZgorCQkJCSAgICAoIiBbQWRkcmVzcy9MZW5ndGggbm90IHlldCBldmFsdWF0ZWRdXG4iKTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgQUNQSV9UWVBFX0xPQ0FMX1JFRkVSRU5DRToKKworCQkJYWNwaV9vc19wcmludGYoIlslc11cbiIsCisJCQkJICAgICAgIGFjcGlfdXRfZ2V0X3JlZmVyZW5jZV9uYW1lKG9ial9kZXNjKSk7CisJCQlicmVhazsKKworCQljYXNlIEFDUElfVFlQRV9CVUZGRVJfRklFTEQ6CisKKwkJCWlmIChvYmpfZGVzYy0+YnVmZmVyX2ZpZWxkLmJ1ZmZlcl9vYmogJiYKKwkJCSAgICBvYmpfZGVzYy0+YnVmZmVyX2ZpZWxkLmJ1ZmZlcl9vYmotPmJ1ZmZlci5ub2RlKSB7CisJCQkJYWNwaV9vc19wcmludGYoIkJ1ZiBbJTQuNHNdIiwKKwkJCQkJICAgICAgIGFjcGlfdXRfZ2V0X25vZGVfbmFtZShvYmpfZGVzYy0+CisJCQkJCQkJCSAgICAgYnVmZmVyX2ZpZWxkLgorCQkJCQkJCQkgICAgIGJ1ZmZlcl9vYmotPgorCQkJCQkJCQkgICAgIGJ1ZmZlci4KKwkJCQkJCQkJICAgICBub2RlKSk7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIEFDUElfVFlQRV9MT0NBTF9SRUdJT05fRklFTEQ6CisKKwkJCWFjcGlfb3NfcHJpbnRmKCJSZ24gWyU0LjRzXSIsCisJCQkJICAgICAgIGFjcGlfdXRfZ2V0X25vZGVfbmFtZShvYmpfZGVzYy0+CisJCQkJCQkJICAgICBjb21tb25fZmllbGQuCisJCQkJCQkJICAgICByZWdpb25fb2JqLT5yZWdpb24uCisJCQkJCQkJICAgICBub2RlKSk7CisJCQlicmVhazsKKworCQljYXNlIEFDUElfVFlQRV9MT0NBTF9CQU5LX0ZJRUxEOgorCisJCQlhY3BpX29zX3ByaW50ZigiUmduIFslNC40c10gQm5rIFslNC40c10iLAorCQkJCSAgICAgICBhY3BpX3V0X2dldF9ub2RlX25hbWUob2JqX2Rlc2MtPgorCQkJCQkJCSAgICAgY29tbW9uX2ZpZWxkLgorCQkJCQkJCSAgICAgcmVnaW9uX29iai0+cmVnaW9uLgorCQkJCQkJCSAgICAgbm9kZSksCisJCQkJICAgICAgIGFjcGlfdXRfZ2V0X25vZGVfbmFtZShvYmpfZGVzYy0+CisJCQkJCQkJICAgICBiYW5rX2ZpZWxkLgorCQkJCQkJCSAgICAgYmFua19vYmotPgorCQkJCQkJCSAgICAgY29tbW9uX2ZpZWxkLgorCQkJCQkJCSAgICAgbm9kZSkpOworCQkJYnJlYWs7CisKKwkJY2FzZSBBQ1BJX1RZUEVfTE9DQUxfSU5ERVhfRklFTEQ6CisKKwkJCWFjcGlfb3NfcHJpbnRmKCJJZHggWyU0LjRzXSBEYXQgWyU0LjRzXSIsCisJCQkJICAgICAgIGFjcGlfdXRfZ2V0X25vZGVfbmFtZShvYmpfZGVzYy0+CisJCQkJCQkJICAgICBpbmRleF9maWVsZC4KKwkJCQkJCQkgICAgIGluZGV4X29iai0+CisJCQkJCQkJICAgICBjb21tb25fZmllbGQubm9kZSksCisJCQkJICAgICAgIGFjcGlfdXRfZ2V0X25vZGVfbmFtZShvYmpfZGVzYy0+CisJCQkJCQkJICAgICBpbmRleF9maWVsZC4KKwkJCQkJCQkgICAgIGRhdGFfb2JqLT4KKwkJCQkJCQkgICAgIGNvbW1vbl9maWVsZC4KKwkJCQkJCQkgICAgIG5vZGUpKTsKKwkJCWJyZWFrOworCisJCWNhc2UgQUNQSV9UWVBFX0xPQ0FMX0FMSUFTOgorCQljYXNlIEFDUElfVFlQRV9MT0NBTF9NRVRIT0RfQUxJQVM6CisKKwkJCWFjcGlfb3NfcHJpbnRmKCJUYXJnZXQgJTQuNHMgKCVwKVxuIiwKKwkJCQkgICAgICAgYWNwaV91dF9nZXRfbm9kZV9uYW1lKG9ial9kZXNjKSwKKwkJCQkgICAgICAgb2JqX2Rlc2MpOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKworCQkJYWNwaV9vc19wcmludGYoIk9iamVjdCAlcFxuIiwgb2JqX2Rlc2MpOworCQkJYnJlYWs7CisJCX0KKworCQkvKiBDb21tb24gZmllbGQgaGFuZGxpbmcgKi8KKworCQlzd2l0Y2ggKHR5cGUpIHsKKwkJY2FzZSBBQ1BJX1RZUEVfQlVGRkVSX0ZJRUxEOgorCQljYXNlIEFDUElfVFlQRV9MT0NBTF9SRUdJT05fRklFTEQ6CisJCWNhc2UgQUNQSV9UWVBFX0xPQ0FMX0JBTktfRklFTEQ6CisJCWNhc2UgQUNQSV9UWVBFX0xPQ0FMX0lOREVYX0ZJRUxEOgorCisJCQlhY3BpX29zX3ByaW50ZigiIE9mZiAlLjNYIExlbiAlLjJYIEFjYyAlLjJoZFxuIiwKKwkJCQkgICAgICAgKG9ial9kZXNjLT5jb21tb25fZmllbGQuCisJCQkJCWJhc2VfYnl0ZV9vZmZzZXQgKiA4KQorCQkJCSAgICAgICArCisJCQkJICAgICAgIG9ial9kZXNjLT5jb21tb25fZmllbGQuCisJCQkJICAgICAgIHN0YXJ0X2ZpZWxkX2JpdF9vZmZzZXQsCisJCQkJICAgICAgIG9ial9kZXNjLT5jb21tb25fZmllbGQuYml0X2xlbmd0aCwKKwkJCQkgICAgICAgb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC4KKwkJCQkgICAgICAgYWNjZXNzX2J5dGVfd2lkdGgpOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCisJY2FzZSBBQ1BJX0RJU1BMQVlfT0JKRUNUUzoKKworCQlhY3BpX29zX3ByaW50ZigiTzolcCIsIG9ial9kZXNjKTsKKwkJaWYgKCFvYmpfZGVzYykgeworCisJCQkvKiBObyBhdHRhY2hlZCBvYmplY3QsIHdlIGFyZSBkb25lICovCisKKwkJCWFjcGlfb3NfcHJpbnRmKCJcbiIpOworCQkJcmV0dXJuIChBRV9PSyk7CisJCX0KKworCQlhY3BpX29zX3ByaW50ZigiKFIlZCkiLCBvYmpfZGVzYy0+Y29tbW9uLnJlZmVyZW5jZV9jb3VudCk7CisKKwkJc3dpdGNoICh0eXBlKSB7CisJCWNhc2UgQUNQSV9UWVBFX01FVEhPRDoKKworCQkJLyogTmFtZSBpcyBhIE1ldGhvZCBhbmQgaXRzIEFNTCBvZmZzZXQvbGVuZ3RoIGFyZSBzZXQgKi8KKworCQkJYWNwaV9vc19wcmludGYoIiBNOiVwLSVYXG4iLCBvYmpfZGVzYy0+bWV0aG9kLmFtbF9zdGFydCwKKwkJCQkgICAgICAgb2JqX2Rlc2MtPm1ldGhvZC5hbWxfbGVuZ3RoKTsKKwkJCWJyZWFrOworCisJCWNhc2UgQUNQSV9UWVBFX0lOVEVHRVI6CisKKwkJCWFjcGlfb3NfcHJpbnRmKCIgSTolOC44WDguOCVYXG4iLAorCQkJCSAgICAgICBBQ1BJX0ZPUk1BVF9VSU5UNjQob2JqX2Rlc2MtPmludGVnZXIuCisJCQkJCQkJICB2YWx1ZSkpOworCQkJYnJlYWs7CisKKwkJY2FzZSBBQ1BJX1RZUEVfU1RSSU5HOgorCisJCQlhY3BpX29zX3ByaW50ZigiIFM6JXAtJVhcbiIsIG9ial9kZXNjLT5zdHJpbmcucG9pbnRlciwKKwkJCQkgICAgICAgb2JqX2Rlc2MtPnN0cmluZy5sZW5ndGgpOworCQkJYnJlYWs7CisKKwkJY2FzZSBBQ1BJX1RZUEVfQlVGRkVSOgorCisJCQlhY3BpX29zX3ByaW50ZigiIEI6JXAtJVhcbiIsIG9ial9kZXNjLT5idWZmZXIucG9pbnRlciwKKwkJCQkgICAgICAgb2JqX2Rlc2MtPmJ1ZmZlci5sZW5ndGgpOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKworCQkJYWNwaV9vc19wcmludGYoIlxuIik7CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWFjcGlfb3NfcHJpbnRmKCJcbiIpOworCQlicmVhazsKKwl9CisKKwkvKiBJZiBkZWJ1ZyB0dXJuZWQgb2ZmLCBkb25lICovCisKKwlpZiAoIShhY3BpX2RiZ19sZXZlbCAmIEFDUElfTFZfVkFMVUVTKSkgeworCQlyZXR1cm4gKEFFX09LKTsKKwl9CisKKwkvKiBJZiB0aGVyZSBpcyBhbiBhdHRhY2hlZCBvYmplY3QsIGRpc3BsYXkgaXQgKi8KKworCWRiZ19sZXZlbCA9IGFjcGlfZGJnX2xldmVsOworCWFjcGlfZGJnX2xldmVsID0gMDsKKwlvYmpfZGVzYyA9IGFjcGlfbnNfZ2V0X2F0dGFjaGVkX29iamVjdCh0aGlzX25vZGUpOworCWFjcGlfZGJnX2xldmVsID0gZGJnX2xldmVsOworCisJLyogRHVtcCBhdHRhY2hlZCBvYmplY3RzICovCisKKwl3aGlsZSAob2JqX2Rlc2MpIHsKKwkJb2JqX3R5cGUgPSBBQ1BJX1RZUEVfSU5WQUxJRDsKKwkJYWNwaV9vc19wcmludGYoIkF0dGFjaGVkIE9iamVjdCAlcDogIiwgb2JqX2Rlc2MpOworCisJCS8qIERlY29kZSB0aGUgdHlwZSBvZiBhdHRhY2hlZCBvYmplY3QgYW5kIGR1bXAgdGhlIGNvbnRlbnRzICovCisKKwkJc3dpdGNoIChBQ1BJX0dFVF9ERVNDUklQVE9SX1RZUEUob2JqX2Rlc2MpKSB7CisJCWNhc2UgQUNQSV9ERVNDX1RZUEVfTkFNRUQ6CisKKwkJCWFjcGlfb3NfcHJpbnRmKCIoUHRyIHRvIE5vZGUpXG4iKTsKKwkJCWJ5dGVzX3RvX2R1bXAgPSBzaXplb2Yoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUpOworCQkJQUNQSV9EVU1QX0JVRkZFUihvYmpfZGVzYywgYnl0ZXNfdG9fZHVtcCk7CisJCQlicmVhazsKKworCQljYXNlIEFDUElfREVTQ19UWVBFX09QRVJBTkQ6CisKKwkJCW9ial90eXBlID0gQUNQSV9HRVRfT0JKRUNUX1RZUEUob2JqX2Rlc2MpOworCisJCQlpZiAob2JqX3R5cGUgPiBBQ1BJX1RZUEVfTE9DQUxfTUFYKSB7CisJCQkJYWNwaV9vc19wcmludGYKKwkJCQkgICAgKCIoUG9pbnRlciB0byBBQ1BJIE9iamVjdCB0eXBlICUuMlggW1VOS05PV05dKVxuIiwKKwkJCQkgICAgIG9ial90eXBlKTsKKwkJCQlieXRlc190b19kdW1wID0gMzI7CisJCQl9IGVsc2UgeworCQkJCWFjcGlfb3NfcHJpbnRmCisJCQkJICAgICgiKFBvaW50ZXIgdG8gQUNQSSBPYmplY3QgdHlwZSAlLjJYIFslc10pXG4iLAorCQkJCSAgICAgb2JqX3R5cGUsIGFjcGlfdXRfZ2V0X3R5cGVfbmFtZShvYmpfdHlwZSkpOworCQkJCWJ5dGVzX3RvX2R1bXAgPQorCQkJCSAgICBzaXplb2YodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCk7CisJCQl9CisKKwkJCUFDUElfRFVNUF9CVUZGRVIob2JqX2Rlc2MsIGJ5dGVzX3RvX2R1bXApOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKworCQkJYnJlYWs7CisJCX0KKworCQkvKiBJZiB2YWx1ZSBpcyBOT1QgYW4gaW50ZXJuYWwgb2JqZWN0LCB3ZSBhcmUgZG9uZSAqLworCisJCWlmIChBQ1BJX0dFVF9ERVNDUklQVE9SX1RZUEUob2JqX2Rlc2MpICE9CisJCSAgICBBQ1BJX0RFU0NfVFlQRV9PUEVSQU5EKSB7CisJCQlnb3RvIGNsZWFudXA7CisJCX0KKworCQkvKgorCQkgKiBWYWxpZCBvYmplY3QsIGdldCB0aGUgcG9pbnRlciB0byBuZXh0IGxldmVsLCBpZiBhbnkKKwkJICovCisJCXN3aXRjaCAob2JqX3R5cGUpIHsKKwkJY2FzZSBBQ1BJX1RZUEVfQlVGRkVSOgorCQljYXNlIEFDUElfVFlQRV9TVFJJTkc6CisJCQkvKgorCQkJICogTk9URTogdGFrZXMgYWR2YW50YWdlIG9mIGNvbW1vbiBmaWVsZHMgYmV0d2VlbiBzdHJpbmcvYnVmZmVyCisJCQkgKi8KKwkJCWJ5dGVzX3RvX2R1bXAgPSBvYmpfZGVzYy0+c3RyaW5nLmxlbmd0aDsKKwkJCW9ial9kZXNjID0gKHZvaWQgKilvYmpfZGVzYy0+c3RyaW5nLnBvaW50ZXI7CisJCQlhY3BpX29zX3ByaW50ZigiKEJ1ZmZlci9TdHJpbmcgcG9pbnRlciAlcCBsZW5ndGggJVgpXG4iLAorCQkJCSAgICAgICBvYmpfZGVzYywgYnl0ZXNfdG9fZHVtcCk7CisJCQlBQ1BJX0RVTVBfQlVGRkVSKG9ial9kZXNjLCBieXRlc190b19kdW1wKTsKKwkJCWdvdG8gY2xlYW51cDsKKworCQljYXNlIEFDUElfVFlQRV9CVUZGRVJfRklFTEQ6CisJCQlvYmpfZGVzYyA9CisJCQkgICAgKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKilvYmpfZGVzYy0+YnVmZmVyX2ZpZWxkLgorCQkJICAgIGJ1ZmZlcl9vYmo7CisJCQlicmVhazsKKworCQljYXNlIEFDUElfVFlQRV9QQUNLQUdFOgorCQkJb2JqX2Rlc2MgPSAodm9pZCAqKW9ial9kZXNjLT5wYWNrYWdlLmVsZW1lbnRzOworCQkJYnJlYWs7CisKKwkJY2FzZSBBQ1BJX1RZUEVfTUVUSE9EOgorCQkJb2JqX2Rlc2MgPSAodm9pZCAqKW9ial9kZXNjLT5tZXRob2QuYW1sX3N0YXJ0OworCQkJYnJlYWs7CisKKwkJY2FzZSBBQ1BJX1RZUEVfTE9DQUxfUkVHSU9OX0ZJRUxEOgorCQkJb2JqX2Rlc2MgPSAodm9pZCAqKW9ial9kZXNjLT5maWVsZC5yZWdpb25fb2JqOworCQkJYnJlYWs7CisKKwkJY2FzZSBBQ1BJX1RZUEVfTE9DQUxfQkFOS19GSUVMRDoKKwkJCW9ial9kZXNjID0gKHZvaWQgKilvYmpfZGVzYy0+YmFua19maWVsZC5yZWdpb25fb2JqOworCQkJYnJlYWs7CisKKwkJY2FzZSBBQ1BJX1RZUEVfTE9DQUxfSU5ERVhfRklFTEQ6CisJCQlvYmpfZGVzYyA9ICh2b2lkICopb2JqX2Rlc2MtPmluZGV4X2ZpZWxkLmluZGV4X29iajsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlnb3RvIGNsZWFudXA7CisJCX0KKworCQlvYmpfdHlwZSA9IEFDUElfVFlQRV9JTlZBTElEOwkvKiBUZXJtaW5hdGUgbG9vcCBhZnRlciBuZXh0IHBhc3MgKi8KKwl9CisKKyAgICAgIGNsZWFudXA6CisJYWNwaV9vc19wcmludGYoIlxuIik7CisJcmV0dXJuIChBRV9PSyk7Cit9CisKKyNpZmRlZiBBQ1BJX0ZVVFVSRV9VU0FHRQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9uc19kdW1wX29iamVjdHMKKyAqCisgKiBQQVJBTUVURVJTOiAgVHlwZSAgICAgICAgICAgICAgICAtIE9iamVjdCB0eXBlIHRvIGJlIGR1bXBlZAorICogICAgICAgICAgICAgIGRpc3BsYXlfdHlwZSAgICAgICAgLSAwIG9yIEFDUElfRElTUExBWV9TVU1NQVJZCisgKiAgICAgICAgICAgICAgbWF4X2RlcHRoICAgICAgICAgICAtIE1heGltdW0gZGVwdGggb2YgZHVtcC4gVXNlIEFDUElfVUlOVDMyX01BWAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgYW4gZWZmZWN0aXZlbHkgdW5saW1pdGVkIGRlcHRoLgorICogICAgICAgICAgICAgIG93bmVyX2lkICAgICAgICAgICAgLSBEdW1wIG9ubHkgb2JqZWN0cyBvd25lZCBieSB0aGlzIElELiAgVXNlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFDUElfVUlOVDMyX01BWCB0byBtYXRjaCBhbGwgb3duZXJzLgorICogICAgICAgICAgICAgIHN0YXJ0X2hhbmRsZSAgICAgICAgLSBXaGVyZSBpbiBuYW1lc3BhY2UgdG8gc3RhcnQvZW5kIHNlYXJjaAorICoKKyAqIFJFVFVSTjogICAgICBOb25lCisgKgorICogREVTQ1JJUFRJT046IER1bXAgdHlwZWQgb2JqZWN0cyB3aXRoaW4gdGhlIGxvYWRlZCBuYW1lc3BhY2UuCisgKiAgICAgICAgICAgICAgVXNlcyBhY3BpX25zX3dhbGtfbmFtZXNwYWNlIGluIGNvbmp1bmN0aW9uIHdpdGggYWNwaV9uc19kdW1wX29uZV9vYmplY3QuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZAorYWNwaV9uc19kdW1wX29iamVjdHMoYWNwaV9vYmplY3RfdHlwZSB0eXBlLAorCQkgICAgIHU4IGRpc3BsYXlfdHlwZSwKKwkJICAgICB1MzIgbWF4X2RlcHRoLAorCQkgICAgIGFjcGlfb3duZXJfaWQgb3duZXJfaWQsIGFjcGlfaGFuZGxlIHN0YXJ0X2hhbmRsZSkKK3sKKwlzdHJ1Y3QgYWNwaV93YWxrX2luZm8gaW5mbzsKKworCUFDUElfRlVOQ1RJT05fRU5UUlkoKTsKKworCWluZm8uZGVidWdfbGV2ZWwgPSBBQ1BJX0xWX1RBQkxFUzsKKwlpbmZvLm93bmVyX2lkID0gb3duZXJfaWQ7CisJaW5mby5kaXNwbGF5X3R5cGUgPSBkaXNwbGF5X3R5cGU7CisKKwkodm9pZClhY3BpX25zX3dhbGtfbmFtZXNwYWNlKHR5cGUsIHN0YXJ0X2hhbmRsZSwgbWF4X2RlcHRoLAorCQkJCSAgICAgQUNQSV9OU19XQUxLX05PX1VOTE9DSyB8CisJCQkJICAgICBBQ1BJX05TX1dBTEtfVEVNUF9OT0RFUywKKwkJCQkgICAgIGFjcGlfbnNfZHVtcF9vbmVfb2JqZWN0LCAodm9pZCAqKSZpbmZvLAorCQkJCSAgICAgTlVMTCk7Cit9CisjZW5kaWYJCQkJLyogQUNQSV9GVVRVUkVfVVNBR0UgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9uc19kdW1wX2VudHJ5CisgKgorICogUEFSQU1FVEVSUzogIEhhbmRsZSAgICAgICAgICAgICAgLSBOb2RlIHRvIGJlIGR1bXBlZAorICogICAgICAgICAgICAgIGRlYnVnX2xldmVsICAgICAgICAgLSBPdXRwdXQgbGV2ZWwKKyAqCisgKiBSRVRVUk46ICAgICAgTm9uZQorICoKKyAqIERFU0NSSVBUSU9OOiBEdW1wIGEgc2luZ2xlIE5vZGUKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIGFjcGlfbnNfZHVtcF9lbnRyeShhY3BpX2hhbmRsZSBoYW5kbGUsIHUzMiBkZWJ1Z19sZXZlbCkKK3sKKwlzdHJ1Y3QgYWNwaV93YWxrX2luZm8gaW5mbzsKKworCUFDUElfRlVOQ1RJT05fRU5UUlkoKTsKKworCWluZm8uZGVidWdfbGV2ZWwgPSBkZWJ1Z19sZXZlbDsKKwlpbmZvLm93bmVyX2lkID0gQUNQSV9PV05FUl9JRF9NQVg7CisJaW5mby5kaXNwbGF5X3R5cGUgPSBBQ1BJX0RJU1BMQVlfU1VNTUFSWTsKKworCSh2b2lkKWFjcGlfbnNfZHVtcF9vbmVfb2JqZWN0KGhhbmRsZSwgMSwgJmluZm8sIE5VTEwpOworfQorCisjaWZkZWYgQUNQSV9BU0xfQ09NUElMRVIKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfbnNfZHVtcF90YWJsZXMKKyAqCisgKiBQQVJBTUVURVJTOiAgc2VhcmNoX2Jhc2UgICAgICAgICAtIFJvb3Qgb2Ygc3VidHJlZSB0byBiZSBkdW1wZWQsIG9yCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5TX0FMTCB0byBkdW1wIHRoZSBlbnRpcmUgbmFtZXNwYWNlCisgKiAgICAgICAgICAgICAgbWF4X2RlcHRoICAgICAgICAgICAtIE1heGltdW0gZGVwdGggb2YgZHVtcC4gIFVzZSBJTlRfTUFYCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBhbiBlZmZlY3RpdmVseSB1bmxpbWl0ZWQgZGVwdGguCisgKgorICogUkVUVVJOOiAgICAgIE5vbmUKKyAqCisgKiBERVNDUklQVElPTjogRHVtcCB0aGUgbmFtZSBzcGFjZSwgb3IgYSBwb3J0aW9uIG9mIGl0LgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgYWNwaV9uc19kdW1wX3RhYmxlcyhhY3BpX2hhbmRsZSBzZWFyY2hfYmFzZSwgdTMyIG1heF9kZXB0aCkKK3sKKwlhY3BpX2hhbmRsZSBzZWFyY2hfaGFuZGxlID0gc2VhcmNoX2Jhc2U7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKG5zX2R1bXBfdGFibGVzKTsKKworCWlmICghYWNwaV9nYmxfcm9vdF9ub2RlKSB7CisJCS8qCisJCSAqIElmIHRoZSBuYW1lIHNwYWNlIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZCwKKwkJICogdGhlcmUgaXMgbm90aGluZyB0byBkdW1wLgorCQkgKi8KKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9UQUJMRVMsCisJCQkJICAibmFtZXNwYWNlIG5vdCBpbml0aWFsaXplZCFcbiIpKTsKKwkJcmV0dXJuX1ZPSUQ7CisJfQorCisJaWYgKEFDUElfTlNfQUxMID09IHNlYXJjaF9iYXNlKSB7CisKKwkJLyogRW50aXJlIG5hbWVzcGFjZSAqLworCisJCXNlYXJjaF9oYW5kbGUgPSBhY3BpX2dibF9yb290X25vZGU7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfVEFCTEVTLCAiXFxcbiIpKTsKKwl9CisKKwlhY3BpX25zX2R1bXBfb2JqZWN0cyhBQ1BJX1RZUEVfQU5ZLCBBQ1BJX0RJU1BMQVlfT0JKRUNUUywgbWF4X2RlcHRoLAorCQkJICAgICBBQ1BJX09XTkVSX0lEX01BWCwgc2VhcmNoX2hhbmRsZSk7CisJcmV0dXJuX1ZPSUQ7Cit9CisjZW5kaWYJCQkJLyogX0FDUElfQVNMX0NPTVBJTEVSICovCisjZW5kaWYJCQkJLyogZGVmaW5lZChBQ1BJX0RFQlVHX09VVFBVVCkgfHwgZGVmaW5lZChBQ1BJX0RFQlVHR0VSKSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS9uc2R1bXBkdi5jIGIvZHJpdmVycy9hY3BpL2FjcGljYS9uc2R1bXBkdi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxOTk0ZmUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL25zZHVtcGR2LmMKQEAgLTAsMCArMSwxNDEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBNb2R1bGUgTmFtZTogbnNkdW1wIC0gdGFibGUgZHVtcGluZyByb3V0aW5lcyBmb3IgZGVidWcKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA4LCBJbnRlbCBDb3JwLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAorICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgYXQgbWluaW11bSBhIGRpc2NsYWltZXIKKyAqICAgIHN1YnN0YW50aWFsbHkgc2ltaWxhciB0byB0aGUgIk5PIFdBUlJBTlRZIiBkaXNjbGFpbWVyIGJlbG93CisgKiAgICAoIkRpc2NsYWltZXIiKSBhbmQgYW55IHJlZGlzdHJpYnV0aW9uIG11c3QgYmUgY29uZGl0aW9uZWQgdXBvbgorICogICAgaW5jbHVkaW5nIGEgc3Vic3RhbnRpYWxseSBzaW1pbGFyIERpc2NsYWltZXIgcmVxdWlyZW1lbnQgZm9yIGZ1cnRoZXIKKyAqICAgIGJpbmFyeSByZWRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcworICogICAgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBOTyBXQVJSQU5UWQorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcKKyAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgorICovCisKKyNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KKyNpbmNsdWRlICJhY2NvbW1vbi5oIgorCisvKiBUQkQ6IFRoaXMgZW50aXJlIG1vZHVsZSBpcyBhcHBhcmVudGx5IG9ic29sZXRlIGFuZCBzaG91bGQgYmUgcmVtb3ZlZCAqLworCisjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9OQU1FU1BBQ0UKK0FDUElfTU9EVUxFX05BTUUoIm5zZHVtcGR2IikKKyNpZmRlZiBBQ1BJX09CU09MRVRFX0ZVTkNUSU9OUworI2lmIGRlZmluZWQoQUNQSV9ERUJVR19PVVRQVVQpIHx8IGRlZmluZWQoQUNQSV9ERUJVR0dFUikKKyNpbmNsdWRlICJhY25hbWVzcC5oIgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9uc19kdW1wX29uZV9kZXZpY2UKKyAqCisgKiBQQVJBTUVURVJTOiAgSGFuZGxlICAgICAgICAgICAgICAtIE5vZGUgdG8gYmUgZHVtcGVkCisgKiAgICAgICAgICAgICAgTGV2ZWwgICAgICAgICAgICAgICAtIE5lc3RpbmcgbGV2ZWwgb2YgdGhlIGhhbmRsZQorICogICAgICAgICAgICAgIENvbnRleHQgICAgICAgICAgICAgLSBQYXNzZWQgaW50byB3YWxrX25hbWVzcGFjZQorICogICAgICAgICAgICAgIHJldHVybl92YWx1ZSAgICAgICAgLSBOb3QgdXNlZAorICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogRHVtcCBhIHNpbmdsZSBOb2RlIHRoYXQgcmVwcmVzZW50cyBhIGRldmljZQorICogICAgICAgICAgICAgIFRoaXMgcHJvY2VkdXJlIGlzIGEgdXNlcl9mdW5jdGlvbiBjYWxsZWQgYnkgYWNwaV9uc193YWxrX25hbWVzcGFjZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGFjcGlfc3RhdHVzCithY3BpX25zX2R1bXBfb25lX2RldmljZShhY3BpX2hhbmRsZSBvYmpfaGFuZGxlLAorCQkJdTMyIGxldmVsLCB2b2lkICpjb250ZXh0LCB2b2lkICoqcmV0dXJuX3ZhbHVlKQoreworCXN0cnVjdCBhY3BpX2J1ZmZlciBidWZmZXI7CisJc3RydWN0IGFjcGlfZGV2aWNlX2luZm8gKmluZm87CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCXUzMiBpOworCisJQUNQSV9GVU5DVElPTl9OQU1FKG5zX2R1bXBfb25lX2RldmljZSk7CisKKwlzdGF0dXMgPQorCSAgICBhY3BpX25zX2R1bXBfb25lX29iamVjdChvYmpfaGFuZGxlLCBsZXZlbCwgY29udGV4dCwgcmV0dXJuX3ZhbHVlKTsKKworCWJ1ZmZlci5sZW5ndGggPSBBQ1BJX0FMTE9DQVRFX0xPQ0FMX0JVRkZFUjsKKwlzdGF0dXMgPSBhY3BpX2dldF9vYmplY3RfaW5mbyhvYmpfaGFuZGxlLCAmYnVmZmVyKTsKKwlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpIHsKKwkJaW5mbyA9IGJ1ZmZlci5wb2ludGVyOworCQlmb3IgKGkgPSAwOyBpIDwgbGV2ZWw7IGkrKykgeworCQkJQUNQSV9ERUJVR19QUklOVF9SQVcoKEFDUElfREJfVEFCTEVTLCAiICIpKTsKKwkJfQorCisJCUFDUElfREVCVUdfUFJJTlRfUkFXKChBQ1BJX0RCX1RBQkxFUywKKwkJCQkgICAgICAiICAgIEhJRDogJXMsIEFEUjogJTguOFglOC44WCwgU3RhdHVzOiAlWFxuIiwKKwkJCQkgICAgICBpbmZvLT5oYXJkd2FyZV9pZC52YWx1ZSwKKwkJCQkgICAgICBBQ1BJX0ZPUk1BVF9VSU5UNjQoaW5mby0+YWRkcmVzcyksCisJCQkJICAgICAgaW5mby0+Y3VycmVudF9zdGF0dXMpKTsKKwkJQUNQSV9GUkVFKGluZm8pOworCX0KKworCXJldHVybiAoc3RhdHVzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9uc19kdW1wX3Jvb3RfZGV2aWNlcworICoKKyAqIFBBUkFNRVRFUlM6ICBOb25lCisgKgorICogUkVUVVJOOiAgICAgIE5vbmUKKyAqCisgKiBERVNDUklQVElPTjogRHVtcCBhbGwgb2JqZWN0cyBvZiB0eXBlICJkZXZpY2UiCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBhY3BpX25zX2R1bXBfcm9vdF9kZXZpY2VzKHZvaWQpCit7CisJYWNwaV9oYW5kbGUgc3lzX2J1c19oYW5kbGU7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCisJQUNQSV9GVU5DVElPTl9OQU1FKG5zX2R1bXBfcm9vdF9kZXZpY2VzKTsKKworCS8qIE9ubHkgZHVtcCB0aGUgdGFibGUgaWYgdHJhY2luZyBpcyBlbmFibGVkICovCisKKwlpZiAoIShBQ1BJX0xWX1RBQkxFUyAmIGFjcGlfZGJnX2xldmVsKSkgeworCQlyZXR1cm47CisJfQorCisJc3RhdHVzID0gYWNwaV9nZXRfaGFuZGxlKE5VTEwsIEFDUElfTlNfU1lTVEVNX0JVUywgJnN5c19idXNfaGFuZGxlKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuOworCX0KKworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfVEFCTEVTLAorCQkJICAiRGlzcGxheSBvZiBhbGwgZGV2aWNlcyBpbiB0aGUgbmFtZXNwYWNlOlxuIikpOworCisJc3RhdHVzID0gYWNwaV9uc193YWxrX25hbWVzcGFjZShBQ1BJX1RZUEVfREVWSUNFLCBzeXNfYnVzX2hhbmRsZSwKKwkJCQkJQUNQSV9VSU5UMzJfTUFYLCBBQ1BJX05TX1dBTEtfTk9fVU5MT0NLLAorCQkJCQlhY3BpX25zX2R1bXBfb25lX2RldmljZSwgTlVMTCwgTlVMTCk7Cit9CisKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL25zZXZhbC5jIGIvZHJpdmVycy9hY3BpL2FjcGljYS9uc2V2YWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjNkNWY5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS9uc2V2YWwuYwpAQCAtMCwwICsxLDI3OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBNb2R1bGUgTmFtZTogbnNldmFsIC0gT2JqZWN0IGV2YWx1YXRpb24sIGluY2x1ZGVzIGNvbnRyb2wgbWV0aG9kIGV4ZWN1dGlvbgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA4LCBJbnRlbCBDb3JwLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAorICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgYXQgbWluaW11bSBhIGRpc2NsYWltZXIKKyAqICAgIHN1YnN0YW50aWFsbHkgc2ltaWxhciB0byB0aGUgIk5PIFdBUlJBTlRZIiBkaXNjbGFpbWVyIGJlbG93CisgKiAgICAoIkRpc2NsYWltZXIiKSBhbmQgYW55IHJlZGlzdHJpYnV0aW9uIG11c3QgYmUgY29uZGl0aW9uZWQgdXBvbgorICogICAgaW5jbHVkaW5nIGEgc3Vic3RhbnRpYWxseSBzaW1pbGFyIERpc2NsYWltZXIgcmVxdWlyZW1lbnQgZm9yIGZ1cnRoZXIKKyAqICAgIGJpbmFyeSByZWRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcworICogICAgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBOTyBXQVJSQU5UWQorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcKKyAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgorICovCisKKyNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KKyNpbmNsdWRlICJhY2NvbW1vbi5oIgorI2luY2x1ZGUgImFjcGFyc2VyLmgiCisjaW5jbHVkZSAiYWNpbnRlcnAuaCIKKyNpbmNsdWRlICJhY25hbWVzcC5oIgorCisjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9OQU1FU1BBQ0UKK0FDUElfTU9EVUxFX05BTUUoIm5zZXZhbCIpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfbnNfZXZhbHVhdGUKKyAqCisgKiBQQVJBTUVURVJTOiAgSW5mbyAgICAgICAgICAgIC0gRXZhbHVhdGlvbiBpbmZvIGJsb2NrLCBjb250YWluczoKKyAqICAgICAgICAgICAgICAgICAgcHJlZml4X25vZGUgICAgIC0gUHJlZml4IG9yIE1ldGhvZC9PYmplY3QgTm9kZSB0byBleGVjdXRlCisgKiAgICAgICAgICAgICAgICAgIFBhdGhuYW1lICAgICAgICAtIE5hbWUgb2YgbWV0aG9kIHRvIGV4ZWN1dGUsIElmIE5VTEwsIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb2RlIGlzIHRoZSBvYmplY3QgdG8gZXhlY3V0ZQorICogICAgICAgICAgICAgICAgICBQYXJhbWV0ZXJzICAgICAgLSBMaXN0IG9mIHBhcmFtZXRlcnMgdG8gcGFzcyB0byB0aGUgbWV0aG9kLAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXJtaW5hdGVkIGJ5IE5VTEwuIFBhcmFtcyBpdHNlbGYgbWF5IGJlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwgaWYgbm8gcGFyYW1ldGVycyBhcmUgYmVpbmcgcGFzc2VkLgorICogICAgICAgICAgICAgICAgICByZXR1cm5fb2JqZWN0ICAgLSBXaGVyZSB0byBwdXQgbWV0aG9kJ3MgcmV0dXJuIHZhbHVlIChpZgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbnkpLiBJZiBOVUxMLCBubyB2YWx1ZSBpcyByZXR1cm5lZC4KKyAqICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyX3R5cGUgIC0gVHlwZSBvZiBQYXJhbWV0ZXIgbGlzdAorICogICAgICAgICAgICAgICAgICByZXR1cm5fb2JqZWN0ICAgLSBXaGVyZSB0byBwdXQgbWV0aG9kJ3MgcmV0dXJuIHZhbHVlIChpZgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbnkpLiBJZiBOVUxMLCBubyB2YWx1ZSBpcyByZXR1cm5lZC4KKyAqICAgICAgICAgICAgICAgICAgRmxhZ3MgICAgICAgICAgIC0gQUNQSV9JR05PUkVfUkVUVVJOX1ZBTFVFIHRvIGRlbGV0ZSByZXR1cm4KKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IEV4ZWN1dGUgYSBjb250cm9sIG1ldGhvZCBvciByZXR1cm4gdGhlIGN1cnJlbnQgdmFsdWUgb2YgYW4KKyAqICAgICAgICAgICAgICBBQ1BJIG5hbWVzcGFjZSBvYmplY3QuCisgKgorICogTVVURVg6ICAgICAgIExvY2tzIGludGVycHJldGVyCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2FjcGlfc3RhdHVzIGFjcGlfbnNfZXZhbHVhdGUoc3RydWN0IGFjcGlfZXZhbHVhdGVfaW5mbyAqIGluZm8pCit7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlOworCisJQUNQSV9GVU5DVElPTl9UUkFDRShuc19ldmFsdWF0ZSk7CisKKwlpZiAoIWluZm8pIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9QQVJBTUVURVIpOworCX0KKworCS8qIEluaXRpYWxpemUgdGhlIHJldHVybiB2YWx1ZSB0byBhbiBpbnZhbGlkIG9iamVjdCAqLworCisJaW5mby0+cmV0dXJuX29iamVjdCA9IE5VTEw7CisJaW5mby0+cGFyYW1fY291bnQgPSAwOworCisJLyoKKwkgKiBHZXQgdGhlIGFjdHVhbCBuYW1lc3BhY2Ugbm9kZSBmb3IgdGhlIHRhcmdldCBvYmplY3QuIEhhbmRsZXMgdGhlc2UgY2FzZXM6CisJICoKKwkgKiAxKSBOdWxsIG5vZGUsIFBhdGhuYW1lIChhYnNvbHV0ZSBwYXRoKQorCSAqIDIpIE5vZGUsIFBhdGhuYW1lIChwYXRoIHJlbGF0aXZlIHRvIE5vZGUpCisJICogMykgTm9kZSwgTnVsbCBQYXRobmFtZQorCSAqLworCXN0YXR1cyA9IGFjcGlfbnNfZ2V0X25vZGUoaW5mby0+cHJlZml4X25vZGUsIGluZm8tPnBhdGhuYW1lLAorCQkJCSAgQUNQSV9OU19OT19VUFNFQVJDSCwgJmluZm8tPnJlc29sdmVkX25vZGUpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKKwl9CisKKwkvKgorCSAqIEZvciBhIG1ldGhvZCBhbGlhcywgd2UgbXVzdCBncmFiIHRoZSBhY3R1YWwgbWV0aG9kIG5vZGUgc28gdGhhdCBwcm9wZXIKKwkgKiBzY29waW5nIGNvbnRleHQgd2lsbCBiZSBlc3RhYmxpc2hlZCBiZWZvcmUgZXhlY3V0aW9uLgorCSAqLworCWlmIChhY3BpX25zX2dldF90eXBlKGluZm8tPnJlc29sdmVkX25vZGUpID09CisJICAgIEFDUElfVFlQRV9MT0NBTF9NRVRIT0RfQUxJQVMpIHsKKwkJaW5mby0+cmVzb2x2ZWRfbm9kZSA9CisJCSAgICBBQ1BJX0NBU1RfUFRSKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlLAorCQkJCSAgaW5mby0+cmVzb2x2ZWRfbm9kZS0+b2JqZWN0KTsKKwl9CisKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX05BTUVTLCAiJXMgWyVwXSBWYWx1ZSAlcFxuIiwgaW5mby0+cGF0aG5hbWUsCisJCQkgIGluZm8tPnJlc29sdmVkX25vZGUsCisJCQkgIGFjcGlfbnNfZ2V0X2F0dGFjaGVkX29iamVjdChpbmZvLT5yZXNvbHZlZF9ub2RlKSkpOworCisJbm9kZSA9IGluZm8tPnJlc29sdmVkX25vZGU7CisKKwkvKgorCSAqIFR3byBtYWpvciBjYXNlcyBoZXJlOgorCSAqCisJICogMSkgVGhlIG9iamVjdCBpcyBhIGNvbnRyb2wgbWV0aG9kIC0tIGV4ZWN1dGUgaXQKKwkgKiAyKSBUaGUgb2JqZWN0IGlzIG5vdCBhIG1ldGhvZCAtLSBqdXN0IHJldHVybiBpdCdzIGN1cnJlbnQgdmFsdWUKKwkgKi8KKwlpZiAoYWNwaV9uc19nZXRfdHlwZShpbmZvLT5yZXNvbHZlZF9ub2RlKSA9PSBBQ1BJX1RZUEVfTUVUSE9EKSB7CisJCS8qCisJCSAqIDEpIE9iamVjdCBpcyBhIGNvbnRyb2wgbWV0aG9kIC0gZXhlY3V0ZSBpdAorCQkgKi8KKworCQkvKiBWZXJpZnkgdGhhdCB0aGVyZSBpcyBhIG1ldGhvZCBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbm9kZSAqLworCisJCWluZm8tPm9ial9kZXNjID0KKwkJICAgIGFjcGlfbnNfZ2V0X2F0dGFjaGVkX29iamVjdChpbmZvLT5yZXNvbHZlZF9ub2RlKTsKKwkJaWYgKCFpbmZvLT5vYmpfZGVzYykgeworCQkJQUNQSV9FUlJPUigoQUVfSU5GTywKKwkJCQkgICAgIkNvbnRyb2wgbWV0aG9kIGhhcyBubyBhdHRhY2hlZCBzdWItb2JqZWN0IikpOworCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05VTExfT0JKRUNUKTsKKwkJfQorCisJCS8qIENvdW50IHRoZSBudW1iZXIgb2YgYXJndW1lbnRzIGJlaW5nIHBhc3NlZCB0byB0aGUgbWV0aG9kICovCisKKwkJaWYgKGluZm8tPnBhcmFtZXRlcnMpIHsKKwkJCXdoaWxlIChpbmZvLT5wYXJhbWV0ZXJzW2luZm8tPnBhcmFtX2NvdW50XSkgeworCQkJCWlmIChpbmZvLT5wYXJhbV9jb3VudCA+IEFDUElfTUVUSE9EX01BWF9BUkcpIHsKKwkJCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0xJTUlUKTsKKwkJCQl9CisJCQkJaW5mby0+cGFyYW1fY291bnQrKzsKKwkJCX0KKwkJfQorCisKKwkJQUNQSV9EVU1QX1BBVEhOQU1FKGluZm8tPnJlc29sdmVkX25vZGUsICJFeGVjdXRlIE1ldGhvZDoiLAorCQkJCSAgIEFDUElfTFZfSU5GTywgX0NPTVBPTkVOVCk7CisKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FWEVDLAorCQkJCSAgIk1ldGhvZCBhdCBBTUwgYWRkcmVzcyAlcCBMZW5ndGggJVhcbiIsCisJCQkJICBpbmZvLT5vYmpfZGVzYy0+bWV0aG9kLmFtbF9zdGFydCArIDEsCisJCQkJICBpbmZvLT5vYmpfZGVzYy0+bWV0aG9kLmFtbF9sZW5ndGggLSAxKSk7CisKKwkJLyoKKwkJICogQW55IG5hbWVzcGFjZSBkZWxldGlvbiBtdXN0IGFjcXVpcmUgYm90aCB0aGUgbmFtZXNwYWNlIGFuZAorCQkgKiBpbnRlcnByZXRlciBsb2NrcyB0byBlbnN1cmUgdGhhdCBubyB0aHJlYWQgaXMgdXNpbmcgdGhlIHBvcnRpb24gb2YKKwkJICogdGhlIG5hbWVzcGFjZSB0aGF0IGlzIGJlaW5nIGRlbGV0ZWQuCisJCSAqCisJCSAqIEV4ZWN1dGUgdGhlIG1ldGhvZCB2aWEgdGhlIGludGVycHJldGVyLiBUaGUgaW50ZXJwcmV0ZXIgaXMgbG9ja2VkCisJCSAqIGhlcmUgYmVmb3JlIGNhbGxpbmcgaW50byB0aGUgQU1MIHBhcnNlcgorCQkgKi8KKwkJYWNwaV9leF9lbnRlcl9pbnRlcnByZXRlcigpOworCQlzdGF0dXMgPSBhY3BpX3BzX2V4ZWN1dGVfbWV0aG9kKGluZm8pOworCQlhY3BpX2V4X2V4aXRfaW50ZXJwcmV0ZXIoKTsKKwl9IGVsc2UgeworCQkvKgorCQkgKiAyKSBPYmplY3QgaXMgbm90IGEgbWV0aG9kLCByZXR1cm4gaXRzIGN1cnJlbnQgdmFsdWUKKwkJICoKKwkJICogRGlzYWxsb3cgY2VydGFpbiBvYmplY3QgdHlwZXMuIEZvciB0aGVzZSwgImV2YWx1YXRpb24iIGlzIHVuZGVmaW5lZC4KKwkJICovCisJCXN3aXRjaCAoaW5mby0+cmVzb2x2ZWRfbm9kZS0+dHlwZSkgeworCQljYXNlIEFDUElfVFlQRV9ERVZJQ0U6CisJCWNhc2UgQUNQSV9UWVBFX0VWRU5UOgorCQljYXNlIEFDUElfVFlQRV9NVVRFWDoKKwkJY2FzZSBBQ1BJX1RZUEVfUkVHSU9OOgorCQljYXNlIEFDUElfVFlQRV9USEVSTUFMOgorCQljYXNlIEFDUElfVFlQRV9MT0NBTF9TQ09QRToKKworCQkJQUNQSV9FUlJPUigoQUVfSU5GTywKKwkJCQkgICAgIlslNC40c10gRXZhbHVhdGlvbiBvZiBvYmplY3QgdHlwZSBbJXNdIGlzIG5vdCBzdXBwb3J0ZWQiLAorCQkJCSAgICBpbmZvLT5yZXNvbHZlZF9ub2RlLT5uYW1lLmFzY2lpLAorCQkJCSAgICBhY3BpX3V0X2dldF90eXBlX25hbWUoaW5mby0+cmVzb2x2ZWRfbm9kZS0+CisJCQkJCQkJICB0eXBlKSkpOworCisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfVFlQRSk7CisKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisKKwkJLyoKKwkJICogT2JqZWN0cyByZXF1aXJlIGFkZGl0aW9uYWwgcmVzb2x1dGlvbiBzdGVwcyAoZS5nLiwgdGhlIE5vZGUgbWF5IGJlCisJCSAqIGEgZmllbGQgdGhhdCBtdXN0IGJlIHJlYWQsIGV0Yy4pIC0tIHdlIGNhbid0IGp1c3QgZ3JhYiB0aGUgb2JqZWN0CisJCSAqIG91dCBvZiB0aGUgbm9kZS4KKwkJICoKKwkJICogVXNlIHJlc29sdmVfbm9kZV90b192YWx1ZSgpIHRvIGdldCB0aGUgYXNzb2NpYXRlZCB2YWx1ZS4KKwkJICoKKwkJICogTk9URTogd2UgY2FuIGdldCBhd2F5IHdpdGggcGFzc2luZyBpbiBOVUxMIGZvciBhIHdhbGsgc3RhdGUgYmVjYXVzZQorCQkgKiByZXNvbHZlZF9ub2RlIGlzIGd1YXJhbnRlZWQgdG8gbm90IGJlIGEgcmVmZXJlbmNlIHRvIGVpdGhlciBhIG1ldGhvZAorCQkgKiBsb2NhbCBvciBhIG1ldGhvZCBhcmd1bWVudCAoYmVjYXVzZSB0aGlzIGludGVyZmFjZSBpcyBuZXZlciBjYWxsZWQKKwkJICogZnJvbSBhIHJ1bm5pbmcgbWV0aG9kLikKKwkJICoKKwkJICogRXZlbiB0aG91Z2ggd2UgZG8gbm90IGRpcmVjdGx5IGludm9rZSB0aGUgaW50ZXJwcmV0ZXIgZm9yIG9iamVjdAorCQkgKiByZXNvbHV0aW9uLCB3ZSBtdXN0IGxvY2sgaXQgYmVjYXVzZSB3ZSBjb3VsZCBhY2Nlc3MgYW4gb3ByZWdpb24uCisJCSAqIFRoZSBvcHJlZ2lvbiBhY2Nlc3MgY29kZSBhc3N1bWVzIHRoYXQgdGhlIGludGVycHJldGVyIGlzIGxvY2tlZC4KKwkJICovCisJCWFjcGlfZXhfZW50ZXJfaW50ZXJwcmV0ZXIoKTsKKworCQkvKiBGdW5jdGlvbiBoYXMgYSBzdHJhbmdlIGludGVyZmFjZSAqLworCisJCXN0YXR1cyA9CisJCSAgICBhY3BpX2V4X3Jlc29sdmVfbm9kZV90b192YWx1ZSgmaW5mby0+cmVzb2x2ZWRfbm9kZSwgTlVMTCk7CisJCWFjcGlfZXhfZXhpdF9pbnRlcnByZXRlcigpOworCisJCS8qCisJCSAqIElmIGFjcGlfZXhfcmVzb2x2ZV9ub2RlX3RvX3ZhbHVlKCkgc3VjY2VlZGVkLCB0aGUgcmV0dXJuIHZhbHVlIHdhcyBwbGFjZWQKKwkJICogaW4gcmVzb2x2ZWRfbm9kZS4KKwkJICovCisJCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkgeworCQkJc3RhdHVzID0gQUVfQ1RSTF9SRVRVUk5fVkFMVUU7CisJCQlpbmZvLT5yZXR1cm5fb2JqZWN0ID0KKwkJCSAgICBBQ1BJX0NBU1RfUFRSKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QsCisJCQkJCSAgaW5mby0+cmVzb2x2ZWRfbm9kZSk7CisKKwkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfTkFNRVMsCisJCQkJCSAgIlJldHVybmluZyBvYmplY3QgJXAgWyVzXVxuIiwKKwkJCQkJICBpbmZvLT5yZXR1cm5fb2JqZWN0LAorCQkJCQkgIGFjcGlfdXRfZ2V0X29iamVjdF90eXBlX25hbWUoaW5mby0+CisJCQkJCQkJCSAgICAgICByZXR1cm5fb2JqZWN0KSkpOworCQl9CisJfQorCisJLyoKKwkgKiBDaGVjayBpbnB1dCBhcmd1bWVudCBjb3VudCBhZ2FpbnN0IHRoZSBBU0wtZGVmaW5lZCBjb3VudCBmb3IgYSBtZXRob2QuCisJICogQWxzbyBjaGVjayBwcmVkZWZpbmVkIG5hbWVzOiBhcmd1bWVudCBjb3VudCBhbmQgcmV0dXJuIHZhbHVlIGFnYWluc3QKKwkgKiB0aGUgQUNQSSBzcGVjaWZpY2F0aW9uLiBTb21lIGluY29ycmVjdCByZXR1cm4gdmFsdWUgdHlwZXMgYXJlIHJlcGFpcmVkLgorCSAqLworCSh2b2lkKWFjcGlfbnNfY2hlY2tfcHJlZGVmaW5lZF9uYW1lcyhub2RlLCBpbmZvLT5wYXJhbV9jb3VudCwKKwkJc3RhdHVzLCAmaW5mby0+cmV0dXJuX29iamVjdCk7CisKKwkvKiBDaGVjayBpZiB0aGVyZSBpcyBhIHJldHVybiB2YWx1ZSB0aGF0IG11c3QgYmUgZGVhbHQgd2l0aCAqLworCisJaWYgKHN0YXR1cyA9PSBBRV9DVFJMX1JFVFVSTl9WQUxVRSkgeworCisJCS8qIElmIGNhbGxlciBkb2VzIG5vdCB3YW50IHRoZSByZXR1cm4gdmFsdWUsIGRlbGV0ZSBpdCAqLworCisJCWlmIChpbmZvLT5mbGFncyAmIEFDUElfSUdOT1JFX1JFVFVSTl9WQUxVRSkgeworCQkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKGluZm8tPnJldHVybl9vYmplY3QpOworCQkJaW5mby0+cmV0dXJuX29iamVjdCA9IE5VTEw7CisJCX0KKworCQkvKiBNYXAgQUVfQ1RSTF9SRVRVUk5fVkFMVUUgdG8gQUVfT0ssIHdlIGFyZSBkb25lIHdpdGggaXQgKi8KKworCQlzdGF0dXMgPSBBRV9PSzsKKwl9CisKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX05BTUVTLAorCQkJICAiKioqIENvbXBsZXRlZCBldmFsdWF0aW9uIG9mIG9iamVjdCAlcyAqKipcbiIsCisJCQkgIGluZm8tPnBhdGhuYW1lKSk7CisKKwkvKgorCSAqIE5hbWVzcGFjZSB3YXMgdW5sb2NrZWQgYnkgdGhlIGhhbmRsaW5nIGFjcGlfbnMqIGZ1bmN0aW9uLCBzbyB3ZQorCSAqIGp1c3QgcmV0dXJuCisJICovCisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL25zaW5pdC5jIGIvZHJpdmVycy9hY3BpL2FjcGljYS9uc2luaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzUwMWNiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS9uc2luaXQuYwpAQCAtMCwwICsxLDU5MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIE1vZHVsZSBOYW1lOiBuc2luaXQgLSBuYW1lc3BhY2UgaW5pdGlhbGl6YXRpb24KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA4LCBJbnRlbCBDb3JwLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAorICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgYXQgbWluaW11bSBhIGRpc2NsYWltZXIKKyAqICAgIHN1YnN0YW50aWFsbHkgc2ltaWxhciB0byB0aGUgIk5PIFdBUlJBTlRZIiBkaXNjbGFpbWVyIGJlbG93CisgKiAgICAoIkRpc2NsYWltZXIiKSBhbmQgYW55IHJlZGlzdHJpYnV0aW9uIG11c3QgYmUgY29uZGl0aW9uZWQgdXBvbgorICogICAgaW5jbHVkaW5nIGEgc3Vic3RhbnRpYWxseSBzaW1pbGFyIERpc2NsYWltZXIgcmVxdWlyZW1lbnQgZm9yIGZ1cnRoZXIKKyAqICAgIGJpbmFyeSByZWRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcworICogICAgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBOTyBXQVJSQU5UWQorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcKKyAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgorICovCisKKyNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KKyNpbmNsdWRlICJhY2NvbW1vbi5oIgorI2luY2x1ZGUgImFjbmFtZXNwLmgiCisjaW5jbHVkZSAiYWNkaXNwYXQuaCIKKyNpbmNsdWRlICJhY2ludGVycC5oIgorI2luY2x1ZGUgPGxpbnV4L25taS5oPgorCisjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9OQU1FU1BBQ0UKK0FDUElfTU9EVUxFX05BTUUoIm5zaW5pdCIpCisKKy8qIExvY2FsIHByb3RvdHlwZXMgKi8KK3N0YXRpYyBhY3BpX3N0YXR1cworYWNwaV9uc19pbml0X29uZV9vYmplY3QoYWNwaV9oYW5kbGUgb2JqX2hhbmRsZSwKKwkJCXUzMiBsZXZlbCwgdm9pZCAqY29udGV4dCwgdm9pZCAqKnJldHVybl92YWx1ZSk7CisKK3N0YXRpYyBhY3BpX3N0YXR1cworYWNwaV9uc19pbml0X29uZV9kZXZpY2UoYWNwaV9oYW5kbGUgb2JqX2hhbmRsZSwKKwkJCXUzMiBuZXN0aW5nX2xldmVsLCB2b2lkICpjb250ZXh0LCB2b2lkICoqcmV0dXJuX3ZhbHVlKTsKKworc3RhdGljIGFjcGlfc3RhdHVzCithY3BpX25zX2ZpbmRfaW5pX21ldGhvZHMoYWNwaV9oYW5kbGUgb2JqX2hhbmRsZSwKKwkJCSB1MzIgbmVzdGluZ19sZXZlbCwgdm9pZCAqY29udGV4dCwgdm9pZCAqKnJldHVybl92YWx1ZSk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfbnNfaW5pdGlhbGl6ZV9vYmplY3RzCisgKgorICogUEFSQU1FVEVSUzogIE5vbmUKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IFdhbGsgdGhlIGVudGlyZSBuYW1lc3BhY2UgYW5kIHBlcmZvcm0gYW55IG5lY2Vzc2FyeQorICogICAgICAgICAgICAgIGluaXRpYWxpemF0aW9uIG9uIHRoZSBvYmplY3RzIGZvdW5kIHRoZXJlaW4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCithY3BpX3N0YXR1cyBhY3BpX25zX2luaXRpYWxpemVfb2JqZWN0cyh2b2lkKQoreworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwlzdHJ1Y3QgYWNwaV9pbml0X3dhbGtfaW5mbyBpbmZvOworCisJQUNQSV9GVU5DVElPTl9UUkFDRShuc19pbml0aWFsaXplX29iamVjdHMpOworCisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9ESVNQQVRDSCwKKwkJCSAgIioqKiogU3RhcnRpbmcgaW5pdGlhbGl6YXRpb24gb2YgbmFtZXNwYWNlIG9iamVjdHMgKioqKlxuIikpOworCUFDUElfREVCVUdfUFJJTlRfUkFXKChBQ1BJX0RCX0lOSVQsCisJCQkgICAgICAiQ29tcGxldGluZyBSZWdpb24vRmllbGQvQnVmZmVyL1BhY2thZ2UgaW5pdGlhbGl6YXRpb246IikpOworCisJLyogU2V0IGFsbCBpbml0IGluZm8gdG8gemVybyAqLworCisJQUNQSV9NRU1TRVQoJmluZm8sIDAsIHNpemVvZihzdHJ1Y3QgYWNwaV9pbml0X3dhbGtfaW5mbykpOworCisJLyogV2FsayBlbnRpcmUgbmFtZXNwYWNlIGZyb20gdGhlIHN1cHBsaWVkIHJvb3QgKi8KKworCXN0YXR1cyA9IGFjcGlfd2Fsa19uYW1lc3BhY2UoQUNQSV9UWVBFX0FOWSwgQUNQSV9ST09UX09CSkVDVCwKKwkJCQkgICAgIEFDUElfVUlOVDMyX01BWCwgYWNwaV9uc19pbml0X29uZV9vYmplY3QsCisJCQkJICAgICAmaW5mbywgTlVMTCk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCUFDUElfRVhDRVBUSU9OKChBRV9JTkZPLCBzdGF0dXMsICJEdXJpbmcgV2Fsa05hbWVzcGFjZSIpKTsKKwl9CisKKwlBQ1BJX0RFQlVHX1BSSU5UX1JBVygoQUNQSV9EQl9JTklULAorCQkJICAgICAgIlxuSW5pdGlhbGl6ZWQgJWhkLyVoZCBSZWdpb25zICVoZC8laGQgRmllbGRzICVoZC8laGQgQnVmZmVycyAlaGQvJWhkIFBhY2thZ2VzICglaGQgbm9kZXMpXG4iLAorCQkJICAgICAgaW5mby5vcF9yZWdpb25faW5pdCwgaW5mby5vcF9yZWdpb25fY291bnQsCisJCQkgICAgICBpbmZvLmZpZWxkX2luaXQsIGluZm8uZmllbGRfY291bnQsCisJCQkgICAgICBpbmZvLmJ1ZmZlcl9pbml0LCBpbmZvLmJ1ZmZlcl9jb3VudCwKKwkJCSAgICAgIGluZm8ucGFja2FnZV9pbml0LCBpbmZvLnBhY2thZ2VfY291bnQsCisJCQkgICAgICBpbmZvLm9iamVjdF9jb3VudCkpOworCisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9ESVNQQVRDSCwKKwkJCSAgIiVoZCBDb250cm9sIE1ldGhvZHMgZm91bmRcbiIsIGluZm8ubWV0aG9kX2NvdW50KSk7CisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9ESVNQQVRDSCwKKwkJCSAgIiVoZCBPcCBSZWdpb25zIGZvdW5kXG4iLCBpbmZvLm9wX3JlZ2lvbl9jb3VudCkpOworCisJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9uc19pbml0aWFsaXplX2RldmljZXMKKyAqCisgKiBQQVJBTUVURVJTOiAgTm9uZQorICoKKyAqIFJFVFVSTjogICAgICBhY3BpX3N0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBXYWxrIHRoZSBlbnRpcmUgbmFtZXNwYWNlIGFuZCBpbml0aWFsaXplIGFsbCBBQ1BJIGRldmljZXMuCisgKiAgICAgICAgICAgICAgVGhpcyBtZWFucyBydW5uaW5nIF9JTkkgb24gYWxsIHByZXNlbnQgZGV2aWNlcy4KKyAqCisgKiAgICAgICAgICAgICAgTm90ZTogV2UgaW5zdGFsbCBQQ0kgY29uZmlnIHNwYWNlIGhhbmRsZXIgb24gcmVnaW9uIGFjY2VzcywKKyAqICAgICAgICAgICAgICBub3QgaGVyZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCithY3BpX3N0YXR1cyBhY3BpX25zX2luaXRpYWxpemVfZGV2aWNlcyh2b2lkKQoreworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwlzdHJ1Y3QgYWNwaV9kZXZpY2Vfd2Fsa19pbmZvIGluZm87CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKG5zX2luaXRpYWxpemVfZGV2aWNlcyk7CisKKwkvKiBJbml0IGNvdW50ZXJzICovCisKKwlpbmZvLmRldmljZV9jb3VudCA9IDA7CisJaW5mby5udW1fU1RBID0gMDsKKwlpbmZvLm51bV9JTkkgPSAwOworCisJQUNQSV9ERUJVR19QUklOVF9SQVcoKEFDUElfREJfSU5JVCwKKwkJCSAgICAgICJJbml0aWFsaXppbmcgRGV2aWNlL1Byb2Nlc3Nvci9UaGVybWFsIG9iamVjdHMgYnkgZXhlY3V0aW5nIF9JTkkgbWV0aG9kczoiKSk7CisKKwkvKiBUcmVlIGFuYWx5c2lzOiBmaW5kIGFsbCBzdWJ0cmVlcyB0aGF0IGNvbnRhaW4gX0lOSSBtZXRob2RzICovCisKKwlzdGF0dXMgPSBhY3BpX25zX3dhbGtfbmFtZXNwYWNlKEFDUElfVFlQRV9BTlksIEFDUElfUk9PVF9PQkpFQ1QsCisJCQkJCUFDUElfVUlOVDMyX01BWCwgRkFMU0UsCisJCQkJCWFjcGlfbnNfZmluZF9pbmlfbWV0aG9kcywgJmluZm8sIE5VTEwpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlnb3RvIGVycm9yX2V4aXQ7CisJfQorCisJLyogQWxsb2NhdGUgdGhlIGV2YWx1YXRpb24gaW5mb3JtYXRpb24gYmxvY2sgKi8KKworCWluZm8uZXZhbHVhdGVfaW5mbyA9CisJICAgIEFDUElfQUxMT0NBVEVfWkVST0VEKHNpemVvZihzdHJ1Y3QgYWNwaV9ldmFsdWF0ZV9pbmZvKSk7CisJaWYgKCFpbmZvLmV2YWx1YXRlX2luZm8pIHsKKwkJc3RhdHVzID0gQUVfTk9fTUVNT1JZOworCQlnb3RvIGVycm9yX2V4aXQ7CisJfQorCisJLyogV2FsayBuYW1lc3BhY2UgdG8gZXhlY3V0ZSBhbGwgX0lOSXMgb24gcHJlc2VudCBkZXZpY2VzICovCisKKwlzdGF0dXMgPSBhY3BpX25zX3dhbGtfbmFtZXNwYWNlKEFDUElfVFlQRV9BTlksIEFDUElfUk9PVF9PQkpFQ1QsCisJCQkJCUFDUElfVUlOVDMyX01BWCwgRkFMU0UsCisJCQkJCWFjcGlfbnNfaW5pdF9vbmVfZGV2aWNlLCAmaW5mbywgTlVMTCk7CisKKwlBQ1BJX0ZSRUUoaW5mby5ldmFsdWF0ZV9pbmZvKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJZ290byBlcnJvcl9leGl0OworCX0KKworCUFDUElfREVCVUdfUFJJTlRfUkFXKChBQ1BJX0RCX0lOSVQsCisJCQkgICAgICAiXG5FeGVjdXRlZCAlaGQgX0lOSSBtZXRob2RzIHJlcXVpcmluZyAlaGQgX1NUQSBleGVjdXRpb25zIChleGFtaW5lZCAlaGQgb2JqZWN0cylcbiIsCisJCQkgICAgICBpbmZvLm51bV9JTkksIGluZm8ubnVtX1NUQSwgaW5mby5kZXZpY2VfY291bnQpKTsKKworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworCisgICAgICBlcnJvcl9leGl0OgorCUFDUElfRVhDRVBUSU9OKChBRV9JTkZPLCBzdGF0dXMsICJEdXJpbmcgZGV2aWNlIGluaXRpYWxpemF0aW9uIikpOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX25zX2luaXRfb25lX29iamVjdAorICoKKyAqIFBBUkFNRVRFUlM6ICBvYmpfaGFuZGxlICAgICAgLSBOb2RlCisgKiAgICAgICAgICAgICAgTGV2ZWwgICAgICAgICAgIC0gQ3VycmVudCBuZXN0aW5nIGxldmVsCisgKiAgICAgICAgICAgICAgQ29udGV4dCAgICAgICAgIC0gUG9pbnRzIHRvIGEgaW5pdCBpbmZvIHN0cnVjdAorICogICAgICAgICAgICAgIHJldHVybl92YWx1ZSAgICAtIE5vdCB1c2VkCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBDYWxsYmFjayBmcm9tIGFjcGlfd2Fsa19uYW1lc3BhY2UuIEludm9rZWQgZm9yIGV2ZXJ5IG9iamVjdAorICogICAgICAgICAgICAgIHdpdGhpbiB0aGUgIG5hbWVzcGFjZS4KKyAqCisgKiAgICAgICAgICAgICAgQ3VycmVudGx5LCB0aGUgb25seSBvYmplY3RzIHRoYXQgcmVxdWlyZSBpbml0aWFsaXphdGlvbiBhcmU6CisgKiAgICAgICAgICAgICAgMSkgTWV0aG9kcworICogICAgICAgICAgICAgIDIpIE9wIFJlZ2lvbnMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgYWNwaV9zdGF0dXMKK2FjcGlfbnNfaW5pdF9vbmVfb2JqZWN0KGFjcGlfaGFuZGxlIG9ial9oYW5kbGUsCisJCQl1MzIgbGV2ZWwsIHZvaWQgKmNvbnRleHQsIHZvaWQgKipyZXR1cm5fdmFsdWUpCit7CisJYWNwaV9vYmplY3RfdHlwZSB0eXBlOworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOworCXN0cnVjdCBhY3BpX2luaXRfd2Fsa19pbmZvICppbmZvID0KKwkgICAgKHN0cnVjdCBhY3BpX2luaXRfd2Fsa19pbmZvICopY29udGV4dDsKKwlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZSA9CisJICAgIChzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqKW9ial9oYW5kbGU7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2M7CisKKwlBQ1BJX0ZVTkNUSU9OX05BTUUobnNfaW5pdF9vbmVfb2JqZWN0KTsKKworCWluZm8tPm9iamVjdF9jb3VudCsrOworCisJLyogQW5kIGV2ZW4gdGhlbiwgd2UgYXJlIG9ubHkgaW50ZXJlc3RlZCBpbiBhIGZldyBvYmplY3QgdHlwZXMgKi8KKworCXR5cGUgPSBhY3BpX25zX2dldF90eXBlKG9ial9oYW5kbGUpOworCW9ial9kZXNjID0gYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0KG5vZGUpOworCWlmICghb2JqX2Rlc2MpIHsKKwkJcmV0dXJuIChBRV9PSyk7CisJfQorCisJLyogSW5jcmVtZW50IGNvdW50ZXJzIGZvciBvYmplY3QgdHlwZXMgd2UgYXJlIGxvb2tpbmcgZm9yICovCisKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIEFDUElfVFlQRV9SRUdJT046CisJCWluZm8tPm9wX3JlZ2lvbl9jb3VudCsrOworCQlicmVhazsKKworCWNhc2UgQUNQSV9UWVBFX0JVRkZFUl9GSUVMRDoKKwkJaW5mby0+ZmllbGRfY291bnQrKzsKKwkJYnJlYWs7CisKKwljYXNlIEFDUElfVFlQRV9MT0NBTF9CQU5LX0ZJRUxEOgorCQlpbmZvLT5maWVsZF9jb3VudCsrOworCQlicmVhazsKKworCWNhc2UgQUNQSV9UWVBFX0JVRkZFUjoKKwkJaW5mby0+YnVmZmVyX2NvdW50Kys7CisJCWJyZWFrOworCisJY2FzZSBBQ1BJX1RZUEVfUEFDS0FHRToKKwkJaW5mby0+cGFja2FnZV9jb3VudCsrOworCQlicmVhazsKKworCWRlZmF1bHQ6CisKKwkJLyogTm8gaW5pdCByZXF1aXJlZCwganVzdCBleGl0IG5vdyAqLworCQlyZXR1cm4gKEFFX09LKTsKKwl9CisKKwkvKgorCSAqIElmIHRoZSBvYmplY3QgaXMgYWxyZWFkeSBpbml0aWFsaXplZCwgbm90aGluZyBlbHNlIHRvIGRvCisJICovCisJaWYgKG9ial9kZXNjLT5jb21tb24uZmxhZ3MgJiBBT1BPQkpfREFUQV9WQUxJRCkgeworCQlyZXR1cm4gKEFFX09LKTsKKwl9CisKKwkvKgorCSAqIE11c3QgbG9jayB0aGUgaW50ZXJwcmV0ZXIgYmVmb3JlIGV4ZWN1dGluZyBBTUwgY29kZQorCSAqLworCWFjcGlfZXhfZW50ZXJfaW50ZXJwcmV0ZXIoKTsKKworCS8qCisJICogRWFjaCBvZiB0aGVzZSB0eXBlcyBjYW4gY29udGFpbiBleGVjdXRhYmxlIEFNTCBjb2RlIHdpdGhpbiB0aGUKKwkgKiBkZWNsYXJhdGlvbi4KKwkgKi8KKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIEFDUElfVFlQRV9SRUdJT046CisKKwkJaW5mby0+b3BfcmVnaW9uX2luaXQrKzsKKwkJc3RhdHVzID0gYWNwaV9kc19nZXRfcmVnaW9uX2FyZ3VtZW50cyhvYmpfZGVzYyk7CisJCWJyZWFrOworCisJY2FzZSBBQ1BJX1RZUEVfQlVGRkVSX0ZJRUxEOgorCisJCWluZm8tPmZpZWxkX2luaXQrKzsKKwkJc3RhdHVzID0gYWNwaV9kc19nZXRfYnVmZmVyX2ZpZWxkX2FyZ3VtZW50cyhvYmpfZGVzYyk7CisJCWJyZWFrOworCisJY2FzZSBBQ1BJX1RZUEVfTE9DQUxfQkFOS19GSUVMRDoKKworCQlpbmZvLT5maWVsZF9pbml0Kys7CisJCXN0YXR1cyA9IGFjcGlfZHNfZ2V0X2JhbmtfZmllbGRfYXJndW1lbnRzKG9ial9kZXNjKTsKKwkJYnJlYWs7CisKKwljYXNlIEFDUElfVFlQRV9CVUZGRVI6CisKKwkJaW5mby0+YnVmZmVyX2luaXQrKzsKKwkJc3RhdHVzID0gYWNwaV9kc19nZXRfYnVmZmVyX2FyZ3VtZW50cyhvYmpfZGVzYyk7CisJCWJyZWFrOworCisJY2FzZSBBQ1BJX1RZUEVfUEFDS0FHRToKKworCQlpbmZvLT5wYWNrYWdlX2luaXQrKzsKKwkJc3RhdHVzID0gYWNwaV9kc19nZXRfcGFja2FnZV9hcmd1bWVudHMob2JqX2Rlc2MpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCS8qIE5vIG90aGVyIHR5cGVzIGNhbiBnZXQgaGVyZSAqLworCQlicmVhazsKKwl9CisKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJQUNQSV9FWENFUFRJT04oKEFFX0lORk8sIHN0YXR1cywKKwkJCQkiQ291bGQgbm90IGV4ZWN1dGUgYXJndW1lbnRzIGZvciBbJTQuNHNdICglcykiLAorCQkJCWFjcGlfdXRfZ2V0X25vZGVfbmFtZShub2RlKSwKKwkJCQlhY3BpX3V0X2dldF90eXBlX25hbWUodHlwZSkpKTsKKwl9CisKKwkvKgorCSAqIFByaW50IGEgZG90IGZvciBlYWNoIG9iamVjdCB1bmxlc3Mgd2UgYXJlIGdvaW5nIHRvIHByaW50IHRoZSBlbnRpcmUKKwkgKiBwYXRobmFtZQorCSAqLworCWlmICghKGFjcGlfZGJnX2xldmVsICYgQUNQSV9MVl9JTklUX05BTUVTKSkgeworCQlBQ1BJX0RFQlVHX1BSSU5UX1JBVygoQUNQSV9EQl9JTklULCAiLiIpKTsKKwl9CisKKwkvKgorCSAqIFdlIGlnbm9yZSBlcnJvcnMgZnJvbSBhYm92ZSwgYW5kIGFsd2F5cyByZXR1cm4gT0ssIHNpbmNlIHdlIGRvbid0IHdhbnQKKwkgKiB0byBhYm9ydCB0aGUgd2FsayBvbiBhbnkgc2luZ2xlIGVycm9yLgorCSAqLworCWFjcGlfZXhfZXhpdF9pbnRlcnByZXRlcigpOworCXJldHVybiAoQUVfT0spOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX25zX2ZpbmRfaW5pX21ldGhvZHMKKyAqCisgKiBQQVJBTUVURVJTOiAgYWNwaV93YWxrX2NhbGxiYWNrCisgKgorICogUkVUVVJOOiAgICAgIGFjcGlfc3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IENhbGxlZCBkdXJpbmcgbmFtZXNwYWNlIHdhbGsuIEZpbmRzIG9iamVjdHMgbmFtZWQgX0lOSSB1bmRlcgorICogICAgICAgICAgICAgIGRldmljZS9wcm9jZXNzb3IvdGhlcm1hbCBvYmplY3RzLCBhbmQgbWFya3MgdGhlIGVudGlyZSBzdWJ0cmVlCisgKiAgICAgICAgICAgICAgd2l0aCBhIFNVQlRSRUVfSEFTX0lOSSBmbGFnLiBUaGlzIGZsYWcgaXMgdXNlZCBkdXJpbmcgdGhlCisgKiAgICAgICAgICAgICAgc3Vic2VxdWVudCBkZXZpY2UgaW5pdGlhbGl6YXRpb24gd2FsayB0byBhdm9pZCBlbnRpcmUgc3VidHJlZXMKKyAqICAgICAgICAgICAgICB0aGF0IGRvIG5vdCBjb250YWluIGFuIF9JTkkuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGFjcGlfc3RhdHVzCithY3BpX25zX2ZpbmRfaW5pX21ldGhvZHMoYWNwaV9oYW5kbGUgb2JqX2hhbmRsZSwKKwkJCSB1MzIgbmVzdGluZ19sZXZlbCwgdm9pZCAqY29udGV4dCwgdm9pZCAqKnJldHVybl92YWx1ZSkKK3sKKwlzdHJ1Y3QgYWNwaV9kZXZpY2Vfd2Fsa19pbmZvICppbmZvID0KKwkgICAgQUNQSV9DQVNUX1BUUihzdHJ1Y3QgYWNwaV9kZXZpY2Vfd2Fsa19pbmZvLCBjb250ZXh0KTsKKwlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZTsKKwlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqcGFyZW50X25vZGU7CisKKwkvKiBLZWVwIGNvdW50IG9mIGRldmljZS9wcm9jZXNzb3IvdGhlcm1hbCBvYmplY3RzICovCisKKwlub2RlID0gQUNQSV9DQVNUX1BUUihzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSwgb2JqX2hhbmRsZSk7CisJaWYgKChub2RlLT50eXBlID09IEFDUElfVFlQRV9ERVZJQ0UpIHx8CisJICAgIChub2RlLT50eXBlID09IEFDUElfVFlQRV9QUk9DRVNTT1IpIHx8CisJICAgIChub2RlLT50eXBlID09IEFDUElfVFlQRV9USEVSTUFMKSkgeworCQlpbmZvLT5kZXZpY2VfY291bnQrKzsKKwkJcmV0dXJuIChBRV9PSyk7CisJfQorCisJLyogV2UgYXJlIG9ubHkgbG9va2luZyBmb3IgbWV0aG9kcyBuYW1lZCBfSU5JICovCisKKwlpZiAoIUFDUElfQ09NUEFSRV9OQU1FKG5vZGUtPm5hbWUuYXNjaWksIE1FVEhPRF9OQU1FX19JTkkpKSB7CisJCXJldHVybiAoQUVfT0spOworCX0KKworCS8qCisJICogVGhlIG9ubHkgX0lOSSBtZXRob2RzIHRoYXQgd2UgY2FyZSBhYm91dCBhcmUgdGhvc2UgdGhhdCBhcmUKKwkgKiBwcmVzZW50IHVuZGVyIERldmljZSwgUHJvY2Vzc29yLCBhbmQgVGhlcm1hbCBvYmplY3RzLgorCSAqLworCXBhcmVudF9ub2RlID0gYWNwaV9uc19nZXRfcGFyZW50X25vZGUobm9kZSk7CisJc3dpdGNoIChwYXJlbnRfbm9kZS0+dHlwZSkgeworCWNhc2UgQUNQSV9UWVBFX0RFVklDRToKKwljYXNlIEFDUElfVFlQRV9QUk9DRVNTT1I6CisJY2FzZSBBQ1BJX1RZUEVfVEhFUk1BTDoKKworCQkvKiBNYXJrIHBhcmVudCBhbmQgYnViYmxlIHVwIHRoZSBJTkkgcHJlc2VudCBmbGFnIHRvIHRoZSByb290ICovCisKKwkJd2hpbGUgKHBhcmVudF9ub2RlKSB7CisJCQlwYXJlbnRfbm9kZS0+ZmxhZ3MgfD0gQU5PQkpfU1VCVFJFRV9IQVNfSU5JOworCQkJcGFyZW50X25vZGUgPSBhY3BpX25zX2dldF9wYXJlbnRfbm9kZShwYXJlbnRfbm9kZSk7CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gKEFFX09LKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9uc19pbml0X29uZV9kZXZpY2UKKyAqCisgKiBQQVJBTUVURVJTOiAgYWNwaV93YWxrX2NhbGxiYWNrCisgKgorICogUkVUVVJOOiAgICAgIGFjcGlfc3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IFRoaXMgaXMgY2FsbGVkIG9uY2UgcGVyIGRldmljZSBzb29uIGFmdGVyIEFDUEkgaXMgZW5hYmxlZAorICogICAgICAgICAgICAgIHRvIGluaXRpYWxpemUgZWFjaCBkZXZpY2UuIEl0IGRldGVybWluZXMgaWYgdGhlIGRldmljZSBpcworICogICAgICAgICAgICAgIHByZXNlbnQsIGFuZCBpZiBzbywgY2FsbHMgX0lOSS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgYWNwaV9zdGF0dXMKK2FjcGlfbnNfaW5pdF9vbmVfZGV2aWNlKGFjcGlfaGFuZGxlIG9ial9oYW5kbGUsCisJCQl1MzIgbmVzdGluZ19sZXZlbCwgdm9pZCAqY29udGV4dCwgdm9pZCAqKnJldHVybl92YWx1ZSkKK3sKKwlzdHJ1Y3QgYWNwaV9kZXZpY2Vfd2Fsa19pbmZvICp3YWxrX2luZm8gPQorCSAgICBBQ1BJX0NBU1RfUFRSKHN0cnVjdCBhY3BpX2RldmljZV93YWxrX2luZm8sIGNvbnRleHQpOworCXN0cnVjdCBhY3BpX2V2YWx1YXRlX2luZm8gKmluZm8gPSB3YWxrX2luZm8tPmV2YWx1YXRlX2luZm87CisJdTMyIGZsYWdzOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqZGV2aWNlX25vZGU7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKG5zX2luaXRfb25lX2RldmljZSk7CisKKwkvKiBXZSBhcmUgaW50ZXJlc3RlZCBpbiBEZXZpY2VzLCBQcm9jZXNzb3JzIGFuZCB0aGVybWFsX3pvbmVzIG9ubHkgKi8KKworCWRldmljZV9ub2RlID0gQUNQSV9DQVNUX1BUUihzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSwgb2JqX2hhbmRsZSk7CisJaWYgKChkZXZpY2Vfbm9kZS0+dHlwZSAhPSBBQ1BJX1RZUEVfREVWSUNFKSAmJgorCSAgICAoZGV2aWNlX25vZGUtPnR5cGUgIT0gQUNQSV9UWVBFX1BST0NFU1NPUikgJiYKKwkgICAgKGRldmljZV9ub2RlLT50eXBlICE9IEFDUElfVFlQRV9USEVSTUFMKSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOworCX0KKworCS8qCisJICogQmVjYXVzZSBvZiBhbiBlYXJsaWVyIG5hbWVzcGFjZSBhbmFseXNpcywgYWxsIHN1YnRyZWVzIHRoYXQgY29udGFpbiBhbgorCSAqIF9JTkkgbWV0aG9kIGFyZSB0YWdnZWQuCisJICoKKwkgKiBJZiB0aGlzIGRldmljZSBzdWJ0cmVlIGRvZXMgbm90IGNvbnRhaW4gYW55IF9JTkkgbWV0aG9kcywgd2UKKwkgKiBjYW4gZXhpdCBub3cgYW5kIHN0b3AgdHJhdmVyc2luZyB0aGlzIGVudGlyZSBzdWJ0cmVlLgorCSAqLworCWlmICghKGRldmljZV9ub2RlLT5mbGFncyAmIEFOT0JKX1NVQlRSRUVfSEFTX0lOSSkpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0NUUkxfREVQVEgpOworCX0KKworCS8qCisJICogUnVuIF9TVEEgdG8gZGV0ZXJtaW5lIGlmIHRoaXMgZGV2aWNlIGlzIHByZXNlbnQgYW5kIGZ1bmN0aW9uaW5nLiBXZQorCSAqIG11c3Qga25vdyB0aGlzIGluZm9ybWF0aW9uIGZvciB0d28gaW1wb3J0YW50IHJlYXNvbnMgKGZyb20gQUNQSSBzcGVjKToKKwkgKgorCSAqIDEpIFdlIGNhbiBvbmx5IHJ1biBfSU5JIGlmIHRoZSBkZXZpY2UgaXMgcHJlc2VudC4KKwkgKiAyKSBXZSBtdXN0IGFib3J0IHRoZSBkZXZpY2UgdHJlZSB3YWxrIG9uIHRoaXMgc3VidHJlZSBpZiB0aGUgZGV2aWNlIGlzCisJICogICAgbm90IHByZXNlbnQgYW5kIGlzIG5vdCBmdW5jdGlvbmFsICh3ZSB3aWxsIG5vdCBleGFtaW5lIHRoZSBjaGlsZHJlbikKKwkgKgorCSAqIFRoZSBfU1RBIG1ldGhvZCBpcyBub3QgcmVxdWlyZWQgdG8gYmUgcHJlc2VudCB1bmRlciB0aGUgZGV2aWNlLCB3ZQorCSAqIGFzc3VtZSB0aGUgZGV2aWNlIGlzIHByZXNlbnQgaWYgX1NUQSBkb2VzIG5vdCBleGlzdC4KKwkgKi8KKwlBQ1BJX0RFQlVHX0VYRUMoYWNwaV91dF9kaXNwbGF5X2luaXRfcGF0aG5hbWUKKwkJCShBQ1BJX1RZUEVfTUVUSE9ELCBkZXZpY2Vfbm9kZSwgTUVUSE9EX05BTUVfX1NUQSkpOworCisJc3RhdHVzID0gYWNwaV91dF9leGVjdXRlX1NUQShkZXZpY2Vfbm9kZSwgJmZsYWdzKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKworCQkvKiBJZ25vcmUgZXJyb3IgYW5kIG1vdmUgb24gdG8gbmV4dCBkZXZpY2UgKi8KKworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOworCX0KKworCS8qCisJICogRmxhZ3MgPT0gLTEgbWVhbnMgdGhhdCBfU1RBIHdhcyBub3QgZm91bmQuIEluIHRoaXMgY2FzZSwgd2UgYXNzdW1lIHRoYXQKKwkgKiB0aGUgZGV2aWNlIGlzIGJvdGggcHJlc2VudCBhbmQgZnVuY3Rpb25hbC4KKwkgKgorCSAqIEZyb20gdGhlIEFDUEkgc3BlYywgZGVzY3JpcHRpb24gb2YgX1NUQToKKwkgKgorCSAqICJJZiBhIGRldmljZSBvYmplY3QgKGluY2x1ZGluZyB0aGUgcHJvY2Vzc29yIG9iamVjdCkgZG9lcyBub3QgaGF2ZSBhbgorCSAqIF9TVEEgb2JqZWN0LCB0aGVuIE9TUE0gYXNzdW1lcyB0aGF0IGFsbCBvZiB0aGUgYWJvdmUgYml0cyBhcmUgc2V0IChpbgorCSAqIG90aGVyIHdvcmRzLCB0aGUgZGV2aWNlIGlzIHByZXNlbnQsIC4uLiwgYW5kIGZ1bmN0aW9uaW5nKSIKKwkgKi8KKwlpZiAoZmxhZ3MgIT0gQUNQSV9VSU5UMzJfTUFYKSB7CisJCXdhbGtfaW5mby0+bnVtX1NUQSsrOworCX0KKworCS8qCisJICogRXhhbWluZSB0aGUgUFJFU0VOVCBhbmQgRlVOQ1RJT05JTkcgc3RhdHVzIGJpdHMKKwkgKgorCSAqIE5vdGU6IEFDUEkgc3BlYyBkb2VzIG5vdCBzZWVtIHRvIHNwZWNpZnkgYmVoYXZpb3IgZm9yIHRoZSBwcmVzZW50IGJ1dAorCSAqIG5vdCBmdW5jdGlvbmluZyBjYXNlLCBzbyB3ZSBhc3N1bWUgZnVuY3Rpb25pbmcgaWYgcHJlc2VudC4KKwkgKi8KKwlpZiAoIShmbGFncyAmIEFDUElfU1RBX0RFVklDRV9QUkVTRU5UKSkgeworCisJCS8qIERldmljZSBpcyBub3QgcHJlc2VudCwgd2UgbXVzdCBleGFtaW5lIHRoZSBGdW5jdGlvbmluZyBiaXQgKi8KKworCQlpZiAoZmxhZ3MgJiBBQ1BJX1NUQV9ERVZJQ0VfRlVOQ1RJT05JTkcpIHsKKwkJCS8qCisJCQkgKiBEZXZpY2UgaXMgbm90IHByZXNlbnQgYnV0IGlzICJmdW5jdGlvbmluZyIuIEluIHRoaXMgY2FzZSwKKwkJCSAqIHdlIHdpbGwgbm90IHJ1biBfSU5JLCBidXQgd2UgY29udGludWUgdG8gZXhhbWluZSB0aGUgY2hpbGRyZW4KKwkJCSAqIG9mIHRoaXMgZGV2aWNlLgorCQkJICoKKwkJCSAqIEZyb20gdGhlIEFDUEkgc3BlYywgZGVzY3JpcHRpb24gb2YgX1NUQTogKE5vdGUgLSBubyBtZW50aW9uCisJCQkgKiBvZiB3aGV0aGVyIHRvIHJ1biBfSU5JIG9yIG5vdCBvbiB0aGUgZGV2aWNlIGluIHF1ZXN0aW9uKQorCQkJICoKKwkJCSAqICJfU1RBIG1heSByZXR1cm4gYml0IDAgY2xlYXIgKG5vdCBwcmVzZW50KSB3aXRoIGJpdCAzIHNldAorCQkJICogKGRldmljZSBpcyBmdW5jdGlvbmFsKS4gVGhpcyBjYXNlIGlzIHVzZWQgdG8gaW5kaWNhdGUgYSB2YWxpZAorCQkJICogZGV2aWNlIGZvciB3aGljaCBubyBkZXZpY2UgZHJpdmVyIHNob3VsZCBiZSBsb2FkZWQgKGZvciBleGFtcGxlLAorCQkJICogYSBicmlkZ2UgZGV2aWNlLikgQ2hpbGRyZW4gb2YgdGhpcyBkZXZpY2UgbWF5IGJlIHByZXNlbnQgYW5kCisJCQkgKiB2YWxpZC4gT1NQTSBzaG91bGQgY29udGludWUgZW51bWVyYXRpb24gYmVsb3cgYSBkZXZpY2Ugd2hvc2UKKwkJCSAqIF9TVEEgcmV0dXJucyB0aGlzIGJpdCBjb21iaW5hdGlvbiIKKwkJCSAqLworCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKKwkJfSBlbHNlIHsKKwkJCS8qCisJCQkgKiBEZXZpY2UgaXMgbm90IHByZXNlbnQgYW5kIGlzIG5vdCBmdW5jdGlvbmluZy4gV2UgbXVzdCBhYm9ydCB0aGUKKwkJCSAqIHdhbGsgb2YgdGhpcyBzdWJ0cmVlIGltbWVkaWF0ZWx5IC0tIGRvbid0IGxvb2sgYXQgdGhlIGNoaWxkcmVuCisJCQkgKiBvZiBzdWNoIGEgZGV2aWNlLgorCQkJICoKKwkJCSAqIEZyb20gdGhlIEFDUEkgc3BlYywgZGVzY3JpcHRpb24gb2YgX0lOSToKKwkJCSAqCisJCQkgKiAiSWYgdGhlIF9TVEEgbWV0aG9kIGluZGljYXRlcyB0aGF0IHRoZSBkZXZpY2UgaXMgbm90IHByZXNlbnQsCisJCQkgKiBPU1BNIHdpbGwgbm90IHJ1biB0aGUgX0lOSSBhbmQgd2lsbCBub3QgZXhhbWluZSB0aGUgY2hpbGRyZW4KKwkJCSAqIG9mIHRoZSBkZXZpY2UgZm9yIF9JTkkgbWV0aG9kcyIKKwkJCSAqLworCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0NUUkxfREVQVEgpOworCQl9CisJfQorCisJLyoKKwkgKiBUaGUgZGV2aWNlIGlzIHByZXNlbnQgb3IgaXMgYXNzdW1lZCBwcmVzZW50IGlmIG5vIF9TVEEgZXhpc3RzLgorCSAqIFJ1biB0aGUgX0lOSSBpZiBpdCBleGlzdHMgKG5vdCByZXF1aXJlZCB0byBleGlzdCkKKwkgKgorCSAqIE5vdGU6IFdlIGtub3cgdGhlcmUgaXMgYW4gX0lOSSB3aXRoaW4gdGhpcyBzdWJ0cmVlLCBidXQgaXQgbWF5IG5vdCBiZQorCSAqIHVuZGVyIHRoaXMgcGFydGljdWxhciBkZXZpY2UsIGl0IG1heSBiZSBsb3dlciBpbiB0aGUgYnJhbmNoLgorCSAqLworCUFDUElfREVCVUdfRVhFQyhhY3BpX3V0X2Rpc3BsYXlfaW5pdF9wYXRobmFtZQorCQkJKEFDUElfVFlQRV9NRVRIT0QsIGRldmljZV9ub2RlLCBNRVRIT0RfTkFNRV9fSU5JKSk7CisKKwlpbmZvLT5wcmVmaXhfbm9kZSA9IGRldmljZV9ub2RlOworCWluZm8tPnBhdGhuYW1lID0gTUVUSE9EX05BTUVfX0lOSTsKKwlpbmZvLT5wYXJhbWV0ZXJzID0gTlVMTDsKKwlpbmZvLT5mbGFncyA9IEFDUElfSUdOT1JFX1JFVFVSTl9WQUxVRTsKKworCS8qCisJICogU29tZSBoYXJkd2FyZSByZWxpZXMgb24gdGhpcyBiZWluZyBleGVjdXRlZCBhcyBhdG9taWNhbGx5CisJICogYXMgcG9zc2libGUgKHdpdGhvdXQgYW4gTk1JIGJlaW5nIHJlY2VpdmVkIGluIHRoZSBtaWRkbGUgb2YKKwkgKiB0aGlzKSAtIHNvIGRpc2FibGUgTk1JcyBhbmQgaW5pdGlhbGl6ZSB0aGUgZGV2aWNlOgorCSAqLworCWFjcGlfbm1pX2Rpc2FibGUoKTsKKwlzdGF0dXMgPSBhY3BpX25zX2V2YWx1YXRlKGluZm8pOworCWFjcGlfbm1pX2VuYWJsZSgpOworCisJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCXdhbGtfaW5mby0+bnVtX0lOSSsrOworCisJCWlmICgoYWNwaV9kYmdfbGV2ZWwgPD0gQUNQSV9MVl9BTExfRVhDRVBUSU9OUykgJiYKKwkJICAgICghKGFjcGlfZGJnX2xldmVsICYgQUNQSV9MVl9JTkZPKSkpIHsKKwkJCUFDUElfREVCVUdfUFJJTlRfUkFXKChBQ1BJX0RCX0lOSVQsICIuIikpOworCQl9CisJfQorI2lmZGVmIEFDUElfREVCVUdfT1VUUFVUCisJZWxzZSBpZiAoc3RhdHVzICE9IEFFX05PVF9GT1VORCkgeworCisJCS8qIElnbm9yZSBlcnJvciBhbmQgbW92ZSBvbiB0byBuZXh0IGRldmljZSAqLworCisJCWNoYXIgKnNjb3BlX25hbWUgPQorCQkgICAgYWNwaV9uc19nZXRfZXh0ZXJuYWxfcGF0aG5hbWUoaW5mby0+cmVzb2x2ZWRfbm9kZSk7CisKKwkJQUNQSV9FWENFUFRJT04oKEFFX0lORk8sIHN0YXR1cywgImR1cmluZyAlcy5fSU5JIGV4ZWN1dGlvbiIsCisJCQkJc2NvcGVfbmFtZSkpOworCQlBQ1BJX0ZSRUUoc2NvcGVfbmFtZSk7CisJfQorI2VuZGlmCisKKwkvKiBJZ25vcmUgZXJyb3JzIGZyb20gYWJvdmUgKi8KKworCXN0YXR1cyA9IEFFX09LOworCisJLyoKKwkgKiBUaGUgX0lOSSBtZXRob2QgaGFzIGJlZW4gcnVuIGlmIHByZXNlbnQ7IGNhbGwgdGhlIEdsb2JhbCBJbml0aWFsaXphdGlvbgorCSAqIEhhbmRsZXIgZm9yIHRoaXMgZGV2aWNlLgorCSAqLworCWlmIChhY3BpX2dibF9pbml0X2hhbmRsZXIpIHsKKwkJc3RhdHVzID0KKwkJICAgIGFjcGlfZ2JsX2luaXRfaGFuZGxlcihkZXZpY2Vfbm9kZSwgQUNQSV9JTklUX0RFVklDRV9JTkkpOworCX0KKworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS9uc2xvYWQuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvbnNsb2FkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTBiYTllMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvbnNsb2FkLmMKQEAgLTAsMCArMSwzMTUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBNb2R1bGUgTmFtZTogbnNsb2FkIC0gbmFtZXNwYWNlIGxvYWRpbmcvZXhwYW5kaW5nL2NvbnRyYWN0aW5nIHByb2NlZHVyZXMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA4LCBJbnRlbCBDb3JwLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAorICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgYXQgbWluaW11bSBhIGRpc2NsYWltZXIKKyAqICAgIHN1YnN0YW50aWFsbHkgc2ltaWxhciB0byB0aGUgIk5PIFdBUlJBTlRZIiBkaXNjbGFpbWVyIGJlbG93CisgKiAgICAoIkRpc2NsYWltZXIiKSBhbmQgYW55IHJlZGlzdHJpYnV0aW9uIG11c3QgYmUgY29uZGl0aW9uZWQgdXBvbgorICogICAgaW5jbHVkaW5nIGEgc3Vic3RhbnRpYWxseSBzaW1pbGFyIERpc2NsYWltZXIgcmVxdWlyZW1lbnQgZm9yIGZ1cnRoZXIKKyAqICAgIGJpbmFyeSByZWRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcworICogICAgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBOTyBXQVJSQU5UWQorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcKKyAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgorICovCisKKyNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KKyNpbmNsdWRlICJhY2NvbW1vbi5oIgorI2luY2x1ZGUgImFjbmFtZXNwLmgiCisjaW5jbHVkZSAiYWNkaXNwYXQuaCIKKyNpbmNsdWRlICJhY3RhYmxlcy5oIgorCisjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9OQU1FU1BBQ0UKK0FDUElfTU9EVUxFX05BTUUoIm5zbG9hZCIpCisKKy8qIExvY2FsIHByb3RvdHlwZXMgKi8KKyNpZmRlZiBBQ1BJX0ZVVFVSRV9JTVBMRU1FTlRBVElPTgorYWNwaV9zdGF0dXMgYWNwaV9uc191bmxvYWRfbmFtZXNwYWNlKGFjcGlfaGFuZGxlIGhhbmRsZSk7CisKK3N0YXRpYyBhY3BpX3N0YXR1cyBhY3BpX25zX2RlbGV0ZV9zdWJ0cmVlKGFjcGlfaGFuZGxlIHN0YXJ0X2hhbmRsZSk7CisjZW5kaWYKKworI2lmbmRlZiBBQ1BJX05PX01FVEhPRF9FWEVDVVRJT04KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfbnNfbG9hZF90YWJsZQorICoKKyAqIFBBUkFNRVRFUlM6ICB0YWJsZV9pbmRleCAgICAgLSBJbmRleCBmb3IgdGFibGUgdG8gYmUgbG9hZGVkCisgKiAgICAgICAgICAgICAgTm9kZSAgICAgICAgICAgIC0gT3duaW5nIE5TIG5vZGUKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IExvYWQgb25lIEFDUEkgdGFibGUgaW50byB0aGUgbmFtZXNwYWNlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworYWNwaV9zdGF0dXMKK2FjcGlfbnNfbG9hZF90YWJsZSh1MzIgdGFibGVfaW5kZXgsIHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlKQoreworCWFjcGlfc3RhdHVzIHN0YXR1czsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0UobnNfbG9hZF90YWJsZSk7CisKKwkvKgorCSAqIFBhcnNlIHRoZSB0YWJsZSBhbmQgbG9hZCB0aGUgbmFtZXNwYWNlIHdpdGggYWxsIG5hbWVkCisJICogb2JqZWN0cyBmb3VuZCB3aXRoaW4uICBDb250cm9sIG1ldGhvZHMgYXJlIE5PVCBwYXJzZWQKKwkgKiBhdCB0aGlzIHRpbWUuICBJbiBmYWN0LCB0aGUgY29udHJvbCBtZXRob2RzIGNhbm5vdCBiZQorCSAqIHBhcnNlZCB1bnRpbCB0aGUgZW50aXJlIG5hbWVzcGFjZSBpcyBsb2FkZWQsIGJlY2F1c2UKKwkgKiBpZiBhIGNvbnRyb2wgbWV0aG9kIG1ha2VzIGEgZm9yd2FyZCByZWZlcmVuY2UgKGNhbGwpCisJICogdG8gYW5vdGhlciBjb250cm9sIG1ldGhvZCwgd2UgY2FuJ3QgY29udGludWUgcGFyc2luZworCSAqIGJlY2F1c2Ugd2UgZG9uJ3Qga25vdyBob3cgbWFueSBhcmd1bWVudHMgdG8gcGFyc2UgbmV4dCEKKwkgKi8KKwlzdGF0dXMgPSBhY3BpX3V0X2FjcXVpcmVfbXV0ZXgoQUNQSV9NVFhfTkFNRVNQQUNFKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CisJfQorCisJLyogSWYgdGFibGUgYWxyZWFkeSBsb2FkZWQgaW50byBuYW1lc3BhY2UsIGp1c3QgcmV0dXJuICovCisKKwlpZiAoYWNwaV90Yl9pc190YWJsZV9sb2FkZWQodGFibGVfaW5kZXgpKSB7CisJCXN0YXR1cyA9IEFFX0FMUkVBRFlfRVhJU1RTOworCQlnb3RvIHVubG9jazsKKwl9CisKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sCisJCQkgICIqKioqIExvYWRpbmcgdGFibGUgaW50byBuYW1lc3BhY2UgKioqKlxuIikpOworCisJc3RhdHVzID0gYWNwaV90Yl9hbGxvY2F0ZV9vd25lcl9pZCh0YWJsZV9pbmRleCk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCWdvdG8gdW5sb2NrOworCX0KKworCXN0YXR1cyA9IGFjcGlfbnNfcGFyc2VfdGFibGUodGFibGVfaW5kZXgsIG5vZGUpOworCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkgeworCQlhY3BpX3RiX3NldF90YWJsZV9sb2FkZWRfZmxhZyh0YWJsZV9pbmRleCwgVFJVRSk7CisJfSBlbHNlIHsKKwkJKHZvaWQpYWNwaV90Yl9yZWxlYXNlX293bmVyX2lkKHRhYmxlX2luZGV4KTsKKwl9CisKKyAgICAgIHVubG9jazoKKwkodm9pZClhY3BpX3V0X3JlbGVhc2VfbXV0ZXgoQUNQSV9NVFhfTkFNRVNQQUNFKTsKKworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKKwl9CisKKwkvKgorCSAqIE5vdyB3ZSBjYW4gcGFyc2UgdGhlIGNvbnRyb2wgbWV0aG9kcy4gIFdlIGFsd2F5cyBwYXJzZQorCSAqIHRoZW0gaGVyZSBmb3IgYSBzYW5pdHkgY2hlY2ssIGFuZCBpZiBjb25maWd1cmVkIGZvcgorCSAqIGp1c3QtaW4tdGltZSBwYXJzaW5nLCB3ZSBkZWxldGUgdGhlIGNvbnRyb2wgbWV0aG9kCisJICogcGFyc2UgdHJlZXMuCisJICovCisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLAorCQkJICAiKioqKiBCZWdpbiBUYWJsZSBNZXRob2QgUGFyc2luZyBhbmQgT2JqZWN0IEluaXRpYWxpemF0aW9uICoqKipcbiIpKTsKKworCXN0YXR1cyA9IGFjcGlfZHNfaW5pdGlhbGl6ZV9vYmplY3RzKHRhYmxlX2luZGV4LCBub2RlKTsKKworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywKKwkJCSAgIioqKiogQ29tcGxldGVkIFRhYmxlIE1ldGhvZCBQYXJzaW5nIGFuZCBPYmplY3QgSW5pdGlhbGl6YXRpb24gKioqKlxuIikpOworCisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Cit9CisKKyNpZmRlZiBBQ1BJX09CU09MRVRFX0ZVTkNUSU9OUworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9sb2FkX25hbWVzcGFjZQorICoKKyAqIFBBUkFNRVRFUlM6ICBOb25lCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBMb2FkIHRoZSBuYW1lIHNwYWNlIGZyb20gd2hhdCBldmVyIGlzIHBvaW50ZWQgdG8gYnkgRFNEVC4KKyAqICAgICAgICAgICAgICAoRFNEVCBwb2ludHMgdG8gZWl0aGVyIHRoZSBCSU9TIG9yIGEgYnVmZmVyLikKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCithY3BpX3N0YXR1cyBhY3BpX25zX2xvYWRfbmFtZXNwYWNlKHZvaWQpCit7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCisJQUNQSV9GVU5DVElPTl9UUkFDRShhY3BpX2xvYWRfbmFtZV9zcGFjZSk7CisKKwkvKiBUaGVyZSBtdXN0IGJlIGF0IGxlYXN0IGEgRFNEVCBpbnN0YWxsZWQgKi8KKworCWlmIChhY3BpX2dibF9EU0RUID09IE5VTEwpIHsKKwkJQUNQSV9FUlJPUigoQUVfSU5GTywgIkRTRFQgaXMgbm90IGluIG1lbW9yeSIpKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX0FDUElfVEFCTEVTKTsKKwl9CisKKwkvKgorCSAqIExvYWQgdGhlIG5hbWVzcGFjZS4gIFRoZSBEU0RUIGlzIHJlcXVpcmVkLAorCSAqIGJ1dCB0aGUgU1NEVCBhbmQgUFNEVCB0YWJsZXMgYXJlIG9wdGlvbmFsLgorCSAqLworCXN0YXR1cyA9IGFjcGlfbnNfbG9hZF90YWJsZV9ieV90eXBlKEFDUElfVEFCTEVfSURfRFNEVCk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworCX0KKworCS8qIElnbm9yZSBleGNlcHRpb25zIGZyb20gdGhlc2UgKi8KKworCSh2b2lkKWFjcGlfbnNfbG9hZF90YWJsZV9ieV90eXBlKEFDUElfVEFCTEVfSURfU1NEVCk7CisJKHZvaWQpYWNwaV9uc19sb2FkX3RhYmxlX2J5X3R5cGUoQUNQSV9UQUJMRV9JRF9QU0RUKTsKKworCUFDUElfREVCVUdfUFJJTlRfUkFXKChBQ1BJX0RCX0lOSVQsCisJCQkgICAgICAiQUNQSSBOYW1lc3BhY2Ugc3VjY2Vzc2Z1bGx5IGxvYWRlZCBhdCByb290ICVwXG4iLAorCQkJICAgICAgYWNwaV9nYmxfcm9vdF9ub2RlKSk7CisKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKK30KKyNlbmRpZgorCisjaWZkZWYgQUNQSV9GVVRVUkVfSU1QTEVNRU5UQVRJT04KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfbnNfZGVsZXRlX3N1YnRyZWUKKyAqCisgKiBQQVJBTUVURVJTOiAgc3RhcnRfaGFuZGxlICAgICAgICAtIEhhbmRsZSBpbiBuYW1lc3BhY2Ugd2hlcmUgc2VhcmNoIGJlZ2lucworICoKKyAqIFJFVFVSTlMgICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogV2Fsa3MgdGhlIG5hbWVzcGFjZSBzdGFydGluZyBhdCB0aGUgZ2l2ZW4gaGFuZGxlIGFuZCBkZWxldGVzCisgKiAgICAgICAgICAgICAgYWxsIG9iamVjdHMsIGVudHJpZXMsIGFuZCBzY29wZXMgaW4gdGhlIGVudGlyZSBzdWJ0cmVlLgorICoKKyAqICAgICAgICAgICAgICBOYW1lc3BhY2UvSW50ZXJwcmV0ZXIgc2hvdWxkIGJlIGxvY2tlZCBvciB0aGUgc3Vic3lzdGVtIHNob3VsZAorICogICAgICAgICAgICAgIGJlIGluIHNodXRkb3duIGJlZm9yZSB0aGlzIHJvdXRpbmUgaXMgY2FsbGVkLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBhY3BpX3N0YXR1cyBhY3BpX25zX2RlbGV0ZV9zdWJ0cmVlKGFjcGlfaGFuZGxlIHN0YXJ0X2hhbmRsZSkKK3sKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJYWNwaV9oYW5kbGUgY2hpbGRfaGFuZGxlOworCWFjcGlfaGFuZGxlIHBhcmVudF9oYW5kbGU7CisJYWNwaV9oYW5kbGUgbmV4dF9jaGlsZF9oYW5kbGU7CisJYWNwaV9oYW5kbGUgZHVtbXk7CisJdTMyIGxldmVsOworCisJQUNQSV9GVU5DVElPTl9UUkFDRShuc19kZWxldGVfc3VidHJlZSk7CisKKwlwYXJlbnRfaGFuZGxlID0gc3RhcnRfaGFuZGxlOworCWNoaWxkX2hhbmRsZSA9IE5VTEw7CisJbGV2ZWwgPSAxOworCisJLyoKKwkgKiBUcmF2ZXJzZSB0aGUgdHJlZSBvZiBvYmplY3RzIHVudGlsIHdlIGJ1YmJsZSBiYWNrIHVwCisJICogdG8gd2hlcmUgd2Ugc3RhcnRlZC4KKwkgKi8KKwl3aGlsZSAobGV2ZWwgPiAwKSB7CisKKwkJLyogQXR0ZW1wdCB0byBnZXQgdGhlIG5leHQgb2JqZWN0IGluIHRoaXMgc2NvcGUgKi8KKworCQlzdGF0dXMgPSBhY3BpX2dldF9uZXh0X29iamVjdChBQ1BJX1RZUEVfQU5ZLCBwYXJlbnRfaGFuZGxlLAorCQkJCQkgICAgICBjaGlsZF9oYW5kbGUsICZuZXh0X2NoaWxkX2hhbmRsZSk7CisKKwkJY2hpbGRfaGFuZGxlID0gbmV4dF9jaGlsZF9oYW5kbGU7CisKKwkJLyogRGlkIHdlIGdldCBhIG5ldyBvYmplY3Q/ICovCisKKwkJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKSB7CisKKwkJCS8qIENoZWNrIGlmIHRoaXMgb2JqZWN0IGhhcyBhbnkgY2hpbGRyZW4gKi8KKworCQkJaWYgKEFDUElfU1VDQ0VTUworCQkJICAgIChhY3BpX2dldF9uZXh0X29iamVjdAorCQkJICAgICAoQUNQSV9UWVBFX0FOWSwgY2hpbGRfaGFuZGxlLCBOVUxMLCAmZHVtbXkpKSkgeworCQkJCS8qCisJCQkJICogVGhlcmUgaXMgYXQgbGVhc3Qgb25lIGNoaWxkIG9mIHRoaXMgb2JqZWN0LAorCQkJCSAqIHZpc2l0IHRoZSBvYmplY3QKKwkJCQkgKi8KKwkJCQlsZXZlbCsrOworCQkJCXBhcmVudF9oYW5kbGUgPSBjaGlsZF9oYW5kbGU7CisJCQkJY2hpbGRfaGFuZGxlID0gTlVMTDsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8qCisJCQkgKiBObyBtb3JlIGNoaWxkcmVuIGluIHRoaXMgb2JqZWN0LCBnbyBiYWNrIHVwIHRvCisJCQkgKiB0aGUgb2JqZWN0J3MgcGFyZW50CisJCQkgKi8KKwkJCWxldmVsLS07CisKKwkJCS8qIERlbGV0ZSBhbGwgY2hpbGRyZW4gbm93ICovCisKKwkJCWFjcGlfbnNfZGVsZXRlX2NoaWxkcmVuKGNoaWxkX2hhbmRsZSk7CisKKwkJCWNoaWxkX2hhbmRsZSA9IHBhcmVudF9oYW5kbGU7CisJCQlzdGF0dXMgPSBhY3BpX2dldF9wYXJlbnQocGFyZW50X2hhbmRsZSwgJnBhcmVudF9oYW5kbGUpOworCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CisJCQl9CisJCX0KKwl9CisKKwkvKiBOb3cgZGVsZXRlIHRoZSBzdGFydGluZyBvYmplY3QsIGFuZCB3ZSBhcmUgZG9uZSAqLworCisJYWNwaV9uc19kZWxldGVfbm9kZShjaGlsZF9oYW5kbGUpOworCisJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgRlVOQ1RJT046ICAgICAgIGFjcGlfbnNfdW5sb2FkX25hbWVfc3BhY2UKKyAqCisgKiAgUEFSQU1FVEVSUzogICAgIEhhbmRsZSAgICAgICAgICAtIFJvb3Qgb2YgbmFtZXNwYWNlIHN1YnRyZWUgdG8gYmUgZGVsZXRlZAorICoKKyAqICBSRVRVUk46ICAgICAgICAgU3RhdHVzCisgKgorICogIERFU0NSSVBUSU9OOiAgICBTaHJpbmtzIHRoZSBuYW1lc3BhY2UsIHR5cGljYWxseSBpbiByZXNwb25zZSB0byBhbiB1bmRvY2tpbmcKKyAqICAgICAgICAgICAgICAgICAgZXZlbnQuICBEZWxldGVzIGFuIGVudGlyZSBzdWJ0cmVlIHN0YXJ0aW5nIGZyb20gKGFuZAorICogICAgICAgICAgICAgICAgICBpbmNsdWRpbmcpIHRoZSBnaXZlbiBoYW5kbGUuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworYWNwaV9zdGF0dXMgYWNwaV9uc191bmxvYWRfbmFtZXNwYWNlKGFjcGlfaGFuZGxlIGhhbmRsZSkKK3sKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKG5zX3VubG9hZF9uYW1lX3NwYWNlKTsKKworCS8qIFBhcmFtZXRlciB2YWxpZGF0aW9uICovCisKKwlpZiAoIWFjcGlfZ2JsX3Jvb3Rfbm9kZSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9fTkFNRVNQQUNFKTsKKwl9CisKKwlpZiAoIWhhbmRsZSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX1BBUkFNRVRFUik7CisJfQorCisJLyogVGhpcyBmdW5jdGlvbiBkb2VzIHRoZSByZWFsIHdvcmsgKi8KKworCXN0YXR1cyA9IGFjcGlfbnNfZGVsZXRlX3N1YnRyZWUoaGFuZGxlKTsKKworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworfQorI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvbnNuYW1lcy5jIGIvZHJpdmVycy9hY3BpL2FjcGljYS9uc25hbWVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWUzZGMxMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvbnNuYW1lcy5jCkBAIC0wLDAgKzEsMjY1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIE1vZHVsZSBOYW1lOiBuc25hbWVzIC0gTmFtZSBtYW5pcHVsYXRpb24gYW5kIHNlYXJjaAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA4LCBJbnRlbCBDb3JwLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAorICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgYXQgbWluaW11bSBhIGRpc2NsYWltZXIKKyAqICAgIHN1YnN0YW50aWFsbHkgc2ltaWxhciB0byB0aGUgIk5PIFdBUlJBTlRZIiBkaXNjbGFpbWVyIGJlbG93CisgKiAgICAoIkRpc2NsYWltZXIiKSBhbmQgYW55IHJlZGlzdHJpYnV0aW9uIG11c3QgYmUgY29uZGl0aW9uZWQgdXBvbgorICogICAgaW5jbHVkaW5nIGEgc3Vic3RhbnRpYWxseSBzaW1pbGFyIERpc2NsYWltZXIgcmVxdWlyZW1lbnQgZm9yIGZ1cnRoZXIKKyAqICAgIGJpbmFyeSByZWRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcworICogICAgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBOTyBXQVJSQU5UWQorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcKKyAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgorICovCisKKyNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KKyNpbmNsdWRlICJhY2NvbW1vbi5oIgorI2luY2x1ZGUgImFtbGNvZGUuaCIKKyNpbmNsdWRlICJhY25hbWVzcC5oIgorCisjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9OQU1FU1BBQ0UKK0FDUElfTU9EVUxFX05BTUUoIm5zbmFtZXMiKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX25zX2J1aWxkX2V4dGVybmFsX3BhdGgKKyAqCisgKiBQQVJBTUVURVJTOiAgTm9kZSAgICAgICAgICAgIC0gTlMgbm9kZSB3aG9zZSBwYXRobmFtZSBpcyBuZWVkZWQKKyAqICAgICAgICAgICAgICBTaXplICAgICAgICAgICAgLSBTaXplIG9mIHRoZSBwYXRobmFtZQorICogICAgICAgICAgICAgICpuYW1lX2J1ZmZlciAgICAtIFdoZXJlIHRvIHJldHVybiB0aGUgcGF0aG5hbWUKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKiAgICAgICAgICAgICAgUGxhY2VzIHRoZSBwYXRobmFtZSBpbnRvIHRoZSBuYW1lX2J1ZmZlciwgaW4gZXh0ZXJuYWwgZm9ybWF0CisgKiAgICAgICAgICAgICAgKG5hbWUgc2VnbWVudHMgc2VwYXJhdGVkIGJ5IHBhdGggc2VwYXJhdG9ycykKKyAqCisgKiBERVNDUklQVElPTjogR2VuZXJhdGUgYSBmdWxsIHBhdGhhbmFtZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCithY3BpX3N0YXR1cworYWNwaV9uc19idWlsZF9leHRlcm5hbF9wYXRoKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlLAorCQkJICAgIGFjcGlfc2l6ZSBzaXplLCBjaGFyICpuYW1lX2J1ZmZlcikKK3sKKwlhY3BpX3NpemUgaW5kZXg7CisJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKnBhcmVudF9ub2RlOworCisJQUNQSV9GVU5DVElPTl9FTlRSWSgpOworCisJLyogU3BlY2lhbCBjYXNlIGZvciByb290ICovCisKKwlpbmRleCA9IHNpemUgLSAxOworCWlmIChpbmRleCA8IEFDUElfTkFNRV9TSVpFKSB7CisJCW5hbWVfYnVmZmVyWzBdID0gQU1MX1JPT1RfUFJFRklYOworCQluYW1lX2J1ZmZlclsxXSA9IDA7CisJCXJldHVybiAoQUVfT0spOworCX0KKworCS8qIFN0b3JlIHRlcm1pbmF0b3IgYnl0ZSwgdGhlbiBidWlsZCBuYW1lIGJhY2t3YXJkcyAqLworCisJcGFyZW50X25vZGUgPSBub2RlOworCW5hbWVfYnVmZmVyW2luZGV4XSA9IDA7CisKKwl3aGlsZSAoKGluZGV4ID4gQUNQSV9OQU1FX1NJWkUpICYmIChwYXJlbnRfbm9kZSAhPSBhY3BpX2dibF9yb290X25vZGUpKSB7CisJCWluZGV4IC09IEFDUElfTkFNRV9TSVpFOworCisJCS8qIFB1dCB0aGUgbmFtZSBpbnRvIHRoZSBidWZmZXIgKi8KKworCQlBQ1BJX01PVkVfMzJfVE9fMzIoKG5hbWVfYnVmZmVyICsgaW5kZXgpLCAmcGFyZW50X25vZGUtPm5hbWUpOworCQlwYXJlbnRfbm9kZSA9IGFjcGlfbnNfZ2V0X3BhcmVudF9ub2RlKHBhcmVudF9ub2RlKTsKKworCQkvKiBQcmVmaXggbmFtZSB3aXRoIHRoZSBwYXRoIHNlcGFyYXRvciAqLworCisJCWluZGV4LS07CisJCW5hbWVfYnVmZmVyW2luZGV4XSA9IEFDUElfUEFUSF9TRVBBUkFUT1I7CisJfQorCisJLyogT3ZlcndyaXRlIGZpbmFsIHNlcGFyYXRvciB3aXRoIHRoZSByb290IHByZWZpeCBjaGFyYWN0ZXIgKi8KKworCW5hbWVfYnVmZmVyW2luZGV4XSA9IEFNTF9ST09UX1BSRUZJWDsKKworCWlmIChpbmRleCAhPSAwKSB7CisJCUFDUElfRVJST1IoKEFFX0lORk8sCisJCQkgICAgIkNvdWxkIG5vdCBjb25zdHJ1Y3QgZXh0ZXJuYWwgcGF0aG5hbWU7IGluZGV4PSVYLCBzaXplPSVYLCBQYXRoPSVzIiwKKwkJCSAgICAodTMyKSBpbmRleCwgKHUzMikgc2l6ZSwgJm5hbWVfYnVmZmVyW3NpemVdKSk7CisKKwkJcmV0dXJuIChBRV9CQURfUEFSQU1FVEVSKTsKKwl9CisKKwlyZXR1cm4gKEFFX09LKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9uc19nZXRfZXh0ZXJuYWxfcGF0aG5hbWUKKyAqCisgKiBQQVJBTUVURVJTOiAgTm9kZSAgICAgICAgICAgIC0gTmFtZXNwYWNlIG5vZGUgd2hvc2UgcGF0aG5hbWUgaXMgbmVlZGVkCisgKgorICogUkVUVVJOOiAgICAgIFBvaW50ZXIgdG8gc3RvcmFnZSBjb250YWluaW5nIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZgorICogICAgICAgICAgICAgIHRoZSBub2RlLCBJbiBleHRlcm5hbCBmb3JtYXQgKG5hbWUgc2VnbWVudHMgc2VwYXJhdGVkIGJ5IHBhdGgKKyAqICAgICAgICAgICAgICBzZXBhcmF0b3JzLikKKyAqCisgKiBERVNDUklQVElPTjogVXNlZCBmb3IgZGVidWcgcHJpbnRpbmcgaW4gYWNwaV9uc19zZWFyY2hfdGFibGUoKS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitjaGFyICphY3BpX25zX2dldF9leHRlcm5hbF9wYXRobmFtZShzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZSkKK3sKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJY2hhciAqbmFtZV9idWZmZXI7CisJYWNwaV9zaXplIHNpemU7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUihuc19nZXRfZXh0ZXJuYWxfcGF0aG5hbWUsIG5vZGUpOworCisJLyogQ2FsY3VsYXRlIHJlcXVpcmVkIGJ1ZmZlciBzaXplIGJhc2VkIG9uIGRlcHRoIGJlbG93IHJvb3QgKi8KKworCXNpemUgPSBhY3BpX25zX2dldF9wYXRobmFtZV9sZW5ndGgobm9kZSk7CisJaWYgKCFzaXplKSB7CisJCXJldHVybl9QVFIoTlVMTCk7CisJfQorCisJLyogQWxsb2NhdGUgYSBidWZmZXIgdG8gYmUgcmV0dXJuZWQgdG8gY2FsbGVyICovCisKKwluYW1lX2J1ZmZlciA9IEFDUElfQUxMT0NBVEVfWkVST0VEKHNpemUpOworCWlmICghbmFtZV9idWZmZXIpIHsKKwkJQUNQSV9FUlJPUigoQUVfSU5GTywgIkFsbG9jYXRpb24gZmFpbHVyZSIpKTsKKwkJcmV0dXJuX1BUUihOVUxMKTsKKwl9CisKKwkvKiBCdWlsZCB0aGUgcGF0aCBpbiB0aGUgYWxsb2NhdGVkIGJ1ZmZlciAqLworCisJc3RhdHVzID0gYWNwaV9uc19idWlsZF9leHRlcm5hbF9wYXRoKG5vZGUsIHNpemUsIG5hbWVfYnVmZmVyKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJQUNQSV9GUkVFKG5hbWVfYnVmZmVyKTsKKwkJcmV0dXJuX1BUUihOVUxMKTsKKwl9CisKKwlyZXR1cm5fUFRSKG5hbWVfYnVmZmVyKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9uc19nZXRfcGF0aG5hbWVfbGVuZ3RoCisgKgorICogUEFSQU1FVEVSUzogIE5vZGUgICAgICAgIC0gTmFtZXNwYWNlIG5vZGUKKyAqCisgKiBSRVRVUk46ICAgICAgTGVuZ3RoIG9mIHBhdGgsIGluY2x1ZGluZyBwcmVmaXgKKyAqCisgKiBERVNDUklQVElPTjogR2V0IHRoZSBsZW5ndGggb2YgdGhlIHBhdGhuYW1lIHN0cmluZyBmb3IgdGhpcyBub2RlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworYWNwaV9zaXplIGFjcGlfbnNfZ2V0X3BhdGhuYW1lX2xlbmd0aChzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZSkKK3sKKwlhY3BpX3NpemUgc2l6ZTsKKwlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbmV4dF9ub2RlOworCisJQUNQSV9GVU5DVElPTl9FTlRSWSgpOworCisJLyoKKwkgKiBDb21wdXRlIGxlbmd0aCBvZiBwYXRobmFtZSBhcyA1ICogbnVtYmVyIG9mIG5hbWUgc2VnbWVudHMuCisJICogR28gYmFjayB1cCB0aGUgcGFyZW50IHRyZWUgdG8gdGhlIHJvb3QKKwkgKi8KKwlzaXplID0gMDsKKwluZXh0X25vZGUgPSBub2RlOworCisJd2hpbGUgKG5leHRfbm9kZSAmJiAobmV4dF9ub2RlICE9IGFjcGlfZ2JsX3Jvb3Rfbm9kZSkpIHsKKwkJaWYgKEFDUElfR0VUX0RFU0NSSVBUT1JfVFlQRShuZXh0X25vZGUpICE9IEFDUElfREVTQ19UWVBFX05BTUVEKSB7CisJCQlBQ1BJX0VSUk9SKChBRV9JTkZPLAorCQkJCSAgICAiSW52YWxpZCBOYW1lc3BhY2UgTm9kZSAoJXApIHdoaWxlIHRyYXZlcnNpbmcgbmFtZXNwYWNlIiwKKwkJCQkgICAgbmV4dF9ub2RlKSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlzaXplICs9IEFDUElfUEFUSF9TRUdNRU5UX0xFTkdUSDsKKwkJbmV4dF9ub2RlID0gYWNwaV9uc19nZXRfcGFyZW50X25vZGUobmV4dF9ub2RlKTsKKwl9CisKKwlpZiAoIXNpemUpIHsKKwkJc2l6ZSA9IDE7CS8qIFJvb3Qgbm9kZSBjYXNlICovCisJfQorCisJcmV0dXJuIChzaXplICsgMSk7CS8qICsxIGZvciBudWxsIHN0cmluZyB0ZXJtaW5hdG9yICovCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfbnNfaGFuZGxlX3RvX3BhdGhuYW1lCisgKgorICogUEFSQU1FVEVSUzogIHRhcmdldF9oYW5kbGUgICAgICAgICAgIC0gSGFuZGxlIG9mIG5hbWVkIG9iamVjdCB3aG9zZSBuYW1lIGlzCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBiZSBmb3VuZAorICogICAgICAgICAgICAgIEJ1ZmZlciAgICAgICAgICAgICAgICAgIC0gV2hlcmUgdGhlIHBhdGhuYW1lIGlzIHJldHVybmVkCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cywgQnVmZmVyIGlzIGZpbGxlZCB3aXRoIHBhdGhuYW1lIGlmIHN0YXR1cyBpcyBBRV9PSworICoKKyAqIERFU0NSSVBUSU9OOiBCdWlsZCBhbmQgcmV0dXJuIGEgZnVsbCBuYW1lc3BhY2UgcGF0aG5hbWUKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCithY3BpX3N0YXR1cworYWNwaV9uc19oYW5kbGVfdG9fcGF0aG5hbWUoYWNwaV9oYW5kbGUgdGFyZ2V0X2hhbmRsZSwKKwkJCSAgIHN0cnVjdCBhY3BpX2J1ZmZlciAqIGJ1ZmZlcikKK3sKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGU7CisJYWNwaV9zaXplIHJlcXVpcmVkX3NpemU7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUihuc19oYW5kbGVfdG9fcGF0aG5hbWUsIHRhcmdldF9oYW5kbGUpOworCisJbm9kZSA9IGFjcGlfbnNfbWFwX2hhbmRsZV90b19ub2RlKHRhcmdldF9oYW5kbGUpOworCWlmICghbm9kZSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX1BBUkFNRVRFUik7CisJfQorCisJLyogRGV0ZXJtaW5lIHNpemUgcmVxdWlyZWQgZm9yIHRoZSBjYWxsZXIgYnVmZmVyICovCisKKwlyZXF1aXJlZF9zaXplID0gYWNwaV9uc19nZXRfcGF0aG5hbWVfbGVuZ3RoKG5vZGUpOworCWlmICghcmVxdWlyZWRfc2l6ZSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX1BBUkFNRVRFUik7CisJfQorCisJLyogVmFsaWRhdGUvQWxsb2NhdGUvQ2xlYXIgY2FsbGVyIGJ1ZmZlciAqLworCisJc3RhdHVzID0gYWNwaV91dF9pbml0aWFsaXplX2J1ZmZlcihidWZmZXIsIHJlcXVpcmVkX3NpemUpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKKwl9CisKKwkvKiBCdWlsZCB0aGUgcGF0aCBpbiB0aGUgY2FsbGVyIGJ1ZmZlciAqLworCisJc3RhdHVzID0KKwkgICAgYWNwaV9uc19idWlsZF9leHRlcm5hbF9wYXRoKG5vZGUsIHJlcXVpcmVkX3NpemUsIGJ1ZmZlci0+cG9pbnRlcik7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworCX0KKworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVhFQywgIiVzIFslWF1cbiIsCisJCQkgIChjaGFyICopYnVmZmVyLT5wb2ludGVyLCAodTMyKSByZXF1aXJlZF9zaXplKSk7CisJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvbnNvYmplY3QuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvbnNvYmplY3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOGE5N2E1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS9uc29iamVjdC5jCkBAIC0wLDAgKzEsNDQxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIE1vZHVsZSBOYW1lOiBuc29iamVjdCAtIFV0aWxpdGllcyBmb3Igb2JqZWN0cyBhdHRhY2hlZCB0byBuYW1lc3BhY2UKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlIGVudHJpZXMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwOCwgSW50ZWwgQ29ycC4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKKyAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIGF0IG1pbmltdW0gYSBkaXNjbGFpbWVyCisgKiAgICBzdWJzdGFudGlhbGx5IHNpbWlsYXIgdG8gdGhlICJOTyBXQVJSQU5UWSIgZGlzY2xhaW1lciBiZWxvdworICogICAgKCJEaXNjbGFpbWVyIikgYW5kIGFueSByZWRpc3RyaWJ1dGlvbiBtdXN0IGJlIGNvbmRpdGlvbmVkIHVwb24KKyAqICAgIGluY2x1ZGluZyBhIHN1YnN0YW50aWFsbHkgc2ltaWxhciBEaXNjbGFpbWVyIHJlcXVpcmVtZW50IGZvciBmdXJ0aGVyCisgKiAgICBiaW5hcnkgcmVkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMKKyAqICAgIG9mIGFueSBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogTk8gV0FSUkFOVFkKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HCisgKiBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KKyAqLworCisjaW5jbHVkZSA8YWNwaS9hY3BpLmg+CisjaW5jbHVkZSAiYWNjb21tb24uaCIKKyNpbmNsdWRlICJhY25hbWVzcC5oIgorCisjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9OQU1FU1BBQ0UKK0FDUElfTU9EVUxFX05BTUUoIm5zb2JqZWN0IikKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9uc19hdHRhY2hfb2JqZWN0CisgKgorICogUEFSQU1FVEVSUzogIE5vZGUgICAgICAgICAgICAgICAgLSBQYXJlbnQgTm9kZQorICogICAgICAgICAgICAgIE9iamVjdCAgICAgICAgICAgICAgLSBPYmplY3QgdG8gYmUgYXR0YWNoZWQKKyAqICAgICAgICAgICAgICBUeXBlICAgICAgICAgICAgICAgIC0gVHlwZSBvZiBvYmplY3QsIG9yIEFDUElfVFlQRV9BTlkgaWYgbm90CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtub3duCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBSZWNvcmQgdGhlIGdpdmVuIG9iamVjdCBhcyB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZQorICogICAgICAgICAgICAgIG5hbWUgd2hvc2UgYWNwaV9oYW5kbGUgaXMgcGFzc2VkLiAgSWYgT2JqZWN0IGlzIE5VTEwKKyAqICAgICAgICAgICAgICBhbmQgVHlwZSBpcyBBQ1BJX1RZUEVfQU5ZLCBzZXQgdGhlIG5hbWUgYXMgaGF2aW5nIG5vIHZhbHVlLgorICogICAgICAgICAgICAgIE5vdGU6IEZ1dHVyZSBtYXkgcmVxdWlyZSB0aGF0IHRoZSBOb2RlLT5GbGFncyBmaWVsZCBiZSBwYXNzZWQKKyAqICAgICAgICAgICAgICBhcyBhIHBhcmFtZXRlci4KKyAqCisgKiBNVVRFWDogICAgICAgQXNzdW1lcyBuYW1lc3BhY2UgaXMgbG9ja2VkCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2FjcGlfc3RhdHVzCithY3BpX25zX2F0dGFjaF9vYmplY3Qoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGUsCisJCSAgICAgIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9iamVjdCwgYWNwaV9vYmplY3RfdHlwZSB0eXBlKQoreworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjOworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKmxhc3Rfb2JqX2Rlc2M7CisJYWNwaV9vYmplY3RfdHlwZSBvYmplY3RfdHlwZSA9IEFDUElfVFlQRV9BTlk7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKG5zX2F0dGFjaF9vYmplY3QpOworCisJLyoKKwkgKiBQYXJhbWV0ZXIgdmFsaWRhdGlvbgorCSAqLworCWlmICghbm9kZSkgeworCisJCS8qIEludmFsaWQgaGFuZGxlICovCisKKwkJQUNQSV9FUlJPUigoQUVfSU5GTywgIk51bGwgTmFtZWRPYmogaGFuZGxlIikpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX1BBUkFNRVRFUik7CisJfQorCisJaWYgKCFvYmplY3QgJiYgKEFDUElfVFlQRV9BTlkgIT0gdHlwZSkpIHsKKworCQkvKiBOdWxsIG9iamVjdCAqLworCisJCUFDUElfRVJST1IoKEFFX0lORk8sCisJCQkgICAgIk51bGwgb2JqZWN0LCBidXQgdHlwZSBub3QgQUNQSV9UWVBFX0FOWSIpKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9QQVJBTUVURVIpOworCX0KKworCWlmIChBQ1BJX0dFVF9ERVNDUklQVE9SX1RZUEUobm9kZSkgIT0gQUNQSV9ERVNDX1RZUEVfTkFNRUQpIHsKKworCQkvKiBOb3QgYSBuYW1lIGhhbmRsZSAqLworCisJCUFDUElfRVJST1IoKEFFX0lORk8sICJJbnZhbGlkIGhhbmRsZSAlcCBbJXNdIiwKKwkJCSAgICBub2RlLCBhY3BpX3V0X2dldF9kZXNjcmlwdG9yX25hbWUobm9kZSkpKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9QQVJBTUVURVIpOworCX0KKworCS8qIENoZWNrIGlmIHRoaXMgb2JqZWN0IGlzIGFscmVhZHkgYXR0YWNoZWQgKi8KKworCWlmIChub2RlLT5vYmplY3QgPT0gb2JqZWN0KSB7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVhFQywKKwkJCQkgICJPYmogJXAgYWxyZWFkeSBpbnN0YWxsZWQgaW4gTmFtZU9iaiAlcFxuIiwKKwkJCQkgIG9iamVjdCwgbm9kZSkpOworCisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CisJfQorCisJLyogSWYgbnVsbCBvYmplY3QsIHdlIHdpbGwganVzdCBpbnN0YWxsIGl0ICovCisKKwlpZiAoIW9iamVjdCkgeworCQlvYmpfZGVzYyA9IE5VTEw7CisJCW9iamVjdF90eXBlID0gQUNQSV9UWVBFX0FOWTsKKwl9CisKKwkvKgorCSAqIElmIHRoZSBzb3VyY2Ugb2JqZWN0IGlzIGEgbmFtZXNwYWNlIE5vZGUgd2l0aCBhbiBhdHRhY2hlZCBvYmplY3QsCisJICogd2Ugd2lsbCB1c2UgdGhhdCAoYXR0YWNoZWQpIG9iamVjdAorCSAqLworCWVsc2UgaWYgKChBQ1BJX0dFVF9ERVNDUklQVE9SX1RZUEUob2JqZWN0KSA9PSBBQ1BJX0RFU0NfVFlQRV9OQU1FRCkgJiYKKwkJICgoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKilvYmplY3QpLT5vYmplY3QpIHsKKwkJLyoKKwkJICogVmFsdWUgcGFzc2VkIGlzIGEgbmFtZSBoYW5kbGUgYW5kIHRoYXQgbmFtZSBoYXMgYQorCQkgKiBub24tbnVsbCB2YWx1ZS4gIFVzZSB0aGF0IG5hbWUncyB2YWx1ZSBhbmQgdHlwZS4KKwkJICovCisJCW9ial9kZXNjID0gKChzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqKW9iamVjdCktPm9iamVjdDsKKwkJb2JqZWN0X3R5cGUgPSAoKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICopb2JqZWN0KS0+dHlwZTsKKwl9CisKKwkvKgorCSAqIE90aGVyd2lzZSwgd2Ugd2lsbCB1c2UgdGhlIHBhcmFtZXRlciBvYmplY3QsIGJ1dCB3ZSBtdXN0IHR5cGUKKwkgKiBpdCBmaXJzdAorCSAqLworCWVsc2UgeworCQlvYmpfZGVzYyA9ICh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICopb2JqZWN0OworCisJCS8qIFVzZSB0aGUgZ2l2ZW4gdHlwZSAqLworCisJCW9iamVjdF90eXBlID0gdHlwZTsKKwl9CisKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VYRUMsICJJbnN0YWxsaW5nICVwIGludG8gTm9kZSAlcCBbJTQuNHNdXG4iLAorCQkJICBvYmpfZGVzYywgbm9kZSwgYWNwaV91dF9nZXRfbm9kZV9uYW1lKG5vZGUpKSk7CisKKwkvKiBEZXRhY2ggYW4gZXhpc3RpbmcgYXR0YWNoZWQgb2JqZWN0IGlmIHByZXNlbnQgKi8KKworCWlmIChub2RlLT5vYmplY3QpIHsKKwkJYWNwaV9uc19kZXRhY2hfb2JqZWN0KG5vZGUpOworCX0KKworCWlmIChvYmpfZGVzYykgeworCQkvKgorCQkgKiBNdXN0IGluY3JlbWVudCB0aGUgbmV3IHZhbHVlJ3MgcmVmZXJlbmNlIGNvdW50CisJCSAqIChpZiBpdCBpcyBhbiBpbnRlcm5hbCBvYmplY3QpCisJCSAqLworCQlhY3BpX3V0X2FkZF9yZWZlcmVuY2Uob2JqX2Rlc2MpOworCisJCS8qCisJCSAqIEhhbmRsZSBvYmplY3RzIHdpdGggbXVsdGlwbGUgZGVzY3JpcHRvcnMgLSB3YWxrCisJCSAqIHRvIHRoZSBlbmQgb2YgdGhlIGRlc2NyaXB0b3IgbGlzdAorCQkgKi8KKwkJbGFzdF9vYmpfZGVzYyA9IG9ial9kZXNjOworCQl3aGlsZSAobGFzdF9vYmpfZGVzYy0+Y29tbW9uLm5leHRfb2JqZWN0KSB7CisJCQlsYXN0X29ial9kZXNjID0gbGFzdF9vYmpfZGVzYy0+Y29tbW9uLm5leHRfb2JqZWN0OworCQl9CisKKwkJLyogSW5zdGFsbCB0aGUgb2JqZWN0IGF0IHRoZSBmcm9udCBvZiB0aGUgb2JqZWN0IGxpc3QgKi8KKworCQlsYXN0X29ial9kZXNjLT5jb21tb24ubmV4dF9vYmplY3QgPSBub2RlLT5vYmplY3Q7CisJfQorCisJbm9kZS0+dHlwZSA9ICh1OCkgb2JqZWN0X3R5cGU7CisJbm9kZS0+b2JqZWN0ID0gb2JqX2Rlc2M7CisKKwlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX25zX2RldGFjaF9vYmplY3QKKyAqCisgKiBQQVJBTUVURVJTOiAgTm9kZSAgICAgICAgICAgLSBBIE5hbWVzcGFjZSBub2RlIHdob3NlIG9iamVjdCB3aWxsIGJlIGRldGFjaGVkCisgKgorICogUkVUVVJOOiAgICAgIE5vbmUuCisgKgorICogREVTQ1JJUFRJT046IERldGFjaC9kZWxldGUgYW4gb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCBhIG5hbWVzcGFjZSBub2RlLgorICogICAgICAgICAgICAgIGlmIHRoZSBvYmplY3QgaXMgYW4gYWxsb2NhdGVkIG9iamVjdCwgaXQgaXMgZnJlZWQuCisgKiAgICAgICAgICAgICAgT3RoZXJ3aXNlLCB0aGUgZmllbGQgaXMgc2ltcGx5IGNsZWFyZWQuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBhY3BpX25zX2RldGFjaF9vYmplY3Qoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGUpCit7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2M7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKG5zX2RldGFjaF9vYmplY3QpOworCisJb2JqX2Rlc2MgPSBub2RlLT5vYmplY3Q7CisKKwlpZiAoIW9ial9kZXNjIHx8CisJICAgIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRShvYmpfZGVzYykgPT0gQUNQSV9UWVBFX0xPQ0FMX0RBVEEpKSB7CisJCXJldHVybl9WT0lEOworCX0KKworCS8qIENsZWFyIHRoZSBlbnRyeSBpbiBhbGwgY2FzZXMgKi8KKworCW5vZGUtPm9iamVjdCA9IE5VTEw7CisJaWYgKEFDUElfR0VUX0RFU0NSSVBUT1JfVFlQRShvYmpfZGVzYykgPT0gQUNQSV9ERVNDX1RZUEVfT1BFUkFORCkgeworCQlub2RlLT5vYmplY3QgPSBvYmpfZGVzYy0+Y29tbW9uLm5leHRfb2JqZWN0OworCQlpZiAobm9kZS0+b2JqZWN0ICYmCisJCSAgICAoQUNQSV9HRVRfT0JKRUNUX1RZUEUobm9kZS0+b2JqZWN0KSAhPQorCQkgICAgIEFDUElfVFlQRV9MT0NBTF9EQVRBKSkgeworCQkJbm9kZS0+b2JqZWN0ID0gbm9kZS0+b2JqZWN0LT5jb21tb24ubmV4dF9vYmplY3Q7CisJCX0KKwl9CisKKwkvKiBSZXNldCB0aGUgbm9kZSB0eXBlIHRvIHVudHlwZWQgKi8KKworCW5vZGUtPnR5cGUgPSBBQ1BJX1RZUEVfQU5ZOworCisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9OQU1FUywgIk5vZGUgJXAgWyU0LjRzXSBPYmplY3QgJXBcbiIsCisJCQkgIG5vZGUsIGFjcGlfdXRfZ2V0X25vZGVfbmFtZShub2RlKSwgb2JqX2Rlc2MpKTsKKworCS8qIFJlbW92ZSBvbmUgcmVmZXJlbmNlIG9uIHRoZSBvYmplY3QgKGFuZCBhbGwgc3Vib2JqZWN0cykgKi8KKworCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZShvYmpfZGVzYyk7CisJcmV0dXJuX1ZPSUQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfbnNfZ2V0X2F0dGFjaGVkX29iamVjdAorICoKKyAqIFBBUkFNRVRFUlM6ICBOb2RlICAgICAgICAgICAgIC0gTmFtZXNwYWNlIG5vZGUKKyAqCisgKiBSRVRVUk46ICAgICAgQ3VycmVudCB2YWx1ZSBvZiB0aGUgb2JqZWN0IGZpZWxkIGZyb20gdGhlIE5vZGUgd2hvc2UKKyAqICAgICAgICAgICAgICBoYW5kbGUgaXMgcGFzc2VkCisgKgorICogREVTQ1JJUFRJT046IE9idGFpbiB0aGUgb2JqZWN0IGF0dGFjaGVkIHRvIGEgbmFtZXNwYWNlIG5vZGUuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0KHN0cnVjdAorCQkJCQkJICAgICAgIGFjcGlfbmFtZXNwYWNlX25vZGUKKwkJCQkJCSAgICAgICAqbm9kZSkKK3sKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUihuc19nZXRfYXR0YWNoZWRfb2JqZWN0LCBub2RlKTsKKworCWlmICghbm9kZSkgeworCQlBQ1BJX1dBUk5JTkcoKEFFX0lORk8sICJOdWxsIE5vZGUgcHRyIikpOworCQlyZXR1cm5fUFRSKE5VTEwpOworCX0KKworCWlmICghbm9kZS0+b2JqZWN0IHx8CisJICAgICgoQUNQSV9HRVRfREVTQ1JJUFRPUl9UWVBFKG5vZGUtPm9iamVjdCkgIT0gQUNQSV9ERVNDX1RZUEVfT1BFUkFORCkKKwkgICAgICYmIChBQ1BJX0dFVF9ERVNDUklQVE9SX1RZUEUobm9kZS0+b2JqZWN0KSAhPQorCQkgQUNQSV9ERVNDX1RZUEVfTkFNRUQpKQorCSAgICB8fCAoQUNQSV9HRVRfT0JKRUNUX1RZUEUobm9kZS0+b2JqZWN0KSA9PSBBQ1BJX1RZUEVfTE9DQUxfREFUQSkpIHsKKwkJcmV0dXJuX1BUUihOVUxMKTsKKwl9CisKKwlyZXR1cm5fUFRSKG5vZGUtPm9iamVjdCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfbnNfZ2V0X3NlY29uZGFyeV9vYmplY3QKKyAqCisgKiBQQVJBTUVURVJTOiAgTm9kZSAgICAgICAgICAgICAtIE5hbWVzcGFjZSBub2RlCisgKgorICogUkVUVVJOOiAgICAgIEN1cnJlbnQgdmFsdWUgb2YgdGhlIG9iamVjdCBmaWVsZCBmcm9tIHRoZSBOb2RlIHdob3NlCisgKiAgICAgICAgICAgICAgaGFuZGxlIGlzIHBhc3NlZC4KKyAqCisgKiBERVNDUklQVElPTjogT2J0YWluIGEgc2Vjb25kYXJ5IG9iamVjdCBhc3NvY2lhdGVkIHdpdGggYSBuYW1lc3BhY2Ugbm9kZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICphY3BpX25zX2dldF9zZWNvbmRhcnlfb2JqZWN0KHVuaW9uCisJCQkJCQkJYWNwaV9vcGVyYW5kX29iamVjdAorCQkJCQkJCSpvYmpfZGVzYykKK3sKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUihuc19nZXRfc2Vjb25kYXJ5X29iamVjdCwgb2JqX2Rlc2MpOworCisJaWYgKCghb2JqX2Rlc2MpIHx8CisJICAgIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRShvYmpfZGVzYykgPT0gQUNQSV9UWVBFX0xPQ0FMX0RBVEEpIHx8CisJICAgICghb2JqX2Rlc2MtPmNvbW1vbi5uZXh0X29iamVjdCkgfHwKKwkgICAgKEFDUElfR0VUX09CSkVDVF9UWVBFKG9ial9kZXNjLT5jb21tb24ubmV4dF9vYmplY3QpID09CisJICAgICBBQ1BJX1RZUEVfTE9DQUxfREFUQSkpIHsKKwkJcmV0dXJuX1BUUihOVUxMKTsKKwl9CisKKwlyZXR1cm5fUFRSKG9ial9kZXNjLT5jb21tb24ubmV4dF9vYmplY3QpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX25zX2F0dGFjaF9kYXRhCisgKgorICogUEFSQU1FVEVSUzogIE5vZGUgICAgICAgICAgICAtIE5hbWVzcGFjZSBub2RlCisgKiAgICAgICAgICAgICAgSGFuZGxlciAgICAgICAgIC0gSGFuZGxlciB0byBiZSBhc3NvY2lhdGVkIHdpdGggdGhlIGRhdGEKKyAqICAgICAgICAgICAgICBEYXRhICAgICAgICAgICAgLSBEYXRhIHRvIGJlIGF0dGFjaGVkCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBMb3ctbGV2ZWwgYXR0YWNoIGRhdGEuICBDcmVhdGUgYW5kIGF0dGFjaCBhIERhdGEgb2JqZWN0LgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2FjcGlfc3RhdHVzCithY3BpX25zX2F0dGFjaF9kYXRhKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlLAorCQkgICAgYWNwaV9vYmplY3RfaGFuZGxlciBoYW5kbGVyLCB2b2lkICpkYXRhKQoreworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnByZXZfb2JqX2Rlc2M7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2M7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqZGF0YV9kZXNjOworCisJLyogV2Ugb25seSBhbGxvdyBvbmUgYXR0YWNobWVudCBwZXIgaGFuZGxlciAqLworCisJcHJldl9vYmpfZGVzYyA9IE5VTEw7CisJb2JqX2Rlc2MgPSBub2RlLT5vYmplY3Q7CisJd2hpbGUgKG9ial9kZXNjKSB7CisJCWlmICgoQUNQSV9HRVRfT0JKRUNUX1RZUEUob2JqX2Rlc2MpID09IEFDUElfVFlQRV9MT0NBTF9EQVRBKSAmJgorCQkgICAgKG9ial9kZXNjLT5kYXRhLmhhbmRsZXIgPT0gaGFuZGxlcikpIHsKKwkJCXJldHVybiAoQUVfQUxSRUFEWV9FWElTVFMpOworCQl9CisKKwkJcHJldl9vYmpfZGVzYyA9IG9ial9kZXNjOworCQlvYmpfZGVzYyA9IG9ial9kZXNjLT5jb21tb24ubmV4dF9vYmplY3Q7CisJfQorCisJLyogQ3JlYXRlIGFuIGludGVybmFsIG9iamVjdCBmb3IgdGhlIGRhdGEgKi8KKworCWRhdGFfZGVzYyA9IGFjcGlfdXRfY3JlYXRlX2ludGVybmFsX29iamVjdChBQ1BJX1RZUEVfTE9DQUxfREFUQSk7CisJaWYgKCFkYXRhX2Rlc2MpIHsKKwkJcmV0dXJuIChBRV9OT19NRU1PUlkpOworCX0KKworCWRhdGFfZGVzYy0+ZGF0YS5oYW5kbGVyID0gaGFuZGxlcjsKKwlkYXRhX2Rlc2MtPmRhdGEucG9pbnRlciA9IGRhdGE7CisKKwkvKiBJbnN0YWxsIHRoZSBkYXRhIG9iamVjdCAqLworCisJaWYgKHByZXZfb2JqX2Rlc2MpIHsKKwkJcHJldl9vYmpfZGVzYy0+Y29tbW9uLm5leHRfb2JqZWN0ID0gZGF0YV9kZXNjOworCX0gZWxzZSB7CisJCW5vZGUtPm9iamVjdCA9IGRhdGFfZGVzYzsKKwl9CisKKwlyZXR1cm4gKEFFX09LKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9uc19kZXRhY2hfZGF0YQorICoKKyAqIFBBUkFNRVRFUlM6ICBOb2RlICAgICAgICAgICAgLSBOYW1lc3BhY2Ugbm9kZQorICogICAgICAgICAgICAgIEhhbmRsZXIgICAgICAgICAtIEhhbmRsZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBkYXRhCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBMb3ctbGV2ZWwgZGV0YWNoIGRhdGEuICBEZWxldGUgdGhlIGRhdGEgbm9kZSwgYnV0IHRoZSBjYWxsZXIKKyAqICAgICAgICAgICAgICBpcyByZXNwb25zaWJsZSBmb3IgdGhlIGFjdHVhbCBkYXRhLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2FjcGlfc3RhdHVzCithY3BpX25zX2RldGFjaF9kYXRhKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICogbm9kZSwKKwkJICAgIGFjcGlfb2JqZWN0X2hhbmRsZXIgaGFuZGxlcikKK3sKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYzsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpwcmV2X29ial9kZXNjOworCisJcHJldl9vYmpfZGVzYyA9IE5VTEw7CisJb2JqX2Rlc2MgPSBub2RlLT5vYmplY3Q7CisJd2hpbGUgKG9ial9kZXNjKSB7CisJCWlmICgoQUNQSV9HRVRfT0JKRUNUX1RZUEUob2JqX2Rlc2MpID09IEFDUElfVFlQRV9MT0NBTF9EQVRBKSAmJgorCQkgICAgKG9ial9kZXNjLT5kYXRhLmhhbmRsZXIgPT0gaGFuZGxlcikpIHsKKwkJCWlmIChwcmV2X29ial9kZXNjKSB7CisJCQkJcHJldl9vYmpfZGVzYy0+Y29tbW9uLm5leHRfb2JqZWN0ID0KKwkJCQkgICAgb2JqX2Rlc2MtPmNvbW1vbi5uZXh0X29iamVjdDsKKwkJCX0gZWxzZSB7CisJCQkJbm9kZS0+b2JqZWN0ID0gb2JqX2Rlc2MtPmNvbW1vbi5uZXh0X29iamVjdDsKKwkJCX0KKworCQkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKG9ial9kZXNjKTsKKwkJCXJldHVybiAoQUVfT0spOworCQl9CisKKwkJcHJldl9vYmpfZGVzYyA9IG9ial9kZXNjOworCQlvYmpfZGVzYyA9IG9ial9kZXNjLT5jb21tb24ubmV4dF9vYmplY3Q7CisJfQorCisJcmV0dXJuIChBRV9OT1RfRk9VTkQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX25zX2dldF9hdHRhY2hlZF9kYXRhCisgKgorICogUEFSQU1FVEVSUzogIE5vZGUgICAgICAgICAgICAtIE5hbWVzcGFjZSBub2RlCisgKiAgICAgICAgICAgICAgSGFuZGxlciAgICAgICAgIC0gSGFuZGxlciBhc3NvY2lhdGVkIHdpdGggdGhlIGRhdGEKKyAqICAgICAgICAgICAgICBEYXRhICAgICAgICAgICAgLSBXaGVyZSB0aGUgZGF0YSBpcyByZXR1cm5lZAorICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogTG93IGxldmVsIGludGVyZmFjZSB0byBvYnRhaW4gZGF0YSBwcmV2aW91c2x5IGFzc29jaWF0ZWQgd2l0aAorICogICAgICAgICAgICAgIGEgbmFtZXNwYWNlIG5vZGUuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworYWNwaV9zdGF0dXMKK2FjcGlfbnNfZ2V0X2F0dGFjaGVkX2RhdGEoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKiBub2RlLAorCQkJICBhY3BpX29iamVjdF9oYW5kbGVyIGhhbmRsZXIsIHZvaWQgKipkYXRhKQoreworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjOworCisJb2JqX2Rlc2MgPSBub2RlLT5vYmplY3Q7CisJd2hpbGUgKG9ial9kZXNjKSB7CisJCWlmICgoQUNQSV9HRVRfT0JKRUNUX1RZUEUob2JqX2Rlc2MpID09IEFDUElfVFlQRV9MT0NBTF9EQVRBKSAmJgorCQkgICAgKG9ial9kZXNjLT5kYXRhLmhhbmRsZXIgPT0gaGFuZGxlcikpIHsKKwkJCSpkYXRhID0gb2JqX2Rlc2MtPmRhdGEucG9pbnRlcjsKKwkJCXJldHVybiAoQUVfT0spOworCQl9CisKKwkJb2JqX2Rlc2MgPSBvYmpfZGVzYy0+Y29tbW9uLm5leHRfb2JqZWN0OworCX0KKworCXJldHVybiAoQUVfTk9UX0ZPVU5EKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvbnNwYXJzZS5jIGIvZHJpdmVycy9hY3BpL2FjcGljYS9uc3BhcnNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjllOGQwMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvbnNwYXJzZS5jCkBAIC0wLDAgKzEsMjA0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogTW9kdWxlIE5hbWU6IG5zcGFyc2UgLSBuYW1lc3BhY2UgaW50ZXJmYWNlIHRvIEFNTCBwYXJzZXIKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA4LCBJbnRlbCBDb3JwLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAorICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgYXQgbWluaW11bSBhIGRpc2NsYWltZXIKKyAqICAgIHN1YnN0YW50aWFsbHkgc2ltaWxhciB0byB0aGUgIk5PIFdBUlJBTlRZIiBkaXNjbGFpbWVyIGJlbG93CisgKiAgICAoIkRpc2NsYWltZXIiKSBhbmQgYW55IHJlZGlzdHJpYnV0aW9uIG11c3QgYmUgY29uZGl0aW9uZWQgdXBvbgorICogICAgaW5jbHVkaW5nIGEgc3Vic3RhbnRpYWxseSBzaW1pbGFyIERpc2NsYWltZXIgcmVxdWlyZW1lbnQgZm9yIGZ1cnRoZXIKKyAqICAgIGJpbmFyeSByZWRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcworICogICAgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBOTyBXQVJSQU5UWQorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcKKyAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgorICovCisKKyNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KKyNpbmNsdWRlICJhY2NvbW1vbi5oIgorI2luY2x1ZGUgImFjbmFtZXNwLmgiCisjaW5jbHVkZSAiYWNwYXJzZXIuaCIKKyNpbmNsdWRlICJhY2Rpc3BhdC5oIgorI2luY2x1ZGUgImFjdGFibGVzLmgiCisKKyNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX05BTUVTUEFDRQorQUNQSV9NT0RVTEVfTkFNRSgibnNwYXJzZSIpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIG5zX29uZV9jb21wbGV0ZV9wYXJzZQorICoKKyAqIFBBUkFNRVRFUlM6ICBwYXNzX251bWJlciAgICAgICAgICAgICAtIDEgb3IgMgorICogICAgICAgICAgICAgIHRhYmxlX2Rlc2MgICAgICAgICAgICAgIC0gVGhlIHRhYmxlIHRvIGJlIHBhcnNlZC4KKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IFBlcmZvcm0gb25lIGNvbXBsZXRlIHBhcnNlIG9mIGFuIEFDUEkvQU1MIHRhYmxlLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCithY3BpX3N0YXR1cworYWNwaV9uc19vbmVfY29tcGxldGVfcGFyc2UodTMyIHBhc3NfbnVtYmVyLAorCQkJICAgdTMyIHRhYmxlX2luZGV4LAorCQkJICAgc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKnN0YXJ0X25vZGUpCit7CisJdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKnBhcnNlX3Jvb3Q7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworICAgICAgIHUzMiBhbWxfbGVuZ3RoOworCXU4ICphbWxfc3RhcnQ7CisJc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZTsKKwlzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKnRhYmxlOworCWFjcGlfb3duZXJfaWQgb3duZXJfaWQ7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKG5zX29uZV9jb21wbGV0ZV9wYXJzZSk7CisKKwlzdGF0dXMgPSBhY3BpX3RiX2dldF9vd25lcl9pZCh0YWJsZV9pbmRleCwgJm93bmVyX2lkKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CisJfQorCisJLyogQ3JlYXRlIGFuZCBpbml0IGEgUm9vdCBOb2RlICovCisKKwlwYXJzZV9yb290ID0gYWNwaV9wc19jcmVhdGVfc2NvcGVfb3AoKTsKKwlpZiAoIXBhcnNlX3Jvb3QpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX01FTU9SWSk7CisJfQorCisJLyogQ3JlYXRlIGFuZCBpbml0aWFsaXplIGEgbmV3IHdhbGsgc3RhdGUgKi8KKworCXdhbGtfc3RhdGUgPSBhY3BpX2RzX2NyZWF0ZV93YWxrX3N0YXRlKG93bmVyX2lkLCBOVUxMLCBOVUxMLCBOVUxMKTsKKwlpZiAoIXdhbGtfc3RhdGUpIHsKKwkJYWNwaV9wc19mcmVlX29wKHBhcnNlX3Jvb3QpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9fTUVNT1JZKTsKKwl9CisKKwlzdGF0dXMgPSBhY3BpX2dldF90YWJsZV9ieV9pbmRleCh0YWJsZV9pbmRleCwgJnRhYmxlKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJYWNwaV9kc19kZWxldGVfd2Fsa19zdGF0ZSh3YWxrX3N0YXRlKTsKKwkJYWNwaV9wc19mcmVlX29wKHBhcnNlX3Jvb3QpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKKwl9CisKKwkvKiBUYWJsZSBtdXN0IGNvbnNpc3Qgb2YgYXQgbGVhc3QgYSBjb21wbGV0ZSBoZWFkZXIgKi8KKworCWlmICh0YWJsZS0+bGVuZ3RoIDwgc2l6ZW9mKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlcikpIHsKKwkJc3RhdHVzID0gQUVfQkFEX0hFQURFUjsKKwl9IGVsc2UgeworCQlhbWxfc3RhcnQgPSAodTggKikgdGFibGUgKyBzaXplb2Yoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyKTsKKwkJYW1sX2xlbmd0aCA9IHRhYmxlLT5sZW5ndGggLSBzaXplb2Yoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyKTsKKwkJc3RhdHVzID0gYWNwaV9kc19pbml0X2FtbF93YWxrKHdhbGtfc3RhdGUsIHBhcnNlX3Jvb3QsIE5VTEwsCisJCQkJCSAgICAgICBhbWxfc3RhcnQsIGFtbF9sZW5ndGgsIE5VTEwsCisJCQkJCSAgICAgICAodTgpIHBhc3NfbnVtYmVyKTsKKwl9CisKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJYWNwaV9kc19kZWxldGVfd2Fsa19zdGF0ZSh3YWxrX3N0YXRlKTsKKwkJZ290byBjbGVhbnVwOworCX0KKworCS8qIHN0YXJ0X25vZGUgaXMgdGhlIGRlZmF1bHQgbG9jYXRpb24gdG8gbG9hZCB0aGUgdGFibGUgKi8KKworCWlmIChzdGFydF9ub2RlICYmIHN0YXJ0X25vZGUgIT0gYWNwaV9nYmxfcm9vdF9ub2RlKSB7CisJCXN0YXR1cyA9CisJCSAgICBhY3BpX2RzX3Njb3BlX3N0YWNrX3B1c2goc3RhcnRfbm9kZSwgQUNQSV9UWVBFX01FVEhPRCwKKwkJCQkJICAgICB3YWxrX3N0YXRlKTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQlhY3BpX2RzX2RlbGV0ZV93YWxrX3N0YXRlKHdhbGtfc3RhdGUpOworCQkJZ290byBjbGVhbnVwOworCQl9CisJfQorCisJLyogUGFyc2UgdGhlIEFNTCAqLworCisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9QQVJTRSwgIipQQVJTRSogcGFzcyAlZCBwYXJzZVxuIiwKKwkJCSAgKHVuc2lnbmVkKXBhc3NfbnVtYmVyKSk7CisJc3RhdHVzID0gYWNwaV9wc19wYXJzZV9hbWwod2Fsa19zdGF0ZSk7CisKKyAgICAgIGNsZWFudXA6CisJYWNwaV9wc19kZWxldGVfcGFyc2VfdHJlZShwYXJzZV9yb290KTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9uc19wYXJzZV90YWJsZQorICoKKyAqIFBBUkFNRVRFUlM6ICB0YWJsZV9kZXNjICAgICAgLSBBbiBBQ1BJIHRhYmxlIGRlc2NyaXB0b3IgZm9yIHRhYmxlIHRvIHBhcnNlCisgKiAgICAgICAgICAgICAgc3RhcnRfbm9kZSAgICAgIC0gV2hlcmUgdG8gZW50ZXIgdGhlIHRhYmxlIGludG8gdGhlIG5hbWVzcGFjZQorICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogUGFyc2UgQU1MIHdpdGhpbiBhbiBBQ1BJIHRhYmxlIGFuZCByZXR1cm4gYSB0cmVlIG9mIG9wcworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2FjcGlfc3RhdHVzCithY3BpX25zX3BhcnNlX3RhYmxlKHUzMiB0YWJsZV9pbmRleCwgc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKnN0YXJ0X25vZGUpCit7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCisJQUNQSV9GVU5DVElPTl9UUkFDRShuc19wYXJzZV90YWJsZSk7CisKKwkvKgorCSAqIEFNTCBQYXJzZSwgcGFzcyAxCisJICoKKwkgKiBJbiB0aGlzIHBhc3MsIHdlIGxvYWQgbW9zdCBvZiB0aGUgbmFtZXNwYWNlLiAgQ29udHJvbCBtZXRob2RzCisJICogYXJlIG5vdCBwYXJzZWQgdW50aWwgbGF0ZXIuICBBIHBhcnNlIHRyZWUgaXMgbm90IGNyZWF0ZWQuICBJbnN0ZWFkLAorCSAqIGVhY2ggUGFyc2VyIE9wIHN1YnRyZWUgaXMgZGVsZXRlZCB3aGVuIGl0IGlzIGZpbmlzaGVkLiAgVGhpcyBzYXZlcworCSAqIGEgZ3JlYXQgZGVhbCBvZiBtZW1vcnksIGFuZCBhbGxvd3MgYSBzbWFsbCBjYWNoZSBvZiBwYXJzZSBvYmplY3RzCisJICogdG8gc2VydmljZSB0aGUgZW50aXJlIHBhcnNlLiAgVGhlIHNlY29uZCBwYXNzIG9mIHRoZSBwYXJzZSB0aGVuCisJICogcGVyZm9ybXMgYW5vdGhlciBjb21wbGV0ZSBwYXJzZSBvZiB0aGUgQU1MLgorCSAqLworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfUEFSU0UsICIqKioqIFN0YXJ0IHBhc3MgMVxuIikpOworCXN0YXR1cyA9CisJICAgIGFjcGlfbnNfb25lX2NvbXBsZXRlX3BhcnNlKEFDUElfSU1PREVfTE9BRF9QQVNTMSwgdGFibGVfaW5kZXgsCisJCQkJICAgICAgIHN0YXJ0X25vZGUpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKKwl9CisKKwkvKgorCSAqIEFNTCBQYXJzZSwgcGFzcyAyCisJICoKKwkgKiBJbiB0aGlzIHBhc3MsIHdlIHJlc29sdmUgZm9yd2FyZCByZWZlcmVuY2VzIGFuZCBvdGhlciB0aGluZ3MKKwkgKiB0aGF0IGNvdWxkIG5vdCBiZSBjb21wbGV0ZWQgZHVyaW5nIHRoZSBmaXJzdCBwYXNzLgorCSAqIEFub3RoZXIgY29tcGxldGUgcGFyc2Ugb2YgdGhlIEFNTCBpcyBwZXJmb3JtZWQsIGJ1dCB0aGUKKwkgKiBvdmVyaGVhZCBvZiB0aGlzIGlzIGNvbXBlbnNhdGVkIGZvciBieSB0aGUgZmFjdCB0aGF0IHRoZQorCSAqIHBhcnNlIG9iamVjdHMgYXJlIGFsbCBjYWNoZWQuCisJICovCisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9QQVJTRSwgIioqKiogU3RhcnQgcGFzcyAyXG4iKSk7CisJc3RhdHVzID0KKwkgICAgYWNwaV9uc19vbmVfY29tcGxldGVfcGFyc2UoQUNQSV9JTU9ERV9MT0FEX1BBU1MyLCB0YWJsZV9pbmRleCwKKwkJCQkgICAgICAgc3RhcnRfbm9kZSk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworCX0KKworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS9uc3ByZWRlZi5jIGIvZHJpdmVycy9hY3BpL2FjcGljYS9uc3ByZWRlZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1MjcwMzIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL25zcHJlZGVmLmMKQEAgLTAsMCArMSwxMDY1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogTW9kdWxlIE5hbWU6IG5zcHJlZGVmIC0gVmFsaWRhdGlvbiBvZiBBQ1BJIHByZWRlZmluZWQgbWV0aG9kcyBhbmQgb2JqZWN0cworICogICAgICAgICAgICAgICRSZXZpc2lvbjogMS4xICQKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA4LCBJbnRlbCBDb3JwLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAorICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgYXQgbWluaW11bSBhIGRpc2NsYWltZXIKKyAqICAgIHN1YnN0YW50aWFsbHkgc2ltaWxhciB0byB0aGUgIk5PIFdBUlJBTlRZIiBkaXNjbGFpbWVyIGJlbG93CisgKiAgICAoIkRpc2NsYWltZXIiKSBhbmQgYW55IHJlZGlzdHJpYnV0aW9uIG11c3QgYmUgY29uZGl0aW9uZWQgdXBvbgorICogICAgaW5jbHVkaW5nIGEgc3Vic3RhbnRpYWxseSBzaW1pbGFyIERpc2NsYWltZXIgcmVxdWlyZW1lbnQgZm9yIGZ1cnRoZXIKKyAqICAgIGJpbmFyeSByZWRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcworICogICAgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBOTyBXQVJSQU5UWQorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcKKyAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgorICovCisKKyNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KKyNpbmNsdWRlICJhY2NvbW1vbi5oIgorI2luY2x1ZGUgImFjbmFtZXNwLmgiCisjaW5jbHVkZSAiYWNwcmVkZWYuaCIKKworI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfTkFNRVNQQUNFCitBQ1BJX01PRFVMRV9OQU1FKCJuc3ByZWRlZiIpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogVGhpcyBtb2R1bGUgdmFsaWRhdGVzIHByZWRlZmluZWQgQUNQSSBvYmplY3RzIHRoYXQgYXBwZWFyIGluIHRoZSBuYW1lc3BhY2UsCisgKiBhdCB0aGUgdGltZSB0aGV5IGFyZSBldmFsdWF0ZWQgKHZpYSBhY3BpX2V2YWx1YXRlX29iamVjdCkuIFRoZSBwdXJwb3NlIG9mIHRoaXMKKyAqIHZhbGlkYXRpb24gaXMgdG8gZGV0ZWN0IHByb2JsZW1zIHdpdGggQklPUy1leHBvc2VkIHByZWRlZmluZWQgQUNQSSBvYmplY3RzCisgKiBiZWZvcmUgdGhlIHJlc3VsdHMgYXJlIHJldHVybmVkIHRvIHRoZSBBQ1BJLXJlbGF0ZWQgZHJpdmVycy4KKyAqCisgKiBUaGVyZSBhcmUgc2V2ZXJhbCBhcmVhcyB0aGF0IGFyZSB2YWxpZGF0ZWQ6CisgKgorICogIDEpIFRoZSBudW1iZXIgb2YgaW5wdXQgYXJndW1lbnRzIGFzIGRlZmluZWQgYnkgdGhlIG1ldGhvZC9vYmplY3QgaW4gdGhlCisgKiAgICAgIEFTTCBpcyB2YWxpZGF0ZWQgYWdhaW5zdCB0aGUgQUNQSSBzcGVjaWZpY2F0aW9uLgorICogIDIpIFRoZSB0eXBlIG9mIHRoZSByZXR1cm4gb2JqZWN0IChpZiBhbnkpIGlzIHZhbGlkYXRlZCBhZ2FpbnN0IHRoZSBBQ1BJCisgKiAgICAgIHNwZWNpZmljYXRpb24uCisgKiAgMykgRm9yIHJldHVybmVkIHBhY2thZ2Ugb2JqZWN0cywgdGhlIGNvdW50IG9mIHBhY2thZ2UgZWxlbWVudHMgaXMKKyAqICAgICAgdmFsaWRhdGVkLCBhcyB3ZWxsIGFzIHRoZSB0eXBlIG9mIGVhY2ggcGFja2FnZSBlbGVtZW50LiBOZXN0ZWQKKyAqICAgICAgcGFja2FnZXMgYXJlIHN1cHBvcnRlZC4KKyAqCisgKiBGb3IgYW55IHByb2JsZW1zIGZvdW5kLCBhIHdhcm5pbmcgbWVzc2FnZSBpcyBpc3N1ZWQuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIExvY2FsIHByb3RvdHlwZXMgKi8KK3N0YXRpYyBhY3BpX3N0YXR1cworYWNwaV9uc19jaGVja19wYWNrYWdlKGNoYXIgKnBhdGhuYW1lLAorCQkgICAgICB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICoqcmV0dXJuX29iamVjdF9wdHIsCisJCSAgICAgIGNvbnN0IHVuaW9uIGFjcGlfcHJlZGVmaW5lZF9pbmZvICpwcmVkZWZpbmVkKTsKKworc3RhdGljIGFjcGlfc3RhdHVzCithY3BpX25zX2NoZWNrX3BhY2thZ2VfZWxlbWVudHMoY2hhciAqcGF0aG5hbWUsCisJCQkgICAgICAgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKmVsZW1lbnRzLAorCQkJICAgICAgIHU4IHR5cGUxLCB1MzIgY291bnQxLCB1OCB0eXBlMiwgdTMyIGNvdW50Mik7CisKK3N0YXRpYyBhY3BpX3N0YXR1cworYWNwaV9uc19jaGVja19vYmplY3RfdHlwZShjaGFyICpwYXRobmFtZSwKKwkJCSAgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKnJldHVybl9vYmplY3RfcHRyLAorCQkJICB1MzIgZXhwZWN0ZWRfYnR5cGVzLCB1MzIgcGFja2FnZV9pbmRleCk7CisKK3N0YXRpYyBhY3BpX3N0YXR1cworYWNwaV9uc19jaGVja19yZWZlcmVuY2UoY2hhciAqcGF0aG5hbWUsCisJCQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpyZXR1cm5fb2JqZWN0KTsKKworc3RhdGljIGFjcGlfc3RhdHVzCithY3BpX25zX3JlcGFpcl9vYmplY3QodTMyIGV4cGVjdGVkX2J0eXBlcywKKwkJICAgICAgdTMyIHBhY2thZ2VfaW5kZXgsCisJCSAgICAgIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKipyZXR1cm5fb2JqZWN0X3B0cik7CisKKy8qCisgKiBOYW1lcyBmb3IgdGhlIHR5cGVzIHRoYXQgY2FuIGJlIHJldHVybmVkIGJ5IHRoZSBwcmVkZWZpbmVkIG9iamVjdHMuCisgKiBVc2VkIGZvciB3YXJuaW5nIG1lc3NhZ2VzLiBNdXN0IGJlIGluIHRoZSBzYW1lIG9yZGVyIGFzIHRoZSBBQ1BJX1JUWVBFcworICovCitzdGF0aWMgY29uc3QgY2hhciAqYWNwaV9ydHlwZV9uYW1lc1tdID0geworCSIvSW50ZWdlciIsCisJIi9TdHJpbmciLAorCSIvQnVmZmVyIiwKKwkiL1BhY2thZ2UiLAorCSIvUmVmZXJlbmNlIiwKK307CisKKyNkZWZpbmUgQUNQSV9OT1RfUEFDS0FHRSAgICBBQ1BJX1VJTlQzMl9NQVgKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9uc19jaGVja19wcmVkZWZpbmVkX25hbWVzCisgKgorICogUEFSQU1FVEVSUzogIE5vZGUgICAgICAgICAgICAtIE5hbWVzcGFjZSBub2RlIGZvciB0aGUgbWV0aG9kL29iamVjdAorICogICAgICAgICAgICAgIHJldHVybl9vYmplY3RfcHRyIC0gUG9pbnRlciB0byB0aGUgb2JqZWN0IHJldHVybmVkIGZyb20gdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZhbHVhdGlvbiBvZiBhIG1ldGhvZCBvciBvYmplY3QKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IENoZWNrIGFuIEFDUEkgbmFtZSBmb3IgYSBtYXRjaCBpbiB0aGUgcHJlZGVmaW5lZCBuYW1lIGxpc3QuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworYWNwaV9zdGF0dXMKK2FjcGlfbnNfY2hlY2tfcHJlZGVmaW5lZF9uYW1lcyhzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZSwKKwkJCSAgICAgICB1MzIgdXNlcl9wYXJhbV9jb3VudCwKKwkJCSAgICAgICBhY3BpX3N0YXR1cyByZXR1cm5fc3RhdHVzLAorCQkJICAgICAgIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKipyZXR1cm5fb2JqZWN0X3B0cikKK3sKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpyZXR1cm5fb2JqZWN0ID0gKnJldHVybl9vYmplY3RfcHRyOworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOworCWNvbnN0IHVuaW9uIGFjcGlfcHJlZGVmaW5lZF9pbmZvICpwcmVkZWZpbmVkOworCWNoYXIgKnBhdGhuYW1lOworCisJLyogTWF0Y2ggdGhlIG5hbWUgZm9yIHRoaXMgbWV0aG9kL29iamVjdCBhZ2FpbnN0IHRoZSBwcmVkZWZpbmVkIGxpc3QgKi8KKworCXByZWRlZmluZWQgPSBhY3BpX25zX2NoZWNrX2Zvcl9wcmVkZWZpbmVkX25hbWUobm9kZSk7CisKKwkvKiBHZXQgdGhlIGZ1bGwgcGF0aG5hbWUgdG8gdGhlIG9iamVjdCwgZm9yIHVzZSBpbiBlcnJvciBtZXNzYWdlcyAqLworCisJcGF0aG5hbWUgPSBhY3BpX25zX2dldF9leHRlcm5hbF9wYXRobmFtZShub2RlKTsKKwlpZiAoIXBhdGhuYW1lKSB7CisJCXBhdGhuYW1lID0gQUNQSV9DQVNUX1BUUihjaGFyLCBwcmVkZWZpbmVkLT5pbmZvLm5hbWUpOworCX0KKworCS8qCisJICogQ2hlY2sgdGhhdCB0aGUgcGFyYW1ldGVyIGNvdW50IGZvciB0aGlzIG1ldGhvZCBtYXRjaGVzIHRoZSBBU0wKKwkgKiBkZWZpbml0aW9uLiBGb3IgcHJlZGVmaW5lZCBuYW1lcywgZW5zdXJlIHRoYXQgYm90aCB0aGUgY2FsbGVyIGFuZAorCSAqIHRoZSBtZXRob2QgaXRzZWxmIGFyZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIEFDUEkgc3BlY2lmaWNhdGlvbi4KKwkgKi8KKwlhY3BpX25zX2NoZWNrX3BhcmFtZXRlcl9jb3VudChwYXRobmFtZSwgbm9kZSwgdXNlcl9wYXJhbV9jb3VudCwKKwkJCQkgICAgICBwcmVkZWZpbmVkKTsKKworCS8qIElmIG5vdCBhIHByZWRlZmluZWQgbmFtZSwgd2UgY2Fubm90IHZhbGlkYXRlIHRoZSByZXR1cm4gb2JqZWN0ICovCisKKwlpZiAoIXByZWRlZmluZWQpIHsKKwkJZ290byBleGl0OworCX0KKworCS8qIElmIHRoZSBtZXRob2QgZmFpbGVkLCB3ZSBjYW5ub3QgdmFsaWRhdGUgdGhlIHJldHVybiBvYmplY3QgKi8KKworCWlmICgocmV0dXJuX3N0YXR1cyAhPSBBRV9PSykgJiYgKHJldHVybl9zdGF0dXMgIT0gQUVfQ1RSTF9SRVRVUk5fVkFMVUUpKSB7CisJCWdvdG8gZXhpdDsKKwl9CisKKwkvKgorCSAqIE9ubHkgdmFsaWRhdGUgdGhlIHJldHVybiB2YWx1ZSBvbiB0aGUgZmlyc3Qgc3VjY2Vzc2Z1bCBldmFsdWF0aW9uIG9mCisJICogdGhlIG1ldGhvZC4gVGhpcyBlbnN1cmVzIHRoYXQgYW55IHdhcm5pbmdzIHdpbGwgb25seSBiZSBlbWl0dGVkIGR1cmluZworCSAqIHRoZSB2ZXJ5IGZpcnN0IGV2YWx1YXRpb24gb2YgdGhlIG1ldGhvZC9vYmplY3QuCisJICovCisJaWYgKG5vZGUtPmZsYWdzICYgQU5PQkpfRVZBTFVBVEVEKSB7CisJCWdvdG8gZXhpdDsKKwl9CisKKwkvKiBNYXJrIHRoZSBub2RlIGFzIGhhdmluZyBiZWVuIHN1Y2Nlc3NmdWxseSBldmFsdWF0ZWQgKi8KKworCW5vZGUtPmZsYWdzIHw9IEFOT0JKX0VWQUxVQVRFRDsKKworCS8qCisJICogSWYgdGhlcmUgaXMgbm8gcmV0dXJuIHZhbHVlLCBjaGVjayBpZiB3ZSByZXF1aXJlIGEgcmV0dXJuIHZhbHVlIGZvcgorCSAqIHRoaXMgcHJlZGVmaW5lZCBuYW1lLiBFaXRoZXIgb25lIHJldHVybiB2YWx1ZSBpcyBleHBlY3RlZCwgb3Igbm9uZSwKKwkgKiBmb3IgYm90aCBtZXRob2RzIGFuZCBvdGhlciBvYmplY3RzLgorCSAqCisJICogRXhpdCBub3cgaWYgdGhlcmUgaXMgbm8gcmV0dXJuIG9iamVjdC4gV2FybmluZyBpZiBvbmUgd2FzIGV4cGVjdGVkLgorCSAqLworCWlmICghcmV0dXJuX29iamVjdCkgeworCQlpZiAoKHByZWRlZmluZWQtPmluZm8uZXhwZWN0ZWRfYnR5cGVzKSAmJgorCQkgICAgKCEocHJlZGVmaW5lZC0+aW5mby5leHBlY3RlZF9idHlwZXMgJiBBQ1BJX1JUWVBFX05PTkUpKSkgeworCQkJQUNQSV9FUlJPUigoQUVfSU5GTywKKwkJCQkgICAgIiVzOiBNaXNzaW5nIGV4cGVjdGVkIHJldHVybiB2YWx1ZSIsCisJCQkJICAgIHBhdGhuYW1lKSk7CisKKwkJCXN0YXR1cyA9IEFFX0FNTF9OT19SRVRVUk5fVkFMVUU7CisJCX0KKwkJZ290byBleGl0OworCX0KKworCS8qCisJICogV2UgaGF2ZSBhIHJldHVybiB2YWx1ZSwgYnV0IGlmIG9uZSB3YXNuJ3QgZXhwZWN0ZWQsIGp1c3QgZXhpdCwgdGhpcyBpcworCSAqIG5vdCBhIHByb2JsZW0KKwkgKgorCSAqIEZvciBleGFtcGxlLCBpZiB0aGUgIkltcGxpY2l0IFJldHVybiIgZmVhdHVyZSBpcyBlbmFibGVkLCBtZXRob2RzIHdpbGwKKwkgKiBhbHdheXMgcmV0dXJuIGEgdmFsdWUKKwkgKi8KKwlpZiAoIXByZWRlZmluZWQtPmluZm8uZXhwZWN0ZWRfYnR5cGVzKSB7CisJCWdvdG8gZXhpdDsKKwl9CisKKwkvKgorCSAqIENoZWNrIHRoYXQgdGhlIHR5cGUgb2YgdGhlIHJldHVybiBvYmplY3QgaXMgd2hhdCBpcyBleHBlY3RlZCBmb3IKKwkgKiB0aGlzIHByZWRlZmluZWQgbmFtZQorCSAqLworCXN0YXR1cyA9IGFjcGlfbnNfY2hlY2tfb2JqZWN0X3R5cGUocGF0aG5hbWUsIHJldHVybl9vYmplY3RfcHRyLAorCQkJCQkgICBwcmVkZWZpbmVkLT5pbmZvLmV4cGVjdGVkX2J0eXBlcywKKwkJCQkJICAgQUNQSV9OT1RfUEFDS0FHRSk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCWdvdG8gZXhpdDsKKwl9CisKKwkvKiBGb3IgcmV0dXJuZWQgUGFja2FnZSBvYmplY3RzLCBjaGVjayB0aGUgdHlwZSBvZiBhbGwgc3ViLW9iamVjdHMgKi8KKworCWlmIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRShyZXR1cm5fb2JqZWN0KSA9PSBBQ1BJX1RZUEVfUEFDS0FHRSkgeworCQlzdGF0dXMgPQorCQkgICAgYWNwaV9uc19jaGVja19wYWNrYWdlKHBhdGhuYW1lLCByZXR1cm5fb2JqZWN0X3B0ciwKKwkJCQkJICBwcmVkZWZpbmVkKTsKKwl9CisKKyAgICAgIGV4aXQ6CisJaWYgKHBhdGhuYW1lICE9IHByZWRlZmluZWQtPmluZm8ubmFtZSkgeworCQlBQ1BJX0ZSRUUocGF0aG5hbWUpOworCX0KKworCXJldHVybiAoc3RhdHVzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9uc19jaGVja19wYXJhbWV0ZXJfY291bnQKKyAqCisgKiBQQVJBTUVURVJTOiAgUGF0aG5hbWUgICAgICAgIC0gRnVsbCBwYXRobmFtZSB0byB0aGUgbm9kZSAoZm9yIGVycm9yIG1zZ3MpCisgKiAgICAgICAgICAgICAgTm9kZSAgICAgICAgICAgIC0gTmFtZXNwYWNlIG5vZGUgZm9yIHRoZSBtZXRob2Qvb2JqZWN0CisgKiAgICAgICAgICAgICAgdXNlcl9wYXJhbV9jb3VudCAtIE51bWJlciBvZiBhcmdzIHBhc3NlZCBpbiBieSB0aGUgY2FsbGVyCisgKiAgICAgICAgICAgICAgUHJlZGVmaW5lZCAgICAgIC0gUG9pbnRlciB0byBlbnRyeSBpbiBwcmVkZWZpbmVkIG5hbWUgdGFibGUKKyAqCisgKiBSRVRVUk46ICAgICAgTm9uZQorICoKKyAqIERFU0NSSVBUSU9OOiBDaGVjayB0aGF0IHRoZSBkZWNsYXJlZCAoaW4gQVNML0FNTCkgcGFyYW1ldGVyIGNvdW50IGZvciBhCisgKiAgICAgICAgICAgICAgcHJlZGVmaW5lZCBuYW1lIGlzIHdoYXQgaXMgZXhwZWN0ZWQgKGkuZS4sIHdoYXQgaXMgZGVmaW5lZCBpbgorICogICAgICAgICAgICAgIHRoZSBBQ1BJIHNwZWNpZmljYXRpb24gZm9yIHRoaXMgcHJlZGVmaW5lZCBuYW1lLikKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkCithY3BpX25zX2NoZWNrX3BhcmFtZXRlcl9jb3VudChjaGFyICpwYXRobmFtZSwKKwkJCSAgICAgIHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlLAorCQkJICAgICAgdTMyIHVzZXJfcGFyYW1fY291bnQsCisJCQkgICAgICBjb25zdCB1bmlvbiBhY3BpX3ByZWRlZmluZWRfaW5mbyAqcHJlZGVmaW5lZCkKK3sKKwl1MzIgcGFyYW1fY291bnQ7CisJdTMyIHJlcXVpcmVkX3BhcmFtc19jdXJyZW50OworCXUzMiByZXF1aXJlZF9wYXJhbXNfb2xkOworCisJLyogTWV0aG9kcyBoYXZlIDAtNyBwYXJhbWV0ZXJzLiBBbGwgb3RoZXIgdHlwZXMgaGF2ZSB6ZXJvLiAqLworCisJcGFyYW1fY291bnQgPSAwOworCWlmIChub2RlLT50eXBlID09IEFDUElfVFlQRV9NRVRIT0QpIHsKKwkJcGFyYW1fY291bnQgPSBub2RlLT5vYmplY3QtPm1ldGhvZC5wYXJhbV9jb3VudDsKKwl9CisKKwkvKiBBcmd1bWVudCBjb3VudCBjaGVjayBmb3Igbm9uLXByZWRlZmluZWQgbWV0aG9kcy9vYmplY3RzICovCisKKwlpZiAoIXByZWRlZmluZWQpIHsKKwkJLyoKKwkJICogV2FybmluZyBpZiB0b28gZmV3IG9yIHRvbyBtYW55IGFyZ3VtZW50cyBoYXZlIGJlZW4gcGFzc2VkIGJ5IHRoZQorCQkgKiBjYWxsZXIuIEFuIGluY29ycmVjdCBudW1iZXIgb2YgYXJndW1lbnRzIG1heSBub3QgY2F1c2UgdGhlIG1ldGhvZAorCQkgKiB0byBmYWlsLiBIb3dldmVyLCB0aGUgbWV0aG9kIHdpbGwgZmFpbCBpZiB0aGVyZSBhcmUgdG9vIGZldworCQkgKiBhcmd1bWVudHMgYW5kIHRoZSBtZXRob2QgYXR0ZW1wdHMgdG8gdXNlIG9uZSBvZiB0aGUgbWlzc2luZyBvbmVzLgorCQkgKi8KKwkJaWYgKHVzZXJfcGFyYW1fY291bnQgPCBwYXJhbV9jb3VudCkgeworCQkJQUNQSV9XQVJOSU5HKChBRV9JTkZPLAorCQkJCSAgICAgICIlczogSW5zdWZmaWNpZW50IGFyZ3VtZW50cyAtIG5lZWRzICVkLCBmb3VuZCAlZCIsCisJCQkJICAgICAgcGF0aG5hbWUsIHBhcmFtX2NvdW50LCB1c2VyX3BhcmFtX2NvdW50KSk7CisJCX0gZWxzZSBpZiAodXNlcl9wYXJhbV9jb3VudCA+IHBhcmFtX2NvdW50KSB7CisJCQlBQ1BJX1dBUk5JTkcoKEFFX0lORk8sCisJCQkJICAgICAgIiVzOiBFeGNlc3MgYXJndW1lbnRzIC0gbmVlZHMgJWQsIGZvdW5kICVkIiwKKwkJCQkgICAgICBwYXRobmFtZSwgcGFyYW1fY291bnQsIHVzZXJfcGFyYW1fY291bnQpKTsKKwkJfQorCQlyZXR1cm47CisJfQorCisJLyogQWxsb3cgdHdvIGRpZmZlcmVudCBsZWdhbCBhcmd1bWVudCBjb3VudHMgKF9TQ1AsIGV0Yy4pICovCisKKwlyZXF1aXJlZF9wYXJhbXNfY3VycmVudCA9IHByZWRlZmluZWQtPmluZm8ucGFyYW1fY291bnQgJiAweDBGOworCXJlcXVpcmVkX3BhcmFtc19vbGQgPSBwcmVkZWZpbmVkLT5pbmZvLnBhcmFtX2NvdW50ID4+IDQ7CisKKwlpZiAodXNlcl9wYXJhbV9jb3VudCAhPSBBQ1BJX1VJTlQzMl9NQVgpIHsKKworCQkvKiBWYWxpZGF0ZSB0aGUgdXNlci1zdXBwbGllZCBwYXJhbWV0ZXIgY291bnQgKi8KKworCQlpZiAoKHVzZXJfcGFyYW1fY291bnQgIT0gcmVxdWlyZWRfcGFyYW1zX2N1cnJlbnQpICYmCisJCSAgICAodXNlcl9wYXJhbV9jb3VudCAhPSByZXF1aXJlZF9wYXJhbXNfb2xkKSkgeworCQkJQUNQSV9XQVJOSU5HKChBRV9JTkZPLAorCQkJCSAgICAgICIlczogUGFyYW1ldGVyIGNvdW50IG1pc21hdGNoIC0gY2FsbGVyIHBhc3NlZCAlZCwgQUNQSSByZXF1aXJlcyAlZCIsCisJCQkJICAgICAgcGF0aG5hbWUsIHVzZXJfcGFyYW1fY291bnQsCisJCQkJICAgICAgcmVxdWlyZWRfcGFyYW1zX2N1cnJlbnQpKTsKKwkJfQorCX0KKworCS8qCisJICogT25seSB2YWxpZGF0ZSB0aGUgYXJndW1lbnQgY291bnQgb24gdGhlIGZpcnN0IHN1Y2Nlc3NmdWwgZXZhbHVhdGlvbiBvZgorCSAqIHRoZSBtZXRob2QuIFRoaXMgZW5zdXJlcyB0aGF0IGFueSB3YXJuaW5ncyB3aWxsIG9ubHkgYmUgZW1pdHRlZCBkdXJpbmcKKwkgKiB0aGUgdmVyeSBmaXJzdCBldmFsdWF0aW9uIG9mIHRoZSBtZXRob2Qvb2JqZWN0LgorCSAqLworCWlmIChub2RlLT5mbGFncyAmIEFOT0JKX0VWQUxVQVRFRCkgeworCQlyZXR1cm47CisJfQorCisJLyoKKwkgKiBDaGVjayB0aGF0IHRoZSBBU0wtZGVmaW5lZCBwYXJhbWV0ZXIgY291bnQgaXMgd2hhdCBpcyBleHBlY3RlZCBmb3IKKwkgKiB0aGlzIHByZWRlZmluZWQgbmFtZS4KKwkgKi8KKwlpZiAoKHBhcmFtX2NvdW50ICE9IHJlcXVpcmVkX3BhcmFtc19jdXJyZW50KSAmJgorCSAgICAocGFyYW1fY291bnQgIT0gcmVxdWlyZWRfcGFyYW1zX29sZCkpIHsKKwkJQUNQSV9XQVJOSU5HKChBRV9JTkZPLAorCQkJICAgICAgIiVzOiBQYXJhbWV0ZXIgY291bnQgbWlzbWF0Y2ggLSBBU0wgZGVjbGFyZWQgJWQsIEFDUEkgcmVxdWlyZXMgJWQiLAorCQkJICAgICAgcGF0aG5hbWUsIHBhcmFtX2NvdW50LCByZXF1aXJlZF9wYXJhbXNfY3VycmVudCkpOworCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9uc19jaGVja19mb3JfcHJlZGVmaW5lZF9uYW1lCisgKgorICogUEFSQU1FVEVSUzogIE5vZGUgICAgICAgICAgICAtIE5hbWVzcGFjZSBub2RlIGZvciB0aGUgbWV0aG9kL29iamVjdAorICoKKyAqIFJFVFVSTjogICAgICBQb2ludGVyIHRvIGVudHJ5IGluIHByZWRlZmluZWQgdGFibGUuIE5VTEwgaW5kaWNhdGVzIG5vdCBmb3VuZC4KKyAqCisgKiBERVNDUklQVElPTjogQ2hlY2sgYW4gb2JqZWN0IG5hbWUgYWdhaW5zdCB0aGUgcHJlZGVmaW5lZCBvYmplY3QgbGlzdC4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitjb25zdCB1bmlvbiBhY3BpX3ByZWRlZmluZWRfaW5mbyAqYWNwaV9uc19jaGVja19mb3JfcHJlZGVmaW5lZF9uYW1lKHN0cnVjdAorCQkJCQkJCQkgICAgYWNwaV9uYW1lc3BhY2Vfbm9kZQorCQkJCQkJCQkgICAgKm5vZGUpCit7CisJY29uc3QgdW5pb24gYWNwaV9wcmVkZWZpbmVkX2luZm8gKnRoaXNfbmFtZTsKKworCS8qIFF1aWNrIGNoZWNrIGZvciBhIHByZWRlZmluZWQgbmFtZSwgZmlyc3QgY2hhcmFjdGVyIG11c3QgYmUgdW5kZXJzY29yZSAqLworCisJaWYgKG5vZGUtPm5hbWUuYXNjaWlbMF0gIT0gJ18nKSB7CisJCXJldHVybiAoTlVMTCk7CisJfQorCisJLyogU2VhcmNoIGluZm8gdGFibGUgZm9yIGEgcHJlZGVmaW5lZCBtZXRob2Qvb2JqZWN0IG5hbWUgKi8KKworCXRoaXNfbmFtZSA9IHByZWRlZmluZWRfbmFtZXM7CisJd2hpbGUgKHRoaXNfbmFtZS0+aW5mby5uYW1lWzBdKSB7CisJCWlmIChBQ1BJX0NPTVBBUkVfTkFNRShub2RlLT5uYW1lLmFzY2lpLCB0aGlzX25hbWUtPmluZm8ubmFtZSkpIHsKKworCQkJLyogUmV0dXJuIHBvaW50ZXIgdG8gdGhpcyB0YWJsZSBlbnRyeSAqLworCisJCQlyZXR1cm4gKHRoaXNfbmFtZSk7CisJCX0KKworCQkvKgorCQkgKiBTa2lwIG5leHQgZW50cnkgaW4gdGhlIHRhYmxlIGlmIHRoaXMgbmFtZSByZXR1cm5zIGEgUGFja2FnZQorCQkgKiAobmV4dCBlbnRyeSBjb250YWlucyB0aGUgcGFja2FnZSBpbmZvKQorCQkgKi8KKwkJaWYgKHRoaXNfbmFtZS0+aW5mby5leHBlY3RlZF9idHlwZXMgJiBBQ1BJX1JUWVBFX1BBQ0tBR0UpIHsKKwkJCXRoaXNfbmFtZSsrOworCQl9CisKKwkJdGhpc19uYW1lKys7CisJfQorCisJcmV0dXJuIChOVUxMKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9uc19jaGVja19wYWNrYWdlCisgKgorICogUEFSQU1FVEVSUzogIFBhdGhuYW1lICAgICAgICAtIEZ1bGwgcGF0aG5hbWUgdG8gdGhlIG5vZGUgKGZvciBlcnJvciBtc2dzKQorICogICAgICAgICAgICAgIHJldHVybl9vYmplY3RfcHRyIC0gUG9pbnRlciB0byB0aGUgb2JqZWN0IHJldHVybmVkIGZyb20gdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZhbHVhdGlvbiBvZiBhIG1ldGhvZCBvciBvYmplY3QKKyAqICAgICAgICAgICAgICBQcmVkZWZpbmVkICAgICAgLSBQb2ludGVyIHRvIGVudHJ5IGluIHByZWRlZmluZWQgbmFtZSB0YWJsZQorICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogQ2hlY2sgYSByZXR1cm5lZCBwYWNrYWdlIG9iamVjdCBmb3IgdGhlIGNvcnJlY3QgY291bnQgYW5kCisgKiAgICAgICAgICAgICAgY29ycmVjdCB0eXBlIG9mIGFsbCBzdWItb2JqZWN0cy4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgYWNwaV9zdGF0dXMKK2FjcGlfbnNfY2hlY2tfcGFja2FnZShjaGFyICpwYXRobmFtZSwKKwkJICAgICAgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKnJldHVybl9vYmplY3RfcHRyLAorCQkgICAgICBjb25zdCB1bmlvbiBhY3BpX3ByZWRlZmluZWRfaW5mbyAqcHJlZGVmaW5lZCkKK3sKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpyZXR1cm5fb2JqZWN0ID0gKnJldHVybl9vYmplY3RfcHRyOworCWNvbnN0IHVuaW9uIGFjcGlfcHJlZGVmaW5lZF9pbmZvICpwYWNrYWdlOworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnN1Yl9wYWNrYWdlOworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKiplbGVtZW50czsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICoqc3ViX2VsZW1lbnRzOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwl1MzIgZXhwZWN0ZWRfY291bnQ7CisJdTMyIGNvdW50OworCXUzMiBpOworCXUzMiBqOworCisJQUNQSV9GVU5DVElPTl9OQU1FKG5zX2NoZWNrX3BhY2thZ2UpOworCisJLyogVGhlIHBhY2thZ2UgaW5mbyBmb3IgdGhpcyBuYW1lIGlzIGluIHRoZSBuZXh0IHRhYmxlIGVudHJ5ICovCisKKwlwYWNrYWdlID0gcHJlZGVmaW5lZCArIDE7CisKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX05BTUVTLAorCQkJICAiJXMgVmFsaWRhdGluZyByZXR1cm4gUGFja2FnZSBvZiBUeXBlICVYLCBDb3VudCAlWFxuIiwKKwkJCSAgcGF0aG5hbWUsIHBhY2thZ2UtPnJldF9pbmZvLnR5cGUsCisJCQkgIHJldHVybl9vYmplY3QtPnBhY2thZ2UuY291bnQpKTsKKworCS8qIEV4dHJhY3QgcGFja2FnZSBjb3VudCBhbmQgZWxlbWVudHMgYXJyYXkgKi8KKworCWVsZW1lbnRzID0gcmV0dXJuX29iamVjdC0+cGFja2FnZS5lbGVtZW50czsKKwljb3VudCA9IHJldHVybl9vYmplY3QtPnBhY2thZ2UuY291bnQ7CisKKwkvKiBUaGUgcGFja2FnZSBtdXN0IGhhdmUgYXQgbGVhc3Qgb25lIGVsZW1lbnQsIGVsc2UgaW52YWxpZCAqLworCisJaWYgKCFjb3VudCkgeworCQlBQ1BJX1dBUk5JTkcoKEFFX0lORk8sCisJCQkgICAgICAiJXM6IFJldHVybiBQYWNrYWdlIGhhcyBubyBlbGVtZW50cyAoZW1wdHkpIiwKKwkJCSAgICAgIHBhdGhuYW1lKSk7CisKKwkJcmV0dXJuIChBRV9BTUxfT1BFUkFORF9WQUxVRSk7CisJfQorCisJLyoKKwkgKiBEZWNvZGUgdGhlIHR5cGUgb2YgdGhlIGV4cGVjdGVkIHBhY2thZ2UgY29udGVudHMKKwkgKgorCSAqIFBUWVBFMSBwYWNrYWdlcyBjb250YWluIG5vIHN1YnBhY2thZ2VzCisJICogUFRZUEUyIHBhY2thZ2VzIGNvbnRhaW4gc3ViLXBhY2thZ2VzCisJICovCisJc3dpdGNoIChwYWNrYWdlLT5yZXRfaW5mby50eXBlKSB7CisJY2FzZSBBQ1BJX1BUWVBFMV9GSVhFRDoKKworCQkvKgorCQkgKiBUaGUgcGFja2FnZSBjb3VudCBpcyBmaXhlZCBhbmQgdGhlcmUgYXJlIG5vIHN1Yi1wYWNrYWdlcworCQkgKgorCQkgKiBJZiBwYWNrYWdlIGlzIHRvbyBzbWFsbCwgZXhpdC4KKwkJICogSWYgcGFja2FnZSBpcyBsYXJnZXIgdGhhbiBleHBlY3RlZCwgaXNzdWUgd2FybmluZyBidXQgY29udGludWUKKwkJICovCisJCWV4cGVjdGVkX2NvdW50ID0KKwkJICAgIHBhY2thZ2UtPnJldF9pbmZvLmNvdW50MSArIHBhY2thZ2UtPnJldF9pbmZvLmNvdW50MjsKKwkJaWYgKGNvdW50IDwgZXhwZWN0ZWRfY291bnQpIHsKKwkJCWdvdG8gcGFja2FnZV90b29fc21hbGw7CisJCX0gZWxzZSBpZiAoY291bnQgPiBleHBlY3RlZF9jb3VudCkgeworCQkJQUNQSV9XQVJOSU5HKChBRV9JTkZPLAorCQkJCSAgICAgICIlczogUmV0dXJuIFBhY2thZ2UgaXMgbGFyZ2VyIHRoYW4gbmVlZGVkIC0gIgorCQkJCSAgICAgICJmb3VuZCAldSwgZXhwZWN0ZWQgJXUiLCBwYXRobmFtZSwgY291bnQsCisJCQkJICAgICAgZXhwZWN0ZWRfY291bnQpKTsKKwkJfQorCisJCS8qIFZhbGlkYXRlIGFsbCBlbGVtZW50cyBvZiB0aGUgcmV0dXJuZWQgcGFja2FnZSAqLworCisJCXN0YXR1cyA9IGFjcGlfbnNfY2hlY2tfcGFja2FnZV9lbGVtZW50cyhwYXRobmFtZSwgZWxlbWVudHMsCisJCQkJCQkJcGFja2FnZS0+cmV0X2luZm8uCisJCQkJCQkJb2JqZWN0X3R5cGUxLAorCQkJCQkJCXBhY2thZ2UtPnJldF9pbmZvLgorCQkJCQkJCWNvdW50MSwKKwkJCQkJCQlwYWNrYWdlLT5yZXRfaW5mby4KKwkJCQkJCQlvYmplY3RfdHlwZTIsCisJCQkJCQkJcGFja2FnZS0+cmV0X2luZm8uCisJCQkJCQkJY291bnQyKTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQlyZXR1cm4gKHN0YXR1cyk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIEFDUElfUFRZUEUxX1ZBUjoKKworCQkvKgorCQkgKiBUaGUgcGFja2FnZSBjb3VudCBpcyB2YXJpYWJsZSwgdGhlcmUgYXJlIG5vIHN1Yi1wYWNrYWdlcywgYW5kIGFsbAorCQkgKiBlbGVtZW50cyBtdXN0IGJlIG9mIHRoZSBzYW1lIHR5cGUKKwkJICovCisJCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisJCQlzdGF0dXMgPSBhY3BpX25zX2NoZWNrX29iamVjdF90eXBlKHBhdGhuYW1lLCBlbGVtZW50cywKKwkJCQkJCQkgICBwYWNrYWdlLT5yZXRfaW5mby4KKwkJCQkJCQkgICBvYmplY3RfdHlwZTEsIGkpOworCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQkJcmV0dXJuIChzdGF0dXMpOworCQkJfQorCQkJZWxlbWVudHMrKzsKKwkJfQorCQlicmVhazsKKworCWNhc2UgQUNQSV9QVFlQRTFfT1BUSU9OOgorCisJCS8qCisJCSAqIFRoZSBwYWNrYWdlIGNvdW50IGlzIHZhcmlhYmxlLCB0aGVyZSBhcmUgbm8gc3ViLXBhY2thZ2VzLiBUaGVyZSBhcmUKKwkJICogYSBmaXhlZCBudW1iZXIgb2YgcmVxdWlyZWQgZWxlbWVudHMsIGFuZCBhIHZhcmlhYmxlIG51bWJlciBvZgorCQkgKiBvcHRpb25hbCBlbGVtZW50cy4KKwkJICoKKwkJICogQ2hlY2sgaWYgcGFja2FnZSBpcyBhdCBsZWFzdCBhcyBsYXJnZSBhcyB0aGUgbWluaW11bSByZXF1aXJlZAorCQkgKi8KKwkJZXhwZWN0ZWRfY291bnQgPSBwYWNrYWdlLT5yZXRfaW5mbzMuY291bnQ7CisJCWlmIChjb3VudCA8IGV4cGVjdGVkX2NvdW50KSB7CisJCQlnb3RvIHBhY2thZ2VfdG9vX3NtYWxsOworCQl9CisKKwkJLyogVmFyaWFibGUgbnVtYmVyIG9mIHN1Yi1vYmplY3RzICovCisKKwkJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKwkJCWlmIChpIDwgcGFja2FnZS0+cmV0X2luZm8zLmNvdW50KSB7CisKKwkJCQkvKiBUaGVzZSBhcmUgdGhlIHJlcXVpcmVkIHBhY2thZ2UgZWxlbWVudHMgKDAsIDEsIG9yIDIpICovCisKKwkJCQlzdGF0dXMgPQorCQkJCSAgICBhY3BpX25zX2NoZWNrX29iamVjdF90eXBlKHBhdGhuYW1lLAorCQkJCQkJCSAgICAgIGVsZW1lbnRzLAorCQkJCQkJCSAgICAgIHBhY2thZ2UtPgorCQkJCQkJCSAgICAgIHJldF9pbmZvMy4KKwkJCQkJCQkgICAgICBvYmplY3RfdHlwZVtpXSwKKwkJCQkJCQkgICAgICBpKTsKKwkJCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCQkJcmV0dXJuIChzdGF0dXMpOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJLyogVGhlc2UgYXJlIHRoZSBvcHRpb25hbCBwYWNrYWdlIGVsZW1lbnRzICovCisKKwkJCQlzdGF0dXMgPQorCQkJCSAgICBhY3BpX25zX2NoZWNrX29iamVjdF90eXBlKHBhdGhuYW1lLAorCQkJCQkJCSAgICAgIGVsZW1lbnRzLAorCQkJCQkJCSAgICAgIHBhY2thZ2UtPgorCQkJCQkJCSAgICAgIHJldF9pbmZvMy4KKwkJCQkJCQkgICAgICB0YWlsX29iamVjdF90eXBlLAorCQkJCQkJCSAgICAgIGkpOworCQkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJCQlyZXR1cm4gKHN0YXR1cyk7CisJCQkJfQorCQkJfQorCQkJZWxlbWVudHMrKzsKKwkJfQorCQlicmVhazsKKworCWNhc2UgQUNQSV9QVFlQRTJfUEtHX0NPVU5UOgorCisJCS8qIEZpcnN0IGVsZW1lbnQgaXMgdGhlIChJbnRlZ2VyKSBjb3VudCBvZiBzdWItcGFja2FnZXMgdG8gZm9sbG93ICovCisKKwkJc3RhdHVzID0gYWNwaV9uc19jaGVja19vYmplY3RfdHlwZShwYXRobmFtZSwgZWxlbWVudHMsCisJCQkJCQkgICBBQ1BJX1JUWVBFX0lOVEVHRVIsIDApOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCXJldHVybiAoc3RhdHVzKTsKKwkJfQorCisJCS8qCisJCSAqIENvdW50IGNhbm5vdCBiZSBsYXJnZXIgdGhhbiB0aGUgcGFyZW50IHBhY2thZ2UgbGVuZ3RoLCBidXQgYWxsb3cgaXQKKwkJICogdG8gYmUgc21hbGxlci4gVGhlID49IGFjY291bnRzIGZvciB0aGUgSW50ZWdlciBhYm92ZS4KKwkJICovCisJCWV4cGVjdGVkX2NvdW50ID0gKHUzMikgKCplbGVtZW50cyktPmludGVnZXIudmFsdWU7CisJCWlmIChleHBlY3RlZF9jb3VudCA+PSBjb3VudCkgeworCQkJZ290byBwYWNrYWdlX3Rvb19zbWFsbDsKKwkJfQorCisJCWNvdW50ID0gZXhwZWN0ZWRfY291bnQ7CisJCWVsZW1lbnRzKys7CisKKwkJLyogTm93IHdlIGNhbiB3YWxrIHRoZSBzdWItcGFja2FnZXMgKi8KKworCQkvKmxpbnQgLWZhbGx0aHJvdWdoICovCisKKwljYXNlIEFDUElfUFRZUEUyOgorCWNhc2UgQUNQSV9QVFlQRTJfRklYRUQ6CisJY2FzZSBBQ1BJX1BUWVBFMl9NSU46CisJY2FzZSBBQ1BJX1BUWVBFMl9DT1VOVDoKKworCQkvKgorCQkgKiBUaGVzZSB0eXBlcyBhbGwgcmV0dXJuIGEgc2luZ2xlIHBhY2thZ2UgdGhhdCBjb25zaXN0cyBvZiBhIHZhcmlhYmxlCisJCSAqIG51bWJlciBvZiBzdWItcGFja2FnZXMKKwkJICovCisJCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisJCQlzdWJfcGFja2FnZSA9ICplbGVtZW50czsKKwkJCXN1Yl9lbGVtZW50cyA9IHN1Yl9wYWNrYWdlLT5wYWNrYWdlLmVsZW1lbnRzOworCisJCQkvKiBFYWNoIHN1Yi1vYmplY3QgbXVzdCBiZSBvZiB0eXBlIFBhY2thZ2UgKi8KKworCQkJc3RhdHVzID0KKwkJCSAgICBhY3BpX25zX2NoZWNrX29iamVjdF90eXBlKHBhdGhuYW1lLCAmc3ViX3BhY2thZ2UsCisJCQkJCQkgICAgICBBQ1BJX1JUWVBFX1BBQ0tBR0UsIGkpOworCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQkJcmV0dXJuIChzdGF0dXMpOworCQkJfQorCisJCQkvKiBFeGFtaW5lIHRoZSBkaWZmZXJlbnQgdHlwZXMgb2Ygc3ViLXBhY2thZ2VzICovCisKKwkJCXN3aXRjaCAocGFja2FnZS0+cmV0X2luZm8udHlwZSkgeworCQkJY2FzZSBBQ1BJX1BUWVBFMjoKKwkJCWNhc2UgQUNQSV9QVFlQRTJfUEtHX0NPVU5UOgorCisJCQkJLyogRWFjaCBzdWJwYWNrYWdlIGhhcyBhIGZpeGVkIG51bWJlciBvZiBlbGVtZW50cyAqLworCisJCQkJZXhwZWN0ZWRfY291bnQgPQorCQkJCSAgICBwYWNrYWdlLT5yZXRfaW5mby5jb3VudDEgKworCQkJCSAgICBwYWNrYWdlLT5yZXRfaW5mby5jb3VudDI7CisJCQkJaWYgKHN1Yl9wYWNrYWdlLT5wYWNrYWdlLmNvdW50ICE9CisJCQkJICAgIGV4cGVjdGVkX2NvdW50KSB7CisJCQkJCWNvdW50ID0gc3ViX3BhY2thZ2UtPnBhY2thZ2UuY291bnQ7CisJCQkJCWdvdG8gcGFja2FnZV90b29fc21hbGw7CisJCQkJfQorCisJCQkJc3RhdHVzID0KKwkJCQkgICAgYWNwaV9uc19jaGVja19wYWNrYWdlX2VsZW1lbnRzKHBhdGhuYW1lLAorCQkJCQkJCQkgICBzdWJfZWxlbWVudHMsCisJCQkJCQkJCSAgIHBhY2thZ2UtPgorCQkJCQkJCQkgICByZXRfaW5mby4KKwkJCQkJCQkJICAgb2JqZWN0X3R5cGUxLAorCQkJCQkJCQkgICBwYWNrYWdlLT4KKwkJCQkJCQkJICAgcmV0X2luZm8uCisJCQkJCQkJCSAgIGNvdW50MSwKKwkJCQkJCQkJICAgcGFja2FnZS0+CisJCQkJCQkJCSAgIHJldF9pbmZvLgorCQkJCQkJCQkgICBvYmplY3RfdHlwZTIsCisJCQkJCQkJCSAgIHBhY2thZ2UtPgorCQkJCQkJCQkgICByZXRfaW5mby4KKwkJCQkJCQkJICAgY291bnQyKTsKKwkJCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCQkJcmV0dXJuIChzdGF0dXMpOworCQkJCX0KKwkJCQlicmVhazsKKworCQkJY2FzZSBBQ1BJX1BUWVBFMl9GSVhFRDoKKworCQkJCS8qIEVhY2ggc3ViLXBhY2thZ2UgaGFzIGEgZml4ZWQgbGVuZ3RoICovCisKKwkJCQlleHBlY3RlZF9jb3VudCA9IHBhY2thZ2UtPnJldF9pbmZvMi5jb3VudDsKKwkJCQlpZiAoc3ViX3BhY2thZ2UtPnBhY2thZ2UuY291bnQgPCBleHBlY3RlZF9jb3VudCkgeworCQkJCQljb3VudCA9IHN1Yl9wYWNrYWdlLT5wYWNrYWdlLmNvdW50OworCQkJCQlnb3RvIHBhY2thZ2VfdG9vX3NtYWxsOworCQkJCX0KKworCQkJCS8qIENoZWNrIHRoZSB0eXBlIG9mIGVhY2ggc3ViLXBhY2thZ2UgZWxlbWVudCAqLworCisJCQkJZm9yIChqID0gMDsgaiA8IGV4cGVjdGVkX2NvdW50OyBqKyspIHsKKwkJCQkJc3RhdHVzID0KKwkJCQkJICAgIGFjcGlfbnNfY2hlY2tfb2JqZWN0X3R5cGUocGF0aG5hbWUsCisJCQkJCQkmc3ViX2VsZW1lbnRzW2pdLAorCQkJCQkJcGFja2FnZS0+cmV0X2luZm8yLm9iamVjdF90eXBlW2pdLCBqKTsKKwkJCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQkJCQlyZXR1cm4gKHN0YXR1cyk7CisJCQkJCX0KKwkJCQl9CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgQUNQSV9QVFlQRTJfTUlOOgorCisJCQkJLyogRWFjaCBzdWItcGFja2FnZSBoYXMgYSB2YXJpYWJsZSBidXQgbWluaW11bSBsZW5ndGggKi8KKworCQkJCWV4cGVjdGVkX2NvdW50ID0gcGFja2FnZS0+cmV0X2luZm8uY291bnQxOworCQkJCWlmIChzdWJfcGFja2FnZS0+cGFja2FnZS5jb3VudCA8IGV4cGVjdGVkX2NvdW50KSB7CisJCQkJCWNvdW50ID0gc3ViX3BhY2thZ2UtPnBhY2thZ2UuY291bnQ7CisJCQkJCWdvdG8gcGFja2FnZV90b29fc21hbGw7CisJCQkJfQorCisJCQkJLyogQ2hlY2sgdGhlIHR5cGUgb2YgZWFjaCBzdWItcGFja2FnZSBlbGVtZW50ICovCisKKwkJCQlzdGF0dXMgPQorCQkJCSAgICBhY3BpX25zX2NoZWNrX3BhY2thZ2VfZWxlbWVudHMocGF0aG5hbWUsCisJCQkJCQkJCSAgIHN1Yl9lbGVtZW50cywKKwkJCQkJCQkJICAgcGFja2FnZS0+CisJCQkJCQkJCSAgIHJldF9pbmZvLgorCQkJCQkJCQkgICBvYmplY3RfdHlwZTEsCisJCQkJCQkJCSAgIHN1Yl9wYWNrYWdlLT4KKwkJCQkJCQkJICAgcGFja2FnZS4KKwkJCQkJCQkJICAgY291bnQsIDAsIDApOworCQkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJCQlyZXR1cm4gKHN0YXR1cyk7CisJCQkJfQorCQkJCWJyZWFrOworCisJCQljYXNlIEFDUElfUFRZUEUyX0NPVU5UOgorCisJCQkJLyogRmlyc3QgZWxlbWVudCBpcyB0aGUgKEludGVnZXIpIGNvdW50IG9mIGVsZW1lbnRzIHRvIGZvbGxvdyAqLworCisJCQkJc3RhdHVzID0KKwkJCQkgICAgYWNwaV9uc19jaGVja19vYmplY3RfdHlwZShwYXRobmFtZSwKKwkJCQkJCQkgICAgICBzdWJfZWxlbWVudHMsCisJCQkJCQkJICAgICAgQUNQSV9SVFlQRV9JTlRFR0VSLAorCQkJCQkJCSAgICAgIDApOworCQkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJCQlyZXR1cm4gKHN0YXR1cyk7CisJCQkJfQorCisJCQkJLyogTWFrZSBzdXJlIHBhY2thZ2UgaXMgbGFyZ2UgZW5vdWdoIGZvciB0aGUgQ291bnQgKi8KKworCQkJCWV4cGVjdGVkX2NvdW50ID0KKwkJCQkgICAgKHUzMikgKCpzdWJfZWxlbWVudHMpLT5pbnRlZ2VyLnZhbHVlOworCQkJCWlmIChzdWJfcGFja2FnZS0+cGFja2FnZS5jb3VudCA8IGV4cGVjdGVkX2NvdW50KSB7CisJCQkJCWNvdW50ID0gc3ViX3BhY2thZ2UtPnBhY2thZ2UuY291bnQ7CisJCQkJCWdvdG8gcGFja2FnZV90b29fc21hbGw7CisJCQkJfQorCisJCQkJLyogQ2hlY2sgdGhlIHR5cGUgb2YgZWFjaCBzdWItcGFja2FnZSBlbGVtZW50ICovCisKKwkJCQlzdGF0dXMgPQorCQkJCSAgICBhY3BpX25zX2NoZWNrX3BhY2thZ2VfZWxlbWVudHMocGF0aG5hbWUsCisJCQkJCQkJCSAgIChzdWJfZWxlbWVudHMKKwkJCQkJCQkJICAgICsgMSksCisJCQkJCQkJCSAgIHBhY2thZ2UtPgorCQkJCQkJCQkgICByZXRfaW5mby4KKwkJCQkJCQkJICAgb2JqZWN0X3R5cGUxLAorCQkJCQkJCQkgICAoZXhwZWN0ZWRfY291bnQKKwkJCQkJCQkJICAgIC0gMSksIDAsIDApOworCQkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJCQlyZXR1cm4gKHN0YXR1cyk7CisJCQkJfQorCQkJCWJyZWFrOworCisJCQlkZWZhdWx0OgorCQkJCWJyZWFrOworCQkJfQorCisJCQllbGVtZW50cysrOworCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKworCQkvKiBTaG91bGQgbm90IGdldCBoZXJlIGlmIHByZWRlZmluZWQgaW5mbyB0YWJsZSBpcyBjb3JyZWN0ICovCisKKwkJQUNQSV9XQVJOSU5HKChBRV9JTkZPLAorCQkJICAgICAgIiVzOiBJbnZhbGlkIGludGVybmFsIHJldHVybiB0eXBlIGluIHRhYmxlIGVudHJ5OiAlWCIsCisJCQkgICAgICBwYXRobmFtZSwgcGFja2FnZS0+cmV0X2luZm8udHlwZSkpOworCisJCXJldHVybiAoQUVfQU1MX0lOVEVSTkFMKTsKKwl9CisKKwlyZXR1cm4gKEFFX09LKTsKKworICAgICAgcGFja2FnZV90b29fc21hbGw6CisKKwkvKiBFcnJvciBleGl0IGZvciB0aGUgY2FzZSB3aXRoIGFuIGluY29ycmVjdCBwYWNrYWdlIGNvdW50ICovCisKKwlBQ1BJX1dBUk5JTkcoKEFFX0lORk8sICIlczogUmV0dXJuIFBhY2thZ2UgaXMgdG9vIHNtYWxsIC0gIgorCQkgICAgICAiZm91bmQgJXUsIGV4cGVjdGVkICV1IiwgcGF0aG5hbWUsIGNvdW50LAorCQkgICAgICBleHBlY3RlZF9jb3VudCkpOworCisJcmV0dXJuIChBRV9BTUxfT1BFUkFORF9WQUxVRSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfbnNfY2hlY2tfcGFja2FnZV9lbGVtZW50cworICoKKyAqIFBBUkFNRVRFUlM6ICBQYXRobmFtZSAgICAgICAgLSBGdWxsIHBhdGhuYW1lIHRvIHRoZSBub2RlIChmb3IgZXJyb3IgbXNncykKKyAqICAgICAgICAgICAgICBFbGVtZW50cyAgICAgICAgLSBQb2ludGVyIHRvIHRoZSBwYWNrYWdlIGVsZW1lbnRzIGFycmF5CisgKiAgICAgICAgICAgICAgVHlwZTEgICAgICAgICAgIC0gT2JqZWN0IHR5cGUgZm9yIGZpcnN0IGdyb3VwCisgKiAgICAgICAgICAgICAgQ291bnQxICAgICAgICAgIC0gQ291bnQgZm9yIGZpcnN0IGdyb3VwCisgKiAgICAgICAgICAgICAgVHlwZTIgICAgICAgICAgIC0gT2JqZWN0IHR5cGUgZm9yIHNlY29uZCBncm91cAorICogICAgICAgICAgICAgIENvdW50MiAgICAgICAgICAtIENvdW50IGZvciBzZWNvbmQgZ3JvdXAKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IENoZWNrIHRoYXQgYWxsIGVsZW1lbnRzIG9mIGEgcGFja2FnZSBhcmUgb2YgdGhlIGNvcnJlY3Qgb2JqZWN0CisgKiAgICAgICAgICAgICAgdHlwZS4gU3VwcG9ydHMgdXAgdG8gdHdvIGdyb3VwcyBvZiBkaWZmZXJlbnQgb2JqZWN0IHR5cGVzLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBhY3BpX3N0YXR1cworYWNwaV9uc19jaGVja19wYWNrYWdlX2VsZW1lbnRzKGNoYXIgKnBhdGhuYW1lLAorCQkJICAgICAgIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKiplbGVtZW50cywKKwkJCSAgICAgICB1OCB0eXBlMSwgdTMyIGNvdW50MSwgdTggdHlwZTIsIHUzMiBjb3VudDIpCit7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKnRoaXNfZWxlbWVudCA9IGVsZW1lbnRzOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwl1MzIgaTsKKworCS8qCisJICogVXAgdG8gdHdvIGdyb3VwcyBvZiBwYWNrYWdlIGVsZW1lbnRzIGFyZSBzdXBwb3J0ZWQgYnkgdGhlIGRhdGEKKwkgKiBzdHJ1Y3R1cmUuIEFsbCBlbGVtZW50cyBpbiBlYWNoIGdyb3VwIG11c3QgYmUgb2YgdGhlIHNhbWUgdHlwZS4KKwkgKiBUaGUgc2Vjb25kIGdyb3VwIGNhbiBoYXZlIGEgY291bnQgb2YgemVyby4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgY291bnQxOyBpKyspIHsKKwkJc3RhdHVzID0gYWNwaV9uc19jaGVja19vYmplY3RfdHlwZShwYXRobmFtZSwgdGhpc19lbGVtZW50LAorCQkJCQkJICAgdHlwZTEsIGkpOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCXJldHVybiAoc3RhdHVzKTsKKwkJfQorCQl0aGlzX2VsZW1lbnQrKzsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgY291bnQyOyBpKyspIHsKKwkJc3RhdHVzID0gYWNwaV9uc19jaGVja19vYmplY3RfdHlwZShwYXRobmFtZSwgdGhpc19lbGVtZW50LAorCQkJCQkJICAgdHlwZTIsIChpICsgY291bnQxKSk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJcmV0dXJuIChzdGF0dXMpOworCQl9CisJCXRoaXNfZWxlbWVudCsrOworCX0KKworCXJldHVybiAoQUVfT0spOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX25zX2NoZWNrX29iamVjdF90eXBlCisgKgorICogUEFSQU1FVEVSUzogIFBhdGhuYW1lICAgICAgICAtIEZ1bGwgcGF0aG5hbWUgdG8gdGhlIG5vZGUgKGZvciBlcnJvciBtc2dzKQorICogICAgICAgICAgICAgIHJldHVybl9vYmplY3RfcHRyIC0gUG9pbnRlciB0byB0aGUgb2JqZWN0IHJldHVybmVkIGZyb20gdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZhbHVhdGlvbiBvZiBhIG1ldGhvZCBvciBvYmplY3QKKyAqICAgICAgICAgICAgICBleHBlY3RlZF9idHlwZXMgLSBCaXRtYXAgb2YgZXhwZWN0ZWQgcmV0dXJuIHR5cGUocykKKyAqICAgICAgICAgICAgICBwYWNrYWdlX2luZGV4ICAgLSBJbmRleCBvZiBvYmplY3Qgd2l0aGluIHBhcmVudCBwYWNrYWdlIChpZgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGxpY2FibGUgLSBBQ1BJX05PVF9QQUNLQUdFIG90aGVyd2lzZSkKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IENoZWNrIHRoZSB0eXBlIG9mIHRoZSByZXR1cm4gb2JqZWN0IGFnYWluc3QgdGhlIGV4cGVjdGVkIG9iamVjdAorICogICAgICAgICAgICAgIHR5cGUocykuIFVzZSBvZiBCdHlwZSBhbGxvd3MgbXVsdGlwbGUgZXhwZWN0ZWQgb2JqZWN0IHR5cGVzLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBhY3BpX3N0YXR1cworYWNwaV9uc19jaGVja19vYmplY3RfdHlwZShjaGFyICpwYXRobmFtZSwKKwkJCSAgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKnJldHVybl9vYmplY3RfcHRyLAorCQkJICB1MzIgZXhwZWN0ZWRfYnR5cGVzLCB1MzIgcGFja2FnZV9pbmRleCkKK3sKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpyZXR1cm5fb2JqZWN0ID0gKnJldHVybl9vYmplY3RfcHRyOworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOworCXUzMiByZXR1cm5fYnR5cGU7CisJY2hhciB0eXBlX2J1ZmZlcls0OF07CS8qIFJvb20gZm9yIDUgdHlwZXMgKi8KKwl1MzIgdGhpc19ydHlwZTsKKwl1MzIgaTsKKwl1MzIgajsKKworCS8qCisJICogSWYgd2UgZ2V0IGEgTlVMTCByZXR1cm5fb2JqZWN0IGhlcmUsIGl0IGlzIGEgTlVMTCBwYWNrYWdlIGVsZW1lbnQsCisJICogYW5kIHRoaXMgaXMgYWx3YXlzIGFuIGVycm9yLgorCSAqLworCWlmICghcmV0dXJuX29iamVjdCkgeworCQlnb3RvIHR5cGVfZXJyb3JfZXhpdDsKKwl9CisKKwkvKiBBIE5hbWVzcGFjZSBub2RlIHNob3VsZCBub3QgZ2V0IGhlcmUsIGJ1dCBtYWtlIHN1cmUgKi8KKworCWlmIChBQ1BJX0dFVF9ERVNDUklQVE9SX1RZUEUocmV0dXJuX29iamVjdCkgPT0gQUNQSV9ERVNDX1RZUEVfTkFNRUQpIHsKKwkJQUNQSV9XQVJOSU5HKChBRV9JTkZPLAorCQkJICAgICAgIiVzOiBJbnZhbGlkIHJldHVybiB0eXBlIC0gRm91bmQgYSBOYW1lc3BhY2Ugbm9kZSBbJTQuNHNdIHR5cGUgJXMiLAorCQkJICAgICAgcGF0aG5hbWUsIHJldHVybl9vYmplY3QtPm5vZGUubmFtZS5hc2NpaSwKKwkJCSAgICAgIGFjcGlfdXRfZ2V0X3R5cGVfbmFtZShyZXR1cm5fb2JqZWN0LT5ub2RlLnR5cGUpKSk7CisJCXJldHVybiAoQUVfQU1MX09QRVJBTkRfVFlQRSk7CisJfQorCisJLyoKKwkgKiBDb252ZXJ0IHRoZSBvYmplY3QgdHlwZSAoQUNQSV9UWVBFX3h4eCkgdG8gYSBiaXRtYXBwZWQgb2JqZWN0IHR5cGUuCisJICogVGhlIGJpdG1hcHBlZCB0eXBlIGFsbG93cyBtdWx0aXBsZSBwb3NzaWJsZSByZXR1cm4gdHlwZXMuCisJICoKKwkgKiBOb3RlLCB0aGUgY2FzZXMgYmVsb3cgbXVzdCBoYW5kbGUgYWxsIG9mIHRoZSBwb3NzaWJsZSB0eXBlcyByZXR1cm5lZAorCSAqIGZyb20gYWxsIG9mIHRoZSBwcmVkZWZpbmVkIG5hbWVzIChpbmNsdWRpbmcgZWxlbWVudHMgb2YgcmV0dXJuZWQKKwkgKiBwYWNrYWdlcykKKwkgKi8KKwlzd2l0Y2ggKEFDUElfR0VUX09CSkVDVF9UWVBFKHJldHVybl9vYmplY3QpKSB7CisJY2FzZSBBQ1BJX1RZUEVfSU5URUdFUjoKKwkJcmV0dXJuX2J0eXBlID0gQUNQSV9SVFlQRV9JTlRFR0VSOworCQlicmVhazsKKworCWNhc2UgQUNQSV9UWVBFX0JVRkZFUjoKKwkJcmV0dXJuX2J0eXBlID0gQUNQSV9SVFlQRV9CVUZGRVI7CisJCWJyZWFrOworCisJY2FzZSBBQ1BJX1RZUEVfU1RSSU5HOgorCQlyZXR1cm5fYnR5cGUgPSBBQ1BJX1JUWVBFX1NUUklORzsKKwkJYnJlYWs7CisKKwljYXNlIEFDUElfVFlQRV9QQUNLQUdFOgorCQlyZXR1cm5fYnR5cGUgPSBBQ1BJX1JUWVBFX1BBQ0tBR0U7CisJCWJyZWFrOworCisJY2FzZSBBQ1BJX1RZUEVfTE9DQUxfUkVGRVJFTkNFOgorCQlyZXR1cm5fYnR5cGUgPSBBQ1BJX1JUWVBFX1JFRkVSRU5DRTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQkvKiBOb3Qgb25lIG9mIHRoZSBzdXBwb3J0ZWQgb2JqZWN0cywgbXVzdCBiZSBpbmNvcnJlY3QgKi8KKworCQlnb3RvIHR5cGVfZXJyb3JfZXhpdDsKKwl9CisKKwkvKiBJcyB0aGUgb2JqZWN0IG9uZSBvZiB0aGUgZXhwZWN0ZWQgdHlwZXM/ICovCisKKwlpZiAoIShyZXR1cm5fYnR5cGUgJiBleHBlY3RlZF9idHlwZXMpKSB7CisKKwkJLyogVHlwZSBtaXNtYXRjaCAtLSBhdHRlbXB0IHJlcGFpciBvZiB0aGUgcmV0dXJuZWQgb2JqZWN0ICovCisKKwkJc3RhdHVzID0gYWNwaV9uc19yZXBhaXJfb2JqZWN0KGV4cGVjdGVkX2J0eXBlcywgcGFja2FnZV9pbmRleCwKKwkJCQkJICAgICAgIHJldHVybl9vYmplY3RfcHRyKTsKKwkJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCQlyZXR1cm4gKHN0YXR1cyk7CisJCX0KKwkJZ290byB0eXBlX2Vycm9yX2V4aXQ7CisJfQorCisJLyogRm9yIHJlZmVyZW5jZSBvYmplY3RzLCBjaGVjayB0aGF0IHRoZSByZWZlcmVuY2UgdHlwZSBpcyBjb3JyZWN0ICovCisKKwlpZiAoQUNQSV9HRVRfT0JKRUNUX1RZUEUocmV0dXJuX29iamVjdCkgPT0gQUNQSV9UWVBFX0xPQ0FMX1JFRkVSRU5DRSkgeworCQlzdGF0dXMgPSBhY3BpX25zX2NoZWNrX3JlZmVyZW5jZShwYXRobmFtZSwgcmV0dXJuX29iamVjdCk7CisJfQorCisJcmV0dXJuIChzdGF0dXMpOworCisgICAgICB0eXBlX2Vycm9yX2V4aXQ6CisKKwkvKiBDcmVhdGUgYSBzdHJpbmcgd2l0aCBhbGwgZXhwZWN0ZWQgdHlwZXMgZm9yIHRoaXMgcHJlZGVmaW5lZCBvYmplY3QgKi8KKworCWogPSAxOworCXR5cGVfYnVmZmVyWzBdID0gMDsKKwl0aGlzX3J0eXBlID0gQUNQSV9SVFlQRV9JTlRFR0VSOworCisJZm9yIChpID0gMDsgaSA8IEFDUElfTlVNX1JUWVBFUzsgaSsrKSB7CisKKwkJLyogSWYgb25lIG9mIHRoZSBleHBlY3RlZCB0eXBlcywgY29uY2F0ZW5hdGUgdGhlIG5hbWUgb2YgdGhpcyB0eXBlICovCisKKwkJaWYgKGV4cGVjdGVkX2J0eXBlcyAmIHRoaXNfcnR5cGUpIHsKKwkJCUFDUElfU1RSQ0FUKHR5cGVfYnVmZmVyLCAmYWNwaV9ydHlwZV9uYW1lc1tpXVtqXSk7CisJCQlqID0gMDsJLyogVXNlIG5hbWUgc2VwYXJhdG9yIGZyb20gbm93IG9uICovCisJCX0KKwkJdGhpc19ydHlwZSA8PD0gMTsJLyogTmV4dCBSdHlwZSAqLworCX0KKworCWlmIChwYWNrYWdlX2luZGV4ID09IEFDUElfTk9UX1BBQ0tBR0UpIHsKKwkJQUNQSV9XQVJOSU5HKChBRV9JTkZPLAorCQkJICAgICAgIiVzOiBSZXR1cm4gdHlwZSBtaXNtYXRjaCAtIGZvdW5kICVzLCBleHBlY3RlZCAlcyIsCisJCQkgICAgICBwYXRobmFtZSwKKwkJCSAgICAgIGFjcGlfdXRfZ2V0X29iamVjdF90eXBlX25hbWUocmV0dXJuX29iamVjdCksCisJCQkgICAgICB0eXBlX2J1ZmZlcikpOworCX0gZWxzZSB7CisJCUFDUElfV0FSTklORygoQUVfSU5GTywKKwkJCSAgICAgICIlczogUmV0dXJuIFBhY2thZ2UgdHlwZSBtaXNtYXRjaCBhdCBpbmRleCAldSAtICIKKwkJCSAgICAgICJmb3VuZCAlcywgZXhwZWN0ZWQgJXMiLCBwYXRobmFtZSwgcGFja2FnZV9pbmRleCwKKwkJCSAgICAgIGFjcGlfdXRfZ2V0X29iamVjdF90eXBlX25hbWUocmV0dXJuX29iamVjdCksCisJCQkgICAgICB0eXBlX2J1ZmZlcikpOworCX0KKworCXJldHVybiAoQUVfQU1MX09QRVJBTkRfVFlQRSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfbnNfY2hlY2tfcmVmZXJlbmNlCisgKgorICogUEFSQU1FVEVSUzogIFBhdGhuYW1lICAgICAgICAtIEZ1bGwgcGF0aG5hbWUgdG8gdGhlIG5vZGUgKGZvciBlcnJvciBtc2dzKQorICogICAgICAgICAgICAgIHJldHVybl9vYmplY3QgICAtIE9iamVjdCByZXR1cm5lZCBmcm9tIHRoZSBldmFsdWF0aW9uIG9mIGEKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Qgb3Igb2JqZWN0CisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBDaGVjayBhIHJldHVybmVkIHJlZmVyZW5jZSBvYmplY3QgZm9yIHRoZSBjb3JyZWN0IHJlZmVyZW5jZQorICogICAgICAgICAgICAgIHR5cGUuIFRoZSBvbmx5IHJlZmVyZW5jZSB0eXBlIHRoYXQgY2FuIGJlIHJldHVybmVkIGZyb20gYQorICogICAgICAgICAgICAgIHByZWRlZmluZWQgbWV0aG9kIGlzIGEgbmFtZWQgcmVmZXJlbmNlLiBBbGwgb3RoZXJzIGFyZSBpbnZhbGlkLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBhY3BpX3N0YXR1cworYWNwaV9uc19jaGVja19yZWZlcmVuY2UoY2hhciAqcGF0aG5hbWUsCisJCQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpyZXR1cm5fb2JqZWN0KQoreworCisJLyoKKwkgKiBDaGVjayB0aGUgcmVmZXJlbmNlIG9iamVjdCBmb3IgdGhlIGNvcnJlY3QgcmVmZXJlbmNlIHR5cGUgKG9wY29kZSkuCisJICogVGhlIG9ubHkgdHlwZSBvZiByZWZlcmVuY2UgdGhhdCBjYW4gYmUgY29udmVydGVkIHRvIGFuIHVuaW9uIGFjcGlfb2JqZWN0IGlzCisJICogYSByZWZlcmVuY2UgdG8gYSBuYW1lZCBvYmplY3QgKHJlZmVyZW5jZSBjbGFzczogTkFNRSkKKwkgKi8KKwlpZiAocmV0dXJuX29iamVjdC0+cmVmZXJlbmNlLmNsYXNzID09IEFDUElfUkVGQ0xBU1NfTkFNRSkgeworCQlyZXR1cm4gKEFFX09LKTsKKwl9CisKKwlBQ1BJX1dBUk5JTkcoKEFFX0lORk8sCisJCSAgICAgICIlczogUmV0dXJuIHR5cGUgbWlzbWF0Y2ggLSB1bmV4cGVjdGVkIHJlZmVyZW5jZSBvYmplY3QgdHlwZSBbJXNdICUyLjJYIiwKKwkJICAgICAgcGF0aG5hbWUsIGFjcGlfdXRfZ2V0X3JlZmVyZW5jZV9uYW1lKHJldHVybl9vYmplY3QpLAorCQkgICAgICByZXR1cm5fb2JqZWN0LT5yZWZlcmVuY2UuY2xhc3MpKTsKKworCXJldHVybiAoQUVfQU1MX09QRVJBTkRfVFlQRSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfbnNfcmVwYWlyX29iamVjdAorICoKKyAqIFBBUkFNRVRFUlM6ICBQYXRobmFtZSAgICAgICAgLSBGdWxsIHBhdGhuYW1lIHRvIHRoZSBub2RlIChmb3IgZXJyb3IgbXNncykKKyAqICAgICAgICAgICAgICBwYWNrYWdlX2luZGV4ICAgLSBVc2VkIHRvIGRldGVybWluZSBpZiB0YXJnZXQgaXMgaW4gYSBwYWNrYWdlCisgKiAgICAgICAgICAgICAgcmV0dXJuX29iamVjdF9wdHIgLSBQb2ludGVyIHRvIHRoZSBvYmplY3QgcmV0dXJuZWQgZnJvbSB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmFsdWF0aW9uIG9mIGEgbWV0aG9kIG9yIG9iamVjdAorICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMuIEFFX09LIGlmIHJlcGFpciB3YXMgc3VjY2Vzc2Z1bC4KKyAqCisgKiBERVNDUklQVElPTjogQXR0ZW1wdCB0byByZXBhaXIvY29udmVydCBhIHJldHVybiBvYmplY3Qgb2YgYSB0eXBlIHRoYXQgd2FzCisgKiAgICAgICAgICAgICAgbm90IGV4cGVjdGVkLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBhY3BpX3N0YXR1cworYWNwaV9uc19yZXBhaXJfb2JqZWN0KHUzMiBleHBlY3RlZF9idHlwZXMsCisJCSAgICAgIHUzMiBwYWNrYWdlX2luZGV4LAorCQkgICAgICB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICoqcmV0dXJuX29iamVjdF9wdHIpCit7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqcmV0dXJuX29iamVjdCA9ICpyZXR1cm5fb2JqZWN0X3B0cjsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpuZXdfb2JqZWN0OworCWFjcGlfc2l6ZSBsZW5ndGg7CisKKwlzd2l0Y2ggKEFDUElfR0VUX09CSkVDVF9UWVBFKHJldHVybl9vYmplY3QpKSB7CisJY2FzZSBBQ1BJX1RZUEVfQlVGRkVSOgorCisJCWlmICghKGV4cGVjdGVkX2J0eXBlcyAmIEFDUElfUlRZUEVfU1RSSU5HKSkgeworCQkJcmV0dXJuIChBRV9BTUxfT1BFUkFORF9UWVBFKTsKKwkJfQorCisJCS8qCisJCSAqIEhhdmUgYSBCdWZmZXIsIGV4cGVjdGVkIGEgU3RyaW5nLCBjb252ZXJ0LiBVc2UgYSB0b19zdHJpbmcKKwkJICogY29udmVyc2lvbiwgbm8gdHJhbnNmb3JtIHBlcmZvcm1lZCBvbiB0aGUgYnVmZmVyIGRhdGEuIFRoZSBiZXN0CisJCSAqIGV4YW1wbGUgb2YgdGhpcyBpcyB0aGUgX0JJRiBtZXRob2QsIHdoZXJlIHRoZSBzdHJpbmcgZGF0YSBmcm9tCisJCSAqIHRoZSBiYXR0ZXJ5IGlzIG9mdGVuIChpbmNvcnJlY3RseSkgcmV0dXJuZWQgYXMgYnVmZmVyIG9iamVjdChzKS4KKwkJICovCisJCWxlbmd0aCA9IDA7CisJCXdoaWxlICgobGVuZ3RoIDwgcmV0dXJuX29iamVjdC0+YnVmZmVyLmxlbmd0aCkgJiYKKwkJICAgICAgIChyZXR1cm5fb2JqZWN0LT5idWZmZXIucG9pbnRlcltsZW5ndGhdKSkgeworCQkJbGVuZ3RoKys7CisJCX0KKworCQkvKiBBbGxvY2F0ZSBhIG5ldyBzdHJpbmcgb2JqZWN0ICovCisKKwkJbmV3X29iamVjdCA9IGFjcGlfdXRfY3JlYXRlX3N0cmluZ19vYmplY3QobGVuZ3RoKTsKKwkJaWYgKCFuZXdfb2JqZWN0KSB7CisJCQlyZXR1cm4gKEFFX05PX01FTU9SWSk7CisJCX0KKworCQkvKgorCQkgKiBDb3B5IHRoZSByYXcgYnVmZmVyIGRhdGEgd2l0aCBubyB0cmFuc2Zvcm0uIFN0cmluZyBpcyBhbHJlYWR5IE5VTEwKKwkJICogdGVybWluYXRlZCBhdCBMZW5ndGgrMS4KKwkJICovCisJCUFDUElfTUVNQ1BZKG5ld19vYmplY3QtPnN0cmluZy5wb2ludGVyLAorCQkJICAgIHJldHVybl9vYmplY3QtPmJ1ZmZlci5wb2ludGVyLCBsZW5ndGgpOworCisJCS8qIEluc3RhbGwgdGhlIG5ldyByZXR1cm4gb2JqZWN0ICovCisKKwkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKHJldHVybl9vYmplY3QpOworCQkqcmV0dXJuX29iamVjdF9wdHIgPSBuZXdfb2JqZWN0OworCisJCS8qCisJCSAqIElmIHRoZSBvYmplY3QgaXMgYSBwYWNrYWdlIGVsZW1lbnQsIHdlIG5lZWQgdG86CisJCSAqIDEuIERlY3JlbWVudCB0aGUgcmVmZXJlbmNlIGNvdW50IG9mIHRoZSBvcmlnbmFsIG9iamVjdCwgaXQgd2FzCisJCSAqICAgIGluY3JlbWVudGVkIHdoZW4gYnVpbGRpbmcgdGhlIHBhY2thZ2UKKwkJICogMi4gSW5jcmVtZW50IHRoZSByZWZlcmVuY2UgY291bnQgb2YgdGhlIG5ldyBvYmplY3QsIGl0IHdpbGwgYmUKKwkJICogICAgZGVjcmVtZW50ZWQgd2hlbiByZWxlYXNpbmcgdGhlIHBhY2thZ2UKKwkJICovCisJCWlmIChwYWNrYWdlX2luZGV4ICE9IEFDUElfTk9UX1BBQ0tBR0UpIHsKKwkJCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZShyZXR1cm5fb2JqZWN0KTsKKwkJCWFjcGlfdXRfYWRkX3JlZmVyZW5jZShuZXdfb2JqZWN0KTsKKwkJfQorCQlyZXR1cm4gKEFFX09LKTsKKworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCXJldHVybiAoQUVfQU1MX09QRVJBTkRfVFlQRSk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL25zc2VhcmNoLmMgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL25zc2VhcmNoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmZlYTEzZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvbnNzZWFyY2guYwpAQCAtMCwwICsxLDQxNSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBNb2R1bGUgTmFtZTogbnNzZWFyY2ggLSBOYW1lc3BhY2Ugc2VhcmNoCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDgsIEludGVsIENvcnAuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCisgKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSBhdCBtaW5pbXVtIGEgZGlzY2xhaW1lcgorICogICAgc3Vic3RhbnRpYWxseSBzaW1pbGFyIHRvIHRoZSAiTk8gV0FSUkFOVFkiIGRpc2NsYWltZXIgYmVsb3cKKyAqICAgICgiRGlzY2xhaW1lciIpIGFuZCBhbnkgcmVkaXN0cmlidXRpb24gbXVzdCBiZSBjb25kaXRpb25lZCB1cG9uCisgKiAgICBpbmNsdWRpbmcgYSBzdWJzdGFudGlhbGx5IHNpbWlsYXIgRGlzY2xhaW1lciByZXF1aXJlbWVudCBmb3IgZnVydGhlcgorICogICAgYmluYXJ5IHJlZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzCisgKiAgICBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIE5PIFdBUlJBTlRZCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORworICogSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCisgKi8KKworI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgorI2luY2x1ZGUgImFjY29tbW9uLmgiCisjaW5jbHVkZSAiYWNuYW1lc3AuaCIKKworI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfTkFNRVNQQUNFCitBQ1BJX01PRFVMRV9OQU1FKCJuc3NlYXJjaCIpCisKKy8qIExvY2FsIHByb3RvdHlwZXMgKi8KK3N0YXRpYyBhY3BpX3N0YXR1cworYWNwaV9uc19zZWFyY2hfcGFyZW50X3RyZWUodTMyIHRhcmdldF9uYW1lLAorCQkJICAgc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGUsCisJCQkgICBhY3BpX29iamVjdF90eXBlIHR5cGUsCisJCQkgICBzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqKnJldHVybl9ub2RlKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9uc19zZWFyY2hfb25lX3Njb3BlCisgKgorICogUEFSQU1FVEVSUzogIHRhcmdldF9uYW1lICAgICAtIEFzY2lpIEFDUEkgbmFtZSB0byBzZWFyY2ggZm9yCisgKiAgICAgICAgICAgICAgcGFyZW50X25vZGUgICAgIC0gU3RhcnRpbmcgbm9kZSB3aGVyZSBzZWFyY2ggd2lsbCBiZWdpbgorICogICAgICAgICAgICAgIFR5cGUgICAgICAgICAgICAtIE9iamVjdCB0eXBlIHRvIG1hdGNoCisgKiAgICAgICAgICAgICAgcmV0dXJuX25vZGUgICAgIC0gV2hlcmUgdGhlIG1hdGNoZWQgTmFtZWQgb2JqIGlzIHJldHVybmVkCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBTZWFyY2ggYSBzaW5nbGUgbGV2ZWwgb2YgdGhlIG5hbWVzcGFjZS4gUGVyZm9ybXMgYQorICogICAgICAgICAgICAgIHNpbXBsZSBzZWFyY2ggb2YgdGhlIHNwZWNpZmllZCBsZXZlbCwgYW5kIGRvZXMgbm90IGFkZAorICogICAgICAgICAgICAgIGVudHJpZXMgb3Igc2VhcmNoIHBhcmVudHMuCisgKgorICoKKyAqICAgICAgTmFtZWQgb2JqZWN0IGxpc3RzIGFyZSBidWlsdCAoYW5kIHN1YnNlcXVlbnRseSBkdW1wZWQpIGluIHRoZQorICogICAgICBvcmRlciBpbiB3aGljaCB0aGUgbmFtZXMgYXJlIGVuY291bnRlcmVkIGR1cmluZyB0aGUgbmFtZXNwYWNlIGxvYWQ7CisgKgorICogICAgICBBbGwgbmFtZXNwYWNlIHNlYXJjaGluZyBpcyBsaW5lYXIgaW4gdGhpcyBpbXBsZW1lbnRhdGlvbiwgYnV0CisgKiAgICAgIGNvdWxkIGJlIGVhc2lseSBtb2RpZmllZCB0byBzdXBwb3J0IGFueSBpbXByb3ZlZCBzZWFyY2gKKyAqICAgICAgYWxnb3JpdGhtLiBIb3dldmVyLCB0aGUgbGluZWFyIHNlYXJjaCB3YXMgY2hvc2VuIGZvciBzaW1wbGljaXR5CisgKiAgICAgIGFuZCBiZWNhdXNlIHRoZSB0cmVlcyBhcmUgc21hbGwgYW5kIHRoZSBvdGhlciBpbnRlcnByZXRlcgorICogICAgICBleGVjdXRpb24gb3ZlcmhlYWQgaXMgcmVsYXRpdmVseSBoaWdoLgorICoKKyAqICAgICAgTm90ZTogQ1BVIGV4ZWN1dGlvbiBhbmFseXNpcyBoYXMgc2hvd24gdGhhdCB0aGUgQU1MIGludGVycHJldGVyIHNwZW5kcworICogICAgICBhIHZlcnkgc21hbGwgcGVyY2VudGFnZSBvZiBpdHMgdGltZSBzZWFyY2hpbmcgdGhlIG5hbWVzcGFjZS4gVGhlcmVmb3JlLAorICogICAgICB0aGUgbGluZWFyIHNlYXJjaCBzZWVtcyB0byBiZSBzdWZmaWNpZW50LCBhcyB0aGVyZSB3b3VsZCBzZWVtIHRvIGJlCisgKiAgICAgIGxpdHRsZSB2YWx1ZSBpbiBpbXByb3ZpbmcgdGhlIHNlYXJjaC4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCithY3BpX3N0YXR1cworYWNwaV9uc19zZWFyY2hfb25lX3Njb3BlKHUzMiB0YXJnZXRfbmFtZSwKKwkJCSBzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqcGFyZW50X25vZGUsCisJCQkgYWNwaV9vYmplY3RfdHlwZSB0eXBlLAorCQkJIHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICoqcmV0dXJuX25vZGUpCit7CisJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGU7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKG5zX3NlYXJjaF9vbmVfc2NvcGUpOworCisjaWZkZWYgQUNQSV9ERUJVR19PVVRQVVQKKwlpZiAoQUNQSV9MVl9OQU1FUyAmIGFjcGlfZGJnX2xldmVsKSB7CisJCWNoYXIgKnNjb3BlX25hbWU7CisKKwkJc2NvcGVfbmFtZSA9IGFjcGlfbnNfZ2V0X2V4dGVybmFsX3BhdGhuYW1lKHBhcmVudF9ub2RlKTsKKwkJaWYgKHNjb3BlX25hbWUpIHsKKwkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfTkFNRVMsCisJCQkJCSAgIlNlYXJjaGluZyAlcyAoJXApIEZvciBbJTQuNHNdICglcylcbiIsCisJCQkJCSAgc2NvcGVfbmFtZSwgcGFyZW50X25vZGUsCisJCQkJCSAgQUNQSV9DQVNUX1BUUihjaGFyLCAmdGFyZ2V0X25hbWUpLAorCQkJCQkgIGFjcGlfdXRfZ2V0X3R5cGVfbmFtZSh0eXBlKSkpOworCisJCQlBQ1BJX0ZSRUUoc2NvcGVfbmFtZSk7CisJCX0KKwl9CisjZW5kaWYKKworCS8qCisJICogU2VhcmNoIGZvciBuYW1lIGF0IHRoaXMgbmFtZXNwYWNlIGxldmVsLCB3aGljaCBpcyB0byBzYXkgdGhhdCB3ZQorCSAqIG11c3Qgc2VhcmNoIGZvciB0aGUgbmFtZSBhbW9uZyB0aGUgY2hpbGRyZW4gb2YgdGhpcyBvYmplY3QKKwkgKi8KKwlub2RlID0gcGFyZW50X25vZGUtPmNoaWxkOworCXdoaWxlIChub2RlKSB7CisKKwkJLyogQ2hlY2sgZm9yIG1hdGNoIGFnYWluc3QgdGhlIG5hbWUgKi8KKworCQlpZiAobm9kZS0+bmFtZS5pbnRlZ2VyID09IHRhcmdldF9uYW1lKSB7CisKKwkJCS8qIFJlc29sdmUgYSBjb250cm9sIG1ldGhvZCBhbGlhcyBpZiBhbnkgKi8KKworCQkJaWYgKGFjcGlfbnNfZ2V0X3R5cGUobm9kZSkgPT0KKwkJCSAgICBBQ1BJX1RZUEVfTE9DQUxfTUVUSE9EX0FMSUFTKSB7CisJCQkJbm9kZSA9CisJCQkJICAgIEFDUElfQ0FTVF9QVFIoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUsCisJCQkJCQkgIG5vZGUtPm9iamVjdCk7CisJCQl9CisKKwkJCS8qIEZvdW5kIG1hdGNoaW5nIGVudHJ5ICovCisKKwkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfTkFNRVMsCisJCQkJCSAgIk5hbWUgWyU0LjRzXSAoJXMpICVwIGZvdW5kIGluIHNjb3BlIFslNC40c10gJXBcbiIsCisJCQkJCSAgQUNQSV9DQVNUX1BUUihjaGFyLCAmdGFyZ2V0X25hbWUpLAorCQkJCQkgIGFjcGlfdXRfZ2V0X3R5cGVfbmFtZShub2RlLT50eXBlKSwKKwkJCQkJICBub2RlLAorCQkJCQkgIGFjcGlfdXRfZ2V0X25vZGVfbmFtZShwYXJlbnRfbm9kZSksCisJCQkJCSAgcGFyZW50X25vZGUpKTsKKworCQkJKnJldHVybl9ub2RlID0gbm9kZTsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CisJCX0KKworCQkvKgorCQkgKiBUaGUgbGFzdCBlbnRyeSBpbiB0aGUgbGlzdCBwb2ludHMgYmFjayB0byB0aGUgcGFyZW50LAorCQkgKiBzbyBhIGZsYWcgaXMgdXNlZCB0byBpbmRpY2F0ZSB0aGUgZW5kLW9mLWxpc3QKKwkJICovCisJCWlmIChub2RlLT5mbGFncyAmIEFOT0JKX0VORF9PRl9QRUVSX0xJU1QpIHsKKworCQkJLyogU2VhcmNoZWQgZW50aXJlIGxpc3QsIHdlIGFyZSBkb25lICovCisKKwkJCWJyZWFrOworCQl9CisKKwkJLyogRGlkbid0IG1hdGNoIG5hbWUsIG1vdmUgb24gdG8gdGhlIG5leHQgcGVlciBvYmplY3QgKi8KKworCQlub2RlID0gbm9kZS0+cGVlcjsKKwl9CisKKwkvKiBTZWFyY2hlZCBlbnRpcmUgbmFtZXNwYWNlIGxldmVsLCBub3QgZm91bmQgKi8KKworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfTkFNRVMsCisJCQkgICJOYW1lIFslNC40c10gKCVzKSBub3QgZm91bmQgaW4gc2VhcmNoIGluIHNjb3BlIFslNC40c10gJXAgZmlyc3QgY2hpbGQgJXBcbiIsCisJCQkgIEFDUElfQ0FTVF9QVFIoY2hhciwgJnRhcmdldF9uYW1lKSwKKwkJCSAgYWNwaV91dF9nZXRfdHlwZV9uYW1lKHR5cGUpLAorCQkJICBhY3BpX3V0X2dldF9ub2RlX25hbWUocGFyZW50X25vZGUpLCBwYXJlbnRfbm9kZSwKKwkJCSAgcGFyZW50X25vZGUtPmNoaWxkKSk7CisKKwlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9UX0ZPVU5EKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9uc19zZWFyY2hfcGFyZW50X3RyZWUKKyAqCisgKiBQQVJBTUVURVJTOiAgdGFyZ2V0X25hbWUgICAgIC0gQXNjaWkgQUNQSSBuYW1lIHRvIHNlYXJjaCBmb3IKKyAqICAgICAgICAgICAgICBOb2RlICAgICAgICAgICAgLSBTdGFydGluZyBub2RlIHdoZXJlIHNlYXJjaCB3aWxsIGJlZ2luCisgKiAgICAgICAgICAgICAgVHlwZSAgICAgICAgICAgIC0gT2JqZWN0IHR5cGUgdG8gbWF0Y2gKKyAqICAgICAgICAgICAgICByZXR1cm5fbm9kZSAgICAgLSBXaGVyZSB0aGUgbWF0Y2hlZCBOb2RlIGlzIHJldHVybmVkCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBDYWxsZWQgd2hlbiBhIG5hbWUgaGFzIG5vdCBiZWVuIGZvdW5kIGluIHRoZSBjdXJyZW50IG5hbWVzcGFjZQorICogICAgICAgICAgICAgIGxldmVsLiBCZWZvcmUgYWRkaW5nIGl0IG9yIGdpdmluZyB1cCwgQUNQSSBzY29wZSBydWxlcyByZXF1aXJlCisgKiAgICAgICAgICAgICAgc2VhcmNoaW5nIGVuY2xvc2luZyBzY29wZXMgaW4gY2FzZXMgaWRlbnRpZmllZCBieSBhY3BpX25zX2xvY2FsKCkuCisgKgorICogICAgICAgICAgICAgICJBIG5hbWUgaXMgbG9jYXRlZCBieSBmaW5kaW5nIHRoZSBtYXRjaGluZyBuYW1lIGluIHRoZSBjdXJyZW50CisgKiAgICAgICAgICAgICAgbmFtZSBzcGFjZSwgYW5kIHRoZW4gaW4gdGhlIHBhcmVudCBuYW1lIHNwYWNlLiBJZiB0aGUgcGFyZW50CisgKiAgICAgICAgICAgICAgbmFtZSBzcGFjZSBkb2VzIG5vdCBjb250YWluIHRoZSBuYW1lLCB0aGUgc2VhcmNoIGNvbnRpbnVlcworICogICAgICAgICAgICAgIHJlY3Vyc2l2ZWx5IHVudGlsIGVpdGhlciB0aGUgbmFtZSBpcyBmb3VuZCBvciB0aGUgbmFtZSBzcGFjZQorICogICAgICAgICAgICAgIGRvZXMgbm90IGhhdmUgYSBwYXJlbnQgKHRoZSByb290IG9mIHRoZSBuYW1lIHNwYWNlKS4gVGhpcworICogICAgICAgICAgICAgIGluZGljYXRlcyB0aGF0IHRoZSBuYW1lIGlzIG5vdCBmb3VuZCIgKEZyb20gQUNQSSBTcGVjaWZpY2F0aW9uLAorICogICAgICAgICAgICAgIHNlY3Rpb24gNS4zKQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBhY3BpX3N0YXR1cworYWNwaV9uc19zZWFyY2hfcGFyZW50X3RyZWUodTMyIHRhcmdldF9uYW1lLAorCQkJICAgc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGUsCisJCQkgICBhY3BpX29iamVjdF90eXBlIHR5cGUsCisJCQkgICBzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqKnJldHVybl9ub2RlKQoreworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqcGFyZW50X25vZGU7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKG5zX3NlYXJjaF9wYXJlbnRfdHJlZSk7CisKKwlwYXJlbnRfbm9kZSA9IGFjcGlfbnNfZ2V0X3BhcmVudF9ub2RlKG5vZGUpOworCisJLyoKKwkgKiBJZiB0aGVyZSBpcyBubyBwYXJlbnQgKGkuZS4sIHdlIGFyZSBhdCB0aGUgcm9vdCkgb3IgdHlwZSBpcyAibG9jYWwiLAorCSAqIHdlIHdvbid0IGJlIHNlYXJjaGluZyB0aGUgcGFyZW50IHRyZWUuCisJICovCisJaWYgKCFwYXJlbnRfbm9kZSkgeworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX05BTUVTLCAiWyU0LjRzXSBoYXMgbm8gcGFyZW50XG4iLAorCQkJCSAgQUNQSV9DQVNUX1BUUihjaGFyLCAmdGFyZ2V0X25hbWUpKSk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT1RfRk9VTkQpOworCX0KKworCWlmIChhY3BpX25zX2xvY2FsKHR5cGUpKSB7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfTkFNRVMsCisJCQkJICAiWyU0LjRzXSB0eXBlIFslc10gbXVzdCBiZSBsb2NhbCB0byB0aGlzIHNjb3BlIChubyBwYXJlbnQgc2VhcmNoKVxuIiwKKwkJCQkgIEFDUElfQ0FTVF9QVFIoY2hhciwgJnRhcmdldF9uYW1lKSwKKwkJCQkgIGFjcGlfdXRfZ2V0X3R5cGVfbmFtZSh0eXBlKSkpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9UX0ZPVU5EKTsKKwl9CisKKwkvKiBTZWFyY2ggdGhlIHBhcmVudCB0cmVlICovCisKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX05BTUVTLAorCQkJICAiU2VhcmNoaW5nIHBhcmVudCBbJTQuNHNdIGZvciBbJTQuNHNdXG4iLAorCQkJICBhY3BpX3V0X2dldF9ub2RlX25hbWUocGFyZW50X25vZGUpLAorCQkJICBBQ1BJX0NBU1RfUFRSKGNoYXIsICZ0YXJnZXRfbmFtZSkpKTsKKworCS8qCisJICogU2VhcmNoIHBhcmVudHMgdW50aWwgdGFyZ2V0IGlzIGZvdW5kIG9yIHdlIGhhdmUgYmFja2VkIHVwIHRvIHRoZSByb290CisJICovCisJd2hpbGUgKHBhcmVudF9ub2RlKSB7CisJCS8qCisJCSAqIFNlYXJjaCBwYXJlbnQgc2NvcGUuIFVzZSBUWVBFX0FOWSBiZWNhdXNlIHdlIGRvbid0IGNhcmUgYWJvdXQgdGhlCisJCSAqIG9iamVjdCB0eXBlIGF0IHRoaXMgcG9pbnQsIHdlIG9ubHkgY2FyZSBhYm91dCB0aGUgZXhpc3RlbmNlIG9mCisJCSAqIHRoZSBhY3R1YWwgbmFtZSB3ZSBhcmUgc2VhcmNoaW5nIGZvci4gVHlwZWNoZWNraW5nIGNvbWVzIGxhdGVyLgorCQkgKi8KKwkJc3RhdHVzID0KKwkJICAgIGFjcGlfbnNfc2VhcmNoX29uZV9zY29wZSh0YXJnZXRfbmFtZSwgcGFyZW50X25vZGUsCisJCQkJCSAgICAgQUNQSV9UWVBFX0FOWSwgcmV0dXJuX25vZGUpOworCQlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpIHsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworCQl9CisKKwkJLyogTm90IGZvdW5kIGhlcmUsIGdvIHVwIGFub3RoZXIgbGV2ZWwgKHVudGlsIHdlIHJlYWNoIHRoZSByb290KSAqLworCisJCXBhcmVudF9ub2RlID0gYWNwaV9uc19nZXRfcGFyZW50X25vZGUocGFyZW50X25vZGUpOworCX0KKworCS8qIE5vdCBmb3VuZCBpbiBwYXJlbnQgdHJlZSAqLworCisJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PVF9GT1VORCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfbnNfc2VhcmNoX2FuZF9lbnRlcgorICoKKyAqIFBBUkFNRVRFUlM6ICB0YXJnZXRfbmFtZSAgICAgICAgIC0gQXNjaWkgQUNQSSBuYW1lIHRvIHNlYXJjaCBmb3IgKDQgY2hhcnMpCisgKiAgICAgICAgICAgICAgd2Fsa19zdGF0ZSAgICAgICAgICAtIEN1cnJlbnQgc3RhdGUgb2YgdGhlIHdhbGsKKyAqICAgICAgICAgICAgICBOb2RlICAgICAgICAgICAgICAgIC0gU3RhcnRpbmcgbm9kZSB3aGVyZSBzZWFyY2ggd2lsbCBiZWdpbgorICogICAgICAgICAgICAgIGludGVycHJldGVyX21vZGUgICAgLSBBZGQgbmFtZXMgb25seSBpbiBBQ1BJX01PREVfTE9BRF9QQVNTX3guCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE90aGVyd2lzZSxzZWFyY2ggb25seS4KKyAqICAgICAgICAgICAgICBUeXBlICAgICAgICAgICAgICAgIC0gT2JqZWN0IHR5cGUgdG8gbWF0Y2gKKyAqICAgICAgICAgICAgICBGbGFncyAgICAgICAgICAgICAgIC0gRmxhZ3MgZGVzY3JpYmluZyB0aGUgc2VhcmNoIHJlc3RyaWN0aW9ucworICogICAgICAgICAgICAgIHJldHVybl9ub2RlICAgICAgICAgLSBXaGVyZSB0aGUgTm9kZSBpcyByZXR1cm5lZAorICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogU2VhcmNoIGZvciBhIG5hbWUgc2VnbWVudCBpbiBhIHNpbmdsZSBuYW1lc3BhY2UgbGV2ZWwsCisgKiAgICAgICAgICAgICAgb3B0aW9uYWxseSBhZGRpbmcgaXQgaWYgaXQgaXMgbm90IGZvdW5kLiBJZiB0aGUgcGFzc2VkCisgKiAgICAgICAgICAgICAgVHlwZSBpcyBub3QgQW55IGFuZCB0aGUgdHlwZSBwcmV2aW91c2x5IHN0b3JlZCBpbiB0aGUKKyAqICAgICAgICAgICAgICBlbnRyeSB3YXMgQW55IChpLmUuIHVua25vd24pLCB1cGRhdGUgdGhlIHN0b3JlZCB0eXBlLgorICoKKyAqICAgICAgICAgICAgICBJbiBBQ1BJX0lNT0RFX0VYRUNVVEUsIHNlYXJjaCBvbmx5LgorICogICAgICAgICAgICAgIEluIG90aGVyIG1vZGVzLCBzZWFyY2ggYW5kIGFkZCBpZiBub3QgZm91bmQuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworYWNwaV9zdGF0dXMKK2FjcGlfbnNfc2VhcmNoX2FuZF9lbnRlcih1MzIgdGFyZ2V0X25hbWUsCisJCQkgc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSwKKwkJCSBzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZSwKKwkJCSBhY3BpX2ludGVycHJldGVyX21vZGUgaW50ZXJwcmV0ZXJfbW9kZSwKKwkJCSBhY3BpX29iamVjdF90eXBlIHR5cGUsCisJCQkgdTMyIGZsYWdzLCBzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqKnJldHVybl9ub2RlKQoreworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbmV3X25vZGU7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKG5zX3NlYXJjaF9hbmRfZW50ZXIpOworCisJLyogUGFyYW1ldGVyIHZhbGlkYXRpb24gKi8KKworCWlmICghbm9kZSB8fCAhdGFyZ2V0X25hbWUgfHwgIXJldHVybl9ub2RlKSB7CisJCUFDUElfRVJST1IoKEFFX0lORk8sCisJCQkgICAgIk51bGwgcGFyYW1ldGVyOiBOb2RlICVwIE5hbWUgJVggUmV0dXJuTm9kZSAlcCIsCisJCQkgICAgbm9kZSwgdGFyZ2V0X25hbWUsIHJldHVybl9ub2RlKSk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfUEFSQU1FVEVSKTsKKwl9CisKKwkvKgorCSAqIE5hbWUgbXVzdCBjb25zaXN0IG9mIHZhbGlkIEFDUEkgY2hhcmFjdGVycy4gV2Ugd2lsbCByZXBhaXIgdGhlIG5hbWUgaWYKKwkgKiBuZWNlc3NhcnkgYmVjYXVzZSB3ZSBkb24ndCB3YW50IHRvIGFib3J0IGJlY2F1c2Ugb2YgdGhpcywgYnV0IHdlIHdhbnQKKwkgKiBhbGwgbmFtZXNwYWNlIG5hbWVzIHRvIGJlIHByaW50YWJsZS4gQSB3YXJuaW5nIG1lc3NhZ2UgaXMgYXBwcm9wcmlhdGUuCisJICoKKwkgKiBUaGlzIGlzc3VlIGNhbWUgdXAgYmVjYXVzZSB0aGVyZSBhcmUgaW4gZmFjdCBtYWNoaW5lcyB0aGF0IGV4aGliaXQKKwkgKiB0aGlzIHByb2JsZW0sIGFuZCB3ZSB3YW50IHRvIGJlIGFibGUgdG8gZW5hYmxlIEFDUEkgc3VwcG9ydCBmb3IgdGhlbSwKKwkgKiBldmVuIHRob3VnaCB0aGVyZSBhcmUgYSBmZXcgYmFkIG5hbWVzLgorCSAqLworCWlmICghYWNwaV91dF92YWxpZF9hY3BpX25hbWUodGFyZ2V0X25hbWUpKSB7CisJCXRhcmdldF9uYW1lID0KKwkJICAgIGFjcGlfdXRfcmVwYWlyX25hbWUoQUNQSV9DQVNUX1BUUihjaGFyLCAmdGFyZ2V0X25hbWUpKTsKKworCQkvKiBSZXBvcnQgd2FybmluZyBvbmx5IGlmIGluIHN0cmljdCBtb2RlIG9yIGRlYnVnIG1vZGUgKi8KKworCQlpZiAoIWFjcGlfZ2JsX2VuYWJsZV9pbnRlcnByZXRlcl9zbGFjaykgeworCQkJQUNQSV9XQVJOSU5HKChBRV9JTkZPLAorCQkJCSAgICAgICJGb3VuZCBiYWQgY2hhcmFjdGVyKHMpIGluIG5hbWUsIHJlcGFpcmVkOiBbJTQuNHNdXG4iLAorCQkJCSAgICAgIEFDUElfQ0FTVF9QVFIoY2hhciwgJnRhcmdldF9uYW1lKSkpOworCQl9IGVsc2UgeworCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLAorCQkJCQkgICJGb3VuZCBiYWQgY2hhcmFjdGVyKHMpIGluIG5hbWUsIHJlcGFpcmVkOiBbJTQuNHNdXG4iLAorCQkJCQkgIEFDUElfQ0FTVF9QVFIoY2hhciwgJnRhcmdldF9uYW1lKSkpOworCQl9CisJfQorCisJLyogVHJ5IHRvIGZpbmQgdGhlIG5hbWUgaW4gdGhlIG5hbWVzcGFjZSBsZXZlbCBzcGVjaWZpZWQgYnkgdGhlIGNhbGxlciAqLworCisJKnJldHVybl9ub2RlID0gQUNQSV9FTlRSWV9OT1RfRk9VTkQ7CisJc3RhdHVzID0gYWNwaV9uc19zZWFyY2hfb25lX3Njb3BlKHRhcmdldF9uYW1lLCBub2RlLCB0eXBlLCByZXR1cm5fbm9kZSk7CisJaWYgKHN0YXR1cyAhPSBBRV9OT1RfRk9VTkQpIHsKKwkJLyoKKwkJICogSWYgd2UgZm91bmQgaXQgQU5EIHRoZSByZXF1ZXN0IHNwZWNpZmllcyB0aGF0IGEgZmluZCBpcyBhbiBlcnJvciwKKwkJICogcmV0dXJuIHRoZSBlcnJvcgorCQkgKi8KKwkJaWYgKChzdGF0dXMgPT0gQUVfT0spICYmIChmbGFncyAmIEFDUElfTlNfRVJST1JfSUZfRk9VTkQpKSB7CisJCQlzdGF0dXMgPSBBRV9BTFJFQURZX0VYSVNUUzsKKwkJfQorCisJCS8qIEVpdGhlciBmb3VuZCBpdCBvciB0aGVyZSB3YXMgYW4gZXJyb3I6IGZpbmlzaGVkIGVpdGhlciB3YXkgKi8KKworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKKwl9CisKKwkvKgorCSAqIFRoZSBuYW1lIHdhcyBub3QgZm91bmQuIElmIHdlIGFyZSBOT1QgcGVyZm9ybWluZyB0aGUgZmlyc3QgcGFzcworCSAqIChuYW1lIGVudHJ5KSBvZiBsb2FkaW5nIHRoZSBuYW1lc3BhY2UsIHNlYXJjaCB0aGUgcGFyZW50IHRyZWUgKGFsbCB0aGUKKwkgKiB3YXkgdG8gdGhlIHJvb3QgaWYgbmVjZXNzYXJ5LikgV2UgZG9uJ3Qgd2FudCB0byBwZXJmb3JtIHRoZSBwYXJlbnQKKwkgKiBzZWFyY2ggd2hlbiB0aGUgbmFtZXNwYWNlIGlzIGFjdHVhbGx5IGJlaW5nIGxvYWRlZC4gV2Ugd2FudCB0byBwZXJmb3JtCisJICogdGhlIHNlYXJjaCB3aGVuIG5hbWVzcGFjZSByZWZlcmVuY2VzIGFyZSBiZWluZyByZXNvbHZlZCAobG9hZCBwYXNzIDIpCisJICogYW5kIGR1cmluZyB0aGUgZXhlY3V0aW9uIHBoYXNlLgorCSAqLworCWlmICgoaW50ZXJwcmV0ZXJfbW9kZSAhPSBBQ1BJX0lNT0RFX0xPQURfUEFTUzEpICYmCisJICAgIChmbGFncyAmIEFDUElfTlNfU0VBUkNIX1BBUkVOVCkpIHsKKwkJLyoKKwkJICogTm90IGZvdW5kIGF0IHRoaXMgbGV2ZWwgLSBzZWFyY2ggcGFyZW50IHRyZWUgYWNjb3JkaW5nIHRvIHRoZQorCQkgKiBBQ1BJIHNwZWNpZmljYXRpb24KKwkJICovCisJCXN0YXR1cyA9CisJCSAgICBhY3BpX25zX3NlYXJjaF9wYXJlbnRfdHJlZSh0YXJnZXRfbmFtZSwgbm9kZSwgdHlwZSwKKwkJCQkJICAgICAgIHJldHVybl9ub2RlKTsKKwkJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKKwkJfQorCX0KKworCS8qIEluIGV4ZWN1dGUgbW9kZSwganVzdCBzZWFyY2gsIG5ldmVyIGFkZCBuYW1lcy4gRXhpdCBub3cgKi8KKworCWlmIChpbnRlcnByZXRlcl9tb2RlID09IEFDUElfSU1PREVfRVhFQ1VURSkgeworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX05BTUVTLAorCQkJCSAgIiU0LjRzIE5vdCBmb3VuZCBpbiAlcCBbTm90IGFkZGluZ11cbiIsCisJCQkJICBBQ1BJX0NBU1RfUFRSKGNoYXIsICZ0YXJnZXRfbmFtZSksIG5vZGUpKTsKKworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9UX0ZPVU5EKTsKKwl9CisKKwkvKiBDcmVhdGUgdGhlIG5ldyBuYW1lZCBvYmplY3QgKi8KKworCW5ld19ub2RlID0gYWNwaV9uc19jcmVhdGVfbm9kZSh0YXJnZXRfbmFtZSk7CisJaWYgKCFuZXdfbm9kZSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9fTUVNT1JZKTsKKwl9CisjaWZkZWYgQUNQSV9BU0xfQ09NUElMRVIKKwkvKgorCSAqIE5vZGUgaXMgYW4gb2JqZWN0IGRlZmluZWQgYnkgYW4gRXh0ZXJuYWwoKSBzdGF0ZW1lbnQKKwkgKi8KKwlpZiAoZmxhZ3MgJiBBQ1BJX05TX0VYVEVSTkFMKSB7CisJCW5ld19ub2RlLT5mbGFncyB8PSBBTk9CSl9JU19FWFRFUk5BTDsKKwl9CisjZW5kaWYKKworCWlmIChmbGFncyAmIEFDUElfTlNfVEVNUE9SQVJZKSB7CisJCW5ld19ub2RlLT5mbGFncyB8PSBBTk9CSl9URU1QT1JBUlk7CisJfQorCisJLyogSW5zdGFsbCB0aGUgbmV3IG9iamVjdCBpbnRvIHRoZSBwYXJlbnQncyBsaXN0IG9mIGNoaWxkcmVuICovCisKKwlhY3BpX25zX2luc3RhbGxfbm9kZSh3YWxrX3N0YXRlLCBub2RlLCBuZXdfbm9kZSwgdHlwZSk7CisJKnJldHVybl9ub2RlID0gbmV3X25vZGU7CisJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvbnN1dGlscy5jIGIvZHJpdmVycy9hY3BpL2FjcGljYS9uc3V0aWxzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2UxMTQ5YgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvbnN1dGlscy5jCkBAIC0wLDAgKzEsOTk3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogTW9kdWxlIE5hbWU6IG5zdXRpbHMgLSBVdGlsaXRpZXMgZm9yIGFjY2Vzc2luZyBBQ1BJIG5hbWVzcGFjZSwgYWNjZXNzaW5nCisgKiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudHMgYW5kIHNpYmxpbmdzIGFuZCBTY29wZSBtYW5pcHVsYXRpb24KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA4LCBJbnRlbCBDb3JwLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAorICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgYXQgbWluaW11bSBhIGRpc2NsYWltZXIKKyAqICAgIHN1YnN0YW50aWFsbHkgc2ltaWxhciB0byB0aGUgIk5PIFdBUlJBTlRZIiBkaXNjbGFpbWVyIGJlbG93CisgKiAgICAoIkRpc2NsYWltZXIiKSBhbmQgYW55IHJlZGlzdHJpYnV0aW9uIG11c3QgYmUgY29uZGl0aW9uZWQgdXBvbgorICogICAgaW5jbHVkaW5nIGEgc3Vic3RhbnRpYWxseSBzaW1pbGFyIERpc2NsYWltZXIgcmVxdWlyZW1lbnQgZm9yIGZ1cnRoZXIKKyAqICAgIGJpbmFyeSByZWRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcworICogICAgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBOTyBXQVJSQU5UWQorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcKKyAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgorICovCisKKyNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KKyNpbmNsdWRlICJhY2NvbW1vbi5oIgorI2luY2x1ZGUgImFjbmFtZXNwLmgiCisjaW5jbHVkZSAiYW1sY29kZS5oIgorI2luY2x1ZGUgImFjdGFibGVzLmgiCisKKyNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX05BTUVTUEFDRQorQUNQSV9NT0RVTEVfTkFNRSgibnN1dGlscyIpCisKKy8qIExvY2FsIHByb3RvdHlwZXMgKi8KK3N0YXRpYyB1OCBhY3BpX25zX3ZhbGlkX3BhdGhfc2VwYXJhdG9yKGNoYXIgc2VwKTsKKworI2lmZGVmIEFDUElfT0JTT0xFVEVfRlVOQ1RJT05TCithY3BpX25hbWUgYWNwaV9uc19maW5kX3BhcmVudF9uYW1lKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlX3RvX3NlYXJjaCk7CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9uc19yZXBvcnRfZXJyb3IKKyAqCisgKiBQQVJBTUVURVJTOiAgbW9kdWxlX25hbWUgICAgICAgICAtIENhbGxlcidzIG1vZHVsZSBuYW1lIChmb3IgZXJyb3Igb3V0cHV0KQorICogICAgICAgICAgICAgIGxpbmVfbnVtYmVyICAgICAgICAgLSBDYWxsZXIncyBsaW5lIG51bWJlciAoZm9yIGVycm9yIG91dHB1dCkKKyAqICAgICAgICAgICAgICBpbnRlcm5hbF9uYW1lICAgICAgIC0gTmFtZSBvciBwYXRoIG9mIHRoZSBuYW1lc3BhY2Ugbm9kZQorICogICAgICAgICAgICAgIGxvb2t1cF9zdGF0dXMgICAgICAgLSBFeGNlcHRpb24gY29kZSBmcm9tIE5TIGxvb2t1cAorICoKKyAqIFJFVFVSTjogICAgICBOb25lCisgKgorICogREVTQ1JJUFRJT046IFByaW50IHdhcm5pbmcgbWVzc2FnZSB3aXRoIGZ1bGwgcGF0aG5hbWUKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkCithY3BpX25zX3JlcG9ydF9lcnJvcihjb25zdCBjaGFyICptb2R1bGVfbmFtZSwKKwkJICAgICB1MzIgbGluZV9udW1iZXIsCisJCSAgICAgY29uc3QgY2hhciAqaW50ZXJuYWxfbmFtZSwgYWNwaV9zdGF0dXMgbG9va3VwX3N0YXR1cykKK3sKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJdTMyIGJhZF9uYW1lOworCWNoYXIgKm5hbWUgPSBOVUxMOworCisJYWNwaV9vc19wcmludGYoIkFDUEkgRXJyb3IgKCVzLSUwNGQpOiAiLCBtb2R1bGVfbmFtZSwgbGluZV9udW1iZXIpOworCisJaWYgKGxvb2t1cF9zdGF0dXMgPT0gQUVfQkFEX0NIQVJBQ1RFUikgeworCisJCS8qIFRoZXJlIGlzIGEgbm9uLWFzY2lpIGNoYXJhY3RlciBpbiB0aGUgbmFtZSAqLworCisJCUFDUElfTU9WRV8zMl9UT18zMigmYmFkX25hbWUsIGludGVybmFsX25hbWUpOworCQlhY3BpX29zX3ByaW50ZigiWzB4JTQuNFhdIChOT04tQVNDSUkpIiwgYmFkX25hbWUpOworCX0gZWxzZSB7CisJCS8qIENvbnZlcnQgcGF0aCB0byBleHRlcm5hbCBmb3JtYXQgKi8KKworCQlzdGF0dXMgPSBhY3BpX25zX2V4dGVybmFsaXplX25hbWUoQUNQSV9VSU5UMzJfTUFYLAorCQkJCQkJICBpbnRlcm5hbF9uYW1lLCBOVUxMLCAmbmFtZSk7CisKKwkJLyogUHJpbnQgdGFyZ2V0IG5hbWUgKi8KKworCQlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpIHsKKwkJCWFjcGlfb3NfcHJpbnRmKCJbJXNdIiwgbmFtZSk7CisJCX0gZWxzZSB7CisJCQlhY3BpX29zX3ByaW50ZigiW0NPVUxEIE5PVCBFWFRFUk5BTElaRSBOQU1FXSIpOworCQl9CisKKwkJaWYgKG5hbWUpIHsKKwkJCUFDUElfRlJFRShuYW1lKTsKKwkJfQorCX0KKworCWFjcGlfb3NfcHJpbnRmKCIgTmFtZXNwYWNlIGxvb2t1cCBmYWlsdXJlLCAlc1xuIiwKKwkJICAgICAgIGFjcGlfZm9ybWF0X2V4Y2VwdGlvbihsb29rdXBfc3RhdHVzKSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfbnNfcmVwb3J0X21ldGhvZF9lcnJvcgorICoKKyAqIFBBUkFNRVRFUlM6ICBtb2R1bGVfbmFtZSAgICAgICAgIC0gQ2FsbGVyJ3MgbW9kdWxlIG5hbWUgKGZvciBlcnJvciBvdXRwdXQpCisgKiAgICAgICAgICAgICAgbGluZV9udW1iZXIgICAgICAgICAtIENhbGxlcidzIGxpbmUgbnVtYmVyIChmb3IgZXJyb3Igb3V0cHV0KQorICogICAgICAgICAgICAgIE1lc3NhZ2UgICAgICAgICAgICAgLSBFcnJvciBtZXNzYWdlIHRvIHVzZSBvbiBmYWlsdXJlCisgKiAgICAgICAgICAgICAgcHJlZml4X25vZGUgICAgICAgICAtIFByZWZpeCByZWxhdGl2ZSB0byB0aGUgcGF0aAorICogICAgICAgICAgICAgIFBhdGggICAgICAgICAgICAgICAgLSBQYXRoIHRvIHRoZSBub2RlIChvcHRpb25hbCkKKyAqICAgICAgICAgICAgICBtZXRob2Rfc3RhdHVzICAgICAgIC0gRXhlY3V0aW9uIHN0YXR1cworICoKKyAqIFJFVFVSTjogICAgICBOb25lCisgKgorICogREVTQ1JJUFRJT046IFByaW50IHdhcm5pbmcgbWVzc2FnZSB3aXRoIGZ1bGwgcGF0aG5hbWUKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkCithY3BpX25zX3JlcG9ydF9tZXRob2RfZXJyb3IoY29uc3QgY2hhciAqbW9kdWxlX25hbWUsCisJCQkgICAgdTMyIGxpbmVfbnVtYmVyLAorCQkJICAgIGNvbnN0IGNoYXIgKm1lc3NhZ2UsCisJCQkgICAgc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKnByZWZpeF9ub2RlLAorCQkJICAgIGNvbnN0IGNoYXIgKnBhdGgsIGFjcGlfc3RhdHVzIG1ldGhvZF9zdGF0dXMpCit7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlID0gcHJlZml4X25vZGU7CisKKwlhY3BpX29zX3ByaW50ZigiQUNQSSBFcnJvciAoJXMtJTA0ZCk6ICIsIG1vZHVsZV9uYW1lLCBsaW5lX251bWJlcik7CisKKwlpZiAocGF0aCkgeworCQlzdGF0dXMgPQorCQkgICAgYWNwaV9uc19nZXRfbm9kZShwcmVmaXhfbm9kZSwgcGF0aCwgQUNQSV9OU19OT19VUFNFQVJDSCwKKwkJCQkgICAgICZub2RlKTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQlhY3BpX29zX3ByaW50ZigiW0NvdWxkIG5vdCBnZXQgbm9kZSBieSBwYXRobmFtZV0iKTsKKwkJfQorCX0KKworCWFjcGlfbnNfcHJpbnRfbm9kZV9wYXRobmFtZShub2RlLCBtZXNzYWdlKTsKKwlhY3BpX29zX3ByaW50ZigiLCAlc1xuIiwgYWNwaV9mb3JtYXRfZXhjZXB0aW9uKG1ldGhvZF9zdGF0dXMpKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9uc19wcmludF9ub2RlX3BhdGhuYW1lCisgKgorICogUEFSQU1FVEVSUzogIE5vZGUgICAgICAgICAgICAtIE9iamVjdAorICogICAgICAgICAgICAgIE1lc3NhZ2UgICAgICAgICAtIFByZWZpeCBtZXNzYWdlCisgKgorICogREVTQ1JJUFRJT046IFByaW50IGFuIG9iamVjdCdzIGZ1bGwgbmFtZXNwYWNlIHBhdGhuYW1lCisgKiAgICAgICAgICAgICAgTWFuYWdlcyBhbGxvY2F0aW9uL2ZyZWVpbmcgb2YgYSBwYXRobmFtZSBidWZmZXIKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkCithY3BpX25zX3ByaW50X25vZGVfcGF0aG5hbWUoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGUsCisJCQkgICAgY29uc3QgY2hhciAqbWVzc2FnZSkKK3sKKwlzdHJ1Y3QgYWNwaV9idWZmZXIgYnVmZmVyOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKworCWlmICghbm9kZSkgeworCQlhY3BpX29zX3ByaW50ZigiW05VTEwgTkFNRV0iKTsKKwkJcmV0dXJuOworCX0KKworCS8qIENvbnZlcnQgaGFuZGxlIHRvIGZ1bGwgcGF0aG5hbWUgYW5kIHByaW50IGl0ICh3aXRoIHN1cHBsaWVkIG1lc3NhZ2UpICovCisKKwlidWZmZXIubGVuZ3RoID0gQUNQSV9BTExPQ0FURV9MT0NBTF9CVUZGRVI7CisKKwlzdGF0dXMgPSBhY3BpX25zX2hhbmRsZV90b19wYXRobmFtZShub2RlLCAmYnVmZmVyKTsKKwlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpIHsKKwkJaWYgKG1lc3NhZ2UpIHsKKwkJCWFjcGlfb3NfcHJpbnRmKCIlcyAiLCBtZXNzYWdlKTsKKwkJfQorCisJCWFjcGlfb3NfcHJpbnRmKCJbJXNdIChOb2RlICVwKSIsIChjaGFyICopYnVmZmVyLnBvaW50ZXIsIG5vZGUpOworCQlBQ1BJX0ZSRUUoYnVmZmVyLnBvaW50ZXIpOworCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9uc192YWxpZF9yb290X3ByZWZpeAorICoKKyAqIFBBUkFNRVRFUlM6ICBQcmVmaXggICAgICAgICAgLSBDaGFyYWN0ZXIgdG8gYmUgY2hlY2tlZAorICoKKyAqIFJFVFVSTjogICAgICBUUlVFIGlmIGEgdmFsaWQgcHJlZml4CisgKgorICogREVTQ1JJUFRJT046IENoZWNrIGlmIGEgY2hhcmFjdGVyIGlzIGEgdmFsaWQgQUNQSSBSb290IHByZWZpeAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3U4IGFjcGlfbnNfdmFsaWRfcm9vdF9wcmVmaXgoY2hhciBwcmVmaXgpCit7CisKKwlyZXR1cm4gKCh1OCkgKHByZWZpeCA9PSAnXFwnKSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfbnNfdmFsaWRfcGF0aF9zZXBhcmF0b3IKKyAqCisgKiBQQVJBTUVURVJTOiAgU2VwICAgICAgICAgLSBDaGFyYWN0ZXIgdG8gYmUgY2hlY2tlZAorICoKKyAqIFJFVFVSTjogICAgICBUUlVFIGlmIGEgdmFsaWQgcGF0aCBzZXBhcmF0b3IKKyAqCisgKiBERVNDUklQVElPTjogQ2hlY2sgaWYgYSBjaGFyYWN0ZXIgaXMgYSB2YWxpZCBBQ1BJIHBhdGggc2VwYXJhdG9yCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHU4IGFjcGlfbnNfdmFsaWRfcGF0aF9zZXBhcmF0b3IoY2hhciBzZXApCit7CisKKwlyZXR1cm4gKCh1OCkgKHNlcCA9PSAnLicpKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9uc19nZXRfdHlwZQorICoKKyAqIFBBUkFNRVRFUlM6ICBOb2RlICAgICAgICAtIFBhcmVudCBOb2RlIHRvIGJlIGV4YW1pbmVkCisgKgorICogUkVUVVJOOiAgICAgIFR5cGUgZmllbGQgZnJvbSBOb2RlIHdob3NlIGhhbmRsZSBpcyBwYXNzZWQKKyAqCisgKiBERVNDUklQVElPTjogUmV0dXJuIHRoZSB0eXBlIG9mIGEgTmFtZXNwYWNlIG5vZGUKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCithY3BpX29iamVjdF90eXBlIGFjcGlfbnNfZ2V0X3R5cGUoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKiBub2RlKQoreworCUFDUElfRlVOQ1RJT05fVFJBQ0UobnNfZ2V0X3R5cGUpOworCisJaWYgKCFub2RlKSB7CisJCUFDUElfV0FSTklORygoQUVfSU5GTywgIk51bGwgTm9kZSBwYXJhbWV0ZXIiKSk7CisJCXJldHVybl9VSU5UMzIoQUNQSV9UWVBFX0FOWSk7CisJfQorCisJcmV0dXJuX1VJTlQzMigoYWNwaV9vYmplY3RfdHlwZSkgbm9kZS0+dHlwZSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfbnNfbG9jYWwKKyAqCisgKiBQQVJBTUVURVJTOiAgVHlwZSAgICAgICAgLSBBIG5hbWVzcGFjZSBvYmplY3QgdHlwZQorICoKKyAqIFJFVFVSTjogICAgICBMT0NBTCBpZiBuYW1lcyBtdXN0IGJlIGZvdW5kIGxvY2FsbHkgaW4gb2JqZWN0cyBvZiB0aGUKKyAqICAgICAgICAgICAgICBwYXNzZWQgdHlwZSwgMCBpZiBlbmNsb3Npbmcgc2NvcGVzIHNob3VsZCBiZSBzZWFyY2hlZAorICoKKyAqIERFU0NSSVBUSU9OOiBSZXR1cm5zIHNjb3BlIHJ1bGUgZm9yIHRoZSBnaXZlbiBvYmplY3QgdHlwZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit1MzIgYWNwaV9uc19sb2NhbChhY3BpX29iamVjdF90eXBlIHR5cGUpCit7CisJQUNQSV9GVU5DVElPTl9UUkFDRShuc19sb2NhbCk7CisKKwlpZiAoIWFjcGlfdXRfdmFsaWRfb2JqZWN0X3R5cGUodHlwZSkpIHsKKworCQkvKiBUeXBlIGNvZGUgb3V0IG9mIHJhbmdlICAqLworCisJCUFDUElfV0FSTklORygoQUVfSU5GTywgIkludmFsaWQgT2JqZWN0IFR5cGUgJVgiLCB0eXBlKSk7CisJCXJldHVybl9VSU5UMzIoQUNQSV9OU19OT1JNQUwpOworCX0KKworCXJldHVybl9VSU5UMzIoKHUzMikgYWNwaV9nYmxfbnNfcHJvcGVydGllc1t0eXBlXSAmIEFDUElfTlNfTE9DQUwpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX25zX2dldF9pbnRlcm5hbF9uYW1lX2xlbmd0aAorICoKKyAqIFBBUkFNRVRFUlM6ICBJbmZvICAgICAgICAgICAgLSBJbmZvIHN0cnVjdCBpbml0aWFsaXplZCB3aXRoIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVybmFsIG5hbWUgcG9pbnRlci4KKyAqCisgKiBSRVRVUk46ICAgICAgTm9uZQorICoKKyAqIERFU0NSSVBUSU9OOiBDYWxjdWxhdGUgdGhlIGxlbmd0aCBvZiB0aGUgaW50ZXJuYWwgKEFNTCkgbmFtZXN0cmluZworICogICAgICAgICAgICAgIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGV4dGVybmFsIChBU0wpIG5hbWVzdHJpbmcuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBhY3BpX25zX2dldF9pbnRlcm5hbF9uYW1lX2xlbmd0aChzdHJ1Y3QgYWNwaV9uYW1lc3RyaW5nX2luZm8gKmluZm8pCit7CisJY29uc3QgY2hhciAqbmV4dF9leHRlcm5hbF9jaGFyOworCXUzMiBpOworCisJQUNQSV9GVU5DVElPTl9FTlRSWSgpOworCisJbmV4dF9leHRlcm5hbF9jaGFyID0gaW5mby0+ZXh0ZXJuYWxfbmFtZTsKKwlpbmZvLT5udW1fY2FyYXRzID0gMDsKKwlpbmZvLT5udW1fc2VnbWVudHMgPSAwOworCWluZm8tPmZ1bGx5X3F1YWxpZmllZCA9IEZBTFNFOworCisJLyoKKwkgKiBGb3IgdGhlIGludGVybmFsIG5hbWUsIHRoZSByZXF1aXJlZCBsZW5ndGggaXMgNCBieXRlcyBwZXIgc2VnbWVudCwgcGx1cworCSAqIDEgZWFjaCBmb3Igcm9vdF9wcmVmaXgsIG11bHRpX25hbWVfcHJlZml4X29wLCBzZWdtZW50IGNvdW50LCB0cmFpbGluZyBudWxsCisJICogKHdoaWNoIGlzIG5vdCByZWFsbHkgbmVlZGVkLCBidXQgbm8gdGhlcmUncyBoYXJtIGluIHB1dHRpbmcgaXQgdGhlcmUpCisJICoKKwkgKiBzdHJsZW4oKSArIDEgY292ZXJzIHRoZSBmaXJzdCBuYW1lX3NlZywgd2hpY2ggaGFzIG5vIHBhdGggc2VwYXJhdG9yCisJICovCisJaWYgKGFjcGlfbnNfdmFsaWRfcm9vdF9wcmVmaXgoKm5leHRfZXh0ZXJuYWxfY2hhcikpIHsKKwkJaW5mby0+ZnVsbHlfcXVhbGlmaWVkID0gVFJVRTsKKwkJbmV4dF9leHRlcm5hbF9jaGFyKys7CisKKwkJLyogU2tpcCByZWR1bmRhbnQgcm9vdF9wcmVmaXgsIGxpa2UgXFxfU0IuUENJMC5TQlJHLkVDMCAqLworCisJCXdoaWxlIChhY3BpX25zX3ZhbGlkX3Jvb3RfcHJlZml4KCpuZXh0X2V4dGVybmFsX2NoYXIpKSB7CisJCQluZXh0X2V4dGVybmFsX2NoYXIrKzsKKwkJfQorCX0gZWxzZSB7CisJCS8qCisJCSAqIEhhbmRsZSBDYXJhdCBwcmVmaXhlcworCQkgKi8KKwkJd2hpbGUgKCpuZXh0X2V4dGVybmFsX2NoYXIgPT0gJ14nKSB7CisJCQlpbmZvLT5udW1fY2FyYXRzKys7CisJCQluZXh0X2V4dGVybmFsX2NoYXIrKzsKKwkJfQorCX0KKworCS8qCisJICogRGV0ZXJtaW5lIHRoZSBudW1iZXIgb2YgQUNQSSBuYW1lICJzZWdtZW50cyIgYnkgY291bnRpbmcgdGhlIG51bWJlciBvZgorCSAqIHBhdGggc2VwYXJhdG9ycyB3aXRoaW4gdGhlIHN0cmluZy4gU3RhcnQgd2l0aCBvbmUgc2VnbWVudCBzaW5jZSB0aGUKKwkgKiBzZWdtZW50IGNvdW50IGlzIFsoIyBzZXBhcmF0b3JzKSArIDFdLCBhbmQgemVybyBzZXBhcmF0b3JzIGlzIG9rLgorCSAqLworCWlmICgqbmV4dF9leHRlcm5hbF9jaGFyKSB7CisJCWluZm8tPm51bV9zZWdtZW50cyA9IDE7CisJCWZvciAoaSA9IDA7IG5leHRfZXh0ZXJuYWxfY2hhcltpXTsgaSsrKSB7CisJCQlpZiAoYWNwaV9uc192YWxpZF9wYXRoX3NlcGFyYXRvcihuZXh0X2V4dGVybmFsX2NoYXJbaV0pKSB7CisJCQkJaW5mby0+bnVtX3NlZ21lbnRzKys7CisJCQl9CisJCX0KKwl9CisKKwlpbmZvLT5sZW5ndGggPSAoQUNQSV9OQU1FX1NJWkUgKiBpbmZvLT5udW1fc2VnbWVudHMpICsKKwkgICAgNCArIGluZm8tPm51bV9jYXJhdHM7CisKKwlpbmZvLT5uZXh0X2V4dGVybmFsX2NoYXIgPSBuZXh0X2V4dGVybmFsX2NoYXI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfbnNfYnVpbGRfaW50ZXJuYWxfbmFtZQorICoKKyAqIFBBUkFNRVRFUlM6ICBJbmZvICAgICAgICAgICAgLSBJbmZvIHN0cnVjdCBmdWxseSBpbml0aWFsaXplZAorICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogQ29uc3RydWN0IHRoZSBpbnRlcm5hbCAoQU1MKSBuYW1lc3RyaW5nCisgKiAgICAgICAgICAgICAgY29ycmVzcG9uZGluZyB0byB0aGUgZXh0ZXJuYWwgKEFTTCkgbmFtZXN0cmluZy4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCithY3BpX3N0YXR1cyBhY3BpX25zX2J1aWxkX2ludGVybmFsX25hbWUoc3RydWN0IGFjcGlfbmFtZXN0cmluZ19pbmZvICppbmZvKQoreworCXUzMiBudW1fc2VnbWVudHMgPSBpbmZvLT5udW1fc2VnbWVudHM7CisJY2hhciAqaW50ZXJuYWxfbmFtZSA9IGluZm8tPmludGVybmFsX25hbWU7CisJY29uc3QgY2hhciAqZXh0ZXJuYWxfbmFtZSA9IGluZm8tPm5leHRfZXh0ZXJuYWxfY2hhcjsKKwljaGFyICpyZXN1bHQgPSBOVUxMOworCXUzMiBpOworCisJQUNQSV9GVU5DVElPTl9UUkFDRShuc19idWlsZF9pbnRlcm5hbF9uYW1lKTsKKworCS8qIFNldHVwIHRoZSBjb3JyZWN0IHByZWZpeGVzLCBjb3VudHMsIGFuZCBwb2ludGVycyAqLworCisJaWYgKGluZm8tPmZ1bGx5X3F1YWxpZmllZCkgeworCQlpbnRlcm5hbF9uYW1lWzBdID0gJ1xcJzsKKworCQlpZiAobnVtX3NlZ21lbnRzIDw9IDEpIHsKKwkJCXJlc3VsdCA9ICZpbnRlcm5hbF9uYW1lWzFdOworCQl9IGVsc2UgaWYgKG51bV9zZWdtZW50cyA9PSAyKSB7CisJCQlpbnRlcm5hbF9uYW1lWzFdID0gQU1MX0RVQUxfTkFNRV9QUkVGSVg7CisJCQlyZXN1bHQgPSAmaW50ZXJuYWxfbmFtZVsyXTsKKwkJfSBlbHNlIHsKKwkJCWludGVybmFsX25hbWVbMV0gPSBBTUxfTVVMVElfTkFNRV9QUkVGSVhfT1A7CisJCQlpbnRlcm5hbF9uYW1lWzJdID0gKGNoYXIpbnVtX3NlZ21lbnRzOworCQkJcmVzdWx0ID0gJmludGVybmFsX25hbWVbM107CisJCX0KKwl9IGVsc2UgeworCQkvKgorCQkgKiBOb3QgZnVsbHkgcXVhbGlmaWVkLgorCQkgKiBIYW5kbGUgQ2FyYXRzIGZpcnN0LCB0aGVuIGFwcGVuZCB0aGUgbmFtZSBzZWdtZW50cworCQkgKi8KKwkJaSA9IDA7CisJCWlmIChpbmZvLT5udW1fY2FyYXRzKSB7CisJCQlmb3IgKGkgPSAwOyBpIDwgaW5mby0+bnVtX2NhcmF0czsgaSsrKSB7CisJCQkJaW50ZXJuYWxfbmFtZVtpXSA9ICdeJzsKKwkJCX0KKwkJfQorCisJCWlmIChudW1fc2VnbWVudHMgPD0gMSkgeworCQkJcmVzdWx0ID0gJmludGVybmFsX25hbWVbaV07CisJCX0gZWxzZSBpZiAobnVtX3NlZ21lbnRzID09IDIpIHsKKwkJCWludGVybmFsX25hbWVbaV0gPSBBTUxfRFVBTF9OQU1FX1BSRUZJWDsKKwkJCXJlc3VsdCA9ICZpbnRlcm5hbF9uYW1lWyhhY3BpX3NpemUpIGkgKyAxXTsKKwkJfSBlbHNlIHsKKwkJCWludGVybmFsX25hbWVbaV0gPSBBTUxfTVVMVElfTkFNRV9QUkVGSVhfT1A7CisJCQlpbnRlcm5hbF9uYW1lWyhhY3BpX3NpemUpIGkgKyAxXSA9IChjaGFyKW51bV9zZWdtZW50czsKKwkJCXJlc3VsdCA9ICZpbnRlcm5hbF9uYW1lWyhhY3BpX3NpemUpIGkgKyAyXTsKKwkJfQorCX0KKworCS8qIEJ1aWxkIHRoZSBuYW1lIChtaW51cyBwYXRoIHNlcGFyYXRvcnMpICovCisKKwlmb3IgKDsgbnVtX3NlZ21lbnRzOyBudW1fc2VnbWVudHMtLSkgeworCQlmb3IgKGkgPSAwOyBpIDwgQUNQSV9OQU1FX1NJWkU7IGkrKykgeworCQkJaWYgKGFjcGlfbnNfdmFsaWRfcGF0aF9zZXBhcmF0b3IoKmV4dGVybmFsX25hbWUpIHx8CisJCQkgICAgKCpleHRlcm5hbF9uYW1lID09IDApKSB7CisKKwkJCQkvKiBQYWQgdGhlIHNlZ21lbnQgd2l0aCB1bmRlcnNjb3JlKHMpIGlmIHNlZ21lbnQgaXMgc2hvcnQgKi8KKworCQkJCXJlc3VsdFtpXSA9ICdfJzsKKwkJCX0gZWxzZSB7CisJCQkJLyogQ29udmVydCB0aGUgY2hhcmFjdGVyIHRvIHVwcGVyY2FzZSBhbmQgc2F2ZSBpdCAqLworCisJCQkJcmVzdWx0W2ldID0KKwkJCQkgICAgKGNoYXIpQUNQSV9UT1VQUEVSKChpbnQpKmV4dGVybmFsX25hbWUpOworCQkJCWV4dGVybmFsX25hbWUrKzsKKwkJCX0KKwkJfQorCisJCS8qIE5vdyB3ZSBtdXN0IGhhdmUgYSBwYXRoIHNlcGFyYXRvciwgb3IgdGhlIHBhdGhuYW1lIGlzIGJhZCAqLworCisJCWlmICghYWNwaV9uc192YWxpZF9wYXRoX3NlcGFyYXRvcigqZXh0ZXJuYWxfbmFtZSkgJiYKKwkJICAgICgqZXh0ZXJuYWxfbmFtZSAhPSAwKSkgeworCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9QQVJBTUVURVIpOworCQl9CisKKwkJLyogTW92ZSBvbiB0aGUgbmV4dCBzZWdtZW50ICovCisKKwkJZXh0ZXJuYWxfbmFtZSsrOworCQlyZXN1bHQgKz0gQUNQSV9OQU1FX1NJWkU7CisJfQorCisJLyogVGVybWluYXRlIHRoZSBzdHJpbmcgKi8KKworCSpyZXN1bHQgPSAwOworCisJaWYgKGluZm8tPmZ1bGx5X3F1YWxpZmllZCkgeworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VYRUMsCisJCQkJICAiUmV0dXJuaW5nIFslcF0gKGFicykgXCJcXCVzXCJcbiIsCisJCQkJICBpbnRlcm5hbF9uYW1lLCBpbnRlcm5hbF9uYW1lKSk7CisJfSBlbHNlIHsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FWEVDLCAiUmV0dXJuaW5nIFslcF0gKHJlbCkgXCIlc1wiXG4iLAorCQkJCSAgaW50ZXJuYWxfbmFtZSwgaW50ZXJuYWxfbmFtZSkpOworCX0KKworCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfbnNfaW50ZXJuYWxpemVfbmFtZQorICoKKyAqIFBBUkFNRVRFUlM6ICAqZXh0ZXJuYWxfbmFtZSAgICAgICAgICAtIEV4dGVybmFsIHJlcHJlc2VudGF0aW9uIG9mIG5hbWUKKyAqICAgICAgICAgICAgICAqKkNvbnZlcnRlZCBOYW1lICAgICAgICAtIFdoZXJlIHRvIHJldHVybiB0aGUgcmVzdWx0aW5nCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbCByZXByZXNlbnRpb24gb2YgdGhlIG5hbWUKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IENvbnZlcnQgYW4gZXh0ZXJuYWwgcmVwcmVzZW50YXRpb24gKGUuZy4gIlxfUFJfLkNQVTAiKQorICogICAgICAgICAgICAgIHRvIGludGVybmFsIGZvcm0gKGUuZy4gNWMgMmYgMDIgNWYgNTAgNTIgNWYgNDMgNTAgNTUgMzApCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2FjcGlfc3RhdHVzCithY3BpX25zX2ludGVybmFsaXplX25hbWUoY29uc3QgY2hhciAqZXh0ZXJuYWxfbmFtZSwgY2hhciAqKmNvbnZlcnRlZF9uYW1lKQoreworCWNoYXIgKmludGVybmFsX25hbWU7CisJc3RydWN0IGFjcGlfbmFtZXN0cmluZ19pbmZvIGluZm87CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCisJQUNQSV9GVU5DVElPTl9UUkFDRShuc19pbnRlcm5hbGl6ZV9uYW1lKTsKKworCWlmICgoIWV4dGVybmFsX25hbWUpIHx8ICgqZXh0ZXJuYWxfbmFtZSA9PSAwKSB8fCAoIWNvbnZlcnRlZF9uYW1lKSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX1BBUkFNRVRFUik7CisJfQorCisJLyogR2V0IHRoZSBsZW5ndGggb2YgdGhlIG5ldyBpbnRlcm5hbCBuYW1lICovCisKKwlpbmZvLmV4dGVybmFsX25hbWUgPSBleHRlcm5hbF9uYW1lOworCWFjcGlfbnNfZ2V0X2ludGVybmFsX25hbWVfbGVuZ3RoKCZpbmZvKTsKKworCS8qIFdlIG5lZWQgYSBzZWdtZW50IHRvIHN0b3JlIHRoZSBpbnRlcm5hbCAgbmFtZSAqLworCisJaW50ZXJuYWxfbmFtZSA9IEFDUElfQUxMT0NBVEVfWkVST0VEKGluZm8ubGVuZ3RoKTsKKwlpZiAoIWludGVybmFsX25hbWUpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX01FTU9SWSk7CisJfQorCisJLyogQnVpbGQgdGhlIG5hbWUgKi8KKworCWluZm8uaW50ZXJuYWxfbmFtZSA9IGludGVybmFsX25hbWU7CisJc3RhdHVzID0gYWNwaV9uc19idWlsZF9pbnRlcm5hbF9uYW1lKCZpbmZvKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJQUNQSV9GUkVFKGludGVybmFsX25hbWUpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKKwl9CisKKwkqY29udmVydGVkX25hbWUgPSBpbnRlcm5hbF9uYW1lOworCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfbnNfZXh0ZXJuYWxpemVfbmFtZQorICoKKyAqIFBBUkFNRVRFUlM6ICBpbnRlcm5hbF9uYW1lX2xlbmd0aCAtIExlbnRoIG9mIHRoZSBpbnRlcm5hbCBuYW1lIGJlbG93CisgKiAgICAgICAgICAgICAgaW50ZXJuYWxfbmFtZSAgICAgICAtIEludGVybmFsIHJlcHJlc2VudGF0aW9uIG9mIG5hbWUKKyAqICAgICAgICAgICAgICBjb252ZXJ0ZWRfbmFtZV9sZW5ndGggLSBXaGVyZSB0aGUgbGVuZ3RoIGlzIHJldHVybmVkCisgKiAgICAgICAgICAgICAgY29udmVydGVkX25hbWUgICAgICAtIFdoZXJlIHRoZSByZXN1bHRpbmcgZXh0ZXJuYWwgbmFtZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyByZXR1cm5lZAorICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogQ29udmVydCBpbnRlcm5hbCBuYW1lIChlLmcuIDVjIDJmIDAyIDVmIDUwIDUyIDVmIDQzIDUwIDU1IDMwKQorICogICAgICAgICAgICAgIHRvIGl0cyBleHRlcm5hbCAocHJpbnRhYmxlKSBmb3JtIChlLmcuICJcX1BSXy5DUFUwIikKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCithY3BpX3N0YXR1cworYWNwaV9uc19leHRlcm5hbGl6ZV9uYW1lKHUzMiBpbnRlcm5hbF9uYW1lX2xlbmd0aCwKKwkJCSBjb25zdCBjaGFyICppbnRlcm5hbF9uYW1lLAorCQkJIHUzMiAqIGNvbnZlcnRlZF9uYW1lX2xlbmd0aCwgY2hhciAqKmNvbnZlcnRlZF9uYW1lKQoreworCXUzMiBuYW1lc19pbmRleCA9IDA7CisJdTMyIG51bV9zZWdtZW50cyA9IDA7CisJdTMyIHJlcXVpcmVkX2xlbmd0aDsKKwl1MzIgcHJlZml4X2xlbmd0aCA9IDA7CisJdTMyIGkgPSAwOworCXUzMiBqID0gMDsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0UobnNfZXh0ZXJuYWxpemVfbmFtZSk7CisKKwlpZiAoIWludGVybmFsX25hbWVfbGVuZ3RoIHx8ICFpbnRlcm5hbF9uYW1lIHx8ICFjb252ZXJ0ZWRfbmFtZSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX1BBUkFNRVRFUik7CisJfQorCisJLyoKKwkgKiBDaGVjayBmb3IgYSBwcmVmaXggKG9uZSAnXCcgfCBvbmUgb3IgbW9yZSAnXicpLgorCSAqLworCXN3aXRjaCAoaW50ZXJuYWxfbmFtZVswXSkgeworCWNhc2UgJ1xcJzoKKwkJcHJlZml4X2xlbmd0aCA9IDE7CisJCWJyZWFrOworCisJY2FzZSAnXic6CisJCWZvciAoaSA9IDA7IGkgPCBpbnRlcm5hbF9uYW1lX2xlbmd0aDsgaSsrKSB7CisJCQlpZiAoaW50ZXJuYWxfbmFtZVtpXSA9PSAnXicpIHsKKwkJCQlwcmVmaXhfbGVuZ3RoID0gaSArIDE7CisJCQl9IGVsc2UgeworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJaWYgKGkgPT0gaW50ZXJuYWxfbmFtZV9sZW5ndGgpIHsKKwkJCXByZWZpeF9sZW5ndGggPSBpOworCQl9CisKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwkvKgorCSAqIENoZWNrIGZvciBvYmplY3QgbmFtZXMuICBOb3RlIHRoYXQgdGhlcmUgY291bGQgYmUgMC0yNTUgb2YgdGhlc2UKKwkgKiA0LWJ5dGUgZWxlbWVudHMuCisJICovCisJaWYgKHByZWZpeF9sZW5ndGggPCBpbnRlcm5hbF9uYW1lX2xlbmd0aCkgeworCQlzd2l0Y2ggKGludGVybmFsX25hbWVbcHJlZml4X2xlbmd0aF0pIHsKKwkJY2FzZSBBTUxfTVVMVElfTkFNRV9QUkVGSVhfT1A6CisKKwkJCS8qIDxjb3VudD4gNC1ieXRlIG5hbWVzICovCisKKwkJCW5hbWVzX2luZGV4ID0gcHJlZml4X2xlbmd0aCArIDI7CisJCQludW1fc2VnbWVudHMgPSAodTgpCisJCQkgICAgaW50ZXJuYWxfbmFtZVsoYWNwaV9zaXplKSBwcmVmaXhfbGVuZ3RoICsgMV07CisJCQlicmVhazsKKworCQljYXNlIEFNTF9EVUFMX05BTUVfUFJFRklYOgorCisJCQkvKiBUd28gNC1ieXRlIG5hbWVzICovCisKKwkJCW5hbWVzX2luZGV4ID0gcHJlZml4X2xlbmd0aCArIDE7CisJCQludW1fc2VnbWVudHMgPSAyOworCQkJYnJlYWs7CisKKwkJY2FzZSAwOgorCisJCQkvKiBudWxsX25hbWUgKi8KKworCQkJbmFtZXNfaW5kZXggPSAwOworCQkJbnVtX3NlZ21lbnRzID0gMDsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisKKwkJCS8qIG9uZSA0LWJ5dGUgbmFtZSAqLworCisJCQluYW1lc19pbmRleCA9IHByZWZpeF9sZW5ndGg7CisJCQludW1fc2VnbWVudHMgPSAxOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvKgorCSAqIENhbGN1bGF0ZSB0aGUgbGVuZ3RoIG9mIGNvbnZlcnRlZF9uYW1lLCB3aGljaCBlcXVhbHMgdGhlIGxlbmd0aAorCSAqIG9mIHRoZSBwcmVmaXgsIGxlbmd0aCBvZiBhbGwgb2JqZWN0IG5hbWVzLCBsZW5ndGggb2YgYW55IHJlcXVpcmVkCisJICogcHVuY3R1YXRpb24gKCcuJykgYmV0d2VlbiBvYmplY3QgbmFtZXMsIHBsdXMgdGhlIE5VTEwgdGVybWluYXRvci4KKwkgKi8KKwlyZXF1aXJlZF9sZW5ndGggPSBwcmVmaXhfbGVuZ3RoICsgKDQgKiBudW1fc2VnbWVudHMpICsKKwkgICAgKChudW1fc2VnbWVudHMgPiAwKSA/IChudW1fc2VnbWVudHMgLSAxKSA6IDApICsgMTsKKworCS8qCisJICogQ2hlY2sgdG8gc2VlIGlmIHdlJ3JlIHN0aWxsIGluIGJvdW5kcy4gIElmIG5vdCwgdGhlcmUncyBhIHByb2JsZW0KKwkgKiB3aXRoIGludGVybmFsX25hbWUgKGludmFsaWQgZm9ybWF0KS4KKwkgKi8KKwlpZiAocmVxdWlyZWRfbGVuZ3RoID4gaW50ZXJuYWxfbmFtZV9sZW5ndGgpIHsKKwkJQUNQSV9FUlJPUigoQUVfSU5GTywgIkludmFsaWQgaW50ZXJuYWwgbmFtZSIpKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9QQVRITkFNRSk7CisJfQorCisJLyoKKwkgKiBCdWlsZCBjb252ZXJ0ZWRfbmFtZQorCSAqLworCSpjb252ZXJ0ZWRfbmFtZSA9IEFDUElfQUxMT0NBVEVfWkVST0VEKHJlcXVpcmVkX2xlbmd0aCk7CisJaWYgKCEoKmNvbnZlcnRlZF9uYW1lKSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9fTUVNT1JZKTsKKwl9CisKKwlqID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBwcmVmaXhfbGVuZ3RoOyBpKyspIHsKKwkJKCpjb252ZXJ0ZWRfbmFtZSlbaisrXSA9IGludGVybmFsX25hbWVbaV07CisJfQorCisJaWYgKG51bV9zZWdtZW50cyA+IDApIHsKKwkJZm9yIChpID0gMDsgaSA8IG51bV9zZWdtZW50czsgaSsrKSB7CisJCQlpZiAoaSA+IDApIHsKKwkJCQkoKmNvbnZlcnRlZF9uYW1lKVtqKytdID0gJy4nOworCQkJfQorCisJCQkoKmNvbnZlcnRlZF9uYW1lKVtqKytdID0gaW50ZXJuYWxfbmFtZVtuYW1lc19pbmRleCsrXTsKKwkJCSgqY29udmVydGVkX25hbWUpW2orK10gPSBpbnRlcm5hbF9uYW1lW25hbWVzX2luZGV4KytdOworCQkJKCpjb252ZXJ0ZWRfbmFtZSlbaisrXSA9IGludGVybmFsX25hbWVbbmFtZXNfaW5kZXgrK107CisJCQkoKmNvbnZlcnRlZF9uYW1lKVtqKytdID0gaW50ZXJuYWxfbmFtZVtuYW1lc19pbmRleCsrXTsKKwkJfQorCX0KKworCWlmIChjb252ZXJ0ZWRfbmFtZV9sZW5ndGgpIHsKKwkJKmNvbnZlcnRlZF9uYW1lX2xlbmd0aCA9ICh1MzIpIHJlcXVpcmVkX2xlbmd0aDsKKwl9CisKKwlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX25zX21hcF9oYW5kbGVfdG9fbm9kZQorICoKKyAqIFBBUkFNRVRFUlM6ICBIYW5kbGUgICAgICAgICAgLSBIYW5kbGUgdG8gYmUgY29udmVydGVkIHRvIGFuIE5vZGUKKyAqCisgKiBSRVRVUk46ICAgICAgQSBOYW1lIHRhYmxlIGVudHJ5IHBvaW50ZXIKKyAqCisgKiBERVNDUklQVElPTjogQ29udmVydCBhIG5hbWVzcGFjZSBoYW5kbGUgdG8gYSByZWFsIE5vZGUKKyAqCisgKiBOb3RlOiBSZWFsIGludGVnZXIgaGFuZGxlcyB3b3VsZCBhbGxvdyBmb3IgbW9yZSB2ZXJpZmljYXRpb24KKyAqICAgICAgIGFuZCBrZWVwIGFsbCBwb2ludGVycyB3aXRoaW4gdGhpcyBzdWJzeXN0ZW0gLSBob3dldmVyIHRoaXMgaW50cm9kdWNlcworICogICAgICAgbW9yZSAoYW5kIHBlcmhhcHMgdW5uZWNlc3NhcnkpIG92ZXJoZWFkLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICphY3BpX25zX21hcF9oYW5kbGVfdG9fbm9kZShhY3BpX2hhbmRsZSBoYW5kbGUpCit7CisKKwlBQ1BJX0ZVTkNUSU9OX0VOVFJZKCk7CisKKwkvKgorCSAqIFNpbXBsZSBpbXBsZW1lbnRhdGlvbgorCSAqLworCWlmICgoIWhhbmRsZSkgfHwgKGhhbmRsZSA9PSBBQ1BJX1JPT1RfT0JKRUNUKSkgeworCQlyZXR1cm4gKGFjcGlfZ2JsX3Jvb3Rfbm9kZSk7CisJfQorCisJLyogV2UgY2FuIGF0IGxlYXN0IGF0dGVtcHQgdG8gdmVyaWZ5IHRoZSBoYW5kbGUgKi8KKworCWlmIChBQ1BJX0dFVF9ERVNDUklQVE9SX1RZUEUoaGFuZGxlKSAhPSBBQ1BJX0RFU0NfVFlQRV9OQU1FRCkgeworCQlyZXR1cm4gKE5VTEwpOworCX0KKworCXJldHVybiAoQUNQSV9DQVNUX1BUUihzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSwgaGFuZGxlKSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfbnNfY29udmVydF9lbnRyeV90b19oYW5kbGUKKyAqCisgKiBQQVJBTUVURVJTOiAgTm9kZSAgICAgICAgICAtIE5vZGUgdG8gYmUgY29udmVydGVkIHRvIGEgSGFuZGxlCisgKgorICogUkVUVVJOOiAgICAgIEEgdXNlciBoYW5kbGUKKyAqCisgKiBERVNDUklQVElPTjogQ29udmVydCBhIHJlYWwgTm9kZSB0byBhIG5hbWVzcGFjZSBoYW5kbGUKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCithY3BpX2hhbmRsZSBhY3BpX25zX2NvbnZlcnRfZW50cnlfdG9faGFuZGxlKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlKQoreworCisJLyoKKwkgKiBTaW1wbGUgaW1wbGVtZW50YXRpb24gZm9yIG5vdzsKKwkgKi8KKwlyZXR1cm4gKChhY3BpX2hhbmRsZSkgbm9kZSk7CisKKy8qIEV4YW1wbGUgZnV0dXJlIGltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisJaWYgKCFOb2RlKQorCXsKKwkJcmV0dXJuIChOVUxMKTsKKwl9CisKKwlpZiAoTm9kZSA9PSBhY3BpX2dibF9yb290X25vZGUpCisJeworCQlyZXR1cm4gKEFDUElfUk9PVF9PQkpFQ1QpOworCX0KKworCXJldHVybiAoKGFjcGlfaGFuZGxlKSBOb2RlKTsKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfbnNfdGVybWluYXRlCisgKgorICogUEFSQU1FVEVSUzogIG5vbmUKKyAqCisgKiBSRVRVUk46ICAgICAgbm9uZQorICoKKyAqIERFU0NSSVBUSU9OOiBmcmVlIG1lbW9yeSBhbGxvY2F0ZWQgZm9yIG5hbWVzcGFjZSBhbmQgQUNQSSB0YWJsZSBzdG9yYWdlLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgYWNwaV9uc190ZXJtaW5hdGUodm9pZCkKK3sKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYzsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0UobnNfdGVybWluYXRlKTsKKworCS8qCisJICogMSkgRnJlZSB0aGUgZW50aXJlIG5hbWVzcGFjZSAtLSBhbGwgbm9kZXMgYW5kIG9iamVjdHMKKwkgKgorCSAqIERlbGV0ZSBhbGwgb2JqZWN0IGRlc2NyaXB0b3JzIGF0dGFjaGVkIHRvIG5hbWVwc2FjZSBub2RlcworCSAqLworCWFjcGlfbnNfZGVsZXRlX25hbWVzcGFjZV9zdWJ0cmVlKGFjcGlfZ2JsX3Jvb3Rfbm9kZSk7CisKKwkvKiBEZXRhY2ggYW55IG9iamVjdHMgYXR0YWNoZWQgdG8gdGhlIHJvb3QgKi8KKworCW9ial9kZXNjID0gYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0KGFjcGlfZ2JsX3Jvb3Rfbm9kZSk7CisJaWYgKG9ial9kZXNjKSB7CisJCWFjcGlfbnNfZGV0YWNoX29iamVjdChhY3BpX2dibF9yb290X25vZGUpOworCX0KKworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgIk5hbWVzcGFjZSBmcmVlZFxuIikpOworCXJldHVybl9WT0lEOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX25zX29wZW5zX3Njb3BlCisgKgorICogUEFSQU1FVEVSUzogIFR5cGUgICAgICAgIC0gQSB2YWxpZCBuYW1lc3BhY2UgdHlwZQorICoKKyAqIFJFVFVSTjogICAgICBORVdTQ09QRSBpZiB0aGUgcGFzc2VkIHR5cGUgIm9wZW5zIGEgbmFtZSBzY29wZSIgYWNjb3JkaW5nCisgKiAgICAgICAgICAgICAgdG8gdGhlIEFDUEkgc3BlY2lmaWNhdGlvbiwgZWxzZSAwCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordTMyIGFjcGlfbnNfb3BlbnNfc2NvcGUoYWNwaV9vYmplY3RfdHlwZSB0eXBlKQoreworCUFDUElfRlVOQ1RJT05fVFJBQ0VfU1RSKG5zX29wZW5zX3Njb3BlLCBhY3BpX3V0X2dldF90eXBlX25hbWUodHlwZSkpOworCisJaWYgKCFhY3BpX3V0X3ZhbGlkX29iamVjdF90eXBlKHR5cGUpKSB7CisKKwkJLyogdHlwZSBjb2RlIG91dCBvZiByYW5nZSAgKi8KKworCQlBQ1BJX1dBUk5JTkcoKEFFX0lORk8sICJJbnZhbGlkIE9iamVjdCBUeXBlICVYIiwgdHlwZSkpOworCQlyZXR1cm5fVUlOVDMyKEFDUElfTlNfTk9STUFMKTsKKwl9CisKKwlyZXR1cm5fVUlOVDMyKCgodTMyKSBhY3BpX2dibF9uc19wcm9wZXJ0aWVzW3R5cGVdKSAmIEFDUElfTlNfTkVXU0NPUEUpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX25zX2dldF9ub2RlCisgKgorICogUEFSQU1FVEVSUzogICpQYXRobmFtZSAgIC0gTmFtZSB0byBiZSBmb3VuZCwgaW4gZXh0ZXJuYWwgKEFTTCkgZm9ybWF0LiBUaGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwgKGJhY2tzbGFzaCkgYW5kIF4gKGNhcmF0KSBwcmVmaXhlcywgYW5kIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAocGVyaW9kKSB0byBzZXBhcmF0ZSBzZWdtZW50cyBhcmUgc3VwcG9ydGVkLgorICogICAgICAgICAgICAgIHByZWZpeF9ub2RlICAtIFJvb3Qgb2Ygc3VidHJlZSB0byBiZSBzZWFyY2hlZCwgb3IgTlNfQUxMIGZvciB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvb3Qgb2YgdGhlIG5hbWUgc3BhY2UuICBJZiBOYW1lIGlzIGZ1bGx5CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWFsaWZpZWQgKGZpcnN0IHM4IGlzICdcJyksIHRoZSBwYXNzZWQgdmFsdWUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIFNjb3BlIHdpbGwgbm90IGJlIGFjY2Vzc2VkLgorICogICAgICAgICAgICAgIEZsYWdzICAgICAgIC0gVXNlZCB0byBpbmRpY2F0ZSB3aGV0aGVyIHRvIHBlcmZvcm0gdXBzZWFyY2ggb3IKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdC4KKyAqICAgICAgICAgICAgICByZXR1cm5fbm9kZSAtIFdoZXJlIHRoZSBOb2RlIGlzIHJldHVybmVkCisgKgorICogREVTQ1JJUFRJT046IExvb2sgdXAgYSBuYW1lIHJlbGF0aXZlIHRvIGEgZ2l2ZW4gc2NvcGUgYW5kIHJldHVybiB0aGUKKyAqICAgICAgICAgICAgICBjb3JyZXNwb25kaW5nIE5vZGUuICBOT1RFOiBTY29wZSBjYW4gYmUgbnVsbC4KKyAqCisgKiBNVVRFWDogICAgICAgTG9ja3MgbmFtZXNwYWNlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworYWNwaV9zdGF0dXMKK2FjcGlfbnNfZ2V0X25vZGUoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKnByZWZpeF9ub2RlLAorCQkgY29uc3QgY2hhciAqcGF0aG5hbWUsCisJCSB1MzIgZmxhZ3MsIHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICoqcmV0dXJuX25vZGUpCit7CisJdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlIHNjb3BlX2luZm87CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCWNoYXIgKmludGVybmFsX3BhdGg7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUihuc19nZXRfbm9kZSwgcGF0aG5hbWUpOworCisJaWYgKCFwYXRobmFtZSkgeworCQkqcmV0dXJuX25vZGUgPSBwcmVmaXhfbm9kZTsKKwkJaWYgKCFwcmVmaXhfbm9kZSkgeworCQkJKnJldHVybl9ub2RlID0gYWNwaV9nYmxfcm9vdF9ub2RlOworCQl9CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CisJfQorCisJLyogQ29udmVydCBwYXRoIHRvIGludGVybmFsIHJlcHJlc2VudGF0aW9uICovCisKKwlzdGF0dXMgPSBhY3BpX25zX2ludGVybmFsaXplX25hbWUocGF0aG5hbWUsICZpbnRlcm5hbF9wYXRoKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CisJfQorCisJLyogTXVzdCBsb2NrIG5hbWVzcGFjZSBkdXJpbmcgbG9va3VwICovCisKKwlzdGF0dXMgPSBhY3BpX3V0X2FjcXVpcmVfbXV0ZXgoQUNQSV9NVFhfTkFNRVNQQUNFKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJZ290byBjbGVhbnVwOworCX0KKworCS8qIFNldHVwIGxvb2t1cCBzY29wZSAoc2VhcmNoIHN0YXJ0aW5nIHBvaW50KSAqLworCisJc2NvcGVfaW5mby5zY29wZS5ub2RlID0gcHJlZml4X25vZGU7CisKKwkvKiBMb29rdXAgdGhlIG5hbWUgaW4gdGhlIG5hbWVzcGFjZSAqLworCisJc3RhdHVzID0gYWNwaV9uc19sb29rdXAoJnNjb3BlX2luZm8sIGludGVybmFsX3BhdGgsIEFDUElfVFlQRV9BTlksCisJCQkJQUNQSV9JTU9ERV9FWEVDVVRFLAorCQkJCShmbGFncyB8IEFDUElfTlNfRE9OVF9PUEVOX1NDT1BFKSwgTlVMTCwKKwkJCQlyZXR1cm5fbm9kZSk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgIiVzLCAlc1xuIiwKKwkJCQkgIHBhdGhuYW1lLCBhY3BpX2Zvcm1hdF9leGNlcHRpb24oc3RhdHVzKSkpOworCX0KKworCSh2b2lkKWFjcGlfdXRfcmVsZWFzZV9tdXRleChBQ1BJX01UWF9OQU1FU1BBQ0UpOworCisgICAgICBjbGVhbnVwOgorCUFDUElfRlJFRShpbnRlcm5hbF9wYXRoKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9uc19nZXRfcGFyZW50X25vZGUKKyAqCisgKiBQQVJBTUVURVJTOiAgTm9kZSAgICAgICAtIEN1cnJlbnQgdGFibGUgZW50cnkKKyAqCisgKiBSRVRVUk46ICAgICAgUGFyZW50IGVudHJ5IG9mIHRoZSBnaXZlbiBlbnRyeQorICoKKyAqIERFU0NSSVBUSU9OOiBPYnRhaW4gdGhlIHBhcmVudCBlbnRyeSBmb3IgYSBnaXZlbiBlbnRyeSBpbiB0aGUgbmFtZXNwYWNlLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICphY3BpX25zX2dldF9wYXJlbnRfbm9kZShzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZQorCQkJCQkJICAgICpub2RlKQoreworCUFDUElfRlVOQ1RJT05fRU5UUlkoKTsKKworCWlmICghbm9kZSkgeworCQlyZXR1cm4gKE5VTEwpOworCX0KKworCS8qCisJICogV2FsayB0byB0aGUgZW5kIG9mIHRoaXMgcGVlciBsaXN0LiBUaGUgbGFzdCBlbnRyeSBpcyBtYXJrZWQgd2l0aCBhIGZsYWcKKwkgKiBhbmQgdGhlIHBlZXIgcG9pbnRlciBpcyByZWFsbHkgYSBwb2ludGVyIGJhY2sgdG8gdGhlIHBhcmVudC4gVGhpcyBzYXZlcworCSAqIHB1dHRpbmcgYSBwYXJlbnQgYmFjayBwb2ludGVyIGluIGVhY2ggYW5kIGV2ZXJ5IG5hbWVkIG9iamVjdCEKKwkgKi8KKwl3aGlsZSAoIShub2RlLT5mbGFncyAmIEFOT0JKX0VORF9PRl9QRUVSX0xJU1QpKSB7CisJCW5vZGUgPSBub2RlLT5wZWVyOworCX0KKworCXJldHVybiAobm9kZS0+cGVlcik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfbnNfZ2V0X25leHRfdmFsaWRfbm9kZQorICoKKyAqIFBBUkFNRVRFUlM6ICBOb2RlICAgICAgIC0gQ3VycmVudCB0YWJsZSBlbnRyeQorICoKKyAqIFJFVFVSTjogICAgICBOZXh0IHZhbGlkIE5vZGUgaW4gdGhlIGxpbmtlZCBub2RlIGxpc3QuIE5VTEwgaWYgbm8gbW9yZSB2YWxpZAorICogICAgICAgICAgICAgIG5vZGVzLgorICoKKyAqIERFU0NSSVBUSU9OOiBGaW5kIHRoZSBuZXh0IHZhbGlkIG5vZGUgd2l0aGluIGEgbmFtZSB0YWJsZS4KKyAqICAgICAgICAgICAgICBVc2VmdWwgZm9yIGltcGxlbWVudGluZyBOVUxMLWVuZC1vZi1saXN0IGxvb3BzLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICphY3BpX25zX2dldF9uZXh0X3ZhbGlkX25vZGUoc3RydWN0CisJCQkJCQkJYWNwaV9uYW1lc3BhY2Vfbm9kZQorCQkJCQkJCSpub2RlKQoreworCisJLyogSWYgd2UgYXJlIGF0IHRoZSBlbmQgb2YgdGhpcyBwZWVyIGxpc3QsIHJldHVybiBOVUxMICovCisKKwlpZiAobm9kZS0+ZmxhZ3MgJiBBTk9CSl9FTkRfT0ZfUEVFUl9MSVNUKSB7CisJCXJldHVybiBOVUxMOworCX0KKworCS8qIE90aGVyd2lzZSBqdXN0IHJldHVybiB0aGUgbmV4dCBwZWVyICovCisKKwlyZXR1cm4gKG5vZGUtPnBlZXIpOworfQorCisjaWZkZWYgQUNQSV9PQlNPTEVURV9GVU5DVElPTlMKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfbnNfZmluZF9wYXJlbnRfbmFtZQorICoKKyAqIFBBUkFNRVRFUlM6ICAqY2hpbGRfbm9kZSAgICAgICAgICAgIC0gTmFtZWQgT2JqIHdob3NlIG5hbWUgaXMgdG8gYmUgZm91bmQKKyAqCisgKiBSRVRVUk46ICAgICAgVGhlIEFDUEkgbmFtZQorICoKKyAqIERFU0NSSVBUSU9OOiBTZWFyY2ggZm9yIHRoZSBnaXZlbiBvYmogaW4gaXRzIHBhcmVudCBzY29wZSBhbmQgcmV0dXJuIHRoZQorICogICAgICAgICAgICAgIG5hbWUgc2VnbWVudCwgb3IgIj8/Pz8iIGlmIHRoZSBwYXJlbnQgbmFtZSBjYW4ndCBiZSBmb3VuZAorICogICAgICAgICAgICAgICh3aGljaCAic2hvdWxkIG5vdCBoYXBwZW4iKS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCithY3BpX25hbWUgYWNwaV9uc19maW5kX3BhcmVudF9uYW1lKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICogY2hpbGRfbm9kZSkKK3sKKwlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqcGFyZW50X25vZGU7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKG5zX2ZpbmRfcGFyZW50X25hbWUpOworCisJaWYgKGNoaWxkX25vZGUpIHsKKworCQkvKiBWYWxpZCBlbnRyeS4gIEdldCB0aGUgcGFyZW50IE5vZGUgKi8KKworCQlwYXJlbnRfbm9kZSA9IGFjcGlfbnNfZ2V0X3BhcmVudF9ub2RlKGNoaWxkX25vZGUpOworCQlpZiAocGFyZW50X25vZGUpIHsKKwkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVhFQywKKwkJCQkJICAiUGFyZW50IG9mICVwIFslNC40c10gaXMgJXAgWyU0LjRzXVxuIiwKKwkJCQkJICBjaGlsZF9ub2RlLAorCQkJCQkgIGFjcGlfdXRfZ2V0X25vZGVfbmFtZShjaGlsZF9ub2RlKSwKKwkJCQkJICBwYXJlbnRfbm9kZSwKKwkJCQkJICBhY3BpX3V0X2dldF9ub2RlX25hbWUocGFyZW50X25vZGUpKSk7CisKKwkJCWlmIChwYXJlbnRfbm9kZS0+bmFtZS5pbnRlZ2VyKSB7CisJCQkJcmV0dXJuX1ZBTFVFKChhY3BpX25hbWUpIHBhcmVudF9ub2RlLT5uYW1lLgorCQkJCQkgICAgIGludGVnZXIpOworCQkJfQorCQl9CisKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FWEVDLAorCQkJCSAgIlVuYWJsZSB0byBmaW5kIHBhcmVudCBvZiAlcCAoJTQuNHMpXG4iLAorCQkJCSAgY2hpbGRfbm9kZSwKKwkJCQkgIGFjcGlfdXRfZ2V0X25vZGVfbmFtZShjaGlsZF9ub2RlKSkpOworCX0KKworCXJldHVybl9WQUxVRShBQ1BJX1VOS05PV05fTkFNRSk7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvbnN3YWxrLmMgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL25zd2Fsay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwMDg5NWYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL25zd2Fsay5jCkBAIC0wLDAgKzEsMjk2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogTW9kdWxlIE5hbWU6IG5zd2FsayAtIEZ1bmN0aW9ucyBmb3Igd2Fsa2luZyB0aGUgQUNQSSBuYW1lc3BhY2UKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA4LCBJbnRlbCBDb3JwLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAorICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgYXQgbWluaW11bSBhIGRpc2NsYWltZXIKKyAqICAgIHN1YnN0YW50aWFsbHkgc2ltaWxhciB0byB0aGUgIk5PIFdBUlJBTlRZIiBkaXNjbGFpbWVyIGJlbG93CisgKiAgICAoIkRpc2NsYWltZXIiKSBhbmQgYW55IHJlZGlzdHJpYnV0aW9uIG11c3QgYmUgY29uZGl0aW9uZWQgdXBvbgorICogICAgaW5jbHVkaW5nIGEgc3Vic3RhbnRpYWxseSBzaW1pbGFyIERpc2NsYWltZXIgcmVxdWlyZW1lbnQgZm9yIGZ1cnRoZXIKKyAqICAgIGJpbmFyeSByZWRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcworICogICAgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBOTyBXQVJSQU5UWQorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcKKyAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgorICovCisKKyNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KKyNpbmNsdWRlICJhY2NvbW1vbi5oIgorI2luY2x1ZGUgImFjbmFtZXNwLmgiCisKKyNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX05BTUVTUEFDRQorQUNQSV9NT0RVTEVfTkFNRSgibnN3YWxrIikKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9uc19nZXRfbmV4dF9ub2RlCisgKgorICogUEFSQU1FVEVSUzogIFR5cGUgICAgICAgICAgICAgICAgLSBUeXBlIG9mIG5vZGUgdG8gYmUgc2VhcmNoZWQgZm9yCisgKiAgICAgICAgICAgICAgcGFyZW50X25vZGUgICAgICAgICAtIFBhcmVudCBub2RlIHdob3NlIGNoaWxkcmVuIHdlIGFyZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXR0aW5nCisgKiAgICAgICAgICAgICAgY2hpbGRfbm9kZSAgICAgICAgICAtIFByZXZpb3VzIGNoaWxkIHRoYXQgd2FzIGZvdW5kLgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgTkVYVCBjaGlsZCB3aWxsIGJlIHJldHVybmVkCisgKgorICogUkVUVVJOOiAgICAgIHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlIC0gUG9pbnRlciB0byB0aGUgTkVYVCBjaGlsZCBvciBOVUxMIGlmCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbmUgaXMgZm91bmQuCisgKgorICogREVTQ1JJUFRJT046IFJldHVybiB0aGUgbmV4dCBwZWVyIG5vZGUgd2l0aGluIHRoZSBuYW1lc3BhY2UuICBJZiBIYW5kbGUKKyAqICAgICAgICAgICAgICBpcyB2YWxpZCwgU2NvcGUgaXMgaWdub3JlZC4gIE90aGVyd2lzZSwgdGhlIGZpcnN0IG5vZGUKKyAqICAgICAgICAgICAgICB3aXRoaW4gU2NvcGUgaXMgcmV0dXJuZWQuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICphY3BpX25zX2dldF9uZXh0X25vZGUoYWNwaV9vYmplY3RfdHlwZSB0eXBlLCBzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZQorCQkJCQkJICAqcGFyZW50X25vZGUsIHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlCisJCQkJCQkgICpjaGlsZF9ub2RlKQoreworCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpuZXh0X25vZGUgPSBOVUxMOworCisJQUNQSV9GVU5DVElPTl9FTlRSWSgpOworCisJaWYgKCFjaGlsZF9ub2RlKSB7CisKKwkJLyogSXQncyByZWFsbHkgdGhlIHBhcmVudCdzIF9zY29wZV8gdGhhdCB3ZSB3YW50ICovCisKKwkJbmV4dF9ub2RlID0gcGFyZW50X25vZGUtPmNoaWxkOworCX0KKworCWVsc2UgeworCQkvKiBTdGFydCBzZWFyY2ggYXQgdGhlIE5FWFQgbm9kZSAqLworCisJCW5leHRfbm9kZSA9IGFjcGlfbnNfZ2V0X25leHRfdmFsaWRfbm9kZShjaGlsZF9ub2RlKTsKKwl9CisKKwkvKiBJZiBhbnkgdHlwZSBpcyBPSywgd2UgYXJlIGRvbmUgKi8KKworCWlmICh0eXBlID09IEFDUElfVFlQRV9BTlkpIHsKKworCQkvKiBuZXh0X25vZGUgaXMgTlVMTCBpZiB3ZSBhcmUgYXQgdGhlIGVuZC1vZi1saXN0ICovCisKKwkJcmV0dXJuIChuZXh0X25vZGUpOworCX0KKworCS8qIE11c3Qgc2VhcmNoIGZvciB0aGUgbm9kZSAtLSBidXQgd2l0aGluIHRoaXMgc2NvcGUgb25seSAqLworCisJd2hpbGUgKG5leHRfbm9kZSkgeworCisJCS8qIElmIHR5cGUgbWF0Y2hlcywgd2UgYXJlIGRvbmUgKi8KKworCQlpZiAobmV4dF9ub2RlLT50eXBlID09IHR5cGUpIHsKKwkJCXJldHVybiAobmV4dF9ub2RlKTsKKwkJfQorCisJCS8qIE90aGVyd2lzZSwgbW92ZSBvbiB0byB0aGUgbmV4dCBub2RlICovCisKKwkJbmV4dF9ub2RlID0gYWNwaV9uc19nZXRfbmV4dF92YWxpZF9ub2RlKG5leHRfbm9kZSk7CisJfQorCisJLyogTm90IGZvdW5kICovCisKKwlyZXR1cm4gKE5VTEwpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX25zX3dhbGtfbmFtZXNwYWNlCisgKgorICogUEFSQU1FVEVSUzogIFR5cGUgICAgICAgICAgICAgICAgLSBhY3BpX29iamVjdF90eXBlIHRvIHNlYXJjaCBmb3IKKyAqICAgICAgICAgICAgICBzdGFydF9ub2RlICAgICAgICAgIC0gSGFuZGxlIGluIG5hbWVzcGFjZSB3aGVyZSBzZWFyY2ggYmVnaW5zCisgKiAgICAgICAgICAgICAgbWF4X2RlcHRoICAgICAgICAgICAtIERlcHRoIHRvIHdoaWNoIHNlYXJjaCBpcyB0byByZWFjaAorICogICAgICAgICAgICAgIEZsYWdzICAgICAgICAgICAgICAgLSBXaGV0aGVyIHRvIHVubG9jayB0aGUgTlMgYmVmb3JlIGludm9raW5nCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBjYWxsYmFjayByb3V0aW5lCisgKiAgICAgICAgICAgICAgdXNlcl9mdW5jdGlvbiAgICAgICAtIENhbGxlZCB3aGVuIGFuIG9iamVjdCBvZiAiVHlwZSIgaXMgZm91bmQKKyAqICAgICAgICAgICAgICBDb250ZXh0ICAgICAgICAgICAgIC0gUGFzc2VkIHRvIHVzZXIgZnVuY3Rpb24KKyAqICAgICAgICAgICAgICByZXR1cm5fdmFsdWUgICAgICAgIC0gZnJvbSB0aGUgdXNlcl9mdW5jdGlvbiBpZiB0ZXJtaW5hdGVkIGVhcmx5LgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdGhlcndpc2UsIHJldHVybnMgTlVMTC4KKyAqIFJFVFVSTlM6ICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogUGVyZm9ybXMgYSBtb2RpZmllZCBkZXB0aC1maXJzdCB3YWxrIG9mIHRoZSBuYW1lc3BhY2UgdHJlZSwKKyAqICAgICAgICAgICAgICBzdGFydGluZyAoYW5kIGVuZGluZykgYXQgdGhlIG5vZGUgc3BlY2lmaWVkIGJ5IHN0YXJ0X2hhbmRsZS4KKyAqICAgICAgICAgICAgICBUaGUgdXNlcl9mdW5jdGlvbiBpcyBjYWxsZWQgd2hlbmV2ZXIgYSBub2RlIHRoYXQgbWF0Y2hlcworICogICAgICAgICAgICAgIHRoZSB0eXBlIHBhcmFtZXRlciBpcyBmb3VuZC4gIElmIHRoZSB1c2VyIGZ1bmN0aW9uIHJldHVybnMKKyAqICAgICAgICAgICAgICBhIG5vbi16ZXJvIHZhbHVlLCB0aGUgc2VhcmNoIGlzIHRlcm1pbmF0ZWQgaW1tZWRpYXRlbHkgYW5kIHRoaXMKKyAqICAgICAgICAgICAgICB2YWx1ZSBpcyByZXR1cm5lZCB0byB0aGUgY2FsbGVyLgorICoKKyAqICAgICAgICAgICAgICBUaGUgcG9pbnQgb2YgdGhpcyBwcm9jZWR1cmUgaXMgdG8gcHJvdmlkZSBhIGdlbmVyaWMgbmFtZXNwYWNlCisgKiAgICAgICAgICAgICAgd2FsayByb3V0aW5lIHRoYXQgY2FuIGJlIGNhbGxlZCBmcm9tIG11bHRpcGxlIHBsYWNlcyB0bworICogICAgICAgICAgICAgIHByb3ZpZGUgbXVsdGlwbGUgc2VydmljZXM7ICB0aGUgVXNlciBGdW5jdGlvbiBjYW4gYmUgdGFpbG9yZWQKKyAqICAgICAgICAgICAgICB0byBlYWNoIHRhc2ssIHdoZXRoZXIgaXQgaXMgYSBwcmludCBmdW5jdGlvbiwgYSBjb21wYXJlCisgKiAgICAgICAgICAgICAgZnVuY3Rpb24sIGV0Yy4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCithY3BpX3N0YXR1cworYWNwaV9uc193YWxrX25hbWVzcGFjZShhY3BpX29iamVjdF90eXBlIHR5cGUsCisJCSAgICAgICBhY3BpX2hhbmRsZSBzdGFydF9ub2RlLAorCQkgICAgICAgdTMyIG1heF9kZXB0aCwKKwkJICAgICAgIHUzMiBmbGFncywKKwkJICAgICAgIGFjcGlfd2Fsa19jYWxsYmFjayB1c2VyX2Z1bmN0aW9uLAorCQkgICAgICAgdm9pZCAqY29udGV4dCwgdm9pZCAqKnJldHVybl92YWx1ZSkKK3sKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJYWNwaV9zdGF0dXMgbXV0ZXhfc3RhdHVzOworCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpjaGlsZF9ub2RlOworCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpwYXJlbnRfbm9kZTsKKwlhY3BpX29iamVjdF90eXBlIGNoaWxkX3R5cGU7CisJdTMyIGxldmVsOworCisJQUNQSV9GVU5DVElPTl9UUkFDRShuc193YWxrX25hbWVzcGFjZSk7CisKKwkvKiBTcGVjaWFsIGNhc2UgZm9yIHRoZSBuYW1lc3BhY2UgUm9vdCBOb2RlICovCisKKwlpZiAoc3RhcnRfbm9kZSA9PSBBQ1BJX1JPT1RfT0JKRUNUKSB7CisJCXN0YXJ0X25vZGUgPSBhY3BpX2dibF9yb290X25vZGU7CisJfQorCisJLyogTnVsbCBjaGlsZCBtZWFucyAiZ2V0IGZpcnN0IG5vZGUiICovCisKKwlwYXJlbnRfbm9kZSA9IHN0YXJ0X25vZGU7CisJY2hpbGRfbm9kZSA9IE5VTEw7CisJY2hpbGRfdHlwZSA9IEFDUElfVFlQRV9BTlk7CisJbGV2ZWwgPSAxOworCisJLyoKKwkgKiBUcmF2ZXJzZSB0aGUgdHJlZSBvZiBub2RlcyB1bnRpbCB3ZSBidWJibGUgYmFjayB1cCB0byB3aGVyZSB3ZQorCSAqIHN0YXJ0ZWQuIFdoZW4gTGV2ZWwgaXMgemVybywgdGhlIGxvb3AgaXMgZG9uZSBiZWNhdXNlIHdlIGhhdmUKKwkgKiBidWJibGVkIHVwIHRvIChhbmQgcGFzc2VkKSB0aGUgb3JpZ2luYWwgcGFyZW50IGhhbmRsZSAoc3RhcnRfZW50cnkpCisJICovCisJd2hpbGUgKGxldmVsID4gMCkgeworCisJCS8qIEdldCB0aGUgbmV4dCBub2RlIGluIHRoaXMgc2NvcGUuICBOdWxsIGlmIG5vdCBmb3VuZCAqLworCisJCXN0YXR1cyA9IEFFX09LOworCQljaGlsZF9ub2RlID0KKwkJICAgIGFjcGlfbnNfZ2V0X25leHRfbm9kZShBQ1BJX1RZUEVfQU5ZLCBwYXJlbnRfbm9kZSwKKwkJCQkJICBjaGlsZF9ub2RlKTsKKwkJaWYgKGNoaWxkX25vZGUpIHsKKworCQkJLyogRm91bmQgbmV4dCBjaGlsZCwgZ2V0IHRoZSB0eXBlIGlmIHdlIGFyZSBub3Qgc2VhcmNoaW5nIGZvciBBTlkgKi8KKworCQkJaWYgKHR5cGUgIT0gQUNQSV9UWVBFX0FOWSkgeworCQkJCWNoaWxkX3R5cGUgPSBjaGlsZF9ub2RlLT50eXBlOworCQkJfQorCisJCQkvKgorCQkJICogSWdub3JlIGFsbCB0ZW1wb3JhcnkgbmFtZXNwYWNlIG5vZGVzIChjcmVhdGVkIGR1cmluZyBjb250cm9sCisJCQkgKiBtZXRob2QgZXhlY3V0aW9uKSB1bmxlc3MgdG9sZCBvdGhlcndpc2UuIFRoZXNlIHRlbXBvcmFyeSBub2RlcworCQkJICogY2FuIGNhdXNlIGEgcmFjZSBjb25kaXRpb24gYmVjYXVzZSB0aGV5IGNhbiBiZSBkZWxldGVkIGR1cmluZyB0aGUKKwkJCSAqIGV4ZWN1dGlvbiBvZiB0aGUgdXNlciBmdW5jdGlvbiAoaWYgdGhlIG5hbWVzcGFjZSBpcyB1bmxvY2tlZCBiZWZvcmUKKwkJCSAqIGludm9jYXRpb24gb2YgdGhlIHVzZXIgZnVuY3Rpb24uKSBPbmx5IHRoZSBkZWJ1Z2dlciBuYW1lc3BhY2UgZHVtcAorCQkJICogd2lsbCBleGFtaW5lIHRoZSB0ZW1wb3Jhcnkgbm9kZXMuCisJCQkgKi8KKwkJCWlmICgoY2hpbGRfbm9kZS0+ZmxhZ3MgJiBBTk9CSl9URU1QT1JBUlkpICYmCisJCQkgICAgIShmbGFncyAmIEFDUElfTlNfV0FMS19URU1QX05PREVTKSkgeworCQkJCXN0YXR1cyA9IEFFX0NUUkxfREVQVEg7CisJCQl9CisKKwkJCS8qIFR5cGUgbXVzdCBtYXRjaCByZXF1ZXN0ZWQgdHlwZSAqLworCisJCQllbHNlIGlmIChjaGlsZF90eXBlID09IHR5cGUpIHsKKwkJCQkvKgorCQkJCSAqIEZvdW5kIGEgbWF0Y2hpbmcgbm9kZSwgaW52b2tlIHRoZSB1c2VyIGNhbGxiYWNrIGZ1bmN0aW9uLgorCQkJCSAqIFVubG9jayB0aGUgbmFtZXNwYWNlIGlmIGZsYWcgaXMgc2V0LgorCQkJCSAqLworCQkJCWlmIChmbGFncyAmIEFDUElfTlNfV0FMS19VTkxPQ0spIHsKKwkJCQkJbXV0ZXhfc3RhdHVzID0KKwkJCQkJICAgIGFjcGlfdXRfcmVsZWFzZV9tdXRleAorCQkJCQkgICAgKEFDUElfTVRYX05BTUVTUEFDRSk7CisJCQkJCWlmIChBQ1BJX0ZBSUxVUkUobXV0ZXhfc3RhdHVzKSkgeworCQkJCQkJcmV0dXJuX0FDUElfU1RBVFVTCisJCQkJCQkgICAgKG11dGV4X3N0YXR1cyk7CisJCQkJCX0KKwkJCQl9CisKKwkJCQlzdGF0dXMgPQorCQkJCSAgICB1c2VyX2Z1bmN0aW9uKGNoaWxkX25vZGUsIGxldmVsLCBjb250ZXh0LAorCQkJCQkJICByZXR1cm5fdmFsdWUpOworCisJCQkJaWYgKGZsYWdzICYgQUNQSV9OU19XQUxLX1VOTE9DSykgeworCQkJCQltdXRleF9zdGF0dXMgPQorCQkJCQkgICAgYWNwaV91dF9hY3F1aXJlX211dGV4CisJCQkJCSAgICAoQUNQSV9NVFhfTkFNRVNQQUNFKTsKKwkJCQkJaWYgKEFDUElfRkFJTFVSRShtdXRleF9zdGF0dXMpKSB7CisJCQkJCQlyZXR1cm5fQUNQSV9TVEFUVVMKKwkJCQkJCSAgICAobXV0ZXhfc3RhdHVzKTsKKwkJCQkJfQorCQkJCX0KKworCQkJCXN3aXRjaCAoc3RhdHVzKSB7CisJCQkJY2FzZSBBRV9PSzoKKwkJCQljYXNlIEFFX0NUUkxfREVQVEg6CisKKwkJCQkJLyogSnVzdCBrZWVwIGdvaW5nICovCisJCQkJCWJyZWFrOworCisJCQkJY2FzZSBBRV9DVFJMX1RFUk1JTkFURToKKworCQkJCQkvKiBFeGl0IG5vdywgd2l0aCBPSyBzdGF0dXMgKi8KKworCQkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOworCisJCQkJZGVmYXVsdDoKKworCQkJCQkvKiBBbGwgb3RoZXJzIGFyZSB2YWxpZCBleGNlcHRpb25zICovCisKKwkJCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CisJCQkJfQorCQkJfQorCisJCQkvKgorCQkJICogRGVwdGggZmlyc3Qgc2VhcmNoOiBBdHRlbXB0IHRvIGdvIGRvd24gYW5vdGhlciBsZXZlbCBpbiB0aGUKKwkJCSAqIG5hbWVzcGFjZSBpZiB3ZSBhcmUgYWxsb3dlZCB0by4gIERvbid0IGdvIGFueSBmdXJ0aGVyIGlmIHdlIGhhdmUKKwkJCSAqIHJlYWNoZWQgdGhlIGNhbGxlciBzcGVjaWZpZWQgbWF4aW11bSBkZXB0aCBvciBpZiB0aGUgdXNlcgorCQkJICogZnVuY3Rpb24gaGFzIHNwZWNpZmllZCB0aGF0IHRoZSBtYXhpbXVtIGRlcHRoIGhhcyBiZWVuIHJlYWNoZWQuCisJCQkgKi8KKwkJCWlmICgobGV2ZWwgPCBtYXhfZGVwdGgpICYmIChzdGF0dXMgIT0gQUVfQ1RSTF9ERVBUSCkpIHsKKwkJCQlpZiAoYWNwaV9uc19nZXRfbmV4dF9ub2RlCisJCQkJICAgIChBQ1BJX1RZUEVfQU5ZLCBjaGlsZF9ub2RlLCBOVUxMKSkgeworCisJCQkJCS8qIFRoZXJlIGlzIGF0IGxlYXN0IG9uZSBjaGlsZCBvZiB0aGlzIG5vZGUsIHZpc2l0IGl0ICovCisKKwkJCQkJbGV2ZWwrKzsKKwkJCQkJcGFyZW50X25vZGUgPSBjaGlsZF9ub2RlOworCQkJCQljaGlsZF9ub2RlID0gTlVMTDsKKwkJCQl9CisJCQl9CisJCX0gZWxzZSB7CisJCQkvKgorCQkJICogTm8gbW9yZSBjaGlsZHJlbiBvZiB0aGlzIG5vZGUgKGFjcGlfbnNfZ2V0X25leHRfbm9kZSBmYWlsZWQpLCBnbworCQkJICogYmFjayB1cHdhcmRzIGluIHRoZSBuYW1lc3BhY2UgdHJlZSB0byB0aGUgbm9kZSdzIHBhcmVudC4KKwkJCSAqLworCQkJbGV2ZWwtLTsKKwkJCWNoaWxkX25vZGUgPSBwYXJlbnRfbm9kZTsKKwkJCXBhcmVudF9ub2RlID0gYWNwaV9uc19nZXRfcGFyZW50X25vZGUocGFyZW50X25vZGUpOworCQl9CisJfQorCisJLyogQ29tcGxldGUgd2Fsaywgbm90IHRlcm1pbmF0ZWQgYnkgdXNlciBmdW5jdGlvbiAqLworCisJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvbnN4ZmV2YWwuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvbnN4ZmV2YWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMmE3MTcxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS9uc3hmZXZhbC5jCkBAIC0wLDAgKzEsODEyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIE1vZHVsZSBOYW1lOiBuc3hmZXZhbCAtIFB1YmxpYyBpbnRlcmZhY2VzIHRvIHRoZSBBQ1BJIHN1YnN5c3RlbQorICogICAgICAgICAgICAgICAgICAgICAgICAgQUNQSSBPYmplY3QgZXZhbHVhdGlvbiBpbnRlcmZhY2VzCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDgsIEludGVsIENvcnAuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCisgKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSBhdCBtaW5pbXVtIGEgZGlzY2xhaW1lcgorICogICAgc3Vic3RhbnRpYWxseSBzaW1pbGFyIHRvIHRoZSAiTk8gV0FSUkFOVFkiIGRpc2NsYWltZXIgYmVsb3cKKyAqICAgICgiRGlzY2xhaW1lciIpIGFuZCBhbnkgcmVkaXN0cmlidXRpb24gbXVzdCBiZSBjb25kaXRpb25lZCB1cG9uCisgKiAgICBpbmNsdWRpbmcgYSBzdWJzdGFudGlhbGx5IHNpbWlsYXIgRGlzY2xhaW1lciByZXF1aXJlbWVudCBmb3IgZnVydGhlcgorICogICAgYmluYXJ5IHJlZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzCisgKiAgICBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIE5PIFdBUlJBTlRZCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORworICogSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCisgKi8KKworI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgorI2luY2x1ZGUgImFjY29tbW9uLmgiCisjaW5jbHVkZSAiYWNuYW1lc3AuaCIKKyNpbmNsdWRlICJhY2ludGVycC5oIgorCisjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9OQU1FU1BBQ0UKK0FDUElfTU9EVUxFX05BTUUoIm5zeGZldmFsIikKKworLyogTG9jYWwgcHJvdG90eXBlcyAqLworc3RhdGljIHZvaWQgYWNwaV9uc19yZXNvbHZlX3JlZmVyZW5jZXMoc3RydWN0IGFjcGlfZXZhbHVhdGVfaW5mbyAqaW5mbyk7CisKKyNpZmRlZiBBQ1BJX0ZVVFVSRV9VU0FHRQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9ldmFsdWF0ZV9vYmplY3RfdHlwZWQKKyAqCisgKiBQQVJBTUVURVJTOiAgSGFuZGxlICAgICAgICAgICAgICAtIE9iamVjdCBoYW5kbGUgKG9wdGlvbmFsKQorICogICAgICAgICAgICAgIFBhdGhuYW1lICAgICAgICAgICAgLSBPYmplY3QgcGF0aG5hbWUgKG9wdGlvbmFsKQorICogICAgICAgICAgICAgIGV4dGVybmFsX3BhcmFtcyAgICAgLSBMaXN0IG9mIHBhcmFtZXRlcnMgdG8gcGFzcyB0byBtZXRob2QsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlcm1pbmF0ZWQgYnkgTlVMTC4gIE1heSBiZSBOVUxMCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5vIHBhcmFtZXRlcnMgYXJlIGJlaW5nIHBhc3NlZC4KKyAqICAgICAgICAgICAgICByZXR1cm5fYnVmZmVyICAgICAgIC0gV2hlcmUgdG8gcHV0IG1ldGhvZCdzIHJldHVybiB2YWx1ZSAoaWYKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW55KS4gIElmIE5VTEwsIG5vIHZhbHVlIGlzIHJldHVybmVkLgorICogICAgICAgICAgICAgIHJldHVybl90eXBlICAgICAgICAgLSBFeHBlY3RlZCB0eXBlIG9mIHJldHVybiBvYmplY3QKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IEZpbmQgYW5kIGV2YWx1YXRlIHRoZSBnaXZlbiBvYmplY3QsIHBhc3NpbmcgdGhlIGdpdmVuCisgKiAgICAgICAgICAgICAgcGFyYW1ldGVycyBpZiBuZWNlc3NhcnkuICBPbmUgb2YgIkhhbmRsZSIgb3IgIlBhdGhuYW1lIiBtdXN0CisgKiAgICAgICAgICAgICAgYmUgdmFsaWQgKG5vbi1udWxsKQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2FjcGlfc3RhdHVzCithY3BpX2V2YWx1YXRlX29iamVjdF90eXBlZChhY3BpX2hhbmRsZSBoYW5kbGUsCisJCQkgICBhY3BpX3N0cmluZyBwYXRobmFtZSwKKwkJCSAgIHN0cnVjdCBhY3BpX29iamVjdF9saXN0ICpleHRlcm5hbF9wYXJhbXMsCisJCQkgICBzdHJ1Y3QgYWNwaV9idWZmZXIgKnJldHVybl9idWZmZXIsCisJCQkgICBhY3BpX29iamVjdF90eXBlIHJldHVybl90eXBlKQoreworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwl1OCBtdXN0X2ZyZWUgPSBGQUxTRTsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0UoYWNwaV9ldmFsdWF0ZV9vYmplY3RfdHlwZWQpOworCisJLyogUmV0dXJuIGJ1ZmZlciBtdXN0IGJlIHZhbGlkICovCisKKwlpZiAoIXJldHVybl9idWZmZXIpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9QQVJBTUVURVIpOworCX0KKworCWlmIChyZXR1cm5fYnVmZmVyLT5sZW5ndGggPT0gQUNQSV9BTExPQ0FURV9CVUZGRVIpIHsKKwkJbXVzdF9mcmVlID0gVFJVRTsKKwl9CisKKwkvKiBFdmFsdWF0ZSB0aGUgb2JqZWN0ICovCisKKwlzdGF0dXMgPQorCSAgICBhY3BpX2V2YWx1YXRlX29iamVjdChoYW5kbGUsIHBhdGhuYW1lLCBleHRlcm5hbF9wYXJhbXMsCisJCQkJIHJldHVybl9idWZmZXIpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKKwl9CisKKwkvKiBUeXBlIEFOWSBtZWFucyAiZG9uJ3QgY2FyZSIgKi8KKworCWlmIChyZXR1cm5fdHlwZSA9PSBBQ1BJX1RZUEVfQU5ZKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CisJfQorCisJaWYgKHJldHVybl9idWZmZXItPmxlbmd0aCA9PSAwKSB7CisKKwkJLyogRXJyb3IgYmVjYXVzZSBjYWxsZXIgc3BlY2lmaWNhbGx5IGFza2VkIGZvciBhIHJldHVybiB2YWx1ZSAqLworCisJCUFDUElfRVJST1IoKEFFX0lORk8sICJObyByZXR1cm4gdmFsdWUiKSk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OVUxMX09CSkVDVCk7CisJfQorCisJLyogRXhhbWluZSB0aGUgb2JqZWN0IHR5cGUgcmV0dXJuZWQgZnJvbSBldmFsdWF0ZV9vYmplY3QgKi8KKworCWlmICgoKHVuaW9uIGFjcGlfb2JqZWN0ICopcmV0dXJuX2J1ZmZlci0+cG9pbnRlciktPnR5cGUgPT0gcmV0dXJuX3R5cGUpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKKwl9CisKKwkvKiBSZXR1cm4gb2JqZWN0IHR5cGUgZG9lcyBub3QgbWF0Y2ggcmVxdWVzdGVkIHR5cGUgKi8KKworCUFDUElfRVJST1IoKEFFX0lORk8sCisJCSAgICAiSW5jb3JyZWN0IHJldHVybiB0eXBlIFslc10gcmVxdWVzdGVkIFslc10iLAorCQkgICAgYWNwaV91dF9nZXRfdHlwZV9uYW1lKCgodW5pb24gYWNwaV9vYmplY3QgKilyZXR1cm5fYnVmZmVyLT4KKwkJCQkJICAgcG9pbnRlciktPnR5cGUpLAorCQkgICAgYWNwaV91dF9nZXRfdHlwZV9uYW1lKHJldHVybl90eXBlKSkpOworCisJaWYgKG11c3RfZnJlZSkgeworCisJCS8qIENhbGxlciB1c2VkIEFDUElfQUxMT0NBVEVfQlVGRkVSLCBmcmVlIHRoZSByZXR1cm4gYnVmZmVyICovCisKKwkJQUNQSV9GUkVFKHJldHVybl9idWZmZXItPnBvaW50ZXIpOworCQlyZXR1cm5fYnVmZmVyLT5wb2ludGVyID0gTlVMTDsKKwl9CisKKwlyZXR1cm5fYnVmZmVyLT5sZW5ndGggPSAwOworCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9UWVBFKTsKK30KKworQUNQSV9FWFBPUlRfU1lNQk9MKGFjcGlfZXZhbHVhdGVfb2JqZWN0X3R5cGVkKQorI2VuZGlmCQkJCS8qICBBQ1BJX0ZVVFVSRV9VU0FHRSAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfZXZhbHVhdGVfb2JqZWN0CisgKgorICogUEFSQU1FVEVSUzogIEhhbmRsZSAgICAgICAgICAgICAgLSBPYmplY3QgaGFuZGxlIChvcHRpb25hbCkKKyAqICAgICAgICAgICAgICBQYXRobmFtZSAgICAgICAgICAgIC0gT2JqZWN0IHBhdGhuYW1lIChvcHRpb25hbCkKKyAqICAgICAgICAgICAgICBleHRlcm5hbF9wYXJhbXMgICAgIC0gTGlzdCBvZiBwYXJhbWV0ZXJzIHRvIHBhc3MgdG8gbWV0aG9kLAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXJtaW5hdGVkIGJ5IE5VTEwuICBNYXkgYmUgTlVMTAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBubyBwYXJhbWV0ZXJzIGFyZSBiZWluZyBwYXNzZWQuCisgKiAgICAgICAgICAgICAgcmV0dXJuX2J1ZmZlciAgICAgICAtIFdoZXJlIHRvIHB1dCBtZXRob2QncyByZXR1cm4gdmFsdWUgKGlmCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFueSkuICBJZiBOVUxMLCBubyB2YWx1ZSBpcyByZXR1cm5lZC4KKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IEZpbmQgYW5kIGV2YWx1YXRlIHRoZSBnaXZlbiBvYmplY3QsIHBhc3NpbmcgdGhlIGdpdmVuCisgKiAgICAgICAgICAgICAgcGFyYW1ldGVycyBpZiBuZWNlc3NhcnkuICBPbmUgb2YgIkhhbmRsZSIgb3IgIlBhdGhuYW1lIiBtdXN0CisgKiAgICAgICAgICAgICAgYmUgdmFsaWQgKG5vbi1udWxsKQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCithY3BpX3N0YXR1cworYWNwaV9ldmFsdWF0ZV9vYmplY3QoYWNwaV9oYW5kbGUgaGFuZGxlLAorCQkgICAgIGFjcGlfc3RyaW5nIHBhdGhuYW1lLAorCQkgICAgIHN0cnVjdCBhY3BpX29iamVjdF9saXN0ICpleHRlcm5hbF9wYXJhbXMsCisJCSAgICAgc3RydWN0IGFjcGlfYnVmZmVyICpyZXR1cm5fYnVmZmVyKQoreworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwlzdHJ1Y3QgYWNwaV9ldmFsdWF0ZV9pbmZvICppbmZvOworCWFjcGlfc2l6ZSBidWZmZXJfc3BhY2VfbmVlZGVkOworCXUzMiBpOworCisJQUNQSV9GVU5DVElPTl9UUkFDRShhY3BpX2V2YWx1YXRlX29iamVjdCk7CisKKwkvKiBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSB0aGUgZXZhbHVhdGlvbiBpbmZvcm1hdGlvbiBibG9jayAqLworCisJaW5mbyA9IEFDUElfQUxMT0NBVEVfWkVST0VEKHNpemVvZihzdHJ1Y3QgYWNwaV9ldmFsdWF0ZV9pbmZvKSk7CisJaWYgKCFpbmZvKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT19NRU1PUlkpOworCX0KKworCWluZm8tPnBhdGhuYW1lID0gcGF0aG5hbWU7CisKKwkvKiBDb252ZXJ0IGFuZCB2YWxpZGF0ZSB0aGUgZGV2aWNlIGhhbmRsZSAqLworCisJaW5mby0+cHJlZml4X25vZGUgPSBhY3BpX25zX21hcF9oYW5kbGVfdG9fbm9kZShoYW5kbGUpOworCWlmICghaW5mby0+cHJlZml4X25vZGUpIHsKKwkJc3RhdHVzID0gQUVfQkFEX1BBUkFNRVRFUjsKKwkJZ290byBjbGVhbnVwOworCX0KKworCS8qCisJICogSWYgdGhlcmUgYXJlIHBhcmFtZXRlcnMgdG8gYmUgcGFzc2VkIHRvIGEgY29udHJvbCBtZXRob2QsIHRoZSBleHRlcm5hbAorCSAqIG9iamVjdHMgbXVzdCBhbGwgYmUgY29udmVydGVkIHRvIGludGVybmFsIG9iamVjdHMKKwkgKi8KKwlpZiAoZXh0ZXJuYWxfcGFyYW1zICYmIGV4dGVybmFsX3BhcmFtcy0+Y291bnQpIHsKKwkJLyoKKwkJICogQWxsb2NhdGUgYSBuZXcgcGFyYW1ldGVyIGJsb2NrIGZvciB0aGUgaW50ZXJuYWwgb2JqZWN0cworCQkgKiBBZGQgMSB0byBjb3VudCB0byBhbGxvdyBmb3IgbnVsbCB0ZXJtaW5hdGVkIGludGVybmFsIGxpc3QKKwkJICovCisJCWluZm8tPnBhcmFtZXRlcnMgPSBBQ1BJX0FMTE9DQVRFX1pFUk9FRCgoKGFjcGlfc2l6ZSkKKwkJCQkJCQkgZXh0ZXJuYWxfcGFyYW1zLT4KKwkJCQkJCQkgY291bnQgKworCQkJCQkJCSAxKSAqIHNpemVvZih2b2lkICopKTsKKwkJaWYgKCFpbmZvLT5wYXJhbWV0ZXJzKSB7CisJCQlzdGF0dXMgPSBBRV9OT19NRU1PUlk7CisJCQlnb3RvIGNsZWFudXA7CisJCX0KKworCQkvKiBDb252ZXJ0IGVhY2ggZXh0ZXJuYWwgb2JqZWN0IGluIHRoZSBsaXN0IHRvIGFuIGludGVybmFsIG9iamVjdCAqLworCisJCWZvciAoaSA9IDA7IGkgPCBleHRlcm5hbF9wYXJhbXMtPmNvdW50OyBpKyspIHsKKwkJCXN0YXR1cyA9CisJCQkgICAgYWNwaV91dF9jb3B5X2VvYmplY3RfdG9faW9iamVjdCgmZXh0ZXJuYWxfcGFyYW1zLT4KKwkJCQkJCQkgICAgcG9pbnRlcltpXSwKKwkJCQkJCQkgICAgJmluZm8tPgorCQkJCQkJCSAgICBwYXJhbWV0ZXJzW2ldKTsKKwkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJCWdvdG8gY2xlYW51cDsKKwkJCX0KKwkJfQorCQlpbmZvLT5wYXJhbWV0ZXJzW2V4dGVybmFsX3BhcmFtcy0+Y291bnRdID0gTlVMTDsKKwl9CisKKwkvKgorCSAqIFRocmVlIG1ham9yIGNhc2VzOgorCSAqIDEpIEZ1bGx5IHF1YWxpZmllZCBwYXRobmFtZQorCSAqIDIpIE5vIGhhbmRsZSwgbm90IGZ1bGx5IHF1YWxpZmllZCBwYXRobmFtZSAoZXJyb3IpCisJICogMykgVmFsaWQgaGFuZGxlCisJICovCisJaWYgKChwYXRobmFtZSkgJiYgKGFjcGlfbnNfdmFsaWRfcm9vdF9wcmVmaXgocGF0aG5hbWVbMF0pKSkgeworCisJCS8qIFRoZSBwYXRoIGlzIGZ1bGx5IHF1YWxpZmllZCwganVzdCBldmFsdWF0ZSBieSBuYW1lICovCisKKwkJaW5mby0+cHJlZml4X25vZGUgPSBOVUxMOworCQlzdGF0dXMgPSBhY3BpX25zX2V2YWx1YXRlKGluZm8pOworCX0gZWxzZSBpZiAoIWhhbmRsZSkgeworCQkvKgorCQkgKiBBIGhhbmRsZSBpcyBvcHRpb25hbCBpZmYgYSBmdWxseSBxdWFsaWZpZWQgcGF0aG5hbWUgaXMgc3BlY2lmaWVkLgorCQkgKiBTaW5jZSB3ZSd2ZSBhbHJlYWR5IGhhbmRsZWQgZnVsbHkgcXVhbGlmaWVkIG5hbWVzIGFib3ZlLCB0aGlzIGlzCisJCSAqIGFuIGVycm9yCisJCSAqLworCQlpZiAoIXBhdGhuYW1lKSB7CisJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sCisJCQkJCSAgIkJvdGggSGFuZGxlIGFuZCBQYXRobmFtZSBhcmUgTlVMTCIpKTsKKwkJfSBlbHNlIHsKKwkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywKKwkJCQkJICAiTnVsbCBIYW5kbGUgd2l0aCByZWxhdGl2ZSBwYXRobmFtZSBbJXNdIiwKKwkJCQkJICBwYXRobmFtZSkpOworCQl9CisKKwkJc3RhdHVzID0gQUVfQkFEX1BBUkFNRVRFUjsKKwl9IGVsc2UgeworCQkvKiBXZSBoYXZlIGEgbmFtZXNwYWNlIGEgbm9kZSBhbmQgYSBwb3NzaWJsZSByZWxhdGl2ZSBwYXRoICovCisKKwkJc3RhdHVzID0gYWNwaV9uc19ldmFsdWF0ZShpbmZvKTsKKwl9CisKKwkvKgorCSAqIElmIHdlIGFyZSBleHBlY3RpbmcgYSByZXR1cm4gdmFsdWUsIGFuZCBhbGwgd2VudCB3ZWxsIGFib3ZlLAorCSAqIGNvcHkgdGhlIHJldHVybiB2YWx1ZSB0byBhbiBleHRlcm5hbCBvYmplY3QuCisJICovCisJaWYgKHJldHVybl9idWZmZXIpIHsKKwkJaWYgKCFpbmZvLT5yZXR1cm5fb2JqZWN0KSB7CisJCQlyZXR1cm5fYnVmZmVyLT5sZW5ndGggPSAwOworCQl9IGVsc2UgeworCQkJaWYgKEFDUElfR0VUX0RFU0NSSVBUT1JfVFlQRShpbmZvLT5yZXR1cm5fb2JqZWN0KSA9PQorCQkJICAgIEFDUElfREVTQ19UWVBFX05BTUVEKSB7CisJCQkJLyoKKwkJCQkgKiBJZiB3ZSByZWNlaXZlZCBhIE5TIE5vZGUgYXMgYSByZXR1cm4gb2JqZWN0LCB0aGlzIG1lYW5zIHRoYXQKKwkJCQkgKiB0aGUgb2JqZWN0IHdlIGFyZSBldmFsdWF0aW5nIGhhcyBub3RoaW5nIGludGVyZXN0aW5nIHRvCisJCQkJICogcmV0dXJuIChzdWNoIGFzIGEgbXV0ZXgsIGV0Yy4pICBXZSByZXR1cm4gYW4gZXJyb3IgYmVjYXVzZQorCQkJCSAqIHRoZXNlIHR5cGVzIGFyZSBlc3NlbnRpYWxseSB1bnN1cHBvcnRlZCBieSB0aGlzIGludGVyZmFjZS4KKwkJCQkgKiBXZSBkb24ndCBjaGVjayB1cCBmcm9udCBiZWNhdXNlIHRoaXMgbWFrZXMgaXQgZWFzaWVyIHRvIGFkZAorCQkJCSAqIHN1cHBvcnQgZm9yIHZhcmlvdXMgdHlwZXMgYXQgYSBsYXRlciBkYXRlIGlmIG5lY2Vzc2FyeS4KKwkJCQkgKi8KKwkJCQlzdGF0dXMgPSBBRV9UWVBFOworCQkJCWluZm8tPnJldHVybl9vYmplY3QgPSBOVUxMOwkvKiBObyBuZWVkIHRvIGRlbGV0ZSBhIE5TIE5vZGUgKi8KKwkJCQlyZXR1cm5fYnVmZmVyLT5sZW5ndGggPSAwOworCQkJfQorCisJCQlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpIHsKKworCQkJCS8qIERlcmVmZXJlbmNlIEluZGV4IGFuZCByZWZfb2YgcmVmZXJlbmNlcyAqLworCisJCQkJYWNwaV9uc19yZXNvbHZlX3JlZmVyZW5jZXMoaW5mbyk7CisKKwkJCQkvKiBHZXQgdGhlIHNpemUgb2YgdGhlIHJldHVybmVkIG9iamVjdCAqLworCisJCQkJc3RhdHVzID0KKwkJCQkgICAgYWNwaV91dF9nZXRfb2JqZWN0X3NpemUoaW5mby0+cmV0dXJuX29iamVjdCwKKwkJCQkJCQkgICAgJmJ1ZmZlcl9zcGFjZV9uZWVkZWQpOworCQkJCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkgeworCisJCQkJCS8qIFZhbGlkYXRlL0FsbG9jYXRlL0NsZWFyIGNhbGxlciBidWZmZXIgKi8KKworCQkJCQlzdGF0dXMgPQorCQkJCQkgICAgYWNwaV91dF9pbml0aWFsaXplX2J1ZmZlcgorCQkJCQkgICAgKHJldHVybl9idWZmZXIsCisJCQkJCSAgICAgYnVmZmVyX3NwYWNlX25lZWRlZCk7CisJCQkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJCQkJLyoKKwkJCQkJCSAqIENhbGxlcidzIGJ1ZmZlciBpcyB0b28gc21hbGwgb3IgYSBuZXcgb25lIGNhbid0CisJCQkJCQkgKiBiZSBhbGxvY2F0ZWQKKwkJCQkJCSAqLworCQkJCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLAorCQkJCQkJCQkgICJOZWVkZWQgYnVmZmVyIHNpemUgJVgsICVzXG4iLAorCQkJCQkJCQkgICh1MzIpCisJCQkJCQkJCSAgYnVmZmVyX3NwYWNlX25lZWRlZCwKKwkJCQkJCQkJICBhY3BpX2Zvcm1hdF9leGNlcHRpb24KKwkJCQkJCQkJICAoc3RhdHVzKSkpOworCQkJCQl9IGVsc2UgeworCQkJCQkJLyogV2UgaGF2ZSBlbm91Z2ggc3BhY2UgZm9yIHRoZSBvYmplY3QsIGJ1aWxkIGl0ICovCisKKwkJCQkJCXN0YXR1cyA9CisJCQkJCQkgICAgYWNwaV91dF9jb3B5X2lvYmplY3RfdG9fZW9iamVjdAorCQkJCQkJICAgIChpbmZvLT5yZXR1cm5fb2JqZWN0LAorCQkJCQkJICAgICByZXR1cm5fYnVmZmVyKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCWlmIChpbmZvLT5yZXR1cm5fb2JqZWN0KSB7CisJCS8qCisJCSAqIERlbGV0ZSB0aGUgaW50ZXJuYWwgcmV0dXJuIG9iamVjdC4gTk9URTogSW50ZXJwcmV0ZXIgbXVzdCBiZQorCQkgKiBsb2NrZWQgdG8gYXZvaWQgcmFjZSBjb25kaXRpb24uCisJCSAqLworCQlhY3BpX2V4X2VudGVyX2ludGVycHJldGVyKCk7CisKKwkJLyogUmVtb3ZlIG9uZSByZWZlcmVuY2Ugb24gdGhlIHJldHVybiBvYmplY3QgKHNob3VsZCBkZWxldGUgaXQpICovCisKKwkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKGluZm8tPnJldHVybl9vYmplY3QpOworCQlhY3BpX2V4X2V4aXRfaW50ZXJwcmV0ZXIoKTsKKwl9CisKKyAgICAgIGNsZWFudXA6CisKKwkvKiBGcmVlIHRoZSBpbnB1dCBwYXJhbWV0ZXIgbGlzdCAoaWYgd2UgY3JlYXRlZCBvbmUpICovCisKKwlpZiAoaW5mby0+cGFyYW1ldGVycykgeworCisJCS8qIEZyZWUgdGhlIGFsbG9jYXRlZCBwYXJhbWV0ZXIgYmxvY2sgKi8KKworCQlhY3BpX3V0X2RlbGV0ZV9pbnRlcm5hbF9vYmplY3RfbGlzdChpbmZvLT5wYXJhbWV0ZXJzKTsKKwl9CisKKwlBQ1BJX0ZSRUUoaW5mbyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Cit9CisKK0FDUElfRVhQT1JUX1NZTUJPTChhY3BpX2V2YWx1YXRlX29iamVjdCkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9uc19yZXNvbHZlX3JlZmVyZW5jZXMKKyAqCisgKiBQQVJBTUVURVJTOiAgSW5mbyAgICAgICAgICAgICAgICAgICAgLSBFdmFsdWF0aW9uIGluZm8gYmxvY2sKKyAqCisgKiBSRVRVUk46ICAgICAgSW5mby0+cmV0dXJuX29iamVjdCBpcyByZXBsYWNlZCB3aXRoIHRoZSBkZXJlZmVyZW5jZWQgb2JqZWN0CisgKgorICogREVTQ1JJUFRJT046IERlcmVmZXJlbmNlIGNlcnRhaW4gcmVmZXJlbmNlIG9iamVjdHMuIENhbGxlZCBiZWZvcmUgYW4KKyAqICAgICAgICAgICAgICBpbnRlcm5hbCByZXR1cm4gb2JqZWN0IGlzIGNvbnZlcnRlZCB0byBhbiBleHRlcm5hbCB1bmlvbiBhY3BpX29iamVjdC4KKyAqCisgKiBQZXJmb3JtcyBhbiBhdXRvbWF0aWMgZGVyZWZlcmVuY2Ugb2YgSW5kZXggYW5kIHJlZl9vZiByZWZlcmVuY2Ugb2JqZWN0cy4KKyAqIFRoZXNlIHJlZmVyZW5jZSBvYmplY3RzIGFyZSBub3Qgc3VwcG9ydGVkIGJ5IHRoZSB1bmlvbiBhY3BpX29iamVjdCwgc28gdGhpcyBpcyBhCisgKiBsYXN0IHJlc29ydCBlZmZvcnQgdG8gcmV0dXJuIHNvbWV0aGluZyB1c2VmdWwuIEFsc28sIHByb3ZpZGVzIGNvbXBhdGliaWxpdHkKKyAqIHdpdGggb3RoZXIgQUNQSSBpbXBsZW1lbnRhdGlvbnMuCisgKgorICogTk9URTogZG9lcyBub3QgaGFuZGxlIHJlZmVyZW5jZXMgd2l0aGluIHJldHVybmVkIHBhY2thZ2Ugb2JqZWN0cyBvciBuZXN0ZWQKKyAqIHJlZmVyZW5jZXMsIGJ1dCB0aGlzIHN1cHBvcnQgY291bGQgYmUgYWRkZWQgbGF0ZXIgaWYgZm91bmQgdG8gYmUgbmVjZXNzYXJ5LgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBhY3BpX25zX3Jlc29sdmVfcmVmZXJlbmNlcyhzdHJ1Y3QgYWNwaV9ldmFsdWF0ZV9pbmZvICppbmZvKQoreworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjID0gTlVMTDsKKwlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZTsKKworCS8qIFdlIGFyZSBpbnRlcmVzdGVkIGluIHJlZmVyZW5jZSBvYmplY3RzIG9ubHkgKi8KKworCWlmIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRShpbmZvLT5yZXR1cm5fb2JqZWN0KSAhPQorCSAgICBBQ1BJX1RZUEVfTE9DQUxfUkVGRVJFTkNFKSB7CisJCXJldHVybjsKKwl9CisKKwkvKgorCSAqIFR3byB0eXBlcyBvZiByZWZlcmVuY2VzIGFyZSBzdXBwb3J0ZWQgLSB0aG9zZSBjcmVhdGVkIGJ5IEluZGV4IGFuZAorCSAqIHJlZl9vZiBvcGVyYXRvcnMuIEEgbmFtZSByZWZlcmVuY2UgKEFNTF9OQU1FUEFUSF9PUCkgY2FuIGJlIGNvbnZlcnRlZAorCSAqIHRvIGFuIHVuaW9uIGFjcGlfb2JqZWN0LCBzbyBpdCBpcyBub3QgZGVyZWZlcmVuY2VkIGhlcmUuIEEgZGRiX2hhbmRsZQorCSAqIChBTUxfTE9BRF9PUCkgY2Fubm90IGJlIGRlcmVmZXJlbmNlZCwgbm9yIGNhbiBpdCBiZSBjb252ZXJ0ZWQgdG8KKwkgKiBhbiB1bmlvbiBhY3BpX29iamVjdC4KKwkgKi8KKwlzd2l0Y2ggKGluZm8tPnJldHVybl9vYmplY3QtPnJlZmVyZW5jZS5jbGFzcykgeworCWNhc2UgQUNQSV9SRUZDTEFTU19JTkRFWDoKKworCQlvYmpfZGVzYyA9ICooaW5mby0+cmV0dXJuX29iamVjdC0+cmVmZXJlbmNlLndoZXJlKTsKKwkJYnJlYWs7CisKKwljYXNlIEFDUElfUkVGQ0xBU1NfUkVGT0Y6CisKKwkJbm9kZSA9IGluZm8tPnJldHVybl9vYmplY3QtPnJlZmVyZW5jZS5vYmplY3Q7CisJCWlmIChub2RlKSB7CisJCQlvYmpfZGVzYyA9IG5vZGUtPm9iamVjdDsKKwkJfQorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJldHVybjsKKwl9CisKKwkvKiBSZXBsYWNlIHRoZSBleGlzdGluZyByZWZlcmVuY2Ugb2JqZWN0ICovCisKKwlpZiAob2JqX2Rlc2MpIHsKKwkJYWNwaV91dF9hZGRfcmVmZXJlbmNlKG9ial9kZXNjKTsKKwkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKGluZm8tPnJldHVybl9vYmplY3QpOworCQlpbmZvLT5yZXR1cm5fb2JqZWN0ID0gb2JqX2Rlc2M7CisJfQorCisJcmV0dXJuOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX3dhbGtfbmFtZXNwYWNlCisgKgorICogUEFSQU1FVEVSUzogIFR5cGUgICAgICAgICAgICAgICAgLSBhY3BpX29iamVjdF90eXBlIHRvIHNlYXJjaCBmb3IKKyAqICAgICAgICAgICAgICBzdGFydF9vYmplY3QgICAgICAgIC0gSGFuZGxlIGluIG5hbWVzcGFjZSB3aGVyZSBzZWFyY2ggYmVnaW5zCisgKiAgICAgICAgICAgICAgbWF4X2RlcHRoICAgICAgICAgICAtIERlcHRoIHRvIHdoaWNoIHNlYXJjaCBpcyB0byByZWFjaAorICogICAgICAgICAgICAgIHVzZXJfZnVuY3Rpb24gICAgICAgLSBDYWxsZWQgd2hlbiBhbiBvYmplY3Qgb2YgIlR5cGUiIGlzIGZvdW5kCisgKiAgICAgICAgICAgICAgQ29udGV4dCAgICAgICAgICAgICAtIFBhc3NlZCB0byB1c2VyIGZ1bmN0aW9uCisgKiAgICAgICAgICAgICAgcmV0dXJuX3ZhbHVlICAgICAgICAtIExvY2F0aW9uIHdoZXJlIHJldHVybiB2YWx1ZSBvZgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyX2Z1bmN0aW9uIGlzIHB1dCBpZiB0ZXJtaW5hdGVkIGVhcmx5CisgKgorICogUkVUVVJOUyAgICAgIFJldHVybiB2YWx1ZSBmcm9tIHRoZSB1c2VyX2Z1bmN0aW9uIGlmIHRlcm1pbmF0ZWQgZWFybHkuCisgKiAgICAgICAgICAgICAgT3RoZXJ3aXNlLCByZXR1cm5zIE5VTEwuCisgKgorICogREVTQ1JJUFRJT046IFBlcmZvcm1zIGEgbW9kaWZpZWQgZGVwdGgtZmlyc3Qgd2FsayBvZiB0aGUgbmFtZXNwYWNlIHRyZWUsCisgKiAgICAgICAgICAgICAgc3RhcnRpbmcgKGFuZCBlbmRpbmcpIGF0IHRoZSBvYmplY3Qgc3BlY2lmaWVkIGJ5IHN0YXJ0X2hhbmRsZS4KKyAqICAgICAgICAgICAgICBUaGUgdXNlcl9mdW5jdGlvbiBpcyBjYWxsZWQgd2hlbmV2ZXIgYW4gb2JqZWN0IHRoYXQgbWF0Y2hlcworICogICAgICAgICAgICAgIHRoZSB0eXBlIHBhcmFtZXRlciBpcyBmb3VuZC4gIElmIHRoZSB1c2VyIGZ1bmN0aW9uIHJldHVybnMKKyAqICAgICAgICAgICAgICBhIG5vbi16ZXJvIHZhbHVlLCB0aGUgc2VhcmNoIGlzIHRlcm1pbmF0ZWQgaW1tZWRpYXRlbHkgYW5kIHRoaXMKKyAqICAgICAgICAgICAgICB2YWx1ZSBpcyByZXR1cm5lZCB0byB0aGUgY2FsbGVyLgorICoKKyAqICAgICAgICAgICAgICBUaGUgcG9pbnQgb2YgdGhpcyBwcm9jZWR1cmUgaXMgdG8gcHJvdmlkZSBhIGdlbmVyaWMgbmFtZXNwYWNlCisgKiAgICAgICAgICAgICAgd2FsayByb3V0aW5lIHRoYXQgY2FuIGJlIGNhbGxlZCBmcm9tIG11bHRpcGxlIHBsYWNlcyB0bworICogICAgICAgICAgICAgIHByb3ZpZGUgbXVsdGlwbGUgc2VydmljZXM7ICB0aGUgVXNlciBGdW5jdGlvbiBjYW4gYmUgdGFpbG9yZWQKKyAqICAgICAgICAgICAgICB0byBlYWNoIHRhc2ssIHdoZXRoZXIgaXQgaXMgYSBwcmludCBmdW5jdGlvbiwgYSBjb21wYXJlCisgKiAgICAgICAgICAgICAgZnVuY3Rpb24sIGV0Yy4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCithY3BpX3N0YXR1cworYWNwaV93YWxrX25hbWVzcGFjZShhY3BpX29iamVjdF90eXBlIHR5cGUsCisJCSAgICBhY3BpX2hhbmRsZSBzdGFydF9vYmplY3QsCisJCSAgICB1MzIgbWF4X2RlcHRoLAorCQkgICAgYWNwaV93YWxrX2NhbGxiYWNrIHVzZXJfZnVuY3Rpb24sCisJCSAgICB2b2lkICpjb250ZXh0LCB2b2lkICoqcmV0dXJuX3ZhbHVlKQoreworCWFjcGlfc3RhdHVzIHN0YXR1czsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0UoYWNwaV93YWxrX25hbWVzcGFjZSk7CisKKwkvKiBQYXJhbWV0ZXIgdmFsaWRhdGlvbiAqLworCisJaWYgKCh0eXBlID4gQUNQSV9UWVBFX0xPQ0FMX01BWCkgfHwgKCFtYXhfZGVwdGgpIHx8ICghdXNlcl9mdW5jdGlvbikpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9QQVJBTUVURVIpOworCX0KKworCS8qCisJICogTG9jayB0aGUgbmFtZXNwYWNlIGFyb3VuZCB0aGUgd2Fsay4KKwkgKiBUaGUgbmFtZXNwYWNlIHdpbGwgYmUgdW5sb2NrZWQvbG9ja2VkIGFyb3VuZCBlYWNoIGNhbGwKKwkgKiB0byB0aGUgdXNlciBmdW5jdGlvbiAtIHNpbmNlIHRoaXMgZnVuY3Rpb24KKwkgKiBtdXN0IGJlIGFsbG93ZWQgdG8gbWFrZSBBY3BpIGNhbGxzIGl0c2VsZi4KKwkgKi8KKwlzdGF0dXMgPSBhY3BpX3V0X2FjcXVpcmVfbXV0ZXgoQUNQSV9NVFhfTkFNRVNQQUNFKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CisJfQorCisJc3RhdHVzID0gYWNwaV9uc193YWxrX25hbWVzcGFjZSh0eXBlLCBzdGFydF9vYmplY3QsIG1heF9kZXB0aCwKKwkJCQkJQUNQSV9OU19XQUxLX1VOTE9DSywKKwkJCQkJdXNlcl9mdW5jdGlvbiwgY29udGV4dCwgcmV0dXJuX3ZhbHVlKTsKKworCSh2b2lkKWFjcGlfdXRfcmVsZWFzZV9tdXRleChBQ1BJX01UWF9OQU1FU1BBQ0UpOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworfQorCitBQ1BJX0VYUE9SVF9TWU1CT0woYWNwaV93YWxrX25hbWVzcGFjZSkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9uc19nZXRfZGV2aWNlX2NhbGxiYWNrCisgKgorICogUEFSQU1FVEVSUzogIENhbGxiYWNrIGZyb20gYWNwaV9nZXRfZGV2aWNlCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBUYWtlcyBjYWxsYmFja3MgZnJvbSB3YWxrX25hbWVzcGFjZSBhbmQgZmlsdGVycyBvdXQgYWxsIG5vbi0KKyAqICAgICAgICAgICAgICBwcmVzZW50IGRldmljZXMsIG9yIGlmIHRoZXkgc3BlY2lmaWVkIGEgSElELCBpdCBmaWx0ZXJzIGJhc2VkCisgKiAgICAgICAgICAgICAgb24gdGhhdC4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGFjcGlfc3RhdHVzCithY3BpX25zX2dldF9kZXZpY2VfY2FsbGJhY2soYWNwaV9oYW5kbGUgb2JqX2hhbmRsZSwKKwkJCSAgICB1MzIgbmVzdGluZ19sZXZlbCwKKwkJCSAgICB2b2lkICpjb250ZXh0LCB2b2lkICoqcmV0dXJuX3ZhbHVlKQoreworCXN0cnVjdCBhY3BpX2dldF9kZXZpY2VzX2luZm8gKmluZm8gPSBjb250ZXh0OworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZTsKKwl1MzIgZmxhZ3M7CisJc3RydWN0IGFjcGljYV9kZXZpY2VfaWQgaGlkOworCXN0cnVjdCBhY3BpX2NvbXBhdGlibGVfaWRfbGlzdCAqY2lkOworCXUzMiBpOworCWludCBmb3VuZDsKKworCXN0YXR1cyA9IGFjcGlfdXRfYWNxdWlyZV9tdXRleChBQ1BJX01UWF9OQU1FU1BBQ0UpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm4gKHN0YXR1cyk7CisJfQorCisJbm9kZSA9IGFjcGlfbnNfbWFwX2hhbmRsZV90b19ub2RlKG9ial9oYW5kbGUpOworCXN0YXR1cyA9IGFjcGlfdXRfcmVsZWFzZV9tdXRleChBQ1BJX01UWF9OQU1FU1BBQ0UpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm4gKHN0YXR1cyk7CisJfQorCisJaWYgKCFub2RlKSB7CisJCXJldHVybiAoQUVfQkFEX1BBUkFNRVRFUik7CisJfQorCisJLyogUnVuIF9TVEEgdG8gZGV0ZXJtaW5lIGlmIGRldmljZSBpcyBwcmVzZW50ICovCisKKwlzdGF0dXMgPSBhY3BpX3V0X2V4ZWN1dGVfU1RBKG5vZGUsICZmbGFncyk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXJldHVybiAoQUVfQ1RSTF9ERVBUSCk7CisJfQorCisJaWYgKCEoZmxhZ3MgJiBBQ1BJX1NUQV9ERVZJQ0VfUFJFU0VOVCkgJiYKKwkgICAgIShmbGFncyAmIEFDUElfU1RBX0RFVklDRV9GVU5DVElPTklORykpIHsKKwkJLyoKKwkJICogRG9uJ3QgZXhhbWluZSB0aGUgY2hpbGRyZW4gb2YgdGhlIGRldmljZSBvbmx5IHdoZW4gdGhlCisJCSAqIGRldmljZSBpcyBuZWl0aGVyIHByZXNlbnQgbm9yIGZ1bmN0aW9uYWwuIFNlZSBBQ1BJIHNwZWMsCisJCSAqIGRlc2NyaXB0aW9uIG9mIF9TVEEgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisJCSAqLworCQlyZXR1cm4gKEFFX0NUUkxfREVQVEgpOworCX0KKworCS8qIEZpbHRlciBiYXNlZCBvbiBkZXZpY2UgSElEICYgQ0lEICovCisKKwlpZiAoaW5mby0+aGlkICE9IE5VTEwpIHsKKwkJc3RhdHVzID0gYWNwaV91dF9leGVjdXRlX0hJRChub2RlLCAmaGlkKTsKKwkJaWYgKHN0YXR1cyA9PSBBRV9OT1RfRk9VTkQpIHsKKwkJCXJldHVybiAoQUVfT0spOworCQl9IGVsc2UgaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQlyZXR1cm4gKEFFX0NUUkxfREVQVEgpOworCQl9CisKKwkJaWYgKEFDUElfU1RSTkNNUChoaWQudmFsdWUsIGluZm8tPmhpZCwgc2l6ZW9mKGhpZC52YWx1ZSkpICE9IDApIHsKKworCQkJLyogR2V0IHRoZSBsaXN0IG9mIENvbXBhdGlibGUgSURzICovCisKKwkJCXN0YXR1cyA9IGFjcGlfdXRfZXhlY3V0ZV9DSUQobm9kZSwgJmNpZCk7CisJCQlpZiAoc3RhdHVzID09IEFFX05PVF9GT1VORCkgeworCQkJCXJldHVybiAoQUVfT0spOworCQkJfSBlbHNlIGlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJCXJldHVybiAoQUVfQ1RSTF9ERVBUSCk7CisJCQl9CisKKwkJCS8qIFdhbGsgdGhlIENJRCBsaXN0ICovCisKKwkJCWZvdW5kID0gMDsKKwkJCWZvciAoaSA9IDA7IGkgPCBjaWQtPmNvdW50OyBpKyspIHsKKwkJCQlpZiAoQUNQSV9TVFJOQ01QKGNpZC0+aWRbaV0udmFsdWUsIGluZm8tPmhpZCwKKwkJCQkJCSBzaXplb2Yoc3RydWN0CisJCQkJCQkJYWNwaV9jb21wYXRpYmxlX2lkKSkgPT0KKwkJCQkgICAgMCkgeworCQkJCQlmb3VuZCA9IDE7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCUFDUElfRlJFRShjaWQpOworCQkJaWYgKCFmb3VuZCkKKwkJCQlyZXR1cm4gKEFFX09LKTsKKwkJfQorCX0KKworCXN0YXR1cyA9IGluZm8tPnVzZXJfZnVuY3Rpb24ob2JqX2hhbmRsZSwgbmVzdGluZ19sZXZlbCwgaW5mby0+Y29udGV4dCwKKwkJCQkgICAgIHJldHVybl92YWx1ZSk7CisJcmV0dXJuIChzdGF0dXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX2dldF9kZXZpY2VzCisgKgorICogUEFSQU1FVEVSUzogIEhJRCAgICAgICAgICAgICAgICAgLSBISUQgdG8gc2VhcmNoIGZvci4gQ2FuIGJlIE5VTEwuCisgKiAgICAgICAgICAgICAgdXNlcl9mdW5jdGlvbiAgICAgICAtIENhbGxlZCB3aGVuIGEgbWF0Y2hpbmcgb2JqZWN0IGlzIGZvdW5kCisgKiAgICAgICAgICAgICAgQ29udGV4dCAgICAgICAgICAgICAtIFBhc3NlZCB0byB1c2VyIGZ1bmN0aW9uCisgKiAgICAgICAgICAgICAgcmV0dXJuX3ZhbHVlICAgICAgICAtIExvY2F0aW9uIHdoZXJlIHJldHVybiB2YWx1ZSBvZgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyX2Z1bmN0aW9uIGlzIHB1dCBpZiB0ZXJtaW5hdGVkIGVhcmx5CisgKgorICogUkVUVVJOUyAgICAgIFJldHVybiB2YWx1ZSBmcm9tIHRoZSB1c2VyX2Z1bmN0aW9uIGlmIHRlcm1pbmF0ZWQgZWFybHkuCisgKiAgICAgICAgICAgICAgT3RoZXJ3aXNlLCByZXR1cm5zIE5VTEwuCisgKgorICogREVTQ1JJUFRJT046IFBlcmZvcm1zIGEgbW9kaWZpZWQgZGVwdGgtZmlyc3Qgd2FsayBvZiB0aGUgbmFtZXNwYWNlIHRyZWUsCisgKiAgICAgICAgICAgICAgc3RhcnRpbmcgKGFuZCBlbmRpbmcpIGF0IHRoZSBvYmplY3Qgc3BlY2lmaWVkIGJ5IHN0YXJ0X2hhbmRsZS4KKyAqICAgICAgICAgICAgICBUaGUgdXNlcl9mdW5jdGlvbiBpcyBjYWxsZWQgd2hlbmV2ZXIgYW4gb2JqZWN0IG9mIHR5cGUKKyAqICAgICAgICAgICAgICBEZXZpY2UgaXMgZm91bmQuICBJZiB0aGUgdXNlciBmdW5jdGlvbiByZXR1cm5zCisgKiAgICAgICAgICAgICAgYSBub24temVybyB2YWx1ZSwgdGhlIHNlYXJjaCBpcyB0ZXJtaW5hdGVkIGltbWVkaWF0ZWx5IGFuZCB0aGlzCisgKiAgICAgICAgICAgICAgdmFsdWUgaXMgcmV0dXJuZWQgdG8gdGhlIGNhbGxlci4KKyAqCisgKiAgICAgICAgICAgICAgVGhpcyBpcyBhIHdyYXBwZXIgZm9yIHdhbGtfbmFtZXNwYWNlLCBidXQgdGhlIGNhbGxiYWNrIHBlcmZvcm1zCisgKiAgICAgICAgICAgICAgYWRkaXRpb25hbCBmaWx0ZXJpbmcuIFBsZWFzZSBzZWUgYWNwaV9uc19nZXRfZGV2aWNlX2NhbGxiYWNrLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2FjcGlfc3RhdHVzCithY3BpX2dldF9kZXZpY2VzKGNvbnN0IGNoYXIgKkhJRCwKKwkJIGFjcGlfd2Fsa19jYWxsYmFjayB1c2VyX2Z1bmN0aW9uLAorCQkgdm9pZCAqY29udGV4dCwgdm9pZCAqKnJldHVybl92YWx1ZSkKK3sKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJc3RydWN0IGFjcGlfZ2V0X2RldmljZXNfaW5mbyBpbmZvOworCisJQUNQSV9GVU5DVElPTl9UUkFDRShhY3BpX2dldF9kZXZpY2VzKTsKKworCS8qIFBhcmFtZXRlciB2YWxpZGF0aW9uICovCisKKwlpZiAoIXVzZXJfZnVuY3Rpb24pIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9QQVJBTUVURVIpOworCX0KKworCS8qCisJICogV2UncmUgZ29pbmcgdG8gY2FsbCB0aGVpciBjYWxsYmFjayBmcm9tIE9VUiBjYWxsYmFjaywgc28gd2UgbmVlZAorCSAqIHRvIGtub3cgd2hhdCBpdCBpcywgYW5kIHRoZWlyIGNvbnRleHQgcGFyYW1ldGVyLgorCSAqLworCWluZm8uaGlkID0gSElEOworCWluZm8uY29udGV4dCA9IGNvbnRleHQ7CisJaW5mby51c2VyX2Z1bmN0aW9uID0gdXNlcl9mdW5jdGlvbjsKKworCS8qCisJICogTG9jayB0aGUgbmFtZXNwYWNlIGFyb3VuZCB0aGUgd2Fsay4KKwkgKiBUaGUgbmFtZXNwYWNlIHdpbGwgYmUgdW5sb2NrZWQvbG9ja2VkIGFyb3VuZCBlYWNoIGNhbGwKKwkgKiB0byB0aGUgdXNlciBmdW5jdGlvbiAtIHNpbmNlIHRoaXMgZnVuY3Rpb24KKwkgKiBtdXN0IGJlIGFsbG93ZWQgdG8gbWFrZSBBY3BpIGNhbGxzIGl0c2VsZi4KKwkgKi8KKwlzdGF0dXMgPSBhY3BpX3V0X2FjcXVpcmVfbXV0ZXgoQUNQSV9NVFhfTkFNRVNQQUNFKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CisJfQorCisJc3RhdHVzID0gYWNwaV9uc193YWxrX25hbWVzcGFjZShBQ1BJX1RZUEVfREVWSUNFLCBBQ1BJX1JPT1RfT0JKRUNULAorCQkJCQlBQ1BJX1VJTlQzMl9NQVgsIEFDUElfTlNfV0FMS19VTkxPQ0ssCisJCQkJCWFjcGlfbnNfZ2V0X2RldmljZV9jYWxsYmFjaywgJmluZm8sCisJCQkJCXJldHVybl92YWx1ZSk7CisKKwkodm9pZClhY3BpX3V0X3JlbGVhc2VfbXV0ZXgoQUNQSV9NVFhfTkFNRVNQQUNFKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKK30KKworQUNQSV9FWFBPUlRfU1lNQk9MKGFjcGlfZ2V0X2RldmljZXMpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfYXR0YWNoX2RhdGEKKyAqCisgKiBQQVJBTUVURVJTOiAgb2JqX2hhbmRsZSAgICAgICAgICAtIE5hbWVzcGFjZSBub2RlCisgKiAgICAgICAgICAgICAgSGFuZGxlciAgICAgICAgICAgICAtIEhhbmRsZXIgZm9yIHRoaXMgYXR0YWNobWVudAorICogICAgICAgICAgICAgIERhdGEgICAgICAgICAgICAgICAgLSBQb2ludGVyIHRvIGRhdGEgdG8gYmUgYXR0YWNoZWQKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IEF0dGFjaCBhcmJpdHJhcnkgZGF0YSBhbmQgaGFuZGxlciB0byBhIG5hbWVzcGFjZSBub2RlLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCithY3BpX3N0YXR1cworYWNwaV9hdHRhY2hfZGF0YShhY3BpX2hhbmRsZSBvYmpfaGFuZGxlLAorCQkgYWNwaV9vYmplY3RfaGFuZGxlciBoYW5kbGVyLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKworCS8qIFBhcmFtZXRlciB2YWxpZGF0aW9uICovCisKKwlpZiAoIW9ial9oYW5kbGUgfHwgIWhhbmRsZXIgfHwgIWRhdGEpIHsKKwkJcmV0dXJuIChBRV9CQURfUEFSQU1FVEVSKTsKKwl9CisKKwlzdGF0dXMgPSBhY3BpX3V0X2FjcXVpcmVfbXV0ZXgoQUNQSV9NVFhfTkFNRVNQQUNFKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuIChzdGF0dXMpOworCX0KKworCS8qIENvbnZlcnQgYW5kIHZhbGlkYXRlIHRoZSBoYW5kbGUgKi8KKworCW5vZGUgPSBhY3BpX25zX21hcF9oYW5kbGVfdG9fbm9kZShvYmpfaGFuZGxlKTsKKwlpZiAoIW5vZGUpIHsKKwkJc3RhdHVzID0gQUVfQkFEX1BBUkFNRVRFUjsKKwkJZ290byB1bmxvY2tfYW5kX2V4aXQ7CisJfQorCisJc3RhdHVzID0gYWNwaV9uc19hdHRhY2hfZGF0YShub2RlLCBoYW5kbGVyLCBkYXRhKTsKKworICAgICAgdW5sb2NrX2FuZF9leGl0OgorCSh2b2lkKWFjcGlfdXRfcmVsZWFzZV9tdXRleChBQ1BJX01UWF9OQU1FU1BBQ0UpOworCXJldHVybiAoc3RhdHVzKTsKK30KKworQUNQSV9FWFBPUlRfU1lNQk9MKGFjcGlfYXR0YWNoX2RhdGEpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfZGV0YWNoX2RhdGEKKyAqCisgKiBQQVJBTUVURVJTOiAgb2JqX2hhbmRsZSAgICAgICAgICAtIE5hbWVzcGFjZSBub2RlIGhhbmRsZQorICogICAgICAgICAgICAgIEhhbmRsZXIgICAgICAgICAgICAgLSBIYW5kbGVyIHVzZWQgaW4gY2FsbCB0byBhY3BpX2F0dGFjaF9kYXRhCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBSZW1vdmUgZGF0YSB0aGF0IHdhcyBwcmV2aW91c2x5IGF0dGFjaGVkIHRvIGEgbm9kZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYWNwaV9zdGF0dXMKK2FjcGlfZGV0YWNoX2RhdGEoYWNwaV9oYW5kbGUgb2JqX2hhbmRsZSwgYWNwaV9vYmplY3RfaGFuZGxlciBoYW5kbGVyKQoreworCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKworCS8qIFBhcmFtZXRlciB2YWxpZGF0aW9uICovCisKKwlpZiAoIW9ial9oYW5kbGUgfHwgIWhhbmRsZXIpIHsKKwkJcmV0dXJuIChBRV9CQURfUEFSQU1FVEVSKTsKKwl9CisKKwlzdGF0dXMgPSBhY3BpX3V0X2FjcXVpcmVfbXV0ZXgoQUNQSV9NVFhfTkFNRVNQQUNFKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuIChzdGF0dXMpOworCX0KKworCS8qIENvbnZlcnQgYW5kIHZhbGlkYXRlIHRoZSBoYW5kbGUgKi8KKworCW5vZGUgPSBhY3BpX25zX21hcF9oYW5kbGVfdG9fbm9kZShvYmpfaGFuZGxlKTsKKwlpZiAoIW5vZGUpIHsKKwkJc3RhdHVzID0gQUVfQkFEX1BBUkFNRVRFUjsKKwkJZ290byB1bmxvY2tfYW5kX2V4aXQ7CisJfQorCisJc3RhdHVzID0gYWNwaV9uc19kZXRhY2hfZGF0YShub2RlLCBoYW5kbGVyKTsKKworICAgICAgdW5sb2NrX2FuZF9leGl0OgorCSh2b2lkKWFjcGlfdXRfcmVsZWFzZV9tdXRleChBQ1BJX01UWF9OQU1FU1BBQ0UpOworCXJldHVybiAoc3RhdHVzKTsKK30KKworQUNQSV9FWFBPUlRfU1lNQk9MKGFjcGlfZGV0YWNoX2RhdGEpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfZ2V0X2RhdGEKKyAqCisgKiBQQVJBTUVURVJTOiAgb2JqX2hhbmRsZSAgICAgICAgICAtIE5hbWVzcGFjZSBub2RlCisgKiAgICAgICAgICAgICAgSGFuZGxlciAgICAgICAgICAgICAtIEhhbmRsZXIgdXNlZCBpbiBjYWxsIHRvIGF0dGFjaF9kYXRhCisgKiAgICAgICAgICAgICAgRGF0YSAgICAgICAgICAgICAgICAtIFdoZXJlIHRoZSBkYXRhIGlzIHJldHVybmVkCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBSZXRyaWV2ZSBkYXRhIHRoYXQgd2FzIHByZXZpb3VzbHkgYXR0YWNoZWQgdG8gYSBuYW1lc3BhY2Ugbm9kZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYWNwaV9zdGF0dXMKK2FjcGlfZ2V0X2RhdGEoYWNwaV9oYW5kbGUgb2JqX2hhbmRsZSwgYWNwaV9vYmplY3RfaGFuZGxlciBoYW5kbGVyLCB2b2lkICoqZGF0YSkKK3sKKwlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZTsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisKKwkvKiBQYXJhbWV0ZXIgdmFsaWRhdGlvbiAqLworCisJaWYgKCFvYmpfaGFuZGxlIHx8ICFoYW5kbGVyIHx8ICFkYXRhKSB7CisJCXJldHVybiAoQUVfQkFEX1BBUkFNRVRFUik7CisJfQorCisJc3RhdHVzID0gYWNwaV91dF9hY3F1aXJlX211dGV4KEFDUElfTVRYX05BTUVTUEFDRSk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXJldHVybiAoc3RhdHVzKTsKKwl9CisKKwkvKiBDb252ZXJ0IGFuZCB2YWxpZGF0ZSB0aGUgaGFuZGxlICovCisKKwlub2RlID0gYWNwaV9uc19tYXBfaGFuZGxlX3RvX25vZGUob2JqX2hhbmRsZSk7CisJaWYgKCFub2RlKSB7CisJCXN0YXR1cyA9IEFFX0JBRF9QQVJBTUVURVI7CisJCWdvdG8gdW5sb2NrX2FuZF9leGl0OworCX0KKworCXN0YXR1cyA9IGFjcGlfbnNfZ2V0X2F0dGFjaGVkX2RhdGEobm9kZSwgaGFuZGxlciwgZGF0YSk7CisKKyAgICAgIHVubG9ja19hbmRfZXhpdDoKKwkodm9pZClhY3BpX3V0X3JlbGVhc2VfbXV0ZXgoQUNQSV9NVFhfTkFNRVNQQUNFKTsKKwlyZXR1cm4gKHN0YXR1cyk7Cit9CisKK0FDUElfRVhQT1JUX1NZTUJPTChhY3BpX2dldF9kYXRhKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS9uc3hmbmFtZS5jIGIvZHJpdmVycy9hY3BpL2FjcGljYS9uc3hmbmFtZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1ODlmZWEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL25zeGZuYW1lLmMKQEAgLTAsMCArMSwzNjAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBNb2R1bGUgTmFtZTogbnN4Zm5hbWUgLSBQdWJsaWMgaW50ZXJmYWNlcyB0byB0aGUgQUNQSSBzdWJzeXN0ZW0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgIEFDUEkgTmFtZXNwYWNlIG9yaWVudGVkIGludGVyZmFjZXMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA4LCBJbnRlbCBDb3JwLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAorICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgYXQgbWluaW11bSBhIGRpc2NsYWltZXIKKyAqICAgIHN1YnN0YW50aWFsbHkgc2ltaWxhciB0byB0aGUgIk5PIFdBUlJBTlRZIiBkaXNjbGFpbWVyIGJlbG93CisgKiAgICAoIkRpc2NsYWltZXIiKSBhbmQgYW55IHJlZGlzdHJpYnV0aW9uIG11c3QgYmUgY29uZGl0aW9uZWQgdXBvbgorICogICAgaW5jbHVkaW5nIGEgc3Vic3RhbnRpYWxseSBzaW1pbGFyIERpc2NsYWltZXIgcmVxdWlyZW1lbnQgZm9yIGZ1cnRoZXIKKyAqICAgIGJpbmFyeSByZWRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcworICogICAgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBOTyBXQVJSQU5UWQorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcKKyAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgorICovCisKKyNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KKyNpbmNsdWRlICJhY2NvbW1vbi5oIgorI2luY2x1ZGUgImFjbmFtZXNwLmgiCisKKyNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX05BTUVTUEFDRQorQUNQSV9NT0RVTEVfTkFNRSgibnN4Zm5hbWUiKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfZ2V0X2hhbmRsZQorICoKKyAqIFBBUkFNRVRFUlM6ICBQYXJlbnQgICAgICAgICAgLSBPYmplY3QgdG8gc2VhcmNoIHVuZGVyIChzZWFyY2ggc2NvcGUpLgorICogICAgICAgICAgICAgIFBhdGhuYW1lICAgICAgICAtIFBvaW50ZXIgdG8gYW4gYXNjaWl6IHN0cmluZyBjb250YWluaW5nIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUKKyAqICAgICAgICAgICAgICByZXRfaGFuZGxlICAgICAgLSBXaGVyZSB0aGUgcmV0dXJuIGhhbmRsZSBpcyByZXR1cm5lZAorICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogVGhpcyByb3V0aW5lIHdpbGwgc2VhcmNoIGZvciBhIGNhbGxlciBzcGVjaWZpZWQgbmFtZSBpbiB0aGUKKyAqICAgICAgICAgICAgICBuYW1lIHNwYWNlLiAgVGhlIGNhbGxlciBjYW4gcmVzdHJpY3QgdGhlIHNlYXJjaCByZWdpb24gYnkKKyAqICAgICAgICAgICAgICBzcGVjaWZ5aW5nIGEgbm9uIE5VTEwgcGFyZW50LiAgVGhlIHBhcmVudCB2YWx1ZSBpcyBpdHNlbGYgYQorICogICAgICAgICAgICAgIG5hbWVzcGFjZSBoYW5kbGUuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2FjcGlfc3RhdHVzCithY3BpX2dldF9oYW5kbGUoYWNwaV9oYW5kbGUgcGFyZW50LAorCQlhY3BpX3N0cmluZyBwYXRobmFtZSwgYWNwaV9oYW5kbGUgKiByZXRfaGFuZGxlKQoreworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZSA9IE5VTEw7CisJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKnByZWZpeF9ub2RlID0gTlVMTDsKKworCUFDUElfRlVOQ1RJT05fRU5UUlkoKTsKKworCS8qIFBhcmFtZXRlciBWYWxpZGF0aW9uICovCisKKwlpZiAoIXJldF9oYW5kbGUgfHwgIXBhdGhuYW1lKSB7CisJCXJldHVybiAoQUVfQkFEX1BBUkFNRVRFUik7CisJfQorCisJLyogQ29udmVydCBhIHBhcmVudCBoYW5kbGUgdG8gYSBwcmVmaXggbm9kZSAqLworCisJaWYgKHBhcmVudCkgeworCQlwcmVmaXhfbm9kZSA9IGFjcGlfbnNfbWFwX2hhbmRsZV90b19ub2RlKHBhcmVudCk7CisJCWlmICghcHJlZml4X25vZGUpIHsKKwkJCXJldHVybiAoQUVfQkFEX1BBUkFNRVRFUik7CisJCX0KKwl9CisKKwkvKgorCSAqIFZhbGlkIGNhc2VzIGFyZToKKwkgKiAxKSBGdWxseSBxdWFsaWZpZWQgcGF0aG5hbWUKKwkgKiAyKSBQYXJlbnQgKyBSZWxhdGl2ZSBwYXRobmFtZQorCSAqCisJICogRXJyb3IgZm9yIDxudWxsIFBhcmVudCArIHJlbGF0aXZlIHBhdGg+CisJICovCisJaWYgKGFjcGlfbnNfdmFsaWRfcm9vdF9wcmVmaXgocGF0aG5hbWVbMF0pKSB7CisKKwkJLyogUGF0aG5hbWUgaXMgZnVsbHkgcXVhbGlmaWVkIChzdGFydHMgd2l0aCAnXCcpICovCisKKwkJLyogU3BlY2lhbCBjYXNlIGZvciByb290LW9ubHksIHNpbmNlIHdlIGNhbid0IHNlYXJjaCBmb3IgaXQgKi8KKworCQlpZiAoIUFDUElfU1RSQ01QKHBhdGhuYW1lLCBBQ1BJX05TX1JPT1RfUEFUSCkpIHsKKwkJCSpyZXRfaGFuZGxlID0KKwkJCSAgICBhY3BpX25zX2NvbnZlcnRfZW50cnlfdG9faGFuZGxlKGFjcGlfZ2JsX3Jvb3Rfbm9kZSk7CisJCQlyZXR1cm4gKEFFX09LKTsKKwkJfQorCX0gZWxzZSBpZiAoIXByZWZpeF9ub2RlKSB7CisKKwkJLyogUmVsYXRpdmUgcGF0aCB3aXRoIG51bGwgcHJlZml4IGlzIGRpc2FsbG93ZWQgKi8KKworCQlyZXR1cm4gKEFFX0JBRF9QQVJBTUVURVIpOworCX0KKworCS8qIEZpbmQgdGhlIE5vZGUgYW5kIGNvbnZlcnQgdG8gYSBoYW5kbGUgKi8KKworCXN0YXR1cyA9CisJICAgIGFjcGlfbnNfZ2V0X25vZGUocHJlZml4X25vZGUsIHBhdGhuYW1lLCBBQ1BJX05TX05PX1VQU0VBUkNILCAmbm9kZSk7CisJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCSpyZXRfaGFuZGxlID0gYWNwaV9uc19jb252ZXJ0X2VudHJ5X3RvX2hhbmRsZShub2RlKTsKKwl9CisKKwlyZXR1cm4gKHN0YXR1cyk7Cit9CisKK0FDUElfRVhQT1JUX1NZTUJPTChhY3BpX2dldF9oYW5kbGUpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9nZXRfbmFtZQorICoKKyAqIFBBUkFNRVRFUlM6ICBIYW5kbGUgICAgICAgICAgLSBIYW5kbGUgdG8gYmUgY29udmVydGVkIHRvIGEgcGF0aG5hbWUKKyAqICAgICAgICAgICAgICBuYW1lX3R5cGUgICAgICAgLSBGdWxsIHBhdGhuYW1lIG9yIHNpbmdsZSBzZWdtZW50CisgKiAgICAgICAgICAgICAgQnVmZmVyICAgICAgICAgIC0gQnVmZmVyIGZvciByZXR1cm5lZCBwYXRoCisgKgorICogUkVUVVJOOiAgICAgIFBvaW50ZXIgdG8gYSBzdHJpbmcgY29udGFpbmluZyB0aGUgZnVsbHkgcXVhbGlmaWVkIE5hbWUuCisgKgorICogREVTQ1JJUFRJT046IFRoaXMgcm91dGluZSByZXR1cm5zIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBhc3NvY2lhdGVkIHdpdGgKKyAqICAgICAgICAgICAgICB0aGUgSGFuZGxlIHBhcmFtZXRlci4gIFRoaXMgYW5kIHRoZSBhY3BpX3BhdGhuYW1lX3RvX2hhbmRsZSBhcmUKKyAqICAgICAgICAgICAgICBjb21wbGVtZW50YXJ5IGZ1bmN0aW9ucy4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYWNwaV9zdGF0dXMKK2FjcGlfZ2V0X25hbWUoYWNwaV9oYW5kbGUgaGFuZGxlLCB1MzIgbmFtZV90eXBlLCBzdHJ1Y3QgYWNwaV9idWZmZXIgKiBidWZmZXIpCit7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlOworCisJLyogUGFyYW1ldGVyIHZhbGlkYXRpb24gKi8KKworCWlmIChuYW1lX3R5cGUgPiBBQ1BJX05BTUVfVFlQRV9NQVgpIHsKKwkJcmV0dXJuIChBRV9CQURfUEFSQU1FVEVSKTsKKwl9CisKKwlzdGF0dXMgPSBhY3BpX3V0X3ZhbGlkYXRlX2J1ZmZlcihidWZmZXIpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm4gKHN0YXR1cyk7CisJfQorCisJaWYgKG5hbWVfdHlwZSA9PSBBQ1BJX0ZVTExfUEFUSE5BTUUpIHsKKworCQkvKiBHZXQgdGhlIGZ1bGwgcGF0aG5hbWUgKEZyb20gdGhlIG5hbWVzcGFjZSByb290KSAqLworCisJCXN0YXR1cyA9IGFjcGlfbnNfaGFuZGxlX3RvX3BhdGhuYW1lKGhhbmRsZSwgYnVmZmVyKTsKKwkJcmV0dXJuIChzdGF0dXMpOworCX0KKworCS8qCisJICogV2FudHMgdGhlIHNpbmdsZSBzZWdtZW50IEFDUEkgbmFtZS4KKwkgKiBWYWxpZGF0ZSBoYW5kbGUgYW5kIGNvbnZlcnQgdG8gYSBuYW1lc3BhY2UgTm9kZQorCSAqLworCXN0YXR1cyA9IGFjcGlfdXRfYWNxdWlyZV9tdXRleChBQ1BJX01UWF9OQU1FU1BBQ0UpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm4gKHN0YXR1cyk7CisJfQorCisJbm9kZSA9IGFjcGlfbnNfbWFwX2hhbmRsZV90b19ub2RlKGhhbmRsZSk7CisJaWYgKCFub2RlKSB7CisJCXN0YXR1cyA9IEFFX0JBRF9QQVJBTUVURVI7CisJCWdvdG8gdW5sb2NrX2FuZF9leGl0OworCX0KKworCS8qIFZhbGlkYXRlL0FsbG9jYXRlL0NsZWFyIGNhbGxlciBidWZmZXIgKi8KKworCXN0YXR1cyA9IGFjcGlfdXRfaW5pdGlhbGl6ZV9idWZmZXIoYnVmZmVyLCBBQ1BJX1BBVEhfU0VHTUVOVF9MRU5HVEgpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlnb3RvIHVubG9ja19hbmRfZXhpdDsKKwl9CisKKwkvKiBKdXN0IGNvcHkgdGhlIEFDUEkgbmFtZSBmcm9tIHRoZSBOb2RlIGFuZCB6ZXJvIHRlcm1pbmF0ZSBpdCAqLworCisJQUNQSV9TVFJOQ1BZKGJ1ZmZlci0+cG9pbnRlciwgYWNwaV91dF9nZXRfbm9kZV9uYW1lKG5vZGUpLAorCQkgICAgIEFDUElfTkFNRV9TSVpFKTsKKwkoKGNoYXIgKilidWZmZXItPnBvaW50ZXIpW0FDUElfTkFNRV9TSVpFXSA9IDA7CisJc3RhdHVzID0gQUVfT0s7CisKKyAgICAgIHVubG9ja19hbmRfZXhpdDoKKworCSh2b2lkKWFjcGlfdXRfcmVsZWFzZV9tdXRleChBQ1BJX01UWF9OQU1FU1BBQ0UpOworCXJldHVybiAoc3RhdHVzKTsKK30KKworQUNQSV9FWFBPUlRfU1lNQk9MKGFjcGlfZ2V0X25hbWUpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9nZXRfb2JqZWN0X2luZm8KKyAqCisgKiBQQVJBTUVURVJTOiAgSGFuZGxlICAgICAgICAgIC0gT2JqZWN0IEhhbmRsZQorICogICAgICAgICAgICAgIEJ1ZmZlciAgICAgICAgICAtIFdoZXJlIHRoZSBpbmZvIGlzIHJldHVybmVkCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBSZXR1cm5zIGluZm9ybWF0aW9uIGFib3V0IGFuIG9iamVjdCBhcyBnbGVhbmVkIGZyb20gdGhlCisgKiAgICAgICAgICAgICAgbmFtZXNwYWNlIG5vZGUgYW5kIHBvc3NpYmx5IGJ5IHJ1bm5pbmcgc2V2ZXJhbCBzdGFuZGFyZAorICogICAgICAgICAgICAgIGNvbnRyb2wgbWV0aG9kcyAoU3VjaCBhcyBpbiB0aGUgY2FzZSBvZiBhIGRldmljZS4pCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2FjcGlfc3RhdHVzCithY3BpX2dldF9vYmplY3RfaW5mbyhhY3BpX2hhbmRsZSBoYW5kbGUsIHN0cnVjdCBhY3BpX2J1ZmZlciAqIGJ1ZmZlcikKK3sKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGU7CisJc3RydWN0IGFjcGlfZGV2aWNlX2luZm8gKmluZm87CisJc3RydWN0IGFjcGlfZGV2aWNlX2luZm8gKnJldHVybl9pbmZvOworCXN0cnVjdCBhY3BpX2NvbXBhdGlibGVfaWRfbGlzdCAqY2lkX2xpc3QgPSBOVUxMOworCWFjcGlfc2l6ZSBzaXplOworCisJLyogUGFyYW1ldGVyIHZhbGlkYXRpb24gKi8KKworCWlmICghaGFuZGxlIHx8ICFidWZmZXIpIHsKKwkJcmV0dXJuIChBRV9CQURfUEFSQU1FVEVSKTsKKwl9CisKKwlzdGF0dXMgPSBhY3BpX3V0X3ZhbGlkYXRlX2J1ZmZlcihidWZmZXIpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm4gKHN0YXR1cyk7CisJfQorCisJaW5mbyA9IEFDUElfQUxMT0NBVEVfWkVST0VEKHNpemVvZihzdHJ1Y3QgYWNwaV9kZXZpY2VfaW5mbykpOworCWlmICghaW5mbykgeworCQlyZXR1cm4gKEFFX05PX01FTU9SWSk7CisJfQorCisJc3RhdHVzID0gYWNwaV91dF9hY3F1aXJlX211dGV4KEFDUElfTVRYX05BTUVTUEFDRSk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCWdvdG8gY2xlYW51cDsKKwl9CisKKwlub2RlID0gYWNwaV9uc19tYXBfaGFuZGxlX3RvX25vZGUoaGFuZGxlKTsKKwlpZiAoIW5vZGUpIHsKKwkJKHZvaWQpYWNwaV91dF9yZWxlYXNlX211dGV4KEFDUElfTVRYX05BTUVTUEFDRSk7CisJCXN0YXR1cyA9IEFFX0JBRF9QQVJBTUVURVI7CisJCWdvdG8gY2xlYW51cDsKKwl9CisKKwkvKiBJbml0IHJldHVybiBzdHJ1Y3R1cmUgKi8KKworCXNpemUgPSBzaXplb2Yoc3RydWN0IGFjcGlfZGV2aWNlX2luZm8pOworCisJaW5mby0+dHlwZSA9IG5vZGUtPnR5cGU7CisJaW5mby0+bmFtZSA9IG5vZGUtPm5hbWUuaW50ZWdlcjsKKwlpbmZvLT52YWxpZCA9IDA7CisKKwlpZiAobm9kZS0+dHlwZSA9PSBBQ1BJX1RZUEVfTUVUSE9EKSB7CisJCWluZm8tPnBhcmFtX2NvdW50ID0gbm9kZS0+b2JqZWN0LT5tZXRob2QucGFyYW1fY291bnQ7CisJfQorCisJc3RhdHVzID0gYWNwaV91dF9yZWxlYXNlX211dGV4KEFDUElfTVRYX05BTUVTUEFDRSk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCWdvdG8gY2xlYW51cDsKKwl9CisKKwkvKiBJZiBub3QgYSBkZXZpY2UsIHdlIGFyZSBhbGwgZG9uZSAqLworCisJaWYgKGluZm8tPnR5cGUgPT0gQUNQSV9UWVBFX0RFVklDRSkgeworCQkvKgorCQkgKiBHZXQgZXh0cmEgaW5mbyBmb3IgQUNQSSBEZXZpY2VzIG9iamVjdHMgb25seToKKwkJICogUnVuIHRoZSBEZXZpY2UgX0hJRCwgX1VJRCwgX0NJRCwgX1NUQSwgX0FEUiBhbmQgX3N4X2QgbWV0aG9kcy4KKwkJICoKKwkJICogTm90ZTogbm9uZSBvZiB0aGVzZSBtZXRob2RzIGFyZSByZXF1aXJlZCwgc28gdGhleSBtYXkgb3IgbWF5CisJCSAqIG5vdCBiZSBwcmVzZW50IGZvciB0aGlzIGRldmljZS4gIFRoZSBJbmZvLT5WYWxpZCBiaXRmaWVsZCBpcyB1c2VkCisJCSAqIHRvIGluZGljYXRlIHdoaWNoIG1ldGhvZHMgd2VyZSBmb3VuZCBhbmQgcmFuIHN1Y2Nlc3NmdWxseS4KKwkJICovCisKKwkJLyogRXhlY3V0ZSB0aGUgRGV2aWNlLl9ISUQgbWV0aG9kICovCisKKwkJc3RhdHVzID0gYWNwaV91dF9leGVjdXRlX0hJRChub2RlLCAmaW5mby0+aGFyZHdhcmVfaWQpOworCQlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpIHsKKwkJCWluZm8tPnZhbGlkIHw9IEFDUElfVkFMSURfSElEOworCQl9CisKKwkJLyogRXhlY3V0ZSB0aGUgRGV2aWNlLl9VSUQgbWV0aG9kICovCisKKwkJc3RhdHVzID0gYWNwaV91dF9leGVjdXRlX1VJRChub2RlLCAmaW5mby0+dW5pcXVlX2lkKTsKKwkJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCQlpbmZvLT52YWxpZCB8PSBBQ1BJX1ZBTElEX1VJRDsKKwkJfQorCisJCS8qIEV4ZWN1dGUgdGhlIERldmljZS5fQ0lEIG1ldGhvZCAqLworCisJCXN0YXR1cyA9IGFjcGlfdXRfZXhlY3V0ZV9DSUQobm9kZSwgJmNpZF9saXN0KTsKKwkJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCQlzaXplICs9IGNpZF9saXN0LT5zaXplOworCQkJaW5mby0+dmFsaWQgfD0gQUNQSV9WQUxJRF9DSUQ7CisJCX0KKworCQkvKiBFeGVjdXRlIHRoZSBEZXZpY2UuX1NUQSBtZXRob2QgKi8KKworCQlzdGF0dXMgPSBhY3BpX3V0X2V4ZWN1dGVfU1RBKG5vZGUsICZpbmZvLT5jdXJyZW50X3N0YXR1cyk7CisJCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkgeworCQkJaW5mby0+dmFsaWQgfD0gQUNQSV9WQUxJRF9TVEE7CisJCX0KKworCQkvKiBFeGVjdXRlIHRoZSBEZXZpY2UuX0FEUiBtZXRob2QgKi8KKworCQlzdGF0dXMgPSBhY3BpX3V0X2V2YWx1YXRlX251bWVyaWNfb2JqZWN0KE1FVEhPRF9OQU1FX19BRFIsIG5vZGUsCisJCQkJCQkJICZpbmZvLT5hZGRyZXNzKTsKKwkJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCQlpbmZvLT52YWxpZCB8PSBBQ1BJX1ZBTElEX0FEUjsKKwkJfQorCisJCS8qIEV4ZWN1dGUgdGhlIERldmljZS5fc3hfZCBtZXRob2RzICovCisKKwkJc3RhdHVzID0gYWNwaV91dF9leGVjdXRlX3N4ZHMobm9kZSwgaW5mby0+aGlnaGVzdF9kc3RhdGVzKTsKKwkJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCQlpbmZvLT52YWxpZCB8PSBBQ1BJX1ZBTElEX1NYRFM7CisJCX0KKwl9CisKKwkvKiBWYWxpZGF0ZS9BbGxvY2F0ZS9DbGVhciBjYWxsZXIgYnVmZmVyICovCisKKwlzdGF0dXMgPSBhY3BpX3V0X2luaXRpYWxpemVfYnVmZmVyKGJ1ZmZlciwgc2l6ZSk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCWdvdG8gY2xlYW51cDsKKwl9CisKKwkvKiBQb3B1bGF0ZSB0aGUgcmV0dXJuIGJ1ZmZlciAqLworCisJcmV0dXJuX2luZm8gPSBidWZmZXItPnBvaW50ZXI7CisJQUNQSV9NRU1DUFkocmV0dXJuX2luZm8sIGluZm8sIHNpemVvZihzdHJ1Y3QgYWNwaV9kZXZpY2VfaW5mbykpOworCisJaWYgKGNpZF9saXN0KSB7CisJCUFDUElfTUVNQ1BZKCZyZXR1cm5faW5mby0+Y29tcGF0aWJpbGl0eV9pZCwgY2lkX2xpc3QsCisJCQkgICAgY2lkX2xpc3QtPnNpemUpOworCX0KKworICAgICAgY2xlYW51cDoKKwlBQ1BJX0ZSRUUoaW5mbyk7CisJaWYgKGNpZF9saXN0KSB7CisJCUFDUElfRlJFRShjaWRfbGlzdCk7CisJfQorCXJldHVybiAoc3RhdHVzKTsKK30KKworQUNQSV9FWFBPUlRfU1lNQk9MKGFjcGlfZ2V0X29iamVjdF9pbmZvKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS9uc3hmb2JqLmMgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL25zeGZvYmouYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzdlZmMxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS9uc3hmb2JqLmMKQEAgLTAsMCArMSwyODcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogTW9kdWxlIE5hbWU6IG5zeGZvYmogLSBQdWJsaWMgaW50ZXJmYWNlcyB0byB0aGUgQUNQSSBzdWJzeXN0ZW0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgIEFDUEkgT2JqZWN0IG9yaWVudGVkIGludGVyZmFjZXMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwOCwgSW50ZWwgQ29ycC4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKKyAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIGF0IG1pbmltdW0gYSBkaXNjbGFpbWVyCisgKiAgICBzdWJzdGFudGlhbGx5IHNpbWlsYXIgdG8gdGhlICJOTyBXQVJSQU5UWSIgZGlzY2xhaW1lciBiZWxvdworICogICAgKCJEaXNjbGFpbWVyIikgYW5kIGFueSByZWRpc3RyaWJ1dGlvbiBtdXN0IGJlIGNvbmRpdGlvbmVkIHVwb24KKyAqICAgIGluY2x1ZGluZyBhIHN1YnN0YW50aWFsbHkgc2ltaWxhciBEaXNjbGFpbWVyIHJlcXVpcmVtZW50IGZvciBmdXJ0aGVyCisgKiAgICBiaW5hcnkgcmVkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMKKyAqICAgIG9mIGFueSBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogTk8gV0FSUkFOVFkKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HCisgKiBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KKyAqLworCisjaW5jbHVkZSA8YWNwaS9hY3BpLmg+CisjaW5jbHVkZSAiYWNjb21tb24uaCIKKyNpbmNsdWRlICJhY25hbWVzcC5oIgorCisjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9OQU1FU1BBQ0UKK0FDUElfTU9EVUxFX05BTUUoIm5zeGZvYmoiKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX2dldF9pZAorICoKKyAqIFBBUkFNRVRFUlM6ICBIYW5kbGUgICAgICAgICAgLSBIYW5kbGUgb2Ygb2JqZWN0IHdob3NlIGlkIGlzIGRlc2lyZWQKKyAqICAgICAgICAgICAgICByZXRfaWQgICAgICAgICAgLSBXaGVyZSB0aGUgaWQgd2lsbCBiZSBwbGFjZWQKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IFRoaXMgcm91dGluZSByZXR1cm5zIHRoZSBvd25lciBpZCBhc3NvY2lhdGVkIHdpdGggYSBoYW5kbGUKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYWNwaV9zdGF0dXMgYWNwaV9nZXRfaWQoYWNwaV9oYW5kbGUgaGFuZGxlLCBhY3BpX293bmVyX2lkICogcmV0X2lkKQoreworCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKworCS8qIFBhcmFtZXRlciBWYWxpZGF0aW9uICovCisKKwlpZiAoIXJldF9pZCkgeworCQlyZXR1cm4gKEFFX0JBRF9QQVJBTUVURVIpOworCX0KKworCXN0YXR1cyA9IGFjcGlfdXRfYWNxdWlyZV9tdXRleChBQ1BJX01UWF9OQU1FU1BBQ0UpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm4gKHN0YXR1cyk7CisJfQorCisJLyogQ29udmVydCBhbmQgdmFsaWRhdGUgdGhlIGhhbmRsZSAqLworCisJbm9kZSA9IGFjcGlfbnNfbWFwX2hhbmRsZV90b19ub2RlKGhhbmRsZSk7CisJaWYgKCFub2RlKSB7CisJCSh2b2lkKWFjcGlfdXRfcmVsZWFzZV9tdXRleChBQ1BJX01UWF9OQU1FU1BBQ0UpOworCQlyZXR1cm4gKEFFX0JBRF9QQVJBTUVURVIpOworCX0KKworCSpyZXRfaWQgPSBub2RlLT5vd25lcl9pZDsKKworCXN0YXR1cyA9IGFjcGlfdXRfcmVsZWFzZV9tdXRleChBQ1BJX01UWF9OQU1FU1BBQ0UpOworCXJldHVybiAoc3RhdHVzKTsKK30KKworQUNQSV9FWFBPUlRfU1lNQk9MKGFjcGlfZ2V0X2lkKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX2dldF90eXBlCisgKgorICogUEFSQU1FVEVSUzogIEhhbmRsZSAgICAgICAgICAtIEhhbmRsZSBvZiBvYmplY3Qgd2hvc2UgdHlwZSBpcyBkZXNpcmVkCisgKiAgICAgICAgICAgICAgcmV0X3R5cGUgICAgICAgIC0gV2hlcmUgdGhlIHR5cGUgd2lsbCBiZSBwbGFjZWQKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IFRoaXMgcm91dGluZSByZXR1cm5zIHRoZSB0eXBlIGFzc29jaWF0ZCB3aXRoIGEgcGFydGljdWxhciBoYW5kbGUKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYWNwaV9zdGF0dXMgYWNwaV9nZXRfdHlwZShhY3BpX2hhbmRsZSBoYW5kbGUsIGFjcGlfb2JqZWN0X3R5cGUgKiByZXRfdHlwZSkKK3sKKwlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZTsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisKKwkvKiBQYXJhbWV0ZXIgVmFsaWRhdGlvbiAqLworCisJaWYgKCFyZXRfdHlwZSkgeworCQlyZXR1cm4gKEFFX0JBRF9QQVJBTUVURVIpOworCX0KKworCS8qCisJICogU3BlY2lhbCBjYXNlIGZvciB0aGUgcHJlZGVmaW5lZCBSb290IE5vZGUKKwkgKiAocmV0dXJuIHR5cGUgQU5ZKQorCSAqLworCWlmIChoYW5kbGUgPT0gQUNQSV9ST09UX09CSkVDVCkgeworCQkqcmV0X3R5cGUgPSBBQ1BJX1RZUEVfQU5ZOworCQlyZXR1cm4gKEFFX09LKTsKKwl9CisKKwlzdGF0dXMgPSBhY3BpX3V0X2FjcXVpcmVfbXV0ZXgoQUNQSV9NVFhfTkFNRVNQQUNFKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuIChzdGF0dXMpOworCX0KKworCS8qIENvbnZlcnQgYW5kIHZhbGlkYXRlIHRoZSBoYW5kbGUgKi8KKworCW5vZGUgPSBhY3BpX25zX21hcF9oYW5kbGVfdG9fbm9kZShoYW5kbGUpOworCWlmICghbm9kZSkgeworCQkodm9pZClhY3BpX3V0X3JlbGVhc2VfbXV0ZXgoQUNQSV9NVFhfTkFNRVNQQUNFKTsKKwkJcmV0dXJuIChBRV9CQURfUEFSQU1FVEVSKTsKKwl9CisKKwkqcmV0X3R5cGUgPSBub2RlLT50eXBlOworCisJc3RhdHVzID0gYWNwaV91dF9yZWxlYXNlX211dGV4KEFDUElfTVRYX05BTUVTUEFDRSk7CisJcmV0dXJuIChzdGF0dXMpOworfQorCitBQ1BJX0VYUE9SVF9TWU1CT0woYWNwaV9nZXRfdHlwZSkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9nZXRfcGFyZW50CisgKgorICogUEFSQU1FVEVSUzogIEhhbmRsZSAgICAgICAgICAtIEhhbmRsZSBvZiBvYmplY3Qgd2hvc2UgcGFyZW50IGlzIGRlc2lyZWQKKyAqICAgICAgICAgICAgICByZXRfaGFuZGxlICAgICAgLSBXaGVyZSB0aGUgcGFyZW50IGhhbmRsZSB3aWxsIGJlIHBsYWNlZAorICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogUmV0dXJucyBhIGhhbmRsZSB0byB0aGUgcGFyZW50IG9mIHRoZSBvYmplY3QgcmVwcmVzZW50ZWQgYnkKKyAqICAgICAgICAgICAgICBIYW5kbGUuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2FjcGlfc3RhdHVzIGFjcGlfZ2V0X3BhcmVudChhY3BpX2hhbmRsZSBoYW5kbGUsIGFjcGlfaGFuZGxlICogcmV0X2hhbmRsZSkKK3sKKwlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZTsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisKKwlpZiAoIXJldF9oYW5kbGUpIHsKKwkJcmV0dXJuIChBRV9CQURfUEFSQU1FVEVSKTsKKwl9CisKKwkvKiBTcGVjaWFsIGNhc2UgZm9yIHRoZSBwcmVkZWZpbmVkIFJvb3QgTm9kZSAobm8gcGFyZW50KSAqLworCisJaWYgKGhhbmRsZSA9PSBBQ1BJX1JPT1RfT0JKRUNUKSB7CisJCXJldHVybiAoQUVfTlVMTF9FTlRSWSk7CisJfQorCisJc3RhdHVzID0gYWNwaV91dF9hY3F1aXJlX211dGV4KEFDUElfTVRYX05BTUVTUEFDRSk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXJldHVybiAoc3RhdHVzKTsKKwl9CisKKwkvKiBDb252ZXJ0IGFuZCB2YWxpZGF0ZSB0aGUgaGFuZGxlICovCisKKwlub2RlID0gYWNwaV9uc19tYXBfaGFuZGxlX3RvX25vZGUoaGFuZGxlKTsKKwlpZiAoIW5vZGUpIHsKKwkJc3RhdHVzID0gQUVfQkFEX1BBUkFNRVRFUjsKKwkJZ290byB1bmxvY2tfYW5kX2V4aXQ7CisJfQorCisJLyogR2V0IHRoZSBwYXJlbnQgZW50cnkgKi8KKworCSpyZXRfaGFuZGxlID0KKwkgICAgYWNwaV9uc19jb252ZXJ0X2VudHJ5X3RvX2hhbmRsZShhY3BpX25zX2dldF9wYXJlbnRfbm9kZShub2RlKSk7CisKKwkvKiBSZXR1cm4gZXhjZXB0aW9uIGlmIHBhcmVudCBpcyBudWxsICovCisKKwlpZiAoIWFjcGlfbnNfZ2V0X3BhcmVudF9ub2RlKG5vZGUpKSB7CisJCXN0YXR1cyA9IEFFX05VTExfRU5UUlk7CisJfQorCisgICAgICB1bmxvY2tfYW5kX2V4aXQ6CisKKwkodm9pZClhY3BpX3V0X3JlbGVhc2VfbXV0ZXgoQUNQSV9NVFhfTkFNRVNQQUNFKTsKKwlyZXR1cm4gKHN0YXR1cyk7Cit9CisKK0FDUElfRVhQT1JUX1NZTUJPTChhY3BpX2dldF9wYXJlbnQpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfZ2V0X25leHRfb2JqZWN0CisgKgorICogUEFSQU1FVEVSUzogIFR5cGUgICAgICAgICAgICAtIFR5cGUgb2Ygb2JqZWN0IHRvIGJlIHNlYXJjaGVkIGZvcgorICogICAgICAgICAgICAgIFBhcmVudCAgICAgICAgICAtIFBhcmVudCBvYmplY3Qgd2hvc2UgY2hpbGRyZW4gd2UgYXJlIGdldHRpbmcKKyAqICAgICAgICAgICAgICBsYXN0X2NoaWxkICAgICAgLSBQcmV2aW91cyBjaGlsZCB0aGF0IHdhcyBmb3VuZC4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgTkVYVCBjaGlsZCB3aWxsIGJlIHJldHVybmVkCisgKiAgICAgICAgICAgICAgcmV0X2hhbmRsZSAgICAgIC0gV2hlcmUgaGFuZGxlIHRvIHRoZSBuZXh0IG9iamVjdCBpcyBwbGFjZWQKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IFJldHVybiB0aGUgbmV4dCBwZWVyIG9iamVjdCB3aXRoaW4gdGhlIG5hbWVzcGFjZS4gIElmIEhhbmRsZSBpcworICogICAgICAgICAgICAgIHZhbGlkLCBTY29wZSBpcyBpZ25vcmVkLiAgT3RoZXJ3aXNlLCB0aGUgZmlyc3Qgb2JqZWN0IHdpdGhpbgorICogICAgICAgICAgICAgIFNjb3BlIGlzIHJldHVybmVkLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCithY3BpX3N0YXR1cworYWNwaV9nZXRfbmV4dF9vYmplY3QoYWNwaV9vYmplY3RfdHlwZSB0eXBlLAorCQkgICAgIGFjcGlfaGFuZGxlIHBhcmVudCwKKwkJICAgICBhY3BpX2hhbmRsZSBjaGlsZCwgYWNwaV9oYW5kbGUgKiByZXRfaGFuZGxlKQoreworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZTsKKwlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqcGFyZW50X25vZGUgPSBOVUxMOworCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpjaGlsZF9ub2RlID0gTlVMTDsKKworCS8qIFBhcmFtZXRlciB2YWxpZGF0aW9uICovCisKKwlpZiAodHlwZSA+IEFDUElfVFlQRV9FWFRFUk5BTF9NQVgpIHsKKwkJcmV0dXJuIChBRV9CQURfUEFSQU1FVEVSKTsKKwl9CisKKwlzdGF0dXMgPSBhY3BpX3V0X2FjcXVpcmVfbXV0ZXgoQUNQSV9NVFhfTkFNRVNQQUNFKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuIChzdGF0dXMpOworCX0KKworCS8qIElmIG51bGwgaGFuZGxlLCB1c2UgdGhlIHBhcmVudCAqLworCisJaWYgKCFjaGlsZCkgeworCisJCS8qIFN0YXJ0IHNlYXJjaCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzcGVjaWZpZWQgc2NvcGUgKi8KKworCQlwYXJlbnRfbm9kZSA9IGFjcGlfbnNfbWFwX2hhbmRsZV90b19ub2RlKHBhcmVudCk7CisJCWlmICghcGFyZW50X25vZGUpIHsKKwkJCXN0YXR1cyA9IEFFX0JBRF9QQVJBTUVURVI7CisJCQlnb3RvIHVubG9ja19hbmRfZXhpdDsKKwkJfQorCX0gZWxzZSB7CisJCS8qIE5vbi1udWxsIGhhbmRsZSwgaWdub3JlIHRoZSBwYXJlbnQgKi8KKwkJLyogQ29udmVydCBhbmQgdmFsaWRhdGUgdGhlIGhhbmRsZSAqLworCisJCWNoaWxkX25vZGUgPSBhY3BpX25zX21hcF9oYW5kbGVfdG9fbm9kZShjaGlsZCk7CisJCWlmICghY2hpbGRfbm9kZSkgeworCQkJc3RhdHVzID0gQUVfQkFEX1BBUkFNRVRFUjsKKwkJCWdvdG8gdW5sb2NrX2FuZF9leGl0OworCQl9CisJfQorCisJLyogSW50ZXJuYWwgZnVuY3Rpb24gZG9lcyB0aGUgcmVhbCB3b3JrICovCisKKwlub2RlID0gYWNwaV9uc19nZXRfbmV4dF9ub2RlKHR5cGUsIHBhcmVudF9ub2RlLCBjaGlsZF9ub2RlKTsKKwlpZiAoIW5vZGUpIHsKKwkJc3RhdHVzID0gQUVfTk9UX0ZPVU5EOworCQlnb3RvIHVubG9ja19hbmRfZXhpdDsKKwl9CisKKwlpZiAocmV0X2hhbmRsZSkgeworCQkqcmV0X2hhbmRsZSA9IGFjcGlfbnNfY29udmVydF9lbnRyeV90b19oYW5kbGUobm9kZSk7CisJfQorCisgICAgICB1bmxvY2tfYW5kX2V4aXQ6CisKKwkodm9pZClhY3BpX3V0X3JlbGVhc2VfbXV0ZXgoQUNQSV9NVFhfTkFNRVNQQUNFKTsKKwlyZXR1cm4gKHN0YXR1cyk7Cit9CisKK0FDUElfRVhQT1JUX1NZTUJPTChhY3BpX2dldF9uZXh0X29iamVjdCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvcHNhcmdzLmMgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL3BzYXJncy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxNjFmMzUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL3BzYXJncy5jCkBAIC0wLDAgKzEsNzUyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogTW9kdWxlIE5hbWU6IHBzYXJncyAtIFBhcnNlIEFNTCBvcGNvZGUgYXJndW1lbnRzCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwOCwgSW50ZWwgQ29ycC4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKKyAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIGF0IG1pbmltdW0gYSBkaXNjbGFpbWVyCisgKiAgICBzdWJzdGFudGlhbGx5IHNpbWlsYXIgdG8gdGhlICJOTyBXQVJSQU5UWSIgZGlzY2xhaW1lciBiZWxvdworICogICAgKCJEaXNjbGFpbWVyIikgYW5kIGFueSByZWRpc3RyaWJ1dGlvbiBtdXN0IGJlIGNvbmRpdGlvbmVkIHVwb24KKyAqICAgIGluY2x1ZGluZyBhIHN1YnN0YW50aWFsbHkgc2ltaWxhciBEaXNjbGFpbWVyIHJlcXVpcmVtZW50IGZvciBmdXJ0aGVyCisgKiAgICBiaW5hcnkgcmVkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMKKyAqICAgIG9mIGFueSBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogTk8gV0FSUkFOVFkKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HCisgKiBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KKyAqLworCisjaW5jbHVkZSA8YWNwaS9hY3BpLmg+CisjaW5jbHVkZSAiYWNjb21tb24uaCIKKyNpbmNsdWRlICJhY3BhcnNlci5oIgorI2luY2x1ZGUgImFtbGNvZGUuaCIKKyNpbmNsdWRlICJhY25hbWVzcC5oIgorI2luY2x1ZGUgImFjZGlzcGF0LmgiCisKKyNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX1BBUlNFUgorQUNQSV9NT0RVTEVfTkFNRSgicHNhcmdzIikKKworLyogTG9jYWwgcHJvdG90eXBlcyAqLworc3RhdGljIHUzMgorYWNwaV9wc19nZXRfbmV4dF9wYWNrYWdlX2xlbmd0aChzdHJ1Y3QgYWNwaV9wYXJzZV9zdGF0ZSAqcGFyc2VyX3N0YXRlKTsKKworc3RhdGljIHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICphY3BpX3BzX2dldF9uZXh0X2ZpZWxkKHN0cnVjdCBhY3BpX3BhcnNlX3N0YXRlCisJCQkJCQkgICAgICAgKnBhcnNlcl9zdGF0ZSk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfcHNfZ2V0X25leHRfcGFja2FnZV9sZW5ndGgKKyAqCisgKiBQQVJBTUVURVJTOiAgcGFyc2VyX3N0YXRlICAgICAgICAtIEN1cnJlbnQgcGFyc2VyIHN0YXRlIG9iamVjdAorICoKKyAqIFJFVFVSTjogICAgICBEZWNvZGVkIHBhY2thZ2UgbGVuZ3RoLiBPbiBjb21wbGV0aW9uLCB0aGUgQU1MIHBvaW50ZXIgcG9pbnRzCisgKiAgICAgICAgICAgICAgcGFzdCB0aGUgbGVuZ3RoIGJ5dGUgb3IgYnl0ZXMuCisgKgorICogREVTQ1JJUFRJT046IERlY29kZSBhbmQgcmV0dXJuIGEgcGFja2FnZSBsZW5ndGggZmllbGQuCisgKiAgICAgICAgICAgICAgTm90ZTogTGFyZ2VzdCBwYWNrYWdlIGxlbmd0aCBpcyAyOCBiaXRzLCBmcm9tIEFDUEkgc3BlY2lmaWNhdGlvbgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB1MzIKK2FjcGlfcHNfZ2V0X25leHRfcGFja2FnZV9sZW5ndGgoc3RydWN0IGFjcGlfcGFyc2Vfc3RhdGUgKnBhcnNlcl9zdGF0ZSkKK3sKKwl1OCAqYW1sID0gcGFyc2VyX3N0YXRlLT5hbWw7CisJdTMyIHBhY2thZ2VfbGVuZ3RoID0gMDsKKwl1MzIgYnl0ZV9jb3VudDsKKwl1OCBieXRlX3plcm9fbWFzayA9IDB4M0Y7CS8qIERlZmF1bHQgWzA6NV0gKi8KKworCUFDUElfRlVOQ1RJT05fVFJBQ0UocHNfZ2V0X25leHRfcGFja2FnZV9sZW5ndGgpOworCisJLyoKKwkgKiBCeXRlIDAgYml0cyBbNjo3XSBjb250YWluIHRoZSBudW1iZXIgb2YgYWRkaXRpb25hbCBieXRlcworCSAqIHVzZWQgdG8gZW5jb2RlIHRoZSBwYWNrYWdlIGxlbmd0aCwgZWl0aGVyIDAsMSwyLCBvciAzCisJICovCisJYnl0ZV9jb3VudCA9IChhbWxbMF0gPj4gNik7CisJcGFyc2VyX3N0YXRlLT5hbWwgKz0gKChhY3BpX3NpemUpIGJ5dGVfY291bnQgKyAxKTsKKworCS8qIEdldCBieXRlcyAzLCAyLCAxIGFzIG5lZWRlZCAqLworCisJd2hpbGUgKGJ5dGVfY291bnQpIHsKKwkJLyoKKwkJICogRmluYWwgYml0IHBvc2l0aW9ucyBmb3IgdGhlIHBhY2thZ2UgbGVuZ3RoIGJ5dGVzOgorCQkgKiAgICAgIEJ5dGUzLT5bMjA6MjddCisJCSAqICAgICAgQnl0ZTItPlsxMjoxOV0KKwkJICogICAgICBCeXRlMS0+WzA0OjExXQorCQkgKiAgICAgIEJ5dGUwLT5bMDA6MDNdCisJCSAqLworCQlwYWNrYWdlX2xlbmd0aCB8PSAoYW1sW2J5dGVfY291bnRdIDw8ICgoYnl0ZV9jb3VudCA8PCAzKSAtIDQpKTsKKworCQlieXRlX3plcm9fbWFzayA9IDB4MEY7CS8qIFVzZSBiaXRzIFswOjNdIG9mIGJ5dGUgMCAqLworCQlieXRlX2NvdW50LS07CisJfQorCisJLyogQnl0ZSAwIGlzIGEgc3BlY2lhbCBjYXNlLCBlaXRoZXIgYml0cyBbMDozXSBvciBbMDo1XSBhcmUgdXNlZCAqLworCisJcGFja2FnZV9sZW5ndGggfD0gKGFtbFswXSAmIGJ5dGVfemVyb19tYXNrKTsKKwlyZXR1cm5fVUlOVDMyKHBhY2thZ2VfbGVuZ3RoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9wc19nZXRfbmV4dF9wYWNrYWdlX2VuZAorICoKKyAqIFBBUkFNRVRFUlM6ICBwYXJzZXJfc3RhdGUgICAgICAgIC0gQ3VycmVudCBwYXJzZXIgc3RhdGUgb2JqZWN0CisgKgorICogUkVUVVJOOiAgICAgIFBvaW50ZXIgdG8gZW5kLW9mLXBhY2thZ2UgKzEKKyAqCisgKiBERVNDUklQVElPTjogR2V0IG5leHQgcGFja2FnZSBsZW5ndGggYW5kIHJldHVybiBhIHBvaW50ZXIgcGFzdCB0aGUgZW5kIG9mCisgKiAgICAgICAgICAgICAgdGhlIHBhY2thZ2UuICBDb25zdW1lcyB0aGUgcGFja2FnZSBsZW5ndGggZmllbGQKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit1OCAqYWNwaV9wc19nZXRfbmV4dF9wYWNrYWdlX2VuZChzdHJ1Y3QgYWNwaV9wYXJzZV9zdGF0ZSAqcGFyc2VyX3N0YXRlKQoreworCXU4ICpzdGFydCA9IHBhcnNlcl9zdGF0ZS0+YW1sOworCXUzMiBwYWNrYWdlX2xlbmd0aDsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0UocHNfZ2V0X25leHRfcGFja2FnZV9lbmQpOworCisJLyogRnVuY3Rpb24gYmVsb3cgdXBkYXRlcyBwYXJzZXJfc3RhdGUtPkFtbCAqLworCisJcGFja2FnZV9sZW5ndGggPSBhY3BpX3BzX2dldF9uZXh0X3BhY2thZ2VfbGVuZ3RoKHBhcnNlcl9zdGF0ZSk7CisKKwlyZXR1cm5fUFRSKHN0YXJ0ICsgcGFja2FnZV9sZW5ndGgpOwkvKiBlbmQgb2YgcGFja2FnZSAqLworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX3BzX2dldF9uZXh0X25hbWVzdHJpbmcKKyAqCisgKiBQQVJBTUVURVJTOiAgcGFyc2VyX3N0YXRlICAgICAgICAtIEN1cnJlbnQgcGFyc2VyIHN0YXRlIG9iamVjdAorICoKKyAqIFJFVFVSTjogICAgICBQb2ludGVyIHRvIHRoZSBzdGFydCBvZiB0aGUgbmFtZSBzdHJpbmcgKHBvaW50ZXIgcG9pbnRzIGludG8KKyAqICAgICAgICAgICAgICB0aGUgQU1MLgorICoKKyAqIERFU0NSSVBUSU9OOiBHZXQgbmV4dCByYXcgbmFtZXN0cmluZyB3aXRoaW4gdGhlIEFNTCBzdHJlYW0uICBIYW5kbGVzIGFsbCBuYW1lCisgKiAgICAgICAgICAgICAgcHJlZml4IGNoYXJhY3RlcnMuICBTZXQgcGFyc2VyIHN0YXRlIHRvIHBvaW50IHBhc3QgdGhlIHN0cmluZy4KKyAqICAgICAgICAgICAgICAoTmFtZSBpcyBjb25zdW1lZCBmcm9tIHRoZSBBTUwuKQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2NoYXIgKmFjcGlfcHNfZ2V0X25leHRfbmFtZXN0cmluZyhzdHJ1Y3QgYWNwaV9wYXJzZV9zdGF0ZSAqcGFyc2VyX3N0YXRlKQoreworCXU4ICpzdGFydCA9IHBhcnNlcl9zdGF0ZS0+YW1sOworCXU4ICplbmQgPSBwYXJzZXJfc3RhdGUtPmFtbDsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0UocHNfZ2V0X25leHRfbmFtZXN0cmluZyk7CisKKwkvKiBQb2ludCBwYXN0IGFueSBuYW1lc3RyaW5nIHByZWZpeCBjaGFyYWN0ZXJzIChiYWNrc2xhc2ggb3IgY2FyYXQpICovCisKKwl3aGlsZSAoYWNwaV9wc19pc19wcmVmaXhfY2hhcigqZW5kKSkgeworCQllbmQrKzsKKwl9CisKKwkvKiBEZWNvZGUgdGhlIHBhdGggcHJlZml4IGNoYXJhY3RlciAqLworCisJc3dpdGNoICgqZW5kKSB7CisJY2FzZSAwOgorCisJCS8qIG51bGxfbmFtZSAqLworCisJCWlmIChlbmQgPT0gc3RhcnQpIHsKKwkJCXN0YXJ0ID0gTlVMTDsKKwkJfQorCQllbmQrKzsKKwkJYnJlYWs7CisKKwljYXNlIEFNTF9EVUFMX05BTUVfUFJFRklYOgorCisJCS8qIFR3byBuYW1lIHNlZ21lbnRzICovCisKKwkJZW5kICs9IDEgKyAoMiAqIEFDUElfTkFNRV9TSVpFKTsKKwkJYnJlYWs7CisKKwljYXNlIEFNTF9NVUxUSV9OQU1FX1BSRUZJWF9PUDoKKworCQkvKiBNdWx0aXBsZSBuYW1lIHNlZ21lbnRzLCA0IGNoYXJzIGVhY2gsIGNvdW50IGluIG5leHQgYnl0ZSAqLworCisJCWVuZCArPSAyICsgKCooZW5kICsgMSkgKiBBQ1BJX05BTUVfU0laRSk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKworCQkvKiBTaW5nbGUgbmFtZSBzZWdtZW50ICovCisKKwkJZW5kICs9IEFDUElfTkFNRV9TSVpFOworCQlicmVhazsKKwl9CisKKwlwYXJzZXJfc3RhdGUtPmFtbCA9IGVuZDsKKwlyZXR1cm5fUFRSKChjaGFyICopc3RhcnQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX3BzX2dldF9uZXh0X25hbWVwYXRoCisgKgorICogUEFSQU1FVEVSUzogIHBhcnNlcl9zdGF0ZSAgICAgICAgLSBDdXJyZW50IHBhcnNlciBzdGF0ZSBvYmplY3QKKyAqICAgICAgICAgICAgICBBcmcgICAgICAgICAgICAgICAgIC0gV2hlcmUgdGhlIG5hbWVwYXRoIHdpbGwgYmUgc3RvcmVkCisgKiAgICAgICAgICAgICAgYXJnX2NvdW50ICAgICAgICAgICAtIElmIHRoZSBuYW1lcGF0aCBwb2ludHMgdG8gYSBjb250cm9sIG1ldGhvZAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgbWV0aG9kJ3MgYXJndW1lbnQgaXMgcmV0dXJuZWQgaGVyZS4KKyAqICAgICAgICAgICAgICBwb3NzaWJsZV9tZXRob2RfY2FsbCAtIFdoZXRoZXIgdGhlIG5hbWVwYXRoIGNhbiBwb3NzaWJseSBiZSB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgb2YgYSBtZXRob2QgY2FsbAorICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogR2V0IG5leHQgbmFtZSAoaWYgbWV0aG9kIGNhbGwsIHJldHVybiAjIG9mIHJlcXVpcmVkIGFyZ3MpLgorICogICAgICAgICAgICAgIE5hbWVzIGFyZSBsb29rZWQgdXAgaW4gdGhlIGludGVybmFsIG5hbWVzcGFjZSB0byBkZXRlcm1pbmUKKyAqICAgICAgICAgICAgICBpZiB0aGUgbmFtZSByZXByZXNlbnRzIGEgY29udHJvbCBtZXRob2QuICBJZiBhIG1ldGhvZAorICogICAgICAgICAgICAgIGlzIGZvdW5kLCB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cyB0byB0aGUgbWV0aG9kIGlzIHJldHVybmVkLgorICogICAgICAgICAgICAgIFRoaXMgaW5mb3JtYXRpb24gaXMgY3JpdGljYWwgZm9yIHBhcnNpbmcgdG8gY29udGludWUgY29ycmVjdGx5LgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2FjcGlfc3RhdHVzCithY3BpX3BzX2dldF9uZXh0X25hbWVwYXRoKHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUsCisJCQkgIHN0cnVjdCBhY3BpX3BhcnNlX3N0YXRlICpwYXJzZXJfc3RhdGUsCisJCQkgIHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICphcmcsIHU4IHBvc3NpYmxlX21ldGhvZF9jYWxsKQoreworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwljaGFyICpwYXRoOworCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpuYW1lX29wOworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm1ldGhvZF9kZXNjOworCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlOworCXU4ICpzdGFydCA9IHBhcnNlcl9zdGF0ZS0+YW1sOworCisJQUNQSV9GVU5DVElPTl9UUkFDRShwc19nZXRfbmV4dF9uYW1lcGF0aCk7CisKKwlwYXRoID0gYWNwaV9wc19nZXRfbmV4dF9uYW1lc3RyaW5nKHBhcnNlcl9zdGF0ZSk7CisJYWNwaV9wc19pbml0X29wKGFyZywgQU1MX0lOVF9OQU1FUEFUSF9PUCk7CisKKwkvKiBOdWxsIHBhdGggY2FzZSBpcyBhbGxvd2VkLCBqdXN0IGV4aXQgKi8KKworCWlmICghcGF0aCkgeworCQlhcmctPmNvbW1vbi52YWx1ZS5uYW1lID0gcGF0aDsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKKwl9CisKKwkvKgorCSAqIExvb2t1cCB0aGUgbmFtZSBpbiB0aGUgaW50ZXJuYWwgbmFtZXNwYWNlLCBzdGFydGluZyB3aXRoIHRoZSBjdXJyZW50CisJICogc2NvcGUuIFdlIGRvbid0IHdhbnQgdG8gYWRkIGFueXRoaW5nIG5ldyB0byB0aGUgbmFtZXNwYWNlIGhlcmUsCisJICogaG93ZXZlciwgc28gd2UgdXNlIE1PREVfRVhFQ1VURS4KKwkgKiBBbGxvdyBzZWFyY2hpbmcgb2YgdGhlIHBhcmVudCB0cmVlLCBidXQgZG9uJ3Qgb3BlbiBhIG5ldyBzY29wZSAtCisJICogd2UganVzdCB3YW50IHRvIGxvb2t1cCB0aGUgb2JqZWN0IChtdXN0IGJlIG1vZGUgRVhFQ1VURSB0byBwZXJmb3JtCisJICogdGhlIHVwc2VhcmNoKQorCSAqLworCXN0YXR1cyA9IGFjcGlfbnNfbG9va3VwKHdhbGtfc3RhdGUtPnNjb3BlX2luZm8sIHBhdGgsCisJCQkJQUNQSV9UWVBFX0FOWSwgQUNQSV9JTU9ERV9FWEVDVVRFLAorCQkJCUFDUElfTlNfU0VBUkNIX1BBUkVOVCB8IEFDUElfTlNfRE9OVF9PUEVOX1NDT1BFLAorCQkJCU5VTEwsICZub2RlKTsKKworCS8qCisJICogSWYgdGhpcyBuYW1lIGlzIGEgY29udHJvbCBtZXRob2QgaW52b2NhdGlvbiwgd2UgbXVzdAorCSAqIHNldHVwIHRoZSBtZXRob2QgY2FsbAorCSAqLworCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSAmJgorCSAgICBwb3NzaWJsZV9tZXRob2RfY2FsbCAmJiAobm9kZS0+dHlwZSA9PSBBQ1BJX1RZUEVfTUVUSE9EKSkgeworCQlpZiAod2Fsa19zdGF0ZS0+b3Bjb2RlID09IEFNTF9VTkxPQURfT1ApIHsKKwkJCS8qCisJCQkgKiBhY3BpX3BzX2dldF9uZXh0X25hbWVzdHJpbmcgaGFzIGluY3JlYXNlZCB0aGUgQU1MIHBvaW50ZXIsCisJCQkgKiBzbyB3ZSBuZWVkIHRvIHJlc3RvcmUgdGhlIHNhdmVkIEFNTCBwb2ludGVyIGZvciBtZXRob2QgY2FsbC4KKwkJCSAqLworCQkJd2Fsa19zdGF0ZS0+cGFyc2VyX3N0YXRlLmFtbCA9IHN0YXJ0OworCQkJd2Fsa19zdGF0ZS0+YXJnX2NvdW50ID0gMTsKKwkJCWFjcGlfcHNfaW5pdF9vcChhcmcsIEFNTF9JTlRfTUVUSE9EQ0FMTF9PUCk7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOworCQl9CisKKwkJLyogVGhpcyBuYW1lIGlzIGFjdHVhbGx5IGEgY29udHJvbCBtZXRob2QgaW52b2NhdGlvbiAqLworCisJCW1ldGhvZF9kZXNjID0gYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0KG5vZGUpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX1BBUlNFLAorCQkJCSAgIkNvbnRyb2wgTWV0aG9kIC0gJXAgRGVzYyAlcCBQYXRoPSVwXG4iLCBub2RlLAorCQkJCSAgbWV0aG9kX2Rlc2MsIHBhdGgpKTsKKworCQluYW1lX29wID0gYWNwaV9wc19hbGxvY19vcChBTUxfSU5UX05BTUVQQVRIX09QKTsKKwkJaWYgKCFuYW1lX29wKSB7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9fTUVNT1JZKTsKKwkJfQorCisJCS8qIENoYW5nZSBBcmcgaW50byBhIE1FVEhPRCBDQUxMIGFuZCBhdHRhY2ggbmFtZSB0byBpdCAqLworCisJCWFjcGlfcHNfaW5pdF9vcChhcmcsIEFNTF9JTlRfTUVUSE9EQ0FMTF9PUCk7CisJCW5hbWVfb3AtPmNvbW1vbi52YWx1ZS5uYW1lID0gcGF0aDsKKworCQkvKiBQb2ludCBNRVRIT0RDQUxML05BTUUgdG8gdGhlIE1FVEhPRCBOb2RlICovCisKKwkJbmFtZV9vcC0+Y29tbW9uLm5vZGUgPSBub2RlOworCQlhY3BpX3BzX2FwcGVuZF9hcmcoYXJnLCBuYW1lX29wKTsKKworCQlpZiAoIW1ldGhvZF9kZXNjKSB7CisJCQlBQ1BJX0VSUk9SKChBRV9JTkZPLAorCQkJCSAgICAiQ29udHJvbCBNZXRob2QgJXAgaGFzIG5vIGF0dGFjaGVkIG9iamVjdCIsCisJCQkJICAgIG5vZGUpKTsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfSU5URVJOQUwpOworCQl9CisKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9QQVJTRSwKKwkJCQkgICJDb250cm9sIE1ldGhvZCAtICVwIEFyZ3MgJVhcbiIsCisJCQkJICBub2RlLCBtZXRob2RfZGVzYy0+bWV0aG9kLnBhcmFtX2NvdW50KSk7CisKKwkJLyogR2V0IHRoZSBudW1iZXIgb2YgYXJndW1lbnRzIHRvIGV4cGVjdCAqLworCisJCXdhbGtfc3RhdGUtPmFyZ19jb3VudCA9IG1ldGhvZF9kZXNjLT5tZXRob2QucGFyYW1fY291bnQ7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CisJfQorCisJLyoKKwkgKiBTcGVjaWFsIGhhbmRsaW5nIGlmIHRoZSBuYW1lIHdhcyBub3QgZm91bmQgZHVyaW5nIHRoZSBsb29rdXAgLQorCSAqIHNvbWUgbm90X2ZvdW5kIGNhc2VzIGFyZSBhbGxvd2VkCisJICovCisJaWYgKHN0YXR1cyA9PSBBRV9OT1RfRk9VTkQpIHsKKworCQkvKiAxKSBub3RfZm91bmQgaXMgb2sgZHVyaW5nIGxvYWQgcGFzcyAxLzIgKGFsbG93IGZvcndhcmQgcmVmZXJlbmNlcykgKi8KKworCQlpZiAoKHdhbGtfc3RhdGUtPnBhcnNlX2ZsYWdzICYgQUNQSV9QQVJTRV9NT0RFX01BU0spICE9CisJCSAgICBBQ1BJX1BBUlNFX0VYRUNVVEUpIHsKKwkJCXN0YXR1cyA9IEFFX09LOworCQl9CisKKwkJLyogMikgbm90X2ZvdW5kIGR1cmluZyBhIGNvbmRfcmVmX29mKHgpIGlzIG9rIGJ5IGRlZmluaXRpb24gKi8KKworCQllbHNlIGlmICh3YWxrX3N0YXRlLT5vcC0+Y29tbW9uLmFtbF9vcGNvZGUgPT0KKwkJCSBBTUxfQ09ORF9SRUZfT0ZfT1ApIHsKKwkJCXN0YXR1cyA9IEFFX09LOworCQl9CisKKwkJLyoKKwkJICogMykgbm90X2ZvdW5kIHdoaWxlIGJ1aWxkaW5nIGEgUGFja2FnZSBpcyBvayBhdCB0aGlzIHBvaW50LCB3ZQorCQkgKiBtYXkgZmxhZyBhcyBhbiBlcnJvciBsYXRlciBpZiBzbGFjayBtb2RlIGlzIG5vdCBlbmFibGVkLgorCQkgKiAoU29tZSBBU0wgY29kZSBkZXBlbmRzIG9uIGFsbG93aW5nIHRoaXMgYmVoYXZpb3IpCisJCSAqLworCQllbHNlIGlmICgoYXJnLT5jb21tb24ucGFyZW50KSAmJgorCQkJICgoYXJnLT5jb21tb24ucGFyZW50LT5jb21tb24uYW1sX29wY29kZSA9PQorCQkJICAgQU1MX1BBQ0tBR0VfT1ApCisJCQkgIHx8IChhcmctPmNvbW1vbi5wYXJlbnQtPmNvbW1vbi5hbWxfb3Bjb2RlID09CisJCQkgICAgICBBTUxfVkFSX1BBQ0tBR0VfT1ApKSkgeworCQkJc3RhdHVzID0gQUVfT0s7CisJCX0KKwl9CisKKwkvKiBGaW5hbCBleGNlcHRpb24gY2hlY2sgKG1heSBoYXZlIGJlZW4gY2hhbmdlZCBmcm9tIGNvZGUgYWJvdmUpICovCisKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJQUNQSV9FUlJPUl9OQU1FU1BBQ0UocGF0aCwgc3RhdHVzKTsKKworCQlpZiAoKHdhbGtfc3RhdGUtPnBhcnNlX2ZsYWdzICYgQUNQSV9QQVJTRV9NT0RFX01BU0spID09CisJCSAgICBBQ1BJX1BBUlNFX0VYRUNVVEUpIHsKKworCQkJLyogUmVwb3J0IGEgY29udHJvbCBtZXRob2QgZXhlY3V0aW9uIGVycm9yICovCisKKwkJCXN0YXR1cyA9IGFjcGlfZHNfbWV0aG9kX2Vycm9yKHN0YXR1cywgd2Fsa19zdGF0ZSk7CisJCX0KKwl9CisKKwkvKiBTYXZlIHRoZSBuYW1lcGF0aCAqLworCisJYXJnLT5jb21tb24udmFsdWUubmFtZSA9IHBhdGg7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfcHNfZ2V0X25leHRfc2ltcGxlX2FyZworICoKKyAqIFBBUkFNRVRFUlM6ICBwYXJzZXJfc3RhdGUgICAgICAgIC0gQ3VycmVudCBwYXJzZXIgc3RhdGUgb2JqZWN0CisgKiAgICAgICAgICAgICAgYXJnX3R5cGUgICAgICAgICAgICAtIFRoZSBhcmd1bWVudCB0eXBlIChBTUxfKl9BUkcpCisgKiAgICAgICAgICAgICAgQXJnICAgICAgICAgICAgICAgICAtIFdoZXJlIHRoZSBhcmd1bWVudCBpcyByZXR1cm5lZAorICoKKyAqIFJFVFVSTjogICAgICBOb25lCisgKgorICogREVTQ1JJUFRJT046IEdldCB0aGUgbmV4dCBzaW1wbGUgYXJndW1lbnQgKGNvbnN0YW50LCBzdHJpbmcsIG9yIG5hbWVzdHJpbmcpCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZAorYWNwaV9wc19nZXRfbmV4dF9zaW1wbGVfYXJnKHN0cnVjdCBhY3BpX3BhcnNlX3N0YXRlICpwYXJzZXJfc3RhdGUsCisJCQkgICAgdTMyIGFyZ190eXBlLCB1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqYXJnKQoreworCXUzMiBsZW5ndGg7CisJdTE2IG9wY29kZTsKKwl1OCAqYW1sID0gcGFyc2VyX3N0YXRlLT5hbWw7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1UzMihwc19nZXRfbmV4dF9zaW1wbGVfYXJnLCBhcmdfdHlwZSk7CisKKwlzd2l0Y2ggKGFyZ190eXBlKSB7CisJY2FzZSBBUkdQX0JZVEVEQVRBOgorCisJCS8qIEdldCAxIGJ5dGUgZnJvbSB0aGUgQU1MIHN0cmVhbSAqLworCisJCW9wY29kZSA9IEFNTF9CWVRFX09QOworCQlhcmctPmNvbW1vbi52YWx1ZS5pbnRlZ2VyID0gKGFjcGlfaW50ZWdlcikgKiBhbWw7CisJCWxlbmd0aCA9IDE7CisJCWJyZWFrOworCisJY2FzZSBBUkdQX1dPUkREQVRBOgorCisJCS8qIEdldCAyIGJ5dGVzIGZyb20gdGhlIEFNTCBzdHJlYW0gKi8KKworCQlvcGNvZGUgPSBBTUxfV09SRF9PUDsKKwkJQUNQSV9NT1ZFXzE2X1RPXzY0KCZhcmctPmNvbW1vbi52YWx1ZS5pbnRlZ2VyLCBhbWwpOworCQlsZW5ndGggPSAyOworCQlicmVhazsKKworCWNhc2UgQVJHUF9EV09SRERBVEE6CisKKwkJLyogR2V0IDQgYnl0ZXMgZnJvbSB0aGUgQU1MIHN0cmVhbSAqLworCisJCW9wY29kZSA9IEFNTF9EV09SRF9PUDsKKwkJQUNQSV9NT1ZFXzMyX1RPXzY0KCZhcmctPmNvbW1vbi52YWx1ZS5pbnRlZ2VyLCBhbWwpOworCQlsZW5ndGggPSA0OworCQlicmVhazsKKworCWNhc2UgQVJHUF9RV09SRERBVEE6CisKKwkJLyogR2V0IDggYnl0ZXMgZnJvbSB0aGUgQU1MIHN0cmVhbSAqLworCisJCW9wY29kZSA9IEFNTF9RV09SRF9PUDsKKwkJQUNQSV9NT1ZFXzY0X1RPXzY0KCZhcmctPmNvbW1vbi52YWx1ZS5pbnRlZ2VyLCBhbWwpOworCQlsZW5ndGggPSA4OworCQlicmVhazsKKworCWNhc2UgQVJHUF9DSEFSTElTVDoKKworCQkvKiBHZXQgYSBwb2ludGVyIHRvIHRoZSBzdHJpbmcsIHBvaW50IHBhc3QgdGhlIHN0cmluZyAqLworCisJCW9wY29kZSA9IEFNTF9TVFJJTkdfT1A7CisJCWFyZy0+Y29tbW9uLnZhbHVlLnN0cmluZyA9IEFDUElfQ0FTVF9QVFIoY2hhciwgYW1sKTsKKworCQkvKiBGaW5kIHRoZSBudWxsIHRlcm1pbmF0b3IgKi8KKworCQlsZW5ndGggPSAwOworCQl3aGlsZSAoYW1sW2xlbmd0aF0pIHsKKwkJCWxlbmd0aCsrOworCQl9CisJCWxlbmd0aCsrOworCQlicmVhazsKKworCWNhc2UgQVJHUF9OQU1FOgorCWNhc2UgQVJHUF9OQU1FU1RSSU5HOgorCisJCWFjcGlfcHNfaW5pdF9vcChhcmcsIEFNTF9JTlRfTkFNRVBBVEhfT1ApOworCQlhcmctPmNvbW1vbi52YWx1ZS5uYW1lID0KKwkJICAgIGFjcGlfcHNfZ2V0X25leHRfbmFtZXN0cmluZyhwYXJzZXJfc3RhdGUpOworCQlyZXR1cm5fVk9JRDsKKworCWRlZmF1bHQ6CisKKwkJQUNQSV9FUlJPUigoQUVfSU5GTywgIkludmFsaWQgQXJnVHlwZSAlWCIsIGFyZ190eXBlKSk7CisJCXJldHVybl9WT0lEOworCX0KKworCWFjcGlfcHNfaW5pdF9vcChhcmcsIG9wY29kZSk7CisJcGFyc2VyX3N0YXRlLT5hbWwgKz0gbGVuZ3RoOworCXJldHVybl9WT0lEOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX3BzX2dldF9uZXh0X2ZpZWxkCisgKgorICogUEFSQU1FVEVSUzogIHBhcnNlcl9zdGF0ZSAgICAgICAgLSBDdXJyZW50IHBhcnNlciBzdGF0ZSBvYmplY3QKKyAqCisgKiBSRVRVUk46ICAgICAgQSBuZXdseSBhbGxvY2F0ZWQgRklFTEQgb3AKKyAqCisgKiBERVNDUklQVElPTjogR2V0IG5leHQgZmllbGQgKG5hbWVkX2ZpZWxkLCByZXNlcnZlZF9maWVsZCwgb3IgYWNjZXNzX2ZpZWxkKQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqYWNwaV9wc19nZXRfbmV4dF9maWVsZChzdHJ1Y3QgYWNwaV9wYXJzZV9zdGF0ZQorCQkJCQkJICAgICAgICpwYXJzZXJfc3RhdGUpCit7CisJdTMyIGFtbF9vZmZzZXQgPSAodTMyKQorCSAgICBBQ1BJX1BUUl9ESUZGKHBhcnNlcl9zdGF0ZS0+YW1sLAorCQkJICBwYXJzZXJfc3RhdGUtPmFtbF9zdGFydCk7CisJdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKmZpZWxkOworCXUxNiBvcGNvZGU7CisJdTMyIG5hbWU7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKHBzX2dldF9uZXh0X2ZpZWxkKTsKKworCS8qIERldGVybWluZSBmaWVsZCB0eXBlICovCisKKwlzd2l0Y2ggKEFDUElfR0VUOChwYXJzZXJfc3RhdGUtPmFtbCkpIHsKKwlkZWZhdWx0OgorCisJCW9wY29kZSA9IEFNTF9JTlRfTkFNRURGSUVMRF9PUDsKKwkJYnJlYWs7CisKKwljYXNlIDB4MDA6CisKKwkJb3Bjb2RlID0gQU1MX0lOVF9SRVNFUlZFREZJRUxEX09QOworCQlwYXJzZXJfc3RhdGUtPmFtbCsrOworCQlicmVhazsKKworCWNhc2UgMHgwMToKKworCQlvcGNvZGUgPSBBTUxfSU5UX0FDQ0VTU0ZJRUxEX09QOworCQlwYXJzZXJfc3RhdGUtPmFtbCsrOworCQlicmVhazsKKwl9CisKKwkvKiBBbGxvY2F0ZSBhIG5ldyBmaWVsZCBvcCAqLworCisJZmllbGQgPSBhY3BpX3BzX2FsbG9jX29wKG9wY29kZSk7CisJaWYgKCFmaWVsZCkgeworCQlyZXR1cm5fUFRSKE5VTEwpOworCX0KKworCWZpZWxkLT5jb21tb24uYW1sX29mZnNldCA9IGFtbF9vZmZzZXQ7CisKKwkvKiBEZWNvZGUgdGhlIGZpZWxkIHR5cGUgKi8KKworCXN3aXRjaCAob3Bjb2RlKSB7CisJY2FzZSBBTUxfSU5UX05BTUVERklFTERfT1A6CisKKwkJLyogR2V0IHRoZSA0LWNoYXJhY3RlciBuYW1lICovCisKKwkJQUNQSV9NT1ZFXzMyX1RPXzMyKCZuYW1lLCBwYXJzZXJfc3RhdGUtPmFtbCk7CisJCWFjcGlfcHNfc2V0X25hbWUoZmllbGQsIG5hbWUpOworCQlwYXJzZXJfc3RhdGUtPmFtbCArPSBBQ1BJX05BTUVfU0laRTsKKworCQkvKiBHZXQgdGhlIGxlbmd0aCB3aGljaCBpcyBlbmNvZGVkIGFzIGEgcGFja2FnZSBsZW5ndGggKi8KKworCQlmaWVsZC0+Y29tbW9uLnZhbHVlLnNpemUgPQorCQkgICAgYWNwaV9wc19nZXRfbmV4dF9wYWNrYWdlX2xlbmd0aChwYXJzZXJfc3RhdGUpOworCQlicmVhazsKKworCWNhc2UgQU1MX0lOVF9SRVNFUlZFREZJRUxEX09QOgorCisJCS8qIEdldCB0aGUgbGVuZ3RoIHdoaWNoIGlzIGVuY29kZWQgYXMgYSBwYWNrYWdlIGxlbmd0aCAqLworCisJCWZpZWxkLT5jb21tb24udmFsdWUuc2l6ZSA9CisJCSAgICBhY3BpX3BzX2dldF9uZXh0X3BhY2thZ2VfbGVuZ3RoKHBhcnNlcl9zdGF0ZSk7CisJCWJyZWFrOworCisJY2FzZSBBTUxfSU5UX0FDQ0VTU0ZJRUxEX09QOgorCisJCS8qCisJCSAqIEdldCBhY2Nlc3NfdHlwZSBhbmQgYWNjZXNzX2F0dHJpYiBhbmQgbWVyZ2UgaW50byB0aGUgZmllbGQgT3AKKwkJICogYWNjZXNzX3R5cGUgaXMgZmlyc3Qgb3BlcmFuZCwgYWNjZXNzX2F0dHJpYnV0ZSBpcyBzZWNvbmQKKwkJICovCisJCWZpZWxkLT5jb21tb24udmFsdWUuaW50ZWdlciA9CisJCSAgICAoKCh1MzIpIEFDUElfR0VUOChwYXJzZXJfc3RhdGUtPmFtbCkgPDwgOCkpOworCQlwYXJzZXJfc3RhdGUtPmFtbCsrOworCQlmaWVsZC0+Y29tbW9uLnZhbHVlLmludGVnZXIgfD0gQUNQSV9HRVQ4KHBhcnNlcl9zdGF0ZS0+YW1sKTsKKwkJcGFyc2VyX3N0YXRlLT5hbWwrKzsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCisJCS8qIE9wY29kZSB3YXMgc2V0IGluIHByZXZpb3VzIHN3aXRjaCAqLworCQlicmVhazsKKwl9CisKKwlyZXR1cm5fUFRSKGZpZWxkKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9wc19nZXRfbmV4dF9hcmcKKyAqCisgKiBQQVJBTUVURVJTOiAgd2Fsa19zdGF0ZSAgICAgICAgICAtIEN1cnJlbnQgc3RhdGUKKyAqICAgICAgICAgICAgICBwYXJzZXJfc3RhdGUgICAgICAgIC0gQ3VycmVudCBwYXJzZXIgc3RhdGUgb2JqZWN0CisgKiAgICAgICAgICAgICAgYXJnX3R5cGUgICAgICAgICAgICAtIFRoZSBhcmd1bWVudCB0eXBlIChBTUxfKl9BUkcpCisgKiAgICAgICAgICAgICAgcmV0dXJuX2FyZyAgICAgICAgICAtIFdoZXJlIHRoZSBuZXh0IGFyZyBpcyByZXR1cm5lZAorICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMsIGFuZCBhbiBvcCBvYmplY3QgY29udGFpbmluZyB0aGUgbmV4dCBhcmd1bWVudC4KKyAqCisgKiBERVNDUklQVElPTjogR2V0IG5leHQgYXJndW1lbnQgKGluY2x1ZGluZyBjb21wbGV4IGxpc3QgYXJndW1lbnRzIHRoYXQgcmVxdWlyZQorICogICAgICAgICAgICAgIHB1c2hpbmcgdGhlIHBhcnNlciBzdGFjaykKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCithY3BpX3N0YXR1cworYWNwaV9wc19nZXRfbmV4dF9hcmcoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSwKKwkJICAgICBzdHJ1Y3QgYWNwaV9wYXJzZV9zdGF0ZSAqcGFyc2VyX3N0YXRlLAorCQkgICAgIHUzMiBhcmdfdHlwZSwgdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKipyZXR1cm5fYXJnKQoreworCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICphcmcgPSBOVUxMOworCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpwcmV2ID0gTlVMTDsKKwl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqZmllbGQ7CisJdTMyIHN1Ym9wOworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOworCisJQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIocHNfZ2V0X25leHRfYXJnLCBwYXJzZXJfc3RhdGUpOworCisJc3dpdGNoIChhcmdfdHlwZSkgeworCWNhc2UgQVJHUF9CWVRFREFUQToKKwljYXNlIEFSR1BfV09SRERBVEE6CisJY2FzZSBBUkdQX0RXT1JEREFUQToKKwljYXNlIEFSR1BfQ0hBUkxJU1Q6CisJY2FzZSBBUkdQX05BTUU6CisJY2FzZSBBUkdQX05BTUVTVFJJTkc6CisKKwkJLyogQ29uc3RhbnRzLCBzdHJpbmdzLCBhbmQgbmFtZXN0cmluZ3MgYXJlIGFsbCB0aGUgc2FtZSBzaXplICovCisKKwkJYXJnID0gYWNwaV9wc19hbGxvY19vcChBTUxfQllURV9PUCk7CisJCWlmICghYXJnKSB7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9fTUVNT1JZKTsKKwkJfQorCQlhY3BpX3BzX2dldF9uZXh0X3NpbXBsZV9hcmcocGFyc2VyX3N0YXRlLCBhcmdfdHlwZSwgYXJnKTsKKwkJYnJlYWs7CisKKwljYXNlIEFSR1BfUEtHTEVOR1RIOgorCisJCS8qIFBhY2thZ2UgbGVuZ3RoLCBub3RoaW5nIHJldHVybmVkICovCisKKwkJcGFyc2VyX3N0YXRlLT5wa2dfZW5kID0KKwkJICAgIGFjcGlfcHNfZ2V0X25leHRfcGFja2FnZV9lbmQocGFyc2VyX3N0YXRlKTsKKwkJYnJlYWs7CisKKwljYXNlIEFSR1BfRklFTERMSVNUOgorCisJCWlmIChwYXJzZXJfc3RhdGUtPmFtbCA8IHBhcnNlcl9zdGF0ZS0+cGtnX2VuZCkgeworCisJCQkvKiBOb24tZW1wdHkgbGlzdCAqLworCisJCQl3aGlsZSAocGFyc2VyX3N0YXRlLT5hbWwgPCBwYXJzZXJfc3RhdGUtPnBrZ19lbmQpIHsKKwkJCQlmaWVsZCA9IGFjcGlfcHNfZ2V0X25leHRfZmllbGQocGFyc2VyX3N0YXRlKTsKKwkJCQlpZiAoIWZpZWxkKSB7CisJCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT19NRU1PUlkpOworCQkJCX0KKworCQkJCWlmIChwcmV2KSB7CisJCQkJCXByZXYtPmNvbW1vbi5uZXh0ID0gZmllbGQ7CisJCQkJfSBlbHNlIHsKKwkJCQkJYXJnID0gZmllbGQ7CisJCQkJfQorCQkJCXByZXYgPSBmaWVsZDsKKwkJCX0KKworCQkJLyogU2tpcCB0byBFbmQgb2YgYnl0ZSBkYXRhICovCisKKwkJCXBhcnNlcl9zdGF0ZS0+YW1sID0gcGFyc2VyX3N0YXRlLT5wa2dfZW5kOworCQl9CisJCWJyZWFrOworCisJY2FzZSBBUkdQX0JZVEVMSVNUOgorCisJCWlmIChwYXJzZXJfc3RhdGUtPmFtbCA8IHBhcnNlcl9zdGF0ZS0+cGtnX2VuZCkgeworCisJCQkvKiBOb24tZW1wdHkgbGlzdCAqLworCisJCQlhcmcgPSBhY3BpX3BzX2FsbG9jX29wKEFNTF9JTlRfQllURUxJU1RfT1ApOworCQkJaWYgKCFhcmcpIHsKKwkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9fTUVNT1JZKTsKKwkJCX0KKworCQkJLyogRmlsbCBpbiBieXRlbGlzdCBkYXRhICovCisKKwkJCWFyZy0+Y29tbW9uLnZhbHVlLnNpemUgPSAodTMyKQorCQkJICAgIEFDUElfUFRSX0RJRkYocGFyc2VyX3N0YXRlLT5wa2dfZW5kLAorCQkJCQkgIHBhcnNlcl9zdGF0ZS0+YW1sKTsKKwkJCWFyZy0+bmFtZWQuZGF0YSA9IHBhcnNlcl9zdGF0ZS0+YW1sOworCisJCQkvKiBTa2lwIHRvIEVuZCBvZiBieXRlIGRhdGEgKi8KKworCQkJcGFyc2VyX3N0YXRlLT5hbWwgPSBwYXJzZXJfc3RhdGUtPnBrZ19lbmQ7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIEFSR1BfVEFSR0VUOgorCWNhc2UgQVJHUF9TVVBFUk5BTUU6CisJY2FzZSBBUkdQX1NJTVBMRU5BTUU6CisKKwkJc3Vib3AgPSBhY3BpX3BzX3BlZWtfb3Bjb2RlKHBhcnNlcl9zdGF0ZSk7CisJCWlmIChzdWJvcCA9PSAwIHx8CisJCSAgICBhY3BpX3BzX2lzX2xlYWRpbmdfY2hhcihzdWJvcCkgfHwKKwkJICAgIGFjcGlfcHNfaXNfcHJlZml4X2NoYXIoc3Vib3ApKSB7CisKKwkJCS8qIG51bGxfbmFtZSBvciBuYW1lX3N0cmluZyAqLworCisJCQlhcmcgPSBhY3BpX3BzX2FsbG9jX29wKEFNTF9JTlRfTkFNRVBBVEhfT1ApOworCQkJaWYgKCFhcmcpIHsKKwkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9fTUVNT1JZKTsKKwkJCX0KKworCQkJLyogVG8gc3VwcG9ydCBzdXBlcl9uYW1lIGFyZyBvZiBVbmxvYWQgKi8KKworCQkJaWYgKHdhbGtfc3RhdGUtPm9wY29kZSA9PSBBTUxfVU5MT0FEX09QKSB7CisJCQkJc3RhdHVzID0KKwkJCQkgICAgYWNwaV9wc19nZXRfbmV4dF9uYW1lcGF0aCh3YWxrX3N0YXRlLAorCQkJCQkJCSAgICAgIHBhcnNlcl9zdGF0ZSwgYXJnLAorCQkJCQkJCSAgICAgIDEpOworCisJCQkJLyoKKwkJCQkgKiBJZiB0aGUgc3VwZXJfbmFtZSBhcmcgb2YgVW5sb2FkIGlzIGEgbWV0aG9kIGNhbGwsCisJCQkJICogd2UgaGF2ZSByZXN0b3JlZCB0aGUgQU1MIHBvaW50ZXIsIGp1c3QgZnJlZSB0aGlzIEFyZworCQkJCSAqLworCQkJCWlmIChhcmctPmNvbW1vbi5hbWxfb3Bjb2RlID09CisJCQkJICAgIEFNTF9JTlRfTUVUSE9EQ0FMTF9PUCkgeworCQkJCQlhY3BpX3BzX2ZyZWVfb3AoYXJnKTsKKwkJCQkJYXJnID0gTlVMTDsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCXN0YXR1cyA9CisJCQkJICAgIGFjcGlfcHNfZ2V0X25leHRfbmFtZXBhdGgod2Fsa19zdGF0ZSwKKwkJCQkJCQkgICAgICBwYXJzZXJfc3RhdGUsIGFyZywKKwkJCQkJCQkgICAgICAwKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8qIFNpbmdsZSBjb21wbGV4IGFyZ3VtZW50LCBub3RoaW5nIHJldHVybmVkICovCisKKwkJCXdhbGtfc3RhdGUtPmFyZ19jb3VudCA9IDE7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIEFSR1BfREFUQU9CSjoKKwljYXNlIEFSR1BfVEVSTUFSRzoKKworCQkvKiBTaW5nbGUgY29tcGxleCBhcmd1bWVudCwgbm90aGluZyByZXR1cm5lZCAqLworCisJCXdhbGtfc3RhdGUtPmFyZ19jb3VudCA9IDE7CisJCWJyZWFrOworCisJY2FzZSBBUkdQX0RBVEFPQkpMSVNUOgorCWNhc2UgQVJHUF9URVJNTElTVDoKKwljYXNlIEFSR1BfT0JKTElTVDoKKworCQlpZiAocGFyc2VyX3N0YXRlLT5hbWwgPCBwYXJzZXJfc3RhdGUtPnBrZ19lbmQpIHsKKworCQkJLyogTm9uLWVtcHR5IGxpc3Qgb2YgdmFyaWFibGUgYXJndW1lbnRzLCBub3RoaW5nIHJldHVybmVkICovCisKKwkJCXdhbGtfc3RhdGUtPmFyZ19jb3VudCA9IEFDUElfVkFSX0FSR1M7CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCisJCUFDUElfRVJST1IoKEFFX0lORk8sICJJbnZhbGlkIEFyZ1R5cGU6ICVYIiwgYXJnX3R5cGUpKTsKKwkJc3RhdHVzID0gQUVfQU1MX09QRVJBTkRfVFlQRTsKKwkJYnJlYWs7CisJfQorCisJKnJldHVybl9hcmcgPSBhcmc7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL3BzbG9vcC5jIGIvZHJpdmVycy9hY3BpL2FjcGljYS9wc2xvb3AuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNWY2Y2UxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS9wc2xvb3AuYwpAQCAtMCwwICsxLDEwODggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBNb2R1bGUgTmFtZTogcHNsb29wIC0gTWFpbiBBTUwgcGFyc2UgbG9vcAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDgsIEludGVsIENvcnAuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCisgKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSBhdCBtaW5pbXVtIGEgZGlzY2xhaW1lcgorICogICAgc3Vic3RhbnRpYWxseSBzaW1pbGFyIHRvIHRoZSAiTk8gV0FSUkFOVFkiIGRpc2NsYWltZXIgYmVsb3cKKyAqICAgICgiRGlzY2xhaW1lciIpIGFuZCBhbnkgcmVkaXN0cmlidXRpb24gbXVzdCBiZSBjb25kaXRpb25lZCB1cG9uCisgKiAgICBpbmNsdWRpbmcgYSBzdWJzdGFudGlhbGx5IHNpbWlsYXIgRGlzY2xhaW1lciByZXF1aXJlbWVudCBmb3IgZnVydGhlcgorICogICAgYmluYXJ5IHJlZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzCisgKiAgICBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIE5PIFdBUlJBTlRZCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORworICogSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCisgKi8KKworLyoKKyAqIFBhcnNlIHRoZSBBTUwgYW5kIGJ1aWxkIGFuIG9wZXJhdGlvbiB0cmVlIGFzIG1vc3QgaW50ZXJwcmV0ZXJzLCAoc3VjaCBhcworICogUGVybCkgZG8uIFBhcnNpbmcgaXMgZG9uZSBieSBoYW5kIHJhdGhlciB0aGFuIHdpdGggYSBZQUNDIGdlbmVyYXRlZCBwYXJzZXIKKyAqIHRvIHRpZ2h0bHkgY29uc3RyYWluIHN0YWNrIGFuZCBkeW5hbWljIG1lbW9yeSB1c2FnZS4gUGFyc2luZyBpcyBrZXB0CisgKiBmbGV4aWJsZSBhbmQgdGhlIGNvZGUgZmFpcmx5IGNvbXBhY3QgYnkgcGFyc2luZyBiYXNlZCBvbiBhIGxpc3Qgb2YgQU1MCisgKiBvcGNvZGUgdGVtcGxhdGVzIGluIGFtbF9vcF9pbmZvW10uCisgKi8KKworI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgorI2luY2x1ZGUgImFjY29tbW9uLmgiCisjaW5jbHVkZSAiYWNwYXJzZXIuaCIKKyNpbmNsdWRlICJhY2Rpc3BhdC5oIgorI2luY2x1ZGUgImFtbGNvZGUuaCIKKworI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfUEFSU0VSCitBQ1BJX01PRFVMRV9OQU1FKCJwc2xvb3AiKQorCitzdGF0aWMgdTMyIGFjcGlfZ2JsX2RlcHRoID0gMDsKKworLyogTG9jYWwgcHJvdG90eXBlcyAqLworCitzdGF0aWMgYWNwaV9zdGF0dXMgYWNwaV9wc19nZXRfYW1sX29wY29kZShzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKTsKKworc3RhdGljIGFjcGlfc3RhdHVzCithY3BpX3BzX2J1aWxkX25hbWVkX29wKHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUsCisJCSAgICAgICB1OCAqIGFtbF9vcF9zdGFydCwKKwkJICAgICAgIHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICp1bm5hbWVkX29wLAorCQkgICAgICAgdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKipvcCk7CisKK3N0YXRpYyBhY3BpX3N0YXR1cworYWNwaV9wc19jcmVhdGVfb3Aoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSwKKwkJICB1OCAqIGFtbF9vcF9zdGFydCwgdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKipuZXdfb3ApOworCitzdGF0aWMgYWNwaV9zdGF0dXMKK2FjcGlfcHNfZ2V0X2FyZ3VtZW50cyhzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlLAorCQkgICAgICB1OCAqIGFtbF9vcF9zdGFydCwgdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKm9wKTsKKworc3RhdGljIGFjcGlfc3RhdHVzCithY3BpX3BzX2NvbXBsZXRlX29wKHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUsCisJCSAgICB1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqKm9wLCBhY3BpX3N0YXR1cyBzdGF0dXMpOworCitzdGF0aWMgYWNwaV9zdGF0dXMKK2FjcGlfcHNfY29tcGxldGVfZmluYWxfb3Aoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSwKKwkJCSAgdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKm9wLCBhY3BpX3N0YXR1cyBzdGF0dXMpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX3BzX2dldF9hbWxfb3Bjb2RlCisgKgorICogUEFSQU1FVEVSUzogIHdhbGtfc3RhdGUgICAgICAgICAgLSBDdXJyZW50IHN0YXRlCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBFeHRyYWN0IHRoZSBuZXh0IEFNTCBvcGNvZGUgZnJvbSB0aGUgaW5wdXQgc3RyZWFtLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBhY3BpX3N0YXR1cyBhY3BpX3BzX2dldF9hbWxfb3Bjb2RlKHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUpCit7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUihwc19nZXRfYW1sX29wY29kZSwgd2Fsa19zdGF0ZSk7CisKKwl3YWxrX3N0YXRlLT5hbWxfb2Zmc2V0ID0KKwkgICAgKHUzMikgQUNQSV9QVFJfRElGRih3YWxrX3N0YXRlLT5wYXJzZXJfc3RhdGUuYW1sLAorCQkJCXdhbGtfc3RhdGUtPnBhcnNlcl9zdGF0ZS5hbWxfc3RhcnQpOworCXdhbGtfc3RhdGUtPm9wY29kZSA9IGFjcGlfcHNfcGVla19vcGNvZGUoJih3YWxrX3N0YXRlLT5wYXJzZXJfc3RhdGUpKTsKKworCS8qCisJICogRmlyc3QgY3V0IHRvIGRldGVybWluZSB3aGF0IHdlIGhhdmUgZm91bmQ6CisJICogMSkgQSB2YWxpZCBBTUwgb3Bjb2RlCisJICogMikgQSBuYW1lIHN0cmluZworCSAqIDMpIEFuIHVua25vd24vaW52YWxpZCBvcGNvZGUKKwkgKi8KKwl3YWxrX3N0YXRlLT5vcF9pbmZvID0gYWNwaV9wc19nZXRfb3Bjb2RlX2luZm8od2Fsa19zdGF0ZS0+b3Bjb2RlKTsKKworCXN3aXRjaCAod2Fsa19zdGF0ZS0+b3BfaW5mby0+Y2xhc3MpIHsKKwljYXNlIEFNTF9DTEFTU19BU0NJSToKKwljYXNlIEFNTF9DTEFTU19QUkVGSVg6CisJCS8qCisJCSAqIFN0YXJ0cyB3aXRoIGEgdmFsaWQgcHJlZml4IG9yIEFTQ0lJIGNoYXIsIHRoaXMgaXMgYSBuYW1lCisJCSAqIHN0cmluZy4gQ29udmVydCB0aGUgYmFyZSBuYW1lIHN0cmluZyB0byBhIG5hbWVwYXRoLgorCQkgKi8KKwkJd2Fsa19zdGF0ZS0+b3Bjb2RlID0gQU1MX0lOVF9OQU1FUEFUSF9PUDsKKwkJd2Fsa19zdGF0ZS0+YXJnX3R5cGVzID0gQVJHUF9OQU1FU1RSSU5HOworCQlicmVhazsKKworCWNhc2UgQU1MX0NMQVNTX1VOS05PV046CisKKwkJLyogVGhlIG9wY29kZSBpcyB1bnJlY29nbml6ZWQuIEp1c3Qgc2tpcCB1bmtub3duIG9wY29kZXMgKi8KKworCQlBQ1BJX0VSUk9SKChBRV9JTkZPLAorCQkJICAgICJGb3VuZCB1bmtub3duIG9wY29kZSAlWCBhdCBBTUwgYWRkcmVzcyAlcCBvZmZzZXQgJVgsIGlnbm9yaW5nIiwKKwkJCSAgICB3YWxrX3N0YXRlLT5vcGNvZGUsIHdhbGtfc3RhdGUtPnBhcnNlcl9zdGF0ZS5hbWwsCisJCQkgICAgd2Fsa19zdGF0ZS0+YW1sX29mZnNldCkpOworCisJCUFDUElfRFVNUF9CVUZGRVIod2Fsa19zdGF0ZS0+cGFyc2VyX3N0YXRlLmFtbCwgMTI4KTsKKworCQkvKiBBc3N1bWUgb25lLWJ5dGUgYmFkIG9wY29kZSAqLworCisJCXdhbGtfc3RhdGUtPnBhcnNlcl9zdGF0ZS5hbWwrKzsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0NUUkxfUEFSU0VfQ09OVElOVUUpOworCisJZGVmYXVsdDoKKworCQkvKiBGb3VuZCBvcGNvZGUgaW5mbywgdGhpcyBpcyBhIG5vcm1hbCBvcGNvZGUgKi8KKworCQl3YWxrX3N0YXRlLT5wYXJzZXJfc3RhdGUuYW1sICs9CisJCSAgICBhY3BpX3BzX2dldF9vcGNvZGVfc2l6ZSh3YWxrX3N0YXRlLT5vcGNvZGUpOworCQl3YWxrX3N0YXRlLT5hcmdfdHlwZXMgPSB3YWxrX3N0YXRlLT5vcF9pbmZvLT5wYXJzZV9hcmdzOworCQlicmVhazsKKwl9CisKKwlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX3BzX2J1aWxkX25hbWVkX29wCisgKgorICogUEFSQU1FVEVSUzogIHdhbGtfc3RhdGUgICAgICAgICAgLSBDdXJyZW50IHN0YXRlCisgKiAgICAgICAgICAgICAgYW1sX29wX3N0YXJ0ICAgICAgICAtIEJlZ2luIG9mIG5hbWVkIE9wIGluIEFNTAorICogICAgICAgICAgICAgIHVubmFtZWRfb3AgICAgICAgICAgLSBFYXJseSBPcCAobm90IGEgbmFtZWQgT3ApCisgKiAgICAgICAgICAgICAgT3AgICAgICAgICAgICAgICAgICAtIFJldHVybmVkIE9wCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBQYXJzZSBhIG5hbWVkIE9wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGFjcGlfc3RhdHVzCithY3BpX3BzX2J1aWxkX25hbWVkX29wKHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUsCisJCSAgICAgICB1OCAqIGFtbF9vcF9zdGFydCwKKwkJICAgICAgIHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICp1bm5hbWVkX29wLAorCQkgICAgICAgdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKipvcCkKK3sKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKKwl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqYXJnID0gTlVMTDsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKHBzX2J1aWxkX25hbWVkX29wLCB3YWxrX3N0YXRlKTsKKworCXVubmFtZWRfb3AtPmNvbW1vbi52YWx1ZS5hcmcgPSBOVUxMOworCXVubmFtZWRfb3AtPmNvbW1vbi5hcmdfbGlzdF9sZW5ndGggPSAwOworCXVubmFtZWRfb3AtPmNvbW1vbi5hbWxfb3Bjb2RlID0gd2Fsa19zdGF0ZS0+b3Bjb2RlOworCisJLyoKKwkgKiBHZXQgYW5kIGFwcGVuZCBhcmd1bWVudHMgdW50aWwgd2UgZmluZCB0aGUgbm9kZSB0aGF0IGNvbnRhaW5zCisJICogdGhlIG5hbWUgKHRoZSB0eXBlIEFSR1BfTkFNRSkuCisJICovCisJd2hpbGUgKEdFVF9DVVJSRU5UX0FSR19UWVBFKHdhbGtfc3RhdGUtPmFyZ190eXBlcykgJiYKKwkgICAgICAgKEdFVF9DVVJSRU5UX0FSR19UWVBFKHdhbGtfc3RhdGUtPmFyZ190eXBlcykgIT0gQVJHUF9OQU1FKSkgeworCQlzdGF0dXMgPQorCQkgICAgYWNwaV9wc19nZXRfbmV4dF9hcmcod2Fsa19zdGF0ZSwKKwkJCQkJICYod2Fsa19zdGF0ZS0+cGFyc2VyX3N0YXRlKSwKKwkJCQkJIEdFVF9DVVJSRU5UX0FSR19UWVBFKHdhbGtfc3RhdGUtPgorCQkJCQkJCSAgICAgIGFyZ190eXBlcyksICZhcmcpOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworCQl9CisKKwkJYWNwaV9wc19hcHBlbmRfYXJnKHVubmFtZWRfb3AsIGFyZyk7CisJCUlOQ1JFTUVOVF9BUkdfTElTVCh3YWxrX3N0YXRlLT5hcmdfdHlwZXMpOworCX0KKworCS8qCisJICogTWFrZSBzdXJlIHRoYXQgd2UgZm91bmQgYSBOQU1FIGFuZCBkaWRuJ3QgcnVuIG91dCBvZiBhcmd1bWVudHMKKwkgKi8KKwlpZiAoIUdFVF9DVVJSRU5UX0FSR19UWVBFKHdhbGtfc3RhdGUtPmFyZ190eXBlcykpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9OT19PUEVSQU5EKTsKKwl9CisKKwkvKiBXZSBrbm93IHRoYXQgdGhpcyBhcmcgaXMgYSBuYW1lLCBtb3ZlIHRvIG5leHQgYXJnICovCisKKwlJTkNSRU1FTlRfQVJHX0xJU1Qod2Fsa19zdGF0ZS0+YXJnX3R5cGVzKTsKKworCS8qCisJICogRmluZCB0aGUgb2JqZWN0LiBUaGlzIHdpbGwgZWl0aGVyIGluc2VydCB0aGUgb2JqZWN0IGludG8KKwkgKiB0aGUgbmFtZXNwYWNlIG9yIHNpbXBseSBsb29rIGl0IHVwCisJICovCisJd2Fsa19zdGF0ZS0+b3AgPSBOVUxMOworCisJc3RhdHVzID0gd2Fsa19zdGF0ZS0+ZGVzY2VuZGluZ19jYWxsYmFjayh3YWxrX3N0YXRlLCBvcCk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCUFDUElfRVhDRVBUSU9OKChBRV9JTkZPLCBzdGF0dXMsICJEdXJpbmcgbmFtZSBsb29rdXAvY2F0YWxvZyIpKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CisJfQorCisJaWYgKCEqb3ApIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0NUUkxfUEFSU0VfQ09OVElOVUUpOworCX0KKworCXN0YXR1cyA9IGFjcGlfcHNfbmV4dF9wYXJzZV9zdGF0ZSh3YWxrX3N0YXRlLCAqb3AsIHN0YXR1cyk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCWlmIChzdGF0dXMgPT0gQUVfQ1RSTF9QRU5ESU5HKSB7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQ1RSTF9QQVJTRV9QRU5ESU5HKTsKKwkJfQorCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKKwl9CisKKwlhY3BpX3BzX2FwcGVuZF9hcmcoKm9wLCB1bm5hbWVkX29wLT5jb21tb24udmFsdWUuYXJnKTsKKwlhY3BpX2dibF9kZXB0aCsrOworCisJaWYgKCgqb3ApLT5jb21tb24uYW1sX29wY29kZSA9PSBBTUxfUkVHSU9OX09QIHx8CisJICAgICgqb3ApLT5jb21tb24uYW1sX29wY29kZSA9PSBBTUxfREFUQV9SRUdJT05fT1ApIHsKKwkJLyoKKwkJICogRGVmZXIgZmluYWwgcGFyc2luZyBvZiBhbiBvcGVyYXRpb25fcmVnaW9uIGJvZHksIGJlY2F1c2Ugd2UgZG9uJ3QKKwkJICogaGF2ZSBlbm91Z2ggaW5mbyBpbiB0aGUgZmlyc3QgcGFzcyB0byBwYXJzZSBpdCBjb3JyZWN0bHkgKGkuZS4sCisJCSAqIHRoZXJlIG1heSBiZSBtZXRob2QgY2FsbHMgd2l0aGluIHRoZSB0ZXJtX2FyZyBlbGVtZW50cyBvZiB0aGUgYm9keS4pCisJCSAqCisJCSAqIEhvd2V2ZXIsIHdlIG11c3QgY29udGludWUgcGFyc2luZyBiZWNhdXNlIHRoZSBvcHJlZ2lvbiBpcyBub3QgYQorCQkgKiBzdGFuZGFsb25lIHBhY2thZ2UgLS0gd2UgZG9uJ3Qga25vdyB3aGVyZSB0aGUgZW5kIGlzIGF0IHRoaXMgcG9pbnQuCisJCSAqCisJCSAqIChMZW5ndGggaXMgdW5rbm93biB1bnRpbCBwYXJzZSBvZiB0aGUgYm9keSBjb21wbGV0ZSkKKwkJICovCisJCSgqb3ApLT5uYW1lZC5kYXRhID0gYW1sX29wX3N0YXJ0OworCQkoKm9wKS0+bmFtZWQubGVuZ3RoID0gMDsKKwl9CisKKwlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX3BzX2NyZWF0ZV9vcAorICoKKyAqIFBBUkFNRVRFUlM6ICB3YWxrX3N0YXRlICAgICAgICAgIC0gQ3VycmVudCBzdGF0ZQorICogICAgICAgICAgICAgIGFtbF9vcF9zdGFydCAgICAgICAgLSBPcCBzdGFydCBpbiBBTUwKKyAqICAgICAgICAgICAgICBuZXdfb3AgICAgICAgICAgICAgIC0gUmV0dXJuZWQgT3AKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IEdldCBPcCBmcm9tIEFNTAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBhY3BpX3N0YXR1cworYWNwaV9wc19jcmVhdGVfb3Aoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSwKKwkJICB1OCAqIGFtbF9vcF9zdGFydCwgdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKipuZXdfb3ApCit7CisJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CisJdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKm9wOworCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpuYW1lZF9vcCA9IE5VTEw7CisJdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKnBhcmVudF9zY29wZTsKKwl1OCBhcmd1bWVudF9jb3VudDsKKwljb25zdCBzdHJ1Y3QgYWNwaV9vcGNvZGVfaW5mbyAqb3BfaW5mbzsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKHBzX2NyZWF0ZV9vcCwgd2Fsa19zdGF0ZSk7CisKKwlzdGF0dXMgPSBhY3BpX3BzX2dldF9hbWxfb3Bjb2RlKHdhbGtfc3RhdGUpOworCWlmIChzdGF0dXMgPT0gQUVfQ1RSTF9QQVJTRV9DT05USU5VRSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQ1RSTF9QQVJTRV9DT05USU5VRSk7CisJfQorCisJLyogQ3JlYXRlIE9wIHN0cnVjdHVyZSBhbmQgYXBwZW5kIHRvIHBhcmVudCdzIGFyZ3VtZW50IGxpc3QgKi8KKworCXdhbGtfc3RhdGUtPm9wX2luZm8gPSBhY3BpX3BzX2dldF9vcGNvZGVfaW5mbyh3YWxrX3N0YXRlLT5vcGNvZGUpOworCW9wID0gYWNwaV9wc19hbGxvY19vcCh3YWxrX3N0YXRlLT5vcGNvZGUpOworCWlmICghb3ApIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX01FTU9SWSk7CisJfQorCisJaWYgKHdhbGtfc3RhdGUtPm9wX2luZm8tPmZsYWdzICYgQU1MX05BTUVEKSB7CisJCXN0YXR1cyA9CisJCSAgICBhY3BpX3BzX2J1aWxkX25hbWVkX29wKHdhbGtfc3RhdGUsIGFtbF9vcF9zdGFydCwgb3AsCisJCQkJCSAgICZuYW1lZF9vcCk7CisJCWFjcGlfcHNfZnJlZV9vcChvcCk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CisJCX0KKworCQkqbmV3X29wID0gbmFtZWRfb3A7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CisJfQorCisJLyogTm90IGEgbmFtZWQgb3Bjb2RlLCBqdXN0IGFsbG9jYXRlIE9wIGFuZCBhcHBlbmQgdG8gcGFyZW50ICovCisKKwlpZiAod2Fsa19zdGF0ZS0+b3BfaW5mby0+ZmxhZ3MgJiBBTUxfQ1JFQVRFKSB7CisJCS8qCisJCSAqIEJhY2t1cCB0byBiZWdpbm5pbmcgb2YgY3JlYXRlX3hYWGZpZWxkIGRlY2xhcmF0aW9uCisJCSAqIGJvZHlfbGVuZ3RoIGlzIHVua25vd24gdW50aWwgd2UgcGFyc2UgdGhlIGJvZHkKKwkJICovCisJCW9wLT5uYW1lZC5kYXRhID0gYW1sX29wX3N0YXJ0OworCQlvcC0+bmFtZWQubGVuZ3RoID0gMDsKKwl9CisKKwlpZiAod2Fsa19zdGF0ZS0+b3Bjb2RlID09IEFNTF9CQU5LX0ZJRUxEX09QKSB7CisJCS8qCisJCSAqIEJhY2t1cCB0byBiZWdpbm5pbmcgb2YgYmFua19maWVsZCBkZWNsYXJhdGlvbgorCQkgKiBib2R5X2xlbmd0aCBpcyB1bmtub3duIHVudGlsIHdlIHBhcnNlIHRoZSBib2R5CisJCSAqLworCQlvcC0+bmFtZWQuZGF0YSA9IGFtbF9vcF9zdGFydDsKKwkJb3AtPm5hbWVkLmxlbmd0aCA9IDA7CisJfQorCisJcGFyZW50X3Njb3BlID0gYWNwaV9wc19nZXRfcGFyZW50X3Njb3BlKCYod2Fsa19zdGF0ZS0+cGFyc2VyX3N0YXRlKSk7CisJYWNwaV9wc19hcHBlbmRfYXJnKHBhcmVudF9zY29wZSwgb3ApOworCisJaWYgKHBhcmVudF9zY29wZSkgeworCQlvcF9pbmZvID0KKwkJICAgIGFjcGlfcHNfZ2V0X29wY29kZV9pbmZvKHBhcmVudF9zY29wZS0+Y29tbW9uLmFtbF9vcGNvZGUpOworCQlpZiAob3BfaW5mby0+ZmxhZ3MgJiBBTUxfSEFTX1RBUkdFVCkgeworCQkJYXJndW1lbnRfY291bnQgPQorCQkJICAgIGFjcGlfcHNfZ2V0X2FyZ3VtZW50X2NvdW50KG9wX2luZm8tPnR5cGUpOworCQkJaWYgKHBhcmVudF9zY29wZS0+Y29tbW9uLmFyZ19saXN0X2xlbmd0aCA+CisJCQkgICAgYXJndW1lbnRfY291bnQpIHsKKwkJCQlvcC0+Y29tbW9uLmZsYWdzIHw9IEFDUElfUEFSU0VPUF9UQVJHRVQ7CisJCQl9CisJCX0gZWxzZSBpZiAocGFyZW50X3Njb3BlLT5jb21tb24uYW1sX29wY29kZSA9PSBBTUxfSU5DUkVNRU5UX09QKSB7CisJCQlvcC0+Y29tbW9uLmZsYWdzIHw9IEFDUElfUEFSU0VPUF9UQVJHRVQ7CisJCX0KKwl9CisKKwlpZiAod2Fsa19zdGF0ZS0+ZGVzY2VuZGluZ19jYWxsYmFjayAhPSBOVUxMKSB7CisJCS8qCisJCSAqIEZpbmQgdGhlIG9iamVjdC4gVGhpcyB3aWxsIGVpdGhlciBpbnNlcnQgdGhlIG9iamVjdCBpbnRvCisJCSAqIHRoZSBuYW1lc3BhY2Ugb3Igc2ltcGx5IGxvb2sgaXQgdXAKKwkJICovCisJCXdhbGtfc3RhdGUtPm9wID0gKm5ld19vcCA9IG9wOworCisJCXN0YXR1cyA9IHdhbGtfc3RhdGUtPmRlc2NlbmRpbmdfY2FsbGJhY2sod2Fsa19zdGF0ZSwgJm9wKTsKKwkJc3RhdHVzID0gYWNwaV9wc19uZXh0X3BhcnNlX3N0YXRlKHdhbGtfc3RhdGUsIG9wLCBzdGF0dXMpOworCQlpZiAoc3RhdHVzID09IEFFX0NUUkxfUEVORElORykgeworCQkJc3RhdHVzID0gQUVfQ1RSTF9QQVJTRV9QRU5ESU5HOworCQl9CisJfQorCisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfcHNfZ2V0X2FyZ3VtZW50cworICoKKyAqIFBBUkFNRVRFUlM6ICB3YWxrX3N0YXRlICAgICAgICAgIC0gQ3VycmVudCBzdGF0ZQorICogICAgICAgICAgICAgIGFtbF9vcF9zdGFydCAgICAgICAgLSBPcCBzdGFydCBpbiBBTUwKKyAqICAgICAgICAgICAgICBPcCAgICAgICAgICAgICAgICAgIC0gQ3VycmVudCBPcAorICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogR2V0IGFyZ3VtZW50cyBmb3IgcGFzc2VkIE9wLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBhY3BpX3N0YXR1cworYWNwaV9wc19nZXRfYXJndW1lbnRzKHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUsCisJCSAgICAgIHU4ICogYW1sX29wX3N0YXJ0LCB1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqb3ApCit7CisJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CisJdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKmFyZyA9IE5VTEw7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUihwc19nZXRfYXJndW1lbnRzLCB3YWxrX3N0YXRlKTsKKworCXN3aXRjaCAob3AtPmNvbW1vbi5hbWxfb3Bjb2RlKSB7CisJY2FzZSBBTUxfQllURV9PUDoJLyogQU1MX0JZVEVEQVRBX0FSRyAqLworCWNhc2UgQU1MX1dPUkRfT1A6CS8qIEFNTF9XT1JEREFUQV9BUkcgKi8KKwljYXNlIEFNTF9EV09SRF9PUDoJLyogQU1MX0RXT1JEQVRBX0FSRyAqLworCWNhc2UgQU1MX1FXT1JEX09QOgkvKiBBTUxfUVdPUkRBVEFfQVJHICovCisJY2FzZSBBTUxfU1RSSU5HX09QOgkvKiBBTUxfQVNDSUlDSEFSTElTVF9BUkcgKi8KKworCQkvKiBGaWxsIGluIGNvbnN0YW50IG9yIHN0cmluZyBhcmd1bWVudCBkaXJlY3RseSAqLworCisJCWFjcGlfcHNfZ2V0X25leHRfc2ltcGxlX2FyZygmKHdhbGtfc3RhdGUtPnBhcnNlcl9zdGF0ZSksCisJCQkJCSAgICBHRVRfQ1VSUkVOVF9BUkdfVFlQRSh3YWxrX3N0YXRlLT4KKwkJCQkJCQkJIGFyZ190eXBlcyksCisJCQkJCSAgICBvcCk7CisJCWJyZWFrOworCisJY2FzZSBBTUxfSU5UX05BTUVQQVRIX09QOgkvKiBBTUxfTkFNRVNUUklOR19BUkcgKi8KKworCQlzdGF0dXMgPQorCQkgICAgYWNwaV9wc19nZXRfbmV4dF9uYW1lcGF0aCh3YWxrX3N0YXRlLAorCQkJCQkgICAgICAmKHdhbGtfc3RhdGUtPnBhcnNlcl9zdGF0ZSksIG9wLAorCQkJCQkgICAgICAxKTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKKwkJfQorCisJCXdhbGtfc3RhdGUtPmFyZ190eXBlcyA9IDA7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJLyoKKwkJICogT3AgaXMgbm90IGEgY29uc3RhbnQgb3Igc3RyaW5nLCBhcHBlbmQgZWFjaCBhcmd1bWVudCB0byB0aGUgT3AKKwkJICovCisJCXdoaWxlIChHRVRfQ1VSUkVOVF9BUkdfVFlQRSh3YWxrX3N0YXRlLT5hcmdfdHlwZXMpCisJCSAgICAgICAmJiAhd2Fsa19zdGF0ZS0+YXJnX2NvdW50KSB7CisJCQl3YWxrX3N0YXRlLT5hbWxfb2Zmc2V0ID0KKwkJCSAgICAodTMyKSBBQ1BJX1BUUl9ESUZGKHdhbGtfc3RhdGUtPnBhcnNlcl9zdGF0ZS5hbWwsCisJCQkJCQl3YWxrX3N0YXRlLT5wYXJzZXJfc3RhdGUuCisJCQkJCQlhbWxfc3RhcnQpOworCisJCQlzdGF0dXMgPQorCQkJICAgIGFjcGlfcHNfZ2V0X25leHRfYXJnKHdhbGtfc3RhdGUsCisJCQkJCQkgJih3YWxrX3N0YXRlLT5wYXJzZXJfc3RhdGUpLAorCQkJCQkJIEdFVF9DVVJSRU5UX0FSR19UWVBFCisJCQkJCQkgKHdhbGtfc3RhdGUtPmFyZ190eXBlcyksICZhcmcpOworCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CisJCQl9CisKKwkJCWlmIChhcmcpIHsKKwkJCQlhcmctPmNvbW1vbi5hbWxfb2Zmc2V0ID0gd2Fsa19zdGF0ZS0+YW1sX29mZnNldDsKKwkJCQlhY3BpX3BzX2FwcGVuZF9hcmcob3AsIGFyZyk7CisJCQl9CisKKwkJCUlOQ1JFTUVOVF9BUkdfTElTVCh3YWxrX3N0YXRlLT5hcmdfdHlwZXMpOworCQl9CisKKwkJLyogU3BlY2lhbCBwcm9jZXNzaW5nIGZvciBjZXJ0YWluIG9wY29kZXMgKi8KKworCQkvKiBUQkQgKHJlbW92ZSk6IFRlbXBvcmFyeSBtZWNoYW5pc20gdG8gZGlzYWJsZSB0aGlzIGNvZGUgaWYgbmVlZGVkICovCisKKyNpZmRlZiBBQ1BJX0VOQUJMRV9NT0RVTEVfTEVWRUxfQ09ERQorCisJCWlmICgod2Fsa19zdGF0ZS0+cGFzc19udW1iZXIgPD0gQUNQSV9JTU9ERV9MT0FEX1BBU1MxKSAmJgorCQkgICAgKCh3YWxrX3N0YXRlLT5wYXJzZV9mbGFncyAmIEFDUElfUEFSU0VfRElTQVNTRU1CTEUpID09IDApKSB7CisJCQkvKgorCQkJICogV2Ugd2FudCB0byBza2lwIElmL0Vsc2UvV2hpbGUgY29uc3RydWN0cyBkdXJpbmcgUGFzczEgYmVjYXVzZSB3ZQorCQkJICogd2FudCB0byBhY3R1YWxseSBjb25kaXRpb25hbGx5IGV4ZWN1dGUgdGhlIGNvZGUgZHVyaW5nIFBhc3MyLgorCQkJICoKKwkJCSAqIEV4Y2VwdCBmb3IgZGlzYXNzZW1ibHksIHdoZXJlIHdlIGFsd2F5cyB3YW50IHRvIHdhbGsgdGhlCisJCQkgKiBJZi9FbHNlL1doaWxlIHBhY2thZ2VzCisJCQkgKi8KKwkJCXN3aXRjaCAob3AtPmNvbW1vbi5hbWxfb3Bjb2RlKSB7CisJCQljYXNlIEFNTF9JRl9PUDoKKwkJCWNhc2UgQU1MX0VMU0VfT1A6CisJCQljYXNlIEFNTF9XSElMRV9PUDoKKworCQkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfUEFSU0UsCisJCQkJCQkgICJQYXNzMTogU2tpcHBpbmcgYW4gSWYvRWxzZS9XaGlsZSBib2R5XG4iKSk7CisKKwkJCQkvKiBTa2lwIGJvZHkgb2YgaWYvZWxzZS93aGlsZSBpbiBwYXNzIDEgKi8KKworCQkJCXdhbGtfc3RhdGUtPnBhcnNlcl9zdGF0ZS5hbWwgPQorCQkJCSAgICB3YWxrX3N0YXRlLT5wYXJzZXJfc3RhdGUucGtnX2VuZDsKKwkJCQl3YWxrX3N0YXRlLT5hcmdfY291bnQgPSAwOworCQkJCWJyZWFrOworCisJCQlkZWZhdWx0OgorCQkJCWJyZWFrOworCQkJfQorCQl9CisjZW5kaWYKKworCQlzd2l0Y2ggKG9wLT5jb21tb24uYW1sX29wY29kZSkgeworCQljYXNlIEFNTF9NRVRIT0RfT1A6CisJCQkvKgorCQkJICogU2tpcCBwYXJzaW5nIG9mIGNvbnRyb2wgbWV0aG9kIGJlY2F1c2Ugd2UgZG9uJ3QgaGF2ZSBlbm91Z2gKKwkJCSAqIGluZm8gaW4gdGhlIGZpcnN0IHBhc3MgdG8gcGFyc2UgaXQgY29ycmVjdGx5LgorCQkJICoKKwkJCSAqIFNhdmUgdGhlIGxlbmd0aCBhbmQgYWRkcmVzcyBvZiB0aGUgYm9keQorCQkJICovCisJCQlvcC0+bmFtZWQuZGF0YSA9IHdhbGtfc3RhdGUtPnBhcnNlcl9zdGF0ZS5hbWw7CisJCQlvcC0+bmFtZWQubGVuZ3RoID0gKHUzMikKKwkJCSAgICAod2Fsa19zdGF0ZS0+cGFyc2VyX3N0YXRlLnBrZ19lbmQgLQorCQkJICAgICB3YWxrX3N0YXRlLT5wYXJzZXJfc3RhdGUuYW1sKTsKKworCQkJLyogU2tpcCBib2R5IG9mIG1ldGhvZCAqLworCisJCQl3YWxrX3N0YXRlLT5wYXJzZXJfc3RhdGUuYW1sID0KKwkJCSAgICB3YWxrX3N0YXRlLT5wYXJzZXJfc3RhdGUucGtnX2VuZDsKKwkJCXdhbGtfc3RhdGUtPmFyZ19jb3VudCA9IDA7CisJCQlicmVhazsKKworCQljYXNlIEFNTF9CVUZGRVJfT1A6CisJCWNhc2UgQU1MX1BBQ0tBR0VfT1A6CisJCWNhc2UgQU1MX1ZBUl9QQUNLQUdFX09QOgorCisJCQlpZiAoKG9wLT5jb21tb24ucGFyZW50KSAmJgorCQkJICAgIChvcC0+Y29tbW9uLnBhcmVudC0+Y29tbW9uLmFtbF9vcGNvZGUgPT0KKwkJCSAgICAgQU1MX05BTUVfT1ApCisJCQkgICAgJiYgKHdhbGtfc3RhdGUtPnBhc3NfbnVtYmVyIDw9CisJCQkJQUNQSV9JTU9ERV9MT0FEX1BBU1MyKSkgeworCQkJCS8qCisJCQkJICogU2tpcCBwYXJzaW5nIG9mIEJ1ZmZlcnMgYW5kIFBhY2thZ2VzIGJlY2F1c2Ugd2UgZG9uJ3QgaGF2ZQorCQkJCSAqIGVub3VnaCBpbmZvIGluIHRoZSBmaXJzdCBwYXNzIHRvIHBhcnNlIHRoZW0gY29ycmVjdGx5LgorCQkJCSAqLworCQkJCW9wLT5uYW1lZC5kYXRhID0gYW1sX29wX3N0YXJ0OworCQkJCW9wLT5uYW1lZC5sZW5ndGggPSAodTMyKQorCQkJCSAgICAod2Fsa19zdGF0ZS0+cGFyc2VyX3N0YXRlLnBrZ19lbmQgLQorCQkJCSAgICAgYW1sX29wX3N0YXJ0KTsKKworCQkJCS8qIFNraXAgYm9keSAqLworCisJCQkJd2Fsa19zdGF0ZS0+cGFyc2VyX3N0YXRlLmFtbCA9CisJCQkJICAgIHdhbGtfc3RhdGUtPnBhcnNlcl9zdGF0ZS5wa2dfZW5kOworCQkJCXdhbGtfc3RhdGUtPmFyZ19jb3VudCA9IDA7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIEFNTF9XSElMRV9PUDoKKworCQkJaWYgKHdhbGtfc3RhdGUtPmNvbnRyb2xfc3RhdGUpIHsKKwkJCQl3YWxrX3N0YXRlLT5jb250cm9sX3N0YXRlLT5jb250cm9sLnBhY2thZ2VfZW5kID0KKwkJCQkgICAgd2Fsa19zdGF0ZS0+cGFyc2VyX3N0YXRlLnBrZ19lbmQ7CisJCQl9CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCisJCQkvKiBObyBhY3Rpb24gZm9yIGFsbCBvdGhlciBvcGNvZGVzICovCisJCQlicmVhazsKKwkJfQorCisJCWJyZWFrOworCX0KKworCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfcHNfY29tcGxldGVfb3AKKyAqCisgKiBQQVJBTUVURVJTOiAgd2Fsa19zdGF0ZSAgICAgICAgICAtIEN1cnJlbnQgc3RhdGUKKyAqICAgICAgICAgICAgICBPcCAgICAgICAgICAgICAgICAgIC0gUmV0dXJuZWQgT3AKKyAqICAgICAgICAgICAgICBTdGF0dXMgICAgICAgICAgICAgIC0gUGFyc2Ugc3RhdHVzIGJlZm9yZSBjb21wbGV0ZSBPcAorICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogQ29tcGxldGUgT3AKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgYWNwaV9zdGF0dXMKK2FjcGlfcHNfY29tcGxldGVfb3Aoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSwKKwkJICAgIHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICoqb3AsIGFjcGlfc3RhdHVzIHN0YXR1cykKK3sKKwlhY3BpX3N0YXR1cyBzdGF0dXMyOworCisJQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIocHNfY29tcGxldGVfb3AsIHdhbGtfc3RhdGUpOworCisJLyoKKwkgKiBGaW5pc2hlZCBvbmUgYXJndW1lbnQgb2YgdGhlIGNvbnRhaW5pbmcgc2NvcGUKKwkgKi8KKwl3YWxrX3N0YXRlLT5wYXJzZXJfc3RhdGUuc2NvcGUtPnBhcnNlX3Njb3BlLmFyZ19jb3VudC0tOworCisJLyogQ2xvc2UgdGhpcyBPcCAod2lsbCByZXN1bHQgaW4gcGFyc2Ugc3VidHJlZSBkZWxldGlvbikgKi8KKworCXN0YXR1czIgPSBhY3BpX3BzX2NvbXBsZXRlX3RoaXNfb3Aod2Fsa19zdGF0ZSwgKm9wKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1czIpKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMyKTsKKwl9CisKKwkqb3AgPSBOVUxMOworCisJc3dpdGNoIChzdGF0dXMpIHsKKwljYXNlIEFFX09LOgorCQlicmVhazsKKworCWNhc2UgQUVfQ1RSTF9UUkFOU0ZFUjoKKworCQkvKiBXZSBhcmUgYWJvdXQgdG8gdHJhbnNmZXIgdG8gYSBjYWxsZWQgbWV0aG9kICovCisKKwkJd2Fsa19zdGF0ZS0+cHJldl9vcCA9IE5VTEw7CisJCXdhbGtfc3RhdGUtPnByZXZfYXJnX3R5cGVzID0gd2Fsa19zdGF0ZS0+YXJnX3R5cGVzOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKKworCWNhc2UgQUVfQ1RSTF9FTkQ6CisKKwkJYWNwaV9wc19wb3Bfc2NvcGUoJih3YWxrX3N0YXRlLT5wYXJzZXJfc3RhdGUpLCBvcCwKKwkJCQkgICZ3YWxrX3N0YXRlLT5hcmdfdHlwZXMsCisJCQkJICAmd2Fsa19zdGF0ZS0+YXJnX2NvdW50KTsKKworCQlpZiAoKm9wKSB7CisJCQl3YWxrX3N0YXRlLT5vcCA9ICpvcDsKKwkJCXdhbGtfc3RhdGUtPm9wX2luZm8gPQorCQkJICAgIGFjcGlfcHNfZ2V0X29wY29kZV9pbmZvKCgqb3ApLT5jb21tb24uYW1sX29wY29kZSk7CisJCQl3YWxrX3N0YXRlLT5vcGNvZGUgPSAoKm9wKS0+Y29tbW9uLmFtbF9vcGNvZGU7CisKKwkJCXN0YXR1cyA9IHdhbGtfc3RhdGUtPmFzY2VuZGluZ19jYWxsYmFjayh3YWxrX3N0YXRlKTsKKwkJCXN0YXR1cyA9CisJCQkgICAgYWNwaV9wc19uZXh0X3BhcnNlX3N0YXRlKHdhbGtfc3RhdGUsICpvcCwgc3RhdHVzKTsKKworCQkJc3RhdHVzMiA9IGFjcGlfcHNfY29tcGxldGVfdGhpc19vcCh3YWxrX3N0YXRlLCAqb3ApOworCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMyKSkgeworCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMyKTsKKwkJCX0KKwkJfQorCisJCXN0YXR1cyA9IEFFX09LOworCQlicmVhazsKKworCWNhc2UgQUVfQ1RSTF9CUkVBSzoKKwljYXNlIEFFX0NUUkxfQ09OVElOVUU6CisKKwkJLyogUG9wIG9mZiBzY29wZXMgdW50aWwgd2UgZmluZCB0aGUgV2hpbGUgKi8KKworCQl3aGlsZSAoISgqb3ApIHx8ICgoKm9wKS0+Y29tbW9uLmFtbF9vcGNvZGUgIT0gQU1MX1dISUxFX09QKSkgeworCQkJYWNwaV9wc19wb3Bfc2NvcGUoJih3YWxrX3N0YXRlLT5wYXJzZXJfc3RhdGUpLCBvcCwKKwkJCQkJICAmd2Fsa19zdGF0ZS0+YXJnX3R5cGVzLAorCQkJCQkgICZ3YWxrX3N0YXRlLT5hcmdfY291bnQpOworCQl9CisKKwkJLyogQ2xvc2UgdGhpcyBpdGVyYXRpb24gb2YgdGhlIFdoaWxlIGxvb3AgKi8KKworCQl3YWxrX3N0YXRlLT5vcCA9ICpvcDsKKwkJd2Fsa19zdGF0ZS0+b3BfaW5mbyA9CisJCSAgICBhY3BpX3BzX2dldF9vcGNvZGVfaW5mbygoKm9wKS0+Y29tbW9uLmFtbF9vcGNvZGUpOworCQl3YWxrX3N0YXRlLT5vcGNvZGUgPSAoKm9wKS0+Y29tbW9uLmFtbF9vcGNvZGU7CisKKwkJc3RhdHVzID0gd2Fsa19zdGF0ZS0+YXNjZW5kaW5nX2NhbGxiYWNrKHdhbGtfc3RhdGUpOworCQlzdGF0dXMgPSBhY3BpX3BzX25leHRfcGFyc2Vfc3RhdGUod2Fsa19zdGF0ZSwgKm9wLCBzdGF0dXMpOworCisJCXN0YXR1czIgPSBhY3BpX3BzX2NvbXBsZXRlX3RoaXNfb3Aod2Fsa19zdGF0ZSwgKm9wKTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMyKSkgeworCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1czIpOworCQl9CisKKwkJc3RhdHVzID0gQUVfT0s7CisJCWJyZWFrOworCisJY2FzZSBBRV9DVFJMX1RFUk1JTkFURToKKworCQkvKiBDbGVhbiB1cCAqLworCQlkbyB7CisJCQlpZiAoKm9wKSB7CisJCQkJc3RhdHVzMiA9CisJCQkJICAgIGFjcGlfcHNfY29tcGxldGVfdGhpc19vcCh3YWxrX3N0YXRlLCAqb3ApOworCQkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzMikpIHsKKwkJCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1czIpOworCQkJCX0KKworCQkJCWFjcGlfdXRfZGVsZXRlX2dlbmVyaWNfc3RhdGUKKwkJCQkgICAgKGFjcGlfdXRfcG9wX2dlbmVyaWNfc3RhdGUKKwkJCQkgICAgICgmd2Fsa19zdGF0ZS0+Y29udHJvbF9zdGF0ZSkpOworCQkJfQorCisJCQlhY3BpX3BzX3BvcF9zY29wZSgmKHdhbGtfc3RhdGUtPnBhcnNlcl9zdGF0ZSksIG9wLAorCQkJCQkgICZ3YWxrX3N0YXRlLT5hcmdfdHlwZXMsCisJCQkJCSAgJndhbGtfc3RhdGUtPmFyZ19jb3VudCk7CisKKwkJfSB3aGlsZSAoKm9wKTsKKworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOworCisJZGVmYXVsdDoJCS8qIEFsbCBvdGhlciBub24tQUVfT0sgc3RhdHVzICovCisKKwkJZG8geworCQkJaWYgKCpvcCkgeworCQkJCXN0YXR1czIgPQorCQkJCSAgICBhY3BpX3BzX2NvbXBsZXRlX3RoaXNfb3Aod2Fsa19zdGF0ZSwgKm9wKTsKKwkJCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1czIpKSB7CisJCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMyKTsKKwkJCQl9CisJCQl9CisKKwkJCWFjcGlfcHNfcG9wX3Njb3BlKCYod2Fsa19zdGF0ZS0+cGFyc2VyX3N0YXRlKSwgb3AsCisJCQkJCSAgJndhbGtfc3RhdGUtPmFyZ190eXBlcywKKwkJCQkJICAmd2Fsa19zdGF0ZS0+YXJnX2NvdW50KTsKKworCQl9IHdoaWxlICgqb3ApOworCisjaWYgMAorCQkvKgorCQkgKiBUQkQ6IENsZWFudXAgcGFyc2Ugb3BzIG9uIGVycm9yCisJCSAqLworCQlpZiAoKm9wID09IE5VTEwpIHsKKwkJCWFjcGlfcHNfcG9wX3Njb3BlKHBhcnNlcl9zdGF0ZSwgb3AsCisJCQkJCSAgJndhbGtfc3RhdGUtPmFyZ190eXBlcywKKwkJCQkJICAmd2Fsa19zdGF0ZS0+YXJnX2NvdW50KTsKKwkJfQorI2VuZGlmCisJCXdhbGtfc3RhdGUtPnByZXZfb3AgPSBOVUxMOworCQl3YWxrX3N0YXRlLT5wcmV2X2FyZ190eXBlcyA9IHdhbGtfc3RhdGUtPmFyZ190eXBlczsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CisJfQorCisJLyogVGhpcyBzY29wZSBjb21wbGV0ZT8gKi8KKworCWlmIChhY3BpX3BzX2hhc19jb21wbGV0ZWRfc2NvcGUoJih3YWxrX3N0YXRlLT5wYXJzZXJfc3RhdGUpKSkgeworCQlhY3BpX3BzX3BvcF9zY29wZSgmKHdhbGtfc3RhdGUtPnBhcnNlcl9zdGF0ZSksIG9wLAorCQkJCSAgJndhbGtfc3RhdGUtPmFyZ190eXBlcywKKwkJCQkgICZ3YWxrX3N0YXRlLT5hcmdfY291bnQpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX1BBUlNFLCAiUG9wcGVkIHNjb3BlLCBPcD0lcFxuIiwgKm9wKSk7CisJfSBlbHNlIHsKKwkJKm9wID0gTlVMTDsKKwl9CisKKwlBQ1BJX1BSRUVNUFRJT05fUE9JTlQoKTsKKworCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfcHNfY29tcGxldGVfZmluYWxfb3AKKyAqCisgKiBQQVJBTUVURVJTOiAgd2Fsa19zdGF0ZSAgICAgICAgICAtIEN1cnJlbnQgc3RhdGUKKyAqICAgICAgICAgICAgICBPcCAgICAgICAgICAgICAgICAgIC0gQ3VycmVudCBPcAorICogICAgICAgICAgICAgIFN0YXR1cyAgICAgICAgICAgICAgLSBDdXJyZW50IHBhcnNlIHN0YXR1cyBiZWZvcmUgY29tcGxldGUgbGFzdAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcAorICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogQ29tcGxldGUgbGFzdCBPcC4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgYWNwaV9zdGF0dXMKK2FjcGlfcHNfY29tcGxldGVfZmluYWxfb3Aoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSwKKwkJCSAgdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKm9wLCBhY3BpX3N0YXR1cyBzdGF0dXMpCit7CisJYWNwaV9zdGF0dXMgc3RhdHVzMjsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKHBzX2NvbXBsZXRlX2ZpbmFsX29wLCB3YWxrX3N0YXRlKTsKKworCS8qCisJICogQ29tcGxldGUgdGhlIGxhc3QgT3AgKGlmIG5vdCBjb21wbGV0ZWQpLCBhbmQgY2xlYXIgdGhlIHNjb3BlIHN0YWNrLgorCSAqIEl0IGlzIGVhc2lseSBwb3NzaWJsZSB0byBlbmQgYW4gQU1MICJwYWNrYWdlIiB3aXRoIGFuIHVuYm91bmRlZCBudW1iZXIKKwkgKiBvZiBvcGVuIHNjb3BlcyAoc3VjaCBhcyB3aGVuIHNldmVyYWwgQVNMIGJsb2NrcyBhcmUgY2xvc2VkIHdpdGgKKwkgKiBzZXF1ZW50aWFsIGNsb3NpbmcgYnJhY2VzKS4gV2Ugd2FudCB0byB0ZXJtaW5hdGUgZWFjaCBvbmUgY2xlYW5seS4KKwkgKi8KKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX1BBUlNFLCAiQU1MIHBhY2thZ2UgY29tcGxldGUgYXQgT3AgJXBcbiIsCisJCQkgIG9wKSk7CisJZG8geworCQlpZiAob3ApIHsKKwkJCWlmICh3YWxrX3N0YXRlLT5hc2NlbmRpbmdfY2FsbGJhY2sgIT0gTlVMTCkgeworCQkJCXdhbGtfc3RhdGUtPm9wID0gb3A7CisJCQkJd2Fsa19zdGF0ZS0+b3BfaW5mbyA9CisJCQkJICAgIGFjcGlfcHNfZ2V0X29wY29kZV9pbmZvKG9wLT5jb21tb24uCisJCQkJCQkJICAgIGFtbF9vcGNvZGUpOworCQkJCXdhbGtfc3RhdGUtPm9wY29kZSA9IG9wLT5jb21tb24uYW1sX29wY29kZTsKKworCQkJCXN0YXR1cyA9CisJCQkJICAgIHdhbGtfc3RhdGUtPmFzY2VuZGluZ19jYWxsYmFjayh3YWxrX3N0YXRlKTsKKwkJCQlzdGF0dXMgPQorCQkJCSAgICBhY3BpX3BzX25leHRfcGFyc2Vfc3RhdGUod2Fsa19zdGF0ZSwgb3AsCisJCQkJCQkJICAgICBzdGF0dXMpOworCQkJCWlmIChzdGF0dXMgPT0gQUVfQ1RSTF9QRU5ESU5HKSB7CisJCQkJCXN0YXR1cyA9CisJCQkJCSAgICBhY3BpX3BzX2NvbXBsZXRlX29wKHdhbGtfc3RhdGUsICZvcCwKKwkJCQkJCQkJQUVfT0spOworCQkJCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworCQkJCQl9CisJCQkJfQorCisJCQkJaWYgKHN0YXR1cyA9PSBBRV9DVFJMX1RFUk1JTkFURSkgeworCQkJCQlzdGF0dXMgPSBBRV9PSzsKKworCQkJCQkvKiBDbGVhbiB1cCAqLworCQkJCQlkbyB7CisJCQkJCQlpZiAob3ApIHsKKwkJCQkJCQlzdGF0dXMyID0KKwkJCQkJCQkgICAgYWNwaV9wc19jb21wbGV0ZV90aGlzX29wCisJCQkJCQkJICAgICh3YWxrX3N0YXRlLCBvcCk7CisJCQkJCQkJaWYgKEFDUElfRkFJTFVSRQorCQkJCQkJCSAgICAoc3RhdHVzMikpIHsKKwkJCQkJCQkJcmV0dXJuX0FDUElfU1RBVFVTCisJCQkJCQkJCSAgICAoc3RhdHVzMik7CisJCQkJCQkJfQorCQkJCQkJfQorCisJCQkJCQlhY3BpX3BzX3BvcF9zY29wZSgmCisJCQkJCQkJCSAgKHdhbGtfc3RhdGUtPgorCQkJCQkJCQkgICBwYXJzZXJfc3RhdGUpLAorCQkJCQkJCQkgICZvcCwKKwkJCQkJCQkJICAmd2Fsa19zdGF0ZS0+CisJCQkJCQkJCSAgYXJnX3R5cGVzLAorCQkJCQkJCQkgICZ3YWxrX3N0YXRlLT4KKwkJCQkJCQkJICBhcmdfY291bnQpOworCisJCQkJCX0gd2hpbGUgKG9wKTsKKworCQkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKKwkJCQl9CisKKwkJCQllbHNlIGlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCisJCQkJCS8qIEZpcnN0IGVycm9yIGlzIG1vc3QgaW1wb3J0YW50ICovCisKKwkJCQkJKHZvaWQpCisJCQkJCSAgICBhY3BpX3BzX2NvbXBsZXRlX3RoaXNfb3Aod2Fsa19zdGF0ZSwKKwkJCQkJCQkJICAgICBvcCk7CisJCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworCQkJCX0KKwkJCX0KKworCQkJc3RhdHVzMiA9IGFjcGlfcHNfY29tcGxldGVfdGhpc19vcCh3YWxrX3N0YXRlLCBvcCk7CisJCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1czIpKSB7CisJCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1czIpOworCQkJfQorCQl9CisKKwkJYWNwaV9wc19wb3Bfc2NvcGUoJih3YWxrX3N0YXRlLT5wYXJzZXJfc3RhdGUpLCAmb3AsCisJCQkJICAmd2Fsa19zdGF0ZS0+YXJnX3R5cGVzLAorCQkJCSAgJndhbGtfc3RhdGUtPmFyZ19jb3VudCk7CisKKwl9IHdoaWxlIChvcCk7CisKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9wc19wYXJzZV9sb29wCisgKgorICogUEFSQU1FVEVSUzogIHdhbGtfc3RhdGUgICAgICAgICAgLSBDdXJyZW50IHN0YXRlCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBQYXJzZSBBTUwgKHBvaW50ZWQgdG8gYnkgdGhlIGN1cnJlbnQgcGFyc2VyIHN0YXRlKSBhbmQgcmV0dXJuCisgKiAgICAgICAgICAgICAgYSB0cmVlIG9mIG9wcy4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCithY3BpX3N0YXR1cyBhY3BpX3BzX3BhcnNlX2xvb3Aoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSkKK3sKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKKwl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqb3AgPSBOVUxMOwkvKiBjdXJyZW50IG9wICovCisJc3RydWN0IGFjcGlfcGFyc2Vfc3RhdGUgKnBhcnNlcl9zdGF0ZTsKKwl1OCAqYW1sX29wX3N0YXJ0ID0gTlVMTDsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKHBzX3BhcnNlX2xvb3AsIHdhbGtfc3RhdGUpOworCisJaWYgKHdhbGtfc3RhdGUtPmRlc2NlbmRpbmdfY2FsbGJhY2sgPT0gTlVMTCkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX1BBUkFNRVRFUik7CisJfQorCisJcGFyc2VyX3N0YXRlID0gJndhbGtfc3RhdGUtPnBhcnNlcl9zdGF0ZTsKKwl3YWxrX3N0YXRlLT5hcmdfdHlwZXMgPSAwOworCisjaWYgKCFkZWZpbmVkIChBQ1BJX05PX01FVEhPRF9FWEVDVVRJT04pICYmICFkZWZpbmVkIChBQ1BJX0NPTlNUQU5UX0VWQUxfT05MWSkpCisKKwlpZiAod2Fsa19zdGF0ZS0+d2Fsa190eXBlICYgQUNQSV9XQUxLX01FVEhPRF9SRVNUQVJUKSB7CisKKwkJLyogV2UgYXJlIHJlc3RhcnRpbmcgYSBwcmVlbXB0ZWQgY29udHJvbCBtZXRob2QgKi8KKworCQlpZiAoYWNwaV9wc19oYXNfY29tcGxldGVkX3Njb3BlKHBhcnNlcl9zdGF0ZSkpIHsKKwkJCS8qCisJCQkgKiBXZSBtdXN0IGNoZWNrIGlmIGEgcHJlZGljYXRlIHRvIGFuIElGIG9yIFdISUxFIHN0YXRlbWVudAorCQkJICogd2FzIGp1c3QgY29tcGxldGVkCisJCQkgKi8KKwkJCWlmICgocGFyc2VyX3N0YXRlLT5zY29wZS0+cGFyc2Vfc2NvcGUub3ApICYmCisJCQkgICAgKChwYXJzZXJfc3RhdGUtPnNjb3BlLT5wYXJzZV9zY29wZS5vcC0+Y29tbW9uLgorCQkJICAgICAgYW1sX29wY29kZSA9PSBBTUxfSUZfT1ApCisJCQkgICAgIHx8IChwYXJzZXJfc3RhdGUtPnNjb3BlLT5wYXJzZV9zY29wZS5vcC0+Y29tbW9uLgorCQkJCSBhbWxfb3Bjb2RlID09IEFNTF9XSElMRV9PUCkpCisJCQkgICAgJiYgKHdhbGtfc3RhdGUtPmNvbnRyb2xfc3RhdGUpCisJCQkgICAgJiYgKHdhbGtfc3RhdGUtPmNvbnRyb2xfc3RhdGUtPmNvbW1vbi5zdGF0ZSA9PQorCQkJCUFDUElfQ09OVFJPTF9QUkVESUNBVEVfRVhFQ1VUSU5HKSkgeworCQkJCS8qCisJCQkJICogQSBwcmVkaWNhdGUgd2FzIGp1c3QgY29tcGxldGVkLCBnZXQgdGhlIHZhbHVlIG9mIHRoZQorCQkJCSAqIHByZWRpY2F0ZSBhbmQgYnJhbmNoIGJhc2VkIG9uIHRoYXQgdmFsdWUKKwkJCQkgKi8KKwkJCQl3YWxrX3N0YXRlLT5vcCA9IE5VTEw7CisJCQkJc3RhdHVzID0KKwkJCQkgICAgYWNwaV9kc19nZXRfcHJlZGljYXRlX3ZhbHVlKHdhbGtfc3RhdGUsCisJCQkJCQkJCUFDUElfVE9fUE9JTlRFUgorCQkJCQkJCQkoVFJVRSkpOworCQkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKQorCQkJCSAgICAmJiAoKHN0YXR1cyAmIEFFX0NPREVfTUFTSykgIT0KKwkJCQkJQUVfQ09ERV9DT05UUk9MKSkgeworCQkJCQlpZiAoc3RhdHVzID09IEFFX0FNTF9OT19SRVRVUk5fVkFMVUUpIHsKKwkJCQkJCUFDUElfRVhDRVBUSU9OKChBRV9JTkZPLCBzdGF0dXMsCisJCQkJCQkJCSJJbnZva2VkIG1ldGhvZCBkaWQgbm90IHJldHVybiBhIHZhbHVlIikpOworCisJCQkJCX0KKworCQkJCQlBQ1BJX0VYQ0VQVElPTigoQUVfSU5GTywgc3RhdHVzLAorCQkJCQkJCSJHZXRQcmVkaWNhdGUgRmFpbGVkIikpOworCQkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKKwkJCQl9CisKKwkJCQlzdGF0dXMgPQorCQkJCSAgICBhY3BpX3BzX25leHRfcGFyc2Vfc3RhdGUod2Fsa19zdGF0ZSwgb3AsCisJCQkJCQkJICAgICBzdGF0dXMpOworCQkJfQorCisJCQlhY3BpX3BzX3BvcF9zY29wZShwYXJzZXJfc3RhdGUsICZvcCwKKwkJCQkJICAmd2Fsa19zdGF0ZS0+YXJnX3R5cGVzLAorCQkJCQkgICZ3YWxrX3N0YXRlLT5hcmdfY291bnQpOworCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9QQVJTRSwKKwkJCQkJICAiUG9wcGVkIHNjb3BlLCBPcD0lcFxuIiwgb3ApKTsKKwkJfSBlbHNlIGlmICh3YWxrX3N0YXRlLT5wcmV2X29wKSB7CisKKwkJCS8qIFdlIHdlcmUgaW4gdGhlIG1pZGRsZSBvZiBhbiBvcCAqLworCisJCQlvcCA9IHdhbGtfc3RhdGUtPnByZXZfb3A7CisJCQl3YWxrX3N0YXRlLT5hcmdfdHlwZXMgPSB3YWxrX3N0YXRlLT5wcmV2X2FyZ190eXBlczsKKwkJfQorCX0KKyNlbmRpZgorCisJLyogSXRlcmF0aXZlIHBhcnNpbmcgbG9vcCwgd2hpbGUgdGhlcmUgaXMgbW9yZSBBTUwgdG8gcHJvY2VzczogKi8KKworCXdoaWxlICgocGFyc2VyX3N0YXRlLT5hbWwgPCBwYXJzZXJfc3RhdGUtPmFtbF9lbmQpIHx8IChvcCkpIHsKKwkJYW1sX29wX3N0YXJ0ID0gcGFyc2VyX3N0YXRlLT5hbWw7CisJCWlmICghb3ApIHsKKwkJCXN0YXR1cyA9CisJCQkgICAgYWNwaV9wc19jcmVhdGVfb3Aod2Fsa19zdGF0ZSwgYW1sX29wX3N0YXJ0LCAmb3ApOworCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQkJaWYgKHN0YXR1cyA9PSBBRV9DVFJMX1BBUlNFX0NPTlRJTlVFKSB7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKworCQkJCWlmIChzdGF0dXMgPT0gQUVfQ1RSTF9QQVJTRV9QRU5ESU5HKSB7CisJCQkJCXN0YXR1cyA9IEFFX09LOworCQkJCX0KKworCQkJCXN0YXR1cyA9CisJCQkJICAgIGFjcGlfcHNfY29tcGxldGVfb3Aod2Fsa19zdGF0ZSwgJm9wLAorCQkJCQkJCXN0YXR1cyk7CisJCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworCQkJCX0KKworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQlvcC0+Y29tbW9uLmFtbF9vZmZzZXQgPSB3YWxrX3N0YXRlLT5hbWxfb2Zmc2V0OworCisJCQlpZiAod2Fsa19zdGF0ZS0+b3BfaW5mbykgeworCQkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfUEFSU0UsCisJCQkJCQkgICJPcGNvZGUgJTQuNFggWyVzXSBPcCAlcCBBbWwgJXAgQW1sT2Zmc2V0ICU1LjVYXG4iLAorCQkJCQkJICAodTMyKSBvcC0+Y29tbW9uLmFtbF9vcGNvZGUsCisJCQkJCQkgIHdhbGtfc3RhdGUtPm9wX2luZm8tPm5hbWUsIG9wLAorCQkJCQkJICBwYXJzZXJfc3RhdGUtPmFtbCwKKwkJCQkJCSAgb3AtPmNvbW1vbi5hbWxfb2Zmc2V0KSk7CisJCQl9CisJCX0KKworCQkvKgorCQkgKiBTdGFydCBhcmdfY291bnQgYXQgemVybyBiZWNhdXNlIHdlIGRvbid0IGtub3cgaWYgdGhlcmUgYXJlCisJCSAqIGFueSBhcmdzIHlldAorCQkgKi8KKwkJd2Fsa19zdGF0ZS0+YXJnX2NvdW50ID0gMDsKKworCQkvKiBBcmUgdGhlcmUgYW55IGFyZ3VtZW50cyB0aGF0IG11c3QgYmUgcHJvY2Vzc2VkPyAqLworCisJCWlmICh3YWxrX3N0YXRlLT5hcmdfdHlwZXMpIHsKKworCQkJLyogR2V0IGFyZ3VtZW50cyAqLworCisJCQlzdGF0dXMgPQorCQkJICAgIGFjcGlfcHNfZ2V0X2FyZ3VtZW50cyh3YWxrX3N0YXRlLCBhbWxfb3Bfc3RhcnQsIG9wKTsKKwkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJCXN0YXR1cyA9CisJCQkJICAgIGFjcGlfcHNfY29tcGxldGVfb3Aod2Fsa19zdGF0ZSwgJm9wLAorCQkJCQkJCXN0YXR1cyk7CisJCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworCQkJCX0KKworCQkJCWNvbnRpbnVlOworCQkJfQorCQl9CisKKwkJLyogQ2hlY2sgZm9yIGFyZ3VtZW50cyB0aGF0IG5lZWQgdG8gYmUgcHJvY2Vzc2VkICovCisKKwkJaWYgKHdhbGtfc3RhdGUtPmFyZ19jb3VudCkgeworCQkJLyoKKwkJCSAqIFRoZXJlIGFyZSBhcmd1bWVudHMgKGNvbXBsZXggb25lcyksIHB1c2ggT3AgYW5kCisJCQkgKiBwcmVwYXJlIGZvciBhcmd1bWVudAorCQkJICovCisJCQlzdGF0dXMgPSBhY3BpX3BzX3B1c2hfc2NvcGUocGFyc2VyX3N0YXRlLCBvcCwKKwkJCQkJCSAgICB3YWxrX3N0YXRlLT5hcmdfdHlwZXMsCisJCQkJCQkgICAgd2Fsa19zdGF0ZS0+YXJnX2NvdW50KTsKKwkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJCXN0YXR1cyA9CisJCQkJICAgIGFjcGlfcHNfY29tcGxldGVfb3Aod2Fsa19zdGF0ZSwgJm9wLAorCQkJCQkJCXN0YXR1cyk7CisJCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworCQkJCX0KKworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQlvcCA9IE5VTEw7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qCisJCSAqIEFsbCBhcmd1bWVudHMgaGF2ZSBiZWVuIHByb2Nlc3NlZCAtLSBPcCBpcyBjb21wbGV0ZSwKKwkJICogcHJlcGFyZSBmb3IgbmV4dAorCQkgKi8KKwkJd2Fsa19zdGF0ZS0+b3BfaW5mbyA9CisJCSAgICBhY3BpX3BzX2dldF9vcGNvZGVfaW5mbyhvcC0+Y29tbW9uLmFtbF9vcGNvZGUpOworCQlpZiAod2Fsa19zdGF0ZS0+b3BfaW5mby0+ZmxhZ3MgJiBBTUxfTkFNRUQpIHsKKwkJCWlmIChhY3BpX2dibF9kZXB0aCkgeworCQkJCWFjcGlfZ2JsX2RlcHRoLS07CisJCQl9CisKKwkJCWlmIChvcC0+Y29tbW9uLmFtbF9vcGNvZGUgPT0gQU1MX1JFR0lPTl9PUCB8fAorCQkJICAgIG9wLT5jb21tb24uYW1sX29wY29kZSA9PSBBTUxfREFUQV9SRUdJT05fT1ApIHsKKwkJCQkvKgorCQkJCSAqIFNraXAgcGFyc2luZyBvZiBjb250cm9sIG1ldGhvZCBvciBvcHJlZ2lvbiBib2R5LAorCQkJCSAqIGJlY2F1c2Ugd2UgZG9uJ3QgaGF2ZSBlbm91Z2ggaW5mbyBpbiB0aGUgZmlyc3QgcGFzcworCQkJCSAqIHRvIHBhcnNlIHRoZW0gY29ycmVjdGx5LgorCQkJCSAqCisJCQkJICogQ29tcGxldGVkIHBhcnNpbmcgYW4gb3BfcmVnaW9uIGRlY2xhcmF0aW9uLCB3ZSBub3cKKwkJCQkgKiBrbm93IHRoZSBsZW5ndGguCisJCQkJICovCisJCQkJb3AtPm5hbWVkLmxlbmd0aCA9CisJCQkJICAgICh1MzIpIChwYXJzZXJfc3RhdGUtPmFtbCAtIG9wLT5uYW1lZC5kYXRhKTsKKwkJCX0KKwkJfQorCisJCWlmICh3YWxrX3N0YXRlLT5vcF9pbmZvLT5mbGFncyAmIEFNTF9DUkVBVEUpIHsKKwkJCS8qCisJCQkgKiBCYWNrdXAgdG8gYmVnaW5uaW5nIG9mIGNyZWF0ZV94WFhmaWVsZCBkZWNsYXJhdGlvbiAoMSBmb3IKKwkJCSAqIE9wY29kZSkKKwkJCSAqCisJCQkgKiBib2R5X2xlbmd0aCBpcyB1bmtub3duIHVudGlsIHdlIHBhcnNlIHRoZSBib2R5CisJCQkgKi8KKwkJCW9wLT5uYW1lZC5sZW5ndGggPQorCQkJICAgICh1MzIpIChwYXJzZXJfc3RhdGUtPmFtbCAtIG9wLT5uYW1lZC5kYXRhKTsKKwkJfQorCisJCWlmIChvcC0+Y29tbW9uLmFtbF9vcGNvZGUgPT0gQU1MX0JBTktfRklFTERfT1ApIHsKKwkJCS8qCisJCQkgKiBCYWNrdXAgdG8gYmVnaW5uaW5nIG9mIGJhbmtfZmllbGQgZGVjbGFyYXRpb24KKwkJCSAqCisJCQkgKiBib2R5X2xlbmd0aCBpcyB1bmtub3duIHVudGlsIHdlIHBhcnNlIHRoZSBib2R5CisJCQkgKi8KKwkJCW9wLT5uYW1lZC5sZW5ndGggPQorCQkJICAgICh1MzIpIChwYXJzZXJfc3RhdGUtPmFtbCAtIG9wLT5uYW1lZC5kYXRhKTsKKwkJfQorCisJCS8qIFRoaXMgb3AgY29tcGxldGUsIG5vdGlmeSB0aGUgZGlzcGF0Y2hlciAqLworCisJCWlmICh3YWxrX3N0YXRlLT5hc2NlbmRpbmdfY2FsbGJhY2sgIT0gTlVMTCkgeworCQkJd2Fsa19zdGF0ZS0+b3AgPSBvcDsKKwkJCXdhbGtfc3RhdGUtPm9wY29kZSA9IG9wLT5jb21tb24uYW1sX29wY29kZTsKKworCQkJc3RhdHVzID0gd2Fsa19zdGF0ZS0+YXNjZW5kaW5nX2NhbGxiYWNrKHdhbGtfc3RhdGUpOworCQkJc3RhdHVzID0KKwkJCSAgICBhY3BpX3BzX25leHRfcGFyc2Vfc3RhdGUod2Fsa19zdGF0ZSwgb3AsIHN0YXR1cyk7CisJCQlpZiAoc3RhdHVzID09IEFFX0NUUkxfUEVORElORykgeworCQkJCXN0YXR1cyA9IEFFX09LOworCQkJfQorCQl9CisKKwkJc3RhdHVzID0gYWNwaV9wc19jb21wbGV0ZV9vcCh3YWxrX3N0YXRlLCAmb3AsIHN0YXR1cyk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CisJCX0KKworCX0JCQkvKiB3aGlsZSBwYXJzZXJfc3RhdGUtPkFtbCAqLworCisJc3RhdHVzID0gYWNwaV9wc19jb21wbGV0ZV9maW5hbF9vcCh3YWxrX3N0YXRlLCBvcCwgc3RhdHVzKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvcHNvcGNvZGUuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvcHNvcGNvZGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYmMzYTYwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS9wc29wY29kZS5jCkBAIC0wLDAgKzEsODEwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogTW9kdWxlIE5hbWU6IHBzb3Bjb2RlIC0gUGFyc2VyL0ludGVycHJldGVyIG9wY29kZSBpbmZvcm1hdGlvbiB0YWJsZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDgsIEludGVsIENvcnAuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCisgKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSBhdCBtaW5pbXVtIGEgZGlzY2xhaW1lcgorICogICAgc3Vic3RhbnRpYWxseSBzaW1pbGFyIHRvIHRoZSAiTk8gV0FSUkFOVFkiIGRpc2NsYWltZXIgYmVsb3cKKyAqICAgICgiRGlzY2xhaW1lciIpIGFuZCBhbnkgcmVkaXN0cmlidXRpb24gbXVzdCBiZSBjb25kaXRpb25lZCB1cG9uCisgKiAgICBpbmNsdWRpbmcgYSBzdWJzdGFudGlhbGx5IHNpbWlsYXIgRGlzY2xhaW1lciByZXF1aXJlbWVudCBmb3IgZnVydGhlcgorICogICAgYmluYXJ5IHJlZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzCisgKiAgICBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIE5PIFdBUlJBTlRZCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORworICogSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCisgKi8KKworI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgorI2luY2x1ZGUgImFjY29tbW9uLmgiCisjaW5jbHVkZSAiYWNwYXJzZXIuaCIKKyNpbmNsdWRlICJhY29wY29kZS5oIgorI2luY2x1ZGUgImFtbGNvZGUuaCIKKworI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfUEFSU0VSCitBQ1BJX01PRFVMRV9OQU1FKCJwc29wY29kZSIpCisKK3N0YXRpYyBjb25zdCB1OCBhY3BpX2dibF9hcmd1bWVudF9jb3VudFtdID0KKyAgICB7IDAsIDEsIDEsIDEsIDEsIDIsIDIsIDIsIDIsIDMsIDMsIDYgfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBOQU1FOiAgICAgICAgYWNwaV9nYmxfYW1sX29wX2luZm8KKyAqCisgKiBERVNDUklQVElPTjogT3Bjb2RlIHRhYmxlLiBFYWNoIGVudHJ5IGNvbnRhaW5zIDxvcGNvZGUsIHR5cGUsIG5hbWUsIG9wZXJhbmRzPgorICogICAgICAgICAgICAgIFRoZSBuYW1lIGlzIGEgc2ltcGxlIGFzY2lpIHN0cmluZywgdGhlIG9wZXJhbmQgc3BlY2lmaWVyIGlzIGFuCisgKiAgICAgICAgICAgICAgYXNjaWkgc3RyaW5nIHdpdGggb25lIGxldHRlciBwZXIgb3BlcmFuZC4gIFRoZSBsZXR0ZXIgc3BlY2lmaWVzCisgKiAgICAgICAgICAgICAgdGhlIG9wZXJhbmQgdHlwZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogU3VtbWFyeSBvZiBvcGNvZGUgdHlwZXMvZmxhZ3MKKyAqCisKKyBPcGNvZGVzIHRoYXQgaGF2ZSBhc3NvY2lhdGVkIG5hbWVzcGFjZSBvYmplY3RzIChBTUxfTlNPQkpFQ1QgZmxhZykKKworCUFNTF9TQ09QRV9PUAorCUFNTF9ERVZJQ0VfT1AKKwlBTUxfVEhFUk1BTF9aT05FX09QCisJQU1MX01FVEhPRF9PUAorCUFNTF9QT1dFUl9SRVNfT1AKKwlBTUxfUFJPQ0VTU09SX09QCisJQU1MX0ZJRUxEX09QCisJQU1MX0lOREVYX0ZJRUxEX09QCisJQU1MX0JBTktfRklFTERfT1AKKwlBTUxfTkFNRV9PUAorCUFNTF9BTElBU19PUAorCUFNTF9NVVRFWF9PUAorCUFNTF9FVkVOVF9PUAorCUFNTF9SRUdJT05fT1AKKwlBTUxfQ1JFQVRFX0ZJRUxEX09QCisJQU1MX0NSRUFURV9CSVRfRklFTERfT1AKKwlBTUxfQ1JFQVRFX0JZVEVfRklFTERfT1AKKwlBTUxfQ1JFQVRFX1dPUkRfRklFTERfT1AKKwlBTUxfQ1JFQVRFX0RXT1JEX0ZJRUxEX09QCisJQU1MX0NSRUFURV9RV09SRF9GSUVMRF9PUAorCUFNTF9JTlRfTkFNRURGSUVMRF9PUAorCUFNTF9JTlRfTUVUSE9EQ0FMTF9PUAorCUFNTF9JTlRfTkFNRVBBVEhfT1AKKworICBPcGNvZGVzIHRoYXQgYXJlICJuYW1lc3BhY2UiIG9wY29kZXMgKEFNTF9OU09QQ09ERSBmbGFnKQorCisJQU1MX1NDT1BFX09QCisJQU1MX0RFVklDRV9PUAorCUFNTF9USEVSTUFMX1pPTkVfT1AKKwlBTUxfTUVUSE9EX09QCisJQU1MX1BPV0VSX1JFU19PUAorCUFNTF9QUk9DRVNTT1JfT1AKKwlBTUxfRklFTERfT1AKKwlBTUxfSU5ERVhfRklFTERfT1AKKwlBTUxfQkFOS19GSUVMRF9PUAorCUFNTF9OQU1FX09QCisJQU1MX0FMSUFTX09QCisJQU1MX01VVEVYX09QCisJQU1MX0VWRU5UX09QCisJQU1MX1JFR0lPTl9PUAorCUFNTF9JTlRfTkFNRURGSUVMRF9PUAorCisgIE9wY29kZXMgdGhhdCBoYXZlIGFuIGFzc29jaWF0ZWQgbmFtZXNwYWNlIG5vZGUgKEFNTF9OU05PREUgZmxhZykKKworCUFNTF9TQ09QRV9PUAorCUFNTF9ERVZJQ0VfT1AKKwlBTUxfVEhFUk1BTF9aT05FX09QCisJQU1MX01FVEhPRF9PUAorCUFNTF9QT1dFUl9SRVNfT1AKKwlBTUxfUFJPQ0VTU09SX09QCisJQU1MX05BTUVfT1AKKwlBTUxfQUxJQVNfT1AKKwlBTUxfTVVURVhfT1AKKwlBTUxfRVZFTlRfT1AKKwlBTUxfUkVHSU9OX09QCisJQU1MX0NSRUFURV9GSUVMRF9PUAorCUFNTF9DUkVBVEVfQklUX0ZJRUxEX09QCisJQU1MX0NSRUFURV9CWVRFX0ZJRUxEX09QCisJQU1MX0NSRUFURV9XT1JEX0ZJRUxEX09QCisJQU1MX0NSRUFURV9EV09SRF9GSUVMRF9PUAorCUFNTF9DUkVBVEVfUVdPUkRfRklFTERfT1AKKwlBTUxfSU5UX05BTUVERklFTERfT1AKKwlBTUxfSU5UX01FVEhPRENBTExfT1AKKwlBTUxfSU5UX05BTUVQQVRIX09QCisKKyAgT3Bjb2RlcyB0aGF0IGRlZmluZSBuYW1lZCBBQ1BJIG9iamVjdHMgKEFNTF9OQU1FRCBmbGFnKQorCisJQU1MX1NDT1BFX09QCisJQU1MX0RFVklDRV9PUAorCUFNTF9USEVSTUFMX1pPTkVfT1AKKwlBTUxfTUVUSE9EX09QCisJQU1MX1BPV0VSX1JFU19PUAorCUFNTF9QUk9DRVNTT1JfT1AKKwlBTUxfTkFNRV9PUAorCUFNTF9BTElBU19PUAorCUFNTF9NVVRFWF9PUAorCUFNTF9FVkVOVF9PUAorCUFNTF9SRUdJT05fT1AKKwlBTUxfSU5UX05BTUVERklFTERfT1AKKworICBPcGNvZGVzIHRoYXQgY29udGFpbiBleGVjdXRhYmxlIEFNTCBhcyBwYXJ0IG9mIHRoZSBkZWZpbml0aW9uIHRoYXQKKyAgbXVzdCBiZSBkZWZlcnJlZCB1bnRpbCBuZWVkZWQKKworCUFNTF9NRVRIT0RfT1AKKwlBTUxfVkFSX1BBQ0tBR0VfT1AKKwlBTUxfQ1JFQVRFX0ZJRUxEX09QCisJQU1MX0NSRUFURV9CSVRfRklFTERfT1AKKwlBTUxfQ1JFQVRFX0JZVEVfRklFTERfT1AKKwlBTUxfQ1JFQVRFX1dPUkRfRklFTERfT1AKKwlBTUxfQ1JFQVRFX0RXT1JEX0ZJRUxEX09QCisJQU1MX0NSRUFURV9RV09SRF9GSUVMRF9PUAorCUFNTF9SRUdJT05fT1AKKwlBTUxfQlVGRkVSX09QCisKKyAgRmllbGQgb3Bjb2RlcworCisJQU1MX0NSRUFURV9GSUVMRF9PUAorCUFNTF9GSUVMRF9PUAorCUFNTF9JTkRFWF9GSUVMRF9PUAorCUFNTF9CQU5LX0ZJRUxEX09QCisKKyAgRmllbGQgIkNyZWF0ZSIgb3Bjb2RlcworCisJQU1MX0NSRUFURV9GSUVMRF9PUAorCUFNTF9DUkVBVEVfQklUX0ZJRUxEX09QCisJQU1MX0NSRUFURV9CWVRFX0ZJRUxEX09QCisJQU1MX0NSRUFURV9XT1JEX0ZJRUxEX09QCisJQU1MX0NSRUFURV9EV09SRF9GSUVMRF9PUAorCUFNTF9DUkVBVEVfUVdPUkRfRklFTERfT1AKKworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIE1hc3RlciBPcGNvZGUgaW5mb3JtYXRpb24gdGFibGUuICBBIHN1bW1hcnkgb2YgZXZlcnl0aGluZyB3ZSBrbm93IGFib3V0IGVhY2gKKyAqIG9wY29kZSwgYWxsIGluIG9uZSBwbGFjZS4KKyAqLworY29uc3Qgc3RydWN0IGFjcGlfb3Bjb2RlX2luZm8gYWNwaV9nYmxfYW1sX29wX2luZm9bQU1MX05VTV9PUENPREVTXSA9IHsKKy8qISBbQmVnaW5dIG5vIHNvdXJjZSBjb2RlIHRyYW5zbGF0aW9uICovCisvKiBJbmRleCAgICAgICAgICAgTmFtZSAgICAgICAgICAgICAgICAgUGFyc2VyIEFyZ3MgICAgICAgICAgICAgICBJbnRlcnByZXRlciBBcmdzICAgICAgICAgICAgICAgIE9iamVjdFR5cGUgICAgICAgICAgICAgICAgICAgIENsYXNzICAgICAgICAgICAgICAgICAgICAgIFR5cGUgICAgICAgICAgICAgICAgICBGbGFncyAqLworCisvKiAwMCAqLyBBQ1BJX09QKCJaZXJvIiwgQVJHUF9aRVJPX09QLCBBUkdJX1pFUk9fT1AsIEFDUElfVFlQRV9JTlRFR0VSLAorCQkgQU1MX0NMQVNTX0FSR1VNRU5ULCBBTUxfVFlQRV9DT05TVEFOVCwgQU1MX0NPTlNUQU5UKSwKKy8qIDAxICovIEFDUElfT1AoIk9uZSIsIEFSR1BfT05FX09QLCBBUkdJX09ORV9PUCwgQUNQSV9UWVBFX0lOVEVHRVIsCisJCSBBTUxfQ0xBU1NfQVJHVU1FTlQsIEFNTF9UWVBFX0NPTlNUQU5ULCBBTUxfQ09OU1RBTlQpLAorLyogMDIgKi8gQUNQSV9PUCgiQWxpYXMiLCBBUkdQX0FMSUFTX09QLCBBUkdJX0FMSUFTX09QLAorCQkgQUNQSV9UWVBFX0xPQ0FMX0FMSUFTLCBBTUxfQ0xBU1NfTkFNRURfT0JKRUNULAorCQkgQU1MX1RZUEVfTkFNRURfU0lNUExFLAorCQkgQU1MX0hBU19BUkdTIHwgQU1MX05TT0JKRUNUIHwgQU1MX05TT1BDT0RFIHwKKwkJIEFNTF9OU05PREUgfCBBTUxfTkFNRUQpLAorLyogMDMgKi8gQUNQSV9PUCgiTmFtZSIsIEFSR1BfTkFNRV9PUCwgQVJHSV9OQU1FX09QLCBBQ1BJX1RZUEVfQU5ZLAorCQkgQU1MX0NMQVNTX05BTUVEX09CSkVDVCwgQU1MX1RZUEVfTkFNRURfQ09NUExFWCwKKwkJIEFNTF9IQVNfQVJHUyB8IEFNTF9OU09CSkVDVCB8IEFNTF9OU09QQ09ERSB8CisJCSBBTUxfTlNOT0RFIHwgQU1MX05BTUVEKSwKKy8qIDA0ICovIEFDUElfT1AoIkJ5dGVDb25zdCIsIEFSR1BfQllURV9PUCwgQVJHSV9CWVRFX09QLAorCQkgQUNQSV9UWVBFX0lOVEVHRVIsIEFNTF9DTEFTU19BUkdVTUVOVCwKKwkJIEFNTF9UWVBFX0xJVEVSQUwsIEFNTF9DT05TVEFOVCksCisvKiAwNSAqLyBBQ1BJX09QKCJXb3JkQ29uc3QiLCBBUkdQX1dPUkRfT1AsIEFSR0lfV09SRF9PUCwKKwkJIEFDUElfVFlQRV9JTlRFR0VSLCBBTUxfQ0xBU1NfQVJHVU1FTlQsCisJCSBBTUxfVFlQRV9MSVRFUkFMLCBBTUxfQ09OU1RBTlQpLAorLyogMDYgKi8gQUNQSV9PUCgiRHdvcmRDb25zdCIsIEFSR1BfRFdPUkRfT1AsIEFSR0lfRFdPUkRfT1AsCisJCSBBQ1BJX1RZUEVfSU5URUdFUiwgQU1MX0NMQVNTX0FSR1VNRU5ULAorCQkgQU1MX1RZUEVfTElURVJBTCwgQU1MX0NPTlNUQU5UKSwKKy8qIDA3ICovIEFDUElfT1AoIlN0cmluZyIsIEFSR1BfU1RSSU5HX09QLCBBUkdJX1NUUklOR19PUCwKKwkJIEFDUElfVFlQRV9TVFJJTkcsIEFNTF9DTEFTU19BUkdVTUVOVCwKKwkJIEFNTF9UWVBFX0xJVEVSQUwsIEFNTF9DT05TVEFOVCksCisvKiAwOCAqLyBBQ1BJX09QKCJTY29wZSIsIEFSR1BfU0NPUEVfT1AsIEFSR0lfU0NPUEVfT1AsCisJCSBBQ1BJX1RZUEVfTE9DQUxfU0NPUEUsIEFNTF9DTEFTU19OQU1FRF9PQkpFQ1QsCisJCSBBTUxfVFlQRV9OQU1FRF9OT19PQkosCisJCSBBTUxfSEFTX0FSR1MgfCBBTUxfTlNPQkpFQ1QgfCBBTUxfTlNPUENPREUgfAorCQkgQU1MX05TTk9ERSB8IEFNTF9OQU1FRCksCisvKiAwOSAqLyBBQ1BJX09QKCJCdWZmZXIiLCBBUkdQX0JVRkZFUl9PUCwgQVJHSV9CVUZGRVJfT1AsCisJCSBBQ1BJX1RZUEVfQlVGRkVSLCBBTUxfQ0xBU1NfQ1JFQVRFLAorCQkgQU1MX1RZUEVfQ1JFQVRFX09CSkVDVCwKKwkJIEFNTF9IQVNfQVJHUyB8IEFNTF9ERUZFUiB8IEFNTF9DT05TVEFOVCksCisvKiAwQSAqLyBBQ1BJX09QKCJQYWNrYWdlIiwgQVJHUF9QQUNLQUdFX09QLCBBUkdJX1BBQ0tBR0VfT1AsCisJCSBBQ1BJX1RZUEVfUEFDS0FHRSwgQU1MX0NMQVNTX0NSRUFURSwKKwkJIEFNTF9UWVBFX0NSRUFURV9PQkpFQ1QsCisJCSBBTUxfSEFTX0FSR1MgfCBBTUxfREVGRVIgfCBBTUxfQ09OU1RBTlQpLAorLyogMEIgKi8gQUNQSV9PUCgiTWV0aG9kIiwgQVJHUF9NRVRIT0RfT1AsIEFSR0lfTUVUSE9EX09QLAorCQkgQUNQSV9UWVBFX01FVEhPRCwgQU1MX0NMQVNTX05BTUVEX09CSkVDVCwKKwkJIEFNTF9UWVBFX05BTUVEX0NPTVBMRVgsCisJCSBBTUxfSEFTX0FSR1MgfCBBTUxfTlNPQkpFQ1QgfCBBTUxfTlNPUENPREUgfAorCQkgQU1MX05TTk9ERSB8IEFNTF9OQU1FRCB8IEFNTF9ERUZFUiksCisvKiAwQyAqLyBBQ1BJX09QKCJMb2NhbDAiLCBBUkdQX0xPQ0FMMCwgQVJHSV9MT0NBTDAsCisJCSBBQ1BJX1RZUEVfTE9DQUxfUkVGRVJFTkNFLCBBTUxfQ0xBU1NfQVJHVU1FTlQsCisJCSBBTUxfVFlQRV9MT0NBTF9WQVJJQUJMRSwgMCksCisvKiAwRCAqLyBBQ1BJX09QKCJMb2NhbDEiLCBBUkdQX0xPQ0FMMSwgQVJHSV9MT0NBTDEsCisJCSBBQ1BJX1RZUEVfTE9DQUxfUkVGRVJFTkNFLCBBTUxfQ0xBU1NfQVJHVU1FTlQsCisJCSBBTUxfVFlQRV9MT0NBTF9WQVJJQUJMRSwgMCksCisvKiAwRSAqLyBBQ1BJX09QKCJMb2NhbDIiLCBBUkdQX0xPQ0FMMiwgQVJHSV9MT0NBTDIsCisJCSBBQ1BJX1RZUEVfTE9DQUxfUkVGRVJFTkNFLCBBTUxfQ0xBU1NfQVJHVU1FTlQsCisJCSBBTUxfVFlQRV9MT0NBTF9WQVJJQUJMRSwgMCksCisvKiAwRiAqLyBBQ1BJX09QKCJMb2NhbDMiLCBBUkdQX0xPQ0FMMywgQVJHSV9MT0NBTDMsCisJCSBBQ1BJX1RZUEVfTE9DQUxfUkVGRVJFTkNFLCBBTUxfQ0xBU1NfQVJHVU1FTlQsCisJCSBBTUxfVFlQRV9MT0NBTF9WQVJJQUJMRSwgMCksCisvKiAxMCAqLyBBQ1BJX09QKCJMb2NhbDQiLCBBUkdQX0xPQ0FMNCwgQVJHSV9MT0NBTDQsCisJCSBBQ1BJX1RZUEVfTE9DQUxfUkVGRVJFTkNFLCBBTUxfQ0xBU1NfQVJHVU1FTlQsCisJCSBBTUxfVFlQRV9MT0NBTF9WQVJJQUJMRSwgMCksCisvKiAxMSAqLyBBQ1BJX09QKCJMb2NhbDUiLCBBUkdQX0xPQ0FMNSwgQVJHSV9MT0NBTDUsCisJCSBBQ1BJX1RZUEVfTE9DQUxfUkVGRVJFTkNFLCBBTUxfQ0xBU1NfQVJHVU1FTlQsCisJCSBBTUxfVFlQRV9MT0NBTF9WQVJJQUJMRSwgMCksCisvKiAxMiAqLyBBQ1BJX09QKCJMb2NhbDYiLCBBUkdQX0xPQ0FMNiwgQVJHSV9MT0NBTDYsCisJCSBBQ1BJX1RZUEVfTE9DQUxfUkVGRVJFTkNFLCBBTUxfQ0xBU1NfQVJHVU1FTlQsCisJCSBBTUxfVFlQRV9MT0NBTF9WQVJJQUJMRSwgMCksCisvKiAxMyAqLyBBQ1BJX09QKCJMb2NhbDciLCBBUkdQX0xPQ0FMNywgQVJHSV9MT0NBTDcsCisJCSBBQ1BJX1RZUEVfTE9DQUxfUkVGRVJFTkNFLCBBTUxfQ0xBU1NfQVJHVU1FTlQsCisJCSBBTUxfVFlQRV9MT0NBTF9WQVJJQUJMRSwgMCksCisvKiAxNCAqLyBBQ1BJX09QKCJBcmcwIiwgQVJHUF9BUkcwLCBBUkdJX0FSRzAsCisJCSBBQ1BJX1RZUEVfTE9DQUxfUkVGRVJFTkNFLCBBTUxfQ0xBU1NfQVJHVU1FTlQsCisJCSBBTUxfVFlQRV9NRVRIT0RfQVJHVU1FTlQsIDApLAorLyogMTUgKi8gQUNQSV9PUCgiQXJnMSIsIEFSR1BfQVJHMSwgQVJHSV9BUkcxLAorCQkgQUNQSV9UWVBFX0xPQ0FMX1JFRkVSRU5DRSwgQU1MX0NMQVNTX0FSR1VNRU5ULAorCQkgQU1MX1RZUEVfTUVUSE9EX0FSR1VNRU5ULCAwKSwKKy8qIDE2ICovIEFDUElfT1AoIkFyZzIiLCBBUkdQX0FSRzIsIEFSR0lfQVJHMiwKKwkJIEFDUElfVFlQRV9MT0NBTF9SRUZFUkVOQ0UsIEFNTF9DTEFTU19BUkdVTUVOVCwKKwkJIEFNTF9UWVBFX01FVEhPRF9BUkdVTUVOVCwgMCksCisvKiAxNyAqLyBBQ1BJX09QKCJBcmczIiwgQVJHUF9BUkczLCBBUkdJX0FSRzMsCisJCSBBQ1BJX1RZUEVfTE9DQUxfUkVGRVJFTkNFLCBBTUxfQ0xBU1NfQVJHVU1FTlQsCisJCSBBTUxfVFlQRV9NRVRIT0RfQVJHVU1FTlQsIDApLAorLyogMTggKi8gQUNQSV9PUCgiQXJnNCIsIEFSR1BfQVJHNCwgQVJHSV9BUkc0LAorCQkgQUNQSV9UWVBFX0xPQ0FMX1JFRkVSRU5DRSwgQU1MX0NMQVNTX0FSR1VNRU5ULAorCQkgQU1MX1RZUEVfTUVUSE9EX0FSR1VNRU5ULCAwKSwKKy8qIDE5ICovIEFDUElfT1AoIkFyZzUiLCBBUkdQX0FSRzUsIEFSR0lfQVJHNSwKKwkJIEFDUElfVFlQRV9MT0NBTF9SRUZFUkVOQ0UsIEFNTF9DTEFTU19BUkdVTUVOVCwKKwkJIEFNTF9UWVBFX01FVEhPRF9BUkdVTUVOVCwgMCksCisvKiAxQSAqLyBBQ1BJX09QKCJBcmc2IiwgQVJHUF9BUkc2LCBBUkdJX0FSRzYsCisJCSBBQ1BJX1RZUEVfTE9DQUxfUkVGRVJFTkNFLCBBTUxfQ0xBU1NfQVJHVU1FTlQsCisJCSBBTUxfVFlQRV9NRVRIT0RfQVJHVU1FTlQsIDApLAorLyogMUIgKi8gQUNQSV9PUCgiU3RvcmUiLCBBUkdQX1NUT1JFX09QLCBBUkdJX1NUT1JFX09QLCBBQ1BJX1RZUEVfQU5ZLAorCQkgQU1MX0NMQVNTX0VYRUNVVEUsIEFNTF9UWVBFX0VYRUNfMUFfMVRfMVIsCisJCSBBTUxfRkxBR1NfRVhFQ18xQV8xVF8xUiksCisvKiAxQyAqLyBBQ1BJX09QKCJSZWZPZiIsIEFSR1BfUkVGX09GX09QLCBBUkdJX1JFRl9PRl9PUCwgQUNQSV9UWVBFX0FOWSwKKwkJIEFNTF9DTEFTU19FWEVDVVRFLCBBTUxfVFlQRV9FWEVDXzFBXzBUXzFSLAorCQkgQU1MX0ZMQUdTX0VYRUNfMUFfMFRfMVIpLAorLyogMUQgKi8gQUNQSV9PUCgiQWRkIiwgQVJHUF9BRERfT1AsIEFSR0lfQUREX09QLCBBQ1BJX1RZUEVfQU5ZLAorCQkgQU1MX0NMQVNTX0VYRUNVVEUsIEFNTF9UWVBFX0VYRUNfMkFfMVRfMVIsCisJCSBBTUxfRkxBR1NfRVhFQ18yQV8xVF8xUiB8IEFNTF9NQVRIIHwgQU1MX0NPTlNUQU5UKSwKKy8qIDFFICovIEFDUElfT1AoIkNvbmNhdGVuYXRlIiwgQVJHUF9DT05DQVRfT1AsIEFSR0lfQ09OQ0FUX09QLAorCQkgQUNQSV9UWVBFX0FOWSwgQU1MX0NMQVNTX0VYRUNVVEUsCisJCSBBTUxfVFlQRV9FWEVDXzJBXzFUXzFSLAorCQkgQU1MX0ZMQUdTX0VYRUNfMkFfMVRfMVIgfCBBTUxfQ09OU1RBTlQpLAorLyogMUYgKi8gQUNQSV9PUCgiU3VidHJhY3QiLCBBUkdQX1NVQlRSQUNUX09QLCBBUkdJX1NVQlRSQUNUX09QLAorCQkgQUNQSV9UWVBFX0FOWSwgQU1MX0NMQVNTX0VYRUNVVEUsCisJCSBBTUxfVFlQRV9FWEVDXzJBXzFUXzFSLAorCQkgQU1MX0ZMQUdTX0VYRUNfMkFfMVRfMVIgfCBBTUxfTUFUSCB8IEFNTF9DT05TVEFOVCksCisvKiAyMCAqLyBBQ1BJX09QKCJJbmNyZW1lbnQiLCBBUkdQX0lOQ1JFTUVOVF9PUCwgQVJHSV9JTkNSRU1FTlRfT1AsCisJCSBBQ1BJX1RZUEVfQU5ZLCBBTUxfQ0xBU1NfRVhFQ1VURSwKKwkJIEFNTF9UWVBFX0VYRUNfMUFfMFRfMVIsCisJCSBBTUxfRkxBR1NfRVhFQ18xQV8wVF8xUiB8IEFNTF9DT05TVEFOVCksCisvKiAyMSAqLyBBQ1BJX09QKCJEZWNyZW1lbnQiLCBBUkdQX0RFQ1JFTUVOVF9PUCwgQVJHSV9ERUNSRU1FTlRfT1AsCisJCSBBQ1BJX1RZUEVfQU5ZLCBBTUxfQ0xBU1NfRVhFQ1VURSwKKwkJIEFNTF9UWVBFX0VYRUNfMUFfMFRfMVIsCisJCSBBTUxfRkxBR1NfRVhFQ18xQV8wVF8xUiB8IEFNTF9DT05TVEFOVCksCisvKiAyMiAqLyBBQ1BJX09QKCJNdWx0aXBseSIsIEFSR1BfTVVMVElQTFlfT1AsIEFSR0lfTVVMVElQTFlfT1AsCisJCSBBQ1BJX1RZUEVfQU5ZLCBBTUxfQ0xBU1NfRVhFQ1VURSwKKwkJIEFNTF9UWVBFX0VYRUNfMkFfMVRfMVIsCisJCSBBTUxfRkxBR1NfRVhFQ18yQV8xVF8xUiB8IEFNTF9NQVRIIHwgQU1MX0NPTlNUQU5UKSwKKy8qIDIzICovIEFDUElfT1AoIkRpdmlkZSIsIEFSR1BfRElWSURFX09QLCBBUkdJX0RJVklERV9PUCwKKwkJIEFDUElfVFlQRV9BTlksIEFNTF9DTEFTU19FWEVDVVRFLAorCQkgQU1MX1RZUEVfRVhFQ18yQV8yVF8xUiwKKwkJIEFNTF9GTEFHU19FWEVDXzJBXzJUXzFSIHwgQU1MX0NPTlNUQU5UKSwKKy8qIDI0ICovIEFDUElfT1AoIlNoaWZ0TGVmdCIsIEFSR1BfU0hJRlRfTEVGVF9PUCwgQVJHSV9TSElGVF9MRUZUX09QLAorCQkgQUNQSV9UWVBFX0FOWSwgQU1MX0NMQVNTX0VYRUNVVEUsCisJCSBBTUxfVFlQRV9FWEVDXzJBXzFUXzFSLAorCQkgQU1MX0ZMQUdTX0VYRUNfMkFfMVRfMVIgfCBBTUxfTUFUSCB8IEFNTF9DT05TVEFOVCksCisvKiAyNSAqLyBBQ1BJX09QKCJTaGlmdFJpZ2h0IiwgQVJHUF9TSElGVF9SSUdIVF9PUCwgQVJHSV9TSElGVF9SSUdIVF9PUCwKKwkJIEFDUElfVFlQRV9BTlksIEFNTF9DTEFTU19FWEVDVVRFLAorCQkgQU1MX1RZUEVfRVhFQ18yQV8xVF8xUiwKKwkJIEFNTF9GTEFHU19FWEVDXzJBXzFUXzFSIHwgQU1MX01BVEggfCBBTUxfQ09OU1RBTlQpLAorLyogMjYgKi8gQUNQSV9PUCgiQW5kIiwgQVJHUF9CSVRfQU5EX09QLCBBUkdJX0JJVF9BTkRfT1AsIEFDUElfVFlQRV9BTlksCisJCSBBTUxfQ0xBU1NfRVhFQ1VURSwgQU1MX1RZUEVfRVhFQ18yQV8xVF8xUiwKKwkJIEFNTF9GTEFHU19FWEVDXzJBXzFUXzFSIHwgQU1MX01BVEggfCBBTUxfQ09OU1RBTlQpLAorLyogMjcgKi8gQUNQSV9PUCgiTkFuZCIsIEFSR1BfQklUX05BTkRfT1AsIEFSR0lfQklUX05BTkRfT1AsCisJCSBBQ1BJX1RZUEVfQU5ZLCBBTUxfQ0xBU1NfRVhFQ1VURSwKKwkJIEFNTF9UWVBFX0VYRUNfMkFfMVRfMVIsCisJCSBBTUxfRkxBR1NfRVhFQ18yQV8xVF8xUiB8IEFNTF9NQVRIIHwgQU1MX0NPTlNUQU5UKSwKKy8qIDI4ICovIEFDUElfT1AoIk9yIiwgQVJHUF9CSVRfT1JfT1AsIEFSR0lfQklUX09SX09QLCBBQ1BJX1RZUEVfQU5ZLAorCQkgQU1MX0NMQVNTX0VYRUNVVEUsIEFNTF9UWVBFX0VYRUNfMkFfMVRfMVIsCisJCSBBTUxfRkxBR1NfRVhFQ18yQV8xVF8xUiB8IEFNTF9NQVRIIHwgQU1MX0NPTlNUQU5UKSwKKy8qIDI5ICovIEFDUElfT1AoIk5PciIsIEFSR1BfQklUX05PUl9PUCwgQVJHSV9CSVRfTk9SX09QLCBBQ1BJX1RZUEVfQU5ZLAorCQkgQU1MX0NMQVNTX0VYRUNVVEUsIEFNTF9UWVBFX0VYRUNfMkFfMVRfMVIsCisJCSBBTUxfRkxBR1NfRVhFQ18yQV8xVF8xUiB8IEFNTF9NQVRIIHwgQU1MX0NPTlNUQU5UKSwKKy8qIDJBICovIEFDUElfT1AoIlhPciIsIEFSR1BfQklUX1hPUl9PUCwgQVJHSV9CSVRfWE9SX09QLCBBQ1BJX1RZUEVfQU5ZLAorCQkgQU1MX0NMQVNTX0VYRUNVVEUsIEFNTF9UWVBFX0VYRUNfMkFfMVRfMVIsCisJCSBBTUxfRkxBR1NfRVhFQ18yQV8xVF8xUiB8IEFNTF9NQVRIIHwgQU1MX0NPTlNUQU5UKSwKKy8qIDJCICovIEFDUElfT1AoIk5vdCIsIEFSR1BfQklUX05PVF9PUCwgQVJHSV9CSVRfTk9UX09QLCBBQ1BJX1RZUEVfQU5ZLAorCQkgQU1MX0NMQVNTX0VYRUNVVEUsIEFNTF9UWVBFX0VYRUNfMUFfMVRfMVIsCisJCSBBTUxfRkxBR1NfRVhFQ18xQV8xVF8xUiB8IEFNTF9DT05TVEFOVCksCisvKiAyQyAqLyBBQ1BJX09QKCJGaW5kU2V0TGVmdEJpdCIsIEFSR1BfRklORF9TRVRfTEVGVF9CSVRfT1AsCisJCSBBUkdJX0ZJTkRfU0VUX0xFRlRfQklUX09QLCBBQ1BJX1RZUEVfQU5ZLAorCQkgQU1MX0NMQVNTX0VYRUNVVEUsIEFNTF9UWVBFX0VYRUNfMUFfMVRfMVIsCisJCSBBTUxfRkxBR1NfRVhFQ18xQV8xVF8xUiB8IEFNTF9DT05TVEFOVCksCisvKiAyRCAqLyBBQ1BJX09QKCJGaW5kU2V0UmlnaHRCaXQiLCBBUkdQX0ZJTkRfU0VUX1JJR0hUX0JJVF9PUCwKKwkJIEFSR0lfRklORF9TRVRfUklHSFRfQklUX09QLCBBQ1BJX1RZUEVfQU5ZLAorCQkgQU1MX0NMQVNTX0VYRUNVVEUsIEFNTF9UWVBFX0VYRUNfMUFfMVRfMVIsCisJCSBBTUxfRkxBR1NfRVhFQ18xQV8xVF8xUiB8IEFNTF9DT05TVEFOVCksCisvKiAyRSAqLyBBQ1BJX09QKCJEZXJlZk9mIiwgQVJHUF9ERVJFRl9PRl9PUCwgQVJHSV9ERVJFRl9PRl9PUCwKKwkJIEFDUElfVFlQRV9BTlksIEFNTF9DTEFTU19FWEVDVVRFLAorCQkgQU1MX1RZUEVfRVhFQ18xQV8wVF8xUiwgQU1MX0ZMQUdTX0VYRUNfMUFfMFRfMVIpLAorLyogMkYgKi8gQUNQSV9PUCgiTm90aWZ5IiwgQVJHUF9OT1RJRllfT1AsIEFSR0lfTk9USUZZX09QLAorCQkgQUNQSV9UWVBFX0FOWSwgQU1MX0NMQVNTX0VYRUNVVEUsCisJCSBBTUxfVFlQRV9FWEVDXzJBXzBUXzBSLCBBTUxfRkxBR1NfRVhFQ18yQV8wVF8wUiksCisvKiAzMCAqLyBBQ1BJX09QKCJTaXplT2YiLCBBUkdQX1NJWkVfT0ZfT1AsIEFSR0lfU0laRV9PRl9PUCwKKwkJIEFDUElfVFlQRV9BTlksIEFNTF9DTEFTU19FWEVDVVRFLAorCQkgQU1MX1RZUEVfRVhFQ18xQV8wVF8xUiwKKwkJIEFNTF9GTEFHU19FWEVDXzFBXzBUXzFSIHwgQU1MX05PX09QRVJBTkRfUkVTT0xWRSksCisvKiAzMSAqLyBBQ1BJX09QKCJJbmRleCIsIEFSR1BfSU5ERVhfT1AsIEFSR0lfSU5ERVhfT1AsIEFDUElfVFlQRV9BTlksCisJCSBBTUxfQ0xBU1NfRVhFQ1VURSwgQU1MX1RZUEVfRVhFQ18yQV8xVF8xUiwKKwkJIEFNTF9GTEFHU19FWEVDXzJBXzFUXzFSKSwKKy8qIDMyICovIEFDUElfT1AoIk1hdGNoIiwgQVJHUF9NQVRDSF9PUCwgQVJHSV9NQVRDSF9PUCwgQUNQSV9UWVBFX0FOWSwKKwkJIEFNTF9DTEFTU19FWEVDVVRFLCBBTUxfVFlQRV9FWEVDXzZBXzBUXzFSLAorCQkgQU1MX0ZMQUdTX0VYRUNfNkFfMFRfMVIgfCBBTUxfQ09OU1RBTlQpLAorLyogMzMgKi8gQUNQSV9PUCgiQ3JlYXRlRFdvcmRGaWVsZCIsIEFSR1BfQ1JFQVRFX0RXT1JEX0ZJRUxEX09QLAorCQkgQVJHSV9DUkVBVEVfRFdPUkRfRklFTERfT1AsCisJCSBBQ1BJX1RZUEVfQlVGRkVSX0ZJRUxELCBBTUxfQ0xBU1NfQ1JFQVRFLAorCQkgQU1MX1RZUEVfQ1JFQVRFX0ZJRUxELAorCQkgQU1MX0hBU19BUkdTIHwgQU1MX05TT0JKRUNUIHwgQU1MX05TTk9ERSB8CisJCSBBTUxfREVGRVIgfCBBTUxfQ1JFQVRFKSwKKy8qIDM0ICovIEFDUElfT1AoIkNyZWF0ZVdvcmRGaWVsZCIsIEFSR1BfQ1JFQVRFX1dPUkRfRklFTERfT1AsCisJCSBBUkdJX0NSRUFURV9XT1JEX0ZJRUxEX09QLAorCQkgQUNQSV9UWVBFX0JVRkZFUl9GSUVMRCwgQU1MX0NMQVNTX0NSRUFURSwKKwkJIEFNTF9UWVBFX0NSRUFURV9GSUVMRCwKKwkJIEFNTF9IQVNfQVJHUyB8IEFNTF9OU09CSkVDVCB8IEFNTF9OU05PREUgfAorCQkgQU1MX0RFRkVSIHwgQU1MX0NSRUFURSksCisvKiAzNSAqLyBBQ1BJX09QKCJDcmVhdGVCeXRlRmllbGQiLCBBUkdQX0NSRUFURV9CWVRFX0ZJRUxEX09QLAorCQkgQVJHSV9DUkVBVEVfQllURV9GSUVMRF9PUCwKKwkJIEFDUElfVFlQRV9CVUZGRVJfRklFTEQsIEFNTF9DTEFTU19DUkVBVEUsCisJCSBBTUxfVFlQRV9DUkVBVEVfRklFTEQsCisJCSBBTUxfSEFTX0FSR1MgfCBBTUxfTlNPQkpFQ1QgfCBBTUxfTlNOT0RFIHwKKwkJIEFNTF9ERUZFUiB8IEFNTF9DUkVBVEUpLAorLyogMzYgKi8gQUNQSV9PUCgiQ3JlYXRlQml0RmllbGQiLCBBUkdQX0NSRUFURV9CSVRfRklFTERfT1AsCisJCSBBUkdJX0NSRUFURV9CSVRfRklFTERfT1AsCisJCSBBQ1BJX1RZUEVfQlVGRkVSX0ZJRUxELCBBTUxfQ0xBU1NfQ1JFQVRFLAorCQkgQU1MX1RZUEVfQ1JFQVRFX0ZJRUxELAorCQkgQU1MX0hBU19BUkdTIHwgQU1MX05TT0JKRUNUIHwgQU1MX05TTk9ERSB8CisJCSBBTUxfREVGRVIgfCBBTUxfQ1JFQVRFKSwKKy8qIDM3ICovIEFDUElfT1AoIk9iamVjdFR5cGUiLCBBUkdQX1RZUEVfT1AsIEFSR0lfVFlQRV9PUCwKKwkJIEFDUElfVFlQRV9BTlksIEFNTF9DTEFTU19FWEVDVVRFLAorCQkgQU1MX1RZUEVfRVhFQ18xQV8wVF8xUiwKKwkJIEFNTF9GTEFHU19FWEVDXzFBXzBUXzFSIHwgQU1MX05PX09QRVJBTkRfUkVTT0xWRSksCisvKiAzOCAqLyBBQ1BJX09QKCJMQW5kIiwgQVJHUF9MQU5EX09QLCBBUkdJX0xBTkRfT1AsIEFDUElfVFlQRV9BTlksCisJCSBBTUxfQ0xBU1NfRVhFQ1VURSwgQU1MX1RZUEVfRVhFQ18yQV8wVF8xUiwKKwkJIEFNTF9GTEFHU19FWEVDXzJBXzBUXzFSIHwgQU1MX0xPR0lDQUxfTlVNRVJJQyB8IEFNTF9DT05TVEFOVCksCisvKiAzOSAqLyBBQ1BJX09QKCJMT3IiLCBBUkdQX0xPUl9PUCwgQVJHSV9MT1JfT1AsIEFDUElfVFlQRV9BTlksCisJCSBBTUxfQ0xBU1NfRVhFQ1VURSwgQU1MX1RZUEVfRVhFQ18yQV8wVF8xUiwKKwkJIEFNTF9GTEFHU19FWEVDXzJBXzBUXzFSIHwgQU1MX0xPR0lDQUxfTlVNRVJJQyB8IEFNTF9DT05TVEFOVCksCisvKiAzQSAqLyBBQ1BJX09QKCJMTm90IiwgQVJHUF9MTk9UX09QLCBBUkdJX0xOT1RfT1AsIEFDUElfVFlQRV9BTlksCisJCSBBTUxfQ0xBU1NfRVhFQ1VURSwgQU1MX1RZUEVfRVhFQ18xQV8wVF8xUiwKKwkJIEFNTF9GTEFHU19FWEVDXzFBXzBUXzFSIHwgQU1MX0NPTlNUQU5UKSwKKy8qIDNCICovIEFDUElfT1AoIkxFcXVhbCIsIEFSR1BfTEVRVUFMX09QLCBBUkdJX0xFUVVBTF9PUCwKKwkJIEFDUElfVFlQRV9BTlksIEFNTF9DTEFTU19FWEVDVVRFLAorCQkgQU1MX1RZUEVfRVhFQ18yQV8wVF8xUiwKKwkJIEFNTF9GTEFHU19FWEVDXzJBXzBUXzFSIHwgQU1MX0xPR0lDQUwgfCBBTUxfQ09OU1RBTlQpLAorLyogM0MgKi8gQUNQSV9PUCgiTEdyZWF0ZXIiLCBBUkdQX0xHUkVBVEVSX09QLCBBUkdJX0xHUkVBVEVSX09QLAorCQkgQUNQSV9UWVBFX0FOWSwgQU1MX0NMQVNTX0VYRUNVVEUsCisJCSBBTUxfVFlQRV9FWEVDXzJBXzBUXzFSLAorCQkgQU1MX0ZMQUdTX0VYRUNfMkFfMFRfMVIgfCBBTUxfTE9HSUNBTCB8IEFNTF9DT05TVEFOVCksCisvKiAzRCAqLyBBQ1BJX09QKCJMTGVzcyIsIEFSR1BfTExFU1NfT1AsIEFSR0lfTExFU1NfT1AsIEFDUElfVFlQRV9BTlksCisJCSBBTUxfQ0xBU1NfRVhFQ1VURSwgQU1MX1RZUEVfRVhFQ18yQV8wVF8xUiwKKwkJIEFNTF9GTEFHU19FWEVDXzJBXzBUXzFSIHwgQU1MX0xPR0lDQUwgfCBBTUxfQ09OU1RBTlQpLAorLyogM0UgKi8gQUNQSV9PUCgiSWYiLCBBUkdQX0lGX09QLCBBUkdJX0lGX09QLCBBQ1BJX1RZUEVfQU5ZLAorCQkgQU1MX0NMQVNTX0NPTlRST0wsIEFNTF9UWVBFX0NPTlRST0wsIEFNTF9IQVNfQVJHUyksCisvKiAzRiAqLyBBQ1BJX09QKCJFbHNlIiwgQVJHUF9FTFNFX09QLCBBUkdJX0VMU0VfT1AsIEFDUElfVFlQRV9BTlksCisJCSBBTUxfQ0xBU1NfQ09OVFJPTCwgQU1MX1RZUEVfQ09OVFJPTCwgQU1MX0hBU19BUkdTKSwKKy8qIDQwICovIEFDUElfT1AoIldoaWxlIiwgQVJHUF9XSElMRV9PUCwgQVJHSV9XSElMRV9PUCwgQUNQSV9UWVBFX0FOWSwKKwkJIEFNTF9DTEFTU19DT05UUk9MLCBBTUxfVFlQRV9DT05UUk9MLCBBTUxfSEFTX0FSR1MpLAorLyogNDEgKi8gQUNQSV9PUCgiTm9vcCIsIEFSR1BfTk9PUF9PUCwgQVJHSV9OT09QX09QLCBBQ1BJX1RZUEVfQU5ZLAorCQkgQU1MX0NMQVNTX0NPTlRST0wsIEFNTF9UWVBFX0NPTlRST0wsIDApLAorLyogNDIgKi8gQUNQSV9PUCgiUmV0dXJuIiwgQVJHUF9SRVRVUk5fT1AsIEFSR0lfUkVUVVJOX09QLAorCQkgQUNQSV9UWVBFX0FOWSwgQU1MX0NMQVNTX0NPTlRST0wsCisJCSBBTUxfVFlQRV9DT05UUk9MLCBBTUxfSEFTX0FSR1MpLAorLyogNDMgKi8gQUNQSV9PUCgiQnJlYWsiLCBBUkdQX0JSRUFLX09QLCBBUkdJX0JSRUFLX09QLCBBQ1BJX1RZUEVfQU5ZLAorCQkgQU1MX0NMQVNTX0NPTlRST0wsIEFNTF9UWVBFX0NPTlRST0wsIDApLAorLyogNDQgKi8gQUNQSV9PUCgiQnJlYWtQb2ludCIsIEFSR1BfQlJFQUtfUE9JTlRfT1AsIEFSR0lfQlJFQUtfUE9JTlRfT1AsCisJCSBBQ1BJX1RZUEVfQU5ZLCBBTUxfQ0xBU1NfQ09OVFJPTCwgQU1MX1RZUEVfQ09OVFJPTCwgMCksCisvKiA0NSAqLyBBQ1BJX09QKCJPbmVzIiwgQVJHUF9PTkVTX09QLCBBUkdJX09ORVNfT1AsIEFDUElfVFlQRV9JTlRFR0VSLAorCQkgQU1MX0NMQVNTX0FSR1VNRU5ULCBBTUxfVFlQRV9DT05TVEFOVCwgQU1MX0NPTlNUQU5UKSwKKworLyogUHJlZml4ZWQgb3Bjb2RlcyAoVHdvLWJ5dGUgb3Bjb2RlcyB3aXRoIGEgcHJlZml4IG9wKSAqLworCisvKiA0NiAqLyBBQ1BJX09QKCJNdXRleCIsIEFSR1BfTVVURVhfT1AsIEFSR0lfTVVURVhfT1AsIEFDUElfVFlQRV9NVVRFWCwKKwkJIEFNTF9DTEFTU19OQU1FRF9PQkpFQ1QsIEFNTF9UWVBFX05BTUVEX1NJTVBMRSwKKwkJIEFNTF9IQVNfQVJHUyB8IEFNTF9OU09CSkVDVCB8IEFNTF9OU09QQ09ERSB8CisJCSBBTUxfTlNOT0RFIHwgQU1MX05BTUVEKSwKKy8qIDQ3ICovIEFDUElfT1AoIkV2ZW50IiwgQVJHUF9FVkVOVF9PUCwgQVJHSV9FVkVOVF9PUCwgQUNQSV9UWVBFX0VWRU5ULAorCQkgQU1MX0NMQVNTX05BTUVEX09CSkVDVCwgQU1MX1RZUEVfTkFNRURfU0lNUExFLAorCQkgQU1MX05TT0JKRUNUIHwgQU1MX05TT1BDT0RFIHwgQU1MX05TTk9ERSB8IEFNTF9OQU1FRCksCisvKiA0OCAqLyBBQ1BJX09QKCJDb25kUmVmT2YiLCBBUkdQX0NPTkRfUkVGX09GX09QLCBBUkdJX0NPTkRfUkVGX09GX09QLAorCQkgQUNQSV9UWVBFX0FOWSwgQU1MX0NMQVNTX0VYRUNVVEUsCisJCSBBTUxfVFlQRV9FWEVDXzFBXzFUXzFSLCBBTUxfRkxBR1NfRVhFQ18xQV8xVF8xUiksCisvKiA0OSAqLyBBQ1BJX09QKCJDcmVhdGVGaWVsZCIsIEFSR1BfQ1JFQVRFX0ZJRUxEX09QLAorCQkgQVJHSV9DUkVBVEVfRklFTERfT1AsIEFDUElfVFlQRV9CVUZGRVJfRklFTEQsCisJCSBBTUxfQ0xBU1NfQ1JFQVRFLCBBTUxfVFlQRV9DUkVBVEVfRklFTEQsCisJCSBBTUxfSEFTX0FSR1MgfCBBTUxfTlNPQkpFQ1QgfCBBTUxfTlNOT0RFIHwKKwkJIEFNTF9ERUZFUiB8IEFNTF9GSUVMRCB8IEFNTF9DUkVBVEUpLAorLyogNEEgKi8gQUNQSV9PUCgiTG9hZCIsIEFSR1BfTE9BRF9PUCwgQVJHSV9MT0FEX09QLCBBQ1BJX1RZUEVfQU5ZLAorCQkgQU1MX0NMQVNTX0VYRUNVVEUsIEFNTF9UWVBFX0VYRUNfMUFfMVRfMFIsCisJCSBBTUxfRkxBR1NfRVhFQ18xQV8xVF8wUiksCisvKiA0QiAqLyBBQ1BJX09QKCJTdGFsbCIsIEFSR1BfU1RBTExfT1AsIEFSR0lfU1RBTExfT1AsIEFDUElfVFlQRV9BTlksCisJCSBBTUxfQ0xBU1NfRVhFQ1VURSwgQU1MX1RZUEVfRVhFQ18xQV8wVF8wUiwKKwkJIEFNTF9GTEFHU19FWEVDXzFBXzBUXzBSKSwKKy8qIDRDICovIEFDUElfT1AoIlNsZWVwIiwgQVJHUF9TTEVFUF9PUCwgQVJHSV9TTEVFUF9PUCwgQUNQSV9UWVBFX0FOWSwKKwkJIEFNTF9DTEFTU19FWEVDVVRFLCBBTUxfVFlQRV9FWEVDXzFBXzBUXzBSLAorCQkgQU1MX0ZMQUdTX0VYRUNfMUFfMFRfMFIpLAorLyogNEQgKi8gQUNQSV9PUCgiQWNxdWlyZSIsIEFSR1BfQUNRVUlSRV9PUCwgQVJHSV9BQ1FVSVJFX09QLAorCQkgQUNQSV9UWVBFX0FOWSwgQU1MX0NMQVNTX0VYRUNVVEUsCisJCSBBTUxfVFlQRV9FWEVDXzJBXzBUXzFSLCBBTUxfRkxBR1NfRVhFQ18yQV8wVF8xUiksCisvKiA0RSAqLyBBQ1BJX09QKCJTaWduYWwiLCBBUkdQX1NJR05BTF9PUCwgQVJHSV9TSUdOQUxfT1AsCisJCSBBQ1BJX1RZUEVfQU5ZLCBBTUxfQ0xBU1NfRVhFQ1VURSwKKwkJIEFNTF9UWVBFX0VYRUNfMUFfMFRfMFIsIEFNTF9GTEFHU19FWEVDXzFBXzBUXzBSKSwKKy8qIDRGICovIEFDUElfT1AoIldhaXQiLCBBUkdQX1dBSVRfT1AsIEFSR0lfV0FJVF9PUCwgQUNQSV9UWVBFX0FOWSwKKwkJIEFNTF9DTEFTU19FWEVDVVRFLCBBTUxfVFlQRV9FWEVDXzJBXzBUXzFSLAorCQkgQU1MX0ZMQUdTX0VYRUNfMkFfMFRfMVIpLAorLyogNTAgKi8gQUNQSV9PUCgiUmVzZXQiLCBBUkdQX1JFU0VUX09QLCBBUkdJX1JFU0VUX09QLCBBQ1BJX1RZUEVfQU5ZLAorCQkgQU1MX0NMQVNTX0VYRUNVVEUsIEFNTF9UWVBFX0VYRUNfMUFfMFRfMFIsCisJCSBBTUxfRkxBR1NfRVhFQ18xQV8wVF8wUiksCisvKiA1MSAqLyBBQ1BJX09QKCJSZWxlYXNlIiwgQVJHUF9SRUxFQVNFX09QLCBBUkdJX1JFTEVBU0VfT1AsCisJCSBBQ1BJX1RZUEVfQU5ZLCBBTUxfQ0xBU1NfRVhFQ1VURSwKKwkJIEFNTF9UWVBFX0VYRUNfMUFfMFRfMFIsIEFNTF9GTEFHU19FWEVDXzFBXzBUXzBSKSwKKy8qIDUyICovIEFDUElfT1AoIkZyb21CQ0QiLCBBUkdQX0ZST01fQkNEX09QLCBBUkdJX0ZST01fQkNEX09QLAorCQkgQUNQSV9UWVBFX0FOWSwgQU1MX0NMQVNTX0VYRUNVVEUsCisJCSBBTUxfVFlQRV9FWEVDXzFBXzFUXzFSLAorCQkgQU1MX0ZMQUdTX0VYRUNfMUFfMVRfMVIgfCBBTUxfQ09OU1RBTlQpLAorLyogNTMgKi8gQUNQSV9PUCgiVG9CQ0QiLCBBUkdQX1RPX0JDRF9PUCwgQVJHSV9UT19CQ0RfT1AsIEFDUElfVFlQRV9BTlksCisJCSBBTUxfQ0xBU1NfRVhFQ1VURSwgQU1MX1RZUEVfRVhFQ18xQV8xVF8xUiwKKwkJIEFNTF9GTEFHU19FWEVDXzFBXzFUXzFSIHwgQU1MX0NPTlNUQU5UKSwKKy8qIDU0ICovIEFDUElfT1AoIlVubG9hZCIsIEFSR1BfVU5MT0FEX09QLCBBUkdJX1VOTE9BRF9PUCwKKwkJIEFDUElfVFlQRV9BTlksIEFNTF9DTEFTU19FWEVDVVRFLAorCQkgQU1MX1RZUEVfRVhFQ18xQV8wVF8wUiwgQU1MX0ZMQUdTX0VYRUNfMUFfMFRfMFIpLAorLyogNTUgKi8gQUNQSV9PUCgiUmV2aXNpb24iLCBBUkdQX1JFVklTSU9OX09QLCBBUkdJX1JFVklTSU9OX09QLAorCQkgQUNQSV9UWVBFX0lOVEVHRVIsIEFNTF9DTEFTU19BUkdVTUVOVCwKKwkJIEFNTF9UWVBFX0NPTlNUQU5ULCAwKSwKKy8qIDU2ICovIEFDUElfT1AoIkRlYnVnIiwgQVJHUF9ERUJVR19PUCwgQVJHSV9ERUJVR19PUCwKKwkJIEFDUElfVFlQRV9MT0NBTF9SRUZFUkVOQ0UsIEFNTF9DTEFTU19BUkdVTUVOVCwKKwkJIEFNTF9UWVBFX0NPTlNUQU5ULCAwKSwKKy8qIDU3ICovIEFDUElfT1AoIkZhdGFsIiwgQVJHUF9GQVRBTF9PUCwgQVJHSV9GQVRBTF9PUCwgQUNQSV9UWVBFX0FOWSwKKwkJIEFNTF9DTEFTU19FWEVDVVRFLCBBTUxfVFlQRV9FWEVDXzNBXzBUXzBSLAorCQkgQU1MX0ZMQUdTX0VYRUNfM0FfMFRfMFIpLAorLyogNTggKi8gQUNQSV9PUCgiT3BlcmF0aW9uUmVnaW9uIiwgQVJHUF9SRUdJT05fT1AsIEFSR0lfUkVHSU9OX09QLAorCQkgQUNQSV9UWVBFX1JFR0lPTiwgQU1MX0NMQVNTX05BTUVEX09CSkVDVCwKKwkJIEFNTF9UWVBFX05BTUVEX0NPTVBMRVgsCisJCSBBTUxfSEFTX0FSR1MgfCBBTUxfTlNPQkpFQ1QgfCBBTUxfTlNPUENPREUgfAorCQkgQU1MX05TTk9ERSB8IEFNTF9OQU1FRCB8IEFNTF9ERUZFUiksCisvKiA1OSAqLyBBQ1BJX09QKCJGaWVsZCIsIEFSR1BfRklFTERfT1AsIEFSR0lfRklFTERfT1AsIEFDUElfVFlQRV9BTlksCisJCSBBTUxfQ0xBU1NfTkFNRURfT0JKRUNULCBBTUxfVFlQRV9OQU1FRF9GSUVMRCwKKwkJIEFNTF9IQVNfQVJHUyB8IEFNTF9OU09CSkVDVCB8IEFNTF9OU09QQ09ERSB8IEFNTF9GSUVMRCksCisvKiA1QSAqLyBBQ1BJX09QKCJEZXZpY2UiLCBBUkdQX0RFVklDRV9PUCwgQVJHSV9ERVZJQ0VfT1AsCisJCSBBQ1BJX1RZUEVfREVWSUNFLCBBTUxfQ0xBU1NfTkFNRURfT0JKRUNULAorCQkgQU1MX1RZUEVfTkFNRURfTk9fT0JKLAorCQkgQU1MX0hBU19BUkdTIHwgQU1MX05TT0JKRUNUIHwgQU1MX05TT1BDT0RFIHwKKwkJIEFNTF9OU05PREUgfCBBTUxfTkFNRUQpLAorLyogNUIgKi8gQUNQSV9PUCgiUHJvY2Vzc29yIiwgQVJHUF9QUk9DRVNTT1JfT1AsIEFSR0lfUFJPQ0VTU09SX09QLAorCQkgQUNQSV9UWVBFX1BST0NFU1NPUiwgQU1MX0NMQVNTX05BTUVEX09CSkVDVCwKKwkJIEFNTF9UWVBFX05BTUVEX1NJTVBMRSwKKwkJIEFNTF9IQVNfQVJHUyB8IEFNTF9OU09CSkVDVCB8IEFNTF9OU09QQ09ERSB8CisJCSBBTUxfTlNOT0RFIHwgQU1MX05BTUVEKSwKKy8qIDVDICovIEFDUElfT1AoIlBvd2VyUmVzb3VyY2UiLCBBUkdQX1BPV0VSX1JFU19PUCwgQVJHSV9QT1dFUl9SRVNfT1AsCisJCSBBQ1BJX1RZUEVfUE9XRVIsIEFNTF9DTEFTU19OQU1FRF9PQkpFQ1QsCisJCSBBTUxfVFlQRV9OQU1FRF9TSU1QTEUsCisJCSBBTUxfSEFTX0FSR1MgfCBBTUxfTlNPQkpFQ1QgfCBBTUxfTlNPUENPREUgfAorCQkgQU1MX05TTk9ERSB8IEFNTF9OQU1FRCksCisvKiA1RCAqLyBBQ1BJX09QKCJUaGVybWFsWm9uZSIsIEFSR1BfVEhFUk1BTF9aT05FX09QLAorCQkgQVJHSV9USEVSTUFMX1pPTkVfT1AsIEFDUElfVFlQRV9USEVSTUFMLAorCQkgQU1MX0NMQVNTX05BTUVEX09CSkVDVCwgQU1MX1RZUEVfTkFNRURfTk9fT0JKLAorCQkgQU1MX0hBU19BUkdTIHwgQU1MX05TT0JKRUNUIHwgQU1MX05TT1BDT0RFIHwKKwkJIEFNTF9OU05PREUgfCBBTUxfTkFNRUQpLAorLyogNUUgKi8gQUNQSV9PUCgiSW5kZXhGaWVsZCIsIEFSR1BfSU5ERVhfRklFTERfT1AsIEFSR0lfSU5ERVhfRklFTERfT1AsCisJCSBBQ1BJX1RZUEVfQU5ZLCBBTUxfQ0xBU1NfTkFNRURfT0JKRUNULAorCQkgQU1MX1RZUEVfTkFNRURfRklFTEQsCisJCSBBTUxfSEFTX0FSR1MgfCBBTUxfTlNPQkpFQ1QgfCBBTUxfTlNPUENPREUgfCBBTUxfRklFTEQpLAorLyogNUYgKi8gQUNQSV9PUCgiQmFua0ZpZWxkIiwgQVJHUF9CQU5LX0ZJRUxEX09QLCBBUkdJX0JBTktfRklFTERfT1AsCisJCSBBQ1BJX1RZUEVfTE9DQUxfQkFOS19GSUVMRCwgQU1MX0NMQVNTX05BTUVEX09CSkVDVCwKKwkJIEFNTF9UWVBFX05BTUVEX0ZJRUxELAorCQkgQU1MX0hBU19BUkdTIHwgQU1MX05TT0JKRUNUIHwgQU1MX05TT1BDT0RFIHwgQU1MX0ZJRUxEIHwKKwkJIEFNTF9ERUZFUiksCisKKy8qIEludGVybmFsIG9wY29kZXMgdGhhdCBtYXAgdG8gaW52YWxpZCBBTUwgb3Bjb2RlcyAqLworCisvKiA2MCAqLyBBQ1BJX09QKCJMTm90RXF1YWwiLCBBUkdQX0xOT1RFUVVBTF9PUCwgQVJHSV9MTk9URVFVQUxfT1AsCisJCSBBQ1BJX1RZUEVfQU5ZLCBBTUxfQ0xBU1NfSU5URVJOQUwsCisJCSBBTUxfVFlQRV9CT0dVUywgQU1MX0hBU19BUkdTIHwgQU1MX0NPTlNUQU5UKSwKKy8qIDYxICovIEFDUElfT1AoIkxMZXNzRXF1YWwiLCBBUkdQX0xMRVNTRVFVQUxfT1AsIEFSR0lfTExFU1NFUVVBTF9PUCwKKwkJIEFDUElfVFlQRV9BTlksIEFNTF9DTEFTU19JTlRFUk5BTCwKKwkJIEFNTF9UWVBFX0JPR1VTLCBBTUxfSEFTX0FSR1MgfCBBTUxfQ09OU1RBTlQpLAorLyogNjIgKi8gQUNQSV9PUCgiTEdyZWF0ZXJFcXVhbCIsIEFSR1BfTEdSRUFURVJFUVVBTF9PUCwKKwkJIEFSR0lfTEdSRUFURVJFUVVBTF9PUCwgQUNQSV9UWVBFX0FOWSwKKwkJIEFNTF9DTEFTU19JTlRFUk5BTCwgQU1MX1RZUEVfQk9HVVMsCisJCSBBTUxfSEFTX0FSR1MgfCBBTUxfQ09OU1RBTlQpLAorLyogNjMgKi8gQUNQSV9PUCgiLU5hbWVQYXRoLSIsIEFSR1BfTkFNRVBBVEhfT1AsIEFSR0lfTkFNRVBBVEhfT1AsCisJCSBBQ1BJX1RZUEVfTE9DQUxfUkVGRVJFTkNFLCBBTUxfQ0xBU1NfQVJHVU1FTlQsCisJCSBBTUxfVFlQRV9MSVRFUkFMLCBBTUxfTlNPQkpFQ1QgfCBBTUxfTlNOT0RFKSwKKy8qIDY0ICovIEFDUElfT1AoIi1NZXRob2RDYWxsLSIsIEFSR1BfTUVUSE9EQ0FMTF9PUCwgQVJHSV9NRVRIT0RDQUxMX09QLAorCQkgQUNQSV9UWVBFX01FVEhPRCwgQU1MX0NMQVNTX01FVEhPRF9DQUxMLAorCQkgQU1MX1RZUEVfTUVUSE9EX0NBTEwsCisJCSBBTUxfSEFTX0FSR1MgfCBBTUxfTlNPQkpFQ1QgfCBBTUxfTlNOT0RFKSwKKy8qIDY1ICovIEFDUElfT1AoIi1CeXRlTGlzdC0iLCBBUkdQX0JZVEVMSVNUX09QLCBBUkdJX0JZVEVMSVNUX09QLAorCQkgQUNQSV9UWVBFX0FOWSwgQU1MX0NMQVNTX0FSR1VNRU5ULAorCQkgQU1MX1RZUEVfTElURVJBTCwgMCksCisvKiA2NiAqLyBBQ1BJX09QKCItUmVzZXJ2ZWRGaWVsZC0iLCBBUkdQX1JFU0VSVkVERklFTERfT1AsCisJCSBBUkdJX1JFU0VSVkVERklFTERfT1AsIEFDUElfVFlQRV9BTlksCisJCSBBTUxfQ0xBU1NfSU5URVJOQUwsIEFNTF9UWVBFX0JPR1VTLCAwKSwKKy8qIDY3ICovIEFDUElfT1AoIi1OYW1lZEZpZWxkLSIsIEFSR1BfTkFNRURGSUVMRF9PUCwgQVJHSV9OQU1FREZJRUxEX09QLAorCQkgQUNQSV9UWVBFX0FOWSwgQU1MX0NMQVNTX0lOVEVSTkFMLAorCQkgQU1MX1RZUEVfQk9HVVMsCisJCSBBTUxfTlNPQkpFQ1QgfCBBTUxfTlNPUENPREUgfCBBTUxfTlNOT0RFIHwgQU1MX05BTUVEKSwKKy8qIDY4ICovIEFDUElfT1AoIi1BY2Nlc3NGaWVsZC0iLCBBUkdQX0FDQ0VTU0ZJRUxEX09QLAorCQkgQVJHSV9BQ0NFU1NGSUVMRF9PUCwgQUNQSV9UWVBFX0FOWSwKKwkJIEFNTF9DTEFTU19JTlRFUk5BTCwgQU1MX1RZUEVfQk9HVVMsIDApLAorLyogNjkgKi8gQUNQSV9PUCgiLVN0YXRpY1N0cmluZyIsIEFSR1BfU1RBVElDU1RSSU5HX09QLAorCQkgQVJHSV9TVEFUSUNTVFJJTkdfT1AsIEFDUElfVFlQRV9BTlksCisJCSBBTUxfQ0xBU1NfSU5URVJOQUwsIEFNTF9UWVBFX0JPR1VTLCAwKSwKKy8qIDZBICovIEFDUElfT1AoIi1SZXR1cm4gVmFsdWUtIiwgQVJHX05PTkUsIEFSR19OT05FLCBBQ1BJX1RZUEVfQU5ZLAorCQkgQU1MX0NMQVNTX1JFVFVSTl9WQUxVRSwgQU1MX1RZUEVfUkVUVVJOLAorCQkgQU1MX0hBU19BUkdTIHwgQU1MX0hBU19SRVRWQUwpLAorLyogNkIgKi8gQUNQSV9PUCgiLVVOS05PV05fT1AtIiwgQVJHX05PTkUsIEFSR19OT05FLCBBQ1BJX1RZUEVfSU5WQUxJRCwKKwkJIEFNTF9DTEFTU19VTktOT1dOLCBBTUxfVFlQRV9CT0dVUywgQU1MX0hBU19BUkdTKSwKKy8qIDZDICovIEFDUElfT1AoIi1BU0NJSV9PTkxZLSIsIEFSR19OT05FLCBBUkdfTk9ORSwgQUNQSV9UWVBFX0FOWSwKKwkJIEFNTF9DTEFTU19BU0NJSSwgQU1MX1RZUEVfQk9HVVMsIEFNTF9IQVNfQVJHUyksCisvKiA2RCAqLyBBQ1BJX09QKCItUFJFRklYX09OTFktIiwgQVJHX05PTkUsIEFSR19OT05FLCBBQ1BJX1RZUEVfQU5ZLAorCQkgQU1MX0NMQVNTX1BSRUZJWCwgQU1MX1RZUEVfQk9HVVMsIEFNTF9IQVNfQVJHUyksCisKKy8qIEFDUEkgMi4wIG9wY29kZXMgKi8KKworLyogNkUgKi8gQUNQSV9PUCgiUXdvcmRDb25zdCIsIEFSR1BfUVdPUkRfT1AsIEFSR0lfUVdPUkRfT1AsCisJCSBBQ1BJX1RZUEVfSU5URUdFUiwgQU1MX0NMQVNTX0FSR1VNRU5ULAorCQkgQU1MX1RZUEVfTElURVJBTCwgQU1MX0NPTlNUQU5UKSwKKwkvKiA2RiAqLyBBQ1BJX09QKCJQYWNrYWdlIiwgLyogVmFyICovIEFSR1BfVkFSX1BBQ0tBR0VfT1AsCisJCQkgQVJHSV9WQVJfUEFDS0FHRV9PUCwgQUNQSV9UWVBFX1BBQ0tBR0UsCisJCQkgQU1MX0NMQVNTX0NSRUFURSwgQU1MX1RZUEVfQ1JFQVRFX09CSkVDVCwKKwkJCSBBTUxfSEFTX0FSR1MgfCBBTUxfREVGRVIpLAorLyogNzAgKi8gQUNQSV9PUCgiQ29uY2F0ZW5hdGVSZXNUZW1wbGF0ZSIsIEFSR1BfQ09OQ0FUX1JFU19PUCwKKwkJIEFSR0lfQ09OQ0FUX1JFU19PUCwgQUNQSV9UWVBFX0FOWSwKKwkJIEFNTF9DTEFTU19FWEVDVVRFLCBBTUxfVFlQRV9FWEVDXzJBXzFUXzFSLAorCQkgQU1MX0ZMQUdTX0VYRUNfMkFfMVRfMVIgfCBBTUxfQ09OU1RBTlQpLAorLyogNzEgKi8gQUNQSV9PUCgiTW9kIiwgQVJHUF9NT0RfT1AsIEFSR0lfTU9EX09QLCBBQ1BJX1RZUEVfQU5ZLAorCQkgQU1MX0NMQVNTX0VYRUNVVEUsIEFNTF9UWVBFX0VYRUNfMkFfMVRfMVIsCisJCSBBTUxfRkxBR1NfRVhFQ18yQV8xVF8xUiB8IEFNTF9DT05TVEFOVCksCisvKiA3MiAqLyBBQ1BJX09QKCJDcmVhdGVRV29yZEZpZWxkIiwgQVJHUF9DUkVBVEVfUVdPUkRfRklFTERfT1AsCisJCSBBUkdJX0NSRUFURV9RV09SRF9GSUVMRF9PUCwKKwkJIEFDUElfVFlQRV9CVUZGRVJfRklFTEQsIEFNTF9DTEFTU19DUkVBVEUsCisJCSBBTUxfVFlQRV9DUkVBVEVfRklFTEQsCisJCSBBTUxfSEFTX0FSR1MgfCBBTUxfTlNPQkpFQ1QgfCBBTUxfTlNOT0RFIHwKKwkJIEFNTF9ERUZFUiB8IEFNTF9DUkVBVEUpLAorLyogNzMgKi8gQUNQSV9PUCgiVG9CdWZmZXIiLCBBUkdQX1RPX0JVRkZFUl9PUCwgQVJHSV9UT19CVUZGRVJfT1AsCisJCSBBQ1BJX1RZUEVfQU5ZLCBBTUxfQ0xBU1NfRVhFQ1VURSwKKwkJIEFNTF9UWVBFX0VYRUNfMUFfMVRfMVIsCisJCSBBTUxfRkxBR1NfRVhFQ18xQV8xVF8xUiB8IEFNTF9DT05TVEFOVCksCisvKiA3NCAqLyBBQ1BJX09QKCJUb0RlY2ltYWxTdHJpbmciLCBBUkdQX1RPX0RFQ19TVFJfT1AsCisJCSBBUkdJX1RPX0RFQ19TVFJfT1AsIEFDUElfVFlQRV9BTlksCisJCSBBTUxfQ0xBU1NfRVhFQ1VURSwgQU1MX1RZUEVfRVhFQ18xQV8xVF8xUiwKKwkJIEFNTF9GTEFHU19FWEVDXzFBXzFUXzFSIHwgQU1MX0NPTlNUQU5UKSwKKy8qIDc1ICovIEFDUElfT1AoIlRvSGV4U3RyaW5nIiwgQVJHUF9UT19IRVhfU1RSX09QLCBBUkdJX1RPX0hFWF9TVFJfT1AsCisJCSBBQ1BJX1RZUEVfQU5ZLCBBTUxfQ0xBU1NfRVhFQ1VURSwKKwkJIEFNTF9UWVBFX0VYRUNfMUFfMVRfMVIsCisJCSBBTUxfRkxBR1NfRVhFQ18xQV8xVF8xUiB8IEFNTF9DT05TVEFOVCksCisvKiA3NiAqLyBBQ1BJX09QKCJUb0ludGVnZXIiLCBBUkdQX1RPX0lOVEVHRVJfT1AsIEFSR0lfVE9fSU5URUdFUl9PUCwKKwkJIEFDUElfVFlQRV9BTlksIEFNTF9DTEFTU19FWEVDVVRFLAorCQkgQU1MX1RZUEVfRVhFQ18xQV8xVF8xUiwKKwkJIEFNTF9GTEFHU19FWEVDXzFBXzFUXzFSIHwgQU1MX0NPTlNUQU5UKSwKKy8qIDc3ICovIEFDUElfT1AoIlRvU3RyaW5nIiwgQVJHUF9UT19TVFJJTkdfT1AsIEFSR0lfVE9fU1RSSU5HX09QLAorCQkgQUNQSV9UWVBFX0FOWSwgQU1MX0NMQVNTX0VYRUNVVEUsCisJCSBBTUxfVFlQRV9FWEVDXzJBXzFUXzFSLAorCQkgQU1MX0ZMQUdTX0VYRUNfMkFfMVRfMVIgfCBBTUxfQ09OU1RBTlQpLAorLyogNzggKi8gQUNQSV9PUCgiQ29weU9iamVjdCIsIEFSR1BfQ09QWV9PUCwgQVJHSV9DT1BZX09QLAorCQkgQUNQSV9UWVBFX0FOWSwgQU1MX0NMQVNTX0VYRUNVVEUsCisJCSBBTUxfVFlQRV9FWEVDXzFBXzFUXzFSLCBBTUxfRkxBR1NfRVhFQ18xQV8xVF8xUiksCisvKiA3OSAqLyBBQ1BJX09QKCJNaWQiLCBBUkdQX01JRF9PUCwgQVJHSV9NSURfT1AsIEFDUElfVFlQRV9BTlksCisJCSBBTUxfQ0xBU1NfRVhFQ1VURSwgQU1MX1RZUEVfRVhFQ18zQV8xVF8xUiwKKwkJIEFNTF9GTEFHU19FWEVDXzNBXzFUXzFSIHwgQU1MX0NPTlNUQU5UKSwKKy8qIDdBICovIEFDUElfT1AoIkNvbnRpbnVlIiwgQVJHUF9DT05USU5VRV9PUCwgQVJHSV9DT05USU5VRV9PUCwKKwkJIEFDUElfVFlQRV9BTlksIEFNTF9DTEFTU19DT05UUk9MLCBBTUxfVFlQRV9DT05UUk9MLCAwKSwKKy8qIDdCICovIEFDUElfT1AoIkxvYWRUYWJsZSIsIEFSR1BfTE9BRF9UQUJMRV9PUCwgQVJHSV9MT0FEX1RBQkxFX09QLAorCQkgQUNQSV9UWVBFX0FOWSwgQU1MX0NMQVNTX0VYRUNVVEUsCisJCSBBTUxfVFlQRV9FWEVDXzZBXzBUXzFSLCBBTUxfRkxBR1NfRVhFQ182QV8wVF8xUiksCisvKiA3QyAqLyBBQ1BJX09QKCJEYXRhVGFibGVSZWdpb24iLCBBUkdQX0RBVEFfUkVHSU9OX09QLAorCQkgQVJHSV9EQVRBX1JFR0lPTl9PUCwgQUNQSV9UWVBFX1JFR0lPTiwKKwkJIEFNTF9DTEFTU19OQU1FRF9PQkpFQ1QsIEFNTF9UWVBFX05BTUVEX0NPTVBMRVgsCisJCSBBTUxfSEFTX0FSR1MgfCBBTUxfTlNPQkpFQ1QgfCBBTUxfTlNPUENPREUgfAorCQkgQU1MX05TTk9ERSB8IEFNTF9OQU1FRCB8IEFNTF9ERUZFUiksCisvKiA3RCAqLyBBQ1BJX09QKCJbRXZhbFN1YlRyZWVdIiwgQVJHUF9TQ09QRV9PUCwgQVJHSV9TQ09QRV9PUCwKKwkJIEFDUElfVFlQRV9BTlksIEFNTF9DTEFTU19OQU1FRF9PQkpFQ1QsCisJCSBBTUxfVFlQRV9OQU1FRF9OT19PQkosCisJCSBBTUxfSEFTX0FSR1MgfCBBTUxfTlNPQkpFQ1QgfCBBTUxfTlNPUENPREUgfCBBTUxfTlNOT0RFKSwKKworLyogQUNQSSAzLjAgb3Bjb2RlcyAqLworCisvKiA3RSAqLyBBQ1BJX09QKCJUaW1lciIsIEFSR1BfVElNRVJfT1AsIEFSR0lfVElNRVJfT1AsIEFDUElfVFlQRV9BTlksCisJCSBBTUxfQ0xBU1NfRVhFQ1VURSwgQU1MX1RZUEVfRVhFQ18wQV8wVF8xUiwKKwkJIEFNTF9GTEFHU19FWEVDXzBBXzBUXzFSKQorCisvKiEgW0VuZF0gbm8gc291cmNlIGNvZGUgdHJhbnNsYXRpb24gISovCit9OworCisvKgorICogVGhpcyB0YWJsZSBpcyBkaXJlY3RseSBpbmRleGVkIGJ5IHRoZSBvcGNvZGVzLCBhbmQgcmV0dXJucyBhbgorICogaW5kZXggaW50byB0aGUgdGFibGUgYWJvdmUKKyAqLworc3RhdGljIGNvbnN0IHU4IGFjcGlfZ2JsX3Nob3J0X29wX2luZGV4WzI1Nl0gPSB7CisvKiAgICAgICAgICAgICAgMCAgICAgMSAgICAgMiAgICAgMyAgICAgNCAgICAgNSAgICAgNiAgICAgNyAgKi8KKy8qICAgICAgICAgICAgICA4ICAgICA5ICAgICBBICAgICBCICAgICBDICAgICBEICAgICBFICAgICBGICAqLworLyogMHgwMCAqLyAweDAwLCAweDAxLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCAweDAyLCBfVU5LLAorLyogMHgwOCAqLyAweDAzLCBfVU5LLCAweDA0LCAweDA1LCAweDA2LCAweDA3LCAweDZFLCBfVU5LLAorLyogMHgxMCAqLyAweDA4LCAweDA5LCAweDBhLCAweDZGLCAweDBiLCBfVU5LLCBfVU5LLCBfVU5LLAorLyogMHgxOCAqLyBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLAorLyogMHgyMCAqLyBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLAorLyogMHgyOCAqLyBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCAweDYzLCBfUEZYLCBfUEZYLAorLyogMHgzMCAqLyAweDY3LCAweDY2LCAweDY4LCAweDY1LCAweDY5LCAweDY0LCAweDZBLCAweDdELAorLyogMHgzOCAqLyBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLAorLyogMHg0MCAqLyBfVU5LLCBfQVNDLCBfQVNDLCBfQVNDLCBfQVNDLCBfQVNDLCBfQVNDLCBfQVNDLAorLyogMHg0OCAqLyBfQVNDLCBfQVNDLCBfQVNDLCBfQVNDLCBfQVNDLCBfQVNDLCBfQVNDLCBfQVNDLAorLyogMHg1MCAqLyBfQVNDLCBfQVNDLCBfQVNDLCBfQVNDLCBfQVNDLCBfQVNDLCBfQVNDLCBfQVNDLAorLyogMHg1OCAqLyBfQVNDLCBfQVNDLCBfQVNDLCBfVU5LLCBfUEZYLCBfVU5LLCBfUEZYLCBfQVNDLAorLyogMHg2MCAqLyAweDBjLCAweDBkLCAweDBlLCAweDBmLCAweDEwLCAweDExLCAweDEyLCAweDEzLAorLyogMHg2OCAqLyAweDE0LCAweDE1LCAweDE2LCAweDE3LCAweDE4LCAweDE5LCAweDFhLCBfVU5LLAorLyogMHg3MCAqLyAweDFiLCAweDFjLCAweDFkLCAweDFlLCAweDFmLCAweDIwLCAweDIxLCAweDIyLAorLyogMHg3OCAqLyAweDIzLCAweDI0LCAweDI1LCAweDI2LCAweDI3LCAweDI4LCAweDI5LCAweDJhLAorLyogMHg4MCAqLyAweDJiLCAweDJjLCAweDJkLCAweDJlLCAweDcwLCAweDcxLCAweDJmLCAweDMwLAorLyogMHg4OCAqLyAweDMxLCAweDMyLCAweDMzLCAweDM0LCAweDM1LCAweDM2LCAweDM3LCAweDcyLAorLyogMHg5MCAqLyAweDM4LCAweDM5LCAweDNhLCAweDNiLCAweDNjLCAweDNkLCAweDczLCAweDc0LAorLyogMHg5OCAqLyAweDc1LCAweDc2LCBfVU5LLCBfVU5LLCAweDc3LCAweDc4LCAweDc5LCAweDdBLAorLyogMHhBMCAqLyAweDNlLCAweDNmLCAweDQwLCAweDQxLCAweDQyLCAweDQzLCAweDYwLCAweDYxLAorLyogMHhBOCAqLyAweDYyLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLAorLyogMHhCMCAqLyBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLAorLyogMHhCOCAqLyBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLAorLyogMHhDMCAqLyBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLAorLyogMHhDOCAqLyBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCAweDQ0LCBfVU5LLCBfVU5LLCBfVU5LLAorLyogMHhEMCAqLyBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLAorLyogMHhEOCAqLyBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLAorLyogMHhFMCAqLyBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLAorLyogMHhFOCAqLyBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLAorLyogMHhGMCAqLyBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLAorLyogMHhGOCAqLyBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCAweDQ1LAorfTsKKworLyoKKyAqIFRoaXMgdGFibGUgaXMgaW5kZXhlZCBieSB0aGUgc2Vjb25kIG9wY29kZSBvZiB0aGUgZXh0ZW5kZWQgb3Bjb2RlCisgKiBwYWlyLiAgSXQgcmV0dXJucyBhbiBpbmRleCBpbnRvIHRoZSBvcGNvZGUgdGFibGUgKGFjcGlfZ2JsX2FtbF9vcF9pbmZvKQorICovCitzdGF0aWMgY29uc3QgdTggYWNwaV9nYmxfbG9uZ19vcF9pbmRleFtOVU1fRVhURU5ERURfT1BDT0RFXSA9IHsKKy8qICAgICAgICAgICAgICAwICAgICAxICAgICAyICAgICAzICAgICA0ICAgICA1ICAgICA2ICAgICA3ICAqLworLyogICAgICAgICAgICAgIDggICAgIDkgICAgIEEgICAgIEIgICAgIEMgICAgIEQgICAgIEUgICAgIEYgICovCisvKiAweDAwICovIF9VTkssIDB4NDYsIDB4NDcsIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssCisvKiAweDA4ICovIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssCisvKiAweDEwICovIF9VTkssIF9VTkssIDB4NDgsIDB4NDksIF9VTkssIF9VTkssIF9VTkssIF9VTkssCisvKiAweDE4ICovIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIDB4N0IsCisvKiAweDIwICovIDB4NGEsIDB4NGIsIDB4NGMsIDB4NGQsIDB4NGUsIDB4NGYsIDB4NTAsIDB4NTEsCisvKiAweDI4ICovIDB4NTIsIDB4NTMsIDB4NTQsIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssCisvKiAweDMwICovIDB4NTUsIDB4NTYsIDB4NTcsIDB4N2UsIF9VTkssIF9VTkssIF9VTkssIF9VTkssCisvKiAweDM4ICovIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssCisvKiAweDQwICovIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssCisvKiAweDQ4ICovIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssCisvKiAweDUwICovIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssCisvKiAweDU4ICovIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssCisvKiAweDYwICovIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssCisvKiAweDY4ICovIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssCisvKiAweDcwICovIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssCisvKiAweDc4ICovIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssCisvKiAweDgwICovIDB4NTgsIDB4NTksIDB4NWEsIDB4NWIsIDB4NWMsIDB4NWQsIDB4NWUsIDB4NWYsCisvKiAweDg4ICovIDB4N0MsCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX3BzX2dldF9vcGNvZGVfaW5mbworICoKKyAqIFBBUkFNRVRFUlM6ICBPcGNvZGUgICAgICAgICAgICAgIC0gVGhlIEFNTCBvcGNvZGUKKyAqCisgKiBSRVRVUk46ICAgICAgQSBwb2ludGVyIHRvIHRoZSBpbmZvIGFib3V0IHRoZSBvcGNvZGUuCisgKgorICogREVTQ1JJUFRJT046IEZpbmQgQU1MIG9wY29kZSBkZXNjcmlwdGlvbiBiYXNlZCBvbiB0aGUgb3Bjb2RlLgorICogICAgICAgICAgICAgIE5PVEU6IFRoaXMgcHJvY2VkdXJlIG11c3QgQUxXQVlTIHJldHVybiBhIHZhbGlkIHBvaW50ZXIhCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworY29uc3Qgc3RydWN0IGFjcGlfb3Bjb2RlX2luZm8gKmFjcGlfcHNfZ2V0X29wY29kZV9pbmZvKHUxNiBvcGNvZGUpCit7CisJQUNQSV9GVU5DVElPTl9OQU1FKHBzX2dldF9vcGNvZGVfaW5mbyk7CisKKwkvKgorCSAqIERldGVjdCBub3JtYWwgOC1iaXQgb3Bjb2RlIG9yIGV4dGVuZGVkIDE2LWJpdCBvcGNvZGUKKwkgKi8KKwlpZiAoIShvcGNvZGUgJiAweEZGMDApKSB7CisKKwkJLyogU2ltcGxlICg4LWJpdCkgb3Bjb2RlOiAwLTI1NSwgY2FuJ3QgaW5kZXggYmV5b25kIHRhYmxlICAqLworCisJCXJldHVybiAoJmFjcGlfZ2JsX2FtbF9vcF9pbmZvCisJCQlbYWNwaV9nYmxfc2hvcnRfb3BfaW5kZXhbKHU4KSBvcGNvZGVdXSk7CisJfQorCisJaWYgKCgob3Bjb2RlICYgMHhGRjAwKSA9PSBBTUxfRVhURU5ERURfT1BDT0RFKSAmJgorCSAgICAoKCh1OCkgb3Bjb2RlKSA8PSBNQVhfRVhURU5ERURfT1BDT0RFKSkgeworCisJCS8qIFZhbGlkIGV4dGVuZGVkICgxNi1iaXQpIG9wY29kZSAqLworCisJCXJldHVybiAoJmFjcGlfZ2JsX2FtbF9vcF9pbmZvCisJCQlbYWNwaV9nYmxfbG9uZ19vcF9pbmRleFsodTgpIG9wY29kZV1dKTsKKwl9CisKKwkvKiBVbmtub3duIEFNTCBvcGNvZGUgKi8KKworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVhFQywKKwkJCSAgIlVua25vd24gQU1MIG9wY29kZSBbJTQuNFhdXG4iLCBvcGNvZGUpKTsKKworCXJldHVybiAoJmFjcGlfZ2JsX2FtbF9vcF9pbmZvW19VTktdKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9wc19nZXRfb3Bjb2RlX25hbWUKKyAqCisgKiBQQVJBTUVURVJTOiAgT3Bjb2RlICAgICAgICAgICAgICAtIFRoZSBBTUwgb3Bjb2RlCisgKgorICogUkVUVVJOOiAgICAgIEEgcG9pbnRlciB0byB0aGUgbmFtZSBvZiB0aGUgb3Bjb2RlIChBU0NJSSBTdHJpbmcpCisgKiAgICAgICAgICAgICAgTm90ZTogTmV2ZXIgcmV0dXJucyBOVUxMLgorICoKKyAqIERFU0NSSVBUSU9OOiBUcmFuc2xhdGUgYW4gb3Bjb2RlIGludG8gYSBodW1hbi1yZWFkYWJsZSBzdHJpbmcKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitjaGFyICphY3BpX3BzX2dldF9vcGNvZGVfbmFtZSh1MTYgb3Bjb2RlKQoreworI2lmIGRlZmluZWQoQUNQSV9ESVNBU1NFTUJMRVIpIHx8IGRlZmluZWQgKEFDUElfREVCVUdfT1VUUFVUKQorCisJY29uc3Qgc3RydWN0IGFjcGlfb3Bjb2RlX2luZm8gKm9wOworCisJb3AgPSBhY3BpX3BzX2dldF9vcGNvZGVfaW5mbyhvcGNvZGUpOworCisJLyogQWx3YXlzIGd1YXJhbnRlZWQgdG8gcmV0dXJuIGEgdmFsaWQgcG9pbnRlciAqLworCisJcmV0dXJuIChvcC0+bmFtZSk7CisKKyNlbHNlCisJcmV0dXJuICgiT3Bjb2RlTmFtZSB1bmF2YWlsYWJsZSIpOworCisjZW5kaWYKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9wc19nZXRfYXJndW1lbnRfY291bnQKKyAqCisgKiBQQVJBTUVURVJTOiAgb3BfdHlwZSAgICAgICAgICAgICAtIFR5cGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBBTUwgb3Bjb2RlCisgKgorICogUkVUVVJOOiAgICAgIEFyZ3VtZW50IGNvdW50CisgKgorICogREVTQ1JJUFRJT046IE9idGFpbiB0aGUgbnVtYmVyIG9mIGV4cGVjdGVkIGFyZ3VtZW50cyBmb3IgYW4gQU1MIG9wY29kZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3U4IGFjcGlfcHNfZ2V0X2FyZ3VtZW50X2NvdW50KHUzMiBvcF90eXBlKQoreworCisJaWYgKG9wX3R5cGUgPD0gQU1MX1RZUEVfRVhFQ182QV8wVF8xUikgeworCQlyZXR1cm4gKGFjcGlfZ2JsX2FyZ3VtZW50X2NvdW50W29wX3R5cGVdKTsKKwl9CisKKwlyZXR1cm4gKDApOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS9wc3BhcnNlLmMgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL3BzcGFyc2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDgzOGU5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS9wc3BhcnNlLmMKQEAgLTAsMCArMSw3MDEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBNb2R1bGUgTmFtZTogcHNwYXJzZSAtIFBhcnNlciB0b3AgbGV2ZWwgQU1MIHBhcnNlIHJvdXRpbmVzCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwOCwgSW50ZWwgQ29ycC4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKKyAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIGF0IG1pbmltdW0gYSBkaXNjbGFpbWVyCisgKiAgICBzdWJzdGFudGlhbGx5IHNpbWlsYXIgdG8gdGhlICJOTyBXQVJSQU5UWSIgZGlzY2xhaW1lciBiZWxvdworICogICAgKCJEaXNjbGFpbWVyIikgYW5kIGFueSByZWRpc3RyaWJ1dGlvbiBtdXN0IGJlIGNvbmRpdGlvbmVkIHVwb24KKyAqICAgIGluY2x1ZGluZyBhIHN1YnN0YW50aWFsbHkgc2ltaWxhciBEaXNjbGFpbWVyIHJlcXVpcmVtZW50IGZvciBmdXJ0aGVyCisgKiAgICBiaW5hcnkgcmVkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMKKyAqICAgIG9mIGFueSBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogTk8gV0FSUkFOVFkKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HCisgKiBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KKyAqLworCisvKgorICogUGFyc2UgdGhlIEFNTCBhbmQgYnVpbGQgYW4gb3BlcmF0aW9uIHRyZWUgYXMgbW9zdCBpbnRlcnByZXRlcnMsCisgKiBsaWtlIFBlcmwsIGRvLiAgUGFyc2luZyBpcyBkb25lIGJ5IGhhbmQgcmF0aGVyIHRoYW4gd2l0aCBhIFlBQ0MKKyAqIGdlbmVyYXRlZCBwYXJzZXIgdG8gdGlnaHRseSBjb25zdHJhaW4gc3RhY2sgYW5kIGR5bmFtaWMgbWVtb3J5CisgKiB1c2FnZS4gIEF0IHRoZSBzYW1lIHRpbWUsIHBhcnNpbmcgaXMga2VwdCBmbGV4aWJsZSBhbmQgdGhlIGNvZGUKKyAqIGZhaXJseSBjb21wYWN0IGJ5IHBhcnNpbmcgYmFzZWQgb24gYSBsaXN0IG9mIEFNTCBvcGNvZGUKKyAqIHRlbXBsYXRlcyBpbiBhbWxfb3BfaW5mb1tdCisgKi8KKworI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgorI2luY2x1ZGUgImFjY29tbW9uLmgiCisjaW5jbHVkZSAiYWNwYXJzZXIuaCIKKyNpbmNsdWRlICJhY2Rpc3BhdC5oIgorI2luY2x1ZGUgImFtbGNvZGUuaCIKKyNpbmNsdWRlICJhY25hbWVzcC5oIgorI2luY2x1ZGUgImFjaW50ZXJwLmgiCisKKyNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX1BBUlNFUgorQUNQSV9NT0RVTEVfTkFNRSgicHNwYXJzZSIpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfcHNfZ2V0X29wY29kZV9zaXplCisgKgorICogUEFSQU1FVEVSUzogIE9wY29kZSAgICAgICAgICAtIEFuIEFNTCBvcGNvZGUKKyAqCisgKiBSRVRVUk46ICAgICAgU2l6ZSBvZiB0aGUgb3Bjb2RlLCBpbiBieXRlcyAoMSBvciAyKQorICoKKyAqIERFU0NSSVBUSU9OOiBHZXQgdGhlIHNpemUgb2YgdGhlIGN1cnJlbnQgb3Bjb2RlLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MzIgYWNwaV9wc19nZXRfb3Bjb2RlX3NpemUodTMyIG9wY29kZSkKK3sKKworCS8qIEV4dGVuZGVkICgyLWJ5dGUpIG9wY29kZSBpZiA+IDI1NSAqLworCisJaWYgKG9wY29kZSA+IDB4MDBGRikgeworCQlyZXR1cm4gKDIpOworCX0KKworCS8qIE90aGVyd2lzZSwganVzdCBhIHNpbmdsZSBieXRlIG9wY29kZSAqLworCisJcmV0dXJuICgxKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9wc19wZWVrX29wY29kZQorICoKKyAqIFBBUkFNRVRFUlM6ICBwYXJzZXJfc3RhdGUgICAgICAgIC0gQSBwYXJzZXIgc3RhdGUgb2JqZWN0CisgKgorICogUkVUVVJOOiAgICAgIE5leHQgQU1MIG9wY29kZQorICoKKyAqIERFU0NSSVBUSU9OOiBHZXQgbmV4dCBBTUwgb3Bjb2RlICh3aXRob3V0IGluY3JlbWVudGluZyBBTUwgcG9pbnRlcikKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit1MTYgYWNwaV9wc19wZWVrX29wY29kZShzdHJ1Y3QgYWNwaV9wYXJzZV9zdGF0ZSAqIHBhcnNlcl9zdGF0ZSkKK3sKKwl1OCAqYW1sOworCXUxNiBvcGNvZGU7CisKKwlhbWwgPSBwYXJzZXJfc3RhdGUtPmFtbDsKKwlvcGNvZGUgPSAodTE2KSBBQ1BJX0dFVDgoYW1sKTsKKworCWlmIChvcGNvZGUgPT0gQU1MX0VYVEVOREVEX09QX1BSRUZJWCkgeworCisJCS8qIEV4dGVuZGVkIG9wY29kZSwgZ2V0IHRoZSBzZWNvbmQgb3Bjb2RlIGJ5dGUgKi8KKworCQlhbWwrKzsKKwkJb3Bjb2RlID0gKHUxNikgKChvcGNvZGUgPDwgOCkgfCBBQ1BJX0dFVDgoYW1sKSk7CisJfQorCisJcmV0dXJuIChvcGNvZGUpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX3BzX2NvbXBsZXRlX3RoaXNfb3AKKyAqCisgKiBQQVJBTUVURVJTOiAgd2Fsa19zdGF0ZSAgICAgIC0gQ3VycmVudCBTdGF0ZQorICogICAgICAgICAgICAgIE9wICAgICAgICAgICAgICAtIE9wIHRvIGNvbXBsZXRlCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBQZXJmb3JtIGFueSBjbGVhbnVwIGF0IHRoZSBjb21wbGV0aW9uIG9mIGFuIE9wLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2FjcGlfc3RhdHVzCithY3BpX3BzX2NvbXBsZXRlX3RoaXNfb3Aoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqIHdhbGtfc3RhdGUsCisJCQkgdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKiBvcCkKK3sKKwl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqcHJldjsKKwl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqbmV4dDsKKwljb25zdCBzdHJ1Y3QgYWNwaV9vcGNvZGVfaW5mbyAqcGFyZW50X2luZm87CisJdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKnJlcGxhY2VtZW50X29wID0gTlVMTDsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKHBzX2NvbXBsZXRlX3RoaXNfb3AsIG9wKTsKKworCS8qIENoZWNrIGZvciBudWxsIE9wLCBjYW4gaGFwcGVuIGlmIEFNTCBjb2RlIGlzIGNvcnJ1cHQgKi8KKworCWlmICghb3ApIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsJLyogT0sgZm9yIG5vdyAqLworCX0KKworCS8qIERlbGV0ZSB0aGlzIG9wIGFuZCB0aGUgc3VidHJlZSBiZWxvdyBpdCBpZiBhc2tlZCB0byAqLworCisJaWYgKCgod2Fsa19zdGF0ZS0+cGFyc2VfZmxhZ3MgJiBBQ1BJX1BBUlNFX1RSRUVfTUFTSykgIT0KKwkgICAgIEFDUElfUEFSU0VfREVMRVRFX1RSRUUpCisJICAgIHx8ICh3YWxrX3N0YXRlLT5vcF9pbmZvLT5jbGFzcyA9PSBBTUxfQ0xBU1NfQVJHVU1FTlQpKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CisJfQorCisJLyogTWFrZSBzdXJlIHRoYXQgd2Ugb25seSBkZWxldGUgdGhpcyBzdWJ0cmVlICovCisKKwlpZiAob3AtPmNvbW1vbi5wYXJlbnQpIHsKKwkJcHJldiA9IG9wLT5jb21tb24ucGFyZW50LT5jb21tb24udmFsdWUuYXJnOworCQlpZiAoIXByZXYpIHsKKworCQkJLyogTm90aGluZyBtb3JlIHRvIGRvICovCisKKwkJCWdvdG8gY2xlYW51cDsKKwkJfQorCisJCS8qCisJCSAqIENoZWNrIGlmIHdlIG5lZWQgdG8gcmVwbGFjZSB0aGUgb3BlcmF0b3IgYW5kIGl0cyBzdWJ0cmVlCisJCSAqIHdpdGggYSByZXR1cm4gdmFsdWUgb3AgKHBsYWNlaG9sZGVyIG9wKQorCQkgKi8KKwkJcGFyZW50X2luZm8gPQorCQkgICAgYWNwaV9wc19nZXRfb3Bjb2RlX2luZm8ob3AtPmNvbW1vbi5wYXJlbnQtPmNvbW1vbi4KKwkJCQkJICAgIGFtbF9vcGNvZGUpOworCisJCXN3aXRjaCAocGFyZW50X2luZm8tPmNsYXNzKSB7CisJCWNhc2UgQU1MX0NMQVNTX0NPTlRST0w6CisJCQlicmVhazsKKworCQljYXNlIEFNTF9DTEFTU19DUkVBVEU6CisKKwkJCS8qCisJCQkgKiBUaGVzZSBvcGNvZGVzIGNvbnRhaW4gdGVybV9hcmcgb3BlcmFuZHMuIFRoZSBjdXJyZW50CisJCQkgKiBvcCBtdXN0IGJlIHJlcGxhY2VkIGJ5IGEgcGxhY2Vob2xkZXIgcmV0dXJuIG9wCisJCQkgKi8KKwkJCXJlcGxhY2VtZW50X29wID0KKwkJCSAgICBhY3BpX3BzX2FsbG9jX29wKEFNTF9JTlRfUkVUVVJOX1ZBTFVFX09QKTsKKwkJCWlmICghcmVwbGFjZW1lbnRfb3ApIHsKKwkJCQlzdGF0dXMgPSBBRV9OT19NRU1PUlk7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIEFNTF9DTEFTU19OQU1FRF9PQkpFQ1Q6CisKKwkJCS8qCisJCQkgKiBUaGVzZSBvcGNvZGVzIGNvbnRhaW4gdGVybV9hcmcgb3BlcmFuZHMuIFRoZSBjdXJyZW50CisJCQkgKiBvcCBtdXN0IGJlIHJlcGxhY2VkIGJ5IGEgcGxhY2Vob2xkZXIgcmV0dXJuIG9wCisJCQkgKi8KKwkJCWlmICgob3AtPmNvbW1vbi5wYXJlbnQtPmNvbW1vbi5hbWxfb3Bjb2RlID09CisJCQkgICAgIEFNTF9SRUdJT05fT1ApCisJCQkgICAgfHwgKG9wLT5jb21tb24ucGFyZW50LT5jb21tb24uYW1sX29wY29kZSA9PQorCQkJCUFNTF9EQVRBX1JFR0lPTl9PUCkKKwkJCSAgICB8fCAob3AtPmNvbW1vbi5wYXJlbnQtPmNvbW1vbi5hbWxfb3Bjb2RlID09CisJCQkJQU1MX0JVRkZFUl9PUCkKKwkJCSAgICB8fCAob3AtPmNvbW1vbi5wYXJlbnQtPmNvbW1vbi5hbWxfb3Bjb2RlID09CisJCQkJQU1MX1BBQ0tBR0VfT1ApCisJCQkgICAgfHwgKG9wLT5jb21tb24ucGFyZW50LT5jb21tb24uYW1sX29wY29kZSA9PQorCQkJCUFNTF9CQU5LX0ZJRUxEX09QKQorCQkJICAgIHx8IChvcC0+Y29tbW9uLnBhcmVudC0+Y29tbW9uLmFtbF9vcGNvZGUgPT0KKwkJCQlBTUxfVkFSX1BBQ0tBR0VfT1ApKSB7CisJCQkJcmVwbGFjZW1lbnRfb3AgPQorCQkJCSAgICBhY3BpX3BzX2FsbG9jX29wKEFNTF9JTlRfUkVUVVJOX1ZBTFVFX09QKTsKKwkJCQlpZiAoIXJlcGxhY2VtZW50X29wKSB7CisJCQkJCXN0YXR1cyA9IEFFX05PX01FTU9SWTsKKwkJCQl9CisJCQl9IGVsc2UKKwkJCSAgICBpZiAoKG9wLT5jb21tb24ucGFyZW50LT5jb21tb24uYW1sX29wY29kZSA9PQorCQkJCSBBTUxfTkFNRV9PUCkKKwkJCQkmJiAod2Fsa19zdGF0ZS0+cGFzc19udW1iZXIgPD0KKwkJCQkgICAgQUNQSV9JTU9ERV9MT0FEX1BBU1MyKSkgeworCQkJCWlmICgob3AtPmNvbW1vbi5hbWxfb3Bjb2RlID09IEFNTF9CVUZGRVJfT1ApCisJCQkJICAgIHx8IChvcC0+Y29tbW9uLmFtbF9vcGNvZGUgPT0gQU1MX1BBQ0tBR0VfT1ApCisJCQkJICAgIHx8IChvcC0+Y29tbW9uLmFtbF9vcGNvZGUgPT0KKwkJCQkJQU1MX1ZBUl9QQUNLQUdFX09QKSkgeworCQkJCQlyZXBsYWNlbWVudF9vcCA9CisJCQkJCSAgICBhY3BpX3BzX2FsbG9jX29wKG9wLT5jb21tb24uCisJCQkJCQkJICAgICBhbWxfb3Bjb2RlKTsKKwkJCQkJaWYgKCFyZXBsYWNlbWVudF9vcCkgeworCQkJCQkJc3RhdHVzID0gQUVfTk9fTUVNT1JZOworCQkJCQl9IGVsc2UgeworCQkJCQkJcmVwbGFjZW1lbnRfb3AtPm5hbWVkLmRhdGEgPQorCQkJCQkJICAgIG9wLT5uYW1lZC5kYXRhOworCQkJCQkJcmVwbGFjZW1lbnRfb3AtPm5hbWVkLmxlbmd0aCA9CisJCQkJCQkgICAgb3AtPm5hbWVkLmxlbmd0aDsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisKKwkJCXJlcGxhY2VtZW50X29wID0KKwkJCSAgICBhY3BpX3BzX2FsbG9jX29wKEFNTF9JTlRfUkVUVVJOX1ZBTFVFX09QKTsKKwkJCWlmICghcmVwbGFjZW1lbnRfb3ApIHsKKwkJCQlzdGF0dXMgPSBBRV9OT19NRU1PUlk7CisJCQl9CisJCX0KKworCQkvKiBXZSBtdXN0IHVubGluayB0aGlzIG9wIGZyb20gdGhlIHBhcmVudCB0cmVlICovCisKKwkJaWYgKHByZXYgPT0gb3ApIHsKKworCQkJLyogVGhpcyBvcCBpcyB0aGUgZmlyc3QgaW4gdGhlIGxpc3QgKi8KKworCQkJaWYgKHJlcGxhY2VtZW50X29wKSB7CisJCQkJcmVwbGFjZW1lbnRfb3AtPmNvbW1vbi5wYXJlbnQgPQorCQkJCSAgICBvcC0+Y29tbW9uLnBhcmVudDsKKwkJCQlyZXBsYWNlbWVudF9vcC0+Y29tbW9uLnZhbHVlLmFyZyA9IE5VTEw7CisJCQkJcmVwbGFjZW1lbnRfb3AtPmNvbW1vbi5ub2RlID0gb3AtPmNvbW1vbi5ub2RlOworCQkJCW9wLT5jb21tb24ucGFyZW50LT5jb21tb24udmFsdWUuYXJnID0KKwkJCQkgICAgcmVwbGFjZW1lbnRfb3A7CisJCQkJcmVwbGFjZW1lbnRfb3AtPmNvbW1vbi5uZXh0ID0gb3AtPmNvbW1vbi5uZXh0OworCQkJfSBlbHNlIHsKKwkJCQlvcC0+Y29tbW9uLnBhcmVudC0+Y29tbW9uLnZhbHVlLmFyZyA9CisJCQkJICAgIG9wLT5jb21tb24ubmV4dDsKKwkJCX0KKwkJfQorCisJCS8qIFNlYXJjaCB0aGUgcGFyZW50IGxpc3QgKi8KKworCQllbHNlCisJCQl3aGlsZSAocHJldikgeworCisJCQkJLyogVHJhdmVyc2UgYWxsIHNpYmxpbmdzIGluIHRoZSBwYXJlbnQncyBhcmd1bWVudCBsaXN0ICovCisKKwkJCQluZXh0ID0gcHJldi0+Y29tbW9uLm5leHQ7CisJCQkJaWYgKG5leHQgPT0gb3ApIHsKKwkJCQkJaWYgKHJlcGxhY2VtZW50X29wKSB7CisJCQkJCQlyZXBsYWNlbWVudF9vcC0+Y29tbW9uLnBhcmVudCA9CisJCQkJCQkgICAgb3AtPmNvbW1vbi5wYXJlbnQ7CisJCQkJCQlyZXBsYWNlbWVudF9vcC0+Y29tbW9uLnZhbHVlLgorCQkJCQkJICAgIGFyZyA9IE5VTEw7CisJCQkJCQlyZXBsYWNlbWVudF9vcC0+Y29tbW9uLm5vZGUgPQorCQkJCQkJICAgIG9wLT5jb21tb24ubm9kZTsKKwkJCQkJCXByZXYtPmNvbW1vbi5uZXh0ID0KKwkJCQkJCSAgICByZXBsYWNlbWVudF9vcDsKKwkJCQkJCXJlcGxhY2VtZW50X29wLT5jb21tb24ubmV4dCA9CisJCQkJCQkgICAgb3AtPmNvbW1vbi5uZXh0OworCQkJCQkJbmV4dCA9IE5VTEw7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlwcmV2LT5jb21tb24ubmV4dCA9CisJCQkJCQkgICAgb3AtPmNvbW1vbi5uZXh0OworCQkJCQkJbmV4dCA9IE5VTEw7CisJCQkJCX0KKwkJCQl9CisJCQkJcHJldiA9IG5leHQ7CisJCQl9CisJfQorCisgICAgICBjbGVhbnVwOgorCisJLyogTm93IHdlIGNhbiBhY3R1YWxseSBkZWxldGUgdGhlIHN1YnRyZWUgcm9vdGVkIGF0IE9wICovCisKKwlhY3BpX3BzX2RlbGV0ZV9wYXJzZV90cmVlKG9wKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9wc19uZXh0X3BhcnNlX3N0YXRlCisgKgorICogUEFSQU1FVEVSUzogIHdhbGtfc3RhdGUgICAgICAgICAgLSBDdXJyZW50IHN0YXRlCisgKiAgICAgICAgICAgICAgT3AgICAgICAgICAgICAgICAgICAtIEN1cnJlbnQgcGFyc2Ugb3AKKyAqICAgICAgICAgICAgICBjYWxsYmFja19zdGF0dXMgICAgIC0gU3RhdHVzIGZyb20gcHJldmlvdXMgb3BlcmF0aW9uCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBVcGRhdGUgdGhlIHBhcnNlciBzdGF0ZSBiYXNlZCB1cG9uIHRoZSByZXR1cm4gZXhjZXB0aW9uIGZyb20KKyAqICAgICAgICAgICAgICB0aGUgcGFyc2VyIGNhbGxiYWNrLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2FjcGlfc3RhdHVzCithY3BpX3BzX25leHRfcGFyc2Vfc3RhdGUoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSwKKwkJCSB1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqb3AsCisJCQkgYWNwaV9zdGF0dXMgY2FsbGJhY2tfc3RhdHVzKQoreworCXN0cnVjdCBhY3BpX3BhcnNlX3N0YXRlICpwYXJzZXJfc3RhdGUgPSAmd2Fsa19zdGF0ZS0+cGFyc2VyX3N0YXRlOworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX0NUUkxfUEVORElORzsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKHBzX25leHRfcGFyc2Vfc3RhdGUsIG9wKTsKKworCXN3aXRjaCAoY2FsbGJhY2tfc3RhdHVzKSB7CisJY2FzZSBBRV9DVFJMX1RFUk1JTkFURToKKwkJLyoKKwkJICogQSBjb250cm9sIG1ldGhvZCB3YXMgdGVybWluYXRlZCB2aWEgYSBSRVRVUk4gc3RhdGVtZW50LgorCQkgKiBUaGUgd2FsayBvZiB0aGlzIG1ldGhvZCBpcyBjb21wbGV0ZS4KKwkJICovCisJCXBhcnNlcl9zdGF0ZS0+YW1sID0gcGFyc2VyX3N0YXRlLT5hbWxfZW5kOworCQlzdGF0dXMgPSBBRV9DVFJMX1RFUk1JTkFURTsKKwkJYnJlYWs7CisKKwljYXNlIEFFX0NUUkxfQlJFQUs6CisKKwkJcGFyc2VyX3N0YXRlLT5hbWwgPSB3YWxrX3N0YXRlLT5hbWxfbGFzdF93aGlsZTsKKwkJd2Fsa19zdGF0ZS0+Y29udHJvbF9zdGF0ZS0+Y29tbW9uLnZhbHVlID0gRkFMU0U7CisJCXN0YXR1cyA9IEFFX0NUUkxfQlJFQUs7CisJCWJyZWFrOworCisJY2FzZSBBRV9DVFJMX0NPTlRJTlVFOgorCisJCXBhcnNlcl9zdGF0ZS0+YW1sID0gd2Fsa19zdGF0ZS0+YW1sX2xhc3Rfd2hpbGU7CisJCXN0YXR1cyA9IEFFX0NUUkxfQ09OVElOVUU7CisJCWJyZWFrOworCisJY2FzZSBBRV9DVFJMX1BFTkRJTkc6CisKKwkJcGFyc2VyX3N0YXRlLT5hbWwgPSB3YWxrX3N0YXRlLT5hbWxfbGFzdF93aGlsZTsKKwkJYnJlYWs7CisKKyNpZiAwCisJY2FzZSBBRV9DVFJMX1NLSVA6CisKKwkJcGFyc2VyX3N0YXRlLT5hbWwgPSBwYXJzZXJfc3RhdGUtPnNjb3BlLT5wYXJzZV9zY29wZS5wa2dfZW5kOworCQlzdGF0dXMgPSBBRV9PSzsKKwkJYnJlYWs7CisjZW5kaWYKKworCWNhc2UgQUVfQ1RSTF9UUlVFOgorCQkvKgorCQkgKiBQcmVkaWNhdGUgb2YgYW4gSUYgd2FzIHRydWUsIGFuZCB3ZSBhcmUgYXQgdGhlIG1hdGNoaW5nIEVMU0UuCisJCSAqIEp1c3QgY2xvc2Ugb3V0IHRoaXMgcGFja2FnZQorCQkgKi8KKwkJcGFyc2VyX3N0YXRlLT5hbWwgPSBhY3BpX3BzX2dldF9uZXh0X3BhY2thZ2VfZW5kKHBhcnNlcl9zdGF0ZSk7CisJCXN0YXR1cyA9IEFFX0NUUkxfUEVORElORzsKKwkJYnJlYWs7CisKKwljYXNlIEFFX0NUUkxfRkFMU0U6CisJCS8qCisJCSAqIEVpdGhlciBhbiBJRi9XSElMRSBQcmVkaWNhdGUgd2FzIGZhbHNlIG9yIHdlIGVuY291bnRlcmVkIGEgQlJFQUsKKwkJICogb3Bjb2RlLiAgSW4gYm90aCBjYXNlcywgd2UgZG8gbm90IGV4ZWN1dGUgdGhlIHJlc3Qgb2YgdGhlCisJCSAqIHBhY2thZ2U7ICBXZSBzaW1wbHkgY2xvc2Ugb3V0IHRoZSBwYXJlbnQgKGZpbmlzaGluZyB0aGUgd2FsayBvZgorCQkgKiB0aGlzIGJyYW5jaCBvZiB0aGUgdHJlZSkgYW5kIGNvbnRpbnVlIGV4ZWN1dGlvbiBhdCB0aGUgcGFyZW50CisJCSAqIGxldmVsLgorCQkgKi8KKwkJcGFyc2VyX3N0YXRlLT5hbWwgPSBwYXJzZXJfc3RhdGUtPnNjb3BlLT5wYXJzZV9zY29wZS5wa2dfZW5kOworCisJCS8qIEluIHRoZSBjYXNlIG9mIGEgQlJFQUssIGp1c3QgZm9yY2UgYSBwcmVkaWNhdGUgKGlmIGFueSkgdG8gRkFMU0UgKi8KKworCQl3YWxrX3N0YXRlLT5jb250cm9sX3N0YXRlLT5jb21tb24udmFsdWUgPSBGQUxTRTsKKwkJc3RhdHVzID0gQUVfQ1RSTF9FTkQ7CisJCWJyZWFrOworCisJY2FzZSBBRV9DVFJMX1RSQU5TRkVSOgorCisJCS8qIEEgbWV0aG9kIGNhbGwgKGludm9jYXRpb24pIC0tIHRyYW5zZmVyIGNvbnRyb2wgKi8KKworCQlzdGF0dXMgPSBBRV9DVFJMX1RSQU5TRkVSOworCQl3YWxrX3N0YXRlLT5wcmV2X29wID0gb3A7CisJCXdhbGtfc3RhdGUtPm1ldGhvZF9jYWxsX29wID0gb3A7CisJCXdhbGtfc3RhdGUtPm1ldGhvZF9jYWxsX25vZGUgPQorCQkgICAgKG9wLT5jb21tb24udmFsdWUuYXJnKS0+Y29tbW9uLm5vZGU7CisKKwkJLyogV2lsbCByZXR1cm4gdmFsdWUgKGlmIGFueSkgYmUgdXNlZCBieSB0aGUgY2FsbGVyPyAqLworCisJCXdhbGtfc3RhdGUtPnJldHVybl91c2VkID0KKwkJICAgIGFjcGlfZHNfaXNfcmVzdWx0X3VzZWQob3AsIHdhbGtfc3RhdGUpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisKKwkJc3RhdHVzID0gY2FsbGJhY2tfc3RhdHVzOworCQlpZiAoKGNhbGxiYWNrX3N0YXR1cyAmIEFFX0NPREVfTUFTSykgPT0gQUVfQ09ERV9DT05UUk9MKSB7CisJCQlzdGF0dXMgPSBBRV9PSzsKKwkJfQorCQlicmVhazsKKwl9CisKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9wc19wYXJzZV9hbWwKKyAqCisgKiBQQVJBTUVURVJTOiAgd2Fsa19zdGF0ZSAgICAgIC0gQ3VycmVudCBzdGF0ZQorICoKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IFBhcnNlIHJhdyBBTUwgYW5kIHJldHVybiBhIHRyZWUgb2Ygb3BzCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworYWNwaV9zdGF0dXMgYWNwaV9wc19wYXJzZV9hbWwoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSkKK3sKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJc3RydWN0IGFjcGlfdGhyZWFkX3N0YXRlICp0aHJlYWQ7CisJc3RydWN0IGFjcGlfdGhyZWFkX3N0YXRlICpwcmV2X3dhbGtfbGlzdCA9IGFjcGlfZ2JsX2N1cnJlbnRfd2Fsa19saXN0OworCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKnByZXZpb3VzX3dhbGtfc3RhdGU7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKHBzX3BhcnNlX2FtbCk7CisKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX1BBUlNFLAorCQkJICAiRW50ZXJlZCB3aXRoIFdhbGtTdGF0ZT0lcCBBbWw9JXAgc2l6ZT0lWFxuIiwKKwkJCSAgd2Fsa19zdGF0ZSwgd2Fsa19zdGF0ZS0+cGFyc2VyX3N0YXRlLmFtbCwKKwkJCSAgd2Fsa19zdGF0ZS0+cGFyc2VyX3N0YXRlLmFtbF9zaXplKSk7CisKKwlpZiAoIXdhbGtfc3RhdGUtPnBhcnNlcl9zdGF0ZS5hbWwpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05VTExfT0JKRUNUKTsKKwl9CisKKwkvKiBDcmVhdGUgYW5kIGluaXRpYWxpemUgYSBuZXcgdGhyZWFkIHN0YXRlICovCisKKwl0aHJlYWQgPSBhY3BpX3V0X2NyZWF0ZV90aHJlYWRfc3RhdGUoKTsKKwlpZiAoIXRocmVhZCkgeworCQlpZiAod2Fsa19zdGF0ZS0+bWV0aG9kX2Rlc2MpIHsKKworCQkJLyogRXhlY3V0aW5nIGEgY29udHJvbCBtZXRob2QgLSBhZGRpdGlvbmFsIGNsZWFudXAgKi8KKworCQkJYWNwaV9kc190ZXJtaW5hdGVfY29udHJvbF9tZXRob2QoCisJCQkJd2Fsa19zdGF0ZS0+bWV0aG9kX2Rlc2MsIHdhbGtfc3RhdGUpOworCQl9CisKKwkJYWNwaV9kc19kZWxldGVfd2Fsa19zdGF0ZSh3YWxrX3N0YXRlKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX01FTU9SWSk7CisJfQorCisJd2Fsa19zdGF0ZS0+dGhyZWFkID0gdGhyZWFkOworCisJLyoKKwkgKiBJZiBleGVjdXRpbmcgYSBtZXRob2QsIHRoZSBzdGFydGluZyBzeW5jX2xldmVsIGlzIHRoaXMgbWV0aG9kJ3MKKwkgKiBzeW5jX2xldmVsCisJICovCisJaWYgKHdhbGtfc3RhdGUtPm1ldGhvZF9kZXNjKSB7CisJCXdhbGtfc3RhdGUtPnRocmVhZC0+Y3VycmVudF9zeW5jX2xldmVsID0KKwkJICAgIHdhbGtfc3RhdGUtPm1ldGhvZF9kZXNjLT5tZXRob2Quc3luY19sZXZlbDsKKwl9CisKKwlhY3BpX2RzX3B1c2hfd2Fsa19zdGF0ZSh3YWxrX3N0YXRlLCB0aHJlYWQpOworCisJLyoKKwkgKiBUaGlzIGdsb2JhbCBhbGxvd3MgdGhlIEFNTCBkZWJ1Z2dlciB0byBnZXQgYSBoYW5kbGUgdG8gdGhlIGN1cnJlbnRseQorCSAqIGV4ZWN1dGluZyBjb250cm9sIG1ldGhvZC4KKwkgKi8KKwlhY3BpX2dibF9jdXJyZW50X3dhbGtfbGlzdCA9IHRocmVhZDsKKworCS8qCisJICogRXhlY3V0ZSB0aGUgd2FsayBsb29wIGFzIGxvbmcgYXMgdGhlcmUgaXMgYSB2YWxpZCBXYWxrIFN0YXRlLiAgVGhpcworCSAqIGhhbmRsZXMgbmVzdGVkIGNvbnRyb2wgbWV0aG9kIGludm9jYXRpb25zIHdpdGhvdXQgcmVjdXJzaW9uLgorCSAqLworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfUEFSU0UsICJTdGF0ZT0lcFxuIiwgd2Fsa19zdGF0ZSkpOworCisJc3RhdHVzID0gQUVfT0s7CisJd2hpbGUgKHdhbGtfc3RhdGUpIHsKKwkJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCQkvKgorCQkJICogVGhlIHBhcnNlX2xvb3AgZXhlY3V0ZXMgQU1MIHVudGlsIHRoZSBtZXRob2QgdGVybWluYXRlcworCQkJICogb3IgY2FsbHMgYW5vdGhlciBtZXRob2QuCisJCQkgKi8KKwkJCXN0YXR1cyA9IGFjcGlfcHNfcGFyc2VfbG9vcCh3YWxrX3N0YXRlKTsKKwkJfQorCisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfUEFSU0UsCisJCQkJICAiQ29tcGxldGVkIG9uZSBjYWxsIHRvIHdhbGsgbG9vcCwgJXMgU3RhdGU9JXBcbiIsCisJCQkJICBhY3BpX2Zvcm1hdF9leGNlcHRpb24oc3RhdHVzKSwgd2Fsa19zdGF0ZSkpOworCisJCWlmIChzdGF0dXMgPT0gQUVfQ1RSTF9UUkFOU0ZFUikgeworCQkJLyoKKwkJCSAqIEEgbWV0aG9kIGNhbGwgd2FzIGRldGVjdGVkLgorCQkJICogVHJhbnNmZXIgY29udHJvbCB0byB0aGUgY2FsbGVkIGNvbnRyb2wgbWV0aG9kCisJCQkgKi8KKwkJCXN0YXR1cyA9CisJCQkgICAgYWNwaV9kc19jYWxsX2NvbnRyb2xfbWV0aG9kKHRocmVhZCwgd2Fsa19zdGF0ZSwKKwkJCQkJCQlOVUxMKTsKKwkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJCXN0YXR1cyA9CisJCQkJICAgIGFjcGlfZHNfbWV0aG9kX2Vycm9yKHN0YXR1cywgd2Fsa19zdGF0ZSk7CisJCQl9CisKKwkJCS8qCisJCQkgKiBJZiB0aGUgdHJhbnNmZXIgdG8gdGhlIG5ldyBtZXRob2QgbWV0aG9kIGNhbGwgd29ya2VkLCBhIG5ldyB3YWxrCisJCQkgKiBzdGF0ZSB3YXMgY3JlYXRlZCAtLSBnZXQgaXQKKwkJCSAqLworCQkJd2Fsa19zdGF0ZSA9IGFjcGlfZHNfZ2V0X2N1cnJlbnRfd2Fsa19zdGF0ZSh0aHJlYWQpOworCQkJY29udGludWU7CisJCX0gZWxzZSBpZiAoc3RhdHVzID09IEFFX0NUUkxfVEVSTUlOQVRFKSB7CisJCQlzdGF0dXMgPSBBRV9PSzsKKwkJfSBlbHNlIGlmICgoc3RhdHVzICE9IEFFX09LKSAmJiAod2Fsa19zdGF0ZS0+bWV0aG9kX2Rlc2MpKSB7CisKKwkJCS8qIEVpdGhlciB0aGUgbWV0aG9kIHBhcnNlIG9yIGFjdHVhbCBleGVjdXRpb24gZmFpbGVkICovCisKKwkJCUFDUElfRVJST1JfTUVUSE9EKCJNZXRob2QgcGFyc2UvZXhlY3V0aW9uIGZhaWxlZCIsCisJCQkJCSAgd2Fsa19zdGF0ZS0+bWV0aG9kX25vZGUsIE5VTEwsCisJCQkJCSAgc3RhdHVzKTsKKworCQkJLyogQ2hlY2sgZm9yIHBvc3NpYmxlIG11bHRpLXRocmVhZCByZWVudHJhbmN5IHByb2JsZW0gKi8KKworCQkJaWYgKChzdGF0dXMgPT0gQUVfQUxSRUFEWV9FWElTVFMpICYmCisJCQkgICAgKCF3YWxrX3N0YXRlLT5tZXRob2RfZGVzYy0+bWV0aG9kLm11dGV4KSkgeworCQkJCUFDUElfSU5GTygoQUVfSU5GTywKKwkJCQkJICAgIk1hcmtpbmcgbWV0aG9kICU0LjRzIGFzIFNlcmlhbGl6ZWQgYmVjYXVzZSBvZiBBRV9BTFJFQURZX0VYSVNUUyBlcnJvciIsCisJCQkJCSAgIHdhbGtfc3RhdGUtPm1ldGhvZF9ub2RlLT5uYW1lLgorCQkJCQkgICBhc2NpaSkpOworCisJCQkJLyoKKwkJCQkgKiBNZXRob2QgdHJpZWQgdG8gY3JlYXRlIGFuIG9iamVjdCB0d2ljZS4gVGhlIHByb2JhYmxlIGNhdXNlIGlzCisJCQkJICogdGhhdCB0aGUgbWV0aG9kIGNhbm5vdCBoYW5kbGUgcmVlbnRyYW5jeS4KKwkJCQkgKgorCQkJCSAqIFRoZSBtZXRob2QgaXMgbWFya2VkIG5vdF9zZXJpYWxpemVkLCBidXQgaXQgdHJpZWQgdG8gY3JlYXRlCisJCQkJICogYSBuYW1lZCBvYmplY3QsIGNhdXNpbmcgdGhlIHNlY29uZCB0aHJlYWQgZW50cmFuY2UgdG8gZmFpbC4KKwkJCQkgKiBXb3JrYXJvdW5kIHRoaXMgcHJvYmxlbSBieSBtYXJraW5nIHRoZSBtZXRob2QgcGVybWFuZW50bHkKKwkJCQkgKiBhcyBTZXJpYWxpemVkLgorCQkJCSAqLworCQkJCXdhbGtfc3RhdGUtPm1ldGhvZF9kZXNjLT5tZXRob2QubWV0aG9kX2ZsYWdzIHw9CisJCQkJICAgIEFNTF9NRVRIT0RfU0VSSUFMSVpFRDsKKwkJCQl3YWxrX3N0YXRlLT5tZXRob2RfZGVzYy0+bWV0aG9kLnN5bmNfbGV2ZWwgPSAwOworCQkJfQorCQl9CisKKwkJLyogV2UgYXJlIGRvbmUgd2l0aCB0aGlzIHdhbGssIG1vdmUgb24gdG8gdGhlIHBhcmVudCBpZiBhbnkgKi8KKworCQl3YWxrX3N0YXRlID0gYWNwaV9kc19wb3Bfd2Fsa19zdGF0ZSh0aHJlYWQpOworCisJCS8qIFJlc2V0IHRoZSBjdXJyZW50IHNjb3BlIHRvIHRoZSBiZWdpbm5pbmcgb2Ygc2NvcGUgc3RhY2sgKi8KKworCQlhY3BpX2RzX3Njb3BlX3N0YWNrX2NsZWFyKHdhbGtfc3RhdGUpOworCisJCS8qCisJCSAqIElmIHdlIGp1c3QgcmV0dXJuZWQgZnJvbSB0aGUgZXhlY3V0aW9uIG9mIGEgY29udHJvbCBtZXRob2Qgb3IgaWYgd2UKKwkJICogZW5jb3VudGVyZWQgYW4gZXJyb3IgZHVyaW5nIHRoZSBtZXRob2QgcGFyc2UgcGhhc2UsIHRoZXJlJ3MgbG90cyBvZgorCQkgKiBjbGVhbnVwIHRvIGRvCisJCSAqLworCQlpZiAoKCh3YWxrX3N0YXRlLT5wYXJzZV9mbGFncyAmIEFDUElfUEFSU0VfTU9ERV9NQVNLKSA9PQorCQkgICAgIEFDUElfUEFSU0VfRVhFQ1VURSkgfHwgKEFDUElfRkFJTFVSRShzdGF0dXMpKSkgeworCQkJYWNwaV9kc190ZXJtaW5hdGVfY29udHJvbF9tZXRob2Qod2Fsa19zdGF0ZS0+CisJCQkJCQkJIG1ldGhvZF9kZXNjLAorCQkJCQkJCSB3YWxrX3N0YXRlKTsKKwkJfQorCisJCS8qIERlbGV0ZSB0aGlzIHdhbGsgc3RhdGUgYW5kIGFsbCBsaW5rZWQgY29udHJvbCBzdGF0ZXMgKi8KKworCQlhY3BpX3BzX2NsZWFudXBfc2NvcGUoJndhbGtfc3RhdGUtPnBhcnNlcl9zdGF0ZSk7CisJCXByZXZpb3VzX3dhbGtfc3RhdGUgPSB3YWxrX3N0YXRlOworCisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfUEFSU0UsCisJCQkJICAiUmV0dXJuVmFsdWU9JXAsIEltcGxpY2l0VmFsdWU9JXAgU3RhdGU9JXBcbiIsCisJCQkJICB3YWxrX3N0YXRlLT5yZXR1cm5fZGVzYywKKwkJCQkgIHdhbGtfc3RhdGUtPmltcGxpY2l0X3JldHVybl9vYmosIHdhbGtfc3RhdGUpKTsKKworCQkvKiBDaGVjayBpZiB3ZSBoYXZlIHJlc3RhcnRlZCBhIHByZWVtcHRlZCB3YWxrICovCisKKwkJd2Fsa19zdGF0ZSA9IGFjcGlfZHNfZ2V0X2N1cnJlbnRfd2Fsa19zdGF0ZSh0aHJlYWQpOworCQlpZiAod2Fsa19zdGF0ZSkgeworCQkJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCQkJLyoKKwkJCQkgKiBUaGVyZSBpcyBhbm90aGVyIHdhbGsgc3RhdGUsIHJlc3RhcnQgaXQuCisJCQkJICogSWYgdGhlIG1ldGhvZCByZXR1cm4gdmFsdWUgaXMgbm90IHVzZWQgYnkgdGhlIHBhcmVudCwKKwkJCQkgKiBUaGUgb2JqZWN0IGlzIGRlbGV0ZWQKKwkJCQkgKi8KKwkJCQlpZiAoIXByZXZpb3VzX3dhbGtfc3RhdGUtPnJldHVybl9kZXNjKSB7CisJCQkJCS8qCisJCQkJCSAqIEluIHNsYWNrIG1vZGUgZXhlY3V0aW9uLCBpZiB0aGVyZSBpcyBubyByZXR1cm4gdmFsdWUKKwkJCQkJICogd2Ugc2hvdWxkIGltcGxpY2l0bHkgcmV0dXJuIHplcm8gKDApIGFzIGEgZGVmYXVsdCB2YWx1ZS4KKwkJCQkJICovCisJCQkJCWlmIChhY3BpX2dibF9lbmFibGVfaW50ZXJwcmV0ZXJfc2xhY2sgJiYKKwkJCQkJICAgICFwcmV2aW91c193YWxrX3N0YXRlLT4KKwkJCQkJICAgIGltcGxpY2l0X3JldHVybl9vYmopIHsKKwkJCQkJCXByZXZpb3VzX3dhbGtfc3RhdGUtPgorCQkJCQkJICAgIGltcGxpY2l0X3JldHVybl9vYmogPQorCQkJCQkJICAgIGFjcGlfdXRfY3JlYXRlX2ludGVybmFsX29iamVjdAorCQkJCQkJICAgIChBQ1BJX1RZUEVfSU5URUdFUik7CisJCQkJCQlpZiAoIXByZXZpb3VzX3dhbGtfc3RhdGUtPgorCQkJCQkJICAgIGltcGxpY2l0X3JldHVybl9vYmopIHsKKwkJCQkJCQlyZXR1cm5fQUNQSV9TVEFUVVMKKwkJCQkJCQkgICAgKEFFX05PX01FTU9SWSk7CisJCQkJCQl9CisKKwkJCQkJCXByZXZpb3VzX3dhbGtfc3RhdGUtPgorCQkJCQkJICAgIGltcGxpY2l0X3JldHVybl9vYmotPgorCQkJCQkJICAgIGludGVnZXIudmFsdWUgPSAwOworCQkJCQl9CisKKwkJCQkJLyogUmVzdGFydCB0aGUgY2FsbGluZyBjb250cm9sIG1ldGhvZCAqLworCisJCQkJCXN0YXR1cyA9CisJCQkJCSAgICBhY3BpX2RzX3Jlc3RhcnRfY29udHJvbF9tZXRob2QKKwkJCQkJICAgICh3YWxrX3N0YXRlLAorCQkJCQkgICAgIHByZXZpb3VzX3dhbGtfc3RhdGUtPgorCQkJCQkgICAgIGltcGxpY2l0X3JldHVybl9vYmopOworCQkJCX0gZWxzZSB7CisJCQkJCS8qCisJCQkJCSAqIFdlIGhhdmUgYSB2YWxpZCByZXR1cm4gdmFsdWUsIGRlbGV0ZSBhbnkgaW1wbGljaXQKKwkJCQkJICogcmV0dXJuIHZhbHVlLgorCQkJCQkgKi8KKwkJCQkJYWNwaV9kc19jbGVhcl9pbXBsaWNpdF9yZXR1cm4KKwkJCQkJICAgIChwcmV2aW91c193YWxrX3N0YXRlKTsKKworCQkJCQlzdGF0dXMgPQorCQkJCQkgICAgYWNwaV9kc19yZXN0YXJ0X2NvbnRyb2xfbWV0aG9kCisJCQkJCSAgICAod2Fsa19zdGF0ZSwKKwkJCQkJICAgICBwcmV2aW91c193YWxrX3N0YXRlLT5yZXR1cm5fZGVzYyk7CisJCQkJfQorCQkJCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkgeworCQkJCQl3YWxrX3N0YXRlLT53YWxrX3R5cGUgfD0KKwkJCQkJICAgIEFDUElfV0FMS19NRVRIT0RfUkVTVEFSVDsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCS8qIE9uIGVycm9yLCBkZWxldGUgYW55IHJldHVybiBvYmplY3Qgb3IgaW1wbGljaXQgcmV0dXJuICovCisKKwkJCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UocHJldmlvdXNfd2Fsa19zdGF0ZS0+CisJCQkJCQkJIHJldHVybl9kZXNjKTsKKwkJCQlhY3BpX2RzX2NsZWFyX2ltcGxpY2l0X3JldHVybgorCQkJCSAgICAocHJldmlvdXNfd2Fsa19zdGF0ZSk7CisJCQl9CisJCX0KKworCQkvKgorCQkgKiBKdXN0IGNvbXBsZXRlZCBhIDFzdC1sZXZlbCBtZXRob2QsIHNhdmUgdGhlIGZpbmFsIGludGVybmFsIHJldHVybgorCQkgKiB2YWx1ZSAoaWYgYW55KQorCQkgKi8KKwkJZWxzZSBpZiAocHJldmlvdXNfd2Fsa19zdGF0ZS0+Y2FsbGVyX3JldHVybl9kZXNjKSB7CisJCQlpZiAocHJldmlvdXNfd2Fsa19zdGF0ZS0+aW1wbGljaXRfcmV0dXJuX29iaikgeworCQkJCSoocHJldmlvdXNfd2Fsa19zdGF0ZS0+Y2FsbGVyX3JldHVybl9kZXNjKSA9CisJCQkJICAgIHByZXZpb3VzX3dhbGtfc3RhdGUtPmltcGxpY2l0X3JldHVybl9vYmo7CisJCQl9IGVsc2UgeworCQkJCS8qIE5VTEwgaWYgbm8gcmV0dXJuIHZhbHVlICovCisKKwkJCQkqKHByZXZpb3VzX3dhbGtfc3RhdGUtPmNhbGxlcl9yZXR1cm5fZGVzYykgPQorCQkJCSAgICBwcmV2aW91c193YWxrX3N0YXRlLT5yZXR1cm5fZGVzYzsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmIChwcmV2aW91c193YWxrX3N0YXRlLT5yZXR1cm5fZGVzYykgeworCisJCQkJLyogQ2FsbGVyIGRvZXNuJ3Qgd2FudCBpdCwgbXVzdCBkZWxldGUgaXQgKi8KKworCQkJCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZShwcmV2aW91c193YWxrX3N0YXRlLT4KKwkJCQkJCQkgcmV0dXJuX2Rlc2MpOworCQkJfQorCQkJaWYgKHByZXZpb3VzX3dhbGtfc3RhdGUtPmltcGxpY2l0X3JldHVybl9vYmopIHsKKworCQkJCS8qIENhbGxlciBkb2Vzbid0IHdhbnQgaXQsIG11c3QgZGVsZXRlIGl0ICovCisKKwkJCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UocHJldmlvdXNfd2Fsa19zdGF0ZS0+CisJCQkJCQkJIGltcGxpY2l0X3JldHVybl9vYmopOworCQkJfQorCQl9CisKKwkJYWNwaV9kc19kZWxldGVfd2Fsa19zdGF0ZShwcmV2aW91c193YWxrX3N0YXRlKTsKKwl9CisKKwkvKiBOb3JtYWwgZXhpdCAqLworCisJYWNwaV9leF9yZWxlYXNlX2FsbF9tdXRleGVzKHRocmVhZCk7CisJYWNwaV91dF9kZWxldGVfZ2VuZXJpY19zdGF0ZShBQ1BJX0NBU1RfUFRSCisJCQkJICAgICAodW5pb24gYWNwaV9nZW5lcmljX3N0YXRlLCB0aHJlYWQpKTsKKwlhY3BpX2dibF9jdXJyZW50X3dhbGtfbGlzdCA9IHByZXZfd2Fsa19saXN0OworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS9wc3Njb3BlLmMgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL3Bzc2NvcGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZmVjYTVjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS9wc3Njb3BlLmMKQEAgLTAsMCArMSwyNjUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBNb2R1bGUgTmFtZTogcHNzY29wZSAtIFBhcnNlciBzY29wZSBzdGFjayBtYW5hZ2VtZW50IHJvdXRpbmVzCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwOCwgSW50ZWwgQ29ycC4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKKyAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIGF0IG1pbmltdW0gYSBkaXNjbGFpbWVyCisgKiAgICBzdWJzdGFudGlhbGx5IHNpbWlsYXIgdG8gdGhlICJOTyBXQVJSQU5UWSIgZGlzY2xhaW1lciBiZWxvdworICogICAgKCJEaXNjbGFpbWVyIikgYW5kIGFueSByZWRpc3RyaWJ1dGlvbiBtdXN0IGJlIGNvbmRpdGlvbmVkIHVwb24KKyAqICAgIGluY2x1ZGluZyBhIHN1YnN0YW50aWFsbHkgc2ltaWxhciBEaXNjbGFpbWVyIHJlcXVpcmVtZW50IGZvciBmdXJ0aGVyCisgKiAgICBiaW5hcnkgcmVkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMKKyAqICAgIG9mIGFueSBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogTk8gV0FSUkFOVFkKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HCisgKiBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KKyAqLworCisjaW5jbHVkZSA8YWNwaS9hY3BpLmg+CisjaW5jbHVkZSAiYWNjb21tb24uaCIKKyNpbmNsdWRlICJhY3BhcnNlci5oIgorCisjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9QQVJTRVIKK0FDUElfTU9EVUxFX05BTUUoInBzc2NvcGUiKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX3BzX2dldF9wYXJlbnRfc2NvcGUKKyAqCisgKiBQQVJBTUVURVJTOiAgcGFyc2VyX3N0YXRlICAgICAgICAtIEN1cnJlbnQgcGFyc2VyIHN0YXRlIG9iamVjdAorICoKKyAqIFJFVFVSTjogICAgICBQb2ludGVyIHRvIGFuIE9wIG9iamVjdAorICoKKyAqIERFU0NSSVBUSU9OOiBHZXQgcGFyZW50IG9mIGN1cnJlbnQgb3AgYmVpbmcgcGFyc2VkCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICphY3BpX3BzX2dldF9wYXJlbnRfc2NvcGUoc3RydWN0IGFjcGlfcGFyc2Vfc3RhdGUKKwkJCQkJCSAgKnBhcnNlcl9zdGF0ZSkKK3sKKworCXJldHVybiAocGFyc2VyX3N0YXRlLT5zY29wZS0+cGFyc2Vfc2NvcGUub3ApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX3BzX2hhc19jb21wbGV0ZWRfc2NvcGUKKyAqCisgKiBQQVJBTUVURVJTOiAgcGFyc2VyX3N0YXRlICAgICAgICAtIEN1cnJlbnQgcGFyc2VyIHN0YXRlIG9iamVjdAorICoKKyAqIFJFVFVSTjogICAgICBCb29sZWFuLCBUUlVFID0gc2NvcGUgY29tcGxldGVkLgorICoKKyAqIERFU0NSSVBUSU9OOiBJcyBwYXJzaW5nIG9mIGN1cnJlbnQgYXJndW1lbnQgY29tcGxldGU/ICBEZXRlcm1pbmVkIGJ5CisgKiAgICAgICAgICAgICAgMSkgQU1MIHBvaW50ZXIgaXMgYXQgb3IgYmV5b25kIHRoZSBlbmQgb2YgdGhlIHNjb3BlCisgKiAgICAgICAgICAgICAgMikgVGhlIHNjb3BlIGFyZ3VtZW50IGNvdW50IGhhcyByZWFjaGVkIHplcm8uCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordTggYWNwaV9wc19oYXNfY29tcGxldGVkX3Njb3BlKHN0cnVjdCBhY3BpX3BhcnNlX3N0YXRlICogcGFyc2VyX3N0YXRlKQoreworCisJcmV0dXJuICgodTgpCisJCSgocGFyc2VyX3N0YXRlLT5hbWwgPj0gcGFyc2VyX3N0YXRlLT5zY29wZS0+cGFyc2Vfc2NvcGUuYXJnX2VuZAorCQkgIHx8ICFwYXJzZXJfc3RhdGUtPnNjb3BlLT5wYXJzZV9zY29wZS5hcmdfY291bnQpKSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfcHNfaW5pdF9zY29wZQorICoKKyAqIFBBUkFNRVRFUlM6ICBwYXJzZXJfc3RhdGUgICAgICAgIC0gQ3VycmVudCBwYXJzZXIgc3RhdGUgb2JqZWN0CisgKiAgICAgICAgICAgICAgUm9vdCAgICAgICAgICAgICAgICAtIHRoZSBSb290IE5vZGUgb2YgdGhpcyBuZXcgc2NvcGUKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IEFsbG9jYXRlIGFuZCBpbml0IGEgbmV3IHNjb3BlIG9iamVjdAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2FjcGlfc3RhdHVzCithY3BpX3BzX2luaXRfc2NvcGUoc3RydWN0IGFjcGlfcGFyc2Vfc3RhdGUgKiBwYXJzZXJfc3RhdGUsCisJCSAgIHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICogcm9vdF9vcCkKK3sKKwl1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgKnNjb3BlOworCisJQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIocHNfaW5pdF9zY29wZSwgcm9vdF9vcCk7CisKKwlzY29wZSA9IGFjcGlfdXRfY3JlYXRlX2dlbmVyaWNfc3RhdGUoKTsKKwlpZiAoIXNjb3BlKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT19NRU1PUlkpOworCX0KKworCXNjb3BlLT5jb21tb24uZGVzY3JpcHRvcl90eXBlID0gQUNQSV9ERVNDX1RZUEVfU1RBVEVfUlBTQ09QRTsKKwlzY29wZS0+cGFyc2Vfc2NvcGUub3AgPSByb290X29wOworCXNjb3BlLT5wYXJzZV9zY29wZS5hcmdfY291bnQgPSBBQ1BJX1ZBUl9BUkdTOworCXNjb3BlLT5wYXJzZV9zY29wZS5hcmdfZW5kID0gcGFyc2VyX3N0YXRlLT5hbWxfZW5kOworCXNjb3BlLT5wYXJzZV9zY29wZS5wa2dfZW5kID0gcGFyc2VyX3N0YXRlLT5hbWxfZW5kOworCisJcGFyc2VyX3N0YXRlLT5zY29wZSA9IHNjb3BlOworCXBhcnNlcl9zdGF0ZS0+c3RhcnRfb3AgPSByb290X29wOworCisJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9wc19wdXNoX3Njb3BlCisgKgorICogUEFSQU1FVEVSUzogIHBhcnNlcl9zdGF0ZSAgICAgICAgLSBDdXJyZW50IHBhcnNlciBzdGF0ZSBvYmplY3QKKyAqICAgICAgICAgICAgICBPcCAgICAgICAgICAgICAgICAgIC0gQ3VycmVudCBvcCB0byBiZSBwdXNoZWQKKyAqICAgICAgICAgICAgICByZW1haW5pbmdfYXJncyAgICAgIC0gTGlzdCBvZiBhcmdzIHJlbWFpbmluZworICogICAgICAgICAgICAgIGFyZ19jb3VudCAgICAgICAgICAgLSBGaXhlZCBvciB2YXJpYWJsZSBudW1iZXIgb2YgYXJncworICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogUHVzaCBjdXJyZW50IG9wIHRvIGJlZ2luIHBhcnNpbmcgaXRzIGFyZ3VtZW50CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworYWNwaV9zdGF0dXMKK2FjcGlfcHNfcHVzaF9zY29wZShzdHJ1Y3QgYWNwaV9wYXJzZV9zdGF0ZSAqcGFyc2VyX3N0YXRlLAorCQkgICB1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqb3AsCisJCSAgIHUzMiByZW1haW5pbmdfYXJncywgdTMyIGFyZ19jb3VudCkKK3sKKwl1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgKnNjb3BlOworCisJQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIocHNfcHVzaF9zY29wZSwgb3ApOworCisJc2NvcGUgPSBhY3BpX3V0X2NyZWF0ZV9nZW5lcmljX3N0YXRlKCk7CisJaWYgKCFzY29wZSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9fTUVNT1JZKTsKKwl9CisKKwlzY29wZS0+Y29tbW9uLmRlc2NyaXB0b3JfdHlwZSA9IEFDUElfREVTQ19UWVBFX1NUQVRFX1BTQ09QRTsKKwlzY29wZS0+cGFyc2Vfc2NvcGUub3AgPSBvcDsKKwlzY29wZS0+cGFyc2Vfc2NvcGUuYXJnX2xpc3QgPSByZW1haW5pbmdfYXJnczsKKwlzY29wZS0+cGFyc2Vfc2NvcGUuYXJnX2NvdW50ID0gYXJnX2NvdW50OworCXNjb3BlLT5wYXJzZV9zY29wZS5wa2dfZW5kID0gcGFyc2VyX3N0YXRlLT5wa2dfZW5kOworCisJLyogUHVzaCBvbnRvIHNjb3BlIHN0YWNrICovCisKKwlhY3BpX3V0X3B1c2hfZ2VuZXJpY19zdGF0ZSgmcGFyc2VyX3N0YXRlLT5zY29wZSwgc2NvcGUpOworCisJaWYgKGFyZ19jb3VudCA9PSBBQ1BJX1ZBUl9BUkdTKSB7CisKKwkJLyogTXVsdGlwbGUgYXJndW1lbnRzICovCisKKwkJc2NvcGUtPnBhcnNlX3Njb3BlLmFyZ19lbmQgPSBwYXJzZXJfc3RhdGUtPnBrZ19lbmQ7CisJfSBlbHNlIHsKKwkJLyogU2luZ2xlIGFyZ3VtZW50ICovCisKKwkJc2NvcGUtPnBhcnNlX3Njb3BlLmFyZ19lbmQgPSBBQ1BJX1RPX1BPSU5URVIoQUNQSV9NQVhfUFRSKTsKKwl9CisKKwlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX3BzX3BvcF9zY29wZQorICoKKyAqIFBBUkFNRVRFUlM6ICBwYXJzZXJfc3RhdGUgICAgICAgIC0gQ3VycmVudCBwYXJzZXIgc3RhdGUgb2JqZWN0CisgKiAgICAgICAgICAgICAgT3AgICAgICAgICAgICAgICAgICAtIFdoZXJlIHRoZSBwb3BwZWQgb3AgaXMgcmV0dXJuZWQKKyAqICAgICAgICAgICAgICBhcmdfbGlzdCAgICAgICAgICAgIC0gV2hlcmUgdGhlIHBvcHBlZCAibmV4dCBhcmd1bWVudCIgaXMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuZWQKKyAqICAgICAgICAgICAgICBhcmdfY291bnQgICAgICAgICAgIC0gQ291bnQgb2Ygb2JqZWN0cyBpbiBhcmdfbGlzdAorICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogUmV0dXJuIHRvIHBhcnNpbmcgYSBwcmV2aW91cyBvcAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQKK2FjcGlfcHNfcG9wX3Njb3BlKHN0cnVjdCBhY3BpX3BhcnNlX3N0YXRlICpwYXJzZXJfc3RhdGUsCisJCSAgdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKipvcCwgdTMyICogYXJnX2xpc3QsIHUzMiAqIGFyZ19jb3VudCkKK3sKKwl1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgKnNjb3BlID0gcGFyc2VyX3N0YXRlLT5zY29wZTsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0UocHNfcG9wX3Njb3BlKTsKKworCS8qIE9ubHkgcG9wIHRoZSBzY29wZSBpZiB0aGVyZSBpcyBpbiBmYWN0IGEgbmV4dCBzY29wZSAqLworCisJaWYgKHNjb3BlLT5jb21tb24ubmV4dCkgeworCQlzY29wZSA9IGFjcGlfdXRfcG9wX2dlbmVyaWNfc3RhdGUoJnBhcnNlcl9zdGF0ZS0+c2NvcGUpOworCisJCS8qIFJldHVybiB0byBwYXJzaW5nIHByZXZpb3VzIG9wICovCisKKwkJKm9wID0gc2NvcGUtPnBhcnNlX3Njb3BlLm9wOworCQkqYXJnX2xpc3QgPSBzY29wZS0+cGFyc2Vfc2NvcGUuYXJnX2xpc3Q7CisJCSphcmdfY291bnQgPSBzY29wZS0+cGFyc2Vfc2NvcGUuYXJnX2NvdW50OworCQlwYXJzZXJfc3RhdGUtPnBrZ19lbmQgPSBzY29wZS0+cGFyc2Vfc2NvcGUucGtnX2VuZDsKKworCQkvKiBBbGwgZG9uZSB3aXRoIHRoaXMgc2NvcGUgc3RhdGUgc3RydWN0dXJlICovCisKKwkJYWNwaV91dF9kZWxldGVfZ2VuZXJpY19zdGF0ZShzY29wZSk7CisJfSBlbHNlIHsKKwkJLyogRW1wdHkgcGFyc2Ugc3RhY2ssIHByZXBhcmUgdG8gZmV0Y2ggbmV4dCBvcGNvZGUgKi8KKworCQkqb3AgPSBOVUxMOworCQkqYXJnX2xpc3QgPSAwOworCQkqYXJnX2NvdW50ID0gMDsKKwl9CisKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX1BBUlNFLAorCQkJICAiUG9wcGVkIE9wICVwIEFyZ3MgJVhcbiIsICpvcCwgKmFyZ19jb3VudCkpOworCXJldHVybl9WT0lEOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX3BzX2NsZWFudXBfc2NvcGUKKyAqCisgKiBQQVJBTUVURVJTOiAgcGFyc2VyX3N0YXRlICAgICAgICAtIEN1cnJlbnQgcGFyc2VyIHN0YXRlIG9iamVjdAorICoKKyAqIFJFVFVSTjogICAgICBOb25lCisgKgorICogREVTQ1JJUFRJT046IERlc3Ryb3kgYXZhaWxhYmxlIGxpc3QsIHJlbWFpbmluZyBzdGFjayBsZXZlbHMsIGFuZCByZXR1cm4KKyAqICAgICAgICAgICAgICByb290IHNjb3BlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBhY3BpX3BzX2NsZWFudXBfc2NvcGUoc3RydWN0IGFjcGlfcGFyc2Vfc3RhdGUgKnBhcnNlcl9zdGF0ZSkKK3sKKwl1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgKnNjb3BlOworCisJQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIocHNfY2xlYW51cF9zY29wZSwgcGFyc2VyX3N0YXRlKTsKKworCWlmICghcGFyc2VyX3N0YXRlKSB7CisJCXJldHVybl9WT0lEOworCX0KKworCS8qIERlbGV0ZSBhbnl0aGluZyBvbiB0aGUgc2NvcGUgc3RhY2sgKi8KKworCXdoaWxlIChwYXJzZXJfc3RhdGUtPnNjb3BlKSB7CisJCXNjb3BlID0gYWNwaV91dF9wb3BfZ2VuZXJpY19zdGF0ZSgmcGFyc2VyX3N0YXRlLT5zY29wZSk7CisJCWFjcGlfdXRfZGVsZXRlX2dlbmVyaWNfc3RhdGUoc2NvcGUpOworCX0KKworCXJldHVybl9WT0lEOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS9wc3RyZWUuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvcHN0cmVlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQzMzg5MQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvcHN0cmVlLmMKQEAgLTAsMCArMSwzMTIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBNb2R1bGUgTmFtZTogcHN0cmVlIC0gUGFyc2VyIG9wIHRyZWUgbWFuaXB1bGF0aW9uL3RyYXZlcnNhbC9zZWFyY2gKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA4LCBJbnRlbCBDb3JwLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAorICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgYXQgbWluaW11bSBhIGRpc2NsYWltZXIKKyAqICAgIHN1YnN0YW50aWFsbHkgc2ltaWxhciB0byB0aGUgIk5PIFdBUlJBTlRZIiBkaXNjbGFpbWVyIGJlbG93CisgKiAgICAoIkRpc2NsYWltZXIiKSBhbmQgYW55IHJlZGlzdHJpYnV0aW9uIG11c3QgYmUgY29uZGl0aW9uZWQgdXBvbgorICogICAgaW5jbHVkaW5nIGEgc3Vic3RhbnRpYWxseSBzaW1pbGFyIERpc2NsYWltZXIgcmVxdWlyZW1lbnQgZm9yIGZ1cnRoZXIKKyAqICAgIGJpbmFyeSByZWRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcworICogICAgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBOTyBXQVJSQU5UWQorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcKKyAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgorICovCisKKyNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KKyNpbmNsdWRlICJhY2NvbW1vbi5oIgorI2luY2x1ZGUgImFjcGFyc2VyLmgiCisjaW5jbHVkZSAiYW1sY29kZS5oIgorCisjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9QQVJTRVIKK0FDUElfTU9EVUxFX05BTUUoInBzdHJlZSIpCisKKy8qIExvY2FsIHByb3RvdHlwZXMgKi8KKyNpZmRlZiBBQ1BJX09CU09MRVRFX0ZVTkNUSU9OUwordW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKmFjcGlfcHNfZ2V0X2NoaWxkKHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpvcCk7CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9wc19nZXRfYXJnCisgKgorICogUEFSQU1FVEVSUzogIE9wICAgICAgICAgICAgICAtIEdldCBhbiBhcmd1bWVudCBmb3IgdGhpcyBvcAorICogICAgICAgICAgICAgIEFyZ24gICAgICAgICAgICAtIE50aCBhcmd1bWVudCB0byBnZXQKKyAqCisgKiBSRVRVUk46ICAgICAgVGhlIGFyZ3VtZW50IChhcyBhbiBPcCBvYmplY3QpLiBOVUxMIGlmIGFyZ3VtZW50IGRvZXMgbm90IGV4aXN0CisgKgorICogREVTQ1JJUFRJT046IEdldCB0aGUgc3BlY2lmaWVkIG9wJ3MgYXJndW1lbnQuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKmFjcGlfcHNfZ2V0X2FyZyh1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqb3AsIHUzMiBhcmduKQoreworCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICphcmcgPSBOVUxMOworCWNvbnN0IHN0cnVjdCBhY3BpX29wY29kZV9pbmZvICpvcF9pbmZvOworCisJQUNQSV9GVU5DVElPTl9FTlRSWSgpOworCisJLyogR2V0IHRoZSBpbmZvIHN0cnVjdHVyZSBmb3IgdGhpcyBvcGNvZGUgKi8KKworCW9wX2luZm8gPSBhY3BpX3BzX2dldF9vcGNvZGVfaW5mbyhvcC0+Y29tbW9uLmFtbF9vcGNvZGUpOworCWlmIChvcF9pbmZvLT5jbGFzcyA9PSBBTUxfQ0xBU1NfVU5LTk9XTikgeworCisJCS8qIEludmFsaWQgb3Bjb2RlIG9yIEFTQ0lJIGNoYXJhY3RlciAqLworCisJCXJldHVybiAoTlVMTCk7CisJfQorCisJLyogQ2hlY2sgaWYgdGhpcyBvcGNvZGUgcmVxdWlyZXMgYXJndW1lbnQgc3ViLW9iamVjdHMgKi8KKworCWlmICghKG9wX2luZm8tPmZsYWdzICYgQU1MX0hBU19BUkdTKSkgeworCisJCS8qIEhhcyBubyBsaW5rZWQgYXJndW1lbnQgb2JqZWN0cyAqLworCisJCXJldHVybiAoTlVMTCk7CisJfQorCisJLyogR2V0IHRoZSByZXF1ZXN0ZWQgYXJndW1lbnQgb2JqZWN0ICovCisKKwlhcmcgPSBvcC0+Y29tbW9uLnZhbHVlLmFyZzsKKwl3aGlsZSAoYXJnICYmIGFyZ24pIHsKKwkJYXJnbi0tOworCQlhcmcgPSBhcmctPmNvbW1vbi5uZXh0OworCX0KKworCXJldHVybiAoYXJnKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9wc19hcHBlbmRfYXJnCisgKgorICogUEFSQU1FVEVSUzogIE9wICAgICAgICAgICAgICAtIEFwcGVuZCBhbiBhcmd1bWVudCB0byB0aGlzIE9wLgorICogICAgICAgICAgICAgIEFyZyAgICAgICAgICAgICAtIEFyZ3VtZW50IE9wIHRvIGFwcGVuZAorICoKKyAqIFJFVFVSTjogICAgICBOb25lLgorICoKKyAqIERFU0NSSVBUSU9OOiBBcHBlbmQgYW4gYXJndW1lbnQgdG8gYW4gb3AncyBhcmd1bWVudCBsaXN0IChhIE5VTEwgYXJnIGlzIE9LKQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQKK2FjcGlfcHNfYXBwZW5kX2FyZyh1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqb3AsIHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICphcmcpCit7CisJdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKnByZXZfYXJnOworCWNvbnN0IHN0cnVjdCBhY3BpX29wY29kZV9pbmZvICpvcF9pbmZvOworCisJQUNQSV9GVU5DVElPTl9FTlRSWSgpOworCisJaWYgKCFvcCkgeworCQlyZXR1cm47CisJfQorCisJLyogR2V0IHRoZSBpbmZvIHN0cnVjdHVyZSBmb3IgdGhpcyBvcGNvZGUgKi8KKworCW9wX2luZm8gPSBhY3BpX3BzX2dldF9vcGNvZGVfaW5mbyhvcC0+Y29tbW9uLmFtbF9vcGNvZGUpOworCWlmIChvcF9pbmZvLT5jbGFzcyA9PSBBTUxfQ0xBU1NfVU5LTk9XTikgeworCisJCS8qIEludmFsaWQgb3Bjb2RlICovCisKKwkJQUNQSV9FUlJPUigoQUVfSU5GTywgIkludmFsaWQgQU1MIE9wY29kZTogMHglMi4yWCIsCisJCQkgICAgb3AtPmNvbW1vbi5hbWxfb3Bjb2RlKSk7CisJCXJldHVybjsKKwl9CisKKwkvKiBDaGVjayBpZiB0aGlzIG9wY29kZSByZXF1aXJlcyBhcmd1bWVudCBzdWItb2JqZWN0cyAqLworCisJaWYgKCEob3BfaW5mby0+ZmxhZ3MgJiBBTUxfSEFTX0FSR1MpKSB7CisKKwkJLyogSGFzIG5vIGxpbmtlZCBhcmd1bWVudCBvYmplY3RzICovCisKKwkJcmV0dXJuOworCX0KKworCS8qIEFwcGVuZCB0aGUgYXJndW1lbnQgdG8gdGhlIGxpbmtlZCBhcmd1bWVudCBsaXN0ICovCisKKwlpZiAob3AtPmNvbW1vbi52YWx1ZS5hcmcpIHsKKworCQkvKiBBcHBlbmQgdG8gZXhpc3RpbmcgYXJndW1lbnQgbGlzdCAqLworCisJCXByZXZfYXJnID0gb3AtPmNvbW1vbi52YWx1ZS5hcmc7CisJCXdoaWxlIChwcmV2X2FyZy0+Y29tbW9uLm5leHQpIHsKKwkJCXByZXZfYXJnID0gcHJldl9hcmctPmNvbW1vbi5uZXh0OworCQl9CisJCXByZXZfYXJnLT5jb21tb24ubmV4dCA9IGFyZzsKKwl9IGVsc2UgeworCQkvKiBObyBhcmd1bWVudCBsaXN0LCB0aGlzIHdpbGwgYmUgdGhlIGZpcnN0IGFyZ3VtZW50ICovCisKKwkJb3AtPmNvbW1vbi52YWx1ZS5hcmcgPSBhcmc7CisJfQorCisJLyogU2V0IHRoZSBwYXJlbnQgaW4gdGhpcyBhcmcgYW5kIGFueSBhcmdzIGxpbmtlZCBhZnRlciBpdCAqLworCisJd2hpbGUgKGFyZykgeworCQlhcmctPmNvbW1vbi5wYXJlbnQgPSBvcDsKKwkJYXJnID0gYXJnLT5jb21tb24ubmV4dDsKKworCQlvcC0+Y29tbW9uLmFyZ19saXN0X2xlbmd0aCsrOworCX0KK30KKworI2lmZGVmIEFDUElfRlVUVVJFX1VTQUdFCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX3BzX2dldF9kZXB0aF9uZXh0CisgKgorICogUEFSQU1FVEVSUzogIE9yaWdpbiAgICAgICAgICAtIFJvb3Qgb2Ygc3VidHJlZSB0byBzZWFyY2gKKyAqICAgICAgICAgICAgICBPcCAgICAgICAgICAgICAgLSBMYXN0IChwcmV2aW91cykgT3AgdGhhdCB3YXMgZm91bmQKKyAqCisgKiBSRVRVUk46ICAgICAgTmV4dCBPcCBmb3VuZCBpbiB0aGUgc2VhcmNoLgorICoKKyAqIERFU0NSSVBUSU9OOiBHZXQgbmV4dCBvcCBpbiB0cmVlICh3YWxraW5nIHRoZSB0cmVlIGluIGRlcHRoLWZpcnN0IG9yZGVyKQorICogICAgICAgICAgICAgIFJldHVybiBOVUxMIHdoZW4gcmVhY2hpbmcgIm9yaWdpbiIgb3Igd2hlbiB3YWxraW5nIHVwIGZyb20gcm9vdAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3VuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICphY3BpX3BzX2dldF9kZXB0aF9uZXh0KHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpvcmlnaW4sCisJCQkJCQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqb3ApCit7CisJdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKm5leHQgPSBOVUxMOworCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpwYXJlbnQ7CisJdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKmFyZzsKKworCUFDUElfRlVOQ1RJT05fRU5UUlkoKTsKKworCWlmICghb3ApIHsKKwkJcmV0dXJuIChOVUxMKTsKKwl9CisKKwkvKiBMb29rIGZvciBhbiBhcmd1bWVudCBvciBjaGlsZCAqLworCisJbmV4dCA9IGFjcGlfcHNfZ2V0X2FyZyhvcCwgMCk7CisJaWYgKG5leHQpIHsKKwkJcmV0dXJuIChuZXh0KTsKKwl9CisKKwkvKiBMb29rIGZvciBhIHNpYmxpbmcgKi8KKworCW5leHQgPSBvcC0+Y29tbW9uLm5leHQ7CisJaWYgKG5leHQpIHsKKwkJcmV0dXJuIChuZXh0KTsKKwl9CisKKwkvKiBMb29rIGZvciBhIHNpYmxpbmcgb2YgcGFyZW50ICovCisKKwlwYXJlbnQgPSBvcC0+Y29tbW9uLnBhcmVudDsKKworCXdoaWxlIChwYXJlbnQpIHsKKwkJYXJnID0gYWNwaV9wc19nZXRfYXJnKHBhcmVudCwgMCk7CisJCXdoaWxlIChhcmcgJiYgKGFyZyAhPSBvcmlnaW4pICYmIChhcmcgIT0gb3ApKSB7CisJCQlhcmcgPSBhcmctPmNvbW1vbi5uZXh0OworCQl9CisKKwkJaWYgKGFyZyA9PSBvcmlnaW4pIHsKKworCQkJLyogUmVhY2hlZCBwYXJlbnQgb2Ygb3JpZ2luLCBlbmQgc2VhcmNoICovCisKKwkJCXJldHVybiAoTlVMTCk7CisJCX0KKworCQlpZiAocGFyZW50LT5jb21tb24ubmV4dCkgeworCisJCQkvKiBGb3VuZCBzaWJsaW5nIG9mIHBhcmVudCAqLworCisJCQlyZXR1cm4gKHBhcmVudC0+Y29tbW9uLm5leHQpOworCQl9CisKKwkJb3AgPSBwYXJlbnQ7CisJCXBhcmVudCA9IHBhcmVudC0+Y29tbW9uLnBhcmVudDsKKwl9CisKKwlyZXR1cm4gKG5leHQpOworfQorCisjaWZkZWYgQUNQSV9PQlNPTEVURV9GVU5DVElPTlMKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfcHNfZ2V0X2NoaWxkCisgKgorICogUEFSQU1FVEVSUzogIE9wICAgICAgICAgICAgICAtIEdldCB0aGUgY2hpbGQgb2YgdGhpcyBPcAorICoKKyAqIFJFVFVSTjogICAgICBDaGlsZCBPcCwgTnVsbCBpZiBub25lIGlzIGZvdW5kLgorICoKKyAqIERFU0NSSVBUSU9OOiBHZXQgb3AncyBjaGlsZHJlbiBvciBOVUxMIGlmIG5vbmUKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqYWNwaV9wc19nZXRfY2hpbGQodW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKm9wKQoreworCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpjaGlsZCA9IE5VTEw7CisKKwlBQ1BJX0ZVTkNUSU9OX0VOVFJZKCk7CisKKwlzd2l0Y2ggKG9wLT5jb21tb24uYW1sX29wY29kZSkgeworCWNhc2UgQU1MX1NDT1BFX09QOgorCWNhc2UgQU1MX0VMU0VfT1A6CisJY2FzZSBBTUxfREVWSUNFX09QOgorCWNhc2UgQU1MX1RIRVJNQUxfWk9ORV9PUDoKKwljYXNlIEFNTF9JTlRfTUVUSE9EQ0FMTF9PUDoKKworCQljaGlsZCA9IGFjcGlfcHNfZ2V0X2FyZyhvcCwgMCk7CisJCWJyZWFrOworCisJY2FzZSBBTUxfQlVGRkVSX09QOgorCWNhc2UgQU1MX1BBQ0tBR0VfT1A6CisJY2FzZSBBTUxfTUVUSE9EX09QOgorCWNhc2UgQU1MX0lGX09QOgorCWNhc2UgQU1MX1dISUxFX09QOgorCWNhc2UgQU1MX0ZJRUxEX09QOgorCisJCWNoaWxkID0gYWNwaV9wc19nZXRfYXJnKG9wLCAxKTsKKwkJYnJlYWs7CisKKwljYXNlIEFNTF9QT1dFUl9SRVNfT1A6CisJY2FzZSBBTUxfSU5ERVhfRklFTERfT1A6CisKKwkJY2hpbGQgPSBhY3BpX3BzX2dldF9hcmcob3AsIDIpOworCQlicmVhazsKKworCWNhc2UgQU1MX1BST0NFU1NPUl9PUDoKKwljYXNlIEFNTF9CQU5LX0ZJRUxEX09QOgorCisJCWNoaWxkID0gYWNwaV9wc19nZXRfYXJnKG9wLCAzKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQkvKiBBbGwgb3RoZXJzIGhhdmUgbm8gY2hpbGRyZW4gKi8KKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIChjaGlsZCk7Cit9CisjZW5kaWYKKyNlbmRpZgkJCQkvKiAgQUNQSV9GVVRVUkVfVVNBR0UgICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL3BzdXRpbHMuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvcHN1dGlscy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2MzZlMDcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL3BzdXRpbHMuYwpAQCAtMCwwICsxLDI0NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIE1vZHVsZSBOYW1lOiBwc3V0aWxzIC0gUGFyc2VyIG1pc2NlbGxhbmVvdXMgdXRpbGl0aWVzIChQYXJzZXIgb25seSkKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA4LCBJbnRlbCBDb3JwLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAorICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgYXQgbWluaW11bSBhIGRpc2NsYWltZXIKKyAqICAgIHN1YnN0YW50aWFsbHkgc2ltaWxhciB0byB0aGUgIk5PIFdBUlJBTlRZIiBkaXNjbGFpbWVyIGJlbG93CisgKiAgICAoIkRpc2NsYWltZXIiKSBhbmQgYW55IHJlZGlzdHJpYnV0aW9uIG11c3QgYmUgY29uZGl0aW9uZWQgdXBvbgorICogICAgaW5jbHVkaW5nIGEgc3Vic3RhbnRpYWxseSBzaW1pbGFyIERpc2NsYWltZXIgcmVxdWlyZW1lbnQgZm9yIGZ1cnRoZXIKKyAqICAgIGJpbmFyeSByZWRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcworICogICAgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBOTyBXQVJSQU5UWQorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcKKyAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgorICovCisKKyNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KKyNpbmNsdWRlICJhY2NvbW1vbi5oIgorI2luY2x1ZGUgImFjcGFyc2VyLmgiCisjaW5jbHVkZSAiYW1sY29kZS5oIgorCisjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9QQVJTRVIKK0FDUElfTU9EVUxFX05BTUUoInBzdXRpbHMiKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX3BzX2NyZWF0ZV9zY29wZV9vcAorICoKKyAqIFBBUkFNRVRFUlM6ICBOb25lCisgKgorICogUkVUVVJOOiAgICAgIEEgbmV3IFNjb3BlIG9iamVjdCwgbnVsbCBvbiBmYWlsdXJlCisgKgorICogREVTQ1JJUFRJT046IENyZWF0ZSBhIFNjb3BlIGFuZCBhc3NvY2lhdGVkIG5hbWVwYXRoIG9wIHdpdGggdGhlIHJvb3QgbmFtZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqYWNwaV9wc19jcmVhdGVfc2NvcGVfb3Aodm9pZCkKK3sKKwl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqc2NvcGVfb3A7CisKKwlzY29wZV9vcCA9IGFjcGlfcHNfYWxsb2Nfb3AoQU1MX1NDT1BFX09QKTsKKwlpZiAoIXNjb3BlX29wKSB7CisJCXJldHVybiAoTlVMTCk7CisJfQorCisJc2NvcGVfb3AtPm5hbWVkLm5hbWUgPSBBQ1BJX1JPT1RfTkFNRTsKKwlyZXR1cm4gKHNjb3BlX29wKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9wc19pbml0X29wCisgKgorICogUEFSQU1FVEVSUzogIE9wICAgICAgICAgICAgICAtIEEgbmV3bHkgYWxsb2NhdGVkIE9wIG9iamVjdAorICogICAgICAgICAgICAgIE9wY29kZSAgICAgICAgICAtIE9wY29kZSB0byBzdG9yZSBpbiB0aGUgT3AKKyAqCisgKiBSRVRVUk46ICAgICAgTm9uZQorICoKKyAqIERFU0NSSVBUSU9OOiBJbml0aWFsaXplIGEgcGFyc2UgKE9wKSBvYmplY3QKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIGFjcGlfcHNfaW5pdF9vcCh1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqb3AsIHUxNiBvcGNvZGUpCit7CisJQUNQSV9GVU5DVElPTl9FTlRSWSgpOworCisJb3AtPmNvbW1vbi5kZXNjcmlwdG9yX3R5cGUgPSBBQ1BJX0RFU0NfVFlQRV9QQVJTRVI7CisJb3AtPmNvbW1vbi5hbWxfb3Bjb2RlID0gb3Bjb2RlOworCisJQUNQSV9ESVNBU01fT05MWV9NRU1CRVJTKEFDUElfU1RSTkNQWShvcC0+Y29tbW9uLmFtbF9vcF9uYW1lLAorCQkJCQkgICAgICAoYWNwaV9wc19nZXRfb3Bjb2RlX2luZm8KKwkJCQkJICAgICAgIChvcGNvZGUpKS0+bmFtZSwKKwkJCQkJICAgICAgc2l6ZW9mKG9wLT5jb21tb24uYW1sX29wX25hbWUpKSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfcHNfYWxsb2Nfb3AKKyAqCisgKiBQQVJBTUVURVJTOiAgT3Bjb2RlICAgICAgICAgIC0gT3Bjb2RlIHRoYXQgd2lsbCBiZSBzdG9yZWQgaW4gdGhlIG5ldyBPcAorICoKKyAqIFJFVFVSTjogICAgICBQb2ludGVyIHRvIHRoZSBuZXcgT3AsIG51bGwgb24gZmFpbHVyZQorICoKKyAqIERFU0NSSVBUSU9OOiBBbGxvY2F0ZSBhbiBhY3BpX29wLCBjaG9vc2Ugb3AgdHlwZSAoYW5kIHRodXMgc2l6ZSkgYmFzZWQgb24KKyAqICAgICAgICAgICAgICBvcGNvZGUuICBBIGNhY2hlIG9mIG9wY29kZXMgaXMgYXZhaWxhYmxlIGZvciB0aGUgcHVyZQorICogICAgICAgICAgICAgIEdFTkVSSUNfT1AsIHNpbmNlIHRoaXMgaXMgYnkgZmFyIHRoZSBtb3N0IGNvbW1vbmx5IHVzZWQuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKmFjcGlfcHNfYWxsb2Nfb3AodTE2IG9wY29kZSkKK3sKKwl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqb3A7CisJY29uc3Qgc3RydWN0IGFjcGlfb3Bjb2RlX2luZm8gKm9wX2luZm87CisJdTggZmxhZ3MgPSBBQ1BJX1BBUlNFT1BfR0VORVJJQzsKKworCUFDUElfRlVOQ1RJT05fRU5UUlkoKTsKKworCW9wX2luZm8gPSBhY3BpX3BzX2dldF9vcGNvZGVfaW5mbyhvcGNvZGUpOworCisJLyogRGV0ZXJtaW5lIHR5cGUgb2YgcGFyc2Vfb3AgcmVxdWlyZWQgKi8KKworCWlmIChvcF9pbmZvLT5mbGFncyAmIEFNTF9ERUZFUikgeworCQlmbGFncyA9IEFDUElfUEFSU0VPUF9ERUZFUlJFRDsKKwl9IGVsc2UgaWYgKG9wX2luZm8tPmZsYWdzICYgQU1MX05BTUVEKSB7CisJCWZsYWdzID0gQUNQSV9QQVJTRU9QX05BTUVEOworCX0gZWxzZSBpZiAob3Bjb2RlID09IEFNTF9JTlRfQllURUxJU1RfT1ApIHsKKwkJZmxhZ3MgPSBBQ1BJX1BBUlNFT1BfQllURUxJU1Q7CisJfQorCisJLyogQWxsb2NhdGUgdGhlIG1pbmltdW0gcmVxdWlyZWQgc2l6ZSBvYmplY3QgKi8KKworCWlmIChmbGFncyA9PSBBQ1BJX1BBUlNFT1BfR0VORVJJQykgeworCisJCS8qIFRoZSBnZW5lcmljIG9wIChkZWZhdWx0KSBpcyBieSBmYXIgdGhlIG1vc3QgY29tbW9uICgxNiB0byAxKSAqLworCisJCW9wID0gYWNwaV9vc19hY3F1aXJlX29iamVjdChhY3BpX2dibF9wc19ub2RlX2NhY2hlKTsKKwl9IGVsc2UgeworCQkvKiBFeHRlbmRlZCBwYXJzZW9wICovCisKKwkJb3AgPSBhY3BpX29zX2FjcXVpcmVfb2JqZWN0KGFjcGlfZ2JsX3BzX25vZGVfZXh0X2NhY2hlKTsKKwl9CisKKwkvKiBJbml0aWFsaXplIHRoZSBPcCAqLworCisJaWYgKG9wKSB7CisJCWFjcGlfcHNfaW5pdF9vcChvcCwgb3Bjb2RlKTsKKwkJb3AtPmNvbW1vbi5mbGFncyA9IGZsYWdzOworCX0KKworCXJldHVybiAob3ApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX3BzX2ZyZWVfb3AKKyAqCisgKiBQQVJBTUVURVJTOiAgT3AgICAgICAgICAgICAgIC0gT3AgdG8gYmUgZnJlZWQKKyAqCisgKiBSRVRVUk46ICAgICAgTm9uZS4KKyAqCisgKiBERVNDUklQVElPTjogRnJlZSBhbiBPcCBvYmplY3QuICBFaXRoZXIgcHV0IGl0IG9uIHRoZSBHRU5FUklDX09QIGNhY2hlIGxpc3QKKyAqICAgICAgICAgICAgICBvciBhY3R1YWxseSBmcmVlIGl0LgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgYWNwaV9wc19mcmVlX29wKHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpvcCkKK3sKKwlBQ1BJX0ZVTkNUSU9OX05BTUUocHNfZnJlZV9vcCk7CisKKwlpZiAob3AtPmNvbW1vbi5hbWxfb3Bjb2RlID09IEFNTF9JTlRfUkVUVVJOX1ZBTFVFX09QKSB7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfQUxMT0NBVElPTlMsICJGcmVlIHJldHZhbCBvcDogJXBcbiIsCisJCQkJICBvcCkpOworCX0KKworCWlmIChvcC0+Y29tbW9uLmZsYWdzICYgQUNQSV9QQVJTRU9QX0dFTkVSSUMpIHsKKwkJKHZvaWQpYWNwaV9vc19yZWxlYXNlX29iamVjdChhY3BpX2dibF9wc19ub2RlX2NhY2hlLCBvcCk7CisJfSBlbHNlIHsKKwkJKHZvaWQpYWNwaV9vc19yZWxlYXNlX29iamVjdChhY3BpX2dibF9wc19ub2RlX2V4dF9jYWNoZSwgb3ApOworCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgVXRpbGl0eSBmdW5jdGlvbnMKKyAqCisgKiBERVNDUklQVElPTjogTG93IGxldmVsIGNoYXJhY3RlciBhbmQgb2JqZWN0IGZ1bmN0aW9ucworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBJcyAiYyIgYSBuYW1lc3RyaW5nIGxlYWQgY2hhcmFjdGVyPworICovCit1OCBhY3BpX3BzX2lzX2xlYWRpbmdfY2hhcih1MzIgYykKK3sKKwlyZXR1cm4gKCh1OCkgKGMgPT0gJ18nIHx8IChjID49ICdBJyAmJiBjIDw9ICdaJykpKTsKK30KKworLyoKKyAqIElzICJjIiBhIG5hbWVzdHJpbmcgcHJlZml4IGNoYXJhY3Rlcj8KKyAqLwordTggYWNwaV9wc19pc19wcmVmaXhfY2hhcih1MzIgYykKK3sKKwlyZXR1cm4gKCh1OCkgKGMgPT0gJ1xcJyB8fCBjID09ICdeJykpOworfQorCisvKgorICogR2V0IG9wJ3MgbmFtZSAoNC1ieXRlIG5hbWUgc2VnbWVudCkgb3IgMCBpZiB1bm5hbWVkCisgKi8KKyNpZmRlZiBBQ1BJX0ZVVFVSRV9VU0FHRQordTMyIGFjcGlfcHNfZ2V0X25hbWUodW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKiBvcCkKK3sKKworCS8qIFRoZSAiZ2VuZXJpYyIgb2JqZWN0IGhhcyBubyBuYW1lIGFzc29jaWF0ZWQgd2l0aCBpdCAqLworCisJaWYgKG9wLT5jb21tb24uZmxhZ3MgJiBBQ1BJX1BBUlNFT1BfR0VORVJJQykgeworCQlyZXR1cm4gKDApOworCX0KKworCS8qIE9ubHkgdGhlICJFeHRlbmRlZCIgcGFyc2Ugb2JqZWN0cyBoYXZlIGEgbmFtZSAqLworCisJcmV0dXJuIChvcC0+bmFtZWQubmFtZSk7Cit9CisjZW5kaWYJCQkJLyogIEFDUElfRlVUVVJFX1VTQUdFICAqLworCisvKgorICogU2V0IG9wJ3MgbmFtZQorICovCit2b2lkIGFjcGlfcHNfc2V0X25hbWUodW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKm9wLCB1MzIgbmFtZSkKK3sKKworCS8qIFRoZSAiZ2VuZXJpYyIgb2JqZWN0IGhhcyBubyBuYW1lIGFzc29jaWF0ZWQgd2l0aCBpdCAqLworCisJaWYgKG9wLT5jb21tb24uZmxhZ3MgJiBBQ1BJX1BBUlNFT1BfR0VORVJJQykgeworCQlyZXR1cm47CisJfQorCisJb3AtPm5hbWVkLm5hbWUgPSBuYW1lOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS9wc3dhbGsuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvcHN3YWxrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzhiOGI3OQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvcHN3YWxrLmMKQEAgLTAsMCArMSwxMTAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBNb2R1bGUgTmFtZTogcHN3YWxrIC0gUGFyc2VyIHJvdXRpbmVzIHRvIHdhbGsgcGFyc2VkIG9wIHRyZWUocykKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA4LCBJbnRlbCBDb3JwLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAorICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgYXQgbWluaW11bSBhIGRpc2NsYWltZXIKKyAqICAgIHN1YnN0YW50aWFsbHkgc2ltaWxhciB0byB0aGUgIk5PIFdBUlJBTlRZIiBkaXNjbGFpbWVyIGJlbG93CisgKiAgICAoIkRpc2NsYWltZXIiKSBhbmQgYW55IHJlZGlzdHJpYnV0aW9uIG11c3QgYmUgY29uZGl0aW9uZWQgdXBvbgorICogICAgaW5jbHVkaW5nIGEgc3Vic3RhbnRpYWxseSBzaW1pbGFyIERpc2NsYWltZXIgcmVxdWlyZW1lbnQgZm9yIGZ1cnRoZXIKKyAqICAgIGJpbmFyeSByZWRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcworICogICAgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBOTyBXQVJSQU5UWQorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcKKyAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgorICovCisKKyNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KKyNpbmNsdWRlICJhY2NvbW1vbi5oIgorI2luY2x1ZGUgImFjcGFyc2VyLmgiCisKKyNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX1BBUlNFUgorQUNQSV9NT0RVTEVfTkFNRSgicHN3YWxrIikKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9wc19kZWxldGVfcGFyc2VfdHJlZQorICoKKyAqIFBBUkFNRVRFUlM6ICBzdWJ0cmVlX3Jvb3QgICAgICAgIC0gUm9vdCBvZiB0cmVlIChvciBzdWJ0cmVlKSB0byBkZWxldGUKKyAqCisgKiBSRVRVUk46ICAgICAgTm9uZQorICoKKyAqIERFU0NSSVBUSU9OOiBEZWxldGUgYSBwb3J0aW9uIG9mIG9yIGFuIGVudGlyZSBwYXJzZSB0cmVlLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGFjcGlfcHNfZGVsZXRlX3BhcnNlX3RyZWUodW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKnN1YnRyZWVfcm9vdCkKK3sKKwl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqb3AgPSBzdWJ0cmVlX3Jvb3Q7CisJdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKm5leHQgPSBOVUxMOworCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpwYXJlbnQgPSBOVUxMOworCisJQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIocHNfZGVsZXRlX3BhcnNlX3RyZWUsIHN1YnRyZWVfcm9vdCk7CisKKwkvKiBWaXNpdCBhbGwgbm9kZXMgaW4gdGhlIHN1YnRyZWUgKi8KKworCXdoaWxlIChvcCkgeworCisJCS8qIENoZWNrIGlmIHdlIGFyZSBub3QgYXNjZW5kaW5nICovCisKKwkJaWYgKG9wICE9IHBhcmVudCkgeworCisJCQkvKiBMb29rIGZvciBhbiBhcmd1bWVudCBvciBjaGlsZCBvZiB0aGUgY3VycmVudCBvcCAqLworCisJCQluZXh0ID0gYWNwaV9wc19nZXRfYXJnKG9wLCAwKTsKKwkJCWlmIChuZXh0KSB7CisKKwkJCQkvKiBTdGlsbCBnb2luZyBkb3dud2FyZCBpbiB0cmVlIChPcCBpcyBub3QgY29tcGxldGVkIHlldCkgKi8KKworCQkJCW9wID0gbmV4dDsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJfQorCisJCS8qIE5vIG1vcmUgY2hpbGRyZW4sIHRoaXMgT3AgaXMgY29tcGxldGUuICovCisKKwkJbmV4dCA9IG9wLT5jb21tb24ubmV4dDsKKwkJcGFyZW50ID0gb3AtPmNvbW1vbi5wYXJlbnQ7CisKKwkJYWNwaV9wc19mcmVlX29wKG9wKTsKKworCQkvKiBJZiB3ZSBhcmUgYmFjayB0byB0aGUgc3RhcnRpbmcgcG9pbnQsIHRoZSB3YWxrIGlzIGNvbXBsZXRlLiAqLworCisJCWlmIChvcCA9PSBzdWJ0cmVlX3Jvb3QpIHsKKwkJCXJldHVybl9WT0lEOworCQl9CisJCWlmIChuZXh0KSB7CisJCQlvcCA9IG5leHQ7CisJCX0gZWxzZSB7CisJCQlvcCA9IHBhcmVudDsKKwkJfQorCX0KKworCXJldHVybl9WT0lEOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS9wc3hmYWNlLmMgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL3BzeGZhY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjA2MDMyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS9wc3hmYWNlLmMKQEAgLTAsMCArMSwzODUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBNb2R1bGUgTmFtZTogcHN4ZmFjZSAtIFBhcnNlciBleHRlcm5hbCBpbnRlcmZhY2VzCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwOCwgSW50ZWwgQ29ycC4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKKyAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIGF0IG1pbmltdW0gYSBkaXNjbGFpbWVyCisgKiAgICBzdWJzdGFudGlhbGx5IHNpbWlsYXIgdG8gdGhlICJOTyBXQVJSQU5UWSIgZGlzY2xhaW1lciBiZWxvdworICogICAgKCJEaXNjbGFpbWVyIikgYW5kIGFueSByZWRpc3RyaWJ1dGlvbiBtdXN0IGJlIGNvbmRpdGlvbmVkIHVwb24KKyAqICAgIGluY2x1ZGluZyBhIHN1YnN0YW50aWFsbHkgc2ltaWxhciBEaXNjbGFpbWVyIHJlcXVpcmVtZW50IGZvciBmdXJ0aGVyCisgKiAgICBiaW5hcnkgcmVkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMKKyAqICAgIG9mIGFueSBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogTk8gV0FSUkFOVFkKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HCisgKiBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KKyAqLworCisjaW5jbHVkZSA8YWNwaS9hY3BpLmg+CisjaW5jbHVkZSAiYWNjb21tb24uaCIKKyNpbmNsdWRlICJhY3BhcnNlci5oIgorI2luY2x1ZGUgImFjZGlzcGF0LmgiCisjaW5jbHVkZSAiYWNpbnRlcnAuaCIKKyNpbmNsdWRlICJhbWxjb2RlLmgiCisKKyNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX1BBUlNFUgorQUNQSV9NT0RVTEVfTkFNRSgicHN4ZmFjZSIpCisKKy8qIExvY2FsIFByb3RvdHlwZXMgKi8KK3N0YXRpYyB2b2lkIGFjcGlfcHNfc3RhcnRfdHJhY2Uoc3RydWN0IGFjcGlfZXZhbHVhdGVfaW5mbyAqaW5mbyk7CisKK3N0YXRpYyB2b2lkIGFjcGlfcHNfc3RvcF90cmFjZShzdHJ1Y3QgYWNwaV9ldmFsdWF0ZV9pbmZvICppbmZvKTsKKworc3RhdGljIHZvaWQKK2FjcGlfcHNfdXBkYXRlX3BhcmFtZXRlcl9saXN0KHN0cnVjdCBhY3BpX2V2YWx1YXRlX2luZm8gKmluZm8sIHUxNiBhY3Rpb24pOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX2RlYnVnX3RyYWNlCisgKgorICogUEFSQU1FVEVSUzogIG1ldGhvZF9uYW1lICAgICAtIFZhbGlkIEFDUEkgbmFtZSBzdHJpbmcKKyAqICAgICAgICAgICAgICBkZWJ1Z19sZXZlbCAgICAgLSBPcHRpb25hbCBsZXZlbCBtYXNrLiAwIHRvIHVzZSBkZWZhdWx0CisgKiAgICAgICAgICAgICAgZGVidWdfbGF5ZXIgICAgIC0gT3B0aW9uYWwgbGF5ZXIgbWFzay4gMCB0byB1c2UgZGVmYXVsdAorICogICAgICAgICAgICAgIEZsYWdzICAgICAgICAgICAtIGJpdCAxOiBvbmUgc2hvdCgxKSBvciBwZXJzaXN0ZW50KDApCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBFeHRlcm5hbCBpbnRlcmZhY2UgdG8gZW5hYmxlIGRlYnVnIHRyYWNpbmcgZHVyaW5nIGNvbnRyb2wKKyAqICAgICAgICAgICAgICBtZXRob2QgZXhlY3V0aW9uCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworYWNwaV9zdGF0dXMKK2FjcGlfZGVidWdfdHJhY2UoY2hhciAqbmFtZSwgdTMyIGRlYnVnX2xldmVsLCB1MzIgZGVidWdfbGF5ZXIsIHUzMiBmbGFncykKK3sKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisKKwlzdGF0dXMgPSBhY3BpX3V0X2FjcXVpcmVfbXV0ZXgoQUNQSV9NVFhfTkFNRVNQQUNFKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuIChzdGF0dXMpOworCX0KKworCS8qIFRCRHM6IFZhbGlkYXRlIG5hbWUsIGFsbG93IGZ1bGwgcGF0aCBvciBqdXN0IG5hbWVzZWcgKi8KKworCWFjcGlfZ2JsX3RyYWNlX21ldGhvZF9uYW1lID0gKkFDUElfQ0FTVF9QVFIodTMyLCBuYW1lKTsKKwlhY3BpX2dibF90cmFjZV9mbGFncyA9IGZsYWdzOworCisJaWYgKGRlYnVnX2xldmVsKSB7CisJCWFjcGlfZ2JsX3RyYWNlX2RiZ19sZXZlbCA9IGRlYnVnX2xldmVsOworCX0KKwlpZiAoZGVidWdfbGF5ZXIpIHsKKwkJYWNwaV9nYmxfdHJhY2VfZGJnX2xheWVyID0gZGVidWdfbGF5ZXI7CisJfQorCisJKHZvaWQpYWNwaV91dF9yZWxlYXNlX211dGV4KEFDUElfTVRYX05BTUVTUEFDRSk7CisJcmV0dXJuIChBRV9PSyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfcHNfc3RhcnRfdHJhY2UKKyAqCisgKiBQQVJBTUVURVJTOiAgSW5mbyAgICAgICAgLSBNZXRob2QgaW5mbyBzdHJ1Y3QKKyAqCisgKiBSRVRVUk46ICAgICAgTm9uZQorICoKKyAqIERFU0NSSVBUSU9OOiBTdGFydCBjb250cm9sIG1ldGhvZCBleGVjdXRpb24gdHJhY2UKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZCBhY3BpX3BzX3N0YXJ0X3RyYWNlKHN0cnVjdCBhY3BpX2V2YWx1YXRlX2luZm8gKmluZm8pCit7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCisJQUNQSV9GVU5DVElPTl9FTlRSWSgpOworCisJc3RhdHVzID0gYWNwaV91dF9hY3F1aXJlX211dGV4KEFDUElfTVRYX05BTUVTUEFDRSk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXJldHVybjsKKwl9CisKKwlpZiAoKCFhY3BpX2dibF90cmFjZV9tZXRob2RfbmFtZSkgfHwKKwkgICAgKGFjcGlfZ2JsX3RyYWNlX21ldGhvZF9uYW1lICE9IGluZm8tPnJlc29sdmVkX25vZGUtPm5hbWUuaW50ZWdlcikpIHsKKwkJZ290byBleGl0OworCX0KKworCWFjcGlfZ2JsX29yaWdpbmFsX2RiZ19sZXZlbCA9IGFjcGlfZGJnX2xldmVsOworCWFjcGlfZ2JsX29yaWdpbmFsX2RiZ19sYXllciA9IGFjcGlfZGJnX2xheWVyOworCisJYWNwaV9kYmdfbGV2ZWwgPSAweDAwRkZGRkZGOworCWFjcGlfZGJnX2xheWVyID0gQUNQSV9VSU5UMzJfTUFYOworCisJaWYgKGFjcGlfZ2JsX3RyYWNlX2RiZ19sZXZlbCkgeworCQlhY3BpX2RiZ19sZXZlbCA9IGFjcGlfZ2JsX3RyYWNlX2RiZ19sZXZlbDsKKwl9CisJaWYgKGFjcGlfZ2JsX3RyYWNlX2RiZ19sYXllcikgeworCQlhY3BpX2RiZ19sYXllciA9IGFjcGlfZ2JsX3RyYWNlX2RiZ19sYXllcjsKKwl9CisKKyAgICAgIGV4aXQ6CisJKHZvaWQpYWNwaV91dF9yZWxlYXNlX211dGV4KEFDUElfTVRYX05BTUVTUEFDRSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfcHNfc3RvcF90cmFjZQorICoKKyAqIFBBUkFNRVRFUlM6ICBJbmZvICAgICAgICAtIE1ldGhvZCBpbmZvIHN0cnVjdAorICoKKyAqIFJFVFVSTjogICAgICBOb25lCisgKgorICogREVTQ1JJUFRJT046IFN0b3AgY29udHJvbCBtZXRob2QgZXhlY3V0aW9uIHRyYWNlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQgYWNwaV9wc19zdG9wX3RyYWNlKHN0cnVjdCBhY3BpX2V2YWx1YXRlX2luZm8gKmluZm8pCit7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCisJQUNQSV9GVU5DVElPTl9FTlRSWSgpOworCisJc3RhdHVzID0gYWNwaV91dF9hY3F1aXJlX211dGV4KEFDUElfTVRYX05BTUVTUEFDRSk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXJldHVybjsKKwl9CisKKwlpZiAoKCFhY3BpX2dibF90cmFjZV9tZXRob2RfbmFtZSkgfHwKKwkgICAgKGFjcGlfZ2JsX3RyYWNlX21ldGhvZF9uYW1lICE9IGluZm8tPnJlc29sdmVkX25vZGUtPm5hbWUuaW50ZWdlcikpIHsKKwkJZ290byBleGl0OworCX0KKworCS8qIERpc2FibGUgZnVydGhlciB0cmFjaW5nIGlmIHR5cGUgaXMgb25lLXNob3QgKi8KKworCWlmIChhY3BpX2dibF90cmFjZV9mbGFncyAmIDEpIHsKKwkJYWNwaV9nYmxfdHJhY2VfbWV0aG9kX25hbWUgPSAwOworCQlhY3BpX2dibF90cmFjZV9kYmdfbGV2ZWwgPSAwOworCQlhY3BpX2dibF90cmFjZV9kYmdfbGF5ZXIgPSAwOworCX0KKworCWFjcGlfZGJnX2xldmVsID0gYWNwaV9nYmxfb3JpZ2luYWxfZGJnX2xldmVsOworCWFjcGlfZGJnX2xheWVyID0gYWNwaV9nYmxfb3JpZ2luYWxfZGJnX2xheWVyOworCisgICAgICBleGl0OgorCSh2b2lkKWFjcGlfdXRfcmVsZWFzZV9tdXRleChBQ1BJX01UWF9OQU1FU1BBQ0UpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX3BzX2V4ZWN1dGVfbWV0aG9kCisgKgorICogUEFSQU1FVEVSUzogIEluZm8gICAgICAgICAgICAtIE1ldGhvZCBpbmZvIGJsb2NrLCBjb250YWluczoKKyAqICAgICAgICAgICAgICAgICAgTm9kZSAgICAgICAgICAgIC0gTWV0aG9kIE5vZGUgdG8gZXhlY3V0ZQorICogICAgICAgICAgICAgICAgICBvYmpfZGVzYyAgICAgICAgLSBNZXRob2Qgb2JqZWN0CisgKiAgICAgICAgICAgICAgICAgIFBhcmFtZXRlcnMgICAgICAtIExpc3Qgb2YgcGFyYW1ldGVycyB0byBwYXNzIHRvIHRoZSBtZXRob2QsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlcm1pbmF0ZWQgYnkgTlVMTC4gUGFyYW1zIGl0c2VsZiBtYXkgYmUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCBpZiBubyBwYXJhbWV0ZXJzIGFyZSBiZWluZyBwYXNzZWQuCisgKiAgICAgICAgICAgICAgICAgIHJldHVybl9vYmplY3QgICAtIFdoZXJlIHRvIHB1dCBtZXRob2QncyByZXR1cm4gdmFsdWUgKGlmCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFueSkuIElmIE5VTEwsIG5vIHZhbHVlIGlzIHJldHVybmVkLgorICogICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJfdHlwZSAgLSBUeXBlIG9mIFBhcmFtZXRlciBsaXN0CisgKiAgICAgICAgICAgICAgICAgIHJldHVybl9vYmplY3QgICAtIFdoZXJlIHRvIHB1dCBtZXRob2QncyByZXR1cm4gdmFsdWUgKGlmCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFueSkuIElmIE5VTEwsIG5vIHZhbHVlIGlzIHJldHVybmVkLgorICogICAgICAgICAgICAgICAgICBwYXNzX251bWJlciAgICAgLSBQYXJzZSBvciBleGVjdXRlIHBhc3MKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IEV4ZWN1dGUgYSBjb250cm9sIG1ldGhvZAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2FjcGlfc3RhdHVzIGFjcGlfcHNfZXhlY3V0ZV9tZXRob2Qoc3RydWN0IGFjcGlfZXZhbHVhdGVfaW5mbyAqaW5mbykKK3sKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKm9wOworCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGU7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKHBzX2V4ZWN1dGVfbWV0aG9kKTsKKworCS8qIFZhbGlkYXRlIHRoZSBJbmZvIGFuZCBtZXRob2QgTm9kZSAqLworCisJaWYgKCFpbmZvIHx8ICFpbmZvLT5yZXNvbHZlZF9ub2RlKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OVUxMX0VOVFJZKTsKKwl9CisKKwkvKiBJbml0IGZvciBuZXcgbWV0aG9kLCB3YWl0IG9uIGNvbmN1cnJlbmN5IHNlbWFwaG9yZSAqLworCisJc3RhdHVzID0KKwkgICAgYWNwaV9kc19iZWdpbl9tZXRob2RfZXhlY3V0aW9uKGluZm8tPnJlc29sdmVkX25vZGUsIGluZm8tPm9ial9kZXNjLAorCQkJCQkgICBOVUxMKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CisJfQorCisJLyoKKwkgKiBUaGUgY2FsbGVyICJvd25zIiB0aGUgcGFyYW1ldGVycywgc28gZ2l2ZSBlYWNoIG9uZSBhbiBleHRyYSByZWZlcmVuY2UKKwkgKi8KKwlhY3BpX3BzX3VwZGF0ZV9wYXJhbWV0ZXJfbGlzdChpbmZvLCBSRUZfSU5DUkVNRU5UKTsKKworCS8qIEJlZ2luIHRyYWNpbmcgaWYgcmVxdWVzdGVkICovCisKKwlhY3BpX3BzX3N0YXJ0X3RyYWNlKGluZm8pOworCisJLyoKKwkgKiBFeGVjdXRlIHRoZSBtZXRob2QuIFBlcmZvcm1zIHBhcnNlIHNpbXVsdGFuZW91c2x5CisJICovCisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9QQVJTRSwKKwkJCSAgIioqKiogQmVnaW4gTWV0aG9kIFBhcnNlL0V4ZWN1dGUgWyU0LjRzXSAqKioqIE5vZGU9JXAgT2JqPSVwXG4iLAorCQkJICBpbmZvLT5yZXNvbHZlZF9ub2RlLT5uYW1lLmFzY2lpLCBpbmZvLT5yZXNvbHZlZF9ub2RlLAorCQkJICBpbmZvLT5vYmpfZGVzYykpOworCisJLyogQ3JlYXRlIGFuZCBpbml0IGEgUm9vdCBOb2RlICovCisKKwlvcCA9IGFjcGlfcHNfY3JlYXRlX3Njb3BlX29wKCk7CisJaWYgKCFvcCkgeworCQlzdGF0dXMgPSBBRV9OT19NRU1PUlk7CisJCWdvdG8gY2xlYW51cDsKKwl9CisKKwkvKiBDcmVhdGUgYW5kIGluaXRpYWxpemUgYSBuZXcgd2FsayBzdGF0ZSAqLworCisJaW5mby0+cGFzc19udW1iZXIgPSBBQ1BJX0lNT0RFX0VYRUNVVEU7CisJd2Fsa19zdGF0ZSA9CisJICAgIGFjcGlfZHNfY3JlYXRlX3dhbGtfc3RhdGUoaW5mby0+b2JqX2Rlc2MtPm1ldGhvZC5vd25lcl9pZCwgTlVMTCwKKwkJCQkgICAgICBOVUxMLCBOVUxMKTsKKwlpZiAoIXdhbGtfc3RhdGUpIHsKKwkJc3RhdHVzID0gQUVfTk9fTUVNT1JZOworCQlnb3RvIGNsZWFudXA7CisJfQorCisJc3RhdHVzID0gYWNwaV9kc19pbml0X2FtbF93YWxrKHdhbGtfc3RhdGUsIG9wLCBpbmZvLT5yZXNvbHZlZF9ub2RlLAorCQkJCSAgICAgICBpbmZvLT5vYmpfZGVzYy0+bWV0aG9kLmFtbF9zdGFydCwKKwkJCQkgICAgICAgaW5mby0+b2JqX2Rlc2MtPm1ldGhvZC5hbWxfbGVuZ3RoLCBpbmZvLAorCQkJCSAgICAgICBpbmZvLT5wYXNzX251bWJlcik7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCWFjcGlfZHNfZGVsZXRlX3dhbGtfc3RhdGUod2Fsa19zdGF0ZSk7CisJCWdvdG8gY2xlYW51cDsKKwl9CisKKwkvKiBJbnZva2UgYW4gaW50ZXJuYWwgbWV0aG9kIGlmIG5lY2Vzc2FyeSAqLworCisJaWYgKGluZm8tPm9ial9kZXNjLT5tZXRob2QubWV0aG9kX2ZsYWdzICYgQU1MX01FVEhPRF9JTlRFUk5BTF9PTkxZKSB7CisJCXN0YXR1cyA9IGluZm8tPm9ial9kZXNjLT5tZXRob2QuaW1wbGVtZW50YXRpb24od2Fsa19zdGF0ZSk7CisJCWluZm8tPnJldHVybl9vYmplY3QgPSB3YWxrX3N0YXRlLT5yZXR1cm5fZGVzYzsKKworCQkvKiBDbGVhbnVwIHN0YXRlcyAqLworCisJCWFjcGlfZHNfc2NvcGVfc3RhY2tfY2xlYXIod2Fsa19zdGF0ZSk7CisJCWFjcGlfcHNfY2xlYW51cF9zY29wZSgmd2Fsa19zdGF0ZS0+cGFyc2VyX3N0YXRlKTsKKwkJYWNwaV9kc190ZXJtaW5hdGVfY29udHJvbF9tZXRob2Qod2Fsa19zdGF0ZS0+bWV0aG9kX2Rlc2MsCisJCQkJCQkgd2Fsa19zdGF0ZSk7CisJCWFjcGlfZHNfZGVsZXRlX3dhbGtfc3RhdGUod2Fsa19zdGF0ZSk7CisJCWdvdG8gY2xlYW51cDsKKwl9CisKKwkvKgorCSAqIFN0YXJ0IG1ldGhvZCBldmFsdWF0aW9uIHdpdGggYW4gaW1wbGljaXQgcmV0dXJuIG9mIHplcm8uCisJICogVGhpcyBpcyBkb25lIGZvciBXaW5kb3dzIGNvbXBhdGliaWxpdHkuCisJICovCisJaWYgKGFjcGlfZ2JsX2VuYWJsZV9pbnRlcnByZXRlcl9zbGFjaykgeworCQl3YWxrX3N0YXRlLT5pbXBsaWNpdF9yZXR1cm5fb2JqID0KKwkJICAgIGFjcGlfdXRfY3JlYXRlX2ludGVybmFsX29iamVjdChBQ1BJX1RZUEVfSU5URUdFUik7CisJCWlmICghd2Fsa19zdGF0ZS0+aW1wbGljaXRfcmV0dXJuX29iaikgeworCQkJc3RhdHVzID0gQUVfTk9fTUVNT1JZOworCQkJYWNwaV9kc19kZWxldGVfd2Fsa19zdGF0ZSh3YWxrX3N0YXRlKTsKKwkJCWdvdG8gY2xlYW51cDsKKwkJfQorCisJCXdhbGtfc3RhdGUtPmltcGxpY2l0X3JldHVybl9vYmotPmludGVnZXIudmFsdWUgPSAwOworCX0KKworCS8qIFBhcnNlIHRoZSBBTUwgKi8KKworCXN0YXR1cyA9IGFjcGlfcHNfcGFyc2VfYW1sKHdhbGtfc3RhdGUpOworCisJLyogd2Fsa19zdGF0ZSB3YXMgZGVsZXRlZCBieSBwYXJzZV9hbWwgKi8KKworICAgICAgY2xlYW51cDoKKwlhY3BpX3BzX2RlbGV0ZV9wYXJzZV90cmVlKG9wKTsKKworCS8qIEVuZCBvcHRpb25hbCB0cmFjaW5nICovCisKKwlhY3BpX3BzX3N0b3BfdHJhY2UoaW5mbyk7CisKKwkvKiBUYWtlIGF3YXkgdGhlIGV4dHJhIHJlZmVyZW5jZSB0aGF0IHdlIGdhdmUgdGhlIHBhcmFtZXRlcnMgYWJvdmUgKi8KKworCWFjcGlfcHNfdXBkYXRlX3BhcmFtZXRlcl9saXN0KGluZm8sIFJFRl9ERUNSRU1FTlQpOworCisJLyogRXhpdCBub3cgaWYgZXJyb3IgYWJvdmUgKi8KKworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKKwl9CisKKwkvKgorCSAqIElmIHRoZSBtZXRob2QgaGFzIHJldHVybmVkIGFuIG9iamVjdCwgc2lnbmFsIHRoaXMgdG8gdGhlIGNhbGxlciB3aXRoCisJICogYSBjb250cm9sIGV4Y2VwdGlvbiBjb2RlCisJICovCisJaWYgKGluZm8tPnJldHVybl9vYmplY3QpIHsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9QQVJTRSwgIk1ldGhvZCByZXR1cm5lZCBPYmpEZXNjPSVwXG4iLAorCQkJCSAgaW5mby0+cmV0dXJuX29iamVjdCkpOworCQlBQ1BJX0RVTVBfU1RBQ0tfRU5UUlkoaW5mby0+cmV0dXJuX29iamVjdCk7CisKKwkJc3RhdHVzID0gQUVfQ1RSTF9SRVRVUk5fVkFMVUU7CisJfQorCisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfcHNfdXBkYXRlX3BhcmFtZXRlcl9saXN0CisgKgorICogUEFSQU1FVEVSUzogIEluZm8gICAgICAgICAgICAtIFNlZSBzdHJ1Y3QgYWNwaV9ldmFsdWF0ZV9pbmZvCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFVzZWQ6IHBhcmFtZXRlcl90eXBlIGFuZCBQYXJhbWV0ZXJzKQorICogICAgICAgICAgICAgIEFjdGlvbiAgICAgICAgICAtIEFkZCBvciBSZW1vdmUgcmVmZXJlbmNlCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBVcGRhdGUgcmVmZXJlbmNlIGNvdW50IG9uIGFsbCBtZXRob2QgcGFyYW1ldGVyIG9iamVjdHMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZAorYWNwaV9wc191cGRhdGVfcGFyYW1ldGVyX2xpc3Qoc3RydWN0IGFjcGlfZXZhbHVhdGVfaW5mbyAqaW5mbywgdTE2IGFjdGlvbikKK3sKKwl1MzIgaTsKKworCWlmIChpbmZvLT5wYXJhbWV0ZXJzKSB7CisKKwkJLyogVXBkYXRlIHJlZmVyZW5jZSBjb3VudCBmb3IgZWFjaCBwYXJhbWV0ZXIgKi8KKworCQlmb3IgKGkgPSAwOyBpbmZvLT5wYXJhbWV0ZXJzW2ldOyBpKyspIHsKKworCQkJLyogSWdub3JlIGVycm9ycywganVzdCBkbyB0aGVtIGFsbCAqLworCisJCQkodm9pZClhY3BpX3V0X3VwZGF0ZV9vYmplY3RfcmVmZXJlbmNlKGluZm8tPgorCQkJCQkJCSAgICAgIHBhcmFtZXRlcnNbaV0sCisJCQkJCQkJICAgICAgYWN0aW9uKTsKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvcnNhZGRyLmMgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL3JzYWRkci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlNDM3YmYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL3JzYWRkci5jCkBAIC0wLDAgKzEsMzgxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIE1vZHVsZSBOYW1lOiByc2FkZHIgLSBBZGRyZXNzIHJlc291cmNlIGRlc2NyaXB0b3JzICgxNi8zMi82NCkKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwOCwgSW50ZWwgQ29ycC4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKKyAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIGF0IG1pbmltdW0gYSBkaXNjbGFpbWVyCisgKiAgICBzdWJzdGFudGlhbGx5IHNpbWlsYXIgdG8gdGhlICJOTyBXQVJSQU5UWSIgZGlzY2xhaW1lciBiZWxvdworICogICAgKCJEaXNjbGFpbWVyIikgYW5kIGFueSByZWRpc3RyaWJ1dGlvbiBtdXN0IGJlIGNvbmRpdGlvbmVkIHVwb24KKyAqICAgIGluY2x1ZGluZyBhIHN1YnN0YW50aWFsbHkgc2ltaWxhciBEaXNjbGFpbWVyIHJlcXVpcmVtZW50IGZvciBmdXJ0aGVyCisgKiAgICBiaW5hcnkgcmVkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMKKyAqICAgIG9mIGFueSBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogTk8gV0FSUkFOVFkKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HCisgKiBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KKyAqLworCisjaW5jbHVkZSA8YWNwaS9hY3BpLmg+CisjaW5jbHVkZSAiYWNjb21tb24uaCIKKyNpbmNsdWRlICJhY3Jlc3JjLmgiCisKKyNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX1JFU09VUkNFUworQUNQSV9NT0RVTEVfTkFNRSgicnNhZGRyIikKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBhY3BpX3JzX2NvbnZlcnRfYWRkcmVzczE2IC0gQWxsIFdPUkQgKDE2LWJpdCkgYWRkcmVzcyByZXNvdXJjZXMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RydWN0IGFjcGlfcnNjb252ZXJ0X2luZm8gYWNwaV9yc19jb252ZXJ0X2FkZHJlc3MxNls1XSA9IHsKKwl7QUNQSV9SU0NfSU5JVEdFVCwgQUNQSV9SRVNPVVJDRV9UWVBFX0FERFJFU1MxNiwKKwkgQUNQSV9SU19TSVpFKHN0cnVjdCBhY3BpX3Jlc291cmNlX2FkZHJlc3MxNiksCisJIEFDUElfUlNDX1RBQkxFX1NJWkUoYWNwaV9yc19jb252ZXJ0X2FkZHJlc3MxNil9LAorCisJe0FDUElfUlNDX0lOSVRTRVQsIEFDUElfUkVTT1VSQ0VfTkFNRV9BRERSRVNTMTYsCisJIHNpemVvZihzdHJ1Y3QgYW1sX3Jlc291cmNlX2FkZHJlc3MxNiksCisJIDB9LAorCisJLyogUmVzb3VyY2UgVHlwZSwgR2VuZXJhbCBGbGFncywgYW5kIFR5cGUtU3BlY2lmaWMgRmxhZ3MgKi8KKworCXtBQ1BJX1JTQ19BRERSRVNTLCAwLCAwLCAwfSwKKworCS8qCisJICogVGhlc2UgZmllbGRzIGFyZSBjb250aWd1b3VzIGluIGJvdGggdGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb246CisJICogQWRkcmVzcyBHcmFudWxhcml0eQorCSAqIEFkZHJlc3MgUmFuZ2UgTWluaW11bQorCSAqIEFkZHJlc3MgUmFuZ2UgTWF4aW11bQorCSAqIEFkZHJlc3MgVHJhbnNsYXRpb24gT2Zmc2V0CisJICogQWRkcmVzcyBMZW5ndGgKKwkgKi8KKwl7QUNQSV9SU0NfTU9WRTE2LCBBQ1BJX1JTX09GRlNFVChkYXRhLmFkZHJlc3MxNi5ncmFudWxhcml0eSksCisJIEFNTF9PRkZTRVQoYWRkcmVzczE2LmdyYW51bGFyaXR5KSwKKwkgNX0sCisKKwkvKiBPcHRpb25hbCByZXNvdXJjZV9zb3VyY2UgKEluZGV4IGFuZCBTdHJpbmcpICovCisKKwl7QUNQSV9SU0NfU09VUkNFLCBBQ1BJX1JTX09GRlNFVChkYXRhLmFkZHJlc3MxNi5yZXNvdXJjZV9zb3VyY2UpLAorCSAwLAorCSBzaXplb2Yoc3RydWN0IGFtbF9yZXNvdXJjZV9hZGRyZXNzMTYpfQorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBhY3BpX3JzX2NvbnZlcnRfYWRkcmVzczMyIC0gQWxsIERXT1JEICgzMi1iaXQpIGFkZHJlc3MgcmVzb3VyY2VzCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RydWN0IGFjcGlfcnNjb252ZXJ0X2luZm8gYWNwaV9yc19jb252ZXJ0X2FkZHJlc3MzMls1XSA9IHsKKwl7QUNQSV9SU0NfSU5JVEdFVCwgQUNQSV9SRVNPVVJDRV9UWVBFX0FERFJFU1MzMiwKKwkgQUNQSV9SU19TSVpFKHN0cnVjdCBhY3BpX3Jlc291cmNlX2FkZHJlc3MzMiksCisJIEFDUElfUlNDX1RBQkxFX1NJWkUoYWNwaV9yc19jb252ZXJ0X2FkZHJlc3MzMil9LAorCisJe0FDUElfUlNDX0lOSVRTRVQsIEFDUElfUkVTT1VSQ0VfTkFNRV9BRERSRVNTMzIsCisJIHNpemVvZihzdHJ1Y3QgYW1sX3Jlc291cmNlX2FkZHJlc3MzMiksCisJIDB9LAorCisJLyogUmVzb3VyY2UgVHlwZSwgR2VuZXJhbCBGbGFncywgYW5kIFR5cGUtU3BlY2lmaWMgRmxhZ3MgKi8KKworCXtBQ1BJX1JTQ19BRERSRVNTLCAwLCAwLCAwfSwKKworCS8qCisJICogVGhlc2UgZmllbGRzIGFyZSBjb250aWd1b3VzIGluIGJvdGggdGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb246CisJICogQWRkcmVzcyBHcmFudWxhcml0eQorCSAqIEFkZHJlc3MgUmFuZ2UgTWluaW11bQorCSAqIEFkZHJlc3MgUmFuZ2UgTWF4aW11bQorCSAqIEFkZHJlc3MgVHJhbnNsYXRpb24gT2Zmc2V0CisJICogQWRkcmVzcyBMZW5ndGgKKwkgKi8KKwl7QUNQSV9SU0NfTU9WRTMyLCBBQ1BJX1JTX09GRlNFVChkYXRhLmFkZHJlc3MzMi5ncmFudWxhcml0eSksCisJIEFNTF9PRkZTRVQoYWRkcmVzczMyLmdyYW51bGFyaXR5KSwKKwkgNX0sCisKKwkvKiBPcHRpb25hbCByZXNvdXJjZV9zb3VyY2UgKEluZGV4IGFuZCBTdHJpbmcpICovCisKKwl7QUNQSV9SU0NfU09VUkNFLCBBQ1BJX1JTX09GRlNFVChkYXRhLmFkZHJlc3MzMi5yZXNvdXJjZV9zb3VyY2UpLAorCSAwLAorCSBzaXplb2Yoc3RydWN0IGFtbF9yZXNvdXJjZV9hZGRyZXNzMzIpfQorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBhY3BpX3JzX2NvbnZlcnRfYWRkcmVzczY0IC0gQWxsIFFXT1JEICg2NC1iaXQpIGFkZHJlc3MgcmVzb3VyY2VzCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RydWN0IGFjcGlfcnNjb252ZXJ0X2luZm8gYWNwaV9yc19jb252ZXJ0X2FkZHJlc3M2NFs1XSA9IHsKKwl7QUNQSV9SU0NfSU5JVEdFVCwgQUNQSV9SRVNPVVJDRV9UWVBFX0FERFJFU1M2NCwKKwkgQUNQSV9SU19TSVpFKHN0cnVjdCBhY3BpX3Jlc291cmNlX2FkZHJlc3M2NCksCisJIEFDUElfUlNDX1RBQkxFX1NJWkUoYWNwaV9yc19jb252ZXJ0X2FkZHJlc3M2NCl9LAorCisJe0FDUElfUlNDX0lOSVRTRVQsIEFDUElfUkVTT1VSQ0VfTkFNRV9BRERSRVNTNjQsCisJIHNpemVvZihzdHJ1Y3QgYW1sX3Jlc291cmNlX2FkZHJlc3M2NCksCisJIDB9LAorCisJLyogUmVzb3VyY2UgVHlwZSwgR2VuZXJhbCBGbGFncywgYW5kIFR5cGUtU3BlY2lmaWMgRmxhZ3MgKi8KKworCXtBQ1BJX1JTQ19BRERSRVNTLCAwLCAwLCAwfSwKKworCS8qCisJICogVGhlc2UgZmllbGRzIGFyZSBjb250aWd1b3VzIGluIGJvdGggdGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb246CisJICogQWRkcmVzcyBHcmFudWxhcml0eQorCSAqIEFkZHJlc3MgUmFuZ2UgTWluaW11bQorCSAqIEFkZHJlc3MgUmFuZ2UgTWF4aW11bQorCSAqIEFkZHJlc3MgVHJhbnNsYXRpb24gT2Zmc2V0CisJICogQWRkcmVzcyBMZW5ndGgKKwkgKi8KKwl7QUNQSV9SU0NfTU9WRTY0LCBBQ1BJX1JTX09GRlNFVChkYXRhLmFkZHJlc3M2NC5ncmFudWxhcml0eSksCisJIEFNTF9PRkZTRVQoYWRkcmVzczY0LmdyYW51bGFyaXR5KSwKKwkgNX0sCisKKwkvKiBPcHRpb25hbCByZXNvdXJjZV9zb3VyY2UgKEluZGV4IGFuZCBTdHJpbmcpICovCisKKwl7QUNQSV9SU0NfU09VUkNFLCBBQ1BJX1JTX09GRlNFVChkYXRhLmFkZHJlc3M2NC5yZXNvdXJjZV9zb3VyY2UpLAorCSAwLAorCSBzaXplb2Yoc3RydWN0IGFtbF9yZXNvdXJjZV9hZGRyZXNzNjQpfQorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBhY3BpX3JzX2NvbnZlcnRfZXh0X2FkZHJlc3M2NCAtIEFsbCBFeHRlbmRlZCAoNjQtYml0KSBhZGRyZXNzIHJlc291cmNlcworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0cnVjdCBhY3BpX3JzY29udmVydF9pbmZvIGFjcGlfcnNfY29udmVydF9leHRfYWRkcmVzczY0WzVdID0geworCXtBQ1BJX1JTQ19JTklUR0VULCBBQ1BJX1JFU09VUkNFX1RZUEVfRVhURU5ERURfQUREUkVTUzY0LAorCSBBQ1BJX1JTX1NJWkUoc3RydWN0IGFjcGlfcmVzb3VyY2VfZXh0ZW5kZWRfYWRkcmVzczY0KSwKKwkgQUNQSV9SU0NfVEFCTEVfU0laRShhY3BpX3JzX2NvbnZlcnRfZXh0X2FkZHJlc3M2NCl9LAorCisJe0FDUElfUlNDX0lOSVRTRVQsIEFDUElfUkVTT1VSQ0VfTkFNRV9FWFRFTkRFRF9BRERSRVNTNjQsCisJIHNpemVvZihzdHJ1Y3QgYW1sX3Jlc291cmNlX2V4dGVuZGVkX2FkZHJlc3M2NCksCisJIDB9LAorCisJLyogUmVzb3VyY2UgVHlwZSwgR2VuZXJhbCBGbGFncywgYW5kIFR5cGUtU3BlY2lmaWMgRmxhZ3MgKi8KKworCXtBQ1BJX1JTQ19BRERSRVNTLCAwLCAwLCAwfSwKKworCS8qIFJldmlzaW9uIElEICovCisKKwl7QUNQSV9SU0NfTU9WRTgsIEFDUElfUlNfT0ZGU0VUKGRhdGEuZXh0X2FkZHJlc3M2NC5yZXZpc2lvbl9pRCksCisJIEFNTF9PRkZTRVQoZXh0X2FkZHJlc3M2NC5yZXZpc2lvbl9pRCksCisJIDF9LAorCS8qCisJICogVGhlc2UgZmllbGRzIGFyZSBjb250aWd1b3VzIGluIGJvdGggdGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb246CisJICogQWRkcmVzcyBHcmFudWxhcml0eQorCSAqIEFkZHJlc3MgUmFuZ2UgTWluaW11bQorCSAqIEFkZHJlc3MgUmFuZ2UgTWF4aW11bQorCSAqIEFkZHJlc3MgVHJhbnNsYXRpb24gT2Zmc2V0CisJICogQWRkcmVzcyBMZW5ndGgKKwkgKiBUeXBlLVNwZWNpZmljIEF0dHJpYnV0ZQorCSAqLworCXtBQ1BJX1JTQ19NT1ZFNjQsIEFDUElfUlNfT0ZGU0VUKGRhdGEuZXh0X2FkZHJlc3M2NC5ncmFudWxhcml0eSksCisJIEFNTF9PRkZTRVQoZXh0X2FkZHJlc3M2NC5ncmFudWxhcml0eSksCisJIDZ9Cit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIGFjcGlfcnNfY29udmVydF9nZW5lcmFsX2ZsYWdzIC0gRmxhZ3MgY29tbW9uIHRvIGFsbCBhZGRyZXNzIGRlc2NyaXB0b3JzCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHN0cnVjdCBhY3BpX3JzY29udmVydF9pbmZvIGFjcGlfcnNfY29udmVydF9nZW5lcmFsX2ZsYWdzWzZdID0geworCXtBQ1BJX1JTQ19GTEFHSU5JVCwgMCwgQU1MX09GRlNFVChhZGRyZXNzLmZsYWdzKSwKKwkgQUNQSV9SU0NfVEFCTEVfU0laRShhY3BpX3JzX2NvbnZlcnRfZ2VuZXJhbF9mbGFncyl9LAorCisJLyogUmVzb3VyY2UgVHlwZSAoTWVtb3J5LCBJbywgYnVzX251bWJlciwgZXRjLikgKi8KKworCXtBQ1BJX1JTQ19NT1ZFOCwgQUNQSV9SU19PRkZTRVQoZGF0YS5hZGRyZXNzLnJlc291cmNlX3R5cGUpLAorCSBBTUxfT0ZGU0VUKGFkZHJlc3MucmVzb3VyY2VfdHlwZSksCisJIDF9LAorCisJLyogR2VuZXJhbCBGbGFncyAtIENvbnN1bWUsIERlY29kZSwgbWluX2ZpeGVkLCBtYXhfZml4ZWQgKi8KKworCXtBQ1BJX1JTQ18xQklURkxBRywgQUNQSV9SU19PRkZTRVQoZGF0YS5hZGRyZXNzLnByb2R1Y2VyX2NvbnN1bWVyKSwKKwkgQU1MX09GRlNFVChhZGRyZXNzLmZsYWdzKSwKKwkgMH0sCisKKwl7QUNQSV9SU0NfMUJJVEZMQUcsIEFDUElfUlNfT0ZGU0VUKGRhdGEuYWRkcmVzcy5kZWNvZGUpLAorCSBBTUxfT0ZGU0VUKGFkZHJlc3MuZmxhZ3MpLAorCSAxfSwKKworCXtBQ1BJX1JTQ18xQklURkxBRywgQUNQSV9SU19PRkZTRVQoZGF0YS5hZGRyZXNzLm1pbl9hZGRyZXNzX2ZpeGVkKSwKKwkgQU1MX09GRlNFVChhZGRyZXNzLmZsYWdzKSwKKwkgMn0sCisKKwl7QUNQSV9SU0NfMUJJVEZMQUcsIEFDUElfUlNfT0ZGU0VUKGRhdGEuYWRkcmVzcy5tYXhfYWRkcmVzc19maXhlZCksCisJIEFNTF9PRkZTRVQoYWRkcmVzcy5mbGFncyksCisJIDN9Cit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIGFjcGlfcnNfY29udmVydF9tZW1fZmxhZ3MgLSBGbGFncyBjb21tb24gdG8gTWVtb3J5IGFkZHJlc3MgZGVzY3JpcHRvcnMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgc3RydWN0IGFjcGlfcnNjb252ZXJ0X2luZm8gYWNwaV9yc19jb252ZXJ0X21lbV9mbGFnc1s1XSA9IHsKKwl7QUNQSV9SU0NfRkxBR0lOSVQsIDAsIEFNTF9PRkZTRVQoYWRkcmVzcy5zcGVjaWZpY19mbGFncyksCisJIEFDUElfUlNDX1RBQkxFX1NJWkUoYWNwaV9yc19jb252ZXJ0X21lbV9mbGFncyl9LAorCisJLyogTWVtb3J5LXNwZWNpZmljIGZsYWdzICovCisKKwl7QUNQSV9SU0NfMUJJVEZMQUcsIEFDUElfUlNfT0ZGU0VUKGRhdGEuYWRkcmVzcy5pbmZvLm1lbS53cml0ZV9wcm90ZWN0KSwKKwkgQU1MX09GRlNFVChhZGRyZXNzLnNwZWNpZmljX2ZsYWdzKSwKKwkgMH0sCisKKwl7QUNQSV9SU0NfMkJJVEZMQUcsIEFDUElfUlNfT0ZGU0VUKGRhdGEuYWRkcmVzcy5pbmZvLm1lbS5jYWNoaW5nKSwKKwkgQU1MX09GRlNFVChhZGRyZXNzLnNwZWNpZmljX2ZsYWdzKSwKKwkgMX0sCisKKwl7QUNQSV9SU0NfMkJJVEZMQUcsIEFDUElfUlNfT0ZGU0VUKGRhdGEuYWRkcmVzcy5pbmZvLm1lbS5yYW5nZV90eXBlKSwKKwkgQU1MX09GRlNFVChhZGRyZXNzLnNwZWNpZmljX2ZsYWdzKSwKKwkgM30sCisKKwl7QUNQSV9SU0NfMUJJVEZMQUcsIEFDUElfUlNfT0ZGU0VUKGRhdGEuYWRkcmVzcy5pbmZvLm1lbS50cmFuc2xhdGlvbiksCisJIEFNTF9PRkZTRVQoYWRkcmVzcy5zcGVjaWZpY19mbGFncyksCisJIDV9Cit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIGFjcGlfcnNfY29udmVydF9pb19mbGFncyAtIEZsYWdzIGNvbW1vbiB0byBJL08gYWRkcmVzcyBkZXNjcmlwdG9ycworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBzdHJ1Y3QgYWNwaV9yc2NvbnZlcnRfaW5mbyBhY3BpX3JzX2NvbnZlcnRfaW9fZmxhZ3NbNF0gPSB7CisJe0FDUElfUlNDX0ZMQUdJTklULCAwLCBBTUxfT0ZGU0VUKGFkZHJlc3Muc3BlY2lmaWNfZmxhZ3MpLAorCSBBQ1BJX1JTQ19UQUJMRV9TSVpFKGFjcGlfcnNfY29udmVydF9pb19mbGFncyl9LAorCisJLyogSS9PLXNwZWNpZmljIGZsYWdzICovCisKKwl7QUNQSV9SU0NfMkJJVEZMQUcsIEFDUElfUlNfT0ZGU0VUKGRhdGEuYWRkcmVzcy5pbmZvLmlvLnJhbmdlX3R5cGUpLAorCSBBTUxfT0ZGU0VUKGFkZHJlc3Muc3BlY2lmaWNfZmxhZ3MpLAorCSAwfSwKKworCXtBQ1BJX1JTQ18xQklURkxBRywgQUNQSV9SU19PRkZTRVQoZGF0YS5hZGRyZXNzLmluZm8uaW8udHJhbnNsYXRpb24pLAorCSBBTUxfT0ZGU0VUKGFkZHJlc3Muc3BlY2lmaWNfZmxhZ3MpLAorCSA0fSwKKworCXtBQ1BJX1JTQ18xQklURkxBRywKKwkgQUNQSV9SU19PRkZTRVQoZGF0YS5hZGRyZXNzLmluZm8uaW8udHJhbnNsYXRpb25fdHlwZSksCisJIEFNTF9PRkZTRVQoYWRkcmVzcy5zcGVjaWZpY19mbGFncyksCisJIDV9Cit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX3JzX2dldF9hZGRyZXNzX2NvbW1vbgorICoKKyAqIFBBUkFNRVRFUlM6ICBSZXNvdXJjZSAgICAgICAgICAgIC0gUG9pbnRlciB0byB0aGUgaW50ZXJuYWwgcmVzb3VyY2Ugc3RydWN0CisgKiAgICAgICAgICAgICAgQW1sICAgICAgICAgICAgICAgICAtIFBvaW50ZXIgdG8gdGhlIEFNTCByZXNvdXJjZSBkZXNjcmlwdG9yCisgKgorICogUkVUVVJOOiAgICAgIFRSVUUgaWYgdGhlIHJlc291cmNlX3R5cGUgZmllbGQgaXMgT0ssIEZBTFNFIG90aGVyd2lzZQorICoKKyAqIERFU0NSSVBUSU9OOiBDb252ZXJ0IGNvbW1vbiBmbGFnIGZpZWxkcyBmcm9tIGEgcmF3IEFNTCByZXNvdXJjZSBkZXNjcmlwdG9yCisgKiAgICAgICAgICAgICAgdG8gYW4gaW50ZXJuYWwgcmVzb3VyY2UgZGVzY3JpcHRvcgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3U4CithY3BpX3JzX2dldF9hZGRyZXNzX2NvbW1vbihzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAqcmVzb3VyY2UsCisJCQkgICB1bmlvbiBhbWxfcmVzb3VyY2UgKmFtbCkKK3sKKwlBQ1BJX0ZVTkNUSU9OX0VOVFJZKCk7CisKKwkvKiBWYWxpZGF0ZSB0aGUgUmVzb3VyY2UgVHlwZSAqLworCisJaWYgKChhbWwtPmFkZHJlc3MucmVzb3VyY2VfdHlwZSA+IDIpCisJICAgICYmIChhbWwtPmFkZHJlc3MucmVzb3VyY2VfdHlwZSA8IDB4QzApKSB7CisJCXJldHVybiAoRkFMU0UpOworCX0KKworCS8qIEdldCB0aGUgUmVzb3VyY2UgVHlwZSBhbmQgR2VuZXJhbCBGbGFncyAqLworCisJKHZvaWQpYWNwaV9yc19jb252ZXJ0X2FtbF90b19yZXNvdXJjZShyZXNvdXJjZSwgYW1sLAorCQkJCQkgICAgICBhY3BpX3JzX2NvbnZlcnRfZ2VuZXJhbF9mbGFncyk7CisKKwkvKiBHZXQgdGhlIFR5cGUtU3BlY2lmaWMgRmxhZ3MgKE1lbW9yeSBhbmQgSS9PIGRlc2NyaXB0b3JzIG9ubHkpICovCisKKwlpZiAocmVzb3VyY2UtPmRhdGEuYWRkcmVzcy5yZXNvdXJjZV90eXBlID09IEFDUElfTUVNT1JZX1JBTkdFKSB7CisJCSh2b2lkKWFjcGlfcnNfY29udmVydF9hbWxfdG9fcmVzb3VyY2UocmVzb3VyY2UsIGFtbCwKKwkJCQkJCSAgICAgIGFjcGlfcnNfY29udmVydF9tZW1fZmxhZ3MpOworCX0gZWxzZSBpZiAocmVzb3VyY2UtPmRhdGEuYWRkcmVzcy5yZXNvdXJjZV90eXBlID09IEFDUElfSU9fUkFOR0UpIHsKKwkJKHZvaWQpYWNwaV9yc19jb252ZXJ0X2FtbF90b19yZXNvdXJjZShyZXNvdXJjZSwgYW1sLAorCQkJCQkJICAgICAgYWNwaV9yc19jb252ZXJ0X2lvX2ZsYWdzKTsKKwl9IGVsc2UgeworCQkvKiBHZW5lcmljIHJlc291cmNlIHR5cGUsIGp1c3QgZ3JhYiB0aGUgdHlwZV9zcGVjaWZpYyBieXRlICovCisKKwkJcmVzb3VyY2UtPmRhdGEuYWRkcmVzcy5pbmZvLnR5cGVfc3BlY2lmaWMgPQorCQkgICAgYW1sLT5hZGRyZXNzLnNwZWNpZmljX2ZsYWdzOworCX0KKworCXJldHVybiAoVFJVRSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfcnNfc2V0X2FkZHJlc3NfY29tbW9uCisgKgorICogUEFSQU1FVEVSUzogIEFtbCAgICAgICAgICAgICAgICAgLSBQb2ludGVyIHRvIHRoZSBBTUwgcmVzb3VyY2UgZGVzY3JpcHRvcgorICogICAgICAgICAgICAgIFJlc291cmNlICAgICAgICAgICAgLSBQb2ludGVyIHRvIHRoZSBpbnRlcm5hbCByZXNvdXJjZSBzdHJ1Y3QKKyAqCisgKiBSRVRVUk46ICAgICAgTm9uZQorICoKKyAqIERFU0NSSVBUSU9OOiBDb252ZXJ0IGNvbW1vbiBmbGFnIGZpZWxkcyBmcm9tIGEgcmVzb3VyY2UgZGVzY3JpcHRvciB0byBhbgorICogICAgICAgICAgICAgIEFNTCBkZXNjcmlwdG9yCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZAorYWNwaV9yc19zZXRfYWRkcmVzc19jb21tb24odW5pb24gYW1sX3Jlc291cmNlICphbWwsCisJCQkgICBzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAqcmVzb3VyY2UpCit7CisJQUNQSV9GVU5DVElPTl9FTlRSWSgpOworCisJLyogU2V0IHRoZSBSZXNvdXJjZSBUeXBlIGFuZCBHZW5lcmFsIEZsYWdzICovCisKKwkodm9pZClhY3BpX3JzX2NvbnZlcnRfcmVzb3VyY2VfdG9fYW1sKHJlc291cmNlLCBhbWwsCisJCQkJCSAgICAgIGFjcGlfcnNfY29udmVydF9nZW5lcmFsX2ZsYWdzKTsKKworCS8qIFNldCB0aGUgVHlwZS1TcGVjaWZpYyBGbGFncyAoTWVtb3J5IGFuZCBJL08gZGVzY3JpcHRvcnMgb25seSkgKi8KKworCWlmIChyZXNvdXJjZS0+ZGF0YS5hZGRyZXNzLnJlc291cmNlX3R5cGUgPT0gQUNQSV9NRU1PUllfUkFOR0UpIHsKKwkJKHZvaWQpYWNwaV9yc19jb252ZXJ0X3Jlc291cmNlX3RvX2FtbChyZXNvdXJjZSwgYW1sLAorCQkJCQkJICAgICAgYWNwaV9yc19jb252ZXJ0X21lbV9mbGFncyk7CisJfSBlbHNlIGlmIChyZXNvdXJjZS0+ZGF0YS5hZGRyZXNzLnJlc291cmNlX3R5cGUgPT0gQUNQSV9JT19SQU5HRSkgeworCQkodm9pZClhY3BpX3JzX2NvbnZlcnRfcmVzb3VyY2VfdG9fYW1sKHJlc291cmNlLCBhbWwsCisJCQkJCQkgICAgICBhY3BpX3JzX2NvbnZlcnRfaW9fZmxhZ3MpOworCX0gZWxzZSB7CisJCS8qIEdlbmVyaWMgcmVzb3VyY2UgdHlwZSwganVzdCBjb3B5IHRoZSB0eXBlX3NwZWNpZmljIGJ5dGUgKi8KKworCQlhbWwtPmFkZHJlc3Muc3BlY2lmaWNfZmxhZ3MgPQorCQkgICAgcmVzb3VyY2UtPmRhdGEuYWRkcmVzcy5pbmZvLnR5cGVfc3BlY2lmaWM7CisJfQorfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS9yc2NhbGMuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvcnNjYWxjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTI4NjVlZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvcnNjYWxjLmMKQEAgLTAsMCArMSw2MTggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogTW9kdWxlIE5hbWU6IHJzY2FsYyAtIENhbGN1bGF0ZSBzdHJlYW0gYW5kIGxpc3QgbGVuZ3RocworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA4LCBJbnRlbCBDb3JwLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAorICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgYXQgbWluaW11bSBhIGRpc2NsYWltZXIKKyAqICAgIHN1YnN0YW50aWFsbHkgc2ltaWxhciB0byB0aGUgIk5PIFdBUlJBTlRZIiBkaXNjbGFpbWVyIGJlbG93CisgKiAgICAoIkRpc2NsYWltZXIiKSBhbmQgYW55IHJlZGlzdHJpYnV0aW9uIG11c3QgYmUgY29uZGl0aW9uZWQgdXBvbgorICogICAgaW5jbHVkaW5nIGEgc3Vic3RhbnRpYWxseSBzaW1pbGFyIERpc2NsYWltZXIgcmVxdWlyZW1lbnQgZm9yIGZ1cnRoZXIKKyAqICAgIGJpbmFyeSByZWRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcworICogICAgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBOTyBXQVJSQU5UWQorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcKKyAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgorICovCisKKyNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KKyNpbmNsdWRlICJhY2NvbW1vbi5oIgorI2luY2x1ZGUgImFjcmVzcmMuaCIKKyNpbmNsdWRlICJhY25hbWVzcC5oIgorCisjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9SRVNPVVJDRVMKK0FDUElfTU9EVUxFX05BTUUoInJzY2FsYyIpCisKKy8qIExvY2FsIHByb3RvdHlwZXMgKi8KK3N0YXRpYyB1OCBhY3BpX3JzX2NvdW50X3NldF9iaXRzKHUxNiBiaXRfZmllbGQpOworCitzdGF0aWMgYWNwaV9yc19sZW5ndGgKK2FjcGlfcnNfc3RydWN0X29wdGlvbl9sZW5ndGgoc3RydWN0IGFjcGlfcmVzb3VyY2Vfc291cmNlICpyZXNvdXJjZV9zb3VyY2UpOworCitzdGF0aWMgdTMyCithY3BpX3JzX3N0cmVhbV9vcHRpb25fbGVuZ3RoKHUzMiByZXNvdXJjZV9sZW5ndGgsIHUzMiBtaW5pbXVtX3RvdGFsX2xlbmd0aCk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfcnNfY291bnRfc2V0X2JpdHMKKyAqCisgKiBQQVJBTUVURVJTOiAgYml0X2ZpZWxkICAgICAgIC0gRmllbGQgaW4gd2hpY2ggdG8gY291bnQgYml0cworICoKKyAqIFJFVFVSTjogICAgICBOdW1iZXIgb2YgYml0cyBzZXQgd2l0aGluIHRoZSBmaWVsZAorICoKKyAqIERFU0NSSVBUSU9OOiBDb3VudCB0aGUgbnVtYmVyIG9mIGJpdHMgc2V0IGluIGEgcmVzb3VyY2UgZmllbGQuIFVzZWQgZm9yCisgKiAgICAgICAgICAgICAgKFNob3J0IGRlc2NyaXB0b3IpIGludGVycnVwdCBhbmQgRE1BIGxpc3RzLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB1OCBhY3BpX3JzX2NvdW50X3NldF9iaXRzKHUxNiBiaXRfZmllbGQpCit7CisJdTggYml0c19zZXQ7CisKKwlBQ1BJX0ZVTkNUSU9OX0VOVFJZKCk7CisKKwlmb3IgKGJpdHNfc2V0ID0gMDsgYml0X2ZpZWxkOyBiaXRzX3NldCsrKSB7CisKKwkJLyogWmVybyB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgYml0IHRoYXQgaXMgc2V0ICovCisKKwkJYml0X2ZpZWxkICY9ICh1MTYpIChiaXRfZmllbGQgLSAxKTsKKwl9CisKKwlyZXR1cm4gYml0c19zZXQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfcnNfc3RydWN0X29wdGlvbl9sZW5ndGgKKyAqCisgKiBQQVJBTUVURVJTOiAgcmVzb3VyY2Vfc291cmNlICAgICAtIFBvaW50ZXIgdG8gb3B0aW9uYWwgZGVzY3JpcHRvciBmaWVsZAorICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogQ29tbW9uIGNvZGUgdG8gaGFuZGxlIG9wdGlvbmFsIHJlc291cmNlX3NvdXJjZV9pbmRleCBhbmQKKyAqICAgICAgICAgICAgICByZXNvdXJjZV9zb3VyY2UgZmllbGRzIGluIHNvbWUgTGFyZ2UgZGVzY3JpcHRvcnMuIFVzZWQgZHVyaW5nCisgKiAgICAgICAgICAgICAgbGlzdC10by1zdHJlYW0gY29udmVyc2lvbgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBhY3BpX3JzX2xlbmd0aAorYWNwaV9yc19zdHJ1Y3Rfb3B0aW9uX2xlbmd0aChzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9zb3VyY2UgKnJlc291cmNlX3NvdXJjZSkKK3sKKwlBQ1BJX0ZVTkNUSU9OX0VOVFJZKCk7CisKKwkvKgorCSAqIElmIHRoZSByZXNvdXJjZV9zb3VyY2Ugc3RyaW5nIGlzIHZhbGlkLCByZXR1cm4gdGhlIHNpemUgb2YgdGhlIHN0cmluZworCSAqIChzdHJpbmdfbGVuZ3RoIGluY2x1ZGVzIHRoZSBOVUxMIHRlcm1pbmF0b3IpIHBsdXMgdGhlIHNpemUgb2YgdGhlCisJICogcmVzb3VyY2Vfc291cmNlX2luZGV4ICgxKS4KKwkgKi8KKwlpZiAocmVzb3VyY2Vfc291cmNlLT5zdHJpbmdfcHRyKSB7CisJCXJldHVybiAoKGFjcGlfcnNfbGVuZ3RoKSAocmVzb3VyY2Vfc291cmNlLT5zdHJpbmdfbGVuZ3RoICsgMSkpOworCX0KKworCXJldHVybiAoMCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfcnNfc3RyZWFtX29wdGlvbl9sZW5ndGgKKyAqCisgKiBQQVJBTUVURVJTOiAgcmVzb3VyY2VfbGVuZ3RoICAgICAtIExlbmd0aCBmcm9tIHRoZSByZXNvdXJjZSBoZWFkZXIKKyAqICAgICAgICAgICAgICBtaW5pbXVtX3RvdGFsX2xlbmd0aCAtIE1pbmltdW0gbGVuZ3RoIG9mIHRoaXMgcmVzb3VyY2UsIGJlZm9yZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbnkgb3B0aW9uYWwgZmllbGRzLiBJbmNsdWRlcyBoZWFkZXIgc2l6ZQorICoKKyAqIFJFVFVSTjogICAgICBMZW5ndGggb2Ygb3B0aW9uYWwgc3RyaW5nICgwIGlmIG5vIHN0cmluZyBwcmVzZW50KQorICoKKyAqIERFU0NSSVBUSU9OOiBDb21tb24gY29kZSB0byBoYW5kbGUgb3B0aW9uYWwgcmVzb3VyY2Vfc291cmNlX2luZGV4IGFuZAorICogICAgICAgICAgICAgIHJlc291cmNlX3NvdXJjZSBmaWVsZHMgaW4gc29tZSBMYXJnZSBkZXNjcmlwdG9ycy4gVXNlZCBkdXJpbmcKKyAqICAgICAgICAgICAgICBzdHJlYW0tdG8tbGlzdCBjb252ZXJzaW9uCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHUzMgorYWNwaV9yc19zdHJlYW1fb3B0aW9uX2xlbmd0aCh1MzIgcmVzb3VyY2VfbGVuZ3RoLAorCQkJICAgICB1MzIgbWluaW11bV9hbWxfcmVzb3VyY2VfbGVuZ3RoKQoreworCXUzMiBzdHJpbmdfbGVuZ3RoID0gMDsKKworCUFDUElfRlVOQ1RJT05fRU5UUlkoKTsKKworCS8qCisJICogVGhlIHJlc291cmNlX3NvdXJjZV9pbmRleCBhbmQgcmVzb3VyY2Vfc291cmNlIGFyZSBvcHRpb25hbCBlbGVtZW50cyBvZiBzb21lCisJICogTGFyZ2UtdHlwZSByZXNvdXJjZSBkZXNjcmlwdG9ycy4KKwkgKi8KKworCS8qCisJICogSWYgdGhlIGxlbmd0aCBvZiB0aGUgYWN0dWFsIHJlc291cmNlIGRlc2NyaXB0b3IgaXMgZ3JlYXRlciB0aGFuIHRoZSBBQ1BJCisJICogc3BlYy1kZWZpbmVkIG1pbmltdW0gbGVuZ3RoLCBpdCBtZWFucyB0aGF0IGEgcmVzb3VyY2Vfc291cmNlX2luZGV4IGV4aXN0cworCSAqIGFuZCBpcyBmb2xsb3dlZCBieSBhIChyZXF1aXJlZCkgbnVsbCB0ZXJtaW5hdGVkIHN0cmluZy4gVGhlIHN0cmluZyBsZW5ndGgKKwkgKiAoaW5jbHVkaW5nIHRoZSBudWxsIHRlcm1pbmF0b3IpIGlzIHRoZSByZXNvdXJjZSBsZW5ndGggbWludXMgdGhlIG1pbmltdW0KKwkgKiBsZW5ndGgsIG1pbnVzIG9uZSBieXRlIGZvciB0aGUgcmVzb3VyY2Vfc291cmNlX2luZGV4IGl0c2VsZi4KKwkgKi8KKwlpZiAocmVzb3VyY2VfbGVuZ3RoID4gbWluaW11bV9hbWxfcmVzb3VyY2VfbGVuZ3RoKSB7CisKKwkJLyogQ29tcHV0ZSB0aGUgbGVuZ3RoIG9mIHRoZSBvcHRpb25hbCBzdHJpbmcgKi8KKworCQlzdHJpbmdfbGVuZ3RoID0KKwkJICAgIHJlc291cmNlX2xlbmd0aCAtIG1pbmltdW1fYW1sX3Jlc291cmNlX2xlbmd0aCAtIDE7CisJfQorCisJLyoKKwkgKiBSb3VuZCB0aGUgbGVuZ3RoIHVwIHRvIGEgbXVsdGlwbGUgb2YgdGhlIG5hdGl2ZSB3b3JkIGluIG9yZGVyIHRvCisJICogZ3VhcmFudGVlIHRoYXQgdGhlIGVudGlyZSByZXNvdXJjZSBkZXNjcmlwdG9yIGlzIG5hdGl2ZSB3b3JkIGFsaWduZWQKKwkgKi8KKwlyZXR1cm4gKCh1MzIpIEFDUElfUk9VTkRfVVBfVE9fTkFUSVZFX1dPUkQoc3RyaW5nX2xlbmd0aCkpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX3JzX2dldF9hbWxfbGVuZ3RoCisgKgorICogUEFSQU1FVEVSUzogIFJlc291cmNlICAgICAgICAgICAgLSBQb2ludGVyIHRvIHRoZSByZXNvdXJjZSBsaW5rZWQgbGlzdAorICogICAgICAgICAgICAgIHNpemVfbmVlZGVkICAgICAgICAgLSBXaGVyZSB0aGUgcmVxdWlyZWQgc2l6ZSBpcyByZXR1cm5lZAorICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogVGFrZXMgYSBsaW5rZWQgbGlzdCBvZiBpbnRlcm5hbCByZXNvdXJjZSBkZXNjcmlwdG9ycyBhbmQKKyAqICAgICAgICAgICAgICBjYWxjdWxhdGVzIHRoZSBzaXplIGJ1ZmZlciBuZWVkZWQgdG8gaG9sZCB0aGUgY29ycmVzcG9uZGluZworICogICAgICAgICAgICAgIGV4dGVybmFsIHJlc291cmNlIGJ5dGUgc3RyZWFtLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2FjcGlfc3RhdHVzCithY3BpX3JzX2dldF9hbWxfbGVuZ3RoKHN0cnVjdCBhY3BpX3Jlc291cmNlICogcmVzb3VyY2UsIGFjcGlfc2l6ZSAqIHNpemVfbmVlZGVkKQoreworCWFjcGlfc2l6ZSBhbWxfc2l6ZV9uZWVkZWQgPSAwOworCWFjcGlfcnNfbGVuZ3RoIHRvdGFsX3NpemU7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKHJzX2dldF9hbWxfbGVuZ3RoKTsKKworCS8qIFRyYXZlcnNlIGVudGlyZSBsaXN0IG9mIGludGVybmFsIHJlc291cmNlIGRlc2NyaXB0b3JzICovCisKKwl3aGlsZSAocmVzb3VyY2UpIHsKKworCQkvKiBWYWxpZGF0ZSB0aGUgZGVzY3JpcHRvciB0eXBlICovCisKKwkJaWYgKHJlc291cmNlLT50eXBlID4gQUNQSV9SRVNPVVJDRV9UWVBFX01BWCkgeworCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9JTlZBTElEX1JFU09VUkNFX1RZUEUpOworCQl9CisKKwkJLyogR2V0IHRoZSBiYXNlIHNpemUgb2YgdGhlIChleHRlcm5hbCBzdHJlYW0pIHJlc291cmNlIGRlc2NyaXB0b3IgKi8KKworCQl0b3RhbF9zaXplID0gYWNwaV9nYmxfYW1sX3Jlc291cmNlX3NpemVzW3Jlc291cmNlLT50eXBlXTsKKworCQkvKgorCQkgKiBBdWdtZW50IHRoZSBiYXNlIHNpemUgZm9yIGRlc2NyaXB0b3JzIHdpdGggb3B0aW9uYWwgYW5kL29yCisJCSAqIHZhcmlhYmxlLWxlbmd0aCBmaWVsZHMKKwkJICovCisJCXN3aXRjaCAocmVzb3VyY2UtPnR5cGUpIHsKKwkJY2FzZSBBQ1BJX1JFU09VUkNFX1RZUEVfSVJROgorCisJCQkvKiBMZW5ndGggY2FuIGJlIDMgb3IgMiAqLworCisJCQlpZiAocmVzb3VyY2UtPmRhdGEuaXJxLmRlc2NyaXB0b3JfbGVuZ3RoID09IDIpIHsKKwkJCQl0b3RhbF9zaXplLS07CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIEFDUElfUkVTT1VSQ0VfVFlQRV9TVEFSVF9ERVBFTkRFTlQ6CisKKwkJCS8qIExlbmd0aCBjYW4gYmUgMSBvciAwICovCisKKwkJCWlmIChyZXNvdXJjZS0+ZGF0YS5pcnEuZGVzY3JpcHRvcl9sZW5ndGggPT0gMCkgeworCQkJCXRvdGFsX3NpemUtLTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgQUNQSV9SRVNPVVJDRV9UWVBFX1ZFTkRPUjoKKwkJCS8qCisJCQkgKiBWZW5kb3IgRGVmaW5lZCBSZXNvdXJjZToKKwkJCSAqIEZvciBhIFZlbmRvciBTcGVjaWZpYyByZXNvdXJjZSwgaWYgdGhlIExlbmd0aCBpcyBiZXR3ZWVuIDEgYW5kIDcKKwkJCSAqIGl0IHdpbGwgYmUgY3JlYXRlZCBhcyBhIFNtYWxsIFJlc291cmNlIGRhdGEgdHlwZSwgb3RoZXJ3aXNlIGl0CisJCQkgKiBpcyBhIExhcmdlIFJlc291cmNlIGRhdGEgdHlwZS4KKwkJCSAqLworCQkJaWYgKHJlc291cmNlLT5kYXRhLnZlbmRvci5ieXRlX2xlbmd0aCA+IDcpIHsKKworCQkJCS8qIEJhc2Ugc2l6ZSBvZiBhIExhcmdlIHJlc291cmNlIGRlc2NyaXB0b3IgKi8KKworCQkJCXRvdGFsX3NpemUgPQorCQkJCSAgICBzaXplb2Yoc3RydWN0IGFtbF9yZXNvdXJjZV9sYXJnZV9oZWFkZXIpOworCQkJfQorCisJCQkvKiBBZGQgdGhlIHNpemUgb2YgdGhlIHZlbmRvci1zcGVjaWZpYyBkYXRhICovCisKKwkJCXRvdGFsX3NpemUgPSAoYWNwaV9yc19sZW5ndGgpCisJCQkgICAgKHRvdGFsX3NpemUgKyByZXNvdXJjZS0+ZGF0YS52ZW5kb3IuYnl0ZV9sZW5ndGgpOworCQkJYnJlYWs7CisKKwkJY2FzZSBBQ1BJX1JFU09VUkNFX1RZUEVfRU5EX1RBRzoKKwkJCS8qCisJCQkgKiBFbmQgVGFnOgorCQkJICogV2UgYXJlIGRvbmUgLS0gcmV0dXJuIHRoZSBhY2N1bXVsYXRlZCB0b3RhbCBzaXplLgorCQkJICovCisJCQkqc2l6ZV9uZWVkZWQgPSBhbWxfc2l6ZV9uZWVkZWQgKyB0b3RhbF9zaXplOworCisJCQkvKiBOb3JtYWwgZXhpdCAqLworCisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOworCisJCWNhc2UgQUNQSV9SRVNPVVJDRV9UWVBFX0FERFJFU1MxNjoKKwkJCS8qCisJCQkgKiAxNi1CaXQgQWRkcmVzcyBSZXNvdXJjZToKKwkJCSAqIEFkZCB0aGUgc2l6ZSBvZiB0aGUgb3B0aW9uYWwgcmVzb3VyY2Vfc291cmNlIGluZm8KKwkJCSAqLworCQkJdG90YWxfc2l6ZSA9IChhY3BpX3JzX2xlbmd0aCkKKwkJCSAgICAodG90YWxfc2l6ZSArCisJCQkgICAgIGFjcGlfcnNfc3RydWN0X29wdGlvbl9sZW5ndGgoJnJlc291cmNlLT5kYXRhLgorCQkJCQkJCSAgYWRkcmVzczE2LgorCQkJCQkJCSAgcmVzb3VyY2Vfc291cmNlKSk7CisJCQlicmVhazsKKworCQljYXNlIEFDUElfUkVTT1VSQ0VfVFlQRV9BRERSRVNTMzI6CisJCQkvKgorCQkJICogMzItQml0IEFkZHJlc3MgUmVzb3VyY2U6CisJCQkgKiBBZGQgdGhlIHNpemUgb2YgdGhlIG9wdGlvbmFsIHJlc291cmNlX3NvdXJjZSBpbmZvCisJCQkgKi8KKwkJCXRvdGFsX3NpemUgPSAoYWNwaV9yc19sZW5ndGgpCisJCQkgICAgKHRvdGFsX3NpemUgKworCQkJICAgICBhY3BpX3JzX3N0cnVjdF9vcHRpb25fbGVuZ3RoKCZyZXNvdXJjZS0+ZGF0YS4KKwkJCQkJCQkgIGFkZHJlc3MzMi4KKwkJCQkJCQkgIHJlc291cmNlX3NvdXJjZSkpOworCQkJYnJlYWs7CisKKwkJY2FzZSBBQ1BJX1JFU09VUkNFX1RZUEVfQUREUkVTUzY0OgorCQkJLyoKKwkJCSAqIDY0LUJpdCBBZGRyZXNzIFJlc291cmNlOgorCQkJICogQWRkIHRoZSBzaXplIG9mIHRoZSBvcHRpb25hbCByZXNvdXJjZV9zb3VyY2UgaW5mbworCQkJICovCisJCQl0b3RhbF9zaXplID0gKGFjcGlfcnNfbGVuZ3RoKQorCQkJICAgICh0b3RhbF9zaXplICsKKwkJCSAgICAgYWNwaV9yc19zdHJ1Y3Rfb3B0aW9uX2xlbmd0aCgmcmVzb3VyY2UtPmRhdGEuCisJCQkJCQkJICBhZGRyZXNzNjQuCisJCQkJCQkJICByZXNvdXJjZV9zb3VyY2UpKTsKKwkJCWJyZWFrOworCisJCWNhc2UgQUNQSV9SRVNPVVJDRV9UWVBFX0VYVEVOREVEX0lSUToKKwkJCS8qCisJCQkgKiBFeHRlbmRlZCBJUlEgUmVzb3VyY2U6CisJCQkgKiBBZGQgdGhlIHNpemUgb2YgZWFjaCBhZGRpdGlvbmFsIG9wdGlvbmFsIGludGVycnVwdCBiZXlvbmQgdGhlCisJCQkgKiByZXF1aXJlZCAxICg0IGJ5dGVzIGZvciBlYWNoIHUzMiBpbnRlcnJ1cHQgbnVtYmVyKQorCQkJICovCisJCQl0b3RhbF9zaXplID0gKGFjcGlfcnNfbGVuZ3RoKQorCQkJICAgICh0b3RhbF9zaXplICsKKwkJCSAgICAgKChyZXNvdXJjZS0+ZGF0YS5leHRlbmRlZF9pcnEuaW50ZXJydXB0X2NvdW50IC0KKwkJCSAgICAgICAxKSAqIDQpICsKKwkJCSAgICAgLyogQWRkIHRoZSBzaXplIG9mIHRoZSBvcHRpb25hbCByZXNvdXJjZV9zb3VyY2UgaW5mbyAqLworCQkJICAgICBhY3BpX3JzX3N0cnVjdF9vcHRpb25fbGVuZ3RoKCZyZXNvdXJjZS0+ZGF0YS4KKwkJCQkJCQkgIGV4dGVuZGVkX2lycS4KKwkJCQkJCQkgIHJlc291cmNlX3NvdXJjZSkpOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisKKwkJLyogVXBkYXRlIHRoZSB0b3RhbCAqLworCisJCWFtbF9zaXplX25lZWRlZCArPSB0b3RhbF9zaXplOworCisJCS8qIFBvaW50IHRvIHRoZSBuZXh0IG9iamVjdCAqLworCisJCXJlc291cmNlID0KKwkJICAgIEFDUElfQUREX1BUUihzdHJ1Y3QgYWNwaV9yZXNvdXJjZSwgcmVzb3VyY2UsCisJCQkJIHJlc291cmNlLT5sZW5ndGgpOworCX0KKworCS8qIERpZCBub3QgZmluZCBhbiBlbmRfdGFnIHJlc291cmNlIGRlc2NyaXB0b3IgKi8KKworCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfTk9fUkVTT1VSQ0VfRU5EX1RBRyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfcnNfZ2V0X2xpc3RfbGVuZ3RoCisgKgorICogUEFSQU1FVEVSUzogIGFtbF9idWZmZXIgICAgICAgICAgLSBQb2ludGVyIHRvIHRoZSByZXNvdXJjZSBieXRlIHN0cmVhbQorICogICAgICAgICAgICAgIGFtbF9idWZmZXJfbGVuZ3RoICAgLSBTaXplIG9mIGFtbF9idWZmZXIKKyAqICAgICAgICAgICAgICBzaXplX25lZWRlZCAgICAgICAgIC0gV2hlcmUgdGhlIHNpemUgbmVlZGVkIGlzIHJldHVybmVkCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBUYWtlcyBhbiBleHRlcm5hbCByZXNvdXJjZSBieXRlIHN0cmVhbSBhbmQgY2FsY3VsYXRlcyB0aGUgc2l6ZQorICogICAgICAgICAgICAgIGJ1ZmZlciBuZWVkZWQgdG8gaG9sZCB0aGUgY29ycmVzcG9uZGluZyBpbnRlcm5hbCByZXNvdXJjZQorICogICAgICAgICAgICAgIGRlc2NyaXB0b3IgbGlua2VkIGxpc3QuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworYWNwaV9zdGF0dXMKK2FjcGlfcnNfZ2V0X2xpc3RfbGVuZ3RoKHU4ICogYW1sX2J1ZmZlciwKKwkJCXUzMiBhbWxfYnVmZmVyX2xlbmd0aCwgYWNwaV9zaXplICogc2l6ZV9uZWVkZWQpCit7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCXU4ICplbmRfYW1sOworCXU4ICpidWZmZXI7CisJdTMyIGJ1ZmZlcl9zaXplOworCXUxNiB0ZW1wMTY7CisJdTE2IHJlc291cmNlX2xlbmd0aDsKKwl1MzIgZXh0cmFfc3RydWN0X2J5dGVzOworCXU4IHJlc291cmNlX2luZGV4OworCXU4IG1pbmltdW1fYW1sX3Jlc291cmNlX2xlbmd0aDsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0UocnNfZ2V0X2xpc3RfbGVuZ3RoKTsKKworCSpzaXplX25lZWRlZCA9IDA7CisJZW5kX2FtbCA9IGFtbF9idWZmZXIgKyBhbWxfYnVmZmVyX2xlbmd0aDsKKworCS8qIFdhbGsgdGhlIGxpc3Qgb2YgQU1MIHJlc291cmNlIGRlc2NyaXB0b3JzICovCisKKwl3aGlsZSAoYW1sX2J1ZmZlciA8IGVuZF9hbWwpIHsKKworCQkvKiBWYWxpZGF0ZSB0aGUgUmVzb3VyY2UgVHlwZSBhbmQgUmVzb3VyY2UgTGVuZ3RoICovCisKKwkJc3RhdHVzID0gYWNwaV91dF92YWxpZGF0ZV9yZXNvdXJjZShhbWxfYnVmZmVyLCAmcmVzb3VyY2VfaW5kZXgpOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworCQl9CisKKwkJLyogR2V0IHRoZSByZXNvdXJjZSBsZW5ndGggYW5kIGJhc2UgKG1pbmltdW0pIEFNTCBzaXplICovCisKKwkJcmVzb3VyY2VfbGVuZ3RoID0gYWNwaV91dF9nZXRfcmVzb3VyY2VfbGVuZ3RoKGFtbF9idWZmZXIpOworCQltaW5pbXVtX2FtbF9yZXNvdXJjZV9sZW5ndGggPQorCQkgICAgYWNwaV9nYmxfcmVzb3VyY2VfYW1sX3NpemVzW3Jlc291cmNlX2luZGV4XTsKKworCQkvKgorCQkgKiBBdWdtZW50IHRoZSBzaXplIGZvciBkZXNjcmlwdG9ycyB3aXRoIG9wdGlvbmFsCisJCSAqIGFuZC9vciB2YXJpYWJsZSBsZW5ndGggZmllbGRzCisJCSAqLworCQlleHRyYV9zdHJ1Y3RfYnl0ZXMgPSAwOworCQlidWZmZXIgPQorCQkgICAgYW1sX2J1ZmZlciArIGFjcGlfdXRfZ2V0X3Jlc291cmNlX2hlYWRlcl9sZW5ndGgoYW1sX2J1ZmZlcik7CisKKwkJc3dpdGNoIChhY3BpX3V0X2dldF9yZXNvdXJjZV90eXBlKGFtbF9idWZmZXIpKSB7CisJCWNhc2UgQUNQSV9SRVNPVVJDRV9OQU1FX0lSUToKKwkJCS8qCisJCQkgKiBJUlEgUmVzb3VyY2U6CisJCQkgKiBHZXQgdGhlIG51bWJlciBvZiBiaXRzIHNldCBpbiB0aGUgMTYtYml0IElSUSBtYXNrCisJCQkgKi8KKwkJCUFDUElfTU9WRV8xNl9UT18xNigmdGVtcDE2LCBidWZmZXIpOworCQkJZXh0cmFfc3RydWN0X2J5dGVzID0gYWNwaV9yc19jb3VudF9zZXRfYml0cyh0ZW1wMTYpOworCQkJYnJlYWs7CisKKwkJY2FzZSBBQ1BJX1JFU09VUkNFX05BTUVfRE1BOgorCQkJLyoKKwkJCSAqIERNQSBSZXNvdXJjZToKKwkJCSAqIEdldCB0aGUgbnVtYmVyIG9mIGJpdHMgc2V0IGluIHRoZSA4LWJpdCBETUEgbWFzaworCQkJICovCisJCQlleHRyYV9zdHJ1Y3RfYnl0ZXMgPSBhY3BpX3JzX2NvdW50X3NldF9iaXRzKCpidWZmZXIpOworCQkJYnJlYWs7CisKKwkJY2FzZSBBQ1BJX1JFU09VUkNFX05BTUVfVkVORE9SX1NNQUxMOgorCQljYXNlIEFDUElfUkVTT1VSQ0VfTkFNRV9WRU5ET1JfTEFSR0U6CisJCQkvKgorCQkJICogVmVuZG9yIFJlc291cmNlOgorCQkJICogR2V0IHRoZSBudW1iZXIgb2YgdmVuZG9yIGRhdGEgYnl0ZXMKKwkJCSAqLworCQkJZXh0cmFfc3RydWN0X2J5dGVzID0gcmVzb3VyY2VfbGVuZ3RoOworCQkJYnJlYWs7CisKKwkJY2FzZSBBQ1BJX1JFU09VUkNFX05BTUVfRU5EX1RBRzoKKwkJCS8qCisJCQkgKiBFbmQgVGFnOgorCQkJICogVGhpcyBpcyB0aGUgbm9ybWFsIGV4aXQsIGFkZCBzaXplIG9mIGVuZF90YWcKKwkJCSAqLworCQkJKnNpemVfbmVlZGVkICs9IEFDUElfUlNfU0laRV9NSU47CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOworCisJCWNhc2UgQUNQSV9SRVNPVVJDRV9OQU1FX0FERFJFU1MzMjoKKwkJY2FzZSBBQ1BJX1JFU09VUkNFX05BTUVfQUREUkVTUzE2OgorCQljYXNlIEFDUElfUkVTT1VSQ0VfTkFNRV9BRERSRVNTNjQ6CisJCQkvKgorCQkJICogQWRkcmVzcyBSZXNvdXJjZToKKwkJCSAqIEFkZCB0aGUgc2l6ZSBvZiB0aGUgb3B0aW9uYWwgcmVzb3VyY2Vfc291cmNlCisJCQkgKi8KKwkJCWV4dHJhX3N0cnVjdF9ieXRlcyA9CisJCQkgICAgYWNwaV9yc19zdHJlYW1fb3B0aW9uX2xlbmd0aChyZXNvdXJjZV9sZW5ndGgsCisJCQkJCQkJIG1pbmltdW1fYW1sX3Jlc291cmNlX2xlbmd0aCk7CisJCQlicmVhazsKKworCQljYXNlIEFDUElfUkVTT1VSQ0VfTkFNRV9FWFRFTkRFRF9JUlE6CisJCQkvKgorCQkJICogRXh0ZW5kZWQgSVJRIFJlc291cmNlOgorCQkJICogVXNpbmcgdGhlIGludGVycnVwdF90YWJsZV9sZW5ndGgsIGFkZCA0IGJ5dGVzIGZvciBlYWNoIGFkZGl0aW9uYWwKKwkJCSAqIGludGVycnVwdC4gTm90ZTogYXQgbGVhc3Qgb25lIGludGVycnVwdCBpcyByZXF1aXJlZCBhbmQgaXMKKwkJCSAqIGluY2x1ZGVkIGluIHRoZSBtaW5pbXVtIGRlc2NyaXB0b3Igc2l6ZSAocmVhc29uIGZvciB0aGUgLTEpCisJCQkgKi8KKwkJCWV4dHJhX3N0cnVjdF9ieXRlcyA9IChidWZmZXJbMV0gLSAxKSAqIHNpemVvZih1MzIpOworCisJCQkvKiBBZGQgdGhlIHNpemUgb2YgdGhlIG9wdGlvbmFsIHJlc291cmNlX3NvdXJjZSAqLworCisJCQlleHRyYV9zdHJ1Y3RfYnl0ZXMgKz0KKwkJCSAgICBhY3BpX3JzX3N0cmVhbV9vcHRpb25fbGVuZ3RoKHJlc291cmNlX2xlbmd0aCAtCisJCQkJCQkJIGV4dHJhX3N0cnVjdF9ieXRlcywKKwkJCQkJCQkgbWluaW11bV9hbWxfcmVzb3VyY2VfbGVuZ3RoKTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCisJCS8qCisJCSAqIFVwZGF0ZSB0aGUgcmVxdWlyZWQgYnVmZmVyIHNpemUgZm9yIHRoZSBpbnRlcm5hbCBkZXNjcmlwdG9yIHN0cnVjdHMKKwkJICoKKwkJICogSW1wb3J0YW50OiBSb3VuZCB0aGUgc2l6ZSB1cCBmb3IgdGhlIGFwcHJvcHJpYXRlIGFsaWdubWVudC4gVGhpcworCQkgKiBpcyBhIHJlcXVpcmVtZW50IG9uIElBNjQuCisJCSAqLworCQlidWZmZXJfc2l6ZSA9IGFjcGlfZ2JsX3Jlc291cmNlX3N0cnVjdF9zaXplc1tyZXNvdXJjZV9pbmRleF0gKworCQkgICAgZXh0cmFfc3RydWN0X2J5dGVzOworCQlidWZmZXJfc2l6ZSA9ICh1MzIpIEFDUElfUk9VTkRfVVBfVE9fTkFUSVZFX1dPUkQoYnVmZmVyX3NpemUpOworCisJCSpzaXplX25lZWRlZCArPSBidWZmZXJfc2l6ZTsKKworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX1JFU09VUkNFUywKKwkJCQkgICJUeXBlICUuMlgsIEFtbExlbmd0aCAlLjJYIEludGVybmFsTGVuZ3RoICUuMlhcbiIsCisJCQkJICBhY3BpX3V0X2dldF9yZXNvdXJjZV90eXBlKGFtbF9idWZmZXIpLAorCQkJCSAgYWNwaV91dF9nZXRfZGVzY3JpcHRvcl9sZW5ndGgoYW1sX2J1ZmZlciksCisJCQkJICBidWZmZXJfc2l6ZSkpOworCisJCS8qCisJCSAqIFBvaW50IHRvIHRoZSBuZXh0IHJlc291cmNlIHdpdGhpbiB0aGUgQU1MIHN0cmVhbSB1c2luZyB0aGUgbGVuZ3RoCisJCSAqIGNvbnRhaW5lZCBpbiB0aGUgcmVzb3VyY2UgZGVzY3JpcHRvciBoZWFkZXIKKwkJICovCisJCWFtbF9idWZmZXIgKz0gYWNwaV91dF9nZXRfZGVzY3JpcHRvcl9sZW5ndGgoYW1sX2J1ZmZlcik7CisJfQorCisJLyogRGlkIG5vdCBmaW5kIGFuIGVuZF90YWcgcmVzb3VyY2UgZGVzY3JpcHRvciAqLworCisJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9OT19SRVNPVVJDRV9FTkRfVEFHKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9yc19nZXRfcGNpX3JvdXRpbmdfdGFibGVfbGVuZ3RoCisgKgorICogUEFSQU1FVEVSUzogIHBhY2thZ2Vfb2JqZWN0ICAgICAgICAgIC0gUG9pbnRlciB0byB0aGUgcGFja2FnZSBvYmplY3QKKyAqICAgICAgICAgICAgICBidWZmZXJfc2l6ZV9uZWVkZWQgICAgICAtIHUzMiBwb2ludGVyIG9mIHRoZSBzaXplIGJ1ZmZlcgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVlZGVkIHRvIHByb3Blcmx5IHJldHVybiB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlZCBkYXRhCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBHaXZlbiBhIHBhY2thZ2UgcmVwcmVzZW50aW5nIGEgUENJIHJvdXRpbmcgdGFibGUsIHRoaXMKKyAqICAgICAgICAgICAgICBjYWxjdWxhdGVzIHRoZSBzaXplIG9mIHRoZSBjb3JyZXNwb25kaW5nIGxpbmtlZCBsaXN0IG9mCisgKiAgICAgICAgICAgICAgZGVzY3JpcHRpb25zLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2FjcGlfc3RhdHVzCithY3BpX3JzX2dldF9wY2lfcm91dGluZ190YWJsZV9sZW5ndGgodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqcGFja2FnZV9vYmplY3QsCisJCQkJICAgICBhY3BpX3NpemUgKiBidWZmZXJfc2l6ZV9uZWVkZWQpCit7CisJdTMyIG51bWJlcl9vZl9lbGVtZW50czsKKwlhY3BpX3NpemUgdGVtcF9zaXplX25lZWRlZCA9IDA7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKnRvcF9vYmplY3RfbGlzdDsKKwl1MzIgaW5kZXg7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqcGFja2FnZV9lbGVtZW50OworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKipzdWJfb2JqZWN0X2xpc3Q7CisJdTggbmFtZV9mb3VuZDsKKwl1MzIgdGFibGVfaW5kZXg7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKHJzX2dldF9wY2lfcm91dGluZ190YWJsZV9sZW5ndGgpOworCisJbnVtYmVyX29mX2VsZW1lbnRzID0gcGFja2FnZV9vYmplY3QtPnBhY2thZ2UuY291bnQ7CisKKwkvKgorCSAqIENhbGN1bGF0ZSB0aGUgc2l6ZSBvZiB0aGUgcmV0dXJuIGJ1ZmZlci4KKwkgKiBUaGUgYmFzZSBzaXplIGlzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgKiB0aGUgc2l6ZXMgb2YgdGhlCisJICogc3RydWN0dXJlcy4gIEFkZGl0aW9uYWwgc3BhY2UgZm9yIHRoZSBzdHJpbmdzIGlzIGFkZGVkIGJlbG93LgorCSAqIFRoZSBtaW51cyBvbmUgaXMgdG8gc3VidHJhY3QgdGhlIHNpemUgb2YgdGhlIHU4IFNvdXJjZVsxXQorCSAqIG1lbWJlciBiZWNhdXNlIGl0IGlzIGFkZGVkIGJlbG93LgorCSAqCisJICogQnV0IGVhY2ggUFJUX0VOVFJZIHN0cnVjdHVyZSBoYXMgYSBwb2ludGVyIHRvIGEgc3RyaW5nIGFuZAorCSAqIHRoZSBzaXplIG9mIHRoYXQgc3RyaW5nIG11c3QgYmUgZm91bmQuCisJICovCisJdG9wX29iamVjdF9saXN0ID0gcGFja2FnZV9vYmplY3QtPnBhY2thZ2UuZWxlbWVudHM7CisKKwlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBudW1iZXJfb2ZfZWxlbWVudHM7IGluZGV4KyspIHsKKworCQkvKiBEZXJlZmVyZW5jZSB0aGUgc3ViLXBhY2thZ2UgKi8KKworCQlwYWNrYWdlX2VsZW1lbnQgPSAqdG9wX29iamVjdF9saXN0OworCisJCS8qCisJCSAqIFRoZSBzdWJfb2JqZWN0X2xpc3Qgd2lsbCBub3cgcG9pbnQgdG8gYW4gYXJyYXkgb2YgdGhlCisJCSAqIGZvdXIgSVJRIGVsZW1lbnRzOiBBZGRyZXNzLCBQaW4sIFNvdXJjZSBhbmQgc291cmNlX2luZGV4CisJCSAqLworCQlzdWJfb2JqZWN0X2xpc3QgPSBwYWNrYWdlX2VsZW1lbnQtPnBhY2thZ2UuZWxlbWVudHM7CisKKwkJLyogU2NhbiB0aGUgaXJxX3RhYmxlX2VsZW1lbnRzIGZvciB0aGUgU291cmNlIE5hbWUgU3RyaW5nICovCisKKwkJbmFtZV9mb3VuZCA9IEZBTFNFOworCisJCWZvciAodGFibGVfaW5kZXggPSAwOyB0YWJsZV9pbmRleCA8IDQgJiYgIW5hbWVfZm91bmQ7CisJCSAgICAgdGFibGVfaW5kZXgrKykgeworCQkJaWYgKCpzdWJfb2JqZWN0X2xpc3QgJiYJLyogTnVsbCBvYmplY3QgYWxsb3dlZCAqLworCQkJICAgICgoQUNQSV9UWVBFX1NUUklORyA9PQorCQkJICAgICAgQUNQSV9HRVRfT0JKRUNUX1RZUEUoKnN1Yl9vYmplY3RfbGlzdCkpIHx8CisJCQkgICAgICgoQUNQSV9UWVBFX0xPQ0FMX1JFRkVSRU5DRSA9PQorCQkJICAgICAgIEFDUElfR0VUX09CSkVDVF9UWVBFKCpzdWJfb2JqZWN0X2xpc3QpKSAmJgorCQkJICAgICAgKCgqc3ViX29iamVjdF9saXN0KS0+cmVmZXJlbmNlLmNsYXNzID09CisJCQkgICAgICAgQUNQSV9SRUZDTEFTU19OQU1FKSkpKSB7CisJCQkJbmFtZV9mb3VuZCA9IFRSVUU7CisJCQl9IGVsc2UgeworCQkJCS8qIExvb2sgYXQgdGhlIG5leHQgZWxlbWVudCAqLworCisJCQkJc3ViX29iamVjdF9saXN0Kys7CisJCQl9CisJCX0KKworCQl0ZW1wX3NpemVfbmVlZGVkICs9IChzaXplb2Yoc3RydWN0IGFjcGlfcGNpX3JvdXRpbmdfdGFibGUpIC0gNCk7CisKKwkJLyogV2FzIGEgU3RyaW5nIHR5cGUgZm91bmQ/ICovCisKKwkJaWYgKG5hbWVfZm91bmQpIHsKKwkJCWlmIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRSgqc3ViX29iamVjdF9saXN0KSA9PQorCQkJICAgIEFDUElfVFlQRV9TVFJJTkcpIHsKKwkJCQkvKgorCQkJCSAqIFRoZSBsZW5ndGggU3RyaW5nLkxlbmd0aCBmaWVsZCBkb2VzIG5vdCBpbmNsdWRlIHRoZQorCQkJCSAqIHRlcm1pbmF0aW5nIE5VTEwsIGFkZCAxCisJCQkJICovCisJCQkJdGVtcF9zaXplX25lZWRlZCArPSAoKGFjcGlfc2l6ZSkKKwkJCQkJCSAgICAgKCpzdWJfb2JqZWN0X2xpc3QpLT5zdHJpbmcuCisJCQkJCQkgICAgIGxlbmd0aCArIDEpOworCQkJfSBlbHNlIHsKKwkJCQl0ZW1wX3NpemVfbmVlZGVkICs9CisJCQkJICAgIGFjcGlfbnNfZ2V0X3BhdGhuYW1lX2xlbmd0aCgoKnN1Yl9vYmplY3RfbGlzdCktPnJlZmVyZW5jZS5ub2RlKTsKKwkJCQlpZiAoIXRlbXBfc2l6ZV9uZWVkZWQpIHsKKwkJCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9QQVJBTUVURVIpOworCQkJCX0KKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8qCisJCQkgKiBJZiBubyBuYW1lIHdhcyBmb3VuZCwgdGhlbiB0aGlzIGlzIGEgTlVMTCwgd2hpY2ggaXMKKwkJCSAqIHRyYW5zbGF0ZWQgYXMgYSB1MzIgemVyby4KKwkJCSAqLworCQkJdGVtcF9zaXplX25lZWRlZCArPSBzaXplb2YodTMyKTsKKwkJfQorCisJCS8qIFJvdW5kIHVwIHRoZSBzaXplIHNpbmNlIGVhY2ggZWxlbWVudCBtdXN0IGJlIGFsaWduZWQgKi8KKworCQl0ZW1wX3NpemVfbmVlZGVkID0gQUNQSV9ST1VORF9VUF9UT182NEJJVCh0ZW1wX3NpemVfbmVlZGVkKTsKKworCQkvKiBQb2ludCB0byB0aGUgbmV4dCB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICovCisKKwkJdG9wX29iamVjdF9saXN0Kys7CisJfQorCisJLyoKKwkgKiBBZGQgYW4gZXh0cmEgZWxlbWVudCB0byB0aGUgZW5kIG9mIHRoZSBsaXN0LCBlc3NlbnRpYWxseSBhCisJICogTlVMTCB0ZXJtaW5hdG9yCisJICovCisJKmJ1ZmZlcl9zaXplX25lZWRlZCA9CisJICAgIHRlbXBfc2l6ZV9uZWVkZWQgKyBzaXplb2Yoc3RydWN0IGFjcGlfcGNpX3JvdXRpbmdfdGFibGUpOworCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL3JzY3JlYXRlLmMgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL3JzY3JlYXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjE1NjZiMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvcnNjcmVhdGUuYwpAQCAtMCwwICsxLDQ2OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBNb2R1bGUgTmFtZTogcnNjcmVhdGUgLSBDcmVhdGUgcmVzb3VyY2UgbGlzdHMvdGFibGVzCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDgsIEludGVsIENvcnAuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCisgKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSBhdCBtaW5pbXVtIGEgZGlzY2xhaW1lcgorICogICAgc3Vic3RhbnRpYWxseSBzaW1pbGFyIHRvIHRoZSAiTk8gV0FSUkFOVFkiIGRpc2NsYWltZXIgYmVsb3cKKyAqICAgICgiRGlzY2xhaW1lciIpIGFuZCBhbnkgcmVkaXN0cmlidXRpb24gbXVzdCBiZSBjb25kaXRpb25lZCB1cG9uCisgKiAgICBpbmNsdWRpbmcgYSBzdWJzdGFudGlhbGx5IHNpbWlsYXIgRGlzY2xhaW1lciByZXF1aXJlbWVudCBmb3IgZnVydGhlcgorICogICAgYmluYXJ5IHJlZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzCisgKiAgICBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIE5PIFdBUlJBTlRZCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORworICogSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCisgKi8KKworI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgorI2luY2x1ZGUgImFjY29tbW9uLmgiCisjaW5jbHVkZSAiYWNyZXNyYy5oIgorI2luY2x1ZGUgImFjbmFtZXNwLmgiCisKKyNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX1JFU09VUkNFUworQUNQSV9NT0RVTEVfTkFNRSgicnNjcmVhdGUiKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX3JzX2NyZWF0ZV9yZXNvdXJjZV9saXN0CisgKgorICogUEFSQU1FVEVSUzogIGFtbF9idWZmZXIgICAgICAgICAgLSBQb2ludGVyIHRvIHRoZSByZXNvdXJjZSBieXRlIHN0cmVhbQorICogICAgICAgICAgICAgIG91dHB1dF9idWZmZXIgICAgICAgLSBQb2ludGVyIHRvIHRoZSB1c2VyJ3MgYnVmZmVyCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1czogQUVfT0sgaWYgb2theSwgZWxzZSBhIHZhbGlkIGFjcGlfc3RhdHVzIGNvZGUKKyAqICAgICAgICAgICAgICBJZiBvdXRwdXRfYnVmZmVyIGlzIG5vdCBsYXJnZSBlbm91Z2gsIG91dHB1dF9idWZmZXJfbGVuZ3RoCisgKiAgICAgICAgICAgICAgaW5kaWNhdGVzIGhvdyBsYXJnZSBvdXRwdXRfYnVmZmVyIHNob3VsZCBiZSwgZWxzZSBpdAorICogICAgICAgICAgICAgIGluZGljYXRlcyBob3cgbWF5IHU4IGVsZW1lbnRzIG9mIG91dHB1dF9idWZmZXIgYXJlIHZhbGlkLgorICoKKyAqIERFU0NSSVBUSU9OOiBUYWtlcyB0aGUgYnl0ZSBzdHJlYW0gcmV0dXJuZWQgZnJvbSBhIF9DUlMsIF9QUlMgY29udHJvbCBtZXRob2QKKyAqICAgICAgICAgICAgICBleGVjdXRpb24gYW5kIHBhcnNlcyB0aGUgc3RyZWFtIHRvIGNyZWF0ZSBhIGxpbmtlZCBsaXN0CisgKiAgICAgICAgICAgICAgb2YgZGV2aWNlIHJlc291cmNlcy4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYWNwaV9zdGF0dXMKK2FjcGlfcnNfY3JlYXRlX3Jlc291cmNlX2xpc3QodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqYW1sX2J1ZmZlciwKKwkJCSAgICAgc3RydWN0IGFjcGlfYnVmZmVyICpvdXRwdXRfYnVmZmVyKQoreworCisJYWNwaV9zdGF0dXMgc3RhdHVzOworCXU4ICphbWxfc3RhcnQ7CisJYWNwaV9zaXplIGxpc3Rfc2l6ZV9uZWVkZWQgPSAwOworCXUzMiBhbWxfYnVmZmVyX2xlbmd0aDsKKwl2b2lkICpyZXNvdXJjZTsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0UocnNfY3JlYXRlX3Jlc291cmNlX2xpc3QpOworCisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLCAiQW1sQnVmZmVyID0gJXBcbiIsIGFtbF9idWZmZXIpKTsKKworCS8qIFBhcmFtcyBhbHJlYWR5IHZhbGlkYXRlZCwgc28gd2UgZG9uJ3QgcmUtdmFsaWRhdGUgaGVyZSAqLworCisJYW1sX2J1ZmZlcl9sZW5ndGggPSBhbWxfYnVmZmVyLT5idWZmZXIubGVuZ3RoOworCWFtbF9zdGFydCA9IGFtbF9idWZmZXItPmJ1ZmZlci5wb2ludGVyOworCisJLyoKKwkgKiBQYXNzIHRoZSBhbWxfYnVmZmVyIGludG8gYSBtb2R1bGUgdGhhdCBjYW4gY2FsY3VsYXRlCisJICogdGhlIGJ1ZmZlciBzaXplIG5lZWRlZCBmb3IgdGhlIGxpbmtlZCBsaXN0CisJICovCisJc3RhdHVzID0gYWNwaV9yc19nZXRfbGlzdF9sZW5ndGgoYW1sX3N0YXJ0LCBhbWxfYnVmZmVyX2xlbmd0aCwKKwkJCQkJICZsaXN0X3NpemVfbmVlZGVkKTsKKworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgIlN0YXR1cz0lWCBMaXN0U2l6ZU5lZWRlZD0lWFxuIiwKKwkJCSAgc3RhdHVzLCAodTMyKSBsaXN0X3NpemVfbmVlZGVkKSk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworCX0KKworCS8qIFZhbGlkYXRlL0FsbG9jYXRlL0NsZWFyIGNhbGxlciBidWZmZXIgKi8KKworCXN0YXR1cyA9IGFjcGlfdXRfaW5pdGlhbGl6ZV9idWZmZXIob3V0cHV0X2J1ZmZlciwgbGlzdF9zaXplX25lZWRlZCk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworCX0KKworCS8qIERvIHRoZSBjb252ZXJzaW9uICovCisKKwlyZXNvdXJjZSA9IG91dHB1dF9idWZmZXItPnBvaW50ZXI7CisJc3RhdHVzID0gYWNwaV91dF93YWxrX2FtbF9yZXNvdXJjZXMoYW1sX3N0YXJ0LCBhbWxfYnVmZmVyX2xlbmd0aCwKKwkJCQkJICAgIGFjcGlfcnNfY29udmVydF9hbWxfdG9fcmVzb3VyY2VzLAorCQkJCQkgICAgJnJlc291cmNlKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CisJfQorCisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLCAiT3V0cHV0QnVmZmVyICVwIExlbmd0aCAlWFxuIiwKKwkJCSAgb3V0cHV0X2J1ZmZlci0+cG9pbnRlciwgKHUzMikgb3V0cHV0X2J1ZmZlci0+bGVuZ3RoKSk7CisJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9yc19jcmVhdGVfcGNpX3JvdXRpbmdfdGFibGUKKyAqCisgKiBQQVJBTUVURVJTOiAgcGFja2FnZV9vYmplY3QgICAgICAgICAgLSBQb2ludGVyIHRvIGEgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2FnZQorICogICAgICAgICAgICAgIG91dHB1dF9idWZmZXIgICAgICAgICAgIC0gUG9pbnRlciB0byB0aGUgdXNlcidzIGJ1ZmZlcgorICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMgIEFFX09LIGlmIG9rYXksIGVsc2UgYSB2YWxpZCBhY3BpX3N0YXR1cyBjb2RlLgorICogICAgICAgICAgICAgIElmIHRoZSBvdXRwdXRfYnVmZmVyIGlzIHRvbyBzbWFsbCwgdGhlIGVycm9yIHdpbGwgYmUKKyAqICAgICAgICAgICAgICBBRV9CVUZGRVJfT1ZFUkZMT1cgYW5kIG91dHB1dF9idWZmZXItPkxlbmd0aCB3aWxsIHBvaW50CisgKiAgICAgICAgICAgICAgdG8gdGhlIHNpemUgYnVmZmVyIG5lZWRlZC4KKyAqCisgKiBERVNDUklQVElPTjogVGFrZXMgdGhlIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgcGFja2FnZSBhbmQgY3JlYXRlcyBhCisgKiAgICAgICAgICAgICAgbGlua2VkIGxpc3Qgb2YgUENJIGludGVycnVwdCBkZXNjcmlwdGlvbnMKKyAqCisgKiBOT1RFOiBJdCBpcyB0aGUgY2FsbGVyJ3MgcmVzcG9uc2liaWxpdHkgdG8gZW5zdXJlIHRoYXQgdGhlIHN0YXJ0IG9mIHRoZQorICogb3V0cHV0IGJ1ZmZlciBpcyBhbGlnbmVkIHByb3Blcmx5IChpZiBuZWNlc3NhcnkpLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2FjcGlfc3RhdHVzCithY3BpX3JzX2NyZWF0ZV9wY2lfcm91dGluZ190YWJsZSh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpwYWNrYWdlX29iamVjdCwKKwkJCQkgc3RydWN0IGFjcGlfYnVmZmVyICpvdXRwdXRfYnVmZmVyKQoreworCXU4ICpidWZmZXI7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKnRvcF9vYmplY3RfbGlzdDsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICoqc3ViX29iamVjdF9saXN0OworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjOworCWFjcGlfc2l6ZSBidWZmZXJfc2l6ZV9uZWVkZWQgPSAwOworCXUzMiBudW1iZXJfb2ZfZWxlbWVudHM7CisJdTMyIGluZGV4OworCXN0cnVjdCBhY3BpX3BjaV9yb3V0aW5nX3RhYmxlICp1c2VyX3BydDsKKwlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZTsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJc3RydWN0IGFjcGlfYnVmZmVyIHBhdGhfYnVmZmVyOworCisJQUNQSV9GVU5DVElPTl9UUkFDRShyc19jcmVhdGVfcGNpX3JvdXRpbmdfdGFibGUpOworCisJLyogUGFyYW1zIGFscmVhZHkgdmFsaWRhdGVkLCBzbyB3ZSBkb24ndCByZS12YWxpZGF0ZSBoZXJlICovCisKKwkvKiBHZXQgdGhlIHJlcXVpcmVkIGJ1ZmZlciBsZW5ndGggKi8KKworCXN0YXR1cyA9IGFjcGlfcnNfZ2V0X3BjaV9yb3V0aW5nX3RhYmxlX2xlbmd0aChwYWNrYWdlX29iamVjdCwKKwkJCQkJCSAgICAgICZidWZmZXJfc2l6ZV9uZWVkZWQpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKKwl9CisKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sICJCdWZmZXJTaXplTmVlZGVkID0gJVhcbiIsCisJCQkgICh1MzIpIGJ1ZmZlcl9zaXplX25lZWRlZCkpOworCisJLyogVmFsaWRhdGUvQWxsb2NhdGUvQ2xlYXIgY2FsbGVyIGJ1ZmZlciAqLworCisJc3RhdHVzID0gYWNwaV91dF9pbml0aWFsaXplX2J1ZmZlcihvdXRwdXRfYnVmZmVyLCBidWZmZXJfc2l6ZV9uZWVkZWQpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKKwl9CisKKwkvKgorCSAqIExvb3AgdGhyb3VnaCB0aGUgQUNQSV9JTlRFUk5BTF9PQkpFQ1RTIC0gRWFjaCBvYmplY3Qgc2hvdWxkIGJlIGEKKwkgKiBwYWNrYWdlIHRoYXQgaW4gdHVybiBjb250YWlucyBhbiBhY3BpX2ludGVnZXIgQWRkcmVzcywgYSB1OCBQaW4sCisJICogYSBOYW1lLCBhbmQgYSB1OCBzb3VyY2VfaW5kZXguCisJICovCisJdG9wX29iamVjdF9saXN0ID0gcGFja2FnZV9vYmplY3QtPnBhY2thZ2UuZWxlbWVudHM7CisJbnVtYmVyX29mX2VsZW1lbnRzID0gcGFja2FnZV9vYmplY3QtPnBhY2thZ2UuY291bnQ7CisJYnVmZmVyID0gb3V0cHV0X2J1ZmZlci0+cG9pbnRlcjsKKwl1c2VyX3BydCA9IEFDUElfQ0FTVF9QVFIoc3RydWN0IGFjcGlfcGNpX3JvdXRpbmdfdGFibGUsIGJ1ZmZlcik7CisKKwlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBudW1iZXJfb2ZfZWxlbWVudHM7IGluZGV4KyspIHsKKwkJaW50IHNvdXJjZV9uYW1lX2luZGV4ID0gMjsKKwkJaW50IHNvdXJjZV9pbmRleF9pbmRleCA9IDM7CisKKwkJLyoKKwkJICogUG9pbnQgdXNlcl9wcnQgcGFzdCB0aGlzIGN1cnJlbnQgc3RydWN0dXJlCisJCSAqCisJCSAqIE5PVEU6IE9uIHRoZSBmaXJzdCBpdGVyYXRpb24sIHVzZXJfcHJ0LT5MZW5ndGggd2lsbAorCQkgKiBiZSB6ZXJvIGJlY2F1c2Ugd2UgY2xlYXJlZCB0aGUgcmV0dXJuIGJ1ZmZlciBlYXJsaWVyCisJCSAqLworCQlidWZmZXIgKz0gdXNlcl9wcnQtPmxlbmd0aDsKKwkJdXNlcl9wcnQgPSBBQ1BJX0NBU1RfUFRSKHN0cnVjdCBhY3BpX3BjaV9yb3V0aW5nX3RhYmxlLCBidWZmZXIpOworCisJCS8qCisJCSAqIEZpbGwgaW4gdGhlIExlbmd0aCBmaWVsZCB3aXRoIHRoZSBpbmZvcm1hdGlvbiB3ZSBoYXZlIGF0IHRoaXMgcG9pbnQuCisJCSAqIFRoZSBtaW51cyBmb3VyIGlzIHRvIHN1YnRyYWN0IHRoZSBzaXplIG9mIHRoZSB1OCBTb3VyY2VbNF0gbWVtYmVyCisJCSAqIGJlY2F1c2UgaXQgaXMgYWRkZWQgYmVsb3cuCisJCSAqLworCQl1c2VyX3BydC0+bGVuZ3RoID0gKHNpemVvZihzdHJ1Y3QgYWNwaV9wY2lfcm91dGluZ190YWJsZSkgLSA0KTsKKworCQkvKiBFYWNoIGVsZW1lbnQgb2YgdGhlIHRvcC1sZXZlbCBwYWNrYWdlIG11c3QgYWxzbyBiZSBhIHBhY2thZ2UgKi8KKworCQlpZiAoQUNQSV9HRVRfT0JKRUNUX1RZUEUoKnRvcF9vYmplY3RfbGlzdCkgIT0gQUNQSV9UWVBFX1BBQ0tBR0UpIHsKKwkJCUFDUElfRVJST1IoKEFFX0lORk8sCisJCQkJICAgICIoUFJUWyVYXSkgTmVlZCBzdWItcGFja2FnZSwgZm91bmQgJXMiLAorCQkJCSAgICBpbmRleCwKKwkJCQkgICAgYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZQorCQkJCSAgICAoKnRvcF9vYmplY3RfbGlzdCkpKTsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfT1BFUkFORF9UWVBFKTsKKwkJfQorCisJCS8qIEVhY2ggc3ViLXBhY2thZ2UgbXVzdCBiZSBvZiBsZW5ndGggNCAqLworCisJCWlmICgoKnRvcF9vYmplY3RfbGlzdCktPnBhY2thZ2UuY291bnQgIT0gNCkgeworCQkJQUNQSV9FUlJPUigoQUVfSU5GTywKKwkJCQkgICAgIihQUlRbJVhdKSBOZWVkIHBhY2thZ2Ugb2YgbGVuZ3RoIDQsIGZvdW5kIGxlbmd0aCAlZCIsCisJCQkJICAgIGluZGV4LCAoKnRvcF9vYmplY3RfbGlzdCktPnBhY2thZ2UuY291bnQpKTsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfUEFDS0FHRV9MSU1JVCk7CisJCX0KKworCQkvKgorCQkgKiBEZXJlZmVyZW5jZSB0aGUgc3ViLXBhY2thZ2UuCisJCSAqIFRoZSBzdWJfb2JqZWN0X2xpc3Qgd2lsbCBub3cgcG9pbnQgdG8gYW4gYXJyYXkgb2YgdGhlIGZvdXIgSVJRCisJCSAqIGVsZW1lbnRzOiBbQWRkcmVzcywgUGluLCBTb3VyY2UsIHNvdXJjZV9pbmRleF0KKwkJICovCisJCXN1Yl9vYmplY3RfbGlzdCA9ICgqdG9wX29iamVjdF9saXN0KS0+cGFja2FnZS5lbGVtZW50czsKKworCQkvKiAxKSBGaXJzdCBzdWJvYmplY3Q6IERlcmVmZXJlbmNlIHRoZSBQUlQuQWRkcmVzcyAqLworCisJCW9ial9kZXNjID0gc3ViX29iamVjdF9saXN0WzBdOworCQlpZiAoQUNQSV9HRVRfT0JKRUNUX1RZUEUob2JqX2Rlc2MpICE9IEFDUElfVFlQRV9JTlRFR0VSKSB7CisJCQlBQ1BJX0VSUk9SKChBRV9JTkZPLAorCQkJCSAgICAiKFBSVFslWF0uQWRkcmVzcykgTmVlZCBJbnRlZ2VyLCBmb3VuZCAlcyIsCisJCQkJICAgIGluZGV4LAorCQkJCSAgICBhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lKG9ial9kZXNjKSkpOworCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9EQVRBKTsKKwkJfQorCisJCXVzZXJfcHJ0LT5hZGRyZXNzID0gb2JqX2Rlc2MtPmludGVnZXIudmFsdWU7CisKKwkJLyogMikgU2Vjb25kIHN1Ym9iamVjdDogRGVyZWZlcmVuY2UgdGhlIFBSVC5QaW4gKi8KKworCQlvYmpfZGVzYyA9IHN1Yl9vYmplY3RfbGlzdFsxXTsKKwkJaWYgKEFDUElfR0VUX09CSkVDVF9UWVBFKG9ial9kZXNjKSAhPSBBQ1BJX1RZUEVfSU5URUdFUikgeworCQkJQUNQSV9FUlJPUigoQUVfSU5GTywKKwkJCQkgICAgIihQUlRbJVhdLlBpbikgTmVlZCBJbnRlZ2VyLCBmb3VuZCAlcyIsCisJCQkJICAgIGluZGV4LAorCQkJCSAgICBhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lKG9ial9kZXNjKSkpOworCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9EQVRBKTsKKwkJfQorCisJCS8qCisJCSAqIElmIEJJT1MgZXJyb25lb3VzbHkgcmV2ZXJzZWQgdGhlIF9QUlQgc291cmNlX25hbWUgYW5kIHNvdXJjZV9pbmRleCwKKwkJICogdGhlbiByZXZlcnNlIHRoZW0gYmFjay4KKwkJICovCisJCWlmIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRShzdWJfb2JqZWN0X2xpc3RbM10pICE9CisJCSAgICBBQ1BJX1RZUEVfSU5URUdFUikgeworCQkJaWYgKGFjcGlfZ2JsX2VuYWJsZV9pbnRlcnByZXRlcl9zbGFjaykgeworCQkJCXNvdXJjZV9uYW1lX2luZGV4ID0gMzsKKwkJCQlzb3VyY2VfaW5kZXhfaW5kZXggPSAyOworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCQkgICAgICAgIkFDUEk6IEhhbmRsaW5nIEdhcmJsZWQgX1BSVCBlbnRyeVxuIik7CisJCQl9IGVsc2UgeworCQkJCUFDUElfRVJST1IoKEFFX0lORk8sCisJCQkJCSAgICAiKFBSVFslWF0uc291cmNlX2luZGV4KSBOZWVkIEludGVnZXIsIGZvdW5kICVzIiwKKwkJCQkJICAgIGluZGV4LAorCQkJCQkgICAgYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZQorCQkJCQkgICAgKHN1Yl9vYmplY3RfbGlzdFszXSkpKTsKKwkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX0RBVEEpOworCQkJfQorCQl9CisKKwkJdXNlcl9wcnQtPnBpbiA9ICh1MzIpIG9ial9kZXNjLT5pbnRlZ2VyLnZhbHVlOworCisJCS8qCisJCSAqIElmIHRoZSBCSU9TIGhhcyBlcnJvbmVvdXNseSByZXZlcnNlZCB0aGUgX1BSVCBzb3VyY2VfbmFtZSAoaW5kZXggMikKKwkJICogYW5kIHRoZSBzb3VyY2VfaW5kZXggKGluZGV4IDMpLCBmaXggaXQuIF9QUlQgaXMgaW1wb3J0YW50IGVub3VnaCB0bworCQkgKiB3b3JrYXJvdW5kIHRoaXMgQklPUyBlcnJvci4gVGhpcyBhbHNvIHByb3ZpZGVzIGNvbXBhdGliaWxpdHkgd2l0aAorCQkgKiBvdGhlciBBQ1BJIGltcGxlbWVudGF0aW9ucy4KKwkJICovCisJCW9ial9kZXNjID0gc3ViX29iamVjdF9saXN0WzNdOworCQlpZiAoIW9ial9kZXNjCisJCSAgICB8fCAoQUNQSV9HRVRfT0JKRUNUX1RZUEUob2JqX2Rlc2MpICE9IEFDUElfVFlQRV9JTlRFR0VSKSkgeworCQkJc3ViX29iamVjdF9saXN0WzNdID0gc3ViX29iamVjdF9saXN0WzJdOworCQkJc3ViX29iamVjdF9saXN0WzJdID0gb2JqX2Rlc2M7CisKKwkJCUFDUElfV0FSTklORygoQUVfSU5GTywKKwkJCQkgICAgICAiKFBSVFslWF0uU291cmNlKSBTb3VyY2VOYW1lIGFuZCBTb3VyY2VJbmRleCBhcmUgcmV2ZXJzZWQsIGZpeGVkIiwKKwkJCQkgICAgICBpbmRleCkpOworCQl9CisKKwkJLyoKKwkJICogMykgVGhpcmQgc3Vib2JqZWN0OiBEZXJlZmVyZW5jZSB0aGUgUFJULnNvdXJjZV9uYW1lCisJCSAqIFRoZSBuYW1lIG1heSBiZSB1bnJlc29sdmVkIChzbGFjayBtb2RlKSwgc28gYWxsb3cgYSBudWxsIG9iamVjdAorCQkgKi8KKwkJb2JqX2Rlc2MgPSBzdWJfb2JqZWN0X2xpc3Rbc291cmNlX25hbWVfaW5kZXhdOworCQlpZiAob2JqX2Rlc2MpIHsKKwkJCXN3aXRjaCAoQUNQSV9HRVRfT0JKRUNUX1RZUEUob2JqX2Rlc2MpKSB7CisJCQljYXNlIEFDUElfVFlQRV9MT0NBTF9SRUZFUkVOQ0U6CisKKwkJCQlpZiAob2JqX2Rlc2MtPnJlZmVyZW5jZS5jbGFzcyAhPQorCQkJCSAgICBBQ1BJX1JFRkNMQVNTX05BTUUpIHsKKwkJCQkJQUNQSV9FUlJPUigoQUVfSU5GTywKKwkJCQkJCSAgICAiKFBSVFslWF0uU291cmNlKSBOZWVkIG5hbWUsIGZvdW5kIFJlZmVyZW5jZSBDbGFzcyAlWCIsCisJCQkJCQkgICAgaW5kZXgsCisJCQkJCQkgICAgb2JqX2Rlc2MtPnJlZmVyZW5jZS5jbGFzcykpOworCQkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX0RBVEEpOworCQkJCX0KKworCQkJCW5vZGUgPSBvYmpfZGVzYy0+cmVmZXJlbmNlLm5vZGU7CisKKwkJCQkvKiBVc2UgKnJlbWFpbmluZyogbGVuZ3RoIG9mIHRoZSBidWZmZXIgYXMgbWF4IGZvciBwYXRobmFtZSAqLworCisJCQkJcGF0aF9idWZmZXIubGVuZ3RoID0gb3V0cHV0X2J1ZmZlci0+bGVuZ3RoIC0KKwkJCQkgICAgKHUzMikgKCh1OCAqKSB1c2VyX3BydC0+c291cmNlIC0KKwkJCQkJICAgKHU4ICopIG91dHB1dF9idWZmZXItPnBvaW50ZXIpOworCQkJCXBhdGhfYnVmZmVyLnBvaW50ZXIgPSB1c2VyX3BydC0+c291cmNlOworCisJCQkJc3RhdHVzID0KKwkJCQkgICAgYWNwaV9uc19oYW5kbGVfdG9fcGF0aG5hbWUoKGFjcGlfaGFuZGxlKQorCQkJCQkJCSAgICAgICBub2RlLAorCQkJCQkJCSAgICAgICAmcGF0aF9idWZmZXIpOworCisJCQkJLyogKzEgdG8gaW5jbHVkZSBudWxsIHRlcm1pbmF0b3IgKi8KKworCQkJCXVzZXJfcHJ0LT5sZW5ndGggKz0KKwkJCQkgICAgKHUzMikgQUNQSV9TVFJMRU4odXNlcl9wcnQtPnNvdXJjZSkgKyAxOworCQkJCWJyZWFrOworCisJCQljYXNlIEFDUElfVFlQRV9TVFJJTkc6CisKKwkJCQlBQ1BJX1NUUkNQWSh1c2VyX3BydC0+c291cmNlLAorCQkJCQkgICAgb2JqX2Rlc2MtPnN0cmluZy5wb2ludGVyKTsKKworCQkJCS8qCisJCQkJICogQWRkIHRvIHRoZSBMZW5ndGggZmllbGQgdGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nCisJCQkJICogKGFkZCAxIGZvciB0ZXJtaW5hdG9yKQorCQkJCSAqLworCQkJCXVzZXJfcHJ0LT5sZW5ndGggKz0gb2JqX2Rlc2MtPnN0cmluZy5sZW5ndGggKyAxOworCQkJCWJyZWFrOworCisJCQljYXNlIEFDUElfVFlQRV9JTlRFR0VSOgorCQkJCS8qCisJCQkJICogSWYgdGhpcyBpcyBhIG51bWJlciwgdGhlbiB0aGUgU291cmNlIE5hbWUgaXMgTlVMTCwgc2luY2UgdGhlCisJCQkJICogZW50aXJlIGJ1ZmZlciB3YXMgemVyb2VkIG91dCwgd2UgY2FuIGxlYXZlIHRoaXMgYWxvbmUuCisJCQkJICoKKwkJCQkgKiBBZGQgdG8gdGhlIExlbmd0aCBmaWVsZCB0aGUgbGVuZ3RoIG9mIHRoZSB1MzIgTlVMTAorCQkJCSAqLworCQkJCXVzZXJfcHJ0LT5sZW5ndGggKz0gc2l6ZW9mKHUzMik7CisJCQkJYnJlYWs7CisKKwkJCWRlZmF1bHQ6CisKKwkJCQlBQ1BJX0VSUk9SKChBRV9JTkZPLAorCQkJCQkgICAgIihQUlRbJVhdLlNvdXJjZSkgTmVlZCBSZWYvU3RyaW5nL0ludGVnZXIsIGZvdW5kICVzIiwKKwkJCQkJICAgIGluZGV4LAorCQkJCQkgICAgYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZQorCQkJCQkgICAgKG9ial9kZXNjKSkpOworCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfREFUQSk7CisJCQl9CisJCX0KKworCQkvKiBOb3cgYWxpZ24gdGhlIGN1cnJlbnQgbGVuZ3RoICovCisKKwkJdXNlcl9wcnQtPmxlbmd0aCA9CisJCSAgICAodTMyKSBBQ1BJX1JPVU5EX1VQX1RPXzY0QklUKHVzZXJfcHJ0LT5sZW5ndGgpOworCisJCS8qIDQpIEZvdXJ0aCBzdWJvYmplY3Q6IERlcmVmZXJlbmNlIHRoZSBQUlQuc291cmNlX2luZGV4ICovCisKKwkJb2JqX2Rlc2MgPSBzdWJfb2JqZWN0X2xpc3Rbc291cmNlX2luZGV4X2luZGV4XTsKKwkJaWYgKEFDUElfR0VUX09CSkVDVF9UWVBFKG9ial9kZXNjKSAhPSBBQ1BJX1RZUEVfSU5URUdFUikgeworCQkJQUNQSV9FUlJPUigoQUVfSU5GTywKKwkJCQkgICAgIihQUlRbJVhdLlNvdXJjZUluZGV4KSBOZWVkIEludGVnZXIsIGZvdW5kICVzIiwKKwkJCQkgICAgaW5kZXgsCisJCQkJICAgIGFjcGlfdXRfZ2V0X29iamVjdF90eXBlX25hbWUob2JqX2Rlc2MpKSk7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX0RBVEEpOworCQl9CisKKwkJdXNlcl9wcnQtPnNvdXJjZV9pbmRleCA9ICh1MzIpIG9ial9kZXNjLT5pbnRlZ2VyLnZhbHVlOworCisJCS8qIFBvaW50IHRvIHRoZSBuZXh0IHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgaW4gdGhlIHRvcCBsZXZlbCBwYWNrYWdlICovCisKKwkJdG9wX29iamVjdF9saXN0Kys7CisJfQorCisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLCAiT3V0cHV0QnVmZmVyICVwIExlbmd0aCAlWFxuIiwKKwkJCSAgb3V0cHV0X2J1ZmZlci0+cG9pbnRlciwgKHUzMikgb3V0cHV0X2J1ZmZlci0+bGVuZ3RoKSk7CisJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9yc19jcmVhdGVfYW1sX3Jlc291cmNlcworICoKKyAqIFBBUkFNRVRFUlM6ICBsaW5rZWRfbGlzdF9idWZmZXIgICAgICAtIFBvaW50ZXIgdG8gdGhlIHJlc291cmNlIGxpbmtlZCBsaXN0CisgKiAgICAgICAgICAgICAgb3V0cHV0X2J1ZmZlciAgICAgICAgICAgLSBQb2ludGVyIHRvIHRoZSB1c2VyJ3MgYnVmZmVyCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cyAgQUVfT0sgaWYgb2theSwgZWxzZSBhIHZhbGlkIGFjcGlfc3RhdHVzIGNvZGUuCisgKiAgICAgICAgICAgICAgSWYgdGhlIG91dHB1dF9idWZmZXIgaXMgdG9vIHNtYWxsLCB0aGUgZXJyb3Igd2lsbCBiZQorICogICAgICAgICAgICAgIEFFX0JVRkZFUl9PVkVSRkxPVyBhbmQgb3V0cHV0X2J1ZmZlci0+TGVuZ3RoIHdpbGwgcG9pbnQKKyAqICAgICAgICAgICAgICB0byB0aGUgc2l6ZSBidWZmZXIgbmVlZGVkLgorICoKKyAqIERFU0NSSVBUSU9OOiBUYWtlcyB0aGUgbGlua2VkIGxpc3Qgb2YgZGV2aWNlIHJlc291cmNlcyBhbmQKKyAqICAgICAgICAgICAgICBjcmVhdGVzIGEgYnl0ZXN0cmVhbSB0byBiZSB1c2VkIGFzIGlucHV0IGZvciB0aGUKKyAqICAgICAgICAgICAgICBfU1JTIGNvbnRyb2wgbWV0aG9kLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2FjcGlfc3RhdHVzCithY3BpX3JzX2NyZWF0ZV9hbWxfcmVzb3VyY2VzKHN0cnVjdCBhY3BpX3Jlc291cmNlICpsaW5rZWRfbGlzdF9idWZmZXIsCisJCQkgICAgIHN0cnVjdCBhY3BpX2J1ZmZlciAqb3V0cHV0X2J1ZmZlcikKK3sKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJYWNwaV9zaXplIGFtbF9zaXplX25lZWRlZCA9IDA7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKHJzX2NyZWF0ZV9hbWxfcmVzb3VyY2VzKTsKKworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgIkxpbmtlZExpc3RCdWZmZXIgPSAlcFxuIiwKKwkJCSAgbGlua2VkX2xpc3RfYnVmZmVyKSk7CisKKwkvKgorCSAqIFBhcmFtcyBhbHJlYWR5IHZhbGlkYXRlZCwgc28gd2UgZG9uJ3QgcmUtdmFsaWRhdGUgaGVyZQorCSAqCisJICogUGFzcyB0aGUgbGlua2VkX2xpc3RfYnVmZmVyIGludG8gYSBtb2R1bGUgdGhhdCBjYWxjdWxhdGVzCisJICogdGhlIGJ1ZmZlciBzaXplIG5lZWRlZCBmb3IgdGhlIGJ5dGUgc3RyZWFtLgorCSAqLworCXN0YXR1cyA9IGFjcGlfcnNfZ2V0X2FtbF9sZW5ndGgobGlua2VkX2xpc3RfYnVmZmVyLCAmYW1sX3NpemVfbmVlZGVkKTsKKworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgIkFtbFNpemVOZWVkZWQ9JVgsICVzXG4iLAorCQkJICAodTMyKSBhbWxfc2l6ZV9uZWVkZWQsCisJCQkgIGFjcGlfZm9ybWF0X2V4Y2VwdGlvbihzdGF0dXMpKSk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworCX0KKworCS8qIFZhbGlkYXRlL0FsbG9jYXRlL0NsZWFyIGNhbGxlciBidWZmZXIgKi8KKworCXN0YXR1cyA9IGFjcGlfdXRfaW5pdGlhbGl6ZV9idWZmZXIob3V0cHV0X2J1ZmZlciwgYW1sX3NpemVfbmVlZGVkKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CisJfQorCisJLyogRG8gdGhlIGNvbnZlcnNpb24gKi8KKworCXN0YXR1cyA9CisJICAgIGFjcGlfcnNfY29udmVydF9yZXNvdXJjZXNfdG9fYW1sKGxpbmtlZF9saXN0X2J1ZmZlciwKKwkJCQkJICAgICBhbWxfc2l6ZV9uZWVkZWQsCisJCQkJCSAgICAgb3V0cHV0X2J1ZmZlci0+cG9pbnRlcik7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworCX0KKworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgIk91dHB1dEJ1ZmZlciAlcCBMZW5ndGggJVhcbiIsCisJCQkgIG91dHB1dF9idWZmZXItPnBvaW50ZXIsICh1MzIpIG91dHB1dF9idWZmZXItPmxlbmd0aCkpOworCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL3JzZHVtcC5jIGIvZHJpdmVycy9hY3BpL2FjcGljYS9yc2R1bXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjBjYTVhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS9yc2R1bXAuYwpAQCAtMCwwICsxLDc3MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBNb2R1bGUgTmFtZTogcnNkdW1wIC0gRnVuY3Rpb25zIHRvIGRpc3BsYXkgdGhlIHJlc291cmNlIHN0cnVjdHVyZXMuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDgsIEludGVsIENvcnAuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCisgKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSBhdCBtaW5pbXVtIGEgZGlzY2xhaW1lcgorICogICAgc3Vic3RhbnRpYWxseSBzaW1pbGFyIHRvIHRoZSAiTk8gV0FSUkFOVFkiIGRpc2NsYWltZXIgYmVsb3cKKyAqICAgICgiRGlzY2xhaW1lciIpIGFuZCBhbnkgcmVkaXN0cmlidXRpb24gbXVzdCBiZSBjb25kaXRpb25lZCB1cG9uCisgKiAgICBpbmNsdWRpbmcgYSBzdWJzdGFudGlhbGx5IHNpbWlsYXIgRGlzY2xhaW1lciByZXF1aXJlbWVudCBmb3IgZnVydGhlcgorICogICAgYmluYXJ5IHJlZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzCisgKiAgICBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIE5PIFdBUlJBTlRZCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORworICogSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCisgKi8KKworI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgorI2luY2x1ZGUgImFjY29tbW9uLmgiCisjaW5jbHVkZSAiYWNyZXNyYy5oIgorCisjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9SRVNPVVJDRVMKK0FDUElfTU9EVUxFX05BTUUoInJzZHVtcCIpCisjaWYgZGVmaW5lZChBQ1BJX0RFQlVHX09VVFBVVCkgfHwgZGVmaW5lZChBQ1BJX0RFQlVHR0VSKQorLyogTG9jYWwgcHJvdG90eXBlcyAqLworc3RhdGljIHZvaWQgYWNwaV9yc19vdXRfc3RyaW5nKGNoYXIgKnRpdGxlLCBjaGFyICp2YWx1ZSk7CisKK3N0YXRpYyB2b2lkIGFjcGlfcnNfb3V0X2ludGVnZXI4KGNoYXIgKnRpdGxlLCB1OCB2YWx1ZSk7CisKK3N0YXRpYyB2b2lkIGFjcGlfcnNfb3V0X2ludGVnZXIxNihjaGFyICp0aXRsZSwgdTE2IHZhbHVlKTsKKworc3RhdGljIHZvaWQgYWNwaV9yc19vdXRfaW50ZWdlcjMyKGNoYXIgKnRpdGxlLCB1MzIgdmFsdWUpOworCitzdGF0aWMgdm9pZCBhY3BpX3JzX291dF9pbnRlZ2VyNjQoY2hhciAqdGl0bGUsIHU2NCB2YWx1ZSk7CisKK3N0YXRpYyB2b2lkIGFjcGlfcnNfb3V0X3RpdGxlKGNoYXIgKnRpdGxlKTsKKworc3RhdGljIHZvaWQgYWNwaV9yc19kdW1wX2J5dGVfbGlzdCh1MTYgbGVuZ3RoLCB1OCAqIGRhdGEpOworCitzdGF0aWMgdm9pZCBhY3BpX3JzX2R1bXBfZHdvcmRfbGlzdCh1OCBsZW5ndGgsIHUzMiAqIGRhdGEpOworCitzdGF0aWMgdm9pZCBhY3BpX3JzX2R1bXBfc2hvcnRfYnl0ZV9saXN0KHU4IGxlbmd0aCwgdTggKiBkYXRhKTsKKworc3RhdGljIHZvaWQKK2FjcGlfcnNfZHVtcF9yZXNvdXJjZV9zb3VyY2Uoc3RydWN0IGFjcGlfcmVzb3VyY2Vfc291cmNlICpyZXNvdXJjZV9zb3VyY2UpOworCitzdGF0aWMgdm9pZCBhY3BpX3JzX2R1bXBfYWRkcmVzc19jb21tb24odW5pb24gYWNwaV9yZXNvdXJjZV9kYXRhICpyZXNvdXJjZSk7CisKK3N0YXRpYyB2b2lkCithY3BpX3JzX2R1bXBfZGVzY3JpcHRvcih2b2lkICpyZXNvdXJjZSwgc3RydWN0IGFjcGlfcnNkdW1wX2luZm8gKnRhYmxlKTsKKworI2RlZmluZSBBQ1BJX1JTRF9PRkZTRVQoZikgICAgICAgICAgKHU4KSBBQ1BJX09GRlNFVCAodW5pb24gYWNwaV9yZXNvdXJjZV9kYXRhLGYpCisjZGVmaW5lIEFDUElfUFJUX09GRlNFVChmKSAgICAgICAgICAodTgpIEFDUElfT0ZGU0VUIChzdHJ1Y3QgYWNwaV9wY2lfcm91dGluZ190YWJsZSxmKQorI2RlZmluZSBBQ1BJX1JTRF9UQUJMRV9TSVpFKG5hbWUpICAgKHNpemVvZihuYW1lKSAvIHNpemVvZiAoc3RydWN0IGFjcGlfcnNkdW1wX2luZm8pKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIFJlc291cmNlIERlc2NyaXB0b3IgaW5mbyB0YWJsZXMKKyAqCisgKiBOb3RlOiBUaGUgZmlyc3QgdGFibGUgZW50cnkgbXVzdCBiZSBhIFRpdGxlIG9yIExpdGVyYWwgYW5kIG11c3QgY29udGFpbgorICogdGhlIHRhYmxlIGxlbmd0aCAobnVtYmVyIG9mIHRhYmxlIGVudHJpZXMpCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RydWN0IGFjcGlfcnNkdW1wX2luZm8gYWNwaV9yc19kdW1wX2lycVs3XSA9IHsKKwl7QUNQSV9SU0RfVElUTEUsIEFDUElfUlNEX1RBQkxFX1NJWkUoYWNwaV9yc19kdW1wX2lycSksICJJUlEiLCBOVUxMfSwKKwl7QUNQSV9SU0RfVUlOVDgsIEFDUElfUlNEX09GRlNFVChpcnEuZGVzY3JpcHRvcl9sZW5ndGgpLAorCSAiRGVzY3JpcHRvciBMZW5ndGgiLCBOVUxMfSwKKwl7QUNQSV9SU0RfMUJJVEZMQUcsIEFDUElfUlNEX09GRlNFVChpcnEudHJpZ2dlcmluZyksICJUcmlnZ2VyaW5nIiwKKwkgYWNwaV9nYmxfaGVfZGVjb2RlfSwKKwl7QUNQSV9SU0RfMUJJVEZMQUcsIEFDUElfUlNEX09GRlNFVChpcnEucG9sYXJpdHkpLCAiUG9sYXJpdHkiLAorCSBhY3BpX2dibF9sbF9kZWNvZGV9LAorCXtBQ1BJX1JTRF8xQklURkxBRywgQUNQSV9SU0RfT0ZGU0VUKGlycS5zaGFyYWJsZSksICJTaGFyaW5nIiwKKwkgYWNwaV9nYmxfc2hyX2RlY29kZX0sCisJe0FDUElfUlNEX1VJTlQ4LCBBQ1BJX1JTRF9PRkZTRVQoaXJxLmludGVycnVwdF9jb3VudCksCisJICJJbnRlcnJ1cHQgQ291bnQiLCBOVUxMfSwKKwl7QUNQSV9SU0RfU0hPUlRMSVNULCBBQ1BJX1JTRF9PRkZTRVQoaXJxLmludGVycnVwdHNbMF0pLAorCSAiSW50ZXJydXB0IExpc3QiLCBOVUxMfQorfTsKKworc3RydWN0IGFjcGlfcnNkdW1wX2luZm8gYWNwaV9yc19kdW1wX2RtYVs2XSA9IHsKKwl7QUNQSV9SU0RfVElUTEUsIEFDUElfUlNEX1RBQkxFX1NJWkUoYWNwaV9yc19kdW1wX2RtYSksICJETUEiLCBOVUxMfSwKKwl7QUNQSV9SU0RfMkJJVEZMQUcsIEFDUElfUlNEX09GRlNFVChkbWEudHlwZSksICJTcGVlZCIsCisJIGFjcGlfZ2JsX3R5cF9kZWNvZGV9LAorCXtBQ1BJX1JTRF8xQklURkxBRywgQUNQSV9SU0RfT0ZGU0VUKGRtYS5idXNfbWFzdGVyKSwgIk1hc3RlcmluZyIsCisJIGFjcGlfZ2JsX2JtX2RlY29kZX0sCisJe0FDUElfUlNEXzJCSVRGTEFHLCBBQ1BJX1JTRF9PRkZTRVQoZG1hLnRyYW5zZmVyKSwgIlRyYW5zZmVyIFR5cGUiLAorCSBhY3BpX2dibF9zaXpfZGVjb2RlfSwKKwl7QUNQSV9SU0RfVUlOVDgsIEFDUElfUlNEX09GRlNFVChkbWEuY2hhbm5lbF9jb3VudCksICJDaGFubmVsIENvdW50IiwKKwkgTlVMTH0sCisJe0FDUElfUlNEX1NIT1JUTElTVCwgQUNQSV9SU0RfT0ZGU0VUKGRtYS5jaGFubmVsc1swXSksICJDaGFubmVsIExpc3QiLAorCSBOVUxMfQorfTsKKworc3RydWN0IGFjcGlfcnNkdW1wX2luZm8gYWNwaV9yc19kdW1wX3N0YXJ0X2RwZls0XSA9IHsKKwl7QUNQSV9SU0RfVElUTEUsIEFDUElfUlNEX1RBQkxFX1NJWkUoYWNwaV9yc19kdW1wX3N0YXJ0X2RwZiksCisJICJTdGFydC1EZXBlbmRlbnQtRnVuY3Rpb25zIiwgTlVMTH0sCisJe0FDUElfUlNEX1VJTlQ4LCBBQ1BJX1JTRF9PRkZTRVQoc3RhcnRfZHBmLmRlc2NyaXB0b3JfbGVuZ3RoKSwKKwkgIkRlc2NyaXB0b3IgTGVuZ3RoIiwgTlVMTH0sCisJe0FDUElfUlNEXzJCSVRGTEFHLCBBQ1BJX1JTRF9PRkZTRVQoc3RhcnRfZHBmLmNvbXBhdGliaWxpdHlfcHJpb3JpdHkpLAorCSAiQ29tcGF0aWJpbGl0eSBQcmlvcml0eSIsIGFjcGlfZ2JsX2NvbmZpZ19kZWNvZGV9LAorCXtBQ1BJX1JTRF8yQklURkxBRywgQUNQSV9SU0RfT0ZGU0VUKHN0YXJ0X2RwZi5wZXJmb3JtYW5jZV9yb2J1c3RuZXNzKSwKKwkgIlBlcmZvcm1hbmNlL1JvYnVzdG5lc3MiLCBhY3BpX2dibF9jb25maWdfZGVjb2RlfQorfTsKKworc3RydWN0IGFjcGlfcnNkdW1wX2luZm8gYWNwaV9yc19kdW1wX2VuZF9kcGZbMV0gPSB7CisJe0FDUElfUlNEX1RJVExFLCBBQ1BJX1JTRF9UQUJMRV9TSVpFKGFjcGlfcnNfZHVtcF9lbmRfZHBmKSwKKwkgIkVuZC1EZXBlbmRlbnQtRnVuY3Rpb25zIiwgTlVMTH0KK307CisKK3N0cnVjdCBhY3BpX3JzZHVtcF9pbmZvIGFjcGlfcnNfZHVtcF9pb1s2XSA9IHsKKwl7QUNQSV9SU0RfVElUTEUsIEFDUElfUlNEX1RBQkxFX1NJWkUoYWNwaV9yc19kdW1wX2lvKSwgIkkvTyIsIE5VTEx9LAorCXtBQ1BJX1JTRF8xQklURkxBRywgQUNQSV9SU0RfT0ZGU0VUKGlvLmlvX2RlY29kZSksICJBZGRyZXNzIERlY29kaW5nIiwKKwkgYWNwaV9nYmxfaW9fZGVjb2RlfSwKKwl7QUNQSV9SU0RfVUlOVDE2LCBBQ1BJX1JTRF9PRkZTRVQoaW8ubWluaW11bSksICJBZGRyZXNzIE1pbmltdW0iLCBOVUxMfSwKKwl7QUNQSV9SU0RfVUlOVDE2LCBBQ1BJX1JTRF9PRkZTRVQoaW8ubWF4aW11bSksICJBZGRyZXNzIE1heGltdW0iLCBOVUxMfSwKKwl7QUNQSV9SU0RfVUlOVDgsIEFDUElfUlNEX09GRlNFVChpby5hbGlnbm1lbnQpLCAiQWxpZ25tZW50IiwgTlVMTH0sCisJe0FDUElfUlNEX1VJTlQ4LCBBQ1BJX1JTRF9PRkZTRVQoaW8uYWRkcmVzc19sZW5ndGgpLCAiQWRkcmVzcyBMZW5ndGgiLAorCSBOVUxMfQorfTsKKworc3RydWN0IGFjcGlfcnNkdW1wX2luZm8gYWNwaV9yc19kdW1wX2ZpeGVkX2lvWzNdID0geworCXtBQ1BJX1JTRF9USVRMRSwgQUNQSV9SU0RfVEFCTEVfU0laRShhY3BpX3JzX2R1bXBfZml4ZWRfaW8pLAorCSAiRml4ZWQgSS9PIiwgTlVMTH0sCisJe0FDUElfUlNEX1VJTlQxNiwgQUNQSV9SU0RfT0ZGU0VUKGZpeGVkX2lvLmFkZHJlc3MpLCAiQWRkcmVzcyIsIE5VTEx9LAorCXtBQ1BJX1JTRF9VSU5UOCwgQUNQSV9SU0RfT0ZGU0VUKGZpeGVkX2lvLmFkZHJlc3NfbGVuZ3RoKSwKKwkgIkFkZHJlc3MgTGVuZ3RoIiwgTlVMTH0KK307CisKK3N0cnVjdCBhY3BpX3JzZHVtcF9pbmZvIGFjcGlfcnNfZHVtcF92ZW5kb3JbM10gPSB7CisJe0FDUElfUlNEX1RJVExFLCBBQ1BJX1JTRF9UQUJMRV9TSVpFKGFjcGlfcnNfZHVtcF92ZW5kb3IpLAorCSAiVmVuZG9yIFNwZWNpZmljIiwgTlVMTH0sCisJe0FDUElfUlNEX1VJTlQxNiwgQUNQSV9SU0RfT0ZGU0VUKHZlbmRvci5ieXRlX2xlbmd0aCksICJMZW5ndGgiLCBOVUxMfSwKKwl7QUNQSV9SU0RfTE9OR0xJU1QsIEFDUElfUlNEX09GRlNFVCh2ZW5kb3IuYnl0ZV9kYXRhWzBdKSwgIlZlbmRvciBEYXRhIiwKKwkgTlVMTH0KK307CisKK3N0cnVjdCBhY3BpX3JzZHVtcF9pbmZvIGFjcGlfcnNfZHVtcF9lbmRfdGFnWzFdID0geworCXtBQ1BJX1JTRF9USVRMRSwgQUNQSV9SU0RfVEFCTEVfU0laRShhY3BpX3JzX2R1bXBfZW5kX3RhZyksICJFbmRUYWciLAorCSBOVUxMfQorfTsKKworc3RydWN0IGFjcGlfcnNkdW1wX2luZm8gYWNwaV9yc19kdW1wX21lbW9yeTI0WzZdID0geworCXtBQ1BJX1JTRF9USVRMRSwgQUNQSV9SU0RfVEFCTEVfU0laRShhY3BpX3JzX2R1bXBfbWVtb3J5MjQpLAorCSAiMjQtQml0IE1lbW9yeSBSYW5nZSIsIE5VTEx9LAorCXtBQ1BJX1JTRF8xQklURkxBRywgQUNQSV9SU0RfT0ZGU0VUKG1lbW9yeTI0LndyaXRlX3Byb3RlY3QpLAorCSAiV3JpdGUgUHJvdGVjdCIsIGFjcGlfZ2JsX3J3X2RlY29kZX0sCisJe0FDUElfUlNEX1VJTlQxNiwgQUNQSV9SU0RfT0ZGU0VUKG1lbW9yeTI0Lm1pbmltdW0pLCAiQWRkcmVzcyBNaW5pbXVtIiwKKwkgTlVMTH0sCisJe0FDUElfUlNEX1VJTlQxNiwgQUNQSV9SU0RfT0ZGU0VUKG1lbW9yeTI0Lm1heGltdW0pLCAiQWRkcmVzcyBNYXhpbXVtIiwKKwkgTlVMTH0sCisJe0FDUElfUlNEX1VJTlQxNiwgQUNQSV9SU0RfT0ZGU0VUKG1lbW9yeTI0LmFsaWdubWVudCksICJBbGlnbm1lbnQiLAorCSBOVUxMfSwKKwl7QUNQSV9SU0RfVUlOVDE2LCBBQ1BJX1JTRF9PRkZTRVQobWVtb3J5MjQuYWRkcmVzc19sZW5ndGgpLAorCSAiQWRkcmVzcyBMZW5ndGgiLCBOVUxMfQorfTsKKworc3RydWN0IGFjcGlfcnNkdW1wX2luZm8gYWNwaV9yc19kdW1wX21lbW9yeTMyWzZdID0geworCXtBQ1BJX1JTRF9USVRMRSwgQUNQSV9SU0RfVEFCTEVfU0laRShhY3BpX3JzX2R1bXBfbWVtb3J5MzIpLAorCSAiMzItQml0IE1lbW9yeSBSYW5nZSIsIE5VTEx9LAorCXtBQ1BJX1JTRF8xQklURkxBRywgQUNQSV9SU0RfT0ZGU0VUKG1lbW9yeTMyLndyaXRlX3Byb3RlY3QpLAorCSAiV3JpdGUgUHJvdGVjdCIsIGFjcGlfZ2JsX3J3X2RlY29kZX0sCisJe0FDUElfUlNEX1VJTlQzMiwgQUNQSV9SU0RfT0ZGU0VUKG1lbW9yeTMyLm1pbmltdW0pLCAiQWRkcmVzcyBNaW5pbXVtIiwKKwkgTlVMTH0sCisJe0FDUElfUlNEX1VJTlQzMiwgQUNQSV9SU0RfT0ZGU0VUKG1lbW9yeTMyLm1heGltdW0pLCAiQWRkcmVzcyBNYXhpbXVtIiwKKwkgTlVMTH0sCisJe0FDUElfUlNEX1VJTlQzMiwgQUNQSV9SU0RfT0ZGU0VUKG1lbW9yeTMyLmFsaWdubWVudCksICJBbGlnbm1lbnQiLAorCSBOVUxMfSwKKwl7QUNQSV9SU0RfVUlOVDMyLCBBQ1BJX1JTRF9PRkZTRVQobWVtb3J5MzIuYWRkcmVzc19sZW5ndGgpLAorCSAiQWRkcmVzcyBMZW5ndGgiLCBOVUxMfQorfTsKKworc3RydWN0IGFjcGlfcnNkdW1wX2luZm8gYWNwaV9yc19kdW1wX2ZpeGVkX21lbW9yeTMyWzRdID0geworCXtBQ1BJX1JTRF9USVRMRSwgQUNQSV9SU0RfVEFCTEVfU0laRShhY3BpX3JzX2R1bXBfZml4ZWRfbWVtb3J5MzIpLAorCSAiMzItQml0IEZpeGVkIE1lbW9yeSBSYW5nZSIsIE5VTEx9LAorCXtBQ1BJX1JTRF8xQklURkxBRywgQUNQSV9SU0RfT0ZGU0VUKGZpeGVkX21lbW9yeTMyLndyaXRlX3Byb3RlY3QpLAorCSAiV3JpdGUgUHJvdGVjdCIsIGFjcGlfZ2JsX3J3X2RlY29kZX0sCisJe0FDUElfUlNEX1VJTlQzMiwgQUNQSV9SU0RfT0ZGU0VUKGZpeGVkX21lbW9yeTMyLmFkZHJlc3MpLCAiQWRkcmVzcyIsCisJIE5VTEx9LAorCXtBQ1BJX1JTRF9VSU5UMzIsIEFDUElfUlNEX09GRlNFVChmaXhlZF9tZW1vcnkzMi5hZGRyZXNzX2xlbmd0aCksCisJICJBZGRyZXNzIExlbmd0aCIsIE5VTEx9Cit9OworCitzdHJ1Y3QgYWNwaV9yc2R1bXBfaW5mbyBhY3BpX3JzX2R1bXBfYWRkcmVzczE2WzhdID0geworCXtBQ1BJX1JTRF9USVRMRSwgQUNQSV9SU0RfVEFCTEVfU0laRShhY3BpX3JzX2R1bXBfYWRkcmVzczE2KSwKKwkgIjE2LUJpdCBXT1JEIEFkZHJlc3MgU3BhY2UiLCBOVUxMfSwKKwl7QUNQSV9SU0RfQUREUkVTUywgMCwgTlVMTCwgTlVMTH0sCisJe0FDUElfUlNEX1VJTlQxNiwgQUNQSV9SU0RfT0ZGU0VUKGFkZHJlc3MxNi5ncmFudWxhcml0eSksICJHcmFudWxhcml0eSIsCisJIE5VTEx9LAorCXtBQ1BJX1JTRF9VSU5UMTYsIEFDUElfUlNEX09GRlNFVChhZGRyZXNzMTYubWluaW11bSksICJBZGRyZXNzIE1pbmltdW0iLAorCSBOVUxMfSwKKwl7QUNQSV9SU0RfVUlOVDE2LCBBQ1BJX1JTRF9PRkZTRVQoYWRkcmVzczE2Lm1heGltdW0pLCAiQWRkcmVzcyBNYXhpbXVtIiwKKwkgTlVMTH0sCisJe0FDUElfUlNEX1VJTlQxNiwgQUNQSV9SU0RfT0ZGU0VUKGFkZHJlc3MxNi50cmFuc2xhdGlvbl9vZmZzZXQpLAorCSAiVHJhbnNsYXRpb24gT2Zmc2V0IiwgTlVMTH0sCisJe0FDUElfUlNEX1VJTlQxNiwgQUNQSV9SU0RfT0ZGU0VUKGFkZHJlc3MxNi5hZGRyZXNzX2xlbmd0aCksCisJICJBZGRyZXNzIExlbmd0aCIsIE5VTEx9LAorCXtBQ1BJX1JTRF9TT1VSQ0UsIEFDUElfUlNEX09GRlNFVChhZGRyZXNzMTYucmVzb3VyY2Vfc291cmNlKSwgTlVMTCwgTlVMTH0KK307CisKK3N0cnVjdCBhY3BpX3JzZHVtcF9pbmZvIGFjcGlfcnNfZHVtcF9hZGRyZXNzMzJbOF0gPSB7CisJe0FDUElfUlNEX1RJVExFLCBBQ1BJX1JTRF9UQUJMRV9TSVpFKGFjcGlfcnNfZHVtcF9hZGRyZXNzMzIpLAorCSAiMzItQml0IERXT1JEIEFkZHJlc3MgU3BhY2UiLCBOVUxMfSwKKwl7QUNQSV9SU0RfQUREUkVTUywgMCwgTlVMTCwgTlVMTH0sCisJe0FDUElfUlNEX1VJTlQzMiwgQUNQSV9SU0RfT0ZGU0VUKGFkZHJlc3MzMi5ncmFudWxhcml0eSksICJHcmFudWxhcml0eSIsCisJIE5VTEx9LAorCXtBQ1BJX1JTRF9VSU5UMzIsIEFDUElfUlNEX09GRlNFVChhZGRyZXNzMzIubWluaW11bSksICJBZGRyZXNzIE1pbmltdW0iLAorCSBOVUxMfSwKKwl7QUNQSV9SU0RfVUlOVDMyLCBBQ1BJX1JTRF9PRkZTRVQoYWRkcmVzczMyLm1heGltdW0pLCAiQWRkcmVzcyBNYXhpbXVtIiwKKwkgTlVMTH0sCisJe0FDUElfUlNEX1VJTlQzMiwgQUNQSV9SU0RfT0ZGU0VUKGFkZHJlc3MzMi50cmFuc2xhdGlvbl9vZmZzZXQpLAorCSAiVHJhbnNsYXRpb24gT2Zmc2V0IiwgTlVMTH0sCisJe0FDUElfUlNEX1VJTlQzMiwgQUNQSV9SU0RfT0ZGU0VUKGFkZHJlc3MzMi5hZGRyZXNzX2xlbmd0aCksCisJICJBZGRyZXNzIExlbmd0aCIsIE5VTEx9LAorCXtBQ1BJX1JTRF9TT1VSQ0UsIEFDUElfUlNEX09GRlNFVChhZGRyZXNzMzIucmVzb3VyY2Vfc291cmNlKSwgTlVMTCwgTlVMTH0KK307CisKK3N0cnVjdCBhY3BpX3JzZHVtcF9pbmZvIGFjcGlfcnNfZHVtcF9hZGRyZXNzNjRbOF0gPSB7CisJe0FDUElfUlNEX1RJVExFLCBBQ1BJX1JTRF9UQUJMRV9TSVpFKGFjcGlfcnNfZHVtcF9hZGRyZXNzNjQpLAorCSAiNjQtQml0IFFXT1JEIEFkZHJlc3MgU3BhY2UiLCBOVUxMfSwKKwl7QUNQSV9SU0RfQUREUkVTUywgMCwgTlVMTCwgTlVMTH0sCisJe0FDUElfUlNEX1VJTlQ2NCwgQUNQSV9SU0RfT0ZGU0VUKGFkZHJlc3M2NC5ncmFudWxhcml0eSksICJHcmFudWxhcml0eSIsCisJIE5VTEx9LAorCXtBQ1BJX1JTRF9VSU5UNjQsIEFDUElfUlNEX09GRlNFVChhZGRyZXNzNjQubWluaW11bSksICJBZGRyZXNzIE1pbmltdW0iLAorCSBOVUxMfSwKKwl7QUNQSV9SU0RfVUlOVDY0LCBBQ1BJX1JTRF9PRkZTRVQoYWRkcmVzczY0Lm1heGltdW0pLCAiQWRkcmVzcyBNYXhpbXVtIiwKKwkgTlVMTH0sCisJe0FDUElfUlNEX1VJTlQ2NCwgQUNQSV9SU0RfT0ZGU0VUKGFkZHJlc3M2NC50cmFuc2xhdGlvbl9vZmZzZXQpLAorCSAiVHJhbnNsYXRpb24gT2Zmc2V0IiwgTlVMTH0sCisJe0FDUElfUlNEX1VJTlQ2NCwgQUNQSV9SU0RfT0ZGU0VUKGFkZHJlc3M2NC5hZGRyZXNzX2xlbmd0aCksCisJICJBZGRyZXNzIExlbmd0aCIsIE5VTEx9LAorCXtBQ1BJX1JTRF9TT1VSQ0UsIEFDUElfUlNEX09GRlNFVChhZGRyZXNzNjQucmVzb3VyY2Vfc291cmNlKSwgTlVMTCwgTlVMTH0KK307CisKK3N0cnVjdCBhY3BpX3JzZHVtcF9pbmZvIGFjcGlfcnNfZHVtcF9leHRfYWRkcmVzczY0WzhdID0geworCXtBQ1BJX1JTRF9USVRMRSwgQUNQSV9SU0RfVEFCTEVfU0laRShhY3BpX3JzX2R1bXBfZXh0X2FkZHJlc3M2NCksCisJICI2NC1CaXQgRXh0ZW5kZWQgQWRkcmVzcyBTcGFjZSIsIE5VTEx9LAorCXtBQ1BJX1JTRF9BRERSRVNTLCAwLCBOVUxMLCBOVUxMfSwKKwl7QUNQSV9SU0RfVUlOVDY0LCBBQ1BJX1JTRF9PRkZTRVQoZXh0X2FkZHJlc3M2NC5ncmFudWxhcml0eSksCisJICJHcmFudWxhcml0eSIsIE5VTEx9LAorCXtBQ1BJX1JTRF9VSU5UNjQsIEFDUElfUlNEX09GRlNFVChleHRfYWRkcmVzczY0Lm1pbmltdW0pLAorCSAiQWRkcmVzcyBNaW5pbXVtIiwgTlVMTH0sCisJe0FDUElfUlNEX1VJTlQ2NCwgQUNQSV9SU0RfT0ZGU0VUKGV4dF9hZGRyZXNzNjQubWF4aW11bSksCisJICJBZGRyZXNzIE1heGltdW0iLCBOVUxMfSwKKwl7QUNQSV9SU0RfVUlOVDY0LCBBQ1BJX1JTRF9PRkZTRVQoZXh0X2FkZHJlc3M2NC50cmFuc2xhdGlvbl9vZmZzZXQpLAorCSAiVHJhbnNsYXRpb24gT2Zmc2V0IiwgTlVMTH0sCisJe0FDUElfUlNEX1VJTlQ2NCwgQUNQSV9SU0RfT0ZGU0VUKGV4dF9hZGRyZXNzNjQuYWRkcmVzc19sZW5ndGgpLAorCSAiQWRkcmVzcyBMZW5ndGgiLCBOVUxMfSwKKwl7QUNQSV9SU0RfVUlOVDY0LCBBQ1BJX1JTRF9PRkZTRVQoZXh0X2FkZHJlc3M2NC50eXBlX3NwZWNpZmljKSwKKwkgIlR5cGUtU3BlY2lmaWMgQXR0cmlidXRlIiwgTlVMTH0KK307CisKK3N0cnVjdCBhY3BpX3JzZHVtcF9pbmZvIGFjcGlfcnNfZHVtcF9leHRfaXJxWzhdID0geworCXtBQ1BJX1JTRF9USVRMRSwgQUNQSV9SU0RfVEFCTEVfU0laRShhY3BpX3JzX2R1bXBfZXh0X2lycSksCisJICJFeHRlbmRlZCBJUlEiLCBOVUxMfSwKKwl7QUNQSV9SU0RfMUJJVEZMQUcsIEFDUElfUlNEX09GRlNFVChleHRlbmRlZF9pcnEucHJvZHVjZXJfY29uc3VtZXIpLAorCSAiVHlwZSIsIGFjcGlfZ2JsX2NvbnN1bWVfZGVjb2RlfSwKKwl7QUNQSV9SU0RfMUJJVEZMQUcsIEFDUElfUlNEX09GRlNFVChleHRlbmRlZF9pcnEudHJpZ2dlcmluZyksCisJICJUcmlnZ2VyaW5nIiwgYWNwaV9nYmxfaGVfZGVjb2RlfSwKKwl7QUNQSV9SU0RfMUJJVEZMQUcsIEFDUElfUlNEX09GRlNFVChleHRlbmRlZF9pcnEucG9sYXJpdHkpLCAiUG9sYXJpdHkiLAorCSBhY3BpX2dibF9sbF9kZWNvZGV9LAorCXtBQ1BJX1JTRF8xQklURkxBRywgQUNQSV9SU0RfT0ZGU0VUKGV4dGVuZGVkX2lycS5zaGFyYWJsZSksICJTaGFyaW5nIiwKKwkgYWNwaV9nYmxfc2hyX2RlY29kZX0sCisJe0FDUElfUlNEX1NPVVJDRSwgQUNQSV9SU0RfT0ZGU0VUKGV4dGVuZGVkX2lycS5yZXNvdXJjZV9zb3VyY2UpLCBOVUxMLAorCSBOVUxMfSwKKwl7QUNQSV9SU0RfVUlOVDgsIEFDUElfUlNEX09GRlNFVChleHRlbmRlZF9pcnEuaW50ZXJydXB0X2NvdW50KSwKKwkgIkludGVycnVwdCBDb3VudCIsIE5VTEx9LAorCXtBQ1BJX1JTRF9EV09SRExJU1QsIEFDUElfUlNEX09GRlNFVChleHRlbmRlZF9pcnEuaW50ZXJydXB0c1swXSksCisJICJJbnRlcnJ1cHQgTGlzdCIsIE5VTEx9Cit9OworCitzdHJ1Y3QgYWNwaV9yc2R1bXBfaW5mbyBhY3BpX3JzX2R1bXBfZ2VuZXJpY19yZWdbNl0gPSB7CisJe0FDUElfUlNEX1RJVExFLCBBQ1BJX1JTRF9UQUJMRV9TSVpFKGFjcGlfcnNfZHVtcF9nZW5lcmljX3JlZyksCisJICJHZW5lcmljIFJlZ2lzdGVyIiwgTlVMTH0sCisJe0FDUElfUlNEX1VJTlQ4LCBBQ1BJX1JTRF9PRkZTRVQoZ2VuZXJpY19yZWcuc3BhY2VfaWQpLCAiU3BhY2UgSUQiLAorCSBOVUxMfSwKKwl7QUNQSV9SU0RfVUlOVDgsIEFDUElfUlNEX09GRlNFVChnZW5lcmljX3JlZy5iaXRfd2lkdGgpLCAiQml0IFdpZHRoIiwKKwkgTlVMTH0sCisJe0FDUElfUlNEX1VJTlQ4LCBBQ1BJX1JTRF9PRkZTRVQoZ2VuZXJpY19yZWcuYml0X29mZnNldCksICJCaXQgT2Zmc2V0IiwKKwkgTlVMTH0sCisJe0FDUElfUlNEX1VJTlQ4LCBBQ1BJX1JTRF9PRkZTRVQoZ2VuZXJpY19yZWcuYWNjZXNzX3NpemUpLAorCSAiQWNjZXNzIFNpemUiLCBOVUxMfSwKKwl7QUNQSV9SU0RfVUlOVDY0LCBBQ1BJX1JTRF9PRkZTRVQoZ2VuZXJpY19yZWcuYWRkcmVzcyksICJBZGRyZXNzIiwgTlVMTH0KK307CisKKy8qCisgKiBUYWJsZXMgdXNlZCBmb3IgY29tbW9uIGFkZHJlc3MgZGVzY3JpcHRvciBmbGFnIGZpZWxkcworICovCitzdGF0aWMgc3RydWN0IGFjcGlfcnNkdW1wX2luZm8gYWNwaV9yc19kdW1wX2dlbmVyYWxfZmxhZ3NbNV0gPSB7CisJe0FDUElfUlNEX1RJVExFLCBBQ1BJX1JTRF9UQUJMRV9TSVpFKGFjcGlfcnNfZHVtcF9nZW5lcmFsX2ZsYWdzKSwgTlVMTCwKKwkgTlVMTH0sCisJe0FDUElfUlNEXzFCSVRGTEFHLCBBQ1BJX1JTRF9PRkZTRVQoYWRkcmVzcy5wcm9kdWNlcl9jb25zdW1lciksCisJICJDb25zdW1lci9Qcm9kdWNlciIsIGFjcGlfZ2JsX2NvbnN1bWVfZGVjb2RlfSwKKwl7QUNQSV9SU0RfMUJJVEZMQUcsIEFDUElfUlNEX09GRlNFVChhZGRyZXNzLmRlY29kZSksICJBZGRyZXNzIERlY29kZSIsCisJIGFjcGlfZ2JsX2RlY19kZWNvZGV9LAorCXtBQ1BJX1JTRF8xQklURkxBRywgQUNQSV9SU0RfT0ZGU0VUKGFkZHJlc3MubWluX2FkZHJlc3NfZml4ZWQpLAorCSAiTWluIFJlbG9jYXRhYmlsaXR5IiwgYWNwaV9nYmxfbWluX2RlY29kZX0sCisJe0FDUElfUlNEXzFCSVRGTEFHLCBBQ1BJX1JTRF9PRkZTRVQoYWRkcmVzcy5tYXhfYWRkcmVzc19maXhlZCksCisJICJNYXggUmVsb2NhdGFiaWxpdHkiLCBhY3BpX2dibF9tYXhfZGVjb2RlfQorfTsKKworc3RhdGljIHN0cnVjdCBhY3BpX3JzZHVtcF9pbmZvIGFjcGlfcnNfZHVtcF9tZW1vcnlfZmxhZ3NbNV0gPSB7CisJe0FDUElfUlNEX0xJVEVSQUwsIEFDUElfUlNEX1RBQkxFX1NJWkUoYWNwaV9yc19kdW1wX21lbW9yeV9mbGFncyksCisJICJSZXNvdXJjZSBUeXBlIiwgKHZvaWQgKikiTWVtb3J5IFJhbmdlIn0sCisJe0FDUElfUlNEXzFCSVRGTEFHLCBBQ1BJX1JTRF9PRkZTRVQoYWRkcmVzcy5pbmZvLm1lbS53cml0ZV9wcm90ZWN0KSwKKwkgIldyaXRlIFByb3RlY3QiLCBhY3BpX2dibF9yd19kZWNvZGV9LAorCXtBQ1BJX1JTRF8yQklURkxBRywgQUNQSV9SU0RfT0ZGU0VUKGFkZHJlc3MuaW5mby5tZW0uY2FjaGluZyksCisJICJDYWNoaW5nIiwgYWNwaV9nYmxfbWVtX2RlY29kZX0sCisJe0FDUElfUlNEXzJCSVRGTEFHLCBBQ1BJX1JTRF9PRkZTRVQoYWRkcmVzcy5pbmZvLm1lbS5yYW5nZV90eXBlKSwKKwkgIlJhbmdlIFR5cGUiLCBhY3BpX2dibF9tdHBfZGVjb2RlfSwKKwl7QUNQSV9SU0RfMUJJVEZMQUcsIEFDUElfUlNEX09GRlNFVChhZGRyZXNzLmluZm8ubWVtLnRyYW5zbGF0aW9uKSwKKwkgIlRyYW5zbGF0aW9uIiwgYWNwaV9nYmxfdHRwX2RlY29kZX0KK307CisKK3N0YXRpYyBzdHJ1Y3QgYWNwaV9yc2R1bXBfaW5mbyBhY3BpX3JzX2R1bXBfaW9fZmxhZ3NbNF0gPSB7CisJe0FDUElfUlNEX0xJVEVSQUwsIEFDUElfUlNEX1RBQkxFX1NJWkUoYWNwaV9yc19kdW1wX2lvX2ZsYWdzKSwKKwkgIlJlc291cmNlIFR5cGUiLCAodm9pZCAqKSJJL08gUmFuZ2UifSwKKwl7QUNQSV9SU0RfMkJJVEZMQUcsIEFDUElfUlNEX09GRlNFVChhZGRyZXNzLmluZm8uaW8ucmFuZ2VfdHlwZSksCisJICJSYW5nZSBUeXBlIiwgYWNwaV9nYmxfcm5nX2RlY29kZX0sCisJe0FDUElfUlNEXzFCSVRGTEFHLCBBQ1BJX1JTRF9PRkZTRVQoYWRkcmVzcy5pbmZvLmlvLnRyYW5zbGF0aW9uKSwKKwkgIlRyYW5zbGF0aW9uIiwgYWNwaV9nYmxfdHRwX2RlY29kZX0sCisJe0FDUElfUlNEXzFCSVRGTEFHLCBBQ1BJX1JTRF9PRkZTRVQoYWRkcmVzcy5pbmZvLmlvLnRyYW5zbGF0aW9uX3R5cGUpLAorCSAiVHJhbnNsYXRpb24gVHlwZSIsIGFjcGlfZ2JsX3Ryc19kZWNvZGV9Cit9OworCisvKgorICogVGFibGUgdXNlZCB0byBkdW1wIF9QUlQgY29udGVudHMKKyAqLworc3RhdGljIHN0cnVjdCBhY3BpX3JzZHVtcF9pbmZvIGFjcGlfcnNfZHVtcF9wcnRbNV0gPSB7CisJe0FDUElfUlNEX1RJVExFLCBBQ1BJX1JTRF9UQUJMRV9TSVpFKGFjcGlfcnNfZHVtcF9wcnQpLCBOVUxMLCBOVUxMfSwKKwl7QUNQSV9SU0RfVUlOVDY0LCBBQ1BJX1BSVF9PRkZTRVQoYWRkcmVzcyksICJBZGRyZXNzIiwgTlVMTH0sCisJe0FDUElfUlNEX1VJTlQzMiwgQUNQSV9QUlRfT0ZGU0VUKHBpbiksICJQaW4iLCBOVUxMfSwKKwl7QUNQSV9SU0RfU1RSSU5HLCBBQ1BJX1BSVF9PRkZTRVQoc291cmNlWzBdKSwgIlNvdXJjZSIsIE5VTEx9LAorCXtBQ1BJX1JTRF9VSU5UMzIsIEFDUElfUFJUX09GRlNFVChzb3VyY2VfaW5kZXgpLCAiU291cmNlIEluZGV4IiwgTlVMTH0KK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfcnNfZHVtcF9kZXNjcmlwdG9yCisgKgorICogUEFSQU1FVEVSUzogIFJlc291cmNlCisgKgorICogUkVUVVJOOiAgICAgIE5vbmUKKyAqCisgKiBERVNDUklQVElPTjoKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZAorYWNwaV9yc19kdW1wX2Rlc2NyaXB0b3Iodm9pZCAqcmVzb3VyY2UsIHN0cnVjdCBhY3BpX3JzZHVtcF9pbmZvICp0YWJsZSkKK3sKKwl1OCAqdGFyZ2V0ID0gTlVMTDsKKwl1OCAqcHJldmlvdXNfdGFyZ2V0OworCWNoYXIgKm5hbWU7CisJdTggY291bnQ7CisKKwkvKiBGaXJzdCB0YWJsZSBlbnRyeSBtdXN0IGNvbnRhaW4gdGhlIHRhYmxlIGxlbmd0aCAoIyBvZiB0YWJsZSBlbnRyaWVzKSAqLworCisJY291bnQgPSB0YWJsZS0+b2Zmc2V0OworCisJd2hpbGUgKGNvdW50KSB7CisJCXByZXZpb3VzX3RhcmdldCA9IHRhcmdldDsKKwkJdGFyZ2V0ID0gQUNQSV9BRERfUFRSKHU4LCByZXNvdXJjZSwgdGFibGUtPm9mZnNldCk7CisJCW5hbWUgPSB0YWJsZS0+bmFtZTsKKworCQlzd2l0Y2ggKHRhYmxlLT5vcGNvZGUpIHsKKwkJY2FzZSBBQ1BJX1JTRF9USVRMRToKKwkJCS8qCisJCQkgKiBPcHRpb25hbCByZXNvdXJjZSB0aXRsZQorCQkJICovCisJCQlpZiAodGFibGUtPm5hbWUpIHsKKwkJCQlhY3BpX29zX3ByaW50ZigiJXMgUmVzb3VyY2VcbiIsIG5hbWUpOworCQkJfQorCQkJYnJlYWs7CisKKwkJCS8qIFN0cmluZ3MgKi8KKworCQljYXNlIEFDUElfUlNEX0xJVEVSQUw6CisJCQlhY3BpX3JzX291dF9zdHJpbmcobmFtZSwKKwkJCQkJICAgQUNQSV9DQVNUX1BUUihjaGFyLCB0YWJsZS0+cG9pbnRlcikpOworCQkJYnJlYWs7CisKKwkJY2FzZSBBQ1BJX1JTRF9TVFJJTkc6CisJCQlhY3BpX3JzX291dF9zdHJpbmcobmFtZSwgQUNQSV9DQVNUX1BUUihjaGFyLCB0YXJnZXQpKTsKKwkJCWJyZWFrOworCisJCQkvKiBEYXRhIGl0ZW1zLCA4LzE2LzMyLzY0IGJpdCAqLworCisJCWNhc2UgQUNQSV9SU0RfVUlOVDg6CisJCQlhY3BpX3JzX291dF9pbnRlZ2VyOChuYW1lLCBBQ1BJX0dFVDgodGFyZ2V0KSk7CisJCQlicmVhazsKKworCQljYXNlIEFDUElfUlNEX1VJTlQxNjoKKwkJCWFjcGlfcnNfb3V0X2ludGVnZXIxNihuYW1lLCBBQ1BJX0dFVDE2KHRhcmdldCkpOworCQkJYnJlYWs7CisKKwkJY2FzZSBBQ1BJX1JTRF9VSU5UMzI6CisJCQlhY3BpX3JzX291dF9pbnRlZ2VyMzIobmFtZSwgQUNQSV9HRVQzMih0YXJnZXQpKTsKKwkJCWJyZWFrOworCisJCWNhc2UgQUNQSV9SU0RfVUlOVDY0OgorCQkJYWNwaV9yc19vdXRfaW50ZWdlcjY0KG5hbWUsIEFDUElfR0VUNjQodGFyZ2V0KSk7CisJCQlicmVhazsKKworCQkJLyogRmxhZ3M6IDEtYml0IGFuZCAyLWJpdCBmbGFncyBzdXBwb3J0ZWQgKi8KKworCQljYXNlIEFDUElfUlNEXzFCSVRGTEFHOgorCQkJYWNwaV9yc19vdXRfc3RyaW5nKG5hbWUsIEFDUElfQ0FTVF9QVFIoY2hhciwKKwkJCQkJCQkgICAgICAgdGFibGUtPgorCQkJCQkJCSAgICAgICBwb2ludGVyWyp0YXJnZXQgJgorCQkJCQkJCQkgICAgICAgMHgwMV0pKTsKKwkJCWJyZWFrOworCisJCWNhc2UgQUNQSV9SU0RfMkJJVEZMQUc6CisJCQlhY3BpX3JzX291dF9zdHJpbmcobmFtZSwgQUNQSV9DQVNUX1BUUihjaGFyLAorCQkJCQkJCSAgICAgICB0YWJsZS0+CisJCQkJCQkJICAgICAgIHBvaW50ZXJbKnRhcmdldCAmCisJCQkJCQkJCSAgICAgICAweDAzXSkpOworCQkJYnJlYWs7CisKKwkJY2FzZSBBQ1BJX1JTRF9TSE9SVExJU1Q6CisJCQkvKgorCQkJICogU2hvcnQgYnl0ZSBsaXN0IChzaW5nbGUgbGluZSBvdXRwdXQpIGZvciBETUEgYW5kIElSUSByZXNvdXJjZXMKKwkJCSAqIE5vdGU6IFRoZSBsaXN0IGxlbmd0aCBpcyBvYnRhaW5lZCBmcm9tIHRoZSBwcmV2aW91cyB0YWJsZSBlbnRyeQorCQkJICovCisJCQlpZiAocHJldmlvdXNfdGFyZ2V0KSB7CisJCQkJYWNwaV9yc19vdXRfdGl0bGUobmFtZSk7CisJCQkJYWNwaV9yc19kdW1wX3Nob3J0X2J5dGVfbGlzdCgqcHJldmlvdXNfdGFyZ2V0LAorCQkJCQkJCSAgICAgdGFyZ2V0KTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgQUNQSV9SU0RfTE9OR0xJU1Q6CisJCQkvKgorCQkJICogTG9uZyBieXRlIGxpc3QgZm9yIFZlbmRvciByZXNvdXJjZSBkYXRhCisJCQkgKiBOb3RlOiBUaGUgbGlzdCBsZW5ndGggaXMgb2J0YWluZWQgZnJvbSB0aGUgcHJldmlvdXMgdGFibGUgZW50cnkKKwkJCSAqLworCQkJaWYgKHByZXZpb3VzX3RhcmdldCkgeworCQkJCWFjcGlfcnNfZHVtcF9ieXRlX2xpc3QoQUNQSV9HRVQxNgorCQkJCQkJICAgICAgIChwcmV2aW91c190YXJnZXQpLAorCQkJCQkJICAgICAgIHRhcmdldCk7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIEFDUElfUlNEX0RXT1JETElTVDoKKwkJCS8qCisJCQkgKiBEd29yZCBsaXN0IGZvciBFeHRlbmRlZCBJbnRlcnJ1cHQgcmVzb3VyY2VzCisJCQkgKiBOb3RlOiBUaGUgbGlzdCBsZW5ndGggaXMgb2J0YWluZWQgZnJvbSB0aGUgcHJldmlvdXMgdGFibGUgZW50cnkKKwkJCSAqLworCQkJaWYgKHByZXZpb3VzX3RhcmdldCkgeworCQkJCWFjcGlfcnNfZHVtcF9kd29yZF9saXN0KCpwcmV2aW91c190YXJnZXQsCisJCQkJCQkJQUNQSV9DQVNUX1BUUih1MzIsCisJCQkJCQkJCSAgICAgIHRhcmdldCkpOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBBQ1BJX1JTRF9BRERSRVNTOgorCQkJLyoKKwkJCSAqIENvbW1vbiBmbGFncyBmb3IgYWxsIEFkZHJlc3MgcmVzb3VyY2VzCisJCQkgKi8KKwkJCWFjcGlfcnNfZHVtcF9hZGRyZXNzX2NvbW1vbihBQ1BJX0NBU1RfUFRSCisJCQkJCQkgICAgKHVuaW9uIGFjcGlfcmVzb3VyY2VfZGF0YSwKKwkJCQkJCSAgICAgdGFyZ2V0KSk7CisJCQlicmVhazsKKworCQljYXNlIEFDUElfUlNEX1NPVVJDRToKKwkJCS8qCisJCQkgKiBPcHRpb25hbCByZXNvdXJjZV9zb3VyY2UgZm9yIEFkZHJlc3MgcmVzb3VyY2VzCisJCQkgKi8KKwkJCWFjcGlfcnNfZHVtcF9yZXNvdXJjZV9zb3VyY2UoQUNQSV9DQVNUX1BUUihzdHJ1Y3QKKwkJCQkJCQkJICAgYWNwaV9yZXNvdXJjZV9zb3VyY2UsCisJCQkJCQkJCSAgIHRhcmdldCkpOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWFjcGlfb3NfcHJpbnRmKCIqKioqIEludmFsaWQgdGFibGUgb3Bjb2RlIFslWF0gKioqKlxuIiwKKwkJCQkgICAgICAgdGFibGUtPm9wY29kZSk7CisJCQlyZXR1cm47CisJCX0KKworCQl0YWJsZSsrOworCQljb3VudC0tOworCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9yc19kdW1wX3Jlc291cmNlX3NvdXJjZQorICoKKyAqIFBBUkFNRVRFUlM6ICByZXNvdXJjZV9zb3VyY2UgICAgIC0gUG9pbnRlciB0byBhIFJlc291cmNlIFNvdXJjZSBzdHJ1Y3QKKyAqCisgKiBSRVRVUk46ICAgICAgTm9uZQorICoKKyAqIERFU0NSSVBUSU9OOiBDb21tb24gcm91dGluZSBmb3IgZHVtcGluZyB0aGUgb3B0aW9uYWwgcmVzb3VyY2Vfc291cmNlIGFuZCB0aGUKKyAqICAgICAgICAgICAgICBjb3JyZXNwb25kaW5nIHJlc291cmNlX3NvdXJjZV9pbmRleC4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZAorYWNwaV9yc19kdW1wX3Jlc291cmNlX3NvdXJjZShzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9zb3VyY2UgKnJlc291cmNlX3NvdXJjZSkKK3sKKwlBQ1BJX0ZVTkNUSU9OX0VOVFJZKCk7CisKKwlpZiAocmVzb3VyY2Vfc291cmNlLT5pbmRleCA9PSAweEZGKSB7CisJCXJldHVybjsKKwl9CisKKwlhY3BpX3JzX291dF9pbnRlZ2VyOCgiUmVzb3VyY2UgU291cmNlIEluZGV4IiwgcmVzb3VyY2Vfc291cmNlLT5pbmRleCk7CisKKwlhY3BpX3JzX291dF9zdHJpbmcoIlJlc291cmNlIFNvdXJjZSIsCisJCQkgICByZXNvdXJjZV9zb3VyY2UtPnN0cmluZ19wdHIgPworCQkJICAgcmVzb3VyY2Vfc291cmNlLT5zdHJpbmdfcHRyIDogIltOb3QgU3BlY2lmaWVkXSIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX3JzX2R1bXBfYWRkcmVzc19jb21tb24KKyAqCisgKiBQQVJBTUVURVJTOiAgUmVzb3VyY2UgICAgICAgIC0gUG9pbnRlciB0byBhbiBpbnRlcm5hbCByZXNvdXJjZSBkZXNjcmlwdG9yCisgKgorICogUkVUVVJOOiAgICAgIE5vbmUKKyAqCisgKiBERVNDUklQVElPTjogRHVtcCB0aGUgZmllbGRzIHRoYXQgYXJlIGNvbW1vbiB0byBhbGwgQWRkcmVzcyByZXNvdXJjZQorICogICAgICAgICAgICAgIGRlc2NyaXB0b3JzCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQgYWNwaV9yc19kdW1wX2FkZHJlc3NfY29tbW9uKHVuaW9uIGFjcGlfcmVzb3VyY2VfZGF0YSAqcmVzb3VyY2UpCit7CisJQUNQSV9GVU5DVElPTl9FTlRSWSgpOworCisJLyogRGVjb2RlIHRoZSB0eXBlLXNwZWNpZmljIGZsYWdzICovCisKKwlzd2l0Y2ggKHJlc291cmNlLT5hZGRyZXNzLnJlc291cmNlX3R5cGUpIHsKKwljYXNlIEFDUElfTUVNT1JZX1JBTkdFOgorCisJCWFjcGlfcnNfZHVtcF9kZXNjcmlwdG9yKHJlc291cmNlLCBhY3BpX3JzX2R1bXBfbWVtb3J5X2ZsYWdzKTsKKwkJYnJlYWs7CisKKwljYXNlIEFDUElfSU9fUkFOR0U6CisKKwkJYWNwaV9yc19kdW1wX2Rlc2NyaXB0b3IocmVzb3VyY2UsIGFjcGlfcnNfZHVtcF9pb19mbGFncyk7CisJCWJyZWFrOworCisJY2FzZSBBQ1BJX0JVU19OVU1CRVJfUkFOR0U6CisKKwkJYWNwaV9yc19vdXRfc3RyaW5nKCJSZXNvdXJjZSBUeXBlIiwgIkJ1cyBOdW1iZXIgUmFuZ2UiKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCisJCWFjcGlfcnNfb3V0X2ludGVnZXI4KCJSZXNvdXJjZSBUeXBlIiwKKwkJCQkgICAgICh1OCkgcmVzb3VyY2UtPmFkZHJlc3MucmVzb3VyY2VfdHlwZSk7CisJCWJyZWFrOworCX0KKworCS8qIERlY29kZSB0aGUgZ2VuZXJhbCBmbGFncyAqLworCisJYWNwaV9yc19kdW1wX2Rlc2NyaXB0b3IocmVzb3VyY2UsIGFjcGlfcnNfZHVtcF9nZW5lcmFsX2ZsYWdzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9yc19kdW1wX3Jlc291cmNlX2xpc3QKKyAqCisgKiBQQVJBTUVURVJTOiAgcmVzb3VyY2VfbGlzdCAgICAgICAtIFBvaW50ZXIgdG8gYSByZXNvdXJjZSBkZXNjcmlwdG9yIGxpc3QKKyAqCisgKiBSRVRVUk46ICAgICAgTm9uZQorICoKKyAqIERFU0NSSVBUSU9OOiBEaXNwYXRjaGVzIHRoZSBzdHJ1Y3R1cmUgdG8gdGhlIGNvcnJlY3QgZHVtcCByb3V0aW5lLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgYWNwaV9yc19kdW1wX3Jlc291cmNlX2xpc3Qoc3RydWN0IGFjcGlfcmVzb3VyY2UgKnJlc291cmNlX2xpc3QpCit7CisJdTMyIGNvdW50ID0gMDsKKwl1MzIgdHlwZTsKKworCUFDUElfRlVOQ1RJT05fRU5UUlkoKTsKKworCWlmICghKGFjcGlfZGJnX2xldmVsICYgQUNQSV9MVl9SRVNPVVJDRVMpCisJICAgIHx8ICEoX0NPTVBPTkVOVCAmIGFjcGlfZGJnX2xheWVyKSkgeworCQlyZXR1cm47CisJfQorCisJLyogV2FsayBsaXN0IGFuZCBkdW1wIGFsbCByZXNvdXJjZSBkZXNjcmlwdG9ycyAoRU5EX1RBRyB0ZXJtaW5hdGVzKSAqLworCisJZG8geworCQlhY3BpX29zX3ByaW50ZigiXG5bJTAyWF0gIiwgY291bnQpOworCQljb3VudCsrOworCisJCS8qIFZhbGlkYXRlIFR5cGUgYmVmb3JlIGRpc3BhdGNoICovCisKKwkJdHlwZSA9IHJlc291cmNlX2xpc3QtPnR5cGU7CisJCWlmICh0eXBlID4gQUNQSV9SRVNPVVJDRV9UWVBFX01BWCkgeworCQkJYWNwaV9vc19wcmludGYKKwkJCSAgICAoIkludmFsaWQgZGVzY3JpcHRvciB0eXBlICglWCkgaW4gcmVzb3VyY2UgbGlzdFxuIiwKKwkJCSAgICAgcmVzb3VyY2VfbGlzdC0+dHlwZSk7CisJCQlyZXR1cm47CisJCX0KKworCQkvKiBEdW1wIHRoZSByZXNvdXJjZSBkZXNjcmlwdG9yICovCisKKwkJYWNwaV9yc19kdW1wX2Rlc2NyaXB0b3IoJnJlc291cmNlX2xpc3QtPmRhdGEsCisJCQkJCWFjcGlfZ2JsX2R1bXBfcmVzb3VyY2VfZGlzcGF0Y2hbdHlwZV0pOworCisJCS8qIFBvaW50IHRvIHRoZSBuZXh0IHJlc291cmNlIHN0cnVjdHVyZSAqLworCisJCXJlc291cmNlX2xpc3QgPQorCQkgICAgQUNQSV9BRERfUFRSKHN0cnVjdCBhY3BpX3Jlc291cmNlLCByZXNvdXJjZV9saXN0LAorCQkJCSByZXNvdXJjZV9saXN0LT5sZW5ndGgpOworCisJCS8qIEV4aXQgd2hlbiBFTkRfVEFHIGRlc2NyaXB0b3IgaXMgcmVhY2hlZCAqLworCisJfSB3aGlsZSAodHlwZSAhPSBBQ1BJX1JFU09VUkNFX1RZUEVfRU5EX1RBRyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfcnNfZHVtcF9pcnFfbGlzdAorICoKKyAqIFBBUkFNRVRFUlM6ICByb3V0ZV90YWJsZSAgICAgLSBQb2ludGVyIHRvIHRoZSByb3V0aW5nIHRhYmxlIHRvIGR1bXAuCisgKgorICogUkVUVVJOOiAgICAgIE5vbmUKKyAqCisgKiBERVNDUklQVElPTjogUHJpbnQgSVJRIHJvdXRpbmcgdGFibGUKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIGFjcGlfcnNfZHVtcF9pcnFfbGlzdCh1OCAqIHJvdXRlX3RhYmxlKQoreworCXN0cnVjdCBhY3BpX3BjaV9yb3V0aW5nX3RhYmxlICpwcnRfZWxlbWVudDsKKwl1OCBjb3VudDsKKworCUFDUElfRlVOQ1RJT05fRU5UUlkoKTsKKworCWlmICghKGFjcGlfZGJnX2xldmVsICYgQUNQSV9MVl9SRVNPVVJDRVMpCisJICAgIHx8ICEoX0NPTVBPTkVOVCAmIGFjcGlfZGJnX2xheWVyKSkgeworCQlyZXR1cm47CisJfQorCisJcHJ0X2VsZW1lbnQgPSBBQ1BJX0NBU1RfUFRSKHN0cnVjdCBhY3BpX3BjaV9yb3V0aW5nX3RhYmxlLCByb3V0ZV90YWJsZSk7CisKKwkvKiBEdW1wIGFsbCB0YWJsZSBlbGVtZW50cywgRXhpdCBvbiB6ZXJvIGxlbmd0aCBlbGVtZW50ICovCisKKwlmb3IgKGNvdW50ID0gMDsgcHJ0X2VsZW1lbnQtPmxlbmd0aDsgY291bnQrKykgeworCQlhY3BpX29zX3ByaW50ZigiXG5bJTAyWF0gUENJIElSUSBSb3V0aW5nIFRhYmxlIFBhY2thZ2VcbiIsCisJCQkgICAgICAgY291bnQpOworCQlhY3BpX3JzX2R1bXBfZGVzY3JpcHRvcihwcnRfZWxlbWVudCwgYWNwaV9yc19kdW1wX3BydCk7CisKKwkJcHJ0X2VsZW1lbnQgPSBBQ1BJX0FERF9QVFIoc3RydWN0IGFjcGlfcGNpX3JvdXRpbmdfdGFibGUsCisJCQkJCSAgIHBydF9lbGVtZW50LCBwcnRfZWxlbWVudC0+bGVuZ3RoKTsKKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfcnNfb3V0KgorICoKKyAqIFBBUkFNRVRFUlM6ICBUaXRsZSAgICAgICAtIE5hbWUgb2YgdGhlIHJlc291cmNlIGZpZWxkCisgKiAgICAgICAgICAgICAgVmFsdWUgICAgICAgLSBWYWx1ZSBvZiB0aGUgcmVzb3VyY2UgZmllbGQKKyAqCisgKiBSRVRVUk46ICAgICAgTm9uZQorICoKKyAqIERFU0NSSVBUSU9OOiBNaXNjZWxsYW5lb3VzIGhlbHBlciBmdW5jdGlvbnMgdG8gY29uc2lzdGVudGx5IGZvcm1hdCB0aGUKKyAqICAgICAgICAgICAgICBvdXRwdXQgb2YgdGhlIHJlc291cmNlIGR1bXAgcm91dGluZXMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZCBhY3BpX3JzX291dF9zdHJpbmcoY2hhciAqdGl0bGUsIGNoYXIgKnZhbHVlKQoreworCWFjcGlfb3NfcHJpbnRmKCIlMjdzIDogJXMiLCB0aXRsZSwgdmFsdWUpOworCWlmICghKnZhbHVlKSB7CisJCWFjcGlfb3NfcHJpbnRmKCJbTlVMTCBOQU1FU1RSSU5HXSIpOworCX0KKwlhY3BpX29zX3ByaW50ZigiXG4iKTsKK30KKworc3RhdGljIHZvaWQgYWNwaV9yc19vdXRfaW50ZWdlcjgoY2hhciAqdGl0bGUsIHU4IHZhbHVlKQoreworCWFjcGlfb3NfcHJpbnRmKCIlMjdzIDogJTIuMlhcbiIsIHRpdGxlLCB2YWx1ZSk7Cit9CisKK3N0YXRpYyB2b2lkIGFjcGlfcnNfb3V0X2ludGVnZXIxNihjaGFyICp0aXRsZSwgdTE2IHZhbHVlKQoreworCWFjcGlfb3NfcHJpbnRmKCIlMjdzIDogJTQuNFhcbiIsIHRpdGxlLCB2YWx1ZSk7Cit9CisKK3N0YXRpYyB2b2lkIGFjcGlfcnNfb3V0X2ludGVnZXIzMihjaGFyICp0aXRsZSwgdTMyIHZhbHVlKQoreworCWFjcGlfb3NfcHJpbnRmKCIlMjdzIDogJTguOFhcbiIsIHRpdGxlLCB2YWx1ZSk7Cit9CisKK3N0YXRpYyB2b2lkIGFjcGlfcnNfb3V0X2ludGVnZXI2NChjaGFyICp0aXRsZSwgdTY0IHZhbHVlKQoreworCWFjcGlfb3NfcHJpbnRmKCIlMjdzIDogJTguOFglOC44WFxuIiwgdGl0bGUsIEFDUElfRk9STUFUX1VJTlQ2NCh2YWx1ZSkpOworfQorCitzdGF0aWMgdm9pZCBhY3BpX3JzX291dF90aXRsZShjaGFyICp0aXRsZSkKK3sKKwlhY3BpX29zX3ByaW50ZigiJTI3cyA6ICIsIHRpdGxlKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9yc19kdW1wKkxpc3QKKyAqCisgKiBQQVJBTUVURVJTOiAgTGVuZ3RoICAgICAgLSBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGxpc3QKKyAqICAgICAgICAgICAgICBEYXRhICAgICAgICAtIFN0YXJ0IG9mIHRoZSBsaXN0CisgKgorICogUkVUVVJOOiAgICAgIE5vbmUKKyAqCisgKiBERVNDUklQVElPTjogTWlzY2VsbGFuZW91cyBmdW5jdGlvbnMgdG8gZHVtcCBsaXN0cyBvZiByYXcgZGF0YQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkIGFjcGlfcnNfZHVtcF9ieXRlX2xpc3QodTE2IGxlbmd0aCwgdTggKiBkYXRhKQoreworCXU4IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJYWNwaV9vc19wcmludGYoIiUyNXMlMi4yWCA6ICUyLjJYXG4iLCAiQnl0ZSIsIGksIGRhdGFbaV0pOworCX0KK30KKworc3RhdGljIHZvaWQgYWNwaV9yc19kdW1wX3Nob3J0X2J5dGVfbGlzdCh1OCBsZW5ndGgsIHU4ICogZGF0YSkKK3sKKwl1OCBpOworCisJZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCWFjcGlfb3NfcHJpbnRmKCIlWCAiLCBkYXRhW2ldKTsKKwl9CisJYWNwaV9vc19wcmludGYoIlxuIik7Cit9CisKK3N0YXRpYyB2b2lkIGFjcGlfcnNfZHVtcF9kd29yZF9saXN0KHU4IGxlbmd0aCwgdTMyICogZGF0YSkKK3sKKwl1OCBpOworCisJZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCWFjcGlfb3NfcHJpbnRmKCIlMjVzJTIuMlggOiAlOC44WFxuIiwgIkR3b3JkIiwgaSwgZGF0YVtpXSk7CisJfQorfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvcnNpbmZvLmMgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL3JzaW5mby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3YjI1ZmQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL3JzaW5mby5jCkBAIC0wLDAgKzEsMjA2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIE1vZHVsZSBOYW1lOiByc2luZm8gLSBEaXNwYXRjaCBhbmQgSW5mbyB0YWJsZXMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwOCwgSW50ZWwgQ29ycC4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKKyAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIGF0IG1pbmltdW0gYSBkaXNjbGFpbWVyCisgKiAgICBzdWJzdGFudGlhbGx5IHNpbWlsYXIgdG8gdGhlICJOTyBXQVJSQU5UWSIgZGlzY2xhaW1lciBiZWxvdworICogICAgKCJEaXNjbGFpbWVyIikgYW5kIGFueSByZWRpc3RyaWJ1dGlvbiBtdXN0IGJlIGNvbmRpdGlvbmVkIHVwb24KKyAqICAgIGluY2x1ZGluZyBhIHN1YnN0YW50aWFsbHkgc2ltaWxhciBEaXNjbGFpbWVyIHJlcXVpcmVtZW50IGZvciBmdXJ0aGVyCisgKiAgICBiaW5hcnkgcmVkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMKKyAqICAgIG9mIGFueSBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogTk8gV0FSUkFOVFkKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HCisgKiBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KKyAqLworCisjaW5jbHVkZSA8YWNwaS9hY3BpLmg+CisjaW5jbHVkZSAiYWNjb21tb24uaCIKKyNpbmNsdWRlICJhY3Jlc3JjLmgiCisKKyNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX1JFU09VUkNFUworQUNQSV9NT0RVTEVfTkFNRSgicnNpbmZvIikKKworLyoKKyAqIFJlc291cmNlIGRpc3BhdGNoIGFuZCBpbmZvcm1hdGlvbiB0YWJsZXMuIEFueSBuZXcgcmVzb3VyY2UgdHlwZXMgKGVpdGhlcgorICogTGFyZ2Ugb3IgU21hbGwpIG11c3QgYmUgcmVmbGVjdGVkIGluIGVhY2ggb2YgdGhlc2UgdGFibGVzLCBzbyB0aGV5IGFyZSBoZXJlCisgKiBpbiBvbmUgcGxhY2UuCisgKgorICogVGhlIHRhYmxlcyBmb3IgTGFyZ2UgZGVzY3JpcHRvcnMgYXJlIGluZGV4ZWQgYnkgYml0cyA2OjAgb2YgdGhlIEFNTAorICogZGVzY3JpcHRvciB0eXBlIGJ5dGUuIFRoZSB0YWJsZXMgZm9yIFNtYWxsIGRlc2NyaXB0b3JzIGFyZSBpbmRleGVkIGJ5CisgKiBiaXRzIDY6MyBvZiB0aGUgZGVzY3JpcHRvciBieXRlLiBUaGUgdGFibGVzIGZvciBpbnRlcm5hbCByZXNvdXJjZQorICogZGVzY3JpcHRvcnMgYXJlIGluZGV4ZWQgYnkgdGhlIGFjcGlfcmVzb3VyY2VfdHlwZSBmaWVsZC4KKyAqLworLyogRGlzcGF0Y2ggdGFibGUgZm9yIHJlc291cmNlLXRvLUFNTCAoU2V0IFJlc291cmNlKSBjb252ZXJzaW9uIGZ1bmN0aW9ucyAqLworc3RydWN0IGFjcGlfcnNjb252ZXJ0X2luZm8gKmFjcGlfZ2JsX3NldF9yZXNvdXJjZV9kaXNwYXRjaFtdID0geworCWFjcGlfcnNfc2V0X2lycSwJLyogMHgwMCwgQUNQSV9SRVNPVVJDRV9UWVBFX0lSUSAqLworCWFjcGlfcnNfY29udmVydF9kbWEsCS8qIDB4MDEsIEFDUElfUkVTT1VSQ0VfVFlQRV9ETUEgKi8KKwlhY3BpX3JzX3NldF9zdGFydF9kcGYsCS8qIDB4MDIsIEFDUElfUkVTT1VSQ0VfVFlQRV9TVEFSVF9ERVBFTkRFTlQgKi8KKwlhY3BpX3JzX2NvbnZlcnRfZW5kX2RwZiwJLyogMHgwMywgQUNQSV9SRVNPVVJDRV9UWVBFX0VORF9ERVBFTkRFTlQgKi8KKwlhY3BpX3JzX2NvbnZlcnRfaW8sCS8qIDB4MDQsIEFDUElfUkVTT1VSQ0VfVFlQRV9JTyAqLworCWFjcGlfcnNfY29udmVydF9maXhlZF9pbywJLyogMHgwNSwgQUNQSV9SRVNPVVJDRV9UWVBFX0ZJWEVEX0lPICovCisJYWNwaV9yc19zZXRfdmVuZG9yLAkvKiAweDA2LCBBQ1BJX1JFU09VUkNFX1RZUEVfVkVORE9SICovCisJYWNwaV9yc19jb252ZXJ0X2VuZF90YWcsCS8qIDB4MDcsIEFDUElfUkVTT1VSQ0VfVFlQRV9FTkRfVEFHICovCisJYWNwaV9yc19jb252ZXJ0X21lbW9yeTI0LAkvKiAweDA4LCBBQ1BJX1JFU09VUkNFX1RZUEVfTUVNT1JZMjQgKi8KKwlhY3BpX3JzX2NvbnZlcnRfbWVtb3J5MzIsCS8qIDB4MDksIEFDUElfUkVTT1VSQ0VfVFlQRV9NRU1PUlkzMiAqLworCWFjcGlfcnNfY29udmVydF9maXhlZF9tZW1vcnkzMiwJLyogMHgwQSwgQUNQSV9SRVNPVVJDRV9UWVBFX0ZJWEVEX01FTU9SWTMyICovCisJYWNwaV9yc19jb252ZXJ0X2FkZHJlc3MxNiwJLyogMHgwQiwgQUNQSV9SRVNPVVJDRV9UWVBFX0FERFJFU1MxNiAqLworCWFjcGlfcnNfY29udmVydF9hZGRyZXNzMzIsCS8qIDB4MEMsIEFDUElfUkVTT1VSQ0VfVFlQRV9BRERSRVNTMzIgKi8KKwlhY3BpX3JzX2NvbnZlcnRfYWRkcmVzczY0LAkvKiAweDBELCBBQ1BJX1JFU09VUkNFX1RZUEVfQUREUkVTUzY0ICovCisJYWNwaV9yc19jb252ZXJ0X2V4dF9hZGRyZXNzNjQsCS8qIDB4MEUsIEFDUElfUkVTT1VSQ0VfVFlQRV9FWFRFTkRFRF9BRERSRVNTNjQgKi8KKwlhY3BpX3JzX2NvbnZlcnRfZXh0X2lycSwJLyogMHgwRiwgQUNQSV9SRVNPVVJDRV9UWVBFX0VYVEVOREVEX0lSUSAqLworCWFjcGlfcnNfY29udmVydF9nZW5lcmljX3JlZwkvKiAweDEwLCBBQ1BJX1JFU09VUkNFX1RZUEVfR0VORVJJQ19SRUdJU1RFUiAqLworfTsKKworLyogRGlzcGF0Y2ggdGFibGVzIGZvciBBTUwtdG8tcmVzb3VyY2UgKEdldCBSZXNvdXJjZSkgY29udmVyc2lvbiBmdW5jdGlvbnMgKi8KKworc3RydWN0IGFjcGlfcnNjb252ZXJ0X2luZm8gKmFjcGlfZ2JsX2dldF9yZXNvdXJjZV9kaXNwYXRjaFtdID0geworCS8qIFNtYWxsIGRlc2NyaXB0b3JzICovCisKKwlOVUxMLAkJCS8qIDB4MDAsIFJlc2VydmVkICovCisJTlVMTCwJCQkvKiAweDAxLCBSZXNlcnZlZCAqLworCU5VTEwsCQkJLyogMHgwMiwgUmVzZXJ2ZWQgKi8KKwlOVUxMLAkJCS8qIDB4MDMsIFJlc2VydmVkICovCisJYWNwaV9yc19nZXRfaXJxLAkvKiAweDA0LCBBQ1BJX1JFU09VUkNFX05BTUVfSVJRICovCisJYWNwaV9yc19jb252ZXJ0X2RtYSwJLyogMHgwNSwgQUNQSV9SRVNPVVJDRV9OQU1FX0RNQSAqLworCWFjcGlfcnNfZ2V0X3N0YXJ0X2RwZiwJLyogMHgwNiwgQUNQSV9SRVNPVVJDRV9OQU1FX1NUQVJUX0RFUEVOREVOVCAqLworCWFjcGlfcnNfY29udmVydF9lbmRfZHBmLAkvKiAweDA3LCBBQ1BJX1JFU09VUkNFX05BTUVfRU5EX0RFUEVOREVOVCAqLworCWFjcGlfcnNfY29udmVydF9pbywJLyogMHgwOCwgQUNQSV9SRVNPVVJDRV9OQU1FX0lPICovCisJYWNwaV9yc19jb252ZXJ0X2ZpeGVkX2lvLAkvKiAweDA5LCBBQ1BJX1JFU09VUkNFX05BTUVfRklYRURfSU8gKi8KKwlOVUxMLAkJCS8qIDB4MEEsIFJlc2VydmVkICovCisJTlVMTCwJCQkvKiAweDBCLCBSZXNlcnZlZCAqLworCU5VTEwsCQkJLyogMHgwQywgUmVzZXJ2ZWQgKi8KKwlOVUxMLAkJCS8qIDB4MEQsIFJlc2VydmVkICovCisJYWNwaV9yc19nZXRfdmVuZG9yX3NtYWxsLAkvKiAweDBFLCBBQ1BJX1JFU09VUkNFX05BTUVfVkVORE9SX1NNQUxMICovCisJYWNwaV9yc19jb252ZXJ0X2VuZF90YWcsCS8qIDB4MEYsIEFDUElfUkVTT1VSQ0VfTkFNRV9FTkRfVEFHICovCisKKwkvKiBMYXJnZSBkZXNjcmlwdG9ycyAqLworCisJTlVMTCwJCQkvKiAweDAwLCBSZXNlcnZlZCAqLworCWFjcGlfcnNfY29udmVydF9tZW1vcnkyNCwJLyogMHgwMSwgQUNQSV9SRVNPVVJDRV9OQU1FX01FTU9SWTI0ICovCisJYWNwaV9yc19jb252ZXJ0X2dlbmVyaWNfcmVnLAkvKiAweDAyLCBBQ1BJX1JFU09VUkNFX05BTUVfR0VORVJJQ19SRUdJU1RFUiAqLworCU5VTEwsCQkJLyogMHgwMywgUmVzZXJ2ZWQgKi8KKwlhY3BpX3JzX2dldF92ZW5kb3JfbGFyZ2UsCS8qIDB4MDQsIEFDUElfUkVTT1VSQ0VfTkFNRV9WRU5ET1JfTEFSR0UgKi8KKwlhY3BpX3JzX2NvbnZlcnRfbWVtb3J5MzIsCS8qIDB4MDUsIEFDUElfUkVTT1VSQ0VfTkFNRV9NRU1PUlkzMiAqLworCWFjcGlfcnNfY29udmVydF9maXhlZF9tZW1vcnkzMiwJLyogMHgwNiwgQUNQSV9SRVNPVVJDRV9OQU1FX0ZJWEVEX01FTU9SWTMyICovCisJYWNwaV9yc19jb252ZXJ0X2FkZHJlc3MzMiwJLyogMHgwNywgQUNQSV9SRVNPVVJDRV9OQU1FX0FERFJFU1MzMiAqLworCWFjcGlfcnNfY29udmVydF9hZGRyZXNzMTYsCS8qIDB4MDgsIEFDUElfUkVTT1VSQ0VfTkFNRV9BRERSRVNTMTYgKi8KKwlhY3BpX3JzX2NvbnZlcnRfZXh0X2lycSwJLyogMHgwOSwgQUNQSV9SRVNPVVJDRV9OQU1FX0VYVEVOREVEX0lSUSAqLworCWFjcGlfcnNfY29udmVydF9hZGRyZXNzNjQsCS8qIDB4MEEsIEFDUElfUkVTT1VSQ0VfTkFNRV9BRERSRVNTNjQgKi8KKwlhY3BpX3JzX2NvbnZlcnRfZXh0X2FkZHJlc3M2NAkvKiAweDBCLCBBQ1BJX1JFU09VUkNFX05BTUVfRVhURU5ERURfQUREUkVTUzY0ICovCit9OworCisjaWZkZWYgQUNQSV9GVVRVUkVfVVNBR0UKKyNpZiBkZWZpbmVkKEFDUElfREVCVUdfT1VUUFVUKSB8fCBkZWZpbmVkKEFDUElfREVCVUdHRVIpCisKKy8qIERpc3BhdGNoIHRhYmxlIGZvciByZXNvdXJjZSBkdW1wIGZ1bmN0aW9ucyAqLworCitzdHJ1Y3QgYWNwaV9yc2R1bXBfaW5mbyAqYWNwaV9nYmxfZHVtcF9yZXNvdXJjZV9kaXNwYXRjaFtdID0geworCWFjcGlfcnNfZHVtcF9pcnEsCS8qIEFDUElfUkVTT1VSQ0VfVFlQRV9JUlEgKi8KKwlhY3BpX3JzX2R1bXBfZG1hLAkvKiBBQ1BJX1JFU09VUkNFX1RZUEVfRE1BICovCisJYWNwaV9yc19kdW1wX3N0YXJ0X2RwZiwJLyogQUNQSV9SRVNPVVJDRV9UWVBFX1NUQVJUX0RFUEVOREVOVCAqLworCWFjcGlfcnNfZHVtcF9lbmRfZHBmLAkvKiBBQ1BJX1JFU09VUkNFX1RZUEVfRU5EX0RFUEVOREVOVCAqLworCWFjcGlfcnNfZHVtcF9pbywJLyogQUNQSV9SRVNPVVJDRV9UWVBFX0lPICovCisJYWNwaV9yc19kdW1wX2ZpeGVkX2lvLAkvKiBBQ1BJX1JFU09VUkNFX1RZUEVfRklYRURfSU8gKi8KKwlhY3BpX3JzX2R1bXBfdmVuZG9yLAkvKiBBQ1BJX1JFU09VUkNFX1RZUEVfVkVORE9SICovCisJYWNwaV9yc19kdW1wX2VuZF90YWcsCS8qIEFDUElfUkVTT1VSQ0VfVFlQRV9FTkRfVEFHICovCisJYWNwaV9yc19kdW1wX21lbW9yeTI0LAkvKiBBQ1BJX1JFU09VUkNFX1RZUEVfTUVNT1JZMjQgKi8KKwlhY3BpX3JzX2R1bXBfbWVtb3J5MzIsCS8qIEFDUElfUkVTT1VSQ0VfVFlQRV9NRU1PUlkzMiAqLworCWFjcGlfcnNfZHVtcF9maXhlZF9tZW1vcnkzMiwJLyogQUNQSV9SRVNPVVJDRV9UWVBFX0ZJWEVEX01FTU9SWTMyICovCisJYWNwaV9yc19kdW1wX2FkZHJlc3MxNiwJLyogQUNQSV9SRVNPVVJDRV9UWVBFX0FERFJFU1MxNiAqLworCWFjcGlfcnNfZHVtcF9hZGRyZXNzMzIsCS8qIEFDUElfUkVTT1VSQ0VfVFlQRV9BRERSRVNTMzIgKi8KKwlhY3BpX3JzX2R1bXBfYWRkcmVzczY0LAkvKiBBQ1BJX1JFU09VUkNFX1RZUEVfQUREUkVTUzY0ICovCisJYWNwaV9yc19kdW1wX2V4dF9hZGRyZXNzNjQsCS8qIEFDUElfUkVTT1VSQ0VfVFlQRV9FWFRFTkRFRF9BRERSRVNTNjQgKi8KKwlhY3BpX3JzX2R1bXBfZXh0X2lycSwJLyogQUNQSV9SRVNPVVJDRV9UWVBFX0VYVEVOREVEX0lSUSAqLworCWFjcGlfcnNfZHVtcF9nZW5lcmljX3JlZywJLyogQUNQSV9SRVNPVVJDRV9UWVBFX0dFTkVSSUNfUkVHSVNURVIgKi8KK307CisjZW5kaWYKKworI2VuZGlmCQkJCS8qIEFDUElfRlVUVVJFX1VTQUdFICovCisvKgorICogQmFzZSBzaXplcyBmb3IgZXh0ZXJuYWwgQU1MIHJlc291cmNlIGRlc2NyaXB0b3JzLCBpbmRleGVkIGJ5IGludGVybmFsIHR5cGUuCisgKiBJbmNsdWRlcyBzaXplIG9mIHRoZSBkZXNjcmlwdG9yIGhlYWRlciAoMSBieXRlIGZvciBzbWFsbCBkZXNjcmlwdG9ycywKKyAqIDMgYnl0ZXMgZm9yIGxhcmdlIGRlc2NyaXB0b3JzKQorICovCitjb25zdCB1OCBhY3BpX2dibF9hbWxfcmVzb3VyY2Vfc2l6ZXNbXSA9IHsKKwlzaXplb2Yoc3RydWN0IGFtbF9yZXNvdXJjZV9pcnEpLAkvKiBBQ1BJX1JFU09VUkNFX1RZUEVfSVJRIChvcHRpb25hbCBCeXRlIDMgYWx3YXlzIGNyZWF0ZWQpICovCisJc2l6ZW9mKHN0cnVjdCBhbWxfcmVzb3VyY2VfZG1hKSwJLyogQUNQSV9SRVNPVVJDRV9UWVBFX0RNQSAqLworCXNpemVvZihzdHJ1Y3QgYW1sX3Jlc291cmNlX3N0YXJ0X2RlcGVuZGVudCksCS8qIEFDUElfUkVTT1VSQ0VfVFlQRV9TVEFSVF9ERVBFTkRFTlQgKG9wdGlvbmFsIEJ5dGUgMSBhbHdheXMgY3JlYXRlZCkgKi8KKwlzaXplb2Yoc3RydWN0IGFtbF9yZXNvdXJjZV9lbmRfZGVwZW5kZW50KSwJLyogQUNQSV9SRVNPVVJDRV9UWVBFX0VORF9ERVBFTkRFTlQgKi8KKwlzaXplb2Yoc3RydWN0IGFtbF9yZXNvdXJjZV9pbyksCS8qIEFDUElfUkVTT1VSQ0VfVFlQRV9JTyAqLworCXNpemVvZihzdHJ1Y3QgYW1sX3Jlc291cmNlX2ZpeGVkX2lvKSwJLyogQUNQSV9SRVNPVVJDRV9UWVBFX0ZJWEVEX0lPICovCisJc2l6ZW9mKHN0cnVjdCBhbWxfcmVzb3VyY2VfdmVuZG9yX3NtYWxsKSwJLyogQUNQSV9SRVNPVVJDRV9UWVBFX1ZFTkRPUiAqLworCXNpemVvZihzdHJ1Y3QgYW1sX3Jlc291cmNlX2VuZF90YWcpLAkvKiBBQ1BJX1JFU09VUkNFX1RZUEVfRU5EX1RBRyAqLworCXNpemVvZihzdHJ1Y3QgYW1sX3Jlc291cmNlX21lbW9yeTI0KSwJLyogQUNQSV9SRVNPVVJDRV9UWVBFX01FTU9SWTI0ICovCisJc2l6ZW9mKHN0cnVjdCBhbWxfcmVzb3VyY2VfbWVtb3J5MzIpLAkvKiBBQ1BJX1JFU09VUkNFX1RZUEVfTUVNT1JZMzIgKi8KKwlzaXplb2Yoc3RydWN0IGFtbF9yZXNvdXJjZV9maXhlZF9tZW1vcnkzMiksCS8qIEFDUElfUkVTT1VSQ0VfVFlQRV9GSVhFRF9NRU1PUlkzMiAqLworCXNpemVvZihzdHJ1Y3QgYW1sX3Jlc291cmNlX2FkZHJlc3MxNiksCS8qIEFDUElfUkVTT1VSQ0VfVFlQRV9BRERSRVNTMTYgKi8KKwlzaXplb2Yoc3RydWN0IGFtbF9yZXNvdXJjZV9hZGRyZXNzMzIpLAkvKiBBQ1BJX1JFU09VUkNFX1RZUEVfQUREUkVTUzMyICovCisJc2l6ZW9mKHN0cnVjdCBhbWxfcmVzb3VyY2VfYWRkcmVzczY0KSwJLyogQUNQSV9SRVNPVVJDRV9UWVBFX0FERFJFU1M2NCAqLworCXNpemVvZihzdHJ1Y3QgYW1sX3Jlc291cmNlX2V4dGVuZGVkX2FkZHJlc3M2NCksCS8qQUNQSV9SRVNPVVJDRV9UWVBFX0VYVEVOREVEX0FERFJFU1M2NCAqLworCXNpemVvZihzdHJ1Y3QgYW1sX3Jlc291cmNlX2V4dGVuZGVkX2lycSksCS8qIEFDUElfUkVTT1VSQ0VfVFlQRV9FWFRFTkRFRF9JUlEgKi8KKwlzaXplb2Yoc3RydWN0IGFtbF9yZXNvdXJjZV9nZW5lcmljX3JlZ2lzdGVyKQkvKiBBQ1BJX1JFU09VUkNFX1RZUEVfR0VORVJJQ19SRUdJU1RFUiAqLworfTsKKworY29uc3QgdTggYWNwaV9nYmxfcmVzb3VyY2Vfc3RydWN0X3NpemVzW10gPSB7CisJLyogU21hbGwgZGVzY3JpcHRvcnMgKi8KKworCTAsCisJMCwKKwkwLAorCTAsCisJQUNQSV9SU19TSVpFKHN0cnVjdCBhY3BpX3Jlc291cmNlX2lycSksCisJQUNQSV9SU19TSVpFKHN0cnVjdCBhY3BpX3Jlc291cmNlX2RtYSksCisJQUNQSV9SU19TSVpFKHN0cnVjdCBhY3BpX3Jlc291cmNlX3N0YXJ0X2RlcGVuZGVudCksCisJQUNQSV9SU19TSVpFX01JTiwKKwlBQ1BJX1JTX1NJWkUoc3RydWN0IGFjcGlfcmVzb3VyY2VfaW8pLAorCUFDUElfUlNfU0laRShzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9maXhlZF9pbyksCisJMCwKKwkwLAorCTAsCisJMCwKKwlBQ1BJX1JTX1NJWkUoc3RydWN0IGFjcGlfcmVzb3VyY2VfdmVuZG9yKSwKKwlBQ1BJX1JTX1NJWkVfTUlOLAorCisJLyogTGFyZ2UgZGVzY3JpcHRvcnMgKi8KKworCTAsCisJQUNQSV9SU19TSVpFKHN0cnVjdCBhY3BpX3Jlc291cmNlX21lbW9yeTI0KSwKKwlBQ1BJX1JTX1NJWkUoc3RydWN0IGFjcGlfcmVzb3VyY2VfZ2VuZXJpY19yZWdpc3RlciksCisJMCwKKwlBQ1BJX1JTX1NJWkUoc3RydWN0IGFjcGlfcmVzb3VyY2VfdmVuZG9yKSwKKwlBQ1BJX1JTX1NJWkUoc3RydWN0IGFjcGlfcmVzb3VyY2VfbWVtb3J5MzIpLAorCUFDUElfUlNfU0laRShzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9maXhlZF9tZW1vcnkzMiksCisJQUNQSV9SU19TSVpFKHN0cnVjdCBhY3BpX3Jlc291cmNlX2FkZHJlc3MzMiksCisJQUNQSV9SU19TSVpFKHN0cnVjdCBhY3BpX3Jlc291cmNlX2FkZHJlc3MxNiksCisJQUNQSV9SU19TSVpFKHN0cnVjdCBhY3BpX3Jlc291cmNlX2V4dGVuZGVkX2lycSksCisJQUNQSV9SU19TSVpFKHN0cnVjdCBhY3BpX3Jlc291cmNlX2FkZHJlc3M2NCksCisJQUNQSV9SU19TSVpFKHN0cnVjdCBhY3BpX3Jlc291cmNlX2V4dGVuZGVkX2FkZHJlc3M2NCkKK307CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL3JzaW8uYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvcnNpby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1YTQ5YWEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL3JzaW8uYwpAQCAtMCwwICsxLDI5MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBNb2R1bGUgTmFtZTogcnNpbyAtIElPIGFuZCBETUEgcmVzb3VyY2UgZGVzY3JpcHRvcnMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwOCwgSW50ZWwgQ29ycC4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKKyAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIGF0IG1pbmltdW0gYSBkaXNjbGFpbWVyCisgKiAgICBzdWJzdGFudGlhbGx5IHNpbWlsYXIgdG8gdGhlICJOTyBXQVJSQU5UWSIgZGlzY2xhaW1lciBiZWxvdworICogICAgKCJEaXNjbGFpbWVyIikgYW5kIGFueSByZWRpc3RyaWJ1dGlvbiBtdXN0IGJlIGNvbmRpdGlvbmVkIHVwb24KKyAqICAgIGluY2x1ZGluZyBhIHN1YnN0YW50aWFsbHkgc2ltaWxhciBEaXNjbGFpbWVyIHJlcXVpcmVtZW50IGZvciBmdXJ0aGVyCisgKiAgICBiaW5hcnkgcmVkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMKKyAqICAgIG9mIGFueSBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogTk8gV0FSUkFOVFkKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HCisgKiBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KKyAqLworCisjaW5jbHVkZSA8YWNwaS9hY3BpLmg+CisjaW5jbHVkZSAiYWNjb21tb24uaCIKKyNpbmNsdWRlICJhY3Jlc3JjLmgiCisKKyNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX1JFU09VUkNFUworQUNQSV9NT0RVTEVfTkFNRSgicnNpbyIpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogYWNwaV9yc19jb252ZXJ0X2lvCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0cnVjdCBhY3BpX3JzY29udmVydF9pbmZvIGFjcGlfcnNfY29udmVydF9pb1s1XSA9IHsKKwl7QUNQSV9SU0NfSU5JVEdFVCwgQUNQSV9SRVNPVVJDRV9UWVBFX0lPLAorCSBBQ1BJX1JTX1NJWkUoc3RydWN0IGFjcGlfcmVzb3VyY2VfaW8pLAorCSBBQ1BJX1JTQ19UQUJMRV9TSVpFKGFjcGlfcnNfY29udmVydF9pbyl9LAorCisJe0FDUElfUlNDX0lOSVRTRVQsIEFDUElfUkVTT1VSQ0VfTkFNRV9JTywKKwkgc2l6ZW9mKHN0cnVjdCBhbWxfcmVzb3VyY2VfaW8pLAorCSAwfSwKKworCS8qIERlY29kZSBmbGFnICovCisKKwl7QUNQSV9SU0NfMUJJVEZMQUcsIEFDUElfUlNfT0ZGU0VUKGRhdGEuaW8uaW9fZGVjb2RlKSwKKwkgQU1MX09GRlNFVChpby5mbGFncyksCisJIDB9LAorCS8qCisJICogVGhlc2UgZmllbGRzIGFyZSBjb250aWd1b3VzIGluIGJvdGggdGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb246CisJICogQWRkcmVzcyBBbGlnbm1lbnQKKwkgKiBMZW5ndGgKKwkgKiBNaW5pbXVtIEJhc2UgQWRkcmVzcworCSAqIE1heGltdW0gQmFzZSBBZGRyZXNzCisJICovCisJe0FDUElfUlNDX01PVkU4LCBBQ1BJX1JTX09GRlNFVChkYXRhLmlvLmFsaWdubWVudCksCisJIEFNTF9PRkZTRVQoaW8uYWxpZ25tZW50KSwKKwkgMn0sCisKKwl7QUNQSV9SU0NfTU9WRTE2LCBBQ1BJX1JTX09GRlNFVChkYXRhLmlvLm1pbmltdW0pLAorCSBBTUxfT0ZGU0VUKGlvLm1pbmltdW0pLAorCSAyfQorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBhY3BpX3JzX2NvbnZlcnRfZml4ZWRfaW8KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdHJ1Y3QgYWNwaV9yc2NvbnZlcnRfaW5mbyBhY3BpX3JzX2NvbnZlcnRfZml4ZWRfaW9bNF0gPSB7CisJe0FDUElfUlNDX0lOSVRHRVQsIEFDUElfUkVTT1VSQ0VfVFlQRV9GSVhFRF9JTywKKwkgQUNQSV9SU19TSVpFKHN0cnVjdCBhY3BpX3Jlc291cmNlX2ZpeGVkX2lvKSwKKwkgQUNQSV9SU0NfVEFCTEVfU0laRShhY3BpX3JzX2NvbnZlcnRfZml4ZWRfaW8pfSwKKworCXtBQ1BJX1JTQ19JTklUU0VULCBBQ1BJX1JFU09VUkNFX05BTUVfRklYRURfSU8sCisJIHNpemVvZihzdHJ1Y3QgYW1sX3Jlc291cmNlX2ZpeGVkX2lvKSwKKwkgMH0sCisJLyoKKwkgKiBUaGVzZSBmaWVsZHMgYXJlIGNvbnRpZ3VvdXMgaW4gYm90aCB0aGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbjoKKwkgKiBCYXNlIEFkZHJlc3MKKwkgKiBMZW5ndGgKKwkgKi8KKwl7QUNQSV9SU0NfTU9WRTgsIEFDUElfUlNfT0ZGU0VUKGRhdGEuZml4ZWRfaW8uYWRkcmVzc19sZW5ndGgpLAorCSBBTUxfT0ZGU0VUKGZpeGVkX2lvLmFkZHJlc3NfbGVuZ3RoKSwKKwkgMX0sCisKKwl7QUNQSV9SU0NfTU9WRTE2LCBBQ1BJX1JTX09GRlNFVChkYXRhLmZpeGVkX2lvLmFkZHJlc3MpLAorCSBBTUxfT0ZGU0VUKGZpeGVkX2lvLmFkZHJlc3MpLAorCSAxfQorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBhY3BpX3JzX2NvbnZlcnRfZ2VuZXJpY19yZWcKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdHJ1Y3QgYWNwaV9yc2NvbnZlcnRfaW5mbyBhY3BpX3JzX2NvbnZlcnRfZ2VuZXJpY19yZWdbNF0gPSB7CisJe0FDUElfUlNDX0lOSVRHRVQsIEFDUElfUkVTT1VSQ0VfVFlQRV9HRU5FUklDX1JFR0lTVEVSLAorCSBBQ1BJX1JTX1NJWkUoc3RydWN0IGFjcGlfcmVzb3VyY2VfZ2VuZXJpY19yZWdpc3RlciksCisJIEFDUElfUlNDX1RBQkxFX1NJWkUoYWNwaV9yc19jb252ZXJ0X2dlbmVyaWNfcmVnKX0sCisKKwl7QUNQSV9SU0NfSU5JVFNFVCwgQUNQSV9SRVNPVVJDRV9OQU1FX0dFTkVSSUNfUkVHSVNURVIsCisJIHNpemVvZihzdHJ1Y3QgYW1sX3Jlc291cmNlX2dlbmVyaWNfcmVnaXN0ZXIpLAorCSAwfSwKKwkvKgorCSAqIFRoZXNlIGZpZWxkcyBhcmUgY29udGlndW91cyBpbiBib3RoIHRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uOgorCSAqIEFkZHJlc3MgU3BhY2UgSUQKKwkgKiBSZWdpc3RlciBCaXQgV2lkdGgKKwkgKiBSZWdpc3RlciBCaXQgT2Zmc2V0CisJICogQWNjZXNzIFNpemUKKwkgKi8KKwl7QUNQSV9SU0NfTU9WRTgsIEFDUElfUlNfT0ZGU0VUKGRhdGEuZ2VuZXJpY19yZWcuc3BhY2VfaWQpLAorCSBBTUxfT0ZGU0VUKGdlbmVyaWNfcmVnLmFkZHJlc3Nfc3BhY2VfaWQpLAorCSA0fSwKKworCS8qIEdldCB0aGUgUmVnaXN0ZXIgQWRkcmVzcyAqLworCisJe0FDUElfUlNDX01PVkU2NCwgQUNQSV9SU19PRkZTRVQoZGF0YS5nZW5lcmljX3JlZy5hZGRyZXNzKSwKKwkgQU1MX09GRlNFVChnZW5lcmljX3JlZy5hZGRyZXNzKSwKKwkgMX0KK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogYWNwaV9yc19jb252ZXJ0X2VuZF9kcGYKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdHJ1Y3QgYWNwaV9yc2NvbnZlcnRfaW5mbyBhY3BpX3JzX2NvbnZlcnRfZW5kX2RwZlsyXSA9IHsKKwl7QUNQSV9SU0NfSU5JVEdFVCwgQUNQSV9SRVNPVVJDRV9UWVBFX0VORF9ERVBFTkRFTlQsCisJIEFDUElfUlNfU0laRV9NSU4sCisJIEFDUElfUlNDX1RBQkxFX1NJWkUoYWNwaV9yc19jb252ZXJ0X2VuZF9kcGYpfSwKKworCXtBQ1BJX1JTQ19JTklUU0VULCBBQ1BJX1JFU09VUkNFX05BTUVfRU5EX0RFUEVOREVOVCwKKwkgc2l6ZW9mKHN0cnVjdCBhbWxfcmVzb3VyY2VfZW5kX2RlcGVuZGVudCksCisJIDB9Cit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIGFjcGlfcnNfY29udmVydF9lbmRfdGFnCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RydWN0IGFjcGlfcnNjb252ZXJ0X2luZm8gYWNwaV9yc19jb252ZXJ0X2VuZF90YWdbMl0gPSB7CisJe0FDUElfUlNDX0lOSVRHRVQsIEFDUElfUkVTT1VSQ0VfVFlQRV9FTkRfVEFHLAorCSBBQ1BJX1JTX1NJWkVfTUlOLAorCSBBQ1BJX1JTQ19UQUJMRV9TSVpFKGFjcGlfcnNfY29udmVydF9lbmRfdGFnKX0sCisKKwkvKgorCSAqIE5vdGU6IFRoZSBjaGVja3N1bSBmaWVsZCBpcyBzZXQgdG8gemVybywgbWVhbmluZyB0aGF0IHRoZSByZXNvdXJjZQorCSAqIGRhdGEgaXMgdHJlYXRlZCBhcyBpZiB0aGUgY2hlY2tzdW0gb3BlcmF0aW9uIHN1Y2NlZWRlZC4KKwkgKiAoQUNQSSBTcGVjIDEuMGIgU2VjdGlvbiA2LjQuMi44KQorCSAqLworCXtBQ1BJX1JTQ19JTklUU0VULCBBQ1BJX1JFU09VUkNFX05BTUVfRU5EX1RBRywKKwkgc2l6ZW9mKHN0cnVjdCBhbWxfcmVzb3VyY2VfZW5kX3RhZyksCisJIDB9Cit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIGFjcGlfcnNfZ2V0X3N0YXJ0X2RwZgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0cnVjdCBhY3BpX3JzY29udmVydF9pbmZvIGFjcGlfcnNfZ2V0X3N0YXJ0X2RwZls2XSA9IHsKKwl7QUNQSV9SU0NfSU5JVEdFVCwgQUNQSV9SRVNPVVJDRV9UWVBFX1NUQVJUX0RFUEVOREVOVCwKKwkgQUNQSV9SU19TSVpFKHN0cnVjdCBhY3BpX3Jlc291cmNlX3N0YXJ0X2RlcGVuZGVudCksCisJIEFDUElfUlNDX1RBQkxFX1NJWkUoYWNwaV9yc19nZXRfc3RhcnRfZHBmKX0sCisKKwkvKiBEZWZhdWx0cyBmb3IgQ29tcGF0aWJpbGl0eSBhbmQgUGVyZm9ybWFuY2UgcHJpb3JpdGllcyAqLworCisJe0FDUElfUlNDX1NFVDgsIEFDUElfUlNfT0ZGU0VUKGRhdGEuc3RhcnRfZHBmLmNvbXBhdGliaWxpdHlfcHJpb3JpdHkpLAorCSBBQ1BJX0FDQ0VQVEFCTEVfQ09ORklHVVJBVElPTiwKKwkgMn0sCisKKwkvKiBHZXQgdGhlIGRlc2NyaXB0b3IgbGVuZ3RoICgwIG9yIDEgZm9yIFN0YXJ0IERwZiBkZXNjcmlwdG9yKSAqLworCisJe0FDUElfUlNDXzFCSVRGTEFHLCBBQ1BJX1JTX09GRlNFVChkYXRhLnN0YXJ0X2RwZi5kZXNjcmlwdG9yX2xlbmd0aCksCisJIEFNTF9PRkZTRVQoc3RhcnRfZHBmLmRlc2NyaXB0b3JfdHlwZSksCisJIDB9LAorCisJLyogQWxsIGRvbmUgaWYgdGhlcmUgaXMgbm8gZmxhZyBieXRlIHByZXNlbnQgaW4gdGhlIGRlc2NyaXB0b3IgKi8KKworCXtBQ1BJX1JTQ19FWElUX05FLCBBQ1BJX1JTQ19DT01QQVJFX0FNTF9MRU5HVEgsIDAsIDF9LAorCisJLyogRmxhZyBieXRlIGlzIHByZXNlbnQsIGdldCB0aGUgZmxhZ3MgKi8KKworCXtBQ1BJX1JTQ18yQklURkxBRywKKwkgQUNQSV9SU19PRkZTRVQoZGF0YS5zdGFydF9kcGYuY29tcGF0aWJpbGl0eV9wcmlvcml0eSksCisJIEFNTF9PRkZTRVQoc3RhcnRfZHBmLmZsYWdzKSwKKwkgMH0sCisKKwl7QUNQSV9SU0NfMkJJVEZMQUcsCisJIEFDUElfUlNfT0ZGU0VUKGRhdGEuc3RhcnRfZHBmLnBlcmZvcm1hbmNlX3JvYnVzdG5lc3MpLAorCSBBTUxfT0ZGU0VUKHN0YXJ0X2RwZi5mbGFncyksCisJIDJ9Cit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIGFjcGlfcnNfc2V0X3N0YXJ0X2RwZgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0cnVjdCBhY3BpX3JzY29udmVydF9pbmZvIGFjcGlfcnNfc2V0X3N0YXJ0X2RwZlsxMF0gPSB7CisJLyogU3RhcnQgd2l0aCBhIGRlZmF1bHQgZGVzY3JpcHRvciBvZiBsZW5ndGggMSAqLworCisJe0FDUElfUlNDX0lOSVRTRVQsIEFDUElfUkVTT1VSQ0VfTkFNRV9TVEFSVF9ERVBFTkRFTlQsCisJIHNpemVvZihzdHJ1Y3QgYW1sX3Jlc291cmNlX3N0YXJ0X2RlcGVuZGVudCksCisJIEFDUElfUlNDX1RBQkxFX1NJWkUoYWNwaV9yc19zZXRfc3RhcnRfZHBmKX0sCisKKwkvKiBTZXQgdGhlIGRlZmF1bHQgZmxhZyB2YWx1ZXMgKi8KKworCXtBQ1BJX1JTQ18yQklURkxBRywKKwkgQUNQSV9SU19PRkZTRVQoZGF0YS5zdGFydF9kcGYuY29tcGF0aWJpbGl0eV9wcmlvcml0eSksCisJIEFNTF9PRkZTRVQoc3RhcnRfZHBmLmZsYWdzKSwKKwkgMH0sCisKKwl7QUNQSV9SU0NfMkJJVEZMQUcsCisJIEFDUElfUlNfT0ZGU0VUKGRhdGEuc3RhcnRfZHBmLnBlcmZvcm1hbmNlX3JvYnVzdG5lc3MpLAorCSBBTUxfT0ZGU0VUKHN0YXJ0X2RwZi5mbGFncyksCisJIDJ9LAorCS8qCisJICogQWxsIGRvbmUgaWYgdGhlIG91dHB1dCBkZXNjcmlwdG9yIGxlbmd0aCBpcyByZXF1aXJlZCB0byBiZSAxCisJICogKGkuZS4sIG9wdGltaXphdGlvbiB0byAwIGJ5dGVzIGNhbm5vdCBiZSBhdHRlbXB0ZWQpCisJICovCisJe0FDUElfUlNDX0VYSVRfRVEsIEFDUElfUlNDX0NPTVBBUkVfVkFMVUUsCisJIEFDUElfUlNfT0ZGU0VUKGRhdGEuc3RhcnRfZHBmLmRlc2NyaXB0b3JfbGVuZ3RoKSwKKwkgMX0sCisKKwkvKiBTZXQgbGVuZ3RoIHRvIDAgYnl0ZXMgKG5vIGZsYWdzIGJ5dGUpICovCisKKwl7QUNQSV9SU0NfTEVOR1RILCAwLCAwLAorCSBzaXplb2Yoc3RydWN0IGFtbF9yZXNvdXJjZV9zdGFydF9kZXBlbmRlbnRfbm9wcmlvKX0sCisKKwkvKgorCSAqIEFsbCBkb25lIGlmIHRoZSBvdXRwdXQgZGVzY3JpcHRvciBsZW5ndGggaXMgcmVxdWlyZWQgdG8gYmUgMC4KKwkgKgorCSAqIFRCRDogUGVyaGFwcyB3ZSBzaG91bGQgY2hlY2sgZm9yIGVycm9yIGlmIGlucHV0IGZsYWdzIGFyZSBub3QKKwkgKiBjb21wYXRpYmxlIHdpdGggYSAwLWJ5dGUgZGVzY3JpcHRvci4KKwkgKi8KKwl7QUNQSV9SU0NfRVhJVF9FUSwgQUNQSV9SU0NfQ09NUEFSRV9WQUxVRSwKKwkgQUNQSV9SU19PRkZTRVQoZGF0YS5zdGFydF9kcGYuZGVzY3JpcHRvcl9sZW5ndGgpLAorCSAwfSwKKworCS8qIFJlc2V0IGxlbmd0aCB0byAxIGJ5dGUgKGRlc2NyaXB0b3Igd2l0aCBmbGFncyBieXRlKSAqLworCisJe0FDUElfUlNDX0xFTkdUSCwgMCwgMCwgc2l6ZW9mKHN0cnVjdCBhbWxfcmVzb3VyY2Vfc3RhcnRfZGVwZW5kZW50KX0sCisKKwkvKgorCSAqIEFsbCBkb25lIGlmIGZsYWdzIGJ5dGUgaXMgbmVjZXNzYXJ5IC0tIGlmIGVpdGhlciBwcmlvcml0eSB2YWx1ZQorCSAqIGlzIG5vdCBBQ1BJX0FDQ0VQVEFCTEVfQ09ORklHVVJBVElPTgorCSAqLworCXtBQ1BJX1JTQ19FWElUX05FLCBBQ1BJX1JTQ19DT01QQVJFX1ZBTFVFLAorCSBBQ1BJX1JTX09GRlNFVChkYXRhLnN0YXJ0X2RwZi5jb21wYXRpYmlsaXR5X3ByaW9yaXR5KSwKKwkgQUNQSV9BQ0NFUFRBQkxFX0NPTkZJR1VSQVRJT059LAorCisJe0FDUElfUlNDX0VYSVRfTkUsIEFDUElfUlNDX0NPTVBBUkVfVkFMVUUsCisJIEFDUElfUlNfT0ZGU0VUKGRhdGEuc3RhcnRfZHBmLnBlcmZvcm1hbmNlX3JvYnVzdG5lc3MpLAorCSBBQ1BJX0FDQ0VQVEFCTEVfQ09ORklHVVJBVElPTn0sCisKKwkvKiBGbGFnIGJ5dGUgaXMgbm90IG5lY2Vzc2FyeSAqLworCisJe0FDUElfUlNDX0xFTkdUSCwgMCwgMCwKKwkgc2l6ZW9mKHN0cnVjdCBhbWxfcmVzb3VyY2Vfc3RhcnRfZGVwZW5kZW50X25vcHJpbyl9Cit9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS9yc2lycS5jIGIvZHJpdmVycy9hY3BpL2FjcGljYS9yc2lycS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlMDI1NjkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL3JzaXJxLmMKQEAgLTAsMCArMSwyNjYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogTW9kdWxlIE5hbWU6IHJzaXJxIC0gSVJRIHJlc291cmNlIGRlc2NyaXB0b3JzCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDgsIEludGVsIENvcnAuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCisgKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSBhdCBtaW5pbXVtIGEgZGlzY2xhaW1lcgorICogICAgc3Vic3RhbnRpYWxseSBzaW1pbGFyIHRvIHRoZSAiTk8gV0FSUkFOVFkiIGRpc2NsYWltZXIgYmVsb3cKKyAqICAgICgiRGlzY2xhaW1lciIpIGFuZCBhbnkgcmVkaXN0cmlidXRpb24gbXVzdCBiZSBjb25kaXRpb25lZCB1cG9uCisgKiAgICBpbmNsdWRpbmcgYSBzdWJzdGFudGlhbGx5IHNpbWlsYXIgRGlzY2xhaW1lciByZXF1aXJlbWVudCBmb3IgZnVydGhlcgorICogICAgYmluYXJ5IHJlZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzCisgKiAgICBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIE5PIFdBUlJBTlRZCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORworICogSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCisgKi8KKworI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgorI2luY2x1ZGUgImFjY29tbW9uLmgiCisjaW5jbHVkZSAiYWNyZXNyYy5oIgorCisjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9SRVNPVVJDRVMKK0FDUElfTU9EVUxFX05BTUUoInJzaXJxIikKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBhY3BpX3JzX2dldF9pcnEKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RydWN0IGFjcGlfcnNjb252ZXJ0X2luZm8gYWNwaV9yc19nZXRfaXJxWzhdID0geworCXtBQ1BJX1JTQ19JTklUR0VULCBBQ1BJX1JFU09VUkNFX1RZUEVfSVJRLAorCSBBQ1BJX1JTX1NJWkUoc3RydWN0IGFjcGlfcmVzb3VyY2VfaXJxKSwKKwkgQUNQSV9SU0NfVEFCTEVfU0laRShhY3BpX3JzX2dldF9pcnEpfSwKKworCS8qIEdldCB0aGUgSVJRIG1hc2sgKGJ5dGVzIDE6MikgKi8KKworCXtBQ1BJX1JTQ19CSVRNQVNLMTYsIEFDUElfUlNfT0ZGU0VUKGRhdGEuaXJxLmludGVycnVwdHNbMF0pLAorCSBBTUxfT0ZGU0VUKGlycS5pcnFfbWFzayksCisJIEFDUElfUlNfT0ZGU0VUKGRhdGEuaXJxLmludGVycnVwdF9jb3VudCl9LAorCisJLyogU2V0IGRlZmF1bHQgZmxhZ3MgKG90aGVycyBhcmUgemVybykgKi8KKworCXtBQ1BJX1JTQ19TRVQ4LCBBQ1BJX1JTX09GRlNFVChkYXRhLmlycS50cmlnZ2VyaW5nKSwKKwkgQUNQSV9FREdFX1NFTlNJVElWRSwKKwkgMX0sCisKKwkvKiBHZXQgdGhlIGRlc2NyaXB0b3IgbGVuZ3RoICgyIG9yIDMgZm9yIElSUSBkZXNjcmlwdG9yKSAqLworCisJe0FDUElfUlNDXzJCSVRGTEFHLCBBQ1BJX1JTX09GRlNFVChkYXRhLmlycS5kZXNjcmlwdG9yX2xlbmd0aCksCisJIEFNTF9PRkZTRVQoaXJxLmRlc2NyaXB0b3JfdHlwZSksCisJIDB9LAorCisJLyogQWxsIGRvbmUgaWYgbm8gZmxhZyBieXRlIHByZXNlbnQgaW4gZGVzY3JpcHRvciAqLworCisJe0FDUElfUlNDX0VYSVRfTkUsIEFDUElfUlNDX0NPTVBBUkVfQU1MX0xFTkdUSCwgMCwgM30sCisKKwkvKiBHZXQgZmxhZ3M6IFRyaWdnZXJpbmdbMF0sIFBvbGFyaXR5WzNdLCBTaGFyaW5nWzRdICovCisKKwl7QUNQSV9SU0NfMUJJVEZMQUcsIEFDUElfUlNfT0ZGU0VUKGRhdGEuaXJxLnRyaWdnZXJpbmcpLAorCSBBTUxfT0ZGU0VUKGlycS5mbGFncyksCisJIDB9LAorCisJe0FDUElfUlNDXzFCSVRGTEFHLCBBQ1BJX1JTX09GRlNFVChkYXRhLmlycS5wb2xhcml0eSksCisJIEFNTF9PRkZTRVQoaXJxLmZsYWdzKSwKKwkgM30sCisKKwl7QUNQSV9SU0NfMUJJVEZMQUcsIEFDUElfUlNfT0ZGU0VUKGRhdGEuaXJxLnNoYXJhYmxlKSwKKwkgQU1MX09GRlNFVChpcnEuZmxhZ3MpLAorCSA0fQorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBhY3BpX3JzX3NldF9pcnEKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdHJ1Y3QgYWNwaV9yc2NvbnZlcnRfaW5mbyBhY3BpX3JzX3NldF9pcnFbMTNdID0geworCS8qIFN0YXJ0IHdpdGggYSBkZWZhdWx0IGRlc2NyaXB0b3Igb2YgbGVuZ3RoIDMgKi8KKworCXtBQ1BJX1JTQ19JTklUU0VULCBBQ1BJX1JFU09VUkNFX05BTUVfSVJRLAorCSBzaXplb2Yoc3RydWN0IGFtbF9yZXNvdXJjZV9pcnEpLAorCSBBQ1BJX1JTQ19UQUJMRV9TSVpFKGFjcGlfcnNfc2V0X2lycSl9LAorCisJLyogQ29udmVydCBpbnRlcnJ1cHQgbGlzdCB0byAxNi1iaXQgSVJRIGJpdG1hc2sgKi8KKworCXtBQ1BJX1JTQ19CSVRNQVNLMTYsIEFDUElfUlNfT0ZGU0VUKGRhdGEuaXJxLmludGVycnVwdHNbMF0pLAorCSBBTUxfT0ZGU0VUKGlycS5pcnFfbWFzayksCisJIEFDUElfUlNfT0ZGU0VUKGRhdGEuaXJxLmludGVycnVwdF9jb3VudCl9LAorCisJLyogU2V0IHRoZSBmbGFncyBieXRlICovCisKKwl7QUNQSV9SU0NfMUJJVEZMQUcsIEFDUElfUlNfT0ZGU0VUKGRhdGEuaXJxLnRyaWdnZXJpbmcpLAorCSBBTUxfT0ZGU0VUKGlycS5mbGFncyksCisJIDB9LAorCisJe0FDUElfUlNDXzFCSVRGTEFHLCBBQ1BJX1JTX09GRlNFVChkYXRhLmlycS5wb2xhcml0eSksCisJIEFNTF9PRkZTRVQoaXJxLmZsYWdzKSwKKwkgM30sCisKKwl7QUNQSV9SU0NfMUJJVEZMQUcsIEFDUElfUlNfT0ZGU0VUKGRhdGEuaXJxLnNoYXJhYmxlKSwKKwkgQU1MX09GRlNFVChpcnEuZmxhZ3MpLAorCSA0fSwKKworCS8qCisJICogQWxsIGRvbmUgaWYgdGhlIG91dHB1dCBkZXNjcmlwdG9yIGxlbmd0aCBpcyByZXF1aXJlZCB0byBiZSAzCisJICogKGkuZS4sIG9wdGltaXphdGlvbiB0byAyIGJ5dGVzIGNhbm5vdCBiZSBhdHRlbXB0ZWQpCisJICovCisJe0FDUElfUlNDX0VYSVRfRVEsIEFDUElfUlNDX0NPTVBBUkVfVkFMVUUsCisJIEFDUElfUlNfT0ZGU0VUKGRhdGEuaXJxLmRlc2NyaXB0b3JfbGVuZ3RoKSwKKwkgM30sCisKKwkvKiBTZXQgbGVuZ3RoIHRvIDIgYnl0ZXMgKG5vIGZsYWdzIGJ5dGUpICovCisKKwl7QUNQSV9SU0NfTEVOR1RILCAwLCAwLCBzaXplb2Yoc3RydWN0IGFtbF9yZXNvdXJjZV9pcnFfbm9mbGFncyl9LAorCisJLyoKKwkgKiBBbGwgZG9uZSBpZiB0aGUgb3V0cHV0IGRlc2NyaXB0b3IgbGVuZ3RoIGlzIHJlcXVpcmVkIHRvIGJlIDIuCisJICoKKwkgKiBUQkQ6IFBlcmhhcHMgd2Ugc2hvdWxkIGNoZWNrIGZvciBlcnJvciBpZiBpbnB1dCBmbGFncyBhcmUgbm90CisJICogY29tcGF0aWJsZSB3aXRoIGEgMi1ieXRlIGRlc2NyaXB0b3IuCisJICovCisJe0FDUElfUlNDX0VYSVRfRVEsIEFDUElfUlNDX0NPTVBBUkVfVkFMVUUsCisJIEFDUElfUlNfT0ZGU0VUKGRhdGEuaXJxLmRlc2NyaXB0b3JfbGVuZ3RoKSwKKwkgMn0sCisKKwkvKiBSZXNldCBsZW5ndGggdG8gMyBieXRlcyAoZGVzY3JpcHRvciB3aXRoIGZsYWdzIGJ5dGUpICovCisKKwl7QUNQSV9SU0NfTEVOR1RILCAwLCAwLCBzaXplb2Yoc3RydWN0IGFtbF9yZXNvdXJjZV9pcnEpfSwKKworCS8qCisJICogQ2hlY2sgaWYgdGhlIGZsYWdzIGJ5dGUgaXMgbmVjZXNzYXJ5LiBOb3QgbmVlZGVkIGlmIHRoZSBmbGFncyBhcmU6CisJICogQUNQSV9FREdFX1NFTlNJVElWRSwgQUNQSV9BQ1RJVkVfSElHSCwgQUNQSV9FWENMVVNJVkUKKwkgKi8KKwl7QUNQSV9SU0NfRVhJVF9ORSwgQUNQSV9SU0NfQ09NUEFSRV9WQUxVRSwKKwkgQUNQSV9SU19PRkZTRVQoZGF0YS5pcnEudHJpZ2dlcmluZyksCisJIEFDUElfRURHRV9TRU5TSVRJVkV9LAorCisJe0FDUElfUlNDX0VYSVRfTkUsIEFDUElfUlNDX0NPTVBBUkVfVkFMVUUsCisJIEFDUElfUlNfT0ZGU0VUKGRhdGEuaXJxLnBvbGFyaXR5KSwKKwkgQUNQSV9BQ1RJVkVfSElHSH0sCisKKwl7QUNQSV9SU0NfRVhJVF9ORSwgQUNQSV9SU0NfQ09NUEFSRV9WQUxVRSwKKwkgQUNQSV9SU19PRkZTRVQoZGF0YS5pcnEuc2hhcmFibGUpLAorCSBBQ1BJX0VYQ0xVU0lWRX0sCisKKwkvKiBXZSBjYW4gb3B0aW1pemUgdG8gYSAyLWJ5dGUgaXJxX25vX2ZsYWdzKCkgZGVzY3JpcHRvciAqLworCisJe0FDUElfUlNDX0xFTkdUSCwgMCwgMCwgc2l6ZW9mKHN0cnVjdCBhbWxfcmVzb3VyY2VfaXJxX25vZmxhZ3MpfQorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBhY3BpX3JzX2NvbnZlcnRfZXh0X2lycQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0cnVjdCBhY3BpX3JzY29udmVydF9pbmZvIGFjcGlfcnNfY29udmVydF9leHRfaXJxWzldID0geworCXtBQ1BJX1JTQ19JTklUR0VULCBBQ1BJX1JFU09VUkNFX1RZUEVfRVhURU5ERURfSVJRLAorCSBBQ1BJX1JTX1NJWkUoc3RydWN0IGFjcGlfcmVzb3VyY2VfZXh0ZW5kZWRfaXJxKSwKKwkgQUNQSV9SU0NfVEFCTEVfU0laRShhY3BpX3JzX2NvbnZlcnRfZXh0X2lycSl9LAorCisJe0FDUElfUlNDX0lOSVRTRVQsIEFDUElfUkVTT1VSQ0VfTkFNRV9FWFRFTkRFRF9JUlEsCisJIHNpemVvZihzdHJ1Y3QgYW1sX3Jlc291cmNlX2V4dGVuZGVkX2lycSksCisJIDB9LAorCisJLyogRmxhZyBiaXRzICovCisKKwl7QUNQSV9SU0NfMUJJVEZMQUcsIEFDUElfUlNfT0ZGU0VUKGRhdGEuZXh0ZW5kZWRfaXJxLnByb2R1Y2VyX2NvbnN1bWVyKSwKKwkgQU1MX09GRlNFVChleHRlbmRlZF9pcnEuZmxhZ3MpLAorCSAwfSwKKworCXtBQ1BJX1JTQ18xQklURkxBRywgQUNQSV9SU19PRkZTRVQoZGF0YS5leHRlbmRlZF9pcnEudHJpZ2dlcmluZyksCisJIEFNTF9PRkZTRVQoZXh0ZW5kZWRfaXJxLmZsYWdzKSwKKwkgMX0sCisKKwl7QUNQSV9SU0NfMUJJVEZMQUcsIEFDUElfUlNfT0ZGU0VUKGRhdGEuZXh0ZW5kZWRfaXJxLnBvbGFyaXR5KSwKKwkgQU1MX09GRlNFVChleHRlbmRlZF9pcnEuZmxhZ3MpLAorCSAyfSwKKworCXtBQ1BJX1JTQ18xQklURkxBRywgQUNQSV9SU19PRkZTRVQoZGF0YS5leHRlbmRlZF9pcnEuc2hhcmFibGUpLAorCSBBTUxfT0ZGU0VUKGV4dGVuZGVkX2lycS5mbGFncyksCisJIDN9LAorCisJLyogSVJRIFRhYmxlIGxlbmd0aCAoQnl0ZTQpICovCisKKwl7QUNQSV9SU0NfQ09VTlQsIEFDUElfUlNfT0ZGU0VUKGRhdGEuZXh0ZW5kZWRfaXJxLmludGVycnVwdF9jb3VudCksCisJIEFNTF9PRkZTRVQoZXh0ZW5kZWRfaXJxLmludGVycnVwdF9jb3VudCksCisJIHNpemVvZih1MzIpfQorCSwKKworCS8qIENvcHkgZXZlcnkgSVJRIGluIHRoZSB0YWJsZSwgZWFjaCBpcyAzMiBiaXRzICovCisKKwl7QUNQSV9SU0NfTU9WRTMyLCBBQ1BJX1JTX09GRlNFVChkYXRhLmV4dGVuZGVkX2lycS5pbnRlcnJ1cHRzWzBdKSwKKwkgQU1MX09GRlNFVChleHRlbmRlZF9pcnEuaW50ZXJydXB0c1swXSksCisJIDB9CisJLAorCisJLyogT3B0aW9uYWwgcmVzb3VyY2Vfc291cmNlIChJbmRleCBhbmQgU3RyaW5nKSAqLworCisJe0FDUElfUlNDX1NPVVJDRVgsIEFDUElfUlNfT0ZGU0VUKGRhdGEuZXh0ZW5kZWRfaXJxLnJlc291cmNlX3NvdXJjZSksCisJIEFDUElfUlNfT0ZGU0VUKGRhdGEuZXh0ZW5kZWRfaXJxLmludGVycnVwdHNbMF0pLAorCSBzaXplb2Yoc3RydWN0IGFtbF9yZXNvdXJjZV9leHRlbmRlZF9pcnEpfQorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBhY3BpX3JzX2NvbnZlcnRfZG1hCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RydWN0IGFjcGlfcnNjb252ZXJ0X2luZm8gYWNwaV9yc19jb252ZXJ0X2RtYVs2XSA9IHsKKwl7QUNQSV9SU0NfSU5JVEdFVCwgQUNQSV9SRVNPVVJDRV9UWVBFX0RNQSwKKwkgQUNQSV9SU19TSVpFKHN0cnVjdCBhY3BpX3Jlc291cmNlX2RtYSksCisJIEFDUElfUlNDX1RBQkxFX1NJWkUoYWNwaV9yc19jb252ZXJ0X2RtYSl9LAorCisJe0FDUElfUlNDX0lOSVRTRVQsIEFDUElfUkVTT1VSQ0VfTkFNRV9ETUEsCisJIHNpemVvZihzdHJ1Y3QgYW1sX3Jlc291cmNlX2RtYSksCisJIDB9LAorCisJLyogRmxhZ3M6IHRyYW5zZmVyIHByZWZlcmVuY2UsIGJ1cyBtYXN0ZXJpbmcsIGNoYW5uZWwgc3BlZWQgKi8KKworCXtBQ1BJX1JTQ18yQklURkxBRywgQUNQSV9SU19PRkZTRVQoZGF0YS5kbWEudHJhbnNmZXIpLAorCSBBTUxfT0ZGU0VUKGRtYS5mbGFncyksCisJIDB9LAorCisJe0FDUElfUlNDXzFCSVRGTEFHLCBBQ1BJX1JTX09GRlNFVChkYXRhLmRtYS5idXNfbWFzdGVyKSwKKwkgQU1MX09GRlNFVChkbWEuZmxhZ3MpLAorCSAyfSwKKworCXtBQ1BJX1JTQ18yQklURkxBRywgQUNQSV9SU19PRkZTRVQoZGF0YS5kbWEudHlwZSksCisJIEFNTF9PRkZTRVQoZG1hLmZsYWdzKSwKKwkgNX0sCisKKwkvKiBETUEgY2hhbm5lbCBtYXNrIGJpdHMgKi8KKworCXtBQ1BJX1JTQ19CSVRNQVNLLCBBQ1BJX1JTX09GRlNFVChkYXRhLmRtYS5jaGFubmVsc1swXSksCisJIEFNTF9PRkZTRVQoZG1hLmRtYV9jaGFubmVsX21hc2spLAorCSBBQ1BJX1JTX09GRlNFVChkYXRhLmRtYS5jaGFubmVsX2NvdW50KX0KK307CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL3JzbGlzdC5jIGIvZHJpdmVycy9hY3BpL2FjcGljYS9yc2xpc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjFkYmM2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS9yc2xpc3QuYwpAQCAtMCwwICsxLDIwMyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBNb2R1bGUgTmFtZTogcnNsaXN0IC0gTGlua2VkIGxpc3QgdXRpbGl0aWVzCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDgsIEludGVsIENvcnAuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCisgKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSBhdCBtaW5pbXVtIGEgZGlzY2xhaW1lcgorICogICAgc3Vic3RhbnRpYWxseSBzaW1pbGFyIHRvIHRoZSAiTk8gV0FSUkFOVFkiIGRpc2NsYWltZXIgYmVsb3cKKyAqICAgICgiRGlzY2xhaW1lciIpIGFuZCBhbnkgcmVkaXN0cmlidXRpb24gbXVzdCBiZSBjb25kaXRpb25lZCB1cG9uCisgKiAgICBpbmNsdWRpbmcgYSBzdWJzdGFudGlhbGx5IHNpbWlsYXIgRGlzY2xhaW1lciByZXF1aXJlbWVudCBmb3IgZnVydGhlcgorICogICAgYmluYXJ5IHJlZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzCisgKiAgICBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIE5PIFdBUlJBTlRZCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORworICogSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCisgKi8KKworI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgorI2luY2x1ZGUgImFjY29tbW9uLmgiCisjaW5jbHVkZSAiYWNyZXNyYy5oIgorCisjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9SRVNPVVJDRVMKK0FDUElfTU9EVUxFX05BTUUoInJzbGlzdCIpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfcnNfY29udmVydF9hbWxfdG9fcmVzb3VyY2VzCisgKgorICogUEFSQU1FVEVSUzogIGFjcGlfd2Fsa19hbWxfY2FsbGJhY2sKKyAqICAgICAgICAgICAgICByZXNvdXJjZV9wdHIgICAgICAgICAgICAtIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0aGF0IHdpbGwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW4gdGhlIG91dHB1dCBzdHJ1Y3R1cmVzCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBDb252ZXJ0IGFuIEFNTCByZXNvdXJjZSB0byBhbiBpbnRlcm5hbCByZXByZXNlbnRhdGlvbiBvZiB0aGUKKyAqICAgICAgICAgICAgICByZXNvdXJjZSB0aGF0IGlzIGFsaWduZWQgYW5kIGVhc2llciB0byBhY2Nlc3MuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2FjcGlfc3RhdHVzCithY3BpX3JzX2NvbnZlcnRfYW1sX3RvX3Jlc291cmNlcyh1OCAqIGFtbCwKKwkJCQkgdTMyIGxlbmd0aCwKKwkJCQkgdTMyIG9mZnNldCwgdTggcmVzb3VyY2VfaW5kZXgsIHZvaWQgKipjb250ZXh0KQoreworCXN0cnVjdCBhY3BpX3Jlc291cmNlICoqcmVzb3VyY2VfcHRyID0KKwkgICAgQUNQSV9DQVNUX0lORElSRUNUX1BUUihzdHJ1Y3QgYWNwaV9yZXNvdXJjZSwgY29udGV4dCk7CisJc3RydWN0IGFjcGlfcmVzb3VyY2UgKnJlc291cmNlOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0UocnNfY29udmVydF9hbWxfdG9fcmVzb3VyY2VzKTsKKworCS8qCisJICogQ2hlY2sgdGhhdCB0aGUgaW5wdXQgYnVmZmVyIGFuZCBhbGwgc3Vic2VxdWVudCBwb2ludGVycyBpbnRvIGl0CisJICogYXJlIGFsaWduZWQgb24gYSBuYXRpdmUgd29yZCBib3VuZGFyeS4gTW9zdCBpbXBvcnRhbnQgb24gSUE2NAorCSAqLworCXJlc291cmNlID0gKnJlc291cmNlX3B0cjsKKwlpZiAoQUNQSV9JU19NSVNBTElHTkVEKHJlc291cmNlKSkgeworCQlBQ1BJX1dBUk5JTkcoKEFFX0lORk8sCisJCQkgICAgICAiTWlzYWxpZ25lZCByZXNvdXJjZSBwb2ludGVyICVwIiwgcmVzb3VyY2UpKTsKKwl9CisKKwkvKiBDb252ZXJ0IHRoZSBBTUwgYnl0ZSBzdHJlYW0gcmVzb3VyY2UgdG8gYSBsb2NhbCByZXNvdXJjZSBzdHJ1Y3QgKi8KKworCXN0YXR1cyA9CisJICAgIGFjcGlfcnNfY29udmVydF9hbWxfdG9fcmVzb3VyY2UocmVzb3VyY2UsCisJCQkJCSAgICBBQ1BJX0NBU1RfUFRSKHVuaW9uIGFtbF9yZXNvdXJjZSwKKwkJCQkJCQkgIGFtbCksCisJCQkJCSAgICBhY3BpX2dibF9nZXRfcmVzb3VyY2VfZGlzcGF0Y2gKKwkJCQkJICAgIFtyZXNvdXJjZV9pbmRleF0pOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlBQ1BJX0VYQ0VQVElPTigoQUVfSU5GTywgc3RhdHVzLAorCQkJCSJDb3VsZCBub3QgY29udmVydCBBTUwgcmVzb3VyY2UgKFR5cGUgJVgpIiwKKwkJCQkqYW1sKSk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworCX0KKworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfUkVTT1VSQ0VTLAorCQkJICAiVHlwZSAlLjJYLCBBbWxMZW5ndGggJS4yWCBJbnRlcm5hbExlbmd0aCAlLjJYXG4iLAorCQkJICBhY3BpX3V0X2dldF9yZXNvdXJjZV90eXBlKGFtbCksIGxlbmd0aCwKKwkJCSAgcmVzb3VyY2UtPmxlbmd0aCkpOworCisJLyogUG9pbnQgdG8gdGhlIG5leHQgc3RydWN0dXJlIGluIHRoZSBvdXRwdXQgYnVmZmVyICovCisKKwkqcmVzb3VyY2VfcHRyID0gQUNQSV9BRERfUFRSKHZvaWQsIHJlc291cmNlLCByZXNvdXJjZS0+bGVuZ3RoKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX3JzX2NvbnZlcnRfcmVzb3VyY2VzX3RvX2FtbAorICoKKyAqIFBBUkFNRVRFUlM6ICBSZXNvdXJjZSAgICAgICAgICAgIC0gUG9pbnRlciB0byB0aGUgcmVzb3VyY2UgbGlua2VkIGxpc3QKKyAqICAgICAgICAgICAgICBhbWxfc2l6ZV9uZWVkZWQgICAgIC0gQ2FsY3VsYXRlZCBzaXplIG9mIHRoZSBieXRlIHN0cmVhbQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWVkZWQgZnJvbSBjYWxsaW5nIGFjcGlfcnNfZ2V0X2FtbF9sZW5ndGgoKQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgc2l6ZSBvZiB0aGUgb3V0cHV0X2J1ZmZlciBpcworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWFyYW50ZWVkIHRvIGJlID49IGFtbF9zaXplX25lZWRlZAorICogICAgICAgICAgICAgIG91dHB1dF9idWZmZXIgICAgICAgLSBQb2ludGVyIHRvIHRoZSBidWZmZXIgdGhhdCB3aWxsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW4gdGhlIGJ5dGUgc3RyZWFtCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBUYWtlcyB0aGUgcmVzb3VyY2UgbGlua2VkIGxpc3QgYW5kIHBhcnNlcyBpdCwgY3JlYXRpbmcgYQorICogICAgICAgICAgICAgIGJ5dGUgc3RyZWFtIG9mIHJlc291cmNlcyBpbiB0aGUgY2FsbGVyJ3Mgb3V0cHV0IGJ1ZmZlcgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2FjcGlfc3RhdHVzCithY3BpX3JzX2NvbnZlcnRfcmVzb3VyY2VzX3RvX2FtbChzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAqcmVzb3VyY2UsCisJCQkJIGFjcGlfc2l6ZSBhbWxfc2l6ZV9uZWVkZWQsIHU4ICogb3V0cHV0X2J1ZmZlcikKK3sKKwl1OCAqYW1sID0gb3V0cHV0X2J1ZmZlcjsKKwl1OCAqZW5kX2FtbCA9IG91dHB1dF9idWZmZXIgKyBhbWxfc2l6ZV9uZWVkZWQ7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCisJQUNQSV9GVU5DVElPTl9UUkFDRShyc19jb252ZXJ0X3Jlc291cmNlc190b19hbWwpOworCisJLyogV2FsayB0aGUgcmVzb3VyY2UgZGVzY3JpcHRvciBsaXN0LCBjb252ZXJ0IGVhY2ggZGVzY3JpcHRvciAqLworCisJd2hpbGUgKGFtbCA8IGVuZF9hbWwpIHsKKworCQkvKiBWYWxpZGF0ZSB0aGUgKGludGVybmFsKSBSZXNvdXJjZSBUeXBlICovCisKKwkJaWYgKHJlc291cmNlLT50eXBlID4gQUNQSV9SRVNPVVJDRV9UWVBFX01BWCkgeworCQkJQUNQSV9FUlJPUigoQUVfSU5GTywKKwkJCQkgICAgIkludmFsaWQgZGVzY3JpcHRvciB0eXBlICglWCkgaW4gcmVzb3VyY2UgbGlzdCIsCisJCQkJICAgIHJlc291cmNlLT50eXBlKSk7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX0RBVEEpOworCQl9CisKKwkJLyogUGVyZm9ybSB0aGUgY29udmVyc2lvbiAqLworCisJCXN0YXR1cyA9IGFjcGlfcnNfY29udmVydF9yZXNvdXJjZV90b19hbWwocmVzb3VyY2UsIEFDUElfQ0FTVF9QVFIodW5pb24KKwkJCQkJCQkJCQkgYW1sX3Jlc291cmNlLAorCQkJCQkJCQkJCSBhbWwpLAorCQkJCQkJCSBhY3BpX2dibF9zZXRfcmVzb3VyY2VfZGlzcGF0Y2gKKwkJCQkJCQkgW3Jlc291cmNlLT50eXBlXSk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJQUNQSV9FWENFUFRJT04oKEFFX0lORk8sIHN0YXR1cywKKwkJCQkJIkNvdWxkIG5vdCBjb252ZXJ0IHJlc291cmNlICh0eXBlICVYKSB0byBBTUwiLAorCQkJCQlyZXNvdXJjZS0+dHlwZSkpOworCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CisJCX0KKworCQkvKiBQZXJmb3JtIGZpbmFsIHNhbml0eSBjaGVjayBvbiB0aGUgbmV3IEFNTCByZXNvdXJjZSBkZXNjcmlwdG9yICovCisKKwkJc3RhdHVzID0KKwkJICAgIGFjcGlfdXRfdmFsaWRhdGVfcmVzb3VyY2UoQUNQSV9DQVNUX1BUUgorCQkJCQkgICAgICAodW5pb24gYW1sX3Jlc291cmNlLCBhbWwpLCBOVUxMKTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKKwkJfQorCisJCS8qIENoZWNrIGZvciBlbmQtb2YtbGlzdCwgbm9ybWFsIGV4aXQgKi8KKworCQlpZiAocmVzb3VyY2UtPnR5cGUgPT0gQUNQSV9SRVNPVVJDRV9UWVBFX0VORF9UQUcpIHsKKworCQkJLyogQW4gRW5kIFRhZyBpbmRpY2F0ZXMgdGhlIGVuZCBvZiB0aGUgaW5wdXQgUmVzb3VyY2UgVGVtcGxhdGUgKi8KKworCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKKwkJfQorCisJCS8qCisJCSAqIEV4dHJhY3QgdGhlIHRvdGFsIGxlbmd0aCBvZiB0aGUgbmV3IGRlc2NyaXB0b3IgYW5kIHNldCB0aGUKKwkJICogQW1sIHRvIHBvaW50IHRvIHRoZSBuZXh0IChvdXRwdXQpIHJlc291cmNlIGRlc2NyaXB0b3IKKwkJICovCisJCWFtbCArPSBhY3BpX3V0X2dldF9kZXNjcmlwdG9yX2xlbmd0aChhbWwpOworCisJCS8qIFBvaW50IHRvIHRoZSBuZXh0IGlucHV0IHJlc291cmNlIGRlc2NyaXB0b3IgKi8KKworCQlyZXNvdXJjZSA9CisJCSAgICBBQ1BJX0FERF9QVFIoc3RydWN0IGFjcGlfcmVzb3VyY2UsIHJlc291cmNlLAorCQkJCSByZXNvdXJjZS0+bGVuZ3RoKTsKKwl9CisKKwkvKiBDb21wbGV0ZWQgYnVmZmVyLCBidXQgZGlkIG5vdCBmaW5kIGFuIGVuZF90YWcgcmVzb3VyY2UgZGVzY3JpcHRvciAqLworCisJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9OT19SRVNPVVJDRV9FTkRfVEFHKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvcnNtZW1vcnkuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvcnNtZW1vcnkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZGM3NmNlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS9yc21lbW9yeS5jCkBAIC0wLDAgKzEsMjM2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIE1vZHVsZSBOYW1lOiByc21lbTI0IC0gTWVtb3J5IHJlc291cmNlIGRlc2NyaXB0b3JzCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDgsIEludGVsIENvcnAuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCisgKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSBhdCBtaW5pbXVtIGEgZGlzY2xhaW1lcgorICogICAgc3Vic3RhbnRpYWxseSBzaW1pbGFyIHRvIHRoZSAiTk8gV0FSUkFOVFkiIGRpc2NsYWltZXIgYmVsb3cKKyAqICAgICgiRGlzY2xhaW1lciIpIGFuZCBhbnkgcmVkaXN0cmlidXRpb24gbXVzdCBiZSBjb25kaXRpb25lZCB1cG9uCisgKiAgICBpbmNsdWRpbmcgYSBzdWJzdGFudGlhbGx5IHNpbWlsYXIgRGlzY2xhaW1lciByZXF1aXJlbWVudCBmb3IgZnVydGhlcgorICogICAgYmluYXJ5IHJlZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzCisgKiAgICBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIE5PIFdBUlJBTlRZCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORworICogSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCisgKi8KKworI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgorI2luY2x1ZGUgImFjY29tbW9uLmgiCisjaW5jbHVkZSAiYWNyZXNyYy5oIgorCisjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9SRVNPVVJDRVMKK0FDUElfTU9EVUxFX05BTUUoInJzbWVtb3J5IikKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBhY3BpX3JzX2NvbnZlcnRfbWVtb3J5MjQKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RydWN0IGFjcGlfcnNjb252ZXJ0X2luZm8gYWNwaV9yc19jb252ZXJ0X21lbW9yeTI0WzRdID0geworCXtBQ1BJX1JTQ19JTklUR0VULCBBQ1BJX1JFU09VUkNFX1RZUEVfTUVNT1JZMjQsCisJIEFDUElfUlNfU0laRShzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9tZW1vcnkyNCksCisJIEFDUElfUlNDX1RBQkxFX1NJWkUoYWNwaV9yc19jb252ZXJ0X21lbW9yeTI0KX0sCisKKwl7QUNQSV9SU0NfSU5JVFNFVCwgQUNQSV9SRVNPVVJDRV9OQU1FX01FTU9SWTI0LAorCSBzaXplb2Yoc3RydWN0IGFtbF9yZXNvdXJjZV9tZW1vcnkyNCksCisJIDB9LAorCisJLyogUmVhZC9Xcml0ZSBiaXQgKi8KKworCXtBQ1BJX1JTQ18xQklURkxBRywgQUNQSV9SU19PRkZTRVQoZGF0YS5tZW1vcnkyNC53cml0ZV9wcm90ZWN0KSwKKwkgQU1MX09GRlNFVChtZW1vcnkyNC5mbGFncyksCisJIDB9LAorCS8qCisJICogVGhlc2UgZmllbGRzIGFyZSBjb250aWd1b3VzIGluIGJvdGggdGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb246CisJICogTWluaW11bSBCYXNlIEFkZHJlc3MKKwkgKiBNYXhpbXVtIEJhc2UgQWRkcmVzcworCSAqIEFkZHJlc3MgQmFzZSBBbGlnbm1lbnQKKwkgKiBSYW5nZSBMZW5ndGgKKwkgKi8KKwl7QUNQSV9SU0NfTU9WRTE2LCBBQ1BJX1JTX09GRlNFVChkYXRhLm1lbW9yeTI0Lm1pbmltdW0pLAorCSBBTUxfT0ZGU0VUKG1lbW9yeTI0Lm1pbmltdW0pLAorCSA0fQorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBhY3BpX3JzX2NvbnZlcnRfbWVtb3J5MzIKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdHJ1Y3QgYWNwaV9yc2NvbnZlcnRfaW5mbyBhY3BpX3JzX2NvbnZlcnRfbWVtb3J5MzJbNF0gPSB7CisJe0FDUElfUlNDX0lOSVRHRVQsIEFDUElfUkVTT1VSQ0VfVFlQRV9NRU1PUlkzMiwKKwkgQUNQSV9SU19TSVpFKHN0cnVjdCBhY3BpX3Jlc291cmNlX21lbW9yeTMyKSwKKwkgQUNQSV9SU0NfVEFCTEVfU0laRShhY3BpX3JzX2NvbnZlcnRfbWVtb3J5MzIpfSwKKworCXtBQ1BJX1JTQ19JTklUU0VULCBBQ1BJX1JFU09VUkNFX05BTUVfTUVNT1JZMzIsCisJIHNpemVvZihzdHJ1Y3QgYW1sX3Jlc291cmNlX21lbW9yeTMyKSwKKwkgMH0sCisKKwkvKiBSZWFkL1dyaXRlIGJpdCAqLworCisJe0FDUElfUlNDXzFCSVRGTEFHLCBBQ1BJX1JTX09GRlNFVChkYXRhLm1lbW9yeTMyLndyaXRlX3Byb3RlY3QpLAorCSBBTUxfT0ZGU0VUKG1lbW9yeTMyLmZsYWdzKSwKKwkgMH0sCisJLyoKKwkgKiBUaGVzZSBmaWVsZHMgYXJlIGNvbnRpZ3VvdXMgaW4gYm90aCB0aGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbjoKKwkgKiBNaW5pbXVtIEJhc2UgQWRkcmVzcworCSAqIE1heGltdW0gQmFzZSBBZGRyZXNzCisJICogQWRkcmVzcyBCYXNlIEFsaWdubWVudAorCSAqIFJhbmdlIExlbmd0aAorCSAqLworCXtBQ1BJX1JTQ19NT1ZFMzIsIEFDUElfUlNfT0ZGU0VUKGRhdGEubWVtb3J5MzIubWluaW11bSksCisJIEFNTF9PRkZTRVQobWVtb3J5MzIubWluaW11bSksCisJIDR9Cit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIGFjcGlfcnNfY29udmVydF9maXhlZF9tZW1vcnkzMgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0cnVjdCBhY3BpX3JzY29udmVydF9pbmZvIGFjcGlfcnNfY29udmVydF9maXhlZF9tZW1vcnkzMls0XSA9IHsKKwl7QUNQSV9SU0NfSU5JVEdFVCwgQUNQSV9SRVNPVVJDRV9UWVBFX0ZJWEVEX01FTU9SWTMyLAorCSBBQ1BJX1JTX1NJWkUoc3RydWN0IGFjcGlfcmVzb3VyY2VfZml4ZWRfbWVtb3J5MzIpLAorCSBBQ1BJX1JTQ19UQUJMRV9TSVpFKGFjcGlfcnNfY29udmVydF9maXhlZF9tZW1vcnkzMil9LAorCisJe0FDUElfUlNDX0lOSVRTRVQsIEFDUElfUkVTT1VSQ0VfTkFNRV9GSVhFRF9NRU1PUlkzMiwKKwkgc2l6ZW9mKHN0cnVjdCBhbWxfcmVzb3VyY2VfZml4ZWRfbWVtb3J5MzIpLAorCSAwfSwKKworCS8qIFJlYWQvV3JpdGUgYml0ICovCisKKwl7QUNQSV9SU0NfMUJJVEZMQUcsIEFDUElfUlNfT0ZGU0VUKGRhdGEuZml4ZWRfbWVtb3J5MzIud3JpdGVfcHJvdGVjdCksCisJIEFNTF9PRkZTRVQoZml4ZWRfbWVtb3J5MzIuZmxhZ3MpLAorCSAwfSwKKwkvKgorCSAqIFRoZXNlIGZpZWxkcyBhcmUgY29udGlndW91cyBpbiBib3RoIHRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uOgorCSAqIEJhc2UgQWRkcmVzcworCSAqIFJhbmdlIExlbmd0aAorCSAqLworCXtBQ1BJX1JTQ19NT1ZFMzIsIEFDUElfUlNfT0ZGU0VUKGRhdGEuZml4ZWRfbWVtb3J5MzIuYWRkcmVzcyksCisJIEFNTF9PRkZTRVQoZml4ZWRfbWVtb3J5MzIuYWRkcmVzcyksCisJIDJ9Cit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIGFjcGlfcnNfZ2V0X3ZlbmRvcl9zbWFsbAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0cnVjdCBhY3BpX3JzY29udmVydF9pbmZvIGFjcGlfcnNfZ2V0X3ZlbmRvcl9zbWFsbFszXSA9IHsKKwl7QUNQSV9SU0NfSU5JVEdFVCwgQUNQSV9SRVNPVVJDRV9UWVBFX1ZFTkRPUiwKKwkgQUNQSV9SU19TSVpFKHN0cnVjdCBhY3BpX3Jlc291cmNlX3ZlbmRvciksCisJIEFDUElfUlNDX1RBQkxFX1NJWkUoYWNwaV9yc19nZXRfdmVuZG9yX3NtYWxsKX0sCisKKwkvKiBMZW5ndGggb2YgdGhlIHZlbmRvciBkYXRhIChieXRlIGNvdW50KSAqLworCisJe0FDUElfUlNDX0NPVU5UMTYsIEFDUElfUlNfT0ZGU0VUKGRhdGEudmVuZG9yLmJ5dGVfbGVuZ3RoKSwKKwkgMCwKKwkgc2l6ZW9mKHU4KX0KKwksCisKKwkvKiBWZW5kb3IgZGF0YSAqLworCisJe0FDUElfUlNDX01PVkU4LCBBQ1BJX1JTX09GRlNFVChkYXRhLnZlbmRvci5ieXRlX2RhdGFbMF0pLAorCSBzaXplb2Yoc3RydWN0IGFtbF9yZXNvdXJjZV9zbWFsbF9oZWFkZXIpLAorCSAwfQorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBhY3BpX3JzX2dldF92ZW5kb3JfbGFyZ2UKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdHJ1Y3QgYWNwaV9yc2NvbnZlcnRfaW5mbyBhY3BpX3JzX2dldF92ZW5kb3JfbGFyZ2VbM10gPSB7CisJe0FDUElfUlNDX0lOSVRHRVQsIEFDUElfUkVTT1VSQ0VfVFlQRV9WRU5ET1IsCisJIEFDUElfUlNfU0laRShzdHJ1Y3QgYWNwaV9yZXNvdXJjZV92ZW5kb3IpLAorCSBBQ1BJX1JTQ19UQUJMRV9TSVpFKGFjcGlfcnNfZ2V0X3ZlbmRvcl9sYXJnZSl9LAorCisJLyogTGVuZ3RoIG9mIHRoZSB2ZW5kb3IgZGF0YSAoYnl0ZSBjb3VudCkgKi8KKworCXtBQ1BJX1JTQ19DT1VOVDE2LCBBQ1BJX1JTX09GRlNFVChkYXRhLnZlbmRvci5ieXRlX2xlbmd0aCksCisJIDAsCisJIHNpemVvZih1OCl9CisJLAorCisJLyogVmVuZG9yIGRhdGEgKi8KKworCXtBQ1BJX1JTQ19NT1ZFOCwgQUNQSV9SU19PRkZTRVQoZGF0YS52ZW5kb3IuYnl0ZV9kYXRhWzBdKSwKKwkgc2l6ZW9mKHN0cnVjdCBhbWxfcmVzb3VyY2VfbGFyZ2VfaGVhZGVyKSwKKwkgMH0KK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogYWNwaV9yc19zZXRfdmVuZG9yCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RydWN0IGFjcGlfcnNjb252ZXJ0X2luZm8gYWNwaV9yc19zZXRfdmVuZG9yWzddID0geworCS8qIERlZmF1bHQgaXMgYSBzbWFsbCB2ZW5kb3IgZGVzY3JpcHRvciAqLworCisJe0FDUElfUlNDX0lOSVRTRVQsIEFDUElfUkVTT1VSQ0VfTkFNRV9WRU5ET1JfU01BTEwsCisJIHNpemVvZihzdHJ1Y3QgYW1sX3Jlc291cmNlX3NtYWxsX2hlYWRlciksCisJIEFDUElfUlNDX1RBQkxFX1NJWkUoYWNwaV9yc19zZXRfdmVuZG9yKX0sCisKKwkvKiBHZXQgdGhlIGxlbmd0aCBhbmQgY29weSB0aGUgZGF0YSAqLworCisJe0FDUElfUlNDX0NPVU5UMTYsIEFDUElfUlNfT0ZGU0VUKGRhdGEudmVuZG9yLmJ5dGVfbGVuZ3RoKSwKKwkgMCwKKwkgMH0sCisKKwl7QUNQSV9SU0NfTU9WRTgsIEFDUElfUlNfT0ZGU0VUKGRhdGEudmVuZG9yLmJ5dGVfZGF0YVswXSksCisJIHNpemVvZihzdHJ1Y3QgYW1sX3Jlc291cmNlX3NtYWxsX2hlYWRlciksCisJIDB9LAorCisJLyoKKwkgKiBBbGwgZG9uZSBpZiB0aGUgVmVuZG9yIGJ5dGUgbGVuZ3RoIGlzIDcgb3IgbGVzcywgbWVhbmluZyB0aGF0IGl0IHdpbGwKKwkgKiBmaXQgd2l0aGluIGEgc21hbGwgZGVzY3JpcHRvcgorCSAqLworCXtBQ1BJX1JTQ19FWElUX0xFLCAwLCAwLCA3fSwKKworCS8qIE11c3QgY3JlYXRlIGEgbGFyZ2UgdmVuZG9yIGRlc2NyaXB0b3IgKi8KKworCXtBQ1BJX1JTQ19JTklUU0VULCBBQ1BJX1JFU09VUkNFX05BTUVfVkVORE9SX0xBUkdFLAorCSBzaXplb2Yoc3RydWN0IGFtbF9yZXNvdXJjZV9sYXJnZV9oZWFkZXIpLAorCSAwfSwKKworCXtBQ1BJX1JTQ19DT1VOVDE2LCBBQ1BJX1JTX09GRlNFVChkYXRhLnZlbmRvci5ieXRlX2xlbmd0aCksCisJIDAsCisJIDB9LAorCisJe0FDUElfUlNDX01PVkU4LCBBQ1BJX1JTX09GRlNFVChkYXRhLnZlbmRvci5ieXRlX2RhdGFbMF0pLAorCSBzaXplb2Yoc3RydWN0IGFtbF9yZXNvdXJjZV9sYXJnZV9oZWFkZXIpLAorCSAwfQorfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvcnNtaXNjLmMgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL3JzbWlzYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViYzQ5YTUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL3JzbWlzYy5jCkBAIC0wLDAgKzEsNTYxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIE1vZHVsZSBOYW1lOiByc21pc2MgLSBNaXNjZWxsYW5lb3VzIHJlc291cmNlIGRlc2NyaXB0b3JzCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDgsIEludGVsIENvcnAuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCisgKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSBhdCBtaW5pbXVtIGEgZGlzY2xhaW1lcgorICogICAgc3Vic3RhbnRpYWxseSBzaW1pbGFyIHRvIHRoZSAiTk8gV0FSUkFOVFkiIGRpc2NsYWltZXIgYmVsb3cKKyAqICAgICgiRGlzY2xhaW1lciIpIGFuZCBhbnkgcmVkaXN0cmlidXRpb24gbXVzdCBiZSBjb25kaXRpb25lZCB1cG9uCisgKiAgICBpbmNsdWRpbmcgYSBzdWJzdGFudGlhbGx5IHNpbWlsYXIgRGlzY2xhaW1lciByZXF1aXJlbWVudCBmb3IgZnVydGhlcgorICogICAgYmluYXJ5IHJlZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzCisgKiAgICBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIE5PIFdBUlJBTlRZCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORworICogSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCisgKi8KKworI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgorI2luY2x1ZGUgImFjY29tbW9uLmgiCisjaW5jbHVkZSAiYWNyZXNyYy5oIgorCisjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9SRVNPVVJDRVMKK0FDUElfTU9EVUxFX05BTUUoInJzbWlzYyIpCisjZGVmaW5lIElOSVRfUkVTT1VSQ0VfVFlQRShpKSAgICAgICBpLT5yZXNvdXJjZV9vZmZzZXQKKyNkZWZpbmUgSU5JVF9SRVNPVVJDRV9MRU5HVEgoaSkgICAgIGktPmFtbF9vZmZzZXQKKyNkZWZpbmUgSU5JVF9UQUJMRV9MRU5HVEgoaSkgICAgICAgIGktPnZhbHVlCisjZGVmaW5lIENPTVBBUkVfT1BDT0RFKGkpICAgICAgICAgICBpLT5yZXNvdXJjZV9vZmZzZXQKKyNkZWZpbmUgQ09NUEFSRV9UQVJHRVQoaSkgICAgICAgICAgIGktPmFtbF9vZmZzZXQKKyNkZWZpbmUgQ09NUEFSRV9WQUxVRShpKSAgICAgICAgICAgIGktPnZhbHVlCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX3JzX2NvbnZlcnRfYW1sX3RvX3Jlc291cmNlCisgKgorICogUEFSQU1FVEVSUzogIFJlc291cmNlICAgICAgICAgICAgLSBQb2ludGVyIHRvIHRoZSByZXNvdXJjZSBkZXNjcmlwdG9yCisgKiAgICAgICAgICAgICAgQW1sICAgICAgICAgICAgICAgICAtIFdoZXJlIHRoZSBBTUwgZGVzY3JpcHRvciBpcyByZXR1cm5lZAorICogICAgICAgICAgICAgIEluZm8gICAgICAgICAgICAgICAgLSBQb2ludGVyIHRvIGFwcHJvcHJpYXRlIGNvbnZlcnNpb24gdGFibGUKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IENvbnZlcnQgYW4gZXh0ZXJuYWwgQU1MIHJlc291cmNlIGRlc2NyaXB0b3IgdG8gdGhlIGNvcnJlc3BvbmRpbmcKKyAqICAgICAgICAgICAgICBpbnRlcm5hbCByZXNvdXJjZSBkZXNjcmlwdG9yCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2FjcGlfc3RhdHVzCithY3BpX3JzX2NvbnZlcnRfYW1sX3RvX3Jlc291cmNlKHN0cnVjdCBhY3BpX3Jlc291cmNlICpyZXNvdXJjZSwKKwkJCQl1bmlvbiBhbWxfcmVzb3VyY2UgKmFtbCwKKwkJCQlzdHJ1Y3QgYWNwaV9yc2NvbnZlcnRfaW5mbyAqaW5mbykKK3sKKwlhY3BpX3JzX2xlbmd0aCBhbWxfcmVzb3VyY2VfbGVuZ3RoOworCXZvaWQgKnNvdXJjZTsKKwl2b2lkICpkZXN0aW5hdGlvbjsKKwljaGFyICp0YXJnZXQ7CisJdTggY291bnQ7CisJdTggZmxhZ3NfbW9kZSA9IEZBTFNFOworCXUxNiBpdGVtX2NvdW50ID0gMDsKKwl1MTYgdGVtcDE2ID0gMDsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0UocnNfY29udmVydF9hbWxfdG9fcmVzb3VyY2UpOworCisJaWYgKCgoYWNwaV9zaXplKSByZXNvdXJjZSkgJiAweDMpIHsKKworCQkvKiBFYWNoIGludGVybmFsIHJlc291cmNlIHN0cnVjdCBpcyBleHBlY3RlZCB0byBiZSAzMi1iaXQgYWxpZ25lZCAqLworCisJCUFDUElfV0FSTklORygoQUVfSU5GTywKKwkJCSAgICAgICJNaXNhbGlnbmVkIHJlc291cmNlIHBvaW50ZXIgKGdldCk6ICVwIFR5cGUgJTIuMlggTGVuICVYIiwKKwkJCSAgICAgIHJlc291cmNlLCByZXNvdXJjZS0+dHlwZSwgcmVzb3VyY2UtPmxlbmd0aCkpOworCX0KKworCS8qIEV4dHJhY3QgdGhlIHJlc291cmNlIExlbmd0aCBmaWVsZCAoZG9lcyBub3QgaW5jbHVkZSBoZWFkZXIgbGVuZ3RoKSAqLworCisJYW1sX3Jlc291cmNlX2xlbmd0aCA9IGFjcGlfdXRfZ2V0X3Jlc291cmNlX2xlbmd0aChhbWwpOworCisJLyoKKwkgKiBGaXJzdCB0YWJsZSBlbnRyeSBtdXN0IGJlIEFDUElfUlNDX0lOSVR4eHggYW5kIG11c3QgY29udGFpbiB0aGUKKwkgKiB0YWJsZSBsZW5ndGggKCMgb2YgdGFibGUgZW50cmllcykKKwkgKi8KKwljb3VudCA9IElOSVRfVEFCTEVfTEVOR1RIKGluZm8pOworCisJd2hpbGUgKGNvdW50KSB7CisJCS8qCisJCSAqIFNvdXJjZSBpcyB0aGUgZXh0ZXJuYWwgQU1MIGJ5dGUgc3RyZWFtIGJ1ZmZlciwKKwkJICogZGVzdGluYXRpb24gaXMgdGhlIGludGVybmFsIHJlc291cmNlIGRlc2NyaXB0b3IKKwkJICovCisJCXNvdXJjZSA9IEFDUElfQUREX1BUUih2b2lkLCBhbWwsIGluZm8tPmFtbF9vZmZzZXQpOworCQlkZXN0aW5hdGlvbiA9CisJCSAgICBBQ1BJX0FERF9QVFIodm9pZCwgcmVzb3VyY2UsIGluZm8tPnJlc291cmNlX29mZnNldCk7CisKKwkJc3dpdGNoIChpbmZvLT5vcGNvZGUpIHsKKwkJY2FzZSBBQ1BJX1JTQ19JTklUR0VUOgorCQkJLyoKKwkJCSAqIEdldCB0aGUgcmVzb3VyY2UgdHlwZSBhbmQgdGhlIGluaXRpYWwgKG1pbmltdW0pIGxlbmd0aAorCQkJICovCisJCQlBQ1BJX01FTVNFVChyZXNvdXJjZSwgMCwgSU5JVF9SRVNPVVJDRV9MRU5HVEgoaW5mbykpOworCQkJcmVzb3VyY2UtPnR5cGUgPSBJTklUX1JFU09VUkNFX1RZUEUoaW5mbyk7CisJCQlyZXNvdXJjZS0+bGVuZ3RoID0gSU5JVF9SRVNPVVJDRV9MRU5HVEgoaW5mbyk7CisJCQlicmVhazsKKworCQljYXNlIEFDUElfUlNDX0lOSVRTRVQ6CisJCQlicmVhazsKKworCQljYXNlIEFDUElfUlNDX0ZMQUdJTklUOgorCisJCQlmbGFnc19tb2RlID0gVFJVRTsKKwkJCWJyZWFrOworCisJCWNhc2UgQUNQSV9SU0NfMUJJVEZMQUc6CisJCQkvKgorCQkJICogTWFzayBhbmQgc2hpZnQgdGhlIGZsYWcgYml0CisJCQkgKi8KKwkJCUFDUElfU0VUOChkZXN0aW5hdGlvbikgPSAodTgpCisJCQkgICAgKChBQ1BJX0dFVDgoc291cmNlKSA+PiBpbmZvLT52YWx1ZSkgJiAweDAxKTsKKwkJCWJyZWFrOworCisJCWNhc2UgQUNQSV9SU0NfMkJJVEZMQUc6CisJCQkvKgorCQkJICogTWFzayBhbmQgc2hpZnQgdGhlIGZsYWcgYml0cworCQkJICovCisJCQlBQ1BJX1NFVDgoZGVzdGluYXRpb24pID0gKHU4KQorCQkJICAgICgoQUNQSV9HRVQ4KHNvdXJjZSkgPj4gaW5mby0+dmFsdWUpICYgMHgwMyk7CisJCQlicmVhazsKKworCQljYXNlIEFDUElfUlNDX0NPVU5UOgorCisJCQlpdGVtX2NvdW50ID0gQUNQSV9HRVQ4KHNvdXJjZSk7CisJCQlBQ1BJX1NFVDgoZGVzdGluYXRpb24pID0gKHU4KSBpdGVtX2NvdW50OworCisJCQlyZXNvdXJjZS0+bGVuZ3RoID0gcmVzb3VyY2UtPmxlbmd0aCArCisJCQkgICAgKGluZm8tPnZhbHVlICogKGl0ZW1fY291bnQgLSAxKSk7CisJCQlicmVhazsKKworCQljYXNlIEFDUElfUlNDX0NPVU5UMTY6CisKKwkJCWl0ZW1fY291bnQgPSBhbWxfcmVzb3VyY2VfbGVuZ3RoOworCQkJQUNQSV9TRVQxNihkZXN0aW5hdGlvbikgPSBpdGVtX2NvdW50OworCisJCQlyZXNvdXJjZS0+bGVuZ3RoID0gcmVzb3VyY2UtPmxlbmd0aCArCisJCQkgICAgKGluZm8tPnZhbHVlICogKGl0ZW1fY291bnQgLSAxKSk7CisJCQlicmVhazsKKworCQljYXNlIEFDUElfUlNDX0xFTkdUSDoKKworCQkJcmVzb3VyY2UtPmxlbmd0aCA9IHJlc291cmNlLT5sZW5ndGggKyBpbmZvLT52YWx1ZTsKKwkJCWJyZWFrOworCisJCWNhc2UgQUNQSV9SU0NfTU9WRTg6CisJCWNhc2UgQUNQSV9SU0NfTU9WRTE2OgorCQljYXNlIEFDUElfUlNDX01PVkUzMjoKKwkJY2FzZSBBQ1BJX1JTQ19NT1ZFNjQ6CisJCQkvKgorCQkJICogUmF3IGRhdGEgbW92ZS4gVXNlIHRoZSBJbmZvIHZhbHVlIGZpZWxkIHVubGVzcyBpdGVtX2NvdW50IGhhcworCQkJICogYmVlbiBwcmV2aW91c2x5IGluaXRpYWxpemVkIHZpYSBhIENPVU5UIG9wY29kZQorCQkJICovCisJCQlpZiAoaW5mby0+dmFsdWUpIHsKKwkJCQlpdGVtX2NvdW50ID0gaW5mby0+dmFsdWU7CisJCQl9CisJCQlhY3BpX3JzX21vdmVfZGF0YShkZXN0aW5hdGlvbiwgc291cmNlLCBpdGVtX2NvdW50LAorCQkJCQkgIGluZm8tPm9wY29kZSk7CisJCQlicmVhazsKKworCQljYXNlIEFDUElfUlNDX1NFVDg6CisKKwkJCUFDUElfTUVNU0VUKGRlc3RpbmF0aW9uLCBpbmZvLT5hbWxfb2Zmc2V0LCBpbmZvLT52YWx1ZSk7CisJCQlicmVhazsKKworCQljYXNlIEFDUElfUlNDX0RBVEE4OgorCisJCQl0YXJnZXQgPSBBQ1BJX0FERF9QVFIoY2hhciwgcmVzb3VyY2UsIGluZm8tPnZhbHVlKTsKKwkJCUFDUElfTUVNQ1BZKGRlc3RpbmF0aW9uLCBzb3VyY2UsIEFDUElfR0VUMTYodGFyZ2V0KSk7CisJCQlicmVhazsKKworCQljYXNlIEFDUElfUlNDX0FERFJFU1M6CisJCQkvKgorCQkJICogQ29tbW9uIGhhbmRsZXIgZm9yIGFkZHJlc3MgZGVzY3JpcHRvciBmbGFncworCQkJICovCisJCQlpZiAoIWFjcGlfcnNfZ2V0X2FkZHJlc3NfY29tbW9uKHJlc291cmNlLCBhbWwpKSB7CisJCQkJcmV0dXJuX0FDUElfU1RBVFVTCisJCQkJICAgIChBRV9BTUxfSU5WQUxJRF9SRVNPVVJDRV9UWVBFKTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgQUNQSV9SU0NfU09VUkNFOgorCQkJLyoKKwkJCSAqIE9wdGlvbmFsIHJlc291cmNlX3NvdXJjZSAoSW5kZXggYW5kIFN0cmluZykKKwkJCSAqLworCQkJcmVzb3VyY2UtPmxlbmd0aCArPQorCQkJICAgIGFjcGlfcnNfZ2V0X3Jlc291cmNlX3NvdXJjZShhbWxfcmVzb3VyY2VfbGVuZ3RoLAorCQkJCQkJCWluZm8tPnZhbHVlLAorCQkJCQkJCWRlc3RpbmF0aW9uLCBhbWwsIE5VTEwpOworCQkJYnJlYWs7CisKKwkJY2FzZSBBQ1BJX1JTQ19TT1VSQ0VYOgorCQkJLyoKKwkJCSAqIE9wdGlvbmFsIHJlc291cmNlX3NvdXJjZSAoSW5kZXggYW5kIFN0cmluZykuIFRoaXMgaXMgdGhlIG1vcmUKKwkJCSAqIGNvbXBsaWNhdGVkIGNhc2UgdXNlZCBieSB0aGUgSW50ZXJydXB0KCkgbWFjcm8KKwkJCSAqLworCQkJdGFyZ2V0ID0KKwkJCSAgICBBQ1BJX0FERF9QVFIoY2hhciwgcmVzb3VyY2UsCisJCQkJCSBpbmZvLT5hbWxfb2Zmc2V0ICsgKGl0ZW1fY291bnQgKiA0KSk7CisKKwkJCXJlc291cmNlLT5sZW5ndGggKz0KKwkJCSAgICBhY3BpX3JzX2dldF9yZXNvdXJjZV9zb3VyY2UoYW1sX3Jlc291cmNlX2xlbmd0aCwKKwkJCQkJCQkoYWNwaV9yc19sZW5ndGgpICgoKGl0ZW1fY291bnQgLSAxKSAqIHNpemVvZih1MzIpKSArIGluZm8tPnZhbHVlKSwgZGVzdGluYXRpb24sIGFtbCwgdGFyZ2V0KTsKKwkJCWJyZWFrOworCisJCWNhc2UgQUNQSV9SU0NfQklUTUFTSzoKKwkJCS8qCisJCQkgKiA4LWJpdCBlbmNvZGVkIGJpdG1hc2sgKERNQSBtYWNybykKKwkJCSAqLworCQkJaXRlbV9jb3VudCA9CisJCQkgICAgYWNwaV9yc19kZWNvZGVfYml0bWFzayhBQ1BJX0dFVDgoc291cmNlKSwKKwkJCQkJCSAgIGRlc3RpbmF0aW9uKTsKKwkJCWlmIChpdGVtX2NvdW50KSB7CisJCQkJcmVzb3VyY2UtPmxlbmd0aCArPSAoaXRlbV9jb3VudCAtIDEpOworCQkJfQorCisJCQl0YXJnZXQgPSBBQ1BJX0FERF9QVFIoY2hhciwgcmVzb3VyY2UsIGluZm8tPnZhbHVlKTsKKwkJCUFDUElfU0VUOCh0YXJnZXQpID0gKHU4KSBpdGVtX2NvdW50OworCQkJYnJlYWs7CisKKwkJY2FzZSBBQ1BJX1JTQ19CSVRNQVNLMTY6CisJCQkvKgorCQkJICogMTYtYml0IGVuY29kZWQgYml0bWFzayAoSVJRIG1hY3JvKQorCQkJICovCisJCQlBQ1BJX01PVkVfMTZfVE9fMTYoJnRlbXAxNiwgc291cmNlKTsKKworCQkJaXRlbV9jb3VudCA9CisJCQkgICAgYWNwaV9yc19kZWNvZGVfYml0bWFzayh0ZW1wMTYsIGRlc3RpbmF0aW9uKTsKKwkJCWlmIChpdGVtX2NvdW50KSB7CisJCQkJcmVzb3VyY2UtPmxlbmd0aCArPSAoaXRlbV9jb3VudCAtIDEpOworCQkJfQorCisJCQl0YXJnZXQgPSBBQ1BJX0FERF9QVFIoY2hhciwgcmVzb3VyY2UsIGluZm8tPnZhbHVlKTsKKwkJCUFDUElfU0VUOCh0YXJnZXQpID0gKHU4KSBpdGVtX2NvdW50OworCQkJYnJlYWs7CisKKwkJY2FzZSBBQ1BJX1JTQ19FWElUX05FOgorCQkJLyoKKwkJCSAqIENvbnRyb2wgLSBFeGl0IGNvbnZlcnNpb24gaWYgbm90IGVxdWFsCisJCQkgKi8KKwkJCXN3aXRjaCAoaW5mby0+cmVzb3VyY2Vfb2Zmc2V0KSB7CisJCQljYXNlIEFDUElfUlNDX0NPTVBBUkVfQU1MX0xFTkdUSDoKKwkJCQlpZiAoYW1sX3Jlc291cmNlX2xlbmd0aCAhPSBpbmZvLT52YWx1ZSkgeworCQkJCQlnb3RvIGV4aXQ7CisJCQkJfQorCQkJCWJyZWFrOworCisJCQljYXNlIEFDUElfUlNDX0NPTVBBUkVfVkFMVUU6CisJCQkJaWYgKEFDUElfR0VUOChzb3VyY2UpICE9IGluZm8tPnZhbHVlKSB7CisJCQkJCWdvdG8gZXhpdDsKKwkJCQl9CisJCQkJYnJlYWs7CisKKwkJCWRlZmF1bHQ6CisKKwkJCQlBQ1BJX0VSUk9SKChBRV9JTkZPLAorCQkJCQkgICAgIkludmFsaWQgY29udmVyc2lvbiBzdWItb3Bjb2RlIikpOworCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfUEFSQU1FVEVSKTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisKKwkJCUFDUElfRVJST1IoKEFFX0lORk8sICJJbnZhbGlkIGNvbnZlcnNpb24gb3Bjb2RlIikpOworCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9QQVJBTUVURVIpOworCQl9CisKKwkJY291bnQtLTsKKwkJaW5mbysrOworCX0KKworICAgICAgZXhpdDoKKwlpZiAoIWZsYWdzX21vZGUpIHsKKworCQkvKiBSb3VuZCB0aGUgcmVzb3VyY2Ugc3RydWN0IGxlbmd0aCB1cCB0byB0aGUgbmV4dCBib3VuZGFyeSAoMzIgb3IgNjQpICovCisKKwkJcmVzb3VyY2UtPmxlbmd0aCA9CisJCSAgICAodTMyKSBBQ1BJX1JPVU5EX1VQX1RPX05BVElWRV9XT1JEKHJlc291cmNlLT5sZW5ndGgpOworCX0KKwlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX3JzX2NvbnZlcnRfcmVzb3VyY2VfdG9fYW1sCisgKgorICogUEFSQU1FVEVSUzogIFJlc291cmNlICAgICAgICAgICAgLSBQb2ludGVyIHRvIHRoZSByZXNvdXJjZSBkZXNjcmlwdG9yCisgKiAgICAgICAgICAgICAgQW1sICAgICAgICAgICAgICAgICAtIFdoZXJlIHRoZSBBTUwgZGVzY3JpcHRvciBpcyByZXR1cm5lZAorICogICAgICAgICAgICAgIEluZm8gICAgICAgICAgICAgICAgLSBQb2ludGVyIHRvIGFwcHJvcHJpYXRlIGNvbnZlcnNpb24gdGFibGUKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IENvbnZlcnQgYW4gaW50ZXJuYWwgcmVzb3VyY2UgZGVzY3JpcHRvciB0byB0aGUgY29ycmVzcG9uZGluZworICogICAgICAgICAgICAgIGV4dGVybmFsIEFNTCByZXNvdXJjZSBkZXNjcmlwdG9yLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2FjcGlfc3RhdHVzCithY3BpX3JzX2NvbnZlcnRfcmVzb3VyY2VfdG9fYW1sKHN0cnVjdCBhY3BpX3Jlc291cmNlICpyZXNvdXJjZSwKKwkJCQl1bmlvbiBhbWxfcmVzb3VyY2UgKmFtbCwKKwkJCQlzdHJ1Y3QgYWNwaV9yc2NvbnZlcnRfaW5mbyAqaW5mbykKK3sKKwl2b2lkICpzb3VyY2UgPSBOVUxMOworCXZvaWQgKmRlc3RpbmF0aW9uOworCWFjcGlfcnNkZXNjX3NpemUgYW1sX2xlbmd0aCA9IDA7CisJdTggY291bnQ7CisJdTE2IHRlbXAxNiA9IDA7CisJdTE2IGl0ZW1fY291bnQgPSAwOworCisJQUNQSV9GVU5DVElPTl9UUkFDRShyc19jb252ZXJ0X3Jlc291cmNlX3RvX2FtbCk7CisKKwkvKgorCSAqIEZpcnN0IHRhYmxlIGVudHJ5IG11c3QgYmUgQUNQSV9SU0NfSU5JVHh4eCBhbmQgbXVzdCBjb250YWluIHRoZQorCSAqIHRhYmxlIGxlbmd0aCAoIyBvZiB0YWJsZSBlbnRyaWVzKQorCSAqLworCWNvdW50ID0gSU5JVF9UQUJMRV9MRU5HVEgoaW5mbyk7CisKKwl3aGlsZSAoY291bnQpIHsKKwkJLyoKKwkJICogU291cmNlIGlzIHRoZSBpbnRlcm5hbCByZXNvdXJjZSBkZXNjcmlwdG9yLAorCQkgKiBkZXN0aW5hdGlvbiBpcyB0aGUgZXh0ZXJuYWwgQU1MIGJ5dGUgc3RyZWFtIGJ1ZmZlcgorCQkgKi8KKwkJc291cmNlID0gQUNQSV9BRERfUFRSKHZvaWQsIHJlc291cmNlLCBpbmZvLT5yZXNvdXJjZV9vZmZzZXQpOworCQlkZXN0aW5hdGlvbiA9IEFDUElfQUREX1BUUih2b2lkLCBhbWwsIGluZm8tPmFtbF9vZmZzZXQpOworCisJCXN3aXRjaCAoaW5mby0+b3Bjb2RlKSB7CisJCWNhc2UgQUNQSV9SU0NfSU5JVFNFVDoKKworCQkJQUNQSV9NRU1TRVQoYW1sLCAwLCBJTklUX1JFU09VUkNFX0xFTkdUSChpbmZvKSk7CisJCQlhbWxfbGVuZ3RoID0gSU5JVF9SRVNPVVJDRV9MRU5HVEgoaW5mbyk7CisJCQlhY3BpX3JzX3NldF9yZXNvdXJjZV9oZWFkZXIoSU5JVF9SRVNPVVJDRV9UWVBFKGluZm8pLAorCQkJCQkJICAgIGFtbF9sZW5ndGgsIGFtbCk7CisJCQlicmVhazsKKworCQljYXNlIEFDUElfUlNDX0lOSVRHRVQ6CisJCQlicmVhazsKKworCQljYXNlIEFDUElfUlNDX0ZMQUdJTklUOgorCQkJLyoKKwkJCSAqIENsZWFyIHRoZSBmbGFnIGJ5dGUKKwkJCSAqLworCQkJQUNQSV9TRVQ4KGRlc3RpbmF0aW9uKSA9IDA7CisJCQlicmVhazsKKworCQljYXNlIEFDUElfUlNDXzFCSVRGTEFHOgorCQkJLyoKKwkJCSAqIE1hc2sgYW5kIHNoaWZ0IHRoZSBmbGFnIGJpdAorCQkJICovCisJCQlBQ1BJX1NFVDgoZGVzdGluYXRpb24pIHw9ICh1OCkKKwkJCSAgICAoKEFDUElfR0VUOChzb3VyY2UpICYgMHgwMSkgPDwgaW5mby0+dmFsdWUpOworCQkJYnJlYWs7CisKKwkJY2FzZSBBQ1BJX1JTQ18yQklURkxBRzoKKwkJCS8qCisJCQkgKiBNYXNrIGFuZCBzaGlmdCB0aGUgZmxhZyBiaXRzCisJCQkgKi8KKwkJCUFDUElfU0VUOChkZXN0aW5hdGlvbikgfD0gKHU4KQorCQkJICAgICgoQUNQSV9HRVQ4KHNvdXJjZSkgJiAweDAzKSA8PCBpbmZvLT52YWx1ZSk7CisJCQlicmVhazsKKworCQljYXNlIEFDUElfUlNDX0NPVU5UOgorCisJCQlpdGVtX2NvdW50ID0gQUNQSV9HRVQ4KHNvdXJjZSk7CisJCQlBQ1BJX1NFVDgoZGVzdGluYXRpb24pID0gKHU4KSBpdGVtX2NvdW50OworCisJCQlhbWxfbGVuZ3RoID0KKwkJCSAgICAodTE2KSAoYW1sX2xlbmd0aCArCisJCQkJICAgKGluZm8tPnZhbHVlICogKGl0ZW1fY291bnQgLSAxKSkpOworCQkJYnJlYWs7CisKKwkJY2FzZSBBQ1BJX1JTQ19DT1VOVDE2OgorCisJCQlpdGVtX2NvdW50ID0gQUNQSV9HRVQxNihzb3VyY2UpOworCQkJYW1sX2xlbmd0aCA9ICh1MTYpIChhbWxfbGVuZ3RoICsgaXRlbV9jb3VudCk7CisJCQlhY3BpX3JzX3NldF9yZXNvdXJjZV9sZW5ndGgoYW1sX2xlbmd0aCwgYW1sKTsKKwkJCWJyZWFrOworCisJCWNhc2UgQUNQSV9SU0NfTEVOR1RIOgorCisJCQlhY3BpX3JzX3NldF9yZXNvdXJjZV9sZW5ndGgoaW5mby0+dmFsdWUsIGFtbCk7CisJCQlicmVhazsKKworCQljYXNlIEFDUElfUlNDX01PVkU4OgorCQljYXNlIEFDUElfUlNDX01PVkUxNjoKKwkJY2FzZSBBQ1BJX1JTQ19NT1ZFMzI6CisJCWNhc2UgQUNQSV9SU0NfTU9WRTY0OgorCisJCQlpZiAoaW5mby0+dmFsdWUpIHsKKwkJCQlpdGVtX2NvdW50ID0gaW5mby0+dmFsdWU7CisJCQl9CisJCQlhY3BpX3JzX21vdmVfZGF0YShkZXN0aW5hdGlvbiwgc291cmNlLCBpdGVtX2NvdW50LAorCQkJCQkgIGluZm8tPm9wY29kZSk7CisJCQlicmVhazsKKworCQljYXNlIEFDUElfUlNDX0FERFJFU1M6CisKKwkJCS8qIFNldCB0aGUgUmVzb3VyY2UgVHlwZSwgR2VuZXJhbCBGbGFncywgYW5kIFR5cGUtU3BlY2lmaWMgRmxhZ3MgKi8KKworCQkJYWNwaV9yc19zZXRfYWRkcmVzc19jb21tb24oYW1sLCByZXNvdXJjZSk7CisJCQlicmVhazsKKworCQljYXNlIEFDUElfUlNDX1NPVVJDRVg6CisJCQkvKgorCQkJICogT3B0aW9uYWwgcmVzb3VyY2Vfc291cmNlIChJbmRleCBhbmQgU3RyaW5nKQorCQkJICovCisJCQlhbWxfbGVuZ3RoID0KKwkJCSAgICBhY3BpX3JzX3NldF9yZXNvdXJjZV9zb3VyY2UoYW1sLCAoYWNwaV9yc19sZW5ndGgpCisJCQkJCQkJYW1sX2xlbmd0aCwgc291cmNlKTsKKwkJCWFjcGlfcnNfc2V0X3Jlc291cmNlX2xlbmd0aChhbWxfbGVuZ3RoLCBhbWwpOworCQkJYnJlYWs7CisKKwkJY2FzZSBBQ1BJX1JTQ19TT1VSQ0U6CisJCQkvKgorCQkJICogT3B0aW9uYWwgcmVzb3VyY2Vfc291cmNlIChJbmRleCBhbmQgU3RyaW5nKS4gVGhpcyBpcyB0aGUgbW9yZQorCQkJICogY29tcGxpY2F0ZWQgY2FzZSB1c2VkIGJ5IHRoZSBJbnRlcnJ1cHQoKSBtYWNybworCQkJICovCisJCQlhbWxfbGVuZ3RoID0KKwkJCSAgICBhY3BpX3JzX3NldF9yZXNvdXJjZV9zb3VyY2UoYW1sLCBpbmZvLT52YWx1ZSwKKwkJCQkJCQlzb3VyY2UpOworCQkJYWNwaV9yc19zZXRfcmVzb3VyY2VfbGVuZ3RoKGFtbF9sZW5ndGgsIGFtbCk7CisJCQlicmVhazsKKworCQljYXNlIEFDUElfUlNDX0JJVE1BU0s6CisJCQkvKgorCQkJICogOC1iaXQgZW5jb2RlZCBiaXRtYXNrIChETUEgbWFjcm8pCisJCQkgKi8KKwkJCUFDUElfU0VUOChkZXN0aW5hdGlvbikgPSAodTgpCisJCQkgICAgYWNwaV9yc19lbmNvZGVfYml0bWFzayhzb3VyY2UsCisJCQkJCQkgICAqQUNQSV9BRERfUFRSKHU4LCByZXNvdXJjZSwKKwkJCQkJCQkJIGluZm8tPnZhbHVlKSk7CisJCQlicmVhazsKKworCQljYXNlIEFDUElfUlNDX0JJVE1BU0sxNjoKKwkJCS8qCisJCQkgKiAxNi1iaXQgZW5jb2RlZCBiaXRtYXNrIChJUlEgbWFjcm8pCisJCQkgKi8KKwkJCXRlbXAxNiA9IGFjcGlfcnNfZW5jb2RlX2JpdG1hc2soc291cmNlLAorCQkJCQkJCSpBQ1BJX0FERF9QVFIodTgsCisJCQkJCQkJCSAgICAgIHJlc291cmNlLAorCQkJCQkJCQkgICAgICBpbmZvLT4KKwkJCQkJCQkJICAgICAgdmFsdWUpKTsKKwkJCUFDUElfTU9WRV8xNl9UT18xNihkZXN0aW5hdGlvbiwgJnRlbXAxNik7CisJCQlicmVhazsKKworCQljYXNlIEFDUElfUlNDX0VYSVRfTEU6CisJCQkvKgorCQkJICogQ29udHJvbCAtIEV4aXQgY29udmVyc2lvbiBpZiBsZXNzIHRoYW4gb3IgZXF1YWwKKwkJCSAqLworCQkJaWYgKGl0ZW1fY291bnQgPD0gaW5mby0+dmFsdWUpIHsKKwkJCQlnb3RvIGV4aXQ7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIEFDUElfUlNDX0VYSVRfTkU6CisJCQkvKgorCQkJICogQ29udHJvbCAtIEV4aXQgY29udmVyc2lvbiBpZiBub3QgZXF1YWwKKwkJCSAqLworCQkJc3dpdGNoIChDT01QQVJFX09QQ09ERShpbmZvKSkgeworCQkJY2FzZSBBQ1BJX1JTQ19DT01QQVJFX1ZBTFVFOgorCisJCQkJaWYgKCpBQ1BJX0FERF9QVFIodTgsIHJlc291cmNlLAorCQkJCQkJICBDT01QQVJFX1RBUkdFVChpbmZvKSkgIT0KKwkJCQkgICAgQ09NUEFSRV9WQUxVRShpbmZvKSkgeworCQkJCQlnb3RvIGV4aXQ7CisJCQkJfQorCQkJCWJyZWFrOworCisJCQlkZWZhdWx0OgorCisJCQkJQUNQSV9FUlJPUigoQUVfSU5GTywKKwkJCQkJICAgICJJbnZhbGlkIGNvbnZlcnNpb24gc3ViLW9wY29kZSIpKTsKKwkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX1BBUkFNRVRFUik7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIEFDUElfUlNDX0VYSVRfRVE6CisJCQkvKgorCQkJICogQ29udHJvbCAtIEV4aXQgY29udmVyc2lvbiBpZiBlcXVhbAorCQkJICovCisJCQlpZiAoKkFDUElfQUREX1BUUih1OCwgcmVzb3VyY2UsCisJCQkJCSAgQ09NUEFSRV9UQVJHRVQoaW5mbykpID09CisJCQkgICAgQ09NUEFSRV9WQUxVRShpbmZvKSkgeworCQkJCWdvdG8gZXhpdDsKKwkJCX0KKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisKKwkJCUFDUElfRVJST1IoKEFFX0lORk8sICJJbnZhbGlkIGNvbnZlcnNpb24gb3Bjb2RlIikpOworCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9QQVJBTUVURVIpOworCQl9CisKKwkJY291bnQtLTsKKwkJaW5mbysrOworCX0KKworICAgICAgZXhpdDoKKwlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOworfQorCisjaWYgMAorLyogUHJldmlvdXMgcmVzb3VyY2UgdmFsaWRhdGlvbnMgKi8KKworaWYgKGFtbC0+ZXh0X2FkZHJlc3M2NC5yZXZpc2lvbl9pRCAhPSBBTUxfUkVTT1VSQ0VfRVhURU5ERURfQUREUkVTU19SRVZJU0lPTikgeworCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9TVVBQT1JUKTsKK30KKworaWYgKHJlc291cmNlLT5kYXRhLnN0YXJ0X2RwZi5wZXJmb3JtYW5jZV9yb2J1c3RuZXNzID49IDMpIHsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX0JBRF9SRVNPVVJDRV9WQUxVRSk7Cit9CisKK2lmICgoKGFtbC0+aXJxLmZsYWdzICYgMHgwOSkgPT0gMHgwMCkgfHwgKChhbWwtPmlycS5mbGFncyAmIDB4MDkpID09IDB4MDkpKSB7CisJLyoKKwkgKiBPbmx5IFthY3RpdmVfaGlnaCwgZWRnZV9zZW5zaXRpdmVdIG9yIFthY3RpdmVfbG93LCBsZXZlbF9zZW5zaXRpdmVdCisJICogcG9sYXJpdHkvdHJpZ2dlciBpbnRlcnJ1cHRzIGFyZSBhbGxvd2VkIChBQ1BJIHNwZWMsIHNlY3Rpb24KKwkgKiAiSVJRIEZvcm1hdCIpLCBzbyAweDAwIGFuZCAweDA5IGFyZSBpbGxlZ2FsLgorCSAqLworCUFDUElfRVJST1IoKEFFX0lORk8sCisJCSAgICAiSW52YWxpZCBpbnRlcnJ1cHQgcG9sYXJpdHkvdHJpZ2dlciBpbiByZXNvdXJjZSBsaXN0LCAlWCIsCisJCSAgICBhbWwtPmlycS5mbGFncykpOworCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfREFUQSk7Cit9CisKK3Jlc291cmNlLT5kYXRhLmV4dGVuZGVkX2lycS5pbnRlcnJ1cHRfY291bnQgPSB0ZW1wODsKK2lmICh0ZW1wOCA8IDEpIHsKKworCS8qIE11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgSVJRICovCisKKwlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX0JBRF9SRVNPVVJDRV9MRU5HVEgpOworfQorCitpZiAocmVzb3VyY2UtPmRhdGEuZG1hLnRyYW5zZmVyID09IDB4MDMpIHsKKwlBQ1BJX0VSUk9SKChBRV9JTkZPLCAiSW52YWxpZCBETUEuVHJhbnNmZXIgcHJlZmVyZW5jZSAoMykiKSk7CisJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9EQVRBKTsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS9yc3V0aWxzLmMgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL3JzdXRpbHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzAzZDU5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS9yc3V0aWxzLmMKQEAgLTAsMCArMSw3MjcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogTW9kdWxlIE5hbWU6IHJzdXRpbHMgLSBVdGlsaXRpZXMgZm9yIHRoZSByZXNvdXJjZSBtYW5hZ2VyCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDgsIEludGVsIENvcnAuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCisgKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSBhdCBtaW5pbXVtIGEgZGlzY2xhaW1lcgorICogICAgc3Vic3RhbnRpYWxseSBzaW1pbGFyIHRvIHRoZSAiTk8gV0FSUkFOVFkiIGRpc2NsYWltZXIgYmVsb3cKKyAqICAgICgiRGlzY2xhaW1lciIpIGFuZCBhbnkgcmVkaXN0cmlidXRpb24gbXVzdCBiZSBjb25kaXRpb25lZCB1cG9uCisgKiAgICBpbmNsdWRpbmcgYSBzdWJzdGFudGlhbGx5IHNpbWlsYXIgRGlzY2xhaW1lciByZXF1aXJlbWVudCBmb3IgZnVydGhlcgorICogICAgYmluYXJ5IHJlZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzCisgKiAgICBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIE5PIFdBUlJBTlRZCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORworICogSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCisgKi8KKworI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgorI2luY2x1ZGUgImFjY29tbW9uLmgiCisjaW5jbHVkZSAiYWNuYW1lc3AuaCIKKyNpbmNsdWRlICJhY3Jlc3JjLmgiCisKKyNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX1JFU09VUkNFUworQUNQSV9NT0RVTEVfTkFNRSgicnN1dGlscyIpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfcnNfZGVjb2RlX2JpdG1hc2sKKyAqCisgKiBQQVJBTUVURVJTOiAgTWFzayAgICAgICAgICAgIC0gQml0bWFzayB0byBkZWNvZGUKKyAqICAgICAgICAgICAgICBMaXN0ICAgICAgICAgICAgLSBXaGVyZSB0aGUgY29udmVydGVkIGxpc3QgaXMgcmV0dXJuZWQKKyAqCisgKiBSRVRVUk46ICAgICAgQ291bnQgb2YgYml0cyBzZXQgKGxlbmd0aCBvZiBsaXN0KQorICoKKyAqIERFU0NSSVBUSU9OOiBDb252ZXJ0IGEgYml0IG1hc2sgaW50byBhIGxpc3Qgb2YgdmFsdWVzCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3U4IGFjcGlfcnNfZGVjb2RlX2JpdG1hc2sodTE2IG1hc2ssIHU4ICogbGlzdCkKK3sKKwl1OCBpOworCXU4IGJpdF9jb3VudDsKKworCUFDUElfRlVOQ1RJT05fRU5UUlkoKTsKKworCS8qIERlY29kZSB0aGUgbWFzayBiaXRzICovCisKKwlmb3IgKGkgPSAwLCBiaXRfY291bnQgPSAwOyBtYXNrOyBpKyspIHsKKwkJaWYgKG1hc2sgJiAweDAwMDEpIHsKKwkJCWxpc3RbYml0X2NvdW50XSA9IGk7CisJCQliaXRfY291bnQrKzsKKwkJfQorCisJCW1hc2sgPj49IDE7CisJfQorCisJcmV0dXJuIChiaXRfY291bnQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX3JzX2VuY29kZV9iaXRtYXNrCisgKgorICogUEFSQU1FVEVSUzogIExpc3QgICAgICAgICAgICAtIExpc3Qgb2YgdmFsdWVzIHRvIGVuY29kZQorICogICAgICAgICAgICAgIENvdW50ICAgICAgICAgICAtIExlbmd0aCBvZiBsaXN0CisgKgorICogUkVUVVJOOiAgICAgIEVuY29kZWQgYml0bWFzaworICoKKyAqIERFU0NSSVBUSU9OOiBDb252ZXJ0IGEgbGlzdCBvZiB2YWx1ZXMgdG8gYW4gZW5jb2RlZCBiaXRtYXNrCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordTE2IGFjcGlfcnNfZW5jb2RlX2JpdG1hc2sodTggKiBsaXN0LCB1OCBjb3VudCkKK3sKKwl1MzIgaTsKKwl1MTYgbWFzazsKKworCUFDUElfRlVOQ1RJT05fRU5UUlkoKTsKKworCS8qIEVuY29kZSB0aGUgbGlzdCBpbnRvIGEgc2luZ2xlIGJpdG1hc2sgKi8KKworCWZvciAoaSA9IDAsIG1hc2sgPSAwOyBpIDwgY291bnQ7IGkrKykgeworCQltYXNrIHw9ICgweDEgPDwgbGlzdFtpXSk7CisJfQorCisJcmV0dXJuIG1hc2s7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfcnNfbW92ZV9kYXRhCisgKgorICogUEFSQU1FVEVSUzogIERlc3RpbmF0aW9uICAgICAgICAgLSBQb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBkZXNjcmlwdG9yCisgKiAgICAgICAgICAgICAgU291cmNlICAgICAgICAgICAgICAtIFBvaW50ZXIgdG8gdGhlIHNvdXJjZSBkZXNjcmlwdG9yCisgKiAgICAgICAgICAgICAgaXRlbV9jb3VudCAgICAgICAgICAtIEhvdyBtYW55IGl0ZW1zIHRvIG1vdmUKKyAqICAgICAgICAgICAgICBtb3ZlX3R5cGUgICAgICAgICAgIC0gQnl0ZSB3aWR0aAorICoKKyAqIFJFVFVSTjogICAgICBOb25lCisgKgorICogREVTQ1JJUFRJT046IE1vdmUgbXVsdGlwbGUgZGF0YSBpdGVtcyBmcm9tIG9uZSBkZXNjcmlwdG9yIHRvIGFub3RoZXIuIEhhbmRsZXMKKyAqICAgICAgICAgICAgICBhbGlnbm1lbnQgaXNzdWVzIGFuZCBlbmRpYW4gaXNzdWVzIGlmIG5lY2Vzc2FyeSwgYXMgY29uZmlndXJlZAorICogICAgICAgICAgICAgIHZpYSB0aGUgQUNQSV9NT1ZFXyogbWFjcm9zLiAoVGhpcyBpcyB3aHkgYSBtZW1jcHkgaXMgbm90IHVzZWQpCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZAorYWNwaV9yc19tb3ZlX2RhdGEodm9pZCAqZGVzdGluYXRpb24sIHZvaWQgKnNvdXJjZSwgdTE2IGl0ZW1fY291bnQsIHU4IG1vdmVfdHlwZSkKK3sKKwl1MzIgaTsKKworCUFDUElfRlVOQ1RJT05fRU5UUlkoKTsKKworCS8qIE9uZSBtb3ZlIHBlciBpdGVtICovCisKKwlmb3IgKGkgPSAwOyBpIDwgaXRlbV9jb3VudDsgaSsrKSB7CisJCXN3aXRjaCAobW92ZV90eXBlKSB7CisJCQkvKgorCQkJICogRm9yIHRoZSA4LWJpdCBjYXNlLCB3ZSBjYW4gcGVyZm9ybSB0aGUgbW92ZSBhbGwgYXQgb25jZQorCQkJICogc2luY2UgdGhlcmUgYXJlIG5vIGFsaWdubWVudCBvciBlbmRpYW4gaXNzdWVzCisJCQkgKi8KKwkJY2FzZSBBQ1BJX1JTQ19NT1ZFODoKKwkJCUFDUElfTUVNQ1BZKGRlc3RpbmF0aW9uLCBzb3VyY2UsIGl0ZW1fY291bnQpOworCQkJcmV0dXJuOworCisJCQkvKgorCQkJICogMTYtLCAzMi0sIGFuZCA2NC1iaXQgY2FzZXMgbXVzdCB1c2UgdGhlIG1vdmUgbWFjcm9zIHRoYXQgcGVyZm9ybQorCQkJICogZW5kaWFuIGNvbnZlcnNpb24gYW5kL29yIGFjY29tb2RhdGUgaGFyZHdhcmUgdGhhdCBjYW5ub3QgcGVyZm9ybQorCQkJICogbWlzYWxpZ25lZCBtZW1vcnkgdHJhbnNmZXJzCisJCQkgKi8KKwkJY2FzZSBBQ1BJX1JTQ19NT1ZFMTY6CisJCQlBQ1BJX01PVkVfMTZfVE9fMTYoJkFDUElfQ0FTVF9QVFIodTE2LCBkZXN0aW5hdGlvbilbaV0sCisJCQkJCSAgICZBQ1BJX0NBU1RfUFRSKHUxNiwgc291cmNlKVtpXSk7CisJCQlicmVhazsKKworCQljYXNlIEFDUElfUlNDX01PVkUzMjoKKwkJCUFDUElfTU9WRV8zMl9UT18zMigmQUNQSV9DQVNUX1BUUih1MzIsIGRlc3RpbmF0aW9uKVtpXSwKKwkJCQkJICAgJkFDUElfQ0FTVF9QVFIodTMyLCBzb3VyY2UpW2ldKTsKKwkJCWJyZWFrOworCisJCWNhc2UgQUNQSV9SU0NfTU9WRTY0OgorCQkJQUNQSV9NT1ZFXzY0X1RPXzY0KCZBQ1BJX0NBU1RfUFRSKHU2NCwgZGVzdGluYXRpb24pW2ldLAorCQkJCQkgICAmQUNQSV9DQVNUX1BUUih1NjQsIHNvdXJjZSlbaV0pOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCXJldHVybjsKKwkJfQorCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9yc19zZXRfcmVzb3VyY2VfbGVuZ3RoCisgKgorICogUEFSQU1FVEVSUzogIHRvdGFsX2xlbmd0aCAgICAgICAgLSBMZW5ndGggb2YgdGhlIEFNTCBkZXNjcmlwdG9yLCBpbmNsdWRpbmcKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGhlYWRlciBhbmQgbGVuZ3RoIGZpZWxkcy4KKyAqICAgICAgICAgICAgICBBbWwgICAgICAgICAgICAgICAgIC0gUG9pbnRlciB0byB0aGUgcmF3IEFNTCBkZXNjcmlwdG9yCisgKgorICogUkVUVVJOOiAgICAgIE5vbmUKKyAqCisgKiBERVNDUklQVElPTjogU2V0IHRoZSByZXNvdXJjZV9sZW5ndGggZmllbGQgb2YgYW4gQU1MCisgKiAgICAgICAgICAgICAgcmVzb3VyY2UgZGVzY3JpcHRvciwgYm90aCBMYXJnZSBhbmQgU21hbGwgZGVzY3JpcHRvcnMgYXJlCisgKiAgICAgICAgICAgICAgc3VwcG9ydGVkIGF1dG9tYXRpY2FsbHkuIE5vdGU6IERlc2NyaXB0b3IgVHlwZSBmaWVsZCBtdXN0CisgKiAgICAgICAgICAgICAgYmUgdmFsaWQuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZAorYWNwaV9yc19zZXRfcmVzb3VyY2VfbGVuZ3RoKGFjcGlfcnNkZXNjX3NpemUgdG90YWxfbGVuZ3RoLAorCQkJICAgIHVuaW9uIGFtbF9yZXNvdXJjZSAqYW1sKQoreworCWFjcGlfcnNfbGVuZ3RoIHJlc291cmNlX2xlbmd0aDsKKworCUFDUElfRlVOQ1RJT05fRU5UUlkoKTsKKworCS8qIExlbmd0aCBpcyB0aGUgdG90YWwgZGVzY3JpcHRvciBsZW5ndGggbWludXMgdGhlIGhlYWRlciBsZW5ndGggKi8KKworCXJlc291cmNlX2xlbmd0aCA9IChhY3BpX3JzX2xlbmd0aCkKKwkgICAgKHRvdGFsX2xlbmd0aCAtIGFjcGlfdXRfZ2V0X3Jlc291cmNlX2hlYWRlcl9sZW5ndGgoYW1sKSk7CisKKwkvKiBMZW5ndGggaXMgc3RvcmVkIGRpZmZlcmVudGx5IGZvciBsYXJnZSBhbmQgc21hbGwgZGVzY3JpcHRvcnMgKi8KKworCWlmIChhbWwtPnNtYWxsX2hlYWRlci5kZXNjcmlwdG9yX3R5cGUgJiBBQ1BJX1JFU09VUkNFX05BTUVfTEFSR0UpIHsKKworCQkvKiBMYXJnZSBkZXNjcmlwdG9yIC0tIGJ5dGVzIDEtMiBjb250YWluIHRoZSAxNi1iaXQgbGVuZ3RoICovCisKKwkJQUNQSV9NT1ZFXzE2X1RPXzE2KCZhbWwtPmxhcmdlX2hlYWRlci5yZXNvdXJjZV9sZW5ndGgsCisJCQkJICAgJnJlc291cmNlX2xlbmd0aCk7CisJfSBlbHNlIHsKKwkJLyogU21hbGwgZGVzY3JpcHRvciAtLSBiaXRzIDI6MCBvZiBieXRlIDAgY29udGFpbiB0aGUgbGVuZ3RoICovCisKKwkJYW1sLT5zbWFsbF9oZWFkZXIuZGVzY3JpcHRvcl90eXBlID0gKHU4KQorCisJCSAgICAvKiBDbGVhciBhbnkgZXhpc3RpbmcgbGVuZ3RoLCBwcmVzZXJ2aW5nIGRlc2NyaXB0b3IgdHlwZSBiaXRzICovCisJCSAgICAoKGFtbC0+c21hbGxfaGVhZGVyLgorCQkgICAgICBkZXNjcmlwdG9yX3R5cGUgJiB+QUNQSV9SRVNPVVJDRV9OQU1FX1NNQUxMX0xFTkdUSF9NQVNLKQorCisJCSAgICAgfCByZXNvdXJjZV9sZW5ndGgpOworCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9yc19zZXRfcmVzb3VyY2VfaGVhZGVyCisgKgorICogUEFSQU1FVEVSUzogIGRlc2NyaXB0b3JfdHlwZSAgICAgLSBCeXRlIHRvIGJlIGluc2VydGVkIGFzIHRoZSB0eXBlCisgKiAgICAgICAgICAgICAgdG90YWxfbGVuZ3RoICAgICAgICAtIExlbmd0aCBvZiB0aGUgQU1MIGRlc2NyaXB0b3IsIGluY2x1ZGluZworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgaGVhZGVyIGFuZCBsZW5ndGggZmllbGRzLgorICogICAgICAgICAgICAgIEFtbCAgICAgICAgICAgICAgICAgLSBQb2ludGVyIHRvIHRoZSByYXcgQU1MIGRlc2NyaXB0b3IKKyAqCisgKiBSRVRVUk46ICAgICAgTm9uZQorICoKKyAqIERFU0NSSVBUSU9OOiBTZXQgdGhlIGRlc2NyaXB0b3JfdHlwZSBhbmQgcmVzb3VyY2VfbGVuZ3RoIGZpZWxkcyBvZiBhbiBBTUwKKyAqICAgICAgICAgICAgICByZXNvdXJjZSBkZXNjcmlwdG9yLCBib3RoIExhcmdlIGFuZCBTbWFsbCBkZXNjcmlwdG9ycyBhcmUKKyAqICAgICAgICAgICAgICBzdXBwb3J0ZWQgYXV0b21hdGljYWxseQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQKK2FjcGlfcnNfc2V0X3Jlc291cmNlX2hlYWRlcih1OCBkZXNjcmlwdG9yX3R5cGUsCisJCQkgICAgYWNwaV9yc2Rlc2Nfc2l6ZSB0b3RhbF9sZW5ndGgsCisJCQkgICAgdW5pb24gYW1sX3Jlc291cmNlICphbWwpCit7CisJQUNQSV9GVU5DVElPTl9FTlRSWSgpOworCisJLyogU2V0IHRoZSBSZXNvdXJjZSBUeXBlICovCisKKwlhbWwtPnNtYWxsX2hlYWRlci5kZXNjcmlwdG9yX3R5cGUgPSBkZXNjcmlwdG9yX3R5cGU7CisKKwkvKiBTZXQgdGhlIFJlc291cmNlIExlbmd0aCAqLworCisJYWNwaV9yc19zZXRfcmVzb3VyY2VfbGVuZ3RoKHRvdGFsX2xlbmd0aCwgYW1sKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9yc19zdHJjcHkKKyAqCisgKiBQQVJBTUVURVJTOiAgRGVzdGluYXRpb24gICAgICAgICAtIFBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIHN0cmluZworICogICAgICAgICAgICAgIFNvdXJjZSAgICAgICAgICAgICAgLSBQb2ludGVyIHRvIHRoZSBzb3VyY2Ugc3RyaW5nCisgKgorICogUkVUVVJOOiAgICAgIFN0cmluZyBsZW5ndGgsIGluY2x1ZGluZyBOVUxMIHRlcm1pbmF0b3IKKyAqCisgKiBERVNDUklQVElPTjogTG9jYWwgc3RyaW5nIGNvcHkgdGhhdCByZXR1cm5zIHRoZSBzdHJpbmcgbGVuZ3RoLCBzYXZpbmcgYQorICogICAgICAgICAgICAgIHN0cmNweSBmb2xsb3dlZCBieSBhIHN0cmxlbi4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdTE2IGFjcGlfcnNfc3RyY3B5KGNoYXIgKmRlc3RpbmF0aW9uLCBjaGFyICpzb3VyY2UpCit7CisJdTE2IGk7CisKKwlBQ1BJX0ZVTkNUSU9OX0VOVFJZKCk7CisKKwlmb3IgKGkgPSAwOyBzb3VyY2VbaV07IGkrKykgeworCQlkZXN0aW5hdGlvbltpXSA9IHNvdXJjZVtpXTsKKwl9CisKKwlkZXN0aW5hdGlvbltpXSA9IDA7CisKKwkvKiBSZXR1cm4gc3RyaW5nIGxlbmd0aCBpbmNsdWRpbmcgdGhlIE5VTEwgdGVybWluYXRvciAqLworCisJcmV0dXJuICgodTE2KSAoaSArIDEpKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9yc19nZXRfcmVzb3VyY2Vfc291cmNlCisgKgorICogUEFSQU1FVEVSUzogIHJlc291cmNlX2xlbmd0aCAgICAgLSBMZW5ndGggZmllbGQgb2YgdGhlIGRlc2NyaXB0b3IKKyAqICAgICAgICAgICAgICBtaW5pbXVtX2xlbmd0aCAgICAgIC0gTWluaW11bSBsZW5ndGggb2YgdGhlIGRlc2NyaXB0b3IgKG1pbnVzCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFueSBvcHRpb25hbCBmaWVsZHMpCisgKiAgICAgICAgICAgICAgcmVzb3VyY2Vfc291cmNlICAgICAtIFdoZXJlIHRoZSByZXNvdXJjZV9zb3VyY2UgaXMgcmV0dXJuZWQKKyAqICAgICAgICAgICAgICBBbWwgICAgICAgICAgICAgICAgIC0gUG9pbnRlciB0byB0aGUgcmF3IEFNTCBkZXNjcmlwdG9yCisgKiAgICAgICAgICAgICAgc3RyaW5nX3B0ciAgICAgICAgICAtIChvcHRpb25hbCkgd2hlcmUgdG8gc3RvcmUgdGhlIGFjdHVhbAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZV9zb3VyY2Ugc3RyaW5nCisgKgorICogUkVUVVJOOiAgICAgIExlbmd0aCBvZiB0aGUgc3RyaW5nIHBsdXMgTlVMTCB0ZXJtaW5hdG9yLCByb3VuZGVkIHVwIHRvIG5hdGl2ZQorICogICAgICAgICAgICAgIHdvcmQgYm91bmRhcnkKKyAqCisgKiBERVNDUklQVElPTjogQ29weSB0aGUgb3B0aW9uYWwgcmVzb3VyY2Vfc291cmNlIGRhdGEgZnJvbSBhIHJhdyBBTUwgZGVzY3JpcHRvcgorICogICAgICAgICAgICAgIHRvIGFuIGludGVybmFsIHJlc291cmNlIGRlc2NyaXB0b3IKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCithY3BpX3JzX2xlbmd0aAorYWNwaV9yc19nZXRfcmVzb3VyY2Vfc291cmNlKGFjcGlfcnNfbGVuZ3RoIHJlc291cmNlX2xlbmd0aCwKKwkJCSAgICBhY3BpX3JzX2xlbmd0aCBtaW5pbXVtX2xlbmd0aCwKKwkJCSAgICBzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9zb3VyY2UgKiByZXNvdXJjZV9zb3VyY2UsCisJCQkgICAgdW5pb24gYW1sX3Jlc291cmNlICogYW1sLCBjaGFyICpzdHJpbmdfcHRyKQoreworCWFjcGlfcnNkZXNjX3NpemUgdG90YWxfbGVuZ3RoOworCXU4ICphbWxfcmVzb3VyY2Vfc291cmNlOworCisJQUNQSV9GVU5DVElPTl9FTlRSWSgpOworCisJdG90YWxfbGVuZ3RoID0KKwkgICAgcmVzb3VyY2VfbGVuZ3RoICsgc2l6ZW9mKHN0cnVjdCBhbWxfcmVzb3VyY2VfbGFyZ2VfaGVhZGVyKTsKKwlhbWxfcmVzb3VyY2Vfc291cmNlID0gQUNQSV9BRERfUFRSKHU4LCBhbWwsIG1pbmltdW1fbGVuZ3RoKTsKKworCS8qCisJICogcmVzb3VyY2Vfc291cmNlIGlzIHByZXNlbnQgaWYgdGhlIGxlbmd0aCBvZiB0aGUgZGVzY3JpcHRvciBpcyBsb25nZXIgdGhhbgorCSAqIHRoZSBtaW5pbXVtIGxlbmd0aC4KKwkgKgorCSAqIE5vdGU6IFNvbWUgcmVzb3VyY2UgZGVzY3JpcHRvcnMgd2lsbCBoYXZlIGFuIGFkZGl0aW9uYWwgbnVsbCwgc28KKwkgKiB3ZSBhZGQgMSB0byB0aGUgbWluaW11bSBsZW5ndGguCisJICovCisJaWYgKHRvdGFsX2xlbmd0aCA+IChhY3BpX3JzZGVzY19zaXplKSAobWluaW11bV9sZW5ndGggKyAxKSkgeworCisJCS8qIEdldCB0aGUgcmVzb3VyY2Vfc291cmNlX2luZGV4ICovCisKKwkJcmVzb3VyY2Vfc291cmNlLT5pbmRleCA9IGFtbF9yZXNvdXJjZV9zb3VyY2VbMF07CisKKwkJcmVzb3VyY2Vfc291cmNlLT5zdHJpbmdfcHRyID0gc3RyaW5nX3B0cjsKKwkJaWYgKCFzdHJpbmdfcHRyKSB7CisJCQkvKgorCQkJICogU3RyaW5nIGRlc3RpbmF0aW9uIHBvaW50ZXIgaXMgbm90IHNwZWNpZmllZDsgU2V0IHRoZSBTdHJpbmcKKwkJCSAqIHBvaW50ZXIgdG8gdGhlIGVuZCBvZiB0aGUgY3VycmVudCByZXNvdXJjZV9zb3VyY2Ugc3RydWN0dXJlLgorCQkJICovCisJCQlyZXNvdXJjZV9zb3VyY2UtPnN0cmluZ19wdHIgPQorCQkJICAgIEFDUElfQUREX1BUUihjaGFyLCByZXNvdXJjZV9zb3VyY2UsCisJCQkJCSBzaXplb2Yoc3RydWN0IGFjcGlfcmVzb3VyY2Vfc291cmNlKSk7CisJCX0KKworCQkvKgorCQkgKiBJbiBvcmRlciBmb3IgdGhlIFJlc291cmNlIGxlbmd0aCB0byBiZSBhIG11bHRpcGxlIG9mIHRoZSBuYXRpdmUKKwkJICogd29yZCwgY2FsY3VsYXRlIHRoZSBsZW5ndGggb2YgdGhlIHN0cmluZyAoKzEgZm9yIE5VTEwgdGVybWluYXRvcikKKwkJICogYW5kIGV4cGFuZCB0byB0aGUgbmV4dCB3b3JkIG11bHRpcGxlLgorCQkgKgorCQkgKiBaZXJvIHRoZSBlbnRpcmUgYXJlYSBvZiB0aGUgYnVmZmVyLgorCQkgKi8KKwkJdG90YWxfbGVuZ3RoID0gKHUzMikKKwkJQUNQSV9TVFJMRU4oQUNQSV9DQVNUX1BUUihjaGFyLCAmYW1sX3Jlc291cmNlX3NvdXJjZVsxXSkpICsgMTsKKwkJdG90YWxfbGVuZ3RoID0gKHUzMikgQUNQSV9ST1VORF9VUF9UT19OQVRJVkVfV09SRCh0b3RhbF9sZW5ndGgpOworCisJCUFDUElfTUVNU0VUKHJlc291cmNlX3NvdXJjZS0+c3RyaW5nX3B0ciwgMCwgdG90YWxfbGVuZ3RoKTsKKworCQkvKiBDb3B5IHRoZSByZXNvdXJjZV9zb3VyY2Ugc3RyaW5nIHRvIHRoZSBkZXN0aW5hdGlvbiAqLworCisJCXJlc291cmNlX3NvdXJjZS0+c3RyaW5nX2xlbmd0aCA9CisJCSAgICBhY3BpX3JzX3N0cmNweShyZXNvdXJjZV9zb3VyY2UtPnN0cmluZ19wdHIsCisJCQkJICAgQUNQSV9DQVNUX1BUUihjaGFyLAorCQkJCQkJICZhbWxfcmVzb3VyY2Vfc291cmNlWzFdKSk7CisKKwkJcmV0dXJuICgoYWNwaV9yc19sZW5ndGgpIHRvdGFsX2xlbmd0aCk7CisJfQorCisJLyogcmVzb3VyY2Vfc291cmNlIGlzIG5vdCBwcmVzZW50ICovCisKKwlyZXNvdXJjZV9zb3VyY2UtPmluZGV4ID0gMDsKKwlyZXNvdXJjZV9zb3VyY2UtPnN0cmluZ19sZW5ndGggPSAwOworCXJlc291cmNlX3NvdXJjZS0+c3RyaW5nX3B0ciA9IE5VTEw7CisJcmV0dXJuICgwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9yc19zZXRfcmVzb3VyY2Vfc291cmNlCisgKgorICogUEFSQU1FVEVSUzogIEFtbCAgICAgICAgICAgICAgICAgLSBQb2ludGVyIHRvIHRoZSByYXcgQU1MIGRlc2NyaXB0b3IKKyAqICAgICAgICAgICAgICBtaW5pbXVtX2xlbmd0aCAgICAgIC0gTWluaW11bSBsZW5ndGggb2YgdGhlIGRlc2NyaXB0b3IgKG1pbnVzCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFueSBvcHRpb25hbCBmaWVsZHMpCisgKiAgICAgICAgICAgICAgcmVzb3VyY2Vfc291cmNlICAgICAtIEludGVybmFsIHJlc291cmNlX3NvdXJjZQorCisgKgorICogUkVUVVJOOiAgICAgIFRvdGFsIGxlbmd0aCBvZiB0aGUgQU1MIGRlc2NyaXB0b3IKKyAqCisgKiBERVNDUklQVElPTjogQ29udmVydCBhbiBvcHRpb25hbCByZXNvdXJjZV9zb3VyY2UgZnJvbSBpbnRlcm5hbCBmb3JtYXQgdG8gYQorICogICAgICAgICAgICAgIHJhdyBBTUwgcmVzb3VyY2UgZGVzY3JpcHRvcgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2FjcGlfcnNkZXNjX3NpemUKK2FjcGlfcnNfc2V0X3Jlc291cmNlX3NvdXJjZSh1bmlvbiBhbWxfcmVzb3VyY2UgKiBhbWwsCisJCQkgICAgYWNwaV9yc19sZW5ndGggbWluaW11bV9sZW5ndGgsCisJCQkgICAgc3RydWN0IGFjcGlfcmVzb3VyY2Vfc291cmNlICogcmVzb3VyY2Vfc291cmNlKQoreworCXU4ICphbWxfcmVzb3VyY2Vfc291cmNlOworCWFjcGlfcnNkZXNjX3NpemUgZGVzY3JpcHRvcl9sZW5ndGg7CisKKwlBQ1BJX0ZVTkNUSU9OX0VOVFJZKCk7CisKKwlkZXNjcmlwdG9yX2xlbmd0aCA9IG1pbmltdW1fbGVuZ3RoOworCisJLyogTm9uLXplcm8gc3RyaW5nIGxlbmd0aCBpbmRpY2F0ZXMgcHJlc2VuY2Ugb2YgYSByZXNvdXJjZV9zb3VyY2UgKi8KKworCWlmIChyZXNvdXJjZV9zb3VyY2UtPnN0cmluZ19sZW5ndGgpIHsKKworCQkvKiBQb2ludCB0byB0aGUgZW5kIG9mIHRoZSBBTUwgZGVzY3JpcHRvciAqLworCisJCWFtbF9yZXNvdXJjZV9zb3VyY2UgPSBBQ1BJX0FERF9QVFIodTgsIGFtbCwgbWluaW11bV9sZW5ndGgpOworCisJCS8qIENvcHkgdGhlIHJlc291cmNlX3NvdXJjZV9pbmRleCAqLworCisJCWFtbF9yZXNvdXJjZV9zb3VyY2VbMF0gPSAodTgpIHJlc291cmNlX3NvdXJjZS0+aW5kZXg7CisKKwkJLyogQ29weSB0aGUgcmVzb3VyY2Vfc291cmNlIHN0cmluZyAqLworCisJCUFDUElfU1RSQ1BZKEFDUElfQ0FTVF9QVFIoY2hhciwgJmFtbF9yZXNvdXJjZV9zb3VyY2VbMV0pLAorCQkJICAgIHJlc291cmNlX3NvdXJjZS0+c3RyaW5nX3B0cik7CisKKwkJLyoKKwkJICogQWRkIHRoZSBsZW5ndGggb2YgdGhlIHN0cmluZyAoKyAxIGZvciBudWxsIHRlcm1pbmF0b3IpIHRvIHRoZQorCQkgKiBmaW5hbCBkZXNjcmlwdG9yIGxlbmd0aAorCQkgKi8KKwkJZGVzY3JpcHRvcl9sZW5ndGggKz0KKwkJICAgICgoYWNwaV9yc2Rlc2Nfc2l6ZSkgcmVzb3VyY2Vfc291cmNlLT5zdHJpbmdfbGVuZ3RoICsgMSk7CisJfQorCisJLyogUmV0dXJuIHRoZSBuZXcgdG90YWwgbGVuZ3RoIG9mIHRoZSBBTUwgZGVzY3JpcHRvciAqLworCisJcmV0dXJuIChkZXNjcmlwdG9yX2xlbmd0aCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfcnNfZ2V0X3BydF9tZXRob2RfZGF0YQorICoKKyAqIFBBUkFNRVRFUlM6ICBOb2RlICAgICAgICAgICAgLSBEZXZpY2Ugbm9kZQorICogICAgICAgICAgICAgIHJldF9idWZmZXIgICAgICAtIFBvaW50ZXIgdG8gYSBidWZmZXIgc3RydWN0dXJlIGZvciB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBnZXQgdGhlIF9QUlQgdmFsdWUgb2YgYW4gb2JqZWN0CisgKiAgICAgICAgICAgICAgY29udGFpbmVkIGluIGFuIG9iamVjdCBzcGVjaWZpZWQgYnkgdGhlIGhhbmRsZSBwYXNzZWQgaW4KKyAqCisgKiAgICAgICAgICAgICAgSWYgdGhlIGZ1bmN0aW9uIGZhaWxzIGFuIGFwcHJvcHJpYXRlIHN0YXR1cyB3aWxsIGJlIHJldHVybmVkCisgKiAgICAgICAgICAgICAgYW5kIHRoZSBjb250ZW50cyBvZiB0aGUgY2FsbGVycyBidWZmZXIgaXMgdW5kZWZpbmVkLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2FjcGlfc3RhdHVzCithY3BpX3JzX2dldF9wcnRfbWV0aG9kX2RhdGEoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKiBub2RlLAorCQkJICAgIHN0cnVjdCBhY3BpX2J1ZmZlciAqIHJldF9idWZmZXIpCit7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2M7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCisJQUNQSV9GVU5DVElPTl9UUkFDRShyc19nZXRfcHJ0X21ldGhvZF9kYXRhKTsKKworCS8qIFBhcmFtZXRlcnMgZ3VhcmFudGVlZCB2YWxpZCBieSBjYWxsZXIgKi8KKworCS8qIEV4ZWN1dGUgdGhlIG1ldGhvZCwgbm8gcGFyYW1ldGVycyAqLworCisJc3RhdHVzID0gYWNwaV91dF9ldmFsdWF0ZV9vYmplY3Qobm9kZSwgTUVUSE9EX05BTUVfX1BSVCwKKwkJCQkJIEFDUElfQlRZUEVfUEFDS0FHRSwgJm9ial9kZXNjKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CisJfQorCisJLyoKKwkgKiBDcmVhdGUgYSByZXNvdXJjZSBsaW5rZWQgbGlzdCBmcm9tIHRoZSBieXRlIHN0cmVhbSBidWZmZXIgdGhhdCBjb21lcworCSAqIGJhY2sgZnJvbSB0aGUgX0NSUyBtZXRob2QgZXhlY3V0aW9uLgorCSAqLworCXN0YXR1cyA9IGFjcGlfcnNfY3JlYXRlX3BjaV9yb3V0aW5nX3RhYmxlKG9ial9kZXNjLCByZXRfYnVmZmVyKTsKKworCS8qIE9uIGV4aXQsIHdlIG11c3QgZGVsZXRlIHRoZSBvYmplY3QgcmV0dXJuZWQgYnkgZXZhbHVhdGVfb2JqZWN0ICovCisKKwlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2Uob2JqX2Rlc2MpOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX3JzX2dldF9jcnNfbWV0aG9kX2RhdGEKKyAqCisgKiBQQVJBTUVURVJTOiAgTm9kZSAgICAgICAgICAgIC0gRGV2aWNlIG5vZGUKKyAqICAgICAgICAgICAgICByZXRfYnVmZmVyICAgICAgLSBQb2ludGVyIHRvIGEgYnVmZmVyIHN0cnVjdHVyZSBmb3IgdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cworICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gZ2V0IHRoZSBfQ1JTIHZhbHVlIG9mIGFuIG9iamVjdAorICogICAgICAgICAgICAgIGNvbnRhaW5lZCBpbiBhbiBvYmplY3Qgc3BlY2lmaWVkIGJ5IHRoZSBoYW5kbGUgcGFzc2VkIGluCisgKgorICogICAgICAgICAgICAgIElmIHRoZSBmdW5jdGlvbiBmYWlscyBhbiBhcHByb3ByaWF0ZSBzdGF0dXMgd2lsbCBiZSByZXR1cm5lZAorICogICAgICAgICAgICAgIGFuZCB0aGUgY29udGVudHMgb2YgdGhlIGNhbGxlcnMgYnVmZmVyIGlzIHVuZGVmaW5lZC4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCithY3BpX3N0YXR1cworYWNwaV9yc19nZXRfY3JzX21ldGhvZF9kYXRhKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlLAorCQkJICAgIHN0cnVjdCBhY3BpX2J1ZmZlciAqcmV0X2J1ZmZlcikKK3sKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYzsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKHJzX2dldF9jcnNfbWV0aG9kX2RhdGEpOworCisJLyogUGFyYW1ldGVycyBndWFyYW50ZWVkIHZhbGlkIGJ5IGNhbGxlciAqLworCisJLyogRXhlY3V0ZSB0aGUgbWV0aG9kLCBubyBwYXJhbWV0ZXJzICovCisKKwlzdGF0dXMgPSBhY3BpX3V0X2V2YWx1YXRlX29iamVjdChub2RlLCBNRVRIT0RfTkFNRV9fQ1JTLAorCQkJCQkgQUNQSV9CVFlQRV9CVUZGRVIsICZvYmpfZGVzYyk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworCX0KKworCS8qCisJICogTWFrZSB0aGUgY2FsbCB0byBjcmVhdGUgYSByZXNvdXJjZSBsaW5rZWQgbGlzdCBmcm9tIHRoZQorCSAqIGJ5dGUgc3RyZWFtIGJ1ZmZlciB0aGF0IGNvbWVzIGJhY2sgZnJvbSB0aGUgX0NSUyBtZXRob2QKKwkgKiBleGVjdXRpb24uCisJICovCisJc3RhdHVzID0gYWNwaV9yc19jcmVhdGVfcmVzb3VyY2VfbGlzdChvYmpfZGVzYywgcmV0X2J1ZmZlcik7CisKKwkvKiBPbiBleGl0LCB3ZSBtdXN0IGRlbGV0ZSB0aGUgb2JqZWN0IHJldHVybmVkIGJ5IGV2YWx1YXRlX29iamVjdCAqLworCisJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKG9ial9kZXNjKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9yc19nZXRfcHJzX21ldGhvZF9kYXRhCisgKgorICogUEFSQU1FVEVSUzogIE5vZGUgICAgICAgICAgICAtIERldmljZSBub2RlCisgKiAgICAgICAgICAgICAgcmV0X2J1ZmZlciAgICAgIC0gUG9pbnRlciB0byBhIGJ1ZmZlciBzdHJ1Y3R1cmUgZm9yIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGdldCB0aGUgX1BSUyB2YWx1ZSBvZiBhbiBvYmplY3QKKyAqICAgICAgICAgICAgICBjb250YWluZWQgaW4gYW4gb2JqZWN0IHNwZWNpZmllZCBieSB0aGUgaGFuZGxlIHBhc3NlZCBpbgorICoKKyAqICAgICAgICAgICAgICBJZiB0aGUgZnVuY3Rpb24gZmFpbHMgYW4gYXBwcm9wcmlhdGUgc3RhdHVzIHdpbGwgYmUgcmV0dXJuZWQKKyAqICAgICAgICAgICAgICBhbmQgdGhlIGNvbnRlbnRzIG9mIHRoZSBjYWxsZXJzIGJ1ZmZlciBpcyB1bmRlZmluZWQuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmZGVmIEFDUElfRlVUVVJFX1VTQUdFCithY3BpX3N0YXR1cworYWNwaV9yc19nZXRfcHJzX21ldGhvZF9kYXRhKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlLAorCQkJICAgIHN0cnVjdCBhY3BpX2J1ZmZlciAqcmV0X2J1ZmZlcikKK3sKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYzsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKHJzX2dldF9wcnNfbWV0aG9kX2RhdGEpOworCisJLyogUGFyYW1ldGVycyBndWFyYW50ZWVkIHZhbGlkIGJ5IGNhbGxlciAqLworCisJLyogRXhlY3V0ZSB0aGUgbWV0aG9kLCBubyBwYXJhbWV0ZXJzICovCisKKwlzdGF0dXMgPSBhY3BpX3V0X2V2YWx1YXRlX29iamVjdChub2RlLCBNRVRIT0RfTkFNRV9fUFJTLAorCQkJCQkgQUNQSV9CVFlQRV9CVUZGRVIsICZvYmpfZGVzYyk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworCX0KKworCS8qCisJICogTWFrZSB0aGUgY2FsbCB0byBjcmVhdGUgYSByZXNvdXJjZSBsaW5rZWQgbGlzdCBmcm9tIHRoZQorCSAqIGJ5dGUgc3RyZWFtIGJ1ZmZlciB0aGF0IGNvbWVzIGJhY2sgZnJvbSB0aGUgX0NSUyBtZXRob2QKKwkgKiBleGVjdXRpb24uCisJICovCisJc3RhdHVzID0gYWNwaV9yc19jcmVhdGVfcmVzb3VyY2VfbGlzdChvYmpfZGVzYywgcmV0X2J1ZmZlcik7CisKKwkvKiBPbiBleGl0LCB3ZSBtdXN0IGRlbGV0ZSB0aGUgb2JqZWN0IHJldHVybmVkIGJ5IGV2YWx1YXRlX29iamVjdCAqLworCisJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKG9ial9kZXNjKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKK30KKyNlbmRpZgkJCQkvKiAgQUNQSV9GVVRVUkVfVVNBR0UgICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfcnNfZ2V0X21ldGhvZF9kYXRhCisgKgorICogUEFSQU1FVEVSUzogIEhhbmRsZSAgICAgICAgICAtIEhhbmRsZSB0byB0aGUgY29udGFpbmluZyBvYmplY3QKKyAqICAgICAgICAgICAgICBQYXRoICAgICAgICAgICAgLSBQYXRoIHRvIG1ldGhvZCwgcmVsYXRpdmUgdG8gSGFuZGxlCisgKiAgICAgICAgICAgICAgcmV0X2J1ZmZlciAgICAgIC0gUG9pbnRlciB0byBhIGJ1ZmZlciBzdHJ1Y3R1cmUgZm9yIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGdldCB0aGUgX0NSUyBvciBfUFJTIHZhbHVlIG9mIGFuCisgKiAgICAgICAgICAgICAgb2JqZWN0IGNvbnRhaW5lZCBpbiBhbiBvYmplY3Qgc3BlY2lmaWVkIGJ5IHRoZSBoYW5kbGUgcGFzc2VkIGluCisgKgorICogICAgICAgICAgICAgIElmIHRoZSBmdW5jdGlvbiBmYWlscyBhbiBhcHByb3ByaWF0ZSBzdGF0dXMgd2lsbCBiZSByZXR1cm5lZAorICogICAgICAgICAgICAgIGFuZCB0aGUgY29udGVudHMgb2YgdGhlIGNhbGxlcnMgYnVmZmVyIGlzIHVuZGVmaW5lZC4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCithY3BpX3N0YXR1cworYWNwaV9yc19nZXRfbWV0aG9kX2RhdGEoYWNwaV9oYW5kbGUgaGFuZGxlLAorCQkJY2hhciAqcGF0aCwgc3RydWN0IGFjcGlfYnVmZmVyICpyZXRfYnVmZmVyKQoreworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0UocnNfZ2V0X21ldGhvZF9kYXRhKTsKKworCS8qIFBhcmFtZXRlcnMgZ3VhcmFudGVlZCB2YWxpZCBieSBjYWxsZXIgKi8KKworCS8qIEV4ZWN1dGUgdGhlIG1ldGhvZCwgbm8gcGFyYW1ldGVycyAqLworCisJc3RhdHVzID0KKwkgICAgYWNwaV91dF9ldmFsdWF0ZV9vYmplY3QoaGFuZGxlLCBwYXRoLCBBQ1BJX0JUWVBFX0JVRkZFUiwgJm9ial9kZXNjKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CisJfQorCisJLyoKKwkgKiBNYWtlIHRoZSBjYWxsIHRvIGNyZWF0ZSBhIHJlc291cmNlIGxpbmtlZCBsaXN0IGZyb20gdGhlCisJICogYnl0ZSBzdHJlYW0gYnVmZmVyIHRoYXQgY29tZXMgYmFjayBmcm9tIHRoZSBtZXRob2QKKwkgKiBleGVjdXRpb24uCisJICovCisJc3RhdHVzID0gYWNwaV9yc19jcmVhdGVfcmVzb3VyY2VfbGlzdChvYmpfZGVzYywgcmV0X2J1ZmZlcik7CisKKwkvKiBPbiBleGl0LCB3ZSBtdXN0IGRlbGV0ZSB0aGUgb2JqZWN0IHJldHVybmVkIGJ5IGV2YWx1YXRlX29iamVjdCAqLworCisJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKG9ial9kZXNjKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9yc19zZXRfc3JzX21ldGhvZF9kYXRhCisgKgorICogUEFSQU1FVEVSUzogIE5vZGUgICAgICAgICAgICAtIERldmljZSBub2RlCisgKiAgICAgICAgICAgICAgaW5fYnVmZmVyICAgICAgIC0gUG9pbnRlciB0byBhIGJ1ZmZlciBzdHJ1Y3R1cmUgb2YgdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBzZXQgdGhlIF9TUlMgb2YgYW4gb2JqZWN0IGNvbnRhaW5lZAorICogICAgICAgICAgICAgIGluIGFuIG9iamVjdCBzcGVjaWZpZWQgYnkgdGhlIGhhbmRsZSBwYXNzZWQgaW4KKyAqCisgKiAgICAgICAgICAgICAgSWYgdGhlIGZ1bmN0aW9uIGZhaWxzIGFuIGFwcHJvcHJpYXRlIHN0YXR1cyB3aWxsIGJlIHJldHVybmVkCisgKiAgICAgICAgICAgICAgYW5kIHRoZSBjb250ZW50cyBvZiB0aGUgY2FsbGVycyBidWZmZXIgaXMgdW5kZWZpbmVkLgorICoKKyAqIE5vdGU6IFBhcmFtZXRlcnMgZ3VhcmFudGVlZCB2YWxpZCBieSBjYWxsZXIKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCithY3BpX3N0YXR1cworYWNwaV9yc19zZXRfc3JzX21ldGhvZF9kYXRhKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlLAorCQkJICAgIHN0cnVjdCBhY3BpX2J1ZmZlciAqaW5fYnVmZmVyKQoreworCXN0cnVjdCBhY3BpX2V2YWx1YXRlX2luZm8gKmluZm87CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqYXJnc1syXTsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJc3RydWN0IGFjcGlfYnVmZmVyIGJ1ZmZlcjsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0UocnNfc2V0X3Nyc19tZXRob2RfZGF0YSk7CisKKwkvKiBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSB0aGUgZXZhbHVhdGlvbiBpbmZvcm1hdGlvbiBibG9jayAqLworCisJaW5mbyA9IEFDUElfQUxMT0NBVEVfWkVST0VEKHNpemVvZihzdHJ1Y3QgYWNwaV9ldmFsdWF0ZV9pbmZvKSk7CisJaWYgKCFpbmZvKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT19NRU1PUlkpOworCX0KKworCWluZm8tPnByZWZpeF9ub2RlID0gbm9kZTsKKwlpbmZvLT5wYXRobmFtZSA9IE1FVEhPRF9OQU1FX19TUlM7CisJaW5mby0+cGFyYW1ldGVycyA9IGFyZ3M7CisJaW5mby0+ZmxhZ3MgPSBBQ1BJX0lHTk9SRV9SRVRVUk5fVkFMVUU7CisKKwkvKgorCSAqIFRoZSBpbl9idWZmZXIgcGFyYW1ldGVyIHdpbGwgcG9pbnQgdG8gYSBsaW5rZWQgbGlzdCBvZgorCSAqIHJlc291cmNlIHBhcmFtZXRlcnMuIEl0IG5lZWRzIHRvIGJlIGZvcm1hdHRlZCBpbnRvIGEKKwkgKiBieXRlIHN0cmVhbSB0byBiZSBzZW50IGluIGFzIGFuIGlucHV0IHBhcmFtZXRlciB0byBfU1JTCisJICoKKwkgKiBDb252ZXJ0IHRoZSBsaW5rZWQgbGlzdCBpbnRvIGEgYnl0ZSBzdHJlYW0KKwkgKi8KKwlidWZmZXIubGVuZ3RoID0gQUNQSV9BTExPQ0FURV9MT0NBTF9CVUZGRVI7CisJc3RhdHVzID0gYWNwaV9yc19jcmVhdGVfYW1sX3Jlc291cmNlcyhpbl9idWZmZXItPnBvaW50ZXIsICZidWZmZXIpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlnb3RvIGNsZWFudXA7CisJfQorCisJLyogQ3JlYXRlIGFuZCBpbml0aWFsaXplIHRoZSBtZXRob2QgcGFyYW1ldGVyIG9iamVjdCAqLworCisJYXJnc1swXSA9IGFjcGlfdXRfY3JlYXRlX2ludGVybmFsX29iamVjdChBQ1BJX1RZUEVfQlVGRkVSKTsKKwlpZiAoIWFyZ3NbMF0pIHsKKwkJLyoKKwkJICogTXVzdCBmcmVlIHRoZSBidWZmZXIgYWxsb2NhdGVkIGFib3ZlIChvdGhlcndpc2UgaXQgaXMgZnJlZWQKKwkJICogbGF0ZXIpCisJCSAqLworCQlBQ1BJX0ZSRUUoYnVmZmVyLnBvaW50ZXIpOworCQlzdGF0dXMgPSBBRV9OT19NRU1PUlk7CisJCWdvdG8gY2xlYW51cDsKKwl9CisKKwlhcmdzWzBdLT5idWZmZXIubGVuZ3RoID0gKHUzMikgYnVmZmVyLmxlbmd0aDsKKwlhcmdzWzBdLT5idWZmZXIucG9pbnRlciA9IGJ1ZmZlci5wb2ludGVyOworCWFyZ3NbMF0tPmNvbW1vbi5mbGFncyA9IEFPUE9CSl9EQVRBX1ZBTElEOworCWFyZ3NbMV0gPSBOVUxMOworCisJLyogRXhlY3V0ZSB0aGUgbWV0aG9kLCBubyByZXR1cm4gdmFsdWUgaXMgZXhwZWN0ZWQgKi8KKworCXN0YXR1cyA9IGFjcGlfbnNfZXZhbHVhdGUoaW5mbyk7CisKKwkvKiBDbGVhbiB1cCBhbmQgcmV0dXJuIHRoZSBzdGF0dXMgZnJvbSBhY3BpX25zX2V2YWx1YXRlICovCisKKwlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UoYXJnc1swXSk7CisKKyAgICAgIGNsZWFudXA6CisJQUNQSV9GUkVFKGluZm8pOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS9yc3hmYWNlLmMgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL3JzeGZhY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OWEyYWE1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS9yc3hmYWNlLmMKQEAgLTAsMCArMSw1NzEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogTW9kdWxlIE5hbWU6IHJzeGZhY2UgLSBQdWJsaWMgaW50ZXJmYWNlcyB0byB0aGUgcmVzb3VyY2UgbWFuYWdlcgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA4LCBJbnRlbCBDb3JwLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAorICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgYXQgbWluaW11bSBhIGRpc2NsYWltZXIKKyAqICAgIHN1YnN0YW50aWFsbHkgc2ltaWxhciB0byB0aGUgIk5PIFdBUlJBTlRZIiBkaXNjbGFpbWVyIGJlbG93CisgKiAgICAoIkRpc2NsYWltZXIiKSBhbmQgYW55IHJlZGlzdHJpYnV0aW9uIG11c3QgYmUgY29uZGl0aW9uZWQgdXBvbgorICogICAgaW5jbHVkaW5nIGEgc3Vic3RhbnRpYWxseSBzaW1pbGFyIERpc2NsYWltZXIgcmVxdWlyZW1lbnQgZm9yIGZ1cnRoZXIKKyAqICAgIGJpbmFyeSByZWRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcworICogICAgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBOTyBXQVJSQU5UWQorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcKKyAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgorICovCisKKyNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KKyNpbmNsdWRlICJhY2NvbW1vbi5oIgorI2luY2x1ZGUgImFjcmVzcmMuaCIKKyNpbmNsdWRlICJhY25hbWVzcC5oIgorCisjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9SRVNPVVJDRVMKK0FDUElfTU9EVUxFX05BTUUoInJzeGZhY2UiKQorCisvKiBMb2NhbCBtYWNyb3MgZm9yIDE2LDMyLWJpdCB0byA2NC1iaXQgY29udmVyc2lvbiAqLworI2RlZmluZSBBQ1BJX0NPUFlfRklFTEQob3V0LCBpbiwgZmllbGQpICAoKG91dCktPmZpZWxkID0gKGluKS0+ZmllbGQpCisjZGVmaW5lIEFDUElfQ09QWV9BRERSRVNTKG91dCwgaW4pICAgICAgICAgICAgICAgICAgICAgIFwKKwlBQ1BJX0NPUFlfRklFTEQob3V0LCBpbiwgcmVzb3VyY2VfdHlwZSk7ICAgICAgICAgICAgIFwKKwlBQ1BJX0NPUFlfRklFTEQob3V0LCBpbiwgcHJvZHVjZXJfY29uc3VtZXIpOyAgICAgICAgIFwKKwlBQ1BJX0NPUFlfRklFTEQob3V0LCBpbiwgZGVjb2RlKTsgICAgICAgICAgICAgICAgICAgIFwKKwlBQ1BJX0NPUFlfRklFTEQob3V0LCBpbiwgbWluX2FkZHJlc3NfZml4ZWQpOyAgICAgICAgIFwKKwlBQ1BJX0NPUFlfRklFTEQob3V0LCBpbiwgbWF4X2FkZHJlc3NfZml4ZWQpOyAgICAgICAgIFwKKwlBQ1BJX0NPUFlfRklFTEQob3V0LCBpbiwgaW5mbyk7ICAgICAgICAgICAgICAgICAgICAgIFwKKwlBQ1BJX0NPUFlfRklFTEQob3V0LCBpbiwgZ3JhbnVsYXJpdHkpOyAgICAgICAgICAgICAgIFwKKwlBQ1BJX0NPUFlfRklFTEQob3V0LCBpbiwgbWluaW11bSk7ICAgICAgICAgICAgICAgICAgIFwKKwlBQ1BJX0NPUFlfRklFTEQob3V0LCBpbiwgbWF4aW11bSk7ICAgICAgICAgICAgICAgICAgIFwKKwlBQ1BJX0NPUFlfRklFTEQob3V0LCBpbiwgdHJhbnNsYXRpb25fb2Zmc2V0KTsgICAgICAgIFwKKwlBQ1BJX0NPUFlfRklFTEQob3V0LCBpbiwgYWRkcmVzc19sZW5ndGgpOyAgICAgICAgICAgIFwKKwlBQ1BJX0NPUFlfRklFTEQob3V0LCBpbiwgcmVzb3VyY2Vfc291cmNlKTsKKy8qIExvY2FsIHByb3RvdHlwZXMgKi8KK3N0YXRpYyBhY3BpX3N0YXR1cworYWNwaV9yc19tYXRjaF92ZW5kb3JfcmVzb3VyY2Uoc3RydWN0IGFjcGlfcmVzb3VyY2UgKnJlc291cmNlLCB2b2lkICpjb250ZXh0KTsKKworc3RhdGljIGFjcGlfc3RhdHVzCithY3BpX3JzX3ZhbGlkYXRlX3BhcmFtZXRlcnMoYWNwaV9oYW5kbGUgZGV2aWNlX2hhbmRsZSwKKwkJCSAgICBzdHJ1Y3QgYWNwaV9idWZmZXIgKmJ1ZmZlciwKKwkJCSAgICBzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqKnJldHVybl9ub2RlKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9yc192YWxpZGF0ZV9wYXJhbWV0ZXJzCisgKgorICogUEFSQU1FVEVSUzogIGRldmljZV9oYW5kbGUgICAtIEhhbmRsZSB0byBhIGRldmljZQorICogICAgICAgICAgICAgIEJ1ZmZlciAgICAgICAgICAtIFBvaW50ZXIgdG8gYSBkYXRhIGJ1ZmZlcgorICogICAgICAgICAgICAgIHJldHVybl9ub2RlICAgICAtIFBvaW50ZXIgdG8gd2hlcmUgdGhlIGRldmljZSBub2RlIGlzIHJldHVybmVkCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBDb21tb24gcGFyYW1ldGVyIHZhbGlkYXRpb24gZm9yIHJlc291cmNlIGludGVyZmFjZXMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgYWNwaV9zdGF0dXMKK2FjcGlfcnNfdmFsaWRhdGVfcGFyYW1ldGVycyhhY3BpX2hhbmRsZSBkZXZpY2VfaGFuZGxlLAorCQkJICAgIHN0cnVjdCBhY3BpX2J1ZmZlciAqYnVmZmVyLAorCQkJICAgIHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICoqcmV0dXJuX25vZGUpCit7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlOworCisJQUNQSV9GVU5DVElPTl9UUkFDRShyc192YWxpZGF0ZV9wYXJhbWV0ZXJzKTsKKworCS8qCisJICogTXVzdCBoYXZlIGEgdmFsaWQgaGFuZGxlIHRvIGFuIEFDUEkgZGV2aWNlCisJICovCisJaWYgKCFkZXZpY2VfaGFuZGxlKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfUEFSQU1FVEVSKTsKKwl9CisKKwlub2RlID0gYWNwaV9uc19tYXBfaGFuZGxlX3RvX25vZGUoZGV2aWNlX2hhbmRsZSk7CisJaWYgKCFub2RlKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfUEFSQU1FVEVSKTsKKwl9CisKKwlpZiAobm9kZS0+dHlwZSAhPSBBQ1BJX1RZUEVfREVWSUNFKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9UWVBFKTsKKwl9CisKKwkvKgorCSAqIFZhbGlkYXRlIHRoZSB1c2VyIGJ1ZmZlciBvYmplY3QKKwkgKgorCSAqIGlmIHRoZXJlIGlzIGEgbm9uLXplcm8gYnVmZmVyIGxlbmd0aCB3ZSBhbHNvIG5lZWQgYSB2YWxpZCBwb2ludGVyIGluCisJICogdGhlIGJ1ZmZlci4gSWYgaXQncyBhIHplcm8gYnVmZmVyIGxlbmd0aCwgd2UnbGwgYmUgcmV0dXJuaW5nIHRoZQorCSAqIG5lZWRlZCBidWZmZXIgc2l6ZSAobGF0ZXIpLCBzbyBrZWVwIGdvaW5nLgorCSAqLworCXN0YXR1cyA9IGFjcGlfdXRfdmFsaWRhdGVfYnVmZmVyKGJ1ZmZlcik7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworCX0KKworCSpyZXR1cm5fbm9kZSA9IG5vZGU7CisJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9nZXRfaXJxX3JvdXRpbmdfdGFibGUKKyAqCisgKiBQQVJBTUVURVJTOiAgZGV2aWNlX2hhbmRsZSAgIC0gSGFuZGxlIHRvIHRoZSBCdXMgZGV2aWNlIHdlIGFyZSBxdWVyeWluZworICogICAgICAgICAgICAgIHJldF9idWZmZXIgICAgICAtIFBvaW50ZXIgdG8gYSBidWZmZXIgdG8gcmVjZWl2ZSB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50IHJlc291cmNlcyBmb3IgdGhlIGRldmljZQorICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gZ2V0IHRoZSBJUlEgcm91dGluZyB0YWJsZSBmb3IgYQorICogICAgICAgICAgICAgIHNwZWNpZmljIGJ1cy4gVGhlIGNhbGxlciBtdXN0IGZpcnN0IGFjcXVpcmUgYSBoYW5kbGUgZm9yIHRoZQorICogICAgICAgICAgICAgIGRlc2lyZWQgYnVzLiBUaGUgcm91dGluZSB0YWJsZSBpcyBwbGFjZWQgaW4gdGhlIGJ1ZmZlciBwb2ludGVkCisgKiAgICAgICAgICAgICAgdG8gYnkgdGhlIHJldF9idWZmZXIgdmFyaWFibGUgcGFyYW1ldGVyLgorICoKKyAqICAgICAgICAgICAgICBJZiB0aGUgZnVuY3Rpb24gZmFpbHMgYW4gYXBwcm9wcmlhdGUgc3RhdHVzIHdpbGwgYmUgcmV0dXJuZWQKKyAqICAgICAgICAgICAgICBhbmQgdGhlIHZhbHVlIG9mIHJldF9idWZmZXIgaXMgdW5kZWZpbmVkLgorICoKKyAqICAgICAgICAgICAgICBUaGlzIGZ1bmN0aW9uIGF0dGVtcHRzIHRvIGV4ZWN1dGUgdGhlIF9QUlQgbWV0aG9kIGNvbnRhaW5lZCBpbgorICogICAgICAgICAgICAgIHRoZSBvYmplY3QgaW5kaWNhdGVkIGJ5IHRoZSBwYXNzZWQgZGV2aWNlX2hhbmRsZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCithY3BpX3N0YXR1cworYWNwaV9nZXRfaXJxX3JvdXRpbmdfdGFibGUoYWNwaV9oYW5kbGUgZGV2aWNlX2hhbmRsZSwKKwkJCSAgIHN0cnVjdCBhY3BpX2J1ZmZlciAqcmV0X2J1ZmZlcikKK3sKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGU7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGFjcGlfZ2V0X2lycV9yb3V0aW5nX3RhYmxlKTsKKworCS8qIFZhbGlkYXRlIHBhcmFtZXRlcnMgdGhlbiBkaXNwYXRjaCB0byBpbnRlcm5hbCByb3V0aW5lICovCisKKwlzdGF0dXMgPSBhY3BpX3JzX3ZhbGlkYXRlX3BhcmFtZXRlcnMoZGV2aWNlX2hhbmRsZSwgcmV0X2J1ZmZlciwgJm5vZGUpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKKwl9CisKKwlzdGF0dXMgPSBhY3BpX3JzX2dldF9wcnRfbWV0aG9kX2RhdGEobm9kZSwgcmV0X2J1ZmZlcik7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Cit9CisKK0FDUElfRVhQT1JUX1NZTUJPTChhY3BpX2dldF9pcnFfcm91dGluZ190YWJsZSkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9nZXRfY3VycmVudF9yZXNvdXJjZXMKKyAqCisgKiBQQVJBTUVURVJTOiAgZGV2aWNlX2hhbmRsZSAgIC0gSGFuZGxlIHRvIHRoZSBkZXZpY2Ugb2JqZWN0IGZvciB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2Ugd2UgYXJlIHF1ZXJ5aW5nCisgKiAgICAgICAgICAgICAgcmV0X2J1ZmZlciAgICAgIC0gUG9pbnRlciB0byBhIGJ1ZmZlciB0byByZWNlaXZlIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgcmVzb3VyY2VzIGZvciB0aGUgZGV2aWNlCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBnZXQgdGhlIGN1cnJlbnQgcmVzb3VyY2VzIGZvciBhCisgKiAgICAgICAgICAgICAgc3BlY2lmaWMgZGV2aWNlLiBUaGUgY2FsbGVyIG11c3QgZmlyc3QgYWNxdWlyZSBhIGhhbmRsZSBmb3IKKyAqICAgICAgICAgICAgICB0aGUgZGVzaXJlZCBkZXZpY2UuIFRoZSByZXNvdXJjZSBkYXRhIGlzIHBsYWNlZCBpbiB0aGUgYnVmZmVyCisgKiAgICAgICAgICAgICAgcG9pbnRlZCB0byBieSB0aGUgcmV0X2J1ZmZlciB2YXJpYWJsZSBwYXJhbWV0ZXIuCisgKgorICogICAgICAgICAgICAgIElmIHRoZSBmdW5jdGlvbiBmYWlscyBhbiBhcHByb3ByaWF0ZSBzdGF0dXMgd2lsbCBiZSByZXR1cm5lZAorICogICAgICAgICAgICAgIGFuZCB0aGUgdmFsdWUgb2YgcmV0X2J1ZmZlciBpcyB1bmRlZmluZWQuCisgKgorICogICAgICAgICAgICAgIFRoaXMgZnVuY3Rpb24gYXR0ZW1wdHMgdG8gZXhlY3V0ZSB0aGUgX0NSUyBtZXRob2QgY29udGFpbmVkIGluCisgKiAgICAgICAgICAgICAgdGhlIG9iamVjdCBpbmRpY2F0ZWQgYnkgdGhlIHBhc3NlZCBkZXZpY2VfaGFuZGxlLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCithY3BpX3N0YXR1cworYWNwaV9nZXRfY3VycmVudF9yZXNvdXJjZXMoYWNwaV9oYW5kbGUgZGV2aWNlX2hhbmRsZSwKKwkJCSAgIHN0cnVjdCBhY3BpX2J1ZmZlciAqcmV0X2J1ZmZlcikKK3sKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGU7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGFjcGlfZ2V0X2N1cnJlbnRfcmVzb3VyY2VzKTsKKworCS8qIFZhbGlkYXRlIHBhcmFtZXRlcnMgdGhlbiBkaXNwYXRjaCB0byBpbnRlcm5hbCByb3V0aW5lICovCisKKwlzdGF0dXMgPSBhY3BpX3JzX3ZhbGlkYXRlX3BhcmFtZXRlcnMoZGV2aWNlX2hhbmRsZSwgcmV0X2J1ZmZlciwgJm5vZGUpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKKwl9CisKKwlzdGF0dXMgPSBhY3BpX3JzX2dldF9jcnNfbWV0aG9kX2RhdGEobm9kZSwgcmV0X2J1ZmZlcik7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Cit9CisKK0FDUElfRVhQT1JUX1NZTUJPTChhY3BpX2dldF9jdXJyZW50X3Jlc291cmNlcykKKyNpZmRlZiBBQ1BJX0ZVVFVSRV9VU0FHRQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9nZXRfcG9zc2libGVfcmVzb3VyY2VzCisgKgorICogUEFSQU1FVEVSUzogIGRldmljZV9oYW5kbGUgICAtIEhhbmRsZSB0byB0aGUgZGV2aWNlIG9iamVjdCBmb3IgdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlIHdlIGFyZSBxdWVyeWluZworICogICAgICAgICAgICAgIHJldF9idWZmZXIgICAgICAtIFBvaW50ZXIgdG8gYSBidWZmZXIgdG8gcmVjZWl2ZSB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZXMgZm9yIHRoZSBkZXZpY2UKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGdldCBhIGxpc3Qgb2YgdGhlIHBvc3NpYmxlIHJlc291cmNlcworICogICAgICAgICAgICAgIGZvciBhIHNwZWNpZmljIGRldmljZS4gVGhlIGNhbGxlciBtdXN0IGZpcnN0IGFjcXVpcmUgYSBoYW5kbGUKKyAqICAgICAgICAgICAgICBmb3IgdGhlIGRlc2lyZWQgZGV2aWNlLiBUaGUgcmVzb3VyY2UgZGF0YSBpcyBwbGFjZWQgaW4gdGhlCisgKiAgICAgICAgICAgICAgYnVmZmVyIHBvaW50ZWQgdG8gYnkgdGhlIHJldF9idWZmZXIgdmFyaWFibGUuCisgKgorICogICAgICAgICAgICAgIElmIHRoZSBmdW5jdGlvbiBmYWlscyBhbiBhcHByb3ByaWF0ZSBzdGF0dXMgd2lsbCBiZSByZXR1cm5lZAorICogICAgICAgICAgICAgIGFuZCB0aGUgdmFsdWUgb2YgcmV0X2J1ZmZlciBpcyB1bmRlZmluZWQuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2FjcGlfc3RhdHVzCithY3BpX2dldF9wb3NzaWJsZV9yZXNvdXJjZXMoYWNwaV9oYW5kbGUgZGV2aWNlX2hhbmRsZSwKKwkJCSAgICBzdHJ1Y3QgYWNwaV9idWZmZXIgKnJldF9idWZmZXIpCit7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlOworCisJQUNQSV9GVU5DVElPTl9UUkFDRShhY3BpX2dldF9wb3NzaWJsZV9yZXNvdXJjZXMpOworCisJLyogVmFsaWRhdGUgcGFyYW1ldGVycyB0aGVuIGRpc3BhdGNoIHRvIGludGVybmFsIHJvdXRpbmUgKi8KKworCXN0YXR1cyA9IGFjcGlfcnNfdmFsaWRhdGVfcGFyYW1ldGVycyhkZXZpY2VfaGFuZGxlLCByZXRfYnVmZmVyLCAmbm9kZSk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworCX0KKworCXN0YXR1cyA9IGFjcGlfcnNfZ2V0X3Byc19tZXRob2RfZGF0YShub2RlLCByZXRfYnVmZmVyKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKK30KKworQUNQSV9FWFBPUlRfU1lNQk9MKGFjcGlfZ2V0X3Bvc3NpYmxlX3Jlc291cmNlcykKKyNlbmRpZgkJCQkvKiAgQUNQSV9GVVRVUkVfVVNBR0UgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX3NldF9jdXJyZW50X3Jlc291cmNlcworICoKKyAqIFBBUkFNRVRFUlM6ICBkZXZpY2VfaGFuZGxlICAgLSBIYW5kbGUgdG8gdGhlIGRldmljZSBvYmplY3QgZm9yIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSB3ZSBhcmUgc2V0dGluZyByZXNvdXJjZXMKKyAqICAgICAgICAgICAgICBpbl9idWZmZXIgICAgICAgLSBQb2ludGVyIHRvIGEgYnVmZmVyIGNvbnRhaW5pbmcgdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VzIHRvIGJlIHNldCBmb3IgdGhlIGRldmljZQorICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gc2V0IHRoZSBjdXJyZW50IHJlc291cmNlcyBmb3IgYQorICogICAgICAgICAgICAgIHNwZWNpZmljIGRldmljZS4gVGhlIGNhbGxlciBtdXN0IGZpcnN0IGFjcXVpcmUgYSBoYW5kbGUgZm9yCisgKiAgICAgICAgICAgICAgdGhlIGRlc2lyZWQgZGV2aWNlLiBUaGUgcmVzb3VyY2UgZGF0YSBpcyBwYXNzZWQgdG8gdGhlIHJvdXRpbmUKKyAqICAgICAgICAgICAgICB0aGUgYnVmZmVyIHBvaW50ZWQgdG8gYnkgdGhlIGluX2J1ZmZlciB2YXJpYWJsZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYWNwaV9zdGF0dXMKK2FjcGlfc2V0X2N1cnJlbnRfcmVzb3VyY2VzKGFjcGlfaGFuZGxlIGRldmljZV9oYW5kbGUsCisJCQkgICBzdHJ1Y3QgYWNwaV9idWZmZXIgKmluX2J1ZmZlcikKK3sKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGU7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGFjcGlfc2V0X2N1cnJlbnRfcmVzb3VyY2VzKTsKKworCS8qIFZhbGlkYXRlIHRoZSBidWZmZXIsIGRvbid0IGFsbG93IHplcm8gbGVuZ3RoICovCisKKwlpZiAoKCFpbl9idWZmZXIpIHx8ICghaW5fYnVmZmVyLT5wb2ludGVyKSB8fCAoIWluX2J1ZmZlci0+bGVuZ3RoKSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX1BBUkFNRVRFUik7CisJfQorCisJLyogVmFsaWRhdGUgcGFyYW1ldGVycyB0aGVuIGRpc3BhdGNoIHRvIGludGVybmFsIHJvdXRpbmUgKi8KKworCXN0YXR1cyA9IGFjcGlfcnNfdmFsaWRhdGVfcGFyYW1ldGVycyhkZXZpY2VfaGFuZGxlLCBpbl9idWZmZXIsICZub2RlKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CisJfQorCisJc3RhdHVzID0gYWNwaV9yc19zZXRfc3JzX21ldGhvZF9kYXRhKG5vZGUsIGluX2J1ZmZlcik7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Cit9CisKK0FDUElfRVhQT1JUX1NZTUJPTChhY3BpX3NldF9jdXJyZW50X3Jlc291cmNlcykKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX3Jlc291cmNlX3RvX2FkZHJlc3M2NAorICoKKyAqIFBBUkFNRVRFUlM6ICBSZXNvdXJjZSAgICAgICAgLSBQb2ludGVyIHRvIGEgcmVzb3VyY2UKKyAqICAgICAgICAgICAgICBPdXQgICAgICAgICAgICAgLSBQb2ludGVyIHRvIHRoZSB1c2VycydzIHJldHVybiBidWZmZXIKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYSBzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9hZGRyZXNzNjQpCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBJZiB0aGUgcmVzb3VyY2UgaXMgYW4gYWRkcmVzczE2LCBhZGRyZXNzMzIsIG9yIGFkZHJlc3M2NCwKKyAqICAgICAgICAgICAgICBjb3B5IGl0IHRvIHRoZSBhZGRyZXNzNjQgcmV0dXJuIGJ1ZmZlci4gVGhpcyBzYXZlcyB0aGUKKyAqICAgICAgICAgICAgICBjYWxsZXIgZnJvbSBoYXZpbmcgdG8gZHVwbGljYXRlIGNvZGUgZm9yIGRpZmZlcmVudC1zaXplZAorICogICAgICAgICAgICAgIGFkZHJlc3Nlcy4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYWNwaV9zdGF0dXMKK2FjcGlfcmVzb3VyY2VfdG9fYWRkcmVzczY0KHN0cnVjdCBhY3BpX3Jlc291cmNlICpyZXNvdXJjZSwKKwkJCSAgIHN0cnVjdCBhY3BpX3Jlc291cmNlX2FkZHJlc3M2NCAqb3V0KQoreworCXN0cnVjdCBhY3BpX3Jlc291cmNlX2FkZHJlc3MxNiAqYWRkcmVzczE2OworCXN0cnVjdCBhY3BpX3Jlc291cmNlX2FkZHJlc3MzMiAqYWRkcmVzczMyOworCisJaWYgKCFyZXNvdXJjZSB8fCAhb3V0KSB7CisJCXJldHVybiAoQUVfQkFEX1BBUkFNRVRFUik7CisJfQorCisJLyogQ29udmVydCAxNiBvciAzMiBhZGRyZXNzIGRlc2NyaXB0b3IgdG8gNjQgKi8KKworCXN3aXRjaCAocmVzb3VyY2UtPnR5cGUpIHsKKwljYXNlIEFDUElfUkVTT1VSQ0VfVFlQRV9BRERSRVNTMTY6CisKKwkJYWRkcmVzczE2ID0gKHN0cnVjdCBhY3BpX3Jlc291cmNlX2FkZHJlc3MxNiAqKSZyZXNvdXJjZS0+ZGF0YTsKKwkJQUNQSV9DT1BZX0FERFJFU1Mob3V0LCBhZGRyZXNzMTYpOworCQlicmVhazsKKworCWNhc2UgQUNQSV9SRVNPVVJDRV9UWVBFX0FERFJFU1MzMjoKKworCQlhZGRyZXNzMzIgPSAoc3RydWN0IGFjcGlfcmVzb3VyY2VfYWRkcmVzczMyICopJnJlc291cmNlLT5kYXRhOworCQlBQ1BJX0NPUFlfQUREUkVTUyhvdXQsIGFkZHJlc3MzMik7CisJCWJyZWFrOworCisJY2FzZSBBQ1BJX1JFU09VUkNFX1RZUEVfQUREUkVTUzY0OgorCisJCS8qIFNpbXBsZSBjb3B5IGZvciA2NCBiaXQgc291cmNlICovCisKKwkJQUNQSV9NRU1DUFkob3V0LCAmcmVzb3VyY2UtPmRhdGEsCisJCQkgICAgc2l6ZW9mKHN0cnVjdCBhY3BpX3Jlc291cmNlX2FkZHJlc3M2NCkpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJldHVybiAoQUVfQkFEX1BBUkFNRVRFUik7CisJfQorCisJcmV0dXJuIChBRV9PSyk7Cit9CisKK0FDUElfRVhQT1JUX1NZTUJPTChhY3BpX3Jlc291cmNlX3RvX2FkZHJlc3M2NCkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9nZXRfdmVuZG9yX3Jlc291cmNlCisgKgorICogUEFSQU1FVEVSUzogIGRldmljZV9oYW5kbGUgICAtIEhhbmRsZSBmb3IgdGhlIHBhcmVudCBkZXZpY2Ugb2JqZWN0CisgKiAgICAgICAgICAgICAgTmFtZSAgICAgICAgICAgIC0gTWV0aG9kIG5hbWUgZm9yIHRoZSBwYXJlbnQgcmVzb3VyY2UKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTUVUSE9EX05BTUVfX0NSUyBvciBNRVRIT0RfTkFNRV9fUFJTKQorICogICAgICAgICAgICAgIFV1aWQgICAgICAgICAgICAtIFBvaW50ZXIgdG8gdGhlIFVVSUQgdG8gYmUgbWF0Y2hlZC4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlcyBib3RoIHN1YnR5cGUgYW5kIDE2LWJ5dGUgVVVJRAorICogICAgICAgICAgICAgIHJldF9idWZmZXIgICAgICAtIFdoZXJlIHRoZSB2ZW5kb3IgcmVzb3VyY2UgaXMgcmV0dXJuZWQKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IFdhbGsgYSByZXNvdXJjZSB0ZW1wbGF0ZSBmb3IgdGhlIHNwZWNpZmllZCBldmljZSB0byBmaW5kIGEKKyAqICAgICAgICAgICAgICB2ZW5kb3ItZGVmaW5lZCByZXNvdXJjZSB0aGF0IG1hdGNoZXMgdGhlIHN1cHBsaWVkIFVVSUQgYW5kCisgKiAgICAgICAgICAgICAgVVVJRCBzdWJ0eXBlLiBSZXR1cm5zIGEgc3RydWN0IGFjcGlfcmVzb3VyY2Ugb2YgdHlwZSBWZW5kb3IuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2FjcGlfc3RhdHVzCithY3BpX2dldF92ZW5kb3JfcmVzb3VyY2UoYWNwaV9oYW5kbGUgZGV2aWNlX2hhbmRsZSwKKwkJCSBjaGFyICpuYW1lLAorCQkJIHN0cnVjdCBhY3BpX3ZlbmRvcl91dWlkICogdXVpZCwKKwkJCSBzdHJ1Y3QgYWNwaV9idWZmZXIgKiByZXRfYnVmZmVyKQoreworCXN0cnVjdCBhY3BpX3ZlbmRvcl93YWxrX2luZm8gaW5mbzsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisKKwkvKiBPdGhlciBwYXJhbWV0ZXJzIGFyZSB2YWxpZGF0ZWQgYnkgYWNwaV93YWxrX3Jlc291cmNlcyAqLworCisJaWYgKCF1dWlkIHx8ICFyZXRfYnVmZmVyKSB7CisJCXJldHVybiAoQUVfQkFEX1BBUkFNRVRFUik7CisJfQorCisJaW5mby51dWlkID0gdXVpZDsKKwlpbmZvLmJ1ZmZlciA9IHJldF9idWZmZXI7CisJaW5mby5zdGF0dXMgPSBBRV9OT1RfRVhJU1Q7CisKKwkvKiBXYWxrIHRoZSBfQ1JTIG9yIF9QUlMgcmVzb3VyY2UgbGlzdCBmb3IgdGhpcyBkZXZpY2UgKi8KKworCXN0YXR1cyA9CisJICAgIGFjcGlfd2Fsa19yZXNvdXJjZXMoZGV2aWNlX2hhbmRsZSwgbmFtZSwKKwkJCQlhY3BpX3JzX21hdGNoX3ZlbmRvcl9yZXNvdXJjZSwgJmluZm8pOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm4gKHN0YXR1cyk7CisJfQorCisJcmV0dXJuIChpbmZvLnN0YXR1cyk7Cit9CisKK0FDUElfRVhQT1JUX1NZTUJPTChhY3BpX2dldF92ZW5kb3JfcmVzb3VyY2UpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfcnNfbWF0Y2hfdmVuZG9yX3Jlc291cmNlCisgKgorICogUEFSQU1FVEVSUzogIGFjcGlfd2Fsa19yZXNvdXJjZV9jYWxsYmFjaworICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogTWF0Y2ggYSB2ZW5kb3IgcmVzb3VyY2UgdmlhIHRoZSBBQ1BJIDMuMCBVVUlECisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBhY3BpX3N0YXR1cworYWNwaV9yc19tYXRjaF92ZW5kb3JfcmVzb3VyY2Uoc3RydWN0IGFjcGlfcmVzb3VyY2UgKnJlc291cmNlLCB2b2lkICpjb250ZXh0KQoreworCXN0cnVjdCBhY3BpX3ZlbmRvcl93YWxrX2luZm8gKmluZm8gPSBjb250ZXh0OworCXN0cnVjdCBhY3BpX3Jlc291cmNlX3ZlbmRvcl90eXBlZCAqdmVuZG9yOworCXN0cnVjdCBhY3BpX2J1ZmZlciAqYnVmZmVyOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKworCS8qIElnbm9yZSBhbGwgZGVzY3JpcHRvcnMgZXhjZXB0IFZlbmRvciAqLworCisJaWYgKHJlc291cmNlLT50eXBlICE9IEFDUElfUkVTT1VSQ0VfVFlQRV9WRU5ET1IpIHsKKwkJcmV0dXJuIChBRV9PSyk7CisJfQorCisJdmVuZG9yID0gJnJlc291cmNlLT5kYXRhLnZlbmRvcl90eXBlZDsKKworCS8qCisJICogRm9yIGEgdmFsaWQgbWF0Y2gsIHRoZXNlIGNvbmRpdGlvbnMgbXVzdCBob2xkOgorCSAqCisJICogMSkgTGVuZ3RoIG9mIGRlc2NyaXB0b3IgZGF0YSBtdXN0IGJlIGF0IGxlYXN0IGFzIGxvbmcgYXMgYSBVVUlEIHN0cnVjdAorCSAqIDIpIFRoZSBVVUlEIHN1YnR5cGVzIG11c3QgbWF0Y2gKKwkgKiAzKSBUaGUgVVVJRCBkYXRhIG11c3QgbWF0Y2gKKwkgKi8KKwlpZiAoKHZlbmRvci0+Ynl0ZV9sZW5ndGggPCAoQUNQSV9VVUlEX0xFTkdUSCArIDEpKSB8fAorCSAgICAodmVuZG9yLT51dWlkX3N1YnR5cGUgIT0gaW5mby0+dXVpZC0+c3VidHlwZSkgfHwKKwkgICAgKEFDUElfTUVNQ01QKHZlbmRvci0+dXVpZCwgaW5mby0+dXVpZC0+ZGF0YSwgQUNQSV9VVUlEX0xFTkdUSCkpKSB7CisJCXJldHVybiAoQUVfT0spOworCX0KKworCS8qIFZhbGlkYXRlL0FsbG9jYXRlL0NsZWFyIGNhbGxlciBidWZmZXIgKi8KKworCWJ1ZmZlciA9IGluZm8tPmJ1ZmZlcjsKKwlzdGF0dXMgPSBhY3BpX3V0X2luaXRpYWxpemVfYnVmZmVyKGJ1ZmZlciwgcmVzb3VyY2UtPmxlbmd0aCk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXJldHVybiAoc3RhdHVzKTsKKwl9CisKKwkvKiBGb3VuZCB0aGUgY29ycmVjdCByZXNvdXJjZSwgY29weSBhbmQgcmV0dXJuIGl0ICovCisKKwlBQ1BJX01FTUNQWShidWZmZXItPnBvaW50ZXIsIHJlc291cmNlLCByZXNvdXJjZS0+bGVuZ3RoKTsKKwlidWZmZXItPmxlbmd0aCA9IHJlc291cmNlLT5sZW5ndGg7CisKKwkvKiBGb3VuZCB0aGUgZGVzaXJlZCBkZXNjcmlwdG9yLCB0ZXJtaW5hdGUgcmVzb3VyY2Ugd2FsayAqLworCisJaW5mby0+c3RhdHVzID0gQUVfT0s7CisJcmV0dXJuIChBRV9DVFJMX1RFUk1JTkFURSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfd2Fsa19yZXNvdXJjZXMKKyAqCisgKiBQQVJBTUVURVJTOiAgZGV2aWNlX2hhbmRsZSAgIC0gSGFuZGxlIHRvIHRoZSBkZXZpY2Ugb2JqZWN0IGZvciB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2Ugd2UgYXJlIHF1ZXJ5aW5nCisgKiAgICAgICAgICAgICAgTmFtZSAgICAgICAgICAgIC0gTWV0aG9kIG5hbWUgb2YgdGhlIHJlc291cmNlcyB3ZSB3YW50CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE1FVEhPRF9OQU1FX19DUlMgb3IgTUVUSE9EX05BTUVfX1BSUykKKyAqICAgICAgICAgICAgICB1c2VyX2Z1bmN0aW9uICAgLSBDYWxsZWQgZm9yIGVhY2ggcmVzb3VyY2UKKyAqICAgICAgICAgICAgICBDb250ZXh0ICAgICAgICAgLSBQYXNzZWQgdG8gdXNlcl9mdW5jdGlvbgorICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogUmV0cmlldmVzIHRoZSBjdXJyZW50IG9yIHBvc3NpYmxlIHJlc291cmNlIGxpc3QgZm9yIHRoZQorICogICAgICAgICAgICAgIHNwZWNpZmllZCBkZXZpY2UuIFRoZSB1c2VyX2Z1bmN0aW9uIGlzIGNhbGxlZCBvbmNlIGZvcgorICogICAgICAgICAgICAgIGVhY2ggcmVzb3VyY2UgaW4gdGhlIGxpc3QuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2FjcGlfc3RhdHVzCithY3BpX3dhbGtfcmVzb3VyY2VzKGFjcGlfaGFuZGxlIGRldmljZV9oYW5kbGUsCisJCSAgICBjaGFyICpuYW1lLAorCQkgICAgYWNwaV93YWxrX3Jlc291cmNlX2NhbGxiYWNrIHVzZXJfZnVuY3Rpb24sIHZvaWQgKmNvbnRleHQpCit7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCXN0cnVjdCBhY3BpX2J1ZmZlciBidWZmZXI7CisJc3RydWN0IGFjcGlfcmVzb3VyY2UgKnJlc291cmNlOworCXN0cnVjdCBhY3BpX3Jlc291cmNlICpyZXNvdXJjZV9lbmQ7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGFjcGlfd2Fsa19yZXNvdXJjZXMpOworCisJLyogUGFyYW1ldGVyIHZhbGlkYXRpb24gKi8KKworCWlmICghZGV2aWNlX2hhbmRsZSB8fCAhdXNlcl9mdW5jdGlvbiB8fCAhbmFtZSB8fAorCSAgICAoIUFDUElfQ09NUEFSRV9OQU1FKG5hbWUsIE1FVEhPRF9OQU1FX19DUlMpICYmCisJICAgICAhQUNQSV9DT01QQVJFX05BTUUobmFtZSwgTUVUSE9EX05BTUVfX1BSUykpKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfUEFSQU1FVEVSKTsKKwl9CisKKwkvKiBHZXQgdGhlIF9DUlMgb3IgX1BSUyByZXNvdXJjZSBsaXN0ICovCisKKwlidWZmZXIubGVuZ3RoID0gQUNQSV9BTExPQ0FURV9MT0NBTF9CVUZGRVI7CisJc3RhdHVzID0gYWNwaV9yc19nZXRfbWV0aG9kX2RhdGEoZGV2aWNlX2hhbmRsZSwgbmFtZSwgJmJ1ZmZlcik7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworCX0KKworCS8qIEJ1ZmZlciBub3cgY29udGFpbnMgdGhlIHJlc291cmNlIGxpc3QgKi8KKworCXJlc291cmNlID0gQUNQSV9DQVNUX1BUUihzdHJ1Y3QgYWNwaV9yZXNvdXJjZSwgYnVmZmVyLnBvaW50ZXIpOworCXJlc291cmNlX2VuZCA9CisJICAgIEFDUElfQUREX1BUUihzdHJ1Y3QgYWNwaV9yZXNvdXJjZSwgYnVmZmVyLnBvaW50ZXIsIGJ1ZmZlci5sZW5ndGgpOworCisJLyogV2FsayB0aGUgcmVzb3VyY2UgbGlzdCB1bnRpbCB0aGUgZW5kX3RhZyBpcyBmb3VuZCAob3IgYnVmZmVyIGVuZCkgKi8KKworCXdoaWxlIChyZXNvdXJjZSA8IHJlc291cmNlX2VuZCkgeworCisJCS8qIFNhbml0eSBjaGVjayB0aGUgcmVzb3VyY2UgKi8KKworCQlpZiAocmVzb3VyY2UtPnR5cGUgPiBBQ1BJX1JFU09VUkNFX1RZUEVfTUFYKSB7CisJCQlzdGF0dXMgPSBBRV9BTUxfSU5WQUxJRF9SRVNPVVJDRV9UWVBFOworCQkJYnJlYWs7CisJCX0KKworCQkvKiBJbnZva2UgdGhlIHVzZXIgZnVuY3Rpb24sIGFib3J0IG9uIGFueSBlcnJvciByZXR1cm5lZCAqLworCisJCXN0YXR1cyA9IHVzZXJfZnVuY3Rpb24ocmVzb3VyY2UsIGNvbnRleHQpOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCWlmIChzdGF0dXMgPT0gQUVfQ1RSTF9URVJNSU5BVEUpIHsKKworCQkJCS8qIFRoaXMgaXMgYW4gT0sgdGVybWluYXRpb24gYnkgdGhlIHVzZXIgZnVuY3Rpb24gKi8KKworCQkJCXN0YXR1cyA9IEFFX09LOworCQkJfQorCQkJYnJlYWs7CisJCX0KKworCQkvKiBlbmRfdGFnIGluZGljYXRlcyBlbmQtb2YtbGlzdCAqLworCisJCWlmIChyZXNvdXJjZS0+dHlwZSA9PSBBQ1BJX1JFU09VUkNFX1RZUEVfRU5EX1RBRykgeworCQkJYnJlYWs7CisJCX0KKworCQkvKiBHZXQgdGhlIG5leHQgcmVzb3VyY2UgZGVzY3JpcHRvciAqLworCisJCXJlc291cmNlID0KKwkJICAgIEFDUElfQUREX1BUUihzdHJ1Y3QgYWNwaV9yZXNvdXJjZSwgcmVzb3VyY2UsCisJCQkJIHJlc291cmNlLT5sZW5ndGgpOworCX0KKworCUFDUElfRlJFRShidWZmZXIucG9pbnRlcik7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Cit9CisKK0FDUElfRVhQT1JUX1NZTUJPTChhY3BpX3dhbGtfcmVzb3VyY2VzKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS90YmZhZHQuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvdGJmYWR0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzYzNmU0ZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvdGJmYWR0LmMKQEAgLTAsMCArMSw2MTAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBNb2R1bGUgTmFtZTogdGJmYWR0ICAgLSBGQURUIHRhYmxlIHV0aWxpdGllcworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDgsIEludGVsIENvcnAuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCisgKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSBhdCBtaW5pbXVtIGEgZGlzY2xhaW1lcgorICogICAgc3Vic3RhbnRpYWxseSBzaW1pbGFyIHRvIHRoZSAiTk8gV0FSUkFOVFkiIGRpc2NsYWltZXIgYmVsb3cKKyAqICAgICgiRGlzY2xhaW1lciIpIGFuZCBhbnkgcmVkaXN0cmlidXRpb24gbXVzdCBiZSBjb25kaXRpb25lZCB1cG9uCisgKiAgICBpbmNsdWRpbmcgYSBzdWJzdGFudGlhbGx5IHNpbWlsYXIgRGlzY2xhaW1lciByZXF1aXJlbWVudCBmb3IgZnVydGhlcgorICogICAgYmluYXJ5IHJlZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzCisgKiAgICBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIE5PIFdBUlJBTlRZCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORworICogSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCisgKi8KKworI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgorI2luY2x1ZGUgImFjY29tbW9uLmgiCisjaW5jbHVkZSAiYWN0YWJsZXMuaCIKKworI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfVEFCTEVTCitBQ1BJX01PRFVMRV9OQU1FKCJ0YmZhZHQiKQorCisvKiBMb2NhbCBwcm90b3R5cGVzICovCitzdGF0aWMgaW5saW5lIHZvaWQKK2FjcGlfdGJfaW5pdF9nZW5lcmljX2FkZHJlc3Moc3RydWN0IGFjcGlfZ2VuZXJpY19hZGRyZXNzICpnZW5lcmljX2FkZHJlc3MsCisJCQkgICAgIHU4IHNwYWNlX2lkLCB1OCBieXRlX3dpZHRoLCB1NjQgYWRkcmVzcyk7CisKK3N0YXRpYyB2b2lkIGFjcGlfdGJfY29udmVydF9mYWR0KHZvaWQpOworCitzdGF0aWMgdm9pZCBhY3BpX3RiX3ZhbGlkYXRlX2ZhZHQodm9pZCk7CisKKy8qIFRhYmxlIGZvciBjb252ZXJzaW9uIG9mIEZBRFQgdG8gY29tbW9uIGludGVybmFsIGZvcm1hdCBhbmQgRkFEVCB2YWxpZGF0aW9uICovCisKK3R5cGVkZWYgc3RydWN0IGFjcGlfZmFkdF9pbmZvIHsKKwljaGFyICpuYW1lOworCXU4IGFkZHJlc3M2NDsKKwl1OCBhZGRyZXNzMzI7CisJdTggbGVuZ3RoOworCXU4IGRlZmF1bHRfbGVuZ3RoOworCXU4IHR5cGU7CisKK30gYWNwaV9mYWR0X2luZm87CisKKyNkZWZpbmUgQUNQSV9GQURUX1JFUVVJUkVEICAgICAgICAgIDEKKyNkZWZpbmUgQUNQSV9GQURUX1NFUEFSQVRFX0xFTkdUSCAgIDIKKworc3RhdGljIHN0cnVjdCBhY3BpX2ZhZHRfaW5mbyBmYWR0X2luZm9fdGFibGVbXSA9IHsKKwl7IlBtMWFFdmVudEJsb2NrIiwKKwkgQUNQSV9GQURUX09GRlNFVCh4cG0xYV9ldmVudF9ibG9jayksCisJIEFDUElfRkFEVF9PRkZTRVQocG0xYV9ldmVudF9ibG9jayksCisJIEFDUElfRkFEVF9PRkZTRVQocG0xX2V2ZW50X2xlbmd0aCksCisJIEFDUElfUE0xX1JFR0lTVEVSX1dJRFRIICogMiwJLyogRW5hYmxlICsgU3RhdHVzIHJlZ2lzdGVyICovCisJIEFDUElfRkFEVF9SRVFVSVJFRH0sCisKKwl7IlBtMWJFdmVudEJsb2NrIiwKKwkgQUNQSV9GQURUX09GRlNFVCh4cG0xYl9ldmVudF9ibG9jayksCisJIEFDUElfRkFEVF9PRkZTRVQocG0xYl9ldmVudF9ibG9jayksCisJIEFDUElfRkFEVF9PRkZTRVQocG0xX2V2ZW50X2xlbmd0aCksCisJIEFDUElfUE0xX1JFR0lTVEVSX1dJRFRIICogMiwJLyogRW5hYmxlICsgU3RhdHVzIHJlZ2lzdGVyICovCisJIDB9LAorCisJeyJQbTFhQ29udHJvbEJsb2NrIiwKKwkgQUNQSV9GQURUX09GRlNFVCh4cG0xYV9jb250cm9sX2Jsb2NrKSwKKwkgQUNQSV9GQURUX09GRlNFVChwbTFhX2NvbnRyb2xfYmxvY2spLAorCSBBQ1BJX0ZBRFRfT0ZGU0VUKHBtMV9jb250cm9sX2xlbmd0aCksCisJIEFDUElfUE0xX1JFR0lTVEVSX1dJRFRILAorCSBBQ1BJX0ZBRFRfUkVRVUlSRUR9LAorCisJeyJQbTFiQ29udHJvbEJsb2NrIiwKKwkgQUNQSV9GQURUX09GRlNFVCh4cG0xYl9jb250cm9sX2Jsb2NrKSwKKwkgQUNQSV9GQURUX09GRlNFVChwbTFiX2NvbnRyb2xfYmxvY2spLAorCSBBQ1BJX0ZBRFRfT0ZGU0VUKHBtMV9jb250cm9sX2xlbmd0aCksCisJIEFDUElfUE0xX1JFR0lTVEVSX1dJRFRILAorCSAwfSwKKworCXsiUG0yQ29udHJvbEJsb2NrIiwKKwkgQUNQSV9GQURUX09GRlNFVCh4cG0yX2NvbnRyb2xfYmxvY2spLAorCSBBQ1BJX0ZBRFRfT0ZGU0VUKHBtMl9jb250cm9sX2Jsb2NrKSwKKwkgQUNQSV9GQURUX09GRlNFVChwbTJfY29udHJvbF9sZW5ndGgpLAorCSBBQ1BJX1BNMl9SRUdJU1RFUl9XSURUSCwKKwkgQUNQSV9GQURUX1NFUEFSQVRFX0xFTkdUSH0sCisKKwl7IlBtVGltZXJCbG9jayIsCisJIEFDUElfRkFEVF9PRkZTRVQoeHBtX3RpbWVyX2Jsb2NrKSwKKwkgQUNQSV9GQURUX09GRlNFVChwbV90aW1lcl9ibG9jayksCisJIEFDUElfRkFEVF9PRkZTRVQocG1fdGltZXJfbGVuZ3RoKSwKKwkgQUNQSV9QTV9USU1FUl9XSURUSCwKKwkgQUNQSV9GQURUX1JFUVVJUkVEfSwKKworCXsiR3BlMEJsb2NrIiwKKwkgQUNQSV9GQURUX09GRlNFVCh4Z3BlMF9ibG9jayksCisJIEFDUElfRkFEVF9PRkZTRVQoZ3BlMF9ibG9jayksCisJIEFDUElfRkFEVF9PRkZTRVQoZ3BlMF9ibG9ja19sZW5ndGgpLAorCSAwLAorCSBBQ1BJX0ZBRFRfU0VQQVJBVEVfTEVOR1RIfSwKKworCXsiR3BlMUJsb2NrIiwKKwkgQUNQSV9GQURUX09GRlNFVCh4Z3BlMV9ibG9jayksCisJIEFDUElfRkFEVF9PRkZTRVQoZ3BlMV9ibG9jayksCisJIEFDUElfRkFEVF9PRkZTRVQoZ3BlMV9ibG9ja19sZW5ndGgpLAorCSAwLAorCSBBQ1BJX0ZBRFRfU0VQQVJBVEVfTEVOR1RIfQorfTsKKworI2RlZmluZSBBQ1BJX0ZBRFRfSU5GT19FTlRSSUVTICAgICAgICAoc2l6ZW9mIChmYWR0X2luZm9fdGFibGUpIC8gc2l6ZW9mIChzdHJ1Y3QgYWNwaV9mYWR0X2luZm8pKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX3RiX2luaXRfZ2VuZXJpY19hZGRyZXNzCisgKgorICogUEFSQU1FVEVSUzogIGdlbmVyaWNfYWRkcmVzcyAgICAgLSBHQVMgc3RydWN0IHRvIGJlIGluaXRpYWxpemVkCisgKiAgICAgICAgICAgICAgYnl0ZV93aWR0aCAgICAgICAgICAtIFdpZHRoIG9mIHRoaXMgcmVnaXN0ZXIKKyAqICAgICAgICAgICAgICBBZGRyZXNzICAgICAgICAgICAgIC0gQWRkcmVzcyBvZiB0aGUgcmVnaXN0ZXIKKyAqCisgKiBSRVRVUk46ICAgICAgTm9uZQorICoKKyAqIERFU0NSSVBUSU9OOiBJbml0aWFsaXplIGEgR2VuZXJpYyBBZGRyZXNzIFN0cnVjdHVyZSAoR0FTKQorICogICAgICAgICAgICAgIFNlZSB0aGUgQUNQSSBzcGVjaWZpY2F0aW9uIGZvciBhIGZ1bGwgZGVzY3JpcHRpb24gYW5kCisgKiAgICAgICAgICAgICAgZGVmaW5pdGlvbiBvZiB0aGlzIHN0cnVjdHVyZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW5saW5lIHZvaWQKK2FjcGlfdGJfaW5pdF9nZW5lcmljX2FkZHJlc3Moc3RydWN0IGFjcGlfZ2VuZXJpY19hZGRyZXNzICpnZW5lcmljX2FkZHJlc3MsCisJCQkgICAgIHU4IHNwYWNlX2lkLCB1OCBieXRlX3dpZHRoLCB1NjQgYWRkcmVzcykKK3sKKworCS8qCisJICogVGhlIDY0LWJpdCBBZGRyZXNzIGZpZWxkIGlzIG5vbi1hbGlnbmVkIGluIHRoZSBieXRlIHBhY2tlZAorCSAqIEdBUyBzdHJ1Y3QuCisJICovCisJQUNQSV9NT1ZFXzY0X1RPXzY0KCZnZW5lcmljX2FkZHJlc3MtPmFkZHJlc3MsICZhZGRyZXNzKTsKKworCS8qIEFsbCBvdGhlciBmaWVsZHMgYXJlIGJ5dGUtd2lkZSAqLworCisJZ2VuZXJpY19hZGRyZXNzLT5zcGFjZV9pZCA9IHNwYWNlX2lkOworCWdlbmVyaWNfYWRkcmVzcy0+Yml0X3dpZHRoID0gKHU4KUFDUElfTVVMXzgoYnl0ZV93aWR0aCk7CisJZ2VuZXJpY19hZGRyZXNzLT5iaXRfb2Zmc2V0ID0gMDsKKwlnZW5lcmljX2FkZHJlc3MtPmFjY2Vzc193aWR0aCA9IDA7CS8qIEFjY2VzcyB3aWR0aCBBTlkgKi8KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV90Yl9wYXJzZV9mYWR0CisgKgorICogUEFSQU1FVEVSUzogIHRhYmxlX2luZGV4ICAgICAgICAgLSBJbmRleCBmb3IgdGhlIEZBRFQKKyAqICAgICAgICAgICAgICBGbGFncyAgICAgICAgICAgICAgIC0gRmxhZ3MKKyAqCisgKiBSRVRVUk46ICAgICAgTm9uZQorICoKKyAqIERFU0NSSVBUSU9OOiBJbml0aWFsaXplIHRoZSBGQURULCBEU0RUIGFuZCBGQUNTIHRhYmxlcworICogICAgICAgICAgICAgIChGQURUIGNvbnRhaW5zIHRoZSBhZGRyZXNzZXMgb2YgdGhlIERTRFQgYW5kIEZBQ1MpCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBhY3BpX3RiX3BhcnNlX2ZhZHQodTMyIHRhYmxlX2luZGV4LCB1OCBmbGFncykKK3sKKwl1MzIgbGVuZ3RoOworCXN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqdGFibGU7CisKKwkvKgorCSAqIFRoZSBGQURUIGhhcyBtdWx0aXBsZSB2ZXJzaW9ucyB3aXRoIGRpZmZlcmVudCBsZW5ndGhzLAorCSAqIGFuZCBpdCBjb250YWlucyBwb2ludGVycyB0byBib3RoIHRoZSBEU0RUIGFuZCBGQUNTIHRhYmxlcy4KKwkgKgorCSAqIEdldCBhIGxvY2FsIGNvcHkgb2YgdGhlIEZBRFQgYW5kIGNvbnZlcnQgaXQgdG8gYSBjb21tb24gZm9ybWF0CisJICogTWFwIGVudGlyZSBGQURULCBhc3N1bWVkIHRvIGJlIHNtYWxsZXIgdGhhbiBvbmUgcGFnZS4KKwkgKi8KKwlsZW5ndGggPSBhY3BpX2dibF9yb290X3RhYmxlX2xpc3QudGFibGVzW3RhYmxlX2luZGV4XS5sZW5ndGg7CisKKwl0YWJsZSA9CisJICAgIGFjcGlfb3NfbWFwX21lbW9yeShhY3BpX2dibF9yb290X3RhYmxlX2xpc3QudGFibGVzW3RhYmxlX2luZGV4XS4KKwkJCSAgICAgICBhZGRyZXNzLCBsZW5ndGgpOworCWlmICghdGFibGUpIHsKKwkJcmV0dXJuOworCX0KKworCS8qCisJICogVmFsaWRhdGUgdGhlIEZBRFQgY2hlY2tzdW0gYmVmb3JlIHdlIGNvcHkgdGhlIHRhYmxlLiBJZ25vcmUKKwkgKiBjaGVja3N1bSBlcnJvciBhcyB3ZSB3YW50IHRvIHRyeSB0byBnZXQgdGhlIERTRFQgYW5kIEZBQ1MuCisJICovCisJKHZvaWQpYWNwaV90Yl92ZXJpZnlfY2hlY2tzdW0odGFibGUsIGxlbmd0aCk7CisKKwkvKiBPYnRhaW4gYSBsb2NhbCBjb3B5IG9mIHRoZSBGQURUIGluIGNvbW1vbiBBQ1BJIDIuMCsgZm9ybWF0ICovCisKKwlhY3BpX3RiX2NyZWF0ZV9sb2NhbF9mYWR0KHRhYmxlLCBsZW5ndGgpOworCisJLyogQWxsIGRvbmUgd2l0aCB0aGUgcmVhbCBGQURULCB1bm1hcCBpdCAqLworCisJYWNwaV9vc191bm1hcF9tZW1vcnkodGFibGUsIGxlbmd0aCk7CisKKwkvKiBPYnRhaW4gdGhlIERTRFQgYW5kIEZBQ1MgdGFibGVzIHZpYSB0aGVpciBhZGRyZXNzZXMgd2l0aGluIHRoZSBGQURUICovCisKKwlhY3BpX3RiX2luc3RhbGxfdGFibGUoKGFjcGlfcGh5c2ljYWxfYWRkcmVzcykgYWNwaV9nYmxfRkFEVC5YZHNkdCwKKwkJCSAgICAgIGZsYWdzLCBBQ1BJX1NJR19EU0RULCBBQ1BJX1RBQkxFX0lOREVYX0RTRFQpOworCisJYWNwaV90Yl9pbnN0YWxsX3RhYmxlKChhY3BpX3BoeXNpY2FsX2FkZHJlc3MpIGFjcGlfZ2JsX0ZBRFQuWGZhY3MsCisJCQkgICAgICBmbGFncywgQUNQSV9TSUdfRkFDUywgQUNQSV9UQUJMRV9JTkRFWF9GQUNTKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV90Yl9jcmVhdGVfbG9jYWxfZmFkdAorICoKKyAqIFBBUkFNRVRFUlM6ICBUYWJsZSAgICAgICAgICAgICAgIC0gUG9pbnRlciB0byBCSU9TIEZBRFQKKyAqICAgICAgICAgICAgICBMZW5ndGggICAgICAgICAgICAgIC0gTGVuZ3RoIG9mIHRoZSB0YWJsZQorICoKKyAqIFJFVFVSTjogICAgICBOb25lCisgKgorICogREVTQ1JJUFRJT046IEdldCBhIGxvY2FsIGNvcHkgb2YgdGhlIEZBRFQgYW5kIGNvbnZlcnQgaXQgdG8gYSBjb21tb24gZm9ybWF0LgorICogICAgICAgICAgICAgIFBlcmZvcm1zIHZhbGlkYXRpb24gb24gc29tZSBpbXBvcnRhbnQgRkFEVCBmaWVsZHMuCisgKgorICogTk9URTogICAgICAgIFdlIGNyZWF0ZSBhIGxvY2FsIGNvcHkgb2YgdGhlIEZBRFQgcmVnYXJkbGVzcyBvZiB0aGUgdmVyc2lvbi4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIGFjcGlfdGJfY3JlYXRlX2xvY2FsX2ZhZHQoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICp0YWJsZSwgdTMyIGxlbmd0aCkKK3sKKworCS8qCisJICogQ2hlY2sgaWYgdGhlIEZBRFQgaXMgbGFyZ2VyIHRoYW4gdGhlIGxhcmdlc3QgdGFibGUgdGhhdCB3ZSBleHBlY3QKKwkgKiAodGhlIEFDUEkgMi4wLzMuMCB2ZXJzaW9uKS4gSWYgc28sIHRydW5jYXRlIHRoZSB0YWJsZSwgYW5kIGlzc3VlCisJICogYSB3YXJuaW5nLgorCSAqLworCWlmIChsZW5ndGggPiBzaXplb2Yoc3RydWN0IGFjcGlfdGFibGVfZmFkdCkpIHsKKwkJQUNQSV9XQVJOSU5HKChBRV9JTkZPLAorCQkJICAgICAgIkZBRFQgKHJldmlzaW9uICV1KSBpcyBsb25nZXIgdGhhbiBBQ1BJIDIuMCB2ZXJzaW9uLCAiCisJCQkgICAgICAidHJ1bmNhdGluZyBsZW5ndGggMHglWCB0byAweCV6WCIsCisJCQkgICAgICB0YWJsZS0+cmV2aXNpb24sICh1bnNpZ25lZClsZW5ndGgsCisJCQkgICAgICBzaXplb2Yoc3RydWN0IGFjcGlfdGFibGVfZmFkdCkpKTsKKwl9CisKKwkvKiBDbGVhciB0aGUgZW50aXJlIGxvY2FsIEZBRFQgKi8KKworCUFDUElfTUVNU0VUKCZhY3BpX2dibF9GQURULCAwLCBzaXplb2Yoc3RydWN0IGFjcGlfdGFibGVfZmFkdCkpOworCisJLyogQ29weSB0aGUgb3JpZ2luYWwgRkFEVCwgdXAgdG8gc2l6ZW9mIChzdHJ1Y3QgYWNwaV90YWJsZV9mYWR0KSAqLworCisJQUNQSV9NRU1DUFkoJmFjcGlfZ2JsX0ZBRFQsIHRhYmxlLAorCQkgICAgQUNQSV9NSU4obGVuZ3RoLCBzaXplb2Yoc3RydWN0IGFjcGlfdGFibGVfZmFkdCkpKTsKKworCS8qCisJICogMSkgQ29udmVydCB0aGUgbG9jYWwgY29weSBvZiB0aGUgRkFEVCB0byB0aGUgY29tbW9uIGludGVybmFsIGZvcm1hdAorCSAqIDIpIFZhbGlkYXRlIHNvbWUgb2YgdGhlIGltcG9ydGFudCB2YWx1ZXMgd2l0aGluIHRoZSBGQURUCisJICovCisJYWNwaV90Yl9jb252ZXJ0X2ZhZHQoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV90Yl9jb252ZXJ0X2ZhZHQKKyAqCisgKiBQQVJBTUVURVJTOiAgTm9uZSwgdXNlcyBhY3BpX2dibF9GQURUCisgKgorICogUkVUVVJOOiAgICAgIE5vbmUKKyAqCisgKiBERVNDUklQVElPTjogQ29udmVydHMgYWxsIHZlcnNpb25zIG9mIHRoZSBGQURUIHRvIGEgY29tbW9uIGludGVybmFsIGZvcm1hdC4KKyAqICAgICAgICAgICAgICBFeHBhbmQgYWxsIDMyLWJpdCBhZGRyZXNzZXMgdG8gNjQtYml0LgorICoKKyAqIE5PVEU6ICAgICAgICBhY3BpX2dibF9GQURUIG11c3QgYmUgb2Ygc2l6ZSAoc3RydWN0IGFjcGlfdGFibGVfZmFkdCksCisgKiAgICAgICAgICAgICAgYW5kIG11c3QgY29udGFpbiBhIGNvcHkgb2YgdGhlIGFjdHVhbCBGQURULgorICoKKyAqIEFDUElDQSB3aWxsIHVzZSB0aGUgIlgiIGZpZWxkcyBvZiB0aGUgRkFEVCBmb3IgYWxsIGFkZHJlc3Nlcy4KKyAqCisgKiAiWCIgZmllbGRzIGFyZSBvcHRpb25hbCBleHRlbnNpb25zIHRvIHRoZSBvcmlnaW5hbCBWMS4wIGZpZWxkcy4gRXZlbiBpZgorICogdGhleSBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLCB0aGV5IGNhbiBiZSBvcHRpb25hbGx5IG5vdCB1c2VkIGJ5CisgKiBzZXR0aW5nIHRoZW0gdG8gemVyby4gVGhlcmVmb3JlLCB3ZSBtdXN0IHNlbGVjdGl2ZWx5IGV4cGFuZCBWMS4wIGZpZWxkcworICogaWYgdGhlIGNvcnJlc3BvbmRpbmcgWCBmaWVsZCBpcyB6ZXJvLgorICoKKyAqIEZvciBBQ1BJIDEuMCBGQURUcywgYWxsIGFkZHJlc3MgZmllbGRzIGFyZSBleHBhbmRlZCB0byB0aGUgY29ycmVzcG9uZGluZworICogIlgiIGZpZWxkcy4KKyAqCisgKiBGb3IgQUNQSSAyLjAgRkFEVHMsIGFueSAiWCIgZmllbGRzIHRoYXQgYXJlIE5VTEwgYXJlIGZpbGxlZCBpbiBieQorICogZXhwYW5kaW5nIHRoZSBjb3JyZXNwb25kaW5nIEFDUEkgMS4wIGZpZWxkLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkIGFjcGlfdGJfY29udmVydF9mYWR0KHZvaWQpCit7CisJdTggcG0xX3JlZ2lzdGVyX2JpdF93aWR0aDsKKwl1OCBwbTFfcmVnaXN0ZXJfYnl0ZV93aWR0aDsKKwlzdHJ1Y3QgYWNwaV9nZW5lcmljX2FkZHJlc3MgKnRhcmdldDY0OworCXUzMiBpOworCisJLyogVXBkYXRlIHRoZSBsb2NhbCBGQURUIHRhYmxlIGhlYWRlciBsZW5ndGggKi8KKworCWFjcGlfZ2JsX0ZBRFQuaGVhZGVyLmxlbmd0aCA9IHNpemVvZihzdHJ1Y3QgYWNwaV90YWJsZV9mYWR0KTsKKworCS8qCisJICogRXhwYW5kIHRoZSAzMi1iaXQgRkFDUyBhbmQgRFNEVCBhZGRyZXNzZXMgdG8gNjQtYml0IGFzIG5lY2Vzc2FyeS4KKwkgKiBMYXRlciBjb2RlIHdpbGwgYWx3YXlzIHVzZSB0aGUgWCA2NC1iaXQgZmllbGQuIEFsc28sIGNoZWNrIGZvciBhbgorCSAqIGFkZHJlc3MgbWlzbWF0Y2ggYmV0d2VlbiB0aGUgMzItYml0IGFuZCA2NC1iaXQgYWRkcmVzcyBmaWVsZHMKKwkgKiAoRklSTVdBUkVfQ1RSTC9YX0ZJUk1XQVJFX0NUUkwsIERTRFQvWF9EU0RUKSB3aGljaCB3b3VsZCBpbmRpY2F0ZQorCSAqIHRoZSBwcmVzZW5jZSBvZiB0d28gRkFDUyBvciB0d28gRFNEVCB0YWJsZXMuCisJICovCisJaWYgKCFhY3BpX2dibF9GQURULlhmYWNzKSB7CisJCWFjcGlfZ2JsX0ZBRFQuWGZhY3MgPSAodTY0KSBhY3BpX2dibF9GQURULmZhY3M7CisJfSBlbHNlIGlmIChhY3BpX2dibF9GQURULmZhY3MgJiYKKwkJICAgKGFjcGlfZ2JsX0ZBRFQuWGZhY3MgIT0gKHU2NCkgYWNwaV9nYmxfRkFEVC5mYWNzKSkgeworCQlBQ1BJX1dBUk5JTkcoKEFFX0lORk8sCisJCSAgICAiMzIvNjQgRkFDUyBhZGRyZXNzIG1pc21hdGNoIGluIEZBRFQgLSB0d28gRkFDUyB0YWJsZXMhIikpOworCX0KKworCWlmICghYWNwaV9nYmxfRkFEVC5YZHNkdCkgeworCQlhY3BpX2dibF9GQURULlhkc2R0ID0gKHU2NCkgYWNwaV9nYmxfRkFEVC5kc2R0OworCX0gZWxzZSBpZiAoYWNwaV9nYmxfRkFEVC5kc2R0ICYmCisJCSAgIChhY3BpX2dibF9GQURULlhkc2R0ICE9ICh1NjQpIGFjcGlfZ2JsX0ZBRFQuZHNkdCkpIHsKKwkJQUNQSV9XQVJOSU5HKChBRV9JTkZPLAorCQkgICAgIjMyLzY0IERTRFQgYWRkcmVzcyBtaXNtYXRjaCBpbiBGQURUIC0gdHdvIERTRFQgdGFibGVzISIpKTsKKwl9CisKKwkvKgorCSAqIEZvciBBQ1BJIDEuMCBGQURUcyAocmV2aXNpb24gMSBvciAyKSwgZW5zdXJlIHRoYXQgcmVzZXJ2ZWQgZmllbGRzIHdoaWNoCisJICogc2hvdWxkIGJlIHplcm8gYXJlIGluZGVlZCB6ZXJvLiBUaGlzIHdpbGwgd29ya2Fyb3VuZCBCSU9TcyB0aGF0CisJICogaW5hZHZlcnRlbnRseSBwbGFjZSB2YWx1ZXMgaW4gdGhlc2UgZmllbGRzLgorCSAqCisJICogVGhlIEFDUEkgMS4wIHJlc2VydmVkIGZpZWxkcyB0aGF0IHdpbGwgYmUgemVyb2VkIGFyZSB0aGUgYnl0ZXMgbG9jYXRlZCBhdAorCSAqIG9mZnNldCA0NSwgNTUsIDk1LCBhbmQgdGhlIHdvcmQgbG9jYXRlZCBhdCBvZmZzZXQgMTA5LCAxMTAuCisJICovCisJaWYgKGFjcGlfZ2JsX0ZBRFQuaGVhZGVyLnJldmlzaW9uIDwgRkFEVDJfUkVWSVNJT05fSUQpIHsKKwkJYWNwaV9nYmxfRkFEVC5wcmVmZXJyZWRfcHJvZmlsZSA9IDA7CisJCWFjcGlfZ2JsX0ZBRFQucHN0YXRlX2NvbnRyb2wgPSAwOworCQlhY3BpX2dibF9GQURULmNzdF9jb250cm9sID0gMDsKKwkJYWNwaV9nYmxfRkFEVC5ib290X2ZsYWdzID0gMDsKKwl9CisKKwkvKgorCSAqIEV4cGFuZCB0aGUgQUNQSSAxLjAgMzItYml0IGFkZHJlc3NlcyB0byB0aGUgQUNQSSAyLjAgNjQtYml0ICJYIgorCSAqIGdlbmVyaWMgYWRkcmVzcyBzdHJ1Y3R1cmVzIGFzIG5lY2Vzc2FyeS4gTGF0ZXIgY29kZSB3aWxsIGFsd2F5cyB1c2UKKwkgKiB0aGUgNjQtYml0IGFkZHJlc3Mgc3RydWN0dXJlcy4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgQUNQSV9GQURUX0lORk9fRU5UUklFUzsgaSsrKSB7CisJCXRhcmdldDY0ID0KKwkJICAgIEFDUElfQUREX1BUUihzdHJ1Y3QgYWNwaV9nZW5lcmljX2FkZHJlc3MsICZhY3BpX2dibF9GQURULAorCQkJCSBmYWR0X2luZm9fdGFibGVbaV0uYWRkcmVzczY0KTsKKworCQkvKiBFeHBhbmQgb25seSBpZiB0aGUgNjQtYml0IFggdGFyZ2V0IGlzIG51bGwgKi8KKworCQlpZiAoIXRhcmdldDY0LT5hZGRyZXNzKSB7CisKKwkJCS8qIFRoZSBzcGFjZV9pZCBpcyBhbHdheXMgSS9PIGZvciB0aGUgMzItYml0IGxlZ2FjeSBhZGRyZXNzIGZpZWxkcyAqLworCisJCQlhY3BpX3RiX2luaXRfZ2VuZXJpY19hZGRyZXNzKHRhcmdldDY0LAorCQkJCQkJICAgICBBQ1BJX0FEUl9TUEFDRV9TWVNURU1fSU8sCisJCQkJCQkgICAgICpBQ1BJX0FERF9QVFIodTgsCisJCQkJCQkJCSAgICZhY3BpX2dibF9GQURULAorCQkJCQkJCQkgICBmYWR0X2luZm9fdGFibGUKKwkJCQkJCQkJICAgW2ldLmxlbmd0aCksCisJCQkJCQkgICAgICh1NjQpICogQUNQSV9BRERfUFRSKHUzMiwKKwkJCQkJCQkJCSAgJmFjcGlfZ2JsX0ZBRFQsCisJCQkJCQkJCQkgIGZhZHRfaW5mb190YWJsZQorCQkJCQkJCQkJICBbaV0uCisJCQkJCQkJCQkgIGFkZHJlc3MzMikpOworCQl9CisJfQorCisJLyogVmFsaWRhdGUgRkFEVCB2YWx1ZXMgbm93LCBiZWZvcmUgd2UgbWFrZSBhbnkgY2hhbmdlcyAqLworCisJYWNwaV90Yl92YWxpZGF0ZV9mYWR0KCk7CisKKwkvKgorCSAqIE9wdGlvbmFsbHkgY2hlY2sgYWxsIHJlZ2lzdGVyIGxlbmd0aHMgYWdhaW5zdCB0aGUgZGVmYXVsdCB2YWx1ZXMgYW5kCisJICogdXBkYXRlIHRoZW0gaWYgdGhleSBhcmUgaW5jb3JyZWN0LgorCSAqLworCWlmIChhY3BpX2dibF91c2VfZGVmYXVsdF9yZWdpc3Rlcl93aWR0aHMpIHsKKwkJZm9yIChpID0gMDsgaSA8IEFDUElfRkFEVF9JTkZPX0VOVFJJRVM7IGkrKykgeworCQkJdGFyZ2V0NjQgPQorCQkJICAgIEFDUElfQUREX1BUUihzdHJ1Y3QgYWNwaV9nZW5lcmljX2FkZHJlc3MsCisJCQkJCSAmYWNwaV9nYmxfRkFEVCwKKwkJCQkJIGZhZHRfaW5mb190YWJsZVtpXS5hZGRyZXNzNjQpOworCisJCQkvKgorCQkJICogSWYgYSB2YWxpZCByZWdpc3RlciAoQWRkcmVzcyAhPSAwKSBhbmQgdGhlIChkZWZhdWx0X2xlbmd0aCA+IDApCisJCQkgKiAoTm90IGEgR1BFIHJlZ2lzdGVyKSwgdGhlbiBjaGVjayB0aGUgd2lkdGggYWdhaW5zdCB0aGUgZGVmYXVsdC4KKwkJCSAqLworCQkJaWYgKCh0YXJnZXQ2NC0+YWRkcmVzcykgJiYKKwkJCSAgICAoZmFkdF9pbmZvX3RhYmxlW2ldLmRlZmF1bHRfbGVuZ3RoID4gMCkgJiYKKwkJCSAgICAoZmFkdF9pbmZvX3RhYmxlW2ldLmRlZmF1bHRfbGVuZ3RoICE9CisJCQkgICAgIHRhcmdldDY0LT5iaXRfd2lkdGgpKSB7CisJCQkJQUNQSV9XQVJOSU5HKChBRV9JTkZPLAorCQkJCQkgICAgICAiSW52YWxpZCBsZW5ndGggZm9yICVzOiAlZCwgdXNpbmcgZGVmYXVsdCAlZCIsCisJCQkJCSAgICAgIGZhZHRfaW5mb190YWJsZVtpXS5uYW1lLAorCQkJCQkgICAgICB0YXJnZXQ2NC0+Yml0X3dpZHRoLAorCQkJCQkgICAgICBmYWR0X2luZm9fdGFibGVbaV0uCisJCQkJCSAgICAgIGRlZmF1bHRfbGVuZ3RoKSk7CisKKwkJCQkvKiBJbmNvcnJlY3Qgc2l6ZSwgc2V0IHdpZHRoIHRvIHRoZSBkZWZhdWx0ICovCisKKwkJCQl0YXJnZXQ2NC0+Yml0X3dpZHRoID0KKwkJCQkgICAgZmFkdF9pbmZvX3RhYmxlW2ldLmRlZmF1bHRfbGVuZ3RoOworCQkJfQorCQl9CisJfQorCisJLyoKKwkgKiBHZXQgdGhlIGxlbmd0aCBvZiB0aGUgaW5kaXZpZHVhbCBQTTEgcmVnaXN0ZXJzIChlbmFibGUgYW5kIHN0YXR1cykuCisJICogRWFjaCByZWdpc3RlciBpcyBkZWZpbmVkIHRvIGJlIChldmVudCBibG9jayBsZW5ndGggLyAyKS4KKwkgKi8KKwlwbTFfcmVnaXN0ZXJfYml0X3dpZHRoID0KKwkgICAgKHU4KUFDUElfRElWXzIoYWNwaV9nYmxfRkFEVC54cG0xYV9ldmVudF9ibG9jay5iaXRfd2lkdGgpOworCXBtMV9yZWdpc3Rlcl9ieXRlX3dpZHRoID0gKHU4KUFDUElfRElWXzgocG0xX3JlZ2lzdGVyX2JpdF93aWR0aCk7CisKKwkvKgorCSAqIEFkanVzdCB0aGUgbGVuZ3RocyBvZiB0aGUgUE0xIEV2ZW50IEJsb2NrcyBzbyB0aGF0IHRoZXkgY2FuIGJlIHVzZWQgdG8KKwkgKiBhY2Nlc3MgdGhlIFBNMSBzdGF0dXMgcmVnaXN0ZXIocykuIFVzZSAod2lkdGggLyAyKQorCSAqLworCWFjcGlfZ2JsX0ZBRFQueHBtMWFfZXZlbnRfYmxvY2suYml0X3dpZHRoID0gcG0xX3JlZ2lzdGVyX2JpdF93aWR0aDsKKwlhY3BpX2dibF9GQURULnhwbTFiX2V2ZW50X2Jsb2NrLmJpdF93aWR0aCA9IHBtMV9yZWdpc3Rlcl9iaXRfd2lkdGg7CisKKwkvKgorCSAqIENhbGN1bGF0ZSBzZXBhcmF0ZSBHQVMgc3RydWN0cyBmb3IgdGhlIFBNMSBFbmFibGUgcmVnaXN0ZXJzLgorCSAqIFRoZXNlIGFkZHJlc3NlcyBkbyBub3QgYXBwZWFyIChkaXJlY3RseSkgaW4gdGhlIEZBRFQsIHNvIGl0IGlzCisJICogdXNlZnVsIHRvIGNhbGN1bGF0ZSB0aGVtIG9uY2UsIGhlcmUuCisJICoKKwkgKiBUaGUgUE0gZXZlbnQgYmxvY2tzIGFyZSBzcGxpdCBpbnRvIHR3byByZWdpc3RlciBibG9ja3MsIGZpcnN0IGlzIHRoZQorCSAqIFBNIFN0YXR1cyBSZWdpc3RlciBibG9jaywgZm9sbG93ZWQgaW1tZWRpYXRlbHkgYnkgdGhlIFBNIEVuYWJsZQorCSAqIFJlZ2lzdGVyIGJsb2NrLiBFYWNoIGlzIG9mIGxlbmd0aCAoeHBtMXhfZXZlbnRfYmxvY2suYml0X3dpZHRoLzIpLgorCSAqCisJICogT24gdmFyaW91cyBzeXN0ZW1zIHRoZSB2MiBmaWVsZHMgKGFuZCBwYXJ0aWN1bGFybHkgdGhlIGJpdCB3aWR0aHMpCisJICogY2Fubm90IGJlIHJlbGllZCB1cG9uLCB0aG91Z2guIEhlbmNlIHJlc29ydCB0byB1c2luZyB0aGUgdjEgbGVuZ3RoCisJICogaGVyZSAoYW5kIHdhcm4gYWJvdXQgdGhlIGluY29uc2lzdGVuY3kpLgorCSAqLworCWlmIChhY3BpX2dibF9GQURULnhwbTFhX2V2ZW50X2Jsb2NrLmJpdF93aWR0aAorCSAgICAhPSBhY3BpX2dibF9GQURULnBtMV9ldmVudF9sZW5ndGggKiA4KQorCQlwcmludGsoS0VSTl9XQVJOSU5HICJGQURUOiAiCisJCSAgICAgICAiWF9QTTFhX0VWVF9CTEsuYml0X3dpZHRoICgldSkgZG9lcyBub3QgbWF0Y2giCisJCSAgICAgICAiIFBNMV9FVlRfTEVOICgldSlcbiIsCisJCSAgICAgICBhY3BpX2dibF9GQURULnhwbTFhX2V2ZW50X2Jsb2NrLmJpdF93aWR0aCwKKwkJICAgICAgIGFjcGlfZ2JsX0ZBRFQucG0xX2V2ZW50X2xlbmd0aCk7CisKKwkvKiBUaGUgUE0xQSByZWdpc3RlciBibG9jayBpcyByZXF1aXJlZCAqLworCisJYWNwaV90Yl9pbml0X2dlbmVyaWNfYWRkcmVzcygmYWNwaV9nYmxfeHBtMWFfZW5hYmxlLAorCQkJCSAgICAgYWNwaV9nYmxfRkFEVC54cG0xYV9ldmVudF9ibG9jay5zcGFjZV9pZCwKKwkJCQkgICAgIHBtMV9yZWdpc3Rlcl9ieXRlX3dpZHRoLAorCQkJCSAgICAgKGFjcGlfZ2JsX0ZBRFQueHBtMWFfZXZlbnRfYmxvY2suYWRkcmVzcyArCisJCQkJICAgICAgcG0xX3JlZ2lzdGVyX2J5dGVfd2lkdGgpKTsKKwkvKiBEb24ndCBmb3JnZXQgdG8gY29weSBzcGFjZV9pZCBvZiB0aGUgR0FTICovCisJYWNwaV9nYmxfeHBtMWFfZW5hYmxlLnNwYWNlX2lkID0KKwkgICAgYWNwaV9nYmxfRkFEVC54cG0xYV9ldmVudF9ibG9jay5zcGFjZV9pZDsKKworCS8qIFRoZSBQTTFCIHJlZ2lzdGVyIGJsb2NrIGlzIG9wdGlvbmFsLCBpZ25vcmUgaWYgbm90IHByZXNlbnQgKi8KKworCWlmIChhY3BpX2dibF9GQURULnhwbTFiX2V2ZW50X2Jsb2NrLmFkZHJlc3MpIHsKKwkJaWYgKGFjcGlfZ2JsX0ZBRFQueHBtMWJfZXZlbnRfYmxvY2suYml0X3dpZHRoCisJCSAgICAhPSBhY3BpX2dibF9GQURULnBtMV9ldmVudF9sZW5ndGggKiA4KQorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiRkFEVDogIgorCQkJICAgICAgICJYX1BNMWJfRVZUX0JMSy5iaXRfd2lkdGggKCV1KSBkb2VzIG5vdCBtYXRjaCIKKwkJCSAgICAgICAiIFBNMV9FVlRfTEVOICgldSlcbiIsCisJCQkgICAgICAgYWNwaV9nYmxfRkFEVC54cG0xYl9ldmVudF9ibG9jay5iaXRfd2lkdGgsCisJCQkgICAgICAgYWNwaV9nYmxfRkFEVC5wbTFfZXZlbnRfbGVuZ3RoKTsKKwkJYWNwaV90Yl9pbml0X2dlbmVyaWNfYWRkcmVzcygmYWNwaV9nYmxfeHBtMWJfZW5hYmxlLAorCQkJCQkgICAgIGFjcGlfZ2JsX0ZBRFQueHBtMWJfZXZlbnRfYmxvY2suc3BhY2VfaWQsCisJCQkJCSAgICAgcG0xX3JlZ2lzdGVyX2J5dGVfd2lkdGgsCisJCQkJCSAgICAgKGFjcGlfZ2JsX0ZBRFQueHBtMWJfZXZlbnRfYmxvY2suCisJCQkJCSAgICAgIGFkZHJlc3MgKyBwbTFfcmVnaXN0ZXJfYnl0ZV93aWR0aCkpOworCQkvKiBEb24ndCBmb3JnZXQgdG8gY29weSBzcGFjZV9pZCBvZiB0aGUgR0FTICovCisJCWFjcGlfZ2JsX3hwbTFiX2VuYWJsZS5zcGFjZV9pZCA9CisJCSAgICBhY3BpX2dibF9GQURULnhwbTFiX2V2ZW50X2Jsb2NrLnNwYWNlX2lkOworCisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfdGJfdmFsaWRhdGVfZmFkdAorICoKKyAqIFBBUkFNRVRFUlM6ICBUYWJsZSAgICAgICAgICAgLSBQb2ludGVyIHRvIHRoZSBGQURUIHRvIGJlIHZhbGlkYXRlZAorICoKKyAqIFJFVFVSTjogICAgICBOb25lCisgKgorICogREVTQ1JJUFRJT046IFZhbGlkYXRlIHZhcmlvdXMgaW1wb3J0YW50IGZpZWxkcyB3aXRoaW4gdGhlIEZBRFQuIElmIGEgcHJvYmxlbQorICogICAgICAgICAgICAgIGlzIGZvdW5kLCBpc3N1ZSBhIG1lc3NhZ2UsIGJ1dCBubyBzdGF0dXMgaXMgcmV0dXJuZWQuCisgKiAgICAgICAgICAgICAgVXNlZCBieSBib3RoIHRoZSB0YWJsZSBtYW5hZ2VyIGFuZCB0aGUgZGlzYXNzZW1ibGVyLgorICoKKyAqIFBvc3NpYmxlIGFkZGl0aW9uYWwgY2hlY2tzOgorICogKGFjcGlfZ2JsX0ZBRFQucG0xX2V2ZW50X2xlbmd0aCA+PSA0KQorICogKGFjcGlfZ2JsX0ZBRFQucG0xX2NvbnRyb2xfbGVuZ3RoID49IDIpCisgKiAoYWNwaV9nYmxfRkFEVC5wbV90aW1lcl9sZW5ndGggPj0gNCkKKyAqIEdwZSBibG9jayBsZW5ndGhzIG11c3QgYmUgbXVsdGlwbGUgb2YgMgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkIGFjcGlfdGJfdmFsaWRhdGVfZmFkdCh2b2lkKQoreworCWNoYXIgKm5hbWU7CisJdTMyICphZGRyZXNzMzI7CisJc3RydWN0IGFjcGlfZ2VuZXJpY19hZGRyZXNzICphZGRyZXNzNjQ7CisJdTggbGVuZ3RoOworCXUzMiBpOworCisJLyoKKwkgKiBDaGVjayBmb3IgRkFDUyBhbmQgRFNEVCBhZGRyZXNzIG1pc21hdGNoZXMuIEFuIGFkZHJlc3MgbWlzbWF0Y2ggYmV0d2VlbgorCSAqIHRoZSAzMi1iaXQgYW5kIDY0LWJpdCBhZGRyZXNzIGZpZWxkcyAoRklSTVdBUkVfQ1RSTC9YX0ZJUk1XQVJFX0NUUkwgYW5kCisJICogRFNEVC9YX0RTRFQpIHdvdWxkIGluZGljYXRlIHRoZSBwcmVzZW5jZSBvZiB0d28gRkFDUyBvciB0d28gRFNEVCB0YWJsZXMuCisJICovCisJaWYgKGFjcGlfZ2JsX0ZBRFQuZmFjcyAmJgorCSAgICAoYWNwaV9nYmxfRkFEVC5YZmFjcyAhPSAodTY0KSBhY3BpX2dibF9GQURULmZhY3MpKSB7CisJCUFDUElfV0FSTklORygoQUVfSU5GTywKKwkJCSAgICAgICIzMi82NFggRkFDUyBhZGRyZXNzIG1pc21hdGNoIGluIEZBRFQgLSAiCisJCQkgICAgICAidHdvIEZBQ1MgdGFibGVzISAlOC44WC8lOC44WCU4LjhYIiwKKwkJCSAgICAgIGFjcGlfZ2JsX0ZBRFQuZmFjcywKKwkJCSAgICAgIEFDUElfRk9STUFUX1VJTlQ2NChhY3BpX2dibF9GQURULlhmYWNzKSkpOworCX0KKworCWlmIChhY3BpX2dibF9GQURULmRzZHQgJiYKKwkgICAgKGFjcGlfZ2JsX0ZBRFQuWGRzZHQgIT0gKHU2NCkgYWNwaV9nYmxfRkFEVC5kc2R0KSkgeworCQlBQ1BJX1dBUk5JTkcoKEFFX0lORk8sCisJCQkgICAgICAiMzIvNjRYIERTRFQgYWRkcmVzcyBtaXNtYXRjaCBpbiBGQURUIC0gIgorCQkJICAgICAgInR3byBEU0RUIHRhYmxlcyEgJTguOFgvJTguOFglOC44WCIsCisJCQkgICAgICBhY3BpX2dibF9GQURULmRzZHQsCisJCQkgICAgICBBQ1BJX0ZPUk1BVF9VSU5UNjQoYWNwaV9nYmxfRkFEVC5YZHNkdCkpKTsKKwl9CisKKwkvKiBFeGFtaW5lIGFsbCBvZiB0aGUgNjQtYml0IGV4dGVuZGVkIGFkZHJlc3MgZmllbGRzIChYIGZpZWxkcykgKi8KKworCWZvciAoaSA9IDA7IGkgPCBBQ1BJX0ZBRFRfSU5GT19FTlRSSUVTOyBpKyspIHsKKwkJLyoKKwkJICogR2VuZXJhdGUgcG9pbnRlcnMgdG8gdGhlIDMyLWJpdCBhbmQgNjQtYml0IGFkZHJlc3NlcywgZ2V0IHRoZQorCQkgKiByZWdpc3RlciBsZW5ndGggKHdpZHRoKSwgYW5kIHRoZSByZWdpc3RlciBuYW1lCisJCSAqLworCQlhZGRyZXNzNjQgPSBBQ1BJX0FERF9QVFIoc3RydWN0IGFjcGlfZ2VuZXJpY19hZGRyZXNzLAorCQkJCQkgJmFjcGlfZ2JsX0ZBRFQsCisJCQkJCSBmYWR0X2luZm9fdGFibGVbaV0uYWRkcmVzczY0KTsKKwkJYWRkcmVzczMyID0KKwkJICAgIEFDUElfQUREX1BUUih1MzIsICZhY3BpX2dibF9GQURULAorCQkJCSBmYWR0X2luZm9fdGFibGVbaV0uYWRkcmVzczMyKTsKKwkJbGVuZ3RoID0KKwkJICAgICpBQ1BJX0FERF9QVFIodTgsICZhY3BpX2dibF9GQURULAorCQkJCSAgZmFkdF9pbmZvX3RhYmxlW2ldLmxlbmd0aCk7CisJCW5hbWUgPSBmYWR0X2luZm9fdGFibGVbaV0ubmFtZTsKKworCQkvKgorCQkgKiBGb3IgZWFjaCBleHRlbmRlZCBmaWVsZCwgY2hlY2sgZm9yIGxlbmd0aCBtaXNtYXRjaCBiZXR3ZWVuIHRoZQorCQkgKiBsZWdhY3kgbGVuZ3RoIGZpZWxkIGFuZCB0aGUgY29ycmVzcG9uZGluZyA2NC1iaXQgWCBsZW5ndGggZmllbGQuCisJCSAqLworCQlpZiAoYWRkcmVzczY0ICYmIChhZGRyZXNzNjQtPmJpdF93aWR0aCAhPSBBQ1BJX01VTF84KGxlbmd0aCkpKSB7CisJCQlBQ1BJX1dBUk5JTkcoKEFFX0lORk8sCisJCQkJICAgICAgIjMyLzY0WCBsZW5ndGggbWlzbWF0Y2ggaW4gJXM6ICVkLyVkIiwKKwkJCQkgICAgICBuYW1lLCBBQ1BJX01VTF84KGxlbmd0aCksCisJCQkJICAgICAgYWRkcmVzczY0LT5iaXRfd2lkdGgpKTsKKwkJfQorCisJCWlmIChmYWR0X2luZm9fdGFibGVbaV0udHlwZSAmIEFDUElfRkFEVF9SRVFVSVJFRCkgeworCQkJLyoKKwkJCSAqIEZpZWxkIGlzIHJlcXVpcmVkIChQbTFhX2V2ZW50LCBQbTFhX2NvbnRyb2wsIHBtX3RpbWVyKS4KKwkJCSAqIEJvdGggdGhlIGFkZHJlc3MgYW5kIGxlbmd0aCBtdXN0IGJlIG5vbi16ZXJvLgorCQkJICovCisJCQlpZiAoIWFkZHJlc3M2NC0+YWRkcmVzcyB8fCAhbGVuZ3RoKSB7CisJCQkJQUNQSV9FUlJPUigoQUVfSU5GTywKKwkJCQkJICAgICJSZXF1aXJlZCBmaWVsZCAlcyBoYXMgemVybyBhZGRyZXNzIGFuZC9vciBsZW5ndGg6ICU4LjhYJTguOFgvJVgiLAorCQkJCQkgICAgbmFtZSwKKwkJCQkJICAgIEFDUElfRk9STUFUX1VJTlQ2NChhZGRyZXNzNjQtPgorCQkJCQkJCSAgICAgICBhZGRyZXNzKSwKKwkJCQkJICAgIGxlbmd0aCkpOworCQkJfQorCQl9IGVsc2UgaWYgKGZhZHRfaW5mb190YWJsZVtpXS50eXBlICYgQUNQSV9GQURUX1NFUEFSQVRFX0xFTkdUSCkgeworCQkJLyoKKwkJCSAqIEZpZWxkIGlzIG9wdGlvbmFsIChQTTJDb250cm9sLCBHUEUwLCBHUEUxKSBBTkQgaGFzIGl0cyBvd24KKwkJCSAqIGxlbmd0aCBmaWVsZC4gSWYgcHJlc2VudCwgYm90aCB0aGUgYWRkcmVzcyBhbmQgbGVuZ3RoIG11c3QgYmUgdmFsaWQuCisJCQkgKi8KKwkJCWlmICgoYWRkcmVzczY0LT5hZGRyZXNzICYmICFsZW5ndGgpCisJCQkgICAgfHwgKCFhZGRyZXNzNjQtPmFkZHJlc3MgJiYgbGVuZ3RoKSkgeworCQkJCUFDUElfV0FSTklORygoQUVfSU5GTywKKwkJCQkJICAgICAgIk9wdGlvbmFsIGZpZWxkICVzIGhhcyB6ZXJvIGFkZHJlc3Mgb3IgbGVuZ3RoOiAlOC44WCU4LjhYLyVYIiwKKwkJCQkJICAgICAgbmFtZSwKKwkJCQkJICAgICAgQUNQSV9GT1JNQVRfVUlOVDY0KGFkZHJlc3M2NC0+CisJCQkJCQkJCSBhZGRyZXNzKSwKKwkJCQkJICAgICAgbGVuZ3RoKSk7CisJCQl9CisJCX0KKworCQkvKiBJZiBib3RoIDMyLSBhbmQgNjQtYml0IGFkZHJlc3NlcyBhcmUgdmFsaWQgKG5vbi16ZXJvKSwgdGhleSBtdXN0IG1hdGNoICovCisKKwkJaWYgKGFkZHJlc3M2NC0+YWRkcmVzcyAmJiAqYWRkcmVzczMyICYmCisJCSAgICAoYWRkcmVzczY0LT5hZGRyZXNzICE9ICh1NjQpICogYWRkcmVzczMyKSkgeworCQkJQUNQSV9FUlJPUigoQUVfSU5GTywKKwkJCQkgICAgIjMyLzY0WCBhZGRyZXNzIG1pc21hdGNoIGluICVzOiAlOC44WC8lOC44WCU4LjhYLCB1c2luZyA2NFgiLAorCQkJCSAgICBuYW1lLCAqYWRkcmVzczMyLAorCQkJCSAgICBBQ1BJX0ZPUk1BVF9VSU5UNjQoYWRkcmVzczY0LT5hZGRyZXNzKSkpOworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS90YmZpbmQuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvdGJmaW5kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTA1NGRmZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvdGJmaW5kLmMKQEAgLTAsMCArMSwxNDAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBNb2R1bGUgTmFtZTogdGJmaW5kICAgLSBmaW5kIHRhYmxlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwOCwgSW50ZWwgQ29ycC4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKKyAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIGF0IG1pbmltdW0gYSBkaXNjbGFpbWVyCisgKiAgICBzdWJzdGFudGlhbGx5IHNpbWlsYXIgdG8gdGhlICJOTyBXQVJSQU5UWSIgZGlzY2xhaW1lciBiZWxvdworICogICAgKCJEaXNjbGFpbWVyIikgYW5kIGFueSByZWRpc3RyaWJ1dGlvbiBtdXN0IGJlIGNvbmRpdGlvbmVkIHVwb24KKyAqICAgIGluY2x1ZGluZyBhIHN1YnN0YW50aWFsbHkgc2ltaWxhciBEaXNjbGFpbWVyIHJlcXVpcmVtZW50IGZvciBmdXJ0aGVyCisgKiAgICBiaW5hcnkgcmVkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMKKyAqICAgIG9mIGFueSBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogTk8gV0FSUkFOVFkKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HCisgKiBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KKyAqLworCisjaW5jbHVkZSA8YWNwaS9hY3BpLmg+CisjaW5jbHVkZSAiYWNjb21tb24uaCIKKyNpbmNsdWRlICJhY3RhYmxlcy5oIgorCisjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9UQUJMRVMKK0FDUElfTU9EVUxFX05BTUUoInRiZmluZCIpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfdGJfZmluZF90YWJsZQorICoKKyAqIFBBUkFNRVRFUlM6ICBTaWduYXR1cmUgICAgICAgICAgIC0gU3RyaW5nIHdpdGggQUNQSSB0YWJsZSBzaWduYXR1cmUKKyAqICAgICAgICAgICAgICBvZW1faWQgICAgICAgICAgICAgIC0gU3RyaW5nIHdpdGggdGhlIHRhYmxlIE9FTSBJRAorICogICAgICAgICAgICAgIG9lbV90YWJsZV9pZCAgICAgICAgLSBTdHJpbmcgd2l0aCB0aGUgT0VNIFRhYmxlIElECisgKiAgICAgICAgICAgICAgdGFibGVfaW5kZXggICAgICAgICAtIFdoZXJlIHRoZSB0YWJsZSBpbmRleCBpcyByZXR1cm5lZAorICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMgYW5kIHRhYmxlIGluZGV4CisgKgorICogREVTQ1JJUFRJT046IEZpbmQgYW4gQUNQSSB0YWJsZSAoaW4gdGhlIFJTRFQvWFNEVCkgdGhhdCBtYXRjaGVzIHRoZQorICogICAgICAgICAgICAgIFNpZ25hdHVyZSwgT0VNIElEIGFuZCBPRU0gVGFibGUgSUQuIFJldHVybnMgYW4gaW5kZXggdGhhdCBjYW4KKyAqICAgICAgICAgICAgICBiZSB1c2VkIHRvIGdldCB0aGUgdGFibGUgaGVhZGVyIG9yIGVudGlyZSB0YWJsZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYWNwaV9zdGF0dXMKK2FjcGlfdGJfZmluZF90YWJsZShjaGFyICpzaWduYXR1cmUsCisJCSAgIGNoYXIgKm9lbV9pZCwgY2hhciAqb2VtX3RhYmxlX2lkLCB1MzIgKnRhYmxlX2luZGV4KQoreworCXUzMiBpOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwlzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgaGVhZGVyOworCisJQUNQSV9GVU5DVElPTl9UUkFDRSh0Yl9maW5kX3RhYmxlKTsKKworCS8qIE5vcm1hbGl6ZSB0aGUgaW5wdXQgc3RyaW5ncyAqLworCisJQUNQSV9NRU1TRVQoJmhlYWRlciwgMCwgc2l6ZW9mKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlcikpOworCUFDUElfU1RSTkNQWShoZWFkZXIuc2lnbmF0dXJlLCBzaWduYXR1cmUsIEFDUElfTkFNRV9TSVpFKTsKKwlBQ1BJX1NUUk5DUFkoaGVhZGVyLm9lbV9pZCwgb2VtX2lkLCBBQ1BJX09FTV9JRF9TSVpFKTsKKwlBQ1BJX1NUUk5DUFkoaGVhZGVyLm9lbV90YWJsZV9pZCwgb2VtX3RhYmxlX2lkLCBBQ1BJX09FTV9UQUJMRV9JRF9TSVpFKTsKKworCS8qIFNlYXJjaCBmb3IgdGhlIHRhYmxlICovCisKKwlmb3IgKGkgPSAwOyBpIDwgYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LmNvdW50OyArK2kpIHsKKwkJaWYgKEFDUElfTUVNQ01QKCYoYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LnRhYmxlc1tpXS5zaWduYXR1cmUpLAorCQkJCWhlYWRlci5zaWduYXR1cmUsIEFDUElfTkFNRV9TSVpFKSkgeworCisJCQkvKiBOb3QgdGhlIHJlcXVlc3RlZCB0YWJsZSAqLworCisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIFRhYmxlIHdpdGggbWF0Y2hpbmcgc2lnbmF0dXJlIGhhcyBiZWVuIGZvdW5kICovCisKKwkJaWYgKCFhY3BpX2dibF9yb290X3RhYmxlX2xpc3QudGFibGVzW2ldLnBvaW50ZXIpIHsKKworCQkJLyogVGFibGUgaXMgbm90IGN1cnJlbnRseSBtYXBwZWQsIG1hcCBpdCAqLworCisJCQlzdGF0dXMgPQorCQkJICAgIGFjcGlfdGJfdmVyaWZ5X3RhYmxlKCZhY3BpX2dibF9yb290X3RhYmxlX2xpc3QuCisJCQkJCQkgdGFibGVzW2ldKTsKKwkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworCQkJfQorCisJCQlpZiAoIWFjcGlfZ2JsX3Jvb3RfdGFibGVfbGlzdC50YWJsZXNbaV0ucG9pbnRlcikgeworCQkJCWNvbnRpbnVlOworCQkJfQorCQl9CisKKwkJLyogQ2hlY2sgZm9yIHRhYmxlIG1hdGNoIG9uIGFsbCBJRHMgKi8KKworCQlpZiAoIUFDUElfTUVNQ01QCisJCSAgICAoYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LnRhYmxlc1tpXS5wb2ludGVyLT5zaWduYXR1cmUsCisJCSAgICAgaGVhZGVyLnNpZ25hdHVyZSwgQUNQSV9OQU1FX1NJWkUpICYmICghb2VtX2lkWzBdCisJCQkJCQkJICAgfHwKKwkJCQkJCQkgICAhQUNQSV9NRU1DTVAKKwkJCQkJCQkgICAoYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LgorCQkJCQkJCSAgICB0YWJsZXNbaV0ucG9pbnRlci0+CisJCQkJCQkJICAgIG9lbV9pZCwKKwkJCQkJCQkgICAgaGVhZGVyLm9lbV9pZCwKKwkJCQkJCQkgICAgQUNQSV9PRU1fSURfU0laRSkpCisJCSAgICAmJiAoIW9lbV90YWJsZV9pZFswXQorCQkJfHwgIUFDUElfTUVNQ01QKGFjcGlfZ2JsX3Jvb3RfdGFibGVfbGlzdC50YWJsZXNbaV0uCisJCQkJCXBvaW50ZXItPm9lbV90YWJsZV9pZCwKKwkJCQkJaGVhZGVyLm9lbV90YWJsZV9pZCwKKwkJCQkJQUNQSV9PRU1fVEFCTEVfSURfU0laRSkpKSB7CisJCQkqdGFibGVfaW5kZXggPSBpOworCisJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX1RBQkxFUywKKwkJCQkJICAiRm91bmQgdGFibGUgWyU0LjRzXVxuIiwKKwkJCQkJICBoZWFkZXIuc2lnbmF0dXJlKSk7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOworCQl9CisJfQorCisJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PVF9GT1VORCk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL3RiaW5zdGFsLmMgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL3RiaW5zdGFsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzczNzRiMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvdGJpbnN0YWwuYwpAQCAtMCwwICsxLDU3NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIE1vZHVsZSBOYW1lOiB0Ymluc3RhbCAtIEFDUEkgdGFibGUgaW5zdGFsbGF0aW9uIGFuZCByZW1vdmFsCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwOCwgSW50ZWwgQ29ycC4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKKyAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIGF0IG1pbmltdW0gYSBkaXNjbGFpbWVyCisgKiAgICBzdWJzdGFudGlhbGx5IHNpbWlsYXIgdG8gdGhlICJOTyBXQVJSQU5UWSIgZGlzY2xhaW1lciBiZWxvdworICogICAgKCJEaXNjbGFpbWVyIikgYW5kIGFueSByZWRpc3RyaWJ1dGlvbiBtdXN0IGJlIGNvbmRpdGlvbmVkIHVwb24KKyAqICAgIGluY2x1ZGluZyBhIHN1YnN0YW50aWFsbHkgc2ltaWxhciBEaXNjbGFpbWVyIHJlcXVpcmVtZW50IGZvciBmdXJ0aGVyCisgKiAgICBiaW5hcnkgcmVkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMKKyAqICAgIG9mIGFueSBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogTk8gV0FSUkFOVFkKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HCisgKiBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KKyAqLworCisjaW5jbHVkZSA8YWNwaS9hY3BpLmg+CisjaW5jbHVkZSAiYWNjb21tb24uaCIKKyNpbmNsdWRlICJhY25hbWVzcC5oIgorI2luY2x1ZGUgImFjdGFibGVzLmgiCisKKyNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX1RBQkxFUworQUNQSV9NT0RVTEVfTkFNRSgidGJpbnN0YWwiKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfdGJfdmVyaWZ5X3RhYmxlCisgKgorICogUEFSQU1FVEVSUzogIHRhYmxlX2Rlc2MgICAgICAgICAgLSB0YWJsZQorICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gdmVyaWZ5IGFuZCBtYXAgdGFibGUKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCithY3BpX3N0YXR1cyBhY3BpX3RiX3ZlcmlmeV90YWJsZShzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjICp0YWJsZV9kZXNjKQoreworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOworCisJQUNQSV9GVU5DVElPTl9UUkFDRSh0Yl92ZXJpZnlfdGFibGUpOworCisJLyogTWFwIHRoZSB0YWJsZSBpZiBuZWNlc3NhcnkgKi8KKworCWlmICghdGFibGVfZGVzYy0+cG9pbnRlcikgeworCQlpZiAoKHRhYmxlX2Rlc2MtPmZsYWdzICYgQUNQSV9UQUJMRV9PUklHSU5fTUFTSykgPT0KKwkJICAgIEFDUElfVEFCTEVfT1JJR0lOX01BUFBFRCkgeworCQkJdGFibGVfZGVzYy0+cG9pbnRlciA9CisJCQkgICAgYWNwaV9vc19tYXBfbWVtb3J5KHRhYmxlX2Rlc2MtPmFkZHJlc3MsCisJCQkJCSAgICAgICB0YWJsZV9kZXNjLT5sZW5ndGgpOworCQl9CisJCWlmICghdGFibGVfZGVzYy0+cG9pbnRlcikgeworCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX01FTU9SWSk7CisJCX0KKwl9CisKKwkvKiBGQUNTIGlzIHRoZSBvZGQgdGFibGUsIGhhcyBubyBzdGFuZGFyZCBBQ1BJIGhlYWRlciBhbmQgbm8gY2hlY2tzdW0gKi8KKworCWlmICghQUNQSV9DT01QQVJFX05BTUUoJnRhYmxlX2Rlc2MtPnNpZ25hdHVyZSwgQUNQSV9TSUdfRkFDUykpIHsKKworCQkvKiBBbHdheXMgY2FsY3VsYXRlIGNoZWNrc3VtLCBpZ25vcmUgYmFkIGNoZWNrc3VtIGlmIHJlcXVlc3RlZCAqLworCisJCXN0YXR1cyA9CisJCSAgICBhY3BpX3RiX3ZlcmlmeV9jaGVja3N1bSh0YWJsZV9kZXNjLT5wb2ludGVyLAorCQkJCQkgICAgdGFibGVfZGVzYy0+bGVuZ3RoKTsKKwl9CisKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV90Yl9hZGRfdGFibGUKKyAqCisgKiBQQVJBTUVURVJTOiAgdGFibGVfZGVzYyAgICAgICAgICAtIFRhYmxlIGRlc2NyaXB0b3IKKyAqICAgICAgICAgICAgICB0YWJsZV9pbmRleCAgICAgICAgIC0gV2hlcmUgdGhlIHRhYmxlIGluZGV4IGlzIHJldHVybmVkCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBhZGQgdGhlIEFDUEkgdGFibGUKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCithY3BpX3N0YXR1cworYWNwaV90Yl9hZGRfdGFibGUoc3RydWN0IGFjcGlfdGFibGVfZGVzYyAqdGFibGVfZGVzYywgdTMyICp0YWJsZV9pbmRleCkKK3sKKwl1MzIgaTsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0UodGJfYWRkX3RhYmxlKTsKKworCWlmICghdGFibGVfZGVzYy0+cG9pbnRlcikgeworCQlzdGF0dXMgPSBhY3BpX3RiX3ZlcmlmeV90YWJsZSh0YWJsZV9kZXNjKTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpIHx8ICF0YWJsZV9kZXNjLT5wb2ludGVyKSB7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKKwkJfQorCX0KKworCS8qCisJICogT3JpZ2luYWxseSwgd2UgY2hlY2tlZCB0aGUgdGFibGUgc2lnbmF0dXJlIGZvciAiU1NEVCIgb3IgIlBTRFQiIGhlcmUuCisJICogTmV4dCwgd2UgYWRkZWQgc3VwcG9ydCBmb3IgT0VNeCB0YWJsZXMsIHNpZ25hdHVyZSAiT0VNIi4KKwkgKiBWYWxpZCB0YWJsZXMgd2VyZSBlbmNvdW50ZXJlZCB3aXRoIGEgbnVsbCBzaWduYXR1cmUsIHNvIHdlJ3ZlIGp1c3QKKwkgKiBnaXZlbiB1cCBvbiB2YWxpZGF0aW5nIHRoZSBzaWduYXR1cmUsIHNpbmNlIGl0IHNlZW1zIHRvIGJlIGEgd2FzdGUKKwkgKiBvZiBjb2RlLiBUaGUgb3JpZ2luYWwgY29kZSB3YXMgcmVtb3ZlZCAoMDUvMjAwOCkuCisJICovCisKKwkodm9pZClhY3BpX3V0X2FjcXVpcmVfbXV0ZXgoQUNQSV9NVFhfVEFCTEVTKTsKKworCS8qIENoZWNrIGlmIHRhYmxlIGlzIGFscmVhZHkgcmVnaXN0ZXJlZCAqLworCisJZm9yIChpID0gMDsgaSA8IGFjcGlfZ2JsX3Jvb3RfdGFibGVfbGlzdC5jb3VudDsgKytpKSB7CisJCWlmICghYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LnRhYmxlc1tpXS5wb2ludGVyKSB7CisJCQlzdGF0dXMgPQorCQkJICAgIGFjcGlfdGJfdmVyaWZ5X3RhYmxlKCZhY3BpX2dibF9yb290X3RhYmxlX2xpc3QuCisJCQkJCQkgdGFibGVzW2ldKTsKKwkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKQorCQkJICAgIHx8ICFhY3BpX2dibF9yb290X3RhYmxlX2xpc3QudGFibGVzW2ldLnBvaW50ZXIpIHsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJfQorCisJCS8qCisJCSAqIENoZWNrIGZvciBhIHRhYmxlIG1hdGNoIG9uIHRoZSBlbnRpcmUgdGFibGUgbGVuZ3RoLAorCQkgKiBub3QganVzdCB0aGUgaGVhZGVyLgorCQkgKi8KKwkJaWYgKHRhYmxlX2Rlc2MtPmxlbmd0aCAhPQorCQkgICAgYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LnRhYmxlc1tpXS5sZW5ndGgpIHsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKEFDUElfTUVNQ01QKHRhYmxlX2Rlc2MtPnBvaW50ZXIsCisJCQkJYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LnRhYmxlc1tpXS5wb2ludGVyLAorCQkJCWFjcGlfZ2JsX3Jvb3RfdGFibGVfbGlzdC50YWJsZXNbaV0ubGVuZ3RoKSkgeworCQkJY29udGludWU7CisJCX0KKworCQkvKgorCQkgKiBOb3RlOiB0aGUgY3VycmVudCBtZWNoYW5pc20gZG9lcyBub3QgdW5yZWdpc3RlciBhIHRhYmxlIGlmIGl0IGlzCisJCSAqIGR5bmFtaWNhbGx5IHVubG9hZGVkLiBUaGUgcmVsYXRlZCBuYW1lc3BhY2UgZW50cmllcyBhcmUgZGVsZXRlZCwKKwkJICogYnV0IHRoZSB0YWJsZSByZW1haW5zIGluIHRoZSByb290IHRhYmxlIGxpc3QuCisJCSAqCisJCSAqIFRoZSBhc3N1bXB0aW9uIGhlcmUgaXMgdGhhdCB0aGUgbnVtYmVyIG9mIGRpZmZlcmVudCB0YWJsZXMgdGhhdAorCQkgKiB3aWxsIGJlIGxvYWRlZCBpcyBhY3R1YWxseSBzbWFsbCwgYW5kIHRoZXJlIGlzIG1pbmltYWwgb3ZlcmhlYWQKKwkJICogaW4ganVzdCBrZWVwaW5nIHRoZSB0YWJsZSBpbiBjYXNlIGl0IGlzIG5lZWRlZCBhZ2Fpbi4KKwkJICoKKwkJICogSWYgdGhpcyBhc3N1bXB0aW9uIGNoYW5nZXMgaW4gdGhlIGZ1dHVyZSAocGVyaGFwcyBvbiBsYXJnZQorCQkgKiBtYWNoaW5lcyB3aXRoIG1hbnkgdGFibGUgbG9hZC91bmxvYWQgb3BlcmF0aW9ucyksIHRhYmxlcyB3aWxsCisJCSAqIG5lZWQgdG8gYmUgdW5yZWdpc3RlcmVkIHdoZW4gdGhleSBhcmUgdW5sb2FkZWQsIGFuZCBzbG90cyBpbiB0aGUKKwkJICogcm9vdCB0YWJsZSBsaXN0IHNob3VsZCBiZSByZXVzZWQgd2hlbiBlbXB0eS4KKwkJICovCisKKwkJLyoKKwkJICogVGFibGUgaXMgYWxyZWFkeSByZWdpc3RlcmVkLgorCQkgKiBXZSBjYW4gZGVsZXRlIHRoZSB0YWJsZSB0aGF0IHdhcyBwYXNzZWQgYXMgYSBwYXJhbWV0ZXIuCisJCSAqLworCQlhY3BpX3RiX2RlbGV0ZV90YWJsZSh0YWJsZV9kZXNjKTsKKwkJKnRhYmxlX2luZGV4ID0gaTsKKworCQlpZiAoYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LnRhYmxlc1tpXS4KKwkJICAgIGZsYWdzICYgQUNQSV9UQUJMRV9JU19MT0FERUQpIHsKKworCQkJLyogVGFibGUgaXMgc3RpbGwgbG9hZGVkLCB0aGlzIGlzIGFuIGVycm9yICovCisKKwkJCXN0YXR1cyA9IEFFX0FMUkVBRFlfRVhJU1RTOworCQkJZ290byByZWxlYXNlOworCQl9IGVsc2UgeworCQkJLyogVGFibGUgd2FzIHVubG9hZGVkLCBhbGxvdyBpdCB0byBiZSByZWxvYWRlZCAqLworCisJCQl0YWJsZV9kZXNjLT5wb2ludGVyID0KKwkJCSAgICBhY3BpX2dibF9yb290X3RhYmxlX2xpc3QudGFibGVzW2ldLnBvaW50ZXI7CisJCQl0YWJsZV9kZXNjLT5hZGRyZXNzID0KKwkJCSAgICBhY3BpX2dibF9yb290X3RhYmxlX2xpc3QudGFibGVzW2ldLmFkZHJlc3M7CisJCQlzdGF0dXMgPSBBRV9PSzsKKwkJCWdvdG8gcHJpbnRfaGVhZGVyOworCQl9CisJfQorCisJLyogQWRkIHRoZSB0YWJsZSB0byB0aGUgZ2xvYmFsIHJvb3QgdGFibGUgbGlzdCAqLworCisJc3RhdHVzID0gYWNwaV90Yl9zdG9yZV90YWJsZSh0YWJsZV9kZXNjLT5hZGRyZXNzLCB0YWJsZV9kZXNjLT5wb2ludGVyLAorCQkJCSAgICAgdGFibGVfZGVzYy0+bGVuZ3RoLCB0YWJsZV9kZXNjLT5mbGFncywKKwkJCQkgICAgIHRhYmxlX2luZGV4KTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJZ290byByZWxlYXNlOworCX0KKworICAgICAgcHJpbnRfaGVhZGVyOgorCWFjcGlfdGJfcHJpbnRfdGFibGVfaGVhZGVyKHRhYmxlX2Rlc2MtPmFkZHJlc3MsIHRhYmxlX2Rlc2MtPnBvaW50ZXIpOworCisgICAgICByZWxlYXNlOgorCSh2b2lkKWFjcGlfdXRfcmVsZWFzZV9tdXRleChBQ1BJX01UWF9UQUJMRVMpOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX3RiX3Jlc2l6ZV9yb290X3RhYmxlX2xpc3QKKyAqCisgKiBQQVJBTUVURVJTOiAgTm9uZQorICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogRXhwYW5kIHRoZSBzaXplIG9mIGdsb2JhbCB0YWJsZSBhcnJheQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2FjcGlfc3RhdHVzIGFjcGlfdGJfcmVzaXplX3Jvb3RfdGFibGVfbGlzdCh2b2lkKQoreworCXN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgKnRhYmxlczsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0UodGJfcmVzaXplX3Jvb3RfdGFibGVfbGlzdCk7CisKKwkvKiBhbGxvd19yZXNpemUgZmxhZyBpcyBhIHBhcmFtZXRlciB0byBhY3BpX2luaXRpYWxpemVfdGFibGVzICovCisKKwlpZiAoIShhY3BpX2dibF9yb290X3RhYmxlX2xpc3QuZmxhZ3MgJiBBQ1BJX1JPT1RfQUxMT1dfUkVTSVpFKSkgeworCQlBQ1BJX0VSUk9SKChBRV9JTkZPLAorCQkJICAgICJSZXNpemUgb2YgUm9vdCBUYWJsZSBBcnJheSBpcyBub3QgYWxsb3dlZCIpKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX1NVUFBPUlQpOworCX0KKworCS8qIEluY3JlYXNlIHRoZSBUYWJsZSBBcnJheSBzaXplICovCisKKwl0YWJsZXMgPSBBQ1BJX0FMTE9DQVRFX1pFUk9FRCgoKGFjcGlfc2l6ZSkgYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LgorCQkJCSAgICAgICBzaXplICsgQUNQSV9ST09UX1RBQkxFX1NJWkVfSU5DUkVNRU5UKQorCQkJCSAgICAgICogc2l6ZW9mKHN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MpKTsKKwlpZiAoIXRhYmxlcykgeworCQlBQ1BJX0VSUk9SKChBRV9JTkZPLAorCQkJICAgICJDb3VsZCBub3QgYWxsb2NhdGUgbmV3IHJvb3QgdGFibGUgYXJyYXkiKSk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT19NRU1PUlkpOworCX0KKworCS8qIENvcHkgYW5kIGZyZWUgdGhlIHByZXZpb3VzIHRhYmxlIGFycmF5ICovCisKKwlpZiAoYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LnRhYmxlcykgeworCQlBQ1BJX01FTUNQWSh0YWJsZXMsIGFjcGlfZ2JsX3Jvb3RfdGFibGVfbGlzdC50YWJsZXMsCisJCQkgICAgKGFjcGlfc2l6ZSkgYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LnNpemUgKgorCQkJICAgIHNpemVvZihzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjKSk7CisKKwkJaWYgKGFjcGlfZ2JsX3Jvb3RfdGFibGVfbGlzdC5mbGFncyAmIEFDUElfUk9PVF9PUklHSU5fQUxMT0NBVEVEKSB7CisJCQlBQ1BJX0ZSRUUoYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LnRhYmxlcyk7CisJCX0KKwl9CisKKwlhY3BpX2dibF9yb290X3RhYmxlX2xpc3QudGFibGVzID0gdGFibGVzOworCWFjcGlfZ2JsX3Jvb3RfdGFibGVfbGlzdC5zaXplICs9IEFDUElfUk9PVF9UQUJMRV9TSVpFX0lOQ1JFTUVOVDsKKwlhY3BpX2dibF9yb290X3RhYmxlX2xpc3QuZmxhZ3MgfD0gKHU4KSBBQ1BJX1JPT1RfT1JJR0lOX0FMTE9DQVRFRDsKKworCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfdGJfc3RvcmVfdGFibGUKKyAqCisgKiBQQVJBTUVURVJTOiAgQWRkcmVzcyAgICAgICAgICAgICAtIFRhYmxlIGFkZHJlc3MKKyAqICAgICAgICAgICAgICBUYWJsZSAgICAgICAgICAgICAgIC0gVGFibGUgaGVhZGVyCisgKiAgICAgICAgICAgICAgTGVuZ3RoICAgICAgICAgICAgICAtIFRhYmxlIGxlbmd0aAorICogICAgICAgICAgICAgIEZsYWdzICAgICAgICAgICAgICAgLSBmbGFncworICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMgYW5kIHRhYmxlIGluZGV4LgorICoKKyAqIERFU0NSSVBUSU9OOiBBZGQgYW4gQUNQSSB0YWJsZSB0byB0aGUgZ2xvYmFsIHRhYmxlIGxpc3QKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCithY3BpX3N0YXR1cworYWNwaV90Yl9zdG9yZV90YWJsZShhY3BpX3BoeXNpY2FsX2FkZHJlc3MgYWRkcmVzcywKKwkJICAgIHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqdGFibGUsCisJCSAgICB1MzIgbGVuZ3RoLCB1OCBmbGFncywgdTMyICp0YWJsZV9pbmRleCkKK3sKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKKworCS8qIEVuc3VyZSB0aGF0IHRoZXJlIGlzIHJvb20gZm9yIHRoZSB0YWJsZSBpbiB0aGUgUm9vdCBUYWJsZSBMaXN0ICovCisKKwlpZiAoYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LmNvdW50ID49IGFjcGlfZ2JsX3Jvb3RfdGFibGVfbGlzdC5zaXplKSB7CisJCXN0YXR1cyA9IGFjcGlfdGJfcmVzaXplX3Jvb3RfdGFibGVfbGlzdCgpOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCXJldHVybiAoc3RhdHVzKTsKKwkJfQorCX0KKworCS8qIEluaXRpYWxpemUgYWRkZWQgdGFibGUgKi8KKworCWFjcGlfZ2JsX3Jvb3RfdGFibGVfbGlzdC50YWJsZXNbYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LmNvdW50XS4KKwkgICAgYWRkcmVzcyA9IGFkZHJlc3M7CisJYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LnRhYmxlc1thY3BpX2dibF9yb290X3RhYmxlX2xpc3QuY291bnRdLgorCSAgICBwb2ludGVyID0gdGFibGU7CisJYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LnRhYmxlc1thY3BpX2dibF9yb290X3RhYmxlX2xpc3QuY291bnRdLmxlbmd0aCA9CisJICAgIGxlbmd0aDsKKwlhY3BpX2dibF9yb290X3RhYmxlX2xpc3QudGFibGVzW2FjcGlfZ2JsX3Jvb3RfdGFibGVfbGlzdC5jb3VudF0uCisJICAgIG93bmVyX2lkID0gMDsKKwlhY3BpX2dibF9yb290X3RhYmxlX2xpc3QudGFibGVzW2FjcGlfZ2JsX3Jvb3RfdGFibGVfbGlzdC5jb3VudF0uZmxhZ3MgPQorCSAgICBmbGFnczsKKworCUFDUElfTU9WRV8zMl9UT18zMigmCisJCQkgICAoYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LgorCQkJICAgIHRhYmxlc1thY3BpX2dibF9yb290X3RhYmxlX2xpc3QuY291bnRdLnNpZ25hdHVyZSksCisJCQkgICB0YWJsZS0+c2lnbmF0dXJlKTsKKworCSp0YWJsZV9pbmRleCA9IGFjcGlfZ2JsX3Jvb3RfdGFibGVfbGlzdC5jb3VudDsKKwlhY3BpX2dibF9yb290X3RhYmxlX2xpc3QuY291bnQrKzsKKwlyZXR1cm4gKHN0YXR1cyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfdGJfZGVsZXRlX3RhYmxlCisgKgorICogUEFSQU1FVEVSUzogIHRhYmxlX2luZGV4ICAgICAgICAgLSBUYWJsZSBpbmRleAorICoKKyAqIFJFVFVSTjogICAgICBOb25lCisgKgorICogREVTQ1JJUFRJT046IERlbGV0ZSBvbmUgaW50ZXJuYWwgQUNQSSB0YWJsZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgYWNwaV90Yl9kZWxldGVfdGFibGUoc3RydWN0IGFjcGlfdGFibGVfZGVzYyAqdGFibGVfZGVzYykKK3sKKwkvKiBUYWJsZSBtdXN0IGJlIG1hcHBlZCBvciBhbGxvY2F0ZWQgKi8KKwlpZiAoIXRhYmxlX2Rlc2MtPnBvaW50ZXIpIHsKKwkJcmV0dXJuOworCX0KKwlzd2l0Y2ggKHRhYmxlX2Rlc2MtPmZsYWdzICYgQUNQSV9UQUJMRV9PUklHSU5fTUFTSykgeworCWNhc2UgQUNQSV9UQUJMRV9PUklHSU5fTUFQUEVEOgorCQlhY3BpX29zX3VubWFwX21lbW9yeSh0YWJsZV9kZXNjLT5wb2ludGVyLCB0YWJsZV9kZXNjLT5sZW5ndGgpOworCQlicmVhazsKKwljYXNlIEFDUElfVEFCTEVfT1JJR0lOX0FMTE9DQVRFRDoKKwkJQUNQSV9GUkVFKHRhYmxlX2Rlc2MtPnBvaW50ZXIpOworCQlicmVhazsKKwlkZWZhdWx0OjsKKwl9CisKKwl0YWJsZV9kZXNjLT5wb2ludGVyID0gTlVMTDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV90Yl90ZXJtaW5hdGUKKyAqCisgKiBQQVJBTUVURVJTOiAgTm9uZQorICoKKyAqIFJFVFVSTjogICAgICBOb25lCisgKgorICogREVTQ1JJUFRJT046IERlbGV0ZSBhbGwgaW50ZXJuYWwgQUNQSSB0YWJsZXMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIGFjcGlfdGJfdGVybWluYXRlKHZvaWQpCit7CisJdTMyIGk7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKHRiX3Rlcm1pbmF0ZSk7CisKKwkodm9pZClhY3BpX3V0X2FjcXVpcmVfbXV0ZXgoQUNQSV9NVFhfVEFCTEVTKTsKKworCS8qIERlbGV0ZSB0aGUgaW5kaXZpZHVhbCB0YWJsZXMgKi8KKworCWZvciAoaSA9IDA7IGkgPCBhY3BpX2dibF9yb290X3RhYmxlX2xpc3QuY291bnQ7ICsraSkgeworCQlhY3BpX3RiX2RlbGV0ZV90YWJsZSgmYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LnRhYmxlc1tpXSk7CisJfQorCisJLyoKKwkgKiBEZWxldGUgdGhlIHJvb3QgdGFibGUgYXJyYXkgaWYgYWxsb2NhdGVkIGxvY2FsbHkuIEFycmF5IGNhbm5vdCBiZQorCSAqIG1hcHBlZCwgc28gd2UgZG9uJ3QgbmVlZCB0byBjaGVjayBmb3IgdGhhdCBmbGFnLgorCSAqLworCWlmIChhY3BpX2dibF9yb290X3RhYmxlX2xpc3QuZmxhZ3MgJiBBQ1BJX1JPT1RfT1JJR0lOX0FMTE9DQVRFRCkgeworCQlBQ1BJX0ZSRUUoYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LnRhYmxlcyk7CisJfQorCisJYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LnRhYmxlcyA9IE5VTEw7CisJYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LmZsYWdzID0gMDsKKwlhY3BpX2dibF9yb290X3RhYmxlX2xpc3QuY291bnQgPSAwOworCisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLCAiQUNQSSBUYWJsZXMgZnJlZWRcbiIpKTsKKwkodm9pZClhY3BpX3V0X3JlbGVhc2VfbXV0ZXgoQUNQSV9NVFhfVEFCTEVTKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV90Yl9kZWxldGVfbmFtZXNwYWNlX2J5X293bmVyCisgKgorICogUEFSQU1FVEVSUzogIHRhYmxlX2luZGV4ICAgICAgICAgLSBUYWJsZSBpbmRleAorICoKKyAqIFJFVFVSTjogICAgICBOb25lCisgKgorICogREVTQ1JJUFRJT046IERlbGV0ZSBhbGwgbmFtZXNwYWNlIG9iamVjdHMgY3JlYXRlZCB3aGVuIHRoaXMgdGFibGUgd2FzIGxvYWRlZC4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIGFjcGlfdGJfZGVsZXRlX25hbWVzcGFjZV9ieV9vd25lcih1MzIgdGFibGVfaW5kZXgpCit7CisJYWNwaV9vd25lcl9pZCBvd25lcl9pZDsKKworCSh2b2lkKWFjcGlfdXRfYWNxdWlyZV9tdXRleChBQ1BJX01UWF9UQUJMRVMpOworCWlmICh0YWJsZV9pbmRleCA8IGFjcGlfZ2JsX3Jvb3RfdGFibGVfbGlzdC5jb3VudCkgeworCQlvd25lcl9pZCA9CisJCSAgICBhY3BpX2dibF9yb290X3RhYmxlX2xpc3QudGFibGVzW3RhYmxlX2luZGV4XS5vd25lcl9pZDsKKwl9IGVsc2UgeworCQkodm9pZClhY3BpX3V0X3JlbGVhc2VfbXV0ZXgoQUNQSV9NVFhfVEFCTEVTKTsKKwkJcmV0dXJuOworCX0KKworCSh2b2lkKWFjcGlfdXRfcmVsZWFzZV9tdXRleChBQ1BJX01UWF9UQUJMRVMpOworCWFjcGlfbnNfZGVsZXRlX25hbWVzcGFjZV9ieV9vd25lcihvd25lcl9pZCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfdGJfYWxsb2NhdGVfb3duZXJfaWQKKyAqCisgKiBQQVJBTUVURVJTOiAgdGFibGVfaW5kZXggICAgICAgICAtIFRhYmxlIGluZGV4CisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBBbGxvY2F0ZXMgb3duZXJfaWQgaW4gdGFibGVfZGVzYworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2FjcGlfc3RhdHVzIGFjcGlfdGJfYWxsb2NhdGVfb3duZXJfaWQodTMyIHRhYmxlX2luZGV4KQoreworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX0JBRF9QQVJBTUVURVI7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKHRiX2FsbG9jYXRlX293bmVyX2lkKTsKKworCSh2b2lkKWFjcGlfdXRfYWNxdWlyZV9tdXRleChBQ1BJX01UWF9UQUJMRVMpOworCWlmICh0YWJsZV9pbmRleCA8IGFjcGlfZ2JsX3Jvb3RfdGFibGVfbGlzdC5jb3VudCkgeworCQlzdGF0dXMgPSBhY3BpX3V0X2FsbG9jYXRlX293bmVyX2lkCisJCSAgICAoJihhY3BpX2dibF9yb290X3RhYmxlX2xpc3QudGFibGVzW3RhYmxlX2luZGV4XS5vd25lcl9pZCkpOworCX0KKworCSh2b2lkKWFjcGlfdXRfcmVsZWFzZV9tdXRleChBQ1BJX01UWF9UQUJMRVMpOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX3RiX3JlbGVhc2Vfb3duZXJfaWQKKyAqCisgKiBQQVJBTUVURVJTOiAgdGFibGVfaW5kZXggICAgICAgICAtIFRhYmxlIGluZGV4CisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBSZWxlYXNlcyBvd25lcl9pZCBpbiB0YWJsZV9kZXNjCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworYWNwaV9zdGF0dXMgYWNwaV90Yl9yZWxlYXNlX293bmVyX2lkKHUzMiB0YWJsZV9pbmRleCkKK3sKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9CQURfUEFSQU1FVEVSOworCisJQUNQSV9GVU5DVElPTl9UUkFDRSh0Yl9yZWxlYXNlX293bmVyX2lkKTsKKworCSh2b2lkKWFjcGlfdXRfYWNxdWlyZV9tdXRleChBQ1BJX01UWF9UQUJMRVMpOworCWlmICh0YWJsZV9pbmRleCA8IGFjcGlfZ2JsX3Jvb3RfdGFibGVfbGlzdC5jb3VudCkgeworCQlhY3BpX3V0X3JlbGVhc2Vfb3duZXJfaWQoJgorCQkJCQkgKGFjcGlfZ2JsX3Jvb3RfdGFibGVfbGlzdC4KKwkJCQkJICB0YWJsZXNbdGFibGVfaW5kZXhdLm93bmVyX2lkKSk7CisJCXN0YXR1cyA9IEFFX09LOworCX0KKworCSh2b2lkKWFjcGlfdXRfcmVsZWFzZV9tdXRleChBQ1BJX01UWF9UQUJMRVMpOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX3RiX2dldF9vd25lcl9pZAorICoKKyAqIFBBUkFNRVRFUlM6ICB0YWJsZV9pbmRleCAgICAgICAgIC0gVGFibGUgaW5kZXgKKyAqICAgICAgICAgICAgICBvd25lcl9pZCAgICAgICAgICAgIC0gV2hlcmUgdGhlIHRhYmxlIG93bmVyX2lkIGlzIHJldHVybmVkCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiByZXR1cm5zIG93bmVyX2lkIGZvciB0aGUgQUNQSSB0YWJsZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2FjcGlfc3RhdHVzIGFjcGlfdGJfZ2V0X293bmVyX2lkKHUzMiB0YWJsZV9pbmRleCwgYWNwaV9vd25lcl9pZCAqb3duZXJfaWQpCit7CisJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfQkFEX1BBUkFNRVRFUjsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0UodGJfZ2V0X293bmVyX2lkKTsKKworCSh2b2lkKWFjcGlfdXRfYWNxdWlyZV9tdXRleChBQ1BJX01UWF9UQUJMRVMpOworCWlmICh0YWJsZV9pbmRleCA8IGFjcGlfZ2JsX3Jvb3RfdGFibGVfbGlzdC5jb3VudCkgeworCQkqb3duZXJfaWQgPQorCQkgICAgYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LnRhYmxlc1t0YWJsZV9pbmRleF0ub3duZXJfaWQ7CisJCXN0YXR1cyA9IEFFX09LOworCX0KKworCSh2b2lkKWFjcGlfdXRfcmVsZWFzZV9tdXRleChBQ1BJX01UWF9UQUJMRVMpOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX3RiX2lzX3RhYmxlX2xvYWRlZAorICoKKyAqIFBBUkFNRVRFUlM6ICB0YWJsZV9pbmRleCAgICAgICAgIC0gVGFibGUgaW5kZXgKKyAqCisgKiBSRVRVUk46ICAgICAgVGFibGUgTG9hZGVkIEZsYWcKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit1OCBhY3BpX3RiX2lzX3RhYmxlX2xvYWRlZCh1MzIgdGFibGVfaW5kZXgpCit7CisJdTggaXNfbG9hZGVkID0gRkFMU0U7CisKKwkodm9pZClhY3BpX3V0X2FjcXVpcmVfbXV0ZXgoQUNQSV9NVFhfVEFCTEVTKTsKKwlpZiAodGFibGVfaW5kZXggPCBhY3BpX2dibF9yb290X3RhYmxlX2xpc3QuY291bnQpIHsKKwkJaXNfbG9hZGVkID0gKHU4KQorCQkgICAgKGFjcGlfZ2JsX3Jvb3RfdGFibGVfbGlzdC50YWJsZXNbdGFibGVfaW5kZXhdLgorCQkgICAgIGZsYWdzICYgQUNQSV9UQUJMRV9JU19MT0FERUQpOworCX0KKworCSh2b2lkKWFjcGlfdXRfcmVsZWFzZV9tdXRleChBQ1BJX01UWF9UQUJMRVMpOworCXJldHVybiAoaXNfbG9hZGVkKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV90Yl9zZXRfdGFibGVfbG9hZGVkX2ZsYWcKKyAqCisgKiBQQVJBTUVURVJTOiAgdGFibGVfaW5kZXggICAgICAgICAtIFRhYmxlIGluZGV4CisgKiAgICAgICAgICAgICAgaXNfbG9hZGVkICAgICAgICAgICAtIFRSVUUgaWYgdGFibGUgaXMgbG9hZGVkLCBGQUxTRSBvdGhlcndpc2UKKyAqCisgKiBSRVRVUk46ICAgICAgTm9uZQorICoKKyAqIERFU0NSSVBUSU9OOiBTZXRzIHRoZSB0YWJsZSBsb2FkZWQgZmxhZyB0byBlaXRoZXIgVFJVRSBvciBGQUxTRS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIGFjcGlfdGJfc2V0X3RhYmxlX2xvYWRlZF9mbGFnKHUzMiB0YWJsZV9pbmRleCwgdTggaXNfbG9hZGVkKQoreworCisJKHZvaWQpYWNwaV91dF9hY3F1aXJlX211dGV4KEFDUElfTVRYX1RBQkxFUyk7CisJaWYgKHRhYmxlX2luZGV4IDwgYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LmNvdW50KSB7CisJCWlmIChpc19sb2FkZWQpIHsKKwkJCWFjcGlfZ2JsX3Jvb3RfdGFibGVfbGlzdC50YWJsZXNbdGFibGVfaW5kZXhdLmZsYWdzIHw9CisJCQkgICAgQUNQSV9UQUJMRV9JU19MT0FERUQ7CisJCX0gZWxzZSB7CisJCQlhY3BpX2dibF9yb290X3RhYmxlX2xpc3QudGFibGVzW3RhYmxlX2luZGV4XS5mbGFncyAmPQorCQkJICAgIH5BQ1BJX1RBQkxFX0lTX0xPQURFRDsKKwkJfQorCX0KKworCSh2b2lkKWFjcGlfdXRfcmVsZWFzZV9tdXRleChBQ1BJX01UWF9UQUJMRVMpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS90YnV0aWxzLmMgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL3RidXRpbHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Njg0Y2M4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS90YnV0aWxzLmMKQEAgLTAsMCArMSw1ODMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBNb2R1bGUgTmFtZTogdGJ1dGlscyAgIC0gdGFibGUgdXRpbGl0aWVzCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwOCwgSW50ZWwgQ29ycC4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKKyAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIGF0IG1pbmltdW0gYSBkaXNjbGFpbWVyCisgKiAgICBzdWJzdGFudGlhbGx5IHNpbWlsYXIgdG8gdGhlICJOTyBXQVJSQU5UWSIgZGlzY2xhaW1lciBiZWxvdworICogICAgKCJEaXNjbGFpbWVyIikgYW5kIGFueSByZWRpc3RyaWJ1dGlvbiBtdXN0IGJlIGNvbmRpdGlvbmVkIHVwb24KKyAqICAgIGluY2x1ZGluZyBhIHN1YnN0YW50aWFsbHkgc2ltaWxhciBEaXNjbGFpbWVyIHJlcXVpcmVtZW50IGZvciBmdXJ0aGVyCisgKiAgICBiaW5hcnkgcmVkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMKKyAqICAgIG9mIGFueSBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogTk8gV0FSUkFOVFkKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HCisgKiBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KKyAqLworCisjaW5jbHVkZSA8YWNwaS9hY3BpLmg+CisjaW5jbHVkZSAiYWNjb21tb24uaCIKKyNpbmNsdWRlICJhY3RhYmxlcy5oIgorCisjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9UQUJMRVMKK0FDUElfTU9EVUxFX05BTUUoInRidXRpbHMiKQorCisvKiBMb2NhbCBwcm90b3R5cGVzICovCitzdGF0aWMgYWNwaV9waHlzaWNhbF9hZGRyZXNzCithY3BpX3RiX2dldF9yb290X3RhYmxlX2VudHJ5KHU4ICp0YWJsZV9lbnRyeSwgdTMyIHRhYmxlX2VudHJ5X3NpemUpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX3RiX2NoZWNrX3hzZHQKKyAqCisgKiBQQVJBTUVURVJTOiAgYWRkcmVzcyAgICAgICAgICAgICAgICAgICAgLSBQb2ludGVyIHRvIHRoZSBYU0RUCisgKgorICogUkVUVVJOOiAgICAgIHN0YXR1cworICoJCUFFX09LIC0gWFNEVCBpcyBva2F5CisgKgkJQUVfTk9fTUVNT1JZIC0gY2FuJ3QgbWFwIFhTRFQKKyAqCQlBRV9JTlZBTElEX1RBQkxFX0xFTkdUSCAtIGludmFsaWQgdGFibGUgbGVuZ3RoCisgKgkJQUVfTlVMTF9FTlRSWSAtIFhTRFQgaGFzIE5VTEwgZW50cnkKKyAqCisgKiBERVNDUklQVElPTjogdmFsaWRhdGUgWFNEVAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgYWNwaV9zdGF0dXMKK2FjcGlfdGJfY2hlY2tfeHNkdChhY3BpX3BoeXNpY2FsX2FkZHJlc3MgYWRkcmVzcykKK3sKKwlzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKnRhYmxlOworCXUzMiBsZW5ndGg7CisJdTY0IHhzZHRfZW50cnlfYWRkcmVzczsKKwl1OCAqdGFibGVfZW50cnk7CisJdTMyIHRhYmxlX2NvdW50OworCWludCBpOworCisJdGFibGUgPSBhY3BpX29zX21hcF9tZW1vcnkoYWRkcmVzcywgc2l6ZW9mKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlcikpOworCWlmICghdGFibGUpCisJCXJldHVybiBBRV9OT19NRU1PUlk7CisKKwlsZW5ndGggPSB0YWJsZS0+bGVuZ3RoOworCWFjcGlfb3NfdW5tYXBfbWVtb3J5KHRhYmxlLCBzaXplb2Yoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyKSk7CisJaWYgKGxlbmd0aCA8IHNpemVvZihzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIpKQorCQlyZXR1cm4gQUVfSU5WQUxJRF9UQUJMRV9MRU5HVEg7CisKKwl0YWJsZSA9IGFjcGlfb3NfbWFwX21lbW9yeShhZGRyZXNzLCBsZW5ndGgpOworCWlmICghdGFibGUpCisJCXJldHVybiBBRV9OT19NRU1PUlk7CisKKwkvKiBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0YWJsZXMgZGVzY3JpYmVkIGluIFhTRFQgKi8KKwl0YWJsZV9jb3VudCA9CisJCSh1MzIpICgodGFibGUtPmxlbmd0aCAtCisJCXNpemVvZihzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIpKSAvIHNpemVvZih1NjQpKTsKKwl0YWJsZV9lbnRyeSA9CisJCUFDUElfQ0FTVF9QVFIodTgsIHRhYmxlKSArIHNpemVvZihzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIpOworCWZvciAoaSA9IDA7IGkgPCB0YWJsZV9jb3VudDsgaSsrKSB7CisJCUFDUElfTU9WRV82NF9UT182NCgmeHNkdF9lbnRyeV9hZGRyZXNzLCB0YWJsZV9lbnRyeSk7CisJCWlmICgheHNkdF9lbnRyeV9hZGRyZXNzKSB7CisJCQkvKiBYU0RUIGhhcyBOVUxMIGVudHJ5ICovCisJCQlicmVhazsKKwkJfQorCQl0YWJsZV9lbnRyeSArPSBzaXplb2YodTY0KTsKKwl9CisJYWNwaV9vc191bm1hcF9tZW1vcnkodGFibGUsIGxlbmd0aCk7CisKKwlpZiAoaSA8IHRhYmxlX2NvdW50KQorCQlyZXR1cm4gQUVfTlVMTF9FTlRSWTsKKwllbHNlCisJCXJldHVybiBBRV9PSzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV90Yl9pbml0aWFsaXplX2ZhY3MKKyAqCisgKiBQQVJBTUVURVJTOiAgTm9uZQorICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogQ3JlYXRlIGEgcGVybWFuZW50IG1hcHBpbmcgZm9yIHRoZSBGQURUIGFuZCBzYXZlIGl0IGluIGEgZ2xvYmFsCisgKiAgICAgICAgICAgICAgZm9yIGFjY2Vzc2luZyB0aGUgR2xvYmFsIExvY2sgYW5kIEZpcm13YXJlIFdha2luZyBWZWN0b3IKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCithY3BpX3N0YXR1cyBhY3BpX3RiX2luaXRpYWxpemVfZmFjcyh2b2lkKQoreworCWFjcGlfc3RhdHVzIHN0YXR1czsKKworCXN0YXR1cyA9IGFjcGlfZ2V0X3RhYmxlX2J5X2luZGV4KEFDUElfVEFCTEVfSU5ERVhfRkFDUywKKwkJCQkJIEFDUElfQ0FTVF9JTkRJUkVDVF9QVFIoc3RydWN0CisJCQkJCQkJCWFjcGlfdGFibGVfaGVhZGVyLAorCQkJCQkJCQkmYWNwaV9nYmxfRkFDUykpOworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfdGJfdGFibGVzX2xvYWRlZAorICoKKyAqIFBBUkFNRVRFUlM6ICBOb25lCisgKgorICogUkVUVVJOOiAgICAgIFRSVUUgaWYgcmVxdWlyZWQgQUNQSSB0YWJsZXMgYXJlIGxvYWRlZAorICoKKyAqIERFU0NSSVBUSU9OOiBEZXRlcm1pbmUgaWYgdGhlIG1pbmltdW0gcmVxdWlyZWQgQUNQSSB0YWJsZXMgYXJlIHByZXNlbnQKKyAqICAgICAgICAgICAgICAoRkFEVCwgRkFDUywgRFNEVCkKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit1OCBhY3BpX3RiX3RhYmxlc19sb2FkZWQodm9pZCkKK3sKKworCWlmIChhY3BpX2dibF9yb290X3RhYmxlX2xpc3QuY291bnQgPj0gMykgeworCQlyZXR1cm4gKFRSVUUpOworCX0KKworCXJldHVybiAoRkFMU0UpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX3RiX3ByaW50X3RhYmxlX2hlYWRlcgorICoKKyAqIFBBUkFNRVRFUlM6ICBBZGRyZXNzICAgICAgICAgICAgIC0gVGFibGUgcGh5c2ljYWwgYWRkcmVzcworICogICAgICAgICAgICAgIEhlYWRlciAgICAgICAgICAgICAgLSBUYWJsZSBoZWFkZXIKKyAqCisgKiBSRVRVUk46ICAgICAgTm9uZQorICoKKyAqIERFU0NSSVBUSU9OOiBQcmludCBhbiBBQ1BJIHRhYmxlIGhlYWRlci4gU3BlY2lhbCBjYXNlcyBmb3IgRkFDUyBhbmQgUlNEUC4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkCithY3BpX3RiX3ByaW50X3RhYmxlX2hlYWRlcihhY3BpX3BoeXNpY2FsX2FkZHJlc3MgYWRkcmVzcywKKwkJCSAgIHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqaGVhZGVyKQoreworCisJaWYgKEFDUElfQ09NUEFSRV9OQU1FKGhlYWRlci0+c2lnbmF0dXJlLCBBQ1BJX1NJR19GQUNTKSkgeworCisJCS8qIEZBQ1Mgb25seSBoYXMgc2lnbmF0dXJlIGFuZCBsZW5ndGggZmllbGRzIG9mIGNvbW1vbiB0YWJsZSBoZWFkZXIgKi8KKworCQlBQ1BJX0lORk8oKEFFX0lORk8sICIlNC40cyAlMDhsWCwgJTA0WCIsCisJCQkgICBoZWFkZXItPnNpZ25hdHVyZSwgKHVuc2lnbmVkIGxvbmcpYWRkcmVzcywKKwkJCSAgIGhlYWRlci0+bGVuZ3RoKSk7CisJfSBlbHNlIGlmIChBQ1BJX0NPTVBBUkVfTkFNRShoZWFkZXItPnNpZ25hdHVyZSwgQUNQSV9TSUdfUlNEUCkpIHsKKworCQkvKiBSU0RQIGhhcyBubyBjb21tb24gZmllbGRzICovCisKKwkJQUNQSV9JTkZPKChBRV9JTkZPLCAiUlNEUCAlMDhsWCwgJTA0WCAociVkICU2LjZzKSIsCisJCQkgICAodW5zaWduZWQgbG9uZylhZGRyZXNzLAorCQkJICAgKEFDUElfQ0FTVF9QVFIoc3RydWN0IGFjcGlfdGFibGVfcnNkcCwgaGVhZGVyKS0+CisJCQkgICAgcmV2aXNpb24gPgorCQkJICAgIDApID8gQUNQSV9DQVNUX1BUUihzdHJ1Y3QgYWNwaV90YWJsZV9yc2RwLAorCQkJCQkgICAgICAgaGVhZGVyKS0+bGVuZ3RoIDogMjAsCisJCQkgICBBQ1BJX0NBU1RfUFRSKHN0cnVjdCBhY3BpX3RhYmxlX3JzZHAsCisJCQkJCSBoZWFkZXIpLT5yZXZpc2lvbiwKKwkJCSAgIEFDUElfQ0FTVF9QVFIoc3RydWN0IGFjcGlfdGFibGVfcnNkcCwKKwkJCQkJIGhlYWRlciktPm9lbV9pZCkpOworCX0gZWxzZSB7CisJCS8qIFN0YW5kYXJkIEFDUEkgdGFibGUgd2l0aCBmdWxsIGNvbW1vbiBoZWFkZXIgKi8KKworCQlBQ1BJX0lORk8oKEFFX0lORk8sCisJCQkgICAiJTQuNHMgJTA4bFgsICUwNFggKHIlZCAlNi42cyAlOC44cyAlOFggJTQuNHMgJThYKSIsCisJCQkgICBoZWFkZXItPnNpZ25hdHVyZSwgKHVuc2lnbmVkIGxvbmcpYWRkcmVzcywKKwkJCSAgIGhlYWRlci0+bGVuZ3RoLCBoZWFkZXItPnJldmlzaW9uLCBoZWFkZXItPm9lbV9pZCwKKwkJCSAgIGhlYWRlci0+b2VtX3RhYmxlX2lkLCBoZWFkZXItPm9lbV9yZXZpc2lvbiwKKwkJCSAgIGhlYWRlci0+YXNsX2NvbXBpbGVyX2lkLAorCQkJICAgaGVhZGVyLT5hc2xfY29tcGlsZXJfcmV2aXNpb24pKTsKKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfdGJfdmFsaWRhdGVfY2hlY2tzdW0KKyAqCisgKiBQQVJBTUVURVJTOiAgVGFibGUgICAgICAgICAgICAgICAtIEFDUEkgdGFibGUgdG8gdmVyaWZ5CisgKiAgICAgICAgICAgICAgTGVuZ3RoICAgICAgICAgICAgICAtIExlbmd0aCBvZiBlbnRpcmUgdGFibGUKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IFZlcmlmaWVzIHRoYXQgdGhlIHRhYmxlIGNoZWNrc3VtcyB0byB6ZXJvLiBPcHRpb25hbGx5IHJldHVybnMKKyAqICAgICAgICAgICAgICBleGNlcHRpb24gb24gYmFkIGNoZWNrc3VtLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2FjcGlfc3RhdHVzIGFjcGlfdGJfdmVyaWZ5X2NoZWNrc3VtKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqdGFibGUsIHUzMiBsZW5ndGgpCit7CisJdTggY2hlY2tzdW07CisKKwkvKiBDb21wdXRlIHRoZSBjaGVja3N1bSBvbiB0aGUgdGFibGUgKi8KKworCWNoZWNrc3VtID0gYWNwaV90Yl9jaGVja3N1bShBQ1BJX0NBU1RfUFRSKHU4LCB0YWJsZSksIGxlbmd0aCk7CisKKwkvKiBDaGVja3N1bSBvaz8gKHNob3VsZCBiZSB6ZXJvKSAqLworCisJaWYgKGNoZWNrc3VtKSB7CisJCUFDUElfV0FSTklORygoQUVfSU5GTywKKwkJCSAgICAgICJJbmNvcnJlY3QgY2hlY2tzdW0gaW4gdGFibGUgWyU0LjRzXSAtICUyLjJYLCBzaG91bGQgYmUgJTIuMlgiLAorCQkJICAgICAgdGFibGUtPnNpZ25hdHVyZSwgdGFibGUtPmNoZWNrc3VtLAorCQkJICAgICAgKHU4KSAodGFibGUtPmNoZWNrc3VtIC0gY2hlY2tzdW0pKSk7CisKKyNpZiAoQUNQSV9DSEVDS1NVTV9BQk9SVCkKKworCQlyZXR1cm4gKEFFX0JBRF9DSEVDS1NVTSk7CisjZW5kaWYKKwl9CisKKwlyZXR1cm4gKEFFX09LKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV90Yl9jaGVja3N1bQorICoKKyAqIFBBUkFNRVRFUlM6ICBCdWZmZXIgICAgICAgICAgLSBQb2ludGVyIHRvIG1lbW9yeSByZWdpb24gdG8gYmUgY2hlY2tlZAorICogICAgICAgICAgICAgIExlbmd0aCAgICAgICAgICAtIExlbmd0aCBvZiB0aGlzIG1lbW9yeSByZWdpb24KKyAqCisgKiBSRVRVUk46ICAgICAgQ2hlY2tzdW0gKHU4KQorICoKKyAqIERFU0NSSVBUSU9OOiBDYWxjdWxhdGVzIGNpcmN1bGFyIGNoZWNrc3VtIG9mIG1lbW9yeSByZWdpb24uCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordTggYWNwaV90Yl9jaGVja3N1bSh1OCAqYnVmZmVyLCB1MzIgbGVuZ3RoKQoreworCXU4IHN1bSA9IDA7CisJdTggKmVuZCA9IGJ1ZmZlciArIGxlbmd0aDsKKworCXdoaWxlIChidWZmZXIgPCBlbmQpIHsKKwkJc3VtID0gKHU4KSAoc3VtICsgKihidWZmZXIrKykpOworCX0KKworCXJldHVybiBzdW07Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfdGJfaW5zdGFsbF90YWJsZQorICoKKyAqIFBBUkFNRVRFUlM6ICBBZGRyZXNzICAgICAgICAgICAgICAgICAtIFBoeXNpY2FsIGFkZHJlc3Mgb2YgRFNEVCBvciBGQUNTCisgKiAgICAgICAgICAgICAgRmxhZ3MgICAgICAgICAgICAgICAgICAgLSBGbGFncworICogICAgICAgICAgICAgIFNpZ25hdHVyZSAgICAgICAgICAgICAgIC0gVGFibGUgc2lnbmF0dXJlLCBOVUxMIGlmIG5vIG5lZWQgdG8KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoCisgKiAgICAgICAgICAgICAgdGFibGVfaW5kZXggICAgICAgICAgICAgLSBJbmRleCBpbnRvIHJvb3QgdGFibGUgYXJyYXkKKyAqCisgKiBSRVRVUk46ICAgICAgTm9uZQorICoKKyAqIERFU0NSSVBUSU9OOiBJbnN0YWxsIGFuIEFDUEkgdGFibGUgaW50byB0aGUgZ2xvYmFsIGRhdGEgc3RydWN0dXJlLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQKK2FjcGlfdGJfaW5zdGFsbF90YWJsZShhY3BpX3BoeXNpY2FsX2FkZHJlc3MgYWRkcmVzcywKKwkJICAgICAgdTggZmxhZ3MsIGNoYXIgKnNpZ25hdHVyZSwgdTMyIHRhYmxlX2luZGV4KQoreworCXN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqdGFibGU7CisKKwlpZiAoIWFkZHJlc3MpIHsKKwkJQUNQSV9FUlJPUigoQUVfSU5GTywKKwkJCSAgICAiTnVsbCBwaHlzaWNhbCBhZGRyZXNzIGZvciBBQ1BJIHRhYmxlIFslc10iLAorCQkJICAgIHNpZ25hdHVyZSkpOworCQlyZXR1cm47CisJfQorCisJLyogTWFwIGp1c3QgdGhlIHRhYmxlIGhlYWRlciAqLworCisJdGFibGUgPSBhY3BpX29zX21hcF9tZW1vcnkoYWRkcmVzcywgc2l6ZW9mKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlcikpOworCWlmICghdGFibGUpIHsKKwkJcmV0dXJuOworCX0KKworCS8qIElmIGEgcGFydGljdWxhciBzaWduYXR1cmUgaXMgZXhwZWN0ZWQsIHNpZ25hdHVyZSBtdXN0IG1hdGNoICovCisKKwlpZiAoc2lnbmF0dXJlICYmICFBQ1BJX0NPTVBBUkVfTkFNRSh0YWJsZS0+c2lnbmF0dXJlLCBzaWduYXR1cmUpKSB7CisJCUFDUElfRVJST1IoKEFFX0lORk8sCisJCQkgICAgIkludmFsaWQgc2lnbmF0dXJlIDB4JVggZm9yIEFDUEkgdGFibGUgWyVzXSIsCisJCQkgICAgKkFDUElfQ0FTVF9QVFIodTMyLCB0YWJsZS0+c2lnbmF0dXJlKSwgc2lnbmF0dXJlKSk7CisJCWdvdG8gdW5tYXBfYW5kX2V4aXQ7CisJfQorCisJLyogSW5pdGlhbGl6ZSB0aGUgdGFibGUgZW50cnkgKi8KKworCWFjcGlfZ2JsX3Jvb3RfdGFibGVfbGlzdC50YWJsZXNbdGFibGVfaW5kZXhdLmFkZHJlc3MgPSBhZGRyZXNzOworCWFjcGlfZ2JsX3Jvb3RfdGFibGVfbGlzdC50YWJsZXNbdGFibGVfaW5kZXhdLmxlbmd0aCA9IHRhYmxlLT5sZW5ndGg7CisJYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LnRhYmxlc1t0YWJsZV9pbmRleF0uZmxhZ3MgPSBmbGFnczsKKworCUFDUElfTU9WRV8zMl9UT18zMigmCisJCQkgICAoYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LnRhYmxlc1t0YWJsZV9pbmRleF0uCisJCQkgICAgc2lnbmF0dXJlKSwgdGFibGUtPnNpZ25hdHVyZSk7CisKKwlhY3BpX3RiX3ByaW50X3RhYmxlX2hlYWRlcihhZGRyZXNzLCB0YWJsZSk7CisKKwlpZiAodGFibGVfaW5kZXggPT0gQUNQSV9UQUJMRV9JTkRFWF9EU0RUKSB7CisKKwkJLyogR2xvYmFsIGludGVnZXIgd2lkdGggaXMgYmFzZWQgdXBvbiByZXZpc2lvbiBvZiB0aGUgRFNEVCAqLworCisJCWFjcGlfdXRfc2V0X2ludGVnZXJfd2lkdGgodGFibGUtPnJldmlzaW9uKTsKKwl9CisKKyAgICAgIHVubWFwX2FuZF9leGl0OgorCWFjcGlfb3NfdW5tYXBfbWVtb3J5KHRhYmxlLCBzaXplb2Yoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyKSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfdGJfZ2V0X3Jvb3RfdGFibGVfZW50cnkKKyAqCisgKiBQQVJBTUVURVJTOiAgdGFibGVfZW50cnkgICAgICAgICAtIFBvaW50ZXIgdG8gdGhlIFJTRFQvWFNEVCB0YWJsZSBlbnRyeQorICogICAgICAgICAgICAgIHRhYmxlX2VudHJ5X3NpemUgICAgLSBzaXplb2YgMzIgb3IgNjQgKFJTRFQgb3IgWFNEVCkKKyAqCisgKiBSRVRVUk46ICAgICAgUGh5c2ljYWwgYWRkcmVzcyBleHRyYWN0ZWQgZnJvbSB0aGUgcm9vdCB0YWJsZQorICoKKyAqIERFU0NSSVBUSU9OOiBHZXQgb25lIHJvb3QgdGFibGUgZW50cnkuIEhhbmRsZXMgMzItYml0IGFuZCA2NC1iaXQgY2FzZXMgb24KKyAqICAgICAgICAgICAgICBib3RoIDMyLWJpdCBhbmQgNjQtYml0IHBsYXRmb3JtcworICoKKyAqIE5PVEU6ICAgICAgICBhY3BpX3BoeXNpY2FsX2FkZHJlc3MgaXMgMzItYml0IG9uIDMyLWJpdCBwbGF0Zm9ybXMsIDY0LWJpdCBvbgorICogICAgICAgICAgICAgIDY0LWJpdCBwbGF0Zm9ybXMuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGFjcGlfcGh5c2ljYWxfYWRkcmVzcworYWNwaV90Yl9nZXRfcm9vdF90YWJsZV9lbnRyeSh1OCAqdGFibGVfZW50cnksIHUzMiB0YWJsZV9lbnRyeV9zaXplKQoreworCXU2NCBhZGRyZXNzNjQ7CisKKwkvKgorCSAqIEdldCB0aGUgdGFibGUgcGh5c2ljYWwgYWRkcmVzcyAoMzItYml0IGZvciBSU0RULCA2NC1iaXQgZm9yIFhTRFQpOgorCSAqIE5vdGU6IEFkZHJlc3NlcyBhcmUgMzItYml0IGFsaWduZWQgKG5vdCA2NCkgaW4gYm90aCBSU0RUIGFuZCBYU0RUCisJICovCisJaWYgKHRhYmxlX2VudHJ5X3NpemUgPT0gc2l6ZW9mKHUzMikpIHsKKwkJLyoKKwkJICogMzItYml0IHBsYXRmb3JtLCBSU0RUOiBSZXR1cm4gMzItYml0IHRhYmxlIGVudHJ5CisJCSAqIDY0LWJpdCBwbGF0Zm9ybSwgUlNEVDogRXhwYW5kIDMyLWJpdCB0byA2NC1iaXQgYW5kIHJldHVybgorCQkgKi8KKwkJcmV0dXJuICgoYWNwaV9waHlzaWNhbF9hZGRyZXNzKQorCQkJKCpBQ1BJX0NBU1RfUFRSKHUzMiwgdGFibGVfZW50cnkpKSk7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogMzItYml0IHBsYXRmb3JtLCBYU0RUOiBUcnVuY2F0ZSA2NC1iaXQgdG8gMzItYml0IGFuZCByZXR1cm4KKwkJICogNjQtYml0IHBsYXRmb3JtLCBYU0RUOiBNb3ZlICh1bmFsaWduZWQpIDY0LWJpdCB0byBsb2NhbCwgcmV0dXJuIDY0LWJpdAorCQkgKi8KKwkJQUNQSV9NT1ZFXzY0X1RPXzY0KCZhZGRyZXNzNjQsIHRhYmxlX2VudHJ5KTsKKworI2lmIEFDUElfTUFDSElORV9XSURUSCA9PSAzMgorCQlpZiAoYWRkcmVzczY0ID4gQUNQSV9VSU5UMzJfTUFYKSB7CisKKwkJCS8qIFdpbGwgdHJ1bmNhdGUgNjQtYml0IGFkZHJlc3MgdG8gMzIgYml0cywgaXNzdWUgd2FybmluZyAqLworCisJCQlBQ1BJX1dBUk5JTkcoKEFFX0lORk8sCisJCQkJICAgICAgIjY0LWJpdCBQaHlzaWNhbCBBZGRyZXNzIGluIFhTRFQgaXMgdG9vIGxhcmdlICglOC44WCU4LjhYKSwgdHJ1bmNhdGluZyIsCisJCQkJICAgICAgQUNQSV9GT1JNQVRfVUlOVDY0KGFkZHJlc3M2NCkpKTsKKwkJfQorI2VuZGlmCisJCXJldHVybiAoKGFjcGlfcGh5c2ljYWxfYWRkcmVzcykgKGFkZHJlc3M2NCkpOworCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV90Yl9wYXJzZV9yb290X3RhYmxlCisgKgorICogUEFSQU1FVEVSUzogIFJzZHAgICAgICAgICAgICAgICAgICAgIC0gUG9pbnRlciB0byB0aGUgUlNEUAorICogICAgICAgICAgICAgIEZsYWdzICAgICAgICAgICAgICAgICAgIC0gRmxhZ3MKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHBhcnNlIHRoZSBSb290IFN5c3RlbSBEZXNjcmlwdGlvbgorICogICAgICAgICAgICAgIFRhYmxlIChSU0RUIG9yIFhTRFQpCisgKgorICogTk9URTogICAgICAgIFRhYmxlcyBhcmUgbWFwcGVkIChub3QgY29waWVkKSBmb3IgZWZmaWNpZW5jeS4gVGhlIEZBQ1MgbXVzdAorICogICAgICAgICAgICAgIGJlIG1hcHBlZCBhbmQgY2Fubm90IGJlIGNvcGllZCBiZWNhdXNlIGl0IGNvbnRhaW5zIHRoZSBhY3R1YWwKKyAqICAgICAgICAgICAgICBtZW1vcnkgbG9jYXRpb24gb2YgdGhlIEFDUEkgR2xvYmFsIExvY2suCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworYWNwaV9zdGF0dXMgX19pbml0CithY3BpX3RiX3BhcnNlX3Jvb3RfdGFibGUoYWNwaV9waHlzaWNhbF9hZGRyZXNzIHJzZHBfYWRkcmVzcywgdTggZmxhZ3MpCit7CisJc3RydWN0IGFjcGlfdGFibGVfcnNkcCAqcnNkcDsKKwl1MzIgdGFibGVfZW50cnlfc2l6ZTsKKwl1MzIgaTsKKwl1MzIgdGFibGVfY291bnQ7CisJc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICp0YWJsZTsKKwlhY3BpX3BoeXNpY2FsX2FkZHJlc3MgYWRkcmVzczsKKwlhY3BpX3BoeXNpY2FsX2FkZHJlc3MgdW5pbml0aWFsaXplZF92YXIocnNkdF9hZGRyZXNzKTsKKwl1MzIgbGVuZ3RoOworCXU4ICp0YWJsZV9lbnRyeTsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKHRiX3BhcnNlX3Jvb3RfdGFibGUpOworCisJLyoKKwkgKiBNYXAgdGhlIGVudGlyZSBSU0RQIGFuZCBleHRyYWN0IHRoZSBhZGRyZXNzIG9mIHRoZSBSU0RUIG9yIFhTRFQKKwkgKi8KKwlyc2RwID0gYWNwaV9vc19tYXBfbWVtb3J5KHJzZHBfYWRkcmVzcywgc2l6ZW9mKHN0cnVjdCBhY3BpX3RhYmxlX3JzZHApKTsKKwlpZiAoIXJzZHApIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX01FTU9SWSk7CisJfQorCisJYWNwaV90Yl9wcmludF90YWJsZV9oZWFkZXIocnNkcF9hZGRyZXNzLAorCQkJCSAgIEFDUElfQ0FTVF9QVFIoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyLAorCQkJCQkJIHJzZHApKTsKKworCS8qIERpZmZlcmVudGlhdGUgYmV0d2VlbiBSU0RUIGFuZCBYU0RUIHJvb3QgdGFibGVzICovCisKKwlpZiAocnNkcC0+cmV2aXNpb24gPiAxICYmIHJzZHAtPnhzZHRfcGh5c2ljYWxfYWRkcmVzcworCQkJJiYgIWFjcGlfcnNkdF9mb3JjZWQpIHsKKwkJLyoKKwkJICogUm9vdCB0YWJsZSBpcyBhbiBYU0RUICg2NC1iaXQgcGh5c2ljYWwgYWRkcmVzc2VzKS4gV2UgbXVzdCB1c2UgdGhlCisJCSAqIFhTRFQgaWYgdGhlIHJldmlzaW9uIGlzID4gMSBhbmQgdGhlIFhTRFQgcG9pbnRlciBpcyBwcmVzZW50LCBhcyBwZXIKKwkJICogdGhlIEFDUEkgc3BlY2lmaWNhdGlvbi4KKwkJICovCisJCWFkZHJlc3MgPSAoYWNwaV9waHlzaWNhbF9hZGRyZXNzKSByc2RwLT54c2R0X3BoeXNpY2FsX2FkZHJlc3M7CisJCXRhYmxlX2VudHJ5X3NpemUgPSBzaXplb2YodTY0KTsKKwkJcnNkdF9hZGRyZXNzID0gKGFjcGlfcGh5c2ljYWxfYWRkcmVzcykKKwkJCQkJcnNkcC0+cnNkdF9waHlzaWNhbF9hZGRyZXNzOworCX0gZWxzZSB7CisJCS8qIFJvb3QgdGFibGUgaXMgYW4gUlNEVCAoMzItYml0IHBoeXNpY2FsIGFkZHJlc3NlcykgKi8KKworCQlhZGRyZXNzID0gKGFjcGlfcGh5c2ljYWxfYWRkcmVzcykgcnNkcC0+cnNkdF9waHlzaWNhbF9hZGRyZXNzOworCQl0YWJsZV9lbnRyeV9zaXplID0gc2l6ZW9mKHUzMik7CisJfQorCisJLyoKKwkgKiBJdCBpcyBub3QgcG9zc2libGUgdG8gbWFwIG1vcmUgdGhhbiBvbmUgZW50cnkgaW4gc29tZSBlbnZpcm9ubWVudHMsCisJICogc28gdW5tYXAgdGhlIFJTRFAgaGVyZSBiZWZvcmUgbWFwcGluZyBvdGhlciB0YWJsZXMKKwkgKi8KKwlhY3BpX29zX3VubWFwX21lbW9yeShyc2RwLCBzaXplb2Yoc3RydWN0IGFjcGlfdGFibGVfcnNkcCkpOworCisJaWYgKHRhYmxlX2VudHJ5X3NpemUgPT0gc2l6ZW9mKHU2NCkpIHsKKwkJaWYgKGFjcGlfdGJfY2hlY2tfeHNkdChhZGRyZXNzKSA9PSBBRV9OVUxMX0VOVFJZKSB7CisJCQkvKiBYU0RUIGhhcyBOVUxMIGVudHJ5LCBSU0RUIGlzIHVzZWQgKi8KKwkJCWFkZHJlc3MgPSByc2R0X2FkZHJlc3M7CisJCQl0YWJsZV9lbnRyeV9zaXplID0gc2l6ZW9mKHUzMik7CisJCQlBQ1BJX1dBUk5JTkcoKEFFX0lORk8sICJCSU9TIFhTRFQgaGFzIE5VTEwgZW50cnksICIKKwkJCQkJInVzaW5nIFJTRFQiKSk7CisJCX0KKwl9CisJLyogTWFwIHRoZSBSU0RUL1hTRFQgdGFibGUgaGVhZGVyIHRvIGdldCB0aGUgZnVsbCB0YWJsZSBsZW5ndGggKi8KKworCXRhYmxlID0gYWNwaV9vc19tYXBfbWVtb3J5KGFkZHJlc3MsIHNpemVvZihzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIpKTsKKwlpZiAoIXRhYmxlKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT19NRU1PUlkpOworCX0KKworCWFjcGlfdGJfcHJpbnRfdGFibGVfaGVhZGVyKGFkZHJlc3MsIHRhYmxlKTsKKworCS8qIEdldCB0aGUgbGVuZ3RoIG9mIHRoZSBmdWxsIHRhYmxlLCB2ZXJpZnkgbGVuZ3RoIGFuZCBtYXAgZW50aXJlIHRhYmxlICovCisKKwlsZW5ndGggPSB0YWJsZS0+bGVuZ3RoOworCWFjcGlfb3NfdW5tYXBfbWVtb3J5KHRhYmxlLCBzaXplb2Yoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyKSk7CisKKwlpZiAobGVuZ3RoIDwgc2l6ZW9mKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlcikpIHsKKwkJQUNQSV9FUlJPUigoQUVfSU5GTywgIkludmFsaWQgbGVuZ3RoIDB4JVggaW4gUlNEVC9YU0RUIiwKKwkJCSAgICBsZW5ndGgpKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0lOVkFMSURfVEFCTEVfTEVOR1RIKTsKKwl9CisKKwl0YWJsZSA9IGFjcGlfb3NfbWFwX21lbW9yeShhZGRyZXNzLCBsZW5ndGgpOworCWlmICghdGFibGUpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX01FTU9SWSk7CisJfQorCisJLyogVmFsaWRhdGUgdGhlIHJvb3QgdGFibGUgY2hlY2tzdW0gKi8KKworCXN0YXR1cyA9IGFjcGlfdGJfdmVyaWZ5X2NoZWNrc3VtKHRhYmxlLCBsZW5ndGgpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlhY3BpX29zX3VubWFwX21lbW9yeSh0YWJsZSwgbGVuZ3RoKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CisJfQorCisJLyogQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGFibGVzIGRlc2NyaWJlZCBpbiB0aGUgcm9vdCB0YWJsZSAqLworCisJdGFibGVfY291bnQgPQorCSAgICAodTMyKSAoKHRhYmxlLT5sZW5ndGggLQorCQkgICAgc2l6ZW9mKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlcikpIC8gdGFibGVfZW50cnlfc2l6ZSk7CisKKwkvKgorCSAqIEZpcnN0IHR3byBlbnRyaWVzIGluIHRoZSB0YWJsZSBhcnJheSBhcmUgcmVzZXJ2ZWQgZm9yIHRoZSBEU0RUIGFuZCBGQUNTLAorCSAqIHdoaWNoIGFyZSBub3QgYWN0dWFsbHkgcHJlc2VudCBpbiB0aGUgUlNEVC9YU0RUIC0gdGhleSBjb21lIGZyb20gdGhlIEZBRFQKKwkgKi8KKwl0YWJsZV9lbnRyeSA9CisJICAgIEFDUElfQ0FTVF9QVFIodTgsIHRhYmxlKSArIHNpemVvZihzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIpOworCWFjcGlfZ2JsX3Jvb3RfdGFibGVfbGlzdC5jb3VudCA9IDI7CisKKwkvKgorCSAqIEluaXRpYWxpemUgdGhlIHJvb3QgdGFibGUgYXJyYXkgZnJvbSB0aGUgUlNEVC9YU0RUCisJICovCisJZm9yIChpID0gMDsgaSA8IHRhYmxlX2NvdW50OyBpKyspIHsKKwkJaWYgKGFjcGlfZ2JsX3Jvb3RfdGFibGVfbGlzdC5jb3VudCA+PQorCQkgICAgYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LnNpemUpIHsKKworCQkJLyogVGhlcmUgaXMgbm8gbW9yZSByb29tIGluIHRoZSByb290IHRhYmxlIGFycmF5LCBhdHRlbXB0IHJlc2l6ZSAqLworCisJCQlzdGF0dXMgPSBhY3BpX3RiX3Jlc2l6ZV9yb290X3RhYmxlX2xpc3QoKTsKKwkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJCUFDUElfV0FSTklORygoQUVfSU5GTywKKwkJCQkJICAgICAgIlRydW5jYXRpbmcgJXUgdGFibGUgZW50cmllcyEiLAorCQkJCQkgICAgICAodW5zaWduZWQpCisJCQkJCSAgICAgIChhY3BpX2dibF9yb290X3RhYmxlX2xpc3Quc2l6ZSAtCisJCQkJCSAgICAgICBhY3BpX2dibF9yb290X3RhYmxlX2xpc3QuCisJCQkJCSAgICAgICBjb3VudCkpKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCS8qIEdldCB0aGUgdGFibGUgcGh5c2ljYWwgYWRkcmVzcyAoMzItYml0IGZvciBSU0RULCA2NC1iaXQgZm9yIFhTRFQpICovCisKKwkJYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LnRhYmxlc1thY3BpX2dibF9yb290X3RhYmxlX2xpc3QuY291bnRdLgorCQkgICAgYWRkcmVzcyA9CisJCSAgICBhY3BpX3RiX2dldF9yb290X3RhYmxlX2VudHJ5KHRhYmxlX2VudHJ5LCB0YWJsZV9lbnRyeV9zaXplKTsKKworCQl0YWJsZV9lbnRyeSArPSB0YWJsZV9lbnRyeV9zaXplOworCQlhY3BpX2dibF9yb290X3RhYmxlX2xpc3QuY291bnQrKzsKKwl9CisKKwkvKgorCSAqIEl0IGlzIG5vdCBwb3NzaWJsZSB0byBtYXAgbW9yZSB0aGFuIG9uZSBlbnRyeSBpbiBzb21lIGVudmlyb25tZW50cywKKwkgKiBzbyB1bm1hcCB0aGUgcm9vdCB0YWJsZSBoZXJlIGJlZm9yZSBtYXBwaW5nIG90aGVyIHRhYmxlcworCSAqLworCWFjcGlfb3NfdW5tYXBfbWVtb3J5KHRhYmxlLCBsZW5ndGgpOworCisJLyoKKwkgKiBDb21wbGV0ZSB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIHJvb3QgdGFibGUgYXJyYXkgYnkgZXhhbWluaW5nCisJICogdGhlIGhlYWRlciBvZiBlYWNoIHRhYmxlCisJICovCisJZm9yIChpID0gMjsgaSA8IGFjcGlfZ2JsX3Jvb3RfdGFibGVfbGlzdC5jb3VudDsgaSsrKSB7CisJCWFjcGlfdGJfaW5zdGFsbF90YWJsZShhY3BpX2dibF9yb290X3RhYmxlX2xpc3QudGFibGVzW2ldLgorCQkJCSAgICAgIGFkZHJlc3MsIGZsYWdzLCBOVUxMLCBpKTsKKworCQkvKiBTcGVjaWFsIGNhc2UgZm9yIEZBRFQgLSBnZXQgdGhlIERTRFQgYW5kIEZBQ1MgKi8KKworCQlpZiAoQUNQSV9DT01QQVJFX05BTUUKKwkJICAgICgmYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LnRhYmxlc1tpXS5zaWduYXR1cmUsCisJCSAgICAgQUNQSV9TSUdfRkFEVCkpIHsKKwkJCWFjcGlfdGJfcGFyc2VfZmFkdChpLCBmbGFncyk7CisJCX0KKwl9CisKKwlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS90YnhmYWNlLmMgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL3RieGZhY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jM2U4NDFmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS90YnhmYWNlLmMKQEAgLTAsMCArMSw3MzUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBNb2R1bGUgTmFtZTogdGJ4ZmFjZSAtIFB1YmxpYyBpbnRlcmZhY2VzIHRvIHRoZSBBQ1BJIHN1YnN5c3RlbQorICogICAgICAgICAgICAgICAgICAgICAgICAgQUNQSSB0YWJsZSBvcmllbnRlZCBpbnRlcmZhY2VzCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwOCwgSW50ZWwgQ29ycC4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKKyAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIGF0IG1pbmltdW0gYSBkaXNjbGFpbWVyCisgKiAgICBzdWJzdGFudGlhbGx5IHNpbWlsYXIgdG8gdGhlICJOTyBXQVJSQU5UWSIgZGlzY2xhaW1lciBiZWxvdworICogICAgKCJEaXNjbGFpbWVyIikgYW5kIGFueSByZWRpc3RyaWJ1dGlvbiBtdXN0IGJlIGNvbmRpdGlvbmVkIHVwb24KKyAqICAgIGluY2x1ZGluZyBhIHN1YnN0YW50aWFsbHkgc2ltaWxhciBEaXNjbGFpbWVyIHJlcXVpcmVtZW50IGZvciBmdXJ0aGVyCisgKiAgICBiaW5hcnkgcmVkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMKKyAqICAgIG9mIGFueSBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogTk8gV0FSUkFOVFkKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HCisgKiBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KKyAqLworCisjaW5jbHVkZSA8YWNwaS9hY3BpLmg+CisjaW5jbHVkZSAiYWNjb21tb24uaCIKKyNpbmNsdWRlICJhY25hbWVzcC5oIgorI2luY2x1ZGUgImFjdGFibGVzLmgiCisKKyNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX1RBQkxFUworQUNQSV9NT0RVTEVfTkFNRSgidGJ4ZmFjZSIpCisKKy8qIExvY2FsIHByb3RvdHlwZXMgKi8KK3N0YXRpYyBhY3BpX3N0YXR1cyBhY3BpX3RiX2xvYWRfbmFtZXNwYWNlKHZvaWQpOworCitzdGF0aWMgaW50IG5vX2F1dG9fc3NkdDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9hbGxvY2F0ZV9yb290X3RhYmxlCisgKgorICogUEFSQU1FVEVSUzogIGluaXRpYWxfdGFibGVfY291bnQgLSBTaXplIG9mIGluaXRpYWxfdGFibGVfYXJyYXksIGluIG51bWJlciBvZgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjIHN0cnVjdHVyZXMKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IEFsbG9jYXRlIGEgcm9vdCB0YWJsZSBhcnJheS4gVXNlZCBieSBpX2FTTCBjb21waWxlciBhbmQKKyAqICAgICAgICAgICAgICBhY3BpX2luaXRpYWxpemVfdGFibGVzLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2FjcGlfc3RhdHVzIGFjcGlfYWxsb2NhdGVfcm9vdF90YWJsZSh1MzIgaW5pdGlhbF90YWJsZV9jb3VudCkKK3sKKworCWFjcGlfZ2JsX3Jvb3RfdGFibGVfbGlzdC5zaXplID0gaW5pdGlhbF90YWJsZV9jb3VudDsKKwlhY3BpX2dibF9yb290X3RhYmxlX2xpc3QuZmxhZ3MgPSBBQ1BJX1JPT1RfQUxMT1dfUkVTSVpFOworCisJcmV0dXJuIChhY3BpX3RiX3Jlc2l6ZV9yb290X3RhYmxlX2xpc3QoKSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfaW5pdGlhbGl6ZV90YWJsZXMKKyAqCisgKiBQQVJBTUVURVJTOiAgaW5pdGlhbF90YWJsZV9hcnJheSAtIFBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgcHJlLWFsbG9jYXRlZAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjIHN0cnVjdHVyZXMuIElmIE5VTEwsIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheSBpcyBkeW5hbWljYWxseSBhbGxvY2F0ZWQuCisgKiAgICAgICAgICAgICAgaW5pdGlhbF90YWJsZV9jb3VudCAtIFNpemUgb2YgaW5pdGlhbF90YWJsZV9hcnJheSwgaW4gbnVtYmVyIG9mCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhY3BpX3RhYmxlX2Rlc2Mgc3RydWN0dXJlcworICogICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MgICAgICAgLSBGbGFnIHRvIHRlbGwgVGFibGUgTWFuYWdlciBpZiByZXNpemUgb2YKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlLWFsbG9jYXRlZCBhcnJheSBpcyBhbGxvd2VkLiBJZ25vcmVkCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGluaXRpYWxfdGFibGVfYXJyYXkgaXMgTlVMTC4KKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IEluaXRpYWxpemUgdGhlIHRhYmxlIG1hbmFnZXIsIGdldCB0aGUgUlNEUCBhbmQgUlNEVC9YU0RULgorICoKKyAqIE5PVEU6ICAgICAgICBBbGxvd3Mgc3RhdGljIGFsbG9jYXRpb24gb2YgdGhlIGluaXRpYWwgdGFibGUgYXJyYXkgaW4gb3JkZXIKKyAqICAgICAgICAgICAgICB0byBhdm9pZCB0aGUgdXNlIG9mIGR5bmFtaWMgbWVtb3J5IGluIGNvbmZpbmVkIGVudmlyb25tZW50cworICogICAgICAgICAgICAgIHN1Y2ggYXMgdGhlIGtlcm5lbCBib290IHNlcXVlbmNlIHdoZXJlIGl0IG1heSBub3QgYmUgYXZhaWxhYmxlLgorICoKKyAqICAgICAgICAgICAgICBJZiB0aGUgaG9zdCBPUyBtZW1vcnkgbWFuYWdlcnMgYXJlIGluaXRpYWxpemVkLCB1c2UgTlVMTCBmb3IKKyAqICAgICAgICAgICAgICBpbml0aWFsX3RhYmxlX2FycmF5LCBhbmQgdGhlIHRhYmxlIHdpbGwgYmUgZHluYW1pY2FsbHkgYWxsb2NhdGVkLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2FjcGlfc3RhdHVzIF9faW5pdAorYWNwaV9pbml0aWFsaXplX3RhYmxlcyhzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjICogaW5pdGlhbF90YWJsZV9hcnJheSwKKwkJICAgICAgIHUzMiBpbml0aWFsX3RhYmxlX2NvdW50LCB1OCBhbGxvd19yZXNpemUpCit7CisJYWNwaV9waHlzaWNhbF9hZGRyZXNzIHJzZHBfYWRkcmVzczsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGFjcGlfaW5pdGlhbGl6ZV90YWJsZXMpOworCisJLyoKKwkgKiBTZXQgdXAgdGhlIFJvb3QgVGFibGUgQXJyYXkKKwkgKiBBbGxvY2F0ZSB0aGUgdGFibGUgYXJyYXkgaWYgcmVxdWVzdGVkCisJICovCisJaWYgKCFpbml0aWFsX3RhYmxlX2FycmF5KSB7CisJCXN0YXR1cyA9IGFjcGlfYWxsb2NhdGVfcm9vdF90YWJsZShpbml0aWFsX3RhYmxlX2NvdW50KTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKKwkJfQorCX0gZWxzZSB7CisJCS8qIFJvb3QgVGFibGUgQXJyYXkgaGFzIGJlZW4gc3RhdGljYWxseSBhbGxvY2F0ZWQgYnkgdGhlIGhvc3QgKi8KKworCQlBQ1BJX01FTVNFVChpbml0aWFsX3RhYmxlX2FycmF5LCAwLAorCQkJICAgIChhY3BpX3NpemUpIGluaXRpYWxfdGFibGVfY291bnQgKgorCQkJICAgIHNpemVvZihzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjKSk7CisKKwkJYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LnRhYmxlcyA9IGluaXRpYWxfdGFibGVfYXJyYXk7CisJCWFjcGlfZ2JsX3Jvb3RfdGFibGVfbGlzdC5zaXplID0gaW5pdGlhbF90YWJsZV9jb3VudDsKKwkJYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LmZsYWdzID0gQUNQSV9ST09UX09SSUdJTl9VTktOT1dOOworCQlpZiAoYWxsb3dfcmVzaXplKSB7CisJCQlhY3BpX2dibF9yb290X3RhYmxlX2xpc3QuZmxhZ3MgfD0KKwkJCSAgICBBQ1BJX1JPT1RfQUxMT1dfUkVTSVpFOworCQl9CisJfQorCisJLyogR2V0IHRoZSBhZGRyZXNzIG9mIHRoZSBSU0RQICovCisKKwlyc2RwX2FkZHJlc3MgPSBhY3BpX29zX2dldF9yb290X3BvaW50ZXIoKTsKKwlpZiAoIXJzZHBfYWRkcmVzcykgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9UX0ZPVU5EKTsKKwl9CisKKwkvKgorCSAqIEdldCB0aGUgcm9vdCB0YWJsZSAoUlNEVCBvciBYU0RUKSBhbmQgZXh0cmFjdCBhbGwgZW50cmllcyB0byB0aGUgbG9jYWwKKwkgKiBSb290IFRhYmxlIEFycmF5LiBUaGlzIGFycmF5IGNvbnRhaW5zIHRoZSBpbmZvcm1hdGlvbiBvZiB0aGUgUlNEVC9YU0RUCisJICogaW4gYSBjb21tb24sIG1vcmUgdXNlYWJsZSBmb3JtYXQuCisJICovCisJc3RhdHVzID0KKwkgICAgYWNwaV90Yl9wYXJzZV9yb290X3RhYmxlKHJzZHBfYWRkcmVzcywgQUNQSV9UQUJMRV9PUklHSU5fTUFQUEVEKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9yZWFsbG9jYXRlX3Jvb3RfdGFibGUKKyAqCisgKiBQQVJBTUVURVJTOiAgTm9uZQorICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogUmVhbGxvY2F0ZSBSb290IFRhYmxlIExpc3QgaW50byBkeW5hbWljIG1lbW9yeS4gQ29waWVzIHRoZQorICogICAgICAgICAgICAgIHJvb3QgbGlzdCBmcm9tIHRoZSBwcmV2aW91c2x5IHByb3ZpZGVkIHNjcmF0Y2ggYXJlYS4gU2hvdWxkCisgKiAgICAgICAgICAgICAgYmUgY2FsbGVkIG9uY2UgZHluYW1pYyBtZW1vcnkgYWxsb2NhdGlvbiBpcyBhdmFpbGFibGUgaW4gdGhlCisgKiAgICAgICAgICAgICAga2VybmVsCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2FjcGlfc3RhdHVzIGFjcGlfcmVhbGxvY2F0ZV9yb290X3RhYmxlKHZvaWQpCit7CisJc3RydWN0IGFjcGlfdGFibGVfZGVzYyAqdGFibGVzOworCWFjcGlfc2l6ZSBuZXdfc2l6ZTsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0UoYWNwaV9yZWFsbG9jYXRlX3Jvb3RfdGFibGUpOworCisJLyoKKwkgKiBPbmx5IHJlYWxsb2NhdGUgdGhlIHJvb3QgdGFibGUgaWYgdGhlIGhvc3QgcHJvdmlkZWQgYSBzdGF0aWMgYnVmZmVyCisJICogZm9yIHRoZSB0YWJsZSBhcnJheSBpbiB0aGUgY2FsbCB0byBhY3BpX2luaXRpYWxpemVfdGFibGVzLgorCSAqLworCWlmIChhY3BpX2dibF9yb290X3RhYmxlX2xpc3QuZmxhZ3MgJiBBQ1BJX1JPT1RfT1JJR0lOX0FMTE9DQVRFRCkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfU1VQUE9SVCk7CisJfQorCisJbmV3X3NpemUgPSAoKGFjcGlfc2l6ZSkgYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LmNvdW50ICsKKwkJICAgIEFDUElfUk9PVF9UQUJMRV9TSVpFX0lOQ1JFTUVOVCkgKgorCSAgICBzaXplb2Yoc3RydWN0IGFjcGlfdGFibGVfZGVzYyk7CisKKwkvKiBDcmVhdGUgbmV3IGFycmF5IGFuZCBjb3B5IHRoZSBvbGQgYXJyYXkgKi8KKworCXRhYmxlcyA9IEFDUElfQUxMT0NBVEVfWkVST0VEKG5ld19zaXplKTsKKwlpZiAoIXRhYmxlcykgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9fTUVNT1JZKTsKKwl9CisKKwlBQ1BJX01FTUNQWSh0YWJsZXMsIGFjcGlfZ2JsX3Jvb3RfdGFibGVfbGlzdC50YWJsZXMsIG5ld19zaXplKTsKKworCWFjcGlfZ2JsX3Jvb3RfdGFibGVfbGlzdC5zaXplID0gYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LmNvdW50OworCWFjcGlfZ2JsX3Jvb3RfdGFibGVfbGlzdC50YWJsZXMgPSB0YWJsZXM7CisJYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LmZsYWdzID0KKwkgICAgQUNQSV9ST09UX09SSUdJTl9BTExPQ0FURUQgfCBBQ1BJX1JPT1RfQUxMT1dfUkVTSVpFOworCisJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9sb2FkX3RhYmxlCisgKgorICogUEFSQU1FVEVSUzogIHRhYmxlX3B0ciAgICAgICAtIHBvaW50ZXIgdG8gYSBidWZmZXIgY29udGFpbmluZyB0aGUgZW50aXJlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGUgdG8gYmUgbG9hZGVkCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBsb2FkIGEgdGFibGUgZnJvbSB0aGUgY2FsbGVyJ3MKKyAqICAgICAgICAgICAgICBidWZmZXIuIFRoZSBidWZmZXIgbXVzdCBjb250YWluIGFuIGVudGlyZSBBQ1BJIFRhYmxlIGluY2x1ZGluZworICogICAgICAgICAgICAgIGEgdmFsaWQgaGVhZGVyLiBUaGUgaGVhZGVyIGZpZWxkcyB3aWxsIGJlIHZlcmlmaWVkLCBhbmQgaWYgaXQKKyAqICAgICAgICAgICAgICBpcyBkZXRlcm1pbmVkIHRoYXQgdGhlIHRhYmxlIGlzIGludmFsaWQsIHRoZSBjYWxsIHdpbGwgZmFpbC4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYWNwaV9zdGF0dXMgYWNwaV9sb2FkX3RhYmxlKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqdGFibGVfcHRyKQoreworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwl1MzIgdGFibGVfaW5kZXg7CisJc3RydWN0IGFjcGlfdGFibGVfZGVzYyB0YWJsZV9kZXNjOworCisJaWYgKCF0YWJsZV9wdHIpCisJCXJldHVybiBBRV9CQURfUEFSQU1FVEVSOworCisJQUNQSV9NRU1TRVQoJnRhYmxlX2Rlc2MsIDAsIHNpemVvZihzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjKSk7CisJdGFibGVfZGVzYy5wb2ludGVyID0gdGFibGVfcHRyOworCXRhYmxlX2Rlc2MubGVuZ3RoID0gdGFibGVfcHRyLT5sZW5ndGg7CisJdGFibGVfZGVzYy5mbGFncyA9IEFDUElfVEFCTEVfT1JJR0lOX1VOS05PV047CisKKwkvKgorCSAqIEluc3RhbGwgdGhlIG5ldyB0YWJsZSBpbnRvIHRoZSBsb2NhbCBkYXRhIHN0cnVjdHVyZXMKKwkgKi8KKwlzdGF0dXMgPSBhY3BpX3RiX2FkZF90YWJsZSgmdGFibGVfZGVzYywgJnRhYmxlX2luZGV4KTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisJc3RhdHVzID0gYWNwaV9uc19sb2FkX3RhYmxlKHRhYmxlX2luZGV4LCBhY3BpX2dibF9yb290X25vZGUpOworCXJldHVybiBzdGF0dXM7Cit9CisKK0FDUElfRVhQT1JUX1NZTUJPTChhY3BpX2xvYWRfdGFibGUpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9nZXRfdGFibGVfaGVhZGVyCisgKgorICogUEFSQU1FVEVSUzogIFNpZ25hdHVyZSAgICAgICAgICAgLSBBQ1BJIHNpZ25hdHVyZSBvZiBuZWVkZWQgdGFibGUKKyAqICAgICAgICAgICAgICBJbnN0YW5jZSAgICAgICAgICAgIC0gV2hpY2ggaW5zdGFuY2UgKGZvciBTU0RUcykKKyAqICAgICAgICAgICAgICBvdXRfdGFibGVfaGVhZGVyICAgIC0gVGhlIHBvaW50ZXIgdG8gdGhlIHRhYmxlIGhlYWRlciB0byBmaWxsCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cyBhbmQgcG9pbnRlciB0byBtYXBwZWQgdGFibGUgaGVhZGVyCisgKgorICogREVTQ1JJUFRJT046IEZpbmRzIGFuIEFDUEkgdGFibGUgaGVhZGVyLgorICoKKyAqIE5PVEU6ICAgICAgICBDYWxsZXIgaXMgcmVzcG9uc2libGUgaW4gdW5tYXBwaW5nIHRoZSBoZWFkZXIgd2l0aAorICogICAgICAgICAgICAgIGFjcGlfb3NfdW5tYXBfbWVtb3J5CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYWNwaV9zdGF0dXMKK2FjcGlfZ2V0X3RhYmxlX2hlYWRlcihjaGFyICpzaWduYXR1cmUsCisJCSAgICAgIHUzMiBpbnN0YW5jZSwgc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICpvdXRfdGFibGVfaGVhZGVyKQoreworICAgICAgIHUzMiBpOworICAgICAgIHUzMiBqOworCXN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqaGVhZGVyOworCisJLyogUGFyYW1ldGVyIHZhbGlkYXRpb24gKi8KKworCWlmICghc2lnbmF0dXJlIHx8ICFvdXRfdGFibGVfaGVhZGVyKSB7CisJCXJldHVybiAoQUVfQkFEX1BBUkFNRVRFUik7CisJfQorCisJLyoKKwkgKiBXYWxrIHRoZSByb290IHRhYmxlIGxpc3QKKwkgKi8KKwlmb3IgKGkgPSAwLCBqID0gMDsgaSA8IGFjcGlfZ2JsX3Jvb3RfdGFibGVfbGlzdC5jb3VudDsgaSsrKSB7CisJCWlmICghQUNQSV9DT01QQVJFX05BTUUKKwkJICAgICgmKGFjcGlfZ2JsX3Jvb3RfdGFibGVfbGlzdC50YWJsZXNbaV0uc2lnbmF0dXJlKSwKKwkJICAgICBzaWduYXR1cmUpKSB7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmICgrK2ogPCBpbnN0YW5jZSkgeworCQkJY29udGludWU7CisJCX0KKworCQlpZiAoIWFjcGlfZ2JsX3Jvb3RfdGFibGVfbGlzdC50YWJsZXNbaV0ucG9pbnRlcikgeworCQkJaWYgKChhY3BpX2dibF9yb290X3RhYmxlX2xpc3QudGFibGVzW2ldLgorCQkJICAgICBmbGFncyAmIEFDUElfVEFCTEVfT1JJR0lOX01BU0spID09CisJCQkgICAgQUNQSV9UQUJMRV9PUklHSU5fTUFQUEVEKSB7CisJCQkJaGVhZGVyID0KKwkJCQkgICAgYWNwaV9vc19tYXBfbWVtb3J5KGFjcGlfZ2JsX3Jvb3RfdGFibGVfbGlzdC4KKwkJCQkJCSAgICAgICB0YWJsZXNbaV0uYWRkcmVzcywKKwkJCQkJCSAgICAgICBzaXplb2Yoc3RydWN0CisJCQkJCQkJICAgICAgYWNwaV90YWJsZV9oZWFkZXIpKTsKKwkJCQlpZiAoIWhlYWRlcikgeworCQkJCQlyZXR1cm4gQUVfTk9fTUVNT1JZOworCQkJCX0KKwkJCQlBQ1BJX01FTUNQWShvdXRfdGFibGVfaGVhZGVyLCBoZWFkZXIsCisJCQkJCSAgICBzaXplb2Yoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyKSk7CisJCQkJYWNwaV9vc191bm1hcF9tZW1vcnkoaGVhZGVyLAorCQkJCQkJICAgICBzaXplb2Yoc3RydWN0CisJCQkJCQkJICAgIGFjcGlfdGFibGVfaGVhZGVyKSk7CisJCQl9IGVsc2UgeworCQkJCXJldHVybiBBRV9OT1RfRk9VTkQ7CisJCQl9CisJCX0gZWxzZSB7CisJCQlBQ1BJX01FTUNQWShvdXRfdGFibGVfaGVhZGVyLAorCQkJCSAgICBhY3BpX2dibF9yb290X3RhYmxlX2xpc3QudGFibGVzW2ldLnBvaW50ZXIsCisJCQkJICAgIHNpemVvZihzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIpKTsKKwkJfQorCQlyZXR1cm4gKEFFX09LKTsKKwl9CisKKwlyZXR1cm4gKEFFX05PVF9GT1VORCk7Cit9CisKK0FDUElfRVhQT1JUX1NZTUJPTChhY3BpX2dldF90YWJsZV9oZWFkZXIpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV91bmxvYWRfdGFibGVfaWQKKyAqCisgKiBQQVJBTUVURVJTOiAgaWQgICAgICAgICAgICAtIE93bmVyIElEIG9mIHRoZSB0YWJsZSB0byBiZSByZW1vdmVkLgorICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogVGhpcyByb3V0aW5lIGlzIHVzZWQgdG8gZm9yY2UgdGhlIHVubG9hZCBvZiBhIHRhYmxlIChieSBpZCkKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYWNwaV9zdGF0dXMgYWNwaV91bmxvYWRfdGFibGVfaWQoYWNwaV9vd25lcl9pZCBpZCkKK3sKKwlpbnQgaTsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9OT1RfRVhJU1Q7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGFjcGlfdW5sb2FkX3RhYmxlX2lkKTsKKworCS8qIEZpbmQgdGFibGUgaW4gdGhlIGdsb2JhbCB0YWJsZSBsaXN0ICovCisJZm9yIChpID0gMDsgaSA8IGFjcGlfZ2JsX3Jvb3RfdGFibGVfbGlzdC5jb3VudDsgKytpKSB7CisJCWlmIChpZCAhPSBhY3BpX2dibF9yb290X3RhYmxlX2xpc3QudGFibGVzW2ldLm93bmVyX2lkKSB7CisJCQljb250aW51ZTsKKwkJfQorCQkvKgorCQkgKiBEZWxldGUgYWxsIG5hbWVzcGFjZSBvYmplY3RzIG93bmVkIGJ5IHRoaXMgdGFibGUuIE5vdGUgdGhhdCB0aGVzZQorCQkgKiBvYmplY3RzIGNhbiBhcHBlYXIgYW55d2hlcmUgaW4gdGhlIG5hbWVzcGFjZSBieSB2aXJ0dWUgb2YgdGhlIEFNTAorCQkgKiAiU2NvcGUiIG9wZXJhdG9yLiBUaHVzLCB3ZSBuZWVkIHRvIHRyYWNrIG93bmVyc2hpcCBieSBhbiBJRCwgbm90CisJCSAqIHNpbXBseSBhIHBvc2l0aW9uIHdpdGhpbiB0aGUgaGllcmFyY2h5CisJCSAqLworCQlhY3BpX3RiX2RlbGV0ZV9uYW1lc3BhY2VfYnlfb3duZXIoaSk7CisJCXN0YXR1cyA9IGFjcGlfdGJfcmVsZWFzZV9vd25lcl9pZChpKTsKKwkJYWNwaV90Yl9zZXRfdGFibGVfbG9hZGVkX2ZsYWcoaSwgRkFMU0UpOworCQlicmVhazsKKwl9CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Cit9CisKK0FDUElfRVhQT1JUX1NZTUJPTChhY3BpX3VubG9hZF90YWJsZV9pZCkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9nZXRfdGFibGUKKyAqCisgKiBQQVJBTUVURVJTOiAgU2lnbmF0dXJlICAgICAgICAgICAtIEFDUEkgc2lnbmF0dXJlIG9mIG5lZWRlZCB0YWJsZQorICogICAgICAgICAgICAgIEluc3RhbmNlICAgICAgICAgICAgLSBXaGljaCBpbnN0YW5jZSAoZm9yIFNTRFRzKQorICogICAgICAgICAgICAgIG91dF90YWJsZSAgICAgICAgICAgLSBXaGVyZSB0aGUgcG9pbnRlciB0byB0aGUgdGFibGUgaXMgcmV0dXJuZWQKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzIGFuZCBwb2ludGVyIHRvIHRhYmxlCisgKgorICogREVTQ1JJUFRJT046IEZpbmRzIGFuZCB2ZXJpZmllcyBhbiBBQ1BJIHRhYmxlLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2FjcGlfc3RhdHVzCithY3BpX2dldF90YWJsZShjaGFyICpzaWduYXR1cmUsCisJICAgICAgIHUzMiBpbnN0YW5jZSwgc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICoqb3V0X3RhYmxlKQoreworICAgICAgIHUzMiBpOworICAgICAgIHUzMiBqOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKworCS8qIFBhcmFtZXRlciB2YWxpZGF0aW9uICovCisKKwlpZiAoIXNpZ25hdHVyZSB8fCAhb3V0X3RhYmxlKSB7CisJCXJldHVybiAoQUVfQkFEX1BBUkFNRVRFUik7CisJfQorCisJLyoKKwkgKiBXYWxrIHRoZSByb290IHRhYmxlIGxpc3QKKwkgKi8KKwlmb3IgKGkgPSAwLCBqID0gMDsgaSA8IGFjcGlfZ2JsX3Jvb3RfdGFibGVfbGlzdC5jb3VudDsgaSsrKSB7CisJCWlmICghQUNQSV9DT01QQVJFX05BTUUKKwkJICAgICgmKGFjcGlfZ2JsX3Jvb3RfdGFibGVfbGlzdC50YWJsZXNbaV0uc2lnbmF0dXJlKSwKKwkJICAgICBzaWduYXR1cmUpKSB7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmICgrK2ogPCBpbnN0YW5jZSkgeworCQkJY29udGludWU7CisJCX0KKworCQlzdGF0dXMgPQorCQkgICAgYWNwaV90Yl92ZXJpZnlfdGFibGUoJmFjcGlfZ2JsX3Jvb3RfdGFibGVfbGlzdC50YWJsZXNbaV0pOworCQlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpIHsKKwkJCSpvdXRfdGFibGUgPSBhY3BpX2dibF9yb290X3RhYmxlX2xpc3QudGFibGVzW2ldLnBvaW50ZXI7CisJCX0KKworCQlpZiAoIWFjcGlfZ2JsX3Blcm1hbmVudF9tbWFwKSB7CisJCQlhY3BpX2dibF9yb290X3RhYmxlX2xpc3QudGFibGVzW2ldLnBvaW50ZXIgPSBOVUxMOworCQl9CisKKwkJcmV0dXJuIChzdGF0dXMpOworCX0KKworCXJldHVybiAoQUVfTk9UX0ZPVU5EKTsKK30KKworQUNQSV9FWFBPUlRfU1lNQk9MKGFjcGlfZ2V0X3RhYmxlKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX2dldF90YWJsZV9ieV9pbmRleAorICoKKyAqIFBBUkFNRVRFUlM6ICB0YWJsZV9pbmRleCAgICAgICAgIC0gVGFibGUgaW5kZXgKKyAqICAgICAgICAgICAgICBUYWJsZSAgICAgICAgICAgICAgIC0gV2hlcmUgdGhlIHBvaW50ZXIgdG8gdGhlIHRhYmxlIGlzIHJldHVybmVkCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cyBhbmQgcG9pbnRlciB0byB0aGUgdGFibGUKKyAqCisgKiBERVNDUklQVElPTjogT2J0YWluIGEgdGFibGUgYnkgYW4gaW5kZXggaW50byB0aGUgZ2xvYmFsIHRhYmxlIGxpc3QuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2FjcGlfc3RhdHVzCithY3BpX2dldF90YWJsZV9ieV9pbmRleCh1MzIgdGFibGVfaW5kZXgsIHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqKnRhYmxlKQoreworCWFjcGlfc3RhdHVzIHN0YXR1czsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0UoYWNwaV9nZXRfdGFibGVfYnlfaW5kZXgpOworCisJLyogUGFyYW1ldGVyIHZhbGlkYXRpb24gKi8KKworCWlmICghdGFibGUpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9QQVJBTUVURVIpOworCX0KKworCSh2b2lkKWFjcGlfdXRfYWNxdWlyZV9tdXRleChBQ1BJX01UWF9UQUJMRVMpOworCisJLyogVmFsaWRhdGUgaW5kZXggKi8KKworCWlmICh0YWJsZV9pbmRleCA+PSBhY3BpX2dibF9yb290X3RhYmxlX2xpc3QuY291bnQpIHsKKwkJKHZvaWQpYWNwaV91dF9yZWxlYXNlX211dGV4KEFDUElfTVRYX1RBQkxFUyk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfUEFSQU1FVEVSKTsKKwl9CisKKwlpZiAoIWFjcGlfZ2JsX3Jvb3RfdGFibGVfbGlzdC50YWJsZXNbdGFibGVfaW5kZXhdLnBvaW50ZXIpIHsKKworCQkvKiBUYWJsZSBpcyBub3QgbWFwcGVkLCBtYXAgaXQgKi8KKworCQlzdGF0dXMgPQorCQkgICAgYWNwaV90Yl92ZXJpZnlfdGFibGUoJmFjcGlfZ2JsX3Jvb3RfdGFibGVfbGlzdC4KKwkJCQkJIHRhYmxlc1t0YWJsZV9pbmRleF0pOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCSh2b2lkKWFjcGlfdXRfcmVsZWFzZV9tdXRleChBQ1BJX01UWF9UQUJMRVMpOworCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CisJCX0KKwl9CisKKwkqdGFibGUgPSBhY3BpX2dibF9yb290X3RhYmxlX2xpc3QudGFibGVzW3RhYmxlX2luZGV4XS5wb2ludGVyOworCSh2b2lkKWFjcGlfdXRfcmVsZWFzZV9tdXRleChBQ1BJX01UWF9UQUJMRVMpOworCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7Cit9CisKK0FDUElfRVhQT1JUX1NZTUJPTChhY3BpX2dldF90YWJsZV9ieV9pbmRleCkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV90Yl9sb2FkX25hbWVzcGFjZQorICoKKyAqIFBBUkFNRVRFUlM6ICBOb25lCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBMb2FkIHRoZSBuYW1lc3BhY2UgZnJvbSB0aGUgRFNEVCBhbmQgYWxsIFNTRFRzL1BTRFRzIGZvdW5kIGluCisgKiAgICAgICAgICAgICAgdGhlIFJTRFQvWFNEVC4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGFjcGlfc3RhdHVzIGFjcGlfdGJfbG9hZF9uYW1lc3BhY2Uodm9pZCkKK3sKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICp0YWJsZTsKKwl1MzIgaTsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0UodGJfbG9hZF9uYW1lc3BhY2UpOworCisJKHZvaWQpYWNwaV91dF9hY3F1aXJlX211dGV4KEFDUElfTVRYX1RBQkxFUyk7CisKKwkvKgorCSAqIExvYWQgdGhlIG5hbWVzcGFjZS4gVGhlIERTRFQgaXMgcmVxdWlyZWQsIGJ1dCBhbnkgU1NEVCBhbmQgUFNEVCB0YWJsZXMKKwkgKiBhcmUgb3B0aW9uYWwuCisJICovCisJaWYgKCFhY3BpX2dibF9yb290X3RhYmxlX2xpc3QuY291bnQgfHwKKwkgICAgIUFDUElfQ09NUEFSRV9OQU1FKCYKKwkJCSAgICAgICAoYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LgorCQkJCXRhYmxlc1tBQ1BJX1RBQkxFX0lOREVYX0RTRFRdLnNpZ25hdHVyZSksCisJCQkgICAgICAgQUNQSV9TSUdfRFNEVCkKKwkgICAgfHwKKwkgICAgQUNQSV9GQUlMVVJFKGFjcGlfdGJfdmVyaWZ5X3RhYmxlCisJCQkgKCZhY3BpX2dibF9yb290X3RhYmxlX2xpc3QuCisJCQkgIHRhYmxlc1tBQ1BJX1RBQkxFX0lOREVYX0RTRFRdKSkpIHsKKwkJc3RhdHVzID0gQUVfTk9fQUNQSV9UQUJMRVM7CisJCWdvdG8gdW5sb2NrX2FuZF9leGl0OworCX0KKworCS8qCisJICogRmluZCBEU0RUIHRhYmxlCisJICovCisJc3RhdHVzID0KKwkgICAgYWNwaV9vc190YWJsZV9vdmVycmlkZShhY3BpX2dibF9yb290X3RhYmxlX2xpc3QuCisJCQkJICAgdGFibGVzW0FDUElfVEFCTEVfSU5ERVhfRFNEVF0ucG9pbnRlciwKKwkJCQkgICAmdGFibGUpOworCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSAmJiB0YWJsZSkgeworCQkvKgorCQkgKiBEU0RUIHRhYmxlIGhhcyBiZWVuIGZvdW5kCisJCSAqLworCQlhY3BpX3RiX2RlbGV0ZV90YWJsZSgmYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LgorCQkJCSAgICAgdGFibGVzW0FDUElfVEFCTEVfSU5ERVhfRFNEVF0pOworCQlhY3BpX2dibF9yb290X3RhYmxlX2xpc3QudGFibGVzW0FDUElfVEFCTEVfSU5ERVhfRFNEVF0ucG9pbnRlciA9CisJCSAgICB0YWJsZTsKKwkJYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LnRhYmxlc1tBQ1BJX1RBQkxFX0lOREVYX0RTRFRdLmxlbmd0aCA9CisJCSAgICB0YWJsZS0+bGVuZ3RoOworCQlhY3BpX2dibF9yb290X3RhYmxlX2xpc3QudGFibGVzW0FDUElfVEFCTEVfSU5ERVhfRFNEVF0uZmxhZ3MgPQorCQkgICAgQUNQSV9UQUJMRV9PUklHSU5fVU5LTk9XTjsKKworCQlBQ1BJX0lORk8oKEFFX0lORk8sICJUYWJsZSBEU0RUIHJlcGxhY2VkIGJ5IGhvc3QgT1MiKSk7CisJCWFjcGlfdGJfcHJpbnRfdGFibGVfaGVhZGVyKDAsIHRhYmxlKTsKKworCQlpZiAobm9fYXV0b19zc2R0ID09IDApIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIkFDUEk6IERTRFQgb3ZlcnJpZGUgdXNlcyBvcmlnaW5hbCBTU0RUcyB1bmxlc3MgXCJhY3BpX25vX2F1dG9fc3NkdFwiXG4iKTsKKwkJfQorCX0KKworCXN0YXR1cyA9CisJICAgIGFjcGlfdGJfdmVyaWZ5X3RhYmxlKCZhY3BpX2dibF9yb290X3RhYmxlX2xpc3QuCisJCQkJIHRhYmxlc1tBQ1BJX1RBQkxFX0lOREVYX0RTRFRdKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKworCQkvKiBBIHZhbGlkIERTRFQgaXMgcmVxdWlyZWQgKi8KKworCQlzdGF0dXMgPSBBRV9OT19BQ1BJX1RBQkxFUzsKKwkJZ290byB1bmxvY2tfYW5kX2V4aXQ7CisJfQorCisJKHZvaWQpYWNwaV91dF9yZWxlYXNlX211dGV4KEFDUElfTVRYX1RBQkxFUyk7CisKKwkvKgorCSAqIExvYWQgYW5kIHBhcnNlIHRhYmxlcy4KKwkgKi8KKwlzdGF0dXMgPSBhY3BpX25zX2xvYWRfdGFibGUoQUNQSV9UQUJMRV9JTkRFWF9EU0RULCBhY3BpX2dibF9yb290X25vZGUpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKKwl9CisKKwkvKgorCSAqIExvYWQgYW55IFNTRFQgb3IgUFNEVCB0YWJsZXMuIE5vdGU6IExvb3AgbGVhdmVzIHRhYmxlcyBsb2NrZWQKKwkgKi8KKwkodm9pZClhY3BpX3V0X2FjcXVpcmVfbXV0ZXgoQUNQSV9NVFhfVEFCTEVTKTsKKwlmb3IgKGkgPSAwOyBpIDwgYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LmNvdW50OyArK2kpIHsKKwkJaWYgKCghQUNQSV9DT01QQVJFX05BTUUKKwkJICAgICAoJihhY3BpX2dibF9yb290X3RhYmxlX2xpc3QudGFibGVzW2ldLnNpZ25hdHVyZSksCisJCSAgICAgIEFDUElfU0lHX1NTRFQpCisJCSAgICAgJiYKKwkJICAgICAhQUNQSV9DT01QQVJFX05BTUUoJgorCQkJCQkoYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LnRhYmxlc1tpXS4KKwkJCQkJIHNpZ25hdHVyZSksIEFDUElfU0lHX1BTRFQpKQorCQkgICAgfHwKKwkJICAgIEFDUElfRkFJTFVSRShhY3BpX3RiX3ZlcmlmeV90YWJsZQorCQkJCSAoJmFjcGlfZ2JsX3Jvb3RfdGFibGVfbGlzdC50YWJsZXNbaV0pKSkgeworCQkJY29udGludWU7CisJCX0KKworCQlpZiAobm9fYXV0b19zc2R0KSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJBQ1BJOiBTU0RUIGlnbm9yZWQgZHVlIHRvIFwiYWNwaV9ub19hdXRvX3NzZHRcIlxuIik7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIElnbm9yZSBlcnJvcnMgd2hpbGUgbG9hZGluZyB0YWJsZXMsIGdldCBhcyBtYW55IGFzIHBvc3NpYmxlICovCisKKwkJKHZvaWQpYWNwaV91dF9yZWxlYXNlX211dGV4KEFDUElfTVRYX1RBQkxFUyk7CisJCSh2b2lkKWFjcGlfbnNfbG9hZF90YWJsZShpLCBhY3BpX2dibF9yb290X25vZGUpOworCQkodm9pZClhY3BpX3V0X2FjcXVpcmVfbXV0ZXgoQUNQSV9NVFhfVEFCTEVTKTsKKwl9CisKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lOSVQsICJBQ1BJIFRhYmxlcyBzdWNjZXNzZnVsbHkgYWNxdWlyZWRcbiIpKTsKKworICAgICAgdW5sb2NrX2FuZF9leGl0OgorCSh2b2lkKWFjcGlfdXRfcmVsZWFzZV9tdXRleChBQ1BJX01UWF9UQUJMRVMpOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX2xvYWRfdGFibGVzCisgKgorICogUEFSQU1FVEVSUzogIE5vbmUKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IExvYWQgdGhlIEFDUEkgdGFibGVzIGZyb20gdGhlIFJTRFQvWFNEVAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2FjcGlfc3RhdHVzIGFjcGlfbG9hZF90YWJsZXModm9pZCkKK3sKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGFjcGlfbG9hZF90YWJsZXMpOworCisJLyoKKwkgKiBMb2FkIHRoZSBuYW1lc3BhY2UgZnJvbSB0aGUgdGFibGVzCisJICovCisJc3RhdHVzID0gYWNwaV90Yl9sb2FkX25hbWVzcGFjZSgpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlBQ1BJX0VYQ0VQVElPTigoQUVfSU5GTywgc3RhdHVzLAorCQkJCSJXaGlsZSBsb2FkaW5nIG5hbWVzcGFjZSBmcm9tIEFDUEkgdGFibGVzIikpOworCX0KKworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworfQorCitBQ1BJX0VYUE9SVF9TWU1CT0woYWNwaV9sb2FkX3RhYmxlcykKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX2luc3RhbGxfdGFibGVfaGFuZGxlcgorICoKKyAqIFBBUkFNRVRFUlM6ICBIYW5kbGVyICAgICAgICAgLSBUYWJsZSBldmVudCBoYW5kbGVyCisgKiAgICAgICAgICAgICAgQ29udGV4dCAgICAgICAgIC0gVmFsdWUgcGFzc2VkIHRvIHRoZSBoYW5kbGVyIG9uIGVhY2ggZXZlbnQKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IEluc3RhbGwgdGFibGUgZXZlbnQgaGFuZGxlcgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCithY3BpX3N0YXR1cworYWNwaV9pbnN0YWxsX3RhYmxlX2hhbmRsZXIoYWNwaV90YmxfaGFuZGxlciBoYW5kbGVyLCB2b2lkICpjb250ZXh0KQoreworCWFjcGlfc3RhdHVzIHN0YXR1czsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0UoYWNwaV9pbnN0YWxsX3RhYmxlX2hhbmRsZXIpOworCisJaWYgKCFoYW5kbGVyKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfUEFSQU1FVEVSKTsKKwl9CisKKwlzdGF0dXMgPSBhY3BpX3V0X2FjcXVpcmVfbXV0ZXgoQUNQSV9NVFhfRVZFTlRTKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CisJfQorCisJLyogRG9uJ3QgYWxsb3cgbW9yZSB0aGFuIG9uZSBoYW5kbGVyICovCisKKwlpZiAoYWNwaV9nYmxfdGFibGVfaGFuZGxlcikgeworCQlzdGF0dXMgPSBBRV9BTFJFQURZX0VYSVNUUzsKKwkJZ290byBjbGVhbnVwOworCX0KKworCS8qIEluc3RhbGwgdGhlIGhhbmRsZXIgKi8KKworCWFjcGlfZ2JsX3RhYmxlX2hhbmRsZXIgPSBoYW5kbGVyOworCWFjcGlfZ2JsX3RhYmxlX2hhbmRsZXJfY29udGV4dCA9IGNvbnRleHQ7CisKKyAgICAgIGNsZWFudXA6CisJKHZvaWQpYWNwaV91dF9yZWxlYXNlX211dGV4KEFDUElfTVRYX0VWRU5UUyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Cit9CisKK0FDUElfRVhQT1JUX1NZTUJPTChhY3BpX2luc3RhbGxfdGFibGVfaGFuZGxlcikKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9yZW1vdmVfdGFibGVfaGFuZGxlcgorICoKKyAqIFBBUkFNRVRFUlM6ICBIYW5kbGVyICAgICAgICAgLSBUYWJsZSBldmVudCBoYW5kbGVyIHRoYXQgd2FzIGluc3RhbGxlZAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpb3VzbHkuCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBSZW1vdmUgdGFibGUgZXZlbnQgaGFuZGxlcgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCithY3BpX3N0YXR1cyBhY3BpX3JlbW92ZV90YWJsZV9oYW5kbGVyKGFjcGlfdGJsX2hhbmRsZXIgaGFuZGxlcikKK3sKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGFjcGlfcmVtb3ZlX3RhYmxlX2hhbmRsZXIpOworCisJc3RhdHVzID0gYWNwaV91dF9hY3F1aXJlX211dGV4KEFDUElfTVRYX0VWRU5UUyk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworCX0KKworCS8qIE1ha2Ugc3VyZSB0aGF0IHRoZSBpbnN0YWxsZWQgaGFuZGxlciBpcyB0aGUgc2FtZSAqLworCisJaWYgKCFoYW5kbGVyIHx8IGhhbmRsZXIgIT0gYWNwaV9nYmxfdGFibGVfaGFuZGxlcikgeworCQlzdGF0dXMgPSBBRV9CQURfUEFSQU1FVEVSOworCQlnb3RvIGNsZWFudXA7CisJfQorCisJLyogUmVtb3ZlIHRoZSBoYW5kbGVyICovCisKKwlhY3BpX2dibF90YWJsZV9oYW5kbGVyID0gTlVMTDsKKworICAgICAgY2xlYW51cDoKKwkodm9pZClhY3BpX3V0X3JlbGVhc2VfbXV0ZXgoQUNQSV9NVFhfRVZFTlRTKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKK30KKworQUNQSV9FWFBPUlRfU1lNQk9MKGFjcGlfcmVtb3ZlX3RhYmxlX2hhbmRsZXIpCisKKworc3RhdGljIGludCBfX2luaXQgYWNwaV9ub19hdXRvX3NzZHRfc2V0dXAoY2hhciAqcykgeworCisgICAgICAgIHByaW50ayhLRVJOX05PVElDRSAiQUNQSTogU1NEVCBhdXRvLWxvYWQgZGlzYWJsZWRcbiIpOworCisgICAgICAgIG5vX2F1dG9fc3NkdCA9IDE7CisKKyAgICAgICAgcmV0dXJuIDE7Cit9CisKK19fc2V0dXAoImFjcGlfbm9fYXV0b19zc2R0IiwgYWNwaV9ub19hdXRvX3NzZHRfc2V0dXApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS90Ynhmcm9vdC5jIGIvZHJpdmVycy9hY3BpL2FjcGljYS90Ynhmcm9vdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3ZmM4ZGQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL3RieGZyb290LmMKQEAgLTAsMCArMSwyNzQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBNb2R1bGUgTmFtZTogdGJ4ZnJvb3QgLSBGaW5kIHRoZSByb290IEFDUEkgdGFibGUgKFJTRFQpCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwOCwgSW50ZWwgQ29ycC4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKKyAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIGF0IG1pbmltdW0gYSBkaXNjbGFpbWVyCisgKiAgICBzdWJzdGFudGlhbGx5IHNpbWlsYXIgdG8gdGhlICJOTyBXQVJSQU5UWSIgZGlzY2xhaW1lciBiZWxvdworICogICAgKCJEaXNjbGFpbWVyIikgYW5kIGFueSByZWRpc3RyaWJ1dGlvbiBtdXN0IGJlIGNvbmRpdGlvbmVkIHVwb24KKyAqICAgIGluY2x1ZGluZyBhIHN1YnN0YW50aWFsbHkgc2ltaWxhciBEaXNjbGFpbWVyIHJlcXVpcmVtZW50IGZvciBmdXJ0aGVyCisgKiAgICBiaW5hcnkgcmVkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMKKyAqICAgIG9mIGFueSBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogTk8gV0FSUkFOVFkKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HCisgKiBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KKyAqLworCisjaW5jbHVkZSA8YWNwaS9hY3BpLmg+CisjaW5jbHVkZSAiYWNjb21tb24uaCIKKyNpbmNsdWRlICJhY3RhYmxlcy5oIgorCisjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9UQUJMRVMKK0FDUElfTU9EVUxFX05BTUUoInRieGZyb290IikKKworLyogTG9jYWwgcHJvdG90eXBlcyAqLworc3RhdGljIHU4ICphY3BpX3RiX3NjYW5fbWVtb3J5X2Zvcl9yc2RwKHU4ICogc3RhcnRfYWRkcmVzcywgdTMyIGxlbmd0aCk7CisKK3N0YXRpYyBhY3BpX3N0YXR1cyBhY3BpX3RiX3ZhbGlkYXRlX3JzZHAoc3RydWN0IGFjcGlfdGFibGVfcnNkcCAqcnNkcCk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfdGJfdmFsaWRhdGVfcnNkcAorICoKKyAqIFBBUkFNRVRFUlM6ICBSc2RwICAgICAgICAgICAgICAgIC0gUG9pbnRlciB0byB1bnZhbGlkYXRlZCBSU0RQCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBWYWxpZGF0ZSB0aGUgUlNEUCAocHRyKQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBhY3BpX3N0YXR1cyBhY3BpX3RiX3ZhbGlkYXRlX3JzZHAoc3RydWN0IGFjcGlfdGFibGVfcnNkcCAqcnNkcCkKK3sKKwlBQ1BJX0ZVTkNUSU9OX0VOVFJZKCk7CisKKwkvKgorCSAqIFRoZSBzaWduYXR1cmUgYW5kIGNoZWNrc3VtIG11c3QgYm90aCBiZSBjb3JyZWN0CisJICoKKwkgKiBOb3RlOiBTb21ldGltZXMgdGhlcmUgZXhpc3RzIG1vcmUgdGhhbiBvbmUgUlNEUCBpbiBtZW1vcnk7IHRoZSB2YWxpZAorCSAqIFJTRFAgaGFzIGEgdmFsaWQgY2hlY2tzdW0sIGFsbCBvdGhlcnMgaGF2ZSBhbiBpbnZhbGlkIGNoZWNrc3VtLgorCSAqLworCWlmIChBQ1BJX1NUUk5DTVAoKGNoYXIgKilyc2RwLCBBQ1BJX1NJR19SU0RQLCBzaXplb2YoQUNQSV9TSUdfUlNEUCkgLSAxKQorCSAgICAhPSAwKSB7CisKKwkJLyogTm9wZSwgQkFEIFNpZ25hdHVyZSAqLworCisJCXJldHVybiAoQUVfQkFEX1NJR05BVFVSRSk7CisJfQorCisJLyogQ2hlY2sgdGhlIHN0YW5kYXJkIGNoZWNrc3VtICovCisKKwlpZiAoYWNwaV90Yl9jaGVja3N1bSgodTggKikgcnNkcCwgQUNQSV9SU0RQX0NIRUNLU1VNX0xFTkdUSCkgIT0gMCkgeworCQlyZXR1cm4gKEFFX0JBRF9DSEVDS1NVTSk7CisJfQorCisJLyogQ2hlY2sgZXh0ZW5kZWQgY2hlY2tzdW0gaWYgdGFibGUgdmVyc2lvbiA+PSAyICovCisKKwlpZiAoKHJzZHAtPnJldmlzaW9uID49IDIpICYmCisJICAgIChhY3BpX3RiX2NoZWNrc3VtKCh1OCAqKSByc2RwLCBBQ1BJX1JTRFBfWENIRUNLU1VNX0xFTkdUSCkgIT0gMCkpIHsKKwkJcmV0dXJuIChBRV9CQURfQ0hFQ0tTVU0pOworCX0KKworCXJldHVybiAoQUVfT0spOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX2ZpbmRfcm9vdF9wb2ludGVyCisgKgorICogUEFSQU1FVEVSUzogIHRhYmxlX2FkZHJlc3MgICAgICAgICAgIC0gV2hlcmUgdGhlIHRhYmxlIHBvaW50ZXIgaXMgcmV0dXJuZWQKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzLCBSU0RQIHBoeXNpY2FsIGFkZHJlc3MKKyAqCisgKiBERVNDUklQVElPTjogU2VhcmNoIGxvd2VyIDFfbWJ5dGUgb2YgbWVtb3J5IGZvciB0aGUgcm9vdCBzeXN0ZW0gZGVzY3JpcHRvcgorICogICAgICAgICAgICAgIHBvaW50ZXIgc3RydWN0dXJlLiAgSWYgaXQgaXMgZm91bmQsIHNldCAqUlNEUCB0byBwb2ludCB0byBpdC4KKyAqCisgKiBOT1RFMTogICAgICAgVGhlIFJTRFAgbXVzdCBiZSBlaXRoZXIgaW4gdGhlIGZpcnN0IDFfayBvZiB0aGUgRXh0ZW5kZWQKKyAqICAgICAgICAgICAgICBCSU9TIERhdGEgQXJlYSBvciBiZXR3ZWVuIEUwMDAwIGFuZCBGRkZGRiAoRnJvbSBBQ1BJIFNwZWMuKQorICogICAgICAgICAgICAgIE9ubHkgYSAzMi1iaXQgcGh5c2ljYWwgYWRkcmVzcyBpcyBuZWNlc3NhcnkuCisgKgorICogTk9URTI6ICAgICAgIFRoaXMgZnVuY3Rpb24gaXMgYWx3YXlzIGF2YWlsYWJsZSwgcmVnYXJkbGVzcyBvZiB0aGUKKyAqICAgICAgICAgICAgICBpbml0aWFsaXphdGlvbiBzdGF0ZSBvZiB0aGUgcmVzdCBvZiBBQ1BJLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2FjcGlfc3RhdHVzIGFjcGlfZmluZF9yb290X3BvaW50ZXIoYWNwaV9zaXplICp0YWJsZV9hZGRyZXNzKQoreworCXU4ICp0YWJsZV9wdHI7CisJdTggKm1lbV9yb3ZlcjsKKwl1MzIgcGh5c2ljYWxfYWRkcmVzczsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0UoYWNwaV9maW5kX3Jvb3RfcG9pbnRlcik7CisKKwkvKiAxYSkgR2V0IHRoZSBsb2NhdGlvbiBvZiB0aGUgRXh0ZW5kZWQgQklPUyBEYXRhIEFyZWEgKEVCREEpICovCisKKwl0YWJsZV9wdHIgPSBhY3BpX29zX21hcF9tZW1vcnkoKGFjcGlfcGh5c2ljYWxfYWRkcmVzcykKKwkJCQkgICAgICAgQUNQSV9FQkRBX1BUUl9MT0NBVElPTiwKKwkJCQkgICAgICAgQUNQSV9FQkRBX1BUUl9MRU5HVEgpOworCWlmICghdGFibGVfcHRyKSB7CisJCUFDUElfRVJST1IoKEFFX0lORk8sCisJCQkgICAgIkNvdWxkIG5vdCBtYXAgbWVtb3J5IGF0ICU4LjhYIGZvciBsZW5ndGggJVgiLAorCQkJICAgIEFDUElfRUJEQV9QVFJfTE9DQVRJT04sIEFDUElfRUJEQV9QVFJfTEVOR1RIKSk7CisKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX01FTU9SWSk7CisJfQorCisJQUNQSV9NT1ZFXzE2X1RPXzMyKCZwaHlzaWNhbF9hZGRyZXNzLCB0YWJsZV9wdHIpOworCisJLyogQ29udmVydCBzZWdtZW50IHBhcnQgdG8gcGh5c2ljYWwgYWRkcmVzcyAqLworCisJcGh5c2ljYWxfYWRkcmVzcyA8PD0gNDsKKwlhY3BpX29zX3VubWFwX21lbW9yeSh0YWJsZV9wdHIsIEFDUElfRUJEQV9QVFJfTEVOR1RIKTsKKworCS8qIEVCREEgcHJlc2VudD8gKi8KKworCWlmIChwaHlzaWNhbF9hZGRyZXNzID4gMHg0MDApIHsKKwkJLyoKKwkJICogMWIpIFNlYXJjaCBFQkRBIHBhcmFncmFwaHMgKEVCREEgaXMgcmVxdWlyZWQgdG8gYmUgYQorCQkgKiAgICAgbWluaW11bSBvZiAxX2sgbGVuZ3RoKQorCQkgKi8KKwkJdGFibGVfcHRyID0gYWNwaV9vc19tYXBfbWVtb3J5KChhY3BpX3BoeXNpY2FsX2FkZHJlc3MpCisJCQkJCSAgICAgICBwaHlzaWNhbF9hZGRyZXNzLAorCQkJCQkgICAgICAgQUNQSV9FQkRBX1dJTkRPV19TSVpFKTsKKwkJaWYgKCF0YWJsZV9wdHIpIHsKKwkJCUFDUElfRVJST1IoKEFFX0lORk8sCisJCQkJICAgICJDb3VsZCBub3QgbWFwIG1lbW9yeSBhdCAlOC44WCBmb3IgbGVuZ3RoICVYIiwKKwkJCQkgICAgcGh5c2ljYWxfYWRkcmVzcywgQUNQSV9FQkRBX1dJTkRPV19TSVpFKSk7CisKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT19NRU1PUlkpOworCQl9CisKKwkJbWVtX3JvdmVyID0KKwkJICAgIGFjcGlfdGJfc2Nhbl9tZW1vcnlfZm9yX3JzZHAodGFibGVfcHRyLAorCQkJCQkJIEFDUElfRUJEQV9XSU5ET1dfU0laRSk7CisJCWFjcGlfb3NfdW5tYXBfbWVtb3J5KHRhYmxlX3B0ciwgQUNQSV9FQkRBX1dJTkRPV19TSVpFKTsKKworCQlpZiAobWVtX3JvdmVyKSB7CisKKwkJCS8qIFJldHVybiB0aGUgcGh5c2ljYWwgYWRkcmVzcyAqLworCisJCQlwaHlzaWNhbF9hZGRyZXNzICs9CisJCQkgICAgKHUzMikgQUNQSV9QVFJfRElGRihtZW1fcm92ZXIsIHRhYmxlX3B0cik7CisKKwkJCSp0YWJsZV9hZGRyZXNzID0gcGh5c2ljYWxfYWRkcmVzczsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CisJCX0KKwl9CisKKwkvKgorCSAqIDIpIFNlYXJjaCB1cHBlciBtZW1vcnk6IDE2LWJ5dGUgYm91bmRhcmllcyBpbiBFMDAwMGgtRkZGRkZoCisJICovCisJdGFibGVfcHRyID0gYWNwaV9vc19tYXBfbWVtb3J5KChhY3BpX3BoeXNpY2FsX2FkZHJlc3MpCisJCQkJICAgICAgIEFDUElfSElfUlNEUF9XSU5ET1dfQkFTRSwKKwkJCQkgICAgICAgQUNQSV9ISV9SU0RQX1dJTkRPV19TSVpFKTsKKworCWlmICghdGFibGVfcHRyKSB7CisJCUFDUElfRVJST1IoKEFFX0lORk8sCisJCQkgICAgIkNvdWxkIG5vdCBtYXAgbWVtb3J5IGF0ICU4LjhYIGZvciBsZW5ndGggJVgiLAorCQkJICAgIEFDUElfSElfUlNEUF9XSU5ET1dfQkFTRSwKKwkJCSAgICBBQ1BJX0hJX1JTRFBfV0lORE9XX1NJWkUpKTsKKworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9fTUVNT1JZKTsKKwl9CisKKwltZW1fcm92ZXIgPQorCSAgICBhY3BpX3RiX3NjYW5fbWVtb3J5X2Zvcl9yc2RwKHRhYmxlX3B0ciwgQUNQSV9ISV9SU0RQX1dJTkRPV19TSVpFKTsKKwlhY3BpX29zX3VubWFwX21lbW9yeSh0YWJsZV9wdHIsIEFDUElfSElfUlNEUF9XSU5ET1dfU0laRSk7CisKKwlpZiAobWVtX3JvdmVyKSB7CisKKwkJLyogUmV0dXJuIHRoZSBwaHlzaWNhbCBhZGRyZXNzICovCisKKwkJcGh5c2ljYWxfYWRkcmVzcyA9ICh1MzIpCisJCSAgICAoQUNQSV9ISV9SU0RQX1dJTkRPV19CQVNFICsKKwkJICAgICBBQ1BJX1BUUl9ESUZGKG1lbV9yb3ZlciwgdGFibGVfcHRyKSk7CisKKwkJKnRhYmxlX2FkZHJlc3MgPSBwaHlzaWNhbF9hZGRyZXNzOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOworCX0KKworCS8qIEEgdmFsaWQgUlNEUCB3YXMgbm90IGZvdW5kICovCisKKwlBQ1BJX0VSUk9SKChBRV9JTkZPLCAiQSB2YWxpZCBSU0RQIHdhcyBub3QgZm91bmQiKSk7CisJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PVF9GT1VORCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfdGJfc2Nhbl9tZW1vcnlfZm9yX3JzZHAKKyAqCisgKiBQQVJBTUVURVJTOiAgc3RhcnRfYWRkcmVzcyAgICAgICAtIFN0YXJ0aW5nIHBvaW50ZXIgZm9yIHNlYXJjaAorICogICAgICAgICAgICAgIExlbmd0aCAgICAgICAgICAgICAgLSBNYXhpbXVtIGxlbmd0aCB0byBzZWFyY2gKKyAqCisgKiBSRVRVUk46ICAgICAgUG9pbnRlciB0byB0aGUgUlNEUCBpZiBmb3VuZCwgb3RoZXJ3aXNlIE5VTEwuCisgKgorICogREVTQ1JJUFRJT046IFNlYXJjaCBhIGJsb2NrIG9mIG1lbW9yeSBmb3IgdGhlIFJTRFAgc2lnbmF0dXJlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB1OCAqYWNwaV90Yl9zY2FuX21lbW9yeV9mb3JfcnNkcCh1OCAqIHN0YXJ0X2FkZHJlc3MsIHUzMiBsZW5ndGgpCit7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCXU4ICptZW1fcm92ZXI7CisJdTggKmVuZF9hZGRyZXNzOworCisJQUNQSV9GVU5DVElPTl9UUkFDRSh0Yl9zY2FuX21lbW9yeV9mb3JfcnNkcCk7CisKKwllbmRfYWRkcmVzcyA9IHN0YXJ0X2FkZHJlc3MgKyBsZW5ndGg7CisKKwkvKiBTZWFyY2ggZnJvbSBnaXZlbiBzdGFydCBhZGRyZXNzIGZvciB0aGUgcmVxdWVzdGVkIGxlbmd0aCAqLworCisJZm9yIChtZW1fcm92ZXIgPSBzdGFydF9hZGRyZXNzOyBtZW1fcm92ZXIgPCBlbmRfYWRkcmVzczsKKwkgICAgIG1lbV9yb3ZlciArPSBBQ1BJX1JTRFBfU0NBTl9TVEVQKSB7CisKKwkJLyogVGhlIFJTRFAgc2lnbmF0dXJlIGFuZCBjaGVja3N1bSBtdXN0IGJvdGggYmUgY29ycmVjdCAqLworCisJCXN0YXR1cyA9CisJCSAgICBhY3BpX3RiX3ZhbGlkYXRlX3JzZHAoQUNQSV9DQVNUX1BUUgorCQkJCQkgIChzdHJ1Y3QgYWNwaV90YWJsZV9yc2RwLCBtZW1fcm92ZXIpKTsKKwkJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKSB7CisKKwkJCS8qIFNpZyBhbmQgY2hlY2tzdW0gdmFsaWQsIHdlIGhhdmUgZm91bmQgYSByZWFsIFJTRFAgKi8KKworCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLAorCQkJCQkgICJSU0RQIGxvY2F0ZWQgYXQgcGh5c2ljYWwgYWRkcmVzcyAlcFxuIiwKKwkJCQkJICBtZW1fcm92ZXIpKTsKKwkJCXJldHVybl9QVFIobWVtX3JvdmVyKTsKKwkJfQorCisJCS8qIE5vIHNpZyBtYXRjaCBvciBiYWQgY2hlY2tzdW0sIGtlZXAgc2VhcmNoaW5nICovCisJfQorCisJLyogU2VhcmNoZWQgZW50aXJlIGJsb2NrLCBubyBSU0RQIHdhcyBmb3VuZCAqLworCisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLAorCQkJICAiU2VhcmNoZWQgZW50aXJlIGJsb2NrIGZyb20gJXAsIHZhbGlkIFJTRFAgd2FzIG5vdCBmb3VuZFxuIiwKKwkJCSAgc3RhcnRfYWRkcmVzcykpOworCXJldHVybl9QVFIoTlVMTCk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL3V0YWxsb2MuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvdXRhbGxvYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1ODBmNmIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL3V0YWxsb2MuYwpAQCAtMCwwICsxLDM4MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIE1vZHVsZSBOYW1lOiB1dGFsbG9jIC0gbG9jYWwgbWVtb3J5IGFsbG9jYXRpb24gcm91dGluZXMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA4LCBJbnRlbCBDb3JwLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAorICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgYXQgbWluaW11bSBhIGRpc2NsYWltZXIKKyAqICAgIHN1YnN0YW50aWFsbHkgc2ltaWxhciB0byB0aGUgIk5PIFdBUlJBTlRZIiBkaXNjbGFpbWVyIGJlbG93CisgKiAgICAoIkRpc2NsYWltZXIiKSBhbmQgYW55IHJlZGlzdHJpYnV0aW9uIG11c3QgYmUgY29uZGl0aW9uZWQgdXBvbgorICogICAgaW5jbHVkaW5nIGEgc3Vic3RhbnRpYWxseSBzaW1pbGFyIERpc2NsYWltZXIgcmVxdWlyZW1lbnQgZm9yIGZ1cnRoZXIKKyAqICAgIGJpbmFyeSByZWRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcworICogICAgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBOTyBXQVJSQU5UWQorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcKKyAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgorICovCisKKyNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KKyNpbmNsdWRlICJhY2NvbW1vbi5oIgorI2luY2x1ZGUgImFjZGVidWcuaCIKKworI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfVVRJTElUSUVTCitBQ1BJX01PRFVMRV9OQU1FKCJ1dGFsbG9jIikKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV91dF9jcmVhdGVfY2FjaGVzCisgKgorICogUEFSQU1FVEVSUzogIE5vbmUKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IENyZWF0ZSBhbGwgbG9jYWwgY2FjaGVzCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2FjcGlfc3RhdHVzIGFjcGlfdXRfY3JlYXRlX2NhY2hlcyh2b2lkKQoreworCWFjcGlfc3RhdHVzIHN0YXR1czsKKworCS8qIE9iamVjdCBDYWNoZXMsIGZvciBmcmVxdWVudGx5IHVzZWQgb2JqZWN0cyAqLworCisJc3RhdHVzID0KKwkgICAgYWNwaV9vc19jcmVhdGVfY2FjaGUoIkFjcGktTmFtZXNwYWNlIiwKKwkJCQkgc2l6ZW9mKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlKSwKKwkJCQkgQUNQSV9NQVhfTkFNRVNQQUNFX0NBQ0hFX0RFUFRILAorCQkJCSAmYWNwaV9nYmxfbmFtZXNwYWNlX2NhY2hlKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuIChzdGF0dXMpOworCX0KKworCXN0YXR1cyA9CisJICAgIGFjcGlfb3NfY3JlYXRlX2NhY2hlKCJBY3BpLVN0YXRlIiwgc2l6ZW9mKHVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSksCisJCQkJIEFDUElfTUFYX1NUQVRFX0NBQ0hFX0RFUFRILAorCQkJCSAmYWNwaV9nYmxfc3RhdGVfY2FjaGUpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm4gKHN0YXR1cyk7CisJfQorCisJc3RhdHVzID0KKwkgICAgYWNwaV9vc19jcmVhdGVfY2FjaGUoIkFjcGktUGFyc2UiLAorCQkJCSBzaXplb2Yoc3RydWN0IGFjcGlfcGFyc2Vfb2JqX2NvbW1vbiksCisJCQkJIEFDUElfTUFYX1BBUlNFX0NBQ0hFX0RFUFRILAorCQkJCSAmYWNwaV9nYmxfcHNfbm9kZV9jYWNoZSk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXJldHVybiAoc3RhdHVzKTsKKwl9CisKKwlzdGF0dXMgPQorCSAgICBhY3BpX29zX2NyZWF0ZV9jYWNoZSgiQWNwaS1QYXJzZUV4dCIsCisJCQkJIHNpemVvZihzdHJ1Y3QgYWNwaV9wYXJzZV9vYmpfbmFtZWQpLAorCQkJCSBBQ1BJX01BWF9FWFRQQVJTRV9DQUNIRV9ERVBUSCwKKwkJCQkgJmFjcGlfZ2JsX3BzX25vZGVfZXh0X2NhY2hlKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuIChzdGF0dXMpOworCX0KKworCXN0YXR1cyA9CisJICAgIGFjcGlfb3NfY3JlYXRlX2NhY2hlKCJBY3BpLU9wZXJhbmQiLAorCQkJCSBzaXplb2YodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCksCisJCQkJIEFDUElfTUFYX09CSkVDVF9DQUNIRV9ERVBUSCwKKwkJCQkgJmFjcGlfZ2JsX29wZXJhbmRfY2FjaGUpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm4gKHN0YXR1cyk7CisJfQorI2lmZGVmIEFDUElfREJHX1RSQUNLX0FMTE9DQVRJT05TCisKKwkvKiBNZW1vcnkgYWxsb2NhdGlvbiBsaXN0cyAqLworCisJc3RhdHVzID0gYWNwaV91dF9jcmVhdGVfbGlzdCgiQWNwaS1HbG9iYWwiLCAwLCAmYWNwaV9nYmxfZ2xvYmFsX2xpc3QpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm4gKHN0YXR1cyk7CisJfQorCisJc3RhdHVzID0KKwkgICAgYWNwaV91dF9jcmVhdGVfbGlzdCgiQWNwaS1OYW1lc3BhY2UiLAorCQkJCXNpemVvZihzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSksCisJCQkJJmFjcGlfZ2JsX25zX25vZGVfbGlzdCk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXJldHVybiAoc3RhdHVzKTsKKwl9CisjZW5kaWYKKworCXJldHVybiAoQUVfT0spOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X2RlbGV0ZV9jYWNoZXMKKyAqCisgKiBQQVJBTUVURVJTOiAgTm9uZQorICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogUHVyZ2UgYW5kIGRlbGV0ZSBhbGwgbG9jYWwgY2FjaGVzCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworYWNwaV9zdGF0dXMgYWNwaV91dF9kZWxldGVfY2FjaGVzKHZvaWQpCit7CisjaWZkZWYgQUNQSV9EQkdfVFJBQ0tfQUxMT0NBVElPTlMKKwljaGFyIGJ1ZmZlcls3XTsKKworCWlmIChhY3BpX2dibF9kaXNwbGF5X2ZpbmFsX21lbV9zdGF0cykgeworCQlBQ1BJX1NUUkNQWShidWZmZXIsICJNRU1PUlkiKTsKKwkJKHZvaWQpYWNwaV9kYl9kaXNwbGF5X3N0YXRpc3RpY3MoYnVmZmVyKTsKKwl9CisjZW5kaWYKKworCSh2b2lkKWFjcGlfb3NfZGVsZXRlX2NhY2hlKGFjcGlfZ2JsX25hbWVzcGFjZV9jYWNoZSk7CisJYWNwaV9nYmxfbmFtZXNwYWNlX2NhY2hlID0gTlVMTDsKKworCSh2b2lkKWFjcGlfb3NfZGVsZXRlX2NhY2hlKGFjcGlfZ2JsX3N0YXRlX2NhY2hlKTsKKwlhY3BpX2dibF9zdGF0ZV9jYWNoZSA9IE5VTEw7CisKKwkodm9pZClhY3BpX29zX2RlbGV0ZV9jYWNoZShhY3BpX2dibF9vcGVyYW5kX2NhY2hlKTsKKwlhY3BpX2dibF9vcGVyYW5kX2NhY2hlID0gTlVMTDsKKworCSh2b2lkKWFjcGlfb3NfZGVsZXRlX2NhY2hlKGFjcGlfZ2JsX3BzX25vZGVfY2FjaGUpOworCWFjcGlfZ2JsX3BzX25vZGVfY2FjaGUgPSBOVUxMOworCisJKHZvaWQpYWNwaV9vc19kZWxldGVfY2FjaGUoYWNwaV9nYmxfcHNfbm9kZV9leHRfY2FjaGUpOworCWFjcGlfZ2JsX3BzX25vZGVfZXh0X2NhY2hlID0gTlVMTDsKKworI2lmZGVmIEFDUElfREJHX1RSQUNLX0FMTE9DQVRJT05TCisKKwkvKiBEZWJ1ZyBvbmx5IC0gZGlzcGxheSBsZWZ0b3ZlciBtZW1vcnkgYWxsb2NhdGlvbiwgaWYgYW55ICovCisKKwlhY3BpX3V0X2R1bXBfYWxsb2NhdGlvbnMoQUNQSV9VSU5UMzJfTUFYLCBOVUxMKTsKKworCS8qIEZyZWUgbWVtb3J5IGxpc3RzICovCisKKwlBQ1BJX0ZSRUUoYWNwaV9nYmxfZ2xvYmFsX2xpc3QpOworCWFjcGlfZ2JsX2dsb2JhbF9saXN0ID0gTlVMTDsKKworCUFDUElfRlJFRShhY3BpX2dibF9uc19ub2RlX2xpc3QpOworCWFjcGlfZ2JsX25zX25vZGVfbGlzdCA9IE5VTEw7CisjZW5kaWYKKworCXJldHVybiAoQUVfT0spOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X3ZhbGlkYXRlX2J1ZmZlcgorICoKKyAqIFBBUkFNRVRFUlM6ICBCdWZmZXIgICAgICAgICAgICAgIC0gQnVmZmVyIGRlc2NyaXB0b3IgdG8gYmUgdmFsaWRhdGVkCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBQZXJmb3JtIHBhcmFtZXRlciB2YWxpZGF0aW9uIGNoZWNrcyBvbiBhbiBzdHJ1Y3QgYWNwaV9idWZmZXIKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCithY3BpX3N0YXR1cyBhY3BpX3V0X3ZhbGlkYXRlX2J1ZmZlcihzdHJ1Y3QgYWNwaV9idWZmZXIgKiBidWZmZXIpCit7CisKKwkvKiBPYnZpb3VzbHksIHRoZSBzdHJ1Y3R1cmUgcG9pbnRlciBtdXN0IGJlIHZhbGlkICovCisKKwlpZiAoIWJ1ZmZlcikgeworCQlyZXR1cm4gKEFFX0JBRF9QQVJBTUVURVIpOworCX0KKworCS8qIFNwZWNpYWwgc2VtYW50aWNzIGZvciB0aGUgbGVuZ3RoICovCisKKwlpZiAoKGJ1ZmZlci0+bGVuZ3RoID09IEFDUElfTk9fQlVGRkVSKSB8fAorCSAgICAoYnVmZmVyLT5sZW5ndGggPT0gQUNQSV9BTExPQ0FURV9CVUZGRVIpIHx8CisJICAgIChidWZmZXItPmxlbmd0aCA9PSBBQ1BJX0FMTE9DQVRFX0xPQ0FMX0JVRkZFUikpIHsKKwkJcmV0dXJuIChBRV9PSyk7CisJfQorCisJLyogTGVuZ3RoIGlzIHZhbGlkLCB0aGUgYnVmZmVyIHBvaW50ZXIgbXVzdCBiZSBhbHNvICovCisKKwlpZiAoIWJ1ZmZlci0+cG9pbnRlcikgeworCQlyZXR1cm4gKEFFX0JBRF9QQVJBTUVURVIpOworCX0KKworCXJldHVybiAoQUVfT0spOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X2luaXRpYWxpemVfYnVmZmVyCisgKgorICogUEFSQU1FVEVSUzogIEJ1ZmZlciAgICAgICAgICAgICAgLSBCdWZmZXIgdG8gYmUgdmFsaWRhdGVkCisgKiAgICAgICAgICAgICAgcmVxdWlyZWRfbGVuZ3RoICAgICAtIExlbmd0aCBuZWVkZWQKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IFZhbGlkYXRlIHRoYXQgdGhlIGJ1ZmZlciBpcyBvZiB0aGUgcmVxdWlyZWQgbGVuZ3RoIG9yCisgKiAgICAgICAgICAgICAgYWxsb2NhdGUgYSBuZXcgYnVmZmVyLiBSZXR1cm5lZCBidWZmZXIgaXMgYWx3YXlzIHplcm9lZC4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCithY3BpX3N0YXR1cworYWNwaV91dF9pbml0aWFsaXplX2J1ZmZlcihzdHJ1Y3QgYWNwaV9idWZmZXIgKiBidWZmZXIsCisJCQkgIGFjcGlfc2l6ZSByZXF1aXJlZF9sZW5ndGgpCit7CisJYWNwaV9zaXplIGlucHV0X2J1ZmZlcl9sZW5ndGg7CisKKwkvKiBQYXJhbWV0ZXIgdmFsaWRhdGlvbiAqLworCisJaWYgKCFidWZmZXIgfHwgIXJlcXVpcmVkX2xlbmd0aCkgeworCQlyZXR1cm4gKEFFX0JBRF9QQVJBTUVURVIpOworCX0KKworCS8qCisJICogQnVmZmVyLT5MZW5ndGggaXMgdXNlZCBhcyBib3RoIGFuIGlucHV0IGFuZCBvdXRwdXQgcGFyYW1ldGVyLiBHZXQgdGhlCisJICogaW5wdXQgYWN0dWFsIGxlbmd0aCBhbmQgc2V0IHRoZSBvdXRwdXQgcmVxdWlyZWQgYnVmZmVyIGxlbmd0aC4KKwkgKi8KKwlpbnB1dF9idWZmZXJfbGVuZ3RoID0gYnVmZmVyLT5sZW5ndGg7CisJYnVmZmVyLT5sZW5ndGggPSByZXF1aXJlZF9sZW5ndGg7CisKKwkvKgorCSAqIFRoZSBpbnB1dCBidWZmZXIgbGVuZ3RoIGNvbnRhaW5zIHRoZSBhY3R1YWwgYnVmZmVyIGxlbmd0aCwgb3IgdGhlIHR5cGUKKwkgKiBvZiBidWZmZXIgdG8gYmUgYWxsb2NhdGVkIGJ5IHRoaXMgcm91dGluZS4KKwkgKi8KKwlzd2l0Y2ggKGlucHV0X2J1ZmZlcl9sZW5ndGgpIHsKKwljYXNlIEFDUElfTk9fQlVGRkVSOgorCisJCS8qIFJldHVybiB0aGUgZXhjZXB0aW9uIChhbmQgdGhlIHJlcXVpcmVkIGJ1ZmZlciBsZW5ndGgpICovCisKKwkJcmV0dXJuIChBRV9CVUZGRVJfT1ZFUkZMT1cpOworCisJY2FzZSBBQ1BJX0FMTE9DQVRFX0JVRkZFUjoKKworCQkvKiBBbGxvY2F0ZSBhIG5ldyBidWZmZXIgKi8KKworCQlidWZmZXItPnBvaW50ZXIgPSBhY3BpX29zX2FsbG9jYXRlKHJlcXVpcmVkX2xlbmd0aCk7CisJCWJyZWFrOworCisJY2FzZSBBQ1BJX0FMTE9DQVRFX0xPQ0FMX0JVRkZFUjoKKworCQkvKiBBbGxvY2F0ZSBhIG5ldyBidWZmZXIgd2l0aCBsb2NhbCBpbnRlcmZhY2UgdG8gYWxsb3cgdHJhY2tpbmcgKi8KKworCQlidWZmZXItPnBvaW50ZXIgPSBBQ1BJX0FMTE9DQVRFKHJlcXVpcmVkX2xlbmd0aCk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKworCQkvKiBFeGlzdGluZyBidWZmZXI6IFZhbGlkYXRlIHRoZSBzaXplIG9mIHRoZSBidWZmZXIgKi8KKworCQlpZiAoaW5wdXRfYnVmZmVyX2xlbmd0aCA8IHJlcXVpcmVkX2xlbmd0aCkgeworCQkJcmV0dXJuIChBRV9CVUZGRVJfT1ZFUkZMT1cpOworCQl9CisJCWJyZWFrOworCX0KKworCS8qIFZhbGlkYXRlIGFsbG9jYXRpb24gZnJvbSBhYm92ZSBvciBpbnB1dCBidWZmZXIgcG9pbnRlciAqLworCisJaWYgKCFidWZmZXItPnBvaW50ZXIpIHsKKwkJcmV0dXJuIChBRV9OT19NRU1PUlkpOworCX0KKworCS8qIEhhdmUgYSB2YWxpZCBidWZmZXIsIGNsZWFyIGl0ICovCisKKwlBQ1BJX01FTVNFVChidWZmZXItPnBvaW50ZXIsIDAsIHJlcXVpcmVkX2xlbmd0aCk7CisJcmV0dXJuIChBRV9PSyk7Cit9CisKKyNpZmRlZiBOT1RfVVNFRF9CWV9MSU5VWAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV91dF9hbGxvY2F0ZQorICoKKyAqIFBBUkFNRVRFUlM6ICBTaXplICAgICAgICAgICAgICAgIC0gU2l6ZSBvZiB0aGUgYWxsb2NhdGlvbgorICogICAgICAgICAgICAgIENvbXBvbmVudCAgICAgICAgICAgLSBDb21wb25lbnQgdHlwZSBvZiBjYWxsZXIKKyAqICAgICAgICAgICAgICBNb2R1bGUgICAgICAgICAgICAgIC0gU291cmNlIGZpbGUgbmFtZSBvZiBjYWxsZXIKKyAqICAgICAgICAgICAgICBMaW5lICAgICAgICAgICAgICAgIC0gTGluZSBudW1iZXIgb2YgY2FsbGVyCisgKgorICogUkVUVVJOOiAgICAgIEFkZHJlc3Mgb2YgdGhlIGFsbG9jYXRlZCBtZW1vcnkgb24gc3VjY2VzcywgTlVMTCBvbiBmYWlsdXJlLgorICoKKyAqIERFU0NSSVBUSU9OOiBTdWJzeXN0ZW0gZXF1aXZhbGVudCBvZiBtYWxsb2MuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCAqYWNwaV91dF9hbGxvY2F0ZShhY3BpX3NpemUgc2l6ZSwKKwkJICAgICAgIHUzMiBjb21wb25lbnQsIGNvbnN0IGNoYXIgKm1vZHVsZSwgdTMyIGxpbmUpCit7CisJdm9pZCAqYWxsb2NhdGlvbjsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0VfVTMyKHV0X2FsbG9jYXRlLCBzaXplKTsKKworCS8qIENoZWNrIGZvciBhbiBpbmFkdmVydGVudCBzaXplIG9mIHplcm8gYnl0ZXMgKi8KKworCWlmICghc2l6ZSkgeworCQlBQ1BJX1dBUk5JTkcoKG1vZHVsZSwgbGluZSwKKwkJCSAgICAgICJBdHRlbXB0IHRvIGFsbG9jYXRlIHplcm8gYnl0ZXMsIGFsbG9jYXRpbmcgMSBieXRlIikpOworCQlzaXplID0gMTsKKwl9CisKKwlhbGxvY2F0aW9uID0gYWNwaV9vc19hbGxvY2F0ZShzaXplKTsKKwlpZiAoIWFsbG9jYXRpb24pIHsKKworCQkvKiBSZXBvcnQgYWxsb2NhdGlvbiBlcnJvciAqLworCisJCUFDUElfV0FSTklORygobW9kdWxlLCBsaW5lLAorCQkJICAgICAgIkNvdWxkIG5vdCBhbGxvY2F0ZSBzaXplICVYIiwgKHUzMikgc2l6ZSkpOworCisJCXJldHVybl9QVFIoTlVMTCk7CisJfQorCisJcmV0dXJuX1BUUihhbGxvY2F0aW9uKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV91dF9hbGxvY2F0ZV96ZXJvZWQKKyAqCisgKiBQQVJBTUVURVJTOiAgU2l6ZSAgICAgICAgICAgICAgICAtIFNpemUgb2YgdGhlIGFsbG9jYXRpb24KKyAqICAgICAgICAgICAgICBDb21wb25lbnQgICAgICAgICAgIC0gQ29tcG9uZW50IHR5cGUgb2YgY2FsbGVyCisgKiAgICAgICAgICAgICAgTW9kdWxlICAgICAgICAgICAgICAtIFNvdXJjZSBmaWxlIG5hbWUgb2YgY2FsbGVyCisgKiAgICAgICAgICAgICAgTGluZSAgICAgICAgICAgICAgICAtIExpbmUgbnVtYmVyIG9mIGNhbGxlcgorICoKKyAqIFJFVFVSTjogICAgICBBZGRyZXNzIG9mIHRoZSBhbGxvY2F0ZWQgbWVtb3J5IG9uIHN1Y2Nlc3MsIE5VTEwgb24gZmFpbHVyZS4KKyAqCisgKiBERVNDUklQVElPTjogU3Vic3lzdGVtIGVxdWl2YWxlbnQgb2YgY2FsbG9jLiBBbGxvY2F0ZSBhbmQgemVybyBtZW1vcnkuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCAqYWNwaV91dF9hbGxvY2F0ZV96ZXJvZWQoYWNwaV9zaXplIHNpemUsCisJCQkgICAgICB1MzIgY29tcG9uZW50LCBjb25zdCBjaGFyICptb2R1bGUsIHUzMiBsaW5lKQoreworCXZvaWQgKmFsbG9jYXRpb247CisKKwlBQ1BJX0ZVTkNUSU9OX0VOVFJZKCk7CisKKwlhbGxvY2F0aW9uID0gYWNwaV91dF9hbGxvY2F0ZShzaXplLCBjb21wb25lbnQsIG1vZHVsZSwgbGluZSk7CisJaWYgKGFsbG9jYXRpb24pIHsKKworCQkvKiBDbGVhciB0aGUgbWVtb3J5IGJsb2NrICovCisKKwkJQUNQSV9NRU1TRVQoYWxsb2NhdGlvbiwgMCwgc2l6ZSk7CisJfQorCisJcmV0dXJuIChhbGxvY2F0aW9uKTsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS91dGNvcHkuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvdXRjb3B5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjBkY2ZkMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvdXRjb3B5LmMKQEAgLTAsMCArMSw5NzAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBNb2R1bGUgTmFtZTogdXRjb3B5IC0gSW50ZXJuYWwgdG8gZXh0ZXJuYWwgb2JqZWN0IHRyYW5zbGF0aW9uIHV0aWxpdGllcworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDgsIEludGVsIENvcnAuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCisgKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSBhdCBtaW5pbXVtIGEgZGlzY2xhaW1lcgorICogICAgc3Vic3RhbnRpYWxseSBzaW1pbGFyIHRvIHRoZSAiTk8gV0FSUkFOVFkiIGRpc2NsYWltZXIgYmVsb3cKKyAqICAgICgiRGlzY2xhaW1lciIpIGFuZCBhbnkgcmVkaXN0cmlidXRpb24gbXVzdCBiZSBjb25kaXRpb25lZCB1cG9uCisgKiAgICBpbmNsdWRpbmcgYSBzdWJzdGFudGlhbGx5IHNpbWlsYXIgRGlzY2xhaW1lciByZXF1aXJlbWVudCBmb3IgZnVydGhlcgorICogICAgYmluYXJ5IHJlZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzCisgKiAgICBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIE5PIFdBUlJBTlRZCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORworICogSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCisgKi8KKworI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgorI2luY2x1ZGUgImFjY29tbW9uLmgiCisjaW5jbHVkZSAiYWNuYW1lc3AuaCIKKworCisjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9VVElMSVRJRVMKK0FDUElfTU9EVUxFX05BTUUoInV0Y29weSIpCisKKy8qIExvY2FsIHByb3RvdHlwZXMgKi8KK3N0YXRpYyBhY3BpX3N0YXR1cworYWNwaV91dF9jb3B5X2lzaW1wbGVfdG9fZXNpbXBsZSh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICppbnRlcm5hbF9vYmplY3QsCisJCQkJdW5pb24gYWNwaV9vYmplY3QgKmV4dGVybmFsX29iamVjdCwKKwkJCQl1OCAqIGRhdGFfc3BhY2UsIGFjcGlfc2l6ZSAqIGJ1ZmZlcl9zcGFjZV91c2VkKTsKKworc3RhdGljIGFjcGlfc3RhdHVzCithY3BpX3V0X2NvcHlfaWVsZW1lbnRfdG9faWVsZW1lbnQodTggb2JqZWN0X3R5cGUsCisJCQkJICB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpzb3VyY2Vfb2JqZWN0LAorCQkJCSAgdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICpzdGF0ZSwKKwkJCQkgIHZvaWQgKmNvbnRleHQpOworCitzdGF0aWMgYWNwaV9zdGF0dXMKK2FjcGlfdXRfY29weV9pcGFja2FnZV90b19lcGFja2FnZSh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICppbnRlcm5hbF9vYmplY3QsCisJCQkJICB1OCAqIGJ1ZmZlciwgYWNwaV9zaXplICogc3BhY2VfdXNlZCk7CisKK3N0YXRpYyBhY3BpX3N0YXR1cworYWNwaV91dF9jb3B5X2VzaW1wbGVfdG9faXNpbXBsZSh1bmlvbiBhY3BpX29iamVjdCAqdXNlcl9vYmosCisJCQkJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKnJldHVybl9vYmopOworCitzdGF0aWMgYWNwaV9zdGF0dXMKK2FjcGlfdXRfY29weV9lcGFja2FnZV90b19pcGFja2FnZSh1bmlvbiBhY3BpX29iamVjdCAqZXh0ZXJuYWxfb2JqZWN0LAorCQkJCSAgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKmludGVybmFsX29iamVjdCk7CisKK3N0YXRpYyBhY3BpX3N0YXR1cworYWNwaV91dF9jb3B5X3NpbXBsZV9vYmplY3QodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqc291cmNlX2Rlc2MsCisJCQkgICB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpkZXN0X2Rlc2MpOworCitzdGF0aWMgYWNwaV9zdGF0dXMKK2FjcGlfdXRfY29weV9pZWxlbWVudF90b19lZWxlbWVudCh1OCBvYmplY3RfdHlwZSwKKwkJCQkgIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnNvdXJjZV9vYmplY3QsCisJCQkJICB1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgKnN0YXRlLAorCQkJCSAgdm9pZCAqY29udGV4dCk7CisKK3N0YXRpYyBhY3BpX3N0YXR1cworYWNwaV91dF9jb3B5X2lwYWNrYWdlX3RvX2lwYWNrYWdlKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnNvdXJjZV9vYmosCisJCQkJICB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpkZXN0X29iaiwKKwkJCQkgIHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X2NvcHlfaXNpbXBsZV90b19lc2ltcGxlCisgKgorICogUEFSQU1FVEVSUzogIGludGVybmFsX29iamVjdCAgICAgLSBTb3VyY2Ugb2JqZWN0IHRvIGJlIGNvcGllZAorICogICAgICAgICAgICAgIGV4dGVybmFsX29iamVjdCAgICAgLSBXaGVyZSB0byByZXR1cm4gdGhlIGNvcGllZCBvYmplY3QKKyAqICAgICAgICAgICAgICBkYXRhX3NwYWNlICAgICAgICAgIC0gV2hlcmUgb2JqZWN0IGRhdGEgaXMgcmV0dXJuZWQgKHN1Y2ggYXMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyIGFuZCBzdHJpbmcgZGF0YSkKKyAqICAgICAgICAgICAgICBidWZmZXJfc3BhY2VfdXNlZCAgIC0gTGVuZ3RoIG9mIGRhdGFfc3BhY2UgdGhhdCB3YXMgdXNlZAorICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gY29weSBhIHNpbXBsZSBpbnRlcm5hbCBvYmplY3QgdG8KKyAqICAgICAgICAgICAgICBhbiBleHRlcm5hbCBvYmplY3QuCisgKgorICogICAgICAgICAgICAgIFRoZSBkYXRhX3NwYWNlIGJ1ZmZlciBpcyBhc3N1bWVkIHRvIGhhdmUgc3VmZmljaWVudCBzcGFjZSBmb3IKKyAqICAgICAgICAgICAgICB0aGUgb2JqZWN0LgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBhY3BpX3N0YXR1cworYWNwaV91dF9jb3B5X2lzaW1wbGVfdG9fZXNpbXBsZSh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICppbnRlcm5hbF9vYmplY3QsCisJCQkJdW5pb24gYWNwaV9vYmplY3QgKmV4dGVybmFsX29iamVjdCwKKwkJCQl1OCAqIGRhdGFfc3BhY2UsIGFjcGlfc2l6ZSAqIGJ1ZmZlcl9zcGFjZV91c2VkKQoreworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOworCisJQUNQSV9GVU5DVElPTl9UUkFDRSh1dF9jb3B5X2lzaW1wbGVfdG9fZXNpbXBsZSk7CisKKwkqYnVmZmVyX3NwYWNlX3VzZWQgPSAwOworCisJLyoKKwkgKiBDaGVjayBmb3IgTlVMTCBvYmplY3QgY2FzZSAoY291bGQgYmUgYW4gdW5pbml0aWFsaXplZAorCSAqIHBhY2thZ2UgZWxlbWVudCkKKwkgKi8KKwlpZiAoIWludGVybmFsX29iamVjdCkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOworCX0KKworCS8qIEFsd2F5cyBjbGVhciB0aGUgZXh0ZXJuYWwgb2JqZWN0ICovCisKKwlBQ1BJX01FTVNFVChleHRlcm5hbF9vYmplY3QsIDAsIHNpemVvZih1bmlvbiBhY3BpX29iamVjdCkpOworCisJLyoKKwkgKiBJbiBnZW5lcmFsLCB0aGUgZXh0ZXJuYWwgb2JqZWN0IHdpbGwgYmUgdGhlIHNhbWUgdHlwZSBhcworCSAqIHRoZSBpbnRlcm5hbCBvYmplY3QKKwkgKi8KKwlleHRlcm5hbF9vYmplY3QtPnR5cGUgPSBBQ1BJX0dFVF9PQkpFQ1RfVFlQRShpbnRlcm5hbF9vYmplY3QpOworCisJLyogSG93ZXZlciwgb25seSBhIGxpbWl0ZWQgbnVtYmVyIG9mIGV4dGVybmFsIHR5cGVzIGFyZSBzdXBwb3J0ZWQgKi8KKworCXN3aXRjaCAoQUNQSV9HRVRfT0JKRUNUX1RZUEUoaW50ZXJuYWxfb2JqZWN0KSkgeworCWNhc2UgQUNQSV9UWVBFX1NUUklORzoKKworCQlleHRlcm5hbF9vYmplY3QtPnN0cmluZy5wb2ludGVyID0gKGNoYXIgKilkYXRhX3NwYWNlOworCQlleHRlcm5hbF9vYmplY3QtPnN0cmluZy5sZW5ndGggPSBpbnRlcm5hbF9vYmplY3QtPnN0cmluZy5sZW5ndGg7CisJCSpidWZmZXJfc3BhY2VfdXNlZCA9IEFDUElfUk9VTkRfVVBfVE9fTkFUSVZFX1dPUkQoKGFjcGlfc2l6ZSkKKwkJCQkJCQkJICBpbnRlcm5hbF9vYmplY3QtPgorCQkJCQkJCQkgIHN0cmluZy4KKwkJCQkJCQkJICBsZW5ndGggKyAxKTsKKworCQlBQ1BJX01FTUNQWSgodm9pZCAqKWRhdGFfc3BhY2UsCisJCQkgICAgKHZvaWQgKilpbnRlcm5hbF9vYmplY3QtPnN0cmluZy5wb2ludGVyLAorCQkJICAgIChhY3BpX3NpemUpIGludGVybmFsX29iamVjdC0+c3RyaW5nLmxlbmd0aCArIDEpOworCQlicmVhazsKKworCWNhc2UgQUNQSV9UWVBFX0JVRkZFUjoKKworCQlleHRlcm5hbF9vYmplY3QtPmJ1ZmZlci5wb2ludGVyID0gZGF0YV9zcGFjZTsKKwkJZXh0ZXJuYWxfb2JqZWN0LT5idWZmZXIubGVuZ3RoID0gaW50ZXJuYWxfb2JqZWN0LT5idWZmZXIubGVuZ3RoOworCQkqYnVmZmVyX3NwYWNlX3VzZWQgPQorCQkgICAgQUNQSV9ST1VORF9VUF9UT19OQVRJVkVfV09SRChpbnRlcm5hbF9vYmplY3QtPnN0cmluZy4KKwkJCQkJCSBsZW5ndGgpOworCisJCUFDUElfTUVNQ1BZKCh2b2lkICopZGF0YV9zcGFjZSwKKwkJCSAgICAodm9pZCAqKWludGVybmFsX29iamVjdC0+YnVmZmVyLnBvaW50ZXIsCisJCQkgICAgaW50ZXJuYWxfb2JqZWN0LT5idWZmZXIubGVuZ3RoKTsKKwkJYnJlYWs7CisKKwljYXNlIEFDUElfVFlQRV9JTlRFR0VSOgorCisJCWV4dGVybmFsX29iamVjdC0+aW50ZWdlci52YWx1ZSA9IGludGVybmFsX29iamVjdC0+aW50ZWdlci52YWx1ZTsKKwkJYnJlYWs7CisKKwljYXNlIEFDUElfVFlQRV9MT0NBTF9SRUZFUkVOQ0U6CisKKwkJLyogVGhpcyBpcyBhbiBvYmplY3QgcmVmZXJlbmNlLiAqLworCisJCXN3aXRjaCAoaW50ZXJuYWxfb2JqZWN0LT5yZWZlcmVuY2UuY2xhc3MpIHsKKwkJY2FzZSBBQ1BJX1JFRkNMQVNTX05BTUU6CisKKwkJCS8qCisJCQkgKiBGb3IgbmFtZXBhdGgsIHJldHVybiB0aGUgb2JqZWN0IGhhbmRsZSAoInJlZmVyZW5jZSIpCisJCQkgKiBXZSBhcmUgcmVmZXJyaW5nIHRvIHRoZSBuYW1lc3BhY2Ugbm9kZQorCQkJICovCisJCQlleHRlcm5hbF9vYmplY3QtPnJlZmVyZW5jZS5oYW5kbGUgPQorCQkJICAgIGludGVybmFsX29iamVjdC0+cmVmZXJlbmNlLm5vZGU7CisJCQlleHRlcm5hbF9vYmplY3QtPnJlZmVyZW5jZS5hY3R1YWxfdHlwZSA9CisJCQkgICAgYWNwaV9uc19nZXRfdHlwZShpbnRlcm5hbF9vYmplY3QtPnJlZmVyZW5jZS5ub2RlKTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisKKwkJCS8qIEFsbCBvdGhlciByZWZlcmVuY2UgdHlwZXMgYXJlIHVuc3VwcG9ydGVkICovCisKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9UWVBFKTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgQUNQSV9UWVBFX1BST0NFU1NPUjoKKworCQlleHRlcm5hbF9vYmplY3QtPnByb2Nlc3Nvci5wcm9jX2lkID0KKwkJICAgIGludGVybmFsX29iamVjdC0+cHJvY2Vzc29yLnByb2NfaWQ7CisJCWV4dGVybmFsX29iamVjdC0+cHJvY2Vzc29yLnBibGtfYWRkcmVzcyA9CisJCSAgICBpbnRlcm5hbF9vYmplY3QtPnByb2Nlc3Nvci5hZGRyZXNzOworCQlleHRlcm5hbF9vYmplY3QtPnByb2Nlc3Nvci5wYmxrX2xlbmd0aCA9CisJCSAgICBpbnRlcm5hbF9vYmplY3QtPnByb2Nlc3Nvci5sZW5ndGg7CisJCWJyZWFrOworCisJY2FzZSBBQ1BJX1RZUEVfUE9XRVI6CisKKwkJZXh0ZXJuYWxfb2JqZWN0LT5wb3dlcl9yZXNvdXJjZS5zeXN0ZW1fbGV2ZWwgPQorCQkgICAgaW50ZXJuYWxfb2JqZWN0LT5wb3dlcl9yZXNvdXJjZS5zeXN0ZW1fbGV2ZWw7CisKKwkJZXh0ZXJuYWxfb2JqZWN0LT5wb3dlcl9yZXNvdXJjZS5yZXNvdXJjZV9vcmRlciA9CisJCSAgICBpbnRlcm5hbF9vYmplY3QtPnBvd2VyX3Jlc291cmNlLnJlc291cmNlX29yZGVyOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCS8qCisJCSAqIFRoZXJlIGlzIG5vIGNvcnJlc3BvbmRpbmcgZXh0ZXJuYWwgb2JqZWN0IHR5cGUKKwkJICovCisJCUFDUElfRVJST1IoKEFFX0lORk8sCisJCQkgICAgIlVuc3VwcG9ydGVkIG9iamVjdCB0eXBlLCBjYW5ub3QgY29udmVydCB0byBleHRlcm5hbCBvYmplY3Q6ICVzIiwKKwkJCSAgICBhY3BpX3V0X2dldF90eXBlX25hbWUoQUNQSV9HRVRfT0JKRUNUX1RZUEUKKwkJCQkJCSAgKGludGVybmFsX29iamVjdCkpKSk7CisKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX1NVUFBPUlQpOworCX0KKworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X2NvcHlfaWVsZW1lbnRfdG9fZWVsZW1lbnQKKyAqCisgKiBQQVJBTUVURVJTOiAgYWNwaV9wa2dfY2FsbGJhY2sKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IENvcHkgb25lIHBhY2thZ2UgZWxlbWVudCB0byBhbm90aGVyIHBhY2thZ2UgZWxlbWVudAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBhY3BpX3N0YXR1cworYWNwaV91dF9jb3B5X2llbGVtZW50X3RvX2VlbGVtZW50KHU4IG9iamVjdF90eXBlLAorCQkJCSAgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqc291cmNlX29iamVjdCwKKwkJCQkgIHVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSAqc3RhdGUsCisJCQkJICB2b2lkICpjb250ZXh0KQoreworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOworCXN0cnVjdCBhY3BpX3BrZ19pbmZvICppbmZvID0gKHN0cnVjdCBhY3BpX3BrZ19pbmZvICopY29udGV4dDsKKwlhY3BpX3NpemUgb2JqZWN0X3NwYWNlOworCXUzMiB0aGlzX2luZGV4OworCXVuaW9uIGFjcGlfb2JqZWN0ICp0YXJnZXRfb2JqZWN0OworCisJQUNQSV9GVU5DVElPTl9FTlRSWSgpOworCisJdGhpc19pbmRleCA9IHN0YXRlLT5wa2cuaW5kZXg7CisJdGFyZ2V0X29iamVjdCA9ICh1bmlvbiBhY3BpX29iamVjdCAqKQorCSAgICAmKCh1bmlvbiBhY3BpX29iamVjdCAqKShzdGF0ZS0+cGtnLmRlc3Rfb2JqZWN0KSktPnBhY2thZ2UuCisJICAgIGVsZW1lbnRzW3RoaXNfaW5kZXhdOworCisJc3dpdGNoIChvYmplY3RfdHlwZSkgeworCWNhc2UgQUNQSV9DT1BZX1RZUEVfU0lNUExFOgorCisJCS8qCisJCSAqIFRoaXMgaXMgYSBzaW1wbGUgb3IgbnVsbCBvYmplY3QKKwkJICovCisJCXN0YXR1cyA9IGFjcGlfdXRfY29weV9pc2ltcGxlX3RvX2VzaW1wbGUoc291cmNlX29iamVjdCwKKwkJCQkJCQkgdGFyZ2V0X29iamVjdCwKKwkJCQkJCQkgaW5mby0+ZnJlZV9zcGFjZSwKKwkJCQkJCQkgJm9iamVjdF9zcGFjZSk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJcmV0dXJuIChzdGF0dXMpOworCQl9CisJCWJyZWFrOworCisJY2FzZSBBQ1BJX0NPUFlfVFlQRV9QQUNLQUdFOgorCisJCS8qCisJCSAqIEJ1aWxkIHRoZSBwYWNrYWdlIG9iamVjdAorCQkgKi8KKwkJdGFyZ2V0X29iamVjdC0+dHlwZSA9IEFDUElfVFlQRV9QQUNLQUdFOworCQl0YXJnZXRfb2JqZWN0LT5wYWNrYWdlLmNvdW50ID0gc291cmNlX29iamVjdC0+cGFja2FnZS5jb3VudDsKKwkJdGFyZ2V0X29iamVjdC0+cGFja2FnZS5lbGVtZW50cyA9CisJCSAgICBBQ1BJX0NBU1RfUFRSKHVuaW9uIGFjcGlfb2JqZWN0LCBpbmZvLT5mcmVlX3NwYWNlKTsKKworCQkvKgorCQkgKiBQYXNzIHRoZSBuZXcgcGFja2FnZSBvYmplY3QgYmFjayB0byB0aGUgcGFja2FnZSB3YWxrIHJvdXRpbmUKKwkJICovCisJCXN0YXRlLT5wa2cudGhpc190YXJnZXRfb2JqID0gdGFyZ2V0X29iamVjdDsKKworCQkvKgorCQkgKiBTYXZlIHNwYWNlIGZvciB0aGUgYXJyYXkgb2Ygb2JqZWN0cyAoUGFja2FnZSBlbGVtZW50cykKKwkJICogdXBkYXRlIHRoZSBidWZmZXIgbGVuZ3RoIGNvdW50ZXIKKwkJICovCisJCW9iamVjdF9zcGFjZSA9IEFDUElfUk9VTkRfVVBfVE9fTkFUSVZFX1dPUkQoKGFjcGlfc2l6ZSkKKwkJCQkJCQkgICAgdGFyZ2V0X29iamVjdC0+CisJCQkJCQkJICAgIHBhY2thZ2UuY291bnQgKgorCQkJCQkJCSAgICBzaXplb2YodW5pb24KKwkJCQkJCQkJICAgYWNwaV9vYmplY3QpKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gKEFFX0JBRF9QQVJBTUVURVIpOworCX0KKworCWluZm8tPmZyZWVfc3BhY2UgKz0gb2JqZWN0X3NwYWNlOworCWluZm8tPmxlbmd0aCArPSBvYmplY3Rfc3BhY2U7CisJcmV0dXJuIChzdGF0dXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X2NvcHlfaXBhY2thZ2VfdG9fZXBhY2thZ2UKKyAqCisgKiBQQVJBTUVURVJTOiAgaW50ZXJuYWxfb2JqZWN0ICAgICAtIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB3ZSBhcmUgcmV0dXJuaW5nCisgKiAgICAgICAgICAgICAgQnVmZmVyICAgICAgICAgICAgICAtIFdoZXJlIHRoZSBvYmplY3QgaXMgcmV0dXJuZWQKKyAqICAgICAgICAgICAgICBzcGFjZV91c2VkICAgICAgICAgIC0gV2hlcmUgdGhlIG9iamVjdCBsZW5ndGggaXMgcmV0dXJuZWQKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHBsYWNlIGEgcGFja2FnZSBvYmplY3QgaW4gYSB1c2VyCisgKiAgICAgICAgICAgICAgYnVmZmVyLiAgQSBwYWNrYWdlIG9iamVjdCBieSBkZWZpbml0aW9uIGNvbnRhaW5zIG90aGVyIG9iamVjdHMuCisgKgorICogICAgICAgICAgICAgIFRoZSBidWZmZXIgaXMgYXNzdW1lZCB0byBoYXZlIHN1ZmZpY2llbnQgc3BhY2UgZm9yIHRoZSBvYmplY3QuCisgKiAgICAgICAgICAgICAgVGhlIGNhbGxlciBtdXN0IGhhdmUgdmVyaWZpZWQgdGhlIGJ1ZmZlciBsZW5ndGggbmVlZGVkIHVzaW5nIHRoZQorICogICAgICAgICAgICAgIGFjcGlfdXRfZ2V0X29iamVjdF9zaXplIGZ1bmN0aW9uIGJlZm9yZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGFjcGlfc3RhdHVzCithY3BpX3V0X2NvcHlfaXBhY2thZ2VfdG9fZXBhY2thZ2UodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqaW50ZXJuYWxfb2JqZWN0LAorCQkJCSAgdTggKiBidWZmZXIsIGFjcGlfc2l6ZSAqIHNwYWNlX3VzZWQpCit7CisJdW5pb24gYWNwaV9vYmplY3QgKmV4dGVybmFsX29iamVjdDsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJc3RydWN0IGFjcGlfcGtnX2luZm8gaW5mbzsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0UodXRfY29weV9pcGFja2FnZV90b19lcGFja2FnZSk7CisKKwkvKgorCSAqIEZpcnN0IHBhY2thZ2UgYXQgaGVhZCBvZiB0aGUgYnVmZmVyCisJICovCisJZXh0ZXJuYWxfb2JqZWN0ID0gQUNQSV9DQVNUX1BUUih1bmlvbiBhY3BpX29iamVjdCwgYnVmZmVyKTsKKworCS8qCisJICogRnJlZSBzcGFjZSBiZWdpbnMgcmlnaHQgYWZ0ZXIgdGhlIGZpcnN0IHBhY2thZ2UKKwkgKi8KKwlpbmZvLmxlbmd0aCA9IEFDUElfUk9VTkRfVVBfVE9fTkFUSVZFX1dPUkQoc2l6ZW9mKHVuaW9uIGFjcGlfb2JqZWN0KSk7CisJaW5mby5mcmVlX3NwYWNlID0KKwkgICAgYnVmZmVyICsgQUNQSV9ST1VORF9VUF9UT19OQVRJVkVfV09SRChzaXplb2YodW5pb24gYWNwaV9vYmplY3QpKTsKKwlpbmZvLm9iamVjdF9zcGFjZSA9IDA7CisJaW5mby5udW1fcGFja2FnZXMgPSAxOworCisJZXh0ZXJuYWxfb2JqZWN0LT50eXBlID0gQUNQSV9HRVRfT0JKRUNUX1RZUEUoaW50ZXJuYWxfb2JqZWN0KTsKKwlleHRlcm5hbF9vYmplY3QtPnBhY2thZ2UuY291bnQgPSBpbnRlcm5hbF9vYmplY3QtPnBhY2thZ2UuY291bnQ7CisJZXh0ZXJuYWxfb2JqZWN0LT5wYWNrYWdlLmVsZW1lbnRzID0gQUNQSV9DQVNUX1BUUih1bmlvbiBhY3BpX29iamVjdCwKKwkJCQkJCQkgIGluZm8uZnJlZV9zcGFjZSk7CisKKwkvKgorCSAqIExlYXZlIHJvb20gZm9yIGFuIGFycmF5IG9mIEFDUElfT0JKRUNUUyBpbiB0aGUgYnVmZmVyCisJICogYW5kIG1vdmUgdGhlIGZyZWUgc3BhY2UgcGFzdCBpdAorCSAqLworCWluZm8ubGVuZ3RoICs9IChhY3BpX3NpemUpIGV4dGVybmFsX29iamVjdC0+cGFja2FnZS5jb3VudCAqCisJICAgIEFDUElfUk9VTkRfVVBfVE9fTkFUSVZFX1dPUkQoc2l6ZW9mKHVuaW9uIGFjcGlfb2JqZWN0KSk7CisJaW5mby5mcmVlX3NwYWNlICs9IGV4dGVybmFsX29iamVjdC0+cGFja2FnZS5jb3VudCAqCisJICAgIEFDUElfUk9VTkRfVVBfVE9fTkFUSVZFX1dPUkQoc2l6ZW9mKHVuaW9uIGFjcGlfb2JqZWN0KSk7CisKKwlzdGF0dXMgPSBhY3BpX3V0X3dhbGtfcGFja2FnZV90cmVlKGludGVybmFsX29iamVjdCwgZXh0ZXJuYWxfb2JqZWN0LAorCQkJCQkgICBhY3BpX3V0X2NvcHlfaWVsZW1lbnRfdG9fZWVsZW1lbnQsCisJCQkJCSAgICZpbmZvKTsKKworCSpzcGFjZV91c2VkID0gaW5mby5sZW5ndGg7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfdXRfY29weV9pb2JqZWN0X3RvX2VvYmplY3QKKyAqCisgKiBQQVJBTUVURVJTOiAgaW50ZXJuYWxfb2JqZWN0ICAgICAtIFRoZSBpbnRlcm5hbCBvYmplY3QgdG8gYmUgY29udmVydGVkCisgKiAgICAgICAgICAgICAgYnVmZmVyX3B0ciAgICAgICAgICAtIFdoZXJlIHRoZSBvYmplY3QgaXMgcmV0dXJuZWQKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGJ1aWxkIGFuIEFQSSBvYmplY3QgdG8gYmUgcmV0dXJuZWQgdG8KKyAqICAgICAgICAgICAgICB0aGUgY2FsbGVyLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2FjcGlfc3RhdHVzCithY3BpX3V0X2NvcHlfaW9iamVjdF90b19lb2JqZWN0KHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKmludGVybmFsX29iamVjdCwKKwkJCQlzdHJ1Y3QgYWNwaV9idWZmZXIgKnJldF9idWZmZXIpCit7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCisJQUNQSV9GVU5DVElPTl9UUkFDRSh1dF9jb3B5X2lvYmplY3RfdG9fZW9iamVjdCk7CisKKwlpZiAoQUNQSV9HRVRfT0JKRUNUX1RZUEUoaW50ZXJuYWxfb2JqZWN0KSA9PSBBQ1BJX1RZUEVfUEFDS0FHRSkgeworCQkvKgorCQkgKiBQYWNrYWdlIG9iamVjdDogIENvcHkgYWxsIHN1Ym9iamVjdHMgKGluY2x1ZGluZworCQkgKiBuZXN0ZWQgcGFja2FnZXMpCisJCSAqLworCQlzdGF0dXMgPSBhY3BpX3V0X2NvcHlfaXBhY2thZ2VfdG9fZXBhY2thZ2UoaW50ZXJuYWxfb2JqZWN0LAorCQkJCQkJCSAgIHJldF9idWZmZXItPnBvaW50ZXIsCisJCQkJCQkJICAgJnJldF9idWZmZXItPmxlbmd0aCk7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogQnVpbGQgYSBzaW1wbGUgb2JqZWN0IChubyBuZXN0ZWQgb2JqZWN0cykKKwkJICovCisJCXN0YXR1cyA9IGFjcGlfdXRfY29weV9pc2ltcGxlX3RvX2VzaW1wbGUoaW50ZXJuYWxfb2JqZWN0LAorCQkJCQkJCSBBQ1BJX0NBU1RfUFRSKHVuaW9uCisJCQkJCQkJCSAgICAgICBhY3BpX29iamVjdCwKKwkJCQkJCQkJICAgICAgIHJldF9idWZmZXItPgorCQkJCQkJCQkgICAgICAgcG9pbnRlciksCisJCQkJCQkJIEFDUElfQUREX1BUUih1OCwKKwkJCQkJCQkJICAgICAgcmV0X2J1ZmZlci0+CisJCQkJCQkJCSAgICAgIHBvaW50ZXIsCisJCQkJCQkJCSAgICAgIEFDUElfUk9VTkRfVVBfVE9fTkFUSVZFX1dPUkQKKwkJCQkJCQkJICAgICAgKHNpemVvZgorCQkJCQkJCQkgICAgICAgKHVuaW9uCisJCQkJCQkJCQlhY3BpX29iamVjdCkpKSwKKwkJCQkJCQkgJnJldF9idWZmZXItPmxlbmd0aCk7CisJCS8qCisJCSAqIGJ1aWxkIHNpbXBsZSBkb2VzIG5vdCBpbmNsdWRlIHRoZSBvYmplY3Qgc2l6ZSBpbiB0aGUgbGVuZ3RoCisJCSAqIHNvIHdlIGFkZCBpdCBpbiBoZXJlCisJCSAqLworCQlyZXRfYnVmZmVyLT5sZW5ndGggKz0gc2l6ZW9mKHVuaW9uIGFjcGlfb2JqZWN0KTsKKwl9CisKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV91dF9jb3B5X2VzaW1wbGVfdG9faXNpbXBsZQorICoKKyAqIFBBUkFNRVRFUlM6ICBleHRlcm5hbF9vYmplY3QgICAgIC0gVGhlIGV4dGVybmFsIG9iamVjdCB0byBiZSBjb252ZXJ0ZWQKKyAqICAgICAgICAgICAgICByZXRfaW50ZXJuYWxfb2JqZWN0IC0gV2hlcmUgdGhlIGludGVybmFsIG9iamVjdCBpcyByZXR1cm5lZAorICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogVGhpcyBmdW5jdGlvbiBjb3BpZXMgYW4gZXh0ZXJuYWwgb2JqZWN0IHRvIGFuIGludGVybmFsIG9uZS4KKyAqICAgICAgICAgICAgICBOT1RFOiBQb2ludGVycyBjYW4gYmUgY29waWVkLCB3ZSBkb24ndCBuZWVkIHRvIGNvcHkgZGF0YS4KKyAqICAgICAgICAgICAgICAoVGhlIHBvaW50ZXJzIGhhdmUgdG8gYmUgdmFsaWQgaW4gb3VyIGFkZHJlc3Mgc3BhY2Ugbm8gbWF0dGVyCisgKiAgICAgICAgICAgICAgd2hhdCB3ZSBkbyB3aXRoIHRoZW0hKQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBhY3BpX3N0YXR1cworYWNwaV91dF9jb3B5X2VzaW1wbGVfdG9faXNpbXBsZSh1bmlvbiBhY3BpX29iamVjdCAqZXh0ZXJuYWxfb2JqZWN0LAorCQkJCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKipyZXRfaW50ZXJuYWxfb2JqZWN0KQoreworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKmludGVybmFsX29iamVjdDsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0UodXRfY29weV9lc2ltcGxlX3RvX2lzaW1wbGUpOworCisJLyoKKwkgKiBTaW1wbGUgdHlwZXMgc3VwcG9ydGVkIGFyZTogU3RyaW5nLCBCdWZmZXIsIEludGVnZXIKKwkgKi8KKwlzd2l0Y2ggKGV4dGVybmFsX29iamVjdC0+dHlwZSkgeworCWNhc2UgQUNQSV9UWVBFX1NUUklORzoKKwljYXNlIEFDUElfVFlQRV9CVUZGRVI6CisJY2FzZSBBQ1BJX1RZUEVfSU5URUdFUjoKKwljYXNlIEFDUElfVFlQRV9MT0NBTF9SRUZFUkVOQ0U6CisKKwkJaW50ZXJuYWxfb2JqZWN0ID0gYWNwaV91dF9jcmVhdGVfaW50ZXJuYWxfb2JqZWN0KCh1OCkKKwkJCQkJCQkJIGV4dGVybmFsX29iamVjdC0+CisJCQkJCQkJCSB0eXBlKTsKKwkJaWYgKCFpbnRlcm5hbF9vYmplY3QpIHsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT19NRU1PUlkpOworCQl9CisJCWJyZWFrOworCisJY2FzZSBBQ1BJX1RZUEVfQU5ZOgkvKiBUaGlzIGlzIHRoZSBjYXNlIGZvciBhIE5VTEwgb2JqZWN0ICovCisKKwkJKnJldF9pbnRlcm5hbF9vYmplY3QgPSBOVUxMOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOworCisJZGVmYXVsdDoKKwkJLyogQWxsIG90aGVyIHR5cGVzIGFyZSBub3Qgc3VwcG9ydGVkICovCisKKwkJQUNQSV9FUlJPUigoQUVfSU5GTywKKwkJCSAgICAiVW5zdXBwb3J0ZWQgb2JqZWN0IHR5cGUsIGNhbm5vdCBjb252ZXJ0IHRvIGludGVybmFsIG9iamVjdDogJXMiLAorCQkJICAgIGFjcGlfdXRfZ2V0X3R5cGVfbmFtZShleHRlcm5hbF9vYmplY3QtPnR5cGUpKSk7CisKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX1NVUFBPUlQpOworCX0KKworCS8qIE11c3QgQ09QWSBzdHJpbmcgYW5kIGJ1ZmZlciBjb250ZW50cyAqLworCisJc3dpdGNoIChleHRlcm5hbF9vYmplY3QtPnR5cGUpIHsKKwljYXNlIEFDUElfVFlQRV9TVFJJTkc6CisKKwkJaW50ZXJuYWxfb2JqZWN0LT5zdHJpbmcucG9pbnRlciA9CisJCSAgICBBQ1BJX0FMTE9DQVRFX1pFUk9FRCgoYWNwaV9zaXplKSBleHRlcm5hbF9vYmplY3QtPnN0cmluZy4KKwkJCQkJIGxlbmd0aCArIDEpOworCQlpZiAoIWludGVybmFsX29iamVjdC0+c3RyaW5nLnBvaW50ZXIpIHsKKwkJCWdvdG8gZXJyb3JfZXhpdDsKKwkJfQorCisJCUFDUElfTUVNQ1BZKGludGVybmFsX29iamVjdC0+c3RyaW5nLnBvaW50ZXIsCisJCQkgICAgZXh0ZXJuYWxfb2JqZWN0LT5zdHJpbmcucG9pbnRlciwKKwkJCSAgICBleHRlcm5hbF9vYmplY3QtPnN0cmluZy5sZW5ndGgpOworCisJCWludGVybmFsX29iamVjdC0+c3RyaW5nLmxlbmd0aCA9IGV4dGVybmFsX29iamVjdC0+c3RyaW5nLmxlbmd0aDsKKwkJYnJlYWs7CisKKwljYXNlIEFDUElfVFlQRV9CVUZGRVI6CisKKwkJaW50ZXJuYWxfb2JqZWN0LT5idWZmZXIucG9pbnRlciA9CisJCSAgICBBQ1BJX0FMTE9DQVRFX1pFUk9FRChleHRlcm5hbF9vYmplY3QtPmJ1ZmZlci5sZW5ndGgpOworCQlpZiAoIWludGVybmFsX29iamVjdC0+YnVmZmVyLnBvaW50ZXIpIHsKKwkJCWdvdG8gZXJyb3JfZXhpdDsKKwkJfQorCisJCUFDUElfTUVNQ1BZKGludGVybmFsX29iamVjdC0+YnVmZmVyLnBvaW50ZXIsCisJCQkgICAgZXh0ZXJuYWxfb2JqZWN0LT5idWZmZXIucG9pbnRlciwKKwkJCSAgICBleHRlcm5hbF9vYmplY3QtPmJ1ZmZlci5sZW5ndGgpOworCisJCWludGVybmFsX29iamVjdC0+YnVmZmVyLmxlbmd0aCA9IGV4dGVybmFsX29iamVjdC0+YnVmZmVyLmxlbmd0aDsKKworCQkvKiBNYXJrIGJ1ZmZlciBkYXRhIHZhbGlkICovCisKKwkJaW50ZXJuYWxfb2JqZWN0LT5idWZmZXIuZmxhZ3MgfD0gQU9QT0JKX0RBVEFfVkFMSUQ7CisJCWJyZWFrOworCisJY2FzZSBBQ1BJX1RZUEVfSU5URUdFUjoKKworCQlpbnRlcm5hbF9vYmplY3QtPmludGVnZXIudmFsdWUgPSBleHRlcm5hbF9vYmplY3QtPmludGVnZXIudmFsdWU7CisJCWJyZWFrOworCisJY2FzZSBBQ1BJX1RZUEVfTE9DQUxfUkVGRVJFTkNFOgorCisJCS8qIFRCRDogc2hvdWxkIHZhbGlkYXRlIGluY29taW5nIGhhbmRsZSAqLworCisJCWludGVybmFsX29iamVjdC0+cmVmZXJlbmNlLmNsYXNzID0gQUNQSV9SRUZDTEFTU19OQU1FOworCQlpbnRlcm5hbF9vYmplY3QtPnJlZmVyZW5jZS5ub2RlID0KKwkJICAgIGV4dGVybmFsX29iamVjdC0+cmVmZXJlbmNlLmhhbmRsZTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQkvKiBPdGhlciB0eXBlcyBjYW4ndCBnZXQgaGVyZSAqLworCQlicmVhazsKKwl9CisKKwkqcmV0X2ludGVybmFsX29iamVjdCA9IGludGVybmFsX29iamVjdDsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOworCisgICAgICBlcnJvcl9leGl0OgorCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZShpbnRlcm5hbF9vYmplY3QpOworCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT19NRU1PUlkpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X2NvcHlfZXBhY2thZ2VfdG9faXBhY2thZ2UKKyAqCisgKiBQQVJBTUVURVJTOiAgZXh0ZXJuYWxfb2JqZWN0ICAgICAtIFRoZSBleHRlcm5hbCBvYmplY3QgdG8gYmUgY29udmVydGVkCisgKiAgICAgICAgICAgICAgaW50ZXJuYWxfb2JqZWN0ICAgICAtIFdoZXJlIHRoZSBpbnRlcm5hbCBvYmplY3QgaXMgcmV0dXJuZWQKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IENvcHkgYW4gZXh0ZXJuYWwgcGFja2FnZSBvYmplY3QgdG8gYW4gaW50ZXJuYWwgcGFja2FnZS4KKyAqICAgICAgICAgICAgICBIYW5kbGVzIG5lc3RlZCBwYWNrYWdlcy4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgYWNwaV9zdGF0dXMKK2FjcGlfdXRfY29weV9lcGFja2FnZV90b19pcGFja2FnZSh1bmlvbiBhY3BpX29iamVjdCAqZXh0ZXJuYWxfb2JqZWN0LAorCQkJCSAgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKmludGVybmFsX29iamVjdCkKK3sKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpwYWNrYWdlX29iamVjdDsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICoqcGFja2FnZV9lbGVtZW50czsKKwl1MzIgaTsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0UodXRfY29weV9lcGFja2FnZV90b19pcGFja2FnZSk7CisKKwkvKiBDcmVhdGUgdGhlIHBhY2thZ2Ugb2JqZWN0ICovCisKKwlwYWNrYWdlX29iamVjdCA9CisJICAgIGFjcGlfdXRfY3JlYXRlX3BhY2thZ2Vfb2JqZWN0KGV4dGVybmFsX29iamVjdC0+cGFja2FnZS5jb3VudCk7CisJaWYgKCFwYWNrYWdlX29iamVjdCkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9fTUVNT1JZKTsKKwl9CisKKwlwYWNrYWdlX2VsZW1lbnRzID0gcGFja2FnZV9vYmplY3QtPnBhY2thZ2UuZWxlbWVudHM7CisKKwkvKgorCSAqIFJlY3Vyc2l2ZSBpbXBsZW1lbnRhdGlvbi4gUHJvYmFibHkgb2ssIHNpbmNlIG5lc3RlZCBleHRlcm5hbCBwYWNrYWdlcworCSAqIGFzIHBhcmFtZXRlcnMgc2hvdWxkIGJlIHZlcnkgcmFyZS4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgZXh0ZXJuYWxfb2JqZWN0LT5wYWNrYWdlLmNvdW50OyBpKyspIHsKKwkJc3RhdHVzID0KKwkJICAgIGFjcGlfdXRfY29weV9lb2JqZWN0X3RvX2lvYmplY3QoJmV4dGVybmFsX29iamVjdC0+cGFja2FnZS4KKwkJCQkJCSAgICBlbGVtZW50c1tpXSwKKwkJCQkJCSAgICAmcGFja2FnZV9lbGVtZW50c1tpXSk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCisJCQkvKiBUcnVuY2F0ZSBwYWNrYWdlIGFuZCBkZWxldGUgaXQgKi8KKworCQkJcGFja2FnZV9vYmplY3QtPnBhY2thZ2UuY291bnQgPSBpOworCQkJcGFja2FnZV9lbGVtZW50c1tpXSA9IE5VTEw7CisJCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UocGFja2FnZV9vYmplY3QpOworCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CisJCX0KKwl9CisKKwkvKiBNYXJrIHBhY2thZ2UgZGF0YSB2YWxpZCAqLworCisJcGFja2FnZV9vYmplY3QtPnBhY2thZ2UuZmxhZ3MgfD0gQU9QT0JKX0RBVEFfVkFMSUQ7CisKKwkqaW50ZXJuYWxfb2JqZWN0ID0gcGFja2FnZV9vYmplY3Q7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfdXRfY29weV9lb2JqZWN0X3RvX2lvYmplY3QKKyAqCisgKiBQQVJBTUVURVJTOiAgZXh0ZXJuYWxfb2JqZWN0ICAgICAtIFRoZSBleHRlcm5hbCBvYmplY3QgdG8gYmUgY29udmVydGVkCisgKiAgICAgICAgICAgICAgaW50ZXJuYWxfb2JqZWN0ICAgICAtIFdoZXJlIHRoZSBpbnRlcm5hbCBvYmplY3QgaXMgcmV0dXJuZWQKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzICAgICAgICAgICAgICAtIHRoZSBzdGF0dXMgb2YgdGhlIGNhbGwKKyAqCisgKiBERVNDUklQVElPTjogQ29udmVydHMgYW4gZXh0ZXJuYWwgb2JqZWN0IHRvIGFuIGludGVybmFsIG9iamVjdC4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCithY3BpX3N0YXR1cworYWNwaV91dF9jb3B5X2VvYmplY3RfdG9faW9iamVjdCh1bmlvbiBhY3BpX29iamVjdCAqZXh0ZXJuYWxfb2JqZWN0LAorCQkJCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKippbnRlcm5hbF9vYmplY3QpCit7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCisJQUNQSV9GVU5DVElPTl9UUkFDRSh1dF9jb3B5X2VvYmplY3RfdG9faW9iamVjdCk7CisKKwlpZiAoZXh0ZXJuYWxfb2JqZWN0LT50eXBlID09IEFDUElfVFlQRV9QQUNLQUdFKSB7CisJCXN0YXR1cyA9CisJCSAgICBhY3BpX3V0X2NvcHlfZXBhY2thZ2VfdG9faXBhY2thZ2UoZXh0ZXJuYWxfb2JqZWN0LAorCQkJCQkJICAgICAgaW50ZXJuYWxfb2JqZWN0KTsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBCdWlsZCBhIHNpbXBsZSBvYmplY3QgKG5vIG5lc3RlZCBvYmplY3RzKQorCQkgKi8KKwkJc3RhdHVzID0KKwkJICAgIGFjcGlfdXRfY29weV9lc2ltcGxlX3RvX2lzaW1wbGUoZXh0ZXJuYWxfb2JqZWN0LAorCQkJCQkJICAgIGludGVybmFsX29iamVjdCk7CisJfQorCisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfdXRfY29weV9zaW1wbGVfb2JqZWN0CisgKgorICogUEFSQU1FVEVSUzogIHNvdXJjZV9kZXNjICAgICAgICAgLSBUaGUgaW50ZXJuYWwgb2JqZWN0IHRvIGJlIGNvcGllZAorICogICAgICAgICAgICAgIGRlc3RfZGVzYyAgICAgICAgICAgLSBOZXcgdGFyZ2V0IG9iamVjdAorICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogU2ltcGxlIGNvcHkgb2Ygb25lIGludGVybmFsIG9iamVjdCB0byBhbm90aGVyLiAgUmVmZXJlbmNlIGNvdW50CisgKiAgICAgICAgICAgICAgb2YgdGhlIGRlc3RpbmF0aW9uIG9iamVjdCBpcyBwcmVzZXJ2ZWQuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGFjcGlfc3RhdHVzCithY3BpX3V0X2NvcHlfc2ltcGxlX29iamVjdCh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpzb3VyY2VfZGVzYywKKwkJCSAgIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKmRlc3RfZGVzYykKK3sKKwl1MTYgcmVmZXJlbmNlX2NvdW50OworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm5leHRfb2JqZWN0OworCisJLyogU2F2ZSBmaWVsZHMgZnJvbSBkZXN0aW5hdGlvbiB0aGF0IHdlIGRvbid0IHdhbnQgdG8gb3ZlcndyaXRlICovCisKKwlyZWZlcmVuY2VfY291bnQgPSBkZXN0X2Rlc2MtPmNvbW1vbi5yZWZlcmVuY2VfY291bnQ7CisJbmV4dF9vYmplY3QgPSBkZXN0X2Rlc2MtPmNvbW1vbi5uZXh0X29iamVjdDsKKworCS8qIENvcHkgdGhlIGVudGlyZSBzb3VyY2Ugb2JqZWN0IG92ZXIgdGhlIGRlc3RpbmF0aW9uIG9iamVjdCAqLworCisJQUNQSV9NRU1DUFkoKGNoYXIgKilkZXN0X2Rlc2MsIChjaGFyICopc291cmNlX2Rlc2MsCisJCSAgICBzaXplb2YodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCkpOworCisJLyogUmVzdG9yZSB0aGUgc2F2ZWQgZmllbGRzICovCisKKwlkZXN0X2Rlc2MtPmNvbW1vbi5yZWZlcmVuY2VfY291bnQgPSByZWZlcmVuY2VfY291bnQ7CisJZGVzdF9kZXNjLT5jb21tb24ubmV4dF9vYmplY3QgPSBuZXh0X29iamVjdDsKKworCS8qIE5ldyBvYmplY3QgaXMgbm90IHN0YXRpYywgcmVnYXJkbGVzcyBvZiBzb3VyY2UgKi8KKworCWRlc3RfZGVzYy0+Y29tbW9uLmZsYWdzICY9IH5BT1BPQkpfU1RBVElDX1BPSU5URVI7CisKKwkvKiBIYW5kbGUgdGhlIG9iamVjdHMgd2l0aCBleHRyYSBkYXRhICovCisKKwlzd2l0Y2ggKEFDUElfR0VUX09CSkVDVF9UWVBFKGRlc3RfZGVzYykpIHsKKwljYXNlIEFDUElfVFlQRV9CVUZGRVI6CisJCS8qCisJCSAqIEFsbG9jYXRlIGFuZCBjb3B5IHRoZSBhY3R1YWwgYnVmZmVyIGlmIGFuZCBvbmx5IGlmOgorCQkgKiAxKSBUaGVyZSBpcyBhIHZhbGlkIGJ1ZmZlciBwb2ludGVyCisJCSAqIDIpIFRoZSBidWZmZXIgaGFzIGEgbGVuZ3RoID4gMAorCQkgKi8KKwkJaWYgKChzb3VyY2VfZGVzYy0+YnVmZmVyLnBvaW50ZXIpICYmCisJCSAgICAoc291cmNlX2Rlc2MtPmJ1ZmZlci5sZW5ndGgpKSB7CisJCQlkZXN0X2Rlc2MtPmJ1ZmZlci5wb2ludGVyID0KKwkJCSAgICBBQ1BJX0FMTE9DQVRFKHNvdXJjZV9kZXNjLT5idWZmZXIubGVuZ3RoKTsKKwkJCWlmICghZGVzdF9kZXNjLT5idWZmZXIucG9pbnRlcikgeworCQkJCXJldHVybiAoQUVfTk9fTUVNT1JZKTsKKwkJCX0KKworCQkJLyogQ29weSB0aGUgYWN0dWFsIGJ1ZmZlciBkYXRhICovCisKKwkJCUFDUElfTUVNQ1BZKGRlc3RfZGVzYy0+YnVmZmVyLnBvaW50ZXIsCisJCQkJICAgIHNvdXJjZV9kZXNjLT5idWZmZXIucG9pbnRlciwKKwkJCQkgICAgc291cmNlX2Rlc2MtPmJ1ZmZlci5sZW5ndGgpOworCQl9CisJCWJyZWFrOworCisJY2FzZSBBQ1BJX1RZUEVfU1RSSU5HOgorCQkvKgorCQkgKiBBbGxvY2F0ZSBhbmQgY29weSB0aGUgYWN0dWFsIHN0cmluZyBpZiBhbmQgb25seSBpZjoKKwkJICogMSkgVGhlcmUgaXMgYSB2YWxpZCBzdHJpbmcgcG9pbnRlcgorCQkgKiAoUG9pbnRlciB0byBhIE5VTEwgc3RyaW5nIGlzIGFsbG93ZWQpCisJCSAqLworCQlpZiAoc291cmNlX2Rlc2MtPnN0cmluZy5wb2ludGVyKSB7CisJCQlkZXN0X2Rlc2MtPnN0cmluZy5wb2ludGVyID0KKwkJCSAgICBBQ1BJX0FMTE9DQVRFKChhY3BpX3NpemUpIHNvdXJjZV9kZXNjLT5zdHJpbmcuCisJCQkJCSAgbGVuZ3RoICsgMSk7CisJCQlpZiAoIWRlc3RfZGVzYy0+c3RyaW5nLnBvaW50ZXIpIHsKKwkJCQlyZXR1cm4gKEFFX05PX01FTU9SWSk7CisJCQl9CisKKwkJCS8qIENvcHkgdGhlIGFjdHVhbCBzdHJpbmcgZGF0YSAqLworCisJCQlBQ1BJX01FTUNQWShkZXN0X2Rlc2MtPnN0cmluZy5wb2ludGVyLAorCQkJCSAgICBzb3VyY2VfZGVzYy0+c3RyaW5nLnBvaW50ZXIsCisJCQkJICAgIChhY3BpX3NpemUpIHNvdXJjZV9kZXNjLT5zdHJpbmcubGVuZ3RoICsgMSk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIEFDUElfVFlQRV9MT0NBTF9SRUZFUkVOQ0U6CisJCS8qCisJCSAqIFdlIGNvcGllZCB0aGUgcmVmZXJlbmNlIG9iamVjdCwgc28gd2Ugbm93IG11c3QgYWRkIGEgcmVmZXJlbmNlCisJCSAqIHRvIHRoZSBvYmplY3QgcG9pbnRlZCB0byBieSB0aGUgcmVmZXJlbmNlCisJCSAqCisJCSAqIEREQkhhbmRsZSByZWZlcmVuY2UgKGZyb20gTG9hZC9sb2FkX3RhYmxlKSBpcyBhIHNwZWNpYWwgcmVmZXJlbmNlLAorCQkgKiBpdCBkb2VzIG5vdCBoYXZlIGEgUmVmZXJlbmNlLk9iamVjdCwgc28gZG9lcyBub3QgbmVlZCB0bworCQkgKiBpbmNyZWFzZSB0aGUgcmVmZXJlbmNlIGNvdW50CisJCSAqLworCQlpZiAoc291cmNlX2Rlc2MtPnJlZmVyZW5jZS5jbGFzcyA9PSBBQ1BJX1JFRkNMQVNTX1RBQkxFKSB7CisJCQlicmVhazsKKwkJfQorCisJCWFjcGlfdXRfYWRkX3JlZmVyZW5jZShzb3VyY2VfZGVzYy0+cmVmZXJlbmNlLm9iamVjdCk7CisJCWJyZWFrOworCisJY2FzZSBBQ1BJX1RZUEVfUkVHSU9OOgorCQkvKgorCQkgKiBXZSBjb3BpZWQgdGhlIFJlZ2lvbiBIYW5kbGVyLCBzbyB3ZSBub3cgbXVzdCBhZGQgYSByZWZlcmVuY2UKKwkJICovCisJCWlmIChkZXN0X2Rlc2MtPnJlZ2lvbi5oYW5kbGVyKSB7CisJCQlhY3BpX3V0X2FkZF9yZWZlcmVuY2UoZGVzdF9kZXNjLT5yZWdpb24uaGFuZGxlcik7CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQkvKiBOb3RoaW5nIHRvIGRvIGZvciBvdGhlciBzaW1wbGUgb2JqZWN0cyAqLworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gKEFFX09LKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV91dF9jb3B5X2llbGVtZW50X3RvX2llbGVtZW50CisgKgorICogUEFSQU1FVEVSUzogIGFjcGlfcGtnX2NhbGxiYWNrCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBDb3B5IG9uZSBwYWNrYWdlIGVsZW1lbnQgdG8gYW5vdGhlciBwYWNrYWdlIGVsZW1lbnQKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgYWNwaV9zdGF0dXMKK2FjcGlfdXRfY29weV9pZWxlbWVudF90b19pZWxlbWVudCh1OCBvYmplY3RfdHlwZSwKKwkJCQkgIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnNvdXJjZV9vYmplY3QsCisJCQkJICB1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgKnN0YXRlLAorCQkJCSAgdm9pZCAqY29udGV4dCkKK3sKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKKwl1MzIgdGhpc19pbmRleDsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICoqdGhpc190YXJnZXRfcHRyOworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnRhcmdldF9vYmplY3Q7CisKKwlBQ1BJX0ZVTkNUSU9OX0VOVFJZKCk7CisKKwl0aGlzX2luZGV4ID0gc3RhdGUtPnBrZy5pbmRleDsKKwl0aGlzX3RhcmdldF9wdHIgPSAodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKikKKwkgICAgJnN0YXRlLT5wa2cuZGVzdF9vYmplY3QtPnBhY2thZ2UuZWxlbWVudHNbdGhpc19pbmRleF07CisKKwlzd2l0Y2ggKG9iamVjdF90eXBlKSB7CisJY2FzZSBBQ1BJX0NPUFlfVFlQRV9TSU1QTEU6CisKKwkJLyogQSBudWxsIHNvdXJjZSBvYmplY3QgaW5kaWNhdGVzIGEgKGxlZ2FsKSBudWxsIHBhY2thZ2UgZWxlbWVudCAqLworCisJCWlmIChzb3VyY2Vfb2JqZWN0KSB7CisJCQkvKgorCQkJICogVGhpcyBpcyBhIHNpbXBsZSBvYmplY3QsIGp1c3QgY29weSBpdAorCQkJICovCisJCQl0YXJnZXRfb2JqZWN0ID0KKwkJCSAgICBhY3BpX3V0X2NyZWF0ZV9pbnRlcm5hbF9vYmplY3QoQUNQSV9HRVRfT0JKRUNUX1RZUEUKKwkJCQkJCQkgICAoc291cmNlX29iamVjdCkpOworCQkJaWYgKCF0YXJnZXRfb2JqZWN0KSB7CisJCQkJcmV0dXJuIChBRV9OT19NRU1PUlkpOworCQkJfQorCisJCQlzdGF0dXMgPQorCQkJICAgIGFjcGlfdXRfY29weV9zaW1wbGVfb2JqZWN0KHNvdXJjZV9vYmplY3QsCisJCQkJCQkgICAgICAgdGFyZ2V0X29iamVjdCk7CisJCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCQlnb3RvIGVycm9yX2V4aXQ7CisJCQl9CisKKwkJCSp0aGlzX3RhcmdldF9wdHIgPSB0YXJnZXRfb2JqZWN0OworCQl9IGVsc2UgeworCQkJLyogUGFzcyB0aHJvdWdoIGEgbnVsbCBlbGVtZW50ICovCisKKwkJCSp0aGlzX3RhcmdldF9wdHIgPSBOVUxMOworCQl9CisJCWJyZWFrOworCisJY2FzZSBBQ1BJX0NPUFlfVFlQRV9QQUNLQUdFOgorCisJCS8qCisJCSAqIFRoaXMgb2JqZWN0IGlzIGEgcGFja2FnZSAtIGdvIGRvd24gYW5vdGhlciBuZXN0aW5nIGxldmVsCisJCSAqIENyZWF0ZSBhbmQgYnVpbGQgdGhlIHBhY2thZ2Ugb2JqZWN0CisJCSAqLworCQl0YXJnZXRfb2JqZWN0ID0KKwkJICAgIGFjcGlfdXRfY3JlYXRlX3BhY2thZ2Vfb2JqZWN0KHNvdXJjZV9vYmplY3QtPnBhY2thZ2UuY291bnQpOworCQlpZiAoIXRhcmdldF9vYmplY3QpIHsKKwkJCXJldHVybiAoQUVfTk9fTUVNT1JZKTsKKwkJfQorCisJCXRhcmdldF9vYmplY3QtPmNvbW1vbi5mbGFncyA9IHNvdXJjZV9vYmplY3QtPmNvbW1vbi5mbGFnczsKKworCQkvKiBQYXNzIHRoZSBuZXcgcGFja2FnZSBvYmplY3QgYmFjayB0byB0aGUgcGFja2FnZSB3YWxrIHJvdXRpbmUgKi8KKworCQlzdGF0ZS0+cGtnLnRoaXNfdGFyZ2V0X29iaiA9IHRhcmdldF9vYmplY3Q7CisKKwkJLyogU3RvcmUgdGhlIG9iamVjdCBwb2ludGVyIGluIHRoZSBwYXJlbnQgcGFja2FnZSBvYmplY3QgKi8KKworCQkqdGhpc190YXJnZXRfcHRyID0gdGFyZ2V0X29iamVjdDsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gKEFFX0JBRF9QQVJBTUVURVIpOworCX0KKworCXJldHVybiAoc3RhdHVzKTsKKworICAgICAgZXJyb3JfZXhpdDoKKwlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UodGFyZ2V0X29iamVjdCk7CisJcmV0dXJuIChzdGF0dXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X2NvcHlfaXBhY2thZ2VfdG9faXBhY2thZ2UKKyAqCisgKiBQQVJBTUVURVJTOiAgKnNvdXJjZV9vYmogICAgIC0gUG9pbnRlciB0byB0aGUgc291cmNlIHBhY2thZ2Ugb2JqZWN0CisgKiAgICAgICAgICAgICAgKmRlc3Rfb2JqICAgICAgIC0gV2hlcmUgdGhlIGludGVybmFsIG9iamVjdCBpcyByZXR1cm5lZAorICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMgICAgICAgICAgLSB0aGUgc3RhdHVzIG9mIHRoZSBjYWxsCisgKgorICogREVTQ1JJUFRJT046IFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGNvcHkgYW4gaW50ZXJuYWwgcGFja2FnZSBvYmplY3QKKyAqICAgICAgICAgICAgICBpbnRvIGFub3RoZXIgaW50ZXJuYWwgcGFja2FnZSBvYmplY3QuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGFjcGlfc3RhdHVzCithY3BpX3V0X2NvcHlfaXBhY2thZ2VfdG9faXBhY2thZ2UodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqc291cmNlX29iaiwKKwkJCQkgIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKmRlc3Rfb2JqLAorCQkJCSAgc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSkKK3sKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0UodXRfY29weV9pcGFja2FnZV90b19pcGFja2FnZSk7CisKKwlkZXN0X29iai0+Y29tbW9uLnR5cGUgPSBBQ1BJX0dFVF9PQkpFQ1RfVFlQRShzb3VyY2Vfb2JqKTsKKwlkZXN0X29iai0+Y29tbW9uLmZsYWdzID0gc291cmNlX29iai0+Y29tbW9uLmZsYWdzOworCWRlc3Rfb2JqLT5wYWNrYWdlLmNvdW50ID0gc291cmNlX29iai0+cGFja2FnZS5jb3VudDsKKworCS8qCisJICogQ3JlYXRlIHRoZSBvYmplY3QgYXJyYXkgYW5kIHdhbGsgdGhlIHNvdXJjZSBwYWNrYWdlIHRyZWUKKwkgKi8KKwlkZXN0X29iai0+cGFja2FnZS5lbGVtZW50cyA9IEFDUElfQUxMT0NBVEVfWkVST0VEKCgoYWNwaV9zaXplKQorCQkJCQkJCSAgIHNvdXJjZV9vYmotPnBhY2thZ2UuCisJCQkJCQkJICAgY291bnQgKworCQkJCQkJCSAgIDEpICogc2l6ZW9mKHZvaWQgKikpOworCWlmICghZGVzdF9vYmotPnBhY2thZ2UuZWxlbWVudHMpIHsKKwkJQUNQSV9FUlJPUigoQUVfSU5GTywgIlBhY2thZ2UgYWxsb2NhdGlvbiBmYWlsdXJlIikpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9fTUVNT1JZKTsKKwl9CisKKwkvKgorCSAqIENvcHkgdGhlIHBhY2thZ2UgZWxlbWVudC1ieS1lbGVtZW50IGJ5IHdhbGtpbmcgdGhlIHBhY2thZ2UgInRyZWUiLgorCSAqIFRoaXMgaGFuZGxlcyBuZXN0ZWQgcGFja2FnZXMgb2YgYXJiaXRyYXJ5IGRlcHRoLgorCSAqLworCXN0YXR1cyA9IGFjcGlfdXRfd2Fsa19wYWNrYWdlX3RyZWUoc291cmNlX29iaiwgZGVzdF9vYmosCisJCQkJCSAgIGFjcGlfdXRfY29weV9pZWxlbWVudF90b19pZWxlbWVudCwKKwkJCQkJICAgd2Fsa19zdGF0ZSk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisKKwkJLyogT24gZmFpbHVyZSwgZGVsZXRlIHRoZSBkZXN0aW5hdGlvbiBwYWNrYWdlIG9iamVjdCAqLworCisJCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZShkZXN0X29iaik7CisJfQorCisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfdXRfY29weV9pb2JqZWN0X3RvX2lvYmplY3QKKyAqCisgKiBQQVJBTUVURVJTOiAgd2Fsa19zdGF0ZSAgICAgICAgICAtIEN1cnJlbnQgd2FsayBzdGF0ZQorICogICAgICAgICAgICAgIHNvdXJjZV9kZXNjICAgICAgICAgLSBUaGUgaW50ZXJuYWwgb2JqZWN0IHRvIGJlIGNvcGllZAorICogICAgICAgICAgICAgIGRlc3RfZGVzYyAgICAgICAgICAgLSBXaGVyZSB0aGUgY29waWVkIG9iamVjdCBpcyByZXR1cm5lZAorICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogQ29weSBhbiBpbnRlcm5hbCBvYmplY3QgdG8gYSBuZXcgaW50ZXJuYWwgb2JqZWN0CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworYWNwaV9zdGF0dXMKK2FjcGlfdXRfY29weV9pb2JqZWN0X3RvX2lvYmplY3QodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqc291cmNlX2Rlc2MsCisJCQkJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKmRlc3RfZGVzYywKKwkJCQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKQoreworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOworCisJQUNQSV9GVU5DVElPTl9UUkFDRSh1dF9jb3B5X2lvYmplY3RfdG9faW9iamVjdCk7CisKKwkvKiBDcmVhdGUgdGhlIHRvcCBsZXZlbCBvYmplY3QgKi8KKworCSpkZXN0X2Rlc2MgPQorCSAgICBhY3BpX3V0X2NyZWF0ZV9pbnRlcm5hbF9vYmplY3QoQUNQSV9HRVRfT0JKRUNUX1RZUEUoc291cmNlX2Rlc2MpKTsKKwlpZiAoISpkZXN0X2Rlc2MpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX01FTU9SWSk7CisJfQorCisJLyogQ29weSB0aGUgb2JqZWN0IGFuZCBwb3NzaWJsZSBzdWJvYmplY3RzICovCisKKwlpZiAoQUNQSV9HRVRfT0JKRUNUX1RZUEUoc291cmNlX2Rlc2MpID09IEFDUElfVFlQRV9QQUNLQUdFKSB7CisJCXN0YXR1cyA9CisJCSAgICBhY3BpX3V0X2NvcHlfaXBhY2thZ2VfdG9faXBhY2thZ2Uoc291cmNlX2Rlc2MsICpkZXN0X2Rlc2MsCisJCQkJCQkgICAgICB3YWxrX3N0YXRlKTsKKwl9IGVsc2UgeworCQlzdGF0dXMgPSBhY3BpX3V0X2NvcHlfc2ltcGxlX29iamVjdChzb3VyY2VfZGVzYywgKmRlc3RfZGVzYyk7CisJfQorCisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL3V0ZGVidWcuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvdXRkZWJ1Zy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4ODIxZjUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL3V0ZGVidWcuYwpAQCAtMCwwICsxLDY1MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIE1vZHVsZSBOYW1lOiB1dGRlYnVnIC0gRGVidWcgcHJpbnQgcm91dGluZXMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA4LCBJbnRlbCBDb3JwLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAorICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgYXQgbWluaW11bSBhIGRpc2NsYWltZXIKKyAqICAgIHN1YnN0YW50aWFsbHkgc2ltaWxhciB0byB0aGUgIk5PIFdBUlJBTlRZIiBkaXNjbGFpbWVyIGJlbG93CisgKiAgICAoIkRpc2NsYWltZXIiKSBhbmQgYW55IHJlZGlzdHJpYnV0aW9uIG11c3QgYmUgY29uZGl0aW9uZWQgdXBvbgorICogICAgaW5jbHVkaW5nIGEgc3Vic3RhbnRpYWxseSBzaW1pbGFyIERpc2NsYWltZXIgcmVxdWlyZW1lbnQgZm9yIGZ1cnRoZXIKKyAqICAgIGJpbmFyeSByZWRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcworICogICAgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBOTyBXQVJSQU5UWQorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcKKyAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgorICovCisKKyNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KKyNpbmNsdWRlICJhY2NvbW1vbi5oIgorCisjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9VVElMSVRJRVMKK0FDUElfTU9EVUxFX05BTUUoInV0ZGVidWciKQorI2lmZGVmIEFDUElfREVCVUdfT1VUUFVUCitzdGF0aWMgYWNwaV90aHJlYWRfaWQgYWNwaV9nYmxfcHJldl90aHJlYWRfaWQ7CitzdGF0aWMgY2hhciAqYWNwaV9nYmxfZm5fZW50cnlfc3RyID0gIi0tLS1FbnRyeSI7CitzdGF0aWMgY2hhciAqYWNwaV9nYmxfZm5fZXhpdF9zdHIgPSAiLS0tLUV4aXQtIjsKKworLyogTG9jYWwgcHJvdG90eXBlcyAqLworCitzdGF0aWMgY29uc3QgY2hhciAqYWNwaV91dF90cmltX2Z1bmN0aW9uX25hbWUoY29uc3QgY2hhciAqZnVuY3Rpb25fbmFtZSk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfdXRfaW5pdF9zdGFja19wdHJfdHJhY2UKKyAqCisgKiBQQVJBTUVURVJTOiAgTm9uZQorICoKKyAqIFJFVFVSTjogICAgICBOb25lCisgKgorICogREVTQ1JJUFRJT046IFNhdmUgdGhlIGN1cnJlbnQgQ1BVIHN0YWNrIHBvaW50ZXIgYXQgc3Vic3lzdGVtIHN0YXJ0dXAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIGFjcGlfdXRfaW5pdF9zdGFja19wdHJfdHJhY2Uodm9pZCkKK3sKKwlhY3BpX3NpemUgY3VycmVudF9zcDsKKworCWFjcGlfZ2JsX2VudHJ5X3N0YWNrX3BvaW50ZXIgPSAmY3VycmVudF9zcDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV91dF90cmFja19zdGFja19wdHIKKyAqCisgKiBQQVJBTUVURVJTOiAgTm9uZQorICoKKyAqIFJFVFVSTjogICAgICBOb25lCisgKgorICogREVTQ1JJUFRJT046IFNhdmUgdGhlIGN1cnJlbnQgQ1BVIHN0YWNrIHBvaW50ZXIKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIGFjcGlfdXRfdHJhY2tfc3RhY2tfcHRyKHZvaWQpCit7CisJYWNwaV9zaXplIGN1cnJlbnRfc3A7CisKKwlpZiAoJmN1cnJlbnRfc3AgPCBhY3BpX2dibF9sb3dlc3Rfc3RhY2tfcG9pbnRlcikgeworCQlhY3BpX2dibF9sb3dlc3Rfc3RhY2tfcG9pbnRlciA9ICZjdXJyZW50X3NwOworCX0KKworCWlmIChhY3BpX2dibF9uZXN0aW5nX2xldmVsID4gYWNwaV9nYmxfZGVlcGVzdF9uZXN0aW5nKSB7CisJCWFjcGlfZ2JsX2RlZXBlc3RfbmVzdGluZyA9IGFjcGlfZ2JsX25lc3RpbmdfbGV2ZWw7CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X3RyaW1fZnVuY3Rpb25fbmFtZQorICoKKyAqIFBBUkFNRVRFUlM6ICBmdW5jdGlvbl9uYW1lICAgICAgIC0gQXNjaWkgc3RyaW5nIGNvbnRhaW5pbmcgYSBwcm9jZWR1cmUgbmFtZQorICoKKyAqIFJFVFVSTjogICAgICBVcGRhdGVkIHBvaW50ZXIgdG8gdGhlIGZ1bmN0aW9uIG5hbWUKKyAqCisgKiBERVNDUklQVElPTjogUmVtb3ZlIHRoZSAiQWNwaSIgcHJlZml4IGZyb20gdGhlIGZ1bmN0aW9uIG5hbWUsIGlmIHByZXNlbnQuCisgKiAgICAgICAgICAgICAgVGhpcyBhbGxvd3MgY29tcGlsZXIgbWFjcm9zIHN1Y2ggYXMgX19mdW5jX18gdG8gYmUgdXNlZAorICogICAgICAgICAgICAgIHdpdGggbm8gY2hhbmdlIHRvIHRoZSBkZWJ1ZyBvdXRwdXQuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGNvbnN0IGNoYXIgKmFjcGlfdXRfdHJpbV9mdW5jdGlvbl9uYW1lKGNvbnN0IGNoYXIgKmZ1bmN0aW9uX25hbWUpCit7CisKKwkvKiBBbGwgRnVuY3Rpb24gbmFtZXMgYXJlIGxvbmdlciB0aGFuIDQgY2hhcnMsIGNoZWNrIGlzIHNhZmUgKi8KKworCWlmICgqKEFDUElfQ0FTVF9QVFIodTMyLCBmdW5jdGlvbl9uYW1lKSkgPT0gQUNQSV9QUkVGSVhfTUlYRUQpIHsKKworCQkvKiBUaGlzIGlzIHRoZSBjYXNlIHdoZXJlIHRoZSBvcmlnaW5hbCBzb3VyY2UgaGFzIG5vdCBiZWVuIG1vZGlmaWVkICovCisKKwkJcmV0dXJuIChmdW5jdGlvbl9uYW1lICsgNCk7CisJfQorCisJaWYgKCooQUNQSV9DQVNUX1BUUih1MzIsIGZ1bmN0aW9uX25hbWUpKSA9PSBBQ1BJX1BSRUZJWF9MT1dFUikgeworCisJCS8qIFRoaXMgaXMgdGhlIGNhc2Ugd2hlcmUgdGhlIHNvdXJjZSBoYXMgYmVlbiAnbGludXhpemVkJyAqLworCisJCXJldHVybiAoZnVuY3Rpb25fbmFtZSArIDUpOworCX0KKworCXJldHVybiAoZnVuY3Rpb25fbmFtZSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfZGVidWdfcHJpbnQKKyAqCisgKiBQQVJBTUVURVJTOiAgcmVxdWVzdGVkX2RlYnVnX2xldmVsIC0gUmVxdWVzdGVkIGRlYnVnIHByaW50IGxldmVsCisgKiAgICAgICAgICAgICAgbGluZV9udW1iZXIgICAgICAgICAtIENhbGxlcidzIGxpbmUgbnVtYmVyIChmb3IgZXJyb3Igb3V0cHV0KQorICogICAgICAgICAgICAgIGZ1bmN0aW9uX25hbWUgICAgICAgLSBDYWxsZXIncyBwcm9jZWR1cmUgbmFtZQorICogICAgICAgICAgICAgIG1vZHVsZV9uYW1lICAgICAgICAgLSBDYWxsZXIncyBtb2R1bGUgbmFtZQorICogICAgICAgICAgICAgIGNvbXBvbmVudF9pZCAgICAgICAgLSBDYWxsZXIncyBjb21wb25lbnQgSUQKKyAqICAgICAgICAgICAgICBGb3JtYXQgICAgICAgICAgICAgIC0gUHJpbnRmIGZvcm1hdCBmaWVsZAorICogICAgICAgICAgICAgIC4uLiAgICAgICAgICAgICAgICAgLSBPcHRpb25hbCBwcmludGYgYXJndW1lbnRzCisgKgorICogUkVUVVJOOiAgICAgIE5vbmUKKyAqCisgKiBERVNDUklQVElPTjogUHJpbnQgZXJyb3IgbWVzc2FnZSB3aXRoIHByZWZpeCBjb25zaXN0aW5nIG9mIHRoZSBtb2R1bGUgbmFtZSwKKyAqICAgICAgICAgICAgICBsaW5lIG51bWJlciwgYW5kIGNvbXBvbmVudCBJRC4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIEFDUElfSU5URVJOQUxfVkFSX1hGQUNFCithY3BpX2RlYnVnX3ByaW50KHUzMiByZXF1ZXN0ZWRfZGVidWdfbGV2ZWwsCisJCSB1MzIgbGluZV9udW1iZXIsCisJCSBjb25zdCBjaGFyICpmdW5jdGlvbl9uYW1lLAorCQkgY29uc3QgY2hhciAqbW9kdWxlX25hbWUsCisJCSB1MzIgY29tcG9uZW50X2lkLCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKK3sKKwlhY3BpX3RocmVhZF9pZCB0aHJlYWRfaWQ7CisJdmFfbGlzdCBhcmdzOworCisJLyoKKwkgKiBTdGF5IHNpbGVudCBpZiB0aGUgZGVidWcgbGV2ZWwgb3IgY29tcG9uZW50IElEIGlzIGRpc2FibGVkCisJICovCisJaWYgKCEocmVxdWVzdGVkX2RlYnVnX2xldmVsICYgYWNwaV9kYmdfbGV2ZWwpIHx8CisJICAgICEoY29tcG9uZW50X2lkICYgYWNwaV9kYmdfbGF5ZXIpKSB7CisJCXJldHVybjsKKwl9CisKKwkvKgorCSAqIFRocmVhZCB0cmFja2luZyBhbmQgY29udGV4dCBzd2l0Y2ggbm90aWZpY2F0aW9uCisJICovCisJdGhyZWFkX2lkID0gYWNwaV9vc19nZXRfdGhyZWFkX2lkKCk7CisJaWYgKHRocmVhZF9pZCAhPSBhY3BpX2dibF9wcmV2X3RocmVhZF9pZCkgeworCQlpZiAoQUNQSV9MVl9USFJFQURTICYgYWNwaV9kYmdfbGV2ZWwpIHsKKwkJCWFjcGlfb3NfcHJpbnRmCisJCQkgICAgKCJcbioqKiogQ29udGV4dCBTd2l0Y2ggZnJvbSBUSUQgJWxYIHRvIFRJRCAlbFggKioqKlxuXG4iLAorCQkJICAgICAodW5zaWduZWQgbG9uZylhY3BpX2dibF9wcmV2X3RocmVhZF9pZCwKKwkJCSAgICAgKHVuc2lnbmVkIGxvbmcpdGhyZWFkX2lkKTsKKwkJfQorCisJCWFjcGlfZ2JsX3ByZXZfdGhyZWFkX2lkID0gdGhyZWFkX2lkOworCX0KKworCS8qCisJICogRGlzcGxheSB0aGUgbW9kdWxlIG5hbWUsIGN1cnJlbnQgbGluZSBudW1iZXIsIHRocmVhZCBJRCAoaWYgcmVxdWVzdGVkKSwKKwkgKiBjdXJyZW50IHByb2NlZHVyZSBuZXN0aW5nIGxldmVsLCBhbmQgdGhlIGN1cnJlbnQgcHJvY2VkdXJlIG5hbWUKKwkgKi8KKwlhY3BpX29zX3ByaW50ZigiJThzLSUwNGxkICIsIG1vZHVsZV9uYW1lLCBsaW5lX251bWJlcik7CisKKwlpZiAoQUNQSV9MVl9USFJFQURTICYgYWNwaV9kYmdfbGV2ZWwpIHsKKwkJYWNwaV9vc19wcmludGYoIlslMDRsWF0gIiwgKHVuc2lnbmVkIGxvbmcpdGhyZWFkX2lkKTsKKwl9CisKKwlhY3BpX29zX3ByaW50ZigiWyUwMmxkXSAlLTIyLjIyczogIiwKKwkJICAgICAgIGFjcGlfZ2JsX25lc3RpbmdfbGV2ZWwsCisJCSAgICAgICBhY3BpX3V0X3RyaW1fZnVuY3Rpb25fbmFtZShmdW5jdGlvbl9uYW1lKSk7CisKKwl2YV9zdGFydChhcmdzLCBmb3JtYXQpOworCWFjcGlfb3NfdnByaW50Zihmb3JtYXQsIGFyZ3MpOworCXZhX2VuZChhcmdzKTsKK30KKworQUNQSV9FWFBPUlRfU1lNQk9MKGFjcGlfZGVidWdfcHJpbnQpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfZGVidWdfcHJpbnRfcmF3CisgKgorICogUEFSQU1FVEVSUzogIHJlcXVlc3RlZF9kZWJ1Z19sZXZlbCAtIFJlcXVlc3RlZCBkZWJ1ZyBwcmludCBsZXZlbAorICogICAgICAgICAgICAgIGxpbmVfbnVtYmVyICAgICAgICAgLSBDYWxsZXIncyBsaW5lIG51bWJlcgorICogICAgICAgICAgICAgIGZ1bmN0aW9uX25hbWUgICAgICAgLSBDYWxsZXIncyBwcm9jZWR1cmUgbmFtZQorICogICAgICAgICAgICAgIG1vZHVsZV9uYW1lICAgICAgICAgLSBDYWxsZXIncyBtb2R1bGUgbmFtZQorICogICAgICAgICAgICAgIGNvbXBvbmVudF9pZCAgICAgICAgLSBDYWxsZXIncyBjb21wb25lbnQgSUQKKyAqICAgICAgICAgICAgICBGb3JtYXQgICAgICAgICAgICAgIC0gUHJpbnRmIGZvcm1hdCBmaWVsZAorICogICAgICAgICAgICAgIC4uLiAgICAgICAgICAgICAgICAgLSBPcHRpb25hbCBwcmludGYgYXJndW1lbnRzCisgKgorICogUkVUVVJOOiAgICAgIE5vbmUKKyAqCisgKiBERVNDUklQVElPTjogUHJpbnQgbWVzc2FnZSB3aXRoIG5vIGhlYWRlcnMuICBIYXMgc2FtZSBpbnRlcmZhY2UgYXMKKyAqICAgICAgICAgICAgICBkZWJ1Z19wcmludCBzbyB0aGF0IHRoZSBzYW1lIG1hY3JvcyBjYW4gYmUgdXNlZC4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBBQ1BJX0lOVEVSTkFMX1ZBUl9YRkFDRQorYWNwaV9kZWJ1Z19wcmludF9yYXcodTMyIHJlcXVlc3RlZF9kZWJ1Z19sZXZlbCwKKwkJICAgICB1MzIgbGluZV9udW1iZXIsCisJCSAgICAgY29uc3QgY2hhciAqZnVuY3Rpb25fbmFtZSwKKwkJICAgICBjb25zdCBjaGFyICptb2R1bGVfbmFtZSwKKwkJICAgICB1MzIgY29tcG9uZW50X2lkLCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKK3sKKwl2YV9saXN0IGFyZ3M7CisKKwlpZiAoIShyZXF1ZXN0ZWRfZGVidWdfbGV2ZWwgJiBhY3BpX2RiZ19sZXZlbCkgfHwKKwkgICAgIShjb21wb25lbnRfaWQgJiBhY3BpX2RiZ19sYXllcikpIHsKKwkJcmV0dXJuOworCX0KKworCXZhX3N0YXJ0KGFyZ3MsIGZvcm1hdCk7CisJYWNwaV9vc192cHJpbnRmKGZvcm1hdCwgYXJncyk7CisJdmFfZW5kKGFyZ3MpOworfQorCitBQ1BJX0VYUE9SVF9TWU1CT0woYWNwaV9kZWJ1Z19wcmludF9yYXcpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfdXRfdHJhY2UKKyAqCisgKiBQQVJBTUVURVJTOiAgbGluZV9udW1iZXIgICAgICAgICAtIENhbGxlcidzIGxpbmUgbnVtYmVyCisgKiAgICAgICAgICAgICAgZnVuY3Rpb25fbmFtZSAgICAgICAtIENhbGxlcidzIHByb2NlZHVyZSBuYW1lCisgKiAgICAgICAgICAgICAgbW9kdWxlX25hbWUgICAgICAgICAtIENhbGxlcidzIG1vZHVsZSBuYW1lCisgKiAgICAgICAgICAgICAgY29tcG9uZW50X2lkICAgICAgICAtIENhbGxlcidzIGNvbXBvbmVudCBJRAorICoKKyAqIFJFVFVSTjogICAgICBOb25lCisgKgorICogREVTQ1JJUFRJT046IEZ1bmN0aW9uIGVudHJ5IHRyYWNlLiAgUHJpbnRzIG9ubHkgaWYgVFJBQ0VfRlVOQ1RJT05TIGJpdCBpcworICogICAgICAgICAgICAgIHNldCBpbiBkZWJ1Z19sZXZlbAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkCithY3BpX3V0X3RyYWNlKHUzMiBsaW5lX251bWJlciwKKwkgICAgICBjb25zdCBjaGFyICpmdW5jdGlvbl9uYW1lLAorCSAgICAgIGNvbnN0IGNoYXIgKm1vZHVsZV9uYW1lLCB1MzIgY29tcG9uZW50X2lkKQoreworCisJYWNwaV9nYmxfbmVzdGluZ19sZXZlbCsrOworCWFjcGlfdXRfdHJhY2tfc3RhY2tfcHRyKCk7CisKKwlhY3BpX2RlYnVnX3ByaW50KEFDUElfTFZfRlVOQ1RJT05TLAorCQkJIGxpbmVfbnVtYmVyLCBmdW5jdGlvbl9uYW1lLCBtb2R1bGVfbmFtZSwgY29tcG9uZW50X2lkLAorCQkJICIlc1xuIiwgYWNwaV9nYmxfZm5fZW50cnlfc3RyKTsKK30KKworQUNQSV9FWFBPUlRfU1lNQk9MKGFjcGlfdXRfdHJhY2UpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfdXRfdHJhY2VfcHRyCisgKgorICogUEFSQU1FVEVSUzogIGxpbmVfbnVtYmVyICAgICAgICAgLSBDYWxsZXIncyBsaW5lIG51bWJlcgorICogICAgICAgICAgICAgIGZ1bmN0aW9uX25hbWUgICAgICAgLSBDYWxsZXIncyBwcm9jZWR1cmUgbmFtZQorICogICAgICAgICAgICAgIG1vZHVsZV9uYW1lICAgICAgICAgLSBDYWxsZXIncyBtb2R1bGUgbmFtZQorICogICAgICAgICAgICAgIGNvbXBvbmVudF9pZCAgICAgICAgLSBDYWxsZXIncyBjb21wb25lbnQgSUQKKyAqICAgICAgICAgICAgICBQb2ludGVyICAgICAgICAgICAgIC0gUG9pbnRlciB0byBkaXNwbGF5CisgKgorICogUkVUVVJOOiAgICAgIE5vbmUKKyAqCisgKiBERVNDUklQVElPTjogRnVuY3Rpb24gZW50cnkgdHJhY2UuICBQcmludHMgb25seSBpZiBUUkFDRV9GVU5DVElPTlMgYml0IGlzCisgKiAgICAgICAgICAgICAgc2V0IGluIGRlYnVnX2xldmVsCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQKK2FjcGlfdXRfdHJhY2VfcHRyKHUzMiBsaW5lX251bWJlciwKKwkJICBjb25zdCBjaGFyICpmdW5jdGlvbl9uYW1lLAorCQkgIGNvbnN0IGNoYXIgKm1vZHVsZV9uYW1lLCB1MzIgY29tcG9uZW50X2lkLCB2b2lkICpwb2ludGVyKQoreworCWFjcGlfZ2JsX25lc3RpbmdfbGV2ZWwrKzsKKwlhY3BpX3V0X3RyYWNrX3N0YWNrX3B0cigpOworCisJYWNwaV9kZWJ1Z19wcmludChBQ1BJX0xWX0ZVTkNUSU9OUywKKwkJCSBsaW5lX251bWJlciwgZnVuY3Rpb25fbmFtZSwgbW9kdWxlX25hbWUsIGNvbXBvbmVudF9pZCwKKwkJCSAiJXMgJXBcbiIsIGFjcGlfZ2JsX2ZuX2VudHJ5X3N0ciwgcG9pbnRlcik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfdXRfdHJhY2Vfc3RyCisgKgorICogUEFSQU1FVEVSUzogIGxpbmVfbnVtYmVyICAgICAgICAgLSBDYWxsZXIncyBsaW5lIG51bWJlcgorICogICAgICAgICAgICAgIGZ1bmN0aW9uX25hbWUgICAgICAgLSBDYWxsZXIncyBwcm9jZWR1cmUgbmFtZQorICogICAgICAgICAgICAgIG1vZHVsZV9uYW1lICAgICAgICAgLSBDYWxsZXIncyBtb2R1bGUgbmFtZQorICogICAgICAgICAgICAgIGNvbXBvbmVudF9pZCAgICAgICAgLSBDYWxsZXIncyBjb21wb25lbnQgSUQKKyAqICAgICAgICAgICAgICBTdHJpbmcgICAgICAgICAgICAgIC0gQWRkaXRpb25hbCBzdHJpbmcgdG8gZGlzcGxheQorICoKKyAqIFJFVFVSTjogICAgICBOb25lCisgKgorICogREVTQ1JJUFRJT046IEZ1bmN0aW9uIGVudHJ5IHRyYWNlLiAgUHJpbnRzIG9ubHkgaWYgVFJBQ0VfRlVOQ1RJT05TIGJpdCBpcworICogICAgICAgICAgICAgIHNldCBpbiBkZWJ1Z19sZXZlbAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQKK2FjcGlfdXRfdHJhY2Vfc3RyKHUzMiBsaW5lX251bWJlciwKKwkJICBjb25zdCBjaGFyICpmdW5jdGlvbl9uYW1lLAorCQkgIGNvbnN0IGNoYXIgKm1vZHVsZV9uYW1lLCB1MzIgY29tcG9uZW50X2lkLCBjaGFyICpzdHJpbmcpCit7CisKKwlhY3BpX2dibF9uZXN0aW5nX2xldmVsKys7CisJYWNwaV91dF90cmFja19zdGFja19wdHIoKTsKKworCWFjcGlfZGVidWdfcHJpbnQoQUNQSV9MVl9GVU5DVElPTlMsCisJCQkgbGluZV9udW1iZXIsIGZ1bmN0aW9uX25hbWUsIG1vZHVsZV9uYW1lLCBjb21wb25lbnRfaWQsCisJCQkgIiVzICVzXG4iLCBhY3BpX2dibF9mbl9lbnRyeV9zdHIsIHN0cmluZyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfdXRfdHJhY2VfdTMyCisgKgorICogUEFSQU1FVEVSUzogIGxpbmVfbnVtYmVyICAgICAgICAgLSBDYWxsZXIncyBsaW5lIG51bWJlcgorICogICAgICAgICAgICAgIGZ1bmN0aW9uX25hbWUgICAgICAgLSBDYWxsZXIncyBwcm9jZWR1cmUgbmFtZQorICogICAgICAgICAgICAgIG1vZHVsZV9uYW1lICAgICAgICAgLSBDYWxsZXIncyBtb2R1bGUgbmFtZQorICogICAgICAgICAgICAgIGNvbXBvbmVudF9pZCAgICAgICAgLSBDYWxsZXIncyBjb21wb25lbnQgSUQKKyAqICAgICAgICAgICAgICBJbnRlZ2VyICAgICAgICAgICAgIC0gSW50ZWdlciB0byBkaXNwbGF5CisgKgorICogUkVUVVJOOiAgICAgIE5vbmUKKyAqCisgKiBERVNDUklQVElPTjogRnVuY3Rpb24gZW50cnkgdHJhY2UuICBQcmludHMgb25seSBpZiBUUkFDRV9GVU5DVElPTlMgYml0IGlzCisgKiAgICAgICAgICAgICAgc2V0IGluIGRlYnVnX2xldmVsCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZAorYWNwaV91dF90cmFjZV91MzIodTMyIGxpbmVfbnVtYmVyLAorCQkgIGNvbnN0IGNoYXIgKmZ1bmN0aW9uX25hbWUsCisJCSAgY29uc3QgY2hhciAqbW9kdWxlX25hbWUsIHUzMiBjb21wb25lbnRfaWQsIHUzMiBpbnRlZ2VyKQoreworCisJYWNwaV9nYmxfbmVzdGluZ19sZXZlbCsrOworCWFjcGlfdXRfdHJhY2tfc3RhY2tfcHRyKCk7CisKKwlhY3BpX2RlYnVnX3ByaW50KEFDUElfTFZfRlVOQ1RJT05TLAorCQkJIGxpbmVfbnVtYmVyLCBmdW5jdGlvbl9uYW1lLCBtb2R1bGVfbmFtZSwgY29tcG9uZW50X2lkLAorCQkJICIlcyAlMDhYXG4iLCBhY3BpX2dibF9mbl9lbnRyeV9zdHIsIGludGVnZXIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X2V4aXQKKyAqCisgKiBQQVJBTUVURVJTOiAgbGluZV9udW1iZXIgICAgICAgICAtIENhbGxlcidzIGxpbmUgbnVtYmVyCisgKiAgICAgICAgICAgICAgZnVuY3Rpb25fbmFtZSAgICAgICAtIENhbGxlcidzIHByb2NlZHVyZSBuYW1lCisgKiAgICAgICAgICAgICAgbW9kdWxlX25hbWUgICAgICAgICAtIENhbGxlcidzIG1vZHVsZSBuYW1lCisgKiAgICAgICAgICAgICAgY29tcG9uZW50X2lkICAgICAgICAtIENhbGxlcidzIGNvbXBvbmVudCBJRAorICoKKyAqIFJFVFVSTjogICAgICBOb25lCisgKgorICogREVTQ1JJUFRJT046IEZ1bmN0aW9uIGV4aXQgdHJhY2UuICBQcmludHMgb25seSBpZiBUUkFDRV9GVU5DVElPTlMgYml0IGlzCisgKiAgICAgICAgICAgICAgc2V0IGluIGRlYnVnX2xldmVsCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZAorYWNwaV91dF9leGl0KHUzMiBsaW5lX251bWJlciwKKwkgICAgIGNvbnN0IGNoYXIgKmZ1bmN0aW9uX25hbWUsCisJICAgICBjb25zdCBjaGFyICptb2R1bGVfbmFtZSwgdTMyIGNvbXBvbmVudF9pZCkKK3sKKworCWFjcGlfZGVidWdfcHJpbnQoQUNQSV9MVl9GVU5DVElPTlMsCisJCQkgbGluZV9udW1iZXIsIGZ1bmN0aW9uX25hbWUsIG1vZHVsZV9uYW1lLCBjb21wb25lbnRfaWQsCisJCQkgIiVzXG4iLCBhY3BpX2dibF9mbl9leGl0X3N0cik7CisKKwlhY3BpX2dibF9uZXN0aW5nX2xldmVsLS07Cit9CisKK0FDUElfRVhQT1JUX1NZTUJPTChhY3BpX3V0X2V4aXQpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfdXRfc3RhdHVzX2V4aXQKKyAqCisgKiBQQVJBTUVURVJTOiAgbGluZV9udW1iZXIgICAgICAgICAtIENhbGxlcidzIGxpbmUgbnVtYmVyCisgKiAgICAgICAgICAgICAgZnVuY3Rpb25fbmFtZSAgICAgICAtIENhbGxlcidzIHByb2NlZHVyZSBuYW1lCisgKiAgICAgICAgICAgICAgbW9kdWxlX25hbWUgICAgICAgICAtIENhbGxlcidzIG1vZHVsZSBuYW1lCisgKiAgICAgICAgICAgICAgY29tcG9uZW50X2lkICAgICAgICAtIENhbGxlcidzIGNvbXBvbmVudCBJRAorICogICAgICAgICAgICAgIFN0YXR1cyAgICAgICAgICAgICAgLSBFeGl0IHN0YXR1cyBjb2RlCisgKgorICogUkVUVVJOOiAgICAgIE5vbmUKKyAqCisgKiBERVNDUklQVElPTjogRnVuY3Rpb24gZXhpdCB0cmFjZS4gIFByaW50cyBvbmx5IGlmIFRSQUNFX0ZVTkNUSU9OUyBiaXQgaXMKKyAqICAgICAgICAgICAgICBzZXQgaW4gZGVidWdfbGV2ZWwuIFByaW50cyBleGl0IHN0YXR1cyBhbHNvLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkCithY3BpX3V0X3N0YXR1c19leGl0KHUzMiBsaW5lX251bWJlciwKKwkJICAgIGNvbnN0IGNoYXIgKmZ1bmN0aW9uX25hbWUsCisJCSAgICBjb25zdCBjaGFyICptb2R1bGVfbmFtZSwKKwkJICAgIHUzMiBjb21wb25lbnRfaWQsIGFjcGlfc3RhdHVzIHN0YXR1cykKK3sKKworCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkgeworCQlhY3BpX2RlYnVnX3ByaW50KEFDUElfTFZfRlVOQ1RJT05TLAorCQkJCSBsaW5lX251bWJlciwgZnVuY3Rpb25fbmFtZSwgbW9kdWxlX25hbWUsCisJCQkJIGNvbXBvbmVudF9pZCwgIiVzICVzXG4iLCBhY3BpX2dibF9mbl9leGl0X3N0ciwKKwkJCQkgYWNwaV9mb3JtYXRfZXhjZXB0aW9uKHN0YXR1cykpOworCX0gZWxzZSB7CisJCWFjcGlfZGVidWdfcHJpbnQoQUNQSV9MVl9GVU5DVElPTlMsCisJCQkJIGxpbmVfbnVtYmVyLCBmdW5jdGlvbl9uYW1lLCBtb2R1bGVfbmFtZSwKKwkJCQkgY29tcG9uZW50X2lkLCAiJXMgKioqKkV4Y2VwdGlvbioqKio6ICVzXG4iLAorCQkJCSBhY3BpX2dibF9mbl9leGl0X3N0ciwKKwkJCQkgYWNwaV9mb3JtYXRfZXhjZXB0aW9uKHN0YXR1cykpOworCX0KKworCWFjcGlfZ2JsX25lc3RpbmdfbGV2ZWwtLTsKK30KKworQUNQSV9FWFBPUlRfU1lNQk9MKGFjcGlfdXRfc3RhdHVzX2V4aXQpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfdXRfdmFsdWVfZXhpdAorICoKKyAqIFBBUkFNRVRFUlM6ICBsaW5lX251bWJlciAgICAgICAgIC0gQ2FsbGVyJ3MgbGluZSBudW1iZXIKKyAqICAgICAgICAgICAgICBmdW5jdGlvbl9uYW1lICAgICAgIC0gQ2FsbGVyJ3MgcHJvY2VkdXJlIG5hbWUKKyAqICAgICAgICAgICAgICBtb2R1bGVfbmFtZSAgICAgICAgIC0gQ2FsbGVyJ3MgbW9kdWxlIG5hbWUKKyAqICAgICAgICAgICAgICBjb21wb25lbnRfaWQgICAgICAgIC0gQ2FsbGVyJ3MgY29tcG9uZW50IElECisgKiAgICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgICAtIFZhbHVlIHRvIGJlIHByaW50ZWQgd2l0aCBleGl0IG1zZworICoKKyAqIFJFVFVSTjogICAgICBOb25lCisgKgorICogREVTQ1JJUFRJT046IEZ1bmN0aW9uIGV4aXQgdHJhY2UuICBQcmludHMgb25seSBpZiBUUkFDRV9GVU5DVElPTlMgYml0IGlzCisgKiAgICAgICAgICAgICAgc2V0IGluIGRlYnVnX2xldmVsLiBQcmludHMgZXhpdCB2YWx1ZSBhbHNvLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkCithY3BpX3V0X3ZhbHVlX2V4aXQodTMyIGxpbmVfbnVtYmVyLAorCQkgICBjb25zdCBjaGFyICpmdW5jdGlvbl9uYW1lLAorCQkgICBjb25zdCBjaGFyICptb2R1bGVfbmFtZSwKKwkJICAgdTMyIGNvbXBvbmVudF9pZCwgYWNwaV9pbnRlZ2VyIHZhbHVlKQoreworCisJYWNwaV9kZWJ1Z19wcmludChBQ1BJX0xWX0ZVTkNUSU9OUywKKwkJCSBsaW5lX251bWJlciwgZnVuY3Rpb25fbmFtZSwgbW9kdWxlX25hbWUsIGNvbXBvbmVudF9pZCwKKwkJCSAiJXMgJTguOFglOC44WFxuIiwgYWNwaV9nYmxfZm5fZXhpdF9zdHIsCisJCQkgQUNQSV9GT1JNQVRfVUlOVDY0KHZhbHVlKSk7CisKKwlhY3BpX2dibF9uZXN0aW5nX2xldmVsLS07Cit9CisKK0FDUElfRVhQT1JUX1NZTUJPTChhY3BpX3V0X3ZhbHVlX2V4aXQpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfdXRfcHRyX2V4aXQKKyAqCisgKiBQQVJBTUVURVJTOiAgbGluZV9udW1iZXIgICAgICAgICAtIENhbGxlcidzIGxpbmUgbnVtYmVyCisgKiAgICAgICAgICAgICAgZnVuY3Rpb25fbmFtZSAgICAgICAtIENhbGxlcidzIHByb2NlZHVyZSBuYW1lCisgKiAgICAgICAgICAgICAgbW9kdWxlX25hbWUgICAgICAgICAtIENhbGxlcidzIG1vZHVsZSBuYW1lCisgKiAgICAgICAgICAgICAgY29tcG9uZW50X2lkICAgICAgICAtIENhbGxlcidzIGNvbXBvbmVudCBJRAorICogICAgICAgICAgICAgIFB0ciAgICAgICAgICAgICAgICAgLSBQb2ludGVyIHRvIGRpc3BsYXkKKyAqCisgKiBSRVRVUk46ICAgICAgTm9uZQorICoKKyAqIERFU0NSSVBUSU9OOiBGdW5jdGlvbiBleGl0IHRyYWNlLiAgUHJpbnRzIG9ubHkgaWYgVFJBQ0VfRlVOQ1RJT05TIGJpdCBpcworICogICAgICAgICAgICAgIHNldCBpbiBkZWJ1Z19sZXZlbC4gUHJpbnRzIGV4aXQgdmFsdWUgYWxzby4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZAorYWNwaV91dF9wdHJfZXhpdCh1MzIgbGluZV9udW1iZXIsCisJCSBjb25zdCBjaGFyICpmdW5jdGlvbl9uYW1lLAorCQkgY29uc3QgY2hhciAqbW9kdWxlX25hbWUsIHUzMiBjb21wb25lbnRfaWQsIHU4ICpwdHIpCit7CisKKwlhY3BpX2RlYnVnX3ByaW50KEFDUElfTFZfRlVOQ1RJT05TLAorCQkJIGxpbmVfbnVtYmVyLCBmdW5jdGlvbl9uYW1lLCBtb2R1bGVfbmFtZSwgY29tcG9uZW50X2lkLAorCQkJICIlcyAlcFxuIiwgYWNwaV9nYmxfZm5fZXhpdF9zdHIsIHB0cik7CisKKwlhY3BpX2dibF9uZXN0aW5nX2xldmVsLS07Cit9CisKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X2R1bXBfYnVmZmVyCisgKgorICogUEFSQU1FVEVSUzogIEJ1ZmZlciAgICAgICAgICAgICAgLSBCdWZmZXIgdG8gZHVtcAorICogICAgICAgICAgICAgIENvdW50ICAgICAgICAgICAgICAgLSBBbW91bnQgdG8gZHVtcCwgaW4gYnl0ZXMKKyAqICAgICAgICAgICAgICBEaXNwbGF5ICAgICAgICAgICAgIC0gQllURSwgV09SRCwgRFdPUkQsIG9yIFFXT1JEIGRpc3BsYXkKKyAqICAgICAgICAgICAgICBjb21wb25lbnRfaUQgICAgICAgIC0gQ2FsbGVyJ3MgY29tcG9uZW50IElECisgKgorICogUkVUVVJOOiAgICAgIE5vbmUKKyAqCisgKiBERVNDUklQVElPTjogR2VuZXJpYyBkdW1wIGJ1ZmZlciBpbiBib3RoIGhleCBhbmQgYXNjaWkuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBhY3BpX3V0X2R1bXBfYnVmZmVyMih1OCAqIGJ1ZmZlciwgdTMyIGNvdW50LCB1MzIgZGlzcGxheSkKK3sKKwl1MzIgaSA9IDA7CisJdTMyIGo7CisJdTMyIHRlbXAzMjsKKwl1OCBidWZfY2hhcjsKKworCWlmICghYnVmZmVyKSB7CisJCWFjcGlfb3NfcHJpbnRmKCJOdWxsIEJ1ZmZlciBQb2ludGVyIGluIER1bXBCdWZmZXIhXG4iKTsKKwkJcmV0dXJuOworCX0KKworCWlmICgoY291bnQgPCA0KSB8fCAoY291bnQgJiAweDAxKSkgeworCQlkaXNwbGF5ID0gREJfQllURV9ESVNQTEFZOworCX0KKworCS8qIE5hc3R5IGxpdHRsZSBkdW1wIGJ1ZmZlciByb3V0aW5lISAqLworCisJd2hpbGUgKGkgPCBjb3VudCkgeworCisJCS8qIFByaW50IGN1cnJlbnQgb2Zmc2V0ICovCisKKwkJYWNwaV9vc19wcmludGYoIiU2LjRYOiAiLCBpKTsKKworCQkvKiBQcmludCAxNiBoZXggY2hhcnMgKi8KKworCQlmb3IgKGogPSAwOyBqIDwgMTY7KSB7CisJCQlpZiAoaSArIGogPj0gY291bnQpIHsKKworCQkJCS8qIER1bXAgZmlsbCBzcGFjZXMgKi8KKworCQkJCWFjcGlfb3NfcHJpbnRmKCIlKnMiLCAoKGRpc3BsYXkgKiAyKSArIDEpLCAiICIpOworCQkJCWogKz0gZGlzcGxheTsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJc3dpdGNoIChkaXNwbGF5KSB7CisJCQljYXNlIERCX0JZVEVfRElTUExBWToKKwkJCWRlZmF1bHQ6CS8qIERlZmF1bHQgaXMgQllURSBkaXNwbGF5ICovCisKKwkJCQlhY3BpX29zX3ByaW50ZigiJTAyWCAiLAorCQkJCQkgICAgICAgYnVmZmVyWyhhY3BpX3NpemUpIGkgKyBqXSk7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgREJfV09SRF9ESVNQTEFZOgorCisJCQkJQUNQSV9NT1ZFXzE2X1RPXzMyKCZ0ZW1wMzIsCisJCQkJCQkgICAmYnVmZmVyWyhhY3BpX3NpemUpIGkgKyBqXSk7CisJCQkJYWNwaV9vc19wcmludGYoIiUwNFggIiwgdGVtcDMyKTsKKwkJCQlicmVhazsKKworCQkJY2FzZSBEQl9EV09SRF9ESVNQTEFZOgorCisJCQkJQUNQSV9NT1ZFXzMyX1RPXzMyKCZ0ZW1wMzIsCisJCQkJCQkgICAmYnVmZmVyWyhhY3BpX3NpemUpIGkgKyBqXSk7CisJCQkJYWNwaV9vc19wcmludGYoIiUwOFggIiwgdGVtcDMyKTsKKwkJCQlicmVhazsKKworCQkJY2FzZSBEQl9RV09SRF9ESVNQTEFZOgorCisJCQkJQUNQSV9NT1ZFXzMyX1RPXzMyKCZ0ZW1wMzIsCisJCQkJCQkgICAmYnVmZmVyWyhhY3BpX3NpemUpIGkgKyBqXSk7CisJCQkJYWNwaV9vc19wcmludGYoIiUwOFgiLCB0ZW1wMzIpOworCisJCQkJQUNQSV9NT1ZFXzMyX1RPXzMyKCZ0ZW1wMzIsCisJCQkJCQkgICAmYnVmZmVyWyhhY3BpX3NpemUpIGkgKyBqICsKKwkJCQkJCQkgICA0XSk7CisJCQkJYWNwaV9vc19wcmludGYoIiUwOFggIiwgdGVtcDMyKTsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJaiArPSBkaXNwbGF5OworCQl9CisKKwkJLyoKKwkJICogUHJpbnQgdGhlIEFTQ0lJIGVxdWl2YWxlbnQgY2hhcmFjdGVycyBidXQgd2F0Y2ggb3V0IGZvciB0aGUgYmFkCisJCSAqIHVucHJpbnRhYmxlIG9uZXMgKHByaW50YWJsZSBjaGFycyBhcmUgMHgyMCB0aHJvdWdoIDB4N0UpCisJCSAqLworCQlhY3BpX29zX3ByaW50ZigiICIpOworCQlmb3IgKGogPSAwOyBqIDwgMTY7IGorKykgeworCQkJaWYgKGkgKyBqID49IGNvdW50KSB7CisJCQkJYWNwaV9vc19wcmludGYoIlxuIik7CisJCQkJcmV0dXJuOworCQkJfQorCisJCQlidWZfY2hhciA9IGJ1ZmZlclsoYWNwaV9zaXplKSBpICsgal07CisJCQlpZiAoQUNQSV9JU19QUklOVChidWZfY2hhcikpIHsKKwkJCQlhY3BpX29zX3ByaW50ZigiJWMiLCBidWZfY2hhcik7CisJCQl9IGVsc2UgeworCQkJCWFjcGlfb3NfcHJpbnRmKCIuIik7CisJCQl9CisJCX0KKworCQkvKiBEb25lIHdpdGggdGhhdCBsaW5lLiAqLworCisJCWFjcGlfb3NfcHJpbnRmKCJcbiIpOworCQlpICs9IDE2OworCX0KKworCXJldHVybjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV91dF9kdW1wX2J1ZmZlcgorICoKKyAqIFBBUkFNRVRFUlM6ICBCdWZmZXIgICAgICAgICAgICAgIC0gQnVmZmVyIHRvIGR1bXAKKyAqICAgICAgICAgICAgICBDb3VudCAgICAgICAgICAgICAgIC0gQW1vdW50IHRvIGR1bXAsIGluIGJ5dGVzCisgKiAgICAgICAgICAgICAgRGlzcGxheSAgICAgICAgICAgICAtIEJZVEUsIFdPUkQsIERXT1JELCBvciBRV09SRCBkaXNwbGF5CisgKiAgICAgICAgICAgICAgY29tcG9uZW50X2lEICAgICAgICAtIENhbGxlcidzIGNvbXBvbmVudCBJRAorICoKKyAqIFJFVFVSTjogICAgICBOb25lCisgKgorICogREVTQ1JJUFRJT046IEdlbmVyaWMgZHVtcCBidWZmZXIgaW4gYm90aCBoZXggYW5kIGFzY2lpLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgYWNwaV91dF9kdW1wX2J1ZmZlcih1OCAqIGJ1ZmZlciwgdTMyIGNvdW50LCB1MzIgZGlzcGxheSwgdTMyIGNvbXBvbmVudF9pZCkKK3sKKworCS8qIE9ubHkgZHVtcCB0aGUgYnVmZmVyIGlmIHRyYWNpbmcgaXMgZW5hYmxlZCAqLworCisJaWYgKCEoKEFDUElfTFZfVEFCTEVTICYgYWNwaV9kYmdfbGV2ZWwpICYmCisJICAgICAgKGNvbXBvbmVudF9pZCAmIGFjcGlfZGJnX2xheWVyKSkpIHsKKwkJcmV0dXJuOworCX0KKworCWFjcGlfdXRfZHVtcF9idWZmZXIyKGJ1ZmZlciwgY291bnQsIGRpc3BsYXkpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS91dGRlbGV0ZS5jIGIvZHJpdmVycy9hY3BpL2FjcGljYS91dGRlbGV0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwYmU5ZTMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL3V0ZGVsZXRlLmMKQEAgLTAsMCArMSw2NzcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogTW9kdWxlIE5hbWU6IHV0ZGVsZXRlIC0gb2JqZWN0IGRlbGV0aW9uIGFuZCByZWZlcmVuY2UgY291bnQgdXRpbGl0aWVzCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDgsIEludGVsIENvcnAuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCisgKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSBhdCBtaW5pbXVtIGEgZGlzY2xhaW1lcgorICogICAgc3Vic3RhbnRpYWxseSBzaW1pbGFyIHRvIHRoZSAiTk8gV0FSUkFOVFkiIGRpc2NsYWltZXIgYmVsb3cKKyAqICAgICgiRGlzY2xhaW1lciIpIGFuZCBhbnkgcmVkaXN0cmlidXRpb24gbXVzdCBiZSBjb25kaXRpb25lZCB1cG9uCisgKiAgICBpbmNsdWRpbmcgYSBzdWJzdGFudGlhbGx5IHNpbWlsYXIgRGlzY2xhaW1lciByZXF1aXJlbWVudCBmb3IgZnVydGhlcgorICogICAgYmluYXJ5IHJlZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzCisgKiAgICBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIE5PIFdBUlJBTlRZCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORworICogSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCisgKi8KKworI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgorI2luY2x1ZGUgImFjY29tbW9uLmgiCisjaW5jbHVkZSAiYWNpbnRlcnAuaCIKKyNpbmNsdWRlICJhY25hbWVzcC5oIgorI2luY2x1ZGUgImFjZXZlbnRzLmgiCisKKyNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX1VUSUxJVElFUworQUNQSV9NT0RVTEVfTkFNRSgidXRkZWxldGUiKQorCisvKiBMb2NhbCBwcm90b3R5cGVzICovCitzdGF0aWMgdm9pZCBhY3BpX3V0X2RlbGV0ZV9pbnRlcm5hbF9vYmoodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqZWN0KTsKKworc3RhdGljIHZvaWQKK2FjcGlfdXRfdXBkYXRlX3JlZl9jb3VudCh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmplY3QsIHUzMiBhY3Rpb24pOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X2RlbGV0ZV9pbnRlcm5hbF9vYmoKKyAqCisgKiBQQVJBTUVURVJTOiAgT2JqZWN0ICAgICAgICAgLSBPYmplY3QgdG8gYmUgZGVsZXRlZAorICoKKyAqIFJFVFVSTjogICAgICBOb25lCisgKgorICogREVTQ1JJUFRJT046IExvdyBsZXZlbCBvYmplY3QgZGVsZXRpb24sIGFmdGVyIHJlZmVyZW5jZSBjb3VudHMgaGF2ZSBiZWVuCisgKiAgICAgICAgICAgICAgdXBkYXRlZCAoQWxsIHJlZmVyZW5jZSBjb3VudHMsIGluY2x1ZGluZyBzdWItb2JqZWN0cyEpCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQgYWNwaV91dF9kZWxldGVfaW50ZXJuYWxfb2JqKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9iamVjdCkKK3sKKwl2b2lkICpvYmpfcG9pbnRlciA9IE5VTEw7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqaGFuZGxlcl9kZXNjOworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnNlY29uZF9kZXNjOworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm5leHRfZGVzYzsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKHV0X2RlbGV0ZV9pbnRlcm5hbF9vYmosIG9iamVjdCk7CisKKwlpZiAoIW9iamVjdCkgeworCQlyZXR1cm5fVk9JRDsKKwl9CisKKwkvKgorCSAqIE11c3QgZGVsZXRlIG9yIGZyZWUgYW55IHBvaW50ZXJzIHdpdGhpbiB0aGUgb2JqZWN0IHRoYXQgYXJlIG5vdAorCSAqIGFjdHVhbCBBQ1BJIG9iamVjdHMgKGZvciBleGFtcGxlLCBhIHJhdyBidWZmZXIgcG9pbnRlcikuCisJICovCisJc3dpdGNoIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRShvYmplY3QpKSB7CisJY2FzZSBBQ1BJX1RZUEVfU1RSSU5HOgorCisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfQUxMT0NBVElPTlMsCisJCQkJICAiKioqKiBTdHJpbmcgJXAsIHB0ciAlcFxuIiwgb2JqZWN0LAorCQkJCSAgb2JqZWN0LT5zdHJpbmcucG9pbnRlcikpOworCisJCS8qIEZyZWUgdGhlIGFjdHVhbCBzdHJpbmcgYnVmZmVyICovCisKKwkJaWYgKCEob2JqZWN0LT5jb21tb24uZmxhZ3MgJiBBT1BPQkpfU1RBVElDX1BPSU5URVIpKSB7CisKKwkJCS8qIEJ1dCBvbmx5IGlmIGl0IGlzIE5PVCBhIHBvaW50ZXIgaW50byBhbiBBQ1BJIHRhYmxlICovCisKKwkJCW9ial9wb2ludGVyID0gb2JqZWN0LT5zdHJpbmcucG9pbnRlcjsKKwkJfQorCQlicmVhazsKKworCWNhc2UgQUNQSV9UWVBFX0JVRkZFUjoKKworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0FMTE9DQVRJT05TLAorCQkJCSAgIioqKiogQnVmZmVyICVwLCBwdHIgJXBcbiIsIG9iamVjdCwKKwkJCQkgIG9iamVjdC0+YnVmZmVyLnBvaW50ZXIpKTsKKworCQkvKiBGcmVlIHRoZSBhY3R1YWwgYnVmZmVyICovCisKKwkJaWYgKCEob2JqZWN0LT5jb21tb24uZmxhZ3MgJiBBT1BPQkpfU1RBVElDX1BPSU5URVIpKSB7CisKKwkJCS8qIEJ1dCBvbmx5IGlmIGl0IGlzIE5PVCBhIHBvaW50ZXIgaW50byBhbiBBQ1BJIHRhYmxlICovCisKKwkJCW9ial9wb2ludGVyID0gb2JqZWN0LT5idWZmZXIucG9pbnRlcjsKKwkJfQorCQlicmVhazsKKworCWNhc2UgQUNQSV9UWVBFX1BBQ0tBR0U6CisKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9BTExPQ0FUSU9OUywKKwkJCQkgICIgKioqKiBQYWNrYWdlIG9mIGNvdW50ICVYXG4iLAorCQkJCSAgb2JqZWN0LT5wYWNrYWdlLmNvdW50KSk7CisKKwkJLyoKKwkJICogRWxlbWVudHMgb2YgdGhlIHBhY2thZ2UgYXJlIG5vdCBoYW5kbGVkIGhlcmUsIHRoZXkgYXJlIGRlbGV0ZWQKKwkJICogc2VwYXJhdGVseQorCQkgKi8KKworCQkvKiBGcmVlIHRoZSAodmFyaWFibGUgbGVuZ3RoKSBlbGVtZW50IHBvaW50ZXIgYXJyYXkgKi8KKworCQlvYmpfcG9pbnRlciA9IG9iamVjdC0+cGFja2FnZS5lbGVtZW50czsKKwkJYnJlYWs7CisKKwkJLyoKKwkJICogVGhlc2Ugb2JqZWN0cyBoYXZlIGEgcG9zc2libGUgbGlzdCBvZiBub3RpZnkgaGFuZGxlcnMuCisJCSAqIERldmljZSBvYmplY3QgYWxzbyBtYXkgaGF2ZSBhIEdQRSBibG9jay4KKwkJICovCisJY2FzZSBBQ1BJX1RZUEVfREVWSUNFOgorCisJCWlmIChvYmplY3QtPmRldmljZS5ncGVfYmxvY2spIHsKKwkJCSh2b2lkKWFjcGlfZXZfZGVsZXRlX2dwZV9ibG9jayhvYmplY3QtPmRldmljZS4KKwkJCQkJCSAgICAgICBncGVfYmxvY2spOworCQl9CisKKwkJLypsaW50IC1mYWxsdGhyb3VnaCAqLworCisJY2FzZSBBQ1BJX1RZUEVfUFJPQ0VTU09SOgorCWNhc2UgQUNQSV9UWVBFX1RIRVJNQUw6CisKKwkJLyogV2FsayB0aGUgbm90aWZ5IGhhbmRsZXIgbGlzdCBmb3IgdGhpcyBvYmplY3QgKi8KKworCQloYW5kbGVyX2Rlc2MgPSBvYmplY3QtPmNvbW1vbl9ub3RpZnkuaGFuZGxlcjsKKwkJd2hpbGUgKGhhbmRsZXJfZGVzYykgeworCQkJbmV4dF9kZXNjID0gaGFuZGxlcl9kZXNjLT5hZGRyZXNzX3NwYWNlLm5leHQ7CisJCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UoaGFuZGxlcl9kZXNjKTsKKwkJCWhhbmRsZXJfZGVzYyA9IG5leHRfZGVzYzsKKwkJfQorCQlicmVhazsKKworCWNhc2UgQUNQSV9UWVBFX01VVEVYOgorCisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfQUxMT0NBVElPTlMsCisJCQkJICAiKioqKiogTXV0ZXggJXAsIE9TIE11dGV4ICVwXG4iLAorCQkJCSAgb2JqZWN0LCBvYmplY3QtPm11dGV4Lm9zX211dGV4KSk7CisKKwkJaWYgKG9iamVjdCA9PSBhY3BpX2dibF9nbG9iYWxfbG9ja19tdXRleCkgeworCisJCQkvKiBHbG9iYWwgTG9jayBoYXMgZXh0cmEgc2VtYXBob3JlICovCisKKwkJCSh2b2lkKQorCQkJICAgIGFjcGlfb3NfZGVsZXRlX3NlbWFwaG9yZQorCQkJICAgIChhY3BpX2dibF9nbG9iYWxfbG9ja19zZW1hcGhvcmUpOworCQkJYWNwaV9nYmxfZ2xvYmFsX2xvY2tfc2VtYXBob3JlID0gTlVMTDsKKworCQkJYWNwaV9vc19kZWxldGVfbXV0ZXgob2JqZWN0LT5tdXRleC5vc19tdXRleCk7CisJCQlhY3BpX2dibF9nbG9iYWxfbG9ja19tdXRleCA9IE5VTEw7CisJCX0gZWxzZSB7CisJCQlhY3BpX2V4X3VubGlua19tdXRleChvYmplY3QpOworCQkJYWNwaV9vc19kZWxldGVfbXV0ZXgob2JqZWN0LT5tdXRleC5vc19tdXRleCk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIEFDUElfVFlQRV9FVkVOVDoKKworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0FMTE9DQVRJT05TLAorCQkJCSAgIioqKioqIEV2ZW50ICVwLCBPUyBTZW1hcGhvcmUgJXBcbiIsCisJCQkJICBvYmplY3QsIG9iamVjdC0+ZXZlbnQub3Nfc2VtYXBob3JlKSk7CisKKwkJKHZvaWQpYWNwaV9vc19kZWxldGVfc2VtYXBob3JlKG9iamVjdC0+ZXZlbnQub3Nfc2VtYXBob3JlKTsKKwkJb2JqZWN0LT5ldmVudC5vc19zZW1hcGhvcmUgPSBOVUxMOworCQlicmVhazsKKworCWNhc2UgQUNQSV9UWVBFX01FVEhPRDoKKworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0FMTE9DQVRJT05TLAorCQkJCSAgIioqKioqIE1ldGhvZCAlcFxuIiwgb2JqZWN0KSk7CisKKwkJLyogRGVsZXRlIHRoZSBtZXRob2QgbXV0ZXggaWYgaXQgZXhpc3RzICovCisKKwkJaWYgKG9iamVjdC0+bWV0aG9kLm11dGV4KSB7CisJCQlhY3BpX29zX2RlbGV0ZV9tdXRleChvYmplY3QtPm1ldGhvZC5tdXRleC0+bXV0ZXguCisJCQkJCSAgICAgb3NfbXV0ZXgpOworCQkJYWNwaV91dF9kZWxldGVfb2JqZWN0X2Rlc2Mob2JqZWN0LT5tZXRob2QubXV0ZXgpOworCQkJb2JqZWN0LT5tZXRob2QubXV0ZXggPSBOVUxMOworCQl9CisJCWJyZWFrOworCisJY2FzZSBBQ1BJX1RZUEVfUkVHSU9OOgorCisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfQUxMT0NBVElPTlMsCisJCQkJICAiKioqKiogUmVnaW9uICVwXG4iLCBvYmplY3QpKTsKKworCQlzZWNvbmRfZGVzYyA9IGFjcGlfbnNfZ2V0X3NlY29uZGFyeV9vYmplY3Qob2JqZWN0KTsKKwkJaWYgKHNlY29uZF9kZXNjKSB7CisJCQkvKgorCQkJICogRnJlZSB0aGUgcmVnaW9uX2NvbnRleHQgaWYgYW5kIG9ubHkgaWYgdGhlIGhhbmRsZXIgaXMgb25lIG9mIHRoZQorCQkJICogZGVmYXVsdCBoYW5kbGVycyAtLSBhbmQgdGhlcmVmb3JlLCB3ZSBjcmVhdGVkIHRoZSBjb250ZXh0IG9iamVjdAorCQkJICogbG9jYWxseSwgaXQgd2FzIG5vdCBjcmVhdGVkIGJ5IGFuIGV4dGVybmFsIGNhbGxlci4KKwkJCSAqLworCQkJaGFuZGxlcl9kZXNjID0gb2JqZWN0LT5yZWdpb24uaGFuZGxlcjsKKwkJCWlmIChoYW5kbGVyX2Rlc2MpIHsKKwkJCQlpZiAoaGFuZGxlcl9kZXNjLT5hZGRyZXNzX3NwYWNlLmhhbmRsZXJfZmxhZ3MgJgorCQkJCSAgICBBQ1BJX0FERFJfSEFORExFUl9ERUZBVUxUX0lOU1RBTExFRCkgeworCisJCQkJCS8qIERlYWN0aXZhdGUgcmVnaW9uIGFuZCBmcmVlIHJlZ2lvbiBjb250ZXh0ICovCisKKwkJCQkJaWYgKGhhbmRsZXJfZGVzYy0+YWRkcmVzc19zcGFjZS5zZXR1cCkgeworCQkJCQkJKHZvaWQpaGFuZGxlcl9kZXNjLT4KKwkJCQkJCSAgICBhZGRyZXNzX3NwYWNlLnNldHVwKG9iamVjdCwKKwkJCQkJCQkJCUFDUElfUkVHSU9OX0RFQUNUSVZBVEUsCisJCQkJCQkJCQloYW5kbGVyX2Rlc2MtPgorCQkJCQkJCQkJYWRkcmVzc19zcGFjZS4KKwkJCQkJCQkJCWNvbnRleHQsCisJCQkJCQkJCQkmc2Vjb25kX2Rlc2MtPgorCQkJCQkJCQkJZXh0cmEuCisJCQkJCQkJCQlyZWdpb25fY29udGV4dCk7CisJCQkJCX0KKwkJCQl9CisKKwkJCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UoaGFuZGxlcl9kZXNjKTsKKwkJCX0KKworCQkJLyogTm93IHdlIGNhbiBmcmVlIHRoZSBFeHRyYSBvYmplY3QgKi8KKworCQkJYWNwaV91dF9kZWxldGVfb2JqZWN0X2Rlc2Moc2Vjb25kX2Rlc2MpOworCQl9CisJCWJyZWFrOworCisJY2FzZSBBQ1BJX1RZUEVfQlVGRkVSX0ZJRUxEOgorCisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfQUxMT0NBVElPTlMsCisJCQkJICAiKioqKiogQnVmZmVyIEZpZWxkICVwXG4iLCBvYmplY3QpKTsKKworCQlzZWNvbmRfZGVzYyA9IGFjcGlfbnNfZ2V0X3NlY29uZGFyeV9vYmplY3Qob2JqZWN0KTsKKwkJaWYgKHNlY29uZF9kZXNjKSB7CisJCQlhY3BpX3V0X2RlbGV0ZV9vYmplY3RfZGVzYyhzZWNvbmRfZGVzYyk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIEFDUElfVFlQRV9MT0NBTF9CQU5LX0ZJRUxEOgorCisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfQUxMT0NBVElPTlMsCisJCQkJICAiKioqKiogQmFuayBGaWVsZCAlcFxuIiwgb2JqZWN0KSk7CisKKwkJc2Vjb25kX2Rlc2MgPSBhY3BpX25zX2dldF9zZWNvbmRhcnlfb2JqZWN0KG9iamVjdCk7CisJCWlmIChzZWNvbmRfZGVzYykgeworCQkJYWNwaV91dF9kZWxldGVfb2JqZWN0X2Rlc2Moc2Vjb25kX2Rlc2MpOworCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJLyogRnJlZSBhbnkgYWxsb2NhdGVkIG1lbW9yeSAocG9pbnRlciB3aXRoaW4gdGhlIG9iamVjdCkgZm91bmQgYWJvdmUgKi8KKworCWlmIChvYmpfcG9pbnRlcikgeworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0FMTE9DQVRJT05TLAorCQkJCSAgIkRlbGV0aW5nIE9iamVjdCBTdWJwdHIgJXBcbiIsIG9ial9wb2ludGVyKSk7CisJCUFDUElfRlJFRShvYmpfcG9pbnRlcik7CisJfQorCisJLyogTm93IHRoZSBvYmplY3QgY2FuIGJlIHNhZmVseSBkZWxldGVkICovCisKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0FMTE9DQVRJT05TLCAiRGVsZXRpbmcgT2JqZWN0ICVwIFslc11cbiIsCisJCQkgIG9iamVjdCwgYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZShvYmplY3QpKSk7CisKKwlhY3BpX3V0X2RlbGV0ZV9vYmplY3RfZGVzYyhvYmplY3QpOworCXJldHVybl9WT0lEOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X2RlbGV0ZV9pbnRlcm5hbF9vYmplY3RfbGlzdAorICoKKyAqIFBBUkFNRVRFUlM6ICBvYmpfbGlzdCAgICAgICAgLSBQb2ludGVyIHRvIHRoZSBsaXN0IHRvIGJlIGRlbGV0ZWQKKyAqCisgKiBSRVRVUk46ICAgICAgTm9uZQorICoKKyAqIERFU0NSSVBUSU9OOiBUaGlzIGZ1bmN0aW9uIGRlbGV0ZXMgYW4gaW50ZXJuYWwgb2JqZWN0IGxpc3QsIGluY2x1ZGluZyBib3RoCisgKiAgICAgICAgICAgICAgc2ltcGxlIG9iamVjdHMgYW5kIHBhY2thZ2Ugb2JqZWN0cworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgYWNwaV91dF9kZWxldGVfaW50ZXJuYWxfb2JqZWN0X2xpc3QodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKm9ial9saXN0KQoreworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKippbnRlcm5hbF9vYmo7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKHV0X2RlbGV0ZV9pbnRlcm5hbF9vYmplY3RfbGlzdCk7CisKKwkvKiBXYWxrIHRoZSBudWxsLXRlcm1pbmF0ZWQgaW50ZXJuYWwgbGlzdCAqLworCisJZm9yIChpbnRlcm5hbF9vYmogPSBvYmpfbGlzdDsgKmludGVybmFsX29iajsgaW50ZXJuYWxfb2JqKyspIHsKKwkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKCppbnRlcm5hbF9vYmopOworCX0KKworCS8qIEZyZWUgdGhlIGNvbWJpbmVkIHBhcmFtZXRlciBwb2ludGVyIGxpc3QgYW5kIG9iamVjdCBhcnJheSAqLworCisJQUNQSV9GUkVFKG9ial9saXN0KTsKKwlyZXR1cm5fVk9JRDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV91dF91cGRhdGVfcmVmX2NvdW50CisgKgorICogUEFSQU1FVEVSUzogIE9iamVjdCAgICAgICAgICAtIE9iamVjdCB3aG9zZSByZWYgY291bnQgaXMgdG8gYmUgdXBkYXRlZAorICogICAgICAgICAgICAgIEFjdGlvbiAgICAgICAgICAtIFdoYXQgdG8gZG8KKyAqCisgKiBSRVRVUk46ICAgICAgTmV3IHJlZiBjb3VudAorICoKKyAqIERFU0NSSVBUSU9OOiBNb2RpZnkgdGhlIHJlZiBjb3VudCBhbmQgcmV0dXJuIGl0LgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkCithY3BpX3V0X3VwZGF0ZV9yZWZfY291bnQodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqZWN0LCB1MzIgYWN0aW9uKQoreworCXUxNiBjb3VudDsKKwl1MTYgbmV3X2NvdW50OworCisJQUNQSV9GVU5DVElPTl9OQU1FKHV0X3VwZGF0ZV9yZWZfY291bnQpOworCisJaWYgKCFvYmplY3QpIHsKKwkJcmV0dXJuOworCX0KKworCWNvdW50ID0gb2JqZWN0LT5jb21tb24ucmVmZXJlbmNlX2NvdW50OworCW5ld19jb3VudCA9IGNvdW50OworCisJLyoKKwkgKiBQZXJmb3JtIHRoZSByZWZlcmVuY2UgY291bnQgYWN0aW9uIChpbmNyZW1lbnQsIGRlY3JlbWVudCwgZm9yY2UgZGVsZXRlKQorCSAqLworCXN3aXRjaCAoYWN0aW9uKSB7CisJY2FzZSBSRUZfSU5DUkVNRU5UOgorCisJCW5ld19jb3VudCsrOworCQlvYmplY3QtPmNvbW1vbi5yZWZlcmVuY2VfY291bnQgPSBuZXdfY291bnQ7CisKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9BTExPQ0FUSU9OUywKKwkJCQkgICJPYmogJXAgUmVmcz0lWCwgW0luY3JlbWVudGVkXVxuIiwKKwkJCQkgIG9iamVjdCwgbmV3X2NvdW50KSk7CisJCWJyZWFrOworCisJY2FzZSBSRUZfREVDUkVNRU5UOgorCisJCWlmIChjb3VudCA8IDEpIHsKKwkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfQUxMT0NBVElPTlMsCisJCQkJCSAgIk9iaiAlcCBSZWZzPSVYLCBjYW4ndCBkZWNyZW1lbnQhIChTZXQgdG8gMClcbiIsCisJCQkJCSAgb2JqZWN0LCBuZXdfY291bnQpKTsKKworCQkJbmV3X2NvdW50ID0gMDsKKwkJfSBlbHNlIHsKKwkJCW5ld19jb3VudC0tOworCisJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0FMTE9DQVRJT05TLAorCQkJCQkgICJPYmogJXAgUmVmcz0lWCwgW0RlY3JlbWVudGVkXVxuIiwKKwkJCQkJICBvYmplY3QsIG5ld19jb3VudCkpOworCQl9CisKKwkJaWYgKEFDUElfR0VUX09CSkVDVF9UWVBFKG9iamVjdCkgPT0gQUNQSV9UWVBFX01FVEhPRCkgeworCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9BTExPQ0FUSU9OUywKKwkJCQkJICAiTWV0aG9kIE9iaiAlcCBSZWZzPSVYLCBbRGVjcmVtZW50ZWRdXG4iLAorCQkJCQkgIG9iamVjdCwgbmV3X2NvdW50KSk7CisJCX0KKworCQlvYmplY3QtPmNvbW1vbi5yZWZlcmVuY2VfY291bnQgPSBuZXdfY291bnQ7CisJCWlmIChuZXdfY291bnQgPT0gMCkgeworCQkJYWNwaV91dF9kZWxldGVfaW50ZXJuYWxfb2JqKG9iamVjdCk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFJFRl9GT1JDRV9ERUxFVEU6CisKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9BTExPQ0FUSU9OUywKKwkJCQkgICJPYmogJXAgUmVmcz0lWCwgRm9yY2UgZGVsZXRlISAoU2V0IHRvIDApXG4iLAorCQkJCSAgb2JqZWN0LCBjb3VudCkpOworCisJCW5ld19jb3VudCA9IDA7CisJCW9iamVjdC0+Y29tbW9uLnJlZmVyZW5jZV9jb3VudCA9IG5ld19jb3VudDsKKwkJYWNwaV91dF9kZWxldGVfaW50ZXJuYWxfb2JqKG9iamVjdCk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKworCQlBQ1BJX0VSUk9SKChBRV9JTkZPLCAiVW5rbm93biBhY3Rpb24gKCVYKSIsIGFjdGlvbikpOworCQlicmVhazsKKwl9CisKKwkvKgorCSAqIFNhbml0eSBjaGVjayB0aGUgcmVmZXJlbmNlIGNvdW50LCBmb3IgZGVidWcgcHVycG9zZXMgb25seS4KKwkgKiAoQSBkZWxldGVkIG9iamVjdCB3aWxsIGhhdmUgYSBodWdlIHJlZmVyZW5jZSBjb3VudCkKKwkgKi8KKwlpZiAoY291bnQgPiBBQ1BJX01BWF9SRUZFUkVOQ0VfQ09VTlQpIHsKKwkJQUNQSV9XQVJOSU5HKChBRV9JTkZPLAorCQkJICAgICAgIkxhcmdlIFJlZmVyZW5jZSBDb3VudCAoJVgpIGluIG9iamVjdCAlcCIsIGNvdW50LAorCQkJICAgICAgb2JqZWN0KSk7CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X3VwZGF0ZV9vYmplY3RfcmVmZXJlbmNlCisgKgorICogUEFSQU1FVEVSUzogIE9iamVjdCAgICAgICAgICAgICAgLSBJbmNyZW1lbnQgcmVmIGNvdW50IGZvciB0aGlzIG9iamVjdAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgYWxsIHN1Yi1vYmplY3RzCisgKiAgICAgICAgICAgICAgQWN0aW9uICAgICAgICAgICAgICAtIEVpdGhlciBSRUZfSU5DUkVNRU5UIG9yIFJFRl9ERUNSRU1FTlQgb3IKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVGX0ZPUkNFX0RFTEVURQorICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogSW5jcmVtZW50IHRoZSBvYmplY3QgcmVmZXJlbmNlIGNvdW50CisgKgorICogT2JqZWN0IHJlZmVyZW5jZXMgYXJlIGluY3JlbWVudGVkIHdoZW46CisgKiAxKSBBbiBvYmplY3QgaXMgYXR0YWNoZWQgdG8gYSBOb2RlIChuYW1lc3BhY2Ugb2JqZWN0KQorICogMikgQW4gb2JqZWN0IGlzIGNvcGllZCAoYWxsIHN1Ym9iamVjdHMgbXVzdCBiZSBpbmNyZW1lbnRlZCkKKyAqCisgKiBPYmplY3QgcmVmZXJlbmNlcyBhcmUgZGVjcmVtZW50ZWQgd2hlbjoKKyAqIDEpIEFuIG9iamVjdCBpcyBkZXRhY2hlZCBmcm9tIGFuIE5vZGUKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCithY3BpX3N0YXR1cworYWNwaV91dF91cGRhdGVfb2JqZWN0X3JlZmVyZW5jZSh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmplY3QsIHUxNiBhY3Rpb24pCit7CisJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CisJdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICpzdGF0ZV9saXN0ID0gTlVMTDsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpuZXh0X29iamVjdCA9IE5VTEw7CisJdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICpzdGF0ZTsKKwl1MzIgaTsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKHV0X3VwZGF0ZV9vYmplY3RfcmVmZXJlbmNlLCBvYmplY3QpOworCisJd2hpbGUgKG9iamVjdCkgeworCisJCS8qIE1ha2Ugc3VyZSB0aGF0IHRoaXMgaXNuJ3QgYSBuYW1lc3BhY2UgaGFuZGxlICovCisKKwkJaWYgKEFDUElfR0VUX0RFU0NSSVBUT1JfVFlQRShvYmplY3QpID09IEFDUElfREVTQ19UWVBFX05BTUVEKSB7CisJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0FMTE9DQVRJT05TLAorCQkJCQkgICJPYmplY3QgJXAgaXMgTlMgaGFuZGxlXG4iLCBvYmplY3QpKTsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CisJCX0KKworCQkvKgorCQkgKiBBbGwgc3ViLW9iamVjdHMgbXVzdCBoYXZlIHRoZWlyIHJlZmVyZW5jZSBjb3VudCBpbmNyZW1lbnRlZCBhbHNvLgorCQkgKiBEaWZmZXJlbnQgb2JqZWN0IHR5cGVzIGhhdmUgZGlmZmVyZW50IHN1Ym9iamVjdHMuCisJCSAqLworCQlzd2l0Y2ggKEFDUElfR0VUX09CSkVDVF9UWVBFKG9iamVjdCkpIHsKKwkJY2FzZSBBQ1BJX1RZUEVfREVWSUNFOgorCQljYXNlIEFDUElfVFlQRV9QUk9DRVNTT1I6CisJCWNhc2UgQUNQSV9UWVBFX1BPV0VSOgorCQljYXNlIEFDUElfVFlQRV9USEVSTUFMOgorCisJCQkvKiBVcGRhdGUgdGhlIG5vdGlmeSBvYmplY3RzIGZvciB0aGVzZSB0eXBlcyAoaWYgcHJlc2VudCkgKi8KKworCQkJYWNwaV91dF91cGRhdGVfcmVmX2NvdW50KG9iamVjdC0+Y29tbW9uX25vdGlmeS4KKwkJCQkJCSBzeXN0ZW1fbm90aWZ5LCBhY3Rpb24pOworCQkJYWNwaV91dF91cGRhdGVfcmVmX2NvdW50KG9iamVjdC0+Y29tbW9uX25vdGlmeS4KKwkJCQkJCSBkZXZpY2Vfbm90aWZ5LCBhY3Rpb24pOworCQkJYnJlYWs7CisKKwkJY2FzZSBBQ1BJX1RZUEVfUEFDS0FHRToKKwkJCS8qCisJCQkgKiBXZSBtdXN0IHVwZGF0ZSBhbGwgdGhlIHN1Yi1vYmplY3RzIG9mIHRoZSBwYWNrYWdlLAorCQkJICogZWFjaCBvZiB3aG9tIG1heSBoYXZlIHRoZWlyIG93biBzdWItb2JqZWN0cy4KKwkJCSAqLworCQkJZm9yIChpID0gMDsgaSA8IG9iamVjdC0+cGFja2FnZS5jb3VudDsgaSsrKSB7CisJCQkJLyoKKwkJCQkgKiBQdXNoIGVhY2ggZWxlbWVudCBvbnRvIHRoZSBzdGFjayBmb3IgbGF0ZXIgcHJvY2Vzc2luZy4KKwkJCQkgKiBOb3RlOiBUaGVyZSBjYW4gYmUgbnVsbCBlbGVtZW50cyB3aXRoaW4gdGhlIHBhY2thZ2UsCisJCQkJICogdGhlc2UgYXJlIHNpbXBseSBpZ25vcmVkCisJCQkJICovCisJCQkJc3RhdHVzID0KKwkJCQkgICAgYWNwaV91dF9jcmVhdGVfdXBkYXRlX3N0YXRlX2FuZF9wdXNoCisJCQkJICAgIChvYmplY3QtPnBhY2thZ2UuZWxlbWVudHNbaV0sIGFjdGlvbiwKKwkJCQkgICAgICZzdGF0ZV9saXN0KTsKKwkJCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCQkJZ290byBlcnJvcl9leGl0OworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgQUNQSV9UWVBFX0JVRkZFUl9GSUVMRDoKKworCQkJbmV4dF9vYmplY3QgPSBvYmplY3QtPmJ1ZmZlcl9maWVsZC5idWZmZXJfb2JqOworCQkJYnJlYWs7CisKKwkJY2FzZSBBQ1BJX1RZUEVfTE9DQUxfUkVHSU9OX0ZJRUxEOgorCisJCQluZXh0X29iamVjdCA9IG9iamVjdC0+ZmllbGQucmVnaW9uX29iajsKKwkJCWJyZWFrOworCisJCWNhc2UgQUNQSV9UWVBFX0xPQ0FMX0JBTktfRklFTEQ6CisKKwkJCW5leHRfb2JqZWN0ID0gb2JqZWN0LT5iYW5rX2ZpZWxkLmJhbmtfb2JqOworCQkJc3RhdHVzID0KKwkJCSAgICBhY3BpX3V0X2NyZWF0ZV91cGRhdGVfc3RhdGVfYW5kX3B1c2gob2JqZWN0LT4KKwkJCQkJCQkJIGJhbmtfZmllbGQuCisJCQkJCQkJCSByZWdpb25fb2JqLAorCQkJCQkJCQkgYWN0aW9uLAorCQkJCQkJCQkgJnN0YXRlX2xpc3QpOworCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQkJZ290byBlcnJvcl9leGl0OworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBBQ1BJX1RZUEVfTE9DQUxfSU5ERVhfRklFTEQ6CisKKwkJCW5leHRfb2JqZWN0ID0gb2JqZWN0LT5pbmRleF9maWVsZC5pbmRleF9vYmo7CisJCQlzdGF0dXMgPQorCQkJICAgIGFjcGlfdXRfY3JlYXRlX3VwZGF0ZV9zdGF0ZV9hbmRfcHVzaChvYmplY3QtPgorCQkJCQkJCQkgaW5kZXhfZmllbGQuCisJCQkJCQkJCSBkYXRhX29iaiwKKwkJCQkJCQkJIGFjdGlvbiwKKwkJCQkJCQkJICZzdGF0ZV9saXN0KTsKKwkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJCWdvdG8gZXJyb3JfZXhpdDsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgQUNQSV9UWVBFX0xPQ0FMX1JFRkVSRU5DRToKKwkJCS8qCisJCQkgKiBUaGUgdGFyZ2V0IG9mIGFuIEluZGV4IChhIHBhY2thZ2UsIHN0cmluZywgb3IgYnVmZmVyKSBvciBhIG5hbWVkCisJCQkgKiByZWZlcmVuY2UgbXVzdCB0cmFjayBjaGFuZ2VzIHRvIHRoZSByZWYgY291bnQgb2YgdGhlIGluZGV4IG9yCisJCQkgKiB0YXJnZXQgb2JqZWN0LgorCQkJICovCisJCQlpZiAoKG9iamVjdC0+cmVmZXJlbmNlLmNsYXNzID09IEFDUElfUkVGQ0xBU1NfSU5ERVgpIHx8CisJCQkgICAgKG9iamVjdC0+cmVmZXJlbmNlLmNsYXNzID09IEFDUElfUkVGQ0xBU1NfTkFNRSkpIHsKKwkJCQluZXh0X29iamVjdCA9IG9iamVjdC0+cmVmZXJlbmNlLm9iamVjdDsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgQUNQSV9UWVBFX1JFR0lPTjoKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOwkvKiBObyBzdWJvYmplY3RzIGZvciBhbGwgb3RoZXIgdHlwZXMgKi8KKwkJfQorCisJCS8qCisJCSAqIE5vdyB3ZSBjYW4gdXBkYXRlIHRoZSBjb3VudCBpbiB0aGUgbWFpbiBvYmplY3QuIFRoaXMgY2FuIG9ubHkKKwkJICogaGFwcGVuIGFmdGVyIHdlIHVwZGF0ZSB0aGUgc3ViLW9iamVjdHMgaW4gY2FzZSB0aGlzIGNhdXNlcyB0aGUKKwkJICogbWFpbiBvYmplY3QgdG8gYmUgZGVsZXRlZC4KKwkJICovCisJCWFjcGlfdXRfdXBkYXRlX3JlZl9jb3VudChvYmplY3QsIGFjdGlvbik7CisJCW9iamVjdCA9IE5VTEw7CisKKwkJLyogTW92ZSBvbiB0byB0aGUgbmV4dCBvYmplY3QgdG8gYmUgdXBkYXRlZCAqLworCisJCWlmIChuZXh0X29iamVjdCkgeworCQkJb2JqZWN0ID0gbmV4dF9vYmplY3Q7CisJCQluZXh0X29iamVjdCA9IE5VTEw7CisJCX0gZWxzZSBpZiAoc3RhdGVfbGlzdCkgeworCQkJc3RhdGUgPSBhY3BpX3V0X3BvcF9nZW5lcmljX3N0YXRlKCZzdGF0ZV9saXN0KTsKKwkJCW9iamVjdCA9IHN0YXRlLT51cGRhdGUub2JqZWN0OworCQkJYWNwaV91dF9kZWxldGVfZ2VuZXJpY19zdGF0ZShzdGF0ZSk7CisJCX0KKwl9CisKKwlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOworCisgICAgICBlcnJvcl9leGl0OgorCisJQUNQSV9FWENFUFRJT04oKEFFX0lORk8sIHN0YXR1cywKKwkJCSJDb3VsZCBub3QgdXBkYXRlIG9iamVjdCByZWZlcmVuY2UgY291bnQiKSk7CisKKwkvKiBGcmVlIGFueSBzdGFja2VkIFVwZGF0ZSBTdGF0ZSBvYmplY3RzICovCisKKwl3aGlsZSAoc3RhdGVfbGlzdCkgeworCQlzdGF0ZSA9IGFjcGlfdXRfcG9wX2dlbmVyaWNfc3RhdGUoJnN0YXRlX2xpc3QpOworCQlhY3BpX3V0X2RlbGV0ZV9nZW5lcmljX3N0YXRlKHN0YXRlKTsKKwl9CisKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV91dF9hZGRfcmVmZXJlbmNlCisgKgorICogUEFSQU1FVEVSUzogIE9iamVjdCAgICAgICAgICAtIE9iamVjdCB3aG9zZSByZWZlcmVuY2UgY291bnQgaXMgdG8gYmUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNyZW1lbnRlZAorICoKKyAqIFJFVFVSTjogICAgICBOb25lCisgKgorICogREVTQ1JJUFRJT046IEFkZCBvbmUgcmVmZXJlbmNlIHRvIGFuIEFDUEkgb2JqZWN0CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBhY3BpX3V0X2FkZF9yZWZlcmVuY2UodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqZWN0KQoreworCisJQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIodXRfYWRkX3JlZmVyZW5jZSwgb2JqZWN0KTsKKworCS8qIEVuc3VyZSB0aGF0IHdlIGhhdmUgYSB2YWxpZCBvYmplY3QgKi8KKworCWlmICghYWNwaV91dF92YWxpZF9pbnRlcm5hbF9vYmplY3Qob2JqZWN0KSkgeworCQlyZXR1cm5fVk9JRDsKKwl9CisKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0FMTE9DQVRJT05TLAorCQkJICAiT2JqICVwIEN1cnJlbnQgUmVmcz0lWCBbVG8gQmUgSW5jcmVtZW50ZWRdXG4iLAorCQkJICBvYmplY3QsIG9iamVjdC0+Y29tbW9uLnJlZmVyZW5jZV9jb3VudCkpOworCisJLyogSW5jcmVtZW50IHRoZSByZWZlcmVuY2UgY291bnQgKi8KKworCSh2b2lkKWFjcGlfdXRfdXBkYXRlX29iamVjdF9yZWZlcmVuY2Uob2JqZWN0LCBSRUZfSU5DUkVNRU5UKTsKKwlyZXR1cm5fVk9JRDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlCisgKgorICogUEFSQU1FVEVSUzogIE9iamVjdCAgICAgICAgIC0gT2JqZWN0IHdob3NlIHJlZiBjb3VudCB3aWxsIGJlIGRlY3JlbWVudGVkCisgKgorICogUkVUVVJOOiAgICAgIE5vbmUKKyAqCisgKiBERVNDUklQVElPTjogRGVjcmVtZW50IHRoZSByZWZlcmVuY2UgY291bnQgb2YgYW4gQUNQSSBpbnRlcm5hbCBvYmplY3QKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIGFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZSh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmplY3QpCit7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUih1dF9yZW1vdmVfcmVmZXJlbmNlLCBvYmplY3QpOworCisJLyoKKwkgKiBBbGxvdyBhIE5VTEwgcG9pbnRlciB0byBiZSBwYXNzZWQgaW4sIGp1c3QgaWdub3JlIGl0LiBUaGlzIHNhdmVzCisJICogZWFjaCBjYWxsZXIgZnJvbSBoYXZpbmcgdG8gY2hlY2suIEFsc28sIGlnbm9yZSBOUyBub2Rlcy4KKwkgKgorCSAqLworCWlmICghb2JqZWN0IHx8CisJICAgIChBQ1BJX0dFVF9ERVNDUklQVE9SX1RZUEUob2JqZWN0KSA9PSBBQ1BJX0RFU0NfVFlQRV9OQU1FRCkpIHsKKwkJcmV0dXJuX1ZPSUQ7CisJfQorCisJLyogRW5zdXJlIHRoYXQgd2UgaGF2ZSBhIHZhbGlkIG9iamVjdCAqLworCisJaWYgKCFhY3BpX3V0X3ZhbGlkX2ludGVybmFsX29iamVjdChvYmplY3QpKSB7CisJCXJldHVybl9WT0lEOworCX0KKworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfQUxMT0NBVElPTlMsCisJCQkgICJPYmogJXAgQ3VycmVudCBSZWZzPSVYIFtUbyBCZSBEZWNyZW1lbnRlZF1cbiIsCisJCQkgIG9iamVjdCwgb2JqZWN0LT5jb21tb24ucmVmZXJlbmNlX2NvdW50KSk7CisKKwkvKgorCSAqIERlY3JlbWVudCB0aGUgcmVmZXJlbmNlIGNvdW50LCBhbmQgb25seSBhY3R1YWxseSBkZWxldGUgdGhlIG9iamVjdAorCSAqIGlmIHRoZSByZWZlcmVuY2UgY291bnQgYmVjb21lcyAwLiAoTXVzdCBhbHNvIGRlY3JlbWVudCB0aGUgcmVmIGNvdW50CisJICogb2YgYWxsIHN1Ym9iamVjdHMhKQorCSAqLworCSh2b2lkKWFjcGlfdXRfdXBkYXRlX29iamVjdF9yZWZlcmVuY2Uob2JqZWN0LCBSRUZfREVDUkVNRU5UKTsKKwlyZXR1cm5fVk9JRDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvdXRldmFsLmMgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL3V0ZXZhbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhOTQ1MGJjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS91dGV2YWwuYwpAQCAtMCwwICsxLDc1MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIE1vZHVsZSBOYW1lOiB1dGV2YWwgLSBPYmplY3QgZXZhbHVhdGlvbgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDgsIEludGVsIENvcnAuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCisgKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSBhdCBtaW5pbXVtIGEgZGlzY2xhaW1lcgorICogICAgc3Vic3RhbnRpYWxseSBzaW1pbGFyIHRvIHRoZSAiTk8gV0FSUkFOVFkiIGRpc2NsYWltZXIgYmVsb3cKKyAqICAgICgiRGlzY2xhaW1lciIpIGFuZCBhbnkgcmVkaXN0cmlidXRpb24gbXVzdCBiZSBjb25kaXRpb25lZCB1cG9uCisgKiAgICBpbmNsdWRpbmcgYSBzdWJzdGFudGlhbGx5IHNpbWlsYXIgRGlzY2xhaW1lciByZXF1aXJlbWVudCBmb3IgZnVydGhlcgorICogICAgYmluYXJ5IHJlZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzCisgKiAgICBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIE5PIFdBUlJBTlRZCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORworICogSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCisgKi8KKworI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgorI2luY2x1ZGUgImFjY29tbW9uLmgiCisjaW5jbHVkZSAiYWNuYW1lc3AuaCIKKyNpbmNsdWRlICJhY2ludGVycC5oIgorCisjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9VVElMSVRJRVMKK0FDUElfTU9EVUxFX05BTUUoInV0ZXZhbCIpCisKKy8qIExvY2FsIHByb3RvdHlwZXMgKi8KK3N0YXRpYyB2b2lkCithY3BpX3V0X2NvcHlfaWRfc3RyaW5nKGNoYXIgKmRlc3RpbmF0aW9uLCBjaGFyICpzb3VyY2UsIGFjcGlfc2l6ZSBtYXhfbGVuZ3RoKTsKKworc3RhdGljIGFjcGlfc3RhdHVzCithY3BpX3V0X3RyYW5zbGF0ZV9vbmVfY2lkKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjLAorCQkJICBzdHJ1Y3QgYWNwaV9jb21wYXRpYmxlX2lkICpvbmVfY2lkKTsKKworLyoKKyAqIFN0cmluZ3Mgc3VwcG9ydGVkIGJ5IHRoZSBfT1NJIHByZWRlZmluZWQgKGludGVybmFsKSBtZXRob2QuCisgKi8KK3N0YXRpYyBjaGFyICphY3BpX2ludGVyZmFjZXNfc3VwcG9ydGVkW10gPSB7CisJLyogT3BlcmF0aW5nIFN5c3RlbSBWZW5kb3IgU3RyaW5ncyAqLworCisJIldpbmRvd3MgMjAwMCIsCQkvKiBXaW5kb3dzIDIwMDAgKi8KKwkiV2luZG93cyAyMDAxIiwJCS8qIFdpbmRvd3MgWFAgKi8KKwkiV2luZG93cyAyMDAxIFNQMSIsCS8qIFdpbmRvd3MgWFAgU1AxICovCisJIldpbmRvd3MgMjAwMSBTUDIiLAkvKiBXaW5kb3dzIFhQIFNQMiAqLworCSJXaW5kb3dzIDIwMDEuMSIsCS8qIFdpbmRvd3MgU2VydmVyIDIwMDMgKi8KKwkiV2luZG93cyAyMDAxLjEgU1AxIiwJLyogV2luZG93cyBTZXJ2ZXIgMjAwMyBTUDEgLSBBZGRlZCAwMy8yMDA2ICovCisJIldpbmRvd3MgMjAwNiIsCQkvKiBXaW5kb3dzIFZpc3RhIC0gQWRkZWQgMDMvMjAwNiAqLworCisJLyogRmVhdHVyZSBHcm91cCBTdHJpbmdzICovCisKKwkiRXh0ZW5kZWQgQWRkcmVzcyBTcGFjZSBEZXNjcmlwdG9yIgorCSAgICAvKgorCSAgICAgKiBBbGwgIm9wdGlvbmFsIiBmZWF0dXJlIGdyb3VwIHN0cmluZ3MgKGZlYXR1cmVzIHRoYXQgYXJlIGltcGxlbWVudGVkCisJICAgICAqIGJ5IHRoZSBob3N0KSBzaG91bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIGhvc3QgdmVyc2lvbiBvZgorCSAgICAgKiBhY3BpX29zX3ZhbGlkYXRlX2ludGVyZmFjZSBhbmQgc2hvdWxkIG5vdCBiZSBhZGRlZCBoZXJlLgorCSAgICAgKi8KK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfdXRfb3NpX2ltcGxlbWVudGF0aW9uCisgKgorICogUEFSQU1FVEVSUzogIHdhbGtfc3RhdGUgICAgICAgICAgLSBDdXJyZW50IHdhbGsgc3RhdGUKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IEltcGxlbWVudGF0aW9uIG9mIHRoZSBfT1NJIHByZWRlZmluZWQgY29udHJvbCBtZXRob2QKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCithY3BpX3N0YXR1cyBhY3BpX3V0X29zaV9pbXBsZW1lbnRhdGlvbihzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKQoreworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpzdHJpbmdfZGVzYzsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpyZXR1cm5fZGVzYzsKKwl1MzIgaTsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0UodXRfb3NpX2ltcGxlbWVudGF0aW9uKTsKKworCS8qIFZhbGlkYXRlIHRoZSBzdHJpbmcgaW5wdXQgYXJndW1lbnQgKi8KKworCXN0cmluZ19kZXNjID0gd2Fsa19zdGF0ZS0+YXJndW1lbnRzWzBdLm9iamVjdDsKKwlpZiAoIXN0cmluZ19kZXNjIHx8IChzdHJpbmdfZGVzYy0+Y29tbW9uLnR5cGUgIT0gQUNQSV9UWVBFX1NUUklORykpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX1RZUEUpOworCX0KKworCS8qIENyZWF0ZSBhIHJldHVybiBvYmplY3QgKi8KKworCXJldHVybl9kZXNjID0gYWNwaV91dF9jcmVhdGVfaW50ZXJuYWxfb2JqZWN0KEFDUElfVFlQRV9JTlRFR0VSKTsKKwlpZiAoIXJldHVybl9kZXNjKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT19NRU1PUlkpOworCX0KKworCS8qIERlZmF1bHQgcmV0dXJuIHZhbHVlIGlzIFNVUFBPUlRFRCAqLworCisJcmV0dXJuX2Rlc2MtPmludGVnZXIudmFsdWUgPSBBQ1BJX1VJTlQzMl9NQVg7CisJd2Fsa19zdGF0ZS0+cmV0dXJuX2Rlc2MgPSByZXR1cm5fZGVzYzsKKworCS8qIENvbXBhcmUgaW5wdXQgc3RyaW5nIHRvIHN0YXRpYyB0YWJsZSBvZiBzdXBwb3J0ZWQgaW50ZXJmYWNlcyAqLworCisJZm9yIChpID0gMDsgaSA8IEFDUElfQVJSQVlfTEVOR1RIKGFjcGlfaW50ZXJmYWNlc19zdXBwb3J0ZWQpOyBpKyspIHsKKwkJaWYgKCFBQ1BJX1NUUkNNUAorCQkgICAgKHN0cmluZ19kZXNjLT5zdHJpbmcucG9pbnRlciwKKwkJICAgICBhY3BpX2ludGVyZmFjZXNfc3VwcG9ydGVkW2ldKSkgeworCisJCQkvKiBUaGUgaW50ZXJmYWNlIGlzIHN1cHBvcnRlZCAqLworCisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOworCQl9CisJfQorCisJLyoKKwkgKiBEaWQgbm90IG1hdGNoIHRoZSBzdHJpbmcgaW4gdGhlIHN0YXRpYyB0YWJsZSwgY2FsbCB0aGUgaG9zdCBPU0wgdG8KKwkgKiBjaGVjayBmb3IgYSBtYXRjaCB3aXRoIG9uZSBvZiB0aGUgb3B0aW9uYWwgc3RyaW5ncyAoc3VjaCBhcworCSAqICJNb2R1bGUgRGV2aWNlIiwgIjMuMCBUaGVybWFsIE1vZGVsIiwgZXRjLikKKwkgKi8KKwlzdGF0dXMgPSBhY3BpX29zX3ZhbGlkYXRlX2ludGVyZmFjZShzdHJpbmdfZGVzYy0+c3RyaW5nLnBvaW50ZXIpOworCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkgeworCisJCS8qIFRoZSBpbnRlcmZhY2UgaXMgc3VwcG9ydGVkICovCisKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKKwl9CisKKwkvKiBUaGUgaW50ZXJmYWNlIGlzIG5vdCBzdXBwb3J0ZWQgKi8KKworCXJldHVybl9kZXNjLT5pbnRlZ2VyLnZhbHVlID0gMDsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX29zaV9pbnZhbGlkYXRlCisgKgorICogUEFSQU1FVEVSUzogIGludGVyZmFjZV9zdHJpbmcKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IGludmFsaWRhdGUgc3RyaW5nIGluIHByZS1kZWZpZW5kIF9PU0kgc3RyaW5nIGxpc3QKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCithY3BpX3N0YXR1cyBhY3BpX29zaV9pbnZhbGlkYXRlKGNoYXIgKmludGVyZmFjZSkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBQ1BJX0FSUkFZX0xFTkdUSChhY3BpX2ludGVyZmFjZXNfc3VwcG9ydGVkKTsgaSsrKSB7CisJCWlmICghQUNQSV9TVFJDTVAoaW50ZXJmYWNlLCBhY3BpX2ludGVyZmFjZXNfc3VwcG9ydGVkW2ldKSkgeworCQkJKmFjcGlfaW50ZXJmYWNlc19zdXBwb3J0ZWRbaV0gPSAnXDAnOworCQkJcmV0dXJuIEFFX09LOworCQl9CisJfQorCXJldHVybiBBRV9OT1RfRk9VTkQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfdXRfZXZhbHVhdGVfb2JqZWN0CisgKgorICogUEFSQU1FVEVSUzogIHByZWZpeF9ub2RlICAgICAgICAgLSBTdGFydGluZyBub2RlCisgKiAgICAgICAgICAgICAgUGF0aCAgICAgICAgICAgICAgICAtIFBhdGggdG8gb2JqZWN0IGZyb20gc3RhcnRpbmcgbm9kZQorICogICAgICAgICAgICAgIGV4cGVjdGVkX3JldHVybl90eXBlcyAtIEJpdG1hcCBvZiBhbGxvd2VkIHJldHVybiB0eXBlcworICogICAgICAgICAgICAgIHJldHVybl9kZXNjICAgICAgICAgLSBXaGVyZSBhIHJldHVybiB2YWx1ZSBpcyBzdG9yZWQKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IEV2YWx1YXRlcyBhIG5hbWVzcGFjZSBvYmplY3QgYW5kIHZlcmlmaWVzIHRoZSB0eXBlIG9mIHRoZQorICogICAgICAgICAgICAgIHJldHVybiBvYmplY3QuICBDb21tb24gY29kZSB0aGF0IHNpbXBsaWZpZXMgYWNjZXNzaW5nIG9iamVjdHMKKyAqICAgICAgICAgICAgICB0aGF0IGhhdmUgcmVxdWlyZWQgcmV0dXJuIG9iamVjdHMgb2YgZml4ZWQgdHlwZXMuCisgKgorICogICAgICAgICAgICAgIE5PVEU6IEludGVybmFsIGZ1bmN0aW9uLCBubyBwYXJhbWV0ZXIgdmFsaWRhdGlvbgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2FjcGlfc3RhdHVzCithY3BpX3V0X2V2YWx1YXRlX29iamVjdChzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqcHJlZml4X25vZGUsCisJCQljaGFyICpwYXRoLAorCQkJdTMyIGV4cGVjdGVkX3JldHVybl9idHlwZXMsCisJCQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICoqcmV0dXJuX2Rlc2MpCit7CisJc3RydWN0IGFjcGlfZXZhbHVhdGVfaW5mbyAqaW5mbzsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJdTMyIHJldHVybl9idHlwZTsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0UodXRfZXZhbHVhdGVfb2JqZWN0KTsKKworCS8qIEFsbG9jYXRlIHRoZSBldmFsdWF0aW9uIGluZm9ybWF0aW9uIGJsb2NrICovCisKKwlpbmZvID0gQUNQSV9BTExPQ0FURV9aRVJPRUQoc2l6ZW9mKHN0cnVjdCBhY3BpX2V2YWx1YXRlX2luZm8pKTsKKwlpZiAoIWluZm8pIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX01FTU9SWSk7CisJfQorCisJaW5mby0+cHJlZml4X25vZGUgPSBwcmVmaXhfbm9kZTsKKwlpbmZvLT5wYXRobmFtZSA9IHBhdGg7CisKKwkvKiBFdmFsdWF0ZSB0aGUgb2JqZWN0L21ldGhvZCAqLworCisJc3RhdHVzID0gYWNwaV9uc19ldmFsdWF0ZShpbmZvKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJaWYgKHN0YXR1cyA9PSBBRV9OT1RfRk9VTkQpIHsKKwkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVhFQywKKwkJCQkJICAiWyU0LjRzLiVzXSB3YXMgbm90IGZvdW5kXG4iLAorCQkJCQkgIGFjcGlfdXRfZ2V0X25vZGVfbmFtZShwcmVmaXhfbm9kZSksCisJCQkJCSAgcGF0aCkpOworCQl9IGVsc2UgeworCQkJQUNQSV9FUlJPUl9NRVRIT0QoIk1ldGhvZCBleGVjdXRpb24gZmFpbGVkIiwKKwkJCQkJICBwcmVmaXhfbm9kZSwgcGF0aCwgc3RhdHVzKTsKKwkJfQorCisJCWdvdG8gY2xlYW51cDsKKwl9CisKKwkvKiBEaWQgd2UgZ2V0IGEgcmV0dXJuIG9iamVjdD8gKi8KKworCWlmICghaW5mby0+cmV0dXJuX29iamVjdCkgeworCQlpZiAoZXhwZWN0ZWRfcmV0dXJuX2J0eXBlcykgeworCQkJQUNQSV9FUlJPUl9NRVRIT0QoIk5vIG9iamVjdCB3YXMgcmV0dXJuZWQgZnJvbSIsCisJCQkJCSAgcHJlZml4X25vZGUsIHBhdGgsIEFFX05PVF9FWElTVCk7CisKKwkJCXN0YXR1cyA9IEFFX05PVF9FWElTVDsKKwkJfQorCisJCWdvdG8gY2xlYW51cDsKKwl9CisKKwkvKiBNYXAgdGhlIHJldHVybiBvYmplY3QgdHlwZSB0byB0aGUgYml0bWFwcGVkIHR5cGUgKi8KKworCXN3aXRjaCAoQUNQSV9HRVRfT0JKRUNUX1RZUEUoaW5mby0+cmV0dXJuX29iamVjdCkpIHsKKwljYXNlIEFDUElfVFlQRV9JTlRFR0VSOgorCQlyZXR1cm5fYnR5cGUgPSBBQ1BJX0JUWVBFX0lOVEVHRVI7CisJCWJyZWFrOworCisJY2FzZSBBQ1BJX1RZUEVfQlVGRkVSOgorCQlyZXR1cm5fYnR5cGUgPSBBQ1BJX0JUWVBFX0JVRkZFUjsKKwkJYnJlYWs7CisKKwljYXNlIEFDUElfVFlQRV9TVFJJTkc6CisJCXJldHVybl9idHlwZSA9IEFDUElfQlRZUEVfU1RSSU5HOworCQlicmVhazsKKworCWNhc2UgQUNQSV9UWVBFX1BBQ0tBR0U6CisJCXJldHVybl9idHlwZSA9IEFDUElfQlRZUEVfUEFDS0FHRTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXR1cm5fYnR5cGUgPSAwOworCQlicmVhazsKKwl9CisKKwlpZiAoKGFjcGlfZ2JsX2VuYWJsZV9pbnRlcnByZXRlcl9zbGFjaykgJiYgKCFleHBlY3RlZF9yZXR1cm5fYnR5cGVzKSkgeworCQkvKgorCQkgKiBXZSByZWNlaXZlZCBhIHJldHVybiBvYmplY3QsIGJ1dCBvbmUgd2FzIG5vdCBleHBlY3RlZC4gIFRoaXMgY2FuCisJCSAqIGhhcHBlbiBmcmVxdWVudGx5IGlmIHRoZSAiaW1wbGljaXQgcmV0dXJuIiBmZWF0dXJlIGlzIGVuYWJsZWQuCisJCSAqIEp1c3QgZGVsZXRlIHRoZSByZXR1cm4gb2JqZWN0IGFuZCByZXR1cm4gQUVfT0suCisJCSAqLworCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UoaW5mby0+cmV0dXJuX29iamVjdCk7CisJCWdvdG8gY2xlYW51cDsKKwl9CisKKwkvKiBJcyB0aGUgcmV0dXJuIG9iamVjdCBvbmUgb2YgdGhlIGV4cGVjdGVkIHR5cGVzPyAqLworCisJaWYgKCEoZXhwZWN0ZWRfcmV0dXJuX2J0eXBlcyAmIHJldHVybl9idHlwZSkpIHsKKwkJQUNQSV9FUlJPUl9NRVRIT0QoIlJldHVybiBvYmplY3QgdHlwZSBpcyBpbmNvcnJlY3QiLAorCQkJCSAgcHJlZml4X25vZGUsIHBhdGgsIEFFX1RZUEUpOworCisJCUFDUElfRVJST1IoKEFFX0lORk8sCisJCQkgICAgIlR5cGUgcmV0dXJuZWQgZnJvbSAlcyB3YXMgaW5jb3JyZWN0OiAlcywgZXhwZWN0ZWQgQnR5cGVzOiAlWCIsCisJCQkgICAgcGF0aCwKKwkJCSAgICBhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lKGluZm8tPnJldHVybl9vYmplY3QpLAorCQkJICAgIGV4cGVjdGVkX3JldHVybl9idHlwZXMpKTsKKworCQkvKiBPbiBlcnJvciBleGl0LCB3ZSBtdXN0IGRlbGV0ZSB0aGUgcmV0dXJuIG9iamVjdCAqLworCisJCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZShpbmZvLT5yZXR1cm5fb2JqZWN0KTsKKwkJc3RhdHVzID0gQUVfVFlQRTsKKwkJZ290byBjbGVhbnVwOworCX0KKworCS8qIE9iamVjdCB0eXBlIGlzIE9LLCByZXR1cm4gaXQgKi8KKworCSpyZXR1cm5fZGVzYyA9IGluZm8tPnJldHVybl9vYmplY3Q7CisKKyAgICAgIGNsZWFudXA6CisJQUNQSV9GUkVFKGluZm8pOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X2V2YWx1YXRlX251bWVyaWNfb2JqZWN0CisgKgorICogUEFSQU1FVEVSUzogIG9iamVjdF9uYW1lICAgICAgICAgLSBPYmplY3QgbmFtZSB0byBiZSBldmFsdWF0ZWQKKyAqICAgICAgICAgICAgICBkZXZpY2Vfbm9kZSAgICAgICAgIC0gTm9kZSBmb3IgdGhlIGRldmljZQorICogICAgICAgICAgICAgIEFkZHJlc3MgICAgICAgICAgICAgLSBXaGVyZSB0aGUgdmFsdWUgaXMgcmV0dXJuZWQKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IEV2YWx1YXRlcyBhIG51bWVyaWMgbmFtZXNwYWNlIG9iamVjdCBmb3IgYSBzZWxlY3RlZCBkZXZpY2UKKyAqICAgICAgICAgICAgICBhbmQgc3RvcmVzIHJlc3VsdCBpbiAqQWRkcmVzcy4KKyAqCisgKiAgICAgICAgICAgICAgTk9URTogSW50ZXJuYWwgZnVuY3Rpb24sIG5vIHBhcmFtZXRlciB2YWxpZGF0aW9uCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworYWNwaV9zdGF0dXMKK2FjcGlfdXRfZXZhbHVhdGVfbnVtZXJpY19vYmplY3QoY2hhciAqb2JqZWN0X25hbWUsCisJCQkJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKmRldmljZV9ub2RlLAorCQkJCWFjcGlfaW50ZWdlciAqIGFkZHJlc3MpCit7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2M7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCisJQUNQSV9GVU5DVElPTl9UUkFDRSh1dF9ldmFsdWF0ZV9udW1lcmljX29iamVjdCk7CisKKwlzdGF0dXMgPSBhY3BpX3V0X2V2YWx1YXRlX29iamVjdChkZXZpY2Vfbm9kZSwgb2JqZWN0X25hbWUsCisJCQkJCSBBQ1BJX0JUWVBFX0lOVEVHRVIsICZvYmpfZGVzYyk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworCX0KKworCS8qIEdldCB0aGUgcmV0dXJuZWQgSW50ZWdlciAqLworCisJKmFkZHJlc3MgPSBvYmpfZGVzYy0+aW50ZWdlci52YWx1ZTsKKworCS8qIE9uIGV4aXQsIHdlIG11c3QgZGVsZXRlIHRoZSByZXR1cm4gb2JqZWN0ICovCisKKwlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2Uob2JqX2Rlc2MpOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X2NvcHlfaWRfc3RyaW5nCisgKgorICogUEFSQU1FVEVSUzogIERlc3RpbmF0aW9uICAgICAgICAgLSBXaGVyZSB0byBjb3B5IHRoZSBzdHJpbmcKKyAqICAgICAgICAgICAgICBTb3VyY2UgICAgICAgICAgICAgIC0gU291cmNlIHN0cmluZworICogICAgICAgICAgICAgIG1heF9sZW5ndGggICAgICAgICAgLSBMZW5ndGggb2YgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcgorICoKKyAqIFJFVFVSTjogICAgICBOb25lCisgKgorICogREVTQ1JJUFRJT046IENvcGllcyBhbiBJRCBzdHJpbmcgZm9yIHRoZSBfSElELCBfQ0lELCBhbmQgX1VJRCBtZXRob2RzLgorICogICAgICAgICAgICAgIFBlcmZvcm1zIHJlbW92YWwgb2YgYSBsZWFkaW5nIGFzdGVyaXNrIGlmIHByZXNlbnQgLS0gd29ya2Fyb3VuZAorICogICAgICAgICAgICAgIGZvciBhIGtub3duIGlzc3VlIG9uIGEgYnVuY2ggb2YgbWFjaGluZXMuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQKK2FjcGlfdXRfY29weV9pZF9zdHJpbmcoY2hhciAqZGVzdGluYXRpb24sIGNoYXIgKnNvdXJjZSwgYWNwaV9zaXplIG1heF9sZW5ndGgpCit7CisKKwkvKgorCSAqIFdvcmthcm91bmQgZm9yIElEIHN0cmluZ3MgdGhhdCBoYXZlIGEgbGVhZGluZyBhc3Rlcmlzay4gVGhpcyBjb25zdHJ1Y3QKKwkgKiBpcyBub3QgYWxsb3dlZCBieSB0aGUgQUNQSSBzcGVjaWZpY2F0aW9uICAoSUQgc3RyaW5ncyBtdXN0IGJlCisJICogYWxwaGFudW1lcmljKSwgYnV0IGVub3VnaCBleGlzdGluZyBtYWNoaW5lcyBoYXZlIHRoaXMgZW1iZWRkZWQgaW4gdGhlaXIKKwkgKiBJRCBzdHJpbmdzIHRoYXQgdGhlIGZvbGxvd2luZyBjb2RlIGlzIHVzZWZ1bC4KKwkgKi8KKwlpZiAoKnNvdXJjZSA9PSAnKicpIHsKKwkJc291cmNlKys7CisJfQorCisJLyogRG8gdGhlIGFjdHVhbCBjb3B5ICovCisKKwlBQ1BJX1NUUk5DUFkoZGVzdGluYXRpb24sIHNvdXJjZSwgbWF4X2xlbmd0aCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfdXRfZXhlY3V0ZV9ISUQKKyAqCisgKiBQQVJBTUVURVJTOiAgZGV2aWNlX25vZGUgICAgICAgICAtIE5vZGUgZm9yIHRoZSBkZXZpY2UKKyAqICAgICAgICAgICAgICBIaWQgICAgICAgICAgICAgICAgIC0gV2hlcmUgdGhlIEhJRCBpcyByZXR1cm5lZAorICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogRXhlY3V0ZXMgdGhlIF9ISUQgY29udHJvbCBtZXRob2QgdGhhdCByZXR1cm5zIHRoZSBoYXJkd2FyZQorICogICAgICAgICAgICAgIElEIG9mIHRoZSBkZXZpY2UuCisgKgorICogICAgICAgICAgICAgIE5PVEU6IEludGVybmFsIGZ1bmN0aW9uLCBubyBwYXJhbWV0ZXIgdmFsaWRhdGlvbgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2FjcGlfc3RhdHVzCithY3BpX3V0X2V4ZWN1dGVfSElEKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpkZXZpY2Vfbm9kZSwKKwkJICAgIHN0cnVjdCBhY3BpY2FfZGV2aWNlX2lkICpoaWQpCit7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2M7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCisJQUNQSV9GVU5DVElPTl9UUkFDRSh1dF9leGVjdXRlX0hJRCk7CisKKwlzdGF0dXMgPSBhY3BpX3V0X2V2YWx1YXRlX29iamVjdChkZXZpY2Vfbm9kZSwgTUVUSE9EX05BTUVfX0hJRCwKKwkJCQkJIEFDUElfQlRZUEVfSU5URUdFUiB8IEFDUElfQlRZUEVfU1RSSU5HLAorCQkJCQkgJm9ial9kZXNjKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CisJfQorCisJaWYgKEFDUElfR0VUX09CSkVDVF9UWVBFKG9ial9kZXNjKSA9PSBBQ1BJX1RZUEVfSU5URUdFUikgeworCisJCS8qIENvbnZlcnQgdGhlIE51bWVyaWMgSElEIHRvIHN0cmluZyAqLworCisJCWFjcGlfZXhfZWlzYV9pZF90b19zdHJpbmcoKHUzMikgb2JqX2Rlc2MtPmludGVnZXIudmFsdWUsCisJCQkJCSAgaGlkLT52YWx1ZSk7CisJfSBlbHNlIHsKKwkJLyogQ29weSB0aGUgU3RyaW5nIEhJRCBmcm9tIHRoZSByZXR1cm5lZCBvYmplY3QgKi8KKworCQlhY3BpX3V0X2NvcHlfaWRfc3RyaW5nKGhpZC0+dmFsdWUsIG9ial9kZXNjLT5zdHJpbmcucG9pbnRlciwKKwkJCQkgICAgICAgc2l6ZW9mKGhpZC0+dmFsdWUpKTsKKwl9CisKKwkvKiBPbiBleGl0LCB3ZSBtdXN0IGRlbGV0ZSB0aGUgcmV0dXJuIG9iamVjdCAqLworCisJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKG9ial9kZXNjKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV91dF90cmFuc2xhdGVfb25lX2NpZAorICoKKyAqIFBBUkFNRVRFUlM6ICBvYmpfZGVzYyAgICAgICAgICAgIC0gX0NJRCBvYmplY3QsIG11c3QgYmUgaW50ZWdlciBvciBzdHJpbmcKKyAqICAgICAgICAgICAgICBvbmVfY2lkICAgICAgICAgICAgIC0gV2hlcmUgdGhlIENJRCBzdHJpbmcgaXMgcmV0dXJuZWQKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IFJldHVybiBhIG51bWVyaWMgb3Igc3RyaW5nIF9DSUQgdmFsdWUgYXMgYSBzdHJpbmcuCisgKiAgICAgICAgICAgICAgKENvbXBhdGlibGUgSUQpCisgKgorICogICAgICAgICAgICAgIE5PVEU6ICBBc3N1bWVzIGEgbWF4aW11bSBfQ0lEIHN0cmluZyBsZW5ndGggb2YKKyAqICAgICAgICAgICAgICAgICAgICAgQUNQSV9NQVhfQ0lEX0xFTkdUSC4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgYWNwaV9zdGF0dXMKK2FjcGlfdXRfdHJhbnNsYXRlX29uZV9jaWQodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2MsCisJCQkgIHN0cnVjdCBhY3BpX2NvbXBhdGlibGVfaWQgKm9uZV9jaWQpCit7CisKKwlzd2l0Y2ggKEFDUElfR0VUX09CSkVDVF9UWVBFKG9ial9kZXNjKSkgeworCWNhc2UgQUNQSV9UWVBFX0lOVEVHRVI6CisKKwkJLyogQ29udmVydCB0aGUgTnVtZXJpYyBDSUQgdG8gc3RyaW5nICovCisKKwkJYWNwaV9leF9laXNhX2lkX3RvX3N0cmluZygodTMyKSBvYmpfZGVzYy0+aW50ZWdlci52YWx1ZSwKKwkJCQkJICBvbmVfY2lkLT52YWx1ZSk7CisJCXJldHVybiAoQUVfT0spOworCisJY2FzZSBBQ1BJX1RZUEVfU1RSSU5HOgorCisJCWlmIChvYmpfZGVzYy0+c3RyaW5nLmxlbmd0aCA+IEFDUElfTUFYX0NJRF9MRU5HVEgpIHsKKwkJCXJldHVybiAoQUVfQU1MX1NUUklOR19MSU1JVCk7CisJCX0KKworCQkvKiBDb3B5IHRoZSBTdHJpbmcgQ0lEIGZyb20gdGhlIHJldHVybmVkIG9iamVjdCAqLworCisJCWFjcGlfdXRfY29weV9pZF9zdHJpbmcob25lX2NpZC0+dmFsdWUsIG9ial9kZXNjLT5zdHJpbmcucG9pbnRlciwKKwkJCQkgICAgICAgQUNQSV9NQVhfQ0lEX0xFTkdUSCk7CisJCXJldHVybiAoQUVfT0spOworCisJZGVmYXVsdDoKKworCQlyZXR1cm4gKEFFX1RZUEUpOworCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV91dF9leGVjdXRlX0NJRAorICoKKyAqIFBBUkFNRVRFUlM6ICBkZXZpY2Vfbm9kZSAgICAgICAgIC0gTm9kZSBmb3IgdGhlIGRldmljZQorICogICAgICAgICAgICAgIHJldHVybl9jaWRfbGlzdCAgICAgLSBXaGVyZSB0aGUgQ0lEIGxpc3QgaXMgcmV0dXJuZWQKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IEV4ZWN1dGVzIHRoZSBfQ0lEIGNvbnRyb2wgbWV0aG9kIHRoYXQgcmV0dXJucyBvbmUgb3IgbW9yZQorICogICAgICAgICAgICAgIGNvbXBhdGlibGUgaGFyZHdhcmUgSURzIGZvciB0aGUgZGV2aWNlLgorICoKKyAqICAgICAgICAgICAgICBOT1RFOiBJbnRlcm5hbCBmdW5jdGlvbiwgbm8gcGFyYW1ldGVyIHZhbGlkYXRpb24KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCithY3BpX3N0YXR1cworYWNwaV91dF9leGVjdXRlX0NJRChzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqIGRldmljZV9ub2RlLAorCQkgICAgc3RydWN0IGFjcGlfY29tcGF0aWJsZV9pZF9saXN0ICoqIHJldHVybl9jaWRfbGlzdCkKK3sKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYzsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJdTMyIGNvdW50OworCXUzMiBzaXplOworCXN0cnVjdCBhY3BpX2NvbXBhdGlibGVfaWRfbGlzdCAqY2lkX2xpc3Q7CisJdTMyIGk7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKHV0X2V4ZWN1dGVfQ0lEKTsKKworCS8qIEV2YWx1YXRlIHRoZSBfQ0lEIG1ldGhvZCBmb3IgdGhpcyBkZXZpY2UgKi8KKworCXN0YXR1cyA9IGFjcGlfdXRfZXZhbHVhdGVfb2JqZWN0KGRldmljZV9ub2RlLCBNRVRIT0RfTkFNRV9fQ0lELAorCQkJCQkgQUNQSV9CVFlQRV9JTlRFR0VSIHwgQUNQSV9CVFlQRV9TVFJJTkcKKwkJCQkJIHwgQUNQSV9CVFlQRV9QQUNLQUdFLCAmb2JqX2Rlc2MpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKKwl9CisKKwkvKiBHZXQgdGhlIG51bWJlciBvZiBfQ0lEcyByZXR1cm5lZCAqLworCisJY291bnQgPSAxOworCWlmIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRShvYmpfZGVzYykgPT0gQUNQSV9UWVBFX1BBQ0tBR0UpIHsKKwkJY291bnQgPSBvYmpfZGVzYy0+cGFja2FnZS5jb3VudDsKKwl9CisKKwkvKiBBbGxvY2F0ZSBhIHdvcnN0LWNhc2UgYnVmZmVyIGZvciB0aGUgX0NJRHMgKi8KKworCXNpemUgPSAoKChjb3VudCAtIDEpICogc2l6ZW9mKHN0cnVjdCBhY3BpX2NvbXBhdGlibGVfaWQpKSArCisJCXNpemVvZihzdHJ1Y3QgYWNwaV9jb21wYXRpYmxlX2lkX2xpc3QpKTsKKworCWNpZF9saXN0ID0gQUNQSV9BTExPQ0FURV9aRVJPRUQoKGFjcGlfc2l6ZSkgc2l6ZSk7CisJaWYgKCFjaWRfbGlzdCkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9fTUVNT1JZKTsKKwl9CisKKwkvKiBJbml0IENJRCBsaXN0ICovCisKKwljaWRfbGlzdC0+Y291bnQgPSBjb3VudDsKKwljaWRfbGlzdC0+c2l6ZSA9IHNpemU7CisKKwkvKgorCSAqICBBIF9DSUQgY2FuIHJldHVybiBlaXRoZXIgYSBzaW5nbGUgY29tcGF0aWJsZSBJRCBvciBhIHBhY2thZ2Ugb2YKKwkgKiAgY29tcGF0aWJsZSBJRHMuICBFYWNoIGNvbXBhdGlibGUgSUQgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOgorCSAqICAxKSBJbnRlZ2VyICgzMiBiaXQgY29tcHJlc3NlZCBFSVNBIElEKSBvcgorCSAqICAyKSBTdHJpbmcgKFBDSSBJRCBmb3JtYXQsIGUuZy4gIlBDSVxWRU5fdnZ2diZERVZfZGRkZCZTVUJTWVNfc3Nzc3Nzc3MiKQorCSAqLworCisJLyogVGhlIF9DSUQgb2JqZWN0IGNhbiBiZSBlaXRoZXIgYSBzaW5nbGUgQ0lEIG9yIGEgcGFja2FnZSAobGlzdCkgb2YgQ0lEcyAqLworCisJaWYgKEFDUElfR0VUX09CSkVDVF9UWVBFKG9ial9kZXNjKSA9PSBBQ1BJX1RZUEVfUEFDS0FHRSkgeworCisJCS8qIFRyYW5zbGF0ZSBlYWNoIHBhY2thZ2UgZWxlbWVudCAqLworCisJCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisJCQlzdGF0dXMgPQorCQkJICAgIGFjcGlfdXRfdHJhbnNsYXRlX29uZV9jaWQob2JqX2Rlc2MtPnBhY2thZ2UuCisJCQkJCQkgICAgICBlbGVtZW50c1tpXSwKKwkJCQkJCSAgICAgICZjaWRfbGlzdC0+aWRbaV0pOworCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQkvKiBPbmx5IG9uZSBDSUQsIHRyYW5zbGF0ZSB0byBhIHN0cmluZyAqLworCisJCXN0YXR1cyA9IGFjcGlfdXRfdHJhbnNsYXRlX29uZV9jaWQob2JqX2Rlc2MsIGNpZF9saXN0LT5pZCk7CisJfQorCisJLyogQ2xlYW51cCBvbiBlcnJvciAqLworCisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCUFDUElfRlJFRShjaWRfbGlzdCk7CisJfSBlbHNlIHsKKwkJKnJldHVybl9jaWRfbGlzdCA9IGNpZF9saXN0OworCX0KKworCS8qIE9uIGV4aXQsIHdlIG11c3QgZGVsZXRlIHRoZSBfQ0lEIHJldHVybiBvYmplY3QgKi8KKworCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZShvYmpfZGVzYyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfdXRfZXhlY3V0ZV9VSUQKKyAqCisgKiBQQVJBTUVURVJTOiAgZGV2aWNlX25vZGUgICAgICAgICAtIE5vZGUgZm9yIHRoZSBkZXZpY2UKKyAqICAgICAgICAgICAgICBVaWQgICAgICAgICAgICAgICAgIC0gV2hlcmUgdGhlIFVJRCBpcyByZXR1cm5lZAorICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogRXhlY3V0ZXMgdGhlIF9VSUQgY29udHJvbCBtZXRob2QgdGhhdCByZXR1cm5zIHRoZSBoYXJkd2FyZQorICogICAgICAgICAgICAgIElEIG9mIHRoZSBkZXZpY2UuCisgKgorICogICAgICAgICAgICAgIE5PVEU6IEludGVybmFsIGZ1bmN0aW9uLCBubyBwYXJhbWV0ZXIgdmFsaWRhdGlvbgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2FjcGlfc3RhdHVzCithY3BpX3V0X2V4ZWN1dGVfVUlEKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpkZXZpY2Vfbm9kZSwKKwkJICAgIHN0cnVjdCBhY3BpY2FfZGV2aWNlX2lkICp1aWQpCit7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2M7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCisJQUNQSV9GVU5DVElPTl9UUkFDRSh1dF9leGVjdXRlX1VJRCk7CisKKwlzdGF0dXMgPSBhY3BpX3V0X2V2YWx1YXRlX29iamVjdChkZXZpY2Vfbm9kZSwgTUVUSE9EX05BTUVfX1VJRCwKKwkJCQkJIEFDUElfQlRZUEVfSU5URUdFUiB8IEFDUElfQlRZUEVfU1RSSU5HLAorCQkJCQkgJm9ial9kZXNjKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CisJfQorCisJaWYgKEFDUElfR0VUX09CSkVDVF9UWVBFKG9ial9kZXNjKSA9PSBBQ1BJX1RZUEVfSU5URUdFUikgeworCisJCS8qIENvbnZlcnQgdGhlIE51bWVyaWMgVUlEIHRvIHN0cmluZyAqLworCisJCWFjcGlfZXhfdW5zaWduZWRfaW50ZWdlcl90b19zdHJpbmcob2JqX2Rlc2MtPmludGVnZXIudmFsdWUsCisJCQkJCQkgICB1aWQtPnZhbHVlKTsKKwl9IGVsc2UgeworCQkvKiBDb3B5IHRoZSBTdHJpbmcgVUlEIGZyb20gdGhlIHJldHVybmVkIG9iamVjdCAqLworCisJCWFjcGlfdXRfY29weV9pZF9zdHJpbmcodWlkLT52YWx1ZSwgb2JqX2Rlc2MtPnN0cmluZy5wb2ludGVyLAorCQkJCSAgICAgICBzaXplb2YodWlkLT52YWx1ZSkpOworCX0KKworCS8qIE9uIGV4aXQsIHdlIG11c3QgZGVsZXRlIHRoZSByZXR1cm4gb2JqZWN0ICovCisKKwlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2Uob2JqX2Rlc2MpOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X2V4ZWN1dGVfU1RBCisgKgorICogUEFSQU1FVEVSUzogIGRldmljZV9ub2RlICAgICAgICAgLSBOb2RlIGZvciB0aGUgZGV2aWNlCisgKiAgICAgICAgICAgICAgRmxhZ3MgICAgICAgICAgICAgICAtIFdoZXJlIHRoZSBzdGF0dXMgZmxhZ3MgYXJlIHJldHVybmVkCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBFeGVjdXRlcyBfU1RBIGZvciBzZWxlY3RlZCBkZXZpY2UgYW5kIHN0b3JlcyByZXN1bHRzIGluCisgKiAgICAgICAgICAgICAgKkZsYWdzLgorICoKKyAqICAgICAgICAgICAgICBOT1RFOiBJbnRlcm5hbCBmdW5jdGlvbiwgbm8gcGFyYW1ldGVyIHZhbGlkYXRpb24KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCithY3BpX3N0YXR1cworYWNwaV91dF9leGVjdXRlX1NUQShzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqZGV2aWNlX25vZGUsIHUzMiAqIGZsYWdzKQoreworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0UodXRfZXhlY3V0ZV9TVEEpOworCisJc3RhdHVzID0gYWNwaV91dF9ldmFsdWF0ZV9vYmplY3QoZGV2aWNlX25vZGUsIE1FVEhPRF9OQU1FX19TVEEsCisJCQkJCSBBQ1BJX0JUWVBFX0lOVEVHRVIsICZvYmpfZGVzYyk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCWlmIChBRV9OT1RfRk9VTkQgPT0gc3RhdHVzKSB7CisJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VYRUMsCisJCQkJCSAgIl9TVEEgb24gJTQuNHMgd2FzIG5vdCBmb3VuZCwgYXNzdW1pbmcgZGV2aWNlIGlzIHByZXNlbnRcbiIsCisJCQkJCSAgYWNwaV91dF9nZXRfbm9kZV9uYW1lKGRldmljZV9ub2RlKSkpOworCisJCQkqZmxhZ3MgPSBBQ1BJX1VJTlQzMl9NQVg7CisJCQlzdGF0dXMgPSBBRV9PSzsKKwkJfQorCisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworCX0KKworCS8qIEV4dHJhY3QgdGhlIHN0YXR1cyBmbGFncyAqLworCisJKmZsYWdzID0gKHUzMikgb2JqX2Rlc2MtPmludGVnZXIudmFsdWU7CisKKwkvKiBPbiBleGl0LCB3ZSBtdXN0IGRlbGV0ZSB0aGUgcmV0dXJuIG9iamVjdCAqLworCisJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKG9ial9kZXNjKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV91dF9leGVjdXRlX1N4ZHMKKyAqCisgKiBQQVJBTUVURVJTOiAgZGV2aWNlX25vZGUgICAgICAgICAtIE5vZGUgZm9yIHRoZSBkZXZpY2UKKyAqICAgICAgICAgICAgICBGbGFncyAgICAgICAgICAgICAgIC0gV2hlcmUgdGhlIHN0YXR1cyBmbGFncyBhcmUgcmV0dXJuZWQKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IEV4ZWN1dGVzIF9TVEEgZm9yIHNlbGVjdGVkIGRldmljZSBhbmQgc3RvcmVzIHJlc3VsdHMgaW4KKyAqICAgICAgICAgICAgICAqRmxhZ3MuCisgKgorICogICAgICAgICAgICAgIE5PVEU6IEludGVybmFsIGZ1bmN0aW9uLCBubyBwYXJhbWV0ZXIgdmFsaWRhdGlvbgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2FjcGlfc3RhdHVzCithY3BpX3V0X2V4ZWN1dGVfc3hkcyhzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqZGV2aWNlX25vZGUsIHU4ICogaGlnaGVzdCkKK3sKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYzsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJdTMyIGk7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKHV0X2V4ZWN1dGVfc3hkcyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJCWhpZ2hlc3RbaV0gPSAweEZGOworCQlzdGF0dXMgPSBhY3BpX3V0X2V2YWx1YXRlX29iamVjdChkZXZpY2Vfbm9kZSwKKwkJCQkJCSBBQ1BJX0NBU1RfUFRSKGNoYXIsCisJCQkJCQkJICAgICAgIGFjcGlfZ2JsX2hpZ2hlc3RfZHN0YXRlX25hbWVzCisJCQkJCQkJICAgICAgIFtpXSksCisJCQkJCQkgQUNQSV9CVFlQRV9JTlRFR0VSLCAmb2JqX2Rlc2MpOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCWlmIChzdGF0dXMgIT0gQUVfTk9UX0ZPVU5EKSB7CisJCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FWEVDLAorCQkJCQkJICAiJXMgb24gRGV2aWNlICU0LjRzLCAlc1xuIiwKKwkJCQkJCSAgQUNQSV9DQVNUX1BUUihjaGFyLAorCQkJCQkJCQlhY3BpX2dibF9oaWdoZXN0X2RzdGF0ZV9uYW1lcworCQkJCQkJCQlbaV0pLAorCQkJCQkJICBhY3BpX3V0X2dldF9ub2RlX25hbWUKKwkJCQkJCSAgKGRldmljZV9ub2RlKSwKKwkJCQkJCSAgYWNwaV9mb3JtYXRfZXhjZXB0aW9uCisJCQkJCQkgIChzdGF0dXMpKSk7CisKKwkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8qIEV4dHJhY3QgdGhlIERzdGF0ZSB2YWx1ZSAqLworCisJCQloaWdoZXN0W2ldID0gKHU4KSBvYmpfZGVzYy0+aW50ZWdlci52YWx1ZTsKKworCQkJLyogRGVsZXRlIHRoZSByZXR1cm4gb2JqZWN0ICovCisKKwkJCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZShvYmpfZGVzYyk7CisJCX0KKwl9CisKKwlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS91dGdsb2JhbC5jIGIvZHJpdmVycy9hY3BpL2FjcGljYS91dGdsb2JhbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzYWI5ZDkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL3V0Z2xvYmFsLmMKQEAgLTAsMCArMSw4MjMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBNb2R1bGUgTmFtZTogdXRnbG9iYWwgLSBHbG9iYWwgdmFyaWFibGVzIGZvciB0aGUgQUNQSSBzdWJzeXN0ZW0KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA4LCBJbnRlbCBDb3JwLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAorICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgYXQgbWluaW11bSBhIGRpc2NsYWltZXIKKyAqICAgIHN1YnN0YW50aWFsbHkgc2ltaWxhciB0byB0aGUgIk5PIFdBUlJBTlRZIiBkaXNjbGFpbWVyIGJlbG93CisgKiAgICAoIkRpc2NsYWltZXIiKSBhbmQgYW55IHJlZGlzdHJpYnV0aW9uIG11c3QgYmUgY29uZGl0aW9uZWQgdXBvbgorICogICAgaW5jbHVkaW5nIGEgc3Vic3RhbnRpYWxseSBzaW1pbGFyIERpc2NsYWltZXIgcmVxdWlyZW1lbnQgZm9yIGZ1cnRoZXIKKyAqICAgIGJpbmFyeSByZWRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcworICogICAgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBOTyBXQVJSQU5UWQorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcKKyAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgorICovCisKKyNkZWZpbmUgREVGSU5FX0FDUElfR0xPQkFMUworCisjaW5jbHVkZSA8YWNwaS9hY3BpLmg+CisjaW5jbHVkZSAiYWNjb21tb24uaCIKKyNpbmNsdWRlICJhY25hbWVzcC5oIgorCisjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9VVElMSVRJRVMKK0FDUElfTU9EVUxFX05BTUUoInV0Z2xvYmFsIikKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBTdGF0aWMgZ2xvYmFsIHZhcmlhYmxlIGluaXRpYWxpemF0aW9uLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogV2Ugd2FudCB0aGUgZGVidWcgc3dpdGNoZXMgc3RhdGljYWxseSBpbml0aWFsaXplZCBzbyB0aGV5CisgKiBhcmUgYWxyZWFkeSBzZXQgd2hlbiB0aGUgZGVidWdnZXIgaXMgZW50ZXJlZC4KKyAqLworLyogRGVidWcgc3dpdGNoIC0gbGV2ZWwgYW5kIHRyYWNlIG1hc2sgKi8KK3UzMiBhY3BpX2RiZ19sZXZlbCA9IEFDUElfREVCVUdfREVGQVVMVDsKKworLyogRGVidWcgc3dpdGNoIC0gbGF5ZXIgKGNvbXBvbmVudCkgbWFzayAqLworCit1MzIgYWNwaV9kYmdfbGF5ZXIgPSAwOwordTMyIGFjcGlfZ2JsX25lc3RpbmdfbGV2ZWwgPSAwOworCisvKiBEZWJ1Z2dlciBnbG9iYWxzICovCisKK3U4IGFjcGlfZ2JsX2RiX3Rlcm1pbmF0ZV90aHJlYWRzID0gRkFMU0U7Cit1OCBhY3BpX2dibF9hYm9ydF9tZXRob2QgPSBGQUxTRTsKK3U4IGFjcGlfZ2JsX21ldGhvZF9leGVjdXRpbmcgPSBGQUxTRTsKKworLyogU3lzdGVtIGZsYWdzICovCisKK3UzMiBhY3BpX2dibF9zdGFydHVwX2ZsYWdzID0gMDsKKworLyogU3lzdGVtIHN0YXJ0cyB1bmluaXRpYWxpemVkICovCisKK3U4IGFjcGlfZ2JsX3NodXRkb3duID0gVFJVRTsKKworY29uc3QgY2hhciAqYWNwaV9nYmxfc2xlZXBfc3RhdGVfbmFtZXNbQUNQSV9TX1NUQVRFX0NPVU5UXSA9IHsKKwkiXFxfUzBfIiwKKwkiXFxfUzFfIiwKKwkiXFxfUzJfIiwKKwkiXFxfUzNfIiwKKwkiXFxfUzRfIiwKKwkiXFxfUzVfIgorfTsKKworY29uc3QgY2hhciAqYWNwaV9nYmxfaGlnaGVzdF9kc3RhdGVfbmFtZXNbNF0gPSB7CisJIl9TMUQiLAorCSJfUzJEIiwKKwkiX1MzRCIsCisJIl9TNEQiCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX2Zvcm1hdF9leGNlcHRpb24KKyAqCisgKiBQQVJBTUVURVJTOiAgU3RhdHVzICAgICAgIC0gVGhlIGFjcGlfc3RhdHVzIGNvZGUgdG8gYmUgZm9ybWF0dGVkCisgKgorICogUkVUVVJOOiAgICAgIEEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIGV4Y2VwdGlvbiB0ZXh0LiBBIHZhbGlkIHBvaW50ZXIgaXMKKyAqICAgICAgICAgICAgICBhbHdheXMgcmV0dXJuZWQuCisgKgorICogREVTQ1JJUFRJT046IFRoaXMgZnVuY3Rpb24gdHJhbnNsYXRlcyBhbiBBQ1BJIGV4Y2VwdGlvbiBpbnRvIGFuIEFTQ0lJIHN0cmluZworICogICAgICAgICAgICAgIEl0IGlzIGhlcmUgaW5zdGVhZCBvZiB1dHhmYWNlLmMgc28gaXQgaXMgYWx3YXlzIHByZXNlbnQuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworY29uc3QgY2hhciAqYWNwaV9mb3JtYXRfZXhjZXB0aW9uKGFjcGlfc3RhdHVzIHN0YXR1cykKK3sKKwljb25zdCBjaGFyICpleGNlcHRpb24gPSBOVUxMOworCisJQUNQSV9GVU5DVElPTl9FTlRSWSgpOworCisJZXhjZXB0aW9uID0gYWNwaV91dF92YWxpZGF0ZV9leGNlcHRpb24oc3RhdHVzKTsKKwlpZiAoIWV4Y2VwdGlvbikgeworCisJCS8qIEV4Y2VwdGlvbiBjb2RlIHdhcyBub3QgcmVjb2duaXplZCAqLworCisJCUFDUElfRVJST1IoKEFFX0lORk8sCisJCQkgICAgIlVua25vd24gZXhjZXB0aW9uIGNvZGU6IDB4JTguOFgiLCBzdGF0dXMpKTsKKworCQlleGNlcHRpb24gPSAiVU5LTk9XTl9TVEFUVVNfQ09ERSI7CisJCWR1bXBfc3RhY2soKTsKKwl9CisKKwlyZXR1cm4gKEFDUElfQ0FTVF9QVFIoY29uc3QgY2hhciwgZXhjZXB0aW9uKSk7Cit9CisKK0FDUElfRVhQT1JUX1NZTUJPTChhY3BpX2Zvcm1hdF9leGNlcHRpb24pCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogTmFtZXNwYWNlIGdsb2JhbHMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIFByZWRlZmluZWQgQUNQSSBOYW1lcyAoQnVpbHQtaW4gdG8gdGhlIEludGVycHJldGVyKQorICoKKyAqIE5PVEVTOgorICogMSkgX1NCXyBpcyBkZWZpbmVkIHRvIGJlIGEgZGV2aWNlIHRvIGFsbG93IFxfU0JfLl9JTkkgdG8gYmUgcnVuCisgKiAgICBkdXJpbmcgdGhlIGluaXRpYWxpemF0aW9uIHNlcXVlbmNlLgorICogMikgX1RaXyBpcyBkZWZpbmVkIHRvIGJlIGEgdGhlcm1hbCB6b25lIGluIG9yZGVyIHRvIGFsbG93IEFTTCBjb2RlIHRvCisgKiAgICBwZXJmb3JtIGEgTm90aWZ5KCkgb3BlcmF0aW9uIG9uIGl0LgorICovCitjb25zdCBzdHJ1Y3QgYWNwaV9wcmVkZWZpbmVkX25hbWVzIGFjcGlfZ2JsX3ByZV9kZWZpbmVkX25hbWVzW10gPSB7CisJeyJfR1BFIiwgQUNQSV9UWVBFX0xPQ0FMX1NDT1BFLCBOVUxMfSwKKwl7Il9QUl8iLCBBQ1BJX1RZUEVfTE9DQUxfU0NPUEUsIE5VTEx9LAorCXsiX1NCXyIsIEFDUElfVFlQRV9ERVZJQ0UsIE5VTEx9LAorCXsiX1NJXyIsIEFDUElfVFlQRV9MT0NBTF9TQ09QRSwgTlVMTH0sCisJeyJfVFpfIiwgQUNQSV9UWVBFX1RIRVJNQUwsIE5VTEx9LAorCXsiX1JFViIsIEFDUElfVFlQRV9JTlRFR0VSLCAoY2hhciAqKUFDUElfQ0FfU1VQUE9SVF9MRVZFTH0sCisJeyJfT1NfIiwgQUNQSV9UWVBFX1NUUklORywgQUNQSV9PU19OQU1FfSwKKwl7Il9HTF8iLCBBQ1BJX1RZUEVfTVVURVgsIChjaGFyICopMX0sCisKKyNpZiAhZGVmaW5lZCAoQUNQSV9OT19NRVRIT0RfRVhFQ1VUSU9OKSB8fCBkZWZpbmVkIChBQ1BJX0NPTlNUQU5UX0VWQUxfT05MWSkKKwl7Il9PU0kiLCBBQ1BJX1RZUEVfTUVUSE9ELCAoY2hhciAqKTF9LAorI2VuZGlmCisKKwkvKiBUYWJsZSB0ZXJtaW5hdG9yICovCisKKwl7TlVMTCwgQUNQSV9UWVBFX0FOWSwgTlVMTH0KK307CisKKy8qCisgKiBQcm9wZXJ0aWVzIG9mIHRoZSBBQ1BJIE9iamVjdCBUeXBlcywgYm90aCBpbnRlcm5hbCBhbmQgZXh0ZXJuYWwuCisgKiBUaGUgdGFibGUgaXMgaW5kZXhlZCBieSB2YWx1ZXMgb2YgYWNwaV9vYmplY3RfdHlwZQorICovCitjb25zdCB1OCBhY3BpX2dibF9uc19wcm9wZXJ0aWVzW10gPSB7CisJQUNQSV9OU19OT1JNQUwsCQkvKiAwMCBBbnkgICAgICAgICAgICAgICovCisJQUNQSV9OU19OT1JNQUwsCQkvKiAwMSBOdW1iZXIgICAgICAgICAgICovCisJQUNQSV9OU19OT1JNQUwsCQkvKiAwMiBTdHJpbmcgICAgICAgICAgICovCisJQUNQSV9OU19OT1JNQUwsCQkvKiAwMyBCdWZmZXIgICAgICAgICAgICovCisJQUNQSV9OU19OT1JNQUwsCQkvKiAwNCBQYWNrYWdlICAgICAgICAgICovCisJQUNQSV9OU19OT1JNQUwsCQkvKiAwNSBmaWVsZF91bml0ICAgICAgICovCisJQUNQSV9OU19ORVdTQ09QRSwJLyogMDYgRGV2aWNlICAgICAgICAgICAqLworCUFDUElfTlNfTk9STUFMLAkJLyogMDcgRXZlbnQgICAgICAgICAgICAqLworCUFDUElfTlNfTkVXU0NPUEUsCS8qIDA4IE1ldGhvZCAgICAgICAgICAgKi8KKwlBQ1BJX05TX05PUk1BTCwJCS8qIDA5IE11dGV4ICAgICAgICAgICAgKi8KKwlBQ1BJX05TX05PUk1BTCwJCS8qIDEwIFJlZ2lvbiAgICAgICAgICAgKi8KKwlBQ1BJX05TX05FV1NDT1BFLAkvKiAxMSBQb3dlciAgICAgICAgICAgICovCisJQUNQSV9OU19ORVdTQ09QRSwJLyogMTIgUHJvY2Vzc29yICAgICAgICAqLworCUFDUElfTlNfTkVXU0NPUEUsCS8qIDEzIFRoZXJtYWwgICAgICAgICAgKi8KKwlBQ1BJX05TX05PUk1BTCwJCS8qIDE0IGJ1ZmZlcl9maWVsZCAgICAgKi8KKwlBQ1BJX05TX05PUk1BTCwJCS8qIDE1IGRkYl9oYW5kbGUgICAgICAgKi8KKwlBQ1BJX05TX05PUk1BTCwJCS8qIDE2IERlYnVnIE9iamVjdCAgICAgKi8KKwlBQ1BJX05TX05PUk1BTCwJCS8qIDE3IGRlZl9maWVsZCAgICAgICAgKi8KKwlBQ1BJX05TX05PUk1BTCwJCS8qIDE4IGJhbmtfZmllbGQgICAgICAgKi8KKwlBQ1BJX05TX05PUk1BTCwJCS8qIDE5IGluZGV4X2ZpZWxkICAgICAgKi8KKwlBQ1BJX05TX05PUk1BTCwJCS8qIDIwIFJlZmVyZW5jZSAgICAgICAgKi8KKwlBQ1BJX05TX05PUk1BTCwJCS8qIDIxIEFsaWFzICAgICAgICAgICAgKi8KKwlBQ1BJX05TX05PUk1BTCwJCS8qIDIyIG1ldGhvZF9hbGlhcyAgICAgKi8KKwlBQ1BJX05TX05PUk1BTCwJCS8qIDIzIE5vdGlmeSAgICAgICAgICAgKi8KKwlBQ1BJX05TX05PUk1BTCwJCS8qIDI0IEFkZHJlc3MgSGFuZGxlciAgKi8KKwlBQ1BJX05TX05FV1NDT1BFIHwgQUNQSV9OU19MT0NBTCwJLyogMjUgUmVzb3VyY2UgRGVzYyAgICAqLworCUFDUElfTlNfTkVXU0NPUEUgfCBBQ1BJX05TX0xPQ0FMLAkvKiAyNiBSZXNvdXJjZSBGaWVsZCAgICovCisJQUNQSV9OU19ORVdTQ09QRSwJLyogMjcgU2NvcGUgICAgICAgICAgICAqLworCUFDUElfTlNfTk9STUFMLAkJLyogMjggRXh0cmEgICAgICAgICAgICAqLworCUFDUElfTlNfTk9STUFMLAkJLyogMjkgRGF0YSAgICAgICAgICAgICAqLworCUFDUElfTlNfTk9STUFMCQkvKiAzMCBJbnZhbGlkICAgICAgICAgICovCit9OworCisvKiBIZXggdG8gQVNDSUkgY29udmVyc2lvbiB0YWJsZSAqLworCitzdGF0aWMgY29uc3QgY2hhciBhY3BpX2dibF9oZXhfdG9fYXNjaWlbXSA9IHsKKwknMCcsICcxJywgJzInLCAnMycsICc0JywgJzUnLCAnNicsICc3JywKKwknOCcsICc5JywgJ0EnLCAnQicsICdDJywgJ0QnLCAnRScsICdGJworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV91dF9oZXhfdG9fYXNjaWlfY2hhcgorICoKKyAqIFBBUkFNRVRFUlM6ICBJbnRlZ2VyICAgICAgICAgICAgIC0gQ29udGFpbnMgdGhlIGhleCBkaWdpdAorICogICAgICAgICAgICAgIFBvc2l0aW9uICAgICAgICAgICAgLSBiaXQgcG9zaXRpb24gb2YgdGhlIGRpZ2l0IHdpdGhpbiB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZWdlciAobXVsdGlwbGUgb2YgNCkKKyAqCisgKiBSRVRVUk46ICAgICAgVGhlIGNvbnZlcnRlZCBBc2NpaSBjaGFyYWN0ZXIKKyAqCisgKiBERVNDUklQVElPTjogQ29udmVydCBhIGhleCBkaWdpdCB0byBhbiBBc2NpaSBjaGFyYWN0ZXIKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitjaGFyIGFjcGlfdXRfaGV4X3RvX2FzY2lpX2NoYXIoYWNwaV9pbnRlZ2VyIGludGVnZXIsIHUzMiBwb3NpdGlvbikKK3sKKworCXJldHVybiAoYWNwaV9nYmxfaGV4X3RvX2FzY2lpWyhpbnRlZ2VyID4+IHBvc2l0aW9uKSAmIDB4Rl0pOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRXZlbnQgYW5kIEhhcmR3YXJlIGdsb2JhbHMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdHJ1Y3QgYWNwaV9iaXRfcmVnaXN0ZXJfaW5mbyBhY3BpX2dibF9iaXRfcmVnaXN0ZXJfaW5mb1tBQ1BJX05VTV9CSVRSRUddID0geworCS8qIE5hbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyZW50IFJlZ2lzdGVyICAgICAgICAgICAgIFJlZ2lzdGVyIEJpdCBQb3NpdGlvbiAgICAgICAgICAgICAgICAgICBSZWdpc3RlciBCaXQgTWFzayAgICAgICAqLworCisJLyogQUNQSV9CSVRSRUdfVElNRVJfU1RBVFVTICAgICAgICAgKi8ge0FDUElfUkVHSVNURVJfUE0xX1NUQVRVUywKKwkJCQkJCUFDUElfQklUUE9TSVRJT05fVElNRVJfU1RBVFVTLAorCQkJCQkJQUNQSV9CSVRNQVNLX1RJTUVSX1NUQVRVU30sCisJLyogQUNQSV9CSVRSRUdfQlVTX01BU1RFUl9TVEFUVVMgICAgKi8ge0FDUElfUkVHSVNURVJfUE0xX1NUQVRVUywKKwkJCQkJCUFDUElfQklUUE9TSVRJT05fQlVTX01BU1RFUl9TVEFUVVMsCisJCQkJCQlBQ1BJX0JJVE1BU0tfQlVTX01BU1RFUl9TVEFUVVN9LAorCS8qIEFDUElfQklUUkVHX0dMT0JBTF9MT0NLX1NUQVRVUyAgICovIHtBQ1BJX1JFR0lTVEVSX1BNMV9TVEFUVVMsCisJCQkJCQlBQ1BJX0JJVFBPU0lUSU9OX0dMT0JBTF9MT0NLX1NUQVRVUywKKwkJCQkJCUFDUElfQklUTUFTS19HTE9CQUxfTE9DS19TVEFUVVN9LAorCS8qIEFDUElfQklUUkVHX1BPV0VSX0JVVFRPTl9TVEFUVVMgICovIHtBQ1BJX1JFR0lTVEVSX1BNMV9TVEFUVVMsCisJCQkJCQlBQ1BJX0JJVFBPU0lUSU9OX1BPV0VSX0JVVFRPTl9TVEFUVVMsCisJCQkJCQlBQ1BJX0JJVE1BU0tfUE9XRVJfQlVUVE9OX1NUQVRVU30sCisJLyogQUNQSV9CSVRSRUdfU0xFRVBfQlVUVE9OX1NUQVRVUyAgKi8ge0FDUElfUkVHSVNURVJfUE0xX1NUQVRVUywKKwkJCQkJCUFDUElfQklUUE9TSVRJT05fU0xFRVBfQlVUVE9OX1NUQVRVUywKKwkJCQkJCUFDUElfQklUTUFTS19TTEVFUF9CVVRUT05fU1RBVFVTfSwKKwkvKiBBQ1BJX0JJVFJFR19SVF9DTE9DS19TVEFUVVMgICAgICAqLyB7QUNQSV9SRUdJU1RFUl9QTTFfU1RBVFVTLAorCQkJCQkJQUNQSV9CSVRQT1NJVElPTl9SVF9DTE9DS19TVEFUVVMsCisJCQkJCQlBQ1BJX0JJVE1BU0tfUlRfQ0xPQ0tfU1RBVFVTfSwKKwkvKiBBQ1BJX0JJVFJFR19XQUtFX1NUQVRVUyAgICAgICAgICAqLyB7QUNQSV9SRUdJU1RFUl9QTTFfU1RBVFVTLAorCQkJCQkJQUNQSV9CSVRQT1NJVElPTl9XQUtFX1NUQVRVUywKKwkJCQkJCUFDUElfQklUTUFTS19XQUtFX1NUQVRVU30sCisJLyogQUNQSV9CSVRSRUdfUENJRVhQX1dBS0VfU1RBVFVTICAgKi8ge0FDUElfUkVHSVNURVJfUE0xX1NUQVRVUywKKwkJCQkJCUFDUElfQklUUE9TSVRJT05fUENJRVhQX1dBS0VfU1RBVFVTLAorCQkJCQkJQUNQSV9CSVRNQVNLX1BDSUVYUF9XQUtFX1NUQVRVU30sCisKKwkvKiBBQ1BJX0JJVFJFR19USU1FUl9FTkFCTEUgICAgICAgICAqLyB7QUNQSV9SRUdJU1RFUl9QTTFfRU5BQkxFLAorCQkJCQkJQUNQSV9CSVRQT1NJVElPTl9USU1FUl9FTkFCTEUsCisJCQkJCQlBQ1BJX0JJVE1BU0tfVElNRVJfRU5BQkxFfSwKKwkvKiBBQ1BJX0JJVFJFR19HTE9CQUxfTE9DS19FTkFCTEUgICAqLyB7QUNQSV9SRUdJU1RFUl9QTTFfRU5BQkxFLAorCQkJCQkJQUNQSV9CSVRQT1NJVElPTl9HTE9CQUxfTE9DS19FTkFCTEUsCisJCQkJCQlBQ1BJX0JJVE1BU0tfR0xPQkFMX0xPQ0tfRU5BQkxFfSwKKwkvKiBBQ1BJX0JJVFJFR19QT1dFUl9CVVRUT05fRU5BQkxFICAqLyB7QUNQSV9SRUdJU1RFUl9QTTFfRU5BQkxFLAorCQkJCQkJQUNQSV9CSVRQT1NJVElPTl9QT1dFUl9CVVRUT05fRU5BQkxFLAorCQkJCQkJQUNQSV9CSVRNQVNLX1BPV0VSX0JVVFRPTl9FTkFCTEV9LAorCS8qIEFDUElfQklUUkVHX1NMRUVQX0JVVFRPTl9FTkFCTEUgICovIHtBQ1BJX1JFR0lTVEVSX1BNMV9FTkFCTEUsCisJCQkJCQlBQ1BJX0JJVFBPU0lUSU9OX1NMRUVQX0JVVFRPTl9FTkFCTEUsCisJCQkJCQlBQ1BJX0JJVE1BU0tfU0xFRVBfQlVUVE9OX0VOQUJMRX0sCisJLyogQUNQSV9CSVRSRUdfUlRfQ0xPQ0tfRU5BQkxFICAgICAgKi8ge0FDUElfUkVHSVNURVJfUE0xX0VOQUJMRSwKKwkJCQkJCUFDUElfQklUUE9TSVRJT05fUlRfQ0xPQ0tfRU5BQkxFLAorCQkJCQkJQUNQSV9CSVRNQVNLX1JUX0NMT0NLX0VOQUJMRX0sCisJLyogQUNQSV9CSVRSRUdfUENJRVhQX1dBS0VfRElTQUJMRSAgKi8ge0FDUElfUkVHSVNURVJfUE0xX0VOQUJMRSwKKwkJCQkJCUFDUElfQklUUE9TSVRJT05fUENJRVhQX1dBS0VfRElTQUJMRSwKKwkJCQkJCUFDUElfQklUTUFTS19QQ0lFWFBfV0FLRV9ESVNBQkxFfSwKKworCS8qIEFDUElfQklUUkVHX1NDSV9FTkFCTEUgICAgICAgICAgICovIHtBQ1BJX1JFR0lTVEVSX1BNMV9DT05UUk9MLAorCQkJCQkJQUNQSV9CSVRQT1NJVElPTl9TQ0lfRU5BQkxFLAorCQkJCQkJQUNQSV9CSVRNQVNLX1NDSV9FTkFCTEV9LAorCS8qIEFDUElfQklUUkVHX0JVU19NQVNURVJfUkxEICAgICAgICovIHtBQ1BJX1JFR0lTVEVSX1BNMV9DT05UUk9MLAorCQkJCQkJQUNQSV9CSVRQT1NJVElPTl9CVVNfTUFTVEVSX1JMRCwKKwkJCQkJCUFDUElfQklUTUFTS19CVVNfTUFTVEVSX1JMRH0sCisJLyogQUNQSV9CSVRSRUdfR0xPQkFMX0xPQ0tfUkVMRUFTRSAgKi8ge0FDUElfUkVHSVNURVJfUE0xX0NPTlRST0wsCisJCQkJCQlBQ1BJX0JJVFBPU0lUSU9OX0dMT0JBTF9MT0NLX1JFTEVBU0UsCisJCQkJCQlBQ1BJX0JJVE1BU0tfR0xPQkFMX0xPQ0tfUkVMRUFTRX0sCisJLyogQUNQSV9CSVRSRUdfU0xFRVBfVFlQRV9BICAgICAgICAgKi8ge0FDUElfUkVHSVNURVJfUE0xX0NPTlRST0wsCisJCQkJCQlBQ1BJX0JJVFBPU0lUSU9OX1NMRUVQX1RZUEVfWCwKKwkJCQkJCUFDUElfQklUTUFTS19TTEVFUF9UWVBFX1h9LAorCS8qIEFDUElfQklUUkVHX1NMRUVQX1RZUEVfQiAgICAgICAgICovIHtBQ1BJX1JFR0lTVEVSX1BNMV9DT05UUk9MLAorCQkJCQkJQUNQSV9CSVRQT1NJVElPTl9TTEVFUF9UWVBFX1gsCisJCQkJCQlBQ1BJX0JJVE1BU0tfU0xFRVBfVFlQRV9YfSwKKwkvKiBBQ1BJX0JJVFJFR19TTEVFUF9FTkFCTEUgICAgICAgICAqLyB7QUNQSV9SRUdJU1RFUl9QTTFfQ09OVFJPTCwKKwkJCQkJCUFDUElfQklUUE9TSVRJT05fU0xFRVBfRU5BQkxFLAorCQkJCQkJQUNQSV9CSVRNQVNLX1NMRUVQX0VOQUJMRX0sCisKKwkvKiBBQ1BJX0JJVFJFR19BUkJfRElTICAgICAgICAgICAgICAqLyB7QUNQSV9SRUdJU1RFUl9QTTJfQ09OVFJPTCwKKwkJCQkJCUFDUElfQklUUE9TSVRJT05fQVJCX0RJU0FCTEUsCisJCQkJCQlBQ1BJX0JJVE1BU0tfQVJCX0RJU0FCTEV9Cit9OworCitzdHJ1Y3QgYWNwaV9maXhlZF9ldmVudF9pbmZvIGFjcGlfZ2JsX2ZpeGVkX2V2ZW50X2luZm9bQUNQSV9OVU1fRklYRURfRVZFTlRTXSA9IHsKKwkvKiBBQ1BJX0VWRU5UX1BNVElNRVIgICAgICAgKi8ge0FDUElfQklUUkVHX1RJTUVSX1NUQVRVUywKKwkJCQkJQUNQSV9CSVRSRUdfVElNRVJfRU5BQkxFLAorCQkJCQlBQ1BJX0JJVE1BU0tfVElNRVJfU1RBVFVTLAorCQkJCQlBQ1BJX0JJVE1BU0tfVElNRVJfRU5BQkxFfSwKKwkvKiBBQ1BJX0VWRU5UX0dMT0JBTCAgICAgICAgKi8ge0FDUElfQklUUkVHX0dMT0JBTF9MT0NLX1NUQVRVUywKKwkJCQkJQUNQSV9CSVRSRUdfR0xPQkFMX0xPQ0tfRU5BQkxFLAorCQkJCQlBQ1BJX0JJVE1BU0tfR0xPQkFMX0xPQ0tfU1RBVFVTLAorCQkJCQlBQ1BJX0JJVE1BU0tfR0xPQkFMX0xPQ0tfRU5BQkxFfSwKKwkvKiBBQ1BJX0VWRU5UX1BPV0VSX0JVVFRPTiAgKi8ge0FDUElfQklUUkVHX1BPV0VSX0JVVFRPTl9TVEFUVVMsCisJCQkJCUFDUElfQklUUkVHX1BPV0VSX0JVVFRPTl9FTkFCTEUsCisJCQkJCUFDUElfQklUTUFTS19QT1dFUl9CVVRUT05fU1RBVFVTLAorCQkJCQlBQ1BJX0JJVE1BU0tfUE9XRVJfQlVUVE9OX0VOQUJMRX0sCisJLyogQUNQSV9FVkVOVF9TTEVFUF9CVVRUT04gICovIHtBQ1BJX0JJVFJFR19TTEVFUF9CVVRUT05fU1RBVFVTLAorCQkJCQlBQ1BJX0JJVFJFR19TTEVFUF9CVVRUT05fRU5BQkxFLAorCQkJCQlBQ1BJX0JJVE1BU0tfU0xFRVBfQlVUVE9OX1NUQVRVUywKKwkJCQkJQUNQSV9CSVRNQVNLX1NMRUVQX0JVVFRPTl9FTkFCTEV9LAorCS8qIEFDUElfRVZFTlRfUlRDICAgICAgICAgICAqLyB7QUNQSV9CSVRSRUdfUlRfQ0xPQ0tfU1RBVFVTLAorCQkJCQlBQ1BJX0JJVFJFR19SVF9DTE9DS19FTkFCTEUsCisJCQkJCUFDUElfQklUTUFTS19SVF9DTE9DS19TVEFUVVMsCisJCQkJCUFDUElfQklUTUFTS19SVF9DTE9DS19FTkFCTEV9LAorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV91dF9nZXRfcmVnaW9uX25hbWUKKyAqCisgKiBQQVJBTUVURVJTOiAgTm9uZS4KKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IFRyYW5zbGF0ZSBhIFNwYWNlIElEIGludG8gYSBuYW1lIHN0cmluZyAoRGVidWcgb25seSkKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBSZWdpb24gdHlwZSBkZWNvZGluZyAqLworCitjb25zdCBjaGFyICphY3BpX2dibF9yZWdpb25fdHlwZXNbQUNQSV9OVU1fUFJFREVGSU5FRF9SRUdJT05TXSA9IHsKKwkiU3lzdGVtTWVtb3J5IiwKKwkiU3lzdGVtSU8iLAorCSJQQ0lfQ29uZmlnIiwKKwkiRW1iZWRkZWRDb250cm9sIiwKKwkiU01CdXMiLAorCSJTeXN0ZW1DTU9TIiwKKwkiUENJQkFSVGFyZ2V0IiwKKwkiRGF0YVRhYmxlIgorfTsKKworY2hhciAqYWNwaV91dF9nZXRfcmVnaW9uX25hbWUodTggc3BhY2VfaWQpCit7CisKKwlpZiAoc3BhY2VfaWQgPj0gQUNQSV9VU0VSX1JFR0lPTl9CRUdJTikgeworCQlyZXR1cm4gKCJVc2VyRGVmaW5lZFJlZ2lvbiIpOworCX0gZWxzZSBpZiAoc3BhY2VfaWQgPj0gQUNQSV9OVU1fUFJFREVGSU5FRF9SRUdJT05TKSB7CisJCXJldHVybiAoIkludmFsaWRTcGFjZUlkIik7CisJfQorCisJcmV0dXJuIChBQ1BJX0NBU1RfUFRSKGNoYXIsIGFjcGlfZ2JsX3JlZ2lvbl90eXBlc1tzcGFjZV9pZF0pKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV91dF9nZXRfZXZlbnRfbmFtZQorICoKKyAqIFBBUkFNRVRFUlM6ICBOb25lLgorICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogVHJhbnNsYXRlIGEgRXZlbnQgSUQgaW50byBhIG5hbWUgc3RyaW5nIChEZWJ1ZyBvbmx5KQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIEV2ZW50IHR5cGUgZGVjb2RpbmcgKi8KKworc3RhdGljIGNvbnN0IGNoYXIgKmFjcGlfZ2JsX2V2ZW50X3R5cGVzW0FDUElfTlVNX0ZJWEVEX0VWRU5UU10gPSB7CisJIlBNX1RpbWVyIiwKKwkiR2xvYmFsTG9jayIsCisJIlBvd2VyQnV0dG9uIiwKKwkiU2xlZXBCdXR0b24iLAorCSJSZWFsVGltZUNsb2NrIiwKK307CisKK2NoYXIgKmFjcGlfdXRfZ2V0X2V2ZW50X25hbWUodTMyIGV2ZW50X2lkKQoreworCisJaWYgKGV2ZW50X2lkID4gQUNQSV9FVkVOVF9NQVgpIHsKKwkJcmV0dXJuICgiSW52YWxpZEV2ZW50SUQiKTsKKwl9CisKKwlyZXR1cm4gKEFDUElfQ0FTVF9QVFIoY2hhciwgYWNwaV9nYmxfZXZlbnRfdHlwZXNbZXZlbnRfaWRdKSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfdXRfZ2V0X3R5cGVfbmFtZQorICoKKyAqIFBBUkFNRVRFUlM6ICBOb25lLgorICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogVHJhbnNsYXRlIGEgVHlwZSBJRCBpbnRvIGEgbmFtZSBzdHJpbmcgKERlYnVnIG9ubHkpCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIEVsZW1lbnRzIG9mIGFjcGlfZ2JsX25zX3R5cGVfbmFtZXMgYmVsb3cgbXVzdCBtYXRjaAorICogb25lLXRvLW9uZSB3aXRoIHZhbHVlcyBvZiBhY3BpX29iamVjdF90eXBlCisgKgorICogVGhlIHR5cGUgQUNQSV9UWVBFX0FOWSAoVW50eXBlZCkgaXMgdXNlZCBhcyBhICJkb24ndCBjYXJlIiB3aGVuIHNlYXJjaGluZzsKKyAqIHdoZW4gc3RvcmVkIGluIGEgdGFibGUgaXQgcmVhbGx5IG1lYW5zIHRoYXQgd2UgaGF2ZSB0aHVzIGZhciBzZWVuIG5vCisgKiBldmlkZW5jZSB0byBpbmRpY2F0ZSB3aGF0IHR5cGUgaXMgYWN0dWFsbHkgZ29pbmcgdG8gYmUgc3RvcmVkIGZvciB0aGlzIGVudHJ5LgorICovCitzdGF0aWMgY29uc3QgY2hhciBhY3BpX2dibF9iYWRfdHlwZVtdID0gIlVOREVGSU5FRCI7CisKKy8qIFByaW50YWJsZSBuYW1lcyBvZiB0aGUgQUNQSSBvYmplY3QgdHlwZXMgKi8KKworc3RhdGljIGNvbnN0IGNoYXIgKmFjcGlfZ2JsX25zX3R5cGVfbmFtZXNbXSA9IHsKKwkvKiAwMCAqLyAiVW50eXBlZCIsCisJLyogMDEgKi8gIkludGVnZXIiLAorCS8qIDAyICovICJTdHJpbmciLAorCS8qIDAzICovICJCdWZmZXIiLAorCS8qIDA0ICovICJQYWNrYWdlIiwKKwkvKiAwNSAqLyAiRmllbGRVbml0IiwKKwkvKiAwNiAqLyAiRGV2aWNlIiwKKwkvKiAwNyAqLyAiRXZlbnQiLAorCS8qIDA4ICovICJNZXRob2QiLAorCS8qIDA5ICovICJNdXRleCIsCisJLyogMTAgKi8gIlJlZ2lvbiIsCisJLyogMTEgKi8gIlBvd2VyIiwKKwkvKiAxMiAqLyAiUHJvY2Vzc29yIiwKKwkvKiAxMyAqLyAiVGhlcm1hbCIsCisJLyogMTQgKi8gIkJ1ZmZlckZpZWxkIiwKKwkvKiAxNSAqLyAiRGRiSGFuZGxlIiwKKwkvKiAxNiAqLyAiRGVidWdPYmplY3QiLAorCS8qIDE3ICovICJSZWdpb25GaWVsZCIsCisJLyogMTggKi8gIkJhbmtGaWVsZCIsCisJLyogMTkgKi8gIkluZGV4RmllbGQiLAorCS8qIDIwICovICJSZWZlcmVuY2UiLAorCS8qIDIxICovICJBbGlhcyIsCisJLyogMjIgKi8gIk1ldGhvZEFsaWFzIiwKKwkvKiAyMyAqLyAiTm90aWZ5IiwKKwkvKiAyNCAqLyAiQWRkckhhbmRsZXIiLAorCS8qIDI1ICovICJSZXNvdXJjZURlc2MiLAorCS8qIDI2ICovICJSZXNvdXJjZUZsZCIsCisJLyogMjcgKi8gIlNjb3BlIiwKKwkvKiAyOCAqLyAiRXh0cmEiLAorCS8qIDI5ICovICJEYXRhIiwKKwkvKiAzMCAqLyAiSW52YWxpZCIKK307CisKK2NoYXIgKmFjcGlfdXRfZ2V0X3R5cGVfbmFtZShhY3BpX29iamVjdF90eXBlIHR5cGUpCit7CisKKwlpZiAodHlwZSA+IEFDUElfVFlQRV9JTlZBTElEKSB7CisJCXJldHVybiAoQUNQSV9DQVNUX1BUUihjaGFyLCBhY3BpX2dibF9iYWRfdHlwZSkpOworCX0KKworCXJldHVybiAoQUNQSV9DQVNUX1BUUihjaGFyLCBhY3BpX2dibF9uc190eXBlX25hbWVzW3R5cGVdKSk7Cit9CisKK2NoYXIgKmFjcGlfdXRfZ2V0X29iamVjdF90eXBlX25hbWUodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2MpCit7CisKKwlpZiAoIW9ial9kZXNjKSB7CisJCXJldHVybiAoIltOVUxMIE9iamVjdCBEZXNjcmlwdG9yXSIpOworCX0KKworCXJldHVybiAoYWNwaV91dF9nZXRfdHlwZV9uYW1lKEFDUElfR0VUX09CSkVDVF9UWVBFKG9ial9kZXNjKSkpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X2dldF9ub2RlX25hbWUKKyAqCisgKiBQQVJBTUVURVJTOiAgT2JqZWN0ICAgICAgICAgICAgICAgLSBBIG5hbWVzcGFjZSBub2RlCisgKgorICogUkVUVVJOOiAgICAgIFBvaW50ZXIgdG8gYSBzdHJpbmcKKyAqCisgKiBERVNDUklQVElPTjogVmFsaWRhdGUgdGhlIG5vZGUgYW5kIHJldHVybiB0aGUgbm9kZSdzIEFDUEkgbmFtZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitjaGFyICphY3BpX3V0X2dldF9ub2RlX25hbWUodm9pZCAqb2JqZWN0KQoreworCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlID0gKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICopb2JqZWN0OworCisJLyogTXVzdCByZXR1cm4gYSBzdHJpbmcgb2YgZXhhY3RseSA0IGNoYXJhY3RlcnMgPT0gQUNQSV9OQU1FX1NJWkUgKi8KKworCWlmICghb2JqZWN0KSB7CisJCXJldHVybiAoIk5VTEwiKTsKKwl9CisKKwkvKiBDaGVjayBmb3IgUm9vdCBub2RlICovCisKKwlpZiAoKG9iamVjdCA9PSBBQ1BJX1JPT1RfT0JKRUNUKSB8fCAob2JqZWN0ID09IGFjcGlfZ2JsX3Jvb3Rfbm9kZSkpIHsKKwkJcmV0dXJuICgiXCJcXFwiICIpOworCX0KKworCS8qIERlc2NyaXB0b3IgbXVzdCBiZSBhIG5hbWVzcGFjZSBub2RlICovCisKKwlpZiAoQUNQSV9HRVRfREVTQ1JJUFRPUl9UWVBFKG5vZGUpICE9IEFDUElfREVTQ19UWVBFX05BTUVEKSB7CisJCXJldHVybiAoIiMjIyMiKTsKKwl9CisKKwkvKiBOYW1lIG11c3QgYmUgYSB2YWxpZCBBQ1BJIG5hbWUgKi8KKworCWlmICghYWNwaV91dF92YWxpZF9hY3BpX25hbWUobm9kZS0+bmFtZS5pbnRlZ2VyKSkgeworCQlub2RlLT5uYW1lLmludGVnZXIgPSBhY3BpX3V0X3JlcGFpcl9uYW1lKG5vZGUtPm5hbWUuYXNjaWkpOworCX0KKworCS8qIFJldHVybiB0aGUgbmFtZSAqLworCisJcmV0dXJuIChub2RlLT5uYW1lLmFzY2lpKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV91dF9nZXRfZGVzY3JpcHRvcl9uYW1lCisgKgorICogUEFSQU1FVEVSUzogIE9iamVjdCAgICAgICAgICAgICAgIC0gQW4gQUNQSSBvYmplY3QKKyAqCisgKiBSRVRVUk46ICAgICAgUG9pbnRlciB0byBhIHN0cmluZworICoKKyAqIERFU0NSSVBUSU9OOiBWYWxpZGF0ZSBvYmplY3QgYW5kIHJldHVybiB0aGUgZGVzY3JpcHRvciB0eXBlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogUHJpbnRhYmxlIG5hbWVzIG9mIG9iamVjdCBkZXNjcmlwdG9yIHR5cGVzICovCisKK3N0YXRpYyBjb25zdCBjaGFyICphY3BpX2dibF9kZXNjX3R5cGVfbmFtZXNbXSA9IHsKKwkvKiAwMCAqLyAiSW52YWxpZCIsCisJLyogMDEgKi8gIkNhY2hlZCIsCisJLyogMDIgKi8gIlN0YXRlLUdlbmVyaWMiLAorCS8qIDAzICovICJTdGF0ZS1VcGRhdGUiLAorCS8qIDA0ICovICJTdGF0ZS1QYWNrYWdlIiwKKwkvKiAwNSAqLyAiU3RhdGUtQ29udHJvbCIsCisJLyogMDYgKi8gIlN0YXRlLVJvb3RQYXJzZVNjb3BlIiwKKwkvKiAwNyAqLyAiU3RhdGUtUGFyc2VTY29wZSIsCisJLyogMDggKi8gIlN0YXRlLVdhbGtTY29wZSIsCisJLyogMDkgKi8gIlN0YXRlLVJlc3VsdCIsCisJLyogMTAgKi8gIlN0YXRlLU5vdGlmeSIsCisJLyogMTEgKi8gIlN0YXRlLVRocmVhZCIsCisJLyogMTIgKi8gIldhbGsiLAorCS8qIDEzICovICJQYXJzZXIiLAorCS8qIDE0ICovICJPcGVyYW5kIiwKKwkvKiAxNSAqLyAiTm9kZSIKK307CisKK2NoYXIgKmFjcGlfdXRfZ2V0X2Rlc2NyaXB0b3JfbmFtZSh2b2lkICpvYmplY3QpCit7CisKKwlpZiAoIW9iamVjdCkgeworCQlyZXR1cm4gKCJOVUxMIE9CSkVDVCIpOworCX0KKworCWlmIChBQ1BJX0dFVF9ERVNDUklQVE9SX1RZUEUob2JqZWN0KSA+IEFDUElfREVTQ19UWVBFX01BWCkgeworCQlyZXR1cm4gKEFDUElfQ0FTVF9QVFIoY2hhciwgYWNwaV9nYmxfYmFkX3R5cGUpKTsKKwl9CisKKwlyZXR1cm4gKEFDUElfQ0FTVF9QVFIoY2hhciwKKwkJCSAgICAgIGFjcGlfZ2JsX2Rlc2NfdHlwZV9uYW1lc1tBQ1BJX0dFVF9ERVNDUklQVE9SX1RZUEUKKwkJCQkJCSAgICAgICAob2JqZWN0KV0pKTsKKworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X2dldF9yZWZlcmVuY2VfbmFtZQorICoKKyAqIFBBUkFNRVRFUlM6ICBPYmplY3QgICAgICAgICAgICAgICAtIEFuIEFDUEkgcmVmZXJlbmNlIG9iamVjdAorICoKKyAqIFJFVFVSTjogICAgICBQb2ludGVyIHRvIGEgc3RyaW5nCisgKgorICogREVTQ1JJUFRJT046IERlY29kZSBhIHJlZmVyZW5jZSBvYmplY3Qgc3ViLXR5cGUgdG8gYSBzdHJpbmcuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogUHJpbnRhYmxlIG5hbWVzIG9mIHJlZmVyZW5jZSBvYmplY3Qgc3ViLXR5cGVzICovCisKK3N0YXRpYyBjb25zdCBjaGFyICphY3BpX2dibF9yZWZfY2xhc3NfbmFtZXNbXSA9IHsKKwkvKiAwMCAqLyAiTG9jYWwiLAorCS8qIDAxICovICJBcmd1bWVudCIsCisJLyogMDIgKi8gIlJlZk9mIiwKKwkvKiAwMyAqLyAiSW5kZXgiLAorCS8qIDA0ICovICJEZGJIYW5kbGUiLAorCS8qIDA1ICovICJOYW1lZCBPYmplY3QiLAorCS8qIDA2ICovICJEZWJ1ZyIKK307CisKK2NvbnN0IGNoYXIgKmFjcGlfdXRfZ2V0X3JlZmVyZW5jZV9uYW1lKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9iamVjdCkKK3sKKwlpZiAoIW9iamVjdCkKKwkJcmV0dXJuICJOVUxMIE9iamVjdCI7CisKKwlpZiAoQUNQSV9HRVRfREVTQ1JJUFRPUl9UWVBFKG9iamVjdCkgIT0gQUNQSV9ERVNDX1RZUEVfT1BFUkFORCkKKwkJcmV0dXJuICJOb3QgYW4gT3BlcmFuZCBvYmplY3QiOworCisJaWYgKG9iamVjdC0+Y29tbW9uLnR5cGUgIT0gQUNQSV9UWVBFX0xPQ0FMX1JFRkVSRU5DRSkKKwkJcmV0dXJuICJOb3QgYSBSZWZlcmVuY2Ugb2JqZWN0IjsKKworCWlmIChvYmplY3QtPnJlZmVyZW5jZS5jbGFzcyA+IEFDUElfUkVGQ0xBU1NfTUFYKQorCQlyZXR1cm4gIlVua25vd24gUmVmZXJlbmNlIGNsYXNzIjsKKworCXJldHVybiBhY3BpX2dibF9yZWZfY2xhc3NfbmFtZXNbb2JqZWN0LT5yZWZlcmVuY2UuY2xhc3NdOworfQorCisjaWYgZGVmaW5lZChBQ1BJX0RFQlVHX09VVFBVVCkgfHwgZGVmaW5lZChBQ1BJX0RFQlVHR0VSKQorLyoKKyAqIFN0cmluZ3MgYW5kIHByb2NlZHVyZXMgdXNlZCBmb3IgZGVidWcgb25seQorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfdXRfZ2V0X211dGV4X25hbWUKKyAqCisgKiBQQVJBTUVURVJTOiAgbXV0ZXhfaWQgICAgICAgIC0gVGhlIHByZWRlZmluZWQgSUQgZm9yIHRoaXMgbXV0ZXguCisgKgorICogUkVUVVJOOiAgICAgIFN0cmluZyBjb250YWluaW5nIHRoZSBuYW1lIG9mIHRoZSBtdXRleC4gQWx3YXlzIHJldHVybnMgYSB2YWxpZAorICogICAgICAgICAgICAgIHBvaW50ZXIuCisgKgorICogREVTQ1JJUFRJT046IFRyYW5zbGF0ZSBhIG11dGV4IElEIGludG8gYSBuYW1lIHN0cmluZyAoRGVidWcgb25seSkKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitjaGFyICphY3BpX3V0X2dldF9tdXRleF9uYW1lKHUzMiBtdXRleF9pZCkKK3sKKworCWlmIChtdXRleF9pZCA+IEFDUElfTUFYX01VVEVYKSB7CisJCXJldHVybiAoIkludmFsaWQgTXV0ZXggSUQiKTsKKwl9CisKKwlyZXR1cm4gKGFjcGlfZ2JsX211dGV4X25hbWVzW211dGV4X2lkXSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfdXRfZ2V0X25vdGlmeV9uYW1lCisgKgorICogUEFSQU1FVEVSUzogIG5vdGlmeV92YWx1ZSAgICAtIFZhbHVlIGZyb20gdGhlIE5vdGlmeSgpIHJlcXVlc3QKKyAqCisgKiBSRVRVUk46ICAgICAgU3RyaW5nIGNvcnJlc3BvbmRpbmcgdG8gdGhlIE5vdGlmeSBWYWx1ZS4KKyAqCisgKiBERVNDUklQVElPTjogVHJhbnNsYXRlIGEgTm90aWZ5IFZhbHVlIHRvIGEgbm90aWZ5IG5hbWVzdHJpbmcuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogTmFtZXMgZm9yIE5vdGlmeSgpIHZhbHVlcywgdXNlZCBmb3IgZGVidWcgb3V0cHV0ICovCisKK3N0YXRpYyBjb25zdCBjaGFyICphY3BpX2dibF9ub3RpZnlfdmFsdWVfbmFtZXNbXSA9IHsKKwkiQnVzIENoZWNrIiwKKwkiRGV2aWNlIENoZWNrIiwKKwkiRGV2aWNlIFdha2UiLAorCSJFamVjdCBSZXF1ZXN0IiwKKwkiRGV2aWNlIENoZWNrIExpZ2h0IiwKKwkiRnJlcXVlbmN5IE1pc21hdGNoIiwKKwkiQnVzIE1vZGUgTWlzbWF0Y2giLAorCSJQb3dlciBGYXVsdCIsCisJIkNhcGFiaWxpdGllcyBDaGVjayIsCisJIkRldmljZSBQTEQgQ2hlY2siLAorCSJSZXNlcnZlZCIsCisJIlN5c3RlbSBMb2NhbGl0eSBVcGRhdGUiCit9OworCitjb25zdCBjaGFyICphY3BpX3V0X2dldF9ub3RpZnlfbmFtZSh1MzIgbm90aWZ5X3ZhbHVlKQoreworCisJaWYgKG5vdGlmeV92YWx1ZSA8PSBBQ1BJX05PVElGWV9NQVgpIHsKKwkJcmV0dXJuIChhY3BpX2dibF9ub3RpZnlfdmFsdWVfbmFtZXNbbm90aWZ5X3ZhbHVlXSk7CisJfSBlbHNlIGlmIChub3RpZnlfdmFsdWUgPD0gQUNQSV9NQVhfU1lTX05PVElGWSkgeworCQlyZXR1cm4gKCJSZXNlcnZlZCIpOworCX0gZWxzZSB7CQkvKiBHcmVhdGVyIG9yIGVxdWFsIHRvIDB4ODAgKi8KKworCQlyZXR1cm4gKCIqKkRldmljZSBTcGVjaWZpYyoqIik7CisJfQorfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfdXRfdmFsaWRfb2JqZWN0X3R5cGUKKyAqCisgKiBQQVJBTUVURVJTOiAgVHlwZSAgICAgICAgICAgIC0gT2JqZWN0IHR5cGUgdG8gYmUgdmFsaWRhdGVkCisgKgorICogUkVUVVJOOiAgICAgIFRSVUUgaWYgdmFsaWQgb2JqZWN0IHR5cGUsIEZBTFNFIG90aGVyd2lzZQorICoKKyAqIERFU0NSSVBUSU9OOiBWYWxpZGF0ZSBhbiBvYmplY3QgdHlwZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3U4IGFjcGlfdXRfdmFsaWRfb2JqZWN0X3R5cGUoYWNwaV9vYmplY3RfdHlwZSB0eXBlKQoreworCisJaWYgKHR5cGUgPiBBQ1BJX1RZUEVfTE9DQUxfTUFYKSB7CisKKwkJLyogTm90ZTogQXNzdW1lcyBhbGwgVFlQRXMgYXJlIGNvbnRpZ3VvdXMgKGV4dGVybmFsL2xvY2FsKSAqLworCisJCXJldHVybiAoRkFMU0UpOworCX0KKworCXJldHVybiAoVFJVRSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfdXRfaW5pdF9nbG9iYWxzCisgKgorICogUEFSQU1FVEVSUzogIE5vbmUKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IEluaXQgbGlicmFyeSBnbG9iYWxzLiAgQWxsIGdsb2JhbHMgdGhhdCByZXF1aXJlIHNwZWNpZmljCisgKiAgICAgICAgICAgICAgaW5pdGlhbGl6YXRpb24gc2hvdWxkIGJlIGluaXRpYWxpemVkIGhlcmUhCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworYWNwaV9zdGF0dXMgYWNwaV91dF9pbml0X2dsb2JhbHModm9pZCkKK3sKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJdTMyIGk7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKHV0X2luaXRfZ2xvYmFscyk7CisKKwkvKiBDcmVhdGUgYWxsIG1lbW9yeSBjYWNoZXMgKi8KKworCXN0YXR1cyA9IGFjcGlfdXRfY3JlYXRlX2NhY2hlcygpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKKwl9CisKKwkvKiBNdXRleCBsb2NrZWQgZmxhZ3MgKi8KKworCWZvciAoaSA9IDA7IGkgPCBBQ1BJX05VTV9NVVRFWDsgaSsrKSB7CisJCWFjcGlfZ2JsX211dGV4X2luZm9baV0ubXV0ZXggPSBOVUxMOworCQlhY3BpX2dibF9tdXRleF9pbmZvW2ldLnRocmVhZF9pZCA9IEFDUElfTVVURVhfTk9UX0FDUVVJUkVEOworCQlhY3BpX2dibF9tdXRleF9pbmZvW2ldLnVzZV9jb3VudCA9IDA7CisJfQorCisJZm9yIChpID0gMDsgaSA8IEFDUElfTlVNX09XTkVSSURfTUFTS1M7IGkrKykgeworCQlhY3BpX2dibF9vd25lcl9pZF9tYXNrW2ldID0gMDsKKwl9CisJYWNwaV9nYmxfb3duZXJfaWRfbWFza1tBQ1BJX05VTV9PV05FUklEX01BU0tTIC0gMV0gPSAweDgwMDAwMDAwOwkvKiBMYXN0IElEIGlzIG5ldmVyIHZhbGlkICovCisKKwkvKiBHUEUgc3VwcG9ydCAqLworCisJYWNwaV9nYmxfZ3BlX3hydXB0X2xpc3RfaGVhZCA9IE5VTEw7CisJYWNwaV9nYmxfZ3BlX2ZhZHRfYmxvY2tzWzBdID0gTlVMTDsKKwlhY3BpX2dibF9ncGVfZmFkdF9ibG9ja3NbMV0gPSBOVUxMOworCWFjcGlfY3VycmVudF9ncGVfY291bnQgPSAwOworCisJLyogR2xvYmFsIGhhbmRsZXJzICovCisKKwlhY3BpX2dibF9zeXN0ZW1fbm90aWZ5LmhhbmRsZXIgPSBOVUxMOworCWFjcGlfZ2JsX2RldmljZV9ub3RpZnkuaGFuZGxlciA9IE5VTEw7CisJYWNwaV9nYmxfZXhjZXB0aW9uX2hhbmRsZXIgPSBOVUxMOworCWFjcGlfZ2JsX2luaXRfaGFuZGxlciA9IE5VTEw7CisJYWNwaV9nYmxfdGFibGVfaGFuZGxlciA9IE5VTEw7CisKKwkvKiBHbG9iYWwgTG9jayBzdXBwb3J0ICovCisKKwlhY3BpX2dibF9nbG9iYWxfbG9ja19zZW1hcGhvcmUgPSBOVUxMOworCWFjcGlfZ2JsX2dsb2JhbF9sb2NrX211dGV4ID0gTlVMTDsKKwlhY3BpX2dibF9nbG9iYWxfbG9ja19hY3F1aXJlZCA9IEZBTFNFOworCWFjcGlfZ2JsX2dsb2JhbF9sb2NrX2hhbmRsZSA9IDA7CisJYWNwaV9nYmxfZ2xvYmFsX2xvY2tfcHJlc2VudCA9IEZBTFNFOworCisJLyogTWlzY2VsbGFuZW91cyB2YXJpYWJsZXMgKi8KKworCWFjcGlfZ2JsX2NtX3NpbmdsZV9zdGVwID0gRkFMU0U7CisJYWNwaV9nYmxfZGJfdGVybWluYXRlX3RocmVhZHMgPSBGQUxTRTsKKwlhY3BpX2dibF9zaHV0ZG93biA9IEZBTFNFOworCWFjcGlfZ2JsX25zX2xvb2t1cF9jb3VudCA9IDA7CisJYWNwaV9nYmxfcHNfZmluZF9jb3VudCA9IDA7CisJYWNwaV9nYmxfYWNwaV9oYXJkd2FyZV9wcmVzZW50ID0gVFJVRTsKKwlhY3BpX2dibF9sYXN0X293bmVyX2lkX2luZGV4ID0gMDsKKwlhY3BpX2dibF9uZXh0X293bmVyX2lkX29mZnNldCA9IDA7CisJYWNwaV9nYmxfdHJhY2VfbWV0aG9kX25hbWUgPSAwOworCWFjcGlfZ2JsX3RyYWNlX2RiZ19sZXZlbCA9IDA7CisJYWNwaV9nYmxfdHJhY2VfZGJnX2xheWVyID0gMDsKKwlhY3BpX2dibF9kZWJ1Z2dlcl9jb25maWd1cmF0aW9uID0gREVCVUdHRVJfVEhSRUFESU5HOworCWFjcGlfZ2JsX2RiX291dHB1dF9mbGFncyA9IEFDUElfREJfQ09OU09MRV9PVVRQVVQ7CisKKwkvKiBIYXJkd2FyZSBvcmllbnRlZCAqLworCisJYWNwaV9nYmxfZXZlbnRzX2luaXRpYWxpemVkID0gRkFMU0U7CisJYWNwaV9nYmxfc3lzdGVtX2F3YWtlX2FuZF9ydW5uaW5nID0gVFJVRTsKKworCS8qIE5hbWVzcGFjZSAqLworCisJYWNwaV9nYmxfcm9vdF9ub2RlID0gTlVMTDsKKwlhY3BpX2dibF9yb290X25vZGVfc3RydWN0Lm5hbWUuaW50ZWdlciA9IEFDUElfUk9PVF9OQU1FOworCWFjcGlfZ2JsX3Jvb3Rfbm9kZV9zdHJ1Y3QuZGVzY3JpcHRvcl90eXBlID0gQUNQSV9ERVNDX1RZUEVfTkFNRUQ7CisJYWNwaV9nYmxfcm9vdF9ub2RlX3N0cnVjdC50eXBlID0gQUNQSV9UWVBFX0RFVklDRTsKKwlhY3BpX2dibF9yb290X25vZGVfc3RydWN0LmNoaWxkID0gTlVMTDsKKwlhY3BpX2dibF9yb290X25vZGVfc3RydWN0LnBlZXIgPSBOVUxMOworCWFjcGlfZ2JsX3Jvb3Rfbm9kZV9zdHJ1Y3Qub2JqZWN0ID0gTlVMTDsKKwlhY3BpX2dibF9yb290X25vZGVfc3RydWN0LmZsYWdzID0gQU5PQkpfRU5EX09GX1BFRVJfTElTVDsKKworI2lmZGVmIEFDUElfREVCVUdfT1VUUFVUCisJYWNwaV9nYmxfbG93ZXN0X3N0YWNrX3BvaW50ZXIgPSBBQ1BJX0NBU1RfUFRSKGFjcGlfc2l6ZSwgQUNQSV9TSVpFX01BWCk7CisjZW5kaWYKKworI2lmZGVmIEFDUElfREJHX1RSQUNLX0FMTE9DQVRJT05TCisJYWNwaV9nYmxfZGlzcGxheV9maW5hbF9tZW1fc3RhdHMgPSBGQUxTRTsKKyNlbmRpZgorCisJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKK30KKworQUNQSV9FWFBPUlRfU1lNQk9MKGFjcGlfZ2JsX0ZBRFQpCitBQ1BJX0VYUE9SVF9TWU1CT0woYWNwaV9kYmdfbGV2ZWwpCitBQ1BJX0VYUE9SVF9TWU1CT0woYWNwaV9kYmdfbGF5ZXIpCitBQ1BJX0VYUE9SVF9TWU1CT0woYWNwaV9jdXJyZW50X2dwZV9jb3VudCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvdXRpbml0LmMgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL3V0aW5pdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1NGNhODQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL3V0aW5pdC5jCkBAIC0wLDAgKzEsMTUyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogTW9kdWxlIE5hbWU6IHV0aW5pdCAtIENvbW1vbiBBQ1BJIHN1YnN5c3RlbSBpbml0aWFsaXphdGlvbgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDgsIEludGVsIENvcnAuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCisgKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSBhdCBtaW5pbXVtIGEgZGlzY2xhaW1lcgorICogICAgc3Vic3RhbnRpYWxseSBzaW1pbGFyIHRvIHRoZSAiTk8gV0FSUkFOVFkiIGRpc2NsYWltZXIgYmVsb3cKKyAqICAgICgiRGlzY2xhaW1lciIpIGFuZCBhbnkgcmVkaXN0cmlidXRpb24gbXVzdCBiZSBjb25kaXRpb25lZCB1cG9uCisgKiAgICBpbmNsdWRpbmcgYSBzdWJzdGFudGlhbGx5IHNpbWlsYXIgRGlzY2xhaW1lciByZXF1aXJlbWVudCBmb3IgZnVydGhlcgorICogICAgYmluYXJ5IHJlZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzCisgKiAgICBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIE5PIFdBUlJBTlRZCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORworICogSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCisgKi8KKworI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgorI2luY2x1ZGUgImFjY29tbW9uLmgiCisjaW5jbHVkZSAiYWNuYW1lc3AuaCIKKyNpbmNsdWRlICJhY2V2ZW50cy5oIgorI2luY2x1ZGUgImFjdGFibGVzLmgiCisKKyNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX1VUSUxJVElFUworQUNQSV9NT0RVTEVfTkFNRSgidXRpbml0IikKKworLyogTG9jYWwgcHJvdG90eXBlcyAqLworc3RhdGljIHZvaWQgYWNwaV91dF90ZXJtaW5hdGUodm9pZCk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV91dF90ZXJtaW5hdGUKKyAqCisgKiBQQVJBTUVURVJTOiAgbm9uZQorICoKKyAqIFJFVFVSTjogICAgICBub25lCisgKgorICogREVTQ1JJUFRJT046IEZyZWUgZ2xvYmFsIG1lbW9yeQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkIGFjcGlfdXRfdGVybWluYXRlKHZvaWQpCit7CisJc3RydWN0IGFjcGlfZ3BlX2Jsb2NrX2luZm8gKmdwZV9ibG9jazsKKwlzdHJ1Y3QgYWNwaV9ncGVfYmxvY2tfaW5mbyAqbmV4dF9ncGVfYmxvY2s7CisJc3RydWN0IGFjcGlfZ3BlX3hydXB0X2luZm8gKmdwZV94cnVwdF9pbmZvOworCXN0cnVjdCBhY3BpX2dwZV94cnVwdF9pbmZvICpuZXh0X2dwZV94cnVwdF9pbmZvOworCisJQUNQSV9GVU5DVElPTl9UUkFDRSh1dF90ZXJtaW5hdGUpOworCisJLyogRnJlZSBnbG9iYWwgR1BFIGJsb2NrcyBhbmQgcmVsYXRlZCBpbmZvIHN0cnVjdHVyZXMgKi8KKworCWdwZV94cnVwdF9pbmZvID0gYWNwaV9nYmxfZ3BlX3hydXB0X2xpc3RfaGVhZDsKKwl3aGlsZSAoZ3BlX3hydXB0X2luZm8pIHsKKwkJZ3BlX2Jsb2NrID0gZ3BlX3hydXB0X2luZm8tPmdwZV9ibG9ja19saXN0X2hlYWQ7CisJCXdoaWxlIChncGVfYmxvY2spIHsKKwkJCW5leHRfZ3BlX2Jsb2NrID0gZ3BlX2Jsb2NrLT5uZXh0OworCQkJQUNQSV9GUkVFKGdwZV9ibG9jay0+ZXZlbnRfaW5mbyk7CisJCQlBQ1BJX0ZSRUUoZ3BlX2Jsb2NrLT5yZWdpc3Rlcl9pbmZvKTsKKwkJCUFDUElfRlJFRShncGVfYmxvY2spOworCisJCQlncGVfYmxvY2sgPSBuZXh0X2dwZV9ibG9jazsKKwkJfQorCQluZXh0X2dwZV94cnVwdF9pbmZvID0gZ3BlX3hydXB0X2luZm8tPm5leHQ7CisJCUFDUElfRlJFRShncGVfeHJ1cHRfaW5mbyk7CisJCWdwZV94cnVwdF9pbmZvID0gbmV4dF9ncGVfeHJ1cHRfaW5mbzsKKwl9CisKKwlyZXR1cm5fVk9JRDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV91dF9zdWJzeXN0ZW1fc2h1dGRvd24KKyAqCisgKiBQQVJBTUVURVJTOiAgbm9uZQorICoKKyAqIFJFVFVSTjogICAgICBub25lCisgKgorICogREVTQ1JJUFRJT046IFNodXRkb3duIHRoZSB2YXJpb3VzIHN1YnN5c3RlbXMuICBEb24ndCBkZWxldGUgdGhlIG11dGV4CisgKiAgICAgICAgICAgICAgb2JqZWN0cyBoZXJlIC0tIGJlY2F1c2UgdGhlIEFNTCBkZWJ1Z2dlciBtYXkgYmUgc3RpbGwgcnVubmluZy4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIGFjcGlfdXRfc3Vic3lzdGVtX3NodXRkb3duKHZvaWQpCit7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKHV0X3N1YnN5c3RlbV9zaHV0ZG93bik7CisKKwkvKiBKdXN0IGV4aXQgaWYgc3Vic3lzdGVtIGlzIGFscmVhZHkgc2h1dGRvd24gKi8KKworCWlmIChhY3BpX2dibF9zaHV0ZG93bikgeworCQlBQ1BJX0VSUk9SKChBRV9JTkZPLCAiQUNQSSBTdWJzeXN0ZW0gaXMgYWxyZWFkeSB0ZXJtaW5hdGVkIikpOworCQlyZXR1cm5fVk9JRDsKKwl9CisKKwkvKiBTdWJzeXN0ZW0gYXBwZWFycyBhY3RpdmUsIGdvIGFoZWFkIGFuZCBzaHV0IGl0IGRvd24gKi8KKworCWFjcGlfZ2JsX3NodXRkb3duID0gVFJVRTsKKwlhY3BpX2dibF9zdGFydHVwX2ZsYWdzID0gMDsKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sICJTaHV0dGluZyBkb3duIEFDUEkgU3Vic3lzdGVtXG4iKSk7CisKKyNpZm5kZWYgQUNQSV9BU0xfQ09NUElMRVIKKworCS8qIENsb3NlIHRoZSBhY3BpX2V2ZW50IEhhbmRsaW5nICovCisKKwlhY3BpX2V2X3Rlcm1pbmF0ZSgpOworI2VuZGlmCisKKwkvKiBDbG9zZSB0aGUgTmFtZXNwYWNlICovCisKKwlhY3BpX25zX3Rlcm1pbmF0ZSgpOworCisJLyogRGVsZXRlIHRoZSBBQ1BJIHRhYmxlcyAqLworCisJYWNwaV90Yl90ZXJtaW5hdGUoKTsKKworCS8qIENsb3NlIHRoZSBnbG9iYWxzICovCisKKwlhY3BpX3V0X3Rlcm1pbmF0ZSgpOworCisJLyogUHVyZ2UgdGhlIGxvY2FsIGNhY2hlcyAqLworCisJKHZvaWQpYWNwaV91dF9kZWxldGVfY2FjaGVzKCk7CisJcmV0dXJuX1ZPSUQ7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL3V0bWF0aC5jIGIvZHJpdmVycy9hY3BpL2FjcGljYS91dG1hdGguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOWY2ODJkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS91dG1hdGguYwpAQCAtMCwwICsxLDMxMiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBNb2R1bGUgTmFtZTogdXRtYXRoIC0gSW50ZWdlciBtYXRoIHN1cHBvcnQgcm91dGluZXMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwOCwgSW50ZWwgQ29ycC4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKKyAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIGF0IG1pbmltdW0gYSBkaXNjbGFpbWVyCisgKiAgICBzdWJzdGFudGlhbGx5IHNpbWlsYXIgdG8gdGhlICJOTyBXQVJSQU5UWSIgZGlzY2xhaW1lciBiZWxvdworICogICAgKCJEaXNjbGFpbWVyIikgYW5kIGFueSByZWRpc3RyaWJ1dGlvbiBtdXN0IGJlIGNvbmRpdGlvbmVkIHVwb24KKyAqICAgIGluY2x1ZGluZyBhIHN1YnN0YW50aWFsbHkgc2ltaWxhciBEaXNjbGFpbWVyIHJlcXVpcmVtZW50IGZvciBmdXJ0aGVyCisgKiAgICBiaW5hcnkgcmVkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMKKyAqICAgIG9mIGFueSBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogTk8gV0FSUkFOVFkKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HCisgKiBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KKyAqLworCisjaW5jbHVkZSA8YWNwaS9hY3BpLmg+CisjaW5jbHVkZSAiYWNjb21tb24uaCIKKworI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfVVRJTElUSUVTCitBQ1BJX01PRFVMRV9OQU1FKCJ1dG1hdGgiKQorCisvKgorICogU3VwcG9ydCBmb3IgZG91YmxlLXByZWNpc2lvbiBpbnRlZ2VyIGRpdmlkZS4gIFRoaXMgY29kZSBpcyBpbmNsdWRlZCBoZXJlCisgKiBpbiBvcmRlciB0byBzdXBwb3J0IGtlcm5lbCBlbnZpcm9ubWVudHMgd2hlcmUgdGhlIGRvdWJsZS1wcmVjaXNpb24gbWF0aAorICogbGlicmFyeSBpcyBub3QgYXZhaWxhYmxlLgorICovCisjaWZuZGVmIEFDUElfVVNFX05BVElWRV9ESVZJREUKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfdXRfc2hvcnRfZGl2aWRlCisgKgorICogUEFSQU1FVEVSUzogIERpdmlkZW5kICAgICAgICAgICAgLSA2NC1iaXQgZGl2aWRlbmQKKyAqICAgICAgICAgICAgICBEaXZpc29yICAgICAgICAgICAgIC0gMzItYml0IGRpdmlzb3IKKyAqICAgICAgICAgICAgICBvdXRfcXVvdGllbnQgICAgICAgIC0gUG9pbnRlciB0byB3aGVyZSB0aGUgcXVvdGllbnQgaXMgcmV0dXJuZWQKKyAqICAgICAgICAgICAgICBvdXRfcmVtYWluZGVyICAgICAgIC0gUG9pbnRlciB0byB3aGVyZSB0aGUgcmVtYWluZGVyIGlzIHJldHVybmVkCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cyAoQ2hlY2tzIGZvciBkaXZpZGUtYnktemVybykKKyAqCisgKiBERVNDUklQVElPTjogUGVyZm9ybSBhIHNob3J0IChtYXhpbXVtIDY0IGJpdHMgZGl2aWRlZCBieSAzMiBiaXRzKQorICogICAgICAgICAgICAgIGRpdmlkZSBhbmQgbW9kdWxvLiAgVGhlIHJlc3VsdCBpcyBhIDY0LWJpdCBxdW90aWVudCBhbmQgYQorICogICAgICAgICAgICAgIDMyLWJpdCByZW1haW5kZXIuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2FjcGlfc3RhdHVzCithY3BpX3V0X3Nob3J0X2RpdmlkZShhY3BpX2ludGVnZXIgZGl2aWRlbmQsCisJCSAgICAgdTMyIGRpdmlzb3IsCisJCSAgICAgYWNwaV9pbnRlZ2VyICogb3V0X3F1b3RpZW50LCB1MzIgKiBvdXRfcmVtYWluZGVyKQoreworCXVuaW9uIHVpbnQ2NF9vdmVybGF5IGRpdmlkZW5kX292bDsKKwl1bmlvbiB1aW50NjRfb3ZlcmxheSBxdW90aWVudDsKKwl1MzIgcmVtYWluZGVyMzI7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKHV0X3Nob3J0X2RpdmlkZSk7CisKKwkvKiBBbHdheXMgY2hlY2sgZm9yIGEgemVybyBkaXZpc29yICovCisKKwlpZiAoZGl2aXNvciA9PSAwKSB7CisJCUFDUElfRVJST1IoKEFFX0lORk8sICJEaXZpZGUgYnkgemVybyIpKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9ESVZJREVfQllfWkVSTyk7CisJfQorCisJZGl2aWRlbmRfb3ZsLmZ1bGwgPSBkaXZpZGVuZDsKKworCS8qCisJICogVGhlIHF1b3RpZW50IGlzIDY0IGJpdHMsIHRoZSByZW1haW5kZXIgaXMgYWx3YXlzIDMyIGJpdHMsCisJICogYW5kIGlzIGdlbmVyYXRlZCBieSB0aGUgc2Vjb25kIGRpdmlkZS4KKwkgKi8KKwlBQ1BJX0RJVl82NF9CWV8zMigwLCBkaXZpZGVuZF9vdmwucGFydC5oaSwgZGl2aXNvciwKKwkJCSAgcXVvdGllbnQucGFydC5oaSwgcmVtYWluZGVyMzIpOworCUFDUElfRElWXzY0X0JZXzMyKHJlbWFpbmRlcjMyLCBkaXZpZGVuZF9vdmwucGFydC5sbywgZGl2aXNvciwKKwkJCSAgcXVvdGllbnQucGFydC5sbywgcmVtYWluZGVyMzIpOworCisJLyogUmV0dXJuIG9ubHkgd2hhdCB3YXMgcmVxdWVzdGVkICovCisKKwlpZiAob3V0X3F1b3RpZW50KSB7CisJCSpvdXRfcXVvdGllbnQgPSBxdW90aWVudC5mdWxsOworCX0KKwlpZiAob3V0X3JlbWFpbmRlcikgeworCQkqb3V0X3JlbWFpbmRlciA9IHJlbWFpbmRlcjMyOworCX0KKworCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfdXRfZGl2aWRlCisgKgorICogUEFSQU1FVEVSUzogIGluX2RpdmlkZW5kICAgICAgICAgLSBEaXZpZGVuZAorICogICAgICAgICAgICAgIGluX2Rpdmlzb3IgICAgICAgICAgLSBEaXZpc29yCisgKiAgICAgICAgICAgICAgb3V0X3F1b3RpZW50ICAgICAgICAtIFBvaW50ZXIgdG8gd2hlcmUgdGhlIHF1b3RpZW50IGlzIHJldHVybmVkCisgKiAgICAgICAgICAgICAgb3V0X3JlbWFpbmRlciAgICAgICAtIFBvaW50ZXIgdG8gd2hlcmUgdGhlIHJlbWFpbmRlciBpcyByZXR1cm5lZAorICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMgKENoZWNrcyBmb3IgZGl2aWRlLWJ5LXplcm8pCisgKgorICogREVTQ1JJUFRJT046IFBlcmZvcm0gYSBkaXZpZGUgYW5kIG1vZHVsby4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCithY3BpX3N0YXR1cworYWNwaV91dF9kaXZpZGUoYWNwaV9pbnRlZ2VyIGluX2RpdmlkZW5kLAorCSAgICAgICBhY3BpX2ludGVnZXIgaW5fZGl2aXNvciwKKwkgICAgICAgYWNwaV9pbnRlZ2VyICogb3V0X3F1b3RpZW50LCBhY3BpX2ludGVnZXIgKiBvdXRfcmVtYWluZGVyKQoreworCXVuaW9uIHVpbnQ2NF9vdmVybGF5IGRpdmlkZW5kOworCXVuaW9uIHVpbnQ2NF9vdmVybGF5IGRpdmlzb3I7CisJdW5pb24gdWludDY0X292ZXJsYXkgcXVvdGllbnQ7CisJdW5pb24gdWludDY0X292ZXJsYXkgcmVtYWluZGVyOworCXVuaW9uIHVpbnQ2NF9vdmVybGF5IG5vcm1hbGl6ZWRfZGl2aWRlbmQ7CisJdW5pb24gdWludDY0X292ZXJsYXkgbm9ybWFsaXplZF9kaXZpc29yOworCXUzMiBwYXJ0aWFsMTsKKwl1bmlvbiB1aW50NjRfb3ZlcmxheSBwYXJ0aWFsMjsKKwl1bmlvbiB1aW50NjRfb3ZlcmxheSBwYXJ0aWFsMzsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0UodXRfZGl2aWRlKTsKKworCS8qIEFsd2F5cyBjaGVjayBmb3IgYSB6ZXJvIGRpdmlzb3IgKi8KKworCWlmIChpbl9kaXZpc29yID09IDApIHsKKwkJQUNQSV9FUlJPUigoQUVfSU5GTywgIkRpdmlkZSBieSB6ZXJvIikpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX0RJVklERV9CWV9aRVJPKTsKKwl9CisKKwlkaXZpc29yLmZ1bGwgPSBpbl9kaXZpc29yOworCWRpdmlkZW5kLmZ1bGwgPSBpbl9kaXZpZGVuZDsKKwlpZiAoZGl2aXNvci5wYXJ0LmhpID09IDApIHsKKwkJLyoKKwkJICogMSkgU2ltcGxlc3QgY2FzZSBpcyB3aGVyZSB0aGUgZGl2aXNvciBpcyAzMiBiaXRzLCB3ZSBjYW4KKwkJICoganVzdCBkbyB0d28gZGl2aWRlcworCQkgKi8KKwkJcmVtYWluZGVyLnBhcnQuaGkgPSAwOworCisJCS8qCisJCSAqIFRoZSBxdW90aWVudCBpcyA2NCBiaXRzLCB0aGUgcmVtYWluZGVyIGlzIGFsd2F5cyAzMiBiaXRzLAorCQkgKiBhbmQgaXMgZ2VuZXJhdGVkIGJ5IHRoZSBzZWNvbmQgZGl2aWRlLgorCQkgKi8KKwkJQUNQSV9ESVZfNjRfQllfMzIoMCwgZGl2aWRlbmQucGFydC5oaSwgZGl2aXNvci5wYXJ0LmxvLAorCQkJCSAgcXVvdGllbnQucGFydC5oaSwgcGFydGlhbDEpOworCQlBQ1BJX0RJVl82NF9CWV8zMihwYXJ0aWFsMSwgZGl2aWRlbmQucGFydC5sbywgZGl2aXNvci5wYXJ0LmxvLAorCQkJCSAgcXVvdGllbnQucGFydC5sbywgcmVtYWluZGVyLnBhcnQubG8pOworCX0KKworCWVsc2UgeworCQkvKgorCQkgKiAyKSBUaGUgZ2VuZXJhbCBjYXNlIHdoZXJlIHRoZSBkaXZpc29yIGlzIGEgZnVsbCA2NCBiaXRzCisJCSAqIGlzIG1vcmUgZGlmZmljdWx0CisJCSAqLworCQlxdW90aWVudC5wYXJ0LmhpID0gMDsKKwkJbm9ybWFsaXplZF9kaXZpZGVuZCA9IGRpdmlkZW5kOworCQlub3JtYWxpemVkX2Rpdmlzb3IgPSBkaXZpc29yOworCisJCS8qIE5vcm1hbGl6ZSB0aGUgb3BlcmFuZHMgKHNoaWZ0IHVudGlsIHRoZSBkaXZpc29yIGlzIDwgMzIgYml0cykgKi8KKworCQlkbyB7CisJCQlBQ1BJX1NISUZUX1JJR0hUXzY0KG5vcm1hbGl6ZWRfZGl2aXNvci5wYXJ0LmhpLAorCQkJCQkgICAgbm9ybWFsaXplZF9kaXZpc29yLnBhcnQubG8pOworCQkJQUNQSV9TSElGVF9SSUdIVF82NChub3JtYWxpemVkX2RpdmlkZW5kLnBhcnQuaGksCisJCQkJCSAgICBub3JtYWxpemVkX2RpdmlkZW5kLnBhcnQubG8pOworCisJCX0gd2hpbGUgKG5vcm1hbGl6ZWRfZGl2aXNvci5wYXJ0LmhpICE9IDApOworCisJCS8qIFBhcnRpYWwgZGl2aWRlICovCisKKwkJQUNQSV9ESVZfNjRfQllfMzIobm9ybWFsaXplZF9kaXZpZGVuZC5wYXJ0LmhpLAorCQkJCSAgbm9ybWFsaXplZF9kaXZpZGVuZC5wYXJ0LmxvLAorCQkJCSAgbm9ybWFsaXplZF9kaXZpc29yLnBhcnQubG8sCisJCQkJICBxdW90aWVudC5wYXJ0LmxvLCBwYXJ0aWFsMSk7CisKKwkJLyoKKwkJICogVGhlIHF1b3RpZW50IGlzIGFsd2F5cyAzMiBiaXRzLCBhbmQgc2ltcGx5IHJlcXVpcmVzIGFkanVzdG1lbnQuCisJCSAqIFRoZSA2NC1iaXQgcmVtYWluZGVyIG11c3QgYmUgZ2VuZXJhdGVkLgorCQkgKi8KKwkJcGFydGlhbDEgPSBxdW90aWVudC5wYXJ0LmxvICogZGl2aXNvci5wYXJ0LmhpOworCQlwYXJ0aWFsMi5mdWxsID0KKwkJICAgIChhY3BpX2ludGVnZXIpIHF1b3RpZW50LnBhcnQubG8gKiBkaXZpc29yLnBhcnQubG87CisJCXBhcnRpYWwzLmZ1bGwgPSAoYWNwaV9pbnRlZ2VyKSBwYXJ0aWFsMi5wYXJ0LmhpICsgcGFydGlhbDE7CisKKwkJcmVtYWluZGVyLnBhcnQuaGkgPSBwYXJ0aWFsMy5wYXJ0LmxvOworCQlyZW1haW5kZXIucGFydC5sbyA9IHBhcnRpYWwyLnBhcnQubG87CisKKwkJaWYgKHBhcnRpYWwzLnBhcnQuaGkgPT0gMCkgeworCQkJaWYgKHBhcnRpYWwzLnBhcnQubG8gPj0gZGl2aWRlbmQucGFydC5oaSkgeworCQkJCWlmIChwYXJ0aWFsMy5wYXJ0LmxvID09IGRpdmlkZW5kLnBhcnQuaGkpIHsKKwkJCQkJaWYgKHBhcnRpYWwyLnBhcnQubG8gPiBkaXZpZGVuZC5wYXJ0LmxvKSB7CisJCQkJCQlxdW90aWVudC5wYXJ0LmxvLS07CisJCQkJCQlyZW1haW5kZXIuZnVsbCAtPSBkaXZpc29yLmZ1bGw7CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQlxdW90aWVudC5wYXJ0LmxvLS07CisJCQkJCXJlbWFpbmRlci5mdWxsIC09IGRpdmlzb3IuZnVsbDsKKwkJCQl9CisJCQl9CisKKwkJCXJlbWFpbmRlci5mdWxsID0gcmVtYWluZGVyLmZ1bGwgLSBkaXZpZGVuZC5mdWxsOworCQkJcmVtYWluZGVyLnBhcnQuaGkgPSAodTMyKSAtICgoczMyKSByZW1haW5kZXIucGFydC5oaSk7CisJCQlyZW1haW5kZXIucGFydC5sbyA9ICh1MzIpIC0gKChzMzIpIHJlbWFpbmRlci5wYXJ0LmxvKTsKKworCQkJaWYgKHJlbWFpbmRlci5wYXJ0LmxvKSB7CisJCQkJcmVtYWluZGVyLnBhcnQuaGktLTsKKwkJCX0KKwkJfQorCX0KKworCS8qIFJldHVybiBvbmx5IHdoYXQgd2FzIHJlcXVlc3RlZCAqLworCisJaWYgKG91dF9xdW90aWVudCkgeworCQkqb3V0X3F1b3RpZW50ID0gcXVvdGllbnQuZnVsbDsKKwl9CisJaWYgKG91dF9yZW1haW5kZXIpIHsKKwkJKm91dF9yZW1haW5kZXIgPSByZW1haW5kZXIuZnVsbDsKKwl9CisKKwlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOworfQorCisjZWxzZQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV91dF9zaG9ydF9kaXZpZGUsIGFjcGlfdXRfZGl2aWRlCisgKgorICogUEFSQU1FVEVSUzogIFNlZSBmdW5jdGlvbiBoZWFkZXJzIGFib3ZlCisgKgorICogREVTQ1JJUFRJT046IE5hdGl2ZSB2ZXJzaW9ucyBvZiB0aGUgdXRfZGl2aWRlIGZ1bmN0aW9ucy4gVXNlIHRoZXNlIGlmIGVpdGhlcgorICogICAgICAgICAgICAgIDEpIFRoZSB0YXJnZXQgaXMgYSA2NC1iaXQgcGxhdGZvcm0gYW5kIHRoZXJlZm9yZSA2NC1iaXQKKyAqICAgICAgICAgICAgICAgICBpbnRlZ2VyIG1hdGggaXMgc3VwcG9ydGVkIGRpcmVjdGx5IGJ5IHRoZSBtYWNoaW5lLgorICogICAgICAgICAgICAgIDIpIFRoZSB0YXJnZXQgaXMgYSAzMi1iaXQgb3IgMTYtYml0IHBsYXRmb3JtLCBhbmQgdGhlCisgKiAgICAgICAgICAgICAgICAgZG91YmxlLXByZWNpc2lvbiBpbnRlZ2VyIG1hdGggbGlicmFyeSBpcyBhdmFpbGFibGUgdG8KKyAqICAgICAgICAgICAgICAgICBwZXJmb3JtIHRoZSBkaXZpZGUuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2FjcGlfc3RhdHVzCithY3BpX3V0X3Nob3J0X2RpdmlkZShhY3BpX2ludGVnZXIgaW5fZGl2aWRlbmQsCisJCSAgICAgdTMyIGRpdmlzb3IsCisJCSAgICAgYWNwaV9pbnRlZ2VyICogb3V0X3F1b3RpZW50LCB1MzIgKiBvdXRfcmVtYWluZGVyKQoreworCisJQUNQSV9GVU5DVElPTl9UUkFDRSh1dF9zaG9ydF9kaXZpZGUpOworCisJLyogQWx3YXlzIGNoZWNrIGZvciBhIHplcm8gZGl2aXNvciAqLworCisJaWYgKGRpdmlzb3IgPT0gMCkgeworCQlBQ1BJX0VSUk9SKChBRV9JTkZPLCAiRGl2aWRlIGJ5IHplcm8iKSk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfRElWSURFX0JZX1pFUk8pOworCX0KKworCS8qIFJldHVybiBvbmx5IHdoYXQgd2FzIHJlcXVlc3RlZCAqLworCisJaWYgKG91dF9xdW90aWVudCkgeworCQkqb3V0X3F1b3RpZW50ID0gaW5fZGl2aWRlbmQgLyBkaXZpc29yOworCX0KKwlpZiAob3V0X3JlbWFpbmRlcikgeworCQkqb3V0X3JlbWFpbmRlciA9ICh1MzIpIChpbl9kaXZpZGVuZCAlIGRpdmlzb3IpOworCX0KKworCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7Cit9CisKK2FjcGlfc3RhdHVzCithY3BpX3V0X2RpdmlkZShhY3BpX2ludGVnZXIgaW5fZGl2aWRlbmQsCisJICAgICAgIGFjcGlfaW50ZWdlciBpbl9kaXZpc29yLAorCSAgICAgICBhY3BpX2ludGVnZXIgKiBvdXRfcXVvdGllbnQsIGFjcGlfaW50ZWdlciAqIG91dF9yZW1haW5kZXIpCit7CisJQUNQSV9GVU5DVElPTl9UUkFDRSh1dF9kaXZpZGUpOworCisJLyogQWx3YXlzIGNoZWNrIGZvciBhIHplcm8gZGl2aXNvciAqLworCisJaWYgKGluX2Rpdmlzb3IgPT0gMCkgeworCQlBQ1BJX0VSUk9SKChBRV9JTkZPLCAiRGl2aWRlIGJ5IHplcm8iKSk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfRElWSURFX0JZX1pFUk8pOworCX0KKworCS8qIFJldHVybiBvbmx5IHdoYXQgd2FzIHJlcXVlc3RlZCAqLworCisJaWYgKG91dF9xdW90aWVudCkgeworCQkqb3V0X3F1b3RpZW50ID0gaW5fZGl2aWRlbmQgLyBpbl9kaXZpc29yOworCX0KKwlpZiAob3V0X3JlbWFpbmRlcikgeworCQkqb3V0X3JlbWFpbmRlciA9IGluX2RpdmlkZW5kICUgaW5fZGl2aXNvcjsKKwl9CisKKwlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvdXRtaXNjLmMgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL3V0bWlzYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxZjdmNGUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL3V0bWlzYy5jCkBAIC0wLDAgKzEsMTA5MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBNb2R1bGUgTmFtZTogdXRtaXNjIC0gY29tbW9uIHV0aWxpdHkgcHJvY2VkdXJlcworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA4LCBJbnRlbCBDb3JwLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAorICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgYXQgbWluaW11bSBhIGRpc2NsYWltZXIKKyAqICAgIHN1YnN0YW50aWFsbHkgc2ltaWxhciB0byB0aGUgIk5PIFdBUlJBTlRZIiBkaXNjbGFpbWVyIGJlbG93CisgKiAgICAoIkRpc2NsYWltZXIiKSBhbmQgYW55IHJlZGlzdHJpYnV0aW9uIG11c3QgYmUgY29uZGl0aW9uZWQgdXBvbgorICogICAgaW5jbHVkaW5nIGEgc3Vic3RhbnRpYWxseSBzaW1pbGFyIERpc2NsYWltZXIgcmVxdWlyZW1lbnQgZm9yIGZ1cnRoZXIKKyAqICAgIGJpbmFyeSByZWRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcworICogICAgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBOTyBXQVJSQU5UWQorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcKKyAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgorI2luY2x1ZGUgImFjY29tbW9uLmgiCisjaW5jbHVkZSAiYWNuYW1lc3AuaCIKKworI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfVVRJTElUSUVTCitBQ1BJX01PRFVMRV9OQU1FKCJ1dG1pc2MiKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X3ZhbGlkYXRlX2V4Y2VwdGlvbgorICoKKyAqIFBBUkFNRVRFUlM6ICBTdGF0dXMgICAgICAgLSBUaGUgYWNwaV9zdGF0dXMgY29kZSB0byBiZSBmb3JtYXR0ZWQKKyAqCisgKiBSRVRVUk46ICAgICAgQSBzdHJpbmcgY29udGFpbmluZyB0aGUgZXhjZXB0aW9uIHRleHQuIE5VTEwgaWYgZXhjZXB0aW9uIGlzCisgKiAgICAgICAgICAgICAgbm90IHZhbGlkLgorICoKKyAqIERFU0NSSVBUSU9OOiBUaGlzIGZ1bmN0aW9uIHZhbGlkYXRlcyBhbmQgdHJhbnNsYXRlcyBhbiBBQ1BJIGV4Y2VwdGlvbiBpbnRvCisgKiAgICAgICAgICAgICAgYW4gQVNDSUkgc3RyaW5nLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitjb25zdCBjaGFyICphY3BpX3V0X3ZhbGlkYXRlX2V4Y2VwdGlvbihhY3BpX3N0YXR1cyBzdGF0dXMpCit7CisJdTMyIHN1Yl9zdGF0dXM7CisJY29uc3QgY2hhciAqZXhjZXB0aW9uID0gTlVMTDsKKworCUFDUElfRlVOQ1RJT05fRU5UUlkoKTsKKworCS8qCisJICogU3RhdHVzIGlzIGNvbXBvc2VkIG9mIHR3byBwYXJ0cywgYSAidHlwZSIgYW5kIGFuIGFjdHVhbCBjb2RlCisJICovCisJc3ViX3N0YXR1cyA9IChzdGF0dXMgJiB+QUVfQ09ERV9NQVNLKTsKKworCXN3aXRjaCAoc3RhdHVzICYgQUVfQ09ERV9NQVNLKSB7CisJY2FzZSBBRV9DT0RFX0VOVklST05NRU5UQUw6CisKKwkJaWYgKHN1Yl9zdGF0dXMgPD0gQUVfQ09ERV9FTlZfTUFYKSB7CisJCQlleGNlcHRpb24gPSBhY3BpX2dibF9leGNlcHRpb25fbmFtZXNfZW52W3N1Yl9zdGF0dXNdOworCQl9CisJCWJyZWFrOworCisJY2FzZSBBRV9DT0RFX1BST0dSQU1NRVI6CisKKwkJaWYgKHN1Yl9zdGF0dXMgPD0gQUVfQ09ERV9QR01fTUFYKSB7CisJCQlleGNlcHRpb24gPSBhY3BpX2dibF9leGNlcHRpb25fbmFtZXNfcGdtW3N1Yl9zdGF0dXNdOworCQl9CisJCWJyZWFrOworCisJY2FzZSBBRV9DT0RFX0FDUElfVEFCTEVTOgorCisJCWlmIChzdWJfc3RhdHVzIDw9IEFFX0NPREVfVEJMX01BWCkgeworCQkJZXhjZXB0aW9uID0gYWNwaV9nYmxfZXhjZXB0aW9uX25hbWVzX3RibFtzdWJfc3RhdHVzXTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgQUVfQ09ERV9BTUw6CisKKwkJaWYgKHN1Yl9zdGF0dXMgPD0gQUVfQ09ERV9BTUxfTUFYKSB7CisJCQlleGNlcHRpb24gPSBhY3BpX2dibF9leGNlcHRpb25fbmFtZXNfYW1sW3N1Yl9zdGF0dXNdOworCQl9CisJCWJyZWFrOworCisJY2FzZSBBRV9DT0RFX0NPTlRST0w6CisKKwkJaWYgKHN1Yl9zdGF0dXMgPD0gQUVfQ09ERV9DVFJMX01BWCkgeworCQkJZXhjZXB0aW9uID0gYWNwaV9nYmxfZXhjZXB0aW9uX25hbWVzX2N0cmxbc3ViX3N0YXR1c107CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gKEFDUElfQ0FTVF9QVFIoY29uc3QgY2hhciwgZXhjZXB0aW9uKSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfdXRfaXNfYW1sX3RhYmxlCisgKgorICogUEFSQU1FVEVSUzogIFRhYmxlICAgICAgICAgICAgICAgLSBBbiBBQ1BJIHRhYmxlCisgKgorICogUkVUVVJOOiAgICAgIFRSVUUgaWYgdGFibGUgY29udGFpbnMgZXhlY3V0YWJsZSBBTUw7IEZBTFNFIG90aGVyd2lzZQorICoKKyAqIERFU0NSSVBUSU9OOiBDaGVjayBBQ1BJIFNpZ25hdHVyZSBmb3IgYSB0YWJsZSB0aGF0IGNvbnRhaW5zIEFNTCBjb2RlLgorICogICAgICAgICAgICAgIEN1cnJlbnRseSwgdGhlc2UgYXJlIERTRFQsU1NEVCxQU0RULiBBbGwgb3RoZXIgdGFibGUgdHlwZXMgYXJlCisgKiAgICAgICAgICAgICAgZGF0YSB0YWJsZXMgdGhhdCBkbyBub3QgY29udGFpbiBBTUwgY29kZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit1OCBhY3BpX3V0X2lzX2FtbF90YWJsZShzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKnRhYmxlKQoreworCisJLyogVGhlc2UgYXJlIHRoZSBvbmx5IHRhYmxlcyB0aGF0IGNvbnRhaW4gZXhlY3V0YWJsZSBBTUwgKi8KKworCWlmIChBQ1BJX0NPTVBBUkVfTkFNRSh0YWJsZS0+c2lnbmF0dXJlLCBBQ1BJX1NJR19EU0RUKSB8fAorCSAgICBBQ1BJX0NPTVBBUkVfTkFNRSh0YWJsZS0+c2lnbmF0dXJlLCBBQ1BJX1NJR19QU0RUKSB8fAorCSAgICBBQ1BJX0NPTVBBUkVfTkFNRSh0YWJsZS0+c2lnbmF0dXJlLCBBQ1BJX1NJR19TU0RUKSkgeworCQlyZXR1cm4gKFRSVUUpOworCX0KKworCXJldHVybiAoRkFMU0UpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X2FsbG9jYXRlX293bmVyX2lkCisgKgorICogUEFSQU1FVEVSUzogIG93bmVyX2lkICAgICAgICAtIFdoZXJlIHRoZSBuZXcgb3duZXIgSUQgaXMgcmV0dXJuZWQKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IEFsbG9jYXRlIGEgdGFibGUgb3IgbWV0aG9kIG93bmVyIElELiBUaGUgb3duZXIgSUQgaXMgdXNlZCB0bworICogICAgICAgICAgICAgIHRyYWNrIG9iamVjdHMgY3JlYXRlZCBieSB0aGUgdGFibGUgb3IgbWV0aG9kLCB0byBiZSBkZWxldGVkCisgKiAgICAgICAgICAgICAgd2hlbiB0aGUgbWV0aG9kIGV4aXRzIG9yIHRoZSB0YWJsZSBpcyB1bmxvYWRlZC4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCithY3BpX3N0YXR1cyBhY3BpX3V0X2FsbG9jYXRlX293bmVyX2lkKGFjcGlfb3duZXJfaWQgKiBvd25lcl9pZCkKK3sKKwl1MzIgaTsKKwl1MzIgajsKKwl1MzIgazsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKHV0X2FsbG9jYXRlX293bmVyX2lkKTsKKworCS8qIEd1YXJkIGFnYWluc3QgbXVsdGlwbGUgYWxsb2NhdGlvbnMgb2YgSUQgdG8gdGhlIHNhbWUgbG9jYXRpb24gKi8KKworCWlmICgqb3duZXJfaWQpIHsKKwkJQUNQSV9FUlJPUigoQUVfSU5GTywgIk93bmVyIElEIFslMi4yWF0gYWxyZWFkeSBleGlzdHMiLAorCQkJICAgICpvd25lcl9pZCkpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQUxSRUFEWV9FWElTVFMpOworCX0KKworCS8qIE11dGV4IGZvciB0aGUgZ2xvYmFsIElEIG1hc2sgKi8KKworCXN0YXR1cyA9IGFjcGlfdXRfYWNxdWlyZV9tdXRleChBQ1BJX01UWF9DQUNIRVMpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKKwl9CisKKwkvKgorCSAqIEZpbmQgYSBmcmVlIG93bmVyIElELCBjeWNsZSB0aHJvdWdoIGFsbCBwb3NzaWJsZSBJRHMgb24gcmVwZWF0ZWQKKwkgKiBhbGxvY2F0aW9ucy4gKEFDUElfTlVNX09XTkVSSURfTUFTS1MgKyAxKSBiZWNhdXNlIGZpcnN0IGluZGV4IG1heSBoYXZlCisJICogdG8gYmUgc2Nhbm5lZCB0d2ljZS4KKwkgKi8KKwlmb3IgKGkgPSAwLCBqID0gYWNwaV9nYmxfbGFzdF9vd25lcl9pZF9pbmRleDsKKwkgICAgIGkgPCAoQUNQSV9OVU1fT1dORVJJRF9NQVNLUyArIDEpOyBpKyssIGorKykgeworCQlpZiAoaiA+PSBBQ1BJX05VTV9PV05FUklEX01BU0tTKSB7CisJCQlqID0gMDsJLyogV3JhcGFyb3VuZCB0byBzdGFydCBvZiBtYXNrIGFycmF5ICovCisJCX0KKworCQlmb3IgKGsgPSBhY3BpX2dibF9uZXh0X293bmVyX2lkX29mZnNldDsgayA8IDMyOyBrKyspIHsKKwkJCWlmIChhY3BpX2dibF9vd25lcl9pZF9tYXNrW2pdID09IEFDUElfVUlOVDMyX01BWCkgeworCisJCQkJLyogVGhlcmUgYXJlIG5vIGZyZWUgSURzIGluIHRoaXMgbWFzayAqLworCisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWlmICghKGFjcGlfZ2JsX293bmVyX2lkX21hc2tbal0gJiAoMSA8PCBrKSkpIHsKKwkJCQkvKgorCQkJCSAqIEZvdW5kIGEgZnJlZSBJRC4gVGhlIGFjdHVhbCBJRCBpcyB0aGUgYml0IGluZGV4IHBsdXMgb25lLAorCQkJCSAqIG1ha2luZyB6ZXJvIGFuIGludmFsaWQgT3duZXIgSUQuIFNhdmUgdGhpcyBhcyB0aGUgbGFzdCBJRAorCQkJCSAqIGFsbG9jYXRlZCBhbmQgdXBkYXRlIHRoZSBnbG9iYWwgSUQgbWFzay4KKwkJCQkgKi8KKwkJCQlhY3BpX2dibF9vd25lcl9pZF9tYXNrW2pdIHw9ICgxIDw8IGspOworCisJCQkJYWNwaV9nYmxfbGFzdF9vd25lcl9pZF9pbmRleCA9ICh1OCkgajsKKwkJCQlhY3BpX2dibF9uZXh0X293bmVyX2lkX29mZnNldCA9ICh1OCkgKGsgKyAxKTsKKworCQkJCS8qCisJCQkJICogQ29uc3RydWN0IGVuY29kZWQgSUQgZnJvbSB0aGUgaW5kZXggYW5kIGJpdCBwb3NpdGlvbgorCQkJCSAqCisJCQkJICogTm90ZTogTGFzdCBbal0uayAoYml0IDI1NSkgaXMgbmV2ZXIgdXNlZCBhbmQgaXMgbWFya2VkCisJCQkJICogcGVybWFuZW50bHkgYWxsb2NhdGVkIChwcmV2ZW50cyArMSBvdmVyZmxvdykKKwkJCQkgKi8KKwkJCQkqb3duZXJfaWQgPQorCQkJCSAgICAoYWNwaV9vd25lcl9pZCkgKChrICsgMSkgKyBBQ1BJX01VTF8zMihqKSk7CisKKwkJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX1ZBTFVFUywKKwkJCQkJCSAgIkFsbG9jYXRlZCBPd25lcklkOiAlMi4yWFxuIiwKKwkJCQkJCSAgKHVuc2lnbmVkIGludCkqb3duZXJfaWQpKTsKKwkJCQlnb3RvIGV4aXQ7CisJCQl9CisJCX0KKworCQlhY3BpX2dibF9uZXh0X293bmVyX2lkX29mZnNldCA9IDA7CisJfQorCisJLyoKKwkgKiBBbGwgb3duZXJfaWRzIGhhdmUgYmVlbiBhbGxvY2F0ZWQuIFRoaXMgdHlwaWNhbGx5IHNob3VsZAorCSAqIG5vdCBoYXBwZW4gc2luY2UgdGhlIElEcyBhcmUgcmV1c2VkIGFmdGVyIGRlYWxsb2NhdGlvbi4gVGhlIElEcyBhcmUKKwkgKiBhbGxvY2F0ZWQgdXBvbiB0YWJsZSBsb2FkIChvbmUgcGVyIHRhYmxlKSBhbmQgbWV0aG9kIGV4ZWN1dGlvbiwgYW5kCisJICogdGhleSBhcmUgcmVsZWFzZWQgd2hlbiBhIHRhYmxlIGlzIHVubG9hZGVkIG9yIGEgbWV0aG9kIGNvbXBsZXRlcworCSAqIGV4ZWN1dGlvbi4KKwkgKgorCSAqIElmIHRoaXMgZXJyb3IgaGFwcGVucywgdGhlcmUgbWF5IGJlIHZlcnkgZGVlcCBuZXN0aW5nIG9mIGludm9rZWQgY29udHJvbAorCSAqIG1ldGhvZHMsIG9yIHRoZXJlIG1heSBiZSBhIGJ1ZyB3aGVyZSB0aGUgSURzIGFyZSBub3QgcmVsZWFzZWQuCisJICovCisJc3RhdHVzID0gQUVfT1dORVJfSURfTElNSVQ7CisJQUNQSV9FUlJPUigoQUVfSU5GTywKKwkJICAgICJDb3VsZCBub3QgYWxsb2NhdGUgbmV3IE93bmVySWQgKDI1NSBtYXgpLCBBRV9PV05FUl9JRF9MSU1JVCIpKTsKKworICAgICAgZXhpdDoKKwkodm9pZClhY3BpX3V0X3JlbGVhc2VfbXV0ZXgoQUNQSV9NVFhfQ0FDSEVTKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV91dF9yZWxlYXNlX293bmVyX2lkCisgKgorICogUEFSQU1FVEVSUzogIG93bmVyX2lkX3B0ciAgICAgICAgLSBQb2ludGVyIHRvIGEgcHJldmlvdXNseSBhbGxvY2F0ZWQgb3duZXJfaUQKKyAqCisgKiBSRVRVUk46ICAgICAgTm9uZS4gTm8gZXJyb3IgaXMgcmV0dXJuZWQgYmVjYXVzZSB3ZSBhcmUgZWl0aGVyIGV4aXRpbmcgYQorICogICAgICAgICAgICAgIGNvbnRyb2wgbWV0aG9kIG9yIHVubG9hZGluZyBhIHRhYmxlLiBFaXRoZXIgd2F5LCB3ZSB3b3VsZAorICogICAgICAgICAgICAgIGlnbm9yZSBhbnkgZXJyb3IgYW55d2F5LgorICoKKyAqIERFU0NSSVBUSU9OOiBSZWxlYXNlIGEgdGFibGUgb3IgbWV0aG9kIG93bmVyIElELiAgVmFsaWQgSURzIGFyZSAxIC0gMjU1CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBhY3BpX3V0X3JlbGVhc2Vfb3duZXJfaWQoYWNwaV9vd25lcl9pZCAqIG93bmVyX2lkX3B0cikKK3sKKwlhY3BpX293bmVyX2lkIG93bmVyX2lkID0gKm93bmVyX2lkX3B0cjsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJdTMyIGluZGV4OworCXUzMiBiaXQ7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1UzMih1dF9yZWxlYXNlX293bmVyX2lkLCBvd25lcl9pZCk7CisKKwkvKiBBbHdheXMgY2xlYXIgdGhlIGlucHV0IG93bmVyX2lkICh6ZXJvIGlzIGFuIGludmFsaWQgSUQpICovCisKKwkqb3duZXJfaWRfcHRyID0gMDsKKworCS8qIFplcm8gaXMgbm90IGEgdmFsaWQgb3duZXJfaUQgKi8KKworCWlmIChvd25lcl9pZCA9PSAwKSB7CisJCUFDUElfRVJST1IoKEFFX0lORk8sICJJbnZhbGlkIE93bmVySWQ6ICUyLjJYIiwgb3duZXJfaWQpKTsKKwkJcmV0dXJuX1ZPSUQ7CisJfQorCisJLyogTXV0ZXggZm9yIHRoZSBnbG9iYWwgSUQgbWFzayAqLworCisJc3RhdHVzID0gYWNwaV91dF9hY3F1aXJlX211dGV4KEFDUElfTVRYX0NBQ0hFUyk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXJldHVybl9WT0lEOworCX0KKworCS8qIE5vcm1hbGl6ZSB0aGUgSUQgdG8gemVybyAqLworCisJb3duZXJfaWQtLTsKKworCS8qIERlY29kZSBJRCB0byBpbmRleC9vZmZzZXQgcGFpciAqLworCisJaW5kZXggPSBBQ1BJX0RJVl8zMihvd25lcl9pZCk7CisJYml0ID0gMSA8PCBBQ1BJX01PRF8zMihvd25lcl9pZCk7CisKKwkvKiBGcmVlIHRoZSBvd25lciBJRCBvbmx5IGlmIGl0IGlzIHZhbGlkICovCisKKwlpZiAoYWNwaV9nYmxfb3duZXJfaWRfbWFza1tpbmRleF0gJiBiaXQpIHsKKwkJYWNwaV9nYmxfb3duZXJfaWRfbWFza1tpbmRleF0gXj0gYml0OworCX0gZWxzZSB7CisJCUFDUElfRVJST1IoKEFFX0lORk8sCisJCQkgICAgIlJlbGVhc2Ugb2Ygbm9uLWFsbG9jYXRlZCBPd25lcklkOiAlMi4yWCIsCisJCQkgICAgb3duZXJfaWQgKyAxKSk7CisJfQorCisJKHZvaWQpYWNwaV91dF9yZWxlYXNlX211dGV4KEFDUElfTVRYX0NBQ0hFUyk7CisJcmV0dXJuX1ZPSUQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfdXRfc3RydXByIChzdHJ1cHIpCisgKgorICogUEFSQU1FVEVSUzogIHNyY19zdHJpbmcgICAgICAtIFRoZSBzb3VyY2Ugc3RyaW5nIHRvIGNvbnZlcnQKKyAqCisgKiBSRVRVUk46ICAgICAgTm9uZQorICoKKyAqIERFU0NSSVBUSU9OOiBDb252ZXJ0IHN0cmluZyB0byB1cHBlcmNhc2UKKyAqCisgKiBOT1RFOiBUaGlzIGlzIG5vdCBhIFBPU0lYIGZ1bmN0aW9uLCBzbyBpdCBhcHBlYXJzIGhlcmUsIG5vdCBpbiB1dGNsaWIuYworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgYWNwaV91dF9zdHJ1cHIoY2hhciAqc3JjX3N0cmluZykKK3sKKwljaGFyICpzdHJpbmc7CisKKwlBQ1BJX0ZVTkNUSU9OX0VOVFJZKCk7CisKKwlpZiAoIXNyY19zdHJpbmcpIHsKKwkJcmV0dXJuOworCX0KKworCS8qIFdhbGsgZW50aXJlIHN0cmluZywgdXBwZXJjYXNpbmcgdGhlIGxldHRlcnMgKi8KKworCWZvciAoc3RyaW5nID0gc3JjX3N0cmluZzsgKnN0cmluZzsgc3RyaW5nKyspIHsKKwkJKnN0cmluZyA9IChjaGFyKUFDUElfVE9VUFBFUigqc3RyaW5nKTsKKwl9CisKKwlyZXR1cm47Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfdXRfcHJpbnRfc3RyaW5nCisgKgorICogUEFSQU1FVEVSUzogIFN0cmluZyAgICAgICAgICAtIE51bGwgdGVybWluYXRlZCBBU0NJSSBzdHJpbmcKKyAqICAgICAgICAgICAgICBtYXhfbGVuZ3RoICAgICAgLSBNYXhpbXVtIG91dHB1dCBsZW5ndGgKKyAqCisgKiBSRVRVUk46ICAgICAgTm9uZQorICoKKyAqIERFU0NSSVBUSU9OOiBEdW1wIGFuIEFTQ0lJIHN0cmluZyB3aXRoIHN1cHBvcnQgZm9yIEFDUEktZGVmaW5lZCBlc2NhcGUKKyAqICAgICAgICAgICAgICBzZXF1ZW5jZXMuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBhY3BpX3V0X3ByaW50X3N0cmluZyhjaGFyICpzdHJpbmcsIHU4IG1heF9sZW5ndGgpCit7CisJdTMyIGk7CisKKwlpZiAoIXN0cmluZykgeworCQlhY3BpX29zX3ByaW50ZigiPFwiTlVMTCBTVFJJTkcgUFRSXCI+Iik7CisJCXJldHVybjsKKwl9CisKKwlhY3BpX29zX3ByaW50ZigiXCIiKTsKKwlmb3IgKGkgPSAwOyBzdHJpbmdbaV0gJiYgKGkgPCBtYXhfbGVuZ3RoKTsgaSsrKSB7CisKKwkJLyogRXNjYXBlIHNlcXVlbmNlcyAqLworCisJCXN3aXRjaCAoc3RyaW5nW2ldKSB7CisJCWNhc2UgMHgwNzoKKwkJCWFjcGlfb3NfcHJpbnRmKCJcXGEiKTsJLyogQkVMTCAqLworCQkJYnJlYWs7CisKKwkJY2FzZSAweDA4OgorCQkJYWNwaV9vc19wcmludGYoIlxcYiIpOwkvKiBCQUNLU1BBQ0UgKi8KKwkJCWJyZWFrOworCisJCWNhc2UgMHgwQzoKKwkJCWFjcGlfb3NfcHJpbnRmKCJcXGYiKTsJLyogRk9STUZFRUQgKi8KKwkJCWJyZWFrOworCisJCWNhc2UgMHgwQToKKwkJCWFjcGlfb3NfcHJpbnRmKCJcXG4iKTsJLyogTElORUZFRUQgKi8KKwkJCWJyZWFrOworCisJCWNhc2UgMHgwRDoKKwkJCWFjcGlfb3NfcHJpbnRmKCJcXHIiKTsJLyogQ0FSUklBR0UgUkVUVVJOICovCisJCQlicmVhazsKKworCQljYXNlIDB4MDk6CisJCQlhY3BpX29zX3ByaW50ZigiXFx0Iik7CS8qIEhPUklaT05UQUwgVEFCICovCisJCQlicmVhazsKKworCQljYXNlIDB4MEI6CisJCQlhY3BpX29zX3ByaW50ZigiXFx2Iik7CS8qIFZFUlRJQ0FMIFRBQiAqLworCQkJYnJlYWs7CisKKwkJY2FzZSAnXCcnOgkvKiBTaW5nbGUgUXVvdGUgKi8KKwkJY2FzZSAnXCInOgkvKiBEb3VibGUgUXVvdGUgKi8KKwkJY2FzZSAnXFwnOgkvKiBCYWNrc2xhc2ggKi8KKwkJCWFjcGlfb3NfcHJpbnRmKCJcXCVjIiwgKGludClzdHJpbmdbaV0pOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKworCQkJLyogQ2hlY2sgZm9yIHByaW50YWJsZSBjaGFyYWN0ZXIgb3IgaGV4IGVzY2FwZSAqLworCisJCQlpZiAoQUNQSV9JU19QUklOVChzdHJpbmdbaV0pKSB7CisJCQkJLyogVGhpcyBpcyBhIG5vcm1hbCBjaGFyYWN0ZXIgKi8KKworCQkJCWFjcGlfb3NfcHJpbnRmKCIlYyIsIChpbnQpc3RyaW5nW2ldKTsKKwkJCX0gZWxzZSB7CisJCQkJLyogQWxsIG90aGVycyB3aWxsIGJlIEhleCBlc2NhcGVzICovCisKKwkJCQlhY3BpX29zX3ByaW50ZigiXFx4JTIuMlgiLCAoczMyKSBzdHJpbmdbaV0pOworCQkJfQorCQkJYnJlYWs7CisJCX0KKwl9CisJYWNwaV9vc19wcmludGYoIlwiIik7CisKKwlpZiAoaSA9PSBtYXhfbGVuZ3RoICYmIHN0cmluZ1tpXSkgeworCQlhY3BpX29zX3ByaW50ZigiLi4uIik7CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X2R3b3JkX2J5dGVfc3dhcAorICoKKyAqIFBBUkFNRVRFUlM6ICBWYWx1ZSAgICAgICAgICAgLSBWYWx1ZSB0byBiZSBjb252ZXJ0ZWQKKyAqCisgKiBSRVRVUk46ICAgICAgdTMyIGludGVnZXIgd2l0aCBieXRlcyBzd2FwcGVkCisgKgorICogREVTQ1JJUFRJT046IENvbnZlcnQgYSAzMi1iaXQgdmFsdWUgdG8gYmlnLWVuZGlhbiAoc3dhcCB0aGUgYnl0ZXMpCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordTMyIGFjcGlfdXRfZHdvcmRfYnl0ZV9zd2FwKHUzMiB2YWx1ZSkKK3sKKwl1bmlvbiB7CisJCXUzMiB2YWx1ZTsKKwkJdTggYnl0ZXNbNF07CisJfSBvdXQ7CisJdW5pb24geworCQl1MzIgdmFsdWU7CisJCXU4IGJ5dGVzWzRdOworCX0gaW47CisKKwlBQ1BJX0ZVTkNUSU9OX0VOVFJZKCk7CisKKwlpbi52YWx1ZSA9IHZhbHVlOworCisJb3V0LmJ5dGVzWzBdID0gaW4uYnl0ZXNbM107CisJb3V0LmJ5dGVzWzFdID0gaW4uYnl0ZXNbMl07CisJb3V0LmJ5dGVzWzJdID0gaW4uYnl0ZXNbMV07CisJb3V0LmJ5dGVzWzNdID0gaW4uYnl0ZXNbMF07CisKKwlyZXR1cm4gKG91dC52YWx1ZSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfdXRfc2V0X2ludGVnZXJfd2lkdGgKKyAqCisgKiBQQVJBTUVURVJTOiAgUmV2aXNpb24gICAgICAgICAgICBGcm9tIERTRFQgaGVhZGVyCisgKgorICogUkVUVVJOOiAgICAgIE5vbmUKKyAqCisgKiBERVNDUklQVElPTjogU2V0IHRoZSBnbG9iYWwgaW50ZWdlciBiaXQgd2lkdGggYmFzZWQgdXBvbiB0aGUgcmV2aXNpb24KKyAqICAgICAgICAgICAgICBvZiB0aGUgRFNEVC4gIEZvciBSZXZpc2lvbiAxIGFuZCAwLCBJbnRlZ2VycyBhcmUgMzIgYml0cy4KKyAqICAgICAgICAgICAgICBGb3IgUmV2aXNpb24gMiBhbmQgYWJvdmUsIEludGVnZXJzIGFyZSA2NCBiaXRzLiAgWWVzLCB0aGlzCisgKiAgICAgICAgICAgICAgbWFrZXMgYSBkaWZmZXJlbmNlLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgYWNwaV91dF9zZXRfaW50ZWdlcl93aWR0aCh1OCByZXZpc2lvbikKK3sKKworCWlmIChyZXZpc2lvbiA8IDIpIHsKKworCQkvKiAzMi1iaXQgY2FzZSAqLworCisJCWFjcGlfZ2JsX2ludGVnZXJfYml0X3dpZHRoID0gMzI7CisJCWFjcGlfZ2JsX2ludGVnZXJfbnliYmxlX3dpZHRoID0gODsKKwkJYWNwaV9nYmxfaW50ZWdlcl9ieXRlX3dpZHRoID0gNDsKKwl9IGVsc2UgeworCQkvKiA2NC1iaXQgY2FzZSAoQUNQSSAyLjArKSAqLworCisJCWFjcGlfZ2JsX2ludGVnZXJfYml0X3dpZHRoID0gNjQ7CisJCWFjcGlfZ2JsX2ludGVnZXJfbnliYmxlX3dpZHRoID0gMTY7CisJCWFjcGlfZ2JsX2ludGVnZXJfYnl0ZV93aWR0aCA9IDg7CisJfQorfQorCisjaWZkZWYgQUNQSV9ERUJVR19PVVRQVVQKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfdXRfZGlzcGxheV9pbml0X3BhdGhuYW1lCisgKgorICogUEFSQU1FVEVSUzogIFR5cGUgICAgICAgICAgICAgICAgLSBPYmplY3QgdHlwZSBvZiB0aGUgbm9kZQorICogICAgICAgICAgICAgIG9ial9oYW5kbGUgICAgICAgICAgLSBIYW5kbGUgd2hvc2UgcGF0aG5hbWUgd2lsbCBiZSBkaXNwbGF5ZWQKKyAqICAgICAgICAgICAgICBQYXRoICAgICAgICAgICAgICAgIC0gQWRkaXRpb25hbCBwYXRoIHN0cmluZyB0byBiZSBhcHBlbmRlZC4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTlVMTCBpZiBubyBleHRyYSBwYXRoKQorICoKKyAqIFJFVFVSTjogICAgICBhY3BpX3N0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBEaXNwbGF5IGZ1bGwgcGF0aG5hbWUgb2YgYW4gb2JqZWN0LCBERUJVRyBPTkxZCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZAorYWNwaV91dF9kaXNwbGF5X2luaXRfcGF0aG5hbWUodTggdHlwZSwKKwkJCSAgICAgIHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpvYmpfaGFuZGxlLAorCQkJICAgICAgY2hhciAqcGF0aCkKK3sKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJc3RydWN0IGFjcGlfYnVmZmVyIGJ1ZmZlcjsKKworCUFDUElfRlVOQ1RJT05fRU5UUlkoKTsKKworCS8qIE9ubHkgcHJpbnQgdGhlIHBhdGggaWYgdGhlIGFwcHJvcHJpYXRlIGRlYnVnIGxldmVsIGlzIGVuYWJsZWQgKi8KKworCWlmICghKGFjcGlfZGJnX2xldmVsICYgQUNQSV9MVl9JTklUX05BTUVTKSkgeworCQlyZXR1cm47CisJfQorCisJLyogR2V0IHRoZSBmdWxsIHBhdGhuYW1lIHRvIHRoZSBub2RlICovCisKKwlidWZmZXIubGVuZ3RoID0gQUNQSV9BTExPQ0FURV9MT0NBTF9CVUZGRVI7CisJc3RhdHVzID0gYWNwaV9uc19oYW5kbGVfdG9fcGF0aG5hbWUob2JqX2hhbmRsZSwgJmJ1ZmZlcik7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXJldHVybjsKKwl9CisKKwkvKiBQcmludCB3aGF0IHdlJ3JlIGRvaW5nICovCisKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIEFDUElfVFlQRV9NRVRIT0Q6CisJCWFjcGlfb3NfcHJpbnRmKCJFeGVjdXRpbmcgICIpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWFjcGlfb3NfcHJpbnRmKCJJbml0aWFsaXppbmcgIik7CisJCWJyZWFrOworCX0KKworCS8qIFByaW50IHRoZSBvYmplY3QgdHlwZSBhbmQgcGF0aG5hbWUgKi8KKworCWFjcGlfb3NfcHJpbnRmKCIlLTEycyAlcyIsCisJCSAgICAgICBhY3BpX3V0X2dldF90eXBlX25hbWUodHlwZSksIChjaGFyICopYnVmZmVyLnBvaW50ZXIpOworCisJLyogRXh0cmEgcGF0aCBpcyB1c2VkIHRvIGFwcGVuZCBuYW1lcyBsaWtlIF9TVEEsIF9JTkksIGV0Yy4gKi8KKworCWlmIChwYXRoKSB7CisJCWFjcGlfb3NfcHJpbnRmKCIuJXMiLCBwYXRoKTsKKwl9CisJYWNwaV9vc19wcmludGYoIlxuIik7CisKKwlBQ1BJX0ZSRUUoYnVmZmVyLnBvaW50ZXIpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfdXRfdmFsaWRfYWNwaV9jaGFyCisgKgorICogUEFSQU1FVEVSUzogIENoYXIgICAgICAgICAgICAtIFRoZSBjaGFyYWN0ZXIgdG8gYmUgZXhhbWluZWQKKyAqICAgICAgICAgICAgICBQb3NpdGlvbiAgICAgICAgLSBCeXRlIHBvc2l0aW9uICgwLTMpCisgKgorICogUkVUVVJOOiAgICAgIFRSVUUgaWYgdGhlIGNoYXJhY3RlciBpcyB2YWxpZCwgRkFMU0Ugb3RoZXJ3aXNlCisgKgorICogREVTQ1JJUFRJT046IENoZWNrIGZvciBhIHZhbGlkIEFDUEkgY2hhcmFjdGVyLiBNdXN0IGJlIG9uZSBvZjoKKyAqICAgICAgICAgICAgICAxKSBVcHBlciBjYXNlIGFscGhhCisgKiAgICAgICAgICAgICAgMikgbnVtZXJpYworICogICAgICAgICAgICAgIDMpIHVuZGVyc2NvcmUKKyAqCisgKiAgICAgICAgICAgICAgV2UgYWxsb3cgYSAnIScgYXMgdGhlIGxhc3QgY2hhcmFjdGVyIGJlY2F1c2Ugb2YgdGhlIEFTRiEgdGFibGUKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit1OCBhY3BpX3V0X3ZhbGlkX2FjcGlfY2hhcihjaGFyIGNoYXJhY3RlciwgdTMyIHBvc2l0aW9uKQoreworCisJaWYgKCEoKGNoYXJhY3RlciA+PSAnQScgJiYgY2hhcmFjdGVyIDw9ICdaJykgfHwKKwkgICAgICAoY2hhcmFjdGVyID49ICcwJyAmJiBjaGFyYWN0ZXIgPD0gJzknKSB8fCAoY2hhcmFjdGVyID09ICdfJykpKSB7CisKKwkJLyogQWxsb3cgYSAnIScgaW4gdGhlIGxhc3QgcG9zaXRpb24gKi8KKworCQlpZiAoY2hhcmFjdGVyID09ICchJyAmJiBwb3NpdGlvbiA9PSAzKSB7CisJCQlyZXR1cm4gKFRSVUUpOworCQl9CisKKwkJcmV0dXJuIChGQUxTRSk7CisJfQorCisJcmV0dXJuIChUUlVFKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV91dF92YWxpZF9hY3BpX25hbWUKKyAqCisgKiBQQVJBTUVURVJTOiAgTmFtZSAgICAgICAgICAgIC0gVGhlIG5hbWUgdG8gYmUgZXhhbWluZWQKKyAqCisgKiBSRVRVUk46ICAgICAgVFJVRSBpZiB0aGUgbmFtZSBpcyB2YWxpZCwgRkFMU0Ugb3RoZXJ3aXNlCisgKgorICogREVTQ1JJUFRJT046IENoZWNrIGZvciBhIHZhbGlkIEFDUEkgbmFtZS4gIEVhY2ggY2hhcmFjdGVyIG11c3QgYmUgb25lIG9mOgorICogICAgICAgICAgICAgIDEpIFVwcGVyIGNhc2UgYWxwaGEKKyAqICAgICAgICAgICAgICAyKSBudW1lcmljCisgKiAgICAgICAgICAgICAgMykgdW5kZXJzY29yZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3U4IGFjcGlfdXRfdmFsaWRfYWNwaV9uYW1lKHUzMiBuYW1lKQoreworCXUzMiBpOworCisJQUNQSV9GVU5DVElPTl9FTlRSWSgpOworCisJZm9yIChpID0gMDsgaSA8IEFDUElfTkFNRV9TSVpFOyBpKyspIHsKKwkJaWYgKCFhY3BpX3V0X3ZhbGlkX2FjcGlfY2hhcgorCQkgICAgKChBQ1BJX0NBU1RfUFRSKGNoYXIsICZuYW1lKSlbaV0sIGkpKSB7CisJCQlyZXR1cm4gKEZBTFNFKTsKKwkJfQorCX0KKworCXJldHVybiAoVFJVRSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfdXRfcmVwYWlyX25hbWUKKyAqCisgKiBQQVJBTUVURVJTOiAgTmFtZSAgICAgICAgICAgIC0gVGhlIEFDUEkgbmFtZSB0byBiZSByZXBhaXJlZAorICoKKyAqIFJFVFVSTjogICAgICBSZXBhaXJlZCB2ZXJzaW9uIG9mIHRoZSBuYW1lCisgKgorICogREVTQ1JJUFRJT046IFJlcGFpciBhbiBBQ1BJIG5hbWU6IENoYW5nZSBpbnZhbGlkIGNoYXJhY3RlcnMgdG8gJyonIGFuZAorICogICAgICAgICAgICAgIHJldHVybiB0aGUgbmV3IG5hbWUuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworYWNwaV9uYW1lIGFjcGlfdXRfcmVwYWlyX25hbWUoY2hhciAqbmFtZSkKK3sKKyAgICAgICB1MzIgaTsKKwljaGFyIG5ld19uYW1lW0FDUElfTkFNRV9TSVpFXTsKKworCWZvciAoaSA9IDA7IGkgPCBBQ1BJX05BTUVfU0laRTsgaSsrKSB7CisJCW5ld19uYW1lW2ldID0gbmFtZVtpXTsKKworCQkvKgorCQkgKiBSZXBsYWNlIGEgYmFkIGNoYXJhY3RlciB3aXRoIHNvbWV0aGluZyBwcmludGFibGUsIHlldCB0ZWNobmljYWxseQorCQkgKiBzdGlsbCBpbnZhbGlkLiBUaGlzIHByZXZlbnRzIGFueSBjb2xsaXNpb25zIHdpdGggZXhpc3RpbmcgImdvb2QiCisJCSAqIG5hbWVzIGluIHRoZSBuYW1lc3BhY2UuCisJCSAqLworCQlpZiAoIWFjcGlfdXRfdmFsaWRfYWNwaV9jaGFyKG5hbWVbaV0sIGkpKSB7CisJCQluZXdfbmFtZVtpXSA9ICcqJzsKKwkJfQorCX0KKworCXJldHVybiAoKih1MzIgKikgbmV3X25hbWUpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X3N0cnRvdWw2NAorICoKKyAqIFBBUkFNRVRFUlM6ICBTdHJpbmcgICAgICAgICAgLSBOdWxsIHRlcm1pbmF0ZWQgc3RyaW5nCisgKiAgICAgICAgICAgICAgQmFzZSAgICAgICAgICAgIC0gUmFkaXggb2YgdGhlIHN0cmluZzogMTYgb3IgQUNQSV9BTllfQkFTRTsKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQ1BJX0FOWV9CQVNFIG1lYW5zICdpbiBiZWhhbGYgb2YgdG9faW50ZWdlcicKKyAqICAgICAgICAgICAgICByZXRfaW50ZWdlciAgICAgLSBXaGVyZSB0aGUgY29udmVydGVkIGludGVnZXIgaXMgcmV0dXJuZWQKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzIGFuZCBDb252ZXJ0ZWQgdmFsdWUKKyAqCisgKiBERVNDUklQVElPTjogQ29udmVydCBhIHN0cmluZyBpbnRvIGFuIHVuc2lnbmVkIHZhbHVlLiBQZXJmb3JtcyBlaXRoZXIgYQorICogICAgICAgICAgICAgIDMyLWJpdCBvciA2NC1iaXQgY29udmVyc2lvbiwgZGVwZW5kaW5nIG9uIHRoZSBjdXJyZW50IG1vZGUKKyAqICAgICAgICAgICAgICBvZiB0aGUgaW50ZXJwcmV0ZXIuCisgKiAgICAgICAgICAgICAgTk9URTogRG9lcyBub3Qgc3VwcG9ydCBPY3RhbCBzdHJpbmdzLCBub3QgbmVlZGVkLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2FjcGlfc3RhdHVzCithY3BpX3V0X3N0cnRvdWw2NChjaGFyICpzdHJpbmcsIHUzMiBiYXNlLCBhY3BpX2ludGVnZXIgKiByZXRfaW50ZWdlcikKK3sKKwl1MzIgdGhpc19kaWdpdCA9IDA7CisJYWNwaV9pbnRlZ2VyIHJldHVybl92YWx1ZSA9IDA7CisJYWNwaV9pbnRlZ2VyIHF1b3RpZW50OworCWFjcGlfaW50ZWdlciBkaXZpZGVuZDsKKwl1MzIgdG9faW50ZWdlcl9vcCA9IChiYXNlID09IEFDUElfQU5ZX0JBU0UpOworCXUzMiBtb2RlMzIgPSAoYWNwaV9nYmxfaW50ZWdlcl9ieXRlX3dpZHRoID09IDQpOworCXU4IHZhbGlkX2RpZ2l0cyA9IDA7CisJdTggc2lnbl9vZjB4ID0gMDsKKwl1OCB0ZXJtID0gMDsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0VfU1RSKHV0X3N0cm91bDY0LCBzdHJpbmcpOworCisJc3dpdGNoIChiYXNlKSB7CisJY2FzZSBBQ1BJX0FOWV9CQVNFOgorCWNhc2UgMTY6CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJLyogSW52YWxpZCBCYXNlICovCisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfUEFSQU1FVEVSKTsKKwl9CisKKwlpZiAoIXN0cmluZykgeworCQlnb3RvIGVycm9yX2V4aXQ7CisJfQorCisJLyogU2tpcCBvdmVyIGFueSB3aGl0ZSBzcGFjZSBpbiB0aGUgYnVmZmVyICovCisKKwl3aGlsZSAoKCpzdHJpbmcpICYmIChBQ1BJX0lTX1NQQUNFKCpzdHJpbmcpIHx8ICpzdHJpbmcgPT0gJ1x0JykpIHsKKwkJc3RyaW5nKys7CisJfQorCisJaWYgKHRvX2ludGVnZXJfb3ApIHsKKwkJLyoKKwkJICogQmFzZSBlcXVhbCB0byBBQ1BJX0FOWV9CQVNFIG1lYW5zICd0b19pbnRlZ2VyIG9wZXJhdGlvbiBjYXNlJy4KKwkJICogV2UgbmVlZCB0byBkZXRlcm1pbmUgaWYgaXQgaXMgZGVjaW1hbCBvciBoZXhhZGVjaW1hbC4KKwkJICovCisJCWlmICgoKnN0cmluZyA9PSAnMCcpICYmIChBQ1BJX1RPTE9XRVIoKihzdHJpbmcgKyAxKSkgPT0gJ3gnKSkgeworCQkJc2lnbl9vZjB4ID0gMTsKKwkJCWJhc2UgPSAxNjsKKworCQkJLyogU2tpcCBvdmVyIHRoZSBsZWFkaW5nICcweCcgKi8KKwkJCXN0cmluZyArPSAyOworCQl9IGVsc2UgeworCQkJYmFzZSA9IDEwOworCQl9CisJfQorCisJLyogQW55IHN0cmluZyBsZWZ0PyBDaGVjayB0aGF0ICcweCcgaXMgbm90IGZvbGxvd2VkIGJ5IHdoaXRlIHNwYWNlLiAqLworCisJaWYgKCEoKnN0cmluZykgfHwgQUNQSV9JU19TUEFDRSgqc3RyaW5nKSB8fCAqc3RyaW5nID09ICdcdCcpIHsKKwkJaWYgKHRvX2ludGVnZXJfb3ApIHsKKwkJCWdvdG8gZXJyb3JfZXhpdDsKKwkJfSBlbHNlIHsKKwkJCWdvdG8gYWxsX2RvbmU7CisJCX0KKwl9CisKKwkvKgorCSAqIFBlcmZvcm0gYSAzMi1iaXQgb3IgNjQtYml0IGNvbnZlcnNpb24sIGRlcGVuZGluZyB1cG9uIHRoZSBjdXJyZW50CisJICogZXhlY3V0aW9uIG1vZGUgb2YgdGhlIGludGVycHJldGVyCisJICovCisJZGl2aWRlbmQgPSAobW9kZTMyKSA/IEFDUElfVUlOVDMyX01BWCA6IEFDUElfVUlOVDY0X01BWDsKKworCS8qIE1haW4gbG9vcDogY29udmVydCB0aGUgc3RyaW5nIHRvIGEgMzItIG9yIDY0LWJpdCBpbnRlZ2VyICovCisKKwl3aGlsZSAoKnN0cmluZykgeworCQlpZiAoQUNQSV9JU19ESUdJVCgqc3RyaW5nKSkgeworCisJCQkvKiBDb252ZXJ0IEFTQ0lJIDAtOSB0byBEZWNpbWFsIHZhbHVlICovCisKKwkJCXRoaXNfZGlnaXQgPSAoKHU4KSAqIHN0cmluZykgLSAnMCc7CisJCX0gZWxzZSBpZiAoYmFzZSA9PSAxMCkgeworCisJCQkvKiBEaWdpdCBpcyBvdXQgb2YgcmFuZ2U7IHBvc3NpYmxlIGluIHRvX2ludGVnZXIgY2FzZSBvbmx5ICovCisKKwkJCXRlcm0gPSAxOworCQl9IGVsc2UgeworCQkJdGhpc19kaWdpdCA9ICh1OCkgQUNQSV9UT1VQUEVSKCpzdHJpbmcpOworCQkJaWYgKEFDUElfSVNfWERJR0lUKChjaGFyKXRoaXNfZGlnaXQpKSB7CisKKwkJCQkvKiBDb252ZXJ0IEFTQ0lJIEhleCBjaGFyIHRvIHZhbHVlICovCisKKwkJCQl0aGlzX2RpZ2l0ID0gdGhpc19kaWdpdCAtICdBJyArIDEwOworCQkJfSBlbHNlIHsKKwkJCQl0ZXJtID0gMTsKKwkJCX0KKwkJfQorCisJCWlmICh0ZXJtKSB7CisJCQlpZiAodG9faW50ZWdlcl9vcCkgeworCQkJCWdvdG8gZXJyb3JfZXhpdDsKKwkJCX0gZWxzZSB7CisJCQkJYnJlYWs7CisJCQl9CisJCX0gZWxzZSBpZiAoKHZhbGlkX2RpZ2l0cyA9PSAwKSAmJiAodGhpc19kaWdpdCA9PSAwKQorCQkJICAgJiYgIXNpZ25fb2YweCkgeworCisJCQkvKiBTa2lwIHplcm9zICovCisJCQlzdHJpbmcrKzsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJdmFsaWRfZGlnaXRzKys7CisKKwkJaWYgKHNpZ25fb2YweCAmJiAoKHZhbGlkX2RpZ2l0cyA+IDE2KQorCQkJCSAgfHwgKCh2YWxpZF9kaWdpdHMgPiA4KSAmJiBtb2RlMzIpKSkgeworCQkJLyoKKwkJCSAqIFRoaXMgaXMgdG9faW50ZWdlciBvcGVyYXRpb24gY2FzZS4KKwkJCSAqIE5vIGFueSByZXN0cmljdGlvbnMgZm9yIHN0cmluZy10by1pbnRlZ2VyIGNvbnZlcnNpb24sCisJCQkgKiBzZWUgQUNQSSBzcGVjLgorCQkJICovCisJCQlnb3RvIGVycm9yX2V4aXQ7CisJCX0KKworCQkvKiBEaXZpZGUgdGhlIGRpZ2l0IGludG8gdGhlIGNvcnJlY3QgcG9zaXRpb24gKi8KKworCQkodm9pZCkKKwkJICAgIGFjcGlfdXRfc2hvcnRfZGl2aWRlKChkaXZpZGVuZCAtIChhY3BpX2ludGVnZXIpIHRoaXNfZGlnaXQpLAorCQkJCQkgYmFzZSwgJnF1b3RpZW50LCBOVUxMKTsKKworCQlpZiAocmV0dXJuX3ZhbHVlID4gcXVvdGllbnQpIHsKKwkJCWlmICh0b19pbnRlZ2VyX29wKSB7CisJCQkJZ290byBlcnJvcl9leGl0OworCQkJfSBlbHNlIHsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCXJldHVybl92YWx1ZSAqPSBiYXNlOworCQlyZXR1cm5fdmFsdWUgKz0gdGhpc19kaWdpdDsKKwkJc3RyaW5nKys7CisJfQorCisJLyogQWxsIGRvbmUsIG5vcm1hbCBleGl0ICovCisKKyAgICAgIGFsbF9kb25lOgorCisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FWEVDLCAiQ29udmVydGVkIHZhbHVlOiAlOC44WCU4LjhYXG4iLAorCQkJICBBQ1BJX0ZPUk1BVF9VSU5UNjQocmV0dXJuX3ZhbHVlKSkpOworCisJKnJldF9pbnRlZ2VyID0gcmV0dXJuX3ZhbHVlOworCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CisKKyAgICAgIGVycm9yX2V4aXQ6CisJLyogQmFzZSB3YXMgc2V0L3ZhbGlkYXRlZCBhYm92ZSAqLworCisJaWYgKGJhc2UgPT0gMTApIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9ERUNJTUFMX0NPTlNUQU5UKTsKKwl9IGVsc2UgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX0hFWF9DT05TVEFOVCk7CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X2NyZWF0ZV91cGRhdGVfc3RhdGVfYW5kX3B1c2gKKyAqCisgKiBQQVJBTUVURVJTOiAgT2JqZWN0ICAgICAgICAgIC0gT2JqZWN0IHRvIGJlIGFkZGVkIHRvIHRoZSBuZXcgc3RhdGUKKyAqICAgICAgICAgICAgICBBY3Rpb24gICAgICAgICAgLSBJbmNyZW1lbnQvRGVjcmVtZW50CisgKiAgICAgICAgICAgICAgc3RhdGVfbGlzdCAgICAgIC0gTGlzdCB0aGUgc3RhdGUgd2lsbCBiZSBhZGRlZCB0bworICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogQ3JlYXRlIGEgbmV3IHN0YXRlIGFuZCBwdXNoIGl0CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworYWNwaV9zdGF0dXMKK2FjcGlfdXRfY3JlYXRlX3VwZGF0ZV9zdGF0ZV9hbmRfcHVzaCh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmplY3QsCisJCQkJICAgICB1MTYgYWN0aW9uLAorCQkJCSAgICAgdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICoqc3RhdGVfbGlzdCkKK3sKKwl1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgKnN0YXRlOworCisJQUNQSV9GVU5DVElPTl9FTlRSWSgpOworCisJLyogSWdub3JlIG51bGwgb2JqZWN0czsgdGhlc2UgYXJlIGV4cGVjdGVkICovCisKKwlpZiAoIW9iamVjdCkgeworCQlyZXR1cm4gKEFFX09LKTsKKwl9CisKKwlzdGF0ZSA9IGFjcGlfdXRfY3JlYXRlX3VwZGF0ZV9zdGF0ZShvYmplY3QsIGFjdGlvbik7CisJaWYgKCFzdGF0ZSkgeworCQlyZXR1cm4gKEFFX05PX01FTU9SWSk7CisJfQorCisJYWNwaV91dF9wdXNoX2dlbmVyaWNfc3RhdGUoc3RhdGVfbGlzdCwgc3RhdGUpOworCXJldHVybiAoQUVfT0spOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X3dhbGtfcGFja2FnZV90cmVlCisgKgorICogUEFSQU1FVEVSUzogIHNvdXJjZV9vYmplY3QgICAgICAgLSBUaGUgcGFja2FnZSB0byB3YWxrCisgKiAgICAgICAgICAgICAgdGFyZ2V0X29iamVjdCAgICAgICAtIFRhcmdldCBvYmplY3QgKGlmIHBhY2thZ2UgaXMgYmVpbmcgY29waWVkKQorICogICAgICAgICAgICAgIHdhbGtfY2FsbGJhY2sgICAgICAgLSBDYWxsZWQgb25jZSBmb3IgZWFjaCBwYWNrYWdlIGVsZW1lbnQKKyAqICAgICAgICAgICAgICBDb250ZXh0ICAgICAgICAgICAgIC0gUGFzc2VkIHRvIHRoZSBjYWxsYmFjayBmdW5jdGlvbgorICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogV2FsayB0aHJvdWdoIGEgcGFja2FnZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2FjcGlfc3RhdHVzCithY3BpX3V0X3dhbGtfcGFja2FnZV90cmVlKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKiBzb3VyY2Vfb2JqZWN0LAorCQkJICB2b2lkICp0YXJnZXRfb2JqZWN0LAorCQkJICBhY3BpX3BrZ19jYWxsYmFjayB3YWxrX2NhbGxiYWNrLCB2b2lkICpjb250ZXh0KQoreworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOworCXVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSAqc3RhdGVfbGlzdCA9IE5VTEw7CisJdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICpzdGF0ZTsKKwl1MzIgdGhpc19pbmRleDsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICp0aGlzX3NvdXJjZV9vYmo7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKHV0X3dhbGtfcGFja2FnZV90cmVlKTsKKworCXN0YXRlID0gYWNwaV91dF9jcmVhdGVfcGtnX3N0YXRlKHNvdXJjZV9vYmplY3QsIHRhcmdldF9vYmplY3QsIDApOworCWlmICghc3RhdGUpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX01FTU9SWSk7CisJfQorCisJd2hpbGUgKHN0YXRlKSB7CisKKwkJLyogR2V0IG9uZSBlbGVtZW50IG9mIHRoZSBwYWNrYWdlICovCisKKwkJdGhpc19pbmRleCA9IHN0YXRlLT5wa2cuaW5kZXg7CisJCXRoaXNfc291cmNlX29iaiA9ICh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICopCisJCSAgICBzdGF0ZS0+cGtnLnNvdXJjZV9vYmplY3QtPnBhY2thZ2UuZWxlbWVudHNbdGhpc19pbmRleF07CisKKwkJLyoKKwkJICogQ2hlY2sgZm9yOgorCQkgKiAxKSBBbiB1bmluaXRpYWxpemVkIHBhY2thZ2UgZWxlbWVudC4gIEl0IGlzIGNvbXBsZXRlbHkKKwkJICogICAgbGVnYWwgdG8gZGVjbGFyZSBhIHBhY2thZ2UgYW5kIGxlYXZlIGl0IHVuaW5pdGlhbGl6ZWQKKwkJICogMikgTm90IGFuIGludGVybmFsIG9iamVjdCAtIGNhbiBiZSBhIG5hbWVzcGFjZSBub2RlIGluc3RlYWQKKwkJICogMykgQW55IHR5cGUgb3RoZXIgdGhhbiBhIHBhY2thZ2UuICBQYWNrYWdlcyBhcmUgaGFuZGxlZCBpbiBlbHNlCisJCSAqICAgIGNhc2UgYmVsb3cuCisJCSAqLworCQlpZiAoKCF0aGlzX3NvdXJjZV9vYmopIHx8CisJCSAgICAoQUNQSV9HRVRfREVTQ1JJUFRPUl9UWVBFKHRoaXNfc291cmNlX29iaikgIT0KKwkJICAgICBBQ1BJX0RFU0NfVFlQRV9PUEVSQU5EKQorCQkgICAgfHwgKEFDUElfR0VUX09CSkVDVF9UWVBFKHRoaXNfc291cmNlX29iaikgIT0KKwkJCUFDUElfVFlQRV9QQUNLQUdFKSkgeworCQkJc3RhdHVzID0KKwkJCSAgICB3YWxrX2NhbGxiYWNrKEFDUElfQ09QWV9UWVBFX1NJTVBMRSwKKwkJCQkJICB0aGlzX3NvdXJjZV9vYmosIHN0YXRlLCBjb250ZXh0KTsKKwkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworCQkJfQorCisJCQlzdGF0ZS0+cGtnLmluZGV4Kys7CisJCQl3aGlsZSAoc3RhdGUtPnBrZy5pbmRleCA+PQorCQkJICAgICAgIHN0YXRlLT5wa2cuc291cmNlX29iamVjdC0+cGFja2FnZS5jb3VudCkgeworCQkJCS8qCisJCQkJICogV2UndmUgaGFuZGxlZCBhbGwgb2YgdGhlIG9iamVjdHMgYXQgdGhpcyBsZXZlbCwgIFRoaXMgbWVhbnMKKwkJCQkgKiB0aGF0IHdlIGhhdmUganVzdCBjb21wbGV0ZWQgYSBwYWNrYWdlLiAgVGhhdCBwYWNrYWdlIG1heQorCQkJCSAqIGhhdmUgY29udGFpbmVkIG9uZSBvciBtb3JlIHBhY2thZ2VzIGl0c2VsZi4KKwkJCQkgKgorCQkJCSAqIERlbGV0ZSB0aGlzIHN0YXRlIGFuZCBwb3AgdGhlIHByZXZpb3VzIHN0YXRlIChwYWNrYWdlKS4KKwkJCQkgKi8KKwkJCQlhY3BpX3V0X2RlbGV0ZV9nZW5lcmljX3N0YXRlKHN0YXRlKTsKKwkJCQlzdGF0ZSA9IGFjcGlfdXRfcG9wX2dlbmVyaWNfc3RhdGUoJnN0YXRlX2xpc3QpOworCisJCQkJLyogRmluaXNoZWQgd2hlbiB0aGVyZSBhcmUgbm8gbW9yZSBzdGF0ZXMgKi8KKworCQkJCWlmICghc3RhdGUpIHsKKwkJCQkJLyoKKwkJCQkJICogV2UgaGF2ZSBoYW5kbGVkIGFsbCBvZiB0aGUgb2JqZWN0cyBpbiB0aGUgdG9wIGxldmVsCisJCQkJCSAqIHBhY2thZ2UganVzdCBhZGQgdGhlIGxlbmd0aCBvZiB0aGUgcGFja2FnZSBvYmplY3RzCisJCQkJCSAqIGFuZCBleGl0CisJCQkJCSAqLworCQkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOworCQkJCX0KKworCQkJCS8qCisJCQkJICogR28gYmFjayB1cCBhIGxldmVsIGFuZCBtb3ZlIHRoZSBpbmRleCBwYXN0IHRoZSBqdXN0CisJCQkJICogY29tcGxldGVkIHBhY2thZ2Ugb2JqZWN0LgorCQkJCSAqLworCQkJCXN0YXRlLT5wa2cuaW5kZXgrKzsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8qIFRoaXMgaXMgYSBzdWJvYmplY3Qgb2YgdHlwZSBwYWNrYWdlICovCisKKwkJCXN0YXR1cyA9CisJCQkgICAgd2Fsa19jYWxsYmFjayhBQ1BJX0NPUFlfVFlQRV9QQUNLQUdFLAorCQkJCQkgIHRoaXNfc291cmNlX29iaiwgc3RhdGUsIGNvbnRleHQpOworCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CisJCQl9CisKKwkJCS8qCisJCQkgKiBQdXNoIHRoZSBjdXJyZW50IHN0YXRlIGFuZCBjcmVhdGUgYSBuZXcgb25lCisJCQkgKiBUaGUgY2FsbGJhY2sgYWJvdmUgcmV0dXJuZWQgYSBuZXcgdGFyZ2V0IHBhY2thZ2Ugb2JqZWN0LgorCQkJICovCisJCQlhY3BpX3V0X3B1c2hfZ2VuZXJpY19zdGF0ZSgmc3RhdGVfbGlzdCwgc3RhdGUpOworCQkJc3RhdGUgPSBhY3BpX3V0X2NyZWF0ZV9wa2dfc3RhdGUodGhpc19zb3VyY2Vfb2JqLAorCQkJCQkJCSBzdGF0ZS0+cGtnLgorCQkJCQkJCSB0aGlzX3RhcmdldF9vYmosIDApOworCQkJaWYgKCFzdGF0ZSkgeworCisJCQkJLyogRnJlZSBhbnkgc3RhY2tlZCBVcGRhdGUgU3RhdGUgb2JqZWN0cyAqLworCisJCQkJd2hpbGUgKHN0YXRlX2xpc3QpIHsKKwkJCQkJc3RhdGUgPQorCQkJCQkgICAgYWNwaV91dF9wb3BfZ2VuZXJpY19zdGF0ZQorCQkJCQkgICAgKCZzdGF0ZV9saXN0KTsKKwkJCQkJYWNwaV91dF9kZWxldGVfZ2VuZXJpY19zdGF0ZShzdGF0ZSk7CisJCQkJfQorCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT19NRU1PUlkpOworCQkJfQorCQl9CisJfQorCisJLyogV2Ugc2hvdWxkIG5ldmVyIGdldCBoZXJlICovCisKKwlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX0lOVEVSTkFMKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9lcnJvciwgYWNwaV9leGNlcHRpb24sIGFjcGlfd2FybmluZywgYWNwaV9pbmZvCisgKgorICogUEFSQU1FVEVSUzogIG1vZHVsZV9uYW1lICAgICAgICAgLSBDYWxsZXIncyBtb2R1bGUgbmFtZSAoZm9yIGVycm9yIG91dHB1dCkKKyAqICAgICAgICAgICAgICBsaW5lX251bWJlciAgICAgICAgIC0gQ2FsbGVyJ3MgbGluZSBudW1iZXIgKGZvciBlcnJvciBvdXRwdXQpCisgKiAgICAgICAgICAgICAgRm9ybWF0ICAgICAgICAgICAgICAtIFByaW50ZiBmb3JtYXQgc3RyaW5nICsgYWRkaXRpb25hbCBhcmdzCisgKgorICogUkVUVVJOOiAgICAgIE5vbmUKKyAqCisgKiBERVNDUklQVElPTjogUHJpbnQgbWVzc2FnZSB3aXRoIG1vZHVsZS9saW5lL3ZlcnNpb24gaW5mbworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgQUNQSV9JTlRFUk5BTF9WQVJfWEZBQ0UKK2FjcGlfZXJyb3IoY29uc3QgY2hhciAqbW9kdWxlX25hbWUsIHUzMiBsaW5lX251bWJlciwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCit7CisJdmFfbGlzdCBhcmdzOworCisJYWNwaV9vc19wcmludGYoIkFDUEkgRXJyb3IgKCVzLSUwNGQpOiAiLCBtb2R1bGVfbmFtZSwgbGluZV9udW1iZXIpOworCisJdmFfc3RhcnQoYXJncywgZm9ybWF0KTsKKwlhY3BpX29zX3ZwcmludGYoZm9ybWF0LCBhcmdzKTsKKwlhY3BpX29zX3ByaW50ZigiIFslWF1cbiIsIEFDUElfQ0FfVkVSU0lPTik7CisJdmFfZW5kKGFyZ3MpOworfQorCit2b2lkIEFDUElfSU5URVJOQUxfVkFSX1hGQUNFCithY3BpX2V4Y2VwdGlvbihjb25zdCBjaGFyICptb2R1bGVfbmFtZSwKKwkgICAgICAgdTMyIGxpbmVfbnVtYmVyLCBhY3BpX3N0YXR1cyBzdGF0dXMsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQoreworCXZhX2xpc3QgYXJnczsKKworCWFjcGlfb3NfcHJpbnRmKCJBQ1BJIEV4Y2VwdGlvbiAoJXMtJTA0ZCk6ICVzLCAiLCBtb2R1bGVfbmFtZSwKKwkJICAgICAgIGxpbmVfbnVtYmVyLCBhY3BpX2Zvcm1hdF9leGNlcHRpb24oc3RhdHVzKSk7CisKKwl2YV9zdGFydChhcmdzLCBmb3JtYXQpOworCWFjcGlfb3NfdnByaW50Zihmb3JtYXQsIGFyZ3MpOworCWFjcGlfb3NfcHJpbnRmKCIgWyVYXVxuIiwgQUNQSV9DQV9WRVJTSU9OKTsKKwl2YV9lbmQoYXJncyk7Cit9CisKK3ZvaWQgQUNQSV9JTlRFUk5BTF9WQVJfWEZBQ0UKK2FjcGlfd2FybmluZyhjb25zdCBjaGFyICptb2R1bGVfbmFtZSwgdTMyIGxpbmVfbnVtYmVyLCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKK3sKKwl2YV9saXN0IGFyZ3M7CisKKwlhY3BpX29zX3ByaW50ZigiQUNQSSBXYXJuaW5nICglcy0lMDRkKTogIiwgbW9kdWxlX25hbWUsIGxpbmVfbnVtYmVyKTsKKworCXZhX3N0YXJ0KGFyZ3MsIGZvcm1hdCk7CisJYWNwaV9vc192cHJpbnRmKGZvcm1hdCwgYXJncyk7CisJYWNwaV9vc19wcmludGYoIiBbJVhdXG4iLCBBQ1BJX0NBX1ZFUlNJT04pOworCXZhX2VuZChhcmdzKTsKK30KKwordm9pZCBBQ1BJX0lOVEVSTkFMX1ZBUl9YRkFDRQorYWNwaV9pbmZvKGNvbnN0IGNoYXIgKm1vZHVsZV9uYW1lLCB1MzIgbGluZV9udW1iZXIsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQoreworCXZhX2xpc3QgYXJnczsKKworCS8qCisJICogUmVtb3ZlZCBtb2R1bGVfbmFtZSwgbGluZV9udW1iZXIsIGFuZCBhY3BpY2EgdmVyc2lvbiwgbm90IG5lZWRlZAorCSAqIGZvciBpbmZvIG91dHB1dAorCSAqLworCWFjcGlfb3NfcHJpbnRmKCJBQ1BJOiAiKTsKKworCXZhX3N0YXJ0KGFyZ3MsIGZvcm1hdCk7CisJYWNwaV9vc192cHJpbnRmKGZvcm1hdCwgYXJncyk7CisJYWNwaV9vc19wcmludGYoIlxuIik7CisJdmFfZW5kKGFyZ3MpOworfQorCitBQ1BJX0VYUE9SVF9TWU1CT0woYWNwaV9lcnJvcikKK0FDUElfRVhQT1JUX1NZTUJPTChhY3BpX2V4Y2VwdGlvbikKK0FDUElfRVhQT1JUX1NZTUJPTChhY3BpX3dhcm5pbmcpCitBQ1BJX0VYUE9SVF9TWU1CT0woYWNwaV9pbmZvKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS91dG11dGV4LmMgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL3V0bXV0ZXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNGViNTJjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS91dG11dGV4LmMKQEAgLTAsMCArMSwzNDIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogTW9kdWxlIE5hbWU6IHV0bXV0ZXggLSBsb2NhbCBtdXRleCBzdXBwb3J0CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDgsIEludGVsIENvcnAuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCisgKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSBhdCBtaW5pbXVtIGEgZGlzY2xhaW1lcgorICogICAgc3Vic3RhbnRpYWxseSBzaW1pbGFyIHRvIHRoZSAiTk8gV0FSUkFOVFkiIGRpc2NsYWltZXIgYmVsb3cKKyAqICAgICgiRGlzY2xhaW1lciIpIGFuZCBhbnkgcmVkaXN0cmlidXRpb24gbXVzdCBiZSBjb25kaXRpb25lZCB1cG9uCisgKiAgICBpbmNsdWRpbmcgYSBzdWJzdGFudGlhbGx5IHNpbWlsYXIgRGlzY2xhaW1lciByZXF1aXJlbWVudCBmb3IgZnVydGhlcgorICogICAgYmluYXJ5IHJlZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzCisgKiAgICBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIE5PIFdBUlJBTlRZCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORworICogSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCisgKi8KKworI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgorI2luY2x1ZGUgImFjY29tbW9uLmgiCisKKyNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX1VUSUxJVElFUworQUNQSV9NT0RVTEVfTkFNRSgidXRtdXRleCIpCisKKy8qIExvY2FsIHByb3RvdHlwZXMgKi8KK3N0YXRpYyBhY3BpX3N0YXR1cyBhY3BpX3V0X2NyZWF0ZV9tdXRleChhY3BpX211dGV4X2hhbmRsZSBtdXRleF9pZCk7CisKK3N0YXRpYyBhY3BpX3N0YXR1cyBhY3BpX3V0X2RlbGV0ZV9tdXRleChhY3BpX211dGV4X2hhbmRsZSBtdXRleF9pZCk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfdXRfbXV0ZXhfaW5pdGlhbGl6ZQorICoKKyAqIFBBUkFNRVRFUlM6ICBOb25lLgorICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogQ3JlYXRlIHRoZSBzeXN0ZW0gbXV0ZXggb2JqZWN0cy4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCithY3BpX3N0YXR1cyBhY3BpX3V0X211dGV4X2luaXRpYWxpemUodm9pZCkKK3sKKwl1MzIgaTsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKHV0X211dGV4X2luaXRpYWxpemUpOworCisJLyoKKwkgKiBDcmVhdGUgZWFjaCBvZiB0aGUgcHJlZGVmaW5lZCBtdXRleCBvYmplY3RzCisJICovCisJZm9yIChpID0gMDsgaSA8IEFDUElfTlVNX01VVEVYOyBpKyspIHsKKwkJc3RhdHVzID0gYWNwaV91dF9jcmVhdGVfbXV0ZXgoaSk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CisJCX0KKwl9CisKKwkvKiBDcmVhdGUgdGhlIHNwaW5sb2NrcyBmb3IgdXNlIGF0IGludGVycnVwdCBsZXZlbCAqLworCisJc3Bpbl9sb2NrX2luaXQoYWNwaV9nYmxfZ3BlX2xvY2spOworCXNwaW5fbG9ja19pbml0KGFjcGlfZ2JsX2hhcmR3YXJlX2xvY2spOworCisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfdXRfbXV0ZXhfdGVybWluYXRlCisgKgorICogUEFSQU1FVEVSUzogIE5vbmUuCisgKgorICogUkVUVVJOOiAgICAgIE5vbmUuCisgKgorICogREVTQ1JJUFRJT046IERlbGV0ZSBhbGwgb2YgdGhlIHN5c3RlbSBtdXRleCBvYmplY3RzLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgYWNwaV91dF9tdXRleF90ZXJtaW5hdGUodm9pZCkKK3sKKwl1MzIgaTsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0UodXRfbXV0ZXhfdGVybWluYXRlKTsKKworCS8qCisJICogRGVsZXRlIGVhY2ggcHJlZGVmaW5lZCBtdXRleCBvYmplY3QKKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgQUNQSV9OVU1fTVVURVg7IGkrKykgeworCQkodm9pZClhY3BpX3V0X2RlbGV0ZV9tdXRleChpKTsKKwl9CisKKwkvKiBEZWxldGUgdGhlIHNwaW5sb2NrcyAqLworCisJYWNwaV9vc19kZWxldGVfbG9jayhhY3BpX2dibF9ncGVfbG9jayk7CisJYWNwaV9vc19kZWxldGVfbG9jayhhY3BpX2dibF9oYXJkd2FyZV9sb2NrKTsKKwlyZXR1cm5fVk9JRDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV91dF9jcmVhdGVfbXV0ZXgKKyAqCisgKiBQQVJBTUVURVJTOiAgbXV0ZXhfaUQgICAgICAgIC0gSUQgb2YgdGhlIG11dGV4IHRvIGJlIGNyZWF0ZWQKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IENyZWF0ZSBhIG11dGV4IG9iamVjdC4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgYWNwaV9zdGF0dXMgYWNwaV91dF9jcmVhdGVfbXV0ZXgoYWNwaV9tdXRleF9oYW5kbGUgbXV0ZXhfaWQpCit7CisJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1UzMih1dF9jcmVhdGVfbXV0ZXgsIG11dGV4X2lkKTsKKworCWlmIChtdXRleF9pZCA+IEFDUElfTUFYX01VVEVYKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfUEFSQU1FVEVSKTsKKwl9CisKKwlpZiAoIWFjcGlfZ2JsX211dGV4X2luZm9bbXV0ZXhfaWRdLm11dGV4KSB7CisJCXN0YXR1cyA9CisJCSAgICBhY3BpX29zX2NyZWF0ZV9tdXRleCgmYWNwaV9nYmxfbXV0ZXhfaW5mb1ttdXRleF9pZF0ubXV0ZXgpOworCQlhY3BpX2dibF9tdXRleF9pbmZvW211dGV4X2lkXS50aHJlYWRfaWQgPQorCQkgICAgQUNQSV9NVVRFWF9OT1RfQUNRVUlSRUQ7CisJCWFjcGlfZ2JsX211dGV4X2luZm9bbXV0ZXhfaWRdLnVzZV9jb3VudCA9IDA7CisJfQorCisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfdXRfZGVsZXRlX211dGV4CisgKgorICogUEFSQU1FVEVSUzogIG11dGV4X2lEICAgICAgICAtIElEIG9mIHRoZSBtdXRleCB0byBiZSBkZWxldGVkCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBEZWxldGUgYSBtdXRleCBvYmplY3QuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGFjcGlfc3RhdHVzIGFjcGlfdXRfZGVsZXRlX211dGV4KGFjcGlfbXV0ZXhfaGFuZGxlIG11dGV4X2lkKQoreworCisJQUNQSV9GVU5DVElPTl9UUkFDRV9VMzIodXRfZGVsZXRlX211dGV4LCBtdXRleF9pZCk7CisKKwlpZiAobXV0ZXhfaWQgPiBBQ1BJX01BWF9NVVRFWCkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX1BBUkFNRVRFUik7CisJfQorCisJYWNwaV9vc19kZWxldGVfbXV0ZXgoYWNwaV9nYmxfbXV0ZXhfaW5mb1ttdXRleF9pZF0ubXV0ZXgpOworCisJYWNwaV9nYmxfbXV0ZXhfaW5mb1ttdXRleF9pZF0ubXV0ZXggPSBOVUxMOworCWFjcGlfZ2JsX211dGV4X2luZm9bbXV0ZXhfaWRdLnRocmVhZF9pZCA9IEFDUElfTVVURVhfTk9UX0FDUVVJUkVEOworCisJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV91dF9hY3F1aXJlX211dGV4CisgKgorICogUEFSQU1FVEVSUzogIG11dGV4X2lEICAgICAgICAtIElEIG9mIHRoZSBtdXRleCB0byBiZSBhY3F1aXJlZAorICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogQWNxdWlyZSBhIG11dGV4IG9iamVjdC4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCithY3BpX3N0YXR1cyBhY3BpX3V0X2FjcXVpcmVfbXV0ZXgoYWNwaV9tdXRleF9oYW5kbGUgbXV0ZXhfaWQpCit7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCWFjcGlfdGhyZWFkX2lkIHRoaXNfdGhyZWFkX2lkOworCisJQUNQSV9GVU5DVElPTl9OQU1FKHV0X2FjcXVpcmVfbXV0ZXgpOworCisJaWYgKG11dGV4X2lkID4gQUNQSV9NQVhfTVVURVgpIHsKKwkJcmV0dXJuIChBRV9CQURfUEFSQU1FVEVSKTsKKwl9CisKKwl0aGlzX3RocmVhZF9pZCA9IGFjcGlfb3NfZ2V0X3RocmVhZF9pZCgpOworCisjaWZkZWYgQUNQSV9NVVRFWF9ERUJVRworCXsKKwkJdTMyIGk7CisJCS8qCisJCSAqIE11dGV4IGRlYnVnIGNvZGUsIGZvciBpbnRlcm5hbCBkZWJ1Z2dpbmcgb25seS4KKwkJICoKKwkJICogRGVhZGxvY2sgcHJldmVudGlvbi4gIENoZWNrIGlmIHRoaXMgdGhyZWFkIG93bnMgYW55IG11dGV4ZXMgb2YgdmFsdWUKKwkJICogZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoaXMgb25lLiAgSWYgc28sIHRoZSB0aHJlYWQgaGFzIHZpb2xhdGVkCisJCSAqIHRoZSBtdXRleCBvcmRlcmluZyBydWxlLiAgVGhpcyBpbmRpY2F0ZXMgYSBjb2RpbmcgZXJyb3Igc29tZXdoZXJlIGluCisJCSAqIHRoZSBBQ1BJIHN1YnN5c3RlbSBjb2RlLgorCQkgKi8KKwkJZm9yIChpID0gbXV0ZXhfaWQ7IGkgPCBBQ1BJX05VTV9NVVRFWDsgaSsrKSB7CisJCQlpZiAoYWNwaV9nYmxfbXV0ZXhfaW5mb1tpXS50aHJlYWRfaWQgPT0gdGhpc190aHJlYWRfaWQpIHsKKwkJCQlpZiAoaSA9PSBtdXRleF9pZCkgeworCQkJCQlBQ1BJX0VSUk9SKChBRV9JTkZPLAorCQkJCQkJICAgICJNdXRleCBbJXNdIGFscmVhZHkgYWNxdWlyZWQgYnkgdGhpcyB0aHJlYWQgWyVYXSIsCisJCQkJCQkgICAgYWNwaV91dF9nZXRfbXV0ZXhfbmFtZQorCQkJCQkJICAgIChtdXRleF9pZCksCisJCQkJCQkgICAgdGhpc190aHJlYWRfaWQpKTsKKworCQkJCQlyZXR1cm4gKEFFX0FMUkVBRFlfQUNRVUlSRUQpOworCQkJCX0KKworCQkJCUFDUElfRVJST1IoKEFFX0lORk8sCisJCQkJCSAgICAiSW52YWxpZCBhY3F1aXJlIG9yZGVyOiBUaHJlYWQgJVggb3ducyBbJXNdLCB3YW50cyBbJXNdIiwKKwkJCQkJICAgIHRoaXNfdGhyZWFkX2lkLAorCQkJCQkgICAgYWNwaV91dF9nZXRfbXV0ZXhfbmFtZShpKSwKKwkJCQkJICAgIGFjcGlfdXRfZ2V0X211dGV4X25hbWUobXV0ZXhfaWQpKSk7CisKKwkJCQlyZXR1cm4gKEFFX0FDUVVJUkVfREVBRExPQ0spOworCQkJfQorCQl9CisJfQorI2VuZGlmCisKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX01VVEVYLAorCQkJICAiVGhyZWFkICVsWCBhdHRlbXB0aW5nIHRvIGFjcXVpcmUgTXV0ZXggWyVzXVxuIiwKKwkJCSAgKHVuc2lnbmVkIGxvbmcpdGhpc190aHJlYWRfaWQsCisJCQkgIGFjcGlfdXRfZ2V0X211dGV4X25hbWUobXV0ZXhfaWQpKSk7CisKKwlzdGF0dXMgPSBhY3BpX29zX2FjcXVpcmVfbXV0ZXgoYWNwaV9nYmxfbXV0ZXhfaW5mb1ttdXRleF9pZF0ubXV0ZXgsCisJCQkJICAgICAgIEFDUElfV0FJVF9GT1JFVkVSKTsKKwlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpIHsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9NVVRFWCwKKwkJCQkgICJUaHJlYWQgJWxYIGFjcXVpcmVkIE11dGV4IFslc11cbiIsCisJCQkJICAodW5zaWduZWQgbG9uZyl0aGlzX3RocmVhZF9pZCwKKwkJCQkgIGFjcGlfdXRfZ2V0X211dGV4X25hbWUobXV0ZXhfaWQpKSk7CisKKwkJYWNwaV9nYmxfbXV0ZXhfaW5mb1ttdXRleF9pZF0udXNlX2NvdW50Kys7CisJCWFjcGlfZ2JsX211dGV4X2luZm9bbXV0ZXhfaWRdLnRocmVhZF9pZCA9IHRoaXNfdGhyZWFkX2lkOworCX0gZWxzZSB7CisJCUFDUElfRVhDRVBUSU9OKChBRV9JTkZPLCBzdGF0dXMsCisJCQkJIlRocmVhZCAlbFggY291bGQgbm90IGFjcXVpcmUgTXV0ZXggWyVYXSIsCisJCQkJKHVuc2lnbmVkIGxvbmcpdGhpc190aHJlYWRfaWQsIG11dGV4X2lkKSk7CisJfQorCisJcmV0dXJuIChzdGF0dXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X3JlbGVhc2VfbXV0ZXgKKyAqCisgKiBQQVJBTUVURVJTOiAgbXV0ZXhfaUQgICAgICAgIC0gSUQgb2YgdGhlIG11dGV4IHRvIGJlIHJlbGVhc2VkCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBSZWxlYXNlIGEgbXV0ZXggb2JqZWN0LgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2FjcGlfc3RhdHVzIGFjcGlfdXRfcmVsZWFzZV9tdXRleChhY3BpX211dGV4X2hhbmRsZSBtdXRleF9pZCkKK3sKKwlhY3BpX3RocmVhZF9pZCB0aGlzX3RocmVhZF9pZDsKKworCUFDUElfRlVOQ1RJT05fTkFNRSh1dF9yZWxlYXNlX211dGV4KTsKKworCXRoaXNfdGhyZWFkX2lkID0gYWNwaV9vc19nZXRfdGhyZWFkX2lkKCk7CisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9NVVRFWCwKKwkJCSAgIlRocmVhZCAlbFggcmVsZWFzaW5nIE11dGV4IFslc11cbiIsCisJCQkgICh1bnNpZ25lZCBsb25nKXRoaXNfdGhyZWFkX2lkLAorCQkJICBhY3BpX3V0X2dldF9tdXRleF9uYW1lKG11dGV4X2lkKSkpOworCisJaWYgKG11dGV4X2lkID4gQUNQSV9NQVhfTVVURVgpIHsKKwkJcmV0dXJuIChBRV9CQURfUEFSQU1FVEVSKTsKKwl9CisKKwkvKgorCSAqIE11dGV4IG11c3QgYmUgYWNxdWlyZWQgaW4gb3JkZXIgdG8gcmVsZWFzZSBpdCEKKwkgKi8KKwlpZiAoYWNwaV9nYmxfbXV0ZXhfaW5mb1ttdXRleF9pZF0udGhyZWFkX2lkID09IEFDUElfTVVURVhfTk9UX0FDUVVJUkVEKSB7CisJCUFDUElfRVJST1IoKEFFX0lORk8sCisJCQkgICAgIk11dGV4IFslWF0gaXMgbm90IGFjcXVpcmVkLCBjYW5ub3QgcmVsZWFzZSIsCisJCQkgICAgbXV0ZXhfaWQpKTsKKworCQlyZXR1cm4gKEFFX05PVF9BQ1FVSVJFRCk7CisJfQorI2lmZGVmIEFDUElfTVVURVhfREVCVUcKKwl7CisJCXUzMiBpOworCQkvKgorCQkgKiBNdXRleCBkZWJ1ZyBjb2RlLCBmb3IgaW50ZXJuYWwgZGVidWdnaW5nIG9ubHkuCisJCSAqCisJCSAqIERlYWRsb2NrIHByZXZlbnRpb24uICBDaGVjayBpZiB0aGlzIHRocmVhZCBvd25zIGFueSBtdXRleGVzIG9mIHZhbHVlCisJCSAqIGdyZWF0ZXIgdGhhbiB0aGlzIG9uZS4gIElmIHNvLCB0aGUgdGhyZWFkIGhhcyB2aW9sYXRlZCB0aGUgbXV0ZXgKKwkJICogb3JkZXJpbmcgcnVsZS4gIFRoaXMgaW5kaWNhdGVzIGEgY29kaW5nIGVycm9yIHNvbWV3aGVyZSBpbgorCQkgKiB0aGUgQUNQSSBzdWJzeXN0ZW0gY29kZS4KKwkJICovCisJCWZvciAoaSA9IG11dGV4X2lkOyBpIDwgQUNQSV9OVU1fTVVURVg7IGkrKykgeworCQkJaWYgKGFjcGlfZ2JsX211dGV4X2luZm9baV0udGhyZWFkX2lkID09IHRoaXNfdGhyZWFkX2lkKSB7CisJCQkJaWYgKGkgPT0gbXV0ZXhfaWQpIHsKKwkJCQkJY29udGludWU7CisJCQkJfQorCisJCQkJQUNQSV9FUlJPUigoQUVfSU5GTywKKwkJCQkJICAgICJJbnZhbGlkIHJlbGVhc2Ugb3JkZXI6IG93bnMgWyVzXSwgcmVsZWFzaW5nIFslc10iLAorCQkJCQkgICAgYWNwaV91dF9nZXRfbXV0ZXhfbmFtZShpKSwKKwkJCQkJICAgIGFjcGlfdXRfZ2V0X211dGV4X25hbWUobXV0ZXhfaWQpKSk7CisKKwkJCQlyZXR1cm4gKEFFX1JFTEVBU0VfREVBRExPQ0spOworCQkJfQorCQl9CisJfQorI2VuZGlmCisKKwkvKiBNYXJrIHVubG9ja2VkIEZJUlNUICovCisKKwlhY3BpX2dibF9tdXRleF9pbmZvW211dGV4X2lkXS50aHJlYWRfaWQgPSBBQ1BJX01VVEVYX05PVF9BQ1FVSVJFRDsKKworCWFjcGlfb3NfcmVsZWFzZV9tdXRleChhY3BpX2dibF9tdXRleF9pbmZvW211dGV4X2lkXS5tdXRleCk7CisJcmV0dXJuIChBRV9PSyk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL3V0b2JqZWN0LmMgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL3V0b2JqZWN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQ1ZWE3NQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvdXRvYmplY3QuYwpAQCAtMCwwICsxLDY3NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIE1vZHVsZSBOYW1lOiB1dG9iamVjdCAtIEFDUEkgb2JqZWN0IGNyZWF0ZS9kZWxldGUvc2l6ZS9jYWNoZSByb3V0aW5lcworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDgsIEludGVsIENvcnAuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCisgKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSBhdCBtaW5pbXVtIGEgZGlzY2xhaW1lcgorICogICAgc3Vic3RhbnRpYWxseSBzaW1pbGFyIHRvIHRoZSAiTk8gV0FSUkFOVFkiIGRpc2NsYWltZXIgYmVsb3cKKyAqICAgICgiRGlzY2xhaW1lciIpIGFuZCBhbnkgcmVkaXN0cmlidXRpb24gbXVzdCBiZSBjb25kaXRpb25lZCB1cG9uCisgKiAgICBpbmNsdWRpbmcgYSBzdWJzdGFudGlhbGx5IHNpbWlsYXIgRGlzY2xhaW1lciByZXF1aXJlbWVudCBmb3IgZnVydGhlcgorICogICAgYmluYXJ5IHJlZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzCisgKiAgICBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIE5PIFdBUlJBTlRZCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORworICogSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCisgKi8KKworI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgorI2luY2x1ZGUgImFjY29tbW9uLmgiCisjaW5jbHVkZSAiYWNuYW1lc3AuaCIKKworI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfVVRJTElUSUVTCitBQ1BJX01PRFVMRV9OQU1FKCJ1dG9iamVjdCIpCisKKy8qIExvY2FsIHByb3RvdHlwZXMgKi8KK3N0YXRpYyBhY3BpX3N0YXR1cworYWNwaV91dF9nZXRfc2ltcGxlX29iamVjdF9zaXplKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9iaiwKKwkJCSAgICAgICBhY3BpX3NpemUgKiBvYmpfbGVuZ3RoKTsKKworc3RhdGljIGFjcGlfc3RhdHVzCithY3BpX3V0X2dldF9wYWNrYWdlX29iamVjdF9zaXplKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9iaiwKKwkJCQlhY3BpX3NpemUgKiBvYmpfbGVuZ3RoKTsKKworc3RhdGljIGFjcGlfc3RhdHVzCithY3BpX3V0X2dldF9lbGVtZW50X2xlbmd0aCh1OCBvYmplY3RfdHlwZSwKKwkJCSAgIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnNvdXJjZV9vYmplY3QsCisJCQkgICB1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgKnN0YXRlLCB2b2lkICpjb250ZXh0KTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV91dF9jcmVhdGVfaW50ZXJuYWxfb2JqZWN0X2RiZworICoKKyAqIFBBUkFNRVRFUlM6ICBtb2R1bGVfbmFtZSAgICAgICAgIC0gU291cmNlIGZpbGUgbmFtZSBvZiBjYWxsZXIKKyAqICAgICAgICAgICAgICBsaW5lX251bWJlciAgICAgICAgIC0gTGluZSBudW1iZXIgb2YgY2FsbGVyCisgKiAgICAgICAgICAgICAgY29tcG9uZW50X2lkICAgICAgICAtIENvbXBvbmVudCB0eXBlIG9mIGNhbGxlcgorICogICAgICAgICAgICAgIFR5cGUgICAgICAgICAgICAgICAgLSBBQ1BJIFR5cGUgb2YgdGhlIG5ldyBvYmplY3QKKyAqCisgKiBSRVRVUk46ICAgICAgQSBuZXcgaW50ZXJuYWwgb2JqZWN0LCBudWxsIG9uIGZhaWx1cmUKKyAqCisgKiBERVNDUklQVElPTjogQ3JlYXRlIGFuZCBpbml0aWFsaXplIGEgbmV3IGludGVybmFsIG9iamVjdC4KKyAqCisgKiBOT1RFOiAgICAgICAgV2UgYWx3YXlzIGFsbG9jYXRlIHRoZSB3b3JzdC1jYXNlIG9iamVjdCBkZXNjcmlwdG9yIGJlY2F1c2UKKyAqICAgICAgICAgICAgICB0aGVzZSBvYmplY3RzIGFyZSBjYWNoZWQsIGFuZCB3ZSB3YW50IHRoZW0gdG8gYmUKKyAqICAgICAgICAgICAgICBvbmUtc2l6ZS1zYXRpc2lmaWVzLWFueS1yZXF1ZXN0LiAgVGhpcyBpbiBpdHNlbGYgbWF5IG5vdCBiZQorICogICAgICAgICAgICAgIHRoZSBtb3N0IG1lbW9yeSBlZmZpY2llbnQsIGJ1dCB0aGUgZWZmaWNpZW5jeSBvZiB0aGUgb2JqZWN0CisgKiAgICAgICAgICAgICAgY2FjaGUgc2hvdWxkIG1vcmUgdGhhbiBtYWtlIHVwIGZvciB0aGlzIQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3VuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKmFjcGlfdXRfY3JlYXRlX2ludGVybmFsX29iamVjdF9kYmcoY29uc3QgY2hhcgorCQkJCQkJCSAgICAgICptb2R1bGVfbmFtZSwKKwkJCQkJCQkgICAgICB1MzIgbGluZV9udW1iZXIsCisJCQkJCQkJICAgICAgdTMyIGNvbXBvbmVudF9pZCwKKwkJCQkJCQkgICAgICBhY3BpX29iamVjdF90eXBlCisJCQkJCQkJICAgICAgdHlwZSkKK3sKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmplY3Q7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqc2Vjb25kX29iamVjdDsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0VfU1RSKHV0X2NyZWF0ZV9pbnRlcm5hbF9vYmplY3RfZGJnLAorCQkJCWFjcGlfdXRfZ2V0X3R5cGVfbmFtZSh0eXBlKSk7CisKKwkvKiBBbGxvY2F0ZSB0aGUgcmF3IG9iamVjdCBkZXNjcmlwdG9yICovCisKKwlvYmplY3QgPQorCSAgICBhY3BpX3V0X2FsbG9jYXRlX29iamVjdF9kZXNjX2RiZyhtb2R1bGVfbmFtZSwgbGluZV9udW1iZXIsCisJCQkJCSAgICAgY29tcG9uZW50X2lkKTsKKwlpZiAoIW9iamVjdCkgeworCQlyZXR1cm5fUFRSKE5VTEwpOworCX0KKworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgQUNQSV9UWVBFX1JFR0lPTjoKKwljYXNlIEFDUElfVFlQRV9CVUZGRVJfRklFTEQ6CisJY2FzZSBBQ1BJX1RZUEVfTE9DQUxfQkFOS19GSUVMRDoKKworCQkvKiBUaGVzZSB0eXBlcyByZXF1aXJlIGEgc2Vjb25kYXJ5IG9iamVjdCAqLworCisJCXNlY29uZF9vYmplY3QgPSBhY3BpX3V0X2FsbG9jYXRlX29iamVjdF9kZXNjX2RiZyhtb2R1bGVfbmFtZSwKKwkJCQkJCQkJIGxpbmVfbnVtYmVyLAorCQkJCQkJCQkgY29tcG9uZW50X2lkKTsKKwkJaWYgKCFzZWNvbmRfb2JqZWN0KSB7CisJCQlhY3BpX3V0X2RlbGV0ZV9vYmplY3RfZGVzYyhvYmplY3QpOworCQkJcmV0dXJuX1BUUihOVUxMKTsKKwkJfQorCisJCXNlY29uZF9vYmplY3QtPmNvbW1vbi50eXBlID0gQUNQSV9UWVBFX0xPQ0FMX0VYVFJBOworCQlzZWNvbmRfb2JqZWN0LT5jb21tb24ucmVmZXJlbmNlX2NvdW50ID0gMTsKKworCQkvKiBMaW5rIHRoZSBzZWNvbmQgb2JqZWN0IHRvIHRoZSBmaXJzdCAqLworCisJCW9iamVjdC0+Y29tbW9uLm5leHRfb2JqZWN0ID0gc2Vjb25kX29iamVjdDsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQkvKiBBbGwgb3RoZXJzIGhhdmUgbm8gc2Vjb25kYXJ5IG9iamVjdCAqLworCQlicmVhazsKKwl9CisKKwkvKiBTYXZlIHRoZSBvYmplY3QgdHlwZSBpbiB0aGUgb2JqZWN0IGRlc2NyaXB0b3IgKi8KKworCW9iamVjdC0+Y29tbW9uLnR5cGUgPSAodTgpIHR5cGU7CisKKwkvKiBJbml0IHRoZSByZWZlcmVuY2UgY291bnQgKi8KKworCW9iamVjdC0+Y29tbW9uLnJlZmVyZW5jZV9jb3VudCA9IDE7CisKKwkvKiBBbnkgcGVyLXR5cGUgaW5pdGlhbGl6YXRpb24gc2hvdWxkIGdvIGhlcmUgKi8KKworCXJldHVybl9QVFIob2JqZWN0KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV91dF9jcmVhdGVfcGFja2FnZV9vYmplY3QKKyAqCisgKiBQQVJBTUVURVJTOiAgQ291bnQgICAgICAgICAgICAgICAtIE51bWJlciBvZiBwYWNrYWdlIGVsZW1lbnRzCisgKgorICogUkVUVVJOOiAgICAgIFBvaW50ZXIgdG8gYSBuZXcgUGFja2FnZSBvYmplY3QsIG51bGwgb24gZmFpbHVyZQorICoKKyAqIERFU0NSSVBUSU9OOiBDcmVhdGUgYSBmdWxseSBpbml0aWFsaXplZCBwYWNrYWdlIG9iamVjdAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3VuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKmFjcGlfdXRfY3JlYXRlX3BhY2thZ2Vfb2JqZWN0KHUzMiBjb3VudCkKK3sKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpwYWNrYWdlX2Rlc2M7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKnBhY2thZ2VfZWxlbWVudHM7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1UzMih1dF9jcmVhdGVfcGFja2FnZV9vYmplY3QsIGNvdW50KTsKKworCS8qIENyZWF0ZSBhIG5ldyBQYWNrYWdlIG9iamVjdCAqLworCisJcGFja2FnZV9kZXNjID0gYWNwaV91dF9jcmVhdGVfaW50ZXJuYWxfb2JqZWN0KEFDUElfVFlQRV9QQUNLQUdFKTsKKwlpZiAoIXBhY2thZ2VfZGVzYykgeworCQlyZXR1cm5fUFRSKE5VTEwpOworCX0KKworCS8qCisJICogQ3JlYXRlIHRoZSBlbGVtZW50IGFycmF5LiBDb3VudCsxIGFsbG93cyB0aGUgYXJyYXkgdG8gYmUgbnVsbAorCSAqIHRlcm1pbmF0ZWQuCisJICovCisJcGFja2FnZV9lbGVtZW50cyA9IEFDUElfQUxMT0NBVEVfWkVST0VEKCgoYWNwaV9zaXplKSBjb3VudCArCisJCQkJCQkgMSkgKiBzaXplb2Yodm9pZCAqKSk7CisJaWYgKCFwYWNrYWdlX2VsZW1lbnRzKSB7CisJCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZShwYWNrYWdlX2Rlc2MpOworCQlyZXR1cm5fUFRSKE5VTEwpOworCX0KKworCXBhY2thZ2VfZGVzYy0+cGFja2FnZS5jb3VudCA9IGNvdW50OworCXBhY2thZ2VfZGVzYy0+cGFja2FnZS5lbGVtZW50cyA9IHBhY2thZ2VfZWxlbWVudHM7CisJcmV0dXJuX1BUUihwYWNrYWdlX2Rlc2MpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X2NyZWF0ZV9idWZmZXJfb2JqZWN0CisgKgorICogUEFSQU1FVEVSUzogIGJ1ZmZlcl9zaXplICAgICAgICAgICAgLSBTaXplIG9mIGJ1ZmZlciB0byBiZSBjcmVhdGVkCisgKgorICogUkVUVVJOOiAgICAgIFBvaW50ZXIgdG8gYSBuZXcgQnVmZmVyIG9iamVjdCwgbnVsbCBvbiBmYWlsdXJlCisgKgorICogREVTQ1JJUFRJT046IENyZWF0ZSBhIGZ1bGx5IGluaXRpYWxpemVkIGJ1ZmZlciBvYmplY3QKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICphY3BpX3V0X2NyZWF0ZV9idWZmZXJfb2JqZWN0KGFjcGlfc2l6ZSBidWZmZXJfc2l6ZSkKK3sKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpidWZmZXJfZGVzYzsKKwl1OCAqYnVmZmVyID0gTlVMTDsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0VfVTMyKHV0X2NyZWF0ZV9idWZmZXJfb2JqZWN0LCBidWZmZXJfc2l6ZSk7CisKKwkvKiBDcmVhdGUgYSBuZXcgQnVmZmVyIG9iamVjdCAqLworCisJYnVmZmVyX2Rlc2MgPSBhY3BpX3V0X2NyZWF0ZV9pbnRlcm5hbF9vYmplY3QoQUNQSV9UWVBFX0JVRkZFUik7CisJaWYgKCFidWZmZXJfZGVzYykgeworCQlyZXR1cm5fUFRSKE5VTEwpOworCX0KKworCS8qIENyZWF0ZSBhbiBhY3R1YWwgYnVmZmVyIG9ubHkgaWYgc2l6ZSA+IDAgKi8KKworCWlmIChidWZmZXJfc2l6ZSA+IDApIHsKKworCQkvKiBBbGxvY2F0ZSB0aGUgYWN0dWFsIGJ1ZmZlciAqLworCisJCWJ1ZmZlciA9IEFDUElfQUxMT0NBVEVfWkVST0VEKGJ1ZmZlcl9zaXplKTsKKwkJaWYgKCFidWZmZXIpIHsKKwkJCUFDUElfRVJST1IoKEFFX0lORk8sICJDb3VsZCBub3QgYWxsb2NhdGUgc2l6ZSAlWCIsCisJCQkJICAgICh1MzIpIGJ1ZmZlcl9zaXplKSk7CisJCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UoYnVmZmVyX2Rlc2MpOworCQkJcmV0dXJuX1BUUihOVUxMKTsKKwkJfQorCX0KKworCS8qIENvbXBsZXRlIGJ1ZmZlciBvYmplY3QgaW5pdGlhbGl6YXRpb24gKi8KKworCWJ1ZmZlcl9kZXNjLT5idWZmZXIuZmxhZ3MgfD0gQU9QT0JKX0RBVEFfVkFMSUQ7CisJYnVmZmVyX2Rlc2MtPmJ1ZmZlci5wb2ludGVyID0gYnVmZmVyOworCWJ1ZmZlcl9kZXNjLT5idWZmZXIubGVuZ3RoID0gKHUzMikgYnVmZmVyX3NpemU7CisKKwkvKiBSZXR1cm4gdGhlIG5ldyBidWZmZXIgZGVzY3JpcHRvciAqLworCisJcmV0dXJuX1BUUihidWZmZXJfZGVzYyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfdXRfY3JlYXRlX3N0cmluZ19vYmplY3QKKyAqCisgKiBQQVJBTUVURVJTOiAgc3RyaW5nX3NpemUgICAgICAgICAtIFNpemUgb2Ygc3RyaW5nIHRvIGJlIGNyZWF0ZWQuIERvZXMgbm90CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGUgTlVMTCB0ZXJtaW5hdG9yLCB0aGlzIGlzIGFkZGVkCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9tYXRpY2FsbHkuCisgKgorICogUkVUVVJOOiAgICAgIFBvaW50ZXIgdG8gYSBuZXcgU3RyaW5nIG9iamVjdAorICoKKyAqIERFU0NSSVBUSU9OOiBDcmVhdGUgYSBmdWxseSBpbml0aWFsaXplZCBzdHJpbmcgb2JqZWN0CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqYWNwaV91dF9jcmVhdGVfc3RyaW5nX29iamVjdChhY3BpX3NpemUgc3RyaW5nX3NpemUpCit7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqc3RyaW5nX2Rlc2M7CisJY2hhciAqc3RyaW5nOworCisJQUNQSV9GVU5DVElPTl9UUkFDRV9VMzIodXRfY3JlYXRlX3N0cmluZ19vYmplY3QsIHN0cmluZ19zaXplKTsKKworCS8qIENyZWF0ZSBhIG5ldyBTdHJpbmcgb2JqZWN0ICovCisKKwlzdHJpbmdfZGVzYyA9IGFjcGlfdXRfY3JlYXRlX2ludGVybmFsX29iamVjdChBQ1BJX1RZUEVfU1RSSU5HKTsKKwlpZiAoIXN0cmluZ19kZXNjKSB7CisJCXJldHVybl9QVFIoTlVMTCk7CisJfQorCisJLyoKKwkgKiBBbGxvY2F0ZSB0aGUgYWN0dWFsIHN0cmluZyBidWZmZXIgLS0gKFNpemUgKyAxKSBmb3IgTlVMTCB0ZXJtaW5hdG9yLgorCSAqIE5PVEU6IFplcm8tbGVuZ3RoIHN0cmluZ3MgYXJlIE5VTEwgdGVybWluYXRlZAorCSAqLworCXN0cmluZyA9IEFDUElfQUxMT0NBVEVfWkVST0VEKHN0cmluZ19zaXplICsgMSk7CisJaWYgKCFzdHJpbmcpIHsKKwkJQUNQSV9FUlJPUigoQUVfSU5GTywgIkNvdWxkIG5vdCBhbGxvY2F0ZSBzaXplICVYIiwKKwkJCSAgICAodTMyKSBzdHJpbmdfc2l6ZSkpOworCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2Uoc3RyaW5nX2Rlc2MpOworCQlyZXR1cm5fUFRSKE5VTEwpOworCX0KKworCS8qIENvbXBsZXRlIHN0cmluZyBvYmplY3QgaW5pdGlhbGl6YXRpb24gKi8KKworCXN0cmluZ19kZXNjLT5zdHJpbmcucG9pbnRlciA9IHN0cmluZzsKKwlzdHJpbmdfZGVzYy0+c3RyaW5nLmxlbmd0aCA9ICh1MzIpIHN0cmluZ19zaXplOworCisJLyogUmV0dXJuIHRoZSBuZXcgc3RyaW5nIGRlc2NyaXB0b3IgKi8KKworCXJldHVybl9QVFIoc3RyaW5nX2Rlc2MpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X3ZhbGlkX2ludGVybmFsX29iamVjdAorICoKKyAqIFBBUkFNRVRFUlM6ICBPYmplY3QgICAgICAgICAgICAgIC0gT2JqZWN0IHRvIGJlIHZhbGlkYXRlZAorICoKKyAqIFJFVFVSTjogICAgICBUUlVFIGlmIG9iamVjdCBpcyB2YWxpZCwgRkFMU0Ugb3RoZXJ3aXNlCisgKgorICogREVTQ1JJUFRJT046IFZhbGlkYXRlIGEgcG9pbnRlciB0byBiZSBhIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit1OCBhY3BpX3V0X3ZhbGlkX2ludGVybmFsX29iamVjdCh2b2lkICpvYmplY3QpCit7CisKKwlBQ1BJX0ZVTkNUSU9OX05BTUUodXRfdmFsaWRfaW50ZXJuYWxfb2JqZWN0KTsKKworCS8qIENoZWNrIGZvciBhIG51bGwgcG9pbnRlciAqLworCisJaWYgKCFvYmplY3QpIHsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLCAiKioqKiBOdWxsIE9iamVjdCBQdHJcbiIpKTsKKwkJcmV0dXJuIChGQUxTRSk7CisJfQorCisJLyogQ2hlY2sgdGhlIGRlc2NyaXB0b3IgdHlwZSBmaWVsZCAqLworCisJc3dpdGNoIChBQ1BJX0dFVF9ERVNDUklQVE9SX1RZUEUob2JqZWN0KSkgeworCWNhc2UgQUNQSV9ERVNDX1RZUEVfT1BFUkFORDoKKworCQkvKiBUaGUgb2JqZWN0IGFwcGVhcnMgdG8gYmUgYSB2YWxpZCB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICovCisKKwkJcmV0dXJuIChUUlVFKTsKKworCWRlZmF1bHQ6CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywKKwkJCQkgICIlcCBpcyBub3Qgbm90IGFuIEFDUEkgb3BlcmFuZCBvYmogWyVzXVxuIiwKKwkJCQkgIG9iamVjdCwgYWNwaV91dF9nZXRfZGVzY3JpcHRvcl9uYW1lKG9iamVjdCkpKTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIChGQUxTRSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfdXRfYWxsb2NhdGVfb2JqZWN0X2Rlc2NfZGJnCisgKgorICogUEFSQU1FVEVSUzogIG1vZHVsZV9uYW1lICAgICAgICAgLSBDYWxsZXIncyBtb2R1bGUgbmFtZSAoZm9yIGVycm9yIG91dHB1dCkKKyAqICAgICAgICAgICAgICBsaW5lX251bWJlciAgICAgICAgIC0gQ2FsbGVyJ3MgbGluZSBudW1iZXIgKGZvciBlcnJvciBvdXRwdXQpCisgKiAgICAgICAgICAgICAgY29tcG9uZW50X2lkICAgICAgICAtIENhbGxlcidzIGNvbXBvbmVudCBJRCAoZm9yIGVycm9yIG91dHB1dCkKKyAqCisgKiBSRVRVUk46ICAgICAgUG9pbnRlciB0byBuZXdseSBhbGxvY2F0ZWQgb2JqZWN0IGRlc2NyaXB0b3IuICBOdWxsIG9uIGVycm9yCisgKgorICogREVTQ1JJUFRJT046IEFsbG9jYXRlIGEgbmV3IG9iamVjdCBkZXNjcmlwdG9yLiAgR3JhY2VmdWxseSBoYW5kbGUKKyAqICAgICAgICAgICAgICBlcnJvciBjb25kaXRpb25zLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgKmFjcGlfdXRfYWxsb2NhdGVfb2JqZWN0X2Rlc2NfZGJnKGNvbnN0IGNoYXIgKm1vZHVsZV9uYW1lLAorCQkJCSAgICAgICB1MzIgbGluZV9udW1iZXIsIHUzMiBjb21wb25lbnRfaWQpCit7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqZWN0OworCisJQUNQSV9GVU5DVElPTl9UUkFDRSh1dF9hbGxvY2F0ZV9vYmplY3RfZGVzY19kYmcpOworCisJb2JqZWN0ID0gYWNwaV9vc19hY3F1aXJlX29iamVjdChhY3BpX2dibF9vcGVyYW5kX2NhY2hlKTsKKwlpZiAoIW9iamVjdCkgeworCQlBQ1BJX0VSUk9SKChtb2R1bGVfbmFtZSwgbGluZV9udW1iZXIsCisJCQkgICAgIkNvdWxkIG5vdCBhbGxvY2F0ZSBhbiBvYmplY3QgZGVzY3JpcHRvciIpKTsKKworCQlyZXR1cm5fUFRSKE5VTEwpOworCX0KKworCS8qIE1hcmsgdGhlIGRlc2NyaXB0b3IgdHlwZSAqLworCisJbWVtc2V0KG9iamVjdCwgMCwgc2l6ZW9mKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QpKTsKKwlBQ1BJX1NFVF9ERVNDUklQVE9SX1RZUEUob2JqZWN0LCBBQ1BJX0RFU0NfVFlQRV9PUEVSQU5EKTsKKworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfQUxMT0NBVElPTlMsICIlcCBTaXplICVYXG4iLAorCQkJICBvYmplY3QsICh1MzIpIHNpemVvZih1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0KSkpOworCisJcmV0dXJuX1BUUihvYmplY3QpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X2RlbGV0ZV9vYmplY3RfZGVzYworICoKKyAqIFBBUkFNRVRFUlM6ICBPYmplY3QgICAgICAgICAgLSBBbiBBY3BpIGludGVybmFsIG9iamVjdCB0byBiZSBkZWxldGVkCisgKgorICogUkVUVVJOOiAgICAgIE5vbmUuCisgKgorICogREVTQ1JJUFRJT046IEZyZWUgYW4gQUNQSSBvYmplY3QgZGVzY3JpcHRvciBvciBhZGQgaXQgdG8gdGhlIG9iamVjdCBjYWNoZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgYWNwaV91dF9kZWxldGVfb2JqZWN0X2Rlc2ModW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqZWN0KQoreworCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKHV0X2RlbGV0ZV9vYmplY3RfZGVzYywgb2JqZWN0KTsKKworCS8qIE9iamVjdCBtdXN0IGJlIGEgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAqLworCisJaWYgKEFDUElfR0VUX0RFU0NSSVBUT1JfVFlQRShvYmplY3QpICE9IEFDUElfREVTQ19UWVBFX09QRVJBTkQpIHsKKwkJQUNQSV9FUlJPUigoQUVfSU5GTywKKwkJCSAgICAiJXAgaXMgbm90IGFuIEFDUEkgT3BlcmFuZCBvYmplY3QgWyVzXSIsIG9iamVjdCwKKwkJCSAgICBhY3BpX3V0X2dldF9kZXNjcmlwdG9yX25hbWUob2JqZWN0KSkpOworCQlyZXR1cm5fVk9JRDsKKwl9CisKKwkodm9pZClhY3BpX29zX3JlbGVhc2Vfb2JqZWN0KGFjcGlfZ2JsX29wZXJhbmRfY2FjaGUsIG9iamVjdCk7CisJcmV0dXJuX1ZPSUQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfdXRfZ2V0X3NpbXBsZV9vYmplY3Rfc2l6ZQorICoKKyAqIFBBUkFNRVRFUlM6ICBpbnRlcm5hbF9vYmplY3QgICAgLSBBbiBBQ1BJIG9wZXJhbmQgb2JqZWN0CisgKiAgICAgICAgICAgICAgb2JqX2xlbmd0aCAgICAgICAgIC0gV2hlcmUgdGhlIGxlbmd0aCBpcyByZXR1cm5lZAorICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gZGV0ZXJtaW5lIHRoZSBzcGFjZSByZXF1aXJlZCB0bworICogICAgICAgICAgICAgIGNvbnRhaW4gYSBzaW1wbGUgb2JqZWN0IGZvciByZXR1cm4gdG8gYW4gZXh0ZXJuYWwgdXNlci4KKyAqCisgKiAgICAgICAgICAgICAgVGhlIGxlbmd0aCBpbmNsdWRlcyB0aGUgb2JqZWN0IHN0cnVjdHVyZSBwbHVzIGFueSBhZGRpdGlvbmFsCisgKiAgICAgICAgICAgICAgbmVlZGVkIHNwYWNlLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBhY3BpX3N0YXR1cworYWNwaV91dF9nZXRfc2ltcGxlX29iamVjdF9zaXplKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKmludGVybmFsX29iamVjdCwKKwkJCSAgICAgICBhY3BpX3NpemUgKiBvYmpfbGVuZ3RoKQoreworCWFjcGlfc2l6ZSBsZW5ndGg7CisJYWNwaV9zaXplIHNpemU7CisJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUih1dF9nZXRfc2ltcGxlX29iamVjdF9zaXplLCBpbnRlcm5hbF9vYmplY3QpOworCisJLyoKKwkgKiBIYW5kbGUgYSBudWxsIG9iamVjdCAoQ291bGQgYmUgYSB1bmluaXRpYWxpemVkIHBhY2thZ2UKKwkgKiBlbGVtZW50IC0tIHdoaWNoIGlzIGxlZ2FsKQorCSAqLworCWlmICghaW50ZXJuYWxfb2JqZWN0KSB7CisJCSpvYmpfbGVuZ3RoID0gc2l6ZW9mKHVuaW9uIGFjcGlfb2JqZWN0KTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKKwl9CisKKwkvKiBTdGFydCB3aXRoIHRoZSBsZW5ndGggb2YgdGhlIEFjcGkgb2JqZWN0ICovCisKKwlsZW5ndGggPSBzaXplb2YodW5pb24gYWNwaV9vYmplY3QpOworCisJaWYgKEFDUElfR0VUX0RFU0NSSVBUT1JfVFlQRShpbnRlcm5hbF9vYmplY3QpID09IEFDUElfREVTQ19UWVBFX05BTUVEKSB7CisKKwkJLyogT2JqZWN0IGlzIGEgbmFtZWQgb2JqZWN0IChyZWZlcmVuY2UpLCBqdXN0IHJldHVybiB0aGUgbGVuZ3RoICovCisKKwkJKm9ial9sZW5ndGggPSBBQ1BJX1JPVU5EX1VQX1RPX05BVElWRV9XT1JEKGxlbmd0aCk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworCX0KKworCS8qCisJICogVGhlIGZpbmFsIGxlbmd0aCBkZXBlbmRzIG9uIHRoZSBvYmplY3QgdHlwZQorCSAqIFN0cmluZ3MgYW5kIEJ1ZmZlcnMgYXJlIHBhY2tlZCByaWdodCB1cCBhZ2FpbnN0IHRoZSBwYXJlbnQgb2JqZWN0IGFuZAorCSAqIG11c3QgYmUgYWNjZXNzZWQgYnl0ZXdpc2Ugb3IgdGhlcmUgbWF5IGJlIGFsaWdubWVudCBwcm9ibGVtcyBvbgorCSAqIGNlcnRhaW4gcHJvY2Vzc29ycworCSAqLworCXN3aXRjaCAoQUNQSV9HRVRfT0JKRUNUX1RZUEUoaW50ZXJuYWxfb2JqZWN0KSkgeworCWNhc2UgQUNQSV9UWVBFX1NUUklORzoKKworCQlsZW5ndGggKz0gKGFjcGlfc2l6ZSkgaW50ZXJuYWxfb2JqZWN0LT5zdHJpbmcubGVuZ3RoICsgMTsKKwkJYnJlYWs7CisKKwljYXNlIEFDUElfVFlQRV9CVUZGRVI6CisKKwkJbGVuZ3RoICs9IChhY3BpX3NpemUpIGludGVybmFsX29iamVjdC0+YnVmZmVyLmxlbmd0aDsKKwkJYnJlYWs7CisKKwljYXNlIEFDUElfVFlQRV9JTlRFR0VSOgorCWNhc2UgQUNQSV9UWVBFX1BST0NFU1NPUjoKKwljYXNlIEFDUElfVFlQRV9QT1dFUjoKKworCQkvKiBObyBleHRyYSBkYXRhIGZvciB0aGVzZSB0eXBlcyAqLworCisJCWJyZWFrOworCisJY2FzZSBBQ1BJX1RZUEVfTE9DQUxfUkVGRVJFTkNFOgorCisJCXN3aXRjaCAoaW50ZXJuYWxfb2JqZWN0LT5yZWZlcmVuY2UuY2xhc3MpIHsKKwkJY2FzZSBBQ1BJX1JFRkNMQVNTX05BTUU6CisKKwkJCS8qCisJCQkgKiBHZXQgdGhlIGFjdHVhbCBsZW5ndGggb2YgdGhlIGZ1bGwgcGF0aG5hbWUgdG8gdGhpcyBvYmplY3QuCisJCQkgKiBUaGUgcmVmZXJlbmNlIHdpbGwgYmUgY29udmVydGVkIHRvIHRoZSBwYXRobmFtZSB0byB0aGUgb2JqZWN0CisJCQkgKi8KKwkJCXNpemUgPQorCQkJICAgIGFjcGlfbnNfZ2V0X3BhdGhuYW1lX2xlbmd0aChpbnRlcm5hbF9vYmplY3QtPgorCQkJCQkJCXJlZmVyZW5jZS5ub2RlKTsKKwkJCWlmICghc2l6ZSkgeworCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfUEFSQU1FVEVSKTsKKwkJCX0KKworCQkJbGVuZ3RoICs9IEFDUElfUk9VTkRfVVBfVE9fTkFUSVZFX1dPUkQoc2l6ZSk7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCisJCQkvKgorCQkJICogTm8gb3RoZXIgcmVmZXJlbmNlIG9wY29kZXMgYXJlIHN1cHBvcnRlZC4KKwkJCSAqIE5vdGFibHksIExvY2FscyBhbmQgQXJncyBhcmUgbm90IHN1cHBvcnRlZCwgYnV0IHRoaXMgbWF5IGJlCisJCQkgKiByZXF1aXJlZCBldmVudHVhbGx5LgorCQkJICovCisJCQlBQ1BJX0VSUk9SKChBRV9JTkZPLAorCQkJCSAgICAiQ2Fubm90IGNvbnZlcnQgdG8gZXh0ZXJuYWwgb2JqZWN0IC0gIgorCQkJCSAgICAidW5zdXBwb3J0ZWQgUmVmZXJlbmNlIENsYXNzIFslc10gJVggaW4gb2JqZWN0ICVwIiwKKwkJCQkgICAgYWNwaV91dF9nZXRfcmVmZXJlbmNlX25hbWUoaW50ZXJuYWxfb2JqZWN0KSwKKwkJCQkgICAgaW50ZXJuYWxfb2JqZWN0LT5yZWZlcmVuY2UuY2xhc3MsCisJCQkJICAgIGludGVybmFsX29iamVjdCkpOworCQkJc3RhdHVzID0gQUVfVFlQRTsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKworCQlBQ1BJX0VSUk9SKChBRV9JTkZPLCAiQ2Fubm90IGNvbnZlcnQgdG8gZXh0ZXJuYWwgb2JqZWN0IC0gIgorCQkJICAgICJ1bnN1cHBvcnRlZCB0eXBlIFslc10gJVggaW4gb2JqZWN0ICVwIiwKKwkJCSAgICBhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lKGludGVybmFsX29iamVjdCksCisJCQkgICAgQUNQSV9HRVRfT0JKRUNUX1RZUEUoaW50ZXJuYWxfb2JqZWN0KSwKKwkJCSAgICBpbnRlcm5hbF9vYmplY3QpKTsKKwkJc3RhdHVzID0gQUVfVFlQRTsKKwkJYnJlYWs7CisJfQorCisJLyoKKwkgKiBBY2NvdW50IGZvciB0aGUgc3BhY2UgcmVxdWlyZWQgYnkgdGhlIG9iamVjdCByb3VuZGVkIHVwIHRvIHRoZSBuZXh0CisJICogbXVsdGlwbGUgb2YgdGhlIG1hY2hpbmUgd29yZCBzaXplLiAgVGhpcyBrZWVwcyBlYWNoIG9iamVjdCBhbGlnbmVkCisJICogb24gYSBtYWNoaW5lIHdvcmQgYm91bmRhcnkuIChwcmV2ZW50aW5nIGFsaWdubWVudCBmYXVsdHMgb24gc29tZQorCSAqIG1hY2hpbmVzLikKKwkgKi8KKwkqb2JqX2xlbmd0aCA9IEFDUElfUk9VTkRfVVBfVE9fTkFUSVZFX1dPUkQobGVuZ3RoKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV91dF9nZXRfZWxlbWVudF9sZW5ndGgKKyAqCisgKiBQQVJBTUVURVJTOiAgYWNwaV9wa2dfY2FsbGJhY2sKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IEdldCB0aGUgbGVuZ3RoIG9mIG9uZSBwYWNrYWdlIGVsZW1lbnQuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGFjcGlfc3RhdHVzCithY3BpX3V0X2dldF9lbGVtZW50X2xlbmd0aCh1OCBvYmplY3RfdHlwZSwKKwkJCSAgIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnNvdXJjZV9vYmplY3QsCisJCQkgICB1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgKnN0YXRlLCB2b2lkICpjb250ZXh0KQoreworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOworCXN0cnVjdCBhY3BpX3BrZ19pbmZvICppbmZvID0gKHN0cnVjdCBhY3BpX3BrZ19pbmZvICopY29udGV4dDsKKwlhY3BpX3NpemUgb2JqZWN0X3NwYWNlOworCisJc3dpdGNoIChvYmplY3RfdHlwZSkgeworCWNhc2UgQUNQSV9DT1BZX1RZUEVfU0lNUExFOgorCisJCS8qCisJCSAqIFNpbXBsZSBvYmplY3QgLSBqdXN0IGdldCB0aGUgc2l6ZSAoTnVsbCBvYmplY3QvZW50cnkgaXMgaGFuZGxlZAorCQkgKiBoZXJlIGFsc28pIGFuZCBzdW0gaXQgaW50byB0aGUgcnVubmluZyBwYWNrYWdlIGxlbmd0aAorCQkgKi8KKwkJc3RhdHVzID0KKwkJICAgIGFjcGlfdXRfZ2V0X3NpbXBsZV9vYmplY3Rfc2l6ZShzb3VyY2Vfb2JqZWN0LAorCQkJCQkJICAgJm9iamVjdF9zcGFjZSk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJcmV0dXJuIChzdGF0dXMpOworCQl9CisKKwkJaW5mby0+bGVuZ3RoICs9IG9iamVjdF9zcGFjZTsKKwkJYnJlYWs7CisKKwljYXNlIEFDUElfQ09QWV9UWVBFX1BBQ0tBR0U6CisKKwkJLyogUGFja2FnZSBvYmplY3QgLSBub3RoaW5nIG11Y2ggdG8gZG8gaGVyZSwgbGV0IHRoZSB3YWxrIGhhbmRsZSBpdCAqLworCisJCWluZm8tPm51bV9wYWNrYWdlcysrOworCQlzdGF0ZS0+cGtnLnRoaXNfdGFyZ2V0X29iaiA9IE5VTEw7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKworCQkvKiBObyBvdGhlciB0eXBlcyBhbGxvd2VkICovCisKKwkJcmV0dXJuIChBRV9CQURfUEFSQU1FVEVSKTsKKwl9CisKKwlyZXR1cm4gKHN0YXR1cyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfdXRfZ2V0X3BhY2thZ2Vfb2JqZWN0X3NpemUKKyAqCisgKiBQQVJBTUVURVJTOiAgaW50ZXJuYWxfb2JqZWN0ICAgICAtIEFuIEFDUEkgaW50ZXJuYWwgb2JqZWN0CisgKiAgICAgICAgICAgICAgb2JqX2xlbmd0aCAgICAgICAgICAtIFdoZXJlIHRoZSBsZW5ndGggaXMgcmV0dXJuZWQKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGRldGVybWluZSB0aGUgc3BhY2UgcmVxdWlyZWQgdG8KKyAqICAgICAgICAgICAgICBjb250YWluIGEgcGFja2FnZSBvYmplY3QgZm9yIHJldHVybiB0byBhbiBleHRlcm5hbCB1c2VyLgorICoKKyAqICAgICAgICAgICAgICBUaGlzIGlzIG1vZGVyYXRlbHkgY29tcGxleCBzaW5jZSBhIHBhY2thZ2UgY29udGFpbnMgb3RoZXIKKyAqICAgICAgICAgICAgICBvYmplY3RzIGluY2x1ZGluZyBwYWNrYWdlcy4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgYWNwaV9zdGF0dXMKK2FjcGlfdXRfZ2V0X3BhY2thZ2Vfb2JqZWN0X3NpemUodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqaW50ZXJuYWxfb2JqZWN0LAorCQkJCWFjcGlfc2l6ZSAqIG9ial9sZW5ndGgpCit7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCXN0cnVjdCBhY3BpX3BrZ19pbmZvIGluZm87CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUih1dF9nZXRfcGFja2FnZV9vYmplY3Rfc2l6ZSwgaW50ZXJuYWxfb2JqZWN0KTsKKworCWluZm8ubGVuZ3RoID0gMDsKKwlpbmZvLm9iamVjdF9zcGFjZSA9IDA7CisJaW5mby5udW1fcGFja2FnZXMgPSAxOworCisJc3RhdHVzID0gYWNwaV91dF93YWxrX3BhY2thZ2VfdHJlZShpbnRlcm5hbF9vYmplY3QsIE5VTEwsCisJCQkJCSAgIGFjcGlfdXRfZ2V0X2VsZW1lbnRfbGVuZ3RoLCAmaW5mbyk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworCX0KKworCS8qCisJICogV2UgaGF2ZSBoYW5kbGVkIGFsbCBvZiB0aGUgb2JqZWN0cyBpbiBhbGwgbGV2ZWxzIG9mIHRoZSBwYWNrYWdlLgorCSAqIGp1c3QgYWRkIHRoZSBsZW5ndGggb2YgdGhlIHBhY2thZ2Ugb2JqZWN0cyB0aGVtc2VsdmVzLgorCSAqIFJvdW5kIHVwIHRvIHRoZSBuZXh0IG1hY2hpbmUgd29yZC4KKwkgKi8KKwlpbmZvLmxlbmd0aCArPSBBQ1BJX1JPVU5EX1VQX1RPX05BVElWRV9XT1JEKHNpemVvZih1bmlvbiBhY3BpX29iamVjdCkpICoKKwkgICAgKGFjcGlfc2l6ZSkgaW5mby5udW1fcGFja2FnZXM7CisKKwkvKiBSZXR1cm4gdGhlIHRvdGFsIHBhY2thZ2UgbGVuZ3RoICovCisKKwkqb2JqX2xlbmd0aCA9IGluZm8ubGVuZ3RoOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X2dldF9vYmplY3Rfc2l6ZQorICoKKyAqIFBBUkFNRVRFUlM6ICBpbnRlcm5hbF9vYmplY3QgICAgIC0gQW4gQUNQSSBpbnRlcm5hbCBvYmplY3QKKyAqICAgICAgICAgICAgICBvYmpfbGVuZ3RoICAgICAgICAgIC0gV2hlcmUgdGhlIGxlbmd0aCB3aWxsIGJlIHJldHVybmVkCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBkZXRlcm1pbmUgdGhlIHNwYWNlIHJlcXVpcmVkIHRvCisgKiAgICAgICAgICAgICAgY29udGFpbiBhbiBvYmplY3QgZm9yIHJldHVybiB0byBhbiBBUEkgdXNlci4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCithY3BpX3N0YXR1cworYWNwaV91dF9nZXRfb2JqZWN0X3NpemUodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqaW50ZXJuYWxfb2JqZWN0LAorCQkJYWNwaV9zaXplICogb2JqX2xlbmd0aCkKK3sKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisKKwlBQ1BJX0ZVTkNUSU9OX0VOVFJZKCk7CisKKwlpZiAoKEFDUElfR0VUX0RFU0NSSVBUT1JfVFlQRShpbnRlcm5hbF9vYmplY3QpID09CisJICAgICBBQ1BJX0RFU0NfVFlQRV9PUEVSQU5EKQorCSAgICAmJiAoQUNQSV9HRVRfT0JKRUNUX1RZUEUoaW50ZXJuYWxfb2JqZWN0KSA9PSBBQ1BJX1RZUEVfUEFDS0FHRSkpIHsKKwkJc3RhdHVzID0KKwkJICAgIGFjcGlfdXRfZ2V0X3BhY2thZ2Vfb2JqZWN0X3NpemUoaW50ZXJuYWxfb2JqZWN0LAorCQkJCQkJICAgIG9ial9sZW5ndGgpOworCX0gZWxzZSB7CisJCXN0YXR1cyA9CisJCSAgICBhY3BpX3V0X2dldF9zaW1wbGVfb2JqZWN0X3NpemUoaW50ZXJuYWxfb2JqZWN0LCBvYmpfbGVuZ3RoKTsKKwl9CisKKwlyZXR1cm4gKHN0YXR1cyk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL3V0cmVzcmMuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvdXRyZXNyYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxYjdjMDAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL3V0cmVzcmMuYwpAQCAtMCwwICsxLDYxNiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBNb2R1bGUgTmFtZTogdXRyZXNyYyAtIFJlc291cmNlIG1hbmFnZW1lbnQgdXRpbGl0aWVzCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDgsIEludGVsIENvcnAuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCisgKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSBhdCBtaW5pbXVtIGEgZGlzY2xhaW1lcgorICogICAgc3Vic3RhbnRpYWxseSBzaW1pbGFyIHRvIHRoZSAiTk8gV0FSUkFOVFkiIGRpc2NsYWltZXIgYmVsb3cKKyAqICAgICgiRGlzY2xhaW1lciIpIGFuZCBhbnkgcmVkaXN0cmlidXRpb24gbXVzdCBiZSBjb25kaXRpb25lZCB1cG9uCisgKiAgICBpbmNsdWRpbmcgYSBzdWJzdGFudGlhbGx5IHNpbWlsYXIgRGlzY2xhaW1lciByZXF1aXJlbWVudCBmb3IgZnVydGhlcgorICogICAgYmluYXJ5IHJlZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzCisgKiAgICBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIE5PIFdBUlJBTlRZCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORworICogSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCisgKi8KKworI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgorI2luY2x1ZGUgImFjY29tbW9uLmgiCisjaW5jbHVkZSAiYW1scmVzcmMuaCIKKworI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfVVRJTElUSUVTCitBQ1BJX01PRFVMRV9OQU1FKCJ1dHJlc3JjIikKKyNpZiBkZWZpbmVkKEFDUElfRElTQVNTRU1CTEVSKSB8fCBkZWZpbmVkIChBQ1BJX0RFQlVHR0VSKQorLyoKKyAqIFN0cmluZ3MgdXNlZCB0byBkZWNvZGUgcmVzb3VyY2UgZGVzY3JpcHRvcnMuCisgKiBVc2VkIGJ5IGJvdGggdGhlIGRpc2Fzc3NlbWJsZXIgYW5kIHRoZSBkZWJ1Z2dlciByZXNvdXJjZSBkdW1wIHJvdXRpbmVzCisgKi8KK2NvbnN0IGNoYXIgKmFjcGlfZ2JsX2JtX2RlY29kZVtdID0geworCSJOb3RCdXNNYXN0ZXIiLAorCSJCdXNNYXN0ZXIiCit9OworCitjb25zdCBjaGFyICphY3BpX2dibF9jb25maWdfZGVjb2RlW10gPSB7CisJIjAgLSBHb29kIENvbmZpZ3VyYXRpb24iLAorCSIxIC0gQWNjZXB0YWJsZSBDb25maWd1cmF0aW9uIiwKKwkiMiAtIFN1Ym9wdGltYWwgQ29uZmlndXJhdGlvbiIsCisJIjMgLSAqKipJbnZhbGlkIENvbmZpZ3VyYXRpb24qKioiLAorfTsKKworY29uc3QgY2hhciAqYWNwaV9nYmxfY29uc3VtZV9kZWNvZGVbXSA9IHsKKwkiUmVzb3VyY2VQcm9kdWNlciIsCisJIlJlc291cmNlQ29uc3VtZXIiCit9OworCitjb25zdCBjaGFyICphY3BpX2dibF9kZWNfZGVjb2RlW10gPSB7CisJIlBvc0RlY29kZSIsCisJIlN1YkRlY29kZSIKK307CisKK2NvbnN0IGNoYXIgKmFjcGlfZ2JsX2hlX2RlY29kZVtdID0geworCSJMZXZlbCIsCisJIkVkZ2UiCit9OworCitjb25zdCBjaGFyICphY3BpX2dibF9pb19kZWNvZGVbXSA9IHsKKwkiRGVjb2RlMTAiLAorCSJEZWNvZGUxNiIKK307CisKK2NvbnN0IGNoYXIgKmFjcGlfZ2JsX2xsX2RlY29kZVtdID0geworCSJBY3RpdmVIaWdoIiwKKwkiQWN0aXZlTG93IgorfTsKKworY29uc3QgY2hhciAqYWNwaV9nYmxfbWF4X2RlY29kZVtdID0geworCSJNYXhOb3RGaXhlZCIsCisJIk1heEZpeGVkIgorfTsKKworY29uc3QgY2hhciAqYWNwaV9nYmxfbWVtX2RlY29kZVtdID0geworCSJOb25DYWNoZWFibGUiLAorCSJDYWNoZWFibGUiLAorCSJXcml0ZUNvbWJpbmluZyIsCisJIlByZWZldGNoYWJsZSIKK307CisKK2NvbnN0IGNoYXIgKmFjcGlfZ2JsX21pbl9kZWNvZGVbXSA9IHsKKwkiTWluTm90Rml4ZWQiLAorCSJNaW5GaXhlZCIKK307CisKK2NvbnN0IGNoYXIgKmFjcGlfZ2JsX210cF9kZWNvZGVbXSA9IHsKKwkiQWRkcmVzc1JhbmdlTWVtb3J5IiwKKwkiQWRkcmVzc1JhbmdlUmVzZXJ2ZWQiLAorCSJBZGRyZXNzUmFuZ2VBQ1BJIiwKKwkiQWRkcmVzc1JhbmdlTlZTIgorfTsKKworY29uc3QgY2hhciAqYWNwaV9nYmxfcm5nX2RlY29kZVtdID0geworCSJJbnZhbGlkUmFuZ2VzIiwKKwkiTm9uSVNBT25seVJhbmdlcyIsCisJIklTQU9ubHlSYW5nZXMiLAorCSJFbnRpcmVSYW5nZSIKK307CisKK2NvbnN0IGNoYXIgKmFjcGlfZ2JsX3J3X2RlY29kZVtdID0geworCSJSZWFkT25seSIsCisJIlJlYWRXcml0ZSIKK307CisKK2NvbnN0IGNoYXIgKmFjcGlfZ2JsX3Nocl9kZWNvZGVbXSA9IHsKKwkiRXhjbHVzaXZlIiwKKwkiU2hhcmVkIgorfTsKKworY29uc3QgY2hhciAqYWNwaV9nYmxfc2l6X2RlY29kZVtdID0geworCSJUcmFuc2ZlcjgiLAorCSJUcmFuc2ZlcjhfMTYiLAorCSJUcmFuc2ZlcjE2IiwKKwkiSW52YWxpZFNpemUiCit9OworCitjb25zdCBjaGFyICphY3BpX2dibF90cnNfZGVjb2RlW10gPSB7CisJIkRlbnNlVHJhbnNsYXRpb24iLAorCSJTcGFyc2VUcmFuc2xhdGlvbiIKK307CisKK2NvbnN0IGNoYXIgKmFjcGlfZ2JsX3R0cF9kZWNvZGVbXSA9IHsKKwkiVHlwZVN0YXRpYyIsCisJIlR5cGVUcmFuc2xhdGlvbiIKK307CisKK2NvbnN0IGNoYXIgKmFjcGlfZ2JsX3R5cF9kZWNvZGVbXSA9IHsKKwkiQ29tcGF0aWJpbGl0eSIsCisJIlR5cGVBIiwKKwkiVHlwZUIiLAorCSJUeXBlRiIKK307CisKKyNlbmRpZgorCisvKgorICogQmFzZSBzaXplcyBvZiB0aGUgcmF3IEFNTCByZXNvdXJjZSBkZXNjcmlwdG9ycywgaW5kZXhlZCBieSByZXNvdXJjZSB0eXBlLgorICogWmVybyBpbmRpY2F0ZXMgYSByZXNlcnZlZCAoYW5kIHRoZXJlZm9yZSBpbnZhbGlkKSByZXNvdXJjZSB0eXBlLgorICovCitjb25zdCB1OCBhY3BpX2dibF9yZXNvdXJjZV9hbWxfc2l6ZXNbXSA9IHsKKwkvKiBTbWFsbCBkZXNjcmlwdG9ycyAqLworCisJMCwKKwkwLAorCTAsCisJMCwKKwlBQ1BJX0FNTF9TSVpFX1NNQUxMKHN0cnVjdCBhbWxfcmVzb3VyY2VfaXJxKSwKKwlBQ1BJX0FNTF9TSVpFX1NNQUxMKHN0cnVjdCBhbWxfcmVzb3VyY2VfZG1hKSwKKwlBQ1BJX0FNTF9TSVpFX1NNQUxMKHN0cnVjdCBhbWxfcmVzb3VyY2Vfc3RhcnRfZGVwZW5kZW50KSwKKwlBQ1BJX0FNTF9TSVpFX1NNQUxMKHN0cnVjdCBhbWxfcmVzb3VyY2VfZW5kX2RlcGVuZGVudCksCisJQUNQSV9BTUxfU0laRV9TTUFMTChzdHJ1Y3QgYW1sX3Jlc291cmNlX2lvKSwKKwlBQ1BJX0FNTF9TSVpFX1NNQUxMKHN0cnVjdCBhbWxfcmVzb3VyY2VfZml4ZWRfaW8pLAorCTAsCisJMCwKKwkwLAorCTAsCisJQUNQSV9BTUxfU0laRV9TTUFMTChzdHJ1Y3QgYW1sX3Jlc291cmNlX3ZlbmRvcl9zbWFsbCksCisJQUNQSV9BTUxfU0laRV9TTUFMTChzdHJ1Y3QgYW1sX3Jlc291cmNlX2VuZF90YWcpLAorCisJLyogTGFyZ2UgZGVzY3JpcHRvcnMgKi8KKworCTAsCisJQUNQSV9BTUxfU0laRV9MQVJHRShzdHJ1Y3QgYW1sX3Jlc291cmNlX21lbW9yeTI0KSwKKwlBQ1BJX0FNTF9TSVpFX0xBUkdFKHN0cnVjdCBhbWxfcmVzb3VyY2VfZ2VuZXJpY19yZWdpc3RlciksCisJMCwKKwlBQ1BJX0FNTF9TSVpFX0xBUkdFKHN0cnVjdCBhbWxfcmVzb3VyY2VfdmVuZG9yX2xhcmdlKSwKKwlBQ1BJX0FNTF9TSVpFX0xBUkdFKHN0cnVjdCBhbWxfcmVzb3VyY2VfbWVtb3J5MzIpLAorCUFDUElfQU1MX1NJWkVfTEFSR0Uoc3RydWN0IGFtbF9yZXNvdXJjZV9maXhlZF9tZW1vcnkzMiksCisJQUNQSV9BTUxfU0laRV9MQVJHRShzdHJ1Y3QgYW1sX3Jlc291cmNlX2FkZHJlc3MzMiksCisJQUNQSV9BTUxfU0laRV9MQVJHRShzdHJ1Y3QgYW1sX3Jlc291cmNlX2FkZHJlc3MxNiksCisJQUNQSV9BTUxfU0laRV9MQVJHRShzdHJ1Y3QgYW1sX3Jlc291cmNlX2V4dGVuZGVkX2lycSksCisJQUNQSV9BTUxfU0laRV9MQVJHRShzdHJ1Y3QgYW1sX3Jlc291cmNlX2FkZHJlc3M2NCksCisJQUNQSV9BTUxfU0laRV9MQVJHRShzdHJ1Y3QgYW1sX3Jlc291cmNlX2V4dGVuZGVkX2FkZHJlc3M2NCkKK307CisKKy8qCisgKiBSZXNvdXJjZSB0eXBlcywgdXNlZCB0byB2YWxpZGF0ZSB0aGUgcmVzb3VyY2UgbGVuZ3RoIGZpZWxkLgorICogVGhlIGxlbmd0aCBvZiBmaXhlZC1sZW5ndGggdHlwZXMgbXVzdCBtYXRjaCBleGFjdGx5LCB2YXJpYWJsZQorICogbGVuZ3RocyBtdXN0IG1lZXQgdGhlIG1pbmltdW0gcmVxdWlyZWQgbGVuZ3RoLCBldGMuCisgKiBaZXJvIGluZGljYXRlcyBhIHJlc2VydmVkIChhbmQgdGhlcmVmb3JlIGludmFsaWQpIHJlc291cmNlIHR5cGUuCisgKi8KK3N0YXRpYyBjb25zdCB1OCBhY3BpX2dibF9yZXNvdXJjZV90eXBlc1tdID0geworCS8qIFNtYWxsIGRlc2NyaXB0b3JzICovCisKKwkwLAorCTAsCisJMCwKKwkwLAorCUFDUElfU01BTExfVkFSSUFCTEVfTEVOR1RILAorCUFDUElfRklYRURfTEVOR1RILAorCUFDUElfU01BTExfVkFSSUFCTEVfTEVOR1RILAorCUFDUElfRklYRURfTEVOR1RILAorCUFDUElfRklYRURfTEVOR1RILAorCUFDUElfRklYRURfTEVOR1RILAorCTAsCisJMCwKKwkwLAorCTAsCisJQUNQSV9WQVJJQUJMRV9MRU5HVEgsCisJQUNQSV9GSVhFRF9MRU5HVEgsCisKKwkvKiBMYXJnZSBkZXNjcmlwdG9ycyAqLworCisJMCwKKwlBQ1BJX0ZJWEVEX0xFTkdUSCwKKwlBQ1BJX0ZJWEVEX0xFTkdUSCwKKwkwLAorCUFDUElfVkFSSUFCTEVfTEVOR1RILAorCUFDUElfRklYRURfTEVOR1RILAorCUFDUElfRklYRURfTEVOR1RILAorCUFDUElfVkFSSUFCTEVfTEVOR1RILAorCUFDUElfVkFSSUFCTEVfTEVOR1RILAorCUFDUElfVkFSSUFCTEVfTEVOR1RILAorCUFDUElfVkFSSUFCTEVfTEVOR1RILAorCUFDUElfRklYRURfTEVOR1RICit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X3dhbGtfYW1sX3Jlc291cmNlcworICoKKyAqIFBBUkFNRVRFUlM6ICBBbWwgICAgICAgICAgICAgLSBQb2ludGVyIHRvIHRoZSByYXcgQU1MIHJlc291cmNlIHRlbXBsYXRlCisgKiAgICAgICAgICAgICAgYW1sX2xlbmd0aCAgICAgIC0gTGVuZ3RoIG9mIHRoZSBlbnRpcmUgdGVtcGxhdGUKKyAqICAgICAgICAgICAgICB1c2VyX2Z1bmN0aW9uICAgLSBDYWxsZWQgb25jZSBmb3IgZWFjaCBkZXNjcmlwdG9yIGZvdW5kLiBJZgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIGEgcG9pbnRlciB0byB0aGUgZW5kX3RhZyBpcyByZXR1cm5lZAorICogICAgICAgICAgICAgIENvbnRleHQgICAgICAgICAtIFBhc3NlZCB0byB1c2VyX2Z1bmN0aW9uCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBXYWxrIGEgcmF3IEFNTCByZXNvdXJjZSBsaXN0KGJ1ZmZlcikuIFVzZXIgZnVuY3Rpb24gY2FsbGVkCisgKiAgICAgICAgICAgICAgb25jZSBmb3IgZWFjaCByZXNvdXJjZSBmb3VuZC4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCithY3BpX3N0YXR1cworYWNwaV91dF93YWxrX2FtbF9yZXNvdXJjZXModTggKiBhbWwsCisJCQkgICBhY3BpX3NpemUgYW1sX2xlbmd0aCwKKwkJCSAgIGFjcGlfd2Fsa19hbWxfY2FsbGJhY2sgdXNlcl9mdW5jdGlvbiwgdm9pZCAqKmNvbnRleHQpCit7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCXU4ICplbmRfYW1sOworCXU4IHJlc291cmNlX2luZGV4OworCXUzMiBsZW5ndGg7CisJdTMyIG9mZnNldCA9IDA7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKHV0X3dhbGtfYW1sX3Jlc291cmNlcyk7CisKKwkvKiBUaGUgYWJzb2x1dGUgbWluaW11bSByZXNvdXJjZSB0ZW1wbGF0ZSBpcyBvbmUgZW5kX3RhZyBkZXNjcmlwdG9yICovCisKKwlpZiAoYW1sX2xlbmd0aCA8IHNpemVvZihzdHJ1Y3QgYW1sX3Jlc291cmNlX2VuZF90YWcpKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfTk9fUkVTT1VSQ0VfRU5EX1RBRyk7CisJfQorCisJLyogUG9pbnQgdG8gdGhlIGVuZCBvZiB0aGUgcmVzb3VyY2UgdGVtcGxhdGUgYnVmZmVyICovCisKKwllbmRfYW1sID0gYW1sICsgYW1sX2xlbmd0aDsKKworCS8qIFdhbGsgdGhlIGJ5dGUgbGlzdCwgYWJvcnQgb24gYW55IGludmFsaWQgZGVzY3JpcHRvciB0eXBlIG9yIGxlbmd0aCAqLworCisJd2hpbGUgKGFtbCA8IGVuZF9hbWwpIHsKKworCQkvKiBWYWxpZGF0ZSB0aGUgUmVzb3VyY2UgVHlwZSBhbmQgUmVzb3VyY2UgTGVuZ3RoICovCisKKwkJc3RhdHVzID0gYWNwaV91dF92YWxpZGF0ZV9yZXNvdXJjZShhbWwsICZyZXNvdXJjZV9pbmRleCk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CisJCX0KKworCQkvKiBHZXQgdGhlIGxlbmd0aCBvZiB0aGlzIGRlc2NyaXB0b3IgKi8KKworCQlsZW5ndGggPSBhY3BpX3V0X2dldF9kZXNjcmlwdG9yX2xlbmd0aChhbWwpOworCisJCS8qIEludm9rZSB0aGUgdXNlciBmdW5jdGlvbiAqLworCisJCWlmICh1c2VyX2Z1bmN0aW9uKSB7CisJCQlzdGF0dXMgPQorCQkJICAgIHVzZXJfZnVuY3Rpb24oYW1sLCBsZW5ndGgsIG9mZnNldCwgcmVzb3VyY2VfaW5kZXgsCisJCQkJCSAgY29udGV4dCk7CisJCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCQlyZXR1cm4gKHN0YXR1cyk7CisJCQl9CisJCX0KKworCQkvKiBBbiBlbmRfdGFnIGRlc2NyaXB0b3IgdGVybWluYXRlcyB0aGlzIHJlc291cmNlIHRlbXBsYXRlICovCisKKwkJaWYgKGFjcGlfdXRfZ2V0X3Jlc291cmNlX3R5cGUoYW1sKSA9PQorCQkgICAgQUNQSV9SRVNPVVJDRV9OQU1FX0VORF9UQUcpIHsKKwkJCS8qCisJCQkgKiBUaGVyZSBtdXN0IGJlIGF0IGxlYXN0IG9uZSBtb3JlIGJ5dGUgaW4gdGhlIGJ1ZmZlciBmb3IKKwkJCSAqIHRoZSAybmQgYnl0ZSBvZiB0aGUgZW5kX3RhZworCQkJICovCisJCQlpZiAoKGFtbCArIDEpID49IGVuZF9hbWwpIHsKKwkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX05PX1JFU09VUkNFX0VORF9UQUcpOworCQkJfQorCisJCQkvKiBSZXR1cm4gdGhlIHBvaW50ZXIgdG8gdGhlIGVuZF90YWcgaWYgcmVxdWVzdGVkICovCisKKwkJCWlmICghdXNlcl9mdW5jdGlvbikgeworCQkJCSpjb250ZXh0ID0gYW1sOworCQkJfQorCisJCQkvKiBOb3JtYWwgZXhpdCAqLworCisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOworCQl9CisKKwkJYW1sICs9IGxlbmd0aDsKKwkJb2Zmc2V0ICs9IGxlbmd0aDsKKwl9CisKKwkvKiBEaWQgbm90IGZpbmQgYW4gZW5kX3RhZyBkZXNjcmlwdG9yICovCisKKwlyZXR1cm4gKEFFX0FNTF9OT19SRVNPVVJDRV9FTkRfVEFHKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV91dF92YWxpZGF0ZV9yZXNvdXJjZQorICoKKyAqIFBBUkFNRVRFUlM6ICBBbWwgICAgICAgICAgICAgLSBQb2ludGVyIHRvIHRoZSByYXcgQU1MIHJlc291cmNlIGRlc2NyaXB0b3IKKyAqICAgICAgICAgICAgICByZXR1cm5faW5kZXggICAgLSBXaGVyZSB0aGUgcmVzb3VyY2UgaW5kZXggaXMgcmV0dXJuZWQuIE5VTEwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiB0aGUgaW5kZXggaXMgbm90IHJlcXVpcmVkLgorICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMsIGFuZCBvcHRpb25hbGx5IHRoZSBJbmRleCBpbnRvIHRoZSBnbG9iYWwgcmVzb3VyY2UgdGFibGVzCisgKgorICogREVTQ1JJUFRJT046IFZhbGlkYXRlIGFuIEFNTCByZXNvdXJjZSBkZXNjcmlwdG9yIGJ5IGNoZWNraW5nIHRoZSBSZXNvdXJjZQorICogICAgICAgICAgICAgIFR5cGUgYW5kIFJlc291cmNlIExlbmd0aC4gUmV0dXJucyBhbiBpbmRleCBpbnRvIHRoZSBnbG9iYWwKKyAqICAgICAgICAgICAgICByZXNvdXJjZSBpbmZvcm1hdGlvbi9kaXNwYXRjaCB0YWJsZXMgZm9yIGxhdGVyIHVzZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCithY3BpX3N0YXR1cyBhY3BpX3V0X3ZhbGlkYXRlX3Jlc291cmNlKHZvaWQgKmFtbCwgdTggKiByZXR1cm5faW5kZXgpCit7CisJdTggcmVzb3VyY2VfdHlwZTsKKwl1OCByZXNvdXJjZV9pbmRleDsKKwlhY3BpX3JzX2xlbmd0aCByZXNvdXJjZV9sZW5ndGg7CisJYWNwaV9yc19sZW5ndGggbWluaW11bV9yZXNvdXJjZV9sZW5ndGg7CisKKwlBQ1BJX0ZVTkNUSU9OX0VOVFJZKCk7CisKKwkvKgorCSAqIDEpIFZhbGlkYXRlIHRoZSByZXNvdXJjZV90eXBlIGZpZWxkIChCeXRlIDApCisJICovCisJcmVzb3VyY2VfdHlwZSA9IEFDUElfR0VUOChhbWwpOworCisJLyoKKwkgKiBCeXRlIDAgY29udGFpbnMgdGhlIGRlc2NyaXB0b3IgbmFtZSAoUmVzb3VyY2UgVHlwZSkKKwkgKiBFeGFtaW5lIHRoZSBsYXJnZS9zbWFsbCBiaXQgaW4gdGhlIHJlc291cmNlIGhlYWRlcgorCSAqLworCWlmIChyZXNvdXJjZV90eXBlICYgQUNQSV9SRVNPVVJDRV9OQU1FX0xBUkdFKSB7CisKKwkJLyogVmVyaWZ5IHRoZSBsYXJnZSByZXNvdXJjZSB0eXBlIChuYW1lKSBhZ2FpbnN0IHRoZSBtYXggKi8KKworCQlpZiAocmVzb3VyY2VfdHlwZSA+IEFDUElfUkVTT1VSQ0VfTkFNRV9MQVJHRV9NQVgpIHsKKwkJCXJldHVybiAoQUVfQU1MX0lOVkFMSURfUkVTT1VSQ0VfVFlQRSk7CisJCX0KKworCQkvKgorCQkgKiBMYXJnZSBSZXNvdXJjZSBUeXBlIC0tIGJpdHMgNjowIGNvbnRhaW4gdGhlIG5hbWUKKwkJICogVHJhbnNsYXRlIHJhbmdlIDB4ODAtMHg4QiB0byBpbmRleCByYW5nZSAweDEwLTB4MUIKKwkJICovCisJCXJlc291cmNlX2luZGV4ID0gKHU4KSAocmVzb3VyY2VfdHlwZSAtIDB4NzApOworCX0gZWxzZSB7CisJCS8qCisJCSAqIFNtYWxsIFJlc291cmNlIFR5cGUgLS0gYml0cyA2OjMgY29udGFpbiB0aGUgbmFtZQorCQkgKiBTaGlmdCByYW5nZSB0byBpbmRleCByYW5nZSAweDAwLTB4MEYKKwkJICovCisJCXJlc291cmNlX2luZGV4ID0gKHU4KQorCQkgICAgKChyZXNvdXJjZV90eXBlICYgQUNQSV9SRVNPVVJDRV9OQU1FX1NNQUxMX01BU0spID4+IDMpOworCX0KKworCS8qIENoZWNrIHZhbGlkaXR5IG9mIHRoZSByZXNvdXJjZSB0eXBlLCB6ZXJvIGluZGljYXRlcyBuYW1lIGlzIGludmFsaWQgKi8KKworCWlmICghYWNwaV9nYmxfcmVzb3VyY2VfdHlwZXNbcmVzb3VyY2VfaW5kZXhdKSB7CisJCXJldHVybiAoQUVfQU1MX0lOVkFMSURfUkVTT1VSQ0VfVFlQRSk7CisJfQorCisJLyoKKwkgKiAyKSBWYWxpZGF0ZSB0aGUgcmVzb3VyY2VfbGVuZ3RoIGZpZWxkLiBUaGlzIGVuc3VyZXMgdGhhdCB0aGUgbGVuZ3RoCisJICogICAgaXMgYXQgbGVhc3QgcmVhc29uYWJsZSwgYW5kIGd1YXJhbnRlZXMgdGhhdCBpdCBpcyBub24temVyby4KKwkgKi8KKwlyZXNvdXJjZV9sZW5ndGggPSBhY3BpX3V0X2dldF9yZXNvdXJjZV9sZW5ndGgoYW1sKTsKKwltaW5pbXVtX3Jlc291cmNlX2xlbmd0aCA9IGFjcGlfZ2JsX3Jlc291cmNlX2FtbF9zaXplc1tyZXNvdXJjZV9pbmRleF07CisKKwkvKiBWYWxpZGF0ZSBiYXNlZCB1cG9uIHRoZSB0eXBlIG9mIHJlc291cmNlIC0gZml4ZWQgbGVuZ3RoIG9yIHZhcmlhYmxlICovCisKKwlzd2l0Y2ggKGFjcGlfZ2JsX3Jlc291cmNlX3R5cGVzW3Jlc291cmNlX2luZGV4XSkgeworCWNhc2UgQUNQSV9GSVhFRF9MRU5HVEg6CisKKwkJLyogRml4ZWQgbGVuZ3RoIHJlc291cmNlLCBsZW5ndGggbXVzdCBtYXRjaCBleGFjdGx5ICovCisKKwkJaWYgKHJlc291cmNlX2xlbmd0aCAhPSBtaW5pbXVtX3Jlc291cmNlX2xlbmd0aCkgeworCQkJcmV0dXJuIChBRV9BTUxfQkFEX1JFU09VUkNFX0xFTkdUSCk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIEFDUElfVkFSSUFCTEVfTEVOR1RIOgorCisJCS8qIFZhcmlhYmxlIGxlbmd0aCByZXNvdXJjZSwgbGVuZ3RoIG11c3QgYmUgYXQgbGVhc3QgdGhlIG1pbmltdW0gKi8KKworCQlpZiAocmVzb3VyY2VfbGVuZ3RoIDwgbWluaW11bV9yZXNvdXJjZV9sZW5ndGgpIHsKKwkJCXJldHVybiAoQUVfQU1MX0JBRF9SRVNPVVJDRV9MRU5HVEgpOworCQl9CisJCWJyZWFrOworCisJY2FzZSBBQ1BJX1NNQUxMX1ZBUklBQkxFX0xFTkdUSDoKKworCQkvKiBTbWFsbCB2YXJpYWJsZSBsZW5ndGggcmVzb3VyY2UsIGxlbmd0aCBjYW4gYmUgKE1pbikgb3IgKE1pbi0xKSAqLworCisJCWlmICgocmVzb3VyY2VfbGVuZ3RoID4gbWluaW11bV9yZXNvdXJjZV9sZW5ndGgpIHx8CisJCSAgICAocmVzb3VyY2VfbGVuZ3RoIDwgKG1pbmltdW1fcmVzb3VyY2VfbGVuZ3RoIC0gMSkpKSB7CisJCQlyZXR1cm4gKEFFX0FNTF9CQURfUkVTT1VSQ0VfTEVOR1RIKTsKKwkJfQorCQlicmVhazsKKworCWRlZmF1bHQ6CisKKwkJLyogU2hvdWxkbid0IGhhcHBlbiAoYmVjYXVzZSBvZiB2YWxpZGF0aW9uIGVhcmxpZXIpLCBidXQgYmUgc3VyZSAqLworCisJCXJldHVybiAoQUVfQU1MX0lOVkFMSURfUkVTT1VSQ0VfVFlQRSk7CisJfQorCisJLyogT3B0aW9uYWxseSByZXR1cm4gdGhlIHJlc291cmNlIHRhYmxlIGluZGV4ICovCisKKwlpZiAocmV0dXJuX2luZGV4KSB7CisJCSpyZXR1cm5faW5kZXggPSByZXNvdXJjZV9pbmRleDsKKwl9CisKKwlyZXR1cm4gKEFFX09LKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV91dF9nZXRfcmVzb3VyY2VfdHlwZQorICoKKyAqIFBBUkFNRVRFUlM6ICBBbWwgICAgICAgICAgICAgLSBQb2ludGVyIHRvIHRoZSByYXcgQU1MIHJlc291cmNlIGRlc2NyaXB0b3IKKyAqCisgKiBSRVRVUk46ICAgICAgVGhlIFJlc291cmNlIFR5cGUgd2l0aCBubyBleHRyYW5lb3VzIGJpdHMgKGV4Y2VwdCB0aGUKKyAqICAgICAgICAgICAgICBMYXJnZS9TbWFsbCBkZXNjcmlwdG9yIGJpdCAtLSB0aGlzIGlzIGxlZnQgYWxvbmUpCisgKgorICogREVTQ1JJUFRJT046IEV4dHJhY3QgdGhlIFJlc291cmNlIFR5cGUvTmFtZSBmcm9tIHRoZSBmaXJzdCBieXRlIG9mCisgKiAgICAgICAgICAgICAgYSByZXNvdXJjZSBkZXNjcmlwdG9yLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3U4IGFjcGlfdXRfZ2V0X3Jlc291cmNlX3R5cGUodm9pZCAqYW1sKQoreworCUFDUElfRlVOQ1RJT05fRU5UUlkoKTsKKworCS8qCisJICogQnl0ZSAwIGNvbnRhaW5zIHRoZSBkZXNjcmlwdG9yIG5hbWUgKFJlc291cmNlIFR5cGUpCisJICogRXhhbWluZSB0aGUgbGFyZ2Uvc21hbGwgYml0IGluIHRoZSByZXNvdXJjZSBoZWFkZXIKKwkgKi8KKwlpZiAoQUNQSV9HRVQ4KGFtbCkgJiBBQ1BJX1JFU09VUkNFX05BTUVfTEFSR0UpIHsKKworCQkvKiBMYXJnZSBSZXNvdXJjZSBUeXBlIC0tIGJpdHMgNjowIGNvbnRhaW4gdGhlIG5hbWUgKi8KKworCQlyZXR1cm4gKEFDUElfR0VUOChhbWwpKTsKKwl9IGVsc2UgeworCQkvKiBTbWFsbCBSZXNvdXJjZSBUeXBlIC0tIGJpdHMgNjozIGNvbnRhaW4gdGhlIG5hbWUgKi8KKworCQlyZXR1cm4gKCh1OCkgKEFDUElfR0VUOChhbWwpICYgQUNQSV9SRVNPVVJDRV9OQU1FX1NNQUxMX01BU0spKTsKKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfdXRfZ2V0X3Jlc291cmNlX2xlbmd0aAorICoKKyAqIFBBUkFNRVRFUlM6ICBBbWwgICAgICAgICAgICAgLSBQb2ludGVyIHRvIHRoZSByYXcgQU1MIHJlc291cmNlIGRlc2NyaXB0b3IKKyAqCisgKiBSRVRVUk46ICAgICAgQnl0ZSBMZW5ndGgKKyAqCisgKiBERVNDUklQVElPTjogR2V0IHRoZSAiUmVzb3VyY2UgTGVuZ3RoIiBvZiBhIHJhdyBBTUwgZGVzY3JpcHRvci4gQnkKKyAqICAgICAgICAgICAgICBkZWZpbml0aW9uLCB0aGlzIGRvZXMgbm90IGluY2x1ZGUgdGhlIHNpemUgb2YgdGhlIGRlc2NyaXB0b3IKKyAqICAgICAgICAgICAgICBoZWFkZXIgb3IgdGhlIGxlbmd0aCBmaWVsZCBpdHNlbGYuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordTE2IGFjcGlfdXRfZ2V0X3Jlc291cmNlX2xlbmd0aCh2b2lkICphbWwpCit7CisJYWNwaV9yc19sZW5ndGggcmVzb3VyY2VfbGVuZ3RoOworCisJQUNQSV9GVU5DVElPTl9FTlRSWSgpOworCisJLyoKKwkgKiBCeXRlIDAgY29udGFpbnMgdGhlIGRlc2NyaXB0b3IgbmFtZSAoUmVzb3VyY2UgVHlwZSkKKwkgKiBFeGFtaW5lIHRoZSBsYXJnZS9zbWFsbCBiaXQgaW4gdGhlIHJlc291cmNlIGhlYWRlcgorCSAqLworCWlmIChBQ1BJX0dFVDgoYW1sKSAmIEFDUElfUkVTT1VSQ0VfTkFNRV9MQVJHRSkgeworCisJCS8qIExhcmdlIFJlc291cmNlIHR5cGUgLS0gYnl0ZXMgMS0yIGNvbnRhaW4gdGhlIDE2LWJpdCBsZW5ndGggKi8KKworCQlBQ1BJX01PVkVfMTZfVE9fMTYoJnJlc291cmNlX2xlbmd0aCwgQUNQSV9BRERfUFRSKHU4LCBhbWwsIDEpKTsKKworCX0gZWxzZSB7CisJCS8qIFNtYWxsIFJlc291cmNlIHR5cGUgLS0gYml0cyAyOjAgb2YgYnl0ZSAwIGNvbnRhaW4gdGhlIGxlbmd0aCAqLworCisJCXJlc291cmNlX2xlbmd0aCA9ICh1MTYpIChBQ1BJX0dFVDgoYW1sKSAmCisJCQkJCSBBQ1BJX1JFU09VUkNFX05BTUVfU01BTExfTEVOR1RIX01BU0spOworCX0KKworCXJldHVybiAocmVzb3VyY2VfbGVuZ3RoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV91dF9nZXRfcmVzb3VyY2VfaGVhZGVyX2xlbmd0aAorICoKKyAqIFBBUkFNRVRFUlM6ICBBbWwgICAgICAgICAgICAgLSBQb2ludGVyIHRvIHRoZSByYXcgQU1MIHJlc291cmNlIGRlc2NyaXB0b3IKKyAqCisgKiBSRVRVUk46ICAgICAgTGVuZ3RoIG9mIHRoZSBBTUwgaGVhZGVyIChkZXBlbmRzIG9uIGxhcmdlL3NtYWxsIGRlc2NyaXB0b3IpCisgKgorICogREVTQ1JJUFRJT046IEdldCB0aGUgbGVuZ3RoIG9mIHRoZSBoZWFkZXIgZm9yIHRoaXMgcmVzb3VyY2UuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordTggYWNwaV91dF9nZXRfcmVzb3VyY2VfaGVhZGVyX2xlbmd0aCh2b2lkICphbWwpCit7CisJQUNQSV9GVU5DVElPTl9FTlRSWSgpOworCisJLyogRXhhbWluZSB0aGUgbGFyZ2Uvc21hbGwgYml0IGluIHRoZSByZXNvdXJjZSBoZWFkZXIgKi8KKworCWlmIChBQ1BJX0dFVDgoYW1sKSAmIEFDUElfUkVTT1VSQ0VfTkFNRV9MQVJHRSkgeworCQlyZXR1cm4gKHNpemVvZihzdHJ1Y3QgYW1sX3Jlc291cmNlX2xhcmdlX2hlYWRlcikpOworCX0gZWxzZSB7CisJCXJldHVybiAoc2l6ZW9mKHN0cnVjdCBhbWxfcmVzb3VyY2Vfc21hbGxfaGVhZGVyKSk7CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X2dldF9kZXNjcmlwdG9yX2xlbmd0aAorICoKKyAqIFBBUkFNRVRFUlM6ICBBbWwgICAgICAgICAgICAgLSBQb2ludGVyIHRvIHRoZSByYXcgQU1MIHJlc291cmNlIGRlc2NyaXB0b3IKKyAqCisgKiBSRVRVUk46ICAgICAgQnl0ZSBsZW5ndGgKKyAqCisgKiBERVNDUklQVElPTjogR2V0IHRoZSB0b3RhbCBieXRlIGxlbmd0aCBvZiBhIHJhdyBBTUwgZGVzY3JpcHRvciwgaW5jbHVkaW5nIHRoZQorICogICAgICAgICAgICAgIGxlbmd0aCBvZiB0aGUgZGVzY3JpcHRvciBoZWFkZXIgYW5kIHRoZSBsZW5ndGggZmllbGQgaXRzZWxmLgorICogICAgICAgICAgICAgIFVzZWQgdG8gd2FsayBkZXNjcmlwdG9yIGxpc3RzLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3UzMiBhY3BpX3V0X2dldF9kZXNjcmlwdG9yX2xlbmd0aCh2b2lkICphbWwpCit7CisJQUNQSV9GVU5DVElPTl9FTlRSWSgpOworCisJLyoKKwkgKiBHZXQgdGhlIFJlc291cmNlIExlbmd0aCAoZG9lcyBub3QgaW5jbHVkZSBoZWFkZXIgbGVuZ3RoKSBhbmQgYWRkCisJICogdGhlIGhlYWRlciBsZW5ndGggKGRlcGVuZHMgb24gaWYgdGhpcyBpcyBhIHNtYWxsIG9yIGxhcmdlIHJlc291cmNlKQorCSAqLworCXJldHVybiAoYWNwaV91dF9nZXRfcmVzb3VyY2VfbGVuZ3RoKGFtbCkgKworCQlhY3BpX3V0X2dldF9yZXNvdXJjZV9oZWFkZXJfbGVuZ3RoKGFtbCkpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X2dldF9yZXNvdXJjZV9lbmRfdGFnCisgKgorICogUEFSQU1FVEVSUzogIG9ial9kZXNjICAgICAgICAtIFRoZSByZXNvdXJjZSB0ZW1wbGF0ZSBidWZmZXIgb2JqZWN0CisgKiAgICAgICAgICAgICAgZW5kX3RhZyAgICAgICAgIC0gV2hlcmUgdGhlIHBvaW50ZXIgdG8gdGhlIGVuZF90YWcgaXMgcmV0dXJuZWQKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzLCBwb2ludGVyIHRvIHRoZSBlbmQgdGFnCisgKgorICogREVTQ1JJUFRJT046IEZpbmQgdGhlIGVuZF90YWcgcmVzb3VyY2UgZGVzY3JpcHRvciBpbiBhbiBBTUwgcmVzb3VyY2UgdGVtcGxhdGUKKyAqICAgICAgICAgICAgICBOb3RlOiBhbGxvd3MgYSBidWZmZXIgbGVuZ3RoIG9mIHplcm8uCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworYWNwaV9zdGF0dXMKK2FjcGlfdXRfZ2V0X3Jlc291cmNlX2VuZF90YWcodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqIG9ial9kZXNjLAorCQkJICAgICB1OCAqKiBlbmRfdGFnKQoreworCWFjcGlfc3RhdHVzIHN0YXR1czsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0UodXRfZ2V0X3Jlc291cmNlX2VuZF90YWcpOworCisJLyogQWxsb3cgYSBidWZmZXIgbGVuZ3RoIG9mIHplcm8gKi8KKworCWlmICghb2JqX2Rlc2MtPmJ1ZmZlci5sZW5ndGgpIHsKKwkJKmVuZF90YWcgPSBvYmpfZGVzYy0+YnVmZmVyLnBvaW50ZXI7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CisJfQorCisJLyogVmFsaWRhdGUgdGhlIHRlbXBsYXRlIGFuZCBnZXQgYSBwb2ludGVyIHRvIHRoZSBlbmRfdGFnICovCisKKwlzdGF0dXMgPSBhY3BpX3V0X3dhbGtfYW1sX3Jlc291cmNlcyhvYmpfZGVzYy0+YnVmZmVyLnBvaW50ZXIsCisJCQkJCSAgICBvYmpfZGVzYy0+YnVmZmVyLmxlbmd0aCwgTlVMTCwKKwkJCQkJICAgICh2b2lkICoqKWVuZF90YWcpOworCisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL3V0c3RhdGUuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvdXRzdGF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0NDBjOTUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL3V0c3RhdGUuYwpAQCAtMCwwICsxLDM0NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBNb2R1bGUgTmFtZTogdXRzdGF0ZSAtIHN0YXRlIG9iamVjdCBzdXBwb3J0IHByb2NlZHVyZXMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwOCwgSW50ZWwgQ29ycC4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKKyAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIGF0IG1pbmltdW0gYSBkaXNjbGFpbWVyCisgKiAgICBzdWJzdGFudGlhbGx5IHNpbWlsYXIgdG8gdGhlICJOTyBXQVJSQU5UWSIgZGlzY2xhaW1lciBiZWxvdworICogICAgKCJEaXNjbGFpbWVyIikgYW5kIGFueSByZWRpc3RyaWJ1dGlvbiBtdXN0IGJlIGNvbmRpdGlvbmVkIHVwb24KKyAqICAgIGluY2x1ZGluZyBhIHN1YnN0YW50aWFsbHkgc2ltaWxhciBEaXNjbGFpbWVyIHJlcXVpcmVtZW50IGZvciBmdXJ0aGVyCisgKiAgICBiaW5hcnkgcmVkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMKKyAqICAgIG9mIGFueSBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogTk8gV0FSUkFOVFkKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HCisgKiBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KKyAqLworCisjaW5jbHVkZSA8YWNwaS9hY3BpLmg+CisjaW5jbHVkZSAiYWNjb21tb24uaCIKKworI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfVVRJTElUSUVTCitBQ1BJX01PRFVMRV9OQU1FKCJ1dHN0YXRlIikKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV91dF9jcmVhdGVfcGtnX3N0YXRlX2FuZF9wdXNoCisgKgorICogUEFSQU1FVEVSUzogIE9iamVjdCAgICAgICAgICAtIE9iamVjdCB0byBiZSBhZGRlZCB0byB0aGUgbmV3IHN0YXRlCisgKiAgICAgICAgICAgICAgQWN0aW9uICAgICAgICAgIC0gSW5jcmVtZW50L0RlY3JlbWVudAorICogICAgICAgICAgICAgIHN0YXRlX2xpc3QgICAgICAtIExpc3QgdGhlIHN0YXRlIHdpbGwgYmUgYWRkZWQgdG8KKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IENyZWF0ZSBhIG5ldyBzdGF0ZSBhbmQgcHVzaCBpdAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCithY3BpX3N0YXR1cworYWNwaV91dF9jcmVhdGVfcGtnX3N0YXRlX2FuZF9wdXNoKHZvaWQgKmludGVybmFsX29iamVjdCwKKwkJCQkgIHZvaWQgKmV4dGVybmFsX29iamVjdCwKKwkJCQkgIHUxNiBpbmRleCwKKwkJCQkgIHVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSAqKnN0YXRlX2xpc3QpCit7CisJdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICpzdGF0ZTsKKworCUFDUElfRlVOQ1RJT05fRU5UUlkoKTsKKworCXN0YXRlID0KKwkgICAgYWNwaV91dF9jcmVhdGVfcGtnX3N0YXRlKGludGVybmFsX29iamVjdCwgZXh0ZXJuYWxfb2JqZWN0LCBpbmRleCk7CisJaWYgKCFzdGF0ZSkgeworCQlyZXR1cm4gKEFFX05PX01FTU9SWSk7CisJfQorCisJYWNwaV91dF9wdXNoX2dlbmVyaWNfc3RhdGUoc3RhdGVfbGlzdCwgc3RhdGUpOworCXJldHVybiAoQUVfT0spOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X3B1c2hfZ2VuZXJpY19zdGF0ZQorICoKKyAqIFBBUkFNRVRFUlM6ICBsaXN0X2hlYWQgICAgICAgICAgIC0gSGVhZCBvZiB0aGUgc3RhdGUgc3RhY2sKKyAqICAgICAgICAgICAgICBTdGF0ZSAgICAgICAgICAgICAgIC0gU3RhdGUgb2JqZWN0IHRvIHB1c2gKKyAqCisgKiBSRVRVUk46ICAgICAgTm9uZQorICoKKyAqIERFU0NSSVBUSU9OOiBQdXNoIGEgc3RhdGUgb2JqZWN0IG9udG8gYSBzdGF0ZSBzdGFjaworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQKK2FjcGlfdXRfcHVzaF9nZW5lcmljX3N0YXRlKHVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSAqKmxpc3RfaGVhZCwKKwkJCSAgIHVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSAqc3RhdGUpCit7CisJQUNQSV9GVU5DVElPTl9UUkFDRSh1dF9wdXNoX2dlbmVyaWNfc3RhdGUpOworCisJLyogUHVzaCB0aGUgc3RhdGUgb2JqZWN0IG9udG8gdGhlIGZyb250IG9mIHRoZSBsaXN0IChzdGFjaykgKi8KKworCXN0YXRlLT5jb21tb24ubmV4dCA9ICpsaXN0X2hlYWQ7CisJKmxpc3RfaGVhZCA9IHN0YXRlOworCisJcmV0dXJuX1ZPSUQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfdXRfcG9wX2dlbmVyaWNfc3RhdGUKKyAqCisgKiBQQVJBTUVURVJTOiAgbGlzdF9oZWFkICAgICAgICAgICAtIEhlYWQgb2YgdGhlIHN0YXRlIHN0YWNrCisgKgorICogUkVUVVJOOiAgICAgIFRoZSBwb3BwZWQgc3RhdGUgb2JqZWN0CisgKgorICogREVTQ1JJUFRJT046IFBvcCBhIHN0YXRlIG9iamVjdCBmcm9tIGEgc3RhdGUgc3RhY2sKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgKmFjcGlfdXRfcG9wX2dlbmVyaWNfc3RhdGUodW5pb24gYWNwaV9nZW5lcmljX3N0YXRlCisJCQkJCQkgICAgKipsaXN0X2hlYWQpCit7CisJdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICpzdGF0ZTsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0UodXRfcG9wX2dlbmVyaWNfc3RhdGUpOworCisJLyogUmVtb3ZlIHRoZSBzdGF0ZSBvYmplY3QgYXQgdGhlIGhlYWQgb2YgdGhlIGxpc3QgKHN0YWNrKSAqLworCisJc3RhdGUgPSAqbGlzdF9oZWFkOworCWlmIChzdGF0ZSkgeworCisJCS8qIFVwZGF0ZSB0aGUgbGlzdCBoZWFkICovCisKKwkJKmxpc3RfaGVhZCA9IHN0YXRlLT5jb21tb24ubmV4dDsKKwl9CisKKwlyZXR1cm5fUFRSKHN0YXRlKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV91dF9jcmVhdGVfZ2VuZXJpY19zdGF0ZQorICoKKyAqIFBBUkFNRVRFUlM6ICBOb25lCisgKgorICogUkVUVVJOOiAgICAgIFRoZSBuZXcgc3RhdGUgb2JqZWN0LiBOVUxMIG9uIGZhaWx1cmUuCisgKgorICogREVTQ1JJUFRJT046IENyZWF0ZSBhIGdlbmVyaWMgc3RhdGUgb2JqZWN0LiAgQXR0ZW1wdCB0byBvYnRhaW4gb25lIGZyb20KKyAqICAgICAgICAgICAgICB0aGUgZ2xvYmFsIHN0YXRlIGNhY2hlOyAgSWYgbm9uZSBhdmFpbGFibGUsIGNyZWF0ZSBhIG5ldyBvbmUuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICphY3BpX3V0X2NyZWF0ZV9nZW5lcmljX3N0YXRlKHZvaWQpCit7CisJdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICpzdGF0ZTsKKworCUFDUElfRlVOQ1RJT05fRU5UUlkoKTsKKworCXN0YXRlID0gYWNwaV9vc19hY3F1aXJlX29iamVjdChhY3BpX2dibF9zdGF0ZV9jYWNoZSk7CisJaWYgKHN0YXRlKSB7CisKKwkJLyogSW5pdGlhbGl6ZSAqLworCQltZW1zZXQoc3RhdGUsIDAsIHNpemVvZih1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUpKTsKKwkJc3RhdGUtPmNvbW1vbi5kZXNjcmlwdG9yX3R5cGUgPSBBQ1BJX0RFU0NfVFlQRV9TVEFURTsKKwl9CisKKwlyZXR1cm4gKHN0YXRlKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV91dF9jcmVhdGVfdGhyZWFkX3N0YXRlCisgKgorICogUEFSQU1FVEVSUzogIE5vbmUKKyAqCisgKiBSRVRVUk46ICAgICAgTmV3IFRocmVhZCBTdGF0ZS4gTlVMTCBvbiBmYWlsdXJlCisgKgorICogREVTQ1JJUFRJT046IENyZWF0ZSBhICJUaHJlYWQgU3RhdGUiIC0gYSBmbGF2b3Igb2YgdGhlIGdlbmVyaWMgc3RhdGUgdXNlZAorICogICAgICAgICAgICAgIHRvIHRyYWNrIHBlci10aHJlYWQgaW5mbyBkdXJpbmcgbWV0aG9kIGV4ZWN1dGlvbgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0cnVjdCBhY3BpX3RocmVhZF9zdGF0ZSAqYWNwaV91dF9jcmVhdGVfdGhyZWFkX3N0YXRlKHZvaWQpCit7CisJdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICpzdGF0ZTsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0UodXRfY3JlYXRlX3RocmVhZF9zdGF0ZSk7CisKKwkvKiBDcmVhdGUgdGhlIGdlbmVyaWMgc3RhdGUgb2JqZWN0ICovCisKKwlzdGF0ZSA9IGFjcGlfdXRfY3JlYXRlX2dlbmVyaWNfc3RhdGUoKTsKKwlpZiAoIXN0YXRlKSB7CisJCXJldHVybl9QVFIoTlVMTCk7CisJfQorCisJLyogSW5pdCBmaWVsZHMgc3BlY2lmaWMgdG8gdGhlIHVwZGF0ZSBzdHJ1Y3QgKi8KKworCXN0YXRlLT5jb21tb24uZGVzY3JpcHRvcl90eXBlID0gQUNQSV9ERVNDX1RZUEVfU1RBVEVfVEhSRUFEOworCXN0YXRlLT50aHJlYWQudGhyZWFkX2lkID0gYWNwaV9vc19nZXRfdGhyZWFkX2lkKCk7CisKKwkvKiBDaGVjayBmb3IgaW52YWxpZCB0aHJlYWQgSUQgLSB6ZXJvIGlzIHZlcnkgYmFkLCBpdCB3aWxsIGJyZWFrIHRoaW5ncyAqLworCisJaWYgKCFzdGF0ZS0+dGhyZWFkLnRocmVhZF9pZCkgeworCQlBQ1BJX0VSUk9SKChBRV9JTkZPLCAiSW52YWxpZCB6ZXJvIElEIGZyb20gQWNwaU9zR2V0VGhyZWFkSWQiKSk7CisJCXN0YXRlLT50aHJlYWQudGhyZWFkX2lkID0gKGFjcGlfdGhyZWFkX2lkKSAxOworCX0KKworCXJldHVybl9QVFIoKHN0cnVjdCBhY3BpX3RocmVhZF9zdGF0ZSAqKXN0YXRlKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV91dF9jcmVhdGVfdXBkYXRlX3N0YXRlCisgKgorICogUEFSQU1FVEVSUzogIE9iamVjdCAgICAgICAgICAtIEluaXRpYWwgT2JqZWN0IHRvIGJlIGluc3RhbGxlZCBpbiB0aGUgc3RhdGUKKyAqICAgICAgICAgICAgICBBY3Rpb24gICAgICAgICAgLSBVcGRhdGUgYWN0aW9uIHRvIGJlIHBlcmZvcm1lZAorICoKKyAqIFJFVFVSTjogICAgICBOZXcgc3RhdGUgb2JqZWN0LCBudWxsIG9uIGZhaWx1cmUKKyAqCisgKiBERVNDUklQVElPTjogQ3JlYXRlIGFuICJVcGRhdGUgU3RhdGUiIC0gYSBmbGF2b3Igb2YgdGhlIGdlbmVyaWMgc3RhdGUgdXNlZAorICogICAgICAgICAgICAgIHRvIHVwZGF0ZSByZWZlcmVuY2UgY291bnRzIGFuZCBkZWxldGUgY29tcGxleCBvYmplY3RzIHN1Y2gKKyAqICAgICAgICAgICAgICBhcyBwYWNrYWdlcy4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgKmFjcGlfdXRfY3JlYXRlX3VwZGF0ZV9zdGF0ZSh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0CisJCQkJCQkgICAgICAqb2JqZWN0LCB1MTYgYWN0aW9uKQoreworCXVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSAqc3RhdGU7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUih1dF9jcmVhdGVfdXBkYXRlX3N0YXRlLCBvYmplY3QpOworCisJLyogQ3JlYXRlIHRoZSBnZW5lcmljIHN0YXRlIG9iamVjdCAqLworCisJc3RhdGUgPSBhY3BpX3V0X2NyZWF0ZV9nZW5lcmljX3N0YXRlKCk7CisJaWYgKCFzdGF0ZSkgeworCQlyZXR1cm5fUFRSKE5VTEwpOworCX0KKworCS8qIEluaXQgZmllbGRzIHNwZWNpZmljIHRvIHRoZSB1cGRhdGUgc3RydWN0ICovCisKKwlzdGF0ZS0+Y29tbW9uLmRlc2NyaXB0b3JfdHlwZSA9IEFDUElfREVTQ19UWVBFX1NUQVRFX1VQREFURTsKKwlzdGF0ZS0+dXBkYXRlLm9iamVjdCA9IG9iamVjdDsKKwlzdGF0ZS0+dXBkYXRlLnZhbHVlID0gYWN0aW9uOworCisJcmV0dXJuX1BUUihzdGF0ZSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfdXRfY3JlYXRlX3BrZ19zdGF0ZQorICoKKyAqIFBBUkFNRVRFUlM6ICBPYmplY3QgICAgICAgICAgLSBJbml0aWFsIE9iamVjdCB0byBiZSBpbnN0YWxsZWQgaW4gdGhlIHN0YXRlCisgKiAgICAgICAgICAgICAgQWN0aW9uICAgICAgICAgIC0gVXBkYXRlIGFjdGlvbiB0byBiZSBwZXJmb3JtZWQKKyAqCisgKiBSRVRVUk46ICAgICAgTmV3IHN0YXRlIG9iamVjdCwgbnVsbCBvbiBmYWlsdXJlCisgKgorICogREVTQ1JJUFRJT046IENyZWF0ZSBhICJQYWNrYWdlIFN0YXRlIgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3VuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSAqYWNwaV91dF9jcmVhdGVfcGtnX3N0YXRlKHZvaWQgKmludGVybmFsX29iamVjdCwKKwkJCQkJCSAgIHZvaWQgKmV4dGVybmFsX29iamVjdCwKKwkJCQkJCSAgIHUxNiBpbmRleCkKK3sKKwl1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgKnN0YXRlOworCisJQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIodXRfY3JlYXRlX3BrZ19zdGF0ZSwgaW50ZXJuYWxfb2JqZWN0KTsKKworCS8qIENyZWF0ZSB0aGUgZ2VuZXJpYyBzdGF0ZSBvYmplY3QgKi8KKworCXN0YXRlID0gYWNwaV91dF9jcmVhdGVfZ2VuZXJpY19zdGF0ZSgpOworCWlmICghc3RhdGUpIHsKKwkJcmV0dXJuX1BUUihOVUxMKTsKKwl9CisKKwkvKiBJbml0IGZpZWxkcyBzcGVjaWZpYyB0byB0aGUgdXBkYXRlIHN0cnVjdCAqLworCisJc3RhdGUtPmNvbW1vbi5kZXNjcmlwdG9yX3R5cGUgPSBBQ1BJX0RFU0NfVFlQRV9TVEFURV9QQUNLQUdFOworCXN0YXRlLT5wa2cuc291cmNlX29iamVjdCA9ICh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICopaW50ZXJuYWxfb2JqZWN0OworCXN0YXRlLT5wa2cuZGVzdF9vYmplY3QgPSBleHRlcm5hbF9vYmplY3Q7CisJc3RhdGUtPnBrZy5pbmRleCA9IGluZGV4OworCXN0YXRlLT5wa2cubnVtX3BhY2thZ2VzID0gMTsKKworCXJldHVybl9QVFIoc3RhdGUpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X2NyZWF0ZV9jb250cm9sX3N0YXRlCisgKgorICogUEFSQU1FVEVSUzogIE5vbmUKKyAqCisgKiBSRVRVUk46ICAgICAgTmV3IHN0YXRlIG9iamVjdCwgbnVsbCBvbiBmYWlsdXJlCisgKgorICogREVTQ1JJUFRJT046IENyZWF0ZSBhICJDb250cm9sIFN0YXRlIiAtIGEgZmxhdm9yIG9mIHRoZSBnZW5lcmljIHN0YXRlIHVzZWQKKyAqICAgICAgICAgICAgICB0byBzdXBwb3J0IG5lc3RlZCBJRi9XSElMRSBjb25zdHJ1Y3RzIGluIHRoZSBBTUwuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICphY3BpX3V0X2NyZWF0ZV9jb250cm9sX3N0YXRlKHZvaWQpCit7CisJdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICpzdGF0ZTsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0UodXRfY3JlYXRlX2NvbnRyb2xfc3RhdGUpOworCisJLyogQ3JlYXRlIHRoZSBnZW5lcmljIHN0YXRlIG9iamVjdCAqLworCisJc3RhdGUgPSBhY3BpX3V0X2NyZWF0ZV9nZW5lcmljX3N0YXRlKCk7CisJaWYgKCFzdGF0ZSkgeworCQlyZXR1cm5fUFRSKE5VTEwpOworCX0KKworCS8qIEluaXQgZmllbGRzIHNwZWNpZmljIHRvIHRoZSBjb250cm9sIHN0cnVjdCAqLworCisJc3RhdGUtPmNvbW1vbi5kZXNjcmlwdG9yX3R5cGUgPSBBQ1BJX0RFU0NfVFlQRV9TVEFURV9DT05UUk9MOworCXN0YXRlLT5jb21tb24uc3RhdGUgPSBBQ1BJX0NPTlRST0xfQ09ORElUSU9OQUxfRVhFQ1VUSU5HOworCisJcmV0dXJuX1BUUihzdGF0ZSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfdXRfZGVsZXRlX2dlbmVyaWNfc3RhdGUKKyAqCisgKiBQQVJBTUVURVJTOiAgU3RhdGUgICAgICAgICAgICAgICAtIFRoZSBzdGF0ZSBvYmplY3QgdG8gYmUgZGVsZXRlZAorICoKKyAqIFJFVFVSTjogICAgICBOb25lCisgKgorICogREVTQ1JJUFRJT046IFJlbGVhc2UgYSBzdGF0ZSBvYmplY3QgdG8gdGhlIHN0YXRlIGNhY2hlLiBOVUxMIHN0YXRlIG9iamVjdHMKKyAqICAgICAgICAgICAgICBhcmUgaWdub3JlZC4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIGFjcGlfdXRfZGVsZXRlX2dlbmVyaWNfc3RhdGUodW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICpzdGF0ZSkKK3sKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKHV0X2RlbGV0ZV9nZW5lcmljX3N0YXRlKTsKKworCS8qIElnbm9yZSBudWxsIHN0YXRlICovCisKKwlpZiAoc3RhdGUpIHsKKwkJKHZvaWQpYWNwaV9vc19yZWxlYXNlX29iamVjdChhY3BpX2dibF9zdGF0ZV9jYWNoZSwgc3RhdGUpOworCX0KKwlyZXR1cm5fVk9JRDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvdXR4ZmFjZS5jIGIvZHJpdmVycy9hY3BpL2FjcGljYS91dHhmYWNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDc4YTIyNzIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL3V0eGZhY2UuYwpAQCAtMCwwICsxLDUxMiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIE1vZHVsZSBOYW1lOiB1dHhmYWNlIC0gRXh0ZXJuYWwgaW50ZXJmYWNlcyBmb3IgImdsb2JhbCIgQUNQSSBmdW5jdGlvbnMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA4LCBJbnRlbCBDb3JwLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAorICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgYXQgbWluaW11bSBhIGRpc2NsYWltZXIKKyAqICAgIHN1YnN0YW50aWFsbHkgc2ltaWxhciB0byB0aGUgIk5PIFdBUlJBTlRZIiBkaXNjbGFpbWVyIGJlbG93CisgKiAgICAoIkRpc2NsYWltZXIiKSBhbmQgYW55IHJlZGlzdHJpYnV0aW9uIG11c3QgYmUgY29uZGl0aW9uZWQgdXBvbgorICogICAgaW5jbHVkaW5nIGEgc3Vic3RhbnRpYWxseSBzaW1pbGFyIERpc2NsYWltZXIgcmVxdWlyZW1lbnQgZm9yIGZ1cnRoZXIKKyAqICAgIGJpbmFyeSByZWRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcworICogICAgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBOTyBXQVJSQU5UWQorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcKKyAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgorICovCisKKyNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KKyNpbmNsdWRlICJhY2NvbW1vbi5oIgorI2luY2x1ZGUgImFjZXZlbnRzLmgiCisjaW5jbHVkZSAiYWNuYW1lc3AuaCIKKyNpbmNsdWRlICJhY2RlYnVnLmgiCisjaW5jbHVkZSAiYWN0YWJsZXMuaCIKKworI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfVVRJTElUSUVTCitBQ1BJX01PRFVMRV9OQU1FKCJ1dHhmYWNlIikKKworI2lmbmRlZiBBQ1BJX0FTTF9DT01QSUxFUgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9pbml0aWFsaXplX3N1YnN5c3RlbQorICoKKyAqIFBBUkFNRVRFUlM6ICBOb25lCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBJbml0aWFsaXplcyBhbGwgZ2xvYmFsIHZhcmlhYmxlcy4gIFRoaXMgaXMgdGhlIGZpcnN0IGZ1bmN0aW9uCisgKiAgICAgICAgICAgICAgY2FsbGVkLCBzbyBhbnkgZWFybHkgaW5pdGlhbGl6YXRpb24gYmVsb25ncyBoZXJlLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCithY3BpX3N0YXR1cyBfX2luaXQgYWNwaV9pbml0aWFsaXplX3N1YnN5c3RlbSh2b2lkKQoreworCWFjcGlfc3RhdHVzIHN0YXR1czsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0UoYWNwaV9pbml0aWFsaXplX3N1YnN5c3RlbSk7CisKKwlhY3BpX2dibF9zdGFydHVwX2ZsYWdzID0gQUNQSV9TVUJTWVNURU1fSU5JVElBTElaRTsKKwlBQ1BJX0RFQlVHX0VYRUMoYWNwaV91dF9pbml0X3N0YWNrX3B0cl90cmFjZSgpKTsKKworCS8qIEluaXRpYWxpemUgdGhlIE9TLURlcGVuZGVudCBsYXllciAqLworCisJc3RhdHVzID0gYWNwaV9vc19pbml0aWFsaXplKCk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCUFDUElfRVhDRVBUSU9OKChBRV9JTkZPLCBzdGF0dXMsICJEdXJpbmcgT1NMIGluaXRpYWxpemF0aW9uIikpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKKwl9CisKKwkvKiBJbml0aWFsaXplIGFsbCBnbG9iYWxzIHVzZWQgYnkgdGhlIHN1YnN5c3RlbSAqLworCisJc3RhdHVzID0gYWNwaV91dF9pbml0X2dsb2JhbHMoKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJQUNQSV9FWENFUFRJT04oKEFFX0lORk8sIHN0YXR1cywKKwkJCQkiRHVyaW5nIGluaXRpYWxpemF0aW9uIG9mIGdsb2JhbHMiKSk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworCX0KKworCS8qIENyZWF0ZSB0aGUgZGVmYXVsdCBtdXRleCBvYmplY3RzICovCisKKwlzdGF0dXMgPSBhY3BpX3V0X211dGV4X2luaXRpYWxpemUoKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJQUNQSV9FWENFUFRJT04oKEFFX0lORk8sIHN0YXR1cywKKwkJCQkiRHVyaW5nIEdsb2JhbCBNdXRleCBjcmVhdGlvbiIpKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CisJfQorCisJLyoKKwkgKiBJbml0aWFsaXplIHRoZSBuYW1lc3BhY2UgbWFuYWdlciBhbmQKKwkgKiB0aGUgcm9vdCBvZiB0aGUgbmFtZXNwYWNlIHRyZWUKKwkgKi8KKwlzdGF0dXMgPSBhY3BpX25zX3Jvb3RfaW5pdGlhbGl6ZSgpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlBQ1BJX0VYQ0VQVElPTigoQUVfSU5GTywgc3RhdHVzLAorCQkJCSJEdXJpbmcgTmFtZXNwYWNlIGluaXRpYWxpemF0aW9uIikpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKKwl9CisKKwkvKiBJZiBjb25maWd1cmVkLCBpbml0aWFsaXplIHRoZSBBTUwgZGVidWdnZXIgKi8KKworCUFDUElfREVCVUdHRVJfRVhFQyhzdGF0dXMgPSBhY3BpX2RiX2luaXRpYWxpemUoKSk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfZW5hYmxlX3N1YnN5c3RlbQorICoKKyAqIFBBUkFNRVRFUlM6ICBGbGFncyAgICAgICAgICAgLSBJbml0L2VuYWJsZSBPcHRpb25zCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBDb21wbGV0ZXMgdGhlIHN1YnN5c3RlbSBpbml0aWFsaXphdGlvbiBpbmNsdWRpbmcgaGFyZHdhcmUuCisgKiAgICAgICAgICAgICAgUHV0cyBzeXN0ZW0gaW50byBBQ1BJIG1vZGUgaWYgaXQgaXNuJ3QgYWxyZWFkeS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYWNwaV9zdGF0dXMgYWNwaV9lbmFibGVfc3Vic3lzdGVtKHUzMiBmbGFncykKK3sKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0UoYWNwaV9lbmFibGVfc3Vic3lzdGVtKTsKKworCS8qIEVuYWJsZSBBQ1BJIG1vZGUgKi8KKworCWlmICghKGZsYWdzICYgQUNQSV9OT19BQ1BJX0VOQUJMRSkpIHsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FWEVDLAorCQkJCSAgIltJbml0XSBHb2luZyBpbnRvIEFDUEkgbW9kZVxuIikpOworCisJCWFjcGlfZ2JsX29yaWdpbmFsX21vZGUgPSBhY3BpX2h3X2dldF9tb2RlKCk7CisKKwkJc3RhdHVzID0gYWNwaV9lbmFibGUoKTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQlBQ1BJX1dBUk5JTkcoKEFFX0lORk8sICJBY3BpRW5hYmxlIGZhaWxlZCIpKTsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworCQl9CisJfQorCisJLyoKKwkgKiBPYnRhaW4gYSBwZXJtYW5lbnQgbWFwcGluZyBmb3IgdGhlIEZBQ1MuIFRoaXMgaXMgcmVxdWlyZWQgZm9yIHRoZQorCSAqIEdsb2JhbCBMb2NrIGFuZCB0aGUgRmlybXdhcmUgV2FraW5nIFZlY3RvcgorCSAqLworCXN0YXR1cyA9IGFjcGlfdGJfaW5pdGlhbGl6ZV9mYWNzKCk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCUFDUElfV0FSTklORygoQUVfSU5GTywgIkNvdWxkIG5vdCBtYXAgdGhlIEZBQ1MgdGFibGUiKSk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworCX0KKworCS8qCisJICogSW5zdGFsbCB0aGUgZGVmYXVsdCBvcF9yZWdpb24gaGFuZGxlcnMuIFRoZXNlIGFyZSBpbnN0YWxsZWQgdW5sZXNzCisJICogb3RoZXIgaGFuZGxlcnMgaGF2ZSBhbHJlYWR5IGJlZW4gaW5zdGFsbGVkIHZpYSB0aGUKKwkgKiBpbnN0YWxsX2FkZHJlc3Nfc3BhY2VfaGFuZGxlciBpbnRlcmZhY2UuCisJICovCisJaWYgKCEoZmxhZ3MgJiBBQ1BJX05PX0FERFJFU1NfU1BBQ0VfSU5JVCkpIHsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FWEVDLAorCQkJCSAgIltJbml0XSBJbnN0YWxsaW5nIGRlZmF1bHQgYWRkcmVzcyBzcGFjZSBoYW5kbGVyc1xuIikpOworCisJCXN0YXR1cyA9IGFjcGlfZXZfaW5zdGFsbF9yZWdpb25faGFuZGxlcnMoKTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKKwkJfQorCX0KKworCS8qCisJICogSW5pdGlhbGl6ZSBBQ1BJIEV2ZW50IGhhbmRsaW5nIChGaXhlZCBhbmQgR2VuZXJhbCBQdXJwb3NlKQorCSAqCisJICogTm90ZTE6IFdlIG11c3QgaGF2ZSB0aGUgaGFyZHdhcmUgYW5kIGV2ZW50cyBpbml0aWFsaXplZCBiZWZvcmUgd2UgY2FuCisJICogZXhlY3V0ZSBhbnkgY29udHJvbCBtZXRob2RzIHNhZmVseS4gQW55IGNvbnRyb2wgbWV0aG9kIGNhbiByZXF1aXJlCisJICogQUNQSSBoYXJkd2FyZSBzdXBwb3J0LCBzbyB0aGUgaGFyZHdhcmUgbXVzdCBiZSBmdWxseSBpbml0aWFsaXplZCBiZWZvcmUKKwkgKiBhbnkgbWV0aG9kIGV4ZWN1dGlvbiEKKwkgKgorCSAqIE5vdGUyOiBGaXhlZCBldmVudHMgYXJlIGluaXRpYWxpemVkIGFuZCBlbmFibGVkIGhlcmUuIEdQRXMgYXJlCisJICogaW5pdGlhbGl6ZWQsIGJ1dCBjYW5ub3QgYmUgZW5hYmxlZCB1bnRpbCBhZnRlciB0aGUgaGFyZHdhcmUgaXMKKwkgKiBjb21wbGV0ZWx5IGluaXRpYWxpemVkIChTQ0kgYW5kIGdsb2JhbF9sb2NrIGFjdGl2YXRlZCkKKwkgKi8KKwlpZiAoIShmbGFncyAmIEFDUElfTk9fRVZFTlRfSU5JVCkpIHsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FWEVDLAorCQkJCSAgIltJbml0XSBJbml0aWFsaXppbmcgQUNQSSBldmVudHNcbiIpKTsKKworCQlzdGF0dXMgPSBhY3BpX2V2X2luaXRpYWxpemVfZXZlbnRzKCk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CisJCX0KKwl9CisKKwkvKgorCSAqIEluc3RhbGwgdGhlIFNDSSBoYW5kbGVyIGFuZCBHbG9iYWwgTG9jayBoYW5kbGVyLiBUaGlzIGNvbXBsZXRlcyB0aGUKKwkgKiBoYXJkd2FyZSBpbml0aWFsaXphdGlvbi4KKwkgKi8KKwlpZiAoIShmbGFncyAmIEFDUElfTk9fSEFORExFUl9JTklUKSkgeworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VYRUMsCisJCQkJICAiW0luaXRdIEluc3RhbGxpbmcgU0NJL0dMIGhhbmRsZXJzXG4iKSk7CisKKwkJc3RhdHVzID0gYWNwaV9ldl9pbnN0YWxsX3hydXB0X2hhbmRsZXJzKCk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CisJCX0KKwl9CisKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKK30KKworQUNQSV9FWFBPUlRfU1lNQk9MKGFjcGlfZW5hYmxlX3N1YnN5c3RlbSkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9pbml0aWFsaXplX29iamVjdHMKKyAqCisgKiBQQVJBTUVURVJTOiAgRmxhZ3MgICAgICAgICAgIC0gSW5pdC9lbmFibGUgT3B0aW9ucworICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogQ29tcGxldGVzIG5hbWVzcGFjZSBpbml0aWFsaXphdGlvbiBieSBpbml0aWFsaXppbmcgZGV2aWNlCisgKiAgICAgICAgICAgICAgb2JqZWN0cyBhbmQgZXhlY3V0aW5nIEFNTCBjb2RlIGZvciBSZWdpb25zLCBidWZmZXJzLCBldGMuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2FjcGlfc3RhdHVzIGFjcGlfaW5pdGlhbGl6ZV9vYmplY3RzKHUzMiBmbGFncykKK3sKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0UoYWNwaV9pbml0aWFsaXplX29iamVjdHMpOworCisJLyoKKwkgKiBSdW4gYWxsIF9SRUcgbWV0aG9kcworCSAqCisJICogTm90ZTogQW55IG9iamVjdHMgYWNjZXNzZWQgYnkgdGhlIF9SRUcgbWV0aG9kcyB3aWxsIGJlIGF1dG9tYXRpY2FsbHkKKwkgKiBpbml0aWFsaXplZCwgZXZlbiBpZiB0aGV5IGNvbnRhaW4gZXhlY3V0YWJsZSBBTUwgKHNlZSB0aGUgY2FsbCB0bworCSAqIGFjcGlfbnNfaW5pdGlhbGl6ZV9vYmplY3RzIGJlbG93KS4KKwkgKi8KKwlpZiAoIShmbGFncyAmIEFDUElfTk9fQUREUkVTU19TUEFDRV9JTklUKSkgeworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VYRUMsCisJCQkJICAiW0luaXRdIEV4ZWN1dGluZyBfUkVHIE9wUmVnaW9uIG1ldGhvZHNcbiIpKTsKKworCQlzdGF0dXMgPSBhY3BpX2V2X2luaXRpYWxpemVfb3BfcmVnaW9ucygpOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworCQl9CisJfQorCisJLyoKKwkgKiBJbml0aWFsaXplIHRoZSBvYmplY3RzIHRoYXQgcmVtYWluIHVuaW5pdGlhbGl6ZWQuIFRoaXMgcnVucyB0aGUKKwkgKiBleGVjdXRhYmxlIEFNTCB0aGF0IG1heSBiZSBwYXJ0IG9mIHRoZSBkZWNsYXJhdGlvbiBvZiB0aGVzZSBvYmplY3RzOgorCSAqIG9wZXJhdGlvbl9yZWdpb25zLCBidWZmZXJfZmllbGRzLCBCdWZmZXJzLCBhbmQgUGFja2FnZXMuCisJICovCisJaWYgKCEoZmxhZ3MgJiBBQ1BJX05PX09CSkVDVF9JTklUKSkgeworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VYRUMsCisJCQkJICAiW0luaXRdIENvbXBsZXRpbmcgSW5pdGlhbGl6YXRpb24gb2YgQUNQSSBPYmplY3RzXG4iKSk7CisKKwkJc3RhdHVzID0gYWNwaV9uc19pbml0aWFsaXplX29iamVjdHMoKTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKKwkJfQorCX0KKworCS8qCisJICogSW5pdGlhbGl6ZSBhbGwgZGV2aWNlIG9iamVjdHMgaW4gdGhlIG5hbWVzcGFjZS4gVGhpcyBydW5zIHRoZSBkZXZpY2UKKwkgKiBfU1RBIGFuZCBfSU5JIG1ldGhvZHMuCisJICovCisJaWYgKCEoZmxhZ3MgJiBBQ1BJX05PX0RFVklDRV9JTklUKSkgeworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VYRUMsCisJCQkJICAiW0luaXRdIEluaXRpYWxpemluZyBBQ1BJIERldmljZXNcbiIpKTsKKworCQlzdGF0dXMgPSBhY3BpX25zX2luaXRpYWxpemVfZGV2aWNlcygpOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworCQl9CisJfQorCisJLyoKKwkgKiBDb21wbGV0ZSB0aGUgR1BFIGluaXRpYWxpemF0aW9uIGZvciB0aGUgR1BFIGJsb2NrcyBkZWZpbmVkIGluIHRoZSBGQURUCisJICogKEdQRSBibG9jayAwIGFuZCAxKS4KKwkgKgorCSAqIE5vdGUxOiBUaGlzIGlzIHdoZXJlIHRoZSBfUFJXIG1ldGhvZHMgYXJlIGV4ZWN1dGVkIGZvciB0aGUgR1BFcy4gVGhlc2UKKwkgKiBtZXRob2RzIGNhbiBvbmx5IGJlIGV4ZWN1dGVkIGFmdGVyIHRoZSBTQ0kgYW5kIEdsb2JhbCBMb2NrIGhhbmRsZXJzIGFyZQorCSAqIGluc3RhbGxlZCBhbmQgaW5pdGlhbGl6ZWQuCisJICoKKwkgKiBOb3RlMjogQ3VycmVudGx5LCB0aGVyZSBzZWVtcyB0byBiZSBubyBuZWVkIHRvIHJ1biB0aGUgX1JFRyBtZXRob2RzCisJICogYmVmb3JlIGV4ZWN1dGlvbiBvZiB0aGUgX1BSVyBtZXRob2RzIGFuZCBlbmFibGluZyBvZiB0aGUgR1BFcy4KKwkgKi8KKwlpZiAoIShmbGFncyAmIEFDUElfTk9fRVZFTlRfSU5JVCkpIHsKKwkJc3RhdHVzID0gYWNwaV9ldl9pbnN0YWxsX2ZhZHRfZ3BlcygpOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpCisJCQlyZXR1cm4gKHN0YXR1cyk7CisJfQorCisJLyoKKwkgKiBFbXB0eSB0aGUgY2FjaGVzIChkZWxldGUgdGhlIGNhY2hlZCBvYmplY3RzKSBvbiB0aGUgYXNzdW1wdGlvbiB0aGF0CisJICogdGhlIHRhYmxlIGxvYWQgZmlsbGVkIHRoZW0gdXAgbW9yZSB0aGFuIHRoZXkgd2lsbCBiZSBhdCBydW50aW1lIC0tCisJICogdGh1cyB3YXN0aW5nIG5vbi1wYWdlZCBtZW1vcnkuCisJICovCisJc3RhdHVzID0gYWNwaV9wdXJnZV9jYWNoZWRfb2JqZWN0cygpOworCisJYWNwaV9nYmxfc3RhcnR1cF9mbGFncyB8PSBBQ1BJX0lOSVRJQUxJWkVEX09LOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworfQorCitBQ1BJX0VYUE9SVF9TWU1CT0woYWNwaV9pbml0aWFsaXplX29iamVjdHMpCisKKyNlbmRpZgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV90ZXJtaW5hdGUKKyAqCisgKiBQQVJBTUVURVJTOiAgTm9uZQorICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogU2h1dGRvd24gdGhlIEFDUEkgc3Vic3lzdGVtLiAgUmVsZWFzZSBhbGwgcmVzb3VyY2VzLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCithY3BpX3N0YXR1cyBhY3BpX3Rlcm1pbmF0ZSh2b2lkKQoreworCWFjcGlfc3RhdHVzIHN0YXR1czsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0UoYWNwaV90ZXJtaW5hdGUpOworCisJLyogVGVybWluYXRlIHRoZSBBTUwgRGVidWdnZXIgaWYgcHJlc2VudCAqLworCisJQUNQSV9ERUJVR0dFUl9FWEVDKGFjcGlfZ2JsX2RiX3Rlcm1pbmF0ZV90aHJlYWRzID0gVFJVRSk7CisKKwkvKiBTaHV0ZG93biBhbmQgZnJlZSBhbGwgcmVzb3VyY2VzICovCisKKwlhY3BpX3V0X3N1YnN5c3RlbV9zaHV0ZG93bigpOworCisJLyogRnJlZSB0aGUgbXV0ZXggb2JqZWN0cyAqLworCisJYWNwaV91dF9tdXRleF90ZXJtaW5hdGUoKTsKKworI2lmZGVmIEFDUElfREVCVUdHRVIKKworCS8qIFNodXQgZG93biB0aGUgZGVidWdnZXIgKi8KKworCWFjcGlfZGJfdGVybWluYXRlKCk7CisjZW5kaWYKKworCS8qIE5vdyB3ZSBjYW4gc2h1dGRvd24gdGhlIE9TLWRlcGVuZGVudCBsYXllciAqLworCisJc3RhdHVzID0gYWNwaV9vc190ZXJtaW5hdGUoKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKK30KKworQUNQSV9FWFBPUlRfU1lNQk9MKGFjcGlfdGVybWluYXRlKQorI2lmbmRlZiBBQ1BJX0FTTF9DT01QSUxFUgorI2lmZGVmIEFDUElfRlVUVVJFX1VTQUdFCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX3N1YnN5c3RlbV9zdGF0dXMKKyAqCisgKiBQQVJBTUVURVJTOiAgTm9uZQorICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMgb2YgdGhlIEFDUEkgc3Vic3lzdGVtCisgKgorICogREVTQ1JJUFRJT046IE90aGVyIGRyaXZlcnMgdGhhdCB1c2UgdGhlIEFDUEkgc3Vic3lzdGVtIHNob3VsZCBjYWxsIHRoaXMKKyAqICAgICAgICAgICAgICBiZWZvcmUgbWFraW5nIGFueSBvdGhlciBjYWxscywgdG8gZW5zdXJlIHRoZSBzdWJzeXN0ZW0KKyAqICAgICAgICAgICAgICBpbml0aWFsaXplZCBzdWNjZXNzZnVsbHkuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2FjcGlfc3RhdHVzIGFjcGlfc3Vic3lzdGVtX3N0YXR1cyh2b2lkKQoreworCisJaWYgKGFjcGlfZ2JsX3N0YXJ0dXBfZmxhZ3MgJiBBQ1BJX0lOSVRJQUxJWkVEX09LKSB7CisJCXJldHVybiAoQUVfT0spOworCX0gZWxzZSB7CisJCXJldHVybiAoQUVfRVJST1IpOworCX0KK30KKworQUNQSV9FWFBPUlRfU1lNQk9MKGFjcGlfc3Vic3lzdGVtX3N0YXR1cykKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9nZXRfc3lzdGVtX2luZm8KKyAqCisgKiBQQVJBTUVURVJTOiAgb3V0X2J1ZmZlciAgICAgIC0gQSBidWZmZXIgdG8gcmVjZWl2ZSB0aGUgcmVzb3VyY2VzIGZvciB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzICAgICAgICAgIC0gdGhlIHN0YXR1cyBvZiB0aGUgY2FsbAorICoKKyAqIERFU0NSSVBUSU9OOiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBnZXQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGN1cnJlbnQKKyAqICAgICAgICAgICAgICBzdGF0ZSBvZiB0aGUgQUNQSSBzdWJzeXN0ZW0uICBJdCB3aWxsIHJldHVybiBzeXN0ZW0gaW5mb3JtYXRpb24KKyAqICAgICAgICAgICAgICBpbiB0aGUgb3V0X2J1ZmZlci4KKyAqCisgKiAgICAgICAgICAgICAgSWYgdGhlIGZ1bmN0aW9uIGZhaWxzIGFuIGFwcHJvcHJpYXRlIHN0YXR1cyB3aWxsIGJlIHJldHVybmVkCisgKiAgICAgICAgICAgICAgYW5kIHRoZSB2YWx1ZSBvZiBvdXRfYnVmZmVyIGlzIHVuZGVmaW5lZC4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYWNwaV9zdGF0dXMgYWNwaV9nZXRfc3lzdGVtX2luZm8oc3RydWN0IGFjcGlfYnVmZmVyICogb3V0X2J1ZmZlcikKK3sKKwlzdHJ1Y3QgYWNwaV9zeXN0ZW1faW5mbyAqaW5mb19wdHI7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCisJQUNQSV9GVU5DVElPTl9UUkFDRShhY3BpX2dldF9zeXN0ZW1faW5mbyk7CisKKwkvKiBQYXJhbWV0ZXIgdmFsaWRhdGlvbiAqLworCisJc3RhdHVzID0gYWNwaV91dF92YWxpZGF0ZV9idWZmZXIob3V0X2J1ZmZlcik7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworCX0KKworCS8qIFZhbGlkYXRlL0FsbG9jYXRlL0NsZWFyIGNhbGxlciBidWZmZXIgKi8KKworCXN0YXR1cyA9CisJICAgIGFjcGlfdXRfaW5pdGlhbGl6ZV9idWZmZXIob3V0X2J1ZmZlciwKKwkJCQkgICAgICBzaXplb2Yoc3RydWN0IGFjcGlfc3lzdGVtX2luZm8pKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CisJfQorCisJLyoKKwkgKiBQb3B1bGF0ZSB0aGUgcmV0dXJuIGJ1ZmZlcgorCSAqLworCWluZm9fcHRyID0gKHN0cnVjdCBhY3BpX3N5c3RlbV9pbmZvICopb3V0X2J1ZmZlci0+cG9pbnRlcjsKKworCWluZm9fcHRyLT5hY3BpX2NhX3ZlcnNpb24gPSBBQ1BJX0NBX1ZFUlNJT047CisKKwkvKiBTeXN0ZW0gZmxhZ3MgKEFDUEkgY2FwYWJpbGl0aWVzKSAqLworCisJaW5mb19wdHItPmZsYWdzID0gQUNQSV9TWVNfTU9ERV9BQ1BJOworCisJLyogVGltZXIgcmVzb2x1dGlvbiAtIDI0IG9yIDMyIGJpdHMgICovCisKKwlpZiAoYWNwaV9nYmxfRkFEVC5mbGFncyAmIEFDUElfRkFEVF8zMkJJVF9USU1FUikgeworCQlpbmZvX3B0ci0+dGltZXJfcmVzb2x1dGlvbiA9IDI0OworCX0gZWxzZSB7CisJCWluZm9fcHRyLT50aW1lcl9yZXNvbHV0aW9uID0gMzI7CisJfQorCisJLyogQ2xlYXIgdGhlIHJlc2VydmVkIGZpZWxkcyAqLworCisJaW5mb19wdHItPnJlc2VydmVkMSA9IDA7CisJaW5mb19wdHItPnJlc2VydmVkMiA9IDA7CisKKwkvKiBDdXJyZW50IGRlYnVnIGxldmVscyAqLworCisJaW5mb19wdHItPmRlYnVnX2xheWVyID0gYWNwaV9kYmdfbGF5ZXI7CisJaW5mb19wdHItPmRlYnVnX2xldmVsID0gYWNwaV9kYmdfbGV2ZWw7CisKKwlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOworfQorCitBQ1BJX0VYUE9SVF9TWU1CT0woYWNwaV9nZXRfc3lzdGVtX2luZm8pCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX2luc3RhbGxfaW5pdGlhbGl6YXRpb25faGFuZGxlcgorICoKKyAqIFBBUkFNRVRFUlM6ICBIYW5kbGVyICAgICAgICAgICAgIC0gQ2FsbGJhY2sgcHJvY2VkdXJlCisgKiAgICAgICAgICAgICAgRnVuY3Rpb24gICAgICAgICAgICAtIE5vdCAoY3VycmVudGx5KSB1c2VkLCBzZWUgYmVsb3cKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IEluc3RhbGwgYW4gaW5pdGlhbGl6YXRpb24gaGFuZGxlcgorICoKKyAqIFRCRDogV2hlbiBhIHNlY29uZCBmdW5jdGlvbiBpcyBhZGRlZCwgbXVzdCBzYXZlIHRoZSBGdW5jdGlvbiBhbHNvLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYWNwaV9zdGF0dXMKK2FjcGlfaW5zdGFsbF9pbml0aWFsaXphdGlvbl9oYW5kbGVyKGFjcGlfaW5pdF9oYW5kbGVyIGhhbmRsZXIsIHUzMiBmdW5jdGlvbikKK3sKKworCWlmICghaGFuZGxlcikgeworCQlyZXR1cm4gKEFFX0JBRF9QQVJBTUVURVIpOworCX0KKworCWlmIChhY3BpX2dibF9pbml0X2hhbmRsZXIpIHsKKwkJcmV0dXJuIChBRV9BTFJFQURZX0VYSVNUUyk7CisJfQorCisJYWNwaV9nYmxfaW5pdF9oYW5kbGVyID0gaGFuZGxlcjsKKwlyZXR1cm4gQUVfT0s7Cit9CisKK0FDUElfRVhQT1JUX1NZTUJPTChhY3BpX2luc3RhbGxfaW5pdGlhbGl6YXRpb25faGFuZGxlcikKKyNlbmRpZgkJCQkvKiAgQUNQSV9GVVRVUkVfVVNBR0UgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9wdXJnZV9jYWNoZWRfb2JqZWN0cworICoKKyAqIFBBUkFNRVRFUlM6ICBOb25lCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBFbXB0eSBhbGwgY2FjaGVzIChkZWxldGUgdGhlIGNhY2hlZCBvYmplY3RzKQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYWNwaV9zdGF0dXMgYWNwaV9wdXJnZV9jYWNoZWRfb2JqZWN0cyh2b2lkKQoreworCUFDUElfRlVOQ1RJT05fVFJBQ0UoYWNwaV9wdXJnZV9jYWNoZWRfb2JqZWN0cyk7CisKKwkodm9pZClhY3BpX29zX3B1cmdlX2NhY2hlKGFjcGlfZ2JsX3N0YXRlX2NhY2hlKTsKKwkodm9pZClhY3BpX29zX3B1cmdlX2NhY2hlKGFjcGlfZ2JsX29wZXJhbmRfY2FjaGUpOworCSh2b2lkKWFjcGlfb3NfcHVyZ2VfY2FjaGUoYWNwaV9nYmxfcHNfbm9kZV9jYWNoZSk7CisJKHZvaWQpYWNwaV9vc19wdXJnZV9jYWNoZShhY3BpX2dibF9wc19ub2RlX2V4dF9jYWNoZSk7CisJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKK30KKworQUNQSV9FWFBPUlRfU1lNQk9MKGFjcGlfcHVyZ2VfY2FjaGVkX29iamVjdHMpCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9iYXR0ZXJ5LmMgYi9kcml2ZXJzL2FjcGkvYmF0dGVyeS5jCmluZGV4IDE0MjNiMGMuLjY1MTMyZjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9iYXR0ZXJ5LmMKKysrIGIvZHJpdmVycy9hY3BpL2JhdHRlcnkuYwpAQCAtNDcxLDcgKzQ3MSw3IEBACiAKIHN0YXRpYyBpbnQgYWNwaV9iYXR0ZXJ5X3VwZGF0ZShzdHJ1Y3QgYWNwaV9iYXR0ZXJ5ICpiYXR0ZXJ5KQogewotCWludCByZXN1bHQ7CisJaW50IHJlc3VsdCwgb2xkX3ByZXNlbnQgPSBhY3BpX2JhdHRlcnlfcHJlc2VudChiYXR0ZXJ5KTsKIAlyZXN1bHQgPSBhY3BpX2JhdHRlcnlfZ2V0X3N0YXR1cyhiYXR0ZXJ5KTsKIAlpZiAocmVzdWx0KQogCQlyZXR1cm4gcmVzdWx0OwpAQCAtNDgyLDcgKzQ4Miw4IEBACiAJCXJldHVybiAwOwogCX0KICNlbmRpZgotCWlmICghYmF0dGVyeS0+dXBkYXRlX3RpbWUpIHsKKwlpZiAoIWJhdHRlcnktPnVwZGF0ZV90aW1lIHx8CisJICAgIG9sZF9wcmVzZW50ICE9IGFjcGlfYmF0dGVyeV9wcmVzZW50KGJhdHRlcnkpKSB7CiAJCXJlc3VsdCA9IGFjcGlfYmF0dGVyeV9nZXRfaW5mbyhiYXR0ZXJ5KTsKIAkJaWYgKHJlc3VsdCkKIAkJCXJldHVybiByZXN1bHQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvY21fc2JzLmMgYi9kcml2ZXJzL2FjcGkvY21fc2JzLmMKaW5kZXggMzA3OTYzYi4uMzMyZmU0YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2NtX3Nicy5jCisrKyBiL2RyaXZlcnMvYWNwaS9jbV9zYnMuYwpAQCAtMjcsOSArMjcsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CiAjaW5jbHVkZSA8YWNwaS9hY3BpX2J1cy5oPgogI2luY2x1ZGUgPGFjcGkvYWNwaV9kcml2ZXJzLmg+Ci0jaW5jbHVkZSA8YWNwaS9hY21hY3Jvcy5oPgotI2luY2x1ZGUgPGFjcGkvYWN0eXBlcy5oPgotI2luY2x1ZGUgPGFjcGkvYWN1dGlscy5oPgogCiBBQ1BJX01PRFVMRV9OQU1FKCJjbV9zYnMiKTsKICNkZWZpbmUgQUNQSV9BQ19DTEFTUwkJImFjX2FkYXB0ZXIiCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZGVidWcuYyBiL2RyaXZlcnMvYWNwaS9kZWJ1Zy5jCmluZGV4IGM0ODM5NjguLjIwMjIzY2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9kZWJ1Zy5jCisrKyBiL2RyaXZlcnMvYWNwaS9kZWJ1Zy5jCkBAIC05LDcgKzksNiBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhY3BpL2FjcGlfZHJpdmVycy5oPgotI2luY2x1ZGUgPGFjcGkvYWNnbG9iYWwuaD4KIAogI2RlZmluZSBfQ09NUE9ORU5UCQlBQ1BJX1NZU1RFTV9DT01QT05FTlQKIEFDUElfTU9EVUxFX05BTUUoImRlYnVnIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZGlzcGF0Y2hlci9NYWtlZmlsZSBiL2RyaXZlcnMvYWNwaS9kaXNwYXRjaGVyL01ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjdlNjAyLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvYWNwaS9kaXNwYXRjaGVyL01ha2VmaWxlCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi0jCi0jIE1ha2VmaWxlIGZvciBhbGwgTGludXggQUNQSSBpbnRlcnByZXRlciBzdWJkaXJlY3RvcmllcwotIwotCi1vYmoteSA6PSBkc2ZpZWxkLm8gICBkc210aGRhdC5vICBkc29wY29kZS5vICBkc3dleGVjLm8gIGRzd3Njb3BlLm8gXAotCSBkc21ldGhvZC5vICBkc29iamVjdC5vICBkc3V0aWxzLm8gICBkc3dsb2FkLm8gIGRzd3N0YXRlLm8gXAotCSBkc2luaXQubwotCi1FWFRSQV9DRkxBR1MgKz0gJChBQ1BJX0NGTEFHUykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9kaXNwYXRjaGVyL2RzZmllbGQuYyBiL2RyaXZlcnMvYWNwaS9kaXNwYXRjaGVyL2RzZmllbGQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjk4OGE1ZS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL2FjcGkvZGlzcGF0Y2hlci9kc2ZpZWxkLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2NDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIE1vZHVsZSBOYW1lOiBkc2ZpZWxkIC0gRGlzcGF0Y2hlciBmaWVsZCByb3V0aW5lcwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDgsIEludGVsIENvcnAuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCi0gKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSBhdCBtaW5pbXVtIGEgZGlzY2xhaW1lcgotICogICAgc3Vic3RhbnRpYWxseSBzaW1pbGFyIHRvIHRoZSAiTk8gV0FSUkFOVFkiIGRpc2NsYWltZXIgYmVsb3cKLSAqICAgICgiRGlzY2xhaW1lciIpIGFuZCBhbnkgcmVkaXN0cmlidXRpb24gbXVzdCBiZSBjb25kaXRpb25lZCB1cG9uCi0gKiAgICBpbmNsdWRpbmcgYSBzdWJzdGFudGlhbGx5IHNpbWlsYXIgRGlzY2xhaW1lciByZXF1aXJlbWVudCBmb3IgZnVydGhlcgotICogICAgYmluYXJ5IHJlZGlzdHJpYnV0aW9uLgotICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzCi0gKiAgICBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIE5PIFdBUlJBTlRZCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKLSAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCi0gKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORwotICogSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCi0gKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCi0gKi8KLQotI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgotI2luY2x1ZGUgPGFjcGkvYW1sY29kZS5oPgotI2luY2x1ZGUgPGFjcGkvYWNkaXNwYXQuaD4KLSNpbmNsdWRlIDxhY3BpL2FjaW50ZXJwLmg+Ci0jaW5jbHVkZSA8YWNwaS9hY25hbWVzcC5oPgotI2luY2x1ZGUgPGFjcGkvYWNwYXJzZXIuaD4KLQotI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfRElTUEFUQ0hFUgotQUNQSV9NT0RVTEVfTkFNRSgiZHNmaWVsZCIpCi0KLS8qIExvY2FsIHByb3RvdHlwZXMgKi8KLXN0YXRpYyBhY3BpX3N0YXR1cwotYWNwaV9kc19nZXRfZmllbGRfbmFtZXMoc3RydWN0IGFjcGlfY3JlYXRlX2ZpZWxkX2luZm8gKmluZm8sCi0JCQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlLAotCQkJdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKmFyZyk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfZHNfY3JlYXRlX2J1ZmZlcl9maWVsZAotICoKLSAqIFBBUkFNRVRFUlM6ICBPcCAgICAgICAgICAgICAgICAgIC0gQ3VycmVudCBwYXJzZSBvcCAoY3JlYXRlX3hYRmllbGQpCi0gKiAgICAgICAgICAgICAgd2Fsa19zdGF0ZSAgICAgICAgICAtIEN1cnJlbnQgc3RhdGUKLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IEV4ZWN1dGUgdGhlIGNyZWF0ZV9maWVsZCBvcGVyYXRvcnM6Ci0gKiAgICAgICAgICAgICAgY3JlYXRlX2JpdF9maWVsZF9vcCwKLSAqICAgICAgICAgICAgICBjcmVhdGVfYnl0ZV9maWVsZF9vcCwKLSAqICAgICAgICAgICAgICBjcmVhdGVfd29yZF9maWVsZF9vcCwKLSAqICAgICAgICAgICAgICBjcmVhdGVfZHdvcmRfZmllbGRfb3AsCi0gKiAgICAgICAgICAgICAgY3JlYXRlX3F3b3JkX2ZpZWxkX29wLAotICogICAgICAgICAgICAgIGNyZWF0ZV9maWVsZF9vcCAgICAgKGFsbCBvZiB3aGljaCBkZWZpbmUgYSBmaWVsZCBpbiBhIGJ1ZmZlcikKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1hY3BpX3N0YXR1cwotYWNwaV9kc19jcmVhdGVfYnVmZmVyX2ZpZWxkKHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpvcCwKLQkJCSAgICBzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKQotewotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICphcmc7Ci0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGU7Ci0JYWNwaV9zdGF0dXMgc3RhdHVzOwotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjOwotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnNlY29uZF9kZXNjID0gTlVMTDsKLQl1MzIgZmxhZ3M7Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGRzX2NyZWF0ZV9idWZmZXJfZmllbGQpOwotCi0JLyoKLQkgKiBHZXQgdGhlIG5hbWVfc3RyaW5nIGFyZ3VtZW50IChuYW1lIG9mIHRoZSBuZXcgYnVmZmVyX2ZpZWxkKQotCSAqLwotCWlmIChvcC0+Y29tbW9uLmFtbF9vcGNvZGUgPT0gQU1MX0NSRUFURV9GSUVMRF9PUCkgewotCi0JCS8qIEZvciBjcmVhdGVfZmllbGQsIG5hbWUgaXMgdGhlIDR0aCBhcmd1bWVudCAqLwotCi0JCWFyZyA9IGFjcGlfcHNfZ2V0X2FyZyhvcCwgMyk7Ci0JfSBlbHNlIHsKLQkJLyogRm9yIGFsbCBvdGhlciBjcmVhdGVfeFhYRmllbGQgb3BlcmF0b3JzLCBuYW1lIGlzIHRoZSAzcmQgYXJndW1lbnQgKi8KLQotCQlhcmcgPSBhY3BpX3BzX2dldF9hcmcob3AsIDIpOwotCX0KLQotCWlmICghYXJnKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfTk9fT1BFUkFORCk7Ci0JfQotCi0JaWYgKHdhbGtfc3RhdGUtPmRlZmVycmVkX25vZGUpIHsKLQkJbm9kZSA9IHdhbGtfc3RhdGUtPmRlZmVycmVkX25vZGU7Ci0JCXN0YXR1cyA9IEFFX09LOwotCX0gZWxzZSB7Ci0JCS8qIEV4ZWN1dGUgZmxhZyBzaG91bGQgYWx3YXlzIGJlIHNldCB3aGVuIHRoaXMgZnVuY3Rpb24gaXMgZW50ZXJlZCAqLwotCi0JCWlmICghKHdhbGtfc3RhdGUtPnBhcnNlX2ZsYWdzICYgQUNQSV9QQVJTRV9FWEVDVVRFKSkgewotCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9JTlRFUk5BTCk7Ci0JCX0KLQotCQkvKiBDcmVhdGluZyBuZXcgbmFtZXNwYWNlIG5vZGUsIHNob3VsZCBub3QgYWxyZWFkeSBleGlzdCAqLwotCi0JCWZsYWdzID0gQUNQSV9OU19OT19VUFNFQVJDSCB8IEFDUElfTlNfRE9OVF9PUEVOX1NDT1BFIHwKLQkJICAgIEFDUElfTlNfRVJST1JfSUZfRk9VTkQ7Ci0KLQkJLyogTWFyayBub2RlIHRlbXBvcmFyeSBpZiB3ZSBhcmUgZXhlY3V0aW5nIGEgbWV0aG9kICovCi0KLQkJaWYgKHdhbGtfc3RhdGUtPm1ldGhvZF9ub2RlKSB7Ci0JCQlmbGFncyB8PSBBQ1BJX05TX1RFTVBPUkFSWTsKLQkJfQotCi0JCS8qIEVudGVyIHRoZSBuYW1lX3N0cmluZyBpbnRvIHRoZSBuYW1lc3BhY2UgKi8KLQotCQlzdGF0dXMgPQotCQkgICAgYWNwaV9uc19sb29rdXAod2Fsa19zdGF0ZS0+c2NvcGVfaW5mbywKLQkJCQkgICBhcmctPmNvbW1vbi52YWx1ZS5zdHJpbmcsIEFDUElfVFlQRV9BTlksCi0JCQkJICAgQUNQSV9JTU9ERV9MT0FEX1BBU1MxLCBmbGFncywgd2Fsa19zdGF0ZSwKLQkJCQkgICAmbm9kZSk7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQkJQUNQSV9FUlJPUl9OQU1FU1BBQ0UoYXJnLT5jb21tb24udmFsdWUuc3RyaW5nLCBzdGF0dXMpOwotCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIFdlIGNvdWxkIHB1dCB0aGUgcmV0dXJuZWQgb2JqZWN0IChOb2RlKSBvbiB0aGUgb2JqZWN0IHN0YWNrIGZvciBsYXRlciwKLQkgKiBidXQgZm9yIG5vdywgd2Ugd2lsbCBwdXQgaXQgaW4gdGhlICJvcCIgb2JqZWN0IHRoYXQgdGhlIHBhcnNlciB1c2VzLAotCSAqIHNvIHdlIGNhbiBnZXQgaXQgYWdhaW4gYXQgdGhlIGVuZCBvZiB0aGlzIHNjb3BlLgotCSAqLwotCW9wLT5jb21tb24ubm9kZSA9IG5vZGU7Ci0KLQkvKgotCSAqIElmIHRoZXJlIGlzIG5vIG9iamVjdCBhdHRhY2hlZCB0byB0aGUgbm9kZSwgdGhpcyBub2RlIHdhcyBqdXN0IGNyZWF0ZWQKLQkgKiBhbmQgd2UgbmVlZCB0byBjcmVhdGUgdGhlIGZpZWxkIG9iamVjdC4gT3RoZXJ3aXNlLCB0aGlzIHdhcyBhIGxvb2t1cAotCSAqIG9mIGFuIGV4aXN0aW5nIG5vZGUgYW5kIHdlIGRvbid0IHdhbnQgdG8gY3JlYXRlIHRoZSBmaWVsZCBvYmplY3QgYWdhaW4uCi0JICovCi0Jb2JqX2Rlc2MgPSBhY3BpX25zX2dldF9hdHRhY2hlZF9vYmplY3Qobm9kZSk7Ci0JaWYgKG9ial9kZXNjKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7Ci0JfQotCi0JLyoKLQkgKiBUaGUgRmllbGQgZGVmaW5pdGlvbiBpcyBub3QgZnVsbHkgcGFyc2VkIGF0IHRoaXMgdGltZS4KLQkgKiAoV2UgbXVzdCBzYXZlIHRoZSBhZGRyZXNzIG9mIHRoZSBBTUwgZm9yIHRoZSBidWZmZXIgYW5kIGluZGV4IG9wZXJhbmRzKQotCSAqLwotCi0JLyogQ3JlYXRlIHRoZSBidWZmZXIgZmllbGQgb2JqZWN0ICovCi0KLQlvYmpfZGVzYyA9IGFjcGlfdXRfY3JlYXRlX2ludGVybmFsX29iamVjdChBQ1BJX1RZUEVfQlVGRkVSX0ZJRUxEKTsKLQlpZiAoIW9ial9kZXNjKSB7Ci0JCXN0YXR1cyA9IEFFX05PX01FTU9SWTsKLQkJZ290byBjbGVhbnVwOwotCX0KLQotCS8qCi0JICogUmVtZW1iZXIgbG9jYXRpb24gaW4gQU1MIHN0cmVhbSBvZiB0aGUgZmllbGQgdW5pdCBvcGNvZGUgYW5kIG9wZXJhbmRzIC0tCi0JICogc2luY2UgdGhlIGJ1ZmZlciBhbmQgaW5kZXggb3BlcmFuZHMgbXVzdCBiZSBldmFsdWF0ZWQuCi0JICovCi0Jc2Vjb25kX2Rlc2MgPSBvYmpfZGVzYy0+Y29tbW9uLm5leHRfb2JqZWN0OwotCXNlY29uZF9kZXNjLT5leHRyYS5hbWxfc3RhcnQgPSBvcC0+bmFtZWQuZGF0YTsKLQlzZWNvbmRfZGVzYy0+ZXh0cmEuYW1sX2xlbmd0aCA9IG9wLT5uYW1lZC5sZW5ndGg7Ci0Jb2JqX2Rlc2MtPmJ1ZmZlcl9maWVsZC5ub2RlID0gbm9kZTsKLQotCS8qIEF0dGFjaCBjb25zdHJ1Y3RlZCBmaWVsZCBkZXNjcmlwdG9ycyB0byBwYXJlbnQgbm9kZSAqLwotCi0Jc3RhdHVzID0gYWNwaV9uc19hdHRhY2hfb2JqZWN0KG5vZGUsIG9ial9kZXNjLCBBQ1BJX1RZUEVfQlVGRkVSX0ZJRUxEKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJZ290byBjbGVhbnVwOwotCX0KLQotICAgICAgY2xlYW51cDoKLQotCS8qIFJlbW92ZSBsb2NhbCByZWZlcmVuY2UgdG8gdGhlIG9iamVjdCAqLwotCi0JYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKG9ial9kZXNjKTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9kc19nZXRfZmllbGRfbmFtZXMKLSAqCi0gKiBQQVJBTUVURVJTOiAgSW5mbyAgICAgICAgICAgIC0gY3JlYXRlX2ZpZWxkIGluZm8gc3RydWN0dXJlCi0gKiAgYCAgICAgICAgICAgd2Fsa19zdGF0ZSAgICAgIC0gQ3VycmVudCBtZXRob2Qgc3RhdGUKLSAqICAgICAgICAgICAgICBBcmcgICAgICAgICAgICAgLSBGaXJzdCBwYXJzZXIgYXJnIGZvciB0aGUgZmllbGQgbmFtZSBsaXN0Ci0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cwotICoKLSAqIERFU0NSSVBUSU9OOiBQcm9jZXNzIGFsbCBuYW1lZCBmaWVsZHMgaW4gYSBmaWVsZCBkZWNsYXJhdGlvbi4gIE5hbWVzIGFyZQotICogICAgICAgICAgICAgIGVudGVyZWQgaW50byB0aGUgbmFtZXNwYWNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyBhY3BpX3N0YXR1cwotYWNwaV9kc19nZXRfZmllbGRfbmFtZXMoc3RydWN0IGFjcGlfY3JlYXRlX2ZpZWxkX2luZm8gKmluZm8sCi0JCQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlLAotCQkJdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKmFyZykKLXsKLQlhY3BpX3N0YXR1cyBzdGF0dXM7Ci0JYWNwaV9pbnRlZ2VyIHBvc2l0aW9uOwotCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIoZHNfZ2V0X2ZpZWxkX25hbWVzLCBpbmZvKTsKLQotCS8qIEZpcnN0IGZpZWxkIHN0YXJ0cyBhdCBiaXQgemVybyAqLwotCi0JaW5mby0+ZmllbGRfYml0X3Bvc2l0aW9uID0gMDsKLQotCS8qIFByb2Nlc3MgYWxsIGVsZW1lbnRzIGluIHRoZSBmaWVsZCBsaXN0IChvZiBwYXJzZSBub2RlcykgKi8KLQotCXdoaWxlIChhcmcpIHsKLQkJLyoKLQkJICogVGhyZWUgdHlwZXMgb2YgZmllbGQgZWxlbWVudHMgYXJlIGhhbmRsZWQ6Ci0JCSAqIDEpIE9mZnNldCAtIHNwZWNpZmllcyBhIGJpdCBvZmZzZXQKLQkJICogMikgYWNjZXNzX2FzIC0gY2hhbmdlcyB0aGUgYWNjZXNzIG1vZGUKLQkJICogMykgTmFtZSAtIEVudGVycyBhIG5ldyBuYW1lZCBmaWVsZCBpbnRvIHRoZSBuYW1lc3BhY2UKLQkJICovCi0JCXN3aXRjaCAoYXJnLT5jb21tb24uYW1sX29wY29kZSkgewotCQljYXNlIEFNTF9JTlRfUkVTRVJWRURGSUVMRF9PUDoKLQotCQkJcG9zaXRpb24gPSAoYWNwaV9pbnRlZ2VyKSBpbmZvLT5maWVsZF9iaXRfcG9zaXRpb24KLQkJCSAgICArIChhY3BpX2ludGVnZXIpIGFyZy0+Y29tbW9uLnZhbHVlLnNpemU7Ci0KLQkJCWlmIChwb3NpdGlvbiA+IEFDUElfVUlOVDMyX01BWCkgewotCQkJCUFDUElfRVJST1IoKEFFX0lORk8sCi0JCQkJCSAgICAiQml0IG9mZnNldCB3aXRoaW4gZmllbGQgdG9vIGxhcmdlICg+IDB4RkZGRkZGRkYpIikpOwotCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9TVVBQT1JUKTsKLQkJCX0KLQotCQkJaW5mby0+ZmllbGRfYml0X3Bvc2l0aW9uID0gKHUzMikgcG9zaXRpb247Ci0JCQlicmVhazsKLQotCQljYXNlIEFNTF9JTlRfQUNDRVNTRklFTERfT1A6Ci0KLQkJCS8qCi0JCQkgKiBHZXQgYSBuZXcgYWNjZXNzX3R5cGUgYW5kIGFjY2Vzc19hdHRyaWJ1dGUgLS0gdG8gYmUgdXNlZCBmb3IgYWxsCi0JCQkgKiBmaWVsZCB1bml0cyB0aGF0IGZvbGxvdywgdW50aWwgZmllbGQgZW5kIG9yIGFub3RoZXIgYWNjZXNzX2FzCi0JCQkgKiBrZXl3b3JkLgotCQkJICoKLQkJCSAqIEluIGZpZWxkX2ZsYWdzLCBwcmVzZXJ2ZSB0aGUgZmxhZyBiaXRzIG90aGVyIHRoYW4gdGhlCi0JCQkgKiBBQ0NFU1NfVFlQRSBiaXRzCi0JCQkgKi8KLQkJCWluZm8tPmZpZWxkX2ZsYWdzID0gKHU4KQotCQkJICAgICgoaW5mby0+Ci0JCQkgICAgICBmaWVsZF9mbGFncyAmIH4oQU1MX0ZJRUxEX0FDQ0VTU19UWVBFX01BU0spKSB8Ci0JCQkgICAgICgodTgpICgodTMyKSBhcmctPmNvbW1vbi52YWx1ZS5pbnRlZ2VyID4+IDgpKSk7Ci0KLQkJCWluZm8tPmF0dHJpYnV0ZSA9ICh1OCkgKGFyZy0+Y29tbW9uLnZhbHVlLmludGVnZXIpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBBTUxfSU5UX05BTUVERklFTERfT1A6Ci0KLQkJCS8qIExvb2t1cCB0aGUgbmFtZSwgaXQgc2hvdWxkIGFscmVhZHkgZXhpc3QgKi8KLQotCQkJc3RhdHVzID0gYWNwaV9uc19sb29rdXAod2Fsa19zdGF0ZS0+c2NvcGVfaW5mbywKLQkJCQkJCShjaGFyICopJmFyZy0+bmFtZWQubmFtZSwKLQkJCQkJCWluZm8tPmZpZWxkX3R5cGUsCi0JCQkJCQlBQ1BJX0lNT0RFX0VYRUNVVEUsCi0JCQkJCQlBQ1BJX05TX0RPTlRfT1BFTl9TQ09QRSwKLQkJCQkJCXdhbGtfc3RhdGUsICZpbmZvLT5maWVsZF9ub2RlKTsKLQkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQkJCUFDUElfRVJST1JfTkFNRVNQQUNFKChjaGFyICopJmFyZy0+bmFtZWQubmFtZSwKLQkJCQkJCSAgICAgc3RhdHVzKTsKLQkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLQkJCX0gZWxzZSB7Ci0JCQkJYXJnLT5jb21tb24ubm9kZSA9IGluZm8tPmZpZWxkX25vZGU7Ci0JCQkJaW5mby0+ZmllbGRfYml0X2xlbmd0aCA9IGFyZy0+Y29tbW9uLnZhbHVlLnNpemU7Ci0KLQkJCQkvKgotCQkJCSAqIElmIHRoZXJlIGlzIG5vIG9iamVjdCBhdHRhY2hlZCB0byB0aGUgbm9kZSwgdGhpcyBub2RlIHdhcwotCQkJCSAqIGp1c3QgY3JlYXRlZCBhbmQgd2UgbmVlZCB0byBjcmVhdGUgdGhlIGZpZWxkIG9iamVjdC4KLQkJCQkgKiBPdGhlcndpc2UsIHRoaXMgd2FzIGEgbG9va3VwIG9mIGFuIGV4aXN0aW5nIG5vZGUgYW5kIHdlCi0JCQkJICogZG9uJ3Qgd2FudCB0byBjcmVhdGUgdGhlIGZpZWxkIG9iamVjdCBhZ2Fpbi4KLQkJCQkgKi8KLQkJCQlpZiAoIWFjcGlfbnNfZ2V0X2F0dGFjaGVkX29iamVjdAotCQkJCSAgICAoaW5mby0+ZmllbGRfbm9kZSkpIHsKLQkJCQkJc3RhdHVzID0gYWNwaV9leF9wcmVwX2ZpZWxkX3ZhbHVlKGluZm8pOwotCQkJCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQkvKiBLZWVwIHRyYWNrIG9mIGJpdCBwb3NpdGlvbiBmb3IgdGhlIG5leHQgZmllbGQgKi8KLQotCQkJcG9zaXRpb24gPSAoYWNwaV9pbnRlZ2VyKSBpbmZvLT5maWVsZF9iaXRfcG9zaXRpb24KLQkJCSAgICArIChhY3BpX2ludGVnZXIpIGFyZy0+Y29tbW9uLnZhbHVlLnNpemU7Ci0KLQkJCWlmIChwb3NpdGlvbiA+IEFDUElfVUlOVDMyX01BWCkgewotCQkJCUFDUElfRVJST1IoKEFFX0lORk8sCi0JCQkJCSAgICAiRmllbGQgWyU0LjRzXSBiaXQgb2Zmc2V0IHRvbyBsYXJnZSAoPiAweEZGRkZGRkZGKSIsCi0JCQkJCSAgICBBQ1BJX0NBU1RfUFRSKGNoYXIsCi0JCQkJCQkJICAmaW5mby0+ZmllbGRfbm9kZS0+Ci0JCQkJCQkJICBuYW1lKSkpOwotCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9TVVBQT1JUKTsKLQkJCX0KLQotCQkJaW5mby0+ZmllbGRfYml0X3Bvc2l0aW9uICs9IGluZm8tPmZpZWxkX2JpdF9sZW5ndGg7Ci0JCQlicmVhazsKLQotCQlkZWZhdWx0OgotCi0JCQlBQ1BJX0VSUk9SKChBRV9JTkZPLAotCQkJCSAgICAiSW52YWxpZCBvcGNvZGUgaW4gZmllbGQgbGlzdDogJVgiLAotCQkJCSAgICBhcmctPmNvbW1vbi5hbWxfb3Bjb2RlKSk7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX0JBRF9PUENPREUpOwotCQl9Ci0KLQkJYXJnID0gYXJnLT5jb21tb24ubmV4dDsKLQl9Ci0KLQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX2RzX2NyZWF0ZV9maWVsZAotICoKLSAqIFBBUkFNRVRFUlM6ICBPcCAgICAgICAgICAgICAgLSBPcCBjb250YWluaW5nIHRoZSBGaWVsZCBkZWZpbml0aW9uIGFuZCBhcmdzCi0gKiAgICAgICAgICAgICAgcmVnaW9uX25vZGUgICAgIC0gT2JqZWN0IGZvciB0aGUgY29udGFpbmluZyBPcGVyYXRpb24gUmVnaW9uCi0gKiAgYCAgICAgICAgICAgd2Fsa19zdGF0ZSAgICAgIC0gQ3VycmVudCBtZXRob2Qgc3RhdGUKLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IENyZWF0ZSBhIG5ldyBmaWVsZCBpbiB0aGUgc3BlY2lmaWVkIG9wZXJhdGlvbiByZWdpb24KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1hY3BpX3N0YXR1cwotYWNwaV9kc19jcmVhdGVfZmllbGQodW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKm9wLAotCQkgICAgIHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpyZWdpb25fbm9kZSwKLQkJICAgICBzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKQotewotCWFjcGlfc3RhdHVzIHN0YXR1czsKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqYXJnOwotCXN0cnVjdCBhY3BpX2NyZWF0ZV9maWVsZF9pbmZvIGluZm87Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUihkc19jcmVhdGVfZmllbGQsIG9wKTsKLQotCS8qIEZpcnN0IGFyZyBpcyB0aGUgbmFtZSBvZiB0aGUgcGFyZW50IG9wX3JlZ2lvbiAobXVzdCBhbHJlYWR5IGV4aXN0KSAqLwotCi0JYXJnID0gb3AtPmNvbW1vbi52YWx1ZS5hcmc7Ci0JaWYgKCFyZWdpb25fbm9kZSkgewotCQlzdGF0dXMgPQotCQkgICAgYWNwaV9uc19sb29rdXAod2Fsa19zdGF0ZS0+c2NvcGVfaW5mbywKLQkJCQkgICBhcmctPmNvbW1vbi52YWx1ZS5uYW1lLCBBQ1BJX1RZUEVfUkVHSU9OLAotCQkJCSAgIEFDUElfSU1PREVfRVhFQ1VURSwgQUNQSV9OU19TRUFSQ0hfUEFSRU5ULAotCQkJCSAgIHdhbGtfc3RhdGUsICZyZWdpb25fbm9kZSk7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQkJQUNQSV9FUlJPUl9OQU1FU1BBQ0UoYXJnLT5jb21tb24udmFsdWUubmFtZSwgc3RhdHVzKTsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotCQl9Ci0JfQotCi0JLyogU2Vjb25kIGFyZyBpcyB0aGUgZmllbGQgZmxhZ3MgKi8KLQotCWFyZyA9IGFyZy0+Y29tbW9uLm5leHQ7Ci0JaW5mby5maWVsZF9mbGFncyA9ICh1OCkgYXJnLT5jb21tb24udmFsdWUuaW50ZWdlcjsKLQlpbmZvLmF0dHJpYnV0ZSA9IDA7Ci0KLQkvKiBFYWNoIHJlbWFpbmluZyBhcmcgaXMgYSBOYW1lZCBGaWVsZCAqLwotCi0JaW5mby5maWVsZF90eXBlID0gQUNQSV9UWVBFX0xPQ0FMX1JFR0lPTl9GSUVMRDsKLQlpbmZvLnJlZ2lvbl9ub2RlID0gcmVnaW9uX25vZGU7Ci0KLQlzdGF0dXMgPSBhY3BpX2RzX2dldF9maWVsZF9uYW1lcygmaW5mbywgd2Fsa19zdGF0ZSwgYXJnLT5jb21tb24ubmV4dCk7Ci0KLQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9kc19pbml0X2ZpZWxkX29iamVjdHMKLSAqCi0gKiBQQVJBTUVURVJTOiAgT3AgICAgICAgICAgICAgIC0gT3AgY29udGFpbmluZyB0aGUgRmllbGQgZGVmaW5pdGlvbiBhbmQgYXJncwotICogIGAgICAgICAgICAgIHdhbGtfc3RhdGUgICAgICAtIEN1cnJlbnQgbWV0aG9kIHN0YXRlCi0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cwotICoKLSAqIERFU0NSSVBUSU9OOiBGb3IgZWFjaCAiRmllbGQgVW5pdCIgbmFtZSBpbiB0aGUgYXJndW1lbnQgbGlzdCB0aGF0IGlzCi0gKiAgICAgICAgICAgICAgcGFydCBvZiB0aGUgZmllbGQgZGVjbGFyYXRpb24sIGVudGVyIHRoZSBuYW1lIGludG8gdGhlCi0gKiAgICAgICAgICAgICAgbmFtZXNwYWNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWFjcGlfc3RhdHVzCi1hY3BpX2RzX2luaXRfZmllbGRfb2JqZWN0cyh1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqb3AsCi0JCQkgICBzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKQotewotCWFjcGlfc3RhdHVzIHN0YXR1czsKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqYXJnID0gTlVMTDsKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZTsKLQl1OCB0eXBlID0gMDsKLQl1MzIgZmxhZ3M7Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUihkc19pbml0X2ZpZWxkX29iamVjdHMsIG9wKTsKLQotCS8qIEV4ZWN1dGUgZmxhZyBzaG91bGQgYWx3YXlzIGJlIHNldCB3aGVuIHRoaXMgZnVuY3Rpb24gaXMgZW50ZXJlZCAqLwotCi0JaWYgKCEod2Fsa19zdGF0ZS0+cGFyc2VfZmxhZ3MgJiBBQ1BJX1BBUlNFX0VYRUNVVEUpKSB7Ci0JCWlmICh3YWxrX3N0YXRlLT5wYXJzZV9mbGFncyAmIEFDUElfUEFSU0VfREVGRVJSRURfT1ApIHsKLQotCQkJLyogYmFua19maWVsZCBPcCBpcyBkZWZlcnJlZCwganVzdCByZXR1cm4gT0sgKi8KLQotCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKLQkJfQotCi0JCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfSU5URVJOQUwpOwotCX0KLQotCS8qCi0JICogR2V0IHRoZSBmaWVsZF9saXN0IGFyZ3VtZW50IGZvciB0aGlzIG9wY29kZS4gVGhpcyBpcyB0aGUgc3RhcnQgb2YgdGhlCi0JICogbGlzdCBvZiBmaWVsZCBlbGVtZW50cy4KLQkgKi8KLQlzd2l0Y2ggKHdhbGtfc3RhdGUtPm9wY29kZSkgewotCWNhc2UgQU1MX0ZJRUxEX09QOgotCQlhcmcgPSBhY3BpX3BzX2dldF9hcmcob3AsIDIpOwotCQl0eXBlID0gQUNQSV9UWVBFX0xPQ0FMX1JFR0lPTl9GSUVMRDsKLQkJYnJlYWs7Ci0KLQljYXNlIEFNTF9CQU5LX0ZJRUxEX09QOgotCQlhcmcgPSBhY3BpX3BzX2dldF9hcmcob3AsIDQpOwotCQl0eXBlID0gQUNQSV9UWVBFX0xPQ0FMX0JBTktfRklFTEQ7Ci0JCWJyZWFrOwotCi0JY2FzZSBBTUxfSU5ERVhfRklFTERfT1A6Ci0JCWFyZyA9IGFjcGlfcHNfZ2V0X2FyZyhvcCwgMyk7Ci0JCXR5cGUgPSBBQ1BJX1RZUEVfTE9DQUxfSU5ERVhfRklFTEQ7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9QQVJBTUVURVIpOwotCX0KLQotCS8qIENyZWF0aW5nIG5ldyBuYW1lc3BhY2Ugbm9kZShzKSwgc2hvdWxkIG5vdCBhbHJlYWR5IGV4aXN0ICovCi0KLQlmbGFncyA9IEFDUElfTlNfTk9fVVBTRUFSQ0ggfCBBQ1BJX05TX0RPTlRfT1BFTl9TQ09QRSB8Ci0JICAgIEFDUElfTlNfRVJST1JfSUZfRk9VTkQ7Ci0KLQkvKiBNYXJrIG5vZGUocykgdGVtcG9yYXJ5IGlmIHdlIGFyZSBleGVjdXRpbmcgYSBtZXRob2QgKi8KLQotCWlmICh3YWxrX3N0YXRlLT5tZXRob2Rfbm9kZSkgewotCQlmbGFncyB8PSBBQ1BJX05TX1RFTVBPUkFSWTsKLQl9Ci0KLQkvKgotCSAqIFdhbGsgdGhlIGxpc3Qgb2YgZW50cmllcyBpbiB0aGUgZmllbGRfbGlzdAotCSAqIE5vdGU6IGZpZWxkX2xpc3QgY2FuIGJlIG9mIHplcm8gbGVuZ3RoLiBJbiB0aGlzIGNhc2UsIEFyZyB3aWxsIGJlIE5VTEwuCi0JICovCi0Jd2hpbGUgKGFyZykgewotCQkvKgotCQkgKiBJZ25vcmUgT0ZGU0VUIGFuZCBBQ0NFU1NBUyB0ZXJtcyBoZXJlOyB3ZSBhcmUgb25seSBpbnRlcmVzdGVkIGluIHRoZQotCQkgKiBmaWVsZCBuYW1lcyBpbiBvcmRlciB0byBlbnRlciB0aGVtIGludG8gdGhlIG5hbWVzcGFjZS4KLQkJICovCi0JCWlmIChhcmctPmNvbW1vbi5hbWxfb3Bjb2RlID09IEFNTF9JTlRfTkFNRURGSUVMRF9PUCkgewotCQkJc3RhdHVzID0gYWNwaV9uc19sb29rdXAod2Fsa19zdGF0ZS0+c2NvcGVfaW5mbywKLQkJCQkJCShjaGFyICopJmFyZy0+bmFtZWQubmFtZSwgdHlwZSwKLQkJCQkJCUFDUElfSU1PREVfTE9BRF9QQVNTMSwgZmxhZ3MsCi0JCQkJCQl3YWxrX3N0YXRlLCAmbm9kZSk7Ci0JCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJCQlBQ1BJX0VSUk9SX05BTUVTUEFDRSgoY2hhciAqKSZhcmctPm5hbWVkLm5hbWUsCi0JCQkJCQkgICAgIHN0YXR1cyk7Ci0JCQkJaWYgKHN0YXR1cyAhPSBBRV9BTFJFQURZX0VYSVNUUykgewotCQkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLQkJCQl9Ci0KLQkJCQkvKiBOYW1lIGFscmVhZHkgZXhpc3RzLCBqdXN0IGlnbm9yZSB0aGlzIGVycm9yICovCi0KLQkJCQlzdGF0dXMgPSBBRV9PSzsKLQkJCX0KLQotCQkJYXJnLT5jb21tb24ubm9kZSA9IG5vZGU7Ci0JCX0KLQotCQkvKiBHZXQgdGhlIG5leHQgZmllbGQgZWxlbWVudCBpbiB0aGUgbGlzdCAqLwotCi0JCWFyZyA9IGFyZy0+Y29tbW9uLm5leHQ7Ci0JfQotCi0JcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9kc19jcmVhdGVfYmFua19maWVsZAotICoKLSAqIFBBUkFNRVRFUlM6ICBPcCAgICAgICAgICAgICAgLSBPcCBjb250YWluaW5nIHRoZSBGaWVsZCBkZWZpbml0aW9uIGFuZCBhcmdzCi0gKiAgICAgICAgICAgICAgcmVnaW9uX25vZGUgICAgIC0gT2JqZWN0IGZvciB0aGUgY29udGFpbmluZyBPcGVyYXRpb24gUmVnaW9uCi0gKiAgICAgICAgICAgICAgd2Fsa19zdGF0ZSAgICAgIC0gQ3VycmVudCBtZXRob2Qgc3RhdGUKLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IENyZWF0ZSBhIG5ldyBiYW5rIGZpZWxkIGluIHRoZSBzcGVjaWZpZWQgb3BlcmF0aW9uIHJlZ2lvbgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWFjcGlfc3RhdHVzCi1hY3BpX2RzX2NyZWF0ZV9iYW5rX2ZpZWxkKHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpvcCwKLQkJCSAgc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKnJlZ2lvbl9ub2RlLAotCQkJICBzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKQotewotCWFjcGlfc3RhdHVzIHN0YXR1czsKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqYXJnOwotCXN0cnVjdCBhY3BpX2NyZWF0ZV9maWVsZF9pbmZvIGluZm87Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUihkc19jcmVhdGVfYmFua19maWVsZCwgb3ApOwotCi0JLyogRmlyc3QgYXJnIGlzIHRoZSBuYW1lIG9mIHRoZSBwYXJlbnQgb3BfcmVnaW9uIChtdXN0IGFscmVhZHkgZXhpc3QpICovCi0KLQlhcmcgPSBvcC0+Y29tbW9uLnZhbHVlLmFyZzsKLQlpZiAoIXJlZ2lvbl9ub2RlKSB7Ci0JCXN0YXR1cyA9Ci0JCSAgICBhY3BpX25zX2xvb2t1cCh3YWxrX3N0YXRlLT5zY29wZV9pbmZvLAotCQkJCSAgIGFyZy0+Y29tbW9uLnZhbHVlLm5hbWUsIEFDUElfVFlQRV9SRUdJT04sCi0JCQkJICAgQUNQSV9JTU9ERV9FWEVDVVRFLCBBQ1BJX05TX1NFQVJDSF9QQVJFTlQsCi0JCQkJICAgd2Fsa19zdGF0ZSwgJnJlZ2lvbl9ub2RlKTsKLQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCQlBQ1BJX0VSUk9SX05BTUVTUEFDRShhcmctPmNvbW1vbi52YWx1ZS5uYW1lLCBzdGF0dXMpOwotCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci0JCX0KLQl9Ci0KLQkvKiBTZWNvbmQgYXJnIGlzIHRoZSBCYW5rIFJlZ2lzdGVyIChGaWVsZCkgKG11c3QgYWxyZWFkeSBleGlzdCkgKi8KLQotCWFyZyA9IGFyZy0+Y29tbW9uLm5leHQ7Ci0Jc3RhdHVzID0KLQkgICAgYWNwaV9uc19sb29rdXAod2Fsa19zdGF0ZS0+c2NvcGVfaW5mbywgYXJnLT5jb21tb24udmFsdWUuc3RyaW5nLAotCQkJICAgQUNQSV9UWVBFX0FOWSwgQUNQSV9JTU9ERV9FWEVDVVRFLAotCQkJICAgQUNQSV9OU19TRUFSQ0hfUEFSRU5ULCB3YWxrX3N0YXRlLAotCQkJICAgJmluZm8ucmVnaXN0ZXJfbm9kZSk7Ci0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCUFDUElfRVJST1JfTkFNRVNQQUNFKGFyZy0+Y29tbW9uLnZhbHVlLnN0cmluZywgc3RhdHVzKTsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci0JfQotCi0JLyoKLQkgKiBUaGlyZCBhcmcgaXMgdGhlIGJhbmtfdmFsdWUKLQkgKiBUaGlzIGFyZyBpcyBhIHRlcm1fYXJnLCBub3QgYSBjb25zdGFudAotCSAqIEl0IHdpbGwgYmUgZXZhbHVhdGVkIGxhdGVyLCBieSBhY3BpX2RzX2V2YWxfYmFua19maWVsZF9vcGVyYW5kcwotCSAqLwotCWFyZyA9IGFyZy0+Y29tbW9uLm5leHQ7Ci0KLQkvKiBGb3VydGggYXJnIGlzIHRoZSBmaWVsZCBmbGFncyAqLwotCi0JYXJnID0gYXJnLT5jb21tb24ubmV4dDsKLQlpbmZvLmZpZWxkX2ZsYWdzID0gKHU4KSBhcmctPmNvbW1vbi52YWx1ZS5pbnRlZ2VyOwotCi0JLyogRWFjaCByZW1haW5pbmcgYXJnIGlzIGEgTmFtZWQgRmllbGQgKi8KLQotCWluZm8uZmllbGRfdHlwZSA9IEFDUElfVFlQRV9MT0NBTF9CQU5LX0ZJRUxEOwotCWluZm8ucmVnaW9uX25vZGUgPSByZWdpb25fbm9kZTsKLQotCS8qCi0JICogVXNlIEluZm8uZGF0YV9yZWdpc3Rlcl9ub2RlIHRvIHN0b3JlIGJhbmtfZmllbGQgT3AKLQkgKiBJdCdzIHNhZmUgYmVjYXVzZSBkYXRhX3JlZ2lzdGVyX25vZGUgd2lsbCBuZXZlciBiZSB1c2VkIHdoZW4gY3JlYXRlIGJhbmsgZmllbGQKLQkgKiBXZSBzdG9yZSBhbWxfc3RhcnQgYW5kIGFtbF9sZW5ndGggaW4gdGhlIGJhbmtfZmllbGQgT3AgZm9yIGxhdGUgZXZhbHVhdGlvbgotCSAqIFVzZWQgaW4gYWNwaV9leF9wcmVwX2ZpZWxkX3ZhbHVlKEluZm8pCi0JICoKLQkgKiBUQkQ6IE9yLCBzaG91bGQgd2UgYWRkIGEgZmllbGQgaW4gc3RydWN0IGFjcGlfY3JlYXRlX2ZpZWxkX2luZm8sIGxpa2UgInZvaWQgKlBhcmVudE9wIj8KLQkgKi8KLQlpbmZvLmRhdGFfcmVnaXN0ZXJfbm9kZSA9IChzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqKW9wOwotCi0Jc3RhdHVzID0gYWNwaV9kc19nZXRfZmllbGRfbmFtZXMoJmluZm8sIHdhbGtfc3RhdGUsIGFyZy0+Y29tbW9uLm5leHQpOwotCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX2RzX2NyZWF0ZV9pbmRleF9maWVsZAotICoKLSAqIFBBUkFNRVRFUlM6ICBPcCAgICAgICAgICAgICAgLSBPcCBjb250YWluaW5nIHRoZSBGaWVsZCBkZWZpbml0aW9uIGFuZCBhcmdzCi0gKiAgICAgICAgICAgICAgcmVnaW9uX25vZGUgICAgIC0gT2JqZWN0IGZvciB0aGUgY29udGFpbmluZyBPcGVyYXRpb24gUmVnaW9uCi0gKiAgYCAgICAgICAgICAgd2Fsa19zdGF0ZSAgICAgIC0gQ3VycmVudCBtZXRob2Qgc3RhdGUKLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IENyZWF0ZSBhIG5ldyBpbmRleCBmaWVsZCBpbiB0aGUgc3BlY2lmaWVkIG9wZXJhdGlvbiByZWdpb24KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1hY3BpX3N0YXR1cwotYWNwaV9kc19jcmVhdGVfaW5kZXhfZmllbGQodW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKm9wLAotCQkJICAgc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKnJlZ2lvbl9ub2RlLAotCQkJICAgc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSkKLXsKLQlhY3BpX3N0YXR1cyBzdGF0dXM7Ci0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKmFyZzsKLQlzdHJ1Y3QgYWNwaV9jcmVhdGVfZmllbGRfaW5mbyBpbmZvOwotCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIoZHNfY3JlYXRlX2luZGV4X2ZpZWxkLCBvcCk7Ci0KLQkvKiBGaXJzdCBhcmcgaXMgdGhlIG5hbWUgb2YgdGhlIEluZGV4IHJlZ2lzdGVyIChtdXN0IGFscmVhZHkgZXhpc3QpICovCi0KLQlhcmcgPSBvcC0+Y29tbW9uLnZhbHVlLmFyZzsKLQlzdGF0dXMgPQotCSAgICBhY3BpX25zX2xvb2t1cCh3YWxrX3N0YXRlLT5zY29wZV9pbmZvLCBhcmctPmNvbW1vbi52YWx1ZS5zdHJpbmcsCi0JCQkgICBBQ1BJX1RZUEVfQU5ZLCBBQ1BJX0lNT0RFX0VYRUNVVEUsCi0JCQkgICBBQ1BJX05TX1NFQVJDSF9QQVJFTlQsIHdhbGtfc3RhdGUsCi0JCQkgICAmaW5mby5yZWdpc3Rlcl9ub2RlKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJQUNQSV9FUlJPUl9OQU1FU1BBQ0UoYXJnLT5jb21tb24udmFsdWUuc3RyaW5nLCBzdGF0dXMpOwotCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLQl9Ci0KLQkvKiBTZWNvbmQgYXJnIGlzIHRoZSBkYXRhIHJlZ2lzdGVyIChtdXN0IGFscmVhZHkgZXhpc3QpICovCi0KLQlhcmcgPSBhcmctPmNvbW1vbi5uZXh0OwotCXN0YXR1cyA9Ci0JICAgIGFjcGlfbnNfbG9va3VwKHdhbGtfc3RhdGUtPnNjb3BlX2luZm8sIGFyZy0+Y29tbW9uLnZhbHVlLnN0cmluZywKLQkJCSAgIEFDUElfVFlQRV9BTlksIEFDUElfSU1PREVfRVhFQ1VURSwKLQkJCSAgIEFDUElfTlNfU0VBUkNIX1BBUkVOVCwgd2Fsa19zdGF0ZSwKLQkJCSAgICZpbmZvLmRhdGFfcmVnaXN0ZXJfbm9kZSk7Ci0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCUFDUElfRVJST1JfTkFNRVNQQUNFKGFyZy0+Y29tbW9uLnZhbHVlLnN0cmluZywgc3RhdHVzKTsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci0JfQotCi0JLyogTmV4dCBhcmcgaXMgdGhlIGZpZWxkIGZsYWdzICovCi0KLQlhcmcgPSBhcmctPmNvbW1vbi5uZXh0OwotCWluZm8uZmllbGRfZmxhZ3MgPSAodTgpIGFyZy0+Y29tbW9uLnZhbHVlLmludGVnZXI7Ci0KLQkvKiBFYWNoIHJlbWFpbmluZyBhcmcgaXMgYSBOYW1lZCBGaWVsZCAqLwotCi0JaW5mby5maWVsZF90eXBlID0gQUNQSV9UWVBFX0xPQ0FMX0lOREVYX0ZJRUxEOwotCWluZm8ucmVnaW9uX25vZGUgPSByZWdpb25fbm9kZTsKLQotCXN0YXR1cyA9IGFjcGlfZHNfZ2V0X2ZpZWxkX25hbWVzKCZpbmZvLCB3YWxrX3N0YXRlLCBhcmctPmNvbW1vbi5uZXh0KTsKLQotCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2Rpc3BhdGNoZXIvZHNpbml0LmMgYi9kcml2ZXJzL2FjcGkvZGlzcGF0Y2hlci9kc2luaXQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQ5ZjdjNy4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL2FjcGkvZGlzcGF0Y2hlci9kc2luaXQuYworKysgL2Rldi9udWxsCkBAIC0xLDIwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogTW9kdWxlIE5hbWU6IGRzaW5pdCAtIE9iamVjdCBpbml0aWFsaXphdGlvbiBuYW1lc3BhY2Ugd2FsawotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDgsIEludGVsIENvcnAuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCi0gKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSBhdCBtaW5pbXVtIGEgZGlzY2xhaW1lcgotICogICAgc3Vic3RhbnRpYWxseSBzaW1pbGFyIHRvIHRoZSAiTk8gV0FSUkFOVFkiIGRpc2NsYWltZXIgYmVsb3cKLSAqICAgICgiRGlzY2xhaW1lciIpIGFuZCBhbnkgcmVkaXN0cmlidXRpb24gbXVzdCBiZSBjb25kaXRpb25lZCB1cG9uCi0gKiAgICBpbmNsdWRpbmcgYSBzdWJzdGFudGlhbGx5IHNpbWlsYXIgRGlzY2xhaW1lciByZXF1aXJlbWVudCBmb3IgZnVydGhlcgotICogICAgYmluYXJ5IHJlZGlzdHJpYnV0aW9uLgotICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzCi0gKiAgICBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIE5PIFdBUlJBTlRZCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKLSAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCi0gKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORwotICogSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCi0gKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCi0gKi8KLQotI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgotI2luY2x1ZGUgPGFjcGkvYWNkaXNwYXQuaD4KLSNpbmNsdWRlIDxhY3BpL2FjbmFtZXNwLmg+Ci0jaW5jbHVkZSA8YWNwaS9hY3RhYmxlcy5oPgotCi0jZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9ESVNQQVRDSEVSCi1BQ1BJX01PRFVMRV9OQU1FKCJkc2luaXQiKQotCi0vKiBMb2NhbCBwcm90b3R5cGVzICovCi1zdGF0aWMgYWNwaV9zdGF0dXMKLWFjcGlfZHNfaW5pdF9vbmVfb2JqZWN0KGFjcGlfaGFuZGxlIG9ial9oYW5kbGUsCi0JCQl1MzIgbGV2ZWwsIHZvaWQgKmNvbnRleHQsIHZvaWQgKipyZXR1cm5fdmFsdWUpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX2RzX2luaXRfb25lX29iamVjdAotICoKLSAqIFBBUkFNRVRFUlM6ICBvYmpfaGFuZGxlICAgICAgLSBOb2RlIGZvciB0aGUgb2JqZWN0Ci0gKiAgICAgICAgICAgICAgTGV2ZWwgICAgICAgICAgIC0gQ3VycmVudCBuZXN0aW5nIGxldmVsCi0gKiAgICAgICAgICAgICAgQ29udGV4dCAgICAgICAgIC0gUG9pbnRzIHRvIGEgaW5pdCBpbmZvIHN0cnVjdAotICogICAgICAgICAgICAgIHJldHVybl92YWx1ZSAgICAtIE5vdCB1c2VkCi0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cwotICoKLSAqIERFU0NSSVBUSU9OOiBDYWxsYmFjayBmcm9tIGFjcGlfd2Fsa19uYW1lc3BhY2UuIEludm9rZWQgZm9yIGV2ZXJ5IG9iamVjdAotICogICAgICAgICAgICAgIHdpdGhpbiB0aGUgbmFtZXNwYWNlLgotICoKLSAqICAgICAgICAgICAgICBDdXJyZW50bHksIHRoZSBvbmx5IG9iamVjdHMgdGhhdCByZXF1aXJlIGluaXRpYWxpemF0aW9uIGFyZToKLSAqICAgICAgICAgICAgICAxKSBNZXRob2RzCi0gKiAgICAgICAgICAgICAgMikgT3BlcmF0aW9uIFJlZ2lvbnMKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgYWNwaV9zdGF0dXMKLWFjcGlfZHNfaW5pdF9vbmVfb2JqZWN0KGFjcGlfaGFuZGxlIG9ial9oYW5kbGUsCi0JCQl1MzIgbGV2ZWwsIHZvaWQgKmNvbnRleHQsIHZvaWQgKipyZXR1cm5fdmFsdWUpCi17Ci0Jc3RydWN0IGFjcGlfaW5pdF93YWxrX2luZm8gKmluZm8gPQotCSAgICAoc3RydWN0IGFjcGlfaW5pdF93YWxrX2luZm8gKiljb250ZXh0OwotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlID0KLQkgICAgKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICopb2JqX2hhbmRsZTsKLQlhY3BpX29iamVjdF90eXBlIHR5cGU7Ci0JYWNwaV9zdGF0dXMgc3RhdHVzOwotCi0JQUNQSV9GVU5DVElPTl9FTlRSWSgpOwotCi0JLyoKLQkgKiBXZSBhcmUgb25seSBpbnRlcmVzdGVkIGluIE5TIG5vZGVzIG93bmVkIGJ5IHRoZSB0YWJsZSB0aGF0Ci0JICogd2FzIGp1c3QgbG9hZGVkCi0JICovCi0JaWYgKG5vZGUtPm93bmVyX2lkICE9IGluZm8tPm93bmVyX2lkKSB7Ci0JCXJldHVybiAoQUVfT0spOwotCX0KLQotCWluZm8tPm9iamVjdF9jb3VudCsrOwotCi0JLyogQW5kIGV2ZW4gdGhlbiwgd2UgYXJlIG9ubHkgaW50ZXJlc3RlZCBpbiBhIGZldyBvYmplY3QgdHlwZXMgKi8KLQotCXR5cGUgPSBhY3BpX25zX2dldF90eXBlKG9ial9oYW5kbGUpOwotCi0Jc3dpdGNoICh0eXBlKSB7Ci0JY2FzZSBBQ1BJX1RZUEVfUkVHSU9OOgotCi0JCXN0YXR1cyA9IGFjcGlfZHNfaW5pdGlhbGl6ZV9yZWdpb24ob2JqX2hhbmRsZSk7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQkJQUNQSV9FWENFUFRJT04oKEFFX0lORk8sIHN0YXR1cywKLQkJCQkJIkR1cmluZyBSZWdpb24gaW5pdGlhbGl6YXRpb24gJXAgWyU0LjRzXSIsCi0JCQkJCW9ial9oYW5kbGUsCi0JCQkJCWFjcGlfdXRfZ2V0X25vZGVfbmFtZShvYmpfaGFuZGxlKSkpOwotCQl9Ci0KLQkJaW5mby0+b3BfcmVnaW9uX2NvdW50Kys7Ci0JCWJyZWFrOwotCi0JY2FzZSBBQ1BJX1RZUEVfTUVUSE9EOgotCi0JCWluZm8tPm1ldGhvZF9jb3VudCsrOwotCQlicmVhazsKLQotCWNhc2UgQUNQSV9UWVBFX0RFVklDRToKLQotCQlpbmZvLT5kZXZpY2VfY291bnQrKzsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlicmVhazsKLQl9Ci0KLQkvKgotCSAqIFdlIGlnbm9yZSBlcnJvcnMgZnJvbSBhYm92ZSwgYW5kIGFsd2F5cyByZXR1cm4gT0ssIHNpbmNlCi0JICogd2UgZG9uJ3Qgd2FudCB0byBhYm9ydCB0aGUgd2FsayBvbiBhIHNpbmdsZSBlcnJvci4KLQkgKi8KLQlyZXR1cm4gKEFFX09LKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9kc19pbml0aWFsaXplX29iamVjdHMKLSAqCi0gKiBQQVJBTUVURVJTOiAgdGFibGVfZGVzYyAgICAgIC0gRGVzY3JpcHRvciBmb3IgcGFyZW50IEFDUEkgdGFibGUKLSAqICAgICAgICAgICAgICBzdGFydF9ub2RlICAgICAgLSBSb290IG9mIHN1YnRyZWUgdG8gYmUgaW5pdGlhbGl6ZWQuCi0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cwotICoKLSAqIERFU0NSSVBUSU9OOiBXYWxrIHRoZSBuYW1lc3BhY2Ugc3RhcnRpbmcgYXQgIlN0YXJ0Tm9kZSIgYW5kIHBlcmZvcm0gYW55Ci0gKiAgICAgICAgICAgICAgbmVjZXNzYXJ5IGluaXRpYWxpemF0aW9uIG9uIHRoZSBvYmplY3RzIGZvdW5kIHRoZXJlaW4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1hY3BpX3N0YXR1cwotYWNwaV9kc19pbml0aWFsaXplX29iamVjdHModTMyIHRhYmxlX2luZGV4LAotCQkJICAgc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKiBzdGFydF9ub2RlKQotewotCWFjcGlfc3RhdHVzIHN0YXR1czsKLQlzdHJ1Y3QgYWNwaV9pbml0X3dhbGtfaW5mbyBpbmZvOwotCXN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqdGFibGU7Ci0JYWNwaV9vd25lcl9pZCBvd25lcl9pZDsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UoZHNfaW5pdGlhbGl6ZV9vYmplY3RzKTsKLQotCXN0YXR1cyA9IGFjcGlfdGJfZ2V0X293bmVyX2lkKHRhYmxlX2luZGV4LCAmb3duZXJfaWQpOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLQl9Ci0KLQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0RJU1BBVENILAotCQkJICAiKioqKiBTdGFydGluZyBpbml0aWFsaXphdGlvbiBvZiBuYW1lc3BhY2Ugb2JqZWN0cyAqKioqXG4iKSk7Ci0JQUNQSV9ERUJVR19QUklOVF9SQVcoKEFDUElfREJfSU5JVCwgIlBhcnNpbmcgYWxsIENvbnRyb2wgTWV0aG9kczoiKSk7Ci0KLQlpbmZvLm1ldGhvZF9jb3VudCA9IDA7Ci0JaW5mby5vcF9yZWdpb25fY291bnQgPSAwOwotCWluZm8ub2JqZWN0X2NvdW50ID0gMDsKLQlpbmZvLmRldmljZV9jb3VudCA9IDA7Ci0JaW5mby50YWJsZV9pbmRleCA9IHRhYmxlX2luZGV4OwotCWluZm8ub3duZXJfaWQgPSBvd25lcl9pZDsKLQotCS8qIFdhbGsgZW50aXJlIG5hbWVzcGFjZSBmcm9tIHRoZSBzdXBwbGllZCByb290ICovCi0KLQlzdGF0dXMgPSBhY3BpX3dhbGtfbmFtZXNwYWNlKEFDUElfVFlQRV9BTlksIHN0YXJ0X25vZGUsIEFDUElfVUlOVDMyX01BWCwKLQkJCQkgICAgIGFjcGlfZHNfaW5pdF9vbmVfb2JqZWN0LCAmaW5mbywgTlVMTCk7Ci0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCUFDUElfRVhDRVBUSU9OKChBRV9JTkZPLCBzdGF0dXMsICJEdXJpbmcgV2Fsa05hbWVzcGFjZSIpKTsKLQl9Ci0KLQlzdGF0dXMgPSBhY3BpX2dldF90YWJsZV9ieV9pbmRleCh0YWJsZV9pbmRleCwgJnRhYmxlKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci0JfQotCi0JQUNQSV9ERUJVR19QUklOVF9SQVcoKEFDUElfREJfSU5JVCwKLQkJCSAgICAgICJcblRhYmxlIFslNC40c10oaWQgJTQuNFgpIC0gJWhkIE9iamVjdHMgd2l0aCAlaGQgRGV2aWNlcyAlaGQgTWV0aG9kcyAlaGQgUmVnaW9uc1xuIiwKLQkJCSAgICAgIHRhYmxlLT5zaWduYXR1cmUsIG93bmVyX2lkLCBpbmZvLm9iamVjdF9jb3VudCwKLQkJCSAgICAgIGluZm8uZGV2aWNlX2NvdW50LCBpbmZvLm1ldGhvZF9jb3VudCwKLQkJCSAgICAgIGluZm8ub3BfcmVnaW9uX2NvdW50KSk7Ci0KLQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0RJU1BBVENILAotCQkJICAiJWhkIE1ldGhvZHMsICVoZCBSZWdpb25zXG4iLCBpbmZvLm1ldGhvZF9jb3VudCwKLQkJCSAgaW5mby5vcF9yZWdpb25fY291bnQpKTsKLQotCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZGlzcGF0Y2hlci9kc21ldGhvZC5jIGIvZHJpdmVycy9hY3BpL2Rpc3BhdGNoZXIvZHNtZXRob2QuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjc5YTVhNi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL2FjcGkvZGlzcGF0Y2hlci9kc21ldGhvZC5jCisrKyAvZGV2L251bGwKQEAgLTEsNjIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBNb2R1bGUgTmFtZTogZHNtZXRob2QgLSBQYXJzZXIvSW50ZXJwcmV0ZXIgaW50ZXJmYWNlIC0gY29udHJvbCBtZXRob2QgcGFyc2luZwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDgsIEludGVsIENvcnAuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCi0gKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSBhdCBtaW5pbXVtIGEgZGlzY2xhaW1lcgotICogICAgc3Vic3RhbnRpYWxseSBzaW1pbGFyIHRvIHRoZSAiTk8gV0FSUkFOVFkiIGRpc2NsYWltZXIgYmVsb3cKLSAqICAgICgiRGlzY2xhaW1lciIpIGFuZCBhbnkgcmVkaXN0cmlidXRpb24gbXVzdCBiZSBjb25kaXRpb25lZCB1cG9uCi0gKiAgICBpbmNsdWRpbmcgYSBzdWJzdGFudGlhbGx5IHNpbWlsYXIgRGlzY2xhaW1lciByZXF1aXJlbWVudCBmb3IgZnVydGhlcgotICogICAgYmluYXJ5IHJlZGlzdHJpYnV0aW9uLgotICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzCi0gKiAgICBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIE5PIFdBUlJBTlRZCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKLSAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCi0gKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORwotICogSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCi0gKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCi0gKi8KLQotI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgotI2luY2x1ZGUgPGFjcGkvYW1sY29kZS5oPgotI2luY2x1ZGUgPGFjcGkvYWNkaXNwYXQuaD4KLSNpbmNsdWRlIDxhY3BpL2FjaW50ZXJwLmg+Ci0jaW5jbHVkZSA8YWNwaS9hY25hbWVzcC5oPgotI2luY2x1ZGUgPGFjcGkvYWNkaXNhc20uaD4KLQotI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfRElTUEFUQ0hFUgotQUNQSV9NT0RVTEVfTkFNRSgiZHNtZXRob2QiKQotCi0vKiBMb2NhbCBwcm90b3R5cGVzICovCi1zdGF0aWMgYWNwaV9zdGF0dXMKLWFjcGlfZHNfY3JlYXRlX21ldGhvZF9tdXRleCh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICptZXRob2RfZGVzYyk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfZHNfbWV0aG9kX2Vycm9yCi0gKgotICogUEFSQU1FVEVSUzogIFN0YXR1cyAgICAgICAgICAtIEV4ZWN1dGlvbiBzdGF0dXMKLSAqICAgICAgICAgICAgICB3YWxrX3N0YXRlICAgICAgLSBDdXJyZW50IHN0YXRlCi0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cwotICoKLSAqIERFU0NSSVBUSU9OOiBDYWxsZWQgb24gbWV0aG9kIGVycm9yLiBJbnZva2UgdGhlIGdsb2JhbCBleGNlcHRpb24gaGFuZGxlciBpZgotICogICAgICAgICAgICAgIHByZXNlbnQsIGR1bXAgdGhlIG1ldGhvZCBkYXRhIGlmIHRoZSBkaXNhc3NlbWJsZXIgaXMgY29uZmlndXJlZAotICoKLSAqICAgICAgICAgICAgICBOb3RlOiBBbGxvd3MgdGhlIGV4Y2VwdGlvbiBoYW5kbGVyIHRvIGNoYW5nZSB0aGUgc3RhdHVzIGNvZGUKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1hY3BpX3N0YXR1cwotYWNwaV9kc19tZXRob2RfZXJyb3IoYWNwaV9zdGF0dXMgc3RhdHVzLCBzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKQotewotCUFDUElfRlVOQ1RJT05fRU5UUlkoKTsKLQotCS8qIElnbm9yZSBBRV9PSyBhbmQgY29udHJvbCBleGNlcHRpb24gY29kZXMgKi8KLQotCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSB8fCAoc3RhdHVzICYgQUVfQ09ERV9DT05UUk9MKSkgewotCQlyZXR1cm4gKHN0YXR1cyk7Ci0JfQotCi0JLyogSW52b2tlIHRoZSBnbG9iYWwgZXhjZXB0aW9uIGhhbmRsZXIgKi8KLQotCWlmIChhY3BpX2dibF9leGNlcHRpb25faGFuZGxlcikgewotCi0JCS8qIEV4aXQgdGhlIGludGVycHJldGVyLCBhbGxvdyBoYW5kbGVyIHRvIGV4ZWN1dGUgbWV0aG9kcyAqLwotCi0JCWFjcGlfZXhfZXhpdF9pbnRlcnByZXRlcigpOwotCi0JCS8qCi0JCSAqIEhhbmRsZXIgY2FuIG1hcCB0aGUgZXhjZXB0aW9uIGNvZGUgdG8gYW55dGhpbmcgaXQgd2FudHMsIGluY2x1ZGluZwotCQkgKiBBRV9PSywgaW4gd2hpY2ggY2FzZSB0aGUgZXhlY3V0aW5nIG1ldGhvZCB3aWxsIG5vdCBiZSBhYm9ydGVkLgotCQkgKi8KLQkJc3RhdHVzID0gYWNwaV9nYmxfZXhjZXB0aW9uX2hhbmRsZXIoc3RhdHVzLAotCQkJCQkJICAgIHdhbGtfc3RhdGUtPm1ldGhvZF9ub2RlID8KLQkJCQkJCSAgICB3YWxrX3N0YXRlLT5tZXRob2Rfbm9kZS0+Ci0JCQkJCQkgICAgbmFtZS5pbnRlZ2VyIDogMCwKLQkJCQkJCSAgICB3YWxrX3N0YXRlLT5vcGNvZGUsCi0JCQkJCQkgICAgd2Fsa19zdGF0ZS0+YW1sX29mZnNldCwKLQkJCQkJCSAgICBOVUxMKTsKLQkJYWNwaV9leF9lbnRlcl9pbnRlcnByZXRlcigpOwotCX0KLQotCWFjcGlfZHNfY2xlYXJfaW1wbGljaXRfcmV0dXJuKHdhbGtfc3RhdGUpOwotCi0jaWZkZWYgQUNQSV9ESVNBU1NFTUJMRVIKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQotCQkvKiBEaXNwbGF5IG1ldGhvZCBsb2NhbHMvYXJncyBpZiBkaXNhc3NlbWJsZXIgaXMgcHJlc2VudCAqLwotCi0JCWFjcGlfZG1fZHVtcF9tZXRob2RfaW5mbyhzdGF0dXMsIHdhbGtfc3RhdGUsIHdhbGtfc3RhdGUtPm9wKTsKLQl9Ci0jZW5kaWYKLQotCXJldHVybiAoc3RhdHVzKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9kc19jcmVhdGVfbWV0aG9kX211dGV4Ci0gKgotICogUEFSQU1FVEVSUzogIG9ial9kZXNjICAgICAgICAgICAgLSBUaGUgbWV0aG9kIG9iamVjdAotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKLSAqCi0gKiBERVNDUklQVElPTjogQ3JlYXRlIGEgbXV0ZXggb2JqZWN0IGZvciBhIHNlcmlhbGl6ZWQgY29udHJvbCBtZXRob2QKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgYWNwaV9zdGF0dXMKLWFjcGlfZHNfY3JlYXRlX21ldGhvZF9tdXRleCh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICptZXRob2RfZGVzYykKLXsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICptdXRleF9kZXNjOwotCWFjcGlfc3RhdHVzIHN0YXR1czsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UoZHNfY3JlYXRlX21ldGhvZF9tdXRleCk7Ci0KLQkvKiBDcmVhdGUgdGhlIG5ldyBtdXRleCBvYmplY3QgKi8KLQotCW11dGV4X2Rlc2MgPSBhY3BpX3V0X2NyZWF0ZV9pbnRlcm5hbF9vYmplY3QoQUNQSV9UWVBFX01VVEVYKTsKLQlpZiAoIW11dGV4X2Rlc2MpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX01FTU9SWSk7Ci0JfQotCi0JLyogQ3JlYXRlIHRoZSBhY3R1YWwgT1MgTXV0ZXggKi8KLQotCXN0YXR1cyA9IGFjcGlfb3NfY3JlYXRlX211dGV4KCZtdXRleF9kZXNjLT5tdXRleC5vc19tdXRleCk7Ci0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotCX0KLQotCW11dGV4X2Rlc2MtPm11dGV4LnN5bmNfbGV2ZWwgPSBtZXRob2RfZGVzYy0+bWV0aG9kLnN5bmNfbGV2ZWw7Ci0JbWV0aG9kX2Rlc2MtPm1ldGhvZC5tdXRleCA9IG11dGV4X2Rlc2M7Ci0JcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9kc19iZWdpbl9tZXRob2RfZXhlY3V0aW9uCi0gKgotICogUEFSQU1FVEVSUzogIG1ldGhvZF9ub2RlICAgICAgICAgLSBOb2RlIG9mIHRoZSBtZXRob2QKLSAqICAgICAgICAgICAgICBvYmpfZGVzYyAgICAgICAgICAgIC0gVGhlIG1ldGhvZCBvYmplY3QKLSAqICAgICAgICAgICAgICB3YWxrX3N0YXRlICAgICAgICAgIC0gY3VycmVudCBzdGF0ZSwgTlVMTCBpZiBub3QgeWV0IGV4ZWN1dGluZwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhIG1ldGhvZC4KLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IFByZXBhcmUgYSBtZXRob2QgZm9yIGV4ZWN1dGlvbi4gIFBhcnNlcyB0aGUgbWV0aG9kIGlmIG5lY2Vzc2FyeSwKLSAqICAgICAgICAgICAgICBpbmNyZW1lbnRzIHRoZSB0aHJlYWQgY291bnQsIGFuZCB3YWl0cyBhdCB0aGUgbWV0aG9kIHNlbWFwaG9yZQotICogICAgICAgICAgICAgIGZvciBjbGVhcmFuY2UgdG8gZXhlY3V0ZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1hY3BpX3N0YXR1cwotYWNwaV9kc19iZWdpbl9tZXRob2RfZXhlY3V0aW9uKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICptZXRob2Rfbm9kZSwKLQkJCSAgICAgICB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYywKLQkJCSAgICAgICBzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKQotewotCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOwotCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIoZHNfYmVnaW5fbWV0aG9kX2V4ZWN1dGlvbiwgbWV0aG9kX25vZGUpOwotCi0JaWYgKCFtZXRob2Rfbm9kZSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTlVMTF9FTlRSWSk7Ci0JfQotCi0JLyogUHJldmVudCB3cmFwYXJvdW5kIG9mIHRocmVhZCBjb3VudCAqLwotCi0JaWYgKG9ial9kZXNjLT5tZXRob2QudGhyZWFkX2NvdW50ID09IEFDUElfVUlOVDhfTUFYKSB7Ci0JCUFDUElfRVJST1IoKEFFX0lORk8sCi0JCQkgICAgIk1ldGhvZCByZWFjaGVkIG1heGltdW0gcmVlbnRyYW5jeSBsaW1pdCAoMjU1KSIpKTsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9NRVRIT0RfTElNSVQpOwotCX0KLQotCS8qCi0JICogSWYgdGhpcyBtZXRob2QgaXMgc2VyaWFsaXplZCwgd2UgbmVlZCB0byBhY3F1aXJlIHRoZSBtZXRob2QgbXV0ZXguCi0JICovCi0JaWYgKG9ial9kZXNjLT5tZXRob2QubWV0aG9kX2ZsYWdzICYgQU1MX01FVEhPRF9TRVJJQUxJWkVEKSB7Ci0JCS8qCi0JCSAqIENyZWF0ZSBhIG11dGV4IGZvciB0aGUgbWV0aG9kIGlmIGl0IGlzIGRlZmluZWQgdG8gYmUgU2VyaWFsaXplZAotCQkgKiBhbmQgYSBtdXRleCBoYXMgbm90IGFscmVhZHkgYmVlbiBjcmVhdGVkLiBXZSBkZWZlciB0aGUgbXV0ZXggY3JlYXRpb24KLQkJICogdW50aWwgYSBtZXRob2QgaXMgYWN0dWFsbHkgZXhlY3V0ZWQsIHRvIG1pbmltaXplIHRoZSBvYmplY3QgY291bnQKLQkJICovCi0JCWlmICghb2JqX2Rlc2MtPm1ldGhvZC5tdXRleCkgewotCQkJc3RhdHVzID0gYWNwaV9kc19jcmVhdGVfbWV0aG9kX211dGV4KG9ial9kZXNjKTsKLQkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotCQkJfQotCQl9Ci0KLQkJLyoKLQkJICogVGhlIGN1cnJlbnRfc3luY19sZXZlbCAocGVyLXRocmVhZCkgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8KLQkJICogdGhlIHN5bmMgbGV2ZWwgb2YgdGhlIG1ldGhvZC4gVGhpcyBtZWNoYW5pc20gcHJvdmlkZXMgc29tZQotCQkgKiBkZWFkbG9jayBwcmV2ZW50aW9uCi0JCSAqCi0JCSAqIFRvcC1sZXZlbCBtZXRob2QgaW52b2NhdGlvbiBoYXMgbm8gd2FsayBzdGF0ZSBhdCB0aGlzIHBvaW50Ci0JCSAqLwotCQlpZiAod2Fsa19zdGF0ZSAmJgotCQkgICAgKHdhbGtfc3RhdGUtPnRocmVhZC0+Y3VycmVudF9zeW5jX2xldmVsID4KLQkJICAgICBvYmpfZGVzYy0+bWV0aG9kLm11dGV4LT5tdXRleC5zeW5jX2xldmVsKSkgewotCQkJQUNQSV9FUlJPUigoQUVfSU5GTywKLQkJCQkgICAgIkNhbm5vdCBhY3F1aXJlIE11dGV4IGZvciBtZXRob2QgWyU0LjRzXSwgY3VycmVudCBTeW5jTGV2ZWwgaXMgdG9vIGxhcmdlICglZCkiLAotCQkJCSAgICBhY3BpX3V0X2dldF9ub2RlX25hbWUobWV0aG9kX25vZGUpLAotCQkJCSAgICB3YWxrX3N0YXRlLT50aHJlYWQtPmN1cnJlbnRfc3luY19sZXZlbCkpOwotCi0JCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX01VVEVYX09SREVSKTsKLQkJfQotCi0JCS8qCi0JCSAqIE9idGFpbiB0aGUgbWV0aG9kIG11dGV4IGlmIG5lY2Vzc2FyeS4gRG8gbm90IGFjcXVpcmUgbXV0ZXggZm9yIGEKLQkJICogcmVjdXJzaXZlIGNhbGwuCi0JCSAqLwotCQlpZiAoIXdhbGtfc3RhdGUgfHwKLQkJICAgICFvYmpfZGVzYy0+bWV0aG9kLm11dGV4LT5tdXRleC50aHJlYWRfaWQgfHwKLQkJICAgICh3YWxrX3N0YXRlLT50aHJlYWQtPnRocmVhZF9pZCAhPQotCQkgICAgIG9ial9kZXNjLT5tZXRob2QubXV0ZXgtPm11dGV4LnRocmVhZF9pZCkpIHsKLQkJCS8qCi0JCQkgKiBBY3F1aXJlIHRoZSBtZXRob2QgbXV0ZXguIFRoaXMgcmVsZWFzZXMgdGhlIGludGVycHJldGVyIGlmIHdlCi0JCQkgKiBibG9jayAoYW5kIHJlYWNxdWlyZXMgaXQgYmVmb3JlIGl0IHJldHVybnMpCi0JCQkgKi8KLQkJCXN0YXR1cyA9Ci0JCQkgICAgYWNwaV9leF9zeXN0ZW1fd2FpdF9tdXRleChvYmpfZGVzYy0+bWV0aG9kLm11dGV4LT4KLQkJCQkJCSAgICAgIG11dGV4Lm9zX211dGV4LAotCQkJCQkJICAgICAgQUNQSV9XQUlUX0ZPUkVWRVIpOwotCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci0JCQl9Ci0KLQkJCS8qIFVwZGF0ZSB0aGUgbXV0ZXggYW5kIHdhbGsgaW5mbyBhbmQgc2F2ZSB0aGUgb3JpZ2luYWwgc3luY19sZXZlbCAqLwotCi0JCQlpZiAod2Fsa19zdGF0ZSkgewotCQkJCW9ial9kZXNjLT5tZXRob2QubXV0ZXgtPm11dGV4LgotCQkJCSAgICBvcmlnaW5hbF9zeW5jX2xldmVsID0KLQkJCQkgICAgd2Fsa19zdGF0ZS0+dGhyZWFkLT5jdXJyZW50X3N5bmNfbGV2ZWw7Ci0KLQkJCQlvYmpfZGVzYy0+bWV0aG9kLm11dGV4LT5tdXRleC50aHJlYWRfaWQgPQotCQkJCSAgICB3YWxrX3N0YXRlLT50aHJlYWQtPnRocmVhZF9pZDsKLQkJCQl3YWxrX3N0YXRlLT50aHJlYWQtPmN1cnJlbnRfc3luY19sZXZlbCA9Ci0JCQkJICAgIG9ial9kZXNjLT5tZXRob2Quc3luY19sZXZlbDsKLQkJCX0gZWxzZSB7Ci0JCQkJb2JqX2Rlc2MtPm1ldGhvZC5tdXRleC0+bXV0ZXguCi0JCQkJICAgIG9yaWdpbmFsX3N5bmNfbGV2ZWwgPQotCQkJCSAgICBvYmpfZGVzYy0+bWV0aG9kLm11dGV4LT5tdXRleC5zeW5jX2xldmVsOwotCQkJfQotCQl9Ci0KLQkJLyogQWx3YXlzIGluY3JlYXNlIGFjcXVpc2l0aW9uIGRlcHRoICovCi0KLQkJb2JqX2Rlc2MtPm1ldGhvZC5tdXRleC0+bXV0ZXguYWNxdWlzaXRpb25fZGVwdGgrKzsKLQl9Ci0KLQkvKgotCSAqIEFsbG9jYXRlIGFuIE93bmVyIElEIGZvciB0aGlzIG1ldGhvZCwgb25seSBpZiB0aGlzIGlzIHRoZSBmaXJzdCB0aHJlYWQKLQkgKiB0byBiZWdpbiBjb25jdXJyZW50IGV4ZWN1dGlvbi4gV2Ugb25seSBuZWVkIG9uZSBvd25lcl9pZCwgZXZlbiBpZiB0aGUKLQkgKiBtZXRob2QgaXMgaW52b2tlZCByZWN1cnNpdmVseS4KLQkgKi8KLQlpZiAoIW9ial9kZXNjLT5tZXRob2Qub3duZXJfaWQpIHsKLQkJc3RhdHVzID0gYWNwaV91dF9hbGxvY2F0ZV9vd25lcl9pZCgmb2JqX2Rlc2MtPm1ldGhvZC5vd25lcl9pZCk7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQkJZ290byBjbGVhbnVwOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBJbmNyZW1lbnQgdGhlIG1ldGhvZCBwYXJzZSB0cmVlIHRocmVhZCBjb3VudCBzaW5jZSBpdCBoYXMgYmVlbgotCSAqIHJlZW50ZXJlZCBvbmUgbW9yZSB0aW1lIChldmVuIGlmIGl0IGlzIHRoZSBzYW1lIHRocmVhZCkKLQkgKi8KLQlvYmpfZGVzYy0+bWV0aG9kLnRocmVhZF9jb3VudCsrOwotCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotCi0gICAgICBjbGVhbnVwOgotCS8qIE9uIGVycm9yLCBtdXN0IHJlbGVhc2UgdGhlIG1ldGhvZCBtdXRleCAoaWYgcHJlc2VudCkgKi8KLQotCWlmIChvYmpfZGVzYy0+bWV0aG9kLm11dGV4KSB7Ci0JCWFjcGlfb3NfcmVsZWFzZV9tdXRleChvYmpfZGVzYy0+bWV0aG9kLm11dGV4LT5tdXRleC5vc19tdXRleCk7Ci0JfQotCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX2RzX2NhbGxfY29udHJvbF9tZXRob2QKLSAqCi0gKiBQQVJBTUVURVJTOiAgVGhyZWFkICAgICAgICAgICAgICAtIEluZm8gZm9yIHRoaXMgdGhyZWFkCi0gKiAgICAgICAgICAgICAgdGhpc193YWxrX3N0YXRlICAgICAtIEN1cnJlbnQgd2FsayBzdGF0ZQotICogICAgICAgICAgICAgIE9wICAgICAgICAgICAgICAgICAgLSBDdXJyZW50IE9wIHRvIGJlIHdhbGtlZAotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKLSAqCi0gKiBERVNDUklQVElPTjogVHJhbnNmZXIgZXhlY3V0aW9uIHRvIGEgY2FsbGVkIGNvbnRyb2wgbWV0aG9kCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotYWNwaV9zdGF0dXMKLWFjcGlfZHNfY2FsbF9jb250cm9sX21ldGhvZChzdHJ1Y3QgYWNwaV90aHJlYWRfc3RhdGUgKnRocmVhZCwKLQkJCSAgICBzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp0aGlzX3dhbGtfc3RhdGUsCi0JCQkgICAgdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKm9wKQotewotCWFjcGlfc3RhdHVzIHN0YXR1czsKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbWV0aG9kX25vZGU7Ci0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqbmV4dF93YWxrX3N0YXRlID0gTlVMTDsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYzsKLQlzdHJ1Y3QgYWNwaV9ldmFsdWF0ZV9pbmZvICppbmZvOwotCXUzMiBpOwotCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIoZHNfY2FsbF9jb250cm9sX21ldGhvZCwgdGhpc193YWxrX3N0YXRlKTsKLQotCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRElTUEFUQ0gsCi0JCQkgICJDYWxsaW5nIG1ldGhvZCAlcCwgY3VycmVudHN0YXRlPSVwXG4iLAotCQkJICB0aGlzX3dhbGtfc3RhdGUtPnByZXZfb3AsIHRoaXNfd2Fsa19zdGF0ZSkpOwotCi0JLyoKLQkgKiBHZXQgdGhlIG5hbWVzcGFjZSBlbnRyeSBmb3IgdGhlIGNvbnRyb2wgbWV0aG9kIHdlIGFyZSBhYm91dCB0byBjYWxsCi0JICovCi0JbWV0aG9kX25vZGUgPSB0aGlzX3dhbGtfc3RhdGUtPm1ldGhvZF9jYWxsX25vZGU7Ci0JaWYgKCFtZXRob2Rfbm9kZSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTlVMTF9FTlRSWSk7Ci0JfQotCi0Jb2JqX2Rlc2MgPSBhY3BpX25zX2dldF9hdHRhY2hlZF9vYmplY3QobWV0aG9kX25vZGUpOwotCWlmICghb2JqX2Rlc2MpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05VTExfT0JKRUNUKTsKLQl9Ci0KLQkvKiBJbml0IGZvciBuZXcgbWV0aG9kLCBwb3NzaWJseSB3YWl0IG9uIG1ldGhvZCBtdXRleCAqLwotCi0Jc3RhdHVzID0gYWNwaV9kc19iZWdpbl9tZXRob2RfZXhlY3V0aW9uKG1ldGhvZF9ub2RlLCBvYmpfZGVzYywKLQkJCQkJCXRoaXNfd2Fsa19zdGF0ZSk7Ci0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotCX0KLQotCS8qIEJlZ2luIG1ldGhvZCBwYXJzZS9leGVjdXRpb24uIENyZWF0ZSBhIG5ldyB3YWxrIHN0YXRlICovCi0KLQluZXh0X3dhbGtfc3RhdGUgPSBhY3BpX2RzX2NyZWF0ZV93YWxrX3N0YXRlKG9ial9kZXNjLT5tZXRob2Qub3duZXJfaWQsCi0JCQkJCQkgICAgTlVMTCwgb2JqX2Rlc2MsIHRocmVhZCk7Ci0JaWYgKCFuZXh0X3dhbGtfc3RhdGUpIHsKLQkJc3RhdHVzID0gQUVfTk9fTUVNT1JZOwotCQlnb3RvIGNsZWFudXA7Ci0JfQotCi0JLyoKLQkgKiBUaGUgcmVzb2x2ZWQgYXJndW1lbnRzIHdlcmUgcHV0IG9uIHRoZSBwcmV2aW91cyB3YWxrIHN0YXRlJ3Mgb3BlcmFuZAotCSAqIHN0YWNrLiBPcGVyYW5kcyBvbiB0aGUgcHJldmlvdXMgd2FsayBzdGF0ZSBzdGFjayBhbHdheXMKLQkgKiBzdGFydCBhdCBpbmRleCAwLiBBbHNvLCBudWxsIHRlcm1pbmF0ZSB0aGUgbGlzdCBvZiBhcmd1bWVudHMKLQkgKi8KLQl0aGlzX3dhbGtfc3RhdGUtPm9wZXJhbmRzW3RoaXNfd2Fsa19zdGF0ZS0+bnVtX29wZXJhbmRzXSA9IE5VTEw7Ci0KLQkvKgotCSAqIEFsbG9jYXRlIGFuZCBpbml0aWFsaXplIHRoZSBldmFsdWF0aW9uIGluZm9ybWF0aW9uIGJsb2NrCi0JICogVEJEOiB0aGlzIGlzIHNvbWV3aGF0IGluZWZmaWNpZW50LCBzaG91bGQgY2hhbmdlIGludGVyZmFjZSB0bwotCSAqIGRzX2luaXRfYW1sX3dhbGsuIEZvciBub3csIGtlZXBzIHRoaXMgc3RydWN0IG9mZiB0aGUgQ1BVIHN0YWNrCi0JICovCi0JaW5mbyA9IEFDUElfQUxMT0NBVEVfWkVST0VEKHNpemVvZihzdHJ1Y3QgYWNwaV9ldmFsdWF0ZV9pbmZvKSk7Ci0JaWYgKCFpbmZvKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT19NRU1PUlkpOwotCX0KLQotCWluZm8tPnBhcmFtZXRlcnMgPSAmdGhpc193YWxrX3N0YXRlLT5vcGVyYW5kc1swXTsKLQotCXN0YXR1cyA9IGFjcGlfZHNfaW5pdF9hbWxfd2FsayhuZXh0X3dhbGtfc3RhdGUsIE5VTEwsIG1ldGhvZF9ub2RlLAotCQkJCSAgICAgICBvYmpfZGVzYy0+bWV0aG9kLmFtbF9zdGFydCwKLQkJCQkgICAgICAgb2JqX2Rlc2MtPm1ldGhvZC5hbWxfbGVuZ3RoLCBpbmZvLAotCQkJCSAgICAgICBBQ1BJX0lNT0RFX0VYRUNVVEUpOwotCi0JQUNQSV9GUkVFKGluZm8pOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlnb3RvIGNsZWFudXA7Ci0JfQotCi0JLyoKLQkgKiBEZWxldGUgdGhlIG9wZXJhbmRzIG9uIHRoZSBwcmV2aW91cyB3YWxrc3RhdGUgb3BlcmFuZCBzdGFjawotCSAqICh0aGV5IHdlcmUgY29waWVkIHRvIG5ldyBvYmplY3RzKQotCSAqLwotCWZvciAoaSA9IDA7IGkgPCBvYmpfZGVzYy0+bWV0aG9kLnBhcmFtX2NvdW50OyBpKyspIHsKLQkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKHRoaXNfd2Fsa19zdGF0ZS0+b3BlcmFuZHNbaV0pOwotCQl0aGlzX3dhbGtfc3RhdGUtPm9wZXJhbmRzW2ldID0gTlVMTDsKLQl9Ci0KLQkvKiBDbGVhciB0aGUgb3BlcmFuZCBzdGFjayAqLwotCi0JdGhpc193YWxrX3N0YXRlLT5udW1fb3BlcmFuZHMgPSAwOwotCi0JQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9ESVNQQVRDSCwKLQkJCSAgIioqKiogQmVnaW4gbmVzdGVkIGV4ZWN1dGlvbiBvZiBbJTQuNHNdICoqKiogV2Fsa1N0YXRlPSVwXG4iLAotCQkJICBtZXRob2Rfbm9kZS0+bmFtZS5hc2NpaSwgbmV4dF93YWxrX3N0YXRlKSk7Ci0KLQkvKiBJbnZva2UgYW4gaW50ZXJuYWwgbWV0aG9kIGlmIG5lY2Vzc2FyeSAqLwotCi0JaWYgKG9ial9kZXNjLT5tZXRob2QubWV0aG9kX2ZsYWdzICYgQU1MX01FVEhPRF9JTlRFUk5BTF9PTkxZKSB7Ci0JCXN0YXR1cyA9IG9ial9kZXNjLT5tZXRob2QuaW1wbGVtZW50YXRpb24obmV4dF93YWxrX3N0YXRlKTsKLQl9Ci0KLQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLQotICAgICAgY2xlYW51cDoKLQotCS8qIE9uIGVycm9yLCB3ZSBtdXN0IHRlcm1pbmF0ZSB0aGUgbWV0aG9kIHByb3Blcmx5ICovCi0KLQlhY3BpX2RzX3Rlcm1pbmF0ZV9jb250cm9sX21ldGhvZChvYmpfZGVzYywgbmV4dF93YWxrX3N0YXRlKTsKLQlpZiAobmV4dF93YWxrX3N0YXRlKSB7Ci0JCWFjcGlfZHNfZGVsZXRlX3dhbGtfc3RhdGUobmV4dF93YWxrX3N0YXRlKTsKLQl9Ci0KLQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9kc19yZXN0YXJ0X2NvbnRyb2xfbWV0aG9kCi0gKgotICogUEFSQU1FVEVSUzogIHdhbGtfc3RhdGUgICAgICAgICAgLSBTdGF0ZSBmb3IgcHJlZW1wdGVkIG1ldGhvZCAoY2FsbGVyKQotICogICAgICAgICAgICAgIHJldHVybl9kZXNjICAgICAgICAgLSBSZXR1cm4gdmFsdWUgZnJvbSB0aGUgY2FsbGVkIG1ldGhvZAotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKLSAqCi0gKiBERVNDUklQVElPTjogUmVzdGFydCBhIG1ldGhvZCB0aGF0IHdhcyBwcmVlbXB0ZWQgYnkgYW5vdGhlciAobmVzdGVkKSBtZXRob2QKLSAqICAgICAgICAgICAgICBpbnZvY2F0aW9uLiAgSGFuZGxlIHRoZSByZXR1cm4gdmFsdWUgKGlmIGFueSkgZnJvbSB0aGUgY2FsbGVlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWFjcGlfc3RhdHVzCi1hY3BpX2RzX3Jlc3RhcnRfY29udHJvbF9tZXRob2Qoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSwKLQkJCSAgICAgICB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpyZXR1cm5fZGVzYykKLXsKLQlhY3BpX3N0YXR1cyBzdGF0dXM7Ci0JaW50IHNhbWVfYXNfaW1wbGljaXRfcmV0dXJuOwotCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIoZHNfcmVzdGFydF9jb250cm9sX21ldGhvZCwgd2Fsa19zdGF0ZSk7Ci0KLQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0RJU1BBVENILAotCQkJICAiKioqKlJlc3RhcnQgWyU0LjRzXSBPcCAlcCBSZXR1cm5WYWx1ZUZyb21DYWxsZWUgJXBcbiIsCi0JCQkgIGFjcGlfdXRfZ2V0X25vZGVfbmFtZSh3YWxrX3N0YXRlLT5tZXRob2Rfbm9kZSksCi0JCQkgIHdhbGtfc3RhdGUtPm1ldGhvZF9jYWxsX29wLCByZXR1cm5fZGVzYykpOwotCi0JQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9ESVNQQVRDSCwKLQkJCSAgIiAgICBSZXR1cm5Gcm9tVGhpc01ldGhvZFVzZWQ/PSVYIFJlc1N0YWNrICVwIFdhbGsgJXBcbiIsCi0JCQkgIHdhbGtfc3RhdGUtPnJldHVybl91c2VkLAotCQkJICB3YWxrX3N0YXRlLT5yZXN1bHRzLCB3YWxrX3N0YXRlKSk7Ci0KLQkvKiBEaWQgdGhlIGNhbGxlZCBtZXRob2QgcmV0dXJuIGEgdmFsdWU/ICovCi0KLQlpZiAocmV0dXJuX2Rlc2MpIHsKLQotCQkvKiBJcyB0aGUgaW1wbGljaXQgcmV0dXJuIG9iamVjdCB0aGUgc2FtZSBhcyB0aGUgcmV0dXJuIGRlc2M/ICovCi0KLQkJc2FtZV9hc19pbXBsaWNpdF9yZXR1cm4gPQotCQkgICAgKHdhbGtfc3RhdGUtPmltcGxpY2l0X3JldHVybl9vYmogPT0gcmV0dXJuX2Rlc2MpOwotCi0JCS8qIEFyZSB3ZSBhY3R1YWxseSBnb2luZyB0byB1c2UgdGhlIHJldHVybiB2YWx1ZT8gKi8KLQotCQlpZiAod2Fsa19zdGF0ZS0+cmV0dXJuX3VzZWQpIHsKLQotCQkJLyogU2F2ZSB0aGUgcmV0dXJuIHZhbHVlIGZyb20gdGhlIHByZXZpb3VzIG1ldGhvZCAqLwotCi0JCQlzdGF0dXMgPSBhY3BpX2RzX3Jlc3VsdF9wdXNoKHJldHVybl9kZXNjLCB3YWxrX3N0YXRlKTsKLQkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQkJCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZShyZXR1cm5fZGVzYyk7Ci0JCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci0JCQl9Ci0KLQkJCS8qCi0JCQkgKiBTYXZlIGFzIFRISVMgbWV0aG9kJ3MgcmV0dXJuIHZhbHVlIGluIGNhc2UgaXQgaXMgcmV0dXJuZWQKLQkJCSAqIGltbWVkaWF0ZWx5IHRvIHlldCBhbm90aGVyIG1ldGhvZAotCQkJICovCi0JCQl3YWxrX3N0YXRlLT5yZXR1cm5fZGVzYyA9IHJldHVybl9kZXNjOwotCQl9Ci0KLQkJLyoKLQkJICogVGhlIGZvbGxvd2luZyBjb2RlIGlzIHRoZSBvcHRpb25hbCBzdXBwb3J0IGZvciB0aGUgc28tY2FsbGVkCi0JCSAqICJpbXBsaWNpdCByZXR1cm4iLiBTb21lIEFNTCBjb2RlIGFzc3VtZXMgdGhhdCB0aGUgbGFzdCB2YWx1ZSBvZiB0aGUKLQkJICogbWV0aG9kIGlzICJpbXBsaWNpdGx5IiByZXR1cm5lZCB0byB0aGUgY2FsbGVyLCBpbiB0aGUgYWJzZW5jZSBvZiBhbgotCQkgKiBleHBsaWNpdCByZXR1cm4gdmFsdWUuCi0JCSAqCi0JCSAqIEp1c3Qgc2F2ZSB0aGUgbGFzdCByZXN1bHQgb2YgdGhlIG1ldGhvZCBhcyB0aGUgcmV0dXJuIHZhbHVlLgotCQkgKgotCQkgKiBOT1RFOiB0aGlzIGlzIG9wdGlvbmFsIGJlY2F1c2UgdGhlIEFTTCBsYW5ndWFnZSBkb2VzIG5vdCBhY3R1YWxseQotCQkgKiBzdXBwb3J0IHRoaXMgYmVoYXZpb3IuCi0JCSAqLwotCQllbHNlIGlmICghYWNwaV9kc19kb19pbXBsaWNpdF9yZXR1cm4KLQkJCSAocmV0dXJuX2Rlc2MsIHdhbGtfc3RhdGUsIEZBTFNFKQotCQkJIHx8IHNhbWVfYXNfaW1wbGljaXRfcmV0dXJuKSB7Ci0JCQkvKgotCQkJICogRGVsZXRlIHRoZSByZXR1cm4gdmFsdWUgaWYgaXQgd2lsbCBub3QgYmUgdXNlZCBieSB0aGUKLQkJCSAqIGNhbGxpbmcgbWV0aG9kIG9yIHJlbW92ZSBvbmUgcmVmZXJlbmNlIGlmIHRoZSBleHBsaWNpdCByZXR1cm4KLQkJCSAqIGlzIHRoZSBzYW1lIGFzIHRoZSBpbXBsaWNpdCByZXR1cm4gdmFsdWUuCi0JCQkgKi8KLQkJCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZShyZXR1cm5fZGVzYyk7Ci0JCX0KLQl9Ci0KLQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX2RzX3Rlcm1pbmF0ZV9jb250cm9sX21ldGhvZAotICoKLSAqIFBBUkFNRVRFUlM6ICBtZXRob2RfZGVzYyAgICAgICAgIC0gTWV0aG9kIG9iamVjdAotICogICAgICAgICAgICAgIHdhbGtfc3RhdGUgICAgICAgICAgLSBTdGF0ZSBhc3NvY2lhdGVkIHdpdGggdGhlIG1ldGhvZAotICoKLSAqIFJFVFVSTjogICAgICBOb25lCi0gKgotICogREVTQ1JJUFRJT046IFRlcm1pbmF0ZSBhIGNvbnRyb2wgbWV0aG9kLiAgRGVsZXRlIGV2ZXJ5dGhpbmcgdGhhdCB0aGUgbWV0aG9kCi0gKiAgICAgICAgICAgICAgY3JlYXRlZCwgZGVsZXRlIGFsbCBsb2NhbHMgYW5kIGFyZ3VtZW50cywgYW5kIGRlbGV0ZSB0aGUgcGFyc2UKLSAqICAgICAgICAgICAgICB0cmVlIGlmIHJlcXVlc3RlZC4KLSAqCi0gKiBNVVRFWDogICAgICAgSW50ZXJwcmV0ZXIgaXMgbG9ja2VkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdm9pZAotYWNwaV9kc190ZXJtaW5hdGVfY29udHJvbF9tZXRob2QodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqbWV0aG9kX2Rlc2MsCi0JCQkJIHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUpCi17Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUihkc190ZXJtaW5hdGVfY29udHJvbF9tZXRob2QsIHdhbGtfc3RhdGUpOwotCi0JLyogbWV0aG9kX2Rlc2MgaXMgcmVxdWlyZWQsIHdhbGtfc3RhdGUgaXMgb3B0aW9uYWwgKi8KLQotCWlmICghbWV0aG9kX2Rlc2MpIHsKLQkJcmV0dXJuX1ZPSUQ7Ci0JfQotCi0JaWYgKHdhbGtfc3RhdGUpIHsKLQotCQkvKiBEZWxldGUgYWxsIGFyZ3VtZW50cyBhbmQgbG9jYWxzICovCi0KLQkJYWNwaV9kc19tZXRob2RfZGF0YV9kZWxldGVfYWxsKHdhbGtfc3RhdGUpOwotCi0JCS8qCi0JCSAqIElmIG1ldGhvZCBpcyBzZXJpYWxpemVkLCByZWxlYXNlIHRoZSBtdXRleCBhbmQgcmVzdG9yZSB0aGUKLQkJICogY3VycmVudCBzeW5jIGxldmVsIGZvciB0aGlzIHRocmVhZAotCQkgKi8KLQkJaWYgKG1ldGhvZF9kZXNjLT5tZXRob2QubXV0ZXgpIHsKLQotCQkJLyogQWNxdWlzaXRpb24gRGVwdGggaGFuZGxlcyByZWN1cnNpdmUgY2FsbHMgKi8KLQotCQkJbWV0aG9kX2Rlc2MtPm1ldGhvZC5tdXRleC0+bXV0ZXguYWNxdWlzaXRpb25fZGVwdGgtLTsKLQkJCWlmICghbWV0aG9kX2Rlc2MtPm1ldGhvZC5tdXRleC0+bXV0ZXguYWNxdWlzaXRpb25fZGVwdGgpIHsKLQkJCQl3YWxrX3N0YXRlLT50aHJlYWQtPmN1cnJlbnRfc3luY19sZXZlbCA9Ci0JCQkJICAgIG1ldGhvZF9kZXNjLT5tZXRob2QubXV0ZXgtPm11dGV4LgotCQkJCSAgICBvcmlnaW5hbF9zeW5jX2xldmVsOwotCi0JCQkJYWNwaV9vc19yZWxlYXNlX211dGV4KG1ldGhvZF9kZXNjLT5tZXRob2QuCi0JCQkJCQkgICAgICBtdXRleC0+bXV0ZXgub3NfbXV0ZXgpOwotCQkJCW1ldGhvZF9kZXNjLT5tZXRob2QubXV0ZXgtPm11dGV4LnRocmVhZF9pZCA9IE5VTEw7Ci0JCQl9Ci0JCX0KLQotCQkvKgotCQkgKiBEZWxldGUgYW55IG5hbWVzcGFjZSBvYmplY3RzIGNyZWF0ZWQgYW55d2hlcmUgd2l0aGluCi0JCSAqIHRoZSBuYW1lc3BhY2UgYnkgdGhlIGV4ZWN1dGlvbiBvZiB0aGlzIG1ldGhvZAotCQkgKi8KLQkJYWNwaV9uc19kZWxldGVfbmFtZXNwYWNlX2J5X293bmVyKG1ldGhvZF9kZXNjLT5tZXRob2Qub3duZXJfaWQpOwotCX0KLQotCS8qIERlY3JlbWVudCB0aGUgdGhyZWFkIGNvdW50IG9uIHRoZSBtZXRob2QgKi8KLQotCWlmIChtZXRob2RfZGVzYy0+bWV0aG9kLnRocmVhZF9jb3VudCkgewotCQltZXRob2RfZGVzYy0+bWV0aG9kLnRocmVhZF9jb3VudC0tOwotCX0gZWxzZSB7Ci0JCUFDUElfRVJST1IoKEFFX0lORk8sICJJbnZhbGlkIHplcm8gdGhyZWFkIGNvdW50IGluIG1ldGhvZCIpKTsKLQl9Ci0KLQkvKiBBcmUgdGhlcmUgYW55IG90aGVyIHRocmVhZHMgY3VycmVudGx5IGV4ZWN1dGluZyB0aGlzIG1ldGhvZD8gKi8KLQotCWlmIChtZXRob2RfZGVzYy0+bWV0aG9kLnRocmVhZF9jb3VudCkgewotCQkvKgotCQkgKiBBZGRpdGlvbmFsIHRocmVhZHMuIERvIG5vdCByZWxlYXNlIHRoZSBvd25lcl9pZCBpbiB0aGlzIGNhc2UsCi0JCSAqIHdlIGltbWVkaWF0ZWx5IHJldXNlIGl0IGZvciB0aGUgbmV4dCB0aHJlYWQgZXhlY3V0aW5nIHRoaXMgbWV0aG9kCi0JCSAqLwotCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0RJU1BBVENILAotCQkJCSAgIioqKiBDb21wbGV0ZWQgZXhlY3V0aW9uIG9mIG9uZSB0aHJlYWQsICVkIHRocmVhZHMgcmVtYWluaW5nXG4iLAotCQkJCSAgbWV0aG9kX2Rlc2MtPm1ldGhvZC50aHJlYWRfY291bnQpKTsKLQl9IGVsc2UgewotCQkvKiBUaGlzIGlzIHRoZSBvbmx5IGV4ZWN1dGluZyB0aHJlYWQgZm9yIHRoaXMgbWV0aG9kICovCi0KLQkJLyoKLQkJICogU3VwcG9ydCB0byBkeW5hbWljYWxseSBjaGFuZ2UgYSBtZXRob2QgZnJvbSBub3Rfc2VyaWFsaXplZCB0bwotCQkgKiBTZXJpYWxpemVkIGlmIGl0IGFwcGVhcnMgdGhhdCB0aGUgbWV0aG9kIGlzIGluY29ycmVjdGx5IHdyaXR0ZW4gYW5kCi0JCSAqIGRvZXMgbm90IHN1cHBvcnQgbXVsdGlwbGUgdGhyZWFkIGV4ZWN1dGlvbi4gVGhlIGJlc3QgZXhhbXBsZSBvZiB0aGlzCi0JCSAqIGlzIGlmIHN1Y2ggYSBtZXRob2QgY3JlYXRlcyBuYW1lc3BhY2Ugb2JqZWN0cyBhbmQgYmxvY2tzLiBBIHNlY29uZAotCQkgKiB0aHJlYWQgd2lsbCBmYWlsIHdpdGggYW4gQUVfQUxSRUFEWV9FWElTVFMgZXhjZXB0aW9uCi0JCSAqCi0JCSAqIFRoaXMgY29kZSBpcyBoZXJlIGJlY2F1c2Ugd2UgbXVzdCB3YWl0IHVudGlsIHRoZSBsYXN0IHRocmVhZCBleGl0cwotCQkgKiBiZWZvcmUgY3JlYXRpbmcgdGhlIHN5bmNocm9uaXphdGlvbiBzZW1hcGhvcmUuCi0JCSAqLwotCQlpZiAoKG1ldGhvZF9kZXNjLT5tZXRob2QubWV0aG9kX2ZsYWdzICYgQU1MX01FVEhPRF9TRVJJQUxJWkVEKQotCQkgICAgJiYgKCFtZXRob2RfZGVzYy0+bWV0aG9kLm11dGV4KSkgewotCQkJKHZvaWQpYWNwaV9kc19jcmVhdGVfbWV0aG9kX211dGV4KG1ldGhvZF9kZXNjKTsKLQkJfQotCi0JCS8qIE5vIG1vcmUgdGhyZWFkcywgd2UgY2FuIGZyZWUgdGhlIG93bmVyX2lkICovCi0KLQkJYWNwaV91dF9yZWxlYXNlX293bmVyX2lkKCZtZXRob2RfZGVzYy0+bWV0aG9kLm93bmVyX2lkKTsKLQl9Ci0KLQlyZXR1cm5fVk9JRDsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9kaXNwYXRjaGVyL2RzbXRoZGF0LmMgYi9kcml2ZXJzL2FjcGkvZGlzcGF0Y2hlci9kc210aGRhdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDNmODFiLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvYWNwaS9kaXNwYXRjaGVyL2RzbXRoZGF0LmMKKysrIC9kZXYvbnVsbApAQCAtMSw3MTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBNb2R1bGUgTmFtZTogZHNtdGhkYXQgLSBjb250cm9sIG1ldGhvZCBhcmd1bWVudHMgYW5kIGxvY2FsIHZhcmlhYmxlcwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA4LCBJbnRlbCBDb3JwLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAotICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgYXQgbWluaW11bSBhIGRpc2NsYWltZXIKLSAqICAgIHN1YnN0YW50aWFsbHkgc2ltaWxhciB0byB0aGUgIk5PIFdBUlJBTlRZIiBkaXNjbGFpbWVyIGJlbG93Ci0gKiAgICAoIkRpc2NsYWltZXIiKSBhbmQgYW55IHJlZGlzdHJpYnV0aW9uIG11c3QgYmUgY29uZGl0aW9uZWQgdXBvbgotICogICAgaW5jbHVkaW5nIGEgc3Vic3RhbnRpYWxseSBzaW1pbGFyIERpc2NsYWltZXIgcmVxdWlyZW1lbnQgZm9yIGZ1cnRoZXIKLSAqICAgIGJpbmFyeSByZWRpc3RyaWJ1dGlvbi4KLSAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcwotICogICAgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICogU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBOTyBXQVJSQU5UWQotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCi0gKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUwotICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcKLSAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQotICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgotICovCi0KLSNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KLSNpbmNsdWRlIDxhY3BpL2FjZGlzcGF0Lmg+Ci0jaW5jbHVkZSA8YWNwaS9hY25hbWVzcC5oPgotI2luY2x1ZGUgPGFjcGkvYWNpbnRlcnAuaD4KLQotI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfRElTUEFUQ0hFUgotQUNQSV9NT0RVTEVfTkFNRSgiZHNtdGhkYXQiKQotCi0vKiBMb2NhbCBwcm90b3R5cGVzICovCi1zdGF0aWMgdm9pZAotYWNwaV9kc19tZXRob2RfZGF0YV9kZWxldGVfdmFsdWUodTggdHlwZSwKLQkJCQkgdTMyIGluZGV4LCBzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKTsKLQotc3RhdGljIGFjcGlfc3RhdHVzCi1hY3BpX2RzX21ldGhvZF9kYXRhX3NldF92YWx1ZSh1OCB0eXBlLAotCQkJICAgICAgdTMyIGluZGV4LAotCQkJICAgICAgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqZWN0LAotCQkJICAgICAgc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSk7Ci0KLSNpZmRlZiBBQ1BJX09CU09MRVRFX0ZVTkNUSU9OUwotYWNwaV9vYmplY3RfdHlwZQotYWNwaV9kc19tZXRob2RfZGF0YV9nZXRfdHlwZSh1MTYgb3Bjb2RlLAotCQkJICAgICB1MzIgaW5kZXgsIHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUpOwotI2VuZGlmCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfZHNfbWV0aG9kX2RhdGFfaW5pdAotICoKLSAqIFBBUkFNRVRFUlM6ICB3YWxrX3N0YXRlICAgICAgICAgIC0gQ3VycmVudCB3YWxrIHN0YXRlIG9iamVjdAotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKLSAqCi0gKiBERVNDUklQVElPTjogSW5pdGlhbGl6ZSB0aGUgZGF0YSBzdHJ1Y3R1cmVzIHRoYXQgaG9sZCB0aGUgbWV0aG9kJ3MgYXJndW1lbnRzCi0gKiAgICAgICAgICAgICAgYW5kIGxvY2Fscy4gIFRoZSBkYXRhIHN0cnVjdCBpcyBhbiBhcnJheSBvZiBuYW1lc3BhY2Ugbm9kZXMgZm9yCi0gKiAgICAgICAgICAgICAgZWFjaCAtIHRoaXMgYWxsb3dzIHJlZl9vZiBhbmQgZGVfcmVmX29mIHRvIHdvcmsgcHJvcGVybHkgZm9yIHRoZXNlCi0gKiAgICAgICAgICAgICAgc3BlY2lhbCBkYXRhIHR5cGVzLgotICoKLSAqIE5PVEVTOiAgICAgICB3YWxrX3N0YXRlIGZpZWxkcyBhcmUgaW5pdGlhbGl6ZWQgdG8gemVybyBieSB0aGUKLSAqICAgICAgICAgICAgICBBQ1BJX0FMTE9DQVRFX1pFUk9FRCgpLgotICoKLSAqICAgICAgICAgICAgICBBIHBzZXVkby1OYW1lc3BhY2UgTm9kZSBpcyBhc3NpZ25lZCB0byBlYWNoIGFyZ3VtZW50IGFuZCBsb2NhbAotICogICAgICAgICAgICAgIHNvIHRoYXQgcmVmX29mKCkgY2FuIHJldHVybiBhIHBvaW50ZXIgdG8gdGhlIE5vZGUuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdm9pZCBhY3BpX2RzX21ldGhvZF9kYXRhX2luaXQoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSkKLXsKLQl1MzIgaTsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UoZHNfbWV0aG9kX2RhdGFfaW5pdCk7Ci0KLQkvKiBJbml0IHRoZSBtZXRob2QgYXJndW1lbnRzICovCi0KLQlmb3IgKGkgPSAwOyBpIDwgQUNQSV9NRVRIT0RfTlVNX0FSR1M7IGkrKykgewotCQlBQ1BJX01PVkVfMzJfVE9fMzIoJndhbGtfc3RhdGUtPmFyZ3VtZW50c1tpXS5uYW1lLAotCQkJCSAgIE5BTUVPRl9BUkdfTlRFKTsKLQkJd2Fsa19zdGF0ZS0+YXJndW1lbnRzW2ldLm5hbWUuaW50ZWdlciB8PSAoaSA8PCAyNCk7Ci0JCXdhbGtfc3RhdGUtPmFyZ3VtZW50c1tpXS5kZXNjcmlwdG9yX3R5cGUgPSBBQ1BJX0RFU0NfVFlQRV9OQU1FRDsKLQkJd2Fsa19zdGF0ZS0+YXJndW1lbnRzW2ldLnR5cGUgPSBBQ1BJX1RZUEVfQU5ZOwotCQl3YWxrX3N0YXRlLT5hcmd1bWVudHNbaV0uZmxhZ3MgPQotCQkgICAgQU5PQkpfRU5EX09GX1BFRVJfTElTVCB8IEFOT0JKX01FVEhPRF9BUkc7Ci0JfQotCi0JLyogSW5pdCB0aGUgbWV0aG9kIGxvY2FscyAqLwotCi0JZm9yIChpID0gMDsgaSA8IEFDUElfTUVUSE9EX05VTV9MT0NBTFM7IGkrKykgewotCQlBQ1BJX01PVkVfMzJfVE9fMzIoJndhbGtfc3RhdGUtPmxvY2FsX3ZhcmlhYmxlc1tpXS5uYW1lLAotCQkJCSAgIE5BTUVPRl9MT0NBTF9OVEUpOwotCi0JCXdhbGtfc3RhdGUtPmxvY2FsX3ZhcmlhYmxlc1tpXS5uYW1lLmludGVnZXIgfD0gKGkgPDwgMjQpOwotCQl3YWxrX3N0YXRlLT5sb2NhbF92YXJpYWJsZXNbaV0uZGVzY3JpcHRvcl90eXBlID0KLQkJICAgIEFDUElfREVTQ19UWVBFX05BTUVEOwotCQl3YWxrX3N0YXRlLT5sb2NhbF92YXJpYWJsZXNbaV0udHlwZSA9IEFDUElfVFlQRV9BTlk7Ci0JCXdhbGtfc3RhdGUtPmxvY2FsX3ZhcmlhYmxlc1tpXS5mbGFncyA9Ci0JCSAgICBBTk9CSl9FTkRfT0ZfUEVFUl9MSVNUIHwgQU5PQkpfTUVUSE9EX0xPQ0FMOwotCX0KLQotCXJldHVybl9WT0lEOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX2RzX21ldGhvZF9kYXRhX2RlbGV0ZV9hbGwKLSAqCi0gKiBQQVJBTUVURVJTOiAgd2Fsa19zdGF0ZSAgICAgICAgICAtIEN1cnJlbnQgd2FsayBzdGF0ZSBvYmplY3QKLSAqCi0gKiBSRVRVUk46ICAgICAgTm9uZQotICoKLSAqIERFU0NSSVBUSU9OOiBEZWxldGUgbWV0aG9kIGxvY2FscyBhbmQgYXJndW1lbnRzLiAgQXJndW1lbnRzIGFyZSBvbmx5Ci0gKiAgICAgICAgICAgICAgZGVsZXRlZCBpZiB0aGlzIG1ldGhvZCB3YXMgY2FsbGVkIGZyb20gYW5vdGhlciBtZXRob2QuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdm9pZCBhY3BpX2RzX21ldGhvZF9kYXRhX2RlbGV0ZV9hbGwoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSkKLXsKLQl1MzIgaW5kZXg7Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGRzX21ldGhvZF9kYXRhX2RlbGV0ZV9hbGwpOwotCi0JLyogRGV0YWNoIHRoZSBsb2NhbHMgKi8KLQotCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IEFDUElfTUVUSE9EX05VTV9MT0NBTFM7IGluZGV4KyspIHsKLQkJaWYgKHdhbGtfc3RhdGUtPmxvY2FsX3ZhcmlhYmxlc1tpbmRleF0ub2JqZWN0KSB7Ci0JCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VYRUMsICJEZWxldGluZyBMb2NhbCVkPSVwXG4iLAotCQkJCQkgIGluZGV4LAotCQkJCQkgIHdhbGtfc3RhdGUtPmxvY2FsX3ZhcmlhYmxlc1tpbmRleF0uCi0JCQkJCSAgb2JqZWN0KSk7Ci0KLQkJCS8qIERldGFjaCBvYmplY3QgKGlmIHByZXNlbnQpIGFuZCByZW1vdmUgYSByZWZlcmVuY2UgKi8KLQotCQkJYWNwaV9uc19kZXRhY2hfb2JqZWN0KCZ3YWxrX3N0YXRlLT4KLQkJCQkJICAgICAgbG9jYWxfdmFyaWFibGVzW2luZGV4XSk7Ci0JCX0KLQl9Ci0KLQkvKiBEZXRhY2ggdGhlIGFyZ3VtZW50cyAqLwotCi0JZm9yIChpbmRleCA9IDA7IGluZGV4IDwgQUNQSV9NRVRIT0RfTlVNX0FSR1M7IGluZGV4KyspIHsKLQkJaWYgKHdhbGtfc3RhdGUtPmFyZ3VtZW50c1tpbmRleF0ub2JqZWN0KSB7Ci0JCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VYRUMsICJEZWxldGluZyBBcmclZD0lcFxuIiwKLQkJCQkJICBpbmRleCwKLQkJCQkJICB3YWxrX3N0YXRlLT5hcmd1bWVudHNbaW5kZXhdLm9iamVjdCkpOwotCi0JCQkvKiBEZXRhY2ggb2JqZWN0IChpZiBwcmVzZW50KSBhbmQgcmVtb3ZlIGEgcmVmZXJlbmNlICovCi0KLQkJCWFjcGlfbnNfZGV0YWNoX29iamVjdCgmd2Fsa19zdGF0ZS0+YXJndW1lbnRzW2luZGV4XSk7Ci0JCX0KLQl9Ci0KLQlyZXR1cm5fVk9JRDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9kc19tZXRob2RfZGF0YV9pbml0X2FyZ3MKLSAqCi0gKiBQQVJBTUVURVJTOiAgKlBhcmFtcyAgICAgICAgIC0gUG9pbnRlciB0byBhIHBhcmFtZXRlciBsaXN0IGZvciB0aGUgbWV0aG9kCi0gKiAgICAgICAgICAgICAgbWF4X3BhcmFtX2NvdW50IC0gVGhlIGFyZyBjb3VudCBmb3IgdGhpcyBtZXRob2QKLSAqICAgICAgICAgICAgICB3YWxrX3N0YXRlICAgICAgLSBDdXJyZW50IHdhbGsgc3RhdGUgb2JqZWN0Ci0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cwotICoKLSAqIERFU0NSSVBUSU9OOiBJbml0aWFsaXplIGFyZ3VtZW50cyBmb3IgYSBtZXRob2QuICBUaGUgcGFyYW1ldGVyIGxpc3QgaXMgYSBsaXN0Ci0gKiAgICAgICAgICAgICAgb2YgQUNQSSBvcGVyYW5kIG9iamVjdHMsIGVpdGhlciBudWxsIHRlcm1pbmF0ZWQgb3Igd2hvc2UgbGVuZ3RoCi0gKiAgICAgICAgICAgICAgaXMgZGVmaW5lZCBieSBtYXhfcGFyYW1fY291bnQuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotYWNwaV9zdGF0dXMKLWFjcGlfZHNfbWV0aG9kX2RhdGFfaW5pdF9hcmdzKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKipwYXJhbXMsCi0JCQkgICAgICB1MzIgbWF4X3BhcmFtX2NvdW50LAotCQkJICAgICAgc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSkKLXsKLQlhY3BpX3N0YXR1cyBzdGF0dXM7Ci0JdTMyIGluZGV4ID0gMDsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKGRzX21ldGhvZF9kYXRhX2luaXRfYXJncywgcGFyYW1zKTsKLQotCWlmICghcGFyYW1zKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVhFQywKLQkJCQkgICJObyBwYXJhbSBsaXN0IHBhc3NlZCB0byBtZXRob2RcbiIpKTsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKLQl9Ci0KLQkvKiBDb3B5IHBhc3NlZCBwYXJhbWV0ZXJzIGludG8gdGhlIG5ldyBtZXRob2Qgc3RhY2sgZnJhbWUgKi8KLQotCXdoaWxlICgoaW5kZXggPCBBQ1BJX01FVEhPRF9OVU1fQVJHUykgJiYKLQkgICAgICAgKGluZGV4IDwgbWF4X3BhcmFtX2NvdW50KSAmJiBwYXJhbXNbaW5kZXhdKSB7Ci0JCS8qCi0JCSAqIEEgdmFsaWQgcGFyYW1ldGVyLgotCQkgKiBTdG9yZSB0aGUgYXJndW1lbnQgaW4gdGhlIG1ldGhvZC93YWxrIGRlc2NyaXB0b3IuCi0JCSAqIERvIG5vdCBjb3B5IHRoZSBhcmcgaW4gb3JkZXIgdG8gaW1wbGVtZW50IGNhbGwgYnkgcmVmZXJlbmNlCi0JCSAqLwotCQlzdGF0dXMgPSBhY3BpX2RzX21ldGhvZF9kYXRhX3NldF92YWx1ZShBQ1BJX1JFRkNMQVNTX0FSRywgaW5kZXgsCi0JCQkJCQkgICAgICAgcGFyYW1zW2luZGV4XSwKLQkJCQkJCSAgICAgICB3YWxrX3N0YXRlKTsKLQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLQkJfQotCi0JCWluZGV4Kys7Ci0JfQotCi0JQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FWEVDLCAiJWQgYXJncyBwYXNzZWQgdG8gbWV0aG9kXG4iLCBpbmRleCkpOwotCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfZHNfbWV0aG9kX2RhdGFfZ2V0X25vZGUKLSAqCi0gKiBQQVJBTUVURVJTOiAgVHlwZSAgICAgICAgICAgICAgICAtIEVpdGhlciBBQ1BJX1JFRkNMQVNTX0xPQ0FMIG9yCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFDUElfUkVGQ0xBU1NfQVJHCi0gKiAgICAgICAgICAgICAgSW5kZXggICAgICAgICAgICAgICAtIFdoaWNoIExvY2FsIG9yIEFyZyB3aG9zZSB0eXBlIHRvIGdldAotICogICAgICAgICAgICAgIHdhbGtfc3RhdGUgICAgICAgICAgLSBDdXJyZW50IHdhbGsgc3RhdGUgb2JqZWN0Ci0gKiAgICAgICAgICAgICAgTm9kZSAgICAgICAgICAgICAgICAtIFdoZXJlIHRoZSBub2RlIGlzIHJldHVybmVkLgotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMgYW5kIG5vZGUKLSAqCi0gKiBERVNDUklQVElPTjogR2V0IHRoZSBOb2RlIGFzc29jaWF0ZWQgd2l0aCBhIGxvY2FsIG9yIGFyZy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1hY3BpX3N0YXR1cwotYWNwaV9kc19tZXRob2RfZGF0YV9nZXRfbm9kZSh1OCB0eXBlLAotCQkJICAgICB1MzIgaW5kZXgsCi0JCQkgICAgIHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUsCi0JCQkgICAgIHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICoqbm9kZSkKLXsKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGRzX21ldGhvZF9kYXRhX2dldF9ub2RlKTsKLQotCS8qCi0JICogTWV0aG9kIExvY2FscyBhbmQgQXJndW1lbnRzIGFyZSBzdXBwb3J0ZWQKLQkgKi8KLQlzd2l0Y2ggKHR5cGUpIHsKLQljYXNlIEFDUElfUkVGQ0xBU1NfTE9DQUw6Ci0KLQkJaWYgKGluZGV4ID4gQUNQSV9NRVRIT0RfTUFYX0xPQ0FMKSB7Ci0JCQlBQ1BJX0VSUk9SKChBRV9JTkZPLAotCQkJCSAgICAiTG9jYWwgaW5kZXggJWQgaXMgaW52YWxpZCAobWF4ICVkKSIsCi0JCQkJICAgIGluZGV4LCBBQ1BJX01FVEhPRF9NQVhfTE9DQUwpKTsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfSU5WQUxJRF9JTkRFWCk7Ci0JCX0KLQotCQkvKiBSZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBwc2V1ZG8tbm9kZSAqLwotCi0JCSpub2RlID0gJndhbGtfc3RhdGUtPmxvY2FsX3ZhcmlhYmxlc1tpbmRleF07Ci0JCWJyZWFrOwotCi0JY2FzZSBBQ1BJX1JFRkNMQVNTX0FSRzoKLQotCQlpZiAoaW5kZXggPiBBQ1BJX01FVEhPRF9NQVhfQVJHKSB7Ci0JCQlBQ1BJX0VSUk9SKChBRV9JTkZPLAotCQkJCSAgICAiQXJnIGluZGV4ICVkIGlzIGludmFsaWQgKG1heCAlZCkiLAotCQkJCSAgICBpbmRleCwgQUNQSV9NRVRIT0RfTUFYX0FSRykpOwotCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9JTlZBTElEX0lOREVYKTsKLQkJfQotCi0JCS8qIFJldHVybiBhIHBvaW50ZXIgdG8gdGhlIHBzZXVkby1ub2RlICovCi0KLQkJKm5vZGUgPSAmd2Fsa19zdGF0ZS0+YXJndW1lbnRzW2luZGV4XTsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlBQ1BJX0VSUk9SKChBRV9JTkZPLCAiVHlwZSAlZCBpcyBpbnZhbGlkIiwgdHlwZSkpOwotCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfVFlQRSk7Ci0JfQotCi0JcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9kc19tZXRob2RfZGF0YV9zZXRfdmFsdWUKLSAqCi0gKiBQQVJBTUVURVJTOiAgVHlwZSAgICAgICAgICAgICAgICAtIEVpdGhlciBBQ1BJX1JFRkNMQVNTX0xPQ0FMIG9yCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFDUElfUkVGQ0xBU1NfQVJHCi0gKiAgICAgICAgICAgICAgSW5kZXggICAgICAgICAgICAgICAtIFdoaWNoIExvY2FsIG9yIEFyZyB0byBnZXQKLSAqICAgICAgICAgICAgICBPYmplY3QgICAgICAgICAgICAgIC0gT2JqZWN0IHRvIGJlIGluc2VydGVkIGludG8gdGhlIHN0YWNrIGVudHJ5Ci0gKiAgICAgICAgICAgICAgd2Fsa19zdGF0ZSAgICAgICAgICAtIEN1cnJlbnQgd2FsayBzdGF0ZSBvYmplY3QKLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IEluc2VydCBhbiBvYmplY3Qgb250byB0aGUgbWV0aG9kIHN0YWNrIGF0IGVudHJ5IE9wY29kZTpJbmRleC4KLSAqICAgICAgICAgICAgICBOb3RlOiBUaGVyZSBpcyBubyAiaW1wbGljaXQgY29udmVyc2lvbiIgZm9yIGxvY2Fscy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgYWNwaV9zdGF0dXMKLWFjcGlfZHNfbWV0aG9kX2RhdGFfc2V0X3ZhbHVlKHU4IHR5cGUsCi0JCQkgICAgICB1MzIgaW5kZXgsCi0JCQkgICAgICB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmplY3QsCi0JCQkgICAgICBzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKQotewotCWFjcGlfc3RhdHVzIHN0YXR1czsKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZTsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UoZHNfbWV0aG9kX2RhdGFfc2V0X3ZhbHVlKTsKLQotCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVhFQywKLQkJCSAgIk5ld09iaiAlcCBUeXBlICUyLjJYLCBSZWZzPSVkIFslc11cbiIsIG9iamVjdCwKLQkJCSAgdHlwZSwgb2JqZWN0LT5jb21tb24ucmVmZXJlbmNlX2NvdW50LAotCQkJICBhY3BpX3V0X2dldF90eXBlX25hbWUob2JqZWN0LT5jb21tb24udHlwZSkpKTsKLQotCS8qIEdldCB0aGUgbmFtZXNwYWNlIG5vZGUgZm9yIHRoZSBhcmcvbG9jYWwgKi8KLQotCXN0YXR1cyA9IGFjcGlfZHNfbWV0aG9kX2RhdGFfZ2V0X25vZGUodHlwZSwgaW5kZXgsIHdhbGtfc3RhdGUsICZub2RlKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci0JfQotCi0JLyoKLQkgKiBJbmNyZW1lbnQgcmVmIGNvdW50IHNvIG9iamVjdCBjYW4ndCBiZSBkZWxldGVkIHdoaWxlIGluc3RhbGxlZC4KLQkgKiBOT1RFOiBXZSBkbyBub3QgY29weSB0aGUgb2JqZWN0IGluIG9yZGVyIHRvIHByZXNlcnZlIHRoZSBjYWxsIGJ5Ci0JICogcmVmZXJlbmNlIHNlbWFudGljcyBvZiBBQ1BJIENvbnRyb2wgTWV0aG9kIGludm9jYXRpb24uCi0JICogKFNlZSBBQ1BJIFNwZWNpZmljYXRpb24gMi4wX2MpCi0JICovCi0JYWNwaV91dF9hZGRfcmVmZXJlbmNlKG9iamVjdCk7Ci0KLQkvKiBJbnN0YWxsIHRoZSBvYmplY3QgKi8KLQotCW5vZGUtPm9iamVjdCA9IG9iamVjdDsKLQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9kc19tZXRob2RfZGF0YV9nZXRfdmFsdWUKLSAqCi0gKiBQQVJBTUVURVJTOiAgVHlwZSAgICAgICAgICAgICAgICAtIEVpdGhlciBBQ1BJX1JFRkNMQVNTX0xPQ0FMIG9yCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFDUElfUkVGQ0xBU1NfQVJHCi0gKiAgICAgICAgICAgICAgSW5kZXggICAgICAgICAgICAgICAtIFdoaWNoIGxvY2FsX3ZhciBvciBhcmd1bWVudCB0byBnZXQKLSAqICAgICAgICAgICAgICB3YWxrX3N0YXRlICAgICAgICAgIC0gQ3VycmVudCB3YWxrIHN0YXRlIG9iamVjdAotICogICAgICAgICAgICAgIGRlc3RfZGVzYyAgICAgICAgICAgLSBXaGVyZSBBcmcgb3IgTG9jYWwgdmFsdWUgaXMgcmV0dXJuZWQKLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IFJldHJpZXZlIHZhbHVlIG9mIHNlbGVjdGVkIEFyZyBvciBMb2NhbCBmb3IgdGhpcyBtZXRob2QKLSAqICAgICAgICAgICAgICBVc2VkIG9ubHkgaW4gYWNwaV9leF9yZXNvbHZlX3RvX3ZhbHVlKCkuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotYWNwaV9zdGF0dXMKLWFjcGlfZHNfbWV0aG9kX2RhdGFfZ2V0X3ZhbHVlKHU4IHR5cGUsCi0JCQkgICAgICB1MzIgaW5kZXgsCi0JCQkgICAgICBzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlLAotCQkJICAgICAgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKmRlc3RfZGVzYykKLXsKLQlhY3BpX3N0YXR1cyBzdGF0dXM7Ci0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGU7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqZWN0OwotCi0JQUNQSV9GVU5DVElPTl9UUkFDRShkc19tZXRob2RfZGF0YV9nZXRfdmFsdWUpOwotCi0JLyogVmFsaWRhdGUgdGhlIG9iamVjdCBkZXNjcmlwdG9yICovCi0KLQlpZiAoIWRlc3RfZGVzYykgewotCQlBQ1BJX0VSUk9SKChBRV9JTkZPLCAiTnVsbCBvYmplY3QgZGVzY3JpcHRvciBwb2ludGVyIikpOwotCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX1BBUkFNRVRFUik7Ci0JfQotCi0JLyogR2V0IHRoZSBuYW1lc3BhY2Ugbm9kZSBmb3IgdGhlIGFyZy9sb2NhbCAqLwotCi0Jc3RhdHVzID0gYWNwaV9kc19tZXRob2RfZGF0YV9nZXRfbm9kZSh0eXBlLCBpbmRleCwgd2Fsa19zdGF0ZSwgJm5vZGUpOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLQl9Ci0KLQkvKiBHZXQgdGhlIG9iamVjdCBmcm9tIHRoZSBub2RlICovCi0KLQlvYmplY3QgPSBub2RlLT5vYmplY3Q7Ci0KLQkvKiBFeGFtaW5lIHRoZSByZXR1cm5lZCBvYmplY3QsIGl0IG11c3QgYmUgdmFsaWQuICovCi0KLQlpZiAoIW9iamVjdCkgewotCQkvKgotCQkgKiBJbmRleCBwb2ludHMgdG8gdW5pbml0aWFsaXplZCBvYmplY3QuCi0JCSAqIFRoaXMgbWVhbnMgdGhhdCBlaXRoZXIgMSkgVGhlIGV4cGVjdGVkIGFyZ3VtZW50IHdhcwotCQkgKiBub3QgcGFzc2VkIHRvIHRoZSBtZXRob2QsIG9yIDIpIEEgbG9jYWwgdmFyaWFibGUKLQkJICogd2FzIHJlZmVyZW5jZWQgYnkgdGhlIG1ldGhvZCAodmlhIHRoZSBBU0wpCi0JCSAqIGJlZm9yZSBpdCB3YXMgaW5pdGlhbGl6ZWQuICBFaXRoZXIgY2FzZSBpcyBhbiBlcnJvci4KLQkJICovCi0KLQkJLyogSWYgc2xhY2sgZW5hYmxlZCwgaW5pdCB0aGUgbG9jYWxfeC9hcmdfeCB0byBhbiBJbnRlZ2VyIG9mIHZhbHVlIHplcm8gKi8KLQotCQlpZiAoYWNwaV9nYmxfZW5hYmxlX2ludGVycHJldGVyX3NsYWNrKSB7Ci0JCQlvYmplY3QgPQotCQkJICAgIGFjcGlfdXRfY3JlYXRlX2ludGVybmFsX29iamVjdChBQ1BJX1RZUEVfSU5URUdFUik7Ci0JCQlpZiAoIW9iamVjdCkgewotCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT19NRU1PUlkpOwotCQkJfQotCi0JCQlvYmplY3QtPmludGVnZXIudmFsdWUgPSAwOwotCQkJbm9kZS0+b2JqZWN0ID0gb2JqZWN0OwotCQl9Ci0KLQkJLyogT3RoZXJ3aXNlLCByZXR1cm4gdGhlIGVycm9yICovCi0KLQkJZWxzZQotCQkJc3dpdGNoICh0eXBlKSB7Ci0JCQljYXNlIEFDUElfUkVGQ0xBU1NfQVJHOgotCi0JCQkJQUNQSV9FUlJPUigoQUVfSU5GTywKLQkJCQkJICAgICJVbmluaXRpYWxpemVkIEFyZ1slZF0gYXQgbm9kZSAlcCIsCi0JCQkJCSAgICBpbmRleCwgbm9kZSkpOwotCi0JCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9VTklOSVRJQUxJWkVEX0FSRyk7Ci0KLQkJCWNhc2UgQUNQSV9SRUZDTEFTU19MT0NBTDoKLQotCQkJCUFDUElfRVJST1IoKEFFX0lORk8sCi0JCQkJCSAgICAiVW5pbml0aWFsaXplZCBMb2NhbFslZF0gYXQgbm9kZSAlcCIsCi0JCQkJCSAgICBpbmRleCwgbm9kZSkpOwotCi0JCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9VTklOSVRJQUxJWkVEX0xPQ0FMKTsKLQotCQkJZGVmYXVsdDoKLQotCQkJCUFDUElfRVJST1IoKEFFX0lORk8sCi0JCQkJCSAgICAiTm90IGEgQXJnL0xvY2FsIG9wY29kZTogJVgiLAotCQkJCQkgICAgdHlwZSkpOwotCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfSU5URVJOQUwpOwotCQkJfQotCX0KLQotCS8qCi0JICogVGhlIEluZGV4IHBvaW50cyB0byBhbiBpbml0aWFsaXplZCBhbmQgdmFsaWQgb2JqZWN0LgotCSAqIFJldHVybiBhbiBhZGRpdGlvbmFsIHJlZmVyZW5jZSB0byB0aGUgb2JqZWN0Ci0JICovCi0JKmRlc3RfZGVzYyA9IG9iamVjdDsKLQlhY3BpX3V0X2FkZF9yZWZlcmVuY2Uob2JqZWN0KTsKLQotCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfZHNfbWV0aG9kX2RhdGFfZGVsZXRlX3ZhbHVlCi0gKgotICogUEFSQU1FVEVSUzogIFR5cGUgICAgICAgICAgICAgICAgLSBFaXRoZXIgQUNQSV9SRUZDTEFTU19MT0NBTCBvcgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQ1BJX1JFRkNMQVNTX0FSRwotICogICAgICAgICAgICAgIEluZGV4ICAgICAgICAgICAgICAgLSBXaGljaCBsb2NhbF92YXIgb3IgYXJndW1lbnQgdG8gZGVsZXRlCi0gKiAgICAgICAgICAgICAgd2Fsa19zdGF0ZSAgICAgICAgICAtIEN1cnJlbnQgd2FsayBzdGF0ZSBvYmplY3QKLSAqCi0gKiBSRVRVUk46ICAgICAgTm9uZQotICoKLSAqIERFU0NSSVBUSU9OOiBEZWxldGUgdGhlIGVudHJ5IGF0IE9wY29kZTpJbmRleC4gIEluc2VydHMKLSAqICAgICAgICAgICAgICBhIG51bGwgaW50byB0aGUgc3RhY2sgc2xvdCBhZnRlciB0aGUgb2JqZWN0IGlzIGRlbGV0ZWQuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIHZvaWQKLWFjcGlfZHNfbWV0aG9kX2RhdGFfZGVsZXRlX3ZhbHVlKHU4IHR5cGUsCi0JCQkJIHUzMiBpbmRleCwgc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSkKLXsKLQlhY3BpX3N0YXR1cyBzdGF0dXM7Ci0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGU7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqZWN0OwotCi0JQUNQSV9GVU5DVElPTl9UUkFDRShkc19tZXRob2RfZGF0YV9kZWxldGVfdmFsdWUpOwotCi0JLyogR2V0IHRoZSBuYW1lc3BhY2Ugbm9kZSBmb3IgdGhlIGFyZy9sb2NhbCAqLwotCi0Jc3RhdHVzID0gYWNwaV9kc19tZXRob2RfZGF0YV9nZXRfbm9kZSh0eXBlLCBpbmRleCwgd2Fsa19zdGF0ZSwgJm5vZGUpOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlyZXR1cm5fVk9JRDsKLQl9Ci0KLQkvKiBHZXQgdGhlIGFzc29jaWF0ZWQgb2JqZWN0ICovCi0KLQlvYmplY3QgPSBhY3BpX25zX2dldF9hdHRhY2hlZF9vYmplY3Qobm9kZSk7Ci0KLQkvKgotCSAqIFVuZGVmaW5lIHRoZSBBcmcgb3IgTG9jYWwgYnkgc2V0dGluZyBpdHMgZGVzY3JpcHRvcgotCSAqIHBvaW50ZXIgdG8gTlVMTC4gTG9jYWxzL0FyZ3MgY2FuIGNvbnRhaW4gYm90aAotCSAqIEFDUElfT1BFUkFORF9PQkpFQ1RTIGFuZCBBQ1BJX05BTUVTUEFDRV9OT0RFcwotCSAqLwotCW5vZGUtPm9iamVjdCA9IE5VTEw7Ci0KLQlpZiAoKG9iamVjdCkgJiYKLQkgICAgKEFDUElfR0VUX0RFU0NSSVBUT1JfVFlQRShvYmplY3QpID09IEFDUElfREVTQ19UWVBFX09QRVJBTkQpKSB7Ci0JCS8qCi0JCSAqIFRoZXJlIGlzIGEgdmFsaWQgb2JqZWN0LgotCQkgKiBEZWNyZW1lbnQgdGhlIHJlZmVyZW5jZSBjb3VudCBieSBvbmUgdG8gYmFsYW5jZSB0aGUKLQkJICogaW5jcmVtZW50IHdoZW4gdGhlIG9iamVjdCB3YXMgc3RvcmVkLgotCQkgKi8KLQkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKG9iamVjdCk7Ci0JfQotCi0JcmV0dXJuX1ZPSUQ7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfZHNfc3RvcmVfb2JqZWN0X3RvX2xvY2FsCi0gKgotICogUEFSQU1FVEVSUzogIFR5cGUgICAgICAgICAgICAgICAgLSBFaXRoZXIgQUNQSV9SRUZDTEFTU19MT0NBTCBvcgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQ1BJX1JFRkNMQVNTX0FSRwotICogICAgICAgICAgICAgIEluZGV4ICAgICAgICAgICAgICAgLSBXaGljaCBMb2NhbCBvciBBcmcgdG8gc2V0Ci0gKiAgICAgICAgICAgICAgb2JqX2Rlc2MgICAgICAgICAgICAtIFZhbHVlIHRvIGJlIHN0b3JlZAotICogICAgICAgICAgICAgIHdhbGtfc3RhdGUgICAgICAgICAgLSBDdXJyZW50IHdhbGsgc3RhdGUKLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IFN0b3JlIGEgdmFsdWUgaW4gYW4gQXJnIG9yIExvY2FsLiAgVGhlIG9ial9kZXNjIGlzIGluc3RhbGxlZAotICogICAgICAgICAgICAgIGFzIHRoZSBuZXcgdmFsdWUgZm9yIHRoZSBBcmcgb3IgTG9jYWwgYW5kIHRoZSByZWZlcmVuY2UgY291bnQKLSAqICAgICAgICAgICAgICBmb3Igb2JqX2Rlc2MgaXMgaW5jcmVtZW50ZWQuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotYWNwaV9zdGF0dXMKLWFjcGlfZHNfc3RvcmVfb2JqZWN0X3RvX2xvY2FsKHU4IHR5cGUsCi0JCQkgICAgICB1MzIgaW5kZXgsCi0JCQkgICAgICB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYywKLQkJCSAgICAgIHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUpCi17Ci0JYWNwaV9zdGF0dXMgc3RhdHVzOwotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlOwotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKmN1cnJlbnRfb2JqX2Rlc2M7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqbmV3X29ial9kZXNjOwotCi0JQUNQSV9GVU5DVElPTl9UUkFDRShkc19zdG9yZV9vYmplY3RfdG9fbG9jYWwpOwotCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVhFQywgIlR5cGU9JTIuMlggSW5kZXg9JWQgT2JqPSVwXG4iLAotCQkJICB0eXBlLCBpbmRleCwgb2JqX2Rlc2MpKTsKLQotCS8qIFBhcmFtZXRlciB2YWxpZGF0aW9uICovCi0KLQlpZiAoIW9ial9kZXNjKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfUEFSQU1FVEVSKTsKLQl9Ci0KLQkvKiBHZXQgdGhlIG5hbWVzcGFjZSBub2RlIGZvciB0aGUgYXJnL2xvY2FsICovCi0KLQlzdGF0dXMgPSBhY3BpX2RzX21ldGhvZF9kYXRhX2dldF9ub2RlKHR5cGUsIGluZGV4LCB3YWxrX3N0YXRlLCAmbm9kZSk7Ci0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotCX0KLQotCWN1cnJlbnRfb2JqX2Rlc2MgPSBhY3BpX25zX2dldF9hdHRhY2hlZF9vYmplY3Qobm9kZSk7Ci0JaWYgKGN1cnJlbnRfb2JqX2Rlc2MgPT0gb2JqX2Rlc2MpIHsKLQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FWEVDLCAiT2JqPSVwIGFscmVhZHkgaW5zdGFsbGVkIVxuIiwKLQkJCQkgIG9ial9kZXNjKSk7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotCX0KLQotCS8qCi0JICogSWYgdGhlIHJlZmVyZW5jZSBjb3VudCBvbiB0aGUgb2JqZWN0IGlzIG1vcmUgdGhhbiBvbmUsIHdlIG11c3QKLQkgKiB0YWtlIGEgY29weSBvZiB0aGUgb2JqZWN0IGJlZm9yZSB3ZSBzdG9yZS4gIEEgcmVmZXJlbmNlIGNvdW50Ci0JICogb2YgZXhhY3RseSAxIG1lYW5zIHRoYXQgdGhlIG9iamVjdCB3YXMganVzdCBjcmVhdGVkIGR1cmluZyB0aGUKLQkgKiBldmFsdWF0aW9uIG9mIGFuIGV4cHJlc3Npb24sIGFuZCB3ZSBjYW4gc2FmZWx5IHVzZSBpdCBzaW5jZSBpdAotCSAqIGlzIG5vdCB1c2VkIGFueXdoZXJlIGVsc2UuCi0JICovCi0JbmV3X29ial9kZXNjID0gb2JqX2Rlc2M7Ci0JaWYgKG9ial9kZXNjLT5jb21tb24ucmVmZXJlbmNlX2NvdW50ID4gMSkgewotCQlzdGF0dXMgPQotCQkgICAgYWNwaV91dF9jb3B5X2lvYmplY3RfdG9faW9iamVjdChvYmpfZGVzYywgJm5ld19vYmpfZGVzYywKLQkJCQkJCSAgICB3YWxrX3N0YXRlKTsKLQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLQkJfQotCX0KLQotCS8qCi0JICogSWYgdGhlcmUgaXMgYW4gb2JqZWN0IGFscmVhZHkgaW4gdGhpcyBzbG90LCB3ZSBlaXRoZXIKLQkgKiBoYXZlIHRvIGRlbGV0ZSBpdCwgb3IgaWYgdGhpcyBpcyBhbiBhcmd1bWVudCBhbmQgdGhlcmUKLQkgKiBpcyBhbiBvYmplY3QgcmVmZXJlbmNlIHN0b3JlZCB0aGVyZSwgd2UgaGF2ZSB0byBkbwotCSAqIGFuIGluZGlyZWN0IHN0b3JlIQotCSAqLwotCWlmIChjdXJyZW50X29ial9kZXNjKSB7Ci0JCS8qCi0JCSAqIENoZWNrIGZvciBhbiBpbmRpcmVjdCBzdG9yZSBpZiBhbiBhcmd1bWVudAotCQkgKiBjb250YWlucyBhbiBvYmplY3QgcmVmZXJlbmNlIChzdG9yZWQgYXMgYW4gTm9kZSkuCi0JCSAqIFdlIGRvbid0IGFsbG93IHRoaXMgYXV0b21hdGljIGRlcmVmZXJlbmNpbmcgZm9yCi0JCSAqIGxvY2Fscywgc2luY2UgYSBzdG9yZSB0byBhIGxvY2FsIHNob3VsZCBvdmVyd3JpdGUKLQkJICogYW55dGhpbmcgdGhlcmUsIGluY2x1ZGluZyBhbiBvYmplY3QgcmVmZXJlbmNlLgotCQkgKgotCQkgKiBJZiBib3RoIEFyZzAgYW5kIExvY2FsMCBjb250YWluIHJlZl9vZiAoTG9jYWw0KToKLQkJICoKLQkJICogU3RvcmUgKDEsIEFyZzApICAgICAgICAgICAgIC0gQ2F1c2VzIGluZGlyZWN0IHN0b3JlIHRvIGxvY2FsNAotCQkgKiBTdG9yZSAoMSwgTG9jYWwwKSAgICAgICAgICAgLSBTdG9yZXMgMSBpbiBsb2NhbDAsIG92ZXJ3cml0aW5nCi0JCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSByZWZlcmVuY2UgdG8gbG9jYWw0Ci0JCSAqIFN0b3JlICgxLCBkZV9yZWZvZiAoTG9jYWwwKSkgLSBDYXVzZXMgaW5kaXJlY3Qgc3RvcmUgdG8gbG9jYWw0Ci0JCSAqCi0JCSAqIFdlaXJkLCBidXQgdHJ1ZS4KLQkJICovCi0JCWlmICh0eXBlID09IEFDUElfUkVGQ0xBU1NfQVJHKSB7Ci0JCQkvKgotCQkJICogSWYgd2UgaGF2ZSBhIHZhbGlkIHJlZmVyZW5jZSBvYmplY3QgdGhhdCBjYW1lIGZyb20gcmVmX29mKCksCi0JCQkgKiBkbyB0aGUgaW5kaXJlY3Qgc3RvcmUKLQkJCSAqLwotCQkJaWYgKChBQ1BJX0dFVF9ERVNDUklQVE9SX1RZUEUoY3VycmVudF9vYmpfZGVzYykgPT0KLQkJCSAgICAgQUNQSV9ERVNDX1RZUEVfT1BFUkFORCkKLQkJCSAgICAmJiAoY3VycmVudF9vYmpfZGVzYy0+Y29tbW9uLnR5cGUgPT0KLQkJCQlBQ1BJX1RZUEVfTE9DQUxfUkVGRVJFTkNFKQotCQkJICAgICYmIChjdXJyZW50X29ial9kZXNjLT5yZWZlcmVuY2UuY2xhc3MgPT0KLQkJCQlBQ1BJX1JFRkNMQVNTX1JFRk9GKSkgewotCQkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVhFQywKLQkJCQkJCSAgIkFyZyAoJXApIGlzIGFuIE9ialJlZihOb2RlKSwgc3RvcmluZyBpbiBub2RlICVwXG4iLAotCQkJCQkJICBuZXdfb2JqX2Rlc2MsCi0JCQkJCQkgIGN1cnJlbnRfb2JqX2Rlc2MpKTsKLQotCQkJCS8qCi0JCQkJICogU3RvcmUgdGhpcyBvYmplY3QgdG8gdGhlIE5vZGUgKHBlcmZvcm0gdGhlIGluZGlyZWN0IHN0b3JlKQotCQkJCSAqIE5PVEU6IE5vIGltcGxpY2l0IGNvbnZlcnNpb24gaXMgcGVyZm9ybWVkLCBhcyBwZXIgdGhlIEFDUEkKLQkJCQkgKiBzcGVjaWZpY2F0aW9uIHJ1bGVzIG9uIHN0b3JpbmcgdG8gTG9jYWxzL0FyZ3MuCi0JCQkJICovCi0JCQkJc3RhdHVzID0KLQkJCQkgICAgYWNwaV9leF9zdG9yZV9vYmplY3RfdG9fbm9kZShuZXdfb2JqX2Rlc2MsCi0JCQkJCQkJCSBjdXJyZW50X29ial9kZXNjLT4KLQkJCQkJCQkJIHJlZmVyZW5jZS4KLQkJCQkJCQkJIG9iamVjdCwKLQkJCQkJCQkJIHdhbGtfc3RhdGUsCi0JCQkJCQkJCSBBQ1BJX05PX0lNUExJQ0lUX0NPTlZFUlNJT04pOwotCi0JCQkJLyogUmVtb3ZlIGxvY2FsIHJlZmVyZW5jZSBpZiB3ZSBjb3BpZWQgdGhlIG9iamVjdCBhYm92ZSAqLwotCi0JCQkJaWYgKG5ld19vYmpfZGVzYyAhPSBvYmpfZGVzYykgewotCQkJCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UobmV3X29ial9kZXNjKTsKLQkJCQl9Ci0JCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci0JCQl9Ci0JCX0KLQotCQkvKiBEZWxldGUgdGhlIGV4aXN0aW5nIG9iamVjdCBiZWZvcmUgc3RvcmluZyB0aGUgbmV3IG9uZSAqLwotCi0JCWFjcGlfZHNfbWV0aG9kX2RhdGFfZGVsZXRlX3ZhbHVlKHR5cGUsIGluZGV4LCB3YWxrX3N0YXRlKTsKLQl9Ci0KLQkvKgotCSAqIEluc3RhbGwgdGhlIE9iaiBkZXNjcmlwdG9yICgqbmV3X29ial9kZXNjKSBpbnRvCi0JICogdGhlIGRlc2NyaXB0b3IgZm9yIHRoZSBBcmcgb3IgTG9jYWwuCi0JICogKGluY3JlbWVudHMgdGhlIG9iamVjdCByZWZlcmVuY2UgY291bnQgYnkgb25lKQotCSAqLwotCXN0YXR1cyA9Ci0JICAgIGFjcGlfZHNfbWV0aG9kX2RhdGFfc2V0X3ZhbHVlKHR5cGUsIGluZGV4LCBuZXdfb2JqX2Rlc2MsCi0JCQkJCSAgd2Fsa19zdGF0ZSk7Ci0KLQkvKiBSZW1vdmUgbG9jYWwgcmVmZXJlbmNlIGlmIHdlIGNvcGllZCB0aGUgb2JqZWN0IGFib3ZlICovCi0KLQlpZiAobmV3X29ial9kZXNjICE9IG9ial9kZXNjKSB7Ci0JCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZShuZXdfb2JqX2Rlc2MpOwotCX0KLQotCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotfQotCi0jaWZkZWYgQUNQSV9PQlNPTEVURV9GVU5DVElPTlMKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfZHNfbWV0aG9kX2RhdGFfZ2V0X3R5cGUKLSAqCi0gKiBQQVJBTUVURVJTOiAgT3Bjb2RlICAgICAgICAgICAgICAtIEVpdGhlciBBTUxfTE9DQUxfT1Agb3IgQU1MX0FSR19PUAotICogICAgICAgICAgICAgIEluZGV4ICAgICAgICAgICAgICAgLSBXaGljaCBMb2NhbCBvciBBcmcgd2hvc2UgdHlwZSB0byBnZXQKLSAqICAgICAgICAgICAgICB3YWxrX3N0YXRlICAgICAgICAgIC0gQ3VycmVudCB3YWxrIHN0YXRlIG9iamVjdAotICoKLSAqIFJFVFVSTjogICAgICBEYXRhIHR5cGUgb2YgY3VycmVudCB2YWx1ZSBvZiB0aGUgc2VsZWN0ZWQgQXJnIG9yIExvY2FsCi0gKgotICogREVTQ1JJUFRJT046IEdldCB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0IHN0b3JlZCBpbiB0aGUgTG9jYWwgb3IgQXJnCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotYWNwaV9vYmplY3RfdHlwZQotYWNwaV9kc19tZXRob2RfZGF0YV9nZXRfdHlwZSh1MTYgb3Bjb2RlLAotCQkJICAgICB1MzIgaW5kZXgsIHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUpCi17Ci0JYWNwaV9zdGF0dXMgc3RhdHVzOwotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlOwotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9iamVjdDsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UoZHNfbWV0aG9kX2RhdGFfZ2V0X3R5cGUpOwotCi0JLyogR2V0IHRoZSBuYW1lc3BhY2Ugbm9kZSBmb3IgdGhlIGFyZy9sb2NhbCAqLwotCi0Jc3RhdHVzID0gYWNwaV9kc19tZXRob2RfZGF0YV9nZXRfbm9kZShvcGNvZGUsIGluZGV4LCB3YWxrX3N0YXRlLCAmbm9kZSk7Ci0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCXJldHVybl9WQUxVRSgoQUNQSV9UWVBFX05PVF9GT1VORCkpOwotCX0KLQotCS8qIEdldCB0aGUgb2JqZWN0ICovCi0KLQlvYmplY3QgPSBhY3BpX25zX2dldF9hdHRhY2hlZF9vYmplY3Qobm9kZSk7Ci0JaWYgKCFvYmplY3QpIHsKLQotCQkvKiBVbmluaXRpYWxpemVkIGxvY2FsL2FyZywgcmV0dXJuIFRZUEVfQU5ZICovCi0KLQkJcmV0dXJuX1ZBTFVFKEFDUElfVFlQRV9BTlkpOwotCX0KLQotCS8qIEdldCB0aGUgb2JqZWN0IHR5cGUgKi8KLQotCXJldHVybl9WQUxVRShBQ1BJX0dFVF9PQkpFQ1RfVFlQRShvYmplY3QpKTsKLX0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2Rpc3BhdGNoZXIvZHNvYmplY3QuYyBiL2RyaXZlcnMvYWNwaS9kaXNwYXRjaGVyL2Rzb2JqZWN0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmMDhlNTkuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9hY3BpL2Rpc3BhdGNoZXIvZHNvYmplY3QuYworKysgL2Rldi9udWxsCkBAIC0xLDgxMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogTW9kdWxlIE5hbWU6IGRzb2JqZWN0IC0gRGlzcGF0Y2hlciBvYmplY3QgbWFuYWdlbWVudCByb3V0aW5lcwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDgsIEludGVsIENvcnAuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCi0gKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSBhdCBtaW5pbXVtIGEgZGlzY2xhaW1lcgotICogICAgc3Vic3RhbnRpYWxseSBzaW1pbGFyIHRvIHRoZSAiTk8gV0FSUkFOVFkiIGRpc2NsYWltZXIgYmVsb3cKLSAqICAgICgiRGlzY2xhaW1lciIpIGFuZCBhbnkgcmVkaXN0cmlidXRpb24gbXVzdCBiZSBjb25kaXRpb25lZCB1cG9uCi0gKiAgICBpbmNsdWRpbmcgYSBzdWJzdGFudGlhbGx5IHNpbWlsYXIgRGlzY2xhaW1lciByZXF1aXJlbWVudCBmb3IgZnVydGhlcgotICogICAgYmluYXJ5IHJlZGlzdHJpYnV0aW9uLgotICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzCi0gKiAgICBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIE5PIFdBUlJBTlRZCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKLSAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCi0gKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORwotICogSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCi0gKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCi0gKi8KLQotI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgotI2luY2x1ZGUgPGFjcGkvYWNwYXJzZXIuaD4KLSNpbmNsdWRlIDxhY3BpL2FtbGNvZGUuaD4KLSNpbmNsdWRlIDxhY3BpL2FjZGlzcGF0Lmg+Ci0jaW5jbHVkZSA8YWNwaS9hY25hbWVzcC5oPgotI2luY2x1ZGUgPGFjcGkvYWNpbnRlcnAuaD4KLQotI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfRElTUEFUQ0hFUgotQUNQSV9NT0RVTEVfTkFNRSgiZHNvYmplY3QiKQotCi0vKiBMb2NhbCBwcm90b3R5cGVzICovCi1zdGF0aWMgYWNwaV9zdGF0dXMKLWFjcGlfZHNfYnVpbGRfaW50ZXJuYWxfb2JqZWN0KHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUsCi0JCQkgICAgICB1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqb3AsCi0JCQkgICAgICB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICoqb2JqX2Rlc2NfcHRyKTsKLQotI2lmbmRlZiBBQ1BJX05PX01FVEhPRF9FWEVDVVRJT04KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfZHNfYnVpbGRfaW50ZXJuYWxfb2JqZWN0Ci0gKgotICogUEFSQU1FVEVSUzogIHdhbGtfc3RhdGUgICAgICAtIEN1cnJlbnQgd2FsayBzdGF0ZQotICogICAgICAgICAgICAgIE9wICAgICAgICAgICAgICAtIFBhcnNlciBvYmplY3QgdG8gYmUgdHJhbnNsYXRlZAotICogICAgICAgICAgICAgIG9ial9kZXNjX3B0ciAgICAtIFdoZXJlIHRoZSBBQ1BJIGludGVybmFsIG9iamVjdCBpcyByZXR1cm5lZAotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKLSAqCi0gKiBERVNDUklQVElPTjogVHJhbnNsYXRlIGEgcGFyc2VyIE9wIG9iamVjdCB0byB0aGUgZXF1aXZhbGVudCBuYW1lc3BhY2Ugb2JqZWN0Ci0gKiAgICAgICAgICAgICAgU2ltcGxlIG9iamVjdHMgYXJlIGFueSBvYmplY3RzIG90aGVyIHRoYW4gYSBwYWNrYWdlIG9iamVjdCEKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgYWNwaV9zdGF0dXMKLWFjcGlfZHNfYnVpbGRfaW50ZXJuYWxfb2JqZWN0KHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUsCi0JCQkgICAgICB1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqb3AsCi0JCQkgICAgICB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICoqb2JqX2Rlc2NfcHRyKQotewotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjOwotCWFjcGlfc3RhdHVzIHN0YXR1czsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UoZHNfYnVpbGRfaW50ZXJuYWxfb2JqZWN0KTsKLQotCSpvYmpfZGVzY19wdHIgPSBOVUxMOwotCWlmIChvcC0+Y29tbW9uLmFtbF9vcGNvZGUgPT0gQU1MX0lOVF9OQU1FUEFUSF9PUCkgewotCQkvKgotCQkgKiBUaGlzIGlzIGEgbmFtZWQgb2JqZWN0IHJlZmVyZW5jZS4gSWYgdGhpcyBuYW1lIHdhcwotCQkgKiBwcmV2aW91c2x5IGxvb2tlZCB1cCBpbiB0aGUgbmFtZXNwYWNlLCBpdCB3YXMgc3RvcmVkIGluIHRoaXMgb3AuCi0JCSAqIE90aGVyd2lzZSwgZ28gYWhlYWQgYW5kIGxvb2sgaXQgdXAgbm93Ci0JCSAqLwotCQlpZiAoIW9wLT5jb21tb24ubm9kZSkgewotCQkJc3RhdHVzID0gYWNwaV9uc19sb29rdXAod2Fsa19zdGF0ZS0+c2NvcGVfaW5mbywKLQkJCQkJCW9wLT5jb21tb24udmFsdWUuc3RyaW5nLAotCQkJCQkJQUNQSV9UWVBFX0FOWSwKLQkJCQkJCUFDUElfSU1PREVfRVhFQ1VURSwKLQkJCQkJCUFDUElfTlNfU0VBUkNIX1BBUkVOVCB8Ci0JCQkJCQlBQ1BJX05TX0RPTlRfT1BFTl9TQ09QRSwgTlVMTCwKLQkJCQkJCUFDUElfQ0FTVF9JTkRJUkVDVF9QVFIoc3RydWN0Ci0JCQkJCQkJCSAgICAgICBhY3BpX25hbWVzcGFjZV9ub2RlLAotCQkJCQkJCQkgICAgICAgJihvcC0+Ci0JCQkJCQkJCQkgY29tbW9uLgotCQkJCQkJCQkJIG5vZGUpKSk7Ci0JCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQotCQkJCS8qIENoZWNrIGlmIHdlIGFyZSByZXNvbHZpbmcgYSBuYW1lZCByZWZlcmVuY2Ugd2l0aGluIGEgcGFja2FnZSAqLwotCi0JCQkJaWYgKChzdGF0dXMgPT0gQUVfTk9UX0ZPVU5EKQotCQkJCSAgICAmJiAoYWNwaV9nYmxfZW5hYmxlX2ludGVycHJldGVyX3NsYWNrKQotCQkJCSAgICAmJgotCQkJCSAgICAoKG9wLT5jb21tb24ucGFyZW50LT5jb21tb24uYW1sX29wY29kZSA9PQotCQkJCSAgICAgIEFNTF9QQUNLQUdFX09QKQotCQkJCSAgICAgfHwgKG9wLT5jb21tb24ucGFyZW50LT5jb21tb24uYW1sX29wY29kZSA9PQotCQkJCQkgQU1MX1ZBUl9QQUNLQUdFX09QKSkpIHsKLQkJCQkJLyoKLQkJCQkJICogV2UgZGlkbid0IGZpbmQgdGhlIHRhcmdldCBhbmQgd2UgYXJlIHBvcHVsYXRpbmcgZWxlbWVudHMKLQkJCQkJICogb2YgYSBwYWNrYWdlIC0gaWdub3JlIGlmIHNsYWNrIGVuYWJsZWQuIFNvbWUgQVNMIGNvZGUKLQkJCQkJICogY29udGFpbnMgZGFuZ2xpbmcgaW52YWxpZCByZWZlcmVuY2VzIGluIHBhY2thZ2VzIGFuZAotCQkJCQkgKiBleHBlY3RzIHRoYXQgbm8gZXhjZXB0aW9uIHdpbGwgYmUgaXNzdWVkLiBMZWF2ZSB0aGUKLQkJCQkJICogZWxlbWVudCBhcyBhIG51bGwgZWxlbWVudC4gSXQgY2Fubm90IGJlIHVzZWQsIGJ1dCBpdAotCQkJCQkgKiBjYW4gYmUgb3ZlcndyaXR0ZW4gYnkgc3Vic2VxdWVudCBBU0wgY29kZSAtIHRoaXMgaXMKLQkJCQkJICogdHlwaWNhbGx5IHRoZSBjYXNlLgotCQkJCQkgKi8KLQkJCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLAotCQkJCQkJCSAgIklnbm9yaW5nIHVucmVzb2x2ZWQgcmVmZXJlbmNlIGluIHBhY2thZ2UgWyU0LjRzXVxuIiwKLQkJCQkJCQkgIHdhbGtfc3RhdGUtPgotCQkJCQkJCSAgc2NvcGVfaW5mby0+c2NvcGUuCi0JCQkJCQkJICBub2RlLT5uYW1lLmFzY2lpKSk7Ci0KLQkJCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKLQkJCQl9IGVsc2UgewotCQkJCQlBQ1BJX0VSUk9SX05BTUVTUEFDRShvcC0+Y29tbW9uLnZhbHVlLgotCQkJCQkJCSAgICAgc3RyaW5nLCBzdGF0dXMpOwotCQkJCX0KLQotCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotCQkJfQotCQl9Ci0KLQkJLyogU3BlY2lhbCBvYmplY3QgcmVzb2x1dGlvbiBmb3IgZWxlbWVudHMgb2YgYSBwYWNrYWdlICovCi0KLQkJaWYgKChvcC0+Y29tbW9uLnBhcmVudC0+Y29tbW9uLmFtbF9vcGNvZGUgPT0gQU1MX1BBQ0tBR0VfT1ApIHx8Ci0JCSAgICAob3AtPmNvbW1vbi5wYXJlbnQtPmNvbW1vbi5hbWxfb3Bjb2RlID09Ci0JCSAgICAgQU1MX1ZBUl9QQUNLQUdFX09QKSkgewotCQkJLyoKLQkJCSAqIEF0dGVtcHQgdG8gcmVzb2x2ZSB0aGUgbm9kZSB0byBhIHZhbHVlIGJlZm9yZSB3ZSBpbnNlcnQgaXQgaW50bwotCQkJICogdGhlIHBhY2thZ2UuIElmIHRoaXMgaXMgYSByZWZlcmVuY2UgdG8gYSBjb21tb24gZGF0YSB0eXBlLAotCQkJICogcmVzb2x2ZSBpdCBpbW1lZGlhdGVseS4gQWNjb3JkaW5nIHRvIHRoZSBBQ1BJIHNwZWMsIHBhY2thZ2UKLQkJCSAqIGVsZW1lbnRzIGNhbiBvbmx5IGJlICJkYXRhIG9iamVjdHMiIG9yIG1ldGhvZCByZWZlcmVuY2VzLgotCQkJICogQXR0ZW1wdCB0byByZXNvbHZlIHRvIGFuIEludGVnZXIsIEJ1ZmZlciwgU3RyaW5nIG9yIFBhY2thZ2UuCi0JCQkgKiBJZiBjYW5ub3QsIHJldHVybiB0aGUgbmFtZWQgcmVmZXJlbmNlIChmb3IgdGhpbmdzIGxpa2UgRGV2aWNlcywKLQkJCSAqIE1ldGhvZHMsIGV0Yy4pIEJ1ZmZlciBGaWVsZHMgYW5kIEZpZWxkcyB3aWxsIHJlc29sdmUgdG8gc2ltcGxlCi0JCQkgKiBvYmplY3RzIChpbnQvYnVmL3N0ci9wa2cpLgotCQkJICoKLQkJCSAqIE5PVEU6IFJlZmVyZW5jZXMgdG8gdGhpbmdzIGxpa2UgRGV2aWNlcywgTWV0aG9kcywgTXV0ZXhlcywgZXRjLgotCQkJICogd2lsbCByZW1haW4gYXMgbmFtZWQgcmVmZXJlbmNlcy4gVGhpcyBiZWhhdmlvciBpcyBub3QgZGVzY3JpYmVkCi0JCQkgKiBpbiB0aGUgQUNQSSBzcGVjLCBidXQgaXQgYXBwZWFycyB0byBiZSBhbiBvdmVyc2lnaHQuCi0JCQkgKi8KLQkJCW9ial9kZXNjID0KLQkJCSAgICBBQ1BJX0NBU1RfUFRSKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QsCi0JCQkJCSAgb3AtPmNvbW1vbi5ub2RlKTsKLQotCQkJc3RhdHVzID0KLQkJCSAgICBhY3BpX2V4X3Jlc29sdmVfbm9kZV90b192YWx1ZShBQ1BJX0NBU1RfSU5ESVJFQ1RfUFRSCi0JCQkJCQkJICAoc3RydWN0Ci0JCQkJCQkJICAgYWNwaV9uYW1lc3BhY2Vfbm9kZSwKLQkJCQkJCQkgICAmb2JqX2Rlc2MpLAotCQkJCQkJCSAgd2Fsa19zdGF0ZSk7Ci0JCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLQkJCX0KLQotCQkJc3dpdGNoIChvcC0+Y29tbW9uLm5vZGUtPnR5cGUpIHsKLQkJCQkvKgotCQkJCSAqIEZvciB0aGVzZSB0eXBlcywgd2UgbmVlZCB0aGUgYWN0dWFsIG5vZGUsIG5vdCB0aGUgc3Vib2JqZWN0LgotCQkJCSAqIEhvd2V2ZXIsIHRoZSBzdWJvYmplY3QgZGlkIG5vdCBnZXQgYW4gZXh0cmEgcmVmZXJlbmNlIGNvdW50IGFib3ZlLgotCQkJCSAqCi0JCQkJICogVEJEOiBzaG91bGQgZXhfcmVzb2x2ZV9ub2RlX3RvX3ZhbHVlIGJlIGNoYW5nZWQgdG8gZml4IHRoaXM/Ci0JCQkJICovCi0JCQljYXNlIEFDUElfVFlQRV9ERVZJQ0U6Ci0JCQljYXNlIEFDUElfVFlQRV9USEVSTUFMOgotCi0JCQkJYWNwaV91dF9hZGRfcmVmZXJlbmNlKG9wLT5jb21tb24ubm9kZS0+b2JqZWN0KTsKLQotCQkJCS8qbGludCAtZmFsbHRocm91Z2ggKi8KLQkJCQkvKgotCQkJCSAqIEZvciB0aGVzZSB0eXBlcywgd2UgbmVlZCB0aGUgYWN0dWFsIG5vZGUsIG5vdCB0aGUgc3Vib2JqZWN0LgotCQkJCSAqIFRoZSBzdWJvYmplY3QgZ290IGFuIGV4dHJhIHJlZmVyZW5jZSBjb3VudCBpbiBleF9yZXNvbHZlX25vZGVfdG9fdmFsdWUuCi0JCQkJICovCi0JCQljYXNlIEFDUElfVFlQRV9NVVRFWDoKLQkJCWNhc2UgQUNQSV9UWVBFX01FVEhPRDoKLQkJCWNhc2UgQUNQSV9UWVBFX1BPV0VSOgotCQkJY2FzZSBBQ1BJX1RZUEVfUFJPQ0VTU09SOgotCQkJY2FzZSBBQ1BJX1RZUEVfRVZFTlQ6Ci0JCQljYXNlIEFDUElfVFlQRV9SRUdJT046Ci0KLQkJCQkvKiBXZSB3aWxsIGNyZWF0ZSBhIHJlZmVyZW5jZSBvYmplY3QgZm9yIHRoZXNlIHR5cGVzIGJlbG93ICovCi0JCQkJYnJlYWs7Ci0KLQkJCWRlZmF1bHQ6Ci0JCQkJLyoKLQkJCQkgKiBBbGwgb3RoZXIgdHlwZXMgLSB0aGUgbm9kZSB3YXMgcmVzb2x2ZWQgdG8gYW4gYWN0dWFsCi0JCQkJICogb2JqZWN0LCB3ZSBhcmUgZG9uZS4KLQkJCQkgKi8KLQkJCQlnb3RvIGV4aXQ7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKiBDcmVhdGUgYW5kIGluaXQgYSBuZXcgaW50ZXJuYWwgQUNQSSBvYmplY3QgKi8KLQotCW9ial9kZXNjID0gYWNwaV91dF9jcmVhdGVfaW50ZXJuYWxfb2JqZWN0KChhY3BpX3BzX2dldF9vcGNvZGVfaW5mbwotCQkJCQkJICAgKG9wLT5jb21tb24uYW1sX29wY29kZSkpLT4KLQkJCQkJCSAgb2JqZWN0X3R5cGUpOwotCWlmICghb2JqX2Rlc2MpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX01FTU9SWSk7Ci0JfQotCi0Jc3RhdHVzID0KLQkgICAgYWNwaV9kc19pbml0X29iamVjdF9mcm9tX29wKHdhbGtfc3RhdGUsIG9wLCBvcC0+Y29tbW9uLmFtbF9vcGNvZGUsCi0JCQkJCSZvYmpfZGVzYyk7Ci0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZShvYmpfZGVzYyk7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotCX0KLQotICAgICAgZXhpdDoKLQkqb2JqX2Rlc2NfcHRyID0gb2JqX2Rlc2M7Ci0JcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfZHNfYnVpbGRfaW50ZXJuYWxfYnVmZmVyX29iagotICoKLSAqIFBBUkFNRVRFUlM6ICB3YWxrX3N0YXRlICAgICAgLSBDdXJyZW50IHdhbGsgc3RhdGUKLSAqICAgICAgICAgICAgICBPcCAgICAgICAgICAgICAgLSBQYXJzZXIgb2JqZWN0IHRvIGJlIHRyYW5zbGF0ZWQKLSAqICAgICAgICAgICAgICBidWZmZXJfbGVuZ3RoICAgLSBMZW5ndGggb2YgdGhlIGJ1ZmZlcgotICogICAgICAgICAgICAgIG9ial9kZXNjX3B0ciAgICAtIFdoZXJlIHRoZSBBQ1BJIGludGVybmFsIG9iamVjdCBpcyByZXR1cm5lZAotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKLSAqCi0gKiBERVNDUklQVElPTjogVHJhbnNsYXRlIGEgcGFyc2VyIE9wIHBhY2thZ2Ugb2JqZWN0IHRvIHRoZSBlcXVpdmFsZW50Ci0gKiAgICAgICAgICAgICAgbmFtZXNwYWNlIG9iamVjdAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWFjcGlfc3RhdHVzCi1hY3BpX2RzX2J1aWxkX2ludGVybmFsX2J1ZmZlcl9vYmooc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSwKLQkJCQkgIHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpvcCwKLQkJCQkgIHUzMiBidWZmZXJfbGVuZ3RoLAotCQkJCSAgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKm9ial9kZXNjX3B0cikKLXsKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqYXJnOwotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjOwotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpieXRlX2xpc3Q7Ci0JdTMyIGJ5dGVfbGlzdF9sZW5ndGggPSAwOwotCi0JQUNQSV9GVU5DVElPTl9UUkFDRShkc19idWlsZF9pbnRlcm5hbF9idWZmZXJfb2JqKTsKLQotCS8qCi0JICogSWYgd2UgYXJlIGV2YWx1YXRpbmcgYSBOYW1lZCBidWZmZXIgb2JqZWN0ICJOYW1lICh4eHh4LCBCdWZmZXIpIi4KLQkgKiBUaGUgYnVmZmVyIG9iamVjdCBhbHJlYWR5IGV4aXN0cyAoZnJvbSB0aGUgTlMgbm9kZSksIG90aGVyd2lzZSBpdCBtdXN0Ci0JICogYmUgY3JlYXRlZC4KLQkgKi8KLQlvYmpfZGVzYyA9ICpvYmpfZGVzY19wdHI7Ci0JaWYgKCFvYmpfZGVzYykgewotCi0JCS8qIENyZWF0ZSBhIG5ldyBidWZmZXIgb2JqZWN0ICovCi0KLQkJb2JqX2Rlc2MgPSBhY3BpX3V0X2NyZWF0ZV9pbnRlcm5hbF9vYmplY3QoQUNQSV9UWVBFX0JVRkZFUik7Ci0JCSpvYmpfZGVzY19wdHIgPSBvYmpfZGVzYzsKLQkJaWYgKCFvYmpfZGVzYykgewotCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX01FTU9SWSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIFNlY29uZCBhcmcgaXMgdGhlIGJ1ZmZlciBkYXRhIChvcHRpb25hbCkgYnl0ZV9saXN0IGNhbiBiZSBlaXRoZXIKLQkgKiBpbmRpdmlkdWFsIGJ5dGVzIG9yIGEgc3RyaW5nIGluaXRpYWxpemVyLiAgSW4gZWl0aGVyIGNhc2UsIGEKLQkgKiBieXRlX2xpc3QgYXBwZWFycyBpbiB0aGUgQU1MLgotCSAqLwotCWFyZyA9IG9wLT5jb21tb24udmFsdWUuYXJnOwkvKiBza2lwIGZpcnN0IGFyZyAqLwotCi0JYnl0ZV9saXN0ID0gYXJnLT5uYW1lZC5uZXh0OwotCWlmIChieXRlX2xpc3QpIHsKLQkJaWYgKGJ5dGVfbGlzdC0+Y29tbW9uLmFtbF9vcGNvZGUgIT0gQU1MX0lOVF9CWVRFTElTVF9PUCkgewotCQkJQUNQSV9FUlJPUigoQUVfSU5GTywKLQkJCQkgICAgIkV4cGVjdGluZyBieXRlbGlzdCwgZ290IEFNTCBvcGNvZGUgJVggaW4gb3AgJXAiLAotCQkJCSAgICBieXRlX2xpc3QtPmNvbW1vbi5hbWxfb3Bjb2RlLCBieXRlX2xpc3QpKTsKLQotCQkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKG9ial9kZXNjKTsKLQkJCXJldHVybiAoQUVfVFlQRSk7Ci0JCX0KLQotCQlieXRlX2xpc3RfbGVuZ3RoID0gKHUzMikgYnl0ZV9saXN0LT5jb21tb24udmFsdWUuaW50ZWdlcjsKLQl9Ci0KLQkvKgotCSAqIFRoZSBidWZmZXIgbGVuZ3RoIChudW1iZXIgb2YgYnl0ZXMpIHdpbGwgYmUgdGhlIGxhcmdlciBvZjoKLQkgKiAxKSBUaGUgc3BlY2lmaWVkIGJ1ZmZlciBsZW5ndGggYW5kCi0JICogMikgVGhlIGxlbmd0aCBvZiB0aGUgaW5pdGlhbGl6ZXIgYnl0ZSBsaXN0Ci0JICovCi0Jb2JqX2Rlc2MtPmJ1ZmZlci5sZW5ndGggPSBidWZmZXJfbGVuZ3RoOwotCWlmIChieXRlX2xpc3RfbGVuZ3RoID4gYnVmZmVyX2xlbmd0aCkgewotCQlvYmpfZGVzYy0+YnVmZmVyLmxlbmd0aCA9IGJ5dGVfbGlzdF9sZW5ndGg7Ci0JfQotCi0JLyogQWxsb2NhdGUgdGhlIGJ1ZmZlciAqLwotCi0JaWYgKG9ial9kZXNjLT5idWZmZXIubGVuZ3RoID09IDApIHsKLQkJb2JqX2Rlc2MtPmJ1ZmZlci5wb2ludGVyID0gTlVMTDsKLQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FWEVDLAotCQkJCSAgIkJ1ZmZlciBkZWZpbmVkIHdpdGggemVybyBsZW5ndGggaW4gQU1MLCBjcmVhdGluZ1xuIikpOwotCX0gZWxzZSB7Ci0JCW9ial9kZXNjLT5idWZmZXIucG9pbnRlciA9Ci0JCSAgICBBQ1BJX0FMTE9DQVRFX1pFUk9FRChvYmpfZGVzYy0+YnVmZmVyLmxlbmd0aCk7Ci0JCWlmICghb2JqX2Rlc2MtPmJ1ZmZlci5wb2ludGVyKSB7Ci0JCQlhY3BpX3V0X2RlbGV0ZV9vYmplY3RfZGVzYyhvYmpfZGVzYyk7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9fTUVNT1JZKTsKLQkJfQotCi0JCS8qIEluaXRpYWxpemUgYnVmZmVyIGZyb20gdGhlIGJ5dGVfbGlzdCAoaWYgcHJlc2VudCkgKi8KLQotCQlpZiAoYnl0ZV9saXN0KSB7Ci0JCQlBQ1BJX01FTUNQWShvYmpfZGVzYy0+YnVmZmVyLnBvaW50ZXIsCi0JCQkJICAgIGJ5dGVfbGlzdC0+bmFtZWQuZGF0YSwgYnl0ZV9saXN0X2xlbmd0aCk7Ci0JCX0KLQl9Ci0KLQlvYmpfZGVzYy0+YnVmZmVyLmZsYWdzIHw9IEFPUE9CSl9EQVRBX1ZBTElEOwotCW9wLT5jb21tb24ubm9kZSA9IEFDUElfQ0FTVF9QVFIoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUsIG9ial9kZXNjKTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX2RzX2J1aWxkX2ludGVybmFsX3BhY2thZ2Vfb2JqCi0gKgotICogUEFSQU1FVEVSUzogIHdhbGtfc3RhdGUgICAgICAtIEN1cnJlbnQgd2FsayBzdGF0ZQotICogICAgICAgICAgICAgIE9wICAgICAgICAgICAgICAtIFBhcnNlciBvYmplY3QgdG8gYmUgdHJhbnNsYXRlZAotICogICAgICAgICAgICAgIGVsZW1lbnRfY291bnQgICAtIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgcGFja2FnZSAtIHRoaXMgaXMKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgbnVtX2VsZW1lbnRzIGFyZ3VtZW50IHRvIFBhY2thZ2UoKQotICogICAgICAgICAgICAgIG9ial9kZXNjX3B0ciAgICAtIFdoZXJlIHRoZSBBQ1BJIGludGVybmFsIG9iamVjdCBpcyByZXR1cm5lZAotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKLSAqCi0gKiBERVNDUklQVElPTjogVHJhbnNsYXRlIGEgcGFyc2VyIE9wIHBhY2thZ2Ugb2JqZWN0IHRvIHRoZSBlcXVpdmFsZW50Ci0gKiAgICAgICAgICAgICAgbmFtZXNwYWNlIG9iamVjdAotICoKLSAqIE5PVEU6IFRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIHBhY2thZ2Ugd2lsbCBiZSBhbHdheXMgYmUgdGhlIG51bV9lbGVtZW50cwotICogY291bnQsIHJlZ2FyZGxlc3Mgb2YgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgcGFja2FnZSBsaXN0LiBJZgotICogbnVtX2VsZW1lbnRzIGlzIHNtYWxsZXIsIG9ubHkgdGhhdCBtYW55IHBhY2thZ2UgbGlzdCBlbGVtZW50cyBhcmUgdXNlZC4KLSAqIGlmIG51bV9lbGVtZW50cyBpcyBsYXJnZXIsIHRoZSBQYWNrYWdlIG9iamVjdCBpcyBwYWRkZWQgb3V0IHdpdGgKLSAqIG9iamVjdHMgb2YgdHlwZSBVbmluaXRpYWxpemVkIChhcyBwZXIgQUNQSSBzcGVjLikKLSAqCi0gKiBFdmVuIHRob3VnaCB0aGUgQVNMIGNvbXBpbGVycyBkbyBub3QgYWxsb3cgbnVtX2VsZW1lbnRzIHRvIGJlIHNtYWxsZXIKLSAqIHRoYW4gdGhlIFBhY2thZ2UgbGlzdCBsZW5ndGggKGZvciB0aGUgZml4ZWQgbGVuZ3RoIHBhY2thZ2Ugb3Bjb2RlKSwgc29tZQotICogQklPUyBjb2RlIG1vZGlmaWVzIHRoZSBBTUwgb24gdGhlIGZseSB0byBhZGp1c3QgdGhlIG51bV9lbGVtZW50cywgYW5kCi0gKiB0aGlzIGNvZGUgY29tcGVuc2F0ZXMgZm9yIHRoYXQuIFRoaXMgYWxzbyBwcm92aWRlcyBjb21wYXRpYmlsaXR5IHdpdGgKLSAqIG90aGVyIEFNTCBpbnRlcnByZXRlcnMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotYWNwaV9zdGF0dXMKLWFjcGlfZHNfYnVpbGRfaW50ZXJuYWxfcGFja2FnZV9vYmooc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSwKLQkJCQkgICB1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqb3AsCi0JCQkJICAgdTMyIGVsZW1lbnRfY291bnQsCi0JCQkJICAgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKm9ial9kZXNjX3B0cikKLXsKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqYXJnOwotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpwYXJlbnQ7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2MgPSBOVUxMOwotCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOwotCXVuc2lnbmVkIGk7Ci0JdTE2IGluZGV4OwotCXUxNiByZWZlcmVuY2VfY291bnQ7Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGRzX2J1aWxkX2ludGVybmFsX3BhY2thZ2Vfb2JqKTsKLQotCS8qIEZpbmQgdGhlIHBhcmVudCBvZiBhIHBvc3NpYmx5IG5lc3RlZCBwYWNrYWdlICovCi0KLQlwYXJlbnQgPSBvcC0+Y29tbW9uLnBhcmVudDsKLQl3aGlsZSAoKHBhcmVudC0+Y29tbW9uLmFtbF9vcGNvZGUgPT0gQU1MX1BBQ0tBR0VfT1ApIHx8Ci0JICAgICAgIChwYXJlbnQtPmNvbW1vbi5hbWxfb3Bjb2RlID09IEFNTF9WQVJfUEFDS0FHRV9PUCkpIHsKLQkJcGFyZW50ID0gcGFyZW50LT5jb21tb24ucGFyZW50OwotCX0KLQotCS8qCi0JICogSWYgd2UgYXJlIGV2YWx1YXRpbmcgYSBOYW1lZCBwYWNrYWdlIG9iamVjdCAiTmFtZSAoeHh4eCwgUGFja2FnZSkiLAotCSAqIHRoZSBwYWNrYWdlIG9iamVjdCBhbHJlYWR5IGV4aXN0cywgb3RoZXJ3aXNlIGl0IG11c3QgYmUgY3JlYXRlZC4KLQkgKi8KLQlvYmpfZGVzYyA9ICpvYmpfZGVzY19wdHI7Ci0JaWYgKCFvYmpfZGVzYykgewotCQlvYmpfZGVzYyA9IGFjcGlfdXRfY3JlYXRlX2ludGVybmFsX29iamVjdChBQ1BJX1RZUEVfUEFDS0FHRSk7Ci0JCSpvYmpfZGVzY19wdHIgPSBvYmpfZGVzYzsKLQkJaWYgKCFvYmpfZGVzYykgewotCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX01FTU9SWSk7Ci0JCX0KLQotCQlvYmpfZGVzYy0+cGFja2FnZS5ub2RlID0gcGFyZW50LT5jb21tb24ubm9kZTsKLQl9Ci0KLQkvKgotCSAqIEFsbG9jYXRlIHRoZSBlbGVtZW50IGFycmF5IChhcnJheSBvZiBwb2ludGVycyB0byB0aGUgaW5kaXZpZHVhbAotCSAqIG9iamVjdHMpIGJhc2VkIG9uIHRoZSBudW1fZWxlbWVudHMgcGFyYW1ldGVyLiBBZGQgYW4gZXh0cmEgcG9pbnRlciBzbG90Ci0JICogc28gdGhhdCB0aGUgbGlzdCBpcyBhbHdheXMgbnVsbCB0ZXJtaW5hdGVkLgotCSAqLwotCW9ial9kZXNjLT5wYWNrYWdlLmVsZW1lbnRzID0gQUNQSV9BTExPQ0FURV9aRVJPRUQoKChhY3BpX3NpemUpCi0JCQkJCQkJICAgZWxlbWVudF9jb3VudCArCi0JCQkJCQkJICAgMSkgKiBzaXplb2Yodm9pZCAqKSk7Ci0KLQlpZiAoIW9ial9kZXNjLT5wYWNrYWdlLmVsZW1lbnRzKSB7Ci0JCWFjcGlfdXRfZGVsZXRlX29iamVjdF9kZXNjKG9ial9kZXNjKTsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX01FTU9SWSk7Ci0JfQotCi0Jb2JqX2Rlc2MtPnBhY2thZ2UuY291bnQgPSBlbGVtZW50X2NvdW50OwotCi0JLyoKLQkgKiBJbml0aWFsaXplIHRoZSBlbGVtZW50cyBvZiB0aGUgcGFja2FnZSwgdXAgdG8gdGhlIG51bV9lbGVtZW50cyBjb3VudC4KLQkgKiBQYWNrYWdlIGlzIGF1dG9tYXRpY2FsbHkgcGFkZGVkIHdpdGggdW5pbml0aWFsaXplZCAoTlVMTCkgZWxlbWVudHMKLQkgKiBpZiBudW1fZWxlbWVudHMgaXMgZ3JlYXRlciB0aGFuIHRoZSBwYWNrYWdlIGxpc3QgbGVuZ3RoLiBMaWtld2lzZSwKLQkgKiBQYWNrYWdlIGlzIHRydW5jYXRlZCBpZiBudW1fZWxlbWVudHMgaXMgbGVzcyB0aGFuIHRoZSBsaXN0IGxlbmd0aC4KLQkgKi8KLQlhcmcgPSBvcC0+Y29tbW9uLnZhbHVlLmFyZzsKLQlhcmcgPSBhcmctPmNvbW1vbi5uZXh0OwotCWZvciAoaSA9IDA7IGFyZyAmJiAoaSA8IGVsZW1lbnRfY291bnQpOyBpKyspIHsKLQkJaWYgKGFyZy0+Y29tbW9uLmFtbF9vcGNvZGUgPT0gQU1MX0lOVF9SRVRVUk5fVkFMVUVfT1ApIHsKLQkJCWlmIChhcmctPmNvbW1vbi5ub2RlLT50eXBlID09IEFDUElfVFlQRV9NRVRIT0QpIHsKLQkJCQkvKgotCQkJCSAqIEEgbWV0aG9kIHJlZmVyZW5jZSAibG9va3MiIHRvIHRoZSBwYXJzZXIgdG8gYmUgYSBtZXRob2QKLQkJCQkgKiBpbnZvY2F0aW9uLCBzbyB3ZSBzcGVjaWFsIGNhc2UgaXQgaGVyZQotCQkJCSAqLwotCQkJCWFyZy0+Y29tbW9uLmFtbF9vcGNvZGUgPSBBTUxfSU5UX05BTUVQQVRIX09QOwotCQkJCXN0YXR1cyA9Ci0JCQkJICAgIGFjcGlfZHNfYnVpbGRfaW50ZXJuYWxfb2JqZWN0KHdhbGtfc3RhdGUsCi0JCQkJCQkJCSAgYXJnLAotCQkJCQkJCQkgICZvYmpfZGVzYy0+Ci0JCQkJCQkJCSAgcGFja2FnZS4KLQkJCQkJCQkJICBlbGVtZW50c1tpXSk7Ci0JCQl9IGVsc2UgewotCQkJCS8qIFRoaXMgcGFja2FnZSBlbGVtZW50IGlzIGFscmVhZHkgYnVpbHQsIGp1c3QgZ2V0IGl0ICovCi0KLQkJCQlvYmpfZGVzYy0+cGFja2FnZS5lbGVtZW50c1tpXSA9Ci0JCQkJICAgIEFDUElfQ0FTVF9QVFIodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCwKLQkJCQkJCSAgYXJnLT5jb21tb24ubm9kZSk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlzdGF0dXMgPSBhY3BpX2RzX2J1aWxkX2ludGVybmFsX29iamVjdCh3YWxrX3N0YXRlLCBhcmcsCi0JCQkJCQkJICAgICAgICZvYmpfZGVzYy0+Ci0JCQkJCQkJICAgICAgIHBhY2thZ2UuCi0JCQkJCQkJICAgICAgIGVsZW1lbnRzW2ldKTsKLQkJfQotCi0JCWlmICgqb2JqX2Rlc2NfcHRyKSB7Ci0KLQkJCS8qIEV4aXN0aW5nIHBhY2thZ2UsIGdldCBleGlzdGluZyByZWZlcmVuY2UgY291bnQgKi8KLQotCQkJcmVmZXJlbmNlX2NvdW50ID0KLQkJCSAgICAoKm9ial9kZXNjX3B0ciktPmNvbW1vbi5yZWZlcmVuY2VfY291bnQ7Ci0JCQlpZiAocmVmZXJlbmNlX2NvdW50ID4gMSkgewotCi0JCQkJLyogTWFrZSBuZXcgZWxlbWVudCByZWYgY291bnQgbWF0Y2ggb3JpZ2luYWwgcmVmIGNvdW50ICovCi0KLQkJCQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCAocmVmZXJlbmNlX2NvdW50IC0gMSk7Ci0JCQkJICAgICBpbmRleCsrKSB7Ci0JCQkJCWFjcGlfdXRfYWRkX3JlZmVyZW5jZSgob2JqX2Rlc2MtPgotCQkJCQkJCSAgICAgICBwYWNrYWdlLgotCQkJCQkJCSAgICAgICBlbGVtZW50c1tpXSkpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWFyZyA9IGFyZy0+Y29tbW9uLm5leHQ7Ci0JfQotCi0JLyogQ2hlY2sgZm9yIG1hdGNoIGJldHdlZW4gbnVtX2VsZW1lbnRzIGFuZCBhY3R1YWwgbGVuZ3RoIG9mIHBhY2thZ2VfbGlzdCAqLwotCi0JaWYgKGFyZykgewotCQkvKgotCQkgKiBudW1fZWxlbWVudHMgd2FzIGV4aGF1c3RlZCwgYnV0IHRoZXJlIGFyZSByZW1haW5pbmcgZWxlbWVudHMgaW4gdGhlCi0JCSAqIHBhY2thZ2VfbGlzdC4KLQkJICoKLQkJICogTm90ZTogdGVjaG5pY2FsbHksIHRoaXMgaXMgYW4gZXJyb3IsIGZyb20gQUNQSSBzcGVjOiAiSXQgaXMgYW4gZXJyb3IKLQkJICogZm9yIE51bUVsZW1lbnRzIHRvIGJlIGxlc3MgdGhhbiB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZQotCQkgKiBQYWNrYWdlTGlzdCIuIEhvd2V2ZXIsIGZvciBub3csIHdlIGp1c3QgcHJpbnQgYW4gZXJyb3IgbWVzc2FnZSBhbmQKLQkJICogbm8gZXhjZXB0aW9uIGlzIHJldHVybmVkLgotCQkgKi8KLQkJd2hpbGUgKGFyZykgewotCi0JCQkvKiBGaW5kIG91dCBob3cgbWFueSBlbGVtZW50cyB0aGVyZSByZWFsbHkgYXJlICovCi0KLQkJCWkrKzsKLQkJCWFyZyA9IGFyZy0+Y29tbW9uLm5leHQ7Ci0JCX0KLQotCQlBQ1BJX1dBUk5JTkcoKEFFX0lORk8sCi0JCQkgICAgIlBhY2thZ2UgTGlzdCBsZW5ndGggKCVYKSBsYXJnZXIgdGhhbiBOdW1FbGVtZW50cyBjb3VudCAoJVgpLCB0cnVuY2F0ZWRcbiIsCi0JCQkgICAgaSwgZWxlbWVudF9jb3VudCkpOwotCX0gZWxzZSBpZiAoaSA8IGVsZW1lbnRfY291bnQpIHsKLQkJLyoKLQkJICogQXJnIGxpc3QgKGVsZW1lbnRzKSB3YXMgZXhoYXVzdGVkLCBidXQgd2UgZGlkIG5vdCByZWFjaCBudW1fZWxlbWVudHMgY291bnQuCi0JCSAqIE5vdGU6IHRoaXMgaXMgbm90IGFuIGVycm9yLCB0aGUgcGFja2FnZSBpcyBwYWRkZWQgb3V0IHdpdGggTlVMTHMuCi0JCSAqLwotCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sCi0JCQkJICAiUGFja2FnZSBMaXN0IGxlbmd0aCAoJVgpIHNtYWxsZXIgdGhhbiBOdW1FbGVtZW50cyBjb3VudCAoJVgpLCBwYWRkZWQgd2l0aCBudWxsIGVsZW1lbnRzXG4iLAotCQkJCSAgaSwgZWxlbWVudF9jb3VudCkpOwotCX0KLQotCW9ial9kZXNjLT5wYWNrYWdlLmZsYWdzIHw9IEFPUE9CSl9EQVRBX1ZBTElEOwotCW9wLT5jb21tb24ubm9kZSA9IEFDUElfQ0FTVF9QVFIoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUsIG9ial9kZXNjKTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9kc19jcmVhdGVfbm9kZQotICoKLSAqIFBBUkFNRVRFUlM6ICB3YWxrX3N0YXRlICAgICAgLSBDdXJyZW50IHdhbGsgc3RhdGUKLSAqICAgICAgICAgICAgICBOb2RlICAgICAgICAgICAgLSBOUyBOb2RlIHRvIGJlIGluaXRpYWxpemVkCi0gKiAgICAgICAgICAgICAgT3AgICAgICAgICAgICAgIC0gUGFyc2VyIG9iamVjdCB0byBiZSB0cmFuc2xhdGVkCi0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cwotICoKLSAqIERFU0NSSVBUSU9OOiBDcmVhdGUgdGhlIG9iamVjdCB0byBiZSBhc3NvY2lhdGVkIHdpdGggYSBuYW1lc3BhY2Ugbm9kZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWFjcGlfc3RhdHVzCi1hY3BpX2RzX2NyZWF0ZV9ub2RlKHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUsCi0JCSAgICBzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZSwKLQkJICAgIHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpvcCkKLXsKLQlhY3BpX3N0YXR1cyBzdGF0dXM7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2M7Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUihkc19jcmVhdGVfbm9kZSwgb3ApOwotCi0JLyoKLQkgKiBCZWNhdXNlIG9mIHRoZSBleGVjdXRpb24gcGFzcyB0aHJvdWdoIHRoZSBub24tY29udHJvbC1tZXRob2QKLQkgKiBwYXJ0cyBvZiB0aGUgdGFibGUsIHdlIGNhbiBhcnJpdmUgaGVyZSB0d2ljZS4gIE9ubHkgaW5pdAotCSAqIHRoZSBuYW1lZCBvYmplY3Qgbm9kZSB0aGUgZmlyc3QgdGltZSB0aHJvdWdoCi0JICovCi0JaWYgKGFjcGlfbnNfZ2V0X2F0dGFjaGVkX29iamVjdChub2RlKSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwotCX0KLQotCWlmICghb3AtPmNvbW1vbi52YWx1ZS5hcmcpIHsKLQotCQkvKiBObyBhcmd1bWVudHMsIHRoZXJlIGlzIG5vdGhpbmcgdG8gZG8gKi8KLQotCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwotCX0KLQotCS8qIEJ1aWxkIGFuIGludGVybmFsIG9iamVjdCBmb3IgdGhlIGFyZ3VtZW50KHMpICovCi0KLQlzdGF0dXMgPSBhY3BpX2RzX2J1aWxkX2ludGVybmFsX29iamVjdCh3YWxrX3N0YXRlLCBvcC0+Y29tbW9uLnZhbHVlLmFyZywKLQkJCQkJICAgICAgICZvYmpfZGVzYyk7Ci0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotCX0KLQotCS8qIFJlLXR5cGUgdGhlIG9iamVjdCBhY2NvcmRpbmcgdG8gaXRzIGFyZ3VtZW50ICovCi0KLQlub2RlLT50eXBlID0gQUNQSV9HRVRfT0JKRUNUX1RZUEUob2JqX2Rlc2MpOwotCi0JLyogQXR0YWNoIG9iaiB0byBub2RlICovCi0KLQlzdGF0dXMgPSBhY3BpX25zX2F0dGFjaF9vYmplY3Qobm9kZSwgb2JqX2Rlc2MsIG5vZGUtPnR5cGUpOwotCi0JLyogUmVtb3ZlIGxvY2FsIHJlZmVyZW5jZSB0byB0aGUgb2JqZWN0ICovCi0KLQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2Uob2JqX2Rlc2MpOwotCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotfQotCi0jZW5kaWYJCQkJLyogQUNQSV9OT19NRVRIT0RfRVhFQ1VUSU9OICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfZHNfaW5pdF9vYmplY3RfZnJvbV9vcAotICoKLSAqIFBBUkFNRVRFUlM6ICB3YWxrX3N0YXRlICAgICAgLSBDdXJyZW50IHdhbGsgc3RhdGUKLSAqICAgICAgICAgICAgICBPcCAgICAgICAgICAgICAgLSBQYXJzZXIgb3AgdXNlZCB0byBpbml0IHRoZSBpbnRlcm5hbCBvYmplY3QKLSAqICAgICAgICAgICAgICBPcGNvZGUgICAgICAgICAgLSBBTUwgb3Bjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgb2JqZWN0Ci0gKiAgICAgICAgICAgICAgcmV0X29ial9kZXNjICAgIC0gTmFtZXNwYWNlIG9iamVjdCB0byBiZSBpbml0aWFsaXplZAotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKLSAqCi0gKiBERVNDUklQVElPTjogSW5pdGlhbGl6ZSBhIG5hbWVzcGFjZSBvYmplY3QgZnJvbSBhIHBhcnNlciBPcCBhbmQgaXRzCi0gKiAgICAgICAgICAgICAgYXNzb2NpYXRlZCBhcmd1bWVudHMuICBUaGUgbmFtZXNwYWNlIG9iamVjdCBpcyBhIG1vcmUgY29tcGFjdAotICogICAgICAgICAgICAgIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBPcCBhbmQgaXRzIGFyZ3VtZW50cy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1hY3BpX3N0YXR1cwotYWNwaV9kc19pbml0X29iamVjdF9mcm9tX29wKHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUsCi0JCQkgICAgdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKm9wLAotCQkJICAgIHUxNiBvcGNvZGUsCi0JCQkgICAgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKnJldF9vYmpfZGVzYykKLXsKLQljb25zdCBzdHJ1Y3QgYWNwaV9vcGNvZGVfaW5mbyAqb3BfaW5mbzsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYzsKLQlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UoZHNfaW5pdF9vYmplY3RfZnJvbV9vcCk7Ci0KLQlvYmpfZGVzYyA9ICpyZXRfb2JqX2Rlc2M7Ci0Jb3BfaW5mbyA9IGFjcGlfcHNfZ2V0X29wY29kZV9pbmZvKG9wY29kZSk7Ci0JaWYgKG9wX2luZm8tPmNsYXNzID09IEFNTF9DTEFTU19VTktOT1dOKSB7Ci0KLQkJLyogVW5rbm93biBvcGNvZGUgKi8KLQotCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfVFlQRSk7Ci0JfQotCi0JLyogUGVyZm9ybSBwZXItb2JqZWN0IGluaXRpYWxpemF0aW9uICovCi0KLQlzd2l0Y2ggKEFDUElfR0VUX09CSkVDVF9UWVBFKG9ial9kZXNjKSkgewotCWNhc2UgQUNQSV9UWVBFX0JVRkZFUjoKLQotCQkvKgotCQkgKiBEZWZlciBldmFsdWF0aW9uIG9mIEJ1ZmZlciB0ZXJtX2FyZyBvcGVyYW5kCi0JCSAqLwotCQlvYmpfZGVzYy0+YnVmZmVyLm5vZGUgPQotCQkgICAgQUNQSV9DQVNUX1BUUihzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSwKLQkJCQkgIHdhbGtfc3RhdGUtPm9wZXJhbmRzWzBdKTsKLQkJb2JqX2Rlc2MtPmJ1ZmZlci5hbWxfc3RhcnQgPSBvcC0+bmFtZWQuZGF0YTsKLQkJb2JqX2Rlc2MtPmJ1ZmZlci5hbWxfbGVuZ3RoID0gb3AtPm5hbWVkLmxlbmd0aDsKLQkJYnJlYWs7Ci0KLQljYXNlIEFDUElfVFlQRV9QQUNLQUdFOgotCi0JCS8qCi0JCSAqIERlZmVyIGV2YWx1YXRpb24gb2YgUGFja2FnZSB0ZXJtX2FyZyBvcGVyYW5kCi0JCSAqLwotCQlvYmpfZGVzYy0+cGFja2FnZS5ub2RlID0KLQkJICAgIEFDUElfQ0FTVF9QVFIoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUsCi0JCQkJICB3YWxrX3N0YXRlLT5vcGVyYW5kc1swXSk7Ci0JCW9ial9kZXNjLT5wYWNrYWdlLmFtbF9zdGFydCA9IG9wLT5uYW1lZC5kYXRhOwotCQlvYmpfZGVzYy0+cGFja2FnZS5hbWxfbGVuZ3RoID0gb3AtPm5hbWVkLmxlbmd0aDsKLQkJYnJlYWs7Ci0KLQljYXNlIEFDUElfVFlQRV9JTlRFR0VSOgotCi0JCXN3aXRjaCAob3BfaW5mby0+dHlwZSkgewotCQljYXNlIEFNTF9UWVBFX0NPTlNUQU5UOgotCQkJLyoKLQkJCSAqIFJlc29sdmUgQU1MIENvbnN0YW50cyBoZXJlIC0gQU5EIE9OTFkgSEVSRSEKLQkJCSAqIEFsbCBjb25zdGFudHMgYXJlIGludGVnZXJzLgotCQkJICogV2UgbWFyayB0aGUgaW50ZWdlciB3aXRoIGEgZmxhZyB0aGF0IGluZGljYXRlcyB0aGF0IGl0IHN0YXJ0ZWQKLQkJCSAqIGxpZmUgYXMgYSBjb25zdGFudCAtLSBzbyB0aGF0IHN0b3JlcyB0byBjb25zdGFudHMgd2lsbCBwZXJmb3JtCi0JCQkgKiBhcyBleHBlY3RlZCAobm9vcCkuIHplcm9fb3AgaXMgdXNlZCBhcyBhIHBsYWNlaG9sZGVyIGZvciBvcHRpb25hbAotCQkJICogdGFyZ2V0IG9wZXJhbmRzLgotCQkJICovCi0JCQlvYmpfZGVzYy0+Y29tbW9uLmZsYWdzID0gQU9QT0JKX0FNTF9DT05TVEFOVDsKLQotCQkJc3dpdGNoIChvcGNvZGUpIHsKLQkJCWNhc2UgQU1MX1pFUk9fT1A6Ci0KLQkJCQlvYmpfZGVzYy0+aW50ZWdlci52YWx1ZSA9IDA7Ci0JCQkJYnJlYWs7Ci0KLQkJCWNhc2UgQU1MX09ORV9PUDoKLQotCQkJCW9ial9kZXNjLT5pbnRlZ2VyLnZhbHVlID0gMTsKLQkJCQlicmVhazsKLQotCQkJY2FzZSBBTUxfT05FU19PUDoKLQotCQkJCW9ial9kZXNjLT5pbnRlZ2VyLnZhbHVlID0gQUNQSV9JTlRFR0VSX01BWDsKLQotCQkJCS8qIFRydW5jYXRlIHZhbHVlIGlmIHdlIGFyZSBleGVjdXRpbmcgZnJvbSBhIDMyLWJpdCBBQ1BJIHRhYmxlICovCi0KLSNpZm5kZWYgQUNQSV9OT19NRVRIT0RfRVhFQ1VUSU9OCi0JCQkJYWNwaV9leF90cnVuY2F0ZV9mb3IzMmJpdF90YWJsZShvYmpfZGVzYyk7Ci0jZW5kaWYKLQkJCQlicmVhazsKLQotCQkJY2FzZSBBTUxfUkVWSVNJT05fT1A6Ci0KLQkJCQlvYmpfZGVzYy0+aW50ZWdlci52YWx1ZSA9IEFDUElfQ0FfVkVSU0lPTjsKLQkJCQlicmVhazsKLQotCQkJZGVmYXVsdDoKLQotCQkJCUFDUElfRVJST1IoKEFFX0lORk8sCi0JCQkJCSAgICAiVW5rbm93biBjb25zdGFudCBvcGNvZGUgJVgiLAotCQkJCQkgICAgb3Bjb2RlKSk7Ci0JCQkJc3RhdHVzID0gQUVfQU1MX09QRVJBTkRfVFlQRTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWJyZWFrOwotCi0JCWNhc2UgQU1MX1RZUEVfTElURVJBTDoKLQotCQkJb2JqX2Rlc2MtPmludGVnZXIudmFsdWUgPSBvcC0+Y29tbW9uLnZhbHVlLmludGVnZXI7Ci0jaWZuZGVmIEFDUElfTk9fTUVUSE9EX0VYRUNVVElPTgotCQkJYWNwaV9leF90cnVuY2F0ZV9mb3IzMmJpdF90YWJsZShvYmpfZGVzYyk7Ci0jZW5kaWYKLQkJCWJyZWFrOwotCi0JCWRlZmF1bHQ6Ci0JCQlBQ1BJX0VSUk9SKChBRV9JTkZPLCAiVW5rbm93biBJbnRlZ2VyIHR5cGUgJVgiLAotCQkJCSAgICBvcF9pbmZvLT50eXBlKSk7Ci0JCQlzdGF0dXMgPSBBRV9BTUxfT1BFUkFORF9UWVBFOwotCQkJYnJlYWs7Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIEFDUElfVFlQRV9TVFJJTkc6Ci0KLQkJb2JqX2Rlc2MtPnN0cmluZy5wb2ludGVyID0gb3AtPmNvbW1vbi52YWx1ZS5zdHJpbmc7Ci0JCW9ial9kZXNjLT5zdHJpbmcubGVuZ3RoID0KLQkJICAgICh1MzIpIEFDUElfU1RSTEVOKG9wLT5jb21tb24udmFsdWUuc3RyaW5nKTsKLQotCQkvKgotCQkgKiBUaGUgc3RyaW5nIGlzIGNvbnRhaW5lZCBpbiB0aGUgQUNQSSB0YWJsZSwgZG9uJ3QgZXZlciB0cnkKLQkJICogdG8gZGVsZXRlIGl0Ci0JCSAqLwotCQlvYmpfZGVzYy0+Y29tbW9uLmZsYWdzIHw9IEFPUE9CSl9TVEFUSUNfUE9JTlRFUjsKLQkJYnJlYWs7Ci0KLQljYXNlIEFDUElfVFlQRV9NRVRIT0Q6Ci0JCWJyZWFrOwotCi0JY2FzZSBBQ1BJX1RZUEVfTE9DQUxfUkVGRVJFTkNFOgotCi0JCXN3aXRjaCAob3BfaW5mby0+dHlwZSkgewotCQljYXNlIEFNTF9UWVBFX0xPQ0FMX1ZBUklBQkxFOgotCi0JCQkvKiBMb2NhbCBJRCAoMC03KSBpcyAoQU1MIG9wY29kZSAtIGJhc2UgQU1MX0xPQ0FMX09QKSAqLwotCi0JCQlvYmpfZGVzYy0+cmVmZXJlbmNlLnZhbHVlID0gb3Bjb2RlIC0gQU1MX0xPQ0FMX09QOwotCQkJb2JqX2Rlc2MtPnJlZmVyZW5jZS5jbGFzcyA9IEFDUElfUkVGQ0xBU1NfTE9DQUw7Ci0KLSNpZm5kZWYgQUNQSV9OT19NRVRIT0RfRVhFQ1VUSU9OCi0JCQlzdGF0dXMgPQotCQkJICAgIGFjcGlfZHNfbWV0aG9kX2RhdGFfZ2V0X25vZGUoQUNQSV9SRUZDTEFTU19MT0NBTCwKLQkJCQkJCQkgb2JqX2Rlc2MtPnJlZmVyZW5jZS4KLQkJCQkJCQkgdmFsdWUsIHdhbGtfc3RhdGUsCi0JCQkJCQkJIEFDUElfQ0FTVF9JTkRJUkVDVF9QVFIKLQkJCQkJCQkgKHN0cnVjdAotCQkJCQkJCSAgYWNwaV9uYW1lc3BhY2Vfbm9kZSwKLQkJCQkJCQkgICZvYmpfZGVzYy0+cmVmZXJlbmNlLgotCQkJCQkJCSAgb2JqZWN0KSk7Ci0jZW5kaWYKLQkJCWJyZWFrOwotCi0JCWNhc2UgQU1MX1RZUEVfTUVUSE9EX0FSR1VNRU5UOgotCi0JCQkvKiBBcmcgSUQgKDAtNikgaXMgKEFNTCBvcGNvZGUgLSBiYXNlIEFNTF9BUkdfT1ApICovCi0KLQkJCW9ial9kZXNjLT5yZWZlcmVuY2UudmFsdWUgPSBvcGNvZGUgLSBBTUxfQVJHX09QOwotCQkJb2JqX2Rlc2MtPnJlZmVyZW5jZS5jbGFzcyA9IEFDUElfUkVGQ0xBU1NfQVJHOwotCi0jaWZuZGVmIEFDUElfTk9fTUVUSE9EX0VYRUNVVElPTgotCQkJc3RhdHVzID0gYWNwaV9kc19tZXRob2RfZGF0YV9nZXRfbm9kZShBQ1BJX1JFRkNMQVNTX0FSRywKLQkJCQkJCQkgICAgICBvYmpfZGVzYy0+Ci0JCQkJCQkJICAgICAgcmVmZXJlbmNlLnZhbHVlLAotCQkJCQkJCSAgICAgIHdhbGtfc3RhdGUsCi0JCQkJCQkJICAgICAgQUNQSV9DQVNUX0lORElSRUNUX1BUUgotCQkJCQkJCSAgICAgIChzdHJ1Y3QKLQkJCQkJCQkgICAgICAgYWNwaV9uYW1lc3BhY2Vfbm9kZSwKLQkJCQkJCQkgICAgICAgJm9ial9kZXNjLT4KLQkJCQkJCQkgICAgICAgcmVmZXJlbmNlLgotCQkJCQkJCSAgICAgICBvYmplY3QpKTsKLSNlbmRpZgotCQkJYnJlYWs7Ci0KLQkJZGVmYXVsdDoJLyogT2JqZWN0IG5hbWUgb3IgRGVidWcgb2JqZWN0ICovCi0KLQkJCXN3aXRjaCAob3AtPmNvbW1vbi5hbWxfb3Bjb2RlKSB7Ci0JCQljYXNlIEFNTF9JTlRfTkFNRVBBVEhfT1A6Ci0KLQkJCQkvKiBOb2RlIHdhcyBzYXZlZCBpbiBPcCAqLwotCi0JCQkJb2JqX2Rlc2MtPnJlZmVyZW5jZS5ub2RlID0gb3AtPmNvbW1vbi5ub2RlOwotCQkJCW9ial9kZXNjLT5yZWZlcmVuY2Uub2JqZWN0ID0KLQkJCQkgICAgb3AtPmNvbW1vbi5ub2RlLT5vYmplY3Q7Ci0JCQkJb2JqX2Rlc2MtPnJlZmVyZW5jZS5jbGFzcyA9IEFDUElfUkVGQ0xBU1NfTkFNRTsKLQkJCQlicmVhazsKLQotCQkJY2FzZSBBTUxfREVCVUdfT1A6Ci0KLQkJCQlvYmpfZGVzYy0+cmVmZXJlbmNlLmNsYXNzID0gQUNQSV9SRUZDTEFTU19ERUJVRzsKLQkJCQlicmVhazsKLQotCQkJZGVmYXVsdDoKLQotCQkJCUFDUElfRVJST1IoKEFFX0lORk8sCi0JCQkJCSAgICAiVW5pbXBsZW1lbnRlZCByZWZlcmVuY2UgdHlwZSBmb3IgQU1MIG9wY29kZTogJTQuNFgiLAotCQkJCQkgICAgb3Bjb2RlKSk7Ci0JCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9PUEVSQU5EX1RZUEUpOwotCQkJfQotCQkJYnJlYWs7Ci0JCX0KLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCi0JCUFDUElfRVJST1IoKEFFX0lORk8sICJVbmltcGxlbWVudGVkIGRhdGEgdHlwZTogJVgiLAotCQkJICAgIEFDUElfR0VUX09CSkVDVF9UWVBFKG9ial9kZXNjKSkpOwotCi0JCXN0YXR1cyA9IEFFX0FNTF9PUEVSQU5EX1RZUEU7Ci0JCWJyZWFrOwotCX0KLQotCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2Rpc3BhdGNoZXIvZHNvcGNvZGUuYyBiL2RyaXZlcnMvYWNwaS9kaXNwYXRjaGVyL2Rzb3Bjb2RlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5ZmFlNTkuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9hY3BpL2Rpc3BhdGNoZXIvZHNvcGNvZGUuYworKysgL2Rldi9udWxsCkBAIC0xLDE0MjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIE1vZHVsZSBOYW1lOiBkc29wY29kZSAtIERpc3BhdGNoZXIgT3AgUmVnaW9uIHN1cHBvcnQgYW5kIGhhbmRsaW5nIG9mCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAiY29udHJvbCIgb3Bjb2RlcwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDgsIEludGVsIENvcnAuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCi0gKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSBhdCBtaW5pbXVtIGEgZGlzY2xhaW1lcgotICogICAgc3Vic3RhbnRpYWxseSBzaW1pbGFyIHRvIHRoZSAiTk8gV0FSUkFOVFkiIGRpc2NsYWltZXIgYmVsb3cKLSAqICAgICgiRGlzY2xhaW1lciIpIGFuZCBhbnkgcmVkaXN0cmlidXRpb24gbXVzdCBiZSBjb25kaXRpb25lZCB1cG9uCi0gKiAgICBpbmNsdWRpbmcgYSBzdWJzdGFudGlhbGx5IHNpbWlsYXIgRGlzY2xhaW1lciByZXF1aXJlbWVudCBmb3IgZnVydGhlcgotICogICAgYmluYXJ5IHJlZGlzdHJpYnV0aW9uLgotICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzCi0gKiAgICBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIE5PIFdBUlJBTlRZCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKLSAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCi0gKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORwotICogSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCi0gKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCi0gKi8KLQotI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgotI2luY2x1ZGUgPGFjcGkvYWNwYXJzZXIuaD4KLSNpbmNsdWRlIDxhY3BpL2FtbGNvZGUuaD4KLSNpbmNsdWRlIDxhY3BpL2FjZGlzcGF0Lmg+Ci0jaW5jbHVkZSA8YWNwaS9hY2ludGVycC5oPgotI2luY2x1ZGUgPGFjcGkvYWNuYW1lc3AuaD4KLSNpbmNsdWRlIDxhY3BpL2FjZXZlbnRzLmg+Ci0jaW5jbHVkZSA8YWNwaS9hY3RhYmxlcy5oPgotCi0jZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9ESVNQQVRDSEVSCi1BQ1BJX01PRFVMRV9OQU1FKCJkc29wY29kZSIpCi0KLS8qIExvY2FsIHByb3RvdHlwZXMgKi8KLXN0YXRpYyBhY3BpX3N0YXR1cwotYWNwaV9kc19leGVjdXRlX2FyZ3VtZW50cyhzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZSwKLQkJCSAgc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKnNjb3BlX25vZGUsCi0JCQkgIHUzMiBhbWxfbGVuZ3RoLCB1OCAqIGFtbF9zdGFydCk7Ci0KLXN0YXRpYyBhY3BpX3N0YXR1cwotYWNwaV9kc19pbml0X2J1ZmZlcl9maWVsZCh1MTYgYW1sX29wY29kZSwKLQkJCSAgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2MsCi0JCQkgIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKmJ1ZmZlcl9kZXNjLAotCQkJICB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvZmZzZXRfZGVzYywKLQkJCSAgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqbGVuZ3RoX2Rlc2MsCi0JCQkgIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnJlc3VsdF9kZXNjKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9kc19leGVjdXRlX2FyZ3VtZW50cwotICoKLSAqIFBBUkFNRVRFUlM6ICBOb2RlICAgICAgICAgICAgICAgIC0gT2JqZWN0IE5TIG5vZGUKLSAqICAgICAgICAgICAgICBzY29wZV9ub2RlICAgICAgICAgIC0gUGFyZW50IE5TIG5vZGUKLSAqICAgICAgICAgICAgICBhbWxfbGVuZ3RoICAgICAgICAgIC0gTGVuZ3RoIG9mIGV4ZWN1dGFibGUgQU1MCi0gKiAgICAgICAgICAgICAgYW1sX3N0YXJ0ICAgICAgICAgICAtIFBvaW50ZXIgdG8gdGhlIEFNTAotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMuCi0gKgotICogREVTQ1JJUFRJT046IExhdGUgKGRlZmVycmVkKSBleGVjdXRpb24gb2YgcmVnaW9uIG9yIGZpZWxkIGFyZ3VtZW50cwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyBhY3BpX3N0YXR1cwotYWNwaV9kc19leGVjdXRlX2FyZ3VtZW50cyhzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZSwKLQkJCSAgc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKnNjb3BlX25vZGUsCi0JCQkgIHUzMiBhbWxfbGVuZ3RoLCB1OCAqIGFtbF9zdGFydCkKLXsKLQlhY3BpX3N0YXR1cyBzdGF0dXM7Ci0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKm9wOwotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGU7Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGRzX2V4ZWN1dGVfYXJndW1lbnRzKTsKLQotCS8qCi0JICogQWxsb2NhdGUgYSBuZXcgcGFyc2VyIG9wIHRvIGJlIHRoZSByb290IG9mIHRoZSBwYXJzZWQgdHJlZQotCSAqLwotCW9wID0gYWNwaV9wc19hbGxvY19vcChBTUxfSU5UX0VWQUxfU1VCVFJFRV9PUCk7Ci0JaWYgKCFvcCkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9fTUVNT1JZKTsKLQl9Ci0KLQkvKiBTYXZlIHRoZSBOb2RlIGZvciB1c2UgaW4gYWNwaV9wc19wYXJzZV9hbWwgKi8KLQotCW9wLT5jb21tb24ubm9kZSA9IHNjb3BlX25vZGU7Ci0KLQkvKiBDcmVhdGUgYW5kIGluaXRpYWxpemUgYSBuZXcgcGFyc2VyIHN0YXRlICovCi0KLQl3YWxrX3N0YXRlID0gYWNwaV9kc19jcmVhdGVfd2Fsa19zdGF0ZSgwLCBOVUxMLCBOVUxMLCBOVUxMKTsKLQlpZiAoIXdhbGtfc3RhdGUpIHsKLQkJc3RhdHVzID0gQUVfTk9fTUVNT1JZOwotCQlnb3RvIGNsZWFudXA7Ci0JfQotCi0Jc3RhdHVzID0gYWNwaV9kc19pbml0X2FtbF93YWxrKHdhbGtfc3RhdGUsIG9wLCBOVUxMLCBhbWxfc3RhcnQsCi0JCQkJICAgICAgIGFtbF9sZW5ndGgsIE5VTEwsIEFDUElfSU1PREVfTE9BRF9QQVNTMSk7Ci0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCWFjcGlfZHNfZGVsZXRlX3dhbGtfc3RhdGUod2Fsa19zdGF0ZSk7Ci0JCWdvdG8gY2xlYW51cDsKLQl9Ci0KLQkvKiBNYXJrIHRoaXMgcGFyc2UgYXMgYSBkZWZlcnJlZCBvcGNvZGUgKi8KLQotCXdhbGtfc3RhdGUtPnBhcnNlX2ZsYWdzID0gQUNQSV9QQVJTRV9ERUZFUlJFRF9PUDsKLQl3YWxrX3N0YXRlLT5kZWZlcnJlZF9ub2RlID0gbm9kZTsKLQotCS8qIFBhc3MxOiBQYXJzZSB0aGUgZW50aXJlIGRlY2xhcmF0aW9uICovCi0KLQlzdGF0dXMgPSBhY3BpX3BzX3BhcnNlX2FtbCh3YWxrX3N0YXRlKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJZ290byBjbGVhbnVwOwotCX0KLQotCS8qIEdldCBhbmQgaW5pdCB0aGUgT3AgY3JlYXRlZCBhYm92ZSAqLwotCi0Jb3AtPmNvbW1vbi5ub2RlID0gbm9kZTsKLQlhY3BpX3BzX2RlbGV0ZV9wYXJzZV90cmVlKG9wKTsKLQotCS8qIEV2YWx1YXRlIHRoZSBkZWZlcnJlZCBhcmd1bWVudHMgKi8KLQotCW9wID0gYWNwaV9wc19hbGxvY19vcChBTUxfSU5UX0VWQUxfU1VCVFJFRV9PUCk7Ci0JaWYgKCFvcCkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9fTUVNT1JZKTsKLQl9Ci0KLQlvcC0+Y29tbW9uLm5vZGUgPSBzY29wZV9ub2RlOwotCi0JLyogQ3JlYXRlIGFuZCBpbml0aWFsaXplIGEgbmV3IHBhcnNlciBzdGF0ZSAqLwotCi0Jd2Fsa19zdGF0ZSA9IGFjcGlfZHNfY3JlYXRlX3dhbGtfc3RhdGUoMCwgTlVMTCwgTlVMTCwgTlVMTCk7Ci0JaWYgKCF3YWxrX3N0YXRlKSB7Ci0JCXN0YXR1cyA9IEFFX05PX01FTU9SWTsKLQkJZ290byBjbGVhbnVwOwotCX0KLQotCS8qIEV4ZWN1dGUgdGhlIG9wY29kZSBhbmQgYXJndW1lbnRzICovCi0KLQlzdGF0dXMgPSBhY3BpX2RzX2luaXRfYW1sX3dhbGsod2Fsa19zdGF0ZSwgb3AsIE5VTEwsIGFtbF9zdGFydCwKLQkJCQkgICAgICAgYW1sX2xlbmd0aCwgTlVMTCwgQUNQSV9JTU9ERV9FWEVDVVRFKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJYWNwaV9kc19kZWxldGVfd2Fsa19zdGF0ZSh3YWxrX3N0YXRlKTsKLQkJZ290byBjbGVhbnVwOwotCX0KLQotCS8qIE1hcmsgdGhpcyBleGVjdXRpb24gYXMgYSBkZWZlcnJlZCBvcGNvZGUgKi8KLQotCXdhbGtfc3RhdGUtPmRlZmVycmVkX25vZGUgPSBub2RlOwotCXN0YXR1cyA9IGFjcGlfcHNfcGFyc2VfYW1sKHdhbGtfc3RhdGUpOwotCi0gICAgICBjbGVhbnVwOgotCWFjcGlfcHNfZGVsZXRlX3BhcnNlX3RyZWUob3ApOwotCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX2RzX2dldF9idWZmZXJfZmllbGRfYXJndW1lbnRzCi0gKgotICogUEFSQU1FVEVSUzogIG9ial9kZXNjICAgICAgICAtIEEgdmFsaWQgYnVmZmVyX2ZpZWxkIG9iamVjdAotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMuCi0gKgotICogREVTQ1JJUFRJT046IEdldCBidWZmZXJfZmllbGQgQnVmZmVyIGFuZCBJbmRleC4gVGhpcyBpbXBsZW1lbnRzIHRoZSBsYXRlCi0gKiAgICAgICAgICAgICAgZXZhbHVhdGlvbiBvZiB0aGVzZSBmaWVsZCBhdHRyaWJ1dGVzLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWFjcGlfc3RhdHVzCi1hY3BpX2RzX2dldF9idWZmZXJfZmllbGRfYXJndW1lbnRzKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjKQotewotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKmV4dHJhX2Rlc2M7Ci0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGU7Ci0JYWNwaV9zdGF0dXMgc3RhdHVzOwotCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIoZHNfZ2V0X2J1ZmZlcl9maWVsZF9hcmd1bWVudHMsIG9ial9kZXNjKTsKLQotCWlmIChvYmpfZGVzYy0+Y29tbW9uLmZsYWdzICYgQU9QT0JKX0RBVEFfVkFMSUQpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKLQl9Ci0KLQkvKiBHZXQgdGhlIEFNTCBwb2ludGVyIChtZXRob2Qgb2JqZWN0KSBhbmQgYnVmZmVyX2ZpZWxkIG5vZGUgKi8KLQotCWV4dHJhX2Rlc2MgPSBhY3BpX25zX2dldF9zZWNvbmRhcnlfb2JqZWN0KG9ial9kZXNjKTsKLQlub2RlID0gb2JqX2Rlc2MtPmJ1ZmZlcl9maWVsZC5ub2RlOwotCi0JQUNQSV9ERUJVR19FWEVDKGFjcGlfdXRfZGlzcGxheV9pbml0X3BhdGhuYW1lCi0JCQkoQUNQSV9UWVBFX0JVRkZFUl9GSUVMRCwgbm9kZSwgTlVMTCkpOwotCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVhFQywgIlslNC40c10gQnVmZmVyRmllbGQgQXJnIEluaXRcbiIsCi0JCQkgIGFjcGlfdXRfZ2V0X25vZGVfbmFtZShub2RlKSkpOwotCi0JLyogRXhlY3V0ZSB0aGUgQU1MIGNvZGUgZm9yIHRoZSB0ZXJtX2FyZyBhcmd1bWVudHMgKi8KLQotCXN0YXR1cyA9IGFjcGlfZHNfZXhlY3V0ZV9hcmd1bWVudHMobm9kZSwgYWNwaV9uc19nZXRfcGFyZW50X25vZGUobm9kZSksCi0JCQkJCSAgIGV4dHJhX2Rlc2MtPmV4dHJhLmFtbF9sZW5ndGgsCi0JCQkJCSAgIGV4dHJhX2Rlc2MtPmV4dHJhLmFtbF9zdGFydCk7Ci0JcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfZHNfZ2V0X2JhbmtfZmllbGRfYXJndW1lbnRzCi0gKgotICogUEFSQU1FVEVSUzogIG9ial9kZXNjICAgICAgICAtIEEgdmFsaWQgYmFua19maWVsZCBvYmplY3QKLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzLgotICoKLSAqIERFU0NSSVBUSU9OOiBHZXQgYmFua19maWVsZCBiYW5rX3ZhbHVlLiBUaGlzIGltcGxlbWVudHMgdGhlIGxhdGUKLSAqICAgICAgICAgICAgICBldmFsdWF0aW9uIG9mIHRoZXNlIGZpZWxkIGF0dHJpYnV0ZXMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotYWNwaV9zdGF0dXMKLWFjcGlfZHNfZ2V0X2JhbmtfZmllbGRfYXJndW1lbnRzKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjKQotewotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKmV4dHJhX2Rlc2M7Ci0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGU7Ci0JYWNwaV9zdGF0dXMgc3RhdHVzOwotCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIoZHNfZ2V0X2JhbmtfZmllbGRfYXJndW1lbnRzLCBvYmpfZGVzYyk7Ci0KLQlpZiAob2JqX2Rlc2MtPmNvbW1vbi5mbGFncyAmIEFPUE9CSl9EQVRBX1ZBTElEKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7Ci0JfQotCi0JLyogR2V0IHRoZSBBTUwgcG9pbnRlciAobWV0aG9kIG9iamVjdCkgYW5kIGJhbmtfZmllbGQgbm9kZSAqLwotCi0JZXh0cmFfZGVzYyA9IGFjcGlfbnNfZ2V0X3NlY29uZGFyeV9vYmplY3Qob2JqX2Rlc2MpOwotCW5vZGUgPSBvYmpfZGVzYy0+YmFua19maWVsZC5ub2RlOwotCi0JQUNQSV9ERUJVR19FWEVDKGFjcGlfdXRfZGlzcGxheV9pbml0X3BhdGhuYW1lCi0JCQkoQUNQSV9UWVBFX0xPQ0FMX0JBTktfRklFTEQsIG5vZGUsIE5VTEwpKTsKLQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VYRUMsICJbJTQuNHNdIEJhbmtGaWVsZCBBcmcgSW5pdFxuIiwKLQkJCSAgYWNwaV91dF9nZXRfbm9kZV9uYW1lKG5vZGUpKSk7Ci0KLQkvKiBFeGVjdXRlIHRoZSBBTUwgY29kZSBmb3IgdGhlIHRlcm1fYXJnIGFyZ3VtZW50cyAqLwotCi0Jc3RhdHVzID0gYWNwaV9kc19leGVjdXRlX2FyZ3VtZW50cyhub2RlLCBhY3BpX25zX2dldF9wYXJlbnRfbm9kZShub2RlKSwKLQkJCQkJICAgZXh0cmFfZGVzYy0+ZXh0cmEuYW1sX2xlbmd0aCwKLQkJCQkJICAgZXh0cmFfZGVzYy0+ZXh0cmEuYW1sX3N0YXJ0KTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9kc19nZXRfYnVmZmVyX2FyZ3VtZW50cwotICoKLSAqIFBBUkFNRVRFUlM6ICBvYmpfZGVzYyAgICAgICAgLSBBIHZhbGlkIEJ1ZmZlciBvYmplY3QKLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzLgotICoKLSAqIERFU0NSSVBUSU9OOiBHZXQgQnVmZmVyIGxlbmd0aCBhbmQgaW5pdGlhbGl6ZXIgYnl0ZSBsaXN0LiAgVGhpcyBpbXBsZW1lbnRzCi0gKiAgICAgICAgICAgICAgdGhlIGxhdGUgZXZhbHVhdGlvbiBvZiB0aGVzZSBhdHRyaWJ1dGVzLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWFjcGlfc3RhdHVzIGFjcGlfZHNfZ2V0X2J1ZmZlcl9hcmd1bWVudHModW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2MpCi17Ci0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGU7Ci0JYWNwaV9zdGF0dXMgc3RhdHVzOwotCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIoZHNfZ2V0X2J1ZmZlcl9hcmd1bWVudHMsIG9ial9kZXNjKTsKLQotCWlmIChvYmpfZGVzYy0+Y29tbW9uLmZsYWdzICYgQU9QT0JKX0RBVEFfVkFMSUQpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKLQl9Ci0KLQkvKiBHZXQgdGhlIEJ1ZmZlciBub2RlICovCi0KLQlub2RlID0gb2JqX2Rlc2MtPmJ1ZmZlci5ub2RlOwotCWlmICghbm9kZSkgewotCQlBQ1BJX0VSUk9SKChBRV9JTkZPLAotCQkJICAgICJObyBwb2ludGVyIGJhY2sgdG8gTlMgbm9kZSBpbiBidWZmZXIgb2JqICVwIiwKLQkJCSAgICBvYmpfZGVzYykpOwotCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX0lOVEVSTkFMKTsKLQl9Ci0KLQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VYRUMsICJCdWZmZXIgQXJnIEluaXRcbiIpKTsKLQotCS8qIEV4ZWN1dGUgdGhlIEFNTCBjb2RlIGZvciB0aGUgdGVybV9hcmcgYXJndW1lbnRzICovCi0KLQlzdGF0dXMgPSBhY3BpX2RzX2V4ZWN1dGVfYXJndW1lbnRzKG5vZGUsIG5vZGUsCi0JCQkJCSAgIG9ial9kZXNjLT5idWZmZXIuYW1sX2xlbmd0aCwKLQkJCQkJICAgb2JqX2Rlc2MtPmJ1ZmZlci5hbWxfc3RhcnQpOwotCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX2RzX2dldF9wYWNrYWdlX2FyZ3VtZW50cwotICoKLSAqIFBBUkFNRVRFUlM6ICBvYmpfZGVzYyAgICAgICAgLSBBIHZhbGlkIFBhY2thZ2Ugb2JqZWN0Ci0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cy4KLSAqCi0gKiBERVNDUklQVElPTjogR2V0IFBhY2thZ2UgbGVuZ3RoIGFuZCBpbml0aWFsaXplciBieXRlIGxpc3QuICBUaGlzIGltcGxlbWVudHMKLSAqICAgICAgICAgICAgICB0aGUgbGF0ZSBldmFsdWF0aW9uIG9mIHRoZXNlIGF0dHJpYnV0ZXMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotYWNwaV9zdGF0dXMgYWNwaV9kc19nZXRfcGFja2FnZV9hcmd1bWVudHModW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2MpCi17Ci0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGU7Ci0JYWNwaV9zdGF0dXMgc3RhdHVzOwotCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIoZHNfZ2V0X3BhY2thZ2VfYXJndW1lbnRzLCBvYmpfZGVzYyk7Ci0KLQlpZiAob2JqX2Rlc2MtPmNvbW1vbi5mbGFncyAmIEFPUE9CSl9EQVRBX1ZBTElEKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7Ci0JfQotCi0JLyogR2V0IHRoZSBQYWNrYWdlIG5vZGUgKi8KLQotCW5vZGUgPSBvYmpfZGVzYy0+cGFja2FnZS5ub2RlOwotCWlmICghbm9kZSkgewotCQlBQ1BJX0VSUk9SKChBRV9JTkZPLAotCQkJICAgICJObyBwb2ludGVyIGJhY2sgdG8gTlMgbm9kZSBpbiBwYWNrYWdlICVwIiwKLQkJCSAgICBvYmpfZGVzYykpOwotCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX0lOVEVSTkFMKTsKLQl9Ci0KLQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VYRUMsICJQYWNrYWdlIEFyZyBJbml0XG4iKSk7Ci0KLQkvKiBFeGVjdXRlIHRoZSBBTUwgY29kZSBmb3IgdGhlIHRlcm1fYXJnIGFyZ3VtZW50cyAqLwotCi0Jc3RhdHVzID0gYWNwaV9kc19leGVjdXRlX2FyZ3VtZW50cyhub2RlLCBub2RlLAotCQkJCQkgICBvYmpfZGVzYy0+cGFja2FnZS5hbWxfbGVuZ3RoLAotCQkJCQkgICBvYmpfZGVzYy0+cGFja2FnZS5hbWxfc3RhcnQpOwotCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9kc19nZXRfcmVnaW9uX2FyZ3VtZW50cwotICoKLSAqIFBBUkFNRVRFUlM6ICBvYmpfZGVzYyAgICAgICAgLSBBIHZhbGlkIHJlZ2lvbiBvYmplY3QKLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzLgotICoKLSAqIERFU0NSSVBUSU9OOiBHZXQgcmVnaW9uIGFkZHJlc3MgYW5kIGxlbmd0aC4gIFRoaXMgaW1wbGVtZW50cyB0aGUgbGF0ZQotICogICAgICAgICAgICAgIGV2YWx1YXRpb24gb2YgdGhlc2UgcmVnaW9uIGF0dHJpYnV0ZXMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWFjcGlfc3RhdHVzIGFjcGlfZHNfZ2V0X3JlZ2lvbl9hcmd1bWVudHModW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2MpCi17Ci0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGU7Ci0JYWNwaV9zdGF0dXMgc3RhdHVzOwotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKmV4dHJhX2Rlc2M7Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUihkc19nZXRfcmVnaW9uX2FyZ3VtZW50cywgb2JqX2Rlc2MpOwotCi0JaWYgKG9ial9kZXNjLT5yZWdpb24uZmxhZ3MgJiBBT1BPQkpfREFUQV9WQUxJRCkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwotCX0KLQotCWV4dHJhX2Rlc2MgPSBhY3BpX25zX2dldF9zZWNvbmRhcnlfb2JqZWN0KG9ial9kZXNjKTsKLQlpZiAoIWV4dHJhX2Rlc2MpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PVF9FWElTVCk7Ci0JfQotCi0JLyogR2V0IHRoZSBSZWdpb24gbm9kZSAqLwotCi0Jbm9kZSA9IG9ial9kZXNjLT5yZWdpb24ubm9kZTsKLQotCUFDUElfREVCVUdfRVhFQyhhY3BpX3V0X2Rpc3BsYXlfaW5pdF9wYXRobmFtZQotCQkJKEFDUElfVFlQRV9SRUdJT04sIG5vZGUsIE5VTEwpKTsKLQotCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVhFQywgIlslNC40c10gT3BSZWdpb24gQXJnIEluaXQgYXQgQU1MICVwXG4iLAotCQkJICBhY3BpX3V0X2dldF9ub2RlX25hbWUobm9kZSksCi0JCQkgIGV4dHJhX2Rlc2MtPmV4dHJhLmFtbF9zdGFydCkpOwotCi0JLyogRXhlY3V0ZSB0aGUgYXJndW1lbnQgQU1MICovCi0KLQlzdGF0dXMgPSBhY3BpX2RzX2V4ZWN1dGVfYXJndW1lbnRzKG5vZGUsIGFjcGlfbnNfZ2V0X3BhcmVudF9ub2RlKG5vZGUpLAotCQkJCQkgICBleHRyYV9kZXNjLT5leHRyYS5hbWxfbGVuZ3RoLAotCQkJCQkgICBleHRyYV9kZXNjLT5leHRyYS5hbWxfc3RhcnQpOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLQl9Ci0KLQkvKiBWYWxpZGF0ZSB0aGUgcmVnaW9uIGFkZHJlc3MvbGVuZ3RoIHZpYSB0aGUgaG9zdCBPUyAqLwotCi0Jc3RhdHVzID0gYWNwaV9vc192YWxpZGF0ZV9hZGRyZXNzKG9ial9kZXNjLT5yZWdpb24uc3BhY2VfaWQsCi0JCQkJCSAgb2JqX2Rlc2MtPnJlZ2lvbi5hZGRyZXNzLAotCQkJCQkgIChhY3BpX3NpemUpIG9ial9kZXNjLT5yZWdpb24ubGVuZ3RoLAotCQkJCQkgIGFjcGlfdXRfZ2V0X25vZGVfbmFtZShub2RlKSk7Ci0KLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJLyoKLQkJICogSW52YWxpZCBhZGRyZXNzL2xlbmd0aC4gV2Ugd2lsbCBlbWl0IGFuIGVycm9yIG1lc3NhZ2UgYW5kIG1hcmsKLQkJICogdGhlIHJlZ2lvbiBhcyBpbnZhbGlkLCBzbyB0aGF0IGl0IHdpbGwgY2F1c2UgYW4gYWRkaXRpb25hbCBlcnJvciBpZgotCQkgKiBpdCBpcyBldmVyIHVzZWQuIFRoZW4gcmV0dXJuIEFFX09LLgotCQkgKi8KLQkJQUNQSV9FWENFUFRJT04oKEFFX0lORk8sIHN0YXR1cywKLQkJCQkiRHVyaW5nIGFkZHJlc3MgdmFsaWRhdGlvbiBvZiBPcFJlZ2lvbiBbJTQuNHNdIiwKLQkJCQlub2RlLT5uYW1lLmFzY2lpKSk7Ci0JCW9ial9kZXNjLT5jb21tb24uZmxhZ3MgfD0gQU9QT0JKX0lOVkFMSUQ7Ci0JCXN0YXR1cyA9IEFFX09LOwotCX0KLQotCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX2RzX2luaXRpYWxpemVfcmVnaW9uCi0gKgotICogUEFSQU1FVEVSUzogIG9ial9oYW5kbGUgICAgICAtIFJlZ2lvbiBuYW1lc3BhY2Ugbm9kZQotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKLSAqCi0gKiBERVNDUklQVElPTjogRnJvbnQgZW5kIHRvIGV2X2luaXRpYWxpemVfcmVnaW9uCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotYWNwaV9zdGF0dXMgYWNwaV9kc19pbml0aWFsaXplX3JlZ2lvbihhY3BpX2hhbmRsZSBvYmpfaGFuZGxlKQotewotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjOwotCWFjcGlfc3RhdHVzIHN0YXR1czsKLQotCW9ial9kZXNjID0gYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0KG9ial9oYW5kbGUpOwotCi0JLyogTmFtZXNwYWNlIGlzIE5PVCBsb2NrZWQgKi8KLQotCXN0YXR1cyA9IGFjcGlfZXZfaW5pdGlhbGl6ZV9yZWdpb24ob2JqX2Rlc2MsIEZBTFNFKTsKLQlyZXR1cm4gKHN0YXR1cyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfZHNfaW5pdF9idWZmZXJfZmllbGQKLSAqCi0gKiBQQVJBTUVURVJTOiAgYW1sX29wY29kZSAgICAgIC0gY3JlYXRlX3h4eF9maWVsZAotICogICAgICAgICAgICAgIG9ial9kZXNjICAgICAgICAtIGJ1ZmZlcl9maWVsZCBvYmplY3QKLSAqICAgICAgICAgICAgICBidWZmZXJfZGVzYyAgICAgLSBIb3N0IEJ1ZmZlcgotICogICAgICAgICAgICAgIG9mZnNldF9kZXNjICAgICAtIE9mZnNldCBpbnRvIGJ1ZmZlcgotICogICAgICAgICAgICAgIGxlbmd0aF9kZXNjICAgICAtIExlbmd0aCBvZiBmaWVsZCAoQ1JFQVRFX0ZJRUxEX09QIG9ubHkpCi0gKiAgICAgICAgICAgICAgcmVzdWx0X2Rlc2MgICAgIC0gV2hlcmUgdG8gc3RvcmUgdGhlIHJlc3VsdAotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKLSAqCi0gKiBERVNDUklQVElPTjogUGVyZm9ybSBhY3R1YWwgaW5pdGlhbGl6YXRpb24gb2YgYSBidWZmZXIgZmllbGQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgYWNwaV9zdGF0dXMKLWFjcGlfZHNfaW5pdF9idWZmZXJfZmllbGQodTE2IGFtbF9vcGNvZGUsCi0JCQkgIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjLAotCQkJICB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpidWZmZXJfZGVzYywKLQkJCSAgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2Zmc2V0X2Rlc2MsCi0JCQkgIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKmxlbmd0aF9kZXNjLAotCQkJICB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpyZXN1bHRfZGVzYykKLXsKLQl1MzIgb2Zmc2V0OwotCXUzMiBiaXRfb2Zmc2V0OwotCXUzMiBiaXRfY291bnQ7Ci0JdTggZmllbGRfZmxhZ3M7Ci0JYWNwaV9zdGF0dXMgc3RhdHVzOwotCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIoZHNfaW5pdF9idWZmZXJfZmllbGQsIG9ial9kZXNjKTsKLQotCS8qIEhvc3Qgb2JqZWN0IG11c3QgYmUgYSBCdWZmZXIgKi8KLQotCWlmIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRShidWZmZXJfZGVzYykgIT0gQUNQSV9UWVBFX0JVRkZFUikgewotCQlBQ1BJX0VSUk9SKChBRV9JTkZPLAotCQkJICAgICJUYXJnZXQgb2YgQ3JlYXRlIEZpZWxkIGlzIG5vdCBhIEJ1ZmZlciBvYmplY3QgLSAlcyIsCi0JCQkgICAgYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZShidWZmZXJfZGVzYykpKTsKLQotCQlzdGF0dXMgPSBBRV9BTUxfT1BFUkFORF9UWVBFOwotCQlnb3RvIGNsZWFudXA7Ci0JfQotCi0JLyoKLQkgKiBUaGUgbGFzdCBwYXJhbWV0ZXIgdG8gYWxsIG9mIHRoZXNlIG9wY29kZXMgKHJlc3VsdF9kZXNjKSBzdGFydGVkCi0JICogb3V0IGFzIGEgbmFtZV9zdHJpbmcsIGFuZCBzaG91bGQgdGhlcmVmb3JlIG5vdyBiZSBhIE5TIG5vZGUKLQkgKiBhZnRlciByZXNvbHV0aW9uIGluIGFjcGlfZXhfcmVzb2x2ZV9vcGVyYW5kcygpLgotCSAqLwotCWlmIChBQ1BJX0dFVF9ERVNDUklQVE9SX1RZUEUocmVzdWx0X2Rlc2MpICE9IEFDUElfREVTQ19UWVBFX05BTUVEKSB7Ci0JCUFDUElfRVJST1IoKEFFX0lORk8sCi0JCQkgICAgIiglcykgZGVzdGluYXRpb24gbm90IGEgTlMgTm9kZSBbJXNdIiwKLQkJCSAgICBhY3BpX3BzX2dldF9vcGNvZGVfbmFtZShhbWxfb3Bjb2RlKSwKLQkJCSAgICBhY3BpX3V0X2dldF9kZXNjcmlwdG9yX25hbWUocmVzdWx0X2Rlc2MpKSk7Ci0KLQkJc3RhdHVzID0gQUVfQU1MX09QRVJBTkRfVFlQRTsKLQkJZ290byBjbGVhbnVwOwotCX0KLQotCW9mZnNldCA9ICh1MzIpIG9mZnNldF9kZXNjLT5pbnRlZ2VyLnZhbHVlOwotCi0JLyoKLQkgKiBTZXR1cCB0aGUgQml0IG9mZnNldHMgYW5kIGNvdW50cywgYWNjb3JkaW5nIHRvIHRoZSBvcGNvZGUKLQkgKi8KLQlzd2l0Y2ggKGFtbF9vcGNvZGUpIHsKLQljYXNlIEFNTF9DUkVBVEVfRklFTERfT1A6Ci0KLQkJLyogT2Zmc2V0IGlzIGluIGJpdHMsIGNvdW50IGlzIGluIGJpdHMgKi8KLQotCQlmaWVsZF9mbGFncyA9IEFNTF9GSUVMRF9BQ0NFU1NfQllURTsKLQkJYml0X29mZnNldCA9IG9mZnNldDsKLQkJYml0X2NvdW50ID0gKHUzMikgbGVuZ3RoX2Rlc2MtPmludGVnZXIudmFsdWU7Ci0KLQkJLyogTXVzdCBoYXZlIGEgdmFsaWQgKD4wKSBiaXQgY291bnQgKi8KLQotCQlpZiAoYml0X2NvdW50ID09IDApIHsKLQkJCUFDUElfRVJST1IoKEFFX0lORk8sCi0JCQkJICAgICJBdHRlbXB0IHRvIENyZWF0ZUZpZWxkIG9mIGxlbmd0aCB6ZXJvIikpOwotCQkJc3RhdHVzID0gQUVfQU1MX09QRVJBTkRfVkFMVUU7Ci0JCQlnb3RvIGNsZWFudXA7Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIEFNTF9DUkVBVEVfQklUX0ZJRUxEX09QOgotCi0JCS8qIE9mZnNldCBpcyBpbiBiaXRzLCBGaWVsZCBpcyBvbmUgYml0ICovCi0KLQkJYml0X29mZnNldCA9IG9mZnNldDsKLQkJYml0X2NvdW50ID0gMTsKLQkJZmllbGRfZmxhZ3MgPSBBTUxfRklFTERfQUNDRVNTX0JZVEU7Ci0JCWJyZWFrOwotCi0JY2FzZSBBTUxfQ1JFQVRFX0JZVEVfRklFTERfT1A6Ci0KLQkJLyogT2Zmc2V0IGlzIGluIGJ5dGVzLCBmaWVsZCBpcyBvbmUgYnl0ZSAqLwotCi0JCWJpdF9vZmZzZXQgPSA4ICogb2Zmc2V0OwotCQliaXRfY291bnQgPSA4OwotCQlmaWVsZF9mbGFncyA9IEFNTF9GSUVMRF9BQ0NFU1NfQllURTsKLQkJYnJlYWs7Ci0KLQljYXNlIEFNTF9DUkVBVEVfV09SRF9GSUVMRF9PUDoKLQotCQkvKiBPZmZzZXQgaXMgaW4gYnl0ZXMsIGZpZWxkIGlzIG9uZSB3b3JkICovCi0KLQkJYml0X29mZnNldCA9IDggKiBvZmZzZXQ7Ci0JCWJpdF9jb3VudCA9IDE2OwotCQlmaWVsZF9mbGFncyA9IEFNTF9GSUVMRF9BQ0NFU1NfV09SRDsKLQkJYnJlYWs7Ci0KLQljYXNlIEFNTF9DUkVBVEVfRFdPUkRfRklFTERfT1A6Ci0KLQkJLyogT2Zmc2V0IGlzIGluIGJ5dGVzLCBmaWVsZCBpcyBvbmUgZHdvcmQgKi8KLQotCQliaXRfb2Zmc2V0ID0gOCAqIG9mZnNldDsKLQkJYml0X2NvdW50ID0gMzI7Ci0JCWZpZWxkX2ZsYWdzID0gQU1MX0ZJRUxEX0FDQ0VTU19EV09SRDsKLQkJYnJlYWs7Ci0KLQljYXNlIEFNTF9DUkVBVEVfUVdPUkRfRklFTERfT1A6Ci0KLQkJLyogT2Zmc2V0IGlzIGluIGJ5dGVzLCBmaWVsZCBpcyBvbmUgcXdvcmQgKi8KLQotCQliaXRfb2Zmc2V0ID0gOCAqIG9mZnNldDsKLQkJYml0X2NvdW50ID0gNjQ7Ci0JCWZpZWxkX2ZsYWdzID0gQU1MX0ZJRUxEX0FDQ0VTU19RV09SRDsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCi0JCUFDUElfRVJST1IoKEFFX0lORk8sCi0JCQkgICAgIlVua25vd24gZmllbGQgY3JlYXRpb24gb3Bjb2RlICUwMngiLCBhbWxfb3Bjb2RlKSk7Ci0JCXN0YXR1cyA9IEFFX0FNTF9CQURfT1BDT0RFOwotCQlnb3RvIGNsZWFudXA7Ci0JfQotCi0JLyogRW50aXJlIGZpZWxkIG11c3QgZml0IHdpdGhpbiB0aGUgY3VycmVudCBsZW5ndGggb2YgdGhlIGJ1ZmZlciAqLwotCi0JaWYgKChiaXRfb2Zmc2V0ICsgYml0X2NvdW50KSA+ICg4ICogKHUzMikgYnVmZmVyX2Rlc2MtPmJ1ZmZlci5sZW5ndGgpKSB7Ci0JCUFDUElfRVJST1IoKEFFX0lORk8sCi0JCQkgICAgIkZpZWxkIFslNC40c10gYXQgJWQgZXhjZWVkcyBCdWZmZXIgWyU0LjRzXSBzaXplICVkIChiaXRzKSIsCi0JCQkgICAgYWNwaV91dF9nZXRfbm9kZV9uYW1lKHJlc3VsdF9kZXNjKSwKLQkJCSAgICBiaXRfb2Zmc2V0ICsgYml0X2NvdW50LAotCQkJICAgIGFjcGlfdXRfZ2V0X25vZGVfbmFtZShidWZmZXJfZGVzYy0+YnVmZmVyLm5vZGUpLAotCQkJICAgIDggKiAodTMyKSBidWZmZXJfZGVzYy0+YnVmZmVyLmxlbmd0aCkpOwotCQlzdGF0dXMgPSBBRV9BTUxfQlVGRkVSX0xJTUlUOwotCQlnb3RvIGNsZWFudXA7Ci0JfQotCi0JLyoKLQkgKiBJbml0aWFsaXplIGFyZWFzIG9mIHRoZSBmaWVsZCBvYmplY3QgdGhhdCBhcmUgY29tbW9uIHRvIGFsbCBmaWVsZHMKLQkgKiBGb3IgZmllbGRfZmxhZ3MsIHVzZSBMT0NLX1JVTEUgPSAwIChOT19MT0NLKSwKLQkgKiBVUERBVEVfUlVMRSA9IDAgKFVQREFURV9QUkVTRVJWRSkKLQkgKi8KLQlzdGF0dXMgPSBhY3BpX2V4X3ByZXBfY29tbW9uX2ZpZWxkX29iamVjdChvYmpfZGVzYywgZmllbGRfZmxhZ3MsIDAsCi0JCQkJCQkgIGJpdF9vZmZzZXQsIGJpdF9jb3VudCk7Ci0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCWdvdG8gY2xlYW51cDsKLQl9Ci0KLQlvYmpfZGVzYy0+YnVmZmVyX2ZpZWxkLmJ1ZmZlcl9vYmogPSBidWZmZXJfZGVzYzsKLQotCS8qIFJlZmVyZW5jZSBjb3VudCBmb3IgYnVmZmVyX2Rlc2MgaW5oZXJpdHMgb2JqX2Rlc2MgY291bnQgKi8KLQotCWJ1ZmZlcl9kZXNjLT5jb21tb24ucmVmZXJlbmNlX2NvdW50ID0gKHUxNikKLQkgICAgKGJ1ZmZlcl9kZXNjLT5jb21tb24ucmVmZXJlbmNlX2NvdW50ICsKLQkgICAgIG9ial9kZXNjLT5jb21tb24ucmVmZXJlbmNlX2NvdW50KTsKLQotICAgICAgY2xlYW51cDoKLQotCS8qIEFsd2F5cyBkZWxldGUgdGhlIG9wZXJhbmRzICovCi0KLQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2Uob2Zmc2V0X2Rlc2MpOwotCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZShidWZmZXJfZGVzYyk7Ci0KLQlpZiAoYW1sX29wY29kZSA9PSBBTUxfQ1JFQVRFX0ZJRUxEX09QKSB7Ci0JCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZShsZW5ndGhfZGVzYyk7Ci0JfQotCi0JLyogT24gZmFpbHVyZSwgZGVsZXRlIHRoZSByZXN1bHQgZGVzY3JpcHRvciAqLwotCi0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZShyZXN1bHRfZGVzYyk7CS8qIFJlc3VsdCBkZXNjcmlwdG9yICovCi0JfSBlbHNlIHsKLQkJLyogTm93IHRoZSBhZGRyZXNzIGFuZCBsZW5ndGggYXJlIHZhbGlkIGZvciB0aGlzIGJ1ZmZlcl9maWVsZCAqLwotCi0JCW9ial9kZXNjLT5idWZmZXJfZmllbGQuZmxhZ3MgfD0gQU9QT0JKX0RBVEFfVkFMSUQ7Ci0JfQotCi0JcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfZHNfZXZhbF9idWZmZXJfZmllbGRfb3BlcmFuZHMKLSAqCi0gKiBQQVJBTUVURVJTOiAgd2Fsa19zdGF0ZSAgICAgIC0gQ3VycmVudCB3YWxrCi0gKiAgICAgICAgICAgICAgT3AgICAgICAgICAgICAgIC0gQSB2YWxpZCBidWZmZXJfZmllbGQgT3Agb2JqZWN0Ci0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cwotICoKLSAqIERFU0NSSVBUSU9OOiBHZXQgYnVmZmVyX2ZpZWxkIEJ1ZmZlciBhbmQgSW5kZXgKLSAqICAgICAgICAgICAgICBDYWxsZWQgZnJvbSBhY3BpX2RzX2V4ZWNfZW5kX29wIGR1cmluZyBidWZmZXJfZmllbGQgcGFyc2UgdHJlZSB3YWxrCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotYWNwaV9zdGF0dXMKLWFjcGlfZHNfZXZhbF9idWZmZXJfZmllbGRfb3BlcmFuZHMoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSwKLQkJCQkgICB1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqb3ApCi17Ci0JYWNwaV9zdGF0dXMgc3RhdHVzOwotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjOwotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlOwotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpuZXh0X29wOwotCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIoZHNfZXZhbF9idWZmZXJfZmllbGRfb3BlcmFuZHMsIG9wKTsKLQotCS8qCi0JICogVGhpcyBpcyB3aGVyZSB3ZSBldmFsdWF0ZSB0aGUgYWRkcmVzcyBhbmQgbGVuZ3RoIGZpZWxkcyBvZiB0aGUKLQkgKiBjcmVhdGVfeHh4X2ZpZWxkIGRlY2xhcmF0aW9uCi0JICovCi0Jbm9kZSA9IG9wLT5jb21tb24ubm9kZTsKLQotCS8qIG5leHRfb3AgcG9pbnRzIHRvIHRoZSBvcCB0aGF0IGhvbGRzIHRoZSBCdWZmZXIgKi8KLQotCW5leHRfb3AgPSBvcC0+Y29tbW9uLnZhbHVlLmFyZzsKLQotCS8qIEV2YWx1YXRlL2NyZWF0ZSB0aGUgYWRkcmVzcyBhbmQgbGVuZ3RoIG9wZXJhbmRzICovCi0KLQlzdGF0dXMgPSBhY3BpX2RzX2NyZWF0ZV9vcGVyYW5kcyh3YWxrX3N0YXRlLCBuZXh0X29wKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci0JfQotCi0Jb2JqX2Rlc2MgPSBhY3BpX25zX2dldF9hdHRhY2hlZF9vYmplY3Qobm9kZSk7Ci0JaWYgKCFvYmpfZGVzYykgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9UX0VYSVNUKTsKLQl9Ci0KLQkvKiBSZXNvbHZlIHRoZSBvcGVyYW5kcyAqLwotCi0Jc3RhdHVzID0gYWNwaV9leF9yZXNvbHZlX29wZXJhbmRzKG9wLT5jb21tb24uYW1sX29wY29kZSwKLQkJCQkJICBBQ1BJX1dBTEtfT1BFUkFORFMsIHdhbGtfc3RhdGUpOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlBQ1BJX0VSUk9SKChBRV9JTkZPLCAiKCVzKSBiYWQgb3BlcmFuZChzKSAoJVgpIiwKLQkJCSAgICBhY3BpX3BzX2dldF9vcGNvZGVfbmFtZShvcC0+Y29tbW9uLmFtbF9vcGNvZGUpLAotCQkJICAgIHN0YXR1cykpOwotCi0JCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotCX0KLQotCS8qIEluaXRpYWxpemUgdGhlIEJ1ZmZlciBGaWVsZCAqLwotCi0JaWYgKG9wLT5jb21tb24uYW1sX29wY29kZSA9PSBBTUxfQ1JFQVRFX0ZJRUxEX09QKSB7Ci0KLQkJLyogTk9URTogU2xpZ2h0bHkgZGlmZmVyZW50IG9wZXJhbmRzIGZvciB0aGlzIG9wY29kZSAqLwotCi0JCXN0YXR1cyA9Ci0JCSAgICBhY3BpX2RzX2luaXRfYnVmZmVyX2ZpZWxkKG9wLT5jb21tb24uYW1sX29wY29kZSwgb2JqX2Rlc2MsCi0JCQkJCSAgICAgIHdhbGtfc3RhdGUtPm9wZXJhbmRzWzBdLAotCQkJCQkgICAgICB3YWxrX3N0YXRlLT5vcGVyYW5kc1sxXSwKLQkJCQkJICAgICAgd2Fsa19zdGF0ZS0+b3BlcmFuZHNbMl0sCi0JCQkJCSAgICAgIHdhbGtfc3RhdGUtPm9wZXJhbmRzWzNdKTsKLQl9IGVsc2UgewotCQkvKiBBbGwgb3RoZXIsIGNyZWF0ZV94eHhfZmllbGQgb3Bjb2RlcyAqLwotCi0JCXN0YXR1cyA9Ci0JCSAgICBhY3BpX2RzX2luaXRfYnVmZmVyX2ZpZWxkKG9wLT5jb21tb24uYW1sX29wY29kZSwgb2JqX2Rlc2MsCi0JCQkJCSAgICAgIHdhbGtfc3RhdGUtPm9wZXJhbmRzWzBdLAotCQkJCQkgICAgICB3YWxrX3N0YXRlLT5vcGVyYW5kc1sxXSwgTlVMTCwKLQkJCQkJICAgICAgd2Fsa19zdGF0ZS0+b3BlcmFuZHNbMl0pOwotCX0KLQotCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX2RzX2V2YWxfcmVnaW9uX29wZXJhbmRzCi0gKgotICogUEFSQU1FVEVSUzogIHdhbGtfc3RhdGUgICAgICAtIEN1cnJlbnQgd2FsawotICogICAgICAgICAgICAgIE9wICAgICAgICAgICAgICAtIEEgdmFsaWQgcmVnaW9uIE9wIG9iamVjdAotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKLSAqCi0gKiBERVNDUklQVElPTjogR2V0IHJlZ2lvbiBhZGRyZXNzIGFuZCBsZW5ndGgKLSAqICAgICAgICAgICAgICBDYWxsZWQgZnJvbSBhY3BpX2RzX2V4ZWNfZW5kX29wIGR1cmluZyBvcF9yZWdpb24gcGFyc2UgdHJlZSB3YWxrCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotYWNwaV9zdGF0dXMKLWFjcGlfZHNfZXZhbF9yZWdpb25fb3BlcmFuZHMoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSwKLQkJCSAgICAgdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKm9wKQotewotCWFjcGlfc3RhdHVzIHN0YXR1czsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYzsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvcGVyYW5kX2Rlc2M7Ci0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGU7Ci0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKm5leHRfb3A7Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUihkc19ldmFsX3JlZ2lvbl9vcGVyYW5kcywgb3ApOwotCi0JLyoKLQkgKiBUaGlzIGlzIHdoZXJlIHdlIGV2YWx1YXRlIHRoZSBhZGRyZXNzIGFuZCBsZW5ndGggZmllbGRzIG9mIHRoZQotCSAqIG9wX3JlZ2lvbiBkZWNsYXJhdGlvbgotCSAqLwotCW5vZGUgPSBvcC0+Y29tbW9uLm5vZGU7Ci0KLQkvKiBuZXh0X29wIHBvaW50cyB0byB0aGUgb3AgdGhhdCBob2xkcyB0aGUgc3BhY2VfaUQgKi8KLQotCW5leHRfb3AgPSBvcC0+Y29tbW9uLnZhbHVlLmFyZzsKLQotCS8qIG5leHRfb3AgcG9pbnRzIHRvIGFkZHJlc3Mgb3AgKi8KLQotCW5leHRfb3AgPSBuZXh0X29wLT5jb21tb24ubmV4dDsKLQotCS8qIEV2YWx1YXRlL2NyZWF0ZSB0aGUgYWRkcmVzcyBhbmQgbGVuZ3RoIG9wZXJhbmRzICovCi0KLQlzdGF0dXMgPSBhY3BpX2RzX2NyZWF0ZV9vcGVyYW5kcyh3YWxrX3N0YXRlLCBuZXh0X29wKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci0JfQotCi0JLyogUmVzb2x2ZSB0aGUgbGVuZ3RoIGFuZCBhZGRyZXNzIG9wZXJhbmRzIHRvIG51bWJlcnMgKi8KLQotCXN0YXR1cyA9IGFjcGlfZXhfcmVzb2x2ZV9vcGVyYW5kcyhvcC0+Y29tbW9uLmFtbF9vcGNvZGUsCi0JCQkJCSAgQUNQSV9XQUxLX09QRVJBTkRTLCB3YWxrX3N0YXRlKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci0JfQotCi0Jb2JqX2Rlc2MgPSBhY3BpX25zX2dldF9hdHRhY2hlZF9vYmplY3Qobm9kZSk7Ci0JaWYgKCFvYmpfZGVzYykgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9UX0VYSVNUKTsKLQl9Ci0KLQkvKgotCSAqIEdldCB0aGUgbGVuZ3RoIG9wZXJhbmQgYW5kIHNhdmUgaXQKLQkgKiAoYXQgVG9wIG9mIHN0YWNrKQotCSAqLwotCW9wZXJhbmRfZGVzYyA9IHdhbGtfc3RhdGUtPm9wZXJhbmRzW3dhbGtfc3RhdGUtPm51bV9vcGVyYW5kcyAtIDFdOwotCi0Jb2JqX2Rlc2MtPnJlZ2lvbi5sZW5ndGggPSAodTMyKSBvcGVyYW5kX2Rlc2MtPmludGVnZXIudmFsdWU7Ci0JYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKG9wZXJhbmRfZGVzYyk7Ci0KLQkvKgotCSAqIEdldCB0aGUgYWRkcmVzcyBhbmQgc2F2ZSBpdAotCSAqIChhdCB0b3Agb2Ygc3RhY2sgLSAxKQotCSAqLwotCW9wZXJhbmRfZGVzYyA9IHdhbGtfc3RhdGUtPm9wZXJhbmRzW3dhbGtfc3RhdGUtPm51bV9vcGVyYW5kcyAtIDJdOwotCi0Jb2JqX2Rlc2MtPnJlZ2lvbi5hZGRyZXNzID0gKGFjcGlfcGh5c2ljYWxfYWRkcmVzcykKLQkgICAgb3BlcmFuZF9kZXNjLT5pbnRlZ2VyLnZhbHVlOwotCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZShvcGVyYW5kX2Rlc2MpOwotCi0JQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FWEVDLCAiUmduT2JqICVwIEFkZHIgJTguOFglOC44WCBMZW4gJVhcbiIsCi0JCQkgIG9ial9kZXNjLAotCQkJICBBQ1BJX0ZPUk1BVF9OQVRJVkVfVUlOVChvYmpfZGVzYy0+cmVnaW9uLmFkZHJlc3MpLAotCQkJICBvYmpfZGVzYy0+cmVnaW9uLmxlbmd0aCkpOwotCi0JLyogTm93IHRoZSBhZGRyZXNzIGFuZCBsZW5ndGggYXJlIHZhbGlkIGZvciB0aGlzIG9wcmVnaW9uICovCi0KLQlvYmpfZGVzYy0+cmVnaW9uLmZsYWdzIHw9IEFPUE9CSl9EQVRBX1ZBTElEOwotCi0JcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfZHNfZXZhbF90YWJsZV9yZWdpb25fb3BlcmFuZHMKLSAqCi0gKiBQQVJBTUVURVJTOiAgd2Fsa19zdGF0ZSAgICAgIC0gQ3VycmVudCB3YWxrCi0gKiAgICAgICAgICAgICAgT3AgICAgICAgICAgICAgIC0gQSB2YWxpZCByZWdpb24gT3Agb2JqZWN0Ci0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cwotICoKLSAqIERFU0NSSVBUSU9OOiBHZXQgcmVnaW9uIGFkZHJlc3MgYW5kIGxlbmd0aAotICogICAgICAgICAgICAgIENhbGxlZCBmcm9tIGFjcGlfZHNfZXhlY19lbmRfb3AgZHVyaW5nIGRhdGFfdGFibGVfcmVnaW9uIHBhcnNlIHRyZWUgd2FsawotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWFjcGlfc3RhdHVzCi1hY3BpX2RzX2V2YWxfdGFibGVfcmVnaW9uX29wZXJhbmRzKHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUsCi0JCQkJICAgdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKm9wKQotewotCWFjcGlfc3RhdHVzIHN0YXR1czsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYzsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICoqb3BlcmFuZDsKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZTsKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqbmV4dF9vcDsKLQl1MzIgdGFibGVfaW5kZXg7Ci0Jc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICp0YWJsZTsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKGRzX2V2YWxfdGFibGVfcmVnaW9uX29wZXJhbmRzLCBvcCk7Ci0KLQkvKgotCSAqIFRoaXMgaXMgd2hlcmUgd2UgZXZhbHVhdGUgdGhlIHNpZ25hdHVyZV9zdHJpbmcgYW5kIG9lbV9pRFN0cmluZwotCSAqIGFuZCBvZW1fdGFibGVfaURTdHJpbmcgb2YgdGhlIGRhdGFfdGFibGVfcmVnaW9uIGRlY2xhcmF0aW9uCi0JICovCi0Jbm9kZSA9IG9wLT5jb21tb24ubm9kZTsKLQotCS8qIG5leHRfb3AgcG9pbnRzIHRvIHNpZ25hdHVyZV9zdHJpbmcgb3AgKi8KLQotCW5leHRfb3AgPSBvcC0+Y29tbW9uLnZhbHVlLmFyZzsKLQotCS8qCi0JICogRXZhbHVhdGUvY3JlYXRlIHRoZSBzaWduYXR1cmVfc3RyaW5nIGFuZCBvZW1faURTdHJpbmcKLQkgKiBhbmQgb2VtX3RhYmxlX2lEU3RyaW5nIG9wZXJhbmRzCi0JICovCi0Jc3RhdHVzID0gYWNwaV9kc19jcmVhdGVfb3BlcmFuZHMod2Fsa19zdGF0ZSwgbmV4dF9vcCk7Ci0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotCX0KLQotCS8qCi0JICogUmVzb2x2ZSB0aGUgc2lnbmF0dXJlX3N0cmluZyBhbmQgb2VtX2lEU3RyaW5nCi0JICogYW5kIG9lbV90YWJsZV9pRFN0cmluZyBvcGVyYW5kcwotCSAqLwotCXN0YXR1cyA9IGFjcGlfZXhfcmVzb2x2ZV9vcGVyYW5kcyhvcC0+Y29tbW9uLmFtbF9vcGNvZGUsCi0JCQkJCSAgQUNQSV9XQUxLX09QRVJBTkRTLCB3YWxrX3N0YXRlKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci0JfQotCi0Jb3BlcmFuZCA9ICZ3YWxrX3N0YXRlLT5vcGVyYW5kc1swXTsKLQotCS8qIEZpbmQgdGhlIEFDUEkgdGFibGUgKi8KLQotCXN0YXR1cyA9IGFjcGlfdGJfZmluZF90YWJsZShvcGVyYW5kWzBdLT5zdHJpbmcucG9pbnRlciwKLQkJCQkgICAgb3BlcmFuZFsxXS0+c3RyaW5nLnBvaW50ZXIsCi0JCQkJICAgIG9wZXJhbmRbMl0tPnN0cmluZy5wb2ludGVyLCAmdGFibGVfaW5kZXgpOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLQl9Ci0KLQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2Uob3BlcmFuZFswXSk7Ci0JYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKG9wZXJhbmRbMV0pOwotCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZShvcGVyYW5kWzJdKTsKLQotCXN0YXR1cyA9IGFjcGlfZ2V0X3RhYmxlX2J5X2luZGV4KHRhYmxlX2luZGV4LCAmdGFibGUpOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLQl9Ci0KLQlvYmpfZGVzYyA9IGFjcGlfbnNfZ2V0X2F0dGFjaGVkX29iamVjdChub2RlKTsKLQlpZiAoIW9ial9kZXNjKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT1RfRVhJU1QpOwotCX0KLQotCW9ial9kZXNjLT5yZWdpb24uYWRkcmVzcyA9Ci0JICAgIChhY3BpX3BoeXNpY2FsX2FkZHJlc3MpIEFDUElfVE9fSU5URUdFUih0YWJsZSk7Ci0Jb2JqX2Rlc2MtPnJlZ2lvbi5sZW5ndGggPSB0YWJsZS0+bGVuZ3RoOwotCi0JQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FWEVDLCAiUmduT2JqICVwIEFkZHIgJTguOFglOC44WCBMZW4gJVhcbiIsCi0JCQkgIG9ial9kZXNjLAotCQkJICBBQ1BJX0ZPUk1BVF9OQVRJVkVfVUlOVChvYmpfZGVzYy0+cmVnaW9uLmFkZHJlc3MpLAotCQkJICBvYmpfZGVzYy0+cmVnaW9uLmxlbmd0aCkpOwotCi0JLyogTm93IHRoZSBhZGRyZXNzIGFuZCBsZW5ndGggYXJlIHZhbGlkIGZvciB0aGlzIG9wcmVnaW9uICovCi0KLQlvYmpfZGVzYy0+cmVnaW9uLmZsYWdzIHw9IEFPUE9CSl9EQVRBX1ZBTElEOwotCi0JcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfZHNfZXZhbF9kYXRhX29iamVjdF9vcGVyYW5kcwotICoKLSAqIFBBUkFNRVRFUlM6ICB3YWxrX3N0YXRlICAgICAgLSBDdXJyZW50IHdhbGsKLSAqICAgICAgICAgICAgICBPcCAgICAgICAgICAgICAgLSBBIHZhbGlkIGRhdGFfb2JqZWN0IE9wIG9iamVjdAotICogICAgICAgICAgICAgIG9ial9kZXNjICAgICAgICAtIGRhdGFfb2JqZWN0Ci0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cwotICoKLSAqIERFU0NSSVBUSU9OOiBHZXQgdGhlIG9wZXJhbmRzIGFuZCBjb21wbGV0ZSB0aGUgZm9sbG93aW5nIGRhdGEgb2JqZWN0IHR5cGVzOgotICogICAgICAgICAgICAgIEJ1ZmZlciwgUGFja2FnZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1hY3BpX3N0YXR1cwotYWNwaV9kc19ldmFsX2RhdGFfb2JqZWN0X29wZXJhbmRzKHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUsCi0JCQkJICB1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqb3AsCi0JCQkJICB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYykKLXsKLQlhY3BpX3N0YXR1cyBzdGF0dXM7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqYXJnX2Rlc2M7Ci0JdTMyIGxlbmd0aDsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UoZHNfZXZhbF9kYXRhX29iamVjdF9vcGVyYW5kcyk7Ci0KLQkvKiBUaGUgZmlyc3Qgb3BlcmFuZCAoZm9yIGFsbCBvZiB0aGVzZSBkYXRhIG9iamVjdHMpIGlzIHRoZSBsZW5ndGggKi8KLQotCS8qCi0JICogU2V0IHByb3BlciBpbmRleCBpbnRvIG9wZXJhbmQgc3RhY2sgZm9yIGFjcGlfZHNfb2JqX3N0YWNrX3B1c2gKLQkgKiBpbnZva2VkIGluc2lkZSBhY3BpX2RzX2NyZWF0ZV9vcGVyYW5kLgotCSAqLwotCXdhbGtfc3RhdGUtPm9wZXJhbmRfaW5kZXggPSB3YWxrX3N0YXRlLT5udW1fb3BlcmFuZHM7Ci0KLQlzdGF0dXMgPSBhY3BpX2RzX2NyZWF0ZV9vcGVyYW5kKHdhbGtfc3RhdGUsIG9wLT5jb21tb24udmFsdWUuYXJnLCAxKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci0JfQotCi0Jc3RhdHVzID0gYWNwaV9leF9yZXNvbHZlX29wZXJhbmRzKHdhbGtfc3RhdGUtPm9wY29kZSwKLQkJCQkJICAmKHdhbGtfc3RhdGUtPgotCQkJCQkgICAgb3BlcmFuZHNbd2Fsa19zdGF0ZS0+bnVtX29wZXJhbmRzIC0KLQkJCQkJCSAgICAgMV0pLCB3YWxrX3N0YXRlKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci0JfQotCi0JLyogRXh0cmFjdCBsZW5ndGggb3BlcmFuZCAqLwotCi0JYXJnX2Rlc2MgPSB3YWxrX3N0YXRlLT5vcGVyYW5kc1t3YWxrX3N0YXRlLT5udW1fb3BlcmFuZHMgLSAxXTsKLQlsZW5ndGggPSAodTMyKSBhcmdfZGVzYy0+aW50ZWdlci52YWx1ZTsKLQotCS8qIENsZWFudXAgZm9yIGxlbmd0aCBvcGVyYW5kICovCi0KLQlzdGF0dXMgPSBhY3BpX2RzX29ial9zdGFja19wb3AoMSwgd2Fsa19zdGF0ZSk7Ci0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotCX0KLQotCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZShhcmdfZGVzYyk7Ci0KLQkvKgotCSAqIENyZWF0ZSB0aGUgYWN0dWFsIGRhdGEgb2JqZWN0Ci0JICovCi0Jc3dpdGNoIChvcC0+Y29tbW9uLmFtbF9vcGNvZGUpIHsKLQljYXNlIEFNTF9CVUZGRVJfT1A6Ci0KLQkJc3RhdHVzID0KLQkJICAgIGFjcGlfZHNfYnVpbGRfaW50ZXJuYWxfYnVmZmVyX29iaih3YWxrX3N0YXRlLCBvcCwgbGVuZ3RoLAotCQkJCQkJICAgICAgJm9ial9kZXNjKTsKLQkJYnJlYWs7Ci0KLQljYXNlIEFNTF9QQUNLQUdFX09QOgotCWNhc2UgQU1MX1ZBUl9QQUNLQUdFX09QOgotCi0JCXN0YXR1cyA9Ci0JCSAgICBhY3BpX2RzX2J1aWxkX2ludGVybmFsX3BhY2thZ2Vfb2JqKHdhbGtfc3RhdGUsIG9wLCBsZW5ndGgsCi0JCQkJCQkgICAgICAgJm9ial9kZXNjKTsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX0JBRF9PUENPREUpOwotCX0KLQotCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkgewotCQkvKgotCQkgKiBSZXR1cm4gdGhlIG9iamVjdCBpbiB0aGUgd2Fsa19zdGF0ZSwgdW5sZXNzIHRoZSBwYXJlbnQgaXMgYSBwYWNrYWdlIC0KLQkJICogaW4gdGhpcyBjYXNlLCB0aGUgcmV0dXJuIG9iamVjdCB3aWxsIGJlIHN0b3JlZCBpbiB0aGUgcGFyc2UgdHJlZQotCQkgKiBmb3IgdGhlIHBhY2thZ2UuCi0JCSAqLwotCQlpZiAoKCFvcC0+Y29tbW9uLnBhcmVudCkgfHwKLQkJICAgICgob3AtPmNvbW1vbi5wYXJlbnQtPmNvbW1vbi5hbWxfb3Bjb2RlICE9IEFNTF9QQUNLQUdFX09QKSAmJgotCQkgICAgIChvcC0+Y29tbW9uLnBhcmVudC0+Y29tbW9uLmFtbF9vcGNvZGUgIT0KLQkJICAgICAgQU1MX1ZBUl9QQUNLQUdFX09QKQotCQkgICAgICYmIChvcC0+Y29tbW9uLnBhcmVudC0+Y29tbW9uLmFtbF9vcGNvZGUgIT0gQU1MX05BTUVfT1ApKSkgewotCQkJd2Fsa19zdGF0ZS0+cmVzdWx0X29iaiA9IG9ial9kZXNjOwotCQl9Ci0JfQotCi0JcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfZHNfZXZhbF9iYW5rX2ZpZWxkX29wZXJhbmRzCi0gKgotICogUEFSQU1FVEVSUzogIHdhbGtfc3RhdGUgICAgICAtIEN1cnJlbnQgd2FsawotICogICAgICAgICAgICAgIE9wICAgICAgICAgICAgICAtIEEgdmFsaWQgYmFua19maWVsZCBPcCBvYmplY3QKLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IEdldCBiYW5rX2ZpZWxkIGJhbmtfdmFsdWUKLSAqICAgICAgICAgICAgICBDYWxsZWQgZnJvbSBhY3BpX2RzX2V4ZWNfZW5kX29wIGR1cmluZyBiYW5rX2ZpZWxkIHBhcnNlIHRyZWUgd2FsawotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWFjcGlfc3RhdHVzCi1hY3BpX2RzX2V2YWxfYmFua19maWVsZF9vcGVyYW5kcyhzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlLAotCQkJCSB1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqb3ApCi17Ci0JYWNwaV9zdGF0dXMgc3RhdHVzOwotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjOwotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9wZXJhbmRfZGVzYzsKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZTsKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqbmV4dF9vcDsKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqYXJnOwotCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIoZHNfZXZhbF9iYW5rX2ZpZWxkX29wZXJhbmRzLCBvcCk7Ci0KLQkvKgotCSAqIFRoaXMgaXMgd2hlcmUgd2UgZXZhbHVhdGUgdGhlIGJhbmtfdmFsdWUgZmllbGQgb2YgdGhlCi0JICogYmFua19maWVsZCBkZWNsYXJhdGlvbgotCSAqLwotCi0JLyogbmV4dF9vcCBwb2ludHMgdG8gdGhlIG9wIHRoYXQgaG9sZHMgdGhlIFJlZ2lvbiAqLwotCi0JbmV4dF9vcCA9IG9wLT5jb21tb24udmFsdWUuYXJnOwotCi0JLyogbmV4dF9vcCBwb2ludHMgdG8gdGhlIG9wIHRoYXQgaG9sZHMgdGhlIEJhbmsgUmVnaXN0ZXIgKi8KLQotCW5leHRfb3AgPSBuZXh0X29wLT5jb21tb24ubmV4dDsKLQotCS8qIG5leHRfb3AgcG9pbnRzIHRvIHRoZSBvcCB0aGF0IGhvbGRzIHRoZSBCYW5rIFZhbHVlICovCi0KLQluZXh0X29wID0gbmV4dF9vcC0+Y29tbW9uLm5leHQ7Ci0KLQkvKgotCSAqIFNldCBwcm9wZXIgaW5kZXggaW50byBvcGVyYW5kIHN0YWNrIGZvciBhY3BpX2RzX29ial9zdGFja19wdXNoCi0JICogaW52b2tlZCBpbnNpZGUgYWNwaV9kc19jcmVhdGVfb3BlcmFuZC4KLQkgKgotCSAqIFdlIHVzZSB3YWxrX3N0YXRlLT5PcGVyYW5kc1swXSB0byBzdG9yZSB0aGUgZXZhbHVhdGVkIGJhbmtfdmFsdWUKLQkgKi8KLQl3YWxrX3N0YXRlLT5vcGVyYW5kX2luZGV4ID0gMDsKLQotCXN0YXR1cyA9IGFjcGlfZHNfY3JlYXRlX29wZXJhbmQod2Fsa19zdGF0ZSwgbmV4dF9vcCwgMCk7Ci0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotCX0KLQotCXN0YXR1cyA9IGFjcGlfZXhfcmVzb2x2ZV90b192YWx1ZSgmd2Fsa19zdGF0ZS0+b3BlcmFuZHNbMF0sIHdhbGtfc3RhdGUpOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLQl9Ci0KLQlBQ1BJX0RVTVBfT1BFUkFORFMoQUNQSV9XQUxLX09QRVJBTkRTLAotCQkJICAgYWNwaV9wc19nZXRfb3Bjb2RlX25hbWUob3AtPmNvbW1vbi5hbWxfb3Bjb2RlKSwgMSk7Ci0JLyoKLQkgKiBHZXQgdGhlIGJhbmtfdmFsdWUgb3BlcmFuZCBhbmQgc2F2ZSBpdAotCSAqIChhdCBUb3Agb2Ygc3RhY2spCi0JICovCi0Jb3BlcmFuZF9kZXNjID0gd2Fsa19zdGF0ZS0+b3BlcmFuZHNbMF07Ci0KLQkvKiBBcmcgcG9pbnRzIHRvIHRoZSBzdGFydCBCYW5rIEZpZWxkICovCi0KLQlhcmcgPSBhY3BpX3BzX2dldF9hcmcob3AsIDQpOwotCXdoaWxlIChhcmcpIHsKLQotCQkvKiBJZ25vcmUgT0ZGU0VUIGFuZCBBQ0NFU1NBUyB0ZXJtcyBoZXJlICovCi0KLQkJaWYgKGFyZy0+Y29tbW9uLmFtbF9vcGNvZGUgPT0gQU1MX0lOVF9OQU1FREZJRUxEX09QKSB7Ci0JCQlub2RlID0gYXJnLT5jb21tb24ubm9kZTsKLQotCQkJb2JqX2Rlc2MgPSBhY3BpX25zX2dldF9hdHRhY2hlZF9vYmplY3Qobm9kZSk7Ci0JCQlpZiAoIW9ial9kZXNjKSB7Ci0JCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PVF9FWElTVCk7Ci0JCQl9Ci0KLQkJCW9ial9kZXNjLT5iYW5rX2ZpZWxkLnZhbHVlID0KLQkJCSAgICAodTMyKSBvcGVyYW5kX2Rlc2MtPmludGVnZXIudmFsdWU7Ci0JCX0KLQotCQkvKiBNb3ZlIHRvIG5leHQgZmllbGQgaW4gdGhlIGxpc3QgKi8KLQotCQlhcmcgPSBhcmctPmNvbW1vbi5uZXh0OwotCX0KLQotCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZShvcGVyYW5kX2Rlc2MpOwotCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX2RzX2V4ZWNfYmVnaW5fY29udHJvbF9vcAotICoKLSAqIFBBUkFNRVRFUlM6ICB3YWxrX2xpc3QgICAgICAgLSBUaGUgbGlzdCB0aGF0IG93bnMgdGhlIHdhbGsgc3RhY2sKLSAqICAgICAgICAgICAgICBPcCAgICAgICAgICAgICAgLSBUaGUgY29udHJvbCBPcAotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKLSAqCi0gKiBERVNDUklQVElPTjogSGFuZGxlcyBhbGwgY29udHJvbCBvcHMgZW5jb3VudGVyZWQgZHVyaW5nIGNvbnRyb2wgbWV0aG9kCi0gKiAgICAgICAgICAgICAgZXhlY3V0aW9uLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWFjcGlfc3RhdHVzCi1hY3BpX2RzX2V4ZWNfYmVnaW5fY29udHJvbF9vcChzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlLAotCQkJICAgICAgdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKm9wKQotewotCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOwotCXVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSAqY29udHJvbF9zdGF0ZTsKLQotCUFDUElfRlVOQ1RJT05fTkFNRShkc19leGVjX2JlZ2luX2NvbnRyb2xfb3ApOwotCi0JQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9ESVNQQVRDSCwgIk9wPSVwIE9wY29kZT0lMi4yWCBTdGF0ZT0lcFxuIiwgb3AsCi0JCQkgIG9wLT5jb21tb24uYW1sX29wY29kZSwgd2Fsa19zdGF0ZSkpOwotCi0Jc3dpdGNoIChvcC0+Y29tbW9uLmFtbF9vcGNvZGUpIHsKLQljYXNlIEFNTF9JRl9PUDoKLQljYXNlIEFNTF9XSElMRV9PUDoKLQotCQkvKgotCQkgKiBJRi9XSElMRTogQ3JlYXRlIGEgbmV3IGNvbnRyb2wgc3RhdGUgdG8gbWFuYWdlIHRoZXNlCi0JCSAqIGNvbnN0cnVjdHMuIFdlIG5lZWQgdG8gbWFuYWdlIHRoZXNlIGFzIGEgc3RhY2ssIGluIG9yZGVyCi0JCSAqIHRvIGhhbmRsZSBuZXN0aW5nLgotCQkgKi8KLQkJY29udHJvbF9zdGF0ZSA9IGFjcGlfdXRfY3JlYXRlX2NvbnRyb2xfc3RhdGUoKTsKLQkJaWYgKCFjb250cm9sX3N0YXRlKSB7Ci0JCQlzdGF0dXMgPSBBRV9OT19NRU1PUlk7Ci0JCQlicmVhazsKLQkJfQotCQkvKgotCQkgKiBTYXZlIGEgcG9pbnRlciB0byB0aGUgcHJlZGljYXRlIGZvciBtdWx0aXBsZSBleGVjdXRpb25zCi0JCSAqIG9mIGEgbG9vcAotCQkgKi8KLQkJY29udHJvbF9zdGF0ZS0+Y29udHJvbC5hbWxfcHJlZGljYXRlX3N0YXJ0ID0KLQkJICAgIHdhbGtfc3RhdGUtPnBhcnNlcl9zdGF0ZS5hbWwgLSAxOwotCQljb250cm9sX3N0YXRlLT5jb250cm9sLnBhY2thZ2VfZW5kID0KLQkJICAgIHdhbGtfc3RhdGUtPnBhcnNlcl9zdGF0ZS5wa2dfZW5kOwotCQljb250cm9sX3N0YXRlLT5jb250cm9sLm9wY29kZSA9IG9wLT5jb21tb24uYW1sX29wY29kZTsKLQotCQkvKiBQdXNoIHRoZSBjb250cm9sIHN0YXRlIG9uIHRoaXMgd2FsaydzIGNvbnRyb2wgc3RhY2sgKi8KLQotCQlhY3BpX3V0X3B1c2hfZ2VuZXJpY19zdGF0ZSgmd2Fsa19zdGF0ZS0+Y29udHJvbF9zdGF0ZSwKLQkJCQkJICAgY29udHJvbF9zdGF0ZSk7Ci0JCWJyZWFrOwotCi0JY2FzZSBBTUxfRUxTRV9PUDoKLQotCQkvKiBQcmVkaWNhdGUgaXMgaW4gdGhlIHN0YXRlIG9iamVjdCAqLwotCQkvKiBJZiBwcmVkaWNhdGUgaXMgdHJ1ZSwgdGhlIElGIHdhcyBleGVjdXRlZCwgaWdub3JlIEVMU0UgcGFydCAqLwotCi0JCWlmICh3YWxrX3N0YXRlLT5sYXN0X3ByZWRpY2F0ZSkgewotCQkJc3RhdHVzID0gQUVfQ1RSTF9UUlVFOwotCQl9Ci0KLQkJYnJlYWs7Ci0KLQljYXNlIEFNTF9SRVRVUk5fT1A6Ci0KLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gKHN0YXR1cyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfZHNfZXhlY19lbmRfY29udHJvbF9vcAotICoKLSAqIFBBUkFNRVRFUlM6ICB3YWxrX2xpc3QgICAgICAgLSBUaGUgbGlzdCB0aGF0IG93bnMgdGhlIHdhbGsgc3RhY2sKLSAqICAgICAgICAgICAgICBPcCAgICAgICAgICAgICAgLSBUaGUgY29udHJvbCBPcAotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKLSAqCi0gKiBERVNDUklQVElPTjogSGFuZGxlcyBhbGwgY29udHJvbCBvcHMgZW5jb3VudGVyZWQgZHVyaW5nIGNvbnRyb2wgbWV0aG9kCi0gKiAgICAgICAgICAgICAgZXhlY3V0aW9uLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWFjcGlfc3RhdHVzCi1hY3BpX2RzX2V4ZWNfZW5kX2NvbnRyb2xfb3Aoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqIHdhbGtfc3RhdGUsCi0JCQkgICAgdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKiBvcCkKLXsKLQlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKLQl1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgKmNvbnRyb2xfc3RhdGU7Ci0KLQlBQ1BJX0ZVTkNUSU9OX05BTUUoZHNfZXhlY19lbmRfY29udHJvbF9vcCk7Ci0KLQlzd2l0Y2ggKG9wLT5jb21tb24uYW1sX29wY29kZSkgewotCWNhc2UgQU1MX0lGX09QOgotCi0JCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRElTUEFUQ0gsICJbSUZfT1BdIE9wPSVwXG4iLCBvcCkpOwotCi0JCS8qCi0JCSAqIFNhdmUgdGhlIHJlc3VsdCBvZiB0aGUgcHJlZGljYXRlIGluIGNhc2UgdGhlcmUgaXMgYW4KLQkJICogRUxTRSB0byBjb21lCi0JCSAqLwotCQl3YWxrX3N0YXRlLT5sYXN0X3ByZWRpY2F0ZSA9Ci0JCSAgICAodTgpIHdhbGtfc3RhdGUtPmNvbnRyb2xfc3RhdGUtPmNvbW1vbi52YWx1ZTsKLQotCQkvKgotCQkgKiBQb3AgdGhlIGNvbnRyb2wgc3RhdGUgdGhhdCB3YXMgY3JlYXRlZCBhdCB0aGUgc3RhcnQKLQkJICogb2YgdGhlIElGIGFuZCBmcmVlIGl0Ci0JCSAqLwotCQljb250cm9sX3N0YXRlID0KLQkJICAgIGFjcGlfdXRfcG9wX2dlbmVyaWNfc3RhdGUoJndhbGtfc3RhdGUtPmNvbnRyb2xfc3RhdGUpOwotCQlhY3BpX3V0X2RlbGV0ZV9nZW5lcmljX3N0YXRlKGNvbnRyb2xfc3RhdGUpOwotCQlicmVhazsKLQotCWNhc2UgQU1MX0VMU0VfT1A6Ci0KLQkJYnJlYWs7Ci0KLQljYXNlIEFNTF9XSElMRV9PUDoKLQotCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0RJU1BBVENILCAiW1dISUxFX09QXSBPcD0lcFxuIiwgb3ApKTsKLQotCQlpZiAod2Fsa19zdGF0ZS0+Y29udHJvbF9zdGF0ZS0+Y29tbW9uLnZhbHVlKSB7Ci0KLQkJCS8qIFByZWRpY2F0ZSB3YXMgdHJ1ZSwgZ28gYmFjayBhbmQgZXZhbHVhdGUgaXQgYWdhaW4hICovCi0KLQkJCXN0YXR1cyA9IEFFX0NUUkxfUEVORElORzsKLQkJfQotCi0JCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRElTUEFUQ0gsCi0JCQkJICAiW1dISUxFX09QXSB0ZXJtaW5hdGlvbiEgT3A9JXBcbiIsIG9wKSk7Ci0KLQkJLyogUG9wIHRoaXMgY29udHJvbCBzdGF0ZSBhbmQgZnJlZSBpdCAqLwotCi0JCWNvbnRyb2xfc3RhdGUgPQotCQkgICAgYWNwaV91dF9wb3BfZ2VuZXJpY19zdGF0ZSgmd2Fsa19zdGF0ZS0+Y29udHJvbF9zdGF0ZSk7Ci0KLQkJd2Fsa19zdGF0ZS0+YW1sX2xhc3Rfd2hpbGUgPQotCQkgICAgY29udHJvbF9zdGF0ZS0+Y29udHJvbC5hbWxfcHJlZGljYXRlX3N0YXJ0OwotCQlhY3BpX3V0X2RlbGV0ZV9nZW5lcmljX3N0YXRlKGNvbnRyb2xfc3RhdGUpOwotCQlicmVhazsKLQotCWNhc2UgQU1MX1JFVFVSTl9PUDoKLQotCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0RJU1BBVENILAotCQkJCSAgIltSRVRVUk5fT1BdIE9wPSVwIEFyZz0lcFxuIiwgb3AsCi0JCQkJICBvcC0+Y29tbW9uLnZhbHVlLmFyZykpOwotCi0JCS8qCi0JCSAqIE9uZSBvcHRpb25hbCBvcGVyYW5kIC0tIHRoZSByZXR1cm4gdmFsdWUKLQkJICogSXQgY2FuIGJlIGVpdGhlciBhbiBpbW1lZGlhdGUgb3BlcmFuZCBvciBhIHJlc3VsdCB0aGF0Ci0JCSAqIGhhcyBiZWVuIGJ1YmJsZWQgdXAgdGhlIHRyZWUKLQkJICovCi0JCWlmIChvcC0+Y29tbW9uLnZhbHVlLmFyZykgewotCi0JCQkvKiBTaW5jZSB3ZSBoYXZlIGEgcmVhbCBSZXR1cm4oKSwgZGVsZXRlIGFueSBpbXBsaWNpdCByZXR1cm4gKi8KLQotCQkJYWNwaV9kc19jbGVhcl9pbXBsaWNpdF9yZXR1cm4od2Fsa19zdGF0ZSk7Ci0KLQkJCS8qIFJldHVybiBzdGF0ZW1lbnQgaGFzIGFuIGltbWVkaWF0ZSBvcGVyYW5kICovCi0KLQkJCXN0YXR1cyA9Ci0JCQkgICAgYWNwaV9kc19jcmVhdGVfb3BlcmFuZHMod2Fsa19zdGF0ZSwKLQkJCQkJCSAgICBvcC0+Y29tbW9uLnZhbHVlLmFyZyk7Ci0JCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJCQlyZXR1cm4gKHN0YXR1cyk7Ci0JCQl9Ci0KLQkJCS8qCi0JCQkgKiBJZiB2YWx1ZSBiZWluZyByZXR1cm5lZCBpcyBhIFJlZmVyZW5jZSAoc3VjaCBhcwotCQkJICogYW4gYXJnIG9yIGxvY2FsKSwgcmVzb2x2ZSBpdCBub3cgYmVjYXVzZSBpdCBtYXkKLQkJCSAqIGNlYXNlIHRvIGV4aXN0IGF0IHRoZSBlbmQgb2YgdGhlIG1ldGhvZC4KLQkJCSAqLwotCQkJc3RhdHVzID0KLQkJCSAgICBhY3BpX2V4X3Jlc29sdmVfdG9fdmFsdWUoJndhbGtfc3RhdGUtPm9wZXJhbmRzWzBdLAotCQkJCQkJICAgICB3YWxrX3N0YXRlKTsKLQkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQkJCXJldHVybiAoc3RhdHVzKTsKLQkJCX0KLQotCQkJLyoKLQkJCSAqIEdldCB0aGUgcmV0dXJuIHZhbHVlIGFuZCBzYXZlIGFzIHRoZSBsYXN0IHJlc3VsdAotCQkJICogdmFsdWUuICBUaGlzIGlzIHRoZSBvbmx5IHBsYWNlIHdoZXJlIHdhbGtfc3RhdGUtPnJldHVybl9kZXNjCi0JCQkgKiBpcyBzZXQgdG8gYW55dGhpbmcgb3RoZXIgdGhhbiB6ZXJvIQotCQkJICovCi0JCQl3YWxrX3N0YXRlLT5yZXR1cm5fZGVzYyA9IHdhbGtfc3RhdGUtPm9wZXJhbmRzWzBdOwotCQl9IGVsc2UgaWYgKHdhbGtfc3RhdGUtPnJlc3VsdF9jb3VudCkgewotCi0JCQkvKiBTaW5jZSB3ZSBoYXZlIGEgcmVhbCBSZXR1cm4oKSwgZGVsZXRlIGFueSBpbXBsaWNpdCByZXR1cm4gKi8KLQotCQkJYWNwaV9kc19jbGVhcl9pbXBsaWNpdF9yZXR1cm4od2Fsa19zdGF0ZSk7Ci0KLQkJCS8qCi0JCQkgKiBUaGUgcmV0dXJuIHZhbHVlIGhhcyBjb21lIGZyb20gYSBwcmV2aW91cyBjYWxjdWxhdGlvbi4KLQkJCSAqCi0JCQkgKiBJZiB2YWx1ZSBiZWluZyByZXR1cm5lZCBpcyBhIFJlZmVyZW5jZSAoc3VjaCBhcwotCQkJICogYW4gYXJnIG9yIGxvY2FsKSwgcmVzb2x2ZSBpdCBub3cgYmVjYXVzZSBpdCBtYXkKLQkJCSAqIGNlYXNlIHRvIGV4aXN0IGF0IHRoZSBlbmQgb2YgdGhlIG1ldGhvZC4KLQkJCSAqCi0JCQkgKiBBbGxvdyByZWZlcmVuY2VzIGNyZWF0ZWQgYnkgdGhlIEluZGV4IG9wZXJhdG9yIHRvIHJldHVybiB1bmNoYW5nZWQuCi0JCQkgKi8KLQkJCWlmICgoQUNQSV9HRVRfREVTQ1JJUFRPUl9UWVBFCi0JCQkgICAgICh3YWxrX3N0YXRlLT5yZXN1bHRzLT5yZXN1bHRzLm9ial9kZXNjWzBdKSA9PQotCQkJICAgICBBQ1BJX0RFU0NfVFlQRV9PUEVSQU5EKQotCQkJICAgICYmCi0JCQkgICAgKEFDUElfR0VUX09CSkVDVF9UWVBFCi0JCQkgICAgICh3YWxrX3N0YXRlLT5yZXN1bHRzLT5yZXN1bHRzLm9ial9kZXNjWzBdKSA9PQotCQkJICAgICBBQ1BJX1RZUEVfTE9DQUxfUkVGRVJFTkNFKQotCQkJICAgICYmICgod2Fsa19zdGF0ZS0+cmVzdWx0cy0+cmVzdWx0cy5vYmpfZGVzY1swXSktPgotCQkJCXJlZmVyZW5jZS5jbGFzcyAhPSBBQ1BJX1JFRkNMQVNTX0lOREVYKSkgewotCQkJCXN0YXR1cyA9Ci0JCQkJICAgIGFjcGlfZXhfcmVzb2x2ZV90b192YWx1ZSgmd2Fsa19zdGF0ZS0+Ci0JCQkJCQkJICAgICByZXN1bHRzLT5yZXN1bHRzLgotCQkJCQkJCSAgICAgb2JqX2Rlc2NbMF0sCi0JCQkJCQkJICAgICB3YWxrX3N0YXRlKTsKLQkJCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJCQkJcmV0dXJuIChzdGF0dXMpOwotCQkJCX0KLQkJCX0KLQotCQkJd2Fsa19zdGF0ZS0+cmV0dXJuX2Rlc2MgPQotCQkJICAgIHdhbGtfc3RhdGUtPnJlc3VsdHMtPnJlc3VsdHMub2JqX2Rlc2NbMF07Ci0JCX0gZWxzZSB7Ci0JCQkvKiBObyByZXR1cm4gb3BlcmFuZCAqLwotCi0JCQlpZiAod2Fsa19zdGF0ZS0+bnVtX29wZXJhbmRzKSB7Ci0JCQkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKHdhbGtfc3RhdGUtPgotCQkJCQkJCSBvcGVyYW5kc1swXSk7Ci0JCQl9Ci0KLQkJCXdhbGtfc3RhdGUtPm9wZXJhbmRzWzBdID0gTlVMTDsKLQkJCXdhbGtfc3RhdGUtPm51bV9vcGVyYW5kcyA9IDA7Ci0JCQl3YWxrX3N0YXRlLT5yZXR1cm5fZGVzYyA9IE5VTEw7Ci0JCX0KLQotCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0RJU1BBVENILAotCQkJCSAgIkNvbXBsZXRlZCBSRVRVUk5fT1AgU3RhdGU9JXAsIFJldFZhbD0lcFxuIiwKLQkJCQkgIHdhbGtfc3RhdGUsIHdhbGtfc3RhdGUtPnJldHVybl9kZXNjKSk7Ci0KLQkJLyogRW5kIHRoZSBjb250cm9sIG1ldGhvZCBleGVjdXRpb24gcmlnaHQgbm93ICovCi0KLQkJc3RhdHVzID0gQUVfQ1RSTF9URVJNSU5BVEU7Ci0JCWJyZWFrOwotCi0JY2FzZSBBTUxfTk9PUF9PUDoKLQotCQkvKiBKdXN0IGRvIG5vdGhpbmchICovCi0JCWJyZWFrOwotCi0JY2FzZSBBTUxfQlJFQUtfUE9JTlRfT1A6Ci0KLQkJLyogQ2FsbCB1cCB0byB0aGUgT1Mgc2VydmljZSBsYXllciB0byBoYW5kbGUgdGhpcyAqLwotCi0JCXN0YXR1cyA9Ci0JCSAgICBhY3BpX29zX3NpZ25hbChBQ1BJX1NJR05BTF9CUkVBS1BPSU5ULAotCQkJCSAgICJFeGVjdXRlZCBBTUwgQnJlYWtwb2ludCBvcGNvZGUiKTsKLQotCQkvKiBJZiBhbmQgd2hlbiBpdCByZXR1cm5zLCBhbGwgZG9uZS4gKi8KLQotCQlicmVhazsKLQotCWNhc2UgQU1MX0JSRUFLX09QOgotCWNhc2UgQU1MX0NPTlRJTlVFX09QOgkvKiBBQ1BJIDIuMCAqLwotCi0JCS8qIFBvcCBhbmQgZGVsZXRlIGNvbnRyb2wgc3RhdGVzIHVudGlsIHdlIGZpbmQgYSB3aGlsZSAqLwotCi0JCXdoaWxlICh3YWxrX3N0YXRlLT5jb250cm9sX3N0YXRlICYmCi0JCSAgICAgICAod2Fsa19zdGF0ZS0+Y29udHJvbF9zdGF0ZS0+Y29udHJvbC5vcGNvZGUgIT0KLQkJCUFNTF9XSElMRV9PUCkpIHsKLQkJCWNvbnRyb2xfc3RhdGUgPQotCQkJICAgIGFjcGlfdXRfcG9wX2dlbmVyaWNfc3RhdGUoJndhbGtfc3RhdGUtPgotCQkJCQkJICAgICAgY29udHJvbF9zdGF0ZSk7Ci0JCQlhY3BpX3V0X2RlbGV0ZV9nZW5lcmljX3N0YXRlKGNvbnRyb2xfc3RhdGUpOwotCQl9Ci0KLQkJLyogTm8gd2hpbGUgZm91bmQ/ICovCi0KLQkJaWYgKCF3YWxrX3N0YXRlLT5jb250cm9sX3N0YXRlKSB7Ci0JCQlyZXR1cm4gKEFFX0FNTF9OT19XSElMRSk7Ci0JCX0KLQotCQkvKiBXYXM6IHdhbGtfc3RhdGUtPmFtbF9sYXN0X3doaWxlID0gd2Fsa19zdGF0ZS0+Y29udHJvbF9zdGF0ZS0+Q29udHJvbC5hbWxfcHJlZGljYXRlX3N0YXJ0OyAqLwotCi0JCXdhbGtfc3RhdGUtPmFtbF9sYXN0X3doaWxlID0KLQkJICAgIHdhbGtfc3RhdGUtPmNvbnRyb2xfc3RhdGUtPmNvbnRyb2wucGFja2FnZV9lbmQ7Ci0KLQkJLyogUmV0dXJuIHN0YXR1cyBkZXBlbmRpbmcgb24gb3Bjb2RlICovCi0KLQkJaWYgKG9wLT5jb21tb24uYW1sX29wY29kZSA9PSBBTUxfQlJFQUtfT1ApIHsKLQkJCXN0YXR1cyA9IEFFX0NUUkxfQlJFQUs7Ci0JCX0gZWxzZSB7Ci0JCQlzdGF0dXMgPSBBRV9DVFJMX0NPTlRJTlVFOwotCQl9Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQotCQlBQ1BJX0VSUk9SKChBRV9JTkZPLCAiVW5rbm93biBjb250cm9sIG9wY29kZT0lWCBPcD0lcCIsCi0JCQkgICAgb3AtPmNvbW1vbi5hbWxfb3Bjb2RlLCBvcCkpOwotCi0JCXN0YXR1cyA9IEFFX0FNTF9CQURfT1BDT0RFOwotCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gKHN0YXR1cyk7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZGlzcGF0Y2hlci9kc3V0aWxzLmMgYi9kcml2ZXJzL2FjcGkvZGlzcGF0Y2hlci9kc3V0aWxzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzOTg5ODIuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9hY3BpL2Rpc3BhdGNoZXIvZHN1dGlscy5jCisrKyAvZGV2L251bGwKQEAgLTEsODY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogTW9kdWxlIE5hbWU6IGRzdXRpbHMgLSBEaXNwYXRjaGVyIHV0aWxpdGllcwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA4LCBJbnRlbCBDb3JwLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAotICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgYXQgbWluaW11bSBhIGRpc2NsYWltZXIKLSAqICAgIHN1YnN0YW50aWFsbHkgc2ltaWxhciB0byB0aGUgIk5PIFdBUlJBTlRZIiBkaXNjbGFpbWVyIGJlbG93Ci0gKiAgICAoIkRpc2NsYWltZXIiKSBhbmQgYW55IHJlZGlzdHJpYnV0aW9uIG11c3QgYmUgY29uZGl0aW9uZWQgdXBvbgotICogICAgaW5jbHVkaW5nIGEgc3Vic3RhbnRpYWxseSBzaW1pbGFyIERpc2NsYWltZXIgcmVxdWlyZW1lbnQgZm9yIGZ1cnRoZXIKLSAqICAgIGJpbmFyeSByZWRpc3RyaWJ1dGlvbi4KLSAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcwotICogICAgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICogU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBOTyBXQVJSQU5UWQotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCi0gKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUwotICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcKLSAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQotICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgotICovCi0KLSNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KLSNpbmNsdWRlIDxhY3BpL2FjcGFyc2VyLmg+Ci0jaW5jbHVkZSA8YWNwaS9hbWxjb2RlLmg+Ci0jaW5jbHVkZSA8YWNwaS9hY2Rpc3BhdC5oPgotI2luY2x1ZGUgPGFjcGkvYWNpbnRlcnAuaD4KLSNpbmNsdWRlIDxhY3BpL2FjbmFtZXNwLmg+Ci0jaW5jbHVkZSA8YWNwaS9hY2RlYnVnLmg+Ci0KLSNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX0RJU1BBVENIRVIKLUFDUElfTU9EVUxFX05BTUUoImRzdXRpbHMiKQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX2RzX2NsZWFyX2ltcGxpY2l0X3JldHVybgotICoKLSAqIFBBUkFNRVRFUlM6ICB3YWxrX3N0YXRlICAgICAgICAgIC0gQ3VycmVudCBTdGF0ZQotICoKLSAqIFJFVFVSTjogICAgICBOb25lLgotICoKLSAqIERFU0NSSVBUSU9OOiBDbGVhciBhbmQgcmVtb3ZlIGEgcmVmZXJlbmNlIG9uIGFuIGltcGxpY2l0IHJldHVybiB2YWx1ZS4gIFVzZWQKLSAqICAgICAgICAgICAgICB0byBkZWxldGUgInN0YWxlIiByZXR1cm4gdmFsdWVzIChpZiBlbmFibGVkLCB0aGUgcmV0dXJuIHZhbHVlCi0gKiAgICAgICAgICAgICAgZnJvbSBldmVyeSBvcGVyYXRvciBpcyBzYXZlZCBhdCBsZWFzdCBtb21lbnRhcmlseSwgaW4gY2FzZSB0aGUKLSAqICAgICAgICAgICAgICBwYXJlbnQgbWV0aG9kIGV4aXRzLikKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBhY3BpX2RzX2NsZWFyX2ltcGxpY2l0X3JldHVybihzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKQotewotCUFDUElfRlVOQ1RJT05fTkFNRShkc19jbGVhcl9pbXBsaWNpdF9yZXR1cm4pOwotCi0JLyoKLQkgKiBTbGFjayBtdXN0IGJlIGVuYWJsZWQgZm9yIHRoaXMgZmVhdHVyZQotCSAqLwotCWlmICghYWNwaV9nYmxfZW5hYmxlX2ludGVycHJldGVyX3NsYWNrKSB7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAod2Fsa19zdGF0ZS0+aW1wbGljaXRfcmV0dXJuX29iaikgewotCQkvKgotCQkgKiBEZWxldGUgYW55ICJzdGFsZSIgaW1wbGljaXQgcmV0dXJuLiBIb3dldmVyLCBpbgotCQkgKiBjb21wbGV4IHN0YXRlbWVudHMsIHRoZSBpbXBsaWNpdCByZXR1cm4gdmFsdWUgY2FuIGJlCi0JCSAqIGJ1YmJsZWQgdXAgc2V2ZXJhbCBsZXZlbHMuCi0JCSAqLwotCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0RJU1BBVENILAotCQkJCSAgIlJlbW92aW5nIHJlZmVyZW5jZSBvbiBzdGFsZSBpbXBsaWNpdCByZXR1cm4gb2JqICVwXG4iLAotCQkJCSAgd2Fsa19zdGF0ZS0+aW1wbGljaXRfcmV0dXJuX29iaikpOwotCi0JCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZSh3YWxrX3N0YXRlLT5pbXBsaWNpdF9yZXR1cm5fb2JqKTsKLQkJd2Fsa19zdGF0ZS0+aW1wbGljaXRfcmV0dXJuX29iaiA9IE5VTEw7Ci0JfQotfQotCi0jaWZuZGVmIEFDUElfTk9fTUVUSE9EX0VYRUNVVElPTgotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9kc19kb19pbXBsaWNpdF9yZXR1cm4KLSAqCi0gKiBQQVJBTUVURVJTOiAgcmV0dXJuX2Rlc2MgICAgICAgICAtIFRoZSByZXR1cm4gdmFsdWUKLSAqICAgICAgICAgICAgICB3YWxrX3N0YXRlICAgICAgICAgIC0gQ3VycmVudCBTdGF0ZQotICogICAgICAgICAgICAgIGFkZF9yZWZlcmVuY2UgICAgICAgLSBUcnVlIGlmIGEgcmVmZXJlbmNlIHNob3VsZCBiZSBhZGRlZCB0byB0aGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9iamVjdAotICoKLSAqIFJFVFVSTjogICAgICBUUlVFIGlmIGltcGxpY2l0IHJldHVybiBlbmFibGVkLCBGQUxTRSBvdGhlcndpc2UKLSAqCi0gKiBERVNDUklQVElPTjogSW1wbGVtZW50cyB0aGUgb3B0aW9uYWwgImltcGxpY2l0IHJldHVybiIuICBXZSBzYXZlIHRoZSByZXN1bHQKLSAqICAgICAgICAgICAgICBvZiBldmVyeSBBU0wgb3BlcmF0b3IgYW5kIGNvbnRyb2wgbWV0aG9kIGludm9jYXRpb24gaW4gY2FzZSB0aGUKLSAqICAgICAgICAgICAgICBwYXJlbnQgbWV0aG9kIGV4aXQuICBCZWZvcmUgc3RvcmluZyBhIG5ldyByZXR1cm4gdmFsdWUsIHdlCi0gKiAgICAgICAgICAgICAgZGVsZXRlIHRoZSBwcmV2aW91cyByZXR1cm4gdmFsdWUuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdTgKLWFjcGlfZHNfZG9faW1wbGljaXRfcmV0dXJuKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnJldHVybl9kZXNjLAotCQkJICAgc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSwgdTggYWRkX3JlZmVyZW5jZSkKLXsKLQlBQ1BJX0ZVTkNUSU9OX05BTUUoZHNfZG9faW1wbGljaXRfcmV0dXJuKTsKLQotCS8qCi0JICogU2xhY2sgbXVzdCBiZSBlbmFibGVkIGZvciB0aGlzIGZlYXR1cmUsIGFuZCB3ZSBtdXN0Ci0JICogaGF2ZSBhIHZhbGlkIHJldHVybiBvYmplY3QKLQkgKi8KLQlpZiAoKCFhY3BpX2dibF9lbmFibGVfaW50ZXJwcmV0ZXJfc2xhY2spIHx8ICghcmV0dXJuX2Rlc2MpKSB7Ci0JCXJldHVybiAoRkFMU0UpOwotCX0KLQotCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRElTUEFUQ0gsCi0JCQkgICJSZXN1bHQgJXAgd2lsbCBiZSBpbXBsaWNpdGx5IHJldHVybmVkOyBQcmV2PSVwXG4iLAotCQkJICByZXR1cm5fZGVzYywgd2Fsa19zdGF0ZS0+aW1wbGljaXRfcmV0dXJuX29iaikpOwotCi0JLyoKLQkgKiBEZWxldGUgYW55ICJzdGFsZSIgaW1wbGljaXQgcmV0dXJuIHZhbHVlIGZpcnN0LiBIb3dldmVyLCBpbgotCSAqIGNvbXBsZXggc3RhdGVtZW50cywgdGhlIGltcGxpY2l0IHJldHVybiB2YWx1ZSBjYW4gYmUKLQkgKiBidWJibGVkIHVwIHNldmVyYWwgbGV2ZWxzLCBzbyB3ZSBkb24ndCBjbGVhciB0aGUgdmFsdWUgaWYgaXQKLQkgKiBpcyB0aGUgc2FtZSBhcyB0aGUgcmV0dXJuX2Rlc2MuCi0JICovCi0JaWYgKHdhbGtfc3RhdGUtPmltcGxpY2l0X3JldHVybl9vYmopIHsKLQkJaWYgKHdhbGtfc3RhdGUtPmltcGxpY2l0X3JldHVybl9vYmogPT0gcmV0dXJuX2Rlc2MpIHsKLQkJCXJldHVybiAoVFJVRSk7Ci0JCX0KLQkJYWNwaV9kc19jbGVhcl9pbXBsaWNpdF9yZXR1cm4od2Fsa19zdGF0ZSk7Ci0JfQotCi0JLyogU2F2ZSB0aGUgaW1wbGljaXQgcmV0dXJuIHZhbHVlLCBhZGQgYSByZWZlcmVuY2UgaWYgcmVxdWVzdGVkICovCi0KLQl3YWxrX3N0YXRlLT5pbXBsaWNpdF9yZXR1cm5fb2JqID0gcmV0dXJuX2Rlc2M7Ci0JaWYgKGFkZF9yZWZlcmVuY2UpIHsKLQkJYWNwaV91dF9hZGRfcmVmZXJlbmNlKHJldHVybl9kZXNjKTsKLQl9Ci0KLQlyZXR1cm4gKFRSVUUpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX2RzX2lzX3Jlc3VsdF91c2VkCi0gKgotICogUEFSQU1FVEVSUzogIE9wICAgICAgICAgICAgICAgICAgLSBDdXJyZW50IE9wCi0gKiAgICAgICAgICAgICAgd2Fsa19zdGF0ZSAgICAgICAgICAtIEN1cnJlbnQgU3RhdGUKLSAqCi0gKiBSRVRVUk46ICAgICAgVFJVRSBpZiByZXN1bHQgaXMgdXNlZCwgRkFMU0Ugb3RoZXJ3aXNlCi0gKgotICogREVTQ1JJUFRJT046IENoZWNrIGlmIGEgcmVzdWx0IG9iamVjdCB3aWxsIGJlIHVzZWQgYnkgdGhlIHBhcmVudAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXU4Ci1hY3BpX2RzX2lzX3Jlc3VsdF91c2VkKHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICogb3AsCi0JCSAgICAgICBzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICogd2Fsa19zdGF0ZSkKLXsKLQljb25zdCBzdHJ1Y3QgYWNwaV9vcGNvZGVfaW5mbyAqcGFyZW50X2luZm87Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUihkc19pc19yZXN1bHRfdXNlZCwgb3ApOwotCi0JLyogTXVzdCBoYXZlIGJvdGggYW4gT3AgYW5kIGEgUmVzdWx0IE9iamVjdCAqLwotCi0JaWYgKCFvcCkgewotCQlBQ1BJX0VSUk9SKChBRV9JTkZPLCAiTnVsbCBPcCIpKTsKLQkJcmV0dXJuX1VJTlQ4KFRSVUUpOwotCX0KLQotCS8qCi0JICogV2Uga25vdyB0aGF0IHRoaXMgb3BlcmF0b3IgaXMgbm90IGEKLQkgKiBSZXR1cm4oKSBvcGVyYXRvciAod291bGQgbm90IGNvbWUgaGVyZS4pIFRoZSBmb2xsb3dpbmcgY29kZSBpcyB0aGUKLQkgKiBvcHRpb25hbCBzdXBwb3J0IGZvciBhIHNvLWNhbGxlZCAiaW1wbGljaXQgcmV0dXJuIi4gU29tZSBBTUwgY29kZQotCSAqIGFzc3VtZXMgdGhhdCB0aGUgbGFzdCB2YWx1ZSBvZiB0aGUgbWV0aG9kIGlzICJpbXBsaWNpdGx5IiByZXR1cm5lZAotCSAqIHRvIHRoZSBjYWxsZXIuIEp1c3Qgc2F2ZSB0aGUgbGFzdCByZXN1bHQgYXMgdGhlIHJldHVybiB2YWx1ZS4KLQkgKiBOT1RFOiB0aGlzIGlzIG9wdGlvbmFsIGJlY2F1c2UgdGhlIEFTTCBsYW5ndWFnZSBkb2VzIG5vdCBhY3R1YWxseQotCSAqIHN1cHBvcnQgdGhpcyBiZWhhdmlvci4KLQkgKi8KLQkodm9pZClhY3BpX2RzX2RvX2ltcGxpY2l0X3JldHVybih3YWxrX3N0YXRlLT5yZXN1bHRfb2JqLCB3YWxrX3N0YXRlLAotCQkJCQkgVFJVRSk7Ci0KLQkvKgotCSAqIE5vdyBkZXRlcm1pbmUgaWYgdGhlIHBhcmVudCB3aWxsIHVzZSB0aGUgcmVzdWx0Ci0JICoKLQkgKiBJZiB0aGVyZSBpcyBubyBwYXJlbnQsIG9yIHRoZSBwYXJlbnQgaXMgYSBzY29wZV9vcCwgd2UgYXJlIGV4ZWN1dGluZwotCSAqIGF0IHRoZSBtZXRob2QgbGV2ZWwuIEFuIGV4ZWN1dGluZyBtZXRob2QgdHlwaWNhbGx5IGhhcyBubyBwYXJlbnQsCi0JICogc2luY2UgZWFjaCBtZXRob2QgaXMgcGFyc2VkIHNlcGFyYXRlbHkuICBBIG1ldGhvZCBpbnZva2VkIGV4dGVybmFsbHkKLQkgKiB2aWEgZXhlY3V0ZV9jb250cm9sX21ldGhvZCBoYXMgYSBzY29wZV9vcCBhcyB0aGUgcGFyZW50LgotCSAqLwotCWlmICgoIW9wLT5jb21tb24ucGFyZW50KSB8fAotCSAgICAob3AtPmNvbW1vbi5wYXJlbnQtPmNvbW1vbi5hbWxfb3Bjb2RlID09IEFNTF9TQ09QRV9PUCkpIHsKLQotCQkvKiBObyBwYXJlbnQsIHRoZSByZXR1cm4gdmFsdWUgY2Fubm90IHBvc3NpYmx5IGJlIHVzZWQgKi8KLQotCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0RJU1BBVENILAotCQkJCSAgIkF0IE1ldGhvZCBsZXZlbCwgcmVzdWx0IG9mIFslc10gbm90IHVzZWRcbiIsCi0JCQkJICBhY3BpX3BzX2dldF9vcGNvZGVfbmFtZShvcC0+Y29tbW9uLgotCQkJCQkJCSAgYW1sX29wY29kZSkpKTsKLQkJcmV0dXJuX1VJTlQ4KEZBTFNFKTsKLQl9Ci0KLQkvKiBHZXQgaW5mbyBvbiB0aGUgcGFyZW50LiBUaGUgcm9vdF9vcCBpcyBBTUxfU0NPUEUgKi8KLQotCXBhcmVudF9pbmZvID0KLQkgICAgYWNwaV9wc19nZXRfb3Bjb2RlX2luZm8ob3AtPmNvbW1vbi5wYXJlbnQtPmNvbW1vbi5hbWxfb3Bjb2RlKTsKLQlpZiAocGFyZW50X2luZm8tPmNsYXNzID09IEFNTF9DTEFTU19VTktOT1dOKSB7Ci0JCUFDUElfRVJST1IoKEFFX0lORk8sICJVbmtub3duIHBhcmVudCBvcGNvZGUgT3A9JXAiLCBvcCkpOwotCQlyZXR1cm5fVUlOVDgoRkFMU0UpOwotCX0KLQotCS8qCi0JICogRGVjaWRlIHdoYXQgdG8gZG8gd2l0aCB0aGUgcmVzdWx0IGJhc2VkIG9uIHRoZSBwYXJlbnQuICBJZgotCSAqIHRoZSBwYXJlbnQgb3Bjb2RlIHdpbGwgbm90IHVzZSB0aGUgcmVzdWx0LCBkZWxldGUgdGhlIG9iamVjdC4KLQkgKiBPdGhlcndpc2UgbGVhdmUgaXQgYXMgaXMsIGl0IHdpbGwgYmUgZGVsZXRlZCB3aGVuIGl0IGlzIHVzZWQKLQkgKiBhcyBhbiBvcGVyYW5kIGxhdGVyLgotCSAqLwotCXN3aXRjaCAocGFyZW50X2luZm8tPmNsYXNzKSB7Ci0JY2FzZSBBTUxfQ0xBU1NfQ09OVFJPTDoKLQotCQlzd2l0Y2ggKG9wLT5jb21tb24ucGFyZW50LT5jb21tb24uYW1sX29wY29kZSkgewotCQljYXNlIEFNTF9SRVRVUk5fT1A6Ci0KLQkJCS8qIE5ldmVyIGRlbGV0ZSB0aGUgcmV0dXJuIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCBhIHJldHVybiBvcGNvZGUgKi8KLQotCQkJZ290byByZXN1bHRfdXNlZDsKLQotCQljYXNlIEFNTF9JRl9PUDoKLQkJY2FzZSBBTUxfV0hJTEVfT1A6Ci0KLQkJCS8qCi0JCQkgKiBJZiB3ZSBhcmUgZXhlY3V0aW5nIHRoZSBwcmVkaWNhdGUgQU5EIHRoaXMgaXMgdGhlIHByZWRpY2F0ZSBvcCwKLQkJCSAqIHdlIHdpbGwgdXNlIHRoZSByZXR1cm4gdmFsdWUKLQkJCSAqLwotCQkJaWYgKCh3YWxrX3N0YXRlLT5jb250cm9sX3N0YXRlLT5jb21tb24uc3RhdGUgPT0KLQkJCSAgICAgQUNQSV9DT05UUk9MX1BSRURJQ0FURV9FWEVDVVRJTkcpCi0JCQkgICAgJiYgKHdhbGtfc3RhdGUtPmNvbnRyb2xfc3RhdGUtPmNvbnRyb2wuCi0JCQkJcHJlZGljYXRlX29wID09IG9wKSkgewotCQkJCWdvdG8gcmVzdWx0X3VzZWQ7Ci0JCQl9Ci0JCQlicmVhazsKLQotCQlkZWZhdWx0OgotCQkJLyogSWdub3JlIG90aGVyIGNvbnRyb2wgb3Bjb2RlcyAqLwotCQkJYnJlYWs7Ci0JCX0KLQotCQkvKiBUaGUgZ2VuZXJhbCBjb250cm9sIG9wY29kZSByZXR1cm5zIG5vIHJlc3VsdCAqLwotCi0JCWdvdG8gcmVzdWx0X25vdF91c2VkOwotCi0JY2FzZSBBTUxfQ0xBU1NfQ1JFQVRFOgotCi0JCS8qCi0JCSAqIFRoZXNlIG9wY29kZXMgYWxsb3cgdGVybV9hcmcocykgYXMgb3BlcmFuZHMgYW5kIHRoZXJlZm9yZQotCQkgKiB0aGUgb3BlcmFuZHMgY2FuIGJlIG1ldGhvZCBjYWxscy4gIFRoZSByZXN1bHQgaXMgdXNlZC4KLQkJICovCi0JCWdvdG8gcmVzdWx0X3VzZWQ7Ci0KLQljYXNlIEFNTF9DTEFTU19OQU1FRF9PQkpFQ1Q6Ci0KLQkJaWYgKChvcC0+Y29tbW9uLnBhcmVudC0+Y29tbW9uLmFtbF9vcGNvZGUgPT0gQU1MX1JFR0lPTl9PUCkgfHwKLQkJICAgIChvcC0+Y29tbW9uLnBhcmVudC0+Y29tbW9uLmFtbF9vcGNvZGUgPT0gQU1MX0RBVEFfUkVHSU9OX09QKQotCQkgICAgfHwgKG9wLT5jb21tb24ucGFyZW50LT5jb21tb24uYW1sX29wY29kZSA9PSBBTUxfUEFDS0FHRV9PUCkKLQkJICAgIHx8IChvcC0+Y29tbW9uLnBhcmVudC0+Y29tbW9uLmFtbF9vcGNvZGUgPT0KLQkJCUFNTF9WQVJfUEFDS0FHRV9PUCkKLQkJICAgIHx8IChvcC0+Y29tbW9uLnBhcmVudC0+Y29tbW9uLmFtbF9vcGNvZGUgPT0gQU1MX0JVRkZFUl9PUCkKLQkJICAgIHx8IChvcC0+Y29tbW9uLnBhcmVudC0+Y29tbW9uLmFtbF9vcGNvZGUgPT0KLQkJCUFNTF9JTlRfRVZBTF9TVUJUUkVFX09QKQotCQkgICAgfHwgKG9wLT5jb21tb24ucGFyZW50LT5jb21tb24uYW1sX29wY29kZSA9PQotCQkJQU1MX0JBTktfRklFTERfT1ApKSB7Ci0JCQkvKgotCQkJICogVGhlc2Ugb3Bjb2RlcyBhbGxvdyB0ZXJtX2FyZyhzKSBhcyBvcGVyYW5kcyBhbmQgdGhlcmVmb3JlCi0JCQkgKiB0aGUgb3BlcmFuZHMgY2FuIGJlIG1ldGhvZCBjYWxscy4gIFRoZSByZXN1bHQgaXMgdXNlZC4KLQkJCSAqLwotCQkJZ290byByZXN1bHRfdXNlZDsKLQkJfQotCi0JCWdvdG8gcmVzdWx0X25vdF91c2VkOwotCi0JZGVmYXVsdDoKLQotCQkvKgotCQkgKiBJbiBhbGwgb3RoZXIgY2FzZXMuIHRoZSBwYXJlbnQgd2lsbCBhY3R1YWxseSB1c2UgdGhlIHJldHVybgotCQkgKiBvYmplY3QsIHNvIGtlZXAgaXQuCi0JCSAqLwotCQlnb3RvIHJlc3VsdF91c2VkOwotCX0KLQotICAgICAgcmVzdWx0X3VzZWQ6Ci0JQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9ESVNQQVRDSCwKLQkJCSAgIlJlc3VsdCBvZiBbJXNdIHVzZWQgYnkgUGFyZW50IFslc10gT3A9JXBcbiIsCi0JCQkgIGFjcGlfcHNfZ2V0X29wY29kZV9uYW1lKG9wLT5jb21tb24uYW1sX29wY29kZSksCi0JCQkgIGFjcGlfcHNfZ2V0X29wY29kZV9uYW1lKG9wLT5jb21tb24ucGFyZW50LT5jb21tb24uCi0JCQkJCQkgIGFtbF9vcGNvZGUpLCBvcCkpOwotCi0JcmV0dXJuX1VJTlQ4KFRSVUUpOwotCi0gICAgICByZXN1bHRfbm90X3VzZWQ6Ci0JQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9ESVNQQVRDSCwKLQkJCSAgIlJlc3VsdCBvZiBbJXNdIG5vdCB1c2VkIGJ5IFBhcmVudCBbJXNdIE9wPSVwXG4iLAotCQkJICBhY3BpX3BzX2dldF9vcGNvZGVfbmFtZShvcC0+Y29tbW9uLmFtbF9vcGNvZGUpLAotCQkJICBhY3BpX3BzX2dldF9vcGNvZGVfbmFtZShvcC0+Y29tbW9uLnBhcmVudC0+Y29tbW9uLgotCQkJCQkJICBhbWxfb3Bjb2RlKSwgb3ApKTsKLQotCXJldHVybl9VSU5UOChGQUxTRSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfZHNfZGVsZXRlX3Jlc3VsdF9pZl9ub3RfdXNlZAotICoKLSAqIFBBUkFNRVRFUlM6ICBPcCAgICAgICAgICAgICAgLSBDdXJyZW50IHBhcnNlIE9wCi0gKiAgICAgICAgICAgICAgcmVzdWx0X29iaiAgICAgIC0gUmVzdWx0IG9mIHRoZSBvcGVyYXRpb24KLSAqICAgICAgICAgICAgICB3YWxrX3N0YXRlICAgICAgLSBDdXJyZW50IHN0YXRlCi0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cwotICoKLSAqIERFU0NSSVBUSU9OOiBVc2VkIGFmdGVyIGludGVycHJldGF0aW9uIG9mIGFuIG9wY29kZS4gIElmIHRoZXJlIGlzIGFuIGludGVybmFsCi0gKiAgICAgICAgICAgICAgcmVzdWx0IGRlc2NyaXB0b3IsIGNoZWNrIGlmIHRoZSBwYXJlbnQgb3Bjb2RlIHdpbGwgYWN0dWFsbHkgdXNlCi0gKiAgICAgICAgICAgICAgdGhpcyByZXN1bHQuICBJZiBub3QsIGRlbGV0ZSB0aGUgcmVzdWx0IG5vdyBzbyB0aGF0IGl0IHdpbGwKLSAqICAgICAgICAgICAgICBub3QgYmVjb21lIG9ycGhhbmVkLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXZvaWQKLWFjcGlfZHNfZGVsZXRlX3Jlc3VsdF9pZl9ub3RfdXNlZCh1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqb3AsCi0JCQkJICB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpyZXN1bHRfb2JqLAotCQkJCSAgc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSkKLXsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYzsKLQlhY3BpX3N0YXR1cyBzdGF0dXM7Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUihkc19kZWxldGVfcmVzdWx0X2lmX25vdF91c2VkLCByZXN1bHRfb2JqKTsKLQotCWlmICghb3ApIHsKLQkJQUNQSV9FUlJPUigoQUVfSU5GTywgIk51bGwgT3AiKSk7Ci0JCXJldHVybl9WT0lEOwotCX0KLQotCWlmICghcmVzdWx0X29iaikgewotCQlyZXR1cm5fVk9JRDsKLQl9Ci0KLQlpZiAoIWFjcGlfZHNfaXNfcmVzdWx0X3VzZWQob3AsIHdhbGtfc3RhdGUpKSB7Ci0KLQkJLyogTXVzdCBwb3AgdGhlIHJlc3VsdCBzdGFjayAob2JqX2Rlc2Mgc2hvdWxkIGJlIGVxdWFsIHRvIHJlc3VsdF9vYmopICovCi0KLQkJc3RhdHVzID0gYWNwaV9kc19yZXN1bHRfcG9wKCZvYmpfZGVzYywgd2Fsa19zdGF0ZSk7Ci0JCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkgewotCQkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKHJlc3VsdF9vYmopOwotCQl9Ci0JfQotCi0JcmV0dXJuX1ZPSUQ7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfZHNfcmVzb2x2ZV9vcGVyYW5kcwotICoKLSAqIFBBUkFNRVRFUlM6ICB3YWxrX3N0YXRlICAgICAgICAgIC0gQ3VycmVudCB3YWxrIHN0YXRlIHdpdGggb3BlcmFuZHMgb24gc3RhY2sKLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IFJlc29sdmUgYWxsIG9wZXJhbmRzIHRvIHRoZWlyIHZhbHVlcy4gIFVzZWQgdG8gcHJlcGFyZQotICogICAgICAgICAgICAgIGFyZ3VtZW50cyB0byBhIGNvbnRyb2wgbWV0aG9kIGludm9jYXRpb24gKGEgY2FsbCBmcm9tIG9uZQotICogICAgICAgICAgICAgIG1ldGhvZCB0byBhbm90aGVyLikKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1hY3BpX3N0YXR1cyBhY3BpX2RzX3Jlc29sdmVfb3BlcmFuZHMoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSkKLXsKLQl1MzIgaTsKLQlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKGRzX3Jlc29sdmVfb3BlcmFuZHMsIHdhbGtfc3RhdGUpOwotCi0JLyoKLQkgKiBBdHRlbXB0IHRvIHJlc29sdmUgZWFjaCBvZiB0aGUgdmFsaWQgb3BlcmFuZHMKLQkgKiBNZXRob2QgYXJndW1lbnRzIGFyZSBwYXNzZWQgYnkgcmVmZXJlbmNlLCBub3QgYnkgdmFsdWUuICBUaGlzIG1lYW5zCi0JICogdGhhdCB0aGUgYWN0dWFsIG9iamVjdHMgYXJlIHBhc3NlZCwgbm90IGNvcGllcyBvZiB0aGUgb2JqZWN0cy4KLQkgKi8KLQlmb3IgKGkgPSAwOyBpIDwgd2Fsa19zdGF0ZS0+bnVtX29wZXJhbmRzOyBpKyspIHsKLQkJc3RhdHVzID0KLQkJICAgIGFjcGlfZXhfcmVzb2x2ZV90b192YWx1ZSgmd2Fsa19zdGF0ZS0+b3BlcmFuZHNbaV0sCi0JCQkJCSAgICAgd2Fsa19zdGF0ZSk7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9kc19jbGVhcl9vcGVyYW5kcwotICoKLSAqIFBBUkFNRVRFUlM6ICB3YWxrX3N0YXRlICAgICAgICAgIC0gQ3VycmVudCB3YWxrIHN0YXRlIHdpdGggb3BlcmFuZHMgb24gc3RhY2sKLSAqCi0gKiBSRVRVUk46ICAgICAgTm9uZQotICoKLSAqIERFU0NSSVBUSU9OOiBDbGVhciBhbGwgb3BlcmFuZHMgb24gdGhlIGN1cnJlbnQgd2FsayBzdGF0ZSBvcGVyYW5kIHN0YWNrLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXZvaWQgYWNwaV9kc19jbGVhcl9vcGVyYW5kcyhzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKQotewotCXUzMiBpOwotCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIoZHNfY2xlYXJfb3BlcmFuZHMsIHdhbGtfc3RhdGUpOwotCi0JLyogUmVtb3ZlIGEgcmVmZXJlbmNlIG9uIGVhY2ggb3BlcmFuZCBvbiB0aGUgc3RhY2sgKi8KLQotCWZvciAoaSA9IDA7IGkgPCB3YWxrX3N0YXRlLT5udW1fb3BlcmFuZHM7IGkrKykgewotCQkvKgotCQkgKiBSZW1vdmUgYSByZWZlcmVuY2UgdG8gYWxsIG9wZXJhbmRzLCBpbmNsdWRpbmcgYm90aAotCQkgKiAiQXJndW1lbnRzIiBhbmQgIlRhcmdldHMiLgotCQkgKi8KLQkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKHdhbGtfc3RhdGUtPm9wZXJhbmRzW2ldKTsKLQkJd2Fsa19zdGF0ZS0+b3BlcmFuZHNbaV0gPSBOVUxMOwotCX0KLQotCXdhbGtfc3RhdGUtPm51bV9vcGVyYW5kcyA9IDA7Ci0JcmV0dXJuX1ZPSUQ7Ci19Ci0jZW5kaWYKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9kc19jcmVhdGVfb3BlcmFuZAotICoKLSAqIFBBUkFNRVRFUlM6ICB3YWxrX3N0YXRlICAgICAgLSBDdXJyZW50IHdhbGsgc3RhdGUKLSAqICAgICAgICAgICAgICBBcmcgICAgICAgICAgICAgLSBQYXJzZSBvYmplY3QgZm9yIHRoZSBhcmd1bWVudAotICogICAgICAgICAgICAgIGFyZ19pbmRleCAgICAgICAtIFdoaWNoIGFyZ3VtZW50ICh6ZXJvIGJhc2VkKQotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKLSAqCi0gKiBERVNDUklQVElPTjogVHJhbnNsYXRlIGEgcGFyc2UgdHJlZSBvYmplY3QgdGhhdCBpcyBhbiBhcmd1bWVudCB0byBhbiBBTUwKLSAqICAgICAgICAgICAgICBvcGNvZGUgdG8gdGhlIGVxdWl2YWxlbnQgaW50ZXJwcmV0ZXIgb2JqZWN0LiAgVGhpcyBtYXkgaW5jbHVkZQotICogICAgICAgICAgICAgIGxvb2tpbmcgdXAgYSBuYW1lIG9yIGVudGVyaW5nIGEgbmV3IG5hbWUgaW50byB0aGUgaW50ZXJuYWwKLSAqICAgICAgICAgICAgICBuYW1lc3BhY2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotYWNwaV9zdGF0dXMKLWFjcGlfZHNfY3JlYXRlX29wZXJhbmQoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSwKLQkJICAgICAgIHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICphcmcsIHUzMiBhcmdfaW5kZXgpCi17Ci0JYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7Ci0JY2hhciAqbmFtZV9zdHJpbmc7Ci0JdTMyIG5hbWVfbGVuZ3RoOwotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjOwotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpwYXJlbnRfb3A7Ci0JdTE2IG9wY29kZTsKLQlhY3BpX2ludGVycHJldGVyX21vZGUgaW50ZXJwcmV0ZXJfbW9kZTsKLQljb25zdCBzdHJ1Y3QgYWNwaV9vcGNvZGVfaW5mbyAqb3BfaW5mbzsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKGRzX2NyZWF0ZV9vcGVyYW5kLCBhcmcpOwotCi0JLyogQSB2YWxpZCBuYW1lIG11c3QgYmUgbG9va2VkIHVwIGluIHRoZSBuYW1lc3BhY2UgKi8KLQotCWlmICgoYXJnLT5jb21tb24uYW1sX29wY29kZSA9PSBBTUxfSU5UX05BTUVQQVRIX09QKSAmJgotCSAgICAoYXJnLT5jb21tb24udmFsdWUuc3RyaW5nKSAmJgotCSAgICAhKGFyZy0+Y29tbW9uLmZsYWdzICYgQUNQSV9QQVJTRU9QX0lOX1NUQUNLKSkgewotCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0RJU1BBVENILCAiR2V0dGluZyBhIG5hbWU6IEFyZz0lcFxuIiwKLQkJCQkgIGFyZykpOwotCi0JCS8qIEdldCB0aGUgZW50aXJlIG5hbWUgc3RyaW5nIGZyb20gdGhlIEFNTCBzdHJlYW0gKi8KLQotCQlzdGF0dXMgPQotCQkgICAgYWNwaV9leF9nZXRfbmFtZV9zdHJpbmcoQUNQSV9UWVBFX0FOWSwKLQkJCQkJICAgIGFyZy0+Y29tbW9uLnZhbHVlLmJ1ZmZlciwKLQkJCQkJICAgICZuYW1lX3N0cmluZywgJm5hbWVfbGVuZ3RoKTsKLQotCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotCQl9Ci0KLQkJLyogQWxsIHByZWZpeGVzIGhhdmUgYmVlbiBoYW5kbGVkLCBhbmQgdGhlIG5hbWUgaXMgaW4gbmFtZV9zdHJpbmcgKi8KLQotCQkvKgotCQkgKiBTcGVjaWFsIGhhbmRsaW5nIGZvciBidWZmZXJfZmllbGQgZGVjbGFyYXRpb25zLiBUaGlzIGlzIGEgZGVmZXJyZWQKLQkJICogb3Bjb2RlIHRoYXQgdW5mb3J0dW5hdGVseSBkZWZpbmVzIHRoZSBmaWVsZCBuYW1lIGFzIHRoZSBsYXN0Ci0JCSAqIHBhcmFtZXRlciBpbnN0ZWFkIG9mIHRoZSBmaXJzdC4gIFdlIGdldCBoZXJlIHdoZW4gd2UgYXJlIHBlcmZvcm1pbmcKLQkJICogdGhlIGRlZmVycmVkIGV4ZWN1dGlvbiwgc28gdGhlIGFjdHVhbCBuYW1lIG9mIHRoZSBmaWVsZCBpcyBhbHJlYWR5Ci0JCSAqIGluIHRoZSBuYW1lc3BhY2UuICBXZSBkb24ndCB3YW50IHRvIGF0dGVtcHQgdG8gbG9vayBpdCB1cCBhZ2FpbgotCQkgKiBiZWNhdXNlIHdlIG1heSBiZSBleGVjdXRpbmcgaW4gYSBkaWZmZXJlbnQgc2NvcGUgdGhhbiB3aGVyZSB0aGUKLQkJICogYWN0dWFsIG9wY29kZSBleGlzdHMuCi0JCSAqLwotCQlpZiAoKHdhbGtfc3RhdGUtPmRlZmVycmVkX25vZGUpICYmCi0JCSAgICAod2Fsa19zdGF0ZS0+ZGVmZXJyZWRfbm9kZS0+dHlwZSA9PSBBQ1BJX1RZUEVfQlVGRkVSX0ZJRUxEKQotCQkgICAgJiYgKGFyZ19pbmRleCA9PQotCQkJKHUzMikgKCh3YWxrX3N0YXRlLT5vcGNvZGUgPT0KLQkJCQlBTUxfQ1JFQVRFX0ZJRUxEX09QKSA/IDMgOiAyKSkpIHsKLQkJCW9ial9kZXNjID0KLQkJCSAgICBBQ1BJX0NBU1RfUFRSKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QsCi0JCQkJCSAgd2Fsa19zdGF0ZS0+ZGVmZXJyZWRfbm9kZSk7Ci0JCQlzdGF0dXMgPSBBRV9PSzsKLQkJfSBlbHNlIHsJLyogQWxsIG90aGVyIG9wY29kZXMgKi8KLQotCQkJLyoKLQkJCSAqIERpZmZlcmVudGlhdGUgYmV0d2VlbiBhIG5hbWVzcGFjZSAiY3JlYXRlIiBvcGVyYXRpb24KLQkJCSAqIHZlcnN1cyBhICJsb29rdXAiIG9wZXJhdGlvbiAoSU1PREVfTE9BRF9QQVNTMiB2cy4KLQkJCSAqIElNT0RFX0VYRUNVVEUpIGluIG9yZGVyIHRvIHN1cHBvcnQgdGhlIGNyZWF0aW9uIG9mCi0JCQkgKiBuYW1lc3BhY2Ugb2JqZWN0cyBkdXJpbmcgdGhlIGV4ZWN1dGlvbiBvZiBjb250cm9sIG1ldGhvZHMuCi0JCQkgKi8KLQkJCXBhcmVudF9vcCA9IGFyZy0+Y29tbW9uLnBhcmVudDsKLQkJCW9wX2luZm8gPQotCQkJICAgIGFjcGlfcHNfZ2V0X29wY29kZV9pbmZvKHBhcmVudF9vcC0+Y29tbW9uLgotCQkJCQkJICAgIGFtbF9vcGNvZGUpOwotCQkJaWYgKChvcF9pbmZvLT5mbGFncyAmIEFNTF9OU05PREUpCi0JCQkgICAgJiYgKHBhcmVudF9vcC0+Y29tbW9uLmFtbF9vcGNvZGUgIT0KLQkJCQlBTUxfSU5UX01FVEhPRENBTExfT1ApCi0JCQkgICAgJiYgKHBhcmVudF9vcC0+Y29tbW9uLmFtbF9vcGNvZGUgIT0gQU1MX1JFR0lPTl9PUCkKLQkJCSAgICAmJiAocGFyZW50X29wLT5jb21tb24uYW1sX29wY29kZSAhPQotCQkJCUFNTF9JTlRfTkFNRVBBVEhfT1ApKSB7Ci0KLQkJCQkvKiBFbnRlciBuYW1lIGludG8gbmFtZXNwYWNlIGlmIG5vdCBmb3VuZCAqLwotCi0JCQkJaW50ZXJwcmV0ZXJfbW9kZSA9IEFDUElfSU1PREVfTE9BRF9QQVNTMjsKLQkJCX0gZWxzZSB7Ci0JCQkJLyogUmV0dXJuIGEgZmFpbHVyZSBpZiBuYW1lIG5vdCBmb3VuZCAqLwotCi0JCQkJaW50ZXJwcmV0ZXJfbW9kZSA9IEFDUElfSU1PREVfRVhFQ1VURTsKLQkJCX0KLQotCQkJc3RhdHVzID0KLQkJCSAgICBhY3BpX25zX2xvb2t1cCh3YWxrX3N0YXRlLT5zY29wZV9pbmZvLCBuYW1lX3N0cmluZywKLQkJCQkJICAgQUNQSV9UWVBFX0FOWSwgaW50ZXJwcmV0ZXJfbW9kZSwKLQkJCQkJICAgQUNQSV9OU19TRUFSQ0hfUEFSRU5UIHwKLQkJCQkJICAgQUNQSV9OU19ET05UX09QRU5fU0NPUEUsIHdhbGtfc3RhdGUsCi0JCQkJCSAgIEFDUElfQ0FTVF9JTkRJUkVDVF9QVFIoc3RydWN0Ci0JCQkJCQkJCSAgYWNwaV9uYW1lc3BhY2Vfbm9kZSwKLQkJCQkJCQkJICAmb2JqX2Rlc2MpKTsKLQkJCS8qCi0JCQkgKiBUaGUgb25seSBjYXNlIHdoZXJlIHdlIHBhc3MgdGhyb3VnaCAoaWdub3JlKSBhIE5PVF9GT1VORAotCQkJICogZXJyb3IgaXMgZm9yIHRoZSBjb25kX3JlZl9vZiBvcGNvZGUuCi0JCQkgKi8KLQkJCWlmIChzdGF0dXMgPT0gQUVfTk9UX0ZPVU5EKSB7Ci0JCQkJaWYgKHBhcmVudF9vcC0+Y29tbW9uLmFtbF9vcGNvZGUgPT0KLQkJCQkgICAgQU1MX0NPTkRfUkVGX09GX09QKSB7Ci0JCQkJCS8qCi0JCQkJCSAqIEZvciB0aGUgQ29uZGl0aW9uYWwgUmVmZXJlbmNlIG9wLCBpdCdzIE9LIGlmCi0JCQkJCSAqIHRoZSBuYW1lIGlzIG5vdCBmb3VuZDsgIFdlIGp1c3QgbmVlZCBhIHdheSB0bwotCQkJCQkgKiBpbmRpY2F0ZSB0aGlzIHRvIHRoZSBpbnRlcnByZXRlciwgc2V0IHRoZQotCQkJCQkgKiBvYmplY3QgdG8gdGhlIHJvb3QKLQkJCQkJICovCi0JCQkJCW9ial9kZXNjID0gQUNQSV9DQVNUX1BUUih1bmlvbgotCQkJCQkJCQkgYWNwaV9vcGVyYW5kX29iamVjdCwKLQkJCQkJCQkJIGFjcGlfZ2JsX3Jvb3Rfbm9kZSk7Ci0JCQkJCXN0YXR1cyA9IEFFX09LOwotCQkJCX0gZWxzZSB7Ci0JCQkJCS8qCi0JCQkJCSAqIFdlIGp1c3QgcGxhaW4gZGlkbid0IGZpbmQgaXQgLS0gd2hpY2ggaXMgYQotCQkJCQkgKiB2ZXJ5IHNlcmlvdXMgZXJyb3IgYXQgdGhpcyBwb2ludAotCQkJCQkgKi8KLQkJCQkJc3RhdHVzID0gQUVfQU1MX05BTUVfTk9UX0ZPVU5EOwotCQkJCX0KLQkJCX0KLQotCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCQkJQUNQSV9FUlJPUl9OQU1FU1BBQ0UobmFtZV9zdHJpbmcsIHN0YXR1cyk7Ci0JCQl9Ci0JCX0KLQotCQkvKiBGcmVlIHRoZSBuYW1lc3RyaW5nIGNyZWF0ZWQgYWJvdmUgKi8KLQotCQlBQ1BJX0ZSRUUobmFtZV9zdHJpbmcpOwotCi0JCS8qIENoZWNrIHN0YXR1cyBmcm9tIHRoZSBsb29rdXAgKi8KLQotCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotCQl9Ci0KLQkJLyogUHV0IHRoZSByZXN1bHRpbmcgb2JqZWN0IG9udG8gdGhlIGN1cnJlbnQgb2JqZWN0IHN0YWNrICovCi0KLQkJc3RhdHVzID0gYWNwaV9kc19vYmpfc3RhY2tfcHVzaChvYmpfZGVzYywgd2Fsa19zdGF0ZSk7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci0JCX0KLQkJQUNQSV9ERUJVR0dFUl9FWEVDKGFjcGlfZGJfZGlzcGxheV9hcmd1bWVudF9vYmplY3QKLQkJCQkgICAob2JqX2Rlc2MsIHdhbGtfc3RhdGUpKTsKLQl9IGVsc2UgewotCQkvKiBDaGVjayBmb3IgbnVsbCBuYW1lIGNhc2UgKi8KLQotCQlpZiAoKGFyZy0+Y29tbW9uLmFtbF9vcGNvZGUgPT0gQU1MX0lOVF9OQU1FUEFUSF9PUCkgJiYKLQkJICAgICEoYXJnLT5jb21tb24uZmxhZ3MgJiBBQ1BJX1BBUlNFT1BfSU5fU1RBQ0spKSB7Ci0JCQkvKgotCQkJICogSWYgdGhlIG5hbWUgaXMgbnVsbCwgdGhpcyBtZWFucyB0aGF0IHRoaXMgaXMgYW4KLQkJCSAqIG9wdGlvbmFsIHJlc3VsdCBwYXJhbWV0ZXIgdGhhdCB3YXMgbm90IHNwZWNpZmllZAotCQkJICogaW4gdGhlIG9yaWdpbmFsIEFTTC4gIENyZWF0ZSBhIFplcm8gQ29uc3RhbnQgZm9yIGEKLQkJCSAqIHBsYWNlaG9sZGVyLiAgKFN0b3JlIHRvIGEgY29uc3RhbnQgaXMgYSBOb29wLikKLQkJCSAqLwotCQkJb3Bjb2RlID0gQU1MX1pFUk9fT1A7CS8qIEhhcyBubyBhcmd1bWVudHMhICovCi0KLQkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRElTUEFUQ0gsCi0JCQkJCSAgIk51bGwgbmFtZXBhdGg6IEFyZz0lcFxuIiwgYXJnKSk7Ci0JCX0gZWxzZSB7Ci0JCQlvcGNvZGUgPSBhcmctPmNvbW1vbi5hbWxfb3Bjb2RlOwotCQl9Ci0KLQkJLyogR2V0IHRoZSBvYmplY3QgdHlwZSBvZiB0aGUgYXJndW1lbnQgKi8KLQotCQlvcF9pbmZvID0gYWNwaV9wc19nZXRfb3Bjb2RlX2luZm8ob3Bjb2RlKTsKLQkJaWYgKG9wX2luZm8tPm9iamVjdF90eXBlID09IEFDUElfVFlQRV9JTlZBTElEKSB7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9UX0lNUExFTUVOVEVEKTsKLQkJfQotCi0JCWlmICgob3BfaW5mby0+ZmxhZ3MgJiBBTUxfSEFTX1JFVFZBTCkKLQkJICAgIHx8IChhcmctPmNvbW1vbi5mbGFncyAmIEFDUElfUEFSU0VPUF9JTl9TVEFDSykpIHsKLQkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRElTUEFUQ0gsCi0JCQkJCSAgIkFyZ3VtZW50IHByZXZpb3VzbHkgY3JlYXRlZCwgYWxyZWFkeSBzdGFja2VkXG4iKSk7Ci0KLQkJCUFDUElfREVCVUdHRVJfRVhFQyhhY3BpX2RiX2Rpc3BsYXlfYXJndW1lbnRfb2JqZWN0Ci0JCQkJCSAgICh3YWxrX3N0YXRlLT4KLQkJCQkJICAgIG9wZXJhbmRzW3dhbGtfc3RhdGUtPm51bV9vcGVyYW5kcyAtCi0JCQkJCQkgICAgIDFdLCB3YWxrX3N0YXRlKSk7Ci0KLQkJCS8qCi0JCQkgKiBVc2UgdmFsdWUgdGhhdCB3YXMgYWxyZWFkeSBwcmV2aW91c2x5IHJldHVybmVkCi0JCQkgKiBieSB0aGUgZXZhbHVhdGlvbiBvZiB0aGlzIGFyZ3VtZW50Ci0JCQkgKi8KLQkJCXN0YXR1cyA9IGFjcGlfZHNfcmVzdWx0X3BvcCgmb2JqX2Rlc2MsIHdhbGtfc3RhdGUpOwotCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCQkJLyoKLQkJCQkgKiBPbmx5IGVycm9yIGlzIHVuZGVyZmxvdywgYW5kIHRoaXMgaW5kaWNhdGVzCi0JCQkJICogYSBtaXNzaW5nIG9yIG51bGwgb3BlcmFuZCEKLQkJCQkgKi8KLQkJCQlBQ1BJX0VYQ0VQVElPTigoQUVfSU5GTywgc3RhdHVzLAotCQkJCQkJIk1pc3Npbmcgb3IgbnVsbCBvcGVyYW5kIikpOwotCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotCQkJfQotCQl9IGVsc2UgewotCQkJLyogQ3JlYXRlIGFuIEFDUElfSU5URVJOQUxfT0JKRUNUIGZvciB0aGUgYXJndW1lbnQgKi8KLQotCQkJb2JqX2Rlc2MgPQotCQkJICAgIGFjcGlfdXRfY3JlYXRlX2ludGVybmFsX29iamVjdChvcF9pbmZvLT4KLQkJCQkJCQkgICBvYmplY3RfdHlwZSk7Ci0JCQlpZiAoIW9ial9kZXNjKSB7Ci0JCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX01FTU9SWSk7Ci0JCQl9Ci0KLQkJCS8qIEluaXRpYWxpemUgdGhlIG5ldyBvYmplY3QgKi8KLQotCQkJc3RhdHVzID0KLQkJCSAgICBhY3BpX2RzX2luaXRfb2JqZWN0X2Zyb21fb3Aod2Fsa19zdGF0ZSwgYXJnLCBvcGNvZGUsCi0JCQkJCQkJJm9ial9kZXNjKTsKLQkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQkJCWFjcGlfdXRfZGVsZXRlX29iamVjdF9kZXNjKG9ial9kZXNjKTsKLQkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLQkJCX0KLQkJfQotCi0JCS8qIFB1dCB0aGUgb3BlcmFuZCBvYmplY3Qgb24gdGhlIG9iamVjdCBzdGFjayAqLwotCi0JCXN0YXR1cyA9IGFjcGlfZHNfb2JqX3N0YWNrX3B1c2gob2JqX2Rlc2MsIHdhbGtfc3RhdGUpOwotCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotCQl9Ci0KLQkJQUNQSV9ERUJVR0dFUl9FWEVDKGFjcGlfZGJfZGlzcGxheV9hcmd1bWVudF9vYmplY3QKLQkJCQkgICAob2JqX2Rlc2MsIHdhbGtfc3RhdGUpKTsKLQl9Ci0KLQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX2RzX2NyZWF0ZV9vcGVyYW5kcwotICoKLSAqIFBBUkFNRVRFUlM6ICB3YWxrX3N0YXRlICAgICAgICAgIC0gQ3VycmVudCBzdGF0ZQotICogICAgICAgICAgICAgIGZpcnN0X2FyZyAgICAgICAgICAgLSBGaXJzdCBhcmd1bWVudCBvZiBhIHBhcnNlciBhcmd1bWVudCB0cmVlCi0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cwotICoKLSAqIERFU0NSSVBUSU9OOiBDb252ZXJ0IGFuIG9wZXJhdG9yJ3MgYXJndW1lbnRzIGZyb20gYSBwYXJzZSB0cmVlIGZvcm1hdCB0bwotICogICAgICAgICAgICAgIG5hbWVzcGFjZSBvYmplY3RzIGFuZCBwbGFjZSB0aG9zZSBhcmd1bWVudCBvYmplY3Qgb24gdGhlIG9iamVjdAotICogICAgICAgICAgICAgIHN0YWNrIGluIHByZXBhcmF0aW9uIGZvciBldmFsdWF0aW9uIGJ5IHRoZSBpbnRlcnByZXRlci4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1hY3BpX3N0YXR1cwotYWNwaV9kc19jcmVhdGVfb3BlcmFuZHMoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSwKLQkJCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpmaXJzdF9hcmcpCi17Ci0JYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7Ci0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKmFyZzsKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqYXJndW1lbnRzW0FDUElfT0JKX05VTV9PUEVSQU5EU107Ci0JdTMyIGFyZ19jb3VudCA9IDA7Ci0JdTMyIGluZGV4ID0gd2Fsa19zdGF0ZS0+bnVtX29wZXJhbmRzOwotCXUzMiBpOwotCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIoZHNfY3JlYXRlX29wZXJhbmRzLCBmaXJzdF9hcmcpOwotCi0JLyogR2V0IGFsbCBhcmd1bWVudHMgaW4gdGhlIGxpc3QgKi8KLQotCWFyZyA9IGZpcnN0X2FyZzsKLQl3aGlsZSAoYXJnKSB7Ci0JCWlmIChpbmRleCA+PSBBQ1BJX09CSl9OVU1fT1BFUkFORFMpIHsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfREFUQSk7Ci0JCX0KLQotCQlhcmd1bWVudHNbaW5kZXhdID0gYXJnOwotCQl3YWxrX3N0YXRlLT5vcGVyYW5kc1tpbmRleF0gPSBOVUxMOwotCi0JCS8qIE1vdmUgb24gdG8gbmV4dCBhcmd1bWVudCwgaWYgYW55ICovCi0KLQkJYXJnID0gYXJnLT5jb21tb24ubmV4dDsKLQkJYXJnX2NvdW50Kys7Ci0JCWluZGV4Kys7Ci0JfQotCi0JaW5kZXgtLTsKLQotCS8qIEl0IGlzIHRoZSBhcHByb3ByaWF0ZSBvcmRlciB0byBnZXQgb2JqZWN0cyBmcm9tIHRoZSBSZXN1bHQgc3RhY2sgKi8KLQotCWZvciAoaSA9IDA7IGkgPCBhcmdfY291bnQ7IGkrKykgewotCQlhcmcgPSBhcmd1bWVudHNbaW5kZXhdOwotCi0JCS8qIEZvcmNlIHRoZSBmaWxsaW5nIG9mIHRoZSBvcGVyYW5kIHN0YWNrIGluIGludmVyc2Ugb3JkZXIgKi8KLQotCQl3YWxrX3N0YXRlLT5vcGVyYW5kX2luZGV4ID0gKHU4KSBpbmRleDsKLQotCQlzdGF0dXMgPSBhY3BpX2RzX2NyZWF0ZV9vcGVyYW5kKHdhbGtfc3RhdGUsIGFyZywgaW5kZXgpOwotCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJCWdvdG8gY2xlYW51cDsKLQkJfQotCi0JCWluZGV4LS07Ci0KLQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9ESVNQQVRDSCwKLQkJCQkgICJBcmcgIyVkICglcCkgZG9uZSwgQXJnMT0lcFxuIiwgaW5kZXgsIGFyZywKLQkJCQkgIGZpcnN0X2FyZykpOwotCX0KLQotCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotCi0gICAgICBjbGVhbnVwOgotCS8qCi0JICogV2UgbXVzdCB1bmRvIGV2ZXJ5dGhpbmcgZG9uZSBhYm92ZTsgbWVhbmluZyB0aGF0IHdlIG11c3QKLQkgKiBwb3AgZXZlcnl0aGluZyBvZmYgb2YgdGhlIG9wZXJhbmQgc3RhY2sgYW5kIGRlbGV0ZSB0aG9zZQotCSAqIG9iamVjdHMKLQkgKi8KLQlhY3BpX2RzX29ial9zdGFja19wb3BfYW5kX2RlbGV0ZShhcmdfY291bnQsIHdhbGtfc3RhdGUpOwotCi0JQUNQSV9FWENFUFRJT04oKEFFX0lORk8sIHN0YXR1cywgIldoaWxlIGNyZWF0aW5nIEFyZyAlZCIsIGluZGV4KSk7Ci0JcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX2RzX2V2YWx1YXRlX25hbWVfcGF0aAotICoKLSAqIFBBUkFNRVRFUlM6ICB3YWxrX3N0YXRlICAgICAgLSBDdXJyZW50IHN0YXRlIG9mIHRoZSBwYXJzZSB0cmVlIHdhbGssCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIG9wY29kZSBvZiBjdXJyZW50IG9wZXJhdGlvbiBzaG91bGQgYmUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTUxfSU5UX05BTUVQQVRIX09QCi0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cwotICoKLSAqIERFU0NSSVBUSU9OOiBUcmFuc2xhdGUgdGhlIC1uYW1lX3BhdGgtIHBhcnNlIHRyZWUgb2JqZWN0IHRvIHRoZSBlcXVpdmFsZW50Ci0gKiAgICAgICAgICAgICAgaW50ZXJwcmV0ZXIgb2JqZWN0LCBjb252ZXJ0IGl0IHRvIHZhbHVlLCBpZiBuZWVkZWQsIGR1cGxpY2F0ZQotICogICAgICAgICAgICAgIGl0LCBpZiBuZWVkZWQsIGFuZCBwdXNoIGl0IG9udG8gdGhlIGN1cnJlbnQgcmVzdWx0IHN0YWNrLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1hY3BpX3N0YXR1cyBhY3BpX2RzX2V2YWx1YXRlX25hbWVfcGF0aChzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKQotewotCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOwotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpvcCA9IHdhbGtfc3RhdGUtPm9wOwotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKipvcGVyYW5kID0gJndhbGtfc3RhdGUtPm9wZXJhbmRzWzBdOwotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm5ld19vYmpfZGVzYzsKLQl1OCB0eXBlOwotCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIoZHNfZXZhbHVhdGVfbmFtZV9wYXRoLCB3YWxrX3N0YXRlKTsKLQotCWlmICghb3AtPmNvbW1vbi5wYXJlbnQpIHsKLQotCQkvKiBUaGlzIGhhcHBlbnMgYWZ0ZXIgY2VydGFpbiBleGNlcHRpb24gcHJvY2Vzc2luZyAqLwotCi0JCWdvdG8gZXhpdDsKLQl9Ci0KLQlpZiAoKG9wLT5jb21tb24ucGFyZW50LT5jb21tb24uYW1sX29wY29kZSA9PSBBTUxfUEFDS0FHRV9PUCkgfHwKLQkgICAgKG9wLT5jb21tb24ucGFyZW50LT5jb21tb24uYW1sX29wY29kZSA9PSBBTUxfVkFSX1BBQ0tBR0VfT1ApIHx8Ci0JICAgIChvcC0+Y29tbW9uLnBhcmVudC0+Y29tbW9uLmFtbF9vcGNvZGUgPT0gQU1MX1JFRl9PRl9PUCkpIHsKLQotCQkvKiBUQkQ6IFNob3VsZCB3ZSBzcGVjaWZ5IHRoaXMgZmVhdHVyZSBhcyBhIGJpdCBvZiBvcF9pbmZvLT5GbGFncyBvZiB0aGVzZSBvcGNvZGVzPyAqLwotCi0JCWdvdG8gZXhpdDsKLQl9Ci0KLQlzdGF0dXMgPSBhY3BpX2RzX2NyZWF0ZV9vcGVyYW5kKHdhbGtfc3RhdGUsIG9wLCAwKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJZ290byBleGl0OwotCX0KLQotCWlmIChvcC0+Y29tbW9uLmZsYWdzICYgQUNQSV9QQVJTRU9QX1RBUkdFVCkgewotCQluZXdfb2JqX2Rlc2MgPSAqb3BlcmFuZDsKLQkJZ290byBwdXNoX3Jlc3VsdDsKLQl9Ci0KLQl0eXBlID0gQUNQSV9HRVRfT0JKRUNUX1RZUEUoKm9wZXJhbmQpOwotCi0Jc3RhdHVzID0gYWNwaV9leF9yZXNvbHZlX3RvX3ZhbHVlKG9wZXJhbmQsIHdhbGtfc3RhdGUpOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlnb3RvIGV4aXQ7Ci0JfQotCi0JaWYgKHR5cGUgPT0gQUNQSV9UWVBFX0lOVEVHRVIpIHsKLQotCQkvKiBJdCB3YXMgaW5jcmVtZW50ZWQgYnkgYWNwaV9leF9yZXNvbHZlX3RvX3ZhbHVlICovCi0KLQkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKCpvcGVyYW5kKTsKLQotCQlzdGF0dXMgPQotCQkgICAgYWNwaV91dF9jb3B5X2lvYmplY3RfdG9faW9iamVjdCgqb3BlcmFuZCwgJm5ld19vYmpfZGVzYywKLQkJCQkJCSAgICB3YWxrX3N0YXRlKTsKLQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCQlnb3RvIGV4aXQ7Ci0JCX0KLQl9IGVsc2UgewotCQkvKgotCQkgKiBUaGUgb2JqZWN0IGVpdGhlciB3YXMgYW5ldyBjcmVhdGVkIG9yIGlzCi0JCSAqIGEgTmFtZXNwYWNlIG5vZGUgLSBkb24ndCBkZWNyZW1lbnQgaXQuCi0JCSAqLwotCQluZXdfb2JqX2Rlc2MgPSAqb3BlcmFuZDsKLQl9Ci0KLQkvKiBDbGVhbnVwIGZvciBuYW1lLXBhdGggb3BlcmFuZCAqLwotCi0Jc3RhdHVzID0gYWNwaV9kc19vYmpfc3RhY2tfcG9wKDEsIHdhbGtfc3RhdGUpOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQl3YWxrX3N0YXRlLT5yZXN1bHRfb2JqID0gbmV3X29ial9kZXNjOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi0gICAgICBwdXNoX3Jlc3VsdDoKLQotCXdhbGtfc3RhdGUtPnJlc3VsdF9vYmogPSBuZXdfb2JqX2Rlc2M7Ci0KLQlzdGF0dXMgPSBhY3BpX2RzX3Jlc3VsdF9wdXNoKHdhbGtfc3RhdGUtPnJlc3VsdF9vYmosIHdhbGtfc3RhdGUpOwotCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkgewotCi0JCS8qIEZvcmNlIHRvIHRha2UgaXQgZnJvbSBzdGFjayAqLwotCi0JCW9wLT5jb21tb24uZmxhZ3MgfD0gQUNQSV9QQVJTRU9QX0lOX1NUQUNLOwotCX0KLQotICAgICAgZXhpdDoKLQotCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2Rpc3BhdGNoZXIvZHN3ZXhlYy5jIGIvZHJpdmVycy9hY3BpL2Rpc3BhdGNoZXIvZHN3ZXhlYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTZmZTEyLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvYWNwaS9kaXNwYXRjaGVyL2Rzd2V4ZWMuYworKysgL2Rldi9udWxsCkBAIC0xLDc0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogTW9kdWxlIE5hbWU6IGRzd2V4ZWMgLSBEaXNwYXRjaGVyIG1ldGhvZCBleGVjdXRpb24gY2FsbGJhY2tzOwotICogICAgICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaCB0byBpbnRlcnByZXRlci4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA4LCBJbnRlbCBDb3JwLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAotICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgYXQgbWluaW11bSBhIGRpc2NsYWltZXIKLSAqICAgIHN1YnN0YW50aWFsbHkgc2ltaWxhciB0byB0aGUgIk5PIFdBUlJBTlRZIiBkaXNjbGFpbWVyIGJlbG93Ci0gKiAgICAoIkRpc2NsYWltZXIiKSBhbmQgYW55IHJlZGlzdHJpYnV0aW9uIG11c3QgYmUgY29uZGl0aW9uZWQgdXBvbgotICogICAgaW5jbHVkaW5nIGEgc3Vic3RhbnRpYWxseSBzaW1pbGFyIERpc2NsYWltZXIgcmVxdWlyZW1lbnQgZm9yIGZ1cnRoZXIKLSAqICAgIGJpbmFyeSByZWRpc3RyaWJ1dGlvbi4KLSAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcwotICogICAgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICogU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBOTyBXQVJSQU5UWQotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCi0gKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUwotICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcKLSAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQotICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgotICovCi0KLSNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KLSNpbmNsdWRlIDxhY3BpL2FjcGFyc2VyLmg+Ci0jaW5jbHVkZSA8YWNwaS9hbWxjb2RlLmg+Ci0jaW5jbHVkZSA8YWNwaS9hY2Rpc3BhdC5oPgotI2luY2x1ZGUgPGFjcGkvYWNpbnRlcnAuaD4KLSNpbmNsdWRlIDxhY3BpL2FjbmFtZXNwLmg+Ci0jaW5jbHVkZSA8YWNwaS9hY2RlYnVnLmg+Ci0KLSNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX0RJU1BBVENIRVIKLUFDUElfTU9EVUxFX05BTUUoImRzd2V4ZWMiKQotCi0vKgotICogRGlzcGF0Y2ggdGFibGUgZm9yIG9wY29kZSBjbGFzc2VzCi0gKi8KLXN0YXRpYyBBQ1BJX0VYRUNVVEVfT1AgYWNwaV9nYmxfb3BfdHlwZV9kaXNwYXRjaFtdID0gewotCWFjcGlfZXhfb3Bjb2RlXzBBXzBUXzFSLAotCWFjcGlfZXhfb3Bjb2RlXzFBXzBUXzBSLAotCWFjcGlfZXhfb3Bjb2RlXzFBXzBUXzFSLAotCWFjcGlfZXhfb3Bjb2RlXzFBXzFUXzBSLAotCWFjcGlfZXhfb3Bjb2RlXzFBXzFUXzFSLAotCWFjcGlfZXhfb3Bjb2RlXzJBXzBUXzBSLAotCWFjcGlfZXhfb3Bjb2RlXzJBXzBUXzFSLAotCWFjcGlfZXhfb3Bjb2RlXzJBXzFUXzFSLAotCWFjcGlfZXhfb3Bjb2RlXzJBXzJUXzFSLAotCWFjcGlfZXhfb3Bjb2RlXzNBXzBUXzBSLAotCWFjcGlfZXhfb3Bjb2RlXzNBXzFUXzFSLAotCWFjcGlfZXhfb3Bjb2RlXzZBXzBUXzFSCi19OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9kc19nZXRfcHJlZGljYXRlX3ZhbHVlCi0gKgotICogUEFSQU1FVEVSUzogIHdhbGtfc3RhdGUgICAgICAtIEN1cnJlbnQgc3RhdGUgb2YgdGhlIHBhcnNlIHRyZWUgd2FsawotICogICAgICAgICAgICAgIHJlc3VsdF9vYmogICAgICAtIGlmIG5vbi16ZXJvLCBwb3AgcmVzdWx0IGZyb20gcmVzdWx0IHN0YWNrCi0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cwotICoKLSAqIERFU0NSSVBUSU9OOiBHZXQgdGhlIHJlc3VsdCBvZiBhIHByZWRpY2F0ZSBldmFsdWF0aW9uCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWFjcGlfc3RhdHVzCi1hY3BpX2RzX2dldF9wcmVkaWNhdGVfdmFsdWUoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSwKLQkJCSAgICB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpyZXN1bHRfb2JqKQotewotCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOwotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjOwotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKmxvY2FsX29ial9kZXNjID0gTlVMTDsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKGRzX2dldF9wcmVkaWNhdGVfdmFsdWUsIHdhbGtfc3RhdGUpOwotCi0Jd2Fsa19zdGF0ZS0+Y29udHJvbF9zdGF0ZS0+Y29tbW9uLnN0YXRlID0gMDsKLQotCWlmIChyZXN1bHRfb2JqKSB7Ci0JCXN0YXR1cyA9IGFjcGlfZHNfcmVzdWx0X3BvcCgmb2JqX2Rlc2MsIHdhbGtfc3RhdGUpOwotCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJCUFDUElfRVhDRVBUSU9OKChBRV9JTkZPLCBzdGF0dXMsCi0JCQkJCSJDb3VsZCBub3QgZ2V0IHJlc3VsdCBmcm9tIHByZWRpY2F0ZSBldmFsdWF0aW9uIikpOwotCi0JCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLQkJfQotCX0gZWxzZSB7Ci0JCXN0YXR1cyA9IGFjcGlfZHNfY3JlYXRlX29wZXJhbmQod2Fsa19zdGF0ZSwgd2Fsa19zdGF0ZS0+b3AsIDApOwotCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotCQl9Ci0KLQkJc3RhdHVzID0KLQkJICAgIGFjcGlfZXhfcmVzb2x2ZV90b192YWx1ZSgmd2Fsa19zdGF0ZS0+b3BlcmFuZHNbMF0sCi0JCQkJCSAgICAgd2Fsa19zdGF0ZSk7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci0JCX0KLQotCQlvYmpfZGVzYyA9IHdhbGtfc3RhdGUtPm9wZXJhbmRzWzBdOwotCX0KLQotCWlmICghb2JqX2Rlc2MpIHsKLQkJQUNQSV9FUlJPUigoQUVfSU5GTywKLQkJCSAgICAiTm8gcHJlZGljYXRlIE9iakRlc2M9JXAgU3RhdGU9JXAiLAotCQkJICAgIG9ial9kZXNjLCB3YWxrX3N0YXRlKSk7Ci0KLQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9OT19PUEVSQU5EKTsKLQl9Ci0KLQkvKgotCSAqIFJlc3VsdCBvZiBwcmVkaWNhdGUgZXZhbHVhdGlvbiBtdXN0IGJlIGFuIEludGVnZXIKLQkgKiBvYmplY3QuIEltcGxpY2l0bHkgY29udmVydCB0aGUgYXJndW1lbnQgaWYgbmVjZXNzYXJ5LgotCSAqLwotCXN0YXR1cyA9IGFjcGlfZXhfY29udmVydF90b19pbnRlZ2VyKG9ial9kZXNjLCAmbG9jYWxfb2JqX2Rlc2MsIDE2KTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJZ290byBjbGVhbnVwOwotCX0KLQotCWlmIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRShsb2NhbF9vYmpfZGVzYykgIT0gQUNQSV9UWVBFX0lOVEVHRVIpIHsKLQkJQUNQSV9FUlJPUigoQUVfSU5GTywKLQkJCSAgICAiQmFkIHByZWRpY2F0ZSAobm90IGFuIGludGVnZXIpIE9iakRlc2M9JXAgU3RhdGU9JXAgVHlwZT0lWCIsCi0JCQkgICAgb2JqX2Rlc2MsIHdhbGtfc3RhdGUsCi0JCQkgICAgQUNQSV9HRVRfT0JKRUNUX1RZUEUob2JqX2Rlc2MpKSk7Ci0KLQkJc3RhdHVzID0gQUVfQU1MX09QRVJBTkRfVFlQRTsKLQkJZ290byBjbGVhbnVwOwotCX0KLQotCS8qIFRydW5jYXRlIHRoZSBwcmVkaWNhdGUgdG8gMzItYml0cyBpZiBuZWNlc3NhcnkgKi8KLQotCWFjcGlfZXhfdHJ1bmNhdGVfZm9yMzJiaXRfdGFibGUobG9jYWxfb2JqX2Rlc2MpOwotCi0JLyoKLQkgKiBTYXZlIHRoZSByZXN1bHQgb2YgdGhlIHByZWRpY2F0ZSBldmFsdWF0aW9uIG9uCi0JICogdGhlIGNvbnRyb2wgc3RhY2sKLQkgKi8KLQlpZiAobG9jYWxfb2JqX2Rlc2MtPmludGVnZXIudmFsdWUpIHsKLQkJd2Fsa19zdGF0ZS0+Y29udHJvbF9zdGF0ZS0+Y29tbW9uLnZhbHVlID0gVFJVRTsKLQl9IGVsc2UgewotCQkvKgotCQkgKiBQcmVkaWNhdGUgaXMgRkFMU0UsIHdlIHdpbGwganVzdCB0b3NzIHRoZQotCQkgKiByZXN0IG9mIHRoZSBwYWNrYWdlCi0JCSAqLwotCQl3YWxrX3N0YXRlLT5jb250cm9sX3N0YXRlLT5jb21tb24udmFsdWUgPSBGQUxTRTsKLQkJc3RhdHVzID0gQUVfQ1RSTF9GQUxTRTsKLQl9Ci0KLQkvKiBQcmVkaWNhdGUgY2FuIGJlIHVzZWQgZm9yIGFuIGltcGxpY2l0IHJldHVybiB2YWx1ZSAqLwotCi0JKHZvaWQpYWNwaV9kc19kb19pbXBsaWNpdF9yZXR1cm4obG9jYWxfb2JqX2Rlc2MsIHdhbGtfc3RhdGUsIFRSVUUpOwotCi0gICAgICBjbGVhbnVwOgotCi0JQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FWEVDLCAiQ29tcGxldGVkIGEgcHJlZGljYXRlIGV2YWw9JVggT3A9JXBcbiIsCi0JCQkgIHdhbGtfc3RhdGUtPmNvbnRyb2xfc3RhdGUtPmNvbW1vbi52YWx1ZSwKLQkJCSAgd2Fsa19zdGF0ZS0+b3ApKTsKLQotCS8qIEJyZWFrIHRvIGRlYnVnZ2VyIHRvIGRpc3BsYXkgcmVzdWx0ICovCi0KLQlBQ1BJX0RFQlVHR0VSX0VYRUMoYWNwaV9kYl9kaXNwbGF5X3Jlc3VsdF9vYmplY3QKLQkJCSAgIChsb2NhbF9vYmpfZGVzYywgd2Fsa19zdGF0ZSkpOwotCi0JLyoKLQkgKiBEZWxldGUgdGhlIHByZWRpY2F0ZSByZXN1bHQgb2JqZWN0ICh3ZSBrbm93IHRoYXQKLQkgKiB3ZSBkb24ndCBuZWVkIGl0IGFueW1vcmUpCi0JICovCi0JaWYgKGxvY2FsX29ial9kZXNjICE9IG9ial9kZXNjKSB7Ci0JCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZShsb2NhbF9vYmpfZGVzYyk7Ci0JfQotCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZShvYmpfZGVzYyk7Ci0KLQl3YWxrX3N0YXRlLT5jb250cm9sX3N0YXRlLT5jb21tb24uc3RhdGUgPSBBQ1BJX0NPTlRST0xfTk9STUFMOwotCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9kc19leGVjX2JlZ2luX29wCi0gKgotICogUEFSQU1FVEVSUzogIHdhbGtfc3RhdGUgICAgICAtIEN1cnJlbnQgc3RhdGUgb2YgdGhlIHBhcnNlIHRyZWUgd2FsawotICogICAgICAgICAgICAgIG91dF9vcCAgICAgICAgICAtIFdoZXJlIHRvIHJldHVybiBvcCBpZiBhIG5ldyBvbmUgaXMgY3JlYXRlZAotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKLSAqCi0gKiBERVNDUklQVElPTjogRGVzY2VuZGluZyBjYWxsYmFjayB1c2VkIGR1cmluZyB0aGUgZXhlY3V0aW9uIG9mIGNvbnRyb2wKLSAqICAgICAgICAgICAgICBtZXRob2RzLiAgVGhpcyBpcyB3aGVyZSBtb3N0IG9wZXJhdG9ycyBhbmQgb3BlcmFuZHMgYXJlCi0gKiAgICAgICAgICAgICAgZGlzcGF0Y2hlZCB0byB0aGUgaW50ZXJwcmV0ZXIuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWFjcGlfc3RhdHVzCi1hY3BpX2RzX2V4ZWNfYmVnaW5fb3Aoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSwKLQkJICAgICAgdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKipvdXRfb3ApCi17Ci0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKm9wOwotCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOwotCXUzMiBvcGNvZGVfY2xhc3M7Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUihkc19leGVjX2JlZ2luX29wLCB3YWxrX3N0YXRlKTsKLQotCW9wID0gd2Fsa19zdGF0ZS0+b3A7Ci0JaWYgKCFvcCkgewotCQlzdGF0dXMgPSBhY3BpX2RzX2xvYWQyX2JlZ2luX29wKHdhbGtfc3RhdGUsIG91dF9vcCk7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQkJZ290byBlcnJvcl9leGl0OwotCQl9Ci0KLQkJb3AgPSAqb3V0X29wOwotCQl3YWxrX3N0YXRlLT5vcCA9IG9wOwotCQl3YWxrX3N0YXRlLT5vcGNvZGUgPSBvcC0+Y29tbW9uLmFtbF9vcGNvZGU7Ci0JCXdhbGtfc3RhdGUtPm9wX2luZm8gPQotCQkgICAgYWNwaV9wc19nZXRfb3Bjb2RlX2luZm8ob3AtPmNvbW1vbi5hbWxfb3Bjb2RlKTsKLQotCQlpZiAoYWNwaV9uc19vcGVuc19zY29wZSh3YWxrX3N0YXRlLT5vcF9pbmZvLT5vYmplY3RfdHlwZSkpIHsKLQkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRElTUEFUQ0gsCi0JCQkJCSAgIiglcykgUG9wcGluZyBzY29wZSBmb3IgT3AgJXBcbiIsCi0JCQkJCSAgYWNwaV91dF9nZXRfdHlwZV9uYW1lKHdhbGtfc3RhdGUtPgotCQkJCQkJCQlvcF9pbmZvLT4KLQkJCQkJCQkJb2JqZWN0X3R5cGUpLAotCQkJCQkgIG9wKSk7Ci0KLQkJCXN0YXR1cyA9IGFjcGlfZHNfc2NvcGVfc3RhY2tfcG9wKHdhbGtfc3RhdGUpOwotCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCQkJZ290byBlcnJvcl9leGl0OwotCQkJfQotCQl9Ci0JfQotCi0JaWYgKG9wID09IHdhbGtfc3RhdGUtPm9yaWdpbikgewotCQlpZiAob3V0X29wKSB7Ci0JCQkqb3V0X29wID0gb3A7Ci0JCX0KLQotCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwotCX0KLQotCS8qCi0JICogSWYgdGhlIHByZXZpb3VzIG9wY29kZSB3YXMgYSBjb25kaXRpb25hbCwgdGhpcyBvcGNvZGUKLQkgKiBtdXN0IGJlIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGFzc29jaWF0ZWQgcHJlZGljYXRlLgotCSAqIFNhdmUgdGhpcyBrbm93bGVkZ2UgaW4gdGhlIGN1cnJlbnQgc2NvcGUgZGVzY3JpcHRvcgotCSAqLwotCWlmICgod2Fsa19zdGF0ZS0+Y29udHJvbF9zdGF0ZSkgJiYKLQkgICAgKHdhbGtfc3RhdGUtPmNvbnRyb2xfc3RhdGUtPmNvbW1vbi5zdGF0ZSA9PQotCSAgICAgQUNQSV9DT05UUk9MX0NPTkRJVElPTkFMX0VYRUNVVElORykpIHsKLQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FWEVDLAotCQkJCSAgIkV4ZWMgcHJlZGljYXRlIE9wPSVwIFN0YXRlPSVwXG4iLCBvcCwKLQkJCQkgIHdhbGtfc3RhdGUpKTsKLQotCQl3YWxrX3N0YXRlLT5jb250cm9sX3N0YXRlLT5jb21tb24uc3RhdGUgPQotCQkgICAgQUNQSV9DT05UUk9MX1BSRURJQ0FURV9FWEVDVVRJTkc7Ci0KLQkJLyogU2F2ZSBzdGFydCBvZiBwcmVkaWNhdGUgKi8KLQotCQl3YWxrX3N0YXRlLT5jb250cm9sX3N0YXRlLT5jb250cm9sLnByZWRpY2F0ZV9vcCA9IG9wOwotCX0KLQotCW9wY29kZV9jbGFzcyA9IHdhbGtfc3RhdGUtPm9wX2luZm8tPmNsYXNzOwotCi0JLyogV2Ugd2FudCB0byBzZW5kIG5hbWVwYXRocyB0byB0aGUgbG9hZCBjb2RlICovCi0KLQlpZiAob3AtPmNvbW1vbi5hbWxfb3Bjb2RlID09IEFNTF9JTlRfTkFNRVBBVEhfT1ApIHsKLQkJb3Bjb2RlX2NsYXNzID0gQU1MX0NMQVNTX05BTUVEX09CSkVDVDsKLQl9Ci0KLQkvKgotCSAqIEhhbmRsZSB0aGUgb3Bjb2RlIGJhc2VkIHVwb24gdGhlIG9wY29kZSB0eXBlCi0JICovCi0Jc3dpdGNoIChvcGNvZGVfY2xhc3MpIHsKLQljYXNlIEFNTF9DTEFTU19DT05UUk9MOgotCi0JCXN0YXR1cyA9IGFjcGlfZHNfZXhlY19iZWdpbl9jb250cm9sX29wKHdhbGtfc3RhdGUsIG9wKTsKLQkJYnJlYWs7Ci0KLQljYXNlIEFNTF9DTEFTU19OQU1FRF9PQkpFQ1Q6Ci0KLQkJaWYgKHdhbGtfc3RhdGUtPndhbGtfdHlwZSAmIEFDUElfV0FMS19NRVRIT0QpIHsKLQkJCS8qCi0JCQkgKiBGb3VuZCBhIG5hbWVkIG9iamVjdCBkZWNsYXJhdGlvbiBkdXJpbmcgbWV0aG9kIGV4ZWN1dGlvbjsKLQkJCSAqIHdlIG11c3QgZW50ZXIgdGhpcyBvYmplY3QgaW50byB0aGUgbmFtZXNwYWNlLiAgVGhlIGNyZWF0ZWQKLQkJCSAqIG9iamVjdCBpcyB0ZW1wb3JhcnkgYW5kIHdpbGwgYmUgZGVsZXRlZCB1cG9uIGNvbXBsZXRpb24gb2YKLQkJCSAqIHRoZSBleGVjdXRpb24gb2YgdGhpcyBtZXRob2QuCi0JCQkgKi8KLQkJCXN0YXR1cyA9IGFjcGlfZHNfbG9hZDJfYmVnaW5fb3Aod2Fsa19zdGF0ZSwgTlVMTCk7Ci0JCX0KLQotCQlicmVhazsKLQotCWNhc2UgQU1MX0NMQVNTX0VYRUNVVEU6Ci0JY2FzZSBBTUxfQ0xBU1NfQ1JFQVRFOgotCi0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQotCi0JLyogTm90aGluZyB0byBkbyBoZXJlIGR1cmluZyBtZXRob2QgZXhlY3V0aW9uICovCi0KLQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLQotICAgICAgZXJyb3JfZXhpdDoKLQlzdGF0dXMgPSBhY3BpX2RzX21ldGhvZF9lcnJvcihzdGF0dXMsIHdhbGtfc3RhdGUpOwotCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9kc19leGVjX2VuZF9vcAotICoKLSAqIFBBUkFNRVRFUlM6ICB3YWxrX3N0YXRlICAgICAgLSBDdXJyZW50IHN0YXRlIG9mIHRoZSBwYXJzZSB0cmVlIHdhbGsKLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IEFzY2VuZGluZyBjYWxsYmFjayB1c2VkIGR1cmluZyB0aGUgZXhlY3V0aW9uIG9mIGNvbnRyb2wKLSAqICAgICAgICAgICAgICBtZXRob2RzLiAgVGhlIG9ubHkgdGhpbmcgd2UgcmVhbGx5IG5lZWQgdG8gZG8gaGVyZSBpcyB0bwotICogICAgICAgICAgICAgIG5vdGljZSB0aGUgYmVnaW5uaW5nIG9mIElGLCBFTFNFLCBhbmQgV0hJTEUgYmxvY2tzLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1hY3BpX3N0YXR1cyBhY3BpX2RzX2V4ZWNfZW5kX29wKHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUpCi17Ci0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKm9wOwotCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOwotCXUzMiBvcF90eXBlOwotCXUzMiBvcF9jbGFzczsKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqbmV4dF9vcDsKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqZmlyc3RfYXJnOwotCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIoZHNfZXhlY19lbmRfb3AsIHdhbGtfc3RhdGUpOwotCi0Jb3AgPSB3YWxrX3N0YXRlLT5vcDsKLQlvcF90eXBlID0gd2Fsa19zdGF0ZS0+b3BfaW5mby0+dHlwZTsKLQlvcF9jbGFzcyA9IHdhbGtfc3RhdGUtPm9wX2luZm8tPmNsYXNzOwotCi0JaWYgKG9wX2NsYXNzID09IEFNTF9DTEFTU19VTktOT1dOKSB7Ci0JCUFDUElfRVJST1IoKEFFX0lORk8sICJVbmtub3duIG9wY29kZSAlWCIsCi0JCQkgICAgb3AtPmNvbW1vbi5hbWxfb3Bjb2RlKSk7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT1RfSU1QTEVNRU5URUQpOwotCX0KLQotCWZpcnN0X2FyZyA9IG9wLT5jb21tb24udmFsdWUuYXJnOwotCi0JLyogSW5pdCB0aGUgd2FsayBzdGF0ZSAqLwotCi0Jd2Fsa19zdGF0ZS0+bnVtX29wZXJhbmRzID0gMDsKLQl3YWxrX3N0YXRlLT5vcGVyYW5kX2luZGV4ID0gMDsKLQl3YWxrX3N0YXRlLT5yZXR1cm5fZGVzYyA9IE5VTEw7Ci0Jd2Fsa19zdGF0ZS0+cmVzdWx0X29iaiA9IE5VTEw7Ci0KLQkvKiBDYWxsIGRlYnVnZ2VyIGZvciBzaW5nbGUgc3RlcCBzdXBwb3J0IChERUJVRyBidWlsZCBvbmx5KSAqLwotCi0JQUNQSV9ERUJVR0dFUl9FWEVDKHN0YXR1cyA9Ci0JCQkgICBhY3BpX2RiX3NpbmdsZV9zdGVwKHdhbGtfc3RhdGUsIG9wLCBvcF9jbGFzcykpOwotCUFDUElfREVCVUdHRVJfRVhFQyhpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJCSAgIHJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpO30KLQkpIDsKLQotCS8qIERlY29kZSB0aGUgT3Bjb2RlIENsYXNzICovCi0KLQlzd2l0Y2ggKG9wX2NsYXNzKSB7Ci0JY2FzZSBBTUxfQ0xBU1NfQVJHVU1FTlQ6CS8qIENvbnN0YW50cywgbGl0ZXJhbHMsIGV0Yy4gKi8KLQotCQlpZiAod2Fsa19zdGF0ZS0+b3Bjb2RlID09IEFNTF9JTlRfTkFNRVBBVEhfT1ApIHsKLQkJCXN0YXR1cyA9IGFjcGlfZHNfZXZhbHVhdGVfbmFtZV9wYXRoKHdhbGtfc3RhdGUpOwotCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCQkJZ290byBjbGVhbnVwOwotCQkJfQotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBBTUxfQ0xBU1NfRVhFQ1VURToJLyogTW9zdCBvcGVyYXRvcnMgd2l0aCBhcmd1bWVudHMgKi8KLQotCQkvKiBCdWlsZCByZXNvbHZlZCBvcGVyYW5kIHN0YWNrICovCi0KLQkJc3RhdHVzID0gYWNwaV9kc19jcmVhdGVfb3BlcmFuZHMod2Fsa19zdGF0ZSwgZmlyc3RfYXJnKTsKLQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCQlnb3RvIGNsZWFudXA7Ci0JCX0KLQotCQkvKgotCQkgKiBBbGwgb3Bjb2RlcyByZXF1aXJlIG9wZXJhbmQgcmVzb2x1dGlvbiwgd2l0aCB0aGUgb25seSBleGNlcHRpb25zCi0JCSAqIGJlaW5nIHRoZSBvYmplY3RfdHlwZSBhbmQgc2l6ZV9vZiBvcGVyYXRvcnMuCi0JCSAqLwotCQlpZiAoISh3YWxrX3N0YXRlLT5vcF9pbmZvLT5mbGFncyAmIEFNTF9OT19PUEVSQU5EX1JFU09MVkUpKSB7Ci0KLQkJCS8qIFJlc29sdmUgYWxsIG9wZXJhbmRzICovCi0KLQkJCXN0YXR1cyA9IGFjcGlfZXhfcmVzb2x2ZV9vcGVyYW5kcyh3YWxrX3N0YXRlLT5vcGNvZGUsCi0JCQkJCQkJICAmKHdhbGtfc3RhdGUtPgotCQkJCQkJCSAgICBvcGVyYW5kcwotCQkJCQkJCSAgICBbd2Fsa19zdGF0ZS0+Ci0JCQkJCQkJICAgICBudW1fb3BlcmFuZHMgLSAxXSksCi0JCQkJCQkJICB3YWxrX3N0YXRlKTsKLQkJfQotCi0JCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkgewotCQkJLyoKLQkJCSAqIERpc3BhdGNoIHRoZSByZXF1ZXN0IHRvIHRoZSBhcHByb3ByaWF0ZSBpbnRlcnByZXRlciBoYW5kbGVyCi0JCQkgKiByb3V0aW5lLiAgVGhlcmUgaXMgb25lIHJvdXRpbmUgcGVyIG9wY29kZSAidHlwZSIgYmFzZWQgdXBvbiB0aGUKLQkJCSAqIG51bWJlciBvZiBvcGNvZGUgYXJndW1lbnRzIGFuZCByZXR1cm4gdHlwZS4KLQkJCSAqLwotCQkJc3RhdHVzID0KLQkJCSAgICBhY3BpX2dibF9vcF90eXBlX2Rpc3BhdGNoW29wX3R5cGVdICh3YWxrX3N0YXRlKTsKLQkJfSBlbHNlIHsKLQkJCS8qCi0JCQkgKiBUcmVhdCBjb25zdHJ1Y3RzIG9mIHRoZSBmb3JtICJTdG9yZShMb2NhbFgsTG9jYWxYKSIgYXMgbm9vcHMgd2hlbiB0aGUKLQkJCSAqIExvY2FsIGlzIHVuaW5pdGlhbGl6ZWQuCi0JCQkgKi8KLQkJCWlmICgoc3RhdHVzID09IEFFX0FNTF9VTklOSVRJQUxJWkVEX0xPQ0FMKSAmJgotCQkJICAgICh3YWxrX3N0YXRlLT5vcGNvZGUgPT0gQU1MX1NUT1JFX09QKSAmJgotCQkJICAgICh3YWxrX3N0YXRlLT5vcGVyYW5kc1swXS0+Y29tbW9uLnR5cGUgPT0KLQkJCSAgICAgQUNQSV9UWVBFX0xPQ0FMX1JFRkVSRU5DRSkKLQkJCSAgICAmJiAod2Fsa19zdGF0ZS0+b3BlcmFuZHNbMV0tPmNvbW1vbi50eXBlID09Ci0JCQkJQUNQSV9UWVBFX0xPQ0FMX1JFRkVSRU5DRSkKLQkJCSAgICAmJiAod2Fsa19zdGF0ZS0+b3BlcmFuZHNbMF0tPnJlZmVyZW5jZS5jbGFzcyA9PQotCQkJCXdhbGtfc3RhdGUtPm9wZXJhbmRzWzFdLT5yZWZlcmVuY2UuY2xhc3MpCi0JCQkgICAgJiYgKHdhbGtfc3RhdGUtPm9wZXJhbmRzWzBdLT5yZWZlcmVuY2UudmFsdWUgPT0KLQkJCQl3YWxrX3N0YXRlLT5vcGVyYW5kc1sxXS0+cmVmZXJlbmNlLnZhbHVlKSkgewotCQkJCXN0YXR1cyA9IEFFX09LOwotCQkJfSBlbHNlIHsKLQkJCQlBQ1BJX0VYQ0VQVElPTigoQUVfSU5GTywgc3RhdHVzLAotCQkJCQkJIldoaWxlIHJlc29sdmluZyBvcGVyYW5kcyBmb3IgWyVzXSIsCi0JCQkJCQlhY3BpX3BzX2dldF9vcGNvZGVfbmFtZQotCQkJCQkJKHdhbGtfc3RhdGUtPm9wY29kZSkpKTsKLQkJCX0KLQkJfQotCi0JCS8qIEFsd2F5cyBkZWxldGUgdGhlIGFyZ3VtZW50IG9iamVjdHMgYW5kIGNsZWFyIHRoZSBvcGVyYW5kIHN0YWNrICovCi0KLQkJYWNwaV9kc19jbGVhcl9vcGVyYW5kcyh3YWxrX3N0YXRlKTsKLQotCQkvKgotCQkgKiBJZiBhIHJlc3VsdCBvYmplY3Qgd2FzIHJldHVybmVkIGZyb20gYWJvdmUsIHB1c2ggaXQgb24gdGhlCi0JCSAqIGN1cnJlbnQgcmVzdWx0IHN0YWNrCi0JCSAqLwotCQlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykgJiYgd2Fsa19zdGF0ZS0+cmVzdWx0X29iaikgewotCQkJc3RhdHVzID0KLQkJCSAgICBhY3BpX2RzX3Jlc3VsdF9wdXNoKHdhbGtfc3RhdGUtPnJlc3VsdF9vYmosCi0JCQkJCQl3YWxrX3N0YXRlKTsKLQkJfQotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0KLQkJc3dpdGNoIChvcF90eXBlKSB7Ci0JCWNhc2UgQU1MX1RZUEVfQ09OVFJPTDoJLyogVHlwZSAxIG9wY29kZSwgSUYvRUxTRS9XSElMRS9OT09QICovCi0KLQkJCS8qIDEgT3BlcmFuZCwgMCBleHRlcm5hbF9yZXN1bHQsIDAgaW50ZXJuYWxfcmVzdWx0ICovCi0KLQkJCXN0YXR1cyA9IGFjcGlfZHNfZXhlY19lbmRfY29udHJvbF9vcCh3YWxrX3N0YXRlLCBvcCk7Ci0KLQkJCWJyZWFrOwotCi0JCWNhc2UgQU1MX1RZUEVfTUVUSE9EX0NBTEw6Ci0KLQkJCS8qCi0JCQkgKiBJZiB0aGUgbWV0aG9kIGlzIHJlZmVyZW5jZWQgZnJvbSB3aXRoaW4gYSBwYWNrYWdlCi0JCQkgKiBkZWNsYXJhdGlvbiwgaXQgaXMgbm90IGEgaW52b2NhdGlvbiBvZiB0aGUgbWV0aG9kLCBqdXN0Ci0JCQkgKiBhIHJlZmVyZW5jZSB0byBpdC4KLQkJCSAqLwotCQkJaWYgKChvcC0+YXNsLnBhcmVudCkgJiYKLQkJCSAgICAoKG9wLT5hc2wucGFyZW50LT5hc2wuYW1sX29wY29kZSA9PSBBTUxfUEFDS0FHRV9PUCkKLQkJCSAgICAgfHwgKG9wLT5hc2wucGFyZW50LT5hc2wuYW1sX29wY29kZSA9PQotCQkJCSBBTUxfVkFSX1BBQ0tBR0VfT1ApKSkgewotCQkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRElTUEFUQ0gsCi0JCQkJCQkgICJNZXRob2QgUmVmZXJlbmNlIGluIGEgUGFja2FnZSwgT3A9JXBcbiIsCi0JCQkJCQkgIG9wKSk7Ci0KLQkJCQlvcC0+Y29tbW9uLm5vZGUgPQotCQkJCSAgICAoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKilvcC0+YXNsLnZhbHVlLgotCQkJCSAgICBhcmctPmFzbC5ub2RlOwotCQkJCWFjcGlfdXRfYWRkX3JlZmVyZW5jZShvcC0+YXNsLnZhbHVlLmFyZy0+YXNsLgotCQkJCQkJICAgICAgbm9kZS0+b2JqZWN0KTsKLQkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwotCQkJfQotCi0JCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0RJU1BBVENILAotCQkJCQkgICJNZXRob2QgaW52b2NhdGlvbiwgT3A9JXBcbiIsIG9wKSk7Ci0KLQkJCS8qCi0JCQkgKiAoQU1MX01FVEhPRENBTEwpIE9wLT5Bc2wuVmFsdWUuQXJnLT5Bc2wuTm9kZSBjb250YWlucwotCQkJICogdGhlIG1ldGhvZCBOb2RlIHBvaW50ZXIKLQkJCSAqLwotCQkJLyogbmV4dF9vcCBwb2ludHMgdG8gdGhlIG9wIHRoYXQgaG9sZHMgdGhlIG1ldGhvZCBuYW1lICovCi0KLQkJCW5leHRfb3AgPSBmaXJzdF9hcmc7Ci0KLQkJCS8qIG5leHRfb3AgcG9pbnRzIHRvIGZpcnN0IGFyZ3VtZW50IG9wICovCi0KLQkJCW5leHRfb3AgPSBuZXh0X29wLT5jb21tb24ubmV4dDsKLQotCQkJLyoKLQkJCSAqIEdldCB0aGUgbWV0aG9kJ3MgYXJndW1lbnRzIGFuZCBwdXQgdGhlbSBvbiB0aGUgb3BlcmFuZCBzdGFjawotCQkJICovCi0JCQlzdGF0dXMgPSBhY3BpX2RzX2NyZWF0ZV9vcGVyYW5kcyh3YWxrX3N0YXRlLCBuZXh0X29wKTsKLQkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQkJCWJyZWFrOwotCQkJfQotCi0JCQkvKgotCQkJICogU2luY2UgdGhlIG9wZXJhbmRzIHdpbGwgYmUgcGFzc2VkIHRvIGFub3RoZXIgY29udHJvbCBtZXRob2QsCi0JCQkgKiB3ZSBtdXN0IHJlc29sdmUgYWxsIGxvY2FsIHJlZmVyZW5jZXMgaGVyZSAoTG9jYWwgdmFyaWFibGVzLAotCQkJICogYXJndW1lbnRzIHRvICp0aGlzKiBtZXRob2QsIGV0Yy4pCi0JCQkgKi8KLQkJCXN0YXR1cyA9IGFjcGlfZHNfcmVzb2x2ZV9vcGVyYW5kcyh3YWxrX3N0YXRlKTsKLQkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCi0JCQkJLyogT24gZXJyb3IsIGNsZWFyIGFsbCByZXNvbHZlZCBvcGVyYW5kcyAqLwotCi0JCQkJYWNwaV9kc19jbGVhcl9vcGVyYW5kcyh3YWxrX3N0YXRlKTsKLQkJCQlicmVhazsKLQkJCX0KLQotCQkJLyoKLQkJCSAqIFRlbGwgdGhlIHdhbGsgbG9vcCB0byBwcmVlbXB0IHRoaXMgcnVubmluZyBtZXRob2QgYW5kCi0JCQkgKiBleGVjdXRlIHRoZSBuZXcgbWV0aG9kCi0JCQkgKi8KLQkJCXN0YXR1cyA9IEFFX0NUUkxfVFJBTlNGRVI7Ci0KLQkJCS8qCi0JCQkgKiBSZXR1cm4gbm93OyB3ZSBkb24ndCB3YW50IHRvIGRpc3R1cmIgYW55dGhpbmcsCi0JCQkgKiBlc3BlY2lhbGx5IHRoZSBvcGVyYW5kIGNvdW50IQotCQkJICovCi0JCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLQotCQljYXNlIEFNTF9UWVBFX0NSRUFURV9GSUVMRDoKLQotCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FWEVDLAotCQkJCQkgICJFeGVjdXRpbmcgQ3JlYXRlRmllbGQgQnVmZmVyL0luZGV4IE9wPSVwXG4iLAotCQkJCQkgIG9wKSk7Ci0KLQkJCXN0YXR1cyA9IGFjcGlfZHNfbG9hZDJfZW5kX29wKHdhbGtfc3RhdGUpOwotCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCXN0YXR1cyA9Ci0JCQkgICAgYWNwaV9kc19ldmFsX2J1ZmZlcl9maWVsZF9vcGVyYW5kcyh3YWxrX3N0YXRlLCBvcCk7Ci0JCQlicmVhazsKLQotCQljYXNlIEFNTF9UWVBFX0NSRUFURV9PQkpFQ1Q6Ci0KLQkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVhFQywKLQkJCQkJICAiRXhlY3V0aW5nIENyZWF0ZU9iamVjdCAoQnVmZmVyL1BhY2thZ2UpIE9wPSVwXG4iLAotCQkJCQkgIG9wKSk7Ci0KLQkJCXN3aXRjaCAob3AtPmNvbW1vbi5wYXJlbnQtPmNvbW1vbi5hbWxfb3Bjb2RlKSB7Ci0JCQljYXNlIEFNTF9OQU1FX09QOgotCi0JCQkJLyoKLQkJCQkgKiBQdXQgdGhlIE5vZGUgb24gdGhlIG9iamVjdCBzdGFjayAoQ29udGFpbnMgdGhlIEFDUEkgTmFtZQotCQkJCSAqIG9mIHRoaXMgb2JqZWN0KQotCQkJCSAqLwotCQkJCXdhbGtfc3RhdGUtPm9wZXJhbmRzWzBdID0KLQkJCQkgICAgKHZvaWQgKilvcC0+Y29tbW9uLnBhcmVudC0+Y29tbW9uLm5vZGU7Ci0JCQkJd2Fsa19zdGF0ZS0+bnVtX29wZXJhbmRzID0gMTsKLQotCQkJCXN0YXR1cyA9IGFjcGlfZHNfY3JlYXRlX25vZGUod2Fsa19zdGF0ZSwKLQkJCQkJCQkgICAgIG9wLT5jb21tb24ucGFyZW50LT4KLQkJCQkJCQkgICAgIGNvbW1vbi5ub2RlLAotCQkJCQkJCSAgICAgb3AtPmNvbW1vbi5wYXJlbnQpOwotCQkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQkJCQlicmVhazsKLQkJCQl9Ci0KLQkJCQkvKiBGYWxsIHRocm91Z2ggKi8KLQkJCQkvKmxpbnQgLWZhbGx0aHJvdWdoICovCi0KLQkJCWNhc2UgQU1MX0lOVF9FVkFMX1NVQlRSRUVfT1A6Ci0KLQkJCQlzdGF0dXMgPQotCQkJCSAgICBhY3BpX2RzX2V2YWxfZGF0YV9vYmplY3Rfb3BlcmFuZHMKLQkJCQkgICAgKHdhbGtfc3RhdGUsIG9wLAotCQkJCSAgICAgYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0KG9wLT5jb21tb24uCi0JCQkJCQkJCSBwYXJlbnQtPmNvbW1vbi4KLQkJCQkJCQkJIG5vZGUpKTsKLQkJCQlicmVhazsKLQotCQkJZGVmYXVsdDoKLQotCQkJCXN0YXR1cyA9Ci0JCQkJICAgIGFjcGlfZHNfZXZhbF9kYXRhX29iamVjdF9vcGVyYW5kcwotCQkJCSAgICAod2Fsa19zdGF0ZSwgb3AsIE5VTEwpOwotCQkJCWJyZWFrOwotCQkJfQotCi0JCQkvKgotCQkJICogSWYgYSByZXN1bHQgb2JqZWN0IHdhcyByZXR1cm5lZCBmcm9tIGFib3ZlLCBwdXNoIGl0IG9uIHRoZQotCQkJICogY3VycmVudCByZXN1bHQgc3RhY2sKLQkJCSAqLwotCQkJaWYgKHdhbGtfc3RhdGUtPnJlc3VsdF9vYmopIHsKLQkJCQlzdGF0dXMgPQotCQkJCSAgICBhY3BpX2RzX3Jlc3VsdF9wdXNoKHdhbGtfc3RhdGUtPnJlc3VsdF9vYmosCi0JCQkJCQkJd2Fsa19zdGF0ZSk7Ci0JCQl9Ci0JCQlicmVhazsKLQotCQljYXNlIEFNTF9UWVBFX05BTUVEX0ZJRUxEOgotCQljYXNlIEFNTF9UWVBFX05BTUVEX0NPTVBMRVg6Ci0JCWNhc2UgQU1MX1RZUEVfTkFNRURfU0lNUExFOgotCQljYXNlIEFNTF9UWVBFX05BTUVEX05PX09CSjoKLQotCQkJc3RhdHVzID0gYWNwaV9kc19sb2FkMl9lbmRfb3Aod2Fsa19zdGF0ZSk7Ci0JCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJCQlicmVhazsKLQkJCX0KLQotCQkJaWYgKG9wLT5jb21tb24uYW1sX29wY29kZSA9PSBBTUxfUkVHSU9OX09QKSB7Ci0JCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FWEVDLAotCQkJCQkJICAiRXhlY3V0aW5nIE9wUmVnaW9uIEFkZHJlc3MvTGVuZ3RoIE9wPSVwXG4iLAotCQkJCQkJICBvcCkpOwotCi0JCQkJc3RhdHVzID0KLQkJCQkgICAgYWNwaV9kc19ldmFsX3JlZ2lvbl9vcGVyYW5kcyh3YWxrX3N0YXRlLAotCQkJCQkJCQkgb3ApOwotCQkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKG9wLT5jb21tb24uYW1sX29wY29kZSA9PSBBTUxfREFUQV9SRUdJT05fT1ApIHsKLQkJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VYRUMsCi0JCQkJCQkgICJFeGVjdXRpbmcgRGF0YVRhYmxlUmVnaW9uIFN0cmluZ3MgT3A9JXBcbiIsCi0JCQkJCQkgIG9wKSk7Ci0KLQkJCQlzdGF0dXMgPQotCQkJCSAgICBhY3BpX2RzX2V2YWxfdGFibGVfcmVnaW9uX29wZXJhbmRzCi0JCQkJICAgICh3YWxrX3N0YXRlLCBvcCk7Ci0JCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAob3AtPmNvbW1vbi5hbWxfb3Bjb2RlID09IEFNTF9CQU5LX0ZJRUxEX09QKSB7Ci0JCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FWEVDLAotCQkJCQkJICAiRXhlY3V0aW5nIEJhbmtGaWVsZCBPcD0lcFxuIiwKLQkJCQkJCSAgb3ApKTsKLQotCQkJCXN0YXR1cyA9Ci0JCQkJICAgIGFjcGlfZHNfZXZhbF9iYW5rX2ZpZWxkX29wZXJhbmRzKHdhbGtfc3RhdGUsCi0JCQkJCQkJCSAgICAgb3ApOwotCQkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQlicmVhazsKLQotCQljYXNlIEFNTF9UWVBFX1VOREVGSU5FRDoKLQotCQkJQUNQSV9FUlJPUigoQUVfSU5GTywKLQkJCQkgICAgIlVuZGVmaW5lZCBvcGNvZGUgdHlwZSBPcD0lcCIsIG9wKSk7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9UX0lNUExFTUVOVEVEKTsKLQotCQljYXNlIEFNTF9UWVBFX0JPR1VTOgotCi0JCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0RJU1BBVENILAotCQkJCQkgICJJbnRlcm5hbCBvcGNvZGU9JVggdHlwZSBPcD0lcFxuIiwKLQkJCQkJICB3YWxrX3N0YXRlLT5vcGNvZGUsIG9wKSk7Ci0JCQlicmVhazsKLQotCQlkZWZhdWx0OgotCi0JCQlBQ1BJX0VSUk9SKChBRV9JTkZPLAotCQkJCSAgICAiVW5pbXBsZW1lbnRlZCBvcGNvZGUsIGNsYXNzPSVYIHR5cGU9JVggT3Bjb2RlPSVYIE9wPSVwIiwKLQkJCQkgICAgb3BfY2xhc3MsIG9wX3R5cGUsIG9wLT5jb21tb24uYW1sX29wY29kZSwKLQkJCQkgICAgb3ApKTsKLQotCQkJc3RhdHVzID0gQUVfTk9UX0lNUExFTUVOVEVEOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIEFDUEkgMi4wIHN1cHBvcnQgZm9yIDY0LWJpdCBpbnRlZ2VyczogVHJ1bmNhdGUgbnVtZXJpYwotCSAqIHJlc3VsdCB2YWx1ZSBpZiB3ZSBhcmUgZXhlY3V0aW5nIGZyb20gYSAzMi1iaXQgQUNQSSB0YWJsZQotCSAqLwotCWFjcGlfZXhfdHJ1bmNhdGVfZm9yMzJiaXRfdGFibGUod2Fsa19zdGF0ZS0+cmVzdWx0X29iaik7Ci0KLQkvKgotCSAqIENoZWNrIGlmIHdlIGp1c3QgY29tcGxldGVkIHRoZSBldmFsdWF0aW9uIG9mIGEKLQkgKiBjb25kaXRpb25hbCBwcmVkaWNhdGUKLQkgKi8KLQlpZiAoKEFDUElfU1VDQ0VTUyhzdGF0dXMpKSAmJgotCSAgICAod2Fsa19zdGF0ZS0+Y29udHJvbF9zdGF0ZSkgJiYKLQkgICAgKHdhbGtfc3RhdGUtPmNvbnRyb2xfc3RhdGUtPmNvbW1vbi5zdGF0ZSA9PQotCSAgICAgQUNQSV9DT05UUk9MX1BSRURJQ0FURV9FWEVDVVRJTkcpICYmCi0JICAgICh3YWxrX3N0YXRlLT5jb250cm9sX3N0YXRlLT5jb250cm9sLnByZWRpY2F0ZV9vcCA9PSBvcCkpIHsKLQkJc3RhdHVzID0KLQkJICAgIGFjcGlfZHNfZ2V0X3ByZWRpY2F0ZV92YWx1ZSh3YWxrX3N0YXRlLAotCQkJCQkJd2Fsa19zdGF0ZS0+cmVzdWx0X29iaik7Ci0JCXdhbGtfc3RhdGUtPnJlc3VsdF9vYmogPSBOVUxMOwotCX0KLQotICAgICAgY2xlYW51cDoKLQotCWlmICh3YWxrX3N0YXRlLT5yZXN1bHRfb2JqKSB7Ci0KLQkJLyogQnJlYWsgdG8gZGVidWdnZXIgdG8gZGlzcGxheSByZXN1bHQgKi8KLQotCQlBQ1BJX0RFQlVHR0VSX0VYRUMoYWNwaV9kYl9kaXNwbGF5X3Jlc3VsdF9vYmplY3QKLQkJCQkgICAod2Fsa19zdGF0ZS0+cmVzdWx0X29iaiwgd2Fsa19zdGF0ZSkpOwotCi0JCS8qCi0JCSAqIERlbGV0ZSB0aGUgcmVzdWx0IG9wIGlmIGFuZCBvbmx5IGlmOgotCQkgKiBQYXJlbnQgd2lsbCBub3QgdXNlIHRoZSByZXN1bHQgLS0gc3VjaCBhcyBhbnkKLQkJICogbm9uLW5lc3RlZCB0eXBlMiBvcCBpbiBhIG1ldGhvZCAocGFyZW50IHdpbGwgYmUgbWV0aG9kKQotCQkgKi8KLQkJYWNwaV9kc19kZWxldGVfcmVzdWx0X2lmX25vdF91c2VkKG9wLCB3YWxrX3N0YXRlLT5yZXN1bHRfb2JqLAotCQkJCQkJICB3YWxrX3N0YXRlKTsKLQl9Ci0jaWZkZWYgX1VOREVSX0RFVkVMT1BNRU5UCi0KLQlpZiAod2Fsa19zdGF0ZS0+cGFyc2VyX3N0YXRlLmFtbCA9PSB3YWxrX3N0YXRlLT5wYXJzZXJfc3RhdGUuYW1sX2VuZCkgewotCQlhY3BpX2RiX21ldGhvZF9lbmQod2Fsa19zdGF0ZSk7Ci0JfQotI2VuZGlmCi0KLQkvKiBJbnZva2UgZXhjZXB0aW9uIGhhbmRsZXIgb24gZXJyb3IgKi8KLQotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlzdGF0dXMgPSBhY3BpX2RzX21ldGhvZF9lcnJvcihzdGF0dXMsIHdhbGtfc3RhdGUpOwotCX0KLQotCS8qIEFsd2F5cyBjbGVhciB0aGUgb2JqZWN0IHN0YWNrICovCi0KLQl3YWxrX3N0YXRlLT5udW1fb3BlcmFuZHMgPSAwOwotCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2Rpc3BhdGNoZXIvZHN3bG9hZC5jIGIvZHJpdmVycy9hY3BpL2Rpc3BhdGNoZXIvZHN3bG9hZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZmY3YTNlLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvYWNwaS9kaXNwYXRjaGVyL2Rzd2xvYWQuYworKysgL2Rldi9udWxsCkBAIC0xLDEyMDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIE1vZHVsZSBOYW1lOiBkc3dsb2FkIC0gRGlzcGF0Y2hlciBuYW1lc3BhY2UgbG9hZCBjYWxsYmFja3MKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA4LCBJbnRlbCBDb3JwLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAotICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgYXQgbWluaW11bSBhIGRpc2NsYWltZXIKLSAqICAgIHN1YnN0YW50aWFsbHkgc2ltaWxhciB0byB0aGUgIk5PIFdBUlJBTlRZIiBkaXNjbGFpbWVyIGJlbG93Ci0gKiAgICAoIkRpc2NsYWltZXIiKSBhbmQgYW55IHJlZGlzdHJpYnV0aW9uIG11c3QgYmUgY29uZGl0aW9uZWQgdXBvbgotICogICAgaW5jbHVkaW5nIGEgc3Vic3RhbnRpYWxseSBzaW1pbGFyIERpc2NsYWltZXIgcmVxdWlyZW1lbnQgZm9yIGZ1cnRoZXIKLSAqICAgIGJpbmFyeSByZWRpc3RyaWJ1dGlvbi4KLSAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcwotICogICAgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICogU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBOTyBXQVJSQU5UWQotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCi0gKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUwotICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcKLSAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQotICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgotICovCi0KLSNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KLSNpbmNsdWRlIDxhY3BpL2FjcGFyc2VyLmg+Ci0jaW5jbHVkZSA8YWNwaS9hbWxjb2RlLmg+Ci0jaW5jbHVkZSA8YWNwaS9hY2Rpc3BhdC5oPgotI2luY2x1ZGUgPGFjcGkvYWNpbnRlcnAuaD4KLSNpbmNsdWRlIDxhY3BpL2FjbmFtZXNwLmg+Ci0jaW5jbHVkZSA8YWNwaS9hY2V2ZW50cy5oPgotCi0jaWZkZWYgQUNQSV9BU0xfQ09NUElMRVIKLSNpbmNsdWRlIDxhY3BpL2FjZGlzYXNtLmg+Ci0jZW5kaWYKLQotI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfRElTUEFUQ0hFUgotQUNQSV9NT0RVTEVfTkFNRSgiZHN3bG9hZCIpCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfZHNfaW5pdF9jYWxsYmFja3MKLSAqCi0gKiBQQVJBTUVURVJTOiAgd2Fsa19zdGF0ZSAgICAgIC0gQ3VycmVudCBzdGF0ZSBvZiB0aGUgcGFyc2UgdHJlZSB3YWxrCi0gKiAgICAgICAgICAgICAgcGFzc19udW1iZXIgICAgIC0gMSwgMiwgb3IgMwotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKLSAqCi0gKiBERVNDUklQVElPTjogSW5pdCB3YWxrIHN0YXRlIGNhbGxiYWNrcwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1hY3BpX3N0YXR1cwotYWNwaV9kc19pbml0X2NhbGxiYWNrcyhzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlLCB1MzIgcGFzc19udW1iZXIpCi17Ci0KLQlzd2l0Y2ggKHBhc3NfbnVtYmVyKSB7Ci0JY2FzZSAxOgotCQl3YWxrX3N0YXRlLT5wYXJzZV9mbGFncyA9IEFDUElfUEFSU0VfTE9BRF9QQVNTMSB8Ci0JCSAgICBBQ1BJX1BBUlNFX0RFTEVURV9UUkVFOwotCQl3YWxrX3N0YXRlLT5kZXNjZW5kaW5nX2NhbGxiYWNrID0gYWNwaV9kc19sb2FkMV9iZWdpbl9vcDsKLQkJd2Fsa19zdGF0ZS0+YXNjZW5kaW5nX2NhbGxiYWNrID0gYWNwaV9kc19sb2FkMV9lbmRfb3A7Ci0JCWJyZWFrOwotCi0JY2FzZSAyOgotCQl3YWxrX3N0YXRlLT5wYXJzZV9mbGFncyA9IEFDUElfUEFSU0VfTE9BRF9QQVNTMSB8Ci0JCSAgICBBQ1BJX1BBUlNFX0RFTEVURV9UUkVFOwotCQl3YWxrX3N0YXRlLT5kZXNjZW5kaW5nX2NhbGxiYWNrID0gYWNwaV9kc19sb2FkMl9iZWdpbl9vcDsKLQkJd2Fsa19zdGF0ZS0+YXNjZW5kaW5nX2NhbGxiYWNrID0gYWNwaV9kc19sb2FkMl9lbmRfb3A7Ci0JCWJyZWFrOwotCi0JY2FzZSAzOgotI2lmbmRlZiBBQ1BJX05PX01FVEhPRF9FWEVDVVRJT04KLQkJd2Fsa19zdGF0ZS0+cGFyc2VfZmxhZ3MgfD0gQUNQSV9QQVJTRV9FWEVDVVRFIHwKLQkJICAgIEFDUElfUEFSU0VfREVMRVRFX1RSRUU7Ci0JCXdhbGtfc3RhdGUtPmRlc2NlbmRpbmdfY2FsbGJhY2sgPSBhY3BpX2RzX2V4ZWNfYmVnaW5fb3A7Ci0JCXdhbGtfc3RhdGUtPmFzY2VuZGluZ19jYWxsYmFjayA9IGFjcGlfZHNfZXhlY19lbmRfb3A7Ci0jZW5kaWYKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlyZXR1cm4gKEFFX0JBRF9QQVJBTUVURVIpOwotCX0KLQotCXJldHVybiAoQUVfT0spOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX2RzX2xvYWQxX2JlZ2luX29wCi0gKgotICogUEFSQU1FVEVSUzogIHdhbGtfc3RhdGUgICAgICAtIEN1cnJlbnQgc3RhdGUgb2YgdGhlIHBhcnNlIHRyZWUgd2FsawotICogICAgICAgICAgICAgIG91dF9vcCAgICAgICAgICAtIFdoZXJlIHRvIHJldHVybiBvcCBpZiBhIG5ldyBvbmUgaXMgY3JlYXRlZAotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKLSAqCi0gKiBERVNDUklQVElPTjogRGVzY2VuZGluZyBjYWxsYmFjayB1c2VkIGR1cmluZyB0aGUgbG9hZGluZyBvZiBBQ1BJIHRhYmxlcy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1hY3BpX3N0YXR1cwotYWNwaV9kc19sb2FkMV9iZWdpbl9vcChzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICogd2Fsa19zdGF0ZSwKLQkJICAgICAgIHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICoqIG91dF9vcCkKLXsKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqb3A7Ci0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGU7Ci0JYWNwaV9zdGF0dXMgc3RhdHVzOwotCWFjcGlfb2JqZWN0X3R5cGUgb2JqZWN0X3R5cGU7Ci0JY2hhciAqcGF0aDsKLQl1MzIgZmxhZ3M7Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGRzX2xvYWQxX2JlZ2luX29wKTsKLQotCW9wID0gd2Fsa19zdGF0ZS0+b3A7Ci0JQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9ESVNQQVRDSCwgIk9wPSVwIFN0YXRlPSVwXG4iLCBvcCwKLQkJCSAgd2Fsa19zdGF0ZSkpOwotCi0JLyogV2UgYXJlIG9ubHkgaW50ZXJlc3RlZCBpbiBvcGNvZGVzIHRoYXQgaGF2ZSBhbiBhc3NvY2lhdGVkIG5hbWUgKi8KLQotCWlmIChvcCkgewotCQlpZiAoISh3YWxrX3N0YXRlLT5vcF9pbmZvLT5mbGFncyAmIEFNTF9OQU1FRCkpIHsKLQkJCSpvdXRfb3AgPSBvcDsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7Ci0JCX0KLQotCQkvKiBDaGVjayBpZiB0aGlzIG9iamVjdCBoYXMgYWxyZWFkeSBiZWVuIGluc3RhbGxlZCBpbiB0aGUgbmFtZXNwYWNlICovCi0KLQkJaWYgKG9wLT5jb21tb24ubm9kZSkgewotCQkJKm91dF9vcCA9IG9wOwotCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKLQkJfQotCX0KLQotCXBhdGggPSBhY3BpX3BzX2dldF9uZXh0X25hbWVzdHJpbmcoJndhbGtfc3RhdGUtPnBhcnNlcl9zdGF0ZSk7Ci0KLQkvKiBNYXAgdGhlIHJhdyBvcGNvZGUgaW50byBhbiBpbnRlcm5hbCBvYmplY3QgdHlwZSAqLwotCi0Jb2JqZWN0X3R5cGUgPSB3YWxrX3N0YXRlLT5vcF9pbmZvLT5vYmplY3RfdHlwZTsKLQotCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRElTUEFUQ0gsCi0JCQkgICJTdGF0ZT0lcCBPcD0lcCBbJXNdXG4iLCB3YWxrX3N0YXRlLCBvcCwKLQkJCSAgYWNwaV91dF9nZXRfdHlwZV9uYW1lKG9iamVjdF90eXBlKSkpOwotCi0Jc3dpdGNoICh3YWxrX3N0YXRlLT5vcGNvZGUpIHsKLQljYXNlIEFNTF9TQ09QRV9PUDoKLQotCQkvKgotCQkgKiBUaGUgdGFyZ2V0IG5hbWUgb2YgdGhlIFNjb3BlKCkgb3BlcmF0b3IgbXVzdCBleGlzdCBhdCB0aGlzIHBvaW50IHNvCi0JCSAqIHRoYXQgd2UgY2FuIGFjdHVhbGx5IG9wZW4gdGhlIHNjb3BlIHRvIGVudGVyIG5ldyBuYW1lcyB1bmRlcm5lYXRoIGl0LgotCQkgKiBBbGxvdyBzZWFyY2gtdG8tcm9vdCBmb3Igc2luZ2xlIG5hbWVzZWdzLgotCQkgKi8KLQkJc3RhdHVzID0KLQkJICAgIGFjcGlfbnNfbG9va3VwKHdhbGtfc3RhdGUtPnNjb3BlX2luZm8sIHBhdGgsIG9iamVjdF90eXBlLAotCQkJCSAgIEFDUElfSU1PREVfRVhFQ1VURSwgQUNQSV9OU19TRUFSQ0hfUEFSRU5ULAotCQkJCSAgIHdhbGtfc3RhdGUsICYobm9kZSkpOwotI2lmZGVmIEFDUElfQVNMX0NPTVBJTEVSCi0JCWlmIChzdGF0dXMgPT0gQUVfTk9UX0ZPVU5EKSB7Ci0JCQkvKgotCQkJICogVGFibGUgZGlzYXNzZW1ibHk6Ci0JCQkgKiBUYXJnZXQgb2YgU2NvcGUoKSBub3QgZm91bmQuIEdlbmVyYXRlIGFuIEV4dGVybmFsIGZvciBpdCwgYW5kCi0JCQkgKiBpbnNlcnQgdGhlIG5hbWUgaW50byB0aGUgbmFtZXNwYWNlLgotCQkJICovCi0JCQlhY3BpX2RtX2FkZF90b19leHRlcm5hbF9saXN0KHBhdGgsIEFDUElfVFlQRV9ERVZJQ0UsIDApOwotCQkJc3RhdHVzID0KLQkJCSAgICBhY3BpX25zX2xvb2t1cCh3YWxrX3N0YXRlLT5zY29wZV9pbmZvLCBwYXRoLAotCQkJCQkgICBvYmplY3RfdHlwZSwgQUNQSV9JTU9ERV9MT0FEX1BBU1MxLAotCQkJCQkgICBBQ1BJX05TX1NFQVJDSF9QQVJFTlQsIHdhbGtfc3RhdGUsCi0JCQkJCSAgICZub2RlKTsKLQkJfQotI2VuZGlmCi0JCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQkJQUNQSV9FUlJPUl9OQU1FU1BBQ0UocGF0aCwgc3RhdHVzKTsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotCQl9Ci0KLQkJLyoKLQkJICogQ2hlY2sgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIHRhcmdldCBpcwotCQkgKiBvbmUgb2YgdGhlIG9wY29kZXMgdGhhdCBhY3R1YWxseSBvcGVucyBhIHNjb3BlCi0JCSAqLwotCQlzd2l0Y2ggKG5vZGUtPnR5cGUpIHsKLQkJY2FzZSBBQ1BJX1RZUEVfQU5ZOgotCQljYXNlIEFDUElfVFlQRV9MT0NBTF9TQ09QRToJLyogU2NvcGUgICovCi0JCWNhc2UgQUNQSV9UWVBFX0RFVklDRToKLQkJY2FzZSBBQ1BJX1RZUEVfUE9XRVI6Ci0JCWNhc2UgQUNQSV9UWVBFX1BST0NFU1NPUjoKLQkJY2FzZSBBQ1BJX1RZUEVfVEhFUk1BTDoKLQotCQkJLyogVGhlc2UgYXJlIGFjY2VwdGFibGUgdHlwZXMgKi8KLQkJCWJyZWFrOwotCi0JCWNhc2UgQUNQSV9UWVBFX0lOVEVHRVI6Ci0JCWNhc2UgQUNQSV9UWVBFX1NUUklORzoKLQkJY2FzZSBBQ1BJX1RZUEVfQlVGRkVSOgotCi0JCQkvKgotCQkJICogVGhlc2UgdHlwZXMgd2Ugd2lsbCBhbGxvdywgYnV0IHdlIHdpbGwgY2hhbmdlIHRoZSB0eXBlLiBUaGlzCi0JCQkgKiBlbmFibGVzIHNvbWUgZXhpc3RpbmcgY29kZSBvZiB0aGUgZm9ybToKLQkJCSAqCi0JCQkgKiAgTmFtZSAoREVCLCAwKQotCQkJICogIFNjb3BlIChERUIpIHsgLi4uIH0KLQkJCSAqCi0JCQkgKiBOb3RlOiBzaWxlbnRseSBjaGFuZ2UgdGhlIHR5cGUgaGVyZS4gT24gdGhlIHNlY29uZCBwYXNzLCB3ZSB3aWxsIHJlcG9ydAotCQkJICogYSB3YXJuaW5nCi0JCQkgKi8KLQkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywKLQkJCQkJICAiVHlwZSBvdmVycmlkZSAtIFslNC40c10gaGFkIGludmFsaWQgdHlwZSAoJXMpIGZvciBTY29wZSBvcGVyYXRvciwgY2hhbmdlZCB0byAoU2NvcGUpXG4iLAotCQkJCQkgIHBhdGgsCi0JCQkJCSAgYWNwaV91dF9nZXRfdHlwZV9uYW1lKG5vZGUtPnR5cGUpKSk7Ci0KLQkJCW5vZGUtPnR5cGUgPSBBQ1BJX1RZUEVfQU5ZOwotCQkJd2Fsa19zdGF0ZS0+c2NvcGVfaW5mby0+Y29tbW9uLnZhbHVlID0gQUNQSV9UWVBFX0FOWTsKLQkJCWJyZWFrOwotCi0JCWRlZmF1bHQ6Ci0KLQkJCS8qIEFsbCBvdGhlciB0eXBlcyBhcmUgYW4gZXJyb3IgKi8KLQotCQkJQUNQSV9FUlJPUigoQUVfSU5GTywKLQkJCQkgICAgIkludmFsaWQgdHlwZSAoJXMpIGZvciB0YXJnZXQgb2YgU2NvcGUgb3BlcmF0b3IgWyU0LjRzXSAoQ2Fubm90IG92ZXJyaWRlKSIsCi0JCQkJICAgIGFjcGlfdXRfZ2V0X3R5cGVfbmFtZShub2RlLT50eXBlKSwgcGF0aCkpOwotCi0JCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX09QRVJBTkRfVFlQRSk7Ci0JCX0KLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQkvKgotCQkgKiBGb3IgYWxsIG90aGVyIG5hbWVkIG9wY29kZXMsIHdlIHdpbGwgZW50ZXIgdGhlIG5hbWUgaW50bwotCQkgKiB0aGUgbmFtZXNwYWNlLgotCQkgKgotCQkgKiBTZXR1cCB0aGUgc2VhcmNoIGZsYWdzLgotCQkgKiBTaW5jZSB3ZSBhcmUgZW50ZXJpbmcgYSBuYW1lIGludG8gdGhlIG5hbWVzcGFjZSwgd2UgZG8gbm90IHdhbnQgdG8KLQkJICogZW5hYmxlIHRoZSBzZWFyY2gtdG8tcm9vdCB1cHNlYXJjaC4KLQkJICoKLQkJICogVGhlcmUgYXJlIG9ubHkgdHdvIGNvbmRpdGlvbnMgd2hlcmUgaXQgaXMgYWNjZXB0YWJsZSB0aGF0IHRoZSBuYW1lCi0JCSAqIGFscmVhZHkgZXhpc3RzOgotCQkgKiAgICAxKSB0aGUgU2NvcGUoKSBvcGVyYXRvciBjYW4gcmVvcGVuIGEgc2NvcGluZyBvYmplY3QgdGhhdCB3YXMKLQkJICogICAgICAgcHJldmlvdXNseSBkZWZpbmVkIChTY29wZSwgTWV0aG9kLCBEZXZpY2UsIGV0Yy4pCi0JCSAqICAgIDIpIFdoZW5ldmVyIHdlIGFyZSBwYXJzaW5nIGEgZGVmZXJyZWQgb3Bjb2RlIChvcF9yZWdpb24sIEJ1ZmZlciwKLQkJICogICAgICAgYnVmZmVyX2ZpZWxkLCBvciBQYWNrYWdlKSwgdGhlIG5hbWUgb2YgdGhlIG9iamVjdCBpcyBhbHJlYWR5Ci0JCSAqICAgICAgIGluIHRoZSBuYW1lc3BhY2UuCi0JCSAqLwotCQlpZiAod2Fsa19zdGF0ZS0+ZGVmZXJyZWRfbm9kZSkgewotCi0JCQkvKiBUaGlzIG5hbWUgaXMgYWxyZWFkeSBpbiB0aGUgbmFtZXNwYWNlLCBnZXQgdGhlIG5vZGUgKi8KLQotCQkJbm9kZSA9IHdhbGtfc3RhdGUtPmRlZmVycmVkX25vZGU7Ci0JCQlzdGF0dXMgPSBBRV9PSzsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJLyoKLQkJICogSWYgd2UgYXJlIGV4ZWN1dGluZyBhIG1ldGhvZCwgZG8gbm90IGNyZWF0ZSBhbnkgbmFtZXNwYWNlIG9iamVjdHMKLQkJICogZHVyaW5nIHRoZSBsb2FkIHBoYXNlLCBvbmx5IGR1cmluZyBleGVjdXRpb24uCi0JCSAqLwotCQlpZiAod2Fsa19zdGF0ZS0+bWV0aG9kX25vZGUpIHsKLQkJCW5vZGUgPSBOVUxMOwotCQkJc3RhdHVzID0gQUVfT0s7Ci0JCQlicmVhazsKLQkJfQotCi0JCWZsYWdzID0gQUNQSV9OU19OT19VUFNFQVJDSDsKLQkJaWYgKCh3YWxrX3N0YXRlLT5vcGNvZGUgIT0gQU1MX1NDT1BFX09QKSAmJgotCQkgICAgKCEod2Fsa19zdGF0ZS0+cGFyc2VfZmxhZ3MgJiBBQ1BJX1BBUlNFX0RFRkVSUkVEX09QKSkpIHsKLQkJCWZsYWdzIHw9IEFDUElfTlNfRVJST1JfSUZfRk9VTkQ7Ci0JCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0RJU1BBVENILAotCQkJCQkgICJbJXNdIENhbm5vdCBhbHJlYWR5IGV4aXN0XG4iLAotCQkJCQkgIGFjcGlfdXRfZ2V0X3R5cGVfbmFtZShvYmplY3RfdHlwZSkpKTsKLQkJfSBlbHNlIHsKLQkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRElTUEFUQ0gsCi0JCQkJCSAgIlslc10gQm90aCBGaW5kIG9yIENyZWF0ZSBhbGxvd2VkXG4iLAotCQkJCQkgIGFjcGlfdXRfZ2V0X3R5cGVfbmFtZShvYmplY3RfdHlwZSkpKTsKLQkJfQotCi0JCS8qCi0JCSAqIEVudGVyIHRoZSBuYW1lZCB0eXBlIGludG8gdGhlIGludGVybmFsIG5hbWVzcGFjZS4gV2UgZW50ZXIgdGhlIG5hbWUKLQkJICogYXMgd2UgZ28gZG93bndhcmQgaW4gdGhlIHBhcnNlIHRyZWUuIEFueSBuZWNlc3Nhcnkgc3Vib2JqZWN0cyB0aGF0Ci0JCSAqIGludm9sdmUgYXJndW1lbnRzIHRvIHRoZSBvcGNvZGUgbXVzdCBiZSBjcmVhdGVkIGFzIHdlIGdvIGJhY2sgdXAgdGhlCi0JCSAqIHBhcnNlIHRyZWUgbGF0ZXIuCi0JCSAqLwotCQlzdGF0dXMgPQotCQkgICAgYWNwaV9uc19sb29rdXAod2Fsa19zdGF0ZS0+c2NvcGVfaW5mbywgcGF0aCwgb2JqZWN0X3R5cGUsCi0JCQkJICAgQUNQSV9JTU9ERV9MT0FEX1BBU1MxLCBmbGFncywgd2Fsa19zdGF0ZSwKLQkJCQkgICAmbm9kZSk7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQkJaWYgKHN0YXR1cyA9PSBBRV9BTFJFQURZX0VYSVNUUykgewotCi0JCQkJLyogVGhlIG5hbWUgYWxyZWFkeSBleGlzdHMgaW4gdGhpcyBzY29wZSAqLwotCi0JCQkJaWYgKG5vZGUtPmZsYWdzICYgQU5PQkpfSVNfRVhURVJOQUwpIHsKLQkJCQkJLyoKLQkJCQkJICogQWxsb3cgb25lIGNyZWF0ZSBvbiBhbiBvYmplY3Qgb3Igc2VnbWVudCB0aGF0IHdhcwotCQkJCQkgKiBwcmV2aW91c2x5IGRlY2xhcmVkIEV4dGVybmFsCi0JCQkJCSAqLwotCQkJCQlub2RlLT5mbGFncyAmPSB+QU5PQkpfSVNfRVhURVJOQUw7Ci0JCQkJCW5vZGUtPnR5cGUgPSAodTgpIG9iamVjdF90eXBlOwotCi0JCQkJCS8qIEp1c3QgcmV0eXBlZCBhIG5vZGUsIHByb2JhYmx5IHdpbGwgbmVlZCB0byBvcGVuIGEgc2NvcGUgKi8KLQotCQkJCQlpZiAoYWNwaV9uc19vcGVuc19zY29wZShvYmplY3RfdHlwZSkpIHsKLQkJCQkJCXN0YXR1cyA9Ci0JCQkJCQkgICAgYWNwaV9kc19zY29wZV9zdGFja19wdXNoCi0JCQkJCQkgICAgKG5vZGUsIG9iamVjdF90eXBlLAotCQkJCQkJICAgICB3YWxrX3N0YXRlKTsKLQkJCQkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQkJCQkJCXJldHVybl9BQ1BJX1NUQVRVUwotCQkJCQkJCSAgICAoc3RhdHVzKTsKLQkJCQkJCX0KLQkJCQkJfQotCi0JCQkJCXN0YXR1cyA9IEFFX09LOwotCQkJCX0KLQkJCX0KLQotCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCQkJQUNQSV9FUlJPUl9OQU1FU1BBQ0UocGF0aCwgc3RhdHVzKTsKLQkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLQkJCX0KLQkJfQotCQlicmVhazsKLQl9Ci0KLQkvKiBDb21tb24gZXhpdCAqLwotCi0JaWYgKCFvcCkgewotCi0JCS8qIENyZWF0ZSBhIG5ldyBvcCAqLwotCi0JCW9wID0gYWNwaV9wc19hbGxvY19vcCh3YWxrX3N0YXRlLT5vcGNvZGUpOwotCQlpZiAoIW9wKSB7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9fTUVNT1JZKTsKLQkJfQotCX0KLQotCS8qIEluaXRpYWxpemUgdGhlIG9wICovCi0KLSNpZiAoZGVmaW5lZCAoQUNQSV9OT19NRVRIT0RfRVhFQ1VUSU9OKSB8fCBkZWZpbmVkIChBQ1BJX0NPTlNUQU5UX0VWQUxfT05MWSkpCi0Jb3AtPm5hbWVkLnBhdGggPSBBQ1BJX0NBU1RfUFRSKHU4LCBwYXRoKTsKLSNlbmRpZgotCi0JaWYgKG5vZGUpIHsKLQkJLyoKLQkJICogUHV0IHRoZSBOb2RlIGluIHRoZSAib3AiIG9iamVjdCB0aGF0IHRoZSBwYXJzZXIgdXNlcywgc28gd2UKLQkJICogY2FuIGdldCBpdCBhZ2FpbiBxdWlja2x5IHdoZW4gdGhpcyBzY29wZSBpcyBjbG9zZWQKLQkJICovCi0JCW9wLT5jb21tb24ubm9kZSA9IG5vZGU7Ci0JCW9wLT5uYW1lZC5uYW1lID0gbm9kZS0+bmFtZS5pbnRlZ2VyOwotCX0KLQotCWFjcGlfcHNfYXBwZW5kX2FyZyhhY3BpX3BzX2dldF9wYXJlbnRfc2NvcGUoJndhbGtfc3RhdGUtPnBhcnNlcl9zdGF0ZSksCi0JCQkgICBvcCk7Ci0JKm91dF9vcCA9IG9wOwotCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX2RzX2xvYWQxX2VuZF9vcAotICoKLSAqIFBBUkFNRVRFUlM6ICB3YWxrX3N0YXRlICAgICAgLSBDdXJyZW50IHN0YXRlIG9mIHRoZSBwYXJzZSB0cmVlIHdhbGsKLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IEFzY2VuZGluZyBjYWxsYmFjayB1c2VkIGR1cmluZyB0aGUgbG9hZGluZyBvZiB0aGUgbmFtZXNwYWNlLAotICogICAgICAgICAgICAgIGJvdGggY29udHJvbCBtZXRob2RzIGFuZCBldmVyeXRoaW5nIGVsc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotYWNwaV9zdGF0dXMgYWNwaV9kc19sb2FkMV9lbmRfb3Aoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSkKLXsKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqb3A7Ci0JYWNwaV9vYmplY3RfdHlwZSBvYmplY3RfdHlwZTsKLQlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UoZHNfbG9hZDFfZW5kX29wKTsKLQotCW9wID0gd2Fsa19zdGF0ZS0+b3A7Ci0JQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9ESVNQQVRDSCwgIk9wPSVwIFN0YXRlPSVwXG4iLCBvcCwKLQkJCSAgd2Fsa19zdGF0ZSkpOwotCi0JLyogV2UgYXJlIG9ubHkgaW50ZXJlc3RlZCBpbiBvcGNvZGVzIHRoYXQgaGF2ZSBhbiBhc3NvY2lhdGVkIG5hbWUgKi8KLQotCWlmICghKHdhbGtfc3RhdGUtPm9wX2luZm8tPmZsYWdzICYgKEFNTF9OQU1FRCB8IEFNTF9GSUVMRCkpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7Ci0JfQotCi0JLyogR2V0IHRoZSBvYmplY3QgdHlwZSB0byBkZXRlcm1pbmUgaWYgd2Ugc2hvdWxkIHBvcCB0aGUgc2NvcGUgKi8KLQotCW9iamVjdF90eXBlID0gd2Fsa19zdGF0ZS0+b3BfaW5mby0+b2JqZWN0X3R5cGU7Ci0KLSNpZm5kZWYgQUNQSV9OT19NRVRIT0RfRVhFQ1VUSU9OCi0JaWYgKHdhbGtfc3RhdGUtPm9wX2luZm8tPmZsYWdzICYgQU1MX0ZJRUxEKSB7Ci0JCS8qCi0JCSAqIElmIHdlIGFyZSBleGVjdXRpbmcgYSBtZXRob2QsIGRvIG5vdCBjcmVhdGUgYW55IG5hbWVzcGFjZSBvYmplY3RzCi0JCSAqIGR1cmluZyB0aGUgbG9hZCBwaGFzZSwgb25seSBkdXJpbmcgZXhlY3V0aW9uLgotCQkgKi8KLQkJaWYgKCF3YWxrX3N0YXRlLT5tZXRob2Rfbm9kZSkgewotCQkJaWYgKHdhbGtfc3RhdGUtPm9wY29kZSA9PSBBTUxfRklFTERfT1AgfHwKLQkJCSAgICB3YWxrX3N0YXRlLT5vcGNvZGUgPT0gQU1MX0JBTktfRklFTERfT1AgfHwKLQkJCSAgICB3YWxrX3N0YXRlLT5vcGNvZGUgPT0gQU1MX0lOREVYX0ZJRUxEX09QKSB7Ci0JCQkJc3RhdHVzID0KLQkJCQkgICAgYWNwaV9kc19pbml0X2ZpZWxkX29iamVjdHMob3AsIHdhbGtfc3RhdGUpOwotCQkJfQotCQl9Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotCX0KLQotCS8qCi0JICogSWYgd2UgYXJlIGV4ZWN1dGluZyBhIG1ldGhvZCwgZG8gbm90IGNyZWF0ZSBhbnkgbmFtZXNwYWNlIG9iamVjdHMKLQkgKiBkdXJpbmcgdGhlIGxvYWQgcGhhc2UsIG9ubHkgZHVyaW5nIGV4ZWN1dGlvbi4KLQkgKi8KLQlpZiAoIXdhbGtfc3RhdGUtPm1ldGhvZF9ub2RlKSB7Ci0JCWlmIChvcC0+Y29tbW9uLmFtbF9vcGNvZGUgPT0gQU1MX1JFR0lPTl9PUCkgewotCQkJc3RhdHVzID0KLQkJCSAgICBhY3BpX2V4X2NyZWF0ZV9yZWdpb24ob3AtPm5hbWVkLmRhdGEsCi0JCQkJCQkgIG9wLT5uYW1lZC5sZW5ndGgsCi0JCQkJCQkgIChhY3BpX2Fkcl9zcGFjZV90eXBlKSAoKG9wLT4KLQkJCQkJCQkJCSAgY29tbW9uLgotCQkJCQkJCQkJICB2YWx1ZS4KLQkJCQkJCQkJCSAgYXJnKS0+Ci0JCQkJCQkJCQkgY29tbW9uLgotCQkJCQkJCQkJIHZhbHVlLgotCQkJCQkJCQkJIGludGVnZXIpLAotCQkJCQkJICB3YWxrX3N0YXRlKTsKLQkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotCQkJfQotCQl9IGVsc2UgaWYgKG9wLT5jb21tb24uYW1sX29wY29kZSA9PSBBTUxfREFUQV9SRUdJT05fT1ApIHsKLQkJCXN0YXR1cyA9Ci0JCQkgICAgYWNwaV9leF9jcmVhdGVfcmVnaW9uKG9wLT5uYW1lZC5kYXRhLAotCQkJCQkJICBvcC0+bmFtZWQubGVuZ3RoLAotCQkJCQkJICBSRUdJT05fREFUQV9UQUJMRSwKLQkJCQkJCSAgd2Fsa19zdGF0ZSk7Ci0JCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLQkJCX0KLQkJfQotCX0KLSNlbmRpZgotCi0JaWYgKG9wLT5jb21tb24uYW1sX29wY29kZSA9PSBBTUxfTkFNRV9PUCkgewotCi0JCS8qIEZvciBOYW1lIG9wY29kZSwgZ2V0IHRoZSBvYmplY3QgdHlwZSBmcm9tIHRoZSBhcmd1bWVudCAqLwotCi0JCWlmIChvcC0+Y29tbW9uLnZhbHVlLmFyZykgewotCQkJb2JqZWN0X3R5cGUgPSAoYWNwaV9wc19nZXRfb3Bjb2RlX2luZm8oKG9wLT5jb21tb24uCi0JCQkJCQkJCXZhbHVlLmFyZyktPgotCQkJCQkJCSAgICAgICBjb21tb24uCi0JCQkJCQkJICAgICAgIGFtbF9vcGNvZGUpKS0+Ci0JCQkgICAgb2JqZWN0X3R5cGU7Ci0KLQkJCS8qIFNldCBub2RlIHR5cGUgaWYgd2UgaGF2ZSBhIG5hbWVzcGFjZSBub2RlICovCi0KLQkJCWlmIChvcC0+Y29tbW9uLm5vZGUpIHsKLQkJCQlvcC0+Y29tbW9uLm5vZGUtPnR5cGUgPSAodTgpIG9iamVjdF90eXBlOwotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiBJZiB3ZSBhcmUgZXhlY3V0aW5nIGEgbWV0aG9kLCBkbyBub3QgY3JlYXRlIGFueSBuYW1lc3BhY2Ugb2JqZWN0cwotCSAqIGR1cmluZyB0aGUgbG9hZCBwaGFzZSwgb25seSBkdXJpbmcgZXhlY3V0aW9uLgotCSAqLwotCWlmICghd2Fsa19zdGF0ZS0+bWV0aG9kX25vZGUpIHsKLQkJaWYgKG9wLT5jb21tb24uYW1sX29wY29kZSA9PSBBTUxfTUVUSE9EX09QKSB7Ci0JCQkvKgotCQkJICogbWV0aG9kX29wIHBrZ19sZW5ndGggbmFtZV9zdHJpbmcgbWV0aG9kX2ZsYWdzIHRlcm1fbGlzdAotCQkJICoKLQkJCSAqIE5vdGU6IFdlIG11c3QgY3JlYXRlIHRoZSBtZXRob2Qgbm9kZS9vYmplY3QgcGFpciBhcyBzb29uIGFzIHdlCi0JCQkgKiBzZWUgdGhlIG1ldGhvZCBkZWNsYXJhdGlvbi4gVGhpcyBhbGxvd3MgbGF0ZXIgcGFzczEgcGFyc2luZwotCQkJICogb2YgaW52b2NhdGlvbnMgb2YgdGhlIG1ldGhvZCAobmVlZCB0byBrbm93IHRoZSBudW1iZXIgb2YKLQkJCSAqIGFyZ3VtZW50cy4pCi0JCQkgKi8KLQkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRElTUEFUQ0gsCi0JCQkJCSAgIkxPQURJTkctTWV0aG9kOiBTdGF0ZT0lcCBPcD0lcCBOYW1lZE9iaj0lcFxuIiwKLQkJCQkJICB3YWxrX3N0YXRlLCBvcCwgb3AtPm5hbWVkLm5vZGUpKTsKLQotCQkJaWYgKCFhY3BpX25zX2dldF9hdHRhY2hlZF9vYmplY3Qob3AtPm5hbWVkLm5vZGUpKSB7Ci0JCQkJd2Fsa19zdGF0ZS0+b3BlcmFuZHNbMF0gPQotCQkJCSAgICBBQ1BJX0NBU1RfUFRSKHZvaWQsIG9wLT5uYW1lZC5ub2RlKTsKLQkJCQl3YWxrX3N0YXRlLT5udW1fb3BlcmFuZHMgPSAxOwotCi0JCQkJc3RhdHVzID0KLQkJCQkgICAgYWNwaV9kc19jcmVhdGVfb3BlcmFuZHMod2Fsa19zdGF0ZSwKLQkJCQkJCQkgICAgb3AtPmNvbW1vbi52YWx1ZS4KLQkJCQkJCQkgICAgYXJnKTsKLQkJCQlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpIHsKLQkJCQkJc3RhdHVzID0KLQkJCQkJICAgIGFjcGlfZXhfY3JlYXRlX21ldGhvZChvcC0+bmFtZWQuCi0JCQkJCQkJCSAgZGF0YSwKLQkJCQkJCQkJICBvcC0+bmFtZWQuCi0JCQkJCQkJCSAgbGVuZ3RoLAotCQkJCQkJCQkgIHdhbGtfc3RhdGUpOwotCQkJCX0KLQotCQkJCXdhbGtfc3RhdGUtPm9wZXJhbmRzWzBdID0gTlVMTDsKLQkJCQl3YWxrX3N0YXRlLT5udW1fb3BlcmFuZHMgPSAwOwotCi0JCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qIFBvcCB0aGUgc2NvcGUgc3RhY2sgKG9ubHkgaWYgbG9hZGluZyBhIHRhYmxlKSAqLwotCi0JaWYgKCF3YWxrX3N0YXRlLT5tZXRob2Rfbm9kZSAmJiBhY3BpX25zX29wZW5zX3Njb3BlKG9iamVjdF90eXBlKSkgewotCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0RJU1BBVENILAotCQkJCSAgIiglcyk6IFBvcHBpbmcgc2NvcGUgZm9yIE9wICVwXG4iLAotCQkJCSAgYWNwaV91dF9nZXRfdHlwZV9uYW1lKG9iamVjdF90eXBlKSwgb3ApKTsKLQotCQlzdGF0dXMgPSBhY3BpX2RzX3Njb3BlX3N0YWNrX3BvcCh3YWxrX3N0YXRlKTsKLQl9Ci0KLQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9kc19sb2FkMl9iZWdpbl9vcAotICoKLSAqIFBBUkFNRVRFUlM6ICB3YWxrX3N0YXRlICAgICAgLSBDdXJyZW50IHN0YXRlIG9mIHRoZSBwYXJzZSB0cmVlIHdhbGsKLSAqICAgICAgICAgICAgICBvdXRfb3AgICAgICAgICAgLSBXaGVyIHRvIHJldHVybiBvcCBpZiBhIG5ldyBvbmUgaXMgY3JlYXRlZAotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKLSAqCi0gKiBERVNDUklQVElPTjogRGVzY2VuZGluZyBjYWxsYmFjayB1c2VkIGR1cmluZyB0aGUgbG9hZGluZyBvZiBBQ1BJIHRhYmxlcy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1hY3BpX3N0YXR1cwotYWNwaV9kc19sb2FkMl9iZWdpbl9vcChzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlLAotCQkgICAgICAgdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKipvdXRfb3ApCi17Ci0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKm9wOwotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlOwotCWFjcGlfc3RhdHVzIHN0YXR1czsKLQlhY3BpX29iamVjdF90eXBlIG9iamVjdF90eXBlOwotCWNoYXIgKmJ1ZmZlcl9wdHI7Ci0JdTMyIGZsYWdzOwotCi0JQUNQSV9GVU5DVElPTl9UUkFDRShkc19sb2FkMl9iZWdpbl9vcCk7Ci0KLQlvcCA9IHdhbGtfc3RhdGUtPm9wOwotCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRElTUEFUQ0gsICJPcD0lcCBTdGF0ZT0lcFxuIiwgb3AsCi0JCQkgIHdhbGtfc3RhdGUpKTsKLQotCWlmIChvcCkgewotCQlpZiAoKHdhbGtfc3RhdGUtPmNvbnRyb2xfc3RhdGUpICYmCi0JCSAgICAod2Fsa19zdGF0ZS0+Y29udHJvbF9zdGF0ZS0+Y29tbW9uLnN0YXRlID09Ci0JCSAgICAgQUNQSV9DT05UUk9MX0NPTkRJVElPTkFMX0VYRUNVVElORykpIHsKLQotCQkJLyogV2UgYXJlIGV4ZWN1dGluZyBhIHdoaWxlIGxvb3Agb3V0c2lkZSBvZiBhIG1ldGhvZCAqLwotCi0JCQlzdGF0dXMgPSBhY3BpX2RzX2V4ZWNfYmVnaW5fb3Aod2Fsa19zdGF0ZSwgb3V0X29wKTsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotCQl9Ci0KLQkJLyogV2Ugb25seSBjYXJlIGFib3V0IE5hbWVzcGFjZSBvcGNvZGVzIGhlcmUgKi8KLQotCQlpZiAoKCEod2Fsa19zdGF0ZS0+b3BfaW5mby0+ZmxhZ3MgJiBBTUxfTlNPUENPREUpICYmCi0JCSAgICAgKHdhbGtfc3RhdGUtPm9wY29kZSAhPSBBTUxfSU5UX05BTUVQQVRIX09QKSkgfHwKLQkJICAgICghKHdhbGtfc3RhdGUtPm9wX2luZm8tPmZsYWdzICYgQU1MX05BTUVEKSkpIHsKLSNpZmRlZiBBQ1BJX0VOQUJMRV9NT0RVTEVfTEVWRUxfQ09ERQotCQkJaWYgKCh3YWxrX3N0YXRlLT5vcF9pbmZvLT5jbGFzcyA9PSBBTUxfQ0xBU1NfRVhFQ1VURSkgfHwKLQkJCSAgICAod2Fsa19zdGF0ZS0+b3BfaW5mby0+Y2xhc3MgPT0gQU1MX0NMQVNTX0NPTlRST0wpKSB7Ci0JCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9ESVNQQVRDSCwKLQkJCQkJCSAgIkJlZ2luL0VYRUM6ICVzIChmbCAlOC44WClcbiIsCi0JCQkJCQkgIHdhbGtfc3RhdGUtPm9wX2luZm8tPm5hbWUsCi0JCQkJCQkgIHdhbGtfc3RhdGUtPm9wX2luZm8tPmZsYWdzKSk7Ci0KLQkJCQkvKiBFeGVjdXRpbmcgYSB0eXBlMSBvciB0eXBlMiBvcGNvZGUgb3V0c2lkZSBvZiBhIG1ldGhvZCAqLwotCi0JCQkJc3RhdHVzID0KLQkJCQkgICAgYWNwaV9kc19leGVjX2JlZ2luX29wKHdhbGtfc3RhdGUsIG91dF9vcCk7Ci0JCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci0JCQl9Ci0jZW5kaWYKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7Ci0JCX0KLQotCQkvKiBHZXQgdGhlIG5hbWUgd2UgYXJlIGdvaW5nIHRvIGVudGVyIG9yIGxvb2t1cCBpbiB0aGUgbmFtZXNwYWNlICovCi0KLQkJaWYgKHdhbGtfc3RhdGUtPm9wY29kZSA9PSBBTUxfSU5UX05BTUVQQVRIX09QKSB7Ci0KLQkJCS8qIEZvciBOYW1lcGF0aCBvcCwgZ2V0IHRoZSBwYXRoIHN0cmluZyAqLwotCi0JCQlidWZmZXJfcHRyID0gb3AtPmNvbW1vbi52YWx1ZS5zdHJpbmc7Ci0JCQlpZiAoIWJ1ZmZlcl9wdHIpIHsKLQotCQkJCS8qIE5vIG5hbWUsIGp1c3QgZXhpdCAqLwotCi0JCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCS8qIEdldCBuYW1lIGZyb20gdGhlIG9wICovCi0KLQkJCWJ1ZmZlcl9wdHIgPSBBQ1BJX0NBU1RfUFRSKGNoYXIsICZvcC0+bmFtZWQubmFtZSk7Ci0JCX0KLQl9IGVsc2UgewotCQkvKiBHZXQgdGhlIG5hbWVzdHJpbmcgZnJvbSB0aGUgcmF3IEFNTCAqLwotCi0JCWJ1ZmZlcl9wdHIgPQotCQkgICAgYWNwaV9wc19nZXRfbmV4dF9uYW1lc3RyaW5nKCZ3YWxrX3N0YXRlLT5wYXJzZXJfc3RhdGUpOwotCX0KLQotCS8qIE1hcCB0aGUgb3Bjb2RlIGludG8gYW4gaW50ZXJuYWwgb2JqZWN0IHR5cGUgKi8KLQotCW9iamVjdF90eXBlID0gd2Fsa19zdGF0ZS0+b3BfaW5mby0+b2JqZWN0X3R5cGU7Ci0KLQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0RJU1BBVENILAotCQkJICAiU3RhdGU9JXAgT3A9JXAgVHlwZT0lWFxuIiwgd2Fsa19zdGF0ZSwgb3AsCi0JCQkgIG9iamVjdF90eXBlKSk7Ci0KLQlzd2l0Y2ggKHdhbGtfc3RhdGUtPm9wY29kZSkgewotCWNhc2UgQU1MX0ZJRUxEX09QOgotCWNhc2UgQU1MX0JBTktfRklFTERfT1A6Ci0JY2FzZSBBTUxfSU5ERVhfRklFTERfT1A6Ci0KLQkJbm9kZSA9IE5VTEw7Ci0JCXN0YXR1cyA9IEFFX09LOwotCQlicmVhazsKLQotCWNhc2UgQU1MX0lOVF9OQU1FUEFUSF9PUDoKLQkJLyoKLQkJICogVGhlIG5hbWVfcGF0aCBpcyBhbiBvYmplY3QgcmVmZXJlbmNlIHRvIGFuIGV4aXN0aW5nIG9iamVjdC4KLQkJICogRG9uJ3QgZW50ZXIgdGhlIG5hbWUgaW50byB0aGUgbmFtZXNwYWNlLCBidXQgbG9vayBpdCB1cAotCQkgKiBmb3IgdXNlIGxhdGVyLgotCQkgKi8KLQkJc3RhdHVzID0KLQkJICAgIGFjcGlfbnNfbG9va3VwKHdhbGtfc3RhdGUtPnNjb3BlX2luZm8sIGJ1ZmZlcl9wdHIsCi0JCQkJICAgb2JqZWN0X3R5cGUsIEFDUElfSU1PREVfRVhFQ1VURSwKLQkJCQkgICBBQ1BJX05TX1NFQVJDSF9QQVJFTlQsIHdhbGtfc3RhdGUsICYobm9kZSkpOwotCQlicmVhazsKLQotCWNhc2UgQU1MX1NDT1BFX09QOgotCQkvKgotCQkgKiBUaGUgUGF0aCBpcyBhbiBvYmplY3QgcmVmZXJlbmNlIHRvIGFuIGV4aXN0aW5nIG9iamVjdC4KLQkJICogRG9uJ3QgZW50ZXIgdGhlIG5hbWUgaW50byB0aGUgbmFtZXNwYWNlLCBidXQgbG9vayBpdCB1cAotCQkgKiBmb3IgdXNlIGxhdGVyLgotCQkgKi8KLQkJc3RhdHVzID0KLQkJICAgIGFjcGlfbnNfbG9va3VwKHdhbGtfc3RhdGUtPnNjb3BlX2luZm8sIGJ1ZmZlcl9wdHIsCi0JCQkJICAgb2JqZWN0X3R5cGUsIEFDUElfSU1PREVfRVhFQ1VURSwKLQkJCQkgICBBQ1BJX05TX1NFQVJDSF9QQVJFTlQsIHdhbGtfc3RhdGUsICYobm9kZSkpOwotCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLSNpZmRlZiBBQ1BJX0FTTF9DT01QSUxFUgotCQkJaWYgKHN0YXR1cyA9PSBBRV9OT1RfRk9VTkQpIHsKLQkJCQlzdGF0dXMgPSBBRV9PSzsKLQkJCX0gZWxzZSB7Ci0JCQkJQUNQSV9FUlJPUl9OQU1FU1BBQ0UoYnVmZmVyX3B0ciwgc3RhdHVzKTsKLQkJCX0KLSNlbHNlCi0JCQlBQ1BJX0VSUk9SX05BTUVTUEFDRShidWZmZXJfcHRyLCBzdGF0dXMpOwotI2VuZGlmCi0JCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLQkJfQotCi0JCS8qCi0JCSAqIFdlIG11c3QgY2hlY2sgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIHRhcmdldCBpcwotCQkgKiBvbmUgb2YgdGhlIG9wY29kZXMgdGhhdCBhY3R1YWxseSBvcGVucyBhIHNjb3BlCi0JCSAqLwotCQlzd2l0Y2ggKG5vZGUtPnR5cGUpIHsKLQkJY2FzZSBBQ1BJX1RZUEVfQU5ZOgotCQljYXNlIEFDUElfVFlQRV9MT0NBTF9TQ09QRToJLyogU2NvcGUgKi8KLQkJY2FzZSBBQ1BJX1RZUEVfREVWSUNFOgotCQljYXNlIEFDUElfVFlQRV9QT1dFUjoKLQkJY2FzZSBBQ1BJX1RZUEVfUFJPQ0VTU09SOgotCQljYXNlIEFDUElfVFlQRV9USEVSTUFMOgotCi0JCQkvKiBUaGVzZSBhcmUgYWNjZXB0YWJsZSB0eXBlcyAqLwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBBQ1BJX1RZUEVfSU5URUdFUjoKLQkJY2FzZSBBQ1BJX1RZUEVfU1RSSU5HOgotCQljYXNlIEFDUElfVFlQRV9CVUZGRVI6Ci0KLQkJCS8qCi0JCQkgKiBUaGVzZSB0eXBlcyB3ZSB3aWxsIGFsbG93LCBidXQgd2Ugd2lsbCBjaGFuZ2UgdGhlIHR5cGUuIFRoaXMKLQkJCSAqIGVuYWJsZXMgc29tZSBleGlzdGluZyBjb2RlIG9mIHRoZSBmb3JtOgotCQkJICoKLQkJCSAqICBOYW1lIChERUIsIDApCi0JCQkgKiAgU2NvcGUgKERFQikgeyAuLi4gfQotCQkJICovCi0JCQlBQ1BJX1dBUk5JTkcoKEFFX0lORk8sCi0JCQkJICAgICAgIlR5cGUgb3ZlcnJpZGUgLSBbJTQuNHNdIGhhZCBpbnZhbGlkIHR5cGUgKCVzKSBmb3IgU2NvcGUgb3BlcmF0b3IsIGNoYW5nZWQgdG8gKFNjb3BlKSIsCi0JCQkJICAgICAgYnVmZmVyX3B0ciwKLQkJCQkgICAgICBhY3BpX3V0X2dldF90eXBlX25hbWUobm9kZS0+dHlwZSkpKTsKLQotCQkJbm9kZS0+dHlwZSA9IEFDUElfVFlQRV9BTlk7Ci0JCQl3YWxrX3N0YXRlLT5zY29wZV9pbmZvLT5jb21tb24udmFsdWUgPSBBQ1BJX1RZUEVfQU5ZOwotCQkJYnJlYWs7Ci0KLQkJZGVmYXVsdDoKLQotCQkJLyogQWxsIG90aGVyIHR5cGVzIGFyZSBhbiBlcnJvciAqLwotCi0JCQlBQ1BJX0VSUk9SKChBRV9JTkZPLAotCQkJCSAgICAiSW52YWxpZCB0eXBlICglcykgZm9yIHRhcmdldCBvZiBTY29wZSBvcGVyYXRvciBbJTQuNHNdIiwKLQkJCQkgICAgYWNwaV91dF9nZXRfdHlwZV9uYW1lKG5vZGUtPnR5cGUpLAotCQkJCSAgICBidWZmZXJfcHRyKSk7Ci0KLQkJCXJldHVybiAoQUVfQU1MX09QRVJBTkRfVFlQRSk7Ci0JCX0KLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCi0JCS8qIEFsbCBvdGhlciBvcGNvZGVzICovCi0KLQkJaWYgKG9wICYmIG9wLT5jb21tb24ubm9kZSkgewotCi0JCQkvKiBUaGlzIG9wL25vZGUgd2FzIHByZXZpb3VzbHkgZW50ZXJlZCBpbnRvIHRoZSBuYW1lc3BhY2UgKi8KLQotCQkJbm9kZSA9IG9wLT5jb21tb24ubm9kZTsKLQotCQkJaWYgKGFjcGlfbnNfb3BlbnNfc2NvcGUob2JqZWN0X3R5cGUpKSB7Ci0JCQkJc3RhdHVzID0KLQkJCQkgICAgYWNwaV9kc19zY29wZV9zdGFja19wdXNoKG5vZGUsIG9iamVjdF90eXBlLAotCQkJCQkJCSAgICAgd2Fsa19zdGF0ZSk7Ci0JCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotCQkJCX0KLQkJCX0KLQotCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKLQkJfQotCi0JCS8qCi0JCSAqIEVudGVyIHRoZSBuYW1lZCB0eXBlIGludG8gdGhlIGludGVybmFsIG5hbWVzcGFjZS4gV2UgZW50ZXIgdGhlIG5hbWUKLQkJICogYXMgd2UgZ28gZG93bndhcmQgaW4gdGhlIHBhcnNlIHRyZWUuIEFueSBuZWNlc3Nhcnkgc3Vib2JqZWN0cyB0aGF0Ci0JCSAqIGludm9sdmUgYXJndW1lbnRzIHRvIHRoZSBvcGNvZGUgbXVzdCBiZSBjcmVhdGVkIGFzIHdlIGdvIGJhY2sgdXAgdGhlCi0JCSAqIHBhcnNlIHRyZWUgbGF0ZXIuCi0JCSAqCi0JCSAqIE5vdGU6IE5hbWUgbWF5IGFscmVhZHkgZXhpc3QgaWYgd2UgYXJlIGV4ZWN1dGluZyBhIGRlZmVycmVkIG9wY29kZS4KLQkJICovCi0JCWlmICh3YWxrX3N0YXRlLT5kZWZlcnJlZF9ub2RlKSB7Ci0KLQkJCS8qIFRoaXMgbmFtZSBpcyBhbHJlYWR5IGluIHRoZSBuYW1lc3BhY2UsIGdldCB0aGUgbm9kZSAqLwotCi0JCQlub2RlID0gd2Fsa19zdGF0ZS0+ZGVmZXJyZWRfbm9kZTsKLQkJCXN0YXR1cyA9IEFFX09LOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlmbGFncyA9IEFDUElfTlNfTk9fVVBTRUFSQ0g7Ci0JCWlmICh3YWxrX3N0YXRlLT5wYXNzX251bWJlciA9PSBBQ1BJX0lNT0RFX0VYRUNVVEUpIHsKLQotCQkJLyogRXhlY3V0aW9uIG1vZGUsIG5vZGUgY2Fubm90IGFscmVhZHkgZXhpc3QsIG5vZGUgaXMgdGVtcG9yYXJ5ICovCi0KLQkJCWZsYWdzIHw9IChBQ1BJX05TX0VSUk9SX0lGX0ZPVU5EIHwgQUNQSV9OU19URU1QT1JBUlkpOwotCQl9Ci0KLQkJLyogQWRkIG5ldyBlbnRyeSBvciBsb29rdXAgZXhpc3RpbmcgZW50cnkgKi8KLQotCQlzdGF0dXMgPQotCQkgICAgYWNwaV9uc19sb29rdXAod2Fsa19zdGF0ZS0+c2NvcGVfaW5mbywgYnVmZmVyX3B0ciwKLQkJCQkgICBvYmplY3RfdHlwZSwgQUNQSV9JTU9ERV9MT0FEX1BBU1MyLCBmbGFncywKLQkJCQkgICB3YWxrX3N0YXRlLCAmbm9kZSk7Ci0KLQkJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpICYmIChmbGFncyAmIEFDUElfTlNfVEVNUE9SQVJZKSkgewotCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9ESVNQQVRDSCwKLQkJCQkJICAiKioqTmV3IE5vZGUgWyU0LjRzXSAlcCBpcyB0ZW1wb3JhcnlcbiIsCi0JCQkJCSAgYWNwaV91dF9nZXRfbm9kZV9uYW1lKG5vZGUpLCBub2RlKSk7Ci0JCX0KLQkJYnJlYWs7Ci0JfQotCi0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCUFDUElfRVJST1JfTkFNRVNQQUNFKGJ1ZmZlcl9wdHIsIHN0YXR1cyk7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotCX0KLQotCWlmICghb3ApIHsKLQotCQkvKiBDcmVhdGUgYSBuZXcgb3AgKi8KLQotCQlvcCA9IGFjcGlfcHNfYWxsb2Nfb3Aod2Fsa19zdGF0ZS0+b3Bjb2RlKTsKLQkJaWYgKCFvcCkgewotCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX01FTU9SWSk7Ci0JCX0KLQotCQkvKiBJbml0aWFsaXplIHRoZSBuZXcgb3AgKi8KLQotCQlpZiAobm9kZSkgewotCQkJb3AtPm5hbWVkLm5hbWUgPSBub2RlLT5uYW1lLmludGVnZXI7Ci0JCX0KLQkJKm91dF9vcCA9IG9wOwotCX0KLQotCS8qCi0JICogUHV0IHRoZSBOb2RlIGluIHRoZSAib3AiIG9iamVjdCB0aGF0IHRoZSBwYXJzZXIgdXNlcywgc28gd2UKLQkgKiBjYW4gZ2V0IGl0IGFnYWluIHF1aWNrbHkgd2hlbiB0aGlzIHNjb3BlIGlzIGNsb3NlZAotCSAqLwotCW9wLT5jb21tb24ubm9kZSA9IG5vZGU7Ci0JcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfZHNfbG9hZDJfZW5kX29wCi0gKgotICogUEFSQU1FVEVSUzogIHdhbGtfc3RhdGUgICAgICAtIEN1cnJlbnQgc3RhdGUgb2YgdGhlIHBhcnNlIHRyZWUgd2FsawotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKLSAqCi0gKiBERVNDUklQVElPTjogQXNjZW5kaW5nIGNhbGxiYWNrIHVzZWQgZHVyaW5nIHRoZSBsb2FkaW5nIG9mIHRoZSBuYW1lc3BhY2UsCi0gKiAgICAgICAgICAgICAgYm90aCBjb250cm9sIG1ldGhvZHMgYW5kIGV2ZXJ5dGhpbmcgZWxzZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1hY3BpX3N0YXR1cyBhY3BpX2RzX2xvYWQyX2VuZF9vcChzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKQotewotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpvcDsKLQlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKLQlhY3BpX29iamVjdF90eXBlIG9iamVjdF90eXBlOwotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlOwotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICphcmc7Ci0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5ld19ub2RlOwotI2lmbmRlZiBBQ1BJX05PX01FVEhPRF9FWEVDVVRJT04KLQl1MzIgaTsKLQl1OCByZWdpb25fc3BhY2U7Ci0jZW5kaWYKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UoZHNfbG9hZDJfZW5kX29wKTsKLQotCW9wID0gd2Fsa19zdGF0ZS0+b3A7Ci0JQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9ESVNQQVRDSCwgIk9wY29kZSBbJXNdIE9wICVwIFN0YXRlICVwXG4iLAotCQkJICB3YWxrX3N0YXRlLT5vcF9pbmZvLT5uYW1lLCBvcCwgd2Fsa19zdGF0ZSkpOwotCi0JLyogQ2hlY2sgaWYgb3Bjb2RlIGhhZCBhbiBhc3NvY2lhdGVkIG5hbWVzcGFjZSBvYmplY3QgKi8KLQotCWlmICghKHdhbGtfc3RhdGUtPm9wX2luZm8tPmZsYWdzICYgQU1MX05TT0JKRUNUKSkgewotI2lmbmRlZiBBQ1BJX05PX01FVEhPRF9FWEVDVVRJT04KLSNpZmRlZiBBQ1BJX0VOQUJMRV9NT0RVTEVfTEVWRUxfQ09ERQotCQkvKiBObyBuYW1lc3BhY2Ugb2JqZWN0LiBFeGVjdXRhYmxlIG9wY29kZT8gKi8KLQotCQlpZiAoKHdhbGtfc3RhdGUtPm9wX2luZm8tPmNsYXNzID09IEFNTF9DTEFTU19FWEVDVVRFKSB8fAotCQkgICAgKHdhbGtfc3RhdGUtPm9wX2luZm8tPmNsYXNzID09IEFNTF9DTEFTU19DT05UUk9MKSkgewotCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9ESVNQQVRDSCwKLQkJCQkJICAiRW5kL0VYRUM6ICAgJXMgKGZsICU4LjhYKVxuIiwKLQkJCQkJICB3YWxrX3N0YXRlLT5vcF9pbmZvLT5uYW1lLAotCQkJCQkgIHdhbGtfc3RhdGUtPm9wX2luZm8tPmZsYWdzKSk7Ci0KLQkJCS8qIEV4ZWN1dGluZyBhIHR5cGUxIG9yIHR5cGUyIG9wY29kZSBvdXRzaWRlIG9mIGEgbWV0aG9kICovCi0KLQkJCXN0YXR1cyA9IGFjcGlfZHNfZXhlY19lbmRfb3Aod2Fsa19zdGF0ZSk7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLQkJfQotI2VuZGlmCi0jZW5kaWYKLQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKLQl9Ci0KLQlpZiAob3AtPmNvbW1vbi5hbWxfb3Bjb2RlID09IEFNTF9TQ09QRV9PUCkgewotCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0RJU1BBVENILAotCQkJCSAgIkVuZGluZyBzY29wZSBPcD0lcCBTdGF0ZT0lcFxuIiwgb3AsCi0JCQkJICB3YWxrX3N0YXRlKSk7Ci0JfQotCi0Jb2JqZWN0X3R5cGUgPSB3YWxrX3N0YXRlLT5vcF9pbmZvLT5vYmplY3RfdHlwZTsKLQotCS8qCi0JICogR2V0IHRoZSBOb2RlL25hbWUgZnJvbSB0aGUgZWFybGllciBsb29rdXAKLQkgKiAoSXQgd2FzIHNhdmVkIGluIHRoZSAqb3Agc3RydWN0dXJlKQotCSAqLwotCW5vZGUgPSBvcC0+Y29tbW9uLm5vZGU7Ci0KLQkvKgotCSAqIFB1dCB0aGUgTm9kZSBvbiB0aGUgb2JqZWN0IHN0YWNrIChDb250YWlucyB0aGUgQUNQSSBOYW1lIG9mCi0JICogdGhpcyBvYmplY3QpCi0JICovCi0Jd2Fsa19zdGF0ZS0+b3BlcmFuZHNbMF0gPSAodm9pZCAqKW5vZGU7Ci0Jd2Fsa19zdGF0ZS0+bnVtX29wZXJhbmRzID0gMTsKLQotCS8qIFBvcCB0aGUgc2NvcGUgc3RhY2sgKi8KLQotCWlmIChhY3BpX25zX29wZW5zX3Njb3BlKG9iamVjdF90eXBlKSAmJgotCSAgICAob3AtPmNvbW1vbi5hbWxfb3Bjb2RlICE9IEFNTF9JTlRfTUVUSE9EQ0FMTF9PUCkpIHsKLQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9ESVNQQVRDSCwKLQkJCQkgICIoJXMpIFBvcHBpbmcgc2NvcGUgZm9yIE9wICVwXG4iLAotCQkJCSAgYWNwaV91dF9nZXRfdHlwZV9uYW1lKG9iamVjdF90eXBlKSwgb3ApKTsKLQotCQlzdGF0dXMgPSBhY3BpX2RzX3Njb3BlX3N0YWNrX3BvcCh3YWxrX3N0YXRlKTsKLQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCQlnb3RvIGNsZWFudXA7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIE5hbWVkIG9wZXJhdGlvbnMgYXJlIGFzIGZvbGxvd3M6Ci0JICoKLQkgKiBBTUxfQUxJQVMKLQkgKiBBTUxfQkFOS0ZJRUxECi0JICogQU1MX0NSRUFURUJJVEZJRUxECi0JICogQU1MX0NSRUFURUJZVEVGSUVMRAotCSAqIEFNTF9DUkVBVEVEV09SREZJRUxECi0JICogQU1MX0NSRUFURUZJRUxECi0JICogQU1MX0NSRUFURVFXT1JERklFTEQKLQkgKiBBTUxfQ1JFQVRFV09SREZJRUxECi0JICogQU1MX0RBVEFfUkVHSU9OCi0JICogQU1MX0RFVklDRQotCSAqIEFNTF9FVkVOVAotCSAqIEFNTF9GSUVMRAotCSAqIEFNTF9JTkRFWEZJRUxECi0JICogQU1MX01FVEhPRAotCSAqIEFNTF9NRVRIT0RDQUxMCi0JICogQU1MX01VVEVYCi0JICogQU1MX05BTUUKLQkgKiBBTUxfTkFNRURGSUVMRAotCSAqIEFNTF9PUFJFR0lPTgotCSAqIEFNTF9QT1dFUlJFUwotCSAqIEFNTF9QUk9DRVNTT1IKLQkgKiBBTUxfU0NPUEUKLQkgKiBBTUxfVEhFUk1BTFpPTkUKLQkgKi8KLQotCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRElTUEFUQ0gsCi0JCQkgICJDcmVhdGUtTG9hZCBbJXNdIFN0YXRlPSVwIE9wPSVwIE5hbWVkT2JqPSVwXG4iLAotCQkJICBhY3BpX3BzX2dldF9vcGNvZGVfbmFtZShvcC0+Y29tbW9uLmFtbF9vcGNvZGUpLAotCQkJICB3YWxrX3N0YXRlLCBvcCwgbm9kZSkpOwotCi0JLyogRGVjb2RlIHRoZSBvcGNvZGUgKi8KLQotCWFyZyA9IG9wLT5jb21tb24udmFsdWUuYXJnOwotCi0Jc3dpdGNoICh3YWxrX3N0YXRlLT5vcF9pbmZvLT50eXBlKSB7Ci0jaWZuZGVmIEFDUElfTk9fTUVUSE9EX0VYRUNVVElPTgotCi0JY2FzZSBBTUxfVFlQRV9DUkVBVEVfRklFTEQ6Ci0JCS8qCi0JCSAqIENyZWF0ZSB0aGUgZmllbGQgb2JqZWN0LCBidXQgdGhlIGZpZWxkIGJ1ZmZlciBhbmQgaW5kZXggbXVzdAotCQkgKiBiZSBldmFsdWF0ZWQgbGF0ZXIgZHVyaW5nIHRoZSBleGVjdXRpb24gcGhhc2UKLQkJICovCi0JCXN0YXR1cyA9IGFjcGlfZHNfY3JlYXRlX2J1ZmZlcl9maWVsZChvcCwgd2Fsa19zdGF0ZSk7Ci0JCWJyZWFrOwotCi0JY2FzZSBBTUxfVFlQRV9OQU1FRF9GSUVMRDoKLQkJLyoKLQkJICogSWYgd2UgYXJlIGV4ZWN1dGluZyBhIG1ldGhvZCwgaW5pdGlhbGl6ZSB0aGUgZmllbGQKLQkJICovCi0JCWlmICh3YWxrX3N0YXRlLT5tZXRob2Rfbm9kZSkgewotCQkJc3RhdHVzID0gYWNwaV9kc19pbml0X2ZpZWxkX29iamVjdHMob3AsIHdhbGtfc3RhdGUpOwotCQl9Ci0KLQkJc3dpdGNoIChvcC0+Y29tbW9uLmFtbF9vcGNvZGUpIHsKLQkJY2FzZSBBTUxfSU5ERVhfRklFTERfT1A6Ci0KLQkJCXN0YXR1cyA9Ci0JCQkgICAgYWNwaV9kc19jcmVhdGVfaW5kZXhfZmllbGQob3AsCi0JCQkJCQkgICAgICAgKGFjcGlfaGFuZGxlKSBhcmctPgotCQkJCQkJICAgICAgIGNvbW1vbi5ub2RlLCB3YWxrX3N0YXRlKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgQU1MX0JBTktfRklFTERfT1A6Ci0KLQkJCXN0YXR1cyA9Ci0JCQkgICAgYWNwaV9kc19jcmVhdGVfYmFua19maWVsZChvcCwgYXJnLT5jb21tb24ubm9kZSwKLQkJCQkJCSAgICAgIHdhbGtfc3RhdGUpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBBTUxfRklFTERfT1A6Ci0KLQkJCXN0YXR1cyA9Ci0JCQkgICAgYWNwaV9kc19jcmVhdGVfZmllbGQob3AsIGFyZy0+Y29tbW9uLm5vZGUsCi0JCQkJCQkgd2Fsa19zdGF0ZSk7Ci0JCQlicmVhazsKLQotCQlkZWZhdWx0OgotCQkJLyogQWxsIE5BTUVEX0ZJRUxEIG9wY29kZXMgbXVzdCBiZSBoYW5kbGVkIGFib3ZlICovCi0JCQlicmVhazsKLQkJfQotCQlicmVhazsKLQotCWNhc2UgQU1MX1RZUEVfTkFNRURfU0lNUExFOgotCi0JCXN0YXR1cyA9IGFjcGlfZHNfY3JlYXRlX29wZXJhbmRzKHdhbGtfc3RhdGUsIGFyZyk7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQkJZ290byBjbGVhbnVwOwotCQl9Ci0KLQkJc3dpdGNoIChvcC0+Y29tbW9uLmFtbF9vcGNvZGUpIHsKLQkJY2FzZSBBTUxfUFJPQ0VTU09SX09QOgotCi0JCQlzdGF0dXMgPSBhY3BpX2V4X2NyZWF0ZV9wcm9jZXNzb3Iod2Fsa19zdGF0ZSk7Ci0JCQlicmVhazsKLQotCQljYXNlIEFNTF9QT1dFUl9SRVNfT1A6Ci0KLQkJCXN0YXR1cyA9IGFjcGlfZXhfY3JlYXRlX3Bvd2VyX3Jlc291cmNlKHdhbGtfc3RhdGUpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBBTUxfTVVURVhfT1A6Ci0KLQkJCXN0YXR1cyA9IGFjcGlfZXhfY3JlYXRlX211dGV4KHdhbGtfc3RhdGUpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBBTUxfRVZFTlRfT1A6Ci0KLQkJCXN0YXR1cyA9IGFjcGlfZXhfY3JlYXRlX2V2ZW50KHdhbGtfc3RhdGUpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBBTUxfQUxJQVNfT1A6Ci0KLQkJCXN0YXR1cyA9IGFjcGlfZXhfY3JlYXRlX2FsaWFzKHdhbGtfc3RhdGUpOwotCQkJYnJlYWs7Ci0KLQkJZGVmYXVsdDoKLQkJCS8qIFVua25vd24gb3Bjb2RlICovCi0KLQkJCXN0YXR1cyA9IEFFX09LOwotCQkJZ290byBjbGVhbnVwOwotCQl9Ci0KLQkJLyogRGVsZXRlIG9wZXJhbmRzICovCi0KLQkJZm9yIChpID0gMTsgaSA8IHdhbGtfc3RhdGUtPm51bV9vcGVyYW5kczsgaSsrKSB7Ci0JCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2Uod2Fsa19zdGF0ZS0+b3BlcmFuZHNbaV0pOwotCQkJd2Fsa19zdGF0ZS0+b3BlcmFuZHNbaV0gPSBOVUxMOwotCQl9Ci0KLQkJYnJlYWs7Ci0jZW5kaWYJCQkJLyogQUNQSV9OT19NRVRIT0RfRVhFQ1VUSU9OICovCi0KLQljYXNlIEFNTF9UWVBFX05BTUVEX0NPTVBMRVg6Ci0KLQkJc3dpdGNoIChvcC0+Y29tbW9uLmFtbF9vcGNvZGUpIHsKLSNpZm5kZWYgQUNQSV9OT19NRVRIT0RfRVhFQ1VUSU9OCi0JCWNhc2UgQU1MX1JFR0lPTl9PUDoKLQkJY2FzZSBBTUxfREFUQV9SRUdJT05fT1A6Ci0KLQkJCWlmIChvcC0+Y29tbW9uLmFtbF9vcGNvZGUgPT0gQU1MX1JFR0lPTl9PUCkgewotCQkJCXJlZ2lvbl9zcGFjZSA9IChhY3BpX2Fkcl9zcGFjZV90eXBlKQotCQkJCSAgICAoKG9wLT5jb21tb24udmFsdWUuYXJnKS0+Y29tbW9uLnZhbHVlLgotCQkJCSAgICAgaW50ZWdlcik7Ci0JCQl9IGVsc2UgewotCQkJCXJlZ2lvbl9zcGFjZSA9IFJFR0lPTl9EQVRBX1RBQkxFOwotCQkJfQotCi0JCQkvKgotCQkJICogSWYgd2UgYXJlIGV4ZWN1dGluZyBhIG1ldGhvZCwgaW5pdGlhbGl6ZSB0aGUgcmVnaW9uCi0JCQkgKi8KLQkJCWlmICh3YWxrX3N0YXRlLT5tZXRob2Rfbm9kZSkgewotCQkJCXN0YXR1cyA9Ci0JCQkJICAgIGFjcGlfZXhfY3JlYXRlX3JlZ2lvbihvcC0+bmFtZWQuZGF0YSwKLQkJCQkJCQkgIG9wLT5uYW1lZC5sZW5ndGgsCi0JCQkJCQkJICByZWdpb25fc3BhY2UsCi0JCQkJCQkJICB3YWxrX3N0YXRlKTsKLQkJCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJCQkJcmV0dXJuIChzdGF0dXMpOwotCQkJCX0KLQkJCX0KLQotCQkJLyoKLQkJCSAqIFRoZSBvcF9yZWdpb24gaXMgbm90IGZ1bGx5IHBhcnNlZCBhdCB0aGlzIHRpbWUuIE9ubHkgdmFsaWQKLQkJCSAqIGFyZ3VtZW50IGlzIHRoZSBzcGFjZV9pZC4gKFdlIG11c3Qgc2F2ZSB0aGUgYWRkcmVzcyBvZiB0aGUKLQkJCSAqIEFNTCBvZiB0aGUgYWRkcmVzcyBhbmQgbGVuZ3RoIG9wZXJhbmRzKQotCQkJICovCi0KLQkJCS8qCi0JCQkgKiBJZiB3ZSBoYXZlIGEgdmFsaWQgcmVnaW9uLCBpbml0aWFsaXplIGl0Ci0JCQkgKiBOYW1lc3BhY2UgaXMgTk9UIGxvY2tlZCBhdCB0aGlzIHBvaW50LgotCQkJICovCi0JCQlzdGF0dXMgPQotCQkJICAgIGFjcGlfZXZfaW5pdGlhbGl6ZV9yZWdpb24KLQkJCSAgICAoYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0KG5vZGUpLCBGQUxTRSk7Ci0JCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJCQkvKgotCQkJCSAqICBJZiBBRV9OT1RfRVhJU1QgaXMgcmV0dXJuZWQsIGl0IGlzIG5vdCBmYXRhbAotCQkJCSAqICBiZWNhdXNlIG1hbnkgcmVnaW9ucyBnZXQgY3JlYXRlZCBiZWZvcmUgYSBoYW5kbGVyCi0JCQkJICogIGlzIGluc3RhbGxlZCBmb3Igc2FpZCByZWdpb24uCi0JCQkJICovCi0JCQkJaWYgKEFFX05PVF9FWElTVCA9PSBzdGF0dXMpIHsKLQkJCQkJc3RhdHVzID0gQUVfT0s7Ci0JCQkJfQotCQkJfQotCQkJYnJlYWs7Ci0KLQkJY2FzZSBBTUxfTkFNRV9PUDoKLQotCQkJc3RhdHVzID0gYWNwaV9kc19jcmVhdGVfbm9kZSh3YWxrX3N0YXRlLCBub2RlLCBvcCk7Ci0JCQlicmVhazsKLQotCQljYXNlIEFNTF9NRVRIT0RfT1A6Ci0JCQkvKgotCQkJICogbWV0aG9kX29wIHBrZ19sZW5ndGggbmFtZV9zdHJpbmcgbWV0aG9kX2ZsYWdzIHRlcm1fbGlzdAotCQkJICoKLQkJCSAqIE5vdGU6IFdlIG11c3QgY3JlYXRlIHRoZSBtZXRob2Qgbm9kZS9vYmplY3QgcGFpciBhcyBzb29uIGFzIHdlCi0JCQkgKiBzZWUgdGhlIG1ldGhvZCBkZWNsYXJhdGlvbi4gVGhpcyBhbGxvd3MgbGF0ZXIgcGFzczEgcGFyc2luZwotCQkJICogb2YgaW52b2NhdGlvbnMgb2YgdGhlIG1ldGhvZCAobmVlZCB0byBrbm93IHRoZSBudW1iZXIgb2YKLQkJCSAqIGFyZ3VtZW50cy4pCi0JCQkgKi8KLQkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRElTUEFUQ0gsCi0JCQkJCSAgIkxPQURJTkctTWV0aG9kOiBTdGF0ZT0lcCBPcD0lcCBOYW1lZE9iaj0lcFxuIiwKLQkJCQkJICB3YWxrX3N0YXRlLCBvcCwgb3AtPm5hbWVkLm5vZGUpKTsKLQotCQkJaWYgKCFhY3BpX25zX2dldF9hdHRhY2hlZF9vYmplY3Qob3AtPm5hbWVkLm5vZGUpKSB7Ci0JCQkJd2Fsa19zdGF0ZS0+b3BlcmFuZHNbMF0gPQotCQkJCSAgICBBQ1BJX0NBU1RfUFRSKHZvaWQsIG9wLT5uYW1lZC5ub2RlKTsKLQkJCQl3YWxrX3N0YXRlLT5udW1fb3BlcmFuZHMgPSAxOwotCi0JCQkJc3RhdHVzID0KLQkJCQkgICAgYWNwaV9kc19jcmVhdGVfb3BlcmFuZHMod2Fsa19zdGF0ZSwKLQkJCQkJCQkgICAgb3AtPmNvbW1vbi52YWx1ZS4KLQkJCQkJCQkgICAgYXJnKTsKLQkJCQlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpIHsKLQkJCQkJc3RhdHVzID0KLQkJCQkJICAgIGFjcGlfZXhfY3JlYXRlX21ldGhvZChvcC0+bmFtZWQuCi0JCQkJCQkJCSAgZGF0YSwKLQkJCQkJCQkJICBvcC0+bmFtZWQuCi0JCQkJCQkJCSAgbGVuZ3RoLAotCQkJCQkJCQkgIHdhbGtfc3RhdGUpOwotCQkJCX0KLQkJCQl3YWxrX3N0YXRlLT5vcGVyYW5kc1swXSA9IE5VTEw7Ci0JCQkJd2Fsa19zdGF0ZS0+bnVtX29wZXJhbmRzID0gMDsKLQotCQkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLQkJCQl9Ci0JCQl9Ci0JCQlicmVhazsKLQotI2VuZGlmCQkJCS8qIEFDUElfTk9fTUVUSE9EX0VYRUNVVElPTiAqLwotCi0JCWRlZmF1bHQ6Ci0JCQkvKiBBbGwgTkFNRURfQ09NUExFWCBvcGNvZGVzIG11c3QgYmUgaGFuZGxlZCBhYm92ZSAqLwotCQkJYnJlYWs7Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIEFNTF9DTEFTU19JTlRFUk5BTDoKLQotCQkvKiBjYXNlIEFNTF9JTlRfTkFNRVBBVEhfT1A6ICovCi0JCWJyZWFrOwotCi0JY2FzZSBBTUxfQ0xBU1NfTUVUSE9EX0NBTEw6Ci0KLQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9ESVNQQVRDSCwKLQkJCQkgICJSRVNPTFZJTkctTWV0aG9kQ2FsbDogU3RhdGU9JXAgT3A9JXAgTmFtZWRPYmo9JXBcbiIsCi0JCQkJICB3YWxrX3N0YXRlLCBvcCwgbm9kZSkpOwotCi0JCS8qCi0JCSAqIExvb2t1cCB0aGUgbWV0aG9kIG5hbWUgYW5kIHNhdmUgdGhlIE5vZGUKLQkJICovCi0JCXN0YXR1cyA9Ci0JCSAgICBhY3BpX25zX2xvb2t1cCh3YWxrX3N0YXRlLT5zY29wZV9pbmZvLAotCQkJCSAgIGFyZy0+Y29tbW9uLnZhbHVlLnN0cmluZywgQUNQSV9UWVBFX0FOWSwKLQkJCQkgICBBQ1BJX0lNT0RFX0xPQURfUEFTUzIsCi0JCQkJICAgQUNQSV9OU19TRUFSQ0hfUEFSRU5UIHwKLQkJCQkgICBBQ1BJX05TX0RPTlRfT1BFTl9TQ09QRSwgd2Fsa19zdGF0ZSwKLQkJCQkgICAmKG5ld19ub2RlKSk7Ci0JCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkgewotCQkJLyoKLQkJCSAqIE1ha2Ugc3VyZSB0aGF0IHdoYXQgd2UgZm91bmQgaXMgaW5kZWVkIGEgbWV0aG9kCi0JCQkgKiBXZSBkaWRuJ3Qgc2VhcmNoIGZvciBhIG1ldGhvZCBvbiBwdXJwb3NlLCB0byBzZWUgaWYgdGhlIG5hbWUKLQkJCSAqIHdvdWxkIHJlc29sdmUKLQkJCSAqLwotCQkJaWYgKG5ld19ub2RlLT50eXBlICE9IEFDUElfVFlQRV9NRVRIT0QpIHsKLQkJCQlzdGF0dXMgPSBBRV9BTUxfT1BFUkFORF9UWVBFOwotCQkJfQotCi0JCQkvKiBXZSBjb3VsZCBwdXQgdGhlIHJldHVybmVkIG9iamVjdCAoTm9kZSkgb24gdGhlIG9iamVjdCBzdGFjayBmb3IKLQkJCSAqIGxhdGVyLCBidXQgZm9yIG5vdywgd2Ugd2lsbCBwdXQgaXQgaW4gdGhlICJvcCIgb2JqZWN0IHRoYXQgdGhlCi0JCQkgKiBwYXJzZXIgdXNlcywgc28gd2UgY2FuIGdldCBpdCBhZ2FpbiBhdCB0aGUgZW5kIG9mIHRoaXMgc2NvcGUKLQkJCSAqLwotCQkJb3AtPmNvbW1vbi5ub2RlID0gbmV3X25vZGU7Ci0JCX0gZWxzZSB7Ci0JCQlBQ1BJX0VSUk9SX05BTUVTUEFDRShhcmctPmNvbW1vbi52YWx1ZS5zdHJpbmcsIHN0YXR1cyk7Ci0JCX0KLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlicmVhazsKLQl9Ci0KLSAgICAgIGNsZWFudXA6Ci0KLQkvKiBSZW1vdmUgdGhlIE5vZGUgcHVzaGVkIGF0IHRoZSB2ZXJ5IGJlZ2lubmluZyAqLwotCi0Jd2Fsa19zdGF0ZS0+b3BlcmFuZHNbMF0gPSBOVUxMOwotCXdhbGtfc3RhdGUtPm51bV9vcGVyYW5kcyA9IDA7Ci0JcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZGlzcGF0Y2hlci9kc3dzY29wZS5jIGIvZHJpdmVycy9hY3BpL2Rpc3BhdGNoZXIvZHN3c2NvcGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWU2MDczMi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL2FjcGkvZGlzcGF0Y2hlci9kc3dzY29wZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjEzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBNb2R1bGUgTmFtZTogZHN3c2NvcGUgLSBTY29wZSBzdGFjayBtYW5pcHVsYXRpb24KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA4LCBJbnRlbCBDb3JwLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAotICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgYXQgbWluaW11bSBhIGRpc2NsYWltZXIKLSAqICAgIHN1YnN0YW50aWFsbHkgc2ltaWxhciB0byB0aGUgIk5PIFdBUlJBTlRZIiBkaXNjbGFpbWVyIGJlbG93Ci0gKiAgICAoIkRpc2NsYWltZXIiKSBhbmQgYW55IHJlZGlzdHJpYnV0aW9uIG11c3QgYmUgY29uZGl0aW9uZWQgdXBvbgotICogICAgaW5jbHVkaW5nIGEgc3Vic3RhbnRpYWxseSBzaW1pbGFyIERpc2NsYWltZXIgcmVxdWlyZW1lbnQgZm9yIGZ1cnRoZXIKLSAqICAgIGJpbmFyeSByZWRpc3RyaWJ1dGlvbi4KLSAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcwotICogICAgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICogU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBOTyBXQVJSQU5UWQotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCi0gKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUwotICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcKLSAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQotICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgotICovCi0KLSNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KLSNpbmNsdWRlIDxhY3BpL2FjZGlzcGF0Lmg+Ci0KLSNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX0RJU1BBVENIRVIKLUFDUElfTU9EVUxFX05BTUUoImRzd3Njb3BlIikKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9kc19zY29wZV9zdGFja19jbGVhcgotICoKLSAqIFBBUkFNRVRFUlM6ICB3YWxrX3N0YXRlICAgICAgLSBDdXJyZW50IHN0YXRlCi0gKgotICogUkVUVVJOOiAgICAgIE5vbmUKLSAqCi0gKiBERVNDUklQVElPTjogUG9wIChhbmQgZnJlZSkgZXZlcnl0aGluZyBvbiB0aGUgc2NvcGUgc3RhY2sgZXhjZXB0IHRoZQotICogICAgICAgICAgICAgIHJvb3Qgc2NvcGUgb2JqZWN0ICh3aGljaCByZW1haW5zIGF0IHRoZSBzdGFjayB0b3AuKQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGFjcGlfZHNfc2NvcGVfc3RhY2tfY2xlYXIoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSkKLXsKLQl1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgKnNjb3BlX2luZm87Ci0KLQlBQ1BJX0ZVTkNUSU9OX05BTUUoZHNfc2NvcGVfc3RhY2tfY2xlYXIpOwotCi0Jd2hpbGUgKHdhbGtfc3RhdGUtPnNjb3BlX2luZm8pIHsKLQotCQkvKiBQb3AgYSBzY29wZSBvZmYgdGhlIHN0YWNrICovCi0KLQkJc2NvcGVfaW5mbyA9IHdhbGtfc3RhdGUtPnNjb3BlX2luZm87Ci0JCXdhbGtfc3RhdGUtPnNjb3BlX2luZm8gPSBzY29wZV9pbmZvLT5zY29wZS5uZXh0OwotCi0JCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVhFQywKLQkJCQkgICJQb3BwZWQgb2JqZWN0IHR5cGUgKCVzKVxuIiwKLQkJCQkgIGFjcGlfdXRfZ2V0X3R5cGVfbmFtZShzY29wZV9pbmZvLT5jb21tb24uCi0JCQkJCQkJdmFsdWUpKSk7Ci0JCWFjcGlfdXRfZGVsZXRlX2dlbmVyaWNfc3RhdGUoc2NvcGVfaW5mbyk7Ci0JfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX2RzX3Njb3BlX3N0YWNrX3B1c2gKLSAqCi0gKiBQQVJBTUVURVJTOiAgTm9kZSAgICAgICAgICAgIC0gTmFtZSB0byBiZSBtYWRlIGN1cnJlbnQKLSAqICAgICAgICAgICAgICBUeXBlICAgICAgICAgICAgLSBUeXBlIG9mIGZyYW1lIGJlaW5nIHB1c2hlZAotICogICAgICAgICAgICAgIHdhbGtfc3RhdGUgICAgICAtIEN1cnJlbnQgc3RhdGUKLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IFB1c2ggdGhlIGN1cnJlbnQgc2NvcGUgb24gdGhlIHNjb3BlIHN0YWNrLCBhbmQgbWFrZSB0aGUKLSAqICAgICAgICAgICAgICBwYXNzZWQgTm9kZSBjdXJyZW50LgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWFjcGlfc3RhdHVzCi1hY3BpX2RzX3Njb3BlX3N0YWNrX3B1c2goc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGUsCi0JCQkgYWNwaV9vYmplY3RfdHlwZSB0eXBlLAotCQkJIHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUpCi17Ci0JdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICpzY29wZV9pbmZvOwotCXVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSAqb2xkX3Njb3BlX2luZm87Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGRzX3Njb3BlX3N0YWNrX3B1c2gpOwotCi0JaWYgKCFub2RlKSB7Ci0KLQkJLyogSW52YWxpZCBzY29wZSAgICovCi0KLQkJQUNQSV9FUlJPUigoQUVfSU5GTywgIk51bGwgc2NvcGUgcGFyYW1ldGVyIikpOwotCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX1BBUkFNRVRFUik7Ci0JfQotCi0JLyogTWFrZSBzdXJlIG9iamVjdCB0eXBlIGlzIHZhbGlkICovCi0KLQlpZiAoIWFjcGlfdXRfdmFsaWRfb2JqZWN0X3R5cGUodHlwZSkpIHsKLQkJQUNQSV9XQVJOSU5HKChBRV9JTkZPLCAiSW52YWxpZCBvYmplY3QgdHlwZTogMHglWCIsIHR5cGUpKTsKLQl9Ci0KLQkvKiBBbGxvY2F0ZSBhIG5ldyBzY29wZSBvYmplY3QgKi8KLQotCXNjb3BlX2luZm8gPSBhY3BpX3V0X2NyZWF0ZV9nZW5lcmljX3N0YXRlKCk7Ci0JaWYgKCFzY29wZV9pbmZvKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT19NRU1PUlkpOwotCX0KLQotCS8qIEluaXQgbmV3IHNjb3BlIG9iamVjdCAqLwotCi0Jc2NvcGVfaW5mby0+Y29tbW9uLmRlc2NyaXB0b3JfdHlwZSA9IEFDUElfREVTQ19UWVBFX1NUQVRFX1dTQ09QRTsKLQlzY29wZV9pbmZvLT5zY29wZS5ub2RlID0gbm9kZTsKLQlzY29wZV9pbmZvLT5jb21tb24udmFsdWUgPSAodTE2KSB0eXBlOwotCi0Jd2Fsa19zdGF0ZS0+c2NvcGVfZGVwdGgrKzsKLQotCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVhFQywKLQkJCSAgIlslLjJkXSBQdXNoZWQgc2NvcGUgIiwKLQkJCSAgKHUzMikgd2Fsa19zdGF0ZS0+c2NvcGVfZGVwdGgpKTsKLQotCW9sZF9zY29wZV9pbmZvID0gd2Fsa19zdGF0ZS0+c2NvcGVfaW5mbzsKLQlpZiAob2xkX3Njb3BlX2luZm8pIHsKLQkJQUNQSV9ERUJVR19QUklOVF9SQVcoKEFDUElfREJfRVhFQywKLQkJCQkgICAgICAiWyU0LjRzXSAoJXMpIiwKLQkJCQkgICAgICBhY3BpX3V0X2dldF9ub2RlX25hbWUob2xkX3Njb3BlX2luZm8tPgotCQkJCQkJCSAgICBzY29wZS5ub2RlKSwKLQkJCQkgICAgICBhY3BpX3V0X2dldF90eXBlX25hbWUob2xkX3Njb3BlX2luZm8tPgotCQkJCQkJCSAgICBjb21tb24udmFsdWUpKSk7Ci0JfSBlbHNlIHsKLQkJQUNQSV9ERUJVR19QUklOVF9SQVcoKEFDUElfREJfRVhFQywgIltcXF9fX10gKCVzKSIsICJST09UIikpOwotCX0KLQotCUFDUElfREVCVUdfUFJJTlRfUkFXKChBQ1BJX0RCX0VYRUMsCi0JCQkgICAgICAiLCBOZXcgc2NvcGUgLT4gWyU0LjRzXSAoJXMpXG4iLAotCQkJICAgICAgYWNwaV91dF9nZXRfbm9kZV9uYW1lKHNjb3BlX2luZm8tPnNjb3BlLm5vZGUpLAotCQkJICAgICAgYWNwaV91dF9nZXRfdHlwZV9uYW1lKHNjb3BlX2luZm8tPmNvbW1vbi52YWx1ZSkpKTsKLQotCS8qIFB1c2ggbmV3IHNjb3BlIG9iamVjdCBvbnRvIHN0YWNrICovCi0KLQlhY3BpX3V0X3B1c2hfZ2VuZXJpY19zdGF0ZSgmd2Fsa19zdGF0ZS0+c2NvcGVfaW5mbywgc2NvcGVfaW5mbyk7Ci0JcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9kc19zY29wZV9zdGFja19wb3AKLSAqCi0gKiBQQVJBTUVURVJTOiAgd2Fsa19zdGF0ZSAgICAgIC0gQ3VycmVudCBzdGF0ZQotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKLSAqCi0gKiBERVNDUklQVElPTjogUG9wIHRoZSBzY29wZSBzdGFjayBvbmNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWFjcGlfc3RhdHVzIGFjcGlfZHNfc2NvcGVfc3RhY2tfcG9wKHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUpCi17Ci0JdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICpzY29wZV9pbmZvOwotCXVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSAqbmV3X3Njb3BlX2luZm87Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGRzX3Njb3BlX3N0YWNrX3BvcCk7Ci0KLQkvKgotCSAqIFBvcCBzY29wZSBpbmZvIG9iamVjdCBvZmYgdGhlIHN0YWNrLgotCSAqLwotCXNjb3BlX2luZm8gPSBhY3BpX3V0X3BvcF9nZW5lcmljX3N0YXRlKCZ3YWxrX3N0YXRlLT5zY29wZV9pbmZvKTsKLQlpZiAoIXNjb3BlX2luZm8pIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX1NUQUNLX1VOREVSRkxPVyk7Ci0JfQotCi0Jd2Fsa19zdGF0ZS0+c2NvcGVfZGVwdGgtLTsKLQotCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVhFQywKLQkJCSAgIlslLjJkXSBQb3BwZWQgc2NvcGUgWyU0LjRzXSAoJXMpLCBOZXcgc2NvcGUgLT4gIiwKLQkJCSAgKHUzMikgd2Fsa19zdGF0ZS0+c2NvcGVfZGVwdGgsCi0JCQkgIGFjcGlfdXRfZ2V0X25vZGVfbmFtZShzY29wZV9pbmZvLT5zY29wZS5ub2RlKSwKLQkJCSAgYWNwaV91dF9nZXRfdHlwZV9uYW1lKHNjb3BlX2luZm8tPmNvbW1vbi52YWx1ZSkpKTsKLQotCW5ld19zY29wZV9pbmZvID0gd2Fsa19zdGF0ZS0+c2NvcGVfaW5mbzsKLQlpZiAobmV3X3Njb3BlX2luZm8pIHsKLQkJQUNQSV9ERUJVR19QUklOVF9SQVcoKEFDUElfREJfRVhFQywKLQkJCQkgICAgICAiWyU0LjRzXSAoJXMpXG4iLAotCQkJCSAgICAgIGFjcGlfdXRfZ2V0X25vZGVfbmFtZShuZXdfc2NvcGVfaW5mby0+Ci0JCQkJCQkJICAgIHNjb3BlLm5vZGUpLAotCQkJCSAgICAgIGFjcGlfdXRfZ2V0X3R5cGVfbmFtZShuZXdfc2NvcGVfaW5mby0+Ci0JCQkJCQkJICAgIGNvbW1vbi52YWx1ZSkpKTsKLQl9IGVsc2UgewotCQlBQ1BJX0RFQlVHX1BSSU5UX1JBVygoQUNQSV9EQl9FWEVDLCAiW1xcX19fXSAoUk9PVClcbiIpKTsKLQl9Ci0KLQlhY3BpX3V0X2RlbGV0ZV9nZW5lcmljX3N0YXRlKHNjb3BlX2luZm8pOwotCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZGlzcGF0Y2hlci9kc3dzdGF0ZS5jIGIvZHJpdmVycy9hY3BpL2Rpc3BhdGNoZXIvZHN3c3RhdGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjAwZDRhZi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL2FjcGkvZGlzcGF0Y2hlci9kc3dzdGF0ZS5jCisrKyAvZGV2L251bGwKQEAgLTEsNzUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBNb2R1bGUgTmFtZTogZHN3c3RhdGUgLSBEaXNwYXRjaGVyIHBhcnNlIHRyZWUgd2FsayBtYW5hZ2VtZW50IHJvdXRpbmVzCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwOCwgSW50ZWwgQ29ycC4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKLSAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIGF0IG1pbmltdW0gYSBkaXNjbGFpbWVyCi0gKiAgICBzdWJzdGFudGlhbGx5IHNpbWlsYXIgdG8gdGhlICJOTyBXQVJSQU5UWSIgZGlzY2xhaW1lciBiZWxvdwotICogICAgKCJEaXNjbGFpbWVyIikgYW5kIGFueSByZWRpc3RyaWJ1dGlvbiBtdXN0IGJlIGNvbmRpdGlvbmVkIHVwb24KLSAqICAgIGluY2x1ZGluZyBhIHN1YnN0YW50aWFsbHkgc2ltaWxhciBEaXNjbGFpbWVyIHJlcXVpcmVtZW50IGZvciBmdXJ0aGVyCi0gKiAgICBiaW5hcnkgcmVkaXN0cmlidXRpb24uCi0gKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMKLSAqICAgIG9mIGFueSBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTk8gV0FSUkFOVFkKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAotICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKLSAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HCi0gKiBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKLSAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KLSAqLwotCi0jaW5jbHVkZSA8YWNwaS9hY3BpLmg+Ci0jaW5jbHVkZSA8YWNwaS9hY3BhcnNlci5oPgotI2luY2x1ZGUgPGFjcGkvYWNkaXNwYXQuaD4KLSNpbmNsdWRlIDxhY3BpL2FjbmFtZXNwLmg+Ci0KLSNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX0RJU1BBVENIRVIKLUFDUElfTU9EVUxFX05BTUUoImRzd3N0YXRlIikKLQotICAvKiBMb2NhbCBwcm90b3R5cGVzICovCi1zdGF0aWMgYWNwaV9zdGF0dXMgYWNwaV9kc19yZXN1bHRfc3RhY2tfcHVzaChzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3cyk7Ci1zdGF0aWMgYWNwaV9zdGF0dXMgYWNwaV9kc19yZXN1bHRfc3RhY2tfcG9wKHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndzKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9kc19yZXN1bHRfcG9wCi0gKgotICogUEFSQU1FVEVSUzogIE9iamVjdCAgICAgICAgICAgICAgLSBXaGVyZSB0byByZXR1cm4gdGhlIHBvcHBlZCBvYmplY3QKLSAqICAgICAgICAgICAgICB3YWxrX3N0YXRlICAgICAgICAgIC0gQ3VycmVudCBXYWxrIHN0YXRlCi0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cwotICoKLSAqIERFU0NSSVBUSU9OOiBQb3AgYW4gb2JqZWN0IG9mZiB0aGUgdG9wIG9mIHRoaXMgd2FsaydzIHJlc3VsdCBzdGFjawotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWFjcGlfc3RhdHVzCi1hY3BpX2RzX3Jlc3VsdF9wb3AodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKm9iamVjdCwKLQkJICAgc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSkKLXsKLQl1MzIgaW5kZXg7Ci0JdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICpzdGF0ZTsKLQlhY3BpX3N0YXR1cyBzdGF0dXM7Ci0KLQlBQ1BJX0ZVTkNUSU9OX05BTUUoZHNfcmVzdWx0X3BvcCk7Ci0KLQlzdGF0ZSA9IHdhbGtfc3RhdGUtPnJlc3VsdHM7Ci0KLQkvKiBJbmNvcnJlY3Qgc3RhdGUgb2YgcmVzdWx0IHN0YWNrICovCi0KLQlpZiAoc3RhdGUgJiYgIXdhbGtfc3RhdGUtPnJlc3VsdF9jb3VudCkgewotCQlBQ1BJX0VSUk9SKChBRV9JTkZPLCAiTm8gcmVzdWx0cyBvbiByZXN1bHQgc3RhY2siKSk7Ci0JCXJldHVybiAoQUVfQU1MX0lOVEVSTkFMKTsKLQl9Ci0KLQlpZiAoIXN0YXRlICYmIHdhbGtfc3RhdGUtPnJlc3VsdF9jb3VudCkgewotCQlBQ1BJX0VSUk9SKChBRV9JTkZPLCAiTm8gcmVzdWx0IHN0YXRlIGZvciByZXN1bHQgc3RhY2siKSk7Ci0JCXJldHVybiAoQUVfQU1MX0lOVEVSTkFMKTsKLQl9Ci0KLQkvKiBFbXB0eSByZXN1bHQgc3RhY2sgKi8KLQotCWlmICghc3RhdGUpIHsKLQkJQUNQSV9FUlJPUigoQUVfSU5GTywgIlJlc3VsdCBzdGFjayBpcyBlbXB0eSEgU3RhdGU9JXAiLAotCQkJICAgIHdhbGtfc3RhdGUpKTsKLQkJcmV0dXJuIChBRV9BTUxfTk9fUkVUVVJOX1ZBTFVFKTsKLQl9Ci0KLQkvKiBSZXR1cm4gb2JqZWN0IG9mIHRoZSB0b3AgZWxlbWVudCBhbmQgY2xlYW4gdGhhdCB0b3AgZWxlbWVudCByZXN1bHQgc3RhY2sgKi8KLQotCXdhbGtfc3RhdGUtPnJlc3VsdF9jb3VudC0tOwotCWluZGV4ID0gd2Fsa19zdGF0ZS0+cmVzdWx0X2NvdW50ICUgQUNQSV9SRVNVTFRTX0ZSQU1FX09CSl9OVU07Ci0KLQkqb2JqZWN0ID0gc3RhdGUtPnJlc3VsdHMub2JqX2Rlc2NbaW5kZXhdOwotCWlmICghKm9iamVjdCkgewotCQlBQ1BJX0VSUk9SKChBRV9JTkZPLAotCQkJICAgICJObyByZXN1bHQgb2JqZWN0cyBvbiByZXN1bHQgc3RhY2ssIFN0YXRlPSVwIiwKLQkJCSAgICB3YWxrX3N0YXRlKSk7Ci0JCXJldHVybiAoQUVfQU1MX05PX1JFVFVSTl9WQUxVRSk7Ci0JfQotCi0Jc3RhdGUtPnJlc3VsdHMub2JqX2Rlc2NbaW5kZXhdID0gTlVMTDsKLQlpZiAoaW5kZXggPT0gMCkgewotCQlzdGF0dXMgPSBhY3BpX2RzX3Jlc3VsdF9zdGFja19wb3Aod2Fsa19zdGF0ZSk7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQkJcmV0dXJuIChzdGF0dXMpOwotCQl9Ci0JfQotCi0JQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FWEVDLAotCQkJICAiT2JqPSVwIFslc10gSW5kZXg9JVggU3RhdGU9JXAgTnVtPSVYXG4iLCAqb2JqZWN0LAotCQkJICBhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lKCpvYmplY3QpLAotCQkJICBpbmRleCwgd2Fsa19zdGF0ZSwgd2Fsa19zdGF0ZS0+cmVzdWx0X2NvdW50KSk7Ci0KLQlyZXR1cm4gKEFFX09LKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9kc19yZXN1bHRfcHVzaAotICoKLSAqIFBBUkFNRVRFUlM6ICBPYmplY3QgICAgICAgICAgICAgIC0gV2hlcmUgdG8gcmV0dXJuIHRoZSBwb3BwZWQgb2JqZWN0Ci0gKiAgICAgICAgICAgICAgd2Fsa19zdGF0ZSAgICAgICAgICAtIEN1cnJlbnQgV2FsayBzdGF0ZQotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKLSAqCi0gKiBERVNDUklQVElPTjogUHVzaCBhbiBvYmplY3Qgb250byB0aGUgY3VycmVudCByZXN1bHQgc3RhY2sKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1hY3BpX3N0YXR1cwotYWNwaV9kc19yZXN1bHRfcHVzaCh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICogb2JqZWN0LAotCQkgICAgc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqIHdhbGtfc3RhdGUpCi17Ci0JdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICpzdGF0ZTsKLQlhY3BpX3N0YXR1cyBzdGF0dXM7Ci0JdTMyIGluZGV4OwotCi0JQUNQSV9GVU5DVElPTl9OQU1FKGRzX3Jlc3VsdF9wdXNoKTsKLQotCWlmICh3YWxrX3N0YXRlLT5yZXN1bHRfY291bnQgPiB3YWxrX3N0YXRlLT5yZXN1bHRfc2l6ZSkgewotCQlBQ1BJX0VSUk9SKChBRV9JTkZPLCAiUmVzdWx0IHN0YWNrIGlzIGZ1bGwiKSk7Ci0JCXJldHVybiAoQUVfQU1MX0lOVEVSTkFMKTsKLQl9IGVsc2UgaWYgKHdhbGtfc3RhdGUtPnJlc3VsdF9jb3VudCA9PSB3YWxrX3N0YXRlLT5yZXN1bHRfc2l6ZSkgewotCi0JCS8qIEV4dGVuZCB0aGUgcmVzdWx0IHN0YWNrICovCi0KLQkJc3RhdHVzID0gYWNwaV9kc19yZXN1bHRfc3RhY2tfcHVzaCh3YWxrX3N0YXRlKTsKLQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCQlBQ1BJX0VSUk9SKChBRV9JTkZPLAotCQkJCSAgICAiRmFpbGVkIHRvIGV4dGVuZCB0aGUgcmVzdWx0IHN0YWNrIikpOwotCQkJcmV0dXJuIChzdGF0dXMpOwotCQl9Ci0JfQotCi0JaWYgKCEod2Fsa19zdGF0ZS0+cmVzdWx0X2NvdW50IDwgd2Fsa19zdGF0ZS0+cmVzdWx0X3NpemUpKSB7Ci0JCUFDUElfRVJST1IoKEFFX0lORk8sICJObyBmcmVlIGVsZW1lbnRzIGluIHJlc3VsdCBzdGFjayIpKTsKLQkJcmV0dXJuIChBRV9BTUxfSU5URVJOQUwpOwotCX0KLQotCXN0YXRlID0gd2Fsa19zdGF0ZS0+cmVzdWx0czsKLQlpZiAoIXN0YXRlKSB7Ci0JCUFDUElfRVJST1IoKEFFX0lORk8sICJObyByZXN1bHQgc3RhY2sgZnJhbWUgZHVyaW5nIHB1c2giKSk7Ci0JCXJldHVybiAoQUVfQU1MX0lOVEVSTkFMKTsKLQl9Ci0KLQlpZiAoIW9iamVjdCkgewotCQlBQ1BJX0VSUk9SKChBRV9JTkZPLAotCQkJICAgICJOdWxsIE9iamVjdCEgT2JqPSVwIFN0YXRlPSVwIE51bT0lWCIsCi0JCQkgICAgb2JqZWN0LCB3YWxrX3N0YXRlLCB3YWxrX3N0YXRlLT5yZXN1bHRfY291bnQpKTsKLQkJcmV0dXJuIChBRV9CQURfUEFSQU1FVEVSKTsKLQl9Ci0KLQkvKiBBc3NpZ24gdGhlIGFkZHJlc3Mgb2Ygb2JqZWN0IHRvIHRoZSB0b3AgZnJlZSBlbGVtZW50IG9mIHJlc3VsdCBzdGFjayAqLwotCi0JaW5kZXggPSB3YWxrX3N0YXRlLT5yZXN1bHRfY291bnQgJSBBQ1BJX1JFU1VMVFNfRlJBTUVfT0JKX05VTTsKLQlzdGF0ZS0+cmVzdWx0cy5vYmpfZGVzY1tpbmRleF0gPSBvYmplY3Q7Ci0Jd2Fsa19zdGF0ZS0+cmVzdWx0X2NvdW50Kys7Ci0KLQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VYRUMsICJPYmo9JXAgWyVzXSBTdGF0ZT0lcCBOdW09JVggQ3VyPSVYXG4iLAotCQkJICBvYmplY3QsCi0JCQkgIGFjcGlfdXRfZ2V0X29iamVjdF90eXBlX25hbWUoKHVuaW9uCi0JCQkJCQkJYWNwaV9vcGVyYW5kX29iamVjdCAqKQotCQkJCQkJICAgICAgIG9iamVjdCksIHdhbGtfc3RhdGUsCi0JCQkgIHdhbGtfc3RhdGUtPnJlc3VsdF9jb3VudCwKLQkJCSAgd2Fsa19zdGF0ZS0+Y3VycmVudF9yZXN1bHQpKTsKLQotCXJldHVybiAoQUVfT0spOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX2RzX3Jlc3VsdF9zdGFja19wdXNoCi0gKgotICogUEFSQU1FVEVSUzogIHdhbGtfc3RhdGUgICAgICAgICAgLSBDdXJyZW50IFdhbGsgc3RhdGUKLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IFB1c2ggYW4gb2JqZWN0IG9udG8gdGhlIHdhbGtfc3RhdGUgcmVzdWx0IHN0YWNrCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIGFjcGlfc3RhdHVzIGFjcGlfZHNfcmVzdWx0X3N0YWNrX3B1c2goc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSkKLXsKLQl1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgKnN0YXRlOwotCi0JQUNQSV9GVU5DVElPTl9OQU1FKGRzX3Jlc3VsdF9zdGFja19wdXNoKTsKLQotCS8qIENoZWNrIGZvciBzdGFjayBvdmVyZmxvdyAqLwotCi0JaWYgKCgodTMyKSB3YWxrX3N0YXRlLT5yZXN1bHRfc2l6ZSArIEFDUElfUkVTVUxUU19GUkFNRV9PQkpfTlVNKSA+Ci0JICAgIEFDUElfUkVTVUxUU19PQkpfTlVNX01BWCkgewotCQlBQ1BJX0VSUk9SKChBRV9JTkZPLCAiUmVzdWx0IHN0YWNrIG92ZXJmbG93OiBTdGF0ZT0lcCBOdW09JVgiLAotCQkJICAgIHdhbGtfc3RhdGUsIHdhbGtfc3RhdGUtPnJlc3VsdF9zaXplKSk7Ci0JCXJldHVybiAoQUVfU1RBQ0tfT1ZFUkZMT1cpOwotCX0KLQotCXN0YXRlID0gYWNwaV91dF9jcmVhdGVfZ2VuZXJpY19zdGF0ZSgpOwotCWlmICghc3RhdGUpIHsKLQkJcmV0dXJuIChBRV9OT19NRU1PUlkpOwotCX0KLQotCXN0YXRlLT5jb21tb24uZGVzY3JpcHRvcl90eXBlID0gQUNQSV9ERVNDX1RZUEVfU1RBVEVfUkVTVUxUOwotCWFjcGlfdXRfcHVzaF9nZW5lcmljX3N0YXRlKCZ3YWxrX3N0YXRlLT5yZXN1bHRzLCBzdGF0ZSk7Ci0KLQkvKiBJbmNyZWFzZSB0aGUgbGVuZ3RoIG9mIHRoZSByZXN1bHQgc3RhY2sgYnkgdGhlIGxlbmd0aCBvZiBmcmFtZSAqLwotCi0Jd2Fsa19zdGF0ZS0+cmVzdWx0X3NpemUgKz0gQUNQSV9SRVNVTFRTX0ZSQU1FX09CSl9OVU07Ci0KLQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VYRUMsICJSZXN1bHRzPSVwIFN0YXRlPSVwXG4iLAotCQkJICBzdGF0ZSwgd2Fsa19zdGF0ZSkpOwotCi0JcmV0dXJuIChBRV9PSyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfZHNfcmVzdWx0X3N0YWNrX3BvcAotICoKLSAqIFBBUkFNRVRFUlM6ICB3YWxrX3N0YXRlICAgICAgICAgIC0gQ3VycmVudCBXYWxrIHN0YXRlCi0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cwotICoKLSAqIERFU0NSSVBUSU9OOiBQb3AgYW4gb2JqZWN0IG9mZiBvZiB0aGUgd2Fsa19zdGF0ZSByZXN1bHQgc3RhY2sKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgYWNwaV9zdGF0dXMgYWNwaV9kc19yZXN1bHRfc3RhY2tfcG9wKHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUpCi17Ci0JdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICpzdGF0ZTsKLQotCUFDUElfRlVOQ1RJT05fTkFNRShkc19yZXN1bHRfc3RhY2tfcG9wKTsKLQotCS8qIENoZWNrIGZvciBzdGFjayB1bmRlcmZsb3cgKi8KLQotCWlmICh3YWxrX3N0YXRlLT5yZXN1bHRzID09IE5VTEwpIHsKLQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FWEVDLAotCQkJCSAgIlJlc3VsdCBzdGFjayB1bmRlcmZsb3cgLSBTdGF0ZT0lcFxuIiwKLQkJCQkgIHdhbGtfc3RhdGUpKTsKLQkJcmV0dXJuIChBRV9BTUxfTk9fT1BFUkFORCk7Ci0JfQotCi0JaWYgKHdhbGtfc3RhdGUtPnJlc3VsdF9zaXplIDwgQUNQSV9SRVNVTFRTX0ZSQU1FX09CSl9OVU0pIHsKLQkJQUNQSV9FUlJPUigoQUVfSU5GTywgIkluc3VmZmljaWVudCByZXN1bHQgc3RhY2sgc2l6ZSIpKTsKLQkJcmV0dXJuIChBRV9BTUxfSU5URVJOQUwpOwotCX0KLQotCXN0YXRlID0gYWNwaV91dF9wb3BfZ2VuZXJpY19zdGF0ZSgmd2Fsa19zdGF0ZS0+cmVzdWx0cyk7Ci0JYWNwaV91dF9kZWxldGVfZ2VuZXJpY19zdGF0ZShzdGF0ZSk7Ci0KLQkvKiBEZWNyZWFzZSB0aGUgbGVuZ3RoIG9mIHJlc3VsdCBzdGFjayBieSB0aGUgbGVuZ3RoIG9mIGZyYW1lICovCi0KLQl3YWxrX3N0YXRlLT5yZXN1bHRfc2l6ZSAtPSBBQ1BJX1JFU1VMVFNfRlJBTUVfT0JKX05VTTsKLQotCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVhFQywKLQkJCSAgIlJlc3VsdD0lcCBSZW1haW5pbmdSZXN1bHRzPSVYIFN0YXRlPSVwXG4iLAotCQkJICBzdGF0ZSwgd2Fsa19zdGF0ZS0+cmVzdWx0X2NvdW50LCB3YWxrX3N0YXRlKSk7Ci0KLQlyZXR1cm4gKEFFX09LKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9kc19vYmpfc3RhY2tfcHVzaAotICoKLSAqIFBBUkFNRVRFUlM6ICBPYmplY3QgICAgICAgICAgICAgIC0gT2JqZWN0IHRvIHB1c2gKLSAqICAgICAgICAgICAgICB3YWxrX3N0YXRlICAgICAgICAgIC0gQ3VycmVudCBXYWxrIHN0YXRlCi0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cwotICoKLSAqIERFU0NSSVBUSU9OOiBQdXNoIGFuIG9iamVjdCBvbnRvIHRoaXMgd2FsaydzIG9iamVjdC9vcGVyYW5kIHN0YWNrCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotYWNwaV9zdGF0dXMKLWFjcGlfZHNfb2JqX3N0YWNrX3B1c2godm9pZCAqb2JqZWN0LCBzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICogd2Fsa19zdGF0ZSkKLXsKLQlBQ1BJX0ZVTkNUSU9OX05BTUUoZHNfb2JqX3N0YWNrX3B1c2gpOwotCi0JLyogQ2hlY2sgZm9yIHN0YWNrIG92ZXJmbG93ICovCi0KLQlpZiAod2Fsa19zdGF0ZS0+bnVtX29wZXJhbmRzID49IEFDUElfT0JKX05VTV9PUEVSQU5EUykgewotCQlBQ1BJX0VSUk9SKChBRV9JTkZPLAotCQkJICAgICJPYmplY3Qgc3RhY2sgb3ZlcmZsb3chIE9iaj0lcCBTdGF0ZT0lcCAjT3BzPSVYIiwKLQkJCSAgICBvYmplY3QsIHdhbGtfc3RhdGUsIHdhbGtfc3RhdGUtPm51bV9vcGVyYW5kcykpOwotCQlyZXR1cm4gKEFFX1NUQUNLX09WRVJGTE9XKTsKLQl9Ci0KLQkvKiBQdXQgdGhlIG9iamVjdCBvbnRvIHRoZSBzdGFjayAqLwotCi0Jd2Fsa19zdGF0ZS0+b3BlcmFuZHNbd2Fsa19zdGF0ZS0+b3BlcmFuZF9pbmRleF0gPSBvYmplY3Q7Ci0Jd2Fsa19zdGF0ZS0+bnVtX29wZXJhbmRzKys7Ci0KLQkvKiBGb3IgdGhlIHVzdWFsIG9yZGVyIG9mIGZpbGxpbmcgdGhlIG9wZXJhbmQgc3RhY2sgKi8KLQotCXdhbGtfc3RhdGUtPm9wZXJhbmRfaW5kZXgrKzsKLQotCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVhFQywgIk9iaj0lcCBbJXNdIFN0YXRlPSVwICNPcHM9JVhcbiIsCi0JCQkgIG9iamVjdCwKLQkJCSAgYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZSgodW5pb24KLQkJCQkJCQlhY3BpX29wZXJhbmRfb2JqZWN0ICopCi0JCQkJCQkgICAgICAgb2JqZWN0KSwgd2Fsa19zdGF0ZSwKLQkJCSAgd2Fsa19zdGF0ZS0+bnVtX29wZXJhbmRzKSk7Ci0KLQlyZXR1cm4gKEFFX09LKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9kc19vYmpfc3RhY2tfcG9wCi0gKgotICogUEFSQU1FVEVSUzogIHBvcF9jb3VudCAgICAgICAgICAgLSBOdW1iZXIgb2Ygb2JqZWN0cy9lbnRyaWVzIHRvIHBvcAotICogICAgICAgICAgICAgIHdhbGtfc3RhdGUgICAgICAgICAgLSBDdXJyZW50IFdhbGsgc3RhdGUKLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IFBvcCB0aGlzIHdhbGsncyBvYmplY3Qgc3RhY2suICBPYmplY3RzIG9uIHRoZSBzdGFjayBhcmUgTk9UCi0gKiAgICAgICAgICAgICAgZGVsZXRlZCBieSB0aGlzIHJvdXRpbmUuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotYWNwaV9zdGF0dXMKLWFjcGlfZHNfb2JqX3N0YWNrX3BvcCh1MzIgcG9wX2NvdW50LCBzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICogd2Fsa19zdGF0ZSkKLXsKLQl1MzIgaTsKLQotCUFDUElfRlVOQ1RJT05fTkFNRShkc19vYmpfc3RhY2tfcG9wKTsKLQotCWZvciAoaSA9IDA7IGkgPCBwb3BfY291bnQ7IGkrKykgewotCi0JCS8qIENoZWNrIGZvciBzdGFjayB1bmRlcmZsb3cgKi8KLQotCQlpZiAod2Fsa19zdGF0ZS0+bnVtX29wZXJhbmRzID09IDApIHsKLQkJCUFDUElfRVJST1IoKEFFX0lORk8sCi0JCQkJICAgICJPYmplY3Qgc3RhY2sgdW5kZXJmbG93ISBDb3VudD0lWCBTdGF0ZT0lcCAjT3BzPSVYIiwKLQkJCQkgICAgcG9wX2NvdW50LCB3YWxrX3N0YXRlLAotCQkJCSAgICB3YWxrX3N0YXRlLT5udW1fb3BlcmFuZHMpKTsKLQkJCXJldHVybiAoQUVfU1RBQ0tfVU5ERVJGTE9XKTsKLQkJfQotCi0JCS8qIEp1c3Qgc2V0IHRoZSBzdGFjayBlbnRyeSB0byBudWxsICovCi0KLQkJd2Fsa19zdGF0ZS0+bnVtX29wZXJhbmRzLS07Ci0JCXdhbGtfc3RhdGUtPm9wZXJhbmRzW3dhbGtfc3RhdGUtPm51bV9vcGVyYW5kc10gPSBOVUxMOwotCX0KLQotCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVhFQywgIkNvdW50PSVYIFN0YXRlPSVwICNPcHM9JVhcbiIsCi0JCQkgIHBvcF9jb3VudCwgd2Fsa19zdGF0ZSwgd2Fsa19zdGF0ZS0+bnVtX29wZXJhbmRzKSk7Ci0KLQlyZXR1cm4gKEFFX09LKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9kc19vYmpfc3RhY2tfcG9wX2FuZF9kZWxldGUKLSAqCi0gKiBQQVJBTUVURVJTOiAgcG9wX2NvdW50ICAgICAgICAgICAtIE51bWJlciBvZiBvYmplY3RzL2VudHJpZXMgdG8gcG9wCi0gKiAgICAgICAgICAgICAgd2Fsa19zdGF0ZSAgICAgICAgICAtIEN1cnJlbnQgV2FsayBzdGF0ZQotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKLSAqCi0gKiBERVNDUklQVElPTjogUG9wIHRoaXMgd2FsaydzIG9iamVjdCBzdGFjayBhbmQgZGVsZXRlIGVhY2ggb2JqZWN0IHRoYXQgaXMKLSAqICAgICAgICAgICAgICBwb3BwZWQgb2ZmLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXZvaWQKLWFjcGlfZHNfb2JqX3N0YWNrX3BvcF9hbmRfZGVsZXRlKHUzMiBwb3BfY291bnQsCi0JCQkJIHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUpCi17Ci0JczMyIGk7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2M7Ci0KLQlBQ1BJX0ZVTkNUSU9OX05BTUUoZHNfb2JqX3N0YWNrX3BvcF9hbmRfZGVsZXRlKTsKLQotCWlmIChwb3BfY291bnQgPT0gMCkgewotCQlyZXR1cm47Ci0JfQotCi0JZm9yIChpID0gKHMzMikgcG9wX2NvdW50IC0gMTsgaSA+PSAwOyBpLS0pIHsKLQkJaWYgKHdhbGtfc3RhdGUtPm51bV9vcGVyYW5kcyA9PSAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvKiBQb3AgdGhlIHN0YWNrIGFuZCBkZWxldGUgYW4gb2JqZWN0IGlmIHByZXNlbnQgaW4gdGhpcyBzdGFjayBlbnRyeSAqLwotCi0JCXdhbGtfc3RhdGUtPm51bV9vcGVyYW5kcy0tOwotCQlvYmpfZGVzYyA9IHdhbGtfc3RhdGUtPm9wZXJhbmRzW2ldOwotCQlpZiAob2JqX2Rlc2MpIHsKLQkJCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZSh3YWxrX3N0YXRlLT5vcGVyYW5kc1tpXSk7Ci0JCQl3YWxrX3N0YXRlLT5vcGVyYW5kc1tpXSA9IE5VTEw7Ci0JCX0KLQl9Ci0KLQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VYRUMsICJDb3VudD0lWCBTdGF0ZT0lcCAjT3BzPSVYXG4iLAotCQkJICBwb3BfY291bnQsIHdhbGtfc3RhdGUsIHdhbGtfc3RhdGUtPm51bV9vcGVyYW5kcykpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX2RzX2dldF9jdXJyZW50X3dhbGtfc3RhdGUKLSAqCi0gKiBQQVJBTUVURVJTOiAgVGhyZWFkICAgICAgICAgIC0gR2V0IGN1cnJlbnQgYWN0aXZlIHN0YXRlIGZvciB0aGlzIFRocmVhZAotICoKLSAqIFJFVFVSTjogICAgICBQb2ludGVyIHRvIHRoZSBjdXJyZW50IHdhbGsgc3RhdGUKLSAqCi0gKiBERVNDUklQVElPTjogR2V0IHRoZSB3YWxrIHN0YXRlIHRoYXQgaXMgYXQgdGhlIGhlYWQgb2YgdGhlIGxpc3QgKHRoZSAiY3VycmVudCIKLSAqICAgICAgICAgICAgICB3YWxrIHN0YXRlLikKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICphY3BpX2RzX2dldF9jdXJyZW50X3dhbGtfc3RhdGUoc3RydWN0IGFjcGlfdGhyZWFkX3N0YXRlCi0JCQkJCQkgICAgICAgKnRocmVhZCkKLXsKLQlBQ1BJX0ZVTkNUSU9OX05BTUUoZHNfZ2V0X2N1cnJlbnRfd2Fsa19zdGF0ZSk7Ci0KLQlpZiAoIXRocmVhZCkgewotCQlyZXR1cm4gKE5VTEwpOwotCX0KLQotCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfUEFSU0UsICJDdXJyZW50IFdhbGtTdGF0ZSAlcFxuIiwKLQkJCSAgdGhyZWFkLT53YWxrX3N0YXRlX2xpc3QpKTsKLQotCXJldHVybiAodGhyZWFkLT53YWxrX3N0YXRlX2xpc3QpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX2RzX3B1c2hfd2Fsa19zdGF0ZQotICoKLSAqIFBBUkFNRVRFUlM6ICB3YWxrX3N0YXRlICAgICAgLSBTdGF0ZSB0byBwdXNoCi0gKiAgICAgICAgICAgICAgVGhyZWFkICAgICAgICAgIC0gVGhyZWFkIHN0YXRlIG9iamVjdAotICoKLSAqIFJFVFVSTjogICAgICBOb25lCi0gKgotICogREVTQ1JJUFRJT046IFBsYWNlIHRoZSBUaHJlYWQgc3RhdGUgYXQgdGhlIGhlYWQgb2YgdGhlIHN0YXRlIGxpc3QKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi12b2lkCi1hY3BpX2RzX3B1c2hfd2Fsa19zdGF0ZShzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlLAotCQkJc3RydWN0IGFjcGlfdGhyZWFkX3N0YXRlICp0aHJlYWQpCi17Ci0JQUNQSV9GVU5DVElPTl9UUkFDRShkc19wdXNoX3dhbGtfc3RhdGUpOwotCi0Jd2Fsa19zdGF0ZS0+bmV4dCA9IHRocmVhZC0+d2Fsa19zdGF0ZV9saXN0OwotCXRocmVhZC0+d2Fsa19zdGF0ZV9saXN0ID0gd2Fsa19zdGF0ZTsKLQotCXJldHVybl9WT0lEOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX2RzX3BvcF93YWxrX3N0YXRlCi0gKgotICogUEFSQU1FVEVSUzogIFRocmVhZCAgICAgIC0gQ3VycmVudCB0aHJlYWQgc3RhdGUKLSAqCi0gKiBSRVRVUk46ICAgICAgQSB3YWxrX3N0YXRlIG9iamVjdCBwb3BwZWQgZnJvbSB0aGUgdGhyZWFkJ3Mgc3RhY2sKLSAqCi0gKiBERVNDUklQVElPTjogUmVtb3ZlIGFuZCByZXR1cm4gdGhlIHdhbGtzdGF0ZSBvYmplY3QgdGhhdCBpcyBhdCB0aGUgaGVhZCBvZgotICogICAgICAgICAgICAgIHRoZSB3YWxrIHN0YWNrIGZvciB0aGUgZ2l2ZW4gd2FsayBsaXN0LiAgTlVMTCBpbmRpY2F0ZXMgdGhhdAotICogICAgICAgICAgICAgIHRoZSBsaXN0IGlzIGVtcHR5LgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKmFjcGlfZHNfcG9wX3dhbGtfc3RhdGUoc3RydWN0IGFjcGlfdGhyZWFkX3N0YXRlICp0aHJlYWQpCi17Ci0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZTsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UoZHNfcG9wX3dhbGtfc3RhdGUpOwotCi0Jd2Fsa19zdGF0ZSA9IHRocmVhZC0+d2Fsa19zdGF0ZV9saXN0OwotCi0JaWYgKHdhbGtfc3RhdGUpIHsKLQotCQkvKiBOZXh0IHdhbGsgc3RhdGUgYmVjb21lcyB0aGUgY3VycmVudCB3YWxrIHN0YXRlICovCi0KLQkJdGhyZWFkLT53YWxrX3N0YXRlX2xpc3QgPSB3YWxrX3N0YXRlLT5uZXh0OwotCi0JCS8qCi0JCSAqIERvbid0IGNsZWFyIHRoZSBORVhUIGZpZWxkLCB0aGlzIHNlcnZlcyBhcyBhbiBpbmRpY2F0b3IKLQkJICogdGhhdCB0aGVyZSBpcyBhIHBhcmVudCBXQUxLIFNUQVRFCi0JCSAqIERvIE5vdDogd2Fsa19zdGF0ZS0+TmV4dCA9IE5VTEw7Ci0JCSAqLwotCX0KLQotCXJldHVybl9QVFIod2Fsa19zdGF0ZSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfZHNfY3JlYXRlX3dhbGtfc3RhdGUKLSAqCi0gKiBQQVJBTUVURVJTOiAgb3duZXJfaWQgICAgICAgIC0gSUQgZm9yIG9iamVjdCBjcmVhdGlvbgotICogICAgICAgICAgICAgIE9yaWdpbiAgICAgICAgICAtIFN0YXJ0aW5nIHBvaW50IGZvciB0aGlzIHdhbGsKLSAqICAgICAgICAgICAgICBtZXRob2RfZGVzYyAgICAgLSBNZXRob2Qgb2JqZWN0Ci0gKiAgICAgICAgICAgICAgVGhyZWFkICAgICAgICAgIC0gQ3VycmVudCB0aHJlYWQgc3RhdGUKLSAqCi0gKiBSRVRVUk46ICAgICAgUG9pbnRlciB0byB0aGUgbmV3IHdhbGsgc3RhdGUuCi0gKgotICogREVTQ1JJUFRJT046IEFsbG9jYXRlIGFuZCBpbml0aWFsaXplIGEgbmV3IHdhbGsgc3RhdGUuICBUaGUgY3VycmVudCB3YWxrCi0gKiAgICAgICAgICAgICAgc3RhdGUgaXMgc2V0IHRvIHRoaXMgbmV3IHN0YXRlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKmFjcGlfZHNfY3JlYXRlX3dhbGtfc3RhdGUoYWNwaV9vd25lcl9pZCBvd25lcl9pZCwgdW5pb24gYWNwaV9wYXJzZV9vYmplY3QKLQkJCQkJCSAgKm9yaWdpbiwgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdAotCQkJCQkJICAqbWV0aG9kX2Rlc2MsIHN0cnVjdCBhY3BpX3RocmVhZF9zdGF0ZQotCQkJCQkJICAqdGhyZWFkKQotewotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGU7Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGRzX2NyZWF0ZV93YWxrX3N0YXRlKTsKLQotCXdhbGtfc3RhdGUgPSBBQ1BJX0FMTE9DQVRFX1pFUk9FRChzaXplb2Yoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSkpOwotCWlmICghd2Fsa19zdGF0ZSkgewotCQlyZXR1cm5fUFRSKE5VTEwpOwotCX0KLQotCXdhbGtfc3RhdGUtPmRlc2NyaXB0b3JfdHlwZSA9IEFDUElfREVTQ19UWVBFX1dBTEs7Ci0Jd2Fsa19zdGF0ZS0+bWV0aG9kX2Rlc2MgPSBtZXRob2RfZGVzYzsKLQl3YWxrX3N0YXRlLT5vd25lcl9pZCA9IG93bmVyX2lkOwotCXdhbGtfc3RhdGUtPm9yaWdpbiA9IG9yaWdpbjsKLQl3YWxrX3N0YXRlLT50aHJlYWQgPSB0aHJlYWQ7Ci0KLQl3YWxrX3N0YXRlLT5wYXJzZXJfc3RhdGUuc3RhcnRfb3AgPSBvcmlnaW47Ci0KLQkvKiBJbml0IHRoZSBtZXRob2QgYXJncy9sb2NhbCAqLwotCi0jaWYgKCFkZWZpbmVkIChBQ1BJX05PX01FVEhPRF9FWEVDVVRJT04pICYmICFkZWZpbmVkIChBQ1BJX0NPTlNUQU5UX0VWQUxfT05MWSkpCi0JYWNwaV9kc19tZXRob2RfZGF0YV9pbml0KHdhbGtfc3RhdGUpOwotI2VuZGlmCi0KLQkvKiBQdXQgdGhlIG5ldyBzdGF0ZSBhdCB0aGUgaGVhZCBvZiB0aGUgd2FsayBsaXN0ICovCi0KLQlpZiAodGhyZWFkKSB7Ci0JCWFjcGlfZHNfcHVzaF93YWxrX3N0YXRlKHdhbGtfc3RhdGUsIHRocmVhZCk7Ci0JfQotCi0JcmV0dXJuX1BUUih3YWxrX3N0YXRlKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9kc19pbml0X2FtbF93YWxrCi0gKgotICogUEFSQU1FVEVSUzogIHdhbGtfc3RhdGUgICAgICAtIE5ldyBzdGF0ZSB0byBiZSBpbml0aWFsaXplZAotICogICAgICAgICAgICAgIE9wICAgICAgICAgICAgICAtIEN1cnJlbnQgcGFyc2Ugb3AKLSAqICAgICAgICAgICAgICBtZXRob2Rfbm9kZSAgICAgLSBDb250cm9sIG1ldGhvZCBOUyBub2RlLCBpZiBhbnkKLSAqICAgICAgICAgICAgICBhbWxfc3RhcnQgICAgICAgLSBTdGFydCBvZiBBTUwKLSAqICAgICAgICAgICAgICBhbWxfbGVuZ3RoICAgICAgLSBMZW5ndGggb2YgQU1MCi0gKiAgICAgICAgICAgICAgSW5mbyAgICAgICAgICAgIC0gTWV0aG9kIGluZm8gYmxvY2sgKHBhcmFtcywgZXRjLikKLSAqICAgICAgICAgICAgICBwYXNzX251bWJlciAgICAgLSAxLCAyLCBvciAzCi0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cwotICoKLSAqIERFU0NSSVBUSU9OOiBJbml0aWFsaXplIGEgd2FsayBzdGF0ZSBmb3IgYSBwYXNzIDEgb3IgMiBwYXJzZSB0cmVlIHdhbGsKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1hY3BpX3N0YXR1cwotYWNwaV9kc19pbml0X2FtbF93YWxrKHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUsCi0JCSAgICAgIHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpvcCwKLQkJICAgICAgc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm1ldGhvZF9ub2RlLAotCQkgICAgICB1OCAqIGFtbF9zdGFydCwKLQkJICAgICAgdTMyIGFtbF9sZW5ndGgsCi0JCSAgICAgIHN0cnVjdCBhY3BpX2V2YWx1YXRlX2luZm8gKmluZm8sIHU4IHBhc3NfbnVtYmVyKQotewotCWFjcGlfc3RhdHVzIHN0YXR1czsKLQlzdHJ1Y3QgYWNwaV9wYXJzZV9zdGF0ZSAqcGFyc2VyX3N0YXRlID0gJndhbGtfc3RhdGUtPnBhcnNlcl9zdGF0ZTsKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqZXh0cmFfb3A7Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGRzX2luaXRfYW1sX3dhbGspOwotCi0Jd2Fsa19zdGF0ZS0+cGFyc2VyX3N0YXRlLmFtbCA9Ci0JICAgIHdhbGtfc3RhdGUtPnBhcnNlcl9zdGF0ZS5hbWxfc3RhcnQgPSBhbWxfc3RhcnQ7Ci0Jd2Fsa19zdGF0ZS0+cGFyc2VyX3N0YXRlLmFtbF9lbmQgPQotCSAgICB3YWxrX3N0YXRlLT5wYXJzZXJfc3RhdGUucGtnX2VuZCA9IGFtbF9zdGFydCArIGFtbF9sZW5ndGg7Ci0KLQkvKiBUaGUgbmV4dF9vcCBvZiB0aGUgbmV4dF93YWxrIHdpbGwgYmUgdGhlIGJlZ2lubmluZyBvZiB0aGUgbWV0aG9kICovCi0KLQl3YWxrX3N0YXRlLT5uZXh0X29wID0gTlVMTDsKLQl3YWxrX3N0YXRlLT5wYXNzX251bWJlciA9IHBhc3NfbnVtYmVyOwotCi0JaWYgKGluZm8pIHsKLQkJd2Fsa19zdGF0ZS0+cGFyYW1zID0gaW5mby0+cGFyYW1ldGVyczsKLQkJd2Fsa19zdGF0ZS0+Y2FsbGVyX3JldHVybl9kZXNjID0gJmluZm8tPnJldHVybl9vYmplY3Q7Ci0JfQotCi0Jc3RhdHVzID0gYWNwaV9wc19pbml0X3Njb3BlKCZ3YWxrX3N0YXRlLT5wYXJzZXJfc3RhdGUsIG9wKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci0JfQotCi0JaWYgKG1ldGhvZF9ub2RlKSB7Ci0JCXdhbGtfc3RhdGUtPnBhcnNlcl9zdGF0ZS5zdGFydF9ub2RlID0gbWV0aG9kX25vZGU7Ci0JCXdhbGtfc3RhdGUtPndhbGtfdHlwZSA9IEFDUElfV0FMS19NRVRIT0Q7Ci0JCXdhbGtfc3RhdGUtPm1ldGhvZF9ub2RlID0gbWV0aG9kX25vZGU7Ci0JCXdhbGtfc3RhdGUtPm1ldGhvZF9kZXNjID0KLQkJICAgIGFjcGlfbnNfZ2V0X2F0dGFjaGVkX29iamVjdChtZXRob2Rfbm9kZSk7Ci0KLQkJLyogUHVzaCBzdGFydCBzY29wZSBvbiBzY29wZSBzdGFjayBhbmQgbWFrZSBpdCBjdXJyZW50ICAqLwotCi0JCXN0YXR1cyA9Ci0JCSAgICBhY3BpX2RzX3Njb3BlX3N0YWNrX3B1c2gobWV0aG9kX25vZGUsIEFDUElfVFlQRV9NRVRIT0QsCi0JCQkJCSAgICAgd2Fsa19zdGF0ZSk7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci0JCX0KLQotCQkvKiBJbml0IHRoZSBtZXRob2QgYXJndW1lbnRzICovCi0KLQkJc3RhdHVzID0gYWNwaV9kc19tZXRob2RfZGF0YV9pbml0X2FyZ3Mod2Fsa19zdGF0ZS0+cGFyYW1zLAotCQkJCQkJICAgICAgIEFDUElfTUVUSE9EX05VTV9BUkdTLAotCQkJCQkJICAgICAgIHdhbGtfc3RhdGUpOwotCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotCQl9Ci0JfSBlbHNlIHsKLQkJLyoKLQkJICogU2V0dXAgdGhlIGN1cnJlbnQgc2NvcGUuCi0JCSAqIEZpbmQgYSBOYW1lZCBPcCB0aGF0IGhhcyBhIG5hbWVzcGFjZSBub2RlIGFzc29jaWF0ZWQgd2l0aCBpdC4KLQkJICogc2VhcmNoIHVwd2FyZHMgZnJvbSB0aGlzIE9wLiAgQ3VycmVudCBzY29wZSBpcyB0aGUgZmlyc3QKLQkJICogT3Agd2l0aCBhIG5hbWVzcGFjZSBub2RlLgotCQkgKi8KLQkJZXh0cmFfb3AgPSBwYXJzZXJfc3RhdGUtPnN0YXJ0X29wOwotCQl3aGlsZSAoZXh0cmFfb3AgJiYgIWV4dHJhX29wLT5jb21tb24ubm9kZSkgewotCQkJZXh0cmFfb3AgPSBleHRyYV9vcC0+Y29tbW9uLnBhcmVudDsKLQkJfQotCi0JCWlmICghZXh0cmFfb3ApIHsKLQkJCXBhcnNlcl9zdGF0ZS0+c3RhcnRfbm9kZSA9IE5VTEw7Ci0JCX0gZWxzZSB7Ci0JCQlwYXJzZXJfc3RhdGUtPnN0YXJ0X25vZGUgPSBleHRyYV9vcC0+Y29tbW9uLm5vZGU7Ci0JCX0KLQotCQlpZiAocGFyc2VyX3N0YXRlLT5zdGFydF9ub2RlKSB7Ci0KLQkJCS8qIFB1c2ggc3RhcnQgc2NvcGUgb24gc2NvcGUgc3RhY2sgYW5kIG1ha2UgaXQgY3VycmVudCAgKi8KLQotCQkJc3RhdHVzID0KLQkJCSAgICBhY3BpX2RzX3Njb3BlX3N0YWNrX3B1c2gocGFyc2VyX3N0YXRlLT5zdGFydF9ub2RlLAotCQkJCQkJICAgICBwYXJzZXJfc3RhdGUtPnN0YXJ0X25vZGUtPgotCQkJCQkJICAgICB0eXBlLCB3YWxrX3N0YXRlKTsKLQkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotCQkJfQotCQl9Ci0JfQotCi0Jc3RhdHVzID0gYWNwaV9kc19pbml0X2NhbGxiYWNrcyh3YWxrX3N0YXRlLCBwYXNzX251bWJlcik7Ci0JcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfZHNfZGVsZXRlX3dhbGtfc3RhdGUKLSAqCi0gKiBQQVJBTUVURVJTOiAgd2Fsa19zdGF0ZSAgICAgIC0gU3RhdGUgdG8gZGVsZXRlCi0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cwotICoKLSAqIERFU0NSSVBUSU9OOiBEZWxldGUgYSB3YWxrIHN0YXRlIGluY2x1ZGluZyBhbGwgaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmVzCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdm9pZCBhY3BpX2RzX2RlbGV0ZV93YWxrX3N0YXRlKHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUpCi17Ci0JdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICpzdGF0ZTsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKGRzX2RlbGV0ZV93YWxrX3N0YXRlLCB3YWxrX3N0YXRlKTsKLQotCWlmICghd2Fsa19zdGF0ZSkgewotCQlyZXR1cm47Ci0JfQotCi0JaWYgKHdhbGtfc3RhdGUtPmRlc2NyaXB0b3JfdHlwZSAhPSBBQ1BJX0RFU0NfVFlQRV9XQUxLKSB7Ci0JCUFDUElfRVJST1IoKEFFX0lORk8sICIlcCBpcyBub3QgYSB2YWxpZCB3YWxrIHN0YXRlIiwKLQkJCSAgICB3YWxrX3N0YXRlKSk7Ci0JCXJldHVybjsKLQl9Ci0KLQkvKiBUaGVyZSBzaG91bGQgbm90IGJlIGFueSBvcGVuIHNjb3BlcyAqLwotCi0JaWYgKHdhbGtfc3RhdGUtPnBhcnNlcl9zdGF0ZS5zY29wZSkgewotCQlBQ1BJX0VSUk9SKChBRV9JTkZPLCAiJXAgd2FsayBzdGlsbCBoYXMgYSBzY29wZSBsaXN0IiwKLQkJCSAgICB3YWxrX3N0YXRlKSk7Ci0JCWFjcGlfcHNfY2xlYW51cF9zY29wZSgmd2Fsa19zdGF0ZS0+cGFyc2VyX3N0YXRlKTsKLQl9Ci0KLQkvKiBBbHdheXMgbXVzdCBmcmVlIGFueSBsaW5rZWQgY29udHJvbCBzdGF0ZXMgKi8KLQotCXdoaWxlICh3YWxrX3N0YXRlLT5jb250cm9sX3N0YXRlKSB7Ci0JCXN0YXRlID0gd2Fsa19zdGF0ZS0+Y29udHJvbF9zdGF0ZTsKLQkJd2Fsa19zdGF0ZS0+Y29udHJvbF9zdGF0ZSA9IHN0YXRlLT5jb21tb24ubmV4dDsKLQotCQlhY3BpX3V0X2RlbGV0ZV9nZW5lcmljX3N0YXRlKHN0YXRlKTsKLQl9Ci0KLQkvKiBBbHdheXMgbXVzdCBmcmVlIGFueSBsaW5rZWQgcGFyc2Ugc3RhdGVzICovCi0KLQl3aGlsZSAod2Fsa19zdGF0ZS0+c2NvcGVfaW5mbykgewotCQlzdGF0ZSA9IHdhbGtfc3RhdGUtPnNjb3BlX2luZm87Ci0JCXdhbGtfc3RhdGUtPnNjb3BlX2luZm8gPSBzdGF0ZS0+Y29tbW9uLm5leHQ7Ci0KLQkJYWNwaV91dF9kZWxldGVfZ2VuZXJpY19zdGF0ZShzdGF0ZSk7Ci0JfQotCi0JLyogQWx3YXlzIG11c3QgZnJlZSBhbnkgc3RhY2tlZCByZXN1bHQgc3RhdGVzICovCi0KLQl3aGlsZSAod2Fsa19zdGF0ZS0+cmVzdWx0cykgewotCQlzdGF0ZSA9IHdhbGtfc3RhdGUtPnJlc3VsdHM7Ci0JCXdhbGtfc3RhdGUtPnJlc3VsdHMgPSBzdGF0ZS0+Y29tbW9uLm5leHQ7Ci0KLQkJYWNwaV91dF9kZWxldGVfZ2VuZXJpY19zdGF0ZShzdGF0ZSk7Ci0JfQotCi0JQUNQSV9GUkVFKHdhbGtfc3RhdGUpOwotCXJldHVybl9WT0lEOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2VjLmMgYi9kcml2ZXJzL2FjcGkvZWMuYwppbmRleCAzMGYzZWYyLi5hMmI4MmM5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvZWMuYworKysgYi9kcml2ZXJzL2FjcGkvZWMuYwpAQCAtNDIsNyArNDIsNiBAQAogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFjcGkvYWNwaV9idXMuaD4KICNpbmNsdWRlIDxhY3BpL2FjcGlfZHJpdmVycy5oPgotI2luY2x1ZGUgPGFjcGkvYWN0eXBlcy5oPgogCiAjZGVmaW5lIEFDUElfRUNfQ0xBU1MJCQkiZW1iZWRkZWRfY29udHJvbGxlciIKICNkZWZpbmUgQUNQSV9FQ19ERVZJQ0VfTkFNRQkJIkVtYmVkZGVkIENvbnRyb2xsZXIiCkBAIC0xMjEsMzEgKzEyMCw2IEBACiAJc3BpbmxvY2tfdCBjdXJyX2xvY2s7CiB9ICpib290X2VjLCAqZmlyc3RfZWM7CiAKLS8qIAotICogU29tZSBBc3VzIHN5c3RlbSBoYXZlIGV4Y2hhbmdlZCBFQ0RUIGRhdGEvY29tbWFuZCBJTyBhZGRyZXNzZXMuCi0gKi8KLXN0YXRpYyBpbnQgcHJpbnRfZWNkdF9lcnJvcihjb25zdCBzdHJ1Y3QgZG1pX3N5c3RlbV9pZCAqaWQpCi17Ci0JcHJpbnRrKEtFUk5fTk9USUNFIFBSRUZJWCAiJXMgZGV0ZWN0ZWQgLSAiCi0JCSJFQ0RUIGhhcyBleGNoYW5nZWQgY29udHJvbC9kYXRhIEkvTyBhZGRyZXNzXG4iLAotCQlpZC0+aWRlbnQpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3RydWN0IGRtaV9zeXN0ZW1faWQgX19jcHVpbml0ZGF0YSBlY19kbWlfdGFibGVbXSA9IHsKLQl7Ci0JcHJpbnRfZWNkdF9lcnJvciwgIkFzdXMgTDRSIiwgewotCURNSV9NQVRDSChETUlfQklPU19WRVJTSU9OLCAiMTAwOC4wMDYiKSwKLQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIkw0UiIpLAotCURNSV9NQVRDSChETUlfQk9BUkRfTkFNRSwgIkw0UiIpIH0sIE5VTEx9LAotCXsKLQlwcmludF9lY2R0X2Vycm9yLCAiQXN1cyBNNlIiLCB7Ci0JRE1JX01BVENIKERNSV9CSU9TX1ZFUlNJT04sICIwMjA3IiksCi0JRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJNNlIiKSwKLQlETUlfTUFUQ0goRE1JX0JPQVJEX05BTUUsICJNNlIiKSB9LCBOVUxMfSwKLQl7fSwKLX07Ci0KIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zYWN0aW9uIE1hbmFnZW1lbnQKICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC0zNzAsNyArMzQ0LDcgQEAKICAqIE5vdGU6IHNhbXN1bmcgbnY1MDAwIGRvZXNuJ3Qgd29yayB3aXRoIGVjIGJ1cnN0IG1vZGUuCiAgKiBodHRwOi8vYnVnemlsbGEua2VybmVsLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NDk4MAogICovCi1pbnQgYWNwaV9lY19idXJzdF9lbmFibGUoc3RydWN0IGFjcGlfZWMgKmVjKQorc3RhdGljIGludCBhY3BpX2VjX2J1cnN0X2VuYWJsZShzdHJ1Y3QgYWNwaV9lYyAqZWMpCiB7CiAJdTggZDsKIAlzdHJ1Y3QgdHJhbnNhY3Rpb24gdCA9IHsuY29tbWFuZCA9IEFDUElfRUNfQlVSU1RfRU5BQkxFLApAQCAtMzgwLDcgKzM1NCw3IEBACiAJcmV0dXJuIGFjcGlfZWNfdHJhbnNhY3Rpb24oZWMsICZ0LCAwKTsKIH0KIAotaW50IGFjcGlfZWNfYnVyc3RfZGlzYWJsZShzdHJ1Y3QgYWNwaV9lYyAqZWMpCitzdGF0aWMgaW50IGFjcGlfZWNfYnVyc3RfZGlzYWJsZShzdHJ1Y3QgYWNwaV9lYyAqZWMpCiB7CiAJc3RydWN0IHRyYW5zYWN0aW9uIHQgPSB7LmNvbW1hbmQgPSBBQ1BJX0VDX0JVUlNUX0RJU0FCTEUsCiAJCQkJLndkYXRhID0gTlVMTCwgLnJkYXRhID0gTlVMTCwKQEAgLTc1NiwxMCArNzMwLDE1IEBACiBhY3BpX2VjX3JlZ2lzdGVyX3F1ZXJ5X21ldGhvZHMoYWNwaV9oYW5kbGUgaGFuZGxlLCB1MzIgbGV2ZWwsCiAJCQkgICAgICAgdm9pZCAqY29udGV4dCwgdm9pZCAqKnJldHVybl92YWx1ZSkKIHsKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZSA9IGhhbmRsZTsKKwljaGFyIG5vZGVfbmFtZVs1XTsKKwlzdHJ1Y3QgYWNwaV9idWZmZXIgYnVmZmVyID0geyBzaXplb2Yobm9kZV9uYW1lKSwgbm9kZV9uYW1lIH07CiAJc3RydWN0IGFjcGlfZWMgKmVjID0gY29udGV4dDsKIAlpbnQgdmFsdWUgPSAwOwotCWlmIChzc2NhbmYobm9kZS0+bmFtZS5hc2NpaSwgIl9RJXgiLCAmdmFsdWUpID09IDEpIHsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisKKwlzdGF0dXMgPSBhY3BpX2dldF9uYW1lKGhhbmRsZSwgQUNQSV9TSU5HTEVfTkFNRSwgJmJ1ZmZlcik7CisKKwlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykgJiYgc3NjYW5mKG5vZGVfbmFtZSwgIl9RJXgiLCAmdmFsdWUpID09IDEpIHsKIAkJYWNwaV9lY19hZGRfcXVlcnlfaGFuZGxlcihlYywgdmFsdWUsIGhhbmRsZSwgTlVMTCwgTlVMTCk7CiAJfQogCXJldHVybiBBRV9PSzsKQEAgLTk3OCw4ICs5NTcsOCBAQAogCiBpbnQgX19pbml0IGFjcGlfZWNfZWNkdF9wcm9iZSh2b2lkKQogewotCWludCByZXQ7CiAJYWNwaV9zdGF0dXMgc3RhdHVzOworCXN0cnVjdCBhY3BpX2VjICpzYXZlZF9lYyA9IE5VTEw7CiAJc3RydWN0IGFjcGlfdGFibGVfZWNkdCAqZWNkdF9wdHI7CiAKIAlib290X2VjID0gbWFrZV9hY3BpX2VjKCk7CkBAIC05OTQsNDIgKzk3Myw1NSBAQAogCQlwcl9pbmZvKFBSRUZJWCAiRUMgZGVzY3JpcHRpb24gdGFibGUgaXMgZm91bmQsIGNvbmZpZ3VyaW5nIGJvb3QgRUNcbiIpOwogCQlib290X2VjLT5jb21tYW5kX2FkZHIgPSBlY2R0X3B0ci0+Y29udHJvbC5hZGRyZXNzOwogCQlib290X2VjLT5kYXRhX2FkZHIgPSBlY2R0X3B0ci0+ZGF0YS5hZGRyZXNzOwotCQlpZiAoZG1pX2NoZWNrX3N5c3RlbShlY19kbWlfdGFibGUpKSB7Ci0JCQkvKgotCQkJICogSWYgdGhlIGJvYXJkIGZhbGxzIGludG8gZWNfZG1pX3RhYmxlLCBpdCBtZWFucwotCQkJICogdGhhdCBFQ0RUIHRhYmxlIGdpdmVzIHRoZSBpbmNvcnJlY3QgY29tbWFuZC9zdGF0dXMKLQkJCSAqICYgZGF0YSBJL08gYWRkcmVzcy4gSnVzdCBmaXggaXQuCi0JCQkgKi8KLQkJCWJvb3RfZWMtPmRhdGFfYWRkciA9IGVjZHRfcHRyLT5jb250cm9sLmFkZHJlc3M7Ci0JCQlib290X2VjLT5jb21tYW5kX2FkZHIgPSBlY2R0X3B0ci0+ZGF0YS5hZGRyZXNzOwotCQl9CiAJCWJvb3RfZWMtPmdwZSA9IGVjZHRfcHRyLT5ncGU7CiAJCWJvb3RfZWMtPmhhbmRsZSA9IEFDUElfUk9PVF9PQkpFQ1Q7CiAJCWFjcGlfZ2V0X2hhbmRsZShBQ1BJX1JPT1RfT0JKRUNULCBlY2R0X3B0ci0+aWQsICZib290X2VjLT5oYW5kbGUpOworCQkvKiBEb24ndCB0cnVzdCBFQ0RULCB3aGljaCBjb21lcyBmcm9tIEFTVVNUZWsgKi8KKwkJaWYgKCFkbWlfbmFtZV9pbl92ZW5kb3JzKCJBU1VTIikpCisJCQlnb3RvIGluc3RhbGw7CisJCXNhdmVkX2VjID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGFjcGlfZWMpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFzYXZlZF9lYykKKwkJCXJldHVybiAtRU5PTUVNOworCQltZW1jcHkoJnNhdmVkX2VjLCBib290X2VjLCBzaXplb2Yoc2F2ZWRfZWMpKTsKKwkvKiBmYWxsIHRocm91Z2ggKi8KKwl9CisJLyogVGhpcyB3b3JrYXJvdW5kIGlzIG5lZWRlZCBvbmx5IG9uIHNvbWUgYnJva2VuIG1hY2hpbmVzLAorCSAqIHdoaWNoIHJlcXVpcmUgZWFybHkgRUMsIGJ1dCBmYWlsIHRvIHByb3ZpZGUgRUNEVCAqLworCXByaW50ayhLRVJOX0RFQlVHIFBSRUZJWCAiTG9vayB1cCBFQyBpbiBEU0RUXG4iKTsKKwlzdGF0dXMgPSBhY3BpX2dldF9kZXZpY2VzKGVjX2RldmljZV9pZHNbMF0uaWQsIGVjX3BhcnNlX2RldmljZSwKKwkJCQkJYm9vdF9lYywgTlVMTCk7CisJLyogQ2hlY2sgdGhhdCBhY3BpX2dldF9kZXZpY2VzIGFjdHVhbGx5IGZpbmQgc29tZXRoaW5nICovCisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpIHx8ICFib290X2VjLT5oYW5kbGUpCisJCWdvdG8gZXJyb3I7CisJaWYgKHNhdmVkX2VjKSB7CisJCS8qIHRyeSB0byBmaW5kIGdvb2QgRUNEVCBmcm9tIEFTVVNUZWsgKi8KKwkJaWYgKHNhdmVkX2VjLT5jb21tYW5kX2FkZHIgIT0gYm9vdF9lYy0+Y29tbWFuZF9hZGRyIHx8CisJCSAgICBzYXZlZF9lYy0+ZGF0YV9hZGRyICE9IGJvb3RfZWMtPmRhdGFfYWRkciB8fAorCQkgICAgc2F2ZWRfZWMtPmdwZSAhPSBib290X2VjLT5ncGUgfHwKKwkJICAgIHNhdmVkX2VjLT5oYW5kbGUgIT0gYm9vdF9lYy0+aGFuZGxlKQorCQkJcHJfaW5mbyhQUkVGSVggIkFTVVNUZWsga2VlcHMgZmVlZGluZyB1cyB3aXRoIGJyb2tlbiAiCisJCQkiRUNEVCB0YWJsZXMsIHdoaWNoIGFyZSB2ZXJ5IGhhcmQgdG8gd29ya2Fyb3VuZC4gIgorCQkJIlRyeWluZyB0byB1c2UgRFNEVCBFQyBpbmZvIGluc3RlYWQuIFBsZWFzZSBzZW5kICIKKwkJCSJvdXRwdXQgb2YgYWNwaWR1bXAgdG8gbGludXgtYWNwaUB2Z2VyLmtlcm5lbC5vcmdcbiIpOworCQlrZnJlZShzYXZlZF9lYyk7CisJCXNhdmVkX2VjID0gTlVMTDsKIAl9IGVsc2UgewotCQkvKiBUaGlzIHdvcmthcm91bmQgaXMgbmVlZGVkIG9ubHkgb24gc29tZSBicm9rZW4gbWFjaGluZXMsCi0JCSAqIHdoaWNoIHJlcXVpcmUgZWFybHkgRUMsIGJ1dCBmYWlsIHRvIHByb3ZpZGUgRUNEVCAqLwotCQlhY3BpX2hhbmRsZSB4OwotCQlwcmludGsoS0VSTl9ERUJVRyBQUkVGSVggIkxvb2sgdXAgRUMgaW4gRFNEVFxuIik7Ci0JCXN0YXR1cyA9IGFjcGlfZ2V0X2RldmljZXMoZWNfZGV2aWNlX2lkc1swXS5pZCwgZWNfcGFyc2VfZGV2aWNlLAotCQkJCQkJYm9vdF9lYywgTlVMTCk7Ci0JCS8qIENoZWNrIHRoYXQgYWNwaV9nZXRfZGV2aWNlcyBhY3R1YWxseSBmaW5kIHNvbWV0aGluZyAqLwotCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykgfHwgIWJvb3RfZWMtPmhhbmRsZSkKLQkJCWdvdG8gZXJyb3I7CiAJCS8qIFdlIHJlYWxseSBuZWVkIHRvIGxpbWl0IHRoaXMgd29ya2Fyb3VuZCwgdGhlIG9ubHkgQVNVUywKLQkJICogd2hpY2ggbmVlZHMgaXQsIGhhcyBmYWtlIEVDLl9JTkkgbWV0aG9kLCBzbyB1c2UgaXQgYXMgZmxhZy4KLQkJICogS2VlcCBib290X2VjIHN0cnVjdCBhcyBpdCB3aWxsIGJlIG5lZWRlZCBzb29uLgotCQkgKi8KLQkJaWYgKEFDUElfRkFJTFVSRShhY3BpX2dldF9oYW5kbGUoYm9vdF9lYy0+aGFuZGxlLCAiX0lOSSIsICZ4KSkpCisJCSogd2hpY2ggbmVlZHMgaXQsIGhhcyBmYWtlIEVDLl9JTkkgbWV0aG9kLCBzbyB1c2UgaXQgYXMgZmxhZy4KKwkJKiBLZWVwIGJvb3RfZWMgc3RydWN0IGFzIGl0IHdpbGwgYmUgbmVlZGVkIHNvb24uCisJCSovCisJCWFjcGlfaGFuZGxlIGR1bW15OworCQlpZiAoIWRtaV9uYW1lX2luX3ZlbmRvcnMoIkFTVVMiKSB8fAorCQkgICAgQUNQSV9GQUlMVVJFKGFjcGlfZ2V0X2hhbmRsZShib290X2VjLT5oYW5kbGUsICJfSU5JIiwKKwkJCQkJCQkmZHVtbXkpKSkKIAkJCXJldHVybiAtRU5PREVWOwogCX0KLQotCXJldCA9IGVjX2luc3RhbGxfaGFuZGxlcnMoYm9vdF9lYyk7Ci0JaWYgKCFyZXQpIHsKK2luc3RhbGw6CisJaWYgKCFlY19pbnN0YWxsX2hhbmRsZXJzKGJvb3RfZWMpKSB7CiAJCWZpcnN0X2VjID0gYm9vdF9lYzsKIAkJcmV0dXJuIDA7CiAJfQotICAgICAgZXJyb3I6CitlcnJvcjoKIAlrZnJlZShib290X2VjKTsKIAlib290X2VjID0gTlVMTDsKIAlyZXR1cm4gLUVOT0RFVjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9ldmVudHMvTWFrZWZpbGUgYi9kcml2ZXJzL2FjcGkvZXZlbnRzL01ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjlmMmVlLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvYWNwaS9ldmVudHMvTWFrZWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLSMKLSMgTWFrZWZpbGUgZm9yIGFsbCBMaW51eCBBQ1BJIGludGVycHJldGVyIHN1YmRpcmVjdG9yaWVzCi0jCi0KLW9iai15IDo9IGV2ZXZlbnQubyAgZXZyZWdpb24ubyAgZXZzY2kubyAgICBldnhmZXZudC5vIFwKLQkgZXZtaXNjLm8gICBldnJnbmluaS5vICBldnhmYWNlLm8gIGV2eGZyZWduLm8gXAotCSBldmdwZS5vICAgIGV2Z3BlYmxrLm8KLQotRVhUUkFfQ0ZMQUdTICs9ICQoQUNQSV9DRkxBR1MpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZXZlbnRzL2V2ZXZlbnQuYyBiL2RyaXZlcnMvYWNwaS9ldmVudHMvZXZldmVudC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTZjNWM2Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvYWNwaS9ldmVudHMvZXZldmVudC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBNb2R1bGUgTmFtZTogZXZldmVudCAtIEZpeGVkIEV2ZW50IGhhbmRsaW5nIGFuZCBkaXNwYXRjaAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDgsIEludGVsIENvcnAuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCi0gKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSBhdCBtaW5pbXVtIGEgZGlzY2xhaW1lcgotICogICAgc3Vic3RhbnRpYWxseSBzaW1pbGFyIHRvIHRoZSAiTk8gV0FSUkFOVFkiIGRpc2NsYWltZXIgYmVsb3cKLSAqICAgICgiRGlzY2xhaW1lciIpIGFuZCBhbnkgcmVkaXN0cmlidXRpb24gbXVzdCBiZSBjb25kaXRpb25lZCB1cG9uCi0gKiAgICBpbmNsdWRpbmcgYSBzdWJzdGFudGlhbGx5IHNpbWlsYXIgRGlzY2xhaW1lciByZXF1aXJlbWVudCBmb3IgZnVydGhlcgotICogICAgYmluYXJ5IHJlZGlzdHJpYnV0aW9uLgotICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzCi0gKiAgICBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIE5PIFdBUlJBTlRZCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKLSAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCi0gKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORwotICogSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCi0gKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCi0gKi8KLQotI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgotI2luY2x1ZGUgPGFjcGkvYWNldmVudHMuaD4KLQotI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfRVZFTlRTCi1BQ1BJX01PRFVMRV9OQU1FKCJldmV2ZW50IikKLQotLyogTG9jYWwgcHJvdG90eXBlcyAqLwotc3RhdGljIGFjcGlfc3RhdHVzIGFjcGlfZXZfZml4ZWRfZXZlbnRfaW5pdGlhbGl6ZSh2b2lkKTsKLQotc3RhdGljIHUzMiBhY3BpX2V2X2ZpeGVkX2V2ZW50X2Rpc3BhdGNoKHUzMiBldmVudCk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfZXZfaW5pdGlhbGl6ZV9ldmVudHMKLSAqCi0gKiBQQVJBTUVURVJTOiAgTm9uZQotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKLSAqCi0gKiBERVNDUklQVElPTjogSW5pdGlhbGl6ZSBnbG9iYWwgZGF0YSBzdHJ1Y3R1cmVzIGZvciBBQ1BJIGV2ZW50cyAoRml4ZWQsIEdQRSkKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1hY3BpX3N0YXR1cyBhY3BpX2V2X2luaXRpYWxpemVfZXZlbnRzKHZvaWQpCi17Ci0JYWNwaV9zdGF0dXMgc3RhdHVzOwotCi0JQUNQSV9GVU5DVElPTl9UUkFDRShldl9pbml0aWFsaXplX2V2ZW50cyk7Ci0KLQkvKgotCSAqIEluaXRpYWxpemUgdGhlIEZpeGVkIGFuZCBHZW5lcmFsIFB1cnBvc2UgRXZlbnRzLiBUaGlzIGlzIGRvbmUgcHJpb3IgdG8KLQkgKiBlbmFibGluZyBTQ0lzIHRvIHByZXZlbnQgaW50ZXJydXB0cyBmcm9tIG9jY3VycmluZyBiZWZvcmUgdGhlIGhhbmRsZXJzIGFyZQotCSAqIGluc3RhbGxlZC4KLQkgKi8KLQlzdGF0dXMgPSBhY3BpX2V2X2ZpeGVkX2V2ZW50X2luaXRpYWxpemUoKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJQUNQSV9FWENFUFRJT04oKEFFX0lORk8sIHN0YXR1cywKLQkJCQkiVW5hYmxlIHRvIGluaXRpYWxpemUgZml4ZWQgZXZlbnRzIikpOwotCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLQl9Ci0KLQlzdGF0dXMgPSBhY3BpX2V2X2dwZV9pbml0aWFsaXplKCk7Ci0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCUFDUElfRVhDRVBUSU9OKChBRV9JTkZPLCBzdGF0dXMsCi0JCQkJIlVuYWJsZSB0byBpbml0aWFsaXplIGdlbmVyYWwgcHVycG9zZSBldmVudHMiKSk7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotCX0KLQotCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX2V2X2luc3RhbGxfZmFkdF9ncGVzCi0gKgotICogUEFSQU1FVEVSUzogIE5vbmUKLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IENvbXBsZXRlcyBpbml0aWFsaXphdGlvbiBvZiB0aGUgRkFEVC1kZWZpbmVkIEdQRSBibG9ja3MKLSAqICAgICAgICAgICAgICAoMCBhbmQgMSkuIFRoaXMgY2F1c2VzIHRoZSBfUFJXIG1ldGhvZHMgdG8gYmUgcnVuLCBzbyB0aGUgSFcKLSAqICAgICAgICAgICAgICBtdXN0IGJlIGZ1bGx5IGluaXRpYWxpemVkIGF0IHRoaXMgcG9pbnQsIGluY2x1ZGluZyBnbG9iYWwgbG9jawotICogICAgICAgICAgICAgIHN1cHBvcnQuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotYWNwaV9zdGF0dXMgYWNwaV9ldl9pbnN0YWxsX2ZhZHRfZ3Blcyh2b2lkKQotewotCWFjcGlfc3RhdHVzIHN0YXR1czsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UoZXZfaW5zdGFsbF9mYWR0X2dwZXMpOwotCi0JLyogTmFtZXNwYWNlIG11c3QgYmUgbG9ja2VkICovCi0KLQlzdGF0dXMgPSBhY3BpX3V0X2FjcXVpcmVfbXV0ZXgoQUNQSV9NVFhfTkFNRVNQQUNFKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJcmV0dXJuIChzdGF0dXMpOwotCX0KLQotCS8qIEZBRFQgR1BFIEJsb2NrIDAgKi8KLQotCSh2b2lkKWFjcGlfZXZfaW5pdGlhbGl6ZV9ncGVfYmxvY2soYWNwaV9nYmxfZmFkdF9ncGVfZGV2aWNlLAotCQkJCQkgICBhY3BpX2dibF9ncGVfZmFkdF9ibG9ja3NbMF0pOwotCi0JLyogRkFEVCBHUEUgQmxvY2sgMSAqLwotCi0JKHZvaWQpYWNwaV9ldl9pbml0aWFsaXplX2dwZV9ibG9jayhhY3BpX2dibF9mYWR0X2dwZV9kZXZpY2UsCi0JCQkJCSAgIGFjcGlfZ2JsX2dwZV9mYWR0X2Jsb2Nrc1sxXSk7Ci0KLQkodm9pZClhY3BpX3V0X3JlbGVhc2VfbXV0ZXgoQUNQSV9NVFhfTkFNRVNQQUNFKTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX2V2X2luc3RhbGxfeHJ1cHRfaGFuZGxlcnMKLSAqCi0gKiBQQVJBTUVURVJTOiAgTm9uZQotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKLSAqCi0gKiBERVNDUklQVElPTjogSW5zdGFsbCBpbnRlcnJ1cHQgaGFuZGxlcnMgZm9yIHRoZSBTQ0kgYW5kIEdsb2JhbCBMb2NrCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotYWNwaV9zdGF0dXMgYWNwaV9ldl9pbnN0YWxsX3hydXB0X2hhbmRsZXJzKHZvaWQpCi17Ci0JYWNwaV9zdGF0dXMgc3RhdHVzOwotCi0JQUNQSV9GVU5DVElPTl9UUkFDRShldl9pbnN0YWxsX3hydXB0X2hhbmRsZXJzKTsKLQotCS8qIEluc3RhbGwgdGhlIFNDSSBoYW5kbGVyICovCi0KLQlzdGF0dXMgPSBhY3BpX2V2X2luc3RhbGxfc2NpX2hhbmRsZXIoKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJQUNQSV9FWENFUFRJT04oKEFFX0lORk8sIHN0YXR1cywKLQkJCQkiVW5hYmxlIHRvIGluc3RhbGwgU3lzdGVtIENvbnRyb2wgSW50ZXJydXB0IGhhbmRsZXIiKSk7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotCX0KLQotCS8qIEluc3RhbGwgdGhlIGhhbmRsZXIgZm9yIHRoZSBHbG9iYWwgTG9jayAqLwotCi0Jc3RhdHVzID0gYWNwaV9ldl9pbml0X2dsb2JhbF9sb2NrX2hhbmRsZXIoKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJQUNQSV9FWENFUFRJT04oKEFFX0lORk8sIHN0YXR1cywKLQkJCQkiVW5hYmxlIHRvIGluaXRpYWxpemUgR2xvYmFsIExvY2sgaGFuZGxlciIpKTsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci0JfQotCi0JYWNwaV9nYmxfZXZlbnRzX2luaXRpYWxpemVkID0gVFJVRTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9ldl9maXhlZF9ldmVudF9pbml0aWFsaXplCi0gKgotICogUEFSQU1FVEVSUzogIE5vbmUKLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IEluc3RhbGwgdGhlIGZpeGVkIGV2ZW50IGhhbmRsZXJzIGFuZCBlbmFibGUgdGhlIGZpeGVkIGV2ZW50cy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgYWNwaV9zdGF0dXMgYWNwaV9ldl9maXhlZF9ldmVudF9pbml0aWFsaXplKHZvaWQpCi17Ci0JdTMyIGk7Ci0JYWNwaV9zdGF0dXMgc3RhdHVzOwotCi0JLyoKLQkgKiBJbml0aWFsaXplIHRoZSBzdHJ1Y3R1cmUgdGhhdCBrZWVwcyB0cmFjayBvZiBmaXhlZCBldmVudCBoYW5kbGVycwotCSAqIGFuZCBlbmFibGUgdGhlIGZpeGVkIGV2ZW50cy4KLQkgKi8KLQlmb3IgKGkgPSAwOyBpIDwgQUNQSV9OVU1fRklYRURfRVZFTlRTOyBpKyspIHsKLQkJYWNwaV9nYmxfZml4ZWRfZXZlbnRfaGFuZGxlcnNbaV0uaGFuZGxlciA9IE5VTEw7Ci0JCWFjcGlfZ2JsX2ZpeGVkX2V2ZW50X2hhbmRsZXJzW2ldLmNvbnRleHQgPSBOVUxMOwotCi0JCS8qIEVuYWJsZSB0aGUgZml4ZWQgZXZlbnQgKi8KLQotCQlpZiAoYWNwaV9nYmxfZml4ZWRfZXZlbnRfaW5mb1tpXS5lbmFibGVfcmVnaXN0ZXJfaWQgIT0gMHhGRikgewotCQkJc3RhdHVzID0KLQkJCSAgICBhY3BpX3NldF9yZWdpc3RlcihhY3BpX2dibF9maXhlZF9ldmVudF9pbmZvW2ldLgotCQkJCQkgICAgICBlbmFibGVfcmVnaXN0ZXJfaWQsIDApOwotCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCQkJcmV0dXJuIChzdGF0dXMpOwotCQkJfQotCQl9Ci0JfQotCi0JcmV0dXJuIChBRV9PSyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfZXZfZml4ZWRfZXZlbnRfZGV0ZWN0Ci0gKgotICogUEFSQU1FVEVSUzogIE5vbmUKLSAqCi0gKiBSRVRVUk46ICAgICAgSU5URVJSVVBUX0hBTkRMRUQgb3IgSU5URVJSVVBUX05PVF9IQU5ETEVECi0gKgotICogREVTQ1JJUFRJT046IENoZWNrcyB0aGUgUE0gc3RhdHVzIHJlZ2lzdGVyIGZvciBhY3RpdmUgZml4ZWQgZXZlbnRzCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdTMyIGFjcGlfZXZfZml4ZWRfZXZlbnRfZGV0ZWN0KHZvaWQpCi17Ci0JdTMyIGludF9zdGF0dXMgPSBBQ1BJX0lOVEVSUlVQVF9OT1RfSEFORExFRDsKLQl1MzIgZml4ZWRfc3RhdHVzOwotCXUzMiBmaXhlZF9lbmFibGU7Ci0JdTMyIGk7Ci0KLQlBQ1BJX0ZVTkNUSU9OX05BTUUoZXZfZml4ZWRfZXZlbnRfZGV0ZWN0KTsKLQotCS8qCi0JICogUmVhZCB0aGUgZml4ZWQgZmVhdHVyZSBzdGF0dXMgYW5kIGVuYWJsZSByZWdpc3RlcnMsIGFzIGFsbCB0aGUgY2FzZXMKLQkgKiBkZXBlbmQgb24gdGhlaXIgdmFsdWVzLiAgSWdub3JlIGVycm9ycyBoZXJlLgotCSAqLwotCSh2b2lkKWFjcGlfaHdfcmVnaXN0ZXJfcmVhZChBQ1BJX1JFR0lTVEVSX1BNMV9TVEFUVVMsICZmaXhlZF9zdGF0dXMpOwotCSh2b2lkKWFjcGlfaHdfcmVnaXN0ZXJfcmVhZChBQ1BJX1JFR0lTVEVSX1BNMV9FTkFCTEUsICZmaXhlZF9lbmFibGUpOwotCi0JQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTlRFUlJVUFRTLAotCQkJICAiRml4ZWQgRXZlbnQgQmxvY2s6IEVuYWJsZSAlMDhYIFN0YXR1cyAlMDhYXG4iLAotCQkJICBmaXhlZF9lbmFibGUsIGZpeGVkX3N0YXR1cykpOwotCi0JLyoKLQkgKiBDaGVjayBmb3IgYWxsIHBvc3NpYmxlIEZpeGVkIEV2ZW50cyBhbmQgZGlzcGF0Y2ggdGhvc2UgdGhhdCBhcmUgYWN0aXZlCi0JICovCi0JZm9yIChpID0gMDsgaSA8IEFDUElfTlVNX0ZJWEVEX0VWRU5UUzsgaSsrKSB7Ci0KLQkJLyogQm90aCB0aGUgc3RhdHVzIGFuZCBlbmFibGUgYml0cyBtdXN0IGJlIG9uIGZvciB0aGlzIGV2ZW50ICovCi0KLQkJaWYgKChmaXhlZF9zdGF0dXMgJiBhY3BpX2dibF9maXhlZF9ldmVudF9pbmZvW2ldLgotCQkgICAgIHN0YXR1c19iaXRfbWFzaykKLQkJICAgICYmIChmaXhlZF9lbmFibGUgJiBhY3BpX2dibF9maXhlZF9ldmVudF9pbmZvW2ldLgotCQkJZW5hYmxlX2JpdF9tYXNrKSkgewotCi0JCQkvKiBGb3VuZCBhbiBhY3RpdmUgKHNpZ25hbGxlZCkgZXZlbnQgKi8KLQkJCWFjcGlfb3NfZml4ZWRfZXZlbnRfY291bnQoaSk7Ci0JCQlpbnRfc3RhdHVzIHw9IGFjcGlfZXZfZml4ZWRfZXZlbnRfZGlzcGF0Y2goaSk7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gKGludF9zdGF0dXMpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX2V2X2ZpeGVkX2V2ZW50X2Rpc3BhdGNoCi0gKgotICogUEFSQU1FVEVSUzogIEV2ZW50ICAgICAgICAgICAgICAgLSBFdmVudCB0eXBlCi0gKgotICogUkVUVVJOOiAgICAgIElOVEVSUlVQVF9IQU5ETEVEIG9yIElOVEVSUlVQVF9OT1RfSEFORExFRAotICoKLSAqIERFU0NSSVBUSU9OOiBDbGVhcnMgdGhlIHN0YXR1cyBiaXQgZm9yIHRoZSByZXF1ZXN0ZWQgZXZlbnQsIGNhbGxzIHRoZQotICogICAgICAgICAgICAgIGhhbmRsZXIgdGhhdCBwcmV2aW91c2x5IHJlZ2lzdGVyZWQgZm9yIHRoZSBldmVudC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgdTMyIGFjcGlfZXZfZml4ZWRfZXZlbnRfZGlzcGF0Y2godTMyIGV2ZW50KQotewotCi0JQUNQSV9GVU5DVElPTl9FTlRSWSgpOwotCi0JLyogQ2xlYXIgdGhlIHN0YXR1cyBiaXQgKi8KLQotCSh2b2lkKWFjcGlfc2V0X3JlZ2lzdGVyKGFjcGlfZ2JsX2ZpeGVkX2V2ZW50X2luZm9bZXZlbnRdLgotCQkJCXN0YXR1c19yZWdpc3Rlcl9pZCwgMSk7Ci0KLQkvKgotCSAqIE1ha2Ugc3VyZSB3ZSd2ZSBnb3QgYSBoYW5kbGVyLiAgSWYgbm90LCByZXBvcnQgYW4gZXJyb3IuCi0JICogVGhlIGV2ZW50IGlzIGRpc2FibGVkIHRvIHByZXZlbnQgZnVydGhlciBpbnRlcnJ1cHRzLgotCSAqLwotCWlmIChOVUxMID09IGFjcGlfZ2JsX2ZpeGVkX2V2ZW50X2hhbmRsZXJzW2V2ZW50XS5oYW5kbGVyKSB7Ci0JCSh2b2lkKWFjcGlfc2V0X3JlZ2lzdGVyKGFjcGlfZ2JsX2ZpeGVkX2V2ZW50X2luZm9bZXZlbnRdLgotCQkJCQllbmFibGVfcmVnaXN0ZXJfaWQsIDApOwotCi0JCUFDUElfRVJST1IoKEFFX0lORk8sCi0JCQkgICAgIk5vIGluc3RhbGxlZCBoYW5kbGVyIGZvciBmaXhlZCBldmVudCBbJTA4WF0iLAotCQkJICAgIGV2ZW50KSk7Ci0KLQkJcmV0dXJuIChBQ1BJX0lOVEVSUlVQVF9OT1RfSEFORExFRCk7Ci0JfQotCi0JLyogSW52b2tlIHRoZSBGaXhlZCBFdmVudCBoYW5kbGVyICovCi0KLQlyZXR1cm4gKChhY3BpX2dibF9maXhlZF9ldmVudF9oYW5kbGVyc1tldmVudF0uCi0JCSBoYW5kbGVyKSAoYWNwaV9nYmxfZml4ZWRfZXZlbnRfaGFuZGxlcnNbZXZlbnRdLmNvbnRleHQpKTsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9ldmVudHMvZXZncGUuYyBiL2RyaXZlcnMvYWNwaS9ldmVudHMvZXZncGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQ1Yzc0Zi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL2FjcGkvZXZlbnRzL2V2Z3BlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3MjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIE1vZHVsZSBOYW1lOiBldmdwZSAtIEdlbmVyYWwgUHVycG9zZSBFdmVudCBoYW5kbGluZyBhbmQgZGlzcGF0Y2gKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA4LCBJbnRlbCBDb3JwLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAotICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgYXQgbWluaW11bSBhIGRpc2NsYWltZXIKLSAqICAgIHN1YnN0YW50aWFsbHkgc2ltaWxhciB0byB0aGUgIk5PIFdBUlJBTlRZIiBkaXNjbGFpbWVyIGJlbG93Ci0gKiAgICAoIkRpc2NsYWltZXIiKSBhbmQgYW55IHJlZGlzdHJpYnV0aW9uIG11c3QgYmUgY29uZGl0aW9uZWQgdXBvbgotICogICAgaW5jbHVkaW5nIGEgc3Vic3RhbnRpYWxseSBzaW1pbGFyIERpc2NsYWltZXIgcmVxdWlyZW1lbnQgZm9yIGZ1cnRoZXIKLSAqICAgIGJpbmFyeSByZWRpc3RyaWJ1dGlvbi4KLSAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcwotICogICAgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICogU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBOTyBXQVJSQU5UWQotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCi0gKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUwotICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcKLSAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQotICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgotICovCi0KLSNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KLSNpbmNsdWRlIDxhY3BpL2FjZXZlbnRzLmg+Ci0jaW5jbHVkZSA8YWNwaS9hY25hbWVzcC5oPgotCi0jZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9FVkVOVFMKLUFDUElfTU9EVUxFX05BTUUoImV2Z3BlIikKLQotLyogTG9jYWwgcHJvdG90eXBlcyAqLwotc3RhdGljIHZvaWQgQUNQSV9TWVNURU1fWEZBQ0UgYWNwaV9ldl9hc3luY2hfZXhlY3V0ZV9ncGVfbWV0aG9kKHZvaWQgKmNvbnRleHQpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX2V2X3NldF9ncGVfdHlwZQotICoKLSAqIFBBUkFNRVRFUlM6ICBncGVfZXZlbnRfaW5mbyAgICAgICAgICAtIEdQRSB0byBzZXQKLSAqICAgICAgICAgICAgICBUeXBlICAgICAgICAgICAgICAgICAgICAtIE5ldyB0eXBlCi0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cwotICoKLSAqIERFU0NSSVBUSU9OOiBTZXRzIHRoZSBuZXcgdHlwZSBmb3IgdGhlIEdQRSAod2FrZSwgcnVuLCBvciB3YWtlL3J1bikKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1hY3BpX3N0YXR1cwotYWNwaV9ldl9zZXRfZ3BlX3R5cGUoc3RydWN0IGFjcGlfZ3BlX2V2ZW50X2luZm8gKmdwZV9ldmVudF9pbmZvLCB1OCB0eXBlKQotewotCWFjcGlfc3RhdHVzIHN0YXR1czsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UoZXZfc2V0X2dwZV90eXBlKTsKLQotCS8qIFZhbGlkYXRlIHR5cGUgYW5kIHVwZGF0ZSByZWdpc3RlciBlbmFibGUgbWFza3MgKi8KLQotCXN3aXRjaCAodHlwZSkgewotCWNhc2UgQUNQSV9HUEVfVFlQRV9XQUtFOgotCWNhc2UgQUNQSV9HUEVfVFlQRV9SVU5USU1FOgotCWNhc2UgQUNQSV9HUEVfVFlQRV9XQUtFX1JVTjoKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX1BBUkFNRVRFUik7Ci0JfQotCi0JLyogRGlzYWJsZSB0aGUgR1BFIGlmIGN1cnJlbnRseSBlbmFibGVkICovCi0KLQlzdGF0dXMgPSBhY3BpX2V2X2Rpc2FibGVfZ3BlKGdwZV9ldmVudF9pbmZvKTsKLQotCS8qIFR5cGUgd2FzIHZhbGlkYXRlZCBhYm92ZSAqLwotCi0JZ3BlX2V2ZW50X2luZm8tPmZsYWdzICY9IH5BQ1BJX0dQRV9UWVBFX01BU0s7CS8qIENsZWFyIHR5cGUgYml0cyAqLwotCWdwZV9ldmVudF9pbmZvLT5mbGFncyB8PSB0eXBlOwkvKiBJbnNlcnQgdHlwZSAqLwotCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX2V2X3VwZGF0ZV9ncGVfZW5hYmxlX21hc2tzCi0gKgotICogUEFSQU1FVEVSUzogIGdwZV9ldmVudF9pbmZvICAgICAgICAgIC0gR1BFIHRvIHVwZGF0ZQotICogICAgICAgICAgICAgIFR5cGUgICAgICAgICAgICAgICAgICAgIC0gV2hhdCB0byBkbzogQUNQSV9HUEVfRElTQUJMRSBvcgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUNQSV9HUEVfRU5BQkxFCi0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cwotICoKLSAqIERFU0NSSVBUSU9OOiBVcGRhdGVzIEdQRSByZWdpc3RlciBlbmFibGUgbWFza3MgYmFzZWQgb24gdGhlIEdQRSB0eXBlCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotYWNwaV9zdGF0dXMKLWFjcGlfZXZfdXBkYXRlX2dwZV9lbmFibGVfbWFza3Moc3RydWN0IGFjcGlfZ3BlX2V2ZW50X2luZm8gKmdwZV9ldmVudF9pbmZvLAotCQkJCXU4IHR5cGUpCi17Ci0Jc3RydWN0IGFjcGlfZ3BlX3JlZ2lzdGVyX2luZm8gKmdwZV9yZWdpc3Rlcl9pbmZvOwotCXU4IHJlZ2lzdGVyX2JpdDsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UoZXZfdXBkYXRlX2dwZV9lbmFibGVfbWFza3MpOwotCi0JZ3BlX3JlZ2lzdGVyX2luZm8gPSBncGVfZXZlbnRfaW5mby0+cmVnaXN0ZXJfaW5mbzsKLQlpZiAoIWdwZV9yZWdpc3Rlcl9pbmZvKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT1RfRVhJU1QpOwotCX0KLQlyZWdpc3Rlcl9iaXQgPSAodTgpCi0JICAgICgxIDw8Ci0JICAgICAoZ3BlX2V2ZW50X2luZm8tPmdwZV9udW1iZXIgLSBncGVfcmVnaXN0ZXJfaW5mby0+YmFzZV9ncGVfbnVtYmVyKSk7Ci0KLQkvKiAxKSBEaXNhYmxlIGNhc2UuICBTaW1wbHkgY2xlYXIgYWxsIGVuYWJsZSBiaXRzICovCi0KLQlpZiAodHlwZSA9PSBBQ1BJX0dQRV9ESVNBQkxFKSB7Ci0JCUFDUElfQ0xFQVJfQklUKGdwZV9yZWdpc3Rlcl9pbmZvLT5lbmFibGVfZm9yX3dha2UsCi0JCQkgICAgICAgcmVnaXN0ZXJfYml0KTsKLQkJQUNQSV9DTEVBUl9CSVQoZ3BlX3JlZ2lzdGVyX2luZm8tPmVuYWJsZV9mb3JfcnVuLCByZWdpc3Rlcl9iaXQpOwotCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwotCX0KLQotCS8qIDIpIEVuYWJsZSBjYXNlLiAgU2V0L0NsZWFyIHRoZSBhcHByb3ByaWF0ZSBlbmFibGUgYml0cyAqLwotCi0Jc3dpdGNoIChncGVfZXZlbnRfaW5mby0+ZmxhZ3MgJiBBQ1BJX0dQRV9UWVBFX01BU0spIHsKLQljYXNlIEFDUElfR1BFX1RZUEVfV0FLRToKLQkJQUNQSV9TRVRfQklUKGdwZV9yZWdpc3Rlcl9pbmZvLT5lbmFibGVfZm9yX3dha2UsIHJlZ2lzdGVyX2JpdCk7Ci0JCUFDUElfQ0xFQVJfQklUKGdwZV9yZWdpc3Rlcl9pbmZvLT5lbmFibGVfZm9yX3J1biwgcmVnaXN0ZXJfYml0KTsKLQkJYnJlYWs7Ci0KLQljYXNlIEFDUElfR1BFX1RZUEVfUlVOVElNRToKLQkJQUNQSV9DTEVBUl9CSVQoZ3BlX3JlZ2lzdGVyX2luZm8tPmVuYWJsZV9mb3Jfd2FrZSwKLQkJCSAgICAgICByZWdpc3Rlcl9iaXQpOwotCQlBQ1BJX1NFVF9CSVQoZ3BlX3JlZ2lzdGVyX2luZm8tPmVuYWJsZV9mb3JfcnVuLCByZWdpc3Rlcl9iaXQpOwotCQlicmVhazsKLQotCWNhc2UgQUNQSV9HUEVfVFlQRV9XQUtFX1JVTjoKLQkJQUNQSV9TRVRfQklUKGdwZV9yZWdpc3Rlcl9pbmZvLT5lbmFibGVfZm9yX3dha2UsIHJlZ2lzdGVyX2JpdCk7Ci0JCUFDUElfU0VUX0JJVChncGVfcmVnaXN0ZXJfaW5mby0+ZW5hYmxlX2Zvcl9ydW4sIHJlZ2lzdGVyX2JpdCk7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9QQVJBTUVURVIpOwotCX0KLQotCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfZXZfZW5hYmxlX2dwZQotICoKLSAqIFBBUkFNRVRFUlM6ICBncGVfZXZlbnRfaW5mbyAgICAgICAgICAtIEdQRSB0byBlbmFibGUKLSAqICAgICAgICAgICAgICB3cml0ZV90b19oYXJkd2FyZSAgICAgICAtIEVuYWJsZSBub3csIG9yIGp1c3QgbWFyayBkYXRhIHN0cnVjdHMKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChXQUtFIEdQRXMgc2hvdWxkIGJlIGRlZmVycmVkKQotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKLSAqCi0gKiBERVNDUklQVElPTjogRW5hYmxlIGEgR1BFIGJhc2VkIG9uIHRoZSBHUEUgdHlwZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWFjcGlfc3RhdHVzCi1hY3BpX2V2X2VuYWJsZV9ncGUoc3RydWN0IGFjcGlfZ3BlX2V2ZW50X2luZm8gKmdwZV9ldmVudF9pbmZvLAotCQkgICB1OCB3cml0ZV90b19oYXJkd2FyZSkKLXsKLQlhY3BpX3N0YXR1cyBzdGF0dXM7Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGV2X2VuYWJsZV9ncGUpOwotCi0JLyogTWFrZSBzdXJlIEhXIGVuYWJsZSBtYXNrcyBhcmUgdXBkYXRlZCAqLwotCi0Jc3RhdHVzID0KLQkgICAgYWNwaV9ldl91cGRhdGVfZ3BlX2VuYWJsZV9tYXNrcyhncGVfZXZlbnRfaW5mbywgQUNQSV9HUEVfRU5BQkxFKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci0JfQotCi0JLyogTWFyayB3YWtlLWVuYWJsZWQgb3IgSFcgZW5hYmxlLCBvciBib3RoICovCi0KLQlzd2l0Y2ggKGdwZV9ldmVudF9pbmZvLT5mbGFncyAmIEFDUElfR1BFX1RZUEVfTUFTSykgewotCWNhc2UgQUNQSV9HUEVfVFlQRV9XQUtFOgotCi0JCUFDUElfU0VUX0JJVChncGVfZXZlbnRfaW5mby0+ZmxhZ3MsIEFDUElfR1BFX1dBS0VfRU5BQkxFRCk7Ci0JCWJyZWFrOwotCi0JY2FzZSBBQ1BJX0dQRV9UWVBFX1dBS0VfUlVOOgotCi0JCUFDUElfU0VUX0JJVChncGVfZXZlbnRfaW5mby0+ZmxhZ3MsIEFDUElfR1BFX1dBS0VfRU5BQkxFRCk7Ci0KLQkJLypsaW50IC1mYWxsdGhyb3VnaCAqLwotCi0JY2FzZSBBQ1BJX0dQRV9UWVBFX1JVTlRJTUU6Ci0KLQkJQUNQSV9TRVRfQklUKGdwZV9ldmVudF9pbmZvLT5mbGFncywgQUNQSV9HUEVfUlVOX0VOQUJMRUQpOwotCi0JCWlmICh3cml0ZV90b19oYXJkd2FyZSkgewotCi0JCQkvKiBDbGVhciB0aGUgR1BFIChvZiBzdGFsZSBldmVudHMpLCB0aGVuIGVuYWJsZSBpdCAqLwotCi0JCQlzdGF0dXMgPSBhY3BpX2h3X2NsZWFyX2dwZShncGVfZXZlbnRfaW5mbyk7Ci0JCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLQkJCX0KLQotCQkJLyogRW5hYmxlIHRoZSByZXF1ZXN0ZWQgcnVudGltZSBHUEUgKi8KLQotCQkJc3RhdHVzID0gYWNwaV9od193cml0ZV9ncGVfZW5hYmxlX3JlZyhncGVfZXZlbnRfaW5mbyk7Ci0JCX0KLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX1BBUkFNRVRFUik7Ci0JfQotCi0JcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9ldl9kaXNhYmxlX2dwZQotICoKLSAqIFBBUkFNRVRFUlM6ICBncGVfZXZlbnRfaW5mbyAgICAgICAgICAtIEdQRSB0byBkaXNhYmxlCi0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cwotICoKLSAqIERFU0NSSVBUSU9OOiBEaXNhYmxlIGEgR1BFIGJhc2VkIG9uIHRoZSBHUEUgdHlwZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWFjcGlfc3RhdHVzIGFjcGlfZXZfZGlzYWJsZV9ncGUoc3RydWN0IGFjcGlfZ3BlX2V2ZW50X2luZm8gKmdwZV9ldmVudF9pbmZvKQotewotCWFjcGlfc3RhdHVzIHN0YXR1czsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UoZXZfZGlzYWJsZV9ncGUpOwotCi0JLyogTWFrZSBzdXJlIEhXIGVuYWJsZSBtYXNrcyBhcmUgdXBkYXRlZCAqLwotCi0Jc3RhdHVzID0KLQkgICAgYWNwaV9ldl91cGRhdGVfZ3BlX2VuYWJsZV9tYXNrcyhncGVfZXZlbnRfaW5mbywgQUNQSV9HUEVfRElTQUJMRSk7Ci0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotCX0KLQotCS8qIENsZWFyIHRoZSBhcHByb3ByaWF0ZSBlbmFibGVkIGZsYWdzIGZvciB0aGlzIEdQRSAqLwotCi0Jc3dpdGNoIChncGVfZXZlbnRfaW5mby0+ZmxhZ3MgJiBBQ1BJX0dQRV9UWVBFX01BU0spIHsKLQljYXNlIEFDUElfR1BFX1RZUEVfV0FLRToKLQkJQUNQSV9DTEVBUl9CSVQoZ3BlX2V2ZW50X2luZm8tPmZsYWdzLCBBQ1BJX0dQRV9XQUtFX0VOQUJMRUQpOwotCQlicmVhazsKLQotCWNhc2UgQUNQSV9HUEVfVFlQRV9XQUtFX1JVTjoKLQkJQUNQSV9DTEVBUl9CSVQoZ3BlX2V2ZW50X2luZm8tPmZsYWdzLCBBQ1BJX0dQRV9XQUtFX0VOQUJMRUQpOwotCi0JCS8qIGZhbGx0aHJvdWdoICovCi0KLQljYXNlIEFDUElfR1BFX1RZUEVfUlVOVElNRToKLQotCQkvKiBEaXNhYmxlIHRoZSByZXF1ZXN0ZWQgcnVudGltZSBHUEUgKi8KLQotCQlBQ1BJX0NMRUFSX0JJVChncGVfZXZlbnRfaW5mby0+ZmxhZ3MsIEFDUElfR1BFX1JVTl9FTkFCTEVEKTsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlicmVhazsKLQl9Ci0KLQkvKgotCSAqIEV2ZW4gaWYgd2UgZG9uJ3Qga25vdyB0aGUgR1BFIHR5cGUsIG1ha2Ugc3VyZSB0aGF0IHdlIGFsd2F5cwotCSAqIGRpc2FibGUgaXQuIGxvd19kaXNhYmxlX2dwZSB3aWxsIGp1c3QgY2xlYXIgdGhlIGVuYWJsZSBiaXQgZm9yIHRoaXMKLQkgKiBHUEUgYW5kIHdyaXRlIGl0LiBJdCB3aWxsIG5vdCB3cml0ZSBvdXQgdGhlIGN1cnJlbnQgR1BFIGVuYWJsZSBtYXNrLAotCSAqIHNpbmNlIHRoaXMgbWF5IGluYWR2ZXJ0ZW50bHkgZW5hYmxlIEdQRXMgdG9vIGVhcmx5LCBpZiBhIHJvZ3VlIEdQRSBoYXMKLQkgKiBjb21lIGluIGR1cmluZyBBQ1BJQ0EgaW5pdGlhbGl6YXRpb24gLSBwb3NzaWJseSBhcyBhIHJlc3VsdCBvZiBBTUwgb3IKLQkgKiBvdGhlciBjb2RlIHRoYXQgaGFzIGVuYWJsZWQgdGhlIEdQRS4KLQkgKi8KLQlzdGF0dXMgPSBhY3BpX2h3X2xvd19kaXNhYmxlX2dwZShncGVfZXZlbnRfaW5mbyk7Ci0JcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfZXZfZ2V0X2dwZV9ldmVudF9pbmZvCi0gKgotICogUEFSQU1FVEVSUzogIGdwZV9kZXZpY2UgICAgICAgICAgLSBEZXZpY2Ugbm9kZS4gIE5VTEwgZm9yIEdQRTAvR1BFMQotICogICAgICAgICAgICAgIGdwZV9udW1iZXIgICAgICAgICAgLSBSYXcgR1BFIG51bWJlcgotICoKLSAqIFJFVFVSTjogICAgICBBIEdQRSBldmVudF9pbmZvIHN0cnVjdC4gTlVMTCBpZiBub3QgYSB2YWxpZCBHUEUKLSAqCi0gKiBERVNDUklQVElPTjogUmV0dXJucyB0aGUgZXZlbnRfaW5mbyBzdHJ1Y3QgYXNzb2NpYXRlZCB3aXRoIHRoaXMgR1BFLgotICogICAgICAgICAgICAgIFZhbGlkYXRlcyB0aGUgZ3BlX2Jsb2NrIGFuZCB0aGUgZ3BlX251bWJlcgotICoKLSAqICAgICAgICAgICAgICBTaG91bGQgYmUgY2FsbGVkIG9ubHkgd2hlbiB0aGUgR1BFIGxpc3RzIGFyZSBzZW1hcGhvcmUgbG9ja2VkCi0gKiAgICAgICAgICAgICAgYW5kIG5vdCBzdWJqZWN0IHRvIGNoYW5nZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdHJ1Y3QgYWNwaV9ncGVfZXZlbnRfaW5mbyAqYWNwaV9ldl9nZXRfZ3BlX2V2ZW50X2luZm8oYWNwaV9oYW5kbGUgZ3BlX2RldmljZSwKLQkJCQkJCSAgICAgICB1MzIgZ3BlX251bWJlcikKLXsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYzsKLQlzdHJ1Y3QgYWNwaV9ncGVfYmxvY2tfaW5mbyAqZ3BlX2Jsb2NrOwotCXUzMiBpOwotCi0JQUNQSV9GVU5DVElPTl9FTlRSWSgpOwotCi0JLyogQSBOVUxMIGdwZV9ibG9jayBtZWFucyB1c2UgdGhlIEZBRFQtZGVmaW5lZCBHUEUgYmxvY2socykgKi8KLQotCWlmICghZ3BlX2RldmljZSkgewotCi0JCS8qIEV4YW1pbmUgR1BFIEJsb2NrIDAgYW5kIDEgKFRoZXNlIGJsb2NrcyBhcmUgcGVybWFuZW50KSAqLwotCi0JCWZvciAoaSA9IDA7IGkgPCBBQ1BJX01BWF9HUEVfQkxPQ0tTOyBpKyspIHsKLQkJCWdwZV9ibG9jayA9IGFjcGlfZ2JsX2dwZV9mYWR0X2Jsb2Nrc1tpXTsKLQkJCWlmIChncGVfYmxvY2spIHsKLQkJCQlpZiAoKGdwZV9udW1iZXIgPj0gZ3BlX2Jsb2NrLT5ibG9ja19iYXNlX251bWJlcikKLQkJCQkgICAgJiYgKGdwZV9udW1iZXIgPAotCQkJCQlncGVfYmxvY2stPmJsb2NrX2Jhc2VfbnVtYmVyICsKLQkJCQkJKGdwZV9ibG9jay0+cmVnaXN0ZXJfY291bnQgKiA4KSkpIHsKLQkJCQkJcmV0dXJuICgmZ3BlX2Jsb2NrLT4KLQkJCQkJCWV2ZW50X2luZm9bZ3BlX251bWJlciAtCi0JCQkJCQkJICAgZ3BlX2Jsb2NrLT4KLQkJCQkJCQkgICBibG9ja19iYXNlX251bWJlcl0pOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8qIFRoZSBncGVfbnVtYmVyIHdhcyBub3QgaW4gdGhlIHJhbmdlIG9mIGVpdGhlciBGQURUIEdQRSBibG9jayAqLwotCi0JCXJldHVybiAoTlVMTCk7Ci0JfQotCi0JLyogQSBOb24tTlVMTCBncGVfZGV2aWNlIG1lYW5zIHRoaXMgaXMgYSBHUEUgQmxvY2sgRGV2aWNlICovCi0KLQlvYmpfZGVzYyA9IGFjcGlfbnNfZ2V0X2F0dGFjaGVkX29iamVjdCgoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKikKLQkJCQkJICAgICAgIGdwZV9kZXZpY2UpOwotCWlmICghb2JqX2Rlc2MgfHwgIW9ial9kZXNjLT5kZXZpY2UuZ3BlX2Jsb2NrKSB7Ci0JCXJldHVybiAoTlVMTCk7Ci0JfQotCi0JZ3BlX2Jsb2NrID0gb2JqX2Rlc2MtPmRldmljZS5ncGVfYmxvY2s7Ci0KLQlpZiAoKGdwZV9udW1iZXIgPj0gZ3BlX2Jsb2NrLT5ibG9ja19iYXNlX251bWJlcikgJiYKLQkgICAgKGdwZV9udW1iZXIgPAotCSAgICAgZ3BlX2Jsb2NrLT5ibG9ja19iYXNlX251bWJlciArIChncGVfYmxvY2stPnJlZ2lzdGVyX2NvdW50ICogOCkpKSB7Ci0JCXJldHVybiAoJmdwZV9ibG9jay0+Ci0JCQlldmVudF9pbmZvW2dwZV9udW1iZXIgLSBncGVfYmxvY2stPmJsb2NrX2Jhc2VfbnVtYmVyXSk7Ci0JfQotCi0JcmV0dXJuIChOVUxMKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9ldl9ncGVfZGV0ZWN0Ci0gKgotICogUEFSQU1FVEVSUzogIGdwZV94cnVwdF9saXN0ICAgICAgLSBJbnRlcnJ1cHQgYmxvY2sgZm9yIHRoaXMgaW50ZXJydXB0LgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYW4gaGF2ZSBtdWx0aXBsZSBHUEUgYmxvY2tzIGF0dGFjaGVkLgotICoKLSAqIFJFVFVSTjogICAgICBJTlRFUlJVUFRfSEFORExFRCBvciBJTlRFUlJVUFRfTk9UX0hBTkRMRUQKLSAqCi0gKiBERVNDUklQVElPTjogRGV0ZWN0IGlmIGFueSBHUCBldmVudHMgaGF2ZSBvY2N1cnJlZC4gIFRoaXMgZnVuY3Rpb24gaXMKLSAqICAgICAgICAgICAgICBleGVjdXRlZCBhdCBpbnRlcnJ1cHQgbGV2ZWwuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdTMyIGFjcGlfZXZfZ3BlX2RldGVjdChzdHJ1Y3QgYWNwaV9ncGVfeHJ1cHRfaW5mbyAqIGdwZV94cnVwdF9saXN0KQotewotCWFjcGlfc3RhdHVzIHN0YXR1czsKLQlzdHJ1Y3QgYWNwaV9ncGVfYmxvY2tfaW5mbyAqZ3BlX2Jsb2NrOwotCXN0cnVjdCBhY3BpX2dwZV9yZWdpc3Rlcl9pbmZvICpncGVfcmVnaXN0ZXJfaW5mbzsKLQl1MzIgaW50X3N0YXR1cyA9IEFDUElfSU5URVJSVVBUX05PVF9IQU5ETEVEOwotCXU4IGVuYWJsZWRfc3RhdHVzX2J5dGU7Ci0JdTMyIHN0YXR1c19yZWc7Ci0JdTMyIGVuYWJsZV9yZWc7Ci0JYWNwaV9jcHVfZmxhZ3MgZmxhZ3M7Ci0JdTMyIGk7Ci0JdTMyIGo7Ci0KLQlBQ1BJX0ZVTkNUSU9OX05BTUUoZXZfZ3BlX2RldGVjdCk7Ci0KLQkvKiBDaGVjayBmb3IgdGhlIGNhc2Ugd2hlcmUgdGhlcmUgYXJlIG5vIEdQRXMgKi8KLQotCWlmICghZ3BlX3hydXB0X2xpc3QpIHsKLQkJcmV0dXJuIChpbnRfc3RhdHVzKTsKLQl9Ci0KLQkvKgotCSAqIFdlIG5lZWQgdG8gb2J0YWluIHRoZSBHUEUgbG9jayBmb3IgYm90aCB0aGUgZGF0YSBzdHJ1Y3RzIGFuZCByZWdpc3RlcnMKLQkgKiBOb3RlOiBOb3QgbmVjZXNzYXJ5IHRvIG9idGFpbiB0aGUgaGFyZHdhcmUgbG9jaywgc2luY2UgdGhlIEdQRSByZWdpc3RlcnMKLQkgKiBhcmUgb3duZWQgYnkgdGhlIGdwZV9sb2NrLgotCSAqLwotCWZsYWdzID0gYWNwaV9vc19hY3F1aXJlX2xvY2soYWNwaV9nYmxfZ3BlX2xvY2spOwotCi0JLyogRXhhbWluZSBhbGwgR1BFIGJsb2NrcyBhdHRhY2hlZCB0byB0aGlzIGludGVycnVwdCBsZXZlbCAqLwotCi0JZ3BlX2Jsb2NrID0gZ3BlX3hydXB0X2xpc3QtPmdwZV9ibG9ja19saXN0X2hlYWQ7Ci0Jd2hpbGUgKGdwZV9ibG9jaykgewotCQkvKgotCQkgKiBSZWFkIGFsbCBvZiB0aGUgOC1iaXQgR1BFIHN0YXR1cyBhbmQgZW5hYmxlIHJlZ2lzdGVycwotCQkgKiBpbiB0aGlzIEdQRSBibG9jaywgc2F2aW5nIGFsbCBvZiB0aGVtLgotCQkgKiBGaW5kIGFsbCBjdXJyZW50bHkgYWN0aXZlIEdQIGV2ZW50cy4KLQkJICovCi0JCWZvciAoaSA9IDA7IGkgPCBncGVfYmxvY2stPnJlZ2lzdGVyX2NvdW50OyBpKyspIHsKLQotCQkJLyogR2V0IHRoZSBuZXh0IHN0YXR1cy9lbmFibGUgcGFpciAqLwotCi0JCQlncGVfcmVnaXN0ZXJfaW5mbyA9ICZncGVfYmxvY2stPnJlZ2lzdGVyX2luZm9baV07Ci0KLQkJCS8qIFJlYWQgdGhlIFN0YXR1cyBSZWdpc3RlciAqLwotCi0JCQlzdGF0dXMgPQotCQkJICAgIGFjcGlfaHdfbG93X2xldmVsX3JlYWQoQUNQSV9HUEVfUkVHSVNURVJfV0lEVEgsCi0JCQkJCQkgICAmc3RhdHVzX3JlZywKLQkJCQkJCSAgICZncGVfcmVnaXN0ZXJfaW5mby0+Ci0JCQkJCQkgICBzdGF0dXNfYWRkcmVzcyk7Ci0JCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJCQlnb3RvIHVubG9ja19hbmRfZXhpdDsKLQkJCX0KLQotCQkJLyogUmVhZCB0aGUgRW5hYmxlIFJlZ2lzdGVyICovCi0KLQkJCXN0YXR1cyA9Ci0JCQkgICAgYWNwaV9od19sb3dfbGV2ZWxfcmVhZChBQ1BJX0dQRV9SRUdJU1RFUl9XSURUSCwKLQkJCQkJCSAgICZlbmFibGVfcmVnLAotCQkJCQkJICAgJmdwZV9yZWdpc3Rlcl9pbmZvLT4KLQkJCQkJCSAgIGVuYWJsZV9hZGRyZXNzKTsKLQkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQkJCWdvdG8gdW5sb2NrX2FuZF9leGl0OwotCQkJfQotCi0JCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lOVEVSUlVQVFMsCi0JCQkJCSAgIlJlYWQgR1BFIFJlZ2lzdGVyIGF0IEdQRSVYOiBTdGF0dXM9JTAyWCwgRW5hYmxlPSUwMlhcbiIsCi0JCQkJCSAgZ3BlX3JlZ2lzdGVyX2luZm8tPmJhc2VfZ3BlX251bWJlciwKLQkJCQkJICBzdGF0dXNfcmVnLCBlbmFibGVfcmVnKSk7Ci0KLQkJCS8qIENoZWNrIGlmIHRoZXJlIGlzIGFueXRoaW5nIGFjdGl2ZSBhdCBhbGwgaW4gdGhpcyByZWdpc3RlciAqLwotCi0JCQllbmFibGVkX3N0YXR1c19ieXRlID0gKHU4KSAoc3RhdHVzX3JlZyAmIGVuYWJsZV9yZWcpOwotCQkJaWYgKCFlbmFibGVkX3N0YXR1c19ieXRlKSB7Ci0KLQkJCQkvKiBObyBhY3RpdmUgR1BFcyBpbiB0aGlzIHJlZ2lzdGVyLCBtb3ZlIG9uICovCi0KLQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJLyogTm93IGxvb2sgYXQgdGhlIGluZGl2aWR1YWwgR1BFcyBpbiB0aGlzIGJ5dGUgcmVnaXN0ZXIgKi8KLQotCQkJZm9yIChqID0gMDsgaiA8IEFDUElfR1BFX1JFR0lTVEVSX1dJRFRIOyBqKyspIHsKLQotCQkJCS8qIEV4YW1pbmUgb25lIEdQRSBiaXQgKi8KLQotCQkJCWlmIChlbmFibGVkX3N0YXR1c19ieXRlICYgKDEgPDwgaikpIHsKLQkJCQkJLyoKLQkJCQkJICogRm91bmQgYW4gYWN0aXZlIEdQRS4gRGlzcGF0Y2ggdGhlIGV2ZW50IHRvIGEgaGFuZGxlcgotCQkJCQkgKiBvciBtZXRob2QuCi0JCQkJCSAqLwotCQkJCQlpbnRfc3RhdHVzIHw9Ci0JCQkJCSAgICBhY3BpX2V2X2dwZV9kaXNwYXRjaCgmZ3BlX2Jsb2NrLT4KLQkJCQkJCWV2ZW50X2luZm9bKChhY3BpX3NpemUpIGkgKiBBQ1BJX0dQRV9SRUdJU1RFUl9XSURUSCkgKyBqXSwgaiArIGdwZV9yZWdpc3Rlcl9pbmZvLT5iYXNlX2dwZV9udW1iZXIpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWdwZV9ibG9jayA9IGdwZV9ibG9jay0+bmV4dDsKLQl9Ci0KLSAgICAgIHVubG9ja19hbmRfZXhpdDoKLQotCWFjcGlfb3NfcmVsZWFzZV9sb2NrKGFjcGlfZ2JsX2dwZV9sb2NrLCBmbGFncyk7Ci0JcmV0dXJuIChpbnRfc3RhdHVzKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9ldl9hc3luY2hfZXhlY3V0ZV9ncGVfbWV0aG9kCi0gKgotICogUEFSQU1FVEVSUzogIENvbnRleHQgKGdwZV9ldmVudF9pbmZvKSAtIEluZm8gZm9yIHRoaXMgR1BFCi0gKgotICogUkVUVVJOOiAgICAgIE5vbmUKLSAqCi0gKiBERVNDUklQVElPTjogUGVyZm9ybSB0aGUgYWN0dWFsIGV4ZWN1dGlvbiBvZiBhIEdQRSBjb250cm9sIG1ldGhvZC4gVGhpcwotICogICAgICAgICAgICAgIGZ1bmN0aW9uIGlzIGNhbGxlZCBmcm9tIGFuIGludm9jYXRpb24gb2YgYWNwaV9vc19leGVjdXRlIGFuZAotICogICAgICAgICAgICAgIHRoZXJlZm9yZSBkb2VzIE5PVCBleGVjdXRlIGF0IGludGVycnVwdCBsZXZlbCAtIHNvIHRoYXQKLSAqICAgICAgICAgICAgICB0aGUgY29udHJvbCBtZXRob2QgaXRzZWxmIGlzIG5vdCBleGVjdXRlZCBpbiB0aGUgY29udGV4dCBvZgotICogICAgICAgICAgICAgIGFuIGludGVycnVwdCBoYW5kbGVyLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBhY3BpX2V2X2FzeW5jaF9lbmFibGVfZ3BlKHZvaWQgKmNvbnRleHQpOwotCi1zdGF0aWMgdm9pZCBBQ1BJX1NZU1RFTV9YRkFDRSBhY3BpX2V2X2FzeW5jaF9leGVjdXRlX2dwZV9tZXRob2Qodm9pZCAqY29udGV4dCkKLXsKLQlzdHJ1Y3QgYWNwaV9ncGVfZXZlbnRfaW5mbyAqZ3BlX2V2ZW50X2luZm8gPSAodm9pZCAqKWNvbnRleHQ7Ci0JYWNwaV9zdGF0dXMgc3RhdHVzOwotCXN0cnVjdCBhY3BpX2dwZV9ldmVudF9pbmZvIGxvY2FsX2dwZV9ldmVudF9pbmZvOwotCXN0cnVjdCBhY3BpX2V2YWx1YXRlX2luZm8gKmluZm87Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGV2X2FzeW5jaF9leGVjdXRlX2dwZV9tZXRob2QpOwotCi0Jc3RhdHVzID0gYWNwaV91dF9hY3F1aXJlX211dGV4KEFDUElfTVRYX0VWRU5UUyk7Ci0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCXJldHVybl9WT0lEOwotCX0KLQotCS8qIE11c3QgcmV2YWxpZGF0ZSB0aGUgZ3BlX251bWJlci9ncGVfYmxvY2sgKi8KLQotCWlmICghYWNwaV9ldl92YWxpZF9ncGVfZXZlbnQoZ3BlX2V2ZW50X2luZm8pKSB7Ci0JCXN0YXR1cyA9IGFjcGlfdXRfcmVsZWFzZV9tdXRleChBQ1BJX01UWF9FVkVOVFMpOwotCQlyZXR1cm5fVk9JRDsKLQl9Ci0KLQkvKiBTZXQgdGhlIEdQRSBmbGFncyBmb3IgcmV0dXJuIHRvIGVuYWJsZWQgc3RhdGUgKi8KLQotCSh2b2lkKWFjcGlfZXZfZW5hYmxlX2dwZShncGVfZXZlbnRfaW5mbywgRkFMU0UpOwotCi0JLyoKLQkgKiBUYWtlIGEgc25hcHNob3Qgb2YgdGhlIEdQRSBpbmZvIGZvciB0aGlzIGxldmVsIC0gd2UgY29weSB0aGUKLQkgKiBpbmZvIHRvIHByZXZlbnQgYSByYWNlIGNvbmRpdGlvbiB3aXRoIHJlbW92ZV9oYW5kbGVyL3JlbW92ZV9ibG9jay4KLQkgKi8KLQlBQ1BJX01FTUNQWSgmbG9jYWxfZ3BlX2V2ZW50X2luZm8sIGdwZV9ldmVudF9pbmZvLAotCQkgICAgc2l6ZW9mKHN0cnVjdCBhY3BpX2dwZV9ldmVudF9pbmZvKSk7Ci0KLQlzdGF0dXMgPSBhY3BpX3V0X3JlbGVhc2VfbXV0ZXgoQUNQSV9NVFhfRVZFTlRTKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJcmV0dXJuX1ZPSUQ7Ci0JfQotCi0JLyoKLQkgKiBNdXN0IGNoZWNrIGZvciBjb250cm9sIG1ldGhvZCB0eXBlIGRpc3BhdGNoIG9uZSBtb3JlCi0JICogdGltZSB0byBhdm9pZCByYWNlIHdpdGggZXZfZ3BlX2luc3RhbGxfaGFuZGxlcgotCSAqLwotCWlmICgobG9jYWxfZ3BlX2V2ZW50X2luZm8uZmxhZ3MgJiBBQ1BJX0dQRV9ESVNQQVRDSF9NQVNLKSA9PQotCSAgICBBQ1BJX0dQRV9ESVNQQVRDSF9NRVRIT0QpIHsKLQotCQkvKiBBbGxvY2F0ZSB0aGUgZXZhbHVhdGlvbiBpbmZvcm1hdGlvbiBibG9jayAqLwotCi0JCWluZm8gPSBBQ1BJX0FMTE9DQVRFX1pFUk9FRChzaXplb2Yoc3RydWN0IGFjcGlfZXZhbHVhdGVfaW5mbykpOwotCQlpZiAoIWluZm8pIHsKLQkJCXN0YXR1cyA9IEFFX05PX01FTU9SWTsKLQkJfSBlbHNlIHsKLQkJCS8qCi0JCQkgKiBJbnZva2UgdGhlIEdQRSBNZXRob2QgKF9MeHgsIF9FeHgpIGkuZS4sIGV2YWx1YXRlIHRoZSBfTHh4L19FeHgKLQkJCSAqIGNvbnRyb2wgbWV0aG9kIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhpcyBHUEUKLQkJCSAqLwotCQkJaW5mby0+cHJlZml4X25vZGUgPQotCQkJICAgIGxvY2FsX2dwZV9ldmVudF9pbmZvLmRpc3BhdGNoLm1ldGhvZF9ub2RlOwotCQkJaW5mby0+ZmxhZ3MgPSBBQ1BJX0lHTk9SRV9SRVRVUk5fVkFMVUU7Ci0KLQkJCXN0YXR1cyA9IGFjcGlfbnNfZXZhbHVhdGUoaW5mbyk7Ci0JCQlBQ1BJX0ZSRUUoaW5mbyk7Ci0JCX0KLQotCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJCUFDUElfRVhDRVBUSU9OKChBRV9JTkZPLCBzdGF0dXMsCi0JCQkJCSJ3aGlsZSBldmFsdWF0aW5nIEdQRSBtZXRob2QgWyU0LjRzXSIsCi0JCQkJCWFjcGlfdXRfZ2V0X25vZGVfbmFtZQotCQkJCQkobG9jYWxfZ3BlX2V2ZW50X2luZm8uZGlzcGF0Y2guCi0JCQkJCSBtZXRob2Rfbm9kZSkpKTsKLQkJfQotCX0KLQkvKiBEZWZlciBlbmFibGluZyBvZiBHUEUgdW50aWwgYWxsIG5vdGlmeSBoYW5kbGVycyBhcmUgZG9uZSAqLwotCWFjcGlfb3NfZXhlY3V0ZShPU0xfTk9USUZZX0hBTkRMRVIsIGFjcGlfZXZfYXN5bmNoX2VuYWJsZV9ncGUsCi0JCQkJZ3BlX2V2ZW50X2luZm8pOwotCXJldHVybl9WT0lEOwotfQotCi1zdGF0aWMgdm9pZCBhY3BpX2V2X2FzeW5jaF9lbmFibGVfZ3BlKHZvaWQgKmNvbnRleHQpCi17Ci0Jc3RydWN0IGFjcGlfZ3BlX2V2ZW50X2luZm8gKmdwZV9ldmVudF9pbmZvID0gY29udGV4dDsKLQlhY3BpX3N0YXR1cyBzdGF0dXM7Ci0JaWYgKChncGVfZXZlbnRfaW5mby0+ZmxhZ3MgJiBBQ1BJX0dQRV9YUlVQVF9UWVBFX01BU0spID09Ci0JICAgIEFDUElfR1BFX0xFVkVMX1RSSUdHRVJFRCkgewotCQkvKgotCQkgKiBHUEUgaXMgbGV2ZWwtdHJpZ2dlcmVkLCB3ZSBjbGVhciB0aGUgR1BFIHN0YXR1cyBiaXQgYWZ0ZXIKLQkJICogaGFuZGxpbmcgdGhlIGV2ZW50LgotCQkgKi8KLQkJc3RhdHVzID0gYWNwaV9od19jbGVhcl9ncGUoZ3BlX2V2ZW50X2luZm8pOwotCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJCXJldHVybl9WT0lEOwotCQl9Ci0JfQotCi0JLyogRW5hYmxlIHRoaXMgR1BFICovCi0JKHZvaWQpYWNwaV9od193cml0ZV9ncGVfZW5hYmxlX3JlZyhncGVfZXZlbnRfaW5mbyk7Ci0JcmV0dXJuX1ZPSUQ7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfZXZfZ3BlX2Rpc3BhdGNoCi0gKgotICogUEFSQU1FVEVSUzogIGdwZV9ldmVudF9pbmZvICAtIEluZm8gZm9yIHRoaXMgR1BFCi0gKiAgICAgICAgICAgICAgZ3BlX251bWJlciAgICAgIC0gTnVtYmVyIHJlbGF0aXZlIHRvIHRoZSBwYXJlbnQgR1BFIGJsb2NrCi0gKgotICogUkVUVVJOOiAgICAgIElOVEVSUlVQVF9IQU5ETEVEIG9yIElOVEVSUlVQVF9OT1RfSEFORExFRAotICoKLSAqIERFU0NSSVBUSU9OOiBEaXNwYXRjaCBhIEdlbmVyYWwgUHVycG9zZSBFdmVudCB0byBlaXRoZXIgYSBmdW5jdGlvbiAoZS5nLiBFQykKLSAqICAgICAgICAgICAgICBvciBtZXRob2QgKGUuZy4gX0x4eC9fRXh4KSBoYW5kbGVyLgotICoKLSAqICAgICAgICAgICAgICBUaGlzIGZ1bmN0aW9uIGV4ZWN1dGVzIGF0IGludGVycnVwdCBsZXZlbC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi11MzIKLWFjcGlfZXZfZ3BlX2Rpc3BhdGNoKHN0cnVjdCBhY3BpX2dwZV9ldmVudF9pbmZvICpncGVfZXZlbnRfaW5mbywgdTMyIGdwZV9udW1iZXIpCi17Ci0JYWNwaV9zdGF0dXMgc3RhdHVzOwotCi0JQUNQSV9GVU5DVElPTl9UUkFDRShldl9ncGVfZGlzcGF0Y2gpOwotCi0JYWNwaV9vc19ncGVfY291bnQoZ3BlX251bWJlcik7Ci0KLQkvKgotCSAqIElmIGVkZ2UtdHJpZ2dlcmVkLCBjbGVhciB0aGUgR1BFIHN0YXR1cyBiaXQgbm93LiAgTm90ZSB0aGF0Ci0JICogbGV2ZWwtdHJpZ2dlcmVkIGV2ZW50cyBhcmUgY2xlYXJlZCBhZnRlciB0aGUgR1BFIGlzIHNlcnZpY2VkLgotCSAqLwotCWlmICgoZ3BlX2V2ZW50X2luZm8tPmZsYWdzICYgQUNQSV9HUEVfWFJVUFRfVFlQRV9NQVNLKSA9PQotCSAgICBBQ1BJX0dQRV9FREdFX1RSSUdHRVJFRCkgewotCQlzdGF0dXMgPSBhY3BpX2h3X2NsZWFyX2dwZShncGVfZXZlbnRfaW5mbyk7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQkJQUNQSV9FWENFUFRJT04oKEFFX0lORk8sIHN0YXR1cywKLQkJCQkJIlVuYWJsZSB0byBjbGVhciBHUEVbJTJYXSIsCi0JCQkJCWdwZV9udW1iZXIpKTsKLQkJCXJldHVybl9VSU5UMzIoQUNQSV9JTlRFUlJVUFRfTk9UX0hBTkRMRUQpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBEaXNwYXRjaCB0aGUgR1BFIHRvIGVpdGhlciBhbiBpbnN0YWxsZWQgaGFuZGxlciwgb3IgdGhlIGNvbnRyb2wgbWV0aG9kCi0JICogYXNzb2NpYXRlZCB3aXRoIHRoaXMgR1BFIChfTHh4IG9yIF9FeHgpLiBJZiBhIGhhbmRsZXIgZXhpc3RzLCB3ZSBpbnZva2UKLQkgKiBpdCBhbmQgZG8gbm90IGF0dGVtcHQgdG8gcnVuIHRoZSBtZXRob2QuIElmIHRoZXJlIGlzIG5laXRoZXIgYSBoYW5kbGVyCi0JICogbm9yIGEgbWV0aG9kLCB3ZSBkaXNhYmxlIHRoaXMgR1BFIHRvIHByZXZlbnQgZnVydGhlciBzdWNoIHBvaW50bGVzcwotCSAqIGV2ZW50cyBmcm9tIGZpcmluZy4KLQkgKi8KLQlzd2l0Y2ggKGdwZV9ldmVudF9pbmZvLT5mbGFncyAmIEFDUElfR1BFX0RJU1BBVENIX01BU0spIHsKLQljYXNlIEFDUElfR1BFX0RJU1BBVENIX0hBTkRMRVI6Ci0KLQkJLyoKLQkJICogSW52b2tlIHRoZSBpbnN0YWxsZWQgaGFuZGxlciAoYXQgaW50ZXJydXB0IGxldmVsKQotCQkgKiBJZ25vcmUgcmV0dXJuIHN0YXR1cyBmb3Igbm93LiAgVEJEOiBsZWF2ZSBHUEUgZGlzYWJsZWQgb24gZXJyb3I/Ci0JCSAqLwotCQkodm9pZClncGVfZXZlbnRfaW5mby0+ZGlzcGF0Y2guaGFuZGxlci0+YWRkcmVzcyhncGVfZXZlbnRfaW5mby0+Ci0JCQkJCQkJCWRpc3BhdGNoLgotCQkJCQkJCQloYW5kbGVyLT4KLQkJCQkJCQkJY29udGV4dCk7Ci0KLQkJLyogSXQgaXMgbm93IHNhZmUgdG8gY2xlYXIgbGV2ZWwtdHJpZ2dlcmVkIGV2ZW50cy4gKi8KLQotCQlpZiAoKGdwZV9ldmVudF9pbmZvLT5mbGFncyAmIEFDUElfR1BFX1hSVVBUX1RZUEVfTUFTSykgPT0KLQkJICAgIEFDUElfR1BFX0xFVkVMX1RSSUdHRVJFRCkgewotCQkJc3RhdHVzID0gYWNwaV9od19jbGVhcl9ncGUoZ3BlX2V2ZW50X2luZm8pOwotCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCQkJQUNQSV9FWENFUFRJT04oKEFFX0lORk8sIHN0YXR1cywKLQkJCQkJCSJVbmFibGUgdG8gY2xlYXIgR1BFWyUyWF0iLAotCQkJCQkJZ3BlX251bWJlcikpOwotCQkJCXJldHVybl9VSU5UMzIoQUNQSV9JTlRFUlJVUFRfTk9UX0hBTkRMRUQpOwotCQkJfQotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBBQ1BJX0dQRV9ESVNQQVRDSF9NRVRIT0Q6Ci0KLQkJLyoKLQkJICogRGlzYWJsZSB0aGUgR1BFLCBzbyBpdCBkb2Vzbid0IGtlZXAgZmlyaW5nIGJlZm9yZSB0aGUgbWV0aG9kIGhhcyBhCi0JCSAqIGNoYW5jZSB0byBydW4gKGl0IHJ1bnMgYXN5bmNocm9ub3VzbHkgd2l0aCBpbnRlcnJ1cHRzIGVuYWJsZWQpLgotCQkgKi8KLQkJc3RhdHVzID0gYWNwaV9ldl9kaXNhYmxlX2dwZShncGVfZXZlbnRfaW5mbyk7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQkJQUNQSV9FWENFUFRJT04oKEFFX0lORk8sIHN0YXR1cywKLQkJCQkJIlVuYWJsZSB0byBkaXNhYmxlIEdQRVslMlhdIiwKLQkJCQkJZ3BlX251bWJlcikpOwotCQkJcmV0dXJuX1VJTlQzMihBQ1BJX0lOVEVSUlVQVF9OT1RfSEFORExFRCk7Ci0JCX0KLQotCQkvKgotCQkgKiBFeGVjdXRlIHRoZSBtZXRob2QgYXNzb2NpYXRlZCB3aXRoIHRoZSBHUEUKLQkJICogTk9URTogTGV2ZWwtdHJpZ2dlcmVkIEdQRXMgYXJlIGNsZWFyZWQgYWZ0ZXIgdGhlIG1ldGhvZCBjb21wbGV0ZXMuCi0JCSAqLwotCQlzdGF0dXMgPSBhY3BpX29zX2V4ZWN1dGUoT1NMX0dQRV9IQU5ETEVSLAotCQkJCQkgYWNwaV9ldl9hc3luY2hfZXhlY3V0ZV9ncGVfbWV0aG9kLAotCQkJCQkgZ3BlX2V2ZW50X2luZm8pOwotCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJCUFDUElfRVhDRVBUSU9OKChBRV9JTkZPLCBzdGF0dXMsCi0JCQkJCSJVbmFibGUgdG8gcXVldWUgaGFuZGxlciBmb3IgR1BFWyUyWF0gLSBldmVudCBkaXNhYmxlZCIsCi0JCQkJCWdwZV9udW1iZXIpKTsKLQkJfQotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0KLQkJLyogTm8gaGFuZGxlciBvciBtZXRob2QgdG8gcnVuISAqLwotCi0JCUFDUElfRVJST1IoKEFFX0lORk8sCi0JCQkgICAgIk5vIGhhbmRsZXIgb3IgbWV0aG9kIGZvciBHUEVbJTJYXSwgZGlzYWJsaW5nIGV2ZW50IiwKLQkJCSAgICBncGVfbnVtYmVyKSk7Ci0KLQkJLyoKLQkJICogRGlzYWJsZSB0aGUgR1BFLiBUaGUgR1BFIHdpbGwgcmVtYWluIGRpc2FibGVkIHVudGlsIHRoZSBBQ1BJCi0JCSAqIENvcmUgU3Vic3lzdGVtIGlzIHJlc3RhcnRlZCwgb3IgYSBoYW5kbGVyIGlzIGluc3RhbGxlZC4KLQkJICovCi0JCXN0YXR1cyA9IGFjcGlfZXZfZGlzYWJsZV9ncGUoZ3BlX2V2ZW50X2luZm8pOwotCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJCUFDUElfRVhDRVBUSU9OKChBRV9JTkZPLCBzdGF0dXMsCi0JCQkJCSJVbmFibGUgdG8gZGlzYWJsZSBHUEVbJTJYXSIsCi0JCQkJCWdwZV9udW1iZXIpKTsKLQkJCXJldHVybl9VSU5UMzIoQUNQSV9JTlRFUlJVUFRfTk9UX0hBTkRMRUQpOwotCQl9Ci0JCWJyZWFrOwotCX0KLQotCXJldHVybl9VSU5UMzIoQUNQSV9JTlRFUlJVUFRfSEFORExFRCk7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZXZlbnRzL2V2Z3BlYmxrLmMgYi9kcml2ZXJzL2FjcGkvZXZlbnRzL2V2Z3BlYmxrLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczYzA1OGUuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9hY3BpL2V2ZW50cy9ldmdwZWJsay5jCisrKyAvZGV2L251bGwKQEAgLTEsMTIxNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogTW9kdWxlIE5hbWU6IGV2Z3BlYmxrIC0gR1BFIGJsb2NrIGNyZWF0aW9uIGFuZCBpbml0aWFsaXphdGlvbi4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA4LCBJbnRlbCBDb3JwLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAotICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgYXQgbWluaW11bSBhIGRpc2NsYWltZXIKLSAqICAgIHN1YnN0YW50aWFsbHkgc2ltaWxhciB0byB0aGUgIk5PIFdBUlJBTlRZIiBkaXNjbGFpbWVyIGJlbG93Ci0gKiAgICAoIkRpc2NsYWltZXIiKSBhbmQgYW55IHJlZGlzdHJpYnV0aW9uIG11c3QgYmUgY29uZGl0aW9uZWQgdXBvbgotICogICAgaW5jbHVkaW5nIGEgc3Vic3RhbnRpYWxseSBzaW1pbGFyIERpc2NsYWltZXIgcmVxdWlyZW1lbnQgZm9yIGZ1cnRoZXIKLSAqICAgIGJpbmFyeSByZWRpc3RyaWJ1dGlvbi4KLSAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcwotICogICAgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICogU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBOTyBXQVJSQU5UWQotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCi0gKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUwotICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcKLSAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQotICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgotICovCi0KLSNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KLSNpbmNsdWRlIDxhY3BpL2FjZXZlbnRzLmg+Ci0jaW5jbHVkZSA8YWNwaS9hY25hbWVzcC5oPgotCi0jZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9FVkVOVFMKLUFDUElfTU9EVUxFX05BTUUoImV2Z3BlYmxrIikKLQotLyogTG9jYWwgcHJvdG90eXBlcyAqLwotc3RhdGljIGFjcGlfc3RhdHVzCi1hY3BpX2V2X3NhdmVfbWV0aG9kX2luZm8oYWNwaV9oYW5kbGUgb2JqX2hhbmRsZSwKLQkJCSB1MzIgbGV2ZWwsIHZvaWQgKm9ial9kZXNjLCB2b2lkICoqcmV0dXJuX3ZhbHVlKTsKLQotc3RhdGljIGFjcGlfc3RhdHVzCi1hY3BpX2V2X21hdGNoX3Byd19hbmRfZ3BlKGFjcGlfaGFuZGxlIG9ial9oYW5kbGUsCi0JCQkgIHUzMiBsZXZlbCwgdm9pZCAqaW5mbywgdm9pZCAqKnJldHVybl92YWx1ZSk7Ci0KLXN0YXRpYyBzdHJ1Y3QgYWNwaV9ncGVfeHJ1cHRfaW5mbyAqYWNwaV9ldl9nZXRfZ3BlX3hydXB0X2Jsb2NrKHUzMgotCQkJCQkJCSAgICAgICBpbnRlcnJ1cHRfbnVtYmVyKTsKLQotc3RhdGljIGFjcGlfc3RhdHVzCi1hY3BpX2V2X2RlbGV0ZV9ncGVfeHJ1cHQoc3RydWN0IGFjcGlfZ3BlX3hydXB0X2luZm8gKmdwZV94cnVwdCk7Ci0KLXN0YXRpYyBhY3BpX3N0YXR1cwotYWNwaV9ldl9pbnN0YWxsX2dwZV9ibG9jayhzdHJ1Y3QgYWNwaV9ncGVfYmxvY2tfaW5mbyAqZ3BlX2Jsb2NrLAotCQkJICB1MzIgaW50ZXJydXB0X251bWJlcik7Ci0KLXN0YXRpYyBhY3BpX3N0YXR1cwotYWNwaV9ldl9jcmVhdGVfZ3BlX2luZm9fYmxvY2tzKHN0cnVjdCBhY3BpX2dwZV9ibG9ja19pbmZvICpncGVfYmxvY2spOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX2V2X3ZhbGlkX2dwZV9ldmVudAotICoKLSAqIFBBUkFNRVRFUlM6ICBncGVfZXZlbnRfaW5mbyAgICAgICAgICAgICAgLSBJbmZvIGZvciB0aGlzIEdQRQotICoKLSAqIFJFVFVSTjogICAgICBUUlVFIGlmIHRoZSBncGVfZXZlbnQgaXMgdmFsaWQKLSAqCi0gKiBERVNDUklQVElPTjogVmFsaWRhdGUgYSBHUEUgZXZlbnQuIERPIE5PVCBDQUxMIEZST00gSU5URVJSVVBUIExFVkVMLgotICogICAgICAgICAgICAgIFNob3VsZCBiZSBjYWxsZWQgb25seSB3aGVuIHRoZSBHUEUgbGlzdHMgYXJlIHNlbWFwaG9yZSBsb2NrZWQKLSAqICAgICAgICAgICAgICBhbmQgbm90IHN1YmplY3QgdG8gY2hhbmdlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXU4IGFjcGlfZXZfdmFsaWRfZ3BlX2V2ZW50KHN0cnVjdCBhY3BpX2dwZV9ldmVudF9pbmZvICpncGVfZXZlbnRfaW5mbykKLXsKLQlzdHJ1Y3QgYWNwaV9ncGVfeHJ1cHRfaW5mbyAqZ3BlX3hydXB0X2Jsb2NrOwotCXN0cnVjdCBhY3BpX2dwZV9ibG9ja19pbmZvICpncGVfYmxvY2s7Ci0KLQlBQ1BJX0ZVTkNUSU9OX0VOVFJZKCk7Ci0KLQkvKiBObyBuZWVkIGZvciBzcGluIGxvY2sgc2luY2Ugd2UgYXJlIG5vdCBjaGFuZ2luZyBhbnkgbGlzdCBlbGVtZW50cyAqLwotCi0JLyogV2FsayB0aGUgR1BFIGludGVycnVwdCBsZXZlbHMgKi8KLQotCWdwZV94cnVwdF9ibG9jayA9IGFjcGlfZ2JsX2dwZV94cnVwdF9saXN0X2hlYWQ7Ci0Jd2hpbGUgKGdwZV94cnVwdF9ibG9jaykgewotCQlncGVfYmxvY2sgPSBncGVfeHJ1cHRfYmxvY2stPmdwZV9ibG9ja19saXN0X2hlYWQ7Ci0KLQkJLyogV2FsayB0aGUgR1BFIGJsb2NrcyBvbiB0aGlzIGludGVycnVwdCBsZXZlbCAqLwotCi0JCXdoaWxlIChncGVfYmxvY2spIHsKLQkJCWlmICgoJmdwZV9ibG9jay0+ZXZlbnRfaW5mb1swXSA8PSBncGVfZXZlbnRfaW5mbykgJiYKLQkJCSAgICAoJmdwZV9ibG9jay0+Ci0JCQkgICAgIGV2ZW50X2luZm9bKChhY3BpX3NpemUpIGdwZV9ibG9jay0+Ci0JCQkJCSByZWdpc3Rlcl9jb3VudCkgKiA4XSA+Ci0JCQkgICAgIGdwZV9ldmVudF9pbmZvKSkgewotCQkJCXJldHVybiAoVFJVRSk7Ci0JCQl9Ci0KLQkJCWdwZV9ibG9jayA9IGdwZV9ibG9jay0+bmV4dDsKLQkJfQotCi0JCWdwZV94cnVwdF9ibG9jayA9IGdwZV94cnVwdF9ibG9jay0+bmV4dDsKLQl9Ci0KLQlyZXR1cm4gKEZBTFNFKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9ldl93YWxrX2dwZV9saXN0Ci0gKgotICogUEFSQU1FVEVSUzogIGdwZV93YWxrX2NhbGxiYWNrICAgLSBSb3V0aW5lIGNhbGxlZCBmb3IgZWFjaCBHUEUgYmxvY2sKLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IFdhbGsgdGhlIEdQRSBsaXN0cy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1hY3BpX3N0YXR1cyBhY3BpX2V2X3dhbGtfZ3BlX2xpc3QoYWNwaV9ncGVfY2FsbGJhY2sgZ3BlX3dhbGtfY2FsbGJhY2spCi17Ci0Jc3RydWN0IGFjcGlfZ3BlX2Jsb2NrX2luZm8gKmdwZV9ibG9jazsKLQlzdHJ1Y3QgYWNwaV9ncGVfeHJ1cHRfaW5mbyAqZ3BlX3hydXB0X2luZm87Ci0JYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7Ci0JYWNwaV9jcHVfZmxhZ3MgZmxhZ3M7Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGV2X3dhbGtfZ3BlX2xpc3QpOwotCi0JZmxhZ3MgPSBhY3BpX29zX2FjcXVpcmVfbG9jayhhY3BpX2dibF9ncGVfbG9jayk7Ci0KLQkvKiBXYWxrIHRoZSBpbnRlcnJ1cHQgbGV2ZWwgZGVzY3JpcHRvciBsaXN0ICovCi0KLQlncGVfeHJ1cHRfaW5mbyA9IGFjcGlfZ2JsX2dwZV94cnVwdF9saXN0X2hlYWQ7Ci0Jd2hpbGUgKGdwZV94cnVwdF9pbmZvKSB7Ci0KLQkJLyogV2FsayBhbGwgR3BlIEJsb2NrcyBhdHRhY2hlZCB0byB0aGlzIGludGVycnVwdCBsZXZlbCAqLwotCi0JCWdwZV9ibG9jayA9IGdwZV94cnVwdF9pbmZvLT5ncGVfYmxvY2tfbGlzdF9oZWFkOwotCQl3aGlsZSAoZ3BlX2Jsb2NrKSB7Ci0KLQkJCS8qIE9uZSBjYWxsYmFjayBwZXIgR1BFIGJsb2NrICovCi0KLQkJCXN0YXR1cyA9IGdwZV93YWxrX2NhbGxiYWNrKGdwZV94cnVwdF9pbmZvLCBncGVfYmxvY2spOwotCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCQkJZ290byB1bmxvY2tfYW5kX2V4aXQ7Ci0JCQl9Ci0KLQkJCWdwZV9ibG9jayA9IGdwZV9ibG9jay0+bmV4dDsKLQkJfQotCi0JCWdwZV94cnVwdF9pbmZvID0gZ3BlX3hydXB0X2luZm8tPm5leHQ7Ci0JfQotCi0gICAgICB1bmxvY2tfYW5kX2V4aXQ6Ci0JYWNwaV9vc19yZWxlYXNlX2xvY2soYWNwaV9nYmxfZ3BlX2xvY2ssIGZsYWdzKTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9ldl9kZWxldGVfZ3BlX2hhbmRsZXJzCi0gKgotICogUEFSQU1FVEVSUzogIGdwZV94cnVwdF9pbmZvICAgICAgLSBHUEUgSW50ZXJydXB0IGluZm8KLSAqICAgICAgICAgICAgICBncGVfYmxvY2sgICAgICAgICAgIC0gR3BlIEJsb2NrIGluZm8KLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IERlbGV0ZSBhbGwgSGFuZGxlciBvYmplY3RzIGZvdW5kIGluIHRoZSBHUEUgZGF0YSBzdHJ1Y3RzLgotICogICAgICAgICAgICAgIFVzZWQgb25seSBwcmlvciB0byB0ZXJtaW5hdGlvbi4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1hY3BpX3N0YXR1cwotYWNwaV9ldl9kZWxldGVfZ3BlX2hhbmRsZXJzKHN0cnVjdCBhY3BpX2dwZV94cnVwdF9pbmZvICpncGVfeHJ1cHRfaW5mbywKLQkJCSAgICBzdHJ1Y3QgYWNwaV9ncGVfYmxvY2tfaW5mbyAqZ3BlX2Jsb2NrKQotewotCXN0cnVjdCBhY3BpX2dwZV9ldmVudF9pbmZvICpncGVfZXZlbnRfaW5mbzsKLQl1MzIgaTsKLQl1MzIgajsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UoZXZfZGVsZXRlX2dwZV9oYW5kbGVycyk7Ci0KLQkvKiBFeGFtaW5lIGVhY2ggR1BFIFJlZ2lzdGVyIHdpdGhpbiB0aGUgYmxvY2sgKi8KLQotCWZvciAoaSA9IDA7IGkgPCBncGVfYmxvY2stPnJlZ2lzdGVyX2NvdW50OyBpKyspIHsKLQotCQkvKiBOb3cgbG9vayBhdCB0aGUgaW5kaXZpZHVhbCBHUEVzIGluIHRoaXMgYnl0ZSByZWdpc3RlciAqLwotCi0JCWZvciAoaiA9IDA7IGogPCBBQ1BJX0dQRV9SRUdJU1RFUl9XSURUSDsgaisrKSB7Ci0JCQlncGVfZXZlbnRfaW5mbyA9Ci0JCQkgICAgJmdwZV9ibG9jay0+Ci0JCQkgICAgZXZlbnRfaW5mb1soKGFjcGlfc2l6ZSkgaSAqCi0JCQkJCUFDUElfR1BFX1JFR0lTVEVSX1dJRFRIKSArIGpdOwotCi0JCQlpZiAoKGdwZV9ldmVudF9pbmZvLT5mbGFncyAmIEFDUElfR1BFX0RJU1BBVENIX01BU0spID09Ci0JCQkgICAgQUNQSV9HUEVfRElTUEFUQ0hfSEFORExFUikgewotCQkJCUFDUElfRlJFRShncGVfZXZlbnRfaW5mby0+ZGlzcGF0Y2guaGFuZGxlcik7Ci0JCQkJZ3BlX2V2ZW50X2luZm8tPmRpc3BhdGNoLmhhbmRsZXIgPSBOVUxMOwotCQkJCWdwZV9ldmVudF9pbmZvLT5mbGFncyAmPQotCQkJCSAgICB+QUNQSV9HUEVfRElTUEFUQ0hfTUFTSzsKLQkJCX0KLQkJfQotCX0KLQotCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfZXZfc2F2ZV9tZXRob2RfaW5mbwotICoKLSAqIFBBUkFNRVRFUlM6ICBDYWxsYmFjayBmcm9tIHdhbGtfbmFtZXNwYWNlCi0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cwotICoKLSAqIERFU0NSSVBUSU9OOiBDYWxsZWQgZnJvbSBhY3BpX3dhbGtfbmFtZXNwYWNlLiBFeHBlY3RzIGVhY2ggb2JqZWN0IHRvIGJlIGEKLSAqICAgICAgICAgICAgICBjb250cm9sIG1ldGhvZCB1bmRlciB0aGUgX0dQRSBwb3J0aW9uIG9mIHRoZSBuYW1lc3BhY2UuCi0gKiAgICAgICAgICAgICAgRXh0cmFjdCB0aGUgbmFtZSBhbmQgR1BFIHR5cGUgZnJvbSB0aGUgb2JqZWN0LCBzYXZpbmcgdGhpcwotICogICAgICAgICAgICAgIGluZm9ybWF0aW9uIGZvciBxdWljayBsb29rdXAgZHVyaW5nIEdQRSBkaXNwYXRjaAotICoKLSAqICAgICAgICAgICAgICBUaGUgbmFtZSBvZiBlYWNoIEdQRSBjb250cm9sIG1ldGhvZCBpcyBvZiB0aGUgZm9ybToKLSAqICAgICAgICAgICAgICAiX0x4eCIgb3IgIl9FeHgiCi0gKiAgICAgICAgICAgICAgV2hlcmU6Ci0gKiAgICAgICAgICAgICAgICAgIEwgICAgICAtIG1lYW5zIHRoYXQgdGhlIEdQRSBpcyBsZXZlbCB0cmlnZ2VyZWQKLSAqICAgICAgICAgICAgICAgICAgRSAgICAgIC0gbWVhbnMgdGhhdCB0aGUgR1BFIGlzIGVkZ2UgdHJpZ2dlcmVkCi0gKiAgICAgICAgICAgICAgICAgIHh4ICAgICAtIGlzIHRoZSBHUEUgbnVtYmVyIFtpbiBIRVhdCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIGFjcGlfc3RhdHVzCi1hY3BpX2V2X3NhdmVfbWV0aG9kX2luZm8oYWNwaV9oYW5kbGUgb2JqX2hhbmRsZSwKLQkJCSB1MzIgbGV2ZWwsIHZvaWQgKm9ial9kZXNjLCB2b2lkICoqcmV0dXJuX3ZhbHVlKQotewotCXN0cnVjdCBhY3BpX2dwZV9ibG9ja19pbmZvICpncGVfYmxvY2sgPSAodm9pZCAqKW9ial9kZXNjOwotCXN0cnVjdCBhY3BpX2dwZV9ldmVudF9pbmZvICpncGVfZXZlbnRfaW5mbzsKLQl1MzIgZ3BlX251bWJlcjsKLQljaGFyIG5hbWVbQUNQSV9OQU1FX1NJWkUgKyAxXTsKLQl1OCB0eXBlOwotCWFjcGlfc3RhdHVzIHN0YXR1czsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UoZXZfc2F2ZV9tZXRob2RfaW5mbyk7Ci0KLQkvKgotCSAqIF9MeHggYW5kIF9FeHggR1BFIG1ldGhvZCBzdXBwb3J0Ci0JICoKLQkgKiAxKSBFeHRyYWN0IHRoZSBuYW1lIGZyb20gdGhlIG9iamVjdCBhbmQgY29udmVydCB0byBhIHN0cmluZwotCSAqLwotCUFDUElfTU9WRV8zMl9UT18zMihuYW1lLAotCQkJICAgJigoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKilvYmpfaGFuZGxlKS0+bmFtZS4KLQkJCSAgIGludGVnZXIpOwotCW5hbWVbQUNQSV9OQU1FX1NJWkVdID0gMDsKLQotCS8qCi0JICogMikgRWRnZS9MZXZlbCBkZXRlcm1pbmF0aW9uIGlzIGJhc2VkIG9uIHRoZSAybmQgY2hhcmFjdGVyCi0JICogICAgb2YgdGhlIG1ldGhvZCBuYW1lCi0JICoKLQkgKiBOT1RFOiBEZWZhdWx0IEdQRSB0eXBlIGlzIFJVTlRJTUUuIE1heSBiZSBjaGFuZ2VkIGxhdGVyIHRvIFdBS0UKLQkgKiBpZiBhIF9QUlcgb2JqZWN0IGlzIGZvdW5kIHRoYXQgcG9pbnRzIHRvIHRoaXMgR1BFLgotCSAqLwotCXN3aXRjaCAobmFtZVsxXSkgewotCWNhc2UgJ0wnOgotCQl0eXBlID0gQUNQSV9HUEVfTEVWRUxfVFJJR0dFUkVEOwotCQlicmVhazsKLQotCWNhc2UgJ0UnOgotCQl0eXBlID0gQUNQSV9HUEVfRURHRV9UUklHR0VSRUQ7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJLyogVW5rbm93biBtZXRob2QgdHlwZSwganVzdCBpZ25vcmUgaXQhICovCi0KLQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9MT0FELAotCQkJCSAgIklnbm9yaW5nIHVua25vd24gR1BFIG1ldGhvZCB0eXBlOiAlcyAobmFtZSBub3Qgb2YgZm9ybSBfTHh4IG9yIF9FeHgpIiwKLQkJCQkgIG5hbWUpKTsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKLQl9Ci0KLQkvKiBDb252ZXJ0IHRoZSBsYXN0IHR3byBjaGFyYWN0ZXJzIG9mIHRoZSBuYW1lIHRvIHRoZSBHUEUgTnVtYmVyICovCi0KLQlncGVfbnVtYmVyID0gQUNQSV9TVFJUT1VMKCZuYW1lWzJdLCBOVUxMLCAxNik7Ci0JaWYgKGdwZV9udW1iZXIgPT0gQUNQSV9VSU5UMzJfTUFYKSB7Ci0KLQkJLyogQ29udmVyc2lvbiBmYWlsZWQ7IGludmFsaWQgbWV0aG9kLCBqdXN0IGlnbm9yZSBpdCAqLwotCi0JCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfTE9BRCwKLQkJCQkgICJDb3VsZCBub3QgZXh0cmFjdCBHUEUgbnVtYmVyIGZyb20gbmFtZTogJXMgKG5hbWUgaXMgbm90IG9mIGZvcm0gX0x4eCBvciBfRXh4KSIsCi0JCQkJICBuYW1lKSk7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7Ci0JfQotCi0JLyogRW5zdXJlIHRoYXQgd2UgaGF2ZSBhIHZhbGlkIEdQRSBudW1iZXIgZm9yIHRoaXMgR1BFIGJsb2NrICovCi0KLQlpZiAoKGdwZV9udW1iZXIgPCBncGVfYmxvY2stPmJsb2NrX2Jhc2VfbnVtYmVyKSB8fAotCSAgICAoZ3BlX251bWJlciA+PQotCSAgICAgKGdwZV9ibG9jay0+YmxvY2tfYmFzZV9udW1iZXIgKwotCSAgICAgIChncGVfYmxvY2stPnJlZ2lzdGVyX2NvdW50ICogOCkpKSkgewotCQkvKgotCQkgKiBOb3QgdmFsaWQgZm9yIHRoaXMgR1BFIGJsb2NrLCBqdXN0IGlnbm9yZSBpdAotCQkgKiBIb3dldmVyLCBpdCBtYXkgYmUgdmFsaWQgZm9yIGEgZGlmZmVyZW50IEdQRSBibG9jaywgc2luY2UgR1BFMCBhbmQgR1BFMQotCQkgKiBtZXRob2RzIGJvdGggYXBwZWFyIHVuZGVyIFxfR1BFLgotCQkgKi8KLQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKLQl9Ci0KLQkvKgotCSAqIE5vdyB3ZSBjYW4gYWRkIHRoaXMgaW5mb3JtYXRpb24gdG8gdGhlIGdwZV9ldmVudF9pbmZvIGJsb2NrCi0JICogZm9yIHVzZSBkdXJpbmcgZGlzcGF0Y2ggb2YgdGhpcyBHUEUuIERlZmF1bHQgdHlwZSBpcyBSVU5USU1FLCBhbHRob3VnaAotCSAqIHRoaXMgbWF5IGNoYW5nZSB3aGVuIHRoZSBfUFJXIG1ldGhvZHMgYXJlIGV4ZWN1dGVkIGxhdGVyLgotCSAqLwotCWdwZV9ldmVudF9pbmZvID0KLQkgICAgJmdwZV9ibG9jay0+ZXZlbnRfaW5mb1tncGVfbnVtYmVyIC0gZ3BlX2Jsb2NrLT5ibG9ja19iYXNlX251bWJlcl07Ci0KLQlncGVfZXZlbnRfaW5mby0+ZmxhZ3MgPSAodTgpCi0JICAgICh0eXBlIHwgQUNQSV9HUEVfRElTUEFUQ0hfTUVUSE9EIHwgQUNQSV9HUEVfVFlQRV9SVU5USU1FKTsKLQotCWdwZV9ldmVudF9pbmZvLT5kaXNwYXRjaC5tZXRob2Rfbm9kZSA9Ci0JICAgIChzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqKW9ial9oYW5kbGU7Ci0KLQkvKiBVcGRhdGUgZW5hYmxlIG1hc2ssIGJ1dCBkb24ndCBlbmFibGUgdGhlIEhXIEdQRSBhcyBvZiB5ZXQgKi8KLQotCXN0YXR1cyA9IGFjcGlfZXZfZW5hYmxlX2dwZShncGVfZXZlbnRfaW5mbywgRkFMU0UpOwotCi0JQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9MT0FELAotCQkJICAiUmVnaXN0ZXJlZCBHUEUgbWV0aG9kICVzIGFzIEdQRSBudW1iZXIgMHglLjJYXG4iLAotCQkJICBuYW1lLCBncGVfbnVtYmVyKSk7Ci0JcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfZXZfbWF0Y2hfcHJ3X2FuZF9ncGUKLSAqCi0gKiBQQVJBTUVURVJTOiAgQ2FsbGJhY2sgZnJvbSB3YWxrX25hbWVzcGFjZQotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMuIE5PVEU6IFdlIGlnbm9yZSBlcnJvcnMgc28gdGhhdCB0aGUgX1BSVyB3YWxrIGlzCi0gKiAgICAgICAgICAgICAgbm90IGFib3J0ZWQgb24gYSBzaW5nbGUgX1BSVyBmYWlsdXJlLgotICoKLSAqIERFU0NSSVBUSU9OOiBDYWxsZWQgZnJvbSBhY3BpX3dhbGtfbmFtZXNwYWNlLiBFeHBlY3RzIGVhY2ggb2JqZWN0IHRvIGJlIGEKLSAqICAgICAgICAgICAgICBEZXZpY2UuIFJ1biB0aGUgX1BSVyBtZXRob2QuIElmIHByZXNlbnQsIGV4dHJhY3QgdGhlIEdQRQotICogICAgICAgICAgICAgIG51bWJlciBhbmQgbWFyayB0aGUgR1BFIGFzIGEgV0FLRSBHUEUuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIGFjcGlfc3RhdHVzCi1hY3BpX2V2X21hdGNoX3Byd19hbmRfZ3BlKGFjcGlfaGFuZGxlIG9ial9oYW5kbGUsCi0JCQkgIHUzMiBsZXZlbCwgdm9pZCAqaW5mbywgdm9pZCAqKnJldHVybl92YWx1ZSkKLXsKLQlzdHJ1Y3QgYWNwaV9ncGVfd2Fsa19pbmZvICpncGVfaW5mbyA9ICh2b2lkICopaW5mbzsKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqZ3BlX2RldmljZTsKLQlzdHJ1Y3QgYWNwaV9ncGVfYmxvY2tfaW5mbyAqZ3BlX2Jsb2NrOwotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICp0YXJnZXRfZ3BlX2RldmljZTsKLQlzdHJ1Y3QgYWNwaV9ncGVfZXZlbnRfaW5mbyAqZ3BlX2V2ZW50X2luZm87Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqcGtnX2Rlc2M7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2M7Ci0JdTMyIGdwZV9udW1iZXI7Ci0JYWNwaV9zdGF0dXMgc3RhdHVzOwotCi0JQUNQSV9GVU5DVElPTl9UUkFDRShldl9tYXRjaF9wcndfYW5kX2dwZSk7Ci0KLQkvKiBDaGVjayBmb3IgYSBfUFJXIG1ldGhvZCB1bmRlciB0aGlzIGRldmljZSAqLwotCi0Jc3RhdHVzID0gYWNwaV91dF9ldmFsdWF0ZV9vYmplY3Qob2JqX2hhbmRsZSwgTUVUSE9EX05BTUVfX1BSVywKLQkJCQkJIEFDUElfQlRZUEVfUEFDS0FHRSwgJnBrZ19kZXNjKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQotCQkvKiBJZ25vcmUgYWxsIGVycm9ycyBmcm9tIF9QUlcsIHdlIGRvbid0IHdhbnQgdG8gYWJvcnQgdGhlIHN1YnN5c3RlbSAqLwotCi0JCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7Ci0JfQotCi0JLyogVGhlIHJldHVybmVkIF9QUlcgcGFja2FnZSBtdXN0IGhhdmUgYXQgbGVhc3QgdHdvIGVsZW1lbnRzICovCi0KLQlpZiAocGtnX2Rlc2MtPnBhY2thZ2UuY291bnQgPCAyKSB7Ci0JCWdvdG8gY2xlYW51cDsKLQl9Ci0KLQkvKiBFeHRyYWN0IHBvaW50ZXJzIGZyb20gdGhlIGlucHV0IGNvbnRleHQgKi8KLQotCWdwZV9kZXZpY2UgPSBncGVfaW5mby0+Z3BlX2RldmljZTsKLQlncGVfYmxvY2sgPSBncGVfaW5mby0+Z3BlX2Jsb2NrOwotCi0JLyoKLQkgKiBUaGUgX1BSVyBvYmplY3QgbXVzdCByZXR1cm4gYSBwYWNrYWdlLCB3ZSBhcmUgb25seSBpbnRlcmVzdGVkCi0JICogaW4gdGhlIGZpcnN0IGVsZW1lbnQKLQkgKi8KLQlvYmpfZGVzYyA9IHBrZ19kZXNjLT5wYWNrYWdlLmVsZW1lbnRzWzBdOwotCi0JaWYgKEFDUElfR0VUX09CSkVDVF9UWVBFKG9ial9kZXNjKSA9PSBBQ1BJX1RZUEVfSU5URUdFUikgewotCi0JCS8qIFVzZSBGQURULWRlZmluZWQgR1BFIGRldmljZSAoZnJvbSBkZWZpbml0aW9uIG9mIF9QUlcpICovCi0KLQkJdGFyZ2V0X2dwZV9kZXZpY2UgPSBhY3BpX2dibF9mYWR0X2dwZV9kZXZpY2U7Ci0KLQkJLyogSW50ZWdlciBpcyB0aGUgR1BFIG51bWJlciBpbiB0aGUgRkFEVCBkZXNjcmliZWQgR1BFIGJsb2NrcyAqLwotCi0JCWdwZV9udW1iZXIgPSAodTMyKSBvYmpfZGVzYy0+aW50ZWdlci52YWx1ZTsKLQl9IGVsc2UgaWYgKEFDUElfR0VUX09CSkVDVF9UWVBFKG9ial9kZXNjKSA9PSBBQ1BJX1RZUEVfUEFDS0FHRSkgewotCi0JCS8qIFBhY2thZ2UgY29udGFpbnMgYSBHUEUgcmVmZXJlbmNlIGFuZCBHUEUgbnVtYmVyIHdpdGhpbiBhIEdQRSBibG9jayAqLwotCi0JCWlmICgob2JqX2Rlc2MtPnBhY2thZ2UuY291bnQgPCAyKSB8fAotCQkgICAgKEFDUElfR0VUX09CSkVDVF9UWVBFKG9ial9kZXNjLT5wYWNrYWdlLmVsZW1lbnRzWzBdKSAhPQotCQkgICAgIEFDUElfVFlQRV9MT0NBTF9SRUZFUkVOQ0UpCi0JCSAgICB8fCAoQUNQSV9HRVRfT0JKRUNUX1RZUEUob2JqX2Rlc2MtPnBhY2thZ2UuZWxlbWVudHNbMV0pICE9Ci0JCQlBQ1BJX1RZUEVfSU5URUdFUikpIHsKLQkJCWdvdG8gY2xlYW51cDsKLQkJfQotCi0JCS8qIEdldCBHUEUgYmxvY2sgcmVmZXJlbmNlIGFuZCBkZWNvZGUgKi8KLQotCQl0YXJnZXRfZ3BlX2RldmljZSA9Ci0JCSAgICBvYmpfZGVzYy0+cGFja2FnZS5lbGVtZW50c1swXS0+cmVmZXJlbmNlLm5vZGU7Ci0JCWdwZV9udW1iZXIgPSAodTMyKSBvYmpfZGVzYy0+cGFja2FnZS5lbGVtZW50c1sxXS0+aW50ZWdlci52YWx1ZTsKLQl9IGVsc2UgewotCQkvKiBVbmtub3duIHR5cGUsIGp1c3QgaWdub3JlIGl0ICovCi0KLQkJZ290byBjbGVhbnVwOwotCX0KLQotCS8qCi0JICogSXMgdGhpcyBHUEUgd2l0aGluIHRoaXMgYmxvY2s/Ci0JICoKLQkgKiBUUlVFIGlmZiB0aGVzZSBjb25kaXRpb25zIGFyZSB0cnVlOgotCSAqICAgICAxKSBUaGUgR1BFIGRldmljZXMgbWF0Y2guCi0JICogICAgIDIpIFRoZSBHUEUgaW5kZXgobnVtYmVyKSBpcyB3aXRoaW4gdGhlIHJhbmdlIG9mIHRoZSBHcGUgQmxvY2sKLQkgKiAgICAgICAgICBhc3NvY2lhdGVkIHdpdGggdGhlIEdQRSBkZXZpY2UuCi0JICovCi0JaWYgKChncGVfZGV2aWNlID09IHRhcmdldF9ncGVfZGV2aWNlKSAmJgotCSAgICAoZ3BlX251bWJlciA+PSBncGVfYmxvY2stPmJsb2NrX2Jhc2VfbnVtYmVyKSAmJgotCSAgICAoZ3BlX251bWJlciA8Ci0JICAgICBncGVfYmxvY2stPmJsb2NrX2Jhc2VfbnVtYmVyICsgKGdwZV9ibG9jay0+cmVnaXN0ZXJfY291bnQgKiA4KSkpIHsKLQkJZ3BlX2V2ZW50X2luZm8gPQotCQkgICAgJmdwZV9ibG9jay0+ZXZlbnRfaW5mb1tncGVfbnVtYmVyIC0KLQkJCQkJICAgZ3BlX2Jsb2NrLT5ibG9ja19iYXNlX251bWJlcl07Ci0KLQkJLyogTWFyayBHUEUgZm9yIFdBS0UtT05MWSBidXQgV0FLRV9ESVNBQkxFRCAqLwotCi0JCWdwZV9ldmVudF9pbmZvLT5mbGFncyAmPQotCQkgICAgfihBQ1BJX0dQRV9XQUtFX0VOQUJMRUQgfCBBQ1BJX0dQRV9SVU5fRU5BQkxFRCk7Ci0KLQkJc3RhdHVzID0KLQkJICAgIGFjcGlfZXZfc2V0X2dwZV90eXBlKGdwZV9ldmVudF9pbmZvLCBBQ1BJX0dQRV9UWVBFX1dBS0UpOwotCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJCWdvdG8gY2xlYW51cDsKLQkJfQotCQlzdGF0dXMgPQotCQkgICAgYWNwaV9ldl91cGRhdGVfZ3BlX2VuYWJsZV9tYXNrcyhncGVfZXZlbnRfaW5mbywKLQkJCQkJCSAgICBBQ1BJX0dQRV9ESVNBQkxFKTsKLQl9Ci0KLSAgICAgIGNsZWFudXA6Ci0JYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKHBrZ19kZXNjKTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX2V2X2dldF9ncGVfeHJ1cHRfYmxvY2sKLSAqCi0gKiBQQVJBTUVURVJTOiAgaW50ZXJydXB0X251bWJlciAgICAgLSBJbnRlcnJ1cHQgZm9yIGEgR1BFIGJsb2NrCi0gKgotICogUkVUVVJOOiAgICAgIEEgR1BFIGludGVycnVwdCBibG9jawotICoKLSAqIERFU0NSSVBUSU9OOiBHZXQgb3IgQ3JlYXRlIGEgR1BFIGludGVycnVwdCBibG9jay4gVGhlcmUgaXMgb25lIGludGVycnVwdAotICogICAgICAgICAgICAgIGJsb2NrIHBlciB1bmlxdWUgaW50ZXJydXB0IGxldmVsIHVzZWQgZm9yIEdQRXMuCi0gKiAgICAgICAgICAgICAgU2hvdWxkIGJlIGNhbGxlZCBvbmx5IHdoZW4gdGhlIEdQRSBsaXN0cyBhcmUgc2VtYXBob3JlIGxvY2tlZAotICogICAgICAgICAgICAgIGFuZCBub3Qgc3ViamVjdCB0byBjaGFuZ2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIHN0cnVjdCBhY3BpX2dwZV94cnVwdF9pbmZvICphY3BpX2V2X2dldF9ncGVfeHJ1cHRfYmxvY2sodTMyCi0JCQkJCQkJICAgICAgIGludGVycnVwdF9udW1iZXIpCi17Ci0Jc3RydWN0IGFjcGlfZ3BlX3hydXB0X2luZm8gKm5leHRfZ3BlX3hydXB0OwotCXN0cnVjdCBhY3BpX2dwZV94cnVwdF9pbmZvICpncGVfeHJ1cHQ7Ci0JYWNwaV9zdGF0dXMgc3RhdHVzOwotCWFjcGlfY3B1X2ZsYWdzIGZsYWdzOwotCi0JQUNQSV9GVU5DVElPTl9UUkFDRShldl9nZXRfZ3BlX3hydXB0X2Jsb2NrKTsKLQotCS8qIE5vIG5lZWQgZm9yIGxvY2sgc2luY2Ugd2UgYXJlIG5vdCBjaGFuZ2luZyBhbnkgbGlzdCBlbGVtZW50cyBoZXJlICovCi0KLQluZXh0X2dwZV94cnVwdCA9IGFjcGlfZ2JsX2dwZV94cnVwdF9saXN0X2hlYWQ7Ci0Jd2hpbGUgKG5leHRfZ3BlX3hydXB0KSB7Ci0JCWlmIChuZXh0X2dwZV94cnVwdC0+aW50ZXJydXB0X251bWJlciA9PSBpbnRlcnJ1cHRfbnVtYmVyKSB7Ci0JCQlyZXR1cm5fUFRSKG5leHRfZ3BlX3hydXB0KTsKLQkJfQotCi0JCW5leHRfZ3BlX3hydXB0ID0gbmV4dF9ncGVfeHJ1cHQtPm5leHQ7Ci0JfQotCi0JLyogTm90IGZvdW5kLCBtdXN0IGFsbG9jYXRlIGEgbmV3IHhydXB0IGRlc2NyaXB0b3IgKi8KLQotCWdwZV94cnVwdCA9IEFDUElfQUxMT0NBVEVfWkVST0VEKHNpemVvZihzdHJ1Y3QgYWNwaV9ncGVfeHJ1cHRfaW5mbykpOwotCWlmICghZ3BlX3hydXB0KSB7Ci0JCXJldHVybl9QVFIoTlVMTCk7Ci0JfQotCi0JZ3BlX3hydXB0LT5pbnRlcnJ1cHRfbnVtYmVyID0gaW50ZXJydXB0X251bWJlcjsKLQotCS8qIEluc3RhbGwgbmV3IGludGVycnVwdCBkZXNjcmlwdG9yIHdpdGggc3BpbiBsb2NrICovCi0KLQlmbGFncyA9IGFjcGlfb3NfYWNxdWlyZV9sb2NrKGFjcGlfZ2JsX2dwZV9sb2NrKTsKLQlpZiAoYWNwaV9nYmxfZ3BlX3hydXB0X2xpc3RfaGVhZCkgewotCQluZXh0X2dwZV94cnVwdCA9IGFjcGlfZ2JsX2dwZV94cnVwdF9saXN0X2hlYWQ7Ci0JCXdoaWxlIChuZXh0X2dwZV94cnVwdC0+bmV4dCkgewotCQkJbmV4dF9ncGVfeHJ1cHQgPSBuZXh0X2dwZV94cnVwdC0+bmV4dDsKLQkJfQotCi0JCW5leHRfZ3BlX3hydXB0LT5uZXh0ID0gZ3BlX3hydXB0OwotCQlncGVfeHJ1cHQtPnByZXZpb3VzID0gbmV4dF9ncGVfeHJ1cHQ7Ci0JfSBlbHNlIHsKLQkJYWNwaV9nYmxfZ3BlX3hydXB0X2xpc3RfaGVhZCA9IGdwZV94cnVwdDsKLQl9Ci0JYWNwaV9vc19yZWxlYXNlX2xvY2soYWNwaV9nYmxfZ3BlX2xvY2ssIGZsYWdzKTsKLQotCS8qIEluc3RhbGwgbmV3IGludGVycnVwdCBoYW5kbGVyIGlmIG5vdCBTQ0lfSU5UICovCi0KLQlpZiAoaW50ZXJydXB0X251bWJlciAhPSBhY3BpX2dibF9GQURULnNjaV9pbnRlcnJ1cHQpIHsKLQkJc3RhdHVzID0gYWNwaV9vc19pbnN0YWxsX2ludGVycnVwdF9oYW5kbGVyKGludGVycnVwdF9udW1iZXIsCi0JCQkJCQkJICAgYWNwaV9ldl9ncGVfeHJ1cHRfaGFuZGxlciwKLQkJCQkJCQkgICBncGVfeHJ1cHQpOwotCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJCUFDUElfRVJST1IoKEFFX0lORk8sCi0JCQkJICAgICJDb3VsZCBub3QgaW5zdGFsbCBHUEUgaW50ZXJydXB0IGhhbmRsZXIgYXQgbGV2ZWwgMHglWCIsCi0JCQkJICAgIGludGVycnVwdF9udW1iZXIpKTsKLQkJCXJldHVybl9QVFIoTlVMTCk7Ci0JCX0KLQl9Ci0KLQlyZXR1cm5fUFRSKGdwZV94cnVwdCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfZXZfZGVsZXRlX2dwZV94cnVwdAotICoKLSAqIFBBUkFNRVRFUlM6ICBncGVfeHJ1cHQgICAgICAgLSBBIEdQRSBpbnRlcnJ1cHQgaW5mbyBibG9jawotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKLSAqCi0gKiBERVNDUklQVElPTjogUmVtb3ZlIGFuZCBmcmVlIGEgZ3BlX3hydXB0IGJsb2NrLiBSZW1vdmUgYW4gYXNzb2NpYXRlZAotICogICAgICAgICAgICAgIGludGVycnVwdCBoYW5kbGVyIGlmIG5vdCB0aGUgU0NJIGludGVycnVwdC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgYWNwaV9zdGF0dXMKLWFjcGlfZXZfZGVsZXRlX2dwZV94cnVwdChzdHJ1Y3QgYWNwaV9ncGVfeHJ1cHRfaW5mbyAqZ3BlX3hydXB0KQotewotCWFjcGlfc3RhdHVzIHN0YXR1czsKLQlhY3BpX2NwdV9mbGFncyBmbGFnczsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UoZXZfZGVsZXRlX2dwZV94cnVwdCk7Ci0KLQkvKiBXZSBuZXZlciB3YW50IHRvIHJlbW92ZSB0aGUgU0NJIGludGVycnVwdCBoYW5kbGVyICovCi0KLQlpZiAoZ3BlX3hydXB0LT5pbnRlcnJ1cHRfbnVtYmVyID09IGFjcGlfZ2JsX0ZBRFQuc2NpX2ludGVycnVwdCkgewotCQlncGVfeHJ1cHQtPmdwZV9ibG9ja19saXN0X2hlYWQgPSBOVUxMOwotCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwotCX0KLQotCS8qIERpc2FibGUgdGhpcyBpbnRlcnJ1cHQgKi8KLQotCXN0YXR1cyA9Ci0JICAgIGFjcGlfb3NfcmVtb3ZlX2ludGVycnVwdF9oYW5kbGVyKGdwZV94cnVwdC0+aW50ZXJydXB0X251bWJlciwKLQkJCQkJICAgICBhY3BpX2V2X2dwZV94cnVwdF9oYW5kbGVyKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci0JfQotCi0JLyogVW5saW5rIHRoZSBpbnRlcnJ1cHQgYmxvY2sgd2l0aCBsb2NrICovCi0KLQlmbGFncyA9IGFjcGlfb3NfYWNxdWlyZV9sb2NrKGFjcGlfZ2JsX2dwZV9sb2NrKTsKLQlpZiAoZ3BlX3hydXB0LT5wcmV2aW91cykgewotCQlncGVfeHJ1cHQtPnByZXZpb3VzLT5uZXh0ID0gZ3BlX3hydXB0LT5uZXh0OwotCX0gZWxzZSB7Ci0JCS8qIE5vIHByZXZpb3VzLCB1cGRhdGUgbGlzdCBoZWFkICovCi0KLQkJYWNwaV9nYmxfZ3BlX3hydXB0X2xpc3RfaGVhZCA9IGdwZV94cnVwdC0+bmV4dDsKLQl9Ci0KLQlpZiAoZ3BlX3hydXB0LT5uZXh0KSB7Ci0JCWdwZV94cnVwdC0+bmV4dC0+cHJldmlvdXMgPSBncGVfeHJ1cHQtPnByZXZpb3VzOwotCX0KLQlhY3BpX29zX3JlbGVhc2VfbG9jayhhY3BpX2dibF9ncGVfbG9jaywgZmxhZ3MpOwotCi0JLyogRnJlZSB0aGUgYmxvY2sgKi8KLQotCUFDUElfRlJFRShncGVfeHJ1cHQpOwotCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfZXZfaW5zdGFsbF9ncGVfYmxvY2sKLSAqCi0gKiBQQVJBTUVURVJTOiAgZ3BlX2Jsb2NrICAgICAgIC0gTmV3IEdQRSBibG9jawotICogICAgICAgICAgICAgIGludGVycnVwdF9udW1iZXIgLSBYcnVwdCB0byBiZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBHUEUgYmxvY2sKLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IEluc3RhbGwgbmV3IEdQRSBibG9jayB3aXRoIG11dGV4IHN1cHBvcnQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgYWNwaV9zdGF0dXMKLWFjcGlfZXZfaW5zdGFsbF9ncGVfYmxvY2soc3RydWN0IGFjcGlfZ3BlX2Jsb2NrX2luZm8gKmdwZV9ibG9jaywKLQkJCSAgdTMyIGludGVycnVwdF9udW1iZXIpCi17Ci0Jc3RydWN0IGFjcGlfZ3BlX2Jsb2NrX2luZm8gKm5leHRfZ3BlX2Jsb2NrOwotCXN0cnVjdCBhY3BpX2dwZV94cnVwdF9pbmZvICpncGVfeHJ1cHRfYmxvY2s7Ci0JYWNwaV9zdGF0dXMgc3RhdHVzOwotCWFjcGlfY3B1X2ZsYWdzIGZsYWdzOwotCi0JQUNQSV9GVU5DVElPTl9UUkFDRShldl9pbnN0YWxsX2dwZV9ibG9jayk7Ci0KLQlzdGF0dXMgPSBhY3BpX3V0X2FjcXVpcmVfbXV0ZXgoQUNQSV9NVFhfRVZFTlRTKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci0JfQotCi0JZ3BlX3hydXB0X2Jsb2NrID0gYWNwaV9ldl9nZXRfZ3BlX3hydXB0X2Jsb2NrKGludGVycnVwdF9udW1iZXIpOwotCWlmICghZ3BlX3hydXB0X2Jsb2NrKSB7Ci0JCXN0YXR1cyA9IEFFX05PX01FTU9SWTsKLQkJZ290byB1bmxvY2tfYW5kX2V4aXQ7Ci0JfQotCi0JLyogSW5zdGFsbCB0aGUgbmV3IGJsb2NrIGF0IHRoZSBlbmQgb2YgdGhlIGxpc3Qgd2l0aCBsb2NrICovCi0KLQlmbGFncyA9IGFjcGlfb3NfYWNxdWlyZV9sb2NrKGFjcGlfZ2JsX2dwZV9sb2NrKTsKLQlpZiAoZ3BlX3hydXB0X2Jsb2NrLT5ncGVfYmxvY2tfbGlzdF9oZWFkKSB7Ci0JCW5leHRfZ3BlX2Jsb2NrID0gZ3BlX3hydXB0X2Jsb2NrLT5ncGVfYmxvY2tfbGlzdF9oZWFkOwotCQl3aGlsZSAobmV4dF9ncGVfYmxvY2stPm5leHQpIHsKLQkJCW5leHRfZ3BlX2Jsb2NrID0gbmV4dF9ncGVfYmxvY2stPm5leHQ7Ci0JCX0KLQotCQluZXh0X2dwZV9ibG9jay0+bmV4dCA9IGdwZV9ibG9jazsKLQkJZ3BlX2Jsb2NrLT5wcmV2aW91cyA9IG5leHRfZ3BlX2Jsb2NrOwotCX0gZWxzZSB7Ci0JCWdwZV94cnVwdF9ibG9jay0+Z3BlX2Jsb2NrX2xpc3RfaGVhZCA9IGdwZV9ibG9jazsKLQl9Ci0KLQlncGVfYmxvY2stPnhydXB0X2Jsb2NrID0gZ3BlX3hydXB0X2Jsb2NrOwotCWFjcGlfb3NfcmVsZWFzZV9sb2NrKGFjcGlfZ2JsX2dwZV9sb2NrLCBmbGFncyk7Ci0KLSAgICAgIHVubG9ja19hbmRfZXhpdDoKLQlzdGF0dXMgPSBhY3BpX3V0X3JlbGVhc2VfbXV0ZXgoQUNQSV9NVFhfRVZFTlRTKTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9ldl9kZWxldGVfZ3BlX2Jsb2NrCi0gKgotICogUEFSQU1FVEVSUzogIGdwZV9ibG9jayAgICAgICAtIEV4aXN0aW5nIEdQRSBibG9jawotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKLSAqCi0gKiBERVNDUklQVElPTjogUmVtb3ZlIGEgR1BFIGJsb2NrCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotYWNwaV9zdGF0dXMgYWNwaV9ldl9kZWxldGVfZ3BlX2Jsb2NrKHN0cnVjdCBhY3BpX2dwZV9ibG9ja19pbmZvICpncGVfYmxvY2spCi17Ci0JYWNwaV9zdGF0dXMgc3RhdHVzOwotCWFjcGlfY3B1X2ZsYWdzIGZsYWdzOwotCi0JQUNQSV9GVU5DVElPTl9UUkFDRShldl9pbnN0YWxsX2dwZV9ibG9jayk7Ci0KLQlzdGF0dXMgPSBhY3BpX3V0X2FjcXVpcmVfbXV0ZXgoQUNQSV9NVFhfRVZFTlRTKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci0JfQotCi0JLyogRGlzYWJsZSBhbGwgR1BFcyBpbiB0aGlzIGJsb2NrICovCi0KLQlzdGF0dXMgPSBhY3BpX2h3X2Rpc2FibGVfZ3BlX2Jsb2NrKGdwZV9ibG9jay0+eHJ1cHRfYmxvY2ssIGdwZV9ibG9jayk7Ci0KLQlpZiAoIWdwZV9ibG9jay0+cHJldmlvdXMgJiYgIWdwZV9ibG9jay0+bmV4dCkgewotCi0JCS8qIFRoaXMgaXMgdGhlIGxhc3QgZ3BlX2Jsb2NrIG9uIHRoaXMgaW50ZXJydXB0ICovCi0KLQkJc3RhdHVzID0gYWNwaV9ldl9kZWxldGVfZ3BlX3hydXB0KGdwZV9ibG9jay0+eHJ1cHRfYmxvY2spOwotCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJCWdvdG8gdW5sb2NrX2FuZF9leGl0OwotCQl9Ci0JfSBlbHNlIHsKLQkJLyogUmVtb3ZlIHRoZSBibG9jayBvbiB0aGlzIGludGVycnVwdCB3aXRoIGxvY2sgKi8KLQotCQlmbGFncyA9IGFjcGlfb3NfYWNxdWlyZV9sb2NrKGFjcGlfZ2JsX2dwZV9sb2NrKTsKLQkJaWYgKGdwZV9ibG9jay0+cHJldmlvdXMpIHsKLQkJCWdwZV9ibG9jay0+cHJldmlvdXMtPm5leHQgPSBncGVfYmxvY2stPm5leHQ7Ci0JCX0gZWxzZSB7Ci0JCQlncGVfYmxvY2stPnhydXB0X2Jsb2NrLT5ncGVfYmxvY2tfbGlzdF9oZWFkID0KLQkJCSAgICBncGVfYmxvY2stPm5leHQ7Ci0JCX0KLQotCQlpZiAoZ3BlX2Jsb2NrLT5uZXh0KSB7Ci0JCQlncGVfYmxvY2stPm5leHQtPnByZXZpb3VzID0gZ3BlX2Jsb2NrLT5wcmV2aW91czsKLQkJfQotCQlhY3BpX29zX3JlbGVhc2VfbG9jayhhY3BpX2dibF9ncGVfbG9jaywgZmxhZ3MpOwotCX0KLQotCS8qIEZyZWUgdGhlIGdwZV9ibG9jayAqLwotCi0JQUNQSV9GUkVFKGdwZV9ibG9jay0+cmVnaXN0ZXJfaW5mbyk7Ci0JQUNQSV9GUkVFKGdwZV9ibG9jay0+ZXZlbnRfaW5mbyk7Ci0JQUNQSV9GUkVFKGdwZV9ibG9jayk7Ci0KLSAgICAgIHVubG9ja19hbmRfZXhpdDoKLQlzdGF0dXMgPSBhY3BpX3V0X3JlbGVhc2VfbXV0ZXgoQUNQSV9NVFhfRVZFTlRTKTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9ldl9jcmVhdGVfZ3BlX2luZm9fYmxvY2tzCi0gKgotICogUEFSQU1FVEVSUzogIGdwZV9ibG9jayAgIC0gTmV3IEdQRSBibG9jawotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKLSAqCi0gKiBERVNDUklQVElPTjogQ3JlYXRlIHRoZSByZWdpc3Rlcl9pbmZvIGFuZCBldmVudF9pbmZvIGJsb2NrcyBmb3IgdGhpcyBHUEUgYmxvY2sKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgYWNwaV9zdGF0dXMKLWFjcGlfZXZfY3JlYXRlX2dwZV9pbmZvX2Jsb2NrcyhzdHJ1Y3QgYWNwaV9ncGVfYmxvY2tfaW5mbyAqZ3BlX2Jsb2NrKQotewotCXN0cnVjdCBhY3BpX2dwZV9yZWdpc3Rlcl9pbmZvICpncGVfcmVnaXN0ZXJfaW5mbyA9IE5VTEw7Ci0Jc3RydWN0IGFjcGlfZ3BlX2V2ZW50X2luZm8gKmdwZV9ldmVudF9pbmZvID0gTlVMTDsKLQlzdHJ1Y3QgYWNwaV9ncGVfZXZlbnRfaW5mbyAqdGhpc19ldmVudDsKLQlzdHJ1Y3QgYWNwaV9ncGVfcmVnaXN0ZXJfaW5mbyAqdGhpc19yZWdpc3RlcjsKLQl1MzIgaTsKLQl1MzIgajsKLQlhY3BpX3N0YXR1cyBzdGF0dXM7Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGV2X2NyZWF0ZV9ncGVfaW5mb19ibG9ja3MpOwotCi0JLyogQWxsb2NhdGUgdGhlIEdQRSByZWdpc3RlciBpbmZvcm1hdGlvbiBibG9jayAqLwotCi0JZ3BlX3JlZ2lzdGVyX2luZm8gPSBBQ1BJX0FMTE9DQVRFX1pFUk9FRCgoYWNwaV9zaXplKSBncGVfYmxvY2stPgotCQkJCQkJIHJlZ2lzdGVyX2NvdW50ICoKLQkJCQkJCSBzaXplb2Yoc3RydWN0Ci0JCQkJCQkJYWNwaV9ncGVfcmVnaXN0ZXJfaW5mbykpOwotCWlmICghZ3BlX3JlZ2lzdGVyX2luZm8pIHsKLQkJQUNQSV9FUlJPUigoQUVfSU5GTywKLQkJCSAgICAiQ291bGQgbm90IGFsbG9jYXRlIHRoZSBHcGVSZWdpc3RlckluZm8gdGFibGUiKSk7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT19NRU1PUlkpOwotCX0KLQotCS8qCi0JICogQWxsb2NhdGUgdGhlIEdQRSBldmVudF9pbmZvIGJsb2NrLiBUaGVyZSBhcmUgZWlnaHQgZGlzdGluY3QgR1BFcwotCSAqIHBlciByZWdpc3Rlci4gSW5pdGlhbGl6YXRpb24gdG8gemVyb3MgaXMgc3VmZmljaWVudC4KLQkgKi8KLQlncGVfZXZlbnRfaW5mbyA9IEFDUElfQUxMT0NBVEVfWkVST0VEKCgoYWNwaV9zaXplKSBncGVfYmxvY2stPgotCQkJCQkgICAgICAgcmVnaXN0ZXJfY291bnQgKgotCQkJCQkgICAgICAgQUNQSV9HUEVfUkVHSVNURVJfV0lEVEgpICoKLQkJCQkJICAgICAgc2l6ZW9mKHN0cnVjdAotCQkJCQkJICAgICBhY3BpX2dwZV9ldmVudF9pbmZvKSk7Ci0JaWYgKCFncGVfZXZlbnRfaW5mbykgewotCQlBQ1BJX0VSUk9SKChBRV9JTkZPLAotCQkJICAgICJDb3VsZCBub3QgYWxsb2NhdGUgdGhlIEdwZUV2ZW50SW5mbyB0YWJsZSIpKTsKLQkJc3RhdHVzID0gQUVfTk9fTUVNT1JZOwotCQlnb3RvIGVycm9yX2V4aXQ7Ci0JfQotCi0JLyogU2F2ZSB0aGUgbmV3IEluZm8gYXJyYXlzIGluIHRoZSBHUEUgYmxvY2sgKi8KLQotCWdwZV9ibG9jay0+cmVnaXN0ZXJfaW5mbyA9IGdwZV9yZWdpc3Rlcl9pbmZvOwotCWdwZV9ibG9jay0+ZXZlbnRfaW5mbyA9IGdwZV9ldmVudF9pbmZvOwotCi0JLyoKLQkgKiBJbml0aWFsaXplIHRoZSBHUEUgUmVnaXN0ZXIgYW5kIEV2ZW50IHN0cnVjdHVyZXMuIEEgZ29hbCBvZiB0aGVzZQotCSAqIHRhYmxlcyBpcyB0byBoaWRlIHRoZSBmYWN0IHRoYXQgdGhlcmUgYXJlIHR3byBzZXBhcmF0ZSBHUEUgcmVnaXN0ZXIgc2V0cwotCSAqIGluIGEgZ2l2ZW4gR1BFIGhhcmR3YXJlIGJsb2NrLCB0aGUgc3RhdHVzIHJlZ2lzdGVycyBvY2N1cHkgdGhlIGZpcnN0IGhhbGYsCi0JICogYW5kIHRoZSBlbmFibGUgcmVnaXN0ZXJzIG9jY3VweSB0aGUgc2Vjb25kIGhhbGYuCi0JICovCi0JdGhpc19yZWdpc3RlciA9IGdwZV9yZWdpc3Rlcl9pbmZvOwotCXRoaXNfZXZlbnQgPSBncGVfZXZlbnRfaW5mbzsKLQotCWZvciAoaSA9IDA7IGkgPCBncGVfYmxvY2stPnJlZ2lzdGVyX2NvdW50OyBpKyspIHsKLQotCQkvKiBJbml0IHRoZSByZWdpc3Rlcl9pbmZvIGZvciB0aGlzIEdQRSByZWdpc3RlciAoOCBHUEVzKSAqLwotCi0JCXRoaXNfcmVnaXN0ZXItPmJhc2VfZ3BlX251bWJlciA9Ci0JCSAgICAodTgpIChncGVfYmxvY2stPmJsb2NrX2Jhc2VfbnVtYmVyICsKLQkJCSAgKGkgKiBBQ1BJX0dQRV9SRUdJU1RFUl9XSURUSCkpOwotCi0JCXRoaXNfcmVnaXN0ZXItPnN0YXR1c19hZGRyZXNzLmFkZHJlc3MgPQotCQkgICAgZ3BlX2Jsb2NrLT5ibG9ja19hZGRyZXNzLmFkZHJlc3MgKyBpOwotCi0JCXRoaXNfcmVnaXN0ZXItPmVuYWJsZV9hZGRyZXNzLmFkZHJlc3MgPQotCQkgICAgZ3BlX2Jsb2NrLT5ibG9ja19hZGRyZXNzLmFkZHJlc3MgKyBpICsKLQkJICAgIGdwZV9ibG9jay0+cmVnaXN0ZXJfY291bnQ7Ci0KLQkJdGhpc19yZWdpc3Rlci0+c3RhdHVzX2FkZHJlc3Muc3BhY2VfaWQgPQotCQkgICAgZ3BlX2Jsb2NrLT5ibG9ja19hZGRyZXNzLnNwYWNlX2lkOwotCQl0aGlzX3JlZ2lzdGVyLT5lbmFibGVfYWRkcmVzcy5zcGFjZV9pZCA9Ci0JCSAgICBncGVfYmxvY2stPmJsb2NrX2FkZHJlc3Muc3BhY2VfaWQ7Ci0JCXRoaXNfcmVnaXN0ZXItPnN0YXR1c19hZGRyZXNzLmJpdF93aWR0aCA9Ci0JCSAgICBBQ1BJX0dQRV9SRUdJU1RFUl9XSURUSDsKLQkJdGhpc19yZWdpc3Rlci0+ZW5hYmxlX2FkZHJlc3MuYml0X3dpZHRoID0KLQkJICAgIEFDUElfR1BFX1JFR0lTVEVSX1dJRFRIOwotCQl0aGlzX3JlZ2lzdGVyLT5zdGF0dXNfYWRkcmVzcy5iaXRfb2Zmc2V0ID0KLQkJICAgIEFDUElfR1BFX1JFR0lTVEVSX1dJRFRIOwotCQl0aGlzX3JlZ2lzdGVyLT5lbmFibGVfYWRkcmVzcy5iaXRfb2Zmc2V0ID0KLQkJICAgIEFDUElfR1BFX1JFR0lTVEVSX1dJRFRIOwotCi0JCS8qIEluaXQgdGhlIGV2ZW50X2luZm8gZm9yIGVhY2ggR1BFIHdpdGhpbiB0aGlzIHJlZ2lzdGVyICovCi0KLQkJZm9yIChqID0gMDsgaiA8IEFDUElfR1BFX1JFR0lTVEVSX1dJRFRIOyBqKyspIHsKLQkJCXRoaXNfZXZlbnQtPmdwZV9udW1iZXIgPQotCQkJICAgICh1OCkgKHRoaXNfcmVnaXN0ZXItPmJhc2VfZ3BlX251bWJlciArIGopOwotCQkJdGhpc19ldmVudC0+cmVnaXN0ZXJfaW5mbyA9IHRoaXNfcmVnaXN0ZXI7Ci0JCQl0aGlzX2V2ZW50Kys7Ci0JCX0KLQotCQkvKiBEaXNhYmxlIGFsbCBHUEVzIHdpdGhpbiB0aGlzIHJlZ2lzdGVyICovCi0KLQkJc3RhdHVzID0gYWNwaV9od19sb3dfbGV2ZWxfd3JpdGUoQUNQSV9HUEVfUkVHSVNURVJfV0lEVEgsIDB4MDAsCi0JCQkJCQkgJnRoaXNfcmVnaXN0ZXItPgotCQkJCQkJIGVuYWJsZV9hZGRyZXNzKTsKLQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCQlnb3RvIGVycm9yX2V4aXQ7Ci0JCX0KLQotCQkvKiBDbGVhciBhbnkgcGVuZGluZyBHUEUgZXZlbnRzIHdpdGhpbiB0aGlzIHJlZ2lzdGVyICovCi0KLQkJc3RhdHVzID0gYWNwaV9od19sb3dfbGV2ZWxfd3JpdGUoQUNQSV9HUEVfUkVHSVNURVJfV0lEVEgsIDB4RkYsCi0JCQkJCQkgJnRoaXNfcmVnaXN0ZXItPgotCQkJCQkJIHN0YXR1c19hZGRyZXNzKTsKLQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCQlnb3RvIGVycm9yX2V4aXQ7Ci0JCX0KLQotCQl0aGlzX3JlZ2lzdGVyKys7Ci0JfQotCi0JcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKLQotICAgICAgZXJyb3JfZXhpdDoKLQlpZiAoZ3BlX3JlZ2lzdGVyX2luZm8pIHsKLQkJQUNQSV9GUkVFKGdwZV9yZWdpc3Rlcl9pbmZvKTsKLQl9Ci0JaWYgKGdwZV9ldmVudF9pbmZvKSB7Ci0JCUFDUElfRlJFRShncGVfZXZlbnRfaW5mbyk7Ci0JfQotCi0JcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfZXZfY3JlYXRlX2dwZV9ibG9jawotICoKLSAqIFBBUkFNRVRFUlM6ICBncGVfZGV2aWNlICAgICAgICAgIC0gSGFuZGxlIHRvIHRoZSBwYXJlbnQgR1BFIGJsb2NrCi0gKiAgICAgICAgICAgICAgZ3BlX2Jsb2NrX2FkZHJlc3MgICAtIEFkZHJlc3MgYW5kIHNwYWNlX2lECi0gKiAgICAgICAgICAgICAgcmVnaXN0ZXJfY291bnQgICAgICAtIE51bWJlciBvZiBHUEUgcmVnaXN0ZXIgcGFpcnMgaW4gdGhlIGJsb2NrCi0gKiAgICAgICAgICAgICAgZ3BlX2Jsb2NrX2Jhc2VfbnVtYmVyIC0gU3RhcnRpbmcgR1BFIG51bWJlciBmb3IgdGhlIGJsb2NrCi0gKiAgICAgICAgICAgICAgaW50ZXJydXB0X251bWJlciAgICAtIEgvVyBpbnRlcnJ1cHQgZm9yIHRoZSBibG9jawotICogICAgICAgICAgICAgIHJldHVybl9ncGVfYmxvY2sgICAgLSBXaGVyZSB0aGUgbmV3IGJsb2NrIGRlc2NyaXB0b3IgaXMgcmV0dXJuZWQKLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IENyZWF0ZSBhbmQgSW5zdGFsbCBhIGJsb2NrIG9mIEdQRSByZWdpc3RlcnMuIEFsbCBHUEVzIHdpdGhpbgotICogICAgICAgICAgICAgIHRoZSBibG9jayBhcmUgZGlzYWJsZWQgYXQgZXhpdC4KLSAqICAgICAgICAgICAgICBOb3RlOiBBc3N1bWVzIG5hbWVzcGFjZSBpcyBsb2NrZWQuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotYWNwaV9zdGF0dXMKLWFjcGlfZXZfY3JlYXRlX2dwZV9ibG9jayhzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqZ3BlX2RldmljZSwKLQkJCSBzdHJ1Y3QgYWNwaV9nZW5lcmljX2FkZHJlc3MgKmdwZV9ibG9ja19hZGRyZXNzLAotCQkJIHUzMiByZWdpc3Rlcl9jb3VudCwKLQkJCSB1OCBncGVfYmxvY2tfYmFzZV9udW1iZXIsCi0JCQkgdTMyIGludGVycnVwdF9udW1iZXIsCi0JCQkgc3RydWN0IGFjcGlfZ3BlX2Jsb2NrX2luZm8gKipyZXR1cm5fZ3BlX2Jsb2NrKQotewotCWFjcGlfc3RhdHVzIHN0YXR1czsKLQlzdHJ1Y3QgYWNwaV9ncGVfYmxvY2tfaW5mbyAqZ3BlX2Jsb2NrOwotCi0JQUNQSV9GVU5DVElPTl9UUkFDRShldl9jcmVhdGVfZ3BlX2Jsb2NrKTsKLQotCWlmICghcmVnaXN0ZXJfY291bnQpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKLQl9Ci0KLQkvKiBBbGxvY2F0ZSBhIG5ldyBHUEUgYmxvY2sgKi8KLQotCWdwZV9ibG9jayA9IEFDUElfQUxMT0NBVEVfWkVST0VEKHNpemVvZihzdHJ1Y3QgYWNwaV9ncGVfYmxvY2tfaW5mbykpOwotCWlmICghZ3BlX2Jsb2NrKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT19NRU1PUlkpOwotCX0KLQotCS8qIEluaXRpYWxpemUgdGhlIG5ldyBHUEUgYmxvY2sgKi8KLQotCWdwZV9ibG9jay0+bm9kZSA9IGdwZV9kZXZpY2U7Ci0JZ3BlX2Jsb2NrLT5yZWdpc3Rlcl9jb3VudCA9IHJlZ2lzdGVyX2NvdW50OwotCWdwZV9ibG9jay0+YmxvY2tfYmFzZV9udW1iZXIgPSBncGVfYmxvY2tfYmFzZV9udW1iZXI7Ci0KLQlBQ1BJX01FTUNQWSgmZ3BlX2Jsb2NrLT5ibG9ja19hZGRyZXNzLCBncGVfYmxvY2tfYWRkcmVzcywKLQkJICAgIHNpemVvZihzdHJ1Y3QgYWNwaV9nZW5lcmljX2FkZHJlc3MpKTsKLQotCS8qCi0JICogQ3JlYXRlIHRoZSByZWdpc3Rlcl9pbmZvIGFuZCBldmVudF9pbmZvIHN1Yi1zdHJ1Y3R1cmVzCi0JICogTm90ZTogZGlzYWJsZXMgYW5kIGNsZWFycyBhbGwgR1BFcyBpbiB0aGUgYmxvY2sKLQkgKi8KLQlzdGF0dXMgPSBhY3BpX2V2X2NyZWF0ZV9ncGVfaW5mb19ibG9ja3MoZ3BlX2Jsb2NrKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJQUNQSV9GUkVFKGdwZV9ibG9jayk7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotCX0KLQotCS8qIEluc3RhbGwgdGhlIG5ldyBibG9jayBpbiB0aGUgZ2xvYmFsIGxpc3RzICovCi0KLQlzdGF0dXMgPSBhY3BpX2V2X2luc3RhbGxfZ3BlX2Jsb2NrKGdwZV9ibG9jaywgaW50ZXJydXB0X251bWJlcik7Ci0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCUFDUElfRlJFRShncGVfYmxvY2spOwotCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLQl9Ci0KLQkvKiBGaW5kIGFsbCBHUEUgbWV0aG9kcyAoX0x4eCwgX0V4eCkgZm9yIHRoaXMgYmxvY2sgKi8KLQotCXN0YXR1cyA9IGFjcGlfbnNfd2Fsa19uYW1lc3BhY2UoQUNQSV9UWVBFX01FVEhPRCwgZ3BlX2RldmljZSwKLQkJCQkJQUNQSV9VSU5UMzJfTUFYLCBBQ1BJX05TX1dBTEtfTk9fVU5MT0NLLAotCQkJCQlhY3BpX2V2X3NhdmVfbWV0aG9kX2luZm8sIGdwZV9ibG9jaywKLQkJCQkJTlVMTCk7Ci0KLQkvKiBSZXR1cm4gdGhlIG5ldyBibG9jayAqLwotCi0JaWYgKHJldHVybl9ncGVfYmxvY2spIHsKLQkJKCpyZXR1cm5fZ3BlX2Jsb2NrKSA9IGdwZV9ibG9jazsKLQl9Ci0KLQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lOSVQsCi0JCQkgICJHUEUgJTAyWCB0byAlMDJYIFslNC40c10gJXUgcmVncyBvbiBpbnQgMHglWFxuIiwKLQkJCSAgKHUzMikgZ3BlX2Jsb2NrLT5ibG9ja19iYXNlX251bWJlciwKLQkJCSAgKHUzMikgKGdwZV9ibG9jay0+YmxvY2tfYmFzZV9udW1iZXIgKwotCQkJCSAoKGdwZV9ibG9jay0+cmVnaXN0ZXJfY291bnQgKgotCQkJCSAgIEFDUElfR1BFX1JFR0lTVEVSX1dJRFRIKSAtIDEpKSwKLQkJCSAgZ3BlX2RldmljZS0+bmFtZS5hc2NpaSwgZ3BlX2Jsb2NrLT5yZWdpc3Rlcl9jb3VudCwKLQkJCSAgaW50ZXJydXB0X251bWJlcikpOwotCi0JcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9ldl9pbml0aWFsaXplX2dwZV9ibG9jawotICoKLSAqIFBBUkFNRVRFUlM6ICBncGVfZGV2aWNlICAgICAgICAgIC0gSGFuZGxlIHRvIHRoZSBwYXJlbnQgR1BFIGJsb2NrCi0gKiAgICAgICAgICAgICAgZ3BlX2Jsb2NrICAgICAgICAgICAtIEdwZSBCbG9jayBpbmZvCi0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cwotICoKLSAqIERFU0NSSVBUSU9OOiBJbml0aWFsaXplIGFuZCBlbmFibGUgYSBHUEUgYmxvY2suIEZpcnN0IGZpbmQgYW5kIHJ1biBhbnkKLSAqICAgICAgICAgICAgICBfUFJUIG1ldGhvZHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBibG9jaywgdGhlbiBlbmFibGUgdGhlCi0gKiAgICAgICAgICAgICAgYXBwcm9wcmlhdGUgR1BFcy4KLSAqICAgICAgICAgICAgICBOb3RlOiBBc3N1bWVzIG5hbWVzcGFjZSBpcyBsb2NrZWQuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotYWNwaV9zdGF0dXMKLWFjcGlfZXZfaW5pdGlhbGl6ZV9ncGVfYmxvY2soc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKmdwZV9kZXZpY2UsCi0JCQkgICAgIHN0cnVjdCBhY3BpX2dwZV9ibG9ja19pbmZvICpncGVfYmxvY2spCi17Ci0JYWNwaV9zdGF0dXMgc3RhdHVzOwotCXN0cnVjdCBhY3BpX2dwZV9ldmVudF9pbmZvICpncGVfZXZlbnRfaW5mbzsKLQlzdHJ1Y3QgYWNwaV9ncGVfd2Fsa19pbmZvIGdwZV9pbmZvOwotCXUzMiB3YWtlX2dwZV9jb3VudDsKLQl1MzIgZ3BlX2VuYWJsZWRfY291bnQ7Ci0JdTMyIGk7Ci0JdTMyIGo7Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGV2X2luaXRpYWxpemVfZ3BlX2Jsb2NrKTsKLQotCS8qIElnbm9yZSBhIG51bGwgR1BFIGJsb2NrIChlLmcuLCBpZiBubyBHUEUgYmxvY2sgMSBleGlzdHMpICovCi0KLQlpZiAoIWdwZV9ibG9jaykgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwotCX0KLQotCS8qCi0JICogUnVudGltZSBvcHRpb246IFNob3VsZCB3YWtlIEdQRXMgYmUgZW5hYmxlZCBhdCBydW50aW1lPyAgVGhlIGRlZmF1bHQKLQkgKiBpcyBubywgdGhleSBzaG91bGQgb25seSBiZSBlbmFibGVkIGp1c3QgYXMgdGhlIG1hY2hpbmUgZ29lcyB0byBzbGVlcC4KLQkgKi8KLQlpZiAoYWNwaV9nYmxfbGVhdmVfd2FrZV9ncGVzX2Rpc2FibGVkKSB7Ci0JCS8qCi0JCSAqIERpZmZlcmVudGlhdGUgcnVudGltZSB2cyB3YWtlIEdQRXMsIHZpYSB0aGUgX1BSVyBjb250cm9sIG1ldGhvZHMuCi0JCSAqIEVhY2ggR1BFIHRoYXQgaGFzIG9uZSBvciBtb3JlIF9QUldzIHRoYXQgcmVmZXJlbmNlIGl0IGlzIGJ5Ci0JCSAqIGRlZmluaXRpb24gYSB3YWtlIEdQRSBhbmQgd2lsbCBub3QgYmUgZW5hYmxlZCB3aGlsZSB0aGUgbWFjaGluZQotCQkgKiBpcyBydW5uaW5nLgotCQkgKi8KLQkJZ3BlX2luZm8uZ3BlX2Jsb2NrID0gZ3BlX2Jsb2NrOwotCQlncGVfaW5mby5ncGVfZGV2aWNlID0gZ3BlX2RldmljZTsKLQotCQlzdGF0dXMgPQotCQkgICAgYWNwaV9uc193YWxrX25hbWVzcGFjZShBQ1BJX1RZUEVfREVWSUNFLCBBQ1BJX1JPT1RfT0JKRUNULAotCQkJCQkgICBBQ1BJX1VJTlQzMl9NQVgsIEFDUElfTlNfV0FMS19VTkxPQ0ssCi0JCQkJCSAgIGFjcGlfZXZfbWF0Y2hfcHJ3X2FuZF9ncGUsICZncGVfaW5mbywKLQkJCQkJICAgTlVMTCk7Ci0JfQotCi0JLyoKLQkgKiBFbmFibGUgYWxsIEdQRXMgaW4gdGhpcyBibG9jayB0aGF0IGhhdmUgdGhlc2UgYXR0cmlidXRlczoKLQkgKiAxKSBhcmUgInJ1bnRpbWUiIG9yICJydW4vd2FrZSIgR1BFcywgYW5kCi0JICogMikgaGF2ZSBhIGNvcnJlc3BvbmRpbmcgX0x4eCBvciBfRXh4IG1ldGhvZAotCSAqCi0JICogQW55IG90aGVyIEdQRXMgd2l0aGluIHRoaXMgYmxvY2sgbXVzdCBiZSBlbmFibGVkIHZpYSB0aGUgYWNwaV9lbmFibGVfZ3BlKCkKLQkgKiBleHRlcm5hbCBpbnRlcmZhY2UuCi0JICovCi0Jd2FrZV9ncGVfY291bnQgPSAwOwotCWdwZV9lbmFibGVkX2NvdW50ID0gMDsKLQotCWZvciAoaSA9IDA7IGkgPCBncGVfYmxvY2stPnJlZ2lzdGVyX2NvdW50OyBpKyspIHsKLQkJZm9yIChqID0gMDsgaiA8IDg7IGorKykgewotCi0JCQkvKiBHZXQgdGhlIGluZm8gYmxvY2sgZm9yIHRoaXMgcGFydGljdWxhciBHUEUgKi8KLQotCQkJZ3BlX2V2ZW50X2luZm8gPQotCQkJICAgICZncGVfYmxvY2stPgotCQkJICAgIGV2ZW50X2luZm9bKChhY3BpX3NpemUpIGkgKgotCQkJCQlBQ1BJX0dQRV9SRUdJU1RFUl9XSURUSCkgKyBqXTsKLQotCQkJaWYgKCgoZ3BlX2V2ZW50X2luZm8tPmZsYWdzICYgQUNQSV9HUEVfRElTUEFUQ0hfTUFTSykgPT0KLQkJCSAgICAgQUNQSV9HUEVfRElTUEFUQ0hfTUVUSE9EKQotCQkJICAgICYmIChncGVfZXZlbnRfaW5mby0+ZmxhZ3MgJiBBQ1BJX0dQRV9UWVBFX1JVTlRJTUUpKSB7Ci0JCQkJZ3BlX2VuYWJsZWRfY291bnQrKzsKLQkJCX0KLQotCQkJaWYgKGdwZV9ldmVudF9pbmZvLT5mbGFncyAmIEFDUElfR1BFX1RZUEVfV0FLRSkgewotCQkJCXdha2VfZ3BlX2NvdW50Kys7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lOSVQsCi0JCQkgICJGb3VuZCAldSBXYWtlLCBFbmFibGVkICV1IFJ1bnRpbWUgR1BFcyBpbiB0aGlzIGJsb2NrXG4iLAotCQkJICB3YWtlX2dwZV9jb3VudCwgZ3BlX2VuYWJsZWRfY291bnQpKTsKLQotCS8qIEVuYWJsZSBhbGwgdmFsaWQgcnVudGltZSBHUEVzIGZvdW5kIGFib3ZlICovCi0KLQlzdGF0dXMgPSBhY3BpX2h3X2VuYWJsZV9ydW50aW1lX2dwZV9ibG9jayhOVUxMLCBncGVfYmxvY2spOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlBQ1BJX0VSUk9SKChBRV9JTkZPLCAiQ291bGQgbm90IGVuYWJsZSBHUEVzIGluIEdwZUJsb2NrICVwIiwKLQkJCSAgICBncGVfYmxvY2spKTsKLQl9Ci0KLQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9ldl9ncGVfaW5pdGlhbGl6ZQotICoKLSAqIFBBUkFNRVRFUlM6ICBOb25lCi0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cwotICoKLSAqIERFU0NSSVBUSU9OOiBJbml0aWFsaXplIHRoZSBHUEUgZGF0YSBzdHJ1Y3R1cmVzCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotYWNwaV9zdGF0dXMgYWNwaV9ldl9ncGVfaW5pdGlhbGl6ZSh2b2lkKQotewotCXUzMiByZWdpc3Rlcl9jb3VudDAgPSAwOwotCXUzMiByZWdpc3Rlcl9jb3VudDEgPSAwOwotCXUzMiBncGVfbnVtYmVyX21heCA9IDA7Ci0JYWNwaV9zdGF0dXMgc3RhdHVzOwotCi0JQUNQSV9GVU5DVElPTl9UUkFDRShldl9ncGVfaW5pdGlhbGl6ZSk7Ci0KLQlzdGF0dXMgPSBhY3BpX3V0X2FjcXVpcmVfbXV0ZXgoQUNQSV9NVFhfTkFNRVNQQUNFKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci0JfQotCi0JLyoKLQkgKiBJbml0aWFsaXplIHRoZSBHUEUgQmxvY2socykgZGVmaW5lZCBpbiB0aGUgRkFEVAotCSAqCi0JICogV2h5IHRoZSBHUEUgcmVnaXN0ZXIgYmxvY2sgbGVuZ3RocyBhcmUgZGl2aWRlZCBieSAyOiAgRnJvbSB0aGUgQUNQSSBTcGVjLAotCSAqIHNlY3Rpb24gIkdlbmVyYWwtUHVycG9zZSBFdmVudCBSZWdpc3RlcnMiLCB3ZSBoYXZlOgotCSAqCi0JICogIkVhY2ggcmVnaXN0ZXIgYmxvY2sgY29udGFpbnMgdHdvIHJlZ2lzdGVycyBvZiBlcXVhbCBsZW5ndGgKLQkgKiAgR1BFeF9TVFMgYW5kIEdQRXhfRU4gKHdoZXJlIHggaXMgMCBvciAxKS4gVGhlIGxlbmd0aCBvZiB0aGUKLQkgKiAgR1BFMF9TVFMgYW5kIEdQRTBfRU4gcmVnaXN0ZXJzIGlzIGVxdWFsIHRvIGhhbGYgdGhlIEdQRTBfTEVOCi0JICogIFRoZSBsZW5ndGggb2YgdGhlIEdQRTFfU1RTIGFuZCBHUEUxX0VOIHJlZ2lzdGVycyBpcyBlcXVhbCB0bwotCSAqICBoYWxmIHRoZSBHUEUxX0xFTi4gSWYgYSBnZW5lcmljIHJlZ2lzdGVyIGJsb2NrIGlzIG5vdCBzdXBwb3J0ZWQKLQkgKiAgdGhlbiBpdHMgcmVzcGVjdGl2ZSBibG9jayBwb2ludGVyIGFuZCBibG9jayBsZW5ndGggdmFsdWVzIGluIHRoZQotCSAqICBGQURUIHRhYmxlIGNvbnRhaW4gemVyb3MuIFRoZSBHUEUwX0xFTiBhbmQgR1BFMV9MRU4gZG8gbm90IG5lZWQKLQkgKiAgdG8gYmUgdGhlIHNhbWUgc2l6ZS4iCi0JICovCi0KLQkvKgotCSAqIERldGVybWluZSB0aGUgbWF4aW11bSBHUEUgbnVtYmVyIGZvciB0aGlzIG1hY2hpbmUuCi0JICoKLQkgKiBOb3RlOiBib3RoIEdQRTAgYW5kIEdQRTEgYXJlIG9wdGlvbmFsLCBhbmQgZWl0aGVyIGNhbiBleGlzdCB3aXRob3V0Ci0JICogdGhlIG90aGVyLgotCSAqCi0JICogSWYgRUlUSEVSIHRoZSByZWdpc3RlciBsZW5ndGggT1IgdGhlIGJsb2NrIGFkZHJlc3MgYXJlIHplcm8sIHRoZW4gdGhhdAotCSAqIHBhcnRpY3VsYXIgYmxvY2sgaXMgbm90IHN1cHBvcnRlZC4KLQkgKi8KLQlpZiAoYWNwaV9nYmxfRkFEVC5ncGUwX2Jsb2NrX2xlbmd0aCAmJgotCSAgICBhY3BpX2dibF9GQURULnhncGUwX2Jsb2NrLmFkZHJlc3MpIHsKLQotCQkvKiBHUEUgYmxvY2sgMCBleGlzdHMgKGhhcyBib3RoIGxlbmd0aCBhbmQgYWRkcmVzcyA+IDApICovCi0KLQkJcmVnaXN0ZXJfY291bnQwID0gKHUxNikgKGFjcGlfZ2JsX0ZBRFQuZ3BlMF9ibG9ja19sZW5ndGggLyAyKTsKLQotCQlncGVfbnVtYmVyX21heCA9Ci0JCSAgICAocmVnaXN0ZXJfY291bnQwICogQUNQSV9HUEVfUkVHSVNURVJfV0lEVEgpIC0gMTsKLQotCQkvKiBJbnN0YWxsIEdQRSBCbG9jayAwICovCi0KLQkJc3RhdHVzID0gYWNwaV9ldl9jcmVhdGVfZ3BlX2Jsb2NrKGFjcGlfZ2JsX2ZhZHRfZ3BlX2RldmljZSwKLQkJCQkJCSAgJmFjcGlfZ2JsX0ZBRFQueGdwZTBfYmxvY2ssCi0JCQkJCQkgIHJlZ2lzdGVyX2NvdW50MCwgMCwKLQkJCQkJCSAgYWNwaV9nYmxfRkFEVC5zY2lfaW50ZXJydXB0LAotCQkJCQkJICAmYWNwaV9nYmxfZ3BlX2ZhZHRfYmxvY2tzWzBdKTsKLQotCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJCUFDUElfRVhDRVBUSU9OKChBRV9JTkZPLCBzdGF0dXMsCi0JCQkJCSJDb3VsZCBub3QgY3JlYXRlIEdQRSBCbG9jayAwIikpOwotCQl9Ci0JfQotCi0JaWYgKGFjcGlfZ2JsX0ZBRFQuZ3BlMV9ibG9ja19sZW5ndGggJiYKLQkgICAgYWNwaV9nYmxfRkFEVC54Z3BlMV9ibG9jay5hZGRyZXNzKSB7Ci0KLQkJLyogR1BFIGJsb2NrIDEgZXhpc3RzIChoYXMgYm90aCBsZW5ndGggYW5kIGFkZHJlc3MgPiAwKSAqLwotCi0JCXJlZ2lzdGVyX2NvdW50MSA9ICh1MTYpIChhY3BpX2dibF9GQURULmdwZTFfYmxvY2tfbGVuZ3RoIC8gMik7Ci0KLQkJLyogQ2hlY2sgZm9yIEdQRTAvR1BFMSBvdmVybGFwIChpZiBib3RoIGJhbmtzIGV4aXN0KSAqLwotCi0JCWlmICgocmVnaXN0ZXJfY291bnQwKSAmJgotCQkgICAgKGdwZV9udW1iZXJfbWF4ID49IGFjcGlfZ2JsX0ZBRFQuZ3BlMV9iYXNlKSkgewotCQkJQUNQSV9FUlJPUigoQUVfSU5GTywKLQkJCQkgICAgIkdQRTAgYmxvY2sgKEdQRSAwIHRvICVkKSBvdmVybGFwcyB0aGUgR1BFMSBibG9jayAoR1BFICVkIHRvICVkKSAtIElnbm9yaW5nIEdQRTEiLAotCQkJCSAgICBncGVfbnVtYmVyX21heCwgYWNwaV9nYmxfRkFEVC5ncGUxX2Jhc2UsCi0JCQkJICAgIGFjcGlfZ2JsX0ZBRFQuZ3BlMV9iYXNlICsKLQkJCQkgICAgKChyZWdpc3Rlcl9jb3VudDEgKgotCQkJCSAgICAgIEFDUElfR1BFX1JFR0lTVEVSX1dJRFRIKSAtIDEpKSk7Ci0KLQkJCS8qIElnbm9yZSBHUEUxIGJsb2NrIGJ5IHNldHRpbmcgdGhlIHJlZ2lzdGVyIGNvdW50IHRvIHplcm8gKi8KLQotCQkJcmVnaXN0ZXJfY291bnQxID0gMDsKLQkJfSBlbHNlIHsKLQkJCS8qIEluc3RhbGwgR1BFIEJsb2NrIDEgKi8KLQotCQkJc3RhdHVzID0KLQkJCSAgICBhY3BpX2V2X2NyZWF0ZV9ncGVfYmxvY2soYWNwaV9nYmxfZmFkdF9ncGVfZGV2aWNlLAotCQkJCQkJICAgICAmYWNwaV9nYmxfRkFEVC54Z3BlMV9ibG9jaywKLQkJCQkJCSAgICAgcmVnaXN0ZXJfY291bnQxLAotCQkJCQkJICAgICBhY3BpX2dibF9GQURULmdwZTFfYmFzZSwKLQkJCQkJCSAgICAgYWNwaV9nYmxfRkFEVC4KLQkJCQkJCSAgICAgc2NpX2ludGVycnVwdCwKLQkJCQkJCSAgICAgJmFjcGlfZ2JsX2dwZV9mYWR0X2Jsb2NrcwotCQkJCQkJICAgICBbMV0pOwotCi0JCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJCQlBQ1BJX0VYQ0VQVElPTigoQUVfSU5GTywgc3RhdHVzLAotCQkJCQkJIkNvdWxkIG5vdCBjcmVhdGUgR1BFIEJsb2NrIDEiKSk7Ci0JCQl9Ci0KLQkJCS8qCi0JCQkgKiBHUEUwIGFuZCBHUEUxIGRvIG5vdCBoYXZlIHRvIGJlIGNvbnRpZ3VvdXMgaW4gdGhlIEdQRSBudW1iZXIKLQkJCSAqIHNwYWNlLiBIb3dldmVyLCBHUEUwIGFsd2F5cyBzdGFydHMgYXQgR1BFIG51bWJlciB6ZXJvLgotCQkJICovCi0JCQlncGVfbnVtYmVyX21heCA9IGFjcGlfZ2JsX0ZBRFQuZ3BlMV9iYXNlICsKLQkJCSAgICAoKHJlZ2lzdGVyX2NvdW50MSAqIEFDUElfR1BFX1JFR0lTVEVSX1dJRFRIKSAtIDEpOwotCQl9Ci0JfQotCi0JLyogRXhpdCBpZiB0aGVyZSBhcmUgbm8gR1BFIHJlZ2lzdGVycyAqLwotCi0JaWYgKChyZWdpc3Rlcl9jb3VudDAgKyByZWdpc3Rlcl9jb3VudDEpID09IDApIHsKLQotCQkvKiBHUEVzIGFyZSBub3QgcmVxdWlyZWQgYnkgQUNQSSwgdGhpcyBpcyBPSyAqLwotCi0JCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5JVCwKLQkJCQkgICJUaGVyZSBhcmUgbm8gR1BFIGJsb2NrcyBkZWZpbmVkIGluIHRoZSBGQURUXG4iKSk7Ci0JCXN0YXR1cyA9IEFFX09LOwotCQlnb3RvIGNsZWFudXA7Ci0JfQotCi0JLyogQ2hlY2sgZm9yIE1heCBHUEUgbnVtYmVyIG91dC1vZi1yYW5nZSAqLwotCi0JaWYgKGdwZV9udW1iZXJfbWF4ID4gQUNQSV9HUEVfTUFYKSB7Ci0JCUFDUElfRVJST1IoKEFFX0lORk8sCi0JCQkgICAgIk1heGltdW0gR1BFIG51bWJlciBmcm9tIEZBRFQgaXMgdG9vIGxhcmdlOiAweCVYIiwKLQkJCSAgICBncGVfbnVtYmVyX21heCkpOwotCQlzdGF0dXMgPSBBRV9CQURfVkFMVUU7Ci0JCWdvdG8gY2xlYW51cDsKLQl9Ci0KLSAgICAgIGNsZWFudXA6Ci0JKHZvaWQpYWNwaV91dF9yZWxlYXNlX211dGV4KEFDUElfTVRYX05BTUVTUEFDRSk7Ci0JcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9ldmVudHMvZXZtaXNjLmMgYi9kcml2ZXJzL2FjcGkvZXZlbnRzL2V2bWlzYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDU2NzBiLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvYWNwaS9ldmVudHMvZXZtaXNjLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2MzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIE1vZHVsZSBOYW1lOiBldm1pc2MgLSBNaXNjZWxsYW5lb3VzIGV2ZW50IG1hbmFnZXIgc3VwcG9ydCBmdW5jdGlvbnMKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA4LCBJbnRlbCBDb3JwLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAotICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgYXQgbWluaW11bSBhIGRpc2NsYWltZXIKLSAqICAgIHN1YnN0YW50aWFsbHkgc2ltaWxhciB0byB0aGUgIk5PIFdBUlJBTlRZIiBkaXNjbGFpbWVyIGJlbG93Ci0gKiAgICAoIkRpc2NsYWltZXIiKSBhbmQgYW55IHJlZGlzdHJpYnV0aW9uIG11c3QgYmUgY29uZGl0aW9uZWQgdXBvbgotICogICAgaW5jbHVkaW5nIGEgc3Vic3RhbnRpYWxseSBzaW1pbGFyIERpc2NsYWltZXIgcmVxdWlyZW1lbnQgZm9yIGZ1cnRoZXIKLSAqICAgIGJpbmFyeSByZWRpc3RyaWJ1dGlvbi4KLSAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcwotICogICAgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICogU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBOTyBXQVJSQU5UWQotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCi0gKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUwotICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcKLSAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQotICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgotICovCi0KLSNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KLSNpbmNsdWRlIDxhY3BpL2FjZXZlbnRzLmg+Ci0jaW5jbHVkZSA8YWNwaS9hY25hbWVzcC5oPgotI2luY2x1ZGUgPGFjcGkvYWNpbnRlcnAuaD4KLQotI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfRVZFTlRTCi1BQ1BJX01PRFVMRV9OQU1FKCJldm1pc2MiKQotCi0vKiBQb2ludGVyIHRvIEZBQ1MgbmVlZGVkIGZvciB0aGUgR2xvYmFsIExvY2sgKi8KLXN0YXRpYyBzdHJ1Y3QgYWNwaV90YWJsZV9mYWNzICpmYWNzID0gTlVMTDsKLQotLyogTG9jYWwgcHJvdG90eXBlcyAqLwotCi1zdGF0aWMgdm9pZCBBQ1BJX1NZU1RFTV9YRkFDRSBhY3BpX2V2X25vdGlmeV9kaXNwYXRjaCh2b2lkICpjb250ZXh0KTsKLQotc3RhdGljIHUzMiBhY3BpX2V2X2dsb2JhbF9sb2NrX2hhbmRsZXIodm9pZCAqY29udGV4dCk7Ci0KLXN0YXRpYyBhY3BpX3N0YXR1cyBhY3BpX2V2X3JlbW92ZV9nbG9iYWxfbG9ja19oYW5kbGVyKHZvaWQpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX2V2X2lzX25vdGlmeV9vYmplY3QKLSAqCi0gKiBQQVJBTUVURVJTOiAgTm9kZSAgICAgICAgICAgIC0gTm9kZSB0byBjaGVjawotICoKLSAqIFJFVFVSTjogICAgICBUUlVFIGlmIG5vdGlmaWVzIGFsbG93ZWQgb24gdGhpcyBvYmplY3QKLSAqCi0gKiBERVNDUklQVElPTjogQ2hlY2sgdHlwZSBvZiBub2RlIGZvciBhIG9iamVjdCB0aGF0IHN1cHBvcnRzIG5vdGlmaWVzLgotICoKLSAqICAgICAgICAgICAgICBUQkQ6IFRoaXMgY291bGQgYmUgcmVwbGFjZWQgYnkgYSBmbGFnIGJpdCBpbiB0aGUgbm9kZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi11OCBhY3BpX2V2X2lzX25vdGlmeV9vYmplY3Qoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGUpCi17Ci0Jc3dpdGNoIChub2RlLT50eXBlKSB7Ci0JY2FzZSBBQ1BJX1RZUEVfREVWSUNFOgotCWNhc2UgQUNQSV9UWVBFX1BST0NFU1NPUjoKLQljYXNlIEFDUElfVFlQRV9USEVSTUFMOgotCQkvKgotCQkgKiBUaGVzZSBhcmUgdGhlIE9OTFkgb2JqZWN0cyB0aGF0IGNhbiByZWNlaXZlIEFDUEkgbm90aWZpY2F0aW9ucwotCQkgKi8KLQkJcmV0dXJuIChUUlVFKTsKLQotCWRlZmF1bHQ6Ci0JCXJldHVybiAoRkFMU0UpOwotCX0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9ldl9xdWV1ZV9ub3RpZnlfcmVxdWVzdAotICoKLSAqIFBBUkFNRVRFUlM6ICBOb2RlICAgICAgICAgICAgLSBOUyBub2RlIGZvciB0aGUgbm90aWZpZWQgb2JqZWN0Ci0gKiAgICAgICAgICAgICAgbm90aWZ5X3ZhbHVlICAgIC0gVmFsdWUgZnJvbSB0aGUgTm90aWZ5KCkgcmVxdWVzdAotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKLSAqCi0gKiBERVNDUklQVElPTjogRGlzcGF0Y2ggYSBkZXZpY2Ugbm90aWZpY2F0aW9uIGV2ZW50IHRvIGEgcHJldmlvdXNseQotICogICAgICAgICAgICAgIGluc3RhbGxlZCBoYW5kbGVyLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWFjcGlfc3RhdHVzCi1hY3BpX2V2X3F1ZXVlX25vdGlmeV9yZXF1ZXN0KHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICogbm9kZSwKLQkJCSAgICAgdTMyIG5vdGlmeV92YWx1ZSkKLXsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYzsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpoYW5kbGVyX29iaiA9IE5VTEw7Ci0JdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICpub3RpZnlfaW5mbzsKLQlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKLQotCUFDUElfRlVOQ1RJT05fTkFNRShldl9xdWV1ZV9ub3RpZnlfcmVxdWVzdCk7Ci0KLQkvKgotCSAqIEZvciB2YWx1ZSAzIChFamVjdGlvbiBSZXF1ZXN0KSwgc29tZSBkZXZpY2UgbWV0aG9kIG1heSBuZWVkIHRvIGJlIHJ1bi4KLQkgKiBGb3IgdmFsdWUgMiAoRGV2aWNlIFdha2UpIGlmIF9QUlcgZXhpc3RzLCB0aGUgX1BTMCBtZXRob2QgbWF5IG5lZWQKLQkgKiAgIHRvIGJlIHJ1bi4KLQkgKiBGb3IgdmFsdWUgMHg4MCAoU3RhdHVzIENoYW5nZSkgb24gdGhlIHBvd2VyIGJ1dHRvbiBvciBzbGVlcCBidXR0b24sCi0JICogICBpbml0aWF0ZSBzb2Z0LW9mZiBvciBzbGVlcCBvcGVyYXRpb24/Ci0JICovCi0JQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLAotCQkJICAiRGlzcGF0Y2hpbmcgTm90aWZ5IG9uIFslNC40c10gTm9kZSAlcCBWYWx1ZSAweCUyLjJYICglcylcbiIsCi0JCQkgIGFjcGlfdXRfZ2V0X25vZGVfbmFtZShub2RlKSwgbm9kZSwgbm90aWZ5X3ZhbHVlLAotCQkJICBhY3BpX3V0X2dldF9ub3RpZnlfbmFtZShub3RpZnlfdmFsdWUpKSk7Ci0KLQkvKiBHZXQgdGhlIG5vdGlmeSBvYmplY3QgYXR0YWNoZWQgdG8gdGhlIE5TIE5vZGUgKi8KLQotCW9ial9kZXNjID0gYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0KG5vZGUpOwotCWlmIChvYmpfZGVzYykgewotCi0JCS8qIFdlIGhhdmUgdGhlIG5vdGlmeSBvYmplY3QsIEdldCB0aGUgcmlnaHQgaGFuZGxlciAqLwotCi0JCXN3aXRjaCAobm9kZS0+dHlwZSkgewotCi0JCQkvKiBOb3RpZnkgYWxsb3dlZCBvbmx5IG9uIHRoZXNlIHR5cGVzICovCi0KLQkJY2FzZSBBQ1BJX1RZUEVfREVWSUNFOgotCQljYXNlIEFDUElfVFlQRV9USEVSTUFMOgotCQljYXNlIEFDUElfVFlQRV9QUk9DRVNTT1I6Ci0KLQkJCWlmIChub3RpZnlfdmFsdWUgPD0gQUNQSV9NQVhfU1lTX05PVElGWSkgewotCQkJCWhhbmRsZXJfb2JqID0KLQkJCQkgICAgb2JqX2Rlc2MtPmNvbW1vbl9ub3RpZnkuc3lzdGVtX25vdGlmeTsKLQkJCX0gZWxzZSB7Ci0JCQkJaGFuZGxlcl9vYmogPQotCQkJCSAgICBvYmpfZGVzYy0+Y29tbW9uX25vdGlmeS5kZXZpY2Vfbm90aWZ5OwotCQkJfQotCQkJYnJlYWs7Ci0KLQkJZGVmYXVsdDoKLQkJCS8qIEFsbCBvdGhlciB0eXBlcyBhcmUgbm90IHN1cHBvcnRlZCAqLwotCQkJcmV0dXJuIChBRV9UWVBFKTsKLQkJfQotCX0KLQotCS8qCi0JICogSWYgdGhlcmUgaXMgYW55IGhhbmRsZXIgdG8gcnVuLCBzY2hlZHVsZSB0aGUgZGlzcGF0Y2hlci4KLQkgKiBDaGVjayBmb3I6Ci0JICogMSkgR2xvYmFsIHN5c3RlbSBub3RpZnkgaGFuZGxlcgotCSAqIDIpIEdsb2JhbCBkZXZpY2Ugbm90aWZ5IGhhbmRsZXIKLQkgKiAzKSBQZXItZGV2aWNlIG5vdGlmeSBoYW5kbGVyCi0JICovCi0JaWYgKChhY3BpX2dibF9zeXN0ZW1fbm90aWZ5LmhhbmRsZXIKLQkgICAgICYmIChub3RpZnlfdmFsdWUgPD0gQUNQSV9NQVhfU1lTX05PVElGWSkpCi0JICAgIHx8IChhY3BpX2dibF9kZXZpY2Vfbm90aWZ5LmhhbmRsZXIKLQkJJiYgKG5vdGlmeV92YWx1ZSA+IEFDUElfTUFYX1NZU19OT1RJRlkpKSB8fCBoYW5kbGVyX29iaikgewotCQlub3RpZnlfaW5mbyA9IGFjcGlfdXRfY3JlYXRlX2dlbmVyaWNfc3RhdGUoKTsKLQkJaWYgKCFub3RpZnlfaW5mbykgewotCQkJcmV0dXJuIChBRV9OT19NRU1PUlkpOwotCQl9Ci0KLQkJaWYgKCFoYW5kbGVyX29iaikgewotCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLAotCQkJCQkgICJFeGVjdXRpbmcgc3lzdGVtIG5vdGlmeSBoYW5kbGVyIGZvciBOb3RpZnkgKCU0LjRzLCAlWCkgbm9kZSAlcFxuIiwKLQkJCQkJICBhY3BpX3V0X2dldF9ub2RlX25hbWUobm9kZSksCi0JCQkJCSAgbm90aWZ5X3ZhbHVlLCBub2RlKSk7Ci0JCX0KLQotCQlub3RpZnlfaW5mby0+Y29tbW9uLmRlc2NyaXB0b3JfdHlwZSA9Ci0JCSAgICBBQ1BJX0RFU0NfVFlQRV9TVEFURV9OT1RJRlk7Ci0JCW5vdGlmeV9pbmZvLT5ub3RpZnkubm9kZSA9IG5vZGU7Ci0JCW5vdGlmeV9pbmZvLT5ub3RpZnkudmFsdWUgPSAodTE2KSBub3RpZnlfdmFsdWU7Ci0JCW5vdGlmeV9pbmZvLT5ub3RpZnkuaGFuZGxlcl9vYmogPSBoYW5kbGVyX29iajsKLQotCQlzdGF0dXMgPQotCQkgICAgYWNwaV9vc19leGVjdXRlKE9TTF9OT1RJRllfSEFORExFUiwgYWNwaV9ldl9ub3RpZnlfZGlzcGF0Y2gsCi0JCQkJICAgIG5vdGlmeV9pbmZvKTsKLQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCQlhY3BpX3V0X2RlbGV0ZV9nZW5lcmljX3N0YXRlKG5vdGlmeV9pbmZvKTsKLQkJfQotCX0gZWxzZSB7Ci0JCS8qCi0JCSAqIFRoZXJlIGlzIG5vIG5vdGlmeSBoYW5kbGVyIChwZXItZGV2aWNlIG9yIHN5c3RlbSkgZm9yIHRoaXMgZGV2aWNlLgotCQkgKi8KLQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLAotCQkJCSAgIk5vIG5vdGlmeSBoYW5kbGVyIGZvciBOb3RpZnkgKCU0LjRzLCAlWCkgbm9kZSAlcFxuIiwKLQkJCQkgIGFjcGlfdXRfZ2V0X25vZGVfbmFtZShub2RlKSwgbm90aWZ5X3ZhbHVlLAotCQkJCSAgbm9kZSkpOwotCX0KLQotCXJldHVybiAoc3RhdHVzKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9ldl9ub3RpZnlfZGlzcGF0Y2gKLSAqCi0gKiBQQVJBTUVURVJTOiAgQ29udGV4dCAgICAgICAgIC0gVG8gYmUgcGFzc2VkIHRvIHRoZSBub3RpZnkgaGFuZGxlcgotICoKLSAqIFJFVFVSTjogICAgICBOb25lLgotICoKLSAqIERFU0NSSVBUSU9OOiBEaXNwYXRjaCBhIGRldmljZSBub3RpZmljYXRpb24gZXZlbnQgdG8gYSBwcmV2aW91c2x5Ci0gKiAgICAgICAgICAgICAgaW5zdGFsbGVkIGhhbmRsZXIuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIHZvaWQgQUNQSV9TWVNURU1fWEZBQ0UgYWNwaV9ldl9ub3RpZnlfZGlzcGF0Y2godm9pZCAqY29udGV4dCkKLXsKLQl1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgKm5vdGlmeV9pbmZvID0KLQkgICAgKHVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSAqKWNvbnRleHQ7Ci0JYWNwaV9ub3RpZnlfaGFuZGxlciBnbG9iYWxfaGFuZGxlciA9IE5VTEw7Ci0Jdm9pZCAqZ2xvYmFsX2NvbnRleHQgPSBOVUxMOwotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKmhhbmRsZXJfb2JqOwotCi0JQUNQSV9GVU5DVElPTl9FTlRSWSgpOwotCi0JLyoKLQkgKiBXZSB3aWxsIGludm9rZSBhIGdsb2JhbCBub3RpZnkgaGFuZGxlciBpZiBpbnN0YWxsZWQuCi0JICogVGhpcyBpcyBkb25lIF9iZWZvcmVfIHdlIGludm9rZSB0aGUgcGVyLWRldmljZSBoYW5kbGVyIGF0dGFjaGVkCi0JICogdG8gdGhlIGRldmljZS4KLQkgKi8KLQlpZiAobm90aWZ5X2luZm8tPm5vdGlmeS52YWx1ZSA8PSBBQ1BJX01BWF9TWVNfTk9USUZZKSB7Ci0KLQkJLyogR2xvYmFsIHN5c3RlbSBub3RpZmljYXRpb24gaGFuZGxlciAqLwotCi0JCWlmIChhY3BpX2dibF9zeXN0ZW1fbm90aWZ5LmhhbmRsZXIpIHsKLQkJCWdsb2JhbF9oYW5kbGVyID0gYWNwaV9nYmxfc3lzdGVtX25vdGlmeS5oYW5kbGVyOwotCQkJZ2xvYmFsX2NvbnRleHQgPSBhY3BpX2dibF9zeXN0ZW1fbm90aWZ5LmNvbnRleHQ7Ci0JCX0KLQl9IGVsc2UgewotCQkvKiBHbG9iYWwgZHJpdmVyIG5vdGlmaWNhdGlvbiBoYW5kbGVyICovCi0KLQkJaWYgKGFjcGlfZ2JsX2RldmljZV9ub3RpZnkuaGFuZGxlcikgewotCQkJZ2xvYmFsX2hhbmRsZXIgPSBhY3BpX2dibF9kZXZpY2Vfbm90aWZ5LmhhbmRsZXI7Ci0JCQlnbG9iYWxfY29udGV4dCA9IGFjcGlfZ2JsX2RldmljZV9ub3RpZnkuY29udGV4dDsKLQkJfQotCX0KLQotCS8qIEludm9rZSB0aGUgc3lzdGVtIGhhbmRsZXIgZmlyc3QsIGlmIHByZXNlbnQgKi8KLQotCWlmIChnbG9iYWxfaGFuZGxlcikgewotCQlnbG9iYWxfaGFuZGxlcihub3RpZnlfaW5mby0+bm90aWZ5Lm5vZGUsCi0JCQkgICAgICAgbm90aWZ5X2luZm8tPm5vdGlmeS52YWx1ZSwgZ2xvYmFsX2NvbnRleHQpOwotCX0KLQotCS8qIE5vdyBpbnZva2UgdGhlIHBlci1kZXZpY2UgaGFuZGxlciwgaWYgcHJlc2VudCAqLwotCi0JaGFuZGxlcl9vYmogPSBub3RpZnlfaW5mby0+bm90aWZ5LmhhbmRsZXJfb2JqOwotCWlmIChoYW5kbGVyX29iaikgewotCQloYW5kbGVyX29iai0+bm90aWZ5LmhhbmRsZXIobm90aWZ5X2luZm8tPm5vdGlmeS5ub2RlLAotCQkJCQkgICAgbm90aWZ5X2luZm8tPm5vdGlmeS52YWx1ZSwKLQkJCQkJICAgIGhhbmRsZXJfb2JqLT5ub3RpZnkuY29udGV4dCk7Ci0JfQotCi0JLyogQWxsIGRvbmUgd2l0aCB0aGUgaW5mbyBvYmplY3QgKi8KLQotCWFjcGlfdXRfZGVsZXRlX2dlbmVyaWNfc3RhdGUobm90aWZ5X2luZm8pOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX2V2X2dsb2JhbF9sb2NrX2hhbmRsZXIKLSAqCi0gKiBQQVJBTUVURVJTOiAgQ29udGV4dCAgICAgICAgIC0gRnJvbSB0aHJlYWQgaW50ZXJmYWNlLCBub3QgdXNlZAotICoKLSAqIFJFVFVSTjogICAgICBBQ1BJX0lOVEVSUlVQVF9IQU5ETEVECi0gKgotICogREVTQ1JJUFRJT046IEludm9rZWQgZGlyZWN0bHkgZnJvbSB0aGUgU0NJIGhhbmRsZXIgd2hlbiBhIGdsb2JhbCBsb2NrCi0gKiAgICAgICAgICAgICAgcmVsZWFzZSBpbnRlcnJ1cHQgb2NjdXJzLiBBdHRlbXB0IHRvIGFjcXVpcmUgdGhlIGdsb2JhbCBsb2NrLAotICogICAgICAgICAgICAgIGlmIHN1Y2Nlc3NmdWwsIHNpZ25hbCB0aGUgdGhyZWFkIHdhaXRpbmcgZm9yIHRoZSBsb2NrLgotICoKLSAqIE5PVEU6IEFzc3VtZXMgdGhhdCB0aGUgc2VtYXBob3JlIGNhbiBiZSBzaWduYWxlZCBmcm9tIGludGVycnVwdCBsZXZlbC4gSWYKLSAqIHRoaXMgaXMgbm90IHBvc3NpYmxlIGZvciBzb21lIHJlYXNvbiwgYSBzZXBhcmF0ZSB0aHJlYWQgd2lsbCBoYXZlIHRvIGJlCi0gKiBzY2hlZHVsZWQgdG8gZG8gdGhpcy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgdTMyIGFjcGlfZXZfZ2xvYmFsX2xvY2tfaGFuZGxlcih2b2lkICpjb250ZXh0KQotewotCXU4IGFjcXVpcmVkID0gRkFMU0U7Ci0KLQkvKgotCSAqIEF0dGVtcHQgdG8gZ2V0IHRoZSBsb2NrLgotCSAqCi0JICogSWYgd2UgZG9uJ3QgZ2V0IGl0IG5vdywgaXQgd2lsbCBiZSBtYXJrZWQgcGVuZGluZyBhbmQgd2Ugd2lsbAotCSAqIHRha2UgYW5vdGhlciBpbnRlcnJ1cHQgd2hlbiBpdCBiZWNvbWVzIGZyZWUuCi0JICovCi0JQUNQSV9BQ1FVSVJFX0dMT0JBTF9MT0NLKGZhY3MsIGFjcXVpcmVkKTsKLQlpZiAoYWNxdWlyZWQpIHsKLQotCQkvKiBHb3QgdGhlIGxvY2ssIG5vdyB3YWtlIGFsbCB0aHJlYWRzIHdhaXRpbmcgZm9yIGl0ICovCi0KLQkJYWNwaV9nYmxfZ2xvYmFsX2xvY2tfYWNxdWlyZWQgPSBUUlVFOwotCQkvKiBTZW5kIGEgdW5pdCB0byB0aGUgc2VtYXBob3JlICovCi0KLQkJaWYgKEFDUElfRkFJTFVSRQotCQkgICAgKGFjcGlfb3Nfc2lnbmFsX3NlbWFwaG9yZQotCQkgICAgIChhY3BpX2dibF9nbG9iYWxfbG9ja19zZW1hcGhvcmUsIDEpKSkgewotCQkJQUNQSV9FUlJPUigoQUVfSU5GTywKLQkJCQkgICAgIkNvdWxkIG5vdCBzaWduYWwgR2xvYmFsIExvY2sgc2VtYXBob3JlIikpOwotCQl9Ci0JfQotCi0JcmV0dXJuIChBQ1BJX0lOVEVSUlVQVF9IQU5ETEVEKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9ldl9pbml0X2dsb2JhbF9sb2NrX2hhbmRsZXIKLSAqCi0gKiBQQVJBTUVURVJTOiAgTm9uZQotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKLSAqCi0gKiBERVNDUklQVElPTjogSW5zdGFsbCBhIGhhbmRsZXIgZm9yIHRoZSBnbG9iYWwgbG9jayByZWxlYXNlIGV2ZW50Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotYWNwaV9zdGF0dXMgYWNwaV9ldl9pbml0X2dsb2JhbF9sb2NrX2hhbmRsZXIodm9pZCkKLXsKLQlhY3BpX3N0YXR1cyBzdGF0dXM7Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGV2X2luaXRfZ2xvYmFsX2xvY2tfaGFuZGxlcik7Ci0KLQlzdGF0dXMgPSBhY3BpX2dldF90YWJsZV9ieV9pbmRleChBQ1BJX1RBQkxFX0lOREVYX0ZBQ1MsCi0JCQkJCSBBQ1BJX0NBU1RfSU5ESVJFQ1RfUFRSKHN0cnVjdAotCQkJCQkJCQlhY3BpX3RhYmxlX2hlYWRlciwKLQkJCQkJCQkJJmZhY3MpKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci0JfQotCi0JYWNwaV9nYmxfZ2xvYmFsX2xvY2tfcHJlc2VudCA9IFRSVUU7Ci0Jc3RhdHVzID0gYWNwaV9pbnN0YWxsX2ZpeGVkX2V2ZW50X2hhbmRsZXIoQUNQSV9FVkVOVF9HTE9CQUwsCi0JCQkJCQkgIGFjcGlfZXZfZ2xvYmFsX2xvY2tfaGFuZGxlciwKLQkJCQkJCSAgTlVMTCk7Ci0KLQkvKgotCSAqIElmIHRoZSBnbG9iYWwgbG9jayBkb2VzIG5vdCBleGlzdCBvbiB0aGlzIHBsYXRmb3JtLCB0aGUgYXR0ZW1wdAotCSAqIHRvIGVuYWJsZSBHQkxfU1RBVFVTIHdpbGwgZmFpbCAodGhlIEdCTF9FTkFCTEUgYml0IHdpbGwgbm90IHN0aWNrKQotCSAqIE1hcCB0byBBRV9PSywgYnV0IG1hcmsgZ2xvYmFsIGxvY2sgYXMgbm90IHByZXNlbnQuCi0JICogQW55IGF0dGVtcHQgdG8gYWN0dWFsbHkgdXNlIHRoZSBnbG9iYWwgbG9jayB3aWxsIGJlIGZsYWdnZWQKLQkgKiB3aXRoIGFuIGVycm9yLgotCSAqLwotCWlmIChzdGF0dXMgPT0gQUVfTk9fSEFSRFdBUkVfUkVTUE9OU0UpIHsKLQkJQUNQSV9FUlJPUigoQUVfSU5GTywKLQkJCSAgICAiTm8gcmVzcG9uc2UgZnJvbSBHbG9iYWwgTG9jayBoYXJkd2FyZSwgZGlzYWJsaW5nIGxvY2siKSk7Ci0KLQkJYWNwaV9nYmxfZ2xvYmFsX2xvY2tfcHJlc2VudCA9IEZBTFNFOwotCQlzdGF0dXMgPSBBRV9PSzsKLQl9Ci0KLQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9ldl9yZW1vdmVfZ2xvYmFsX2xvY2tfaGFuZGxlcgotICoKLSAqIFBBUkFNRVRFUlM6ICBOb25lCi0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cwotICoKLSAqIERFU0NSSVBUSU9OOiBSZW1vdmUgdGhlIGhhbmRsZXIgZm9yIHRoZSBHbG9iYWwgTG9jawotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyBhY3BpX3N0YXR1cyBhY3BpX2V2X3JlbW92ZV9nbG9iYWxfbG9ja19oYW5kbGVyKHZvaWQpCi17Ci0JYWNwaV9zdGF0dXMgc3RhdHVzOwotCi0JQUNQSV9GVU5DVElPTl9UUkFDRShldl9yZW1vdmVfZ2xvYmFsX2xvY2tfaGFuZGxlcik7Ci0KLQlhY3BpX2dibF9nbG9iYWxfbG9ja19wcmVzZW50ID0gRkFMU0U7Ci0Jc3RhdHVzID0gYWNwaV9yZW1vdmVfZml4ZWRfZXZlbnRfaGFuZGxlcihBQ1BJX0VWRU5UX0dMT0JBTCwKLQkJCQkJCSBhY3BpX2V2X2dsb2JhbF9sb2NrX2hhbmRsZXIpOwotCi0JcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9ldl9hY3F1aXJlX2dsb2JhbF9sb2NrCi0gKgotICogUEFSQU1FVEVSUzogIFRpbWVvdXQgICAgICAgICAtIE1heCB0aW1lIHRvIHdhaXQgZm9yIHRoZSBsb2NrLCBpbiBtaWxsaXNlYy4KLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IEF0dGVtcHQgdG8gZ2FpbiBvd25lcnNoaXAgb2YgdGhlIEdsb2JhbCBMb2NrLgotICoKLSAqIE1VVEVYOiAgICAgICBJbnRlcnByZXRlciBtdXN0IGJlIGxvY2tlZAotICoKLSAqIE5vdGU6IFRoZSBvcmlnaW5hbCBpbXBsZW1lbnRhdGlvbiBhbGxvd2VkIG11bHRpcGxlIHRocmVhZHMgdG8gImFjcXVpcmUiIHRoZQotICogR2xvYmFsIExvY2ssIGFuZCB0aGUgT1Mgd291bGQgaG9sZCB0aGUgbG9jayB1bnRpbCB0aGUgbGFzdCB0aHJlYWQgaGFkCi0gKiByZWxlYXNlZCBpdC4gSG93ZXZlciwgdGhpcyBjb3VsZCBwb3RlbnRpYWxseSBzdGFydmUgdGhlIEJJT1Mgb3V0IG9mIHRoZQotICogbG9jaywgZXNwZWNpYWxseSBpbiB0aGUgY2FzZSB3aGVyZSB0aGVyZSBpcyBhIHRpZ2h0IGhhbmRzaGFrZSBiZXR3ZWVuIHRoZQotICogRW1iZWRkZWQgQ29udHJvbGxlciBkcml2ZXIgYW5kIHRoZSBCSU9TLiBUaGVyZWZvcmUsIHRoaXMgaW1wbGVtZW50YXRpb24KLSAqIGFsbG93cyBvbmx5IG9uZSB0aHJlYWQgdG8gYWNxdWlyZSB0aGUgSFcgR2xvYmFsIExvY2sgYXQgYSB0aW1lLCBhbmQgbWFrZXMKLSAqIHRoZSBnbG9iYWwgbG9jayBhcHBlYXIgYXMgYSBzdGFuZGFyZCBtdXRleCBvbiB0aGUgT1Mgc2lkZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgYWNwaV90aHJlYWRfaWQgYWNwaV9ldl9nbG9iYWxfbG9ja190aHJlYWRfaWQ7Ci1zdGF0aWMgaW50IGFjcGlfZXZfZ2xvYmFsX2xvY2tfYWNxdWlyZWQ7Ci0KLWFjcGlfc3RhdHVzIGFjcGlfZXZfYWNxdWlyZV9nbG9iYWxfbG9jayh1MTYgdGltZW91dCkKLXsKLQlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKLQl1OCBhY3F1aXJlZCA9IEZBTFNFOwotCi0JQUNQSV9GVU5DVElPTl9UUkFDRShldl9hY3F1aXJlX2dsb2JhbF9sb2NrKTsKLQotCS8qCi0JICogT25seSBvbmUgdGhyZWFkIGNhbiBhY3F1aXJlIHRoZSBHTCBhdCBhIHRpbWUsIHRoZSBnbG9iYWxfbG9ja19tdXRleAotCSAqIGVuZm9yY2VzIHRoaXMuIFRoaXMgaW50ZXJmYWNlIHJlbGVhc2VzIHRoZSBpbnRlcnByZXRlciBpZiB3ZSBtdXN0IHdhaXQuCi0JICovCi0Jc3RhdHVzID0gYWNwaV9leF9zeXN0ZW1fd2FpdF9tdXRleCgKLQkJCWFjcGlfZ2JsX2dsb2JhbF9sb2NrX211dGV4LT5tdXRleC5vc19tdXRleCwgMCk7Ci0JaWYgKHN0YXR1cyA9PSBBRV9USU1FKSB7Ci0JCWlmIChhY3BpX2V2X2dsb2JhbF9sb2NrX3RocmVhZF9pZCA9PSBhY3BpX29zX2dldF90aHJlYWRfaWQoKSkgewotCQkJYWNwaV9ldl9nbG9iYWxfbG9ja19hY3F1aXJlZCsrOwotCQkJcmV0dXJuIEFFX09LOwotCQl9Ci0JfQotCi0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCXN0YXR1cyA9IGFjcGlfZXhfc3lzdGVtX3dhaXRfbXV0ZXgoCi0JCQkJYWNwaV9nYmxfZ2xvYmFsX2xvY2tfbXV0ZXgtPm11dGV4Lm9zX211dGV4LAotCQkJCXRpbWVvdXQpOwotCX0KLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci0JfQotCi0JYWNwaV9ldl9nbG9iYWxfbG9ja190aHJlYWRfaWQgPSBhY3BpX29zX2dldF90aHJlYWRfaWQoKTsKLQlhY3BpX2V2X2dsb2JhbF9sb2NrX2FjcXVpcmVkKys7Ci0KLQkvKgotCSAqIFVwZGF0ZSB0aGUgZ2xvYmFsIGxvY2sgaGFuZGxlIGFuZCBjaGVjayBmb3Igd3JhcGFyb3VuZC4gVGhlIGhhbmRsZSBpcwotCSAqIG9ubHkgdXNlZCBmb3IgdGhlIGV4dGVybmFsIGdsb2JhbCBsb2NrIGludGVyZmFjZXMsIGJ1dCBpdCBpcyB1cGRhdGVkCi0JICogaGVyZSB0byBwcm9wZXJseSBoYW5kbGUgdGhlIGNhc2Ugd2hlcmUgYSBzaW5nbGUgdGhyZWFkIG1heSBhY3F1aXJlIHRoZQotCSAqIGxvY2sgdmlhIGJvdGggdGhlIEFNTCBhbmQgdGhlIGFjcGlfYWNxdWlyZV9nbG9iYWxfbG9jayBpbnRlcmZhY2VzLiBUaGUKLQkgKiBoYW5kbGUgaXMgdGhlcmVmb3JlIHVwZGF0ZWQgb24gdGhlIGZpcnN0IGFjcXVpcmUgZnJvbSBhIGdpdmVuIHRocmVhZAotCSAqIHJlZ2FyZGxlc3Mgb2Ygd2hlcmUgdGhlIGFjcXVpc2l0aW9uIHJlcXVlc3Qgb3JpZ2luYXRlZC4KLQkgKi8KLQlhY3BpX2dibF9nbG9iYWxfbG9ja19oYW5kbGUrKzsKLQlpZiAoYWNwaV9nYmxfZ2xvYmFsX2xvY2tfaGFuZGxlID09IDApIHsKLQkJYWNwaV9nYmxfZ2xvYmFsX2xvY2tfaGFuZGxlID0gMTsKLQl9Ci0KLQkvKgotCSAqIE1ha2Ugc3VyZSB0aGF0IGEgZ2xvYmFsIGxvY2sgYWN0dWFsbHkgZXhpc3RzLiBJZiBub3QsIGp1c3QgdHJlYXQKLQkgKiB0aGUgbG9jayBhcyBhIHN0YW5kYXJkIG11dGV4LgotCSAqLwotCWlmICghYWNwaV9nYmxfZ2xvYmFsX2xvY2tfcHJlc2VudCkgewotCQlhY3BpX2dibF9nbG9iYWxfbG9ja19hY3F1aXJlZCA9IFRSVUU7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7Ci0JfQotCi0JLyogQXR0ZW1wdCB0byBhY3F1aXJlIHRoZSBhY3R1YWwgaGFyZHdhcmUgbG9jayAqLwotCi0JQUNQSV9BQ1FVSVJFX0dMT0JBTF9MT0NLKGZhY3MsIGFjcXVpcmVkKTsKLQlpZiAoYWNxdWlyZWQpIHsKLQotCQkvKiBXZSBnb3QgdGhlIGxvY2sgKi8KLQotCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VYRUMsCi0JCQkJICAiQWNxdWlyZWQgaGFyZHdhcmUgR2xvYmFsIExvY2tcbiIpKTsKLQotCQlhY3BpX2dibF9nbG9iYWxfbG9ja19hY3F1aXJlZCA9IFRSVUU7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7Ci0JfQotCi0JLyoKLQkgKiBEaWQgbm90IGdldCB0aGUgbG9jay4gVGhlIHBlbmRpbmcgYml0IHdhcyBzZXQgYWJvdmUsIGFuZCB3ZSBtdXN0IG5vdwotCSAqIHdhaXQgdW50aWwgd2UgZ2V0IHRoZSBnbG9iYWwgbG9jayByZWxlYXNlZCBpbnRlcnJ1cHQuCi0JICovCi0JQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FWEVDLCAiV2FpdGluZyBmb3IgaGFyZHdhcmUgR2xvYmFsIExvY2tcbiIpKTsKLQotCS8qCi0JICogV2FpdCBmb3IgaGFuZHNoYWtlIHdpdGggdGhlIGdsb2JhbCBsb2NrIGludGVycnVwdCBoYW5kbGVyLgotCSAqIFRoaXMgaW50ZXJmYWNlIHJlbGVhc2VzIHRoZSBpbnRlcnByZXRlciBpZiB3ZSBtdXN0IHdhaXQuCi0JICovCi0Jc3RhdHVzID0gYWNwaV9leF9zeXN0ZW1fd2FpdF9zZW1hcGhvcmUoYWNwaV9nYmxfZ2xvYmFsX2xvY2tfc2VtYXBob3JlLAotCQkJCQkgICAgICAgQUNQSV9XQUlUX0ZPUkVWRVIpOwotCi0JcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfZXZfcmVsZWFzZV9nbG9iYWxfbG9jawotICoKLSAqIFBBUkFNRVRFUlM6ICBOb25lCi0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cwotICoKLSAqIERFU0NSSVBUSU9OOiBSZWxlYXNlcyBvd25lcnNoaXAgb2YgdGhlIEdsb2JhbCBMb2NrLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWFjcGlfc3RhdHVzIGFjcGlfZXZfcmVsZWFzZV9nbG9iYWxfbG9jayh2b2lkKQotewotCXU4IHBlbmRpbmcgPSBGQUxTRTsKLQlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UoZXZfcmVsZWFzZV9nbG9iYWxfbG9jayk7Ci0KLQkvKiBMb2NrIG11c3QgYmUgYWxyZWFkeSBhY3F1aXJlZCAqLwotCi0JaWYgKCFhY3BpX2dibF9nbG9iYWxfbG9ja19hY3F1aXJlZCkgewotCQlBQ1BJX1dBUk5JTkcoKEFFX0lORk8sCi0JCQkgICAgICAiQ2Fubm90IHJlbGVhc2UgdGhlIEFDUEkgR2xvYmFsIExvY2ssIGl0IGhhcyBub3QgYmVlbiBhY3F1aXJlZCIpKTsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PVF9BQ1FVSVJFRCk7Ci0JfQotCi0JYWNwaV9ldl9nbG9iYWxfbG9ja19hY3F1aXJlZC0tOwotCWlmIChhY3BpX2V2X2dsb2JhbF9sb2NrX2FjcXVpcmVkID4gMCkgewotCQlyZXR1cm4gQUVfT0s7Ci0JfQotCi0JaWYgKGFjcGlfZ2JsX2dsb2JhbF9sb2NrX3ByZXNlbnQpIHsKLQotCQkvKiBBbGxvdyBhbnkgdGhyZWFkIHRvIHJlbGVhc2UgdGhlIGxvY2sgKi8KLQotCQlBQ1BJX1JFTEVBU0VfR0xPQkFMX0xPQ0soZmFjcywgcGVuZGluZyk7Ci0KLQkJLyoKLQkJICogSWYgdGhlIHBlbmRpbmcgYml0IHdhcyBzZXQsIHdlIG11c3Qgd3JpdGUgR0JMX1JMUyB0byB0aGUgY29udHJvbAotCQkgKiByZWdpc3RlcgotCQkgKi8KLQkJaWYgKHBlbmRpbmcpIHsKLQkJCXN0YXR1cyA9Ci0JCQkgICAgYWNwaV9zZXRfcmVnaXN0ZXIoQUNQSV9CSVRSRUdfR0xPQkFMX0xPQ0tfUkVMRUFTRSwKLQkJCQkJICAgICAgMSk7Ci0JCX0KLQotCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VYRUMsCi0JCQkJICAiUmVsZWFzZWQgaGFyZHdhcmUgR2xvYmFsIExvY2tcbiIpKTsKLQl9Ci0KLQlhY3BpX2dibF9nbG9iYWxfbG9ja19hY3F1aXJlZCA9IEZBTFNFOwotCi0JLyogUmVsZWFzZSB0aGUgbG9jYWwgR0wgbXV0ZXggKi8KLQlhY3BpX2V2X2dsb2JhbF9sb2NrX3RocmVhZF9pZCA9IE5VTEw7Ci0JYWNwaV9ldl9nbG9iYWxfbG9ja19hY3F1aXJlZCA9IDA7Ci0JYWNwaV9vc19yZWxlYXNlX211dGV4KGFjcGlfZ2JsX2dsb2JhbF9sb2NrX211dGV4LT5tdXRleC5vc19tdXRleCk7Ci0JcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9ldl90ZXJtaW5hdGUKLSAqCi0gKiBQQVJBTUVURVJTOiAgbm9uZQotICoKLSAqIFJFVFVSTjogICAgICBub25lCi0gKgotICogREVTQ1JJUFRJT046IERpc2FibGUgZXZlbnRzIGFuZCBmcmVlIG1lbW9yeSBhbGxvY2F0ZWQgZm9yIHRhYmxlIHN0b3JhZ2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdm9pZCBhY3BpX2V2X3Rlcm1pbmF0ZSh2b2lkKQotewotCXUzMiBpOwotCWFjcGlfc3RhdHVzIHN0YXR1czsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UoZXZfdGVybWluYXRlKTsKLQotCWlmIChhY3BpX2dibF9ldmVudHNfaW5pdGlhbGl6ZWQpIHsKLQkJLyoKLQkJICogRGlzYWJsZSBhbGwgZXZlbnQtcmVsYXRlZCBmdW5jdGlvbmFsaXR5LgotCQkgKiBJbiBhbGwgY2FzZXMsIG9uIGVycm9yLCBwcmludCBhIG1lc3NhZ2UgYnV0IG9idmlvdXNseSB3ZSBkb24ndCBhYm9ydC4KLQkJICovCi0KLQkJLyogRGlzYWJsZSBhbGwgZml4ZWQgZXZlbnRzICovCi0KLQkJZm9yIChpID0gMDsgaSA8IEFDUElfTlVNX0ZJWEVEX0VWRU5UUzsgaSsrKSB7Ci0JCQlzdGF0dXMgPSBhY3BpX2Rpc2FibGVfZXZlbnQoaSwgMCk7Ci0JCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJCQlBQ1BJX0VSUk9SKChBRV9JTkZPLAotCQkJCQkgICAgIkNvdWxkIG5vdCBkaXNhYmxlIGZpeGVkIGV2ZW50ICVkIiwKLQkJCQkJICAgICh1MzIpIGkpKTsKLQkJCX0KLQkJfQotCi0JCS8qIERpc2FibGUgYWxsIEdQRXMgaW4gYWxsIEdQRSBibG9ja3MgKi8KLQotCQlzdGF0dXMgPSBhY3BpX2V2X3dhbGtfZ3BlX2xpc3QoYWNwaV9od19kaXNhYmxlX2dwZV9ibG9jayk7Ci0KLQkJLyogUmVtb3ZlIFNDSSBoYW5kbGVyICovCi0KLQkJc3RhdHVzID0gYWNwaV9ldl9yZW1vdmVfc2NpX2hhbmRsZXIoKTsKLQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCQlBQ1BJX0VSUk9SKChBRV9JTkZPLCAiQ291bGQgbm90IHJlbW92ZSBTQ0kgaGFuZGxlciIpKTsKLQkJfQotCi0JCXN0YXR1cyA9IGFjcGlfZXZfcmVtb3ZlX2dsb2JhbF9sb2NrX2hhbmRsZXIoKTsKLQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCQlBQ1BJX0VSUk9SKChBRV9JTkZPLAotCQkJCSAgICAiQ291bGQgbm90IHJlbW92ZSBHbG9iYWwgTG9jayBoYW5kbGVyIikpOwotCQl9Ci0JfQotCi0JLyogRGVhbGxvY2F0ZSBhbGwgaGFuZGxlciBvYmplY3RzIGluc3RhbGxlZCB3aXRoaW4gR1BFIGluZm8gc3RydWN0cyAqLwotCi0Jc3RhdHVzID0gYWNwaV9ldl93YWxrX2dwZV9saXN0KGFjcGlfZXZfZGVsZXRlX2dwZV9oYW5kbGVycyk7Ci0KLQkvKiBSZXR1cm4gdG8gb3JpZ2luYWwgbW9kZSBpZiBuZWNlc3NhcnkgKi8KLQotCWlmIChhY3BpX2dibF9vcmlnaW5hbF9tb2RlID09IEFDUElfU1lTX01PREVfTEVHQUNZKSB7Ci0JCXN0YXR1cyA9IGFjcGlfZGlzYWJsZSgpOwotCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJCUFDUElfV0FSTklORygoQUVfSU5GTywgIkFjcGlEaXNhYmxlIGZhaWxlZCIpKTsKLQkJfQotCX0KLQlyZXR1cm5fVk9JRDsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9ldmVudHMvZXZyZWdpb24uYyBiL2RyaXZlcnMvYWNwaS9ldmVudHMvZXZyZWdpb24uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM2ZmJkMS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL2FjcGkvZXZlbnRzL2V2cmVnaW9uLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBNb2R1bGUgTmFtZTogZXZyZWdpb24gLSBBQ1BJIGFkZHJlc3Nfc3BhY2UgKG9wX3JlZ2lvbikgaGFuZGxlciBkaXNwYXRjaAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDgsIEludGVsIENvcnAuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCi0gKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSBhdCBtaW5pbXVtIGEgZGlzY2xhaW1lcgotICogICAgc3Vic3RhbnRpYWxseSBzaW1pbGFyIHRvIHRoZSAiTk8gV0FSUkFOVFkiIGRpc2NsYWltZXIgYmVsb3cKLSAqICAgICgiRGlzY2xhaW1lciIpIGFuZCBhbnkgcmVkaXN0cmlidXRpb24gbXVzdCBiZSBjb25kaXRpb25lZCB1cG9uCi0gKiAgICBpbmNsdWRpbmcgYSBzdWJzdGFudGlhbGx5IHNpbWlsYXIgRGlzY2xhaW1lciByZXF1aXJlbWVudCBmb3IgZnVydGhlcgotICogICAgYmluYXJ5IHJlZGlzdHJpYnV0aW9uLgotICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzCi0gKiAgICBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIE5PIFdBUlJBTlRZCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKLSAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCi0gKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORwotICogSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCi0gKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCi0gKi8KLQotI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgotI2luY2x1ZGUgPGFjcGkvYWNldmVudHMuaD4KLSNpbmNsdWRlIDxhY3BpL2FjbmFtZXNwLmg+Ci0jaW5jbHVkZSA8YWNwaS9hY2ludGVycC5oPgotCi0jZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9FVkVOVFMKLUFDUElfTU9EVUxFX05BTUUoImV2cmVnaW9uIikKLSNkZWZpbmUgQUNQSV9OVU1fREVGQVVMVF9TUEFDRVMgICAgIDQKLXN0YXRpYyB1OCBhY3BpX2dibF9kZWZhdWx0X2FkZHJlc3Nfc3BhY2VzW0FDUElfTlVNX0RFRkFVTFRfU1BBQ0VTXSA9IHsKLQlBQ1BJX0FEUl9TUEFDRV9TWVNURU1fTUVNT1JZLAotCUFDUElfQURSX1NQQUNFX1NZU1RFTV9JTywKLQlBQ1BJX0FEUl9TUEFDRV9QQ0lfQ09ORklHLAotCUFDUElfQURSX1NQQUNFX0RBVEFfVEFCTEUKLX07Ci0KLS8qIExvY2FsIHByb3RvdHlwZXMgKi8KLQotc3RhdGljIGFjcGlfc3RhdHVzCi1hY3BpX2V2X3JlZ19ydW4oYWNwaV9oYW5kbGUgb2JqX2hhbmRsZSwKLQkJdTMyIGxldmVsLCB2b2lkICpjb250ZXh0LCB2b2lkICoqcmV0dXJuX3ZhbHVlKTsKLQotc3RhdGljIGFjcGlfc3RhdHVzCi1hY3BpX2V2X2luc3RhbGxfaGFuZGxlcihhY3BpX2hhbmRsZSBvYmpfaGFuZGxlLAotCQkJdTMyIGxldmVsLCB2b2lkICpjb250ZXh0LCB2b2lkICoqcmV0dXJuX3ZhbHVlKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9ldl9pbnN0YWxsX3JlZ2lvbl9oYW5kbGVycwotICoKLSAqIFBBUkFNRVRFUlM6ICBOb25lCi0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cwotICoKLSAqIERFU0NSSVBUSU9OOiBJbnN0YWxscyB0aGUgY29yZSBzdWJzeXN0ZW0gZGVmYXVsdCBhZGRyZXNzIHNwYWNlIGhhbmRsZXJzLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWFjcGlfc3RhdHVzIGFjcGlfZXZfaW5zdGFsbF9yZWdpb25faGFuZGxlcnModm9pZCkKLXsKLQlhY3BpX3N0YXR1cyBzdGF0dXM7Ci0JdTMyIGk7Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGV2X2luc3RhbGxfcmVnaW9uX2hhbmRsZXJzKTsKLQotCXN0YXR1cyA9IGFjcGlfdXRfYWNxdWlyZV9tdXRleChBQ1BJX01UWF9OQU1FU1BBQ0UpOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLQl9Ci0KLQkvKgotCSAqIEFsbCBhZGRyZXNzIHNwYWNlcyAoUENJIENvbmZpZywgRUMsIFNNQnVzKSBhcmUgc2NvcGUgZGVwZW5kZW50Ci0JICogYW5kIHJlZ2lzdHJhdGlvbiBtdXN0IG9jY3VyIGZvciBhIHNwZWNpZmljIGRldmljZS4KLQkgKgotCSAqIEluIHRoZSBjYXNlIG9mIHRoZSBzeXN0ZW0gbWVtb3J5IGFuZCBJTyBhZGRyZXNzIHNwYWNlcyB0aGVyZSBpcyBjdXJyZW50bHkKLQkgKiBubyBkZXZpY2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBhZGRyZXNzIHNwYWNlLiAgRm9yIHRoZXNlIHdlIHVzZSB0aGUgcm9vdC4KLQkgKgotCSAqIFdlIGluc3RhbGwgdGhlIGRlZmF1bHQgUENJIGNvbmZpZyBzcGFjZSBoYW5kbGVyIGF0IHRoZSByb290IHNvCi0JICogdGhhdCB0aGlzIHNwYWNlIGlzIGltbWVkaWF0ZWx5IGF2YWlsYWJsZSBldmVuIHRob3VnaCB0aGUgd2UgaGF2ZQotCSAqIG5vdCBlbnVtZXJhdGVkIGFsbCB0aGUgUENJIFJvb3QgQnVzZXMgeWV0LiAgVGhpcyBpcyB0byBjb25mb3JtCi0JICogdG8gdGhlIEFDUEkgc3BlY2lmaWNhdGlvbiB3aGljaCBzdGF0ZXMgdGhhdCB0aGUgUENJIGNvbmZpZwotCSAqIHNwYWNlIG11c3QgYmUgYWx3YXlzIGF2YWlsYWJsZSAtLSBldmVuIHRob3VnaCB3ZSBhcmUgbm93aGVyZQotCSAqIG5lYXIgcmVhZHkgdG8gZmluZCB0aGUgUENJIHJvb3QgYnVzZXMgYXQgdGhpcyBwb2ludC4KLQkgKgotCSAqIE5PVEU6IFdlIGlnbm9yZSBBRV9BTFJFQURZX0VYSVNUUyBiZWNhdXNlIHRoaXMgbWVhbnMgdGhhdCBhIGhhbmRsZXIKLQkgKiBoYXMgYWxyZWFkeSBiZWVuIGluc3RhbGxlZCAodmlhIGFjcGlfaW5zdGFsbF9hZGRyZXNzX3NwYWNlX2hhbmRsZXIpLgotCSAqIFNpbWlsYXIgZm9yIEFFX1NBTUVfSEFORExFUi4KLQkgKi8KLQlmb3IgKGkgPSAwOyBpIDwgQUNQSV9OVU1fREVGQVVMVF9TUEFDRVM7IGkrKykgewotCQlzdGF0dXMgPSBhY3BpX2V2X2luc3RhbGxfc3BhY2VfaGFuZGxlcihhY3BpX2dibF9yb290X25vZGUsCi0JCQkJCQkgICAgICAgYWNwaV9nYmxfZGVmYXVsdF9hZGRyZXNzX3NwYWNlcwotCQkJCQkJICAgICAgIFtpXSwKLQkJCQkJCSAgICAgICBBQ1BJX0RFRkFVTFRfSEFORExFUiwKLQkJCQkJCSAgICAgICBOVUxMLCBOVUxMKTsKLQkJc3dpdGNoIChzdGF0dXMpIHsKLQkJY2FzZSBBRV9PSzoKLQkJY2FzZSBBRV9TQU1FX0hBTkRMRVI6Ci0JCWNhc2UgQUVfQUxSRUFEWV9FWElTVFM6Ci0KLQkJCS8qIFRoZXNlIGV4Y2VwdGlvbnMgYXJlIGFsbCBPSyAqLwotCi0JCQlzdGF0dXMgPSBBRV9PSzsKLQkJCWJyZWFrOwotCi0JCWRlZmF1bHQ6Ci0KLQkJCWdvdG8gdW5sb2NrX2FuZF9leGl0OwotCQl9Ci0JfQotCi0gICAgICB1bmxvY2tfYW5kX2V4aXQ6Ci0JKHZvaWQpYWNwaV91dF9yZWxlYXNlX211dGV4KEFDUElfTVRYX05BTUVTUEFDRSk7Ci0JcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfZXZfaW5pdGlhbGl6ZV9vcF9yZWdpb25zCi0gKgotICogUEFSQU1FVEVSUzogIE5vbmUKLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IEV4ZWN1dGUgX1JFRyBtZXRob2RzIGZvciBhbGwgT3BlcmF0aW9uIFJlZ2lvbnMgdGhhdCBoYXZlCi0gKiAgICAgICAgICAgICAgYW4gaW5zdGFsbGVkIGRlZmF1bHQgcmVnaW9uIGhhbmRsZXIuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotYWNwaV9zdGF0dXMgYWNwaV9ldl9pbml0aWFsaXplX29wX3JlZ2lvbnModm9pZCkKLXsKLQlhY3BpX3N0YXR1cyBzdGF0dXM7Ci0JdTMyIGk7Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGV2X2luaXRpYWxpemVfb3BfcmVnaW9ucyk7Ci0KLQlzdGF0dXMgPSBhY3BpX3V0X2FjcXVpcmVfbXV0ZXgoQUNQSV9NVFhfTkFNRVNQQUNFKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci0JfQotCi0JLyoKLQkgKiBSdW4gdGhlIF9SRUcgbWV0aG9kcyBmb3Igb3BfcmVnaW9ucyBpbiBlYWNoIGRlZmF1bHQgYWRkcmVzcyBzcGFjZQotCSAqLwotCWZvciAoaSA9IDA7IGkgPCBBQ1BJX05VTV9ERUZBVUxUX1NQQUNFUzsgaSsrKSB7Ci0KLQkJLyogVEJEOiBNYWtlIHN1cmUgaGFuZGxlciBpcyB0aGUgREVGQVVMVCBoYW5kbGVyLCBvdGhlcndpc2UKLQkJICogX1JFRyB3aWxsIGhhdmUgYWxyZWFkeSBiZWVuIHJ1bi4KLQkJICovCi0JCXN0YXR1cyA9IGFjcGlfZXZfZXhlY3V0ZV9yZWdfbWV0aG9kcyhhY3BpX2dibF9yb290X25vZGUsCi0JCQkJCQkgICAgIGFjcGlfZ2JsX2RlZmF1bHRfYWRkcmVzc19zcGFjZXMKLQkJCQkJCSAgICAgW2ldKTsKLQl9Ci0KLQkodm9pZClhY3BpX3V0X3JlbGVhc2VfbXV0ZXgoQUNQSV9NVFhfTkFNRVNQQUNFKTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9ldl9leGVjdXRlX3JlZ19tZXRob2QKLSAqCi0gKiBQQVJBTUVURVJTOiAgcmVnaW9uX29iaiAgICAgICAgICAtIFJlZ2lvbiBvYmplY3QKLSAqICAgICAgICAgICAgICBGdW5jdGlvbiAgICAgICAgICAgIC0gUGFzc2VkIHRvIF9SRUc6IE9uICgxKSBvciBPZmYgKDApCi0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cwotICoKLSAqIERFU0NSSVBUSU9OOiBFeGVjdXRlIF9SRUcgbWV0aG9kIGZvciBhIHJlZ2lvbgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWFjcGlfc3RhdHVzCi1hY3BpX2V2X2V4ZWN1dGVfcmVnX21ldGhvZCh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpyZWdpb25fb2JqLCB1MzIgZnVuY3Rpb24pCi17Ci0Jc3RydWN0IGFjcGlfZXZhbHVhdGVfaW5mbyAqaW5mbzsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICphcmdzWzNdOwotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnJlZ2lvbl9vYmoyOwotCWFjcGlfc3RhdHVzIHN0YXR1czsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UoZXZfZXhlY3V0ZV9yZWdfbWV0aG9kKTsKLQotCXJlZ2lvbl9vYmoyID0gYWNwaV9uc19nZXRfc2Vjb25kYXJ5X29iamVjdChyZWdpb25fb2JqKTsKLQlpZiAoIXJlZ2lvbl9vYmoyKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT1RfRVhJU1QpOwotCX0KLQotCWlmIChyZWdpb25fb2JqMi0+ZXh0cmEubWV0aG9kX1JFRyA9PSBOVUxMKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7Ci0JfQotCi0JLyogQWxsb2NhdGUgYW5kIGluaXRpYWxpemUgdGhlIGV2YWx1YXRpb24gaW5mb3JtYXRpb24gYmxvY2sgKi8KLQotCWluZm8gPSBBQ1BJX0FMTE9DQVRFX1pFUk9FRChzaXplb2Yoc3RydWN0IGFjcGlfZXZhbHVhdGVfaW5mbykpOwotCWlmICghaW5mbykgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9fTUVNT1JZKTsKLQl9Ci0KLQlpbmZvLT5wcmVmaXhfbm9kZSA9IHJlZ2lvbl9vYmoyLT5leHRyYS5tZXRob2RfUkVHOwotCWluZm8tPnBhdGhuYW1lID0gTlVMTDsKLQlpbmZvLT5wYXJhbWV0ZXJzID0gYXJnczsKLQlpbmZvLT5mbGFncyA9IEFDUElfSUdOT1JFX1JFVFVSTl9WQUxVRTsKLQotCS8qCi0JICogVGhlIF9SRUcgbWV0aG9kIGhhcyB0d28gYXJndW1lbnRzOgotCSAqCi0JICogQXJnMCAtIEludGVnZXI6Ci0JICogIE9wZXJhdGlvbiByZWdpb24gc3BhY2UgSUQgU2FtZSB2YWx1ZSBhcyByZWdpb25fb2JqLT5SZWdpb24uc3BhY2VfaWQKLQkgKgotCSAqIEFyZzEgLSBJbnRlZ2VyOgotCSAqICBjb25uZWN0aW9uIHN0YXR1cyAxIGZvciBjb25uZWN0aW5nIHRoZSBoYW5kbGVyLCAwIGZvciBkaXNjb25uZWN0aW5nCi0JICogIHRoZSBoYW5kbGVyIChQYXNzZWQgYXMgYSBwYXJhbWV0ZXIpCi0JICovCi0JYXJnc1swXSA9IGFjcGlfdXRfY3JlYXRlX2ludGVybmFsX29iamVjdChBQ1BJX1RZUEVfSU5URUdFUik7Ci0JaWYgKCFhcmdzWzBdKSB7Ci0JCXN0YXR1cyA9IEFFX05PX01FTU9SWTsKLQkJZ290byBjbGVhbnVwMTsKLQl9Ci0KLQlhcmdzWzFdID0gYWNwaV91dF9jcmVhdGVfaW50ZXJuYWxfb2JqZWN0KEFDUElfVFlQRV9JTlRFR0VSKTsKLQlpZiAoIWFyZ3NbMV0pIHsKLQkJc3RhdHVzID0gQUVfTk9fTUVNT1JZOwotCQlnb3RvIGNsZWFudXAyOwotCX0KLQotCS8qIFNldHVwIHRoZSBwYXJhbWV0ZXIgb2JqZWN0cyAqLwotCi0JYXJnc1swXS0+aW50ZWdlci52YWx1ZSA9IHJlZ2lvbl9vYmotPnJlZ2lvbi5zcGFjZV9pZDsKLQlhcmdzWzFdLT5pbnRlZ2VyLnZhbHVlID0gZnVuY3Rpb247Ci0JYXJnc1syXSA9IE5VTEw7Ci0KLQkvKiBFeGVjdXRlIHRoZSBtZXRob2QsIG5vIHJldHVybiB2YWx1ZSAqLwotCi0JQUNQSV9ERUJVR19FWEVDKGFjcGlfdXRfZGlzcGxheV9pbml0X3BhdGhuYW1lCi0JCQkoQUNQSV9UWVBFX01FVEhPRCwgaW5mby0+cHJlZml4X25vZGUsIE5VTEwpKTsKLQotCXN0YXR1cyA9IGFjcGlfbnNfZXZhbHVhdGUoaW5mbyk7Ci0JYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKGFyZ3NbMV0pOwotCi0gICAgICBjbGVhbnVwMjoKLQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UoYXJnc1swXSk7Ci0KLSAgICAgIGNsZWFudXAxOgotCUFDUElfRlJFRShpbmZvKTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9ldl9hZGRyZXNzX3NwYWNlX2Rpc3BhdGNoCi0gKgotICogUEFSQU1FVEVSUzogIHJlZ2lvbl9vYmogICAgICAgICAgLSBJbnRlcm5hbCByZWdpb24gb2JqZWN0Ci0gKiAgICAgICAgICAgICAgRnVuY3Rpb24gICAgICAgICAgICAtIFJlYWQgb3IgV3JpdGUgb3BlcmF0aW9uCi0gKiAgICAgICAgICAgICAgQWRkcmVzcyAgICAgICAgICAgICAtIFdoZXJlIGluIHRoZSBzcGFjZSB0byByZWFkIG9yIHdyaXRlCi0gKiAgICAgICAgICAgICAgYml0X3dpZHRoICAgICAgICAgICAtIEZpZWxkIHdpZHRoIGluIGJpdHMgKDgsIDE2LCAzMiwgb3IgNjQpCi0gKiAgICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgICAtIFBvaW50ZXIgdG8gaW4gb3Igb3V0IHZhbHVlLCBtdXN0IGJlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bGwgNjQtYml0IGFjcGlfaW50ZWdlcgotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKLSAqCi0gKiBERVNDUklQVElPTjogRGlzcGF0Y2ggYW4gYWRkcmVzcyBzcGFjZSBvciBvcGVyYXRpb24gcmVnaW9uIGFjY2VzcyB0bwotICogICAgICAgICAgICAgIGEgcHJldmlvdXNseSBpbnN0YWxsZWQgaGFuZGxlci4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1hY3BpX3N0YXR1cwotYWNwaV9ldl9hZGRyZXNzX3NwYWNlX2Rpc3BhdGNoKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnJlZ2lvbl9vYmosCi0JCQkgICAgICAgdTMyIGZ1bmN0aW9uLAotCQkJICAgICAgIGFjcGlfcGh5c2ljYWxfYWRkcmVzcyBhZGRyZXNzLAotCQkJICAgICAgIHUzMiBiaXRfd2lkdGgsIGFjcGlfaW50ZWdlciAqIHZhbHVlKQotewotCWFjcGlfc3RhdHVzIHN0YXR1czsKLQlhY3BpX2Fkcl9zcGFjZV9oYW5kbGVyIGhhbmRsZXI7Ci0JYWNwaV9hZHJfc3BhY2Vfc2V0dXAgcmVnaW9uX3NldHVwOwotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKmhhbmRsZXJfZGVzYzsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpyZWdpb25fb2JqMjsKLQl2b2lkICpyZWdpb25fY29udGV4dCA9IE5VTEw7Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGV2X2FkZHJlc3Nfc3BhY2VfZGlzcGF0Y2gpOwotCi0JcmVnaW9uX29iajIgPSBhY3BpX25zX2dldF9zZWNvbmRhcnlfb2JqZWN0KHJlZ2lvbl9vYmopOwotCWlmICghcmVnaW9uX29iajIpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PVF9FWElTVCk7Ci0JfQotCi0JLyogRW5zdXJlIHRoYXQgdGhlcmUgaXMgYSBoYW5kbGVyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJlZ2lvbiAqLwotCi0JaGFuZGxlcl9kZXNjID0gcmVnaW9uX29iai0+cmVnaW9uLmhhbmRsZXI7Ci0JaWYgKCFoYW5kbGVyX2Rlc2MpIHsKLQkJQUNQSV9FUlJPUigoQUVfSU5GTywKLQkJCSAgICAiTm8gaGFuZGxlciBmb3IgUmVnaW9uIFslNC40c10gKCVwKSBbJXNdIiwKLQkJCSAgICBhY3BpX3V0X2dldF9ub2RlX25hbWUocmVnaW9uX29iai0+cmVnaW9uLm5vZGUpLAotCQkJICAgIHJlZ2lvbl9vYmosCi0JCQkgICAgYWNwaV91dF9nZXRfcmVnaW9uX25hbWUocmVnaW9uX29iai0+cmVnaW9uLgotCQkJCQkJICAgIHNwYWNlX2lkKSkpOwotCi0JCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT1RfRVhJU1QpOwotCX0KLQotCS8qCi0JICogSXQgbWF5IGJlIHRoZSBjYXNlIHRoYXQgdGhlIHJlZ2lvbiBoYXMgbmV2ZXIgYmVlbiBpbml0aWFsaXplZAotCSAqIFNvbWUgdHlwZXMgb2YgcmVnaW9ucyByZXF1aXJlIHNwZWNpYWwgaW5pdCBjb2RlCi0JICovCi0JaWYgKCEocmVnaW9uX29iai0+cmVnaW9uLmZsYWdzICYgQU9QT0JKX1NFVFVQX0NPTVBMRVRFKSkgewotCQkvKgotCQkgKiBUaGlzIHJlZ2lvbiBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQgeWV0LCBkbyBpdAotCQkgKi8KLQkJcmVnaW9uX3NldHVwID0gaGFuZGxlcl9kZXNjLT5hZGRyZXNzX3NwYWNlLnNldHVwOwotCQlpZiAoIXJlZ2lvbl9zZXR1cCkgewotCi0JCQkvKiBObyBpbml0aWFsaXphdGlvbiByb3V0aW5lLCBleGl0IHdpdGggZXJyb3IgKi8KLQotCQkJQUNQSV9FUlJPUigoQUVfSU5GTywKLQkJCQkgICAgIk5vIGluaXQgcm91dGluZSBmb3IgcmVnaW9uKCVwKSBbJXNdIiwKLQkJCQkgICAgcmVnaW9uX29iaiwKLQkJCQkgICAgYWNwaV91dF9nZXRfcmVnaW9uX25hbWUocmVnaW9uX29iai0+cmVnaW9uLgotCQkJCQkJCSAgICBzcGFjZV9pZCkpKTsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT1RfRVhJU1QpOwotCQl9Ci0KLQkJLyoKLQkJICogV2UgbXVzdCBleGl0IHRoZSBpbnRlcnByZXRlciBiZWNhdXNlIHRoZSByZWdpb24KLQkJICogc2V0dXAgd2lsbCBwb3RlbnRpYWxseSBleGVjdXRlIGNvbnRyb2wgbWV0aG9kcwotCQkgKiAoZS5nLiwgX1JFRyBtZXRob2QgZm9yIHRoaXMgcmVnaW9uKQotCQkgKi8KLQkJYWNwaV9leF9leGl0X2ludGVycHJldGVyKCk7Ci0KLQkJc3RhdHVzID0gcmVnaW9uX3NldHVwKHJlZ2lvbl9vYmosIEFDUElfUkVHSU9OX0FDVElWQVRFLAotCQkJCSAgICAgIGhhbmRsZXJfZGVzYy0+YWRkcmVzc19zcGFjZS5jb250ZXh0LAotCQkJCSAgICAgICZyZWdpb25fY29udGV4dCk7Ci0KLQkJLyogUmUtZW50ZXIgdGhlIGludGVycHJldGVyICovCi0KLQkJYWNwaV9leF9lbnRlcl9pbnRlcnByZXRlcigpOwotCi0JCS8qIENoZWNrIGZvciBmYWlsdXJlIG9mIHRoZSBSZWdpb24gU2V0dXAgKi8KLQotCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJCUFDUElfRVhDRVBUSU9OKChBRV9JTkZPLCBzdGF0dXMsCi0JCQkJCSJEdXJpbmcgcmVnaW9uIGluaXRpYWxpemF0aW9uOiBbJXNdIiwKLQkJCQkJYWNwaV91dF9nZXRfcmVnaW9uX25hbWUocmVnaW9uX29iai0+Ci0JCQkJCQkJCXJlZ2lvbi4KLQkJCQkJCQkJc3BhY2VfaWQpKSk7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLQkJfQotCi0JCS8qCi0JCSAqIFJlZ2lvbiBpbml0aWFsaXphdGlvbiBtYXkgaGF2ZSBiZWVuIGNvbXBsZXRlZCBieSByZWdpb25fc2V0dXAKLQkJICovCi0JCWlmICghKHJlZ2lvbl9vYmotPnJlZ2lvbi5mbGFncyAmIEFPUE9CSl9TRVRVUF9DT01QTEVURSkpIHsKLQkJCXJlZ2lvbl9vYmotPnJlZ2lvbi5mbGFncyB8PSBBT1BPQkpfU0VUVVBfQ09NUExFVEU7Ci0KLQkJCWlmIChyZWdpb25fb2JqMi0+ZXh0cmEucmVnaW9uX2NvbnRleHQpIHsKLQotCQkJCS8qIFRoZSBoYW5kbGVyIGZvciB0aGlzIHJlZ2lvbiB3YXMgYWxyZWFkeSBpbnN0YWxsZWQgKi8KLQotCQkJCUFDUElfRlJFRShyZWdpb25fY29udGV4dCk7Ci0JCQl9IGVsc2UgewotCQkJCS8qCi0JCQkJICogU2F2ZSB0aGUgcmV0dXJuZWQgY29udGV4dCBmb3IgdXNlIGluIGFsbCBhY2Nlc3NlcyB0bwotCQkJCSAqIHRoaXMgcGFydGljdWxhciByZWdpb24KLQkJCQkgKi8KLQkJCQlyZWdpb25fb2JqMi0+ZXh0cmEucmVnaW9uX2NvbnRleHQgPQotCQkJCSAgICByZWdpb25fY29udGV4dDsKLQkJCX0KLQkJfQotCX0KLQotCS8qIFdlIGhhdmUgZXZlcnl0aGluZyB3ZSBuZWVkLCB3ZSBjYW4gaW52b2tlIHRoZSBhZGRyZXNzIHNwYWNlIGhhbmRsZXIgKi8KLQotCWhhbmRsZXIgPSBoYW5kbGVyX2Rlc2MtPmFkZHJlc3Nfc3BhY2UuaGFuZGxlcjsKLQotCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfT1BSRUdJT04sCi0JCQkgICJIYW5kbGVyICVwIChAJXApIEFkZHJlc3MgJTguOFglOC44WCBbJXNdXG4iLAotCQkJICAmcmVnaW9uX29iai0+cmVnaW9uLmhhbmRsZXItPmFkZHJlc3Nfc3BhY2UsIGhhbmRsZXIsCi0JCQkgIEFDUElfRk9STUFUX05BVElWRV9VSU5UKGFkZHJlc3MpLAotCQkJICBhY3BpX3V0X2dldF9yZWdpb25fbmFtZShyZWdpb25fb2JqLT5yZWdpb24uCi0JCQkJCQkgIHNwYWNlX2lkKSkpOwotCi0JaWYgKCEoaGFuZGxlcl9kZXNjLT5hZGRyZXNzX3NwYWNlLmhhbmRsZXJfZmxhZ3MgJgotCSAgICAgIEFDUElfQUREUl9IQU5ETEVSX0RFRkFVTFRfSU5TVEFMTEVEKSkgewotCQkvKgotCQkgKiBGb3IgaGFuZGxlcnMgb3RoZXIgdGhhbiB0aGUgZGVmYXVsdCAoc3VwcGxpZWQpIGhhbmRsZXJzLCB3ZSBtdXN0Ci0JCSAqIGV4aXQgdGhlIGludGVycHJldGVyIGJlY2F1c2UgdGhlIGhhbmRsZXIgKm1pZ2h0KiBibG9jayAtLSB3ZSBkb24ndAotCQkgKiBrbm93IHdoYXQgaXQgd2lsbCBkbywgc28gd2UgY2FuJ3QgaG9sZCB0aGUgbG9jayBvbiB0aGUgaW50ZXByZXRlci4KLQkJICovCi0JCWFjcGlfZXhfZXhpdF9pbnRlcnByZXRlcigpOwotCX0KLQotCS8qIENhbGwgdGhlIGhhbmRsZXIgKi8KLQotCXN0YXR1cyA9IGhhbmRsZXIoZnVuY3Rpb24sIGFkZHJlc3MsIGJpdF93aWR0aCwgdmFsdWUsCi0JCQkgaGFuZGxlcl9kZXNjLT5hZGRyZXNzX3NwYWNlLmNvbnRleHQsCi0JCQkgcmVnaW9uX29iajItPmV4dHJhLnJlZ2lvbl9jb250ZXh0KTsKLQotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlBQ1BJX0VYQ0VQVElPTigoQUVfSU5GTywgc3RhdHVzLCAiUmV0dXJuZWQgYnkgSGFuZGxlciBmb3IgWyVzXSIsCi0JCQkJYWNwaV91dF9nZXRfcmVnaW9uX25hbWUocmVnaW9uX29iai0+cmVnaW9uLgotCQkJCQkJCXNwYWNlX2lkKSkpOwotCX0KLQotCWlmICghKGhhbmRsZXJfZGVzYy0+YWRkcmVzc19zcGFjZS5oYW5kbGVyX2ZsYWdzICYKLQkgICAgICBBQ1BJX0FERFJfSEFORExFUl9ERUZBVUxUX0lOU1RBTExFRCkpIHsKLQkJLyoKLQkJICogV2UganVzdCByZXR1cm5lZCBmcm9tIGEgbm9uLWRlZmF1bHQgaGFuZGxlciwgd2UgbXVzdCByZS1lbnRlciB0aGUKLQkJICogaW50ZXJwcmV0ZXIKLQkJICovCi0JCWFjcGlfZXhfZW50ZXJfaW50ZXJwcmV0ZXIoKTsKLQl9Ci0KLQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9ldl9kZXRhY2hfcmVnaW9uCi0gKgotICogUEFSQU1FVEVSUzogIHJlZ2lvbl9vYmogICAgICAgICAgLSBSZWdpb24gT2JqZWN0Ci0gKiAgICAgICAgICAgICAgYWNwaV9uc19pc19sb2NrZWQgICAtIE5hbWVzcGFjZSBSZWdpb24gQWxyZWFkeSBMb2NrZWQ/Ci0gKgotICogUkVUVVJOOiAgICAgIE5vbmUKLSAqCi0gKiBERVNDUklQVElPTjogQnJlYWsgdGhlIGFzc29jaWF0aW9uIGJldHdlZW4gdGhlIGhhbmRsZXIgYW5kIHRoZSByZWdpb24KLSAqICAgICAgICAgICAgICB0aGlzIGlzIGEgdHdvIHdheSBhc3NvY2lhdGlvbi4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi12b2lkCi1hY3BpX2V2X2RldGFjaF9yZWdpb24odW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqcmVnaW9uX29iaiwKLQkJICAgICAgdTggYWNwaV9uc19pc19sb2NrZWQpCi17Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqaGFuZGxlcl9vYmo7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2M7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKmxhc3Rfb2JqX3B0cjsKLQlhY3BpX2Fkcl9zcGFjZV9zZXR1cCByZWdpb25fc2V0dXA7Ci0Jdm9pZCAqKnJlZ2lvbl9jb250ZXh0OwotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnJlZ2lvbl9vYmoyOwotCWFjcGlfc3RhdHVzIHN0YXR1czsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UoZXZfZGV0YWNoX3JlZ2lvbik7Ci0KLQlyZWdpb25fb2JqMiA9IGFjcGlfbnNfZ2V0X3NlY29uZGFyeV9vYmplY3QocmVnaW9uX29iaik7Ci0JaWYgKCFyZWdpb25fb2JqMikgewotCQlyZXR1cm5fVk9JRDsKLQl9Ci0JcmVnaW9uX2NvbnRleHQgPSAmcmVnaW9uX29iajItPmV4dHJhLnJlZ2lvbl9jb250ZXh0OwotCi0JLyogR2V0IHRoZSBhZGRyZXNzIGhhbmRsZXIgZnJvbSB0aGUgcmVnaW9uIG9iamVjdCAqLwotCi0JaGFuZGxlcl9vYmogPSByZWdpb25fb2JqLT5yZWdpb24uaGFuZGxlcjsKLQlpZiAoIWhhbmRsZXJfb2JqKSB7Ci0KLQkJLyogVGhpcyByZWdpb24gaGFzIG5vIGhhbmRsZXIsIGFsbCBkb25lICovCi0KLQkJcmV0dXJuX1ZPSUQ7Ci0JfQotCi0JLyogRmluZCB0aGlzIHJlZ2lvbiBpbiB0aGUgaGFuZGxlcidzIGxpc3QgKi8KLQotCW9ial9kZXNjID0gaGFuZGxlcl9vYmotPmFkZHJlc3Nfc3BhY2UucmVnaW9uX2xpc3Q7Ci0JbGFzdF9vYmpfcHRyID0gJmhhbmRsZXJfb2JqLT5hZGRyZXNzX3NwYWNlLnJlZ2lvbl9saXN0OwotCi0Jd2hpbGUgKG9ial9kZXNjKSB7Ci0KLQkJLyogSXMgdGhpcyB0aGUgY29ycmVjdCBSZWdpb24/ICovCi0KLQkJaWYgKG9ial9kZXNjID09IHJlZ2lvbl9vYmopIHsKLQkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfT1BSRUdJT04sCi0JCQkJCSAgIlJlbW92aW5nIFJlZ2lvbiAlcCBmcm9tIGFkZHJlc3MgaGFuZGxlciAlcFxuIiwKLQkJCQkJICByZWdpb25fb2JqLCBoYW5kbGVyX29iaikpOwotCi0JCQkvKiBUaGlzIGlzIGl0LCByZW1vdmUgaXQgZnJvbSB0aGUgaGFuZGxlcidzIGxpc3QgKi8KLQotCQkJKmxhc3Rfb2JqX3B0ciA9IG9ial9kZXNjLT5yZWdpb24ubmV4dDsKLQkJCW9ial9kZXNjLT5yZWdpb24ubmV4dCA9IE5VTEw7CS8qIE11c3QgY2xlYXIgZmllbGQgKi8KLQotCQkJaWYgKGFjcGlfbnNfaXNfbG9ja2VkKSB7Ci0JCQkJc3RhdHVzID0KLQkJCQkgICAgYWNwaV91dF9yZWxlYXNlX211dGV4KEFDUElfTVRYX05BTUVTUEFDRSk7Ci0JCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCQkJCXJldHVybl9WT0lEOwotCQkJCX0KLQkJCX0KLQotCQkJLyogTm93IHN0b3AgcmVnaW9uIGFjY2Vzc2VzIGJ5IGV4ZWN1dGluZyB0aGUgX1JFRyBtZXRob2QgKi8KLQotCQkJc3RhdHVzID0gYWNwaV9ldl9leGVjdXRlX3JlZ19tZXRob2QocmVnaW9uX29iaiwgMCk7Ci0JCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJCQlBQ1BJX0VYQ0VQVElPTigoQUVfSU5GTywgc3RhdHVzLAotCQkJCQkJImZyb20gcmVnaW9uIF9SRUcsIFslc10iLAotCQkJCQkJYWNwaV91dF9nZXRfcmVnaW9uX25hbWUKLQkJCQkJCShyZWdpb25fb2JqLT5yZWdpb24uc3BhY2VfaWQpKSk7Ci0JCQl9Ci0KLQkJCWlmIChhY3BpX25zX2lzX2xvY2tlZCkgewotCQkJCXN0YXR1cyA9Ci0JCQkJICAgIGFjcGlfdXRfYWNxdWlyZV9tdXRleChBQ1BJX01UWF9OQU1FU1BBQ0UpOwotCQkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQkJCQlyZXR1cm5fVk9JRDsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8qCi0JCQkgKiBJZiB0aGUgcmVnaW9uIGhhcyBiZWVuIGFjdGl2YXRlZCwgY2FsbCB0aGUgc2V0dXAgaGFuZGxlcgotCQkJICogd2l0aCB0aGUgZGVhY3RpdmF0ZSBub3RpZmljYXRpb24KLQkJCSAqLwotCQkJaWYgKHJlZ2lvbl9vYmotPnJlZ2lvbi5mbGFncyAmIEFPUE9CSl9TRVRVUF9DT01QTEVURSkgewotCQkJCXJlZ2lvbl9zZXR1cCA9IGhhbmRsZXJfb2JqLT5hZGRyZXNzX3NwYWNlLnNldHVwOwotCQkJCXN0YXR1cyA9Ci0JCQkJICAgIHJlZ2lvbl9zZXR1cChyZWdpb25fb2JqLAotCQkJCQkJIEFDUElfUkVHSU9OX0RFQUNUSVZBVEUsCi0JCQkJCQkgaGFuZGxlcl9vYmotPmFkZHJlc3Nfc3BhY2UuCi0JCQkJCQkgY29udGV4dCwgcmVnaW9uX2NvbnRleHQpOwotCi0JCQkJLyogSW5pdCByb3V0aW5lIG1heSBmYWlsLCBKdXN0IGlnbm9yZSBlcnJvcnMgKi8KLQotCQkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQkJCQlBQ1BJX0VYQ0VQVElPTigoQUVfSU5GTywgc3RhdHVzLAotCQkJCQkJCSJmcm9tIHJlZ2lvbiBoYW5kbGVyIC0gZGVhY3RpdmF0ZSwgWyVzXSIsCi0JCQkJCQkJYWNwaV91dF9nZXRfcmVnaW9uX25hbWUKLQkJCQkJCQkocmVnaW9uX29iai0+cmVnaW9uLgotCQkJCQkJCSBzcGFjZV9pZCkpKTsKLQkJCQl9Ci0KLQkJCQlyZWdpb25fb2JqLT5yZWdpb24uZmxhZ3MgJj0KLQkJCQkgICAgfihBT1BPQkpfU0VUVVBfQ09NUExFVEUpOwotCQkJfQotCi0JCQkvKgotCQkJICogUmVtb3ZlIGhhbmRsZXIgcmVmZXJlbmNlIGluIHRoZSByZWdpb24KLQkJCSAqCi0JCQkgKiBOT1RFOiB0aGlzIGRvZXNuJ3QgbWVhbiB0aGF0IHRoZSByZWdpb24gZ29lcyBhd2F5LCB0aGUgcmVnaW9uCi0JCQkgKiBpcyBqdXN0IGluYWNjZXNzaWJsZSBhcyBpbmRpY2F0ZWQgdG8gdGhlIF9SRUcgbWV0aG9kCi0JCQkgKgotCQkJICogSWYgdGhlIHJlZ2lvbiBpcyBvbiB0aGUgaGFuZGxlcidzIGxpc3QsIHRoaXMgbXVzdCBiZSB0aGUKLQkJCSAqIHJlZ2lvbidzIGhhbmRsZXIKLQkJCSAqLwotCQkJcmVnaW9uX29iai0+cmVnaW9uLmhhbmRsZXIgPSBOVUxMOwotCQkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKGhhbmRsZXJfb2JqKTsKLQotCQkJcmV0dXJuX1ZPSUQ7Ci0JCX0KLQotCQkvKiBXYWxrIHRoZSBsaW5rZWQgbGlzdCBvZiBoYW5kbGVycyAqLwotCi0JCWxhc3Rfb2JqX3B0ciA9ICZvYmpfZGVzYy0+cmVnaW9uLm5leHQ7Ci0JCW9ial9kZXNjID0gb2JqX2Rlc2MtPnJlZ2lvbi5uZXh0OwotCX0KLQotCS8qIElmIHdlIGdldCBoZXJlLCB0aGUgcmVnaW9uIHdhcyBub3QgaW4gdGhlIGhhbmRsZXIncyByZWdpb24gbGlzdCAqLwotCi0JQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9PUFJFR0lPTiwKLQkJCSAgIkNhbm5vdCByZW1vdmUgcmVnaW9uICVwIGZyb20gYWRkcmVzcyBoYW5kbGVyICVwXG4iLAotCQkJICByZWdpb25fb2JqLCBoYW5kbGVyX29iaikpOwotCi0JcmV0dXJuX1ZPSUQ7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfZXZfYXR0YWNoX3JlZ2lvbgotICoKLSAqIFBBUkFNRVRFUlM6ICBoYW5kbGVyX29iaiAgICAgICAgIC0gSGFuZGxlciBPYmplY3QKLSAqICAgICAgICAgICAgICByZWdpb25fb2JqICAgICAgICAgIC0gUmVnaW9uIE9iamVjdAotICogICAgICAgICAgICAgIGFjcGlfbnNfaXNfbG9ja2VkICAgLSBOYW1lc3BhY2UgUmVnaW9uIEFscmVhZHkgTG9ja2VkPwotICoKLSAqIFJFVFVSTjogICAgICBOb25lCi0gKgotICogREVTQ1JJUFRJT046IENyZWF0ZSB0aGUgYXNzb2NpYXRpb24gYmV0d2VlbiB0aGUgaGFuZGxlciBhbmQgdGhlIHJlZ2lvbgotICogICAgICAgICAgICAgIHRoaXMgaXMgYSB0d28gd2F5IGFzc29jaWF0aW9uLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWFjcGlfc3RhdHVzCi1hY3BpX2V2X2F0dGFjaF9yZWdpb24odW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqaGFuZGxlcl9vYmosCi0JCSAgICAgIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnJlZ2lvbl9vYmosCi0JCSAgICAgIHU4IGFjcGlfbnNfaXNfbG9ja2VkKQotewotCi0JQUNQSV9GVU5DVElPTl9UUkFDRShldl9hdHRhY2hfcmVnaW9uKTsKLQotCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfT1BSRUdJT04sCi0JCQkgICJBZGRpbmcgUmVnaW9uIFslNC40c10gJXAgdG8gYWRkcmVzcyBoYW5kbGVyICVwIFslc11cbiIsCi0JCQkgIGFjcGlfdXRfZ2V0X25vZGVfbmFtZShyZWdpb25fb2JqLT5yZWdpb24ubm9kZSksCi0JCQkgIHJlZ2lvbl9vYmosIGhhbmRsZXJfb2JqLAotCQkJICBhY3BpX3V0X2dldF9yZWdpb25fbmFtZShyZWdpb25fb2JqLT5yZWdpb24uCi0JCQkJCQkgIHNwYWNlX2lkKSkpOwotCi0JLyogTGluayB0aGlzIHJlZ2lvbiB0byB0aGUgZnJvbnQgb2YgdGhlIGhhbmRsZXIncyBsaXN0ICovCi0KLQlyZWdpb25fb2JqLT5yZWdpb24ubmV4dCA9IGhhbmRsZXJfb2JqLT5hZGRyZXNzX3NwYWNlLnJlZ2lvbl9saXN0OwotCWhhbmRsZXJfb2JqLT5hZGRyZXNzX3NwYWNlLnJlZ2lvbl9saXN0ID0gcmVnaW9uX29iajsKLQotCS8qIEluc3RhbGwgdGhlIHJlZ2lvbidzIGhhbmRsZXIgKi8KLQotCWlmIChyZWdpb25fb2JqLT5yZWdpb24uaGFuZGxlcikgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQUxSRUFEWV9FWElTVFMpOwotCX0KLQotCXJlZ2lvbl9vYmotPnJlZ2lvbi5oYW5kbGVyID0gaGFuZGxlcl9vYmo7Ci0JYWNwaV91dF9hZGRfcmVmZXJlbmNlKGhhbmRsZXJfb2JqKTsKLQotCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfZXZfaW5zdGFsbF9oYW5kbGVyCi0gKgotICogUEFSQU1FVEVSUzogIHdhbGtfbmFtZXNwYWNlIGNhbGxiYWNrCi0gKgotICogREVTQ1JJUFRJT046IFRoaXMgcm91dGluZSBpbnN0YWxscyBhbiBhZGRyZXNzIGhhbmRsZXIgaW50byBvYmplY3RzIHRoYXQgYXJlCi0gKiAgICAgICAgICAgICAgb2YgdHlwZSBSZWdpb24gb3IgRGV2aWNlLgotICoKLSAqICAgICAgICAgICAgICBJZiB0aGUgT2JqZWN0IGlzIGEgRGV2aWNlLCBhbmQgdGhlIGRldmljZSBoYXMgYSBoYW5kbGVyIG9mCi0gKiAgICAgICAgICAgICAgdGhlIHNhbWUgdHlwZSB0aGVuIHRoZSBzZWFyY2ggaXMgdGVybWluYXRlZCBpbiB0aGF0IGJyYW5jaC4KLSAqCi0gKiAgICAgICAgICAgICAgVGhpcyBpcyBiZWNhdXNlIHRoZSBleGlzdGluZyBoYW5kbGVyIGlzIGNsb3NlciBpbiBwcm94aW1pdHkKLSAqICAgICAgICAgICAgICB0byBhbnkgbW9yZSByZWdpb25zIHRoYW4gdGhlIG9uZSB3ZSBhcmUgdHJ5aW5nIHRvIGluc3RhbGwuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIGFjcGlfc3RhdHVzCi1hY3BpX2V2X2luc3RhbGxfaGFuZGxlcihhY3BpX2hhbmRsZSBvYmpfaGFuZGxlLAotCQkJdTMyIGxldmVsLCB2b2lkICpjb250ZXh0LCB2b2lkICoqcmV0dXJuX3ZhbHVlKQotewotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKmhhbmRsZXJfb2JqOwotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm5leHRfaGFuZGxlcl9vYmo7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2M7Ci0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGU7Ci0JYWNwaV9zdGF0dXMgc3RhdHVzOwotCi0JQUNQSV9GVU5DVElPTl9OQU1FKGV2X2luc3RhbGxfaGFuZGxlcik7Ci0KLQloYW5kbGVyX29iaiA9ICh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICopY29udGV4dDsKLQotCS8qIFBhcmFtZXRlciB2YWxpZGF0aW9uICovCi0KLQlpZiAoIWhhbmRsZXJfb2JqKSB7Ci0JCXJldHVybiAoQUVfT0spOwotCX0KLQotCS8qIENvbnZlcnQgYW5kIHZhbGlkYXRlIHRoZSBkZXZpY2UgaGFuZGxlICovCi0KLQlub2RlID0gYWNwaV9uc19tYXBfaGFuZGxlX3RvX25vZGUob2JqX2hhbmRsZSk7Ci0JaWYgKCFub2RlKSB7Ci0JCXJldHVybiAoQUVfQkFEX1BBUkFNRVRFUik7Ci0JfQotCi0JLyoKLQkgKiBXZSBvbmx5IGNhcmUgYWJvdXQgcmVnaW9ucy5hbmQgb2JqZWN0cwotCSAqIHRoYXQgYXJlIGFsbG93ZWQgdG8gaGF2ZSBhZGRyZXNzIHNwYWNlIGhhbmRsZXJzCi0JICovCi0JaWYgKChub2RlLT50eXBlICE9IEFDUElfVFlQRV9ERVZJQ0UpICYmCi0JICAgIChub2RlLT50eXBlICE9IEFDUElfVFlQRV9SRUdJT04pICYmIChub2RlICE9IGFjcGlfZ2JsX3Jvb3Rfbm9kZSkpIHsKLQkJcmV0dXJuIChBRV9PSyk7Ci0JfQotCi0JLyogQ2hlY2sgZm9yIGFuIGV4aXN0aW5nIGludGVybmFsIG9iamVjdCAqLwotCi0Jb2JqX2Rlc2MgPSBhY3BpX25zX2dldF9hdHRhY2hlZF9vYmplY3Qobm9kZSk7Ci0JaWYgKCFvYmpfZGVzYykgewotCi0JCS8qIE5vIG9iamVjdCwganVzdCBleGl0ICovCi0KLQkJcmV0dXJuIChBRV9PSyk7Ci0JfQotCi0JLyogRGV2aWNlcyBhcmUgaGFuZGxlZCBkaWZmZXJlbnQgdGhhbiByZWdpb25zICovCi0KLQlpZiAoQUNQSV9HRVRfT0JKRUNUX1RZUEUob2JqX2Rlc2MpID09IEFDUElfVFlQRV9ERVZJQ0UpIHsKLQotCQkvKiBDaGVjayBpZiB0aGlzIERldmljZSBhbHJlYWR5IGhhcyBhIGhhbmRsZXIgZm9yIHRoaXMgYWRkcmVzcyBzcGFjZSAqLwotCi0JCW5leHRfaGFuZGxlcl9vYmogPSBvYmpfZGVzYy0+ZGV2aWNlLmhhbmRsZXI7Ci0JCXdoaWxlIChuZXh0X2hhbmRsZXJfb2JqKSB7Ci0KLQkJCS8qIEZvdW5kIGEgaGFuZGxlciwgaXMgaXQgZm9yIHRoZSBzYW1lIGFkZHJlc3Mgc3BhY2U/ICovCi0KLQkJCWlmIChuZXh0X2hhbmRsZXJfb2JqLT5hZGRyZXNzX3NwYWNlLnNwYWNlX2lkID09Ci0JCQkgICAgaGFuZGxlcl9vYmotPmFkZHJlc3Nfc3BhY2Uuc3BhY2VfaWQpIHsKLQkJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX09QUkVHSU9OLAotCQkJCQkJICAiRm91bmQgaGFuZGxlciBmb3IgcmVnaW9uIFslc10gaW4gZGV2aWNlICVwKCVwKSBoYW5kbGVyICVwXG4iLAotCQkJCQkJICBhY3BpX3V0X2dldF9yZWdpb25fbmFtZQotCQkJCQkJICAoaGFuZGxlcl9vYmotPmFkZHJlc3Nfc3BhY2UuCi0JCQkJCQkgICBzcGFjZV9pZCksIG9ial9kZXNjLAotCQkJCQkJICBuZXh0X2hhbmRsZXJfb2JqLAotCQkJCQkJICBoYW5kbGVyX29iaikpOwotCi0JCQkJLyoKLQkJCQkgKiBTaW5jZSB0aGUgb2JqZWN0IHdlIGZvdW5kIGl0IG9uIHdhcyBhIGRldmljZSwgdGhlbiBpdAotCQkJCSAqIG1lYW5zIHRoYXQgc29tZW9uZSBoYXMgYWxyZWFkeSBpbnN0YWxsZWQgYSBoYW5kbGVyIGZvcgotCQkJCSAqIHRoZSBicmFuY2ggb2YgdGhlIG5hbWVzcGFjZSBmcm9tIHRoaXMgZGV2aWNlIG9uLiAgSnVzdAotCQkJCSAqIGJhaWwgb3V0IHRlbGxpbmcgdGhlIHdhbGsgcm91dGluZSB0byBub3QgdHJhdmVyc2UgdGhpcwotCQkJCSAqIGJyYW5jaC4gIFRoaXMgcHJlc2VydmVzIHRoZSBzY29waW5nIHJ1bGUgZm9yIGhhbmRsZXJzLgotCQkJCSAqLwotCQkJCXJldHVybiAoQUVfQ1RSTF9ERVBUSCk7Ci0JCQl9Ci0KLQkJCS8qIFdhbGsgdGhlIGxpbmtlZCBsaXN0IG9mIGhhbmRsZXJzIGF0dGFjaGVkIHRvIHRoaXMgZGV2aWNlICovCi0KLQkJCW5leHRfaGFuZGxlcl9vYmogPSBuZXh0X2hhbmRsZXJfb2JqLT5hZGRyZXNzX3NwYWNlLm5leHQ7Ci0JCX0KLQotCQkvKgotCQkgKiBBcyBsb25nIGFzIHRoZSBkZXZpY2UgZGlkbid0IGhhdmUgYSBoYW5kbGVyIGZvciB0aGlzCi0JCSAqIHNwYWNlIHdlIGRvbid0IGNhcmUgYWJvdXQgaXQuICBXZSBqdXN0IGlnbm9yZSBpdCBhbmQKLQkJICogcHJvY2VlZC4KLQkJICovCi0JCXJldHVybiAoQUVfT0spOwotCX0KLQotCS8qIE9iamVjdCBpcyBhIFJlZ2lvbiAqLwotCi0JaWYgKG9ial9kZXNjLT5yZWdpb24uc3BhY2VfaWQgIT0gaGFuZGxlcl9vYmotPmFkZHJlc3Nfc3BhY2Uuc3BhY2VfaWQpIHsKLQkJLyoKLQkJICogVGhpcyByZWdpb24gaXMgZm9yIGEgZGlmZmVyZW50IGFkZHJlc3Mgc3BhY2UKLQkJICogLS0ganVzdCBpZ25vcmUgaXQKLQkJICovCi0JCXJldHVybiAoQUVfT0spOwotCX0KLQotCS8qCi0JICogTm93IHdlIGhhdmUgYSByZWdpb24gYW5kIGl0IGlzIGZvciB0aGUgaGFuZGxlcidzIGFkZHJlc3MKLQkgKiBzcGFjZSB0eXBlLgotCSAqCi0JICogRmlyc3QgZGlzY29ubmVjdCByZWdpb24gZm9yIGFueSBwcmV2aW91cyBoYW5kbGVyIChpZiBhbnkpCi0JICovCi0JYWNwaV9ldl9kZXRhY2hfcmVnaW9uKG9ial9kZXNjLCBGQUxTRSk7Ci0KLQkvKiBDb25uZWN0IHRoZSByZWdpb24gdG8gdGhlIG5ldyBoYW5kbGVyICovCi0KLQlzdGF0dXMgPSBhY3BpX2V2X2F0dGFjaF9yZWdpb24oaGFuZGxlcl9vYmosIG9ial9kZXNjLCBGQUxTRSk7Ci0JcmV0dXJuIChzdGF0dXMpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX2V2X2luc3RhbGxfc3BhY2VfaGFuZGxlcgotICoKLSAqIFBBUkFNRVRFUlM6ICBOb2RlICAgICAgICAgICAgLSBOYW1lc3BhY2Ugbm9kZSBmb3IgdGhlIGRldmljZQotICogICAgICAgICAgICAgIHNwYWNlX2lkICAgICAgICAtIFRoZSBhZGRyZXNzIHNwYWNlIElECi0gKiAgICAgICAgICAgICAgSGFuZGxlciAgICAgICAgIC0gQWRkcmVzcyBvZiB0aGUgaGFuZGxlcgotICogICAgICAgICAgICAgIFNldHVwICAgICAgICAgICAtIEFkZHJlc3Mgb2YgdGhlIHNldHVwIGZ1bmN0aW9uCi0gKiAgICAgICAgICAgICAgQ29udGV4dCAgICAgICAgIC0gVmFsdWUgcGFzc2VkIHRvIHRoZSBoYW5kbGVyIG9uIGVhY2ggYWNjZXNzCi0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cwotICoKLSAqIERFU0NSSVBUSU9OOiBJbnN0YWxsIGEgaGFuZGxlciBmb3IgYWxsIG9wX3JlZ2lvbnMgb2YgYSBnaXZlbiBzcGFjZV9pZC4KLSAqICAgICAgICAgICAgICBBc3N1bWVzIG5hbWVzcGFjZSBpcyBsb2NrZWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1hY3BpX3N0YXR1cwotYWNwaV9ldl9pbnN0YWxsX3NwYWNlX2hhbmRsZXIoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKiBub2RlLAotCQkJICAgICAgYWNwaV9hZHJfc3BhY2VfdHlwZSBzcGFjZV9pZCwKLQkJCSAgICAgIGFjcGlfYWRyX3NwYWNlX2hhbmRsZXIgaGFuZGxlciwKLQkJCSAgICAgIGFjcGlfYWRyX3NwYWNlX3NldHVwIHNldHVwLCB2b2lkICpjb250ZXh0KQotewotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjOwotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKmhhbmRsZXJfb2JqOwotCWFjcGlfc3RhdHVzIHN0YXR1czsKLQlhY3BpX29iamVjdF90eXBlIHR5cGU7Ci0JdTggZmxhZ3MgPSAwOwotCi0JQUNQSV9GVU5DVElPTl9UUkFDRShldl9pbnN0YWxsX3NwYWNlX2hhbmRsZXIpOwotCi0JLyoKLQkgKiBUaGlzIHJlZ2lzdHJhdGlvbiBpcyB2YWxpZCBmb3Igb25seSB0aGUgdHlwZXMgYmVsb3cKLQkgKiBhbmQgdGhlIHJvb3QuICBUaGlzIGlzIHdoZXJlIHRoZSBkZWZhdWx0IGhhbmRsZXJzCi0JICogZ2V0IHBsYWNlZC4KLQkgKi8KLQlpZiAoKG5vZGUtPnR5cGUgIT0gQUNQSV9UWVBFX0RFVklDRSkgJiYKLQkgICAgKG5vZGUtPnR5cGUgIT0gQUNQSV9UWVBFX1BST0NFU1NPUikgJiYKLQkgICAgKG5vZGUtPnR5cGUgIT0gQUNQSV9UWVBFX1RIRVJNQUwpICYmIChub2RlICE9IGFjcGlfZ2JsX3Jvb3Rfbm9kZSkpIHsKLQkJc3RhdHVzID0gQUVfQkFEX1BBUkFNRVRFUjsKLQkJZ290byB1bmxvY2tfYW5kX2V4aXQ7Ci0JfQotCi0JaWYgKGhhbmRsZXIgPT0gQUNQSV9ERUZBVUxUX0hBTkRMRVIpIHsKLQkJZmxhZ3MgPSBBQ1BJX0FERFJfSEFORExFUl9ERUZBVUxUX0lOU1RBTExFRDsKLQotCQlzd2l0Y2ggKHNwYWNlX2lkKSB7Ci0JCWNhc2UgQUNQSV9BRFJfU1BBQ0VfU1lTVEVNX01FTU9SWToKLQkJCWhhbmRsZXIgPSBhY3BpX2V4X3N5c3RlbV9tZW1vcnlfc3BhY2VfaGFuZGxlcjsKLQkJCXNldHVwID0gYWNwaV9ldl9zeXN0ZW1fbWVtb3J5X3JlZ2lvbl9zZXR1cDsKLQkJCWJyZWFrOwotCi0JCWNhc2UgQUNQSV9BRFJfU1BBQ0VfU1lTVEVNX0lPOgotCQkJaGFuZGxlciA9IGFjcGlfZXhfc3lzdGVtX2lvX3NwYWNlX2hhbmRsZXI7Ci0JCQlzZXR1cCA9IGFjcGlfZXZfaW9fc3BhY2VfcmVnaW9uX3NldHVwOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBBQ1BJX0FEUl9TUEFDRV9QQ0lfQ09ORklHOgotCQkJaGFuZGxlciA9IGFjcGlfZXhfcGNpX2NvbmZpZ19zcGFjZV9oYW5kbGVyOwotCQkJc2V0dXAgPSBhY3BpX2V2X3BjaV9jb25maWdfcmVnaW9uX3NldHVwOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBBQ1BJX0FEUl9TUEFDRV9DTU9TOgotCQkJaGFuZGxlciA9IGFjcGlfZXhfY21vc19zcGFjZV9oYW5kbGVyOwotCQkJc2V0dXAgPSBhY3BpX2V2X2Ntb3NfcmVnaW9uX3NldHVwOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBBQ1BJX0FEUl9TUEFDRV9QQ0lfQkFSX1RBUkdFVDoKLQkJCWhhbmRsZXIgPSBhY3BpX2V4X3BjaV9iYXJfc3BhY2VfaGFuZGxlcjsKLQkJCXNldHVwID0gYWNwaV9ldl9wY2lfYmFyX3JlZ2lvbl9zZXR1cDsKLQkJCWJyZWFrOwotCi0JCWNhc2UgQUNQSV9BRFJfU1BBQ0VfREFUQV9UQUJMRToKLQkJCWhhbmRsZXIgPSBhY3BpX2V4X2RhdGFfdGFibGVfc3BhY2VfaGFuZGxlcjsKLQkJCXNldHVwID0gTlVMTDsKLQkJCWJyZWFrOwotCi0JCWRlZmF1bHQ6Ci0JCQlzdGF0dXMgPSBBRV9CQURfUEFSQU1FVEVSOwotCQkJZ290byB1bmxvY2tfYW5kX2V4aXQ7Ci0JCX0KLQl9Ci0KLQkvKiBJZiB0aGUgY2FsbGVyIGhhc24ndCBzcGVjaWZpZWQgYSBzZXR1cCByb3V0aW5lLCB1c2UgdGhlIGRlZmF1bHQgKi8KLQotCWlmICghc2V0dXApIHsKLQkJc2V0dXAgPSBhY3BpX2V2X2RlZmF1bHRfcmVnaW9uX3NldHVwOwotCX0KLQotCS8qIENoZWNrIGZvciBhbiBleGlzdGluZyBpbnRlcm5hbCBvYmplY3QgKi8KLQotCW9ial9kZXNjID0gYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0KG5vZGUpOwotCWlmIChvYmpfZGVzYykgewotCQkvKgotCQkgKiBUaGUgYXR0YWNoZWQgZGV2aWNlIG9iamVjdCBhbHJlYWR5IGV4aXN0cy4KLQkJICogTWFrZSBzdXJlIHRoZSBoYW5kbGVyIGlzIG5vdCBhbHJlYWR5IGluc3RhbGxlZC4KLQkJICovCi0JCWhhbmRsZXJfb2JqID0gb2JqX2Rlc2MtPmRldmljZS5oYW5kbGVyOwotCi0JCS8qIFdhbGsgdGhlIGhhbmRsZXIgbGlzdCBmb3IgdGhpcyBkZXZpY2UgKi8KLQotCQl3aGlsZSAoaGFuZGxlcl9vYmopIHsKLQotCQkJLyogU2FtZSBzcGFjZV9pZCBpbmRpY2F0ZXMgYSBoYW5kbGVyIGFscmVhZHkgaW5zdGFsbGVkICovCi0KLQkJCWlmIChoYW5kbGVyX29iai0+YWRkcmVzc19zcGFjZS5zcGFjZV9pZCA9PSBzcGFjZV9pZCkgewotCQkJCWlmIChoYW5kbGVyX29iai0+YWRkcmVzc19zcGFjZS5oYW5kbGVyID09Ci0JCQkJICAgIGhhbmRsZXIpIHsKLQkJCQkJLyoKLQkJCQkJICogSXQgaXMgKHJlbGF0aXZlbHkpIE9LIHRvIGF0dGVtcHQgdG8gaW5zdGFsbCB0aGUgU0FNRQotCQkJCQkgKiBoYW5kbGVyIHR3aWNlLiBUaGlzIGNhbiBlYXNpbHkgaGFwcGVuCi0JCQkJCSAqIHdpdGggUENJX0NvbmZpZyBzcGFjZS4KLQkJCQkJICovCi0JCQkJCXN0YXR1cyA9IEFFX1NBTUVfSEFORExFUjsKLQkJCQkJZ290byB1bmxvY2tfYW5kX2V4aXQ7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLyogQSBoYW5kbGVyIGlzIGFscmVhZHkgaW5zdGFsbGVkICovCi0KLQkJCQkJc3RhdHVzID0gQUVfQUxSRUFEWV9FWElTVFM7Ci0JCQkJfQotCQkJCWdvdG8gdW5sb2NrX2FuZF9leGl0OwotCQkJfQotCi0JCQkvKiBXYWxrIHRoZSBsaW5rZWQgbGlzdCBvZiBoYW5kbGVycyAqLwotCi0JCQloYW5kbGVyX29iaiA9IGhhbmRsZXJfb2JqLT5hZGRyZXNzX3NwYWNlLm5leHQ7Ci0JCX0KLQl9IGVsc2UgewotCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX09QUkVHSU9OLAotCQkJCSAgIkNyZWF0aW5nIG9iamVjdCBvbiBEZXZpY2UgJXAgd2hpbGUgaW5zdGFsbGluZyBoYW5kbGVyXG4iLAotCQkJCSAgbm9kZSkpOwotCi0JCS8qIG9ial9kZXNjIGRvZXMgbm90IGV4aXN0LCBjcmVhdGUgb25lICovCi0KLQkJaWYgKG5vZGUtPnR5cGUgPT0gQUNQSV9UWVBFX0FOWSkgewotCQkJdHlwZSA9IEFDUElfVFlQRV9ERVZJQ0U7Ci0JCX0gZWxzZSB7Ci0JCQl0eXBlID0gbm9kZS0+dHlwZTsKLQkJfQotCi0JCW9ial9kZXNjID0gYWNwaV91dF9jcmVhdGVfaW50ZXJuYWxfb2JqZWN0KHR5cGUpOwotCQlpZiAoIW9ial9kZXNjKSB7Ci0JCQlzdGF0dXMgPSBBRV9OT19NRU1PUlk7Ci0JCQlnb3RvIHVubG9ja19hbmRfZXhpdDsKLQkJfQotCi0JCS8qIEluaXQgbmV3IGRlc2NyaXB0b3IgKi8KLQotCQlvYmpfZGVzYy0+Y29tbW9uLnR5cGUgPSAodTgpIHR5cGU7Ci0KLQkJLyogQXR0YWNoIHRoZSBuZXcgb2JqZWN0IHRvIHRoZSBOb2RlICovCi0KLQkJc3RhdHVzID0gYWNwaV9uc19hdHRhY2hfb2JqZWN0KG5vZGUsIG9ial9kZXNjLCB0eXBlKTsKLQotCQkvKiBSZW1vdmUgbG9jYWwgcmVmZXJlbmNlIHRvIHRoZSBvYmplY3QgKi8KLQotCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2Uob2JqX2Rlc2MpOwotCi0JCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQkJZ290byB1bmxvY2tfYW5kX2V4aXQ7Ci0JCX0KLQl9Ci0KLQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX09QUkVHSU9OLAotCQkJICAiSW5zdGFsbGluZyBhZGRyZXNzIGhhbmRsZXIgZm9yIHJlZ2lvbiAlcyglWCkgb24gRGV2aWNlICU0LjRzICVwKCVwKVxuIiwKLQkJCSAgYWNwaV91dF9nZXRfcmVnaW9uX25hbWUoc3BhY2VfaWQpLCBzcGFjZV9pZCwKLQkJCSAgYWNwaV91dF9nZXRfbm9kZV9uYW1lKG5vZGUpLCBub2RlLCBvYmpfZGVzYykpOwotCi0JLyoKLQkgKiBJbnN0YWxsIHRoZSBoYW5kbGVyCi0JICoKLQkgKiBBdCB0aGlzIHBvaW50IHRoZXJlIGlzIG5vIGV4aXN0aW5nIGhhbmRsZXIuCi0JICogSnVzdCBhbGxvY2F0ZSB0aGUgb2JqZWN0IGZvciB0aGUgaGFuZGxlciBhbmQgbGluayBpdAotCSAqIGludG8gdGhlIGxpc3QuCi0JICovCi0JaGFuZGxlcl9vYmogPQotCSAgICBhY3BpX3V0X2NyZWF0ZV9pbnRlcm5hbF9vYmplY3QoQUNQSV9UWVBFX0xPQ0FMX0FERFJFU1NfSEFORExFUik7Ci0JaWYgKCFoYW5kbGVyX29iaikgewotCQlzdGF0dXMgPSBBRV9OT19NRU1PUlk7Ci0JCWdvdG8gdW5sb2NrX2FuZF9leGl0OwotCX0KLQotCS8qIEluaXQgaGFuZGxlciBvYmogKi8KLQotCWhhbmRsZXJfb2JqLT5hZGRyZXNzX3NwYWNlLnNwYWNlX2lkID0gKHU4KSBzcGFjZV9pZDsKLQloYW5kbGVyX29iai0+YWRkcmVzc19zcGFjZS5oYW5kbGVyX2ZsYWdzID0gZmxhZ3M7Ci0JaGFuZGxlcl9vYmotPmFkZHJlc3Nfc3BhY2UucmVnaW9uX2xpc3QgPSBOVUxMOwotCWhhbmRsZXJfb2JqLT5hZGRyZXNzX3NwYWNlLm5vZGUgPSBub2RlOwotCWhhbmRsZXJfb2JqLT5hZGRyZXNzX3NwYWNlLmhhbmRsZXIgPSBoYW5kbGVyOwotCWhhbmRsZXJfb2JqLT5hZGRyZXNzX3NwYWNlLmNvbnRleHQgPSBjb250ZXh0OwotCWhhbmRsZXJfb2JqLT5hZGRyZXNzX3NwYWNlLnNldHVwID0gc2V0dXA7Ci0KLQkvKiBJbnN0YWxsIGF0IGhlYWQgb2YgRGV2aWNlLmFkZHJlc3Nfc3BhY2UgbGlzdCAqLwotCi0JaGFuZGxlcl9vYmotPmFkZHJlc3Nfc3BhY2UubmV4dCA9IG9ial9kZXNjLT5kZXZpY2UuaGFuZGxlcjsKLQotCS8qCi0JICogVGhlIERldmljZSBvYmplY3QgaXMgdGhlIGZpcnN0IHJlZmVyZW5jZSBvbiB0aGUgaGFuZGxlcl9vYmouCi0JICogRWFjaCByZWdpb24gdGhhdCB1c2VzIHRoZSBoYW5kbGVyIGFkZHMgYSByZWZlcmVuY2UuCi0JICovCi0Jb2JqX2Rlc2MtPmRldmljZS5oYW5kbGVyID0gaGFuZGxlcl9vYmo7Ci0KLQkvKgotCSAqIFdhbGsgdGhlIG5hbWVzcGFjZSBmaW5kaW5nIGFsbCBvZiB0aGUgcmVnaW9ucyB0aGlzCi0JICogaGFuZGxlciB3aWxsIG1hbmFnZS4KLQkgKgotCSAqIFN0YXJ0IGF0IHRoZSBkZXZpY2UgYW5kIHNlYXJjaCB0aGUgYnJhbmNoIHRvd2FyZAotCSAqIHRoZSBsZWFmIG5vZGVzIHVudGlsIGVpdGhlciB0aGUgbGVhZiBpcyBlbmNvdW50ZXJlZCBvcgotCSAqIGEgZGV2aWNlIGlzIGRldGVjdGVkIHRoYXQgaGFzIGFuIGFkZHJlc3MgaGFuZGxlciBvZiB0aGUKLQkgKiBzYW1lIHR5cGUuCi0JICoKLQkgKiBJbiBlaXRoZXIgY2FzZSwgYmFjayB1cCBhbmQgc2VhcmNoIGRvd24gdGhlIHJlbWFpbmRlcgotCSAqIG9mIHRoZSBicmFuY2gKLQkgKi8KLQlzdGF0dXMgPSBhY3BpX25zX3dhbGtfbmFtZXNwYWNlKEFDUElfVFlQRV9BTlksIG5vZGUsIEFDUElfVUlOVDMyX01BWCwKLQkJCQkJQUNQSV9OU19XQUxLX1VOTE9DSywKLQkJCQkJYWNwaV9ldl9pbnN0YWxsX2hhbmRsZXIsIGhhbmRsZXJfb2JqLAotCQkJCQlOVUxMKTsKLQotICAgICAgdW5sb2NrX2FuZF9leGl0OgotCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX2V2X2V4ZWN1dGVfcmVnX21ldGhvZHMKLSAqCi0gKiBQQVJBTUVURVJTOiAgTm9kZSAgICAgICAgICAgIC0gTmFtZXNwYWNlIG5vZGUgZm9yIHRoZSBkZXZpY2UKLSAqICAgICAgICAgICAgICBzcGFjZV9pZCAgICAgICAgLSBUaGUgYWRkcmVzcyBzcGFjZSBJRAotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKLSAqCi0gKiBERVNDUklQVElPTjogUnVuIGFsbCBfUkVHIG1ldGhvZHMgZm9yIHRoZSBpbnB1dCBTcGFjZSBJRDsKLSAqICAgICAgICAgICAgICBOb3RlOiBhc3N1bWVzIG5hbWVzcGFjZSBpcyBsb2NrZWQsIG9yIHN5c3RlbSBpbml0IHRpbWUuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotYWNwaV9zdGF0dXMKLWFjcGlfZXZfZXhlY3V0ZV9yZWdfbWV0aG9kcyhzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZSwKLQkJCSAgICBhY3BpX2Fkcl9zcGFjZV90eXBlIHNwYWNlX2lkKQotewotCWFjcGlfc3RhdHVzIHN0YXR1czsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UoZXZfZXhlY3V0ZV9yZWdfbWV0aG9kcyk7Ci0KLQkvKgotCSAqIFJ1biBhbGwgX1JFRyBtZXRob2RzIGZvciBhbGwgT3BlcmF0aW9uIFJlZ2lvbnMgZm9yIHRoaXMKLQkgKiBzcGFjZSBJRC4gIFRoaXMgaXMgYSBzZXBhcmF0ZSB3YWxrIGluIG9yZGVyIHRvIGhhbmRsZSBhbnkKLQkgKiBpbnRlcmRlcGVuZGVuY2llcyBiZXR3ZWVuIHJlZ2lvbnMgYW5kIF9SRUcgbWV0aG9kcy4gIChpLmUuIGhhbmRsZXJzCi0JICogbXVzdCBiZSBpbnN0YWxsZWQgZm9yIGFsbCByZWdpb25zIG9mIHRoaXMgU3BhY2UgSUQgYmVmb3JlIHdlCi0JICogY2FuIHJ1biBhbnkgX1JFRyBtZXRob2RzKQotCSAqLwotCXN0YXR1cyA9IGFjcGlfbnNfd2Fsa19uYW1lc3BhY2UoQUNQSV9UWVBFX0FOWSwgbm9kZSwgQUNQSV9VSU5UMzJfTUFYLAotCQkJCQlBQ1BJX05TX1dBTEtfVU5MT0NLLCBhY3BpX2V2X3JlZ19ydW4sCi0JCQkJCSZzcGFjZV9pZCwgTlVMTCk7Ci0KLQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9ldl9yZWdfcnVuCi0gKgotICogUEFSQU1FVEVSUzogIHdhbGtfbmFtZXNwYWNlIGNhbGxiYWNrCi0gKgotICogREVTQ1JJUFRJT046IFJ1biBfUkVHIG1ldGhvZCBmb3IgcmVnaW9uIG9iamVjdHMgb2YgdGhlIHJlcXVlc3RlZCBzcGFjZV9pRAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyBhY3BpX3N0YXR1cwotYWNwaV9ldl9yZWdfcnVuKGFjcGlfaGFuZGxlIG9ial9oYW5kbGUsCi0JCXUzMiBsZXZlbCwgdm9pZCAqY29udGV4dCwgdm9pZCAqKnJldHVybl92YWx1ZSkKLXsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYzsKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZTsKLQlhY3BpX2Fkcl9zcGFjZV90eXBlIHNwYWNlX2lkOwotCWFjcGlfc3RhdHVzIHN0YXR1czsKLQotCXNwYWNlX2lkID0gKkFDUElfQ0FTVF9QVFIoYWNwaV9hZHJfc3BhY2VfdHlwZSwgY29udGV4dCk7Ci0KLQkvKiBDb252ZXJ0IGFuZCB2YWxpZGF0ZSB0aGUgZGV2aWNlIGhhbmRsZSAqLwotCi0Jbm9kZSA9IGFjcGlfbnNfbWFwX2hhbmRsZV90b19ub2RlKG9ial9oYW5kbGUpOwotCWlmICghbm9kZSkgewotCQlyZXR1cm4gKEFFX0JBRF9QQVJBTUVURVIpOwotCX0KLQotCS8qCi0JICogV2Ugb25seSBjYXJlIGFib3V0IHJlZ2lvbnMuYW5kIG9iamVjdHMKLQkgKiB0aGF0IGFyZSBhbGxvd2VkIHRvIGhhdmUgYWRkcmVzcyBzcGFjZSBoYW5kbGVycwotCSAqLwotCWlmICgobm9kZS0+dHlwZSAhPSBBQ1BJX1RZUEVfUkVHSU9OKSAmJiAobm9kZSAhPSBhY3BpX2dibF9yb290X25vZGUpKSB7Ci0JCXJldHVybiAoQUVfT0spOwotCX0KLQotCS8qIENoZWNrIGZvciBhbiBleGlzdGluZyBpbnRlcm5hbCBvYmplY3QgKi8KLQotCW9ial9kZXNjID0gYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0KG5vZGUpOwotCWlmICghb2JqX2Rlc2MpIHsKLQotCQkvKiBObyBvYmplY3QsIGp1c3QgZXhpdCAqLwotCi0JCXJldHVybiAoQUVfT0spOwotCX0KLQotCS8qIE9iamVjdCBpcyBhIFJlZ2lvbiAqLwotCi0JaWYgKG9ial9kZXNjLT5yZWdpb24uc3BhY2VfaWQgIT0gc3BhY2VfaWQpIHsKLQkJLyoKLQkJICogVGhpcyByZWdpb24gaXMgZm9yIGEgZGlmZmVyZW50IGFkZHJlc3Mgc3BhY2UKLQkJICogLS0ganVzdCBpZ25vcmUgaXQKLQkJICovCi0JCXJldHVybiAoQUVfT0spOwotCX0KLQotCXN0YXR1cyA9IGFjcGlfZXZfZXhlY3V0ZV9yZWdfbWV0aG9kKG9ial9kZXNjLCAxKTsKLQlyZXR1cm4gKHN0YXR1cyk7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZXZlbnRzL2V2cmduaW5pLmMgYi9kcml2ZXJzL2FjcGkvZXZlbnRzL2V2cmduaW5pLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiOTRiMzguLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9hY3BpL2V2ZW50cy9ldnJnbmluaS5jCisrKyAvZGV2L251bGwKQEAgLTEsNjg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBNb2R1bGUgTmFtZTogZXZyZ25pbmktIEFDUEkgYWRkcmVzc19zcGFjZSAob3BfcmVnaW9uKSBpbml0Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwOCwgSW50ZWwgQ29ycC4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKLSAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIGF0IG1pbmltdW0gYSBkaXNjbGFpbWVyCi0gKiAgICBzdWJzdGFudGlhbGx5IHNpbWlsYXIgdG8gdGhlICJOTyBXQVJSQU5UWSIgZGlzY2xhaW1lciBiZWxvdwotICogICAgKCJEaXNjbGFpbWVyIikgYW5kIGFueSByZWRpc3RyaWJ1dGlvbiBtdXN0IGJlIGNvbmRpdGlvbmVkIHVwb24KLSAqICAgIGluY2x1ZGluZyBhIHN1YnN0YW50aWFsbHkgc2ltaWxhciBEaXNjbGFpbWVyIHJlcXVpcmVtZW50IGZvciBmdXJ0aGVyCi0gKiAgICBiaW5hcnkgcmVkaXN0cmlidXRpb24uCi0gKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMKLSAqICAgIG9mIGFueSBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTk8gV0FSUkFOVFkKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAotICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKLSAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HCi0gKiBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKLSAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KLSAqLwotCi0jaW5jbHVkZSA8YWNwaS9hY3BpLmg+Ci0jaW5jbHVkZSA8YWNwaS9hY2V2ZW50cy5oPgotI2luY2x1ZGUgPGFjcGkvYWNuYW1lc3AuaD4KLQotI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfRVZFTlRTCi1BQ1BJX01PRFVMRV9OQU1FKCJldnJnbmluaSIpCi0KLS8qIExvY2FsIHByb3RvdHlwZXMgKi8KLXN0YXRpYyB1OCBhY3BpX2V2X21hdGNoX3BjaV9yb290X2JyaWRnZShjaGFyICppZCk7Ci0KLXN0YXRpYyB1OCBhY3BpX2V2X2lzX3BjaV9yb290X2JyaWRnZShzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZSk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfZXZfc3lzdGVtX21lbW9yeV9yZWdpb25fc2V0dXAKLSAqCi0gKiBQQVJBTUVURVJTOiAgSGFuZGxlICAgICAgICAgICAgICAtIFJlZ2lvbiB3ZSBhcmUgaW50ZXJlc3RlZCBpbgotICogICAgICAgICAgICAgIEZ1bmN0aW9uICAgICAgICAgICAgLSBTdGFydCBvciBzdG9wCi0gKiAgICAgICAgICAgICAgaGFuZGxlcl9jb250ZXh0ICAgICAtIEFkZHJlc3Mgc3BhY2UgaGFuZGxlciBjb250ZXh0Ci0gKiAgICAgICAgICAgICAgcmVnaW9uX2NvbnRleHQgICAgICAtIFJlZ2lvbiBzcGVjaWZpYyBjb250ZXh0Ci0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cwotICoKLSAqIERFU0NSSVBUSU9OOiBTZXR1cCBhIHN5c3RlbV9tZW1vcnkgb3BlcmF0aW9uIHJlZ2lvbgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWFjcGlfc3RhdHVzCi1hY3BpX2V2X3N5c3RlbV9tZW1vcnlfcmVnaW9uX3NldHVwKGFjcGlfaGFuZGxlIGhhbmRsZSwKLQkJCQkgICB1MzIgZnVuY3Rpb24sCi0JCQkJICAgdm9pZCAqaGFuZGxlcl9jb250ZXh0LCB2b2lkICoqcmVnaW9uX2NvbnRleHQpCi17Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqcmVnaW9uX2Rlc2MgPQotCSAgICAodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKWhhbmRsZTsKLQlzdHJ1Y3QgYWNwaV9tZW1fc3BhY2VfY29udGV4dCAqbG9jYWxfcmVnaW9uX2NvbnRleHQ7Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGV2X3N5c3RlbV9tZW1vcnlfcmVnaW9uX3NldHVwKTsKLQotCWlmIChmdW5jdGlvbiA9PSBBQ1BJX1JFR0lPTl9ERUFDVElWQVRFKSB7Ci0JCWlmICgqcmVnaW9uX2NvbnRleHQpIHsKLQkJCWxvY2FsX3JlZ2lvbl9jb250ZXh0ID0KLQkJCSAgICAoc3RydWN0IGFjcGlfbWVtX3NwYWNlX2NvbnRleHQgKikqcmVnaW9uX2NvbnRleHQ7Ci0KLQkJCS8qIERlbGV0ZSBhIGNhY2hlZCBtYXBwaW5nIGlmIHByZXNlbnQgKi8KLQotCQkJaWYgKGxvY2FsX3JlZ2lvbl9jb250ZXh0LT5tYXBwZWRfbGVuZ3RoKSB7Ci0JCQkJYWNwaV9vc191bm1hcF9tZW1vcnkobG9jYWxfcmVnaW9uX2NvbnRleHQtPgotCQkJCQkJICAgICBtYXBwZWRfbG9naWNhbF9hZGRyZXNzLAotCQkJCQkJICAgICBsb2NhbF9yZWdpb25fY29udGV4dC0+Ci0JCQkJCQkgICAgIG1hcHBlZF9sZW5ndGgpOwotCQkJfQotCQkJQUNQSV9GUkVFKGxvY2FsX3JlZ2lvbl9jb250ZXh0KTsKLQkJCSpyZWdpb25fY29udGV4dCA9IE5VTEw7Ci0JCX0KLQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKLQl9Ci0KLQkvKiBDcmVhdGUgYSBuZXcgY29udGV4dCAqLwotCi0JbG9jYWxfcmVnaW9uX2NvbnRleHQgPQotCSAgICBBQ1BJX0FMTE9DQVRFX1pFUk9FRChzaXplb2Yoc3RydWN0IGFjcGlfbWVtX3NwYWNlX2NvbnRleHQpKTsKLQlpZiAoIShsb2NhbF9yZWdpb25fY29udGV4dCkpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX01FTU9SWSk7Ci0JfQotCi0JLyogU2F2ZSB0aGUgcmVnaW9uIGxlbmd0aCBhbmQgYWRkcmVzcyBmb3IgdXNlIGluIHRoZSBoYW5kbGVyICovCi0KLQlsb2NhbF9yZWdpb25fY29udGV4dC0+bGVuZ3RoID0gcmVnaW9uX2Rlc2MtPnJlZ2lvbi5sZW5ndGg7Ci0JbG9jYWxfcmVnaW9uX2NvbnRleHQtPmFkZHJlc3MgPSByZWdpb25fZGVzYy0+cmVnaW9uLmFkZHJlc3M7Ci0KLQkqcmVnaW9uX2NvbnRleHQgPSBsb2NhbF9yZWdpb25fY29udGV4dDsKLQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX2V2X2lvX3NwYWNlX3JlZ2lvbl9zZXR1cAotICoKLSAqIFBBUkFNRVRFUlM6ICBIYW5kbGUgICAgICAgICAgICAgIC0gUmVnaW9uIHdlIGFyZSBpbnRlcmVzdGVkIGluCi0gKiAgICAgICAgICAgICAgRnVuY3Rpb24gICAgICAgICAgICAtIFN0YXJ0IG9yIHN0b3AKLSAqICAgICAgICAgICAgICBoYW5kbGVyX2NvbnRleHQgICAgIC0gQWRkcmVzcyBzcGFjZSBoYW5kbGVyIGNvbnRleHQKLSAqICAgICAgICAgICAgICByZWdpb25fY29udGV4dCAgICAgIC0gUmVnaW9uIHNwZWNpZmljIGNvbnRleHQKLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IFNldHVwIGEgSU8gb3BlcmF0aW9uIHJlZ2lvbgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWFjcGlfc3RhdHVzCi1hY3BpX2V2X2lvX3NwYWNlX3JlZ2lvbl9zZXR1cChhY3BpX2hhbmRsZSBoYW5kbGUsCi0JCQkgICAgICB1MzIgZnVuY3Rpb24sCi0JCQkgICAgICB2b2lkICpoYW5kbGVyX2NvbnRleHQsIHZvaWQgKipyZWdpb25fY29udGV4dCkKLXsKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGV2X2lvX3NwYWNlX3JlZ2lvbl9zZXR1cCk7Ci0KLQlpZiAoZnVuY3Rpb24gPT0gQUNQSV9SRUdJT05fREVBQ1RJVkFURSkgewotCQkqcmVnaW9uX2NvbnRleHQgPSBOVUxMOwotCX0gZWxzZSB7Ci0JCSpyZWdpb25fY29udGV4dCA9IGhhbmRsZXJfY29udGV4dDsKLQl9Ci0KLQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX2V2X3BjaV9jb25maWdfcmVnaW9uX3NldHVwCi0gKgotICogUEFSQU1FVEVSUzogIEhhbmRsZSAgICAgICAgICAgICAgLSBSZWdpb24gd2UgYXJlIGludGVyZXN0ZWQgaW4KLSAqICAgICAgICAgICAgICBGdW5jdGlvbiAgICAgICAgICAgIC0gU3RhcnQgb3Igc3RvcAotICogICAgICAgICAgICAgIGhhbmRsZXJfY29udGV4dCAgICAgLSBBZGRyZXNzIHNwYWNlIGhhbmRsZXIgY29udGV4dAotICogICAgICAgICAgICAgIHJlZ2lvbl9jb250ZXh0ICAgICAgLSBSZWdpb24gc3BlY2lmaWMgY29udGV4dAotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKLSAqCi0gKiBERVNDUklQVElPTjogU2V0dXAgYSBQQ0lfQ29uZmlnIG9wZXJhdGlvbiByZWdpb24KLSAqCi0gKiBNVVRFWDogICAgICAgQXNzdW1lcyBuYW1lc3BhY2UgaXMgbm90IGxvY2tlZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWFjcGlfc3RhdHVzCi1hY3BpX2V2X3BjaV9jb25maWdfcmVnaW9uX3NldHVwKGFjcGlfaGFuZGxlIGhhbmRsZSwKLQkJCQl1MzIgZnVuY3Rpb24sCi0JCQkJdm9pZCAqaGFuZGxlcl9jb250ZXh0LCB2b2lkICoqcmVnaW9uX2NvbnRleHQpCi17Ci0JYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7Ci0JYWNwaV9pbnRlZ2VyIHBjaV92YWx1ZTsKLQlzdHJ1Y3QgYWNwaV9wY2lfaWQgKnBjaV9pZCA9ICpyZWdpb25fY29udGV4dDsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpoYW5kbGVyX29iajsKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqcGFyZW50X25vZGU7Ci0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKnBjaV9yb290X25vZGU7Ci0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKnBjaV9kZXZpY2Vfbm9kZTsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpyZWdpb25fb2JqID0KLQkgICAgKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKiloYW5kbGU7Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGV2X3BjaV9jb25maWdfcmVnaW9uX3NldHVwKTsKLQotCWhhbmRsZXJfb2JqID0gcmVnaW9uX29iai0+cmVnaW9uLmhhbmRsZXI7Ci0JaWYgKCFoYW5kbGVyX29iaikgewotCQkvKgotCQkgKiBObyBpbnN0YWxsZWQgaGFuZGxlci4gVGhpcyBzaG91bGRuJ3QgaGFwcGVuIGJlY2F1c2UgdGhlIGRpc3BhdGNoCi0JCSAqIHJvdXRpbmUgY2hlY2tzIGJlZm9yZSB3ZSBnZXQgaGVyZSwgYnV0IHdlIGNoZWNrIGFnYWluIGp1c3QgaW4gY2FzZS4KLQkJICovCi0JCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfT1BSRUdJT04sCi0JCQkJICAiQXR0ZW1wdGluZyB0byBpbml0IGEgcmVnaW9uICVwLCB3aXRoIG5vIGhhbmRsZXJcbiIsCi0JCQkJICByZWdpb25fb2JqKSk7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT1RfRVhJU1QpOwotCX0KLQotCSpyZWdpb25fY29udGV4dCA9IE5VTEw7Ci0JaWYgKGZ1bmN0aW9uID09IEFDUElfUkVHSU9OX0RFQUNUSVZBVEUpIHsKLQkJaWYgKHBjaV9pZCkgewotCQkJQUNQSV9GUkVFKHBjaV9pZCk7Ci0JCX0KLQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci0JfQotCi0JcGFyZW50X25vZGUgPSBhY3BpX25zX2dldF9wYXJlbnRfbm9kZShyZWdpb25fb2JqLT5yZWdpb24ubm9kZSk7Ci0KLQkvKgotCSAqIEdldCB0aGUgX1NFRyBhbmQgX0JCTiB2YWx1ZXMgZnJvbSB0aGUgZGV2aWNlIHVwb24gd2hpY2ggdGhlIGhhbmRsZXIKLQkgKiBpcyBpbnN0YWxsZWQuCi0JICoKLQkgKiBXZSBuZWVkIHRvIGdldCB0aGUgX1NFRyBhbmQgX0JCTiBvYmplY3RzIHJlbGF0aXZlIHRvIHRoZSBQQ0kgQlVTIGRldmljZS4KLQkgKiBUaGlzIGlzIHRoZSBkZXZpY2UgdGhlIGhhbmRsZXIgaGFzIGJlZW4gcmVnaXN0ZXJlZCB0byBoYW5kbGUuCi0JICovCi0KLQkvKgotCSAqIElmIHRoZSBhZGRyZXNzX3NwYWNlLk5vZGUgaXMgc3RpbGwgcG9pbnRpbmcgdG8gdGhlIHJvb3QsIHdlIG5lZWQKLQkgKiB0byBzY2FuIHVwd2FyZCBmb3IgYSBQQ0kgUm9vdCBicmlkZ2UgYW5kIHJlLWFzc29jaWF0ZSB0aGUgb3BfcmVnaW9uCi0JICogaGFuZGxlcnMgd2l0aCB0aGF0IGRldmljZS4KLQkgKi8KLQlpZiAoaGFuZGxlcl9vYmotPmFkZHJlc3Nfc3BhY2Uubm9kZSA9PSBhY3BpX2dibF9yb290X25vZGUpIHsKLQotCQkvKiBTdGFydCBzZWFyY2ggZnJvbSB0aGUgcGFyZW50IG9iamVjdCAqLwotCi0JCXBjaV9yb290X25vZGUgPSBwYXJlbnRfbm9kZTsKLQkJd2hpbGUgKHBjaV9yb290X25vZGUgIT0gYWNwaV9nYmxfcm9vdF9ub2RlKSB7Ci0KLQkJCS8qIEdldCB0aGUgX0hJRC9fQ0lEIGluIG9yZGVyIHRvIGRldGVjdCBhIHJvb3RfYnJpZGdlICovCi0KLQkJCWlmIChhY3BpX2V2X2lzX3BjaV9yb290X2JyaWRnZShwY2lfcm9vdF9ub2RlKSkgewotCi0JCQkJLyogSW5zdGFsbCBhIGhhbmRsZXIgZm9yIHRoaXMgUENJIHJvb3QgYnJpZGdlICovCi0KLQkJCQlzdGF0dXMgPQotCQkJCSAgICBhY3BpX2luc3RhbGxfYWRkcmVzc19zcGFjZV9oYW5kbGVyKChhY3BpX2hhbmRsZSkgcGNpX3Jvb3Rfbm9kZSwgQUNQSV9BRFJfU1BBQ0VfUENJX0NPTkZJRywgQUNQSV9ERUZBVUxUX0hBTkRMRVIsIE5VTEwsIE5VTEwpOwotCQkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQkJCQlpZiAoc3RhdHVzID09IEFFX1NBTUVfSEFORExFUikgewotCQkJCQkJLyoKLQkJCQkJCSAqIEl0IGlzIE9LIGlmIHRoZSBoYW5kbGVyIGlzIGFscmVhZHkgaW5zdGFsbGVkIG9uIHRoZSByb290Ci0JCQkJCQkgKiBicmlkZ2UuICBTdGlsbCBuZWVkIHRvIHJldHVybiBhIGNvbnRleHQgb2JqZWN0IGZvciB0aGUKLQkJCQkJCSAqIG5ldyBQQ0lfQ29uZmlnIG9wZXJhdGlvbiByZWdpb24sIGhvd2V2ZXIuCi0JCQkJCQkgKi8KLQkJCQkJCXN0YXR1cyA9IEFFX09LOwotCQkJCQl9IGVsc2UgewotCQkJCQkJQUNQSV9FWENFUFRJT04oKEFFX0lORk8sIHN0YXR1cywKLQkJCQkJCQkJIkNvdWxkIG5vdCBpbnN0YWxsIFBjaUNvbmZpZyBoYW5kbGVyIGZvciBSb290IEJyaWRnZSAlNC40cyIsCi0JCQkJCQkJCWFjcGlfdXRfZ2V0X25vZGVfbmFtZQotCQkJCQkJCQkocGNpX3Jvb3Rfbm9kZSkpKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlicmVhazsKLQkJCX0KLQotCQkJcGNpX3Jvb3Rfbm9kZSA9IGFjcGlfbnNfZ2V0X3BhcmVudF9ub2RlKHBjaV9yb290X25vZGUpOwotCQl9Ci0KLQkJLyogUENJIHJvb3QgYnJpZGdlIG5vdCBmb3VuZCwgdXNlIG5hbWVzcGFjZSByb290IG5vZGUgKi8KLQl9IGVsc2UgewotCQlwY2lfcm9vdF9ub2RlID0gaGFuZGxlcl9vYmotPmFkZHJlc3Nfc3BhY2Uubm9kZTsKLQl9Ci0KLQkvKgotCSAqIElmIHRoaXMgcmVnaW9uIGlzIG5vdyBpbml0aWFsaXplZCwgd2UgYXJlIGRvbmUuCi0JICogKGluc3RhbGxfYWRkcmVzc19zcGFjZV9oYW5kbGVyIGNvdWxkIGhhdmUgaW5pdGlhbGl6ZWQgaXQpCi0JICovCi0JaWYgKHJlZ2lvbl9vYmotPnJlZ2lvbi5mbGFncyAmIEFPUE9CSl9TRVRVUF9DT01QTEVURSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwotCX0KLQotCS8qIFJlZ2lvbiBpcyBzdGlsbCBub3QgaW5pdGlhbGl6ZWQuIENyZWF0ZSBhIG5ldyBjb250ZXh0ICovCi0KLQlwY2lfaWQgPSBBQ1BJX0FMTE9DQVRFX1pFUk9FRChzaXplb2Yoc3RydWN0IGFjcGlfcGNpX2lkKSk7Ci0JaWYgKCFwY2lfaWQpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX01FTU9SWSk7Ci0JfQotCi0JLyoKLQkgKiBGb3IgUENJX0NvbmZpZyBzcGFjZSBhY2Nlc3MsIHdlIG5lZWQgdGhlIHNlZ21lbnQsIGJ1cywKLQkgKiBkZXZpY2UgYW5kIGZ1bmN0aW9uIG51bWJlcnMuICBBY3F1aXJlIHRoZW0gaGVyZS4KLQkgKgotCSAqIEZpbmQgdGhlIHBhcmVudCBkZXZpY2Ugb2JqZWN0LiAoVGhpcyBhbGxvd3MgdGhlIG9wZXJhdGlvbiByZWdpb24gdG8gYmUKLQkgKiB3aXRoaW4gYSBzdWJzY29wZSB1bmRlciB0aGUgZGV2aWNlLCBzdWNoIGFzIGEgY29udHJvbCBtZXRob2QuKQotCSAqLwotCXBjaV9kZXZpY2Vfbm9kZSA9IHJlZ2lvbl9vYmotPnJlZ2lvbi5ub2RlOwotCXdoaWxlIChwY2lfZGV2aWNlX25vZGUgJiYgKHBjaV9kZXZpY2Vfbm9kZS0+dHlwZSAhPSBBQ1BJX1RZUEVfREVWSUNFKSkgewotCQlwY2lfZGV2aWNlX25vZGUgPSBhY3BpX25zX2dldF9wYXJlbnRfbm9kZShwY2lfZGV2aWNlX25vZGUpOwotCX0KLQotCWlmICghcGNpX2RldmljZV9ub2RlKSB7Ci0JCUFDUElfRlJFRShwY2lfaWQpOwotCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX09QRVJBTkRfVFlQRSk7Ci0JfQotCi0JLyoKLQkgKiBHZXQgdGhlIFBDSSBkZXZpY2UgYW5kIGZ1bmN0aW9uIG51bWJlcnMgZnJvbSB0aGUgX0FEUiBvYmplY3QKLQkgKiBjb250YWluZWQgaW4gdGhlIHBhcmVudCdzIHNjb3BlLgotCSAqLwotCXN0YXR1cyA9Ci0JICAgIGFjcGlfdXRfZXZhbHVhdGVfbnVtZXJpY19vYmplY3QoTUVUSE9EX05BTUVfX0FEUiwgcGNpX2RldmljZV9ub2RlLAotCQkJCQkgICAgJnBjaV92YWx1ZSk7Ci0KLQkvKgotCSAqIFRoZSBkZWZhdWx0IGlzIHplcm8sIGFuZCBzaW5jZSB0aGUgYWxsb2NhdGlvbiBhYm92ZSB6ZXJvZWQKLQkgKiB0aGUgZGF0YSwganVzdCBkbyBub3RoaW5nIG9uIGZhaWx1cmUuCi0JICovCi0JaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKSB7Ci0JCXBjaV9pZC0+ZGV2aWNlID0gQUNQSV9ISVdPUkQoQUNQSV9MT0RXT1JEKHBjaV92YWx1ZSkpOwotCQlwY2lfaWQtPmZ1bmN0aW9uID0gQUNQSV9MT1dPUkQoQUNQSV9MT0RXT1JEKHBjaV92YWx1ZSkpOwotCX0KLQotCS8qIFRoZSBQQ0kgc2VnbWVudCBudW1iZXIgY29tZXMgZnJvbSB0aGUgX1NFRyBtZXRob2QgKi8KLQotCXN0YXR1cyA9Ci0JICAgIGFjcGlfdXRfZXZhbHVhdGVfbnVtZXJpY19vYmplY3QoTUVUSE9EX05BTUVfX1NFRywgcGNpX3Jvb3Rfbm9kZSwKLQkJCQkJICAgICZwY2lfdmFsdWUpOwotCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkgewotCQlwY2lfaWQtPnNlZ21lbnQgPSBBQ1BJX0xPV09SRChwY2lfdmFsdWUpOwotCX0KLQotCS8qIFRoZSBQQ0kgYnVzIG51bWJlciBjb21lcyBmcm9tIHRoZSBfQkJOIG1ldGhvZCAqLwotCi0Jc3RhdHVzID0KLQkgICAgYWNwaV91dF9ldmFsdWF0ZV9udW1lcmljX29iamVjdChNRVRIT0RfTkFNRV9fQkJOLCBwY2lfcm9vdF9ub2RlLAotCQkJCQkgICAgJnBjaV92YWx1ZSk7Ci0JaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKSB7Ci0JCXBjaV9pZC0+YnVzID0gQUNQSV9MT1dPUkQocGNpX3ZhbHVlKTsKLQl9Ci0KLQkvKiBDb21wbGV0ZSB0aGlzIGRldmljZSdzIHBjaV9pZCAqLwotCi0JYWNwaV9vc19kZXJpdmVfcGNpX2lkKHBjaV9yb290X25vZGUsIHJlZ2lvbl9vYmotPnJlZ2lvbi5ub2RlLCAmcGNpX2lkKTsKLQotCSpyZWdpb25fY29udGV4dCA9IHBjaV9pZDsKLQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX2V2X21hdGNoX3BjaV9yb290X2JyaWRnZQotICoKLSAqIFBBUkFNRVRFUlM6ICBJZCAgICAgICAgICAgICAgLSBUaGUgSElEL0NJRCBpbiBzdHJpbmcgZm9ybWF0Ci0gKgotICogUkVUVVJOOiAgICAgIFRSVUUgaWYgdGhlIElkIGlzIGEgbWF0Y2ggZm9yIGEgUENJL1BDSS1FeHByZXNzIFJvb3QgQnJpZGdlCi0gKgotICogREVTQ1JJUFRJT046IERldGVybWluZSBpZiB0aGUgaW5wdXQgSUQgaXMgYSBQQ0kgUm9vdCBCcmlkZ2UgSUQuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIHU4IGFjcGlfZXZfbWF0Y2hfcGNpX3Jvb3RfYnJpZGdlKGNoYXIgKmlkKQotewotCi0JLyoKLQkgKiBDaGVjayBpZiB0aGlzIGlzIGEgUENJIHJvb3QuCi0JICogQUNQSSAzLjArOiBjaGVjayBmb3IgYSBQQ0kgRXhwcmVzcyByb290IGFsc28uCi0JICovCi0JaWYgKCEoQUNQSV9TVFJOQ01QKGlkLAotCQkJICAgUENJX1JPT1RfSElEX1NUUklORywKLQkJCSAgIHNpemVvZihQQ0lfUk9PVF9ISURfU1RSSU5HKSkpIHx8Ci0JICAgICEoQUNQSV9TVFJOQ01QKGlkLAotCQkJICAgUENJX0VYUFJFU1NfUk9PVF9ISURfU1RSSU5HLAotCQkJICAgc2l6ZW9mKFBDSV9FWFBSRVNTX1JPT1RfSElEX1NUUklORykpKSkgewotCQlyZXR1cm4gKFRSVUUpOwotCX0KLQotCXJldHVybiAoRkFMU0UpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX2V2X2lzX3BjaV9yb290X2JyaWRnZQotICoKLSAqIFBBUkFNRVRFUlM6ICBOb2RlICAgICAgICAgICAgLSBEZXZpY2Ugbm9kZSBiZWluZyBleGFtaW5lZAotICoKLSAqIFJFVFVSTjogICAgICBUUlVFIGlmIGRldmljZSBpcyBhIFBDSS9QQ0ktRXhwcmVzcyBSb290IEJyaWRnZQotICoKLSAqIERFU0NSSVBUSU9OOiBEZXRlcm1pbmUgaWYgdGhlIGlucHV0IGRldmljZSByZXByZXNlbnRzIGEgUENJIFJvb3QgQnJpZGdlIGJ5Ci0gKiAgICAgICAgICAgICAgZXhhbWluaW5nIHRoZSBfSElEIGFuZCBfQ0lEIGZvciB0aGUgZGV2aWNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyB1OCBhY3BpX2V2X2lzX3BjaV9yb290X2JyaWRnZShzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZSkKLXsKLQlhY3BpX3N0YXR1cyBzdGF0dXM7Ci0Jc3RydWN0IGFjcGljYV9kZXZpY2VfaWQgaGlkOwotCXN0cnVjdCBhY3BpX2NvbXBhdGlibGVfaWRfbGlzdCAqY2lkOwotCXUzMiBpOwotCi0JLyoKLQkgKiBHZXQgdGhlIF9ISUQgYW5kIGNoZWNrIGZvciBhIFBDSSBSb290IEJyaWRnZQotCSAqLwotCXN0YXR1cyA9IGFjcGlfdXRfZXhlY3V0ZV9ISUQobm9kZSwgJmhpZCk7Ci0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCXJldHVybiAoRkFMU0UpOwotCX0KLQotCWlmIChhY3BpX2V2X21hdGNoX3BjaV9yb290X2JyaWRnZShoaWQudmFsdWUpKSB7Ci0JCXJldHVybiAoVFJVRSk7Ci0JfQotCi0JLyoKLQkgKiBUaGUgX0hJRCBkaWQgbm90IG1hdGNoLgotCSAqIEdldCB0aGUgX0NJRCBhbmQgY2hlY2sgZm9yIGEgUENJIFJvb3QgQnJpZGdlCi0JICovCi0Jc3RhdHVzID0gYWNwaV91dF9leGVjdXRlX0NJRChub2RlLCAmY2lkKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJcmV0dXJuIChGQUxTRSk7Ci0JfQotCi0JLyogQ2hlY2sgYWxsIF9DSURzIGluIHRoZSByZXR1cm5lZCBsaXN0ICovCi0KLQlmb3IgKGkgPSAwOyBpIDwgY2lkLT5jb3VudDsgaSsrKSB7Ci0JCWlmIChhY3BpX2V2X21hdGNoX3BjaV9yb290X2JyaWRnZShjaWQtPmlkW2ldLnZhbHVlKSkgewotCQkJQUNQSV9GUkVFKGNpZCk7Ci0JCQlyZXR1cm4gKFRSVUUpOwotCQl9Ci0JfQotCi0JQUNQSV9GUkVFKGNpZCk7Ci0JcmV0dXJuIChGQUxTRSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfZXZfcGNpX2Jhcl9yZWdpb25fc2V0dXAKLSAqCi0gKiBQQVJBTUVURVJTOiAgSGFuZGxlICAgICAgICAgICAgICAtIFJlZ2lvbiB3ZSBhcmUgaW50ZXJlc3RlZCBpbgotICogICAgICAgICAgICAgIEZ1bmN0aW9uICAgICAgICAgICAgLSBTdGFydCBvciBzdG9wCi0gKiAgICAgICAgICAgICAgaGFuZGxlcl9jb250ZXh0ICAgICAtIEFkZHJlc3Mgc3BhY2UgaGFuZGxlciBjb250ZXh0Ci0gKiAgICAgICAgICAgICAgcmVnaW9uX2NvbnRleHQgICAgICAtIFJlZ2lvbiBzcGVjaWZpYyBjb250ZXh0Ci0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cwotICoKLSAqIERFU0NSSVBUSU9OOiBTZXR1cCBhIHBjaV9iQVIgb3BlcmF0aW9uIHJlZ2lvbgotICoKLSAqIE1VVEVYOiAgICAgICBBc3N1bWVzIG5hbWVzcGFjZSBpcyBub3QgbG9ja2VkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotYWNwaV9zdGF0dXMKLWFjcGlfZXZfcGNpX2Jhcl9yZWdpb25fc2V0dXAoYWNwaV9oYW5kbGUgaGFuZGxlLAotCQkJICAgICB1MzIgZnVuY3Rpb24sCi0JCQkgICAgIHZvaWQgKmhhbmRsZXJfY29udGV4dCwgdm9pZCAqKnJlZ2lvbl9jb250ZXh0KQotewotCUFDUElfRlVOQ1RJT05fVFJBQ0UoZXZfcGNpX2Jhcl9yZWdpb25fc2V0dXApOwotCi0JcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9ldl9jbW9zX3JlZ2lvbl9zZXR1cAotICoKLSAqIFBBUkFNRVRFUlM6ICBIYW5kbGUgICAgICAgICAgICAgIC0gUmVnaW9uIHdlIGFyZSBpbnRlcmVzdGVkIGluCi0gKiAgICAgICAgICAgICAgRnVuY3Rpb24gICAgICAgICAgICAtIFN0YXJ0IG9yIHN0b3AKLSAqICAgICAgICAgICAgICBoYW5kbGVyX2NvbnRleHQgICAgIC0gQWRkcmVzcyBzcGFjZSBoYW5kbGVyIGNvbnRleHQKLSAqICAgICAgICAgICAgICByZWdpb25fY29udGV4dCAgICAgIC0gUmVnaW9uIHNwZWNpZmljIGNvbnRleHQKLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IFNldHVwIGEgQ01PUyBvcGVyYXRpb24gcmVnaW9uCi0gKgotICogTVVURVg6ICAgICAgIEFzc3VtZXMgbmFtZXNwYWNlIGlzIG5vdCBsb2NrZWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1hY3BpX3N0YXR1cwotYWNwaV9ldl9jbW9zX3JlZ2lvbl9zZXR1cChhY3BpX2hhbmRsZSBoYW5kbGUsCi0JCQkgIHUzMiBmdW5jdGlvbiwKLQkJCSAgdm9pZCAqaGFuZGxlcl9jb250ZXh0LCB2b2lkICoqcmVnaW9uX2NvbnRleHQpCi17Ci0JQUNQSV9GVU5DVElPTl9UUkFDRShldl9jbW9zX3JlZ2lvbl9zZXR1cCk7Ci0KLQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX2V2X2RlZmF1bHRfcmVnaW9uX3NldHVwCi0gKgotICogUEFSQU1FVEVSUzogIEhhbmRsZSAgICAgICAgICAgICAgLSBSZWdpb24gd2UgYXJlIGludGVyZXN0ZWQgaW4KLSAqICAgICAgICAgICAgICBGdW5jdGlvbiAgICAgICAgICAgIC0gU3RhcnQgb3Igc3RvcAotICogICAgICAgICAgICAgIGhhbmRsZXJfY29udGV4dCAgICAgLSBBZGRyZXNzIHNwYWNlIGhhbmRsZXIgY29udGV4dAotICogICAgICAgICAgICAgIHJlZ2lvbl9jb250ZXh0ICAgICAgLSBSZWdpb24gc3BlY2lmaWMgY29udGV4dAotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKLSAqCi0gKiBERVNDUklQVElPTjogRGVmYXVsdCByZWdpb24gaW5pdGlhbGl6YXRpb24KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1hY3BpX3N0YXR1cwotYWNwaV9ldl9kZWZhdWx0X3JlZ2lvbl9zZXR1cChhY3BpX2hhbmRsZSBoYW5kbGUsCi0JCQkgICAgIHUzMiBmdW5jdGlvbiwKLQkJCSAgICAgdm9pZCAqaGFuZGxlcl9jb250ZXh0LCB2b2lkICoqcmVnaW9uX2NvbnRleHQpCi17Ci0JQUNQSV9GVU5DVElPTl9UUkFDRShldl9kZWZhdWx0X3JlZ2lvbl9zZXR1cCk7Ci0KLQlpZiAoZnVuY3Rpb24gPT0gQUNQSV9SRUdJT05fREVBQ1RJVkFURSkgewotCQkqcmVnaW9uX2NvbnRleHQgPSBOVUxMOwotCX0gZWxzZSB7Ci0JCSpyZWdpb25fY29udGV4dCA9IGhhbmRsZXJfY29udGV4dDsKLQl9Ci0KLQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX2V2X2luaXRpYWxpemVfcmVnaW9uCi0gKgotICogUEFSQU1FVEVSUzogIHJlZ2lvbl9vYmogICAgICAtIFJlZ2lvbiB3ZSBhcmUgaW5pdGlhbGl6aW5nCi0gKiAgICAgICAgICAgICAgYWNwaV9uc19sb2NrZWQgIC0gSXMgbmFtZXNwYWNlIGxvY2tlZD8KLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IEluaXRpYWxpemVzIHRoZSByZWdpb24sIGZpbmRzIGFueSBfUkVHIG1ldGhvZHMgYW5kIHNhdmVzIHRoZW0KLSAqICAgICAgICAgICAgICBmb3IgZXhlY3V0aW9uIGF0IGEgbGF0ZXIgdGltZQotICoKLSAqICAgICAgICAgICAgICBHZXQgdGhlIGFwcHJvcHJpYXRlIGFkZHJlc3Mgc3BhY2UgaGFuZGxlciBmb3IgYSBuZXdseQotICogICAgICAgICAgICAgIGNyZWF0ZWQgcmVnaW9uLgotICoKLSAqICAgICAgICAgICAgICBUaGlzIGFsc28gcGVyZm9ybXMgYWRkcmVzcyBzcGFjZSBzcGVjaWZpYyBpbml0aWFsaXphdGlvbi4gIEZvcgotICogICAgICAgICAgICAgIGV4YW1wbGUsIFBDSSByZWdpb25zIG11c3QgaGF2ZSBhbiBfQURSIG9iamVjdCB0aGF0IGNvbnRhaW5zCi0gKiAgICAgICAgICAgICAgYSBQQ0kgYWRkcmVzcyBpbiB0aGUgc2NvcGUgb2YgdGhlIGRlZmluaXRpb24uICBUaGlzIGFkZHJlc3MgaXMKLSAqICAgICAgICAgICAgICByZXF1aXJlZCB0byBwZXJmb3JtIGFuIGFjY2VzcyB0byBQQ0kgY29uZmlnIHNwYWNlLgotICoKLSAqIE1VVEVYOiAgICAgICBJbnRlcnByZXRlciBzaG91bGQgYmUgdW5sb2NrZWQsIGJlY2F1c2Ugd2UgbWF5IHJ1biB0aGUgX1JFRwotICogICAgICAgICAgICAgIG1ldGhvZCBmb3IgdGhpcyByZWdpb24uCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotYWNwaV9zdGF0dXMKLWFjcGlfZXZfaW5pdGlhbGl6ZV9yZWdpb24odW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqcmVnaW9uX29iaiwKLQkJCSAgdTggYWNwaV9uc19sb2NrZWQpCi17Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqaGFuZGxlcl9vYmo7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2M7Ci0JYWNwaV9hZHJfc3BhY2VfdHlwZSBzcGFjZV9pZDsKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZTsKLQlhY3BpX3N0YXR1cyBzdGF0dXM7Ci0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm1ldGhvZF9ub2RlOwotCWFjcGlfbmFtZSAqcmVnX25hbWVfcHRyID0gKGFjcGlfbmFtZSAqKSBNRVRIT0RfTkFNRV9fUkVHOwotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnJlZ2lvbl9vYmoyOwotCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9VMzIoZXZfaW5pdGlhbGl6ZV9yZWdpb24sIGFjcGlfbnNfbG9ja2VkKTsKLQotCWlmICghcmVnaW9uX29iaikgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX1BBUkFNRVRFUik7Ci0JfQotCi0JaWYgKHJlZ2lvbl9vYmotPmNvbW1vbi5mbGFncyAmIEFPUE9CSl9PQkpFQ1RfSU5JVElBTElaRUQpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKLQl9Ci0KLQlyZWdpb25fb2JqMiA9IGFjcGlfbnNfZ2V0X3NlY29uZGFyeV9vYmplY3QocmVnaW9uX29iaik7Ci0JaWYgKCFyZWdpb25fb2JqMikgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9UX0VYSVNUKTsKLQl9Ci0KLQlub2RlID0gYWNwaV9uc19nZXRfcGFyZW50X25vZGUocmVnaW9uX29iai0+cmVnaW9uLm5vZGUpOwotCXNwYWNlX2lkID0gcmVnaW9uX29iai0+cmVnaW9uLnNwYWNlX2lkOwotCi0JLyogU2V0dXAgZGVmYXVsdHMgKi8KLQotCXJlZ2lvbl9vYmotPnJlZ2lvbi5oYW5kbGVyID0gTlVMTDsKLQlyZWdpb25fb2JqMi0+ZXh0cmEubWV0aG9kX1JFRyA9IE5VTEw7Ci0JcmVnaW9uX29iai0+Y29tbW9uLmZsYWdzICY9IH4oQU9QT0JKX1NFVFVQX0NPTVBMRVRFKTsKLQlyZWdpb25fb2JqLT5jb21tb24uZmxhZ3MgfD0gQU9QT0JKX09CSkVDVF9JTklUSUFMSVpFRDsKLQotCS8qIEZpbmQgYW55ICJfUkVHIiBtZXRob2QgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcmVnaW9uIGRlZmluaXRpb24gKi8KLQotCXN0YXR1cyA9Ci0JICAgIGFjcGlfbnNfc2VhcmNoX29uZV9zY29wZSgqcmVnX25hbWVfcHRyLCBub2RlLCBBQ1BJX1RZUEVfTUVUSE9ELAotCQkJCSAgICAgJm1ldGhvZF9ub2RlKTsKLQlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpIHsKLQkJLyoKLQkJICogVGhlIF9SRUcgbWV0aG9kIGlzIG9wdGlvbmFsIGFuZCB0aGVyZSBjYW4gYmUgb25seSBvbmUgcGVyIHJlZ2lvbgotCQkgKiBkZWZpbml0aW9uLiAgVGhpcyB3aWxsIGJlIGV4ZWN1dGVkIHdoZW4gdGhlIGhhbmRsZXIgaXMgYXR0YWNoZWQKLQkJICogb3IgcmVtb3ZlZAotCQkgKi8KLQkJcmVnaW9uX29iajItPmV4dHJhLm1ldGhvZF9SRUcgPSBtZXRob2Rfbm9kZTsKLQl9Ci0KLQkvKgotCSAqIFRoZSBmb2xsb3dpbmcgbG9vcCBkZXBlbmRzIHVwb24gdGhlIHJvb3QgTm9kZSBoYXZpbmcgbm8gcGFyZW50Ci0JICogaWU6IGFjcGlfZ2JsX3Jvb3Rfbm9kZS0+cGFyZW50X2VudHJ5IGJlaW5nIHNldCB0byBOVUxMCi0JICovCi0Jd2hpbGUgKG5vZGUpIHsKLQotCQkvKiBDaGVjayB0byBzZWUgaWYgYSBoYW5kbGVyIGV4aXN0cyAqLwotCi0JCWhhbmRsZXJfb2JqID0gTlVMTDsKLQkJb2JqX2Rlc2MgPSBhY3BpX25zX2dldF9hdHRhY2hlZF9vYmplY3Qobm9kZSk7Ci0JCWlmIChvYmpfZGVzYykgewotCi0JCQkvKiBDYW4gb25seSBiZSBhIGhhbmRsZXIgaWYgdGhlIG9iamVjdCBleGlzdHMgKi8KLQotCQkJc3dpdGNoIChub2RlLT50eXBlKSB7Ci0JCQljYXNlIEFDUElfVFlQRV9ERVZJQ0U6Ci0KLQkJCQloYW5kbGVyX29iaiA9IG9ial9kZXNjLT5kZXZpY2UuaGFuZGxlcjsKLQkJCQlicmVhazsKLQotCQkJY2FzZSBBQ1BJX1RZUEVfUFJPQ0VTU09SOgotCi0JCQkJaGFuZGxlcl9vYmogPSBvYmpfZGVzYy0+cHJvY2Vzc29yLmhhbmRsZXI7Ci0JCQkJYnJlYWs7Ci0KLQkJCWNhc2UgQUNQSV9UWVBFX1RIRVJNQUw6Ci0KLQkJCQloYW5kbGVyX29iaiA9IG9ial9kZXNjLT50aGVybWFsX3pvbmUuaGFuZGxlcjsKLQkJCQlicmVhazsKLQotCQkJZGVmYXVsdDoKLQkJCQkvKiBJZ25vcmUgb3RoZXIgb2JqZWN0cyAqLwotCQkJCWJyZWFrOwotCQkJfQotCi0JCQl3aGlsZSAoaGFuZGxlcl9vYmopIHsKLQotCQkJCS8qIElzIHRoaXMgaGFuZGxlciBvZiB0aGUgY29ycmVjdCB0eXBlPyAqLwotCi0JCQkJaWYgKGhhbmRsZXJfb2JqLT5hZGRyZXNzX3NwYWNlLnNwYWNlX2lkID09Ci0JCQkJICAgIHNwYWNlX2lkKSB7Ci0KLQkJCQkJLyogRm91bmQgY29ycmVjdCBoYW5kbGVyICovCi0KLQkJCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9PUFJFR0lPTiwKLQkJCQkJCQkgICJGb3VuZCBoYW5kbGVyICVwIGZvciByZWdpb24gJXAgaW4gb2JqICVwXG4iLAotCQkJCQkJCSAgaGFuZGxlcl9vYmosCi0JCQkJCQkJICByZWdpb25fb2JqLAotCQkJCQkJCSAgb2JqX2Rlc2MpKTsKLQotCQkJCQlzdGF0dXMgPQotCQkJCQkgICAgYWNwaV9ldl9hdHRhY2hfcmVnaW9uKGhhbmRsZXJfb2JqLAotCQkJCQkJCQkgIHJlZ2lvbl9vYmosCi0JCQkJCQkJCSAgYWNwaV9uc19sb2NrZWQpOwotCi0JCQkJCS8qCi0JCQkJCSAqIFRlbGwgYWxsIHVzZXJzIHRoYXQgdGhpcyByZWdpb24gaXMgdXNhYmxlIGJ5IHJ1bm5pbmcgdGhlIF9SRUcKLQkJCQkJICogbWV0aG9kCi0JCQkJCSAqLwotCQkJCQlpZiAoYWNwaV9uc19sb2NrZWQpIHsKLQkJCQkJCXN0YXR1cyA9Ci0JCQkJCQkgICAgYWNwaV91dF9yZWxlYXNlX211dGV4Ci0JCQkJCQkgICAgKEFDUElfTVRYX05BTUVTUEFDRSk7Ci0JCQkJCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJCQkJCQlyZXR1cm5fQUNQSV9TVEFUVVMKLQkJCQkJCQkgICAgKHN0YXR1cyk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQotCQkJCQlzdGF0dXMgPQotCQkJCQkgICAgYWNwaV9ldl9leGVjdXRlX3JlZ19tZXRob2QKLQkJCQkJICAgIChyZWdpb25fb2JqLCAxKTsKLQotCQkJCQlpZiAoYWNwaV9uc19sb2NrZWQpIHsKLQkJCQkJCXN0YXR1cyA9Ci0JCQkJCQkgICAgYWNwaV91dF9hY3F1aXJlX211dGV4Ci0JCQkJCQkgICAgKEFDUElfTVRYX05BTUVTUEFDRSk7Ci0JCQkJCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJCQkJCQlyZXR1cm5fQUNQSV9TVEFUVVMKLQkJCQkJCQkgICAgKHN0YXR1cyk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQotCQkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwotCQkJCX0KLQotCQkJCS8qIFRyeSBuZXh0IGhhbmRsZXIgaW4gdGhlIGxpc3QgKi8KLQotCQkJCWhhbmRsZXJfb2JqID0gaGFuZGxlcl9vYmotPmFkZHJlc3Nfc3BhY2UubmV4dDsKLQkJCX0KLQkJfQotCi0JCS8qCi0JCSAqIFRoaXMgbm9kZSBkb2VzIG5vdCBoYXZlIHRoZSBoYW5kbGVyIHdlIG5lZWQ7Ci0JCSAqIFBvcCB1cCBvbmUgbGV2ZWwKLQkJICovCi0JCW5vZGUgPSBhY3BpX25zX2dldF9wYXJlbnRfbm9kZShub2RlKTsKLQl9Ci0KLQkvKiBJZiB3ZSBnZXQgaGVyZSwgdGhlcmUgaXMgbm8gaGFuZGxlciBmb3IgdGhpcyByZWdpb24gKi8KLQotCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfT1BSRUdJT04sCi0JCQkgICJObyBoYW5kbGVyIGZvciBSZWdpb25UeXBlICVzKCVYKSAoUmVnaW9uT2JqICVwKVxuIiwKLQkJCSAgYWNwaV91dF9nZXRfcmVnaW9uX25hbWUoc3BhY2VfaWQpLCBzcGFjZV9pZCwKLQkJCSAgcmVnaW9uX29iaikpOwotCi0JcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PVF9FWElTVCk7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZXZlbnRzL2V2c2NpLmMgYi9kcml2ZXJzL2FjcGkvZXZlbnRzL2V2c2NpLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhOGI3NzguLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9hY3BpL2V2ZW50cy9ldnNjaS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogTW9kdWxlIE5hbWU6IGV2c2NpIC0gU3lzdGVtIENvbnRyb2wgSW50ZXJydXB0IGNvbmZpZ3VyYXRpb24gYW5kCi0gKiAgICAgICAgICAgICAgICAgICAgICBsZWdhY3kgdG8gQUNQSSBtb2RlIHN0YXRlIHRyYW5zaXRpb24gZnVuY3Rpb25zCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDgsIEludGVsIENvcnAuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCi0gKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSBhdCBtaW5pbXVtIGEgZGlzY2xhaW1lcgotICogICAgc3Vic3RhbnRpYWxseSBzaW1pbGFyIHRvIHRoZSAiTk8gV0FSUkFOVFkiIGRpc2NsYWltZXIgYmVsb3cKLSAqICAgICgiRGlzY2xhaW1lciIpIGFuZCBhbnkgcmVkaXN0cmlidXRpb24gbXVzdCBiZSBjb25kaXRpb25lZCB1cG9uCi0gKiAgICBpbmNsdWRpbmcgYSBzdWJzdGFudGlhbGx5IHNpbWlsYXIgRGlzY2xhaW1lciByZXF1aXJlbWVudCBmb3IgZnVydGhlcgotICogICAgYmluYXJ5IHJlZGlzdHJpYnV0aW9uLgotICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzCi0gKiAgICBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIE5PIFdBUlJBTlRZCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKLSAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCi0gKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORwotICogSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCi0gKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCi0gKi8KLQotI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgotI2luY2x1ZGUgPGFjcGkvYWNldmVudHMuaD4KLQotI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfRVZFTlRTCi1BQ1BJX01PRFVMRV9OQU1FKCJldnNjaSIpCi0KLS8qIExvY2FsIHByb3RvdHlwZXMgKi8KLXN0YXRpYyB1MzIgQUNQSV9TWVNURU1fWEZBQ0UgYWNwaV9ldl9zY2lfeHJ1cHRfaGFuZGxlcih2b2lkICpjb250ZXh0KTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9ldl9zY2lfeHJ1cHRfaGFuZGxlcgotICoKLSAqIFBBUkFNRVRFUlM6ICBDb250ZXh0ICAgLSBDYWxsaW5nIENvbnRleHQKLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzIGNvZGUgaW5kaWNhdGVzIHdoZXRoZXIgaW50ZXJydXB0IHdhcyBoYW5kbGVkLgotICoKLSAqIERFU0NSSVBUSU9OOiBJbnRlcnJ1cHQgaGFuZGxlciB0aGF0IHdpbGwgZmlndXJlIG91dCB3aGF0IGZ1bmN0aW9uIG9yCi0gKiAgICAgICAgICAgICAgY29udHJvbCBtZXRob2QgdG8gY2FsbCB0byBkZWFsIHdpdGggYSBTQ0kuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIHUzMiBBQ1BJX1NZU1RFTV9YRkFDRSBhY3BpX2V2X3NjaV94cnVwdF9oYW5kbGVyKHZvaWQgKmNvbnRleHQpCi17Ci0Jc3RydWN0IGFjcGlfZ3BlX3hydXB0X2luZm8gKmdwZV94cnVwdF9saXN0ID0gY29udGV4dDsKLQl1MzIgaW50ZXJydXB0X2hhbmRsZWQgPSBBQ1BJX0lOVEVSUlVQVF9OT1RfSEFORExFRDsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UoZXZfc2NpX3hydXB0X2hhbmRsZXIpOwotCi0JLyoKLQkgKiBXZSBhcmUgZ3VhcmFudGVlZCBieSB0aGUgQUNQSSBDQSBpbml0aWFsaXphdGlvbi9zaHV0ZG93biBjb2RlIHRoYXQKLQkgKiBpZiB0aGlzIGludGVycnVwdCBoYW5kbGVyIGlzIGluc3RhbGxlZCwgQUNQSSBpcyBlbmFibGVkLgotCSAqLwotCi0JLyoKLQkgKiBGaXhlZCBFdmVudHM6Ci0JICogQ2hlY2sgZm9yIGFuZCBkaXNwYXRjaCBhbnkgRml4ZWQgRXZlbnRzIHRoYXQgaGF2ZSBvY2N1cnJlZAotCSAqLwotCWludGVycnVwdF9oYW5kbGVkIHw9IGFjcGlfZXZfZml4ZWRfZXZlbnRfZGV0ZWN0KCk7Ci0KLQkvKgotCSAqIEdlbmVyYWwgUHVycG9zZSBFdmVudHM6Ci0JICogQ2hlY2sgZm9yIGFuZCBkaXNwYXRjaCBhbnkgR1BFcyB0aGF0IGhhdmUgb2NjdXJyZWQKLQkgKi8KLQlpbnRlcnJ1cHRfaGFuZGxlZCB8PSBhY3BpX2V2X2dwZV9kZXRlY3QoZ3BlX3hydXB0X2xpc3QpOwotCi0JcmV0dXJuX1VJTlQzMihpbnRlcnJ1cHRfaGFuZGxlZCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfZXZfZ3BlX3hydXB0X2hhbmRsZXIKLSAqCi0gKiBQQVJBTUVURVJTOiAgQ29udGV4dCAgIC0gQ2FsbGluZyBDb250ZXh0Ci0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cyBjb2RlIGluZGljYXRlcyB3aGV0aGVyIGludGVycnVwdCB3YXMgaGFuZGxlZC4KLSAqCi0gKiBERVNDUklQVElPTjogSGFuZGxlciBmb3IgR1BFIEJsb2NrIERldmljZSBpbnRlcnJ1cHRzCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdTMyIEFDUElfU1lTVEVNX1hGQUNFIGFjcGlfZXZfZ3BlX3hydXB0X2hhbmRsZXIodm9pZCAqY29udGV4dCkKLXsKLQlzdHJ1Y3QgYWNwaV9ncGVfeHJ1cHRfaW5mbyAqZ3BlX3hydXB0X2xpc3QgPSBjb250ZXh0OwotCXUzMiBpbnRlcnJ1cHRfaGFuZGxlZCA9IEFDUElfSU5URVJSVVBUX05PVF9IQU5ETEVEOwotCi0JQUNQSV9GVU5DVElPTl9UUkFDRShldl9ncGVfeHJ1cHRfaGFuZGxlcik7Ci0KLQkvKgotCSAqIFdlIGFyZSBndWFyYW50ZWVkIGJ5IHRoZSBBQ1BJIENBIGluaXRpYWxpemF0aW9uL3NodXRkb3duIGNvZGUgdGhhdAotCSAqIGlmIHRoaXMgaW50ZXJydXB0IGhhbmRsZXIgaXMgaW5zdGFsbGVkLCBBQ1BJIGlzIGVuYWJsZWQuCi0JICovCi0KLQkvKgotCSAqIEdQRXM6Ci0JICogQ2hlY2sgZm9yIGFuZCBkaXNwYXRjaCBhbnkgR1BFcyB0aGF0IGhhdmUgb2NjdXJyZWQKLQkgKi8KLQlpbnRlcnJ1cHRfaGFuZGxlZCB8PSBhY3BpX2V2X2dwZV9kZXRlY3QoZ3BlX3hydXB0X2xpc3QpOwotCi0JcmV0dXJuX1VJTlQzMihpbnRlcnJ1cHRfaGFuZGxlZCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9ldl9pbnN0YWxsX3NjaV9oYW5kbGVyCi0gKgotICogUEFSQU1FVEVSUzogIG5vbmUKLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IEluc3RhbGxzIFNDSSBoYW5kbGVyLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXUzMiBhY3BpX2V2X2luc3RhbGxfc2NpX2hhbmRsZXIodm9pZCkKLXsKLQl1MzIgc3RhdHVzID0gQUVfT0s7Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGV2X2luc3RhbGxfc2NpX2hhbmRsZXIpOwotCi0Jc3RhdHVzID0KLQkgICAgYWNwaV9vc19pbnN0YWxsX2ludGVycnVwdF9oYW5kbGVyKCh1MzIpIGFjcGlfZ2JsX0ZBRFQuc2NpX2ludGVycnVwdCwKLQkJCQkJICAgICAgYWNwaV9ldl9zY2lfeHJ1cHRfaGFuZGxlciwKLQkJCQkJICAgICAgYWNwaV9nYmxfZ3BlX3hydXB0X2xpc3RfaGVhZCk7Ci0JcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9ldl9yZW1vdmVfc2NpX2hhbmRsZXIKLSAqCi0gKiBQQVJBTUVURVJTOiAgbm9uZQotICoKLSAqIFJFVFVSTjogICAgICBFX09LIGlmIGhhbmRsZXIgdW5pbnN0YWxsZWQgT0ssIEVfRVJST1IgaWYgaGFuZGxlciB3YXMgbm90Ci0gKiAgICAgICAgICAgICAgaW5zdGFsbGVkIHRvIGJlZ2luIHdpdGgKLSAqCi0gKiBERVNDUklQVElPTjogUmVtb3ZlIHRoZSBTQ0kgaW50ZXJydXB0IGhhbmRsZXIuICBObyBmdXJ0aGVyIFNDSXMgd2lsbCBiZQotICogICAgICAgICAgICAgIHRha2VuLgotICoKLSAqIE5vdGU6ICBJdCBkb2Vzbid0IHNlZW0gaW1wb3J0YW50IHRvIGRpc2FibGUgYWxsIGV2ZW50cyBvciBzZXQgdGhlIGV2ZW50Ci0gKiAgICAgICAgZW5hYmxlIHJlZ2lzdGVycyB0byB0aGVpciBvcmlnaW5hbCB2YWx1ZXMuICBUaGUgT1Mgc2hvdWxkIGRpc2FibGUKLSAqICAgICAgICB0aGUgU0NJIGludGVycnVwdCBsZXZlbCB3aGVuIHRoZSBoYW5kbGVyIGlzIHJlbW92ZWQsIHNvIG5vIG1vcmUKLSAqICAgICAgICBldmVudHMgd2lsbCBjb21lIGluLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWFjcGlfc3RhdHVzIGFjcGlfZXZfcmVtb3ZlX3NjaV9oYW5kbGVyKHZvaWQpCi17Ci0JYWNwaV9zdGF0dXMgc3RhdHVzOwotCi0JQUNQSV9GVU5DVElPTl9UUkFDRShldl9yZW1vdmVfc2NpX2hhbmRsZXIpOwotCi0JLyogSnVzdCBsZXQgdGhlIE9TIHJlbW92ZSB0aGUgaGFuZGxlciBhbmQgZGlzYWJsZSB0aGUgbGV2ZWwgKi8KLQotCXN0YXR1cyA9Ci0JICAgIGFjcGlfb3NfcmVtb3ZlX2ludGVycnVwdF9oYW5kbGVyKCh1MzIpIGFjcGlfZ2JsX0ZBRFQuc2NpX2ludGVycnVwdCwKLQkJCQkJICAgICBhY3BpX2V2X3NjaV94cnVwdF9oYW5kbGVyKTsKLQotCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2V2ZW50cy9ldnhmYWNlLmMgYi9kcml2ZXJzL2FjcGkvZXZlbnRzL2V2eGZhY2UuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTRhNmVmZS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL2FjcGkvZXZlbnRzL2V2eGZhY2UuYworKysgL2Rldi9udWxsCkBAIC0xLDgyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogTW9kdWxlIE5hbWU6IGV2eGZhY2UgLSBFeHRlcm5hbCBpbnRlcmZhY2VzIGZvciBBQ1BJIGV2ZW50cwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDgsIEludGVsIENvcnAuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCi0gKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSBhdCBtaW5pbXVtIGEgZGlzY2xhaW1lcgotICogICAgc3Vic3RhbnRpYWxseSBzaW1pbGFyIHRvIHRoZSAiTk8gV0FSUkFOVFkiIGRpc2NsYWltZXIgYmVsb3cKLSAqICAgICgiRGlzY2xhaW1lciIpIGFuZCBhbnkgcmVkaXN0cmlidXRpb24gbXVzdCBiZSBjb25kaXRpb25lZCB1cG9uCi0gKiAgICBpbmNsdWRpbmcgYSBzdWJzdGFudGlhbGx5IHNpbWlsYXIgRGlzY2xhaW1lciByZXF1aXJlbWVudCBmb3IgZnVydGhlcgotICogICAgYmluYXJ5IHJlZGlzdHJpYnV0aW9uLgotICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzCi0gKiAgICBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIE5PIFdBUlJBTlRZCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKLSAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCi0gKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORwotICogSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCi0gKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCi0gKi8KLQotI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgotI2luY2x1ZGUgPGFjcGkvYWNuYW1lc3AuaD4KLSNpbmNsdWRlIDxhY3BpL2FjZXZlbnRzLmg+Ci0jaW5jbHVkZSA8YWNwaS9hY2ludGVycC5oPgotCi0jZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9FVkVOVFMKLUFDUElfTU9EVUxFX05BTUUoImV2eGZhY2UiKQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX2luc3RhbGxfZXhjZXB0aW9uX2hhbmRsZXIKLSAqCi0gKiBQQVJBTUVURVJTOiAgSGFuZGxlciAgICAgICAgIC0gUG9pbnRlciB0byB0aGUgaGFuZGxlciBmdW5jdGlvbiBmb3IgdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQKLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IFNhdmVzIHRoZSBwb2ludGVyIHRvIHRoZSBoYW5kbGVyIGZ1bmN0aW9uCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZmRlZiBBQ1BJX0ZVVFVSRV9VU0FHRQotYWNwaV9zdGF0dXMgYWNwaV9pbnN0YWxsX2V4Y2VwdGlvbl9oYW5kbGVyKGFjcGlfZXhjZXB0aW9uX2hhbmRsZXIgaGFuZGxlcikKLXsKLQlhY3BpX3N0YXR1cyBzdGF0dXM7Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGFjcGlfaW5zdGFsbF9leGNlcHRpb25faGFuZGxlcik7Ci0KLQlzdGF0dXMgPSBhY3BpX3V0X2FjcXVpcmVfbXV0ZXgoQUNQSV9NVFhfRVZFTlRTKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci0JfQotCi0JLyogRG9uJ3QgYWxsb3cgdHdvIGhhbmRsZXJzLiAqLwotCi0JaWYgKGFjcGlfZ2JsX2V4Y2VwdGlvbl9oYW5kbGVyKSB7Ci0JCXN0YXR1cyA9IEFFX0FMUkVBRFlfRVhJU1RTOwotCQlnb3RvIGNsZWFudXA7Ci0JfQotCi0JLyogSW5zdGFsbCB0aGUgaGFuZGxlciAqLwotCi0JYWNwaV9nYmxfZXhjZXB0aW9uX2hhbmRsZXIgPSBoYW5kbGVyOwotCi0gICAgICBjbGVhbnVwOgotCSh2b2lkKWFjcGlfdXRfcmVsZWFzZV9tdXRleChBQ1BJX01UWF9FVkVOVFMpOwotCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotfQotCi1BQ1BJX0VYUE9SVF9TWU1CT0woYWNwaV9pbnN0YWxsX2V4Y2VwdGlvbl9oYW5kbGVyKQotI2VuZGlmCQkJCS8qICBBQ1BJX0ZVVFVSRV9VU0FHRSAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfaW5zdGFsbF9maXhlZF9ldmVudF9oYW5kbGVyCi0gKgotICogUEFSQU1FVEVSUzogIEV2ZW50ICAgICAgICAgICAtIEV2ZW50IHR5cGUgdG8gZW5hYmxlLgotICogICAgICAgICAgICAgIEhhbmRsZXIgICAgICAgICAtIFBvaW50ZXIgdG8gdGhlIGhhbmRsZXIgZnVuY3Rpb24gZm9yIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50Ci0gKiAgICAgICAgICAgICAgQ29udGV4dCAgICAgICAgIC0gVmFsdWUgcGFzc2VkIHRvIHRoZSBoYW5kbGVyIG9uIGVhY2ggR1BFCi0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cwotICoKLSAqIERFU0NSSVBUSU9OOiBTYXZlcyB0aGUgcG9pbnRlciB0byB0aGUgaGFuZGxlciBmdW5jdGlvbiBhbmQgdGhlbiBlbmFibGVzIHRoZQotICogICAgICAgICAgICAgIGV2ZW50LgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1hY3BpX3N0YXR1cwotYWNwaV9pbnN0YWxsX2ZpeGVkX2V2ZW50X2hhbmRsZXIodTMyIGV2ZW50LAotCQkJCSBhY3BpX2V2ZW50X2hhbmRsZXIgaGFuZGxlciwgdm9pZCAqY29udGV4dCkKLXsKLQlhY3BpX3N0YXR1cyBzdGF0dXM7Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGFjcGlfaW5zdGFsbF9maXhlZF9ldmVudF9oYW5kbGVyKTsKLQotCS8qIFBhcmFtZXRlciB2YWxpZGF0aW9uICovCi0KLQlpZiAoZXZlbnQgPiBBQ1BJX0VWRU5UX01BWCkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX1BBUkFNRVRFUik7Ci0JfQotCi0Jc3RhdHVzID0gYWNwaV91dF9hY3F1aXJlX211dGV4KEFDUElfTVRYX0VWRU5UUyk7Ci0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotCX0KLQotCS8qIERvbid0IGFsbG93IHR3byBoYW5kbGVycy4gKi8KLQotCWlmIChOVUxMICE9IGFjcGlfZ2JsX2ZpeGVkX2V2ZW50X2hhbmRsZXJzW2V2ZW50XS5oYW5kbGVyKSB7Ci0JCXN0YXR1cyA9IEFFX0FMUkVBRFlfRVhJU1RTOwotCQlnb3RvIGNsZWFudXA7Ci0JfQotCi0JLyogSW5zdGFsbCB0aGUgaGFuZGxlciBiZWZvcmUgZW5hYmxpbmcgdGhlIGV2ZW50ICovCi0KLQlhY3BpX2dibF9maXhlZF9ldmVudF9oYW5kbGVyc1tldmVudF0uaGFuZGxlciA9IGhhbmRsZXI7Ci0JYWNwaV9nYmxfZml4ZWRfZXZlbnRfaGFuZGxlcnNbZXZlbnRdLmNvbnRleHQgPSBjb250ZXh0OwotCi0Jc3RhdHVzID0gYWNwaV9jbGVhcl9ldmVudChldmVudCk7Ci0JaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKQotCQlzdGF0dXMgPSBhY3BpX2VuYWJsZV9ldmVudChldmVudCwgMCk7Ci0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCUFDUElfV0FSTklORygoQUVfSU5GTywgIkNvdWxkIG5vdCBlbmFibGUgZml4ZWQgZXZlbnQgJVgiLAotCQkJICAgICAgZXZlbnQpKTsKLQotCQkvKiBSZW1vdmUgdGhlIGhhbmRsZXIgKi8KLQotCQlhY3BpX2dibF9maXhlZF9ldmVudF9oYW5kbGVyc1tldmVudF0uaGFuZGxlciA9IE5VTEw7Ci0JCWFjcGlfZ2JsX2ZpeGVkX2V2ZW50X2hhbmRsZXJzW2V2ZW50XS5jb250ZXh0ID0gTlVMTDsKLQl9IGVsc2UgewotCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sCi0JCQkJICAiRW5hYmxlZCBmaXhlZCBldmVudCAlWCwgSGFuZGxlcj0lcFxuIiwgZXZlbnQsCi0JCQkJICBoYW5kbGVyKSk7Ci0JfQotCi0gICAgICBjbGVhbnVwOgotCSh2b2lkKWFjcGlfdXRfcmVsZWFzZV9tdXRleChBQ1BJX01UWF9FVkVOVFMpOwotCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotfQotCi1BQ1BJX0VYUE9SVF9TWU1CT0woYWNwaV9pbnN0YWxsX2ZpeGVkX2V2ZW50X2hhbmRsZXIpCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfcmVtb3ZlX2ZpeGVkX2V2ZW50X2hhbmRsZXIKLSAqCi0gKiBQQVJBTUVURVJTOiAgRXZlbnQgICAgICAgICAgIC0gRXZlbnQgdHlwZSB0byBkaXNhYmxlLgotICogICAgICAgICAgICAgIEhhbmRsZXIgICAgICAgICAtIEFkZHJlc3Mgb2YgdGhlIGhhbmRsZXIKLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IERpc2FibGVzIHRoZSBldmVudCBhbmQgdW5yZWdpc3RlcnMgdGhlIGV2ZW50IGhhbmRsZXIuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWFjcGlfc3RhdHVzCi1hY3BpX3JlbW92ZV9maXhlZF9ldmVudF9oYW5kbGVyKHUzMiBldmVudCwgYWNwaV9ldmVudF9oYW5kbGVyIGhhbmRsZXIpCi17Ci0JYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGFjcGlfcmVtb3ZlX2ZpeGVkX2V2ZW50X2hhbmRsZXIpOwotCi0JLyogUGFyYW1ldGVyIHZhbGlkYXRpb24gKi8KLQotCWlmIChldmVudCA+IEFDUElfRVZFTlRfTUFYKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfUEFSQU1FVEVSKTsKLQl9Ci0KLQlzdGF0dXMgPSBhY3BpX3V0X2FjcXVpcmVfbXV0ZXgoQUNQSV9NVFhfRVZFTlRTKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci0JfQotCi0JLyogRGlzYWJsZSB0aGUgZXZlbnQgYmVmb3JlIHJlbW92aW5nIHRoZSBoYW5kbGVyICovCi0KLQlzdGF0dXMgPSBhY3BpX2Rpc2FibGVfZXZlbnQoZXZlbnQsIDApOwotCi0JLyogQWx3YXlzIFJlbW92ZSB0aGUgaGFuZGxlciAqLwotCi0JYWNwaV9nYmxfZml4ZWRfZXZlbnRfaGFuZGxlcnNbZXZlbnRdLmhhbmRsZXIgPSBOVUxMOwotCWFjcGlfZ2JsX2ZpeGVkX2V2ZW50X2hhbmRsZXJzW2V2ZW50XS5jb250ZXh0ID0gTlVMTDsKLQotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlBQ1BJX1dBUk5JTkcoKEFFX0lORk8sCi0JCQkgICAgICAiQ291bGQgbm90IHdyaXRlIHRvIGZpeGVkIGV2ZW50IGVuYWJsZSByZWdpc3RlciAlWCIsCi0JCQkgICAgICBldmVudCkpOwotCX0gZWxzZSB7Ci0JCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgIkRpc2FibGVkIGZpeGVkIGV2ZW50ICVYXG4iLAotCQkJCSAgZXZlbnQpKTsKLQl9Ci0KLQkodm9pZClhY3BpX3V0X3JlbGVhc2VfbXV0ZXgoQUNQSV9NVFhfRVZFTlRTKTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLX0KLQotQUNQSV9FWFBPUlRfU1lNQk9MKGFjcGlfcmVtb3ZlX2ZpeGVkX2V2ZW50X2hhbmRsZXIpCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfaW5zdGFsbF9ub3RpZnlfaGFuZGxlcgotICoKLSAqIFBBUkFNRVRFUlM6ICBEZXZpY2UgICAgICAgICAgLSBUaGUgZGV2aWNlIGZvciB3aGljaCBub3RpZmllcyB3aWxsIGJlIGhhbmRsZWQKLSAqICAgICAgICAgICAgICBoYW5kbGVyX3R5cGUgICAgLSBUaGUgdHlwZSBvZiBoYW5kbGVyOgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUNQSV9TWVNURU1fTk9USUZZOiBzeXN0ZW1faGFuZGxlciAoMDAtN2YpCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQ1BJX0RFVklDRV9OT1RJRlk6IGRyaXZlcl9oYW5kbGVyICg4MC1mZikKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFDUElfQUxMX05PVElGWTogIGJvdGggc3lzdGVtIGFuZCBkZXZpY2UKLSAqICAgICAgICAgICAgICBIYW5kbGVyICAgICAgICAgLSBBZGRyZXNzIG9mIHRoZSBoYW5kbGVyCi0gKiAgICAgICAgICAgICAgQ29udGV4dCAgICAgICAgIC0gVmFsdWUgcGFzc2VkIHRvIHRoZSBoYW5kbGVyIG9uIGVhY2ggR1BFCi0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cwotICoKLSAqIERFU0NSSVBUSU9OOiBJbnN0YWxsIGEgaGFuZGxlciBmb3Igbm90aWZpZXMgb24gYW4gQUNQSSBkZXZpY2UKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYWNwaV9zdGF0dXMKLWFjcGlfaW5zdGFsbF9ub3RpZnlfaGFuZGxlcihhY3BpX2hhbmRsZSBkZXZpY2UsCi0JCQkgICAgdTMyIGhhbmRsZXJfdHlwZSwKLQkJCSAgICBhY3BpX25vdGlmeV9oYW5kbGVyIGhhbmRsZXIsIHZvaWQgKmNvbnRleHQpCi17Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2M7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqbm90aWZ5X29iajsKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZTsKLQlhY3BpX3N0YXR1cyBzdGF0dXM7Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGFjcGlfaW5zdGFsbF9ub3RpZnlfaGFuZGxlcik7Ci0KLQkvKiBQYXJhbWV0ZXIgdmFsaWRhdGlvbiAqLwotCi0JaWYgKCghZGV2aWNlKSB8fAotCSAgICAoIWhhbmRsZXIpIHx8IChoYW5kbGVyX3R5cGUgPiBBQ1BJX01BWF9OT1RJRllfSEFORExFUl9UWVBFKSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX1BBUkFNRVRFUik7Ci0JfQotCi0Jc3RhdHVzID0gYWNwaV91dF9hY3F1aXJlX211dGV4KEFDUElfTVRYX05BTUVTUEFDRSk7Ci0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotCX0KLQotCS8qIENvbnZlcnQgYW5kIHZhbGlkYXRlIHRoZSBkZXZpY2UgaGFuZGxlICovCi0KLQlub2RlID0gYWNwaV9uc19tYXBfaGFuZGxlX3RvX25vZGUoZGV2aWNlKTsKLQlpZiAoIW5vZGUpIHsKLQkJc3RhdHVzID0gQUVfQkFEX1BBUkFNRVRFUjsKLQkJZ290byB1bmxvY2tfYW5kX2V4aXQ7Ci0JfQotCi0JLyoKLQkgKiBSb290IE9iamVjdDoKLQkgKiBSZWdpc3RlcmluZyBhIG5vdGlmeSBoYW5kbGVyIG9uIHRoZSByb290IG9iamVjdCBpbmRpY2F0ZXMgdGhhdCB0aGUKLQkgKiBjYWxsZXIgd2lzaGVzIHRvIHJlY2VpdmUgbm90aWZpY2F0aW9ucyBmb3IgYWxsIG9iamVjdHMuICBOb3RlIHRoYXQKLQkgKiBvbmx5IG9uZSA8ZXh0ZXJuYWw+IGdsb2JhbCBoYW5kbGVyIGNhbiBiZSByZWdzaXRlcmVkIChwZXIgbm90aWZ5IHR5cGUpLgotCSAqLwotCWlmIChkZXZpY2UgPT0gQUNQSV9ST09UX09CSkVDVCkgewotCi0JCS8qIE1ha2Ugc3VyZSB0aGUgaGFuZGxlciBpcyBub3QgYWxyZWFkeSBpbnN0YWxsZWQgKi8KLQotCQlpZiAoKChoYW5kbGVyX3R5cGUgJiBBQ1BJX1NZU1RFTV9OT1RJRlkpICYmCi0JCSAgICAgYWNwaV9nYmxfc3lzdGVtX25vdGlmeS5oYW5kbGVyKSB8fAotCQkgICAgKChoYW5kbGVyX3R5cGUgJiBBQ1BJX0RFVklDRV9OT1RJRlkpICYmCi0JCSAgICAgYWNwaV9nYmxfZGV2aWNlX25vdGlmeS5oYW5kbGVyKSkgewotCQkJc3RhdHVzID0gQUVfQUxSRUFEWV9FWElTVFM7Ci0JCQlnb3RvIHVubG9ja19hbmRfZXhpdDsKLQkJfQotCi0JCWlmIChoYW5kbGVyX3R5cGUgJiBBQ1BJX1NZU1RFTV9OT1RJRlkpIHsKLQkJCWFjcGlfZ2JsX3N5c3RlbV9ub3RpZnkubm9kZSA9IG5vZGU7Ci0JCQlhY3BpX2dibF9zeXN0ZW1fbm90aWZ5LmhhbmRsZXIgPSBoYW5kbGVyOwotCQkJYWNwaV9nYmxfc3lzdGVtX25vdGlmeS5jb250ZXh0ID0gY29udGV4dDsKLQkJfQotCi0JCWlmIChoYW5kbGVyX3R5cGUgJiBBQ1BJX0RFVklDRV9OT1RJRlkpIHsKLQkJCWFjcGlfZ2JsX2RldmljZV9ub3RpZnkubm9kZSA9IG5vZGU7Ci0JCQlhY3BpX2dibF9kZXZpY2Vfbm90aWZ5LmhhbmRsZXIgPSBoYW5kbGVyOwotCQkJYWNwaV9nYmxfZGV2aWNlX25vdGlmeS5jb250ZXh0ID0gY29udGV4dDsKLQkJfQotCi0JCS8qIEdsb2JhbCBub3RpZnkgaGFuZGxlciBpbnN0YWxsZWQgKi8KLQl9Ci0KLQkvKgotCSAqIEFsbCBPdGhlciBPYmplY3RzOgotCSAqIENhbGxlciB3aWxsIG9ubHkgcmVjZWl2ZSBub3RpZmljYXRpb25zIHNwZWNpZmljIHRvIHRoZSB0YXJnZXQgb2JqZWN0LgotCSAqIE5vdGUgdGhhdCBvbmx5IGNlcnRhaW4gb2JqZWN0IHR5cGVzIGNhbiByZWNlaXZlIG5vdGlmaWNhdGlvbnMuCi0JICovCi0JZWxzZSB7Ci0JCS8qIE5vdGlmaWVzIGFsbG93ZWQgb24gdGhpcyBvYmplY3Q/ICovCi0KLQkJaWYgKCFhY3BpX2V2X2lzX25vdGlmeV9vYmplY3Qobm9kZSkpIHsKLQkJCXN0YXR1cyA9IEFFX1RZUEU7Ci0JCQlnb3RvIHVubG9ja19hbmRfZXhpdDsKLQkJfQotCi0JCS8qIENoZWNrIGZvciBhbiBleGlzdGluZyBpbnRlcm5hbCBvYmplY3QgKi8KLQotCQlvYmpfZGVzYyA9IGFjcGlfbnNfZ2V0X2F0dGFjaGVkX29iamVjdChub2RlKTsKLQkJaWYgKG9ial9kZXNjKSB7Ci0KLQkJCS8qIE9iamVjdCBleGlzdHMgLSBtYWtlIHN1cmUgdGhlcmUncyBubyBoYW5kbGVyICovCi0KLQkJCWlmICgoKGhhbmRsZXJfdHlwZSAmIEFDUElfU1lTVEVNX05PVElGWSkgJiYKLQkJCSAgICAgb2JqX2Rlc2MtPmNvbW1vbl9ub3RpZnkuc3lzdGVtX25vdGlmeSkgfHwKLQkJCSAgICAoKGhhbmRsZXJfdHlwZSAmIEFDUElfREVWSUNFX05PVElGWSkgJiYKLQkJCSAgICAgb2JqX2Rlc2MtPmNvbW1vbl9ub3RpZnkuZGV2aWNlX25vdGlmeSkpIHsKLQkJCQlzdGF0dXMgPSBBRV9BTFJFQURZX0VYSVNUUzsKLQkJCQlnb3RvIHVubG9ja19hbmRfZXhpdDsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCS8qIENyZWF0ZSBhIG5ldyBvYmplY3QgKi8KLQotCQkJb2JqX2Rlc2MgPSBhY3BpX3V0X2NyZWF0ZV9pbnRlcm5hbF9vYmplY3Qobm9kZS0+dHlwZSk7Ci0JCQlpZiAoIW9ial9kZXNjKSB7Ci0JCQkJc3RhdHVzID0gQUVfTk9fTUVNT1JZOwotCQkJCWdvdG8gdW5sb2NrX2FuZF9leGl0OwotCQkJfQotCi0JCQkvKiBBdHRhY2ggbmV3IG9iamVjdCB0byB0aGUgTm9kZSAqLwotCi0JCQlzdGF0dXMgPQotCQkJICAgIGFjcGlfbnNfYXR0YWNoX29iamVjdChkZXZpY2UsIG9ial9kZXNjLCBub2RlLT50eXBlKTsKLQotCQkJLyogUmVtb3ZlIGxvY2FsIHJlZmVyZW5jZSB0byB0aGUgb2JqZWN0ICovCi0KLQkJCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZShvYmpfZGVzYyk7Ci0JCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJCQlnb3RvIHVubG9ja19hbmRfZXhpdDsKLQkJCX0KLQkJfQotCi0JCS8qIEluc3RhbGwgdGhlIGhhbmRsZXIgKi8KLQotCQlub3RpZnlfb2JqID0KLQkJICAgIGFjcGlfdXRfY3JlYXRlX2ludGVybmFsX29iamVjdChBQ1BJX1RZUEVfTE9DQUxfTk9USUZZKTsKLQkJaWYgKCFub3RpZnlfb2JqKSB7Ci0JCQlzdGF0dXMgPSBBRV9OT19NRU1PUlk7Ci0JCQlnb3RvIHVubG9ja19hbmRfZXhpdDsKLQkJfQotCi0JCW5vdGlmeV9vYmotPm5vdGlmeS5ub2RlID0gbm9kZTsKLQkJbm90aWZ5X29iai0+bm90aWZ5LmhhbmRsZXIgPSBoYW5kbGVyOwotCQlub3RpZnlfb2JqLT5ub3RpZnkuY29udGV4dCA9IGNvbnRleHQ7Ci0KLQkJaWYgKGhhbmRsZXJfdHlwZSAmIEFDUElfU1lTVEVNX05PVElGWSkgewotCQkJb2JqX2Rlc2MtPmNvbW1vbl9ub3RpZnkuc3lzdGVtX25vdGlmeSA9IG5vdGlmeV9vYmo7Ci0JCX0KLQotCQlpZiAoaGFuZGxlcl90eXBlICYgQUNQSV9ERVZJQ0VfTk9USUZZKSB7Ci0JCQlvYmpfZGVzYy0+Y29tbW9uX25vdGlmeS5kZXZpY2Vfbm90aWZ5ID0gbm90aWZ5X29iajsKLQkJfQotCi0JCWlmIChoYW5kbGVyX3R5cGUgPT0gQUNQSV9BTExfTk9USUZZKSB7Ci0KLQkJCS8qIEV4dHJhIHJlZiBpZiBpbnN0YWxsZWQgaW4gYm90aCAqLwotCi0JCQlhY3BpX3V0X2FkZF9yZWZlcmVuY2Uobm90aWZ5X29iaik7Ci0JCX0KLQl9Ci0KLSAgICAgIHVubG9ja19hbmRfZXhpdDoKLQkodm9pZClhY3BpX3V0X3JlbGVhc2VfbXV0ZXgoQUNQSV9NVFhfTkFNRVNQQUNFKTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLX0KLQotQUNQSV9FWFBPUlRfU1lNQk9MKGFjcGlfaW5zdGFsbF9ub3RpZnlfaGFuZGxlcikKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9yZW1vdmVfbm90aWZ5X2hhbmRsZXIKLSAqCi0gKiBQQVJBTUVURVJTOiAgRGV2aWNlICAgICAgICAgIC0gVGhlIGRldmljZSBmb3Igd2hpY2ggbm90aWZpZXMgd2lsbCBiZSBoYW5kbGVkCi0gKiAgICAgICAgICAgICAgaGFuZGxlcl90eXBlICAgIC0gVGhlIHR5cGUgb2YgaGFuZGxlcjoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFDUElfU1lTVEVNX05PVElGWTogc3lzdGVtX2hhbmRsZXIgKDAwLTdmKQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUNQSV9ERVZJQ0VfTk9USUZZOiBkcml2ZXJfaGFuZGxlciAoODAtZmYpCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQ1BJX0FMTF9OT1RJRlk6ICBib3RoIHN5c3RlbSBhbmQgZGV2aWNlCi0gKiAgICAgICAgICAgICAgSGFuZGxlciAgICAgICAgIC0gQWRkcmVzcyBvZiB0aGUgaGFuZGxlcgotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKLSAqCi0gKiBERVNDUklQVElPTjogUmVtb3ZlIGEgaGFuZGxlciBmb3Igbm90aWZpZXMgb24gYW4gQUNQSSBkZXZpY2UKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYWNwaV9zdGF0dXMKLWFjcGlfcmVtb3ZlX25vdGlmeV9oYW5kbGVyKGFjcGlfaGFuZGxlIGRldmljZSwKLQkJCSAgIHUzMiBoYW5kbGVyX3R5cGUsIGFjcGlfbm90aWZ5X2hhbmRsZXIgaGFuZGxlcikKLXsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpub3RpZnlfb2JqOwotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjOwotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlOwotCWFjcGlfc3RhdHVzIHN0YXR1czsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UoYWNwaV9yZW1vdmVfbm90aWZ5X2hhbmRsZXIpOwotCi0JLyogUGFyYW1ldGVyIHZhbGlkYXRpb24gKi8KLQotCWlmICgoIWRldmljZSkgfHwKLQkgICAgKCFoYW5kbGVyKSB8fCAoaGFuZGxlcl90eXBlID4gQUNQSV9NQVhfTk9USUZZX0hBTkRMRVJfVFlQRSkpIHsKLQkJc3RhdHVzID0gQUVfQkFEX1BBUkFNRVRFUjsKLQkJZ290byBleGl0OwotCX0KLQotCXN0YXR1cyA9IGFjcGlfdXRfYWNxdWlyZV9tdXRleChBQ1BJX01UWF9OQU1FU1BBQ0UpOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlnb3RvIGV4aXQ7Ci0JfQotCi0JLyogQ29udmVydCBhbmQgdmFsaWRhdGUgdGhlIGRldmljZSBoYW5kbGUgKi8KLQotCW5vZGUgPSBhY3BpX25zX21hcF9oYW5kbGVfdG9fbm9kZShkZXZpY2UpOwotCWlmICghbm9kZSkgewotCQlzdGF0dXMgPSBBRV9CQURfUEFSQU1FVEVSOwotCQlnb3RvIHVubG9ja19hbmRfZXhpdDsKLQl9Ci0KLQkvKiBSb290IE9iamVjdCAqLwotCi0JaWYgKGRldmljZSA9PSBBQ1BJX1JPT1RfT0JKRUNUKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywKLQkJCQkgICJSZW1vdmluZyBub3RpZnkgaGFuZGxlciBmb3IgbmFtZXNwYWNlIHJvb3Qgb2JqZWN0XG4iKSk7Ci0KLQkJaWYgKCgoaGFuZGxlcl90eXBlICYgQUNQSV9TWVNURU1fTk9USUZZKSAmJgotCQkgICAgICFhY3BpX2dibF9zeXN0ZW1fbm90aWZ5LmhhbmRsZXIpIHx8Ci0JCSAgICAoKGhhbmRsZXJfdHlwZSAmIEFDUElfREVWSUNFX05PVElGWSkgJiYKLQkJICAgICAhYWNwaV9nYmxfZGV2aWNlX25vdGlmeS5oYW5kbGVyKSkgewotCQkJc3RhdHVzID0gQUVfTk9UX0VYSVNUOwotCQkJZ290byB1bmxvY2tfYW5kX2V4aXQ7Ci0JCX0KLQotCQkvKiBNYWtlIHN1cmUgYWxsIGRlZmVycmVkIHRhc2tzIGFyZSBjb21wbGV0ZWQgKi8KLQotCQkodm9pZClhY3BpX3V0X3JlbGVhc2VfbXV0ZXgoQUNQSV9NVFhfTkFNRVNQQUNFKTsKLQkJYWNwaV9vc193YWl0X2V2ZW50c19jb21wbGV0ZShOVUxMKTsKLQkJc3RhdHVzID0gYWNwaV91dF9hY3F1aXJlX211dGV4KEFDUElfTVRYX05BTUVTUEFDRSk7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQkJZ290byBleGl0OwotCQl9Ci0KLQkJaWYgKGhhbmRsZXJfdHlwZSAmIEFDUElfU1lTVEVNX05PVElGWSkgewotCQkJYWNwaV9nYmxfc3lzdGVtX25vdGlmeS5ub2RlID0gTlVMTDsKLQkJCWFjcGlfZ2JsX3N5c3RlbV9ub3RpZnkuaGFuZGxlciA9IE5VTEw7Ci0JCQlhY3BpX2dibF9zeXN0ZW1fbm90aWZ5LmNvbnRleHQgPSBOVUxMOwotCQl9Ci0KLQkJaWYgKGhhbmRsZXJfdHlwZSAmIEFDUElfREVWSUNFX05PVElGWSkgewotCQkJYWNwaV9nYmxfZGV2aWNlX25vdGlmeS5ub2RlID0gTlVMTDsKLQkJCWFjcGlfZ2JsX2RldmljZV9ub3RpZnkuaGFuZGxlciA9IE5VTEw7Ci0JCQlhY3BpX2dibF9kZXZpY2Vfbm90aWZ5LmNvbnRleHQgPSBOVUxMOwotCQl9Ci0JfQotCi0JLyogQWxsIE90aGVyIE9iamVjdHMgKi8KLQotCWVsc2UgewotCQkvKiBOb3RpZmllcyBhbGxvd2VkIG9uIHRoaXMgb2JqZWN0PyAqLwotCi0JCWlmICghYWNwaV9ldl9pc19ub3RpZnlfb2JqZWN0KG5vZGUpKSB7Ci0JCQlzdGF0dXMgPSBBRV9UWVBFOwotCQkJZ290byB1bmxvY2tfYW5kX2V4aXQ7Ci0JCX0KLQotCQkvKiBDaGVjayBmb3IgYW4gZXhpc3RpbmcgaW50ZXJuYWwgb2JqZWN0ICovCi0KLQkJb2JqX2Rlc2MgPSBhY3BpX25zX2dldF9hdHRhY2hlZF9vYmplY3Qobm9kZSk7Ci0JCWlmICghb2JqX2Rlc2MpIHsKLQkJCXN0YXR1cyA9IEFFX05PVF9FWElTVDsKLQkJCWdvdG8gdW5sb2NrX2FuZF9leGl0OwotCQl9Ci0KLQkJLyogT2JqZWN0IGV4aXN0cyAtIG1ha2Ugc3VyZSB0aGVyZSdzIGFuIGV4aXN0aW5nIGhhbmRsZXIgKi8KLQotCQlpZiAoaGFuZGxlcl90eXBlICYgQUNQSV9TWVNURU1fTk9USUZZKSB7Ci0JCQlub3RpZnlfb2JqID0gb2JqX2Rlc2MtPmNvbW1vbl9ub3RpZnkuc3lzdGVtX25vdGlmeTsKLQkJCWlmICghbm90aWZ5X29iaikgewotCQkJCXN0YXR1cyA9IEFFX05PVF9FWElTVDsKLQkJCQlnb3RvIHVubG9ja19hbmRfZXhpdDsKLQkJCX0KLQotCQkJaWYgKG5vdGlmeV9vYmotPm5vdGlmeS5oYW5kbGVyICE9IGhhbmRsZXIpIHsKLQkJCQlzdGF0dXMgPSBBRV9CQURfUEFSQU1FVEVSOwotCQkJCWdvdG8gdW5sb2NrX2FuZF9leGl0OwotCQkJfQotCQkJLyogTWFrZSBzdXJlIGFsbCBkZWZlcnJlZCB0YXNrcyBhcmUgY29tcGxldGVkICovCi0KLQkJCSh2b2lkKWFjcGlfdXRfcmVsZWFzZV9tdXRleChBQ1BJX01UWF9OQU1FU1BBQ0UpOwotCQkJYWNwaV9vc193YWl0X2V2ZW50c19jb21wbGV0ZShOVUxMKTsKLQkJCXN0YXR1cyA9IGFjcGlfdXRfYWNxdWlyZV9tdXRleChBQ1BJX01UWF9OQU1FU1BBQ0UpOwotCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCQkJZ290byBleGl0OwotCQkJfQotCi0JCQkvKiBSZW1vdmUgdGhlIGhhbmRsZXIgKi8KLQkJCW9ial9kZXNjLT5jb21tb25fbm90aWZ5LnN5c3RlbV9ub3RpZnkgPSBOVUxMOwotCQkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKG5vdGlmeV9vYmopOwotCQl9Ci0KLQkJaWYgKGhhbmRsZXJfdHlwZSAmIEFDUElfREVWSUNFX05PVElGWSkgewotCQkJbm90aWZ5X29iaiA9IG9ial9kZXNjLT5jb21tb25fbm90aWZ5LmRldmljZV9ub3RpZnk7Ci0JCQlpZiAoIW5vdGlmeV9vYmopIHsKLQkJCQlzdGF0dXMgPSBBRV9OT1RfRVhJU1Q7Ci0JCQkJZ290byB1bmxvY2tfYW5kX2V4aXQ7Ci0JCQl9Ci0KLQkJCWlmIChub3RpZnlfb2JqLT5ub3RpZnkuaGFuZGxlciAhPSBoYW5kbGVyKSB7Ci0JCQkJc3RhdHVzID0gQUVfQkFEX1BBUkFNRVRFUjsKLQkJCQlnb3RvIHVubG9ja19hbmRfZXhpdDsKLQkJCX0KLQkJCS8qIE1ha2Ugc3VyZSBhbGwgZGVmZXJyZWQgdGFza3MgYXJlIGNvbXBsZXRlZCAqLwotCi0JCQkodm9pZClhY3BpX3V0X3JlbGVhc2VfbXV0ZXgoQUNQSV9NVFhfTkFNRVNQQUNFKTsKLQkJCWFjcGlfb3Nfd2FpdF9ldmVudHNfY29tcGxldGUoTlVMTCk7Ci0JCQlzdGF0dXMgPSBhY3BpX3V0X2FjcXVpcmVfbXV0ZXgoQUNQSV9NVFhfTkFNRVNQQUNFKTsKLQkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQkJCWdvdG8gZXhpdDsKLQkJCX0KLQotCQkJLyogUmVtb3ZlIHRoZSBoYW5kbGVyICovCi0JCQlvYmpfZGVzYy0+Y29tbW9uX25vdGlmeS5kZXZpY2Vfbm90aWZ5ID0gTlVMTDsKLQkJCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZShub3RpZnlfb2JqKTsKLQkJfQotCX0KLQotICAgICAgdW5sb2NrX2FuZF9leGl0OgotCSh2b2lkKWFjcGlfdXRfcmVsZWFzZV9tdXRleChBQ1BJX01UWF9OQU1FU1BBQ0UpOwotICAgICAgZXhpdDoKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpCi0JCUFDUElfRVhDRVBUSU9OKChBRV9JTkZPLCBzdGF0dXMsICJSZW1vdmluZyBub3RpZnkgaGFuZGxlciIpKTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLX0KLQotQUNQSV9FWFBPUlRfU1lNQk9MKGFjcGlfcmVtb3ZlX25vdGlmeV9oYW5kbGVyKQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX2luc3RhbGxfZ3BlX2hhbmRsZXIKLSAqCi0gKiBQQVJBTUVURVJTOiAgZ3BlX2RldmljZSAgICAgIC0gTmFtZXNwYWNlIG5vZGUgZm9yIHRoZSBHUEUgKE5VTEwgZm9yIEZBRFQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZpbmVkIEdQRXMpCi0gKiAgICAgICAgICAgICAgZ3BlX251bWJlciAgICAgIC0gVGhlIEdQRSBudW1iZXIgd2l0aGluIHRoZSBHUEUgYmxvY2sKLSAqICAgICAgICAgICAgICBUeXBlICAgICAgICAgICAgLSBXaGV0aGVyIHRoaXMgR1BFIHNob3VsZCBiZSB0cmVhdGVkIGFzIGFuCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWRnZS0gb3IgbGV2ZWwtdHJpZ2dlcmVkIGludGVycnVwdC4KLSAqICAgICAgICAgICAgICBBZGRyZXNzICAgICAgICAgLSBBZGRyZXNzIG9mIHRoZSBoYW5kbGVyCi0gKiAgICAgICAgICAgICAgQ29udGV4dCAgICAgICAgIC0gVmFsdWUgcGFzc2VkIHRvIHRoZSBoYW5kbGVyIG9uIGVhY2ggR1BFCi0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cwotICoKLSAqIERFU0NSSVBUSU9OOiBJbnN0YWxsIGEgaGFuZGxlciBmb3IgYSBHZW5lcmFsIFB1cnBvc2UgRXZlbnQuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWFjcGlfc3RhdHVzCi1hY3BpX2luc3RhbGxfZ3BlX2hhbmRsZXIoYWNwaV9oYW5kbGUgZ3BlX2RldmljZSwKLQkJCSB1MzIgZ3BlX251bWJlciwKLQkJCSB1MzIgdHlwZSwgYWNwaV9ldmVudF9oYW5kbGVyIGFkZHJlc3MsIHZvaWQgKmNvbnRleHQpCi17Ci0Jc3RydWN0IGFjcGlfZ3BlX2V2ZW50X2luZm8gKmdwZV9ldmVudF9pbmZvOwotCXN0cnVjdCBhY3BpX2hhbmRsZXJfaW5mbyAqaGFuZGxlcjsKLQlhY3BpX3N0YXR1cyBzdGF0dXM7Ci0JYWNwaV9jcHVfZmxhZ3MgZmxhZ3M7Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGFjcGlfaW5zdGFsbF9ncGVfaGFuZGxlcik7Ci0KLQkvKiBQYXJhbWV0ZXIgdmFsaWRhdGlvbiAqLwotCi0JaWYgKCghYWRkcmVzcykgfHwgKHR5cGUgPiBBQ1BJX0dQRV9YUlVQVF9UWVBFX01BU0spKSB7Ci0JCXN0YXR1cyA9IEFFX0JBRF9QQVJBTUVURVI7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0KLQlzdGF0dXMgPSBhY3BpX3V0X2FjcXVpcmVfbXV0ZXgoQUNQSV9NVFhfRVZFTlRTKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJZ290byBleGl0OwotCX0KLQotCS8qIEVuc3VyZSB0aGF0IHdlIGhhdmUgYSB2YWxpZCBHUEUgbnVtYmVyICovCi0KLQlncGVfZXZlbnRfaW5mbyA9IGFjcGlfZXZfZ2V0X2dwZV9ldmVudF9pbmZvKGdwZV9kZXZpY2UsIGdwZV9udW1iZXIpOwotCWlmICghZ3BlX2V2ZW50X2luZm8pIHsKLQkJc3RhdHVzID0gQUVfQkFEX1BBUkFNRVRFUjsKLQkJZ290byB1bmxvY2tfYW5kX2V4aXQ7Ci0JfQotCi0JLyogTWFrZSBzdXJlIHRoYXQgdGhlcmUgaXNuJ3QgYSBoYW5kbGVyIHRoZXJlIGFscmVhZHkgKi8KLQotCWlmICgoZ3BlX2V2ZW50X2luZm8tPmZsYWdzICYgQUNQSV9HUEVfRElTUEFUQ0hfTUFTSykgPT0KLQkgICAgQUNQSV9HUEVfRElTUEFUQ0hfSEFORExFUikgewotCQlzdGF0dXMgPSBBRV9BTFJFQURZX0VYSVNUUzsKLQkJZ290byB1bmxvY2tfYW5kX2V4aXQ7Ci0JfQotCi0JLyogQWxsb2NhdGUgYW5kIGluaXQgaGFuZGxlciBvYmplY3QgKi8KLQotCWhhbmRsZXIgPSBBQ1BJX0FMTE9DQVRFX1pFUk9FRChzaXplb2Yoc3RydWN0IGFjcGlfaGFuZGxlcl9pbmZvKSk7Ci0JaWYgKCFoYW5kbGVyKSB7Ci0JCXN0YXR1cyA9IEFFX05PX01FTU9SWTsKLQkJZ290byB1bmxvY2tfYW5kX2V4aXQ7Ci0JfQotCi0JaGFuZGxlci0+YWRkcmVzcyA9IGFkZHJlc3M7Ci0JaGFuZGxlci0+Y29udGV4dCA9IGNvbnRleHQ7Ci0JaGFuZGxlci0+bWV0aG9kX25vZGUgPSBncGVfZXZlbnRfaW5mby0+ZGlzcGF0Y2gubWV0aG9kX25vZGU7Ci0KLQkvKiBEaXNhYmxlIHRoZSBHUEUgYmVmb3JlIGluc3RhbGxpbmcgdGhlIGhhbmRsZXIgKi8KLQotCXN0YXR1cyA9IGFjcGlfZXZfZGlzYWJsZV9ncGUoZ3BlX2V2ZW50X2luZm8pOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlnb3RvIHVubG9ja19hbmRfZXhpdDsKLQl9Ci0KLQkvKiBJbnN0YWxsIHRoZSBoYW5kbGVyICovCi0KLQlmbGFncyA9IGFjcGlfb3NfYWNxdWlyZV9sb2NrKGFjcGlfZ2JsX2dwZV9sb2NrKTsKLQlncGVfZXZlbnRfaW5mby0+ZGlzcGF0Y2guaGFuZGxlciA9IGhhbmRsZXI7Ci0KLQkvKiBTZXR1cCB1cCBkaXNwYXRjaCBmbGFncyB0byBpbmRpY2F0ZSBoYW5kbGVyICh2cy4gbWV0aG9kKSAqLwotCi0JZ3BlX2V2ZW50X2luZm8tPmZsYWdzICY9IH4oQUNQSV9HUEVfWFJVUFRfVFlQRV9NQVNLIHwgQUNQSV9HUEVfRElTUEFUQ0hfTUFTSyk7CS8qIENsZWFyIGJpdHMgKi8KLQlncGVfZXZlbnRfaW5mby0+ZmxhZ3MgfD0gKHU4KSAodHlwZSB8IEFDUElfR1BFX0RJU1BBVENIX0hBTkRMRVIpOwotCi0JYWNwaV9vc19yZWxlYXNlX2xvY2soYWNwaV9nYmxfZ3BlX2xvY2ssIGZsYWdzKTsKLQotICAgICAgdW5sb2NrX2FuZF9leGl0OgotCSh2b2lkKWFjcGlfdXRfcmVsZWFzZV9tdXRleChBQ1BJX01UWF9FVkVOVFMpOwotICAgICAgZXhpdDoKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpCi0JCUFDUElfRVhDRVBUSU9OKChBRV9JTkZPLCBzdGF0dXMsCi0JCQkJIkluc3RhbGxpbmcgbm90aWZ5IGhhbmRsZXIgZmFpbGVkIikpOwotCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotfQotCi1BQ1BJX0VYUE9SVF9TWU1CT0woYWNwaV9pbnN0YWxsX2dwZV9oYW5kbGVyKQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX3JlbW92ZV9ncGVfaGFuZGxlcgotICoKLSAqIFBBUkFNRVRFUlM6ICBncGVfZGV2aWNlICAgICAgLSBOYW1lc3BhY2Ugbm9kZSBmb3IgdGhlIEdQRSAoTlVMTCBmb3IgRkFEVAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmluZWQgR1BFcykKLSAqICAgICAgICAgICAgICBncGVfbnVtYmVyICAgICAgLSBUaGUgZXZlbnQgdG8gcmVtb3ZlIGEgaGFuZGxlcgotICogICAgICAgICAgICAgIEFkZHJlc3MgICAgICAgICAtIEFkZHJlc3Mgb2YgdGhlIGhhbmRsZXIKLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IFJlbW92ZSBhIGhhbmRsZXIgZm9yIGEgR2VuZXJhbCBQdXJwb3NlIGFjcGlfZXZlbnQuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWFjcGlfc3RhdHVzCi1hY3BpX3JlbW92ZV9ncGVfaGFuZGxlcihhY3BpX2hhbmRsZSBncGVfZGV2aWNlLAotCQkJdTMyIGdwZV9udW1iZXIsIGFjcGlfZXZlbnRfaGFuZGxlciBhZGRyZXNzKQotewotCXN0cnVjdCBhY3BpX2dwZV9ldmVudF9pbmZvICpncGVfZXZlbnRfaW5mbzsKLQlzdHJ1Y3QgYWNwaV9oYW5kbGVyX2luZm8gKmhhbmRsZXI7Ci0JYWNwaV9zdGF0dXMgc3RhdHVzOwotCWFjcGlfY3B1X2ZsYWdzIGZsYWdzOwotCi0JQUNQSV9GVU5DVElPTl9UUkFDRShhY3BpX3JlbW92ZV9ncGVfaGFuZGxlcik7Ci0KLQkvKiBQYXJhbWV0ZXIgdmFsaWRhdGlvbiAqLwotCi0JaWYgKCFhZGRyZXNzKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfUEFSQU1FVEVSKTsKLQl9Ci0KLQlzdGF0dXMgPSBhY3BpX3V0X2FjcXVpcmVfbXV0ZXgoQUNQSV9NVFhfRVZFTlRTKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci0JfQotCi0JLyogRW5zdXJlIHRoYXQgd2UgaGF2ZSBhIHZhbGlkIEdQRSBudW1iZXIgKi8KLQotCWdwZV9ldmVudF9pbmZvID0gYWNwaV9ldl9nZXRfZ3BlX2V2ZW50X2luZm8oZ3BlX2RldmljZSwgZ3BlX251bWJlcik7Ci0JaWYgKCFncGVfZXZlbnRfaW5mbykgewotCQlzdGF0dXMgPSBBRV9CQURfUEFSQU1FVEVSOwotCQlnb3RvIHVubG9ja19hbmRfZXhpdDsKLQl9Ci0KLQkvKiBNYWtlIHN1cmUgdGhhdCBhIGhhbmRsZXIgaXMgaW5kZWVkIGluc3RhbGxlZCAqLwotCi0JaWYgKChncGVfZXZlbnRfaW5mby0+ZmxhZ3MgJiBBQ1BJX0dQRV9ESVNQQVRDSF9NQVNLKSAhPQotCSAgICBBQ1BJX0dQRV9ESVNQQVRDSF9IQU5ETEVSKSB7Ci0JCXN0YXR1cyA9IEFFX05PVF9FWElTVDsKLQkJZ290byB1bmxvY2tfYW5kX2V4aXQ7Ci0JfQotCi0JLyogTWFrZSBzdXJlIHRoYXQgdGhlIGluc3RhbGxlZCBoYW5kbGVyIGlzIHRoZSBzYW1lICovCi0KLQlpZiAoZ3BlX2V2ZW50X2luZm8tPmRpc3BhdGNoLmhhbmRsZXItPmFkZHJlc3MgIT0gYWRkcmVzcykgewotCQlzdGF0dXMgPSBBRV9CQURfUEFSQU1FVEVSOwotCQlnb3RvIHVubG9ja19hbmRfZXhpdDsKLQl9Ci0KLQkvKiBEaXNhYmxlIHRoZSBHUEUgYmVmb3JlIHJlbW92aW5nIHRoZSBoYW5kbGVyICovCi0KLQlzdGF0dXMgPSBhY3BpX2V2X2Rpc2FibGVfZ3BlKGdwZV9ldmVudF9pbmZvKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJZ290byB1bmxvY2tfYW5kX2V4aXQ7Ci0JfQotCi0JLyogTWFrZSBzdXJlIGFsbCBkZWZlcnJlZCB0YXNrcyBhcmUgY29tcGxldGVkICovCi0KLQkodm9pZClhY3BpX3V0X3JlbGVhc2VfbXV0ZXgoQUNQSV9NVFhfRVZFTlRTKTsKLQlhY3BpX29zX3dhaXRfZXZlbnRzX2NvbXBsZXRlKE5VTEwpOwotCXN0YXR1cyA9IGFjcGlfdXRfYWNxdWlyZV9tdXRleChBQ1BJX01UWF9FVkVOVFMpOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLQl9Ci0KLQkvKiBSZW1vdmUgdGhlIGhhbmRsZXIgKi8KLQotCWZsYWdzID0gYWNwaV9vc19hY3F1aXJlX2xvY2soYWNwaV9nYmxfZ3BlX2xvY2spOwotCWhhbmRsZXIgPSBncGVfZXZlbnRfaW5mby0+ZGlzcGF0Y2guaGFuZGxlcjsKLQotCS8qIFJlc3RvcmUgTWV0aG9kIG5vZGUgKGlmIGFueSksIHNldCBkaXNwYXRjaCBmbGFncyAqLwotCi0JZ3BlX2V2ZW50X2luZm8tPmRpc3BhdGNoLm1ldGhvZF9ub2RlID0gaGFuZGxlci0+bWV0aG9kX25vZGU7Ci0JZ3BlX2V2ZW50X2luZm8tPmZsYWdzICY9IH5BQ1BJX0dQRV9ESVNQQVRDSF9NQVNLOwkvKiBDbGVhciBiaXRzICovCi0JaWYgKGhhbmRsZXItPm1ldGhvZF9ub2RlKSB7Ci0JCWdwZV9ldmVudF9pbmZvLT5mbGFncyB8PSBBQ1BJX0dQRV9ESVNQQVRDSF9NRVRIT0Q7Ci0JfQotCWFjcGlfb3NfcmVsZWFzZV9sb2NrKGFjcGlfZ2JsX2dwZV9sb2NrLCBmbGFncyk7Ci0KLQkvKiBOb3cgd2UgY2FuIGZyZWUgdGhlIGhhbmRsZXIgb2JqZWN0ICovCi0KLQlBQ1BJX0ZSRUUoaGFuZGxlcik7Ci0KLSAgICAgIHVubG9ja19hbmRfZXhpdDoKLQkodm9pZClhY3BpX3V0X3JlbGVhc2VfbXV0ZXgoQUNQSV9NVFhfRVZFTlRTKTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLX0KLQotQUNQSV9FWFBPUlRfU1lNQk9MKGFjcGlfcmVtb3ZlX2dwZV9oYW5kbGVyKQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX2FjcXVpcmVfZ2xvYmFsX2xvY2sKLSAqCi0gKiBQQVJBTUVURVJTOiAgVGltZW91dCAgICAgICAgIC0gSG93IGxvbmcgdGhlIGNhbGxlciBpcyB3aWxsaW5nIHRvIHdhaXQKLSAqICAgICAgICAgICAgICBIYW5kbGUgICAgICAgICAgLSBXaGVyZSB0aGUgaGFuZGxlIHRvIHRoZSBsb2NrIGlzIHJldHVybmVkCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlmIGFjcXVpcmVkKQotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKLSAqCi0gKiBERVNDUklQVElPTjogQWNxdWlyZSB0aGUgQUNQSSBHbG9iYWwgTG9jawotICoKLSAqIE5vdGU6IEFsbG93cyBjYWxsZXJzIHdpdGggdGhlIHNhbWUgdGhyZWFkIElEIHRvIGFjcXVpcmUgdGhlIGdsb2JhbCBsb2NrCi0gKiBtdWx0aXBsZSB0aW1lcy4gSW4gb3RoZXIgd29yZHMsIGV4dGVybmFsbHksIHRoZSBiZWhhdmlvciBvZiB0aGUgZ2xvYmFsIGxvY2sKLSAqIGlzIGlkZW50aWNhbCB0byBhbiBBTUwgbXV0ZXguIE9uIHRoZSBmaXJzdCBhY3F1aXJlLCBhIG5ldyBoYW5kbGUgaXMKLSAqIHJldHVybmVkLiBPbiBhbnkgc3Vic2VxdWVudCBjYWxscyB0byBhY3F1aXJlIGJ5IHRoZSBzYW1lIHRocmVhZCwgdGhlIHNhbWUKLSAqIGhhbmRsZSBpcyByZXR1cm5lZC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYWNwaV9zdGF0dXMgYWNwaV9hY3F1aXJlX2dsb2JhbF9sb2NrKHUxNiB0aW1lb3V0LCB1MzIgKiBoYW5kbGUpCi17Ci0JYWNwaV9zdGF0dXMgc3RhdHVzOwotCi0JaWYgKCFoYW5kbGUpIHsKLQkJcmV0dXJuIChBRV9CQURfUEFSQU1FVEVSKTsKLQl9Ci0KLQkvKiBNdXN0IGxvY2sgaW50ZXJwcmV0ZXIgdG8gcHJldmVudCByYWNlIGNvbmRpdGlvbnMgKi8KLQotCWFjcGlfZXhfZW50ZXJfaW50ZXJwcmV0ZXIoKTsKLQotCXN0YXR1cyA9IGFjcGlfZXhfYWNxdWlyZV9tdXRleF9vYmplY3QodGltZW91dCwKLQkJCQkJICAgICAgYWNwaV9nYmxfZ2xvYmFsX2xvY2tfbXV0ZXgsCi0JCQkJCSAgICAgIGFjcGlfb3NfZ2V0X3RocmVhZF9pZCgpKTsKLQotCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkgewotCi0JCS8qIFJldHVybiB0aGUgZ2xvYmFsIGxvY2sgaGFuZGxlICh1cGRhdGVkIGluIGFjcGlfZXZfYWNxdWlyZV9nbG9iYWxfbG9jaykgKi8KLQotCQkqaGFuZGxlID0gYWNwaV9nYmxfZ2xvYmFsX2xvY2tfaGFuZGxlOwotCX0KLQotCWFjcGlfZXhfZXhpdF9pbnRlcnByZXRlcigpOwotCXJldHVybiAoc3RhdHVzKTsKLX0KLQotQUNQSV9FWFBPUlRfU1lNQk9MKGFjcGlfYWNxdWlyZV9nbG9iYWxfbG9jaykKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9yZWxlYXNlX2dsb2JhbF9sb2NrCi0gKgotICogUEFSQU1FVEVSUzogIEhhbmRsZSAgICAgIC0gUmV0dXJuZWQgZnJvbSBhY3BpX2FjcXVpcmVfZ2xvYmFsX2xvY2sKLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IFJlbGVhc2UgdGhlIEFDUEkgR2xvYmFsIExvY2suIFRoZSBoYW5kbGUgbXVzdCBiZSB2YWxpZC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYWNwaV9zdGF0dXMgYWNwaV9yZWxlYXNlX2dsb2JhbF9sb2NrKHUzMiBoYW5kbGUpCi17Ci0JYWNwaV9zdGF0dXMgc3RhdHVzOwotCi0JaWYgKCFoYW5kbGUgfHwgKGhhbmRsZSAhPSBhY3BpX2dibF9nbG9iYWxfbG9ja19oYW5kbGUpKSB7Ci0JCXJldHVybiAoQUVfTk9UX0FDUVVJUkVEKTsKLQl9Ci0KLQlzdGF0dXMgPSBhY3BpX2V4X3JlbGVhc2VfbXV0ZXhfb2JqZWN0KGFjcGlfZ2JsX2dsb2JhbF9sb2NrX211dGV4KTsKLQlyZXR1cm4gKHN0YXR1cyk7Ci19Ci0KLUFDUElfRVhQT1JUX1NZTUJPTChhY3BpX3JlbGVhc2VfZ2xvYmFsX2xvY2spCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZXZlbnRzL2V2eGZldm50LmMgYi9kcml2ZXJzL2FjcGkvZXZlbnRzL2V2eGZldm50LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxNTU0ZjcuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9hY3BpL2V2ZW50cy9ldnhmZXZudC5jCisrKyAvZGV2L251bGwKQEAgLTEsNzE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBNb2R1bGUgTmFtZTogZXZ4ZmV2bnQgLSBFeHRlcm5hbCBJbnRlcmZhY2VzLCBBQ1BJIGV2ZW50IGRpc2FibGUvZW5hYmxlCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwOCwgSW50ZWwgQ29ycC4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKLSAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIGF0IG1pbmltdW0gYSBkaXNjbGFpbWVyCi0gKiAgICBzdWJzdGFudGlhbGx5IHNpbWlsYXIgdG8gdGhlICJOTyBXQVJSQU5UWSIgZGlzY2xhaW1lciBiZWxvdwotICogICAgKCJEaXNjbGFpbWVyIikgYW5kIGFueSByZWRpc3RyaWJ1dGlvbiBtdXN0IGJlIGNvbmRpdGlvbmVkIHVwb24KLSAqICAgIGluY2x1ZGluZyBhIHN1YnN0YW50aWFsbHkgc2ltaWxhciBEaXNjbGFpbWVyIHJlcXVpcmVtZW50IGZvciBmdXJ0aGVyCi0gKiAgICBiaW5hcnkgcmVkaXN0cmlidXRpb24uCi0gKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMKLSAqICAgIG9mIGFueSBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTk8gV0FSUkFOVFkKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAotICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKLSAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HCi0gKiBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKLSAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KLSAqLwotCi0jaW5jbHVkZSA8YWNwaS9hY3BpLmg+Ci0jaW5jbHVkZSA8YWNwaS9hY2V2ZW50cy5oPgotI2luY2x1ZGUgPGFjcGkvYWNuYW1lc3AuaD4KLSNpbmNsdWRlIDxhY3BpL2FjdGFibGVzLmg+Ci0KLSNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX0VWRU5UUwotQUNQSV9NT0RVTEVfTkFNRSgiZXZ4ZmV2bnQiKQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX2VuYWJsZQotICoKLSAqIFBBUkFNRVRFUlM6ICBOb25lCi0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cwotICoKLSAqIERFU0NSSVBUSU9OOiBUcmFuc2ZlcnMgdGhlIHN5c3RlbSBpbnRvIEFDUEkgbW9kZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYWNwaV9zdGF0dXMgYWNwaV9lbmFibGUodm9pZCkKLXsKLQlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UoYWNwaV9lbmFibGUpOwotCi0JLyogQUNQSSB0YWJsZXMgbXVzdCBiZSBwcmVzZW50ICovCi0KLQlpZiAoIWFjcGlfdGJfdGFibGVzX2xvYWRlZCgpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT19BQ1BJX1RBQkxFUyk7Ci0JfQotCi0JLyogQ2hlY2sgY3VycmVudCBtb2RlICovCi0KLQlpZiAoYWNwaV9od19nZXRfbW9kZSgpID09IEFDUElfU1lTX01PREVfQUNQSSkgewotCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lOSVQsCi0JCQkJICAiU3lzdGVtIGlzIGFscmVhZHkgaW4gQUNQSSBtb2RlXG4iKSk7Ci0JfSBlbHNlIHsKLQkJLyogVHJhbnNpdGlvbiB0byBBQ1BJIG1vZGUgKi8KLQotCQlzdGF0dXMgPSBhY3BpX2h3X3NldF9tb2RlKEFDUElfU1lTX01PREVfQUNQSSk7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQkJQUNQSV9FUlJPUigoQUVfSU5GTywKLQkJCQkgICAgIkNvdWxkIG5vdCB0cmFuc2l0aW9uIHRvIEFDUEkgbW9kZSIpKTsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotCQl9Ci0KLQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTklULAotCQkJCSAgIlRyYW5zaXRpb24gdG8gQUNQSSBtb2RlIHN1Y2Nlc3NmdWxcbiIpKTsKLQl9Ci0KLQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLX0KLQotQUNQSV9FWFBPUlRfU1lNQk9MKGFjcGlfZW5hYmxlKQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX2Rpc2FibGUKLSAqCi0gKiBQQVJBTUVURVJTOiAgTm9uZQotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKLSAqCi0gKiBERVNDUklQVElPTjogVHJhbnNmZXJzIHRoZSBzeXN0ZW0gaW50byBMRUdBQ1kgKG5vbi1BQ1BJKSBtb2RlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1hY3BpX3N0YXR1cyBhY3BpX2Rpc2FibGUodm9pZCkKLXsKLQlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UoYWNwaV9kaXNhYmxlKTsKLQotCWlmIChhY3BpX2h3X2dldF9tb2RlKCkgPT0gQUNQSV9TWVNfTU9ERV9MRUdBQ1kpIHsKLQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTklULAotCQkJCSAgIlN5c3RlbSBpcyBhbHJlYWR5IGluIGxlZ2FjeSAobm9uLUFDUEkpIG1vZGVcbiIpKTsKLQl9IGVsc2UgewotCQkvKiBUcmFuc2l0aW9uIHRvIExFR0FDWSBtb2RlICovCi0KLQkJc3RhdHVzID0gYWNwaV9od19zZXRfbW9kZShBQ1BJX1NZU19NT0RFX0xFR0FDWSk7Ci0KLQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCQlBQ1BJX0VSUk9SKChBRV9JTkZPLAotCQkJCSAgICAiQ291bGQgbm90IGV4aXQgQUNQSSBtb2RlIHRvIGxlZ2FjeSBtb2RlIikpOwotCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci0JCX0KLQotCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lOSVQsICJBQ1BJIG1vZGUgZGlzYWJsZWRcbiIpKTsKLQl9Ci0KLQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLX0KLQotQUNQSV9FWFBPUlRfU1lNQk9MKGFjcGlfZGlzYWJsZSkKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9lbmFibGVfZXZlbnQKLSAqCi0gKiBQQVJBTUVURVJTOiAgRXZlbnQgICAgICAgICAgIC0gVGhlIGZpeGVkIGV2ZW50dG8gYmUgZW5hYmxlZAotICogICAgICAgICAgICAgIEZsYWdzICAgICAgICAgICAtIFJlc2VydmVkCi0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cwotICoKLSAqIERFU0NSSVBUSU9OOiBFbmFibGUgYW4gQUNQSSBldmVudCAoZml4ZWQpCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWFjcGlfc3RhdHVzIGFjcGlfZW5hYmxlX2V2ZW50KHUzMiBldmVudCwgdTMyIGZsYWdzKQotewotCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOwotCXUzMiB2YWx1ZTsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UoYWNwaV9lbmFibGVfZXZlbnQpOwotCi0JLyogRGVjb2RlIHRoZSBGaXhlZCBFdmVudCAqLwotCi0JaWYgKGV2ZW50ID4gQUNQSV9FVkVOVF9NQVgpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9QQVJBTUVURVIpOwotCX0KLQotCS8qCi0JICogRW5hYmxlIHRoZSByZXF1ZXN0ZWQgZml4ZWQgZXZlbnQgKGJ5IHdyaXRpbmcgYSBvbmUgdG8gdGhlCi0JICogZW5hYmxlIHJlZ2lzdGVyIGJpdCkKLQkgKi8KLQlzdGF0dXMgPQotCSAgICBhY3BpX3NldF9yZWdpc3RlcihhY3BpX2dibF9maXhlZF9ldmVudF9pbmZvW2V2ZW50XS4KLQkJCSAgICAgIGVuYWJsZV9yZWdpc3Rlcl9pZCwgMSk7Ci0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotCX0KLQotCS8qIE1ha2Ugc3VyZSB0aGF0IHRoZSBoYXJkd2FyZSByZXNwb25kZWQgKi8KLQotCXN0YXR1cyA9Ci0JICAgIGFjcGlfZ2V0X3JlZ2lzdGVyKGFjcGlfZ2JsX2ZpeGVkX2V2ZW50X2luZm9bZXZlbnRdLgotCQkJICAgICAgZW5hYmxlX3JlZ2lzdGVyX2lkLCAmdmFsdWUpOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLQl9Ci0KLQlpZiAodmFsdWUgIT0gMSkgewotCQlBQ1BJX0VSUk9SKChBRV9JTkZPLAotCQkJICAgICJDb3VsZCBub3QgZW5hYmxlICVzIGV2ZW50IiwKLQkJCSAgICBhY3BpX3V0X2dldF9ldmVudF9uYW1lKGV2ZW50KSkpOwotCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9fSEFSRFdBUkVfUkVTUE9OU0UpOwotCX0KLQotCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotfQotCi1BQ1BJX0VYUE9SVF9TWU1CT0woYWNwaV9lbmFibGVfZXZlbnQpCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfc2V0X2dwZV90eXBlCi0gKgotICogUEFSQU1FVEVSUzogIGdwZV9kZXZpY2UgICAgICAtIFBhcmVudCBHUEUgRGV2aWNlCi0gKiAgICAgICAgICAgICAgZ3BlX251bWJlciAgICAgIC0gR1BFIGxldmVsIHdpdGhpbiB0aGUgR1BFIGJsb2NrCi0gKiAgICAgICAgICAgICAgVHlwZSAgICAgICAgICAgIC0gTmV3IEdQRSB0eXBlCi0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cwotICoKLSAqIERFU0NSSVBUSU9OOiBTZXQgdGhlIHR5cGUgb2YgYW4gaW5kaXZpZHVhbCBHUEUKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYWNwaV9zdGF0dXMgYWNwaV9zZXRfZ3BlX3R5cGUoYWNwaV9oYW5kbGUgZ3BlX2RldmljZSwgdTMyIGdwZV9udW1iZXIsIHU4IHR5cGUpCi17Ci0JYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7Ci0Jc3RydWN0IGFjcGlfZ3BlX2V2ZW50X2luZm8gKmdwZV9ldmVudF9pbmZvOwotCi0JQUNQSV9GVU5DVElPTl9UUkFDRShhY3BpX3NldF9ncGVfdHlwZSk7Ci0KLQkvKiBFbnN1cmUgdGhhdCB3ZSBoYXZlIGEgdmFsaWQgR1BFIG51bWJlciAqLwotCi0JZ3BlX2V2ZW50X2luZm8gPSBhY3BpX2V2X2dldF9ncGVfZXZlbnRfaW5mbyhncGVfZGV2aWNlLCBncGVfbnVtYmVyKTsKLQlpZiAoIWdwZV9ldmVudF9pbmZvKSB7Ci0JCXN0YXR1cyA9IEFFX0JBRF9QQVJBTUVURVI7Ci0JCWdvdG8gdW5sb2NrX2FuZF9leGl0OwotCX0KLQotCWlmICgoZ3BlX2V2ZW50X2luZm8tPmZsYWdzICYgQUNQSV9HUEVfVFlQRV9NQVNLKSA9PSB0eXBlKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7Ci0JfQotCi0JLyogU2V0IHRoZSBuZXcgdHlwZSAod2lsbCBkaXNhYmxlIEdQRSBpZiBjdXJyZW50bHkgZW5hYmxlZCkgKi8KLQotCXN0YXR1cyA9IGFjcGlfZXZfc2V0X2dwZV90eXBlKGdwZV9ldmVudF9pbmZvLCB0eXBlKTsKLQotICAgICAgdW5sb2NrX2FuZF9leGl0OgotCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotfQotCi1BQ1BJX0VYUE9SVF9TWU1CT0woYWNwaV9zZXRfZ3BlX3R5cGUpCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfZW5hYmxlX2dwZQotICoKLSAqIFBBUkFNRVRFUlM6ICBncGVfZGV2aWNlICAgICAgLSBQYXJlbnQgR1BFIERldmljZQotICogICAgICAgICAgICAgIGdwZV9udW1iZXIgICAgICAtIEdQRSBsZXZlbCB3aXRoaW4gdGhlIEdQRSBibG9jawotICogICAgICAgICAgICAgIEZsYWdzICAgICAgICAgICAtIEp1c3QgZW5hYmxlLCBvciBhbHNvIHdha2UgZW5hYmxlPwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbGxlZCBmcm9tIElTUiBvciBub3QKLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IEVuYWJsZSBhbiBBQ1BJIGV2ZW50IChnZW5lcmFsIHB1cnBvc2UpCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWFjcGlfc3RhdHVzIGFjcGlfZW5hYmxlX2dwZShhY3BpX2hhbmRsZSBncGVfZGV2aWNlLCB1MzIgZ3BlX251bWJlcikKLXsKLQlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKLQlhY3BpX2NwdV9mbGFncyBmbGFnczsKLQlzdHJ1Y3QgYWNwaV9ncGVfZXZlbnRfaW5mbyAqZ3BlX2V2ZW50X2luZm87Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGFjcGlfZW5hYmxlX2dwZSk7Ci0KLQlmbGFncyA9IGFjcGlfb3NfYWNxdWlyZV9sb2NrKGFjcGlfZ2JsX2dwZV9sb2NrKTsKLQotCS8qIEVuc3VyZSB0aGF0IHdlIGhhdmUgYSB2YWxpZCBHUEUgbnVtYmVyICovCi0KLQlncGVfZXZlbnRfaW5mbyA9IGFjcGlfZXZfZ2V0X2dwZV9ldmVudF9pbmZvKGdwZV9kZXZpY2UsIGdwZV9udW1iZXIpOwotCWlmICghZ3BlX2V2ZW50X2luZm8pIHsKLQkJc3RhdHVzID0gQUVfQkFEX1BBUkFNRVRFUjsKLQkJZ290byB1bmxvY2tfYW5kX2V4aXQ7Ci0JfQotCi0JLyogUGVyZm9ybSB0aGUgZW5hYmxlICovCi0KLQlzdGF0dXMgPSBhY3BpX2V2X2VuYWJsZV9ncGUoZ3BlX2V2ZW50X2luZm8sIFRSVUUpOwotCi0gICAgICB1bmxvY2tfYW5kX2V4aXQ6Ci0JYWNwaV9vc19yZWxlYXNlX2xvY2soYWNwaV9nYmxfZ3BlX2xvY2ssIGZsYWdzKTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLX0KLQotQUNQSV9FWFBPUlRfU1lNQk9MKGFjcGlfZW5hYmxlX2dwZSkKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9kaXNhYmxlX2dwZQotICoKLSAqIFBBUkFNRVRFUlM6ICBncGVfZGV2aWNlICAgICAgLSBQYXJlbnQgR1BFIERldmljZQotICogICAgICAgICAgICAgIGdwZV9udW1iZXIgICAgICAtIEdQRSBsZXZlbCB3aXRoaW4gdGhlIEdQRSBibG9jawotICogICAgICAgICAgICAgIEZsYWdzICAgICAgICAgICAtIEp1c3QgZGlzYWJsZSwgb3IgYWxzbyB3YWtlIGRpc2FibGU/Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FsbGVkIGZyb20gSVNSIG9yIG5vdAotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKLSAqCi0gKiBERVNDUklQVElPTjogRGlzYWJsZSBhbiBBQ1BJIGV2ZW50IChnZW5lcmFsIHB1cnBvc2UpCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWFjcGlfc3RhdHVzIGFjcGlfZGlzYWJsZV9ncGUoYWNwaV9oYW5kbGUgZ3BlX2RldmljZSwgdTMyIGdwZV9udW1iZXIpCi17Ci0JYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7Ci0JYWNwaV9jcHVfZmxhZ3MgZmxhZ3M7Ci0Jc3RydWN0IGFjcGlfZ3BlX2V2ZW50X2luZm8gKmdwZV9ldmVudF9pbmZvOwotCi0JQUNQSV9GVU5DVElPTl9UUkFDRShhY3BpX2Rpc2FibGVfZ3BlKTsKLQotCWZsYWdzID0gYWNwaV9vc19hY3F1aXJlX2xvY2soYWNwaV9nYmxfZ3BlX2xvY2spOwotCS8qIEVuc3VyZSB0aGF0IHdlIGhhdmUgYSB2YWxpZCBHUEUgbnVtYmVyICovCi0KLQlncGVfZXZlbnRfaW5mbyA9IGFjcGlfZXZfZ2V0X2dwZV9ldmVudF9pbmZvKGdwZV9kZXZpY2UsIGdwZV9udW1iZXIpOwotCWlmICghZ3BlX2V2ZW50X2luZm8pIHsKLQkJc3RhdHVzID0gQUVfQkFEX1BBUkFNRVRFUjsKLQkJZ290byB1bmxvY2tfYW5kX2V4aXQ7Ci0JfQotCi0Jc3RhdHVzID0gYWNwaV9ldl9kaXNhYmxlX2dwZShncGVfZXZlbnRfaW5mbyk7Ci0KLXVubG9ja19hbmRfZXhpdDoKLQlhY3BpX29zX3JlbGVhc2VfbG9jayhhY3BpX2dibF9ncGVfbG9jaywgZmxhZ3MpOwotCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotfQotCi1BQ1BJX0VYUE9SVF9TWU1CT0woYWNwaV9kaXNhYmxlX2dwZSkKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9kaXNhYmxlX2V2ZW50Ci0gKgotICogUEFSQU1FVEVSUzogIEV2ZW50ICAgICAgICAgICAtIFRoZSBmaXhlZCBldmVudHRvIGJlIGVuYWJsZWQKLSAqICAgICAgICAgICAgICBGbGFncyAgICAgICAgICAgLSBSZXNlcnZlZAotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKLSAqCi0gKiBERVNDUklQVElPTjogRGlzYWJsZSBhbiBBQ1BJIGV2ZW50IChmaXhlZCkKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYWNwaV9zdGF0dXMgYWNwaV9kaXNhYmxlX2V2ZW50KHUzMiBldmVudCwgdTMyIGZsYWdzKQotewotCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOwotCXUzMiB2YWx1ZTsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UoYWNwaV9kaXNhYmxlX2V2ZW50KTsKLQotCS8qIERlY29kZSB0aGUgRml4ZWQgRXZlbnQgKi8KLQotCWlmIChldmVudCA+IEFDUElfRVZFTlRfTUFYKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfUEFSQU1FVEVSKTsKLQl9Ci0KLQkvKgotCSAqIERpc2FibGUgdGhlIHJlcXVlc3RlZCBmaXhlZCBldmVudCAoYnkgd3JpdGluZyBhIHplcm8gdG8gdGhlCi0JICogZW5hYmxlIHJlZ2lzdGVyIGJpdCkKLQkgKi8KLQlzdGF0dXMgPQotCSAgICBhY3BpX3NldF9yZWdpc3RlcihhY3BpX2dibF9maXhlZF9ldmVudF9pbmZvW2V2ZW50XS4KLQkJCSAgICAgIGVuYWJsZV9yZWdpc3Rlcl9pZCwgMCk7Ci0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotCX0KLQotCXN0YXR1cyA9Ci0JICAgIGFjcGlfZ2V0X3JlZ2lzdGVyKGFjcGlfZ2JsX2ZpeGVkX2V2ZW50X2luZm9bZXZlbnRdLgotCQkJICAgICAgZW5hYmxlX3JlZ2lzdGVyX2lkLCAmdmFsdWUpOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLQl9Ci0KLQlpZiAodmFsdWUgIT0gMCkgewotCQlBQ1BJX0VSUk9SKChBRV9JTkZPLAotCQkJICAgICJDb3VsZCBub3QgZGlzYWJsZSAlcyBldmVudHMiLAotCQkJICAgIGFjcGlfdXRfZ2V0X2V2ZW50X25hbWUoZXZlbnQpKSk7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT19IQVJEV0FSRV9SRVNQT05TRSk7Ci0JfQotCi0JcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci19Ci0KLUFDUElfRVhQT1JUX1NZTUJPTChhY3BpX2Rpc2FibGVfZXZlbnQpCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfY2xlYXJfZXZlbnQKLSAqCi0gKiBQQVJBTUVURVJTOiAgRXZlbnQgICAgICAgICAgIC0gVGhlIGZpeGVkIGV2ZW50IHRvIGJlIGNsZWFyZWQKLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IENsZWFyIGFuIEFDUEkgZXZlbnQgKGZpeGVkKQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1hY3BpX3N0YXR1cyBhY3BpX2NsZWFyX2V2ZW50KHUzMiBldmVudCkKLXsKLQlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UoYWNwaV9jbGVhcl9ldmVudCk7Ci0KLQkvKiBEZWNvZGUgdGhlIEZpeGVkIEV2ZW50ICovCi0KLQlpZiAoZXZlbnQgPiBBQ1BJX0VWRU5UX01BWCkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX1BBUkFNRVRFUik7Ci0JfQotCi0JLyoKLQkgKiBDbGVhciB0aGUgcmVxdWVzdGVkIGZpeGVkIGV2ZW50IChCeSB3cml0aW5nIGEgb25lIHRvIHRoZQotCSAqIHN0YXR1cyByZWdpc3RlciBiaXQpCi0JICovCi0Jc3RhdHVzID0KLQkgICAgYWNwaV9zZXRfcmVnaXN0ZXIoYWNwaV9nYmxfZml4ZWRfZXZlbnRfaW5mb1tldmVudF0uCi0JCQkgICAgICBzdGF0dXNfcmVnaXN0ZXJfaWQsIDEpOwotCi0JcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci19Ci0KLUFDUElfRVhQT1JUX1NZTUJPTChhY3BpX2NsZWFyX2V2ZW50KQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX2NsZWFyX2dwZQotICoKLSAqIFBBUkFNRVRFUlM6ICBncGVfZGV2aWNlICAgICAgLSBQYXJlbnQgR1BFIERldmljZQotICogICAgICAgICAgICAgIGdwZV9udW1iZXIgICAgICAtIEdQRSBsZXZlbCB3aXRoaW4gdGhlIEdQRSBibG9jawotICogICAgICAgICAgICAgIEZsYWdzICAgICAgICAgICAtIENhbGxlZCBmcm9tIGFuIElTUiBvciBub3QKLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IENsZWFyIGFuIEFDUEkgZXZlbnQgKGdlbmVyYWwgcHVycG9zZSkKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYWNwaV9zdGF0dXMgYWNwaV9jbGVhcl9ncGUoYWNwaV9oYW5kbGUgZ3BlX2RldmljZSwgdTMyIGdwZV9udW1iZXIsIHUzMiBmbGFncykKLXsKLQlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKLQlzdHJ1Y3QgYWNwaV9ncGVfZXZlbnRfaW5mbyAqZ3BlX2V2ZW50X2luZm87Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGFjcGlfY2xlYXJfZ3BlKTsKLQotCS8qIFVzZSBzZW1hcGhvcmUgbG9jayBpZiBub3QgZXhlY3V0aW5nIGF0IGludGVycnVwdCBsZXZlbCAqLwotCi0JaWYgKGZsYWdzICYgQUNQSV9OT1RfSVNSKSB7Ci0JCXN0YXR1cyA9IGFjcGlfdXRfYWNxdWlyZV9tdXRleChBQ1BJX01UWF9FVkVOVFMpOwotCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotCQl9Ci0JfQotCi0JLyogRW5zdXJlIHRoYXQgd2UgaGF2ZSBhIHZhbGlkIEdQRSBudW1iZXIgKi8KLQotCWdwZV9ldmVudF9pbmZvID0gYWNwaV9ldl9nZXRfZ3BlX2V2ZW50X2luZm8oZ3BlX2RldmljZSwgZ3BlX251bWJlcik7Ci0JaWYgKCFncGVfZXZlbnRfaW5mbykgewotCQlzdGF0dXMgPSBBRV9CQURfUEFSQU1FVEVSOwotCQlnb3RvIHVubG9ja19hbmRfZXhpdDsKLQl9Ci0KLQlzdGF0dXMgPSBhY3BpX2h3X2NsZWFyX2dwZShncGVfZXZlbnRfaW5mbyk7Ci0KLSAgICAgIHVubG9ja19hbmRfZXhpdDoKLQlpZiAoZmxhZ3MgJiBBQ1BJX05PVF9JU1IpIHsKLQkJKHZvaWQpYWNwaV91dF9yZWxlYXNlX211dGV4KEFDUElfTVRYX0VWRU5UUyk7Ci0JfQotCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotfQotCi1BQ1BJX0VYUE9SVF9TWU1CT0woYWNwaV9jbGVhcl9ncGUpCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX2dldF9ldmVudF9zdGF0dXMKLSAqCi0gKiBQQVJBTUVURVJTOiAgRXZlbnQgICAgICAgICAgIC0gVGhlIGZpeGVkIGV2ZW50Ci0gKiAgICAgICAgICAgICAgZXZlbnRfc3RhdHVzICAgIC0gV2hlcmUgdGhlIGN1cnJlbnQgc3RhdHVzIG9mIHRoZSBldmVudCB3aWxsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgcmV0dXJuZWQKLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IE9idGFpbnMgYW5kIHJldHVybnMgdGhlIGN1cnJlbnQgc3RhdHVzIG9mIHRoZSBldmVudAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1hY3BpX3N0YXR1cyBhY3BpX2dldF9ldmVudF9zdGF0dXModTMyIGV2ZW50LCBhY3BpX2V2ZW50X3N0YXR1cyAqIGV2ZW50X3N0YXR1cykKLXsKLQlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKLQl1MzIgdmFsdWU7Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGFjcGlfZ2V0X2V2ZW50X3N0YXR1cyk7Ci0KLQlpZiAoIWV2ZW50X3N0YXR1cykgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX1BBUkFNRVRFUik7Ci0JfQotCi0JLyogRGVjb2RlIHRoZSBGaXhlZCBFdmVudCAqLwotCi0JaWYgKGV2ZW50ID4gQUNQSV9FVkVOVF9NQVgpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9QQVJBTUVURVIpOwotCX0KLQotCS8qIEdldCB0aGUgc3RhdHVzIG9mIHRoZSByZXF1ZXN0ZWQgZml4ZWQgZXZlbnQgKi8KLQotCXN0YXR1cyA9Ci0JICAgIGFjcGlfZ2V0X3JlZ2lzdGVyKGFjcGlfZ2JsX2ZpeGVkX2V2ZW50X2luZm9bZXZlbnRdLgotCQkJICAgICAgZW5hYmxlX3JlZ2lzdGVyX2lkLCAmdmFsdWUpOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkKLQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci0KLQkqZXZlbnRfc3RhdHVzID0gdmFsdWU7Ci0KLQlzdGF0dXMgPQotCSAgICBhY3BpX2dldF9yZWdpc3RlcihhY3BpX2dibF9maXhlZF9ldmVudF9pbmZvW2V2ZW50XS4KLQkJCSAgICAgIHN0YXR1c19yZWdpc3Rlcl9pZCwgJnZhbHVlKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpCi0JCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotCi0JaWYgKHZhbHVlKQotCQkqZXZlbnRfc3RhdHVzIHw9IEFDUElfRVZFTlRfRkxBR19TRVQ7Ci0KLQlpZiAoYWNwaV9nYmxfZml4ZWRfZXZlbnRfaGFuZGxlcnNbZXZlbnRdLmhhbmRsZXIpCi0JCSpldmVudF9zdGF0dXMgfD0gQUNQSV9FVkVOVF9GTEFHX0hBTkRMRTsKLQotCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotfQotCi1BQ1BJX0VYUE9SVF9TWU1CT0woYWNwaV9nZXRfZXZlbnRfc3RhdHVzKQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX2dldF9ncGVfc3RhdHVzCi0gKgotICogUEFSQU1FVEVSUzogIGdwZV9kZXZpY2UgICAgICAtIFBhcmVudCBHUEUgRGV2aWNlCi0gKiAgICAgICAgICAgICAgZ3BlX251bWJlciAgICAgIC0gR1BFIGxldmVsIHdpdGhpbiB0aGUgR1BFIGJsb2NrCi0gKiAgICAgICAgICAgICAgRmxhZ3MgICAgICAgICAgIC0gQ2FsbGVkIGZyb20gYW4gSVNSIG9yIG5vdAotICogICAgICAgICAgICAgIGV2ZW50X3N0YXR1cyAgICAtIFdoZXJlIHRoZSBjdXJyZW50IHN0YXR1cyBvZiB0aGUgZXZlbnQgd2lsbAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIHJldHVybmVkCi0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cwotICoKLSAqIERFU0NSSVBUSU9OOiBHZXQgc3RhdHVzIG9mIGFuIGV2ZW50IChnZW5lcmFsIHB1cnBvc2UpCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWFjcGlfc3RhdHVzCi1hY3BpX2dldF9ncGVfc3RhdHVzKGFjcGlfaGFuZGxlIGdwZV9kZXZpY2UsCi0JCSAgICB1MzIgZ3BlX251bWJlciwgdTMyIGZsYWdzLCBhY3BpX2V2ZW50X3N0YXR1cyAqIGV2ZW50X3N0YXR1cykKLXsKLQlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKLQlzdHJ1Y3QgYWNwaV9ncGVfZXZlbnRfaW5mbyAqZ3BlX2V2ZW50X2luZm87Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGFjcGlfZ2V0X2dwZV9zdGF0dXMpOwotCi0JLyogVXNlIHNlbWFwaG9yZSBsb2NrIGlmIG5vdCBleGVjdXRpbmcgYXQgaW50ZXJydXB0IGxldmVsICovCi0KLQlpZiAoZmxhZ3MgJiBBQ1BJX05PVF9JU1IpIHsKLQkJc3RhdHVzID0gYWNwaV91dF9hY3F1aXJlX211dGV4KEFDUElfTVRYX0VWRU5UUyk7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci0JCX0KLQl9Ci0KLQkvKiBFbnN1cmUgdGhhdCB3ZSBoYXZlIGEgdmFsaWQgR1BFIG51bWJlciAqLwotCi0JZ3BlX2V2ZW50X2luZm8gPSBhY3BpX2V2X2dldF9ncGVfZXZlbnRfaW5mbyhncGVfZGV2aWNlLCBncGVfbnVtYmVyKTsKLQlpZiAoIWdwZV9ldmVudF9pbmZvKSB7Ci0JCXN0YXR1cyA9IEFFX0JBRF9QQVJBTUVURVI7Ci0JCWdvdG8gdW5sb2NrX2FuZF9leGl0OwotCX0KLQotCS8qIE9idGFpbiBzdGF0dXMgb24gdGhlIHJlcXVlc3RlZCBHUEUgbnVtYmVyICovCi0KLQlzdGF0dXMgPSBhY3BpX2h3X2dldF9ncGVfc3RhdHVzKGdwZV9ldmVudF9pbmZvLCBldmVudF9zdGF0dXMpOwotCi0JaWYgKGdwZV9ldmVudF9pbmZvLT5mbGFncyAmIEFDUElfR1BFX0RJU1BBVENIX01BU0spCi0JCSpldmVudF9zdGF0dXMgfD0gQUNQSV9FVkVOVF9GTEFHX0hBTkRMRTsKLQotICAgICAgdW5sb2NrX2FuZF9leGl0OgotCWlmIChmbGFncyAmIEFDUElfTk9UX0lTUikgewotCQkodm9pZClhY3BpX3V0X3JlbGVhc2VfbXV0ZXgoQUNQSV9NVFhfRVZFTlRTKTsKLQl9Ci0JcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci19Ci0KLUFDUElfRVhQT1JUX1NZTUJPTChhY3BpX2dldF9ncGVfc3RhdHVzKQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9pbnN0YWxsX2dwZV9ibG9jawotICoKLSAqIFBBUkFNRVRFUlM6ICBncGVfZGV2aWNlICAgICAgICAgIC0gSGFuZGxlIHRvIHRoZSBwYXJlbnQgR1BFIEJsb2NrIERldmljZQotICogICAgICAgICAgICAgIGdwZV9ibG9ja19hZGRyZXNzICAgLSBBZGRyZXNzIGFuZCBzcGFjZV9pRAotICogICAgICAgICAgICAgIHJlZ2lzdGVyX2NvdW50ICAgICAgLSBOdW1iZXIgb2YgR1BFIHJlZ2lzdGVyIHBhaXJzIGluIHRoZSBibG9jawotICogICAgICAgICAgICAgIGludGVycnVwdF9udW1iZXIgICAgLSBIL1cgaW50ZXJydXB0IGZvciB0aGUgYmxvY2sKLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IENyZWF0ZSBhbmQgSW5zdGFsbCBhIGJsb2NrIG9mIEdQRSByZWdpc3RlcnMKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYWNwaV9zdGF0dXMKLWFjcGlfaW5zdGFsbF9ncGVfYmxvY2soYWNwaV9oYW5kbGUgZ3BlX2RldmljZSwKLQkJICAgICAgIHN0cnVjdCBhY3BpX2dlbmVyaWNfYWRkcmVzcyAqZ3BlX2Jsb2NrX2FkZHJlc3MsCi0JCSAgICAgICB1MzIgcmVnaXN0ZXJfY291bnQsIHUzMiBpbnRlcnJ1cHRfbnVtYmVyKQotewotCWFjcGlfc3RhdHVzIHN0YXR1czsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYzsKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZTsKLQlzdHJ1Y3QgYWNwaV9ncGVfYmxvY2tfaW5mbyAqZ3BlX2Jsb2NrOwotCi0JQUNQSV9GVU5DVElPTl9UUkFDRShhY3BpX2luc3RhbGxfZ3BlX2Jsb2NrKTsKLQotCWlmICgoIWdwZV9kZXZpY2UpIHx8ICghZ3BlX2Jsb2NrX2FkZHJlc3MpIHx8ICghcmVnaXN0ZXJfY291bnQpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfUEFSQU1FVEVSKTsKLQl9Ci0KLQlzdGF0dXMgPSBhY3BpX3V0X2FjcXVpcmVfbXV0ZXgoQUNQSV9NVFhfTkFNRVNQQUNFKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJcmV0dXJuIChzdGF0dXMpOwotCX0KLQotCW5vZGUgPSBhY3BpX25zX21hcF9oYW5kbGVfdG9fbm9kZShncGVfZGV2aWNlKTsKLQlpZiAoIW5vZGUpIHsKLQkJc3RhdHVzID0gQUVfQkFEX1BBUkFNRVRFUjsKLQkJZ290byB1bmxvY2tfYW5kX2V4aXQ7Ci0JfQotCi0JLyoKLQkgKiBGb3IgdXNlci1pbnN0YWxsZWQgR1BFIEJsb2NrIERldmljZXMsIHRoZSBncGVfYmxvY2tfYmFzZV9udW1iZXIKLQkgKiBpcyBhbHdheXMgemVybwotCSAqLwotCXN0YXR1cyA9Ci0JICAgIGFjcGlfZXZfY3JlYXRlX2dwZV9ibG9jayhub2RlLCBncGVfYmxvY2tfYWRkcmVzcywgcmVnaXN0ZXJfY291bnQsIDAsCi0JCQkJICAgICBpbnRlcnJ1cHRfbnVtYmVyLCAmZ3BlX2Jsb2NrKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJZ290byB1bmxvY2tfYW5kX2V4aXQ7Ci0JfQotCi0JLyogUnVuIHRoZSBfUFJXIG1ldGhvZHMgYW5kIGVuYWJsZSB0aGUgR1BFcyAqLwotCi0Jc3RhdHVzID0gYWNwaV9ldl9pbml0aWFsaXplX2dwZV9ibG9jayhub2RlLCBncGVfYmxvY2spOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlnb3RvIHVubG9ja19hbmRfZXhpdDsKLQl9Ci0KLQkvKiBHZXQgdGhlIGRldmljZV9vYmplY3QgYXR0YWNoZWQgdG8gdGhlIG5vZGUgKi8KLQotCW9ial9kZXNjID0gYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0KG5vZGUpOwotCWlmICghb2JqX2Rlc2MpIHsKLQotCQkvKiBObyBvYmplY3QsIGNyZWF0ZSBhIG5ldyBvbmUgKi8KLQotCQlvYmpfZGVzYyA9IGFjcGlfdXRfY3JlYXRlX2ludGVybmFsX29iamVjdChBQ1BJX1RZUEVfREVWSUNFKTsKLQkJaWYgKCFvYmpfZGVzYykgewotCQkJc3RhdHVzID0gQUVfTk9fTUVNT1JZOwotCQkJZ290byB1bmxvY2tfYW5kX2V4aXQ7Ci0JCX0KLQotCQlzdGF0dXMgPQotCQkgICAgYWNwaV9uc19hdHRhY2hfb2JqZWN0KG5vZGUsIG9ial9kZXNjLCBBQ1BJX1RZUEVfREVWSUNFKTsKLQotCQkvKiBSZW1vdmUgbG9jYWwgcmVmZXJlbmNlIHRvIHRoZSBvYmplY3QgKi8KLQotCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2Uob2JqX2Rlc2MpOwotCi0JCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQkJZ290byB1bmxvY2tfYW5kX2V4aXQ7Ci0JCX0KLQl9Ci0KLQkvKiBJbnN0YWxsIHRoZSBHUEUgYmxvY2sgaW4gdGhlIGRldmljZV9vYmplY3QgKi8KLQotCW9ial9kZXNjLT5kZXZpY2UuZ3BlX2Jsb2NrID0gZ3BlX2Jsb2NrOwotCi0gICAgICB1bmxvY2tfYW5kX2V4aXQ6Ci0JKHZvaWQpYWNwaV91dF9yZWxlYXNlX211dGV4KEFDUElfTVRYX05BTUVTUEFDRSk7Ci0JcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci19Ci0KLUFDUElfRVhQT1JUX1NZTUJPTChhY3BpX2luc3RhbGxfZ3BlX2Jsb2NrKQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX3JlbW92ZV9ncGVfYmxvY2sKLSAqCi0gKiBQQVJBTUVURVJTOiAgZ3BlX2RldmljZSAgICAgICAgICAtIEhhbmRsZSB0byB0aGUgcGFyZW50IEdQRSBCbG9jayBEZXZpY2UKLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IFJlbW92ZSBhIHByZXZpb3VzbHkgaW5zdGFsbGVkIGJsb2NrIG9mIEdQRSByZWdpc3RlcnMKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYWNwaV9zdGF0dXMgYWNwaV9yZW1vdmVfZ3BlX2Jsb2NrKGFjcGlfaGFuZGxlIGdwZV9kZXZpY2UpCi17Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2M7Ci0JYWNwaV9zdGF0dXMgc3RhdHVzOwotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlOwotCi0JQUNQSV9GVU5DVElPTl9UUkFDRShhY3BpX3JlbW92ZV9ncGVfYmxvY2spOwotCi0JaWYgKCFncGVfZGV2aWNlKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfUEFSQU1FVEVSKTsKLQl9Ci0KLQlzdGF0dXMgPSBhY3BpX3V0X2FjcXVpcmVfbXV0ZXgoQUNQSV9NVFhfTkFNRVNQQUNFKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJcmV0dXJuIChzdGF0dXMpOwotCX0KLQotCW5vZGUgPSBhY3BpX25zX21hcF9oYW5kbGVfdG9fbm9kZShncGVfZGV2aWNlKTsKLQlpZiAoIW5vZGUpIHsKLQkJc3RhdHVzID0gQUVfQkFEX1BBUkFNRVRFUjsKLQkJZ290byB1bmxvY2tfYW5kX2V4aXQ7Ci0JfQotCi0JLyogR2V0IHRoZSBkZXZpY2Vfb2JqZWN0IGF0dGFjaGVkIHRvIHRoZSBub2RlICovCi0KLQlvYmpfZGVzYyA9IGFjcGlfbnNfZ2V0X2F0dGFjaGVkX29iamVjdChub2RlKTsKLQlpZiAoIW9ial9kZXNjIHx8ICFvYmpfZGVzYy0+ZGV2aWNlLmdwZV9ibG9jaykgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTlVMTF9PQkpFQ1QpOwotCX0KLQotCS8qIERlbGV0ZSB0aGUgR1BFIGJsb2NrIChidXQgbm90IHRoZSBkZXZpY2Vfb2JqZWN0KSAqLwotCi0Jc3RhdHVzID0gYWNwaV9ldl9kZWxldGVfZ3BlX2Jsb2NrKG9ial9kZXNjLT5kZXZpY2UuZ3BlX2Jsb2NrKTsKLQlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpIHsKLQkJb2JqX2Rlc2MtPmRldmljZS5ncGVfYmxvY2sgPSBOVUxMOwotCX0KLQotICAgICAgdW5sb2NrX2FuZF9leGl0OgotCSh2b2lkKWFjcGlfdXRfcmVsZWFzZV9tdXRleChBQ1BJX01UWF9OQU1FU1BBQ0UpOwotCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotfQotCi1BQ1BJX0VYUE9SVF9TWU1CT0woYWNwaV9yZW1vdmVfZ3BlX2Jsb2NrKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2V2ZW50cy9ldnhmcmVnbi5jIGIvZHJpdmVycy9hY3BpL2V2ZW50cy9ldnhmcmVnbi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODc1MDgwLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvYWNwaS9ldmVudHMvZXZ4ZnJlZ24uYworKysgL2Rldi9udWxsCkBAIC0xLDI1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogTW9kdWxlIE5hbWU6IGV2eGZyZWduIC0gRXh0ZXJuYWwgSW50ZXJmYWNlcywgQUNQSSBPcGVyYXRpb24gUmVnaW9ucyBhbmQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgIEFkZHJlc3MgU3BhY2VzLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDgsIEludGVsIENvcnAuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCi0gKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSBhdCBtaW5pbXVtIGEgZGlzY2xhaW1lcgotICogICAgc3Vic3RhbnRpYWxseSBzaW1pbGFyIHRvIHRoZSAiTk8gV0FSUkFOVFkiIGRpc2NsYWltZXIgYmVsb3cKLSAqICAgICgiRGlzY2xhaW1lciIpIGFuZCBhbnkgcmVkaXN0cmlidXRpb24gbXVzdCBiZSBjb25kaXRpb25lZCB1cG9uCi0gKiAgICBpbmNsdWRpbmcgYSBzdWJzdGFudGlhbGx5IHNpbWlsYXIgRGlzY2xhaW1lciByZXF1aXJlbWVudCBmb3IgZnVydGhlcgotICogICAgYmluYXJ5IHJlZGlzdHJpYnV0aW9uLgotICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzCi0gKiAgICBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIE5PIFdBUlJBTlRZCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKLSAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCi0gKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORwotICogSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCi0gKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCi0gKi8KLQotI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgotI2luY2x1ZGUgPGFjcGkvYWNuYW1lc3AuaD4KLSNpbmNsdWRlIDxhY3BpL2FjZXZlbnRzLmg+Ci0KLSNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX0VWRU5UUwotQUNQSV9NT0RVTEVfTkFNRSgiZXZ4ZnJlZ24iKQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX2luc3RhbGxfYWRkcmVzc19zcGFjZV9oYW5kbGVyCi0gKgotICogUEFSQU1FVEVSUzogIERldmljZSAgICAgICAgICAtIEhhbmRsZSBmb3IgdGhlIGRldmljZQotICogICAgICAgICAgICAgIHNwYWNlX2lkICAgICAgICAtIFRoZSBhZGRyZXNzIHNwYWNlIElECi0gKiAgICAgICAgICAgICAgSGFuZGxlciAgICAgICAgIC0gQWRkcmVzcyBvZiB0aGUgaGFuZGxlcgotICogICAgICAgICAgICAgIFNldHVwICAgICAgICAgICAtIEFkZHJlc3Mgb2YgdGhlIHNldHVwIGZ1bmN0aW9uCi0gKiAgICAgICAgICAgICAgQ29udGV4dCAgICAgICAgIC0gVmFsdWUgcGFzc2VkIHRvIHRoZSBoYW5kbGVyIG9uIGVhY2ggYWNjZXNzCi0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cwotICoKLSAqIERFU0NSSVBUSU9OOiBJbnN0YWxsIGEgaGFuZGxlciBmb3IgYWxsIG9wX3JlZ2lvbnMgb2YgYSBnaXZlbiBzcGFjZV9pZC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYWNwaV9zdGF0dXMKLWFjcGlfaW5zdGFsbF9hZGRyZXNzX3NwYWNlX2hhbmRsZXIoYWNwaV9oYW5kbGUgZGV2aWNlLAotCQkJCSAgIGFjcGlfYWRyX3NwYWNlX3R5cGUgc3BhY2VfaWQsCi0JCQkJICAgYWNwaV9hZHJfc3BhY2VfaGFuZGxlciBoYW5kbGVyLAotCQkJCSAgIGFjcGlfYWRyX3NwYWNlX3NldHVwIHNldHVwLCB2b2lkICpjb250ZXh0KQotewotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlOwotCWFjcGlfc3RhdHVzIHN0YXR1czsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UoYWNwaV9pbnN0YWxsX2FkZHJlc3Nfc3BhY2VfaGFuZGxlcik7Ci0KLQkvKiBQYXJhbWV0ZXIgdmFsaWRhdGlvbiAqLwotCi0JaWYgKCFkZXZpY2UpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9QQVJBTUVURVIpOwotCX0KLQotCXN0YXR1cyA9IGFjcGlfdXRfYWNxdWlyZV9tdXRleChBQ1BJX01UWF9OQU1FU1BBQ0UpOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLQl9Ci0KLQkvKiBDb252ZXJ0IGFuZCB2YWxpZGF0ZSB0aGUgZGV2aWNlIGhhbmRsZSAqLwotCi0Jbm9kZSA9IGFjcGlfbnNfbWFwX2hhbmRsZV90b19ub2RlKGRldmljZSk7Ci0JaWYgKCFub2RlKSB7Ci0JCXN0YXR1cyA9IEFFX0JBRF9QQVJBTUVURVI7Ci0JCWdvdG8gdW5sb2NrX2FuZF9leGl0OwotCX0KLQotCS8qIEluc3RhbGwgdGhlIGhhbmRsZXIgZm9yIGFsbCBSZWdpb25zIGZvciB0aGlzIFNwYWNlIElEICovCi0KLQlzdGF0dXMgPQotCSAgICBhY3BpX2V2X2luc3RhbGxfc3BhY2VfaGFuZGxlcihub2RlLCBzcGFjZV9pZCwgaGFuZGxlciwgc2V0dXAsCi0JCQkJCSAgY29udGV4dCk7Ci0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCWdvdG8gdW5sb2NrX2FuZF9leGl0OwotCX0KLQotCS8qIFJ1biBhbGwgX1JFRyBtZXRob2RzIGZvciB0aGlzIGFkZHJlc3Mgc3BhY2UgKi8KLQotCXN0YXR1cyA9IGFjcGlfZXZfZXhlY3V0ZV9yZWdfbWV0aG9kcyhub2RlLCBzcGFjZV9pZCk7Ci0KLSAgICAgIHVubG9ja19hbmRfZXhpdDoKLQkodm9pZClhY3BpX3V0X3JlbGVhc2VfbXV0ZXgoQUNQSV9NVFhfTkFNRVNQQUNFKTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLX0KLQotQUNQSV9FWFBPUlRfU1lNQk9MKGFjcGlfaW5zdGFsbF9hZGRyZXNzX3NwYWNlX2hhbmRsZXIpCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfcmVtb3ZlX2FkZHJlc3Nfc3BhY2VfaGFuZGxlcgotICoKLSAqIFBBUkFNRVRFUlM6ICBEZXZpY2UgICAgICAgICAgLSBIYW5kbGUgZm9yIHRoZSBkZXZpY2UKLSAqICAgICAgICAgICAgICBzcGFjZV9pZCAgICAgICAgLSBUaGUgYWRkcmVzcyBzcGFjZSBJRAotICogICAgICAgICAgICAgIEhhbmRsZXIgICAgICAgICAtIEFkZHJlc3Mgb2YgdGhlIGhhbmRsZXIKLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IFJlbW92ZSBhIHByZXZpb3VzbHkgaW5zdGFsbGVkIGhhbmRsZXIuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWFjcGlfc3RhdHVzCi1hY3BpX3JlbW92ZV9hZGRyZXNzX3NwYWNlX2hhbmRsZXIoYWNwaV9oYW5kbGUgZGV2aWNlLAotCQkJCSAgYWNwaV9hZHJfc3BhY2VfdHlwZSBzcGFjZV9pZCwKLQkJCQkgIGFjcGlfYWRyX3NwYWNlX2hhbmRsZXIgaGFuZGxlcikKLXsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYzsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpoYW5kbGVyX29iajsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpyZWdpb25fb2JqOwotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKipsYXN0X29ial9wdHI7Ci0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGU7Ci0JYWNwaV9zdGF0dXMgc3RhdHVzOwotCi0JQUNQSV9GVU5DVElPTl9UUkFDRShhY3BpX3JlbW92ZV9hZGRyZXNzX3NwYWNlX2hhbmRsZXIpOwotCi0JLyogUGFyYW1ldGVyIHZhbGlkYXRpb24gKi8KLQotCWlmICghZGV2aWNlKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfUEFSQU1FVEVSKTsKLQl9Ci0KLQlzdGF0dXMgPSBhY3BpX3V0X2FjcXVpcmVfbXV0ZXgoQUNQSV9NVFhfTkFNRVNQQUNFKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci0JfQotCi0JLyogQ29udmVydCBhbmQgdmFsaWRhdGUgdGhlIGRldmljZSBoYW5kbGUgKi8KLQotCW5vZGUgPSBhY3BpX25zX21hcF9oYW5kbGVfdG9fbm9kZShkZXZpY2UpOwotCWlmICghbm9kZSB8fAotCSAgICAoKG5vZGUtPnR5cGUgIT0gQUNQSV9UWVBFX0RFVklDRSkgJiYKLQkgICAgIChub2RlLT50eXBlICE9IEFDUElfVFlQRV9QUk9DRVNTT1IpICYmCi0JICAgICAobm9kZS0+dHlwZSAhPSBBQ1BJX1RZUEVfVEhFUk1BTCkgJiYKLQkgICAgIChub2RlICE9IGFjcGlfZ2JsX3Jvb3Rfbm9kZSkpKSB7Ci0JCXN0YXR1cyA9IEFFX0JBRF9QQVJBTUVURVI7Ci0JCWdvdG8gdW5sb2NrX2FuZF9leGl0OwotCX0KLQotCS8qIE1ha2Ugc3VyZSB0aGUgaW50ZXJuYWwgb2JqZWN0IGV4aXN0cyAqLwotCi0Jb2JqX2Rlc2MgPSBhY3BpX25zX2dldF9hdHRhY2hlZF9vYmplY3Qobm9kZSk7Ci0JaWYgKCFvYmpfZGVzYykgewotCQlzdGF0dXMgPSBBRV9OT1RfRVhJU1Q7Ci0JCWdvdG8gdW5sb2NrX2FuZF9leGl0OwotCX0KLQotCS8qIEZpbmQgdGhlIGFkZHJlc3MgaGFuZGxlciB0aGUgdXNlciByZXF1ZXN0ZWQgKi8KLQotCWhhbmRsZXJfb2JqID0gb2JqX2Rlc2MtPmRldmljZS5oYW5kbGVyOwotCWxhc3Rfb2JqX3B0ciA9ICZvYmpfZGVzYy0+ZGV2aWNlLmhhbmRsZXI7Ci0Jd2hpbGUgKGhhbmRsZXJfb2JqKSB7Ci0KLQkJLyogV2UgaGF2ZSBhIGhhbmRsZXIsIHNlZSBpZiB1c2VyIHJlcXVlc3RlZCB0aGlzIG9uZSAqLwotCi0JCWlmIChoYW5kbGVyX29iai0+YWRkcmVzc19zcGFjZS5zcGFjZV9pZCA9PSBzcGFjZV9pZCkgewotCi0JCQkvKiBIYW5kbGVyIG11c3QgYmUgdGhlIHNhbWUgYXMgdGhlIGluc3RhbGxlZCBoYW5kbGVyICovCi0KLQkJCWlmIChoYW5kbGVyX29iai0+YWRkcmVzc19zcGFjZS5oYW5kbGVyICE9IGhhbmRsZXIpIHsKLQkJCQlzdGF0dXMgPSBBRV9CQURfUEFSQU1FVEVSOwotCQkJCWdvdG8gdW5sb2NrX2FuZF9leGl0OwotCQkJfQotCi0JCQkvKiBNYXRjaGVkIHNwYWNlX2lkLCBmaXJzdCBkZXJlZmVyZW5jZSB0aGlzIGluIHRoZSBSZWdpb25zICovCi0KLQkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfT1BSRUdJT04sCi0JCQkJCSAgIlJlbW92aW5nIGFkZHJlc3MgaGFuZGxlciAlcCglcCkgZm9yIHJlZ2lvbiAlcyBvbiBEZXZpY2UgJXAoJXApXG4iLAotCQkJCQkgIGhhbmRsZXJfb2JqLCBoYW5kbGVyLAotCQkJCQkgIGFjcGlfdXRfZ2V0X3JlZ2lvbl9uYW1lKHNwYWNlX2lkKSwKLQkJCQkJICBub2RlLCBvYmpfZGVzYykpOwotCi0JCQlyZWdpb25fb2JqID0gaGFuZGxlcl9vYmotPmFkZHJlc3Nfc3BhY2UucmVnaW9uX2xpc3Q7Ci0KLQkJCS8qIFdhbGsgdGhlIGhhbmRsZXIncyByZWdpb24gbGlzdCAqLwotCi0JCQl3aGlsZSAocmVnaW9uX29iaikgewotCQkJCS8qCi0JCQkJICogRmlyc3QgZGlzYXNzb2NpYXRlIHRoZSBoYW5kbGVyIGZyb20gdGhlIHJlZ2lvbi4KLQkJCQkgKgotCQkJCSAqIE5PVEU6IHRoaXMgZG9lc24ndCBtZWFuIHRoYXQgdGhlIHJlZ2lvbiBnb2VzIGF3YXkKLQkJCQkgKiBUaGUgcmVnaW9uIGlzIGp1c3QgaW5hY2Nlc3NpYmxlIGFzIGluZGljYXRlZCB0bwotCQkJCSAqIHRoZSBfUkVHIG1ldGhvZAotCQkJCSAqLwotCQkJCWFjcGlfZXZfZGV0YWNoX3JlZ2lvbihyZWdpb25fb2JqLCBUUlVFKTsKLQotCQkJCS8qCi0JCQkJICogV2FsayB0aGUgbGlzdDogSnVzdCBncmFiIHRoZSBoZWFkIGJlY2F1c2UgdGhlCi0JCQkJICogZGV0YWNoX3JlZ2lvbiByZW1vdmVkIHRoZSBwcmV2aW91cyBoZWFkLgotCQkJCSAqLwotCQkJCXJlZ2lvbl9vYmogPQotCQkJCSAgICBoYW5kbGVyX29iai0+YWRkcmVzc19zcGFjZS5yZWdpb25fbGlzdDsKLQotCQkJfQotCi0JCQkvKiBSZW1vdmUgdGhpcyBIYW5kbGVyIG9iamVjdCBmcm9tIHRoZSBsaXN0ICovCi0KLQkJCSpsYXN0X29ial9wdHIgPSBoYW5kbGVyX29iai0+YWRkcmVzc19zcGFjZS5uZXh0OwotCi0JCQkvKiBOb3cgd2UgY2FuIGRlbGV0ZSB0aGUgaGFuZGxlciBvYmplY3QgKi8KLQotCQkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKGhhbmRsZXJfb2JqKTsKLQkJCWdvdG8gdW5sb2NrX2FuZF9leGl0OwotCQl9Ci0KLQkJLyogV2FsayB0aGUgbGlua2VkIGxpc3Qgb2YgaGFuZGxlcnMgKi8KLQotCQlsYXN0X29ial9wdHIgPSAmaGFuZGxlcl9vYmotPmFkZHJlc3Nfc3BhY2UubmV4dDsKLQkJaGFuZGxlcl9vYmogPSBoYW5kbGVyX29iai0+YWRkcmVzc19zcGFjZS5uZXh0OwotCX0KLQotCS8qIFRoZSBoYW5kbGVyIGRvZXMgbm90IGV4aXN0ICovCi0KLQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX09QUkVHSU9OLAotCQkJICAiVW5hYmxlIHRvIHJlbW92ZSBhZGRyZXNzIGhhbmRsZXIgJXAgZm9yICVzKCVYKSwgRGV2Tm9kZSAlcCwgb2JqICVwXG4iLAotCQkJICBoYW5kbGVyLCBhY3BpX3V0X2dldF9yZWdpb25fbmFtZShzcGFjZV9pZCksIHNwYWNlX2lkLAotCQkJICBub2RlLCBvYmpfZGVzYykpOwotCi0Jc3RhdHVzID0gQUVfTk9UX0VYSVNUOwotCi0gICAgICB1bmxvY2tfYW5kX2V4aXQ6Ci0JKHZvaWQpYWNwaV91dF9yZWxlYXNlX211dGV4KEFDUElfTVRYX05BTUVTUEFDRSk7Ci0JcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci19Ci0KLUFDUElfRVhQT1JUX1NZTUJPTChhY3BpX3JlbW92ZV9hZGRyZXNzX3NwYWNlX2hhbmRsZXIpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvTWFrZWZpbGUgYi9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvTWFrZWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwOTk5OGEuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL01ha2VmaWxlCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotIwotIyBNYWtlZmlsZSBmb3IgYWxsIExpbnV4IEFDUEkgaW50ZXJwcmV0ZXIgc3ViZGlyZWN0b3JpZXMKLSMKLQotb2JqLXkgOj0gZXhjb25maWcubyAgZXhmaWVsZC5vICBleG5hbWVzLm8gICBleG9wYXJnNi5vICBleHJlc29sdi5vICBleHN0b3JvYi5vXAotCSBleGNvbnZydC5vICBleGZsZGlvLm8gIGV4b3BhcmcxLm8gIGV4cHJlcC5vICAgIGV4cmVzb3AubyAgIGV4c3lzdGVtLm9cCi0JIGV4Y3JlYXRlLm8gIGV4bWlzYy5vICAgZXhvcGFyZzIubyAgZXhyZWdpb24ubyAgZXhzdG9yZS5vICAgZXh1dGlscy5vIFwKLQkgZXhkdW1wLm8gICAgZXhtdXRleC5vICBleG9wYXJnMy5vICBleHJlc250ZS5vICBleHN0b3Jlbi5vCi0KLUVYVFJBX0NGTEFHUyArPSAkKEFDUElfQ0ZMQUdTKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4Y29uZmlnLmMgYi9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhjb25maWcuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzRkYTZmYS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhjb25maWcuYworKysgL2Rldi9udWxsCkBAIC0xLDUzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogTW9kdWxlIE5hbWU6IGV4Y29uZmlnIC0gTmFtZXNwYWNlIHJlY29uZmlndXJhdGlvbiAoTG9hZC9VbmxvYWQgb3Bjb2RlcykKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA4LCBJbnRlbCBDb3JwLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAotICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgYXQgbWluaW11bSBhIGRpc2NsYWltZXIKLSAqICAgIHN1YnN0YW50aWFsbHkgc2ltaWxhciB0byB0aGUgIk5PIFdBUlJBTlRZIiBkaXNjbGFpbWVyIGJlbG93Ci0gKiAgICAoIkRpc2NsYWltZXIiKSBhbmQgYW55IHJlZGlzdHJpYnV0aW9uIG11c3QgYmUgY29uZGl0aW9uZWQgdXBvbgotICogICAgaW5jbHVkaW5nIGEgc3Vic3RhbnRpYWxseSBzaW1pbGFyIERpc2NsYWltZXIgcmVxdWlyZW1lbnQgZm9yIGZ1cnRoZXIKLSAqICAgIGJpbmFyeSByZWRpc3RyaWJ1dGlvbi4KLSAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcwotICogICAgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICogU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBOTyBXQVJSQU5UWQotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCi0gKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUwotICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcKLSAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQotICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgotICovCi0KLSNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KLSNpbmNsdWRlIDxhY3BpL2FjaW50ZXJwLmg+Ci0jaW5jbHVkZSA8YWNwaS9hY25hbWVzcC5oPgotI2luY2x1ZGUgPGFjcGkvYWN0YWJsZXMuaD4KLSNpbmNsdWRlIDxhY3BpL2FjZGlzcGF0Lmg+Ci0KLSNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX0VYRUNVVEVSCi1BQ1BJX01PRFVMRV9OQU1FKCJleGNvbmZpZyIpCi0KLS8qIExvY2FsIHByb3RvdHlwZXMgKi8KLXN0YXRpYyBhY3BpX3N0YXR1cwotYWNwaV9leF9hZGRfdGFibGUodTMyIHRhYmxlX2luZGV4LAotCQkgIHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpwYXJlbnRfbm9kZSwKLQkJICB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICoqZGRiX2hhbmRsZSk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfZXhfYWRkX3RhYmxlCi0gKgotICogUEFSQU1FVEVSUzogIFRhYmxlICAgICAgICAgICAgICAgLSBQb2ludGVyIHRvIHJhdyB0YWJsZQotICogICAgICAgICAgICAgIHBhcmVudF9ub2RlICAgICAgICAgLSBXaGVyZSB0byBsb2FkIHRoZSB0YWJsZSAoc2NvcGUpCi0gKiAgICAgICAgICAgICAgZGRiX2hhbmRsZSAgICAgICAgICAtIFdoZXJlIHRvIHJldHVybiB0aGUgdGFibGUgaGFuZGxlLgotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKLSAqCi0gKiBERVNDUklQVElPTjogQ29tbW9uIGZ1bmN0aW9uIHRvIEluc3RhbGwgYW5kIExvYWQgYW4gQUNQSSB0YWJsZSB3aXRoIGEKLSAqICAgICAgICAgICAgICByZXR1cm5lZCB0YWJsZSBoYW5kbGUuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIGFjcGlfc3RhdHVzCi1hY3BpX2V4X2FkZF90YWJsZSh1MzIgdGFibGVfaW5kZXgsCi0JCSAgc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKnBhcmVudF9ub2RlLAotCQkgIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKipkZGJfaGFuZGxlKQotewotCWFjcGlfc3RhdHVzIHN0YXR1czsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYzsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UoZXhfYWRkX3RhYmxlKTsKLQotCS8qIENyZWF0ZSBhbiBvYmplY3QgdG8gYmUgdGhlIHRhYmxlIGhhbmRsZSAqLwotCi0Jb2JqX2Rlc2MgPSBhY3BpX3V0X2NyZWF0ZV9pbnRlcm5hbF9vYmplY3QoQUNQSV9UWVBFX0xPQ0FMX1JFRkVSRU5DRSk7Ci0JaWYgKCFvYmpfZGVzYykgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9fTUVNT1JZKTsKLQl9Ci0KLQkvKiBJbml0IHRoZSB0YWJsZSBoYW5kbGUgKi8KLQotCW9ial9kZXNjLT5yZWZlcmVuY2UuY2xhc3MgPSBBQ1BJX1JFRkNMQVNTX1RBQkxFOwotCSpkZGJfaGFuZGxlID0gb2JqX2Rlc2M7Ci0KLQkvKiBJbnN0YWxsIHRoZSBuZXcgdGFibGUgaW50byB0aGUgbG9jYWwgZGF0YSBzdHJ1Y3R1cmVzICovCi0KLQlvYmpfZGVzYy0+cmVmZXJlbmNlLnZhbHVlID0gdGFibGVfaW5kZXg7Ci0KLQkvKiBBZGQgdGhlIHRhYmxlIHRvIHRoZSBuYW1lc3BhY2UgKi8KLQotCXN0YXR1cyA9IGFjcGlfbnNfbG9hZF90YWJsZSh0YWJsZV9pbmRleCwgcGFyZW50X25vZGUpOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2Uob2JqX2Rlc2MpOwotCQkqZGRiX2hhbmRsZSA9IE5VTEw7Ci0JfQotCi0JcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfZXhfbG9hZF90YWJsZV9vcAotICoKLSAqIFBBUkFNRVRFUlM6ICB3YWxrX3N0YXRlICAgICAgICAgIC0gQ3VycmVudCBzdGF0ZSB3aXRoIG9wZXJhbmRzCi0gKiAgICAgICAgICAgICAgcmV0dXJuX2Rlc2MgICAgICAgICAtIFdoZXJlIHRvIHN0b3JlIHRoZSByZXR1cm4gb2JqZWN0Ci0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cwotICoKLSAqIERFU0NSSVBUSU9OOiBMb2FkIGFuIEFDUEkgdGFibGUgZnJvbSB0aGUgUlNEVC9YU0RUCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotYWNwaV9zdGF0dXMKLWFjcGlfZXhfbG9hZF90YWJsZV9vcChzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlLAotCQkgICAgICB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICoqcmV0dXJuX2Rlc2MpCi17Ci0JYWNwaV9zdGF0dXMgc3RhdHVzOwotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKipvcGVyYW5kID0gJndhbGtfc3RhdGUtPm9wZXJhbmRzWzBdOwotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpwYXJlbnRfbm9kZTsKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqc3RhcnRfbm9kZTsKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqcGFyYW1ldGVyX25vZGUgPSBOVUxMOwotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKmRkYl9oYW5kbGU7Ci0Jc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICp0YWJsZTsKLQl1MzIgdGFibGVfaW5kZXg7Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGV4X2xvYWRfdGFibGVfb3ApOwotCi0JLyogVmFsaWRhdGUgbGVuZ3RocyBmb3IgdGhlIHNpZ25hdHVyZV9zdHJpbmcsIE9FTUlEU3RyaW5nLCBPRU10YWJsZV9pRCAqLwotCi0JaWYgKChvcGVyYW5kWzBdLT5zdHJpbmcubGVuZ3RoID4gQUNQSV9OQU1FX1NJWkUpIHx8Ci0JICAgIChvcGVyYW5kWzFdLT5zdHJpbmcubGVuZ3RoID4gQUNQSV9PRU1fSURfU0laRSkgfHwKLQkgICAgKG9wZXJhbmRbMl0tPnN0cmluZy5sZW5ndGggPiBBQ1BJX09FTV9UQUJMRV9JRF9TSVpFKSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX1BBUkFNRVRFUik7Ci0JfQotCi0JLyogRmluZCB0aGUgQUNQSSB0YWJsZSBpbiB0aGUgUlNEVC9YU0RUICovCi0KLQlzdGF0dXMgPSBhY3BpX3RiX2ZpbmRfdGFibGUob3BlcmFuZFswXS0+c3RyaW5nLnBvaW50ZXIsCi0JCQkJICAgIG9wZXJhbmRbMV0tPnN0cmluZy5wb2ludGVyLAotCQkJCSAgICBvcGVyYW5kWzJdLT5zdHJpbmcucG9pbnRlciwgJnRhYmxlX2luZGV4KTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJaWYgKHN0YXR1cyAhPSBBRV9OT1RfRk9VTkQpIHsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotCQl9Ci0KLQkJLyogVGFibGUgbm90IGZvdW5kLCByZXR1cm4gYW4gSW50ZWdlcj0wIGFuZCBBRV9PSyAqLwotCi0JCWRkYl9oYW5kbGUgPSBhY3BpX3V0X2NyZWF0ZV9pbnRlcm5hbF9vYmplY3QoQUNQSV9UWVBFX0lOVEVHRVIpOwotCQlpZiAoIWRkYl9oYW5kbGUpIHsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT19NRU1PUlkpOwotCQl9Ci0KLQkJZGRiX2hhbmRsZS0+aW50ZWdlci52YWx1ZSA9IDA7Ci0JCSpyZXR1cm5fZGVzYyA9IGRkYl9oYW5kbGU7Ci0KLQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKLQl9Ci0KLQkvKiBEZWZhdWx0IG5vZGVzICovCi0KLQlzdGFydF9ub2RlID0gd2Fsa19zdGF0ZS0+c2NvcGVfaW5mby0+c2NvcGUubm9kZTsKLQlwYXJlbnRfbm9kZSA9IGFjcGlfZ2JsX3Jvb3Rfbm9kZTsKLQotCS8qIHJvb3RfcGF0aCAob3B0aW9uYWwgcGFyYW1ldGVyKSAqLwotCi0JaWYgKG9wZXJhbmRbM10tPnN0cmluZy5sZW5ndGggPiAwKSB7Ci0JCS8qCi0JCSAqIEZpbmQgdGhlIG5vZGUgcmVmZXJlbmNlZCBieSB0aGUgcm9vdF9wYXRoX3N0cmluZy4gVGhpcyBpcyB0aGUKLQkJICogbG9jYXRpb24gd2l0aGluIHRoZSBuYW1lc3BhY2Ugd2hlcmUgdGhlIHRhYmxlIHdpbGwgYmUgbG9hZGVkLgotCQkgKi8KLQkJc3RhdHVzID0KLQkJICAgIGFjcGlfbnNfZ2V0X25vZGUoc3RhcnRfbm9kZSwgb3BlcmFuZFszXS0+c3RyaW5nLnBvaW50ZXIsCi0JCQkJICAgICBBQ1BJX05TX1NFQVJDSF9QQVJFTlQsICZwYXJlbnRfbm9kZSk7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci0JCX0KLQl9Ci0KLQkvKiBwYXJhbWV0ZXJfcGF0aCAob3B0aW9uYWwgcGFyYW1ldGVyKSAqLwotCi0JaWYgKG9wZXJhbmRbNF0tPnN0cmluZy5sZW5ndGggPiAwKSB7Ci0JCWlmICgob3BlcmFuZFs0XS0+c3RyaW5nLnBvaW50ZXJbMF0gIT0gJ1xcJykgJiYKLQkJICAgIChvcGVyYW5kWzRdLT5zdHJpbmcucG9pbnRlclswXSAhPSAnXicpKSB7Ci0JCQkvKgotCQkJICogUGF0aCBpcyBub3QgYWJzb2x1dGUsIHNvIGl0IHdpbGwgYmUgcmVsYXRpdmUgdG8gdGhlIG5vZGUKLQkJCSAqIHJlZmVyZW5jZWQgYnkgdGhlIHJvb3RfcGF0aF9zdHJpbmcgKG9yIHRoZSBOUyByb290IGlmIG9taXR0ZWQpCi0JCQkgKi8KLQkJCXN0YXJ0X25vZGUgPSBwYXJlbnRfbm9kZTsKLQkJfQotCi0JCS8qIEZpbmQgdGhlIG5vZGUgcmVmZXJlbmNlZCBieSB0aGUgcGFyYW1ldGVyX3BhdGhfc3RyaW5nICovCi0KLQkJc3RhdHVzID0KLQkJICAgIGFjcGlfbnNfZ2V0X25vZGUoc3RhcnRfbm9kZSwgb3BlcmFuZFs0XS0+c3RyaW5nLnBvaW50ZXIsCi0JCQkJICAgICBBQ1BJX05TX1NFQVJDSF9QQVJFTlQsICZwYXJhbWV0ZXJfbm9kZSk7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci0JCX0KLQl9Ci0KLQkvKiBMb2FkIHRoZSB0YWJsZSBpbnRvIHRoZSBuYW1lc3BhY2UgKi8KLQotCXN0YXR1cyA9IGFjcGlfZXhfYWRkX3RhYmxlKHRhYmxlX2luZGV4LCBwYXJlbnRfbm9kZSwgJmRkYl9oYW5kbGUpOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLQl9Ci0KLQkvKiBQYXJhbWV0ZXIgRGF0YSAob3B0aW9uYWwpICovCi0KLQlpZiAocGFyYW1ldGVyX25vZGUpIHsKLQotCQkvKiBTdG9yZSB0aGUgcGFyYW1ldGVyIGRhdGEgaW50byB0aGUgb3B0aW9uYWwgcGFyYW1ldGVyIG9iamVjdCAqLwotCi0JCXN0YXR1cyA9IGFjcGlfZXhfc3RvcmUob3BlcmFuZFs1XSwKLQkJCQkgICAgICAgQUNQSV9DQVNUX1BUUih1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0LAotCQkJCQkJICAgICBwYXJhbWV0ZXJfbm9kZSksCi0JCQkJICAgICAgIHdhbGtfc3RhdGUpOwotCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJCSh2b2lkKWFjcGlfZXhfdW5sb2FkX3RhYmxlKGRkYl9oYW5kbGUpOwotCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci0JCX0KLQl9Ci0KLQlzdGF0dXMgPSBhY3BpX2dldF90YWJsZV9ieV9pbmRleCh0YWJsZV9pbmRleCwgJnRhYmxlKTsKLQlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpIHsKLQkJQUNQSV9JTkZPKChBRV9JTkZPLAotCQkJICAgIkR5bmFtaWMgT0VNIFRhYmxlIExvYWQgLSBbJS40c10gT2VtSWQgWyUuNnNdIE9lbVRhYmxlSWQgWyUuOHNdIiwKLQkJCSAgIHRhYmxlLT5zaWduYXR1cmUsIHRhYmxlLT5vZW1faWQsCi0JCQkgICB0YWJsZS0+b2VtX3RhYmxlX2lkKSk7Ci0JfQotCi0JLyogSW52b2tlIHRhYmxlIGhhbmRsZXIgaWYgcHJlc2VudCAqLwotCi0JaWYgKGFjcGlfZ2JsX3RhYmxlX2hhbmRsZXIpIHsKLQkJKHZvaWQpYWNwaV9nYmxfdGFibGVfaGFuZGxlcihBQ1BJX1RBQkxFX0VWRU5UX0xPQUQsIHRhYmxlLAotCQkJCQkgICAgIGFjcGlfZ2JsX3RhYmxlX2hhbmRsZXJfY29udGV4dCk7Ci0JfQotCi0JKnJldHVybl9kZXNjID0gZGRiX2hhbmRsZTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9leF9sb2FkX29wCi0gKgotICogUEFSQU1FVEVSUzogIG9ial9kZXNjICAgICAgICAtIFJlZ2lvbiBvciBCdWZmZXIvRmllbGQgd2hlcmUgdGhlIHRhYmxlIHdpbGwgYmUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYnRhaW5lZAotICogICAgICAgICAgICAgIFRhcmdldCAgICAgICAgICAtIFdoZXJlIGEgaGFuZGxlIHRvIHRoZSB0YWJsZSB3aWxsIGJlIHN0b3JlZAotICogICAgICAgICAgICAgIHdhbGtfc3RhdGUgICAgICAtIEN1cnJlbnQgc3RhdGUKLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IExvYWQgYW4gQUNQSSB0YWJsZSBmcm9tIGEgZmllbGQgb3Igb3BlcmF0aW9uIHJlZ2lvbgotICoKLSAqIE5PVEU6IFJlZ2lvbiBGaWVsZHMgKEZpZWxkLCBiYW5rX2ZpZWxkLCBpbmRleF9maWVsZHMpIGFyZSByZXNvbHZlZCB0byBidWZmZXIKLSAqICAgICAgIG9iamVjdHMgYmVmb3JlIHRoaXMgY29kZSBpcyByZWFjaGVkLgotICoKLSAqICAgICAgIElmIHNvdXJjZSBpcyBhbiBvcGVyYXRpb24gcmVnaW9uLCBpdCBtdXN0IHJlZmVyIHRvIHN5c3RlbV9tZW1vcnksIGFzCi0gKiAgICAgICBwZXIgdGhlIEFDUEkgc3BlY2lmaWNhdGlvbi4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1hY3BpX3N0YXR1cwotYWNwaV9leF9sb2FkX29wKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjLAotCQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICp0YXJnZXQsCi0JCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUpCi17Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqZGRiX2hhbmRsZTsKLQlzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKnRhYmxlOwotCXN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgdGFibGVfZGVzYzsKLQl1MzIgdGFibGVfaW5kZXg7Ci0JYWNwaV9zdGF0dXMgc3RhdHVzOwotCXUzMiBsZW5ndGg7Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGV4X2xvYWRfb3ApOwotCi0JQUNQSV9NRU1TRVQoJnRhYmxlX2Rlc2MsIDAsIHNpemVvZihzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjKSk7Ci0KLQkvKiBTb3VyY2UgT2JqZWN0IGNhbiBiZSBlaXRoZXIgYW4gb3BfcmVnaW9uIG9yIGEgQnVmZmVyL0ZpZWxkICovCi0KLQlzd2l0Y2ggKEFDUElfR0VUX09CSkVDVF9UWVBFKG9ial9kZXNjKSkgewotCWNhc2UgQUNQSV9UWVBFX1JFR0lPTjoKLQotCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VYRUMsCi0JCQkJICAiTG9hZCB0YWJsZSBmcm9tIFJlZ2lvbiAlcFxuIiwgb2JqX2Rlc2MpKTsKLQotCQkvKiBSZWdpb24gbXVzdCBiZSBzeXN0ZW1fbWVtb3J5IChmcm9tIEFDUEkgc3BlYykgKi8KLQotCQlpZiAob2JqX2Rlc2MtPnJlZ2lvbi5zcGFjZV9pZCAhPSBBQ1BJX0FEUl9TUEFDRV9TWVNURU1fTUVNT1JZKSB7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX09QRVJBTkRfVFlQRSk7Ci0JCX0KLQotCQkvKgotCQkgKiBJZiB0aGUgUmVnaW9uIEFkZHJlc3MgYW5kIExlbmd0aCBoYXZlIG5vdCBiZWVuIHByZXZpb3VzbHkgZXZhbHVhdGVkLAotCQkgKiBldmFsdWF0ZSB0aGVtIG5vdyBhbmQgc2F2ZSB0aGUgcmVzdWx0cy4KLQkJICovCi0JCWlmICghKG9ial9kZXNjLT5jb21tb24uZmxhZ3MgJiBBT1BPQkpfREFUQV9WQUxJRCkpIHsKLQkJCXN0YXR1cyA9IGFjcGlfZHNfZ2V0X3JlZ2lvbl9hcmd1bWVudHMob2JqX2Rlc2MpOwotCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci0JCQl9Ci0JCX0KLQotCQkvKgotCQkgKiBNYXAgdGhlIHRhYmxlIGhlYWRlciBhbmQgZ2V0IHRoZSBhY3R1YWwgdGFibGUgbGVuZ3RoLiBUaGUgcmVnaW9uCi0JCSAqIGxlbmd0aCBpcyBub3QgZ3VhcmFudGVlZCB0byBiZSB0aGUgc2FtZSBhcyB0aGUgdGFibGUgbGVuZ3RoLgotCQkgKi8KLQkJdGFibGUgPSBhY3BpX29zX21hcF9tZW1vcnkob2JqX2Rlc2MtPnJlZ2lvbi5hZGRyZXNzLAotCQkJCQkgICBzaXplb2Yoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyKSk7Ci0JCWlmICghdGFibGUpIHsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT19NRU1PUlkpOwotCQl9Ci0KLQkJbGVuZ3RoID0gdGFibGUtPmxlbmd0aDsKLQkJYWNwaV9vc191bm1hcF9tZW1vcnkodGFibGUsIHNpemVvZihzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIpKTsKLQotCQkvKiBNdXN0IGhhdmUgYXQgbGVhc3QgYW4gQUNQSSB0YWJsZSBoZWFkZXIgKi8KLQotCQlpZiAobGVuZ3RoIDwgc2l6ZW9mKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlcikpIHsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9JTlZBTElEX1RBQkxFX0xFTkdUSCk7Ci0JCX0KLQotCQkvKgotCQkgKiBUaGUgbWVtb3J5IHJlZ2lvbiBpcyBub3QgZ3VhcmFudGVlZCB0byByZW1haW4gc3RhYmxlIGFuZCB3ZSBtdXN0Ci0JCSAqIGNvcHkgdGhlIHRhYmxlIHRvIGEgbG9jYWwgYnVmZmVyLiBGb3IgZXhhbXBsZSwgdGhlIG1lbW9yeSByZWdpb24KLQkJICogaXMgY29ycnVwdGVkIGFmdGVyIHN1c3BlbmQgb24gc29tZSBtYWNoaW5lcy4gRHluYW1pY2FsbHkgbG9hZGVkCi0JCSAqIHRhYmxlcyBhcmUgdXN1YWxseSBzbWFsbCwgc28gdGhpcyBvdmVyaGVhZCBpcyBtaW5pbWFsLgotCQkgKi8KLQotCQkvKiBBbGxvY2F0ZSBhIGJ1ZmZlciBmb3IgdGhlIHRhYmxlICovCi0KLQkJdGFibGVfZGVzYy5wb2ludGVyID0gQUNQSV9BTExPQ0FURShsZW5ndGgpOwotCQlpZiAoIXRhYmxlX2Rlc2MucG9pbnRlcikgewotCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX01FTU9SWSk7Ci0JCX0KLQotCQkvKiBNYXAgdGhlIGVudGlyZSB0YWJsZSBhbmQgY29weSBpdCAqLwotCi0JCXRhYmxlID0gYWNwaV9vc19tYXBfbWVtb3J5KG9ial9kZXNjLT5yZWdpb24uYWRkcmVzcywgbGVuZ3RoKTsKLQkJaWYgKCF0YWJsZSkgewotCQkJQUNQSV9GUkVFKHRhYmxlX2Rlc2MucG9pbnRlcik7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9fTUVNT1JZKTsKLQkJfQotCi0JCUFDUElfTUVNQ1BZKHRhYmxlX2Rlc2MucG9pbnRlciwgdGFibGUsIGxlbmd0aCk7Ci0JCWFjcGlfb3NfdW5tYXBfbWVtb3J5KHRhYmxlLCBsZW5ndGgpOwotCi0JCXRhYmxlX2Rlc2MuYWRkcmVzcyA9IG9ial9kZXNjLT5yZWdpb24uYWRkcmVzczsKLQkJYnJlYWs7Ci0KLQljYXNlIEFDUElfVFlQRV9CVUZGRVI6CS8qIEJ1ZmZlciBvciByZXNvbHZlZCByZWdpb25fZmllbGQgKi8KLQotCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VYRUMsCi0JCQkJICAiTG9hZCB0YWJsZSBmcm9tIEJ1ZmZlciBvciBGaWVsZCAlcFxuIiwKLQkJCQkgIG9ial9kZXNjKSk7Ci0KLQkJLyogTXVzdCBoYXZlIGF0IGxlYXN0IGFuIEFDUEkgdGFibGUgaGVhZGVyICovCi0KLQkJaWYgKG9ial9kZXNjLT5idWZmZXIubGVuZ3RoIDwgc2l6ZW9mKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlcikpIHsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9JTlZBTElEX1RBQkxFX0xFTkdUSCk7Ci0JCX0KLQotCQkvKiBHZXQgdGhlIGFjdHVhbCB0YWJsZSBsZW5ndGggZnJvbSB0aGUgdGFibGUgaGVhZGVyICovCi0KLQkJdGFibGUgPQotCQkgICAgQUNQSV9DQVNUX1BUUihzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIsCi0JCQkJICBvYmpfZGVzYy0+YnVmZmVyLnBvaW50ZXIpOwotCQlsZW5ndGggPSB0YWJsZS0+bGVuZ3RoOwotCi0JCS8qIFRhYmxlIGNhbm5vdCBleHRlbmQgYmV5b25kIHRoZSBidWZmZXIgKi8KLQotCQlpZiAobGVuZ3RoID4gb2JqX2Rlc2MtPmJ1ZmZlci5sZW5ndGgpIHsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfQlVGRkVSX0xJTUlUKTsKLQkJfQotCQlpZiAobGVuZ3RoIDwgc2l6ZW9mKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlcikpIHsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9JTlZBTElEX1RBQkxFX0xFTkdUSCk7Ci0JCX0KLQotCQkvKgotCQkgKiBDb3B5IHRoZSB0YWJsZSBmcm9tIHRoZSBidWZmZXIgYmVjYXVzZSB0aGUgYnVmZmVyIGNvdWxkIGJlIG1vZGlmaWVkCi0JCSAqIG9yIGV2ZW4gZGVsZXRlZCBpbiB0aGUgZnV0dXJlCi0JCSAqLwotCQl0YWJsZV9kZXNjLnBvaW50ZXIgPSBBQ1BJX0FMTE9DQVRFKGxlbmd0aCk7Ci0JCWlmICghdGFibGVfZGVzYy5wb2ludGVyKSB7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9fTUVNT1JZKTsKLQkJfQotCi0JCUFDUElfTUVNQ1BZKHRhYmxlX2Rlc2MucG9pbnRlciwgdGFibGUsIGxlbmd0aCk7Ci0JCXRhYmxlX2Rlc2MuYWRkcmVzcyA9IEFDUElfVE9fSU5URUdFUih0YWJsZV9kZXNjLnBvaW50ZXIpOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfT1BFUkFORF9UWVBFKTsKLQl9Ci0KLQkvKiBWYWxpZGF0ZSB0YWJsZSBjaGVja3N1bSAod2lsbCBub3QgZ2V0IHZhbGlkYXRlZCBpbiB0Yl9hZGRfdGFibGUpICovCi0KLQlzdGF0dXMgPSBhY3BpX3RiX3ZlcmlmeV9jaGVja3N1bSh0YWJsZV9kZXNjLnBvaW50ZXIsIGxlbmd0aCk7Ci0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCUFDUElfRlJFRSh0YWJsZV9kZXNjLnBvaW50ZXIpOwotCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLQl9Ci0KLQkvKiBDb21wbGV0ZSB0aGUgdGFibGUgZGVzY3JpcHRvciAqLwotCi0JdGFibGVfZGVzYy5sZW5ndGggPSBsZW5ndGg7Ci0JdGFibGVfZGVzYy5mbGFncyA9IEFDUElfVEFCTEVfT1JJR0lOX0FMTE9DQVRFRDsKLQotCS8qIEluc3RhbGwgdGhlIG5ldyB0YWJsZSBpbnRvIHRoZSBsb2NhbCBkYXRhIHN0cnVjdHVyZXMgKi8KLQotCXN0YXR1cyA9IGFjcGlfdGJfYWRkX3RhYmxlKCZ0YWJsZV9kZXNjLCAmdGFibGVfaW5kZXgpOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlnb3RvIGNsZWFudXA7Ci0JfQotCi0JLyoKLQkgKiBBZGQgdGhlIHRhYmxlIHRvIHRoZSBuYW1lc3BhY2UuCi0JICoKLQkgKiBOb3RlOiBMb2FkIHRoZSB0YWJsZSBvYmplY3RzIHJlbGF0aXZlIHRvIHRoZSByb290IG9mIHRoZSBuYW1lc3BhY2UuCi0JICogVGhpcyBhcHBlYXJzIHRvIGdvIGFnYWluc3QgdGhlIEFDUEkgc3BlY2lmaWNhdGlvbiwgYnV0IHdlIGRvIGl0IGZvcgotCSAqIGNvbXBhdGliaWxpdHkgd2l0aCBvdGhlciBBQ1BJIGltcGxlbWVudGF0aW9ucy4KLQkgKi8KLQlzdGF0dXMgPQotCSAgICBhY3BpX2V4X2FkZF90YWJsZSh0YWJsZV9pbmRleCwgYWNwaV9nYmxfcm9vdF9ub2RlLCAmZGRiX2hhbmRsZSk7Ci0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0KLQkJLyogT24gZXJyb3IsIHRhYmxlX3B0ciB3YXMgZGVhbGxvY2F0ZWQgYWJvdmUgKi8KLQotCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLQl9Ci0KLQkvKiBTdG9yZSB0aGUgZGRiX2hhbmRsZSBpbnRvIHRoZSBUYXJnZXQgb3BlcmFuZCAqLwotCi0Jc3RhdHVzID0gYWNwaV9leF9zdG9yZShkZGJfaGFuZGxlLCB0YXJnZXQsIHdhbGtfc3RhdGUpOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQkodm9pZClhY3BpX2V4X3VubG9hZF90YWJsZShkZGJfaGFuZGxlKTsKLQotCQkvKiB0YWJsZV9wdHIgd2FzIGRlYWxsb2NhdGVkIGFib3ZlICovCi0KLQkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKGRkYl9oYW5kbGUpOwotCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLQl9Ci0KLQkvKiBJbnZva2UgdGFibGUgaGFuZGxlciBpZiBwcmVzZW50ICovCi0KLQlpZiAoYWNwaV9nYmxfdGFibGVfaGFuZGxlcikgewotCQkodm9pZClhY3BpX2dibF90YWJsZV9oYW5kbGVyKEFDUElfVEFCTEVfRVZFTlRfTE9BRCwKLQkJCQkJICAgICB0YWJsZV9kZXNjLnBvaW50ZXIsCi0JCQkJCSAgICAgYWNwaV9nYmxfdGFibGVfaGFuZGxlcl9jb250ZXh0KTsKLQl9Ci0KLSAgICAgIGNsZWFudXA6Ci0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0KLQkJLyogRGVsZXRlIGFsbG9jYXRlZCB0YWJsZSBidWZmZXIgKi8KLQotCQlhY3BpX3RiX2RlbGV0ZV90YWJsZSgmdGFibGVfZGVzYyk7Ci0JfQotCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X3VubG9hZF90YWJsZQotICoKLSAqIFBBUkFNRVRFUlM6ICBkZGJfaGFuZGxlICAgICAgICAgIC0gSGFuZGxlIHRvIGEgcHJldmlvdXNseSBsb2FkZWQgdGFibGUKLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IFVubG9hZCBhbiBBQ1BJIHRhYmxlCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotYWNwaV9zdGF0dXMgYWNwaV9leF91bmxvYWRfdGFibGUodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqZGRiX2hhbmRsZSkKLXsKLQlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICp0YWJsZV9kZXNjID0gZGRiX2hhbmRsZTsKLQl1MzIgdGFibGVfaW5kZXg7Ci0Jc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICp0YWJsZTsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UoZXhfdW5sb2FkX3RhYmxlKTsKLQotCS8qCi0JICogVmFsaWRhdGUgdGhlIGhhbmRsZQotCSAqIEFsdGhvdWdoIHRoZSBoYW5kbGUgaXMgcGFydGlhbGx5IHZhbGlkYXRlZCBpbiBhY3BpX2V4X3JlY29uZmlndXJhdGlvbigpLAotCSAqIHdoZW4gaXQgY2FsbHMgYWNwaV9leF9yZXNvbHZlX29wZXJhbmRzKCksIHRoZSBoYW5kbGUgaXMgbW9yZSBjb21wbGV0ZWx5Ci0JICogdmFsaWRhdGVkIGhlcmUuCi0JICovCi0JaWYgKCghZGRiX2hhbmRsZSkgfHwKLQkgICAgKEFDUElfR0VUX0RFU0NSSVBUT1JfVFlQRShkZGJfaGFuZGxlKSAhPSBBQ1BJX0RFU0NfVFlQRV9PUEVSQU5EKSB8fAotCSAgICAoQUNQSV9HRVRfT0JKRUNUX1RZUEUoZGRiX2hhbmRsZSkgIT0gQUNQSV9UWVBFX0xPQ0FMX1JFRkVSRU5DRSkpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9QQVJBTUVURVIpOwotCX0KLQotCS8qIEdldCB0aGUgdGFibGUgaW5kZXggZnJvbSB0aGUgZGRiX2hhbmRsZSAqLwotCi0JdGFibGVfaW5kZXggPSB0YWJsZV9kZXNjLT5yZWZlcmVuY2UudmFsdWU7Ci0KLQkvKiBJbnZva2UgdGFibGUgaGFuZGxlciBpZiBwcmVzZW50ICovCi0KLQlpZiAoYWNwaV9nYmxfdGFibGVfaGFuZGxlcikgewotCQlzdGF0dXMgPSBhY3BpX2dldF90YWJsZV9ieV9pbmRleCh0YWJsZV9pbmRleCwgJnRhYmxlKTsKLQkJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKSB7Ci0JCQkodm9pZClhY3BpX2dibF90YWJsZV9oYW5kbGVyKEFDUElfVEFCTEVfRVZFTlRfVU5MT0FELAotCQkJCQkJICAgICB0YWJsZSwKLQkJCQkJCSAgICAgYWNwaV9nYmxfdGFibGVfaGFuZGxlcl9jb250ZXh0KTsKLQkJfQotCX0KLQotCS8qCi0JICogRGVsZXRlIHRoZSBlbnRpcmUgbmFtZXNwYWNlIHVuZGVyIHRoaXMgdGFibGUgTm9kZQotCSAqIChPZmZzZXQgY29udGFpbnMgdGhlIHRhYmxlX2lkKQotCSAqLwotCWFjcGlfdGJfZGVsZXRlX25hbWVzcGFjZV9ieV9vd25lcih0YWJsZV9pbmRleCk7Ci0JKHZvaWQpYWNwaV90Yl9yZWxlYXNlX293bmVyX2lkKHRhYmxlX2luZGV4KTsKLQotCWFjcGlfdGJfc2V0X3RhYmxlX2xvYWRlZF9mbGFnKHRhYmxlX2luZGV4LCBGQUxTRSk7Ci0KLQkvKiBUYWJsZSB1bmxvYWRlZCwgcmVtb3ZlIGEgcmVmZXJlbmNlIHRvIHRoZSBkZGJfaGFuZGxlIG9iamVjdCAqLwotCi0JYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKGRkYl9oYW5kbGUpOwotCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhjb252cnQuYyBiL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leGNvbnZydC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDFmMzVhLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leGNvbnZydC5jCisrKyAvZGV2L251bGwKQEAgLTEsNjkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBNb2R1bGUgTmFtZTogZXhjb252cnQgLSBPYmplY3QgY29udmVyc2lvbiByb3V0aW5lcwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDgsIEludGVsIENvcnAuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCi0gKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSBhdCBtaW5pbXVtIGEgZGlzY2xhaW1lcgotICogICAgc3Vic3RhbnRpYWxseSBzaW1pbGFyIHRvIHRoZSAiTk8gV0FSUkFOVFkiIGRpc2NsYWltZXIgYmVsb3cKLSAqICAgICgiRGlzY2xhaW1lciIpIGFuZCBhbnkgcmVkaXN0cmlidXRpb24gbXVzdCBiZSBjb25kaXRpb25lZCB1cG9uCi0gKiAgICBpbmNsdWRpbmcgYSBzdWJzdGFudGlhbGx5IHNpbWlsYXIgRGlzY2xhaW1lciByZXF1aXJlbWVudCBmb3IgZnVydGhlcgotICogICAgYmluYXJ5IHJlZGlzdHJpYnV0aW9uLgotICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzCi0gKiAgICBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIE5PIFdBUlJBTlRZCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKLSAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCi0gKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORwotICogSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCi0gKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCi0gKi8KLQotI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgotI2luY2x1ZGUgPGFjcGkvYWNpbnRlcnAuaD4KLSNpbmNsdWRlIDxhY3BpL2FtbGNvZGUuaD4KLQotI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfRVhFQ1VURVIKLUFDUElfTU9EVUxFX05BTUUoImV4Y29udnJ0IikKLQotLyogTG9jYWwgcHJvdG90eXBlcyAqLwotc3RhdGljIHUzMgotYWNwaV9leF9jb252ZXJ0X3RvX2FzY2lpKGFjcGlfaW50ZWdlciBpbnRlZ2VyLAotCQkJIHUxNiBiYXNlLCB1OCAqIHN0cmluZywgdTggbWF4X2xlbmd0aCk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfZXhfY29udmVydF90b19pbnRlZ2VyCi0gKgotICogUEFSQU1FVEVSUzogIG9ial9kZXNjICAgICAgICAtIE9iamVjdCB0byBiZSBjb252ZXJ0ZWQuIE11c3QgYmUgYW4KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLCBCdWZmZXIsIG9yIFN0cmluZwotICogICAgICAgICAgICAgIHJlc3VsdF9kZXNjICAgICAtIFdoZXJlIHRoZSBuZXcgSW50ZWdlciBvYmplY3QgaXMgcmV0dXJuZWQKLSAqICAgICAgICAgICAgICBGbGFncyAgICAgICAgICAgLSBVc2VkIGZvciBzdHJpbmcgY29udmVyc2lvbgotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKLSAqCi0gKiBERVNDUklQVElPTjogQ29udmVydCBhbiBBQ1BJIE9iamVjdCB0byBhbiBpbnRlZ2VyLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWFjcGlfc3RhdHVzCi1hY3BpX2V4X2NvbnZlcnRfdG9faW50ZWdlcih1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYywKLQkJCSAgIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKipyZXN1bHRfZGVzYywgdTMyIGZsYWdzKQotewotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnJldHVybl9kZXNjOwotCXU4ICpwb2ludGVyOwotCWFjcGlfaW50ZWdlciByZXN1bHQ7Ci0JdTMyIGk7Ci0JdTMyIGNvdW50OwotCWFjcGlfc3RhdHVzIHN0YXR1czsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKGV4X2NvbnZlcnRfdG9faW50ZWdlciwgb2JqX2Rlc2MpOwotCi0Jc3dpdGNoIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRShvYmpfZGVzYykpIHsKLQljYXNlIEFDUElfVFlQRV9JTlRFR0VSOgotCi0JCS8qIE5vIGNvbnZlcnNpb24gbmVjZXNzYXJ5ICovCi0KLQkJKnJlc3VsdF9kZXNjID0gb2JqX2Rlc2M7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7Ci0KLQljYXNlIEFDUElfVFlQRV9CVUZGRVI6Ci0JY2FzZSBBQ1BJX1RZUEVfU1RSSU5HOgotCi0JCS8qIE5vdGU6IFRha2VzIGFkdmFudGFnZSBvZiBjb21tb24gYnVmZmVyL3N0cmluZyBmaWVsZHMgKi8KLQotCQlwb2ludGVyID0gb2JqX2Rlc2MtPmJ1ZmZlci5wb2ludGVyOwotCQljb3VudCA9IG9ial9kZXNjLT5idWZmZXIubGVuZ3RoOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9UWVBFKTsKLQl9Ci0KLQkvKgotCSAqIENvbnZlcnQgdGhlIGJ1ZmZlci9zdHJpbmcgdG8gYW4gaW50ZWdlci4gTm90ZSB0aGF0IGJvdGggYnVmZmVycyBhbmQKLQkgKiBzdHJpbmdzIGFyZSB0cmVhdGVkIGFzIHJhdyBkYXRhIC0gd2UgZG9uJ3QgY29udmVydCBhc2NpaSB0byBoZXggZm9yCi0JICogc3RyaW5ncy4KLQkgKgotCSAqIFRoZXJlIGFyZSB0d28gdGVybWluYXRpbmcgY29uZGl0aW9ucyBmb3IgdGhlIGxvb3A6Ci0JICogMSkgVGhlIHNpemUgb2YgYW4gaW50ZWdlciBoYXMgYmVlbiByZWFjaGVkLCBvcgotCSAqIDIpIFRoZSBlbmQgb2YgdGhlIGJ1ZmZlciBvciBzdHJpbmcgaGFzIGJlZW4gcmVhY2hlZAotCSAqLwotCXJlc3VsdCA9IDA7Ci0KLQkvKiBTdHJpbmcgY29udmVyc2lvbiBpcyBkaWZmZXJlbnQgdGhhbiBCdWZmZXIgY29udmVyc2lvbiAqLwotCi0Jc3dpdGNoIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRShvYmpfZGVzYykpIHsKLQljYXNlIEFDUElfVFlQRV9TVFJJTkc6Ci0KLQkJLyoKLQkJICogQ29udmVydCBzdHJpbmcgdG8gYW4gaW50ZWdlciAtIGZvciBtb3N0IGNhc2VzLCB0aGUgc3RyaW5nIG11c3QgYmUKLQkJICogaGV4YWRlY2ltYWwgYXMgcGVyIHRoZSBBQ1BJIHNwZWNpZmljYXRpb24uIFRoZSBvbmx5IGV4Y2VwdGlvbiAoYXMKLQkJICogb2YgQUNQSSAzLjApIGlzIHRoYXQgdGhlIHRvX2ludGVnZXIoKSBvcGVyYXRvciBhbGxvd3MgYm90aCBkZWNpbWFsCi0JCSAqIGFuZCBoZXhhZGVjaW1hbCBzdHJpbmdzIChoZXggcHJlZml4ZWQgd2l0aCAiMHgiKS4KLQkJICovCi0JCXN0YXR1cyA9IGFjcGlfdXRfc3RydG91bDY0KChjaGFyICopcG9pbnRlciwgZmxhZ3MsICZyZXN1bHQpOwotCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBBQ1BJX1RZUEVfQlVGRkVSOgotCi0JCS8qIENoZWNrIGZvciB6ZXJvLWxlbmd0aCBidWZmZXIgKi8KLQotCQlpZiAoIWNvdW50KSB7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX0JVRkZFUl9MSU1JVCk7Ci0JCX0KLQotCQkvKiBUcmFuc2ZlciBubyBtb3JlIHRoYW4gYW4gaW50ZWdlcidzIHdvcnRoIG9mIGRhdGEgKi8KLQotCQlpZiAoY291bnQgPiBhY3BpX2dibF9pbnRlZ2VyX2J5dGVfd2lkdGgpIHsKLQkJCWNvdW50ID0gYWNwaV9nYmxfaW50ZWdlcl9ieXRlX3dpZHRoOwotCQl9Ci0KLQkJLyoKLQkJICogQ29udmVydCBidWZmZXIgdG8gYW4gaW50ZWdlciAtIHdlIHNpbXBseSBncmFiIGVub3VnaCByYXcgZGF0YQotCQkgKiBmcm9tIHRoZSBidWZmZXIgdG8gZmlsbCBhbiBpbnRlZ2VyCi0JCSAqLwotCQlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotCQkJLyoKLQkJCSAqIEdldCBuZXh0IGJ5dGUgYW5kIHNoaWZ0IGl0IGludG8gdGhlIFJlc3VsdC4KLQkJCSAqIExpdHRsZSBlbmRpYW4gaXMgdXNlZCwgbWVhbmluZyB0aGF0IHRoZSBmaXJzdCBieXRlIG9mIHRoZSBidWZmZXIKLQkJCSAqIGlzIHRoZSBMU0Igb2YgdGhlIGludGVnZXIKLQkJCSAqLwotCQkJcmVzdWx0IHw9ICgoKGFjcGlfaW50ZWdlcikgcG9pbnRlcltpXSkgPDwgKGkgKiA4KSk7Ci0JCX0KLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCi0JCS8qIE5vIG90aGVyIHR5cGVzIGNhbiBnZXQgaGVyZSAqLwotCQlicmVhazsKLQl9Ci0KLQkvKiBDcmVhdGUgYSBuZXcgaW50ZWdlciAqLwotCi0JcmV0dXJuX2Rlc2MgPSBhY3BpX3V0X2NyZWF0ZV9pbnRlcm5hbF9vYmplY3QoQUNQSV9UWVBFX0lOVEVHRVIpOwotCWlmICghcmV0dXJuX2Rlc2MpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX01FTU9SWSk7Ci0JfQotCi0JQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FWEVDLCAiQ29udmVydGVkIHZhbHVlOiAlOC44WCU4LjhYXG4iLAotCQkJICBBQ1BJX0ZPUk1BVF9VSU5UNjQocmVzdWx0KSkpOwotCi0JLyogU2F2ZSB0aGUgUmVzdWx0ICovCi0KLQlyZXR1cm5fZGVzYy0+aW50ZWdlci52YWx1ZSA9IHJlc3VsdDsKLQlhY3BpX2V4X3RydW5jYXRlX2ZvcjMyYml0X3RhYmxlKHJldHVybl9kZXNjKTsKLQkqcmVzdWx0X2Rlc2MgPSByZXR1cm5fZGVzYzsKLQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X2NvbnZlcnRfdG9fYnVmZmVyCi0gKgotICogUEFSQU1FVEVSUzogIG9ial9kZXNjICAgICAgICAtIE9iamVjdCB0byBiZSBjb252ZXJ0ZWQuIE11c3QgYmUgYW4KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLCBCdWZmZXIsIG9yIFN0cmluZwotICogICAgICAgICAgICAgIHJlc3VsdF9kZXNjICAgICAtIFdoZXJlIHRoZSBuZXcgYnVmZmVyIG9iamVjdCBpcyByZXR1cm5lZAotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKLSAqCi0gKiBERVNDUklQVElPTjogQ29udmVydCBhbiBBQ1BJIE9iamVjdCB0byBhIEJ1ZmZlcgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWFjcGlfc3RhdHVzCi1hY3BpX2V4X2NvbnZlcnRfdG9fYnVmZmVyKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjLAotCQkJICB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICoqcmVzdWx0X2Rlc2MpCi17Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqcmV0dXJuX2Rlc2M7Ci0JdTggKm5ld19idWY7Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUihleF9jb252ZXJ0X3RvX2J1ZmZlciwgb2JqX2Rlc2MpOwotCi0Jc3dpdGNoIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRShvYmpfZGVzYykpIHsKLQljYXNlIEFDUElfVFlQRV9CVUZGRVI6Ci0KLQkJLyogTm8gY29udmVyc2lvbiBuZWNlc3NhcnkgKi8KLQotCQkqcmVzdWx0X2Rlc2MgPSBvYmpfZGVzYzsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKLQotCWNhc2UgQUNQSV9UWVBFX0lOVEVHRVI6Ci0KLQkJLyoKLQkJICogQ3JlYXRlIGEgbmV3IEJ1ZmZlciBvYmplY3QuCi0JCSAqIE5lZWQgZW5vdWdoIHNwYWNlIGZvciBvbmUgaW50ZWdlcgotCQkgKi8KLQkJcmV0dXJuX2Rlc2MgPQotCQkgICAgYWNwaV91dF9jcmVhdGVfYnVmZmVyX29iamVjdChhY3BpX2dibF9pbnRlZ2VyX2J5dGVfd2lkdGgpOwotCQlpZiAoIXJldHVybl9kZXNjKSB7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9fTUVNT1JZKTsKLQkJfQotCi0JCS8qIENvcHkgdGhlIGludGVnZXIgdG8gdGhlIGJ1ZmZlciwgTFNCIGZpcnN0ICovCi0KLQkJbmV3X2J1ZiA9IHJldHVybl9kZXNjLT5idWZmZXIucG9pbnRlcjsKLQkJQUNQSV9NRU1DUFkobmV3X2J1ZiwKLQkJCSAgICAmb2JqX2Rlc2MtPmludGVnZXIudmFsdWUsCi0JCQkgICAgYWNwaV9nYmxfaW50ZWdlcl9ieXRlX3dpZHRoKTsKLQkJYnJlYWs7Ci0KLQljYXNlIEFDUElfVFlQRV9TVFJJTkc6Ci0KLQkJLyoKLQkJICogQ3JlYXRlIGEgbmV3IEJ1ZmZlciBvYmplY3QKLQkJICogU2l6ZSB3aWxsIGJlIHRoZSBzdHJpbmcgbGVuZ3RoCi0JCSAqCi0JCSAqIE5PVEU6IEFkZCBvbmUgdG8gdGhlIHN0cmluZyBsZW5ndGggdG8gaW5jbHVkZSB0aGUgbnVsbCB0ZXJtaW5hdG9yLgotCQkgKiBUaGUgQUNQSSBzcGVjIGlzIHVuY2xlYXIgb24gdGhpcyBzdWJqZWN0LCBidXQgdGhlcmUgaXMgZXhpc3RpbmcKLQkJICogQVNML0FNTCBjb2RlIHRoYXQgZGVwZW5kcyBvbiB0aGUgbnVsbCBiZWluZyB0cmFuc2ZlcnJlZCB0byB0aGUgbmV3Ci0JCSAqIGJ1ZmZlci4KLQkJICovCi0JCXJldHVybl9kZXNjID0gYWNwaV91dF9jcmVhdGVfYnVmZmVyX29iamVjdCgoYWNwaV9zaXplKQotCQkJCQkJCSAgIG9ial9kZXNjLT5zdHJpbmcuCi0JCQkJCQkJICAgbGVuZ3RoICsgMSk7Ci0JCWlmICghcmV0dXJuX2Rlc2MpIHsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT19NRU1PUlkpOwotCQl9Ci0KLQkJLyogQ29weSB0aGUgc3RyaW5nIHRvIHRoZSBidWZmZXIgKi8KLQotCQluZXdfYnVmID0gcmV0dXJuX2Rlc2MtPmJ1ZmZlci5wb2ludGVyOwotCQlBQ1BJX1NUUk5DUFkoKGNoYXIgKiluZXdfYnVmLCAoY2hhciAqKW9ial9kZXNjLT5zdHJpbmcucG9pbnRlciwKLQkJCSAgICAgb2JqX2Rlc2MtPnN0cmluZy5sZW5ndGgpOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9UWVBFKTsKLQl9Ci0KLQkvKiBNYXJrIGJ1ZmZlciBpbml0aWFsaXplZCAqLwotCi0JcmV0dXJuX2Rlc2MtPmNvbW1vbi5mbGFncyB8PSBBT1BPQkpfREFUQV9WQUxJRDsKLQkqcmVzdWx0X2Rlc2MgPSByZXR1cm5fZGVzYzsKLQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X2NvbnZlcnRfdG9fYXNjaWkKLSAqCi0gKiBQQVJBTUVURVJTOiAgSW50ZWdlciAgICAgICAgIC0gVmFsdWUgdG8gYmUgY29udmVydGVkCi0gKiAgICAgICAgICAgICAgQmFzZSAgICAgICAgICAgIC0gQUNQSV9TVFJJTkdfREVDSU1BTCBvciBBQ1BJX1NUUklOR19IRVgKLSAqICAgICAgICAgICAgICBTdHJpbmcgICAgICAgICAgLSBXaGVyZSB0aGUgc3RyaW5nIGlzIHJldHVybmVkCi0gKiAgICAgICAgICAgICAgZGF0YV93aWR0aCAgICAgIC0gU2l6ZSBvZiBkYXRhIGl0ZW0gdG8gYmUgY29udmVydGVkLCBpbiBieXRlcwotICoKLSAqIFJFVFVSTjogICAgICBBY3R1YWwgc3RyaW5nIGxlbmd0aAotICoKLSAqIERFU0NSSVBUSU9OOiBDb252ZXJ0IGFuIEFDUEkgSW50ZWdlciB0byBhIGhleCBvciBkZWNpbWFsIHN0cmluZwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyB1MzIKLWFjcGlfZXhfY29udmVydF90b19hc2NpaShhY3BpX2ludGVnZXIgaW50ZWdlciwKLQkJCSB1MTYgYmFzZSwgdTggKiBzdHJpbmcsIHU4IGRhdGFfd2lkdGgpCi17Ci0JYWNwaV9pbnRlZ2VyIGRpZ2l0OwotCXUzMiBpOwotCXUzMiBqOwotCXUzMiBrID0gMDsKLQl1MzIgaGV4X2xlbmd0aDsKLQl1MzIgZGVjaW1hbF9sZW5ndGg7Ci0JdTMyIHJlbWFpbmRlcjsKLQl1OCBzdXByZXNzX3plcm9zOwotCi0JQUNQSV9GVU5DVElPTl9FTlRSWSgpOwotCi0Jc3dpdGNoIChiYXNlKSB7Ci0JY2FzZSAxMDoKLQotCQkvKiBTZXR1cCBtYXggbGVuZ3RoIGZvciB0aGUgZGVjaW1hbCBudW1iZXIgKi8KLQotCQlzd2l0Y2ggKGRhdGFfd2lkdGgpIHsKLQkJY2FzZSAxOgotCQkJZGVjaW1hbF9sZW5ndGggPSBBQ1BJX01BWDhfREVDSU1BTF9ESUdJVFM7Ci0JCQlicmVhazsKLQotCQljYXNlIDQ6Ci0JCQlkZWNpbWFsX2xlbmd0aCA9IEFDUElfTUFYMzJfREVDSU1BTF9ESUdJVFM7Ci0JCQlicmVhazsKLQotCQljYXNlIDg6Ci0JCWRlZmF1bHQ6Ci0JCQlkZWNpbWFsX2xlbmd0aCA9IEFDUElfTUFYNjRfREVDSU1BTF9ESUdJVFM7Ci0JCQlicmVhazsKLQkJfQotCi0JCXN1cHJlc3NfemVyb3MgPSBUUlVFOwkvKiBObyBsZWFkaW5nIHplcm9zICovCi0JCXJlbWFpbmRlciA9IDA7Ci0KLQkJZm9yIChpID0gZGVjaW1hbF9sZW5ndGg7IGkgPiAwOyBpLS0pIHsKLQotCQkJLyogRGl2aWRlIGJ5IG50aCBmYWN0b3Igb2YgMTAgKi8KLQotCQkJZGlnaXQgPSBpbnRlZ2VyOwotCQkJZm9yIChqID0gMDsgaiA8IGk7IGorKykgewotCQkJCSh2b2lkKWFjcGlfdXRfc2hvcnRfZGl2aWRlKGRpZ2l0LCAxMCwgJmRpZ2l0LAotCQkJCQkJCSAgICZyZW1haW5kZXIpOwotCQkJfQotCi0JCQkvKiBIYW5kbGUgbGVhZGluZyB6ZXJvcyAqLwotCi0JCQlpZiAocmVtYWluZGVyICE9IDApIHsKLQkJCQlzdXByZXNzX3plcm9zID0gRkFMU0U7Ci0JCQl9Ci0KLQkJCWlmICghc3VwcmVzc196ZXJvcykgewotCQkJCXN0cmluZ1trXSA9ICh1OCkgKEFDUElfQVNDSUlfWkVSTyArIHJlbWFpbmRlcik7Ci0JCQkJaysrOwotCQkJfQotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSAxNjoKLQotCQkvKiBoZXhfbGVuZ3RoOiAyIGFzY2lpIGhleCBjaGFycyBwZXIgZGF0YSBieXRlICovCi0KLQkJaGV4X2xlbmd0aCA9IEFDUElfTVVMXzIoZGF0YV93aWR0aCk7Ci0JCWZvciAoaSA9IDAsIGogPSAoaGV4X2xlbmd0aCAtIDEpOyBpIDwgaGV4X2xlbmd0aDsgaSsrLCBqLS0pIHsKLQotCQkJLyogR2V0IG9uZSBoZXggZGlnaXQsIG1vc3Qgc2lnbmlmaWNhbnQgZGlnaXRzIGZpcnN0ICovCi0KLQkJCXN0cmluZ1trXSA9Ci0JCQkgICAgKHU4KSBhY3BpX3V0X2hleF90b19hc2NpaV9jaGFyKGludGVnZXIsCi0JCQkJCQkJICAgQUNQSV9NVUxfNChqKSk7Ci0JCQlrKys7Ci0JCX0KLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlyZXR1cm4gKDApOwotCX0KLQotCS8qCi0JICogU2luY2UgbGVhZGluZyB6ZXJvcyBhcmUgc3VwcHJlc3NlZCwgd2UgbXVzdCBjaGVjayBmb3IgdGhlIGNhc2Ugd2hlcmUKLQkgKiB0aGUgaW50ZWdlciBlcXVhbHMgMAotCSAqCi0JICogRmluYWxseSwgbnVsbCB0ZXJtaW5hdGUgdGhlIHN0cmluZyBhbmQgcmV0dXJuIHRoZSBsZW5ndGgKLQkgKi8KLQlpZiAoIWspIHsKLQkJc3RyaW5nWzBdID0gQUNQSV9BU0NJSV9aRVJPOwotCQlrID0gMTsKLQl9Ci0KLQlzdHJpbmdba10gPSAwOwotCXJldHVybiAoKHUzMikgayk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfZXhfY29udmVydF90b19zdHJpbmcKLSAqCi0gKiBQQVJBTUVURVJTOiAgb2JqX2Rlc2MgICAgICAgIC0gT2JqZWN0IHRvIGJlIGNvbnZlcnRlZC4gTXVzdCBiZSBhbgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludGVnZXIsIEJ1ZmZlciwgb3IgU3RyaW5nCi0gKiAgICAgICAgICAgICAgcmVzdWx0X2Rlc2MgICAgIC0gV2hlcmUgdGhlIHN0cmluZyBvYmplY3QgaXMgcmV0dXJuZWQKLSAqICAgICAgICAgICAgICBUeXBlICAgICAgICAgICAgLSBTdHJpbmcgZmxhZ3MgKGJhc2UgYW5kIGNvbnZlcnNpb24gdHlwZSkKLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IENvbnZlcnQgYW4gQUNQSSBPYmplY3QgdG8gYSBzdHJpbmcKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1hY3BpX3N0YXR1cwotYWNwaV9leF9jb252ZXJ0X3RvX3N0cmluZyh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICogb2JqX2Rlc2MsCi0JCQkgIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKiogcmVzdWx0X2Rlc2MsIHUzMiB0eXBlKQotewotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnJldHVybl9kZXNjOwotCXU4ICpuZXdfYnVmOwotCXUzMiBpOwotCXUzMiBzdHJpbmdfbGVuZ3RoID0gMDsKLQl1MTYgYmFzZSA9IDE2OwotCXU4IHNlcGFyYXRvciA9ICcsJzsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKGV4X2NvbnZlcnRfdG9fc3RyaW5nLCBvYmpfZGVzYyk7Ci0KLQlzd2l0Y2ggKEFDUElfR0VUX09CSkVDVF9UWVBFKG9ial9kZXNjKSkgewotCWNhc2UgQUNQSV9UWVBFX1NUUklORzoKLQotCQkvKiBObyBjb252ZXJzaW9uIG5lY2Vzc2FyeSAqLwotCi0JCSpyZXN1bHRfZGVzYyA9IG9ial9kZXNjOwotCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwotCi0JY2FzZSBBQ1BJX1RZUEVfSU5URUdFUjoKLQotCQlzd2l0Y2ggKHR5cGUpIHsKLQkJY2FzZSBBQ1BJX0VYUExJQ0lUX0NPTlZFUlRfREVDSU1BTDoKLQotCQkJLyogTWFrZSByb29tIGZvciBtYXhpbXVtIGRlY2ltYWwgbnVtYmVyICovCi0KLQkJCXN0cmluZ19sZW5ndGggPSBBQ1BJX01BWF9ERUNJTUFMX0RJR0lUUzsKLQkJCWJhc2UgPSAxMDsKLQkJCWJyZWFrOwotCi0JCWRlZmF1bHQ6Ci0KLQkJCS8qIFR3byBoZXggc3RyaW5nIGNoYXJhY3RlcnMgZm9yIGVhY2ggaW50ZWdlciBieXRlICovCi0KLQkJCXN0cmluZ19sZW5ndGggPSBBQ1BJX01VTF8yKGFjcGlfZ2JsX2ludGVnZXJfYnl0ZV93aWR0aCk7Ci0JCQlicmVhazsKLQkJfQotCi0JCS8qCi0JCSAqIENyZWF0ZSBhIG5ldyBTdHJpbmcKLQkJICogTmVlZCBlbm91Z2ggc3BhY2UgZm9yIG9uZSBBU0NJSSBpbnRlZ2VyIChwbHVzIG51bGwgdGVybWluYXRvcikKLQkJICovCi0JCXJldHVybl9kZXNjID0KLQkJICAgIGFjcGlfdXRfY3JlYXRlX3N0cmluZ19vYmplY3QoKGFjcGlfc2l6ZSkgc3RyaW5nX2xlbmd0aCk7Ci0JCWlmICghcmV0dXJuX2Rlc2MpIHsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT19NRU1PUlkpOwotCQl9Ci0KLQkJbmV3X2J1ZiA9IHJldHVybl9kZXNjLT5idWZmZXIucG9pbnRlcjsKLQotCQkvKiBDb252ZXJ0IGludGVnZXIgdG8gc3RyaW5nICovCi0KLQkJc3RyaW5nX2xlbmd0aCA9Ci0JCSAgICBhY3BpX2V4X2NvbnZlcnRfdG9fYXNjaWkob2JqX2Rlc2MtPmludGVnZXIudmFsdWUsIGJhc2UsCi0JCQkJCSAgICAgbmV3X2J1ZiwKLQkJCQkJICAgICBhY3BpX2dibF9pbnRlZ2VyX2J5dGVfd2lkdGgpOwotCi0JCS8qIE51bGwgdGVybWluYXRlIGF0IHRoZSBjb3JyZWN0IHBsYWNlICovCi0KLQkJcmV0dXJuX2Rlc2MtPnN0cmluZy5sZW5ndGggPSBzdHJpbmdfbGVuZ3RoOwotCQluZXdfYnVmW3N0cmluZ19sZW5ndGhdID0gMDsKLQkJYnJlYWs7Ci0KLQljYXNlIEFDUElfVFlQRV9CVUZGRVI6Ci0KLQkJLyogU2V0dXAgc3RyaW5nIGxlbmd0aCwgYmFzZSwgYW5kIHNlcGFyYXRvciAqLwotCi0JCXN3aXRjaCAodHlwZSkgewotCQljYXNlIEFDUElfRVhQTElDSVRfQ09OVkVSVF9ERUNJTUFMOgkvKiBVc2VkIGJ5IHRvX2RlY2ltYWxfc3RyaW5nICovCi0JCQkvKgotCQkJICogRnJvbSBBQ1BJOiAiSWYgRGF0YSBpcyBhIGJ1ZmZlciwgaXQgaXMgY29udmVydGVkIHRvIGEgc3RyaW5nIG9mCi0JCQkgKiBkZWNpbWFsIHZhbHVlcyBzZXBhcmF0ZWQgYnkgY29tbWFzLiIKLQkJCSAqLwotCQkJYmFzZSA9IDEwOwotCi0JCQkvKgotCQkJICogQ2FsY3VsYXRlIHRoZSBmaW5hbCBzdHJpbmcgbGVuZ3RoLiBJbmRpdmlkdWFsIHN0cmluZyB2YWx1ZXMKLQkJCSAqIGFyZSB2YXJpYWJsZSBsZW5ndGggKGluY2x1ZGUgc2VwYXJhdG9yIGZvciBlYWNoKQotCQkJICovCi0JCQlmb3IgKGkgPSAwOyBpIDwgb2JqX2Rlc2MtPmJ1ZmZlci5sZW5ndGg7IGkrKykgewotCQkJCWlmIChvYmpfZGVzYy0+YnVmZmVyLnBvaW50ZXJbaV0gPj0gMTAwKSB7Ci0JCQkJCXN0cmluZ19sZW5ndGggKz0gNDsKLQkJCQl9IGVsc2UgaWYgKG9ial9kZXNjLT5idWZmZXIucG9pbnRlcltpXSA+PSAxMCkgewotCQkJCQlzdHJpbmdfbGVuZ3RoICs9IDM7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJc3RyaW5nX2xlbmd0aCArPSAyOwotCQkJCX0KLQkJCX0KLQkJCWJyZWFrOwotCi0JCWNhc2UgQUNQSV9JTVBMSUNJVF9DT05WRVJUX0hFWDoKLQkJCS8qCi0JCQkgKiBGcm9tIHRoZSBBQ1BJIHNwZWM6Ci0JCQkgKiJUaGUgZW50aXJlIGNvbnRlbnRzIG9mIHRoZSBidWZmZXIgYXJlIGNvbnZlcnRlZCB0byBhIHN0cmluZyBvZgotCQkJICogdHdvLWNoYXJhY3RlciBoZXhhZGVjaW1hbCBudW1iZXJzLCBlYWNoIHNlcGFyYXRlZCBieSBhIHNwYWNlLiIKLQkJCSAqLwotCQkJc2VwYXJhdG9yID0gJyAnOwotCQkJc3RyaW5nX2xlbmd0aCA9IChvYmpfZGVzYy0+YnVmZmVyLmxlbmd0aCAqIDMpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBBQ1BJX0VYUExJQ0lUX0NPTlZFUlRfSEVYOgkvKiBVc2VkIGJ5IHRvX2hleF9zdHJpbmcgKi8KLQkJCS8qCi0JCQkgKiBGcm9tIEFDUEk6ICJJZiBEYXRhIGlzIGEgYnVmZmVyLCBpdCBpcyBjb252ZXJ0ZWQgdG8gYSBzdHJpbmcgb2YKLQkJCSAqIGhleGFkZWNpbWFsIHZhbHVlcyBzZXBhcmF0ZWQgYnkgY29tbWFzLiIKLQkJCSAqLwotCQkJc3RyaW5nX2xlbmd0aCA9IChvYmpfZGVzYy0+YnVmZmVyLmxlbmd0aCAqIDMpOwotCQkJYnJlYWs7Ci0KLQkJZGVmYXVsdDoKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfUEFSQU1FVEVSKTsKLQkJfQotCi0JCS8qCi0JCSAqIENyZWF0ZSBhIG5ldyBzdHJpbmcgb2JqZWN0IGFuZCBzdHJpbmcgYnVmZmVyCi0JCSAqICgtMSBiZWNhdXNlIG9mIGV4dHJhIHNlcGFyYXRvciBpbmNsdWRlZCBpbiBzdHJpbmdfbGVuZ3RoIGZyb20gYWJvdmUpCi0JCSAqIEFsbG93IGNyZWF0aW9uIG9mIHplcm8tbGVuZ3RoIHN0cmluZ3MgZnJvbSB6ZXJvLWxlbmd0aCBidWZmZXJzLgotCQkgKi8KLQkJaWYgKHN0cmluZ19sZW5ndGgpIHsKLQkJCXN0cmluZ19sZW5ndGgtLTsKLQkJfQotCi0JCXJldHVybl9kZXNjID0gYWNwaV91dF9jcmVhdGVfc3RyaW5nX29iamVjdCgoYWNwaV9zaXplKQotCQkJCQkJCSAgIHN0cmluZ19sZW5ndGgpOwotCQlpZiAoIXJldHVybl9kZXNjKSB7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9fTUVNT1JZKTsKLQkJfQotCi0JCW5ld19idWYgPSByZXR1cm5fZGVzYy0+YnVmZmVyLnBvaW50ZXI7Ci0KLQkJLyoKLQkJICogQ29udmVydCBidWZmZXIgYnl0ZXMgdG8gaGV4IG9yIGRlY2ltYWwgdmFsdWVzCi0JCSAqIChzZXBhcmF0ZWQgYnkgY29tbWFzIG9yIHNwYWNlcykKLQkJICovCi0JCWZvciAoaSA9IDA7IGkgPCBvYmpfZGVzYy0+YnVmZmVyLmxlbmd0aDsgaSsrKSB7Ci0JCQluZXdfYnVmICs9IGFjcGlfZXhfY29udmVydF90b19hc2NpaSgoYWNwaV9pbnRlZ2VyKQotCQkJCQkJCSAgICBvYmpfZGVzYy0+YnVmZmVyLgotCQkJCQkJCSAgICBwb2ludGVyW2ldLCBiYXNlLAotCQkJCQkJCSAgICBuZXdfYnVmLCAxKTsKLQkJCSpuZXdfYnVmKysgPSBzZXBhcmF0b3I7CS8qIGVhY2ggc2VwYXJhdGVkIGJ5IGEgY29tbWEgb3Igc3BhY2UgKi8KLQkJfQotCi0JCS8qCi0JCSAqIE51bGwgdGVybWluYXRlIHRoZSBzdHJpbmcKLQkJICogKG92ZXJ3cml0ZXMgZmluYWwgY29tbWEvc3BhY2UgZnJvbSBhYm92ZSkKLQkJICovCi0JCWlmIChvYmpfZGVzYy0+YnVmZmVyLmxlbmd0aCkgewotCQkJbmV3X2J1Zi0tOwotCQl9Ci0JCSpuZXdfYnVmID0gMDsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfVFlQRSk7Ci0JfQotCi0JKnJlc3VsdF9kZXNjID0gcmV0dXJuX2Rlc2M7Ci0JcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9leF9jb252ZXJ0X3RvX3RhcmdldF90eXBlCi0gKgotICogUEFSQU1FVEVSUzogIGRlc3RpbmF0aW9uX3R5cGUgICAgLSBDdXJyZW50IHR5cGUgb2YgdGhlIGRlc3RpbmF0aW9uCi0gKiAgICAgICAgICAgICAgc291cmNlX2Rlc2MgICAgICAgICAtIFNvdXJjZSBvYmplY3QgdG8gYmUgY29udmVydGVkLgotICogICAgICAgICAgICAgIHJlc3VsdF9kZXNjICAgICAgICAgLSBXaGVyZSB0aGUgY29udmVydGVkIG9iamVjdCBpcyByZXR1cm5lZAotICogICAgICAgICAgICAgIHdhbGtfc3RhdGUgICAgICAgICAgLSBDdXJyZW50IG1ldGhvZCBzdGF0ZQotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKLSAqCi0gKiBERVNDUklQVElPTjogSW1wbGVtZW50cyAiaW1wbGljaXQgY29udmVyc2lvbiIgcnVsZXMgZm9yIHN0b3JpbmcgYW4gb2JqZWN0LgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWFjcGlfc3RhdHVzCi1hY3BpX2V4X2NvbnZlcnRfdG9fdGFyZ2V0X3R5cGUoYWNwaV9vYmplY3RfdHlwZSBkZXN0aW5hdGlvbl90eXBlLAotCQkJICAgICAgIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnNvdXJjZV9kZXNjLAotCQkJICAgICAgIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKipyZXN1bHRfZGVzYywKLQkJCSAgICAgICBzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKQotewotCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOwotCi0JQUNQSV9GVU5DVElPTl9UUkFDRShleF9jb252ZXJ0X3RvX3RhcmdldF90eXBlKTsKLQotCS8qIERlZmF1bHQgYmVoYXZpb3IgKi8KLQotCSpyZXN1bHRfZGVzYyA9IHNvdXJjZV9kZXNjOwotCi0JLyoKLQkgKiBJZiByZXF1aXJlZCBieSB0aGUgdGFyZ2V0LAotCSAqIHBlcmZvcm0gaW1wbGljaXQgY29udmVyc2lvbiBvbiB0aGUgc291cmNlIGJlZm9yZSB3ZSBzdG9yZSBpdC4KLQkgKi8KLQlzd2l0Y2ggKEdFVF9DVVJSRU5UX0FSR19UWVBFKHdhbGtfc3RhdGUtPm9wX2luZm8tPnJ1bnRpbWVfYXJncykpIHsKLQljYXNlIEFSR0lfU0lNUExFX1RBUkdFVDoKLQljYXNlIEFSR0lfRklYRURfVEFSR0VUOgotCWNhc2UgQVJHSV9JTlRFR0VSX1JFRjoJLyogSGFuZGxlcyBJbmNyZW1lbnQsIERlY3JlbWVudCBjYXNlcyAqLwotCi0JCXN3aXRjaCAoZGVzdGluYXRpb25fdHlwZSkgewotCQljYXNlIEFDUElfVFlQRV9MT0NBTF9SRUdJT05fRklFTEQ6Ci0JCQkvKgotCQkJICogTmFtZWQgZmllbGQgY2FuIGFsd2F5cyBoYW5kbGUgY29udmVyc2lvbnMKLQkJCSAqLwotCQkJYnJlYWs7Ci0KLQkJZGVmYXVsdDoKLQkJCS8qIE5vIGNvbnZlcnNpb24gYWxsb3dlZCBmb3IgdGhlc2UgdHlwZXMgKi8KLQotCQkJaWYgKGRlc3RpbmF0aW9uX3R5cGUgIT0KLQkJCSAgICBBQ1BJX0dFVF9PQkpFQ1RfVFlQRShzb3VyY2VfZGVzYykpIHsKLQkJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sCi0JCQkJCQkgICJFeHBsaWNpdCBvcGVyYXRvciwgd2lsbCBzdG9yZSAoJXMpIG92ZXIgZXhpc3RpbmcgdHlwZSAoJXMpXG4iLAotCQkJCQkJICBhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lCi0JCQkJCQkgIChzb3VyY2VfZGVzYyksCi0JCQkJCQkgIGFjcGlfdXRfZ2V0X3R5cGVfbmFtZQotCQkJCQkJICAoZGVzdGluYXRpb25fdHlwZSkpKTsKLQkJCQlzdGF0dXMgPSBBRV9UWVBFOwotCQkJfQotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBBUkdJX1RBUkdFVFJFRjoKLQotCQlzd2l0Y2ggKGRlc3RpbmF0aW9uX3R5cGUpIHsKLQkJY2FzZSBBQ1BJX1RZUEVfSU5URUdFUjoKLQkJY2FzZSBBQ1BJX1RZUEVfQlVGRkVSX0ZJRUxEOgotCQljYXNlIEFDUElfVFlQRV9MT0NBTF9CQU5LX0ZJRUxEOgotCQljYXNlIEFDUElfVFlQRV9MT0NBTF9JTkRFWF9GSUVMRDoKLQkJCS8qCi0JCQkgKiBUaGVzZSB0eXBlcyByZXF1aXJlIGFuIEludGVnZXIgb3BlcmFuZC4gV2UgY2FuIGNvbnZlcnQKLQkJCSAqIGEgQnVmZmVyIG9yIGEgU3RyaW5nIHRvIGFuIEludGVnZXIgaWYgbmVjZXNzYXJ5LgotCQkJICovCi0JCQlzdGF0dXMgPQotCQkJICAgIGFjcGlfZXhfY29udmVydF90b19pbnRlZ2VyKHNvdXJjZV9kZXNjLCByZXN1bHRfZGVzYywKLQkJCQkJCSAgICAgICAxNik7Ci0JCQlicmVhazsKLQotCQljYXNlIEFDUElfVFlQRV9TVFJJTkc6Ci0JCQkvKgotCQkJICogVGhlIG9wZXJhbmQgbXVzdCBiZSBhIFN0cmluZy4gV2UgY2FuIGNvbnZlcnQgYW4KLQkJCSAqIEludGVnZXIgb3IgQnVmZmVyIGlmIG5lY2Vzc2FyeQotCQkJICovCi0JCQlzdGF0dXMgPQotCQkJICAgIGFjcGlfZXhfY29udmVydF90b19zdHJpbmcoc291cmNlX2Rlc2MsIHJlc3VsdF9kZXNjLAotCQkJCQkJICAgICAgQUNQSV9JTVBMSUNJVF9DT05WRVJUX0hFWCk7Ci0JCQlicmVhazsKLQotCQljYXNlIEFDUElfVFlQRV9CVUZGRVI6Ci0JCQkvKgotCQkJICogVGhlIG9wZXJhbmQgbXVzdCBiZSBhIEJ1ZmZlci4gV2UgY2FuIGNvbnZlcnQgYW4KLQkJCSAqIEludGVnZXIgb3IgU3RyaW5nIGlmIG5lY2Vzc2FyeQotCQkJICovCi0JCQlzdGF0dXMgPQotCQkJICAgIGFjcGlfZXhfY29udmVydF90b19idWZmZXIoc291cmNlX2Rlc2MsIHJlc3VsdF9kZXNjKTsKLQkJCWJyZWFrOwotCi0JCWRlZmF1bHQ6Ci0JCQlBQ1BJX0VSUk9SKChBRV9JTkZPLAotCQkJCSAgICAiQmFkIGRlc3RpbmF0aW9uIHR5cGUgZHVyaW5nIGNvbnZlcnNpb246ICVYIiwKLQkJCQkgICAgZGVzdGluYXRpb25fdHlwZSkpOwotCQkJc3RhdHVzID0gQUVfQU1MX0lOVEVSTkFMOwotCQkJYnJlYWs7Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIEFSR0lfUkVGRVJFTkNFOgotCQkvKgotCQkgKiBjcmVhdGVfeHh4eF9maWVsZCBjYXNlcyAtIHdlIGFyZSBzdG9yaW5nIHRoZSBmaWVsZCBvYmplY3QgaW50byB0aGUgbmFtZQotCQkgKi8KLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlBQ1BJX0VSUk9SKChBRV9JTkZPLAotCQkJICAgICJVbmtub3duIFRhcmdldCB0eXBlIElEIDB4JVggQW1sT3Bjb2RlICVYIERlc3RUeXBlICVzIiwKLQkJCSAgICBHRVRfQ1VSUkVOVF9BUkdfVFlQRSh3YWxrX3N0YXRlLT5vcF9pbmZvLT4KLQkJCQkJCSBydW50aW1lX2FyZ3MpLAotCQkJICAgIHdhbGtfc3RhdGUtPm9wY29kZSwKLQkJCSAgICBhY3BpX3V0X2dldF90eXBlX25hbWUoZGVzdGluYXRpb25fdHlwZSkpKTsKLQkJc3RhdHVzID0gQUVfQU1MX0lOVEVSTkFMOwotCX0KLQotCS8qCi0JICogU291cmNlLXRvLVRhcmdldCBjb252ZXJzaW9uIHNlbWFudGljczoKLQkgKgotCSAqIElmIGNvbnZlcnNpb24gdG8gdGhlIHRhcmdldCB0eXBlIGNhbm5vdCBiZSBwZXJmb3JtZWQsIHRoZW4gc2ltcGx5Ci0JICogb3ZlcndyaXRlIHRoZSB0YXJnZXQgd2l0aCB0aGUgbmV3IG9iamVjdCBhbmQgdHlwZS4KLQkgKi8KLQlpZiAoc3RhdHVzID09IEFFX1RZUEUpIHsKLQkJc3RhdHVzID0gQUVfT0s7Ci0JfQotCi0JcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhjcmVhdGUuYyBiL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leGNyZWF0ZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDA5Njk2Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leGNyZWF0ZS5jCisrKyAvZGV2L251bGwKQEAgLTEsNTIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBNb2R1bGUgTmFtZTogZXhjcmVhdGUgLSBOYW1lZCBvYmplY3QgY3JlYXRpb24KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA4LCBJbnRlbCBDb3JwLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAotICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgYXQgbWluaW11bSBhIGRpc2NsYWltZXIKLSAqICAgIHN1YnN0YW50aWFsbHkgc2ltaWxhciB0byB0aGUgIk5PIFdBUlJBTlRZIiBkaXNjbGFpbWVyIGJlbG93Ci0gKiAgICAoIkRpc2NsYWltZXIiKSBhbmQgYW55IHJlZGlzdHJpYnV0aW9uIG11c3QgYmUgY29uZGl0aW9uZWQgdXBvbgotICogICAgaW5jbHVkaW5nIGEgc3Vic3RhbnRpYWxseSBzaW1pbGFyIERpc2NsYWltZXIgcmVxdWlyZW1lbnQgZm9yIGZ1cnRoZXIKLSAqICAgIGJpbmFyeSByZWRpc3RyaWJ1dGlvbi4KLSAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcwotICogICAgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICogU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBOTyBXQVJSQU5UWQotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCi0gKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUwotICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcKLSAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQotICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgotICovCi0KLSNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KLSNpbmNsdWRlIDxhY3BpL2FjaW50ZXJwLmg+Ci0jaW5jbHVkZSA8YWNwaS9hbWxjb2RlLmg+Ci0jaW5jbHVkZSA8YWNwaS9hY25hbWVzcC5oPgotCi0jZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9FWEVDVVRFUgotQUNQSV9NT0RVTEVfTkFNRSgiZXhjcmVhdGUiKQotI2lmbmRlZiBBQ1BJX05PX01FVEhPRF9FWEVDVVRJT04KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfZXhfY3JlYXRlX2FsaWFzCi0gKgotICogUEFSQU1FVEVSUzogIHdhbGtfc3RhdGUgICAgICAgICAgIC0gQ3VycmVudCBzdGF0ZSwgY29udGFpbnMgb3BlcmFuZHMKLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IENyZWF0ZSBhIG5ldyBuYW1lZCBhbGlhcwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1hY3BpX3N0YXR1cyBhY3BpX2V4X2NyZWF0ZV9hbGlhcyhzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKQotewotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICp0YXJnZXRfbm9kZTsKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqYWxpYXNfbm9kZTsKLQlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UoZXhfY3JlYXRlX2FsaWFzKTsKLQotCS8qIEdldCB0aGUgc291cmNlL2FsaWFzIG9wZXJhbmRzIChib3RoIG5hbWVzcGFjZSBub2RlcykgKi8KLQotCWFsaWFzX25vZGUgPSAoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKil3YWxrX3N0YXRlLT5vcGVyYW5kc1swXTsKLQl0YXJnZXRfbm9kZSA9IChzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqKXdhbGtfc3RhdGUtPm9wZXJhbmRzWzFdOwotCi0JaWYgKCh0YXJnZXRfbm9kZS0+dHlwZSA9PSBBQ1BJX1RZUEVfTE9DQUxfQUxJQVMpIHx8Ci0JICAgICh0YXJnZXRfbm9kZS0+dHlwZSA9PSBBQ1BJX1RZUEVfTE9DQUxfTUVUSE9EX0FMSUFTKSkgewotCQkvKgotCQkgKiBEZXJlZmVyZW5jZSBhbiBleGlzdGluZyBhbGlhcyBzbyB0aGF0IHdlIGRvbid0IGNyZWF0ZSBhIGNoYWluCi0JCSAqIG9mIGFsaWFzZXMuICBXaXRoIHRoaXMgY29kZSwgd2UgZ3VhcmFudGVlIHRoYXQgYW4gYWxpYXMgaXMKLQkJICogYWx3YXlzIGV4YWN0bHkgb25lIGxldmVsIG9mIGluZGlyZWN0aW9uIGF3YXkgZnJvbSB0aGUKLQkJICogYWN0dWFsIGFsaWFzZWQgbmFtZS4KLQkJICovCi0JCXRhcmdldF9ub2RlID0KLQkJICAgIEFDUElfQ0FTVF9QVFIoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUsCi0JCQkJICB0YXJnZXRfbm9kZS0+b2JqZWN0KTsKLQl9Ci0KLQkvKgotCSAqIEZvciBvYmplY3RzIHRoYXQgY2FuIG5ldmVyIGNoYW5nZSAoaS5lLiwgdGhlIE5TIG5vZGUgd2lsbAotCSAqIHBlcm1hbmVudGx5IHBvaW50IHRvIHRoZSBzYW1lIG9iamVjdCksIHdlIGNhbiBzaW1wbHkgYXR0YWNoCi0JICogdGhlIG9iamVjdCB0byB0aGUgbmV3IE5TIG5vZGUuICBGb3Igb3RoZXIgb2JqZWN0cyAoc3VjaCBhcwotCSAqIEludGVnZXJzLCBidWZmZXJzLCBldGMuKSwgd2UgaGF2ZSB0byBwb2ludCB0aGUgQWxpYXMgbm9kZQotCSAqIHRvIHRoZSBvcmlnaW5hbCBOb2RlLgotCSAqLwotCXN3aXRjaCAodGFyZ2V0X25vZGUtPnR5cGUpIHsKLQotCQkvKiBGb3IgdGhlc2UgdHlwZXMsIHRoZSBzdWItb2JqZWN0IGNhbiBjaGFuZ2UgZHluYW1pY2FsbHkgdmlhIGEgU3RvcmUgKi8KLQotCWNhc2UgQUNQSV9UWVBFX0lOVEVHRVI6Ci0JY2FzZSBBQ1BJX1RZUEVfU1RSSU5HOgotCWNhc2UgQUNQSV9UWVBFX0JVRkZFUjoKLQljYXNlIEFDUElfVFlQRV9QQUNLQUdFOgotCWNhc2UgQUNQSV9UWVBFX0JVRkZFUl9GSUVMRDoKLQotCQkvKgotCQkgKiBUaGVzZSB0eXBlcyBvcGVuIGEgbmV3IHNjb3BlLCBzbyB3ZSBuZWVkIHRoZSBOUyBub2RlIGluIG9yZGVyIHRvIGFjY2VzcwotCQkgKiBhbnkgY2hpbGRyZW4uCi0JCSAqLwotCWNhc2UgQUNQSV9UWVBFX0RFVklDRToKLQljYXNlIEFDUElfVFlQRV9QT1dFUjoKLQljYXNlIEFDUElfVFlQRV9QUk9DRVNTT1I6Ci0JY2FzZSBBQ1BJX1RZUEVfVEhFUk1BTDoKLQljYXNlIEFDUElfVFlQRV9MT0NBTF9TQ09QRToKLQotCQkvKgotCQkgKiBUaGUgbmV3IGFsaWFzIGhhcyB0aGUgdHlwZSBBTElBUyBhbmQgcG9pbnRzIHRvIHRoZSBvcmlnaW5hbAotCQkgKiBOUyBub2RlLCBub3QgdGhlIG9iamVjdCBpdHNlbGYuCi0JCSAqLwotCQlhbGlhc19ub2RlLT50eXBlID0gQUNQSV9UWVBFX0xPQ0FMX0FMSUFTOwotCQlhbGlhc19ub2RlLT5vYmplY3QgPQotCQkgICAgQUNQSV9DQVNUX1BUUih1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0LCB0YXJnZXRfbm9kZSk7Ci0JCWJyZWFrOwotCi0JY2FzZSBBQ1BJX1RZUEVfTUVUSE9EOgotCi0JCS8qCi0JCSAqIENvbnRyb2wgbWV0aG9kIGFsaWFzZXMgbmVlZCB0byBiZSBkaWZmZXJlbnRpYXRlZAotCQkgKi8KLQkJYWxpYXNfbm9kZS0+dHlwZSA9IEFDUElfVFlQRV9MT0NBTF9NRVRIT0RfQUxJQVM7Ci0JCWFsaWFzX25vZGUtPm9iamVjdCA9Ci0JCSAgICBBQ1BJX0NBU1RfUFRSKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QsIHRhcmdldF9ub2RlKTsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCi0JCS8qIEF0dGFjaCB0aGUgb3JpZ2luYWwgc291cmNlIG9iamVjdCB0byB0aGUgbmV3IEFsaWFzIE5vZGUgKi8KLQotCQkvKgotCQkgKiBUaGUgbmV3IGFsaWFzIGFzc3VtZXMgdGhlIHR5cGUgb2YgdGhlIHRhcmdldCwgYW5kIGl0IHBvaW50cwotCQkgKiB0byB0aGUgc2FtZSBvYmplY3QuICBUaGUgcmVmZXJlbmNlIGNvdW50IG9mIHRoZSBvYmplY3QgaGFzIGFuCi0JCSAqIGFkZGl0aW9uYWwgcmVmZXJlbmNlIHRvIHByZXZlbnQgZGVsZXRpb24gb3V0IGZyb20gdW5kZXIgZWl0aGVyIHRoZQotCQkgKiB0YXJnZXQgbm9kZSBvciB0aGUgYWxpYXMgTm9kZQotCQkgKi8KLQkJc3RhdHVzID0gYWNwaV9uc19hdHRhY2hfb2JqZWN0KGFsaWFzX25vZGUsCi0JCQkJCSAgICAgICBhY3BpX25zX2dldF9hdHRhY2hlZF9vYmplY3QKLQkJCQkJICAgICAgICh0YXJnZXRfbm9kZSksCi0JCQkJCSAgICAgICB0YXJnZXRfbm9kZS0+dHlwZSk7Ci0JCWJyZWFrOwotCX0KLQotCS8qIFNpbmNlIGJvdGggb3BlcmFuZHMgYXJlIE5vZGVzLCB3ZSBkb24ndCBuZWVkIHRvIGRlbGV0ZSB0aGVtICovCi0KLQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9leF9jcmVhdGVfZXZlbnQKLSAqCi0gKiBQQVJBTUVURVJTOiAgd2Fsa19zdGF0ZSAgICAgICAgICAtIEN1cnJlbnQgc3RhdGUKLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IENyZWF0ZSBhIG5ldyBldmVudCBvYmplY3QKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1hY3BpX3N0YXR1cyBhY3BpX2V4X2NyZWF0ZV9ldmVudChzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKQotewotCWFjcGlfc3RhdHVzIHN0YXR1czsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYzsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UoZXhfY3JlYXRlX2V2ZW50KTsKLQotCW9ial9kZXNjID0gYWNwaV91dF9jcmVhdGVfaW50ZXJuYWxfb2JqZWN0KEFDUElfVFlQRV9FVkVOVCk7Ci0JaWYgKCFvYmpfZGVzYykgewotCQlzdGF0dXMgPSBBRV9OT19NRU1PUlk7Ci0JCWdvdG8gY2xlYW51cDsKLQl9Ci0KLQkvKgotCSAqIENyZWF0ZSB0aGUgYWN0dWFsIE9TIHNlbWFwaG9yZSwgd2l0aCB6ZXJvIGluaXRpYWwgdW5pdHMgLS0gbWVhbmluZwotCSAqIHRoYXQgdGhlIGV2ZW50IGlzIGNyZWF0ZWQgaW4gYW4gdW5zaWduYWxsZWQgc3RhdGUKLQkgKi8KLQlzdGF0dXMgPSBhY3BpX29zX2NyZWF0ZV9zZW1hcGhvcmUoQUNQSV9OT19VTklUX0xJTUlULCAwLAotCQkJCQkgICZvYmpfZGVzYy0+ZXZlbnQub3Nfc2VtYXBob3JlKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJZ290byBjbGVhbnVwOwotCX0KLQotCS8qIEF0dGFjaCBvYmplY3QgdG8gdGhlIE5vZGUgKi8KLQotCXN0YXR1cyA9Ci0JICAgIGFjcGlfbnNfYXR0YWNoX29iamVjdCgoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKil3YWxrX3N0YXRlLT4KLQkJCQkgIG9wZXJhbmRzWzBdLCBvYmpfZGVzYywgQUNQSV9UWVBFX0VWRU5UKTsKLQotICAgICAgY2xlYW51cDoKLQkvKgotCSAqIFJlbW92ZSBsb2NhbCByZWZlcmVuY2UgdG8gdGhlIG9iamVjdCAob24gZXJyb3IsIHdpbGwgY2F1c2UgZGVsZXRpb24KLQkgKiBvZiBib3RoIG9iamVjdCBhbmQgc2VtYXBob3JlIGlmIHByZXNlbnQuKQotCSAqLwotCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZShvYmpfZGVzYyk7Ci0JcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfZXhfY3JlYXRlX211dGV4Ci0gKgotICogUEFSQU1FVEVSUzogIHdhbGtfc3RhdGUgICAgICAgICAgLSBDdXJyZW50IHN0YXRlCi0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cwotICoKLSAqIERFU0NSSVBUSU9OOiBDcmVhdGUgYSBuZXcgbXV0ZXggb2JqZWN0Ci0gKgotICogICAgICAgICAgICAgIE11dGV4IChOYW1lWzBdLCBzeW5jX2xldmVsWzFdKQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWFjcGlfc3RhdHVzIGFjcGlfZXhfY3JlYXRlX211dGV4KHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUpCi17Ci0JYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2M7Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUihleF9jcmVhdGVfbXV0ZXgsIEFDUElfV0FMS19PUEVSQU5EUyk7Ci0KLQkvKiBDcmVhdGUgdGhlIG5ldyBtdXRleCBvYmplY3QgKi8KLQotCW9ial9kZXNjID0gYWNwaV91dF9jcmVhdGVfaW50ZXJuYWxfb2JqZWN0KEFDUElfVFlQRV9NVVRFWCk7Ci0JaWYgKCFvYmpfZGVzYykgewotCQlzdGF0dXMgPSBBRV9OT19NRU1PUlk7Ci0JCWdvdG8gY2xlYW51cDsKLQl9Ci0KLQkvKiBDcmVhdGUgdGhlIGFjdHVhbCBPUyBNdXRleCAqLwotCi0Jc3RhdHVzID0gYWNwaV9vc19jcmVhdGVfbXV0ZXgoJm9ial9kZXNjLT5tdXRleC5vc19tdXRleCk7Ci0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCWdvdG8gY2xlYW51cDsKLQl9Ci0KLQkvKiBJbml0IG9iamVjdCBhbmQgYXR0YWNoIHRvIE5TIG5vZGUgKi8KLQotCW9ial9kZXNjLT5tdXRleC5zeW5jX2xldmVsID0KLQkgICAgKHU4KSB3YWxrX3N0YXRlLT5vcGVyYW5kc1sxXS0+aW50ZWdlci52YWx1ZTsKLQlvYmpfZGVzYy0+bXV0ZXgubm9kZSA9Ci0JICAgIChzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqKXdhbGtfc3RhdGUtPm9wZXJhbmRzWzBdOwotCi0Jc3RhdHVzID0KLQkgICAgYWNwaV9uc19hdHRhY2hfb2JqZWN0KG9ial9kZXNjLT5tdXRleC5ub2RlLCBvYmpfZGVzYywKLQkJCQkgIEFDUElfVFlQRV9NVVRFWCk7Ci0KLSAgICAgIGNsZWFudXA6Ci0JLyoKLQkgKiBSZW1vdmUgbG9jYWwgcmVmZXJlbmNlIHRvIHRoZSBvYmplY3QgKG9uIGVycm9yLCB3aWxsIGNhdXNlIGRlbGV0aW9uCi0JICogb2YgYm90aCBvYmplY3QgYW5kIHNlbWFwaG9yZSBpZiBwcmVzZW50LikKLQkgKi8KLQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2Uob2JqX2Rlc2MpOwotCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X2NyZWF0ZV9yZWdpb24KLSAqCi0gKiBQQVJBTUVURVJTOiAgYW1sX3N0YXJ0ICAgICAgICAgICAtIFBvaW50ZXIgdG8gdGhlIHJlZ2lvbiBkZWNsYXJhdGlvbiBBTUwKLSAqICAgICAgICAgICAgICBhbWxfbGVuZ3RoICAgICAgICAgIC0gTWF4IGxlbmd0aCBvZiB0aGUgZGVjbGFyYXRpb24gQU1MCi0gKiAgICAgICAgICAgICAgcmVnaW9uX3NwYWNlICAgICAgICAtIHNwYWNlX2lEIGZvciB0aGUgcmVnaW9uCi0gKiAgICAgICAgICAgICAgd2Fsa19zdGF0ZSAgICAgICAgICAtIEN1cnJlbnQgc3RhdGUKLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IENyZWF0ZSBhIG5ldyBvcGVyYXRpb24gcmVnaW9uIG9iamVjdAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWFjcGlfc3RhdHVzCi1hY3BpX2V4X2NyZWF0ZV9yZWdpb24odTggKiBhbWxfc3RhcnQsCi0JCSAgICAgIHUzMiBhbWxfbGVuZ3RoLAotCQkgICAgICB1OCByZWdpb25fc3BhY2UsIHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUpCi17Ci0JYWNwaV9zdGF0dXMgc3RhdHVzOwotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjOwotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlOwotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnJlZ2lvbl9vYmoyOwotCi0JQUNQSV9GVU5DVElPTl9UUkFDRShleF9jcmVhdGVfcmVnaW9uKTsKLQotCS8qIEdldCB0aGUgTmFtZXNwYWNlIE5vZGUgKi8KLQotCW5vZGUgPSB3YWxrX3N0YXRlLT5vcC0+Y29tbW9uLm5vZGU7Ci0KLQkvKgotCSAqIElmIHRoZSByZWdpb24gb2JqZWN0IGlzIGFscmVhZHkgYXR0YWNoZWQgdG8gdGhpcyBub2RlLAotCSAqIGp1c3QgcmV0dXJuCi0JICovCi0JaWYgKGFjcGlfbnNfZ2V0X2F0dGFjaGVkX29iamVjdChub2RlKSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwotCX0KLQotCS8qCi0JICogU3BhY2UgSUQgbXVzdCBiZSBvbmUgb2YgdGhlIHByZWRlZmluZWQgSURzLCBvciBpbiB0aGUgdXNlci1kZWZpbmVkCi0JICogcmFuZ2UKLQkgKi8KLQlpZiAoKHJlZ2lvbl9zcGFjZSA+PSBBQ1BJX05VTV9QUkVERUZJTkVEX1JFR0lPTlMpICYmCi0JICAgIChyZWdpb25fc3BhY2UgPCBBQ1BJX1VTRVJfUkVHSU9OX0JFR0lOKSkgewotCQlBQ1BJX0VSUk9SKChBRV9JTkZPLCAiSW52YWxpZCBBZGRyZXNzU3BhY2UgdHlwZSAlWCIsCi0JCQkgICAgcmVnaW9uX3NwYWNlKSk7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfSU5WQUxJRF9TUEFDRV9JRCk7Ci0JfQotCi0JQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9MT0FELCAiUmVnaW9uIFR5cGUgLSAlcyAoJVgpXG4iLAotCQkJICBhY3BpX3V0X2dldF9yZWdpb25fbmFtZShyZWdpb25fc3BhY2UpLCByZWdpb25fc3BhY2UpKTsKLQotCS8qIENyZWF0ZSB0aGUgcmVnaW9uIGRlc2NyaXB0b3IgKi8KLQotCW9ial9kZXNjID0gYWNwaV91dF9jcmVhdGVfaW50ZXJuYWxfb2JqZWN0KEFDUElfVFlQRV9SRUdJT04pOwotCWlmICghb2JqX2Rlc2MpIHsKLQkJc3RhdHVzID0gQUVfTk9fTUVNT1JZOwotCQlnb3RvIGNsZWFudXA7Ci0JfQotCi0JLyoKLQkgKiBSZW1lbWJlciBsb2NhdGlvbiBpbiBBTUwgc3RyZWFtIG9mIGFkZHJlc3MgJiBsZW5ndGgKLQkgKiBvcGVyYW5kcyBzaW5jZSB0aGV5IG5lZWQgdG8gYmUgZXZhbHVhdGVkIGF0IHJ1biB0aW1lLgotCSAqLwotCXJlZ2lvbl9vYmoyID0gb2JqX2Rlc2MtPmNvbW1vbi5uZXh0X29iamVjdDsKLQlyZWdpb25fb2JqMi0+ZXh0cmEuYW1sX3N0YXJ0ID0gYW1sX3N0YXJ0OwotCXJlZ2lvbl9vYmoyLT5leHRyYS5hbWxfbGVuZ3RoID0gYW1sX2xlbmd0aDsKLQotCS8qIEluaXQgdGhlIHJlZ2lvbiBmcm9tIHRoZSBvcGVyYW5kcyAqLwotCi0Jb2JqX2Rlc2MtPnJlZ2lvbi5zcGFjZV9pZCA9IHJlZ2lvbl9zcGFjZTsKLQlvYmpfZGVzYy0+cmVnaW9uLmFkZHJlc3MgPSAwOwotCW9ial9kZXNjLT5yZWdpb24ubGVuZ3RoID0gMDsKLQlvYmpfZGVzYy0+cmVnaW9uLm5vZGUgPSBub2RlOwotCi0JLyogSW5zdGFsbCB0aGUgbmV3IHJlZ2lvbiBvYmplY3QgaW4gdGhlIHBhcmVudCBOb2RlICovCi0KLQlzdGF0dXMgPSBhY3BpX25zX2F0dGFjaF9vYmplY3Qobm9kZSwgb2JqX2Rlc2MsIEFDUElfVFlQRV9SRUdJT04pOwotCi0gICAgICBjbGVhbnVwOgotCi0JLyogUmVtb3ZlIGxvY2FsIHJlZmVyZW5jZSB0byB0aGUgb2JqZWN0ICovCi0KLQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2Uob2JqX2Rlc2MpOwotCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X2NyZWF0ZV9wcm9jZXNzb3IKLSAqCi0gKiBQQVJBTUVURVJTOiAgd2Fsa19zdGF0ZSAgICAgICAgICAtIEN1cnJlbnQgc3RhdGUKLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IENyZWF0ZSBhIG5ldyBwcm9jZXNzb3Igb2JqZWN0IGFuZCBwb3B1bGF0ZSB0aGUgZmllbGRzCi0gKgotICogICAgICAgICAgICAgIFByb2Nlc3NvciAoTmFtZVswXSwgY3B1X2lEWzFdLCBwYmxvY2tfYWRkclsyXSwgcGJsb2NrX2xlbmd0aFszXSkKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1hY3BpX3N0YXR1cyBhY3BpX2V4X2NyZWF0ZV9wcm9jZXNzb3Ioc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSkKLXsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICoqb3BlcmFuZCA9ICZ3YWxrX3N0YXRlLT5vcGVyYW5kc1swXTsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYzsKLQlhY3BpX3N0YXR1cyBzdGF0dXM7Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUihleF9jcmVhdGVfcHJvY2Vzc29yLCB3YWxrX3N0YXRlKTsKLQotCS8qIENyZWF0ZSB0aGUgcHJvY2Vzc29yIG9iamVjdCAqLwotCi0Jb2JqX2Rlc2MgPSBhY3BpX3V0X2NyZWF0ZV9pbnRlcm5hbF9vYmplY3QoQUNQSV9UWVBFX1BST0NFU1NPUik7Ci0JaWYgKCFvYmpfZGVzYykgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9fTUVNT1JZKTsKLQl9Ci0KLQkvKiBJbml0aWFsaXplIHRoZSBwcm9jZXNzb3Igb2JqZWN0IGZyb20gdGhlIG9wZXJhbmRzICovCi0KLQlvYmpfZGVzYy0+cHJvY2Vzc29yLnByb2NfaWQgPSAodTgpIG9wZXJhbmRbMV0tPmludGVnZXIudmFsdWU7Ci0Jb2JqX2Rlc2MtPnByb2Nlc3Nvci5sZW5ndGggPSAodTgpIG9wZXJhbmRbM10tPmludGVnZXIudmFsdWU7Ci0Jb2JqX2Rlc2MtPnByb2Nlc3Nvci5hZGRyZXNzID0KLQkgICAgKGFjcGlfaW9fYWRkcmVzcykgb3BlcmFuZFsyXS0+aW50ZWdlci52YWx1ZTsKLQotCS8qIEluc3RhbGwgdGhlIHByb2Nlc3NvciBvYmplY3QgaW4gdGhlIHBhcmVudCBOb2RlICovCi0KLQlzdGF0dXMgPSBhY3BpX25zX2F0dGFjaF9vYmplY3QoKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICopb3BlcmFuZFswXSwKLQkJCQkgICAgICAgb2JqX2Rlc2MsIEFDUElfVFlQRV9QUk9DRVNTT1IpOwotCi0JLyogUmVtb3ZlIGxvY2FsIHJlZmVyZW5jZSB0byB0aGUgb2JqZWN0ICovCi0KLQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2Uob2JqX2Rlc2MpOwotCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X2NyZWF0ZV9wb3dlcl9yZXNvdXJjZQotICoKLSAqIFBBUkFNRVRFUlM6ICB3YWxrX3N0YXRlICAgICAgICAgIC0gQ3VycmVudCBzdGF0ZQotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKLSAqCi0gKiBERVNDUklQVElPTjogQ3JlYXRlIGEgbmV3IHBvd2VyX3Jlc291cmNlIG9iamVjdCBhbmQgcG9wdWxhdGUgdGhlIGZpZWxkcwotICoKLSAqICAgICAgICAgICAgICBwb3dlcl9yZXNvdXJjZSAoTmFtZVswXSwgc3lzdGVtX2xldmVsWzFdLCByZXNvdXJjZV9vcmRlclsyXSkKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1hY3BpX3N0YXR1cyBhY3BpX2V4X2NyZWF0ZV9wb3dlcl9yZXNvdXJjZShzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKQotewotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKipvcGVyYW5kID0gJndhbGtfc3RhdGUtPm9wZXJhbmRzWzBdOwotCWFjcGlfc3RhdHVzIHN0YXR1czsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYzsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKGV4X2NyZWF0ZV9wb3dlcl9yZXNvdXJjZSwgd2Fsa19zdGF0ZSk7Ci0KLQkvKiBDcmVhdGUgdGhlIHBvd2VyIHJlc291cmNlIG9iamVjdCAqLwotCi0Jb2JqX2Rlc2MgPSBhY3BpX3V0X2NyZWF0ZV9pbnRlcm5hbF9vYmplY3QoQUNQSV9UWVBFX1BPV0VSKTsKLQlpZiAoIW9ial9kZXNjKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT19NRU1PUlkpOwotCX0KLQotCS8qIEluaXRpYWxpemUgdGhlIHBvd2VyIG9iamVjdCBmcm9tIHRoZSBvcGVyYW5kcyAqLwotCi0Jb2JqX2Rlc2MtPnBvd2VyX3Jlc291cmNlLnN5c3RlbV9sZXZlbCA9ICh1OCkgb3BlcmFuZFsxXS0+aW50ZWdlci52YWx1ZTsKLQlvYmpfZGVzYy0+cG93ZXJfcmVzb3VyY2UucmVzb3VyY2Vfb3JkZXIgPQotCSAgICAodTE2KSBvcGVyYW5kWzJdLT5pbnRlZ2VyLnZhbHVlOwotCi0JLyogSW5zdGFsbCB0aGUgIHBvd2VyIHJlc291cmNlIG9iamVjdCBpbiB0aGUgcGFyZW50IE5vZGUgKi8KLQotCXN0YXR1cyA9IGFjcGlfbnNfYXR0YWNoX29iamVjdCgoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKilvcGVyYW5kWzBdLAotCQkJCSAgICAgICBvYmpfZGVzYywgQUNQSV9UWVBFX1BPV0VSKTsKLQotCS8qIFJlbW92ZSBsb2NhbCByZWZlcmVuY2UgdG8gdGhlIG9iamVjdCAqLwotCi0JYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKG9ial9kZXNjKTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLX0KLSNlbmRpZgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X2NyZWF0ZV9tZXRob2QKLSAqCi0gKiBQQVJBTUVURVJTOiAgYW1sX3N0YXJ0ICAgICAgIC0gRmlyc3QgYnl0ZSBvZiB0aGUgbWV0aG9kJ3MgQU1MCi0gKiAgICAgICAgICAgICAgYW1sX2xlbmd0aCAgICAgIC0gQU1MIGJ5dGUgY291bnQgZm9yIHRoaXMgbWV0aG9kCi0gKiAgICAgICAgICAgICAgd2Fsa19zdGF0ZSAgICAgIC0gQ3VycmVudCBzdGF0ZQotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKLSAqCi0gKiBERVNDUklQVElPTjogQ3JlYXRlIGEgbmV3IG1ldGhvZCBvYmplY3QKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1hY3BpX3N0YXR1cwotYWNwaV9leF9jcmVhdGVfbWV0aG9kKHU4ICogYW1sX3N0YXJ0LAotCQkgICAgICB1MzIgYW1sX2xlbmd0aCwgc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSkKLXsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICoqb3BlcmFuZCA9ICZ3YWxrX3N0YXRlLT5vcGVyYW5kc1swXTsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYzsKLQlhY3BpX3N0YXR1cyBzdGF0dXM7Ci0JdTggbWV0aG9kX2ZsYWdzOwotCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIoZXhfY3JlYXRlX21ldGhvZCwgd2Fsa19zdGF0ZSk7Ci0KLQkvKiBDcmVhdGUgYSBuZXcgbWV0aG9kIG9iamVjdCAqLwotCi0Jb2JqX2Rlc2MgPSBhY3BpX3V0X2NyZWF0ZV9pbnRlcm5hbF9vYmplY3QoQUNQSV9UWVBFX01FVEhPRCk7Ci0JaWYgKCFvYmpfZGVzYykgewotCQlzdGF0dXMgPSBBRV9OT19NRU1PUlk7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0KLQkvKiBTYXZlIHRoZSBtZXRob2QncyBBTUwgcG9pbnRlciBhbmQgbGVuZ3RoICAqLwotCi0Jb2JqX2Rlc2MtPm1ldGhvZC5hbWxfc3RhcnQgPSBhbWxfc3RhcnQ7Ci0Jb2JqX2Rlc2MtPm1ldGhvZC5hbWxfbGVuZ3RoID0gYW1sX2xlbmd0aDsKLQotCS8qCi0JICogRGlzYXNzZW1ibGUgdGhlIG1ldGhvZCBmbGFncy4gU3BsaXQgb2ZmIHRoZSBBcmcgQ291bnQKLQkgKiBmb3IgZWZmaWNpZW5jeQotCSAqLwotCW1ldGhvZF9mbGFncyA9ICh1OCkgb3BlcmFuZFsxXS0+aW50ZWdlci52YWx1ZTsKLQotCW9ial9kZXNjLT5tZXRob2QubWV0aG9kX2ZsYWdzID0KLQkgICAgKHU4KSAobWV0aG9kX2ZsYWdzICYgfkFNTF9NRVRIT0RfQVJHX0NPVU5UKTsKLQlvYmpfZGVzYy0+bWV0aG9kLnBhcmFtX2NvdW50ID0KLQkgICAgKHU4KSAobWV0aG9kX2ZsYWdzICYgQU1MX01FVEhPRF9BUkdfQ09VTlQpOwotCi0JLyoKLQkgKiBHZXQgdGhlIHN5bmNfbGV2ZWwuIElmIG1ldGhvZCBpcyBzZXJpYWxpemVkLCBhIG11dGV4IHdpbGwgYmUKLQkgKiBjcmVhdGVkIGZvciB0aGlzIG1ldGhvZCB3aGVuIGl0IGlzIHBhcnNlZC4KLQkgKi8KLQlpZiAobWV0aG9kX2ZsYWdzICYgQU1MX01FVEhPRF9TRVJJQUxJWkVEKSB7Ci0JCS8qCi0JCSAqIEFDUEkgMS4wOiBzeW5jX2xldmVsID0gMAotCQkgKiBBQ1BJIDIuMDogc3luY19sZXZlbCA9IHN5bmNfbGV2ZWwgaW4gbWV0aG9kIGRlY2xhcmF0aW9uCi0JCSAqLwotCQlvYmpfZGVzYy0+bWV0aG9kLnN5bmNfbGV2ZWwgPSAodTgpCi0JCSAgICAoKG1ldGhvZF9mbGFncyAmIEFNTF9NRVRIT0RfU1lOQ0hfTEVWRUwpID4+IDQpOwotCX0KLQotCS8qIEF0dGFjaCB0aGUgbmV3IG9iamVjdCB0byB0aGUgbWV0aG9kIE5vZGUgKi8KLQotCXN0YXR1cyA9IGFjcGlfbnNfYXR0YWNoX29iamVjdCgoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKilvcGVyYW5kWzBdLAotCQkJCSAgICAgICBvYmpfZGVzYywgQUNQSV9UWVBFX01FVEhPRCk7Ci0KLQkvKiBSZW1vdmUgbG9jYWwgcmVmZXJlbmNlIHRvIHRoZSBvYmplY3QgKi8KLQotCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZShvYmpfZGVzYyk7Ci0KLSAgICAgIGV4aXQ6Ci0JLyogUmVtb3ZlIGEgcmVmZXJlbmNlIHRvIHRoZSBvcGVyYW5kICovCi0KLQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2Uob3BlcmFuZFsxXSk7Ci0JcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhkdW1wLmMgYi9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhkdW1wLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwODdhN2QuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4ZHVtcC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTA1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogTW9kdWxlIE5hbWU6IGV4ZHVtcCAtIEludGVycHJldGVyIGRlYnVnIG91dHB1dCByb3V0aW5lcwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDgsIEludGVsIENvcnAuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCi0gKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSBhdCBtaW5pbXVtIGEgZGlzY2xhaW1lcgotICogICAgc3Vic3RhbnRpYWxseSBzaW1pbGFyIHRvIHRoZSAiTk8gV0FSUkFOVFkiIGRpc2NsYWltZXIgYmVsb3cKLSAqICAgICgiRGlzY2xhaW1lciIpIGFuZCBhbnkgcmVkaXN0cmlidXRpb24gbXVzdCBiZSBjb25kaXRpb25lZCB1cG9uCi0gKiAgICBpbmNsdWRpbmcgYSBzdWJzdGFudGlhbGx5IHNpbWlsYXIgRGlzY2xhaW1lciByZXF1aXJlbWVudCBmb3IgZnVydGhlcgotICogICAgYmluYXJ5IHJlZGlzdHJpYnV0aW9uLgotICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzCi0gKiAgICBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIE5PIFdBUlJBTlRZCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKLSAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCi0gKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORwotICogSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCi0gKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCi0gKi8KLQotI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgotI2luY2x1ZGUgPGFjcGkvYWNpbnRlcnAuaD4KLSNpbmNsdWRlIDxhY3BpL2FtbGNvZGUuaD4KLSNpbmNsdWRlIDxhY3BpL2FjbmFtZXNwLmg+Ci0KLSNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX0VYRUNVVEVSCi1BQ1BJX01PRFVMRV9OQU1FKCJleGR1bXAiKQotCi0vKgotICogVGhlIGZvbGxvd2luZyByb3V0aW5lcyBhcmUgdXNlZCBmb3IgZGVidWcgb3V0cHV0IG9ubHkKLSAqLwotI2lmIGRlZmluZWQoQUNQSV9ERUJVR19PVVRQVVQpIHx8IGRlZmluZWQoQUNQSV9ERUJVR0dFUikKLS8qIExvY2FsIHByb3RvdHlwZXMgKi8KLXN0YXRpYyB2b2lkIGFjcGlfZXhfb3V0X3N0cmluZyhjaGFyICp0aXRsZSwgY2hhciAqdmFsdWUpOwotCi1zdGF0aWMgdm9pZCBhY3BpX2V4X291dF9wb2ludGVyKGNoYXIgKnRpdGxlLCB2b2lkICp2YWx1ZSk7Ci0KLXN0YXRpYyB2b2lkCi1hY3BpX2V4X2R1bXBfb2JqZWN0KHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjLAotCQkgICAgc3RydWN0IGFjcGlfZXhkdW1wX2luZm8gKmluZm8pOwotCi1zdGF0aWMgdm9pZCBhY3BpX2V4X2R1bXBfcmVmZXJlbmNlX29iaih1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYyk7Ci0KLXN0YXRpYyB2b2lkCi1hY3BpX2V4X2R1bXBfcGFja2FnZV9vYmoodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2MsCi0JCQkgdTMyIGxldmVsLCB1MzIgaW5kZXgpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIE9iamVjdCBEZXNjcmlwdG9yIGluZm8gdGFibGVzCi0gKgotICogTm90ZTogVGhlIGZpcnN0IHRhYmxlIGVudHJ5IG11c3QgYmUgYW4gSU5JVCBvcGNvZGUgYW5kIG11c3QgY29udGFpbgotICogdGhlIHRhYmxlIGxlbmd0aCAobnVtYmVyIG9mIHRhYmxlIGVudHJpZXMpCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIHN0cnVjdCBhY3BpX2V4ZHVtcF9pbmZvIGFjcGlfZXhfZHVtcF9pbnRlZ2VyWzJdID0gewotCXtBQ1BJX0VYRF9JTklULCBBQ1BJX0VYRF9UQUJMRV9TSVpFKGFjcGlfZXhfZHVtcF9pbnRlZ2VyKSwgTlVMTH0sCi0Je0FDUElfRVhEX1VJTlQ2NCwgQUNQSV9FWERfT0ZGU0VUKGludGVnZXIudmFsdWUpLCAiVmFsdWUifQotfTsKLQotc3RhdGljIHN0cnVjdCBhY3BpX2V4ZHVtcF9pbmZvIGFjcGlfZXhfZHVtcF9zdHJpbmdbNF0gPSB7Ci0Je0FDUElfRVhEX0lOSVQsIEFDUElfRVhEX1RBQkxFX1NJWkUoYWNwaV9leF9kdW1wX3N0cmluZyksIE5VTEx9LAotCXtBQ1BJX0VYRF9VSU5UMzIsIEFDUElfRVhEX09GRlNFVChzdHJpbmcubGVuZ3RoKSwgIkxlbmd0aCJ9LAotCXtBQ1BJX0VYRF9QT0lOVEVSLCBBQ1BJX0VYRF9PRkZTRVQoc3RyaW5nLnBvaW50ZXIpLCAiUG9pbnRlciJ9LAotCXtBQ1BJX0VYRF9TVFJJTkcsIDAsIE5VTEx9Ci19OwotCi1zdGF0aWMgc3RydWN0IGFjcGlfZXhkdW1wX2luZm8gYWNwaV9leF9kdW1wX2J1ZmZlcls1XSA9IHsKLQl7QUNQSV9FWERfSU5JVCwgQUNQSV9FWERfVEFCTEVfU0laRShhY3BpX2V4X2R1bXBfYnVmZmVyKSwgTlVMTH0sCi0Je0FDUElfRVhEX1VJTlQzMiwgQUNQSV9FWERfT0ZGU0VUKGJ1ZmZlci5sZW5ndGgpLCAiTGVuZ3RoIn0sCi0Je0FDUElfRVhEX1BPSU5URVIsIEFDUElfRVhEX09GRlNFVChidWZmZXIucG9pbnRlciksICJQb2ludGVyIn0sCi0Je0FDUElfRVhEX1BPSU5URVIsIEFDUElfRVhEX09GRlNFVChidWZmZXIubm9kZSksICJQYXJlbnQgTm9kZSJ9LAotCXtBQ1BJX0VYRF9CVUZGRVIsIDAsIE5VTEx9Ci19OwotCi1zdGF0aWMgc3RydWN0IGFjcGlfZXhkdW1wX2luZm8gYWNwaV9leF9kdW1wX3BhY2thZ2VbNV0gPSB7Ci0Je0FDUElfRVhEX0lOSVQsIEFDUElfRVhEX1RBQkxFX1NJWkUoYWNwaV9leF9kdW1wX3BhY2thZ2UpLCBOVUxMfSwKLQl7QUNQSV9FWERfVUlOVDgsIEFDUElfRVhEX09GRlNFVChwYWNrYWdlLmZsYWdzKSwgIkZsYWdzIn0sCi0Je0FDUElfRVhEX1VJTlQzMiwgQUNQSV9FWERfT0ZGU0VUKHBhY2thZ2UuY291bnQpLCAiRWxlbWVudHMifSwKLQl7QUNQSV9FWERfUE9JTlRFUiwgQUNQSV9FWERfT0ZGU0VUKHBhY2thZ2UuZWxlbWVudHMpLCAiRWxlbWVudCBMaXN0In0sCi0Je0FDUElfRVhEX1BBQ0tBR0UsIDAsIE5VTEx9Ci19OwotCi1zdGF0aWMgc3RydWN0IGFjcGlfZXhkdW1wX2luZm8gYWNwaV9leF9kdW1wX2RldmljZVs0XSA9IHsKLQl7QUNQSV9FWERfSU5JVCwgQUNQSV9FWERfVEFCTEVfU0laRShhY3BpX2V4X2R1bXBfZGV2aWNlKSwgTlVMTH0sCi0Je0FDUElfRVhEX1BPSU5URVIsIEFDUElfRVhEX09GRlNFVChkZXZpY2UuaGFuZGxlciksICJIYW5kbGVyIn0sCi0Je0FDUElfRVhEX1BPSU5URVIsIEFDUElfRVhEX09GRlNFVChkZXZpY2Uuc3lzdGVtX25vdGlmeSksCi0JICJTeXN0ZW0gTm90aWZ5In0sCi0Je0FDUElfRVhEX1BPSU5URVIsIEFDUElfRVhEX09GRlNFVChkZXZpY2UuZGV2aWNlX25vdGlmeSksCi0JICJEZXZpY2UgTm90aWZ5In0KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYWNwaV9leGR1bXBfaW5mbyBhY3BpX2V4X2R1bXBfZXZlbnRbMl0gPSB7Ci0Je0FDUElfRVhEX0lOSVQsIEFDUElfRVhEX1RBQkxFX1NJWkUoYWNwaV9leF9kdW1wX2V2ZW50KSwgTlVMTH0sCi0Je0FDUElfRVhEX1BPSU5URVIsIEFDUElfRVhEX09GRlNFVChldmVudC5vc19zZW1hcGhvcmUpLCAiT3NTZW1hcGhvcmUifQotfTsKLQotc3RhdGljIHN0cnVjdCBhY3BpX2V4ZHVtcF9pbmZvIGFjcGlfZXhfZHVtcF9tZXRob2RbOF0gPSB7Ci0Je0FDUElfRVhEX0lOSVQsIEFDUElfRVhEX1RBQkxFX1NJWkUoYWNwaV9leF9kdW1wX21ldGhvZCksIE5VTEx9LAotCXtBQ1BJX0VYRF9VSU5UOCwgQUNQSV9FWERfT0ZGU0VUKG1ldGhvZC5wYXJhbV9jb3VudCksICJQYXJhbUNvdW50In0sCi0Je0FDUElfRVhEX1VJTlQ4LCBBQ1BJX0VYRF9PRkZTRVQobWV0aG9kLnN5bmNfbGV2ZWwpLCAiU3luYyBMZXZlbCJ9LAotCXtBQ1BJX0VYRF9QT0lOVEVSLCBBQ1BJX0VYRF9PRkZTRVQobWV0aG9kLm11dGV4KSwgIk11dGV4In0sCi0Je0FDUElfRVhEX1VJTlQ4LCBBQ1BJX0VYRF9PRkZTRVQobWV0aG9kLm93bmVyX2lkKSwgIk93bmVyIElkIn0sCi0Je0FDUElfRVhEX1VJTlQ4LCBBQ1BJX0VYRF9PRkZTRVQobWV0aG9kLnRocmVhZF9jb3VudCksICJUaHJlYWQgQ291bnQifSwKLQl7QUNQSV9FWERfVUlOVDMyLCBBQ1BJX0VYRF9PRkZTRVQobWV0aG9kLmFtbF9sZW5ndGgpLCAiQW1sIExlbmd0aCJ9LAotCXtBQ1BJX0VYRF9QT0lOVEVSLCBBQ1BJX0VYRF9PRkZTRVQobWV0aG9kLmFtbF9zdGFydCksICJBbWwgU3RhcnQifQotfTsKLQotc3RhdGljIHN0cnVjdCBhY3BpX2V4ZHVtcF9pbmZvIGFjcGlfZXhfZHVtcF9tdXRleFs1XSA9IHsKLQl7QUNQSV9FWERfSU5JVCwgQUNQSV9FWERfVEFCTEVfU0laRShhY3BpX2V4X2R1bXBfbXV0ZXgpLCBOVUxMfSwKLQl7QUNQSV9FWERfVUlOVDgsIEFDUElfRVhEX09GRlNFVChtdXRleC5zeW5jX2xldmVsKSwgIlN5bmMgTGV2ZWwifSwKLQl7QUNQSV9FWERfUE9JTlRFUiwgQUNQSV9FWERfT0ZGU0VUKG11dGV4Lm93bmVyX3RocmVhZCksICJPd25lciBUaHJlYWQifSwKLQl7QUNQSV9FWERfVUlOVDE2LCBBQ1BJX0VYRF9PRkZTRVQobXV0ZXguYWNxdWlzaXRpb25fZGVwdGgpLAotCSAiQWNxdWlyZSBEZXB0aCJ9LAotCXtBQ1BJX0VYRF9QT0lOVEVSLCBBQ1BJX0VYRF9PRkZTRVQobXV0ZXgub3NfbXV0ZXgpLCAiT3NNdXRleCJ9Ci19OwotCi1zdGF0aWMgc3RydWN0IGFjcGlfZXhkdW1wX2luZm8gYWNwaV9leF9kdW1wX3JlZ2lvbls3XSA9IHsKLQl7QUNQSV9FWERfSU5JVCwgQUNQSV9FWERfVEFCTEVfU0laRShhY3BpX2V4X2R1bXBfcmVnaW9uKSwgTlVMTH0sCi0Je0FDUElfRVhEX1VJTlQ4LCBBQ1BJX0VYRF9PRkZTRVQocmVnaW9uLnNwYWNlX2lkKSwgIlNwYWNlIElkIn0sCi0Je0FDUElfRVhEX1VJTlQ4LCBBQ1BJX0VYRF9PRkZTRVQocmVnaW9uLmZsYWdzKSwgIkZsYWdzIn0sCi0Je0FDUElfRVhEX0FERFJFU1MsIEFDUElfRVhEX09GRlNFVChyZWdpb24uYWRkcmVzcyksICJBZGRyZXNzIn0sCi0Je0FDUElfRVhEX1VJTlQzMiwgQUNQSV9FWERfT0ZGU0VUKHJlZ2lvbi5sZW5ndGgpLCAiTGVuZ3RoIn0sCi0Je0FDUElfRVhEX1BPSU5URVIsIEFDUElfRVhEX09GRlNFVChyZWdpb24uaGFuZGxlciksICJIYW5kbGVyIn0sCi0Je0FDUElfRVhEX1BPSU5URVIsIEFDUElfRVhEX09GRlNFVChyZWdpb24ubmV4dCksICJOZXh0In0KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYWNwaV9leGR1bXBfaW5mbyBhY3BpX2V4X2R1bXBfcG93ZXJbNV0gPSB7Ci0Je0FDUElfRVhEX0lOSVQsIEFDUElfRVhEX1RBQkxFX1NJWkUoYWNwaV9leF9kdW1wX3Bvd2VyKSwgTlVMTH0sCi0Je0FDUElfRVhEX1VJTlQzMiwgQUNQSV9FWERfT0ZGU0VUKHBvd2VyX3Jlc291cmNlLnN5c3RlbV9sZXZlbCksCi0JICJTeXN0ZW0gTGV2ZWwifSwKLQl7QUNQSV9FWERfVUlOVDMyLCBBQ1BJX0VYRF9PRkZTRVQocG93ZXJfcmVzb3VyY2UucmVzb3VyY2Vfb3JkZXIpLAotCSAiUmVzb3VyY2UgT3JkZXIifSwKLQl7QUNQSV9FWERfUE9JTlRFUiwgQUNQSV9FWERfT0ZGU0VUKHBvd2VyX3Jlc291cmNlLnN5c3RlbV9ub3RpZnkpLAotCSAiU3lzdGVtIE5vdGlmeSJ9LAotCXtBQ1BJX0VYRF9QT0lOVEVSLCBBQ1BJX0VYRF9PRkZTRVQocG93ZXJfcmVzb3VyY2UuZGV2aWNlX25vdGlmeSksCi0JICJEZXZpY2UgTm90aWZ5In0KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYWNwaV9leGR1bXBfaW5mbyBhY3BpX2V4X2R1bXBfcHJvY2Vzc29yWzddID0gewotCXtBQ1BJX0VYRF9JTklULCBBQ1BJX0VYRF9UQUJMRV9TSVpFKGFjcGlfZXhfZHVtcF9wcm9jZXNzb3IpLCBOVUxMfSwKLQl7QUNQSV9FWERfVUlOVDgsIEFDUElfRVhEX09GRlNFVChwcm9jZXNzb3IucHJvY19pZCksICJQcm9jZXNzb3IgSUQifSwKLQl7QUNQSV9FWERfVUlOVDgsIEFDUElfRVhEX09GRlNFVChwcm9jZXNzb3IubGVuZ3RoKSwgIkxlbmd0aCJ9LAotCXtBQ1BJX0VYRF9BRERSRVNTLCBBQ1BJX0VYRF9PRkZTRVQocHJvY2Vzc29yLmFkZHJlc3MpLCAiQWRkcmVzcyJ9LAotCXtBQ1BJX0VYRF9QT0lOVEVSLCBBQ1BJX0VYRF9PRkZTRVQocHJvY2Vzc29yLnN5c3RlbV9ub3RpZnkpLAotCSAiU3lzdGVtIE5vdGlmeSJ9LAotCXtBQ1BJX0VYRF9QT0lOVEVSLCBBQ1BJX0VYRF9PRkZTRVQocHJvY2Vzc29yLmRldmljZV9ub3RpZnkpLAotCSAiRGV2aWNlIE5vdGlmeSJ9LAotCXtBQ1BJX0VYRF9QT0lOVEVSLCBBQ1BJX0VYRF9PRkZTRVQocHJvY2Vzc29yLmhhbmRsZXIpLCAiSGFuZGxlciJ9Ci19OwotCi1zdGF0aWMgc3RydWN0IGFjcGlfZXhkdW1wX2luZm8gYWNwaV9leF9kdW1wX3RoZXJtYWxbNF0gPSB7Ci0Je0FDUElfRVhEX0lOSVQsIEFDUElfRVhEX1RBQkxFX1NJWkUoYWNwaV9leF9kdW1wX3RoZXJtYWwpLCBOVUxMfSwKLQl7QUNQSV9FWERfUE9JTlRFUiwgQUNQSV9FWERfT0ZGU0VUKHRoZXJtYWxfem9uZS5zeXN0ZW1fbm90aWZ5KSwKLQkgIlN5c3RlbSBOb3RpZnkifSwKLQl7QUNQSV9FWERfUE9JTlRFUiwgQUNQSV9FWERfT0ZGU0VUKHRoZXJtYWxfem9uZS5kZXZpY2Vfbm90aWZ5KSwKLQkgIkRldmljZSBOb3RpZnkifSwKLQl7QUNQSV9FWERfUE9JTlRFUiwgQUNQSV9FWERfT0ZGU0VUKHRoZXJtYWxfem9uZS5oYW5kbGVyKSwgIkhhbmRsZXIifQotfTsKLQotc3RhdGljIHN0cnVjdCBhY3BpX2V4ZHVtcF9pbmZvIGFjcGlfZXhfZHVtcF9idWZmZXJfZmllbGRbM10gPSB7Ci0Je0FDUElfRVhEX0lOSVQsIEFDUElfRVhEX1RBQkxFX1NJWkUoYWNwaV9leF9kdW1wX2J1ZmZlcl9maWVsZCksIE5VTEx9LAotCXtBQ1BJX0VYRF9GSUVMRCwgMCwgTlVMTH0sCi0Je0FDUElfRVhEX1BPSU5URVIsIEFDUElfRVhEX09GRlNFVChidWZmZXJfZmllbGQuYnVmZmVyX29iaiksCi0JICJCdWZmZXIgT2JqZWN0In0KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYWNwaV9leGR1bXBfaW5mbyBhY3BpX2V4X2R1bXBfcmVnaW9uX2ZpZWxkWzNdID0gewotCXtBQ1BJX0VYRF9JTklULCBBQ1BJX0VYRF9UQUJMRV9TSVpFKGFjcGlfZXhfZHVtcF9yZWdpb25fZmllbGQpLCBOVUxMfSwKLQl7QUNQSV9FWERfRklFTEQsIDAsIE5VTEx9LAotCXtBQ1BJX0VYRF9QT0lOVEVSLCBBQ1BJX0VYRF9PRkZTRVQoZmllbGQucmVnaW9uX29iaiksICJSZWdpb24gT2JqZWN0In0KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYWNwaV9leGR1bXBfaW5mbyBhY3BpX2V4X2R1bXBfYmFua19maWVsZFs1XSA9IHsKLQl7QUNQSV9FWERfSU5JVCwgQUNQSV9FWERfVEFCTEVfU0laRShhY3BpX2V4X2R1bXBfYmFua19maWVsZCksIE5VTEx9LAotCXtBQ1BJX0VYRF9GSUVMRCwgMCwgTlVMTH0sCi0Je0FDUElfRVhEX1VJTlQzMiwgQUNQSV9FWERfT0ZGU0VUKGJhbmtfZmllbGQudmFsdWUpLCAiVmFsdWUifSwKLQl7QUNQSV9FWERfUE9JTlRFUiwgQUNQSV9FWERfT0ZGU0VUKGJhbmtfZmllbGQucmVnaW9uX29iaiksCi0JICJSZWdpb24gT2JqZWN0In0sCi0Je0FDUElfRVhEX1BPSU5URVIsIEFDUElfRVhEX09GRlNFVChiYW5rX2ZpZWxkLmJhbmtfb2JqKSwgIkJhbmsgT2JqZWN0In0KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYWNwaV9leGR1bXBfaW5mbyBhY3BpX2V4X2R1bXBfaW5kZXhfZmllbGRbNV0gPSB7Ci0Je0FDUElfRVhEX0lOSVQsIEFDUElfRVhEX1RBQkxFX1NJWkUoYWNwaV9leF9kdW1wX2JhbmtfZmllbGQpLCBOVUxMfSwKLQl7QUNQSV9FWERfRklFTEQsIDAsIE5VTEx9LAotCXtBQ1BJX0VYRF9VSU5UMzIsIEFDUElfRVhEX09GRlNFVChpbmRleF9maWVsZC52YWx1ZSksICJWYWx1ZSJ9LAotCXtBQ1BJX0VYRF9QT0lOVEVSLCBBQ1BJX0VYRF9PRkZTRVQoaW5kZXhfZmllbGQuaW5kZXhfb2JqKSwKLQkgIkluZGV4IE9iamVjdCJ9LAotCXtBQ1BJX0VYRF9QT0lOVEVSLCBBQ1BJX0VYRF9PRkZTRVQoaW5kZXhfZmllbGQuZGF0YV9vYmopLCAiRGF0YSBPYmplY3QifQotfTsKLQotc3RhdGljIHN0cnVjdCBhY3BpX2V4ZHVtcF9pbmZvIGFjcGlfZXhfZHVtcF9yZWZlcmVuY2VbOF0gPSB7Ci0Je0FDUElfRVhEX0lOSVQsIEFDUElfRVhEX1RBQkxFX1NJWkUoYWNwaV9leF9kdW1wX3JlZmVyZW5jZSksIE5VTEx9LAotCXtBQ1BJX0VYRF9VSU5UOCwgQUNQSV9FWERfT0ZGU0VUKHJlZmVyZW5jZS5jbGFzcyksICJDbGFzcyJ9LAotCXtBQ1BJX0VYRF9VSU5UOCwgQUNQSV9FWERfT0ZGU0VUKHJlZmVyZW5jZS50YXJnZXRfdHlwZSksICJUYXJnZXQgVHlwZSJ9LAotCXtBQ1BJX0VYRF9VSU5UMzIsIEFDUElfRVhEX09GRlNFVChyZWZlcmVuY2UudmFsdWUpLCAiVmFsdWUifSwKLQl7QUNQSV9FWERfUE9JTlRFUiwgQUNQSV9FWERfT0ZGU0VUKHJlZmVyZW5jZS5vYmplY3QpLCAiT2JqZWN0IERlc2MifSwKLQl7QUNQSV9FWERfUE9JTlRFUiwgQUNQSV9FWERfT0ZGU0VUKHJlZmVyZW5jZS5ub2RlKSwgIk5vZGUifSwKLQl7QUNQSV9FWERfUE9JTlRFUiwgQUNQSV9FWERfT0ZGU0VUKHJlZmVyZW5jZS53aGVyZSksICJXaGVyZSJ9LAotCXtBQ1BJX0VYRF9SRUZFUkVOQ0UsIDAsIE5VTEx9Ci19OwotCi1zdGF0aWMgc3RydWN0IGFjcGlfZXhkdW1wX2luZm8gYWNwaV9leF9kdW1wX2FkZHJlc3NfaGFuZGxlcls2XSA9IHsKLQl7QUNQSV9FWERfSU5JVCwgQUNQSV9FWERfVEFCTEVfU0laRShhY3BpX2V4X2R1bXBfYWRkcmVzc19oYW5kbGVyKSwKLQkgTlVMTH0sCi0Je0FDUElfRVhEX1VJTlQ4LCBBQ1BJX0VYRF9PRkZTRVQoYWRkcmVzc19zcGFjZS5zcGFjZV9pZCksICJTcGFjZSBJZCJ9LAotCXtBQ1BJX0VYRF9QT0lOVEVSLCBBQ1BJX0VYRF9PRkZTRVQoYWRkcmVzc19zcGFjZS5uZXh0KSwgIk5leHQifSwKLQl7QUNQSV9FWERfUE9JTlRFUiwgQUNQSV9FWERfT0ZGU0VUKGFkZHJlc3Nfc3BhY2UucmVnaW9uX2xpc3QpLAotCSAiUmVnaW9uIExpc3QifSwKLQl7QUNQSV9FWERfUE9JTlRFUiwgQUNQSV9FWERfT0ZGU0VUKGFkZHJlc3Nfc3BhY2Uubm9kZSksICJOb2RlIn0sCi0Je0FDUElfRVhEX1BPSU5URVIsIEFDUElfRVhEX09GRlNFVChhZGRyZXNzX3NwYWNlLmNvbnRleHQpLCAiQ29udGV4dCJ9Ci19OwotCi1zdGF0aWMgc3RydWN0IGFjcGlfZXhkdW1wX2luZm8gYWNwaV9leF9kdW1wX25vdGlmeVszXSA9IHsKLQl7QUNQSV9FWERfSU5JVCwgQUNQSV9FWERfVEFCTEVfU0laRShhY3BpX2V4X2R1bXBfbm90aWZ5KSwgTlVMTH0sCi0Je0FDUElfRVhEX1BPSU5URVIsIEFDUElfRVhEX09GRlNFVChub3RpZnkubm9kZSksICJOb2RlIn0sCi0Je0FDUElfRVhEX1BPSU5URVIsIEFDUElfRVhEX09GRlNFVChub3RpZnkuY29udGV4dCksICJDb250ZXh0In0KLX07Ci0KLS8qIE1pc2NlbGxhbmVvdXMgdGFibGVzICovCi0KLXN0YXRpYyBzdHJ1Y3QgYWNwaV9leGR1bXBfaW5mbyBhY3BpX2V4X2R1bXBfY29tbW9uWzRdID0gewotCXtBQ1BJX0VYRF9JTklULCBBQ1BJX0VYRF9UQUJMRV9TSVpFKGFjcGlfZXhfZHVtcF9jb21tb24pLCBOVUxMfSwKLQl7QUNQSV9FWERfVFlQRSwgMCwgTlVMTH0sCi0Je0FDUElfRVhEX1VJTlQxNiwgQUNQSV9FWERfT0ZGU0VUKGNvbW1vbi5yZWZlcmVuY2VfY291bnQpLAotCSAiUmVmZXJlbmNlIENvdW50In0sCi0Je0FDUElfRVhEX1VJTlQ4LCBBQ1BJX0VYRF9PRkZTRVQoY29tbW9uLmZsYWdzKSwgIkZsYWdzIn0KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYWNwaV9leGR1bXBfaW5mbyBhY3BpX2V4X2R1bXBfZmllbGRfY29tbW9uWzddID0gewotCXtBQ1BJX0VYRF9JTklULCBBQ1BJX0VYRF9UQUJMRV9TSVpFKGFjcGlfZXhfZHVtcF9maWVsZF9jb21tb24pLCBOVUxMfSwKLQl7QUNQSV9FWERfVUlOVDgsIEFDUElfRVhEX09GRlNFVChjb21tb25fZmllbGQuZmllbGRfZmxhZ3MpLAotCSAiRmllbGQgRmxhZ3MifSwKLQl7QUNQSV9FWERfVUlOVDgsIEFDUElfRVhEX09GRlNFVChjb21tb25fZmllbGQuYWNjZXNzX2J5dGVfd2lkdGgpLAotCSAiQWNjZXNzIEJ5dGUgV2lkdGgifSwKLQl7QUNQSV9FWERfVUlOVDMyLCBBQ1BJX0VYRF9PRkZTRVQoY29tbW9uX2ZpZWxkLmJpdF9sZW5ndGgpLAotCSAiQml0IExlbmd0aCJ9LAotCXtBQ1BJX0VYRF9VSU5UOCwgQUNQSV9FWERfT0ZGU0VUKGNvbW1vbl9maWVsZC5zdGFydF9maWVsZF9iaXRfb2Zmc2V0KSwKLQkgIkZpZWxkIEJpdCBPZmZzZXQifSwKLQl7QUNQSV9FWERfVUlOVDMyLCBBQ1BJX0VYRF9PRkZTRVQoY29tbW9uX2ZpZWxkLmJhc2VfYnl0ZV9vZmZzZXQpLAotCSAiQmFzZSBCeXRlIE9mZnNldCJ9LAotCXtBQ1BJX0VYRF9QT0lOVEVSLCBBQ1BJX0VYRF9PRkZTRVQoY29tbW9uX2ZpZWxkLm5vZGUpLCAiUGFyZW50IE5vZGUifQotfTsKLQotc3RhdGljIHN0cnVjdCBhY3BpX2V4ZHVtcF9pbmZvIGFjcGlfZXhfZHVtcF9ub2RlWzVdID0gewotCXtBQ1BJX0VYRF9JTklULCBBQ1BJX0VYRF9UQUJMRV9TSVpFKGFjcGlfZXhfZHVtcF9ub2RlKSwgTlVMTH0sCi0Je0FDUElfRVhEX1VJTlQ4LCBBQ1BJX0VYRF9OU09GRlNFVChmbGFncyksICJGbGFncyJ9LAotCXtBQ1BJX0VYRF9VSU5UOCwgQUNQSV9FWERfTlNPRkZTRVQob3duZXJfaWQpLCAiT3duZXIgSWQifSwKLQl7QUNQSV9FWERfUE9JTlRFUiwgQUNQSV9FWERfTlNPRkZTRVQoY2hpbGQpLCAiQ2hpbGQgTGlzdCJ9LAotCXtBQ1BJX0VYRF9QT0lOVEVSLCBBQ1BJX0VYRF9OU09GRlNFVChwZWVyKSwgIk5leHQgUGVlciJ9Ci19OwotCi0vKiBEaXNwYXRjaCB0YWJsZSwgaW5kZXhlZCBieSBvYmplY3QgdHlwZSAqLwotCi1zdGF0aWMgc3RydWN0IGFjcGlfZXhkdW1wX2luZm8gKmFjcGlfZXhfZHVtcF9pbmZvW10gPSB7Ci0JTlVMTCwKLQlhY3BpX2V4X2R1bXBfaW50ZWdlciwKLQlhY3BpX2V4X2R1bXBfc3RyaW5nLAotCWFjcGlfZXhfZHVtcF9idWZmZXIsCi0JYWNwaV9leF9kdW1wX3BhY2thZ2UsCi0JTlVMTCwKLQlhY3BpX2V4X2R1bXBfZGV2aWNlLAotCWFjcGlfZXhfZHVtcF9ldmVudCwKLQlhY3BpX2V4X2R1bXBfbWV0aG9kLAotCWFjcGlfZXhfZHVtcF9tdXRleCwKLQlhY3BpX2V4X2R1bXBfcmVnaW9uLAotCWFjcGlfZXhfZHVtcF9wb3dlciwKLQlhY3BpX2V4X2R1bXBfcHJvY2Vzc29yLAotCWFjcGlfZXhfZHVtcF90aGVybWFsLAotCWFjcGlfZXhfZHVtcF9idWZmZXJfZmllbGQsCi0JTlVMTCwKLQlOVUxMLAotCWFjcGlfZXhfZHVtcF9yZWdpb25fZmllbGQsCi0JYWNwaV9leF9kdW1wX2JhbmtfZmllbGQsCi0JYWNwaV9leF9kdW1wX2luZGV4X2ZpZWxkLAotCWFjcGlfZXhfZHVtcF9yZWZlcmVuY2UsCi0JTlVMTCwKLQlOVUxMLAotCWFjcGlfZXhfZHVtcF9ub3RpZnksCi0JYWNwaV9leF9kdW1wX2FkZHJlc3NfaGFuZGxlciwKLQlOVUxMLAotCU5VTEwsCi0JTlVMTAotfTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9leF9kdW1wX29iamVjdAotICoKLSAqIFBBUkFNRVRFUlM6ICBvYmpfZGVzYyAgICAgICAgICAgIC0gRGVzY3JpcHRvciB0byBkdW1wCi0gKiAgICAgICAgICAgICAgSW5mbyAgICAgICAgICAgICAgICAtIEluZm8gdGFibGUgY29ycmVzcG9uZGluZyB0byB0aGlzIG9iamVjdAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlCi0gKgotICogUkVUVVJOOiAgICAgIE5vbmUKLSAqCi0gKiBERVNDUklQVElPTjogV2FsayB0aGUgaW5mbyB0YWJsZSBmb3IgdGhpcyBvYmplY3QKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgdm9pZAotYWNwaV9leF9kdW1wX29iamVjdCh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYywKLQkJICAgIHN0cnVjdCBhY3BpX2V4ZHVtcF9pbmZvICppbmZvKQotewotCXU4ICp0YXJnZXQ7Ci0JY2hhciAqbmFtZTsKLQl1OCBjb3VudDsKLQotCWlmICghaW5mbykgewotCQlhY3BpX29zX3ByaW50ZgotCQkgICAgKCJFeER1bXBPYmplY3Q6IERpc3BsYXkgbm90IGltcGxlbWVudGVkIGZvciBvYmplY3QgdHlwZSAlc1xuIiwKLQkJICAgICBhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lKG9ial9kZXNjKSk7Ci0JCXJldHVybjsKLQl9Ci0KLQkvKiBGaXJzdCB0YWJsZSBlbnRyeSBtdXN0IGNvbnRhaW4gdGhlIHRhYmxlIGxlbmd0aCAoIyBvZiB0YWJsZSBlbnRyaWVzKSAqLwotCi0JY291bnQgPSBpbmZvLT5vZmZzZXQ7Ci0KLQl3aGlsZSAoY291bnQpIHsKLQkJdGFyZ2V0ID0gQUNQSV9BRERfUFRSKHU4LCBvYmpfZGVzYywgaW5mby0+b2Zmc2V0KTsKLQkJbmFtZSA9IGluZm8tPm5hbWU7Ci0KLQkJc3dpdGNoIChpbmZvLT5vcGNvZGUpIHsKLQkJY2FzZSBBQ1BJX0VYRF9JTklUOgotCQkJYnJlYWs7Ci0KLQkJY2FzZSBBQ1BJX0VYRF9UWVBFOgotCQkJYWNwaV9leF9vdXRfc3RyaW5nKCJUeXBlIiwKLQkJCQkJICAgYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZQotCQkJCQkgICAob2JqX2Rlc2MpKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgQUNQSV9FWERfVUlOVDg6Ci0KLQkJCWFjcGlfb3NfcHJpbnRmKCIlMjBzIDogJTIuMlhcbiIsIG5hbWUsICp0YXJnZXQpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBBQ1BJX0VYRF9VSU5UMTY6Ci0KLQkJCWFjcGlfb3NfcHJpbnRmKCIlMjBzIDogJTQuNFhcbiIsIG5hbWUsCi0JCQkJICAgICAgIEFDUElfR0VUMTYodGFyZ2V0KSk7Ci0JCQlicmVhazsKLQotCQljYXNlIEFDUElfRVhEX1VJTlQzMjoKLQotCQkJYWNwaV9vc19wcmludGYoIiUyMHMgOiAlOC44WFxuIiwgbmFtZSwKLQkJCQkgICAgICAgQUNQSV9HRVQzMih0YXJnZXQpKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgQUNQSV9FWERfVUlOVDY0OgotCi0JCQlhY3BpX29zX3ByaW50ZigiJTIwcyA6ICU4LjhYJTguOFhcbiIsICJWYWx1ZSIsCi0JCQkJICAgICAgIEFDUElfRk9STUFUX1VJTlQ2NChBQ1BJX0dFVDY0KHRhcmdldCkpKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgQUNQSV9FWERfUE9JTlRFUjoKLQkJY2FzZSBBQ1BJX0VYRF9BRERSRVNTOgotCi0JCQlhY3BpX2V4X291dF9wb2ludGVyKG5hbWUsCi0JCQkJCSAgICAqQUNQSV9DQVNUX1BUUih2b2lkICosIHRhcmdldCkpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBBQ1BJX0VYRF9TVFJJTkc6Ci0KLQkJCWFjcGlfdXRfcHJpbnRfc3RyaW5nKG9ial9kZXNjLT5zdHJpbmcucG9pbnRlciwKLQkJCQkJICAgICBBQ1BJX1VJTlQ4X01BWCk7Ci0JCQlhY3BpX29zX3ByaW50ZigiXG4iKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgQUNQSV9FWERfQlVGRkVSOgotCi0JCQlBQ1BJX0RVTVBfQlVGRkVSKG9ial9kZXNjLT5idWZmZXIucG9pbnRlciwKLQkJCQkJIG9ial9kZXNjLT5idWZmZXIubGVuZ3RoKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgQUNQSV9FWERfUEFDS0FHRToKLQotCQkJLyogRHVtcCB0aGUgcGFja2FnZSBjb250ZW50cyAqLwotCi0JCQlhY3BpX29zX3ByaW50ZigiXG5QYWNrYWdlIENvbnRlbnRzOlxuIik7Ci0JCQlhY3BpX2V4X2R1bXBfcGFja2FnZV9vYmoob2JqX2Rlc2MsIDAsIDApOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBBQ1BJX0VYRF9GSUVMRDoKLQotCQkJYWNwaV9leF9kdW1wX29iamVjdChvYmpfZGVzYywKLQkJCQkJICAgIGFjcGlfZXhfZHVtcF9maWVsZF9jb21tb24pOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBBQ1BJX0VYRF9SRUZFUkVOQ0U6Ci0KLQkJCWFjcGlfZXhfb3V0X3N0cmluZygiQ2xhc3MgTmFtZSIsCi0JCQkJCSAgIChjaGFyICopCi0JCQkJCSAgIGFjcGlfdXRfZ2V0X3JlZmVyZW5jZV9uYW1lCi0JCQkJCSAgIChvYmpfZGVzYykpOwotCQkJYWNwaV9leF9kdW1wX3JlZmVyZW5jZV9vYmoob2JqX2Rlc2MpOwotCQkJYnJlYWs7Ci0KLQkJZGVmYXVsdDoKLQkJCWFjcGlfb3NfcHJpbnRmKCIqKioqIEludmFsaWQgdGFibGUgb3Bjb2RlIFslWF0gKioqKlxuIiwKLQkJCQkgICAgICAgaW5mby0+b3Bjb2RlKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCWluZm8rKzsKLQkJY291bnQtLTsKLQl9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfZXhfZHVtcF9vcGVyYW5kCi0gKgotICogUEFSQU1FVEVSUzogICpvYmpfZGVzYyAgICAgICAtIFBvaW50ZXIgdG8gZW50cnkgdG8gYmUgZHVtcGVkCi0gKiAgICAgICAgICAgICAgRGVwdGggICAgICAgICAgIC0gQ3VycmVudCBuZXN0aW5nIGRlcHRoCi0gKgotICogUkVUVVJOOiAgICAgIE5vbmUKLSAqCi0gKiBERVNDUklQVElPTjogRHVtcCBhbiBvcGVyYW5kIG9iamVjdAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXZvaWQgYWNwaV9leF9kdW1wX29wZXJhbmQodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2MsIHUzMiBkZXB0aCkKLXsKLQl1MzIgbGVuZ3RoOwotCXUzMiBpbmRleDsKLQotCUFDUElfRlVOQ1RJT05fTkFNRShleF9kdW1wX29wZXJhbmQpCi0KLQkgICAgaWYgKCEoKEFDUElfTFZfRVhFQyAmIGFjcGlfZGJnX2xldmVsKQotCQkgICYmIChfQ09NUE9ORU5UICYgYWNwaV9kYmdfbGF5ZXIpKSkgewotCQlyZXR1cm47Ci0JfQotCi0JaWYgKCFvYmpfZGVzYykgewotCi0JCS8qIFRoaXMgY291bGQgYmUgYSBudWxsIGVsZW1lbnQgb2YgYSBwYWNrYWdlICovCi0KLQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FWEVDLCAiTnVsbCBPYmplY3QgRGVzY3JpcHRvclxuIikpOwotCQlyZXR1cm47Ci0JfQotCi0JaWYgKEFDUElfR0VUX0RFU0NSSVBUT1JfVFlQRShvYmpfZGVzYykgPT0gQUNQSV9ERVNDX1RZUEVfTkFNRUQpIHsKLQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FWEVDLCAiJXAgTmFtZXNwYWNlIE5vZGU6ICIsCi0JCQkJICBvYmpfZGVzYykpOwotCQlBQ1BJX0RVTVBfRU5UUlkob2JqX2Rlc2MsIEFDUElfTFZfRVhFQyk7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAoQUNQSV9HRVRfREVTQ1JJUFRPUl9UWVBFKG9ial9kZXNjKSAhPSBBQ1BJX0RFU0NfVFlQRV9PUEVSQU5EKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVhFQywKLQkJCQkgICIlcCBpcyBub3QgYSBub2RlIG9yIG9wZXJhbmQgb2JqZWN0OiBbJXNdXG4iLAotCQkJCSAgb2JqX2Rlc2MsCi0JCQkJICBhY3BpX3V0X2dldF9kZXNjcmlwdG9yX25hbWUob2JqX2Rlc2MpKSk7Ci0JCUFDUElfRFVNUF9CVUZGRVIob2JqX2Rlc2MsIHNpemVvZih1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0KSk7Ci0JCXJldHVybjsKLQl9Ci0KLQkvKiBvYmpfZGVzYyBpcyBhIHZhbGlkIG9iamVjdCAqLwotCi0JaWYgKGRlcHRoID4gMCkgewotCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VYRUMsICIlKnNbJXVdICVwICIsCi0JCQkJICBkZXB0aCwgIiAiLCBkZXB0aCwgb2JqX2Rlc2MpKTsKLQl9IGVsc2UgewotCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VYRUMsICIlcCAiLCBvYmpfZGVzYykpOwotCX0KLQotCS8qIERlY29kZSBvYmplY3QgdHlwZSAqLwotCi0Jc3dpdGNoIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRShvYmpfZGVzYykpIHsKLQljYXNlIEFDUElfVFlQRV9MT0NBTF9SRUZFUkVOQ0U6Ci0KLQkJYWNwaV9vc19wcmludGYoIlJlZmVyZW5jZTogWyVzXSAiLAotCQkJICAgICAgIGFjcGlfdXRfZ2V0X3JlZmVyZW5jZV9uYW1lKG9ial9kZXNjKSk7Ci0KLQkJc3dpdGNoIChvYmpfZGVzYy0+cmVmZXJlbmNlLmNsYXNzKSB7Ci0JCWNhc2UgQUNQSV9SRUZDTEFTU19ERUJVRzoKLQotCQkJYWNwaV9vc19wcmludGYoIlxuIik7Ci0JCQlicmVhazsKLQotCQljYXNlIEFDUElfUkVGQ0xBU1NfSU5ERVg6Ci0KLQkJCWFjcGlfb3NfcHJpbnRmKCIlcFxuIiwgb2JqX2Rlc2MtPnJlZmVyZW5jZS5vYmplY3QpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBBQ1BJX1JFRkNMQVNTX1RBQkxFOgotCi0JCQlhY3BpX29zX3ByaW50ZigiVGFibGUgSW5kZXggJVhcbiIsCi0JCQkJICAgICAgIG9ial9kZXNjLT5yZWZlcmVuY2UudmFsdWUpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBBQ1BJX1JFRkNMQVNTX1JFRk9GOgotCi0JCQlhY3BpX29zX3ByaW50ZigiJXAgWyVzXVxuIiwgb2JqX2Rlc2MtPnJlZmVyZW5jZS5vYmplY3QsCi0JCQkJICAgICAgIGFjcGlfdXRfZ2V0X3R5cGVfbmFtZSgoKHVuaW9uCi0JCQkJCQkJICAgICAgIGFjcGlfb3BlcmFuZF9vYmplY3QKLQkJCQkJCQkgICAgICAgKikKLQkJCQkJCQkgICAgICBvYmpfZGVzYy0+Ci0JCQkJCQkJICAgICAgcmVmZXJlbmNlLgotCQkJCQkJCSAgICAgIG9iamVjdCktPmNvbW1vbi4KLQkJCQkJCQkgICAgIHR5cGUpKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgQUNQSV9SRUZDTEFTU19BUkc6Ci0KLQkJCWFjcGlfb3NfcHJpbnRmKCIlWCIsIG9ial9kZXNjLT5yZWZlcmVuY2UudmFsdWUpOwotCi0JCQlpZiAoQUNQSV9HRVRfT0JKRUNUX1RZUEUob2JqX2Rlc2MpID09IEFDUElfVFlQRV9JTlRFR0VSKSB7Ci0KLQkJCQkvKiBWYWx1ZSBpcyBhbiBJbnRlZ2VyICovCi0KLQkJCQlhY3BpX29zX3ByaW50ZigiIHZhbHVlIGlzIFslOC44WCU4Ljh4XSIsCi0JCQkJCSAgICAgICBBQ1BJX0ZPUk1BVF9VSU5UNjQob2JqX2Rlc2MtPgotCQkJCQkJCQkgIGludGVnZXIuCi0JCQkJCQkJCSAgdmFsdWUpKTsKLQkJCX0KLQotCQkJYWNwaV9vc19wcmludGYoIlxuIik7Ci0JCQlicmVhazsKLQotCQljYXNlIEFDUElfUkVGQ0xBU1NfTE9DQUw6Ci0KLQkJCWFjcGlfb3NfcHJpbnRmKCIlWCIsIG9ial9kZXNjLT5yZWZlcmVuY2UudmFsdWUpOwotCi0JCQlpZiAoQUNQSV9HRVRfT0JKRUNUX1RZUEUob2JqX2Rlc2MpID09IEFDUElfVFlQRV9JTlRFR0VSKSB7Ci0KLQkJCQkvKiBWYWx1ZSBpcyBhbiBJbnRlZ2VyICovCi0KLQkJCQlhY3BpX29zX3ByaW50ZigiIHZhbHVlIGlzIFslOC44WCU4Ljh4XSIsCi0JCQkJCSAgICAgICBBQ1BJX0ZPUk1BVF9VSU5UNjQob2JqX2Rlc2MtPgotCQkJCQkJCQkgIGludGVnZXIuCi0JCQkJCQkJCSAgdmFsdWUpKTsKLQkJCX0KLQotCQkJYWNwaV9vc19wcmludGYoIlxuIik7Ci0JCQlicmVhazsKLQotCQljYXNlIEFDUElfUkVGQ0xBU1NfTkFNRToKLQotCQkJYWNwaV9vc19wcmludGYoIi0gWyU0LjRzXVxuIiwKLQkJCQkgICAgICAgb2JqX2Rlc2MtPnJlZmVyZW5jZS5ub2RlLT5uYW1lLmFzY2lpKTsKLQkJCWJyZWFrOwotCi0JCWRlZmF1bHQ6CS8qIFVua25vd24gcmVmZXJlbmNlIGNsYXNzICovCi0KLQkJCWFjcGlfb3NfcHJpbnRmKCIlMi4yWFxuIiwgb2JqX2Rlc2MtPnJlZmVyZW5jZS5jbGFzcyk7Ci0JCQlicmVhazsKLQkJfQotCQlicmVhazsKLQotCWNhc2UgQUNQSV9UWVBFX0JVRkZFUjoKLQotCQlhY3BpX29zX3ByaW50ZigiQnVmZmVyIGxlbmd0aCAlLjJYIEAgJXBcbiIsCi0JCQkgICAgICAgb2JqX2Rlc2MtPmJ1ZmZlci5sZW5ndGgsCi0JCQkgICAgICAgb2JqX2Rlc2MtPmJ1ZmZlci5wb2ludGVyKTsKLQotCQkvKiBEZWJ1ZyBvbmx5IC0tIGR1bXAgdGhlIGJ1ZmZlciBjb250ZW50cyAqLwotCi0JCWlmIChvYmpfZGVzYy0+YnVmZmVyLnBvaW50ZXIpIHsKLQkJCWxlbmd0aCA9IG9ial9kZXNjLT5idWZmZXIubGVuZ3RoOwotCQkJaWYgKGxlbmd0aCA+IDEyOCkgewotCQkJCWxlbmd0aCA9IDEyODsKLQkJCX0KLQotCQkJYWNwaV9vc19wcmludGYKLQkJCSAgICAoIkJ1ZmZlciBDb250ZW50czogKGRpc3BsYXlpbmcgbGVuZ3RoIDB4JS4yWClcbiIsCi0JCQkgICAgIGxlbmd0aCk7Ci0JCQlBQ1BJX0RVTVBfQlVGRkVSKG9ial9kZXNjLT5idWZmZXIucG9pbnRlciwgbGVuZ3RoKTsKLQkJfQotCQlicmVhazsKLQotCWNhc2UgQUNQSV9UWVBFX0lOVEVHRVI6Ci0KLQkJYWNwaV9vc19wcmludGYoIkludGVnZXIgJTguOFglOC44WFxuIiwKLQkJCSAgICAgICBBQ1BJX0ZPUk1BVF9VSU5UNjQob2JqX2Rlc2MtPmludGVnZXIudmFsdWUpKTsKLQkJYnJlYWs7Ci0KLQljYXNlIEFDUElfVFlQRV9QQUNLQUdFOgotCi0JCWFjcGlfb3NfcHJpbnRmKCJQYWNrYWdlIFtMZW4gJVhdIEVsZW1lbnRBcnJheSAlcFxuIiwKLQkJCSAgICAgICBvYmpfZGVzYy0+cGFja2FnZS5jb3VudCwKLQkJCSAgICAgICBvYmpfZGVzYy0+cGFja2FnZS5lbGVtZW50cyk7Ci0KLQkJLyoKLQkJICogSWYgZWxlbWVudHMgZXhpc3QsIHBhY2thZ2UgZWxlbWVudCBwb2ludGVyIGlzIHZhbGlkLAotCQkgKiBhbmQgZGVidWdfbGV2ZWwgZXhjZWVkcyAxLCBkdW1wIHBhY2thZ2UncyBlbGVtZW50cy4KLQkJICovCi0JCWlmIChvYmpfZGVzYy0+cGFja2FnZS5jb3VudCAmJgotCQkgICAgb2JqX2Rlc2MtPnBhY2thZ2UuZWxlbWVudHMgJiYgYWNwaV9kYmdfbGV2ZWwgPiAxKSB7Ci0JCQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBvYmpfZGVzYy0+cGFja2FnZS5jb3VudDsKLQkJCSAgICAgaW5kZXgrKykgewotCQkJCWFjcGlfZXhfZHVtcF9vcGVyYW5kKG9ial9kZXNjLT5wYWNrYWdlLgotCQkJCQkJICAgICBlbGVtZW50c1tpbmRleF0sCi0JCQkJCQkgICAgIGRlcHRoICsgMSk7Ci0JCQl9Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIEFDUElfVFlQRV9SRUdJT046Ci0KLQkJYWNwaV9vc19wcmludGYoIlJlZ2lvbiAlcyAoJVgpIiwKLQkJCSAgICAgICBhY3BpX3V0X2dldF9yZWdpb25fbmFtZShvYmpfZGVzYy0+cmVnaW9uLgotCQkJCQkJICAgICAgIHNwYWNlX2lkKSwKLQkJCSAgICAgICBvYmpfZGVzYy0+cmVnaW9uLnNwYWNlX2lkKTsKLQotCQkvKgotCQkgKiBJZiB0aGUgYWRkcmVzcyBhbmQgbGVuZ3RoIGhhdmUgbm90IGJlZW4gZXZhbHVhdGVkLAotCQkgKiBkb24ndCBwcmludCB0aGVtLgotCQkgKi8KLQkJaWYgKCEob2JqX2Rlc2MtPnJlZ2lvbi5mbGFncyAmIEFPUE9CSl9EQVRBX1ZBTElEKSkgewotCQkJYWNwaV9vc19wcmludGYoIlxuIik7Ci0JCX0gZWxzZSB7Ci0JCQlhY3BpX29zX3ByaW50ZigiIGJhc2UgJTguOFglOC44WCBMZW5ndGggJVhcbiIsCi0JCQkJICAgICAgIEFDUElfRk9STUFUX05BVElWRV9VSU5UKG9ial9kZXNjLT5yZWdpb24uCi0JCQkJCQkJICAgICAgIGFkZHJlc3MpLAotCQkJCSAgICAgICBvYmpfZGVzYy0+cmVnaW9uLmxlbmd0aCk7Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIEFDUElfVFlQRV9TVFJJTkc6Ci0KLQkJYWNwaV9vc19wcmludGYoIlN0cmluZyBsZW5ndGggJVggQCAlcCAiLAotCQkJICAgICAgIG9ial9kZXNjLT5zdHJpbmcubGVuZ3RoLAotCQkJICAgICAgIG9ial9kZXNjLT5zdHJpbmcucG9pbnRlcik7Ci0KLQkJYWNwaV91dF9wcmludF9zdHJpbmcob2JqX2Rlc2MtPnN0cmluZy5wb2ludGVyLCBBQ1BJX1VJTlQ4X01BWCk7Ci0JCWFjcGlfb3NfcHJpbnRmKCJcbiIpOwotCQlicmVhazsKLQotCWNhc2UgQUNQSV9UWVBFX0xPQ0FMX0JBTktfRklFTEQ6Ci0KLQkJYWNwaV9vc19wcmludGYoIkJhbmtGaWVsZFxuIik7Ci0JCWJyZWFrOwotCi0JY2FzZSBBQ1BJX1RZUEVfTE9DQUxfUkVHSU9OX0ZJRUxEOgotCi0JCWFjcGlfb3NfcHJpbnRmCi0JCSAgICAoIlJlZ2lvbkZpZWxkOiBCaXRzPSVYIEFjY1dpZHRoPSVYIExvY2s9JVggVXBkYXRlPSVYIGF0IGJ5dGU9JVggYml0PSVYIG9mIGJlbG93OlxuIiwKLQkJICAgICBvYmpfZGVzYy0+ZmllbGQuYml0X2xlbmd0aCwKLQkJICAgICBvYmpfZGVzYy0+ZmllbGQuYWNjZXNzX2J5dGVfd2lkdGgsCi0JCSAgICAgb2JqX2Rlc2MtPmZpZWxkLmZpZWxkX2ZsYWdzICYgQU1MX0ZJRUxEX0xPQ0tfUlVMRV9NQVNLLAotCQkgICAgIG9ial9kZXNjLT5maWVsZC5maWVsZF9mbGFncyAmIEFNTF9GSUVMRF9VUERBVEVfUlVMRV9NQVNLLAotCQkgICAgIG9ial9kZXNjLT5maWVsZC5iYXNlX2J5dGVfb2Zmc2V0LAotCQkgICAgIG9ial9kZXNjLT5maWVsZC5zdGFydF9maWVsZF9iaXRfb2Zmc2V0KTsKLQotCQlhY3BpX2V4X2R1bXBfb3BlcmFuZChvYmpfZGVzYy0+ZmllbGQucmVnaW9uX29iaiwgZGVwdGggKyAxKTsKLQkJYnJlYWs7Ci0KLQljYXNlIEFDUElfVFlQRV9MT0NBTF9JTkRFWF9GSUVMRDoKLQotCQlhY3BpX29zX3ByaW50ZigiSW5kZXhGaWVsZFxuIik7Ci0JCWJyZWFrOwotCi0JY2FzZSBBQ1BJX1RZUEVfQlVGRkVSX0ZJRUxEOgotCi0JCWFjcGlfb3NfcHJpbnRmKCJCdWZmZXJGaWVsZDogJVggYml0cyBhdCBieXRlICVYIGJpdCAlWCBvZlxuIiwKLQkJCSAgICAgICBvYmpfZGVzYy0+YnVmZmVyX2ZpZWxkLmJpdF9sZW5ndGgsCi0JCQkgICAgICAgb2JqX2Rlc2MtPmJ1ZmZlcl9maWVsZC5iYXNlX2J5dGVfb2Zmc2V0LAotCQkJICAgICAgIG9ial9kZXNjLT5idWZmZXJfZmllbGQuc3RhcnRfZmllbGRfYml0X29mZnNldCk7Ci0KLQkJaWYgKCFvYmpfZGVzYy0+YnVmZmVyX2ZpZWxkLmJ1ZmZlcl9vYmopIHsKLQkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVhFQywgIipOVUxMKlxuIikpOwotCQl9IGVsc2UKLQkJICAgIGlmIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRShvYmpfZGVzYy0+YnVmZmVyX2ZpZWxkLmJ1ZmZlcl9vYmopCi0JCQkhPSBBQ1BJX1RZUEVfQlVGRkVSKSB7Ci0JCQlhY3BpX29zX3ByaW50ZigiKm5vdCBhIEJ1ZmZlcipcbiIpOwotCQl9IGVsc2UgewotCQkJYWNwaV9leF9kdW1wX29wZXJhbmQob2JqX2Rlc2MtPmJ1ZmZlcl9maWVsZC5idWZmZXJfb2JqLAotCQkJCQkgICAgIGRlcHRoICsgMSk7Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIEFDUElfVFlQRV9FVkVOVDoKLQotCQlhY3BpX29zX3ByaW50ZigiRXZlbnRcbiIpOwotCQlicmVhazsKLQotCWNhc2UgQUNQSV9UWVBFX01FVEhPRDoKLQotCQlhY3BpX29zX3ByaW50ZigiTWV0aG9kKCVYKSBAICVwOiVYXG4iLAotCQkJICAgICAgIG9ial9kZXNjLT5tZXRob2QucGFyYW1fY291bnQsCi0JCQkgICAgICAgb2JqX2Rlc2MtPm1ldGhvZC5hbWxfc3RhcnQsCi0JCQkgICAgICAgb2JqX2Rlc2MtPm1ldGhvZC5hbWxfbGVuZ3RoKTsKLQkJYnJlYWs7Ci0KLQljYXNlIEFDUElfVFlQRV9NVVRFWDoKLQotCQlhY3BpX29zX3ByaW50ZigiTXV0ZXhcbiIpOwotCQlicmVhazsKLQotCWNhc2UgQUNQSV9UWVBFX0RFVklDRToKLQotCQlhY3BpX29zX3ByaW50ZigiRGV2aWNlXG4iKTsKLQkJYnJlYWs7Ci0KLQljYXNlIEFDUElfVFlQRV9QT1dFUjoKLQotCQlhY3BpX29zX3ByaW50ZigiUG93ZXJcbiIpOwotCQlicmVhazsKLQotCWNhc2UgQUNQSV9UWVBFX1BST0NFU1NPUjoKLQotCQlhY3BpX29zX3ByaW50ZigiUHJvY2Vzc29yXG4iKTsKLQkJYnJlYWs7Ci0KLQljYXNlIEFDUElfVFlQRV9USEVSTUFMOgotCi0JCWFjcGlfb3NfcHJpbnRmKCJUaGVybWFsXG4iKTsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQkvKiBVbmtub3duIFR5cGUgKi8KLQotCQlhY3BpX29zX3ByaW50ZigiVW5rbm93biBUeXBlICVYXG4iLAotCQkJICAgICAgIEFDUElfR0VUX09CSkVDVF9UWVBFKG9ial9kZXNjKSk7Ci0JCWJyZWFrOwotCX0KLQotCXJldHVybjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9leF9kdW1wX29wZXJhbmRzCi0gKgotICogUEFSQU1FVEVSUzoJT3BlcmFuZHMJICAgIC0gQSBsaXN0IG9mIE9wZXJhbmQgb2JqZWN0cwotICoJCW9wY29kZV9uYW1lCSAgICAtIEFNTCBvcGNvZGUgbmFtZQotICoJCW51bV9vcGVyYW5kcwkgICAgLSBPcGVyYW5kIGNvdW50IGZvciB0aGlzIG9wY29kZQotICoKLSAqIERFU0NSSVBUSU9OOiBEdW1wIHRoZSBvcGVyYW5kcyBhc3NvY2lhdGVkIHdpdGggdGhlIG9wY29kZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXZvaWQKLWFjcGlfZXhfZHVtcF9vcGVyYW5kcyh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICoqb3BlcmFuZHMsCi0JCSAgICAgIGNvbnN0IGNoYXIgKm9wY29kZV9uYW1lLCB1MzIgbnVtX29wZXJhbmRzKQotewotCUFDUElfRlVOQ1RJT05fTkFNRShleF9kdW1wX29wZXJhbmRzKTsKLQotCWlmICghb3Bjb2RlX25hbWUpIHsKLQkJb3Bjb2RlX25hbWUgPSAiVU5LTk9XTiI7Ci0JfQotCi0JQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FWEVDLAotCQkJICAiKioqKiBTdGFydCBvcGVyYW5kIGR1bXAgZm9yIG9wY29kZSBbJXNdLCAlZCBvcGVyYW5kc1xuIiwKLQkJCSAgb3Bjb2RlX25hbWUsIG51bV9vcGVyYW5kcykpOwotCi0JaWYgKG51bV9vcGVyYW5kcyA9PSAwKSB7Ci0JCW51bV9vcGVyYW5kcyA9IDE7Ci0JfQotCi0JLyogRHVtcCB0aGUgaW5kaXZpZHVhbCBvcGVyYW5kcyAqLwotCi0Jd2hpbGUgKG51bV9vcGVyYW5kcykgewotCQlhY3BpX2V4X2R1bXBfb3BlcmFuZCgqb3BlcmFuZHMsIDApOwotCQlvcGVyYW5kcysrOwotCQludW1fb3BlcmFuZHMtLTsKLQl9Ci0KLQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VYRUMsCi0JCQkgICIqKioqIEVuZCBvcGVyYW5kIGR1bXAgZm9yIFslc11cbiIsIG9wY29kZV9uYW1lKSk7Ci0JcmV0dXJuOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X291dCogZnVuY3Rpb25zCi0gKgotICogUEFSQU1FVEVSUzogIFRpdGxlICAgICAgICAgICAgICAgLSBEZXNjcmlwdGl2ZSB0ZXh0Ci0gKiAgICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgICAtIFZhbHVlIHRvIGJlIGRpc3BsYXllZAotICoKLSAqIERFU0NSSVBUSU9OOiBPYmplY3QgZHVtcCBvdXRwdXQgZm9ybWF0dGluZyBmdW5jdGlvbnMuICBUaGVzZSBmdW5jdGlvbnMKLSAqICAgICAgICAgICAgICByZWR1Y2UgdGhlIG51bWJlciBvZiBmb3JtYXQgc3RyaW5ncyByZXF1aXJlZCBhbmQga2VlcHMgdGhlbQotICogICAgICAgICAgICAgIGFsbCBpbiBvbmUgcGxhY2UgZm9yIGVhc3kgbW9kaWZpY2F0aW9uLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyB2b2lkIGFjcGlfZXhfb3V0X3N0cmluZyhjaGFyICp0aXRsZSwgY2hhciAqdmFsdWUpCi17Ci0JYWNwaV9vc19wcmludGYoIiUyMHMgOiAlc1xuIiwgdGl0bGUsIHZhbHVlKTsKLX0KLQotc3RhdGljIHZvaWQgYWNwaV9leF9vdXRfcG9pbnRlcihjaGFyICp0aXRsZSwgdm9pZCAqdmFsdWUpCi17Ci0JYWNwaV9vc19wcmludGYoIiUyMHMgOiAlcFxuIiwgdGl0bGUsIHZhbHVlKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9leF9kdW1wX25hbWVzcGFjZV9ub2RlCi0gKgotICogUEFSQU1FVEVSUzogIE5vZGUgICAgICAgICAgICAgICAgLSBEZXNjcmlwdG9yIHRvIGR1bXAKLSAqICAgICAgICAgICAgICBGbGFncyAgICAgICAgICAgICAgIC0gRm9yY2UgZGlzcGxheSBpZiBUUlVFCi0gKgotICogREVTQ1JJUFRJT046IER1bXBzIHRoZSBtZW1iZXJzIG9mIHRoZSBnaXZlbi5Ob2RlCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdm9pZCBhY3BpX2V4X2R1bXBfbmFtZXNwYWNlX25vZGUoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGUsIHUzMiBmbGFncykKLXsKLQotCUFDUElfRlVOQ1RJT05fRU5UUlkoKTsKLQotCWlmICghZmxhZ3MpIHsKLQkJaWYgKCEoKEFDUElfTFZfT0JKRUNUUyAmIGFjcGlfZGJnX2xldmVsKQotCQkgICAgICAmJiAoX0NPTVBPTkVOVCAmIGFjcGlfZGJnX2xheWVyKSkpIHsKLQkJCXJldHVybjsKLQkJfQotCX0KLQotCWFjcGlfb3NfcHJpbnRmKCIlMjBzIDogJTQuNHNcbiIsICJOYW1lIiwgYWNwaV91dF9nZXRfbm9kZV9uYW1lKG5vZGUpKTsKLQlhY3BpX2V4X291dF9zdHJpbmcoIlR5cGUiLCBhY3BpX3V0X2dldF90eXBlX25hbWUobm9kZS0+dHlwZSkpOwotCWFjcGlfZXhfb3V0X3BvaW50ZXIoIkF0dGFjaGVkIE9iamVjdCIsCi0JCQkgICAgYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0KG5vZGUpKTsKLQlhY3BpX2V4X291dF9wb2ludGVyKCJQYXJlbnQiLCBhY3BpX25zX2dldF9wYXJlbnRfbm9kZShub2RlKSk7Ci0KLQlhY3BpX2V4X2R1bXBfb2JqZWN0KEFDUElfQ0FTVF9QVFIodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCwgbm9kZSksCi0JCQkgICAgYWNwaV9leF9kdW1wX25vZGUpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X2R1bXBfcmVmZXJlbmNlX29iagotICoKLSAqIFBBUkFNRVRFUlM6ICBPYmplY3QgICAgICAgICAgICAgIC0gRGVzY3JpcHRvciB0byBkdW1wCi0gKgotICogREVTQ1JJUFRJT046IER1bXBzIGEgcmVmZXJlbmNlIG9iamVjdAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyB2b2lkIGFjcGlfZXhfZHVtcF9yZWZlcmVuY2Vfb2JqKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjKQotewotCXN0cnVjdCBhY3BpX2J1ZmZlciByZXRfYnVmOwotCWFjcGlfc3RhdHVzIHN0YXR1czsKLQotCXJldF9idWYubGVuZ3RoID0gQUNQSV9BTExPQ0FURV9MT0NBTF9CVUZGRVI7Ci0KLQlpZiAob2JqX2Rlc2MtPnJlZmVyZW5jZS5jbGFzcyA9PSBBQ1BJX1JFRkNMQVNTX05BTUUpIHsKLQkJYWNwaV9vc19wcmludGYoIiAlcCAiLCBvYmpfZGVzYy0+cmVmZXJlbmNlLm5vZGUpOwotCi0JCXN0YXR1cyA9Ci0JCSAgICBhY3BpX25zX2hhbmRsZV90b19wYXRobmFtZShvYmpfZGVzYy0+cmVmZXJlbmNlLm5vZGUsCi0JCQkJCSAgICAgICAmcmV0X2J1Zik7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQkJYWNwaV9vc19wcmludGYoIiBDb3VsZCBub3QgY29udmVydCBuYW1lIHRvIHBhdGhuYW1lXG4iKTsKLQkJfSBlbHNlIHsKLQkJCWFjcGlfb3NfcHJpbnRmKCIlc1xuIiwgKGNoYXIgKilyZXRfYnVmLnBvaW50ZXIpOwotCQkJQUNQSV9GUkVFKHJldF9idWYucG9pbnRlcik7Ci0JCX0KLQl9IGVsc2UgaWYgKG9ial9kZXNjLT5yZWZlcmVuY2Uub2JqZWN0KSB7Ci0JCWlmIChBQ1BJX0dFVF9ERVNDUklQVE9SX1RZUEUob2JqX2Rlc2MpID09Ci0JCSAgICBBQ1BJX0RFU0NfVFlQRV9PUEVSQU5EKSB7Ci0JCQlhY3BpX29zX3ByaW50ZigiIFRhcmdldDogJXAiLAotCQkJCSAgICAgICBvYmpfZGVzYy0+cmVmZXJlbmNlLm9iamVjdCk7Ci0JCQlpZiAob2JqX2Rlc2MtPnJlZmVyZW5jZS5jbGFzcyA9PSBBQ1BJX1JFRkNMQVNTX1RBQkxFKSB7Ci0JCQkJYWNwaV9vc19wcmludGYoIiBUYWJsZSBJbmRleDogJVhcbiIsCi0JCQkJCSAgICAgICBvYmpfZGVzYy0+cmVmZXJlbmNlLnZhbHVlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJYWNwaV9vc19wcmludGYoIiBUYXJnZXQ6ICVwIFslc11cbiIsCi0JCQkJCSAgICAgICBvYmpfZGVzYy0+cmVmZXJlbmNlLm9iamVjdCwKLQkJCQkJICAgICAgIGFjcGlfdXRfZ2V0X3R5cGVfbmFtZSgoKHVuaW9uCi0JCQkJCQkJCSAgICAgICBhY3BpX29wZXJhbmRfb2JqZWN0Ci0JCQkJCQkJCSAgICAgICAqKQotCQkJCQkJCQkgICAgICBvYmpfZGVzYy0+Ci0JCQkJCQkJCSAgICAgIHJlZmVyZW5jZS4KLQkJCQkJCQkJICAgICAgb2JqZWN0KS0+Ci0JCQkJCQkJCSAgICAgY29tbW9uLgotCQkJCQkJCQkgICAgIHR5cGUpKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWFjcGlfb3NfcHJpbnRmKCIgVGFyZ2V0OiAlcFxuIiwKLQkJCQkgICAgICAgb2JqX2Rlc2MtPnJlZmVyZW5jZS5vYmplY3QpOwotCQl9Ci0JfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X2R1bXBfcGFja2FnZV9vYmoKLSAqCi0gKiBQQVJBTUVURVJTOiAgb2JqX2Rlc2MgICAgICAgICAgICAtIERlc2NyaXB0b3IgdG8gZHVtcAotICogICAgICAgICAgICAgIExldmVsICAgICAgICAgICAgICAgLSBJbmRlbnRhdGlvbiBMZXZlbAotICogICAgICAgICAgICAgIEluZGV4ICAgICAgICAgICAgICAgLSBQYWNrYWdlIGluZGV4IGZvciB0aGlzIG9iamVjdAotICoKLSAqIERFU0NSSVBUSU9OOiBEdW1wcyB0aGUgZWxlbWVudHMgb2YgdGhlIHBhY2thZ2UKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgdm9pZAotYWNwaV9leF9kdW1wX3BhY2thZ2Vfb2JqKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjLAotCQkJIHUzMiBsZXZlbCwgdTMyIGluZGV4KQotewotCXUzMiBpOwotCi0JLyogSW5kZW50YXRpb24gYW5kIGluZGV4IG91dHB1dCAqLwotCi0JaWYgKGxldmVsID4gMCkgewotCQlmb3IgKGkgPSAwOyBpIDwgbGV2ZWw7IGkrKykgewotCQkJYWNwaV9vc19wcmludGYoIiAiKTsKLQkJfQotCi0JCWFjcGlfb3NfcHJpbnRmKCJbJS4yZF0gIiwgaW5kZXgpOwotCX0KLQotCWFjcGlfb3NfcHJpbnRmKCIlcCAiLCBvYmpfZGVzYyk7Ci0KLQkvKiBOdWxsIHBhY2thZ2UgZWxlbWVudHMgYXJlIGFsbG93ZWQgKi8KLQotCWlmICghb2JqX2Rlc2MpIHsKLQkJYWNwaV9vc19wcmludGYoIltOdWxsIE9iamVjdF1cbiIpOwotCQlyZXR1cm47Ci0JfQotCi0JLyogUGFja2FnZXMgbWF5IG9ubHkgY29udGFpbiBhIGZldyBvYmplY3QgdHlwZXMgKi8KLQotCXN3aXRjaCAoQUNQSV9HRVRfT0JKRUNUX1RZUEUob2JqX2Rlc2MpKSB7Ci0JY2FzZSBBQ1BJX1RZUEVfSU5URUdFUjoKLQotCQlhY3BpX29zX3ByaW50ZigiW0ludGVnZXJdID0gJTguOFglOC44WFxuIiwKLQkJCSAgICAgICBBQ1BJX0ZPUk1BVF9VSU5UNjQob2JqX2Rlc2MtPmludGVnZXIudmFsdWUpKTsKLQkJYnJlYWs7Ci0KLQljYXNlIEFDUElfVFlQRV9TVFJJTkc6Ci0KLQkJYWNwaV9vc19wcmludGYoIltTdHJpbmddIFZhbHVlOiAiKTsKLQkJZm9yIChpID0gMDsgaSA8IG9ial9kZXNjLT5zdHJpbmcubGVuZ3RoOyBpKyspIHsKLQkJCWFjcGlfb3NfcHJpbnRmKCIlYyIsIG9ial9kZXNjLT5zdHJpbmcucG9pbnRlcltpXSk7Ci0JCX0KLQkJYWNwaV9vc19wcmludGYoIlxuIik7Ci0JCWJyZWFrOwotCi0JY2FzZSBBQ1BJX1RZUEVfQlVGRkVSOgotCi0JCWFjcGlfb3NfcHJpbnRmKCJbQnVmZmVyXSBMZW5ndGggJS4yWCA9ICIsCi0JCQkgICAgICAgb2JqX2Rlc2MtPmJ1ZmZlci5sZW5ndGgpOwotCQlpZiAob2JqX2Rlc2MtPmJ1ZmZlci5sZW5ndGgpIHsKLQkJCWFjcGlfdXRfZHVtcF9idWZmZXIoQUNQSV9DQVNUX1BUUgotCQkJCQkgICAgKHU4LCBvYmpfZGVzYy0+YnVmZmVyLnBvaW50ZXIpLAotCQkJCQkgICAgb2JqX2Rlc2MtPmJ1ZmZlci5sZW5ndGgsCi0JCQkJCSAgICBEQl9EV09SRF9ESVNQTEFZLCBfQ09NUE9ORU5UKTsKLQkJfSBlbHNlIHsKLQkJCWFjcGlfb3NfcHJpbnRmKCJcbiIpOwotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBBQ1BJX1RZUEVfUEFDS0FHRToKLQotCQlhY3BpX29zX3ByaW50ZigiW1BhY2thZ2VdIENvbnRhaW5zICVkIEVsZW1lbnRzOlxuIiwKLQkJCSAgICAgICBvYmpfZGVzYy0+cGFja2FnZS5jb3VudCk7Ci0KLQkJZm9yIChpID0gMDsgaSA8IG9ial9kZXNjLT5wYWNrYWdlLmNvdW50OyBpKyspIHsKLQkJCWFjcGlfZXhfZHVtcF9wYWNrYWdlX29iaihvYmpfZGVzYy0+cGFja2FnZS5lbGVtZW50c1tpXSwKLQkJCQkJCSBsZXZlbCArIDEsIGkpOwotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBBQ1BJX1RZUEVfTE9DQUxfUkVGRVJFTkNFOgotCi0JCWFjcGlfb3NfcHJpbnRmKCJbT2JqZWN0IFJlZmVyZW5jZV0gVHlwZSBbJXNdICUyLjJYIiwKLQkJCSAgICAgICBhY3BpX3V0X2dldF9yZWZlcmVuY2VfbmFtZShvYmpfZGVzYyksCi0JCQkgICAgICAgb2JqX2Rlc2MtPnJlZmVyZW5jZS5jbGFzcyk7Ci0JCWFjcGlfZXhfZHVtcF9yZWZlcmVuY2Vfb2JqKG9ial9kZXNjKTsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCi0JCWFjcGlfb3NfcHJpbnRmKCJbVW5rbm93biBUeXBlXSAlWFxuIiwKLQkJCSAgICAgICBBQ1BJX0dFVF9PQkpFQ1RfVFlQRShvYmpfZGVzYykpOwotCQlicmVhazsKLQl9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfZXhfZHVtcF9vYmplY3RfZGVzY3JpcHRvcgotICoKLSAqIFBBUkFNRVRFUlM6ICBvYmpfZGVzYyAgICAgICAgICAgIC0gRGVzY3JpcHRvciB0byBkdW1wCi0gKiAgICAgICAgICAgICAgRmxhZ3MgICAgICAgICAgICAgICAtIEZvcmNlIGRpc3BsYXkgaWYgVFJVRQotICoKLSAqIERFU0NSSVBUSU9OOiBEdW1wcyB0aGUgbWVtYmVycyBvZiB0aGUgb2JqZWN0IGRlc2NyaXB0b3IgZ2l2ZW4uCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdm9pZAotYWNwaV9leF9kdW1wX29iamVjdF9kZXNjcmlwdG9yKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjLCB1MzIgZmxhZ3MpCi17Ci0JQUNQSV9GVU5DVElPTl9UUkFDRShleF9kdW1wX29iamVjdF9kZXNjcmlwdG9yKTsKLQotCWlmICghb2JqX2Rlc2MpIHsKLQkJcmV0dXJuX1ZPSUQ7Ci0JfQotCi0JaWYgKCFmbGFncykgewotCQlpZiAoISgoQUNQSV9MVl9PQkpFQ1RTICYgYWNwaV9kYmdfbGV2ZWwpCi0JCSAgICAgICYmIChfQ09NUE9ORU5UICYgYWNwaV9kYmdfbGF5ZXIpKSkgewotCQkJcmV0dXJuX1ZPSUQ7Ci0JCX0KLQl9Ci0KLQlpZiAoQUNQSV9HRVRfREVTQ1JJUFRPUl9UWVBFKG9ial9kZXNjKSA9PSBBQ1BJX0RFU0NfVFlQRV9OQU1FRCkgewotCQlhY3BpX2V4X2R1bXBfbmFtZXNwYWNlX25vZGUoKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICopCi0JCQkJCSAgICBvYmpfZGVzYywgZmxhZ3MpOwotCi0JCWFjcGlfb3NfcHJpbnRmKCJcbkF0dGFjaGVkIE9iamVjdCAoJXApOlxuIiwKLQkJCSAgICAgICAoKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICopb2JqX2Rlc2MpLT4KLQkJCSAgICAgICBvYmplY3QpOwotCi0JCWFjcGlfZXhfZHVtcF9vYmplY3RfZGVzY3JpcHRvcigoKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICopCi0JCQkJCQlvYmpfZGVzYyktPm9iamVjdCwgZmxhZ3MpOwotCQlyZXR1cm5fVk9JRDsKLQl9Ci0KLQlpZiAoQUNQSV9HRVRfREVTQ1JJUFRPUl9UWVBFKG9ial9kZXNjKSAhPSBBQ1BJX0RFU0NfVFlQRV9PUEVSQU5EKSB7Ci0JCWFjcGlfb3NfcHJpbnRmCi0JCSAgICAoIkV4RHVtcE9iamVjdERlc2NyaXB0b3I6ICVwIGlzIG5vdCBhbiBBQ1BJIG9wZXJhbmQgb2JqZWN0OiBbJXNdXG4iLAotCQkgICAgIG9ial9kZXNjLCBhY3BpX3V0X2dldF9kZXNjcmlwdG9yX25hbWUob2JqX2Rlc2MpKTsKLQkJcmV0dXJuX1ZPSUQ7Ci0JfQotCi0JaWYgKG9ial9kZXNjLT5jb21tb24udHlwZSA+IEFDUElfVFlQRV9OU19OT0RFX01BWCkgewotCQlyZXR1cm5fVk9JRDsKLQl9Ci0KLQkvKiBDb21tb24gRmllbGRzICovCi0KLQlhY3BpX2V4X2R1bXBfb2JqZWN0KG9ial9kZXNjLCBhY3BpX2V4X2R1bXBfY29tbW9uKTsKLQotCS8qIE9iamVjdC1zcGVjaWZpYyBmaWVsZHMgKi8KLQotCWFjcGlfZXhfZHVtcF9vYmplY3Qob2JqX2Rlc2MsIGFjcGlfZXhfZHVtcF9pbmZvW29ial9kZXNjLT5jb21tb24udHlwZV0pOwotCXJldHVybl9WT0lEOwotfQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leGZpZWxkLmMgYi9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhmaWVsZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTQ0MGQ4Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leGZpZWxkLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIE1vZHVsZSBOYW1lOiBleGZpZWxkIC0gQUNQSSBBTUwgKHAtY29kZSkgZXhlY3V0aW9uIC0gZmllbGQgbWFuaXB1bGF0aW9uCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwOCwgSW50ZWwgQ29ycC4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKLSAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIGF0IG1pbmltdW0gYSBkaXNjbGFpbWVyCi0gKiAgICBzdWJzdGFudGlhbGx5IHNpbWlsYXIgdG8gdGhlICJOTyBXQVJSQU5UWSIgZGlzY2xhaW1lciBiZWxvdwotICogICAgKCJEaXNjbGFpbWVyIikgYW5kIGFueSByZWRpc3RyaWJ1dGlvbiBtdXN0IGJlIGNvbmRpdGlvbmVkIHVwb24KLSAqICAgIGluY2x1ZGluZyBhIHN1YnN0YW50aWFsbHkgc2ltaWxhciBEaXNjbGFpbWVyIHJlcXVpcmVtZW50IGZvciBmdXJ0aGVyCi0gKiAgICBiaW5hcnkgcmVkaXN0cmlidXRpb24uCi0gKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMKLSAqICAgIG9mIGFueSBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTk8gV0FSUkFOVFkKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAotICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKLSAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HCi0gKiBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKLSAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KLSAqLwotCi0jaW5jbHVkZSA8YWNwaS9hY3BpLmg+Ci0jaW5jbHVkZSA8YWNwaS9hY2Rpc3BhdC5oPgotI2luY2x1ZGUgPGFjcGkvYWNpbnRlcnAuaD4KLQotI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfRVhFQ1VURVIKLUFDUElfTU9EVUxFX05BTUUoImV4ZmllbGQiKQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X3JlYWRfZGF0YV9mcm9tX2ZpZWxkCi0gKgotICogUEFSQU1FVEVSUzogIHdhbGtfc3RhdGUgICAgICAgICAgLSBDdXJyZW50IGV4ZWN1dGlvbiBzdGF0ZQotICogICAgICAgICAgICAgIG9ial9kZXNjICAgICAgICAgICAgLSBUaGUgbmFtZWQgZmllbGQKLSAqICAgICAgICAgICAgICByZXRfYnVmZmVyX2Rlc2MgICAgIC0gV2hlcmUgdGhlIHJldHVybiBkYXRhIG9iamVjdCBpcyBzdG9yZWQKLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IFJlYWQgZnJvbSBhIG5hbWVkIGZpZWxkLiAgUmV0dXJucyBlaXRoZXIgYW4gSW50ZWdlciBvciBhCi0gKiAgICAgICAgICAgICAgQnVmZmVyLCBkZXBlbmRpbmcgb24gdGhlIHNpemUgb2YgdGhlIGZpZWxkLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1hY3BpX3N0YXR1cwotYWNwaV9leF9yZWFkX2RhdGFfZnJvbV9maWVsZChzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlLAotCQkJICAgICB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYywKLQkJCSAgICAgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKnJldF9idWZmZXJfZGVzYykKLXsKLQlhY3BpX3N0YXR1cyBzdGF0dXM7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqYnVmZmVyX2Rlc2M7Ci0JYWNwaV9zaXplIGxlbmd0aDsKLQl2b2lkICpidWZmZXI7Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUihleF9yZWFkX2RhdGFfZnJvbV9maWVsZCwgb2JqX2Rlc2MpOwotCi0JLyogUGFyYW1ldGVyIHZhbGlkYXRpb24gKi8KLQotCWlmICghb2JqX2Rlc2MpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9OT19PUEVSQU5EKTsKLQl9Ci0JaWYgKCFyZXRfYnVmZmVyX2Rlc2MpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9QQVJBTUVURVIpOwotCX0KLQotCWlmIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRShvYmpfZGVzYykgPT0gQUNQSV9UWVBFX0JVRkZFUl9GSUVMRCkgewotCQkvKgotCQkgKiBJZiB0aGUgYnVmZmVyX2ZpZWxkIGFyZ3VtZW50cyBoYXZlIG5vdCBiZWVuIHByZXZpb3VzbHkgZXZhbHVhdGVkLAotCQkgKiBldmFsdWF0ZSB0aGVtIG5vdyBhbmQgc2F2ZSB0aGUgcmVzdWx0cy4KLQkJICovCi0JCWlmICghKG9ial9kZXNjLT5jb21tb24uZmxhZ3MgJiBBT1BPQkpfREFUQV9WQUxJRCkpIHsKLQkJCXN0YXR1cyA9IGFjcGlfZHNfZ2V0X2J1ZmZlcl9maWVsZF9hcmd1bWVudHMob2JqX2Rlc2MpOwotCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci0JCQl9Ci0JCX0KLQl9IGVsc2UKLQkgICAgaWYgKChBQ1BJX0dFVF9PQkpFQ1RfVFlQRShvYmpfZGVzYykgPT0gQUNQSV9UWVBFX0xPQ0FMX1JFR0lPTl9GSUVMRCkKLQkJJiYgKG9ial9kZXNjLT5maWVsZC5yZWdpb25fb2JqLT5yZWdpb24uc3BhY2VfaWQgPT0KLQkJICAgIEFDUElfQURSX1NQQUNFX1NNQlVTKSkgewotCQkvKgotCQkgKiBUaGlzIGlzIGFuIFNNQnVzIHJlYWQuICBXZSBtdXN0IGNyZWF0ZSBhIGJ1ZmZlciB0byBob2xkIHRoZSBkYXRhCi0JCSAqIGFuZCBkaXJlY3RseSBhY2Nlc3MgdGhlIHJlZ2lvbiBoYW5kbGVyLgotCQkgKi8KLQkJYnVmZmVyX2Rlc2MgPQotCQkgICAgYWNwaV91dF9jcmVhdGVfYnVmZmVyX29iamVjdChBQ1BJX1NNQlVTX0JVRkZFUl9TSVpFKTsKLQkJaWYgKCFidWZmZXJfZGVzYykgewotCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX01FTU9SWSk7Ci0JCX0KLQotCQkvKiBMb2NrIGVudGlyZSB0cmFuc2FjdGlvbiBpZiByZXF1ZXN0ZWQgKi8KLQotCQlhY3BpX2V4X2FjcXVpcmVfZ2xvYmFsX2xvY2sob2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5maWVsZF9mbGFncyk7Ci0KLQkJLyoKLQkJICogUGVyZm9ybSB0aGUgcmVhZC4KLQkJICogTm90ZTogU21idXMgcHJvdG9jb2wgdmFsdWUgaXMgcGFzc2VkIGluIHVwcGVyIDE2LWJpdHMgb2YgRnVuY3Rpb24KLQkJICovCi0JCXN0YXR1cyA9IGFjcGlfZXhfYWNjZXNzX3JlZ2lvbihvYmpfZGVzYywgMCwKLQkJCQkJICAgICAgIEFDUElfQ0FTVF9QVFIoYWNwaV9pbnRlZ2VyLAotCQkJCQkJCSAgICAgYnVmZmVyX2Rlc2MtPgotCQkJCQkJCSAgICAgYnVmZmVyLnBvaW50ZXIpLAotCQkJCQkgICAgICAgQUNQSV9SRUFEIHwgKG9ial9kZXNjLT5maWVsZC4KLQkJCQkJCQkgICAgYXR0cmlidXRlIDw8IDE2KSk7Ci0JCWFjcGlfZXhfcmVsZWFzZV9nbG9iYWxfbG9jayhvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmZpZWxkX2ZsYWdzKTsKLQkJZ290byBleGl0OwotCX0KLQotCS8qCi0JICogQWxsb2NhdGUgYSBidWZmZXIgZm9yIHRoZSBjb250ZW50cyBvZiB0aGUgZmllbGQuCi0JICoKLQkgKiBJZiB0aGUgZmllbGQgaXMgbGFyZ2VyIHRoYW4gdGhlIHNpemUgb2YgYW4gYWNwaV9pbnRlZ2VyLCBjcmVhdGUKLQkgKiBhIEJVRkZFUiB0byBob2xkIGl0LiAgT3RoZXJ3aXNlLCB1c2UgYW4gSU5URUdFUi4gIFRoaXMgYWxsb3dzCi0JICogdGhlIHVzZSBvZiBhcml0aG1ldGljIG9wZXJhdG9ycyBvbiB0aGUgcmV0dXJuZWQgdmFsdWUgaWYgdGhlCi0JICogZmllbGQgc2l6ZSBpcyBlcXVhbCBvciBzbWFsbGVyIHRoYW4gYW4gSW50ZWdlci4KLQkgKgotCSAqIE5vdGU6IEZpZWxkLmxlbmd0aCBpcyBpbiBiaXRzLgotCSAqLwotCWxlbmd0aCA9Ci0JICAgIChhY3BpX3NpemUpIEFDUElfUk9VTkRfQklUU19VUF9UT19CWVRFUyhvYmpfZGVzYy0+ZmllbGQuYml0X2xlbmd0aCk7Ci0JaWYgKGxlbmd0aCA+IGFjcGlfZ2JsX2ludGVnZXJfYnl0ZV93aWR0aCkgewotCi0JCS8qIEZpZWxkIGlzIHRvbyBsYXJnZSBmb3IgYW4gSW50ZWdlciwgY3JlYXRlIGEgQnVmZmVyIGluc3RlYWQgKi8KLQotCQlidWZmZXJfZGVzYyA9IGFjcGlfdXRfY3JlYXRlX2J1ZmZlcl9vYmplY3QobGVuZ3RoKTsKLQkJaWYgKCFidWZmZXJfZGVzYykgewotCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX01FTU9SWSk7Ci0JCX0KLQkJYnVmZmVyID0gYnVmZmVyX2Rlc2MtPmJ1ZmZlci5wb2ludGVyOwotCX0gZWxzZSB7Ci0JCS8qIEZpZWxkIHdpbGwgZml0IHdpdGhpbiBhbiBJbnRlZ2VyIChub3JtYWwgY2FzZSkgKi8KLQotCQlidWZmZXJfZGVzYyA9IGFjcGlfdXRfY3JlYXRlX2ludGVybmFsX29iamVjdChBQ1BJX1RZUEVfSU5URUdFUik7Ci0JCWlmICghYnVmZmVyX2Rlc2MpIHsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT19NRU1PUlkpOwotCQl9Ci0KLQkJbGVuZ3RoID0gYWNwaV9nYmxfaW50ZWdlcl9ieXRlX3dpZHRoOwotCQlidWZmZXJfZGVzYy0+aW50ZWdlci52YWx1ZSA9IDA7Ci0JCWJ1ZmZlciA9ICZidWZmZXJfZGVzYy0+aW50ZWdlci52YWx1ZTsKLQl9Ci0KLQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0JGSUVMRCwKLQkJCSAgIkZpZWxkUmVhZCBbVE9dOiAgIE9iaiAlcCwgVHlwZSAlWCwgQnVmICVwLCBCeXRlTGVuICVYXG4iLAotCQkJICBvYmpfZGVzYywgQUNQSV9HRVRfT0JKRUNUX1RZUEUob2JqX2Rlc2MpLCBidWZmZXIsCi0JCQkgICh1MzIpIGxlbmd0aCkpOwotCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfQkZJRUxELAotCQkJICAiRmllbGRSZWFkIFtGUk9NXTogQml0TGVuICVYLCBCaXRPZmYgJVgsIEJ5dGVPZmYgJVhcbiIsCi0JCQkgIG9ial9kZXNjLT5jb21tb25fZmllbGQuYml0X2xlbmd0aCwKLQkJCSAgb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5zdGFydF9maWVsZF9iaXRfb2Zmc2V0LAotCQkJICBvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmJhc2VfYnl0ZV9vZmZzZXQpKTsKLQotCS8qIExvY2sgZW50aXJlIHRyYW5zYWN0aW9uIGlmIHJlcXVlc3RlZCAqLwotCi0JYWNwaV9leF9hY3F1aXJlX2dsb2JhbF9sb2NrKG9ial9kZXNjLT5jb21tb25fZmllbGQuZmllbGRfZmxhZ3MpOwotCi0JLyogUmVhZCBmcm9tIHRoZSBmaWVsZCAqLwotCi0Jc3RhdHVzID0gYWNwaV9leF9leHRyYWN0X2Zyb21fZmllbGQob2JqX2Rlc2MsIGJ1ZmZlciwgKHUzMikgbGVuZ3RoKTsKLQlhY3BpX2V4X3JlbGVhc2VfZ2xvYmFsX2xvY2sob2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5maWVsZF9mbGFncyk7Ci0KLSAgICAgIGV4aXQ6Ci0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZShidWZmZXJfZGVzYyk7Ci0JfSBlbHNlIHsKLQkJKnJldF9idWZmZXJfZGVzYyA9IGJ1ZmZlcl9kZXNjOwotCX0KLQotCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X3dyaXRlX2RhdGFfdG9fZmllbGQKLSAqCi0gKiBQQVJBTUVURVJTOiAgc291cmNlX2Rlc2MgICAgICAgICAtIENvbnRhaW5zIGRhdGEgdG8gd3JpdGUKLSAqICAgICAgICAgICAgICBvYmpfZGVzYyAgICAgICAgICAgIC0gVGhlIG5hbWVkIGZpZWxkCi0gKiAgICAgICAgICAgICAgcmVzdWx0X2Rlc2MgICAgICAgICAtIFdoZXJlIHRoZSByZXR1cm4gdmFsdWUgaXMgcmV0dXJuZWQsIGlmIGFueQotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKLSAqCi0gKiBERVNDUklQVElPTjogV3JpdGUgdG8gYSBuYW1lZCBmaWVsZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWFjcGlfc3RhdHVzCi1hY3BpX2V4X3dyaXRlX2RhdGFfdG9fZmllbGQodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqc291cmNlX2Rlc2MsCi0JCQkgICAgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2MsCi0JCQkgICAgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKnJlc3VsdF9kZXNjKQotewotCWFjcGlfc3RhdHVzIHN0YXR1czsKLQl1MzIgbGVuZ3RoOwotCXZvaWQgKmJ1ZmZlcjsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpidWZmZXJfZGVzYzsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKGV4X3dyaXRlX2RhdGFfdG9fZmllbGQsIG9ial9kZXNjKTsKLQotCS8qIFBhcmFtZXRlciB2YWxpZGF0aW9uICovCi0KLQlpZiAoIXNvdXJjZV9kZXNjIHx8ICFvYmpfZGVzYykgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX05PX09QRVJBTkQpOwotCX0KLQotCWlmIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRShvYmpfZGVzYykgPT0gQUNQSV9UWVBFX0JVRkZFUl9GSUVMRCkgewotCQkvKgotCQkgKiBJZiB0aGUgYnVmZmVyX2ZpZWxkIGFyZ3VtZW50cyBoYXZlIG5vdCBiZWVuIHByZXZpb3VzbHkgZXZhbHVhdGVkLAotCQkgKiBldmFsdWF0ZSB0aGVtIG5vdyBhbmQgc2F2ZSB0aGUgcmVzdWx0cy4KLQkJICovCi0JCWlmICghKG9ial9kZXNjLT5jb21tb24uZmxhZ3MgJiBBT1BPQkpfREFUQV9WQUxJRCkpIHsKLQkJCXN0YXR1cyA9IGFjcGlfZHNfZ2V0X2J1ZmZlcl9maWVsZF9hcmd1bWVudHMob2JqX2Rlc2MpOwotCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci0JCQl9Ci0JCX0KLQl9IGVsc2UKLQkgICAgaWYgKChBQ1BJX0dFVF9PQkpFQ1RfVFlQRShvYmpfZGVzYykgPT0gQUNQSV9UWVBFX0xPQ0FMX1JFR0lPTl9GSUVMRCkKLQkJJiYgKG9ial9kZXNjLT5maWVsZC5yZWdpb25fb2JqLT5yZWdpb24uc3BhY2VfaWQgPT0KLQkJICAgIEFDUElfQURSX1NQQUNFX1NNQlVTKSkgewotCQkvKgotCQkgKiBUaGlzIGlzIGFuIFNNQnVzIHdyaXRlLiAgV2Ugd2lsbCBieXBhc3MgdGhlIGVudGlyZSBmaWVsZCBtZWNoYW5pc20KLQkJICogYW5kIGhhbmRvZmYgdGhlIGJ1ZmZlciBkaXJlY3RseSB0byB0aGUgaGFuZGxlci4KLQkJICoKLQkJICogU291cmNlIG11c3QgYmUgYSBidWZmZXIgb2Ygc3VmZmljaWVudCBzaXplIChBQ1BJX1NNQlVTX0JVRkZFUl9TSVpFKS4KLQkJICovCi0JCWlmIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRShzb3VyY2VfZGVzYykgIT0gQUNQSV9UWVBFX0JVRkZFUikgewotCQkJQUNQSV9FUlJPUigoQUVfSU5GTywKLQkJCQkgICAgIlNNQnVzIHdyaXRlIHJlcXVpcmVzIEJ1ZmZlciwgZm91bmQgdHlwZSAlcyIsCi0JCQkJICAgIGFjcGlfdXRfZ2V0X29iamVjdF90eXBlX25hbWUoc291cmNlX2Rlc2MpKSk7Ci0KLQkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfT1BFUkFORF9UWVBFKTsKLQkJfQotCi0JCWlmIChzb3VyY2VfZGVzYy0+YnVmZmVyLmxlbmd0aCA8IEFDUElfU01CVVNfQlVGRkVSX1NJWkUpIHsKLQkJCUFDUElfRVJST1IoKEFFX0lORk8sCi0JCQkJICAgICJTTUJ1cyB3cml0ZSByZXF1aXJlcyBCdWZmZXIgb2YgbGVuZ3RoICVYLCBmb3VuZCBsZW5ndGggJVgiLAotCQkJCSAgICBBQ1BJX1NNQlVTX0JVRkZFUl9TSVpFLAotCQkJCSAgICBzb3VyY2VfZGVzYy0+YnVmZmVyLmxlbmd0aCkpOwotCi0JCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX0JVRkZFUl9MSU1JVCk7Ci0JCX0KLQotCQlidWZmZXJfZGVzYyA9Ci0JCSAgICBhY3BpX3V0X2NyZWF0ZV9idWZmZXJfb2JqZWN0KEFDUElfU01CVVNfQlVGRkVSX1NJWkUpOwotCQlpZiAoIWJ1ZmZlcl9kZXNjKSB7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9fTUVNT1JZKTsKLQkJfQotCi0JCWJ1ZmZlciA9IGJ1ZmZlcl9kZXNjLT5idWZmZXIucG9pbnRlcjsKLQkJQUNQSV9NRU1DUFkoYnVmZmVyLCBzb3VyY2VfZGVzYy0+YnVmZmVyLnBvaW50ZXIsCi0JCQkgICAgQUNQSV9TTUJVU19CVUZGRVJfU0laRSk7Ci0KLQkJLyogTG9jayBlbnRpcmUgdHJhbnNhY3Rpb24gaWYgcmVxdWVzdGVkICovCi0KLQkJYWNwaV9leF9hY3F1aXJlX2dsb2JhbF9sb2NrKG9ial9kZXNjLT5jb21tb25fZmllbGQuZmllbGRfZmxhZ3MpOwotCi0JCS8qCi0JCSAqIFBlcmZvcm0gdGhlIHdyaXRlIChyZXR1cm5zIHN0YXR1cyBhbmQgcGVyaGFwcyBkYXRhIGluIHRoZQotCQkgKiBzYW1lIGJ1ZmZlcikKLQkJICogTm90ZTogU01CdXMgcHJvdG9jb2wgdHlwZSBpcyBwYXNzZWQgaW4gdXBwZXIgMTYtYml0cyBvZiBGdW5jdGlvbi4KLQkJICovCi0JCXN0YXR1cyA9IGFjcGlfZXhfYWNjZXNzX3JlZ2lvbihvYmpfZGVzYywgMCwKLQkJCQkJICAgICAgIChhY3BpX2ludGVnZXIgKikgYnVmZmVyLAotCQkJCQkgICAgICAgQUNQSV9XUklURSB8IChvYmpfZGVzYy0+ZmllbGQuCi0JCQkJCQkJICAgICBhdHRyaWJ1dGUgPDwgMTYpKTsKLQkJYWNwaV9leF9yZWxlYXNlX2dsb2JhbF9sb2NrKG9ial9kZXNjLT5jb21tb25fZmllbGQuZmllbGRfZmxhZ3MpOwotCi0JCSpyZXN1bHRfZGVzYyA9IGJ1ZmZlcl9kZXNjOwotCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLQl9Ci0KLQkvKiBHZXQgYSBwb2ludGVyIHRvIHRoZSBkYXRhIHRvIGJlIHdyaXR0ZW4gKi8KLQotCXN3aXRjaCAoQUNQSV9HRVRfT0JKRUNUX1RZUEUoc291cmNlX2Rlc2MpKSB7Ci0JY2FzZSBBQ1BJX1RZUEVfSU5URUdFUjoKLQkJYnVmZmVyID0gJnNvdXJjZV9kZXNjLT5pbnRlZ2VyLnZhbHVlOwotCQlsZW5ndGggPSBzaXplb2Yoc291cmNlX2Rlc2MtPmludGVnZXIudmFsdWUpOwotCQlicmVhazsKLQotCWNhc2UgQUNQSV9UWVBFX0JVRkZFUjoKLQkJYnVmZmVyID0gc291cmNlX2Rlc2MtPmJ1ZmZlci5wb2ludGVyOwotCQlsZW5ndGggPSBzb3VyY2VfZGVzYy0+YnVmZmVyLmxlbmd0aDsKLQkJYnJlYWs7Ci0KLQljYXNlIEFDUElfVFlQRV9TVFJJTkc6Ci0JCWJ1ZmZlciA9IHNvdXJjZV9kZXNjLT5zdHJpbmcucG9pbnRlcjsKLQkJbGVuZ3RoID0gc291cmNlX2Rlc2MtPnN0cmluZy5sZW5ndGg7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9PUEVSQU5EX1RZUEUpOwotCX0KLQotCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfQkZJRUxELAotCQkJICAiRmllbGRXcml0ZSBbRlJPTV06IE9iaiAlcCAoJXM6JVgpLCBCdWYgJXAsIEJ5dGVMZW4gJVhcbiIsCi0JCQkgIHNvdXJjZV9kZXNjLAotCQkJICBhY3BpX3V0X2dldF90eXBlX25hbWUoQUNQSV9HRVRfT0JKRUNUX1RZUEUKLQkJCQkJCShzb3VyY2VfZGVzYykpLAotCQkJICBBQ1BJX0dFVF9PQkpFQ1RfVFlQRShzb3VyY2VfZGVzYyksIGJ1ZmZlciwgbGVuZ3RoKSk7Ci0KLQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0JGSUVMRCwKLQkJCSAgIkZpZWxkV3JpdGUgW1RPXTogICBPYmogJXAgKCVzOiVYKSwgQml0TGVuICVYLCBCaXRPZmYgJVgsIEJ5dGVPZmYgJVhcbiIsCi0JCQkgIG9ial9kZXNjLAotCQkJICBhY3BpX3V0X2dldF90eXBlX25hbWUoQUNQSV9HRVRfT0JKRUNUX1RZUEUob2JqX2Rlc2MpKSwKLQkJCSAgQUNQSV9HRVRfT0JKRUNUX1RZUEUob2JqX2Rlc2MpLAotCQkJICBvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmJpdF9sZW5ndGgsCi0JCQkgIG9ial9kZXNjLT5jb21tb25fZmllbGQuc3RhcnRfZmllbGRfYml0X29mZnNldCwKLQkJCSAgb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5iYXNlX2J5dGVfb2Zmc2V0KSk7Ci0KLQkvKiBMb2NrIGVudGlyZSB0cmFuc2FjdGlvbiBpZiByZXF1ZXN0ZWQgKi8KLQotCWFjcGlfZXhfYWNxdWlyZV9nbG9iYWxfbG9jayhvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmZpZWxkX2ZsYWdzKTsKLQotCS8qIFdyaXRlIHRvIHRoZSBmaWVsZCAqLwotCi0Jc3RhdHVzID0gYWNwaV9leF9pbnNlcnRfaW50b19maWVsZChvYmpfZGVzYywgYnVmZmVyLCBsZW5ndGgpOwotCWFjcGlfZXhfcmVsZWFzZV9nbG9iYWxfbG9jayhvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmZpZWxkX2ZsYWdzKTsKLQotCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4ZmxkaW8uYyBiL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leGZsZGlvLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmZjlkMWYuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4ZmxkaW8uYworKysgL2Rldi9udWxsCkBAIC0xLDk1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogTW9kdWxlIE5hbWU6IGV4ZmxkaW8gLSBBbWwgRmllbGQgSS9PCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwOCwgSW50ZWwgQ29ycC4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKLSAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIGF0IG1pbmltdW0gYSBkaXNjbGFpbWVyCi0gKiAgICBzdWJzdGFudGlhbGx5IHNpbWlsYXIgdG8gdGhlICJOTyBXQVJSQU5UWSIgZGlzY2xhaW1lciBiZWxvdwotICogICAgKCJEaXNjbGFpbWVyIikgYW5kIGFueSByZWRpc3RyaWJ1dGlvbiBtdXN0IGJlIGNvbmRpdGlvbmVkIHVwb24KLSAqICAgIGluY2x1ZGluZyBhIHN1YnN0YW50aWFsbHkgc2ltaWxhciBEaXNjbGFpbWVyIHJlcXVpcmVtZW50IGZvciBmdXJ0aGVyCi0gKiAgICBiaW5hcnkgcmVkaXN0cmlidXRpb24uCi0gKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMKLSAqICAgIG9mIGFueSBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTk8gV0FSUkFOVFkKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAotICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKLSAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HCi0gKiBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKLSAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KLSAqLwotCi0jaW5jbHVkZSA8YWNwaS9hY3BpLmg+Ci0jaW5jbHVkZSA8YWNwaS9hY2ludGVycC5oPgotI2luY2x1ZGUgPGFjcGkvYW1sY29kZS5oPgotI2luY2x1ZGUgPGFjcGkvYWNldmVudHMuaD4KLSNpbmNsdWRlIDxhY3BpL2FjZGlzcGF0Lmg+Ci0KLSNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX0VYRUNVVEVSCi1BQ1BJX01PRFVMRV9OQU1FKCJleGZsZGlvIikKLQotLyogTG9jYWwgcHJvdG90eXBlcyAqLwotc3RhdGljIGFjcGlfc3RhdHVzCi1hY3BpX2V4X2ZpZWxkX2RhdHVtX2lvKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjLAotCQkgICAgICAgdTMyIGZpZWxkX2RhdHVtX2J5dGVfb2Zmc2V0LAotCQkgICAgICAgYWNwaV9pbnRlZ2VyICogdmFsdWUsIHUzMiByZWFkX3dyaXRlKTsKLQotc3RhdGljIHU4Ci1hY3BpX2V4X3JlZ2lzdGVyX292ZXJmbG93KHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjLAotCQkJICBhY3BpX2ludGVnZXIgdmFsdWUpOwotCi1zdGF0aWMgYWNwaV9zdGF0dXMKLWFjcGlfZXhfc2V0dXBfcmVnaW9uKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjLAotCQkgICAgIHUzMiBmaWVsZF9kYXR1bV9ieXRlX29mZnNldCk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfZXhfc2V0dXBfcmVnaW9uCi0gKgotICogUEFSQU1FVEVSUzogIG9ial9kZXNjICAgICAgICAgICAgICAgIC0gRmllbGQgdG8gYmUgcmVhZCBvciB3cml0dGVuCi0gKiAgICAgICAgICAgICAgZmllbGRfZGF0dW1fYnl0ZV9vZmZzZXQgLSBCeXRlIG9mZnNldCBvZiB0aGlzIGRhdHVtIHdpdGhpbiB0aGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudCBmaWVsZAotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKLSAqCi0gKiBERVNDUklQVElPTjogQ29tbW9uIHByb2Nlc3NpbmcgZm9yIGFjcGlfZXhfZXh0cmFjdF9mcm9tX2ZpZWxkIGFuZAotICogICAgICAgICAgICAgIGFjcGlfZXhfaW5zZXJ0X2ludG9fZmllbGQuIEluaXRpYWxpemUgdGhlIFJlZ2lvbiBpZiBuZWNlc3NhcnkgYW5kCi0gKiAgICAgICAgICAgICAgdmFsaWRhdGUgdGhlIHJlcXVlc3QuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIGFjcGlfc3RhdHVzCi1hY3BpX2V4X3NldHVwX3JlZ2lvbih1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYywKLQkJICAgICB1MzIgZmllbGRfZGF0dW1fYnl0ZV9vZmZzZXQpCi17Ci0JYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqcmduX2Rlc2M7Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1UzMihleF9zZXR1cF9yZWdpb24sIGZpZWxkX2RhdHVtX2J5dGVfb2Zmc2V0KTsKLQotCXJnbl9kZXNjID0gb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5yZWdpb25fb2JqOwotCi0JLyogV2UgbXVzdCBoYXZlIGEgdmFsaWQgcmVnaW9uICovCi0KLQlpZiAoQUNQSV9HRVRfT0JKRUNUX1RZUEUocmduX2Rlc2MpICE9IEFDUElfVFlQRV9SRUdJT04pIHsKLQkJQUNQSV9FUlJPUigoQUVfSU5GTywgIk5lZWRlZCBSZWdpb24sIGZvdW5kIHR5cGUgJVggKCVzKSIsCi0JCQkgICAgQUNQSV9HRVRfT0JKRUNUX1RZUEUocmduX2Rlc2MpLAotCQkJICAgIGFjcGlfdXRfZ2V0X29iamVjdF90eXBlX25hbWUocmduX2Rlc2MpKSk7Ci0KLQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9PUEVSQU5EX1RZUEUpOwotCX0KLQotCS8qCi0JICogSWYgdGhlIFJlZ2lvbiBBZGRyZXNzIGFuZCBMZW5ndGggaGF2ZSBub3QgYmVlbiBwcmV2aW91c2x5IGV2YWx1YXRlZCwKLQkgKiBldmFsdWF0ZSB0aGVtIG5vdyBhbmQgc2F2ZSB0aGUgcmVzdWx0cy4KLQkgKi8KLQlpZiAoIShyZ25fZGVzYy0+Y29tbW9uLmZsYWdzICYgQU9QT0JKX0RBVEFfVkFMSUQpKSB7Ci0JCXN0YXR1cyA9IGFjcGlfZHNfZ2V0X3JlZ2lvbl9hcmd1bWVudHMocmduX2Rlc2MpOwotCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotCQl9Ci0JfQotCi0JLyogRXhpdCBpZiBBZGRyZXNzL0xlbmd0aCBoYXZlIGJlZW4gZGlzYWxsb3dlZCBieSB0aGUgaG9zdCBPUyAqLwotCi0JaWYgKHJnbl9kZXNjLT5jb21tb24uZmxhZ3MgJiBBT1BPQkpfSU5WQUxJRCkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX0lMTEVHQUxfQUREUkVTUyk7Ci0JfQotCi0JLyoKLQkgKiBFeGl0IG5vdyBmb3IgU01CdXMgYWRkcmVzcyBzcGFjZSwgaXQgaGFzIGEgbm9uLWxpbmVhciBhZGRyZXNzIHNwYWNlCi0JICogYW5kIHRoZSByZXF1ZXN0IGNhbm5vdCBiZSBkaXJlY3RseSB2YWxpZGF0ZWQKLQkgKi8KLQlpZiAocmduX2Rlc2MtPnJlZ2lvbi5zcGFjZV9pZCA9PSBBQ1BJX0FEUl9TUEFDRV9TTUJVUykgewotCi0JCS8qIFNNQnVzIGhhcyBhIG5vbi1saW5lYXIgYWRkcmVzcyBzcGFjZSAqLwotCi0JCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7Ci0JfQotI2lmZGVmIEFDUElfVU5ERVJfREVWRUxPUE1FTlQKLQkvKgotCSAqIElmIHRoZSBGaWVsZCBhY2Nlc3MgaXMgYW55X2FjYywgd2UgY2FuIG5vdyBjb21wdXRlIHRoZSBvcHRpbWFsCi0JICogYWNjZXNzIChiZWNhdXNlIHdlIGtub3cga25vdyB0aGUgbGVuZ3RoIG9mIHRoZSBwYXJlbnQgcmVnaW9uKQotCSAqLwotCWlmICghKG9ial9kZXNjLT5jb21tb24uZmxhZ3MgJiBBT1BPQkpfREFUQV9WQUxJRCkpIHsKLQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLQkJfQotCX0KLSNlbmRpZgotCi0JLyoKLQkgKiBWYWxpZGF0ZSB0aGUgcmVxdWVzdC4gIFRoZSBlbnRpcmUgcmVxdWVzdCBmcm9tIHRoZSBieXRlIG9mZnNldCBmb3IgYQotCSAqIGxlbmd0aCBvZiBvbmUgZmllbGQgZGF0dW0gKGFjY2VzcyB3aWR0aCkgbXVzdCBmaXQgd2l0aGluIHRoZSByZWdpb24uCi0JICogKFJlZ2lvbiBsZW5ndGggaXMgc3BlY2lmaWVkIGluIGJ5dGVzKQotCSAqLwotCWlmIChyZ25fZGVzYy0+cmVnaW9uLmxlbmd0aCA8Ci0JICAgIChvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmJhc2VfYnl0ZV9vZmZzZXQgKwotCSAgICAgZmllbGRfZGF0dW1fYnl0ZV9vZmZzZXQgKwotCSAgICAgb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5hY2Nlc3NfYnl0ZV93aWR0aCkpIHsKLQkJaWYgKGFjcGlfZ2JsX2VuYWJsZV9pbnRlcnByZXRlcl9zbGFjaykgewotCQkJLyoKLQkJCSAqIFNsYWNrIG1vZGUgb25seTogIFdlIHdpbGwgZ28gYWhlYWQgYW5kIGFsbG93IGFjY2VzcyB0byB0aGlzCi0JCQkgKiBmaWVsZCBpZiBpdCBpcyB3aXRoaW4gdGhlIHJlZ2lvbiBsZW5ndGggcm91bmRlZCB1cCB0byB0aGUgbmV4dAotCQkJICogYWNjZXNzIHdpZHRoIGJvdW5kYXJ5LiBhY3BpX3NpemUgY2FzdCBmb3IgNjQtYml0IGNvbXBpbGUuCi0JCQkgKi8KLQkJCWlmIChBQ1BJX1JPVU5EX1VQKHJnbl9kZXNjLT5yZWdpb24ubGVuZ3RoLAotCQkJCQkgIG9ial9kZXNjLT5jb21tb25fZmllbGQuCi0JCQkJCSAgYWNjZXNzX2J5dGVfd2lkdGgpID49Ci0JCQkgICAgKChhY3BpX3NpemUpIG9ial9kZXNjLT5jb21tb25fZmllbGQuCi0JCQkgICAgIGJhc2VfYnl0ZV9vZmZzZXQgKwotCQkJICAgICBvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmFjY2Vzc19ieXRlX3dpZHRoICsKLQkJCSAgICAgZmllbGRfZGF0dW1fYnl0ZV9vZmZzZXQpKSB7Ci0JCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKLQkJCX0KLQkJfQotCi0JCWlmIChyZ25fZGVzYy0+cmVnaW9uLmxlbmd0aCA8Ci0JCSAgICBvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmFjY2Vzc19ieXRlX3dpZHRoKSB7Ci0JCQkvKgotCQkJICogVGhpcyBpcyB0aGUgY2FzZSB3aGVyZSB0aGUgYWNjZXNzX3R5cGUgKGFjY193b3JkLCBldGMuKSBpcyB3aWRlcgotCQkJICogdGhhbiB0aGUgcmVnaW9uIGl0c2VsZi4gIEZvciBleGFtcGxlLCBhIHJlZ2lvbiBvZiBsZW5ndGggb25lCi0JCQkgKiBieXRlLCBhbmQgYSBmaWVsZCB3aXRoIER3b3JkIGFjY2VzcyBzcGVjaWZpZWQuCi0JCQkgKi8KLQkJCUFDUElfRVJST1IoKEFFX0lORk8sCi0JCQkJICAgICJGaWVsZCBbJTQuNHNdIGFjY2VzcyB3aWR0aCAoJWQgYnl0ZXMpIHRvbyBsYXJnZSBmb3IgcmVnaW9uIFslNC40c10gKGxlbmd0aCAlWCkiLAotCQkJCSAgICBhY3BpX3V0X2dldF9ub2RlX25hbWUob2JqX2Rlc2MtPgotCQkJCQkJCSAgY29tbW9uX2ZpZWxkLm5vZGUpLAotCQkJCSAgICBvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmFjY2Vzc19ieXRlX3dpZHRoLAotCQkJCSAgICBhY3BpX3V0X2dldF9ub2RlX25hbWUocmduX2Rlc2MtPnJlZ2lvbi4KLQkJCQkJCQkgIG5vZGUpLAotCQkJCSAgICByZ25fZGVzYy0+cmVnaW9uLmxlbmd0aCkpOwotCQl9Ci0KLQkJLyoKLQkJICogT2Zmc2V0IHJvdW5kZWQgdXAgdG8gbmV4dCBtdWx0aXBsZSBvZiBmaWVsZCB3aWR0aAotCQkgKiBleGNlZWRzIHJlZ2lvbiBsZW5ndGgsIGluZGljYXRlIGFuIGVycm9yCi0JCSAqLwotCQlBQ1BJX0VSUk9SKChBRV9JTkZPLAotCQkJICAgICJGaWVsZCBbJTQuNHNdIEJhc2UrT2Zmc2V0K1dpZHRoICVYKyVYKyVYIGlzIGJleW9uZCBlbmQgb2YgcmVnaW9uIFslNC40c10gKGxlbmd0aCAlWCkiLAotCQkJICAgIGFjcGlfdXRfZ2V0X25vZGVfbmFtZShvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLm5vZGUpLAotCQkJICAgIG9ial9kZXNjLT5jb21tb25fZmllbGQuYmFzZV9ieXRlX29mZnNldCwKLQkJCSAgICBmaWVsZF9kYXR1bV9ieXRlX29mZnNldCwKLQkJCSAgICBvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmFjY2Vzc19ieXRlX3dpZHRoLAotCQkJICAgIGFjcGlfdXRfZ2V0X25vZGVfbmFtZShyZ25fZGVzYy0+cmVnaW9uLm5vZGUpLAotCQkJICAgIHJnbl9kZXNjLT5yZWdpb24ubGVuZ3RoKSk7Ci0KLQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9SRUdJT05fTElNSVQpOwotCX0KLQotCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfZXhfYWNjZXNzX3JlZ2lvbgotICoKLSAqIFBBUkFNRVRFUlM6ICBvYmpfZGVzYyAgICAgICAgICAgICAgICAtIEZpZWxkIHRvIGJlIHJlYWQKLSAqICAgICAgICAgICAgICBmaWVsZF9kYXR1bV9ieXRlX29mZnNldCAtIEJ5dGUgb2Zmc2V0IG9mIHRoaXMgZGF0dW0gd2l0aGluIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50IGZpZWxkCi0gKiAgICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgICAgICAgLSBXaGVyZSB0byBzdG9yZSB2YWx1ZSAobXVzdCBhdCBsZWFzdAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHNpemUgb2YgYWNwaV9pbnRlZ2VyKQotICogICAgICAgICAgICAgIEZ1bmN0aW9uICAgICAgICAgICAgICAgIC0gUmVhZCBvciBXcml0ZSBmbGFnIHBsdXMgb3RoZXIgcmVnaW9uLQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwZW5kZW50IGZsYWdzCi0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cwotICoKLSAqIERFU0NSSVBUSU9OOiBSZWFkIG9yIFdyaXRlIGEgc2luZ2xlIGZpZWxkIGRhdHVtIHRvIGFuIE9wZXJhdGlvbiBSZWdpb24uCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotYWNwaV9zdGF0dXMKLWFjcGlfZXhfYWNjZXNzX3JlZ2lvbih1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYywKLQkJICAgICAgdTMyIGZpZWxkX2RhdHVtX2J5dGVfb2Zmc2V0LAotCQkgICAgICBhY3BpX2ludGVnZXIgKiB2YWx1ZSwgdTMyIGZ1bmN0aW9uKQotewotCWFjcGlfc3RhdHVzIHN0YXR1czsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpyZ25fZGVzYzsKLQlhY3BpX3BoeXNpY2FsX2FkZHJlc3MgYWRkcmVzczsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UoZXhfYWNjZXNzX3JlZ2lvbik7Ci0KLQkvKgotCSAqIEVuc3VyZSB0aGF0IHRoZSByZWdpb24gb3BlcmFuZHMgYXJlIGZ1bGx5IGV2YWx1YXRlZCBhbmQgdmVyaWZ5Ci0JICogdGhlIHZhbGlkaXR5IG9mIHRoZSByZXF1ZXN0Ci0JICovCi0Jc3RhdHVzID0gYWNwaV9leF9zZXR1cF9yZWdpb24ob2JqX2Rlc2MsIGZpZWxkX2RhdHVtX2J5dGVfb2Zmc2V0KTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci0JfQotCi0JLyoKLQkgKiBUaGUgcGh5c2ljYWwgYWRkcmVzcyBvZiB0aGlzIGZpZWxkIGRhdHVtIGlzOgotCSAqCi0JICogMSkgVGhlIGJhc2Ugb2YgdGhlIHJlZ2lvbiwgcGx1cwotCSAqIDIpIFRoZSBiYXNlIG9mZnNldCBvZiB0aGUgZmllbGQsIHBsdXMKLQkgKiAzKSBUaGUgY3VycmVudCBvZmZzZXQgaW50byB0aGUgZmllbGQKLQkgKi8KLQlyZ25fZGVzYyA9IG9ial9kZXNjLT5jb21tb25fZmllbGQucmVnaW9uX29iajsKLQlhZGRyZXNzID0gcmduX2Rlc2MtPnJlZ2lvbi5hZGRyZXNzICsKLQkgICAgb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5iYXNlX2J5dGVfb2Zmc2V0ICsgZmllbGRfZGF0dW1fYnl0ZV9vZmZzZXQ7Ci0KLQlpZiAoKGZ1bmN0aW9uICYgQUNQSV9JT19NQVNLKSA9PSBBQ1BJX1JFQUQpIHsKLQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9CRklFTEQsICJbUkVBRF0iKSk7Ci0JfSBlbHNlIHsKLQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9CRklFTEQsICJbV1JJVEVdIikpOwotCX0KLQotCUFDUElfREVCVUdfUFJJTlRfUkFXKChBQ1BJX0RCX0JGSUVMRCwKLQkJCSAgICAgICIgUmVnaW9uIFslczolWF0sIFdpZHRoICVYLCBCeXRlQmFzZSAlWCwgT2Zmc2V0ICVYIGF0ICVwXG4iLAotCQkJICAgICAgYWNwaV91dF9nZXRfcmVnaW9uX25hbWUocmduX2Rlc2MtPnJlZ2lvbi4KLQkJCQkJCSAgICAgIHNwYWNlX2lkKSwKLQkJCSAgICAgIHJnbl9kZXNjLT5yZWdpb24uc3BhY2VfaWQsCi0JCQkgICAgICBvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmFjY2Vzc19ieXRlX3dpZHRoLAotCQkJICAgICAgb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5iYXNlX2J5dGVfb2Zmc2V0LAotCQkJICAgICAgZmllbGRfZGF0dW1fYnl0ZV9vZmZzZXQsIEFDUElfQ0FTVF9QVFIodm9pZCwKLQkJCQkJCQkJICAgICBhZGRyZXNzKSkpOwotCi0JLyogSW52b2tlIHRoZSBhcHByb3ByaWF0ZSBhZGRyZXNzX3NwYWNlL29wX3JlZ2lvbiBoYW5kbGVyICovCi0KLQlzdGF0dXMgPSBhY3BpX2V2X2FkZHJlc3Nfc3BhY2VfZGlzcGF0Y2gocmduX2Rlc2MsIGZ1bmN0aW9uLAotCQkJCQkJYWRkcmVzcywKLQkJCQkJCUFDUElfTVVMXzgob2JqX2Rlc2MtPgotCQkJCQkJCSAgIGNvbW1vbl9maWVsZC4KLQkJCQkJCQkgICBhY2Nlc3NfYnl0ZV93aWR0aCksCi0JCQkJCQl2YWx1ZSk7Ci0KLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJaWYgKHN0YXR1cyA9PSBBRV9OT1RfSU1QTEVNRU5URUQpIHsKLQkJCUFDUElfRVJST1IoKEFFX0lORk8sCi0JCQkJICAgICJSZWdpb24gJXMoJVgpIG5vdCBpbXBsZW1lbnRlZCIsCi0JCQkJICAgIGFjcGlfdXRfZ2V0X3JlZ2lvbl9uYW1lKHJnbl9kZXNjLT5yZWdpb24uCi0JCQkJCQkJICAgIHNwYWNlX2lkKSwKLQkJCQkgICAgcmduX2Rlc2MtPnJlZ2lvbi5zcGFjZV9pZCkpOwotCQl9IGVsc2UgaWYgKHN0YXR1cyA9PSBBRV9OT1RfRVhJU1QpIHsKLQkJCUFDUElfRVJST1IoKEFFX0lORk8sCi0JCQkJICAgICJSZWdpb24gJXMoJVgpIGhhcyBubyBoYW5kbGVyIiwKLQkJCQkgICAgYWNwaV91dF9nZXRfcmVnaW9uX25hbWUocmduX2Rlc2MtPnJlZ2lvbi4KLQkJCQkJCQkgICAgc3BhY2VfaWQpLAotCQkJCSAgICByZ25fZGVzYy0+cmVnaW9uLnNwYWNlX2lkKSk7Ci0JCX0KLQl9Ci0KLQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9leF9yZWdpc3Rlcl9vdmVyZmxvdwotICoKLSAqIFBBUkFNRVRFUlM6ICBvYmpfZGVzYyAgICAgICAgICAgICAgICAtIFJlZ2lzdGVyKEZpZWxkKSB0byBiZSB3cml0dGVuCi0gKiAgICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgICAgICAgLSBWYWx1ZSB0byBiZSBzdG9yZWQKLSAqCi0gKiBSRVRVUk46ICAgICAgVFJVRSBpZiB2YWx1ZSBvdmVyZmxvd3MgdGhlIGZpZWxkLCBGQUxTRSBvdGhlcndpc2UKLSAqCi0gKiBERVNDUklQVElPTjogQ2hlY2sgaWYgYSB2YWx1ZSBpcyBvdXQgb2YgcmFuZ2Ugb2YgdGhlIGZpZWxkIGJlaW5nIHdyaXR0ZW4uCi0gKiAgICAgICAgICAgICAgVXNlZCB0byBjaGVjayBpZiB0aGUgdmFsdWVzIHdyaXR0ZW4gdG8gSW5kZXggYW5kIEJhbmsgcmVnaXN0ZXJzCi0gKiAgICAgICAgICAgICAgYXJlIG91dCBvZiByYW5nZS4gIE5vcm1hbGx5LCB0aGUgdmFsdWUgaXMgc2ltcGx5IHRydW5jYXRlZAotICogICAgICAgICAgICAgIHRvIGZpdCB0aGUgZmllbGQsIGJ1dCB0aGlzIGNhc2UgaXMgbW9zdCBsaWtlbHkgYSBzZXJpb3VzCi0gKiAgICAgICAgICAgICAgY29kaW5nIGVycm9yIGluIHRoZSBBU0wuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIHU4Ci1hY3BpX2V4X3JlZ2lzdGVyX292ZXJmbG93KHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjLAotCQkJICBhY3BpX2ludGVnZXIgdmFsdWUpCi17Ci0KLQlpZiAob2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5iaXRfbGVuZ3RoID49IEFDUElfSU5URUdFUl9CSVRfU0laRSkgewotCQkvKgotCQkgKiBUaGUgZmllbGQgaXMgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgdGhlIG1heGltdW0gaW50ZWdlciwgc28gd2UgY2FuCi0JCSAqIG5ldmVyIG92ZXJmbG93IGl0LgotCQkgKi8KLQkJcmV0dXJuIChGQUxTRSk7Ci0JfQotCi0JaWYgKHZhbHVlID49ICgoYWNwaV9pbnRlZ2VyKSAxIDw8IG9ial9kZXNjLT5jb21tb25fZmllbGQuYml0X2xlbmd0aCkpIHsKLQkJLyoKLQkJICogVGhlIFZhbHVlIGlzIGxhcmdlciB0aGFuIHRoZSBtYXhpbXVtIHZhbHVlIHRoYXQgY2FuIGZpdCBpbnRvCi0JCSAqIHRoZSByZWdpc3Rlci4KLQkJICovCi0JCXJldHVybiAoVFJVRSk7Ci0JfQotCi0JLyogVGhlIFZhbHVlIHdpbGwgZml0IGludG8gdGhlIGZpZWxkIHdpdGggbm8gdHJ1bmNhdGlvbiAqLwotCi0JcmV0dXJuIChGQUxTRSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfZXhfZmllbGRfZGF0dW1faW8KLSAqCi0gKiBQQVJBTUVURVJTOiAgb2JqX2Rlc2MgICAgICAgICAgICAgICAgLSBGaWVsZCB0byBiZSByZWFkCi0gKiAgICAgICAgICAgICAgZmllbGRfZGF0dW1fYnl0ZV9vZmZzZXQgLSBCeXRlIG9mZnNldCBvZiB0aGlzIGRhdHVtIHdpdGhpbiB0aGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudCBmaWVsZAotICogICAgICAgICAgICAgIFZhbHVlICAgICAgICAgICAgICAgICAgIC0gV2hlcmUgdG8gc3RvcmUgdmFsdWUgKG11c3QgYmUgNjQgYml0cykKLSAqICAgICAgICAgICAgICByZWFkX3dyaXRlICAgICAgICAgICAgICAtIFJlYWQgb3IgV3JpdGUgZmxhZwotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKLSAqCi0gKiBERVNDUklQVElPTjogUmVhZCBvciBXcml0ZSBhIHNpbmdsZSBkYXR1bSBvZiBhIGZpZWxkLiAgVGhlIGZpZWxkX3R5cGUgaXMKLSAqICAgICAgICAgICAgICBkZW11bHRpcGxleGVkIGhlcmUgdG8gaGFuZGxlIHRoZSBkaWZmZXJlbnQgdHlwZXMgb2YgZmllbGRzCi0gKiAgICAgICAgICAgICAgKGJ1ZmZlcl9maWVsZCwgcmVnaW9uX2ZpZWxkLCBpbmRleF9maWVsZCwgYmFua19maWVsZCkKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgYWNwaV9zdGF0dXMKLWFjcGlfZXhfZmllbGRfZGF0dW1faW8odW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2MsCi0JCSAgICAgICB1MzIgZmllbGRfZGF0dW1fYnl0ZV9vZmZzZXQsCi0JCSAgICAgICBhY3BpX2ludGVnZXIgKiB2YWx1ZSwgdTMyIHJlYWRfd3JpdGUpCi17Ci0JYWNwaV9zdGF0dXMgc3RhdHVzOwotCWFjcGlfaW50ZWdlciBsb2NhbF92YWx1ZTsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0VfVTMyKGV4X2ZpZWxkX2RhdHVtX2lvLCBmaWVsZF9kYXR1bV9ieXRlX29mZnNldCk7Ci0KLQlpZiAocmVhZF93cml0ZSA9PSBBQ1BJX1JFQUQpIHsKLQkJaWYgKCF2YWx1ZSkgewotCQkJbG9jYWxfdmFsdWUgPSAwOwotCi0JCQkvKiBUbyBzdXBwb3J0IHJlYWRzIHdpdGhvdXQgc2F2aW5nIHJldHVybiB2YWx1ZSAqLwotCQkJdmFsdWUgPSAmbG9jYWxfdmFsdWU7Ci0JCX0KLQotCQkvKiBDbGVhciB0aGUgZW50aXJlIHJldHVybiBidWZmZXIgZmlyc3QsIFtWZXJ5IEltcG9ydGFudCFdICovCi0KLQkJKnZhbHVlID0gMDsKLQl9Ci0KLQkvKgotCSAqIFRoZSBmb3VyIHR5cGVzIG9mIGZpZWxkcyBhcmU6Ci0JICoKLQkgKiBidWZmZXJfZmllbGQgLSBSZWFkL3dyaXRlIGZyb20vdG8gYSBCdWZmZXIKLQkgKiByZWdpb25fZmllbGQgLSBSZWFkL3dyaXRlIGZyb20vdG8gYSBPcGVyYXRpb24gUmVnaW9uLgotCSAqIGJhbmtfZmllbGQgIC0gV3JpdGUgdG8gYSBCYW5rIFJlZ2lzdGVyLCB0aGVuIHJlYWQvd3JpdGUgZnJvbS90byBhbgotCSAqICAgICAgICAgICAgICAgb3BlcmF0aW9uX3JlZ2lvbgotCSAqIGluZGV4X2ZpZWxkIC0gV3JpdGUgdG8gYW4gSW5kZXggUmVnaXN0ZXIsIHRoZW4gcmVhZC93cml0ZSBmcm9tL3RvIGEKLQkgKiAgICAgICAgICAgICAgIERhdGEgUmVnaXN0ZXIKLQkgKi8KLQlzd2l0Y2ggKEFDUElfR0VUX09CSkVDVF9UWVBFKG9ial9kZXNjKSkgewotCWNhc2UgQUNQSV9UWVBFX0JVRkZFUl9GSUVMRDoKLQkJLyoKLQkJICogSWYgdGhlIGJ1ZmZlcl9maWVsZCBhcmd1bWVudHMgaGF2ZSBub3QgYmVlbiBwcmV2aW91c2x5IGV2YWx1YXRlZCwKLQkJICogZXZhbHVhdGUgdGhlbSBub3cgYW5kIHNhdmUgdGhlIHJlc3VsdHMuCi0JCSAqLwotCQlpZiAoIShvYmpfZGVzYy0+Y29tbW9uLmZsYWdzICYgQU9QT0JKX0RBVEFfVkFMSUQpKSB7Ci0JCQlzdGF0dXMgPSBhY3BpX2RzX2dldF9idWZmZXJfZmllbGRfYXJndW1lbnRzKG9ial9kZXNjKTsKLQkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotCQkJfQotCQl9Ci0KLQkJaWYgKHJlYWRfd3JpdGUgPT0gQUNQSV9SRUFEKSB7Ci0JCQkvKgotCQkJICogQ29weSB0aGUgZGF0YSBmcm9tIHRoZSBzb3VyY2UgYnVmZmVyLgotCQkJICogTGVuZ3RoIGlzIHRoZSBmaWVsZCB3aWR0aCBpbiBieXRlcy4KLQkJCSAqLwotCQkJQUNQSV9NRU1DUFkodmFsdWUsCi0JCQkJICAgIChvYmpfZGVzYy0+YnVmZmVyX2ZpZWxkLmJ1ZmZlcl9vYmopLT5idWZmZXIuCi0JCQkJICAgIHBvaW50ZXIgKwotCQkJCSAgICBvYmpfZGVzYy0+YnVmZmVyX2ZpZWxkLmJhc2VfYnl0ZV9vZmZzZXQgKwotCQkJCSAgICBmaWVsZF9kYXR1bV9ieXRlX29mZnNldCwKLQkJCQkgICAgb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5hY2Nlc3NfYnl0ZV93aWR0aCk7Ci0JCX0gZWxzZSB7Ci0JCQkvKgotCQkJICogQ29weSB0aGUgZGF0YSB0byB0aGUgdGFyZ2V0IGJ1ZmZlci4KLQkJCSAqIExlbmd0aCBpcyB0aGUgZmllbGQgd2lkdGggaW4gYnl0ZXMuCi0JCQkgKi8KLQkJCUFDUElfTUVNQ1BZKChvYmpfZGVzYy0+YnVmZmVyX2ZpZWxkLmJ1ZmZlcl9vYmopLT5idWZmZXIuCi0JCQkJICAgIHBvaW50ZXIgKwotCQkJCSAgICBvYmpfZGVzYy0+YnVmZmVyX2ZpZWxkLmJhc2VfYnl0ZV9vZmZzZXQgKwotCQkJCSAgICBmaWVsZF9kYXR1bV9ieXRlX29mZnNldCwgdmFsdWUsCi0JCQkJICAgIG9ial9kZXNjLT5jb21tb25fZmllbGQuYWNjZXNzX2J5dGVfd2lkdGgpOwotCQl9Ci0KLQkJc3RhdHVzID0gQUVfT0s7Ci0JCWJyZWFrOwotCi0JY2FzZSBBQ1BJX1RZUEVfTE9DQUxfQkFOS19GSUVMRDoKLQotCQkvKgotCQkgKiBFbnN1cmUgdGhhdCB0aGUgYmFua192YWx1ZSBpcyBub3QgYmV5b25kIHRoZSBjYXBhY2l0eSBvZgotCQkgKiB0aGUgcmVnaXN0ZXIKLQkJICovCi0JCWlmIChhY3BpX2V4X3JlZ2lzdGVyX292ZXJmbG93KG9ial9kZXNjLT5iYW5rX2ZpZWxkLmJhbmtfb2JqLAotCQkJCQkgICAgICAoYWNwaV9pbnRlZ2VyKSBvYmpfZGVzYy0+Ci0JCQkJCSAgICAgIGJhbmtfZmllbGQudmFsdWUpKSB7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX1JFR0lTVEVSX0xJTUlUKTsKLQkJfQotCi0JCS8qCi0JCSAqIEZvciBiYW5rX2ZpZWxkcywgd2UgbXVzdCB3cml0ZSB0aGUgYmFua192YWx1ZSB0byB0aGUgYmFua19yZWdpc3RlcgotCQkgKiAoaXRzZWxmIGEgcmVnaW9uX2ZpZWxkKSBiZWZvcmUgd2UgY2FuIGFjY2VzcyB0aGUgZGF0YS4KLQkJICovCi0JCXN0YXR1cyA9Ci0JCSAgICBhY3BpX2V4X2luc2VydF9pbnRvX2ZpZWxkKG9ial9kZXNjLT5iYW5rX2ZpZWxkLmJhbmtfb2JqLAotCQkJCQkgICAgICAmb2JqX2Rlc2MtPmJhbmtfZmllbGQudmFsdWUsCi0JCQkJCSAgICAgIHNpemVvZihvYmpfZGVzYy0+YmFua19maWVsZC4KLQkJCQkJCSAgICAgdmFsdWUpKTsKLQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLQkJfQotCi0JCS8qCi0JCSAqIE5vdyB0aGF0IHRoZSBCYW5rIGhhcyBiZWVuIHNlbGVjdGVkLCBmYWxsIHRocm91Z2ggdG8gdGhlCi0JCSAqIHJlZ2lvbl9maWVsZCBjYXNlIGFuZCB3cml0ZSB0aGUgZGF0dW0gdG8gdGhlIE9wZXJhdGlvbiBSZWdpb24KLQkJICovCi0KLQkJLypsaW50IC1mYWxsdGhyb3VnaCAqLwotCi0JY2FzZSBBQ1BJX1RZUEVfTE9DQUxfUkVHSU9OX0ZJRUxEOgotCQkvKgotCQkgKiBGb3Igc2ltcGxlIHJlZ2lvbl9maWVsZHMsIHdlIGp1c3QgZGlyZWN0bHkgYWNjZXNzIHRoZSBvd25pbmcKLQkJICogT3BlcmF0aW9uIFJlZ2lvbi4KLQkJICovCi0JCXN0YXR1cyA9Ci0JCSAgICBhY3BpX2V4X2FjY2Vzc19yZWdpb24ob2JqX2Rlc2MsIGZpZWxkX2RhdHVtX2J5dGVfb2Zmc2V0LAotCQkJCQkgIHZhbHVlLCByZWFkX3dyaXRlKTsKLQkJYnJlYWs7Ci0KLQljYXNlIEFDUElfVFlQRV9MT0NBTF9JTkRFWF9GSUVMRDoKLQotCQkvKgotCQkgKiBFbnN1cmUgdGhhdCB0aGUgaW5kZXhfdmFsdWUgaXMgbm90IGJleW9uZCB0aGUgY2FwYWNpdHkgb2YKLQkJICogdGhlIHJlZ2lzdGVyCi0JCSAqLwotCQlpZiAoYWNwaV9leF9yZWdpc3Rlcl9vdmVyZmxvdyhvYmpfZGVzYy0+aW5kZXhfZmllbGQuaW5kZXhfb2JqLAotCQkJCQkgICAgICAoYWNwaV9pbnRlZ2VyKSBvYmpfZGVzYy0+Ci0JCQkJCSAgICAgIGluZGV4X2ZpZWxkLnZhbHVlKSkgewotCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9SRUdJU1RFUl9MSU1JVCk7Ci0JCX0KLQotCQkvKiBXcml0ZSB0aGUgaW5kZXggdmFsdWUgdG8gdGhlIGluZGV4X3JlZ2lzdGVyIChpdHNlbGYgYSByZWdpb25fZmllbGQpICovCi0KLQkJZmllbGRfZGF0dW1fYnl0ZV9vZmZzZXQgKz0gb2JqX2Rlc2MtPmluZGV4X2ZpZWxkLnZhbHVlOwotCi0JCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfQkZJRUxELAotCQkJCSAgIldyaXRlIHRvIEluZGV4IFJlZ2lzdGVyOiBWYWx1ZSAlOC44WFxuIiwKLQkJCQkgIGZpZWxkX2RhdHVtX2J5dGVfb2Zmc2V0KSk7Ci0KLQkJc3RhdHVzID0KLQkJICAgIGFjcGlfZXhfaW5zZXJ0X2ludG9fZmllbGQob2JqX2Rlc2MtPmluZGV4X2ZpZWxkLmluZGV4X29iaiwKLQkJCQkJICAgICAgJmZpZWxkX2RhdHVtX2J5dGVfb2Zmc2V0LAotCQkJCQkgICAgICBzaXplb2YoZmllbGRfZGF0dW1fYnl0ZV9vZmZzZXQpKTsKLQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLQkJfQotCi0JCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfQkZJRUxELAotCQkJCSAgIkkvTyB0byBEYXRhIFJlZ2lzdGVyOiBWYWx1ZVB0ciAlcFxuIiwKLQkJCQkgIHZhbHVlKSk7Ci0KLQkJaWYgKHJlYWRfd3JpdGUgPT0gQUNQSV9SRUFEKSB7Ci0KLQkJCS8qIFJlYWQgdGhlIGRhdHVtIGZyb20gdGhlIGRhdGFfcmVnaXN0ZXIgKi8KLQotCQkJc3RhdHVzID0KLQkJCSAgICBhY3BpX2V4X2V4dHJhY3RfZnJvbV9maWVsZChvYmpfZGVzYy0+aW5kZXhfZmllbGQuCi0JCQkJCQkgICAgICAgZGF0YV9vYmosIHZhbHVlLAotCQkJCQkJICAgICAgIHNpemVvZihhY3BpX2ludGVnZXIpKTsKLQkJfSBlbHNlIHsKLQkJCS8qIFdyaXRlIHRoZSBkYXR1bSB0byB0aGUgZGF0YV9yZWdpc3RlciAqLwotCi0JCQlzdGF0dXMgPQotCQkJICAgIGFjcGlfZXhfaW5zZXJ0X2ludG9fZmllbGQob2JqX2Rlc2MtPmluZGV4X2ZpZWxkLgotCQkJCQkJICAgICAgZGF0YV9vYmosIHZhbHVlLAotCQkJCQkJICAgICAgc2l6ZW9mKGFjcGlfaW50ZWdlcikpOwotCQl9Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQotCQlBQ1BJX0VSUk9SKChBRV9JTkZPLCAiV3Jvbmcgb2JqZWN0IHR5cGUgaW4gZmllbGQgSS9PICVYIiwKLQkJCSAgICBBQ1BJX0dFVF9PQkpFQ1RfVFlQRShvYmpfZGVzYykpKTsKLQkJc3RhdHVzID0gQUVfQU1MX0lOVEVSTkFMOwotCQlicmVhazsKLQl9Ci0KLQlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpIHsKLQkJaWYgKHJlYWRfd3JpdGUgPT0gQUNQSV9SRUFEKSB7Ci0JCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0JGSUVMRCwKLQkJCQkJICAiVmFsdWUgUmVhZCAlOC44WCU4LjhYLCBXaWR0aCAlZFxuIiwKLQkJCQkJICBBQ1BJX0ZPUk1BVF9VSU5UNjQoKnZhbHVlKSwKLQkJCQkJICBvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLgotCQkJCQkgIGFjY2Vzc19ieXRlX3dpZHRoKSk7Ci0JCX0gZWxzZSB7Ci0JCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0JGSUVMRCwKLQkJCQkJICAiVmFsdWUgV3JpdHRlbiAlOC44WCU4LjhYLCBXaWR0aCAlZFxuIiwKLQkJCQkJICBBQ1BJX0ZPUk1BVF9VSU5UNjQoKnZhbHVlKSwKLQkJCQkJICBvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLgotCQkJCQkgIGFjY2Vzc19ieXRlX3dpZHRoKSk7Ci0JCX0KLQl9Ci0KLQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9leF93cml0ZV93aXRoX3VwZGF0ZV9ydWxlCi0gKgotICogUEFSQU1FVEVSUzogIG9ial9kZXNjICAgICAgICAgICAgICAgIC0gRmllbGQgdG8gYmUgd3JpdHRlbgotICogICAgICAgICAgICAgIE1hc2sgICAgICAgICAgICAgICAgICAgIC0gYml0bWFzayB3aXRoaW4gZmllbGQgZGF0dW0KLSAqICAgICAgICAgICAgICBmaWVsZF92YWx1ZSAgICAgICAgICAgICAtIFZhbHVlIHRvIHdyaXRlCi0gKiAgICAgICAgICAgICAgZmllbGRfZGF0dW1fYnl0ZV9vZmZzZXQgLSBPZmZzZXQgb2YgZGF0dW0gd2l0aGluIGZpZWxkCi0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cwotICoKLSAqIERFU0NSSVBUSU9OOiBBcHBseSB0aGUgZmllbGQgdXBkYXRlIHJ1bGUgdG8gYSBmaWVsZCB3cml0ZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWFjcGlfc3RhdHVzCi1hY3BpX2V4X3dyaXRlX3dpdGhfdXBkYXRlX3J1bGUodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2MsCi0JCQkgICAgICAgYWNwaV9pbnRlZ2VyIG1hc2ssCi0JCQkgICAgICAgYWNwaV9pbnRlZ2VyIGZpZWxkX3ZhbHVlLAotCQkJICAgICAgIHUzMiBmaWVsZF9kYXR1bV9ieXRlX29mZnNldCkKLXsKLQlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKLQlhY3BpX2ludGVnZXIgbWVyZ2VkX3ZhbHVlOwotCWFjcGlfaW50ZWdlciBjdXJyZW50X3ZhbHVlOwotCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9VMzIoZXhfd3JpdGVfd2l0aF91cGRhdGVfcnVsZSwgbWFzayk7Ci0KLQkvKiBTdGFydCB3aXRoIHRoZSBuZXcgYml0cyAgKi8KLQotCW1lcmdlZF92YWx1ZSA9IGZpZWxkX3ZhbHVlOwotCi0JLyogSWYgdGhlIG1hc2sgaXMgYWxsIG9uZXMsIHdlIGRvbid0IG5lZWQgdG8gd29ycnkgYWJvdXQgdGhlIHVwZGF0ZSBydWxlICovCi0KLQlpZiAobWFzayAhPSBBQ1BJX0lOVEVHRVJfTUFYKSB7Ci0KLQkJLyogRGVjb2RlIHRoZSB1cGRhdGUgcnVsZSAqLwotCi0JCXN3aXRjaCAob2JqX2Rlc2MtPmNvbW1vbl9maWVsZC4KLQkJCWZpZWxkX2ZsYWdzICYgQU1MX0ZJRUxEX1VQREFURV9SVUxFX01BU0spIHsKLQkJY2FzZSBBTUxfRklFTERfVVBEQVRFX1BSRVNFUlZFOgotCQkJLyoKLQkJCSAqIENoZWNrIGlmIHVwZGF0ZSBydWxlIG5lZWRzIHRvIGJlIGFwcGxpZWQgKG5vdCBpZiBtYXNrIGlzIGFsbAotCQkJICogb25lcykgIFRoZSBsZWZ0IHNoaWZ0IGRyb3BzIHRoZSBiaXRzIHdlIHdhbnQgdG8gaWdub3JlLgotCQkJICovCi0JCQlpZiAoKH5tYXNrIDw8IChBQ1BJX01VTF84KHNpemVvZihtYXNrKSkgLQotCQkJCSAgICAgICBBQ1BJX01VTF84KG9ial9kZXNjLT5jb21tb25fZmllbGQuCi0JCQkJCQkgIGFjY2Vzc19ieXRlX3dpZHRoKSkpICE9IDApIHsKLQkJCQkvKgotCQkJCSAqIFJlYWQgdGhlIGN1cnJlbnQgY29udGVudHMgb2YgdGhlIGJ5dGUvd29yZC9kd29yZCBjb250YWluaW5nCi0JCQkJICogdGhlIGZpZWxkLCBhbmQgbWVyZ2Ugd2l0aCB0aGUgbmV3IGZpZWxkIHZhbHVlLgotCQkJCSAqLwotCQkJCXN0YXR1cyA9Ci0JCQkJICAgIGFjcGlfZXhfZmllbGRfZGF0dW1faW8ob2JqX2Rlc2MsCi0JCQkJCQkJICAgZmllbGRfZGF0dW1fYnl0ZV9vZmZzZXQsCi0JCQkJCQkJICAgJmN1cnJlbnRfdmFsdWUsCi0JCQkJCQkJICAgQUNQSV9SRUFEKTsKLQkJCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci0JCQkJfQotCi0JCQkJbWVyZ2VkX3ZhbHVlIHw9IChjdXJyZW50X3ZhbHVlICYgfm1hc2spOwotCQkJfQotCQkJYnJlYWs7Ci0KLQkJY2FzZSBBTUxfRklFTERfVVBEQVRFX1dSSVRFX0FTX09ORVM6Ci0KLQkJCS8qIFNldCBwb3NpdGlvbnMgb3V0c2lkZSB0aGUgZmllbGQgdG8gYWxsIG9uZXMgKi8KLQotCQkJbWVyZ2VkX3ZhbHVlIHw9IH5tYXNrOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBBTUxfRklFTERfVVBEQVRFX1dSSVRFX0FTX1pFUk9TOgotCi0JCQkvKiBTZXQgcG9zaXRpb25zIG91dHNpZGUgdGhlIGZpZWxkIHRvIGFsbCB6ZXJvcyAqLwotCi0JCQltZXJnZWRfdmFsdWUgJj0gbWFzazsKLQkJCWJyZWFrOwotCi0JCWRlZmF1bHQ6Ci0KLQkJCUFDUElfRVJST1IoKEFFX0lORk8sCi0JCQkJICAgICJVbmtub3duIFVwZGF0ZVJ1bGUgdmFsdWU6ICVYIiwKLQkJCQkgICAgKG9ial9kZXNjLT5jb21tb25fZmllbGQuCi0JCQkJICAgICBmaWVsZF9mbGFncyAmCi0JCQkJICAgICBBTUxfRklFTERfVVBEQVRFX1JVTEVfTUFTSykpKTsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfT1BFUkFORF9WQUxVRSk7Ci0JCX0KLQl9Ci0KLQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0JGSUVMRCwKLQkJCSAgIk1hc2sgJTguOFglOC44WCwgRGF0dW1PZmZzZXQgJVgsIFdpZHRoICVYLCBWYWx1ZSAlOC44WCU4LjhYLCBNZXJnZWRWYWx1ZSAlOC44WCU4LjhYXG4iLAotCQkJICBBQ1BJX0ZPUk1BVF9VSU5UNjQobWFzayksCi0JCQkgIGZpZWxkX2RhdHVtX2J5dGVfb2Zmc2V0LAotCQkJICBvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmFjY2Vzc19ieXRlX3dpZHRoLAotCQkJICBBQ1BJX0ZPUk1BVF9VSU5UNjQoZmllbGRfdmFsdWUpLAotCQkJICBBQ1BJX0ZPUk1BVF9VSU5UNjQobWVyZ2VkX3ZhbHVlKSkpOwotCi0JLyogV3JpdGUgdGhlIG1lcmdlZCB2YWx1ZSAqLwotCi0Jc3RhdHVzID0gYWNwaV9leF9maWVsZF9kYXR1bV9pbyhvYmpfZGVzYywgZmllbGRfZGF0dW1fYnl0ZV9vZmZzZXQsCi0JCQkJCSZtZXJnZWRfdmFsdWUsIEFDUElfV1JJVEUpOwotCi0JcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfZXhfZXh0cmFjdF9mcm9tX2ZpZWxkCi0gKgotICogUEFSQU1FVEVSUzogIG9ial9kZXNjICAgICAgICAgICAgLSBGaWVsZCB0byBiZSByZWFkCi0gKiAgICAgICAgICAgICAgQnVmZmVyICAgICAgICAgICAgICAtIFdoZXJlIHRvIHN0b3JlIHRoZSBmaWVsZCBkYXRhCi0gKiAgICAgICAgICAgICAgYnVmZmVyX2xlbmd0aCAgICAgICAtIExlbmd0aCBvZiBCdWZmZXIKLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IFJldHJpZXZlIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBnaXZlbiBmaWVsZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWFjcGlfc3RhdHVzCi1hY3BpX2V4X2V4dHJhY3RfZnJvbV9maWVsZCh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYywKLQkJCSAgIHZvaWQgKmJ1ZmZlciwgdTMyIGJ1ZmZlcl9sZW5ndGgpCi17Ci0JYWNwaV9zdGF0dXMgc3RhdHVzOwotCWFjcGlfaW50ZWdlciByYXdfZGF0dW07Ci0JYWNwaV9pbnRlZ2VyIG1lcmdlZF9kYXR1bTsKLQl1MzIgZmllbGRfb2Zmc2V0ID0gMDsKLQl1MzIgYnVmZmVyX29mZnNldCA9IDA7Ci0JdTMyIGJ1ZmZlcl90YWlsX2JpdHM7Ci0JdTMyIGRhdHVtX2NvdW50OwotCXUzMiBmaWVsZF9kYXR1bV9jb3VudDsKLQl1MzIgaTsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UoZXhfZXh0cmFjdF9mcm9tX2ZpZWxkKTsKLQotCS8qIFZhbGlkYXRlIHRhcmdldCBidWZmZXIgYW5kIGNsZWFyIGl0ICovCi0KLQlpZiAoYnVmZmVyX2xlbmd0aCA8Ci0JICAgIEFDUElfUk9VTkRfQklUU19VUF9UT19CWVRFUyhvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmJpdF9sZW5ndGgpKSB7Ci0JCUFDUElfRVJST1IoKEFFX0lORk8sCi0JCQkgICAgIkZpZWxkIHNpemUgJVggKGJpdHMpIGlzIHRvbyBsYXJnZSBmb3IgYnVmZmVyICglWCkiLAotCQkJICAgIG9ial9kZXNjLT5jb21tb25fZmllbGQuYml0X2xlbmd0aCwgYnVmZmVyX2xlbmd0aCkpOwotCi0JCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CVUZGRVJfT1ZFUkZMT1cpOwotCX0KLQlBQ1BJX01FTVNFVChidWZmZXIsIDAsIGJ1ZmZlcl9sZW5ndGgpOwotCi0JLyogQ29tcHV0ZSB0aGUgbnVtYmVyIG9mIGRhdHVtcyAoYWNjZXNzIHdpZHRoIGRhdGEgaXRlbXMpICovCi0KLQlkYXR1bV9jb3VudCA9IEFDUElfUk9VTkRfVVBfVE8ob2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5iaXRfbGVuZ3RoLAotCQkJCSAgICAgICBvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmFjY2Vzc19iaXRfd2lkdGgpOwotCWZpZWxkX2RhdHVtX2NvdW50ID0gQUNQSV9ST1VORF9VUF9UTyhvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmJpdF9sZW5ndGggKwotCQkJCQkgICAgIG9ial9kZXNjLT5jb21tb25fZmllbGQuCi0JCQkJCSAgICAgc3RhcnRfZmllbGRfYml0X29mZnNldCwKLQkJCQkJICAgICBvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLgotCQkJCQkgICAgIGFjY2Vzc19iaXRfd2lkdGgpOwotCi0JLyogUHJpbWluZyByZWFkIGZyb20gdGhlIGZpZWxkICovCi0KLQlzdGF0dXMgPQotCSAgICBhY3BpX2V4X2ZpZWxkX2RhdHVtX2lvKG9ial9kZXNjLCBmaWVsZF9vZmZzZXQsICZyYXdfZGF0dW0sCi0JCQkJICAgQUNQSV9SRUFEKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci0JfQotCW1lcmdlZF9kYXR1bSA9Ci0JICAgIHJhd19kYXR1bSA+PiBvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLnN0YXJ0X2ZpZWxkX2JpdF9vZmZzZXQ7Ci0KLQkvKiBSZWFkIHRoZSByZXN0IG9mIHRoZSBmaWVsZCAqLwotCi0JZm9yIChpID0gMTsgaSA8IGZpZWxkX2RhdHVtX2NvdW50OyBpKyspIHsKLQotCQkvKiBHZXQgbmV4dCBpbnB1dCBkYXR1bSBmcm9tIHRoZSBmaWVsZCAqLwotCi0JCWZpZWxkX29mZnNldCArPSBvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmFjY2Vzc19ieXRlX3dpZHRoOwotCQlzdGF0dXMgPSBhY3BpX2V4X2ZpZWxkX2RhdHVtX2lvKG9ial9kZXNjLCBmaWVsZF9vZmZzZXQsCi0JCQkJCQkmcmF3X2RhdHVtLCBBQ1BJX1JFQUQpOwotCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotCQl9Ci0KLQkJLyoKLQkJICogTWVyZ2Ugd2l0aCBwcmV2aW91cyBkYXR1bSBpZiBuZWNlc3NhcnkuCi0JCSAqCi0JCSAqIE5vdGU6IEJlZm9yZSB0aGUgc2hpZnQsIGNoZWNrIGlmIHRoZSBzaGlmdCB2YWx1ZSB3aWxsIGJlIGxhcmdlciB0aGFuCi0JCSAqIHRoZSBpbnRlZ2VyIHNpemUuIElmIHNvLCB0aGVyZSBpcyBubyBuZWVkIHRvIHBlcmZvcm0gdGhlIG9wZXJhdGlvbi4KLQkJICogVGhpcyBhdm9pZHMgdGhlIGRpZmZlcmVuY2VzIGluIGJlaGF2aW9yIGJldHdlZW4gZGlmZmVyZW50IGNvbXBpbGVycwotCQkgKiBjb25jZXJuaW5nIHNoaWZ0IHZhbHVlcyBsYXJnZXIgdGhhbiB0aGUgdGFyZ2V0IGRhdGEgd2lkdGguCi0JCSAqLwotCQlpZiAoKG9ial9kZXNjLT5jb21tb25fZmllbGQuYWNjZXNzX2JpdF93aWR0aCAtCi0JCSAgICAgb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5zdGFydF9maWVsZF9iaXRfb2Zmc2V0KSA8Ci0JCSAgICBBQ1BJX0lOVEVHRVJfQklUX1NJWkUpIHsKLQkJCW1lcmdlZF9kYXR1bSB8PQotCQkJICAgIHJhd19kYXR1bSA8PCAob2JqX2Rlc2MtPmNvbW1vbl9maWVsZC4KLQkJCQkJICBhY2Nlc3NfYml0X3dpZHRoIC0KLQkJCQkJICBvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLgotCQkJCQkgIHN0YXJ0X2ZpZWxkX2JpdF9vZmZzZXQpOwotCQl9Ci0KLQkJaWYgKGkgPT0gZGF0dW1fY291bnQpIHsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJLyogV3JpdGUgbWVyZ2VkIGRhdHVtIHRvIHRhcmdldCBidWZmZXIgKi8KLQotCQlBQ1BJX01FTUNQWSgoKGNoYXIgKilidWZmZXIpICsgYnVmZmVyX29mZnNldCwgJm1lcmdlZF9kYXR1bSwKLQkJCSAgICBBQ1BJX01JTihvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmFjY2Vzc19ieXRlX3dpZHRoLAotCQkJCSAgICAgYnVmZmVyX2xlbmd0aCAtIGJ1ZmZlcl9vZmZzZXQpKTsKLQotCQlidWZmZXJfb2Zmc2V0ICs9IG9ial9kZXNjLT5jb21tb25fZmllbGQuYWNjZXNzX2J5dGVfd2lkdGg7Ci0JCW1lcmdlZF9kYXR1bSA9Ci0JCSAgICByYXdfZGF0dW0gPj4gb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5zdGFydF9maWVsZF9iaXRfb2Zmc2V0OwotCX0KLQotCS8qIE1hc2sgb2ZmIGFueSBleHRyYSBiaXRzIGluIHRoZSBsYXN0IGRhdHVtICovCi0KLQlidWZmZXJfdGFpbF9iaXRzID0gb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5iaXRfbGVuZ3RoICUKLQkgICAgb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5hY2Nlc3NfYml0X3dpZHRoOwotCWlmIChidWZmZXJfdGFpbF9iaXRzKSB7Ci0JCW1lcmdlZF9kYXR1bSAmPSBBQ1BJX01BU0tfQklUU19BQk9WRShidWZmZXJfdGFpbF9iaXRzKTsKLQl9Ci0KLQkvKiBXcml0ZSB0aGUgbGFzdCBkYXR1bSB0byB0aGUgYnVmZmVyICovCi0KLQlBQ1BJX01FTUNQWSgoKGNoYXIgKilidWZmZXIpICsgYnVmZmVyX29mZnNldCwgJm1lcmdlZF9kYXR1bSwKLQkJICAgIEFDUElfTUlOKG9ial9kZXNjLT5jb21tb25fZmllbGQuYWNjZXNzX2J5dGVfd2lkdGgsCi0JCQkgICAgIGJ1ZmZlcl9sZW5ndGggLSBidWZmZXJfb2Zmc2V0KSk7Ci0KLQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X2luc2VydF9pbnRvX2ZpZWxkCi0gKgotICogUEFSQU1FVEVSUzogIG9ial9kZXNjICAgICAgICAgICAgLSBGaWVsZCB0byBiZSB3cml0dGVuCi0gKiAgICAgICAgICAgICAgQnVmZmVyICAgICAgICAgICAgICAtIERhdGEgdG8gYmUgd3JpdHRlbgotICogICAgICAgICAgICAgIGJ1ZmZlcl9sZW5ndGggICAgICAgLSBMZW5ndGggb2YgQnVmZmVyCi0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cwotICoKLSAqIERFU0NSSVBUSU9OOiBTdG9yZSB0aGUgQnVmZmVyIGNvbnRlbnRzIGludG8gdGhlIGdpdmVuIGZpZWxkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotYWNwaV9zdGF0dXMKLWFjcGlfZXhfaW5zZXJ0X2ludG9fZmllbGQodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2MsCi0JCQkgIHZvaWQgKmJ1ZmZlciwgdTMyIGJ1ZmZlcl9sZW5ndGgpCi17Ci0JYWNwaV9zdGF0dXMgc3RhdHVzOwotCWFjcGlfaW50ZWdlciBtYXNrOwotCWFjcGlfaW50ZWdlciB3aWR0aF9tYXNrOwotCWFjcGlfaW50ZWdlciBtZXJnZWRfZGF0dW07Ci0JYWNwaV9pbnRlZ2VyIHJhd19kYXR1bSA9IDA7Ci0JdTMyIGZpZWxkX29mZnNldCA9IDA7Ci0JdTMyIGJ1ZmZlcl9vZmZzZXQgPSAwOwotCXUzMiBidWZmZXJfdGFpbF9iaXRzOwotCXUzMiBkYXR1bV9jb3VudDsKLQl1MzIgZmllbGRfZGF0dW1fY291bnQ7Ci0JdTMyIGk7Ci0JdTMyIHJlcXVpcmVkX2xlbmd0aDsKLQl2b2lkICpuZXdfYnVmZmVyOwotCi0JQUNQSV9GVU5DVElPTl9UUkFDRShleF9pbnNlcnRfaW50b19maWVsZCk7Ci0KLQkvKiBWYWxpZGF0ZSBpbnB1dCBidWZmZXIgKi8KLQotCW5ld19idWZmZXIgPSBOVUxMOwotCXJlcXVpcmVkX2xlbmd0aCA9Ci0JICAgIEFDUElfUk9VTkRfQklUU19VUF9UT19CWVRFUyhvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmJpdF9sZW5ndGgpOwotCS8qCi0JICogV2UgbXVzdCBoYXZlIGEgYnVmZmVyIHRoYXQgaXMgYXQgbGVhc3QgYXMgbG9uZyBhcyB0aGUgZmllbGQKLQkgKiB3ZSBhcmUgd3JpdGluZyB0by4gIFRoaXMgaXMgYmVjYXVzZSBpbmRpdmlkdWFsIGZpZWxkcyBhcmUKLQkgKiBpbmRpdmlzaWJsZSBhbmQgcGFydGlhbCB3cml0ZXMgYXJlIG5vdCBzdXBwb3J0ZWQgLS0gYXMgcGVyCi0JICogdGhlIEFDUEkgc3BlY2lmaWNhdGlvbi4KLQkgKi8KLQlpZiAoYnVmZmVyX2xlbmd0aCA8IHJlcXVpcmVkX2xlbmd0aCkgewotCi0JCS8qIFdlIG5lZWQgdG8gY3JlYXRlIGEgbmV3IGJ1ZmZlciAqLwotCi0JCW5ld19idWZmZXIgPSBBQ1BJX0FMTE9DQVRFX1pFUk9FRChyZXF1aXJlZF9sZW5ndGgpOwotCQlpZiAoIW5ld19idWZmZXIpIHsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT19NRU1PUlkpOwotCQl9Ci0KLQkJLyoKLQkJICogQ29weSB0aGUgb3JpZ2luYWwgZGF0YSB0byB0aGUgbmV3IGJ1ZmZlciwgc3RhcnRpbmcKLQkJICogYXQgQnl0ZSB6ZXJvLiAgQWxsIHVudXNlZCAodXBwZXIpIGJ5dGVzIG9mIHRoZQotCQkgKiBidWZmZXIgd2lsbCBiZSAwLgotCQkgKi8KLQkJQUNQSV9NRU1DUFkoKGNoYXIgKiluZXdfYnVmZmVyLCAoY2hhciAqKWJ1ZmZlciwgYnVmZmVyX2xlbmd0aCk7Ci0JCWJ1ZmZlciA9IG5ld19idWZmZXI7Ci0JCWJ1ZmZlcl9sZW5ndGggPSByZXF1aXJlZF9sZW5ndGg7Ci0JfQotCi0JLyoKLQkgKiBDcmVhdGUgdGhlIGJpdG1hc2tzIHVzZWQgZm9yIGJpdCBpbnNlcnRpb24uCi0JICogTm90ZTogVGhpcyBpZi9lbHNlIGlzIHVzZWQgdG8gYnlwYXNzIGNvbXBpbGVyIGRpZmZlcmVuY2VzIHdpdGggdGhlCi0JICogc2hpZnQgb3BlcmF0b3IKLQkgKi8KLQlpZiAob2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5hY2Nlc3NfYml0X3dpZHRoID09IEFDUElfSU5URUdFUl9CSVRfU0laRSkgewotCQl3aWR0aF9tYXNrID0gQUNQSV9JTlRFR0VSX01BWDsKLQl9IGVsc2UgewotCQl3aWR0aF9tYXNrID0KLQkJICAgIEFDUElfTUFTS19CSVRTX0FCT1ZFKG9ial9kZXNjLT5jb21tb25fZmllbGQuCi0JCQkJCSBhY2Nlc3NfYml0X3dpZHRoKTsKLQl9Ci0KLQltYXNrID0gd2lkdGhfbWFzayAmCi0JICAgIEFDUElfTUFTS19CSVRTX0JFTE9XKG9ial9kZXNjLT5jb21tb25fZmllbGQuc3RhcnRfZmllbGRfYml0X29mZnNldCk7Ci0KLQkvKiBDb21wdXRlIHRoZSBudW1iZXIgb2YgZGF0dW1zIChhY2Nlc3Mgd2lkdGggZGF0YSBpdGVtcykgKi8KLQotCWRhdHVtX2NvdW50ID0gQUNQSV9ST1VORF9VUF9UTyhvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmJpdF9sZW5ndGgsCi0JCQkJICAgICAgIG9ial9kZXNjLT5jb21tb25fZmllbGQuYWNjZXNzX2JpdF93aWR0aCk7Ci0KLQlmaWVsZF9kYXR1bV9jb3VudCA9IEFDUElfUk9VTkRfVVBfVE8ob2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5iaXRfbGVuZ3RoICsKLQkJCQkJICAgICBvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLgotCQkJCQkgICAgIHN0YXJ0X2ZpZWxkX2JpdF9vZmZzZXQsCi0JCQkJCSAgICAgb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC4KLQkJCQkJICAgICBhY2Nlc3NfYml0X3dpZHRoKTsKLQotCS8qIEdldCBpbml0aWFsIERhdHVtIGZyb20gdGhlIGlucHV0IGJ1ZmZlciAqLwotCi0JQUNQSV9NRU1DUFkoJnJhd19kYXR1bSwgYnVmZmVyLAotCQkgICAgQUNQSV9NSU4ob2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5hY2Nlc3NfYnl0ZV93aWR0aCwKLQkJCSAgICAgYnVmZmVyX2xlbmd0aCAtIGJ1ZmZlcl9vZmZzZXQpKTsKLQotCW1lcmdlZF9kYXR1bSA9Ci0JICAgIHJhd19kYXR1bSA8PCBvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLnN0YXJ0X2ZpZWxkX2JpdF9vZmZzZXQ7Ci0KLQkvKiBXcml0ZSB0aGUgZW50aXJlIGZpZWxkICovCi0KLQlmb3IgKGkgPSAxOyBpIDwgZmllbGRfZGF0dW1fY291bnQ7IGkrKykgewotCi0JCS8qIFdyaXRlIG1lcmdlZCBkYXR1bSB0byB0aGUgdGFyZ2V0IGZpZWxkICovCi0KLQkJbWVyZ2VkX2RhdHVtICY9IG1hc2s7Ci0JCXN0YXR1cyA9IGFjcGlfZXhfd3JpdGVfd2l0aF91cGRhdGVfcnVsZShvYmpfZGVzYywgbWFzaywKLQkJCQkJCQltZXJnZWRfZGF0dW0sCi0JCQkJCQkJZmllbGRfb2Zmc2V0KTsKLQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCQlnb3RvIGV4aXQ7Ci0JCX0KLQotCQlmaWVsZF9vZmZzZXQgKz0gb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5hY2Nlc3NfYnl0ZV93aWR0aDsKLQotCQkvKgotCQkgKiBTdGFydCBuZXcgb3V0cHV0IGRhdHVtIGJ5IG1lcmdpbmcgd2l0aCBwcmV2aW91cyBpbnB1dCBkYXR1bQotCQkgKiBpZiBuZWNlc3NhcnkuCi0JCSAqCi0JCSAqIE5vdGU6IEJlZm9yZSB0aGUgc2hpZnQsIGNoZWNrIGlmIHRoZSBzaGlmdCB2YWx1ZSB3aWxsIGJlIGxhcmdlciB0aGFuCi0JCSAqIHRoZSBpbnRlZ2VyIHNpemUuIElmIHNvLCB0aGVyZSBpcyBubyBuZWVkIHRvIHBlcmZvcm0gdGhlIG9wZXJhdGlvbi4KLQkJICogVGhpcyBhdm9pZHMgdGhlIGRpZmZlcmVuY2VzIGluIGJlaGF2aW9yIGJldHdlZW4gZGlmZmVyZW50IGNvbXBpbGVycwotCQkgKiBjb25jZXJuaW5nIHNoaWZ0IHZhbHVlcyBsYXJnZXIgdGhhbiB0aGUgdGFyZ2V0IGRhdGEgd2lkdGguCi0JCSAqLwotCQlpZiAoKG9ial9kZXNjLT5jb21tb25fZmllbGQuYWNjZXNzX2JpdF93aWR0aCAtCi0JCSAgICAgb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5zdGFydF9maWVsZF9iaXRfb2Zmc2V0KSA8Ci0JCSAgICBBQ1BJX0lOVEVHRVJfQklUX1NJWkUpIHsKLQkJCW1lcmdlZF9kYXR1bSA9Ci0JCQkgICAgcmF3X2RhdHVtID4+IChvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLgotCQkJCQkgIGFjY2Vzc19iaXRfd2lkdGggLQotCQkJCQkgIG9ial9kZXNjLT5jb21tb25fZmllbGQuCi0JCQkJCSAgc3RhcnRfZmllbGRfYml0X29mZnNldCk7Ci0JCX0gZWxzZSB7Ci0JCQltZXJnZWRfZGF0dW0gPSAwOwotCQl9Ci0KLQkJbWFzayA9IHdpZHRoX21hc2s7Ci0KLQkJaWYgKGkgPT0gZGF0dW1fY291bnQpIHsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJLyogR2V0IHRoZSBuZXh0IGlucHV0IGRhdHVtIGZyb20gdGhlIGJ1ZmZlciAqLwotCi0JCWJ1ZmZlcl9vZmZzZXQgKz0gb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5hY2Nlc3NfYnl0ZV93aWR0aDsKLQkJQUNQSV9NRU1DUFkoJnJhd19kYXR1bSwgKChjaGFyICopYnVmZmVyKSArIGJ1ZmZlcl9vZmZzZXQsCi0JCQkgICAgQUNQSV9NSU4ob2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5hY2Nlc3NfYnl0ZV93aWR0aCwKLQkJCQkgICAgIGJ1ZmZlcl9sZW5ndGggLSBidWZmZXJfb2Zmc2V0KSk7Ci0JCW1lcmdlZF9kYXR1bSB8PQotCQkgICAgcmF3X2RhdHVtIDw8IG9ial9kZXNjLT5jb21tb25fZmllbGQuc3RhcnRfZmllbGRfYml0X29mZnNldDsKLQl9Ci0KLQkvKiBNYXNrIG9mZiBhbnkgZXh0cmEgYml0cyBpbiB0aGUgbGFzdCBkYXR1bSAqLwotCi0JYnVmZmVyX3RhaWxfYml0cyA9IChvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmJpdF9sZW5ndGggKwotCQkJICAgIG9ial9kZXNjLT5jb21tb25fZmllbGQuc3RhcnRfZmllbGRfYml0X29mZnNldCkgJQotCSAgICBvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmFjY2Vzc19iaXRfd2lkdGg7Ci0JaWYgKGJ1ZmZlcl90YWlsX2JpdHMpIHsKLQkJbWFzayAmPSBBQ1BJX01BU0tfQklUU19BQk9WRShidWZmZXJfdGFpbF9iaXRzKTsKLQl9Ci0KLQkvKiBXcml0ZSB0aGUgbGFzdCBkYXR1bSB0byB0aGUgZmllbGQgKi8KLQotCW1lcmdlZF9kYXR1bSAmPSBtYXNrOwotCXN0YXR1cyA9IGFjcGlfZXhfd3JpdGVfd2l0aF91cGRhdGVfcnVsZShvYmpfZGVzYywKLQkJCQkJCW1hc2ssIG1lcmdlZF9kYXR1bSwKLQkJCQkJCWZpZWxkX29mZnNldCk7Ci0KLSAgICAgIGV4aXQ6Ci0JLyogRnJlZSB0ZW1wb3JhcnkgYnVmZmVyIGlmIHdlIHVzZWQgb25lICovCi0KLQlpZiAobmV3X2J1ZmZlcikgewotCQlBQ1BJX0ZSRUUobmV3X2J1ZmZlcik7Ci0JfQotCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4bWlzYy5jIGIvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4bWlzYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZmIxOTEzLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leG1pc2MuYworKysgL2Rldi9udWxsCkBAIC0xLDcyNSArMCwwIEBACi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBNb2R1bGUgTmFtZTogZXhtaXNjIC0gQUNQSSBBTUwgKHAtY29kZSkgZXhlY3V0aW9uIC0gc3BlY2lmaWMgb3Bjb2RlcwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDgsIEludGVsIENvcnAuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCi0gKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSBhdCBtaW5pbXVtIGEgZGlzY2xhaW1lcgotICogICAgc3Vic3RhbnRpYWxseSBzaW1pbGFyIHRvIHRoZSAiTk8gV0FSUkFOVFkiIGRpc2NsYWltZXIgYmVsb3cKLSAqICAgICgiRGlzY2xhaW1lciIpIGFuZCBhbnkgcmVkaXN0cmlidXRpb24gbXVzdCBiZSBjb25kaXRpb25lZCB1cG9uCi0gKiAgICBpbmNsdWRpbmcgYSBzdWJzdGFudGlhbGx5IHNpbWlsYXIgRGlzY2xhaW1lciByZXF1aXJlbWVudCBmb3IgZnVydGhlcgotICogICAgYmluYXJ5IHJlZGlzdHJpYnV0aW9uLgotICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzCi0gKiAgICBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIE5PIFdBUlJBTlRZCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKLSAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCi0gKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORwotICogSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCi0gKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCi0gKi8KLQotI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgotI2luY2x1ZGUgPGFjcGkvYWNpbnRlcnAuaD4KLSNpbmNsdWRlIDxhY3BpL2FtbGNvZGUuaD4KLSNpbmNsdWRlIDxhY3BpL2FtbHJlc3JjLmg+Ci0KLSNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX0VYRUNVVEVSCi1BQ1BJX01PRFVMRV9OQU1FKCJleG1pc2MiKQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X2dldF9vYmplY3RfcmVmZXJlbmNlCi0gKgotICogUEFSQU1FVEVSUzogIG9ial9kZXNjICAgICAgICAgICAgLSBDcmVhdGUgYSByZWZlcmVuY2UgdG8gdGhpcyBvYmplY3QKLSAqICAgICAgICAgICAgICByZXR1cm5fZGVzYyAgICAgICAgIC0gV2hlcmUgdG8gc3RvcmUgdGhlIHJlZmVyZW5jZQotICogICAgICAgICAgICAgIHdhbGtfc3RhdGUgICAgICAgICAgLSBDdXJyZW50IHN0YXRlCi0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cwotICoKLSAqIERFU0NSSVBUSU9OOiBPYnRhaW4gYW5kIHJldHVybiBhICJyZWZlcmVuY2UiIHRvIHRoZSB0YXJnZXQgb2JqZWN0Ci0gKiAgICAgICAgICAgICAgQ29tbW9uIGNvZGUgZm9yIHRoZSByZWZfb2Zfb3AgYW5kIHRoZSBjb25kX3JlZl9vZl9vcC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYWNwaV9zdGF0dXMKLWFjcGlfZXhfZ2V0X29iamVjdF9yZWZlcmVuY2UodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2MsCi0JCQkgICAgIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKipyZXR1cm5fZGVzYywKLQkJCSAgICAgc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSkKLXsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpyZWZlcmVuY2Vfb2JqOwotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnJlZmVyZW5jZWRfb2JqOwotCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIoZXhfZ2V0X29iamVjdF9yZWZlcmVuY2UsIG9ial9kZXNjKTsKLQotCSpyZXR1cm5fZGVzYyA9IE5VTEw7Ci0KLQlzd2l0Y2ggKEFDUElfR0VUX0RFU0NSSVBUT1JfVFlQRShvYmpfZGVzYykpIHsKLQljYXNlIEFDUElfREVTQ19UWVBFX09QRVJBTkQ6Ci0KLQkJaWYgKEFDUElfR0VUX09CSkVDVF9UWVBFKG9ial9kZXNjKSAhPSBBQ1BJX1RZUEVfTE9DQUxfUkVGRVJFTkNFKSB7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX09QRVJBTkRfVFlQRSk7Ci0JCX0KLQotCQkvKgotCQkgKiBNdXN0IGJlIGEgcmVmZXJlbmNlIHRvIGEgTG9jYWwgb3IgQXJnCi0JCSAqLwotCQlzd2l0Y2ggKG9ial9kZXNjLT5yZWZlcmVuY2UuY2xhc3MpIHsKLQkJY2FzZSBBQ1BJX1JFRkNMQVNTX0xPQ0FMOgotCQljYXNlIEFDUElfUkVGQ0xBU1NfQVJHOgotCQljYXNlIEFDUElfUkVGQ0xBU1NfREVCVUc6Ci0KLQkJCS8qIFRoZSByZWZlcmVuY2VkIG9iamVjdCBpcyB0aGUgcHNldWRvLW5vZGUgZm9yIHRoZSBsb2NhbC9hcmcgKi8KLQotCQkJcmVmZXJlbmNlZF9vYmogPSBvYmpfZGVzYy0+cmVmZXJlbmNlLm9iamVjdDsKLQkJCWJyZWFrOwotCi0JCWRlZmF1bHQ6Ci0KLQkJCUFDUElfRVJST1IoKEFFX0lORk8sICJVbmtub3duIFJlZmVyZW5jZSBDbGFzcyAlMi4yWCIsCi0JCQkJICAgIG9ial9kZXNjLT5yZWZlcmVuY2UuY2xhc3MpKTsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfSU5URVJOQUwpOwotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBBQ1BJX0RFU0NfVFlQRV9OQU1FRDoKLQotCQkvKgotCQkgKiBBIG5hbWVkIHJlZmVyZW5jZSB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gcmVzb2x2ZWQgdG8gYSBOb2RlCi0JCSAqLwotCQlyZWZlcmVuY2VkX29iaiA9IG9ial9kZXNjOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0KLQkJQUNQSV9FUlJPUigoQUVfSU5GTywgIkludmFsaWQgZGVzY3JpcHRvciB0eXBlICVYIiwKLQkJCSAgICBBQ1BJX0dFVF9ERVNDUklQVE9SX1RZUEUob2JqX2Rlc2MpKSk7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9UWVBFKTsKLQl9Ci0KLQkvKiBDcmVhdGUgYSBuZXcgcmVmZXJlbmNlIG9iamVjdCAqLwotCi0JcmVmZXJlbmNlX29iaiA9Ci0JICAgIGFjcGlfdXRfY3JlYXRlX2ludGVybmFsX29iamVjdChBQ1BJX1RZUEVfTE9DQUxfUkVGRVJFTkNFKTsKLQlpZiAoIXJlZmVyZW5jZV9vYmopIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX01FTU9SWSk7Ci0JfQotCi0JcmVmZXJlbmNlX29iai0+cmVmZXJlbmNlLmNsYXNzID0gQUNQSV9SRUZDTEFTU19SRUZPRjsKLQlyZWZlcmVuY2Vfb2JqLT5yZWZlcmVuY2Uub2JqZWN0ID0gcmVmZXJlbmNlZF9vYmo7Ci0JKnJldHVybl9kZXNjID0gcmVmZXJlbmNlX29iajsKLQotCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVhFQywKLQkJCSAgIk9iamVjdCAlcCBUeXBlIFslc10sIHJldHVybmluZyBSZWZlcmVuY2UgJXBcbiIsCi0JCQkgIG9ial9kZXNjLCBhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lKG9ial9kZXNjKSwKLQkJCSAgKnJldHVybl9kZXNjKSk7Ci0KLQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X2NvbmNhdF90ZW1wbGF0ZQotICoKLSAqIFBBUkFNRVRFUlM6ICBPcGVyYW5kMCAgICAgICAgICAgIC0gRmlyc3Qgc291cmNlIG9iamVjdAotICogICAgICAgICAgICAgIE9wZXJhbmQxICAgICAgICAgICAgLSBTZWNvbmQgc291cmNlIG9iamVjdAotICogICAgICAgICAgICAgIGFjdHVhbF9yZXR1cm5fZGVzYyAgLSBXaGVyZSB0byBwbGFjZSB0aGUgcmV0dXJuIG9iamVjdAotICogICAgICAgICAgICAgIHdhbGtfc3RhdGUgICAgICAgICAgLSBDdXJyZW50IHdhbGsgc3RhdGUKLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IENvbmNhdGVuYXRlIHR3byByZXNvdXJjZSB0ZW1wbGF0ZXMKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1hY3BpX3N0YXR1cwotYWNwaV9leF9jb25jYXRfdGVtcGxhdGUodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb3BlcmFuZDAsCi0JCQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvcGVyYW5kMSwKLQkJCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKiphY3R1YWxfcmV0dXJuX2Rlc2MsCi0JCQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKQotewotCWFjcGlfc3RhdHVzIHN0YXR1czsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpyZXR1cm5fZGVzYzsKLQl1OCAqbmV3X2J1ZjsKLQl1OCAqZW5kX3RhZzsKLQlhY3BpX3NpemUgbGVuZ3RoMDsKLQlhY3BpX3NpemUgbGVuZ3RoMTsKLQlhY3BpX3NpemUgbmV3X2xlbmd0aDsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UoZXhfY29uY2F0X3RlbXBsYXRlKTsKLQotCS8qCi0JICogRmluZCB0aGUgZW5kX3RhZyBkZXNjcmlwdG9yIGluIGVhY2ggcmVzb3VyY2UgdGVtcGxhdGUuCi0JICogTm90ZTE6IHJldHVybmVkIHBvaW50ZXJzIHBvaW50IFRPIHRoZSBlbmRfdGFnLCBub3QgcGFzdCBpdC4KLQkgKiBOb3RlMjogemVyby1sZW5ndGggYnVmZmVycyBhcmUgYWxsb3dlZDsgdHJlYXRlZCBsaWtlIG9uZSBlbmRfdGFnCi0JICovCi0KLQkvKiBHZXQgdGhlIGxlbmd0aCBvZiB0aGUgZmlyc3QgcmVzb3VyY2UgdGVtcGxhdGUgKi8KLQotCXN0YXR1cyA9IGFjcGlfdXRfZ2V0X3Jlc291cmNlX2VuZF90YWcob3BlcmFuZDAsICZlbmRfdGFnKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci0JfQotCi0JbGVuZ3RoMCA9IEFDUElfUFRSX0RJRkYoZW5kX3RhZywgb3BlcmFuZDAtPmJ1ZmZlci5wb2ludGVyKTsKLQotCS8qIEdldCB0aGUgbGVuZ3RoIG9mIHRoZSBzZWNvbmQgcmVzb3VyY2UgdGVtcGxhdGUgKi8KLQotCXN0YXR1cyA9IGFjcGlfdXRfZ2V0X3Jlc291cmNlX2VuZF90YWcob3BlcmFuZDEsICZlbmRfdGFnKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci0JfQotCi0JbGVuZ3RoMSA9IEFDUElfUFRSX0RJRkYoZW5kX3RhZywgb3BlcmFuZDEtPmJ1ZmZlci5wb2ludGVyKTsKLQotCS8qIENvbWJpbmUgYm90aCBsZW5ndGhzLCBtaW5pbXVtIHNpemUgd2lsbCBiZSAyIGZvciBlbmRfdGFnICovCi0KLQluZXdfbGVuZ3RoID0gbGVuZ3RoMCArIGxlbmd0aDEgKyBzaXplb2Yoc3RydWN0IGFtbF9yZXNvdXJjZV9lbmRfdGFnKTsKLQotCS8qIENyZWF0ZSBhIG5ldyBidWZmZXIgb2JqZWN0IGZvciB0aGUgcmVzdWx0ICh3aXRoIG9uZSBlbmRfdGFnKSAqLwotCi0JcmV0dXJuX2Rlc2MgPSBhY3BpX3V0X2NyZWF0ZV9idWZmZXJfb2JqZWN0KG5ld19sZW5ndGgpOwotCWlmICghcmV0dXJuX2Rlc2MpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX01FTU9SWSk7Ci0JfQotCi0JLyoKLQkgKiBDb3B5IHRoZSB0ZW1wbGF0ZXMgdG8gdGhlIG5ldyBidWZmZXIsIDAgZmlyc3QsIHRoZW4gMSBmb2xsb3dzLiBPbmUKLQkgKiBlbmRfdGFnIGRlc2NyaXB0b3IgaXMgY29waWVkIGZyb20gT3BlcmFuZDEuCi0JICovCi0JbmV3X2J1ZiA9IHJldHVybl9kZXNjLT5idWZmZXIucG9pbnRlcjsKLQlBQ1BJX01FTUNQWShuZXdfYnVmLCBvcGVyYW5kMC0+YnVmZmVyLnBvaW50ZXIsIGxlbmd0aDApOwotCUFDUElfTUVNQ1BZKG5ld19idWYgKyBsZW5ndGgwLCBvcGVyYW5kMS0+YnVmZmVyLnBvaW50ZXIsIGxlbmd0aDEpOwotCi0JLyogSW5zZXJ0IGVuZF90YWcgYW5kIHNldCB0aGUgY2hlY2tzdW0gdG8gemVybywgbWVhbnMgImlnbm9yZSBjaGVja3N1bSIgKi8KLQotCW5ld19idWZbbmV3X2xlbmd0aCAtIDFdID0gMDsKLQluZXdfYnVmW25ld19sZW5ndGggLSAyXSA9IEFDUElfUkVTT1VSQ0VfTkFNRV9FTkRfVEFHIHwgMTsKLQotCS8qIFJldHVybiB0aGUgY29tcGxldGVkIHJlc291cmNlIHRlbXBsYXRlICovCi0KLQkqYWN0dWFsX3JldHVybl9kZXNjID0gcmV0dXJuX2Rlc2M7Ci0JcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9leF9kb19jb25jYXRlbmF0ZQotICoKLSAqIFBBUkFNRVRFUlM6ICBPcGVyYW5kMCAgICAgICAgICAgIC0gRmlyc3Qgc291cmNlIG9iamVjdAotICogICAgICAgICAgICAgIE9wZXJhbmQxICAgICAgICAgICAgLSBTZWNvbmQgc291cmNlIG9iamVjdAotICogICAgICAgICAgICAgIGFjdHVhbF9yZXR1cm5fZGVzYyAgLSBXaGVyZSB0byBwbGFjZSB0aGUgcmV0dXJuIG9iamVjdAotICogICAgICAgICAgICAgIHdhbGtfc3RhdGUgICAgICAgICAgLSBDdXJyZW50IHdhbGsgc3RhdGUKLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IENvbmNhdGVuYXRlIHR3byBvYmplY3RzIE9GIFRIRSBTQU1FIFRZUEUuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotYWNwaV9zdGF0dXMKLWFjcGlfZXhfZG9fY29uY2F0ZW5hdGUodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb3BlcmFuZDAsCi0JCSAgICAgICB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvcGVyYW5kMSwKLQkJICAgICAgIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKiphY3R1YWxfcmV0dXJuX2Rlc2MsCi0JCSAgICAgICBzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKQotewotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKmxvY2FsX29wZXJhbmQxID0gb3BlcmFuZDE7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqcmV0dXJuX2Rlc2M7Ci0JY2hhciAqbmV3X2J1ZjsKLQlhY3BpX3N0YXR1cyBzdGF0dXM7Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGV4X2RvX2NvbmNhdGVuYXRlKTsKLQotCS8qCi0JICogQ29udmVydCB0aGUgc2Vjb25kIG9wZXJhbmQgaWYgbmVjZXNzYXJ5LiAgVGhlIGZpcnN0IG9wZXJhbmQKLQkgKiBkZXRlcm1pbmVzIHRoZSB0eXBlIG9mIHRoZSBzZWNvbmQgb3BlcmFuZCwgKFNlZSB0aGUgRGF0YSBUeXBlcwotCSAqIHNlY3Rpb24gb2YgdGhlIEFDUEkgc3BlY2lmaWNhdGlvbi4pICBCb3RoIG9iamVjdCB0eXBlcyBhcmUKLQkgKiBndWFyYW50ZWVkIHRvIGJlIGVpdGhlciBJbnRlZ2VyL1N0cmluZy9CdWZmZXIgYnkgdGhlIG9wZXJhbmQKLQkgKiByZXNvbHV0aW9uIG1lY2hhbmlzbS4KLQkgKi8KLQlzd2l0Y2ggKEFDUElfR0VUX09CSkVDVF9UWVBFKG9wZXJhbmQwKSkgewotCWNhc2UgQUNQSV9UWVBFX0lOVEVHRVI6Ci0JCXN0YXR1cyA9Ci0JCSAgICBhY3BpX2V4X2NvbnZlcnRfdG9faW50ZWdlcihvcGVyYW5kMSwgJmxvY2FsX29wZXJhbmQxLCAxNik7Ci0JCWJyZWFrOwotCi0JY2FzZSBBQ1BJX1RZUEVfU1RSSU5HOgotCQlzdGF0dXMgPSBhY3BpX2V4X2NvbnZlcnRfdG9fc3RyaW5nKG9wZXJhbmQxLCAmbG9jYWxfb3BlcmFuZDEsCi0JCQkJCQkgICBBQ1BJX0lNUExJQ0lUX0NPTlZFUlRfSEVYKTsKLQkJYnJlYWs7Ci0KLQljYXNlIEFDUElfVFlQRV9CVUZGRVI6Ci0JCXN0YXR1cyA9IGFjcGlfZXhfY29udmVydF90b19idWZmZXIob3BlcmFuZDEsICZsb2NhbF9vcGVyYW5kMSk7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJQUNQSV9FUlJPUigoQUVfSU5GTywgIkludmFsaWQgb2JqZWN0IHR5cGU6ICVYIiwKLQkJCSAgICBBQ1BJX0dFVF9PQkpFQ1RfVFlQRShvcGVyYW5kMCkpKTsKLQkJc3RhdHVzID0gQUVfQU1MX0lOVEVSTkFMOwotCX0KLQotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlnb3RvIGNsZWFudXA7Ci0JfQotCi0JLyoKLQkgKiBCb3RoIG9wZXJhbmRzIGFyZSBub3cga25vd24gdG8gYmUgdGhlIHNhbWUgb2JqZWN0IHR5cGUKLQkgKiAoQm90aCBhcmUgSW50ZWdlciwgU3RyaW5nLCBvciBCdWZmZXIpLCBhbmQgd2UgY2FuIG5vdyBwZXJmb3JtIHRoZQotCSAqIGNvbmNhdGVuYXRpb24uCi0JICovCi0KLQkvKgotCSAqIFRoZXJlIGFyZSB0aHJlZSBjYXNlcyB0byBoYW5kbGU6Ci0JICoKLQkgKiAxKSBUd28gSW50ZWdlcnMgY29uY2F0ZW5hdGVkIHRvIHByb2R1Y2UgYSBuZXcgQnVmZmVyCi0JICogMikgVHdvIFN0cmluZ3MgY29uY2F0ZW5hdGVkIHRvIHByb2R1Y2UgYSBuZXcgU3RyaW5nCi0JICogMykgVHdvIEJ1ZmZlcnMgY29uY2F0ZW5hdGVkIHRvIHByb2R1Y2UgYSBuZXcgQnVmZmVyCi0JICovCi0Jc3dpdGNoIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRShvcGVyYW5kMCkpIHsKLQljYXNlIEFDUElfVFlQRV9JTlRFR0VSOgotCi0JCS8qIFJlc3VsdCBvZiB0d28gSW50ZWdlcnMgaXMgYSBCdWZmZXIgKi8KLQkJLyogTmVlZCBlbm91Z2ggYnVmZmVyIHNwYWNlIGZvciB0d28gaW50ZWdlcnMgKi8KLQotCQlyZXR1cm5fZGVzYyA9IGFjcGlfdXRfY3JlYXRlX2J1ZmZlcl9vYmplY3QoKGFjcGlfc2l6ZSkKLQkJCQkJCQkgICBBQ1BJX01VTF8yCi0JCQkJCQkJICAgKGFjcGlfZ2JsX2ludGVnZXJfYnl0ZV93aWR0aCkpOwotCQlpZiAoIXJldHVybl9kZXNjKSB7Ci0JCQlzdGF0dXMgPSBBRV9OT19NRU1PUlk7Ci0JCQlnb3RvIGNsZWFudXA7Ci0JCX0KLQotCQluZXdfYnVmID0gKGNoYXIgKilyZXR1cm5fZGVzYy0+YnVmZmVyLnBvaW50ZXI7Ci0KLQkJLyogQ29weSB0aGUgZmlyc3QgaW50ZWdlciwgTFNCIGZpcnN0ICovCi0KLQkJQUNQSV9NRU1DUFkobmV3X2J1ZiwgJm9wZXJhbmQwLT5pbnRlZ2VyLnZhbHVlLAotCQkJICAgIGFjcGlfZ2JsX2ludGVnZXJfYnl0ZV93aWR0aCk7Ci0KLQkJLyogQ29weSB0aGUgc2Vjb25kIGludGVnZXIgKExTQiBmaXJzdCkgYWZ0ZXIgdGhlIGZpcnN0ICovCi0KLQkJQUNQSV9NRU1DUFkobmV3X2J1ZiArIGFjcGlfZ2JsX2ludGVnZXJfYnl0ZV93aWR0aCwKLQkJCSAgICAmbG9jYWxfb3BlcmFuZDEtPmludGVnZXIudmFsdWUsCi0JCQkgICAgYWNwaV9nYmxfaW50ZWdlcl9ieXRlX3dpZHRoKTsKLQkJYnJlYWs7Ci0KLQljYXNlIEFDUElfVFlQRV9TVFJJTkc6Ci0KLQkJLyogUmVzdWx0IG9mIHR3byBTdHJpbmdzIGlzIGEgU3RyaW5nICovCi0KLQkJcmV0dXJuX2Rlc2MgPSBhY3BpX3V0X2NyZWF0ZV9zdHJpbmdfb2JqZWN0KCgoYWNwaV9zaXplKQotCQkJCQkJCSAgICBvcGVyYW5kMC0+c3RyaW5nLgotCQkJCQkJCSAgICBsZW5ndGggKwotCQkJCQkJCSAgICBsb2NhbF9vcGVyYW5kMS0+Ci0JCQkJCQkJICAgIHN0cmluZy5sZW5ndGgpKTsKLQkJaWYgKCFyZXR1cm5fZGVzYykgewotCQkJc3RhdHVzID0gQUVfTk9fTUVNT1JZOwotCQkJZ290byBjbGVhbnVwOwotCQl9Ci0KLQkJbmV3X2J1ZiA9IHJldHVybl9kZXNjLT5zdHJpbmcucG9pbnRlcjsKLQotCQkvKiBDb25jYXRlbmF0ZSB0aGUgc3RyaW5ncyAqLwotCi0JCUFDUElfU1RSQ1BZKG5ld19idWYsIG9wZXJhbmQwLT5zdHJpbmcucG9pbnRlcik7Ci0JCUFDUElfU1RSQ1BZKG5ld19idWYgKyBvcGVyYW5kMC0+c3RyaW5nLmxlbmd0aCwKLQkJCSAgICBsb2NhbF9vcGVyYW5kMS0+c3RyaW5nLnBvaW50ZXIpOwotCQlicmVhazsKLQotCWNhc2UgQUNQSV9UWVBFX0JVRkZFUjoKLQotCQkvKiBSZXN1bHQgb2YgdHdvIEJ1ZmZlcnMgaXMgYSBCdWZmZXIgKi8KLQotCQlyZXR1cm5fZGVzYyA9IGFjcGlfdXRfY3JlYXRlX2J1ZmZlcl9vYmplY3QoKChhY3BpX3NpemUpCi0JCQkJCQkJICAgIG9wZXJhbmQwLT5idWZmZXIuCi0JCQkJCQkJICAgIGxlbmd0aCArCi0JCQkJCQkJICAgIGxvY2FsX29wZXJhbmQxLT4KLQkJCQkJCQkgICAgYnVmZmVyLmxlbmd0aCkpOwotCQlpZiAoIXJldHVybl9kZXNjKSB7Ci0JCQlzdGF0dXMgPSBBRV9OT19NRU1PUlk7Ci0JCQlnb3RvIGNsZWFudXA7Ci0JCX0KLQotCQluZXdfYnVmID0gKGNoYXIgKilyZXR1cm5fZGVzYy0+YnVmZmVyLnBvaW50ZXI7Ci0KLQkJLyogQ29uY2F0ZW5hdGUgdGhlIGJ1ZmZlcnMgKi8KLQotCQlBQ1BJX01FTUNQWShuZXdfYnVmLCBvcGVyYW5kMC0+YnVmZmVyLnBvaW50ZXIsCi0JCQkgICAgb3BlcmFuZDAtPmJ1ZmZlci5sZW5ndGgpOwotCQlBQ1BJX01FTUNQWShuZXdfYnVmICsgb3BlcmFuZDAtPmJ1ZmZlci5sZW5ndGgsCi0JCQkgICAgbG9jYWxfb3BlcmFuZDEtPmJ1ZmZlci5wb2ludGVyLAotCQkJICAgIGxvY2FsX29wZXJhbmQxLT5idWZmZXIubGVuZ3RoKTsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCi0JCS8qIEludmFsaWQgb2JqZWN0IHR5cGUsIHNob3VsZCBub3QgaGFwcGVuIGhlcmUgKi8KLQotCQlBQ1BJX0VSUk9SKChBRV9JTkZPLCAiSW52YWxpZCBvYmplY3QgdHlwZTogJVgiLAotCQkJICAgIEFDUElfR0VUX09CSkVDVF9UWVBFKG9wZXJhbmQwKSkpOwotCQlzdGF0dXMgPSBBRV9BTUxfSU5URVJOQUw7Ci0JCWdvdG8gY2xlYW51cDsKLQl9Ci0KLQkqYWN0dWFsX3JldHVybl9kZXNjID0gcmV0dXJuX2Rlc2M7Ci0KLSAgICAgIGNsZWFudXA6Ci0JaWYgKGxvY2FsX29wZXJhbmQxICE9IG9wZXJhbmQxKSB7Ci0JCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZShsb2NhbF9vcGVyYW5kMSk7Ci0JfQotCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X2RvX21hdGhfb3AKLSAqCi0gKiBQQVJBTUVURVJTOiAgT3Bjb2RlICAgICAgICAgICAgICAtIEFNTCBvcGNvZGUKLSAqICAgICAgICAgICAgICBJbnRlZ2VyMCAgICAgICAgICAgIC0gSW50ZWdlciBvcGVyYW5kICMwCi0gKiAgICAgICAgICAgICAgSW50ZWdlcjEgICAgICAgICAgICAtIEludGVnZXIgb3BlcmFuZCAjMQotICoKLSAqIFJFVFVSTjogICAgICBJbnRlZ2VyIHJlc3VsdCBvZiB0aGUgb3BlcmF0aW9uCi0gKgotICogREVTQ1JJUFRJT046IEV4ZWN1dGUgYSBtYXRoIEFNTCBvcGNvZGUuIFRoZSBwdXJwb3NlIG9mIGhhdmluZyBhbGwgb2YgdGhlCi0gKiAgICAgICAgICAgICAgbWF0aCBmdW5jdGlvbnMgaGVyZSBpcyB0byBwcmV2ZW50IGEgbG90IG9mIHBvaW50ZXIgZGVyZWZlcmVuY2luZwotICogICAgICAgICAgICAgIHRvIG9idGFpbiB0aGUgb3BlcmFuZHMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotYWNwaV9pbnRlZ2VyCi1hY3BpX2V4X2RvX21hdGhfb3AodTE2IG9wY29kZSwgYWNwaV9pbnRlZ2VyIGludGVnZXIwLCBhY3BpX2ludGVnZXIgaW50ZWdlcjEpCi17Ci0KLQlBQ1BJX0ZVTkNUSU9OX0VOVFJZKCk7Ci0KLQlzd2l0Y2ggKG9wY29kZSkgewotCWNhc2UgQU1MX0FERF9PUDoJLyogQWRkIChJbnRlZ2VyMCwgSW50ZWdlcjEsIFJlc3VsdCkgKi8KLQotCQlyZXR1cm4gKGludGVnZXIwICsgaW50ZWdlcjEpOwotCi0JY2FzZSBBTUxfQklUX0FORF9PUDoJLyogQW5kIChJbnRlZ2VyMCwgSW50ZWdlcjEsIFJlc3VsdCkgKi8KLQotCQlyZXR1cm4gKGludGVnZXIwICYgaW50ZWdlcjEpOwotCi0JY2FzZSBBTUxfQklUX05BTkRfT1A6CS8qIE5BbmQgKEludGVnZXIwLCBJbnRlZ2VyMSwgUmVzdWx0KSAqLwotCi0JCXJldHVybiAofihpbnRlZ2VyMCAmIGludGVnZXIxKSk7Ci0KLQljYXNlIEFNTF9CSVRfT1JfT1A6CS8qIE9yIChJbnRlZ2VyMCwgSW50ZWdlcjEsIFJlc3VsdCkgKi8KLQotCQlyZXR1cm4gKGludGVnZXIwIHwgaW50ZWdlcjEpOwotCi0JY2FzZSBBTUxfQklUX05PUl9PUDoJLyogTk9yIChJbnRlZ2VyMCwgSW50ZWdlcjEsIFJlc3VsdCkgKi8KLQotCQlyZXR1cm4gKH4oaW50ZWdlcjAgfCBpbnRlZ2VyMSkpOwotCi0JY2FzZSBBTUxfQklUX1hPUl9PUDoJLyogWE9yIChJbnRlZ2VyMCwgSW50ZWdlcjEsIFJlc3VsdCkgKi8KLQotCQlyZXR1cm4gKGludGVnZXIwIF4gaW50ZWdlcjEpOwotCi0JY2FzZSBBTUxfTVVMVElQTFlfT1A6CS8qIE11bHRpcGx5IChJbnRlZ2VyMCwgSW50ZWdlcjEsIFJlc3VsdCkgKi8KLQotCQlyZXR1cm4gKGludGVnZXIwICogaW50ZWdlcjEpOwotCi0JY2FzZSBBTUxfU0hJRlRfTEVGVF9PUDoJLyogc2hpZnRfbGVmdCAoT3BlcmFuZCwgc2hpZnRfY291bnQsIFJlc3VsdCkgKi8KLQotCQkvKgotCQkgKiBXZSBuZWVkIHRvIGNoZWNrIGlmIHRoZSBzaGlmdGNvdW50IGlzIGxhcmdlciB0aGFuIHRoZSBpbnRlZ2VyIGJpdAotCQkgKiB3aWR0aCBzaW5jZSB0aGUgYmVoYXZpb3Igb2YgdGhpcyBpcyBub3Qgd2VsbC1kZWZpbmVkIGluIHRoZSBDIGxhbmd1YWdlLgotCQkgKi8KLQkJaWYgKGludGVnZXIxID49IGFjcGlfZ2JsX2ludGVnZXJfYml0X3dpZHRoKSB7Ci0JCQlyZXR1cm4gKDApOwotCQl9Ci0JCXJldHVybiAoaW50ZWdlcjAgPDwgaW50ZWdlcjEpOwotCi0JY2FzZSBBTUxfU0hJRlRfUklHSFRfT1A6CS8qIHNoaWZ0X3JpZ2h0IChPcGVyYW5kLCBzaGlmdF9jb3VudCwgUmVzdWx0KSAqLwotCi0JCS8qCi0JCSAqIFdlIG5lZWQgdG8gY2hlY2sgaWYgdGhlIHNoaWZ0Y291bnQgaXMgbGFyZ2VyIHRoYW4gdGhlIGludGVnZXIgYml0Ci0JCSAqIHdpZHRoIHNpbmNlIHRoZSBiZWhhdmlvciBvZiB0aGlzIGlzIG5vdCB3ZWxsLWRlZmluZWQgaW4gdGhlIEMgbGFuZ3VhZ2UuCi0JCSAqLwotCQlpZiAoaW50ZWdlcjEgPj0gYWNwaV9nYmxfaW50ZWdlcl9iaXRfd2lkdGgpIHsKLQkJCXJldHVybiAoMCk7Ci0JCX0KLQkJcmV0dXJuIChpbnRlZ2VyMCA+PiBpbnRlZ2VyMSk7Ci0KLQljYXNlIEFNTF9TVUJUUkFDVF9PUDoJLyogU3VidHJhY3QgKEludGVnZXIwLCBJbnRlZ2VyMSwgUmVzdWx0KSAqLwotCi0JCXJldHVybiAoaW50ZWdlcjAgLSBpbnRlZ2VyMSk7Ci0KLQlkZWZhdWx0OgotCi0JCXJldHVybiAoMCk7Ci0JfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X2RvX2xvZ2ljYWxfbnVtZXJpY19vcAotICoKLSAqIFBBUkFNRVRFUlM6ICBPcGNvZGUgICAgICAgICAgICAgIC0gQU1MIG9wY29kZQotICogICAgICAgICAgICAgIEludGVnZXIwICAgICAgICAgICAgLSBJbnRlZ2VyIG9wZXJhbmQgIzAKLSAqICAgICAgICAgICAgICBJbnRlZ2VyMSAgICAgICAgICAgIC0gSW50ZWdlciBvcGVyYW5kICMxCi0gKiAgICAgICAgICAgICAgbG9naWNhbF9yZXN1bHQgICAgICAtIFRSVUUvRkFMU0UgcmVzdWx0IG9mIHRoZSBvcGVyYXRpb24KLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IEV4ZWN1dGUgYSBsb2dpY2FsICJOdW1lcmljIiBBTUwgb3Bjb2RlLiBGb3IgdGhlc2UgTnVtZXJpYwotICogICAgICAgICAgICAgIG9wZXJhdG9ycyAoTEFuZCBhbmQgTE9yKSwgYm90aCBvcGVyYW5kcyBtdXN0IGJlIGludGVnZXJzLgotICoKLSAqICAgICAgICAgICAgICBOb3RlOiBjbGVhbmVzdCBtYWNoaW5lIGNvZGUgc2VlbXMgdG8gYmUgcHJvZHVjZWQgYnkgdGhlIGNvZGUKLSAqICAgICAgICAgICAgICBiZWxvdywgcmF0aGVyIHRoYW4gdXNpbmcgc3RhdGVtZW50cyBvZiB0aGUgZm9ybToKLSAqICAgICAgICAgICAgICAgICAgUmVzdWx0ID0gKEludGVnZXIwICYmIEludGVnZXIxKTsKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1hY3BpX3N0YXR1cwotYWNwaV9leF9kb19sb2dpY2FsX251bWVyaWNfb3AodTE2IG9wY29kZSwKLQkJCSAgICAgIGFjcGlfaW50ZWdlciBpbnRlZ2VyMCwKLQkJCSAgICAgIGFjcGlfaW50ZWdlciBpbnRlZ2VyMSwgdTggKiBsb2dpY2FsX3Jlc3VsdCkKLXsKLQlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKLQl1OCBsb2NhbF9yZXN1bHQgPSBGQUxTRTsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UoZXhfZG9fbG9naWNhbF9udW1lcmljX29wKTsKLQotCXN3aXRjaCAob3Bjb2RlKSB7Ci0JY2FzZSBBTUxfTEFORF9PUDoJLyogTEFuZCAoSW50ZWdlcjAsIEludGVnZXIxKSAqLwotCi0JCWlmIChpbnRlZ2VyMCAmJiBpbnRlZ2VyMSkgewotCQkJbG9jYWxfcmVzdWx0ID0gVFJVRTsKLQkJfQotCQlicmVhazsKLQotCWNhc2UgQU1MX0xPUl9PUDoJLyogTE9yIChJbnRlZ2VyMCwgSW50ZWdlcjEpICovCi0KLQkJaWYgKGludGVnZXIwIHx8IGludGVnZXIxKSB7Ci0JCQlsb2NhbF9yZXN1bHQgPSBUUlVFOwotCQl9Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJc3RhdHVzID0gQUVfQU1MX0lOVEVSTkFMOwotCQlicmVhazsKLQl9Ci0KLQkvKiBSZXR1cm4gdGhlIGxvZ2ljYWwgcmVzdWx0IGFuZCBzdGF0dXMgKi8KLQotCSpsb2dpY2FsX3Jlc3VsdCA9IGxvY2FsX3Jlc3VsdDsKLQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9leF9kb19sb2dpY2FsX29wCi0gKgotICogUEFSQU1FVEVSUzogIE9wY29kZSAgICAgICAgICAgICAgLSBBTUwgb3Bjb2RlCi0gKiAgICAgICAgICAgICAgT3BlcmFuZDAgICAgICAgICAgICAtIG9wZXJhbmQgIzAKLSAqICAgICAgICAgICAgICBPcGVyYW5kMSAgICAgICAgICAgIC0gb3BlcmFuZCAjMQotICogICAgICAgICAgICAgIGxvZ2ljYWxfcmVzdWx0ICAgICAgLSBUUlVFL0ZBTFNFIHJlc3VsdCBvZiB0aGUgb3BlcmF0aW9uCi0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cwotICoKLSAqIERFU0NSSVBUSU9OOiBFeGVjdXRlIGEgbG9naWNhbCBBTUwgb3Bjb2RlLiBUaGUgcHVycG9zZSBvZiBoYXZpbmcgYWxsIG9mIHRoZQotICogICAgICAgICAgICAgIGZ1bmN0aW9ucyBoZXJlIGlzIHRvIHByZXZlbnQgYSBsb3Qgb2YgcG9pbnRlciBkZXJlZmVyZW5jaW5nCi0gKiAgICAgICAgICAgICAgdG8gb2J0YWluIHRoZSBvcGVyYW5kcyBhbmQgdG8gc2ltcGxpZnkgdGhlIGdlbmVyYXRpb24gb2YgdGhlCi0gKiAgICAgICAgICAgICAgbG9naWNhbCB2YWx1ZS4gRm9yIHRoZSBOdW1lcmljIG9wZXJhdG9ycyAoTEFuZCBhbmQgTE9yKSwgYm90aAotICogICAgICAgICAgICAgIG9wZXJhbmRzIG11c3QgYmUgaW50ZWdlcnMuIEZvciB0aGUgb3RoZXIgbG9naWNhbCBvcGVyYXRvcnMsCi0gKiAgICAgICAgICAgICAgb3BlcmFuZHMgY2FuIGJlIGFueSBjb21iaW5hdGlvbiBvZiBJbnRlZ2VyL1N0cmluZy9CdWZmZXIuIFRoZQotICogICAgICAgICAgICAgIGZpcnN0IG9wZXJhbmQgZGV0ZXJtaW5lcyB0aGUgdHlwZSB0byB3aGljaCB0aGUgc2Vjb25kIG9wZXJhbmQKLSAqICAgICAgICAgICAgICB3aWxsIGJlIGNvbnZlcnRlZC4KLSAqCi0gKiAgICAgICAgICAgICAgTm90ZTogY2xlYW5lc3QgbWFjaGluZSBjb2RlIHNlZW1zIHRvIGJlIHByb2R1Y2VkIGJ5IHRoZSBjb2RlCi0gKiAgICAgICAgICAgICAgYmVsb3csIHJhdGhlciB0aGFuIHVzaW5nIHN0YXRlbWVudHMgb2YgdGhlIGZvcm06Ci0gKiAgICAgICAgICAgICAgICAgIFJlc3VsdCA9IChPcGVyYW5kMCA9PSBPcGVyYW5kMSk7Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotYWNwaV9zdGF0dXMKLWFjcGlfZXhfZG9fbG9naWNhbF9vcCh1MTYgb3Bjb2RlLAotCQkgICAgICB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvcGVyYW5kMCwKLQkJICAgICAgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb3BlcmFuZDEsIHU4ICogbG9naWNhbF9yZXN1bHQpCi17Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqbG9jYWxfb3BlcmFuZDEgPSBvcGVyYW5kMTsKLQlhY3BpX2ludGVnZXIgaW50ZWdlcjA7Ci0JYWNwaV9pbnRlZ2VyIGludGVnZXIxOwotCXUzMiBsZW5ndGgwOwotCXUzMiBsZW5ndGgxOwotCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOwotCXU4IGxvY2FsX3Jlc3VsdCA9IEZBTFNFOwotCWludCBjb21wYXJlOwotCi0JQUNQSV9GVU5DVElPTl9UUkFDRShleF9kb19sb2dpY2FsX29wKTsKLQotCS8qCi0JICogQ29udmVydCB0aGUgc2Vjb25kIG9wZXJhbmQgaWYgbmVjZXNzYXJ5LiAgVGhlIGZpcnN0IG9wZXJhbmQKLQkgKiBkZXRlcm1pbmVzIHRoZSB0eXBlIG9mIHRoZSBzZWNvbmQgb3BlcmFuZCwgKFNlZSB0aGUgRGF0YSBUeXBlcwotCSAqIHNlY3Rpb24gb2YgdGhlIEFDUEkgMy4wKyBzcGVjaWZpY2F0aW9uLikgIEJvdGggb2JqZWN0IHR5cGVzIGFyZQotCSAqIGd1YXJhbnRlZWQgdG8gYmUgZWl0aGVyIEludGVnZXIvU3RyaW5nL0J1ZmZlciBieSB0aGUgb3BlcmFuZAotCSAqIHJlc29sdXRpb24gbWVjaGFuaXNtLgotCSAqLwotCXN3aXRjaCAoQUNQSV9HRVRfT0JKRUNUX1RZUEUob3BlcmFuZDApKSB7Ci0JY2FzZSBBQ1BJX1RZUEVfSU5URUdFUjoKLQkJc3RhdHVzID0KLQkJICAgIGFjcGlfZXhfY29udmVydF90b19pbnRlZ2VyKG9wZXJhbmQxLCAmbG9jYWxfb3BlcmFuZDEsIDE2KTsKLQkJYnJlYWs7Ci0KLQljYXNlIEFDUElfVFlQRV9TVFJJTkc6Ci0JCXN0YXR1cyA9IGFjcGlfZXhfY29udmVydF90b19zdHJpbmcob3BlcmFuZDEsICZsb2NhbF9vcGVyYW5kMSwKLQkJCQkJCSAgIEFDUElfSU1QTElDSVRfQ09OVkVSVF9IRVgpOwotCQlicmVhazsKLQotCWNhc2UgQUNQSV9UWVBFX0JVRkZFUjoKLQkJc3RhdHVzID0gYWNwaV9leF9jb252ZXJ0X3RvX2J1ZmZlcihvcGVyYW5kMSwgJmxvY2FsX29wZXJhbmQxKTsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlzdGF0dXMgPSBBRV9BTUxfSU5URVJOQUw7Ci0JCWJyZWFrOwotCX0KLQotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlnb3RvIGNsZWFudXA7Ci0JfQotCi0JLyoKLQkgKiBUd28gY2FzZXM6IDEpIEJvdGggSW50ZWdlcnMsIDIpIEJvdGggU3RyaW5ncyBvciBCdWZmZXJzCi0JICovCi0JaWYgKEFDUElfR0VUX09CSkVDVF9UWVBFKG9wZXJhbmQwKSA9PSBBQ1BJX1RZUEVfSU5URUdFUikgewotCQkvKgotCQkgKiAxKSBCb3RoIG9wZXJhbmRzIGFyZSBvZiB0eXBlIGludGVnZXIKLQkJICogICAgTm90ZTogbG9jYWxfb3BlcmFuZDEgbWF5IGhhdmUgY2hhbmdlZCBhYm92ZQotCQkgKi8KLQkJaW50ZWdlcjAgPSBvcGVyYW5kMC0+aW50ZWdlci52YWx1ZTsKLQkJaW50ZWdlcjEgPSBsb2NhbF9vcGVyYW5kMS0+aW50ZWdlci52YWx1ZTsKLQotCQlzd2l0Y2ggKG9wY29kZSkgewotCQljYXNlIEFNTF9MRVFVQUxfT1A6CS8qIExFcXVhbCAoT3BlcmFuZDAsIE9wZXJhbmQxKSAqLwotCi0JCQlpZiAoaW50ZWdlcjAgPT0gaW50ZWdlcjEpIHsKLQkJCQlsb2NhbF9yZXN1bHQgPSBUUlVFOwotCQkJfQotCQkJYnJlYWs7Ci0KLQkJY2FzZSBBTUxfTEdSRUFURVJfT1A6CS8qIExHcmVhdGVyIChPcGVyYW5kMCwgT3BlcmFuZDEpICovCi0KLQkJCWlmIChpbnRlZ2VyMCA+IGludGVnZXIxKSB7Ci0JCQkJbG9jYWxfcmVzdWx0ID0gVFJVRTsKLQkJCX0KLQkJCWJyZWFrOwotCi0JCWNhc2UgQU1MX0xMRVNTX09QOgkvKiBMTGVzcyAoT3BlcmFuZDAsIE9wZXJhbmQxKSAqLwotCi0JCQlpZiAoaW50ZWdlcjAgPCBpbnRlZ2VyMSkgewotCQkJCWxvY2FsX3Jlc3VsdCA9IFRSVUU7Ci0JCQl9Ci0JCQlicmVhazsKLQotCQlkZWZhdWx0OgotCQkJc3RhdHVzID0gQUVfQU1MX0lOVEVSTkFMOwotCQkJYnJlYWs7Ci0JCX0KLQl9IGVsc2UgewotCQkvKgotCQkgKiAyKSBCb3RoIG9wZXJhbmRzIGFyZSBTdHJpbmdzIG9yIGJvdGggYXJlIEJ1ZmZlcnMKLQkJICogICAgTm90ZTogQ29kZSBiZWxvdyB0YWtlcyBhZHZhbnRhZ2Ugb2YgY29tbW9uIEJ1ZmZlci9TdHJpbmcKLQkJICogICAgICAgICAgb2JqZWN0IGZpZWxkcy4gbG9jYWxfb3BlcmFuZDEgbWF5IGhhdmUgY2hhbmdlZCBhYm92ZS4gVXNlCi0JCSAqICAgICAgICAgIG1lbWNtcCB0byBoYW5kbGUgbnVsbHMgaW4gYnVmZmVycy4KLQkJICovCi0JCWxlbmd0aDAgPSBvcGVyYW5kMC0+YnVmZmVyLmxlbmd0aDsKLQkJbGVuZ3RoMSA9IGxvY2FsX29wZXJhbmQxLT5idWZmZXIubGVuZ3RoOwotCi0JCS8qIExleGljb2dyYXBoaWMgY29tcGFyZTogY29tcGFyZSB0aGUgZGF0YSBieXRlcyAqLwotCi0JCWNvbXBhcmUgPSBBQ1BJX01FTUNNUChvcGVyYW5kMC0+YnVmZmVyLnBvaW50ZXIsCi0JCQkJICAgICAgbG9jYWxfb3BlcmFuZDEtPmJ1ZmZlci5wb2ludGVyLAotCQkJCSAgICAgIChsZW5ndGgwID4gbGVuZ3RoMSkgPyBsZW5ndGgxIDogbGVuZ3RoMCk7Ci0KLQkJc3dpdGNoIChvcGNvZGUpIHsKLQkJY2FzZSBBTUxfTEVRVUFMX09QOgkvKiBMRXF1YWwgKE9wZXJhbmQwLCBPcGVyYW5kMSkgKi8KLQotCQkJLyogTGVuZ3RoIGFuZCBhbGwgYnl0ZXMgbXVzdCBiZSBlcXVhbCAqLwotCi0JCQlpZiAoKGxlbmd0aDAgPT0gbGVuZ3RoMSkgJiYgKGNvbXBhcmUgPT0gMCkpIHsKLQotCQkJCS8qIExlbmd0aCBhbmQgYWxsIGJ5dGVzIG1hdGNoID09PiBUUlVFICovCi0KLQkJCQlsb2NhbF9yZXN1bHQgPSBUUlVFOwotCQkJfQotCQkJYnJlYWs7Ci0KLQkJY2FzZSBBTUxfTEdSRUFURVJfT1A6CS8qIExHcmVhdGVyIChPcGVyYW5kMCwgT3BlcmFuZDEpICovCi0KLQkJCWlmIChjb21wYXJlID4gMCkgewotCQkJCWxvY2FsX3Jlc3VsdCA9IFRSVUU7Ci0JCQkJZ290byBjbGVhbnVwOwkvKiBUUlVFICovCi0JCQl9Ci0JCQlpZiAoY29tcGFyZSA8IDApIHsKLQkJCQlnb3RvIGNsZWFudXA7CS8qIEZBTFNFICovCi0JCQl9Ci0KLQkJCS8qIEJ5dGVzIG1hdGNoICh0byBzaG9ydGVzdCBsZW5ndGgpLCBjb21wYXJlIGxlbmd0aHMgKi8KLQotCQkJaWYgKGxlbmd0aDAgPiBsZW5ndGgxKSB7Ci0JCQkJbG9jYWxfcmVzdWx0ID0gVFJVRTsKLQkJCX0KLQkJCWJyZWFrOwotCi0JCWNhc2UgQU1MX0xMRVNTX09QOgkvKiBMTGVzcyAoT3BlcmFuZDAsIE9wZXJhbmQxKSAqLwotCi0JCQlpZiAoY29tcGFyZSA+IDApIHsKLQkJCQlnb3RvIGNsZWFudXA7CS8qIEZBTFNFICovCi0JCQl9Ci0JCQlpZiAoY29tcGFyZSA8IDApIHsKLQkJCQlsb2NhbF9yZXN1bHQgPSBUUlVFOwotCQkJCWdvdG8gY2xlYW51cDsJLyogVFJVRSAqLwotCQkJfQotCi0JCQkvKiBCeXRlcyBtYXRjaCAodG8gc2hvcnRlc3QgbGVuZ3RoKSwgY29tcGFyZSBsZW5ndGhzICovCi0KLQkJCWlmIChsZW5ndGgwIDwgbGVuZ3RoMSkgewotCQkJCWxvY2FsX3Jlc3VsdCA9IFRSVUU7Ci0JCQl9Ci0JCQlicmVhazsKLQotCQlkZWZhdWx0OgotCQkJc3RhdHVzID0gQUVfQU1MX0lOVEVSTkFMOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLSAgICAgIGNsZWFudXA6Ci0KLQkvKiBOZXcgb2JqZWN0IHdhcyBjcmVhdGVkIGlmIGltcGxpY2l0IGNvbnZlcnNpb24gcGVyZm9ybWVkIC0gZGVsZXRlICovCi0KLQlpZiAobG9jYWxfb3BlcmFuZDEgIT0gb3BlcmFuZDEpIHsKLQkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKGxvY2FsX29wZXJhbmQxKTsKLQl9Ci0KLQkvKiBSZXR1cm4gdGhlIGxvZ2ljYWwgcmVzdWx0IGFuZCBzdGF0dXMgKi8KLQotCSpsb2dpY2FsX3Jlc3VsdCA9IGxvY2FsX3Jlc3VsdDsKLQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leG11dGV4LmMgYi9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhtdXRleC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOGJmM2Q3Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leG11dGV4LmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NzMgKzAsMCBAQAotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogTW9kdWxlIE5hbWU6IGV4bXV0ZXggLSBBU0wgTXV0ZXggQWNxdWlyZS9SZWxlYXNlIGZ1bmN0aW9ucwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDgsIEludGVsIENvcnAuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCi0gKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSBhdCBtaW5pbXVtIGEgZGlzY2xhaW1lcgotICogICAgc3Vic3RhbnRpYWxseSBzaW1pbGFyIHRvIHRoZSAiTk8gV0FSUkFOVFkiIGRpc2NsYWltZXIgYmVsb3cKLSAqICAgICgiRGlzY2xhaW1lciIpIGFuZCBhbnkgcmVkaXN0cmlidXRpb24gbXVzdCBiZSBjb25kaXRpb25lZCB1cG9uCi0gKiAgICBpbmNsdWRpbmcgYSBzdWJzdGFudGlhbGx5IHNpbWlsYXIgRGlzY2xhaW1lciByZXF1aXJlbWVudCBmb3IgZnVydGhlcgotICogICAgYmluYXJ5IHJlZGlzdHJpYnV0aW9uLgotICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzCi0gKiAgICBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIE5PIFdBUlJBTlRZCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKLSAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCi0gKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORwotICogSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCi0gKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCi0gKi8KLQotI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgotI2luY2x1ZGUgPGFjcGkvYWNpbnRlcnAuaD4KLSNpbmNsdWRlIDxhY3BpL2FjZXZlbnRzLmg+Ci0KLSNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX0VYRUNVVEVSCi1BQ1BJX01PRFVMRV9OQU1FKCJleG11dGV4IikKLQotLyogTG9jYWwgcHJvdG90eXBlcyAqLwotc3RhdGljIHZvaWQKLWFjcGlfZXhfbGlua19tdXRleCh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYywKLQkJICAgc3RydWN0IGFjcGlfdGhyZWFkX3N0YXRlICp0aHJlYWQpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X3VubGlua19tdXRleAotICoKLSAqIFBBUkFNRVRFUlM6ICBvYmpfZGVzYyAgICAgICAgICAgIC0gVGhlIG11dGV4IHRvIGJlIHVubGlua2VkCi0gKgotICogUkVUVVJOOiAgICAgIE5vbmUKLSAqCi0gKiBERVNDUklQVElPTjogUmVtb3ZlIGEgbXV0ZXggZnJvbSB0aGUgIkFjcXVpcmVkTXV0ZXgiIGxpc3QKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi12b2lkIGFjcGlfZXhfdW5saW5rX211dGV4KHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjKQotewotCXN0cnVjdCBhY3BpX3RocmVhZF9zdGF0ZSAqdGhyZWFkID0gb2JqX2Rlc2MtPm11dGV4Lm93bmVyX3RocmVhZDsKLQotCWlmICghdGhyZWFkKSB7Ci0JCXJldHVybjsKLQl9Ci0KLQkvKiBEb3VibHkgbGlua2VkIGxpc3QgKi8KLQotCWlmIChvYmpfZGVzYy0+bXV0ZXgubmV4dCkgewotCQkob2JqX2Rlc2MtPm11dGV4Lm5leHQpLT5tdXRleC5wcmV2ID0gb2JqX2Rlc2MtPm11dGV4LnByZXY7Ci0JfQotCi0JaWYgKG9ial9kZXNjLT5tdXRleC5wcmV2KSB7Ci0JCShvYmpfZGVzYy0+bXV0ZXgucHJldiktPm11dGV4Lm5leHQgPSBvYmpfZGVzYy0+bXV0ZXgubmV4dDsKLQl9IGVsc2UgewotCQl0aHJlYWQtPmFjcXVpcmVkX211dGV4X2xpc3QgPSBvYmpfZGVzYy0+bXV0ZXgubmV4dDsKLQl9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfZXhfbGlua19tdXRleAotICoKLSAqIFBBUkFNRVRFUlM6ICBvYmpfZGVzYyAgICAgICAgLSBUaGUgbXV0ZXggdG8gYmUgbGlua2VkCi0gKiAgICAgICAgICAgICAgVGhyZWFkICAgICAgICAgIC0gQ3VycmVudCBleGVjdXRpbmcgdGhyZWFkIG9iamVjdAotICoKLSAqIFJFVFVSTjogICAgICBOb25lCi0gKgotICogREVTQ1JJUFRJT046IEFkZCBhIG11dGV4IHRvIHRoZSAiQWNxdWlyZWRNdXRleCIgbGlzdCBmb3IgdGhpcyB3YWxrCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIHZvaWQKLWFjcGlfZXhfbGlua19tdXRleCh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYywKLQkJICAgc3RydWN0IGFjcGlfdGhyZWFkX3N0YXRlICp0aHJlYWQpCi17Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqbGlzdF9oZWFkOwotCi0JbGlzdF9oZWFkID0gdGhyZWFkLT5hY3F1aXJlZF9tdXRleF9saXN0OwotCi0JLyogVGhpcyBvYmplY3Qgd2lsbCBiZSB0aGUgZmlyc3Qgb2JqZWN0IGluIHRoZSBsaXN0ICovCi0KLQlvYmpfZGVzYy0+bXV0ZXgucHJldiA9IE5VTEw7Ci0Jb2JqX2Rlc2MtPm11dGV4Lm5leHQgPSBsaXN0X2hlYWQ7Ci0KLQkvKiBVcGRhdGUgb2xkIGZpcnN0IG9iamVjdCB0byBwb2ludCBiYWNrIHRvIHRoaXMgb2JqZWN0ICovCi0KLQlpZiAobGlzdF9oZWFkKSB7Ci0JCWxpc3RfaGVhZC0+bXV0ZXgucHJldiA9IG9ial9kZXNjOwotCX0KLQotCS8qIFVwZGF0ZSBsaXN0IGhlYWQgKi8KLQotCXRocmVhZC0+YWNxdWlyZWRfbXV0ZXhfbGlzdCA9IG9ial9kZXNjOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X2FjcXVpcmVfbXV0ZXhfb2JqZWN0Ci0gKgotICogUEFSQU1FVEVSUzogIHRpbWVfZGVzYyAgICAgICAgICAgLSBUaW1lb3V0IGluIG1pbGxpc2Vjb25kcwotICogICAgICAgICAgICAgIG9ial9kZXNjICAgICAgICAgICAgLSBNdXRleCBvYmplY3QKLSAqICAgICAgICAgICAgICBUaHJlYWQgICAgICAgICAgICAgIC0gQ3VycmVudCB0aHJlYWQgc3RhdGUKLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IEFjcXVpcmUgYW4gQU1MIG11dGV4LCBsb3ctbGV2ZWwgaW50ZXJmYWNlLiBQcm92aWRlcyBhIGNvbW1vbgotICogICAgICAgICAgICAgIHBhdGggdGhhdCBzdXBwb3J0cyBtdWx0aXBsZSBhY3F1aXJlcyBieSB0aGUgc2FtZSB0aHJlYWQuCi0gKgotICogTVVURVg6ICAgICAgIEludGVycHJldGVyIG11c3QgYmUgbG9ja2VkCi0gKgotICogTk9URTogVGhpcyBpbnRlcmZhY2UgaXMgY2FsbGVkIGZyb20gdGhyZWUgcGxhY2VzOgotICogMSkgRnJvbSBhY3BpX2V4X2FjcXVpcmVfbXV0ZXgsIHZpYSBhbiBBTUwgQWNxdWlyZSgpIG9wZXJhdG9yCi0gKiAyKSBGcm9tIGFjcGlfZXhfYWNxdWlyZV9nbG9iYWxfbG9jayB3aGVuIGFuIEFNTCBGaWVsZCBhY2Nlc3MgcmVxdWlyZXMgdGhlCi0gKiAgICBnbG9iYWwgbG9jawotICogMykgRnJvbSB0aGUgZXh0ZXJuYWwgaW50ZXJmYWNlLCBhY3BpX2FjcXVpcmVfZ2xvYmFsX2xvY2sKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1hY3BpX3N0YXR1cwotYWNwaV9leF9hY3F1aXJlX211dGV4X29iamVjdCh1MTYgdGltZW91dCwKLQkJCSAgICAgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2MsCi0JCQkgICAgIGFjcGlfdGhyZWFkX2lkIHRocmVhZF9pZCkKLXsKLQlhY3BpX3N0YXR1cyBzdGF0dXM7Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUihleF9hY3F1aXJlX211dGV4X29iamVjdCwgb2JqX2Rlc2MpOwotCi0JaWYgKCFvYmpfZGVzYykgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX1BBUkFNRVRFUik7Ci0JfQotCi0JLyogU3VwcG9ydCBmb3IgbXVsdGlwbGUgYWNxdWlyZXMgYnkgdGhlIG93bmluZyB0aHJlYWQgKi8KLQotCWlmIChvYmpfZGVzYy0+bXV0ZXgudGhyZWFkX2lkID09IHRocmVhZF9pZCkgewotCQkvKgotCQkgKiBUaGUgbXV0ZXggaXMgYWxyZWFkeSBvd25lZCBieSB0aGlzIHRocmVhZCwganVzdCBpbmNyZW1lbnQgdGhlCi0JCSAqIGFjcXVpc2l0aW9uIGRlcHRoCi0JCSAqLwotCQlvYmpfZGVzYy0+bXV0ZXguYWNxdWlzaXRpb25fZGVwdGgrKzsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKLQl9Ci0KLQkvKiBBY3F1aXJlIHRoZSBtdXRleCwgd2FpdCBpZiBuZWNlc3NhcnkuIFNwZWNpYWwgY2FzZSBmb3IgR2xvYmFsIExvY2sgKi8KLQotCWlmIChvYmpfZGVzYyA9PSBhY3BpX2dibF9nbG9iYWxfbG9ja19tdXRleCkgewotCQlzdGF0dXMgPSBhY3BpX2V2X2FjcXVpcmVfZ2xvYmFsX2xvY2sodGltZW91dCk7Ci0JfSBlbHNlIHsKLQkJc3RhdHVzID0gYWNwaV9leF9zeXN0ZW1fd2FpdF9tdXRleChvYmpfZGVzYy0+bXV0ZXgub3NfbXV0ZXgsCi0JCQkJCQkgICB0aW1lb3V0KTsKLQl9Ci0KLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQotCQkvKiBJbmNsdWRlcyBmYWlsdXJlIGZyb20gYSB0aW1lb3V0IG9uIHRpbWVfZGVzYyAqLwotCi0JCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotCX0KLQotCS8qIEFjcXVpcmVkIHRoZSBtdXRleDogdXBkYXRlIG11dGV4IG9iamVjdCAqLwotCi0Jb2JqX2Rlc2MtPm11dGV4LnRocmVhZF9pZCA9IHRocmVhZF9pZDsKLQlvYmpfZGVzYy0+bXV0ZXguYWNxdWlzaXRpb25fZGVwdGggPSAxOwotCW9ial9kZXNjLT5tdXRleC5vcmlnaW5hbF9zeW5jX2xldmVsID0gMDsKLQlvYmpfZGVzYy0+bXV0ZXgub3duZXJfdGhyZWFkID0gTlVMTDsJLyogVXNlZCBvbmx5IGZvciBBTUwgQWNxdWlyZSgpICovCi0KLQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X2FjcXVpcmVfbXV0ZXgKLSAqCi0gKiBQQVJBTUVURVJTOiAgdGltZV9kZXNjICAgICAgICAgICAtIFRpbWVvdXQgaW50ZWdlcgotICogICAgICAgICAgICAgIG9ial9kZXNjICAgICAgICAgICAgLSBNdXRleCBvYmplY3QKLSAqICAgICAgICAgICAgICB3YWxrX3N0YXRlICAgICAgICAgIC0gQ3VycmVudCBtZXRob2QgZXhlY3V0aW9uIHN0YXRlCi0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cwotICoKLSAqIERFU0NSSVBUSU9OOiBBY3F1aXJlIGFuIEFNTCBtdXRleAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWFjcGlfc3RhdHVzCi1hY3BpX2V4X2FjcXVpcmVfbXV0ZXgodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqdGltZV9kZXNjLAotCQkgICAgICB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYywKLQkJICAgICAgc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSkKLXsKLQlhY3BpX3N0YXR1cyBzdGF0dXM7Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUihleF9hY3F1aXJlX211dGV4LCBvYmpfZGVzYyk7Ci0KLQlpZiAoIW9ial9kZXNjKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfUEFSQU1FVEVSKTsKLQl9Ci0KLQkvKiBNdXN0IGhhdmUgYSB2YWxpZCB0aHJlYWQgSUQgKi8KLQotCWlmICghd2Fsa19zdGF0ZS0+dGhyZWFkKSB7Ci0JCUFDUElfRVJST1IoKEFFX0lORk8sCi0JCQkgICAgIkNhbm5vdCBhY3F1aXJlIE11dGV4IFslNC40c10sIG51bGwgdGhyZWFkIGluZm8iLAotCQkJICAgIGFjcGlfdXRfZ2V0X25vZGVfbmFtZShvYmpfZGVzYy0+bXV0ZXgubm9kZSkpKTsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9JTlRFUk5BTCk7Ci0JfQotCi0JLyoKLQkgKiBDdXJyZW50IHN5bmMgbGV2ZWwgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHN5bmMgbGV2ZWwgb2YgdGhlCi0JICogbXV0ZXguIFRoaXMgbWVjaGFuaXNtIHByb3ZpZGVzIHNvbWUgZGVhZGxvY2sgcHJldmVudGlvbgotCSAqLwotCWlmICh3YWxrX3N0YXRlLT50aHJlYWQtPmN1cnJlbnRfc3luY19sZXZlbCA+IG9ial9kZXNjLT5tdXRleC5zeW5jX2xldmVsKSB7Ci0JCUFDUElfRVJST1IoKEFFX0lORk8sCi0JCQkgICAgIkNhbm5vdCBhY3F1aXJlIE11dGV4IFslNC40c10sIGN1cnJlbnQgU3luY0xldmVsIGlzIHRvbyBsYXJnZSAoJWQpIiwKLQkJCSAgICBhY3BpX3V0X2dldF9ub2RlX25hbWUob2JqX2Rlc2MtPm11dGV4Lm5vZGUpLAotCQkJICAgIHdhbGtfc3RhdGUtPnRocmVhZC0+Y3VycmVudF9zeW5jX2xldmVsKSk7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfTVVURVhfT1JERVIpOwotCX0KLQotCXN0YXR1cyA9IGFjcGlfZXhfYWNxdWlyZV9tdXRleF9vYmplY3QoKHUxNikgdGltZV9kZXNjLT5pbnRlZ2VyLnZhbHVlLAotCQkJCQkgICAgICBvYmpfZGVzYywKLQkJCQkJICAgICAgd2Fsa19zdGF0ZS0+dGhyZWFkLT50aHJlYWRfaWQpOwotCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSAmJiBvYmpfZGVzYy0+bXV0ZXguYWNxdWlzaXRpb25fZGVwdGggPT0gMSkgewotCi0JCS8qIFNhdmUgVGhyZWFkIG9iamVjdCwgb3JpZ2luYWwvY3VycmVudCBzeW5jIGxldmVscyAqLwotCi0JCW9ial9kZXNjLT5tdXRleC5vd25lcl90aHJlYWQgPSB3YWxrX3N0YXRlLT50aHJlYWQ7Ci0JCW9ial9kZXNjLT5tdXRleC5vcmlnaW5hbF9zeW5jX2xldmVsID0KLQkJICAgIHdhbGtfc3RhdGUtPnRocmVhZC0+Y3VycmVudF9zeW5jX2xldmVsOwotCQl3YWxrX3N0YXRlLT50aHJlYWQtPmN1cnJlbnRfc3luY19sZXZlbCA9Ci0JCSAgICBvYmpfZGVzYy0+bXV0ZXguc3luY19sZXZlbDsKLQotCQkvKiBMaW5rIHRoZSBtdXRleCB0byB0aGUgY3VycmVudCB0aHJlYWQgZm9yIGZvcmNlLXVubG9jayBhdCBtZXRob2QgZXhpdCAqLwotCi0JCWFjcGlfZXhfbGlua19tdXRleChvYmpfZGVzYywgd2Fsa19zdGF0ZS0+dGhyZWFkKTsKLQl9Ci0KLQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9leF9yZWxlYXNlX211dGV4X29iamVjdAotICoKLSAqIFBBUkFNRVRFUlM6ICBvYmpfZGVzYyAgICAgICAgICAgIC0gVGhlIG9iamVjdCBkZXNjcmlwdG9yIGZvciB0aGlzIG9wCi0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cwotICoKLSAqIERFU0NSSVBUSU9OOiBSZWxlYXNlIGEgcHJldmlvdXNseSBhY3F1aXJlZCBNdXRleCwgbG93IGxldmVsIGludGVyZmFjZS4KLSAqICAgICAgICAgICAgICBQcm92aWRlcyBhIGNvbW1vbiBwYXRoIHRoYXQgc3VwcG9ydHMgbXVsdGlwbGUgcmVsZWFzZXMgKGFmdGVyCi0gKiAgICAgICAgICAgICAgcHJldmlvdXMgbXVsdGlwbGUgYWNxdWlyZXMpIGJ5IHRoZSBzYW1lIHRocmVhZC4KLSAqCi0gKiBNVVRFWDogICAgICAgSW50ZXJwcmV0ZXIgbXVzdCBiZSBsb2NrZWQKLSAqCi0gKiBOT1RFOiBUaGlzIGludGVyZmFjZSBpcyBjYWxsZWQgZnJvbSB0aHJlZSBwbGFjZXM6Ci0gKiAxKSBGcm9tIGFjcGlfZXhfcmVsZWFzZV9tdXRleCwgdmlhIGFuIEFNTCBBY3F1aXJlKCkgb3BlcmF0b3IKLSAqIDIpIEZyb20gYWNwaV9leF9yZWxlYXNlX2dsb2JhbF9sb2NrIHdoZW4gYW4gQU1MIEZpZWxkIGFjY2VzcyByZXF1aXJlcyB0aGUKLSAqICAgIGdsb2JhbCBsb2NrCi0gKiAzKSBGcm9tIHRoZSBleHRlcm5hbCBpbnRlcmZhY2UsIGFjcGlfcmVsZWFzZV9nbG9iYWxfbG9jawotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWFjcGlfc3RhdHVzIGFjcGlfZXhfcmVsZWFzZV9tdXRleF9vYmplY3QodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2MpCi17Ci0JYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGV4X3JlbGVhc2VfbXV0ZXhfb2JqZWN0KTsKLQotCWlmIChvYmpfZGVzYy0+bXV0ZXguYWNxdWlzaXRpb25fZGVwdGggPT0gMCkgewotCQlyZXR1cm4gKEFFX05PVF9BQ1FVSVJFRCk7Ci0JfQotCi0JLyogTWF0Y2ggbXVsdGlwbGUgQWNxdWlyZXMgd2l0aCBtdWx0aXBsZSBSZWxlYXNlcyAqLwotCi0Jb2JqX2Rlc2MtPm11dGV4LmFjcXVpc2l0aW9uX2RlcHRoLS07Ci0JaWYgKG9ial9kZXNjLT5tdXRleC5hY3F1aXNpdGlvbl9kZXB0aCAhPSAwKSB7Ci0KLQkJLyogSnVzdCBkZWNyZW1lbnQgdGhlIGRlcHRoIGFuZCByZXR1cm4gKi8KLQotCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwotCX0KLQotCWlmIChvYmpfZGVzYy0+bXV0ZXgub3duZXJfdGhyZWFkKSB7Ci0KLQkJLyogVW5saW5rIHRoZSBtdXRleCBmcm9tIHRoZSBvd25lcidzIGxpc3QgKi8KLQotCQlhY3BpX2V4X3VubGlua19tdXRleChvYmpfZGVzYyk7Ci0JCW9ial9kZXNjLT5tdXRleC5vd25lcl90aHJlYWQgPSBOVUxMOwotCX0KLQotCS8qIFJlbGVhc2UgdGhlIG11dGV4LCBzcGVjaWFsIGNhc2UgZm9yIEdsb2JhbCBMb2NrICovCi0KLQlpZiAob2JqX2Rlc2MgPT0gYWNwaV9nYmxfZ2xvYmFsX2xvY2tfbXV0ZXgpIHsKLQkJc3RhdHVzID0gYWNwaV9ldl9yZWxlYXNlX2dsb2JhbF9sb2NrKCk7Ci0JfSBlbHNlIHsKLQkJYWNwaV9vc19yZWxlYXNlX211dGV4KG9ial9kZXNjLT5tdXRleC5vc19tdXRleCk7Ci0JfQotCi0JLyogQ2xlYXIgbXV0ZXggaW5mbyAqLwotCi0Jb2JqX2Rlc2MtPm11dGV4LnRocmVhZF9pZCA9IE5VTEw7Ci0JcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfZXhfcmVsZWFzZV9tdXRleAotICoKLSAqIFBBUkFNRVRFUlM6ICBvYmpfZGVzYyAgICAgICAgICAgIC0gVGhlIG9iamVjdCBkZXNjcmlwdG9yIGZvciB0aGlzIG9wCi0gKiAgICAgICAgICAgICAgd2Fsa19zdGF0ZSAgICAgICAgICAtIEN1cnJlbnQgbWV0aG9kIGV4ZWN1dGlvbiBzdGF0ZQotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKLSAqCi0gKiBERVNDUklQVElPTjogUmVsZWFzZSBhIHByZXZpb3VzbHkgYWNxdWlyZWQgTXV0ZXguCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotYWNwaV9zdGF0dXMKLWFjcGlfZXhfcmVsZWFzZV9tdXRleCh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYywKLQkJICAgICAgc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSkKLXsKLQlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UoZXhfcmVsZWFzZV9tdXRleCk7Ci0KLQlpZiAoIW9ial9kZXNjKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfUEFSQU1FVEVSKTsKLQl9Ci0KLQkvKiBUaGUgbXV0ZXggbXVzdCBoYXZlIGJlZW4gcHJldmlvdXNseSBhY3F1aXJlZCBpbiBvcmRlciB0byByZWxlYXNlIGl0ICovCi0KLQlpZiAoIW9ial9kZXNjLT5tdXRleC5vd25lcl90aHJlYWQpIHsKLQkJQUNQSV9FUlJPUigoQUVfSU5GTywKLQkJCSAgICAiQ2Fubm90IHJlbGVhc2UgTXV0ZXggWyU0LjRzXSwgbm90IGFjcXVpcmVkIiwKLQkJCSAgICBhY3BpX3V0X2dldF9ub2RlX25hbWUob2JqX2Rlc2MtPm11dGV4Lm5vZGUpKSk7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfTVVURVhfTk9UX0FDUVVJUkVEKTsKLQl9Ci0KLQkvKgotCSAqIFRoZSBNdXRleCBpcyBvd25lZCwgYnV0IHRoaXMgdGhyZWFkIG11c3QgYmUgdGhlIG93bmVyLgotCSAqIFNwZWNpYWwgY2FzZSBmb3IgR2xvYmFsIExvY2ssIGFueSB0aHJlYWQgY2FuIHJlbGVhc2UKLQkgKi8KLQlpZiAoKG9ial9kZXNjLT5tdXRleC5vd25lcl90aHJlYWQtPnRocmVhZF9pZCAhPQotCSAgICAgd2Fsa19zdGF0ZS0+dGhyZWFkLT50aHJlYWRfaWQpCi0JICAgICYmIChvYmpfZGVzYyAhPSBhY3BpX2dibF9nbG9iYWxfbG9ja19tdXRleCkpIHsKLQkJQUNQSV9FUlJPUigoQUVfSU5GTywKLQkJCSAgICAiVGhyZWFkICVsWCBjYW5ub3QgcmVsZWFzZSBNdXRleCBbJTQuNHNdIGFjcXVpcmVkIGJ5IHRocmVhZCAlbFgiLAotCQkJICAgICh1bnNpZ25lZCBsb25nKXdhbGtfc3RhdGUtPnRocmVhZC0+dGhyZWFkX2lkLAotCQkJICAgIGFjcGlfdXRfZ2V0X25vZGVfbmFtZShvYmpfZGVzYy0+bXV0ZXgubm9kZSksCi0JCQkgICAgKHVuc2lnbmVkIGxvbmcpb2JqX2Rlc2MtPm11dGV4Lm93bmVyX3RocmVhZC0+Ci0JCQkgICAgdGhyZWFkX2lkKSk7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfTk9UX09XTkVSKTsKLQl9Ci0KLQkvKiBNdXN0IGhhdmUgYSB2YWxpZCB0aHJlYWQgSUQgKi8KLQotCWlmICghd2Fsa19zdGF0ZS0+dGhyZWFkKSB7Ci0JCUFDUElfRVJST1IoKEFFX0lORk8sCi0JCQkgICAgIkNhbm5vdCByZWxlYXNlIE11dGV4IFslNC40c10sIG51bGwgdGhyZWFkIGluZm8iLAotCQkJICAgIGFjcGlfdXRfZ2V0X25vZGVfbmFtZShvYmpfZGVzYy0+bXV0ZXgubm9kZSkpKTsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9JTlRFUk5BTCk7Ci0JfQotCi0JLyoKLQkgKiBUaGUgc3luYyBsZXZlbCBvZiB0aGUgbXV0ZXggbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIGN1cnJlbnQKLQkgKiBzeW5jIGxldmVsCi0JICovCi0JaWYgKG9ial9kZXNjLT5tdXRleC5zeW5jX2xldmVsID4gd2Fsa19zdGF0ZS0+dGhyZWFkLT5jdXJyZW50X3N5bmNfbGV2ZWwpIHsKLQkJQUNQSV9FUlJPUigoQUVfSU5GTywKLQkJCSAgICAiQ2Fubm90IHJlbGVhc2UgTXV0ZXggWyU0LjRzXSwgU3luY0xldmVsIG1pc21hdGNoOiBtdXRleCAlZCBjdXJyZW50ICVkIiwKLQkJCSAgICBhY3BpX3V0X2dldF9ub2RlX25hbWUob2JqX2Rlc2MtPm11dGV4Lm5vZGUpLAotCQkJICAgIG9ial9kZXNjLT5tdXRleC5zeW5jX2xldmVsLAotCQkJICAgIHdhbGtfc3RhdGUtPnRocmVhZC0+Y3VycmVudF9zeW5jX2xldmVsKSk7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfTVVURVhfT1JERVIpOwotCX0KLQotCXN0YXR1cyA9IGFjcGlfZXhfcmVsZWFzZV9tdXRleF9vYmplY3Qob2JqX2Rlc2MpOwotCi0JaWYgKG9ial9kZXNjLT5tdXRleC5hY3F1aXNpdGlvbl9kZXB0aCA9PSAwKSB7Ci0KLQkJLyogUmVzdG9yZSB0aGUgb3JpZ2luYWwgc3luY19sZXZlbCAqLwotCi0JCXdhbGtfc3RhdGUtPnRocmVhZC0+Y3VycmVudF9zeW5jX2xldmVsID0KLQkJICAgIG9ial9kZXNjLT5tdXRleC5vcmlnaW5hbF9zeW5jX2xldmVsOwotCX0KLQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9leF9yZWxlYXNlX2FsbF9tdXRleGVzCi0gKgotICogUEFSQU1FVEVSUzogIFRocmVhZCAgICAgICAgICAtIEN1cnJlbnQgZXhlY3V0aW5nIHRocmVhZCBvYmplY3QKLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IFJlbGVhc2UgYWxsIG11dGV4ZXMgaGVsZCBieSB0aGlzIHRocmVhZAotICoKLSAqIE5PVEU6IFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGFzIHRoZSB0aHJlYWQgaXMgZXhpdGluZyB0aGUgaW50ZXJwcmV0ZXIuCi0gKiBNdXRleGVzIGFyZSBub3QgcmVsZWFzZWQgd2hlbiBhbiBpbmRpdmlkdWFsIGNvbnRyb2wgbWV0aG9kIGlzIGV4aXRlZCwgYnV0Ci0gKiBvbmx5IHdoZW4gdGhlIHBhcmVudCB0aHJlYWQgYWN0dWFsbHkgZXhpdHMgdGhlIGludGVycHJldGVyLiBUaGlzIGFsbG93cyBvbmUKLSAqIG1ldGhvZCB0byBhY3F1aXJlIGEgbXV0ZXgsIGFuZCBhIGRpZmZlcmVudCBtZXRob2QgdG8gcmVsZWFzZSBpdCwgYXMgbG9uZyBhcwotICogdGhpcyBpcyBwZXJmb3JtZWQgdW5kZXJuZWF0aCBhIHNpbmdsZSBwYXJlbnQgY29udHJvbCBtZXRob2QuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdm9pZCBhY3BpX2V4X3JlbGVhc2VfYWxsX211dGV4ZXMoc3RydWN0IGFjcGlfdGhyZWFkX3N0YXRlICp0aHJlYWQpCi17Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqbmV4dCA9IHRocmVhZC0+YWNxdWlyZWRfbXV0ZXhfbGlzdDsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYzsKLQotCUFDUElfRlVOQ1RJT05fRU5UUlkoKTsKLQotCS8qIFRyYXZlcnNlIHRoZSBsaXN0IG9mIG93bmVkIG11dGV4ZXMsIHJlbGVhc2luZyBlYWNoIG9uZSAqLwotCi0Jd2hpbGUgKG5leHQpIHsKLQkJb2JqX2Rlc2MgPSBuZXh0OwotCQluZXh0ID0gb2JqX2Rlc2MtPm11dGV4Lm5leHQ7Ci0KLQkJb2JqX2Rlc2MtPm11dGV4LnByZXYgPSBOVUxMOwotCQlvYmpfZGVzYy0+bXV0ZXgubmV4dCA9IE5VTEw7Ci0JCW9ial9kZXNjLT5tdXRleC5hY3F1aXNpdGlvbl9kZXB0aCA9IDA7Ci0KLQkJLyogUmVsZWFzZSB0aGUgbXV0ZXgsIHNwZWNpYWwgY2FzZSBmb3IgR2xvYmFsIExvY2sgKi8KLQotCQlpZiAob2JqX2Rlc2MgPT0gYWNwaV9nYmxfZ2xvYmFsX2xvY2tfbXV0ZXgpIHsKLQotCQkJLyogSWdub3JlIGVycm9ycyAqLwotCi0JCQkodm9pZClhY3BpX2V2X3JlbGVhc2VfZ2xvYmFsX2xvY2soKTsKLQkJfSBlbHNlIHsKLQkJCWFjcGlfb3NfcmVsZWFzZV9tdXRleChvYmpfZGVzYy0+bXV0ZXgub3NfbXV0ZXgpOwotCQl9Ci0KLQkJLyogTWFyayBtdXRleCB1bm93bmVkICovCi0KLQkJb2JqX2Rlc2MtPm11dGV4Lm93bmVyX3RocmVhZCA9IE5VTEw7Ci0JCW9ial9kZXNjLT5tdXRleC50aHJlYWRfaWQgPSBOVUxMOwotCi0JCS8qIFVwZGF0ZSBUaHJlYWQgc3luY19sZXZlbCAoTGFzdCBtdXRleCBpcyB0aGUgaW1wb3J0YW50IG9uZSkgKi8KLQotCQl0aHJlYWQtPmN1cnJlbnRfc3luY19sZXZlbCA9Ci0JCSAgICBvYmpfZGVzYy0+bXV0ZXgub3JpZ2luYWxfc3luY19sZXZlbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhuYW1lcy5jIGIvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4bmFtZXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODE3ZTY3Yi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhuYW1lcy5jCisrKyAvZGV2L251bGwKQEAgLTEsNDM1ICswLDAgQEAKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIE1vZHVsZSBOYW1lOiBleG5hbWVzIC0gaW50ZXJwcmV0ZXIvc2Nhbm5lciBuYW1lIGxvYWQvZXhlY3V0ZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDgsIEludGVsIENvcnAuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCi0gKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSBhdCBtaW5pbXVtIGEgZGlzY2xhaW1lcgotICogICAgc3Vic3RhbnRpYWxseSBzaW1pbGFyIHRvIHRoZSAiTk8gV0FSUkFOVFkiIGRpc2NsYWltZXIgYmVsb3cKLSAqICAgICgiRGlzY2xhaW1lciIpIGFuZCBhbnkgcmVkaXN0cmlidXRpb24gbXVzdCBiZSBjb25kaXRpb25lZCB1cG9uCi0gKiAgICBpbmNsdWRpbmcgYSBzdWJzdGFudGlhbGx5IHNpbWlsYXIgRGlzY2xhaW1lciByZXF1aXJlbWVudCBmb3IgZnVydGhlcgotICogICAgYmluYXJ5IHJlZGlzdHJpYnV0aW9uLgotICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzCi0gKiAgICBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIE5PIFdBUlJBTlRZCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKLSAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCi0gKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORwotICogSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCi0gKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCi0gKi8KLQotI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgotI2luY2x1ZGUgPGFjcGkvYWNpbnRlcnAuaD4KLSNpbmNsdWRlIDxhY3BpL2FtbGNvZGUuaD4KLQotI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfRVhFQ1VURVIKLUFDUElfTU9EVUxFX05BTUUoImV4bmFtZXMiKQotCi0vKiBMb2NhbCBwcm90b3R5cGVzICovCi1zdGF0aWMgY2hhciAqYWNwaV9leF9hbGxvY2F0ZV9uYW1lX3N0cmluZyh1MzIgcHJlZml4X2NvdW50LCB1MzIgbnVtX25hbWVfc2Vncyk7Ci0KLXN0YXRpYyBhY3BpX3N0YXR1cwotYWNwaV9leF9uYW1lX3NlZ21lbnQodTggKiogaW5fYW1sX2FkZHJlc3MsIGNoYXIgKm5hbWVfc3RyaW5nKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9leF9hbGxvY2F0ZV9uYW1lX3N0cmluZwotICoKLSAqIFBBUkFNRVRFUlM6ICBwcmVmaXhfY291bnQgICAgICAgIC0gQ291bnQgb2YgcGFyZW50IGxldmVscy4gU3BlY2lhbCBjYXNlczoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0xKT09cm9vdCwgIDA9PW5vbmUKLSAqICAgICAgICAgICAgICBudW1fbmFtZV9zZWdzICAgICAgIC0gY291bnQgb2YgNC1jaGFyYWN0ZXIgbmFtZSBzZWdtZW50cwotICoKLSAqIFJFVFVSTjogICAgICBBIHBvaW50ZXIgdG8gdGhlIGFsbG9jYXRlZCBzdHJpbmcgc2VnbWVudC4gIFRoaXMgc2VnbWVudCBtdXN0Ci0gKiAgICAgICAgICAgICAgYmUgZGVsZXRlZCBieSB0aGUgY2FsbGVyLgotICoKLSAqIERFU0NSSVBUSU9OOiBBbGxvY2F0ZSBhIGJ1ZmZlciBmb3IgYSBuYW1lIHN0cmluZy4gRW5zdXJlIGFsbG9jYXRlZCBuYW1lCi0gKiAgICAgICAgICAgICAgc3RyaW5nIGlzIGxvbmcgZW5vdWdoLCBhbmQgc2V0IHVwIHByZWZpeCBpZiBhbnkuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIGNoYXIgKmFjcGlfZXhfYWxsb2NhdGVfbmFtZV9zdHJpbmcodTMyIHByZWZpeF9jb3VudCwgdTMyIG51bV9uYW1lX3NlZ3MpCi17Ci0JY2hhciAqdGVtcF9wdHI7Ci0JY2hhciAqbmFtZV9zdHJpbmc7Ci0JdTMyIHNpemVfbmVlZGVkOwotCi0JQUNQSV9GVU5DVElPTl9UUkFDRShleF9hbGxvY2F0ZV9uYW1lX3N0cmluZyk7Ci0KLQkvKgotCSAqIEFsbG93IHJvb20gZm9yIGFsbCBcIGFuZCBeIHByZWZpeGVzLCBhbGwgc2VnbWVudHMgYW5kIGEgbXVsdGlfbmFtZV9wcmVmaXguCi0JICogQWxzbywgb25lIGJ5dGUgZm9yIHRoZSBudWxsIHRlcm1pbmF0b3IuCi0JICogVGhpcyBtYXkgYWN0dWFsbHkgYmUgc29tZXdoYXQgbG9uZ2VyIHRoYW4gbmVlZGVkLgotCSAqLwotCWlmIChwcmVmaXhfY291bnQgPT0gQUNQSV9VSU5UMzJfTUFYKSB7Ci0KLQkJLyogU3BlY2lhbCBjYXNlIGZvciByb290ICovCi0KLQkJc2l6ZV9uZWVkZWQgPSAxICsgKEFDUElfTkFNRV9TSVpFICogbnVtX25hbWVfc2VncykgKyAyICsgMTsKLQl9IGVsc2UgewotCQlzaXplX25lZWRlZCA9Ci0JCSAgICBwcmVmaXhfY291bnQgKyAoQUNQSV9OQU1FX1NJWkUgKiBudW1fbmFtZV9zZWdzKSArIDIgKyAxOwotCX0KLQotCS8qCi0JICogQWxsb2NhdGUgYSBidWZmZXIgZm9yIHRoZSBuYW1lLgotCSAqIFRoaXMgYnVmZmVyIG11c3QgYmUgZGVsZXRlZCBieSB0aGUgY2FsbGVyIQotCSAqLwotCW5hbWVfc3RyaW5nID0gQUNQSV9BTExPQ0FURShzaXplX25lZWRlZCk7Ci0JaWYgKCFuYW1lX3N0cmluZykgewotCQlBQ1BJX0VSUk9SKChBRV9JTkZPLAotCQkJICAgICJDb3VsZCBub3QgYWxsb2NhdGUgc2l6ZSAlZCIsIHNpemVfbmVlZGVkKSk7Ci0JCXJldHVybl9QVFIoTlVMTCk7Ci0JfQotCi0JdGVtcF9wdHIgPSBuYW1lX3N0cmluZzsKLQotCS8qIFNldCB1cCBSb290IG9yIFBhcmVudCBwcmVmaXhlcyBpZiBuZWVkZWQgKi8KLQotCWlmIChwcmVmaXhfY291bnQgPT0gQUNQSV9VSU5UMzJfTUFYKSB7Ci0JCSp0ZW1wX3B0cisrID0gQU1MX1JPT1RfUFJFRklYOwotCX0gZWxzZSB7Ci0JCXdoaWxlIChwcmVmaXhfY291bnQtLSkgewotCQkJKnRlbXBfcHRyKysgPSBBTUxfUEFSRU5UX1BSRUZJWDsKLQkJfQotCX0KLQotCS8qIFNldCB1cCBEdWFsIG9yIE11bHRpIHByZWZpeGVzIGlmIG5lZWRlZCAqLwotCi0JaWYgKG51bV9uYW1lX3NlZ3MgPiAyKSB7Ci0KLQkJLyogU2V0IHVwIG11bHRpIHByZWZpeGVzICAgKi8KLQotCQkqdGVtcF9wdHIrKyA9IEFNTF9NVUxUSV9OQU1FX1BSRUZJWF9PUDsKLQkJKnRlbXBfcHRyKysgPSAoY2hhciludW1fbmFtZV9zZWdzOwotCX0gZWxzZSBpZiAoMiA9PSBudW1fbmFtZV9zZWdzKSB7Ci0KLQkJLyogU2V0IHVwIGR1YWwgcHJlZml4ZXMgKi8KLQotCQkqdGVtcF9wdHIrKyA9IEFNTF9EVUFMX05BTUVfUFJFRklYOwotCX0KLQotCS8qCi0JICogVGVybWluYXRlIHN0cmluZyBmb2xsb3dpbmcgcHJlZml4ZXMuIGFjcGlfZXhfbmFtZV9zZWdtZW50KCkgd2lsbAotCSAqIGFwcGVuZCB0aGUgc2VnbWVudChzKQotCSAqLwotCSp0ZW1wX3B0ciA9IDA7Ci0KLQlyZXR1cm5fUFRSKG5hbWVfc3RyaW5nKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9leF9uYW1lX3NlZ21lbnQKLSAqCi0gKiBQQVJBTUVURVJTOiAgaW5fYW1sX2FkZHJlc3MgIC0gUG9pbnRlciB0byB0aGUgbmFtZSBpbiB0aGUgQU1MIGNvZGUKLSAqICAgICAgICAgICAgICBuYW1lX3N0cmluZyAgICAgLSBXaGVyZSB0byByZXR1cm4gdGhlIG5hbWUuIFRoZSBuYW1lIGlzIGFwcGVuZGVkCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYW55IGV4aXN0aW5nIHN0cmluZyB0byBmb3JtIGEgbmFtZXBhdGgKLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IEV4dHJhY3QgYW4gQUNQSSBuYW1lICg0IGJ5dGVzKSBmcm9tIHRoZSBBTUwgYnl0ZSBzdHJlYW0KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgYWNwaV9zdGF0dXMgYWNwaV9leF9uYW1lX3NlZ21lbnQodTggKiogaW5fYW1sX2FkZHJlc3MsIGNoYXIgKm5hbWVfc3RyaW5nKQotewotCWNoYXIgKmFtbF9hZGRyZXNzID0gKHZvaWQgKikqaW5fYW1sX2FkZHJlc3M7Ci0JYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7Ci0JdTMyIGluZGV4OwotCWNoYXIgY2hhcl9idWZbNV07Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGV4X25hbWVfc2VnbWVudCk7Ci0KLQkvKgotCSAqIElmIGZpcnN0IGNoYXJhY3RlciBpcyBhIGRpZ2l0LCB0aGVuIHdlIGtub3cgdGhhdCB3ZSBhcmVuJ3QgbG9va2luZyBhdCBhCi0JICogdmFsaWQgbmFtZSBzZWdtZW50Ci0JICovCi0JY2hhcl9idWZbMF0gPSAqYW1sX2FkZHJlc3M7Ci0KLQlpZiAoJzAnIDw9IGNoYXJfYnVmWzBdICYmIGNoYXJfYnVmWzBdIDw9ICc5JykgewotCQlBQ1BJX0VSUk9SKChBRV9JTkZPLCAiSW52YWxpZCBsZWFkaW5nIGRpZ2l0OiAlYyIsIGNoYXJfYnVmWzBdKSk7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9DVFJMX1BFTkRJTkcpOwotCX0KLQotCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfTE9BRCwgIkJ5dGVzIGZyb20gc3RyZWFtOlxuIikpOwotCi0JZm9yIChpbmRleCA9IDA7IChpbmRleCA8IEFDUElfTkFNRV9TSVpFKQotCSAgICAgJiYgKGFjcGlfdXRfdmFsaWRfYWNwaV9jaGFyKCphbWxfYWRkcmVzcywgMCkpOyBpbmRleCsrKSB7Ci0JCWNoYXJfYnVmW2luZGV4XSA9ICphbWxfYWRkcmVzcysrOwotCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0xPQUQsICIlY1xuIiwgY2hhcl9idWZbaW5kZXhdKSk7Ci0JfQotCi0JLyogVmFsaWQgbmFtZSBzZWdtZW50ICAqLwotCi0JaWYgKGluZGV4ID09IDQpIHsKLQotCQkvKiBGb3VuZCA0IHZhbGlkIGNoYXJhY3RlcnMgKi8KLQotCQljaGFyX2J1Zls0XSA9ICdcMCc7Ci0KLQkJaWYgKG5hbWVfc3RyaW5nKSB7Ci0JCQlBQ1BJX1NUUkNBVChuYW1lX3N0cmluZywgY2hhcl9idWYpOwotCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9OQU1FUywKLQkJCQkJICAiQXBwZW5kZWQgdG8gLSAlc1xuIiwgbmFtZV9zdHJpbmcpKTsKLQkJfSBlbHNlIHsKLQkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfTkFNRVMsCi0JCQkJCSAgIk5vIE5hbWUgc3RyaW5nIC0gJXNcbiIsIGNoYXJfYnVmKSk7Ci0JCX0KLQl9IGVsc2UgaWYgKGluZGV4ID09IDApIHsKLQkJLyoKLQkJICogRmlyc3QgY2hhcmFjdGVyIHdhcyBub3QgYSB2YWxpZCBuYW1lIGNoYXJhY3RlciwKLQkJICogc28gd2UgYXJlIGxvb2tpbmcgYXQgc29tZXRoaW5nIG90aGVyIHRoYW4gYSBuYW1lLgotCQkgKi8KLQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLAotCQkJCSAgIkxlYWRpbmcgY2hhcmFjdGVyIGlzIG5vdCBhbHBoYTogJTAyWGggKG5vdCBhIG5hbWUpXG4iLAotCQkJCSAgY2hhcl9idWZbMF0pKTsKLQkJc3RhdHVzID0gQUVfQ1RSTF9QRU5ESU5HOwotCX0gZWxzZSB7Ci0JCS8qCi0JCSAqIFNlZ21lbnQgc3RhcnRlZCB3aXRoIG9uZSBvciBtb3JlIHZhbGlkIGNoYXJhY3RlcnMsIGJ1dCBmZXdlciB0aGFuCi0JCSAqIHRoZSByZXF1aXJlZCA0Ci0JCSAqLwotCQlzdGF0dXMgPSBBRV9BTUxfQkFEX05BTUU7Ci0JCUFDUElfRVJST1IoKEFFX0lORk8sCi0JCQkgICAgIkJhZCBjaGFyYWN0ZXIgJTAyeCBpbiBuYW1lLCBhdCAlcCIsCi0JCQkgICAgKmFtbF9hZGRyZXNzLCBhbWxfYWRkcmVzcykpOwotCX0KLQotCSppbl9hbWxfYWRkcmVzcyA9IEFDUElfQ0FTVF9QVFIodTgsIGFtbF9hZGRyZXNzKTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9leF9nZXRfbmFtZV9zdHJpbmcKLSAqCi0gKiBQQVJBTUVURVJTOiAgZGF0YV90eXBlICAgICAgICAgICAtIE9iamVjdCB0eXBlIHRvIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGlzCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUKLSAqICAgICAgICAgICAgICBpbl9hbWxfYWRkcmVzcyAgICAgIC0gUG9pbnRlciB0byB0aGUgbmFtZXN0cmluZyBpbiB0aGUgQU1MIGNvZGUKLSAqICAgICAgICAgICAgICBvdXRfbmFtZV9zdHJpbmcgICAgIC0gV2hlcmUgdGhlIG5hbWVzdHJpbmcgaXMgcmV0dXJuZWQKLSAqICAgICAgICAgICAgICBvdXRfbmFtZV9sZW5ndGggICAgIC0gTGVuZ3RoIG9mIHRoZSByZXR1cm5lZCBzdHJpbmcKLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzLCBuYW1lc3RyaW5nIGFuZCBsZW5ndGgKLSAqCi0gKiBERVNDUklQVElPTjogRXh0cmFjdCBhIGZ1bGwgbmFtZXBhdGggZnJvbSB0aGUgQU1MIGJ5dGUgc3RyZWFtLAotICogICAgICAgICAgICAgIGluY2x1ZGluZyBhbnkgcHJlZml4ZXMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotYWNwaV9zdGF0dXMKLWFjcGlfZXhfZ2V0X25hbWVfc3RyaW5nKGFjcGlfb2JqZWN0X3R5cGUgZGF0YV90eXBlLAotCQkJdTggKiBpbl9hbWxfYWRkcmVzcywKLQkJCWNoYXIgKipvdXRfbmFtZV9zdHJpbmcsIHUzMiAqIG91dF9uYW1lX2xlbmd0aCkKLXsKLQlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKLQl1OCAqYW1sX2FkZHJlc3MgPSBpbl9hbWxfYWRkcmVzczsKLQljaGFyICpuYW1lX3N0cmluZyA9IE5VTEw7Ci0JdTMyIG51bV9zZWdtZW50czsKLQl1MzIgcHJlZml4X2NvdW50ID0gMDsKLQl1OCBoYXNfcHJlZml4ID0gRkFMU0U7Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUihleF9nZXRfbmFtZV9zdHJpbmcsIGFtbF9hZGRyZXNzKTsKLQotCWlmIChBQ1BJX1RZUEVfTE9DQUxfUkVHSU9OX0ZJRUxEID09IGRhdGFfdHlwZSB8fAotCSAgICBBQ1BJX1RZUEVfTE9DQUxfQkFOS19GSUVMRCA9PSBkYXRhX3R5cGUgfHwKLQkgICAgQUNQSV9UWVBFX0xPQ0FMX0lOREVYX0ZJRUxEID09IGRhdGFfdHlwZSkgewotCi0JCS8qIERpc2FsbG93IHByZWZpeGVzIGZvciB0eXBlcyBhc3NvY2lhdGVkIHdpdGggZmllbGRfdW5pdCBuYW1lcyAqLwotCi0JCW5hbWVfc3RyaW5nID0gYWNwaV9leF9hbGxvY2F0ZV9uYW1lX3N0cmluZygwLCAxKTsKLQkJaWYgKCFuYW1lX3N0cmluZykgewotCQkJc3RhdHVzID0gQUVfTk9fTUVNT1JZOwotCQl9IGVsc2UgewotCQkJc3RhdHVzID0KLQkJCSAgICBhY3BpX2V4X25hbWVfc2VnbWVudCgmYW1sX2FkZHJlc3MsIG5hbWVfc3RyaW5nKTsKLQkJfQotCX0gZWxzZSB7Ci0JCS8qCi0JCSAqIGRhdGFfdHlwZSBpcyBub3QgYSBmaWVsZCBuYW1lLgotCQkgKiBFeGFtaW5lIGZpcnN0IGNoYXJhY3RlciBvZiBuYW1lIGZvciByb290IG9yIHBhcmVudCBwcmVmaXggb3BlcmF0b3JzCi0JCSAqLwotCQlzd2l0Y2ggKCphbWxfYWRkcmVzcykgewotCQljYXNlIEFNTF9ST09UX1BSRUZJWDoKLQotCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9MT0FELAotCQkJCQkgICJSb290UHJlZml4KFxcKSBhdCAlcFxuIiwKLQkJCQkJICBhbWxfYWRkcmVzcykpOwotCi0JCQkvKgotCQkJICogUmVtZW1iZXIgdGhhdCB3ZSBoYXZlIGEgcm9vdF9wcmVmaXggLS0KLQkJCSAqIHNlZSBjb21tZW50IGluIGFjcGlfZXhfYWxsb2NhdGVfbmFtZV9zdHJpbmcoKQotCQkJICovCi0JCQlhbWxfYWRkcmVzcysrOwotCQkJcHJlZml4X2NvdW50ID0gQUNQSV9VSU5UMzJfTUFYOwotCQkJaGFzX3ByZWZpeCA9IFRSVUU7Ci0JCQlicmVhazsKLQotCQljYXNlIEFNTF9QQVJFTlRfUFJFRklYOgotCi0JCQkvKiBJbmNyZW1lbnQgcGFzdCBwb3NzaWJseSBtdWx0aXBsZSBwYXJlbnQgcHJlZml4ZXMgKi8KLQotCQkJZG8gewotCQkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfTE9BRCwKLQkJCQkJCSAgIlBhcmVudFByZWZpeCAoXikgYXQgJXBcbiIsCi0JCQkJCQkgIGFtbF9hZGRyZXNzKSk7Ci0KLQkJCQlhbWxfYWRkcmVzcysrOwotCQkJCXByZWZpeF9jb3VudCsrOwotCi0JCQl9IHdoaWxlICgqYW1sX2FkZHJlc3MgPT0gQU1MX1BBUkVOVF9QUkVGSVgpOwotCi0JCQloYXNfcHJlZml4ID0gVFJVRTsKLQkJCWJyZWFrOwotCi0JCWRlZmF1bHQ6Ci0KLQkJCS8qIE5vdCBhIHByZWZpeCBjaGFyYWN0ZXIgKi8KLQotCQkJYnJlYWs7Ci0JCX0KLQotCQkvKiBFeGFtaW5lIGZpcnN0IGNoYXJhY3RlciBvZiBuYW1lIGZvciBuYW1lIHNlZ21lbnQgcHJlZml4IG9wZXJhdG9yICovCi0KLQkJc3dpdGNoICgqYW1sX2FkZHJlc3MpIHsKLQkJY2FzZSBBTUxfRFVBTF9OQU1FX1BSRUZJWDoKLQotCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9MT0FELAotCQkJCQkgICJEdWFsTmFtZVByZWZpeCBhdCAlcFxuIiwKLQkJCQkJICBhbWxfYWRkcmVzcykpOwotCi0JCQlhbWxfYWRkcmVzcysrOwotCQkJbmFtZV9zdHJpbmcgPQotCQkJICAgIGFjcGlfZXhfYWxsb2NhdGVfbmFtZV9zdHJpbmcocHJlZml4X2NvdW50LCAyKTsKLQkJCWlmICghbmFtZV9zdHJpbmcpIHsKLQkJCQlzdGF0dXMgPSBBRV9OT19NRU1PUlk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCS8qIEluZGljYXRlIHRoYXQgd2UgcHJvY2Vzc2VkIGEgcHJlZml4ICovCi0KLQkJCWhhc19wcmVmaXggPSBUUlVFOwotCi0JCQlzdGF0dXMgPQotCQkJICAgIGFjcGlfZXhfbmFtZV9zZWdtZW50KCZhbWxfYWRkcmVzcywgbmFtZV9zdHJpbmcpOwotCQkJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKSB7Ci0JCQkJc3RhdHVzID0KLQkJCQkgICAgYWNwaV9leF9uYW1lX3NlZ21lbnQoJmFtbF9hZGRyZXNzLAotCQkJCQkJCSBuYW1lX3N0cmluZyk7Ci0JCQl9Ci0JCQlicmVhazsKLQotCQljYXNlIEFNTF9NVUxUSV9OQU1FX1BSRUZJWF9PUDoKLQotCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9MT0FELAotCQkJCQkgICJNdWx0aU5hbWVQcmVmaXggYXQgJXBcbiIsCi0JCQkJCSAgYW1sX2FkZHJlc3MpKTsKLQotCQkJLyogRmV0Y2ggY291bnQgb2Ygc2VnbWVudHMgcmVtYWluaW5nIGluIG5hbWUgcGF0aCAqLwotCi0JCQlhbWxfYWRkcmVzcysrOwotCQkJbnVtX3NlZ21lbnRzID0gKmFtbF9hZGRyZXNzOwotCi0JCQluYW1lX3N0cmluZyA9Ci0JCQkgICAgYWNwaV9leF9hbGxvY2F0ZV9uYW1lX3N0cmluZyhwcmVmaXhfY291bnQsCi0JCQkJCQkJIG51bV9zZWdtZW50cyk7Ci0JCQlpZiAoIW5hbWVfc3RyaW5nKSB7Ci0JCQkJc3RhdHVzID0gQUVfTk9fTUVNT1JZOwotCQkJCWJyZWFrOwotCQkJfQotCi0JCQkvKiBJbmRpY2F0ZSB0aGF0IHdlIHByb2Nlc3NlZCBhIHByZWZpeCAqLwotCi0JCQlhbWxfYWRkcmVzcysrOwotCQkJaGFzX3ByZWZpeCA9IFRSVUU7Ci0KLQkJCXdoaWxlIChudW1fc2VnbWVudHMgJiYKLQkJCSAgICAgICAoc3RhdHVzID0KLQkJCQlhY3BpX2V4X25hbWVfc2VnbWVudCgmYW1sX2FkZHJlc3MsCi0JCQkJCQkgICAgIG5hbWVfc3RyaW5nKSkgPT0gQUVfT0spIHsKLQkJCQludW1fc2VnbWVudHMtLTsKLQkJCX0KLQotCQkJYnJlYWs7Ci0KLQkJY2FzZSAwOgotCi0JCQkvKiBudWxsX25hbWUgdmFsaWQgYXMgb2YgOC0xMi05OCBBU0wvQU1MIEdyYW1tYXIgVXBkYXRlICovCi0KLQkJCWlmIChwcmVmaXhfY291bnQgPT0gQUNQSV9VSU5UMzJfTUFYKSB7Ci0JCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FWEVDLAotCQkJCQkJICAiTmFtZVNlZyBpcyBcIlxcXCIgZm9sbG93ZWQgYnkgTlVMTFxuIikpOwotCQkJfQotCi0JCQkvKiBDb25zdW1lIHRoZSBOVUxMIGJ5dGUgKi8KLQotCQkJYW1sX2FkZHJlc3MrKzsKLQkJCW5hbWVfc3RyaW5nID0KLQkJCSAgICBhY3BpX2V4X2FsbG9jYXRlX25hbWVfc3RyaW5nKHByZWZpeF9jb3VudCwgMCk7Ci0JCQlpZiAoIW5hbWVfc3RyaW5nKSB7Ci0JCQkJc3RhdHVzID0gQUVfTk9fTUVNT1JZOwotCQkJCWJyZWFrOwotCQkJfQotCi0JCQlicmVhazsKLQotCQlkZWZhdWx0OgotCi0JCQkvKiBOYW1lIHNlZ21lbnQgc3RyaW5nICovCi0KLQkJCW5hbWVfc3RyaW5nID0KLQkJCSAgICBhY3BpX2V4X2FsbG9jYXRlX25hbWVfc3RyaW5nKHByZWZpeF9jb3VudCwgMSk7Ci0JCQlpZiAoIW5hbWVfc3RyaW5nKSB7Ci0JCQkJc3RhdHVzID0gQUVfTk9fTUVNT1JZOwotCQkJCWJyZWFrOwotCQkJfQotCi0JCQlzdGF0dXMgPQotCQkJICAgIGFjcGlfZXhfbmFtZV9zZWdtZW50KCZhbWxfYWRkcmVzcywgbmFtZV9zdHJpbmcpOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQlpZiAoQUVfQ1RSTF9QRU5ESU5HID09IHN0YXR1cyAmJiBoYXNfcHJlZml4KSB7Ci0KLQkJLyogUmFuIG91dCBvZiBzZWdtZW50cyBhZnRlciBwcm9jZXNzaW5nIGEgcHJlZml4ICovCi0KLQkJQUNQSV9FUlJPUigoQUVfSU5GTywgIk1hbGZvcm1lZCBOYW1lIGF0ICVwIiwgbmFtZV9zdHJpbmcpKTsKLQkJc3RhdHVzID0gQUVfQU1MX0JBRF9OQU1FOwotCX0KLQotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlpZiAobmFtZV9zdHJpbmcpIHsKLQkJCUFDUElfRlJFRShuYW1lX3N0cmluZyk7Ci0JCX0KLQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci0JfQotCi0JKm91dF9uYW1lX3N0cmluZyA9IG5hbWVfc3RyaW5nOwotCSpvdXRfbmFtZV9sZW5ndGggPSAodTMyKSAoYW1sX2FkZHJlc3MgLSBpbl9hbWxfYWRkcmVzcyk7Ci0KLQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leG9wYXJnMS5jIGIvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4b3BhcmcxLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2MjJmOWUuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4b3BhcmcxLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQ5ICswLDAgQEAKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIE1vZHVsZSBOYW1lOiBleG9wYXJnMSAtIEFNTCBleGVjdXRpb24gLSBvcGNvZGVzIHdpdGggMSBhcmd1bWVudAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDgsIEludGVsIENvcnAuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCi0gKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSBhdCBtaW5pbXVtIGEgZGlzY2xhaW1lcgotICogICAgc3Vic3RhbnRpYWxseSBzaW1pbGFyIHRvIHRoZSAiTk8gV0FSUkFOVFkiIGRpc2NsYWltZXIgYmVsb3cKLSAqICAgICgiRGlzY2xhaW1lciIpIGFuZCBhbnkgcmVkaXN0cmlidXRpb24gbXVzdCBiZSBjb25kaXRpb25lZCB1cG9uCi0gKiAgICBpbmNsdWRpbmcgYSBzdWJzdGFudGlhbGx5IHNpbWlsYXIgRGlzY2xhaW1lciByZXF1aXJlbWVudCBmb3IgZnVydGhlcgotICogICAgYmluYXJ5IHJlZGlzdHJpYnV0aW9uLgotICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzCi0gKiAgICBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIE5PIFdBUlJBTlRZCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKLSAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCi0gKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORwotICogSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCi0gKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCi0gKi8KLQotI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgotI2luY2x1ZGUgPGFjcGkvYWNwYXJzZXIuaD4KLSNpbmNsdWRlIDxhY3BpL2FjZGlzcGF0Lmg+Ci0jaW5jbHVkZSA8YWNwaS9hY2ludGVycC5oPgotI2luY2x1ZGUgPGFjcGkvYW1sY29kZS5oPgotI2luY2x1ZGUgPGFjcGkvYWNuYW1lc3AuaD4KLQotI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfRVhFQ1VURVIKLUFDUElfTU9EVUxFX05BTUUoImV4b3BhcmcxIikKLQotLyohCi0gKiBOYW1pbmcgY29udmVudGlvbiBmb3IgQU1MIGludGVycHJldGVyIGV4ZWN1dGlvbiByb3V0aW5lcy4KLSAqCi0gKiBUaGUgcm91dGluZXMgdGhhdCBiZWdpbiBleGVjdXRpb24gb2YgQU1MIG9wY29kZXMgYXJlIG5hbWVkIHdpdGggYSBjb21tb24KLSAqIGNvbnZlbnRpb24gYmFzZWQgdXBvbiB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cywgdGhlIG51bWJlciBvZiB0YXJnZXQgb3BlcmFuZHMsCi0gKiBhbmQgd2hldGhlciBvciBub3QgYSB2YWx1ZSBpcyByZXR1cm5lZDoKLSAqCi0gKiAgICAgIEFjcGlFeE9wY29kZV94QV95VF96UgotICoKLSAqIFdoZXJlOgotICoKLSAqIHhBIC0gQVJHVU1FTlRTOiAgICBUaGUgbnVtYmVyIG9mIGFyZ3VtZW50cyAoaW5wdXQgb3BlcmFuZHMpIHRoYXQgYXJlCi0gKiAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQgZm9yIHRoaXMgb3Bjb2RlIHR5cGUgKDAgdGhyb3VnaCA2IGFyZ3MpLgotICogeVQgLSBUQVJHRVRTOiAgICAgIFRoZSBudW1iZXIgb2YgdGFyZ2V0cyAob3V0cHV0IG9wZXJhbmRzKSB0aGF0IGFyZSByZXF1aXJlZAotICogICAgICAgICAgICAgICAgICAgIGZvciB0aGlzIG9wY29kZSB0eXBlICgwLCAxLCBvciAyIHRhcmdldHMpLgotICogelIgLSBSRVRVUk4gVkFMVUU6IEluZGljYXRlcyB3aGV0aGVyIHRoaXMgb3Bjb2RlIHR5cGUgcmV0dXJucyBhIHZhbHVlCi0gKiAgICAgICAgICAgICAgICAgICAgYXMgdGhlIGZ1bmN0aW9uIHJldHVybiAoMCBvciAxKS4KLSAqCi0gKiBUaGUgQWNwaUV4T3Bjb2RlKiBmdW5jdGlvbnMgYXJlIGNhbGxlZCB2aWEgdGhlIERpc3BhdGNoZXIgY29tcG9uZW50IHdpdGgKLSAqIGZ1bGx5IHJlc29sdmVkIG9wZXJhbmRzLgotISovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X29wY29kZV8wQV8wVF8xUgotICoKLSAqIFBBUkFNRVRFUlM6ICB3YWxrX3N0YXRlICAgICAgICAgIC0gQ3VycmVudCBzdGF0ZSAoY29udGFpbnMgQU1MIG9wY29kZSkKLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IEV4ZWN1dGUgb3BlcmF0b3Igd2l0aCBubyBvcGVyYW5kcywgb25lIHJldHVybiB2YWx1ZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1hY3BpX3N0YXR1cyBhY3BpX2V4X29wY29kZV8wQV8wVF8xUihzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKQotewotCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOwotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnJldHVybl9kZXNjID0gTlVMTDsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0VfU1RSKGV4X29wY29kZV8wQV8wVF8xUiwKLQkJCQlhY3BpX3BzX2dldF9vcGNvZGVfbmFtZSh3YWxrX3N0YXRlLT5vcGNvZGUpKTsKLQotCS8qIEV4YW1pbmUgdGhlIEFNTCBvcGNvZGUgKi8KLQotCXN3aXRjaCAod2Fsa19zdGF0ZS0+b3Bjb2RlKSB7Ci0JY2FzZSBBTUxfVElNRVJfT1A6CS8qICBUaW1lciAoKSAqLwotCi0JCS8qIENyZWF0ZSBhIHJldHVybiBvYmplY3Qgb2YgdHlwZSBJbnRlZ2VyICovCi0KLQkJcmV0dXJuX2Rlc2MgPSBhY3BpX3V0X2NyZWF0ZV9pbnRlcm5hbF9vYmplY3QoQUNQSV9UWVBFX0lOVEVHRVIpOwotCQlpZiAoIXJldHVybl9kZXNjKSB7Ci0JCQlzdGF0dXMgPSBBRV9OT19NRU1PUlk7Ci0JCQlnb3RvIGNsZWFudXA7Ci0JCX0KLQkJcmV0dXJuX2Rlc2MtPmludGVnZXIudmFsdWUgPSBhY3BpX29zX2dldF90aW1lcigpOwotCQlicmVhazsKLQotCWRlZmF1bHQ6CQkvKiAgVW5rbm93biBvcGNvZGUgICovCi0KLQkJQUNQSV9FUlJPUigoQUVfSU5GTywgIlVua25vd24gQU1MIG9wY29kZSAlWCIsCi0JCQkgICAgd2Fsa19zdGF0ZS0+b3Bjb2RlKSk7Ci0JCXN0YXR1cyA9IEFFX0FNTF9CQURfT1BDT0RFOwotCQlicmVhazsKLQl9Ci0KLSAgICAgIGNsZWFudXA6Ci0KLQkvKiBEZWxldGUgcmV0dXJuIG9iamVjdCBvbiBlcnJvciAqLwotCi0JaWYgKChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgfHwgd2Fsa19zdGF0ZS0+cmVzdWx0X29iaikgewotCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UocmV0dXJuX2Rlc2MpOwotCQl3YWxrX3N0YXRlLT5yZXN1bHRfb2JqID0gTlVMTDsKLQl9IGVsc2UgewotCQkvKiBTYXZlIHRoZSByZXR1cm4gdmFsdWUgKi8KLQotCQl3YWxrX3N0YXRlLT5yZXN1bHRfb2JqID0gcmV0dXJuX2Rlc2M7Ci0JfQotCi0JcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfZXhfb3Bjb2RlXzFBXzBUXzBSCi0gKgotICogUEFSQU1FVEVSUzogIHdhbGtfc3RhdGUgICAgICAgICAgLSBDdXJyZW50IHN0YXRlIChjb250YWlucyBBTUwgb3Bjb2RlKQotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKLSAqCi0gKiBERVNDUklQVElPTjogRXhlY3V0ZSBUeXBlIDEgbW9uYWRpYyBvcGVyYXRvciB3aXRoIG51bWVyaWMgb3BlcmFuZCBvbgotICogICAgICAgICAgICAgIG9iamVjdCBzdGFjawotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWFjcGlfc3RhdHVzIGFjcGlfZXhfb3Bjb2RlXzFBXzBUXzBSKHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUpCi17Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKm9wZXJhbmQgPSAmd2Fsa19zdGF0ZS0+b3BlcmFuZHNbMF07Ci0JYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1NUUihleF9vcGNvZGVfMUFfMFRfMFIsCi0JCQkJYWNwaV9wc19nZXRfb3Bjb2RlX25hbWUod2Fsa19zdGF0ZS0+b3Bjb2RlKSk7Ci0KLQkvKiBFeGFtaW5lIHRoZSBBTUwgb3Bjb2RlICovCi0KLQlzd2l0Y2ggKHdhbGtfc3RhdGUtPm9wY29kZSkgewotCWNhc2UgQU1MX1JFTEVBU0VfT1A6CS8qICBSZWxlYXNlIChtdXRleF9vYmplY3QpICovCi0KLQkJc3RhdHVzID0gYWNwaV9leF9yZWxlYXNlX211dGV4KG9wZXJhbmRbMF0sIHdhbGtfc3RhdGUpOwotCQlicmVhazsKLQotCWNhc2UgQU1MX1JFU0VUX09QOgkvKiAgUmVzZXQgKGV2ZW50X29iamVjdCkgKi8KLQotCQlzdGF0dXMgPSBhY3BpX2V4X3N5c3RlbV9yZXNldF9ldmVudChvcGVyYW5kWzBdKTsKLQkJYnJlYWs7Ci0KLQljYXNlIEFNTF9TSUdOQUxfT1A6CS8qICBTaWduYWwgKGV2ZW50X29iamVjdCkgKi8KLQotCQlzdGF0dXMgPSBhY3BpX2V4X3N5c3RlbV9zaWduYWxfZXZlbnQob3BlcmFuZFswXSk7Ci0JCWJyZWFrOwotCi0JY2FzZSBBTUxfU0xFRVBfT1A6CS8qICBTbGVlcCAobXNlY190aW1lKSAqLwotCi0JCXN0YXR1cyA9IGFjcGlfZXhfc3lzdGVtX2RvX3N1c3BlbmQob3BlcmFuZFswXS0+aW50ZWdlci52YWx1ZSk7Ci0JCWJyZWFrOwotCi0JY2FzZSBBTUxfU1RBTExfT1A6CS8qICBTdGFsbCAodXNlY190aW1lKSAqLwotCi0JCXN0YXR1cyA9Ci0JCSAgICBhY3BpX2V4X3N5c3RlbV9kb19zdGFsbCgodTMyKSBvcGVyYW5kWzBdLT5pbnRlZ2VyLnZhbHVlKTsKLQkJYnJlYWs7Ci0KLQljYXNlIEFNTF9VTkxPQURfT1A6CS8qICBVbmxvYWQgKEhhbmRsZSkgKi8KLQotCQlzdGF0dXMgPSBhY3BpX2V4X3VubG9hZF90YWJsZShvcGVyYW5kWzBdKTsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgkJLyogIFVua25vd24gb3Bjb2RlICAqLwotCi0JCUFDUElfRVJST1IoKEFFX0lORk8sICJVbmtub3duIEFNTCBvcGNvZGUgJVgiLAotCQkJICAgIHdhbGtfc3RhdGUtPm9wY29kZSkpOwotCQlzdGF0dXMgPSBBRV9BTUxfQkFEX09QQ09ERTsKLQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfZXhfb3Bjb2RlXzFBXzFUXzBSCi0gKgotICogUEFSQU1FVEVSUzogIHdhbGtfc3RhdGUgICAgICAgICAgLSBDdXJyZW50IHN0YXRlIChjb250YWlucyBBTUwgb3Bjb2RlKQotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKLSAqCi0gKiBERVNDUklQVElPTjogRXhlY3V0ZSBvcGNvZGUgd2l0aCBvbmUgYXJndW1lbnQsIG9uZSB0YXJnZXQsIGFuZCBubwotICogICAgICAgICAgICAgIHJldHVybiB2YWx1ZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1hY3BpX3N0YXR1cyBhY3BpX2V4X29wY29kZV8xQV8xVF8wUihzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKQotewotCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOwotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKipvcGVyYW5kID0gJndhbGtfc3RhdGUtPm9wZXJhbmRzWzBdOwotCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9TVFIoZXhfb3Bjb2RlXzFBXzFUXzBSLAotCQkJCWFjcGlfcHNfZ2V0X29wY29kZV9uYW1lKHdhbGtfc3RhdGUtPm9wY29kZSkpOwotCi0JLyogRXhhbWluZSB0aGUgQU1MIG9wY29kZSAqLwotCi0Jc3dpdGNoICh3YWxrX3N0YXRlLT5vcGNvZGUpIHsKLQljYXNlIEFNTF9MT0FEX09QOgotCi0JCXN0YXR1cyA9IGFjcGlfZXhfbG9hZF9vcChvcGVyYW5kWzBdLCBvcGVyYW5kWzFdLCB3YWxrX3N0YXRlKTsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgkJLyogVW5rbm93biBvcGNvZGUgKi8KLQotCQlBQ1BJX0VSUk9SKChBRV9JTkZPLCAiVW5rbm93biBBTUwgb3Bjb2RlICVYIiwKLQkJCSAgICB3YWxrX3N0YXRlLT5vcGNvZGUpKTsKLQkJc3RhdHVzID0gQUVfQU1MX0JBRF9PUENPREU7Ci0JCWdvdG8gY2xlYW51cDsKLQl9Ci0KLSAgICAgIGNsZWFudXA6Ci0KLQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9leF9vcGNvZGVfMUFfMVRfMVIKLSAqCi0gKiBQQVJBTUVURVJTOiAgd2Fsa19zdGF0ZSAgICAgICAgICAtIEN1cnJlbnQgc3RhdGUgKGNvbnRhaW5zIEFNTCBvcGNvZGUpCi0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cwotICoKLSAqIERFU0NSSVBUSU9OOiBFeGVjdXRlIG9wY29kZSB3aXRoIG9uZSBhcmd1bWVudCwgb25lIHRhcmdldCwgYW5kIGEKLSAqICAgICAgICAgICAgICByZXR1cm4gdmFsdWUuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotYWNwaV9zdGF0dXMgYWNwaV9leF9vcGNvZGVfMUFfMVRfMVIoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSkKLXsKLQlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICoqb3BlcmFuZCA9ICZ3YWxrX3N0YXRlLT5vcGVyYW5kc1swXTsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpyZXR1cm5fZGVzYyA9IE5VTEw7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqcmV0dXJuX2Rlc2MyID0gTlVMTDsKLQl1MzIgdGVtcDMyOwotCXUzMiBpOwotCWFjcGlfaW50ZWdlciBwb3dlcl9vZl90ZW47Ci0JYWNwaV9pbnRlZ2VyIGRpZ2l0OwotCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9TVFIoZXhfb3Bjb2RlXzFBXzFUXzFSLAotCQkJCWFjcGlfcHNfZ2V0X29wY29kZV9uYW1lKHdhbGtfc3RhdGUtPm9wY29kZSkpOwotCi0JLyogRXhhbWluZSB0aGUgQU1MIG9wY29kZSAqLwotCi0Jc3dpdGNoICh3YWxrX3N0YXRlLT5vcGNvZGUpIHsKLQljYXNlIEFNTF9CSVRfTk9UX09QOgotCWNhc2UgQU1MX0ZJTkRfU0VUX0xFRlRfQklUX09QOgotCWNhc2UgQU1MX0ZJTkRfU0VUX1JJR0hUX0JJVF9PUDoKLQljYXNlIEFNTF9GUk9NX0JDRF9PUDoKLQljYXNlIEFNTF9UT19CQ0RfT1A6Ci0JY2FzZSBBTUxfQ09ORF9SRUZfT0ZfT1A6Ci0KLQkJLyogQ3JlYXRlIGEgcmV0dXJuIG9iamVjdCBvZiB0eXBlIEludGVnZXIgZm9yIHRoZXNlIG9wY29kZXMgKi8KLQotCQlyZXR1cm5fZGVzYyA9IGFjcGlfdXRfY3JlYXRlX2ludGVybmFsX29iamVjdChBQ1BJX1RZUEVfSU5URUdFUik7Ci0JCWlmICghcmV0dXJuX2Rlc2MpIHsKLQkJCXN0YXR1cyA9IEFFX05PX01FTU9SWTsKLQkJCWdvdG8gY2xlYW51cDsKLQkJfQotCi0JCXN3aXRjaCAod2Fsa19zdGF0ZS0+b3Bjb2RlKSB7Ci0JCWNhc2UgQU1MX0JJVF9OT1RfT1A6CS8qIE5vdCAoT3BlcmFuZCwgUmVzdWx0KSAgKi8KLQotCQkJcmV0dXJuX2Rlc2MtPmludGVnZXIudmFsdWUgPSB+b3BlcmFuZFswXS0+aW50ZWdlci52YWx1ZTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgQU1MX0ZJTkRfU0VUX0xFRlRfQklUX09QOgkvKiBmaW5kX3NldF9sZWZ0X2JpdCAoT3BlcmFuZCwgUmVzdWx0KSAqLwotCi0JCQlyZXR1cm5fZGVzYy0+aW50ZWdlci52YWx1ZSA9IG9wZXJhbmRbMF0tPmludGVnZXIudmFsdWU7Ci0KLQkJCS8qCi0JCQkgKiBBY3BpIHNwZWNpZmljYXRpb24gZGVzY3JpYmVzIEludGVnZXIgdHlwZSBhcyBhIGxpdHRsZQotCQkJICogZW5kaWFuIHVuc2lnbmVkIHZhbHVlLCBzbyB0aGlzIGJvdW5kYXJ5IGNvbmRpdGlvbiBpcyB2YWxpZC4KLQkJCSAqLwotCQkJZm9yICh0ZW1wMzIgPSAwOyByZXR1cm5fZGVzYy0+aW50ZWdlci52YWx1ZSAmJgotCQkJICAgICB0ZW1wMzIgPCBBQ1BJX0lOVEVHRVJfQklUX1NJWkU7ICsrdGVtcDMyKSB7Ci0JCQkJcmV0dXJuX2Rlc2MtPmludGVnZXIudmFsdWUgPj49IDE7Ci0JCQl9Ci0KLQkJCXJldHVybl9kZXNjLT5pbnRlZ2VyLnZhbHVlID0gdGVtcDMyOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBBTUxfRklORF9TRVRfUklHSFRfQklUX09QOgkvKiBmaW5kX3NldF9yaWdodF9iaXQgKE9wZXJhbmQsIFJlc3VsdCkgKi8KLQotCQkJcmV0dXJuX2Rlc2MtPmludGVnZXIudmFsdWUgPSBvcGVyYW5kWzBdLT5pbnRlZ2VyLnZhbHVlOwotCi0JCQkvKgotCQkJICogVGhlIEFjcGkgc3BlY2lmaWNhdGlvbiBkZXNjcmliZXMgSW50ZWdlciB0eXBlIGFzIGEgbGl0dGxlCi0JCQkgKiBlbmRpYW4gdW5zaWduZWQgdmFsdWUsIHNvIHRoaXMgYm91bmRhcnkgY29uZGl0aW9uIGlzIHZhbGlkLgotCQkJICovCi0JCQlmb3IgKHRlbXAzMiA9IDA7IHJldHVybl9kZXNjLT5pbnRlZ2VyLnZhbHVlICYmCi0JCQkgICAgIHRlbXAzMiA8IEFDUElfSU5URUdFUl9CSVRfU0laRTsgKyt0ZW1wMzIpIHsKLQkJCQlyZXR1cm5fZGVzYy0+aW50ZWdlci52YWx1ZSA8PD0gMTsKLQkJCX0KLQotCQkJLyogU2luY2UgdGhlIGJpdCBwb3NpdGlvbiBpcyBvbmUtYmFzZWQsIHN1YnRyYWN0IGZyb20gMzMgKDY1KSAqLwotCi0JCQlyZXR1cm5fZGVzYy0+aW50ZWdlci52YWx1ZSA9Ci0JCQkgICAgdGVtcDMyID09Ci0JCQkgICAgMCA/IDAgOiAoQUNQSV9JTlRFR0VSX0JJVF9TSVpFICsgMSkgLSB0ZW1wMzI7Ci0JCQlicmVhazsKLQotCQljYXNlIEFNTF9GUk9NX0JDRF9PUDoJLyogZnJvbV9iY2QgKEJDRFZhbHVlLCBSZXN1bHQpICovCi0KLQkJCS8qCi0JCQkgKiBUaGUgNjQtYml0IEFDUEkgaW50ZWdlciBjYW4gaG9sZCAxNiA0LWJpdCBCQ0QgY2hhcmFjdGVycwotCQkJICogKGlmIHRhYmxlIGlzIDMyLWJpdCwgaW50ZWdlciBjYW4gaG9sZCA4IEJDRCBjaGFyYWN0ZXJzKQotCQkJICogQ29udmVydCBlYWNoIDQtYml0IEJDRCB2YWx1ZQotCQkJICovCi0JCQlwb3dlcl9vZl90ZW4gPSAxOwotCQkJcmV0dXJuX2Rlc2MtPmludGVnZXIudmFsdWUgPSAwOwotCQkJZGlnaXQgPSBvcGVyYW5kWzBdLT5pbnRlZ2VyLnZhbHVlOwotCi0JCQkvKiBDb252ZXJ0IGVhY2ggQkNEIGRpZ2l0IChlYWNoIGlzIG9uZSBueWJibGUgd2lkZSkgKi8KLQotCQkJZm9yIChpID0gMDsKLQkJCSAgICAgKGkgPCBhY3BpX2dibF9pbnRlZ2VyX255YmJsZV93aWR0aCkgJiYgKGRpZ2l0ID4gMCk7Ci0JCQkgICAgIGkrKykgewotCi0JCQkJLyogR2V0IHRoZSBsZWFzdCBzaWduaWZpY2FudCA0LWJpdCBCQ0QgZGlnaXQgKi8KLQotCQkJCXRlbXAzMiA9ICgodTMyKSBkaWdpdCkgJiAweEY7Ci0KLQkJCQkvKiBDaGVjayB0aGUgcmFuZ2Ugb2YgdGhlIGRpZ2l0ICovCi0KLQkJCQlpZiAodGVtcDMyID4gOSkgewotCQkJCQlBQ1BJX0VSUk9SKChBRV9JTkZPLAotCQkJCQkJICAgICJCQ0QgZGlnaXQgdG9vIGxhcmdlIChub3QgZGVjaW1hbCk6IDB4JVgiLAotCQkJCQkJICAgIHRlbXAzMikpOwotCi0JCQkJCXN0YXR1cyA9IEFFX0FNTF9OVU1FUklDX09WRVJGTE9XOwotCQkJCQlnb3RvIGNsZWFudXA7Ci0JCQkJfQotCi0JCQkJLyogU3VtIHRoZSBkaWdpdCBpbnRvIHRoZSByZXN1bHQgd2l0aCB0aGUgY3VycmVudCBwb3dlciBvZiAxMCAqLwotCi0JCQkJcmV0dXJuX2Rlc2MtPmludGVnZXIudmFsdWUgKz0KLQkJCQkgICAgKCgoYWNwaV9pbnRlZ2VyKSB0ZW1wMzIpICogcG93ZXJfb2ZfdGVuKTsKLQotCQkJCS8qIFNoaWZ0IHRvIG5leHQgQkNEIGRpZ2l0ICovCi0KLQkJCQlkaWdpdCA+Pj0gNDsKLQotCQkJCS8qIE5leHQgcG93ZXIgb2YgMTAgKi8KLQotCQkJCXBvd2VyX29mX3RlbiAqPSAxMDsKLQkJCX0KLQkJCWJyZWFrOwotCi0JCWNhc2UgQU1MX1RPX0JDRF9PUDoJLyogdG9fYmNkIChPcGVyYW5kLCBSZXN1bHQpICovCi0KLQkJCXJldHVybl9kZXNjLT5pbnRlZ2VyLnZhbHVlID0gMDsKLQkJCWRpZ2l0ID0gb3BlcmFuZFswXS0+aW50ZWdlci52YWx1ZTsKLQotCQkJLyogRWFjaCBCQ0QgZGlnaXQgaXMgb25lIG55YmJsZSB3aWRlICovCi0KLQkJCWZvciAoaSA9IDA7Ci0JCQkgICAgIChpIDwgYWNwaV9nYmxfaW50ZWdlcl9ueWJibGVfd2lkdGgpICYmIChkaWdpdCA+IDApOwotCQkJICAgICBpKyspIHsKLQkJCQkodm9pZClhY3BpX3V0X3Nob3J0X2RpdmlkZShkaWdpdCwgMTAsICZkaWdpdCwKLQkJCQkJCQkgICAmdGVtcDMyKTsKLQotCQkJCS8qCi0JCQkJICogSW5zZXJ0IHRoZSBCQ0QgZGlnaXQgdGhhdCByZXNpZGVzIGluIHRoZQotCQkJCSAqIHJlbWFpbmRlciBmcm9tIGFib3ZlCi0JCQkJICovCi0JCQkJcmV0dXJuX2Rlc2MtPmludGVnZXIudmFsdWUgfD0KLQkJCQkgICAgKCgoYWNwaV9pbnRlZ2VyKSB0ZW1wMzIpIDw8IEFDUElfTVVMXzQoaSkpOwotCQkJfQotCi0JCQkvKiBPdmVyZmxvdyBpZiB0aGVyZSBpcyBhbnkgZGF0YSBsZWZ0IGluIERpZ2l0ICovCi0KLQkJCWlmIChkaWdpdCA+IDApIHsKLQkJCQlBQ1BJX0VSUk9SKChBRV9JTkZPLAotCQkJCQkgICAgIkludGVnZXIgdG9vIGxhcmdlIHRvIGNvbnZlcnQgdG8gQkNEOiAlOC44WCU4LjhYIiwKLQkJCQkJICAgIEFDUElfRk9STUFUX1VJTlQ2NChvcGVyYW5kWzBdLT4KLQkJCQkJCQkgICAgICAgaW50ZWdlci52YWx1ZSkpKTsKLQkJCQlzdGF0dXMgPSBBRV9BTUxfTlVNRVJJQ19PVkVSRkxPVzsKLQkJCQlnb3RvIGNsZWFudXA7Ci0JCQl9Ci0JCQlicmVhazsKLQotCQljYXNlIEFNTF9DT05EX1JFRl9PRl9PUDoJLyogY29uZF9yZWZfb2YgKHNvdXJjZV9vYmplY3QsIFJlc3VsdCkgKi8KLQotCQkJLyoKLQkJCSAqIFRoaXMgb3AgaXMgYSBsaXR0bGUgc3RyYW5nZSBiZWNhdXNlIHRoZSBpbnRlcm5hbCByZXR1cm4gdmFsdWUgaXMKLQkJCSAqIGRpZmZlcmVudCB0aGFuIHRoZSByZXR1cm4gdmFsdWUgc3RvcmVkIGluIHRoZSByZXN1bHQgZGVzY3JpcHRvcgotCQkJICogKFRoZXJlIGFyZSByZWFsbHkgdHdvIHJldHVybiB2YWx1ZXMpCi0JCQkgKi8KLQkJCWlmICgoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKilvcGVyYW5kWzBdID09Ci0JCQkgICAgYWNwaV9nYmxfcm9vdF9ub2RlKSB7Ci0JCQkJLyoKLQkJCQkgKiBUaGlzIG1lYW5zIHRoYXQgdGhlIG9iamVjdCBkb2VzIG5vdCBleGlzdCBpbiB0aGUgbmFtZXNwYWNlLAotCQkJCSAqIHJldHVybiBGQUxTRQotCQkJCSAqLwotCQkJCXJldHVybl9kZXNjLT5pbnRlZ2VyLnZhbHVlID0gMDsKLQkJCQlnb3RvIGNsZWFudXA7Ci0JCQl9Ci0KLQkJCS8qIEdldCB0aGUgb2JqZWN0IHJlZmVyZW5jZSwgc3RvcmUgaXQsIGFuZCByZW1vdmUgb3VyIHJlZmVyZW5jZSAqLwotCi0JCQlzdGF0dXMgPSBhY3BpX2V4X2dldF9vYmplY3RfcmVmZXJlbmNlKG9wZXJhbmRbMF0sCi0JCQkJCQkJICAgICAgJnJldHVybl9kZXNjMiwKLQkJCQkJCQkgICAgICB3YWxrX3N0YXRlKTsKLQkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQkJCWdvdG8gY2xlYW51cDsKLQkJCX0KLQotCQkJc3RhdHVzID0KLQkJCSAgICBhY3BpX2V4X3N0b3JlKHJldHVybl9kZXNjMiwgb3BlcmFuZFsxXSwgd2Fsa19zdGF0ZSk7Ci0JCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UocmV0dXJuX2Rlc2MyKTsKLQotCQkJLyogVGhlIG9iamVjdCBleGlzdHMgaW4gdGhlIG5hbWVzcGFjZSwgcmV0dXJuIFRSVUUgKi8KLQotCQkJcmV0dXJuX2Rlc2MtPmludGVnZXIudmFsdWUgPSBBQ1BJX0lOVEVHRVJfTUFYOwotCQkJZ290byBjbGVhbnVwOwotCi0JCWRlZmF1bHQ6Ci0JCQkvKiBObyBvdGhlciBvcGNvZGVzIGdldCBoZXJlICovCi0JCQlicmVhazsKLQkJfQotCQlicmVhazsKLQotCWNhc2UgQU1MX1NUT1JFX09QOgkvKiBTdG9yZSAoU291cmNlLCBUYXJnZXQpICovCi0KLQkJLyoKLQkJICogQSBzdG9yZSBvcGVyYW5kIGlzIHR5cGljYWxseSBhIG51bWJlciwgc3RyaW5nLCBidWZmZXIgb3IgbHZhbHVlCi0JCSAqIEJlIGNhcmVmdWwgYWJvdXQgZGVsZXRpbmcgdGhlIHNvdXJjZSBvYmplY3QsCi0JCSAqIHNpbmNlIHRoZSBvYmplY3QgaXRzZWxmIG1heSBoYXZlIGJlZW4gc3RvcmVkLgotCQkgKi8KLQkJc3RhdHVzID0gYWNwaV9leF9zdG9yZShvcGVyYW5kWzBdLCBvcGVyYW5kWzFdLCB3YWxrX3N0YXRlKTsKLQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLQkJfQotCi0JCS8qIEl0IGlzIHBvc3NpYmxlIHRoYXQgdGhlIFN0b3JlIGFscmVhZHkgcHJvZHVjZWQgYSByZXR1cm4gb2JqZWN0ICovCi0KLQkJaWYgKCF3YWxrX3N0YXRlLT5yZXN1bHRfb2JqKSB7Ci0JCQkvKgotCQkJICogTm9ybWFsbHksIHdlIHdvdWxkIHJlbW92ZSBhIHJlZmVyZW5jZSBvbiB0aGUgT3BlcmFuZFswXQotCQkJICogcGFyYW1ldGVyOyBCdXQgc2luY2UgaXQgaXMgYmVpbmcgdXNlZCBhcyB0aGUgaW50ZXJuYWwgcmV0dXJuCi0JCQkgKiBvYmplY3QgKG1lYW5pbmcgd2Ugd291bGQgbm9ybWFsbHkgaW5jcmVtZW50IGl0KSwgdGhlIHR3bwotCQkJICogY2FuY2VsIG91dCwgYW5kIHdlIHNpbXBseSBkb24ndCBkbyBhbnl0aGluZy4KLQkJCSAqLwotCQkJd2Fsa19zdGF0ZS0+cmVzdWx0X29iaiA9IG9wZXJhbmRbMF07Ci0JCQl3YWxrX3N0YXRlLT5vcGVyYW5kc1swXSA9IE5VTEw7CS8qIFByZXZlbnQgZGVsZXRpb24gKi8KLQkJfQotCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLQotCQkvKgotCQkgKiBBQ1BJIDIuMCBPcGNvZGVzCi0JCSAqLwotCWNhc2UgQU1MX0NPUFlfT1A6CS8qIENvcHkgKFNvdXJjZSwgVGFyZ2V0KSAqLwotCi0JCXN0YXR1cyA9Ci0JCSAgICBhY3BpX3V0X2NvcHlfaW9iamVjdF90b19pb2JqZWN0KG9wZXJhbmRbMF0sICZyZXR1cm5fZGVzYywKLQkJCQkJCSAgICB3YWxrX3N0YXRlKTsKLQkJYnJlYWs7Ci0KLQljYXNlIEFNTF9UT19ERUNTVFJJTkdfT1A6CS8qIHRvX2RlY2ltYWxfc3RyaW5nIChEYXRhLCBSZXN1bHQpICovCi0KLQkJc3RhdHVzID0gYWNwaV9leF9jb252ZXJ0X3RvX3N0cmluZyhvcGVyYW5kWzBdLCAmcmV0dXJuX2Rlc2MsCi0JCQkJCQkgICBBQ1BJX0VYUExJQ0lUX0NPTlZFUlRfREVDSU1BTCk7Ci0JCWlmIChyZXR1cm5fZGVzYyA9PSBvcGVyYW5kWzBdKSB7Ci0KLQkJCS8qIE5vIGNvbnZlcnNpb24gcGVyZm9ybWVkLCBhZGQgcmVmIHRvIGhhbmRsZSByZXR1cm4gdmFsdWUgKi8KLQkJCWFjcGlfdXRfYWRkX3JlZmVyZW5jZShyZXR1cm5fZGVzYyk7Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIEFNTF9UT19IRVhTVFJJTkdfT1A6CS8qIHRvX2hleF9zdHJpbmcgKERhdGEsIFJlc3VsdCkgKi8KLQotCQlzdGF0dXMgPSBhY3BpX2V4X2NvbnZlcnRfdG9fc3RyaW5nKG9wZXJhbmRbMF0sICZyZXR1cm5fZGVzYywKLQkJCQkJCSAgIEFDUElfRVhQTElDSVRfQ09OVkVSVF9IRVgpOwotCQlpZiAocmV0dXJuX2Rlc2MgPT0gb3BlcmFuZFswXSkgewotCi0JCQkvKiBObyBjb252ZXJzaW9uIHBlcmZvcm1lZCwgYWRkIHJlZiB0byBoYW5kbGUgcmV0dXJuIHZhbHVlICovCi0JCQlhY3BpX3V0X2FkZF9yZWZlcmVuY2UocmV0dXJuX2Rlc2MpOwotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBBTUxfVE9fQlVGRkVSX09QOgkvKiB0b19idWZmZXIgKERhdGEsIFJlc3VsdCkgKi8KLQotCQlzdGF0dXMgPSBhY3BpX2V4X2NvbnZlcnRfdG9fYnVmZmVyKG9wZXJhbmRbMF0sICZyZXR1cm5fZGVzYyk7Ci0JCWlmIChyZXR1cm5fZGVzYyA9PSBvcGVyYW5kWzBdKSB7Ci0KLQkJCS8qIE5vIGNvbnZlcnNpb24gcGVyZm9ybWVkLCBhZGQgcmVmIHRvIGhhbmRsZSByZXR1cm4gdmFsdWUgKi8KLQkJCWFjcGlfdXRfYWRkX3JlZmVyZW5jZShyZXR1cm5fZGVzYyk7Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIEFNTF9UT19JTlRFR0VSX09QOgkvKiB0b19pbnRlZ2VyIChEYXRhLCBSZXN1bHQpICovCi0KLQkJc3RhdHVzID0gYWNwaV9leF9jb252ZXJ0X3RvX2ludGVnZXIob3BlcmFuZFswXSwgJnJldHVybl9kZXNjLAotCQkJCQkJICAgIEFDUElfQU5ZX0JBU0UpOwotCQlpZiAocmV0dXJuX2Rlc2MgPT0gb3BlcmFuZFswXSkgewotCi0JCQkvKiBObyBjb252ZXJzaW9uIHBlcmZvcm1lZCwgYWRkIHJlZiB0byBoYW5kbGUgcmV0dXJuIHZhbHVlICovCi0JCQlhY3BpX3V0X2FkZF9yZWZlcmVuY2UocmV0dXJuX2Rlc2MpOwotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBBTUxfU0hJRlRfTEVGVF9CSVRfT1A6CS8qIHNoaWZ0X2xlZnRfYml0IChTb3VyY2UsIGJpdF9udW0pICovCi0JY2FzZSBBTUxfU0hJRlRfUklHSFRfQklUX09QOgkvKiBzaGlmdF9yaWdodF9iaXQgKFNvdXJjZSwgYml0X251bSkgKi8KLQotCQkvKiBUaGVzZSBhcmUgdHdvIG9ic29sZXRlIG9wY29kZXMgKi8KLQotCQlBQ1BJX0VSUk9SKChBRV9JTkZPLAotCQkJICAgICIlcyBpcyBvYnNvbGV0ZSBhbmQgbm90IGltcGxlbWVudGVkIiwKLQkJCSAgICBhY3BpX3BzX2dldF9vcGNvZGVfbmFtZSh3YWxrX3N0YXRlLT5vcGNvZGUpKSk7Ci0JCXN0YXR1cyA9IEFFX1NVUFBPUlQ7Ci0JCWdvdG8gY2xlYW51cDsKLQotCWRlZmF1bHQ6CQkvKiBVbmtub3duIG9wY29kZSAqLwotCi0JCUFDUElfRVJST1IoKEFFX0lORk8sICJVbmtub3duIEFNTCBvcGNvZGUgJVgiLAotCQkJICAgIHdhbGtfc3RhdGUtPm9wY29kZSkpOwotCQlzdGF0dXMgPSBBRV9BTUxfQkFEX09QQ09ERTsKLQkJZ290byBjbGVhbnVwOwotCX0KLQotCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkgewotCi0JCS8qIFN0b3JlIHRoZSByZXR1cm4gdmFsdWUgY29tcHV0ZWQgYWJvdmUgaW50byB0aGUgdGFyZ2V0IG9iamVjdCAqLwotCi0JCXN0YXR1cyA9IGFjcGlfZXhfc3RvcmUocmV0dXJuX2Rlc2MsIG9wZXJhbmRbMV0sIHdhbGtfc3RhdGUpOwotCX0KLQotICAgICAgY2xlYW51cDoKLQotCS8qIERlbGV0ZSByZXR1cm4gb2JqZWN0IG9uIGVycm9yICovCi0KLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKHJldHVybl9kZXNjKTsKLQl9Ci0KLQkvKiBTYXZlIHJldHVybiBvYmplY3Qgb24gc3VjY2VzcyAqLwotCi0JZWxzZSBpZiAoIXdhbGtfc3RhdGUtPnJlc3VsdF9vYmopIHsKLQkJd2Fsa19zdGF0ZS0+cmVzdWx0X29iaiA9IHJldHVybl9kZXNjOwotCX0KLQotCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X29wY29kZV8xQV8wVF8xUgotICoKLSAqIFBBUkFNRVRFUlM6ICB3YWxrX3N0YXRlICAgICAgICAgIC0gQ3VycmVudCBzdGF0ZSAoY29udGFpbnMgQU1MIG9wY29kZSkKLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IEV4ZWN1dGUgb3Bjb2RlIHdpdGggb25lIGFyZ3VtZW50LCBubyB0YXJnZXQsIGFuZCBhIHJldHVybiB2YWx1ZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWFjcGlfc3RhdHVzIGFjcGlfZXhfb3Bjb2RlXzFBXzBUXzFSKHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUpCi17Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKm9wZXJhbmQgPSAmd2Fsa19zdGF0ZS0+b3BlcmFuZHNbMF07Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqdGVtcF9kZXNjOwotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnJldHVybl9kZXNjID0gTlVMTDsKLQlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKLQl1MzIgdHlwZTsKLQlhY3BpX2ludGVnZXIgdmFsdWU7Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1NUUihleF9vcGNvZGVfMUFfMFRfMVIsCi0JCQkJYWNwaV9wc19nZXRfb3Bjb2RlX25hbWUod2Fsa19zdGF0ZS0+b3Bjb2RlKSk7Ci0KLQkvKiBFeGFtaW5lIHRoZSBBTUwgb3Bjb2RlICovCi0KLQlzd2l0Y2ggKHdhbGtfc3RhdGUtPm9wY29kZSkgewotCWNhc2UgQU1MX0xOT1RfT1A6CS8qIExOb3QgKE9wZXJhbmQpICovCi0KLQkJcmV0dXJuX2Rlc2MgPSBhY3BpX3V0X2NyZWF0ZV9pbnRlcm5hbF9vYmplY3QoQUNQSV9UWVBFX0lOVEVHRVIpOwotCQlpZiAoIXJldHVybl9kZXNjKSB7Ci0JCQlzdGF0dXMgPSBBRV9OT19NRU1PUlk7Ci0JCQlnb3RvIGNsZWFudXA7Ci0JCX0KLQotCQkvKgotCQkgKiBTZXQgcmVzdWx0IHRvIE9ORVMgKFRSVUUpIGlmIFZhbHVlID09IDAuICBOb3RlOgotCQkgKiByZXR1cm5fZGVzYy0+SW50ZWdlci5WYWx1ZSBpcyBpbml0aWFsbHkgPT0gMCAoRkFMU0UpIGZyb20gYWJvdmUuCi0JCSAqLwotCQlpZiAoIW9wZXJhbmRbMF0tPmludGVnZXIudmFsdWUpIHsKLQkJCXJldHVybl9kZXNjLT5pbnRlZ2VyLnZhbHVlID0gQUNQSV9JTlRFR0VSX01BWDsKLQkJfQotCQlicmVhazsKLQotCWNhc2UgQU1MX0RFQ1JFTUVOVF9PUDoJLyogRGVjcmVtZW50IChPcGVyYW5kKSAgKi8KLQljYXNlIEFNTF9JTkNSRU1FTlRfT1A6CS8qIEluY3JlbWVudCAoT3BlcmFuZCkgICovCi0KLQkJLyoKLQkJICogQ3JlYXRlIGEgbmV3IGludGVnZXIuICBDYW4ndCBqdXN0IGdldCB0aGUgYmFzZSBpbnRlZ2VyIGFuZAotCQkgKiBpbmNyZW1lbnQgaXQgYmVjYXVzZSBpdCBtYXkgYmUgYW4gQXJnIG9yIEZpZWxkLgotCQkgKi8KLQkJcmV0dXJuX2Rlc2MgPSBhY3BpX3V0X2NyZWF0ZV9pbnRlcm5hbF9vYmplY3QoQUNQSV9UWVBFX0lOVEVHRVIpOwotCQlpZiAoIXJldHVybl9kZXNjKSB7Ci0JCQlzdGF0dXMgPSBBRV9OT19NRU1PUlk7Ci0JCQlnb3RvIGNsZWFudXA7Ci0JCX0KLQotCQkvKgotCQkgKiBTaW5jZSB3ZSBhcmUgZXhwZWN0aW5nIGEgUmVmZXJlbmNlIG9wZXJhbmQsIGl0IGNhbiBiZSBlaXRoZXIgYQotCQkgKiBOUyBOb2RlIG9yIGFuIGludGVybmFsIG9iamVjdC4KLQkJICovCi0JCXRlbXBfZGVzYyA9IG9wZXJhbmRbMF07Ci0JCWlmIChBQ1BJX0dFVF9ERVNDUklQVE9SX1RZUEUodGVtcF9kZXNjKSA9PQotCQkgICAgQUNQSV9ERVNDX1RZUEVfT1BFUkFORCkgewotCi0JCQkvKiBJbnRlcm5hbCByZWZlcmVuY2Ugb2JqZWN0IC0gcHJldmVudCBkZWxldGlvbiAqLwotCi0JCQlhY3BpX3V0X2FkZF9yZWZlcmVuY2UodGVtcF9kZXNjKTsKLQkJfQotCi0JCS8qCi0JCSAqIENvbnZlcnQgdGhlIFJlZmVyZW5jZSBvcGVyYW5kIHRvIGFuIEludGVnZXIgKFRoaXMgcmVtb3ZlcyBhCi0JCSAqIHJlZmVyZW5jZSBvbiB0aGUgT3BlcmFuZFswXSBvYmplY3QpCi0JCSAqCi0JCSAqIE5PVEU6ICBXZSB1c2UgTE5PVF9PUCBoZXJlIGluIG9yZGVyIHRvIGZvcmNlIHJlc29sdXRpb24gb2YgdGhlCi0JCSAqIHJlZmVyZW5jZSBvcGVyYW5kIHRvIGFuIGFjdHVhbCBpbnRlZ2VyLgotCQkgKi8KLQkJc3RhdHVzID0KLQkJICAgIGFjcGlfZXhfcmVzb2x2ZV9vcGVyYW5kcyhBTUxfTE5PVF9PUCwgJnRlbXBfZGVzYywKLQkJCQkJICAgICB3YWxrX3N0YXRlKTsKLQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCQlBQ1BJX0VYQ0VQVElPTigoQUVfSU5GTywgc3RhdHVzLAotCQkJCQkiV2hpbGUgcmVzb2x2aW5nIG9wZXJhbmRzIGZvciBbJXNdIiwKLQkJCQkJYWNwaV9wc19nZXRfb3Bjb2RlX25hbWUod2Fsa19zdGF0ZS0+Ci0JCQkJCQkJCW9wY29kZSkpKTsKLQotCQkJZ290byBjbGVhbnVwOwotCQl9Ci0KLQkJLyoKLQkJICogdGVtcF9kZXNjIGlzIG5vdyBndWFyYW50ZWVkIHRvIGJlIGFuIEludGVnZXIgb2JqZWN0IC0tCi0JCSAqIFBlcmZvcm0gdGhlIGFjdHVhbCBpbmNyZW1lbnQgb3IgZGVjcmVtZW50Ci0JCSAqLwotCQlpZiAod2Fsa19zdGF0ZS0+b3Bjb2RlID09IEFNTF9JTkNSRU1FTlRfT1ApIHsKLQkJCXJldHVybl9kZXNjLT5pbnRlZ2VyLnZhbHVlID0KLQkJCSAgICB0ZW1wX2Rlc2MtPmludGVnZXIudmFsdWUgKyAxOwotCQl9IGVsc2UgewotCQkJcmV0dXJuX2Rlc2MtPmludGVnZXIudmFsdWUgPQotCQkJICAgIHRlbXBfZGVzYy0+aW50ZWdlci52YWx1ZSAtIDE7Ci0JCX0KLQotCQkvKiBGaW5pc2hlZCB3aXRoIHRoaXMgSW50ZWdlciBvYmplY3QgKi8KLQotCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UodGVtcF9kZXNjKTsKLQotCQkvKgotCQkgKiBTdG9yZSB0aGUgcmVzdWx0IGJhY2sgKGluZGlyZWN0bHkpIHRocm91Z2ggdGhlIG9yaWdpbmFsCi0JCSAqIFJlZmVyZW5jZSBvYmplY3QKLQkJICovCi0JCXN0YXR1cyA9IGFjcGlfZXhfc3RvcmUocmV0dXJuX2Rlc2MsIG9wZXJhbmRbMF0sIHdhbGtfc3RhdGUpOwotCQlicmVhazsKLQotCWNhc2UgQU1MX1RZUEVfT1A6CS8qIG9iamVjdF90eXBlIChzb3VyY2Vfb2JqZWN0KSAqLwotCi0JCS8qCi0JCSAqIE5vdGU6IFRoZSBvcGVyYW5kIGlzIG5vdCByZXNvbHZlZCBhdCB0aGlzIHBvaW50IGJlY2F1c2Ugd2Ugd2FudCB0bwotCQkgKiBnZXQgdGhlIGFzc29jaWF0ZWQgb2JqZWN0LCBub3QgaXRzIHZhbHVlLiAgRm9yIGV4YW1wbGUsIHdlIGRvbid0Ci0JCSAqIHdhbnQgdG8gcmVzb2x2ZSBhIGZpZWxkX3VuaXQgdG8gaXRzIHZhbHVlLCB3ZSB3YW50IHRoZSBhY3R1YWwKLQkJICogZmllbGRfdW5pdCBvYmplY3QuCi0JCSAqLwotCi0JCS8qIEdldCB0aGUgdHlwZSBvZiB0aGUgYmFzZSBvYmplY3QgKi8KLQotCQlzdGF0dXMgPQotCQkgICAgYWNwaV9leF9yZXNvbHZlX211bHRpcGxlKHdhbGtfc3RhdGUsIG9wZXJhbmRbMF0sICZ0eXBlLAotCQkJCQkgICAgIE5VTEwpOwotCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJCWdvdG8gY2xlYW51cDsKLQkJfQotCi0JCS8qIEFsbG9jYXRlIGEgZGVzY3JpcHRvciB0byBob2xkIHRoZSB0eXBlLiAqLwotCi0JCXJldHVybl9kZXNjID0gYWNwaV91dF9jcmVhdGVfaW50ZXJuYWxfb2JqZWN0KEFDUElfVFlQRV9JTlRFR0VSKTsKLQkJaWYgKCFyZXR1cm5fZGVzYykgewotCQkJc3RhdHVzID0gQUVfTk9fTUVNT1JZOwotCQkJZ290byBjbGVhbnVwOwotCQl9Ci0KLQkJcmV0dXJuX2Rlc2MtPmludGVnZXIudmFsdWUgPSB0eXBlOwotCQlicmVhazsKLQotCWNhc2UgQU1MX1NJWkVfT0ZfT1A6CS8qIHNpemVfb2YgKHNvdXJjZV9vYmplY3QpICovCi0KLQkJLyoKLQkJICogTm90ZTogVGhlIG9wZXJhbmQgaXMgbm90IHJlc29sdmVkIGF0IHRoaXMgcG9pbnQgYmVjYXVzZSB3ZSB3YW50IHRvCi0JCSAqIGdldCB0aGUgYXNzb2NpYXRlZCBvYmplY3QsIG5vdCBpdHMgdmFsdWUuCi0JCSAqLwotCi0JCS8qIEdldCB0aGUgYmFzZSBvYmplY3QgKi8KLQotCQlzdGF0dXMgPSBhY3BpX2V4X3Jlc29sdmVfbXVsdGlwbGUod2Fsa19zdGF0ZSwKLQkJCQkJCSAgb3BlcmFuZFswXSwgJnR5cGUsCi0JCQkJCQkgICZ0ZW1wX2Rlc2MpOwotCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJCWdvdG8gY2xlYW51cDsKLQkJfQotCi0JCS8qCi0JCSAqIFRoZSB0eXBlIG9mIHRoZSBiYXNlIG9iamVjdCBtdXN0IGJlIGludGVnZXIsIGJ1ZmZlciwgc3RyaW5nLCBvcgotCQkgKiBwYWNrYWdlLiAgQWxsIG90aGVycyBhcmUgbm90IHN1cHBvcnRlZC4KLQkJICoKLQkJICogTk9URTogSW50ZWdlciBpcyBub3Qgc3BlY2lmaWNhbGx5IHN1cHBvcnRlZCBieSB0aGUgQUNQSSBzcGVjLAotCQkgKiBidXQgaXMgc3VwcG9ydGVkIGltcGxpY2l0bHkgdmlhIGltcGxpY2l0IG9wZXJhbmQgY29udmVyc2lvbi4KLQkJICogcmF0aGVyIHRoYW4gYm90aGVyIHdpdGggY29udmVyc2lvbiwgd2UganVzdCB1c2UgdGhlIGJ5dGUgd2lkdGgKLQkJICogZ2xvYmFsICg0IG9yIDggYnl0ZXMpLgotCQkgKi8KLQkJc3dpdGNoICh0eXBlKSB7Ci0JCWNhc2UgQUNQSV9UWVBFX0lOVEVHRVI6Ci0JCQl2YWx1ZSA9IGFjcGlfZ2JsX2ludGVnZXJfYnl0ZV93aWR0aDsKLQkJCWJyZWFrOwotCi0JCWNhc2UgQUNQSV9UWVBFX1NUUklORzoKLQkJCXZhbHVlID0gdGVtcF9kZXNjLT5zdHJpbmcubGVuZ3RoOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBBQ1BJX1RZUEVfQlVGRkVSOgotCi0JCQkvKiBCdWZmZXIgYXJndW1lbnRzIG1heSBub3QgYmUgZXZhbHVhdGVkIGF0IHRoaXMgcG9pbnQgKi8KLQotCQkJc3RhdHVzID0gYWNwaV9kc19nZXRfYnVmZmVyX2FyZ3VtZW50cyh0ZW1wX2Rlc2MpOwotCQkJdmFsdWUgPSB0ZW1wX2Rlc2MtPmJ1ZmZlci5sZW5ndGg7Ci0JCQlicmVhazsKLQotCQljYXNlIEFDUElfVFlQRV9QQUNLQUdFOgotCi0JCQkvKiBQYWNrYWdlIGFyZ3VtZW50cyBtYXkgbm90IGJlIGV2YWx1YXRlZCBhdCB0aGlzIHBvaW50ICovCi0KLQkJCXN0YXR1cyA9IGFjcGlfZHNfZ2V0X3BhY2thZ2VfYXJndW1lbnRzKHRlbXBfZGVzYyk7Ci0JCQl2YWx1ZSA9IHRlbXBfZGVzYy0+cGFja2FnZS5jb3VudDsKLQkJCWJyZWFrOwotCi0JCWRlZmF1bHQ6Ci0JCQlBQ1BJX0VSUk9SKChBRV9JTkZPLAotCQkJCSAgICAiT3BlcmFuZCBtdXN0IGJlIEJ1ZmZlci9JbnRlZ2VyL1N0cmluZy9QYWNrYWdlIC0gZm91bmQgdHlwZSAlcyIsCi0JCQkJICAgIGFjcGlfdXRfZ2V0X3R5cGVfbmFtZSh0eXBlKSkpOwotCQkJc3RhdHVzID0gQUVfQU1MX09QRVJBTkRfVFlQRTsKLQkJCWdvdG8gY2xlYW51cDsKLQkJfQotCi0JCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQkJZ290byBjbGVhbnVwOwotCQl9Ci0KLQkJLyoKLQkJICogTm93IHRoYXQgd2UgaGF2ZSB0aGUgc2l6ZSBvZiB0aGUgb2JqZWN0LCBjcmVhdGUgYSByZXN1bHQKLQkJICogb2JqZWN0IHRvIGhvbGQgdGhlIHZhbHVlCi0JCSAqLwotCQlyZXR1cm5fZGVzYyA9IGFjcGlfdXRfY3JlYXRlX2ludGVybmFsX29iamVjdChBQ1BJX1RZUEVfSU5URUdFUik7Ci0JCWlmICghcmV0dXJuX2Rlc2MpIHsKLQkJCXN0YXR1cyA9IEFFX05PX01FTU9SWTsKLQkJCWdvdG8gY2xlYW51cDsKLQkJfQotCi0JCXJldHVybl9kZXNjLT5pbnRlZ2VyLnZhbHVlID0gdmFsdWU7Ci0JCWJyZWFrOwotCi0JY2FzZSBBTUxfUkVGX09GX09QOgkvKiByZWZfb2YgKHNvdXJjZV9vYmplY3QpICovCi0KLQkJc3RhdHVzID0KLQkJICAgIGFjcGlfZXhfZ2V0X29iamVjdF9yZWZlcmVuY2Uob3BlcmFuZFswXSwgJnJldHVybl9kZXNjLAotCQkJCQkJIHdhbGtfc3RhdGUpOwotCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJCWdvdG8gY2xlYW51cDsKLQkJfQotCQlicmVhazsKLQotCWNhc2UgQU1MX0RFUkVGX09GX09QOgkvKiBkZXJlZl9vZiAob2JqX3JlZmVyZW5jZSB8IFN0cmluZykgKi8KLQotCQkvKiBDaGVjayBmb3IgYSBtZXRob2QgbG9jYWwgb3IgYXJndW1lbnQsIG9yIHN0YW5kYWxvbmUgU3RyaW5nICovCi0KLQkJaWYgKEFDUElfR0VUX0RFU0NSSVBUT1JfVFlQRShvcGVyYW5kWzBdKSA9PQotCQkgICAgQUNQSV9ERVNDX1RZUEVfTkFNRUQpIHsKLQkJCXRlbXBfZGVzYyA9Ci0JCQkgICAgYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0KChzdHJ1Y3QKLQkJCQkJCQkgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqKQotCQkJCQkJCW9wZXJhbmRbMF0pOwotCQkJaWYgKHRlbXBfZGVzYwotCQkJICAgICYmCi0JCQkgICAgKChBQ1BJX0dFVF9PQkpFQ1RfVFlQRSh0ZW1wX2Rlc2MpID09Ci0JCQkgICAgICBBQ1BJX1RZUEVfU1RSSU5HKQotCQkJICAgICB8fCAoQUNQSV9HRVRfT0JKRUNUX1RZUEUodGVtcF9kZXNjKSA9PQotCQkJCSBBQ1BJX1RZUEVfTE9DQUxfUkVGRVJFTkNFKSkpIHsKLQkJCQlvcGVyYW5kWzBdID0gdGVtcF9kZXNjOwotCQkJCWFjcGlfdXRfYWRkX3JlZmVyZW5jZSh0ZW1wX2Rlc2MpOwotCQkJfSBlbHNlIHsKLQkJCQlzdGF0dXMgPSBBRV9BTUxfT1BFUkFORF9UWVBFOwotCQkJCWdvdG8gY2xlYW51cDsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXN3aXRjaCAoQUNQSV9HRVRfT0JKRUNUX1RZUEUob3BlcmFuZFswXSkpIHsKLQkJCWNhc2UgQUNQSV9UWVBFX0xPQ0FMX1JFRkVSRU5DRToKLQkJCQkvKgotCQkJCSAqIFRoaXMgaXMgYSBkZXJlZl9vZiAobG9jYWxfeCB8IGFyZ194KQotCQkJCSAqCi0JCQkJICogTXVzdCByZXNvbHZlL2RlcmVmZXJlbmNlIHRoZSBsb2NhbC9hcmcgcmVmZXJlbmNlIGZpcnN0Ci0JCQkJICovCi0JCQkJc3dpdGNoIChvcGVyYW5kWzBdLT5yZWZlcmVuY2UuY2xhc3MpIHsKLQkJCQljYXNlIEFDUElfUkVGQ0xBU1NfTE9DQUw6Ci0JCQkJY2FzZSBBQ1BJX1JFRkNMQVNTX0FSRzoKLQotCQkJCQkvKiBTZXQgT3BlcmFuZFswXSB0byB0aGUgdmFsdWUgb2YgdGhlIGxvY2FsL2FyZyAqLwotCi0JCQkJCXN0YXR1cyA9Ci0JCQkJCSAgICBhY3BpX2RzX21ldGhvZF9kYXRhX2dldF92YWx1ZQotCQkJCQkgICAgKG9wZXJhbmRbMF0tPnJlZmVyZW5jZS5jbGFzcywKLQkJCQkJICAgICBvcGVyYW5kWzBdLT5yZWZlcmVuY2UudmFsdWUsCi0JCQkJCSAgICAgd2Fsa19zdGF0ZSwgJnRlbXBfZGVzYyk7Ci0JCQkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQkJCQkJZ290byBjbGVhbnVwOwotCQkJCQl9Ci0KLQkJCQkJLyoKLQkJCQkJICogRGVsZXRlIG91ciByZWZlcmVuY2UgdG8gdGhlIGlucHV0IG9iamVjdCBhbmQKLQkJCQkJICogcG9pbnQgdG8gdGhlIG9iamVjdCBqdXN0IHJldHJpZXZlZAotCQkJCQkgKi8KLQkJCQkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKG9wZXJhbmRbMF0pOwotCQkJCQlvcGVyYW5kWzBdID0gdGVtcF9kZXNjOwotCQkJCQlicmVhazsKLQotCQkJCWNhc2UgQUNQSV9SRUZDTEFTU19SRUZPRjoKLQotCQkJCQkvKiBHZXQgdGhlIG9iamVjdCB0byB3aGljaCB0aGUgcmVmZXJlbmNlIHJlZmVycyAqLwotCi0JCQkJCXRlbXBfZGVzYyA9Ci0JCQkJCSAgICBvcGVyYW5kWzBdLT5yZWZlcmVuY2Uub2JqZWN0OwotCQkJCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2Uob3BlcmFuZFswXSk7Ci0JCQkJCW9wZXJhbmRbMF0gPSB0ZW1wX2Rlc2M7Ci0JCQkJCWJyZWFrOwotCi0JCQkJZGVmYXVsdDoKLQotCQkJCQkvKiBNdXN0IGJlIGFuIEluZGV4IG9wIC0gaGFuZGxlZCBiZWxvdyAqLwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0KLQkJCWNhc2UgQUNQSV9UWVBFX1NUUklORzoKLQkJCQlicmVhazsKLQotCQkJZGVmYXVsdDoKLQkJCQlzdGF0dXMgPSBBRV9BTUxfT1BFUkFORF9UWVBFOwotCQkJCWdvdG8gY2xlYW51cDsKLQkJCX0KLQkJfQotCi0JCWlmIChBQ1BJX0dFVF9ERVNDUklQVE9SX1RZUEUob3BlcmFuZFswXSkgIT0KLQkJICAgIEFDUElfREVTQ19UWVBFX05BTUVEKSB7Ci0JCQlpZiAoQUNQSV9HRVRfT0JKRUNUX1RZUEUob3BlcmFuZFswXSkgPT0KLQkJCSAgICBBQ1BJX1RZUEVfU1RSSU5HKSB7Ci0JCQkJLyoKLQkJCQkgKiBUaGlzIGlzIGEgZGVyZWZfb2YgKFN0cmluZykuIFRoZSBzdHJpbmcgaXMgYSByZWZlcmVuY2UKLQkJCQkgKiB0byBhIG5hbWVkIEFDUEkgb2JqZWN0LgotCQkJCSAqCi0JCQkJICogMSkgRmluZCB0aGUgb3duaW5nIE5vZGUKLQkJCQkgKiAyKSBEZXJlZmVyZW5jZSB0aGUgbm9kZSB0byBhbiBhY3R1YWwgb2JqZWN0LiBDb3VsZCBiZSBhCi0JCQkJICogICAgRmllbGQsIHNvIHdlIG5lZWQgdG8gcmVzb2x2ZSB0aGUgbm9kZSB0byBhIHZhbHVlLgotCQkJCSAqLwotCQkJCXN0YXR1cyA9Ci0JCQkJICAgIGFjcGlfbnNfZ2V0X25vZGUod2Fsa19zdGF0ZS0+c2NvcGVfaW5mby0+Ci0JCQkJCQkgICAgIHNjb3BlLm5vZGUsCi0JCQkJCQkgICAgIG9wZXJhbmRbMF0tPnN0cmluZy5wb2ludGVyLAotCQkJCQkJICAgICBBQ1BJX05TX1NFQVJDSF9QQVJFTlQsCi0JCQkJCQkgICAgIEFDUElfQ0FTVF9JTkRJUkVDVF9QVFIKLQkJCQkJCSAgICAgKHN0cnVjdAotCQkJCQkJICAgICAgYWNwaV9uYW1lc3BhY2Vfbm9kZSwKLQkJCQkJCSAgICAgICZyZXR1cm5fZGVzYykpOwotCQkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQkJCQlnb3RvIGNsZWFudXA7Ci0JCQkJfQotCi0JCQkJc3RhdHVzID0KLQkJCQkgICAgYWNwaV9leF9yZXNvbHZlX25vZGVfdG9fdmFsdWUKLQkJCQkgICAgKEFDUElfQ0FTVF9JTkRJUkVDVF9QVFIKLQkJCQkgICAgIChzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSwgJnJldHVybl9kZXNjKSwKLQkJCQkgICAgIHdhbGtfc3RhdGUpOwotCQkJCWdvdG8gY2xlYW51cDsKLQkJCX0KLQkJfQotCi0JCS8qIE9wZXJhbmRbMF0gbWF5IGhhdmUgY2hhbmdlZCBmcm9tIHRoZSBjb2RlIGFib3ZlICovCi0KLQkJaWYgKEFDUElfR0VUX0RFU0NSSVBUT1JfVFlQRShvcGVyYW5kWzBdKSA9PQotCQkgICAgQUNQSV9ERVNDX1RZUEVfTkFNRUQpIHsKLQkJCS8qCi0JCQkgKiBUaGlzIGlzIGEgZGVyZWZfb2YgKG9iamVjdF9yZWZlcmVuY2UpCi0JCQkgKiBHZXQgdGhlIGFjdHVhbCBvYmplY3QgZnJvbSB0aGUgTm9kZSAoVGhpcyBpcyB0aGUgZGVyZWZlcmVuY2UpLgotCQkJICogVGhpcyBjYXNlIG1heSBvbmx5IGhhcHBlbiB3aGVuIGEgbG9jYWxfeCBvciBhcmdfeCBpcwotCQkJICogZGVyZWZlcmVuY2VkIGFib3ZlLgotCQkJICovCi0JCQlyZXR1cm5fZGVzYyA9IGFjcGlfbnNfZ2V0X2F0dGFjaGVkX29iamVjdCgoc3RydWN0Ci0JCQkJCQkJCSAgIGFjcGlfbmFtZXNwYWNlX25vZGUKLQkJCQkJCQkJICAgKikKLQkJCQkJCQkJICBvcGVyYW5kWzBdKTsKLQkJCWFjcGlfdXRfYWRkX3JlZmVyZW5jZShyZXR1cm5fZGVzYyk7Ci0JCX0gZWxzZSB7Ci0JCQkvKgotCQkJICogVGhpcyBtdXN0IGJlIGEgcmVmZXJlbmNlIG9iamVjdCBwcm9kdWNlZCBieSBlaXRoZXIgdGhlCi0JCQkgKiBJbmRleCgpIG9yIHJlZl9vZigpIG9wZXJhdG9yCi0JCQkgKi8KLQkJCXN3aXRjaCAob3BlcmFuZFswXS0+cmVmZXJlbmNlLmNsYXNzKSB7Ci0JCQljYXNlIEFDUElfUkVGQ0xBU1NfSU5ERVg6Ci0KLQkJCQkvKgotCQkJCSAqIFRoZSB0YXJnZXQgdHlwZSBmb3IgdGhlIEluZGV4IG9wZXJhdG9yIG11c3QgYmUKLQkJCQkgKiBlaXRoZXIgYSBCdWZmZXIgb3IgYSBQYWNrYWdlCi0JCQkJICovCi0JCQkJc3dpdGNoIChvcGVyYW5kWzBdLT5yZWZlcmVuY2UudGFyZ2V0X3R5cGUpIHsKLQkJCQljYXNlIEFDUElfVFlQRV9CVUZGRVJfRklFTEQ6Ci0KLQkJCQkJdGVtcF9kZXNjID0KLQkJCQkJICAgIG9wZXJhbmRbMF0tPnJlZmVyZW5jZS5vYmplY3Q7Ci0KLQkJCQkJLyoKLQkJCQkJICogQ3JlYXRlIGEgbmV3IG9iamVjdCB0aGF0IGNvbnRhaW5zIG9uZSBlbGVtZW50IG9mIHRoZQotCQkJCQkgKiBidWZmZXIgLS0gdGhlIGVsZW1lbnQgcG9pbnRlZCB0byBieSB0aGUgaW5kZXguCi0JCQkJCSAqCi0JCQkJCSAqIE5PVEU6IGluZGV4IGludG8gYSBidWZmZXIgaXMgTk9UIGEgcG9pbnRlciB0byBhCi0JCQkJCSAqIHN1Yi1idWZmZXIgb2YgdGhlIG1haW4gYnVmZmVyLCBpdCBpcyBvbmx5IGEgcG9pbnRlciB0byBhCi0JCQkJCSAqIHNpbmdsZSBlbGVtZW50IChieXRlKSBvZiB0aGUgYnVmZmVyIQotCQkJCQkgKi8KLQkJCQkJcmV0dXJuX2Rlc2MgPQotCQkJCQkgICAgYWNwaV91dF9jcmVhdGVfaW50ZXJuYWxfb2JqZWN0Ci0JCQkJCSAgICAoQUNQSV9UWVBFX0lOVEVHRVIpOwotCQkJCQlpZiAoIXJldHVybl9kZXNjKSB7Ci0JCQkJCQlzdGF0dXMgPSBBRV9OT19NRU1PUlk7Ci0JCQkJCQlnb3RvIGNsZWFudXA7Ci0JCQkJCX0KLQotCQkJCQkvKgotCQkJCQkgKiBTaW5jZSB3ZSBhcmUgcmV0dXJuaW5nIHRoZSB2YWx1ZSBvZiB0aGUgYnVmZmVyIGF0IHRoZQotCQkJCQkgKiBpbmRleGVkIGxvY2F0aW9uLCB3ZSBkb24ndCBuZWVkIHRvIGFkZCBhbiBhZGRpdGlvbmFsCi0JCQkJCSAqIHJlZmVyZW5jZSB0byB0aGUgYnVmZmVyIGl0c2VsZi4KLQkJCQkJICovCi0JCQkJCXJldHVybl9kZXNjLT5pbnRlZ2VyLnZhbHVlID0KLQkJCQkJICAgIHRlbXBfZGVzYy0+YnVmZmVyLgotCQkJCQkgICAgcG9pbnRlcltvcGVyYW5kWzBdLT5yZWZlcmVuY2UuCi0JCQkJCQkgICAgdmFsdWVdOwotCQkJCQlicmVhazsKLQotCQkJCWNhc2UgQUNQSV9UWVBFX1BBQ0tBR0U6Ci0KLQkJCQkJLyoKLQkJCQkJICogUmV0dXJuIHRoZSByZWZlcmVuY2VkIGVsZW1lbnQgb2YgdGhlIHBhY2thZ2UuICBXZSBtdXN0Ci0JCQkJCSAqIGFkZCBhbm90aGVyIHJlZmVyZW5jZSB0byB0aGUgcmVmZXJlbmNlZCBvYmplY3QsIGhvd2V2ZXIuCi0JCQkJCSAqLwotCQkJCQlyZXR1cm5fZGVzYyA9Ci0JCQkJCSAgICAqKG9wZXJhbmRbMF0tPnJlZmVyZW5jZS53aGVyZSk7Ci0JCQkJCWlmIChyZXR1cm5fZGVzYykgewotCQkJCQkJYWNwaV91dF9hZGRfcmVmZXJlbmNlCi0JCQkJCQkgICAgKHJldHVybl9kZXNjKTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQotCQkJCWRlZmF1bHQ6Ci0KLQkJCQkJQUNQSV9FUlJPUigoQUVfSU5GTywKLQkJCQkJCSAgICAiVW5rbm93biBJbmRleCBUYXJnZXRUeXBlICVYIGluIHJlZmVyZW5jZSBvYmplY3QgJXAiLAotCQkJCQkJICAgIG9wZXJhbmRbMF0tPnJlZmVyZW5jZS4KLQkJCQkJCSAgICB0YXJnZXRfdHlwZSwgb3BlcmFuZFswXSkpOwotCQkJCQlzdGF0dXMgPSBBRV9BTUxfT1BFUkFORF9UWVBFOwotCQkJCQlnb3RvIGNsZWFudXA7Ci0JCQkJfQotCQkJCWJyZWFrOwotCi0JCQljYXNlIEFDUElfUkVGQ0xBU1NfUkVGT0Y6Ci0KLQkJCQlyZXR1cm5fZGVzYyA9IG9wZXJhbmRbMF0tPnJlZmVyZW5jZS5vYmplY3Q7Ci0KLQkJCQlpZiAoQUNQSV9HRVRfREVTQ1JJUFRPUl9UWVBFKHJldHVybl9kZXNjKSA9PQotCQkJCSAgICBBQ1BJX0RFU0NfVFlQRV9OQU1FRCkgewotCQkJCQlyZXR1cm5fZGVzYyA9Ci0JCQkJCSAgICBhY3BpX25zX2dldF9hdHRhY2hlZF9vYmplY3QoKHN0cnVjdAotCQkJCQkJCQkJIGFjcGlfbmFtZXNwYWNlX25vZGUKLQkJCQkJCQkJCSAqKQotCQkJCQkJCQkJcmV0dXJuX2Rlc2MpOwotCQkJCX0KLQotCQkJCS8qIEFkZCBhbm90aGVyIHJlZmVyZW5jZSB0byB0aGUgb2JqZWN0ISAqLwotCi0JCQkJYWNwaV91dF9hZGRfcmVmZXJlbmNlKHJldHVybl9kZXNjKTsKLQkJCQlicmVhazsKLQotCQkJZGVmYXVsdDoKLQkJCQlBQ1BJX0VSUk9SKChBRV9JTkZPLAotCQkJCQkgICAgIlVua25vd24gY2xhc3MgaW4gcmVmZXJlbmNlKCVwKSAtICUyLjJYIiwKLQkJCQkJICAgIG9wZXJhbmRbMF0sCi0JCQkJCSAgICBvcGVyYW5kWzBdLT5yZWZlcmVuY2UuY2xhc3MpKTsKLQotCQkJCXN0YXR1cyA9IEFFX1RZUEU7Ci0JCQkJZ290byBjbGVhbnVwOwotCQkJfQotCQl9Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQotCQlBQ1BJX0VSUk9SKChBRV9JTkZPLCAiVW5rbm93biBBTUwgb3Bjb2RlICVYIiwKLQkJCSAgICB3YWxrX3N0YXRlLT5vcGNvZGUpKTsKLQkJc3RhdHVzID0gQUVfQU1MX0JBRF9PUENPREU7Ci0JCWdvdG8gY2xlYW51cDsKLQl9Ci0KLSAgICAgIGNsZWFudXA6Ci0KLQkvKiBEZWxldGUgcmV0dXJuIG9iamVjdCBvbiBlcnJvciAqLwotCi0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZShyZXR1cm5fZGVzYyk7Ci0JfQotCi0JLyogU2F2ZSByZXR1cm4gb2JqZWN0IG9uIHN1Y2Nlc3MgKi8KLQotCWVsc2UgewotCQl3YWxrX3N0YXRlLT5yZXN1bHRfb2JqID0gcmV0dXJuX2Rlc2M7Ci0JfQotCi0JcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhvcGFyZzIuYyBiL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leG9wYXJnMi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjhkZWY1Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leG9wYXJnMi5jCisrKyAvZGV2L251bGwKQEAgLTEsNjA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBNb2R1bGUgTmFtZTogZXhvcGFyZzIgLSBBTUwgZXhlY3V0aW9uIC0gb3Bjb2RlcyB3aXRoIDIgYXJndW1lbnRzCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwOCwgSW50ZWwgQ29ycC4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKLSAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIGF0IG1pbmltdW0gYSBkaXNjbGFpbWVyCi0gKiAgICBzdWJzdGFudGlhbGx5IHNpbWlsYXIgdG8gdGhlICJOTyBXQVJSQU5UWSIgZGlzY2xhaW1lciBiZWxvdwotICogICAgKCJEaXNjbGFpbWVyIikgYW5kIGFueSByZWRpc3RyaWJ1dGlvbiBtdXN0IGJlIGNvbmRpdGlvbmVkIHVwb24KLSAqICAgIGluY2x1ZGluZyBhIHN1YnN0YW50aWFsbHkgc2ltaWxhciBEaXNjbGFpbWVyIHJlcXVpcmVtZW50IGZvciBmdXJ0aGVyCi0gKiAgICBiaW5hcnkgcmVkaXN0cmlidXRpb24uCi0gKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMKLSAqICAgIG9mIGFueSBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTk8gV0FSUkFOVFkKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAotICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKLSAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HCi0gKiBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKLSAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KLSAqLwotCi0jaW5jbHVkZSA8YWNwaS9hY3BpLmg+Ci0jaW5jbHVkZSA8YWNwaS9hY3BhcnNlci5oPgotI2luY2x1ZGUgPGFjcGkvYWNpbnRlcnAuaD4KLSNpbmNsdWRlIDxhY3BpL2FjZXZlbnRzLmg+Ci0jaW5jbHVkZSA8YWNwaS9hbWxjb2RlLmg+Ci0KLSNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX0VYRUNVVEVSCi1BQ1BJX01PRFVMRV9OQU1FKCJleG9wYXJnMiIpCi0KLS8qIQotICogTmFtaW5nIGNvbnZlbnRpb24gZm9yIEFNTCBpbnRlcnByZXRlciBleGVjdXRpb24gcm91dGluZXMuCi0gKgotICogVGhlIHJvdXRpbmVzIHRoYXQgYmVnaW4gZXhlY3V0aW9uIG9mIEFNTCBvcGNvZGVzIGFyZSBuYW1lZCB3aXRoIGEgY29tbW9uCi0gKiBjb252ZW50aW9uIGJhc2VkIHVwb24gdGhlIG51bWJlciBvZiBhcmd1bWVudHMsIHRoZSBudW1iZXIgb2YgdGFyZ2V0IG9wZXJhbmRzLAotICogYW5kIHdoZXRoZXIgb3Igbm90IGEgdmFsdWUgaXMgcmV0dXJuZWQ6Ci0gKgotICogICAgICBBY3BpRXhPcGNvZGVfeEFfeVRfelIKLSAqCi0gKiBXaGVyZToKLSAqCi0gKiB4QSAtIEFSR1VNRU5UUzogICAgVGhlIG51bWJlciBvZiBhcmd1bWVudHMgKGlucHV0IG9wZXJhbmRzKSB0aGF0IGFyZQotICogICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkIGZvciB0aGlzIG9wY29kZSB0eXBlICgxIHRocm91Z2ggNiBhcmdzKS4KLSAqIHlUIC0gVEFSR0VUUzogICAgICBUaGUgbnVtYmVyIG9mIHRhcmdldHMgKG91dHB1dCBvcGVyYW5kcykgdGhhdCBhcmUgcmVxdWlyZWQKLSAqICAgICAgICAgICAgICAgICAgICBmb3IgdGhpcyBvcGNvZGUgdHlwZSAoMCwgMSwgb3IgMiB0YXJnZXRzKS4KLSAqIHpSIC0gUkVUVVJOIFZBTFVFOiBJbmRpY2F0ZXMgd2hldGhlciB0aGlzIG9wY29kZSB0eXBlIHJldHVybnMgYSB2YWx1ZQotICogICAgICAgICAgICAgICAgICAgIGFzIHRoZSBmdW5jdGlvbiByZXR1cm4gKDAgb3IgMSkuCi0gKgotICogVGhlIEFjcGlFeE9wY29kZSogZnVuY3Rpb25zIGFyZSBjYWxsZWQgdmlhIHRoZSBEaXNwYXRjaGVyIGNvbXBvbmVudCB3aXRoCi0gKiBmdWxseSByZXNvbHZlZCBvcGVyYW5kcy4KLSEqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9leF9vcGNvZGVfMkFfMFRfMFIKLSAqCi0gKiBQQVJBTUVURVJTOiAgd2Fsa19zdGF0ZSAgICAgICAgICAtIEN1cnJlbnQgd2FsayBzdGF0ZQotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKLSAqCi0gKiBERVNDUklQVElPTjogRXhlY3V0ZSBvcGNvZGUgd2l0aCB0d28gYXJndW1lbnRzLCBubyB0YXJnZXQsIGFuZCBubyByZXR1cm4KLSAqICAgICAgICAgICAgICB2YWx1ZS4KLSAqCi0gKiBBTExPQ0FUSU9OOiAgRGVsZXRlcyBib3RoIG9wZXJhbmRzCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWFjcGlfc3RhdHVzIGFjcGlfZXhfb3Bjb2RlXzJBXzBUXzBSKHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUpCi17Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKm9wZXJhbmQgPSAmd2Fsa19zdGF0ZS0+b3BlcmFuZHNbMF07Ci0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGU7Ci0JdTMyIHZhbHVlOwotCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOwotCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9TVFIoZXhfb3Bjb2RlXzJBXzBUXzBSLAotCQkJCWFjcGlfcHNfZ2V0X29wY29kZV9uYW1lKHdhbGtfc3RhdGUtPm9wY29kZSkpOwotCi0JLyogRXhhbWluZSB0aGUgb3Bjb2RlICovCi0KLQlzd2l0Y2ggKHdhbGtfc3RhdGUtPm9wY29kZSkgewotCWNhc2UgQU1MX05PVElGWV9PUDoJLyogTm90aWZ5IChub3RpZnlfb2JqZWN0LCBub3RpZnlfdmFsdWUpICovCi0KLQkJLyogVGhlIGZpcnN0IG9wZXJhbmQgaXMgYSBuYW1lc3BhY2Ugbm9kZSAqLwotCi0JCW5vZGUgPSAoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKilvcGVyYW5kWzBdOwotCi0JCS8qIFNlY29uZCB2YWx1ZSBpcyB0aGUgbm90aWZ5IHZhbHVlICovCi0KLQkJdmFsdWUgPSAodTMyKSBvcGVyYW5kWzFdLT5pbnRlZ2VyLnZhbHVlOwotCi0JCS8qIEFyZSBub3RpZmllcyBhbGxvd2VkIG9uIHRoaXMgb2JqZWN0PyAqLwotCi0JCWlmICghYWNwaV9ldl9pc19ub3RpZnlfb2JqZWN0KG5vZGUpKSB7Ci0JCQlBQ1BJX0VSUk9SKChBRV9JTkZPLAotCQkJCSAgICAiVW5leHBlY3RlZCBub3RpZnkgb2JqZWN0IHR5cGUgWyVzXSIsCi0JCQkJICAgIGFjcGlfdXRfZ2V0X3R5cGVfbmFtZShub2RlLT50eXBlKSkpOwotCi0JCQlzdGF0dXMgPSBBRV9BTUxfT1BFUkFORF9UWVBFOwotCQkJYnJlYWs7Ci0JCX0KLSNpZmRlZiBBQ1BJX0dQRV9OT1RJRllfQ0hFQ0sKLQkJLyoKLQkJICogR1BFIG1ldGhvZCB3YWtlL25vdGlmeSBjaGVjay4gIEhlcmUsIHdlIHdhbnQgdG8gZW5zdXJlIHRoYXQgd2UKLQkJICogZG9uJ3QgcmVjZWl2ZSBhbnkgIkRldmljZVdha2UiIE5vdGlmaWVzIGZyb20gYSBHUEUgX0x4eCBvciBfRXh4Ci0JCSAqIEdQRSBtZXRob2QgZHVyaW5nIHN5c3RlbSBydW50aW1lLiAgSWYgd2UgZG8sIHRoZSBHUEUgaXMgbWFya2VkCi0JCSAqIGFzICJ3YWtlLW9ubHkiIGFuZCBkaXNhYmxlZC4KLQkJICoKLQkJICogMSkgSXMgdGhlIE5vdGlmeSgpIHZhbHVlID09IGRldmljZV93YWtlPwotCQkgKiAyKSBJcyB0aGlzIGEgR1BFIGRlZmVycmVkIG1ldGhvZD8gIChBbiBfTHh4IG9yIF9FeHggbWV0aG9kKQotCQkgKiAzKSBEaWQgdGhlIG9yaWdpbmFsIEdQRSBoYXBwZW4gYXQgc3lzdGVtIHJ1bnRpbWU/Ci0JCSAqICAgICh2ZXJzdXMgZHVyaW5nIHdha2UpCi0JCSAqCi0JCSAqIElmIGFsbCB0aHJlZSBjYXNlcyBhcmUgdHJ1ZSwgdGhpcyBpcyBhIHdha2Utb25seSBHUEUgdGhhdCBzaG91bGQKLQkJICogYmUgZGlzYWJsZWQgYXQgcnVudGltZS4KLQkJICovCi0JCWlmICh2YWx1ZSA9PSAyKSB7CS8qIGRldmljZV93YWtlICovCi0JCQlzdGF0dXMgPQotCQkJICAgIGFjcGlfZXZfY2hlY2tfZm9yX3dha2Vfb25seV9ncGUod2Fsa19zdGF0ZS0+Ci0JCQkJCQkJICAgIGdwZV9ldmVudF9pbmZvKTsKLQkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCi0JCQkJLyogQUVfV0FLRV9PTkxZX0dQRSBvbmx5IGVycm9yLCBtZWFucyBpZ25vcmUgdGhpcyBub3RpZnkgKi8KLQotCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSykKLQkJCX0KLQkJfQotI2VuZGlmCi0KLQkJLyoKLQkJICogRGlzcGF0Y2ggdGhlIG5vdGlmeSB0byB0aGUgYXBwcm9wcmlhdGUgaGFuZGxlcgotCQkgKiBOT1RFOiB0aGUgcmVxdWVzdCBpcyBxdWV1ZWQgZm9yIGV4ZWN1dGlvbiBhZnRlciB0aGlzIG1ldGhvZAotCQkgKiBjb21wbGV0ZXMuICBUaGUgbm90aWZ5IGhhbmRsZXJzIGFyZSBOT1QgaW52b2tlZCBzeW5jaHJvbm91c2x5Ci0JCSAqIGZyb20gdGhpcyB0aHJlYWQgLS0gYmVjYXVzZSBoYW5kbGVycyBtYXkgaW4gdHVybiBydW4gb3RoZXIKLQkJICogY29udHJvbCBtZXRob2RzLgotCQkgKi8KLQkJc3RhdHVzID0gYWNwaV9ldl9xdWV1ZV9ub3RpZnlfcmVxdWVzdChub2RlLCB2YWx1ZSk7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQotCQlBQ1BJX0VSUk9SKChBRV9JTkZPLCAiVW5rbm93biBBTUwgb3Bjb2RlICVYIiwKLQkJCSAgICB3YWxrX3N0YXRlLT5vcGNvZGUpKTsKLQkJc3RhdHVzID0gQUVfQU1MX0JBRF9PUENPREU7Ci0JfQotCi0JcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfZXhfb3Bjb2RlXzJBXzJUXzFSCi0gKgotICogUEFSQU1FVEVSUzogIHdhbGtfc3RhdGUgICAgICAgICAgLSBDdXJyZW50IHdhbGsgc3RhdGUKLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IEV4ZWN1dGUgYSBkeWFkaWMgb3BlcmF0b3IgKDIgb3BlcmFuZHMpIHdpdGggMiBvdXRwdXQgdGFyZ2V0cwotICogICAgICAgICAgICAgIGFuZCBvbmUgaW1wbGljaXQgcmV0dXJuIHZhbHVlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWFjcGlfc3RhdHVzIGFjcGlfZXhfb3Bjb2RlXzJBXzJUXzFSKHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUpCi17Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKm9wZXJhbmQgPSAmd2Fsa19zdGF0ZS0+b3BlcmFuZHNbMF07Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqcmV0dXJuX2Rlc2MxID0gTlVMTDsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpyZXR1cm5fZGVzYzIgPSBOVUxMOwotCWFjcGlfc3RhdHVzIHN0YXR1czsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0VfU1RSKGV4X29wY29kZV8yQV8yVF8xUiwKLQkJCQlhY3BpX3BzX2dldF9vcGNvZGVfbmFtZSh3YWxrX3N0YXRlLT5vcGNvZGUpKTsKLQotCS8qIEV4ZWN1dGUgdGhlIG9wY29kZSAqLwotCi0Jc3dpdGNoICh3YWxrX3N0YXRlLT5vcGNvZGUpIHsKLQljYXNlIEFNTF9ESVZJREVfT1A6Ci0KLQkJLyogRGl2aWRlIChEaXZpZGVuZCwgRGl2aXNvciwgcmVtYWluZGVyX3Jlc3VsdCBxdW90aWVudF9yZXN1bHQpICovCi0KLQkJcmV0dXJuX2Rlc2MxID0KLQkJICAgIGFjcGlfdXRfY3JlYXRlX2ludGVybmFsX29iamVjdChBQ1BJX1RZUEVfSU5URUdFUik7Ci0JCWlmICghcmV0dXJuX2Rlc2MxKSB7Ci0JCQlzdGF0dXMgPSBBRV9OT19NRU1PUlk7Ci0JCQlnb3RvIGNsZWFudXA7Ci0JCX0KLQotCQlyZXR1cm5fZGVzYzIgPQotCQkgICAgYWNwaV91dF9jcmVhdGVfaW50ZXJuYWxfb2JqZWN0KEFDUElfVFlQRV9JTlRFR0VSKTsKLQkJaWYgKCFyZXR1cm5fZGVzYzIpIHsKLQkJCXN0YXR1cyA9IEFFX05PX01FTU9SWTsKLQkJCWdvdG8gY2xlYW51cDsKLQkJfQotCi0JCS8qIFF1b3RpZW50IHRvIHJldHVybl9kZXNjMSwgcmVtYWluZGVyIHRvIHJldHVybl9kZXNjMiAqLwotCi0JCXN0YXR1cyA9IGFjcGlfdXRfZGl2aWRlKG9wZXJhbmRbMF0tPmludGVnZXIudmFsdWUsCi0JCQkJCW9wZXJhbmRbMV0tPmludGVnZXIudmFsdWUsCi0JCQkJCSZyZXR1cm5fZGVzYzEtPmludGVnZXIudmFsdWUsCi0JCQkJCSZyZXR1cm5fZGVzYzItPmludGVnZXIudmFsdWUpOwotCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJCWdvdG8gY2xlYW51cDsKLQkJfQotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0KLQkJQUNQSV9FUlJPUigoQUVfSU5GTywgIlVua25vd24gQU1MIG9wY29kZSAlWCIsCi0JCQkgICAgd2Fsa19zdGF0ZS0+b3Bjb2RlKSk7Ci0JCXN0YXR1cyA9IEFFX0FNTF9CQURfT1BDT0RFOwotCQlnb3RvIGNsZWFudXA7Ci0JfQotCi0JLyogU3RvcmUgdGhlIHJlc3VsdHMgdG8gdGhlIHRhcmdldCByZWZlcmVuY2Ugb3BlcmFuZHMgKi8KLQotCXN0YXR1cyA9IGFjcGlfZXhfc3RvcmUocmV0dXJuX2Rlc2MyLCBvcGVyYW5kWzJdLCB3YWxrX3N0YXRlKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJZ290byBjbGVhbnVwOwotCX0KLQotCXN0YXR1cyA9IGFjcGlfZXhfc3RvcmUocmV0dXJuX2Rlc2MxLCBvcGVyYW5kWzNdLCB3YWxrX3N0YXRlKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJZ290byBjbGVhbnVwOwotCX0KLQotICAgICAgY2xlYW51cDoKLQkvKgotCSAqIFNpbmNlIHRoZSByZW1haW5kZXIgaXMgbm90IHJldHVybmVkIGluZGlyZWN0bHksIHJlbW92ZSBhIHJlZmVyZW5jZSB0bwotCSAqIGl0LiBPbmx5IHRoZSBxdW90aWVudCBpcyByZXR1cm5lZCBpbmRpcmVjdGx5LgotCSAqLwotCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZShyZXR1cm5fZGVzYzIpOwotCi0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0KLQkJLyogRGVsZXRlIHRoZSByZXR1cm4gb2JqZWN0ICovCi0KLQkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKHJldHVybl9kZXNjMSk7Ci0JfQotCi0JLyogU2F2ZSByZXR1cm4gb2JqZWN0ICh0aGUgcmVtYWluZGVyKSBvbiBzdWNjZXNzICovCi0KLQllbHNlIHsKLQkJd2Fsa19zdGF0ZS0+cmVzdWx0X29iaiA9IHJldHVybl9kZXNjMTsKLQl9Ci0KLQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9leF9vcGNvZGVfMkFfMVRfMVIKLSAqCi0gKiBQQVJBTUVURVJTOiAgd2Fsa19zdGF0ZSAgICAgICAgICAtIEN1cnJlbnQgd2FsayBzdGF0ZQotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKLSAqCi0gKiBERVNDUklQVElPTjogRXhlY3V0ZSBvcGNvZGUgd2l0aCB0d28gYXJndW1lbnRzLCBvbmUgdGFyZ2V0LCBhbmQgYSByZXR1cm4KLSAqICAgICAgICAgICAgICB2YWx1ZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1hY3BpX3N0YXR1cyBhY3BpX2V4X29wY29kZV8yQV8xVF8xUihzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKQotewotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKipvcGVyYW5kID0gJndhbGtfc3RhdGUtPm9wZXJhbmRzWzBdOwotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnJldHVybl9kZXNjID0gTlVMTDsKLQlhY3BpX2ludGVnZXIgaW5kZXg7Ci0JYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7Ci0JYWNwaV9zaXplIGxlbmd0aDsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0VfU1RSKGV4X29wY29kZV8yQV8xVF8xUiwKLQkJCQlhY3BpX3BzX2dldF9vcGNvZGVfbmFtZSh3YWxrX3N0YXRlLT5vcGNvZGUpKTsKLQotCS8qIEV4ZWN1dGUgdGhlIG9wY29kZSAqLwotCi0JaWYgKHdhbGtfc3RhdGUtPm9wX2luZm8tPmZsYWdzICYgQU1MX01BVEgpIHsKLQotCQkvKiBBbGwgc2ltcGxlIG1hdGggb3Bjb2RlcyAoYWRkLCBldGMuKSAqLwotCi0JCXJldHVybl9kZXNjID0gYWNwaV91dF9jcmVhdGVfaW50ZXJuYWxfb2JqZWN0KEFDUElfVFlQRV9JTlRFR0VSKTsKLQkJaWYgKCFyZXR1cm5fZGVzYykgewotCQkJc3RhdHVzID0gQUVfTk9fTUVNT1JZOwotCQkJZ290byBjbGVhbnVwOwotCQl9Ci0KLQkJcmV0dXJuX2Rlc2MtPmludGVnZXIudmFsdWUgPQotCQkgICAgYWNwaV9leF9kb19tYXRoX29wKHdhbGtfc3RhdGUtPm9wY29kZSwKLQkJCQkgICAgICAgb3BlcmFuZFswXS0+aW50ZWdlci52YWx1ZSwKLQkJCQkgICAgICAgb3BlcmFuZFsxXS0+aW50ZWdlci52YWx1ZSk7Ci0JCWdvdG8gc3RvcmVfcmVzdWx0X3RvX3RhcmdldDsKLQl9Ci0KLQlzd2l0Y2ggKHdhbGtfc3RhdGUtPm9wY29kZSkgewotCWNhc2UgQU1MX01PRF9PUDoJLyogTW9kIChEaXZpZGVuZCwgRGl2aXNvciwgcmVtYWluZGVyX3Jlc3VsdCAoQUNQSSAyLjApICovCi0KLQkJcmV0dXJuX2Rlc2MgPSBhY3BpX3V0X2NyZWF0ZV9pbnRlcm5hbF9vYmplY3QoQUNQSV9UWVBFX0lOVEVHRVIpOwotCQlpZiAoIXJldHVybl9kZXNjKSB7Ci0JCQlzdGF0dXMgPSBBRV9OT19NRU1PUlk7Ci0JCQlnb3RvIGNsZWFudXA7Ci0JCX0KLQotCQkvKiByZXR1cm5fZGVzYyB3aWxsIGNvbnRhaW4gdGhlIHJlbWFpbmRlciAqLwotCi0JCXN0YXR1cyA9IGFjcGlfdXRfZGl2aWRlKG9wZXJhbmRbMF0tPmludGVnZXIudmFsdWUsCi0JCQkJCW9wZXJhbmRbMV0tPmludGVnZXIudmFsdWUsCi0JCQkJCU5VTEwsICZyZXR1cm5fZGVzYy0+aW50ZWdlci52YWx1ZSk7Ci0JCWJyZWFrOwotCi0JY2FzZSBBTUxfQ09OQ0FUX09QOgkvKiBDb25jYXRlbmF0ZSAoRGF0YTEsIERhdGEyLCBSZXN1bHQpICovCi0KLQkJc3RhdHVzID0gYWNwaV9leF9kb19jb25jYXRlbmF0ZShvcGVyYW5kWzBdLCBvcGVyYW5kWzFdLAotCQkJCQkJJnJldHVybl9kZXNjLCB3YWxrX3N0YXRlKTsKLQkJYnJlYWs7Ci0KLQljYXNlIEFNTF9UT19TVFJJTkdfT1A6CS8qIHRvX3N0cmluZyAoQnVmZmVyLCBMZW5ndGgsIFJlc3VsdCkgKEFDUEkgMi4wKSAqLwotCi0JCS8qCi0JCSAqIElucHV0IG9iamVjdCBpcyBndWFyYW50ZWVkIHRvIGJlIGEgYnVmZmVyIGF0IHRoaXMgcG9pbnQgKGl0IG1heSBoYXZlCi0JCSAqIGJlZW4gY29udmVydGVkLikgIENvcHkgdGhlIHJhdyBidWZmZXIgZGF0YSB0byBhIG5ldyBvYmplY3Qgb2YKLQkJICogdHlwZSBTdHJpbmcuCi0JCSAqLwotCi0JCS8qCi0JCSAqIEdldCB0aGUgbGVuZ3RoIG9mIHRoZSBuZXcgc3RyaW5nLiBJdCBpcyB0aGUgc21hbGxlc3Qgb2Y6Ci0JCSAqIDEpIExlbmd0aCBvZiB0aGUgaW5wdXQgYnVmZmVyCi0JCSAqIDIpIE1heCBsZW5ndGggYXMgc3BlY2lmaWVkIGluIHRoZSB0b19zdHJpbmcgb3BlcmF0b3IKLQkJICogMykgTGVuZ3RoIG9mIGlucHV0IGJ1ZmZlciB1cCB0byBhIHplcm8gYnl0ZSAobnVsbCB0ZXJtaW5hdG9yKQotCQkgKgotCQkgKiBOT1RFOiBBIGxlbmd0aCBvZiB6ZXJvIGlzIG9rLCBhbmQgd2lsbCBjcmVhdGUgYSB6ZXJvLWxlbmd0aCwgbnVsbAotCQkgKiAgICAgICB0ZXJtaW5hdGVkIHN0cmluZy4KLQkJICovCi0JCWxlbmd0aCA9IDA7Ci0JCXdoaWxlICgobGVuZ3RoIDwgb3BlcmFuZFswXS0+YnVmZmVyLmxlbmd0aCkgJiYKLQkJICAgICAgIChsZW5ndGggPCBvcGVyYW5kWzFdLT5pbnRlZ2VyLnZhbHVlKSAmJgotCQkgICAgICAgKG9wZXJhbmRbMF0tPmJ1ZmZlci5wb2ludGVyW2xlbmd0aF0pKSB7Ci0JCQlsZW5ndGgrKzsKLQkJfQotCi0JCS8qIEFsbG9jYXRlIGEgbmV3IHN0cmluZyBvYmplY3QgKi8KLQotCQlyZXR1cm5fZGVzYyA9IGFjcGlfdXRfY3JlYXRlX3N0cmluZ19vYmplY3QobGVuZ3RoKTsKLQkJaWYgKCFyZXR1cm5fZGVzYykgewotCQkJc3RhdHVzID0gQUVfTk9fTUVNT1JZOwotCQkJZ290byBjbGVhbnVwOwotCQl9Ci0KLQkJLyoKLQkJICogQ29weSB0aGUgcmF3IGJ1ZmZlciBkYXRhIHdpdGggbm8gdHJhbnNmb3JtLgotCQkgKiAoTlVMTCB0ZXJtaW5hdGVkIGFscmVhZHkpCi0JCSAqLwotCQlBQ1BJX01FTUNQWShyZXR1cm5fZGVzYy0+c3RyaW5nLnBvaW50ZXIsCi0JCQkgICAgb3BlcmFuZFswXS0+YnVmZmVyLnBvaW50ZXIsIGxlbmd0aCk7Ci0JCWJyZWFrOwotCi0JY2FzZSBBTUxfQ09OQ0FUX1JFU19PUDoKLQotCQkvKiBjb25jYXRlbmF0ZV9yZXNfdGVtcGxhdGUgKEJ1ZmZlciwgQnVmZmVyLCBSZXN1bHQpIChBQ1BJIDIuMCkgKi8KLQotCQlzdGF0dXMgPSBhY3BpX2V4X2NvbmNhdF90ZW1wbGF0ZShvcGVyYW5kWzBdLCBvcGVyYW5kWzFdLAotCQkJCQkJICZyZXR1cm5fZGVzYywgd2Fsa19zdGF0ZSk7Ci0JCWJyZWFrOwotCi0JY2FzZSBBTUxfSU5ERVhfT1A6CS8qIEluZGV4IChTb3VyY2UgSW5kZXggUmVzdWx0KSAqLwotCi0JCS8qIENyZWF0ZSB0aGUgaW50ZXJuYWwgcmV0dXJuIG9iamVjdCAqLwotCi0JCXJldHVybl9kZXNjID0KLQkJICAgIGFjcGlfdXRfY3JlYXRlX2ludGVybmFsX29iamVjdChBQ1BJX1RZUEVfTE9DQUxfUkVGRVJFTkNFKTsKLQkJaWYgKCFyZXR1cm5fZGVzYykgewotCQkJc3RhdHVzID0gQUVfTk9fTUVNT1JZOwotCQkJZ290byBjbGVhbnVwOwotCQl9Ci0KLQkJLyogSW5pdGlhbGl6ZSB0aGUgSW5kZXggcmVmZXJlbmNlIG9iamVjdCAqLwotCi0JCWluZGV4ID0gb3BlcmFuZFsxXS0+aW50ZWdlci52YWx1ZTsKLQkJcmV0dXJuX2Rlc2MtPnJlZmVyZW5jZS52YWx1ZSA9ICh1MzIpIGluZGV4OwotCQlyZXR1cm5fZGVzYy0+cmVmZXJlbmNlLmNsYXNzID0gQUNQSV9SRUZDTEFTU19JTkRFWDsKLQotCQkvKgotCQkgKiBBdCB0aGlzIHBvaW50LCB0aGUgU291cmNlIG9wZXJhbmQgaXMgYSBTdHJpbmcsIEJ1ZmZlciwgb3IgUGFja2FnZS4KLQkJICogVmVyaWZ5IHRoYXQgdGhlIGluZGV4IGlzIHdpdGhpbiByYW5nZS4KLQkJICovCi0JCXN3aXRjaCAoQUNQSV9HRVRfT0JKRUNUX1RZUEUob3BlcmFuZFswXSkpIHsKLQkJY2FzZSBBQ1BJX1RZUEVfU1RSSU5HOgotCi0JCQlpZiAoaW5kZXggPj0gb3BlcmFuZFswXS0+c3RyaW5nLmxlbmd0aCkgewotCQkJCXN0YXR1cyA9IEFFX0FNTF9TVFJJTkdfTElNSVQ7Ci0JCQl9Ci0KLQkJCXJldHVybl9kZXNjLT5yZWZlcmVuY2UudGFyZ2V0X3R5cGUgPQotCQkJICAgIEFDUElfVFlQRV9CVUZGRVJfRklFTEQ7Ci0JCQlicmVhazsKLQotCQljYXNlIEFDUElfVFlQRV9CVUZGRVI6Ci0KLQkJCWlmIChpbmRleCA+PSBvcGVyYW5kWzBdLT5idWZmZXIubGVuZ3RoKSB7Ci0JCQkJc3RhdHVzID0gQUVfQU1MX0JVRkZFUl9MSU1JVDsKLQkJCX0KLQotCQkJcmV0dXJuX2Rlc2MtPnJlZmVyZW5jZS50YXJnZXRfdHlwZSA9Ci0JCQkgICAgQUNQSV9UWVBFX0JVRkZFUl9GSUVMRDsKLQkJCWJyZWFrOwotCi0JCWNhc2UgQUNQSV9UWVBFX1BBQ0tBR0U6Ci0KLQkJCWlmIChpbmRleCA+PSBvcGVyYW5kWzBdLT5wYWNrYWdlLmNvdW50KSB7Ci0JCQkJc3RhdHVzID0gQUVfQU1MX1BBQ0tBR0VfTElNSVQ7Ci0JCQl9Ci0KLQkJCXJldHVybl9kZXNjLT5yZWZlcmVuY2UudGFyZ2V0X3R5cGUgPSBBQ1BJX1RZUEVfUEFDS0FHRTsKLQkJCXJldHVybl9kZXNjLT5yZWZlcmVuY2Uud2hlcmUgPQotCQkJICAgICZvcGVyYW5kWzBdLT5wYWNrYWdlLmVsZW1lbnRzW2luZGV4XTsKLQkJCWJyZWFrOwotCi0JCWRlZmF1bHQ6Ci0KLQkJCXN0YXR1cyA9IEFFX0FNTF9JTlRFUk5BTDsKLQkJCWdvdG8gY2xlYW51cDsKLQkJfQotCi0JCS8qIEZhaWx1cmUgbWVhbnMgdGhhdCB0aGUgSW5kZXggd2FzIGJleW9uZCB0aGUgZW5kIG9mIHRoZSBvYmplY3QgKi8KLQotCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJCUFDUElfRVhDRVBUSU9OKChBRV9JTkZPLCBzdGF0dXMsCi0JCQkJCSJJbmRleCAoJVglOC44WCkgaXMgYmV5b25kIGVuZCBvZiBvYmplY3QiLAotCQkJCQlBQ1BJX0ZPUk1BVF9VSU5UNjQoaW5kZXgpKSk7Ci0JCQlnb3RvIGNsZWFudXA7Ci0JCX0KLQotCQkvKgotCQkgKiBTYXZlIHRoZSB0YXJnZXQgb2JqZWN0IGFuZCBhZGQgYSByZWZlcmVuY2UgdG8gaXQgZm9yIHRoZSBsaWZlCi0JCSAqIG9mIHRoZSBpbmRleAotCQkgKi8KLQkJcmV0dXJuX2Rlc2MtPnJlZmVyZW5jZS5vYmplY3QgPSBvcGVyYW5kWzBdOwotCQlhY3BpX3V0X2FkZF9yZWZlcmVuY2Uob3BlcmFuZFswXSk7Ci0KLQkJLyogU3RvcmUgdGhlIHJlZmVyZW5jZSB0byB0aGUgVGFyZ2V0ICovCi0KLQkJc3RhdHVzID0gYWNwaV9leF9zdG9yZShyZXR1cm5fZGVzYywgb3BlcmFuZFsyXSwgd2Fsa19zdGF0ZSk7Ci0KLQkJLyogUmV0dXJuIHRoZSByZWZlcmVuY2UgKi8KLQotCQl3YWxrX3N0YXRlLT5yZXN1bHRfb2JqID0gcmV0dXJuX2Rlc2M7Ci0JCWdvdG8gY2xlYW51cDsKLQotCWRlZmF1bHQ6Ci0KLQkJQUNQSV9FUlJPUigoQUVfSU5GTywgIlVua25vd24gQU1MIG9wY29kZSAlWCIsCi0JCQkgICAgd2Fsa19zdGF0ZS0+b3Bjb2RlKSk7Ci0JCXN0YXR1cyA9IEFFX0FNTF9CQURfT1BDT0RFOwotCQlicmVhazsKLQl9Ci0KLSAgICAgIHN0b3JlX3Jlc3VsdF90b190YXJnZXQ6Ci0KLQlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpIHsKLQkJLyoKLQkJICogU3RvcmUgdGhlIHJlc3VsdCBvZiB0aGUgb3BlcmF0aW9uICh3aGljaCBpcyBub3cgaW4gcmV0dXJuX2Rlc2MpIGludG8KLQkJICogdGhlIFRhcmdldCBkZXNjcmlwdG9yLgotCQkgKi8KLQkJc3RhdHVzID0gYWNwaV9leF9zdG9yZShyZXR1cm5fZGVzYywgb3BlcmFuZFsyXSwgd2Fsa19zdGF0ZSk7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQkJZ290byBjbGVhbnVwOwotCQl9Ci0KLQkJaWYgKCF3YWxrX3N0YXRlLT5yZXN1bHRfb2JqKSB7Ci0JCQl3YWxrX3N0YXRlLT5yZXN1bHRfb2JqID0gcmV0dXJuX2Rlc2M7Ci0JCX0KLQl9Ci0KLSAgICAgIGNsZWFudXA6Ci0KLQkvKiBEZWxldGUgcmV0dXJuIG9iamVjdCBvbiBlcnJvciAqLwotCi0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZShyZXR1cm5fZGVzYyk7Ci0JCXdhbGtfc3RhdGUtPnJlc3VsdF9vYmogPSBOVUxMOwotCX0KLQotCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X29wY29kZV8yQV8wVF8xUgotICoKLSAqIFBBUkFNRVRFUlM6ICB3YWxrX3N0YXRlICAgICAgICAgIC0gQ3VycmVudCB3YWxrIHN0YXRlCi0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cwotICoKLSAqIERFU0NSSVBUSU9OOiBFeGVjdXRlIG9wY29kZSB3aXRoIDIgYXJndW1lbnRzLCBubyB0YXJnZXQsIGFuZCBhIHJldHVybiB2YWx1ZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWFjcGlfc3RhdHVzIGFjcGlfZXhfb3Bjb2RlXzJBXzBUXzFSKHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUpCi17Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKm9wZXJhbmQgPSAmd2Fsa19zdGF0ZS0+b3BlcmFuZHNbMF07Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqcmV0dXJuX2Rlc2MgPSBOVUxMOwotCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOwotCXU4IGxvZ2ljYWxfcmVzdWx0ID0gRkFMU0U7Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1NUUihleF9vcGNvZGVfMkFfMFRfMVIsCi0JCQkJYWNwaV9wc19nZXRfb3Bjb2RlX25hbWUod2Fsa19zdGF0ZS0+b3Bjb2RlKSk7Ci0KLQkvKiBDcmVhdGUgdGhlIGludGVybmFsIHJldHVybiBvYmplY3QgKi8KLQotCXJldHVybl9kZXNjID0gYWNwaV91dF9jcmVhdGVfaW50ZXJuYWxfb2JqZWN0KEFDUElfVFlQRV9JTlRFR0VSKTsKLQlpZiAoIXJldHVybl9kZXNjKSB7Ci0JCXN0YXR1cyA9IEFFX05PX01FTU9SWTsKLQkJZ290byBjbGVhbnVwOwotCX0KLQotCS8qIEV4ZWN1dGUgdGhlIE9wY29kZSAqLwotCi0JaWYgKHdhbGtfc3RhdGUtPm9wX2luZm8tPmZsYWdzICYgQU1MX0xPR0lDQUxfTlVNRVJJQykgewotCi0JCS8qIGxvZ2ljYWxfb3AgKE9wZXJhbmQwLCBPcGVyYW5kMSkgKi8KLQotCQlzdGF0dXMgPSBhY3BpX2V4X2RvX2xvZ2ljYWxfbnVtZXJpY19vcCh3YWxrX3N0YXRlLT5vcGNvZGUsCi0JCQkJCQkgICAgICAgb3BlcmFuZFswXS0+aW50ZWdlci4KLQkJCQkJCSAgICAgICB2YWx1ZSwKLQkJCQkJCSAgICAgICBvcGVyYW5kWzFdLT5pbnRlZ2VyLgotCQkJCQkJICAgICAgIHZhbHVlLCAmbG9naWNhbF9yZXN1bHQpOwotCQlnb3RvIHN0b3JlX2xvZ2ljYWxfcmVzdWx0OwotCX0gZWxzZSBpZiAod2Fsa19zdGF0ZS0+b3BfaW5mby0+ZmxhZ3MgJiBBTUxfTE9HSUNBTCkgewotCi0JCS8qIGxvZ2ljYWxfb3AgKE9wZXJhbmQwLCBPcGVyYW5kMSkgKi8KLQotCQlzdGF0dXMgPSBhY3BpX2V4X2RvX2xvZ2ljYWxfb3Aod2Fsa19zdGF0ZS0+b3Bjb2RlLCBvcGVyYW5kWzBdLAotCQkJCQkgICAgICAgb3BlcmFuZFsxXSwgJmxvZ2ljYWxfcmVzdWx0KTsKLQkJZ290byBzdG9yZV9sb2dpY2FsX3Jlc3VsdDsKLQl9Ci0KLQlzd2l0Y2ggKHdhbGtfc3RhdGUtPm9wY29kZSkgewotCWNhc2UgQU1MX0FDUVVJUkVfT1A6CS8qIEFjcXVpcmUgKG11dGV4X29iamVjdCwgVGltZW91dCkgKi8KLQotCQlzdGF0dXMgPQotCQkgICAgYWNwaV9leF9hY3F1aXJlX211dGV4KG9wZXJhbmRbMV0sIG9wZXJhbmRbMF0sIHdhbGtfc3RhdGUpOwotCQlpZiAoc3RhdHVzID09IEFFX1RJTUUpIHsKLQkJCWxvZ2ljYWxfcmVzdWx0ID0gVFJVRTsJLyogVFJVRSA9IEFjcXVpcmUgdGltZWQgb3V0ICovCi0JCQlzdGF0dXMgPSBBRV9PSzsKLQkJfQotCQlicmVhazsKLQotCWNhc2UgQU1MX1dBSVRfT1A6CS8qIFdhaXQgKGV2ZW50X29iamVjdCwgVGltZW91dCkgKi8KLQotCQlzdGF0dXMgPSBhY3BpX2V4X3N5c3RlbV93YWl0X2V2ZW50KG9wZXJhbmRbMV0sIG9wZXJhbmRbMF0pOwotCQlpZiAoc3RhdHVzID09IEFFX1RJTUUpIHsKLQkJCWxvZ2ljYWxfcmVzdWx0ID0gVFJVRTsJLyogVFJVRSwgV2FpdCB0aW1lZCBvdXQgKi8KLQkJCXN0YXR1cyA9IEFFX09LOwotCQl9Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQotCQlBQ1BJX0VSUk9SKChBRV9JTkZPLCAiVW5rbm93biBBTUwgb3Bjb2RlICVYIiwKLQkJCSAgICB3YWxrX3N0YXRlLT5vcGNvZGUpKTsKLQkJc3RhdHVzID0gQUVfQU1MX0JBRF9PUENPREU7Ci0JCWdvdG8gY2xlYW51cDsKLQl9Ci0KLSAgICAgIHN0b3JlX2xvZ2ljYWxfcmVzdWx0OgotCS8qCi0JICogU2V0IHJldHVybiB2YWx1ZSB0byBhY2NvcmRpbmcgdG8gbG9naWNhbF9yZXN1bHQuIGxvZ2ljYWwgVFJVRSAoYWxsIG9uZXMpCi0JICogRGVmYXVsdCBpcyBGQUxTRSAoemVybykKLQkgKi8KLQlpZiAobG9naWNhbF9yZXN1bHQpIHsKLQkJcmV0dXJuX2Rlc2MtPmludGVnZXIudmFsdWUgPSBBQ1BJX0lOVEVHRVJfTUFYOwotCX0KLQotICAgICAgY2xlYW51cDoKLQotCS8qIERlbGV0ZSByZXR1cm4gb2JqZWN0IG9uIGVycm9yICovCi0KLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKHJldHVybl9kZXNjKTsKLQl9Ci0KLQkvKiBTYXZlIHJldHVybiBvYmplY3Qgb24gc3VjY2VzcyAqLwotCi0JZWxzZSB7Ci0JCXdhbGtfc3RhdGUtPnJlc3VsdF9vYmogPSByZXR1cm5fZGVzYzsKLQl9Ci0KLQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leG9wYXJnMy5jIGIvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4b3BhcmczLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljYjQxOTcuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4b3BhcmczLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNzIgKzAsMCBAQAotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogTW9kdWxlIE5hbWU6IGV4b3BhcmczIC0gQU1MIGV4ZWN1dGlvbiAtIG9wY29kZXMgd2l0aCAzIGFyZ3VtZW50cwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDgsIEludGVsIENvcnAuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCi0gKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSBhdCBtaW5pbXVtIGEgZGlzY2xhaW1lcgotICogICAgc3Vic3RhbnRpYWxseSBzaW1pbGFyIHRvIHRoZSAiTk8gV0FSUkFOVFkiIGRpc2NsYWltZXIgYmVsb3cKLSAqICAgICgiRGlzY2xhaW1lciIpIGFuZCBhbnkgcmVkaXN0cmlidXRpb24gbXVzdCBiZSBjb25kaXRpb25lZCB1cG9uCi0gKiAgICBpbmNsdWRpbmcgYSBzdWJzdGFudGlhbGx5IHNpbWlsYXIgRGlzY2xhaW1lciByZXF1aXJlbWVudCBmb3IgZnVydGhlcgotICogICAgYmluYXJ5IHJlZGlzdHJpYnV0aW9uLgotICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzCi0gKiAgICBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIE5PIFdBUlJBTlRZCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKLSAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCi0gKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORwotICogSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCi0gKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCi0gKi8KLQotI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgotI2luY2x1ZGUgPGFjcGkvYWNpbnRlcnAuaD4KLSNpbmNsdWRlIDxhY3BpL2FjcGFyc2VyLmg+Ci0jaW5jbHVkZSA8YWNwaS9hbWxjb2RlLmg+Ci0KLSNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX0VYRUNVVEVSCi1BQ1BJX01PRFVMRV9OQU1FKCJleG9wYXJnMyIpCi0KLS8qIQotICogTmFtaW5nIGNvbnZlbnRpb24gZm9yIEFNTCBpbnRlcnByZXRlciBleGVjdXRpb24gcm91dGluZXMuCi0gKgotICogVGhlIHJvdXRpbmVzIHRoYXQgYmVnaW4gZXhlY3V0aW9uIG9mIEFNTCBvcGNvZGVzIGFyZSBuYW1lZCB3aXRoIGEgY29tbW9uCi0gKiBjb252ZW50aW9uIGJhc2VkIHVwb24gdGhlIG51bWJlciBvZiBhcmd1bWVudHMsIHRoZSBudW1iZXIgb2YgdGFyZ2V0IG9wZXJhbmRzLAotICogYW5kIHdoZXRoZXIgb3Igbm90IGEgdmFsdWUgaXMgcmV0dXJuZWQ6Ci0gKgotICogICAgICBBY3BpRXhPcGNvZGVfeEFfeVRfelIKLSAqCi0gKiBXaGVyZToKLSAqCi0gKiB4QSAtIEFSR1VNRU5UUzogICAgVGhlIG51bWJlciBvZiBhcmd1bWVudHMgKGlucHV0IG9wZXJhbmRzKSB0aGF0IGFyZQotICogICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkIGZvciB0aGlzIG9wY29kZSB0eXBlICgxIHRocm91Z2ggNiBhcmdzKS4KLSAqIHlUIC0gVEFSR0VUUzogICAgICBUaGUgbnVtYmVyIG9mIHRhcmdldHMgKG91dHB1dCBvcGVyYW5kcykgdGhhdCBhcmUgcmVxdWlyZWQKLSAqICAgICAgICAgICAgICAgICAgICBmb3IgdGhpcyBvcGNvZGUgdHlwZSAoMCwgMSwgb3IgMiB0YXJnZXRzKS4KLSAqIHpSIC0gUkVUVVJOIFZBTFVFOiBJbmRpY2F0ZXMgd2hldGhlciB0aGlzIG9wY29kZSB0eXBlIHJldHVybnMgYSB2YWx1ZQotICogICAgICAgICAgICAgICAgICAgIGFzIHRoZSBmdW5jdGlvbiByZXR1cm4gKDAgb3IgMSkuCi0gKgotICogVGhlIEFjcGlFeE9wY29kZSogZnVuY3Rpb25zIGFyZSBjYWxsZWQgdmlhIHRoZSBEaXNwYXRjaGVyIGNvbXBvbmVudCB3aXRoCi0gKiBmdWxseSByZXNvbHZlZCBvcGVyYW5kcy4KLSEqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9leF9vcGNvZGVfM0FfMFRfMFIKLSAqCi0gKiBQQVJBTUVURVJTOiAgd2Fsa19zdGF0ZSAgICAgICAgICAtIEN1cnJlbnQgd2FsayBzdGF0ZQotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKLSAqCi0gKiBERVNDUklQVElPTjogRXhlY3V0ZSBUcmlhZGljIG9wZXJhdG9yICgzIG9wZXJhbmRzKQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1hY3BpX3N0YXR1cyBhY3BpX2V4X29wY29kZV8zQV8wVF8wUihzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKQotewotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKipvcGVyYW5kID0gJndhbGtfc3RhdGUtPm9wZXJhbmRzWzBdOwotCXN0cnVjdCBhY3BpX3NpZ25hbF9mYXRhbF9pbmZvICpmYXRhbDsKLQlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0VfU1RSKGV4X29wY29kZV8zQV8wVF8wUiwKLQkJCQlhY3BpX3BzX2dldF9vcGNvZGVfbmFtZSh3YWxrX3N0YXRlLT5vcGNvZGUpKTsKLQotCXN3aXRjaCAod2Fsa19zdGF0ZS0+b3Bjb2RlKSB7Ci0JY2FzZSBBTUxfRkFUQUxfT1A6CS8qIEZhdGFsIChmYXRhbF90eXBlIGZhdGFsX2NvZGUgZmF0YWxfYXJnKSAqLwotCi0JCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywKLQkJCQkgICJGYXRhbE9wOiBUeXBlICVYIENvZGUgJVggQXJnICVYIDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDxcbiIsCi0JCQkJICAodTMyKSBvcGVyYW5kWzBdLT5pbnRlZ2VyLnZhbHVlLAotCQkJCSAgKHUzMikgb3BlcmFuZFsxXS0+aW50ZWdlci52YWx1ZSwKLQkJCQkgICh1MzIpIG9wZXJhbmRbMl0tPmludGVnZXIudmFsdWUpKTsKLQotCQlmYXRhbCA9IEFDUElfQUxMT0NBVEUoc2l6ZW9mKHN0cnVjdCBhY3BpX3NpZ25hbF9mYXRhbF9pbmZvKSk7Ci0JCWlmIChmYXRhbCkgewotCQkJZmF0YWwtPnR5cGUgPSAodTMyKSBvcGVyYW5kWzBdLT5pbnRlZ2VyLnZhbHVlOwotCQkJZmF0YWwtPmNvZGUgPSAodTMyKSBvcGVyYW5kWzFdLT5pbnRlZ2VyLnZhbHVlOwotCQkJZmF0YWwtPmFyZ3VtZW50ID0gKHUzMikgb3BlcmFuZFsyXS0+aW50ZWdlci52YWx1ZTsKLQkJfQotCi0JCS8qIEFsd2F5cyBzaWduYWwgdGhlIE9TISAqLwotCi0JCXN0YXR1cyA9IGFjcGlfb3Nfc2lnbmFsKEFDUElfU0lHTkFMX0ZBVEFMLCBmYXRhbCk7Ci0KLQkJLyogTWlnaHQgcmV0dXJuIHdoaWxlIE9TIGlzIHNodXR0aW5nIGRvd24sIGp1c3QgY29udGludWUgKi8KLQotCQlBQ1BJX0ZSRUUoZmF0YWwpOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0KLQkJQUNQSV9FUlJPUigoQUVfSU5GTywgIlVua25vd24gQU1MIG9wY29kZSAlWCIsCi0JCQkgICAgd2Fsa19zdGF0ZS0+b3Bjb2RlKSk7Ci0JCXN0YXR1cyA9IEFFX0FNTF9CQURfT1BDT0RFOwotCQlnb3RvIGNsZWFudXA7Ci0JfQotCi0gICAgICBjbGVhbnVwOgotCi0JcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfZXhfb3Bjb2RlXzNBXzFUXzFSCi0gKgotICogUEFSQU1FVEVSUzogIHdhbGtfc3RhdGUgICAgICAgICAgLSBDdXJyZW50IHdhbGsgc3RhdGUKLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IEV4ZWN1dGUgVHJpYWRpYyBvcGVyYXRvciAoMyBvcGVyYW5kcykKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1hY3BpX3N0YXR1cyBhY3BpX2V4X29wY29kZV8zQV8xVF8xUihzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKQotewotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKipvcGVyYW5kID0gJndhbGtfc3RhdGUtPm9wZXJhbmRzWzBdOwotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnJldHVybl9kZXNjID0gTlVMTDsKLQljaGFyICpidWZmZXIgPSBOVUxMOwotCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOwotCWFjcGlfaW50ZWdlciBpbmRleDsKLQlhY3BpX3NpemUgbGVuZ3RoOwotCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9TVFIoZXhfb3Bjb2RlXzNBXzFUXzFSLAotCQkJCWFjcGlfcHNfZ2V0X29wY29kZV9uYW1lKHdhbGtfc3RhdGUtPm9wY29kZSkpOwotCi0Jc3dpdGNoICh3YWxrX3N0YXRlLT5vcGNvZGUpIHsKLQljYXNlIEFNTF9NSURfT1A6CS8qIE1pZCAoU291cmNlWzBdLCBJbmRleFsxXSwgTGVuZ3RoWzJdLCBSZXN1bHRbM10pICovCi0KLQkJLyoKLQkJICogQ3JlYXRlIHRoZSByZXR1cm4gb2JqZWN0LiAgVGhlIFNvdXJjZSBvcGVyYW5kIGlzIGd1YXJhbnRlZWQgdG8gYmUKLQkJICogZWl0aGVyIGEgU3RyaW5nIG9yIGEgQnVmZmVyLCBzbyBqdXN0IHVzZSBpdHMgdHlwZS4KLQkJICovCi0JCXJldHVybl9kZXNjID0KLQkJICAgIGFjcGlfdXRfY3JlYXRlX2ludGVybmFsX29iamVjdChBQ1BJX0dFVF9PQkpFQ1RfVFlQRQotCQkJCQkJICAgKG9wZXJhbmRbMF0pKTsKLQkJaWYgKCFyZXR1cm5fZGVzYykgewotCQkJc3RhdHVzID0gQUVfTk9fTUVNT1JZOwotCQkJZ290byBjbGVhbnVwOwotCQl9Ci0KLQkJLyogR2V0IHRoZSBJbnRlZ2VyIHZhbHVlcyBmcm9tIHRoZSBvYmplY3RzICovCi0KLQkJaW5kZXggPSBvcGVyYW5kWzFdLT5pbnRlZ2VyLnZhbHVlOwotCQlsZW5ndGggPSAoYWNwaV9zaXplKSBvcGVyYW5kWzJdLT5pbnRlZ2VyLnZhbHVlOwotCi0JCS8qCi0JCSAqIElmIHRoZSBpbmRleCBpcyBiZXlvbmQgdGhlIGxlbmd0aCBvZiB0aGUgU3RyaW5nL0J1ZmZlciwgb3IgaWYgdGhlCi0JCSAqIHJlcXVlc3RlZCBsZW5ndGggaXMgemVybywgcmV0dXJuIGEgemVyby1sZW5ndGggU3RyaW5nL0J1ZmZlcgotCQkgKi8KLQkJaWYgKGluZGV4ID49IG9wZXJhbmRbMF0tPnN0cmluZy5sZW5ndGgpIHsKLQkJCWxlbmd0aCA9IDA7Ci0JCX0KLQotCQkvKiBUcnVuY2F0ZSByZXF1ZXN0IGlmIGxhcmdlciB0aGFuIHRoZSBhY3R1YWwgU3RyaW5nL0J1ZmZlciAqLwotCi0JCWVsc2UgaWYgKChpbmRleCArIGxlbmd0aCkgPiBvcGVyYW5kWzBdLT5zdHJpbmcubGVuZ3RoKSB7Ci0JCQlsZW5ndGggPSAoYWNwaV9zaXplKSBvcGVyYW5kWzBdLT5zdHJpbmcubGVuZ3RoIC0KLQkJCSAgICAoYWNwaV9zaXplKSBpbmRleDsKLQkJfQotCi0JCS8qIFN0cmluZ3MgYWx3YXlzIGhhdmUgYSBzdWItcG9pbnRlciwgbm90IHNvIGZvciBidWZmZXJzICovCi0KLQkJc3dpdGNoIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRShvcGVyYW5kWzBdKSkgewotCQljYXNlIEFDUElfVFlQRV9TVFJJTkc6Ci0KLQkJCS8qIEFsd2F5cyBhbGxvY2F0ZSBhIG5ldyBidWZmZXIgZm9yIHRoZSBTdHJpbmcgKi8KLQotCQkJYnVmZmVyID0gQUNQSV9BTExPQ0FURV9aRVJPRUQoKGFjcGlfc2l6ZSkgbGVuZ3RoICsgMSk7Ci0JCQlpZiAoIWJ1ZmZlcikgewotCQkJCXN0YXR1cyA9IEFFX05PX01FTU9SWTsKLQkJCQlnb3RvIGNsZWFudXA7Ci0JCQl9Ci0JCQlicmVhazsKLQotCQljYXNlIEFDUElfVFlQRV9CVUZGRVI6Ci0KLQkJCS8qIElmIHRoZSByZXF1ZXN0ZWQgbGVuZ3RoIGlzIHplcm8sIGRvbid0IGFsbG9jYXRlIGEgYnVmZmVyICovCi0KLQkJCWlmIChsZW5ndGggPiAwKSB7Ci0KLQkJCQkvKiBBbGxvY2F0ZSBhIG5ldyBidWZmZXIgZm9yIHRoZSBCdWZmZXIgKi8KLQotCQkJCWJ1ZmZlciA9IEFDUElfQUxMT0NBVEVfWkVST0VEKGxlbmd0aCk7Ci0JCQkJaWYgKCFidWZmZXIpIHsKLQkJCQkJc3RhdHVzID0gQUVfTk9fTUVNT1JZOwotCQkJCQlnb3RvIGNsZWFudXA7Ci0JCQkJfQotCQkJfQotCQkJYnJlYWs7Ci0KLQkJZGVmYXVsdDoJLyogU2hvdWxkIG5vdCBoYXBwZW4gKi8KLQotCQkJc3RhdHVzID0gQUVfQU1MX09QRVJBTkRfVFlQRTsKLQkJCWdvdG8gY2xlYW51cDsKLQkJfQotCi0JCWlmIChidWZmZXIpIHsKLQotCQkJLyogV2UgaGF2ZSBhIGJ1ZmZlciwgY29weSB0aGUgcG9ydGlvbiByZXF1ZXN0ZWQgKi8KLQotCQkJQUNQSV9NRU1DUFkoYnVmZmVyLCBvcGVyYW5kWzBdLT5zdHJpbmcucG9pbnRlciArIGluZGV4LAotCQkJCSAgICBsZW5ndGgpOwotCQl9Ci0KLQkJLyogU2V0IHRoZSBsZW5ndGggb2YgdGhlIG5ldyBTdHJpbmcvQnVmZmVyICovCi0KLQkJcmV0dXJuX2Rlc2MtPnN0cmluZy5wb2ludGVyID0gYnVmZmVyOwotCQlyZXR1cm5fZGVzYy0+c3RyaW5nLmxlbmd0aCA9ICh1MzIpIGxlbmd0aDsKLQotCQkvKiBNYXJrIGJ1ZmZlciBpbml0aWFsaXplZCAqLwotCi0JCXJldHVybl9kZXNjLT5idWZmZXIuZmxhZ3MgfD0gQU9QT0JKX0RBVEFfVkFMSUQ7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQotCQlBQ1BJX0VSUk9SKChBRV9JTkZPLCAiVW5rbm93biBBTUwgb3Bjb2RlICVYIiwKLQkJCSAgICB3YWxrX3N0YXRlLT5vcGNvZGUpKTsKLQkJc3RhdHVzID0gQUVfQU1MX0JBRF9PUENPREU7Ci0JCWdvdG8gY2xlYW51cDsKLQl9Ci0KLQkvKiBTdG9yZSB0aGUgcmVzdWx0IGluIHRoZSB0YXJnZXQgKi8KLQotCXN0YXR1cyA9IGFjcGlfZXhfc3RvcmUocmV0dXJuX2Rlc2MsIG9wZXJhbmRbM10sIHdhbGtfc3RhdGUpOwotCi0gICAgICBjbGVhbnVwOgotCi0JLyogRGVsZXRlIHJldHVybiBvYmplY3Qgb24gZXJyb3IgKi8KLQotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSB8fCB3YWxrX3N0YXRlLT5yZXN1bHRfb2JqKSB7Ci0JCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZShyZXR1cm5fZGVzYyk7Ci0JCXdhbGtfc3RhdGUtPnJlc3VsdF9vYmogPSBOVUxMOwotCX0KLQotCS8qIFNldCB0aGUgcmV0dXJuIG9iamVjdCBhbmQgZXhpdCAqLwotCi0JZWxzZSB7Ci0JCXdhbGtfc3RhdGUtPnJlc3VsdF9vYmogPSByZXR1cm5fZGVzYzsKLQl9Ci0JcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhvcGFyZzYuYyBiL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leG9wYXJnNi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2N2Q0ODczLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leG9wYXJnNi5jCisrKyAvZGV2L251bGwKQEAgLTEsMzQwICswLDAgQEAKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIE1vZHVsZSBOYW1lOiBleG9wYXJnNiAtIEFNTCBleGVjdXRpb24gLSBvcGNvZGVzIHdpdGggNiBhcmd1bWVudHMKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA4LCBJbnRlbCBDb3JwLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAotICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgYXQgbWluaW11bSBhIGRpc2NsYWltZXIKLSAqICAgIHN1YnN0YW50aWFsbHkgc2ltaWxhciB0byB0aGUgIk5PIFdBUlJBTlRZIiBkaXNjbGFpbWVyIGJlbG93Ci0gKiAgICAoIkRpc2NsYWltZXIiKSBhbmQgYW55IHJlZGlzdHJpYnV0aW9uIG11c3QgYmUgY29uZGl0aW9uZWQgdXBvbgotICogICAgaW5jbHVkaW5nIGEgc3Vic3RhbnRpYWxseSBzaW1pbGFyIERpc2NsYWltZXIgcmVxdWlyZW1lbnQgZm9yIGZ1cnRoZXIKLSAqICAgIGJpbmFyeSByZWRpc3RyaWJ1dGlvbi4KLSAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcwotICogICAgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICogU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBOTyBXQVJSQU5UWQotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCi0gKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUwotICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcKLSAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQotICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgotICovCi0KLSNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KLSNpbmNsdWRlIDxhY3BpL2FjaW50ZXJwLmg+Ci0jaW5jbHVkZSA8YWNwaS9hY3BhcnNlci5oPgotI2luY2x1ZGUgPGFjcGkvYW1sY29kZS5oPgotCi0jZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9FWEVDVVRFUgotQUNQSV9NT0RVTEVfTkFNRSgiZXhvcGFyZzYiKQotCi0vKiEKLSAqIE5hbWluZyBjb252ZW50aW9uIGZvciBBTUwgaW50ZXJwcmV0ZXIgZXhlY3V0aW9uIHJvdXRpbmVzLgotICoKLSAqIFRoZSByb3V0aW5lcyB0aGF0IGJlZ2luIGV4ZWN1dGlvbiBvZiBBTUwgb3Bjb2RlcyBhcmUgbmFtZWQgd2l0aCBhIGNvbW1vbgotICogY29udmVudGlvbiBiYXNlZCB1cG9uIHRoZSBudW1iZXIgb2YgYXJndW1lbnRzLCB0aGUgbnVtYmVyIG9mIHRhcmdldCBvcGVyYW5kcywKLSAqIGFuZCB3aGV0aGVyIG9yIG5vdCBhIHZhbHVlIGlzIHJldHVybmVkOgotICoKLSAqICAgICAgQWNwaUV4T3Bjb2RlX3hBX3lUX3pSCi0gKgotICogV2hlcmU6Ci0gKgotICogeEEgLSBBUkdVTUVOVFM6ICAgIFRoZSBudW1iZXIgb2YgYXJndW1lbnRzIChpbnB1dCBvcGVyYW5kcykgdGhhdCBhcmUKLSAqICAgICAgICAgICAgICAgICAgICByZXF1aXJlZCBmb3IgdGhpcyBvcGNvZGUgdHlwZSAoMSB0aHJvdWdoIDYgYXJncykuCi0gKiB5VCAtIFRBUkdFVFM6ICAgICAgVGhlIG51bWJlciBvZiB0YXJnZXRzIChvdXRwdXQgb3BlcmFuZHMpIHRoYXQgYXJlIHJlcXVpcmVkCi0gKiAgICAgICAgICAgICAgICAgICAgZm9yIHRoaXMgb3Bjb2RlIHR5cGUgKDAsIDEsIG9yIDIgdGFyZ2V0cykuCi0gKiB6UiAtIFJFVFVSTiBWQUxVRTogSW5kaWNhdGVzIHdoZXRoZXIgdGhpcyBvcGNvZGUgdHlwZSByZXR1cm5zIGEgdmFsdWUKLSAqICAgICAgICAgICAgICAgICAgICBhcyB0aGUgZnVuY3Rpb24gcmV0dXJuICgwIG9yIDEpLgotICoKLSAqIFRoZSBBY3BpRXhPcGNvZGUqIGZ1bmN0aW9ucyBhcmUgY2FsbGVkIHZpYSB0aGUgRGlzcGF0Y2hlciBjb21wb25lbnQgd2l0aAotICogZnVsbHkgcmVzb2x2ZWQgb3BlcmFuZHMuCi0hKi8KLS8qIExvY2FsIHByb3RvdHlwZXMgKi8KLXN0YXRpYyB1OAotYWNwaV9leF9kb19tYXRjaCh1MzIgbWF0Y2hfb3AsCi0JCSB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpwYWNrYWdlX29iaiwKLQkJIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm1hdGNoX29iaik7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfZXhfZG9fbWF0Y2gKLSAqCi0gKiBQQVJBTUVURVJTOiAgbWF0Y2hfb3AgICAgICAgIC0gVGhlIEFNTCBtYXRjaCBvcGVyYW5kCi0gKiAgICAgICAgICAgICAgcGFja2FnZV9vYmogICAgIC0gT2JqZWN0IGZyb20gdGhlIHRhcmdldCBwYWNrYWdlCi0gKiAgICAgICAgICAgICAgbWF0Y2hfb2JqICAgICAgIC0gT2JqZWN0IHRvIGJlIG1hdGNoZWQKLSAqCi0gKiBSRVRVUk46ICAgICAgVFJVRSBpZiB0aGUgbWF0Y2ggaXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlCi0gKgotICogREVTQ1JJUFRJT046IEltcGxlbWVudHMgdGhlIGxvdy1sZXZlbCBtYXRjaCBmb3IgdGhlIEFTTCBNYXRjaCBvcGVyYXRvci4KLSAqICAgICAgICAgICAgICBQYWNrYWdlIGVsZW1lbnRzIHdpbGwgYmUgaW1wbGljaXRseSBjb252ZXJ0ZWQgdG8gdGhlIHR5cGUgb2YKLSAqICAgICAgICAgICAgICB0aGUgbWF0Y2ggb2JqZWN0IChJbnRlZ2VyL0J1ZmZlci9TdHJpbmcpLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyB1OAotYWNwaV9leF9kb19tYXRjaCh1MzIgbWF0Y2hfb3AsCi0JCSB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpwYWNrYWdlX29iaiwKLQkJIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm1hdGNoX29iaikKLXsKLQl1OCBsb2dpY2FsX3Jlc3VsdCA9IFRSVUU7Ci0JYWNwaV9zdGF0dXMgc3RhdHVzOwotCi0JLyoKLQkgKiBOb3RlOiBTaW5jZSB0aGUgcGFja2FnZV9vYmovbWF0Y2hfb2JqIG9yZGVyaW5nIGlzIG9wcG9zaXRlIHRvIHRoYXQgb2YKLQkgKiB0aGUgc3RhbmRhcmQgbG9naWNhbCBvcGVyYXRvcnMsIHdlIGhhdmUgdG8gcmV2ZXJzZSB0aGVtIHdoZW4gd2UgY2FsbAotCSAqIGRvX2xvZ2ljYWxfb3AgaW4gb3JkZXIgdG8gbWFrZSB0aGUgaW1wbGljaXQgY29udmVyc2lvbiBydWxlcyB3b3JrCi0JICogY29ycmVjdGx5LiBIb3dldmVyLCB0aGlzIG1lYW5zIHdlIGhhdmUgdG8gZmxpcCB0aGUgZW50aXJlIGVxdWF0aW9uCi0JICogYWxzby4gQSBiaXQgdWdseSBwZXJoYXBzLCBidXQgb3ZlcmFsbCwgYmV0dGVyIHRoYW4gZnVzc2luZyB0aGUKLQkgKiBwYXJhbWV0ZXJzIGFyb3VuZCBhdCBydW50aW1lLCBvdmVyIGFuZCBvdmVyIGFnYWluLgotCSAqCi0JICogQmVsb3csIFBbaV0gcmVmZXJzIHRvIHRoZSBwYWNrYWdlIGVsZW1lbnQsIE0gcmVmZXJzIHRvIHRoZSBNYXRjaCBvYmplY3QuCi0JICovCi0Jc3dpdGNoIChtYXRjaF9vcCkgewotCWNhc2UgTUFUQ0hfTVRSOgotCi0JCS8qIEFsd2F5cyB0cnVlICovCi0KLQkJYnJlYWs7Ci0KLQljYXNlIE1BVENIX01FUToKLQotCQkvKgotCQkgKiBUcnVlIGlmIGVxdWFsOiAoUFtpXSA9PSBNKQotCQkgKiBDaGFuZ2UgdG86ICAgICAoTSA9PSBQW2ldKQotCQkgKi8KLQkJc3RhdHVzID0KLQkJICAgIGFjcGlfZXhfZG9fbG9naWNhbF9vcChBTUxfTEVRVUFMX09QLCBtYXRjaF9vYmosIHBhY2thZ2Vfb2JqLAotCQkJCQkgICZsb2dpY2FsX3Jlc3VsdCk7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQkJcmV0dXJuIChGQUxTRSk7Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIE1BVENIX01MRToKLQotCQkvKgotCQkgKiBUcnVlIGlmIGxlc3MgdGhhbiBvciBlcXVhbDogKFBbaV0gPD0gTSkgKFBbaV0gbm90X2dyZWF0ZXIgdGhhbiBNKQotCQkgKiBDaGFuZ2UgdG86ICAgICAgICAgICAgICAgICAgKE0gPj0gUFtpXSkgKE0gbm90X2xlc3MgdGhhbiBQW2ldKQotCQkgKi8KLQkJc3RhdHVzID0KLQkJICAgIGFjcGlfZXhfZG9fbG9naWNhbF9vcChBTUxfTExFU1NfT1AsIG1hdGNoX29iaiwgcGFja2FnZV9vYmosCi0JCQkJCSAgJmxvZ2ljYWxfcmVzdWx0KTsKLQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCQlyZXR1cm4gKEZBTFNFKTsKLQkJfQotCQlsb2dpY2FsX3Jlc3VsdCA9ICh1OCkgISBsb2dpY2FsX3Jlc3VsdDsKLQkJYnJlYWs7Ci0KLQljYXNlIE1BVENIX01MVDoKLQotCQkvKgotCQkgKiBUcnVlIGlmIGxlc3MgdGhhbjogKFBbaV0gPCBNKQotCQkgKiBDaGFuZ2UgdG86ICAgICAgICAgKE0gPiBQW2ldKQotCQkgKi8KLQkJc3RhdHVzID0KLQkJICAgIGFjcGlfZXhfZG9fbG9naWNhbF9vcChBTUxfTEdSRUFURVJfT1AsIG1hdGNoX29iaiwKLQkJCQkJICBwYWNrYWdlX29iaiwgJmxvZ2ljYWxfcmVzdWx0KTsKLQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCQlyZXR1cm4gKEZBTFNFKTsKLQkJfQotCQlicmVhazsKLQotCWNhc2UgTUFUQ0hfTUdFOgotCi0JCS8qCi0JCSAqIFRydWUgaWYgZ3JlYXRlciB0aGFuIG9yIGVxdWFsOiAoUFtpXSA+PSBNKSAoUFtpXSBub3RfbGVzcyB0aGFuIE0pCi0JCSAqIENoYW5nZSB0bzogICAgICAgICAgICAgICAgICAgICAoTSA8PSBQW2ldKSAoTSBub3RfZ3JlYXRlciB0aGFuIFBbaV0pCi0JCSAqLwotCQlzdGF0dXMgPQotCQkgICAgYWNwaV9leF9kb19sb2dpY2FsX29wKEFNTF9MR1JFQVRFUl9PUCwgbWF0Y2hfb2JqLAotCQkJCQkgIHBhY2thZ2Vfb2JqLCAmbG9naWNhbF9yZXN1bHQpOwotCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJCXJldHVybiAoRkFMU0UpOwotCQl9Ci0JCWxvZ2ljYWxfcmVzdWx0ID0gKHU4KSAhIGxvZ2ljYWxfcmVzdWx0OwotCQlicmVhazsKLQotCWNhc2UgTUFUQ0hfTUdUOgotCi0JCS8qCi0JCSAqIFRydWUgaWYgZ3JlYXRlciB0aGFuOiAoUFtpXSA+IE0pCi0JCSAqIENoYW5nZSB0bzogICAgICAgICAgICAoTSA8IFBbaV0pCi0JCSAqLwotCQlzdGF0dXMgPQotCQkgICAgYWNwaV9leF9kb19sb2dpY2FsX29wKEFNTF9MTEVTU19PUCwgbWF0Y2hfb2JqLCBwYWNrYWdlX29iaiwKLQkJCQkJICAmbG9naWNhbF9yZXN1bHQpOwotCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJCXJldHVybiAoRkFMU0UpOwotCQl9Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQotCQkvKiBVbmRlZmluZWQgKi8KLQotCQlyZXR1cm4gKEZBTFNFKTsKLQl9Ci0KLQlyZXR1cm4gbG9naWNhbF9yZXN1bHQ7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfZXhfb3Bjb2RlXzZBXzBUXzFSCi0gKgotICogUEFSQU1FVEVSUzogIHdhbGtfc3RhdGUgICAgICAgICAgLSBDdXJyZW50IHdhbGsgc3RhdGUKLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IEV4ZWN1dGUgb3Bjb2RlIHdpdGggNiBhcmd1bWVudHMsIG5vIHRhcmdldCwgYW5kIGEgcmV0dXJuIHZhbHVlCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotYWNwaV9zdGF0dXMgYWNwaV9leF9vcGNvZGVfNkFfMFRfMVIoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqIHdhbGtfc3RhdGUpCi17Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKm9wZXJhbmQgPSAmd2Fsa19zdGF0ZS0+b3BlcmFuZHNbMF07Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqcmV0dXJuX2Rlc2MgPSBOVUxMOwotCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOwotCWFjcGlfaW50ZWdlciBpbmRleDsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICp0aGlzX2VsZW1lbnQ7Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1NUUihleF9vcGNvZGVfNkFfMFRfMVIsCi0JCQkJYWNwaV9wc19nZXRfb3Bjb2RlX25hbWUod2Fsa19zdGF0ZS0+b3Bjb2RlKSk7Ci0KLQlzd2l0Y2ggKHdhbGtfc3RhdGUtPm9wY29kZSkgewotCWNhc2UgQU1MX01BVENIX09QOgotCQkvKgotCQkgKiBNYXRjaCAoc2VhcmNoX3BrZ1swXSwgbWF0Y2hfb3AxWzFdLCBtYXRjaF9vYmoxWzJdLAotCQkgKiAgICAgICAgICAgICAgICAgICAgICBtYXRjaF9vcDJbM10sIG1hdGNoX29iajJbNF0sIHN0YXJ0X2luZGV4WzVdKQotCQkgKi8KLQotCQkvKiBWYWxpZGF0ZSBib3RoIE1hdGNoIFRlcm0gT3BlcmF0b3JzIChNVFIsIE1FUSwgZXRjLikgKi8KLQotCQlpZiAoKG9wZXJhbmRbMV0tPmludGVnZXIudmFsdWUgPiBNQVhfTUFUQ0hfT1BFUkFUT1IpIHx8Ci0JCSAgICAob3BlcmFuZFszXS0+aW50ZWdlci52YWx1ZSA+IE1BWF9NQVRDSF9PUEVSQVRPUikpIHsKLQkJCUFDUElfRVJST1IoKEFFX0lORk8sICJNYXRjaCBvcGVyYXRvciBvdXQgb2YgcmFuZ2UiKSk7Ci0JCQlzdGF0dXMgPSBBRV9BTUxfT1BFUkFORF9WQUxVRTsKLQkJCWdvdG8gY2xlYW51cDsKLQkJfQotCi0JCS8qIEdldCB0aGUgcGFja2FnZSBzdGFydF9pbmRleCwgdmFsaWRhdGUgYWdhaW5zdCB0aGUgcGFja2FnZSBsZW5ndGggKi8KLQotCQlpbmRleCA9IG9wZXJhbmRbNV0tPmludGVnZXIudmFsdWU7Ci0JCWlmIChpbmRleCA+PSBvcGVyYW5kWzBdLT5wYWNrYWdlLmNvdW50KSB7Ci0JCQlBQ1BJX0VSUk9SKChBRV9JTkZPLAotCQkJCSAgICAiSW5kZXggKCVYJTguOFgpIGJleW9uZCBwYWNrYWdlIGVuZCAoJVgpIiwKLQkJCQkgICAgQUNQSV9GT1JNQVRfVUlOVDY0KGluZGV4KSwKLQkJCQkgICAgb3BlcmFuZFswXS0+cGFja2FnZS5jb3VudCkpOwotCQkJc3RhdHVzID0gQUVfQU1MX1BBQ0tBR0VfTElNSVQ7Ci0JCQlnb3RvIGNsZWFudXA7Ci0JCX0KLQotCQkvKiBDcmVhdGUgYW4gaW50ZWdlciBmb3IgdGhlIHJldHVybiB2YWx1ZSAqLwotCi0JCXJldHVybl9kZXNjID0gYWNwaV91dF9jcmVhdGVfaW50ZXJuYWxfb2JqZWN0KEFDUElfVFlQRV9JTlRFR0VSKTsKLQkJaWYgKCFyZXR1cm5fZGVzYykgewotCQkJc3RhdHVzID0gQUVfTk9fTUVNT1JZOwotCQkJZ290byBjbGVhbnVwOwotCi0JCX0KLQotCQkvKiBEZWZhdWx0IHJldHVybiB2YWx1ZSBpZiBubyBtYXRjaCBmb3VuZCAqLwotCi0JCXJldHVybl9kZXNjLT5pbnRlZ2VyLnZhbHVlID0gQUNQSV9JTlRFR0VSX01BWDsKLQotCQkvKgotCQkgKiBFeGFtaW5lIGVhY2ggZWxlbWVudCB1bnRpbCBhIG1hdGNoIGlzIGZvdW5kLiBCb3RoIG1hdGNoIGNvbmRpdGlvbnMKLQkJICogbXVzdCBiZSBzYXRpc2ZpZWQgZm9yIGEgbWF0Y2ggdG8gb2NjdXIuIFdpdGhpbiB0aGUgbG9vcCwKLQkJICogImNvbnRpbnVlIiBzaWduaWZpZXMgdGhhdCB0aGUgY3VycmVudCBlbGVtZW50IGRvZXMgbm90IG1hdGNoCi0JCSAqIGFuZCB0aGUgbmV4dCBzaG91bGQgYmUgZXhhbWluZWQuCi0JCSAqCi0JCSAqIFVwb24gZmluZGluZyBhIG1hdGNoLCB0aGUgbG9vcCB3aWxsIHRlcm1pbmF0ZSB2aWEgImJyZWFrIiBhdAotCQkgKiB0aGUgYm90dG9tLiAgSWYgaXQgdGVybWluYXRlcyAibm9ybWFsbHkiLCBtYXRjaF92YWx1ZSB3aWxsIGJlCi0JCSAqIEFDUElfSU5URUdFUl9NQVggKE9uZXMpIChpdHMgaW5pdGlhbCB2YWx1ZSkgaW5kaWNhdGluZyB0aGF0IG5vCi0JCSAqIG1hdGNoIHdhcyBmb3VuZC4KLQkJICovCi0JCWZvciAoOyBpbmRleCA8IG9wZXJhbmRbMF0tPnBhY2thZ2UuY291bnQ7IGluZGV4KyspIHsKLQotCQkJLyogR2V0IHRoZSBjdXJyZW50IHBhY2thZ2UgZWxlbWVudCAqLwotCi0JCQl0aGlzX2VsZW1lbnQgPSBvcGVyYW5kWzBdLT5wYWNrYWdlLmVsZW1lbnRzW2luZGV4XTsKLQotCQkJLyogVHJlYXQgYW55IHVuaW5pdGlhbGl6ZWQgKE5VTEwpIGVsZW1lbnRzIGFzIG5vbi1tYXRjaGluZyAqLwotCi0JCQlpZiAoIXRoaXNfZWxlbWVudCkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQkvKgotCQkJICogQm90aCBtYXRjaCBjb25kaXRpb25zIG11c3QgYmUgc2F0aXNmaWVkLiBFeGVjdXRpb24gb2YgYSBjb250aW51ZQotCQkJICogKHByb2NlZWQgdG8gbmV4dCBpdGVyYXRpb24gb2YgZW5jbG9zaW5nIGZvciBsb29wKSBzaWduaWZpZXMgYQotCQkJICogbm9uLW1hdGNoLgotCQkJICovCi0JCQlpZiAoIWFjcGlfZXhfZG9fbWF0Y2goKHUzMikgb3BlcmFuZFsxXS0+aW50ZWdlci52YWx1ZSwKLQkJCQkJICAgICAgdGhpc19lbGVtZW50LCBvcGVyYW5kWzJdKSkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQlpZiAoIWFjcGlfZXhfZG9fbWF0Y2goKHUzMikgb3BlcmFuZFszXS0+aW50ZWdlci52YWx1ZSwKLQkJCQkJICAgICAgdGhpc19lbGVtZW50LCBvcGVyYW5kWzRdKSkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQkvKiBNYXRjaCBmb3VuZDogSW5kZXggaXMgdGhlIHJldHVybiB2YWx1ZSAqLwotCi0JCQlyZXR1cm5fZGVzYy0+aW50ZWdlci52YWx1ZSA9IGluZGV4OwotCQkJYnJlYWs7Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIEFNTF9MT0FEX1RBQkxFX09QOgotCi0JCXN0YXR1cyA9IGFjcGlfZXhfbG9hZF90YWJsZV9vcCh3YWxrX3N0YXRlLCAmcmV0dXJuX2Rlc2MpOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0KLQkJQUNQSV9FUlJPUigoQUVfSU5GTywgIlVua25vd24gQU1MIG9wY29kZSAlWCIsCi0JCQkgICAgd2Fsa19zdGF0ZS0+b3Bjb2RlKSk7Ci0JCXN0YXR1cyA9IEFFX0FNTF9CQURfT1BDT0RFOwotCQlnb3RvIGNsZWFudXA7Ci0JfQotCi0gICAgICBjbGVhbnVwOgotCi0JLyogRGVsZXRlIHJldHVybiBvYmplY3Qgb24gZXJyb3IgKi8KLQotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UocmV0dXJuX2Rlc2MpOwotCX0KLQotCS8qIFNhdmUgcmV0dXJuIG9iamVjdCBvbiBzdWNjZXNzICovCi0KLQllbHNlIHsKLQkJd2Fsa19zdGF0ZS0+cmVzdWx0X29iaiA9IHJldHVybl9kZXNjOwotCX0KLQotCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4cHJlcC5jIGIvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4cHJlcC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDQzOGMzLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leHByZXAuYworKysgL2Rldi9udWxsCkBAIC0xLDU4OSArMCwwIEBACi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBNb2R1bGUgTmFtZTogZXhwcmVwIC0gQUNQSSBBTUwgKHAtY29kZSkgZXhlY3V0aW9uIC0gZmllbGQgcHJlcCB1dGlsaXRpZXMKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA4LCBJbnRlbCBDb3JwLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAotICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgYXQgbWluaW11bSBhIGRpc2NsYWltZXIKLSAqICAgIHN1YnN0YW50aWFsbHkgc2ltaWxhciB0byB0aGUgIk5PIFdBUlJBTlRZIiBkaXNjbGFpbWVyIGJlbG93Ci0gKiAgICAoIkRpc2NsYWltZXIiKSBhbmQgYW55IHJlZGlzdHJpYnV0aW9uIG11c3QgYmUgY29uZGl0aW9uZWQgdXBvbgotICogICAgaW5jbHVkaW5nIGEgc3Vic3RhbnRpYWxseSBzaW1pbGFyIERpc2NsYWltZXIgcmVxdWlyZW1lbnQgZm9yIGZ1cnRoZXIKLSAqICAgIGJpbmFyeSByZWRpc3RyaWJ1dGlvbi4KLSAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcwotICogICAgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICogU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBOTyBXQVJSQU5UWQotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCi0gKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUwotICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcKLSAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQotICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgotICovCi0KLSNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KLSNpbmNsdWRlIDxhY3BpL2FjaW50ZXJwLmg+Ci0jaW5jbHVkZSA8YWNwaS9hbWxjb2RlLmg+Ci0jaW5jbHVkZSA8YWNwaS9hY25hbWVzcC5oPgotCi0jZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9FWEVDVVRFUgotQUNQSV9NT0RVTEVfTkFNRSgiZXhwcmVwIikKLQotLyogTG9jYWwgcHJvdG90eXBlcyAqLwotc3RhdGljIHUzMgotYWNwaV9leF9kZWNvZGVfZmllbGRfYWNjZXNzKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjLAotCQkJICAgIHU4IGZpZWxkX2ZsYWdzLCB1MzIgKiByZXR1cm5fYnl0ZV9hbGlnbm1lbnQpOwotCi0jaWZkZWYgQUNQSV9VTkRFUl9ERVZFTE9QTUVOVAotCi1zdGF0aWMgdTMyCi1hY3BpX2V4X2dlbmVyYXRlX2FjY2Vzcyh1MzIgZmllbGRfYml0X29mZnNldCwKLQkJCXUzMiBmaWVsZF9iaXRfbGVuZ3RoLCB1MzIgcmVnaW9uX2xlbmd0aCk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfZXhfZ2VuZXJhdGVfYWNjZXNzCi0gKgotICogUEFSQU1FVEVSUzogIGZpZWxkX2JpdF9vZmZzZXQgICAgLSBTdGFydCBvZiBmaWVsZCB3aXRoaW4gcGFyZW50IHJlZ2lvbi9idWZmZXIKLSAqICAgICAgICAgICAgICBmaWVsZF9iaXRfbGVuZ3RoICAgIC0gTGVuZ3RoIG9mIGZpZWxkIGluIGJpdHMKLSAqICAgICAgICAgICAgICByZWdpb25fbGVuZ3RoICAgICAgIC0gTGVuZ3RoIG9mIHBhcmVudCBpbiBieXRlcwotICoKLSAqIFJFVFVSTjogICAgICBGaWVsZCBncmFudWxhcml0eSAoOCwgMTYsIDMyIG9yIDY0KSBhbmQKLSAqICAgICAgICAgICAgICBieXRlX2FsaWdubWVudCAoMSwgMiwgMywgb3IgNCkKLSAqCi0gKiBERVNDUklQVElPTjogR2VuZXJhdGUgYW4gb3B0aW1hbCBhY2Nlc3Mgd2lkdGggZm9yIGZpZWxkcyBkZWZpbmVkIHdpdGggdGhlCi0gKiAgICAgICAgICAgICAgYW55X2FjYyBrZXl3b3JkLgotICoKLSAqIE5PVEU6IE5lZWQgdG8gaGF2ZSB0aGUgcmVnaW9uX2xlbmd0aCBpbiBvcmRlciB0byBjaGVjayBmb3IgYm91bmRhcnkKLSAqICAgICAgIGNvbmRpdGlvbnMgKGVuZC1vZi1yZWdpb24pLiAgSG93ZXZlciwgdGhlIHJlZ2lvbl9sZW5ndGggaXMgYSBkZWZlcnJlZAotICogICAgICAgb3BlcmF0aW9uLiAgVGhlcmVmb3JlLCB0byBjb21wbGV0ZSB0aGlzIGltcGxlbWVudGF0aW9uLCB0aGUgZ2VuZXJhdGlvbgotICogICAgICAgb2YgdGhpcyBhY2Nlc3Mgd2lkdGggbXVzdCBiZSBkZWZlcnJlZCB1bnRpbCB0aGUgcmVnaW9uIGxlbmd0aCBoYXMKLSAqICAgICAgIGJlZW4gZXZhbHVhdGVkLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyB1MzIKLWFjcGlfZXhfZ2VuZXJhdGVfYWNjZXNzKHUzMiBmaWVsZF9iaXRfb2Zmc2V0LAotCQkJdTMyIGZpZWxkX2JpdF9sZW5ndGgsIHUzMiByZWdpb25fbGVuZ3RoKQotewotCXUzMiBmaWVsZF9ieXRlX2xlbmd0aDsKLQl1MzIgZmllbGRfYnl0ZV9vZmZzZXQ7Ci0JdTMyIGZpZWxkX2J5dGVfZW5kX29mZnNldDsKLQl1MzIgYWNjZXNzX2J5dGVfd2lkdGg7Ci0JdTMyIGZpZWxkX3N0YXJ0X29mZnNldDsKLQl1MzIgZmllbGRfZW5kX29mZnNldDsKLQl1MzIgbWluaW11bV9hY2Nlc3Nfd2lkdGggPSAweEZGRkZGRkZGOwotCXUzMiBtaW5pbXVtX2FjY2Vzc2VzID0gMHhGRkZGRkZGRjsKLQl1MzIgYWNjZXNzZXM7Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGV4X2dlbmVyYXRlX2FjY2Vzcyk7Ci0KLQkvKiBSb3VuZCBGaWVsZCBzdGFydCBvZmZzZXQgYW5kIGxlbmd0aCB0byAibWluaW1hbCIgYnl0ZSBib3VuZGFyaWVzICovCi0KLQlmaWVsZF9ieXRlX29mZnNldCA9IEFDUElfRElWXzgoQUNQSV9ST1VORF9ET1dOKGZpZWxkX2JpdF9vZmZzZXQsIDgpKTsKLQlmaWVsZF9ieXRlX2VuZF9vZmZzZXQgPSBBQ1BJX0RJVl84KEFDUElfUk9VTkRfVVAoZmllbGRfYml0X2xlbmd0aCArCi0JCQkJCQkJIGZpZWxkX2JpdF9vZmZzZXQsIDgpKTsKLQlmaWVsZF9ieXRlX2xlbmd0aCA9IGZpZWxkX2J5dGVfZW5kX29mZnNldCAtIGZpZWxkX2J5dGVfb2Zmc2V0OwotCi0JQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9CRklFTEQsCi0JCQkgICJCaXQgbGVuZ3RoICVkLCBCaXQgb2Zmc2V0ICVkXG4iLAotCQkJICBmaWVsZF9iaXRfbGVuZ3RoLCBmaWVsZF9iaXRfb2Zmc2V0KSk7Ci0KLQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0JGSUVMRCwKLQkJCSAgIkJ5dGUgTGVuZ3RoICVkLCBCeXRlIE9mZnNldCAlZCwgRW5kIE9mZnNldCAlZFxuIiwKLQkJCSAgZmllbGRfYnl0ZV9sZW5ndGgsIGZpZWxkX2J5dGVfb2Zmc2V0LAotCQkJICBmaWVsZF9ieXRlX2VuZF9vZmZzZXQpKTsKLQotCS8qCi0JICogSXRlcmF0aXZlIHNlYXJjaCBmb3IgdGhlIG1heGltdW0gYWNjZXNzIHdpZHRoIHRoYXQgaXMgYm90aCBhbGlnbmVkCi0JICogYW5kIGRvZXMgbm90IGdvIGJleW9uZCB0aGUgZW5kIG9mIHRoZSByZWdpb24KLQkgKgotCSAqIFN0YXJ0IGF0IGJ5dGVfYWNjIGFuZCB3b3JrIHVwd2FyZHMgdG8gcXdvcmRfYWNjIG1heC4gKDEsMiw0LDggYnl0ZXMpCi0JICovCi0JZm9yIChhY2Nlc3NfYnl0ZV93aWR0aCA9IDE7IGFjY2Vzc19ieXRlX3dpZHRoIDw9IDg7Ci0JICAgICBhY2Nlc3NfYnl0ZV93aWR0aCA8PD0gMSkgewotCQkvKgotCQkgKiAxKSBSb3VuZCBlbmQgb2Zmc2V0IHVwIHRvIG5leHQgYWNjZXNzIGJvdW5kYXJ5IGFuZCBtYWtlIHN1cmUgdGhhdAotCQkgKiAgICB0aGlzIGRvZXMgbm90IGdvIGJleW9uZCB0aGUgZW5kIG9mIHRoZSBwYXJlbnQgcmVnaW9uLgotCQkgKiAyKSBXaGVuIHRoZSBBY2Nlc3Mgd2lkdGggaXMgZ3JlYXRlciB0aGFuIHRoZSBmaWVsZF9ieXRlX2xlbmd0aCwgd2UKLQkJICogICAgYXJlIGRvbmUuIChUaGlzIGRvZXMgbm90IG9wdGltaXplIGZvciB0aGUgcGVyZmVjdGx5IGFsaWduZWQKLQkJICogICAgY2FzZSB5ZXQpLgotCQkgKi8KLQkJaWYgKEFDUElfUk9VTkRfVVAoZmllbGRfYnl0ZV9lbmRfb2Zmc2V0LCBhY2Nlc3NfYnl0ZV93aWR0aCkgPD0KLQkJICAgIHJlZ2lvbl9sZW5ndGgpIHsKLQkJCWZpZWxkX3N0YXJ0X29mZnNldCA9Ci0JCQkgICAgQUNQSV9ST1VORF9ET1dOKGZpZWxkX2J5dGVfb2Zmc2V0LAotCQkJCQkgICAgYWNjZXNzX2J5dGVfd2lkdGgpIC8KLQkJCSAgICBhY2Nlc3NfYnl0ZV93aWR0aDsKLQotCQkJZmllbGRfZW5kX29mZnNldCA9Ci0JCQkgICAgQUNQSV9ST1VORF9VUCgoZmllbGRfYnl0ZV9sZW5ndGggKwotCQkJCQkgICBmaWVsZF9ieXRlX29mZnNldCksCi0JCQkJCSAgYWNjZXNzX2J5dGVfd2lkdGgpIC8KLQkJCSAgICBhY2Nlc3NfYnl0ZV93aWR0aDsKLQotCQkJYWNjZXNzZXMgPSBmaWVsZF9lbmRfb2Zmc2V0IC0gZmllbGRfc3RhcnRfb2Zmc2V0OwotCi0JCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0JGSUVMRCwKLQkJCQkJICAiQWNjZXNzV2lkdGggJWQgZW5kIGlzIHdpdGhpbiByZWdpb25cbiIsCi0JCQkJCSAgYWNjZXNzX2J5dGVfd2lkdGgpKTsKLQotCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9CRklFTEQsCi0JCQkJCSAgIkZpZWxkIFN0YXJ0ICVkLCBGaWVsZCBFbmQgJWQgLS0gcmVxdWlyZXMgJWQgYWNjZXNzZXNcbiIsCi0JCQkJCSAgZmllbGRfc3RhcnRfb2Zmc2V0LCBmaWVsZF9lbmRfb2Zmc2V0LAotCQkJCQkgIGFjY2Vzc2VzKSk7Ci0KLQkJCS8qIFNpbmdsZSBhY2Nlc3MgaXMgb3B0aW1hbCAqLwotCi0JCQlpZiAoYWNjZXNzZXMgPD0gMSkgewotCQkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfQkZJRUxELAotCQkJCQkJICAiRW50aXJlIGZpZWxkIGNhbiBiZSBhY2Nlc3NlZCB3aXRoIG9uZSBvcGVyYXRpb24gb2Ygc2l6ZSAlZFxuIiwKLQkJCQkJCSAgYWNjZXNzX2J5dGVfd2lkdGgpKTsKLQkJCQlyZXR1cm5fVkFMVUUoYWNjZXNzX2J5dGVfd2lkdGgpOwotCQkJfQotCi0JCQkvKgotCQkJICogRml0cyBpbiB0aGUgcmVnaW9uLCBidXQgcmVxdWlyZXMgbW9yZSB0aGFuIG9uZSByZWFkL3dyaXRlLgotCQkJICogdHJ5IHRoZSBuZXh0IHdpZGVyIGFjY2VzcyBvbiBuZXh0IGl0ZXJhdGlvbgotCQkJICovCi0JCQlpZiAoYWNjZXNzZXMgPCBtaW5pbXVtX2FjY2Vzc2VzKSB7Ci0JCQkJbWluaW11bV9hY2Nlc3NlcyA9IGFjY2Vzc2VzOwotCQkJCW1pbmltdW1fYWNjZXNzX3dpZHRoID0gYWNjZXNzX2J5dGVfd2lkdGg7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0JGSUVMRCwKLQkJCQkJICAiQWNjZXNzV2lkdGggJWQgZW5kIGlzIE5PVCB3aXRoaW4gcmVnaW9uXG4iLAotCQkJCQkgIGFjY2Vzc19ieXRlX3dpZHRoKSk7Ci0JCQlpZiAoYWNjZXNzX2J5dGVfd2lkdGggPT0gMSkgewotCQkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfQkZJRUxELAotCQkJCQkJICAiRmllbGQgZ29lcyBiZXlvbmQgZW5kLW9mLXJlZ2lvbiFcbiIpKTsKLQotCQkJCS8qIEZpZWxkIGRvZXMgbm90IGZpdCBpbiB0aGUgcmVnaW9uIGF0IGFsbCAqLwotCi0JCQkJcmV0dXJuX1ZBTFVFKDApOwotCQkJfQotCi0JCQkvKgotCQkJICogVGhpcyB3aWR0aCBnb2VzIGJleW9uZCB0aGUgZW5kLW9mLXJlZ2lvbiwgYmFjayBvZmYgdG8KLQkJCSAqIHByZXZpb3VzIGFjY2VzcwotCQkJICovCi0JCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0JGSUVMRCwKLQkJCQkJICAiQmFja2luZyBvZmYgdG8gcHJldmlvdXMgb3B0aW1hbCBhY2Nlc3Mgd2lkdGggb2YgJWRcbiIsCi0JCQkJCSAgbWluaW11bV9hY2Nlc3Nfd2lkdGgpKTsKLQkJCXJldHVybl9WQUxVRShtaW5pbXVtX2FjY2Vzc193aWR0aCk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIENvdWxkIG5vdCByZWFkL3dyaXRlIGZpZWxkIHdpdGggb25lIG9wZXJhdGlvbiwKLQkgKiBqdXN0IHVzZSBtYXggYWNjZXNzIHdpZHRoCi0JICovCi0JQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9CRklFTEQsCi0JCQkgICJDYW5ub3QgYWNjZXNzIGZpZWxkIGluIG9uZSBvcGVyYXRpb24sIHVzaW5nIHdpZHRoIDhcbiIpKTsKLQlyZXR1cm5fVkFMVUUoOCk7Ci19Ci0jZW5kaWYJCQkJLyogQUNQSV9VTkRFUl9ERVZFTE9QTUVOVCAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X2RlY29kZV9maWVsZF9hY2Nlc3MKLSAqCi0gKiBQQVJBTUVURVJTOiAgb2JqX2Rlc2MgICAgICAgICAgICAtIEZpZWxkIG9iamVjdAotICogICAgICAgICAgICAgIGZpZWxkX2ZsYWdzICAgICAgICAgLSBFbmNvZGVkIGZpZWxkZmxhZ3MgKGNvbnRhaW5zIGFjY2VzcyBiaXRzKQotICogICAgICAgICAgICAgIHJldHVybl9ieXRlX2FsaWdubWVudCAtIFdoZXJlIHRoZSBieXRlIGFsaWdubWVudCBpcyByZXR1cm5lZAotICoKLSAqIFJFVFVSTjogICAgICBGaWVsZCBncmFudWxhcml0eSAoOCwgMTYsIDMyIG9yIDY0KSBhbmQKLSAqICAgICAgICAgICAgICBieXRlX2FsaWdubWVudCAoMSwgMiwgMywgb3IgNCkKLSAqCi0gKiBERVNDUklQVElPTjogRGVjb2RlIHRoZSBhY2Nlc3NfdHlwZSBiaXRzIG9mIGEgZmllbGQgZGVmaW5pdGlvbi4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgdTMyCi1hY3BpX2V4X2RlY29kZV9maWVsZF9hY2Nlc3ModW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2MsCi0JCQkgICAgdTggZmllbGRfZmxhZ3MsIHUzMiAqIHJldHVybl9ieXRlX2FsaWdubWVudCkKLXsKLQl1MzIgYWNjZXNzOwotCXUzMiBieXRlX2FsaWdubWVudDsKLQl1MzIgYml0X2xlbmd0aDsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UoZXhfZGVjb2RlX2ZpZWxkX2FjY2Vzcyk7Ci0KLQlhY2Nlc3MgPSAoZmllbGRfZmxhZ3MgJiBBTUxfRklFTERfQUNDRVNTX1RZUEVfTUFTSyk7Ci0KLQlzd2l0Y2ggKGFjY2VzcykgewotCWNhc2UgQU1MX0ZJRUxEX0FDQ0VTU19BTlk6Ci0KLSNpZmRlZiBBQ1BJX1VOREVSX0RFVkVMT1BNRU5UCi0JCWJ5dGVfYWxpZ25tZW50ID0KLQkJICAgIGFjcGlfZXhfZ2VuZXJhdGVfYWNjZXNzKG9ial9kZXNjLT5jb21tb25fZmllbGQuCi0JCQkJCSAgICBzdGFydF9maWVsZF9iaXRfb2Zmc2V0LAotCQkJCQkgICAgb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5iaXRfbGVuZ3RoLAotCQkJCQkgICAgMHhGRkZGRkZGRgotCQkJCQkgICAgLyogVGVtcCB1bnRpbCB3ZSBwYXNzIHJlZ2lvbl9sZW5ndGggYXMgcGFyYW1ldGVyICovCi0JCSAgICApOwotCQliaXRfbGVuZ3RoID0gYnl0ZV9hbGlnbm1lbnQgKiA4OwotI2VuZGlmCi0KLQkJYnl0ZV9hbGlnbm1lbnQgPSAxOwotCQliaXRfbGVuZ3RoID0gODsKLQkJYnJlYWs7Ci0KLQljYXNlIEFNTF9GSUVMRF9BQ0NFU1NfQllURToKLQljYXNlIEFNTF9GSUVMRF9BQ0NFU1NfQlVGRkVSOgkvKiBBQ1BJIDIuMCAoU01CdXMgQnVmZmVyKSAqLwotCQlieXRlX2FsaWdubWVudCA9IDE7Ci0JCWJpdF9sZW5ndGggPSA4OwotCQlicmVhazsKLQotCWNhc2UgQU1MX0ZJRUxEX0FDQ0VTU19XT1JEOgotCQlieXRlX2FsaWdubWVudCA9IDI7Ci0JCWJpdF9sZW5ndGggPSAxNjsKLQkJYnJlYWs7Ci0KLQljYXNlIEFNTF9GSUVMRF9BQ0NFU1NfRFdPUkQ6Ci0JCWJ5dGVfYWxpZ25tZW50ID0gNDsKLQkJYml0X2xlbmd0aCA9IDMyOwotCQlicmVhazsKLQotCWNhc2UgQU1MX0ZJRUxEX0FDQ0VTU19RV09SRDoJLyogQUNQSSAyLjAgKi8KLQkJYnl0ZV9hbGlnbm1lbnQgPSA4OwotCQliaXRfbGVuZ3RoID0gNjQ7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJLyogSW52YWxpZCBmaWVsZCBhY2Nlc3MgdHlwZSAqLwotCi0JCUFDUElfRVJST1IoKEFFX0lORk8sICJVbmtub3duIGZpZWxkIGFjY2VzcyB0eXBlICVYIiwgYWNjZXNzKSk7Ci0JCXJldHVybl9VSU5UMzIoMCk7Ci0JfQotCi0JaWYgKEFDUElfR0VUX09CSkVDVF9UWVBFKG9ial9kZXNjKSA9PSBBQ1BJX1RZUEVfQlVGRkVSX0ZJRUxEKSB7Ci0JCS8qCi0JCSAqIGJ1ZmZlcl9maWVsZCBhY2Nlc3MgY2FuIGJlIG9uIGFueSBieXRlIGJvdW5kYXJ5LCBzbyB0aGUKLQkJICogYnl0ZV9hbGlnbm1lbnQgaXMgYWx3YXlzIDEgYnl0ZSAtLSByZWdhcmRsZXNzIG9mIGFueSBieXRlX2FsaWdubWVudAotCQkgKiBpbXBsaWVkIGJ5IHRoZSBmaWVsZCBhY2Nlc3MgdHlwZS4KLQkJICovCi0JCWJ5dGVfYWxpZ25tZW50ID0gMTsKLQl9Ci0KLQkqcmV0dXJuX2J5dGVfYWxpZ25tZW50ID0gYnl0ZV9hbGlnbm1lbnQ7Ci0JcmV0dXJuX1VJTlQzMihiaXRfbGVuZ3RoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9leF9wcmVwX2NvbW1vbl9maWVsZF9vYmplY3QKLSAqCi0gKiBQQVJBTUVURVJTOiAgb2JqX2Rlc2MgICAgICAgICAgICAtIFRoZSBmaWVsZCBvYmplY3QKLSAqICAgICAgICAgICAgICBmaWVsZF9mbGFncyAgICAgICAgIC0gQWNjZXNzLCBsb2NrX3J1bGUsIGFuZCB1cGRhdGVfcnVsZS4KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGZvcm1hdCBvZiBhIGZpZWxkX2ZsYWcgaXMgZGVzY3JpYmVkCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSBBQ1BJIHNwZWNpZmljYXRpb24KLSAqICAgICAgICAgICAgICBmaWVsZF9hdHRyaWJ1dGUgICAgIC0gU3BlY2lhbCBhdHRyaWJ1dGVzIChub3QgdXNlZCkKLSAqICAgICAgICAgICAgICBmaWVsZF9iaXRfcG9zaXRpb24gIC0gRmllbGQgc3RhcnQgcG9zaXRpb24KLSAqICAgICAgICAgICAgICBmaWVsZF9iaXRfbGVuZ3RoICAgIC0gRmllbGQgbGVuZ3RoIGluIG51bWJlciBvZiBiaXRzCi0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cwotICoKLSAqIERFU0NSSVBUSU9OOiBJbml0aWFsaXplIHRoZSBhcmVhcyBvZiB0aGUgZmllbGQgb2JqZWN0IHRoYXQgYXJlIGNvbW1vbgotICogICAgICAgICAgICAgIHRvIHRoZSB2YXJpb3VzIHR5cGVzIG9mIGZpZWxkcy4gIE5vdGU6IFRoaXMgaXMgdmVyeSAic2Vuc2l0aXZlIgotICogICAgICAgICAgICAgIGNvZGUgYmVjYXVzZSB3ZSBhcmUgc29sdmluZyB0aGUgZ2VuZXJhbCBjYXNlIGZvciBmaWVsZAotICogICAgICAgICAgICAgIGFsaWdubWVudC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1hY3BpX3N0YXR1cwotYWNwaV9leF9wcmVwX2NvbW1vbl9maWVsZF9vYmplY3QodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2MsCi0JCQkJIHU4IGZpZWxkX2ZsYWdzLAotCQkJCSB1OCBmaWVsZF9hdHRyaWJ1dGUsCi0JCQkJIHUzMiBmaWVsZF9iaXRfcG9zaXRpb24sIHUzMiBmaWVsZF9iaXRfbGVuZ3RoKQotewotCXUzMiBhY2Nlc3NfYml0X3dpZHRoOwotCXUzMiBieXRlX2FsaWdubWVudDsKLQl1MzIgbmVhcmVzdF9ieXRlX2FkZHJlc3M7Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGV4X3ByZXBfY29tbW9uX2ZpZWxkX29iamVjdCk7Ci0KLQkvKgotCSAqIE5vdGU6IHRoZSBzdHJ1Y3R1cmUgYmVpbmcgaW5pdGlhbGl6ZWQgaXMgdGhlCi0JICogQUNQSV9DT01NT05fRklFTERfSU5GTzsgIE5vIHN0cnVjdHVyZSBmaWVsZHMgb3V0c2lkZSBvZiB0aGUgY29tbW9uCi0JICogYXJlYSBhcmUgaW5pdGlhbGl6ZWQgYnkgdGhpcyBwcm9jZWR1cmUuCi0JICovCi0Jb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5maWVsZF9mbGFncyA9IGZpZWxkX2ZsYWdzOwotCW9ial9kZXNjLT5jb21tb25fZmllbGQuYXR0cmlidXRlID0gZmllbGRfYXR0cmlidXRlOwotCW9ial9kZXNjLT5jb21tb25fZmllbGQuYml0X2xlbmd0aCA9IGZpZWxkX2JpdF9sZW5ndGg7Ci0KLQkvKgotCSAqIERlY29kZSB0aGUgYWNjZXNzIHR5cGUgc28gd2UgY2FuIGNvbXB1dGUgb2Zmc2V0cy4gIFRoZSBhY2Nlc3MgdHlwZSBnaXZlcwotCSAqIHR3byBwaWVjZXMgb2YgaW5mb3JtYXRpb24gLSB0aGUgd2lkdGggb2YgZWFjaCBmaWVsZCBhY2Nlc3MgYW5kIHRoZQotCSAqIG5lY2Vzc2FyeSBieXRlX2FsaWdubWVudCAoYWRkcmVzcyBncmFudWxhcml0eSkgb2YgdGhlIGFjY2Vzcy4KLQkgKgotCSAqIEZvciBhbnlfYWNjLCB0aGUgYWNjZXNzX2JpdF93aWR0aCBpcyB0aGUgbGFyZ2VzdCB3aWR0aCB0aGF0IGlzIGJvdGgKLQkgKiBuZWNlc3NhcnkgYW5kIHBvc3NpYmxlIGluIGFuIGF0dGVtcHQgdG8gYWNjZXNzIHRoZSB3aG9sZSBmaWVsZCBpbiBvbmUKLQkgKiBJL08gb3BlcmF0aW9uLiAgSG93ZXZlciwgZm9yIGFueV9hY2MsIHRoZSBieXRlX2FsaWdubWVudCBpcyBhbHdheXMgb25lCi0JICogYnl0ZS4KLQkgKgotCSAqIEZvciBhbGwgQnVmZmVyIEZpZWxkcywgdGhlIGJ5dGVfYWxpZ25tZW50IGlzIGFsd2F5cyBvbmUgYnl0ZS4KLQkgKgotCSAqIEZvciBhbGwgb3RoZXIgYWNjZXNzIHR5cGVzIChCeXRlLCBXb3JkLCBEd29yZCwgUXdvcmQpLCB0aGUgQml0d2lkdGggaXMKLQkgKiB0aGUgc2FtZSAoZXF1aXZhbGVudCkgYXMgdGhlIGJ5dGVfYWxpZ25tZW50LgotCSAqLwotCWFjY2Vzc19iaXRfd2lkdGggPSBhY3BpX2V4X2RlY29kZV9maWVsZF9hY2Nlc3Mob2JqX2Rlc2MsIGZpZWxkX2ZsYWdzLAotCQkJCQkJICAgICAgICZieXRlX2FsaWdubWVudCk7Ci0JaWYgKCFhY2Nlc3NfYml0X3dpZHRoKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfT1BFUkFORF9WQUxVRSk7Ci0JfQotCi0JLyogU2V0dXAgd2lkdGggKGFjY2VzcyBncmFudWxhcml0eSkgZmllbGRzICovCi0KLQlvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmFjY2Vzc19ieXRlX3dpZHRoID0gKHU4KQotCSAgICBBQ1BJX0RJVl84KGFjY2Vzc19iaXRfd2lkdGgpOwkvKiAxLCAgMiwgIDQsICA4ICovCi0KLQlvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmFjY2Vzc19iaXRfd2lkdGggPSAodTgpIGFjY2Vzc19iaXRfd2lkdGg7Ci0KLQkvKgotCSAqIGJhc2VfYnl0ZV9vZmZzZXQgaXMgdGhlIGFkZHJlc3Mgb2YgdGhlIHN0YXJ0IG9mIHRoZSBmaWVsZCB3aXRoaW4gdGhlCi0JICogcmVnaW9uLiAgSXQgaXMgdGhlIGJ5dGUgYWRkcmVzcyBvZiB0aGUgZmlyc3QgKmRhdHVtKiAoZmllbGQtd2lkdGggZGF0YQotCSAqIHVuaXQpIG9mIHRoZSBmaWVsZC4gKGkuZS4sIHRoZSBmaXJzdCBkYXR1bSB0aGF0IGNvbnRhaW5zIGF0IGxlYXN0IHRoZQotCSAqIGZpcnN0ICpiaXQqIG9mIHRoZSBmaWVsZC4pCi0JICoKLQkgKiBOb3RlOiBieXRlX2FsaWdubWVudCBpcyBhbHdheXMgZWl0aGVyIGVxdWFsIHRvIHRoZSBhY2Nlc3NfYml0X3dpZHRoIG9yIDgKLQkgKiAoQnl0ZSBhY2Nlc3MpLCBhbmQgaXQgZGVmaW5lcyB0aGUgYWRkcmVzc2luZyBncmFudWxhcml0eSBvZiB0aGUgcGFyZW50Ci0JICogcmVnaW9uIG9yIGJ1ZmZlci4KLQkgKi8KLQluZWFyZXN0X2J5dGVfYWRkcmVzcyA9Ci0JICAgIEFDUElfUk9VTkRfQklUU19ET1dOX1RPX0JZVEVTKGZpZWxkX2JpdF9wb3NpdGlvbik7Ci0Jb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5iYXNlX2J5dGVfb2Zmc2V0ID0gKHUzMikKLQkgICAgQUNQSV9ST1VORF9ET1dOKG5lYXJlc3RfYnl0ZV9hZGRyZXNzLCBieXRlX2FsaWdubWVudCk7Ci0KLQkvKgotCSAqIHN0YXJ0X2ZpZWxkX2JpdF9vZmZzZXQgaXMgdGhlIG9mZnNldCBvZiB0aGUgZmlyc3QgYml0IG9mIHRoZSBmaWVsZCB3aXRoaW4KLQkgKiBhIGZpZWxkIGRhdHVtLgotCSAqLwotCW9ial9kZXNjLT5jb21tb25fZmllbGQuc3RhcnRfZmllbGRfYml0X29mZnNldCA9ICh1OCkKLQkgICAgKGZpZWxkX2JpdF9wb3NpdGlvbiAtCi0JICAgICBBQ1BJX01VTF84KG9ial9kZXNjLT5jb21tb25fZmllbGQuYmFzZV9ieXRlX29mZnNldCkpOwotCi0JLyoKLQkgKiBEb2VzIHRoZSBlbnRpcmUgZmllbGQgZml0IHdpdGhpbiBhIHNpbmdsZSBmaWVsZCBhY2Nlc3MgZWxlbWVudD8gKGRhdHVtKQotCSAqIChpLmUuLCB3aXRob3V0IGNyb3NzaW5nIGEgZGF0dW0gYm91bmRhcnkpCi0JICovCi0JaWYgKChvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLnN0YXJ0X2ZpZWxkX2JpdF9vZmZzZXQgKwotCSAgICAgZmllbGRfYml0X2xlbmd0aCkgPD0gKHUxNikgYWNjZXNzX2JpdF93aWR0aCkgewotCQlvYmpfZGVzYy0+Y29tbW9uLmZsYWdzIHw9IEFPUE9CSl9TSU5HTEVfREFUVU07Ci0JfQotCi0JcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9leF9wcmVwX2ZpZWxkX3ZhbHVlCi0gKgotICogUEFSQU1FVEVSUzogIEluZm8gICAgLSBDb250YWlucyBhbGwgZmllbGQgY3JlYXRpb24gaW5mbwotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKLSAqCi0gKiBERVNDUklQVElPTjogQ29uc3RydWN0IGFuIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3Qgb2YgdHlwZSBkZWZfZmllbGQgYW5kCi0gKiAgICAgICAgICAgICAgY29ubmVjdCBpdCB0byB0aGUgcGFyZW50IE5vZGUuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotYWNwaV9zdGF0dXMgYWNwaV9leF9wcmVwX2ZpZWxkX3ZhbHVlKHN0cnVjdCBhY3BpX2NyZWF0ZV9maWVsZF9pbmZvICppbmZvKQotewotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjOwotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnNlY29uZF9kZXNjID0gTlVMTDsKLQl1MzIgdHlwZTsKLQlhY3BpX3N0YXR1cyBzdGF0dXM7Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGV4X3ByZXBfZmllbGRfdmFsdWUpOwotCi0JLyogUGFyYW1ldGVyIHZhbGlkYXRpb24gKi8KLQotCWlmIChpbmZvLT5maWVsZF90eXBlICE9IEFDUElfVFlQRV9MT0NBTF9JTkRFWF9GSUVMRCkgewotCQlpZiAoIWluZm8tPnJlZ2lvbl9ub2RlKSB7Ci0JCQlBQ1BJX0VSUk9SKChBRV9JTkZPLCAiTnVsbCBSZWdpb25Ob2RlIikpOwotCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9OT19PUEVSQU5EKTsKLQkJfQotCi0JCXR5cGUgPSBhY3BpX25zX2dldF90eXBlKGluZm8tPnJlZ2lvbl9ub2RlKTsKLQkJaWYgKHR5cGUgIT0gQUNQSV9UWVBFX1JFR0lPTikgewotCQkJQUNQSV9FUlJPUigoQUVfSU5GTywKLQkJCQkgICAgIk5lZWRlZCBSZWdpb24sIGZvdW5kIHR5cGUgJVggKCVzKSIsCi0JCQkJICAgIHR5cGUsIGFjcGlfdXRfZ2V0X3R5cGVfbmFtZSh0eXBlKSkpOwotCi0JCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX09QRVJBTkRfVFlQRSk7Ci0JCX0KLQl9Ci0KLQkvKiBBbGxvY2F0ZSBhIG5ldyBmaWVsZCBvYmplY3QgKi8KLQotCW9ial9kZXNjID0gYWNwaV91dF9jcmVhdGVfaW50ZXJuYWxfb2JqZWN0KGluZm8tPmZpZWxkX3R5cGUpOwotCWlmICghb2JqX2Rlc2MpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX01FTU9SWSk7Ci0JfQotCi0JLyogSW5pdGlhbGl6ZSBhcmVhcyBvZiB0aGUgb2JqZWN0IHRoYXQgYXJlIGNvbW1vbiB0byBhbGwgZmllbGRzICovCi0KLQlvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLm5vZGUgPSBpbmZvLT5maWVsZF9ub2RlOwotCXN0YXR1cyA9IGFjcGlfZXhfcHJlcF9jb21tb25fZmllbGRfb2JqZWN0KG9ial9kZXNjLCBpbmZvLT5maWVsZF9mbGFncywKLQkJCQkJCSAgaW5mby0+YXR0cmlidXRlLAotCQkJCQkJICBpbmZvLT5maWVsZF9iaXRfcG9zaXRpb24sCi0JCQkJCQkgIGluZm8tPmZpZWxkX2JpdF9sZW5ndGgpOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlhY3BpX3V0X2RlbGV0ZV9vYmplY3RfZGVzYyhvYmpfZGVzYyk7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotCX0KLQotCS8qIEluaXRpYWxpemUgYXJlYXMgb2YgdGhlIG9iamVjdCB0aGF0IGFyZSBzcGVjaWZpYyB0byB0aGUgZmllbGQgdHlwZSAqLwotCi0Jc3dpdGNoIChpbmZvLT5maWVsZF90eXBlKSB7Ci0JY2FzZSBBQ1BJX1RZUEVfTE9DQUxfUkVHSU9OX0ZJRUxEOgotCi0JCW9ial9kZXNjLT5maWVsZC5yZWdpb25fb2JqID0KLQkJICAgIGFjcGlfbnNfZ2V0X2F0dGFjaGVkX29iamVjdChpbmZvLT5yZWdpb25fbm9kZSk7Ci0KLQkJLyogQW4gYWRkaXRpb25hbCByZWZlcmVuY2UgZm9yIHRoZSBjb250YWluZXIgKi8KLQotCQlhY3BpX3V0X2FkZF9yZWZlcmVuY2Uob2JqX2Rlc2MtPmZpZWxkLnJlZ2lvbl9vYmopOwotCi0JCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfQkZJRUxELAotCQkJCSAgIlJlZ2lvbkZpZWxkOiBCaXRPZmYgJVgsIE9mZiAlWCwgR3JhbiAlWCwgUmVnaW9uICVwXG4iLAotCQkJCSAgb2JqX2Rlc2MtPmZpZWxkLnN0YXJ0X2ZpZWxkX2JpdF9vZmZzZXQsCi0JCQkJICBvYmpfZGVzYy0+ZmllbGQuYmFzZV9ieXRlX29mZnNldCwKLQkJCQkgIG9ial9kZXNjLT5maWVsZC5hY2Nlc3NfYnl0ZV93aWR0aCwKLQkJCQkgIG9ial9kZXNjLT5maWVsZC5yZWdpb25fb2JqKSk7Ci0JCWJyZWFrOwotCi0JY2FzZSBBQ1BJX1RZUEVfTE9DQUxfQkFOS19GSUVMRDoKLQotCQlvYmpfZGVzYy0+YmFua19maWVsZC52YWx1ZSA9IGluZm8tPmJhbmtfdmFsdWU7Ci0JCW9ial9kZXNjLT5iYW5rX2ZpZWxkLnJlZ2lvbl9vYmogPQotCQkgICAgYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0KGluZm8tPnJlZ2lvbl9ub2RlKTsKLQkJb2JqX2Rlc2MtPmJhbmtfZmllbGQuYmFua19vYmogPQotCQkgICAgYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0KGluZm8tPnJlZ2lzdGVyX25vZGUpOwotCi0JCS8qIEFuIGFkZGl0aW9uYWwgcmVmZXJlbmNlIGZvciB0aGUgYXR0YWNoZWQgb2JqZWN0cyAqLwotCi0JCWFjcGlfdXRfYWRkX3JlZmVyZW5jZShvYmpfZGVzYy0+YmFua19maWVsZC5yZWdpb25fb2JqKTsKLQkJYWNwaV91dF9hZGRfcmVmZXJlbmNlKG9ial9kZXNjLT5iYW5rX2ZpZWxkLmJhbmtfb2JqKTsKLQotCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0JGSUVMRCwKLQkJCQkgICJCYW5rIEZpZWxkOiBCaXRPZmYgJVgsIE9mZiAlWCwgR3JhbiAlWCwgUmVnaW9uICVwLCBCYW5rUmVnICVwXG4iLAotCQkJCSAgb2JqX2Rlc2MtPmJhbmtfZmllbGQuc3RhcnRfZmllbGRfYml0X29mZnNldCwKLQkJCQkgIG9ial9kZXNjLT5iYW5rX2ZpZWxkLmJhc2VfYnl0ZV9vZmZzZXQsCi0JCQkJICBvYmpfZGVzYy0+ZmllbGQuYWNjZXNzX2J5dGVfd2lkdGgsCi0JCQkJICBvYmpfZGVzYy0+YmFua19maWVsZC5yZWdpb25fb2JqLAotCQkJCSAgb2JqX2Rlc2MtPmJhbmtfZmllbGQuYmFua19vYmopKTsKLQotCQkvKgotCQkgKiBSZW1lbWJlciBsb2NhdGlvbiBpbiBBTUwgc3RyZWFtIG9mIHRoZSBmaWVsZCB1bml0Ci0JCSAqIG9wY29kZSBhbmQgb3BlcmFuZHMgLS0gc2luY2UgdGhlIGJhbmtfdmFsdWUKLQkJICogb3BlcmFuZHMgbXVzdCBiZSBldmFsdWF0ZWQuCi0JCSAqLwotCQlzZWNvbmRfZGVzYyA9IG9ial9kZXNjLT5jb21tb24ubmV4dF9vYmplY3Q7Ci0JCXNlY29uZF9kZXNjLT5leHRyYS5hbWxfc3RhcnQgPQotCQkgICAgQUNQSV9DQVNUX1BUUih1bmlvbiBhY3BpX3BhcnNlX29iamVjdCwKLQkJCQkgIGluZm8tPmRhdGFfcmVnaXN0ZXJfbm9kZSktPm5hbWVkLmRhdGE7Ci0JCXNlY29uZF9kZXNjLT5leHRyYS5hbWxfbGVuZ3RoID0KLQkJICAgIEFDUElfQ0FTVF9QVFIodW5pb24gYWNwaV9wYXJzZV9vYmplY3QsCi0JCQkJICBpbmZvLT5kYXRhX3JlZ2lzdGVyX25vZGUpLT5uYW1lZC5sZW5ndGg7Ci0KLQkJYnJlYWs7Ci0KLQljYXNlIEFDUElfVFlQRV9MT0NBTF9JTkRFWF9GSUVMRDoKLQotCQkvKiBHZXQgdGhlIEluZGV4IGFuZCBEYXRhIHJlZ2lzdGVycyAqLwotCi0JCW9ial9kZXNjLT5pbmRleF9maWVsZC5pbmRleF9vYmogPQotCQkgICAgYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0KGluZm8tPnJlZ2lzdGVyX25vZGUpOwotCQlvYmpfZGVzYy0+aW5kZXhfZmllbGQuZGF0YV9vYmogPQotCQkgICAgYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0KGluZm8tPmRhdGFfcmVnaXN0ZXJfbm9kZSk7Ci0KLQkJaWYgKCFvYmpfZGVzYy0+aW5kZXhfZmllbGQuZGF0YV9vYmoKLQkJICAgIHx8ICFvYmpfZGVzYy0+aW5kZXhfZmllbGQuaW5kZXhfb2JqKSB7Ci0JCQlBQ1BJX0VSUk9SKChBRV9JTkZPLAotCQkJCSAgICAiTnVsbCBJbmRleCBPYmplY3QgZHVyaW5nIGZpZWxkIHByZXAiKSk7Ci0JCQlhY3BpX3V0X2RlbGV0ZV9vYmplY3RfZGVzYyhvYmpfZGVzYyk7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX0lOVEVSTkFMKTsKLQkJfQotCi0JCS8qIEFuIGFkZGl0aW9uYWwgcmVmZXJlbmNlIGZvciB0aGUgYXR0YWNoZWQgb2JqZWN0cyAqLwotCi0JCWFjcGlfdXRfYWRkX3JlZmVyZW5jZShvYmpfZGVzYy0+aW5kZXhfZmllbGQuZGF0YV9vYmopOwotCQlhY3BpX3V0X2FkZF9yZWZlcmVuY2Uob2JqX2Rlc2MtPmluZGV4X2ZpZWxkLmluZGV4X29iaik7Ci0KLQkJLyoKLQkJICogQXByaWwgMjAwNjogQ2hhbmdlZCB0byBtYXRjaCBNUyBiZWhhdmlvcgotCQkgKgotCQkgKiBUaGUgdmFsdWUgd3JpdHRlbiB0byB0aGUgSW5kZXggcmVnaXN0ZXIgaXMgdGhlIGJ5dGUgb2Zmc2V0IG9mIHRoZQotCQkgKiB0YXJnZXQgZmllbGQgaW4gdW5pdHMgb2YgdGhlIGdyYW51bGFyaXR5IG9mIHRoZSBpbmRleF9maWVsZAotCQkgKgotCQkgKiBQcmV2aW91c2x5LCB0aGUgdmFsdWUgd2FzIGNhbGN1bGF0ZWQgYXMgYW4gaW5kZXggaW4gdGVybXMgb2YgdGhlCi0JCSAqIHdpZHRoIG9mIHRoZSBEYXRhIHJlZ2lzdGVyLCBhcyBiZWxvdzoKLQkJICoKLQkJICogICAgICBvYmpfZGVzYy0+aW5kZXhfZmllbGQuVmFsdWUgPSAodTMyKQotCQkgKiAgICAgICAgICAoSW5mby0+ZmllbGRfYml0X3Bvc2l0aW9uIC8gQUNQSV9NVUxfOCAoCi0JCSAqICAgICAgICAgICAgICBvYmpfZGVzYy0+RmllbGQuYWNjZXNzX2J5dGVfd2lkdGgpKTsKLQkJICoKLQkJICogRmVicnVhcnkgMjAwNjogVHJpZWQgdmFsdWUgYXMgYSBieXRlIG9mZnNldDoKLQkJICogICAgICBvYmpfZGVzYy0+aW5kZXhfZmllbGQuVmFsdWUgPSAodTMyKQotCQkgKiAgICAgICAgICBBQ1BJX0RJVl84IChJbmZvLT5maWVsZF9iaXRfcG9zaXRpb24pOwotCQkgKi8KLQkJb2JqX2Rlc2MtPmluZGV4X2ZpZWxkLnZhbHVlID0KLQkJICAgICh1MzIpIEFDUElfUk9VTkRfRE9XTihBQ1BJX0RJVl84KGluZm8tPmZpZWxkX2JpdF9wb3NpdGlvbiksCi0JCQkJCSAgb2JqX2Rlc2MtPmluZGV4X2ZpZWxkLgotCQkJCQkgIGFjY2Vzc19ieXRlX3dpZHRoKTsKLQotCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0JGSUVMRCwKLQkJCQkgICJJbmRleEZpZWxkOiBCaXRPZmYgJVgsIE9mZiAlWCwgVmFsdWUgJVgsIEdyYW4gJVgsIEluZGV4ICVwLCBEYXRhICVwXG4iLAotCQkJCSAgb2JqX2Rlc2MtPmluZGV4X2ZpZWxkLnN0YXJ0X2ZpZWxkX2JpdF9vZmZzZXQsCi0JCQkJICBvYmpfZGVzYy0+aW5kZXhfZmllbGQuYmFzZV9ieXRlX29mZnNldCwKLQkJCQkgIG9ial9kZXNjLT5pbmRleF9maWVsZC52YWx1ZSwKLQkJCQkgIG9ial9kZXNjLT5maWVsZC5hY2Nlc3NfYnl0ZV93aWR0aCwKLQkJCQkgIG9ial9kZXNjLT5pbmRleF9maWVsZC5pbmRleF9vYmosCi0JCQkJICBvYmpfZGVzYy0+aW5kZXhfZmllbGQuZGF0YV9vYmopKTsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQkvKiBObyBvdGhlciB0eXBlcyBzaG91bGQgZ2V0IGhlcmUgKi8KLQkJYnJlYWs7Ci0JfQotCi0JLyoKLQkgKiBTdG9yZSB0aGUgY29uc3RydWN0ZWQgZGVzY3JpcHRvciAob2JqX2Rlc2MpIGludG8gdGhlIHBhcmVudCBOb2RlLAotCSAqIHByZXNlcnZpbmcgdGhlIGN1cnJlbnQgdHlwZSBvZiB0aGF0IG5hbWVkX29iai4KLQkgKi8KLQlzdGF0dXMgPSBhY3BpX25zX2F0dGFjaF9vYmplY3QoaW5mby0+ZmllbGRfbm9kZSwgb2JqX2Rlc2MsCi0JCQkJICAgICAgIGFjcGlfbnNfZ2V0X3R5cGUoaW5mby0+ZmllbGRfbm9kZSkpOwotCi0JQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9CRklFTEQsCi0JCQkgICJTZXQgTmFtZWRPYmogJXAgWyU0LjRzXSwgT2JqRGVzYyAlcFxuIiwKLQkJCSAgaW5mby0+ZmllbGRfbm9kZSwKLQkJCSAgYWNwaV91dF9nZXRfbm9kZV9uYW1lKGluZm8tPmZpZWxkX25vZGUpLCBvYmpfZGVzYykpOwotCi0JLyogUmVtb3ZlIGxvY2FsIHJlZmVyZW5jZSB0byB0aGUgb2JqZWN0ICovCi0KLQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2Uob2JqX2Rlc2MpOwotCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4cmVnaW9uLmMgYi9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhyZWdpb24uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2E0MWM0MC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhyZWdpb24uYworKysgL2Rldi9udWxsCkBAIC0xLDQ5OCArMCwwIEBACi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBNb2R1bGUgTmFtZTogZXhyZWdpb24gLSBBQ1BJIGRlZmF1bHQgb3BfcmVnaW9uIChhZGRyZXNzIHNwYWNlKSBoYW5kbGVycwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDgsIEludGVsIENvcnAuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCi0gKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSBhdCBtaW5pbXVtIGEgZGlzY2xhaW1lcgotICogICAgc3Vic3RhbnRpYWxseSBzaW1pbGFyIHRvIHRoZSAiTk8gV0FSUkFOVFkiIGRpc2NsYWltZXIgYmVsb3cKLSAqICAgICgiRGlzY2xhaW1lciIpIGFuZCBhbnkgcmVkaXN0cmlidXRpb24gbXVzdCBiZSBjb25kaXRpb25lZCB1cG9uCi0gKiAgICBpbmNsdWRpbmcgYSBzdWJzdGFudGlhbGx5IHNpbWlsYXIgRGlzY2xhaW1lciByZXF1aXJlbWVudCBmb3IgZnVydGhlcgotICogICAgYmluYXJ5IHJlZGlzdHJpYnV0aW9uLgotICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzCi0gKiAgICBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIE5PIFdBUlJBTlRZCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKLSAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCi0gKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORwotICogSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCi0gKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCi0gKi8KLQotI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgotI2luY2x1ZGUgPGFjcGkvYWNpbnRlcnAuaD4KLQotI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfRVhFQ1VURVIKLUFDUElfTU9EVUxFX05BTUUoImV4cmVnaW9uIikKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9leF9zeXN0ZW1fbWVtb3J5X3NwYWNlX2hhbmRsZXIKLSAqCi0gKiBQQVJBTUVURVJTOiAgRnVuY3Rpb24gICAgICAgICAgICAtIFJlYWQgb3IgV3JpdGUgb3BlcmF0aW9uCi0gKiAgICAgICAgICAgICAgQWRkcmVzcyAgICAgICAgICAgICAtIFdoZXJlIGluIHRoZSBzcGFjZSB0byByZWFkIG9yIHdyaXRlCi0gKiAgICAgICAgICAgICAgYml0X3dpZHRoICAgICAgICAgICAtIEZpZWxkIHdpZHRoIGluIGJpdHMgKDgsIDE2LCBvciAzMikKLSAqICAgICAgICAgICAgICBWYWx1ZSAgICAgICAgICAgICAgIC0gUG9pbnRlciB0byBpbiBvciBvdXQgdmFsdWUKLSAqICAgICAgICAgICAgICBoYW5kbGVyX2NvbnRleHQgICAgIC0gUG9pbnRlciB0byBIYW5kbGVyJ3MgY29udGV4dAotICogICAgICAgICAgICAgIHJlZ2lvbl9jb250ZXh0ICAgICAgLSBQb2ludGVyIHRvIGNvbnRleHQgc3BlY2lmaWMgdG8gdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY2Vzc2VkIHJlZ2lvbgotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKLSAqCi0gKiBERVNDUklQVElPTjogSGFuZGxlciBmb3IgdGhlIFN5c3RlbSBNZW1vcnkgYWRkcmVzcyBzcGFjZSAoT3AgUmVnaW9uKQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1hY3BpX3N0YXR1cwotYWNwaV9leF9zeXN0ZW1fbWVtb3J5X3NwYWNlX2hhbmRsZXIodTMyIGZ1bmN0aW9uLAotCQkJCSAgICBhY3BpX3BoeXNpY2FsX2FkZHJlc3MgYWRkcmVzcywKLQkJCQkgICAgdTMyIGJpdF93aWR0aCwKLQkJCQkgICAgYWNwaV9pbnRlZ2VyICogdmFsdWUsCi0JCQkJICAgIHZvaWQgKmhhbmRsZXJfY29udGV4dCwgdm9pZCAqcmVnaW9uX2NvbnRleHQpCi17Ci0JYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7Ci0Jdm9pZCAqbG9naWNhbF9hZGRyX3B0ciA9IE5VTEw7Ci0Jc3RydWN0IGFjcGlfbWVtX3NwYWNlX2NvbnRleHQgKm1lbV9pbmZvID0gcmVnaW9uX2NvbnRleHQ7Ci0JdTMyIGxlbmd0aDsKLQlhY3BpX3NpemUgd2luZG93X3NpemU7Ci0jaWZkZWYgQUNQSV9NSVNBTElHTk1FTlRfTk9UX1NVUFBPUlRFRAotCXUzMiByZW1haW5kZXI7Ci0jZW5kaWYKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UoZXhfc3lzdGVtX21lbW9yeV9zcGFjZV9oYW5kbGVyKTsKLQotCS8qIFZhbGlkYXRlIGFuZCB0cmFuc2xhdGUgdGhlIGJpdCB3aWR0aCAqLwotCi0Jc3dpdGNoIChiaXRfd2lkdGgpIHsKLQljYXNlIDg6Ci0JCWxlbmd0aCA9IDE7Ci0JCWJyZWFrOwotCi0JY2FzZSAxNjoKLQkJbGVuZ3RoID0gMjsKLQkJYnJlYWs7Ci0KLQljYXNlIDMyOgotCQlsZW5ndGggPSA0OwotCQlicmVhazsKLQotCWNhc2UgNjQ6Ci0JCWxlbmd0aCA9IDg7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJQUNQSV9FUlJPUigoQUVfSU5GTywgIkludmFsaWQgU3lzdGVtTWVtb3J5IHdpZHRoICVkIiwKLQkJCSAgICBiaXRfd2lkdGgpKTsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9PUEVSQU5EX1ZBTFVFKTsKLQl9Ci0KLSNpZmRlZiBBQ1BJX01JU0FMSUdOTUVOVF9OT1RfU1VQUE9SVEVECi0JLyoKLQkgKiBIYXJkd2FyZSBkb2VzIG5vdCBzdXBwb3J0IG5vbi1hbGlnbmVkIGRhdGEgdHJhbnNmZXJzLCB3ZSBtdXN0IHZlcmlmeQotCSAqIHRoZSByZXF1ZXN0LgotCSAqLwotCSh2b2lkKWFjcGlfdXRfc2hvcnRfZGl2aWRlKChhY3BpX2ludGVnZXIpIGFkZHJlc3MsIGxlbmd0aCwgTlVMTCwKLQkJCQkgICAmcmVtYWluZGVyKTsKLQlpZiAocmVtYWluZGVyICE9IDApIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9BTElHTk1FTlQpOwotCX0KLSNlbmRpZgotCi0JLyoKLQkgKiBEb2VzIHRoZSByZXF1ZXN0IGZpdCBpbnRvIHRoZSBjYWNoZWQgbWVtb3J5IG1hcHBpbmc/Ci0JICogSXMgMSkgQWRkcmVzcyBiZWxvdyB0aGUgY3VycmVudCBtYXBwaW5nPyBPUgotCSAqICAgIDIpIEFkZHJlc3MgYmV5b25kIHRoZSBjdXJyZW50IG1hcHBpbmc/Ci0JICovCi0JaWYgKChhZGRyZXNzIDwgbWVtX2luZm8tPm1hcHBlZF9waHlzaWNhbF9hZGRyZXNzKSB8fAotCSAgICAoKChhY3BpX2ludGVnZXIpIGFkZHJlc3MgKyBsZW5ndGgpID4gKChhY3BpX2ludGVnZXIpCi0JCQkJCQkgIG1lbV9pbmZvLT4KLQkJCQkJCSAgbWFwcGVkX3BoeXNpY2FsX2FkZHJlc3MgKwotCQkJCQkJICBtZW1faW5mby0+bWFwcGVkX2xlbmd0aCkpKSB7Ci0JCS8qCi0JCSAqIFRoZSByZXF1ZXN0IGNhbm5vdCBiZSByZXNvbHZlZCBieSB0aGUgY3VycmVudCBtZW1vcnkgbWFwcGluZzsKLQkJICogRGVsZXRlIHRoZSBleGlzdGluZyBtYXBwaW5nIGFuZCBjcmVhdGUgYSBuZXcgb25lLgotCQkgKi8KLQkJaWYgKG1lbV9pbmZvLT5tYXBwZWRfbGVuZ3RoKSB7Ci0KLQkJCS8qIFZhbGlkIG1hcHBpbmcsIGRlbGV0ZSBpdCAqLwotCi0JCQlhY3BpX29zX3VubWFwX21lbW9yeShtZW1faW5mby0+bWFwcGVkX2xvZ2ljYWxfYWRkcmVzcywKLQkJCQkJICAgICBtZW1faW5mby0+bWFwcGVkX2xlbmd0aCk7Ci0JCX0KLQotCQkvKgotCQkgKiBEb24ndCBhdHRlbXB0IHRvIG1hcCBtZW1vcnkgYmV5b25kIHRoZSBlbmQgb2YgdGhlIHJlZ2lvbiwgYW5kCi0JCSAqIGNvbnN0cmFpbiB0aGUgbWF4aW11bSBtYXBwaW5nIHNpemUgdG8gc29tZXRoaW5nIHJlYXNvbmFibGUuCi0JCSAqLwotCQl3aW5kb3dfc2l6ZSA9IChhY3BpX3NpemUpCi0JCSAgICAoKG1lbV9pbmZvLT5hZGRyZXNzICsgbWVtX2luZm8tPmxlbmd0aCkgLSBhZGRyZXNzKTsKLQotCQlpZiAod2luZG93X3NpemUgPiBBQ1BJX1NZU01FTV9SRUdJT05fV0lORE9XX1NJWkUpIHsKLQkJCXdpbmRvd19zaXplID0gQUNQSV9TWVNNRU1fUkVHSU9OX1dJTkRPV19TSVpFOwotCQl9Ci0KLQkJLyogQ3JlYXRlIGEgbmV3IG1hcHBpbmcgc3RhcnRpbmcgYXQgdGhlIGFkZHJlc3MgZ2l2ZW4gKi8KLQotCQltZW1faW5mby0+bWFwcGVkX2xvZ2ljYWxfYWRkcmVzcyA9Ci0JCQlhY3BpX29zX21hcF9tZW1vcnkoKGFjcGlfcGh5c2ljYWxfYWRkcmVzcykgYWRkcmVzcywgd2luZG93X3NpemUpOwotCQlpZiAoIW1lbV9pbmZvLT5tYXBwZWRfbG9naWNhbF9hZGRyZXNzKSB7Ci0JCQlBQ1BJX0VSUk9SKChBRV9JTkZPLAotCQkJCSAgICAiQ291bGQgbm90IG1hcCBtZW1vcnkgYXQgJTguOFglOC44WCwgc2l6ZSAlWCIsCi0JCQkJICAgIEFDUElfRk9STUFUX05BVElWRV9VSU5UKGFkZHJlc3MpLAotCQkJCSAgICAodTMyKSB3aW5kb3dfc2l6ZSkpOwotCQkJbWVtX2luZm8tPm1hcHBlZF9sZW5ndGggPSAwOwotCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX01FTU9SWSk7Ci0JCX0KLQotCQkvKiBTYXZlIHRoZSBwaHlzaWNhbCBhZGRyZXNzIGFuZCBtYXBwaW5nIHNpemUgKi8KLQotCQltZW1faW5mby0+bWFwcGVkX3BoeXNpY2FsX2FkZHJlc3MgPSBhZGRyZXNzOwotCQltZW1faW5mby0+bWFwcGVkX2xlbmd0aCA9IHdpbmRvd19zaXplOwotCX0KLQotCS8qCi0JICogR2VuZXJhdGUgYSBsb2dpY2FsIHBvaW50ZXIgY29ycmVzcG9uZGluZyB0byB0aGUgYWRkcmVzcyB3ZSB3YW50IHRvCi0JICogYWNjZXNzCi0JICovCi0JbG9naWNhbF9hZGRyX3B0ciA9IG1lbV9pbmZvLT5tYXBwZWRfbG9naWNhbF9hZGRyZXNzICsKLQkgICAgKChhY3BpX2ludGVnZXIpIGFkZHJlc3MgLQotCSAgICAgKGFjcGlfaW50ZWdlcikgbWVtX2luZm8tPm1hcHBlZF9waHlzaWNhbF9hZGRyZXNzKTsKLQotCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywKLQkJCSAgIlN5c3RlbS1NZW1vcnkgKHdpZHRoICVkKSBSL1cgJWQgQWRkcmVzcz0lOC44WCU4LjhYXG4iLAotCQkJICBiaXRfd2lkdGgsIGZ1bmN0aW9uLAotCQkJICBBQ1BJX0ZPUk1BVF9OQVRJVkVfVUlOVChhZGRyZXNzKSkpOwotCi0JLyoKLQkgKiBQZXJmb3JtIHRoZSBtZW1vcnkgcmVhZCBvciB3cml0ZQotCSAqCi0JICogTm90ZTogRm9yIG1hY2hpbmVzIHRoYXQgZG8gbm90IHN1cHBvcnQgbm9uLWFsaWduZWQgdHJhbnNmZXJzLCB0aGUgdGFyZ2V0Ci0JICogYWRkcmVzcyB3YXMgY2hlY2tlZCBmb3IgYWxpZ25tZW50IGFib3ZlLiAgV2UgZG8gbm90IGF0dGVtcHQgdG8gYnJlYWsgdGhlCi0JICogdHJhbnNmZXIgdXAgaW50byBzbWFsbGVyIChieXRlLXNpemUpIGNodW5rcyBiZWNhdXNlIHRoZSBBTUwgc3BlY2lmaWNhbGx5Ci0JICogYXNrZWQgZm9yIGEgdHJhbnNmZXIgd2lkdGggdGhhdCB0aGUgaGFyZHdhcmUgbWF5IHJlcXVpcmUuCi0JICovCi0Jc3dpdGNoIChmdW5jdGlvbikgewotCWNhc2UgQUNQSV9SRUFEOgotCi0JCSp2YWx1ZSA9IDA7Ci0JCXN3aXRjaCAoYml0X3dpZHRoKSB7Ci0JCWNhc2UgODoKLQkJCSp2YWx1ZSA9IChhY3BpX2ludGVnZXIpIEFDUElfR0VUOChsb2dpY2FsX2FkZHJfcHRyKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgMTY6Ci0JCQkqdmFsdWUgPSAoYWNwaV9pbnRlZ2VyKSBBQ1BJX0dFVDE2KGxvZ2ljYWxfYWRkcl9wdHIpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSAzMjoKLQkJCSp2YWx1ZSA9IChhY3BpX2ludGVnZXIpIEFDUElfR0VUMzIobG9naWNhbF9hZGRyX3B0cik7Ci0JCQlicmVhazsKLQotCQljYXNlIDY0OgotCQkJKnZhbHVlID0gKGFjcGlfaW50ZWdlcikgQUNQSV9HRVQ2NChsb2dpY2FsX2FkZHJfcHRyKTsKLQkJCWJyZWFrOwotCi0JCWRlZmF1bHQ6Ci0JCQkvKiBiaXRfd2lkdGggd2FzIGFscmVhZHkgdmFsaWRhdGVkICovCi0JCQlicmVhazsKLQkJfQotCQlicmVhazsKLQotCWNhc2UgQUNQSV9XUklURToKLQotCQlzd2l0Y2ggKGJpdF93aWR0aCkgewotCQljYXNlIDg6Ci0JCQlBQ1BJX1NFVDgobG9naWNhbF9hZGRyX3B0cikgPSAodTgpICogdmFsdWU7Ci0JCQlicmVhazsKLQotCQljYXNlIDE2OgotCQkJQUNQSV9TRVQxNihsb2dpY2FsX2FkZHJfcHRyKSA9ICh1MTYpICogdmFsdWU7Ci0JCQlicmVhazsKLQotCQljYXNlIDMyOgotCQkJQUNQSV9TRVQzMihsb2dpY2FsX2FkZHJfcHRyKSA9ICh1MzIpICogdmFsdWU7Ci0JCQlicmVhazsKLQotCQljYXNlIDY0OgotCQkJQUNQSV9TRVQ2NChsb2dpY2FsX2FkZHJfcHRyKSA9ICh1NjQpICogdmFsdWU7Ci0JCQlicmVhazsKLQotCQlkZWZhdWx0OgotCQkJLyogYml0X3dpZHRoIHdhcyBhbHJlYWR5IHZhbGlkYXRlZCAqLwotCQkJYnJlYWs7Ci0JCX0KLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlzdGF0dXMgPSBBRV9CQURfUEFSQU1FVEVSOwotCQlicmVhazsKLQl9Ci0KLQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9leF9zeXN0ZW1faW9fc3BhY2VfaGFuZGxlcgotICoKLSAqIFBBUkFNRVRFUlM6ICBGdW5jdGlvbiAgICAgICAgICAgIC0gUmVhZCBvciBXcml0ZSBvcGVyYXRpb24KLSAqICAgICAgICAgICAgICBBZGRyZXNzICAgICAgICAgICAgIC0gV2hlcmUgaW4gdGhlIHNwYWNlIHRvIHJlYWQgb3Igd3JpdGUKLSAqICAgICAgICAgICAgICBiaXRfd2lkdGggICAgICAgICAgIC0gRmllbGQgd2lkdGggaW4gYml0cyAoOCwgMTYsIG9yIDMyKQotICogICAgICAgICAgICAgIFZhbHVlICAgICAgICAgICAgICAgLSBQb2ludGVyIHRvIGluIG9yIG91dCB2YWx1ZQotICogICAgICAgICAgICAgIGhhbmRsZXJfY29udGV4dCAgICAgLSBQb2ludGVyIHRvIEhhbmRsZXIncyBjb250ZXh0Ci0gKiAgICAgICAgICAgICAgcmVnaW9uX2NvbnRleHQgICAgICAtIFBvaW50ZXIgdG8gY29udGV4dCBzcGVjaWZpYyB0byB0aGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjZXNzZWQgcmVnaW9uCi0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cwotICoKLSAqIERFU0NSSVBUSU9OOiBIYW5kbGVyIGZvciB0aGUgU3lzdGVtIElPIGFkZHJlc3Mgc3BhY2UgKE9wIFJlZ2lvbikKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1hY3BpX3N0YXR1cwotYWNwaV9leF9zeXN0ZW1faW9fc3BhY2VfaGFuZGxlcih1MzIgZnVuY3Rpb24sCi0JCQkJYWNwaV9waHlzaWNhbF9hZGRyZXNzIGFkZHJlc3MsCi0JCQkJdTMyIGJpdF93aWR0aCwKLQkJCQlhY3BpX2ludGVnZXIgKiB2YWx1ZSwKLQkJCQl2b2lkICpoYW5kbGVyX2NvbnRleHQsIHZvaWQgKnJlZ2lvbl9jb250ZXh0KQotewotCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOwotCXUzMiB2YWx1ZTMyOwotCi0JQUNQSV9GVU5DVElPTl9UUkFDRShleF9zeXN0ZW1faW9fc3BhY2VfaGFuZGxlcik7Ci0KLQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sCi0JCQkgICJTeXN0ZW0tSU8gKHdpZHRoICVkKSBSL1cgJWQgQWRkcmVzcz0lOC44WCU4LjhYXG4iLAotCQkJICBiaXRfd2lkdGgsIGZ1bmN0aW9uLAotCQkJICBBQ1BJX0ZPUk1BVF9OQVRJVkVfVUlOVChhZGRyZXNzKSkpOwotCi0JLyogRGVjb2RlIHRoZSBmdW5jdGlvbiBwYXJhbWV0ZXIgKi8KLQotCXN3aXRjaCAoZnVuY3Rpb24pIHsKLQljYXNlIEFDUElfUkVBRDoKLQotCQlzdGF0dXMgPSBhY3BpX29zX3JlYWRfcG9ydCgoYWNwaV9pb19hZGRyZXNzKSBhZGRyZXNzLAotCQkJCQkgICAmdmFsdWUzMiwgYml0X3dpZHRoKTsKLQkJKnZhbHVlID0gdmFsdWUzMjsKLQkJYnJlYWs7Ci0KLQljYXNlIEFDUElfV1JJVEU6Ci0KLQkJc3RhdHVzID0gYWNwaV9vc193cml0ZV9wb3J0KChhY3BpX2lvX2FkZHJlc3MpIGFkZHJlc3MsCi0JCQkJCSAgICAodTMyKSAqIHZhbHVlLCBiaXRfd2lkdGgpOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCXN0YXR1cyA9IEFFX0JBRF9QQVJBTUVURVI7Ci0JCWJyZWFrOwotCX0KLQotCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X3BjaV9jb25maWdfc3BhY2VfaGFuZGxlcgotICoKLSAqIFBBUkFNRVRFUlM6ICBGdW5jdGlvbiAgICAgICAgICAgIC0gUmVhZCBvciBXcml0ZSBvcGVyYXRpb24KLSAqICAgICAgICAgICAgICBBZGRyZXNzICAgICAgICAgICAgIC0gV2hlcmUgaW4gdGhlIHNwYWNlIHRvIHJlYWQgb3Igd3JpdGUKLSAqICAgICAgICAgICAgICBiaXRfd2lkdGggICAgICAgICAgIC0gRmllbGQgd2lkdGggaW4gYml0cyAoOCwgMTYsIG9yIDMyKQotICogICAgICAgICAgICAgIFZhbHVlICAgICAgICAgICAgICAgLSBQb2ludGVyIHRvIGluIG9yIG91dCB2YWx1ZQotICogICAgICAgICAgICAgIGhhbmRsZXJfY29udGV4dCAgICAgLSBQb2ludGVyIHRvIEhhbmRsZXIncyBjb250ZXh0Ci0gKiAgICAgICAgICAgICAgcmVnaW9uX2NvbnRleHQgICAgICAtIFBvaW50ZXIgdG8gY29udGV4dCBzcGVjaWZpYyB0byB0aGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjZXNzZWQgcmVnaW9uCi0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cwotICoKLSAqIERFU0NSSVBUSU9OOiBIYW5kbGVyIGZvciB0aGUgUENJIENvbmZpZyBhZGRyZXNzIHNwYWNlIChPcCBSZWdpb24pCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotYWNwaV9zdGF0dXMKLWFjcGlfZXhfcGNpX2NvbmZpZ19zcGFjZV9oYW5kbGVyKHUzMiBmdW5jdGlvbiwKLQkJCQkgYWNwaV9waHlzaWNhbF9hZGRyZXNzIGFkZHJlc3MsCi0JCQkJIHUzMiBiaXRfd2lkdGgsCi0JCQkJIGFjcGlfaW50ZWdlciAqIHZhbHVlLAotCQkJCSB2b2lkICpoYW5kbGVyX2NvbnRleHQsIHZvaWQgKnJlZ2lvbl9jb250ZXh0KQotewotCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOwotCXN0cnVjdCBhY3BpX3BjaV9pZCAqcGNpX2lkOwotCXUxNiBwY2lfcmVnaXN0ZXI7Ci0JdTMyIHZhbHVlMzI7Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGV4X3BjaV9jb25maWdfc3BhY2VfaGFuZGxlcik7Ci0KLQkvKgotCSAqICBUaGUgYXJndW1lbnRzIHRvIGFjcGlfb3MoUmVhZHxXcml0ZSlwY2lfY29uZmlndXJhdGlvbiBhcmU6Ci0JICoKLQkgKiAgcGNpX3NlZ21lbnQgaXMgdGhlIFBDSSBidXMgc2VnbWVudCByYW5nZSAwLTMxCi0JICogIHBjaV9idXMgICAgIGlzIHRoZSBQQ0kgYnVzIG51bWJlciByYW5nZSAwLTI1NQotCSAqICBwY2lfZGV2aWNlICBpcyB0aGUgUENJIGRldmljZSBudW1iZXIgcmFuZ2UgMC0zMQotCSAqICBwY2lfZnVuY3Rpb24gaXMgdGhlIFBDSSBkZXZpY2UgZnVuY3Rpb24gbnVtYmVyCi0JICogIHBjaV9yZWdpc3RlciBpcyB0aGUgQ29uZmlnIHNwYWNlIHJlZ2lzdGVyIHJhbmdlIDAtMjU1IGJ5dGVzCi0JICoKLQkgKiAgVmFsdWUgLSBpbnB1dCB2YWx1ZSBmb3Igd3JpdGUsIG91dHB1dCBhZGRyZXNzIGZvciByZWFkCi0JICoKLQkgKi8KLQlwY2lfaWQgPSAoc3RydWN0IGFjcGlfcGNpX2lkICopcmVnaW9uX2NvbnRleHQ7Ci0JcGNpX3JlZ2lzdGVyID0gKHUxNikgKHUzMikgYWRkcmVzczsKLQotCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywKLQkJCSAgIlBjaS1Db25maWcgJWQgKCVkKSBTZWcoJTA0eCkgQnVzKCUwNHgpIERldiglMDR4KSBGdW5jKCUwNHgpIFJlZyglMDR4KVxuIiwKLQkJCSAgZnVuY3Rpb24sIGJpdF93aWR0aCwgcGNpX2lkLT5zZWdtZW50LCBwY2lfaWQtPmJ1cywKLQkJCSAgcGNpX2lkLT5kZXZpY2UsIHBjaV9pZC0+ZnVuY3Rpb24sIHBjaV9yZWdpc3RlcikpOwotCi0Jc3dpdGNoIChmdW5jdGlvbikgewotCWNhc2UgQUNQSV9SRUFEOgotCi0JCXN0YXR1cyA9IGFjcGlfb3NfcmVhZF9wY2lfY29uZmlndXJhdGlvbihwY2lfaWQsIHBjaV9yZWdpc3RlciwKLQkJCQkJCQkmdmFsdWUzMiwgYml0X3dpZHRoKTsKLQkJKnZhbHVlID0gdmFsdWUzMjsKLQkJYnJlYWs7Ci0KLQljYXNlIEFDUElfV1JJVEU6Ci0KLQkJc3RhdHVzID0gYWNwaV9vc193cml0ZV9wY2lfY29uZmlndXJhdGlvbihwY2lfaWQsIHBjaV9yZWdpc3RlciwKLQkJCQkJCQkgKnZhbHVlLCBiaXRfd2lkdGgpOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0KLQkJc3RhdHVzID0gQUVfQkFEX1BBUkFNRVRFUjsKLQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfZXhfY21vc19zcGFjZV9oYW5kbGVyCi0gKgotICogUEFSQU1FVEVSUzogIEZ1bmN0aW9uICAgICAgICAgICAgLSBSZWFkIG9yIFdyaXRlIG9wZXJhdGlvbgotICogICAgICAgICAgICAgIEFkZHJlc3MgICAgICAgICAgICAgLSBXaGVyZSBpbiB0aGUgc3BhY2UgdG8gcmVhZCBvciB3cml0ZQotICogICAgICAgICAgICAgIGJpdF93aWR0aCAgICAgICAgICAgLSBGaWVsZCB3aWR0aCBpbiBiaXRzICg4LCAxNiwgb3IgMzIpCi0gKiAgICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgICAtIFBvaW50ZXIgdG8gaW4gb3Igb3V0IHZhbHVlCi0gKiAgICAgICAgICAgICAgaGFuZGxlcl9jb250ZXh0ICAgICAtIFBvaW50ZXIgdG8gSGFuZGxlcidzIGNvbnRleHQKLSAqICAgICAgICAgICAgICByZWdpb25fY29udGV4dCAgICAgIC0gUG9pbnRlciB0byBjb250ZXh0IHNwZWNpZmljIHRvIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2Nlc3NlZCByZWdpb24KLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IEhhbmRsZXIgZm9yIHRoZSBDTU9TIGFkZHJlc3Mgc3BhY2UgKE9wIFJlZ2lvbikKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1hY3BpX3N0YXR1cwotYWNwaV9leF9jbW9zX3NwYWNlX2hhbmRsZXIodTMyIGZ1bmN0aW9uLAotCQkJICAgYWNwaV9waHlzaWNhbF9hZGRyZXNzIGFkZHJlc3MsCi0JCQkgICB1MzIgYml0X3dpZHRoLAotCQkJICAgYWNwaV9pbnRlZ2VyICogdmFsdWUsCi0JCQkgICB2b2lkICpoYW5kbGVyX2NvbnRleHQsIHZvaWQgKnJlZ2lvbl9jb250ZXh0KQotewotCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOwotCi0JQUNQSV9GVU5DVElPTl9UUkFDRShleF9jbW9zX3NwYWNlX2hhbmRsZXIpOwotCi0JcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfZXhfcGNpX2Jhcl9zcGFjZV9oYW5kbGVyCi0gKgotICogUEFSQU1FVEVSUzogIEZ1bmN0aW9uICAgICAgICAgICAgLSBSZWFkIG9yIFdyaXRlIG9wZXJhdGlvbgotICogICAgICAgICAgICAgIEFkZHJlc3MgICAgICAgICAgICAgLSBXaGVyZSBpbiB0aGUgc3BhY2UgdG8gcmVhZCBvciB3cml0ZQotICogICAgICAgICAgICAgIGJpdF93aWR0aCAgICAgICAgICAgLSBGaWVsZCB3aWR0aCBpbiBiaXRzICg4LCAxNiwgb3IgMzIpCi0gKiAgICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgICAtIFBvaW50ZXIgdG8gaW4gb3Igb3V0IHZhbHVlCi0gKiAgICAgICAgICAgICAgaGFuZGxlcl9jb250ZXh0ICAgICAtIFBvaW50ZXIgdG8gSGFuZGxlcidzIGNvbnRleHQKLSAqICAgICAgICAgICAgICByZWdpb25fY29udGV4dCAgICAgIC0gUG9pbnRlciB0byBjb250ZXh0IHNwZWNpZmljIHRvIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2Nlc3NlZCByZWdpb24KLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IEhhbmRsZXIgZm9yIHRoZSBQQ0kgYmFyX3RhcmdldCBhZGRyZXNzIHNwYWNlIChPcCBSZWdpb24pCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotYWNwaV9zdGF0dXMKLWFjcGlfZXhfcGNpX2Jhcl9zcGFjZV9oYW5kbGVyKHUzMiBmdW5jdGlvbiwKLQkJCSAgICAgIGFjcGlfcGh5c2ljYWxfYWRkcmVzcyBhZGRyZXNzLAotCQkJICAgICAgdTMyIGJpdF93aWR0aCwKLQkJCSAgICAgIGFjcGlfaW50ZWdlciAqIHZhbHVlLAotCQkJICAgICAgdm9pZCAqaGFuZGxlcl9jb250ZXh0LCB2b2lkICpyZWdpb25fY29udGV4dCkKLXsKLQlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UoZXhfcGNpX2Jhcl9zcGFjZV9oYW5kbGVyKTsKLQotCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X2RhdGFfdGFibGVfc3BhY2VfaGFuZGxlcgotICoKLSAqIFBBUkFNRVRFUlM6ICBGdW5jdGlvbiAgICAgICAgICAgIC0gUmVhZCBvciBXcml0ZSBvcGVyYXRpb24KLSAqICAgICAgICAgICAgICBBZGRyZXNzICAgICAgICAgICAgIC0gV2hlcmUgaW4gdGhlIHNwYWNlIHRvIHJlYWQgb3Igd3JpdGUKLSAqICAgICAgICAgICAgICBiaXRfd2lkdGggICAgICAgICAgIC0gRmllbGQgd2lkdGggaW4gYml0cyAoOCwgMTYsIG9yIDMyKQotICogICAgICAgICAgICAgIFZhbHVlICAgICAgICAgICAgICAgLSBQb2ludGVyIHRvIGluIG9yIG91dCB2YWx1ZQotICogICAgICAgICAgICAgIGhhbmRsZXJfY29udGV4dCAgICAgLSBQb2ludGVyIHRvIEhhbmRsZXIncyBjb250ZXh0Ci0gKiAgICAgICAgICAgICAgcmVnaW9uX2NvbnRleHQgICAgICAtIFBvaW50ZXIgdG8gY29udGV4dCBzcGVjaWZpYyB0byB0aGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjZXNzZWQgcmVnaW9uCi0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cwotICoKLSAqIERFU0NSSVBUSU9OOiBIYW5kbGVyIGZvciB0aGUgRGF0YSBUYWJsZSBhZGRyZXNzIHNwYWNlIChPcCBSZWdpb24pCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotYWNwaV9zdGF0dXMKLWFjcGlfZXhfZGF0YV90YWJsZV9zcGFjZV9oYW5kbGVyKHUzMiBmdW5jdGlvbiwKLQkJCQkgYWNwaV9waHlzaWNhbF9hZGRyZXNzIGFkZHJlc3MsCi0JCQkJIHUzMiBiaXRfd2lkdGgsCi0JCQkJIGFjcGlfaW50ZWdlciAqIHZhbHVlLAotCQkJCSB2b2lkICpoYW5kbGVyX2NvbnRleHQsIHZvaWQgKnJlZ2lvbl9jb250ZXh0KQotewotCUFDUElfRlVOQ1RJT05fVFJBQ0UoZXhfZGF0YV90YWJsZV9zcGFjZV9oYW5kbGVyKTsKLQotCS8qIFBlcmZvcm0gdGhlIG1lbW9yeSByZWFkIG9yIHdyaXRlICovCi0KLQlzd2l0Y2ggKGZ1bmN0aW9uKSB7Ci0JY2FzZSBBQ1BJX1JFQUQ6Ci0KLQkJQUNQSV9NRU1DUFkoQUNQSV9DQVNUX1BUUihjaGFyLCB2YWx1ZSksCi0JCQkgICAgQUNQSV9QSFlTQUREUl9UT19QVFIoYWRkcmVzcyksCi0JCQkgICAgQUNQSV9ESVZfOChiaXRfd2lkdGgpKTsKLQkJYnJlYWs7Ci0KLQljYXNlIEFDUElfV1JJVEU6Ci0JZGVmYXVsdDoKLQotCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfU1VQUE9SVCk7Ci0JfQotCi0JcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leHJlc250ZS5jIGIvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4cmVzbnRlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyM2FkMzYuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4cmVzbnRlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNzcgKzAsMCBAQAotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogTW9kdWxlIE5hbWU6IGV4cmVzbnRlIC0gQU1MIEludGVycHJldGVyIG9iamVjdCByZXNvbHV0aW9uCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwOCwgSW50ZWwgQ29ycC4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKLSAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIGF0IG1pbmltdW0gYSBkaXNjbGFpbWVyCi0gKiAgICBzdWJzdGFudGlhbGx5IHNpbWlsYXIgdG8gdGhlICJOTyBXQVJSQU5UWSIgZGlzY2xhaW1lciBiZWxvdwotICogICAgKCJEaXNjbGFpbWVyIikgYW5kIGFueSByZWRpc3RyaWJ1dGlvbiBtdXN0IGJlIGNvbmRpdGlvbmVkIHVwb24KLSAqICAgIGluY2x1ZGluZyBhIHN1YnN0YW50aWFsbHkgc2ltaWxhciBEaXNjbGFpbWVyIHJlcXVpcmVtZW50IGZvciBmdXJ0aGVyCi0gKiAgICBiaW5hcnkgcmVkaXN0cmlidXRpb24uCi0gKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMKLSAqICAgIG9mIGFueSBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTk8gV0FSUkFOVFkKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAotICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKLSAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HCi0gKiBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKLSAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KLSAqLwotCi0jaW5jbHVkZSA8YWNwaS9hY3BpLmg+Ci0jaW5jbHVkZSA8YWNwaS9hY2Rpc3BhdC5oPgotI2luY2x1ZGUgPGFjcGkvYWNpbnRlcnAuaD4KLSNpbmNsdWRlIDxhY3BpL2FjbmFtZXNwLmg+Ci0KLSNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX0VYRUNVVEVSCi1BQ1BJX01PRFVMRV9OQU1FKCJleHJlc250ZSIpCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfZXhfcmVzb2x2ZV9ub2RlX3RvX3ZhbHVlCi0gKgotICogUEFSQU1FVEVSUzogIG9iamVjdF9wdHIgICAgICAtIFBvaW50ZXIgdG8gYSBsb2NhdGlvbiB0aGF0IGNvbnRhaW5zCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSBwb2ludGVyIHRvIGEgTlMgbm9kZSwgYW5kIHdpbGwgcmVjZWl2ZSBhCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRlciB0byB0aGUgcmVzb2x2ZWQgb2JqZWN0LgotICogICAgICAgICAgICAgIHdhbGtfc3RhdGUgICAgICAtIEN1cnJlbnQgc3RhdGUuICBWYWxpZCBvbmx5IGlmIGV4ZWN1dGluZyBBTUwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlLiAgTlVMTCBpZiBzaW1wbHkgcmVzb2x2aW5nIGFuIG9iamVjdAotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKLSAqCi0gKiBERVNDUklQVElPTjogUmVzb2x2ZSBhIE5hbWVzcGFjZSBub2RlIHRvIGEgdmFsdWVkIG9iamVjdAotICoKLSAqIE5vdGU6IGZvciBzb21lIG9mIHRoZSBkYXRhIHR5cGVzLCB0aGUgcG9pbnRlciBhdHRhY2hlZCB0byB0aGUgTm9kZQotICogY2FuIGJlIGVpdGhlciBhIHBvaW50ZXIgdG8gYW4gYWN0dWFsIGludGVybmFsIG9iamVjdCBvciBhIHBvaW50ZXIgaW50byB0aGUKLSAqIEFNTCBzdHJlYW0gaXRzZWxmLiAgVGhlc2UgdHlwZXMgYXJlIGN1cnJlbnRseToKLSAqCi0gKiAgICAgIEFDUElfVFlQRV9JTlRFR0VSCi0gKiAgICAgIEFDUElfVFlQRV9TVFJJTkcKLSAqICAgICAgQUNQSV9UWVBFX0JVRkZFUgotICogICAgICBBQ1BJX1RZUEVfTVVURVgKLSAqICAgICAgQUNQSV9UWVBFX1BBQ0tBR0UKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYWNwaV9zdGF0dXMKLWFjcGlfZXhfcmVzb2x2ZV9ub2RlX3RvX3ZhbHVlKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICoqb2JqZWN0X3B0ciwKLQkJCSAgICAgIHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUpCi17Ci0JYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqc291cmNlX2Rlc2M7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2MgPSBOVUxMOwotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlOwotCWFjcGlfb2JqZWN0X3R5cGUgZW50cnlfdHlwZTsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UoZXhfcmVzb2x2ZV9ub2RlX3RvX3ZhbHVlKTsKLQotCS8qCi0JICogVGhlIHN0YWNrIHBvaW50ZXIgcG9pbnRzIHRvIGEgc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKE5vZGUpLiAgR2V0IHRoZQotCSAqIG9iamVjdCB0aGF0IGlzIGF0dGFjaGVkIHRvIHRoZSBOb2RlLgotCSAqLwotCW5vZGUgPSAqb2JqZWN0X3B0cjsKLQlzb3VyY2VfZGVzYyA9IGFjcGlfbnNfZ2V0X2F0dGFjaGVkX29iamVjdChub2RlKTsKLQllbnRyeV90eXBlID0gYWNwaV9uc19nZXRfdHlwZSgoYWNwaV9oYW5kbGUpIG5vZGUpOwotCi0JQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FWEVDLCAiRW50cnk9JXAgU291cmNlRGVzYz0lcCBbJXNdXG4iLAotCQkJICBub2RlLCBzb3VyY2VfZGVzYywKLQkJCSAgYWNwaV91dF9nZXRfdHlwZV9uYW1lKGVudHJ5X3R5cGUpKSk7Ci0KLQlpZiAoKGVudHJ5X3R5cGUgPT0gQUNQSV9UWVBFX0xPQ0FMX0FMSUFTKSB8fAotCSAgICAoZW50cnlfdHlwZSA9PSBBQ1BJX1RZUEVfTE9DQUxfTUVUSE9EX0FMSUFTKSkgewotCi0JCS8qIFRoZXJlIGlzIGFsd2F5cyBleGFjdGx5IG9uZSBsZXZlbCBvZiBpbmRpcmVjdGlvbiAqLwotCi0JCW5vZGUgPSBBQ1BJX0NBU1RfUFRSKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlLCBub2RlLT5vYmplY3QpOwotCQlzb3VyY2VfZGVzYyA9IGFjcGlfbnNfZ2V0X2F0dGFjaGVkX29iamVjdChub2RlKTsKLQkJZW50cnlfdHlwZSA9IGFjcGlfbnNfZ2V0X3R5cGUoKGFjcGlfaGFuZGxlKSBub2RlKTsKLQkJKm9iamVjdF9wdHIgPSBub2RlOwotCX0KLQotCS8qCi0JICogU2V2ZXJhbCBvYmplY3QgdHlwZXMgcmVxdWlyZSBubyBmdXJ0aGVyIHByb2Nlc3Npbmc6Ci0JICogMSkgRGV2aWNlL1RoZXJtYWwgb2JqZWN0cyBkb24ndCBoYXZlIGEgInJlYWwiIHN1Ym9iamVjdCwgcmV0dXJuIHRoZSBOb2RlCi0JICogMikgTWV0aG9kIGxvY2FscyBhbmQgYXJndW1lbnRzIGhhdmUgYSBwc2V1ZG8tTm9kZQotCSAqIDMpIDEwLzIwMDc6IEFkZGVkIG1ldGhvZCB0eXBlIHRvIGFzc2lzdCB3aXRoIFBhY2thZ2UgY29uc3RydWN0aW9uLgotCSAqLwotCWlmICgoZW50cnlfdHlwZSA9PSBBQ1BJX1RZUEVfREVWSUNFKSB8fAotCSAgICAoZW50cnlfdHlwZSA9PSBBQ1BJX1RZUEVfVEhFUk1BTCkgfHwKLQkgICAgKGVudHJ5X3R5cGUgPT0gQUNQSV9UWVBFX01FVEhPRCkgfHwKLQkgICAgKG5vZGUtPmZsYWdzICYgKEFOT0JKX01FVEhPRF9BUkcgfCBBTk9CSl9NRVRIT0RfTE9DQUwpKSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwotCX0KLQotCWlmICghc291cmNlX2Rlc2MpIHsKLQkJQUNQSV9FUlJPUigoQUVfSU5GTywgIk5vIG9iamVjdCBhdHRhY2hlZCB0byBub2RlICVwIiwgbm9kZSkpOwotCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX05PX09QRVJBTkQpOwotCX0KLQotCS8qCi0JICogQWN0aW9uIGlzIGJhc2VkIG9uIHRoZSB0eXBlIG9mIHRoZSBOb2RlLCB3aGljaCBpbmRpY2F0ZXMgdGhlIHR5cGUKLQkgKiBvZiB0aGUgYXR0YWNoZWQgb2JqZWN0IG9yIHBvaW50ZXIKLQkgKi8KLQlzd2l0Y2ggKGVudHJ5X3R5cGUpIHsKLQljYXNlIEFDUElfVFlQRV9QQUNLQUdFOgotCi0JCWlmIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRShzb3VyY2VfZGVzYykgIT0gQUNQSV9UWVBFX1BBQ0tBR0UpIHsKLQkJCUFDUElfRVJST1IoKEFFX0lORk8sICJPYmplY3Qgbm90IGEgUGFja2FnZSwgdHlwZSAlcyIsCi0JCQkJICAgIGFjcGlfdXRfZ2V0X29iamVjdF90eXBlX25hbWUoc291cmNlX2Rlc2MpKSk7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX09QRVJBTkRfVFlQRSk7Ci0JCX0KLQotCQlzdGF0dXMgPSBhY3BpX2RzX2dldF9wYWNrYWdlX2FyZ3VtZW50cyhzb3VyY2VfZGVzYyk7Ci0JCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkgewotCi0JCQkvKiBSZXR1cm4gYW4gYWRkaXRpb25hbCByZWZlcmVuY2UgdG8gdGhlIG9iamVjdCAqLwotCi0JCQlvYmpfZGVzYyA9IHNvdXJjZV9kZXNjOwotCQkJYWNwaV91dF9hZGRfcmVmZXJlbmNlKG9ial9kZXNjKTsKLQkJfQotCQlicmVhazsKLQotCWNhc2UgQUNQSV9UWVBFX0JVRkZFUjoKLQotCQlpZiAoQUNQSV9HRVRfT0JKRUNUX1RZUEUoc291cmNlX2Rlc2MpICE9IEFDUElfVFlQRV9CVUZGRVIpIHsKLQkJCUFDUElfRVJST1IoKEFFX0lORk8sICJPYmplY3Qgbm90IGEgQnVmZmVyLCB0eXBlICVzIiwKLQkJCQkgICAgYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZShzb3VyY2VfZGVzYykpKTsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfT1BFUkFORF9UWVBFKTsKLQkJfQotCi0JCXN0YXR1cyA9IGFjcGlfZHNfZ2V0X2J1ZmZlcl9hcmd1bWVudHMoc291cmNlX2Rlc2MpOwotCQlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpIHsKLQotCQkJLyogUmV0dXJuIGFuIGFkZGl0aW9uYWwgcmVmZXJlbmNlIHRvIHRoZSBvYmplY3QgKi8KLQotCQkJb2JqX2Rlc2MgPSBzb3VyY2VfZGVzYzsKLQkJCWFjcGlfdXRfYWRkX3JlZmVyZW5jZShvYmpfZGVzYyk7Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIEFDUElfVFlQRV9TVFJJTkc6Ci0KLQkJaWYgKEFDUElfR0VUX09CSkVDVF9UWVBFKHNvdXJjZV9kZXNjKSAhPSBBQ1BJX1RZUEVfU1RSSU5HKSB7Ci0JCQlBQ1BJX0VSUk9SKChBRV9JTkZPLCAiT2JqZWN0IG5vdCBhIFN0cmluZywgdHlwZSAlcyIsCi0JCQkJICAgIGFjcGlfdXRfZ2V0X29iamVjdF90eXBlX25hbWUoc291cmNlX2Rlc2MpKSk7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX09QRVJBTkRfVFlQRSk7Ci0JCX0KLQotCQkvKiBSZXR1cm4gYW4gYWRkaXRpb25hbCByZWZlcmVuY2UgdG8gdGhlIG9iamVjdCAqLwotCi0JCW9ial9kZXNjID0gc291cmNlX2Rlc2M7Ci0JCWFjcGlfdXRfYWRkX3JlZmVyZW5jZShvYmpfZGVzYyk7Ci0JCWJyZWFrOwotCi0JY2FzZSBBQ1BJX1RZUEVfSU5URUdFUjoKLQotCQlpZiAoQUNQSV9HRVRfT0JKRUNUX1RZUEUoc291cmNlX2Rlc2MpICE9IEFDUElfVFlQRV9JTlRFR0VSKSB7Ci0JCQlBQ1BJX0VSUk9SKChBRV9JTkZPLCAiT2JqZWN0IG5vdCBhIEludGVnZXIsIHR5cGUgJXMiLAotCQkJCSAgICBhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lKHNvdXJjZV9kZXNjKSkpOwotCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9PUEVSQU5EX1RZUEUpOwotCQl9Ci0KLQkJLyogUmV0dXJuIGFuIGFkZGl0aW9uYWwgcmVmZXJlbmNlIHRvIHRoZSBvYmplY3QgKi8KLQotCQlvYmpfZGVzYyA9IHNvdXJjZV9kZXNjOwotCQlhY3BpX3V0X2FkZF9yZWZlcmVuY2Uob2JqX2Rlc2MpOwotCQlicmVhazsKLQotCWNhc2UgQUNQSV9UWVBFX0JVRkZFUl9GSUVMRDoKLQljYXNlIEFDUElfVFlQRV9MT0NBTF9SRUdJT05fRklFTEQ6Ci0JY2FzZSBBQ1BJX1RZUEVfTE9DQUxfQkFOS19GSUVMRDoKLQljYXNlIEFDUElfVFlQRV9MT0NBTF9JTkRFWF9GSUVMRDoKLQotCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VYRUMsCi0JCQkJICAiRmllbGRSZWFkIE5vZGU9JXAgU291cmNlRGVzYz0lcCBUeXBlPSVYXG4iLAotCQkJCSAgbm9kZSwgc291cmNlX2Rlc2MsIGVudHJ5X3R5cGUpKTsKLQotCQlzdGF0dXMgPQotCQkgICAgYWNwaV9leF9yZWFkX2RhdGFfZnJvbV9maWVsZCh3YWxrX3N0YXRlLCBzb3VyY2VfZGVzYywKLQkJCQkJCSAmb2JqX2Rlc2MpOwotCQlicmVhazsKLQotCQkvKiBGb3IgdGhlc2Ugb2JqZWN0cywganVzdCByZXR1cm4gdGhlIG9iamVjdCBhdHRhY2hlZCB0byB0aGUgTm9kZSAqLwotCi0JY2FzZSBBQ1BJX1RZUEVfTVVURVg6Ci0JY2FzZSBBQ1BJX1RZUEVfUE9XRVI6Ci0JY2FzZSBBQ1BJX1RZUEVfUFJPQ0VTU09SOgotCWNhc2UgQUNQSV9UWVBFX0VWRU5UOgotCWNhc2UgQUNQSV9UWVBFX1JFR0lPTjoKLQotCQkvKiBSZXR1cm4gYW4gYWRkaXRpb25hbCByZWZlcmVuY2UgdG8gdGhlIG9iamVjdCAqLwotCi0JCW9ial9kZXNjID0gc291cmNlX2Rlc2M7Ci0JCWFjcGlfdXRfYWRkX3JlZmVyZW5jZShvYmpfZGVzYyk7Ci0JCWJyZWFrOwotCi0JCS8qIFRZUEVfQU5ZIGlzIHVudHlwZWQsIGFuZCB0aHVzIHRoZXJlIGlzIG5vIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggaXQgKi8KLQotCWNhc2UgQUNQSV9UWVBFX0FOWToKLQotCQlBQ1BJX0VSUk9SKChBRV9JTkZPLAotCQkJICAgICJVbnR5cGVkIGVudHJ5ICVwLCBubyBhdHRhY2hlZCBvYmplY3QhIiwgbm9kZSkpOwotCi0JCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfT1BFUkFORF9UWVBFKTsJLyogQ2Fubm90IGJlIEFFX1RZUEUgKi8KLQotCWNhc2UgQUNQSV9UWVBFX0xPQ0FMX1JFRkVSRU5DRToKLQotCQlzd2l0Y2ggKHNvdXJjZV9kZXNjLT5yZWZlcmVuY2UuY2xhc3MpIHsKLQkJY2FzZSBBQ1BJX1JFRkNMQVNTX1RBQkxFOgkvKiBUaGlzIGlzIGEgZGRiX2hhbmRsZSAqLwotCQljYXNlIEFDUElfUkVGQ0xBU1NfUkVGT0Y6Ci0JCWNhc2UgQUNQSV9SRUZDTEFTU19JTkRFWDoKLQotCQkJLyogUmV0dXJuIGFuIGFkZGl0aW9uYWwgcmVmZXJlbmNlIHRvIHRoZSBvYmplY3QgKi8KLQotCQkJb2JqX2Rlc2MgPSBzb3VyY2VfZGVzYzsKLQkJCWFjcGlfdXRfYWRkX3JlZmVyZW5jZShvYmpfZGVzYyk7Ci0JCQlicmVhazsKLQotCQlkZWZhdWx0OgotCQkJLyogTm8gbmFtZWQgcmVmZXJlbmNlcyBhcmUgYWxsb3dlZCBoZXJlICovCi0KLQkJCUFDUElfRVJST1IoKEFFX0lORk8sCi0JCQkJICAgICJVbnN1cHBvcnRlZCBSZWZlcmVuY2UgdHlwZSAlWCIsCi0JCQkJICAgIHNvdXJjZV9kZXNjLT5yZWZlcmVuY2UuY2xhc3MpKTsKLQotCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9PUEVSQU5EX1RZUEUpOwotCQl9Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQotCQkvKiBEZWZhdWx0IGNhc2UgaXMgZm9yIHVua25vd24gdHlwZXMgKi8KLQotCQlBQ1BJX0VSUk9SKChBRV9JTkZPLAotCQkJICAgICJOb2RlICVwIC0gVW5rbm93biBvYmplY3QgdHlwZSAlWCIsCi0JCQkgICAgbm9kZSwgZW50cnlfdHlwZSkpOwotCi0JCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfT1BFUkFORF9UWVBFKTsKLQotCX0JCQkvKiBzd2l0Y2ggKGVudHJ5X3R5cGUpICovCi0KLQkvKiBSZXR1cm4gdGhlIG9iamVjdCBkZXNjcmlwdG9yICovCi0KLQkqb2JqZWN0X3B0ciA9ICh2b2lkICopb2JqX2Rlc2M7Ci0JcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhyZXNvbHYuYyBiL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leHJlc29sdi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTU3MWI5Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leHJlc29sdi5jCisrKyAvZGV2L251bGwKQEAgLTEsNTUwICswLDAgQEAKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIE1vZHVsZSBOYW1lOiBleHJlc29sdiAtIEFNTCBJbnRlcnByZXRlciBvYmplY3QgcmVzb2x1dGlvbgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDgsIEludGVsIENvcnAuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCi0gKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSBhdCBtaW5pbXVtIGEgZGlzY2xhaW1lcgotICogICAgc3Vic3RhbnRpYWxseSBzaW1pbGFyIHRvIHRoZSAiTk8gV0FSUkFOVFkiIGRpc2NsYWltZXIgYmVsb3cKLSAqICAgICgiRGlzY2xhaW1lciIpIGFuZCBhbnkgcmVkaXN0cmlidXRpb24gbXVzdCBiZSBjb25kaXRpb25lZCB1cG9uCi0gKiAgICBpbmNsdWRpbmcgYSBzdWJzdGFudGlhbGx5IHNpbWlsYXIgRGlzY2xhaW1lciByZXF1aXJlbWVudCBmb3IgZnVydGhlcgotICogICAgYmluYXJ5IHJlZGlzdHJpYnV0aW9uLgotICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzCi0gKiAgICBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIE5PIFdBUlJBTlRZCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKLSAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCi0gKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORwotICogSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCi0gKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCi0gKi8KLQotI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgotI2luY2x1ZGUgPGFjcGkvYW1sY29kZS5oPgotI2luY2x1ZGUgPGFjcGkvYWNkaXNwYXQuaD4KLSNpbmNsdWRlIDxhY3BpL2FjaW50ZXJwLmg+Ci0jaW5jbHVkZSA8YWNwaS9hY25hbWVzcC5oPgotCi0jZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9FWEVDVVRFUgotQUNQSV9NT0RVTEVfTkFNRSgiZXhyZXNvbHYiKQotCi0vKiBMb2NhbCBwcm90b3R5cGVzICovCi1zdGF0aWMgYWNwaV9zdGF0dXMKLWFjcGlfZXhfcmVzb2x2ZV9vYmplY3RfdG9fdmFsdWUodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKnN0YWNrX3B0ciwKLQkJCQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9leF9yZXNvbHZlX3RvX3ZhbHVlCi0gKgotICogUEFSQU1FVEVSUzogICoqc3RhY2tfcHRyICAgICAgICAgLSBQb2ludHMgdG8gZW50cnkgb24gb2JqX3N0YWNrLCB3aGljaCBjYW4KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgZWl0aGVyIGFuICh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICopCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIGFuIGFjcGlfaGFuZGxlLgotICogICAgICAgICAgICAgIHdhbGtfc3RhdGUgICAgICAgICAgLSBDdXJyZW50IG1ldGhvZCBzdGF0ZQotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKLSAqCi0gKiBERVNDUklQVElPTjogQ29udmVydCBSZWZlcmVuY2Ugb2JqZWN0cyB0byB2YWx1ZXMKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1hY3BpX3N0YXR1cwotYWNwaV9leF9yZXNvbHZlX3RvX3ZhbHVlKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKipzdGFja19wdHIsCi0JCQkgc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSkKLXsKLQlhY3BpX3N0YXR1cyBzdGF0dXM7Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUihleF9yZXNvbHZlX3RvX3ZhbHVlLCBzdGFja19wdHIpOwotCi0JaWYgKCFzdGFja19wdHIgfHwgISpzdGFja19wdHIpIHsKLQkJQUNQSV9FUlJPUigoQUVfSU5GTywgIkludGVybmFsIC0gbnVsbCBwb2ludGVyIikpOwotCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX05PX09QRVJBTkQpOwotCX0KLQotCS8qCi0JICogVGhlIGVudGl0eSBwb2ludGVkIHRvIGJ5IHRoZSBzdGFja19wdHIgY2FuIGJlIGVpdGhlcgotCSAqIDEpIEEgdmFsaWQgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCwgb3IKLQkgKiAyKSBBIHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlIChuYW1lZF9vYmopCi0JICovCi0JaWYgKEFDUElfR0VUX0RFU0NSSVBUT1JfVFlQRSgqc3RhY2tfcHRyKSA9PSBBQ1BJX0RFU0NfVFlQRV9PUEVSQU5EKSB7Ci0JCXN0YXR1cyA9IGFjcGlfZXhfcmVzb2x2ZV9vYmplY3RfdG9fdmFsdWUoc3RhY2tfcHRyLCB3YWxrX3N0YXRlKTsKLQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLQkJfQotCi0JCWlmICghKnN0YWNrX3B0cikgewotCQkJQUNQSV9FUlJPUigoQUVfSU5GTywgIkludGVybmFsIC0gbnVsbCBwb2ludGVyIikpOwotCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9OT19PUEVSQU5EKTsKLQkJfQotCX0KLQotCS8qCi0JICogT2JqZWN0IG9uIHRoZSBzdGFjayBtYXkgaGF2ZSBjaGFuZ2VkIGlmIGFjcGlfZXhfcmVzb2x2ZV9vYmplY3RfdG9fdmFsdWUoKQotCSAqIHdhcyBjYWxsZWQgKGkuZS4sIHdlIGNhbid0IHVzZSBhbiBfZWxzZV8gaGVyZS4pCi0JICovCi0JaWYgKEFDUElfR0VUX0RFU0NSSVBUT1JfVFlQRSgqc3RhY2tfcHRyKSA9PSBBQ1BJX0RFU0NfVFlQRV9OQU1FRCkgewotCQlzdGF0dXMgPQotCQkgICAgYWNwaV9leF9yZXNvbHZlX25vZGVfdG9fdmFsdWUoQUNQSV9DQVNUX0lORElSRUNUX1BUUgotCQkJCQkJICAoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUsCi0JCQkJCQkgICBzdGFja19wdHIpLCB3YWxrX3N0YXRlKTsKLQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLQkJfQotCX0KLQotCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVhFQywgIlJlc29sdmVkIG9iamVjdCAlcFxuIiwgKnN0YWNrX3B0cikpOwotCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfZXhfcmVzb2x2ZV9vYmplY3RfdG9fdmFsdWUKLSAqCi0gKiBQQVJBTUVURVJTOiAgc3RhY2tfcHRyICAgICAgIC0gUG9pbnRlciB0byBhbiBpbnRlcm5hbCBvYmplY3QKLSAqICAgICAgICAgICAgICB3YWxrX3N0YXRlICAgICAgLSBDdXJyZW50IG1ldGhvZCBzdGF0ZQotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKLSAqCi0gKiBERVNDUklQVElPTjogUmV0cmlldmUgdGhlIHZhbHVlIGZyb20gYW4gaW50ZXJuYWwgb2JqZWN0LiBUaGUgUmVmZXJlbmNlIHR5cGUKLSAqICAgICAgICAgICAgICB1c2VzIHRoZSBhc3NvY2lhdGVkIEFNTCBvcGNvZGUgdG8gZGV0ZXJtaW5lIHRoZSB2YWx1ZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgYWNwaV9zdGF0dXMKLWFjcGlfZXhfcmVzb2x2ZV9vYmplY3RfdG9fdmFsdWUodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKnN0YWNrX3B0ciwKLQkJCQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKQotewotCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOwotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnN0YWNrX2Rlc2M7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2MgPSBOVUxMOwotCXU4IHJlZl90eXBlOwotCi0JQUNQSV9GVU5DVElPTl9UUkFDRShleF9yZXNvbHZlX29iamVjdF90b192YWx1ZSk7Ci0KLQlzdGFja19kZXNjID0gKnN0YWNrX3B0cjsKLQotCS8qIFRoaXMgaXMgYW4gdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAqLwotCi0Jc3dpdGNoIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRShzdGFja19kZXNjKSkgewotCWNhc2UgQUNQSV9UWVBFX0xPQ0FMX1JFRkVSRU5DRToKLQotCQlyZWZfdHlwZSA9IHN0YWNrX2Rlc2MtPnJlZmVyZW5jZS5jbGFzczsKLQotCQlzd2l0Y2ggKHJlZl90eXBlKSB7Ci0JCWNhc2UgQUNQSV9SRUZDTEFTU19MT0NBTDoKLQkJY2FzZSBBQ1BJX1JFRkNMQVNTX0FSRzoKLQotCQkJLyoKLQkJCSAqIEdldCB0aGUgbG9jYWwgZnJvbSB0aGUgbWV0aG9kJ3Mgc3RhdGUgaW5mbwotCQkJICogTm90ZTogdGhpcyBpbmNyZW1lbnRzIHRoZSBsb2NhbCdzIG9iamVjdCByZWZlcmVuY2UgY291bnQKLQkJCSAqLwotCQkJc3RhdHVzID0gYWNwaV9kc19tZXRob2RfZGF0YV9nZXRfdmFsdWUocmVmX3R5cGUsCi0JCQkJCQkJICAgICAgIHN0YWNrX2Rlc2MtPgotCQkJCQkJCSAgICAgICByZWZlcmVuY2UudmFsdWUsCi0JCQkJCQkJICAgICAgIHdhbGtfc3RhdGUsCi0JCQkJCQkJICAgICAgICZvYmpfZGVzYyk7Ci0JCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLQkJCX0KLQotCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FWEVDLAotCQkJCQkgICJbQXJnL0xvY2FsICVYXSBWYWx1ZU9iaiBpcyAlcFxuIiwKLQkJCQkJICBzdGFja19kZXNjLT5yZWZlcmVuY2UudmFsdWUsCi0JCQkJCSAgb2JqX2Rlc2MpKTsKLQotCQkJLyoKLQkJCSAqIE5vdyB3ZSBjYW4gZGVsZXRlIHRoZSBvcmlnaW5hbCBSZWZlcmVuY2UgT2JqZWN0IGFuZAotCQkJICogcmVwbGFjZSBpdCB3aXRoIHRoZSByZXNvbHZlZCB2YWx1ZQotCQkJICovCi0JCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2Uoc3RhY2tfZGVzYyk7Ci0JCQkqc3RhY2tfcHRyID0gb2JqX2Rlc2M7Ci0JCQlicmVhazsKLQotCQljYXNlIEFDUElfUkVGQ0xBU1NfSU5ERVg6Ci0KLQkJCXN3aXRjaCAoc3RhY2tfZGVzYy0+cmVmZXJlbmNlLnRhcmdldF90eXBlKSB7Ci0JCQljYXNlIEFDUElfVFlQRV9CVUZGRVJfRklFTEQ6Ci0KLQkJCQkvKiBKdXN0IHJldHVybiAtIGRvIG5vdCBkZXJlZmVyZW5jZSAqLwotCQkJCWJyZWFrOwotCi0JCQljYXNlIEFDUElfVFlQRV9QQUNLQUdFOgotCi0JCQkJLyogSWYgbWV0aG9kIGNhbGwgb3IgY29weV9vYmplY3QgLSBkbyBub3QgZGVyZWZlcmVuY2UgKi8KLQotCQkJCWlmICgod2Fsa19zdGF0ZS0+b3Bjb2RlID09Ci0JCQkJICAgICBBTUxfSU5UX01FVEhPRENBTExfT1ApCi0JCQkJICAgIHx8ICh3YWxrX3N0YXRlLT5vcGNvZGUgPT0gQU1MX0NPUFlfT1ApKSB7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQotCQkJCS8qIE90aGVyd2lzZSwgZGVyZWZlcmVuY2UgdGhlIHBhY2thZ2VfaW5kZXggdG8gYSBwYWNrYWdlIGVsZW1lbnQgKi8KLQotCQkJCW9ial9kZXNjID0gKnN0YWNrX2Rlc2MtPnJlZmVyZW5jZS53aGVyZTsKLQkJCQlpZiAob2JqX2Rlc2MpIHsKLQkJCQkJLyoKLQkJCQkJICogVmFsaWQgb2JqZWN0IGRlc2NyaXB0b3IsIGNvcHkgcG9pbnRlciB0byByZXR1cm4gdmFsdWUKLQkJCQkJICogKGkuZS4sIGRlcmVmZXJlbmNlIHRoZSBwYWNrYWdlIGluZGV4KQotCQkJCQkgKiBEZWxldGUgdGhlIHJlZiBvYmplY3QsIGluY3JlbWVudCB0aGUgcmV0dXJuZWQgb2JqZWN0Ci0JCQkJCSAqLwotCQkJCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2Uoc3RhY2tfZGVzYyk7Ci0JCQkJCWFjcGlfdXRfYWRkX3JlZmVyZW5jZShvYmpfZGVzYyk7Ci0JCQkJCSpzdGFja19wdHIgPSBvYmpfZGVzYzsKLQkJCQl9IGVsc2UgewotCQkJCQkvKgotCQkJCQkgKiBBIE5VTEwgb2JqZWN0IGRlc2NyaXB0b3IgbWVhbnMgYW4gdW5pbml0aWFsaXplZCBlbGVtZW50IG9mCi0JCQkJCSAqIHRoZSBwYWNrYWdlLCBjYW4ndCBkZXJlZmVyZW5jZSBpdAotCQkJCQkgKi8KLQkJCQkJQUNQSV9FUlJPUigoQUVfSU5GTywKLQkJCQkJCSAgICAiQXR0ZW1wdCB0byBkZXJlZmVyZW5jZSBhbiBJbmRleCB0byBOVUxMIHBhY2thZ2UgZWxlbWVudCBJZHg9JXAiLAotCQkJCQkJICAgIHN0YWNrX2Rlc2MpKTsKLQkJCQkJc3RhdHVzID0gQUVfQU1MX1VOSU5JVElBTElaRURfRUxFTUVOVDsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0KLQkJCWRlZmF1bHQ6Ci0KLQkJCQkvKiBJbnZhbGlkIHJlZmVyZW5jZSBvYmplY3QgKi8KLQotCQkJCUFDUElfRVJST1IoKEFFX0lORk8sCi0JCQkJCSAgICAiVW5rbm93biBUYXJnZXRUeXBlICVYIGluIEluZGV4L1JlZmVyZW5jZSBvYmplY3QgJXAiLAotCQkJCQkgICAgc3RhY2tfZGVzYy0+cmVmZXJlbmNlLnRhcmdldF90eXBlLAotCQkJCQkgICAgc3RhY2tfZGVzYykpOwotCQkJCXN0YXR1cyA9IEFFX0FNTF9JTlRFUk5BTDsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWJyZWFrOwotCi0JCWNhc2UgQUNQSV9SRUZDTEFTU19SRUZPRjoKLQkJY2FzZSBBQ1BJX1JFRkNMQVNTX0RFQlVHOgotCQljYXNlIEFDUElfUkVGQ0xBU1NfVEFCTEU6Ci0KLQkJCS8qIEp1c3QgbGVhdmUgdGhlIG9iamVjdCBhcy1pcywgZG8gbm90IGRlcmVmZXJlbmNlICovCi0KLQkJCWJyZWFrOwotCi0JCWNhc2UgQUNQSV9SRUZDTEFTU19OQU1FOgkvKiBSZWZlcmVuY2UgdG8gYSBuYW1lZCBvYmplY3QgKi8KLQotCQkJLyogRGVyZWZlcmVuY2UgdGhlIG5hbWUgKi8KLQotCQkJaWYgKChzdGFja19kZXNjLT5yZWZlcmVuY2Uubm9kZS0+dHlwZSA9PQotCQkJICAgICBBQ1BJX1RZUEVfREVWSUNFKQotCQkJICAgIHx8IChzdGFja19kZXNjLT5yZWZlcmVuY2Uubm9kZS0+dHlwZSA9PQotCQkJCUFDUElfVFlQRV9USEVSTUFMKSkgewotCi0JCQkJLyogVGhlc2Ugbm9kZSB0eXBlcyBkbyBub3QgaGF2ZSAncmVhbCcgc3Vib2JqZWN0cyAqLwotCi0JCQkJKnN0YWNrX3B0ciA9ICh2b2lkICopc3RhY2tfZGVzYy0+cmVmZXJlbmNlLm5vZGU7Ci0JCQl9IGVsc2UgewotCQkJCS8qIEdldCB0aGUgb2JqZWN0IHBvaW50ZWQgdG8gYnkgdGhlIG5hbWVzcGFjZSBub2RlICovCi0KLQkJCQkqc3RhY2tfcHRyID0KLQkJCQkgICAgKHN0YWNrX2Rlc2MtPnJlZmVyZW5jZS5ub2RlKS0+b2JqZWN0OwotCQkJCWFjcGlfdXRfYWRkX3JlZmVyZW5jZSgqc3RhY2tfcHRyKTsKLQkJCX0KLQotCQkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKHN0YWNrX2Rlc2MpOwotCQkJYnJlYWs7Ci0KLQkJZGVmYXVsdDoKLQotCQkJQUNQSV9FUlJPUigoQUVfSU5GTywKLQkJCQkgICAgIlVua25vd24gUmVmZXJlbmNlIHR5cGUgJVggaW4gJXAiLCByZWZfdHlwZSwKLQkJCQkgICAgc3RhY2tfZGVzYykpOwotCQkJc3RhdHVzID0gQUVfQU1MX0lOVEVSTkFMOwotCQkJYnJlYWs7Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIEFDUElfVFlQRV9CVUZGRVI6Ci0KLQkJc3RhdHVzID0gYWNwaV9kc19nZXRfYnVmZmVyX2FyZ3VtZW50cyhzdGFja19kZXNjKTsKLQkJYnJlYWs7Ci0KLQljYXNlIEFDUElfVFlQRV9QQUNLQUdFOgotCi0JCXN0YXR1cyA9IGFjcGlfZHNfZ2V0X3BhY2thZ2VfYXJndW1lbnRzKHN0YWNrX2Rlc2MpOwotCQlicmVhazsKLQotCWNhc2UgQUNQSV9UWVBFX0JVRkZFUl9GSUVMRDoKLQljYXNlIEFDUElfVFlQRV9MT0NBTF9SRUdJT05fRklFTEQ6Ci0JY2FzZSBBQ1BJX1RZUEVfTE9DQUxfQkFOS19GSUVMRDoKLQljYXNlIEFDUElfVFlQRV9MT0NBTF9JTkRFWF9GSUVMRDoKLQotCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VYRUMsCi0JCQkJICAiRmllbGRSZWFkIFNvdXJjZURlc2M9JXAgVHlwZT0lWFxuIiwKLQkJCQkgIHN0YWNrX2Rlc2MsCi0JCQkJICBBQ1BJX0dFVF9PQkpFQ1RfVFlQRShzdGFja19kZXNjKSkpOwotCi0JCXN0YXR1cyA9Ci0JCSAgICBhY3BpX2V4X3JlYWRfZGF0YV9mcm9tX2ZpZWxkKHdhbGtfc3RhdGUsIHN0YWNrX2Rlc2MsCi0JCQkJCQkgJm9ial9kZXNjKTsKLQotCQkvKiBSZW1vdmUgYSByZWZlcmVuY2UgdG8gdGhlIG9yaWdpbmFsIG9wZXJhbmQsIHRoZW4gb3ZlcnJpZGUgKi8KLQotCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UoKnN0YWNrX3B0cik7Ci0JCSpzdGFja19wdHIgPSAodm9pZCAqKW9ial9kZXNjOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX0KLQotCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X3Jlc29sdmVfbXVsdGlwbGUKLSAqCi0gKiBQQVJBTUVURVJTOiAgd2Fsa19zdGF0ZSAgICAgICAgICAtIEN1cnJlbnQgc3RhdGUgKGNvbnRhaW5zIEFNTCBvcGNvZGUpCi0gKiAgICAgICAgICAgICAgT3BlcmFuZCAgICAgICAgICAgICAtIFN0YXJ0aW5nIHBvaW50IGZvciByZXNvbHV0aW9uCi0gKiAgICAgICAgICAgICAgcmV0dXJuX3R5cGUgICAgICAgICAtIFdoZXJlIHRoZSBvYmplY3QgdHlwZSBpcyByZXR1cm5lZAotICogICAgICAgICAgICAgIHJldHVybl9kZXNjICAgICAgICAgLSBXaGVyZSB0aGUgcmVzb2x2ZWQgb2JqZWN0IGlzIHJldHVybmVkCi0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cwotICoKLSAqIERFU0NSSVBUSU9OOiBSZXR1cm4gdGhlIGJhc2Ugb2JqZWN0IGFuZCB0eXBlLiAgVHJhdmVyc2UgYSByZWZlcmVuY2UgbGlzdCBpZgotICogICAgICAgICAgICAgIG5lY2Vzc2FyeSB0byBnZXQgdG8gdGhlIGJhc2Ugb2JqZWN0LgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWFjcGlfc3RhdHVzCi1hY3BpX2V4X3Jlc29sdmVfbXVsdGlwbGUoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSwKLQkJCSB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvcGVyYW5kLAotCQkJIGFjcGlfb2JqZWN0X3R5cGUgKiByZXR1cm5fdHlwZSwKLQkJCSB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICoqcmV0dXJuX2Rlc2MpCi17Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2MgPSAodm9pZCAqKW9wZXJhbmQ7Ci0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGU7Ci0JYWNwaV9vYmplY3RfdHlwZSB0eXBlOwotCWFjcGlfc3RhdHVzIHN0YXR1czsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UoYWNwaV9leF9yZXNvbHZlX211bHRpcGxlKTsKLQotCS8qIE9wZXJhbmQgY2FuIGJlIGVpdGhlciBhIG5hbWVzcGFjZSBub2RlIG9yIGFuIG9wZXJhbmQgZGVzY3JpcHRvciAqLwotCi0Jc3dpdGNoIChBQ1BJX0dFVF9ERVNDUklQVE9SX1RZUEUob2JqX2Rlc2MpKSB7Ci0JY2FzZSBBQ1BJX0RFU0NfVFlQRV9PUEVSQU5EOgotCQl0eXBlID0gb2JqX2Rlc2MtPmNvbW1vbi50eXBlOwotCQlicmVhazsKLQotCWNhc2UgQUNQSV9ERVNDX1RZUEVfTkFNRUQ6Ci0JCXR5cGUgPSAoKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICopb2JqX2Rlc2MpLT50eXBlOwotCQlvYmpfZGVzYyA9Ci0JCSAgICBhY3BpX25zX2dldF9hdHRhY2hlZF9vYmplY3QoKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICopCi0JCQkJCQlvYmpfZGVzYyk7Ci0KLQkJLyogSWYgd2UgaGFkIGFuIEFsaWFzIG5vZGUsIHVzZSB0aGUgYXR0YWNoZWQgb2JqZWN0IGZvciB0eXBlIGluZm8gKi8KLQotCQlpZiAodHlwZSA9PSBBQ1BJX1RZUEVfTE9DQUxfQUxJQVMpIHsKLQkJCXR5cGUgPSAoKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICopb2JqX2Rlc2MpLT50eXBlOwotCQkJb2JqX2Rlc2MgPQotCQkJICAgIGFjcGlfbnNfZ2V0X2F0dGFjaGVkX29iamVjdCgoc3RydWN0Ci0JCQkJCQkJIGFjcGlfbmFtZXNwYWNlX25vZGUgKikKLQkJCQkJCQlvYmpfZGVzYyk7Ci0JCX0KLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX09QRVJBTkRfVFlQRSk7Ci0JfQotCi0JLyogSWYgdHlwZSBpcyBhbnl0aGluZyBvdGhlciB0aGFuIGEgcmVmZXJlbmNlLCB3ZSBhcmUgZG9uZSAqLwotCi0JaWYgKHR5cGUgIT0gQUNQSV9UWVBFX0xPQ0FMX1JFRkVSRU5DRSkgewotCQlnb3RvIGV4aXQ7Ci0JfQotCi0JLyoKLQkgKiBGb3IgcmVmZXJlbmNlIG9iamVjdHMgY3JlYXRlZCB2aWEgdGhlIHJlZl9vZiwgSW5kZXgsIG9yIExvYWQvbG9hZF90YWJsZQotCSAqIG9wZXJhdG9ycywgd2UgbmVlZCB0byBnZXQgdG8gdGhlIGJhc2Ugb2JqZWN0IChhcyBwZXIgdGhlIEFDUEkKLQkgKiBzcGVjaWZpY2F0aW9uIG9mIHRoZSBvYmplY3RfdHlwZSBhbmQgc2l6ZV9vZiBvcGVyYXRvcnMpLiBUaGlzIG1lYW5zCi0JICogdHJhdmVyc2luZyB0aGUgbGlzdCBvZiBwb3NzaWJseSBtYW55IG5lc3RlZCByZWZlcmVuY2VzLgotCSAqLwotCXdoaWxlIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRShvYmpfZGVzYykgPT0gQUNQSV9UWVBFX0xPQ0FMX1JFRkVSRU5DRSkgewotCQlzd2l0Y2ggKG9ial9kZXNjLT5yZWZlcmVuY2UuY2xhc3MpIHsKLQkJY2FzZSBBQ1BJX1JFRkNMQVNTX1JFRk9GOgotCQljYXNlIEFDUElfUkVGQ0xBU1NfTkFNRToKLQotCQkJLyogRGVyZWZlcmVuY2UgdGhlIHJlZmVyZW5jZSBwb2ludGVyICovCi0KLQkJCWlmIChvYmpfZGVzYy0+cmVmZXJlbmNlLmNsYXNzID09IEFDUElfUkVGQ0xBU1NfUkVGT0YpIHsKLQkJCQlub2RlID0gb2JqX2Rlc2MtPnJlZmVyZW5jZS5vYmplY3Q7Ci0JCQl9IGVsc2UgewkvKiBBTUxfSU5UX05BTUVQQVRIX09QICovCi0KLQkJCQlub2RlID0gb2JqX2Rlc2MtPnJlZmVyZW5jZS5ub2RlOwotCQkJfQotCi0JCQkvKiBBbGwgIlJlZmVyZW5jZXMiIHBvaW50IHRvIGEgTlMgbm9kZSAqLwotCi0JCQlpZiAoQUNQSV9HRVRfREVTQ1JJUFRPUl9UWVBFKG5vZGUpICE9Ci0JCQkgICAgQUNQSV9ERVNDX1RZUEVfTkFNRUQpIHsKLQkJCQlBQ1BJX0VSUk9SKChBRV9JTkZPLCAiTm90IGEgTlMgbm9kZSAlcCBbJXNdIiwKLQkJCQkJICAgIG5vZGUsCi0JCQkJCSAgICBhY3BpX3V0X2dldF9kZXNjcmlwdG9yX25hbWUobm9kZSkpKTsKLQkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX0lOVEVSTkFMKTsKLQkJCX0KLQotCQkJLyogR2V0IHRoZSBhdHRhY2hlZCBvYmplY3QgKi8KLQotCQkJb2JqX2Rlc2MgPSBhY3BpX25zX2dldF9hdHRhY2hlZF9vYmplY3Qobm9kZSk7Ci0JCQlpZiAoIW9ial9kZXNjKSB7Ci0KLQkJCQkvKiBObyBvYmplY3QsIHVzZSB0aGUgTlMgbm9kZSB0eXBlICovCi0KLQkJCQl0eXBlID0gYWNwaV9uc19nZXRfdHlwZShub2RlKTsKLQkJCQlnb3RvIGV4aXQ7Ci0JCQl9Ci0KLQkJCS8qIENoZWNrIGZvciBjaXJjdWxhciByZWZlcmVuY2VzICovCi0KLQkJCWlmIChvYmpfZGVzYyA9PSBvcGVyYW5kKSB7Ci0JCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9DSVJDVUxBUl9SRUZFUkVOQ0UpOwotCQkJfQotCQkJYnJlYWs7Ci0KLQkJY2FzZSBBQ1BJX1JFRkNMQVNTX0lOREVYOgotCi0JCQkvKiBHZXQgdGhlIHR5cGUgb2YgdGhpcyByZWZlcmVuY2UgKGluZGV4IGludG8gYW5vdGhlciBvYmplY3QpICovCi0KLQkJCXR5cGUgPSBvYmpfZGVzYy0+cmVmZXJlbmNlLnRhcmdldF90eXBlOwotCQkJaWYgKHR5cGUgIT0gQUNQSV9UWVBFX1BBQ0tBR0UpIHsKLQkJCQlnb3RvIGV4aXQ7Ci0JCQl9Ci0KLQkJCS8qCi0JCQkgKiBUaGUgbWFpbiBvYmplY3QgaXMgYSBwYWNrYWdlLCB3ZSB3YW50IHRvIGdldCB0aGUgdHlwZQotCQkJICogb2YgdGhlIGluZGl2aWR1YWwgcGFja2FnZSBlbGVtZW50IHRoYXQgaXMgcmVmZXJlbmNlZCBieQotCQkJICogdGhlIGluZGV4LgotCQkJICoKLQkJCSAqIFRoaXMgY291bGQgb2YgY291cnNlIGluIHR1cm4gYmUgYW5vdGhlciByZWZlcmVuY2Ugb2JqZWN0LgotCQkJICovCi0JCQlvYmpfZGVzYyA9ICoob2JqX2Rlc2MtPnJlZmVyZW5jZS53aGVyZSk7Ci0JCQlpZiAoIW9ial9kZXNjKSB7Ci0KLQkJCQkvKiBOVUxMIHBhY2thZ2UgZWxlbWVudHMgYXJlIGFsbG93ZWQgKi8KLQotCQkJCXR5cGUgPSAwOwkvKiBVbmluaXRpYWxpemVkICovCi0JCQkJZ290byBleGl0OwotCQkJfQotCQkJYnJlYWs7Ci0KLQkJY2FzZSBBQ1BJX1JFRkNMQVNTX1RBQkxFOgotCi0JCQl0eXBlID0gQUNQSV9UWVBFX0REQl9IQU5ETEU7Ci0JCQlnb3RvIGV4aXQ7Ci0KLQkJY2FzZSBBQ1BJX1JFRkNMQVNTX0xPQ0FMOgotCQljYXNlIEFDUElfUkVGQ0xBU1NfQVJHOgotCi0JCQlpZiAocmV0dXJuX2Rlc2MpIHsKLQkJCQlzdGF0dXMgPQotCQkJCSAgICBhY3BpX2RzX21ldGhvZF9kYXRhX2dldF92YWx1ZShvYmpfZGVzYy0+Ci0JCQkJCQkJCSAgcmVmZXJlbmNlLgotCQkJCQkJCQkgIGNsYXNzLAotCQkJCQkJCQkgIG9ial9kZXNjLT4KLQkJCQkJCQkJICByZWZlcmVuY2UuCi0JCQkJCQkJCSAgdmFsdWUsCi0JCQkJCQkJCSAgd2Fsa19zdGF0ZSwKLQkJCQkJCQkJICAmb2JqX2Rlc2MpOwotCQkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLQkJCQl9Ci0JCQkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKG9ial9kZXNjKTsKLQkJCX0gZWxzZSB7Ci0JCQkJc3RhdHVzID0KLQkJCQkgICAgYWNwaV9kc19tZXRob2RfZGF0YV9nZXRfbm9kZShvYmpfZGVzYy0+Ci0JCQkJCQkJCSByZWZlcmVuY2UuCi0JCQkJCQkJCSBjbGFzcywKLQkJCQkJCQkJIG9ial9kZXNjLT4KLQkJCQkJCQkJIHJlZmVyZW5jZS4KLQkJCQkJCQkJIHZhbHVlLAotCQkJCQkJCQkgd2Fsa19zdGF0ZSwKLQkJCQkJCQkJICZub2RlKTsKLQkJCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci0JCQkJfQotCi0JCQkJb2JqX2Rlc2MgPSBhY3BpX25zX2dldF9hdHRhY2hlZF9vYmplY3Qobm9kZSk7Ci0JCQkJaWYgKCFvYmpfZGVzYykgewotCQkJCQl0eXBlID0gQUNQSV9UWVBFX0FOWTsKLQkJCQkJZ290byBleGl0OwotCQkJCX0KLQkJCX0KLQkJCWJyZWFrOwotCi0JCWNhc2UgQUNQSV9SRUZDTEFTU19ERUJVRzoKLQotCQkJLyogVGhlIERlYnVnIE9iamVjdCBpcyBvZiB0eXBlICJEZWJ1Z09iamVjdCIgKi8KLQotCQkJdHlwZSA9IEFDUElfVFlQRV9ERUJVR19PQkpFQ1Q7Ci0JCQlnb3RvIGV4aXQ7Ci0KLQkJZGVmYXVsdDoKLQotCQkJQUNQSV9FUlJPUigoQUVfSU5GTywKLQkJCQkgICAgIlVua25vd24gUmVmZXJlbmNlIENsYXNzICUyLjJYIiwKLQkJCQkgICAgb2JqX2Rlc2MtPnJlZmVyZW5jZS5jbGFzcykpOwotCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9JTlRFUk5BTCk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIE5vdyB3ZSBhcmUgZ3VhcmFudGVlZCB0byBoYXZlIGFuIG9iamVjdCB0aGF0IGhhcyBub3QgYmVlbiBjcmVhdGVkCi0JICogdmlhIHRoZSByZWZfb2Ygb3IgSW5kZXggb3BlcmF0b3JzLgotCSAqLwotCXR5cGUgPSBBQ1BJX0dFVF9PQkpFQ1RfVFlQRShvYmpfZGVzYyk7Ci0KLSAgICAgIGV4aXQ6Ci0JLyogQ29udmVydCBpbnRlcm5hbCB0eXBlcyB0byBleHRlcm5hbCB0eXBlcyAqLwotCi0Jc3dpdGNoICh0eXBlKSB7Ci0JY2FzZSBBQ1BJX1RZUEVfTE9DQUxfUkVHSU9OX0ZJRUxEOgotCWNhc2UgQUNQSV9UWVBFX0xPQ0FMX0JBTktfRklFTEQ6Ci0JY2FzZSBBQ1BJX1RZUEVfTE9DQUxfSU5ERVhfRklFTEQ6Ci0KLQkJdHlwZSA9IEFDUElfVFlQRV9GSUVMRF9VTklUOwotCQlicmVhazsKLQotCWNhc2UgQUNQSV9UWVBFX0xPQ0FMX1NDT1BFOgotCi0JCS8qIFBlciBBQ1BJIFNwZWNpZmljYXRpb24sIFNjb3BlIGlzIHVudHlwZWQgKi8KLQotCQl0eXBlID0gQUNQSV9UWVBFX0FOWTsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQkvKiBObyBjaGFuZ2UgdG8gVHlwZSByZXF1aXJlZCAqLwotCQlicmVhazsKLQl9Ci0KLQkqcmV0dXJuX3R5cGUgPSB0eXBlOwotCWlmIChyZXR1cm5fZGVzYykgewotCQkqcmV0dXJuX2Rlc2MgPSBvYmpfZGVzYzsKLQl9Ci0JcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leHJlc29wLmMgYi9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhyZXNvcC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYmI4MjU5Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leHJlc29wLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3MDAgKzAsMCBAQAotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogTW9kdWxlIE5hbWU6IGV4cmVzb3AgLSBBTUwgSW50ZXJwcmV0ZXIgb3BlcmFuZC9vYmplY3QgcmVzb2x1dGlvbgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDgsIEludGVsIENvcnAuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCi0gKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSBhdCBtaW5pbXVtIGEgZGlzY2xhaW1lcgotICogICAgc3Vic3RhbnRpYWxseSBzaW1pbGFyIHRvIHRoZSAiTk8gV0FSUkFOVFkiIGRpc2NsYWltZXIgYmVsb3cKLSAqICAgICgiRGlzY2xhaW1lciIpIGFuZCBhbnkgcmVkaXN0cmlidXRpb24gbXVzdCBiZSBjb25kaXRpb25lZCB1cG9uCi0gKiAgICBpbmNsdWRpbmcgYSBzdWJzdGFudGlhbGx5IHNpbWlsYXIgRGlzY2xhaW1lciByZXF1aXJlbWVudCBmb3IgZnVydGhlcgotICogICAgYmluYXJ5IHJlZGlzdHJpYnV0aW9uLgotICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzCi0gKiAgICBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIE5PIFdBUlJBTlRZCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKLSAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCi0gKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORwotICogSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCi0gKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCi0gKi8KLQotI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgotI2luY2x1ZGUgPGFjcGkvYW1sY29kZS5oPgotI2luY2x1ZGUgPGFjcGkvYWNwYXJzZXIuaD4KLSNpbmNsdWRlIDxhY3BpL2FjaW50ZXJwLmg+Ci0jaW5jbHVkZSA8YWNwaS9hY25hbWVzcC5oPgotCi0jZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9FWEVDVVRFUgotQUNQSV9NT0RVTEVfTkFNRSgiZXhyZXNvcCIpCi0KLS8qIExvY2FsIHByb3RvdHlwZXMgKi8KLXN0YXRpYyBhY3BpX3N0YXR1cwotYWNwaV9leF9jaGVja19vYmplY3RfdHlwZShhY3BpX29iamVjdF90eXBlIHR5cGVfbmVlZGVkLAotCQkJICBhY3BpX29iamVjdF90eXBlIHRoaXNfdHlwZSwgdm9pZCAqb2JqZWN0KTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9leF9jaGVja19vYmplY3RfdHlwZQotICoKLSAqIFBBUkFNRVRFUlM6ICB0eXBlX25lZWRlZCAgICAgICAgIE9iamVjdCB0eXBlIG5lZWRlZAotICogICAgICAgICAgICAgIHRoaXNfdHlwZSAgICAgICAgICAgQWN0dWFsIG9iamVjdCB0eXBlCi0gKiAgICAgICAgICAgICAgT2JqZWN0ICAgICAgICAgICAgICBPYmplY3QgcG9pbnRlcgotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKLSAqCi0gKiBERVNDUklQVElPTjogQ2hlY2sgcmVxdWlyZWQgdHlwZSBhZ2FpbnN0IGFjdHVhbCB0eXBlCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIGFjcGlfc3RhdHVzCi1hY3BpX2V4X2NoZWNrX29iamVjdF90eXBlKGFjcGlfb2JqZWN0X3R5cGUgdHlwZV9uZWVkZWQsCi0JCQkgIGFjcGlfb2JqZWN0X3R5cGUgdGhpc190eXBlLCB2b2lkICpvYmplY3QpCi17Ci0JQUNQSV9GVU5DVElPTl9FTlRSWSgpOwotCi0JaWYgKHR5cGVfbmVlZGVkID09IEFDUElfVFlQRV9BTlkpIHsKLQotCQkvKiBBbGwgdHlwZXMgT0ssIHNvIHdlIGRvbid0IHBlcmZvcm0gYW55IHR5cGVjaGVja3MgKi8KLQotCQlyZXR1cm4gKEFFX09LKTsKLQl9Ci0KLQlpZiAodHlwZV9uZWVkZWQgPT0gQUNQSV9UWVBFX0xPQ0FMX1JFRkVSRU5DRSkgewotCQkvKgotCQkgKiBBbGxvdyB0aGUgQU1MICJDb25zdGFudCIgb3Bjb2RlcyAoWmVybywgT25lLCBldGMuKSB0byBiZSByZWZlcmVuY2UKLQkJICogb2JqZWN0cyBhbmQgdGh1cyBhbGxvdyB0aGVtIHRvIGJlIHRhcmdldHMuICAoQXMgcGVyIHRoZSBBQ1BJCi0JCSAqIHNwZWNpZmljYXRpb24sIGEgc3RvcmUgdG8gYSBjb25zdGFudCBpcyBhIG5vb3AuKQotCQkgKi8KLQkJaWYgKCh0aGlzX3R5cGUgPT0gQUNQSV9UWVBFX0lOVEVHRVIpICYmCi0JCSAgICAoKCh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICopb2JqZWN0KS0+Y29tbW9uLgotCQkgICAgIGZsYWdzICYgQU9QT0JKX0FNTF9DT05TVEFOVCkpIHsKLQkJCXJldHVybiAoQUVfT0spOwotCQl9Ci0JfQotCi0JaWYgKHR5cGVfbmVlZGVkICE9IHRoaXNfdHlwZSkgewotCQlBQ1BJX0VSUk9SKChBRV9JTkZPLAotCQkJICAgICJOZWVkZWQgdHlwZSBbJXNdLCBmb3VuZCBbJXNdICVwIiwKLQkJCSAgICBhY3BpX3V0X2dldF90eXBlX25hbWUodHlwZV9uZWVkZWQpLAotCQkJICAgIGFjcGlfdXRfZ2V0X3R5cGVfbmFtZSh0aGlzX3R5cGUpLCBvYmplY3QpKTsKLQotCQlyZXR1cm4gKEFFX0FNTF9PUEVSQU5EX1RZUEUpOwotCX0KLQotCXJldHVybiAoQUVfT0spOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X3Jlc29sdmVfb3BlcmFuZHMKLSAqCi0gKiBQQVJBTUVURVJTOiAgT3Bjb2RlICAgICAgICAgICAgICAtIE9wY29kZSBiZWluZyBpbnRlcnByZXRlZAotICogICAgICAgICAgICAgIHN0YWNrX3B0ciAgICAgICAgICAgLSBQb2ludGVyIHRvIHRoZSBvcGVyYW5kIHN0YWNrIHRvIGJlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmVkCi0gKiAgICAgICAgICAgICAgd2Fsa19zdGF0ZSAgICAgICAgICAtIEN1cnJlbnQgc3RhdGUKLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IENvbnZlcnQgbXVsdGlwbGUgaW5wdXQgb3BlcmFuZHMgdG8gdGhlIHR5cGVzIHJlcXVpcmVkIGJ5IHRoZQotICogICAgICAgICAgICAgIHRhcmdldCBvcGVyYXRvci4KLSAqCi0gKiAgICAgIEVhY2ggNS1iaXQgZ3JvdXAgaW4gYXJnX3R5cGVzIHJlcHJlc2VudHMgb25lIHJlcXVpcmVkCi0gKiAgICAgIG9wZXJhbmQgYW5kIGluZGljYXRlcyB0aGUgcmVxdWlyZWQgVHlwZS4gVGhlIGNvcnJlc3BvbmRpbmcgb3BlcmFuZAotICogICAgICB3aWxsIGJlIGNvbnZlcnRlZCB0byB0aGUgcmVxdWlyZWQgdHlwZSBpZiBwb3NzaWJsZSwgb3RoZXJ3aXNlIHdlCi0gKiAgICAgIGFib3J0IHdpdGggYW4gZXhjZXB0aW9uLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWFjcGlfc3RhdHVzCi1hY3BpX2V4X3Jlc29sdmVfb3BlcmFuZHModTE2IG9wY29kZSwKLQkJCSB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICoqIHN0YWNrX3B0ciwKLQkJCSBzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICogd2Fsa19zdGF0ZSkKLXsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYzsKLQlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKLQl1OCBvYmplY3RfdHlwZTsKLQl1MzIgYXJnX3R5cGVzOwotCWNvbnN0IHN0cnVjdCBhY3BpX29wY29kZV9pbmZvICpvcF9pbmZvOwotCXUzMiB0aGlzX2FyZ190eXBlOwotCWFjcGlfb2JqZWN0X3R5cGUgdHlwZV9uZWVkZWQ7Ci0JdTE2IHRhcmdldF9vcCA9IDA7Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1UzMihleF9yZXNvbHZlX29wZXJhbmRzLCBvcGNvZGUpOwotCi0Jb3BfaW5mbyA9IGFjcGlfcHNfZ2V0X29wY29kZV9pbmZvKG9wY29kZSk7Ci0JaWYgKG9wX2luZm8tPmNsYXNzID09IEFNTF9DTEFTU19VTktOT1dOKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfQkFEX09QQ09ERSk7Ci0JfQotCi0JYXJnX3R5cGVzID0gb3BfaW5mby0+cnVudGltZV9hcmdzOwotCWlmIChhcmdfdHlwZXMgPT0gQVJHSV9JTlZBTElEX09QQ09ERSkgewotCQlBQ1BJX0VSUk9SKChBRV9JTkZPLCAiVW5rbm93biBBTUwgb3Bjb2RlICVYIiwgb3Bjb2RlKSk7Ci0KLQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9JTlRFUk5BTCk7Ci0JfQotCi0JQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FWEVDLAotCQkJICAiT3Bjb2RlICVYIFslc10gUmVxdWlyZWRPcGVyYW5kVHlwZXM9JTguOFhcbiIsCi0JCQkgIG9wY29kZSwgb3BfaW5mby0+bmFtZSwgYXJnX3R5cGVzKSk7Ci0KLQkvKgotCSAqIE5vcm1hbCBleGl0IGlzIHdpdGggKGFyZ190eXBlcyA9PSAwKSBhdCBlbmQgb2YgYXJndW1lbnQgbGlzdC4KLQkgKiBGdW5jdGlvbiB3aWxsIHJldHVybiBhbiBleGNlcHRpb24gZnJvbSB3aXRoaW4gdGhlIGxvb3AgdXBvbgotCSAqIGZpbmRpbmcgYW4gZW50cnkgd2hpY2ggaXMgbm90IChvciBjYW5ub3QgYmUgY29udmVydGVkCi0JICogdG8pIHRoZSByZXF1aXJlZCB0eXBlOyBpZiBzdGFjayB1bmRlcmZsb3dzOyBvciB1cG9uCi0JICogZmluZGluZyBhIE5VTEwgc3RhY2sgZW50cnkgKHdoaWNoIHNob3VsZCBub3QgaGFwcGVuKS4KLQkgKi8KLQl3aGlsZSAoR0VUX0NVUlJFTlRfQVJHX1RZUEUoYXJnX3R5cGVzKSkgewotCQlpZiAoIXN0YWNrX3B0ciB8fCAhKnN0YWNrX3B0cikgewotCQkJQUNQSV9FUlJPUigoQUVfSU5GTywgIk51bGwgc3RhY2sgZW50cnkgYXQgJXAiLAotCQkJCSAgICBzdGFja19wdHIpKTsKLQotCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9JTlRFUk5BTCk7Ci0JCX0KLQotCQkvKiBFeHRyYWN0IHVzZWZ1bCBpdGVtcyAqLwotCi0JCW9ial9kZXNjID0gKnN0YWNrX3B0cjsKLQotCQkvKiBEZWNvZGUgdGhlIGRlc2NyaXB0b3IgdHlwZSAqLwotCi0JCXN3aXRjaCAoQUNQSV9HRVRfREVTQ1JJUFRPUl9UWVBFKG9ial9kZXNjKSkgewotCQljYXNlIEFDUElfREVTQ19UWVBFX05BTUVEOgotCi0JCQkvKiBOYW1lc3BhY2UgTm9kZSAqLwotCi0JCQlvYmplY3RfdHlwZSA9Ci0JCQkgICAgKChzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqKW9ial9kZXNjKS0+dHlwZTsKLQotCQkJLyoKLQkJCSAqIFJlc29sdmUgYW4gYWxpYXMgb2JqZWN0LiBUaGUgY29uc3RydWN0aW9uIG9mIHRoZXNlIG9iamVjdHMKLQkJCSAqIGd1YXJhbnRlZXMgdGhhdCB0aGVyZSBpcyBvbmx5IG9uZSBsZXZlbCBvZiBhbGlhcyBpbmRpcmVjdGlvbjsKLQkJCSAqIHRodXMsIHRoZSBhdHRhY2hlZCBvYmplY3QgaXMgYWx3YXlzIHRoZSBhbGlhc2VkIG5hbWVzcGFjZSBub2RlCi0JCQkgKi8KLQkJCWlmIChvYmplY3RfdHlwZSA9PSBBQ1BJX1RZUEVfTE9DQUxfQUxJQVMpIHsKLQkJCQlvYmpfZGVzYyA9Ci0JCQkJICAgIGFjcGlfbnNfZ2V0X2F0dGFjaGVkX29iamVjdCgoc3RydWN0Ci0JCQkJCQkJCSBhY3BpX25hbWVzcGFjZV9ub2RlCi0JCQkJCQkJCSAqKW9ial9kZXNjKTsKLQkJCQkqc3RhY2tfcHRyID0gb2JqX2Rlc2M7Ci0JCQkJb2JqZWN0X3R5cGUgPQotCQkJCSAgICAoKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICopb2JqX2Rlc2MpLT4KLQkJCQkgICAgdHlwZTsKLQkJCX0KLQkJCWJyZWFrOwotCi0JCWNhc2UgQUNQSV9ERVNDX1RZUEVfT1BFUkFORDoKLQotCQkJLyogQUNQSSBpbnRlcm5hbCBvYmplY3QgKi8KLQotCQkJb2JqZWN0X3R5cGUgPSBBQ1BJX0dFVF9PQkpFQ1RfVFlQRShvYmpfZGVzYyk7Ci0KLQkJCS8qIENoZWNrIGZvciBiYWQgYWNwaV9vYmplY3RfdHlwZSAqLwotCi0JCQlpZiAoIWFjcGlfdXRfdmFsaWRfb2JqZWN0X3R5cGUob2JqZWN0X3R5cGUpKSB7Ci0JCQkJQUNQSV9FUlJPUigoQUVfSU5GTywKLQkJCQkJICAgICJCYWQgb3BlcmFuZCBvYmplY3QgdHlwZSBbJVhdIiwKLQkJCQkJICAgIG9iamVjdF90eXBlKSk7Ci0KLQkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX09QRVJBTkRfVFlQRSk7Ci0JCQl9Ci0KLQkJCWlmIChvYmplY3RfdHlwZSA9PSAodTgpIEFDUElfVFlQRV9MT0NBTF9SRUZFUkVOQ0UpIHsKLQotCQkJCS8qIFZhbGlkYXRlIHRoZSBSZWZlcmVuY2UgKi8KLQotCQkJCXN3aXRjaCAob2JqX2Rlc2MtPnJlZmVyZW5jZS5jbGFzcykgewotCQkJCWNhc2UgQUNQSV9SRUZDTEFTU19ERUJVRzoKLQotCQkJCQl0YXJnZXRfb3AgPSBBTUxfREVCVUdfT1A7Ci0KLQkJCQkJLypsaW50IC1mYWxsdGhyb3VnaCAqLwotCi0JCQkJY2FzZSBBQ1BJX1JFRkNMQVNTX0FSRzoKLQkJCQljYXNlIEFDUElfUkVGQ0xBU1NfTE9DQUw6Ci0JCQkJY2FzZSBBQ1BJX1JFRkNMQVNTX0lOREVYOgotCQkJCWNhc2UgQUNQSV9SRUZDTEFTU19SRUZPRjoKLQkJCQljYXNlIEFDUElfUkVGQ0xBU1NfVEFCTEU6CS8qIGRkYl9oYW5kbGUgZnJvbSBMT0FEX09QIG9yIExPQURfVEFCTEVfT1AgKi8KLQkJCQljYXNlIEFDUElfUkVGQ0xBU1NfTkFNRToJLyogUmVmZXJlbmNlIHRvIGEgbmFtZWQgb2JqZWN0ICovCi0KLQkJCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FWEVDLAotCQkJCQkJCSAgIk9wZXJhbmQgaXMgYSBSZWZlcmVuY2UsIENsYXNzIFslc10gJTIuMlhcbiIsCi0JCQkJCQkJICBhY3BpX3V0X2dldF9yZWZlcmVuY2VfbmFtZQotCQkJCQkJCSAgKG9ial9kZXNjKSwKLQkJCQkJCQkgIG9ial9kZXNjLT5yZWZlcmVuY2UuCi0JCQkJCQkJICBjbGFzcykpOwotCQkJCQlicmVhazsKLQotCQkJCWRlZmF1bHQ6Ci0KLQkJCQkJQUNQSV9FUlJPUigoQUVfSU5GTywKLQkJCQkJCSAgICAiVW5rbm93biBSZWZlcmVuY2UgQ2xhc3MgJTIuMlggaW4gJXAiLAotCQkJCQkJICAgIG9ial9kZXNjLT5yZWZlcmVuY2UuY2xhc3MsCi0JCQkJCQkgICAgb2JqX2Rlc2MpKTsKLQotCQkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX09QRVJBTkRfVFlQRSk7Ci0JCQkJfQotCQkJfQotCQkJYnJlYWs7Ci0KLQkJZGVmYXVsdDoKLQotCQkJLyogSW52YWxpZCBkZXNjcmlwdG9yICovCi0KLQkJCUFDUElfRVJST1IoKEFFX0lORk8sICJJbnZhbGlkIGRlc2NyaXB0b3IgJXAgWyVzXSIsCi0JCQkJICAgIG9ial9kZXNjLAotCQkJCSAgICBhY3BpX3V0X2dldF9kZXNjcmlwdG9yX25hbWUob2JqX2Rlc2MpKSk7Ci0KLQkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfT1BFUkFORF9UWVBFKTsKLQkJfQotCi0JCS8qIEdldCBvbmUgYXJndW1lbnQgdHlwZSwgcG9pbnQgdG8gdGhlIG5leHQgKi8KLQotCQl0aGlzX2FyZ190eXBlID0gR0VUX0NVUlJFTlRfQVJHX1RZUEUoYXJnX3R5cGVzKTsKLQkJSU5DUkVNRU5UX0FSR19MSVNUKGFyZ190eXBlcyk7Ci0KLQkJLyoKLQkJICogSGFuZGxlIGNhc2VzIHdoZXJlIHRoZSBvYmplY3QgZG9lcyBub3QgbmVlZCB0byBiZQotCQkgKiByZXNvbHZlZCB0byBhIHZhbHVlCi0JCSAqLwotCQlzd2l0Y2ggKHRoaXNfYXJnX3R5cGUpIHsKLQkJY2FzZSBBUkdJX1JFRl9PUl9TVFJJTkc6CS8qIENhbiBiZSBhIFN0cmluZyBvciBSZWZlcmVuY2UgKi8KLQotCQkJaWYgKChBQ1BJX0dFVF9ERVNDUklQVE9SX1RZUEUob2JqX2Rlc2MpID09Ci0JCQkgICAgIEFDUElfREVTQ19UWVBFX09QRVJBTkQpCi0JCQkgICAgJiYgKEFDUElfR0VUX09CSkVDVF9UWVBFKG9ial9kZXNjKSA9PQotCQkJCUFDUElfVFlQRV9TVFJJTkcpKSB7Ci0JCQkJLyoKLQkJCQkgKiBTdHJpbmcgZm91bmQgLSB0aGUgc3RyaW5nIHJlZmVyZW5jZXMgYSBuYW1lZCBvYmplY3QgYW5kCi0JCQkJICogbXVzdCBiZSByZXNvbHZlZCB0byBhIG5vZGUKLQkJCQkgKi8KLQkJCQlnb3RvIG5leHRfb3BlcmFuZDsKLQkJCX0KLQotCQkJLyoKLQkJCSAqIEVsc2Ugbm90IGEgc3RyaW5nIC0gZmFsbCB0aHJvdWdoIHRvIHRoZSBub3JtYWwgUmVmZXJlbmNlCi0JCQkgKiBjYXNlIGJlbG93Ci0JCQkgKi8KLQkJCS8qbGludCAtZmFsbHRocm91Z2ggKi8KLQotCQljYXNlIEFSR0lfUkVGRVJFTkNFOgkvKiBSZWZlcmVuY2VzOiAqLwotCQljYXNlIEFSR0lfSU5URUdFUl9SRUY6Ci0JCWNhc2UgQVJHSV9PQkpFQ1RfUkVGOgotCQljYXNlIEFSR0lfREVWSUNFX1JFRjoKLQkJY2FzZSBBUkdJX1RBUkdFVFJFRjoJLyogQWxsb3dzIGltcGxpY2l0IGNvbnZlcnNpb24gcnVsZXMgYmVmb3JlIHN0b3JlICovCi0JCWNhc2UgQVJHSV9GSVhFRF9UQVJHRVQ6CS8qIE5vIGltcGxpY2l0IGNvbnZlcnNpb24gYmVmb3JlIHN0b3JlIHRvIHRhcmdldCAqLwotCQljYXNlIEFSR0lfU0lNUExFX1RBUkdFVDoJLyogTmFtZSwgTG9jYWwsIG9yIEFyZyAtIG5vIGltcGxpY2l0IGNvbnZlcnNpb24gICovCi0KLQkJCS8qCi0JCQkgKiBOZWVkIGFuIG9wZXJhbmQgb2YgdHlwZSBBQ1BJX1RZUEVfTE9DQUxfUkVGRVJFTkNFCi0JCQkgKiBBIE5hbWVzcGFjZSBOb2RlIGlzIE9LIGFzLWlzCi0JCQkgKi8KLQkJCWlmIChBQ1BJX0dFVF9ERVNDUklQVE9SX1RZUEUob2JqX2Rlc2MpID09Ci0JCQkgICAgQUNQSV9ERVNDX1RZUEVfTkFNRUQpIHsKLQkJCQlnb3RvIG5leHRfb3BlcmFuZDsKLQkJCX0KLQotCQkJc3RhdHVzID0KLQkJCSAgICBhY3BpX2V4X2NoZWNrX29iamVjdF90eXBlKEFDUElfVFlQRV9MT0NBTF9SRUZFUkVOQ0UsCi0JCQkJCQkgICAgICBvYmplY3RfdHlwZSwgb2JqX2Rlc2MpOwotCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci0JCQl9Ci0JCQlnb3RvIG5leHRfb3BlcmFuZDsKLQotCQljYXNlIEFSR0lfREFUQVJFRk9CSjoJLyogU3RvcmUgb3BlcmF0b3Igb25seSAqLwotCi0JCQkvKgotCQkJICogV2UgZG9uJ3Qgd2FudCB0byByZXNvbHZlIGluZGV4X29wIHJlZmVyZW5jZSBvYmplY3RzIGR1cmluZwotCQkJICogYSBzdG9yZSBiZWNhdXNlIHRoaXMgd291bGQgYmUgYW4gaW1wbGljaXQgZGVfcmVmX29mIG9wZXJhdGlvbi4KLQkJCSAqIEluc3RlYWQsIHdlIGp1c3Qgd2FudCB0byBzdG9yZSB0aGUgcmVmZXJlbmNlIG9iamVjdC4KLQkJCSAqIC0tIEFsbCBvdGhlcnMgbXVzdCBiZSByZXNvbHZlZCBiZWxvdy4KLQkJCSAqLwotCQkJaWYgKChvcGNvZGUgPT0gQU1MX1NUT1JFX09QKSAmJgotCQkJICAgIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRSgqc3RhY2tfcHRyKSA9PQotCQkJICAgICBBQ1BJX1RZUEVfTE9DQUxfUkVGRVJFTkNFKQotCQkJICAgICYmICgoKnN0YWNrX3B0ciktPnJlZmVyZW5jZS5jbGFzcyA9PSBBQ1BJX1JFRkNMQVNTX0lOREVYKSkgewotCQkJCWdvdG8gbmV4dF9vcGVyYW5kOwotCQkJfQotCQkJYnJlYWs7Ci0KLQkJZGVmYXVsdDoKLQkJCS8qIEFsbCBjYXNlcyBjb3ZlcmVkIGFib3ZlICovCi0JCQlicmVhazsKLQkJfQotCi0JCS8qCi0JCSAqIFJlc29sdmUgdGhpcyBvYmplY3QgdG8gYSB2YWx1ZQotCQkgKi8KLQkJc3RhdHVzID0gYWNwaV9leF9yZXNvbHZlX3RvX3ZhbHVlKHN0YWNrX3B0ciwgd2Fsa19zdGF0ZSk7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci0JCX0KLQotCQkvKiBHZXQgdGhlIHJlc29sdmVkIG9iamVjdCAqLwotCi0JCW9ial9kZXNjID0gKnN0YWNrX3B0cjsKLQotCQkvKgotCQkgKiBDaGVjayB0aGUgcmVzdWx0aW5nIG9iamVjdCAodmFsdWUpIHR5cGUKLQkJICovCi0JCXN3aXRjaCAodGhpc19hcmdfdHlwZSkgewotCQkJLyoKLQkJCSAqIEZvciB0aGUgc2ltcGxlIGNhc2VzLCBvbmx5IG9uZSB0eXBlIG9mIHJlc29sdmVkIG9iamVjdAotCQkJICogaXMgYWxsb3dlZAotCQkJICovCi0JCWNhc2UgQVJHSV9NVVRFWDoKLQotCQkJLyogTmVlZCBhbiBvcGVyYW5kIG9mIHR5cGUgQUNQSV9UWVBFX01VVEVYICovCi0KLQkJCXR5cGVfbmVlZGVkID0gQUNQSV9UWVBFX01VVEVYOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBBUkdJX0VWRU5UOgotCi0JCQkvKiBOZWVkIGFuIG9wZXJhbmQgb2YgdHlwZSBBQ1BJX1RZUEVfRVZFTlQgKi8KLQotCQkJdHlwZV9uZWVkZWQgPSBBQ1BJX1RZUEVfRVZFTlQ7Ci0JCQlicmVhazsKLQotCQljYXNlIEFSR0lfUEFDS0FHRToJLyogUGFja2FnZSAqLwotCi0JCQkvKiBOZWVkIGFuIG9wZXJhbmQgb2YgdHlwZSBBQ1BJX1RZUEVfUEFDS0FHRSAqLwotCi0JCQl0eXBlX25lZWRlZCA9IEFDUElfVFlQRV9QQUNLQUdFOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBBUkdJX0FOWVRZUEU6Ci0KLQkJCS8qIEFueSBvcGVyYW5kIHR5cGUgd2lsbCBkbyAqLwotCi0JCQl0eXBlX25lZWRlZCA9IEFDUElfVFlQRV9BTlk7Ci0JCQlicmVhazsKLQotCQljYXNlIEFSR0lfRERCSEFORExFOgotCi0JCQkvKiBOZWVkIGFuIG9wZXJhbmQgb2YgdHlwZSBBQ1BJX1RZUEVfRERCX0hBTkRMRSAqLwotCi0JCQl0eXBlX25lZWRlZCA9IEFDUElfVFlQRV9MT0NBTF9SRUZFUkVOQ0U7Ci0JCQlicmVhazsKLQotCQkJLyoKLQkJCSAqIFRoZSBtb3JlIGNvbXBsZXggY2FzZXMgYWxsb3cgbXVsdGlwbGUgcmVzb2x2ZWQgb2JqZWN0IHR5cGVzCi0JCQkgKi8KLQkJY2FzZSBBUkdJX0lOVEVHRVI6Ci0KLQkJCS8qCi0JCQkgKiBOZWVkIGFuIG9wZXJhbmQgb2YgdHlwZSBBQ1BJX1RZUEVfSU5URUdFUiwKLQkJCSAqIEJ1dCB3ZSBjYW4gaW1wbGljaXRseSBjb252ZXJ0IGZyb20gYSBTVFJJTkcgb3IgQlVGRkVSCi0JCQkgKiBBa2EgLSAiSW1wbGljaXQgU291cmNlIE9wZXJhbmQgQ29udmVyc2lvbiIKLQkJCSAqLwotCQkJc3RhdHVzID0KLQkJCSAgICBhY3BpX2V4X2NvbnZlcnRfdG9faW50ZWdlcihvYmpfZGVzYywgc3RhY2tfcHRyLCAxNik7Ci0JCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJCQlpZiAoc3RhdHVzID09IEFFX1RZUEUpIHsKLQkJCQkJQUNQSV9FUlJPUigoQUVfSU5GTywKLQkJCQkJCSAgICAiTmVlZGVkIFtJbnRlZ2VyL1N0cmluZy9CdWZmZXJdLCBmb3VuZCBbJXNdICVwIiwKLQkJCQkJCSAgICBhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lCi0JCQkJCQkgICAgKG9ial9kZXNjKSwgb2JqX2Rlc2MpKTsKLQotCQkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX09QRVJBTkRfVFlQRSk7Ci0JCQkJfQotCi0JCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci0JCQl9Ci0KLQkJCWlmIChvYmpfZGVzYyAhPSAqc3RhY2tfcHRyKSB7Ci0JCQkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKG9ial9kZXNjKTsKLQkJCX0KLQkJCWdvdG8gbmV4dF9vcGVyYW5kOwotCi0JCWNhc2UgQVJHSV9CVUZGRVI6Ci0KLQkJCS8qCi0JCQkgKiBOZWVkIGFuIG9wZXJhbmQgb2YgdHlwZSBBQ1BJX1RZUEVfQlVGRkVSLAotCQkJICogQnV0IHdlIGNhbiBpbXBsaWNpdGx5IGNvbnZlcnQgZnJvbSBhIFNUUklORyBvciBJTlRFR0VSCi0JCQkgKiBBa2EgLSAiSW1wbGljaXQgU291cmNlIE9wZXJhbmQgQ29udmVyc2lvbiIKLQkJCSAqLwotCQkJc3RhdHVzID0gYWNwaV9leF9jb252ZXJ0X3RvX2J1ZmZlcihvYmpfZGVzYywgc3RhY2tfcHRyKTsKLQkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQkJCWlmIChzdGF0dXMgPT0gQUVfVFlQRSkgewotCQkJCQlBQ1BJX0VSUk9SKChBRV9JTkZPLAotCQkJCQkJICAgICJOZWVkZWQgW0ludGVnZXIvU3RyaW5nL0J1ZmZlcl0sIGZvdW5kIFslc10gJXAiLAotCQkJCQkJICAgIGFjcGlfdXRfZ2V0X29iamVjdF90eXBlX25hbWUKLQkJCQkJCSAgICAob2JqX2Rlc2MpLCBvYmpfZGVzYykpOwotCi0JCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfT1BFUkFORF9UWVBFKTsKLQkJCQl9Ci0KLQkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLQkJCX0KLQotCQkJaWYgKG9ial9kZXNjICE9ICpzdGFja19wdHIpIHsKLQkJCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2Uob2JqX2Rlc2MpOwotCQkJfQotCQkJZ290byBuZXh0X29wZXJhbmQ7Ci0KLQkJY2FzZSBBUkdJX1NUUklORzoKLQotCQkJLyoKLQkJCSAqIE5lZWQgYW4gb3BlcmFuZCBvZiB0eXBlIEFDUElfVFlQRV9TVFJJTkcsCi0JCQkgKiBCdXQgd2UgY2FuIGltcGxpY2l0bHkgY29udmVydCBmcm9tIGEgQlVGRkVSIG9yIElOVEVHRVIKLQkJCSAqIEFrYSAtICJJbXBsaWNpdCBTb3VyY2UgT3BlcmFuZCBDb252ZXJzaW9uIgotCQkJICovCi0JCQlzdGF0dXMgPSBhY3BpX2V4X2NvbnZlcnRfdG9fc3RyaW5nKG9ial9kZXNjLCBzdGFja19wdHIsCi0JCQkJCQkJICAgQUNQSV9JTVBMSUNJVF9DT05WRVJUX0hFWCk7Ci0JCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJCQlpZiAoc3RhdHVzID09IEFFX1RZUEUpIHsKLQkJCQkJQUNQSV9FUlJPUigoQUVfSU5GTywKLQkJCQkJCSAgICAiTmVlZGVkIFtJbnRlZ2VyL1N0cmluZy9CdWZmZXJdLCBmb3VuZCBbJXNdICVwIiwKLQkJCQkJCSAgICBhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lCi0JCQkJCQkgICAgKG9ial9kZXNjKSwgb2JqX2Rlc2MpKTsKLQotCQkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX09QRVJBTkRfVFlQRSk7Ci0JCQkJfQotCi0JCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci0JCQl9Ci0KLQkJCWlmIChvYmpfZGVzYyAhPSAqc3RhY2tfcHRyKSB7Ci0JCQkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKG9ial9kZXNjKTsKLQkJCX0KLQkJCWdvdG8gbmV4dF9vcGVyYW5kOwotCi0JCWNhc2UgQVJHSV9DT01QVVRFREFUQToKLQotCQkJLyogTmVlZCBhbiBvcGVyYW5kIG9mIHR5cGUgSU5URUdFUiwgU1RSSU5HIG9yIEJVRkZFUiAqLwotCi0JCQlzd2l0Y2ggKEFDUElfR0VUX09CSkVDVF9UWVBFKG9ial9kZXNjKSkgewotCQkJY2FzZSBBQ1BJX1RZUEVfSU5URUdFUjoKLQkJCWNhc2UgQUNQSV9UWVBFX1NUUklORzoKLQkJCWNhc2UgQUNQSV9UWVBFX0JVRkZFUjoKLQotCQkJCS8qIFZhbGlkIG9wZXJhbmQgKi8KLQkJCQlicmVhazsKLQotCQkJZGVmYXVsdDoKLQkJCQlBQ1BJX0VSUk9SKChBRV9JTkZPLAotCQkJCQkgICAgIk5lZWRlZCBbSW50ZWdlci9TdHJpbmcvQnVmZmVyXSwgZm91bmQgWyVzXSAlcCIsCi0JCQkJCSAgICBhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lCi0JCQkJCSAgICAob2JqX2Rlc2MpLCBvYmpfZGVzYykpOwotCi0JCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9PUEVSQU5EX1RZUEUpOwotCQkJfQotCQkJZ290byBuZXh0X29wZXJhbmQ7Ci0KLQkJY2FzZSBBUkdJX0JVRkZFUl9PUl9TVFJJTkc6Ci0KLQkJCS8qIE5lZWQgYW4gb3BlcmFuZCBvZiB0eXBlIFNUUklORyBvciBCVUZGRVIgKi8KLQotCQkJc3dpdGNoIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRShvYmpfZGVzYykpIHsKLQkJCWNhc2UgQUNQSV9UWVBFX1NUUklORzoKLQkJCWNhc2UgQUNQSV9UWVBFX0JVRkZFUjoKLQotCQkJCS8qIFZhbGlkIG9wZXJhbmQgKi8KLQkJCQlicmVhazsKLQotCQkJY2FzZSBBQ1BJX1RZUEVfSU5URUdFUjoKLQotCQkJCS8qIEhpZ2hlc3QgcHJpb3JpdHkgY29udmVyc2lvbiBpcyB0byB0eXBlIEJ1ZmZlciAqLwotCi0JCQkJc3RhdHVzID0KLQkJCQkgICAgYWNwaV9leF9jb252ZXJ0X3RvX2J1ZmZlcihvYmpfZGVzYywKLQkJCQkJCQkgICAgICBzdGFja19wdHIpOwotCQkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLQkJCQl9Ci0KLQkJCQlpZiAob2JqX2Rlc2MgIT0gKnN0YWNrX3B0cikgewotCQkJCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2Uob2JqX2Rlc2MpOwotCQkJCX0KLQkJCQlicmVhazsKLQotCQkJZGVmYXVsdDoKLQkJCQlBQ1BJX0VSUk9SKChBRV9JTkZPLAotCQkJCQkgICAgIk5lZWRlZCBbSW50ZWdlci9TdHJpbmcvQnVmZmVyXSwgZm91bmQgWyVzXSAlcCIsCi0JCQkJCSAgICBhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lCi0JCQkJCSAgICAob2JqX2Rlc2MpLCBvYmpfZGVzYykpOwotCi0JCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9PUEVSQU5EX1RZUEUpOwotCQkJfQotCQkJZ290byBuZXh0X29wZXJhbmQ7Ci0KLQkJY2FzZSBBUkdJX0RBVEFPQkpFQ1Q6Ci0JCQkvKgotCQkJICogQVJHSV9EQVRBT0JKRUNUIGlzIG9ubHkgdXNlZCBieSB0aGUgc2l6ZV9vZiBvcGVyYXRvci4KLQkJCSAqIE5lZWQgYSBidWZmZXIsIHN0cmluZywgcGFja2FnZSwgb3IgcmVmX29mIHJlZmVyZW5jZS4KLQkJCSAqCi0JCQkgKiBUaGUgb25seSByZWZlcmVuY2UgYWxsb3dlZCBoZXJlIGlzIGEgZGlyZWN0IHJlZmVyZW5jZSB0bwotCQkJICogYSBuYW1lc3BhY2Ugbm9kZS4KLQkJCSAqLwotCQkJc3dpdGNoIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRShvYmpfZGVzYykpIHsKLQkJCWNhc2UgQUNQSV9UWVBFX1BBQ0tBR0U6Ci0JCQljYXNlIEFDUElfVFlQRV9TVFJJTkc6Ci0JCQljYXNlIEFDUElfVFlQRV9CVUZGRVI6Ci0JCQljYXNlIEFDUElfVFlQRV9MT0NBTF9SRUZFUkVOQ0U6Ci0KLQkJCQkvKiBWYWxpZCBvcGVyYW5kICovCi0JCQkJYnJlYWs7Ci0KLQkJCWRlZmF1bHQ6Ci0JCQkJQUNQSV9FUlJPUigoQUVfSU5GTywKLQkJCQkJICAgICJOZWVkZWQgW0J1ZmZlci9TdHJpbmcvUGFja2FnZS9SZWZlcmVuY2VdLCBmb3VuZCBbJXNdICVwIiwKLQkJCQkJICAgIGFjcGlfdXRfZ2V0X29iamVjdF90eXBlX25hbWUKLQkJCQkJICAgIChvYmpfZGVzYyksIG9ial9kZXNjKSk7Ci0KLQkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX09QRVJBTkRfVFlQRSk7Ci0JCQl9Ci0JCQlnb3RvIG5leHRfb3BlcmFuZDsKLQotCQljYXNlIEFSR0lfQ09NUExFWE9CSjoKLQotCQkJLyogTmVlZCBhIGJ1ZmZlciBvciBwYWNrYWdlIG9yIChBQ1BJIDIuMCkgU3RyaW5nICovCi0KLQkJCXN3aXRjaCAoQUNQSV9HRVRfT0JKRUNUX1RZUEUob2JqX2Rlc2MpKSB7Ci0JCQljYXNlIEFDUElfVFlQRV9QQUNLQUdFOgotCQkJY2FzZSBBQ1BJX1RZUEVfU1RSSU5HOgotCQkJY2FzZSBBQ1BJX1RZUEVfQlVGRkVSOgotCi0JCQkJLyogVmFsaWQgb3BlcmFuZCAqLwotCQkJCWJyZWFrOwotCi0JCQlkZWZhdWx0OgotCQkJCUFDUElfRVJST1IoKEFFX0lORk8sCi0JCQkJCSAgICAiTmVlZGVkIFtCdWZmZXIvU3RyaW5nL1BhY2thZ2VdLCBmb3VuZCBbJXNdICVwIiwKLQkJCQkJICAgIGFjcGlfdXRfZ2V0X29iamVjdF90eXBlX25hbWUKLQkJCQkJICAgIChvYmpfZGVzYyksIG9ial9kZXNjKSk7Ci0KLQkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX09QRVJBTkRfVFlQRSk7Ci0JCQl9Ci0JCQlnb3RvIG5leHRfb3BlcmFuZDsKLQotCQljYXNlIEFSR0lfUkVHSU9OX09SX0JVRkZFUjoJLyogVXNlZCBieSBMb2FkKCkgb25seSAqLwotCi0JCQkvKiBOZWVkIGFuIG9wZXJhbmQgb2YgdHlwZSBSRUdJT04gb3IgYSBCVUZGRVIgKHdoaWNoIGNvdWxkIGJlIGEgcmVzb2x2ZWQgcmVnaW9uIGZpZWxkKSAqLwotCi0JCQlzd2l0Y2ggKEFDUElfR0VUX09CSkVDVF9UWVBFKG9ial9kZXNjKSkgewotCQkJY2FzZSBBQ1BJX1RZUEVfQlVGRkVSOgotCQkJY2FzZSBBQ1BJX1RZUEVfUkVHSU9OOgotCi0JCQkJLyogVmFsaWQgb3BlcmFuZCAqLwotCQkJCWJyZWFrOwotCi0JCQlkZWZhdWx0OgotCQkJCUFDUElfRVJST1IoKEFFX0lORk8sCi0JCQkJCSAgICAiTmVlZGVkIFtSZWdpb24vQnVmZmVyXSwgZm91bmQgWyVzXSAlcCIsCi0JCQkJCSAgICBhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lCi0JCQkJCSAgICAob2JqX2Rlc2MpLCBvYmpfZGVzYykpOwotCi0JCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9PUEVSQU5EX1RZUEUpOwotCQkJfQotCQkJZ290byBuZXh0X29wZXJhbmQ7Ci0KLQkJY2FzZSBBUkdJX0RBVEFSRUZPQko6Ci0KLQkJCS8qIFVzZWQgYnkgdGhlIFN0b3JlKCkgb3BlcmF0b3Igb25seSAqLwotCi0JCQlzd2l0Y2ggKEFDUElfR0VUX09CSkVDVF9UWVBFKG9ial9kZXNjKSkgewotCQkJY2FzZSBBQ1BJX1RZUEVfSU5URUdFUjoKLQkJCWNhc2UgQUNQSV9UWVBFX1BBQ0tBR0U6Ci0JCQljYXNlIEFDUElfVFlQRV9TVFJJTkc6Ci0JCQljYXNlIEFDUElfVFlQRV9CVUZGRVI6Ci0JCQljYXNlIEFDUElfVFlQRV9CVUZGRVJfRklFTEQ6Ci0JCQljYXNlIEFDUElfVFlQRV9MT0NBTF9SRUZFUkVOQ0U6Ci0JCQljYXNlIEFDUElfVFlQRV9MT0NBTF9SRUdJT05fRklFTEQ6Ci0JCQljYXNlIEFDUElfVFlQRV9MT0NBTF9CQU5LX0ZJRUxEOgotCQkJY2FzZSBBQ1BJX1RZUEVfTE9DQUxfSU5ERVhfRklFTEQ6Ci0JCQljYXNlIEFDUElfVFlQRV9EREJfSEFORExFOgotCi0JCQkJLyogVmFsaWQgb3BlcmFuZCAqLwotCQkJCWJyZWFrOwotCi0JCQlkZWZhdWx0OgotCi0JCQkJaWYgKGFjcGlfZ2JsX2VuYWJsZV9pbnRlcnByZXRlcl9zbGFjaykgewotCQkJCQkvKgotCQkJCQkgKiBFbmFibGUgb3JpZ2luYWwgYmVoYXZpb3Igb2YgU3RvcmUoKSwgYWxsb3dpbmcgYW55IGFuZCBhbGwKLQkJCQkJICogb2JqZWN0cyBhcyB0aGUgc291cmNlIG9wZXJhbmQuICBUaGUgQUNQSSBzcGVjIGRvZXMgbm90Ci0JCQkJCSAqIGFsbG93IHRoaXMsIGhvd2V2ZXIuCi0JCQkJCSAqLwotCQkJCQlicmVhazsKLQkJCQl9Ci0KLQkJCQlpZiAodGFyZ2V0X29wID09IEFNTF9ERUJVR19PUCkgewotCi0JCQkJCS8qIEFsbG93IHN0b3JlIG9mIGFueSBvYmplY3QgdG8gdGhlIERlYnVnIG9iamVjdCAqLwotCi0JCQkJCWJyZWFrOwotCQkJCX0KLQotCQkJCUFDUElfRVJST1IoKEFFX0lORk8sCi0JCQkJCSAgICAiTmVlZGVkIEludGVnZXIvQnVmZmVyL1N0cmluZy9QYWNrYWdlL1JlZi9EZGJdLCBmb3VuZCBbJXNdICVwIiwKLQkJCQkJICAgIGFjcGlfdXRfZ2V0X29iamVjdF90eXBlX25hbWUKLQkJCQkJICAgIChvYmpfZGVzYyksIG9ial9kZXNjKSk7Ci0KLQkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX09QRVJBTkRfVFlQRSk7Ci0JCQl9Ci0JCQlnb3RvIG5leHRfb3BlcmFuZDsKLQotCQlkZWZhdWx0OgotCi0JCQkvKiBVbmtub3duIHR5cGUgKi8KLQotCQkJQUNQSV9FUlJPUigoQUVfSU5GTywKLQkJCQkgICAgIkludGVybmFsIC0gVW5rbm93biBBUkdJIChyZXF1aXJlZCBvcGVyYW5kKSB0eXBlICVYIiwKLQkJCQkgICAgdGhpc19hcmdfdHlwZSkpOwotCi0JCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX1BBUkFNRVRFUik7Ci0JCX0KLQotCQkvKgotCQkgKiBNYWtlIHN1cmUgdGhhdCB0aGUgb3JpZ2luYWwgb2JqZWN0IHdhcyByZXNvbHZlZCB0byB0aGUKLQkJICogcmVxdWlyZWQgb2JqZWN0IHR5cGUgKFNpbXBsZSBjYXNlcyBvbmx5KS4KLQkJICovCi0JCXN0YXR1cyA9IGFjcGlfZXhfY2hlY2tfb2JqZWN0X3R5cGUodHlwZV9uZWVkZWQsCi0JCQkJCQkgICBBQ1BJX0dFVF9PQkpFQ1RfVFlQRQotCQkJCQkJICAgKCpzdGFja19wdHIpLCAqc3RhY2tfcHRyKTsKLQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLQkJfQotCi0JICAgICAgbmV4dF9vcGVyYW5kOgotCQkvKgotCQkgKiBJZiBtb3JlIG9wZXJhbmRzIG5lZWRlZCwgZGVjcmVtZW50IHN0YWNrX3B0ciB0byBwb2ludAotCQkgKiB0byBuZXh0IG9wZXJhbmQgb24gc3RhY2sKLQkJICovCi0JCWlmIChHRVRfQ1VSUkVOVF9BUkdfVFlQRShhcmdfdHlwZXMpKSB7Ci0JCQlzdGFja19wdHItLTsKLQkJfQotCX0KLQotCUFDUElfRFVNUF9PUEVSQU5EUyh3YWxrX3N0YXRlLT5vcGVyYW5kcywKLQkJCSAgIGFjcGlfcHNfZ2V0X29wY29kZV9uYW1lKG9wY29kZSksCi0JCQkgICB3YWxrX3N0YXRlLT5udW1fb3BlcmFuZHMpOwotCi0JcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhzdG9yZS5jIGIvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4c3RvcmUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzMxOGRmNC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhzdG9yZS5jCisrKyAvZGV2L251bGwKQEAgLTEsNzE1ICswLDAgQEAKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIE1vZHVsZSBOYW1lOiBleHN0b3JlIC0gQU1MIEludGVycHJldGVyIG9iamVjdCBzdG9yZSBzdXBwb3J0Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwOCwgSW50ZWwgQ29ycC4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKLSAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIGF0IG1pbmltdW0gYSBkaXNjbGFpbWVyCi0gKiAgICBzdWJzdGFudGlhbGx5IHNpbWlsYXIgdG8gdGhlICJOTyBXQVJSQU5UWSIgZGlzY2xhaW1lciBiZWxvdwotICogICAgKCJEaXNjbGFpbWVyIikgYW5kIGFueSByZWRpc3RyaWJ1dGlvbiBtdXN0IGJlIGNvbmRpdGlvbmVkIHVwb24KLSAqICAgIGluY2x1ZGluZyBhIHN1YnN0YW50aWFsbHkgc2ltaWxhciBEaXNjbGFpbWVyIHJlcXVpcmVtZW50IGZvciBmdXJ0aGVyCi0gKiAgICBiaW5hcnkgcmVkaXN0cmlidXRpb24uCi0gKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMKLSAqICAgIG9mIGFueSBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTk8gV0FSUkFOVFkKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAotICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKLSAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HCi0gKiBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKLSAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KLSAqLwotCi0jaW5jbHVkZSA8YWNwaS9hY3BpLmg+Ci0jaW5jbHVkZSA8YWNwaS9hY2Rpc3BhdC5oPgotI2luY2x1ZGUgPGFjcGkvYWNpbnRlcnAuaD4KLSNpbmNsdWRlIDxhY3BpL2FtbGNvZGUuaD4KLSNpbmNsdWRlIDxhY3BpL2FjbmFtZXNwLmg+Ci0KLSNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX0VYRUNVVEVSCi1BQ1BJX01PRFVMRV9OQU1FKCJleHN0b3JlIikKLQotLyogTG9jYWwgcHJvdG90eXBlcyAqLwotc3RhdGljIHZvaWQKLWFjcGlfZXhfZG9fZGVidWdfb2JqZWN0KHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnNvdXJjZV9kZXNjLAotCQkJdTMyIGxldmVsLCB1MzIgaW5kZXgpOwotCi1zdGF0aWMgYWNwaV9zdGF0dXMKLWFjcGlfZXhfc3RvcmVfb2JqZWN0X3RvX2luZGV4KHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnZhbF9kZXNjLAotCQkJICAgICAgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqZGVzdF9kZXNjLAotCQkJICAgICAgc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfZXhfZG9fZGVidWdfb2JqZWN0Ci0gKgotICogUEFSQU1FVEVSUzogIHNvdXJjZV9kZXNjICAgICAgICAgLSBWYWx1ZSB0byBiZSBzdG9yZWQKLSAqICAgICAgICAgICAgICBMZXZlbCAgICAgICAgICAgICAgIC0gSW5kZW50YXRpb24gbGV2ZWwgKHVzZWQgZm9yIHBhY2thZ2VzKQotICogICAgICAgICAgICAgIEluZGV4ICAgICAgICAgICAgICAgLSBDdXJyZW50IHBhY2thZ2UgZWxlbWVudCwgemVybyBpZiBub3QgcGtnCi0gKgotICogUkVUVVJOOiAgICAgIE5vbmUKLSAqCi0gKiBERVNDUklQVElPTjogSGFuZGxlcyBzdG9yZXMgdG8gdGhlIERlYnVnIE9iamVjdC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgdm9pZAotYWNwaV9leF9kb19kZWJ1Z19vYmplY3QodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqc291cmNlX2Rlc2MsCi0JCQl1MzIgbGV2ZWwsIHUzMiBpbmRleCkKLXsKLQl1MzIgaTsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKGV4X2RvX2RlYnVnX29iamVjdCwgc291cmNlX2Rlc2MpOwotCi0JLyogUHJpbnQgbGluZSBoZWFkZXIgYXMgbG9uZyBhcyB3ZSBhcmUgbm90IGluIHRoZSBtaWRkbGUgb2YgYW4gb2JqZWN0IGRpc3BsYXkgKi8KLQotCWlmICghKChsZXZlbCA+IDApICYmIGluZGV4ID09IDApKSB7Ci0JCUFDUElfREVCVUdfUFJJTlRfUkFXKChBQ1BJX0RCX0RFQlVHX09CSkVDVCwgIltBQ1BJIERlYnVnXSAlKnMiLAotCQkJCSAgICAgIGxldmVsLCAiICIpKTsKLQl9Ci0KLQkvKiBEaXNwbGF5IGluZGV4IGZvciBwYWNrYWdlIG91dHB1dCBvbmx5ICovCi0KLQlpZiAoaW5kZXggPiAwKSB7Ci0JCUFDUElfREVCVUdfUFJJTlRfUkFXKChBQ1BJX0RCX0RFQlVHX09CSkVDVCwKLQkJCQkgICAgICAiKCUuMnUpICIsIGluZGV4IC0gMSkpOwotCX0KLQotCWlmICghc291cmNlX2Rlc2MpIHsKLQkJQUNQSV9ERUJVR19QUklOVF9SQVcoKEFDUElfREJfREVCVUdfT0JKRUNULCAiW051bGwgT2JqZWN0XVxuIikpOwotCQlyZXR1cm5fVk9JRDsKLQl9Ci0KLQlpZiAoQUNQSV9HRVRfREVTQ1JJUFRPUl9UWVBFKHNvdXJjZV9kZXNjKSA9PSBBQ1BJX0RFU0NfVFlQRV9PUEVSQU5EKSB7Ci0JCUFDUElfREVCVUdfUFJJTlRfUkFXKChBQ1BJX0RCX0RFQlVHX09CSkVDVCwgIiVzICIsCi0JCQkJICAgICAgYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZQotCQkJCSAgICAgIChzb3VyY2VfZGVzYykpKTsKLQotCQlpZiAoIWFjcGlfdXRfdmFsaWRfaW50ZXJuYWxfb2JqZWN0KHNvdXJjZV9kZXNjKSkgewotCQkJQUNQSV9ERUJVR19QUklOVF9SQVcoKEFDUElfREJfREVCVUdfT0JKRUNULAotCQkJCQkgICAgICAiJXAsIEludmFsaWQgSW50ZXJuYWwgT2JqZWN0IVxuIiwKLQkJCQkJICAgICAgc291cmNlX2Rlc2MpKTsKLQkJCXJldHVybl9WT0lEOwotCQl9Ci0JfSBlbHNlIGlmIChBQ1BJX0dFVF9ERVNDUklQVE9SX1RZUEUoc291cmNlX2Rlc2MpID09Ci0JCSAgIEFDUElfREVTQ19UWVBFX05BTUVEKSB7Ci0JCUFDUElfREVCVUdfUFJJTlRfUkFXKChBQ1BJX0RCX0RFQlVHX09CSkVDVCwgIiVzOiAlcFxuIiwKLQkJCQkgICAgICBhY3BpX3V0X2dldF90eXBlX25hbWUoKChzdHJ1Y3QKLQkJCQkJCQkgICAgICBhY3BpX25hbWVzcGFjZV9ub2RlCi0JCQkJCQkJICAgICAgKilzb3VyY2VfZGVzYyktPgotCQkJCQkJCSAgICB0eXBlKSwKLQkJCQkgICAgICBzb3VyY2VfZGVzYykpOwotCQlyZXR1cm5fVk9JRDsKLQl9IGVsc2UgewotCQlyZXR1cm5fVk9JRDsKLQl9Ci0KLQkvKiBzb3VyY2VfZGVzYyBpcyBvZiB0eXBlIEFDUElfREVTQ19UWVBFX09QRVJBTkQgKi8KLQotCXN3aXRjaCAoQUNQSV9HRVRfT0JKRUNUX1RZUEUoc291cmNlX2Rlc2MpKSB7Ci0JY2FzZSBBQ1BJX1RZUEVfSU5URUdFUjoKLQotCQkvKiBPdXRwdXQgY29ycmVjdCBpbnRlZ2VyIHdpZHRoICovCi0KLQkJaWYgKGFjcGlfZ2JsX2ludGVnZXJfYnl0ZV93aWR0aCA9PSA0KSB7Ci0JCQlBQ1BJX0RFQlVHX1BSSU5UX1JBVygoQUNQSV9EQl9ERUJVR19PQkpFQ1QsICIweCU4LjhYXG4iLAotCQkJCQkgICAgICAodTMyKSBzb3VyY2VfZGVzYy0+aW50ZWdlci4KLQkJCQkJICAgICAgdmFsdWUpKTsKLQkJfSBlbHNlIHsKLQkJCUFDUElfREVCVUdfUFJJTlRfUkFXKChBQ1BJX0RCX0RFQlVHX09CSkVDVCwKLQkJCQkJICAgICAgIjB4JTguOFglOC44WFxuIiwKLQkJCQkJICAgICAgQUNQSV9GT1JNQVRfVUlOVDY0KHNvdXJjZV9kZXNjLT4KLQkJCQkJCQkJIGludGVnZXIuCi0JCQkJCQkJCSB2YWx1ZSkpKTsKLQkJfQotCQlicmVhazsKLQotCWNhc2UgQUNQSV9UWVBFX0JVRkZFUjoKLQotCQlBQ1BJX0RFQlVHX1BSSU5UX1JBVygoQUNQSV9EQl9ERUJVR19PQkpFQ1QsICJbMHglLjJYXVxuIiwKLQkJCQkgICAgICAodTMyKSBzb3VyY2VfZGVzYy0+YnVmZmVyLmxlbmd0aCkpOwotCQlBQ1BJX0RVTVBfQlVGRkVSKHNvdXJjZV9kZXNjLT5idWZmZXIucG9pbnRlciwKLQkJCQkgKHNvdXJjZV9kZXNjLT5idWZmZXIubGVuZ3RoIDwKLQkJCQkgIDI1NikgPyBzb3VyY2VfZGVzYy0+YnVmZmVyLmxlbmd0aCA6IDI1Nik7Ci0JCWJyZWFrOwotCi0JY2FzZSBBQ1BJX1RZUEVfU1RSSU5HOgotCi0JCUFDUElfREVCVUdfUFJJTlRfUkFXKChBQ1BJX0RCX0RFQlVHX09CSkVDVCwgIlsweCUuMlhdIFwiJXNcIlxuIiwKLQkJCQkgICAgICBzb3VyY2VfZGVzYy0+c3RyaW5nLmxlbmd0aCwKLQkJCQkgICAgICBzb3VyY2VfZGVzYy0+c3RyaW5nLnBvaW50ZXIpKTsKLQkJYnJlYWs7Ci0KLQljYXNlIEFDUElfVFlQRV9QQUNLQUdFOgotCi0JCUFDUElfREVCVUdfUFJJTlRfUkFXKChBQ1BJX0RCX0RFQlVHX09CSkVDVCwKLQkJCQkgICAgICAiW0NvbnRhaW5zIDB4JS4yWCBFbGVtZW50c11cbiIsCi0JCQkJICAgICAgc291cmNlX2Rlc2MtPnBhY2thZ2UuY291bnQpKTsKLQotCQkvKiBPdXRwdXQgdGhlIGVudGlyZSBjb250ZW50cyBvZiB0aGUgcGFja2FnZSAqLwotCi0JCWZvciAoaSA9IDA7IGkgPCBzb3VyY2VfZGVzYy0+cGFja2FnZS5jb3VudDsgaSsrKSB7Ci0JCQlhY3BpX2V4X2RvX2RlYnVnX29iamVjdChzb3VyY2VfZGVzYy0+cGFja2FnZS4KLQkJCQkJCWVsZW1lbnRzW2ldLCBsZXZlbCArIDQsIGkgKyAxKTsKLQkJfQotCQlicmVhazsKLQotCWNhc2UgQUNQSV9UWVBFX0xPQ0FMX1JFRkVSRU5DRToKLQotCQlBQ1BJX0RFQlVHX1BSSU5UX1JBVygoQUNQSV9EQl9ERUJVR19PQkpFQ1QsICJbJXNdICIsCi0JCQkJICAgICAgYWNwaV91dF9nZXRfcmVmZXJlbmNlX25hbWUoc291cmNlX2Rlc2MpKSk7Ci0KLQkJLyogRGVjb2RlIHRoZSByZWZlcmVuY2UgKi8KLQotCQlzd2l0Y2ggKHNvdXJjZV9kZXNjLT5yZWZlcmVuY2UuY2xhc3MpIHsKLQkJY2FzZSBBQ1BJX1JFRkNMQVNTX0lOREVYOgotCi0JCQlBQ1BJX0RFQlVHX1BSSU5UX1JBVygoQUNQSV9EQl9ERUJVR19PQkpFQ1QsICIweCVYXG4iLAotCQkJCQkgICAgICBzb3VyY2VfZGVzYy0+cmVmZXJlbmNlLnZhbHVlKSk7Ci0JCQlicmVhazsKLQotCQljYXNlIEFDUElfUkVGQ0xBU1NfVEFCTEU6Ci0KLQkJCUFDUElfREVCVUdfUFJJTlRfUkFXKChBQ1BJX0RCX0RFQlVHX09CSkVDVCwKLQkJCQkJICAgICAgIlRhYmxlIEluZGV4IDB4JVhcbiIsCi0JCQkJCSAgICAgIHNvdXJjZV9kZXNjLT5yZWZlcmVuY2UudmFsdWUpKTsKLQkJCWJyZWFrOwotCi0JCWRlZmF1bHQ6Ci0JCQlicmVhazsKLQkJfQotCi0JCUFDUElfREVCVUdfUFJJTlRfUkFXKChBQ1BJX0RCX0RFQlVHX09CSkVDVCwgIiAgIikpOwotCi0JCS8qIENoZWNrIGZvciB2YWxpZCBub2RlIGZpcnN0LCB0aGVuIHZhbGlkIG9iamVjdCAqLwotCi0JCWlmIChzb3VyY2VfZGVzYy0+cmVmZXJlbmNlLm5vZGUpIHsKLQkJCWlmIChBQ1BJX0dFVF9ERVNDUklQVE9SX1RZUEUKLQkJCSAgICAoc291cmNlX2Rlc2MtPnJlZmVyZW5jZS5ub2RlKSAhPQotCQkJICAgIEFDUElfREVTQ19UWVBFX05BTUVEKSB7Ci0JCQkJQUNQSV9ERUJVR19QUklOVF9SQVcoKEFDUElfREJfREVCVUdfT0JKRUNULAotCQkJCQkJICAgICAgIiAlcCAtIE5vdCBhIHZhbGlkIG5hbWVzcGFjZSBub2RlXG4iLAotCQkJCQkJICAgICAgc291cmNlX2Rlc2MtPnJlZmVyZW5jZS4KLQkJCQkJCSAgICAgIG5vZGUpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJQUNQSV9ERUJVR19QUklOVF9SQVcoKEFDUElfREJfREVCVUdfT0JKRUNULAotCQkJCQkJICAgICAgIk5vZGUgJXAgWyU0LjRzXSAiLAotCQkJCQkJICAgICAgc291cmNlX2Rlc2MtPnJlZmVyZW5jZS4KLQkJCQkJCSAgICAgIG5vZGUsCi0JCQkJCQkgICAgICAoc291cmNlX2Rlc2MtPnJlZmVyZW5jZS4KLQkJCQkJCSAgICAgICBub2RlKS0+bmFtZS5hc2NpaSkpOwotCi0JCQkJc3dpdGNoICgoc291cmNlX2Rlc2MtPnJlZmVyZW5jZS5ub2RlKS0+dHlwZSkgewotCi0JCQkJCS8qIFRoZXNlIHR5cGVzIGhhdmUgbm8gYXR0YWNoZWQgb2JqZWN0ICovCi0KLQkJCQljYXNlIEFDUElfVFlQRV9ERVZJQ0U6Ci0JCQkJCWFjcGlfb3NfcHJpbnRmKCJEZXZpY2VcbiIpOwotCQkJCQlicmVhazsKLQotCQkJCWNhc2UgQUNQSV9UWVBFX1RIRVJNQUw6Ci0JCQkJCWFjcGlfb3NfcHJpbnRmKCJUaGVybWFsIFpvbmVcbiIpOwotCQkJCQlicmVhazsKLQotCQkJCWRlZmF1bHQ6Ci0JCQkJCWFjcGlfZXhfZG9fZGVidWdfb2JqZWN0KChzb3VyY2VfZGVzYy0+Ci0JCQkJCQkJCSByZWZlcmVuY2UuCi0JCQkJCQkJCSBub2RlKS0+b2JqZWN0LAotCQkJCQkJCQlsZXZlbCArIDQsIDApOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoc291cmNlX2Rlc2MtPnJlZmVyZW5jZS5vYmplY3QpIHsKLQkJCWlmIChBQ1BJX0dFVF9ERVNDUklQVE9SX1RZUEUKLQkJCSAgICAoc291cmNlX2Rlc2MtPnJlZmVyZW5jZS5vYmplY3QpID09Ci0JCQkgICAgQUNQSV9ERVNDX1RZUEVfTkFNRUQpIHsKLQkJCQlhY3BpX2V4X2RvX2RlYnVnX29iamVjdCgoKHN0cnVjdAotCQkJCQkJCSAgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqKQotCQkJCQkJCSBzb3VyY2VfZGVzYy0+cmVmZXJlbmNlLgotCQkJCQkJCSBvYmplY3QpLT5vYmplY3QsCi0JCQkJCQkJbGV2ZWwgKyA0LCAwKTsKLQkJCX0gZWxzZSB7Ci0JCQkJYWNwaV9leF9kb19kZWJ1Z19vYmplY3Qoc291cmNlX2Rlc2MtPnJlZmVyZW5jZS4KLQkJCQkJCQlvYmplY3QsIGxldmVsICsgNCwgMCk7Ci0JCQl9Ci0JCX0KLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCi0JCUFDUElfREVCVUdfUFJJTlRfUkFXKChBQ1BJX0RCX0RFQlVHX09CSkVDVCwgIiVwXG4iLAotCQkJCSAgICAgIHNvdXJjZV9kZXNjKSk7Ci0JCWJyZWFrOwotCX0KLQotCUFDUElfREVCVUdfUFJJTlRfUkFXKChBQ1BJX0RCX0VYRUMsICJcbiIpKTsKLQlyZXR1cm5fVk9JRDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9leF9zdG9yZQotICoKLSAqIFBBUkFNRVRFUlM6ICAqc291cmNlX2Rlc2MgICAgICAgIC0gVmFsdWUgdG8gYmUgc3RvcmVkCi0gKiAgICAgICAgICAgICAgKmRlc3RfZGVzYyAgICAgICAgICAtIFdoZXJlIHRvIHN0b3JlIGl0LiAgTXVzdCBiZSBhbiBOUyBub2RlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIGFuIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3Qgb2YgdHlwZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWZlcmVuY2U7Ci0gKiAgICAgICAgICAgICAgd2Fsa19zdGF0ZSAgICAgICAgICAtIEN1cnJlbnQgd2FsayBzdGF0ZQotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKLSAqCi0gKiBERVNDUklQVElPTjogU3RvcmUgdGhlIHZhbHVlIGRlc2NyaWJlZCBieSBzb3VyY2VfZGVzYyBpbnRvIHRoZSBsb2NhdGlvbgotICogICAgICAgICAgICAgIGRlc2NyaWJlZCBieSBkZXN0X2Rlc2MuIENhbGxlZCBieSB2YXJpb3VzIGludGVycHJldGVyCi0gKiAgICAgICAgICAgICAgZnVuY3Rpb25zIHRvIHN0b3JlIHRoZSByZXN1bHQgb2YgYW4gb3BlcmF0aW9uIGludG8KLSAqICAgICAgICAgICAgICB0aGUgZGVzdGluYXRpb24gb3BlcmFuZCAtLSBub3QganVzdCBzaW1wbHkgdGhlIGFjdHVhbCAiU3RvcmUiCi0gKiAgICAgICAgICAgICAgQVNMIG9wZXJhdG9yLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWFjcGlfc3RhdHVzCi1hY3BpX2V4X3N0b3JlKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnNvdXJjZV9kZXNjLAotCSAgICAgIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKmRlc3RfZGVzYywKLQkgICAgICBzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKQotewotCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOwotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnJlZl9kZXNjID0gZGVzdF9kZXNjOwotCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIoZXhfc3RvcmUsIGRlc3RfZGVzYyk7Ci0KLQkvKiBWYWxpZGF0ZSBwYXJhbWV0ZXJzICovCi0KLQlpZiAoIXNvdXJjZV9kZXNjIHx8ICFkZXN0X2Rlc2MpIHsKLQkJQUNQSV9FUlJPUigoQUVfSU5GTywgIk51bGwgcGFyYW1ldGVyIikpOwotCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX05PX09QRVJBTkQpOwotCX0KLQotCS8qIGRlc3RfZGVzYyBjYW4gYmUgZWl0aGVyIGEgbmFtZXNwYWNlIG5vZGUgb3IgYW4gQUNQSSBvYmplY3QgKi8KLQotCWlmIChBQ1BJX0dFVF9ERVNDUklQVE9SX1RZUEUoZGVzdF9kZXNjKSA9PSBBQ1BJX0RFU0NfVFlQRV9OQU1FRCkgewotCQkvKgotCQkgKiBEZXN0IGlzIGEgbmFtZXNwYWNlIG5vZGUsCi0JCSAqIFN0b3JpbmcgYW4gb2JqZWN0IGludG8gYSBOYW1lZCBub2RlLgotCQkgKi8KLQkJc3RhdHVzID0gYWNwaV9leF9zdG9yZV9vYmplY3RfdG9fbm9kZShzb3VyY2VfZGVzYywKLQkJCQkJCSAgICAgIChzdHJ1Y3QKLQkJCQkJCSAgICAgICBhY3BpX25hbWVzcGFjZV9ub2RlICopCi0JCQkJCQkgICAgICBkZXN0X2Rlc2MsIHdhbGtfc3RhdGUsCi0JCQkJCQkgICAgICBBQ1BJX0lNUExJQ0lUX0NPTlZFUlNJT04pOwotCi0JCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotCX0KLQotCS8qIERlc3RpbmF0aW9uIG9iamVjdCBtdXN0IGJlIGEgUmVmZXJlbmNlIG9yIGEgQ29uc3RhbnQgb2JqZWN0ICovCi0KLQlzd2l0Y2ggKEFDUElfR0VUX09CSkVDVF9UWVBFKGRlc3RfZGVzYykpIHsKLQljYXNlIEFDUElfVFlQRV9MT0NBTF9SRUZFUkVOQ0U6Ci0JCWJyZWFrOwotCi0JY2FzZSBBQ1BJX1RZUEVfSU5URUdFUjoKLQotCQkvKiBBbGxvdyBzdG9yZXMgdG8gQ29uc3RhbnRzIC0tIGEgTm9vcCBhcyBwZXIgQUNQSSBzcGVjICovCi0KLQkJaWYgKGRlc3RfZGVzYy0+Y29tbW9uLmZsYWdzICYgQU9QT0JKX0FNTF9DT05TVEFOVCkgewotCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKLQkJfQotCi0JCS8qbGludCAtZmFsbHRocm91Z2ggKi8KLQotCWRlZmF1bHQ6Ci0KLQkJLyogRGVzdGluYXRpb24gaXMgbm90IGEgUmVmZXJlbmNlIG9iamVjdCAqLwotCi0JCUFDUElfRVJST1IoKEFFX0lORk8sCi0JCQkgICAgIlRhcmdldCBpcyBub3QgYSBSZWZlcmVuY2Ugb3IgQ29uc3RhbnQgb2JqZWN0IC0gJXMgWyVwXSIsCi0JCQkgICAgYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZShkZXN0X2Rlc2MpLAotCQkJICAgIGRlc3RfZGVzYykpOwotCi0JCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfT1BFUkFORF9UWVBFKTsKLQl9Ci0KLQkvKgotCSAqIEV4YW1pbmUgdGhlIFJlZmVyZW5jZSBjbGFzcy4gVGhlc2UgY2FzZXMgYXJlIGhhbmRsZWQ6Ci0JICoKLQkgKiAxKSBTdG9yZSB0byBOYW1lIChDaGFuZ2UgdGhlIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggYSBuYW1lKQotCSAqIDIpIFN0b3JlIHRvIGFuIGluZGV4ZWQgYXJlYSBvZiBhIEJ1ZmZlciBvciBQYWNrYWdlCi0JICogMykgU3RvcmUgdG8gYSBNZXRob2QgTG9jYWwgb3IgQXJnCi0JICogNCkgU3RvcmUgdG8gdGhlIGRlYnVnIG9iamVjdAotCSAqLwotCXN3aXRjaCAocmVmX2Rlc2MtPnJlZmVyZW5jZS5jbGFzcykgewotCWNhc2UgQUNQSV9SRUZDTEFTU19SRUZPRjoKLQotCQkvKiBTdG9yaW5nIGFuIG9iamVjdCBpbnRvIGEgTmFtZSAiY29udGFpbmVyIiAqLwotCi0JCXN0YXR1cyA9IGFjcGlfZXhfc3RvcmVfb2JqZWN0X3RvX25vZGUoc291cmNlX2Rlc2MsCi0JCQkJCQkgICAgICByZWZfZGVzYy0+cmVmZXJlbmNlLgotCQkJCQkJICAgICAgb2JqZWN0LCB3YWxrX3N0YXRlLAotCQkJCQkJICAgICAgQUNQSV9JTVBMSUNJVF9DT05WRVJTSU9OKTsKLQkJYnJlYWs7Ci0KLQljYXNlIEFDUElfUkVGQ0xBU1NfSU5ERVg6Ci0KLQkJLyogU3RvcmluZyB0byBhbiBJbmRleCAocG9pbnRlciBpbnRvIGEgcGFja2FnZXIgb3IgYnVmZmVyKSAqLwotCi0JCXN0YXR1cyA9Ci0JCSAgICBhY3BpX2V4X3N0b3JlX29iamVjdF90b19pbmRleChzb3VyY2VfZGVzYywgcmVmX2Rlc2MsCi0JCQkJCQkgIHdhbGtfc3RhdGUpOwotCQlicmVhazsKLQotCWNhc2UgQUNQSV9SRUZDTEFTU19MT0NBTDoKLQljYXNlIEFDUElfUkVGQ0xBU1NfQVJHOgotCi0JCS8qIFN0b3JlIHRvIGEgbWV0aG9kIGxvY2FsL2FyZyAgKi8KLQotCQlzdGF0dXMgPQotCQkgICAgYWNwaV9kc19zdG9yZV9vYmplY3RfdG9fbG9jYWwocmVmX2Rlc2MtPnJlZmVyZW5jZS5jbGFzcywKLQkJCQkJCSAgcmVmX2Rlc2MtPnJlZmVyZW5jZS52YWx1ZSwKLQkJCQkJCSAgc291cmNlX2Rlc2MsIHdhbGtfc3RhdGUpOwotCQlicmVhazsKLQotCWNhc2UgQUNQSV9SRUZDTEFTU19ERUJVRzoKLQotCQkvKgotCQkgKiBTdG9yaW5nIHRvIHRoZSBEZWJ1ZyBvYmplY3QgY2F1c2VzIHRoZSB2YWx1ZSBzdG9yZWQgdG8gYmUKLQkJICogZGlzcGxheWVkIGFuZCBvdGhlcndpc2UgaGFzIG5vIGVmZmVjdCAtLSBzZWUgQUNQSSBTcGVjaWZpY2F0aW9uCi0JCSAqLwotCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VYRUMsCi0JCQkJICAiKioqKiBXcml0ZSB0byBEZWJ1ZyBPYmplY3Q6IE9iamVjdCAlcCAlcyAqKioqOlxuXG4iLAotCQkJCSAgc291cmNlX2Rlc2MsCi0JCQkJICBhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lKHNvdXJjZV9kZXNjKSkpOwotCi0JCWFjcGlfZXhfZG9fZGVidWdfb2JqZWN0KHNvdXJjZV9kZXNjLCAwLCAwKTsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCi0JCUFDUElfRVJST1IoKEFFX0lORk8sICJVbmtub3duIFJlZmVyZW5jZSBDbGFzcyAlMi4yWCIsCi0JCQkgICAgcmVmX2Rlc2MtPnJlZmVyZW5jZS5jbGFzcykpOwotCQlBQ1BJX0RVTVBfRU5UUlkocmVmX2Rlc2MsIEFDUElfTFZfSU5GTyk7Ci0KLQkJc3RhdHVzID0gQUVfQU1MX0lOVEVSTkFMOwotCQlicmVhazsKLQl9Ci0KLQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9leF9zdG9yZV9vYmplY3RfdG9faW5kZXgKLSAqCi0gKiBQQVJBTUVURVJTOiAgKnNvdXJjZV9kZXNjICAgICAgICAgICAgLSBWYWx1ZSB0byBiZSBzdG9yZWQKLSAqICAgICAgICAgICAgICAqZGVzdF9kZXNjICAgICAgICAgICAgICAtIE5hbWVkIG9iamVjdCB0byByZWNlaXZlIHRoZSB2YWx1ZQotICogICAgICAgICAgICAgIHdhbGtfc3RhdGUgICAgICAgICAgICAgIC0gQ3VycmVudCB3YWxrIHN0YXRlCi0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cwotICoKLSAqIERFU0NSSVBUSU9OOiBTdG9yZSB0aGUgb2JqZWN0IHRvIGluZGV4ZWQgQnVmZmVyIG9yIFBhY2thZ2UgZWxlbWVudAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyBhY3BpX3N0YXR1cwotYWNwaV9leF9zdG9yZV9vYmplY3RfdG9faW5kZXgodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqc291cmNlX2Rlc2MsCi0JCQkgICAgICB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICppbmRleF9kZXNjLAotCQkJICAgICAgc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSkKLXsKLQlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYzsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpuZXdfZGVzYzsKLQl1OCB2YWx1ZSA9IDA7Ci0JdTMyIGk7Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGV4X3N0b3JlX29iamVjdF90b19pbmRleCk7Ci0KLQkvKgotCSAqIERlc3RpbmF0aW9uIG11c3QgYmUgYSByZWZlcmVuY2UgcG9pbnRlciwgYW5kCi0JICogbXVzdCBwb2ludCB0byBlaXRoZXIgYSBidWZmZXIgb3IgYSBwYWNrYWdlCi0JICovCi0Jc3dpdGNoIChpbmRleF9kZXNjLT5yZWZlcmVuY2UudGFyZ2V0X3R5cGUpIHsKLQljYXNlIEFDUElfVFlQRV9QQUNLQUdFOgotCQkvKgotCQkgKiBTdG9yaW5nIHRvIGEgcGFja2FnZSBlbGVtZW50LiBDb3B5IHRoZSBvYmplY3QgYW5kIHJlcGxhY2UKLQkJICogYW55IGV4aXN0aW5nIG9iamVjdCB3aXRoIHRoZSBuZXcgb2JqZWN0LiBObyBpbXBsaWNpdAotCQkgKiBjb252ZXJzaW9uIGlzIHBlcmZvcm1lZC4KLQkJICoKLQkJICogVGhlIG9iamVjdCBhdCAqKGluZGV4X2Rlc2MtPlJlZmVyZW5jZS5XaGVyZSkgaXMgdGhlCi0JCSAqIGVsZW1lbnQgd2l0aGluIHRoZSBwYWNrYWdlIHRoYXQgaXMgdG8gYmUgbW9kaWZpZWQuCi0JCSAqIFRoZSBwYXJlbnQgcGFja2FnZSBvYmplY3QgaXMgYXQgaW5kZXhfZGVzYy0+UmVmZXJlbmNlLk9iamVjdAotCQkgKi8KLQkJb2JqX2Rlc2MgPSAqKGluZGV4X2Rlc2MtPnJlZmVyZW5jZS53aGVyZSk7Ci0KLQkJaWYgKEFDUElfR0VUX09CSkVDVF9UWVBFKHNvdXJjZV9kZXNjKSA9PQotCQkgICAgQUNQSV9UWVBFX0xPQ0FMX1JFRkVSRU5DRQotCQkgICAgJiYgc291cmNlX2Rlc2MtPnJlZmVyZW5jZS5jbGFzcyA9PSBBQ1BJX1JFRkNMQVNTX1RBQkxFKSB7Ci0KLQkJCS8qIFRoaXMgaXMgYSBEREJIYW5kbGUsIGp1c3QgYWRkIGEgcmVmZXJlbmNlIHRvIGl0ICovCi0KLQkJCWFjcGlfdXRfYWRkX3JlZmVyZW5jZShzb3VyY2VfZGVzYyk7Ci0JCQluZXdfZGVzYyA9IHNvdXJjZV9kZXNjOwotCQl9IGVsc2UgewotCQkJLyogTm9ybWFsIG9iamVjdCwgY29weSBpdCAqLwotCi0JCQlzdGF0dXMgPQotCQkJICAgIGFjcGlfdXRfY29weV9pb2JqZWN0X3RvX2lvYmplY3Qoc291cmNlX2Rlc2MsCi0JCQkJCQkJICAgICZuZXdfZGVzYywKLQkJCQkJCQkgICAgd2Fsa19zdGF0ZSk7Ci0JCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLQkJCX0KLQkJfQotCi0JCWlmIChvYmpfZGVzYykgewotCi0JCQkvKiBEZWNyZW1lbnQgcmVmZXJlbmNlIGNvdW50IGJ5IHRoZSByZWYgY291bnQgb2YgdGhlIHBhcmVudCBwYWNrYWdlICovCi0KLQkJCWZvciAoaSA9IDA7IGkgPCAoKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKikKLQkJCQkJIGluZGV4X2Rlc2MtPnJlZmVyZW5jZS5vYmplY3QpLT5jb21tb24uCi0JCQkgICAgIHJlZmVyZW5jZV9jb3VudDsgaSsrKSB7Ci0JCQkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKG9ial9kZXNjKTsKLQkJCX0KLQkJfQotCi0JCSooaW5kZXhfZGVzYy0+cmVmZXJlbmNlLndoZXJlKSA9IG5ld19kZXNjOwotCi0JCS8qIEluY3JlbWVudCByZWYgY291bnQgYnkgdGhlIHJlZiBjb3VudCBvZiB0aGUgcGFyZW50IHBhY2thZ2UtMSAqLwotCi0JCWZvciAoaSA9IDE7IGkgPCAoKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKikKLQkJCQkgaW5kZXhfZGVzYy0+cmVmZXJlbmNlLm9iamVjdCktPmNvbW1vbi4KLQkJICAgICByZWZlcmVuY2VfY291bnQ7IGkrKykgewotCQkJYWNwaV91dF9hZGRfcmVmZXJlbmNlKG5ld19kZXNjKTsKLQkJfQotCi0JCWJyZWFrOwotCi0JY2FzZSBBQ1BJX1RZUEVfQlVGRkVSX0ZJRUxEOgotCi0JCS8qCi0JCSAqIFN0b3JlIGludG8gYSBCdWZmZXIgb3IgU3RyaW5nIChub3QgYWN0dWFsbHkgYSByZWFsIGJ1ZmZlcl9maWVsZCkKLQkJICogYXQgYSBsb2NhdGlvbiBkZWZpbmVkIGJ5IGFuIEluZGV4LgotCQkgKgotCQkgKiBUaGUgZmlyc3QgOC1iaXQgZWxlbWVudCBvZiB0aGUgc291cmNlIG9iamVjdCBpcyB3cml0dGVuIHRvIHRoZQotCQkgKiA4LWJpdCBCdWZmZXIgbG9jYXRpb24gZGVmaW5lZCBieSB0aGUgSW5kZXggZGVzdGluYXRpb24gb2JqZWN0LAotCQkgKiBhY2NvcmRpbmcgdG8gdGhlIEFDUEkgMi4wIHNwZWNpZmljYXRpb24uCi0JCSAqLwotCi0JCS8qCi0JCSAqIE1ha2Ugc3VyZSB0aGUgdGFyZ2V0IGlzIGEgQnVmZmVyIG9yIFN0cmluZy4gQW4gZXJyb3Igc2hvdWxkCi0JCSAqIG5vdCBoYXBwZW4gaGVyZSwgc2luY2UgdGhlIHJlZmVyZW5jZV9vYmplY3Qgd2FzIGNvbnN0cnVjdGVkCi0JCSAqIGJ5IHRoZSBJTkRFWF9PUCBjb2RlLgotCQkgKi8KLQkJb2JqX2Rlc2MgPSBpbmRleF9kZXNjLT5yZWZlcmVuY2Uub2JqZWN0OwotCQlpZiAoKEFDUElfR0VUX09CSkVDVF9UWVBFKG9ial9kZXNjKSAhPSBBQ1BJX1RZUEVfQlVGRkVSKSAmJgotCQkgICAgKEFDUElfR0VUX09CSkVDVF9UWVBFKG9ial9kZXNjKSAhPSBBQ1BJX1RZUEVfU1RSSU5HKSkgewotCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9PUEVSQU5EX1RZUEUpOwotCQl9Ci0KLQkJLyoKLQkJICogVGhlIGFzc2lnbm1lbnQgb2YgdGhlIGluZGl2aWR1YWwgZWxlbWVudHMgd2lsbCBiZSBzbGlnaHRseQotCQkgKiBkaWZmZXJlbnQgZm9yIGVhY2ggc291cmNlIHR5cGUuCi0JCSAqLwotCQlzd2l0Y2ggKEFDUElfR0VUX09CSkVDVF9UWVBFKHNvdXJjZV9kZXNjKSkgewotCQljYXNlIEFDUElfVFlQRV9JTlRFR0VSOgotCi0JCQkvKiBVc2UgdGhlIGxlYXN0LXNpZ25pZmljYW50IGJ5dGUgb2YgdGhlIGludGVnZXIgKi8KLQotCQkJdmFsdWUgPSAodTgpIChzb3VyY2VfZGVzYy0+aW50ZWdlci52YWx1ZSk7Ci0JCQlicmVhazsKLQotCQljYXNlIEFDUElfVFlQRV9CVUZGRVI6Ci0JCWNhc2UgQUNQSV9UWVBFX1NUUklORzoKLQotCQkJLyogTm90ZTogVGFrZXMgYWR2YW50YWdlIG9mIGNvbW1vbiBzdHJpbmcvYnVmZmVyIGZpZWxkcyAqLwotCi0JCQl2YWx1ZSA9IHNvdXJjZV9kZXNjLT5idWZmZXIucG9pbnRlclswXTsKLQkJCWJyZWFrOwotCi0JCWRlZmF1bHQ6Ci0KLQkJCS8qIEFsbCBvdGhlciB0eXBlcyBhcmUgaW52YWxpZCAqLwotCi0JCQlBQ1BJX0VSUk9SKChBRV9JTkZPLAotCQkJCSAgICAiU291cmNlIG11c3QgYmUgSW50ZWdlci9CdWZmZXIvU3RyaW5nIHR5cGUsIG5vdCAlcyIsCi0JCQkJICAgIGFjcGlfdXRfZ2V0X29iamVjdF90eXBlX25hbWUoc291cmNlX2Rlc2MpKSk7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX09QRVJBTkRfVFlQRSk7Ci0JCX0KLQotCQkvKiBTdG9yZSB0aGUgc291cmNlIHZhbHVlIGludG8gdGhlIHRhcmdldCBidWZmZXIgYnl0ZSAqLwotCi0JCW9ial9kZXNjLT5idWZmZXIucG9pbnRlcltpbmRleF9kZXNjLT5yZWZlcmVuY2UudmFsdWVdID0gdmFsdWU7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJQUNQSV9FUlJPUigoQUVfSU5GTywgIlRhcmdldCBpcyBub3QgYSBQYWNrYWdlIG9yIEJ1ZmZlckZpZWxkIikpOwotCQlzdGF0dXMgPSBBRV9BTUxfT1BFUkFORF9UWVBFOwotCQlicmVhazsKLQl9Ci0KLQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9leF9zdG9yZV9vYmplY3RfdG9fbm9kZQotICoKLSAqIFBBUkFNRVRFUlM6ICBzb3VyY2VfZGVzYyAgICAgICAgICAgICAtIFZhbHVlIHRvIGJlIHN0b3JlZAotICogICAgICAgICAgICAgIE5vZGUgICAgICAgICAgICAgICAgICAgIC0gTmFtZWQgb2JqZWN0IHRvIHJlY2VpdmUgdGhlIHZhbHVlCi0gKiAgICAgICAgICAgICAgd2Fsa19zdGF0ZSAgICAgICAgICAgICAgLSBDdXJyZW50IHdhbGsgc3RhdGUKLSAqICAgICAgICAgICAgICBpbXBsaWNpdF9jb252ZXJzaW9uICAgICAtIFBlcmZvcm0gaW1wbGljaXQgY29udmVyc2lvbiAoeWVzL25vKQotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKLSAqCi0gKiBERVNDUklQVElPTjogU3RvcmUgdGhlIG9iamVjdCB0byB0aGUgbmFtZWQgb2JqZWN0LgotICoKLSAqICAgICAgICAgICAgICBUaGUgQXNzaWdubWVudCBvZiBhbiBvYmplY3QgdG8gYSBuYW1lZCBvYmplY3QgaXMgaGFuZGxlZCBoZXJlCi0gKiAgICAgICAgICAgICAgVGhlIHZhbHVlIHBhc3NlZCBpbiB3aWxsIHJlcGxhY2UgdGhlIGN1cnJlbnQgdmFsdWUgKGlmIGFueSkKLSAqICAgICAgICAgICAgICB3aXRoIHRoZSBpbnB1dCB2YWx1ZS4KLSAqCi0gKiAgICAgICAgICAgICAgV2hlbiBzdG9yaW5nIGludG8gYW4gb2JqZWN0IHRoZSBkYXRhIGlzIGNvbnZlcnRlZCB0byB0aGUKLSAqICAgICAgICAgICAgICB0YXJnZXQgb2JqZWN0IHR5cGUgdGhlbiBzdG9yZWQgaW4gdGhlIG9iamVjdC4gIFRoaXMgbWVhbnMKLSAqICAgICAgICAgICAgICB0aGF0IHRoZSB0YXJnZXQgb2JqZWN0IHR5cGUgKGZvciBhbiBpbml0aWFsaXplZCB0YXJnZXQpIHdpbGwKLSAqICAgICAgICAgICAgICBub3QgYmUgY2hhbmdlZCBieSBhIHN0b3JlIG9wZXJhdGlvbi4KLSAqCi0gKiAgICAgICAgICAgICAgQXNzdW1lcyBwYXJhbWV0ZXJzIGFyZSBhbHJlYWR5IHZhbGlkYXRlZC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1hY3BpX3N0YXR1cwotYWNwaV9leF9zdG9yZV9vYmplY3RfdG9fbm9kZSh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpzb3VyY2VfZGVzYywKLQkJCSAgICAgc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGUsCi0JCQkgICAgIHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUsCi0JCQkgICAgIHU4IGltcGxpY2l0X2NvbnZlcnNpb24pCi17Ci0JYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqdGFyZ2V0X2Rlc2M7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqbmV3X2Rlc2M7Ci0JYWNwaV9vYmplY3RfdHlwZSB0YXJnZXRfdHlwZTsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKGV4X3N0b3JlX29iamVjdF90b19ub2RlLCBzb3VyY2VfZGVzYyk7Ci0KLQkvKiBHZXQgY3VycmVudCB0eXBlIG9mIHRoZSBub2RlLCBhbmQgb2JqZWN0IGF0dGFjaGVkIHRvIE5vZGUgKi8KLQotCXRhcmdldF90eXBlID0gYWNwaV9uc19nZXRfdHlwZShub2RlKTsKLQl0YXJnZXRfZGVzYyA9IGFjcGlfbnNfZ2V0X2F0dGFjaGVkX29iamVjdChub2RlKTsKLQotCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVhFQywgIlN0b3JpbmcgJXAoJXMpIGludG8gbm9kZSAlcCglcylcbiIsCi0JCQkgIHNvdXJjZV9kZXNjLAotCQkJICBhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lKHNvdXJjZV9kZXNjKSwgbm9kZSwKLQkJCSAgYWNwaV91dF9nZXRfdHlwZV9uYW1lKHRhcmdldF90eXBlKSkpOwotCi0JLyoKLQkgKiBSZXNvbHZlIHRoZSBzb3VyY2Ugb2JqZWN0IHRvIGFuIGFjdHVhbCB2YWx1ZQotCSAqIChJZiBpdCBpcyBhIHJlZmVyZW5jZSBvYmplY3QpCi0JICovCi0Jc3RhdHVzID0gYWNwaV9leF9yZXNvbHZlX29iamVjdCgmc291cmNlX2Rlc2MsIHRhcmdldF90eXBlLCB3YWxrX3N0YXRlKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci0JfQotCi0JLyogSWYgbm8gaW1wbGljaXQgY29udmVyc2lvbiwgZHJvcCBpbnRvIHRoZSBkZWZhdWx0IGNhc2UgYmVsb3cgKi8KLQotCWlmICgoIWltcGxpY2l0X2NvbnZlcnNpb24pIHx8Ci0JICAgICgod2Fsa19zdGF0ZS0+b3Bjb2RlID09IEFNTF9DT1BZX09QKSAmJgotCSAgICAgKHRhcmdldF90eXBlICE9IEFDUElfVFlQRV9MT0NBTF9SRUdJT05fRklFTEQpICYmCi0JICAgICAodGFyZ2V0X3R5cGUgIT0gQUNQSV9UWVBFX0xPQ0FMX0JBTktfRklFTEQpICYmCi0JICAgICAodGFyZ2V0X3R5cGUgIT0gQUNQSV9UWVBFX0xPQ0FMX0lOREVYX0ZJRUxEKSkpIHsKLQkJLyoKLQkJICogRm9yY2UgZXhlY3V0aW9uIG9mIGRlZmF1bHQgKG5vIGltcGxpY2l0IGNvbnZlcnNpb24pLiBOb3RlOgotCQkgKiBjb3B5X29iamVjdCBkb2VzIG5vdCBwZXJmb3JtIGFuIGltcGxpY2l0IGNvbnZlcnNpb24sIGFzIHBlciB0aGUgQUNQSQotCQkgKiBzcGVjIC0tIGV4Y2VwdCBpbiBjYXNlIG9mIHJlZ2lvbi9iYW5rL2luZGV4IGZpZWxkcyAtLSBiZWNhdXNlIHRoZXNlCi0JCSAqIG9iamVjdHMgbXVzdCByZXRhaW4gdGhlaXIgb3JpZ2luYWwgdHlwZSBwZXJtYW5lbnRseS4KLQkJICovCi0JCXRhcmdldF90eXBlID0gQUNQSV9UWVBFX0FOWTsKLQl9Ci0KLQkvKiBEbyB0aGUgYWN0dWFsIHN0b3JlIG9wZXJhdGlvbiAqLwotCi0Jc3dpdGNoICh0YXJnZXRfdHlwZSkgewotCWNhc2UgQUNQSV9UWVBFX0JVRkZFUl9GSUVMRDoKLQljYXNlIEFDUElfVFlQRV9MT0NBTF9SRUdJT05fRklFTEQ6Ci0JY2FzZSBBQ1BJX1RZUEVfTE9DQUxfQkFOS19GSUVMRDoKLQljYXNlIEFDUElfVFlQRV9MT0NBTF9JTkRFWF9GSUVMRDoKLQotCQkvKiBGb3IgZmllbGRzLCBjb3B5IHRoZSBzb3VyY2UgZGF0YSB0byB0aGUgdGFyZ2V0IGZpZWxkLiAqLwotCi0JCXN0YXR1cyA9IGFjcGlfZXhfd3JpdGVfZGF0YV90b19maWVsZChzb3VyY2VfZGVzYywgdGFyZ2V0X2Rlc2MsCi0JCQkJCQkgICAgICZ3YWxrX3N0YXRlLT5yZXN1bHRfb2JqKTsKLQkJYnJlYWs7Ci0KLQljYXNlIEFDUElfVFlQRV9JTlRFR0VSOgotCWNhc2UgQUNQSV9UWVBFX1NUUklORzoKLQljYXNlIEFDUElfVFlQRV9CVUZGRVI6Ci0KLQkJLyoKLQkJICogVGhlc2UgdGFyZ2V0IHR5cGVzIGFyZSBhbGwgb2YgdHlwZSBJbnRlZ2VyL1N0cmluZy9CdWZmZXIsIGFuZAotCQkgKiB0aGVyZWZvcmUgc3VwcG9ydCBpbXBsaWNpdCBjb252ZXJzaW9uIGJlZm9yZSB0aGUgc3RvcmUuCi0JCSAqCi0JCSAqIENvcHkgYW5kL29yIGNvbnZlcnQgdGhlIHNvdXJjZSBvYmplY3QgdG8gYSBuZXcgdGFyZ2V0IG9iamVjdAotCQkgKi8KLQkJc3RhdHVzID0KLQkJICAgIGFjcGlfZXhfc3RvcmVfb2JqZWN0X3RvX29iamVjdChzb3VyY2VfZGVzYywgdGFyZ2V0X2Rlc2MsCi0JCQkJCQkgICAmbmV3X2Rlc2MsIHdhbGtfc3RhdGUpOwotCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotCQl9Ci0KLQkJaWYgKG5ld19kZXNjICE9IHRhcmdldF9kZXNjKSB7Ci0JCQkvKgotCQkJICogU3RvcmUgdGhlIG5ldyBuZXdfZGVzYyBhcyB0aGUgbmV3IHZhbHVlIG9mIHRoZSBOYW1lLCBhbmQgc2V0Ci0JCQkgKiB0aGUgTmFtZSdzIHR5cGUgdG8gdGhhdCBvZiB0aGUgdmFsdWUgYmVpbmcgc3RvcmVkIGluIGl0LgotCQkJICogc291cmNlX2Rlc2MgcmVmZXJlbmNlIGNvdW50IGlzIGluY3JlbWVudGVkIGJ5IGF0dGFjaF9vYmplY3QuCi0JCQkgKgotCQkJICogTm90ZTogVGhpcyBtYXkgY2hhbmdlIHRoZSB0eXBlIG9mIHRoZSBub2RlIGlmIGFuIGV4cGxpY2l0IHN0b3JlCi0JCQkgKiBoYXMgYmVlbiBwZXJmb3JtZWQgc3VjaCB0aGF0IHRoZSBub2RlL29iamVjdCB0eXBlIGhhcyBiZWVuCi0JCQkgKiBjaGFuZ2VkLgotCQkJICovCi0JCQlzdGF0dXMgPQotCQkJICAgIGFjcGlfbnNfYXR0YWNoX29iamVjdChub2RlLCBuZXdfZGVzYywKLQkJCQkJCSAgbmV3X2Rlc2MtPmNvbW1vbi50eXBlKTsKLQotCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FWEVDLAotCQkJCQkgICJTdG9yZSAlcyBpbnRvICVzIHZpYSBDb252ZXJ0L0F0dGFjaFxuIiwKLQkJCQkJICBhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lCi0JCQkJCSAgKHNvdXJjZV9kZXNjKSwKLQkJCQkJICBhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lCi0JCQkJCSAgKG5ld19kZXNjKSkpOwotCQl9Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQotCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VYRUMsCi0JCQkJICAiU3RvcmluZyAlcyAoJXApIGRpcmVjdGx5IGludG8gbm9kZSAoJXApIHdpdGggbm8gaW1wbGljaXQgY29udmVyc2lvblxuIiwKLQkJCQkgIGFjcGlfdXRfZ2V0X29iamVjdF90eXBlX25hbWUoc291cmNlX2Rlc2MpLAotCQkJCSAgc291cmNlX2Rlc2MsIG5vZGUpKTsKLQotCQkvKiBObyBjb252ZXJzaW9ucyBmb3IgYWxsIG90aGVyIHR5cGVzLiAgSnVzdCBhdHRhY2ggdGhlIHNvdXJjZSBvYmplY3QgKi8KLQotCQlzdGF0dXMgPSBhY3BpX25zX2F0dGFjaF9vYmplY3Qobm9kZSwgc291cmNlX2Rlc2MsCi0JCQkJCSAgICAgICBBQ1BJX0dFVF9PQkpFQ1RfVFlQRQotCQkJCQkgICAgICAgKHNvdXJjZV9kZXNjKSk7Ci0JCWJyZWFrOwotCX0KLQotCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4c3RvcmVuLmMgYi9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhzdG9yZW4uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWVmNjFhMC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhzdG9yZW4uYworKysgL2Rldi9udWxsCkBAIC0xLDMwMyArMCwwIEBACi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBNb2R1bGUgTmFtZTogZXhzdG9yZW4gLSBBTUwgSW50ZXJwcmV0ZXIgb2JqZWN0IHN0b3JlIHN1cHBvcnQsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIFN0b3JlIHRvIE5vZGUgKG5hbWVzcGFjZSBvYmplY3QpCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwOCwgSW50ZWwgQ29ycC4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKLSAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIGF0IG1pbmltdW0gYSBkaXNjbGFpbWVyCi0gKiAgICBzdWJzdGFudGlhbGx5IHNpbWlsYXIgdG8gdGhlICJOTyBXQVJSQU5UWSIgZGlzY2xhaW1lciBiZWxvdwotICogICAgKCJEaXNjbGFpbWVyIikgYW5kIGFueSByZWRpc3RyaWJ1dGlvbiBtdXN0IGJlIGNvbmRpdGlvbmVkIHVwb24KLSAqICAgIGluY2x1ZGluZyBhIHN1YnN0YW50aWFsbHkgc2ltaWxhciBEaXNjbGFpbWVyIHJlcXVpcmVtZW50IGZvciBmdXJ0aGVyCi0gKiAgICBiaW5hcnkgcmVkaXN0cmlidXRpb24uCi0gKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMKLSAqICAgIG9mIGFueSBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTk8gV0FSUkFOVFkKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAotICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKLSAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HCi0gKiBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKLSAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KLSAqLwotCi0jaW5jbHVkZSA8YWNwaS9hY3BpLmg+Ci0jaW5jbHVkZSA8YWNwaS9hY2ludGVycC5oPgotI2luY2x1ZGUgPGFjcGkvYW1sY29kZS5oPgotCi0jZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9FWEVDVVRFUgotQUNQSV9NT0RVTEVfTkFNRSgiZXhzdG9yZW4iKQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X3Jlc29sdmVfb2JqZWN0Ci0gKgotICogUEFSQU1FVEVSUzogIHNvdXJjZV9kZXNjX3B0ciAgICAgLSBQb2ludGVyIHRvIHRoZSBzb3VyY2Ugb2JqZWN0Ci0gKiAgICAgICAgICAgICAgdGFyZ2V0X3R5cGUgICAgICAgICAtIEN1cnJlbnQgdHlwZSBvZiB0aGUgdGFyZ2V0Ci0gKiAgICAgICAgICAgICAgd2Fsa19zdGF0ZSAgICAgICAgICAtIEN1cnJlbnQgd2FsayBzdGF0ZQotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMsIHJlc29sdmVkIG9iamVjdCBpbiBzb3VyY2VfZGVzY19wdHIuCi0gKgotICogREVTQ1JJUFRJT046IFJlc29sdmUgYW4gb2JqZWN0LiAgSWYgdGhlIG9iamVjdCBpcyBhIHJlZmVyZW5jZSwgZGVyZWZlcmVuY2UKLSAqICAgICAgICAgICAgICBpdCBhbmQgcmV0dXJuIHRoZSBhY3R1YWwgb2JqZWN0IGluIHRoZSBzb3VyY2VfZGVzY19wdHIuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWFjcGlfc3RhdHVzCi1hY3BpX2V4X3Jlc29sdmVfb2JqZWN0KHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKipzb3VyY2VfZGVzY19wdHIsCi0JCSAgICAgICBhY3BpX29iamVjdF90eXBlIHRhcmdldF90eXBlLAotCQkgICAgICAgc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSkKLXsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpzb3VyY2VfZGVzYyA9ICpzb3VyY2VfZGVzY19wdHI7Ci0JYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGV4X3Jlc29sdmVfb2JqZWN0KTsKLQotCS8qIEVuc3VyZSB3ZSBoYXZlIGEgVGFyZ2V0IHRoYXQgY2FuIGJlIHN0b3JlZCB0byAqLwotCi0Jc3dpdGNoICh0YXJnZXRfdHlwZSkgewotCWNhc2UgQUNQSV9UWVBFX0JVRkZFUl9GSUVMRDoKLQljYXNlIEFDUElfVFlQRV9MT0NBTF9SRUdJT05fRklFTEQ6Ci0JY2FzZSBBQ1BJX1RZUEVfTE9DQUxfQkFOS19GSUVMRDoKLQljYXNlIEFDUElfVFlQRV9MT0NBTF9JTkRFWF9GSUVMRDoKLQkJLyoKLQkJICogVGhlc2UgY2FzZXMgYWxsIHJlcXVpcmUgb25seSBJbnRlZ2VycyBvciB2YWx1ZXMgdGhhdAotCQkgKiBjYW4gYmUgY29udmVydGVkIHRvIEludGVnZXJzIChTdHJpbmdzIG9yIEJ1ZmZlcnMpCi0JCSAqLwotCi0JY2FzZSBBQ1BJX1RZUEVfSU5URUdFUjoKLQljYXNlIEFDUElfVFlQRV9TVFJJTkc6Ci0JY2FzZSBBQ1BJX1RZUEVfQlVGRkVSOgotCi0JCS8qCi0JCSAqIFN0b3JlcyBpbnRvIGEgRmllbGQvUmVnaW9uIG9yIGludG8gYSBJbnRlZ2VyL0J1ZmZlci9TdHJpbmcKLQkJICogYXJlIGFsbCBlc3NlbnRpYWxseSB0aGUgc2FtZS4gIFRoaXMgY2FzZSBoYW5kbGVzIHRoZQotCQkgKiAiaW50ZXJjaGFuZ2VhYmxlIiB0eXBlcyBJbnRlZ2VyLCBTdHJpbmcsIGFuZCBCdWZmZXIuCi0JCSAqLwotCQlpZiAoQUNQSV9HRVRfT0JKRUNUX1RZUEUoc291cmNlX2Rlc2MpID09Ci0JCSAgICBBQ1BJX1RZUEVfTE9DQUxfUkVGRVJFTkNFKSB7Ci0KLQkJCS8qIFJlc29sdmUgYSByZWZlcmVuY2Ugb2JqZWN0IGZpcnN0ICovCi0KLQkJCXN0YXR1cyA9Ci0JCQkgICAgYWNwaV9leF9yZXNvbHZlX3RvX3ZhbHVlKHNvdXJjZV9kZXNjX3B0ciwKLQkJCQkJCSAgICAgd2Fsa19zdGF0ZSk7Ci0JCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCS8qIEZvciBjb3B5X29iamVjdCwgbm8gZnVydGhlciB2YWxpZGF0aW9uIG5lY2Vzc2FyeSAqLwotCi0JCWlmICh3YWxrX3N0YXRlLT5vcGNvZGUgPT0gQU1MX0NPUFlfT1ApIHsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJLyogTXVzdCBoYXZlIGEgSW50ZWdlciwgQnVmZmVyLCBvciBTdHJpbmcgKi8KLQotCQlpZiAoKEFDUElfR0VUX09CSkVDVF9UWVBFKHNvdXJjZV9kZXNjKSAhPSBBQ1BJX1RZUEVfSU5URUdFUikgJiYKLQkJICAgIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRShzb3VyY2VfZGVzYykgIT0gQUNQSV9UWVBFX0JVRkZFUikgJiYKLQkJICAgIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRShzb3VyY2VfZGVzYykgIT0gQUNQSV9UWVBFX1NUUklORykgJiYKLQkJICAgICEoKEFDUElfR0VUX09CSkVDVF9UWVBFKHNvdXJjZV9kZXNjKSA9PQotCQkgICAgICAgQUNQSV9UWVBFX0xPQ0FMX1JFRkVSRU5DRSkKLQkJICAgICAgJiYgKHNvdXJjZV9kZXNjLT5yZWZlcmVuY2UuY2xhc3MgPT0KLQkJCSAgQUNQSV9SRUZDTEFTU19UQUJMRSkpKSB7Ci0KLQkJCS8qIENvbnZlcnNpb24gc3VjY2Vzc2Z1bCBidXQgc3RpbGwgbm90IGEgdmFsaWQgdHlwZSAqLwotCi0JCQlBQ1BJX0VSUk9SKChBRV9JTkZPLAotCQkJCSAgICAiQ2Fubm90IGFzc2lnbiB0eXBlICVzIHRvICVzIChtdXN0IGJlIHR5cGUgSW50L1N0ci9CdWYpIiwKLQkJCQkgICAgYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZShzb3VyY2VfZGVzYyksCi0JCQkJICAgIGFjcGlfdXRfZ2V0X3R5cGVfbmFtZSh0YXJnZXRfdHlwZSkpKTsKLQkJCXN0YXR1cyA9IEFFX0FNTF9PUEVSQU5EX1RZUEU7Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIEFDUElfVFlQRV9MT0NBTF9BTElBUzoKLQljYXNlIEFDUElfVFlQRV9MT0NBTF9NRVRIT0RfQUxJQVM6Ci0KLQkJLyoKLQkJICogQWxsIGFsaWFzZXMgc2hvdWxkIGhhdmUgYmVlbiByZXNvbHZlZCBlYXJsaWVyLCBkdXJpbmcgdGhlCi0JCSAqIG9wZXJhbmQgcmVzb2x1dGlvbiBwaGFzZS4KLQkJICovCi0JCUFDUElfRVJST1IoKEFFX0lORk8sICJTdG9yZSBpbnRvIGFuIHVucmVzb2x2ZWQgQWxpYXMgb2JqZWN0IikpOwotCQlzdGF0dXMgPSBBRV9BTUxfSU5URVJOQUw7Ci0JCWJyZWFrOwotCi0JY2FzZSBBQ1BJX1RZUEVfUEFDS0FHRToKLQlkZWZhdWx0OgotCi0JCS8qCi0JCSAqIEFsbCBvdGhlciB0eXBlcyB0aGFuIEFsaWFzIGFuZCB0aGUgdmFyaW91cyBGaWVsZHMgY29tZSBoZXJlLAotCQkgKiBpbmNsdWRpbmcgdGhlIHVudHlwZWQgY2FzZSAtIEFDUElfVFlQRV9BTlkuCi0JCSAqLwotCQlicmVhazsKLQl9Ci0KLQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9leF9zdG9yZV9vYmplY3RfdG9fb2JqZWN0Ci0gKgotICogUEFSQU1FVEVSUzogIHNvdXJjZV9kZXNjICAgICAgICAgLSBPYmplY3QgdG8gc3RvcmUKLSAqICAgICAgICAgICAgICBkZXN0X2Rlc2MgICAgICAgICAgIC0gT2JqZWN0IHRvIHJlY2VpdmUgYSBjb3B5IG9mIHRoZSBzb3VyY2UKLSAqICAgICAgICAgICAgICBuZXdfZGVzYyAgICAgICAgICAgIC0gTmV3IG9iamVjdCBpZiBkZXN0X2Rlc2MgaXMgb2Jzb2xldGVkCi0gKiAgICAgICAgICAgICAgd2Fsa19zdGF0ZSAgICAgICAgICAtIEN1cnJlbnQgd2FsayBzdGF0ZQotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKLSAqCi0gKiBERVNDUklQVElPTjogIlN0b3JlIiBhbiBvYmplY3QgdG8gYW5vdGhlciBvYmplY3QuICBUaGlzIG1heSBpbmNsdWRlCi0gKiAgICAgICAgICAgICAgY29udmVydGluZyB0aGUgc291cmNlIHR5cGUgdG8gdGhlIHRhcmdldCB0eXBlIChpbXBsaWNpdAotICogICAgICAgICAgICAgIGNvbnZlcnNpb24pLCBhbmQgYSBjb3B5IG9mIHRoZSB2YWx1ZSBvZiB0aGUgc291cmNlIHRvCi0gKiAgICAgICAgICAgICAgdGhlIHRhcmdldC4KLSAqCi0gKiAgICAgICAgICAgICAgVGhlIEFzc2lnbm1lbnQgb2YgYW4gb2JqZWN0IHRvIGFub3RoZXIgKG5vdCBuYW1lZCkgb2JqZWN0Ci0gKiAgICAgICAgICAgICAgaXMgaGFuZGxlZCBoZXJlLgotICogICAgICAgICAgICAgIFRoZSBTb3VyY2UgcGFzc2VkIGluIHdpbGwgcmVwbGFjZSB0aGUgY3VycmVudCB2YWx1ZSAoaWYgYW55KQotICogICAgICAgICAgICAgIHdpdGggdGhlIGlucHV0IHZhbHVlLgotICoKLSAqICAgICAgICAgICAgICBXaGVuIHN0b3JpbmcgaW50byBhbiBvYmplY3QgdGhlIGRhdGEgaXMgY29udmVydGVkIHRvIHRoZQotICogICAgICAgICAgICAgIHRhcmdldCBvYmplY3QgdHlwZSB0aGVuIHN0b3JlZCBpbiB0aGUgb2JqZWN0LiAgVGhpcyBtZWFucwotICogICAgICAgICAgICAgIHRoYXQgdGhlIHRhcmdldCBvYmplY3QgdHlwZSAoZm9yIGFuIGluaXRpYWxpemVkIHRhcmdldCkgd2lsbAotICogICAgICAgICAgICAgIG5vdCBiZSBjaGFuZ2VkIGJ5IGEgc3RvcmUgb3BlcmF0aW9uLgotICoKLSAqICAgICAgICAgICAgICBUaGlzIG1vZHVsZSBhbGxvd3MgZGVzdGluYXRpb24gdHlwZXMgb2YgTnVtYmVyLCBTdHJpbmcsCi0gKiAgICAgICAgICAgICAgQnVmZmVyLCBhbmQgUGFja2FnZS4KLSAqCi0gKiAgICAgICAgICAgICAgQXNzdW1lcyBwYXJhbWV0ZXJzIGFyZSBhbHJlYWR5IHZhbGlkYXRlZC4gIE5PVEU6IHNvdXJjZV9kZXNjCi0gKiAgICAgICAgICAgICAgcmVzb2x1dGlvbiAoZnJvbSBhIHJlZmVyZW5jZSBvYmplY3QpIG11c3QgYmUgcGVyZm9ybWVkIGJ5Ci0gKiAgICAgICAgICAgICAgdGhlIGNhbGxlciBpZiBuZWNlc3NhcnkuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotYWNwaV9zdGF0dXMKLWFjcGlfZXhfc3RvcmVfb2JqZWN0X3RvX29iamVjdCh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpzb3VyY2VfZGVzYywKLQkJCSAgICAgICB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpkZXN0X2Rlc2MsCi0JCQkgICAgICAgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKm5ld19kZXNjLAotCQkJICAgICAgIHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUpCi17Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqYWN0dWFsX3NyY19kZXNjOwotCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOwotCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIoZXhfc3RvcmVfb2JqZWN0X3RvX29iamVjdCwgc291cmNlX2Rlc2MpOwotCi0JYWN0dWFsX3NyY19kZXNjID0gc291cmNlX2Rlc2M7Ci0JaWYgKCFkZXN0X2Rlc2MpIHsKLQkJLyoKLQkJICogVGhlcmUgaXMgbm8gZGVzdGluYXRpb24gb2JqZWN0IChBbiB1bmluaXRpYWxpemVkIG5vZGUgb3IKLQkJICogcGFja2FnZSBlbGVtZW50KSwgc28gd2UgY2FuIHNpbXBseSBjb3B5IHRoZSBzb3VyY2Ugb2JqZWN0Ci0JCSAqIGNyZWF0aW5nIGEgbmV3IGRlc3RpbmF0aW9uIG9iamVjdAotCQkgKi8KLQkJc3RhdHVzID0KLQkJICAgIGFjcGlfdXRfY29weV9pb2JqZWN0X3RvX2lvYmplY3QoYWN0dWFsX3NyY19kZXNjLCBuZXdfZGVzYywKLQkJCQkJCSAgICB3YWxrX3N0YXRlKTsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci0JfQotCi0JaWYgKEFDUElfR0VUX09CSkVDVF9UWVBFKHNvdXJjZV9kZXNjKSAhPQotCSAgICBBQ1BJX0dFVF9PQkpFQ1RfVFlQRShkZXN0X2Rlc2MpKSB7Ci0JCS8qCi0JCSAqIFRoZSBzb3VyY2UgdHlwZSBkb2VzIG5vdCBtYXRjaCB0aGUgdHlwZSBvZiB0aGUgZGVzdGluYXRpb24uCi0JCSAqIFBlcmZvcm0gdGhlICJpbXBsaWNpdCBjb252ZXJzaW9uIiBvZiB0aGUgc291cmNlIHRvIHRoZSBjdXJyZW50IHR5cGUKLQkJICogb2YgdGhlIHRhcmdldCBhcyBwZXIgdGhlIEFDUEkgc3BlY2lmaWNhdGlvbi4KLQkJICoKLQkJICogSWYgbm8gY29udmVyc2lvbiBwZXJmb3JtZWQsIGFjdHVhbF9zcmNfZGVzYyA9IHNvdXJjZV9kZXNjLgotCQkgKiBPdGhlcndpc2UsIGFjdHVhbF9zcmNfZGVzYyBpcyBhIHRlbXBvcmFyeSBvYmplY3QgdG8gaG9sZCB0aGUKLQkJICogY29udmVydGVkIG9iamVjdC4KLQkJICovCi0JCXN0YXR1cyA9Ci0JCSAgICBhY3BpX2V4X2NvbnZlcnRfdG9fdGFyZ2V0X3R5cGUoQUNQSV9HRVRfT0JKRUNUX1RZUEUKLQkJCQkJCSAgIChkZXN0X2Rlc2MpLCBzb3VyY2VfZGVzYywKLQkJCQkJCSAgICZhY3R1YWxfc3JjX2Rlc2MsCi0JCQkJCQkgICB3YWxrX3N0YXRlKTsKLQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLQkJfQotCi0JCWlmIChzb3VyY2VfZGVzYyA9PSBhY3R1YWxfc3JjX2Rlc2MpIHsKLQkJCS8qCi0JCQkgKiBObyBjb252ZXJzaW9uIHdhcyBwZXJmb3JtZWQuIFJldHVybiB0aGUgc291cmNlX2Rlc2MgYXMgdGhlCi0JCQkgKiBuZXcgb2JqZWN0LgotCQkJICovCi0JCQkqbmV3X2Rlc2MgPSBzb3VyY2VfZGVzYzsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIFdlIG5vdyBoYXZlIHR3byBvYmplY3RzIG9mIGlkZW50aWNhbCB0eXBlcywgYW5kIHdlIGNhbiBwZXJmb3JtIGEKLQkgKiBjb3B5IG9mIHRoZSAqdmFsdWUqIG9mIHRoZSBzb3VyY2Ugb2JqZWN0LgotCSAqLwotCXN3aXRjaCAoQUNQSV9HRVRfT0JKRUNUX1RZUEUoZGVzdF9kZXNjKSkgewotCWNhc2UgQUNQSV9UWVBFX0lOVEVHRVI6Ci0KLQkJZGVzdF9kZXNjLT5pbnRlZ2VyLnZhbHVlID0gYWN0dWFsX3NyY19kZXNjLT5pbnRlZ2VyLnZhbHVlOwotCi0JCS8qIFRydW5jYXRlIHZhbHVlIGlmIHdlIGFyZSBleGVjdXRpbmcgZnJvbSBhIDMyLWJpdCBBQ1BJIHRhYmxlICovCi0KLQkJYWNwaV9leF90cnVuY2F0ZV9mb3IzMmJpdF90YWJsZShkZXN0X2Rlc2MpOwotCQlicmVhazsKLQotCWNhc2UgQUNQSV9UWVBFX1NUUklORzoKLQotCQlzdGF0dXMgPQotCQkgICAgYWNwaV9leF9zdG9yZV9zdHJpbmdfdG9fc3RyaW5nKGFjdHVhbF9zcmNfZGVzYywgZGVzdF9kZXNjKTsKLQkJYnJlYWs7Ci0KLQljYXNlIEFDUElfVFlQRV9CVUZGRVI6Ci0KLQkJc3RhdHVzID0KLQkJICAgIGFjcGlfZXhfc3RvcmVfYnVmZmVyX3RvX2J1ZmZlcihhY3R1YWxfc3JjX2Rlc2MsIGRlc3RfZGVzYyk7Ci0JCWJyZWFrOwotCi0JY2FzZSBBQ1BJX1RZUEVfUEFDS0FHRToKLQotCQlzdGF0dXMgPQotCQkgICAgYWNwaV91dF9jb3B5X2lvYmplY3RfdG9faW9iamVjdChhY3R1YWxfc3JjX2Rlc2MsICZkZXN0X2Rlc2MsCi0JCQkJCQkgICAgd2Fsa19zdGF0ZSk7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJLyoKLQkJICogQWxsIG90aGVyIHR5cGVzIGNvbWUgaGVyZS4KLQkJICovCi0JCUFDUElfV0FSTklORygoQUVfSU5GTywgIlN0b3JlIGludG8gdHlwZSAlcyBub3QgaW1wbGVtZW50ZWQiLAotCQkJICAgICAgYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZShkZXN0X2Rlc2MpKSk7Ci0KLQkJc3RhdHVzID0gQUVfTk9UX0lNUExFTUVOVEVEOwotCQlicmVhazsKLQl9Ci0KLQlpZiAoYWN0dWFsX3NyY19kZXNjICE9IHNvdXJjZV9kZXNjKSB7Ci0KLQkJLyogRGVsZXRlIHRoZSBpbnRlcm1lZGlhdGUgKHRlbXBvcmFyeSkgc291cmNlIG9iamVjdCAqLwotCi0JCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZShhY3R1YWxfc3JjX2Rlc2MpOwotCX0KLQotCSpuZXdfZGVzYyA9IGRlc3RfZGVzYzsKLQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leHN0b3JvYi5jIGIvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4c3Rvcm9iLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhNzVmZjAuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4c3Rvcm9iLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMDggKzAsMCBAQAotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogTW9kdWxlIE5hbWU6IGV4c3Rvcm9iIC0gQU1MIEludGVycHJldGVyIG9iamVjdCBzdG9yZSBzdXBwb3J0LCBzdG9yZSB0byBvYmplY3QKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA4LCBJbnRlbCBDb3JwLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAotICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgYXQgbWluaW11bSBhIGRpc2NsYWltZXIKLSAqICAgIHN1YnN0YW50aWFsbHkgc2ltaWxhciB0byB0aGUgIk5PIFdBUlJBTlRZIiBkaXNjbGFpbWVyIGJlbG93Ci0gKiAgICAoIkRpc2NsYWltZXIiKSBhbmQgYW55IHJlZGlzdHJpYnV0aW9uIG11c3QgYmUgY29uZGl0aW9uZWQgdXBvbgotICogICAgaW5jbHVkaW5nIGEgc3Vic3RhbnRpYWxseSBzaW1pbGFyIERpc2NsYWltZXIgcmVxdWlyZW1lbnQgZm9yIGZ1cnRoZXIKLSAqICAgIGJpbmFyeSByZWRpc3RyaWJ1dGlvbi4KLSAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcwotICogICAgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICogU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBOTyBXQVJSQU5UWQotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCi0gKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUwotICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcKLSAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQotICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgotICovCi0KLSNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KLSNpbmNsdWRlIDxhY3BpL2FjaW50ZXJwLmg+Ci0KLSNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX0VYRUNVVEVSCi1BQ1BJX01PRFVMRV9OQU1FKCJleHN0b3JvYiIpCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfZXhfc3RvcmVfYnVmZmVyX3RvX2J1ZmZlcgotICoKLSAqIFBBUkFNRVRFUlM6ICBzb3VyY2VfZGVzYyAgICAgICAgIC0gU291cmNlIG9iamVjdCB0byBjb3B5Ci0gKiAgICAgICAgICAgICAgdGFyZ2V0X2Rlc2MgICAgICAgICAtIERlc3RpbmF0aW9uIG9iamVjdCBvZiB0aGUgY29weQotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKLSAqCi0gKiBERVNDUklQVElPTjogQ29weSBhIGJ1ZmZlciBvYmplY3QgdG8gYW5vdGhlciBidWZmZXIgb2JqZWN0LgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1hY3BpX3N0YXR1cwotYWNwaV9leF9zdG9yZV9idWZmZXJfdG9fYnVmZmVyKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnNvdXJjZV9kZXNjLAotCQkJICAgICAgIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnRhcmdldF9kZXNjKQotewotCXUzMiBsZW5ndGg7Ci0JdTggKmJ1ZmZlcjsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKGV4X3N0b3JlX2J1ZmZlcl90b19idWZmZXIsIHNvdXJjZV9kZXNjKTsKLQotCS8qIFdlIGtub3cgdGhhdCBzb3VyY2VfZGVzYyBpcyBhIGJ1ZmZlciBieSBub3cgKi8KLQotCWJ1ZmZlciA9IEFDUElfQ0FTVF9QVFIodTgsIHNvdXJjZV9kZXNjLT5idWZmZXIucG9pbnRlcik7Ci0JbGVuZ3RoID0gc291cmNlX2Rlc2MtPmJ1ZmZlci5sZW5ndGg7Ci0KLQkvKgotCSAqIElmIHRhcmdldCBpcyBhIGJ1ZmZlciBvZiBsZW5ndGggemVybyBvciBpcyBhIHN0YXRpYyBidWZmZXIsCi0JICogYWxsb2NhdGUgYSBuZXcgYnVmZmVyIG9mIHRoZSBwcm9wZXIgbGVuZ3RoCi0JICovCi0JaWYgKCh0YXJnZXRfZGVzYy0+YnVmZmVyLmxlbmd0aCA9PSAwKSB8fAotCSAgICAodGFyZ2V0X2Rlc2MtPmNvbW1vbi5mbGFncyAmIEFPUE9CSl9TVEFUSUNfUE9JTlRFUikpIHsKLQkJdGFyZ2V0X2Rlc2MtPmJ1ZmZlci5wb2ludGVyID0gQUNQSV9BTExPQ0FURShsZW5ndGgpOwotCQlpZiAoIXRhcmdldF9kZXNjLT5idWZmZXIucG9pbnRlcikgewotCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX01FTU9SWSk7Ci0JCX0KLQotCQl0YXJnZXRfZGVzYy0+YnVmZmVyLmxlbmd0aCA9IGxlbmd0aDsKLQl9Ci0KLQkvKiBDb3B5IHNvdXJjZSBidWZmZXIgdG8gdGFyZ2V0IGJ1ZmZlciAqLwotCi0JaWYgKGxlbmd0aCA8PSB0YXJnZXRfZGVzYy0+YnVmZmVyLmxlbmd0aCkgewotCi0JCS8qIENsZWFyIGV4aXN0aW5nIGJ1ZmZlciBhbmQgY29weSBpbiB0aGUgbmV3IG9uZSAqLwotCi0JCUFDUElfTUVNU0VUKHRhcmdldF9kZXNjLT5idWZmZXIucG9pbnRlciwgMCwKLQkJCSAgICB0YXJnZXRfZGVzYy0+YnVmZmVyLmxlbmd0aCk7Ci0JCUFDUElfTUVNQ1BZKHRhcmdldF9kZXNjLT5idWZmZXIucG9pbnRlciwgYnVmZmVyLCBsZW5ndGgpOwotCi0jaWZkZWYgQUNQSV9PQlNPTEVURV9CRUhBVklPUgotCQkvKgotCQkgKiBOT1RFOiBBQ1BJIHZlcnNpb25zIHVwIHRvIDMuMCBzcGVjaWZpZWQgdGhhdCB0aGUgYnVmZmVyIG11c3QgYmUKLQkJICogdHJ1bmNhdGVkIGlmIHRoZSBzdHJpbmcgaXMgc21hbGxlciB0aGFuIHRoZSBidWZmZXIuICBIb3dldmVyLCAib3RoZXIiCi0JCSAqIGltcGxlbWVudGF0aW9ucyBvZiBBQ1BJIG5ldmVyIGRpZCB0aGlzIGFuZCB0aHVzIGJlY2FtZSB0aGUgZGVmYWN0bwotCQkgKiBzdGFuZGFyZC4gQUNQSSAzLjBfYSBjaGFuZ2VzIHRoaXMgYmVoYXZpb3Igc3VjaCB0aGF0IHRoZSBidWZmZXIKLQkJICogaXMgbm8gbG9uZ2VyIHRydW5jYXRlZC4KLQkJICovCi0KLQkJLyoKLQkJICogT0JTT0xFVEUgQkVIQVZJT1I6Ci0JCSAqIElmIHRoZSBvcmlnaW5hbCBzb3VyY2Ugd2FzIGEgc3RyaW5nLCB3ZSBtdXN0IHRydW5jYXRlIHRoZSBidWZmZXIsCi0JCSAqIGFjY29yZGluZyB0byB0aGUgQUNQSSBzcGVjLiAgSW50ZWdlci10by1CdWZmZXIgYW5kIEJ1ZmZlci10by1CdWZmZXIKLQkJICogY29weSBtdXN0IG5vdCB0cnVuY2F0ZSB0aGUgb3JpZ2luYWwgYnVmZmVyLgotCQkgKi8KLQkJaWYgKG9yaWdpbmFsX3NyY190eXBlID09IEFDUElfVFlQRV9TVFJJTkcpIHsKLQotCQkJLyogU2V0IHRoZSBuZXcgbGVuZ3RoIG9mIHRoZSB0YXJnZXQgKi8KLQotCQkJdGFyZ2V0X2Rlc2MtPmJ1ZmZlci5sZW5ndGggPSBsZW5ndGg7Ci0JCX0KLSNlbmRpZgotCX0gZWxzZSB7Ci0JCS8qIFRydW5jYXRlIHRoZSBzb3VyY2UsIGNvcHkgb25seSB3aGF0IHdpbGwgZml0ICovCi0KLQkJQUNQSV9NRU1DUFkodGFyZ2V0X2Rlc2MtPmJ1ZmZlci5wb2ludGVyLCBidWZmZXIsCi0JCQkgICAgdGFyZ2V0X2Rlc2MtPmJ1ZmZlci5sZW5ndGgpOwotCi0JCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywKLQkJCQkgICJUcnVuY2F0aW5nIHNvdXJjZSBidWZmZXIgZnJvbSAlWCB0byAlWFxuIiwKLQkJCQkgIGxlbmd0aCwgdGFyZ2V0X2Rlc2MtPmJ1ZmZlci5sZW5ndGgpKTsKLQl9Ci0KLQkvKiBDb3B5IGZsYWdzICovCi0KLQl0YXJnZXRfZGVzYy0+YnVmZmVyLmZsYWdzID0gc291cmNlX2Rlc2MtPmJ1ZmZlci5mbGFnczsKLQl0YXJnZXRfZGVzYy0+Y29tbW9uLmZsYWdzICY9IH5BT1BPQkpfU1RBVElDX1BPSU5URVI7Ci0JcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9leF9zdG9yZV9zdHJpbmdfdG9fc3RyaW5nCi0gKgotICogUEFSQU1FVEVSUzogIHNvdXJjZV9kZXNjICAgICAgICAgLSBTb3VyY2Ugb2JqZWN0IHRvIGNvcHkKLSAqICAgICAgICAgICAgICB0YXJnZXRfZGVzYyAgICAgICAgIC0gRGVzdGluYXRpb24gb2JqZWN0IG9mIHRoZSBjb3B5Ci0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cwotICoKLSAqIERFU0NSSVBUSU9OOiBDb3B5IGEgU3RyaW5nIG9iamVjdCB0byBhbm90aGVyIFN0cmluZyBvYmplY3QKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1hY3BpX3N0YXR1cwotYWNwaV9leF9zdG9yZV9zdHJpbmdfdG9fc3RyaW5nKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnNvdXJjZV9kZXNjLAotCQkJICAgICAgIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnRhcmdldF9kZXNjKQotewotCXUzMiBsZW5ndGg7Ci0JdTggKmJ1ZmZlcjsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKGV4X3N0b3JlX3N0cmluZ190b19zdHJpbmcsIHNvdXJjZV9kZXNjKTsKLQotCS8qIFdlIGtub3cgdGhhdCBzb3VyY2VfZGVzYyBpcyBhIHN0cmluZyBieSBub3cgKi8KLQotCWJ1ZmZlciA9IEFDUElfQ0FTVF9QVFIodTgsIHNvdXJjZV9kZXNjLT5zdHJpbmcucG9pbnRlcik7Ci0JbGVuZ3RoID0gc291cmNlX2Rlc2MtPnN0cmluZy5sZW5ndGg7Ci0KLQkvKgotCSAqIFJlcGxhY2UgZXhpc3Rpbmcgc3RyaW5nIHZhbHVlIGlmIGl0IHdpbGwgZml0IGFuZCB0aGUgc3RyaW5nCi0JICogcG9pbnRlciBpcyBub3QgYSBzdGF0aWMgcG9pbnRlciAocGFydCBvZiBhbiBBQ1BJIHRhYmxlKQotCSAqLwotCWlmICgobGVuZ3RoIDwgdGFyZ2V0X2Rlc2MtPnN0cmluZy5sZW5ndGgpICYmCi0JICAgICghKHRhcmdldF9kZXNjLT5jb21tb24uZmxhZ3MgJiBBT1BPQkpfU1RBVElDX1BPSU5URVIpKSkgewotCQkvKgotCQkgKiBTdHJpbmcgd2lsbCBmaXQgaW4gZXhpc3Rpbmcgbm9uLXN0YXRpYyBidWZmZXIuCi0JCSAqIENsZWFyIG9sZCBzdHJpbmcgYW5kIGNvcHkgaW4gdGhlIG5ldyBvbmUKLQkJICovCi0JCUFDUElfTUVNU0VUKHRhcmdldF9kZXNjLT5zdHJpbmcucG9pbnRlciwgMCwKLQkJCSAgICAoYWNwaV9zaXplKSB0YXJnZXRfZGVzYy0+c3RyaW5nLmxlbmd0aCArIDEpOwotCQlBQ1BJX01FTUNQWSh0YXJnZXRfZGVzYy0+c3RyaW5nLnBvaW50ZXIsIGJ1ZmZlciwgbGVuZ3RoKTsKLQl9IGVsc2UgewotCQkvKgotCQkgKiBGcmVlIHRoZSBjdXJyZW50IGJ1ZmZlciwgdGhlbiBhbGxvY2F0ZSBhIG5ldyBidWZmZXIKLQkJICogbGFyZ2UgZW5vdWdoIHRvIGhvbGQgdGhlIHZhbHVlCi0JCSAqLwotCQlpZiAodGFyZ2V0X2Rlc2MtPnN0cmluZy5wb2ludGVyICYmCi0JCSAgICAoISh0YXJnZXRfZGVzYy0+Y29tbW9uLmZsYWdzICYgQU9QT0JKX1NUQVRJQ19QT0lOVEVSKSkpIHsKLQotCQkJLyogT25seSBmcmVlIGlmIG5vdCBhIHBvaW50ZXIgaW50byB0aGUgRFNEVCAqLwotCi0JCQlBQ1BJX0ZSRUUodGFyZ2V0X2Rlc2MtPnN0cmluZy5wb2ludGVyKTsKLQkJfQotCi0JCXRhcmdldF9kZXNjLT5zdHJpbmcucG9pbnRlciA9IEFDUElfQUxMT0NBVEVfWkVST0VEKChhY3BpX3NpemUpCi0JCQkJCQkJCSAgIGxlbmd0aCArIDEpOwotCQlpZiAoIXRhcmdldF9kZXNjLT5zdHJpbmcucG9pbnRlcikgewotCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX01FTU9SWSk7Ci0JCX0KLQotCQl0YXJnZXRfZGVzYy0+Y29tbW9uLmZsYWdzICY9IH5BT1BPQkpfU1RBVElDX1BPSU5URVI7Ci0JCUFDUElfTUVNQ1BZKHRhcmdldF9kZXNjLT5zdHJpbmcucG9pbnRlciwgYnVmZmVyLCBsZW5ndGgpOwotCX0KLQotCS8qIFNldCB0aGUgbmV3IHRhcmdldCBsZW5ndGggKi8KLQotCXRhcmdldF9kZXNjLT5zdHJpbmcubGVuZ3RoID0gbGVuZ3RoOwotCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhzeXN0ZW0uYyBiL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leHN5c3RlbS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODk5MGYxLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leHN5c3RlbS5jCisrKyAvZGV2L251bGwKQEAgLTEsMzAyICswLDAgQEAKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIE1vZHVsZSBOYW1lOiBleHN5c3RlbSAtIEludGVyZmFjZSB0byBPUyBzZXJ2aWNlcwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDgsIEludGVsIENvcnAuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCi0gKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSBhdCBtaW5pbXVtIGEgZGlzY2xhaW1lcgotICogICAgc3Vic3RhbnRpYWxseSBzaW1pbGFyIHRvIHRoZSAiTk8gV0FSUkFOVFkiIGRpc2NsYWltZXIgYmVsb3cKLSAqICAgICgiRGlzY2xhaW1lciIpIGFuZCBhbnkgcmVkaXN0cmlidXRpb24gbXVzdCBiZSBjb25kaXRpb25lZCB1cG9uCi0gKiAgICBpbmNsdWRpbmcgYSBzdWJzdGFudGlhbGx5IHNpbWlsYXIgRGlzY2xhaW1lciByZXF1aXJlbWVudCBmb3IgZnVydGhlcgotICogICAgYmluYXJ5IHJlZGlzdHJpYnV0aW9uLgotICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzCi0gKiAgICBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIE5PIFdBUlJBTlRZCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKLSAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCi0gKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORwotICogSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCi0gKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCi0gKi8KLQotI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgotI2luY2x1ZGUgPGFjcGkvYWNpbnRlcnAuaD4KLQotI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfRVhFQ1VURVIKLUFDUElfTU9EVUxFX05BTUUoImV4c3lzdGVtIikKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9leF9zeXN0ZW1fd2FpdF9zZW1hcGhvcmUKLSAqCi0gKiBQQVJBTUVURVJTOiAgU2VtYXBob3JlICAgICAgIC0gU2VtYXBob3JlIHRvIHdhaXQgb24KLSAqICAgICAgICAgICAgICBUaW1lb3V0ICAgICAgICAgLSBNYXggdGltZSB0byB3YWl0Ci0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cwotICoKLSAqIERFU0NSSVBUSU9OOiBJbXBsZW1lbnRzIGEgc2VtYXBob3JlIHdhaXQgd2l0aCBhIGNoZWNrIHRvIHNlZSBpZiB0aGUKLSAqICAgICAgICAgICAgICBzZW1hcGhvcmUgaXMgYXZhaWxhYmxlIGltbWVkaWF0ZWx5LiAgSWYgaXQgaXMgbm90LCB0aGUKLSAqICAgICAgICAgICAgICBpbnRlcnByZXRlciBpcyByZWxlYXNlZCBiZWZvcmUgd2FpdGluZy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYWNwaV9zdGF0dXMgYWNwaV9leF9zeXN0ZW1fd2FpdF9zZW1hcGhvcmUoYWNwaV9zZW1hcGhvcmUgc2VtYXBob3JlLCB1MTYgdGltZW91dCkKLXsKLQlhY3BpX3N0YXR1cyBzdGF0dXM7Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGV4X3N5c3RlbV93YWl0X3NlbWFwaG9yZSk7Ci0KLQlzdGF0dXMgPSBhY3BpX29zX3dhaXRfc2VtYXBob3JlKHNlbWFwaG9yZSwgMSwgQUNQSV9ET19OT1RfV0FJVCk7Ci0JaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotCX0KLQotCWlmIChzdGF0dXMgPT0gQUVfVElNRSkgewotCi0JCS8qIFdlIG11c3Qgd2FpdCwgc28gdW5sb2NrIHRoZSBpbnRlcnByZXRlciAqLwotCi0JCWFjcGlfZXhfcmVsaW5xdWlzaF9pbnRlcnByZXRlcigpOwotCi0JCXN0YXR1cyA9IGFjcGlfb3Nfd2FpdF9zZW1hcGhvcmUoc2VtYXBob3JlLCAxLCB0aW1lb3V0KTsKLQotCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VYRUMsCi0JCQkJICAiKioqIFRocmVhZCBhd2FrZSBhZnRlciBibG9ja2luZywgJXNcbiIsCi0JCQkJICBhY3BpX2Zvcm1hdF9leGNlcHRpb24oc3RhdHVzKSkpOwotCi0JCS8qIFJlYWNxdWlyZSB0aGUgaW50ZXJwcmV0ZXIgKi8KLQotCQlhY3BpX2V4X3JlYWNxdWlyZV9pbnRlcnByZXRlcigpOwotCX0KLQotCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X3N5c3RlbV93YWl0X211dGV4Ci0gKgotICogUEFSQU1FVEVSUzogIE11dGV4ICAgICAgICAgICAtIE11dGV4IHRvIHdhaXQgb24KLSAqICAgICAgICAgICAgICBUaW1lb3V0ICAgICAgICAgLSBNYXggdGltZSB0byB3YWl0Ci0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cwotICoKLSAqIERFU0NSSVBUSU9OOiBJbXBsZW1lbnRzIGEgbXV0ZXggd2FpdCB3aXRoIGEgY2hlY2sgdG8gc2VlIGlmIHRoZQotICogICAgICAgICAgICAgIG11dGV4IGlzIGF2YWlsYWJsZSBpbW1lZGlhdGVseS4gIElmIGl0IGlzIG5vdCwgdGhlCi0gKiAgICAgICAgICAgICAgaW50ZXJwcmV0ZXIgaXMgcmVsZWFzZWQgYmVmb3JlIHdhaXRpbmcuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotYWNwaV9zdGF0dXMgYWNwaV9leF9zeXN0ZW1fd2FpdF9tdXRleChhY3BpX211dGV4IG11dGV4LCB1MTYgdGltZW91dCkKLXsKLQlhY3BpX3N0YXR1cyBzdGF0dXM7Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGV4X3N5c3RlbV93YWl0X211dGV4KTsKLQotCXN0YXR1cyA9IGFjcGlfb3NfYWNxdWlyZV9tdXRleChtdXRleCwgQUNQSV9ET19OT1RfV0FJVCk7Ci0JaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotCX0KLQotCWlmIChzdGF0dXMgPT0gQUVfVElNRSkgewotCi0JCS8qIFdlIG11c3Qgd2FpdCwgc28gdW5sb2NrIHRoZSBpbnRlcnByZXRlciAqLwotCi0JCWFjcGlfZXhfcmVsaW5xdWlzaF9pbnRlcnByZXRlcigpOwotCi0JCXN0YXR1cyA9IGFjcGlfb3NfYWNxdWlyZV9tdXRleChtdXRleCwgdGltZW91dCk7Ci0KLQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FWEVDLAotCQkJCSAgIioqKiBUaHJlYWQgYXdha2UgYWZ0ZXIgYmxvY2tpbmcsICVzXG4iLAotCQkJCSAgYWNwaV9mb3JtYXRfZXhjZXB0aW9uKHN0YXR1cykpKTsKLQotCQkvKiBSZWFjcXVpcmUgdGhlIGludGVycHJldGVyICovCi0KLQkJYWNwaV9leF9yZWFjcXVpcmVfaW50ZXJwcmV0ZXIoKTsKLQl9Ci0KLQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9leF9zeXN0ZW1fZG9fc3RhbGwKLSAqCi0gKiBQQVJBTUVURVJTOiAgaG93X2xvbmcgICAgICAgIC0gVGhlIGFtb3VudCBvZiB0aW1lIHRvIHN0YWxsLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIG1pY3Jvc2Vjb25kcwotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKLSAqCi0gKiBERVNDUklQVElPTjogU3VzcGVuZCBydW5uaW5nIHRocmVhZCBmb3Igc3BlY2lmaWVkIGFtb3VudCBvZiB0aW1lLgotICogICAgICAgICAgICAgIE5vdGU6IEFDUEkgc3BlY2lmaWNhdGlvbiByZXF1aXJlcyB0aGF0IFN0YWxsKCkgZG9lcyBub3QKLSAqICAgICAgICAgICAgICByZWxpbnF1aXNoIHRoZSBwcm9jZXNzb3IsIGFuZCBkZWxheXMgbG9uZ2VyIHRoYW4gMTAwIHVzZWMKLSAqICAgICAgICAgICAgICBzaG91bGQgdXNlIFNsZWVwKCkgaW5zdGVhZC4gIFdlIGFsbG93IHN0YWxscyB1cCB0byAyNTUgdXNlYwotICogICAgICAgICAgICAgIGZvciBjb21wYXRpYmlsaXR5IHdpdGggb3RoZXIgaW50ZXJwcmV0ZXJzIGFuZCBleGlzdGluZyBCSU9Tcy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1hY3BpX3N0YXR1cyBhY3BpX2V4X3N5c3RlbV9kb19zdGFsbCh1MzIgaG93X2xvbmcpCi17Ci0JYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7Ci0KLQlBQ1BJX0ZVTkNUSU9OX0VOVFJZKCk7Ci0KLQlpZiAoaG93X2xvbmcgPiAyNTUpIHsJLyogMjU1IG1pY3Jvc2Vjb25kcyAqLwotCQkvKgotCQkgKiBMb25nZXIgdGhhbiAyNTUgdXNlYywgdGhpcyBpcyBhbiBlcnJvcgotCQkgKgotCQkgKiAoQUNQSSBzcGVjaWZpZXMgMTAwIHVzZWMgYXMgbWF4LCBidXQgdGhpcyBnaXZlcyBzb21lIHNsYWNrIGluCi0JCSAqIG9yZGVyIHRvIHN1cHBvcnQgZXhpc3RpbmcgQklPU3MpCi0JCSAqLwotCQlBQ1BJX0VSUk9SKChBRV9JTkZPLCAiVGltZSBwYXJhbWV0ZXIgaXMgdG9vIGxhcmdlICglZCkiLAotCQkJICAgIGhvd19sb25nKSk7Ci0JCXN0YXR1cyA9IEFFX0FNTF9PUEVSQU5EX1ZBTFVFOwotCX0gZWxzZSB7Ci0JCWFjcGlfb3Nfc3RhbGwoaG93X2xvbmcpOwotCX0KLQotCXJldHVybiAoc3RhdHVzKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9leF9zeXN0ZW1fZG9fc3VzcGVuZAotICoKLSAqIFBBUkFNRVRFUlM6ICBob3dfbG9uZyAgICAgICAgLSBUaGUgYW1vdW50IG9mIHRpbWUgdG8gc3VzcGVuZCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBtaWxsaXNlY29uZHMKLSAqCi0gKiBSRVRVUk46ICAgICAgTm9uZQotICoKLSAqIERFU0NSSVBUSU9OOiBTdXNwZW5kIHJ1bm5pbmcgdGhyZWFkIGZvciBzcGVjaWZpZWQgYW1vdW50IG9mIHRpbWUuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotYWNwaV9zdGF0dXMgYWNwaV9leF9zeXN0ZW1fZG9fc3VzcGVuZChhY3BpX2ludGVnZXIgaG93X2xvbmcpCi17Ci0JQUNQSV9GVU5DVElPTl9FTlRSWSgpOwotCi0JLyogU2luY2UgdGhpcyB0aHJlYWQgd2lsbCBzbGVlcCwgd2UgbXVzdCByZWxlYXNlIHRoZSBpbnRlcnByZXRlciAqLwotCi0JYWNwaV9leF9yZWxpbnF1aXNoX2ludGVycHJldGVyKCk7Ci0KLQlhY3BpX29zX3NsZWVwKGhvd19sb25nKTsKLQotCS8qIEFuZCBub3cgd2UgbXVzdCBnZXQgdGhlIGludGVycHJldGVyIGFnYWluICovCi0KLQlhY3BpX2V4X3JlYWNxdWlyZV9pbnRlcnByZXRlcigpOwotCXJldHVybiAoQUVfT0spOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X3N5c3RlbV9zaWduYWxfZXZlbnQKLSAqCi0gKiBQQVJBTUVURVJTOiAgb2JqX2Rlc2MgICAgICAgIC0gVGhlIG9iamVjdCBkZXNjcmlwdG9yIGZvciB0aGlzIG9wCi0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cwotICoKLSAqIERFU0NSSVBUSU9OOiBQcm92aWRlcyBhbiBhY2Nlc3MgcG9pbnQgdG8gcGVyZm9ybSBzeW5jaHJvbml6YXRpb24gb3BlcmF0aW9ucwotICogICAgICAgICAgICAgIHdpdGhpbiB0aGUgQU1MLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWFjcGlfc3RhdHVzIGFjcGlfZXhfc3lzdGVtX3NpZ25hbF9ldmVudCh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICogb2JqX2Rlc2MpCi17Ci0JYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGV4X3N5c3RlbV9zaWduYWxfZXZlbnQpOwotCi0JaWYgKG9ial9kZXNjKSB7Ci0JCXN0YXR1cyA9Ci0JCSAgICBhY3BpX29zX3NpZ25hbF9zZW1hcGhvcmUob2JqX2Rlc2MtPmV2ZW50Lm9zX3NlbWFwaG9yZSwgMSk7Ci0JfQotCi0JcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfZXhfc3lzdGVtX3dhaXRfZXZlbnQKLSAqCi0gKiBQQVJBTUVURVJTOiAgdGltZV9kZXNjICAgICAgIC0gVGhlICd0aW1lIHRvIGRlbGF5JyBvYmplY3QgZGVzY3JpcHRvcgotICogICAgICAgICAgICAgIG9ial9kZXNjICAgICAgICAtIFRoZSBvYmplY3QgZGVzY3JpcHRvciBmb3IgdGhpcyBvcAotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKLSAqCi0gKiBERVNDUklQVElPTjogUHJvdmlkZXMgYW4gYWNjZXNzIHBvaW50IHRvIHBlcmZvcm0gc3luY2hyb25pemF0aW9uIG9wZXJhdGlvbnMKLSAqICAgICAgICAgICAgICB3aXRoaW4gdGhlIEFNTC4gIFRoaXMgb3BlcmF0aW9uIGlzIGEgcmVxdWVzdCB0byB3YWl0IGZvciBhbgotICogICAgICAgICAgICAgIGV2ZW50LgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWFjcGlfc3RhdHVzCi1hY3BpX2V4X3N5c3RlbV93YWl0X2V2ZW50KHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnRpbWVfZGVzYywKLQkJCSAgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2MpCi17Ci0JYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGV4X3N5c3RlbV93YWl0X2V2ZW50KTsKLQotCWlmIChvYmpfZGVzYykgewotCQlzdGF0dXMgPQotCQkgICAgYWNwaV9leF9zeXN0ZW1fd2FpdF9zZW1hcGhvcmUob2JqX2Rlc2MtPmV2ZW50Lm9zX3NlbWFwaG9yZSwKLQkJCQkJCSAgKHUxNikgdGltZV9kZXNjLT5pbnRlZ2VyLgotCQkJCQkJICB2YWx1ZSk7Ci0JfQotCi0JcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfZXhfc3lzdGVtX3Jlc2V0X2V2ZW50Ci0gKgotICogUEFSQU1FVEVSUzogIG9ial9kZXNjICAgICAgICAtIFRoZSBvYmplY3QgZGVzY3JpcHRvciBmb3IgdGhpcyBvcAotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKLSAqCi0gKiBERVNDUklQVElPTjogUmVzZXQgYW4gZXZlbnQgdG8gYSBrbm93biBzdGF0ZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1hY3BpX3N0YXR1cyBhY3BpX2V4X3N5c3RlbV9yZXNldF9ldmVudCh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYykKLXsKLQlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKLQlhY3BpX3NlbWFwaG9yZSB0ZW1wX3NlbWFwaG9yZTsKLQotCUFDUElfRlVOQ1RJT05fRU5UUlkoKTsKLQotCS8qCi0JICogV2UgYXJlIGdvaW5nIHRvIHNpbXBseSBkZWxldGUgdGhlIGV4aXN0aW5nIHNlbWFwaG9yZSBhbmQKLQkgKiBjcmVhdGUgYSBuZXcgb25lIQotCSAqLwotCXN0YXR1cyA9Ci0JICAgIGFjcGlfb3NfY3JlYXRlX3NlbWFwaG9yZShBQ1BJX05PX1VOSVRfTElNSVQsIDAsICZ0ZW1wX3NlbWFwaG9yZSk7Ci0JaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKSB7Ci0JCSh2b2lkKWFjcGlfb3NfZGVsZXRlX3NlbWFwaG9yZShvYmpfZGVzYy0+ZXZlbnQub3Nfc2VtYXBob3JlKTsKLQkJb2JqX2Rlc2MtPmV2ZW50Lm9zX3NlbWFwaG9yZSA9IHRlbXBfc2VtYXBob3JlOwotCX0KLQotCXJldHVybiAoc3RhdHVzKTsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leHV0aWxzLmMgYi9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXh1dGlscy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NmMwMzg4Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leHV0aWxzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MjAgKzAsMCBAQAotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogTW9kdWxlIE5hbWU6IGV4dXRpbHMgLSBpbnRlcnByZXRlci9zY2FubmVyIHV0aWxpdGllcwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDgsIEludGVsIENvcnAuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCi0gKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSBhdCBtaW5pbXVtIGEgZGlzY2xhaW1lcgotICogICAgc3Vic3RhbnRpYWxseSBzaW1pbGFyIHRvIHRoZSAiTk8gV0FSUkFOVFkiIGRpc2NsYWltZXIgYmVsb3cKLSAqICAgICgiRGlzY2xhaW1lciIpIGFuZCBhbnkgcmVkaXN0cmlidXRpb24gbXVzdCBiZSBjb25kaXRpb25lZCB1cG9uCi0gKiAgICBpbmNsdWRpbmcgYSBzdWJzdGFudGlhbGx5IHNpbWlsYXIgRGlzY2xhaW1lciByZXF1aXJlbWVudCBmb3IgZnVydGhlcgotICogICAgYmluYXJ5IHJlZGlzdHJpYnV0aW9uLgotICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzCi0gKiAgICBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIE5PIFdBUlJBTlRZCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKLSAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCi0gKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORwotICogSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCi0gKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCi0gKi8KLQotLyoKLSAqIERFRklORV9BTUxfR0xPQkFMUyBpcyB0ZXN0ZWQgaW4gYW1sY29kZS5oCi0gKiB0byBkZXRlcm1pbmUgd2hldGhlciBjZXJ0YWluIGdsb2JhbCBuYW1lcyBzaG91bGQgYmUgImRlZmluZWQiIG9yIG9ubHkKLSAqICJkZWNsYXJlZCIgaW4gdGhlIGN1cnJlbnQgY29tcGlsYXRpb24uICBUaGlzIGVuaGFuY2VzIG1haW50YWluYWJpbGl0eQotICogYnkgZW5hYmxpbmcgYSBzaW5nbGUgaGVhZGVyIGZpbGUgdG8gZW1ib2R5IGFsbCBrbm93bGVkZ2Ugb2YgdGhlIG5hbWVzCi0gKiBpbiBxdWVzdGlvbi4KLSAqCi0gKiBFeGFjdGx5IG9uZSBtb2R1bGUgb2YgYW55IGV4ZWN1dGFibGUgc2hvdWxkICNkZWZpbmUgREVGSU5FX0dMT0JBTFMKLSAqIGJlZm9yZSAjaW5jbHVkaW5nIHRoZSBoZWFkZXIgZmlsZXMgd2hpY2ggdXNlIHRoaXMgY29udmVudGlvbi4gIFRoZQotICogbmFtZXMgaW4gcXVlc3Rpb24gd2lsbCBiZSBkZWZpbmVkIGFuZCBpbml0aWFsaXplZCBpbiB0aGF0IG1vZHVsZSwKLSAqIGFuZCBkZWNsYXJlZCBhcyBleHRlcm4gaW4gYWxsIG90aGVyIG1vZHVsZXMgd2hpY2ggI2luY2x1ZGUgdGhvc2UKLSAqIGhlYWRlciBmaWxlcy4KLSAqLwotCi0jZGVmaW5lIERFRklORV9BTUxfR0xPQkFMUwotCi0jaW5jbHVkZSA8YWNwaS9hY3BpLmg+Ci0jaW5jbHVkZSA8YWNwaS9hY2ludGVycC5oPgotI2luY2x1ZGUgPGFjcGkvYW1sY29kZS5oPgotCi0jZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9FWEVDVVRFUgotQUNQSV9NT0RVTEVfTkFNRSgiZXh1dGlscyIpCi0KLS8qIExvY2FsIHByb3RvdHlwZXMgKi8KLXN0YXRpYyB1MzIgYWNwaV9leF9kaWdpdHNfbmVlZGVkKGFjcGlfaW50ZWdlciB2YWx1ZSwgdTMyIGJhc2UpOwotCi0jaWZuZGVmIEFDUElfTk9fTUVUSE9EX0VYRUNVVElPTgotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9leF9lbnRlcl9pbnRlcnByZXRlcgotICoKLSAqIFBBUkFNRVRFUlM6ICBOb25lCi0gKgotICogUkVUVVJOOiAgICAgIE5vbmUKLSAqCi0gKiBERVNDUklQVElPTjogRW50ZXIgdGhlIGludGVycHJldGVyIGV4ZWN1dGlvbiByZWdpb24uIEZhaWx1cmUgdG8gZW50ZXIKLSAqICAgICAgICAgICAgICB0aGUgaW50ZXJwcmV0ZXIgcmVnaW9uIGlzIGEgZmF0YWwgc3lzdGVtIGVycm9yLiBVc2VkIGluCi0gKiAgICAgICAgICAgICAgY29uanVuY3Rpb24gd2l0aCBleGl0X2ludGVycHJldGVyLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXZvaWQgYWNwaV9leF9lbnRlcl9pbnRlcnByZXRlcih2b2lkKQotewotCWFjcGlfc3RhdHVzIHN0YXR1czsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UoZXhfZW50ZXJfaW50ZXJwcmV0ZXIpOwotCi0Jc3RhdHVzID0gYWNwaV91dF9hY3F1aXJlX211dGV4KEFDUElfTVRYX0lOVEVSUFJFVEVSKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJQUNQSV9FUlJPUigoQUVfSU5GTywKLQkJCSAgICAiQ291bGQgbm90IGFjcXVpcmUgQU1MIEludGVycHJldGVyIG11dGV4IikpOwotCX0KLQotCXJldHVybl9WT0lEOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X3JlYWNxdWlyZV9pbnRlcnByZXRlcgotICoKLSAqIFBBUkFNRVRFUlM6ICBOb25lCi0gKgotICogUkVUVVJOOiAgICAgIE5vbmUKLSAqCi0gKiBERVNDUklQVElPTjogUmVhY3F1aXJlIHRoZSBpbnRlcnByZXRlciBleGVjdXRpb24gcmVnaW9uIGZyb20gd2l0aGluIHRoZQotICogICAgICAgICAgICAgIGludGVycHJldGVyIGNvZGUuIEZhaWx1cmUgdG8gZW50ZXIgdGhlIGludGVycHJldGVyIHJlZ2lvbiBpcyBhCi0gKiAgICAgICAgICAgICAgZmF0YWwgc3lzdGVtIGVycm9yLiBVc2VkIGluICBjb25qdWN0aW9uIHdpdGgKLSAqICAgICAgICAgICAgICByZWxpbnF1aXNoX2ludGVycHJldGVyCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdm9pZCBhY3BpX2V4X3JlYWNxdWlyZV9pbnRlcnByZXRlcih2b2lkKQotewotCUFDUElfRlVOQ1RJT05fVFJBQ0UoZXhfcmVhY3F1aXJlX2ludGVycHJldGVyKTsKLQotCS8qCi0JICogSWYgdGhlIGdsb2JhbCBzZXJpYWxpemVkIGZsYWcgaXMgc2V0LCBkbyBub3QgcmVsZWFzZSB0aGUgaW50ZXJwcmV0ZXIsCi0JICogc2luY2UgaXQgd2FzIG5vdCBhY3R1YWxseSByZWxlYXNlZCBieSBhY3BpX2V4X3JlbGlucXVpc2hfaW50ZXJwcmV0ZXIuCi0JICogVGhpcyBmb3JjZXMgdGhlIGludGVycHJldGVyIHRvIGJlIHNpbmdsZSB0aHJlYWRlZC4KLQkgKi8KLQlpZiAoIWFjcGlfZ2JsX2FsbF9tZXRob2RzX3NlcmlhbGl6ZWQpIHsKLQkJYWNwaV9leF9lbnRlcl9pbnRlcnByZXRlcigpOwotCX0KLQotCXJldHVybl9WT0lEOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X2V4aXRfaW50ZXJwcmV0ZXIKLSAqCi0gKiBQQVJBTUVURVJTOiAgTm9uZQotICoKLSAqIFJFVFVSTjogICAgICBOb25lCi0gKgotICogREVTQ1JJUFRJT046IEV4aXQgdGhlIGludGVycHJldGVyIGV4ZWN1dGlvbiByZWdpb24uIFRoaXMgaXMgdGhlIHRvcCBsZXZlbAotICogICAgICAgICAgICAgIHJvdXRpbmUgdXNlZCB0byBleGl0IHRoZSBpbnRlcnByZXRlciB3aGVuIGFsbCBwcm9jZXNzaW5nIGhhcwotICogICAgICAgICAgICAgIGJlZW4gY29tcGxldGVkLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXZvaWQgYWNwaV9leF9leGl0X2ludGVycHJldGVyKHZvaWQpCi17Ci0JYWNwaV9zdGF0dXMgc3RhdHVzOwotCi0JQUNQSV9GVU5DVElPTl9UUkFDRShleF9leGl0X2ludGVycHJldGVyKTsKLQotCXN0YXR1cyA9IGFjcGlfdXRfcmVsZWFzZV9tdXRleChBQ1BJX01UWF9JTlRFUlBSRVRFUik7Ci0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCUFDUElfRVJST1IoKEFFX0lORk8sCi0JCQkgICAgIkNvdWxkIG5vdCByZWxlYXNlIEFNTCBJbnRlcnByZXRlciBtdXRleCIpKTsKLQl9Ci0KLQlyZXR1cm5fVk9JRDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9leF9yZWxpbnF1aXNoX2ludGVycHJldGVyCi0gKgotICogUEFSQU1FVEVSUzogIE5vbmUKLSAqCi0gKiBSRVRVUk46ICAgICAgTm9uZQotICoKLSAqIERFU0NSSVBUSU9OOiBFeGl0IHRoZSBpbnRlcnByZXRlciBleGVjdXRpb24gcmVnaW9uLCBmcm9tIHdpdGhpbiB0aGUKLSAqICAgICAgICAgICAgICBpbnRlcnByZXRlciAtIGJlZm9yZSBhdHRlbXB0aW5nIGFuIG9wZXJhdGlvbiB0aGF0IHdpbGwgcG9zc2libHkKLSAqICAgICAgICAgICAgICBibG9jayB0aGUgcnVubmluZyB0aHJlYWQuCi0gKgotICogQ2FzZXMgd2hlcmUgdGhlIGludGVycHJldGVyIGlzIHVubG9ja2VkIGludGVybmFsbHkKLSAqICAgICAgMSkgTWV0aG9kIHRvIGJlIGJsb2NrZWQgb24gYSBTbGVlcCgpIEFNTCBvcGNvZGUKLSAqICAgICAgMikgTWV0aG9kIHRvIGJlIGJsb2NrZWQgb24gYW4gQWNxdWlyZSgpIEFNTCBvcGNvZGUKLSAqICAgICAgMykgTWV0aG9kIHRvIGJlIGJsb2NrZWQgb24gYSBXYWl0KCkgQU1MIG9wY29kZQotICogICAgICA0KSBNZXRob2QgdG8gYmUgYmxvY2tlZCB0byBhY3F1aXJlIHRoZSBnbG9iYWwgbG9jawotICogICAgICA1KSBNZXRob2QgdG8gYmUgYmxvY2tlZCB3YWl0aW5nIHRvIGV4ZWN1dGUgYSBzZXJpYWxpemVkIGNvbnRyb2wgbWV0aG9kCi0gKiAgICAgICAgICB0aGF0IGlzIGN1cnJlbnRseSBleGVjdXRpbmcKLSAqICAgICAgNikgQWJvdXQgdG8gaW52b2tlIGEgdXNlci1pbnN0YWxsZWQgb3ByZWdpb24gaGFuZGxlcgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXZvaWQgYWNwaV9leF9yZWxpbnF1aXNoX2ludGVycHJldGVyKHZvaWQpCi17Ci0JQUNQSV9GVU5DVElPTl9UUkFDRShleF9yZWxpbnF1aXNoX2ludGVycHJldGVyKTsKLQotCS8qCi0JICogSWYgdGhlIGdsb2JhbCBzZXJpYWxpemVkIGZsYWcgaXMgc2V0LCBkbyBub3QgcmVsZWFzZSB0aGUgaW50ZXJwcmV0ZXIuCi0JICogVGhpcyBmb3JjZXMgdGhlIGludGVycHJldGVyIHRvIGJlIHNpbmdsZSB0aHJlYWRlZC4KLQkgKi8KLQlpZiAoIWFjcGlfZ2JsX2FsbF9tZXRob2RzX3NlcmlhbGl6ZWQpIHsKLQkJYWNwaV9leF9leGl0X2ludGVycHJldGVyKCk7Ci0JfQotCi0JcmV0dXJuX1ZPSUQ7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfZXhfdHJ1bmNhdGVfZm9yMzJiaXRfdGFibGUKLSAqCi0gKiBQQVJBTUVURVJTOiAgb2JqX2Rlc2MgICAgICAgIC0gT2JqZWN0IHRvIGJlIHRydW5jYXRlZAotICoKLSAqIFJFVFVSTjogICAgICBub25lCi0gKgotICogREVTQ1JJUFRJT046IFRydW5jYXRlIGFuIEFDUEkgSW50ZWdlciB0byAzMiBiaXRzIGlmIHRoZSBleGVjdXRpb24gbW9kZSBpcwotICogICAgICAgICAgICAgIDMyLWJpdCwgYXMgZGV0ZXJtaW5lZCBieSB0aGUgcmV2aXNpb24gb2YgdGhlIERTRFQuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdm9pZCBhY3BpX2V4X3RydW5jYXRlX2ZvcjMyYml0X3RhYmxlKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjKQotewotCi0JQUNQSV9GVU5DVElPTl9FTlRSWSgpOwotCi0JLyoKLQkgKiBPYmplY3QgbXVzdCBiZSBhIHZhbGlkIG51bWJlciBhbmQgd2UgbXVzdCBiZSBleGVjdXRpbmcKLQkgKiBhIGNvbnRyb2wgbWV0aG9kLiBOUyBub2RlIGNvdWxkIGJlIHRoZXJlIGZvciBBTUxfSU5UX05BTUVQQVRIX09QLgotCSAqLwotCWlmICgoIW9ial9kZXNjKSB8fAotCSAgICAoQUNQSV9HRVRfREVTQ1JJUFRPUl9UWVBFKG9ial9kZXNjKSAhPSBBQ1BJX0RFU0NfVFlQRV9PUEVSQU5EKSB8fAotCSAgICAoQUNQSV9HRVRfT0JKRUNUX1RZUEUob2JqX2Rlc2MpICE9IEFDUElfVFlQRV9JTlRFR0VSKSkgewotCQlyZXR1cm47Ci0JfQotCi0JaWYgKGFjcGlfZ2JsX2ludGVnZXJfYnl0ZV93aWR0aCA9PSA0KSB7Ci0JCS8qCi0JCSAqIFdlIGFyZSBydW5uaW5nIGEgbWV0aG9kIHRoYXQgZXhpc3RzIGluIGEgMzItYml0IEFDUEkgdGFibGUuCi0JCSAqIFRydW5jYXRlIHRoZSB2YWx1ZSB0byAzMiBiaXRzIGJ5IHplcm9pbmcgb3V0IHRoZSB1cHBlciAzMi1iaXQgZmllbGQKLQkJICovCi0JCW9ial9kZXNjLT5pbnRlZ2VyLnZhbHVlICY9IChhY3BpX2ludGVnZXIpIEFDUElfVUlOVDMyX01BWDsKLQl9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfZXhfYWNxdWlyZV9nbG9iYWxfbG9jawotICoKLSAqIFBBUkFNRVRFUlM6ICBmaWVsZF9mbGFncyAgICAgICAgICAgLSBGbGFncyB3aXRoIExvY2sgcnVsZToKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHdheXNfbG9jayBvciBuZXZlcl9sb2NrCi0gKgotICogUkVUVVJOOiAgICAgIE5vbmUKLSAqCi0gKiBERVNDUklQVElPTjogT2J0YWluIHRoZSBBQ1BJIGhhcmR3YXJlIEdsb2JhbCBMb2NrLCBvbmx5IGlmIHRoZSBmaWVsZAotICogICAgICAgICAgICAgIGZsYWdzIHNwZWNpZml5IHRoYXQgaXQgaXMgdG8gYmUgb2J0YWluZWQgYmVmb3JlIGZpZWxkIGFjY2Vzcy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi12b2lkIGFjcGlfZXhfYWNxdWlyZV9nbG9iYWxfbG9jayh1MzIgZmllbGRfZmxhZ3MpCi17Ci0JYWNwaV9zdGF0dXMgc3RhdHVzOwotCi0JQUNQSV9GVU5DVElPTl9UUkFDRShleF9hY3F1aXJlX2dsb2JhbF9sb2NrKTsKLQotCS8qIE9ubHkgdXNlIHRoZSBsb2NrIGlmIHRoZSBhbHdheXNfbG9jayBiaXQgaXMgc2V0ICovCi0KLQlpZiAoIShmaWVsZF9mbGFncyAmIEFNTF9GSUVMRF9MT0NLX1JVTEVfTUFTSykpIHsKLQkJcmV0dXJuX1ZPSUQ7Ci0JfQotCi0JLyogQXR0ZW1wdCB0byBnZXQgdGhlIGdsb2JhbCBsb2NrLCB3YWl0IGZvcmV2ZXIgKi8KLQotCXN0YXR1cyA9IGFjcGlfZXhfYWNxdWlyZV9tdXRleF9vYmplY3QoQUNQSV9XQUlUX0ZPUkVWRVIsCi0JCQkJCSAgICAgIGFjcGlfZ2JsX2dsb2JhbF9sb2NrX211dGV4LAotCQkJCQkgICAgICBhY3BpX29zX2dldF90aHJlYWRfaWQoKSk7Ci0KLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJQUNQSV9FWENFUFRJT04oKEFFX0lORk8sIHN0YXR1cywKLQkJCQkiQ291bGQgbm90IGFjcXVpcmUgR2xvYmFsIExvY2siKSk7Ci0JfQotCi0JcmV0dXJuX1ZPSUQ7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfZXhfcmVsZWFzZV9nbG9iYWxfbG9jawotICoKLSAqIFBBUkFNRVRFUlM6ICBmaWVsZF9mbGFncyAgICAgICAgICAgLSBGbGFncyB3aXRoIExvY2sgcnVsZToKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHdheXNfbG9jayBvciBuZXZlcl9sb2NrCi0gKgotICogUkVUVVJOOiAgICAgIE5vbmUKLSAqCi0gKiBERVNDUklQVElPTjogUmVsZWFzZSB0aGUgQUNQSSBoYXJkd2FyZSBHbG9iYWwgTG9jawotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXZvaWQgYWNwaV9leF9yZWxlYXNlX2dsb2JhbF9sb2NrKHUzMiBmaWVsZF9mbGFncykKLXsKLQlhY3BpX3N0YXR1cyBzdGF0dXM7Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGV4X3JlbGVhc2VfZ2xvYmFsX2xvY2spOwotCi0JLyogT25seSB1c2UgdGhlIGxvY2sgaWYgdGhlIGFsd2F5c19sb2NrIGJpdCBpcyBzZXQgKi8KLQotCWlmICghKGZpZWxkX2ZsYWdzICYgQU1MX0ZJRUxEX0xPQ0tfUlVMRV9NQVNLKSkgewotCQlyZXR1cm5fVk9JRDsKLQl9Ci0KLQkvKiBSZWxlYXNlIHRoZSBnbG9iYWwgbG9jayAqLwotCi0Jc3RhdHVzID0gYWNwaV9leF9yZWxlYXNlX211dGV4X29iamVjdChhY3BpX2dibF9nbG9iYWxfbG9ja19tdXRleCk7Ci0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0KLQkJLyogUmVwb3J0IHRoZSBlcnJvciwgYnV0IHRoZXJlIGlzbid0IG11Y2ggZWxzZSB3ZSBjYW4gZG8gKi8KLQotCQlBQ1BJX0VYQ0VQVElPTigoQUVfSU5GTywgc3RhdHVzLAotCQkJCSJDb3VsZCBub3QgcmVsZWFzZSBHbG9iYWwgTG9jayIpKTsKLQl9Ci0KLQlyZXR1cm5fVk9JRDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9leF9kaWdpdHNfbmVlZGVkCi0gKgotICogUEFSQU1FVEVSUzogIFZhbHVlICAgICAgICAgICAtIFZhbHVlIHRvIGJlIHJlcHJlc2VudGVkCi0gKiAgICAgICAgICAgICAgQmFzZSAgICAgICAgICAgIC0gQmFzZSBvZiByZXByZXNlbnRhdGlvbgotICoKLSAqIFJFVFVSTjogICAgICBUaGUgbnVtYmVyIG9mIGRpZ2l0cy4KLSAqCi0gKiBERVNDUklQVElPTjogQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgZGlnaXRzIG5lZWRlZCB0byByZXByZXNlbnQgdGhlIFZhbHVlCi0gKiAgICAgICAgICAgICAgaW4gdGhlIGdpdmVuIEJhc2UgKFJhZGl4KQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyB1MzIgYWNwaV9leF9kaWdpdHNfbmVlZGVkKGFjcGlfaW50ZWdlciB2YWx1ZSwgdTMyIGJhc2UpCi17Ci0JdTMyIG51bV9kaWdpdHM7Ci0JYWNwaV9pbnRlZ2VyIGN1cnJlbnRfdmFsdWU7Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGV4X2RpZ2l0c19uZWVkZWQpOwotCi0JLyogYWNwaV9pbnRlZ2VyIGlzIHVuc2lnbmVkLCBzbyB3ZSBkb24ndCB3b3JyeSBhYm91dCBhICctJyBwcmVmaXggKi8KLQotCWlmICh2YWx1ZSA9PSAwKSB7Ci0JCXJldHVybl9VSU5UMzIoMSk7Ci0JfQotCi0JY3VycmVudF92YWx1ZSA9IHZhbHVlOwotCW51bV9kaWdpdHMgPSAwOwotCi0JLyogQ291bnQgdGhlIGRpZ2l0cyBpbiB0aGUgcmVxdWVzdGVkIGJhc2UgKi8KLQotCXdoaWxlIChjdXJyZW50X3ZhbHVlKSB7Ci0JCSh2b2lkKWFjcGlfdXRfc2hvcnRfZGl2aWRlKGN1cnJlbnRfdmFsdWUsIGJhc2UsICZjdXJyZW50X3ZhbHVlLAotCQkJCQkgICBOVUxMKTsKLQkJbnVtX2RpZ2l0cysrOwotCX0KLQotCXJldHVybl9VSU5UMzIobnVtX2RpZ2l0cyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfZXhfZWlzYV9pZF90b19zdHJpbmcKLSAqCi0gKiBQQVJBTUVURVJTOiAgbnVtZXJpY19pZCAgICAgIC0gRUlTQSBJRCB0byBiZSBjb252ZXJ0ZWQKLSAqICAgICAgICAgICAgICBvdXRfc3RyaW5nICAgICAgLSBXaGVyZSB0byBwdXQgdGhlIGNvbnZlcnRlZCBzdHJpbmcgKDggYnl0ZXMpCi0gKgotICogUkVUVVJOOiAgICAgIE5vbmUKLSAqCi0gKiBERVNDUklQVElPTjogQ29udmVydCBhIG51bWVyaWMgRUlTQSBJRCB0byBzdHJpbmcgcmVwcmVzZW50YXRpb24KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi12b2lkIGFjcGlfZXhfZWlzYV9pZF90b19zdHJpbmcodTMyIG51bWVyaWNfaWQsIGNoYXIgKm91dF9zdHJpbmcpCi17Ci0JdTMyIGVpc2FfaWQ7Ci0KLQlBQ1BJX0ZVTkNUSU9OX0VOVFJZKCk7Ci0KLQkvKiBTd2FwIElEIHRvIGJpZy1lbmRpYW4gdG8gZ2V0IGNvbnRpZ3VvdXMgYml0cyAqLwotCi0JZWlzYV9pZCA9IGFjcGlfdXRfZHdvcmRfYnl0ZV9zd2FwKG51bWVyaWNfaWQpOwotCi0Jb3V0X3N0cmluZ1swXSA9IChjaGFyKSgnQCcgKyAoKCh1bnNpZ25lZCBsb25nKWVpc2FfaWQgPj4gMjYpICYgMHgxZikpOwotCW91dF9zdHJpbmdbMV0gPSAoY2hhcikoJ0AnICsgKChlaXNhX2lkID4+IDIxKSAmIDB4MWYpKTsKLQlvdXRfc3RyaW5nWzJdID0gKGNoYXIpKCdAJyArICgoZWlzYV9pZCA+PiAxNikgJiAweDFmKSk7Ci0Jb3V0X3N0cmluZ1szXSA9IGFjcGlfdXRfaGV4X3RvX2FzY2lpX2NoYXIoKGFjcGlfaW50ZWdlcikgZWlzYV9pZCwgMTIpOwotCW91dF9zdHJpbmdbNF0gPSBhY3BpX3V0X2hleF90b19hc2NpaV9jaGFyKChhY3BpX2ludGVnZXIpIGVpc2FfaWQsIDgpOwotCW91dF9zdHJpbmdbNV0gPSBhY3BpX3V0X2hleF90b19hc2NpaV9jaGFyKChhY3BpX2ludGVnZXIpIGVpc2FfaWQsIDQpOwotCW91dF9zdHJpbmdbNl0gPSBhY3BpX3V0X2hleF90b19hc2NpaV9jaGFyKChhY3BpX2ludGVnZXIpIGVpc2FfaWQsIDApOwotCW91dF9zdHJpbmdbN10gPSAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X3Vuc2lnbmVkX2ludGVnZXJfdG9fc3RyaW5nCi0gKgotICogUEFSQU1FVEVSUzogIFZhbHVlICAgICAgICAgICAtIFZhbHVlIHRvIGJlIGNvbnZlcnRlZAotICogICAgICAgICAgICAgIG91dF9zdHJpbmcgICAgICAtIFdoZXJlIHRvIHB1dCB0aGUgY29udmVydGVkIHN0cmluZyAoOCBieXRlcykKLSAqCi0gKiBSRVRVUk46ICAgICAgTm9uZSwgc3RyaW5nCi0gKgotICogREVTQ1JJUFRJT046IENvbnZlcnQgYSBudW1iZXIgdG8gc3RyaW5nIHJlcHJlc2VudGF0aW9uLiBBc3N1bWVzIHN0cmluZwotICogICAgICAgICAgICAgIGJ1ZmZlciBpcyBsYXJnZSBlbm91Z2ggdG8gaG9sZCB0aGUgc3RyaW5nLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXZvaWQgYWNwaV9leF91bnNpZ25lZF9pbnRlZ2VyX3RvX3N0cmluZyhhY3BpX2ludGVnZXIgdmFsdWUsIGNoYXIgKm91dF9zdHJpbmcpCi17Ci0JdTMyIGNvdW50OwotCXUzMiBkaWdpdHNfbmVlZGVkOwotCXUzMiByZW1haW5kZXI7Ci0KLQlBQ1BJX0ZVTkNUSU9OX0VOVFJZKCk7Ci0KLQlkaWdpdHNfbmVlZGVkID0gYWNwaV9leF9kaWdpdHNfbmVlZGVkKHZhbHVlLCAxMCk7Ci0Jb3V0X3N0cmluZ1tkaWdpdHNfbmVlZGVkXSA9IDA7Ci0KLQlmb3IgKGNvdW50ID0gZGlnaXRzX25lZWRlZDsgY291bnQgPiAwOyBjb3VudC0tKSB7Ci0JCSh2b2lkKWFjcGlfdXRfc2hvcnRfZGl2aWRlKHZhbHVlLCAxMCwgJnZhbHVlLCAmcmVtYWluZGVyKTsKLQkJb3V0X3N0cmluZ1tjb3VudCAtIDFdID0gKGNoYXIpKCcwJyArIHJlbWFpbmRlcik7Ci0JfQotfQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9oYXJkd2FyZS9NYWtlZmlsZSBiL2RyaXZlcnMvYWNwaS9oYXJkd2FyZS9NYWtlZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDM4YWQzNzMuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9hY3BpL2hhcmR3YXJlL01ha2VmaWxlCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi0jCi0jIE1ha2VmaWxlIGZvciBhbGwgTGludXggQUNQSSBpbnRlcnByZXRlciBzdWJkaXJlY3RvcmllcwotIwotCi1vYmoteSA6PSBod2FjcGkubyAgaHdncGUubyAgaHdyZWdzLm8gIGh3c2xlZXAubwotCi1vYmotJChBQ1BJX0ZVVFVSRV9VU0FHRSkgKz0gaHd0aW1lci5vCi0KLUVYVFJBX0NGTEFHUyArPSAkKEFDUElfQ0ZMQUdTKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2hhcmR3YXJlL2h3YWNwaS5jIGIvZHJpdmVycy9hY3BpL2hhcmR3YXJlL2h3YWNwaS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTY4OTRlLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvYWNwaS9oYXJkd2FyZS9od2FjcGkuYworKysgL2Rldi9udWxsCkBAIC0xLDE4NCArMCwwIEBACi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBNb2R1bGUgTmFtZTogaHdhY3BpIC0gQUNQSSBIYXJkd2FyZSBJbml0aWFsaXphdGlvbi9Nb2RlIEludGVyZmFjZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDgsIEludGVsIENvcnAuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCi0gKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSBhdCBtaW5pbXVtIGEgZGlzY2xhaW1lcgotICogICAgc3Vic3RhbnRpYWxseSBzaW1pbGFyIHRvIHRoZSAiTk8gV0FSUkFOVFkiIGRpc2NsYWltZXIgYmVsb3cKLSAqICAgICgiRGlzY2xhaW1lciIpIGFuZCBhbnkgcmVkaXN0cmlidXRpb24gbXVzdCBiZSBjb25kaXRpb25lZCB1cG9uCi0gKiAgICBpbmNsdWRpbmcgYSBzdWJzdGFudGlhbGx5IHNpbWlsYXIgRGlzY2xhaW1lciByZXF1aXJlbWVudCBmb3IgZnVydGhlcgotICogICAgYmluYXJ5IHJlZGlzdHJpYnV0aW9uLgotICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzCi0gKiAgICBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIE5PIFdBUlJBTlRZCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKLSAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCi0gKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORwotICogSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCi0gKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCi0gKi8KLQotI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgotCi0jZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9IQVJEV0FSRQotQUNQSV9NT0RVTEVfTkFNRSgiaHdhY3BpIikKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX2h3X3NldF9tb2RlCi0gKgotICogUEFSQU1FVEVSUzogIE1vZGUgICAgICAgICAgICAtIFNZU19NT0RFX0FDUEkgb3IgU1lTX01PREVfTEVHQUNZCi0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cwotICoKLSAqIERFU0NSSVBUSU9OOiBUcmFuc2l0aW9ucyB0aGUgc3lzdGVtIGludG8gdGhlIHJlcXVlc3RlZCBtb2RlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1hY3BpX3N0YXR1cyBhY3BpX2h3X3NldF9tb2RlKHUzMiBtb2RlKQotewotCi0JYWNwaV9zdGF0dXMgc3RhdHVzOwotCXUzMiByZXRyeTsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UoaHdfc2V0X21vZGUpOwotCi0JLyoKLQkgKiBBQ1BJIDIuMCBjbGFyaWZpZWQgdGhhdCBpZiBTTUlfQ01EIGluIEZBRFQgaXMgemVybywKLQkgKiBzeXN0ZW0gZG9lcyBub3Qgc3VwcG9ydCBtb2RlIHRyYW5zaXRpb24uCi0JICovCi0JaWYgKCFhY3BpX2dibF9GQURULnNtaV9jb21tYW5kKSB7Ci0JCUFDUElfRVJST1IoKEFFX0lORk8sCi0JCQkgICAgIk5vIFNNSV9DTUQgaW4gRkFEVCwgbW9kZSB0cmFuc2l0aW9uIGZhaWxlZCIpKTsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX0hBUkRXQVJFX1JFU1BPTlNFKTsKLQl9Ci0KLQkvKgotCSAqIEFDUEkgMi4wIGNsYXJpZmllZCB0aGUgbWVhbmluZyBvZiBBQ1BJX0VOQUJMRSBhbmQgQUNQSV9ESVNBQkxFCi0JICogaW4gRkFEVDogSWYgaXQgaXMgemVybywgZW5hYmxpbmcgb3IgZGlzYWJsaW5nIGlzIG5vdCBzdXBwb3J0ZWQuCi0JICogQXMgb2xkIHN5c3RlbXMgbWF5IGhhdmUgdXNlZCB6ZXJvIGZvciBtb2RlIHRyYW5zaXRpb24sCi0JICogd2UgbWFrZSBzdXJlIGJvdGggdGhlIG51bWJlcnMgYXJlIHplcm8gdG8gZGV0ZXJtaW5lIHRoZXNlCi0JICogdHJhbnNpdGlvbnMgYXJlIG5vdCBzdXBwb3J0ZWQuCi0JICovCi0JaWYgKCFhY3BpX2dibF9GQURULmFjcGlfZW5hYmxlICYmICFhY3BpX2dibF9GQURULmFjcGlfZGlzYWJsZSkgewotCQlBQ1BJX0VSUk9SKChBRV9JTkZPLAotCQkJICAgICJObyBBQ1BJIG1vZGUgdHJhbnNpdGlvbiBzdXBwb3J0ZWQgaW4gdGhpcyBzeXN0ZW0gKGVuYWJsZS9kaXNhYmxlIGJvdGggemVybykiKSk7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7Ci0JfQotCi0Jc3dpdGNoIChtb2RlKSB7Ci0JY2FzZSBBQ1BJX1NZU19NT0RFX0FDUEk6Ci0KLQkJLyogQklPUyBzaG91bGQgaGF2ZSBkaXNhYmxlZCBBTEwgZml4ZWQgYW5kIEdQIGV2ZW50cyAqLwotCi0JCXN0YXR1cyA9IGFjcGlfb3Nfd3JpdGVfcG9ydChhY3BpX2dibF9GQURULnNtaV9jb21tYW5kLAotCQkJCQkgICAgKHUzMikgYWNwaV9nYmxfRkFEVC5hY3BpX2VuYWJsZSwgOCk7Ci0JCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywKLQkJCQkgICJBdHRlbXB0aW5nIHRvIGVuYWJsZSBBQ1BJIG1vZGVcbiIpKTsKLQkJYnJlYWs7Ci0KLQljYXNlIEFDUElfU1lTX01PREVfTEVHQUNZOgotCi0JCS8qCi0JCSAqIEJJT1Mgc2hvdWxkIGNsZWFyIGFsbCBmaXhlZCBzdGF0dXMgYml0cyBhbmQgcmVzdG9yZSBmaXhlZCBldmVudAotCQkgKiBlbmFibGUgYml0cyB0byBkZWZhdWx0Ci0JCSAqLwotCQlzdGF0dXMgPSBhY3BpX29zX3dyaXRlX3BvcnQoYWNwaV9nYmxfRkFEVC5zbWlfY29tbWFuZCwKLQkJCQkJICAgICh1MzIpIGFjcGlfZ2JsX0ZBRFQuYWNwaV9kaXNhYmxlLAotCQkJCQkgICAgOCk7Ci0JCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywKLQkJCQkgICJBdHRlbXB0aW5nIHRvIGVuYWJsZSBMZWdhY3kgKG5vbi1BQ1BJKSBtb2RlXG4iKSk7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9QQVJBTUVURVIpOwotCX0KLQotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlBQ1BJX0VYQ0VQVElPTigoQUVfSU5GTywgc3RhdHVzLAotCQkJCSJDb3VsZCBub3Qgd3JpdGUgQUNQSSBtb2RlIGNoYW5nZSIpKTsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci0JfQotCi0JLyoKLQkgKiBTb21lIGhhcmR3YXJlIHRha2VzIGEgTE9ORyB0aW1lIHRvIHN3aXRjaCBtb2Rlcy4gR2l2ZSB0aGVtIDMgc2VjIHRvCi0JICogZG8gc28sIGJ1dCBhbGxvdyBmYXN0ZXIgc3lzdGVtcyB0byBwcm9jZWVkIG1vcmUgcXVpY2tseS4KLQkgKi8KLQlyZXRyeSA9IDMwMDA7Ci0Jd2hpbGUgKHJldHJ5KSB7Ci0JCWlmIChhY3BpX2h3X2dldF9tb2RlKCkgPT0gbW9kZSkgewotCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLAotCQkJCQkgICJNb2RlICVYIHN1Y2Nlc3NmdWxseSBlbmFibGVkXG4iLAotCQkJCQkgIG1vZGUpKTsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7Ci0JCX0KLQkJYWNwaV9vc19zdGFsbCgxMDAwKTsKLQkJcmV0cnktLTsKLQl9Ci0KLQlBQ1BJX0VSUk9SKChBRV9JTkZPLCAiSGFyZHdhcmUgZGlkIG5vdCBjaGFuZ2UgbW9kZXMiKSk7Ci0JcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX0hBUkRXQVJFX1JFU1BPTlNFKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9od19nZXRfbW9kZQotICoKLSAqIFBBUkFNRVRFUlM6ICBub25lCi0gKgotICogUkVUVVJOOiAgICAgIFNZU19NT0RFX0FDUEkgb3IgU1lTX01PREVfTEVHQUNZCi0gKgotICogREVTQ1JJUFRJT046IFJldHVybiBjdXJyZW50IG9wZXJhdGluZyBzdGF0ZSBvZiBzeXN0ZW0uICBEZXRlcm1pbmVkIGJ5Ci0gKiAgICAgICAgICAgICAgcXVlcnlpbmcgdGhlIFNDSV9FTiBiaXQuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdTMyIGFjcGlfaHdfZ2V0X21vZGUodm9pZCkKLXsKLQlhY3BpX3N0YXR1cyBzdGF0dXM7Ci0JdTMyIHZhbHVlOwotCi0JQUNQSV9GVU5DVElPTl9UUkFDRShod19nZXRfbW9kZSk7Ci0KLQkvKgotCSAqIEFDUEkgMi4wIGNsYXJpZmllZCB0aGF0IGlmIFNNSV9DTUQgaW4gRkFEVCBpcyB6ZXJvLAotCSAqIHN5c3RlbSBkb2VzIG5vdCBzdXBwb3J0IG1vZGUgdHJhbnNpdGlvbi4KLQkgKi8KLQlpZiAoIWFjcGlfZ2JsX0ZBRFQuc21pX2NvbW1hbmQpIHsKLQkJcmV0dXJuX1VJTlQzMihBQ1BJX1NZU19NT0RFX0FDUEkpOwotCX0KLQotCXN0YXR1cyA9IGFjcGlfZ2V0X3JlZ2lzdGVyKEFDUElfQklUUkVHX1NDSV9FTkFCTEUsICZ2YWx1ZSk7Ci0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCXJldHVybl9VSU5UMzIoQUNQSV9TWVNfTU9ERV9MRUdBQ1kpOwotCX0KLQotCWlmICh2YWx1ZSkgewotCQlyZXR1cm5fVUlOVDMyKEFDUElfU1lTX01PREVfQUNQSSk7Ci0JfSBlbHNlIHsKLQkJcmV0dXJuX1VJTlQzMihBQ1BJX1NZU19NT0RFX0xFR0FDWSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2hhcmR3YXJlL2h3Z3BlLmMgYi9kcml2ZXJzL2FjcGkvaGFyZHdhcmUvaHdncGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGI4MGRiOS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL2FjcGkvaGFyZHdhcmUvaHdncGUuYworKysgL2Rldi9udWxsCkBAIC0xLDQ3NyArMCwwIEBACi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBNb2R1bGUgTmFtZTogaHdncGUgLSBMb3cgbGV2ZWwgR1BFIGVuYWJsZS9kaXNhYmxlL2NsZWFyIGZ1bmN0aW9ucwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDgsIEludGVsIENvcnAuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCi0gKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSBhdCBtaW5pbXVtIGEgZGlzY2xhaW1lcgotICogICAgc3Vic3RhbnRpYWxseSBzaW1pbGFyIHRvIHRoZSAiTk8gV0FSUkFOVFkiIGRpc2NsYWltZXIgYmVsb3cKLSAqICAgICgiRGlzY2xhaW1lciIpIGFuZCBhbnkgcmVkaXN0cmlidXRpb24gbXVzdCBiZSBjb25kaXRpb25lZCB1cG9uCi0gKiAgICBpbmNsdWRpbmcgYSBzdWJzdGFudGlhbGx5IHNpbWlsYXIgRGlzY2xhaW1lciByZXF1aXJlbWVudCBmb3IgZnVydGhlcgotICogICAgYmluYXJ5IHJlZGlzdHJpYnV0aW9uLgotICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzCi0gKiAgICBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIE5PIFdBUlJBTlRZCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKLSAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCi0gKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORwotICogSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCi0gKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCi0gKi8KLQotI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgotI2luY2x1ZGUgPGFjcGkvYWNldmVudHMuaD4KLQotI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfSEFSRFdBUkUKLUFDUElfTU9EVUxFX05BTUUoImh3Z3BlIikKLQotLyogTG9jYWwgcHJvdG90eXBlcyAqLwotc3RhdGljIGFjcGlfc3RhdHVzCi1hY3BpX2h3X2VuYWJsZV93YWtldXBfZ3BlX2Jsb2NrKHN0cnVjdCBhY3BpX2dwZV94cnVwdF9pbmZvICpncGVfeHJ1cHRfaW5mbywKLQkJCQlzdHJ1Y3QgYWNwaV9ncGVfYmxvY2tfaW5mbyAqZ3BlX2Jsb2NrKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOglhY3BpX2h3X2xvd19kaXNhYmxlX2dwZQotICoKLSAqIFBBUkFNRVRFUlM6CWdwZV9ldmVudF9pbmZvCSAgICAtIEluZm8gYmxvY2sgZm9yIHRoZSBHUEUgdG8gYmUgZGlzYWJsZWQKLSAqCi0gKiBSRVRVUk46CVN0YXR1cwotICoKLSAqIERFU0NSSVBUSU9OOiBEaXNhYmxlIGEgc2luZ2xlIEdQRSBpbiB0aGUgZW5hYmxlIHJlZ2lzdGVyLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWFjcGlfc3RhdHVzIGFjcGlfaHdfbG93X2Rpc2FibGVfZ3BlKHN0cnVjdCBhY3BpX2dwZV9ldmVudF9pbmZvICpncGVfZXZlbnRfaW5mbykKLXsKLQlzdHJ1Y3QgYWNwaV9ncGVfcmVnaXN0ZXJfaW5mbyAqZ3BlX3JlZ2lzdGVyX2luZm87Ci0JYWNwaV9zdGF0dXMgc3RhdHVzOwotCXUzMiBlbmFibGVfbWFzazsKLQotCS8qIEdldCB0aGUgaW5mbyBibG9jayBmb3IgdGhlIGVudGlyZSBHUEUgcmVnaXN0ZXIgKi8KLQotCWdwZV9yZWdpc3Rlcl9pbmZvID0gZ3BlX2V2ZW50X2luZm8tPnJlZ2lzdGVyX2luZm87Ci0JaWYgKCFncGVfcmVnaXN0ZXJfaW5mbykgewotCQlyZXR1cm4gKEFFX05PVF9FWElTVCk7Ci0JfQotCi0JLyogR2V0IGN1cnJlbnQgdmFsdWUgb2YgdGhlIGVuYWJsZSByZWdpc3RlciB0aGF0IGNvbnRhaW5zIHRoaXMgR1BFICovCi0KLQlzdGF0dXMgPSBhY3BpX2h3X2xvd19sZXZlbF9yZWFkKEFDUElfR1BFX1JFR0lTVEVSX1dJRFRILCAmZW5hYmxlX21hc2ssCi0JCQkJCSZncGVfcmVnaXN0ZXJfaW5mby0+ZW5hYmxlX2FkZHJlc3MpOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlyZXR1cm4gKHN0YXR1cyk7Ci0JfQotCi0JLyogQ2xlYXIganVzdCB0aGUgYml0IHRoYXQgY29ycmVzcG9uZHMgdG8gdGhpcyBHUEUgKi8KLQotCUFDUElfQ0xFQVJfQklUKGVuYWJsZV9tYXNrLAotCQkgICAgICAgKCh1MzIpIDEgPDwKLQkJCShncGVfZXZlbnRfaW5mby0+Z3BlX251bWJlciAtCi0JCQkgZ3BlX3JlZ2lzdGVyX2luZm8tPmJhc2VfZ3BlX251bWJlcikpKTsKLQotCS8qIFdyaXRlIHRoZSB1cGRhdGVkIGVuYWJsZSBtYXNrICovCi0KLQlzdGF0dXMgPSBhY3BpX2h3X2xvd19sZXZlbF93cml0ZShBQ1BJX0dQRV9SRUdJU1RFUl9XSURUSCwgZW5hYmxlX21hc2ssCi0JCQkJCSAmZ3BlX3JlZ2lzdGVyX2luZm8tPmVuYWJsZV9hZGRyZXNzKTsKLQotCXJldHVybiAoc3RhdHVzKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX2h3X3dyaXRlX2dwZV9lbmFibGVfcmVnCi0gKgotICogUEFSQU1FVEVSUzogIGdwZV9ldmVudF9pbmZvICAgICAgLSBJbmZvIGJsb2NrIGZvciB0aGUgR1BFIHRvIGJlIGVuYWJsZWQKLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IFdyaXRlIGEgR1BFIGVuYWJsZSByZWdpc3Rlci4gIE5vdGU6IFRoZSBiaXQgZm9yIHRoaXMgR1BFIG11c3QKLSAqICAgICAgICAgICAgICBhbHJlYWR5IGJlIGNsZWFyZWQgb3Igc2V0IGluIHRoZSBwYXJlbnQgcmVnaXN0ZXIKLSAqICAgICAgICAgICAgICBlbmFibGVfZm9yX3J1biBtYXNrLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWFjcGlfc3RhdHVzCi1hY3BpX2h3X3dyaXRlX2dwZV9lbmFibGVfcmVnKHN0cnVjdCBhY3BpX2dwZV9ldmVudF9pbmZvICogZ3BlX2V2ZW50X2luZm8pCi17Ci0Jc3RydWN0IGFjcGlfZ3BlX3JlZ2lzdGVyX2luZm8gKmdwZV9yZWdpc3Rlcl9pbmZvOwotCWFjcGlfc3RhdHVzIHN0YXR1czsKLQotCUFDUElfRlVOQ1RJT05fRU5UUlkoKTsKLQotCS8qIEdldCB0aGUgaW5mbyBibG9jayBmb3IgdGhlIGVudGlyZSBHUEUgcmVnaXN0ZXIgKi8KLQotCWdwZV9yZWdpc3Rlcl9pbmZvID0gZ3BlX2V2ZW50X2luZm8tPnJlZ2lzdGVyX2luZm87Ci0JaWYgKCFncGVfcmVnaXN0ZXJfaW5mbykgewotCQlyZXR1cm4gKEFFX05PVF9FWElTVCk7Ci0JfQotCi0JLyogV3JpdGUgdGhlIGVudGlyZSBHUEUgKHJ1bnRpbWUpIGVuYWJsZSByZWdpc3RlciAqLwotCi0Jc3RhdHVzID0gYWNwaV9od19sb3dfbGV2ZWxfd3JpdGUoOCwgZ3BlX3JlZ2lzdGVyX2luZm8tPmVuYWJsZV9mb3JfcnVuLAotCQkJCQkgJmdwZV9yZWdpc3Rlcl9pbmZvLT5lbmFibGVfYWRkcmVzcyk7Ci0KLQlyZXR1cm4gKHN0YXR1cyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9od19jbGVhcl9ncGUKLSAqCi0gKiBQQVJBTUVURVJTOiAgZ3BlX2V2ZW50X2luZm8gICAgICAtIEluZm8gYmxvY2sgZm9yIHRoZSBHUEUgdG8gYmUgY2xlYXJlZAotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKLSAqCi0gKiBERVNDUklQVElPTjogQ2xlYXIgdGhlIHN0YXR1cyBiaXQgZm9yIGEgc2luZ2xlIEdQRS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1hY3BpX3N0YXR1cyBhY3BpX2h3X2NsZWFyX2dwZShzdHJ1Y3QgYWNwaV9ncGVfZXZlbnRfaW5mbyAqIGdwZV9ldmVudF9pbmZvKQotewotCWFjcGlfc3RhdHVzIHN0YXR1czsKLQl1OCByZWdpc3Rlcl9iaXQ7Ci0KLQlBQ1BJX0ZVTkNUSU9OX0VOVFJZKCk7Ci0KLQlyZWdpc3Rlcl9iaXQgPSAodTgpCi0JICAgICgxIDw8Ci0JICAgICAoZ3BlX2V2ZW50X2luZm8tPmdwZV9udW1iZXIgLQotCSAgICAgIGdwZV9ldmVudF9pbmZvLT5yZWdpc3Rlcl9pbmZvLT5iYXNlX2dwZV9udW1iZXIpKTsKLQotCS8qCi0JICogV3JpdGUgYSBvbmUgdG8gdGhlIGFwcHJvcHJpYXRlIGJpdCBpbiB0aGUgc3RhdHVzIHJlZ2lzdGVyIHRvCi0JICogY2xlYXIgdGhpcyBHUEUuCi0JICovCi0Jc3RhdHVzID0gYWNwaV9od19sb3dfbGV2ZWxfd3JpdGUoOCwgcmVnaXN0ZXJfYml0LAotCQkJCQkgJmdwZV9ldmVudF9pbmZvLT5yZWdpc3Rlcl9pbmZvLT4KLQkJCQkJIHN0YXR1c19hZGRyZXNzKTsKLQotCXJldHVybiAoc3RhdHVzKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX2h3X2dldF9ncGVfc3RhdHVzCi0gKgotICogUEFSQU1FVEVSUzogIGdwZV9ldmVudF9pbmZvICAgICAgLSBJbmZvIGJsb2NrIGZvciB0aGUgR1BFIHRvIHF1ZXJpZWQKLSAqICAgICAgICAgICAgICBldmVudF9zdGF0dXMgICAgICAgIC0gV2hlcmUgdGhlIEdQRSBzdGF0dXMgaXMgcmV0dXJuZWQKLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IFJldHVybiB0aGUgc3RhdHVzIG9mIGEgc2luZ2xlIEdQRS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1hY3BpX3N0YXR1cwotYWNwaV9od19nZXRfZ3BlX3N0YXR1cyhzdHJ1Y3QgYWNwaV9ncGVfZXZlbnRfaW5mbyAqIGdwZV9ldmVudF9pbmZvLAotCQkgICAgICAgYWNwaV9ldmVudF9zdGF0dXMgKiBldmVudF9zdGF0dXMpCi17Ci0JdTMyIGluX2J5dGU7Ci0JdTggcmVnaXN0ZXJfYml0OwotCXN0cnVjdCBhY3BpX2dwZV9yZWdpc3Rlcl9pbmZvICpncGVfcmVnaXN0ZXJfaW5mbzsKLQlhY3BpX3N0YXR1cyBzdGF0dXM7Ci0JYWNwaV9ldmVudF9zdGF0dXMgbG9jYWxfZXZlbnRfc3RhdHVzID0gMDsKLQotCUFDUElfRlVOQ1RJT05fRU5UUlkoKTsKLQotCWlmICghZXZlbnRfc3RhdHVzKSB7Ci0JCXJldHVybiAoQUVfQkFEX1BBUkFNRVRFUik7Ci0JfQotCi0JLyogR2V0IHRoZSBpbmZvIGJsb2NrIGZvciB0aGUgZW50aXJlIEdQRSByZWdpc3RlciAqLwotCi0JZ3BlX3JlZ2lzdGVyX2luZm8gPSBncGVfZXZlbnRfaW5mby0+cmVnaXN0ZXJfaW5mbzsKLQotCS8qIEdldCB0aGUgcmVnaXN0ZXIgYml0bWFzayBmb3IgdGhpcyBHUEUgKi8KLQotCXJlZ2lzdGVyX2JpdCA9ICh1OCkKLQkgICAgKDEgPDwKLQkgICAgIChncGVfZXZlbnRfaW5mby0+Z3BlX251bWJlciAtCi0JICAgICAgZ3BlX2V2ZW50X2luZm8tPnJlZ2lzdGVyX2luZm8tPmJhc2VfZ3BlX251bWJlcikpOwotCi0JLyogR1BFIGN1cnJlbnRseSBlbmFibGVkPyAoZW5hYmxlZCBmb3IgcnVudGltZT8pICovCi0KLQlpZiAocmVnaXN0ZXJfYml0ICYgZ3BlX3JlZ2lzdGVyX2luZm8tPmVuYWJsZV9mb3JfcnVuKSB7Ci0JCWxvY2FsX2V2ZW50X3N0YXR1cyB8PSBBQ1BJX0VWRU5UX0ZMQUdfRU5BQkxFRDsKLQl9Ci0KLQkvKiBHUEUgZW5hYmxlZCBmb3Igd2FrZT8gKi8KLQotCWlmIChyZWdpc3Rlcl9iaXQgJiBncGVfcmVnaXN0ZXJfaW5mby0+ZW5hYmxlX2Zvcl93YWtlKSB7Ci0JCWxvY2FsX2V2ZW50X3N0YXR1cyB8PSBBQ1BJX0VWRU5UX0ZMQUdfV0FLRV9FTkFCTEVEOwotCX0KLQotCS8qIEdQRSBjdXJyZW50bHkgYWN0aXZlIChzdGF0dXMgYml0ID09IDEpPyAqLwotCi0Jc3RhdHVzID0KLQkgICAgYWNwaV9od19sb3dfbGV2ZWxfcmVhZCg4LCAmaW5fYnl0ZSwKLQkJCQkgICAmZ3BlX3JlZ2lzdGVyX2luZm8tPnN0YXR1c19hZGRyZXNzKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJZ290byB1bmxvY2tfYW5kX2V4aXQ7Ci0JfQotCi0JaWYgKHJlZ2lzdGVyX2JpdCAmIGluX2J5dGUpIHsKLQkJbG9jYWxfZXZlbnRfc3RhdHVzIHw9IEFDUElfRVZFTlRfRkxBR19TRVQ7Ci0JfQotCi0JLyogU2V0IHJldHVybiB2YWx1ZSAqLwotCi0JKCpldmVudF9zdGF0dXMpID0gbG9jYWxfZXZlbnRfc3RhdHVzOwotCi0gICAgICB1bmxvY2tfYW5kX2V4aXQ6Ci0JcmV0dXJuIChzdGF0dXMpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfaHdfZGlzYWJsZV9ncGVfYmxvY2sKLSAqCi0gKiBQQVJBTUVURVJTOiAgZ3BlX3hydXB0X2luZm8gICAgICAtIEdQRSBJbnRlcnJ1cHQgaW5mbwotICogICAgICAgICAgICAgIGdwZV9ibG9jayAgICAgICAgICAgLSBHcGUgQmxvY2sgaW5mbwotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKLSAqCi0gKiBERVNDUklQVElPTjogRGlzYWJsZSBhbGwgR1BFcyB3aXRoaW4gYSBzaW5nbGUgR1BFIGJsb2NrCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotYWNwaV9zdGF0dXMKLWFjcGlfaHdfZGlzYWJsZV9ncGVfYmxvY2soc3RydWN0IGFjcGlfZ3BlX3hydXB0X2luZm8gKiBncGVfeHJ1cHRfaW5mbywKLQkJCSAgc3RydWN0IGFjcGlfZ3BlX2Jsb2NrX2luZm8gKiBncGVfYmxvY2spCi17Ci0JdTMyIGk7Ci0JYWNwaV9zdGF0dXMgc3RhdHVzOwotCi0JLyogRXhhbWluZSBlYWNoIEdQRSBSZWdpc3RlciB3aXRoaW4gdGhlIGJsb2NrICovCi0KLQlmb3IgKGkgPSAwOyBpIDwgZ3BlX2Jsb2NrLT5yZWdpc3Rlcl9jb3VudDsgaSsrKSB7Ci0KLQkJLyogRGlzYWJsZSBhbGwgR1BFcyBpbiB0aGlzIHJlZ2lzdGVyICovCi0KLQkJc3RhdHVzID0gYWNwaV9od19sb3dfbGV2ZWxfd3JpdGUoOCwgMHgwMCwKLQkJCQkJCSAmZ3BlX2Jsb2NrLT5yZWdpc3Rlcl9pbmZvW2ldLgotCQkJCQkJIGVuYWJsZV9hZGRyZXNzKTsKLQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCQlyZXR1cm4gKHN0YXR1cyk7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gKEFFX09LKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX2h3X2NsZWFyX2dwZV9ibG9jawotICoKLSAqIFBBUkFNRVRFUlM6ICBncGVfeHJ1cHRfaW5mbyAgICAgIC0gR1BFIEludGVycnVwdCBpbmZvCi0gKiAgICAgICAgICAgICAgZ3BlX2Jsb2NrICAgICAgICAgICAtIEdwZSBCbG9jayBpbmZvCi0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cwotICoKLSAqIERFU0NSSVBUSU9OOiBDbGVhciBzdGF0dXMgYml0cyBmb3IgYWxsIEdQRXMgd2l0aGluIGEgc2luZ2xlIEdQRSBibG9jawotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWFjcGlfc3RhdHVzCi1hY3BpX2h3X2NsZWFyX2dwZV9ibG9jayhzdHJ1Y3QgYWNwaV9ncGVfeHJ1cHRfaW5mbyAqIGdwZV94cnVwdF9pbmZvLAotCQkJc3RydWN0IGFjcGlfZ3BlX2Jsb2NrX2luZm8gKiBncGVfYmxvY2spCi17Ci0JdTMyIGk7Ci0JYWNwaV9zdGF0dXMgc3RhdHVzOwotCi0JLyogRXhhbWluZSBlYWNoIEdQRSBSZWdpc3RlciB3aXRoaW4gdGhlIGJsb2NrICovCi0KLQlmb3IgKGkgPSAwOyBpIDwgZ3BlX2Jsb2NrLT5yZWdpc3Rlcl9jb3VudDsgaSsrKSB7Ci0KLQkJLyogQ2xlYXIgc3RhdHVzIG9uIGFsbCBHUEVzIGluIHRoaXMgcmVnaXN0ZXIgKi8KLQotCQlzdGF0dXMgPSBhY3BpX2h3X2xvd19sZXZlbF93cml0ZSg4LCAweEZGLAotCQkJCQkJICZncGVfYmxvY2stPnJlZ2lzdGVyX2luZm9baV0uCi0JCQkJCQkgc3RhdHVzX2FkZHJlc3MpOwotCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJCXJldHVybiAoc3RhdHVzKTsKLQkJfQotCX0KLQotCXJldHVybiAoQUVfT0spOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfaHdfZW5hYmxlX3J1bnRpbWVfZ3BlX2Jsb2NrCi0gKgotICogUEFSQU1FVEVSUzogIGdwZV94cnVwdF9pbmZvICAgICAgLSBHUEUgSW50ZXJydXB0IGluZm8KLSAqICAgICAgICAgICAgICBncGVfYmxvY2sgICAgICAgICAgIC0gR3BlIEJsb2NrIGluZm8KLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IEVuYWJsZSBhbGwgInJ1bnRpbWUiIEdQRXMgd2l0aGluIGEgc2luZ2xlIEdQRSBibG9jay4gSW5jbHVkZXMKLSAqICAgICAgICAgICAgICBjb21iaW5hdGlvbiB3YWtlL3J1biBHUEVzLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWFjcGlfc3RhdHVzCi1hY3BpX2h3X2VuYWJsZV9ydW50aW1lX2dwZV9ibG9jayhzdHJ1Y3QgYWNwaV9ncGVfeHJ1cHRfaW5mbyAqIGdwZV94cnVwdF9pbmZvLAotCQkJCSBzdHJ1Y3QgYWNwaV9ncGVfYmxvY2tfaW5mbyAqIGdwZV9ibG9jaykKLXsKLQl1MzIgaTsKLQlhY3BpX3N0YXR1cyBzdGF0dXM7Ci0KLQkvKiBOT1RFOiBhc3N1bWVzIHRoYXQgYWxsIEdQRXMgYXJlIGN1cnJlbnRseSBkaXNhYmxlZCAqLwotCi0JLyogRXhhbWluZSBlYWNoIEdQRSBSZWdpc3RlciB3aXRoaW4gdGhlIGJsb2NrICovCi0KLQlmb3IgKGkgPSAwOyBpIDwgZ3BlX2Jsb2NrLT5yZWdpc3Rlcl9jb3VudDsgaSsrKSB7Ci0JCWlmICghZ3BlX2Jsb2NrLT5yZWdpc3Rlcl9pbmZvW2ldLmVuYWJsZV9mb3JfcnVuKSB7Ci0JCQljb250aW51ZTsKLQkJfQotCi0JCS8qIEVuYWJsZSBhbGwgInJ1bnRpbWUiIEdQRXMgaW4gdGhpcyByZWdpc3RlciAqLwotCi0JCXN0YXR1cyA9Ci0JCSAgICBhY3BpX2h3X2xvd19sZXZlbF93cml0ZSg4LAotCQkJCQkgICAgZ3BlX2Jsb2NrLT5yZWdpc3Rlcl9pbmZvW2ldLgotCQkJCQkgICAgZW5hYmxlX2Zvcl9ydW4sCi0JCQkJCSAgICAmZ3BlX2Jsb2NrLT5yZWdpc3Rlcl9pbmZvW2ldLgotCQkJCQkgICAgZW5hYmxlX2FkZHJlc3MpOwotCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJCXJldHVybiAoc3RhdHVzKTsKLQkJfQotCX0KLQotCXJldHVybiAoQUVfT0spOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfaHdfZW5hYmxlX3dha2V1cF9ncGVfYmxvY2sKLSAqCi0gKiBQQVJBTUVURVJTOiAgZ3BlX3hydXB0X2luZm8gICAgICAtIEdQRSBJbnRlcnJ1cHQgaW5mbwotICogICAgICAgICAgICAgIGdwZV9ibG9jayAgICAgICAgICAgLSBHcGUgQmxvY2sgaW5mbwotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKLSAqCi0gKiBERVNDUklQVElPTjogRW5hYmxlIGFsbCAid2FrZSIgR1BFcyB3aXRoaW4gYSBzaW5nbGUgR1BFIGJsb2NrLiBJbmNsdWRlcwotICogICAgICAgICAgICAgIGNvbWJpbmF0aW9uIHdha2UvcnVuIEdQRXMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIGFjcGlfc3RhdHVzCi1hY3BpX2h3X2VuYWJsZV93YWtldXBfZ3BlX2Jsb2NrKHN0cnVjdCBhY3BpX2dwZV94cnVwdF9pbmZvICpncGVfeHJ1cHRfaW5mbywKLQkJCQlzdHJ1Y3QgYWNwaV9ncGVfYmxvY2tfaW5mbyAqZ3BlX2Jsb2NrKQotewotCXUzMiBpOwotCWFjcGlfc3RhdHVzIHN0YXR1czsKLQotCS8qIEV4YW1pbmUgZWFjaCBHUEUgUmVnaXN0ZXIgd2l0aGluIHRoZSBibG9jayAqLwotCi0JZm9yIChpID0gMDsgaSA8IGdwZV9ibG9jay0+cmVnaXN0ZXJfY291bnQ7IGkrKykgewotCQlpZiAoIWdwZV9ibG9jay0+cmVnaXN0ZXJfaW5mb1tpXS5lbmFibGVfZm9yX3dha2UpIHsKLQkJCWNvbnRpbnVlOwotCQl9Ci0KLQkJLyogRW5hYmxlIGFsbCAid2FrZSIgR1BFcyBpbiB0aGlzIHJlZ2lzdGVyICovCi0KLQkJc3RhdHVzID0gYWNwaV9od19sb3dfbGV2ZWxfd3JpdGUoOCwKLQkJCQkJCSBncGVfYmxvY2stPnJlZ2lzdGVyX2luZm9baV0uCi0JCQkJCQkgZW5hYmxlX2Zvcl93YWtlLAotCQkJCQkJICZncGVfYmxvY2stPnJlZ2lzdGVyX2luZm9baV0uCi0JCQkJCQkgZW5hYmxlX2FkZHJlc3MpOwotCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJCXJldHVybiAoc3RhdHVzKTsKLQkJfQotCX0KLQotCXJldHVybiAoQUVfT0spOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfaHdfZGlzYWJsZV9hbGxfZ3BlcwotICoKLSAqIFBBUkFNRVRFUlM6ICBOb25lCi0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cwotICoKLSAqIERFU0NSSVBUSU9OOiBEaXNhYmxlIGFuZCBjbGVhciBhbGwgR1BFcyBpbiBhbGwgR1BFIGJsb2NrcwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWFjcGlfc3RhdHVzIGFjcGlfaHdfZGlzYWJsZV9hbGxfZ3Blcyh2b2lkKQotewotCWFjcGlfc3RhdHVzIHN0YXR1czsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UoaHdfZGlzYWJsZV9hbGxfZ3Blcyk7Ci0KLQlzdGF0dXMgPSBhY3BpX2V2X3dhbGtfZ3BlX2xpc3QoYWNwaV9od19kaXNhYmxlX2dwZV9ibG9jayk7Ci0Jc3RhdHVzID0gYWNwaV9ldl93YWxrX2dwZV9saXN0KGFjcGlfaHdfY2xlYXJfZ3BlX2Jsb2NrKTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX2h3X2VuYWJsZV9hbGxfcnVudGltZV9ncGVzCi0gKgotICogUEFSQU1FVEVSUzogIE5vbmUKLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IEVuYWJsZSBhbGwgInJ1bnRpbWUiIEdQRXMsIGluIGFsbCBHUEUgYmxvY2tzCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotYWNwaV9zdGF0dXMgYWNwaV9od19lbmFibGVfYWxsX3J1bnRpbWVfZ3Blcyh2b2lkKQotewotCWFjcGlfc3RhdHVzIHN0YXR1czsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UoaHdfZW5hYmxlX2FsbF9ydW50aW1lX2dwZXMpOwotCi0Jc3RhdHVzID0gYWNwaV9ldl93YWxrX2dwZV9saXN0KGFjcGlfaHdfZW5hYmxlX3J1bnRpbWVfZ3BlX2Jsb2NrKTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX2h3X2VuYWJsZV9hbGxfd2FrZXVwX2dwZXMKLSAqCi0gKiBQQVJBTUVURVJTOiAgTm9uZQotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKLSAqCi0gKiBERVNDUklQVElPTjogRW5hYmxlIGFsbCAid2FrZXVwIiBHUEVzLCBpbiBhbGwgR1BFIGJsb2NrcwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWFjcGlfc3RhdHVzIGFjcGlfaHdfZW5hYmxlX2FsbF93YWtldXBfZ3Blcyh2b2lkKQotewotCWFjcGlfc3RhdHVzIHN0YXR1czsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UoaHdfZW5hYmxlX2FsbF93YWtldXBfZ3Blcyk7Ci0KLQlzdGF0dXMgPSBhY3BpX2V2X3dhbGtfZ3BlX2xpc3QoYWNwaV9od19lbmFibGVfd2FrZXVwX2dwZV9ibG9jayk7Ci0JcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvaGFyZHdhcmUvaHdyZWdzLmMgYi9kcml2ZXJzL2FjcGkvaGFyZHdhcmUvaHdyZWdzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkZjc5MmEuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9hY3BpL2hhcmR3YXJlL2h3cmVncy5jCisrKyAvZGV2L251bGwKQEAgLTEsODU3ICswLDAgQEAKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBNb2R1bGUgTmFtZTogaHdyZWdzIC0gUmVhZC93cml0ZSBhY2Nlc3MgZnVuY3Rpb25zIGZvciB0aGUgdmFyaW91cyBBQ1BJCi0gKiAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbCBhbmQgc3RhdHVzIHJlZ2lzdGVycy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwOCwgSW50ZWwgQ29ycC4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKLSAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIGF0IG1pbmltdW0gYSBkaXNjbGFpbWVyCi0gKiAgICBzdWJzdGFudGlhbGx5IHNpbWlsYXIgdG8gdGhlICJOTyBXQVJSQU5UWSIgZGlzY2xhaW1lciBiZWxvdwotICogICAgKCJEaXNjbGFpbWVyIikgYW5kIGFueSByZWRpc3RyaWJ1dGlvbiBtdXN0IGJlIGNvbmRpdGlvbmVkIHVwb24KLSAqICAgIGluY2x1ZGluZyBhIHN1YnN0YW50aWFsbHkgc2ltaWxhciBEaXNjbGFpbWVyIHJlcXVpcmVtZW50IGZvciBmdXJ0aGVyCi0gKiAgICBiaW5hcnkgcmVkaXN0cmlidXRpb24uCi0gKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMKLSAqICAgIG9mIGFueSBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTk8gV0FSUkFOVFkKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAotICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKLSAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HCi0gKiBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKLSAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KLSAqLwotCi0jaW5jbHVkZSA8YWNwaS9hY3BpLmg+Ci0jaW5jbHVkZSA8YWNwaS9hY25hbWVzcC5oPgotI2luY2x1ZGUgPGFjcGkvYWNldmVudHMuaD4KLQotI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfSEFSRFdBUkUKLUFDUElfTU9EVUxFX05BTUUoImh3cmVncyIpCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfaHdfY2xlYXJfYWNwaV9zdGF0dXMKLSAqCi0gKiBQQVJBTUVURVJTOiAgTm9uZQotICoKLSAqIFJFVFVSTjogICAgICBOb25lCi0gKgotICogREVTQ1JJUFRJT046IENsZWFycyBhbGwgZml4ZWQgYW5kIGdlbmVyYWwgcHVycG9zZSBzdGF0dXMgYml0cwotICogICAgICAgICAgICAgIFRISVMgRlVOQ1RJT04gTVVTVCBCRSBDQUxMRUQgV0lUSCBJTlRFUlJVUFRTIERJU0FCTEVECi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWFjcGlfc3RhdHVzIGFjcGlfaHdfY2xlYXJfYWNwaV9zdGF0dXModm9pZCkKLXsKLQlhY3BpX3N0YXR1cyBzdGF0dXM7Ci0JYWNwaV9jcHVfZmxhZ3MgbG9ja19mbGFncyA9IDA7Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGh3X2NsZWFyX2FjcGlfc3RhdHVzKTsKLQotCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU8sICJBYm91dCB0byB3cml0ZSAlMDRYIHRvICUwNFhcbiIsCi0JCQkgIEFDUElfQklUTUFTS19BTExfRklYRURfU1RBVFVTLAotCQkJICAodTE2KSBhY3BpX2dibF9GQURULnhwbTFhX2V2ZW50X2Jsb2NrLmFkZHJlc3MpKTsKLQotCWxvY2tfZmxhZ3MgPSBhY3BpX29zX2FjcXVpcmVfbG9jayhhY3BpX2dibF9oYXJkd2FyZV9sb2NrKTsKLQotCXN0YXR1cyA9IGFjcGlfaHdfcmVnaXN0ZXJfd3JpdGUoQUNQSV9SRUdJU1RFUl9QTTFfU1RBVFVTLAotCQkJCQlBQ1BJX0JJVE1BU0tfQUxMX0ZJWEVEX1NUQVRVUyk7Ci0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCWdvdG8gdW5sb2NrX2FuZF9leGl0OwotCX0KLQotCS8qIENsZWFyIHRoZSBmaXhlZCBldmVudHMgKi8KLQotCWlmIChhY3BpX2dibF9GQURULnhwbTFiX2V2ZW50X2Jsb2NrLmFkZHJlc3MpIHsKLQkJc3RhdHVzID0KLQkJICAgIGFjcGlfaHdfbG93X2xldmVsX3dyaXRlKDE2LCBBQ1BJX0JJVE1BU0tfQUxMX0ZJWEVEX1NUQVRVUywKLQkJCQkJICAgICZhY3BpX2dibF9GQURULnhwbTFiX2V2ZW50X2Jsb2NrKTsKLQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCQlnb3RvIHVubG9ja19hbmRfZXhpdDsKLQkJfQotCX0KLQotCS8qIENsZWFyIHRoZSBHUEUgQml0cyBpbiBhbGwgR1BFIHJlZ2lzdGVycyBpbiBhbGwgR1BFIGJsb2NrcyAqLwotCi0Jc3RhdHVzID0gYWNwaV9ldl93YWxrX2dwZV9saXN0KGFjcGlfaHdfY2xlYXJfZ3BlX2Jsb2NrKTsKLQotICAgICAgdW5sb2NrX2FuZF9leGl0OgotCWFjcGlfb3NfcmVsZWFzZV9sb2NrKGFjcGlfZ2JsX2hhcmR3YXJlX2xvY2ssIGxvY2tfZmxhZ3MpOwotCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX2dldF9zbGVlcF90eXBlX2RhdGEKLSAqCi0gKiBQQVJBTUVURVJTOiAgc2xlZXBfc3RhdGUgICAgICAgICAtIE51bWVyaWMgc2xlZXAgc3RhdGUKLSAqICAgICAgICAgICAgICAqc2xlZXBfdHlwZV9hICAgICAgICAtIFdoZXJlIFNMUF9UWVBhIGlzIHJldHVybmVkCi0gKiAgICAgICAgICAgICAgKnNsZWVwX3R5cGVfYiAgICAgICAgLSBXaGVyZSBTTFBfVFlQYiBpcyByZXR1cm5lZAotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMgLSBBQ1BJIHN0YXR1cwotICoKLSAqIERFU0NSSVBUSU9OOiBPYnRhaW4gdGhlIFNMUF9UWVBhIGFuZCBTTFBfVFlQYiB2YWx1ZXMgZm9yIHRoZSByZXF1ZXN0ZWQgc2xlZXAKLSAqICAgICAgICAgICAgICBzdGF0ZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1hY3BpX3N0YXR1cwotYWNwaV9nZXRfc2xlZXBfdHlwZV9kYXRhKHU4IHNsZWVwX3N0YXRlLCB1OCAqIHNsZWVwX3R5cGVfYSwgdTggKiBzbGVlcF90eXBlX2IpCi17Ci0JYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7Ci0Jc3RydWN0IGFjcGlfZXZhbHVhdGVfaW5mbyAqaW5mbzsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UoYWNwaV9nZXRfc2xlZXBfdHlwZV9kYXRhKTsKLQotCS8qIFZhbGlkYXRlIHBhcmFtZXRlcnMgKi8KLQotCWlmICgoc2xlZXBfc3RhdGUgPiBBQ1BJX1NfU1RBVEVTX01BWCkgfHwgIXNsZWVwX3R5cGVfYSB8fCAhc2xlZXBfdHlwZV9iKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfUEFSQU1FVEVSKTsKLQl9Ci0KLQkvKiBBbGxvY2F0ZSB0aGUgZXZhbHVhdGlvbiBpbmZvcm1hdGlvbiBibG9jayAqLwotCi0JaW5mbyA9IEFDUElfQUxMT0NBVEVfWkVST0VEKHNpemVvZihzdHJ1Y3QgYWNwaV9ldmFsdWF0ZV9pbmZvKSk7Ci0JaWYgKCFpbmZvKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT19NRU1PUlkpOwotCX0KLQotCWluZm8tPnBhdGhuYW1lID0KLQkgICAgQUNQSV9DQVNUX1BUUihjaGFyLCBhY3BpX2dibF9zbGVlcF9zdGF0ZV9uYW1lc1tzbGVlcF9zdGF0ZV0pOwotCi0JLyogRXZhbHVhdGUgdGhlIG5hbWVzcGFjZSBvYmplY3QgY29udGFpbmluZyB0aGUgdmFsdWVzIGZvciB0aGlzIHN0YXRlICovCi0KLQlzdGF0dXMgPSBhY3BpX25zX2V2YWx1YXRlKGluZm8pOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VYRUMsCi0JCQkJICAiJXMgd2hpbGUgZXZhbHVhdGluZyBTbGVlcFN0YXRlIFslc11cbiIsCi0JCQkJICBhY3BpX2Zvcm1hdF9leGNlcHRpb24oc3RhdHVzKSwKLQkJCQkgIGluZm8tPnBhdGhuYW1lKSk7Ci0KLQkJZ290byBjbGVhbnVwOwotCX0KLQotCS8qIE11c3QgaGF2ZSBhIHJldHVybiBvYmplY3QgKi8KLQotCWlmICghaW5mby0+cmV0dXJuX29iamVjdCkgewotCQlBQ1BJX0VSUk9SKChBRV9JTkZPLCAiTm8gU2xlZXAgU3RhdGUgb2JqZWN0IHJldHVybmVkIGZyb20gWyVzXSIsCi0JCQkgICAgaW5mby0+cGF0aG5hbWUpKTsKLQkJc3RhdHVzID0gQUVfTk9UX0VYSVNUOwotCX0KLQotCS8qIEl0IG11c3QgYmUgb2YgdHlwZSBQYWNrYWdlICovCi0KLQllbHNlIGlmIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRShpbmZvLT5yZXR1cm5fb2JqZWN0KSAhPSBBQ1BJX1RZUEVfUEFDS0FHRSkgewotCQlBQ1BJX0VSUk9SKChBRV9JTkZPLAotCQkJICAgICJTbGVlcCBTdGF0ZSByZXR1cm4gb2JqZWN0IGlzIG5vdCBhIFBhY2thZ2UiKSk7Ci0JCXN0YXR1cyA9IEFFX0FNTF9PUEVSQU5EX1RZUEU7Ci0JfQotCi0JLyoKLQkgKiBUaGUgcGFja2FnZSBtdXN0IGhhdmUgYXQgbGVhc3QgdHdvIGVsZW1lbnRzLiBOT1RFIChNYXJjaCAyMDA1KTogVGhpcwotCSAqIGdvZXMgYWdhaW5zdCB0aGUgY3VycmVudCBBQ1BJIHNwZWMgd2hpY2ggZGVmaW5lcyB0aGlzIG9iamVjdCBhcyBhCi0JICogcGFja2FnZSB3aXRoIG9uZSBlbmNvZGVkIERXT1JEIGVsZW1lbnQuIEhvd2V2ZXIsIGV4aXN0aW5nIHByYWN0aWNlCi0JICogYnkgQklPUyB2ZW5kb3JzIHNlZW1zIHRvIGJlIHRvIGhhdmUgMiBvciBtb3JlIGVsZW1lbnRzLCBhdCBsZWFzdAotCSAqIG9uZSBwZXIgc2xlZXAgdHlwZSAoQS9CKS4KLQkgKi8KLQllbHNlIGlmIChpbmZvLT5yZXR1cm5fb2JqZWN0LT5wYWNrYWdlLmNvdW50IDwgMikgewotCQlBQ1BJX0VSUk9SKChBRV9JTkZPLAotCQkJICAgICJTbGVlcCBTdGF0ZSByZXR1cm4gcGFja2FnZSBkb2VzIG5vdCBoYXZlIGF0IGxlYXN0IHR3byBlbGVtZW50cyIpKTsKLQkJc3RhdHVzID0gQUVfQU1MX05PX09QRVJBTkQ7Ci0JfQotCi0JLyogVGhlIGZpcnN0IHR3byBlbGVtZW50cyBtdXN0IGJvdGggYmUgb2YgdHlwZSBJbnRlZ2VyICovCi0KLQllbHNlIGlmICgoQUNQSV9HRVRfT0JKRUNUX1RZUEUoaW5mby0+cmV0dXJuX29iamVjdC0+cGFja2FnZS5lbGVtZW50c1swXSkKLQkJICAhPSBBQ1BJX1RZUEVfSU5URUdFUikgfHwKLQkJIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRShpbmZvLT5yZXR1cm5fb2JqZWN0LT5wYWNrYWdlLmVsZW1lbnRzWzFdKQotCQkgICE9IEFDUElfVFlQRV9JTlRFR0VSKSkgewotCQlBQ1BJX0VSUk9SKChBRV9JTkZPLAotCQkJICAgICJTbGVlcCBTdGF0ZSByZXR1cm4gcGFja2FnZSBlbGVtZW50cyBhcmUgbm90IGJvdGggSW50ZWdlcnMgKCVzLCAlcykiLAotCQkJICAgIGFjcGlfdXRfZ2V0X29iamVjdF90eXBlX25hbWUoaW5mby0+cmV0dXJuX29iamVjdC0+Ci0JCQkJCQkJIHBhY2thZ2UuZWxlbWVudHNbMF0pLAotCQkJICAgIGFjcGlfdXRfZ2V0X29iamVjdF90eXBlX25hbWUoaW5mby0+cmV0dXJuX29iamVjdC0+Ci0JCQkJCQkJIHBhY2thZ2UuZWxlbWVudHNbMV0pKSk7Ci0JCXN0YXR1cyA9IEFFX0FNTF9PUEVSQU5EX1RZUEU7Ci0JfSBlbHNlIHsKLQkJLyogVmFsaWQgX1N4XyBwYWNrYWdlIHNpemUsIHR5cGUsIGFuZCB2YWx1ZSAqLwotCi0JCSpzbGVlcF90eXBlX2EgPSAodTgpCi0JCSAgICAoaW5mby0+cmV0dXJuX29iamVjdC0+cGFja2FnZS5lbGVtZW50c1swXSktPmludGVnZXIudmFsdWU7Ci0JCSpzbGVlcF90eXBlX2IgPSAodTgpCi0JCSAgICAoaW5mby0+cmV0dXJuX29iamVjdC0+cGFja2FnZS5lbGVtZW50c1sxXSktPmludGVnZXIudmFsdWU7Ci0JfQotCi0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCUFDUElfRVhDRVBUSU9OKChBRV9JTkZPLCBzdGF0dXMsCi0JCQkJIldoaWxlIGV2YWx1YXRpbmcgU2xlZXBTdGF0ZSBbJXNdLCBiYWQgU2xlZXAgb2JqZWN0ICVwIHR5cGUgJXMiLAotCQkJCWluZm8tPnBhdGhuYW1lLCBpbmZvLT5yZXR1cm5fb2JqZWN0LAotCQkJCWFjcGlfdXRfZ2V0X29iamVjdF90eXBlX25hbWUoaW5mby0+Ci0JCQkJCQkJICAgICByZXR1cm5fb2JqZWN0KSkpOwotCX0KLQotCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZShpbmZvLT5yZXR1cm5fb2JqZWN0KTsKLQotICAgICAgY2xlYW51cDoKLQlBQ1BJX0ZSRUUoaW5mbyk7Ci0JcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci19Ci0KLUFDUElfRVhQT1JUX1NZTUJPTChhY3BpX2dldF9zbGVlcF90eXBlX2RhdGEpCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfaHdfZ2V0X3JlZ2lzdGVyX2JpdF9tYXNrCi0gKgotICogUEFSQU1FVEVSUzogIHJlZ2lzdGVyX2lkICAgICAgICAgLSBJbmRleCBvZiBBQ1BJIFJlZ2lzdGVyIHRvIGFjY2VzcwotICoKLSAqIFJFVFVSTjogICAgICBUaGUgYml0bWFzayB0byBiZSB1c2VkIHdoZW4gYWNjZXNzaW5nIHRoZSByZWdpc3RlcgotICoKLSAqIERFU0NSSVBUSU9OOiBNYXAgcmVnaXN0ZXJfaWQgaW50byBhIHJlZ2lzdGVyIGJpdG1hc2suCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0cnVjdCBhY3BpX2JpdF9yZWdpc3Rlcl9pbmZvICphY3BpX2h3X2dldF9iaXRfcmVnaXN0ZXJfaW5mbyh1MzIgcmVnaXN0ZXJfaWQpCi17Ci0JQUNQSV9GVU5DVElPTl9FTlRSWSgpOwotCi0JaWYgKHJlZ2lzdGVyX2lkID4gQUNQSV9CSVRSRUdfTUFYKSB7Ci0JCUFDUElfRVJST1IoKEFFX0lORk8sICJJbnZhbGlkIEJpdFJlZ2lzdGVyIElEOiAlWCIsCi0JCQkgICAgcmVnaXN0ZXJfaWQpKTsKLQkJcmV0dXJuIChOVUxMKTsKLQl9Ci0KLQlyZXR1cm4gKCZhY3BpX2dibF9iaXRfcmVnaXN0ZXJfaW5mb1tyZWdpc3Rlcl9pZF0pOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX2dldF9yZWdpc3RlcgotICoKLSAqIFBBUkFNRVRFUlM6ICByZWdpc3Rlcl9pZCAgICAgLSBJRCBvZiBBQ1BJIGJpdF9yZWdpc3RlciB0byBhY2Nlc3MKLSAqICAgICAgICAgICAgICByZXR1cm5fdmFsdWUgICAgLSBWYWx1ZSB0aGF0IHdhcyByZWFkIGZyb20gdGhlIHJlZ2lzdGVyCi0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cyBhbmQgdGhlIHZhbHVlIHJlYWQgZnJvbSBzcGVjaWZpZWQgUmVnaXN0ZXIuIFZhbHVlCi0gKiAgICAgICAgICAgICAgcmV0dXJuZWQgaXMgbm9ybWFsaXplZCB0byBiaXQwIChpcyBzaGlmdGVkIGFsbCB0aGUgd2F5IHJpZ2h0KQotICoKLSAqIERFU0NSSVBUSU9OOiBBQ1BJIGJpdF9yZWdpc3RlciByZWFkIGZ1bmN0aW9uLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWFjcGlfc3RhdHVzIGFjcGlfZ2V0X3JlZ2lzdGVyX3VubG9ja2VkKHUzMiByZWdpc3Rlcl9pZCwgdTMyICogcmV0dXJuX3ZhbHVlKQotewotCXUzMiByZWdpc3Rlcl92YWx1ZSA9IDA7Ci0Jc3RydWN0IGFjcGlfYml0X3JlZ2lzdGVyX2luZm8gKmJpdF9yZWdfaW5mbzsKLQlhY3BpX3N0YXR1cyBzdGF0dXM7Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGFjcGlfZ2V0X3JlZ2lzdGVyKTsKLQotCS8qIEdldCB0aGUgaW5mbyBzdHJ1Y3R1cmUgY29ycmVzcG9uZGluZyB0byB0aGUgcmVxdWVzdGVkIEFDUEkgUmVnaXN0ZXIgKi8KLQotCWJpdF9yZWdfaW5mbyA9IGFjcGlfaHdfZ2V0X2JpdF9yZWdpc3Rlcl9pbmZvKHJlZ2lzdGVyX2lkKTsKLQlpZiAoIWJpdF9yZWdfaW5mbykgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX1BBUkFNRVRFUik7Ci0JfQotCi0JLyogUmVhZCBmcm9tIHRoZSByZWdpc3RlciAqLwotCi0Jc3RhdHVzID0gYWNwaV9od19yZWdpc3Rlcl9yZWFkKGJpdF9yZWdfaW5mby0+cGFyZW50X3JlZ2lzdGVyLAotCQkJCSAgICAgICAmcmVnaXN0ZXJfdmFsdWUpOwotCi0JaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKSB7Ci0KLQkJLyogTm9ybWFsaXplIHRoZSB2YWx1ZSB0aGF0IHdhcyByZWFkICovCi0KLQkJcmVnaXN0ZXJfdmFsdWUgPQotCQkgICAgKChyZWdpc3Rlcl92YWx1ZSAmIGJpdF9yZWdfaW5mby0+YWNjZXNzX2JpdF9tYXNrKQotCQkgICAgID4+IGJpdF9yZWdfaW5mby0+Yml0X3Bvc2l0aW9uKTsKLQotCQkqcmV0dXJuX3ZhbHVlID0gcmVnaXN0ZXJfdmFsdWU7Ci0KLQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTywgIlJlYWQgdmFsdWUgJTguOFggcmVnaXN0ZXIgJVhcbiIsCi0JCQkJICByZWdpc3Rlcl92YWx1ZSwKLQkJCQkgIGJpdF9yZWdfaW5mby0+cGFyZW50X3JlZ2lzdGVyKSk7Ci0JfQotCi0JcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci19Ci0KLWFjcGlfc3RhdHVzIGFjcGlfZ2V0X3JlZ2lzdGVyKHUzMiByZWdpc3Rlcl9pZCwgdTMyICogcmV0dXJuX3ZhbHVlKQotewotCWFjcGlfc3RhdHVzIHN0YXR1czsKLQlhY3BpX2NwdV9mbGFncyBmbGFnczsKLQlmbGFncyA9IGFjcGlfb3NfYWNxdWlyZV9sb2NrKGFjcGlfZ2JsX2hhcmR3YXJlX2xvY2spOwotCXN0YXR1cyA9IGFjcGlfZ2V0X3JlZ2lzdGVyX3VubG9ja2VkKHJlZ2lzdGVyX2lkLCByZXR1cm5fdmFsdWUpOwotCWFjcGlfb3NfcmVsZWFzZV9sb2NrKGFjcGlfZ2JsX2hhcmR3YXJlX2xvY2ssIGZsYWdzKTsKLQlyZXR1cm4gc3RhdHVzOwotfQotCi1BQ1BJX0VYUE9SVF9TWU1CT0woYWNwaV9nZXRfcmVnaXN0ZXIpCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfc2V0X3JlZ2lzdGVyCi0gKgotICogUEFSQU1FVEVSUzogIHJlZ2lzdGVyX2lkICAgICAtIElEIG9mIEFDUEkgYml0X3JlZ2lzdGVyIHRvIGFjY2VzcwotICogICAgICAgICAgICAgIFZhbHVlICAgICAgICAgICAtIChvbmx5IHVzZWQgb24gd3JpdGUpIHZhbHVlIHRvIHdyaXRlIHRvIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZ2lzdGVyLCBOT1QgcHJlLW5vcm1hbGl6ZWQgdG8gdGhlIGJpdCBwb3MKLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IEFDUEkgQml0IFJlZ2lzdGVyIHdyaXRlIGZ1bmN0aW9uLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1hY3BpX3N0YXR1cyBhY3BpX3NldF9yZWdpc3Rlcih1MzIgcmVnaXN0ZXJfaWQsIHUzMiB2YWx1ZSkKLXsKLQl1MzIgcmVnaXN0ZXJfdmFsdWUgPSAwOwotCXN0cnVjdCBhY3BpX2JpdF9yZWdpc3Rlcl9pbmZvICpiaXRfcmVnX2luZm87Ci0JYWNwaV9zdGF0dXMgc3RhdHVzOwotCWFjcGlfY3B1X2ZsYWdzIGxvY2tfZmxhZ3M7Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1UzMihhY3BpX3NldF9yZWdpc3RlciwgcmVnaXN0ZXJfaWQpOwotCi0JLyogR2V0IHRoZSBpbmZvIHN0cnVjdHVyZSBjb3JyZXNwb25kaW5nIHRvIHRoZSByZXF1ZXN0ZWQgQUNQSSBSZWdpc3RlciAqLwotCi0JYml0X3JlZ19pbmZvID0gYWNwaV9od19nZXRfYml0X3JlZ2lzdGVyX2luZm8ocmVnaXN0ZXJfaWQpOwotCWlmICghYml0X3JlZ19pbmZvKSB7Ci0JCUFDUElfRVJST1IoKEFFX0lORk8sICJCYWQgQUNQSSBIVyBSZWdpc3RlcklkOiAlWCIsCi0JCQkgICAgcmVnaXN0ZXJfaWQpKTsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9QQVJBTUVURVIpOwotCX0KLQotCWxvY2tfZmxhZ3MgPSBhY3BpX29zX2FjcXVpcmVfbG9jayhhY3BpX2dibF9oYXJkd2FyZV9sb2NrKTsKLQotCS8qIEFsd2F5cyBkbyBhIHJlZ2lzdGVyIHJlYWQgZmlyc3Qgc28gd2UgY2FuIGluc2VydCB0aGUgbmV3IGJpdHMgICovCi0KLQlzdGF0dXMgPSBhY3BpX2h3X3JlZ2lzdGVyX3JlYWQoYml0X3JlZ19pbmZvLT5wYXJlbnRfcmVnaXN0ZXIsCi0JCQkJICAgICAgICZyZWdpc3Rlcl92YWx1ZSk7Ci0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCWdvdG8gdW5sb2NrX2FuZF9leGl0OwotCX0KLQotCS8qCi0JICogRGVjb2RlIHRoZSBSZWdpc3RlciBJRAotCSAqIFJlZ2lzdGVyIElEID0gW1JlZ2lzdGVyIGJsb2NrIElEXSB8IFtiaXQgSURdCi0JICoKLQkgKiBDaGVjayBiaXQgSUQgdG8gZmluZSBsb2NhdGUgUmVnaXN0ZXIgb2Zmc2V0LgotCSAqIENoZWNrIE1hc2sgdG8gZGV0ZXJtaW5lIFJlZ2lzdGVyIG9mZnNldCwgYW5kIHRoZW4gcmVhZC13cml0ZS4KLQkgKi8KLQlzd2l0Y2ggKGJpdF9yZWdfaW5mby0+cGFyZW50X3JlZ2lzdGVyKSB7Ci0JY2FzZSBBQ1BJX1JFR0lTVEVSX1BNMV9TVEFUVVM6Ci0KLQkJLyoKLQkJICogU3RhdHVzIFJlZ2lzdGVycyBhcmUgZGlmZmVyZW50IGZyb20gdGhlIHJlc3QuIENsZWFyIGJ5Ci0JCSAqIHdyaXRpbmcgMSwgYW5kIHdyaXRpbmcgMCBoYXMgbm8gZWZmZWN0LiBTbywgdGhlIG9ubHkgcmVsZXZhbnQKLQkJICogaW5mb3JtYXRpb24gaXMgdGhlIHNpbmdsZSBiaXQgd2UncmUgaW50ZXJlc3RlZCBpbiwgYWxsIG90aGVycyBzaG91bGQKLQkJICogYmUgd3JpdHRlbiBhcyAwIHNvIHRoZXkgd2lsbCBiZSBsZWZ0IHVuY2hhbmdlZC4KLQkJICovCi0JCXZhbHVlID0gQUNQSV9SRUdJU1RFUl9QUkVQQVJFX0JJVFModmFsdWUsCi0JCQkJCQkgICBiaXRfcmVnX2luZm8tPmJpdF9wb3NpdGlvbiwKLQkJCQkJCSAgIGJpdF9yZWdfaW5mby0+Ci0JCQkJCQkgICBhY2Nlc3NfYml0X21hc2spOwotCQlpZiAodmFsdWUpIHsKLQkJCXN0YXR1cyA9IGFjcGlfaHdfcmVnaXN0ZXJfd3JpdGUoQUNQSV9SRUdJU1RFUl9QTTFfU1RBVFVTLAotCQkJCQkJCSh1MTYpIHZhbHVlKTsKLQkJCXJlZ2lzdGVyX3ZhbHVlID0gMDsKLQkJfQotCQlicmVhazsKLQotCWNhc2UgQUNQSV9SRUdJU1RFUl9QTTFfRU5BQkxFOgotCi0JCUFDUElfUkVHSVNURVJfSU5TRVJUX1ZBTFVFKHJlZ2lzdGVyX3ZhbHVlLAotCQkJCQkgICBiaXRfcmVnX2luZm8tPmJpdF9wb3NpdGlvbiwKLQkJCQkJICAgYml0X3JlZ19pbmZvLT5hY2Nlc3NfYml0X21hc2ssCi0JCQkJCSAgIHZhbHVlKTsKLQotCQlzdGF0dXMgPSBhY3BpX2h3X3JlZ2lzdGVyX3dyaXRlKEFDUElfUkVHSVNURVJfUE0xX0VOQUJMRSwKLQkJCQkJCSh1MTYpIHJlZ2lzdGVyX3ZhbHVlKTsKLQkJYnJlYWs7Ci0KLQljYXNlIEFDUElfUkVHSVNURVJfUE0xX0NPTlRST0w6Ci0KLQkJLyoKLQkJICogV3JpdGUgdGhlIFBNMSBDb250cm9sIHJlZ2lzdGVyLgotCQkgKiBOb3RlIHRoYXQgYXQgdGhpcyBsZXZlbCwgdGhlIGZhY3QgdGhhdCB0aGVyZSBhcmUgYWN0dWFsbHkgVFdPCi0JCSAqIHJlZ2lzdGVycyAoQSBhbmQgQiAtIGFuZCBCIG1heSBub3QgZXhpc3QpIGlzIGFic3RyYWN0ZWQuCi0JCSAqLwotCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lPLCAiUE0xIGNvbnRyb2w6IFJlYWQgJVhcbiIsCi0JCQkJICByZWdpc3Rlcl92YWx1ZSkpOwotCi0JCUFDUElfUkVHSVNURVJfSU5TRVJUX1ZBTFVFKHJlZ2lzdGVyX3ZhbHVlLAotCQkJCQkgICBiaXRfcmVnX2luZm8tPmJpdF9wb3NpdGlvbiwKLQkJCQkJICAgYml0X3JlZ19pbmZvLT5hY2Nlc3NfYml0X21hc2ssCi0JCQkJCSAgIHZhbHVlKTsKLQotCQlzdGF0dXMgPSBhY3BpX2h3X3JlZ2lzdGVyX3dyaXRlKEFDUElfUkVHSVNURVJfUE0xX0NPTlRST0wsCi0JCQkJCQkodTE2KSByZWdpc3Rlcl92YWx1ZSk7Ci0JCWJyZWFrOwotCi0JY2FzZSBBQ1BJX1JFR0lTVEVSX1BNMl9DT05UUk9MOgotCi0JCXN0YXR1cyA9IGFjcGlfaHdfcmVnaXN0ZXJfcmVhZChBQ1BJX1JFR0lTVEVSX1BNMl9DT05UUk9MLAotCQkJCQkgICAgICAgJnJlZ2lzdGVyX3ZhbHVlKTsKLQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCQlnb3RvIHVubG9ja19hbmRfZXhpdDsKLQkJfQotCi0JCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU8sCi0JCQkJICAiUE0yIGNvbnRyb2w6IFJlYWQgJVggZnJvbSAlOC44WCU4LjhYXG4iLAotCQkJCSAgcmVnaXN0ZXJfdmFsdWUsCi0JCQkJICBBQ1BJX0ZPUk1BVF9VSU5UNjQoYWNwaV9nYmxfRkFEVC4KLQkJCQkJCSAgICAgeHBtMl9jb250cm9sX2Jsb2NrLgotCQkJCQkJICAgICBhZGRyZXNzKSkpOwotCi0JCUFDUElfUkVHSVNURVJfSU5TRVJUX1ZBTFVFKHJlZ2lzdGVyX3ZhbHVlLAotCQkJCQkgICBiaXRfcmVnX2luZm8tPmJpdF9wb3NpdGlvbiwKLQkJCQkJICAgYml0X3JlZ19pbmZvLT5hY2Nlc3NfYml0X21hc2ssCi0JCQkJCSAgIHZhbHVlKTsKLQotCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lPLAotCQkJCSAgIkFib3V0IHRvIHdyaXRlICU0LjRYIHRvICU4LjhYJTguOFhcbiIsCi0JCQkJICByZWdpc3Rlcl92YWx1ZSwKLQkJCQkgIEFDUElfRk9STUFUX1VJTlQ2NChhY3BpX2dibF9GQURULgotCQkJCQkJICAgICB4cG0yX2NvbnRyb2xfYmxvY2suCi0JCQkJCQkgICAgIGFkZHJlc3MpKSk7Ci0KLQkJc3RhdHVzID0gYWNwaV9od19yZWdpc3Rlcl93cml0ZShBQ1BJX1JFR0lTVEVSX1BNMl9DT05UUk9MLAotCQkJCQkJKHU4KSAocmVnaXN0ZXJfdmFsdWUpKTsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlicmVhazsKLQl9Ci0KLSAgICAgIHVubG9ja19hbmRfZXhpdDoKLQotCWFjcGlfb3NfcmVsZWFzZV9sb2NrKGFjcGlfZ2JsX2hhcmR3YXJlX2xvY2ssIGxvY2tfZmxhZ3MpOwotCi0JLyogTm9ybWFsaXplIHRoZSB2YWx1ZSB0aGF0IHdhcyByZWFkICovCi0KLQlBQ1BJX0RFQlVHX0VYRUMocmVnaXN0ZXJfdmFsdWUgPQotCQkJKChyZWdpc3Rlcl92YWx1ZSAmIGJpdF9yZWdfaW5mby0+YWNjZXNzX2JpdF9tYXNrKSA+PgotCQkJIGJpdF9yZWdfaW5mby0+Yml0X3Bvc2l0aW9uKSk7Ci0KLQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lPLAotCQkJICAiU2V0IGJpdHM6ICU4LjhYIGFjdHVhbCAlOC44WCByZWdpc3RlciAlWFxuIiwgdmFsdWUsCi0JCQkgIHJlZ2lzdGVyX3ZhbHVlLCBiaXRfcmVnX2luZm8tPnBhcmVudF9yZWdpc3RlcikpOwotCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotfQotCi1BQ1BJX0VYUE9SVF9TWU1CT0woYWNwaV9zZXRfcmVnaXN0ZXIpCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9od19yZWdpc3Rlcl9yZWFkCi0gKgotICogUEFSQU1FVEVSUzogIHJlZ2lzdGVyX2lkICAgICAgICAgLSBBQ1BJIFJlZ2lzdGVyIElECi0gKiAgICAgICAgICAgICAgcmV0dXJuX3ZhbHVlICAgICAgICAtIFdoZXJlIHRoZSByZWdpc3RlciB2YWx1ZSBpcyByZXR1cm5lZAotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMgYW5kIHRoZSB2YWx1ZSByZWFkLgotICoKLSAqIERFU0NSSVBUSU9OOiBSZWFkIGZyb20gdGhlIHNwZWNpZmllZCBBQ1BJIHJlZ2lzdGVyCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWFjcGlfc3RhdHVzCi1hY3BpX2h3X3JlZ2lzdGVyX3JlYWQodTMyIHJlZ2lzdGVyX2lkLCB1MzIgKiByZXR1cm5fdmFsdWUpCi17Ci0JdTMyIHZhbHVlMSA9IDA7Ci0JdTMyIHZhbHVlMiA9IDA7Ci0JYWNwaV9zdGF0dXMgc3RhdHVzOwotCi0JQUNQSV9GVU5DVElPTl9UUkFDRShod19yZWdpc3Rlcl9yZWFkKTsKLQotCXN3aXRjaCAocmVnaXN0ZXJfaWQpIHsKLQljYXNlIEFDUElfUkVHSVNURVJfUE0xX1NUQVRVUzoJLyogMTYtYml0IGFjY2VzcyAqLwotCi0JCXN0YXR1cyA9Ci0JCSAgICBhY3BpX2h3X2xvd19sZXZlbF9yZWFkKDE2LCAmdmFsdWUxLAotCQkJCQkgICAmYWNwaV9nYmxfRkFEVC54cG0xYV9ldmVudF9ibG9jayk7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQkJZ290byBleGl0OwotCQl9Ci0KLQkJLyogUE0xQiBpcyBvcHRpb25hbCAqLwotCi0JCXN0YXR1cyA9Ci0JCSAgICBhY3BpX2h3X2xvd19sZXZlbF9yZWFkKDE2LCAmdmFsdWUyLAotCQkJCQkgICAmYWNwaV9nYmxfRkFEVC54cG0xYl9ldmVudF9ibG9jayk7Ci0JCXZhbHVlMSB8PSB2YWx1ZTI7Ci0JCWJyZWFrOwotCi0JY2FzZSBBQ1BJX1JFR0lTVEVSX1BNMV9FTkFCTEU6CS8qIDE2LWJpdCBhY2Nlc3MgKi8KLQotCQlzdGF0dXMgPQotCQkgICAgYWNwaV9od19sb3dfbGV2ZWxfcmVhZCgxNiwgJnZhbHVlMSwgJmFjcGlfZ2JsX3hwbTFhX2VuYWJsZSk7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQkJZ290byBleGl0OwotCQl9Ci0KLQkJLyogUE0xQiBpcyBvcHRpb25hbCAqLwotCi0JCXN0YXR1cyA9Ci0JCSAgICBhY3BpX2h3X2xvd19sZXZlbF9yZWFkKDE2LCAmdmFsdWUyLCAmYWNwaV9nYmxfeHBtMWJfZW5hYmxlKTsKLQkJdmFsdWUxIHw9IHZhbHVlMjsKLQkJYnJlYWs7Ci0KLQljYXNlIEFDUElfUkVHSVNURVJfUE0xX0NPTlRST0w6CS8qIDE2LWJpdCBhY2Nlc3MgKi8KLQotCQlzdGF0dXMgPQotCQkgICAgYWNwaV9od19sb3dfbGV2ZWxfcmVhZCgxNiwgJnZhbHVlMSwKLQkJCQkJICAgJmFjcGlfZ2JsX0ZBRFQueHBtMWFfY29udHJvbF9ibG9jayk7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQkJZ290byBleGl0OwotCQl9Ci0KLQkJc3RhdHVzID0KLQkJICAgIGFjcGlfaHdfbG93X2xldmVsX3JlYWQoMTYsICZ2YWx1ZTIsCi0JCQkJCSAgICZhY3BpX2dibF9GQURULnhwbTFiX2NvbnRyb2xfYmxvY2spOwotCQl2YWx1ZTEgfD0gdmFsdWUyOwotCQlicmVhazsKLQotCWNhc2UgQUNQSV9SRUdJU1RFUl9QTTJfQ09OVFJPTDoJLyogOC1iaXQgYWNjZXNzICovCi0KLQkJc3RhdHVzID0KLQkJICAgIGFjcGlfaHdfbG93X2xldmVsX3JlYWQoOCwgJnZhbHVlMSwKLQkJCQkJICAgJmFjcGlfZ2JsX0ZBRFQueHBtMl9jb250cm9sX2Jsb2NrKTsKLQkJYnJlYWs7Ci0KLQljYXNlIEFDUElfUkVHSVNURVJfUE1fVElNRVI6CS8qIDMyLWJpdCBhY2Nlc3MgKi8KLQotCQlzdGF0dXMgPQotCQkgICAgYWNwaV9od19sb3dfbGV2ZWxfcmVhZCgzMiwgJnZhbHVlMSwKLQkJCQkJICAgJmFjcGlfZ2JsX0ZBRFQueHBtX3RpbWVyX2Jsb2NrKTsKLQkJYnJlYWs7Ci0KLQljYXNlIEFDUElfUkVHSVNURVJfU01JX0NPTU1BTkRfQkxPQ0s6CS8qIDgtYml0IGFjY2VzcyAqLwotCi0JCXN0YXR1cyA9Ci0JCSAgICBhY3BpX29zX3JlYWRfcG9ydChhY3BpX2dibF9GQURULnNtaV9jb21tYW5kLCAmdmFsdWUxLCA4KTsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlBQ1BJX0VSUk9SKChBRV9JTkZPLCAiVW5rbm93biBSZWdpc3RlciBJRDogJVgiLCByZWdpc3Rlcl9pZCkpOwotCQlzdGF0dXMgPSBBRV9CQURfUEFSQU1FVEVSOwotCQlicmVhazsKLQl9Ci0KLSAgICAgIGV4aXQ6Ci0KLQlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpIHsKLQkJKnJldHVybl92YWx1ZSA9IHZhbHVlMTsKLQl9Ci0KLQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX2h3X3JlZ2lzdGVyX3dyaXRlCi0gKgotICogUEFSQU1FVEVSUzogIHJlZ2lzdGVyX2lkICAgICAgICAgLSBBQ1BJIFJlZ2lzdGVyIElECi0gKiAgICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgICAtIFRoZSB2YWx1ZSB0byB3cml0ZQotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKLSAqCi0gKiBERVNDUklQVElPTjogV3JpdGUgdG8gdGhlIHNwZWNpZmllZCBBQ1BJIHJlZ2lzdGVyCi0gKgotICogTk9URTogSW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBBQ1BJIHNwZWNpZmljYXRpb24sIHRoaXMgZnVuY3Rpb24gYXV0b21hdGljYWxseQotICogcHJlc2VydmVzIHRoZSB2YWx1ZSBvZiB0aGUgZm9sbG93aW5nIGJpdHMsIG1lYW5pbmcgdGhhdCB0aGVzZSBiaXRzIGNhbm5vdCBiZQotICogY2hhbmdlZCB2aWEgdGhpcyBpbnRlcmZhY2U6Ci0gKgotICogUE0xX0NPTlRST0xbMF0gPSBTQ0lfRU4KLSAqIFBNMV9DT05UUk9MWzldCi0gKiBQTTFfU1RBVFVTWzExXQotICoKLSAqIEFDUEkgUmVmZXJlbmNlczoKLSAqIDEpIEhhcmR3YXJlIElnbm9yZWQgQml0czogV2hlbiBzb2Z0d2FyZSB3cml0ZXMgdG8gYSByZWdpc3RlciB3aXRoIGlnbm9yZWQKLSAqICAgICAgYml0IGZpZWxkcywgaXQgcHJlc2VydmVzIHRoZSBpZ25vcmVkIGJpdCBmaWVsZHMKLSAqIDIpIFNDSV9FTjogT1NQTSBhbHdheXMgcHJlc2VydmVzIHRoaXMgYml0IHBvc2l0aW9uCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotYWNwaV9zdGF0dXMgYWNwaV9od19yZWdpc3Rlcl93cml0ZSh1MzIgcmVnaXN0ZXJfaWQsIHUzMiB2YWx1ZSkKLXsKLQlhY3BpX3N0YXR1cyBzdGF0dXM7Ci0JdTMyIHJlYWRfdmFsdWU7Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGh3X3JlZ2lzdGVyX3dyaXRlKTsKLQotCXN3aXRjaCAocmVnaXN0ZXJfaWQpIHsKLQljYXNlIEFDUElfUkVHSVNURVJfUE0xX1NUQVRVUzoJLyogMTYtYml0IGFjY2VzcyAqLwotCi0JCS8qIFBlcmZvcm0gYSByZWFkIGZpcnN0IHRvIHByZXNlcnZlIGNlcnRhaW4gYml0cyAocGVyIEFDUEkgc3BlYykgKi8KLQotCQlzdGF0dXMgPSBhY3BpX2h3X3JlZ2lzdGVyX3JlYWQoQUNQSV9SRUdJU1RFUl9QTTFfU1RBVFVTLAotCQkJCQkgICAgICAgJnJlYWRfdmFsdWUpOwotCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJCWdvdG8gZXhpdDsKLQkJfQotCi0JCS8qIEluc2VydCB0aGUgYml0cyB0byBiZSBwcmVzZXJ2ZWQgKi8KLQotCQlBQ1BJX0lOU0VSVF9CSVRTKHZhbHVlLCBBQ1BJX1BNMV9TVEFUVVNfUFJFU0VSVkVEX0JJVFMsCi0JCQkJIHJlYWRfdmFsdWUpOwotCi0JCS8qIE5vdyB3ZSBjYW4gd3JpdGUgdGhlIGRhdGEgKi8KLQotCQlzdGF0dXMgPQotCQkgICAgYWNwaV9od19sb3dfbGV2ZWxfd3JpdGUoMTYsIHZhbHVlLAotCQkJCQkgICAgJmFjcGlfZ2JsX0ZBRFQueHBtMWFfZXZlbnRfYmxvY2spOwotCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJCWdvdG8gZXhpdDsKLQkJfQotCi0JCS8qIFBNMUIgaXMgb3B0aW9uYWwgKi8KLQotCQlzdGF0dXMgPQotCQkgICAgYWNwaV9od19sb3dfbGV2ZWxfd3JpdGUoMTYsIHZhbHVlLAotCQkJCQkgICAgJmFjcGlfZ2JsX0ZBRFQueHBtMWJfZXZlbnRfYmxvY2spOwotCQlicmVhazsKLQotCWNhc2UgQUNQSV9SRUdJU1RFUl9QTTFfRU5BQkxFOgkvKiAxNi1iaXQgYWNjZXNzICovCi0KLQkJc3RhdHVzID0KLQkJICAgIGFjcGlfaHdfbG93X2xldmVsX3dyaXRlKDE2LCB2YWx1ZSwgJmFjcGlfZ2JsX3hwbTFhX2VuYWJsZSk7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQkJZ290byBleGl0OwotCQl9Ci0KLQkJLyogUE0xQiBpcyBvcHRpb25hbCAqLwotCi0JCXN0YXR1cyA9Ci0JCSAgICBhY3BpX2h3X2xvd19sZXZlbF93cml0ZSgxNiwgdmFsdWUsICZhY3BpX2dibF94cG0xYl9lbmFibGUpOwotCQlicmVhazsKLQotCWNhc2UgQUNQSV9SRUdJU1RFUl9QTTFfQ09OVFJPTDoJLyogMTYtYml0IGFjY2VzcyAqLwotCi0JCS8qCi0JCSAqIFBlcmZvcm0gYSByZWFkIGZpcnN0IHRvIHByZXNlcnZlIGNlcnRhaW4gYml0cyAocGVyIEFDUEkgc3BlYykKLQkJICovCi0JCXN0YXR1cyA9IGFjcGlfaHdfcmVnaXN0ZXJfcmVhZChBQ1BJX1JFR0lTVEVSX1BNMV9DT05UUk9MLAotCQkJCQkgICAgICAgJnJlYWRfdmFsdWUpOwotCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJCWdvdG8gZXhpdDsKLQkJfQotCi0JCS8qIEluc2VydCB0aGUgYml0cyB0byBiZSBwcmVzZXJ2ZWQgKi8KLQotCQlBQ1BJX0lOU0VSVF9CSVRTKHZhbHVlLCBBQ1BJX1BNMV9DT05UUk9MX1BSRVNFUlZFRF9CSVRTLAotCQkJCSByZWFkX3ZhbHVlKTsKLQotCQkvKiBOb3cgd2UgY2FuIHdyaXRlIHRoZSBkYXRhICovCi0KLQkJc3RhdHVzID0KLQkJICAgIGFjcGlfaHdfbG93X2xldmVsX3dyaXRlKDE2LCB2YWx1ZSwKLQkJCQkJICAgICZhY3BpX2dibF9GQURULnhwbTFhX2NvbnRyb2xfYmxvY2spOwotCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJCWdvdG8gZXhpdDsKLQkJfQotCi0JCXN0YXR1cyA9Ci0JCSAgICBhY3BpX2h3X2xvd19sZXZlbF93cml0ZSgxNiwgdmFsdWUsCi0JCQkJCSAgICAmYWNwaV9nYmxfRkFEVC54cG0xYl9jb250cm9sX2Jsb2NrKTsKLQkJYnJlYWs7Ci0KLQljYXNlIEFDUElfUkVHSVNURVJfUE0xQV9DT05UUk9MOgkvKiAxNi1iaXQgYWNjZXNzICovCi0KLQkJc3RhdHVzID0KLQkJICAgIGFjcGlfaHdfbG93X2xldmVsX3dyaXRlKDE2LCB2YWx1ZSwKLQkJCQkJICAgICZhY3BpX2dibF9GQURULnhwbTFhX2NvbnRyb2xfYmxvY2spOwotCQlicmVhazsKLQotCWNhc2UgQUNQSV9SRUdJU1RFUl9QTTFCX0NPTlRST0w6CS8qIDE2LWJpdCBhY2Nlc3MgKi8KLQotCQlzdGF0dXMgPQotCQkgICAgYWNwaV9od19sb3dfbGV2ZWxfd3JpdGUoMTYsIHZhbHVlLAotCQkJCQkgICAgJmFjcGlfZ2JsX0ZBRFQueHBtMWJfY29udHJvbF9ibG9jayk7Ci0JCWJyZWFrOwotCi0JY2FzZSBBQ1BJX1JFR0lTVEVSX1BNMl9DT05UUk9MOgkvKiA4LWJpdCBhY2Nlc3MgKi8KLQotCQlzdGF0dXMgPQotCQkgICAgYWNwaV9od19sb3dfbGV2ZWxfd3JpdGUoOCwgdmFsdWUsCi0JCQkJCSAgICAmYWNwaV9nYmxfRkFEVC54cG0yX2NvbnRyb2xfYmxvY2spOwotCQlicmVhazsKLQotCWNhc2UgQUNQSV9SRUdJU1RFUl9QTV9USU1FUjoJLyogMzItYml0IGFjY2VzcyAqLwotCi0JCXN0YXR1cyA9Ci0JCSAgICBhY3BpX2h3X2xvd19sZXZlbF93cml0ZSgzMiwgdmFsdWUsCi0JCQkJCSAgICAmYWNwaV9nYmxfRkFEVC54cG1fdGltZXJfYmxvY2spOwotCQlicmVhazsKLQotCWNhc2UgQUNQSV9SRUdJU1RFUl9TTUlfQ09NTUFORF9CTE9DSzoJLyogOC1iaXQgYWNjZXNzICovCi0KLQkJLyogU01JX0NNRCBpcyBjdXJyZW50bHkgYWx3YXlzIGluIElPIHNwYWNlICovCi0KLQkJc3RhdHVzID0KLQkJICAgIGFjcGlfb3Nfd3JpdGVfcG9ydChhY3BpX2dibF9GQURULnNtaV9jb21tYW5kLCB2YWx1ZSwgOCk7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJc3RhdHVzID0gQUVfQkFEX1BBUkFNRVRFUjsKLQkJYnJlYWs7Ci0JfQotCi0gICAgICBleGl0OgotCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfaHdfbG93X2xldmVsX3JlYWQKLSAqCi0gKiBQQVJBTUVURVJTOiAgV2lkdGggICAgICAgICAgICAgICAtIDgsIDE2LCBvciAzMgotICogICAgICAgICAgICAgIFZhbHVlICAgICAgICAgICAgICAgLSBXaGVyZSB0aGUgdmFsdWUgaXMgcmV0dXJuZWQKLSAqICAgICAgICAgICAgICBSZWcgICAgICAgICAgICAgICAgIC0gR0FTIHJlZ2lzdGVyIHN0cnVjdHVyZQotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKLSAqCi0gKiBERVNDUklQVElPTjogUmVhZCBmcm9tIGVpdGhlciBtZW1vcnkgb3IgSU8gc3BhY2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotYWNwaV9zdGF0dXMKLWFjcGlfaHdfbG93X2xldmVsX3JlYWQodTMyIHdpZHRoLCB1MzIgKiB2YWx1ZSwgc3RydWN0IGFjcGlfZ2VuZXJpY19hZGRyZXNzICpyZWcpCi17Ci0JdTY0IGFkZHJlc3M7Ci0JYWNwaV9zdGF0dXMgc3RhdHVzOwotCi0JQUNQSV9GVU5DVElPTl9OQU1FKGh3X2xvd19sZXZlbF9yZWFkKTsKLQotCS8qCi0JICogTXVzdCBoYXZlIGEgdmFsaWQgcG9pbnRlciB0byBhIEdBUyBzdHJ1Y3R1cmUsIGFuZAotCSAqIGEgbm9uLXplcm8gYWRkcmVzcyB3aXRoaW4uIEhvd2V2ZXIsIGRvbid0IHJldHVybiBhbiBlcnJvcgotCSAqIGJlY2F1c2UgdGhlIFBNMUEvQiBjb2RlIG11c3Qgbm90IGZhaWwgaWYgQiBpc24ndCBwcmVzZW50LgotCSAqLwotCWlmICghcmVnKSB7Ci0JCXJldHVybiAoQUVfT0spOwotCX0KLQotCS8qIEdldCBhIGxvY2FsIGNvcHkgb2YgdGhlIGFkZHJlc3MuIEhhbmRsZXMgcG9zc2libGUgYWxpZ25tZW50IGlzc3VlcyAqLwotCi0JQUNQSV9NT1ZFXzY0X1RPXzY0KCZhZGRyZXNzLCAmcmVnLT5hZGRyZXNzKTsKLQlpZiAoIWFkZHJlc3MpIHsKLQkJcmV0dXJuIChBRV9PSyk7Ci0JfQotCSp2YWx1ZSA9IDA7Ci0KLQkvKgotCSAqIFR3byBhZGRyZXNzIHNwYWNlcyBzdXBwb3J0ZWQ6IE1lbW9yeSBvciBJTy4KLQkgKiBQQ0lfQ29uZmlnIGlzIG5vdCBzdXBwb3J0ZWQgaGVyZSBiZWNhdXNlIHRoZSBHQVMgc3RydWN0IGlzIGluc3VmZmljaWVudAotCSAqLwotCXN3aXRjaCAocmVnLT5zcGFjZV9pZCkgewotCWNhc2UgQUNQSV9BRFJfU1BBQ0VfU1lTVEVNX01FTU9SWToKLQotCQlzdGF0dXMgPSBhY3BpX29zX3JlYWRfbWVtb3J5KChhY3BpX3BoeXNpY2FsX2FkZHJlc3MpIGFkZHJlc3MsCi0JCQkJCSAgICAgdmFsdWUsIHdpZHRoKTsKLQkJYnJlYWs7Ci0KLQljYXNlIEFDUElfQURSX1NQQUNFX1NZU1RFTV9JTzoKLQotCQlzdGF0dXMgPQotCQkgICAgYWNwaV9vc19yZWFkX3BvcnQoKGFjcGlfaW9fYWRkcmVzcykgYWRkcmVzcywgdmFsdWUsIHdpZHRoKTsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlBQ1BJX0VSUk9SKChBRV9JTkZPLAotCQkJICAgICJVbnN1cHBvcnRlZCBhZGRyZXNzIHNwYWNlOiAlWCIsIHJlZy0+c3BhY2VfaWQpKTsKLQkJcmV0dXJuIChBRV9CQURfUEFSQU1FVEVSKTsKLQl9Ci0KLQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lPLAotCQkJICAiUmVhZDogICU4LjhYIHdpZHRoICUyZCBmcm9tICU4LjhYJTguOFggKCVzKVxuIiwKLQkJCSAgKnZhbHVlLCB3aWR0aCwgQUNQSV9GT1JNQVRfVUlOVDY0KGFkZHJlc3MpLAotCQkJICBhY3BpX3V0X2dldF9yZWdpb25fbmFtZShyZWctPnNwYWNlX2lkKSkpOwotCi0JcmV0dXJuIChzdGF0dXMpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfaHdfbG93X2xldmVsX3dyaXRlCi0gKgotICogUEFSQU1FVEVSUzogIFdpZHRoICAgICAgICAgICAgICAgLSA4LCAxNiwgb3IgMzIKLSAqICAgICAgICAgICAgICBWYWx1ZSAgICAgICAgICAgICAgIC0gVG8gYmUgd3JpdHRlbgotICogICAgICAgICAgICAgIFJlZyAgICAgICAgICAgICAgICAgLSBHQVMgcmVnaXN0ZXIgc3RydWN0dXJlCi0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cwotICoKLSAqIERFU0NSSVBUSU9OOiBXcml0ZSB0byBlaXRoZXIgbWVtb3J5IG9yIElPIHNwYWNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWFjcGlfc3RhdHVzCi1hY3BpX2h3X2xvd19sZXZlbF93cml0ZSh1MzIgd2lkdGgsIHUzMiB2YWx1ZSwgc3RydWN0IGFjcGlfZ2VuZXJpY19hZGRyZXNzICogcmVnKQotewotCXU2NCBhZGRyZXNzOwotCWFjcGlfc3RhdHVzIHN0YXR1czsKLQotCUFDUElfRlVOQ1RJT05fTkFNRShod19sb3dfbGV2ZWxfd3JpdGUpOwotCi0JLyoKLQkgKiBNdXN0IGhhdmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgR0FTIHN0cnVjdHVyZSwgYW5kCi0JICogYSBub24temVybyBhZGRyZXNzIHdpdGhpbi4gSG93ZXZlciwgZG9uJ3QgcmV0dXJuIGFuIGVycm9yCi0JICogYmVjYXVzZSB0aGUgUE0xQS9CIGNvZGUgbXVzdCBub3QgZmFpbCBpZiBCIGlzbid0IHByZXNlbnQuCi0JICovCi0JaWYgKCFyZWcpIHsKLQkJcmV0dXJuIChBRV9PSyk7Ci0JfQotCi0JLyogR2V0IGEgbG9jYWwgY29weSBvZiB0aGUgYWRkcmVzcy4gSGFuZGxlcyBwb3NzaWJsZSBhbGlnbm1lbnQgaXNzdWVzICovCi0KLQlBQ1BJX01PVkVfNjRfVE9fNjQoJmFkZHJlc3MsICZyZWctPmFkZHJlc3MpOwotCWlmICghYWRkcmVzcykgewotCQlyZXR1cm4gKEFFX09LKTsKLQl9Ci0KLQkvKgotCSAqIFR3byBhZGRyZXNzIHNwYWNlcyBzdXBwb3J0ZWQ6IE1lbW9yeSBvciBJTy4KLQkgKiBQQ0lfQ29uZmlnIGlzIG5vdCBzdXBwb3J0ZWQgaGVyZSBiZWNhdXNlIHRoZSBHQVMgc3RydWN0IGlzIGluc3VmZmljaWVudAotCSAqLwotCXN3aXRjaCAocmVnLT5zcGFjZV9pZCkgewotCWNhc2UgQUNQSV9BRFJfU1BBQ0VfU1lTVEVNX01FTU9SWToKLQotCQlzdGF0dXMgPSBhY3BpX29zX3dyaXRlX21lbW9yeSgoYWNwaV9waHlzaWNhbF9hZGRyZXNzKSBhZGRyZXNzLAotCQkJCQkgICAgICB2YWx1ZSwgd2lkdGgpOwotCQlicmVhazsKLQotCWNhc2UgQUNQSV9BRFJfU1BBQ0VfU1lTVEVNX0lPOgotCi0JCXN0YXR1cyA9IGFjcGlfb3Nfd3JpdGVfcG9ydCgoYWNwaV9pb19hZGRyZXNzKSBhZGRyZXNzLCB2YWx1ZSwKLQkJCQkJICAgIHdpZHRoKTsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlBQ1BJX0VSUk9SKChBRV9JTkZPLAotCQkJICAgICJVbnN1cHBvcnRlZCBhZGRyZXNzIHNwYWNlOiAlWCIsIHJlZy0+c3BhY2VfaWQpKTsKLQkJcmV0dXJuIChBRV9CQURfUEFSQU1FVEVSKTsKLQl9Ci0KLQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lPLAotCQkJICAiV3JvdGU6ICU4LjhYIHdpZHRoICUyZCAgIHRvICU4LjhYJTguOFggKCVzKVxuIiwKLQkJCSAgdmFsdWUsIHdpZHRoLCBBQ1BJX0ZPUk1BVF9VSU5UNjQoYWRkcmVzcyksCi0JCQkgIGFjcGlfdXRfZ2V0X3JlZ2lvbl9uYW1lKHJlZy0+c3BhY2VfaWQpKSk7Ci0KLQlyZXR1cm4gKHN0YXR1cyk7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvaGFyZHdhcmUvaHdzbGVlcC5jIGIvZHJpdmVycy9hY3BpL2hhcmR3YXJlL2h3c2xlZXAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjVkY2NkZi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL2FjcGkvaGFyZHdhcmUvaHdzbGVlcC5jCisrKyAvZGV2L251bGwKQEAgLTEsNjQzICswLDAgQEAKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIE5hbWU6IGh3c2xlZXAuYyAtIEFDUEkgSGFyZHdhcmUgU2xlZXAvV2FrZSBJbnRlcmZhY2UKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA4LCBJbnRlbCBDb3JwLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAotICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgYXQgbWluaW11bSBhIGRpc2NsYWltZXIKLSAqICAgIHN1YnN0YW50aWFsbHkgc2ltaWxhciB0byB0aGUgIk5PIFdBUlJBTlRZIiBkaXNjbGFpbWVyIGJlbG93Ci0gKiAgICAoIkRpc2NsYWltZXIiKSBhbmQgYW55IHJlZGlzdHJpYnV0aW9uIG11c3QgYmUgY29uZGl0aW9uZWQgdXBvbgotICogICAgaW5jbHVkaW5nIGEgc3Vic3RhbnRpYWxseSBzaW1pbGFyIERpc2NsYWltZXIgcmVxdWlyZW1lbnQgZm9yIGZ1cnRoZXIKLSAqICAgIGJpbmFyeSByZWRpc3RyaWJ1dGlvbi4KLSAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcwotICogICAgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICogU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBOTyBXQVJSQU5UWQotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCi0gKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUwotICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcKLSAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQotICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgotICovCi0KLSNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KLSNpbmNsdWRlIDxhY3BpL2FjdGFibGVzLmg+Ci0KLSNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX0hBUkRXQVJFCi1BQ1BJX01PRFVMRV9OQU1FKCJod3NsZWVwIikKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9zZXRfZmlybXdhcmVfd2FraW5nX3ZlY3RvcgotICoKLSAqIFBBUkFNRVRFUlM6ICBwaHlzaWNhbF9hZGRyZXNzICAgIC0gUGh5c2ljYWwgYWRkcmVzcyBvZiBBQ1BJIHJlYWwgbW9kZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeSBwb2ludC4KLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IEFjY2VzcyBmdW5jdGlvbiBmb3IgdGhlIGZpcm13YXJlX3dha2luZ192ZWN0b3IgZmllbGQgaW4gRkFDUwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1hY3BpX3N0YXR1cwotYWNwaV9zZXRfZmlybXdhcmVfd2FraW5nX3ZlY3RvcihhY3BpX3BoeXNpY2FsX2FkZHJlc3MgcGh5c2ljYWxfYWRkcmVzcykKLXsKLQlzdHJ1Y3QgYWNwaV90YWJsZV9mYWNzICpmYWNzOwotCWFjcGlfc3RhdHVzIHN0YXR1czsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UoYWNwaV9zZXRfZmlybXdhcmVfd2FraW5nX3ZlY3Rvcik7Ci0KLQkvKiBHZXQgdGhlIEZBQ1MgKi8KLQotCXN0YXR1cyA9IGFjcGlfZ2V0X3RhYmxlX2J5X2luZGV4KEFDUElfVEFCTEVfSU5ERVhfRkFDUywKLQkJCQkJIEFDUElfQ0FTVF9JTkRJUkVDVF9QVFIoc3RydWN0Ci0JCQkJCQkJCWFjcGlfdGFibGVfaGVhZGVyLAotCQkJCQkJCQkmZmFjcykpOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLQl9Ci0KLQkvKgotCSAqIEFjY29yZGluZyB0byB0aGUgQUNQSSBzcGVjaWZpY2F0aW9uIDIuMGMgYW5kIGxhdGVyLCB0aGUgNjQtYml0Ci0JICogd2FraW5nIHZlY3RvciBzaG91bGQgYmUgY2xlYXJlZCBhbmQgdGhlIDMyLWJpdCB3YWtpbmcgdmVjdG9yIHNob3VsZAotCSAqIGJlIHVzZWQsIHVubGVzcyB3ZSB3YW50IHRoZSB3YWtlLXVwIGNvZGUgdG8gYmUgY2FsbGVkIGJ5IHRoZSBCSU9TIGluCi0JICogUHJvdGVjdGVkIE1vZGUuICBTb21lIHN5c3RlbXMgKGZvciBleGFtcGxlIEhQIGR2NS0xMDA0bnIpIGFyZSBrbm93bgotCSAqIHRvIGZhaWwgdG8gcmVzdW1lIGlmIHRoZSA2NC1iaXQgdmVjdG9yIGlzIHVzZWQuCi0JICovCi0JaWYgKGZhY3MtPnZlcnNpb24gPj0gMSkKLQkJZmFjcy0+eGZpcm13YXJlX3dha2luZ192ZWN0b3IgPSAwOwotCi0JZmFjcy0+ZmlybXdhcmVfd2FraW5nX3ZlY3RvciA9ICh1MzIpcGh5c2ljYWxfYWRkcmVzczsKLQotCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7Ci19Ci0KLUFDUElfRVhQT1JUX1NZTUJPTChhY3BpX3NldF9maXJtd2FyZV93YWtpbmdfdmVjdG9yKQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX2dldF9maXJtd2FyZV93YWtpbmdfdmVjdG9yCi0gKgotICogUEFSQU1FVEVSUzogICpwaHlzaWNhbF9hZGRyZXNzICAgLSBXaGVyZSB0aGUgY29udGVudHMgb2YKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGZpcm13YXJlX3dha2luZ192ZWN0b3IgZmllbGQgb2YKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIEZBQ1Mgd2lsbCBiZSByZXR1cm5lZC4KLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzLCB2ZWN0b3IKLSAqCi0gKiBERVNDUklQVElPTjogQWNjZXNzIGZ1bmN0aW9uIGZvciB0aGUgZmlybXdhcmVfd2FraW5nX3ZlY3RvciBmaWVsZCBpbiBGQUNTCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZmRlZiBBQ1BJX0ZVVFVSRV9VU0FHRQotYWNwaV9zdGF0dXMKLWFjcGlfZ2V0X2Zpcm13YXJlX3dha2luZ192ZWN0b3IoYWNwaV9waHlzaWNhbF9hZGRyZXNzICogcGh5c2ljYWxfYWRkcmVzcykKLXsKLQlzdHJ1Y3QgYWNwaV90YWJsZV9mYWNzICpmYWNzOwotCWFjcGlfc3RhdHVzIHN0YXR1czsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UoYWNwaV9nZXRfZmlybXdhcmVfd2FraW5nX3ZlY3Rvcik7Ci0KLQlpZiAoIXBoeXNpY2FsX2FkZHJlc3MpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9QQVJBTUVURVIpOwotCX0KLQotCS8qIEdldCB0aGUgRkFDUyAqLwotCi0Jc3RhdHVzID0gYWNwaV9nZXRfdGFibGVfYnlfaW5kZXgoQUNQSV9UQUJMRV9JTkRFWF9GQUNTLAotCQkJCQkgQUNQSV9DQVNUX0lORElSRUNUX1BUUihzdHJ1Y3QKLQkJCQkJCQkJYWNwaV90YWJsZV9oZWFkZXIsCi0JCQkJCQkJCSZmYWNzKSk7Ci0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotCX0KLQotCS8qIEdldCB0aGUgdmVjdG9yICovCi0JKnBoeXNpY2FsX2FkZHJlc3MgPSAoYWNwaV9waHlzaWNhbF9hZGRyZXNzKWZhY3MtPmZpcm13YXJlX3dha2luZ192ZWN0b3I7Ci0KLQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwotfQotCi1BQ1BJX0VYUE9SVF9TWU1CT0woYWNwaV9nZXRfZmlybXdhcmVfd2FraW5nX3ZlY3RvcikKLSNlbmRpZgotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9lbnRlcl9zbGVlcF9zdGF0ZV9wcmVwCi0gKgotICogUEFSQU1FVEVSUzogIHNsZWVwX3N0YXRlICAgICAgICAgLSBXaGljaCBzbGVlcCBzdGF0ZSB0byBlbnRlcgotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKLSAqCi0gKiBERVNDUklQVElPTjogUHJlcGFyZSB0byBlbnRlciBhIHN5c3RlbSBzbGVlcCBzdGF0ZSAoc2VlIEFDUEkgMi4wIHNwZWMgcCAyMzEpCi0gKiAgICAgICAgICAgICAgVGhpcyBmdW5jdGlvbiBtdXN0IGV4ZWN1dGUgd2l0aCBpbnRlcnJ1cHRzIGVuYWJsZWQuCi0gKiAgICAgICAgICAgICAgV2UgYnJlYWsgc2xlZXBpbmcgaW50byAyIHN0YWdlcyBzbyB0aGF0IE9TUE0gY2FuIGhhbmRsZQotICogICAgICAgICAgICAgIHZhcmlvdXMgT1Mtc3BlY2lmaWMgdGFza3MgYmV0d2VlbiB0aGUgdHdvIHN0ZXBzLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1hY3BpX3N0YXR1cyBhY3BpX2VudGVyX3NsZWVwX3N0YXRlX3ByZXAodTggc2xlZXBfc3RhdGUpCi17Ci0JYWNwaV9zdGF0dXMgc3RhdHVzOwotCXN0cnVjdCBhY3BpX29iamVjdF9saXN0IGFyZ19saXN0OwotCXVuaW9uIGFjcGlfb2JqZWN0IGFyZzsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UoYWNwaV9lbnRlcl9zbGVlcF9zdGF0ZV9wcmVwKTsKLQotCS8qCi0JICogX1BTVyBtZXRob2RzIGNvdWxkIGJlIHJ1biBoZXJlIHRvIGVuYWJsZSB3YWtlLW9uIGtleWJvYXJkLCBMQU4sIGV0Yy4KLQkgKi8KLQlzdGF0dXMgPSBhY3BpX2dldF9zbGVlcF90eXBlX2RhdGEoc2xlZXBfc3RhdGUsCi0JCQkJCSAgJmFjcGlfZ2JsX3NsZWVwX3R5cGVfYSwKLQkJCQkJICAmYWNwaV9nYmxfc2xlZXBfdHlwZV9iKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci0JfQotCi0JLyogU2V0dXAgcGFyYW1ldGVyIG9iamVjdCAqLwotCi0JYXJnX2xpc3QuY291bnQgPSAxOwotCWFyZ19saXN0LnBvaW50ZXIgPSAmYXJnOwotCi0JYXJnLnR5cGUgPSBBQ1BJX1RZUEVfSU5URUdFUjsKLQlhcmcuaW50ZWdlci52YWx1ZSA9IHNsZWVwX3N0YXRlOwotCi0JLyogUnVuIHRoZSBfUFRTIG1ldGhvZCAqLwotCi0Jc3RhdHVzID0gYWNwaV9ldmFsdWF0ZV9vYmplY3QoTlVMTCwgTUVUSE9EX05BTUVfX1BUUywgJmFyZ19saXN0LCBOVUxMKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykgJiYgc3RhdHVzICE9IEFFX05PVF9GT1VORCkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLQl9Ci0KLQkvKiBTZXR1cCB0aGUgYXJndW1lbnQgdG8gX1NTVCAqLwotCi0Jc3dpdGNoIChzbGVlcF9zdGF0ZSkgewotCWNhc2UgQUNQSV9TVEFURV9TMDoKLQkJYXJnLmludGVnZXIudmFsdWUgPSBBQ1BJX1NTVF9XT1JLSU5HOwotCQlicmVhazsKLQotCWNhc2UgQUNQSV9TVEFURV9TMToKLQljYXNlIEFDUElfU1RBVEVfUzI6Ci0JY2FzZSBBQ1BJX1NUQVRFX1MzOgotCQlhcmcuaW50ZWdlci52YWx1ZSA9IEFDUElfU1NUX1NMRUVQSU5HOwotCQlicmVhazsKLQotCWNhc2UgQUNQSV9TVEFURV9TNDoKLQkJYXJnLmludGVnZXIudmFsdWUgPSBBQ1BJX1NTVF9TTEVFUF9DT05URVhUOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCWFyZy5pbnRlZ2VyLnZhbHVlID0gQUNQSV9TU1RfSU5ESUNBVE9SX09GRjsJLyogRGVmYXVsdCBpcyBvZmYgKi8KLQkJYnJlYWs7Ci0JfQotCi0JLyoKLQkgKiBTZXQgdGhlIHN5c3RlbSBpbmRpY2F0b3JzIHRvIHNob3cgdGhlIGRlc2lyZWQgc2xlZXAgc3RhdGUuCi0JICogX1NTVCBpcyBhbiBvcHRpb25hbCBtZXRob2QgKHJldHVybiBubyBlcnJvciBpZiBub3QgZm91bmQpCi0JICovCi0Jc3RhdHVzID0gYWNwaV9ldmFsdWF0ZV9vYmplY3QoTlVMTCwgTUVUSE9EX05BTUVfX1NTVCwgJmFyZ19saXN0LCBOVUxMKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykgJiYgc3RhdHVzICE9IEFFX05PVF9GT1VORCkgewotCQlBQ1BJX0VYQ0VQVElPTigoQUVfSU5GTywgc3RhdHVzLAotCQkJCSJXaGlsZSBleGVjdXRpbmcgbWV0aG9kIF9TU1QiKSk7Ci0JfQotCi0JcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKLX0KLQotQUNQSV9FWFBPUlRfU1lNQk9MKGFjcGlfZW50ZXJfc2xlZXBfc3RhdGVfcHJlcCkKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9lbnRlcl9zbGVlcF9zdGF0ZQotICoKLSAqIFBBUkFNRVRFUlM6ICBzbGVlcF9zdGF0ZSAgICAgICAgIC0gV2hpY2ggc2xlZXAgc3RhdGUgdG8gZW50ZXIKLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IEVudGVyIGEgc3lzdGVtIHNsZWVwIHN0YXRlIChzZWUgQUNQSSAyLjAgc3BlYyBwIDIzMSkKLSAqICAgICAgICAgICAgICBUSElTIEZVTkNUSU9OIE1VU1QgQkUgQ0FMTEVEIFdJVEggSU5URVJSVVBUUyBESVNBQkxFRAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1hY3BpX3N0YXR1cyBhc21saW5rYWdlIGFjcGlfZW50ZXJfc2xlZXBfc3RhdGUodTggc2xlZXBfc3RhdGUpCi17Ci0JdTMyIFBNMUFjb250cm9sOwotCXUzMiBQTTFCY29udHJvbDsKLQlzdHJ1Y3QgYWNwaV9iaXRfcmVnaXN0ZXJfaW5mbyAqc2xlZXBfdHlwZV9yZWdfaW5mbzsKLQlzdHJ1Y3QgYWNwaV9iaXRfcmVnaXN0ZXJfaW5mbyAqc2xlZXBfZW5hYmxlX3JlZ19pbmZvOwotCXUzMiBpbl92YWx1ZTsKLQlzdHJ1Y3QgYWNwaV9vYmplY3RfbGlzdCBhcmdfbGlzdDsKLQl1bmlvbiBhY3BpX29iamVjdCBhcmc7Ci0JYWNwaV9zdGF0dXMgc3RhdHVzOwotCi0JQUNQSV9GVU5DVElPTl9UUkFDRShhY3BpX2VudGVyX3NsZWVwX3N0YXRlKTsKLQotCWlmICgoYWNwaV9nYmxfc2xlZXBfdHlwZV9hID4gQUNQSV9TTEVFUF9UWVBFX01BWCkgfHwKLQkgICAgKGFjcGlfZ2JsX3NsZWVwX3R5cGVfYiA+IEFDUElfU0xFRVBfVFlQRV9NQVgpKSB7Ci0JCUFDUElfRVJST1IoKEFFX0lORk8sICJTbGVlcCB2YWx1ZXMgb3V0IG9mIHJhbmdlOiBBPSVYIEI9JVgiLAotCQkJICAgIGFjcGlfZ2JsX3NsZWVwX3R5cGVfYSwgYWNwaV9nYmxfc2xlZXBfdHlwZV9iKSk7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfT1BFUkFORF9WQUxVRSk7Ci0JfQotCi0Jc2xlZXBfdHlwZV9yZWdfaW5mbyA9Ci0JICAgIGFjcGlfaHdfZ2V0X2JpdF9yZWdpc3Rlcl9pbmZvKEFDUElfQklUUkVHX1NMRUVQX1RZUEVfQSk7Ci0Jc2xlZXBfZW5hYmxlX3JlZ19pbmZvID0KLQkgICAgYWNwaV9od19nZXRfYml0X3JlZ2lzdGVyX2luZm8oQUNQSV9CSVRSRUdfU0xFRVBfRU5BQkxFKTsKLQotCS8qIENsZWFyIHdha2Ugc3RhdHVzICovCi0KLQlzdGF0dXMgPSBhY3BpX3NldF9yZWdpc3RlcihBQ1BJX0JJVFJFR19XQUtFX1NUQVRVUywgMSk7Ci0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotCX0KLQotCS8qIENsZWFyIGFsbCBmaXhlZCBhbmQgZ2VuZXJhbCBwdXJwb3NlIHN0YXR1cyBiaXRzICovCi0KLQlzdGF0dXMgPSBhY3BpX2h3X2NsZWFyX2FjcGlfc3RhdHVzKCk7Ci0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotCX0KLQotCS8qCi0JICogMSkgRGlzYWJsZS9DbGVhciBhbGwgR1BFcwotCSAqIDIpIEVuYWJsZSBhbGwgd2FrZXVwIEdQRXMKLQkgKi8KLQlzdGF0dXMgPSBhY3BpX2h3X2Rpc2FibGVfYWxsX2dwZXMoKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci0JfQotCWFjcGlfZ2JsX3N5c3RlbV9hd2FrZV9hbmRfcnVubmluZyA9IEZBTFNFOwotCi0Jc3RhdHVzID0gYWNwaV9od19lbmFibGVfYWxsX3dha2V1cF9ncGVzKCk7Ci0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotCX0KLQotCS8qIEV4ZWN1dGUgdGhlIF9HVFMgbWV0aG9kICovCi0KLQlhcmdfbGlzdC5jb3VudCA9IDE7Ci0JYXJnX2xpc3QucG9pbnRlciA9ICZhcmc7Ci0JYXJnLnR5cGUgPSBBQ1BJX1RZUEVfSU5URUdFUjsKLQlhcmcuaW50ZWdlci52YWx1ZSA9IHNsZWVwX3N0YXRlOwotCi0Jc3RhdHVzID0gYWNwaV9ldmFsdWF0ZV9vYmplY3QoTlVMTCwgTUVUSE9EX05BTUVfX0dUUywgJmFyZ19saXN0LCBOVUxMKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykgJiYgc3RhdHVzICE9IEFFX05PVF9GT1VORCkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLQl9Ci0KLQkvKiBHZXQgY3VycmVudCB2YWx1ZSBvZiBQTTFBIGNvbnRyb2wgKi8KLQotCXN0YXR1cyA9IGFjcGlfaHdfcmVnaXN0ZXJfcmVhZChBQ1BJX1JFR0lTVEVSX1BNMV9DT05UUk9MLCAmUE0xQWNvbnRyb2wpOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLQl9Ci0JQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTklULAotCQkJICAiRW50ZXJpbmcgc2xlZXAgc3RhdGUgW1MlZF1cbiIsIHNsZWVwX3N0YXRlKSk7Ci0KLQkvKiBDbGVhciBTTFBfRU4gYW5kIFNMUF9UWVAgZmllbGRzICovCi0KLQlQTTFBY29udHJvbCAmPSB+KHNsZWVwX3R5cGVfcmVnX2luZm8tPmFjY2Vzc19iaXRfbWFzayB8Ci0JCQkgc2xlZXBfZW5hYmxlX3JlZ19pbmZvLT5hY2Nlc3NfYml0X21hc2spOwotCVBNMUJjb250cm9sID0gUE0xQWNvbnRyb2w7Ci0KLQkvKiBJbnNlcnQgU0xQX1RZUCBiaXRzICovCi0KLQlQTTFBY29udHJvbCB8PQotCSAgICAoYWNwaV9nYmxfc2xlZXBfdHlwZV9hIDw8IHNsZWVwX3R5cGVfcmVnX2luZm8tPmJpdF9wb3NpdGlvbik7Ci0JUE0xQmNvbnRyb2wgfD0KLQkgICAgKGFjcGlfZ2JsX3NsZWVwX3R5cGVfYiA8PCBzbGVlcF90eXBlX3JlZ19pbmZvLT5iaXRfcG9zaXRpb24pOwotCi0JLyoKLQkgKiBXZSBzcGxpdCB0aGUgd3JpdGVzIG9mIFNMUF9UWVAgYW5kIFNMUF9FTiB0byB3b3JrYXJvdW5kCi0JICogcG9vcmx5IGltcGxlbWVudGVkIGhhcmR3YXJlLgotCSAqLwotCi0JLyogV3JpdGUgIzE6IGZpbGwgaW4gU0xQX1RZUCBkYXRhICovCi0KLQlzdGF0dXMgPSBhY3BpX2h3X3JlZ2lzdGVyX3dyaXRlKEFDUElfUkVHSVNURVJfUE0xQV9DT05UUk9MLAotCQkJCQlQTTFBY29udHJvbCk7Ci0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotCX0KLQotCXN0YXR1cyA9IGFjcGlfaHdfcmVnaXN0ZXJfd3JpdGUoQUNQSV9SRUdJU1RFUl9QTTFCX0NPTlRST0wsCi0JCQkJCVBNMUJjb250cm9sKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci0JfQotCi0JLyogSW5zZXJ0IFNMUF9FTkFCTEUgYml0ICovCi0KLQlQTTFBY29udHJvbCB8PSBzbGVlcF9lbmFibGVfcmVnX2luZm8tPmFjY2Vzc19iaXRfbWFzazsKLQlQTTFCY29udHJvbCB8PSBzbGVlcF9lbmFibGVfcmVnX2luZm8tPmFjY2Vzc19iaXRfbWFzazsKLQotCS8qIFdyaXRlICMyOiBTTFBfVFlQICsgU0xQX0VOICovCi0KLQlBQ1BJX0ZMVVNIX0NQVV9DQUNIRSgpOwotCi0Jc3RhdHVzID0gYWNwaV9od19yZWdpc3Rlcl93cml0ZShBQ1BJX1JFR0lTVEVSX1BNMUFfQ09OVFJPTCwKLQkJCQkJUE0xQWNvbnRyb2wpOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLQl9Ci0KLQlzdGF0dXMgPSBhY3BpX2h3X3JlZ2lzdGVyX3dyaXRlKEFDUElfUkVHSVNURVJfUE0xQl9DT05UUk9MLAotCQkJCQlQTTFCY29udHJvbCk7Ci0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotCX0KLQotCWlmIChzbGVlcF9zdGF0ZSA+IEFDUElfU1RBVEVfUzMpIHsKLQkJLyoKLQkJICogV2Ugd2FudGVkIHRvIHNsZWVwID4gUzMsIGJ1dCBpdCBkaWRuJ3QgaGFwcGVuIChieSB2aXJ0dWUgb2YgdGhlCi0JCSAqIGZhY3QgdGhhdCB3ZSBhcmUgc3RpbGwgZXhlY3V0aW5nISkKLQkJICoKLQkJICogV2FpdCB0ZW4gc2Vjb25kcywgdGhlbiB0cnkgYWdhaW4uIFRoaXMgaXMgdG8gZ2V0IFM0L1M1IHRvIHdvcmsgb24KLQkJICogYWxsIG1hY2hpbmVzLgotCQkgKgotCQkgKiBXZSB3YWl0IHNvIGxvbmcgdG8gYWxsb3cgY2hpcHNldHMgdGhhdCBwb2xsIHRoaXMgcmVnIHZlcnkgc2xvd2x5IHRvCi0JCSAqIHN0aWxsIHJlYWQgdGhlIHJpZ2h0IHZhbHVlLiBJZGVhbGx5LCB0aGlzIGJsb2NrIHdvdWxkIGdvCi0JCSAqIGF3YXkgZW50aXJlbHkuCi0JCSAqLwotCQlhY3BpX29zX3N0YWxsKDEwMDAwMDAwKTsKLQotCQlzdGF0dXMgPSBhY3BpX2h3X3JlZ2lzdGVyX3dyaXRlKEFDUElfUkVHSVNURVJfUE0xX0NPTlRST0wsCi0JCQkJCQlzbGVlcF9lbmFibGVfcmVnX2luZm8tPgotCQkJCQkJYWNjZXNzX2JpdF9tYXNrKTsKLQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLQkJfQotCX0KLQotCS8qIFdhaXQgdW50aWwgd2UgZW50ZXIgc2xlZXAgc3RhdGUgKi8KLQotCWRvIHsKLQkJc3RhdHVzID0gYWNwaV9nZXRfcmVnaXN0ZXJfdW5sb2NrZWQoQUNQSV9CSVRSRUdfV0FLRV9TVEFUVVMsCi0JCQkJCQkgICAgJmluX3ZhbHVlKTsKLQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLQkJfQotCi0JCS8qIFNwaW4gdW50aWwgd2Ugd2FrZSAqLwotCi0JfSB3aGlsZSAoIWluX3ZhbHVlKTsKLQotCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7Ci19Ci0KLUFDUElfRVhQT1JUX1NZTUJPTChhY3BpX2VudGVyX3NsZWVwX3N0YXRlKQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX2VudGVyX3NsZWVwX3N0YXRlX3M0YmlvcwotICoKLSAqIFBBUkFNRVRFUlM6ICBOb25lCi0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cwotICoKLSAqIERFU0NSSVBUSU9OOiBQZXJmb3JtIGEgUzQgYmlvcyByZXF1ZXN0LgotICogICAgICAgICAgICAgIFRISVMgRlVOQ1RJT04gTVVTVCBCRSBDQUxMRUQgV0lUSCBJTlRFUlJVUFRTIERJU0FCTEVECi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWFjcGlfc3RhdHVzIGFzbWxpbmthZ2UgYWNwaV9lbnRlcl9zbGVlcF9zdGF0ZV9zNGJpb3Modm9pZCkKLXsKLQl1MzIgaW5fdmFsdWU7Ci0JYWNwaV9zdGF0dXMgc3RhdHVzOwotCi0JQUNQSV9GVU5DVElPTl9UUkFDRShhY3BpX2VudGVyX3NsZWVwX3N0YXRlX3M0Ymlvcyk7Ci0KLQlzdGF0dXMgPSBhY3BpX3NldF9yZWdpc3RlcihBQ1BJX0JJVFJFR19XQUtFX1NUQVRVUywgMSk7Ci0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotCX0KLQotCXN0YXR1cyA9IGFjcGlfaHdfY2xlYXJfYWNwaV9zdGF0dXMoKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci0JfQotCi0JLyoKLQkgKiAxKSBEaXNhYmxlL0NsZWFyIGFsbCBHUEVzCi0JICogMikgRW5hYmxlIGFsbCB3YWtldXAgR1BFcwotCSAqLwotCXN0YXR1cyA9IGFjcGlfaHdfZGlzYWJsZV9hbGxfZ3BlcygpOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLQl9Ci0JYWNwaV9nYmxfc3lzdGVtX2F3YWtlX2FuZF9ydW5uaW5nID0gRkFMU0U7Ci0KLQlzdGF0dXMgPSBhY3BpX2h3X2VuYWJsZV9hbGxfd2FrZXVwX2dwZXMoKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci0JfQotCi0JQUNQSV9GTFVTSF9DUFVfQ0FDSEUoKTsKLQotCXN0YXR1cyA9IGFjcGlfb3Nfd3JpdGVfcG9ydChhY3BpX2dibF9GQURULnNtaV9jb21tYW5kLAotCQkJCSAgICAodTMyKSBhY3BpX2dibF9GQURULlM0Ymlvc19yZXF1ZXN0LCA4KTsKLQotCWRvIHsKLQkJYWNwaV9vc19zdGFsbCgxMDAwKTsKLQkJc3RhdHVzID0gYWNwaV9nZXRfcmVnaXN0ZXIoQUNQSV9CSVRSRUdfV0FLRV9TVEFUVVMsICZpbl92YWx1ZSk7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci0JCX0KLQl9IHdoaWxlICghaW5fdmFsdWUpOwotCi0JcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKLX0KLQotQUNQSV9FWFBPUlRfU1lNQk9MKGFjcGlfZW50ZXJfc2xlZXBfc3RhdGVfczRiaW9zKQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX2xlYXZlX3NsZWVwX3N0YXRlX3ByZXAKLSAqCi0gKiBQQVJBTUVURVJTOiAgc2xlZXBfc3RhdGUgICAgICAgICAtIFdoaWNoIHNsZWVwIHN0YXRlIHdlIGFyZSBleGl0aW5nCi0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cwotICoKLSAqIERFU0NSSVBUSU9OOiBQZXJmb3JtIHRoZSBmaXJzdCBzdGF0ZSBvZiBPUy1pbmRlcGVuZGVudCBBQ1BJIGNsZWFudXAgYWZ0ZXIgYQotICogICAgICAgICAgICAgIHNsZWVwLgotICogICAgICAgICAgICAgIENhbGxlZCB3aXRoIGludGVycnVwdHMgRElTQUJMRUQuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWFjcGlfc3RhdHVzIGFjcGlfbGVhdmVfc2xlZXBfc3RhdGVfcHJlcCh1OCBzbGVlcF9zdGF0ZSkKLXsKLQlzdHJ1Y3QgYWNwaV9vYmplY3RfbGlzdCBhcmdfbGlzdDsKLQl1bmlvbiBhY3BpX29iamVjdCBhcmc7Ci0JYWNwaV9zdGF0dXMgc3RhdHVzOwotCXN0cnVjdCBhY3BpX2JpdF9yZWdpc3Rlcl9pbmZvICpzbGVlcF90eXBlX3JlZ19pbmZvOwotCXN0cnVjdCBhY3BpX2JpdF9yZWdpc3Rlcl9pbmZvICpzbGVlcF9lbmFibGVfcmVnX2luZm87Ci0JdTMyIFBNMUFjb250cm9sOwotCXUzMiBQTTFCY29udHJvbDsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UoYWNwaV9sZWF2ZV9zbGVlcF9zdGF0ZV9wcmVwKTsKLQotCS8qCi0JICogU2V0IFNMUF9UWVBFIGFuZCBTTFBfRU4gdG8gc3RhdGUgUzAuCi0JICogVGhpcyBpcyB1bmNsZWFyIGZyb20gdGhlIEFDUEkgU3BlYywgYnV0IGl0IGlzIHJlcXVpcmVkCi0JICogYnkgc29tZSBtYWNoaW5lcy4KLQkgKi8KLQlzdGF0dXMgPSBhY3BpX2dldF9zbGVlcF90eXBlX2RhdGEoQUNQSV9TVEFURV9TMCwKLQkJCQkJICAmYWNwaV9nYmxfc2xlZXBfdHlwZV9hLAotCQkJCQkgICZhY3BpX2dibF9zbGVlcF90eXBlX2IpOwotCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkgewotCQlzbGVlcF90eXBlX3JlZ19pbmZvID0KLQkJICAgIGFjcGlfaHdfZ2V0X2JpdF9yZWdpc3Rlcl9pbmZvKEFDUElfQklUUkVHX1NMRUVQX1RZUEVfQSk7Ci0JCXNsZWVwX2VuYWJsZV9yZWdfaW5mbyA9Ci0JCSAgICBhY3BpX2h3X2dldF9iaXRfcmVnaXN0ZXJfaW5mbyhBQ1BJX0JJVFJFR19TTEVFUF9FTkFCTEUpOwotCi0JCS8qIEdldCBjdXJyZW50IHZhbHVlIG9mIFBNMUEgY29udHJvbCAqLwotCi0JCXN0YXR1cyA9IGFjcGlfaHdfcmVnaXN0ZXJfcmVhZChBQ1BJX1JFR0lTVEVSX1BNMV9DT05UUk9MLAotCQkJCQkgICAgICAgJlBNMUFjb250cm9sKTsKLQkJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKSB7Ci0KLQkJCS8qIENsZWFyIFNMUF9FTiBhbmQgU0xQX1RZUCBmaWVsZHMgKi8KLQotCQkJUE0xQWNvbnRyb2wgJj0gfihzbGVlcF90eXBlX3JlZ19pbmZvLT5hY2Nlc3NfYml0X21hc2sgfAotCQkJCQkgc2xlZXBfZW5hYmxlX3JlZ19pbmZvLT4KLQkJCQkJIGFjY2Vzc19iaXRfbWFzayk7Ci0JCQlQTTFCY29udHJvbCA9IFBNMUFjb250cm9sOwotCi0JCQkvKiBJbnNlcnQgU0xQX1RZUCBiaXRzICovCi0KLQkJCVBNMUFjb250cm9sIHw9Ci0JCQkgICAgKGFjcGlfZ2JsX3NsZWVwX3R5cGVfYSA8PCBzbGVlcF90eXBlX3JlZ19pbmZvLT4KLQkJCSAgICAgYml0X3Bvc2l0aW9uKTsKLQkJCVBNMUJjb250cm9sIHw9Ci0JCQkgICAgKGFjcGlfZ2JsX3NsZWVwX3R5cGVfYiA8PCBzbGVlcF90eXBlX3JlZ19pbmZvLT4KLQkJCSAgICAgYml0X3Bvc2l0aW9uKTsKLQotCQkJLyogSnVzdCBpZ25vcmUgYW55IGVycm9ycyAqLwotCi0JCQkodm9pZClhY3BpX2h3X3JlZ2lzdGVyX3dyaXRlKEFDUElfUkVHSVNURVJfUE0xQV9DT05UUk9MLAotCQkJCQkJICAgICBQTTFBY29udHJvbCk7Ci0JCQkodm9pZClhY3BpX2h3X3JlZ2lzdGVyX3dyaXRlKEFDUElfUkVHSVNURVJfUE0xQl9DT05UUk9MLAotCQkJCQkJICAgICBQTTFCY29udHJvbCk7Ci0JCX0KLQl9Ci0KLQkvKiBFeGVjdXRlIHRoZSBfQkZTIG1ldGhvZCAqLwotCi0JYXJnX2xpc3QuY291bnQgPSAxOwotCWFyZ19saXN0LnBvaW50ZXIgPSAmYXJnOwotCWFyZy50eXBlID0gQUNQSV9UWVBFX0lOVEVHRVI7Ci0JYXJnLmludGVnZXIudmFsdWUgPSBzbGVlcF9zdGF0ZTsKLQotCXN0YXR1cyA9IGFjcGlfZXZhbHVhdGVfb2JqZWN0KE5VTEwsIE1FVEhPRF9OQU1FX19CRlMsICZhcmdfbGlzdCwgTlVMTCk7Ci0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpICYmIHN0YXR1cyAhPSBBRV9OT1RfRk9VTkQpIHsKLQkJQUNQSV9FWENFUFRJT04oKEFFX0lORk8sIHN0YXR1cywgIkR1cmluZyBNZXRob2QgX0JGUyIpKTsKLQl9Ci0KLQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9sZWF2ZV9zbGVlcF9zdGF0ZQotICoKLSAqIFBBUkFNRVRFUlM6ICBzbGVlcF9zdGF0ZSAgICAgICAgIC0gV2hpY2ggc2xlZXAgc3RhdGUgd2UganVzdCBleGl0ZWQKLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IFBlcmZvcm0gT1MtaW5kZXBlbmRlbnQgQUNQSSBjbGVhbnVwIGFmdGVyIGEgc2xlZXAKLSAqICAgICAgICAgICAgICBDYWxsZWQgd2l0aCBpbnRlcnJ1cHRzIEVOQUJMRUQuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWFjcGlfc3RhdHVzIGFjcGlfbGVhdmVfc2xlZXBfc3RhdGUodTggc2xlZXBfc3RhdGUpCi17Ci0Jc3RydWN0IGFjcGlfb2JqZWN0X2xpc3QgYXJnX2xpc3Q7Ci0JdW5pb24gYWNwaV9vYmplY3QgYXJnOwotCWFjcGlfc3RhdHVzIHN0YXR1czsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UoYWNwaV9sZWF2ZV9zbGVlcF9zdGF0ZSk7Ci0KLQkvKiBFbnN1cmUgZW50ZXJfc2xlZXBfc3RhdGVfcHJlcCAtPiBlbnRlcl9zbGVlcF9zdGF0ZSBvcmRlcmluZyAqLwotCi0JYWNwaV9nYmxfc2xlZXBfdHlwZV9hID0gQUNQSV9TTEVFUF9UWVBFX0lOVkFMSUQ7Ci0KLQkvKiBTZXR1cCBwYXJhbWV0ZXIgb2JqZWN0ICovCi0KLQlhcmdfbGlzdC5jb3VudCA9IDE7Ci0JYXJnX2xpc3QucG9pbnRlciA9ICZhcmc7Ci0JYXJnLnR5cGUgPSBBQ1BJX1RZUEVfSU5URUdFUjsKLQotCS8qIElnbm9yZSBhbnkgZXJyb3JzIGZyb20gdGhlc2UgbWV0aG9kcyAqLwotCi0JYXJnLmludGVnZXIudmFsdWUgPSBBQ1BJX1NTVF9XQUtJTkc7Ci0Jc3RhdHVzID0gYWNwaV9ldmFsdWF0ZV9vYmplY3QoTlVMTCwgTUVUSE9EX05BTUVfX1NTVCwgJmFyZ19saXN0LCBOVUxMKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykgJiYgc3RhdHVzICE9IEFFX05PVF9GT1VORCkgewotCQlBQ1BJX0VYQ0VQVElPTigoQUVfSU5GTywgc3RhdHVzLCAiRHVyaW5nIE1ldGhvZCBfU1NUIikpOwotCX0KLQotCS8qCi0JICogR1BFcyBtdXN0IGJlIGVuYWJsZWQgYmVmb3JlIF9XQUsgaXMgY2FsbGVkIGFzIEdQRXMKLQkgKiBtaWdodCBnZXQgZmlyZWQgdGhlcmUKLQkgKgotCSAqIFJlc3RvcmUgdGhlIEdQRXM6Ci0JICogMSkgRGlzYWJsZS9DbGVhciBhbGwgR1BFcwotCSAqIDIpIEVuYWJsZSBhbGwgcnVudGltZSBHUEVzCi0JICovCi0Jc3RhdHVzID0gYWNwaV9od19kaXNhYmxlX2FsbF9ncGVzKCk7Ci0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotCX0KLQlzdGF0dXMgPSBhY3BpX2h3X2VuYWJsZV9hbGxfcnVudGltZV9ncGVzKCk7Ci0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotCX0KLQotCWFyZy5pbnRlZ2VyLnZhbHVlID0gc2xlZXBfc3RhdGU7Ci0Jc3RhdHVzID0gYWNwaV9ldmFsdWF0ZV9vYmplY3QoTlVMTCwgTUVUSE9EX05BTUVfX1dBSywgJmFyZ19saXN0LCBOVUxMKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykgJiYgc3RhdHVzICE9IEFFX05PVF9GT1VORCkgewotCQlBQ1BJX0VYQ0VQVElPTigoQUVfSU5GTywgc3RhdHVzLCAiRHVyaW5nIE1ldGhvZCBfV0FLIikpOwotCX0KLQkvKiBUQkQ6IF9XQUsgInNvbWV0aW1lcyIgcmV0dXJucyBzdHVmZiAtIGRvIHdlIHdhbnQgdG8gbG9vayBhdCBpdD8gKi8KLQotCS8qCi0JICogU29tZSBCSU9TZXMgYXNzdW1lIHRoYXQgV0FLX1NUUyB3aWxsIGJlIGNsZWFyZWQgb24gcmVzdW1lIGFuZCB1c2UKLQkgKiBpdCB0byBkZXRlcm1pbmUgd2hldGhlciB0aGUgc3lzdGVtIGlzIHJlYm9vdGluZyBvciByZXN1bWluZy4gQ2xlYXIKLQkgKiBpdCBmb3IgY29tcGF0aWJpbGl0eS4KLQkgKi8KLQlhY3BpX3NldF9yZWdpc3RlcihBQ1BJX0JJVFJFR19XQUtFX1NUQVRVUywgMSk7Ci0KLQlhY3BpX2dibF9zeXN0ZW1fYXdha2VfYW5kX3J1bm5pbmcgPSBUUlVFOwotCi0JLyogRW5hYmxlIHBvd2VyIGJ1dHRvbiAqLwotCi0JKHZvaWQpCi0JICAgIGFjcGlfc2V0X3JlZ2lzdGVyKGFjcGlfZ2JsX2ZpeGVkX2V2ZW50X2luZm8KLQkJCSAgICAgIFtBQ1BJX0VWRU5UX1BPV0VSX0JVVFRPTl0uZW5hYmxlX3JlZ2lzdGVyX2lkLCAxKTsKLQotCSh2b2lkKQotCSAgICBhY3BpX3NldF9yZWdpc3RlcihhY3BpX2dibF9maXhlZF9ldmVudF9pbmZvCi0JCQkgICAgICBbQUNQSV9FVkVOVF9QT1dFUl9CVVRUT05dLnN0YXR1c19yZWdpc3Rlcl9pZCwgMSk7Ci0KLQlhcmcuaW50ZWdlci52YWx1ZSA9IEFDUElfU1NUX1dPUktJTkc7Ci0Jc3RhdHVzID0gYWNwaV9ldmFsdWF0ZV9vYmplY3QoTlVMTCwgTUVUSE9EX05BTUVfX1NTVCwgJmFyZ19saXN0LCBOVUxMKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykgJiYgc3RhdHVzICE9IEFFX05PVF9GT1VORCkgewotCQlBQ1BJX0VYQ0VQVElPTigoQUVfSU5GTywgc3RhdHVzLCAiRHVyaW5nIE1ldGhvZCBfU1NUIikpOwotCX0KLQotCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotfQotCi1BQ1BJX0VYUE9SVF9TWU1CT0woYWNwaV9sZWF2ZV9zbGVlcF9zdGF0ZSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9oYXJkd2FyZS9od3RpbWVyLmMgYi9kcml2ZXJzL2FjcGkvaGFyZHdhcmUvaHd0aW1lci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTNkNTc1Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvYWNwaS9oYXJkd2FyZS9od3RpbWVyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxODcgKzAsMCBAQAotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogTmFtZTogaHd0aW1lci5jIC0gQUNQSSBQb3dlciBNYW5hZ2VtZW50IFRpbWVyIEludGVyZmFjZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDgsIEludGVsIENvcnAuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCi0gKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSBhdCBtaW5pbXVtIGEgZGlzY2xhaW1lcgotICogICAgc3Vic3RhbnRpYWxseSBzaW1pbGFyIHRvIHRoZSAiTk8gV0FSUkFOVFkiIGRpc2NsYWltZXIgYmVsb3cKLSAqICAgICgiRGlzY2xhaW1lciIpIGFuZCBhbnkgcmVkaXN0cmlidXRpb24gbXVzdCBiZSBjb25kaXRpb25lZCB1cG9uCi0gKiAgICBpbmNsdWRpbmcgYSBzdWJzdGFudGlhbGx5IHNpbWlsYXIgRGlzY2xhaW1lciByZXF1aXJlbWVudCBmb3IgZnVydGhlcgotICogICAgYmluYXJ5IHJlZGlzdHJpYnV0aW9uLgotICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzCi0gKiAgICBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIE5PIFdBUlJBTlRZCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKLSAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCi0gKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORwotICogSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCi0gKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCi0gKi8KLQotI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgotCi0jZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9IQVJEV0FSRQotQUNQSV9NT0RVTEVfTkFNRSgiaHd0aW1lciIpCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9nZXRfdGltZXJfcmVzb2x1dGlvbgotICoKLSAqIFBBUkFNRVRFUlM6ICBSZXNvbHV0aW9uICAgICAgICAgIC0gV2hlcmUgdGhlIHJlc29sdXRpb24gaXMgcmV0dXJuZWQKLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzIGFuZCB0aW1lciByZXNvbHV0aW9uCi0gKgotICogREVTQ1JJUFRJT046IE9idGFpbnMgcmVzb2x1dGlvbiBvZiB0aGUgQUNQSSBQTSBUaW1lciAoMjQgb3IgMzIgYml0cykuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWFjcGlfc3RhdHVzIGFjcGlfZ2V0X3RpbWVyX3Jlc29sdXRpb24odTMyICogcmVzb2x1dGlvbikKLXsKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGFjcGlfZ2V0X3RpbWVyX3Jlc29sdXRpb24pOwotCi0JaWYgKCFyZXNvbHV0aW9uKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfUEFSQU1FVEVSKTsKLQl9Ci0KLQlpZiAoKGFjcGlfZ2JsX0ZBRFQuZmxhZ3MgJiBBQ1BJX0ZBRFRfMzJCSVRfVElNRVIpID09IDApIHsKLQkJKnJlc29sdXRpb24gPSAyNDsKLQl9IGVsc2UgewotCQkqcmVzb2x1dGlvbiA9IDMyOwotCX0KLQotCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7Ci19Ci0KLUFDUElfRVhQT1JUX1NZTUJPTChhY3BpX2dldF90aW1lcl9yZXNvbHV0aW9uKQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfZ2V0X3RpbWVyCi0gKgotICogUEFSQU1FVEVSUzogIFRpY2tzICAgICAgICAgICAgICAgLSBXaGVyZSB0aGUgdGltZXIgdmFsdWUgaXMgcmV0dXJuZWQKLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzIGFuZCBjdXJyZW50IHRpbWVyIHZhbHVlICh0aWNrcykKLSAqCi0gKiBERVNDUklQVElPTjogT2J0YWlucyBjdXJyZW50IHZhbHVlIG9mIEFDUEkgUE0gVGltZXIgKGluIHRpY2tzKS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYWNwaV9zdGF0dXMgYWNwaV9nZXRfdGltZXIodTMyICogdGlja3MpCi17Ci0JYWNwaV9zdGF0dXMgc3RhdHVzOwotCi0JQUNQSV9GVU5DVElPTl9UUkFDRShhY3BpX2dldF90aW1lcik7Ci0KLQlpZiAoIXRpY2tzKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfUEFSQU1FVEVSKTsKLQl9Ci0KLQlzdGF0dXMgPQotCSAgICBhY3BpX2h3X2xvd19sZXZlbF9yZWFkKDMyLCB0aWNrcywgJmFjcGlfZ2JsX0ZBRFQueHBtX3RpbWVyX2Jsb2NrKTsKLQotCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotfQotCi1BQ1BJX0VYUE9SVF9TWU1CT0woYWNwaV9nZXRfdGltZXIpCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9nZXRfdGltZXJfZHVyYXRpb24KLSAqCi0gKiBQQVJBTUVURVJTOiAgc3RhcnRfdGlja3MgICAgICAgICAtIFN0YXJ0aW5nIHRpbWVzdGFtcAotICogICAgICAgICAgICAgIGVuZF90aWNrcyAgICAgICAgICAgLSBFbmQgdGltZXN0YW1wCi0gKiAgICAgICAgICAgICAgdGltZV9lbGFwc2VkICAgICAgICAtIFdoZXJlIHRoZSBlbGFwc2VkIHRpbWUgaXMgcmV0dXJuZWQKLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzIGFuZCB0aW1lX2VsYXBzZWQKLSAqCi0gKiBERVNDUklQVElPTjogQ29tcHV0ZXMgdGhlIHRpbWUgZWxhcHNlZCAoaW4gbWljcm9zZWNvbmRzKSBiZXR3ZWVuIHR3bwotICogICAgICAgICAgICAgIFBNIFRpbWVyIHRpbWUgc3RhbXBzLCB0YWtpbmcgaW50byBhY2NvdW50IHRoZSBwb3NzaWJpbGl0eSBvZgotICogICAgICAgICAgICAgIHJvbGxvdmVycywgdGhlIHRpbWVyIHJlc29sdXRpb24sIGFuZCB0aW1lciBmcmVxdWVuY3kuCi0gKgotICogICAgICAgICAgICAgIFRoZSBQTSBUaW1lcidzIGNsb2NrIHRpY2tzIGF0IHJvdWdobHkgMy42IHRpbWVzIHBlcgotICogICAgICAgICAgICAgIF9taWNyb3NlY29uZF8sIGFuZCBpdHMgY2xvY2sgY29udGludWVzIHRocm91Z2ggQ3ggc3RhdGUKLSAqICAgICAgICAgICAgICB0cmFuc2l0aW9ucyAodW5saWtlIG1hbnkgQ1BVIHRpbWVzdGFtcCBjb3VudGVycykgLS0gbWFraW5nIGl0Ci0gKiAgICAgICAgICAgICAgYSB2ZXJzYXRpbGUgYW5kIGFjY3VyYXRlIHRpbWVyLgotICoKLSAqICAgICAgICAgICAgICBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiBhY2NvbW1vZGF0ZXMgb25seSBhIHNpbmdsZSB0aW1lcgotICogICAgICAgICAgICAgIHJvbGxvdmVyLiAgVGh1cyBmb3IgMjQtYml0IHRpbWVycywgdGhpcyBmdW5jdGlvbiBzaG91bGQgb25seQotICogICAgICAgICAgICAgIGJlIHVzZWQgZm9yIGNhbGN1bGF0aW5nIGR1cmF0aW9ucyBsZXNzIHRoYW4gfjQuNiBzZWNvbmRzCi0gKiAgICAgICAgICAgICAgKH4yMCBtaW51dGVzIGZvciAzMi1iaXQgdGltZXJzKSAtLSBjYWxjdWxhdGlvbnMgYmVsb3c6Ci0gKgotICogICAgICAgICAgICAgIDIqKjI0IFRpY2tzIC8gMyw2MDAsMDAwIFRpY2tzL1NlYyA9IDQuNjYgc2VjCi0gKiAgICAgICAgICAgICAgMioqMzIgVGlja3MgLyAzLDYwMCwwMDAgVGlja3MvU2VjID0gMTE5MyBzZWMgb3IgMTkuODggbWludXRlcwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1hY3BpX3N0YXR1cwotYWNwaV9nZXRfdGltZXJfZHVyYXRpb24odTMyIHN0YXJ0X3RpY2tzLCB1MzIgZW5kX3RpY2tzLCB1MzIgKiB0aW1lX2VsYXBzZWQpCi17Ci0JYWNwaV9zdGF0dXMgc3RhdHVzOwotCXUzMiBkZWx0YV90aWNrczsKLQlhY3BpX2ludGVnZXIgcXVvdGllbnQ7Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGFjcGlfZ2V0X3RpbWVyX2R1cmF0aW9uKTsKLQotCWlmICghdGltZV9lbGFwc2VkKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfUEFSQU1FVEVSKTsKLQl9Ci0KLQkvKgotCSAqIENvbXB1dGUgVGljayBEZWx0YToKLQkgKiBIYW5kbGUgKG1heCBvbmUpIHRpbWVyIHJvbGxvdmVycyBvbiAyNC1iaXQgdmVyc3VzIDMyLWJpdCB0aW1lcnMuCi0JICovCi0JaWYgKHN0YXJ0X3RpY2tzIDwgZW5kX3RpY2tzKSB7Ci0JCWRlbHRhX3RpY2tzID0gZW5kX3RpY2tzIC0gc3RhcnRfdGlja3M7Ci0JfSBlbHNlIGlmIChzdGFydF90aWNrcyA+IGVuZF90aWNrcykgewotCQlpZiAoKGFjcGlfZ2JsX0ZBRFQuZmxhZ3MgJiBBQ1BJX0ZBRFRfMzJCSVRfVElNRVIpID09IDApIHsKLQotCQkJLyogMjQtYml0IFRpbWVyICovCi0KLQkJCWRlbHRhX3RpY2tzID0KLQkJCSAgICAoKCgweDAwRkZGRkZGIC0gc3RhcnRfdGlja3MpICsKLQkJCSAgICAgIGVuZF90aWNrcykgJiAweDAwRkZGRkZGKTsKLQkJfSBlbHNlIHsKLQkJCS8qIDMyLWJpdCBUaW1lciAqLwotCi0JCQlkZWx0YV90aWNrcyA9ICgweEZGRkZGRkZGIC0gc3RhcnRfdGlja3MpICsgZW5kX3RpY2tzOwotCQl9Ci0JfSBlbHNlIHsJCS8qIHN0YXJ0X3RpY2tzID09IGVuZF90aWNrcyAqLwotCi0JCSp0aW1lX2VsYXBzZWQgPSAwOwotCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwotCX0KLQotCS8qCi0JICogQ29tcHV0ZSBEdXJhdGlvbiAoUmVxdWlyZXMgYSA2NC1iaXQgbXVsdGlwbHkgYW5kIGRpdmlkZSk6Ci0JICoKLQkgKiB0aW1lX2VsYXBzZWQgPSAoZGVsdGFfdGlja3MgKiAxMDAwMDAwKSAvIFBNX1RJTUVSX0ZSRVFVRU5DWTsKLQkgKi8KLQlzdGF0dXMgPSBhY3BpX3V0X3Nob3J0X2RpdmlkZSgoKHU2NCkgZGVsdGFfdGlja3MpICogMTAwMDAwMCwKLQkJCQkgICAgICBQTV9USU1FUl9GUkVRVUVOQ1ksICZxdW90aWVudCwgTlVMTCk7Ci0KLQkqdGltZV9lbGFwc2VkID0gKHUzMikgcXVvdGllbnQ7Ci0JcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci19Ci0KLUFDUElfRVhQT1JUX1NZTUJPTChhY3BpX2dldF90aW1lcl9kdXJhdGlvbikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvTWFrZWZpbGUgYi9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL01ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzFhMmRhLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvTWFrZWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jCi0jIE1ha2VmaWxlIGZvciBhbGwgTGludXggQUNQSSBpbnRlcnByZXRlciBzdWJkaXJlY3RvcmllcwotIwotCi1vYmoteSA6PSBuc2FjY2Vzcy5vICBuc2xvYWQubyAgICBuc3NlYXJjaC5vICBuc3hmZXZhbC5vIFwKLQkgbnNhbGxvYy5vICAgbnNldmFsLm8gICAgbnNuYW1lcy5vICAgbnN1dGlscy5vICAgbnN4Zm5hbWUubyBcCi0JIG5zZHVtcC5vICAgIG5zaW5pdC5vICAgIG5zb2JqZWN0Lm8gIG5zd2Fsay5vICAgIG5zeGZvYmoubyAgXAotCSBuc3BhcnNlLm8gICBuc3ByZWRlZi5vCi0KLW9iai0kKEFDUElfRlVUVVJFX1VTQUdFKSArPSBuc2R1bXBkdi5vCi0KLUVYVFJBX0NGTEFHUyArPSAkKEFDUElfQ0ZMQUdTKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc2FjY2Vzcy5jIGIvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc2FjY2Vzcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzlhN2Y2Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnNhY2Nlc3MuYworKysgL2Rldi9udWxsCkBAIC0xLDY3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIE1vZHVsZSBOYW1lOiBuc2FjY2VzcyAtIFRvcC1sZXZlbCBmdW5jdGlvbnMgZm9yIGFjY2Vzc2luZyBBQ1BJIG5hbWVzcGFjZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA4LCBJbnRlbCBDb3JwLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAotICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgYXQgbWluaW11bSBhIGRpc2NsYWltZXIKLSAqICAgIHN1YnN0YW50aWFsbHkgc2ltaWxhciB0byB0aGUgIk5PIFdBUlJBTlRZIiBkaXNjbGFpbWVyIGJlbG93Ci0gKiAgICAoIkRpc2NsYWltZXIiKSBhbmQgYW55IHJlZGlzdHJpYnV0aW9uIG11c3QgYmUgY29uZGl0aW9uZWQgdXBvbgotICogICAgaW5jbHVkaW5nIGEgc3Vic3RhbnRpYWxseSBzaW1pbGFyIERpc2NsYWltZXIgcmVxdWlyZW1lbnQgZm9yIGZ1cnRoZXIKLSAqICAgIGJpbmFyeSByZWRpc3RyaWJ1dGlvbi4KLSAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcwotICogICAgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICogU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBOTyBXQVJSQU5UWQotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCi0gKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUwotICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcKLSAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQotICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgotICovCi0KLSNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KLSNpbmNsdWRlIDxhY3BpL2FtbGNvZGUuaD4KLSNpbmNsdWRlIDxhY3BpL2FjbmFtZXNwLmg+Ci0jaW5jbHVkZSA8YWNwaS9hY2Rpc3BhdC5oPgotCi0jZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9OQU1FU1BBQ0UKLUFDUElfTU9EVUxFX05BTUUoIm5zYWNjZXNzIikKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9uc19yb290X2luaXRpYWxpemUKLSAqCi0gKiBQQVJBTUVURVJTOiAgTm9uZQotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKLSAqCi0gKiBERVNDUklQVElPTjogQWxsb2NhdGUgYW5kIGluaXRpYWxpemUgdGhlIGRlZmF1bHQgcm9vdCBuYW1lZCBvYmplY3RzCi0gKgotICogTVVURVg6ICAgICAgIExvY2tzIG5hbWVzcGFjZSBmb3IgZW50aXJlIGV4ZWN1dGlvbgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1hY3BpX3N0YXR1cyBhY3BpX25zX3Jvb3RfaW5pdGlhbGl6ZSh2b2lkKQotewotCWFjcGlfc3RhdHVzIHN0YXR1czsKLQljb25zdCBzdHJ1Y3QgYWNwaV9wcmVkZWZpbmVkX25hbWVzICppbml0X3ZhbCA9IE5VTEw7Ci0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5ld19ub2RlOwotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjOwotCWFjcGlfc3RyaW5nIHZhbCA9IE5VTEw7Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKG5zX3Jvb3RfaW5pdGlhbGl6ZSk7Ci0KLQlzdGF0dXMgPSBhY3BpX3V0X2FjcXVpcmVfbXV0ZXgoQUNQSV9NVFhfTkFNRVNQQUNFKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci0JfQotCi0JLyoKLQkgKiBUaGUgZ2xvYmFsIHJvb3QgcHRyIGlzIGluaXRpYWxseSBOVUxMLCBzbyBhIG5vbi1OVUxMIHZhbHVlIGluZGljYXRlcwotCSAqIHRoYXQgYWNwaV9uc19yb290X2luaXRpYWxpemUoKSBoYXMgYWxyZWFkeSBiZWVuIGNhbGxlZDsganVzdCByZXR1cm4uCi0JICovCi0JaWYgKGFjcGlfZ2JsX3Jvb3Rfbm9kZSkgewotCQlzdGF0dXMgPSBBRV9PSzsKLQkJZ290byB1bmxvY2tfYW5kX2V4aXQ7Ci0JfQotCi0JLyoKLQkgKiBUZWxsIHRoZSByZXN0IG9mIHRoZSBzdWJzeXN0ZW0gdGhhdCB0aGUgcm9vdCBpcyBpbml0aWFsaXplZAotCSAqIChUaGlzIGlzIE9LIGJlY2F1c2UgdGhlIG5hbWVzcGFjZSBpcyBsb2NrZWQpCi0JICovCi0JYWNwaV9nYmxfcm9vdF9ub2RlID0gJmFjcGlfZ2JsX3Jvb3Rfbm9kZV9zdHJ1Y3Q7Ci0KLQkvKiBFbnRlciB0aGUgcHJlLWRlZmluZWQgbmFtZXMgaW4gdGhlIG5hbWUgdGFibGUgKi8KLQotCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywKLQkJCSAgIkVudGVyaW5nIHByZWRlZmluZWQgZW50cmllcyBpbnRvIG5hbWVzcGFjZVxuIikpOwotCi0JZm9yIChpbml0X3ZhbCA9IGFjcGlfZ2JsX3ByZV9kZWZpbmVkX25hbWVzOyBpbml0X3ZhbC0+bmFtZTsgaW5pdF92YWwrKykgewotCi0JCS8qIF9PU0kgaXMgb3B0aW9uYWwgZm9yIG5vdywgd2lsbCBiZSBwZXJtYW5lbnQgbGF0ZXIgKi8KLQotCQlpZiAoIUFDUElfU1RSQ01QKGluaXRfdmFsLT5uYW1lLCAiX09TSSIpCi0JCSAgICAmJiAhYWNwaV9nYmxfY3JlYXRlX29zaV9tZXRob2QpIHsKLQkJCWNvbnRpbnVlOwotCQl9Ci0KLQkJc3RhdHVzID0gYWNwaV9uc19sb29rdXAoTlVMTCwgaW5pdF92YWwtPm5hbWUsIGluaXRfdmFsLT50eXBlLAotCQkJCQlBQ1BJX0lNT0RFX0xPQURfUEFTUzIsCi0JCQkJCUFDUElfTlNfTk9fVVBTRUFSQ0gsIE5VTEwsICZuZXdfbm9kZSk7Ci0KLQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpIHx8ICghbmV3X25vZGUpKSB7CS8qIE11c3QgYmUgb24gc2FtZSBsaW5lIGZvciBjb2RlIGNvbnZlcnRlciAqLwotCQkJQUNQSV9FWENFUFRJT04oKEFFX0lORk8sIHN0YXR1cywKLQkJCQkJIkNvdWxkIG5vdCBjcmVhdGUgcHJlZGVmaW5lZCBuYW1lICVzIiwKLQkJCQkJaW5pdF92YWwtPm5hbWUpKTsKLQkJfQotCi0JCS8qCi0JCSAqIE5hbWUgZW50ZXJlZCBzdWNjZXNzZnVsbHkuCi0JCSAqIElmIGVudHJ5IGluIHByZV9kZWZpbmVkX25hbWVzW10gc3BlY2lmaWVzIGFuCi0JCSAqIGluaXRpYWwgdmFsdWUsIGNyZWF0ZSB0aGUgaW5pdGlhbCB2YWx1ZS4KLQkJICovCi0JCWlmIChpbml0X3ZhbC0+dmFsKSB7Ci0JCQlzdGF0dXMgPSBhY3BpX29zX3ByZWRlZmluZWRfb3ZlcnJpZGUoaW5pdF92YWwsICZ2YWwpOwotCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCQkJQUNQSV9FUlJPUigoQUVfSU5GTywKLQkJCQkJICAgICJDb3VsZCBub3Qgb3ZlcnJpZGUgcHJlZGVmaW5lZCAlcyIsCi0JCQkJCSAgICBpbml0X3ZhbC0+bmFtZSkpOwotCQkJfQotCi0JCQlpZiAoIXZhbCkgewotCQkJCXZhbCA9IGluaXRfdmFsLT52YWw7Ci0JCQl9Ci0KLQkJCS8qCi0JCQkgKiBFbnRyeSByZXF1ZXN0cyBhbiBpbml0aWFsIHZhbHVlLCBhbGxvY2F0ZSBhCi0JCQkgKiBkZXNjcmlwdG9yIGZvciBpdC4KLQkJCSAqLwotCQkJb2JqX2Rlc2MgPQotCQkJICAgIGFjcGlfdXRfY3JlYXRlX2ludGVybmFsX29iamVjdChpbml0X3ZhbC0+dHlwZSk7Ci0JCQlpZiAoIW9ial9kZXNjKSB7Ci0JCQkJc3RhdHVzID0gQUVfTk9fTUVNT1JZOwotCQkJCWdvdG8gdW5sb2NrX2FuZF9leGl0OwotCQkJfQotCi0JCQkvKgotCQkJICogQ29udmVydCB2YWx1ZSBzdHJpbmcgZnJvbSB0YWJsZSBlbnRyeSB0bwotCQkJICogaW50ZXJuYWwgcmVwcmVzZW50YXRpb24uIE9ubHkgdHlwZXMgYWN0dWFsbHkKLQkJCSAqIHVzZWQgZm9yIGluaXRpYWwgdmFsdWVzIGFyZSBpbXBsZW1lbnRlZCBoZXJlLgotCQkJICovCi0JCQlzd2l0Y2ggKGluaXRfdmFsLT50eXBlKSB7Ci0JCQljYXNlIEFDUElfVFlQRV9NRVRIT0Q6Ci0JCQkJb2JqX2Rlc2MtPm1ldGhvZC5wYXJhbV9jb3VudCA9Ci0JCQkJICAgICh1OCkgQUNQSV9UT19JTlRFR0VSKHZhbCk7Ci0JCQkJb2JqX2Rlc2MtPmNvbW1vbi5mbGFncyB8PSBBT1BPQkpfREFUQV9WQUxJRDsKLQotI2lmIGRlZmluZWQgKEFDUElfQVNMX0NPTVBJTEVSKQotCi0JCQkJLyogU2F2ZSB0aGUgcGFyYW1ldGVyIGNvdW50IGZvciB0aGUgaV9hU0wgY29tcGlsZXIgKi8KLQotCQkJCW5ld19ub2RlLT52YWx1ZSA9IG9ial9kZXNjLT5tZXRob2QucGFyYW1fY291bnQ7Ci0jZWxzZQotCQkJCS8qIE1hcmsgdGhpcyBhcyBhIHZlcnkgU1BFQ0lBTCBtZXRob2QgKi8KLQotCQkJCW9ial9kZXNjLT5tZXRob2QubWV0aG9kX2ZsYWdzID0KLQkJCQkgICAgQU1MX01FVEhPRF9JTlRFUk5BTF9PTkxZOwotCi0jaWZuZGVmIEFDUElfRFVNUF9BUFAKLQkJCQlvYmpfZGVzYy0+bWV0aG9kLmltcGxlbWVudGF0aW9uID0KLQkJCQkgICAgYWNwaV91dF9vc2lfaW1wbGVtZW50YXRpb247Ci0jZW5kaWYKLSNlbmRpZgotCQkJCWJyZWFrOwotCi0JCQljYXNlIEFDUElfVFlQRV9JTlRFR0VSOgotCi0JCQkJb2JqX2Rlc2MtPmludGVnZXIudmFsdWUgPSBBQ1BJX1RPX0lOVEVHRVIodmFsKTsKLQkJCQlicmVhazsKLQotCQkJY2FzZSBBQ1BJX1RZUEVfU1RSSU5HOgotCi0JCQkJLyoKLQkJCQkgKiBCdWlsZCBhbiBvYmplY3QgYXJvdW5kIHRoZSBzdGF0aWMgc3RyaW5nCi0JCQkJICovCi0JCQkJb2JqX2Rlc2MtPnN0cmluZy5sZW5ndGggPQotCQkJCSAgICAodTMyKSBBQ1BJX1NUUkxFTih2YWwpOwotCQkJCW9ial9kZXNjLT5zdHJpbmcucG9pbnRlciA9IHZhbDsKLQkJCQlvYmpfZGVzYy0+Y29tbW9uLmZsYWdzIHw9IEFPUE9CSl9TVEFUSUNfUE9JTlRFUjsKLQkJCQlicmVhazsKLQotCQkJY2FzZSBBQ1BJX1RZUEVfTVVURVg6Ci0KLQkJCQlvYmpfZGVzYy0+bXV0ZXgubm9kZSA9IG5ld19ub2RlOwotCQkJCW9ial9kZXNjLT5tdXRleC5zeW5jX2xldmVsID0KLQkJCQkgICAgKHU4KSAoQUNQSV9UT19JTlRFR0VSKHZhbCkgLSAxKTsKLQotCQkJCS8qIENyZWF0ZSBhIG11dGV4ICovCi0KLQkJCQlzdGF0dXMgPQotCQkJCSAgICBhY3BpX29zX2NyZWF0ZV9tdXRleCgmb2JqX2Rlc2MtPm11dGV4LgotCQkJCQkJCSBvc19tdXRleCk7Ci0JCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCQkJCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZShvYmpfZGVzYyk7Ci0JCQkJCWdvdG8gdW5sb2NrX2FuZF9leGl0OwotCQkJCX0KLQotCQkJCS8qIFNwZWNpYWwgY2FzZSBmb3IgQUNQSSBHbG9iYWwgTG9jayAqLwotCi0JCQkJaWYgKEFDUElfU1RSQ01QKGluaXRfdmFsLT5uYW1lLCAiX0dMXyIpID09IDApIHsKLQkJCQkJYWNwaV9nYmxfZ2xvYmFsX2xvY2tfbXV0ZXggPSBvYmpfZGVzYzsKLQotCQkJCQkvKiBDcmVhdGUgYWRkaXRpb25hbCBjb3VudGluZyBzZW1hcGhvcmUgZm9yIGdsb2JhbCBsb2NrICovCi0KLQkJCQkJc3RhdHVzID0KLQkJCQkJICAgIGFjcGlfb3NfY3JlYXRlX3NlbWFwaG9yZSgxLCAwLAotCQkJCQkJCQkgICAgICZhY3BpX2dibF9nbG9iYWxfbG9ja19zZW1hcGhvcmUpOwotCQkJCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJCQkJCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZQotCQkJCQkJICAgIChvYmpfZGVzYyk7Ci0JCQkJCQlnb3RvIHVubG9ja19hbmRfZXhpdDsKLQkJCQkJfQotCQkJCX0KLQkJCQlicmVhazsKLQotCQkJZGVmYXVsdDoKLQotCQkJCUFDUElfRVJST1IoKEFFX0lORk8sCi0JCQkJCSAgICAiVW5zdXBwb3J0ZWQgaW5pdGlhbCB0eXBlIHZhbHVlICVYIiwKLQkJCQkJICAgIGluaXRfdmFsLT50eXBlKSk7Ci0JCQkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKG9ial9kZXNjKTsKLQkJCQlvYmpfZGVzYyA9IE5VTEw7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCS8qIFN0b3JlIHBvaW50ZXIgdG8gdmFsdWUgZGVzY3JpcHRvciBpbiB0aGUgTm9kZSAqLwotCi0JCQlzdGF0dXMgPSBhY3BpX25zX2F0dGFjaF9vYmplY3QobmV3X25vZGUsIG9ial9kZXNjLAotCQkJCQkJICAgICAgIEFDUElfR0VUX09CSkVDVF9UWVBFCi0JCQkJCQkgICAgICAgKG9ial9kZXNjKSk7Ci0KLQkJCS8qIFJlbW92ZSBsb2NhbCByZWZlcmVuY2UgdG8gdGhlIG9iamVjdCAqLwotCi0JCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2Uob2JqX2Rlc2MpOwotCQl9Ci0JfQotCi0gICAgICB1bmxvY2tfYW5kX2V4aXQ6Ci0JKHZvaWQpYWNwaV91dF9yZWxlYXNlX211dGV4KEFDUElfTVRYX05BTUVTUEFDRSk7Ci0KLQkvKiBTYXZlIGEgaGFuZGxlIHRvICJfR1BFIiwgaXQgaXMgYWx3YXlzIHByZXNlbnQgKi8KLQotCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkgewotCQlzdGF0dXMgPSBhY3BpX25zX2dldF9ub2RlKE5VTEwsICJcXF9HUEUiLCBBQ1BJX05TX05PX1VQU0VBUkNILAotCQkJCQkgICZhY3BpX2dibF9mYWR0X2dwZV9kZXZpY2UpOwotCX0KLQotCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX25zX2xvb2t1cAotICoKLSAqIFBBUkFNRVRFUlM6ICBzY29wZV9pbmZvICAgICAgLSBDdXJyZW50IHNjb3BlIGluZm8gYmxvY2sKLSAqICAgICAgICAgICAgICBQYXRobmFtZSAgICAgICAgLSBTZWFyY2ggcGF0aG5hbWUsIGluIGludGVybmFsIGZvcm1hdAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhcyByZXByZXNlbnRlZCBpbiB0aGUgQU1MIHN0cmVhbSkKLSAqICAgICAgICAgICAgICBUeXBlICAgICAgICAgICAgLSBUeXBlIGFzc29jaWF0ZWQgd2l0aCBuYW1lCi0gKiAgICAgICAgICAgICAgaW50ZXJwcmV0ZXJfbW9kZSAtIElNT0RFX0xPQURfUEFTUzIgPT4gYWRkIG5hbWUgaWYgbm90IGZvdW5kCi0gKiAgICAgICAgICAgICAgRmxhZ3MgICAgICAgICAgIC0gRmxhZ3MgZGVzY3JpYmluZyB0aGUgc2VhcmNoIHJlc3RyaWN0aW9ucwotICogICAgICAgICAgICAgIHdhbGtfc3RhdGUgICAgICAtIEN1cnJlbnQgc3RhdGUgb2YgdGhlIHdhbGsKLSAqICAgICAgICAgICAgICByZXR1cm5fbm9kZSAgICAgLSBXaGVyZSB0aGUgTm9kZSBpcyBwbGFjZWQgKGlmIGZvdW5kCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgY3JlYXRlZCBzdWNjZXNzZnVsbHkpCi0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cwotICoKLSAqIERFU0NSSVBUSU9OOiBGaW5kIG9yIGVudGVyIHRoZSBwYXNzZWQgbmFtZSBpbiB0aGUgbmFtZSBzcGFjZS4KLSAqICAgICAgICAgICAgICBMb2cgYW4gZXJyb3IgaWYgbmFtZSBub3QgZm91bmQgaW4gRXhlYyBtb2RlLgotICoKLSAqIE1VVEVYOiAgICAgICBBc3N1bWVzIG5hbWVzcGFjZSBpcyBsb2NrZWQuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotYWNwaV9zdGF0dXMKLWFjcGlfbnNfbG9va3VwKHVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSAqc2NvcGVfaW5mbywKLQkgICAgICAgY2hhciAqcGF0aG5hbWUsCi0JICAgICAgIGFjcGlfb2JqZWN0X3R5cGUgdHlwZSwKLQkgICAgICAgYWNwaV9pbnRlcnByZXRlcl9tb2RlIGludGVycHJldGVyX21vZGUsCi0JICAgICAgIHUzMiBmbGFncywKLQkgICAgICAgc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSwKLQkgICAgICAgc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKipyZXR1cm5fbm9kZSkKLXsKLQlhY3BpX3N0YXR1cyBzdGF0dXM7Ci0JY2hhciAqcGF0aCA9IHBhdGhuYW1lOwotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpwcmVmaXhfbm9kZTsKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqY3VycmVudF9ub2RlID0gTlVMTDsKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqdGhpc19ub2RlID0gTlVMTDsKLQl1MzIgbnVtX3NlZ21lbnRzOwotCXUzMiBudW1fY2FyYXRzOwotCWFjcGlfbmFtZSBzaW1wbGVfbmFtZTsKLQlhY3BpX29iamVjdF90eXBlIHR5cGVfdG9fY2hlY2tfZm9yOwotCWFjcGlfb2JqZWN0X3R5cGUgdGhpc19zZWFyY2hfdHlwZTsKLQl1MzIgc2VhcmNoX3BhcmVudF9mbGFnID0gQUNQSV9OU19TRUFSQ0hfUEFSRU5UOwotCXUzMiBsb2NhbF9mbGFnczsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UobnNfbG9va3VwKTsKLQotCWlmICghcmV0dXJuX25vZGUpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9QQVJBTUVURVIpOwotCX0KLQotCWxvY2FsX2ZsYWdzID0gZmxhZ3MgJiB+KEFDUElfTlNfRVJST1JfSUZfRk9VTkQgfCBBQ1BJX05TX1NFQVJDSF9QQVJFTlQpOwotCSpyZXR1cm5fbm9kZSA9IEFDUElfRU5UUllfTk9UX0ZPVU5EOwotCWFjcGlfZ2JsX25zX2xvb2t1cF9jb3VudCsrOwotCi0JaWYgKCFhY3BpX2dibF9yb290X25vZGUpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX05BTUVTUEFDRSk7Ci0JfQotCi0JLyoKLQkgKiBHZXQgdGhlIHByZWZpeCBzY29wZS4KLQkgKiBBIG51bGwgc2NvcGUgbWVhbnMgdXNlIHRoZSByb290IHNjb3BlCi0JICovCi0JaWYgKCghc2NvcGVfaW5mbykgfHwgKCFzY29wZV9pbmZvLT5zY29wZS5ub2RlKSkgewotCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX05BTUVTLAotCQkJCSAgIk51bGwgc2NvcGUgcHJlZml4LCB1c2luZyByb290IG5vZGUgKCVwKVxuIiwKLQkJCQkgIGFjcGlfZ2JsX3Jvb3Rfbm9kZSkpOwotCi0JCXByZWZpeF9ub2RlID0gYWNwaV9nYmxfcm9vdF9ub2RlOwotCX0gZWxzZSB7Ci0JCXByZWZpeF9ub2RlID0gc2NvcGVfaW5mby0+c2NvcGUubm9kZTsKLQkJaWYgKEFDUElfR0VUX0RFU0NSSVBUT1JfVFlQRShwcmVmaXhfbm9kZSkgIT0KLQkJICAgIEFDUElfREVTQ19UWVBFX05BTUVEKSB7Ci0JCQlBQ1BJX0VSUk9SKChBRV9JTkZPLCAiJXAgaXMgbm90IGEgbmFtZXNwYWNlIG5vZGUgWyVzXSIsCi0JCQkJICAgIHByZWZpeF9ub2RlLAotCQkJCSAgICBhY3BpX3V0X2dldF9kZXNjcmlwdG9yX25hbWUocHJlZml4X25vZGUpKSk7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX0lOVEVSTkFMKTsKLQkJfQotCi0JCWlmICghKGZsYWdzICYgQUNQSV9OU19QUkVGSVhfSVNfU0NPUEUpKSB7Ci0JCQkvKgotCQkJICogVGhpcyBub2RlIG1pZ2h0IG5vdCBiZSBhIGFjdHVhbCAic2NvcGUiIG5vZGUgKHN1Y2ggYXMgYQotCQkJICogRGV2aWNlL01ldGhvZCwgZXRjLikgIEl0IGNvdWxkIGJlIGEgUGFja2FnZSBvciBvdGhlciBvYmplY3Qgbm9kZS4KLQkJCSAqIEJhY2t1cCB1cCB0aGUgdHJlZSB0byBmaW5kIHRoZSBjb250YWluaW5nIHNjb3BlIG5vZGUuCi0JCQkgKi8KLQkJCXdoaWxlICghYWNwaV9uc19vcGVuc19zY29wZShwcmVmaXhfbm9kZS0+dHlwZSkgJiYKLQkJCSAgICAgICBwcmVmaXhfbm9kZS0+dHlwZSAhPSBBQ1BJX1RZUEVfQU5ZKSB7Ci0JCQkJcHJlZml4X25vZGUgPQotCQkJCSAgICBhY3BpX25zX2dldF9wYXJlbnRfbm9kZShwcmVmaXhfbm9kZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKiBTYXZlIHR5cGUgICBUQkQ6IG1heSBiZSBubyBsb25nZXIgbmVjZXNzYXJ5ICovCi0KLQl0eXBlX3RvX2NoZWNrX2ZvciA9IHR5cGU7Ci0KLQkvKgotCSAqIEJlZ2luIGV4YW1pbmF0aW9uIG9mIHRoZSBhY3R1YWwgcGF0aG5hbWUKLQkgKi8KLQlpZiAoIXBhdGhuYW1lKSB7Ci0KLQkJLyogQSBOdWxsIG5hbWVfcGF0aCBpcyBhbGxvd2VkIGFuZCByZWZlcnMgdG8gdGhlIHJvb3QgKi8KLQotCQludW1fc2VnbWVudHMgPSAwOwotCQl0aGlzX25vZGUgPSBhY3BpX2dibF9yb290X25vZGU7Ci0JCXBhdGggPSAiIjsKLQotCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX05BTUVTLAotCQkJCSAgIk51bGwgUGF0aG5hbWUgKFplcm8gc2VnbWVudHMpLCBGbGFncz0lWFxuIiwKLQkJCQkgIGZsYWdzKSk7Ci0JfSBlbHNlIHsKLQkJLyoKLQkJICogTmFtZSBwb2ludGVyIGlzIHZhbGlkIChhbmQgbXVzdCBiZSBpbiBpbnRlcm5hbCBuYW1lIGZvcm1hdCkKLQkJICoKLQkJICogQ2hlY2sgZm9yIHNjb3BlIHByZWZpeGVzOgotCQkgKgotCQkgKiBBcyByZXByZXNlbnRlZCBpbiB0aGUgQU1MIHN0cmVhbSwgYSBuYW1lcGF0aCBjb25zaXN0cyBvZiBhbgotCQkgKiBvcHRpb25hbCBzY29wZSBwcmVmaXggZm9sbG93ZWQgYnkgYSBuYW1lIHNlZ21lbnQgcGFydC4KLQkJICoKLQkJICogSWYgcHJlc2VudCwgdGhlIHNjb3BlIHByZWZpeCBpcyBlaXRoZXIgYSBSb290IFByZWZpeCAoaW4KLQkJICogd2hpY2ggY2FzZSB0aGUgbmFtZSBpcyBmdWxseSBxdWFsaWZpZWQpLCBvciBvbmUgb3IgbW9yZQotCQkgKiBQYXJlbnQgUHJlZml4ZXMgKGluIHdoaWNoIGNhc2UgdGhlIG5hbWUncyBzY29wZSBpcyByZWxhdGl2ZQotCQkgKiB0byB0aGUgY3VycmVudCBzY29wZSkuCi0JCSAqLwotCQlpZiAoKnBhdGggPT0gKHU4KSBBTUxfUk9PVF9QUkVGSVgpIHsKLQotCQkJLyogUGF0aG5hbWUgaXMgZnVsbHkgcXVhbGlmaWVkLCBzdGFydCBmcm9tIHRoZSByb290ICovCi0KLQkJCXRoaXNfbm9kZSA9IGFjcGlfZ2JsX3Jvb3Rfbm9kZTsKLQkJCXNlYXJjaF9wYXJlbnRfZmxhZyA9IEFDUElfTlNfTk9fVVBTRUFSQ0g7Ci0KLQkJCS8qIFBvaW50IHRvIG5hbWUgc2VnbWVudCBwYXJ0ICovCi0KLQkJCXBhdGgrKzsKLQotCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9OQU1FUywKLQkJCQkJICAiUGF0aCBpcyBhYnNvbHV0ZSBmcm9tIHJvb3QgWyVwXVxuIiwKLQkJCQkJICB0aGlzX25vZGUpKTsKLQkJfSBlbHNlIHsKLQkJCS8qIFBhdGhuYW1lIGlzIHJlbGF0aXZlIHRvIGN1cnJlbnQgc2NvcGUsIHN0YXJ0IHRoZXJlICovCi0KLQkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfTkFNRVMsCi0JCQkJCSAgIlNlYXJjaGluZyByZWxhdGl2ZSB0byBwcmVmaXggc2NvcGUgWyU0LjRzXSAoJXApXG4iLAotCQkJCQkgIGFjcGlfdXRfZ2V0X25vZGVfbmFtZShwcmVmaXhfbm9kZSksCi0JCQkJCSAgcHJlZml4X25vZGUpKTsKLQotCQkJLyoKLQkJCSAqIEhhbmRsZSBtdWx0aXBsZSBQYXJlbnQgUHJlZml4ZXMgKGNhcmF0KSBieSBqdXN0IGdldHRpbmcKLQkJCSAqIHRoZSBwYXJlbnQgbm9kZSBmb3IgZWFjaCBwcmVmaXggaW5zdGFuY2UuCi0JCQkgKi8KLQkJCXRoaXNfbm9kZSA9IHByZWZpeF9ub2RlOwotCQkJbnVtX2NhcmF0cyA9IDA7Ci0JCQl3aGlsZSAoKnBhdGggPT0gKHU4KSBBTUxfUEFSRU5UX1BSRUZJWCkgewotCi0JCQkJLyogTmFtZSBpcyBmdWxseSBxdWFsaWZpZWQsIG5vIHNlYXJjaCBydWxlcyBhcHBseSAqLwotCi0JCQkJc2VhcmNoX3BhcmVudF9mbGFnID0gQUNQSV9OU19OT19VUFNFQVJDSDsKLQkJCQkvKgotCQkJCSAqIFBvaW50IHBhc3QgdGhpcyBwcmVmaXggdG8gdGhlIG5hbWUgc2VnbWVudAotCQkJCSAqIHBhcnQgb3IgdGhlIG5leHQgUGFyZW50IFByZWZpeAotCQkJCSAqLwotCQkJCXBhdGgrKzsKLQotCQkJCS8qIEJhY2t1cCB0byB0aGUgcGFyZW50IG5vZGUgKi8KLQotCQkJCW51bV9jYXJhdHMrKzsKLQkJCQl0aGlzX25vZGUgPSBhY3BpX25zX2dldF9wYXJlbnRfbm9kZSh0aGlzX25vZGUpOwotCQkJCWlmICghdGhpc19ub2RlKSB7Ci0KLQkJCQkJLyogQ3VycmVudCBzY29wZSBoYXMgbm8gcGFyZW50IHNjb3BlICovCi0KLQkJCQkJQUNQSV9FUlJPUigoQUVfSU5GTywKLQkJCQkJCSAgICAiQUNQSSBwYXRoIGhhcyB0b28gbWFueSBwYXJlbnQgcHJlZml4ZXMgKF4pIC0gcmVhY2hlZCBiZXlvbmQgcm9vdCBub2RlIikpOwotCQkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9UX0ZPVU5EKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChzZWFyY2hfcGFyZW50X2ZsYWcgPT0gQUNQSV9OU19OT19VUFNFQVJDSCkgewotCQkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfTkFNRVMsCi0JCQkJCQkgICJTZWFyY2ggc2NvcGUgaXMgWyU0LjRzXSwgcGF0aCBoYXMgJWQgY2FyYXQocylcbiIsCi0JCQkJCQkgIGFjcGlfdXRfZ2V0X25vZGVfbmFtZQotCQkJCQkJICAodGhpc19ub2RlKSwgbnVtX2NhcmF0cykpOwotCQkJfQotCQl9Ci0KLQkJLyoKLQkJICogRGV0ZXJtaW5lIHRoZSBudW1iZXIgb2YgQUNQSSBuYW1lIHNlZ21lbnRzIGluIHRoaXMgcGF0aG5hbWUuCi0JCSAqCi0JCSAqIFRoZSBzZWdtZW50IHBhcnQgY29uc2lzdHMgb2YgZWl0aGVyOgotCQkgKiAgLSBBIE51bGwgbmFtZSBzZWdtZW50ICgwKQotCQkgKiAgLSBBIGR1YWxfbmFtZV9wcmVmaXggZm9sbG93ZWQgYnkgdHdvIDQtYnl0ZSBuYW1lIHNlZ21lbnRzCi0JCSAqICAtIEEgbXVsdGlfbmFtZV9wcmVmaXggZm9sbG93ZWQgYnkgYSBieXRlIGluZGljYXRpbmcgdGhlCi0JCSAqICAgICAgbnVtYmVyIG9mIHNlZ21lbnRzIGFuZCB0aGUgc2VnbWVudHMgdGhlbXNlbHZlcy4KLQkJICogIC0gQSBzaW5nbGUgNC1ieXRlIG5hbWUgc2VnbWVudAotCQkgKgotCQkgKiBFeGFtaW5lIHRoZSBuYW1lIHByZWZpeCBvcGNvZGUsIGlmIGFueSwgdG8gZGV0ZXJtaW5lIHRoZSBudW1iZXIgb2YKLQkJICogc2VnbWVudHMuCi0JCSAqLwotCQlzd2l0Y2ggKCpwYXRoKSB7Ci0JCWNhc2UgMDoKLQkJCS8qCi0JCQkgKiBOdWxsIG5hbWUgYWZ0ZXIgYSByb290IG9yIHBhcmVudCBwcmVmaXhlcy4gV2UgYWxyZWFkeQotCQkJICogaGF2ZSB0aGUgY29ycmVjdCB0YXJnZXQgbm9kZSBhbmQgdGhlcmUgYXJlIG5vIG5hbWUgc2VnbWVudHMuCi0JCQkgKi8KLQkJCW51bV9zZWdtZW50cyA9IDA7Ci0JCQl0eXBlID0gdGhpc19ub2RlLT50eXBlOwotCi0JCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX05BTUVTLAotCQkJCQkgICJQcmVmaXgtb25seSBQYXRobmFtZSAoWmVybyBuYW1lIHNlZ21lbnRzKSwgRmxhZ3M9JVhcbiIsCi0JCQkJCSAgZmxhZ3MpKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgQU1MX0RVQUxfTkFNRV9QUkVGSVg6Ci0KLQkJCS8qIE1vcmUgdGhhbiBvbmUgbmFtZV9zZWcsIHNlYXJjaCBydWxlcyBkbyBub3QgYXBwbHkgKi8KLQotCQkJc2VhcmNoX3BhcmVudF9mbGFnID0gQUNQSV9OU19OT19VUFNFQVJDSDsKLQotCQkJLyogVHdvIHNlZ21lbnRzLCBwb2ludCB0byBmaXJzdCBuYW1lIHNlZ21lbnQgKi8KLQotCQkJbnVtX3NlZ21lbnRzID0gMjsKLQkJCXBhdGgrKzsKLQotCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9OQU1FUywKLQkJCQkJICAiRHVhbCBQYXRobmFtZSAoMiBzZWdtZW50cywgRmxhZ3M9JVgpXG4iLAotCQkJCQkgIGZsYWdzKSk7Ci0JCQlicmVhazsKLQotCQljYXNlIEFNTF9NVUxUSV9OQU1FX1BSRUZJWF9PUDoKLQotCQkJLyogTW9yZSB0aGFuIG9uZSBuYW1lX3NlZywgc2VhcmNoIHJ1bGVzIGRvIG5vdCBhcHBseSAqLwotCi0JCQlzZWFyY2hfcGFyZW50X2ZsYWcgPSBBQ1BJX05TX05PX1VQU0VBUkNIOwotCi0JCQkvKiBFeHRyYWN0IHNlZ21lbnQgY291bnQsIHBvaW50IHRvIGZpcnN0IG5hbWUgc2VnbWVudCAqLwotCi0JCQlwYXRoKys7Ci0JCQludW1fc2VnbWVudHMgPSAodTMyKSAodTgpICogcGF0aDsKLQkJCXBhdGgrKzsKLQotCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9OQU1FUywKLQkJCQkJICAiTXVsdGkgUGF0aG5hbWUgKCVkIFNlZ21lbnRzLCBGbGFncz0lWClcbiIsCi0JCQkJCSAgbnVtX3NlZ21lbnRzLCBmbGFncykpOwotCQkJYnJlYWs7Ci0KLQkJZGVmYXVsdDoKLQkJCS8qCi0JCQkgKiBOb3QgYSBOdWxsIG5hbWUsIG5vIER1YWwgb3IgTXVsdGkgcHJlZml4LCBoZW5jZSB0aGVyZSBpcwotCQkJICogb25seSBvbmUgbmFtZSBzZWdtZW50IGFuZCBQYXRobmFtZSBpcyBhbHJlYWR5IHBvaW50aW5nIHRvIGl0LgotCQkJICovCi0JCQludW1fc2VnbWVudHMgPSAxOwotCi0JCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX05BTUVTLAotCQkJCQkgICJTaW1wbGUgUGF0aG5hbWUgKDEgc2VnbWVudCwgRmxhZ3M9JVgpXG4iLAotCQkJCQkgIGZsYWdzKSk7Ci0JCQlicmVhazsKLQkJfQotCi0JCUFDUElfREVCVUdfRVhFQyhhY3BpX25zX3ByaW50X3BhdGhuYW1lKG51bV9zZWdtZW50cywgcGF0aCkpOwotCX0KLQotCS8qCi0JICogU2VhcmNoIG5hbWVzcGFjZSBmb3IgZWFjaCBzZWdtZW50IG9mIHRoZSBuYW1lLiAgTG9vcCB0aHJvdWdoIGFuZAotCSAqIHZlcmlmeSAob3IgYWRkIHRvIHRoZSBuYW1lc3BhY2UpIGVhY2ggbmFtZSBzZWdtZW50LgotCSAqCi0JICogVGhlIG9iamVjdCB0eXBlIGlzIHNpZ25pZmljYW50IG9ubHkgYXQgdGhlIGxhc3QgbmFtZQotCSAqIHNlZ21lbnQuICAoV2UgZG9uJ3QgY2FyZSBhYm91dCB0aGUgdHlwZXMgYWxvbmcgdGhlIHBhdGgsIG9ubHkKLQkgKiB0aGUgdHlwZSBvZiB0aGUgZmluYWwgdGFyZ2V0IG9iamVjdC4pCi0JICovCi0JdGhpc19zZWFyY2hfdHlwZSA9IEFDUElfVFlQRV9BTlk7Ci0JY3VycmVudF9ub2RlID0gdGhpc19ub2RlOwotCXdoaWxlIChudW1fc2VnbWVudHMgJiYgY3VycmVudF9ub2RlKSB7Ci0JCW51bV9zZWdtZW50cy0tOwotCQlpZiAoIW51bV9zZWdtZW50cykgewotCQkJLyoKLQkJCSAqIFRoaXMgaXMgdGhlIGxhc3Qgc2VnbWVudCwgZW5hYmxlIHR5cGVjaGVja2luZwotCQkJICovCi0JCQl0aGlzX3NlYXJjaF90eXBlID0gdHlwZTsKLQotCQkJLyoKLQkJCSAqIE9ubHkgYWxsb3cgYXV0b21hdGljIHBhcmVudCBzZWFyY2ggKHNlYXJjaCBydWxlcykgaWYgdGhlIGNhbGxlcgotCQkJICogcmVxdWVzdGVkIGl0IEFORCB3ZSBoYXZlIGEgc2luZ2xlLCBub24tZnVsbHktcXVhbGlmaWVkIG5hbWVfc2VnCi0JCQkgKi8KLQkJCWlmICgoc2VhcmNoX3BhcmVudF9mbGFnICE9IEFDUElfTlNfTk9fVVBTRUFSQ0gpICYmCi0JCQkgICAgKGZsYWdzICYgQUNQSV9OU19TRUFSQ0hfUEFSRU5UKSkgewotCQkJCWxvY2FsX2ZsYWdzIHw9IEFDUElfTlNfU0VBUkNIX1BBUkVOVDsKLQkJCX0KLQotCQkJLyogU2V0IGVycm9yIGZsYWcgYWNjb3JkaW5nIHRvIGNhbGxlciAqLwotCi0JCQlpZiAoZmxhZ3MgJiBBQ1BJX05TX0VSUk9SX0lGX0ZPVU5EKSB7Ci0JCQkJbG9jYWxfZmxhZ3MgfD0gQUNQSV9OU19FUlJPUl9JRl9GT1VORDsKLQkJCX0KLQkJfQotCi0JCS8qIEV4dHJhY3Qgb25lIEFDUEkgbmFtZSBmcm9tIHRoZSBmcm9udCBvZiB0aGUgcGF0aG5hbWUgKi8KLQotCQlBQ1BJX01PVkVfMzJfVE9fMzIoJnNpbXBsZV9uYW1lLCBwYXRoKTsKLQotCQkvKiBUcnkgdG8gZmluZCB0aGUgc2luZ2xlICg0IGNoYXJhY3RlcikgQUNQSSBuYW1lICovCi0KLQkJc3RhdHVzID0KLQkJICAgIGFjcGlfbnNfc2VhcmNoX2FuZF9lbnRlcihzaW1wbGVfbmFtZSwgd2Fsa19zdGF0ZSwKLQkJCQkJICAgICBjdXJyZW50X25vZGUsIGludGVycHJldGVyX21vZGUsCi0JCQkJCSAgICAgdGhpc19zZWFyY2hfdHlwZSwgbG9jYWxfZmxhZ3MsCi0JCQkJCSAgICAgJnRoaXNfbm9kZSk7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQkJaWYgKHN0YXR1cyA9PSBBRV9OT1RfRk9VTkQpIHsKLQotCQkJCS8qIE5hbWUgbm90IGZvdW5kIGluIEFDUEkgbmFtZXNwYWNlICovCi0KLQkJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX05BTUVTLAotCQkJCQkJICAiTmFtZSBbJTQuNHNdIG5vdCBmb3VuZCBpbiBzY29wZSBbJTQuNHNdICVwXG4iLAotCQkJCQkJICAoY2hhciAqKSZzaW1wbGVfbmFtZSwKLQkJCQkJCSAgKGNoYXIgKikmY3VycmVudF9ub2RlLT5uYW1lLAotCQkJCQkJICBjdXJyZW50X25vZGUpKTsKLQkJCX0KLQotCQkJKnJldHVybl9ub2RlID0gdGhpc19ub2RlOwotCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci0JCX0KLQotCQkvKiBNb3JlIHNlZ21lbnRzIHRvIGZvbGxvdz8gKi8KLQotCQlpZiAobnVtX3NlZ21lbnRzID4gMCkgewotCQkJLyoKLQkJCSAqIElmIHdlIGhhdmUgYW4gYWxpYXMgdG8gYW4gb2JqZWN0IHRoYXQgb3BlbnMgYSBzY29wZSAoc3VjaCBhcyBhCi0JCQkgKiBkZXZpY2Ugb3IgcHJvY2Vzc29yKSwgd2UgbmVlZCB0byBkZXJlZmVyZW5jZSB0aGUgYWxpYXMgaGVyZSBzbyB0aGF0Ci0JCQkgKiB3ZSBjYW4gYWNjZXNzIGFueSBjaGlsZHJlbiBvZiB0aGUgb3JpZ2luYWwgbm9kZSAodmlhIHRoZSByZW1haW5pbmcKLQkJCSAqIHNlZ21lbnRzKS4KLQkJCSAqLwotCQkJaWYgKHRoaXNfbm9kZS0+dHlwZSA9PSBBQ1BJX1RZUEVfTE9DQUxfQUxJQVMpIHsKLQkJCQlpZiAoYWNwaV9uc19vcGVuc19zY29wZQotCQkJCSAgICAoKChzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqKXRoaXNfbm9kZS0+Ci0JCQkJICAgICAgb2JqZWN0KS0+dHlwZSkpIHsKLQkJCQkJdGhpc19ub2RlID0KLQkJCQkJICAgIChzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqKQotCQkJCQkgICAgdGhpc19ub2RlLT5vYmplY3Q7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLyogU3BlY2lhbCBoYW5kbGluZyBmb3IgdGhlIGxhc3Qgc2VnbWVudCAobnVtX3NlZ21lbnRzID09IDApICovCi0KLQkJZWxzZSB7Ci0JCQkvKgotCQkJICogU2FuaXR5IHR5cGVjaGVjayBvZiB0aGUgdGFyZ2V0IG9iamVjdDoKLQkJCSAqCi0JCQkgKiBJZiAxKSBUaGlzIGlzIHRoZSBsYXN0IHNlZ21lbnQgKG51bV9zZWdtZW50cyA9PSAwKQotCQkJICogICAgMikgQW5kIHdlIGFyZSBsb29raW5nIGZvciBhIHNwZWNpZmljIHR5cGUKLQkJCSAqICAgICAgIChOb3QgY2hlY2tpbmcgZm9yIFRZUEVfQU5ZKQotCQkJICogICAgMykgV2hpY2ggaXMgbm90IGFuIGFsaWFzCi0JCQkgKiAgICA0KSBXaGljaCBpcyBub3QgYSBsb2NhbCB0eXBlIChUWVBFX1NDT1BFKQotCQkJICogICAgNSkgQW5kIHRoZSB0eXBlIG9mIHRhcmdldCBvYmplY3QgaXMga25vd24gKG5vdCBUWVBFX0FOWSkKLQkJCSAqICAgIDYpIEFuZCB0YXJnZXQgb2JqZWN0IGRvZXMgbm90IG1hdGNoIHdoYXQgd2UgYXJlIGxvb2tpbmcgZm9yCi0JCQkgKgotCQkJICogVGhlbiB3ZSBoYXZlIGEgdHlwZSBtaXNtYXRjaC4gSnVzdCB3YXJuIGFuZCBpZ25vcmUgaXQuCi0JCQkgKi8KLQkJCWlmICgodHlwZV90b19jaGVja19mb3IgIT0gQUNQSV9UWVBFX0FOWSkgJiYKLQkJCSAgICAodHlwZV90b19jaGVja19mb3IgIT0gQUNQSV9UWVBFX0xPQ0FMX0FMSUFTKSAmJgotCQkJICAgICh0eXBlX3RvX2NoZWNrX2ZvciAhPSBBQ1BJX1RZUEVfTE9DQUxfTUVUSE9EX0FMSUFTKQotCQkJICAgICYmICh0eXBlX3RvX2NoZWNrX2ZvciAhPSBBQ1BJX1RZUEVfTE9DQUxfU0NPUEUpCi0JCQkgICAgJiYgKHRoaXNfbm9kZS0+dHlwZSAhPSBBQ1BJX1RZUEVfQU5ZKQotCQkJICAgICYmICh0aGlzX25vZGUtPnR5cGUgIT0gdHlwZV90b19jaGVja19mb3IpKSB7Ci0KLQkJCQkvKiBDb21wbGFpbiBhYm91dCBhIHR5cGUgbWlzbWF0Y2ggKi8KLQotCQkJCUFDUElfV0FSTklORygoQUVfSU5GTywKLQkJCQkJICAgICAgIk5zTG9va3VwOiBUeXBlIG1pc21hdGNoIG9uICU0LjRzICglcyksIHNlYXJjaGluZyBmb3IgKCVzKSIsCi0JCQkJCSAgICAgIEFDUElfQ0FTVF9QVFIoY2hhciwgJnNpbXBsZV9uYW1lKSwKLQkJCQkJICAgICAgYWNwaV91dF9nZXRfdHlwZV9uYW1lKHRoaXNfbm9kZS0+Ci0JCQkJCQkJCSAgICB0eXBlKSwKLQkJCQkJICAgICAgYWNwaV91dF9nZXRfdHlwZV9uYW1lCi0JCQkJCSAgICAgICh0eXBlX3RvX2NoZWNrX2ZvcikpKTsKLQkJCX0KLQotCQkJLyoKLQkJCSAqIElmIHRoaXMgaXMgdGhlIGxhc3QgbmFtZSBzZWdtZW50IGFuZCB3ZSBhcmUgbm90IGxvb2tpbmcgZm9yIGEKLQkJCSAqIHNwZWNpZmljIHR5cGUsIGJ1dCB0aGUgdHlwZSBvZiBmb3VuZCBvYmplY3QgaXMga25vd24sIHVzZSB0aGF0IHR5cGUKLQkJCSAqIHRvIChsYXRlcikgc2VlIGlmIGl0IG9wZW5zIGEgc2NvcGUuCi0JCQkgKi8KLQkJCWlmICh0eXBlID09IEFDUElfVFlQRV9BTlkpIHsKLQkJCQl0eXBlID0gdGhpc19ub2RlLT50eXBlOwotCQkJfQotCQl9Ci0KLQkJLyogUG9pbnQgdG8gbmV4dCBuYW1lIHNlZ21lbnQgYW5kIG1ha2UgdGhpcyBub2RlIGN1cnJlbnQgKi8KLQotCQlwYXRoICs9IEFDUElfTkFNRV9TSVpFOwotCQljdXJyZW50X25vZGUgPSB0aGlzX25vZGU7Ci0JfQotCi0JLyoKLQkgKiBBbHdheXMgY2hlY2sgaWYgd2UgbmVlZCB0byBvcGVuIGEgbmV3IHNjb3BlCi0JICovCi0JaWYgKCEoZmxhZ3MgJiBBQ1BJX05TX0RPTlRfT1BFTl9TQ09QRSkgJiYgKHdhbGtfc3RhdGUpKSB7Ci0JCS8qCi0JCSAqIElmIGVudHJ5IGlzIGEgdHlwZSB3aGljaCBvcGVucyBhIHNjb3BlLCBwdXNoIHRoZSBuZXcgc2NvcGUgb24gdGhlCi0JCSAqIHNjb3BlIHN0YWNrLgotCQkgKi8KLQkJaWYgKGFjcGlfbnNfb3BlbnNfc2NvcGUodHlwZSkpIHsKLQkJCXN0YXR1cyA9Ci0JCQkgICAgYWNwaV9kc19zY29wZV9zdGFja19wdXNoKHRoaXNfbm9kZSwgdHlwZSwKLQkJCQkJCSAgICAgd2Fsa19zdGF0ZSk7Ci0JCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLQkJCX0KLQkJfQotCX0KLQotCSpyZXR1cm5fbm9kZSA9IHRoaXNfbm9kZTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc2FsbG9jLmMgYi9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zYWxsb2MuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ExNzQwYS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zYWxsb2MuYworKysgL2Rldi9udWxsCkBAIC0xLDQ5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIE1vZHVsZSBOYW1lOiBuc2FsbG9jIC0gTmFtZXNwYWNlIGFsbG9jYXRpb24gYW5kIGRlbGV0aW9uIHV0aWxpdGllcwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA4LCBJbnRlbCBDb3JwLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAotICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgYXQgbWluaW11bSBhIGRpc2NsYWltZXIKLSAqICAgIHN1YnN0YW50aWFsbHkgc2ltaWxhciB0byB0aGUgIk5PIFdBUlJBTlRZIiBkaXNjbGFpbWVyIGJlbG93Ci0gKiAgICAoIkRpc2NsYWltZXIiKSBhbmQgYW55IHJlZGlzdHJpYnV0aW9uIG11c3QgYmUgY29uZGl0aW9uZWQgdXBvbgotICogICAgaW5jbHVkaW5nIGEgc3Vic3RhbnRpYWxseSBzaW1pbGFyIERpc2NsYWltZXIgcmVxdWlyZW1lbnQgZm9yIGZ1cnRoZXIKLSAqICAgIGJpbmFyeSByZWRpc3RyaWJ1dGlvbi4KLSAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcwotICogICAgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICogU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBOTyBXQVJSQU5UWQotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCi0gKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUwotICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcKLSAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQotICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgotICovCi0KLSNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KLSNpbmNsdWRlIDxhY3BpL2FjbmFtZXNwLmg+Ci0KLSNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX05BTUVTUEFDRQotQUNQSV9NT0RVTEVfTkFNRSgibnNhbGxvYyIpCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfbnNfY3JlYXRlX25vZGUKLSAqCi0gKiBQQVJBTUVURVJTOiAgTmFtZSAgICAgICAgICAgIC0gTmFtZSBvZiB0aGUgbmV3IG5vZGUgKDQgY2hhciBBQ1BJIG5hbWUpCi0gKgotICogUkVUVVJOOiAgICAgIE5ldyBuYW1lc3BhY2Ugbm9kZSAoTnVsbCBvbiBmYWlsdXJlKQotICoKLSAqIERFU0NSSVBUSU9OOiBDcmVhdGUgYSBuYW1lc3BhY2Ugbm9kZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqYWNwaV9uc19jcmVhdGVfbm9kZSh1MzIgbmFtZSkKLXsKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZTsKLSNpZmRlZiBBQ1BJX0RCR19UUkFDS19BTExPQ0FUSU9OUwotCXUzMiB0ZW1wOwotI2VuZGlmCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKG5zX2NyZWF0ZV9ub2RlKTsKLQotCW5vZGUgPSBhY3BpX29zX2FjcXVpcmVfb2JqZWN0KGFjcGlfZ2JsX25hbWVzcGFjZV9jYWNoZSk7Ci0JaWYgKCFub2RlKSB7Ci0JCXJldHVybl9QVFIoTlVMTCk7Ci0JfQotCi0JQUNQSV9NRU1fVFJBQ0tJTkcoYWNwaV9nYmxfbnNfbm9kZV9saXN0LT50b3RhbF9hbGxvY2F0ZWQrKyk7Ci0KLSNpZmRlZiBBQ1BJX0RCR19UUkFDS19BTExPQ0FUSU9OUwotCXRlbXAgPQotCSAgICBhY3BpX2dibF9uc19ub2RlX2xpc3QtPnRvdGFsX2FsbG9jYXRlZCAtCi0JICAgIGFjcGlfZ2JsX25zX25vZGVfbGlzdC0+dG90YWxfZnJlZWQ7Ci0JaWYgKHRlbXAgPiBhY3BpX2dibF9uc19ub2RlX2xpc3QtPm1heF9vY2N1cGllZCkgewotCQlhY3BpX2dibF9uc19ub2RlX2xpc3QtPm1heF9vY2N1cGllZCA9IHRlbXA7Ci0JfQotI2VuZGlmCi0KLQlub2RlLT5uYW1lLmludGVnZXIgPSBuYW1lOwotCUFDUElfU0VUX0RFU0NSSVBUT1JfVFlQRShub2RlLCBBQ1BJX0RFU0NfVFlQRV9OQU1FRCk7Ci0JcmV0dXJuX1BUUihub2RlKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9uc19kZWxldGVfbm9kZQotICoKLSAqIFBBUkFNRVRFUlM6ICBOb2RlICAgICAgICAgICAgLSBOb2RlIHRvIGJlIGRlbGV0ZWQKLSAqCi0gKiBSRVRVUk46ICAgICAgTm9uZQotICoKLSAqIERFU0NSSVBUSU9OOiBEZWxldGUgYSBuYW1lc3BhY2Ugbm9kZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXZvaWQgYWNwaV9uc19kZWxldGVfbm9kZShzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZSkKLXsKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqcGFyZW50X25vZGU7Ci0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKnByZXZfbm9kZTsKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbmV4dF9ub2RlOwotCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIobnNfZGVsZXRlX25vZGUsIG5vZGUpOwotCi0JcGFyZW50X25vZGUgPSBhY3BpX25zX2dldF9wYXJlbnRfbm9kZShub2RlKTsKLQotCXByZXZfbm9kZSA9IE5VTEw7Ci0JbmV4dF9ub2RlID0gcGFyZW50X25vZGUtPmNoaWxkOwotCi0JLyogRmluZCB0aGUgbm9kZSB0aGF0IGlzIHRoZSBwcmV2aW91cyBwZWVyIGluIHRoZSBwYXJlbnQncyBjaGlsZCBsaXN0ICovCi0KLQl3aGlsZSAobmV4dF9ub2RlICE9IG5vZGUpIHsKLQkJcHJldl9ub2RlID0gbmV4dF9ub2RlOwotCQluZXh0X25vZGUgPSBwcmV2X25vZGUtPnBlZXI7Ci0JfQotCi0JaWYgKHByZXZfbm9kZSkgewotCi0JCS8qIE5vZGUgaXMgbm90IGZpcnN0IGNoaWxkLCB1bmxpbmsgaXQgKi8KLQotCQlwcmV2X25vZGUtPnBlZXIgPSBuZXh0X25vZGUtPnBlZXI7Ci0JCWlmIChuZXh0X25vZGUtPmZsYWdzICYgQU5PQkpfRU5EX09GX1BFRVJfTElTVCkgewotCQkJcHJldl9ub2RlLT5mbGFncyB8PSBBTk9CSl9FTkRfT0ZfUEVFUl9MSVNUOwotCQl9Ci0JfSBlbHNlIHsKLQkJLyogTm9kZSBpcyBmaXJzdCBjaGlsZCAoaGFzIG5vIHByZXZpb3VzIHBlZXIpICovCi0KLQkJaWYgKG5leHRfbm9kZS0+ZmxhZ3MgJiBBTk9CSl9FTkRfT0ZfUEVFUl9MSVNUKSB7Ci0KLQkJCS8qIE5vIHBlZXJzIGF0IGFsbCAqLwotCi0JCQlwYXJlbnRfbm9kZS0+Y2hpbGQgPSBOVUxMOwotCQl9IGVsc2UgewkvKiBMaW5rIHBlZXIgbGlzdCB0byBwYXJlbnQgKi8KLQotCQkJcGFyZW50X25vZGUtPmNoaWxkID0gbmV4dF9ub2RlLT5wZWVyOwotCQl9Ci0JfQotCi0JQUNQSV9NRU1fVFJBQ0tJTkcoYWNwaV9nYmxfbnNfbm9kZV9saXN0LT50b3RhbF9mcmVlZCsrKTsKLQotCS8qCi0JICogRGV0YWNoIGFuIG9iamVjdCBpZiB0aGVyZSBpcyBvbmUsIHRoZW4gZGVsZXRlIHRoZSBub2RlCi0JICovCi0JYWNwaV9uc19kZXRhY2hfb2JqZWN0KG5vZGUpOwotCSh2b2lkKWFjcGlfb3NfcmVsZWFzZV9vYmplY3QoYWNwaV9nYmxfbmFtZXNwYWNlX2NhY2hlLCBub2RlKTsKLQlyZXR1cm5fVk9JRDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9uc19pbnN0YWxsX25vZGUKLSAqCi0gKiBQQVJBTUVURVJTOiAgd2Fsa19zdGF0ZSAgICAgIC0gQ3VycmVudCBzdGF0ZSBvZiB0aGUgd2FsawotICogICAgICAgICAgICAgIHBhcmVudF9ub2RlICAgICAtIFRoZSBwYXJlbnQgb2YgdGhlIG5ldyBOb2RlCi0gKiAgICAgICAgICAgICAgTm9kZSAgICAgICAgICAgIC0gVGhlIG5ldyBOb2RlIHRvIGluc3RhbGwKLSAqICAgICAgICAgICAgICBUeXBlICAgICAgICAgICAgLSBBQ1BJIG9iamVjdCB0eXBlIG9mIHRoZSBuZXcgTm9kZQotICoKLSAqIFJFVFVSTjogICAgICBOb25lCi0gKgotICogREVTQ1JJUFRJT046IEluaXRpYWxpemUgYSBuZXcgbmFtZXNwYWNlIG5vZGUgYW5kIGluc3RhbGwgaXQgYW1vbmdzdAotICogICAgICAgICAgICAgIGl0cyBwZWVycy4KLSAqCi0gKiAgICAgICAgICAgICAgTm90ZTogQ3VycmVudCBuYW1lc3BhY2UgbG9va3VwIGlzIGxpbmVhciBzZWFyY2guIFRoaXMgYXBwZWFycwotICogICAgICAgICAgICAgIHRvIGJlIHN1ZmZpY2llbnQgYXMgbmFtZXNwYWNlIHNlYXJjaGVzIGNvbnN1bWUgb25seSBhIHNtYWxsCi0gKiAgICAgICAgICAgICAgZnJhY3Rpb24gb2YgdGhlIGV4ZWN1dGlvbiB0aW1lIG9mIHRoZSBBQ1BJIHN1YnN5c3RlbS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi12b2lkIGFjcGlfbnNfaW5zdGFsbF9ub2RlKHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUsIHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpwYXJlbnRfbm9kZSwJLyogUGFyZW50ICovCi0JCQkgIHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlLAkvKiBOZXcgQ2hpbGQgKi8KLQkJCSAgYWNwaV9vYmplY3RfdHlwZSB0eXBlKQotewotCWFjcGlfb3duZXJfaWQgb3duZXJfaWQgPSAwOwotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpjaGlsZF9ub2RlOwotCi0JQUNQSV9GVU5DVElPTl9UUkFDRShuc19pbnN0YWxsX25vZGUpOwotCi0JLyoKLQkgKiBHZXQgdGhlIG93bmVyIElEIGZyb20gdGhlIFdhbGsgc3RhdGUKLQkgKiBUaGUgb3duZXIgSUQgaXMgdXNlZCB0byB0cmFjayB0YWJsZSBkZWxldGlvbiBhbmQKLQkgKiBkZWxldGlvbiBvZiBvYmplY3RzIGNyZWF0ZWQgYnkgbWV0aG9kcwotCSAqLwotCWlmICh3YWxrX3N0YXRlKSB7Ci0JCW93bmVyX2lkID0gd2Fsa19zdGF0ZS0+b3duZXJfaWQ7Ci0JfQotCi0JLyogTGluayB0aGUgbmV3IGVudHJ5IGludG8gdGhlIHBhcmVudCBhbmQgZXhpc3RpbmcgY2hpbGRyZW4gKi8KLQotCWNoaWxkX25vZGUgPSBwYXJlbnRfbm9kZS0+Y2hpbGQ7Ci0JaWYgKCFjaGlsZF9ub2RlKSB7Ci0JCXBhcmVudF9ub2RlLT5jaGlsZCA9IG5vZGU7Ci0JCW5vZGUtPmZsYWdzIHw9IEFOT0JKX0VORF9PRl9QRUVSX0xJU1Q7Ci0JCW5vZGUtPnBlZXIgPSBwYXJlbnRfbm9kZTsKLQl9IGVsc2UgewotCQl3aGlsZSAoIShjaGlsZF9ub2RlLT5mbGFncyAmIEFOT0JKX0VORF9PRl9QRUVSX0xJU1QpKSB7Ci0JCQljaGlsZF9ub2RlID0gY2hpbGRfbm9kZS0+cGVlcjsKLQkJfQotCi0JCWNoaWxkX25vZGUtPnBlZXIgPSBub2RlOwotCi0JCS8qIENsZWFyIGVuZC1vZi1saXN0IGZsYWcgKi8KLQotCQljaGlsZF9ub2RlLT5mbGFncyAmPSB+QU5PQkpfRU5EX09GX1BFRVJfTElTVDsKLQkJbm9kZS0+ZmxhZ3MgfD0gQU5PQkpfRU5EX09GX1BFRVJfTElTVDsKLQkJbm9kZS0+cGVlciA9IHBhcmVudF9ub2RlOwotCX0KLQotCS8qIEluaXQgdGhlIG5ldyBlbnRyeSAqLwotCi0Jbm9kZS0+b3duZXJfaWQgPSBvd25lcl9pZDsKLQlub2RlLT50eXBlID0gKHU4KSB0eXBlOwotCi0JQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9OQU1FUywKLQkJCSAgIiU0LjRzICglcykgW05vZGUgJXAgT3duZXIgJVhdIGFkZGVkIHRvICU0LjRzICglcykgW05vZGUgJXBdXG4iLAotCQkJICBhY3BpX3V0X2dldF9ub2RlX25hbWUobm9kZSksCi0JCQkgIGFjcGlfdXRfZ2V0X3R5cGVfbmFtZShub2RlLT50eXBlKSwgbm9kZSwgb3duZXJfaWQsCi0JCQkgIGFjcGlfdXRfZ2V0X25vZGVfbmFtZShwYXJlbnRfbm9kZSksCi0JCQkgIGFjcGlfdXRfZ2V0X3R5cGVfbmFtZShwYXJlbnRfbm9kZS0+dHlwZSksCi0JCQkgIHBhcmVudF9ub2RlKSk7Ci0KLQlyZXR1cm5fVk9JRDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9uc19kZWxldGVfY2hpbGRyZW4KLSAqCi0gKiBQQVJBTUVURVJTOiAgcGFyZW50X25vZGUgICAgIC0gRGVsZXRlIHRoaXMgb2JqZWN0cyBjaGlsZHJlbgotICoKLSAqIFJFVFVSTjogICAgICBOb25lLgotICoKLSAqIERFU0NSSVBUSU9OOiBEZWxldGUgYWxsIGNoaWxkcmVuIG9mIHRoZSBwYXJlbnQgb2JqZWN0LiBJbiBvdGhlciB3b3JkcywKLSAqICAgICAgICAgICAgICBkZWxldGVzIGEgInNjb3BlIi4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi12b2lkIGFjcGlfbnNfZGVsZXRlX2NoaWxkcmVuKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpwYXJlbnRfbm9kZSkKLXsKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqY2hpbGRfbm9kZTsKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbmV4dF9ub2RlOwotCXU4IGZsYWdzOwotCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIobnNfZGVsZXRlX2NoaWxkcmVuLCBwYXJlbnRfbm9kZSk7Ci0KLQlpZiAoIXBhcmVudF9ub2RlKSB7Ci0JCXJldHVybl9WT0lEOwotCX0KLQotCS8qIElmIG5vIGNoaWxkcmVuLCBhbGwgZG9uZSEgKi8KLQotCWNoaWxkX25vZGUgPSBwYXJlbnRfbm9kZS0+Y2hpbGQ7Ci0JaWYgKCFjaGlsZF9ub2RlKSB7Ci0JCXJldHVybl9WT0lEOwotCX0KLQotCS8qCi0JICogRGVhbGxvY2F0ZSBhbGwgY2hpbGRyZW4gYXQgdGhpcyBsZXZlbAotCSAqLwotCWRvIHsKLQotCQkvKiBHZXQgdGhlIHRoaW5ncyB3ZSBuZWVkICovCi0KLQkJbmV4dF9ub2RlID0gY2hpbGRfbm9kZS0+cGVlcjsKLQkJZmxhZ3MgPSBjaGlsZF9ub2RlLT5mbGFnczsKLQotCQkvKiBHcmFuZGNoaWxkcmVuIHNob3VsZCBoYXZlIGFsbCBiZWVuIGRlbGV0ZWQgYWxyZWFkeSAqLwotCi0JCWlmIChjaGlsZF9ub2RlLT5jaGlsZCkgewotCQkJQUNQSV9FUlJPUigoQUVfSU5GTywgIkZvdW5kIGEgZ3JhbmRjaGlsZCEgUD0lcCBDPSVwIiwKLQkJCQkgICAgcGFyZW50X25vZGUsIGNoaWxkX25vZGUpKTsKLQkJfQotCi0JCS8qIE5vdyB3ZSBjYW4gZnJlZSB0aGlzIGNoaWxkIG9iamVjdCAqLwotCi0JCUFDUElfTUVNX1RSQUNLSU5HKGFjcGlfZ2JsX25zX25vZGVfbGlzdC0+dG90YWxfZnJlZWQrKyk7Ci0KLQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9BTExPQ0FUSU9OUywKLQkJCQkgICJPYmplY3QgJXAsIFJlbWFpbmluZyAlWFxuIiwgY2hpbGRfbm9kZSwKLQkJCQkgIGFjcGlfZ2JsX2N1cnJlbnRfbm9kZV9jb3VudCkpOwotCi0JCS8qCi0JCSAqIERldGFjaCBhbiBvYmplY3QgaWYgdGhlcmUgaXMgb25lLCB0aGVuIGZyZWUgdGhlIGNoaWxkIG5vZGUKLQkJICovCi0JCWFjcGlfbnNfZGV0YWNoX29iamVjdChjaGlsZF9ub2RlKTsKLQotCQkvKiBOb3cgd2UgY2FuIGRlbGV0ZSB0aGUgbm9kZSAqLwotCi0JCSh2b2lkKWFjcGlfb3NfcmVsZWFzZV9vYmplY3QoYWNwaV9nYmxfbmFtZXNwYWNlX2NhY2hlLAotCQkJCQkgICAgIGNoaWxkX25vZGUpOwotCi0JCS8qIEFuZCBtb3ZlIG9uIHRvIHRoZSBuZXh0IGNoaWxkIGluIHRoZSBsaXN0ICovCi0KLQkJY2hpbGRfbm9kZSA9IG5leHRfbm9kZTsKLQotCX0gd2hpbGUgKCEoZmxhZ3MgJiBBTk9CSl9FTkRfT0ZfUEVFUl9MSVNUKSk7Ci0KLQkvKiBDbGVhciB0aGUgcGFyZW50J3MgY2hpbGQgcG9pbnRlciAqLwotCi0JcGFyZW50X25vZGUtPmNoaWxkID0gTlVMTDsKLQotCXJldHVybl9WT0lEOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX25zX2RlbGV0ZV9uYW1lc3BhY2Vfc3VidHJlZQotICoKLSAqIFBBUkFNRVRFUlM6ICBwYXJlbnRfbm9kZSAgICAgLSBSb290IG9mIHRoZSBzdWJ0cmVlIHRvIGJlIGRlbGV0ZWQKLSAqCi0gKiBSRVRVUk46ICAgICAgTm9uZS4KLSAqCi0gKiBERVNDUklQVElPTjogRGVsZXRlIGEgc3VidHJlZSBvZiB0aGUgbmFtZXNwYWNlLiAgVGhpcyBpbmNsdWRlcyBhbGwgb2JqZWN0cwotICogICAgICAgICAgICAgIHN0b3JlZCB3aXRoaW4gdGhlIHN1YnRyZWUuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdm9pZCBhY3BpX25zX2RlbGV0ZV9uYW1lc3BhY2Vfc3VidHJlZShzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqcGFyZW50X25vZGUpCi17Ci0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKmNoaWxkX25vZGUgPSBOVUxMOwotCXUzMiBsZXZlbCA9IDE7Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKG5zX2RlbGV0ZV9uYW1lc3BhY2Vfc3VidHJlZSk7Ci0KLQlpZiAoIXBhcmVudF9ub2RlKSB7Ci0JCXJldHVybl9WT0lEOwotCX0KLQotCS8qCi0JICogVHJhdmVyc2UgdGhlIHRyZWUgb2Ygb2JqZWN0cyB1bnRpbCB3ZSBidWJibGUgYmFjayB1cAotCSAqIHRvIHdoZXJlIHdlIHN0YXJ0ZWQuCi0JICovCi0Jd2hpbGUgKGxldmVsID4gMCkgewotCi0JCS8qIEdldCB0aGUgbmV4dCBub2RlIGluIHRoaXMgc2NvcGUgKE5VTEwgaWYgbm9uZSkgKi8KLQotCQljaGlsZF9ub2RlID0KLQkJICAgIGFjcGlfbnNfZ2V0X25leHRfbm9kZShBQ1BJX1RZUEVfQU5ZLCBwYXJlbnRfbm9kZSwKLQkJCQkJICBjaGlsZF9ub2RlKTsKLQkJaWYgKGNoaWxkX25vZGUpIHsKLQotCQkJLyogRm91bmQgYSBjaGlsZCBub2RlIC0gZGV0YWNoIGFueSBhdHRhY2hlZCBvYmplY3QgKi8KLQotCQkJYWNwaV9uc19kZXRhY2hfb2JqZWN0KGNoaWxkX25vZGUpOwotCi0JCQkvKiBDaGVjayBpZiB0aGlzIG5vZGUgaGFzIGFueSBjaGlsZHJlbiAqLwotCi0JCQlpZiAoYWNwaV9uc19nZXRfbmV4dF9ub2RlCi0JCQkgICAgKEFDUElfVFlQRV9BTlksIGNoaWxkX25vZGUsIE5VTEwpKSB7Ci0JCQkJLyoKLQkJCQkgKiBUaGVyZSBpcyBhdCBsZWFzdCBvbmUgY2hpbGQgb2YgdGhpcyBub2RlLAotCQkJCSAqIHZpc2l0IHRoZSBub2RlCi0JCQkJICovCi0JCQkJbGV2ZWwrKzsKLQkJCQlwYXJlbnRfbm9kZSA9IGNoaWxkX25vZGU7Ci0JCQkJY2hpbGRfbm9kZSA9IE5VTEw7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQkvKgotCQkJICogTm8gbW9yZSBjaGlsZHJlbiBvZiB0aGlzIHBhcmVudCBub2RlLgotCQkJICogTW92ZSB1cCB0byB0aGUgZ3JhbmRwYXJlbnQuCi0JCQkgKi8KLQkJCWxldmVsLS07Ci0KLQkJCS8qCi0JCQkgKiBOb3cgZGVsZXRlIGFsbCBvZiB0aGUgY2hpbGRyZW4gb2YgdGhpcyBwYXJlbnQKLQkJCSAqIGFsbCBhdCB0aGUgc2FtZSB0aW1lLgotCQkJICovCi0JCQlhY3BpX25zX2RlbGV0ZV9jaGlsZHJlbihwYXJlbnRfbm9kZSk7Ci0KLQkJCS8qIE5ldyAibGFzdCBjaGlsZCIgaXMgdGhpcyBwYXJlbnQgbm9kZSAqLwotCi0JCQljaGlsZF9ub2RlID0gcGFyZW50X25vZGU7Ci0KLQkJCS8qIE1vdmUgdXAgdGhlIHRyZWUgdG8gdGhlIGdyYW5kcGFyZW50ICovCi0KLQkJCXBhcmVudF9ub2RlID0gYWNwaV9uc19nZXRfcGFyZW50X25vZGUocGFyZW50X25vZGUpOwotCQl9Ci0JfQotCi0JcmV0dXJuX1ZPSUQ7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfbnNfZGVsZXRlX25hbWVzcGFjZV9ieV9vd25lcgotICoKLSAqIFBBUkFNRVRFUlM6ICBvd25lcl9pZCAgICAtIEFsbCBub2RlcyB3aXRoIHRoaXMgb3duZXIgd2lsbCBiZSBkZWxldGVkCi0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cwotICoKLSAqIERFU0NSSVBUSU9OOiBEZWxldGUgZW50cmllcyB3aXRoaW4gdGhlIG5hbWVzcGFjZSB0aGF0IGFyZSBvd25lZCBieSBhCi0gKiAgICAgICAgICAgICAgc3BlY2lmaWMgSUQuICBVc2VkIHRvIGRlbGV0ZSBlbnRpcmUgQUNQSSB0YWJsZXMuICBBbGwKLSAqICAgICAgICAgICAgICByZWZlcmVuY2UgY291bnRzIGFyZSB1cGRhdGVkLgotICoKLSAqIE1VVEVYOiAgICAgICBMb2NrcyBuYW1lc3BhY2UgZHVyaW5nIGRlbGV0aW9uIHdhbGsuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdm9pZCBhY3BpX25zX2RlbGV0ZV9uYW1lc3BhY2VfYnlfb3duZXIoYWNwaV9vd25lcl9pZCBvd25lcl9pZCkKLXsKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqY2hpbGRfbm9kZTsKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqZGVsZXRpb25fbm9kZTsKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqcGFyZW50X25vZGU7Ci0JdTMyIGxldmVsOwotCWFjcGlfc3RhdHVzIHN0YXR1czsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0VfVTMyKG5zX2RlbGV0ZV9uYW1lc3BhY2VfYnlfb3duZXIsIG93bmVyX2lkKTsKLQotCWlmIChvd25lcl9pZCA9PSAwKSB7Ci0JCXJldHVybl9WT0lEOwotCX0KLQotCS8qIExvY2sgbmFtZXNwYWNlIGZvciBwb3NzaWJsZSB1cGRhdGUgKi8KLQotCXN0YXR1cyA9IGFjcGlfdXRfYWNxdWlyZV9tdXRleChBQ1BJX01UWF9OQU1FU1BBQ0UpOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlyZXR1cm5fVk9JRDsKLQl9Ci0KLQlkZWxldGlvbl9ub2RlID0gTlVMTDsKLQlwYXJlbnRfbm9kZSA9IGFjcGlfZ2JsX3Jvb3Rfbm9kZTsKLQljaGlsZF9ub2RlID0gTlVMTDsKLQlsZXZlbCA9IDE7Ci0KLQkvKgotCSAqIFRyYXZlcnNlIHRoZSB0cmVlIG9mIG5vZGVzIHVudGlsIHdlIGJ1YmJsZSBiYWNrIHVwCi0JICogdG8gd2hlcmUgd2Ugc3RhcnRlZC4KLQkgKi8KLQl3aGlsZSAobGV2ZWwgPiAwKSB7Ci0JCS8qCi0JCSAqIEdldCB0aGUgbmV4dCBjaGlsZCBvZiB0aGlzIHBhcmVudCBub2RlLiBXaGVuIGNoaWxkX25vZGUgaXMgTlVMTCwKLQkJICogdGhlIGZpcnN0IGNoaWxkIG9mIHRoZSBwYXJlbnQgaXMgcmV0dXJuZWQKLQkJICovCi0JCWNoaWxkX25vZGUgPQotCQkgICAgYWNwaV9uc19nZXRfbmV4dF9ub2RlKEFDUElfVFlQRV9BTlksIHBhcmVudF9ub2RlLAotCQkJCQkgIGNoaWxkX25vZGUpOwotCi0JCWlmIChkZWxldGlvbl9ub2RlKSB7Ci0JCQlhY3BpX25zX2RlbGV0ZV9jaGlsZHJlbihkZWxldGlvbl9ub2RlKTsKLQkJCWFjcGlfbnNfZGVsZXRlX25vZGUoZGVsZXRpb25fbm9kZSk7Ci0JCQlkZWxldGlvbl9ub2RlID0gTlVMTDsKLQkJfQotCi0JCWlmIChjaGlsZF9ub2RlKSB7Ci0JCQlpZiAoY2hpbGRfbm9kZS0+b3duZXJfaWQgPT0gb3duZXJfaWQpIHsKLQotCQkJCS8qIEZvdW5kIGEgbWF0Y2hpbmcgY2hpbGQgbm9kZSAtIGRldGFjaCBhbnkgYXR0YWNoZWQgb2JqZWN0ICovCi0KLQkJCQlhY3BpX25zX2RldGFjaF9vYmplY3QoY2hpbGRfbm9kZSk7Ci0JCQl9Ci0KLQkJCS8qIENoZWNrIGlmIHRoaXMgbm9kZSBoYXMgYW55IGNoaWxkcmVuICovCi0KLQkJCWlmIChhY3BpX25zX2dldF9uZXh0X25vZGUKLQkJCSAgICAoQUNQSV9UWVBFX0FOWSwgY2hpbGRfbm9kZSwgTlVMTCkpIHsKLQkJCQkvKgotCQkJCSAqIFRoZXJlIGlzIGF0IGxlYXN0IG9uZSBjaGlsZCBvZiB0aGlzIG5vZGUsCi0JCQkJICogdmlzaXQgdGhlIG5vZGUKLQkJCQkgKi8KLQkJCQlsZXZlbCsrOwotCQkJCXBhcmVudF9ub2RlID0gY2hpbGRfbm9kZTsKLQkJCQljaGlsZF9ub2RlID0gTlVMTDsKLQkJCX0gZWxzZSBpZiAoY2hpbGRfbm9kZS0+b3duZXJfaWQgPT0gb3duZXJfaWQpIHsKLQkJCQlkZWxldGlvbl9ub2RlID0gY2hpbGRfbm9kZTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCS8qCi0JCQkgKiBObyBtb3JlIGNoaWxkcmVuIG9mIHRoaXMgcGFyZW50IG5vZGUuCi0JCQkgKiBNb3ZlIHVwIHRvIHRoZSBncmFuZHBhcmVudC4KLQkJCSAqLwotCQkJbGV2ZWwtLTsKLQkJCWlmIChsZXZlbCAhPSAwKSB7Ci0JCQkJaWYgKHBhcmVudF9ub2RlLT5vd25lcl9pZCA9PSBvd25lcl9pZCkgewotCQkJCQlkZWxldGlvbl9ub2RlID0gcGFyZW50X25vZGU7Ci0JCQkJfQotCQkJfQotCi0JCQkvKiBOZXcgImxhc3QgY2hpbGQiIGlzIHRoaXMgcGFyZW50IG5vZGUgKi8KLQotCQkJY2hpbGRfbm9kZSA9IHBhcmVudF9ub2RlOwotCi0JCQkvKiBNb3ZlIHVwIHRoZSB0cmVlIHRvIHRoZSBncmFuZHBhcmVudCAqLwotCi0JCQlwYXJlbnRfbm9kZSA9IGFjcGlfbnNfZ2V0X3BhcmVudF9ub2RlKHBhcmVudF9ub2RlKTsKLQkJfQotCX0KLQotCSh2b2lkKWFjcGlfdXRfcmVsZWFzZV9tdXRleChBQ1BJX01UWF9OQU1FU1BBQ0UpOwotCXJldHVybl9WT0lEOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc2R1bXAuYyBiL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnNkdW1wLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjMGFlMzkuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc2R1bXAuYworKysgL2Rldi9udWxsCkBAIC0xLDcwOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogTW9kdWxlIE5hbWU6IG5zZHVtcCAtIHRhYmxlIGR1bXBpbmcgcm91dGluZXMgZm9yIGRlYnVnCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwOCwgSW50ZWwgQ29ycC4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKLSAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIGF0IG1pbmltdW0gYSBkaXNjbGFpbWVyCi0gKiAgICBzdWJzdGFudGlhbGx5IHNpbWlsYXIgdG8gdGhlICJOTyBXQVJSQU5UWSIgZGlzY2xhaW1lciBiZWxvdwotICogICAgKCJEaXNjbGFpbWVyIikgYW5kIGFueSByZWRpc3RyaWJ1dGlvbiBtdXN0IGJlIGNvbmRpdGlvbmVkIHVwb24KLSAqICAgIGluY2x1ZGluZyBhIHN1YnN0YW50aWFsbHkgc2ltaWxhciBEaXNjbGFpbWVyIHJlcXVpcmVtZW50IGZvciBmdXJ0aGVyCi0gKiAgICBiaW5hcnkgcmVkaXN0cmlidXRpb24uCi0gKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMKLSAqICAgIG9mIGFueSBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTk8gV0FSUkFOVFkKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAotICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKLSAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HCi0gKiBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKLSAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KLSAqLwotCi0jaW5jbHVkZSA8YWNwaS9hY3BpLmg+Ci0jaW5jbHVkZSA8YWNwaS9hY25hbWVzcC5oPgotCi0jZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9OQU1FU1BBQ0UKLUFDUElfTU9EVUxFX05BTUUoIm5zZHVtcCIpCi0KLS8qIExvY2FsIHByb3RvdHlwZXMgKi8KLSNpZmRlZiBBQ1BJX09CU09MRVRFX0ZVTkNUSU9OUwotdm9pZCBhY3BpX25zX2R1bXBfcm9vdF9kZXZpY2VzKHZvaWQpOwotCi1zdGF0aWMgYWNwaV9zdGF0dXMKLWFjcGlfbnNfZHVtcF9vbmVfZGV2aWNlKGFjcGlfaGFuZGxlIG9ial9oYW5kbGUsCi0JCQl1MzIgbGV2ZWwsIHZvaWQgKmNvbnRleHQsIHZvaWQgKipyZXR1cm5fdmFsdWUpOwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKEFDUElfREVCVUdfT1VUUFVUKSB8fCBkZWZpbmVkKEFDUElfREVCVUdHRVIpCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX25zX3ByaW50X3BhdGhuYW1lCi0gKgotICogUEFSQU1FVEVSUzogIG51bV9zZWdtZW50cyAgICAgICAgLSBOdW1iZXIgb2YgQUNQSSBuYW1lIHNlZ21lbnRzCi0gKiAgICAgICAgICAgICAgUGF0aG5hbWUgICAgICAgICAgICAtIFRoZSBjb21wcmVzc2VkIChpbnRlcm5hbCkgcGF0aAotICoKLSAqIFJFVFVSTjogICAgICBOb25lCi0gKgotICogREVTQ1JJUFRJT046IFByaW50IGFuIG9iamVjdCdzIGZ1bGwgbmFtZXNwYWNlIHBhdGhuYW1lCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdm9pZCBhY3BpX25zX3ByaW50X3BhdGhuYW1lKHUzMiBudW1fc2VnbWVudHMsIGNoYXIgKnBhdGhuYW1lKQotewotCXUzMiBpOwotCi0JQUNQSV9GVU5DVElPTl9OQU1FKG5zX3ByaW50X3BhdGhuYW1lKTsKLQotCWlmICghKGFjcGlfZGJnX2xldmVsICYgQUNQSV9MVl9OQU1FUykKLQkgICAgfHwgIShhY3BpX2RiZ19sYXllciAmIEFDUElfTkFNRVNQQUNFKSkgewotCQlyZXR1cm47Ci0JfQotCi0JLyogUHJpbnQgdGhlIGVudGlyZSBuYW1lICovCi0KLQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX05BTUVTLCAiWyIpKTsKLQotCXdoaWxlIChudW1fc2VnbWVudHMpIHsKLQkJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgewotCQkJQUNQSV9JU19QUklOVChwYXRobmFtZVtpXSkgPwotCQkJICAgIGFjcGlfb3NfcHJpbnRmKCIlYyIsIHBhdGhuYW1lW2ldKSA6Ci0JCQkgICAgYWNwaV9vc19wcmludGYoIj8iKTsKLQkJfQotCi0JCXBhdGhuYW1lICs9IEFDUElfTkFNRV9TSVpFOwotCQludW1fc2VnbWVudHMtLTsKLQkJaWYgKG51bV9zZWdtZW50cykgewotCQkJYWNwaV9vc19wcmludGYoIi4iKTsKLQkJfQotCX0KLQotCWFjcGlfb3NfcHJpbnRmKCJdXG4iKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9uc19kdW1wX3BhdGhuYW1lCi0gKgotICogUEFSQU1FVEVSUzogIEhhbmRsZSAgICAgICAgICAgICAgLSBPYmplY3QKLSAqICAgICAgICAgICAgICBNc2cgICAgICAgICAgICAgICAgIC0gUHJlZml4IG1lc3NhZ2UKLSAqICAgICAgICAgICAgICBMZXZlbCAgICAgICAgICAgICAgIC0gRGVzaXJlZCBkZWJ1ZyBsZXZlbAotICogICAgICAgICAgICAgIENvbXBvbmVudCAgICAgICAgICAgLSBDYWxsZXIncyBjb21wb25lbnQgSUQKLSAqCi0gKiBSRVRVUk46ICAgICAgTm9uZQotICoKLSAqIERFU0NSSVBUSU9OOiBQcmludCBhbiBvYmplY3QncyBmdWxsIG5hbWVzcGFjZSBwYXRobmFtZQotICogICAgICAgICAgICAgIE1hbmFnZXMgYWxsb2NhdGlvbi9mcmVlaW5nIG9mIGEgcGF0aG5hbWUgYnVmZmVyCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdm9pZAotYWNwaV9uc19kdW1wX3BhdGhuYW1lKGFjcGlfaGFuZGxlIGhhbmRsZSwgY2hhciAqbXNnLCB1MzIgbGV2ZWwsIHUzMiBjb21wb25lbnQpCi17Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKG5zX2R1bXBfcGF0aG5hbWUpOwotCi0JLyogRG8gdGhpcyBvbmx5IGlmIHRoZSByZXF1ZXN0ZWQgZGVidWcgbGV2ZWwgYW5kIGNvbXBvbmVudCBhcmUgZW5hYmxlZCAqLwotCi0JaWYgKCEoYWNwaV9kYmdfbGV2ZWwgJiBsZXZlbCkgfHwgIShhY3BpX2RiZ19sYXllciAmIGNvbXBvbmVudCkpIHsKLQkJcmV0dXJuX1ZPSUQ7Ci0JfQotCi0JLyogQ29udmVydCBoYW5kbGUgdG8gYSBmdWxsIHBhdGhuYW1lIGFuZCBwcmludCBpdCAod2l0aCBzdXBwbGllZCBtZXNzYWdlKSAqLwotCi0JYWNwaV9uc19wcmludF9ub2RlX3BhdGhuYW1lKGhhbmRsZSwgbXNnKTsKLQlhY3BpX29zX3ByaW50ZigiXG4iKTsKLQlyZXR1cm5fVk9JRDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9uc19kdW1wX29uZV9vYmplY3QKLSAqCi0gKiBQQVJBTUVURVJTOiAgb2JqX2hhbmRsZSAgICAgICAgICAtIE5vZGUgdG8gYmUgZHVtcGVkCi0gKiAgICAgICAgICAgICAgTGV2ZWwgICAgICAgICAgICAgICAtIE5lc3RpbmcgbGV2ZWwgb2YgdGhlIGhhbmRsZQotICogICAgICAgICAgICAgIENvbnRleHQgICAgICAgICAgICAgLSBQYXNzZWQgaW50byB3YWxrX25hbWVzcGFjZQotICogICAgICAgICAgICAgIHJldHVybl92YWx1ZSAgICAgICAgLSBOb3QgdXNlZAotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKLSAqCi0gKiBERVNDUklQVElPTjogRHVtcCBhIHNpbmdsZSBOb2RlCi0gKiAgICAgICAgICAgICAgVGhpcyBwcm9jZWR1cmUgaXMgYSB1c2VyX2Z1bmN0aW9uIGNhbGxlZCBieSBhY3BpX25zX3dhbGtfbmFtZXNwYWNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWFjcGlfc3RhdHVzCi1hY3BpX25zX2R1bXBfb25lX29iamVjdChhY3BpX2hhbmRsZSBvYmpfaGFuZGxlLAotCQkJdTMyIGxldmVsLCB2b2lkICpjb250ZXh0LCB2b2lkICoqcmV0dXJuX3ZhbHVlKQotewotCXN0cnVjdCBhY3BpX3dhbGtfaW5mbyAqaW5mbyA9IChzdHJ1Y3QgYWNwaV93YWxrX2luZm8gKiljb250ZXh0OwotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICp0aGlzX25vZGU7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2MgPSBOVUxMOwotCWFjcGlfb2JqZWN0X3R5cGUgb2JqX3R5cGU7Ci0JYWNwaV9vYmplY3RfdHlwZSB0eXBlOwotCXUzMiBieXRlc190b19kdW1wOwotCXUzMiBkYmdfbGV2ZWw7Ci0JdTMyIGk7Ci0KLQlBQ1BJX0ZVTkNUSU9OX05BTUUobnNfZHVtcF9vbmVfb2JqZWN0KTsKLQotCS8qIElzIG91dHB1dCBlbmFibGVkPyAqLwotCi0JaWYgKCEoYWNwaV9kYmdfbGV2ZWwgJiBpbmZvLT5kZWJ1Z19sZXZlbCkpIHsKLQkJcmV0dXJuIChBRV9PSyk7Ci0JfQotCi0JaWYgKCFvYmpfaGFuZGxlKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgIk51bGwgb2JqZWN0IGhhbmRsZVxuIikpOwotCQlyZXR1cm4gKEFFX09LKTsKLQl9Ci0KLQl0aGlzX25vZGUgPSBhY3BpX25zX21hcF9oYW5kbGVfdG9fbm9kZShvYmpfaGFuZGxlKTsKLQl0eXBlID0gdGhpc19ub2RlLT50eXBlOwotCi0JLyogQ2hlY2sgaWYgdGhlIG93bmVyIG1hdGNoZXMgKi8KLQotCWlmICgoaW5mby0+b3duZXJfaWQgIT0gQUNQSV9PV05FUl9JRF9NQVgpICYmCi0JICAgIChpbmZvLT5vd25lcl9pZCAhPSB0aGlzX25vZGUtPm93bmVyX2lkKSkgewotCQlyZXR1cm4gKEFFX09LKTsKLQl9Ci0KLQlpZiAoIShpbmZvLT5kaXNwbGF5X3R5cGUgJiBBQ1BJX0RJU1BMQVlfU0hPUlQpKSB7Ci0KLQkJLyogSW5kZW50IHRoZSBvYmplY3QgYWNjb3JkaW5nIHRvIHRoZSBsZXZlbCAqLwotCi0JCWFjcGlfb3NfcHJpbnRmKCIlMmQlKnMiLCAodTMyKSBsZXZlbCAtIDEsIChpbnQpbGV2ZWwgKiAyLCAiICIpOwotCi0JCS8qIENoZWNrIHRoZSBub2RlIHR5cGUgYW5kIG5hbWUgKi8KLQotCQlpZiAodHlwZSA+IEFDUElfVFlQRV9MT0NBTF9NQVgpIHsKLQkJCUFDUElfV0FSTklORygoQUVfSU5GTywgIkludmFsaWQgQUNQSSBPYmplY3QgVHlwZSAlMDhYIiwKLQkJCQkgICAgICB0eXBlKSk7Ci0JCX0KLQotCQlpZiAoIWFjcGlfdXRfdmFsaWRfYWNwaV9uYW1lKHRoaXNfbm9kZS0+bmFtZS5pbnRlZ2VyKSkgewotCQkJdGhpc19ub2RlLT5uYW1lLmludGVnZXIgPQotCQkJICAgIGFjcGlfdXRfcmVwYWlyX25hbWUodGhpc19ub2RlLT5uYW1lLmFzY2lpKTsKLQotCQkJQUNQSV9XQVJOSU5HKChBRV9JTkZPLCAiSW52YWxpZCBBQ1BJIE5hbWUgJTA4WCIsCi0JCQkJICAgICAgdGhpc19ub2RlLT5uYW1lLmludGVnZXIpKTsKLQkJfQotCi0JCWFjcGlfb3NfcHJpbnRmKCIlNC40cyIsIGFjcGlfdXRfZ2V0X25vZGVfbmFtZSh0aGlzX25vZGUpKTsKLQl9Ci0KLQkvKgotCSAqIE5vdyB3ZSBjYW4gcHJpbnQgb3V0IHRoZSBwZXJ0aW5lbnQgaW5mb3JtYXRpb24KLQkgKi8KLQlhY3BpX29zX3ByaW50ZigiICUtMTJzICVwICUyLjJYICIsCi0JCSAgICAgICBhY3BpX3V0X2dldF90eXBlX25hbWUodHlwZSksIHRoaXNfbm9kZSwKLQkJICAgICAgIHRoaXNfbm9kZS0+b3duZXJfaWQpOwotCi0JZGJnX2xldmVsID0gYWNwaV9kYmdfbGV2ZWw7Ci0JYWNwaV9kYmdfbGV2ZWwgPSAwOwotCW9ial9kZXNjID0gYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0KHRoaXNfbm9kZSk7Ci0JYWNwaV9kYmdfbGV2ZWwgPSBkYmdfbGV2ZWw7Ci0KLQkvKiBUZW1wIG5vZGVzIGFyZSB0aG9zZSBub2RlcyBjcmVhdGVkIGJ5IGEgY29udHJvbCBtZXRob2QgKi8KLQotCWlmICh0aGlzX25vZGUtPmZsYWdzICYgQU5PQkpfVEVNUE9SQVJZKSB7Ci0JCWFjcGlfb3NfcHJpbnRmKCIoVCkgIik7Ci0JfQotCi0Jc3dpdGNoIChpbmZvLT5kaXNwbGF5X3R5cGUgJiBBQ1BJX0RJU1BMQVlfTUFTSykgewotCWNhc2UgQUNQSV9ESVNQTEFZX1NVTU1BUlk6Ci0KLQkJaWYgKCFvYmpfZGVzYykgewotCi0JCQkvKiBObyBhdHRhY2hlZCBvYmplY3QsIHdlIGFyZSBkb25lICovCi0KLQkJCWFjcGlfb3NfcHJpbnRmKCJcbiIpOwotCQkJcmV0dXJuIChBRV9PSyk7Ci0JCX0KLQotCQlzd2l0Y2ggKHR5cGUpIHsKLQkJY2FzZSBBQ1BJX1RZUEVfUFJPQ0VTU09SOgotCi0JCQlhY3BpX29zX3ByaW50ZigiSUQgJVggTGVuICUuNFggQWRkciAlcFxuIiwKLQkJCQkgICAgICAgb2JqX2Rlc2MtPnByb2Nlc3Nvci5wcm9jX2lkLAotCQkJCSAgICAgICBvYmpfZGVzYy0+cHJvY2Vzc29yLmxlbmd0aCwKLQkJCQkgICAgICAgQUNQSV9DQVNUX1BUUih2b2lkLAotCQkJCQkJICAgICBvYmpfZGVzYy0+cHJvY2Vzc29yLgotCQkJCQkJICAgICBhZGRyZXNzKSk7Ci0JCQlicmVhazsKLQotCQljYXNlIEFDUElfVFlQRV9ERVZJQ0U6Ci0KLQkJCWFjcGlfb3NfcHJpbnRmKCJOb3RpZnkgT2JqZWN0OiAlcFxuIiwgb2JqX2Rlc2MpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBBQ1BJX1RZUEVfTUVUSE9EOgotCi0JCQlhY3BpX29zX3ByaW50ZigiQXJncyAlWCBMZW4gJS40WCBBbWwgJXBcbiIsCi0JCQkJICAgICAgICh1MzIpIG9ial9kZXNjLT5tZXRob2QucGFyYW1fY291bnQsCi0JCQkJICAgICAgIG9ial9kZXNjLT5tZXRob2QuYW1sX2xlbmd0aCwKLQkJCQkgICAgICAgb2JqX2Rlc2MtPm1ldGhvZC5hbWxfc3RhcnQpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBBQ1BJX1RZUEVfSU5URUdFUjoKLQotCQkJYWNwaV9vc19wcmludGYoIj0gJTguOFglOC44WFxuIiwKLQkJCQkgICAgICAgQUNQSV9GT1JNQVRfVUlOVDY0KG9ial9kZXNjLT5pbnRlZ2VyLgotCQkJCQkJCSAgdmFsdWUpKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgQUNQSV9UWVBFX1BBQ0tBR0U6Ci0KLQkJCWlmIChvYmpfZGVzYy0+Y29tbW9uLmZsYWdzICYgQU9QT0JKX0RBVEFfVkFMSUQpIHsKLQkJCQlhY3BpX29zX3ByaW50ZigiRWxlbWVudHMgJS4yWFxuIiwKLQkJCQkJICAgICAgIG9ial9kZXNjLT5wYWNrYWdlLmNvdW50KTsKLQkJCX0gZWxzZSB7Ci0JCQkJYWNwaV9vc19wcmludGYoIltMZW5ndGggbm90IHlldCBldmFsdWF0ZWRdXG4iKTsKLQkJCX0KLQkJCWJyZWFrOwotCi0JCWNhc2UgQUNQSV9UWVBFX0JVRkZFUjoKLQotCQkJaWYgKG9ial9kZXNjLT5jb21tb24uZmxhZ3MgJiBBT1BPQkpfREFUQV9WQUxJRCkgewotCQkJCWFjcGlfb3NfcHJpbnRmKCJMZW4gJS4yWCIsCi0JCQkJCSAgICAgICBvYmpfZGVzYy0+YnVmZmVyLmxlbmd0aCk7Ci0KLQkJCQkvKiBEdW1wIHNvbWUgb2YgdGhlIGJ1ZmZlciAqLwotCi0JCQkJaWYgKG9ial9kZXNjLT5idWZmZXIubGVuZ3RoID4gMCkgewotCQkJCQlhY3BpX29zX3ByaW50ZigiID0iKTsKLQkJCQkJZm9yIChpID0gMDsKLQkJCQkJICAgICAoaSA8IG9ial9kZXNjLT5idWZmZXIubGVuZ3RoCi0JCQkJCSAgICAgICYmIGkgPCAxMik7IGkrKykgewotCQkJCQkJYWNwaV9vc19wcmludGYoIiAlLjJoWCIsCi0JCQkJCQkJICAgICAgIG9ial9kZXNjLT5idWZmZXIuCi0JCQkJCQkJICAgICAgIHBvaW50ZXJbaV0pOwotCQkJCQl9Ci0JCQkJfQotCQkJCWFjcGlfb3NfcHJpbnRmKCJcbiIpOwotCQkJfSBlbHNlIHsKLQkJCQlhY3BpX29zX3ByaW50ZigiW0xlbmd0aCBub3QgeWV0IGV2YWx1YXRlZF1cbiIpOwotCQkJfQotCQkJYnJlYWs7Ci0KLQkJY2FzZSBBQ1BJX1RZUEVfU1RSSU5HOgotCi0JCQlhY3BpX29zX3ByaW50ZigiTGVuICUuMlggIiwgb2JqX2Rlc2MtPnN0cmluZy5sZW5ndGgpOwotCQkJYWNwaV91dF9wcmludF9zdHJpbmcob2JqX2Rlc2MtPnN0cmluZy5wb2ludGVyLCAzMik7Ci0JCQlhY3BpX29zX3ByaW50ZigiXG4iKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgQUNQSV9UWVBFX1JFR0lPTjoKLQotCQkJYWNwaV9vc19wcmludGYoIlslc10iLAotCQkJCSAgICAgICBhY3BpX3V0X2dldF9yZWdpb25fbmFtZShvYmpfZGVzYy0+cmVnaW9uLgotCQkJCQkJCSAgICAgICBzcGFjZV9pZCkpOwotCQkJaWYgKG9ial9kZXNjLT5yZWdpb24uZmxhZ3MgJiBBT1BPQkpfREFUQV9WQUxJRCkgewotCQkJCWFjcGlfb3NfcHJpbnRmKCIgQWRkciAlOC44WCU4LjhYIExlbiAlLjRYXG4iLAotCQkJCQkgICAgICAgQUNQSV9GT1JNQVRfTkFUSVZFX1VJTlQKLQkJCQkJICAgICAgIChvYmpfZGVzYy0+cmVnaW9uLmFkZHJlc3MpLAotCQkJCQkgICAgICAgb2JqX2Rlc2MtPnJlZ2lvbi5sZW5ndGgpOwotCQkJfSBlbHNlIHsKLQkJCQlhY3BpX29zX3ByaW50ZgotCQkJCSAgICAoIiBbQWRkcmVzcy9MZW5ndGggbm90IHlldCBldmFsdWF0ZWRdXG4iKTsKLQkJCX0KLQkJCWJyZWFrOwotCi0JCWNhc2UgQUNQSV9UWVBFX0xPQ0FMX1JFRkVSRU5DRToKLQotCQkJYWNwaV9vc19wcmludGYoIlslc11cbiIsCi0JCQkJICAgICAgIGFjcGlfdXRfZ2V0X3JlZmVyZW5jZV9uYW1lKG9ial9kZXNjKSk7Ci0JCQlicmVhazsKLQotCQljYXNlIEFDUElfVFlQRV9CVUZGRVJfRklFTEQ6Ci0KLQkJCWlmIChvYmpfZGVzYy0+YnVmZmVyX2ZpZWxkLmJ1ZmZlcl9vYmogJiYKLQkJCSAgICBvYmpfZGVzYy0+YnVmZmVyX2ZpZWxkLmJ1ZmZlcl9vYmotPmJ1ZmZlci5ub2RlKSB7Ci0JCQkJYWNwaV9vc19wcmludGYoIkJ1ZiBbJTQuNHNdIiwKLQkJCQkJICAgICAgIGFjcGlfdXRfZ2V0X25vZGVfbmFtZShvYmpfZGVzYy0+Ci0JCQkJCQkJCSAgICAgYnVmZmVyX2ZpZWxkLgotCQkJCQkJCQkgICAgIGJ1ZmZlcl9vYmotPgotCQkJCQkJCQkgICAgIGJ1ZmZlci4KLQkJCQkJCQkJICAgICBub2RlKSk7Ci0JCQl9Ci0JCQlicmVhazsKLQotCQljYXNlIEFDUElfVFlQRV9MT0NBTF9SRUdJT05fRklFTEQ6Ci0KLQkJCWFjcGlfb3NfcHJpbnRmKCJSZ24gWyU0LjRzXSIsCi0JCQkJICAgICAgIGFjcGlfdXRfZ2V0X25vZGVfbmFtZShvYmpfZGVzYy0+Ci0JCQkJCQkJICAgICBjb21tb25fZmllbGQuCi0JCQkJCQkJICAgICByZWdpb25fb2JqLT5yZWdpb24uCi0JCQkJCQkJICAgICBub2RlKSk7Ci0JCQlicmVhazsKLQotCQljYXNlIEFDUElfVFlQRV9MT0NBTF9CQU5LX0ZJRUxEOgotCi0JCQlhY3BpX29zX3ByaW50ZigiUmduIFslNC40c10gQm5rIFslNC40c10iLAotCQkJCSAgICAgICBhY3BpX3V0X2dldF9ub2RlX25hbWUob2JqX2Rlc2MtPgotCQkJCQkJCSAgICAgY29tbW9uX2ZpZWxkLgotCQkJCQkJCSAgICAgcmVnaW9uX29iai0+cmVnaW9uLgotCQkJCQkJCSAgICAgbm9kZSksCi0JCQkJICAgICAgIGFjcGlfdXRfZ2V0X25vZGVfbmFtZShvYmpfZGVzYy0+Ci0JCQkJCQkJICAgICBiYW5rX2ZpZWxkLgotCQkJCQkJCSAgICAgYmFua19vYmotPgotCQkJCQkJCSAgICAgY29tbW9uX2ZpZWxkLgotCQkJCQkJCSAgICAgbm9kZSkpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBBQ1BJX1RZUEVfTE9DQUxfSU5ERVhfRklFTEQ6Ci0KLQkJCWFjcGlfb3NfcHJpbnRmKCJJZHggWyU0LjRzXSBEYXQgWyU0LjRzXSIsCi0JCQkJICAgICAgIGFjcGlfdXRfZ2V0X25vZGVfbmFtZShvYmpfZGVzYy0+Ci0JCQkJCQkJICAgICBpbmRleF9maWVsZC4KLQkJCQkJCQkgICAgIGluZGV4X29iai0+Ci0JCQkJCQkJICAgICBjb21tb25fZmllbGQubm9kZSksCi0JCQkJICAgICAgIGFjcGlfdXRfZ2V0X25vZGVfbmFtZShvYmpfZGVzYy0+Ci0JCQkJCQkJICAgICBpbmRleF9maWVsZC4KLQkJCQkJCQkgICAgIGRhdGFfb2JqLT4KLQkJCQkJCQkgICAgIGNvbW1vbl9maWVsZC4KLQkJCQkJCQkgICAgIG5vZGUpKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgQUNQSV9UWVBFX0xPQ0FMX0FMSUFTOgotCQljYXNlIEFDUElfVFlQRV9MT0NBTF9NRVRIT0RfQUxJQVM6Ci0KLQkJCWFjcGlfb3NfcHJpbnRmKCJUYXJnZXQgJTQuNHMgKCVwKVxuIiwKLQkJCQkgICAgICAgYWNwaV91dF9nZXRfbm9kZV9uYW1lKG9ial9kZXNjKSwKLQkJCQkgICAgICAgb2JqX2Rlc2MpOwotCQkJYnJlYWs7Ci0KLQkJZGVmYXVsdDoKLQotCQkJYWNwaV9vc19wcmludGYoIk9iamVjdCAlcFxuIiwgb2JqX2Rlc2MpOwotCQkJYnJlYWs7Ci0JCX0KLQotCQkvKiBDb21tb24gZmllbGQgaGFuZGxpbmcgKi8KLQotCQlzd2l0Y2ggKHR5cGUpIHsKLQkJY2FzZSBBQ1BJX1RZUEVfQlVGRkVSX0ZJRUxEOgotCQljYXNlIEFDUElfVFlQRV9MT0NBTF9SRUdJT05fRklFTEQ6Ci0JCWNhc2UgQUNQSV9UWVBFX0xPQ0FMX0JBTktfRklFTEQ6Ci0JCWNhc2UgQUNQSV9UWVBFX0xPQ0FMX0lOREVYX0ZJRUxEOgotCi0JCQlhY3BpX29zX3ByaW50ZigiIE9mZiAlLjNYIExlbiAlLjJYIEFjYyAlLjJoZFxuIiwKLQkJCQkgICAgICAgKG9ial9kZXNjLT5jb21tb25fZmllbGQuCi0JCQkJCWJhc2VfYnl0ZV9vZmZzZXQgKiA4KQotCQkJCSAgICAgICArCi0JCQkJICAgICAgIG9ial9kZXNjLT5jb21tb25fZmllbGQuCi0JCQkJICAgICAgIHN0YXJ0X2ZpZWxkX2JpdF9vZmZzZXQsCi0JCQkJICAgICAgIG9ial9kZXNjLT5jb21tb25fZmllbGQuYml0X2xlbmd0aCwKLQkJCQkgICAgICAgb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC4KLQkJCQkgICAgICAgYWNjZXNzX2J5dGVfd2lkdGgpOwotCQkJYnJlYWs7Ci0KLQkJZGVmYXVsdDoKLQkJCWJyZWFrOwotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBBQ1BJX0RJU1BMQVlfT0JKRUNUUzoKLQotCQlhY3BpX29zX3ByaW50ZigiTzolcCIsIG9ial9kZXNjKTsKLQkJaWYgKCFvYmpfZGVzYykgewotCi0JCQkvKiBObyBhdHRhY2hlZCBvYmplY3QsIHdlIGFyZSBkb25lICovCi0KLQkJCWFjcGlfb3NfcHJpbnRmKCJcbiIpOwotCQkJcmV0dXJuIChBRV9PSyk7Ci0JCX0KLQotCQlhY3BpX29zX3ByaW50ZigiKFIlZCkiLCBvYmpfZGVzYy0+Y29tbW9uLnJlZmVyZW5jZV9jb3VudCk7Ci0KLQkJc3dpdGNoICh0eXBlKSB7Ci0JCWNhc2UgQUNQSV9UWVBFX01FVEhPRDoKLQotCQkJLyogTmFtZSBpcyBhIE1ldGhvZCBhbmQgaXRzIEFNTCBvZmZzZXQvbGVuZ3RoIGFyZSBzZXQgKi8KLQotCQkJYWNwaV9vc19wcmludGYoIiBNOiVwLSVYXG4iLCBvYmpfZGVzYy0+bWV0aG9kLmFtbF9zdGFydCwKLQkJCQkgICAgICAgb2JqX2Rlc2MtPm1ldGhvZC5hbWxfbGVuZ3RoKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgQUNQSV9UWVBFX0lOVEVHRVI6Ci0KLQkJCWFjcGlfb3NfcHJpbnRmKCIgSTolOC44WDguOCVYXG4iLAotCQkJCSAgICAgICBBQ1BJX0ZPUk1BVF9VSU5UNjQob2JqX2Rlc2MtPmludGVnZXIuCi0JCQkJCQkJICB2YWx1ZSkpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBBQ1BJX1RZUEVfU1RSSU5HOgotCi0JCQlhY3BpX29zX3ByaW50ZigiIFM6JXAtJVhcbiIsIG9ial9kZXNjLT5zdHJpbmcucG9pbnRlciwKLQkJCQkgICAgICAgb2JqX2Rlc2MtPnN0cmluZy5sZW5ndGgpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBBQ1BJX1RZUEVfQlVGRkVSOgotCi0JCQlhY3BpX29zX3ByaW50ZigiIEI6JXAtJVhcbiIsIG9ial9kZXNjLT5idWZmZXIucG9pbnRlciwKLQkJCQkgICAgICAgb2JqX2Rlc2MtPmJ1ZmZlci5sZW5ndGgpOwotCQkJYnJlYWs7Ci0KLQkJZGVmYXVsdDoKLQotCQkJYWNwaV9vc19wcmludGYoIlxuIik7Ci0JCQlicmVhazsKLQkJfQotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCWFjcGlfb3NfcHJpbnRmKCJcbiIpOwotCQlicmVhazsKLQl9Ci0KLQkvKiBJZiBkZWJ1ZyB0dXJuZWQgb2ZmLCBkb25lICovCi0KLQlpZiAoIShhY3BpX2RiZ19sZXZlbCAmIEFDUElfTFZfVkFMVUVTKSkgewotCQlyZXR1cm4gKEFFX09LKTsKLQl9Ci0KLQkvKiBJZiB0aGVyZSBpcyBhbiBhdHRhY2hlZCBvYmplY3QsIGRpc3BsYXkgaXQgKi8KLQotCWRiZ19sZXZlbCA9IGFjcGlfZGJnX2xldmVsOwotCWFjcGlfZGJnX2xldmVsID0gMDsKLQlvYmpfZGVzYyA9IGFjcGlfbnNfZ2V0X2F0dGFjaGVkX29iamVjdCh0aGlzX25vZGUpOwotCWFjcGlfZGJnX2xldmVsID0gZGJnX2xldmVsOwotCi0JLyogRHVtcCBhdHRhY2hlZCBvYmplY3RzICovCi0KLQl3aGlsZSAob2JqX2Rlc2MpIHsKLQkJb2JqX3R5cGUgPSBBQ1BJX1RZUEVfSU5WQUxJRDsKLQkJYWNwaV9vc19wcmludGYoIkF0dGFjaGVkIE9iamVjdCAlcDogIiwgb2JqX2Rlc2MpOwotCi0JCS8qIERlY29kZSB0aGUgdHlwZSBvZiBhdHRhY2hlZCBvYmplY3QgYW5kIGR1bXAgdGhlIGNvbnRlbnRzICovCi0KLQkJc3dpdGNoIChBQ1BJX0dFVF9ERVNDUklQVE9SX1RZUEUob2JqX2Rlc2MpKSB7Ci0JCWNhc2UgQUNQSV9ERVNDX1RZUEVfTkFNRUQ6Ci0KLQkJCWFjcGlfb3NfcHJpbnRmKCIoUHRyIHRvIE5vZGUpXG4iKTsKLQkJCWJ5dGVzX3RvX2R1bXAgPSBzaXplb2Yoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUpOwotCQkJQUNQSV9EVU1QX0JVRkZFUihvYmpfZGVzYywgYnl0ZXNfdG9fZHVtcCk7Ci0JCQlicmVhazsKLQotCQljYXNlIEFDUElfREVTQ19UWVBFX09QRVJBTkQ6Ci0KLQkJCW9ial90eXBlID0gQUNQSV9HRVRfT0JKRUNUX1RZUEUob2JqX2Rlc2MpOwotCi0JCQlpZiAob2JqX3R5cGUgPiBBQ1BJX1RZUEVfTE9DQUxfTUFYKSB7Ci0JCQkJYWNwaV9vc19wcmludGYKLQkJCQkgICAgKCIoUG9pbnRlciB0byBBQ1BJIE9iamVjdCB0eXBlICUuMlggW1VOS05PV05dKVxuIiwKLQkJCQkgICAgIG9ial90eXBlKTsKLQkJCQlieXRlc190b19kdW1wID0gMzI7Ci0JCQl9IGVsc2UgewotCQkJCWFjcGlfb3NfcHJpbnRmCi0JCQkJICAgICgiKFBvaW50ZXIgdG8gQUNQSSBPYmplY3QgdHlwZSAlLjJYIFslc10pXG4iLAotCQkJCSAgICAgb2JqX3R5cGUsIGFjcGlfdXRfZ2V0X3R5cGVfbmFtZShvYmpfdHlwZSkpOwotCQkJCWJ5dGVzX3RvX2R1bXAgPQotCQkJCSAgICBzaXplb2YodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCk7Ci0JCQl9Ci0KLQkJCUFDUElfRFVNUF9CVUZGRVIob2JqX2Rlc2MsIGJ5dGVzX3RvX2R1bXApOwotCQkJYnJlYWs7Ci0KLQkJZGVmYXVsdDoKLQotCQkJYnJlYWs7Ci0JCX0KLQotCQkvKiBJZiB2YWx1ZSBpcyBOT1QgYW4gaW50ZXJuYWwgb2JqZWN0LCB3ZSBhcmUgZG9uZSAqLwotCi0JCWlmIChBQ1BJX0dFVF9ERVNDUklQVE9SX1RZUEUob2JqX2Rlc2MpICE9Ci0JCSAgICBBQ1BJX0RFU0NfVFlQRV9PUEVSQU5EKSB7Ci0JCQlnb3RvIGNsZWFudXA7Ci0JCX0KLQotCQkvKgotCQkgKiBWYWxpZCBvYmplY3QsIGdldCB0aGUgcG9pbnRlciB0byBuZXh0IGxldmVsLCBpZiBhbnkKLQkJICovCi0JCXN3aXRjaCAob2JqX3R5cGUpIHsKLQkJY2FzZSBBQ1BJX1RZUEVfQlVGRkVSOgotCQljYXNlIEFDUElfVFlQRV9TVFJJTkc6Ci0JCQkvKgotCQkJICogTk9URTogdGFrZXMgYWR2YW50YWdlIG9mIGNvbW1vbiBmaWVsZHMgYmV0d2VlbiBzdHJpbmcvYnVmZmVyCi0JCQkgKi8KLQkJCWJ5dGVzX3RvX2R1bXAgPSBvYmpfZGVzYy0+c3RyaW5nLmxlbmd0aDsKLQkJCW9ial9kZXNjID0gKHZvaWQgKilvYmpfZGVzYy0+c3RyaW5nLnBvaW50ZXI7Ci0JCQlhY3BpX29zX3ByaW50ZigiKEJ1ZmZlci9TdHJpbmcgcG9pbnRlciAlcCBsZW5ndGggJVgpXG4iLAotCQkJCSAgICAgICBvYmpfZGVzYywgYnl0ZXNfdG9fZHVtcCk7Ci0JCQlBQ1BJX0RVTVBfQlVGRkVSKG9ial9kZXNjLCBieXRlc190b19kdW1wKTsKLQkJCWdvdG8gY2xlYW51cDsKLQotCQljYXNlIEFDUElfVFlQRV9CVUZGRVJfRklFTEQ6Ci0JCQlvYmpfZGVzYyA9Ci0JCQkgICAgKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKilvYmpfZGVzYy0+YnVmZmVyX2ZpZWxkLgotCQkJICAgIGJ1ZmZlcl9vYmo7Ci0JCQlicmVhazsKLQotCQljYXNlIEFDUElfVFlQRV9QQUNLQUdFOgotCQkJb2JqX2Rlc2MgPSAodm9pZCAqKW9ial9kZXNjLT5wYWNrYWdlLmVsZW1lbnRzOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBBQ1BJX1RZUEVfTUVUSE9EOgotCQkJb2JqX2Rlc2MgPSAodm9pZCAqKW9ial9kZXNjLT5tZXRob2QuYW1sX3N0YXJ0OwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBBQ1BJX1RZUEVfTE9DQUxfUkVHSU9OX0ZJRUxEOgotCQkJb2JqX2Rlc2MgPSAodm9pZCAqKW9ial9kZXNjLT5maWVsZC5yZWdpb25fb2JqOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBBQ1BJX1RZUEVfTE9DQUxfQkFOS19GSUVMRDoKLQkJCW9ial9kZXNjID0gKHZvaWQgKilvYmpfZGVzYy0+YmFua19maWVsZC5yZWdpb25fb2JqOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBBQ1BJX1RZUEVfTE9DQUxfSU5ERVhfRklFTEQ6Ci0JCQlvYmpfZGVzYyA9ICh2b2lkICopb2JqX2Rlc2MtPmluZGV4X2ZpZWxkLmluZGV4X29iajsKLQkJCWJyZWFrOwotCi0JCWRlZmF1bHQ6Ci0JCQlnb3RvIGNsZWFudXA7Ci0JCX0KLQotCQlvYmpfdHlwZSA9IEFDUElfVFlQRV9JTlZBTElEOwkvKiBUZXJtaW5hdGUgbG9vcCBhZnRlciBuZXh0IHBhc3MgKi8KLQl9Ci0KLSAgICAgIGNsZWFudXA6Ci0JYWNwaV9vc19wcmludGYoIlxuIik7Ci0JcmV0dXJuIChBRV9PSyk7Ci19Ci0KLSNpZmRlZiBBQ1BJX0ZVVFVSRV9VU0FHRQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9uc19kdW1wX29iamVjdHMKLSAqCi0gKiBQQVJBTUVURVJTOiAgVHlwZSAgICAgICAgICAgICAgICAtIE9iamVjdCB0eXBlIHRvIGJlIGR1bXBlZAotICogICAgICAgICAgICAgIGRpc3BsYXlfdHlwZSAgICAgICAgLSAwIG9yIEFDUElfRElTUExBWV9TVU1NQVJZCi0gKiAgICAgICAgICAgICAgbWF4X2RlcHRoICAgICAgICAgICAtIE1heGltdW0gZGVwdGggb2YgZHVtcC4gVXNlIEFDUElfVUlOVDMyX01BWAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgYW4gZWZmZWN0aXZlbHkgdW5saW1pdGVkIGRlcHRoLgotICogICAgICAgICAgICAgIG93bmVyX2lkICAgICAgICAgICAgLSBEdW1wIG9ubHkgb2JqZWN0cyBvd25lZCBieSB0aGlzIElELiAgVXNlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFDUElfVUlOVDMyX01BWCB0byBtYXRjaCBhbGwgb3duZXJzLgotICogICAgICAgICAgICAgIHN0YXJ0X2hhbmRsZSAgICAgICAgLSBXaGVyZSBpbiBuYW1lc3BhY2UgdG8gc3RhcnQvZW5kIHNlYXJjaAotICoKLSAqIFJFVFVSTjogICAgICBOb25lCi0gKgotICogREVTQ1JJUFRJT046IER1bXAgdHlwZWQgb2JqZWN0cyB3aXRoaW4gdGhlIGxvYWRlZCBuYW1lc3BhY2UuCi0gKiAgICAgICAgICAgICAgVXNlcyBhY3BpX25zX3dhbGtfbmFtZXNwYWNlIGluIGNvbmp1bmN0aW9uIHdpdGggYWNwaV9uc19kdW1wX29uZV9vYmplY3QuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdm9pZAotYWNwaV9uc19kdW1wX29iamVjdHMoYWNwaV9vYmplY3RfdHlwZSB0eXBlLAotCQkgICAgIHU4IGRpc3BsYXlfdHlwZSwKLQkJICAgICB1MzIgbWF4X2RlcHRoLAotCQkgICAgIGFjcGlfb3duZXJfaWQgb3duZXJfaWQsIGFjcGlfaGFuZGxlIHN0YXJ0X2hhbmRsZSkKLXsKLQlzdHJ1Y3QgYWNwaV93YWxrX2luZm8gaW5mbzsKLQotCUFDUElfRlVOQ1RJT05fRU5UUlkoKTsKLQotCWluZm8uZGVidWdfbGV2ZWwgPSBBQ1BJX0xWX1RBQkxFUzsKLQlpbmZvLm93bmVyX2lkID0gb3duZXJfaWQ7Ci0JaW5mby5kaXNwbGF5X3R5cGUgPSBkaXNwbGF5X3R5cGU7Ci0KLQkodm9pZClhY3BpX25zX3dhbGtfbmFtZXNwYWNlKHR5cGUsIHN0YXJ0X2hhbmRsZSwgbWF4X2RlcHRoLAotCQkJCSAgICAgQUNQSV9OU19XQUxLX05PX1VOTE9DSyB8Ci0JCQkJICAgICBBQ1BJX05TX1dBTEtfVEVNUF9OT0RFUywKLQkJCQkgICAgIGFjcGlfbnNfZHVtcF9vbmVfb2JqZWN0LCAodm9pZCAqKSZpbmZvLAotCQkJCSAgICAgTlVMTCk7Ci19Ci0jZW5kaWYJCQkJLyogQUNQSV9GVVRVUkVfVVNBR0UgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9uc19kdW1wX2VudHJ5Ci0gKgotICogUEFSQU1FVEVSUzogIEhhbmRsZSAgICAgICAgICAgICAgLSBOb2RlIHRvIGJlIGR1bXBlZAotICogICAgICAgICAgICAgIGRlYnVnX2xldmVsICAgICAgICAgLSBPdXRwdXQgbGV2ZWwKLSAqCi0gKiBSRVRVUk46ICAgICAgTm9uZQotICoKLSAqIERFU0NSSVBUSU9OOiBEdW1wIGEgc2luZ2xlIE5vZGUKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi12b2lkIGFjcGlfbnNfZHVtcF9lbnRyeShhY3BpX2hhbmRsZSBoYW5kbGUsIHUzMiBkZWJ1Z19sZXZlbCkKLXsKLQlzdHJ1Y3QgYWNwaV93YWxrX2luZm8gaW5mbzsKLQotCUFDUElfRlVOQ1RJT05fRU5UUlkoKTsKLQotCWluZm8uZGVidWdfbGV2ZWwgPSBkZWJ1Z19sZXZlbDsKLQlpbmZvLm93bmVyX2lkID0gQUNQSV9PV05FUl9JRF9NQVg7Ci0JaW5mby5kaXNwbGF5X3R5cGUgPSBBQ1BJX0RJU1BMQVlfU1VNTUFSWTsKLQotCSh2b2lkKWFjcGlfbnNfZHVtcF9vbmVfb2JqZWN0KGhhbmRsZSwgMSwgJmluZm8sIE5VTEwpOwotfQotCi0jaWZkZWYgQUNQSV9BU0xfQ09NUElMRVIKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfbnNfZHVtcF90YWJsZXMKLSAqCi0gKiBQQVJBTUVURVJTOiAgc2VhcmNoX2Jhc2UgICAgICAgICAtIFJvb3Qgb2Ygc3VidHJlZSB0byBiZSBkdW1wZWQsIG9yCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5TX0FMTCB0byBkdW1wIHRoZSBlbnRpcmUgbmFtZXNwYWNlCi0gKiAgICAgICAgICAgICAgbWF4X2RlcHRoICAgICAgICAgICAtIE1heGltdW0gZGVwdGggb2YgZHVtcC4gIFVzZSBJTlRfTUFYCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBhbiBlZmZlY3RpdmVseSB1bmxpbWl0ZWQgZGVwdGguCi0gKgotICogUkVUVVJOOiAgICAgIE5vbmUKLSAqCi0gKiBERVNDUklQVElPTjogRHVtcCB0aGUgbmFtZSBzcGFjZSwgb3IgYSBwb3J0aW9uIG9mIGl0LgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXZvaWQgYWNwaV9uc19kdW1wX3RhYmxlcyhhY3BpX2hhbmRsZSBzZWFyY2hfYmFzZSwgdTMyIG1heF9kZXB0aCkKLXsKLQlhY3BpX2hhbmRsZSBzZWFyY2hfaGFuZGxlID0gc2VhcmNoX2Jhc2U7Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKG5zX2R1bXBfdGFibGVzKTsKLQotCWlmICghYWNwaV9nYmxfcm9vdF9ub2RlKSB7Ci0JCS8qCi0JCSAqIElmIHRoZSBuYW1lIHNwYWNlIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZCwKLQkJICogdGhlcmUgaXMgbm90aGluZyB0byBkdW1wLgotCQkgKi8KLQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9UQUJMRVMsCi0JCQkJICAibmFtZXNwYWNlIG5vdCBpbml0aWFsaXplZCFcbiIpKTsKLQkJcmV0dXJuX1ZPSUQ7Ci0JfQotCi0JaWYgKEFDUElfTlNfQUxMID09IHNlYXJjaF9iYXNlKSB7Ci0KLQkJLyogRW50aXJlIG5hbWVzcGFjZSAqLwotCi0JCXNlYXJjaF9oYW5kbGUgPSBhY3BpX2dibF9yb290X25vZGU7Ci0JCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfVEFCTEVTLCAiXFxcbiIpKTsKLQl9Ci0KLQlhY3BpX25zX2R1bXBfb2JqZWN0cyhBQ1BJX1RZUEVfQU5ZLCBBQ1BJX0RJU1BMQVlfT0JKRUNUUywgbWF4X2RlcHRoLAotCQkJICAgICBBQ1BJX09XTkVSX0lEX01BWCwgc2VhcmNoX2hhbmRsZSk7Ci0JcmV0dXJuX1ZPSUQ7Ci19Ci0jZW5kaWYJCQkJLyogX0FDUElfQVNMX0NPTVBJTEVSICovCi0jZW5kaWYJCQkJLyogZGVmaW5lZChBQ1BJX0RFQlVHX09VVFBVVCkgfHwgZGVmaW5lZChBQ1BJX0RFQlVHR0VSKSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc2R1bXBkdi5jIGIvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc2R1bXBkdi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjhmNTBmLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnNkdW1wZHYuYworKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogTW9kdWxlIE5hbWU6IG5zZHVtcCAtIHRhYmxlIGR1bXBpbmcgcm91dGluZXMgZm9yIGRlYnVnCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwOCwgSW50ZWwgQ29ycC4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKLSAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIGF0IG1pbmltdW0gYSBkaXNjbGFpbWVyCi0gKiAgICBzdWJzdGFudGlhbGx5IHNpbWlsYXIgdG8gdGhlICJOTyBXQVJSQU5UWSIgZGlzY2xhaW1lciBiZWxvdwotICogICAgKCJEaXNjbGFpbWVyIikgYW5kIGFueSByZWRpc3RyaWJ1dGlvbiBtdXN0IGJlIGNvbmRpdGlvbmVkIHVwb24KLSAqICAgIGluY2x1ZGluZyBhIHN1YnN0YW50aWFsbHkgc2ltaWxhciBEaXNjbGFpbWVyIHJlcXVpcmVtZW50IGZvciBmdXJ0aGVyCi0gKiAgICBiaW5hcnkgcmVkaXN0cmlidXRpb24uCi0gKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMKLSAqICAgIG9mIGFueSBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTk8gV0FSUkFOVFkKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAotICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKLSAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HCi0gKiBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKLSAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KLSAqLwotCi0jaW5jbHVkZSA8YWNwaS9hY3BpLmg+Ci0KLS8qIFRCRDogVGhpcyBlbnRpcmUgbW9kdWxlIGlzIGFwcGFyZW50bHkgb2Jzb2xldGUgYW5kIHNob3VsZCBiZSByZW1vdmVkICovCi0KLSNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX05BTUVTUEFDRQotQUNQSV9NT0RVTEVfTkFNRSgibnNkdW1wZHYiKQotI2lmZGVmIEFDUElfT0JTT0xFVEVfRlVOQ1RJT05TCi0jaWYgZGVmaW5lZChBQ1BJX0RFQlVHX09VVFBVVCkgfHwgZGVmaW5lZChBQ1BJX0RFQlVHR0VSKQotI2luY2x1ZGUgPGFjcGkvYWNuYW1lc3AuaD4KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfbnNfZHVtcF9vbmVfZGV2aWNlCi0gKgotICogUEFSQU1FVEVSUzogIEhhbmRsZSAgICAgICAgICAgICAgLSBOb2RlIHRvIGJlIGR1bXBlZAotICogICAgICAgICAgICAgIExldmVsICAgICAgICAgICAgICAgLSBOZXN0aW5nIGxldmVsIG9mIHRoZSBoYW5kbGUKLSAqICAgICAgICAgICAgICBDb250ZXh0ICAgICAgICAgICAgIC0gUGFzc2VkIGludG8gd2Fsa19uYW1lc3BhY2UKLSAqICAgICAgICAgICAgICByZXR1cm5fdmFsdWUgICAgICAgIC0gTm90IHVzZWQKLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IER1bXAgYSBzaW5nbGUgTm9kZSB0aGF0IHJlcHJlc2VudHMgYSBkZXZpY2UKLSAqICAgICAgICAgICAgICBUaGlzIHByb2NlZHVyZSBpcyBhIHVzZXJfZnVuY3Rpb24gY2FsbGVkIGJ5IGFjcGlfbnNfd2Fsa19uYW1lc3BhY2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBhY3BpX3N0YXR1cwotYWNwaV9uc19kdW1wX29uZV9kZXZpY2UoYWNwaV9oYW5kbGUgb2JqX2hhbmRsZSwKLQkJCXUzMiBsZXZlbCwgdm9pZCAqY29udGV4dCwgdm9pZCAqKnJldHVybl92YWx1ZSkKLXsKLQlzdHJ1Y3QgYWNwaV9idWZmZXIgYnVmZmVyOwotCXN0cnVjdCBhY3BpX2RldmljZV9pbmZvICppbmZvOwotCWFjcGlfc3RhdHVzIHN0YXR1czsKLQl1MzIgaTsKLQotCUFDUElfRlVOQ1RJT05fTkFNRShuc19kdW1wX29uZV9kZXZpY2UpOwotCi0Jc3RhdHVzID0KLQkgICAgYWNwaV9uc19kdW1wX29uZV9vYmplY3Qob2JqX2hhbmRsZSwgbGV2ZWwsIGNvbnRleHQsIHJldHVybl92YWx1ZSk7Ci0KLQlidWZmZXIubGVuZ3RoID0gQUNQSV9BTExPQ0FURV9MT0NBTF9CVUZGRVI7Ci0Jc3RhdHVzID0gYWNwaV9nZXRfb2JqZWN0X2luZm8ob2JqX2hhbmRsZSwgJmJ1ZmZlcik7Ci0JaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKSB7Ci0JCWluZm8gPSBidWZmZXIucG9pbnRlcjsKLQkJZm9yIChpID0gMDsgaSA8IGxldmVsOyBpKyspIHsKLQkJCUFDUElfREVCVUdfUFJJTlRfUkFXKChBQ1BJX0RCX1RBQkxFUywgIiAiKSk7Ci0JCX0KLQotCQlBQ1BJX0RFQlVHX1BSSU5UX1JBVygoQUNQSV9EQl9UQUJMRVMsCi0JCQkJICAgICAgIiAgICBISUQ6ICVzLCBBRFI6ICU4LjhYJTguOFgsIFN0YXR1czogJVhcbiIsCi0JCQkJICAgICAgaW5mby0+aGFyZHdhcmVfaWQudmFsdWUsCi0JCQkJICAgICAgQUNQSV9GT1JNQVRfVUlOVDY0KGluZm8tPmFkZHJlc3MpLAotCQkJCSAgICAgIGluZm8tPmN1cnJlbnRfc3RhdHVzKSk7Ci0JCUFDUElfRlJFRShpbmZvKTsKLQl9Ci0KLQlyZXR1cm4gKHN0YXR1cyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfbnNfZHVtcF9yb290X2RldmljZXMKLSAqCi0gKiBQQVJBTUVURVJTOiAgTm9uZQotICoKLSAqIFJFVFVSTjogICAgICBOb25lCi0gKgotICogREVTQ1JJUFRJT046IER1bXAgYWxsIG9iamVjdHMgb2YgdHlwZSAiZGV2aWNlIgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXZvaWQgYWNwaV9uc19kdW1wX3Jvb3RfZGV2aWNlcyh2b2lkKQotewotCWFjcGlfaGFuZGxlIHN5c19idXNfaGFuZGxlOwotCWFjcGlfc3RhdHVzIHN0YXR1czsKLQotCUFDUElfRlVOQ1RJT05fTkFNRShuc19kdW1wX3Jvb3RfZGV2aWNlcyk7Ci0KLQkvKiBPbmx5IGR1bXAgdGhlIHRhYmxlIGlmIHRyYWNpbmcgaXMgZW5hYmxlZCAqLwotCi0JaWYgKCEoQUNQSV9MVl9UQUJMRVMgJiBhY3BpX2RiZ19sZXZlbCkpIHsKLQkJcmV0dXJuOwotCX0KLQotCXN0YXR1cyA9IGFjcGlfZ2V0X2hhbmRsZShOVUxMLCBBQ1BJX05TX1NZU1RFTV9CVVMsICZzeXNfYnVzX2hhbmRsZSk7Ci0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCXJldHVybjsKLQl9Ci0KLQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX1RBQkxFUywKLQkJCSAgIkRpc3BsYXkgb2YgYWxsIGRldmljZXMgaW4gdGhlIG5hbWVzcGFjZTpcbiIpKTsKLQotCXN0YXR1cyA9IGFjcGlfbnNfd2Fsa19uYW1lc3BhY2UoQUNQSV9UWVBFX0RFVklDRSwgc3lzX2J1c19oYW5kbGUsCi0JCQkJCUFDUElfVUlOVDMyX01BWCwgQUNQSV9OU19XQUxLX05PX1VOTE9DSywKLQkJCQkJYWNwaV9uc19kdW1wX29uZV9kZXZpY2UsIE5VTEwsIE5VTEwpOwotfQotCi0jZW5kaWYKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc2V2YWwuYyBiL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnNldmFsLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjZGYwM2EuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc2V2YWwuYworKysgL2Rldi9udWxsCkBAIC0xLDMxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIE1vZHVsZSBOYW1lOiBuc2V2YWwgLSBPYmplY3QgZXZhbHVhdGlvbiwgaW5jbHVkZXMgY29udHJvbCBtZXRob2QgZXhlY3V0aW9uCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDgsIEludGVsIENvcnAuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCi0gKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSBhdCBtaW5pbXVtIGEgZGlzY2xhaW1lcgotICogICAgc3Vic3RhbnRpYWxseSBzaW1pbGFyIHRvIHRoZSAiTk8gV0FSUkFOVFkiIGRpc2NsYWltZXIgYmVsb3cKLSAqICAgICgiRGlzY2xhaW1lciIpIGFuZCBhbnkgcmVkaXN0cmlidXRpb24gbXVzdCBiZSBjb25kaXRpb25lZCB1cG9uCi0gKiAgICBpbmNsdWRpbmcgYSBzdWJzdGFudGlhbGx5IHNpbWlsYXIgRGlzY2xhaW1lciByZXF1aXJlbWVudCBmb3IgZnVydGhlcgotICogICAgYmluYXJ5IHJlZGlzdHJpYnV0aW9uLgotICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzCi0gKiAgICBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIE5PIFdBUlJBTlRZCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKLSAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCi0gKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORwotICogSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCi0gKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCi0gKi8KLQotI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgotI2luY2x1ZGUgPGFjcGkvYWNwYXJzZXIuaD4KLSNpbmNsdWRlIDxhY3BpL2FjaW50ZXJwLmg+Ci0jaW5jbHVkZSA8YWNwaS9hY25hbWVzcC5oPgotCi0jZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9OQU1FU1BBQ0UKLUFDUElfTU9EVUxFX05BTUUoIm5zZXZhbCIpCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfbnNfZXZhbHVhdGUKLSAqCi0gKiBQQVJBTUVURVJTOiAgSW5mbyAgICAgICAgICAgIC0gRXZhbHVhdGlvbiBpbmZvIGJsb2NrLCBjb250YWluczoKLSAqICAgICAgICAgICAgICAgICAgcHJlZml4X25vZGUgICAgIC0gUHJlZml4IG9yIE1ldGhvZC9PYmplY3QgTm9kZSB0byBleGVjdXRlCi0gKiAgICAgICAgICAgICAgICAgIFBhdGhuYW1lICAgICAgICAtIE5hbWUgb2YgbWV0aG9kIHRvIGV4ZWN1dGUsIElmIE5VTEwsIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb2RlIGlzIHRoZSBvYmplY3QgdG8gZXhlY3V0ZQotICogICAgICAgICAgICAgICAgICBQYXJhbWV0ZXJzICAgICAgLSBMaXN0IG9mIHBhcmFtZXRlcnMgdG8gcGFzcyB0byB0aGUgbWV0aG9kLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXJtaW5hdGVkIGJ5IE5VTEwuIFBhcmFtcyBpdHNlbGYgbWF5IGJlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwgaWYgbm8gcGFyYW1ldGVycyBhcmUgYmVpbmcgcGFzc2VkLgotICogICAgICAgICAgICAgICAgICByZXR1cm5fb2JqZWN0ICAgLSBXaGVyZSB0byBwdXQgbWV0aG9kJ3MgcmV0dXJuIHZhbHVlIChpZgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbnkpLiBJZiBOVUxMLCBubyB2YWx1ZSBpcyByZXR1cm5lZC4KLSAqICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyX3R5cGUgIC0gVHlwZSBvZiBQYXJhbWV0ZXIgbGlzdAotICogICAgICAgICAgICAgICAgICByZXR1cm5fb2JqZWN0ICAgLSBXaGVyZSB0byBwdXQgbWV0aG9kJ3MgcmV0dXJuIHZhbHVlIChpZgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbnkpLiBJZiBOVUxMLCBubyB2YWx1ZSBpcyByZXR1cm5lZC4KLSAqICAgICAgICAgICAgICAgICAgRmxhZ3MgICAgICAgICAgIC0gQUNQSV9JR05PUkVfUkVUVVJOX1ZBTFVFIHRvIGRlbGV0ZSByZXR1cm4KLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IEV4ZWN1dGUgYSBjb250cm9sIG1ldGhvZCBvciByZXR1cm4gdGhlIGN1cnJlbnQgdmFsdWUgb2YgYW4KLSAqICAgICAgICAgICAgICBBQ1BJIG5hbWVzcGFjZSBvYmplY3QuCi0gKgotICogTVVURVg6ICAgICAgIExvY2tzIGludGVycHJldGVyCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWFjcGlfc3RhdHVzIGFjcGlfbnNfZXZhbHVhdGUoc3RydWN0IGFjcGlfZXZhbHVhdGVfaW5mbyAqIGluZm8pCi17Ci0JYWNwaV9zdGF0dXMgc3RhdHVzOwotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlOwotCi0JQUNQSV9GVU5DVElPTl9UUkFDRShuc19ldmFsdWF0ZSk7Ci0KLQlpZiAoIWluZm8pIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9QQVJBTUVURVIpOwotCX0KLQotCS8qIEluaXRpYWxpemUgdGhlIHJldHVybiB2YWx1ZSB0byBhbiBpbnZhbGlkIG9iamVjdCAqLwotCi0JaW5mby0+cmV0dXJuX29iamVjdCA9IE5VTEw7Ci0KLQkvKgotCSAqIEdldCB0aGUgYWN0dWFsIG5hbWVzcGFjZSBub2RlIGZvciB0aGUgdGFyZ2V0IG9iamVjdC4gSGFuZGxlcyB0aGVzZSBjYXNlczoKLQkgKgotCSAqIDEpIE51bGwgbm9kZSwgUGF0aG5hbWUgKGFic29sdXRlIHBhdGgpCi0JICogMikgTm9kZSwgUGF0aG5hbWUgKHBhdGggcmVsYXRpdmUgdG8gTm9kZSkKLQkgKiAzKSBOb2RlLCBOdWxsIFBhdGhuYW1lCi0JICovCi0Jc3RhdHVzID0gYWNwaV9uc19nZXRfbm9kZShpbmZvLT5wcmVmaXhfbm9kZSwgaW5mby0+cGF0aG5hbWUsCi0JCQkJICBBQ1BJX05TX05PX1VQU0VBUkNILCAmaW5mby0+cmVzb2x2ZWRfbm9kZSk7Ci0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotCX0KLQotCS8qCi0JICogRm9yIGEgbWV0aG9kIGFsaWFzLCB3ZSBtdXN0IGdyYWIgdGhlIGFjdHVhbCBtZXRob2Qgbm9kZSBzbyB0aGF0IHByb3BlcgotCSAqIHNjb3BpbmcgY29udGV4dCB3aWxsIGJlIGVzdGFibGlzaGVkIGJlZm9yZSBleGVjdXRpb24uCi0JICovCi0JaWYgKGFjcGlfbnNfZ2V0X3R5cGUoaW5mby0+cmVzb2x2ZWRfbm9kZSkgPT0KLQkgICAgQUNQSV9UWVBFX0xPQ0FMX01FVEhPRF9BTElBUykgewotCQlpbmZvLT5yZXNvbHZlZF9ub2RlID0KLQkJICAgIEFDUElfQ0FTVF9QVFIoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUsCi0JCQkJICBpbmZvLT5yZXNvbHZlZF9ub2RlLT5vYmplY3QpOwotCX0KLQotCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfTkFNRVMsICIlcyBbJXBdIFZhbHVlICVwXG4iLCBpbmZvLT5wYXRobmFtZSwKLQkJCSAgaW5mby0+cmVzb2x2ZWRfbm9kZSwKLQkJCSAgYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0KGluZm8tPnJlc29sdmVkX25vZGUpKSk7Ci0KLQlub2RlID0gaW5mby0+cmVzb2x2ZWRfbm9kZTsKLQotCS8qCi0JICogVHdvIG1ham9yIGNhc2VzIGhlcmU6Ci0JICoKLQkgKiAxKSBUaGUgb2JqZWN0IGlzIGEgY29udHJvbCBtZXRob2QgLS0gZXhlY3V0ZSBpdAotCSAqIDIpIFRoZSBvYmplY3QgaXMgbm90IGEgbWV0aG9kIC0tIGp1c3QgcmV0dXJuIGl0J3MgY3VycmVudCB2YWx1ZQotCSAqLwotCWlmIChhY3BpX25zX2dldF90eXBlKGluZm8tPnJlc29sdmVkX25vZGUpID09IEFDUElfVFlQRV9NRVRIT0QpIHsKLQkJLyoKLQkJICogMSkgT2JqZWN0IGlzIGEgY29udHJvbCBtZXRob2QgLSBleGVjdXRlIGl0Ci0JCSAqLwotCi0JCS8qIFZlcmlmeSB0aGF0IHRoZXJlIGlzIGEgbWV0aG9kIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhpcyBub2RlICovCi0KLQkJaW5mby0+b2JqX2Rlc2MgPQotCQkgICAgYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0KGluZm8tPnJlc29sdmVkX25vZGUpOwotCQlpZiAoIWluZm8tPm9ial9kZXNjKSB7Ci0JCQlBQ1BJX0VSUk9SKChBRV9JTkZPLAotCQkJCSAgICAiQ29udHJvbCBtZXRob2QgaGFzIG5vIGF0dGFjaGVkIHN1Yi1vYmplY3QiKSk7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTlVMTF9PQkpFQ1QpOwotCQl9Ci0KLQkJLyoKLQkJICogQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgYXJndW1lbnRzIGJlaW5nIHBhc3NlZCB0byB0aGUgbWV0aG9kCi0JCSAqLwotCi0JCWluZm8tPnBhcmFtX2NvdW50ID0gMDsKLQkJaWYgKGluZm8tPnBhcmFtZXRlcnMpIHsKLQkJCXdoaWxlIChpbmZvLT5wYXJhbWV0ZXJzW2luZm8tPnBhcmFtX2NvdW50XSkKLQkJCQlpbmZvLT5wYXJhbV9jb3VudCsrOwotCQl9Ci0KLQkJLyoKLQkJICogV2FybmluZyBpZiB0b28gZmV3IG9yIHRvbyBtYW55IGFyZ3VtZW50cyBoYXZlIGJlZW4gcGFzc2VkIGJ5IHRoZQotCQkgKiBjYWxsZXIuIFdlIGRvbid0IHdhbnQgdG8gYWJvcnQgaGVyZSB3aXRoIGFuIGVycm9yIGJlY2F1c2UgYW4KLQkJICogaW5jb3JyZWN0IG51bWJlciBvZiBhcmd1bWVudHMgbWF5IG5vdCBjYXVzZSB0aGUgbWV0aG9kIHRvIGZhaWwuCi0JCSAqIEhvd2V2ZXIsIHRoZSBtZXRob2Qgd2lsbCBmYWlsIGlmIHRoZXJlIGFyZSB0b28gZmV3IGFyZ3VtZW50cyBwYXNzZWQKLQkJICogYW5kIHRoZSBtZXRob2QgYXR0ZW1wdHMgdG8gdXNlIG9uZSBvZiB0aGUgbWlzc2luZyBvbmVzLgotCQkgKi8KLQotCQlpZiAoaW5mby0+cGFyYW1fY291bnQgPCBpbmZvLT5vYmpfZGVzYy0+bWV0aG9kLnBhcmFtX2NvdW50KSB7Ci0JCQlBQ1BJX1dBUk5JTkcoKEFFX0lORk8sCi0JCQkJICAgICJJbnN1ZmZpY2llbnQgYXJndW1lbnRzIC0gIgotCQkJCSAgICAibWV0aG9kIFslNC40c10gbmVlZHMgJWQsIGZvdW5kICVkIiwKLQkJCQkgICAgYWNwaV91dF9nZXRfbm9kZV9uYW1lKGluZm8tPnJlc29sdmVkX25vZGUpLAotCQkJCSAgICBpbmZvLT5vYmpfZGVzYy0+bWV0aG9kLnBhcmFtX2NvdW50LAotCQkJCSAgICBpbmZvLT5wYXJhbV9jb3VudCkpOwotCQl9IGVsc2UgaWYgKGluZm8tPnBhcmFtX2NvdW50ID4KLQkJCQlpbmZvLT5vYmpfZGVzYy0+bWV0aG9kLnBhcmFtX2NvdW50KSB7Ci0JCQlBQ1BJX1dBUk5JTkcoKEFFX0lORk8sCi0JCQkJICAgICAgIkV4Y2VzcyBhcmd1bWVudHMgLSAiCi0JCQkJICAgICAgIm1ldGhvZCBbJTQuNHNdIG5lZWRzICVkLCBmb3VuZCAlZCIsCi0JCQkJICAgICAgYWNwaV91dF9nZXRfbm9kZV9uYW1lKGluZm8tPgotCQkJCQkJCSAgICByZXNvbHZlZF9ub2RlKSwKLQkJCQkgICAgICBpbmZvLT5vYmpfZGVzYy0+bWV0aG9kLnBhcmFtX2NvdW50LAotCQkJCSAgICAgIGluZm8tPnBhcmFtX2NvdW50KSk7Ci0JCX0KLQotCQlBQ1BJX0RVTVBfUEFUSE5BTUUoaW5mby0+cmVzb2x2ZWRfbm9kZSwgIkV4ZWN1dGUgTWV0aG9kOiIsCi0JCQkJICAgQUNQSV9MVl9JTkZPLCBfQ09NUE9ORU5UKTsKLQotCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VYRUMsCi0JCQkJICAiTWV0aG9kIGF0IEFNTCBhZGRyZXNzICVwIExlbmd0aCAlWFxuIiwKLQkJCQkgIGluZm8tPm9ial9kZXNjLT5tZXRob2QuYW1sX3N0YXJ0ICsgMSwKLQkJCQkgIGluZm8tPm9ial9kZXNjLT5tZXRob2QuYW1sX2xlbmd0aCAtIDEpKTsKLQotCQkvKgotCQkgKiBBbnkgbmFtZXNwYWNlIGRlbGV0aW9uIG11c3QgYWNxdWlyZSBib3RoIHRoZSBuYW1lc3BhY2UgYW5kCi0JCSAqIGludGVycHJldGVyIGxvY2tzIHRvIGVuc3VyZSB0aGF0IG5vIHRocmVhZCBpcyB1c2luZyB0aGUgcG9ydGlvbiBvZgotCQkgKiB0aGUgbmFtZXNwYWNlIHRoYXQgaXMgYmVpbmcgZGVsZXRlZC4KLQkJICoKLQkJICogRXhlY3V0ZSB0aGUgbWV0aG9kIHZpYSB0aGUgaW50ZXJwcmV0ZXIuIFRoZSBpbnRlcnByZXRlciBpcyBsb2NrZWQKLQkJICogaGVyZSBiZWZvcmUgY2FsbGluZyBpbnRvIHRoZSBBTUwgcGFyc2VyCi0JCSAqLwotCQlhY3BpX2V4X2VudGVyX2ludGVycHJldGVyKCk7Ci0JCXN0YXR1cyA9IGFjcGlfcHNfZXhlY3V0ZV9tZXRob2QoaW5mbyk7Ci0JCWFjcGlfZXhfZXhpdF9pbnRlcnByZXRlcigpOwotCX0gZWxzZSB7Ci0JCS8qCi0JCSAqIDIpIE9iamVjdCBpcyBub3QgYSBtZXRob2QsIHJldHVybiBpdHMgY3VycmVudCB2YWx1ZQotCQkgKgotCQkgKiBEaXNhbGxvdyBjZXJ0YWluIG9iamVjdCB0eXBlcy4gRm9yIHRoZXNlLCAiZXZhbHVhdGlvbiIgaXMgdW5kZWZpbmVkLgotCQkgKi8KLQkJc3dpdGNoIChpbmZvLT5yZXNvbHZlZF9ub2RlLT50eXBlKSB7Ci0JCWNhc2UgQUNQSV9UWVBFX0RFVklDRToKLQkJY2FzZSBBQ1BJX1RZUEVfRVZFTlQ6Ci0JCWNhc2UgQUNQSV9UWVBFX01VVEVYOgotCQljYXNlIEFDUElfVFlQRV9SRUdJT046Ci0JCWNhc2UgQUNQSV9UWVBFX1RIRVJNQUw6Ci0JCWNhc2UgQUNQSV9UWVBFX0xPQ0FMX1NDT1BFOgotCi0JCQlBQ1BJX0VSUk9SKChBRV9JTkZPLAotCQkJCSAgICAiWyU0LjRzXSBFdmFsdWF0aW9uIG9mIG9iamVjdCB0eXBlIFslc10gaXMgbm90IHN1cHBvcnRlZCIsCi0JCQkJICAgIGluZm8tPnJlc29sdmVkX25vZGUtPm5hbWUuYXNjaWksCi0JCQkJICAgIGFjcGlfdXRfZ2V0X3R5cGVfbmFtZShpbmZvLT5yZXNvbHZlZF9ub2RlLT4KLQkJCQkJCQkgIHR5cGUpKSk7Ci0KLQkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9UWVBFKTsKLQotCQlkZWZhdWx0OgotCQkJYnJlYWs7Ci0JCX0KLQotCQkvKgotCQkgKiBPYmplY3RzIHJlcXVpcmUgYWRkaXRpb25hbCByZXNvbHV0aW9uIHN0ZXBzIChlLmcuLCB0aGUgTm9kZSBtYXkgYmUKLQkJICogYSBmaWVsZCB0aGF0IG11c3QgYmUgcmVhZCwgZXRjLikgLS0gd2UgY2FuJ3QganVzdCBncmFiIHRoZSBvYmplY3QKLQkJICogb3V0IG9mIHRoZSBub2RlLgotCQkgKgotCQkgKiBVc2UgcmVzb2x2ZV9ub2RlX3RvX3ZhbHVlKCkgdG8gZ2V0IHRoZSBhc3NvY2lhdGVkIHZhbHVlLgotCQkgKgotCQkgKiBOT1RFOiB3ZSBjYW4gZ2V0IGF3YXkgd2l0aCBwYXNzaW5nIGluIE5VTEwgZm9yIGEgd2FsayBzdGF0ZSBiZWNhdXNlCi0JCSAqIHJlc29sdmVkX25vZGUgaXMgZ3VhcmFudGVlZCB0byBub3QgYmUgYSByZWZlcmVuY2UgdG8gZWl0aGVyIGEgbWV0aG9kCi0JCSAqIGxvY2FsIG9yIGEgbWV0aG9kIGFyZ3VtZW50IChiZWNhdXNlIHRoaXMgaW50ZXJmYWNlIGlzIG5ldmVyIGNhbGxlZAotCQkgKiBmcm9tIGEgcnVubmluZyBtZXRob2QuKQotCQkgKgotCQkgKiBFdmVuIHRob3VnaCB3ZSBkbyBub3QgZGlyZWN0bHkgaW52b2tlIHRoZSBpbnRlcnByZXRlciBmb3Igb2JqZWN0Ci0JCSAqIHJlc29sdXRpb24sIHdlIG11c3QgbG9jayBpdCBiZWNhdXNlIHdlIGNvdWxkIGFjY2VzcyBhbiBvcHJlZ2lvbi4KLQkJICogVGhlIG9wcmVnaW9uIGFjY2VzcyBjb2RlIGFzc3VtZXMgdGhhdCB0aGUgaW50ZXJwcmV0ZXIgaXMgbG9ja2VkLgotCQkgKi8KLQkJYWNwaV9leF9lbnRlcl9pbnRlcnByZXRlcigpOwotCi0JCS8qIEZ1bmN0aW9uIGhhcyBhIHN0cmFuZ2UgaW50ZXJmYWNlICovCi0KLQkJc3RhdHVzID0KLQkJICAgIGFjcGlfZXhfcmVzb2x2ZV9ub2RlX3RvX3ZhbHVlKCZpbmZvLT5yZXNvbHZlZF9ub2RlLCBOVUxMKTsKLQkJYWNwaV9leF9leGl0X2ludGVycHJldGVyKCk7Ci0KLQkJLyoKLQkJICogSWYgYWNwaV9leF9yZXNvbHZlX25vZGVfdG9fdmFsdWUoKSBzdWNjZWVkZWQsIHRoZSByZXR1cm4gdmFsdWUgd2FzIHBsYWNlZAotCQkgKiBpbiByZXNvbHZlZF9ub2RlLgotCQkgKi8KLQkJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKSB7Ci0JCQlzdGF0dXMgPSBBRV9DVFJMX1JFVFVSTl9WQUxVRTsKLQkJCWluZm8tPnJldHVybl9vYmplY3QgPQotCQkJICAgIEFDUElfQ0FTVF9QVFIodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCwKLQkJCQkJICBpbmZvLT5yZXNvbHZlZF9ub2RlKTsKLQotCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9OQU1FUywKLQkJCQkJICAiUmV0dXJuaW5nIG9iamVjdCAlcCBbJXNdXG4iLAotCQkJCQkgIGluZm8tPnJldHVybl9vYmplY3QsCi0JCQkJCSAgYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZShpbmZvLT4KLQkJCQkJCQkJICAgICAgIHJldHVybl9vYmplY3QpKSk7Ci0JCX0KLQl9Ci0KLQkvKiBWYWxpZGF0aW9uIG9mIHJldHVybiB2YWx1ZXMgZm9yIEFDUEktcHJlZGVmaW5lZCBtZXRob2RzIGFuZCBvYmplY3RzICovCi0KLQlpZiAoKHN0YXR1cyA9PSBBRV9PSykgfHwgKHN0YXR1cyA9PSBBRV9DVFJMX1JFVFVSTl9WQUxVRSkpIHsKLQkJLyoKLQkJICogSWYgdGhpcyBpcyB0aGUgZmlyc3QgZXZhbHVhdGlvbiwgY2hlY2sgdGhlIHJldHVybiB2YWx1ZS4gVGhpcwotCQkgKiBlbnN1cmVzIHRoYXQgYW55IHdhcm5pbmdzIHdpbGwgb25seSBiZSBlbWl0dGVkIGR1cmluZyB0aGUgdmVyeQotCQkgKiBmaXJzdCBldmFsdWF0aW9uIG9mIHRoZSBvYmplY3QuCi0JCSAqLwotCQlpZiAoIShub2RlLT5mbGFncyAmIEFOT0JKX0VWQUxVQVRFRCkpIHsKLQkJCS8qCi0JCQkgKiBDaGVjayBmb3IgYSBwcmVkZWZpbmVkIEFDUEkgbmFtZS4gSWYgZm91bmQsIHZhbGlkYXRlIHRoZQotCQkJICogcmV0dXJuZWQgb2JqZWN0LgotCQkJICoKLQkJCSAqIE5vdGU6IElnbm9yZSByZXR1cm4gc3RhdHVzIGZvciBub3csIGVtaXQgd2FybmluZ3MgaWYgdGhlcmUgYXJlCi0JCQkgKiBwcm9ibGVtcyB3aXRoIHRoZSByZXR1cm5lZCBvYmplY3QuIE1heSBjaGFuZ2UgbGF0ZXIgdG8gYWJvcnQKLQkJCSAqIHRoZSBtZXRob2Qgb24gaW52YWxpZCByZXR1cm4gb2JqZWN0LgotCQkJICovCi0JCQkodm9pZClhY3BpX25zX2NoZWNrX3ByZWRlZmluZWRfbmFtZXMobm9kZSwKLQkJCQkJCQkgICAgIGluZm8tPgotCQkJCQkJCSAgICAgcmV0dXJuX29iamVjdCk7Ci0JCX0KLQotCQkvKiBNYXJrIHRoZSBub2RlIGFzIGhhdmluZyBiZWVuIGV2YWx1YXRlZCAqLwotCi0JCW5vZGUtPmZsYWdzIHw9IEFOT0JKX0VWQUxVQVRFRDsKLQl9Ci0KLQkvKiBDaGVjayBpZiB0aGVyZSBpcyBhIHJldHVybiB2YWx1ZSB0aGF0IG11c3QgYmUgZGVhbHQgd2l0aCAqLwotCi0JaWYgKHN0YXR1cyA9PSBBRV9DVFJMX1JFVFVSTl9WQUxVRSkgewotCi0JCS8qIElmIGNhbGxlciBkb2VzIG5vdCB3YW50IHRoZSByZXR1cm4gdmFsdWUsIGRlbGV0ZSBpdCAqLwotCi0JCWlmIChpbmZvLT5mbGFncyAmIEFDUElfSUdOT1JFX1JFVFVSTl9WQUxVRSkgewotCQkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKGluZm8tPnJldHVybl9vYmplY3QpOwotCQkJaW5mby0+cmV0dXJuX29iamVjdCA9IE5VTEw7Ci0JCX0KLQotCQkvKiBNYXAgQUVfQ1RSTF9SRVRVUk5fVkFMVUUgdG8gQUVfT0ssIHdlIGFyZSBkb25lIHdpdGggaXQgKi8KLQotCQlzdGF0dXMgPSBBRV9PSzsKLQl9Ci0KLQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX05BTUVTLAotCQkJICAiKioqIENvbXBsZXRlZCBldmFsdWF0aW9uIG9mIG9iamVjdCAlcyAqKipcbiIsCi0JCQkgIGluZm8tPnBhdGhuYW1lKSk7Ci0KLQkvKgotCSAqIE5hbWVzcGFjZSB3YXMgdW5sb2NrZWQgYnkgdGhlIGhhbmRsaW5nIGFjcGlfbnMqIGZ1bmN0aW9uLCBzbyB3ZQotCSAqIGp1c3QgcmV0dXJuCi0JICovCi0JcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zaW5pdC5jIGIvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc2luaXQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTRjNTc1MS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zaW5pdC5jCisrKyAvZGV2L251bGwKQEAgLTEsNTkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBNb2R1bGUgTmFtZTogbnNpbml0IC0gbmFtZXNwYWNlIGluaXRpYWxpemF0aW9uCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwOCwgSW50ZWwgQ29ycC4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKLSAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIGF0IG1pbmltdW0gYSBkaXNjbGFpbWVyCi0gKiAgICBzdWJzdGFudGlhbGx5IHNpbWlsYXIgdG8gdGhlICJOTyBXQVJSQU5UWSIgZGlzY2xhaW1lciBiZWxvdwotICogICAgKCJEaXNjbGFpbWVyIikgYW5kIGFueSByZWRpc3RyaWJ1dGlvbiBtdXN0IGJlIGNvbmRpdGlvbmVkIHVwb24KLSAqICAgIGluY2x1ZGluZyBhIHN1YnN0YW50aWFsbHkgc2ltaWxhciBEaXNjbGFpbWVyIHJlcXVpcmVtZW50IGZvciBmdXJ0aGVyCi0gKiAgICBiaW5hcnkgcmVkaXN0cmlidXRpb24uCi0gKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMKLSAqICAgIG9mIGFueSBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTk8gV0FSUkFOVFkKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAotICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKLSAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HCi0gKiBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKLSAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KLSAqLwotCi0jaW5jbHVkZSA8YWNwaS9hY3BpLmg+Ci0jaW5jbHVkZSA8YWNwaS9hY25hbWVzcC5oPgotI2luY2x1ZGUgPGFjcGkvYWNkaXNwYXQuaD4KLSNpbmNsdWRlIDxhY3BpL2FjaW50ZXJwLmg+Ci0jaW5jbHVkZSA8bGludXgvbm1pLmg+Ci0KLSNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX05BTUVTUEFDRQotQUNQSV9NT0RVTEVfTkFNRSgibnNpbml0IikKLQotLyogTG9jYWwgcHJvdG90eXBlcyAqLwotc3RhdGljIGFjcGlfc3RhdHVzCi1hY3BpX25zX2luaXRfb25lX29iamVjdChhY3BpX2hhbmRsZSBvYmpfaGFuZGxlLAotCQkJdTMyIGxldmVsLCB2b2lkICpjb250ZXh0LCB2b2lkICoqcmV0dXJuX3ZhbHVlKTsKLQotc3RhdGljIGFjcGlfc3RhdHVzCi1hY3BpX25zX2luaXRfb25lX2RldmljZShhY3BpX2hhbmRsZSBvYmpfaGFuZGxlLAotCQkJdTMyIG5lc3RpbmdfbGV2ZWwsIHZvaWQgKmNvbnRleHQsIHZvaWQgKipyZXR1cm5fdmFsdWUpOwotCi1zdGF0aWMgYWNwaV9zdGF0dXMKLWFjcGlfbnNfZmluZF9pbmlfbWV0aG9kcyhhY3BpX2hhbmRsZSBvYmpfaGFuZGxlLAotCQkJIHUzMiBuZXN0aW5nX2xldmVsLCB2b2lkICpjb250ZXh0LCB2b2lkICoqcmV0dXJuX3ZhbHVlKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9uc19pbml0aWFsaXplX29iamVjdHMKLSAqCi0gKiBQQVJBTUVURVJTOiAgTm9uZQotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKLSAqCi0gKiBERVNDUklQVElPTjogV2FsayB0aGUgZW50aXJlIG5hbWVzcGFjZSBhbmQgcGVyZm9ybSBhbnkgbmVjZXNzYXJ5Ci0gKiAgICAgICAgICAgICAgaW5pdGlhbGl6YXRpb24gb24gdGhlIG9iamVjdHMgZm91bmQgdGhlcmVpbgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWFjcGlfc3RhdHVzIGFjcGlfbnNfaW5pdGlhbGl6ZV9vYmplY3RzKHZvaWQpCi17Ci0JYWNwaV9zdGF0dXMgc3RhdHVzOwotCXN0cnVjdCBhY3BpX2luaXRfd2Fsa19pbmZvIGluZm87Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKG5zX2luaXRpYWxpemVfb2JqZWN0cyk7Ci0KLQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0RJU1BBVENILAotCQkJICAiKioqKiBTdGFydGluZyBpbml0aWFsaXphdGlvbiBvZiBuYW1lc3BhY2Ugb2JqZWN0cyAqKioqXG4iKSk7Ci0JQUNQSV9ERUJVR19QUklOVF9SQVcoKEFDUElfREJfSU5JVCwKLQkJCSAgICAgICJDb21wbGV0aW5nIFJlZ2lvbi9GaWVsZC9CdWZmZXIvUGFja2FnZSBpbml0aWFsaXphdGlvbjoiKSk7Ci0KLQkvKiBTZXQgYWxsIGluaXQgaW5mbyB0byB6ZXJvICovCi0KLQlBQ1BJX01FTVNFVCgmaW5mbywgMCwgc2l6ZW9mKHN0cnVjdCBhY3BpX2luaXRfd2Fsa19pbmZvKSk7Ci0KLQkvKiBXYWxrIGVudGlyZSBuYW1lc3BhY2UgZnJvbSB0aGUgc3VwcGxpZWQgcm9vdCAqLwotCi0Jc3RhdHVzID0gYWNwaV93YWxrX25hbWVzcGFjZShBQ1BJX1RZUEVfQU5ZLCBBQ1BJX1JPT1RfT0JKRUNULAotCQkJCSAgICAgQUNQSV9VSU5UMzJfTUFYLCBhY3BpX25zX2luaXRfb25lX29iamVjdCwKLQkJCQkgICAgICZpbmZvLCBOVUxMKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJQUNQSV9FWENFUFRJT04oKEFFX0lORk8sIHN0YXR1cywgIkR1cmluZyBXYWxrTmFtZXNwYWNlIikpOwotCX0KLQotCUFDUElfREVCVUdfUFJJTlRfUkFXKChBQ1BJX0RCX0lOSVQsCi0JCQkgICAgICAiXG5Jbml0aWFsaXplZCAlaGQvJWhkIFJlZ2lvbnMgJWhkLyVoZCBGaWVsZHMgJWhkLyVoZCBCdWZmZXJzICVoZC8laGQgUGFja2FnZXMgKCVoZCBub2RlcylcbiIsCi0JCQkgICAgICBpbmZvLm9wX3JlZ2lvbl9pbml0LCBpbmZvLm9wX3JlZ2lvbl9jb3VudCwKLQkJCSAgICAgIGluZm8uZmllbGRfaW5pdCwgaW5mby5maWVsZF9jb3VudCwKLQkJCSAgICAgIGluZm8uYnVmZmVyX2luaXQsIGluZm8uYnVmZmVyX2NvdW50LAotCQkJICAgICAgaW5mby5wYWNrYWdlX2luaXQsIGluZm8ucGFja2FnZV9jb3VudCwKLQkJCSAgICAgIGluZm8ub2JqZWN0X2NvdW50KSk7Ci0KLQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0RJU1BBVENILAotCQkJICAiJWhkIENvbnRyb2wgTWV0aG9kcyBmb3VuZFxuIiwgaW5mby5tZXRob2RfY291bnQpKTsKLQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0RJU1BBVENILAotCQkJICAiJWhkIE9wIFJlZ2lvbnMgZm91bmRcbiIsIGluZm8ub3BfcmVnaW9uX2NvdW50KSk7Ci0KLQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX25zX2luaXRpYWxpemVfZGV2aWNlcwotICoKLSAqIFBBUkFNRVRFUlM6ICBOb25lCi0gKgotICogUkVUVVJOOiAgICAgIGFjcGlfc3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IFdhbGsgdGhlIGVudGlyZSBuYW1lc3BhY2UgYW5kIGluaXRpYWxpemUgYWxsIEFDUEkgZGV2aWNlcy4KLSAqICAgICAgICAgICAgICBUaGlzIG1lYW5zIHJ1bm5pbmcgX0lOSSBvbiBhbGwgcHJlc2VudCBkZXZpY2VzLgotICoKLSAqICAgICAgICAgICAgICBOb3RlOiBXZSBpbnN0YWxsIFBDSSBjb25maWcgc3BhY2UgaGFuZGxlciBvbiByZWdpb24gYWNjZXNzLAotICogICAgICAgICAgICAgIG5vdCBoZXJlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWFjcGlfc3RhdHVzIGFjcGlfbnNfaW5pdGlhbGl6ZV9kZXZpY2VzKHZvaWQpCi17Ci0JYWNwaV9zdGF0dXMgc3RhdHVzOwotCXN0cnVjdCBhY3BpX2RldmljZV93YWxrX2luZm8gaW5mbzsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UobnNfaW5pdGlhbGl6ZV9kZXZpY2VzKTsKLQotCS8qIEluaXQgY291bnRlcnMgKi8KLQotCWluZm8uZGV2aWNlX2NvdW50ID0gMDsKLQlpbmZvLm51bV9TVEEgPSAwOwotCWluZm8ubnVtX0lOSSA9IDA7Ci0KLQlBQ1BJX0RFQlVHX1BSSU5UX1JBVygoQUNQSV9EQl9JTklULAotCQkJICAgICAgIkluaXRpYWxpemluZyBEZXZpY2UvUHJvY2Vzc29yL1RoZXJtYWwgb2JqZWN0cyBieSBleGVjdXRpbmcgX0lOSSBtZXRob2RzOiIpKTsKLQotCS8qIFRyZWUgYW5hbHlzaXM6IGZpbmQgYWxsIHN1YnRyZWVzIHRoYXQgY29udGFpbiBfSU5JIG1ldGhvZHMgKi8KLQotCXN0YXR1cyA9IGFjcGlfbnNfd2Fsa19uYW1lc3BhY2UoQUNQSV9UWVBFX0FOWSwgQUNQSV9ST09UX09CSkVDVCwKLQkJCQkJQUNQSV9VSU5UMzJfTUFYLCBGQUxTRSwKLQkJCQkJYWNwaV9uc19maW5kX2luaV9tZXRob2RzLCAmaW5mbywgTlVMTCk7Ci0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCWdvdG8gZXJyb3JfZXhpdDsKLQl9Ci0KLQkvKiBBbGxvY2F0ZSB0aGUgZXZhbHVhdGlvbiBpbmZvcm1hdGlvbiBibG9jayAqLwotCi0JaW5mby5ldmFsdWF0ZV9pbmZvID0KLQkgICAgQUNQSV9BTExPQ0FURV9aRVJPRUQoc2l6ZW9mKHN0cnVjdCBhY3BpX2V2YWx1YXRlX2luZm8pKTsKLQlpZiAoIWluZm8uZXZhbHVhdGVfaW5mbykgewotCQlzdGF0dXMgPSBBRV9OT19NRU1PUlk7Ci0JCWdvdG8gZXJyb3JfZXhpdDsKLQl9Ci0KLQkvKiBXYWxrIG5hbWVzcGFjZSB0byBleGVjdXRlIGFsbCBfSU5JcyBvbiBwcmVzZW50IGRldmljZXMgKi8KLQotCXN0YXR1cyA9IGFjcGlfbnNfd2Fsa19uYW1lc3BhY2UoQUNQSV9UWVBFX0FOWSwgQUNQSV9ST09UX09CSkVDVCwKLQkJCQkJQUNQSV9VSU5UMzJfTUFYLCBGQUxTRSwKLQkJCQkJYWNwaV9uc19pbml0X29uZV9kZXZpY2UsICZpbmZvLCBOVUxMKTsKLQotCUFDUElfRlJFRShpbmZvLmV2YWx1YXRlX2luZm8pOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlnb3RvIGVycm9yX2V4aXQ7Ci0JfQotCi0JQUNQSV9ERUJVR19QUklOVF9SQVcoKEFDUElfREJfSU5JVCwKLQkJCSAgICAgICJcbkV4ZWN1dGVkICVoZCBfSU5JIG1ldGhvZHMgcmVxdWlyaW5nICVoZCBfU1RBIGV4ZWN1dGlvbnMgKGV4YW1pbmVkICVoZCBvYmplY3RzKVxuIiwKLQkJCSAgICAgIGluZm8ubnVtX0lOSSwgaW5mby5udW1fU1RBLCBpbmZvLmRldmljZV9jb3VudCkpOwotCi0JcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci0KLSAgICAgIGVycm9yX2V4aXQ6Ci0JQUNQSV9FWENFUFRJT04oKEFFX0lORk8sIHN0YXR1cywgIkR1cmluZyBkZXZpY2UgaW5pdGlhbGl6YXRpb24iKSk7Ci0JcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfbnNfaW5pdF9vbmVfb2JqZWN0Ci0gKgotICogUEFSQU1FVEVSUzogIG9ial9oYW5kbGUgICAgICAtIE5vZGUKLSAqICAgICAgICAgICAgICBMZXZlbCAgICAgICAgICAgLSBDdXJyZW50IG5lc3RpbmcgbGV2ZWwKLSAqICAgICAgICAgICAgICBDb250ZXh0ICAgICAgICAgLSBQb2ludHMgdG8gYSBpbml0IGluZm8gc3RydWN0Ci0gKiAgICAgICAgICAgICAgcmV0dXJuX3ZhbHVlICAgIC0gTm90IHVzZWQKLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IENhbGxiYWNrIGZyb20gYWNwaV93YWxrX25hbWVzcGFjZS4gSW52b2tlZCBmb3IgZXZlcnkgb2JqZWN0Ci0gKiAgICAgICAgICAgICAgd2l0aGluIHRoZSAgbmFtZXNwYWNlLgotICoKLSAqICAgICAgICAgICAgICBDdXJyZW50bHksIHRoZSBvbmx5IG9iamVjdHMgdGhhdCByZXF1aXJlIGluaXRpYWxpemF0aW9uIGFyZToKLSAqICAgICAgICAgICAgICAxKSBNZXRob2RzCi0gKiAgICAgICAgICAgICAgMikgT3AgUmVnaW9ucwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyBhY3BpX3N0YXR1cwotYWNwaV9uc19pbml0X29uZV9vYmplY3QoYWNwaV9oYW5kbGUgb2JqX2hhbmRsZSwKLQkJCXUzMiBsZXZlbCwgdm9pZCAqY29udGV4dCwgdm9pZCAqKnJldHVybl92YWx1ZSkKLXsKLQlhY3BpX29iamVjdF90eXBlIHR5cGU7Ci0JYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7Ci0Jc3RydWN0IGFjcGlfaW5pdF93YWxrX2luZm8gKmluZm8gPQotCSAgICAoc3RydWN0IGFjcGlfaW5pdF93YWxrX2luZm8gKiljb250ZXh0OwotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlID0KLQkgICAgKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICopb2JqX2hhbmRsZTsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYzsKLQotCUFDUElfRlVOQ1RJT05fTkFNRShuc19pbml0X29uZV9vYmplY3QpOwotCi0JaW5mby0+b2JqZWN0X2NvdW50Kys7Ci0KLQkvKiBBbmQgZXZlbiB0aGVuLCB3ZSBhcmUgb25seSBpbnRlcmVzdGVkIGluIGEgZmV3IG9iamVjdCB0eXBlcyAqLwotCi0JdHlwZSA9IGFjcGlfbnNfZ2V0X3R5cGUob2JqX2hhbmRsZSk7Ci0Jb2JqX2Rlc2MgPSBhY3BpX25zX2dldF9hdHRhY2hlZF9vYmplY3Qobm9kZSk7Ci0JaWYgKCFvYmpfZGVzYykgewotCQlyZXR1cm4gKEFFX09LKTsKLQl9Ci0KLQkvKiBJbmNyZW1lbnQgY291bnRlcnMgZm9yIG9iamVjdCB0eXBlcyB3ZSBhcmUgbG9va2luZyBmb3IgKi8KLQotCXN3aXRjaCAodHlwZSkgewotCWNhc2UgQUNQSV9UWVBFX1JFR0lPTjoKLQkJaW5mby0+b3BfcmVnaW9uX2NvdW50Kys7Ci0JCWJyZWFrOwotCi0JY2FzZSBBQ1BJX1RZUEVfQlVGRkVSX0ZJRUxEOgotCQlpbmZvLT5maWVsZF9jb3VudCsrOwotCQlicmVhazsKLQotCWNhc2UgQUNQSV9UWVBFX0xPQ0FMX0JBTktfRklFTEQ6Ci0JCWluZm8tPmZpZWxkX2NvdW50Kys7Ci0JCWJyZWFrOwotCi0JY2FzZSBBQ1BJX1RZUEVfQlVGRkVSOgotCQlpbmZvLT5idWZmZXJfY291bnQrKzsKLQkJYnJlYWs7Ci0KLQljYXNlIEFDUElfVFlQRV9QQUNLQUdFOgotCQlpbmZvLT5wYWNrYWdlX2NvdW50Kys7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQotCQkvKiBObyBpbml0IHJlcXVpcmVkLCBqdXN0IGV4aXQgbm93ICovCi0JCXJldHVybiAoQUVfT0spOwotCX0KLQotCS8qCi0JICogSWYgdGhlIG9iamVjdCBpcyBhbHJlYWR5IGluaXRpYWxpemVkLCBub3RoaW5nIGVsc2UgdG8gZG8KLQkgKi8KLQlpZiAob2JqX2Rlc2MtPmNvbW1vbi5mbGFncyAmIEFPUE9CSl9EQVRBX1ZBTElEKSB7Ci0JCXJldHVybiAoQUVfT0spOwotCX0KLQotCS8qCi0JICogTXVzdCBsb2NrIHRoZSBpbnRlcnByZXRlciBiZWZvcmUgZXhlY3V0aW5nIEFNTCBjb2RlCi0JICovCi0JYWNwaV9leF9lbnRlcl9pbnRlcnByZXRlcigpOwotCi0JLyoKLQkgKiBFYWNoIG9mIHRoZXNlIHR5cGVzIGNhbiBjb250YWluIGV4ZWN1dGFibGUgQU1MIGNvZGUgd2l0aGluIHRoZQotCSAqIGRlY2xhcmF0aW9uLgotCSAqLwotCXN3aXRjaCAodHlwZSkgewotCWNhc2UgQUNQSV9UWVBFX1JFR0lPTjoKLQotCQlpbmZvLT5vcF9yZWdpb25faW5pdCsrOwotCQlzdGF0dXMgPSBhY3BpX2RzX2dldF9yZWdpb25fYXJndW1lbnRzKG9ial9kZXNjKTsKLQkJYnJlYWs7Ci0KLQljYXNlIEFDUElfVFlQRV9CVUZGRVJfRklFTEQ6Ci0KLQkJaW5mby0+ZmllbGRfaW5pdCsrOwotCQlzdGF0dXMgPSBhY3BpX2RzX2dldF9idWZmZXJfZmllbGRfYXJndW1lbnRzKG9ial9kZXNjKTsKLQkJYnJlYWs7Ci0KLQljYXNlIEFDUElfVFlQRV9MT0NBTF9CQU5LX0ZJRUxEOgotCi0JCWluZm8tPmZpZWxkX2luaXQrKzsKLQkJc3RhdHVzID0gYWNwaV9kc19nZXRfYmFua19maWVsZF9hcmd1bWVudHMob2JqX2Rlc2MpOwotCQlicmVhazsKLQotCWNhc2UgQUNQSV9UWVBFX0JVRkZFUjoKLQotCQlpbmZvLT5idWZmZXJfaW5pdCsrOwotCQlzdGF0dXMgPSBhY3BpX2RzX2dldF9idWZmZXJfYXJndW1lbnRzKG9ial9kZXNjKTsKLQkJYnJlYWs7Ci0KLQljYXNlIEFDUElfVFlQRV9QQUNLQUdFOgotCi0JCWluZm8tPnBhY2thZ2VfaW5pdCsrOwotCQlzdGF0dXMgPSBhY3BpX2RzX2dldF9wYWNrYWdlX2FyZ3VtZW50cyhvYmpfZGVzYyk7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJLyogTm8gb3RoZXIgdHlwZXMgY2FuIGdldCBoZXJlICovCi0JCWJyZWFrOwotCX0KLQotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlBQ1BJX0VYQ0VQVElPTigoQUVfSU5GTywgc3RhdHVzLAotCQkJCSJDb3VsZCBub3QgZXhlY3V0ZSBhcmd1bWVudHMgZm9yIFslNC40c10gKCVzKSIsCi0JCQkJYWNwaV91dF9nZXRfbm9kZV9uYW1lKG5vZGUpLAotCQkJCWFjcGlfdXRfZ2V0X3R5cGVfbmFtZSh0eXBlKSkpOwotCX0KLQotCS8qCi0JICogUHJpbnQgYSBkb3QgZm9yIGVhY2ggb2JqZWN0IHVubGVzcyB3ZSBhcmUgZ29pbmcgdG8gcHJpbnQgdGhlIGVudGlyZQotCSAqIHBhdGhuYW1lCi0JICovCi0JaWYgKCEoYWNwaV9kYmdfbGV2ZWwgJiBBQ1BJX0xWX0lOSVRfTkFNRVMpKSB7Ci0JCUFDUElfREVCVUdfUFJJTlRfUkFXKChBQ1BJX0RCX0lOSVQsICIuIikpOwotCX0KLQotCS8qCi0JICogV2UgaWdub3JlIGVycm9ycyBmcm9tIGFib3ZlLCBhbmQgYWx3YXlzIHJldHVybiBPSywgc2luY2Ugd2UgZG9uJ3Qgd2FudAotCSAqIHRvIGFib3J0IHRoZSB3YWxrIG9uIGFueSBzaW5nbGUgZXJyb3IuCi0JICovCi0JYWNwaV9leF9leGl0X2ludGVycHJldGVyKCk7Ci0JcmV0dXJuIChBRV9PSyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfbnNfZmluZF9pbmlfbWV0aG9kcwotICoKLSAqIFBBUkFNRVRFUlM6ICBhY3BpX3dhbGtfY2FsbGJhY2sKLSAqCi0gKiBSRVRVUk46ICAgICAgYWNwaV9zdGF0dXMKLSAqCi0gKiBERVNDUklQVElPTjogQ2FsbGVkIGR1cmluZyBuYW1lc3BhY2Ugd2Fsay4gRmluZHMgb2JqZWN0cyBuYW1lZCBfSU5JIHVuZGVyCi0gKiAgICAgICAgICAgICAgZGV2aWNlL3Byb2Nlc3Nvci90aGVybWFsIG9iamVjdHMsIGFuZCBtYXJrcyB0aGUgZW50aXJlIHN1YnRyZWUKLSAqICAgICAgICAgICAgICB3aXRoIGEgU1VCVFJFRV9IQVNfSU5JIGZsYWcuIFRoaXMgZmxhZyBpcyB1c2VkIGR1cmluZyB0aGUKLSAqICAgICAgICAgICAgICBzdWJzZXF1ZW50IGRldmljZSBpbml0aWFsaXphdGlvbiB3YWxrIHRvIGF2b2lkIGVudGlyZSBzdWJ0cmVlcwotICogICAgICAgICAgICAgIHRoYXQgZG8gbm90IGNvbnRhaW4gYW4gX0lOSS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgYWNwaV9zdGF0dXMKLWFjcGlfbnNfZmluZF9pbmlfbWV0aG9kcyhhY3BpX2hhbmRsZSBvYmpfaGFuZGxlLAotCQkJIHUzMiBuZXN0aW5nX2xldmVsLCB2b2lkICpjb250ZXh0LCB2b2lkICoqcmV0dXJuX3ZhbHVlKQotewotCXN0cnVjdCBhY3BpX2RldmljZV93YWxrX2luZm8gKmluZm8gPQotCSAgICBBQ1BJX0NBU1RfUFRSKHN0cnVjdCBhY3BpX2RldmljZV93YWxrX2luZm8sIGNvbnRleHQpOwotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlOwotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpwYXJlbnRfbm9kZTsKLQotCS8qIEtlZXAgY291bnQgb2YgZGV2aWNlL3Byb2Nlc3Nvci90aGVybWFsIG9iamVjdHMgKi8KLQotCW5vZGUgPSBBQ1BJX0NBU1RfUFRSKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlLCBvYmpfaGFuZGxlKTsKLQlpZiAoKG5vZGUtPnR5cGUgPT0gQUNQSV9UWVBFX0RFVklDRSkgfHwKLQkgICAgKG5vZGUtPnR5cGUgPT0gQUNQSV9UWVBFX1BST0NFU1NPUikgfHwKLQkgICAgKG5vZGUtPnR5cGUgPT0gQUNQSV9UWVBFX1RIRVJNQUwpKSB7Ci0JCWluZm8tPmRldmljZV9jb3VudCsrOwotCQlyZXR1cm4gKEFFX09LKTsKLQl9Ci0KLQkvKiBXZSBhcmUgb25seSBsb29raW5nIGZvciBtZXRob2RzIG5hbWVkIF9JTkkgKi8KLQotCWlmICghQUNQSV9DT01QQVJFX05BTUUobm9kZS0+bmFtZS5hc2NpaSwgTUVUSE9EX05BTUVfX0lOSSkpIHsKLQkJcmV0dXJuIChBRV9PSyk7Ci0JfQotCi0JLyoKLQkgKiBUaGUgb25seSBfSU5JIG1ldGhvZHMgdGhhdCB3ZSBjYXJlIGFib3V0IGFyZSB0aG9zZSB0aGF0IGFyZQotCSAqIHByZXNlbnQgdW5kZXIgRGV2aWNlLCBQcm9jZXNzb3IsIGFuZCBUaGVybWFsIG9iamVjdHMuCi0JICovCi0JcGFyZW50X25vZGUgPSBhY3BpX25zX2dldF9wYXJlbnRfbm9kZShub2RlKTsKLQlzd2l0Y2ggKHBhcmVudF9ub2RlLT50eXBlKSB7Ci0JY2FzZSBBQ1BJX1RZUEVfREVWSUNFOgotCWNhc2UgQUNQSV9UWVBFX1BST0NFU1NPUjoKLQljYXNlIEFDUElfVFlQRV9USEVSTUFMOgotCi0JCS8qIE1hcmsgcGFyZW50IGFuZCBidWJibGUgdXAgdGhlIElOSSBwcmVzZW50IGZsYWcgdG8gdGhlIHJvb3QgKi8KLQotCQl3aGlsZSAocGFyZW50X25vZGUpIHsKLQkJCXBhcmVudF9ub2RlLT5mbGFncyB8PSBBTk9CSl9TVUJUUkVFX0hBU19JTkk7Ci0JCQlwYXJlbnRfbm9kZSA9IGFjcGlfbnNfZ2V0X3BhcmVudF9ub2RlKHBhcmVudF9ub2RlKTsKLQkJfQotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX0KLQotCXJldHVybiAoQUVfT0spOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX25zX2luaXRfb25lX2RldmljZQotICoKLSAqIFBBUkFNRVRFUlM6ICBhY3BpX3dhbGtfY2FsbGJhY2sKLSAqCi0gKiBSRVRVUk46ICAgICAgYWNwaV9zdGF0dXMKLSAqCi0gKiBERVNDUklQVElPTjogVGhpcyBpcyBjYWxsZWQgb25jZSBwZXIgZGV2aWNlIHNvb24gYWZ0ZXIgQUNQSSBpcyBlbmFibGVkCi0gKiAgICAgICAgICAgICAgdG8gaW5pdGlhbGl6ZSBlYWNoIGRldmljZS4gSXQgZGV0ZXJtaW5lcyBpZiB0aGUgZGV2aWNlIGlzCi0gKiAgICAgICAgICAgICAgcHJlc2VudCwgYW5kIGlmIHNvLCBjYWxscyBfSU5JLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyBhY3BpX3N0YXR1cwotYWNwaV9uc19pbml0X29uZV9kZXZpY2UoYWNwaV9oYW5kbGUgb2JqX2hhbmRsZSwKLQkJCXUzMiBuZXN0aW5nX2xldmVsLCB2b2lkICpjb250ZXh0LCB2b2lkICoqcmV0dXJuX3ZhbHVlKQotewotCXN0cnVjdCBhY3BpX2RldmljZV93YWxrX2luZm8gKndhbGtfaW5mbyA9Ci0JICAgIEFDUElfQ0FTVF9QVFIoc3RydWN0IGFjcGlfZGV2aWNlX3dhbGtfaW5mbywgY29udGV4dCk7Ci0Jc3RydWN0IGFjcGlfZXZhbHVhdGVfaW5mbyAqaW5mbyA9IHdhbGtfaW5mby0+ZXZhbHVhdGVfaW5mbzsKLQl1MzIgZmxhZ3M7Ci0JYWNwaV9zdGF0dXMgc3RhdHVzOwotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpkZXZpY2Vfbm9kZTsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UobnNfaW5pdF9vbmVfZGV2aWNlKTsKLQotCS8qIFdlIGFyZSBpbnRlcmVzdGVkIGluIERldmljZXMsIFByb2Nlc3NvcnMgYW5kIHRoZXJtYWxfem9uZXMgb25seSAqLwotCi0JZGV2aWNlX25vZGUgPSBBQ1BJX0NBU1RfUFRSKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlLCBvYmpfaGFuZGxlKTsKLQlpZiAoKGRldmljZV9ub2RlLT50eXBlICE9IEFDUElfVFlQRV9ERVZJQ0UpICYmCi0JICAgIChkZXZpY2Vfbm9kZS0+dHlwZSAhPSBBQ1BJX1RZUEVfUFJPQ0VTU09SKSAmJgotCSAgICAoZGV2aWNlX25vZGUtPnR5cGUgIT0gQUNQSV9UWVBFX1RIRVJNQUwpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7Ci0JfQotCi0JLyoKLQkgKiBCZWNhdXNlIG9mIGFuIGVhcmxpZXIgbmFtZXNwYWNlIGFuYWx5c2lzLCBhbGwgc3VidHJlZXMgdGhhdCBjb250YWluIGFuCi0JICogX0lOSSBtZXRob2QgYXJlIHRhZ2dlZC4KLQkgKgotCSAqIElmIHRoaXMgZGV2aWNlIHN1YnRyZWUgZG9lcyBub3QgY29udGFpbiBhbnkgX0lOSSBtZXRob2RzLCB3ZQotCSAqIGNhbiBleGl0IG5vdyBhbmQgc3RvcCB0cmF2ZXJzaW5nIHRoaXMgZW50aXJlIHN1YnRyZWUuCi0JICovCi0JaWYgKCEoZGV2aWNlX25vZGUtPmZsYWdzICYgQU5PQkpfU1VCVFJFRV9IQVNfSU5JKSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQ1RSTF9ERVBUSCk7Ci0JfQotCi0JLyoKLQkgKiBSdW4gX1NUQSB0byBkZXRlcm1pbmUgaWYgdGhpcyBkZXZpY2UgaXMgcHJlc2VudCBhbmQgZnVuY3Rpb25pbmcuIFdlCi0JICogbXVzdCBrbm93IHRoaXMgaW5mb3JtYXRpb24gZm9yIHR3byBpbXBvcnRhbnQgcmVhc29ucyAoZnJvbSBBQ1BJIHNwZWMpOgotCSAqCi0JICogMSkgV2UgY2FuIG9ubHkgcnVuIF9JTkkgaWYgdGhlIGRldmljZSBpcyBwcmVzZW50LgotCSAqIDIpIFdlIG11c3QgYWJvcnQgdGhlIGRldmljZSB0cmVlIHdhbGsgb24gdGhpcyBzdWJ0cmVlIGlmIHRoZSBkZXZpY2UgaXMKLQkgKiAgICBub3QgcHJlc2VudCBhbmQgaXMgbm90IGZ1bmN0aW9uYWwgKHdlIHdpbGwgbm90IGV4YW1pbmUgdGhlIGNoaWxkcmVuKQotCSAqCi0JICogVGhlIF9TVEEgbWV0aG9kIGlzIG5vdCByZXF1aXJlZCB0byBiZSBwcmVzZW50IHVuZGVyIHRoZSBkZXZpY2UsIHdlCi0JICogYXNzdW1lIHRoZSBkZXZpY2UgaXMgcHJlc2VudCBpZiBfU1RBIGRvZXMgbm90IGV4aXN0LgotCSAqLwotCUFDUElfREVCVUdfRVhFQyhhY3BpX3V0X2Rpc3BsYXlfaW5pdF9wYXRobmFtZQotCQkJKEFDUElfVFlQRV9NRVRIT0QsIGRldmljZV9ub2RlLCBNRVRIT0RfTkFNRV9fU1RBKSk7Ci0KLQlzdGF0dXMgPSBhY3BpX3V0X2V4ZWN1dGVfU1RBKGRldmljZV9ub2RlLCAmZmxhZ3MpOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCi0JCS8qIElnbm9yZSBlcnJvciBhbmQgbW92ZSBvbiB0byBuZXh0IGRldmljZSAqLwotCi0JCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7Ci0JfQotCi0JLyoKLQkgKiBGbGFncyA9PSAtMSBtZWFucyB0aGF0IF9TVEEgd2FzIG5vdCBmb3VuZC4gSW4gdGhpcyBjYXNlLCB3ZSBhc3N1bWUgdGhhdAotCSAqIHRoZSBkZXZpY2UgaXMgYm90aCBwcmVzZW50IGFuZCBmdW5jdGlvbmFsLgotCSAqCi0JICogRnJvbSB0aGUgQUNQSSBzcGVjLCBkZXNjcmlwdGlvbiBvZiBfU1RBOgotCSAqCi0JICogIklmIGEgZGV2aWNlIG9iamVjdCAoaW5jbHVkaW5nIHRoZSBwcm9jZXNzb3Igb2JqZWN0KSBkb2VzIG5vdCBoYXZlIGFuCi0JICogX1NUQSBvYmplY3QsIHRoZW4gT1NQTSBhc3N1bWVzIHRoYXQgYWxsIG9mIHRoZSBhYm92ZSBiaXRzIGFyZSBzZXQgKGluCi0JICogb3RoZXIgd29yZHMsIHRoZSBkZXZpY2UgaXMgcHJlc2VudCwgLi4uLCBhbmQgZnVuY3Rpb25pbmcpIgotCSAqLwotCWlmIChmbGFncyAhPSBBQ1BJX1VJTlQzMl9NQVgpIHsKLQkJd2Fsa19pbmZvLT5udW1fU1RBKys7Ci0JfQotCi0JLyoKLQkgKiBFeGFtaW5lIHRoZSBQUkVTRU5UIGFuZCBGVU5DVElPTklORyBzdGF0dXMgYml0cwotCSAqCi0JICogTm90ZTogQUNQSSBzcGVjIGRvZXMgbm90IHNlZW0gdG8gc3BlY2lmeSBiZWhhdmlvciBmb3IgdGhlIHByZXNlbnQgYnV0Ci0JICogbm90IGZ1bmN0aW9uaW5nIGNhc2UsIHNvIHdlIGFzc3VtZSBmdW5jdGlvbmluZyBpZiBwcmVzZW50LgotCSAqLwotCWlmICghKGZsYWdzICYgQUNQSV9TVEFfREVWSUNFX1BSRVNFTlQpKSB7Ci0KLQkJLyogRGV2aWNlIGlzIG5vdCBwcmVzZW50LCB3ZSBtdXN0IGV4YW1pbmUgdGhlIEZ1bmN0aW9uaW5nIGJpdCAqLwotCi0JCWlmIChmbGFncyAmIEFDUElfU1RBX0RFVklDRV9GVU5DVElPTklORykgewotCQkJLyoKLQkJCSAqIERldmljZSBpcyBub3QgcHJlc2VudCBidXQgaXMgImZ1bmN0aW9uaW5nIi4gSW4gdGhpcyBjYXNlLAotCQkJICogd2Ugd2lsbCBub3QgcnVuIF9JTkksIGJ1dCB3ZSBjb250aW51ZSB0byBleGFtaW5lIHRoZSBjaGlsZHJlbgotCQkJICogb2YgdGhpcyBkZXZpY2UuCi0JCQkgKgotCQkJICogRnJvbSB0aGUgQUNQSSBzcGVjLCBkZXNjcmlwdGlvbiBvZiBfU1RBOiAoTm90ZSAtIG5vIG1lbnRpb24KLQkJCSAqIG9mIHdoZXRoZXIgdG8gcnVuIF9JTkkgb3Igbm90IG9uIHRoZSBkZXZpY2UgaW4gcXVlc3Rpb24pCi0JCQkgKgotCQkJICogIl9TVEEgbWF5IHJldHVybiBiaXQgMCBjbGVhciAobm90IHByZXNlbnQpIHdpdGggYml0IDMgc2V0Ci0JCQkgKiAoZGV2aWNlIGlzIGZ1bmN0aW9uYWwpLiBUaGlzIGNhc2UgaXMgdXNlZCB0byBpbmRpY2F0ZSBhIHZhbGlkCi0JCQkgKiBkZXZpY2UgZm9yIHdoaWNoIG5vIGRldmljZSBkcml2ZXIgc2hvdWxkIGJlIGxvYWRlZCAoZm9yIGV4YW1wbGUsCi0JCQkgKiBhIGJyaWRnZSBkZXZpY2UuKSBDaGlsZHJlbiBvZiB0aGlzIGRldmljZSBtYXkgYmUgcHJlc2VudCBhbmQKLQkJCSAqIHZhbGlkLiBPU1BNIHNob3VsZCBjb250aW51ZSBlbnVtZXJhdGlvbiBiZWxvdyBhIGRldmljZSB3aG9zZQotCQkJICogX1NUQSByZXR1cm5zIHRoaXMgYml0IGNvbWJpbmF0aW9uIgotCQkJICovCi0JCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwotCQl9IGVsc2UgewotCQkJLyoKLQkJCSAqIERldmljZSBpcyBub3QgcHJlc2VudCBhbmQgaXMgbm90IGZ1bmN0aW9uaW5nLiBXZSBtdXN0IGFib3J0IHRoZQotCQkJICogd2FsayBvZiB0aGlzIHN1YnRyZWUgaW1tZWRpYXRlbHkgLS0gZG9uJ3QgbG9vayBhdCB0aGUgY2hpbGRyZW4KLQkJCSAqIG9mIHN1Y2ggYSBkZXZpY2UuCi0JCQkgKgotCQkJICogRnJvbSB0aGUgQUNQSSBzcGVjLCBkZXNjcmlwdGlvbiBvZiBfSU5JOgotCQkJICoKLQkJCSAqICJJZiB0aGUgX1NUQSBtZXRob2QgaW5kaWNhdGVzIHRoYXQgdGhlIGRldmljZSBpcyBub3QgcHJlc2VudCwKLQkJCSAqIE9TUE0gd2lsbCBub3QgcnVuIHRoZSBfSU5JIGFuZCB3aWxsIG5vdCBleGFtaW5lIHRoZSBjaGlsZHJlbgotCQkJICogb2YgdGhlIGRldmljZSBmb3IgX0lOSSBtZXRob2RzIgotCQkJICovCi0JCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQ1RSTF9ERVBUSCk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIFRoZSBkZXZpY2UgaXMgcHJlc2VudCBvciBpcyBhc3N1bWVkIHByZXNlbnQgaWYgbm8gX1NUQSBleGlzdHMuCi0JICogUnVuIHRoZSBfSU5JIGlmIGl0IGV4aXN0cyAobm90IHJlcXVpcmVkIHRvIGV4aXN0KQotCSAqCi0JICogTm90ZTogV2Uga25vdyB0aGVyZSBpcyBhbiBfSU5JIHdpdGhpbiB0aGlzIHN1YnRyZWUsIGJ1dCBpdCBtYXkgbm90IGJlCi0JICogdW5kZXIgdGhpcyBwYXJ0aWN1bGFyIGRldmljZSwgaXQgbWF5IGJlIGxvd2VyIGluIHRoZSBicmFuY2guCi0JICovCi0JQUNQSV9ERUJVR19FWEVDKGFjcGlfdXRfZGlzcGxheV9pbml0X3BhdGhuYW1lCi0JCQkoQUNQSV9UWVBFX01FVEhPRCwgZGV2aWNlX25vZGUsIE1FVEhPRF9OQU1FX19JTkkpKTsKLQotCWluZm8tPnByZWZpeF9ub2RlID0gZGV2aWNlX25vZGU7Ci0JaW5mby0+cGF0aG5hbWUgPSBNRVRIT0RfTkFNRV9fSU5JOwotCWluZm8tPnBhcmFtZXRlcnMgPSBOVUxMOwotCWluZm8tPmZsYWdzID0gQUNQSV9JR05PUkVfUkVUVVJOX1ZBTFVFOwotCi0JLyoKLQkgKiBTb21lIGhhcmR3YXJlIHJlbGllcyBvbiB0aGlzIGJlaW5nIGV4ZWN1dGVkIGFzIGF0b21pY2FsbHkKLQkgKiBhcyBwb3NzaWJsZSAod2l0aG91dCBhbiBOTUkgYmVpbmcgcmVjZWl2ZWQgaW4gdGhlIG1pZGRsZSBvZgotCSAqIHRoaXMpIC0gc28gZGlzYWJsZSBOTUlzIGFuZCBpbml0aWFsaXplIHRoZSBkZXZpY2U6Ci0JICovCi0JYWNwaV9ubWlfZGlzYWJsZSgpOwotCXN0YXR1cyA9IGFjcGlfbnNfZXZhbHVhdGUoaW5mbyk7Ci0JYWNwaV9ubWlfZW5hYmxlKCk7Ci0KLQlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpIHsKLQkJd2Fsa19pbmZvLT5udW1fSU5JKys7Ci0KLQkJaWYgKChhY3BpX2RiZ19sZXZlbCA8PSBBQ1BJX0xWX0FMTF9FWENFUFRJT05TKSAmJgotCQkgICAgKCEoYWNwaV9kYmdfbGV2ZWwgJiBBQ1BJX0xWX0lORk8pKSkgewotCQkJQUNQSV9ERUJVR19QUklOVF9SQVcoKEFDUElfREJfSU5JVCwgIi4iKSk7Ci0JCX0KLQl9Ci0jaWZkZWYgQUNQSV9ERUJVR19PVVRQVVQKLQllbHNlIGlmIChzdGF0dXMgIT0gQUVfTk9UX0ZPVU5EKSB7Ci0KLQkJLyogSWdub3JlIGVycm9yIGFuZCBtb3ZlIG9uIHRvIG5leHQgZGV2aWNlICovCi0KLQkJY2hhciAqc2NvcGVfbmFtZSA9Ci0JCSAgICBhY3BpX25zX2dldF9leHRlcm5hbF9wYXRobmFtZShpbmZvLT5yZXNvbHZlZF9ub2RlKTsKLQotCQlBQ1BJX0VYQ0VQVElPTigoQUVfSU5GTywgc3RhdHVzLCAiZHVyaW5nICVzLl9JTkkgZXhlY3V0aW9uIiwKLQkJCQlzY29wZV9uYW1lKSk7Ci0JCUFDUElfRlJFRShzY29wZV9uYW1lKTsKLQl9Ci0jZW5kaWYKLQotCS8qIElnbm9yZSBlcnJvcnMgZnJvbSBhYm92ZSAqLwotCi0Jc3RhdHVzID0gQUVfT0s7Ci0KLQkvKgotCSAqIFRoZSBfSU5JIG1ldGhvZCBoYXMgYmVlbiBydW4gaWYgcHJlc2VudDsgY2FsbCB0aGUgR2xvYmFsIEluaXRpYWxpemF0aW9uCi0JICogSGFuZGxlciBmb3IgdGhpcyBkZXZpY2UuCi0JICovCi0JaWYgKGFjcGlfZ2JsX2luaXRfaGFuZGxlcikgewotCQlzdGF0dXMgPQotCQkgICAgYWNwaV9nYmxfaW5pdF9oYW5kbGVyKGRldmljZV9ub2RlLCBBQ1BJX0lOSVRfREVWSUNFX0lOSSk7Ci0JfQotCi0JcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zbG9hZC5jIGIvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc2xvYWQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTRhNDEyYi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zbG9hZC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBNb2R1bGUgTmFtZTogbnNsb2FkIC0gbmFtZXNwYWNlIGxvYWRpbmcvZXhwYW5kaW5nL2NvbnRyYWN0aW5nIHByb2NlZHVyZXMKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA4LCBJbnRlbCBDb3JwLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAotICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgYXQgbWluaW11bSBhIGRpc2NsYWltZXIKLSAqICAgIHN1YnN0YW50aWFsbHkgc2ltaWxhciB0byB0aGUgIk5PIFdBUlJBTlRZIiBkaXNjbGFpbWVyIGJlbG93Ci0gKiAgICAoIkRpc2NsYWltZXIiKSBhbmQgYW55IHJlZGlzdHJpYnV0aW9uIG11c3QgYmUgY29uZGl0aW9uZWQgdXBvbgotICogICAgaW5jbHVkaW5nIGEgc3Vic3RhbnRpYWxseSBzaW1pbGFyIERpc2NsYWltZXIgcmVxdWlyZW1lbnQgZm9yIGZ1cnRoZXIKLSAqICAgIGJpbmFyeSByZWRpc3RyaWJ1dGlvbi4KLSAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcwotICogICAgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICogU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBOTyBXQVJSQU5UWQotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCi0gKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUwotICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcKLSAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQotICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgotICovCi0KLSNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KLSNpbmNsdWRlIDxhY3BpL2FjbmFtZXNwLmg+Ci0jaW5jbHVkZSA8YWNwaS9hY2Rpc3BhdC5oPgotI2luY2x1ZGUgPGFjcGkvYWN0YWJsZXMuaD4KLQotI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfTkFNRVNQQUNFCi1BQ1BJX01PRFVMRV9OQU1FKCJuc2xvYWQiKQotCi0vKiBMb2NhbCBwcm90b3R5cGVzICovCi0jaWZkZWYgQUNQSV9GVVRVUkVfSU1QTEVNRU5UQVRJT04KLWFjcGlfc3RhdHVzIGFjcGlfbnNfdW5sb2FkX25hbWVzcGFjZShhY3BpX2hhbmRsZSBoYW5kbGUpOwotCi1zdGF0aWMgYWNwaV9zdGF0dXMgYWNwaV9uc19kZWxldGVfc3VidHJlZShhY3BpX2hhbmRsZSBzdGFydF9oYW5kbGUpOwotI2VuZGlmCi0KLSNpZm5kZWYgQUNQSV9OT19NRVRIT0RfRVhFQ1VUSU9OCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX25zX2xvYWRfdGFibGUKLSAqCi0gKiBQQVJBTUVURVJTOiAgdGFibGVfaW5kZXggICAgIC0gSW5kZXggZm9yIHRhYmxlIHRvIGJlIGxvYWRlZAotICogICAgICAgICAgICAgIE5vZGUgICAgICAgICAgICAtIE93bmluZyBOUyBub2RlCi0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cwotICoKLSAqIERFU0NSSVBUSU9OOiBMb2FkIG9uZSBBQ1BJIHRhYmxlIGludG8gdGhlIG5hbWVzcGFjZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWFjcGlfc3RhdHVzCi1hY3BpX25zX2xvYWRfdGFibGUodTMyIHRhYmxlX2luZGV4LCBzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZSkKLXsKLQlhY3BpX3N0YXR1cyBzdGF0dXM7Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKG5zX2xvYWRfdGFibGUpOwotCi0JLyoKLQkgKiBQYXJzZSB0aGUgdGFibGUgYW5kIGxvYWQgdGhlIG5hbWVzcGFjZSB3aXRoIGFsbCBuYW1lZAotCSAqIG9iamVjdHMgZm91bmQgd2l0aGluLiAgQ29udHJvbCBtZXRob2RzIGFyZSBOT1QgcGFyc2VkCi0JICogYXQgdGhpcyB0aW1lLiAgSW4gZmFjdCwgdGhlIGNvbnRyb2wgbWV0aG9kcyBjYW5ub3QgYmUKLQkgKiBwYXJzZWQgdW50aWwgdGhlIGVudGlyZSBuYW1lc3BhY2UgaXMgbG9hZGVkLCBiZWNhdXNlCi0JICogaWYgYSBjb250cm9sIG1ldGhvZCBtYWtlcyBhIGZvcndhcmQgcmVmZXJlbmNlIChjYWxsKQotCSAqIHRvIGFub3RoZXIgY29udHJvbCBtZXRob2QsIHdlIGNhbid0IGNvbnRpbnVlIHBhcnNpbmcKLQkgKiBiZWNhdXNlIHdlIGRvbid0IGtub3cgaG93IG1hbnkgYXJndW1lbnRzIHRvIHBhcnNlIG5leHQhCi0JICovCi0Jc3RhdHVzID0gYWNwaV91dF9hY3F1aXJlX211dGV4KEFDUElfTVRYX05BTUVTUEFDRSk7Ci0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotCX0KLQotCS8qIElmIHRhYmxlIGFscmVhZHkgbG9hZGVkIGludG8gbmFtZXNwYWNlLCBqdXN0IHJldHVybiAqLwotCi0JaWYgKGFjcGlfdGJfaXNfdGFibGVfbG9hZGVkKHRhYmxlX2luZGV4KSkgewotCQlzdGF0dXMgPSBBRV9BTFJFQURZX0VYSVNUUzsKLQkJZ290byB1bmxvY2s7Ci0JfQotCi0JQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLAotCQkJICAiKioqKiBMb2FkaW5nIHRhYmxlIGludG8gbmFtZXNwYWNlICoqKipcbiIpKTsKLQotCXN0YXR1cyA9IGFjcGlfdGJfYWxsb2NhdGVfb3duZXJfaWQodGFibGVfaW5kZXgpOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlnb3RvIHVubG9jazsKLQl9Ci0KLQlzdGF0dXMgPSBhY3BpX25zX3BhcnNlX3RhYmxlKHRhYmxlX2luZGV4LCBub2RlKTsKLQlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpIHsKLQkJYWNwaV90Yl9zZXRfdGFibGVfbG9hZGVkX2ZsYWcodGFibGVfaW5kZXgsIFRSVUUpOwotCX0gZWxzZSB7Ci0JCSh2b2lkKWFjcGlfdGJfcmVsZWFzZV9vd25lcl9pZCh0YWJsZV9pbmRleCk7Ci0JfQotCi0gICAgICB1bmxvY2s6Ci0JKHZvaWQpYWNwaV91dF9yZWxlYXNlX211dGV4KEFDUElfTVRYX05BTUVTUEFDRSk7Ci0KLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci0JfQotCi0JLyoKLQkgKiBOb3cgd2UgY2FuIHBhcnNlIHRoZSBjb250cm9sIG1ldGhvZHMuICBXZSBhbHdheXMgcGFyc2UKLQkgKiB0aGVtIGhlcmUgZm9yIGEgc2FuaXR5IGNoZWNrLCBhbmQgaWYgY29uZmlndXJlZCBmb3IKLQkgKiBqdXN0LWluLXRpbWUgcGFyc2luZywgd2UgZGVsZXRlIHRoZSBjb250cm9sIG1ldGhvZAotCSAqIHBhcnNlIHRyZWVzLgotCSAqLwotCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywKLQkJCSAgIioqKiogQmVnaW4gVGFibGUgTWV0aG9kIFBhcnNpbmcgYW5kIE9iamVjdCBJbml0aWFsaXphdGlvbiAqKioqXG4iKSk7Ci0KLQlzdGF0dXMgPSBhY3BpX2RzX2luaXRpYWxpemVfb2JqZWN0cyh0YWJsZV9pbmRleCwgbm9kZSk7Ci0KLQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sCi0JCQkgICIqKioqIENvbXBsZXRlZCBUYWJsZSBNZXRob2QgUGFyc2luZyBhbmQgT2JqZWN0IEluaXRpYWxpemF0aW9uICoqKipcbiIpKTsKLQotCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotfQotCi0jaWZkZWYgQUNQSV9PQlNPTEVURV9GVU5DVElPTlMKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfbG9hZF9uYW1lc3BhY2UKLSAqCi0gKiBQQVJBTUVURVJTOiAgTm9uZQotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKLSAqCi0gKiBERVNDUklQVElPTjogTG9hZCB0aGUgbmFtZSBzcGFjZSBmcm9tIHdoYXQgZXZlciBpcyBwb2ludGVkIHRvIGJ5IERTRFQuCi0gKiAgICAgICAgICAgICAgKERTRFQgcG9pbnRzIHRvIGVpdGhlciB0aGUgQklPUyBvciBhIGJ1ZmZlci4pCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotYWNwaV9zdGF0dXMgYWNwaV9uc19sb2FkX25hbWVzcGFjZSh2b2lkKQotewotCWFjcGlfc3RhdHVzIHN0YXR1czsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UoYWNwaV9sb2FkX25hbWVfc3BhY2UpOwotCi0JLyogVGhlcmUgbXVzdCBiZSBhdCBsZWFzdCBhIERTRFQgaW5zdGFsbGVkICovCi0KLQlpZiAoYWNwaV9nYmxfRFNEVCA9PSBOVUxMKSB7Ci0JCUFDUElfRVJST1IoKEFFX0lORk8sICJEU0RUIGlzIG5vdCBpbiBtZW1vcnkiKSk7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT19BQ1BJX1RBQkxFUyk7Ci0JfQotCi0JLyoKLQkgKiBMb2FkIHRoZSBuYW1lc3BhY2UuICBUaGUgRFNEVCBpcyByZXF1aXJlZCwKLQkgKiBidXQgdGhlIFNTRFQgYW5kIFBTRFQgdGFibGVzIGFyZSBvcHRpb25hbC4KLQkgKi8KLQlzdGF0dXMgPSBhY3BpX25zX2xvYWRfdGFibGVfYnlfdHlwZShBQ1BJX1RBQkxFX0lEX0RTRFQpOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLQl9Ci0KLQkvKiBJZ25vcmUgZXhjZXB0aW9ucyBmcm9tIHRoZXNlICovCi0KLQkodm9pZClhY3BpX25zX2xvYWRfdGFibGVfYnlfdHlwZShBQ1BJX1RBQkxFX0lEX1NTRFQpOwotCSh2b2lkKWFjcGlfbnNfbG9hZF90YWJsZV9ieV90eXBlKEFDUElfVEFCTEVfSURfUFNEVCk7Ci0KLQlBQ1BJX0RFQlVHX1BSSU5UX1JBVygoQUNQSV9EQl9JTklULAotCQkJICAgICAgIkFDUEkgTmFtZXNwYWNlIHN1Y2Nlc3NmdWxseSBsb2FkZWQgYXQgcm9vdCAlcFxuIiwKLQkJCSAgICAgIGFjcGlfZ2JsX3Jvb3Rfbm9kZSkpOwotCi0JcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci19Ci0jZW5kaWYKLQotI2lmZGVmIEFDUElfRlVUVVJFX0lNUExFTUVOVEFUSU9OCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX25zX2RlbGV0ZV9zdWJ0cmVlCi0gKgotICogUEFSQU1FVEVSUzogIHN0YXJ0X2hhbmRsZSAgICAgICAgLSBIYW5kbGUgaW4gbmFtZXNwYWNlIHdoZXJlIHNlYXJjaCBiZWdpbnMKLSAqCi0gKiBSRVRVUk5TICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IFdhbGtzIHRoZSBuYW1lc3BhY2Ugc3RhcnRpbmcgYXQgdGhlIGdpdmVuIGhhbmRsZSBhbmQgZGVsZXRlcwotICogICAgICAgICAgICAgIGFsbCBvYmplY3RzLCBlbnRyaWVzLCBhbmQgc2NvcGVzIGluIHRoZSBlbnRpcmUgc3VidHJlZS4KLSAqCi0gKiAgICAgICAgICAgICAgTmFtZXNwYWNlL0ludGVycHJldGVyIHNob3VsZCBiZSBsb2NrZWQgb3IgdGhlIHN1YnN5c3RlbSBzaG91bGQKLSAqICAgICAgICAgICAgICBiZSBpbiBzaHV0ZG93biBiZWZvcmUgdGhpcyByb3V0aW5lIGlzIGNhbGxlZC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgYWNwaV9zdGF0dXMgYWNwaV9uc19kZWxldGVfc3VidHJlZShhY3BpX2hhbmRsZSBzdGFydF9oYW5kbGUpCi17Ci0JYWNwaV9zdGF0dXMgc3RhdHVzOwotCWFjcGlfaGFuZGxlIGNoaWxkX2hhbmRsZTsKLQlhY3BpX2hhbmRsZSBwYXJlbnRfaGFuZGxlOwotCWFjcGlfaGFuZGxlIG5leHRfY2hpbGRfaGFuZGxlOwotCWFjcGlfaGFuZGxlIGR1bW15OwotCXUzMiBsZXZlbDsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UobnNfZGVsZXRlX3N1YnRyZWUpOwotCi0JcGFyZW50X2hhbmRsZSA9IHN0YXJ0X2hhbmRsZTsKLQljaGlsZF9oYW5kbGUgPSBOVUxMOwotCWxldmVsID0gMTsKLQotCS8qCi0JICogVHJhdmVyc2UgdGhlIHRyZWUgb2Ygb2JqZWN0cyB1bnRpbCB3ZSBidWJibGUgYmFjayB1cAotCSAqIHRvIHdoZXJlIHdlIHN0YXJ0ZWQuCi0JICovCi0Jd2hpbGUgKGxldmVsID4gMCkgewotCi0JCS8qIEF0dGVtcHQgdG8gZ2V0IHRoZSBuZXh0IG9iamVjdCBpbiB0aGlzIHNjb3BlICovCi0KLQkJc3RhdHVzID0gYWNwaV9nZXRfbmV4dF9vYmplY3QoQUNQSV9UWVBFX0FOWSwgcGFyZW50X2hhbmRsZSwKLQkJCQkJICAgICAgY2hpbGRfaGFuZGxlLCAmbmV4dF9jaGlsZF9oYW5kbGUpOwotCi0JCWNoaWxkX2hhbmRsZSA9IG5leHRfY2hpbGRfaGFuZGxlOwotCi0JCS8qIERpZCB3ZSBnZXQgYSBuZXcgb2JqZWN0PyAqLwotCi0JCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkgewotCi0JCQkvKiBDaGVjayBpZiB0aGlzIG9iamVjdCBoYXMgYW55IGNoaWxkcmVuICovCi0KLQkJCWlmIChBQ1BJX1NVQ0NFU1MKLQkJCSAgICAoYWNwaV9nZXRfbmV4dF9vYmplY3QKLQkJCSAgICAgKEFDUElfVFlQRV9BTlksIGNoaWxkX2hhbmRsZSwgTlVMTCwgJmR1bW15KSkpIHsKLQkJCQkvKgotCQkJCSAqIFRoZXJlIGlzIGF0IGxlYXN0IG9uZSBjaGlsZCBvZiB0aGlzIG9iamVjdCwKLQkJCQkgKiB2aXNpdCB0aGUgb2JqZWN0Ci0JCQkJICovCi0JCQkJbGV2ZWwrKzsKLQkJCQlwYXJlbnRfaGFuZGxlID0gY2hpbGRfaGFuZGxlOwotCQkJCWNoaWxkX2hhbmRsZSA9IE5VTEw7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQkvKgotCQkJICogTm8gbW9yZSBjaGlsZHJlbiBpbiB0aGlzIG9iamVjdCwgZ28gYmFjayB1cCB0bwotCQkJICogdGhlIG9iamVjdCdzIHBhcmVudAotCQkJICovCi0JCQlsZXZlbC0tOwotCi0JCQkvKiBEZWxldGUgYWxsIGNoaWxkcmVuIG5vdyAqLwotCi0JCQlhY3BpX25zX2RlbGV0ZV9jaGlsZHJlbihjaGlsZF9oYW5kbGUpOwotCi0JCQljaGlsZF9oYW5kbGUgPSBwYXJlbnRfaGFuZGxlOwotCQkJc3RhdHVzID0gYWNwaV9nZXRfcGFyZW50KHBhcmVudF9oYW5kbGUsICZwYXJlbnRfaGFuZGxlKTsKLQkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotCQkJfQotCQl9Ci0JfQotCi0JLyogTm93IGRlbGV0ZSB0aGUgc3RhcnRpbmcgb2JqZWN0LCBhbmQgd2UgYXJlIGRvbmUgKi8KLQotCWFjcGlfbnNfZGVsZXRlX25vZGUoY2hpbGRfaGFuZGxlKTsKLQotCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIEZVTkNUSU9OOiAgICAgICBhY3BpX25zX3VubG9hZF9uYW1lX3NwYWNlCi0gKgotICogIFBBUkFNRVRFUlM6ICAgICBIYW5kbGUgICAgICAgICAgLSBSb290IG9mIG5hbWVzcGFjZSBzdWJ0cmVlIHRvIGJlIGRlbGV0ZWQKLSAqCi0gKiAgUkVUVVJOOiAgICAgICAgIFN0YXR1cwotICoKLSAqICBERVNDUklQVElPTjogICAgU2hyaW5rcyB0aGUgbmFtZXNwYWNlLCB0eXBpY2FsbHkgaW4gcmVzcG9uc2UgdG8gYW4gdW5kb2NraW5nCi0gKiAgICAgICAgICAgICAgICAgIGV2ZW50LiAgRGVsZXRlcyBhbiBlbnRpcmUgc3VidHJlZSBzdGFydGluZyBmcm9tIChhbmQKLSAqICAgICAgICAgICAgICAgICAgaW5jbHVkaW5nKSB0aGUgZ2l2ZW4gaGFuZGxlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWFjcGlfc3RhdHVzIGFjcGlfbnNfdW5sb2FkX25hbWVzcGFjZShhY3BpX2hhbmRsZSBoYW5kbGUpCi17Ci0JYWNwaV9zdGF0dXMgc3RhdHVzOwotCi0JQUNQSV9GVU5DVElPTl9UUkFDRShuc191bmxvYWRfbmFtZV9zcGFjZSk7Ci0KLQkvKiBQYXJhbWV0ZXIgdmFsaWRhdGlvbiAqLwotCi0JaWYgKCFhY3BpX2dibF9yb290X25vZGUpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX05BTUVTUEFDRSk7Ci0JfQotCi0JaWYgKCFoYW5kbGUpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9QQVJBTUVURVIpOwotCX0KLQotCS8qIFRoaXMgZnVuY3Rpb24gZG9lcyB0aGUgcmVhbCB3b3JrICovCi0KLQlzdGF0dXMgPSBhY3BpX25zX2RlbGV0ZV9zdWJ0cmVlKGhhbmRsZSk7Ci0KLQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLX0KLSNlbmRpZgotI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zbmFtZXMuYyBiL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnNuYW1lcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MmEzOWE3Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnNuYW1lcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMjY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogTW9kdWxlIE5hbWU6IG5zbmFtZXMgLSBOYW1lIG1hbmlwdWxhdGlvbiBhbmQgc2VhcmNoCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDgsIEludGVsIENvcnAuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCi0gKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSBhdCBtaW5pbXVtIGEgZGlzY2xhaW1lcgotICogICAgc3Vic3RhbnRpYWxseSBzaW1pbGFyIHRvIHRoZSAiTk8gV0FSUkFOVFkiIGRpc2NsYWltZXIgYmVsb3cKLSAqICAgICgiRGlzY2xhaW1lciIpIGFuZCBhbnkgcmVkaXN0cmlidXRpb24gbXVzdCBiZSBjb25kaXRpb25lZCB1cG9uCi0gKiAgICBpbmNsdWRpbmcgYSBzdWJzdGFudGlhbGx5IHNpbWlsYXIgRGlzY2xhaW1lciByZXF1aXJlbWVudCBmb3IgZnVydGhlcgotICogICAgYmluYXJ5IHJlZGlzdHJpYnV0aW9uLgotICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzCi0gKiAgICBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIE5PIFdBUlJBTlRZCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKLSAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCi0gKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORwotICogSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCi0gKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCi0gKi8KLQotI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgotI2luY2x1ZGUgPGFjcGkvYW1sY29kZS5oPgotI2luY2x1ZGUgPGFjcGkvYWNuYW1lc3AuaD4KLQotI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfTkFNRVNQQUNFCi1BQ1BJX01PRFVMRV9OQU1FKCJuc25hbWVzIikKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9uc19idWlsZF9leHRlcm5hbF9wYXRoCi0gKgotICogUEFSQU1FVEVSUzogIE5vZGUgICAgICAgICAgICAtIE5TIG5vZGUgd2hvc2UgcGF0aG5hbWUgaXMgbmVlZGVkCi0gKiAgICAgICAgICAgICAgU2l6ZSAgICAgICAgICAgIC0gU2l6ZSBvZiB0aGUgcGF0aG5hbWUKLSAqICAgICAgICAgICAgICAqbmFtZV9idWZmZXIgICAgLSBXaGVyZSB0byByZXR1cm4gdGhlIHBhdGhuYW1lCi0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cwotICogICAgICAgICAgICAgIFBsYWNlcyB0aGUgcGF0aG5hbWUgaW50byB0aGUgbmFtZV9idWZmZXIsIGluIGV4dGVybmFsIGZvcm1hdAotICogICAgICAgICAgICAgIChuYW1lIHNlZ21lbnRzIHNlcGFyYXRlZCBieSBwYXRoIHNlcGFyYXRvcnMpCi0gKgotICogREVTQ1JJUFRJT046IEdlbmVyYXRlIGEgZnVsbCBwYXRoYW5hbWUKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYWNwaV9zdGF0dXMKLWFjcGlfbnNfYnVpbGRfZXh0ZXJuYWxfcGF0aChzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZSwKLQkJCSAgICBhY3BpX3NpemUgc2l6ZSwgY2hhciAqbmFtZV9idWZmZXIpCi17Ci0JYWNwaV9zaXplIGluZGV4OwotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpwYXJlbnRfbm9kZTsKLQotCUFDUElfRlVOQ1RJT05fRU5UUlkoKTsKLQotCS8qIFNwZWNpYWwgY2FzZSBmb3Igcm9vdCAqLwotCi0JaW5kZXggPSBzaXplIC0gMTsKLQlpZiAoaW5kZXggPCBBQ1BJX05BTUVfU0laRSkgewotCQluYW1lX2J1ZmZlclswXSA9IEFNTF9ST09UX1BSRUZJWDsKLQkJbmFtZV9idWZmZXJbMV0gPSAwOwotCQlyZXR1cm4gKEFFX09LKTsKLQl9Ci0KLQkvKiBTdG9yZSB0ZXJtaW5hdG9yIGJ5dGUsIHRoZW4gYnVpbGQgbmFtZSBiYWNrd2FyZHMgKi8KLQotCXBhcmVudF9ub2RlID0gbm9kZTsKLQluYW1lX2J1ZmZlcltpbmRleF0gPSAwOwotCi0Jd2hpbGUgKChpbmRleCA+IEFDUElfTkFNRV9TSVpFKSAmJiAocGFyZW50X25vZGUgIT0gYWNwaV9nYmxfcm9vdF9ub2RlKSkgewotCQlpbmRleCAtPSBBQ1BJX05BTUVfU0laRTsKLQotCQkvKiBQdXQgdGhlIG5hbWUgaW50byB0aGUgYnVmZmVyICovCi0KLQkJQUNQSV9NT1ZFXzMyX1RPXzMyKChuYW1lX2J1ZmZlciArIGluZGV4KSwgJnBhcmVudF9ub2RlLT5uYW1lKTsKLQkJcGFyZW50X25vZGUgPSBhY3BpX25zX2dldF9wYXJlbnRfbm9kZShwYXJlbnRfbm9kZSk7Ci0KLQkJLyogUHJlZml4IG5hbWUgd2l0aCB0aGUgcGF0aCBzZXBhcmF0b3IgKi8KLQotCQlpbmRleC0tOwotCQluYW1lX2J1ZmZlcltpbmRleF0gPSBBQ1BJX1BBVEhfU0VQQVJBVE9SOwotCX0KLQotCS8qIE92ZXJ3cml0ZSBmaW5hbCBzZXBhcmF0b3Igd2l0aCB0aGUgcm9vdCBwcmVmaXggY2hhcmFjdGVyICovCi0KLQluYW1lX2J1ZmZlcltpbmRleF0gPSBBTUxfUk9PVF9QUkVGSVg7Ci0KLQlpZiAoaW5kZXggIT0gMCkgewotCQlBQ1BJX0VSUk9SKChBRV9JTkZPLAotCQkJICAgICJDb3VsZCBub3QgY29uc3RydWN0IGV4dGVybmFsIHBhdGhuYW1lOyBpbmRleD0lWCwgc2l6ZT0lWCwgUGF0aD0lcyIsCi0JCQkgICAgKHUzMikgaW5kZXgsICh1MzIpIHNpemUsICZuYW1lX2J1ZmZlcltzaXplXSkpOwotCi0JCXJldHVybiAoQUVfQkFEX1BBUkFNRVRFUik7Ci0JfQotCi0JcmV0dXJuIChBRV9PSyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfbnNfZ2V0X2V4dGVybmFsX3BhdGhuYW1lCi0gKgotICogUEFSQU1FVEVSUzogIE5vZGUgICAgICAgICAgICAtIE5hbWVzcGFjZSBub2RlIHdob3NlIHBhdGhuYW1lIGlzIG5lZWRlZAotICoKLSAqIFJFVFVSTjogICAgICBQb2ludGVyIHRvIHN0b3JhZ2UgY29udGFpbmluZyB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YKLSAqICAgICAgICAgICAgICB0aGUgbm9kZSwgSW4gZXh0ZXJuYWwgZm9ybWF0IChuYW1lIHNlZ21lbnRzIHNlcGFyYXRlZCBieSBwYXRoCi0gKiAgICAgICAgICAgICAgc2VwYXJhdG9ycy4pCi0gKgotICogREVTQ1JJUFRJT046IFVzZWQgZm9yIGRlYnVnIHByaW50aW5nIGluIGFjcGlfbnNfc2VhcmNoX3RhYmxlKCkuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotY2hhciAqYWNwaV9uc19nZXRfZXh0ZXJuYWxfcGF0aG5hbWUoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGUpCi17Ci0JYWNwaV9zdGF0dXMgc3RhdHVzOwotCWNoYXIgKm5hbWVfYnVmZmVyOwotCWFjcGlfc2l6ZSBzaXplOwotCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIobnNfZ2V0X2V4dGVybmFsX3BhdGhuYW1lLCBub2RlKTsKLQotCS8qIENhbGN1bGF0ZSByZXF1aXJlZCBidWZmZXIgc2l6ZSBiYXNlZCBvbiBkZXB0aCBiZWxvdyByb290ICovCi0KLQlzaXplID0gYWNwaV9uc19nZXRfcGF0aG5hbWVfbGVuZ3RoKG5vZGUpOwotCWlmICghc2l6ZSkgewotCQlyZXR1cm5fUFRSKE5VTEwpOwotCX0KLQotCS8qIEFsbG9jYXRlIGEgYnVmZmVyIHRvIGJlIHJldHVybmVkIHRvIGNhbGxlciAqLwotCi0JbmFtZV9idWZmZXIgPSBBQ1BJX0FMTE9DQVRFX1pFUk9FRChzaXplKTsKLQlpZiAoIW5hbWVfYnVmZmVyKSB7Ci0JCUFDUElfRVJST1IoKEFFX0lORk8sICJBbGxvY2F0aW9uIGZhaWx1cmUiKSk7Ci0JCXJldHVybl9QVFIoTlVMTCk7Ci0JfQotCi0JLyogQnVpbGQgdGhlIHBhdGggaW4gdGhlIGFsbG9jYXRlZCBidWZmZXIgKi8KLQotCXN0YXR1cyA9IGFjcGlfbnNfYnVpbGRfZXh0ZXJuYWxfcGF0aChub2RlLCBzaXplLCBuYW1lX2J1ZmZlcik7Ci0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCUFDUElfRlJFRShuYW1lX2J1ZmZlcik7Ci0JCXJldHVybl9QVFIoTlVMTCk7Ci0JfQotCi0JcmV0dXJuX1BUUihuYW1lX2J1ZmZlcik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfbnNfZ2V0X3BhdGhuYW1lX2xlbmd0aAotICoKLSAqIFBBUkFNRVRFUlM6ICBOb2RlICAgICAgICAtIE5hbWVzcGFjZSBub2RlCi0gKgotICogUkVUVVJOOiAgICAgIExlbmd0aCBvZiBwYXRoLCBpbmNsdWRpbmcgcHJlZml4Ci0gKgotICogREVTQ1JJUFRJT046IEdldCB0aGUgbGVuZ3RoIG9mIHRoZSBwYXRobmFtZSBzdHJpbmcgZm9yIHRoaXMgbm9kZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWFjcGlfc2l6ZSBhY3BpX25zX2dldF9wYXRobmFtZV9sZW5ndGgoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGUpCi17Ci0JYWNwaV9zaXplIHNpemU7Ci0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5leHRfbm9kZTsKLQotCUFDUElfRlVOQ1RJT05fRU5UUlkoKTsKLQotCS8qCi0JICogQ29tcHV0ZSBsZW5ndGggb2YgcGF0aG5hbWUgYXMgNSAqIG51bWJlciBvZiBuYW1lIHNlZ21lbnRzLgotCSAqIEdvIGJhY2sgdXAgdGhlIHBhcmVudCB0cmVlIHRvIHRoZSByb290Ci0JICovCi0Jc2l6ZSA9IDA7Ci0JbmV4dF9ub2RlID0gbm9kZTsKLQotCXdoaWxlIChuZXh0X25vZGUgJiYgKG5leHRfbm9kZSAhPSBhY3BpX2dibF9yb290X25vZGUpKSB7Ci0JCWlmIChBQ1BJX0dFVF9ERVNDUklQVE9SX1RZUEUobmV4dF9ub2RlKSAhPSBBQ1BJX0RFU0NfVFlQRV9OQU1FRCkgewotCQkJQUNQSV9FUlJPUigoQUVfSU5GTywKLQkJCQkgICAgIkludmFsaWQgTmFtZXNwYWNlIE5vZGUgKCVwKSB3aGlsZSB0cmF2ZXJzaW5nIG5hbWVzcGFjZSIsCi0JCQkJICAgIG5leHRfbm9kZSkpOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJc2l6ZSArPSBBQ1BJX1BBVEhfU0VHTUVOVF9MRU5HVEg7Ci0JCW5leHRfbm9kZSA9IGFjcGlfbnNfZ2V0X3BhcmVudF9ub2RlKG5leHRfbm9kZSk7Ci0JfQotCi0JaWYgKCFzaXplKSB7Ci0JCXNpemUgPSAxOwkvKiBSb290IG5vZGUgY2FzZSAqLwotCX0KLQotCXJldHVybiAoc2l6ZSArIDEpOwkvKiArMSBmb3IgbnVsbCBzdHJpbmcgdGVybWluYXRvciAqLwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX25zX2hhbmRsZV90b19wYXRobmFtZQotICoKLSAqIFBBUkFNRVRFUlM6ICB0YXJnZXRfaGFuZGxlICAgICAgICAgICAtIEhhbmRsZSBvZiBuYW1lZCBvYmplY3Qgd2hvc2UgbmFtZSBpcwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYmUgZm91bmQKLSAqICAgICAgICAgICAgICBCdWZmZXIgICAgICAgICAgICAgICAgICAtIFdoZXJlIHRoZSBwYXRobmFtZSBpcyByZXR1cm5lZAotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMsIEJ1ZmZlciBpcyBmaWxsZWQgd2l0aCBwYXRobmFtZSBpZiBzdGF0dXMgaXMgQUVfT0sKLSAqCi0gKiBERVNDUklQVElPTjogQnVpbGQgYW5kIHJldHVybiBhIGZ1bGwgbmFtZXNwYWNlIHBhdGhuYW1lCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotYWNwaV9zdGF0dXMKLWFjcGlfbnNfaGFuZGxlX3RvX3BhdGhuYW1lKGFjcGlfaGFuZGxlIHRhcmdldF9oYW5kbGUsCi0JCQkgICBzdHJ1Y3QgYWNwaV9idWZmZXIgKiBidWZmZXIpCi17Ci0JYWNwaV9zdGF0dXMgc3RhdHVzOwotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlOwotCWFjcGlfc2l6ZSByZXF1aXJlZF9zaXplOwotCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIobnNfaGFuZGxlX3RvX3BhdGhuYW1lLCB0YXJnZXRfaGFuZGxlKTsKLQotCW5vZGUgPSBhY3BpX25zX21hcF9oYW5kbGVfdG9fbm9kZSh0YXJnZXRfaGFuZGxlKTsKLQlpZiAoIW5vZGUpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9QQVJBTUVURVIpOwotCX0KLQotCS8qIERldGVybWluZSBzaXplIHJlcXVpcmVkIGZvciB0aGUgY2FsbGVyIGJ1ZmZlciAqLwotCi0JcmVxdWlyZWRfc2l6ZSA9IGFjcGlfbnNfZ2V0X3BhdGhuYW1lX2xlbmd0aChub2RlKTsKLQlpZiAoIXJlcXVpcmVkX3NpemUpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9QQVJBTUVURVIpOwotCX0KLQotCS8qIFZhbGlkYXRlL0FsbG9jYXRlL0NsZWFyIGNhbGxlciBidWZmZXIgKi8KLQotCXN0YXR1cyA9IGFjcGlfdXRfaW5pdGlhbGl6ZV9idWZmZXIoYnVmZmVyLCByZXF1aXJlZF9zaXplKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci0JfQotCi0JLyogQnVpbGQgdGhlIHBhdGggaW4gdGhlIGNhbGxlciBidWZmZXIgKi8KLQotCXN0YXR1cyA9Ci0JICAgIGFjcGlfbnNfYnVpbGRfZXh0ZXJuYWxfcGF0aChub2RlLCByZXF1aXJlZF9zaXplLCBidWZmZXItPnBvaW50ZXIpOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLQl9Ci0KLQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VYRUMsICIlcyBbJVhdXG4iLAotCQkJICAoY2hhciAqKWJ1ZmZlci0+cG9pbnRlciwgKHUzMikgcmVxdWlyZWRfc2l6ZSkpOwotCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zb2JqZWN0LmMgYi9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zb2JqZWN0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1ZmUwOWUuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc29iamVjdC5jCisrKyAvZGV2L251bGwKQEAgLTEsNDQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogTW9kdWxlIE5hbWU6IG5zb2JqZWN0IC0gVXRpbGl0aWVzIGZvciBvYmplY3RzIGF0dGFjaGVkIHRvIG5hbWVzcGFjZQotICogICAgICAgICAgICAgICAgICAgICAgICAgdGFibGUgZW50cmllcwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA4LCBJbnRlbCBDb3JwLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAotICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgYXQgbWluaW11bSBhIGRpc2NsYWltZXIKLSAqICAgIHN1YnN0YW50aWFsbHkgc2ltaWxhciB0byB0aGUgIk5PIFdBUlJBTlRZIiBkaXNjbGFpbWVyIGJlbG93Ci0gKiAgICAoIkRpc2NsYWltZXIiKSBhbmQgYW55IHJlZGlzdHJpYnV0aW9uIG11c3QgYmUgY29uZGl0aW9uZWQgdXBvbgotICogICAgaW5jbHVkaW5nIGEgc3Vic3RhbnRpYWxseSBzaW1pbGFyIERpc2NsYWltZXIgcmVxdWlyZW1lbnQgZm9yIGZ1cnRoZXIKLSAqICAgIGJpbmFyeSByZWRpc3RyaWJ1dGlvbi4KLSAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcwotICogICAgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICogU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBOTyBXQVJSQU5UWQotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCi0gKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUwotICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcKLSAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQotICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgotICovCi0KLSNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KLSNpbmNsdWRlIDxhY3BpL2FjbmFtZXNwLmg+Ci0KLSNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX05BTUVTUEFDRQotQUNQSV9NT0RVTEVfTkFNRSgibnNvYmplY3QiKQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX25zX2F0dGFjaF9vYmplY3QKLSAqCi0gKiBQQVJBTUVURVJTOiAgTm9kZSAgICAgICAgICAgICAgICAtIFBhcmVudCBOb2RlCi0gKiAgICAgICAgICAgICAgT2JqZWN0ICAgICAgICAgICAgICAtIE9iamVjdCB0byBiZSBhdHRhY2hlZAotICogICAgICAgICAgICAgIFR5cGUgICAgICAgICAgICAgICAgLSBUeXBlIG9mIG9iamVjdCwgb3IgQUNQSV9UWVBFX0FOWSBpZiBub3QKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga25vd24KLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IFJlY29yZCB0aGUgZ2l2ZW4gb2JqZWN0IGFzIHRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlCi0gKiAgICAgICAgICAgICAgbmFtZSB3aG9zZSBhY3BpX2hhbmRsZSBpcyBwYXNzZWQuICBJZiBPYmplY3QgaXMgTlVMTAotICogICAgICAgICAgICAgIGFuZCBUeXBlIGlzIEFDUElfVFlQRV9BTlksIHNldCB0aGUgbmFtZSBhcyBoYXZpbmcgbm8gdmFsdWUuCi0gKiAgICAgICAgICAgICAgTm90ZTogRnV0dXJlIG1heSByZXF1aXJlIHRoYXQgdGhlIE5vZGUtPkZsYWdzIGZpZWxkIGJlIHBhc3NlZAotICogICAgICAgICAgICAgIGFzIGEgcGFyYW1ldGVyLgotICoKLSAqIE1VVEVYOiAgICAgICBBc3N1bWVzIG5hbWVzcGFjZSBpcyBsb2NrZWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYWNwaV9zdGF0dXMKLWFjcGlfbnNfYXR0YWNoX29iamVjdChzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZSwKLQkJICAgICAgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqZWN0LCBhY3BpX29iamVjdF90eXBlIHR5cGUpCi17Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2M7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqbGFzdF9vYmpfZGVzYzsKLQlhY3BpX29iamVjdF90eXBlIG9iamVjdF90eXBlID0gQUNQSV9UWVBFX0FOWTsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UobnNfYXR0YWNoX29iamVjdCk7Ci0KLQkvKgotCSAqIFBhcmFtZXRlciB2YWxpZGF0aW9uCi0JICovCi0JaWYgKCFub2RlKSB7Ci0KLQkJLyogSW52YWxpZCBoYW5kbGUgKi8KLQotCQlBQ1BJX0VSUk9SKChBRV9JTkZPLCAiTnVsbCBOYW1lZE9iaiBoYW5kbGUiKSk7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfUEFSQU1FVEVSKTsKLQl9Ci0KLQlpZiAoIW9iamVjdCAmJiAoQUNQSV9UWVBFX0FOWSAhPSB0eXBlKSkgewotCi0JCS8qIE51bGwgb2JqZWN0ICovCi0KLQkJQUNQSV9FUlJPUigoQUVfSU5GTywKLQkJCSAgICAiTnVsbCBvYmplY3QsIGJ1dCB0eXBlIG5vdCBBQ1BJX1RZUEVfQU5ZIikpOwotCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX1BBUkFNRVRFUik7Ci0JfQotCi0JaWYgKEFDUElfR0VUX0RFU0NSSVBUT1JfVFlQRShub2RlKSAhPSBBQ1BJX0RFU0NfVFlQRV9OQU1FRCkgewotCi0JCS8qIE5vdCBhIG5hbWUgaGFuZGxlICovCi0KLQkJQUNQSV9FUlJPUigoQUVfSU5GTywgIkludmFsaWQgaGFuZGxlICVwIFslc10iLAotCQkJICAgIG5vZGUsIGFjcGlfdXRfZ2V0X2Rlc2NyaXB0b3JfbmFtZShub2RlKSkpOwotCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX1BBUkFNRVRFUik7Ci0JfQotCi0JLyogQ2hlY2sgaWYgdGhpcyBvYmplY3QgaXMgYWxyZWFkeSBhdHRhY2hlZCAqLwotCi0JaWYgKG5vZGUtPm9iamVjdCA9PSBvYmplY3QpIHsKLQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FWEVDLAotCQkJCSAgIk9iaiAlcCBhbHJlYWR5IGluc3RhbGxlZCBpbiBOYW1lT2JqICVwXG4iLAotCQkJCSAgb2JqZWN0LCBub2RlKSk7Ci0KLQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKLQl9Ci0KLQkvKiBJZiBudWxsIG9iamVjdCwgd2Ugd2lsbCBqdXN0IGluc3RhbGwgaXQgKi8KLQotCWlmICghb2JqZWN0KSB7Ci0JCW9ial9kZXNjID0gTlVMTDsKLQkJb2JqZWN0X3R5cGUgPSBBQ1BJX1RZUEVfQU5ZOwotCX0KLQotCS8qCi0JICogSWYgdGhlIHNvdXJjZSBvYmplY3QgaXMgYSBuYW1lc3BhY2UgTm9kZSB3aXRoIGFuIGF0dGFjaGVkIG9iamVjdCwKLQkgKiB3ZSB3aWxsIHVzZSB0aGF0IChhdHRhY2hlZCkgb2JqZWN0Ci0JICovCi0JZWxzZSBpZiAoKEFDUElfR0VUX0RFU0NSSVBUT1JfVFlQRShvYmplY3QpID09IEFDUElfREVTQ19UWVBFX05BTUVEKSAmJgotCQkgKChzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqKW9iamVjdCktPm9iamVjdCkgewotCQkvKgotCQkgKiBWYWx1ZSBwYXNzZWQgaXMgYSBuYW1lIGhhbmRsZSBhbmQgdGhhdCBuYW1lIGhhcyBhCi0JCSAqIG5vbi1udWxsIHZhbHVlLiAgVXNlIHRoYXQgbmFtZSdzIHZhbHVlIGFuZCB0eXBlLgotCQkgKi8KLQkJb2JqX2Rlc2MgPSAoKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICopb2JqZWN0KS0+b2JqZWN0OwotCQlvYmplY3RfdHlwZSA9ICgoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKilvYmplY3QpLT50eXBlOwotCX0KLQotCS8qCi0JICogT3RoZXJ3aXNlLCB3ZSB3aWxsIHVzZSB0aGUgcGFyYW1ldGVyIG9iamVjdCwgYnV0IHdlIG11c3QgdHlwZQotCSAqIGl0IGZpcnN0Ci0JICovCi0JZWxzZSB7Ci0JCW9ial9kZXNjID0gKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKilvYmplY3Q7Ci0KLQkJLyogVXNlIHRoZSBnaXZlbiB0eXBlICovCi0KLQkJb2JqZWN0X3R5cGUgPSB0eXBlOwotCX0KLQotCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVhFQywgIkluc3RhbGxpbmcgJXAgaW50byBOb2RlICVwIFslNC40c11cbiIsCi0JCQkgIG9ial9kZXNjLCBub2RlLCBhY3BpX3V0X2dldF9ub2RlX25hbWUobm9kZSkpKTsKLQotCS8qIERldGFjaCBhbiBleGlzdGluZyBhdHRhY2hlZCBvYmplY3QgaWYgcHJlc2VudCAqLwotCi0JaWYgKG5vZGUtPm9iamVjdCkgewotCQlhY3BpX25zX2RldGFjaF9vYmplY3Qobm9kZSk7Ci0JfQotCi0JaWYgKG9ial9kZXNjKSB7Ci0JCS8qCi0JCSAqIE11c3QgaW5jcmVtZW50IHRoZSBuZXcgdmFsdWUncyByZWZlcmVuY2UgY291bnQKLQkJICogKGlmIGl0IGlzIGFuIGludGVybmFsIG9iamVjdCkKLQkJICovCi0JCWFjcGlfdXRfYWRkX3JlZmVyZW5jZShvYmpfZGVzYyk7Ci0KLQkJLyoKLQkJICogSGFuZGxlIG9iamVjdHMgd2l0aCBtdWx0aXBsZSBkZXNjcmlwdG9ycyAtIHdhbGsKLQkJICogdG8gdGhlIGVuZCBvZiB0aGUgZGVzY3JpcHRvciBsaXN0Ci0JCSAqLwotCQlsYXN0X29ial9kZXNjID0gb2JqX2Rlc2M7Ci0JCXdoaWxlIChsYXN0X29ial9kZXNjLT5jb21tb24ubmV4dF9vYmplY3QpIHsKLQkJCWxhc3Rfb2JqX2Rlc2MgPSBsYXN0X29ial9kZXNjLT5jb21tb24ubmV4dF9vYmplY3Q7Ci0JCX0KLQotCQkvKiBJbnN0YWxsIHRoZSBvYmplY3QgYXQgdGhlIGZyb250IG9mIHRoZSBvYmplY3QgbGlzdCAqLwotCi0JCWxhc3Rfb2JqX2Rlc2MtPmNvbW1vbi5uZXh0X29iamVjdCA9IG5vZGUtPm9iamVjdDsKLQl9Ci0KLQlub2RlLT50eXBlID0gKHU4KSBvYmplY3RfdHlwZTsKLQlub2RlLT5vYmplY3QgPSBvYmpfZGVzYzsKLQotCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfbnNfZGV0YWNoX29iamVjdAotICoKLSAqIFBBUkFNRVRFUlM6ICBOb2RlICAgICAgICAgICAtIEEgTmFtZXNwYWNlIG5vZGUgd2hvc2Ugb2JqZWN0IHdpbGwgYmUgZGV0YWNoZWQKLSAqCi0gKiBSRVRVUk46ICAgICAgTm9uZS4KLSAqCi0gKiBERVNDUklQVElPTjogRGV0YWNoL2RlbGV0ZSBhbiBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIGEgbmFtZXNwYWNlIG5vZGUuCi0gKiAgICAgICAgICAgICAgaWYgdGhlIG9iamVjdCBpcyBhbiBhbGxvY2F0ZWQgb2JqZWN0LCBpdCBpcyBmcmVlZC4KLSAqICAgICAgICAgICAgICBPdGhlcndpc2UsIHRoZSBmaWVsZCBpcyBzaW1wbHkgY2xlYXJlZC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi12b2lkIGFjcGlfbnNfZGV0YWNoX29iamVjdChzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZSkKLXsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYzsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UobnNfZGV0YWNoX29iamVjdCk7Ci0KLQlvYmpfZGVzYyA9IG5vZGUtPm9iamVjdDsKLQotCWlmICghb2JqX2Rlc2MgfHwKLQkgICAgKEFDUElfR0VUX09CSkVDVF9UWVBFKG9ial9kZXNjKSA9PSBBQ1BJX1RZUEVfTE9DQUxfREFUQSkpIHsKLQkJcmV0dXJuX1ZPSUQ7Ci0JfQotCi0JLyogQ2xlYXIgdGhlIGVudHJ5IGluIGFsbCBjYXNlcyAqLwotCi0Jbm9kZS0+b2JqZWN0ID0gTlVMTDsKLQlpZiAoQUNQSV9HRVRfREVTQ1JJUFRPUl9UWVBFKG9ial9kZXNjKSA9PSBBQ1BJX0RFU0NfVFlQRV9PUEVSQU5EKSB7Ci0JCW5vZGUtPm9iamVjdCA9IG9ial9kZXNjLT5jb21tb24ubmV4dF9vYmplY3Q7Ci0JCWlmIChub2RlLT5vYmplY3QgJiYKLQkJICAgIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRShub2RlLT5vYmplY3QpICE9Ci0JCSAgICAgQUNQSV9UWVBFX0xPQ0FMX0RBVEEpKSB7Ci0JCQlub2RlLT5vYmplY3QgPSBub2RlLT5vYmplY3QtPmNvbW1vbi5uZXh0X29iamVjdDsKLQkJfQotCX0KLQotCS8qIFJlc2V0IHRoZSBub2RlIHR5cGUgdG8gdW50eXBlZCAqLwotCi0Jbm9kZS0+dHlwZSA9IEFDUElfVFlQRV9BTlk7Ci0KLQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX05BTUVTLCAiTm9kZSAlcCBbJTQuNHNdIE9iamVjdCAlcFxuIiwKLQkJCSAgbm9kZSwgYWNwaV91dF9nZXRfbm9kZV9uYW1lKG5vZGUpLCBvYmpfZGVzYykpOwotCi0JLyogUmVtb3ZlIG9uZSByZWZlcmVuY2Ugb24gdGhlIG9iamVjdCAoYW5kIGFsbCBzdWJvYmplY3RzKSAqLwotCi0JYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKG9ial9kZXNjKTsKLQlyZXR1cm5fVk9JRDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0Ci0gKgotICogUEFSQU1FVEVSUzogIE5vZGUgICAgICAgICAgICAgLSBOYW1lc3BhY2Ugbm9kZQotICoKLSAqIFJFVFVSTjogICAgICBDdXJyZW50IHZhbHVlIG9mIHRoZSBvYmplY3QgZmllbGQgZnJvbSB0aGUgTm9kZSB3aG9zZQotICogICAgICAgICAgICAgIGhhbmRsZSBpcyBwYXNzZWQKLSAqCi0gKiBERVNDUklQVElPTjogT2J0YWluIHRoZSBvYmplY3QgYXR0YWNoZWQgdG8gYSBuYW1lc3BhY2Ugbm9kZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi11bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICphY3BpX25zX2dldF9hdHRhY2hlZF9vYmplY3Qoc3RydWN0Ci0JCQkJCQkgICAgICAgYWNwaV9uYW1lc3BhY2Vfbm9kZQotCQkJCQkJICAgICAgICpub2RlKQotewotCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKG5zX2dldF9hdHRhY2hlZF9vYmplY3QsIG5vZGUpOwotCi0JaWYgKCFub2RlKSB7Ci0JCUFDUElfV0FSTklORygoQUVfSU5GTywgIk51bGwgTm9kZSBwdHIiKSk7Ci0JCXJldHVybl9QVFIoTlVMTCk7Ci0JfQotCi0JaWYgKCFub2RlLT5vYmplY3QgfHwKLQkgICAgKChBQ1BJX0dFVF9ERVNDUklQVE9SX1RZUEUobm9kZS0+b2JqZWN0KSAhPSBBQ1BJX0RFU0NfVFlQRV9PUEVSQU5EKQotCSAgICAgJiYgKEFDUElfR0VUX0RFU0NSSVBUT1JfVFlQRShub2RlLT5vYmplY3QpICE9Ci0JCSBBQ1BJX0RFU0NfVFlQRV9OQU1FRCkpCi0JICAgIHx8IChBQ1BJX0dFVF9PQkpFQ1RfVFlQRShub2RlLT5vYmplY3QpID09IEFDUElfVFlQRV9MT0NBTF9EQVRBKSkgewotCQlyZXR1cm5fUFRSKE5VTEwpOwotCX0KLQotCXJldHVybl9QVFIobm9kZS0+b2JqZWN0KTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9uc19nZXRfc2Vjb25kYXJ5X29iamVjdAotICoKLSAqIFBBUkFNRVRFUlM6ICBOb2RlICAgICAgICAgICAgIC0gTmFtZXNwYWNlIG5vZGUKLSAqCi0gKiBSRVRVUk46ICAgICAgQ3VycmVudCB2YWx1ZSBvZiB0aGUgb2JqZWN0IGZpZWxkIGZyb20gdGhlIE5vZGUgd2hvc2UKLSAqICAgICAgICAgICAgICBoYW5kbGUgaXMgcGFzc2VkLgotICoKLSAqIERFU0NSSVBUSU9OOiBPYnRhaW4gYSBzZWNvbmRhcnkgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCBhIG5hbWVzcGFjZSBub2RlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKmFjcGlfbnNfZ2V0X3NlY29uZGFyeV9vYmplY3QodW5pb24KLQkJCQkJCQlhY3BpX29wZXJhbmRfb2JqZWN0Ci0JCQkJCQkJKm9ial9kZXNjKQotewotCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKG5zX2dldF9zZWNvbmRhcnlfb2JqZWN0LCBvYmpfZGVzYyk7Ci0KLQlpZiAoKCFvYmpfZGVzYykgfHwKLQkgICAgKEFDUElfR0VUX09CSkVDVF9UWVBFKG9ial9kZXNjKSA9PSBBQ1BJX1RZUEVfTE9DQUxfREFUQSkgfHwKLQkgICAgKCFvYmpfZGVzYy0+Y29tbW9uLm5leHRfb2JqZWN0KSB8fAotCSAgICAoQUNQSV9HRVRfT0JKRUNUX1RZUEUob2JqX2Rlc2MtPmNvbW1vbi5uZXh0X29iamVjdCkgPT0KLQkgICAgIEFDUElfVFlQRV9MT0NBTF9EQVRBKSkgewotCQlyZXR1cm5fUFRSKE5VTEwpOwotCX0KLQotCXJldHVybl9QVFIob2JqX2Rlc2MtPmNvbW1vbi5uZXh0X29iamVjdCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfbnNfYXR0YWNoX2RhdGEKLSAqCi0gKiBQQVJBTUVURVJTOiAgTm9kZSAgICAgICAgICAgIC0gTmFtZXNwYWNlIG5vZGUKLSAqICAgICAgICAgICAgICBIYW5kbGVyICAgICAgICAgLSBIYW5kbGVyIHRvIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZGF0YQotICogICAgICAgICAgICAgIERhdGEgICAgICAgICAgICAtIERhdGEgdG8gYmUgYXR0YWNoZWQKLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IExvdy1sZXZlbCBhdHRhY2ggZGF0YS4gIENyZWF0ZSBhbmQgYXR0YWNoIGEgRGF0YSBvYmplY3QuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotYWNwaV9zdGF0dXMKLWFjcGlfbnNfYXR0YWNoX2RhdGEoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGUsCi0JCSAgICBhY3BpX29iamVjdF9oYW5kbGVyIGhhbmRsZXIsIHZvaWQgKmRhdGEpCi17Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqcHJldl9vYmpfZGVzYzsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYzsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpkYXRhX2Rlc2M7Ci0KLQkvKiBXZSBvbmx5IGFsbG93IG9uZSBhdHRhY2htZW50IHBlciBoYW5kbGVyICovCi0KLQlwcmV2X29ial9kZXNjID0gTlVMTDsKLQlvYmpfZGVzYyA9IG5vZGUtPm9iamVjdDsKLQl3aGlsZSAob2JqX2Rlc2MpIHsKLQkJaWYgKChBQ1BJX0dFVF9PQkpFQ1RfVFlQRShvYmpfZGVzYykgPT0gQUNQSV9UWVBFX0xPQ0FMX0RBVEEpICYmCi0JCSAgICAob2JqX2Rlc2MtPmRhdGEuaGFuZGxlciA9PSBoYW5kbGVyKSkgewotCQkJcmV0dXJuIChBRV9BTFJFQURZX0VYSVNUUyk7Ci0JCX0KLQotCQlwcmV2X29ial9kZXNjID0gb2JqX2Rlc2M7Ci0JCW9ial9kZXNjID0gb2JqX2Rlc2MtPmNvbW1vbi5uZXh0X29iamVjdDsKLQl9Ci0KLQkvKiBDcmVhdGUgYW4gaW50ZXJuYWwgb2JqZWN0IGZvciB0aGUgZGF0YSAqLwotCi0JZGF0YV9kZXNjID0gYWNwaV91dF9jcmVhdGVfaW50ZXJuYWxfb2JqZWN0KEFDUElfVFlQRV9MT0NBTF9EQVRBKTsKLQlpZiAoIWRhdGFfZGVzYykgewotCQlyZXR1cm4gKEFFX05PX01FTU9SWSk7Ci0JfQotCi0JZGF0YV9kZXNjLT5kYXRhLmhhbmRsZXIgPSBoYW5kbGVyOwotCWRhdGFfZGVzYy0+ZGF0YS5wb2ludGVyID0gZGF0YTsKLQotCS8qIEluc3RhbGwgdGhlIGRhdGEgb2JqZWN0ICovCi0KLQlpZiAocHJldl9vYmpfZGVzYykgewotCQlwcmV2X29ial9kZXNjLT5jb21tb24ubmV4dF9vYmplY3QgPSBkYXRhX2Rlc2M7Ci0JfSBlbHNlIHsKLQkJbm9kZS0+b2JqZWN0ID0gZGF0YV9kZXNjOwotCX0KLQotCXJldHVybiAoQUVfT0spOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX25zX2RldGFjaF9kYXRhCi0gKgotICogUEFSQU1FVEVSUzogIE5vZGUgICAgICAgICAgICAtIE5hbWVzcGFjZSBub2RlCi0gKiAgICAgICAgICAgICAgSGFuZGxlciAgICAgICAgIC0gSGFuZGxlciBhc3NvY2lhdGVkIHdpdGggdGhlIGRhdGEKLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IExvdy1sZXZlbCBkZXRhY2ggZGF0YS4gIERlbGV0ZSB0aGUgZGF0YSBub2RlLCBidXQgdGhlIGNhbGxlcgotICogICAgICAgICAgICAgIGlzIHJlc3BvbnNpYmxlIGZvciB0aGUgYWN0dWFsIGRhdGEuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotYWNwaV9zdGF0dXMKLWFjcGlfbnNfZGV0YWNoX2RhdGEoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKiBub2RlLAotCQkgICAgYWNwaV9vYmplY3RfaGFuZGxlciBoYW5kbGVyKQotewotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjOwotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnByZXZfb2JqX2Rlc2M7Ci0KLQlwcmV2X29ial9kZXNjID0gTlVMTDsKLQlvYmpfZGVzYyA9IG5vZGUtPm9iamVjdDsKLQl3aGlsZSAob2JqX2Rlc2MpIHsKLQkJaWYgKChBQ1BJX0dFVF9PQkpFQ1RfVFlQRShvYmpfZGVzYykgPT0gQUNQSV9UWVBFX0xPQ0FMX0RBVEEpICYmCi0JCSAgICAob2JqX2Rlc2MtPmRhdGEuaGFuZGxlciA9PSBoYW5kbGVyKSkgewotCQkJaWYgKHByZXZfb2JqX2Rlc2MpIHsKLQkJCQlwcmV2X29ial9kZXNjLT5jb21tb24ubmV4dF9vYmplY3QgPQotCQkJCSAgICBvYmpfZGVzYy0+Y29tbW9uLm5leHRfb2JqZWN0OwotCQkJfSBlbHNlIHsKLQkJCQlub2RlLT5vYmplY3QgPSBvYmpfZGVzYy0+Y29tbW9uLm5leHRfb2JqZWN0OwotCQkJfQotCi0JCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2Uob2JqX2Rlc2MpOwotCQkJcmV0dXJuIChBRV9PSyk7Ci0JCX0KLQotCQlwcmV2X29ial9kZXNjID0gb2JqX2Rlc2M7Ci0JCW9ial9kZXNjID0gb2JqX2Rlc2MtPmNvbW1vbi5uZXh0X29iamVjdDsKLQl9Ci0KLQlyZXR1cm4gKEFFX05PVF9GT1VORCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfbnNfZ2V0X2F0dGFjaGVkX2RhdGEKLSAqCi0gKiBQQVJBTUVURVJTOiAgTm9kZSAgICAgICAgICAgIC0gTmFtZXNwYWNlIG5vZGUKLSAqICAgICAgICAgICAgICBIYW5kbGVyICAgICAgICAgLSBIYW5kbGVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgZGF0YQotICogICAgICAgICAgICAgIERhdGEgICAgICAgICAgICAtIFdoZXJlIHRoZSBkYXRhIGlzIHJldHVybmVkCi0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cwotICoKLSAqIERFU0NSSVBUSU9OOiBMb3cgbGV2ZWwgaW50ZXJmYWNlIHRvIG9idGFpbiBkYXRhIHByZXZpb3VzbHkgYXNzb2NpYXRlZCB3aXRoCi0gKiAgICAgICAgICAgICAgYSBuYW1lc3BhY2Ugbm9kZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1hY3BpX3N0YXR1cwotYWNwaV9uc19nZXRfYXR0YWNoZWRfZGF0YShzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqIG5vZGUsCi0JCQkgIGFjcGlfb2JqZWN0X2hhbmRsZXIgaGFuZGxlciwgdm9pZCAqKmRhdGEpCi17Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2M7Ci0KLQlvYmpfZGVzYyA9IG5vZGUtPm9iamVjdDsKLQl3aGlsZSAob2JqX2Rlc2MpIHsKLQkJaWYgKChBQ1BJX0dFVF9PQkpFQ1RfVFlQRShvYmpfZGVzYykgPT0gQUNQSV9UWVBFX0xPQ0FMX0RBVEEpICYmCi0JCSAgICAob2JqX2Rlc2MtPmRhdGEuaGFuZGxlciA9PSBoYW5kbGVyKSkgewotCQkJKmRhdGEgPSBvYmpfZGVzYy0+ZGF0YS5wb2ludGVyOwotCQkJcmV0dXJuIChBRV9PSyk7Ci0JCX0KLQotCQlvYmpfZGVzYyA9IG9ial9kZXNjLT5jb21tb24ubmV4dF9vYmplY3Q7Ci0JfQotCi0JcmV0dXJuIChBRV9OT1RfRk9VTkQpOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc3BhcnNlLmMgYi9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zcGFyc2UuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTgyMjcxYS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zcGFyc2UuYworKysgL2Rldi9udWxsCkBAIC0xLDIwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogTW9kdWxlIE5hbWU6IG5zcGFyc2UgLSBuYW1lc3BhY2UgaW50ZXJmYWNlIHRvIEFNTCBwYXJzZXIKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA4LCBJbnRlbCBDb3JwLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAotICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgYXQgbWluaW11bSBhIGRpc2NsYWltZXIKLSAqICAgIHN1YnN0YW50aWFsbHkgc2ltaWxhciB0byB0aGUgIk5PIFdBUlJBTlRZIiBkaXNjbGFpbWVyIGJlbG93Ci0gKiAgICAoIkRpc2NsYWltZXIiKSBhbmQgYW55IHJlZGlzdHJpYnV0aW9uIG11c3QgYmUgY29uZGl0aW9uZWQgdXBvbgotICogICAgaW5jbHVkaW5nIGEgc3Vic3RhbnRpYWxseSBzaW1pbGFyIERpc2NsYWltZXIgcmVxdWlyZW1lbnQgZm9yIGZ1cnRoZXIKLSAqICAgIGJpbmFyeSByZWRpc3RyaWJ1dGlvbi4KLSAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcwotICogICAgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICogU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBOTyBXQVJSQU5UWQotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCi0gKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUwotICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcKLSAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQotICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgotICovCi0KLSNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KLSNpbmNsdWRlIDxhY3BpL2FjbmFtZXNwLmg+Ci0jaW5jbHVkZSA8YWNwaS9hY3BhcnNlci5oPgotI2luY2x1ZGUgPGFjcGkvYWNkaXNwYXQuaD4KLSNpbmNsdWRlIDxhY3BpL2FjdGFibGVzLmg+Ci0KLSNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX05BTUVTUEFDRQotQUNQSV9NT0RVTEVfTkFNRSgibnNwYXJzZSIpCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIG5zX29uZV9jb21wbGV0ZV9wYXJzZQotICoKLSAqIFBBUkFNRVRFUlM6ICBwYXNzX251bWJlciAgICAgICAgICAgICAtIDEgb3IgMgotICogICAgICAgICAgICAgIHRhYmxlX2Rlc2MgICAgICAgICAgICAgIC0gVGhlIHRhYmxlIHRvIGJlIHBhcnNlZC4KLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IFBlcmZvcm0gb25lIGNvbXBsZXRlIHBhcnNlIG9mIGFuIEFDUEkvQU1MIHRhYmxlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1hY3BpX3N0YXR1cwotYWNwaV9uc19vbmVfY29tcGxldGVfcGFyc2UodTMyIHBhc3NfbnVtYmVyLAotCQkJICAgdTMyIHRhYmxlX2luZGV4LAotCQkJICAgc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKnN0YXJ0X25vZGUpCi17Ci0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKnBhcnNlX3Jvb3Q7Ci0JYWNwaV9zdGF0dXMgc3RhdHVzOwotICAgICAgIHUzMiBhbWxfbGVuZ3RoOwotCXU4ICphbWxfc3RhcnQ7Ci0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZTsKLQlzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKnRhYmxlOwotCWFjcGlfb3duZXJfaWQgb3duZXJfaWQ7Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKG5zX29uZV9jb21wbGV0ZV9wYXJzZSk7Ci0KLQlzdGF0dXMgPSBhY3BpX3RiX2dldF9vd25lcl9pZCh0YWJsZV9pbmRleCwgJm93bmVyX2lkKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci0JfQotCi0JLyogQ3JlYXRlIGFuZCBpbml0IGEgUm9vdCBOb2RlICovCi0KLQlwYXJzZV9yb290ID0gYWNwaV9wc19jcmVhdGVfc2NvcGVfb3AoKTsKLQlpZiAoIXBhcnNlX3Jvb3QpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX01FTU9SWSk7Ci0JfQotCi0JLyogQ3JlYXRlIGFuZCBpbml0aWFsaXplIGEgbmV3IHdhbGsgc3RhdGUgKi8KLQotCXdhbGtfc3RhdGUgPSBhY3BpX2RzX2NyZWF0ZV93YWxrX3N0YXRlKG93bmVyX2lkLCBOVUxMLCBOVUxMLCBOVUxMKTsKLQlpZiAoIXdhbGtfc3RhdGUpIHsKLQkJYWNwaV9wc19mcmVlX29wKHBhcnNlX3Jvb3QpOwotCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9fTUVNT1JZKTsKLQl9Ci0KLQlzdGF0dXMgPSBhY3BpX2dldF90YWJsZV9ieV9pbmRleCh0YWJsZV9pbmRleCwgJnRhYmxlKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJYWNwaV9kc19kZWxldGVfd2Fsa19zdGF0ZSh3YWxrX3N0YXRlKTsKLQkJYWNwaV9wc19mcmVlX29wKHBhcnNlX3Jvb3QpOwotCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLQl9Ci0KLQkvKiBUYWJsZSBtdXN0IGNvbnNpc3Qgb2YgYXQgbGVhc3QgYSBjb21wbGV0ZSBoZWFkZXIgKi8KLQotCWlmICh0YWJsZS0+bGVuZ3RoIDwgc2l6ZW9mKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlcikpIHsKLQkJc3RhdHVzID0gQUVfQkFEX0hFQURFUjsKLQl9IGVsc2UgewotCQlhbWxfc3RhcnQgPSAodTggKikgdGFibGUgKyBzaXplb2Yoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyKTsKLQkJYW1sX2xlbmd0aCA9IHRhYmxlLT5sZW5ndGggLSBzaXplb2Yoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyKTsKLQkJc3RhdHVzID0gYWNwaV9kc19pbml0X2FtbF93YWxrKHdhbGtfc3RhdGUsIHBhcnNlX3Jvb3QsIE5VTEwsCi0JCQkJCSAgICAgICBhbWxfc3RhcnQsIGFtbF9sZW5ndGgsIE5VTEwsCi0JCQkJCSAgICAgICAodTgpIHBhc3NfbnVtYmVyKTsKLQl9Ci0KLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJYWNwaV9kc19kZWxldGVfd2Fsa19zdGF0ZSh3YWxrX3N0YXRlKTsKLQkJZ290byBjbGVhbnVwOwotCX0KLQotCS8qIHN0YXJ0X25vZGUgaXMgdGhlIGRlZmF1bHQgbG9jYXRpb24gdG8gbG9hZCB0aGUgdGFibGUgKi8KLQotCWlmIChzdGFydF9ub2RlICYmIHN0YXJ0X25vZGUgIT0gYWNwaV9nYmxfcm9vdF9ub2RlKSB7Ci0JCXN0YXR1cyA9Ci0JCSAgICBhY3BpX2RzX3Njb3BlX3N0YWNrX3B1c2goc3RhcnRfbm9kZSwgQUNQSV9UWVBFX01FVEhPRCwKLQkJCQkJICAgICB3YWxrX3N0YXRlKTsKLQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCQlhY3BpX2RzX2RlbGV0ZV93YWxrX3N0YXRlKHdhbGtfc3RhdGUpOwotCQkJZ290byBjbGVhbnVwOwotCQl9Ci0JfQotCi0JLyogUGFyc2UgdGhlIEFNTCAqLwotCi0JQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9QQVJTRSwgIipQQVJTRSogcGFzcyAlZCBwYXJzZVxuIiwKLQkJCSAgKHVuc2lnbmVkKXBhc3NfbnVtYmVyKSk7Ci0Jc3RhdHVzID0gYWNwaV9wc19wYXJzZV9hbWwod2Fsa19zdGF0ZSk7Ci0KLSAgICAgIGNsZWFudXA6Ci0JYWNwaV9wc19kZWxldGVfcGFyc2VfdHJlZShwYXJzZV9yb290KTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9uc19wYXJzZV90YWJsZQotICoKLSAqIFBBUkFNRVRFUlM6ICB0YWJsZV9kZXNjICAgICAgLSBBbiBBQ1BJIHRhYmxlIGRlc2NyaXB0b3IgZm9yIHRhYmxlIHRvIHBhcnNlCi0gKiAgICAgICAgICAgICAgc3RhcnRfbm9kZSAgICAgIC0gV2hlcmUgdG8gZW50ZXIgdGhlIHRhYmxlIGludG8gdGhlIG5hbWVzcGFjZQotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKLSAqCi0gKiBERVNDUklQVElPTjogUGFyc2UgQU1MIHdpdGhpbiBhbiBBQ1BJIHRhYmxlIGFuZCByZXR1cm4gYSB0cmVlIG9mIG9wcwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWFjcGlfc3RhdHVzCi1hY3BpX25zX3BhcnNlX3RhYmxlKHUzMiB0YWJsZV9pbmRleCwgc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKnN0YXJ0X25vZGUpCi17Ci0JYWNwaV9zdGF0dXMgc3RhdHVzOwotCi0JQUNQSV9GVU5DVElPTl9UUkFDRShuc19wYXJzZV90YWJsZSk7Ci0KLQkvKgotCSAqIEFNTCBQYXJzZSwgcGFzcyAxCi0JICoKLQkgKiBJbiB0aGlzIHBhc3MsIHdlIGxvYWQgbW9zdCBvZiB0aGUgbmFtZXNwYWNlLiAgQ29udHJvbCBtZXRob2RzCi0JICogYXJlIG5vdCBwYXJzZWQgdW50aWwgbGF0ZXIuICBBIHBhcnNlIHRyZWUgaXMgbm90IGNyZWF0ZWQuICBJbnN0ZWFkLAotCSAqIGVhY2ggUGFyc2VyIE9wIHN1YnRyZWUgaXMgZGVsZXRlZCB3aGVuIGl0IGlzIGZpbmlzaGVkLiAgVGhpcyBzYXZlcwotCSAqIGEgZ3JlYXQgZGVhbCBvZiBtZW1vcnksIGFuZCBhbGxvd3MgYSBzbWFsbCBjYWNoZSBvZiBwYXJzZSBvYmplY3RzCi0JICogdG8gc2VydmljZSB0aGUgZW50aXJlIHBhcnNlLiAgVGhlIHNlY29uZCBwYXNzIG9mIHRoZSBwYXJzZSB0aGVuCi0JICogcGVyZm9ybXMgYW5vdGhlciBjb21wbGV0ZSBwYXJzZSBvZiB0aGUgQU1MLgotCSAqLwotCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfUEFSU0UsICIqKioqIFN0YXJ0IHBhc3MgMVxuIikpOwotCXN0YXR1cyA9Ci0JICAgIGFjcGlfbnNfb25lX2NvbXBsZXRlX3BhcnNlKEFDUElfSU1PREVfTE9BRF9QQVNTMSwgdGFibGVfaW5kZXgsCi0JCQkJICAgICAgIHN0YXJ0X25vZGUpOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLQl9Ci0KLQkvKgotCSAqIEFNTCBQYXJzZSwgcGFzcyAyCi0JICoKLQkgKiBJbiB0aGlzIHBhc3MsIHdlIHJlc29sdmUgZm9yd2FyZCByZWZlcmVuY2VzIGFuZCBvdGhlciB0aGluZ3MKLQkgKiB0aGF0IGNvdWxkIG5vdCBiZSBjb21wbGV0ZWQgZHVyaW5nIHRoZSBmaXJzdCBwYXNzLgotCSAqIEFub3RoZXIgY29tcGxldGUgcGFyc2Ugb2YgdGhlIEFNTCBpcyBwZXJmb3JtZWQsIGJ1dCB0aGUKLQkgKiBvdmVyaGVhZCBvZiB0aGlzIGlzIGNvbXBlbnNhdGVkIGZvciBieSB0aGUgZmFjdCB0aGF0IHRoZQotCSAqIHBhcnNlIG9iamVjdHMgYXJlIGFsbCBjYWNoZWQuCi0JICovCi0JQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9QQVJTRSwgIioqKiogU3RhcnQgcGFzcyAyXG4iKSk7Ci0Jc3RhdHVzID0KLQkgICAgYWNwaV9uc19vbmVfY29tcGxldGVfcGFyc2UoQUNQSV9JTU9ERV9MT0FEX1BBU1MyLCB0YWJsZV9pbmRleCwKLQkJCQkgICAgICAgc3RhcnRfbm9kZSk7Ci0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotCX0KLQotCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc3ByZWRlZi5jIGIvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc3ByZWRlZi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjE3Y2YwLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnNwcmVkZWYuYworKysgL2Rldi9udWxsCkBAIC0xLDkwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogTW9kdWxlIE5hbWU6IG5zcHJlZGVmIC0gVmFsaWRhdGlvbiBvZiBBQ1BJIHByZWRlZmluZWQgbWV0aG9kcyBhbmQgb2JqZWN0cwotICogICAgICAgICAgICAgICRSZXZpc2lvbjogMS4xICQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA4LCBJbnRlbCBDb3JwLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAotICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgYXQgbWluaW11bSBhIGRpc2NsYWltZXIKLSAqICAgIHN1YnN0YW50aWFsbHkgc2ltaWxhciB0byB0aGUgIk5PIFdBUlJBTlRZIiBkaXNjbGFpbWVyIGJlbG93Ci0gKiAgICAoIkRpc2NsYWltZXIiKSBhbmQgYW55IHJlZGlzdHJpYnV0aW9uIG11c3QgYmUgY29uZGl0aW9uZWQgdXBvbgotICogICAgaW5jbHVkaW5nIGEgc3Vic3RhbnRpYWxseSBzaW1pbGFyIERpc2NsYWltZXIgcmVxdWlyZW1lbnQgZm9yIGZ1cnRoZXIKLSAqICAgIGJpbmFyeSByZWRpc3RyaWJ1dGlvbi4KLSAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcwotICogICAgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICogU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBOTyBXQVJSQU5UWQotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCi0gKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUwotICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcKLSAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQotICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgotICovCi0KLSNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KLSNpbmNsdWRlIDxhY3BpL2FjbmFtZXNwLmg+Ci0jaW5jbHVkZSA8YWNwaS9hY3ByZWRlZi5oPgotCi0jZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9OQU1FU1BBQ0UKLUFDUElfTU9EVUxFX05BTUUoIm5zcHJlZGVmIikKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBUaGlzIG1vZHVsZSB2YWxpZGF0ZXMgcHJlZGVmaW5lZCBBQ1BJIG9iamVjdHMgdGhhdCBhcHBlYXIgaW4gdGhlIG5hbWVzcGFjZSwKLSAqIGF0IHRoZSB0aW1lIHRoZXkgYXJlIGV2YWx1YXRlZCAodmlhIGFjcGlfZXZhbHVhdGVfb2JqZWN0KS4gVGhlIHB1cnBvc2Ugb2YgdGhpcwotICogdmFsaWRhdGlvbiBpcyB0byBkZXRlY3QgcHJvYmxlbXMgd2l0aCBCSU9TLWV4cG9zZWQgcHJlZGVmaW5lZCBBQ1BJIG9iamVjdHMKLSAqIGJlZm9yZSB0aGUgcmVzdWx0cyBhcmUgcmV0dXJuZWQgdG8gdGhlIEFDUEktcmVsYXRlZCBkcml2ZXJzLgotICoKLSAqIFRoZXJlIGFyZSBzZXZlcmFsIGFyZWFzIHRoYXQgYXJlIHZhbGlkYXRlZDoKLSAqCi0gKiAgMSkgVGhlIG51bWJlciBvZiBpbnB1dCBhcmd1bWVudHMgYXMgZGVmaW5lZCBieSB0aGUgbWV0aG9kL29iamVjdCBpbiB0aGUKLSAqICAgICAgQVNMIGlzIHZhbGlkYXRlZCBhZ2FpbnN0IHRoZSBBQ1BJIHNwZWNpZmljYXRpb24uCi0gKiAgMikgVGhlIHR5cGUgb2YgdGhlIHJldHVybiBvYmplY3QgKGlmIGFueSkgaXMgdmFsaWRhdGVkIGFnYWluc3QgdGhlIEFDUEkKLSAqICAgICAgc3BlY2lmaWNhdGlvbi4KLSAqICAzKSBGb3IgcmV0dXJuZWQgcGFja2FnZSBvYmplY3RzLCB0aGUgY291bnQgb2YgcGFja2FnZSBlbGVtZW50cyBpcwotICogICAgICB2YWxpZGF0ZWQsIGFzIHdlbGwgYXMgdGhlIHR5cGUgb2YgZWFjaCBwYWNrYWdlIGVsZW1lbnQuIE5lc3RlZAotICogICAgICBwYWNrYWdlcyBhcmUgc3VwcG9ydGVkLgotICoKLSAqIEZvciBhbnkgcHJvYmxlbXMgZm91bmQsIGEgd2FybmluZyBtZXNzYWdlIGlzIGlzc3VlZC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogTG9jYWwgcHJvdG90eXBlcyAqLwotc3RhdGljIGFjcGlfc3RhdHVzCi1hY3BpX25zX2NoZWNrX3BhY2thZ2UoY2hhciAqcGF0aG5hbWUsCi0JCSAgICAgIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnJldHVybl9vYmplY3QsCi0JCSAgICAgIGNvbnN0IHVuaW9uIGFjcGlfcHJlZGVmaW5lZF9pbmZvICpwcmVkZWZpbmVkKTsKLQotc3RhdGljIGFjcGlfc3RhdHVzCi1hY3BpX25zX2NoZWNrX3BhY2thZ2VfZWxlbWVudHMoY2hhciAqcGF0aG5hbWUsCi0JCQkgICAgICAgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKmVsZW1lbnRzLAotCQkJICAgICAgIHU4IHR5cGUxLCB1MzIgY291bnQxLCB1OCB0eXBlMiwgdTMyIGNvdW50Mik7Ci0KLXN0YXRpYyBhY3BpX3N0YXR1cwotYWNwaV9uc19jaGVja19vYmplY3RfdHlwZShjaGFyICpwYXRobmFtZSwKLQkJCSAgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqcmV0dXJuX29iamVjdCwKLQkJCSAgdTMyIGV4cGVjdGVkX2J0eXBlcywgdTMyIHBhY2thZ2VfaW5kZXgpOwotCi1zdGF0aWMgYWNwaV9zdGF0dXMKLWFjcGlfbnNfY2hlY2tfcmVmZXJlbmNlKGNoYXIgKnBhdGhuYW1lLAotCQkJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqcmV0dXJuX29iamVjdCk7Ci0KLS8qCi0gKiBOYW1lcyBmb3IgdGhlIHR5cGVzIHRoYXQgY2FuIGJlIHJldHVybmVkIGJ5IHRoZSBwcmVkZWZpbmVkIG9iamVjdHMuCi0gKiBVc2VkIGZvciB3YXJuaW5nIG1lc3NhZ2VzLiBNdXN0IGJlIGluIHRoZSBzYW1lIG9yZGVyIGFzIHRoZSBBQ1BJX1JUWVBFcwotICovCi1zdGF0aWMgY29uc3QgY2hhciAqYWNwaV9ydHlwZV9uYW1lc1tdID0gewotCSIvSW50ZWdlciIsCi0JIi9TdHJpbmciLAotCSIvQnVmZmVyIiwKLQkiL1BhY2thZ2UiLAotCSIvUmVmZXJlbmNlIiwKLX07Ci0KLSNkZWZpbmUgQUNQSV9OT1RfUEFDS0FHRSAgICBBQ1BJX1VJTlQzMl9NQVgKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9uc19jaGVja19wcmVkZWZpbmVkX25hbWVzCi0gKgotICogUEFSQU1FVEVSUzogIE5vZGUgICAgICAgICAgICAtIE5hbWVzcGFjZSBub2RlIGZvciB0aGUgbWV0aG9kL29iamVjdAotICogICAgICAgICAgICAgIHJldHVybl9vYmplY3QgICAtIE9iamVjdCByZXR1cm5lZCBmcm9tIHRoZSBldmFsdWF0aW9uIG9mIHRoaXMKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Qvb2JqZWN0Ci0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cwotICoKLSAqIERFU0NSSVBUSU9OOiBDaGVjayBhbiBBQ1BJIG5hbWUgZm9yIGEgbWF0Y2ggaW4gdGhlIHByZWRlZmluZWQgbmFtZSBsaXN0LgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWFjcGlfc3RhdHVzCi1hY3BpX25zX2NoZWNrX3ByZWRlZmluZWRfbmFtZXMoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGUsCi0JCQkgICAgICAgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqcmV0dXJuX29iamVjdCkKLXsKLQlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKLQljb25zdCB1bmlvbiBhY3BpX3ByZWRlZmluZWRfaW5mbyAqcHJlZGVmaW5lZDsKLQljaGFyICpwYXRobmFtZTsKLQotCS8qIE1hdGNoIHRoZSBuYW1lIGZvciB0aGlzIG1ldGhvZC9vYmplY3QgYWdhaW5zdCB0aGUgcHJlZGVmaW5lZCBsaXN0ICovCi0KLQlwcmVkZWZpbmVkID0gYWNwaV9uc19jaGVja19mb3JfcHJlZGVmaW5lZF9uYW1lKG5vZGUpOwotCWlmICghcHJlZGVmaW5lZCkgewotCi0JCS8qIE5hbWUgd2FzIG5vdCBvbmUgb2YgdGhlIHByZWRlZmluZWQgbmFtZXMgKi8KLQotCQlyZXR1cm4gKEFFX09LKTsKLQl9Ci0KLQkvKiBHZXQgdGhlIGZ1bGwgcGF0aG5hbWUgdG8gdGhlIG9iamVjdCwgZm9yIHVzZSBpbiBlcnJvciBtZXNzYWdlcyAqLwotCi0JcGF0aG5hbWUgPSBhY3BpX25zX2dldF9leHRlcm5hbF9wYXRobmFtZShub2RlKTsKLQlpZiAoIXBhdGhuYW1lKSB7Ci0JCXBhdGhuYW1lID0gQUNQSV9DQVNUX1BUUihjaGFyLCBwcmVkZWZpbmVkLT5pbmZvLm5hbWUpOwotCX0KLQotCS8qCi0JICogQ2hlY2sgdGhhdCB0aGUgcGFyYW1ldGVyIGNvdW50IGZvciB0aGlzIG1ldGhvZCBpcyBpbiBhY2NvcmRhbmNlCi0JICogd2l0aCB0aGUgQUNQSSBzcGVjaWZpY2F0aW9uLgotCSAqLwotCWFjcGlfbnNfY2hlY2tfcGFyYW1ldGVyX2NvdW50KHBhdGhuYW1lLCBub2RlLCBwcmVkZWZpbmVkKTsKLQotCS8qCi0JICogSWYgdGhlcmUgaXMgbm8gcmV0dXJuIHZhbHVlLCBjaGVjayBpZiB3ZSByZXF1aXJlIGEgcmV0dXJuIHZhbHVlIGZvcgotCSAqIHRoaXMgcHJlZGVmaW5lZCBuYW1lLiBFaXRoZXIgb25lIHJldHVybiB2YWx1ZSBpcyBleHBlY3RlZCwgb3Igbm9uZSwKLQkgKiBmb3IgYm90aCBtZXRob2RzIGFuZCBvdGhlciBvYmplY3RzLgotCSAqCi0JICogRXhpdCBub3cgaWYgdGhlcmUgaXMgbm8gcmV0dXJuIG9iamVjdC4gV2FybmluZyBpZiBvbmUgd2FzIGV4cGVjdGVkLgotCSAqLwotCWlmICghcmV0dXJuX29iamVjdCkgewotCQlpZiAoKHByZWRlZmluZWQtPmluZm8uZXhwZWN0ZWRfYnR5cGVzKSAmJgotCQkgICAgKCEocHJlZGVmaW5lZC0+aW5mby5leHBlY3RlZF9idHlwZXMgJiBBQ1BJX1JUWVBFX05PTkUpKSkgewotCQkJQUNQSV9FUlJPUigoQUVfSU5GTywKLQkJCQkgICAgIiVzOiBNaXNzaW5nIGV4cGVjdGVkIHJldHVybiB2YWx1ZSIsCi0JCQkJICAgIHBhdGhuYW1lKSk7Ci0KLQkJCXN0YXR1cyA9IEFFX0FNTF9OT19SRVRVUk5fVkFMVUU7Ci0JCX0KLQkJZ290byBleGl0OwotCX0KLQotCS8qCi0JICogV2UgaGF2ZSBhIHJldHVybiB2YWx1ZSwgYnV0IGlmIG9uZSB3YXNuJ3QgZXhwZWN0ZWQsIGp1c3QgZXhpdCwgdGhpcyBpcwotCSAqIG5vdCBhIHByb2JsZW0KLQkgKgotCSAqIEZvciBleGFtcGxlLCBpZiAiSW1wbGljaXQgcmV0dXJuIHZhbHVlIiBpcyBlbmFibGVkLCBtZXRob2RzIHdpbGwKLQkgKiBhbHdheXMgcmV0dXJuIGEgdmFsdWUKLQkgKi8KLQlpZiAoIXByZWRlZmluZWQtPmluZm8uZXhwZWN0ZWRfYnR5cGVzKSB7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0KLQkvKgotCSAqIENoZWNrIHRoYXQgdGhlIHR5cGUgb2YgdGhlIHJldHVybiBvYmplY3QgaXMgd2hhdCBpcyBleHBlY3RlZCBmb3IKLQkgKiB0aGlzIHByZWRlZmluZWQgbmFtZQotCSAqLwotCXN0YXR1cyA9IGFjcGlfbnNfY2hlY2tfb2JqZWN0X3R5cGUocGF0aG5hbWUsIHJldHVybl9vYmplY3QsCi0JCQkJCSAgIHByZWRlZmluZWQtPmluZm8uZXhwZWN0ZWRfYnR5cGVzLAotCQkJCQkgICBBQ1BJX05PVF9QQUNLQUdFKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJZ290byBleGl0OwotCX0KLQotCS8qIEZvciByZXR1cm5lZCBQYWNrYWdlIG9iamVjdHMsIGNoZWNrIHRoZSB0eXBlIG9mIGFsbCBzdWItb2JqZWN0cyAqLwotCi0JaWYgKEFDUElfR0VUX09CSkVDVF9UWVBFKHJldHVybl9vYmplY3QpID09IEFDUElfVFlQRV9QQUNLQUdFKSB7Ci0JCXN0YXR1cyA9Ci0JCSAgICBhY3BpX25zX2NoZWNrX3BhY2thZ2UocGF0aG5hbWUsIHJldHVybl9vYmplY3QsIHByZWRlZmluZWQpOwotCX0KLQotICAgICAgZXhpdDoKLQlpZiAocGF0aG5hbWUpIHsKLQkJQUNQSV9GUkVFKHBhdGhuYW1lKTsKLQl9Ci0KLQlyZXR1cm4gKHN0YXR1cyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfbnNfY2hlY2tfcGFyYW1ldGVyX2NvdW50Ci0gKgotICogUEFSQU1FVEVSUzogIFBhdGhuYW1lICAgICAgICAtIEZ1bGwgcGF0aG5hbWUgdG8gdGhlIG5vZGUgKGZvciBlcnJvciBtc2dzKQotICogICAgICAgICAgICAgIE5vZGUgICAgICAgICAgICAtIE5hbWVzcGFjZSBub2RlIGZvciB0aGUgbWV0aG9kL29iamVjdAotICogICAgICAgICAgICAgIFByZWRlZmluZWQgICAgICAtIFBvaW50ZXIgdG8gZW50cnkgaW4gcHJlZGVmaW5lZCBuYW1lIHRhYmxlCi0gKgotICogUkVUVVJOOiAgICAgIE5vbmUKLSAqCi0gKiBERVNDUklQVElPTjogQ2hlY2sgdGhhdCB0aGUgZGVjbGFyZWQgKGluIEFTTC9BTUwpIHBhcmFtZXRlciBjb3VudCBmb3IgYQotICogICAgICAgICAgICAgIHByZWRlZmluZWQgbmFtZSBpcyB3aGF0IGlzIGV4cGVjdGVkIChpLmUuLCB3aGF0IGlzIGRlZmluZWQgaW4KLSAqICAgICAgICAgICAgICB0aGUgQUNQSSBzcGVjaWZpY2F0aW9uIGZvciB0aGlzIHByZWRlZmluZWQgbmFtZS4pCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdm9pZAotYWNwaV9uc19jaGVja19wYXJhbWV0ZXJfY291bnQoY2hhciAqcGF0aG5hbWUsCi0JCQkgICAgICBzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZSwKLQkJCSAgICAgIGNvbnN0IHVuaW9uIGFjcGlfcHJlZGVmaW5lZF9pbmZvICpwcmVkZWZpbmVkKQotewotCXUzMiBwYXJhbV9jb3VudDsKLQl1MzIgcmVxdWlyZWRfcGFyYW1zX2N1cnJlbnQ7Ci0JdTMyIHJlcXVpcmVkX3BhcmFtc19vbGQ7Ci0KLQkvKgotCSAqIENoZWNrIHRoYXQgdGhlIEFTTC1kZWZpbmVkIHBhcmFtZXRlciBjb3VudCBpcyB3aGF0IGlzIGV4cGVjdGVkIGZvcgotCSAqIHRoaXMgcHJlZGVmaW5lZCBuYW1lLgotCSAqCi0JICogTWV0aG9kcyBoYXZlIDAtNyBwYXJhbWV0ZXJzLiBBbGwgb3RoZXIgdHlwZXMgaGF2ZSB6ZXJvLgotCSAqLwotCXBhcmFtX2NvdW50ID0gMDsKLQlpZiAobm9kZS0+dHlwZSA9PSBBQ1BJX1RZUEVfTUVUSE9EKSB7Ci0JCXBhcmFtX2NvdW50ID0gbm9kZS0+b2JqZWN0LT5tZXRob2QucGFyYW1fY291bnQ7Ci0JfQotCi0JLyogVmFsaWRhdGUgcGFyYW1ldGVyIGNvdW50IC0gYWxsb3cgdHdvIGRpZmZlcmVudCBsZWdhbCBjb3VudHMgKF9TQ1ApICovCi0KLQlyZXF1aXJlZF9wYXJhbXNfY3VycmVudCA9IHByZWRlZmluZWQtPmluZm8ucGFyYW1fY291bnQgJiAweDBGOwotCXJlcXVpcmVkX3BhcmFtc19vbGQgPSBwcmVkZWZpbmVkLT5pbmZvLnBhcmFtX2NvdW50ID4+IDQ7Ci0KLQlpZiAoKHBhcmFtX2NvdW50ICE9IHJlcXVpcmVkX3BhcmFtc19jdXJyZW50KSAmJgotCSAgICAocGFyYW1fY291bnQgIT0gcmVxdWlyZWRfcGFyYW1zX29sZCkpIHsKLQkJQUNQSV9XQVJOSU5HKChBRV9JTkZPLAotCQkJICAgICAgIiVzOiBQYXJhbWV0ZXIgY291bnQgbWlzbWF0Y2ggLSBBU0wgZGVjbGFyZWQgJWQsIGV4cGVjdGVkICVkIiwKLQkJCSAgICAgIHBhdGhuYW1lLCBwYXJhbV9jb3VudCwgcmVxdWlyZWRfcGFyYW1zX2N1cnJlbnQpKTsKLQl9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfbnNfY2hlY2tfZm9yX3ByZWRlZmluZWRfbmFtZQotICoKLSAqIFBBUkFNRVRFUlM6ICBOb2RlICAgICAgICAgICAgLSBOYW1lc3BhY2Ugbm9kZSBmb3IgdGhlIG1ldGhvZC9vYmplY3QKLSAqCi0gKiBSRVRVUk46ICAgICAgUG9pbnRlciB0byBlbnRyeSBpbiBwcmVkZWZpbmVkIHRhYmxlLiBOVUxMIGluZGljYXRlcyBub3QgZm91bmQuCi0gKgotICogREVTQ1JJUFRJT046IENoZWNrIGFuIG9iamVjdCBuYW1lIGFnYWluc3QgdGhlIHByZWRlZmluZWQgb2JqZWN0IGxpc3QuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotY29uc3QgdW5pb24gYWNwaV9wcmVkZWZpbmVkX2luZm8gKmFjcGlfbnNfY2hlY2tfZm9yX3ByZWRlZmluZWRfbmFtZShzdHJ1Y3QKLQkJCQkJCQkJICAgIGFjcGlfbmFtZXNwYWNlX25vZGUKLQkJCQkJCQkJICAgICpub2RlKQotewotCWNvbnN0IHVuaW9uIGFjcGlfcHJlZGVmaW5lZF9pbmZvICp0aGlzX25hbWU7Ci0KLQkvKiBRdWljayBjaGVjayBmb3IgYSBwcmVkZWZpbmVkIG5hbWUsIGZpcnN0IGNoYXJhY3RlciBtdXN0IGJlIHVuZGVyc2NvcmUgKi8KLQotCWlmIChub2RlLT5uYW1lLmFzY2lpWzBdICE9ICdfJykgewotCQlyZXR1cm4gKE5VTEwpOwotCX0KLQotCS8qIFNlYXJjaCBpbmZvIHRhYmxlIGZvciBhIHByZWRlZmluZWQgbWV0aG9kL29iamVjdCBuYW1lICovCi0KLQl0aGlzX25hbWUgPSBwcmVkZWZpbmVkX25hbWVzOwotCXdoaWxlICh0aGlzX25hbWUtPmluZm8ubmFtZVswXSkgewotCQlpZiAoQUNQSV9DT01QQVJFX05BTUUobm9kZS0+bmFtZS5hc2NpaSwgdGhpc19uYW1lLT5pbmZvLm5hbWUpKSB7Ci0KLQkJCS8qIFJldHVybiBwb2ludGVyIHRvIHRoaXMgdGFibGUgZW50cnkgKi8KLQotCQkJcmV0dXJuICh0aGlzX25hbWUpOwotCQl9Ci0KLQkJLyoKLQkJICogU2tpcCBuZXh0IGVudHJ5IGluIHRoZSB0YWJsZSBpZiB0aGlzIG5hbWUgcmV0dXJucyBhIFBhY2thZ2UKLQkJICogKG5leHQgZW50cnkgY29udGFpbnMgdGhlIHBhY2thZ2UgaW5mbykKLQkJICovCi0JCWlmICh0aGlzX25hbWUtPmluZm8uZXhwZWN0ZWRfYnR5cGVzICYgQUNQSV9SVFlQRV9QQUNLQUdFKSB7Ci0JCQl0aGlzX25hbWUrKzsKLQkJfQotCi0JCXRoaXNfbmFtZSsrOwotCX0KLQotCXJldHVybiAoTlVMTCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfbnNfY2hlY2tfcGFja2FnZQotICoKLSAqIFBBUkFNRVRFUlM6ICBQYXRobmFtZSAgICAgICAgLSBGdWxsIHBhdGhuYW1lIHRvIHRoZSBub2RlIChmb3IgZXJyb3IgbXNncykKLSAqICAgICAgICAgICAgICByZXR1cm5fb2JqZWN0ICAgLSBPYmplY3QgcmV0dXJuZWQgZnJvbSB0aGUgZXZhbHVhdGlvbiBvZiBhCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kIG9yIG9iamVjdAotICogICAgICAgICAgICAgIFByZWRlZmluZWQgICAgICAtIFBvaW50ZXIgdG8gZW50cnkgaW4gcHJlZGVmaW5lZCBuYW1lIHRhYmxlCi0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cwotICoKLSAqIERFU0NSSVBUSU9OOiBDaGVjayBhIHJldHVybmVkIHBhY2thZ2Ugb2JqZWN0IGZvciB0aGUgY29ycmVjdCBjb3VudCBhbmQKLSAqICAgICAgICAgICAgICBjb3JyZWN0IHR5cGUgb2YgYWxsIHN1Yi1vYmplY3RzLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyBhY3BpX3N0YXR1cwotYWNwaV9uc19jaGVja19wYWNrYWdlKGNoYXIgKnBhdGhuYW1lLAotCQkgICAgICB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpyZXR1cm5fb2JqZWN0LAotCQkgICAgICBjb25zdCB1bmlvbiBhY3BpX3ByZWRlZmluZWRfaW5mbyAqcHJlZGVmaW5lZCkKLXsKLQljb25zdCB1bmlvbiBhY3BpX3ByZWRlZmluZWRfaW5mbyAqcGFja2FnZTsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpzdWJfcGFja2FnZTsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICoqZWxlbWVudHM7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKnN1Yl9lbGVtZW50czsKLQlhY3BpX3N0YXR1cyBzdGF0dXM7Ci0JdTMyIGV4cGVjdGVkX2NvdW50OwotCXUzMiBjb3VudDsKLQl1MzIgaTsKLQl1MzIgajsKLQotCUFDUElfRlVOQ1RJT05fTkFNRShuc19jaGVja19wYWNrYWdlKTsKLQotCS8qIFRoZSBwYWNrYWdlIGluZm8gZm9yIHRoaXMgbmFtZSBpcyBpbiB0aGUgbmV4dCB0YWJsZSBlbnRyeSAqLwotCi0JcGFja2FnZSA9IHByZWRlZmluZWQgKyAxOwotCi0JQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9OQU1FUywKLQkJCSAgIiVzIFZhbGlkYXRpbmcgcmV0dXJuIFBhY2thZ2Ugb2YgVHlwZSAlWCwgQ291bnQgJVhcbiIsCi0JCQkgIHBhdGhuYW1lLCBwYWNrYWdlLT5yZXRfaW5mby50eXBlLAotCQkJICByZXR1cm5fb2JqZWN0LT5wYWNrYWdlLmNvdW50KSk7Ci0KLQkvKiBFeHRyYWN0IHBhY2thZ2UgY291bnQgYW5kIGVsZW1lbnRzIGFycmF5ICovCi0KLQllbGVtZW50cyA9IHJldHVybl9vYmplY3QtPnBhY2thZ2UuZWxlbWVudHM7Ci0JY291bnQgPSByZXR1cm5fb2JqZWN0LT5wYWNrYWdlLmNvdW50OwotCi0JLyogVGhlIHBhY2thZ2UgbXVzdCBoYXZlIGF0IGxlYXN0IG9uZSBlbGVtZW50LCBlbHNlIGludmFsaWQgKi8KLQotCWlmICghY291bnQpIHsKLQkJQUNQSV9XQVJOSU5HKChBRV9JTkZPLAotCQkJICAgICAgIiVzOiBSZXR1cm4gUGFja2FnZSBoYXMgbm8gZWxlbWVudHMgKGVtcHR5KSIsCi0JCQkgICAgICBwYXRobmFtZSkpOwotCi0JCXJldHVybiAoQUVfQU1MX09QRVJBTkRfVkFMVUUpOwotCX0KLQotCS8qCi0JICogRGVjb2RlIHRoZSB0eXBlIG9mIHRoZSBleHBlY3RlZCBwYWNrYWdlIGNvbnRlbnRzCi0JICoKLQkgKiBQVFlQRTEgcGFja2FnZXMgY29udGFpbiBubyBzdWJwYWNrYWdlcwotCSAqIFBUWVBFMiBwYWNrYWdlcyBjb250YWluIHN1Yi1wYWNrYWdlcwotCSAqLwotCXN3aXRjaCAocGFja2FnZS0+cmV0X2luZm8udHlwZSkgewotCWNhc2UgQUNQSV9QVFlQRTFfRklYRUQ6Ci0KLQkJLyoKLQkJICogVGhlIHBhY2thZ2UgY291bnQgaXMgZml4ZWQgYW5kIHRoZXJlIGFyZSBubyBzdWItcGFja2FnZXMKLQkJICoKLQkJICogSWYgcGFja2FnZSBpcyB0b28gc21hbGwsIGV4aXQuCi0JCSAqIElmIHBhY2thZ2UgaXMgbGFyZ2VyIHRoYW4gZXhwZWN0ZWQsIGlzc3VlIHdhcm5pbmcgYnV0IGNvbnRpbnVlCi0JCSAqLwotCQlleHBlY3RlZF9jb3VudCA9Ci0JCSAgICBwYWNrYWdlLT5yZXRfaW5mby5jb3VudDEgKyBwYWNrYWdlLT5yZXRfaW5mby5jb3VudDI7Ci0JCWlmIChjb3VudCA8IGV4cGVjdGVkX2NvdW50KSB7Ci0JCQlnb3RvIHBhY2thZ2VfdG9vX3NtYWxsOwotCQl9IGVsc2UgaWYgKGNvdW50ID4gZXhwZWN0ZWRfY291bnQpIHsKLQkJCUFDUElfV0FSTklORygoQUVfSU5GTywKLQkJCQkgICAgICAiJXM6IFJldHVybiBQYWNrYWdlIGlzIGxhcmdlciB0aGFuIG5lZWRlZCAtICIKLQkJCQkgICAgICAiZm91bmQgJXUsIGV4cGVjdGVkICV1IiwgcGF0aG5hbWUsIGNvdW50LAotCQkJCSAgICAgIGV4cGVjdGVkX2NvdW50KSk7Ci0JCX0KLQotCQkvKiBWYWxpZGF0ZSBhbGwgZWxlbWVudHMgb2YgdGhlIHJldHVybmVkIHBhY2thZ2UgKi8KLQotCQlzdGF0dXMgPSBhY3BpX25zX2NoZWNrX3BhY2thZ2VfZWxlbWVudHMocGF0aG5hbWUsIGVsZW1lbnRzLAotCQkJCQkJCXBhY2thZ2UtPnJldF9pbmZvLgotCQkJCQkJCW9iamVjdF90eXBlMSwKLQkJCQkJCQlwYWNrYWdlLT5yZXRfaW5mby4KLQkJCQkJCQljb3VudDEsCi0JCQkJCQkJcGFja2FnZS0+cmV0X2luZm8uCi0JCQkJCQkJb2JqZWN0X3R5cGUyLAotCQkJCQkJCXBhY2thZ2UtPnJldF9pbmZvLgotCQkJCQkJCWNvdW50Mik7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQkJcmV0dXJuIChzdGF0dXMpOwotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBBQ1BJX1BUWVBFMV9WQVI6Ci0KLQkJLyoKLQkJICogVGhlIHBhY2thZ2UgY291bnQgaXMgdmFyaWFibGUsIHRoZXJlIGFyZSBubyBzdWItcGFja2FnZXMsIGFuZCBhbGwKLQkJICogZWxlbWVudHMgbXVzdCBiZSBvZiB0aGUgc2FtZSB0eXBlCi0JCSAqLwotCQlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotCQkJc3RhdHVzID0gYWNwaV9uc19jaGVja19vYmplY3RfdHlwZShwYXRobmFtZSwgKmVsZW1lbnRzLAotCQkJCQkJCSAgIHBhY2thZ2UtPnJldF9pbmZvLgotCQkJCQkJCSAgIG9iamVjdF90eXBlMSwgaSk7Ci0JCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJCQlyZXR1cm4gKHN0YXR1cyk7Ci0JCQl9Ci0JCQllbGVtZW50cysrOwotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBBQ1BJX1BUWVBFMV9PUFRJT046Ci0KLQkJLyoKLQkJICogVGhlIHBhY2thZ2UgY291bnQgaXMgdmFyaWFibGUsIHRoZXJlIGFyZSBubyBzdWItcGFja2FnZXMuIFRoZXJlIGFyZQotCQkgKiBhIGZpeGVkIG51bWJlciBvZiByZXF1aXJlZCBlbGVtZW50cywgYW5kIGEgdmFyaWFibGUgbnVtYmVyIG9mCi0JCSAqIG9wdGlvbmFsIGVsZW1lbnRzLgotCQkgKgotCQkgKiBDaGVjayBpZiBwYWNrYWdlIGlzIGF0IGxlYXN0IGFzIGxhcmdlIGFzIHRoZSBtaW5pbXVtIHJlcXVpcmVkCi0JCSAqLwotCQlleHBlY3RlZF9jb3VudCA9IHBhY2thZ2UtPnJldF9pbmZvMy5jb3VudDsKLQkJaWYgKGNvdW50IDwgZXhwZWN0ZWRfY291bnQpIHsKLQkJCWdvdG8gcGFja2FnZV90b29fc21hbGw7Ci0JCX0KLQotCQkvKiBWYXJpYWJsZSBudW1iZXIgb2Ygc3ViLW9iamVjdHMgKi8KLQotCQlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotCQkJaWYgKGkgPCBwYWNrYWdlLT5yZXRfaW5mbzMuY291bnQpIHsKLQotCQkJCS8qIFRoZXNlIGFyZSB0aGUgcmVxdWlyZWQgcGFja2FnZSBlbGVtZW50cyAoMCwgMSwgb3IgMikgKi8KLQotCQkJCXN0YXR1cyA9Ci0JCQkJICAgIGFjcGlfbnNfY2hlY2tfb2JqZWN0X3R5cGUocGF0aG5hbWUsCi0JCQkJCQkJICAgICAgKmVsZW1lbnRzLAotCQkJCQkJCSAgICAgIHBhY2thZ2UtPgotCQkJCQkJCSAgICAgIHJldF9pbmZvMy4KLQkJCQkJCQkgICAgICBvYmplY3RfdHlwZVtpXSwKLQkJCQkJCQkgICAgICBpKTsKLQkJCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJCQkJcmV0dXJuIChzdGF0dXMpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJLyogVGhlc2UgYXJlIHRoZSBvcHRpb25hbCBwYWNrYWdlIGVsZW1lbnRzICovCi0KLQkJCQlzdGF0dXMgPQotCQkJCSAgICBhY3BpX25zX2NoZWNrX29iamVjdF90eXBlKHBhdGhuYW1lLAotCQkJCQkJCSAgICAgICplbGVtZW50cywKLQkJCQkJCQkgICAgICBwYWNrYWdlLT4KLQkJCQkJCQkgICAgICByZXRfaW5mbzMuCi0JCQkJCQkJICAgICAgdGFpbF9vYmplY3RfdHlwZSwKLQkJCQkJCQkgICAgICBpKTsKLQkJCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJCQkJcmV0dXJuIChzdGF0dXMpOwotCQkJCX0KLQkJCX0KLQkJCWVsZW1lbnRzKys7Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIEFDUElfUFRZUEUyX1BLR19DT1VOVDoKLQotCQkvKiBGaXJzdCBlbGVtZW50IGlzIHRoZSAoSW50ZWdlcikgY291bnQgb2Ygc3ViLXBhY2thZ2VzIHRvIGZvbGxvdyAqLwotCi0JCXN0YXR1cyA9IGFjcGlfbnNfY2hlY2tfb2JqZWN0X3R5cGUocGF0aG5hbWUsICplbGVtZW50cywKLQkJCQkJCSAgIEFDUElfUlRZUEVfSU5URUdFUiwgMCk7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQkJcmV0dXJuIChzdGF0dXMpOwotCQl9Ci0KLQkJLyoKLQkJICogQ291bnQgY2Fubm90IGJlIGxhcmdlciB0aGFuIHRoZSBwYXJlbnQgcGFja2FnZSBsZW5ndGgsIGJ1dCBhbGxvdyBpdAotCQkgKiB0byBiZSBzbWFsbGVyLiBUaGUgPj0gYWNjb3VudHMgZm9yIHRoZSBJbnRlZ2VyIGFib3ZlLgotCQkgKi8KLQkJZXhwZWN0ZWRfY291bnQgPSAodTMyKSAoKmVsZW1lbnRzKS0+aW50ZWdlci52YWx1ZTsKLQkJaWYgKGV4cGVjdGVkX2NvdW50ID49IGNvdW50KSB7Ci0JCQlnb3RvIHBhY2thZ2VfdG9vX3NtYWxsOwotCQl9Ci0KLQkJY291bnQgPSBleHBlY3RlZF9jb3VudDsKLQkJZWxlbWVudHMrKzsKLQotCQkvKiBOb3cgd2UgY2FuIHdhbGsgdGhlIHN1Yi1wYWNrYWdlcyAqLwotCi0JCS8qbGludCAtZmFsbHRocm91Z2ggKi8KLQotCWNhc2UgQUNQSV9QVFlQRTI6Ci0JY2FzZSBBQ1BJX1BUWVBFMl9GSVhFRDoKLQljYXNlIEFDUElfUFRZUEUyX01JTjoKLQljYXNlIEFDUElfUFRZUEUyX0NPVU5UOgotCi0JCS8qCi0JCSAqIFRoZXNlIHR5cGVzIGFsbCByZXR1cm4gYSBzaW5nbGUgcGFja2FnZSB0aGF0IGNvbnNpc3RzIG9mIGEgdmFyaWFibGUKLQkJICogbnVtYmVyIG9mIHN1Yi1wYWNrYWdlcwotCQkgKi8KLQkJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLQkJCXN1Yl9wYWNrYWdlID0gKmVsZW1lbnRzOwotCQkJc3ViX2VsZW1lbnRzID0gc3ViX3BhY2thZ2UtPnBhY2thZ2UuZWxlbWVudHM7Ci0KLQkJCS8qIEVhY2ggc3ViLW9iamVjdCBtdXN0IGJlIG9mIHR5cGUgUGFja2FnZSAqLwotCi0JCQlzdGF0dXMgPQotCQkJICAgIGFjcGlfbnNfY2hlY2tfb2JqZWN0X3R5cGUocGF0aG5hbWUsIHN1Yl9wYWNrYWdlLAotCQkJCQkJICAgICAgQUNQSV9SVFlQRV9QQUNLQUdFLCBpKTsKLQkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQkJCXJldHVybiAoc3RhdHVzKTsKLQkJCX0KLQotCQkJLyogRXhhbWluZSB0aGUgZGlmZmVyZW50IHR5cGVzIG9mIHN1Yi1wYWNrYWdlcyAqLwotCi0JCQlzd2l0Y2ggKHBhY2thZ2UtPnJldF9pbmZvLnR5cGUpIHsKLQkJCWNhc2UgQUNQSV9QVFlQRTI6Ci0JCQljYXNlIEFDUElfUFRZUEUyX1BLR19DT1VOVDoKLQotCQkJCS8qIEVhY2ggc3VicGFja2FnZSBoYXMgYSBmaXhlZCBudW1iZXIgb2YgZWxlbWVudHMgKi8KLQotCQkJCWV4cGVjdGVkX2NvdW50ID0KLQkJCQkgICAgcGFja2FnZS0+cmV0X2luZm8uY291bnQxICsKLQkJCQkgICAgcGFja2FnZS0+cmV0X2luZm8uY291bnQyOwotCQkJCWlmIChzdWJfcGFja2FnZS0+cGFja2FnZS5jb3VudCAhPQotCQkJCSAgICBleHBlY3RlZF9jb3VudCkgewotCQkJCQljb3VudCA9IHN1Yl9wYWNrYWdlLT5wYWNrYWdlLmNvdW50OwotCQkJCQlnb3RvIHBhY2thZ2VfdG9vX3NtYWxsOwotCQkJCX0KLQotCQkJCXN0YXR1cyA9Ci0JCQkJICAgIGFjcGlfbnNfY2hlY2tfcGFja2FnZV9lbGVtZW50cyhwYXRobmFtZSwKLQkJCQkJCQkJICAgc3ViX2VsZW1lbnRzLAotCQkJCQkJCQkgICBwYWNrYWdlLT4KLQkJCQkJCQkJICAgcmV0X2luZm8uCi0JCQkJCQkJCSAgIG9iamVjdF90eXBlMSwKLQkJCQkJCQkJICAgcGFja2FnZS0+Ci0JCQkJCQkJCSAgIHJldF9pbmZvLgotCQkJCQkJCQkgICBjb3VudDEsCi0JCQkJCQkJCSAgIHBhY2thZ2UtPgotCQkJCQkJCQkgICByZXRfaW5mby4KLQkJCQkJCQkJICAgb2JqZWN0X3R5cGUyLAotCQkJCQkJCQkgICBwYWNrYWdlLT4KLQkJCQkJCQkJICAgcmV0X2luZm8uCi0JCQkJCQkJCSAgIGNvdW50Mik7Ci0JCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCQkJCXJldHVybiAoc3RhdHVzKTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0KLQkJCWNhc2UgQUNQSV9QVFlQRTJfRklYRUQ6Ci0KLQkJCQkvKiBFYWNoIHN1Yi1wYWNrYWdlIGhhcyBhIGZpeGVkIGxlbmd0aCAqLwotCi0JCQkJZXhwZWN0ZWRfY291bnQgPSBwYWNrYWdlLT5yZXRfaW5mbzIuY291bnQ7Ci0JCQkJaWYgKHN1Yl9wYWNrYWdlLT5wYWNrYWdlLmNvdW50IDwgZXhwZWN0ZWRfY291bnQpIHsKLQkJCQkJY291bnQgPSBzdWJfcGFja2FnZS0+cGFja2FnZS5jb3VudDsKLQkJCQkJZ290byBwYWNrYWdlX3Rvb19zbWFsbDsKLQkJCQl9Ci0KLQkJCQkvKiBDaGVjayB0aGUgdHlwZSBvZiBlYWNoIHN1Yi1wYWNrYWdlIGVsZW1lbnQgKi8KLQotCQkJCWZvciAoaiA9IDA7IGogPCBleHBlY3RlZF9jb3VudDsgaisrKSB7Ci0JCQkJCXN0YXR1cyA9Ci0JCQkJCSAgICBhY3BpX25zX2NoZWNrX29iamVjdF90eXBlKHBhdGhuYW1lLAotCQkJCQkJCQkgICAgICBzdWJfZWxlbWVudHMKLQkJCQkJCQkJICAgICAgW2pdLAotCQkJCQkJCQkgICAgICBwYWNrYWdlLT4KLQkJCQkJCQkJICAgICAgcmV0X2luZm8yLgotCQkJCQkJCQkgICAgICBvYmplY3RfdHlwZQotCQkJCQkJCQkgICAgICBbal0sIGopOwotCQkJCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJCQkJCXJldHVybiAoc3RhdHVzKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlicmVhazsKLQotCQkJY2FzZSBBQ1BJX1BUWVBFMl9NSU46Ci0KLQkJCQkvKiBFYWNoIHN1Yi1wYWNrYWdlIGhhcyBhIHZhcmlhYmxlIGJ1dCBtaW5pbXVtIGxlbmd0aCAqLwotCi0JCQkJZXhwZWN0ZWRfY291bnQgPSBwYWNrYWdlLT5yZXRfaW5mby5jb3VudDE7Ci0JCQkJaWYgKHN1Yl9wYWNrYWdlLT5wYWNrYWdlLmNvdW50IDwgZXhwZWN0ZWRfY291bnQpIHsKLQkJCQkJY291bnQgPSBzdWJfcGFja2FnZS0+cGFja2FnZS5jb3VudDsKLQkJCQkJZ290byBwYWNrYWdlX3Rvb19zbWFsbDsKLQkJCQl9Ci0KLQkJCQkvKiBDaGVjayB0aGUgdHlwZSBvZiBlYWNoIHN1Yi1wYWNrYWdlIGVsZW1lbnQgKi8KLQotCQkJCXN0YXR1cyA9Ci0JCQkJICAgIGFjcGlfbnNfY2hlY2tfcGFja2FnZV9lbGVtZW50cyhwYXRobmFtZSwKLQkJCQkJCQkJICAgc3ViX2VsZW1lbnRzLAotCQkJCQkJCQkgICBwYWNrYWdlLT4KLQkJCQkJCQkJICAgcmV0X2luZm8uCi0JCQkJCQkJCSAgIG9iamVjdF90eXBlMSwKLQkJCQkJCQkJICAgc3ViX3BhY2thZ2UtPgotCQkJCQkJCQkgICBwYWNrYWdlLgotCQkJCQkJCQkgICBjb3VudCwgMCwgMCk7Ci0JCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCQkJCXJldHVybiAoc3RhdHVzKTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0KLQkJCWNhc2UgQUNQSV9QVFlQRTJfQ09VTlQ6Ci0KLQkJCQkvKiBGaXJzdCBlbGVtZW50IGlzIHRoZSAoSW50ZWdlcikgY291bnQgb2YgZWxlbWVudHMgdG8gZm9sbG93ICovCi0KLQkJCQlzdGF0dXMgPQotCQkJCSAgICBhY3BpX25zX2NoZWNrX29iamVjdF90eXBlKHBhdGhuYW1lLAotCQkJCQkJCSAgICAgICpzdWJfZWxlbWVudHMsCi0JCQkJCQkJICAgICAgQUNQSV9SVFlQRV9JTlRFR0VSLAotCQkJCQkJCSAgICAgIDApOwotCQkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQkJCQlyZXR1cm4gKHN0YXR1cyk7Ci0JCQkJfQotCi0JCQkJLyogTWFrZSBzdXJlIHBhY2thZ2UgaXMgbGFyZ2UgZW5vdWdoIGZvciB0aGUgQ291bnQgKi8KLQotCQkJCWV4cGVjdGVkX2NvdW50ID0KLQkJCQkgICAgKHUzMikgKCpzdWJfZWxlbWVudHMpLT5pbnRlZ2VyLnZhbHVlOwotCQkJCWlmIChzdWJfcGFja2FnZS0+cGFja2FnZS5jb3VudCA8IGV4cGVjdGVkX2NvdW50KSB7Ci0JCQkJCWNvdW50ID0gc3ViX3BhY2thZ2UtPnBhY2thZ2UuY291bnQ7Ci0JCQkJCWdvdG8gcGFja2FnZV90b29fc21hbGw7Ci0JCQkJfQotCi0JCQkJLyogQ2hlY2sgdGhlIHR5cGUgb2YgZWFjaCBzdWItcGFja2FnZSBlbGVtZW50ICovCi0KLQkJCQlzdGF0dXMgPQotCQkJCSAgICBhY3BpX25zX2NoZWNrX3BhY2thZ2VfZWxlbWVudHMocGF0aG5hbWUsCi0JCQkJCQkJCSAgIChzdWJfZWxlbWVudHMKLQkJCQkJCQkJICAgICsgMSksCi0JCQkJCQkJCSAgIHBhY2thZ2UtPgotCQkJCQkJCQkgICByZXRfaW5mby4KLQkJCQkJCQkJICAgb2JqZWN0X3R5cGUxLAotCQkJCQkJCQkgICAoZXhwZWN0ZWRfY291bnQKLQkJCQkJCQkJICAgIC0gMSksIDAsIDApOwotCQkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQkJCQlyZXR1cm4gKHN0YXR1cyk7Ci0JCQkJfQotCQkJCWJyZWFrOwotCi0JCQlkZWZhdWx0OgotCQkJCWJyZWFrOwotCQkJfQotCi0JCQllbGVtZW50cysrOwotCQl9Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQotCQkvKiBTaG91bGQgbm90IGdldCBoZXJlIGlmIHByZWRlZmluZWQgaW5mbyB0YWJsZSBpcyBjb3JyZWN0ICovCi0KLQkJQUNQSV9XQVJOSU5HKChBRV9JTkZPLAotCQkJICAgICAgIiVzOiBJbnZhbGlkIGludGVybmFsIHJldHVybiB0eXBlIGluIHRhYmxlIGVudHJ5OiAlWCIsCi0JCQkgICAgICBwYXRobmFtZSwgcGFja2FnZS0+cmV0X2luZm8udHlwZSkpOwotCi0JCXJldHVybiAoQUVfQU1MX0lOVEVSTkFMKTsKLQl9Ci0KLQlyZXR1cm4gKEFFX09LKTsKLQotICAgICAgcGFja2FnZV90b29fc21hbGw6Ci0KLQkvKiBFcnJvciBleGl0IGZvciB0aGUgY2FzZSB3aXRoIGFuIGluY29ycmVjdCBwYWNrYWdlIGNvdW50ICovCi0KLQlBQ1BJX1dBUk5JTkcoKEFFX0lORk8sICIlczogUmV0dXJuIFBhY2thZ2UgaXMgdG9vIHNtYWxsIC0gIgotCQkgICAgICAiZm91bmQgJXUsIGV4cGVjdGVkICV1IiwgcGF0aG5hbWUsIGNvdW50LAotCQkgICAgICBleHBlY3RlZF9jb3VudCkpOwotCi0JcmV0dXJuIChBRV9BTUxfT1BFUkFORF9WQUxVRSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfbnNfY2hlY2tfcGFja2FnZV9lbGVtZW50cwotICoKLSAqIFBBUkFNRVRFUlM6ICBQYXRobmFtZSAgICAgICAgLSBGdWxsIHBhdGhuYW1lIHRvIHRoZSBub2RlIChmb3IgZXJyb3IgbXNncykKLSAqICAgICAgICAgICAgICBFbGVtZW50cyAgICAgICAgLSBQb2ludGVyIHRvIHRoZSBwYWNrYWdlIGVsZW1lbnRzIGFycmF5Ci0gKiAgICAgICAgICAgICAgVHlwZTEgICAgICAgICAgIC0gT2JqZWN0IHR5cGUgZm9yIGZpcnN0IGdyb3VwCi0gKiAgICAgICAgICAgICAgQ291bnQxICAgICAgICAgIC0gQ291bnQgZm9yIGZpcnN0IGdyb3VwCi0gKiAgICAgICAgICAgICAgVHlwZTIgICAgICAgICAgIC0gT2JqZWN0IHR5cGUgZm9yIHNlY29uZCBncm91cAotICogICAgICAgICAgICAgIENvdW50MiAgICAgICAgICAtIENvdW50IGZvciBzZWNvbmQgZ3JvdXAKLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IENoZWNrIHRoYXQgYWxsIGVsZW1lbnRzIG9mIGEgcGFja2FnZSBhcmUgb2YgdGhlIGNvcnJlY3Qgb2JqZWN0Ci0gKiAgICAgICAgICAgICAgdHlwZS4gU3VwcG9ydHMgdXAgdG8gdHdvIGdyb3VwcyBvZiBkaWZmZXJlbnQgb2JqZWN0IHR5cGVzLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyBhY3BpX3N0YXR1cwotYWNwaV9uc19jaGVja19wYWNrYWdlX2VsZW1lbnRzKGNoYXIgKnBhdGhuYW1lLAotCQkJICAgICAgIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKiplbGVtZW50cywKLQkJCSAgICAgICB1OCB0eXBlMSwgdTMyIGNvdW50MSwgdTggdHlwZTIsIHUzMiBjb3VudDIpCi17Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKnRoaXNfZWxlbWVudCA9IGVsZW1lbnRzOwotCWFjcGlfc3RhdHVzIHN0YXR1czsKLQl1MzIgaTsKLQotCS8qCi0JICogVXAgdG8gdHdvIGdyb3VwcyBvZiBwYWNrYWdlIGVsZW1lbnRzIGFyZSBzdXBwb3J0ZWQgYnkgdGhlIGRhdGEKLQkgKiBzdHJ1Y3R1cmUuIEFsbCBlbGVtZW50cyBpbiBlYWNoIGdyb3VwIG11c3QgYmUgb2YgdGhlIHNhbWUgdHlwZS4KLQkgKiBUaGUgc2Vjb25kIGdyb3VwIGNhbiBoYXZlIGEgY291bnQgb2YgemVyby4KLQkgKi8KLQlmb3IgKGkgPSAwOyBpIDwgY291bnQxOyBpKyspIHsKLQkJc3RhdHVzID0gYWNwaV9uc19jaGVja19vYmplY3RfdHlwZShwYXRobmFtZSwgKnRoaXNfZWxlbWVudCwKLQkJCQkJCSAgIHR5cGUxLCBpKTsKLQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCQlyZXR1cm4gKHN0YXR1cyk7Ci0JCX0KLQkJdGhpc19lbGVtZW50Kys7Ci0JfQotCi0JZm9yIChpID0gMDsgaSA8IGNvdW50MjsgaSsrKSB7Ci0JCXN0YXR1cyA9IGFjcGlfbnNfY2hlY2tfb2JqZWN0X3R5cGUocGF0aG5hbWUsICp0aGlzX2VsZW1lbnQsCi0JCQkJCQkgICB0eXBlMiwgKGkgKyBjb3VudDEpKTsKLQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCQlyZXR1cm4gKHN0YXR1cyk7Ci0JCX0KLQkJdGhpc19lbGVtZW50Kys7Ci0JfQotCi0JcmV0dXJuIChBRV9PSyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfbnNfY2hlY2tfb2JqZWN0X3R5cGUKLSAqCi0gKiBQQVJBTUVURVJTOiAgUGF0aG5hbWUgICAgICAgIC0gRnVsbCBwYXRobmFtZSB0byB0aGUgbm9kZSAoZm9yIGVycm9yIG1zZ3MpCi0gKiAgICAgICAgICAgICAgcmV0dXJuX29iamVjdCAgIC0gT2JqZWN0IHJldHVybiBmcm9tIHRoZSBleGVjdXRpb24gb2YgdGhpcwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZC9vYmplY3QKLSAqICAgICAgICAgICAgICBleHBlY3RlZF9idHlwZXMgLSBCaXRtYXAgb2YgZXhwZWN0ZWQgcmV0dXJuIHR5cGUocykKLSAqICAgICAgICAgICAgICBwYWNrYWdlX2luZGV4ICAgLSBJbmRleCBvZiBvYmplY3Qgd2l0aGluIHBhcmVudCBwYWNrYWdlIChpZgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGxpY2FibGUgLSBBQ1BJX05PVF9QQUNLQUdFIG90aGVyd2lzZSkKLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IENoZWNrIHRoZSB0eXBlIG9mIHRoZSByZXR1cm4gb2JqZWN0IGFnYWluc3QgdGhlIGV4cGVjdGVkIG9iamVjdAotICogICAgICAgICAgICAgIHR5cGUocykuIFVzZSBvZiBCdHlwZSBhbGxvd3MgbXVsdGlwbGUgZXhwZWN0ZWQgb2JqZWN0IHR5cGVzLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyBhY3BpX3N0YXR1cwotYWNwaV9uc19jaGVja19vYmplY3RfdHlwZShjaGFyICpwYXRobmFtZSwKLQkJCSAgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqcmV0dXJuX29iamVjdCwKLQkJCSAgdTMyIGV4cGVjdGVkX2J0eXBlcywgdTMyIHBhY2thZ2VfaW5kZXgpCi17Ci0JYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7Ci0JdTMyIHJldHVybl9idHlwZTsKLQljaGFyIHR5cGVfYnVmZmVyWzQ4XTsJLyogUm9vbSBmb3IgNSB0eXBlcyAqLwotCXUzMiB0aGlzX3J0eXBlOwotCXUzMiBpOwotCXUzMiBqOwotCi0JLyoKLQkgKiBJZiB3ZSBnZXQgYSBOVUxMIHJldHVybl9vYmplY3QgaGVyZSwgaXQgaXMgYSBOVUxMIHBhY2thZ2UgZWxlbWVudCwKLQkgKiBhbmQgdGhpcyBpcyBhbHdheXMgYW4gZXJyb3IuCi0JICovCi0JaWYgKCFyZXR1cm5fb2JqZWN0KSB7Ci0JCWdvdG8gdHlwZV9lcnJvcl9leGl0OwotCX0KLQotCS8qIEEgTmFtZXNwYWNlIG5vZGUgc2hvdWxkIG5vdCBnZXQgaGVyZSwgYnV0IG1ha2Ugc3VyZSAqLwotCi0JaWYgKEFDUElfR0VUX0RFU0NSSVBUT1JfVFlQRShyZXR1cm5fb2JqZWN0KSA9PSBBQ1BJX0RFU0NfVFlQRV9OQU1FRCkgewotCQlBQ1BJX1dBUk5JTkcoKEFFX0lORk8sCi0JCQkgICAgICAiJXM6IEludmFsaWQgcmV0dXJuIHR5cGUgLSBGb3VuZCBhIE5hbWVzcGFjZSBub2RlIFslNC40c10gdHlwZSAlcyIsCi0JCQkgICAgICBwYXRobmFtZSwgcmV0dXJuX29iamVjdC0+bm9kZS5uYW1lLmFzY2lpLAotCQkJICAgICAgYWNwaV91dF9nZXRfdHlwZV9uYW1lKHJldHVybl9vYmplY3QtPm5vZGUudHlwZSkpKTsKLQkJcmV0dXJuIChBRV9BTUxfT1BFUkFORF9UWVBFKTsKLQl9Ci0KLQkvKgotCSAqIENvbnZlcnQgdGhlIG9iamVjdCB0eXBlIChBQ1BJX1RZUEVfeHh4KSB0byBhIGJpdG1hcHBlZCBvYmplY3QgdHlwZS4KLQkgKiBUaGUgYml0bWFwcGVkIHR5cGUgYWxsb3dzIG11bHRpcGxlIHBvc3NpYmxlIHJldHVybiB0eXBlcy4KLQkgKgotCSAqIE5vdGUsIHRoZSBjYXNlcyBiZWxvdyBtdXN0IGhhbmRsZSBhbGwgb2YgdGhlIHBvc3NpYmxlIHR5cGVzIHJldHVybmVkCi0JICogZnJvbSBhbGwgb2YgdGhlIHByZWRlZmluZWQgbmFtZXMgKGluY2x1ZGluZyBlbGVtZW50cyBvZiByZXR1cm5lZAotCSAqIHBhY2thZ2VzKQotCSAqLwotCXN3aXRjaCAoQUNQSV9HRVRfT0JKRUNUX1RZUEUocmV0dXJuX29iamVjdCkpIHsKLQljYXNlIEFDUElfVFlQRV9JTlRFR0VSOgotCQlyZXR1cm5fYnR5cGUgPSBBQ1BJX1JUWVBFX0lOVEVHRVI7Ci0JCWJyZWFrOwotCi0JY2FzZSBBQ1BJX1RZUEVfQlVGRkVSOgotCQlyZXR1cm5fYnR5cGUgPSBBQ1BJX1JUWVBFX0JVRkZFUjsKLQkJYnJlYWs7Ci0KLQljYXNlIEFDUElfVFlQRV9TVFJJTkc6Ci0JCXJldHVybl9idHlwZSA9IEFDUElfUlRZUEVfU1RSSU5HOwotCQlicmVhazsKLQotCWNhc2UgQUNQSV9UWVBFX1BBQ0tBR0U6Ci0JCXJldHVybl9idHlwZSA9IEFDUElfUlRZUEVfUEFDS0FHRTsKLQkJYnJlYWs7Ci0KLQljYXNlIEFDUElfVFlQRV9MT0NBTF9SRUZFUkVOQ0U6Ci0JCXJldHVybl9idHlwZSA9IEFDUElfUlRZUEVfUkVGRVJFTkNFOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCS8qIE5vdCBvbmUgb2YgdGhlIHN1cHBvcnRlZCBvYmplY3RzLCBtdXN0IGJlIGluY29ycmVjdCAqLwotCi0JCWdvdG8gdHlwZV9lcnJvcl9leGl0OwotCX0KLQotCS8qIElzIHRoZSBvYmplY3Qgb25lIG9mIHRoZSBleHBlY3RlZCB0eXBlcz8gKi8KLQotCWlmICghKHJldHVybl9idHlwZSAmIGV4cGVjdGVkX2J0eXBlcykpIHsKLQkJZ290byB0eXBlX2Vycm9yX2V4aXQ7Ci0JfQotCi0JLyogRm9yIHJlZmVyZW5jZSBvYmplY3RzLCBjaGVjayB0aGF0IHRoZSByZWZlcmVuY2UgdHlwZSBpcyBjb3JyZWN0ICovCi0KLQlpZiAoQUNQSV9HRVRfT0JKRUNUX1RZUEUocmV0dXJuX29iamVjdCkgPT0gQUNQSV9UWVBFX0xPQ0FMX1JFRkVSRU5DRSkgewotCQlzdGF0dXMgPSBhY3BpX25zX2NoZWNrX3JlZmVyZW5jZShwYXRobmFtZSwgcmV0dXJuX29iamVjdCk7Ci0JfQotCi0JcmV0dXJuIChzdGF0dXMpOwotCi0gICAgICB0eXBlX2Vycm9yX2V4aXQ6Ci0KLQkvKiBDcmVhdGUgYSBzdHJpbmcgd2l0aCBhbGwgZXhwZWN0ZWQgdHlwZXMgZm9yIHRoaXMgcHJlZGVmaW5lZCBvYmplY3QgKi8KLQotCWogPSAxOwotCXR5cGVfYnVmZmVyWzBdID0gMDsKLQl0aGlzX3J0eXBlID0gQUNQSV9SVFlQRV9JTlRFR0VSOwotCi0JZm9yIChpID0gMDsgaSA8IEFDUElfTlVNX1JUWVBFUzsgaSsrKSB7Ci0KLQkJLyogSWYgb25lIG9mIHRoZSBleHBlY3RlZCB0eXBlcywgY29uY2F0ZW5hdGUgdGhlIG5hbWUgb2YgdGhpcyB0eXBlICovCi0KLQkJaWYgKGV4cGVjdGVkX2J0eXBlcyAmIHRoaXNfcnR5cGUpIHsKLQkJCUFDUElfU1RSQ0FUKHR5cGVfYnVmZmVyLCAmYWNwaV9ydHlwZV9uYW1lc1tpXVtqXSk7Ci0JCQlqID0gMDsJLyogVXNlIG5hbWUgc2VwYXJhdG9yIGZyb20gbm93IG9uICovCi0JCX0KLQkJdGhpc19ydHlwZSA8PD0gMTsJLyogTmV4dCBSdHlwZSAqLwotCX0KLQotCWlmIChwYWNrYWdlX2luZGV4ID09IEFDUElfTk9UX1BBQ0tBR0UpIHsKLQkJQUNQSV9XQVJOSU5HKChBRV9JTkZPLAotCQkJICAgICAgIiVzOiBSZXR1cm4gdHlwZSBtaXNtYXRjaCAtIGZvdW5kICVzLCBleHBlY3RlZCAlcyIsCi0JCQkgICAgICBwYXRobmFtZSwKLQkJCSAgICAgIGFjcGlfdXRfZ2V0X29iamVjdF90eXBlX25hbWUocmV0dXJuX29iamVjdCksCi0JCQkgICAgICB0eXBlX2J1ZmZlcikpOwotCX0gZWxzZSB7Ci0JCUFDUElfV0FSTklORygoQUVfSU5GTywKLQkJCSAgICAgICIlczogUmV0dXJuIFBhY2thZ2UgdHlwZSBtaXNtYXRjaCBhdCBpbmRleCAldSAtICIKLQkJCSAgICAgICJmb3VuZCAlcywgZXhwZWN0ZWQgJXMiLCBwYXRobmFtZSwgcGFja2FnZV9pbmRleCwKLQkJCSAgICAgIGFjcGlfdXRfZ2V0X29iamVjdF90eXBlX25hbWUocmV0dXJuX29iamVjdCksCi0JCQkgICAgICB0eXBlX2J1ZmZlcikpOwotCX0KLQotCXJldHVybiAoQUVfQU1MX09QRVJBTkRfVFlQRSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfbnNfY2hlY2tfcmVmZXJlbmNlCi0gKgotICogUEFSQU1FVEVSUzogIFBhdGhuYW1lICAgICAgICAtIEZ1bGwgcGF0aG5hbWUgdG8gdGhlIG5vZGUgKGZvciBlcnJvciBtc2dzKQotICogICAgICAgICAgICAgIHJldHVybl9vYmplY3QgICAtIE9iamVjdCByZXR1cm5lZCBmcm9tIHRoZSBldmFsdWF0aW9uIG9mIGEKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Qgb3Igb2JqZWN0Ci0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cwotICoKLSAqIERFU0NSSVBUSU9OOiBDaGVjayBhIHJldHVybmVkIHJlZmVyZW5jZSBvYmplY3QgZm9yIHRoZSBjb3JyZWN0IHJlZmVyZW5jZQotICogICAgICAgICAgICAgIHR5cGUuIFRoZSBvbmx5IHJlZmVyZW5jZSB0eXBlIHRoYXQgY2FuIGJlIHJldHVybmVkIGZyb20gYQotICogICAgICAgICAgICAgIHByZWRlZmluZWQgbWV0aG9kIGlzIGEgbmFtZWQgcmVmZXJlbmNlLiBBbGwgb3RoZXJzIGFyZSBpbnZhbGlkLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyBhY3BpX3N0YXR1cwotYWNwaV9uc19jaGVja19yZWZlcmVuY2UoY2hhciAqcGF0aG5hbWUsCi0JCQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpyZXR1cm5fb2JqZWN0KQotewotCi0JLyoKLQkgKiBDaGVjayB0aGUgcmVmZXJlbmNlIG9iamVjdCBmb3IgdGhlIGNvcnJlY3QgcmVmZXJlbmNlIHR5cGUgKG9wY29kZSkuCi0JICogVGhlIG9ubHkgdHlwZSBvZiByZWZlcmVuY2UgdGhhdCBjYW4gYmUgY29udmVydGVkIHRvIGFuIHVuaW9uIGFjcGlfb2JqZWN0IGlzCi0JICogYSByZWZlcmVuY2UgdG8gYSBuYW1lZCBvYmplY3QgKHJlZmVyZW5jZSBjbGFzczogTkFNRSkKLQkgKi8KLQlpZiAocmV0dXJuX29iamVjdC0+cmVmZXJlbmNlLmNsYXNzID09IEFDUElfUkVGQ0xBU1NfTkFNRSkgewotCQlyZXR1cm4gKEFFX09LKTsKLQl9Ci0KLQlBQ1BJX1dBUk5JTkcoKEFFX0lORk8sCi0JCSAgICAgICIlczogUmV0dXJuIHR5cGUgbWlzbWF0Y2ggLSB1bmV4cGVjdGVkIHJlZmVyZW5jZSBvYmplY3QgdHlwZSBbJXNdICUyLjJYIiwKLQkJICAgICAgcGF0aG5hbWUsIGFjcGlfdXRfZ2V0X3JlZmVyZW5jZV9uYW1lKHJldHVybl9vYmplY3QpLAotCQkgICAgICByZXR1cm5fb2JqZWN0LT5yZWZlcmVuY2UuY2xhc3MpKTsKLQotCXJldHVybiAoQUVfQU1MX09QRVJBTkRfVFlQRSk7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zc2VhcmNoLmMgYi9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zc2VhcmNoLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5YTgwYmYuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc3NlYXJjaC5jCisrKyAvZGV2L251bGwKQEAgLTEsNDE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogTW9kdWxlIE5hbWU6IG5zc2VhcmNoIC0gTmFtZXNwYWNlIHNlYXJjaAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA4LCBJbnRlbCBDb3JwLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAotICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgYXQgbWluaW11bSBhIGRpc2NsYWltZXIKLSAqICAgIHN1YnN0YW50aWFsbHkgc2ltaWxhciB0byB0aGUgIk5PIFdBUlJBTlRZIiBkaXNjbGFpbWVyIGJlbG93Ci0gKiAgICAoIkRpc2NsYWltZXIiKSBhbmQgYW55IHJlZGlzdHJpYnV0aW9uIG11c3QgYmUgY29uZGl0aW9uZWQgdXBvbgotICogICAgaW5jbHVkaW5nIGEgc3Vic3RhbnRpYWxseSBzaW1pbGFyIERpc2NsYWltZXIgcmVxdWlyZW1lbnQgZm9yIGZ1cnRoZXIKLSAqICAgIGJpbmFyeSByZWRpc3RyaWJ1dGlvbi4KLSAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcwotICogICAgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICogU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBOTyBXQVJSQU5UWQotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCi0gKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUwotICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcKLSAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQotICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgotICovCi0KLSNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KLSNpbmNsdWRlIDxhY3BpL2FjbmFtZXNwLmg+Ci0KLSNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX05BTUVTUEFDRQotQUNQSV9NT0RVTEVfTkFNRSgibnNzZWFyY2giKQotCi0vKiBMb2NhbCBwcm90b3R5cGVzICovCi1zdGF0aWMgYWNwaV9zdGF0dXMKLWFjcGlfbnNfc2VhcmNoX3BhcmVudF90cmVlKHUzMiB0YXJnZXRfbmFtZSwKLQkJCSAgIHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlLAotCQkJICAgYWNwaV9vYmplY3RfdHlwZSB0eXBlLAotCQkJICAgc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKipyZXR1cm5fbm9kZSk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfbnNfc2VhcmNoX29uZV9zY29wZQotICoKLSAqIFBBUkFNRVRFUlM6ICB0YXJnZXRfbmFtZSAgICAgLSBBc2NpaSBBQ1BJIG5hbWUgdG8gc2VhcmNoIGZvcgotICogICAgICAgICAgICAgIHBhcmVudF9ub2RlICAgICAtIFN0YXJ0aW5nIG5vZGUgd2hlcmUgc2VhcmNoIHdpbGwgYmVnaW4KLSAqICAgICAgICAgICAgICBUeXBlICAgICAgICAgICAgLSBPYmplY3QgdHlwZSB0byBtYXRjaAotICogICAgICAgICAgICAgIHJldHVybl9ub2RlICAgICAtIFdoZXJlIHRoZSBtYXRjaGVkIE5hbWVkIG9iaiBpcyByZXR1cm5lZAotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKLSAqCi0gKiBERVNDUklQVElPTjogU2VhcmNoIGEgc2luZ2xlIGxldmVsIG9mIHRoZSBuYW1lc3BhY2UuIFBlcmZvcm1zIGEKLSAqICAgICAgICAgICAgICBzaW1wbGUgc2VhcmNoIG9mIHRoZSBzcGVjaWZpZWQgbGV2ZWwsIGFuZCBkb2VzIG5vdCBhZGQKLSAqICAgICAgICAgICAgICBlbnRyaWVzIG9yIHNlYXJjaCBwYXJlbnRzLgotICoKLSAqCi0gKiAgICAgIE5hbWVkIG9iamVjdCBsaXN0cyBhcmUgYnVpbHQgKGFuZCBzdWJzZXF1ZW50bHkgZHVtcGVkKSBpbiB0aGUKLSAqICAgICAgb3JkZXIgaW4gd2hpY2ggdGhlIG5hbWVzIGFyZSBlbmNvdW50ZXJlZCBkdXJpbmcgdGhlIG5hbWVzcGFjZSBsb2FkOwotICoKLSAqICAgICAgQWxsIG5hbWVzcGFjZSBzZWFyY2hpbmcgaXMgbGluZWFyIGluIHRoaXMgaW1wbGVtZW50YXRpb24sIGJ1dAotICogICAgICBjb3VsZCBiZSBlYXNpbHkgbW9kaWZpZWQgdG8gc3VwcG9ydCBhbnkgaW1wcm92ZWQgc2VhcmNoCi0gKiAgICAgIGFsZ29yaXRobS4gSG93ZXZlciwgdGhlIGxpbmVhciBzZWFyY2ggd2FzIGNob3NlbiBmb3Igc2ltcGxpY2l0eQotICogICAgICBhbmQgYmVjYXVzZSB0aGUgdHJlZXMgYXJlIHNtYWxsIGFuZCB0aGUgb3RoZXIgaW50ZXJwcmV0ZXIKLSAqICAgICAgZXhlY3V0aW9uIG92ZXJoZWFkIGlzIHJlbGF0aXZlbHkgaGlnaC4KLSAqCi0gKiAgICAgIE5vdGU6IENQVSBleGVjdXRpb24gYW5hbHlzaXMgaGFzIHNob3duIHRoYXQgdGhlIEFNTCBpbnRlcnByZXRlciBzcGVuZHMKLSAqICAgICAgYSB2ZXJ5IHNtYWxsIHBlcmNlbnRhZ2Ugb2YgaXRzIHRpbWUgc2VhcmNoaW5nIHRoZSBuYW1lc3BhY2UuIFRoZXJlZm9yZSwKLSAqICAgICAgdGhlIGxpbmVhciBzZWFyY2ggc2VlbXMgdG8gYmUgc3VmZmljaWVudCwgYXMgdGhlcmUgd291bGQgc2VlbSB0byBiZQotICogICAgICBsaXR0bGUgdmFsdWUgaW4gaW1wcm92aW5nIHRoZSBzZWFyY2guCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotYWNwaV9zdGF0dXMKLWFjcGlfbnNfc2VhcmNoX29uZV9zY29wZSh1MzIgdGFyZ2V0X25hbWUsCi0JCQkgc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKnBhcmVudF9ub2RlLAotCQkJIGFjcGlfb2JqZWN0X3R5cGUgdHlwZSwKLQkJCSBzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqKnJldHVybl9ub2RlKQotewotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlOwotCi0JQUNQSV9GVU5DVElPTl9UUkFDRShuc19zZWFyY2hfb25lX3Njb3BlKTsKLQotI2lmZGVmIEFDUElfREVCVUdfT1VUUFVUCi0JaWYgKEFDUElfTFZfTkFNRVMgJiBhY3BpX2RiZ19sZXZlbCkgewotCQljaGFyICpzY29wZV9uYW1lOwotCi0JCXNjb3BlX25hbWUgPSBhY3BpX25zX2dldF9leHRlcm5hbF9wYXRobmFtZShwYXJlbnRfbm9kZSk7Ci0JCWlmIChzY29wZV9uYW1lKSB7Ci0JCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX05BTUVTLAotCQkJCQkgICJTZWFyY2hpbmcgJXMgKCVwKSBGb3IgWyU0LjRzXSAoJXMpXG4iLAotCQkJCQkgIHNjb3BlX25hbWUsIHBhcmVudF9ub2RlLAotCQkJCQkgIEFDUElfQ0FTVF9QVFIoY2hhciwgJnRhcmdldF9uYW1lKSwKLQkJCQkJICBhY3BpX3V0X2dldF90eXBlX25hbWUodHlwZSkpKTsKLQotCQkJQUNQSV9GUkVFKHNjb3BlX25hbWUpOwotCQl9Ci0JfQotI2VuZGlmCi0KLQkvKgotCSAqIFNlYXJjaCBmb3IgbmFtZSBhdCB0aGlzIG5hbWVzcGFjZSBsZXZlbCwgd2hpY2ggaXMgdG8gc2F5IHRoYXQgd2UKLQkgKiBtdXN0IHNlYXJjaCBmb3IgdGhlIG5hbWUgYW1vbmcgdGhlIGNoaWxkcmVuIG9mIHRoaXMgb2JqZWN0Ci0JICovCi0Jbm9kZSA9IHBhcmVudF9ub2RlLT5jaGlsZDsKLQl3aGlsZSAobm9kZSkgewotCi0JCS8qIENoZWNrIGZvciBtYXRjaCBhZ2FpbnN0IHRoZSBuYW1lICovCi0KLQkJaWYgKG5vZGUtPm5hbWUuaW50ZWdlciA9PSB0YXJnZXRfbmFtZSkgewotCi0JCQkvKiBSZXNvbHZlIGEgY29udHJvbCBtZXRob2QgYWxpYXMgaWYgYW55ICovCi0KLQkJCWlmIChhY3BpX25zX2dldF90eXBlKG5vZGUpID09Ci0JCQkgICAgQUNQSV9UWVBFX0xPQ0FMX01FVEhPRF9BTElBUykgewotCQkJCW5vZGUgPQotCQkJCSAgICBBQ1BJX0NBU1RfUFRSKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlLAotCQkJCQkJICBub2RlLT5vYmplY3QpOwotCQkJfQotCi0JCQkvKiBGb3VuZCBtYXRjaGluZyBlbnRyeSAqLwotCi0JCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX05BTUVTLAotCQkJCQkgICJOYW1lIFslNC40c10gKCVzKSAlcCBmb3VuZCBpbiBzY29wZSBbJTQuNHNdICVwXG4iLAotCQkJCQkgIEFDUElfQ0FTVF9QVFIoY2hhciwgJnRhcmdldF9uYW1lKSwKLQkJCQkJICBhY3BpX3V0X2dldF90eXBlX25hbWUobm9kZS0+dHlwZSksCi0JCQkJCSAgbm9kZSwKLQkJCQkJICBhY3BpX3V0X2dldF9ub2RlX25hbWUocGFyZW50X25vZGUpLAotCQkJCQkgIHBhcmVudF9ub2RlKSk7Ci0KLQkJCSpyZXR1cm5fbm9kZSA9IG5vZGU7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwotCQl9Ci0KLQkJLyoKLQkJICogVGhlIGxhc3QgZW50cnkgaW4gdGhlIGxpc3QgcG9pbnRzIGJhY2sgdG8gdGhlIHBhcmVudCwKLQkJICogc28gYSBmbGFnIGlzIHVzZWQgdG8gaW5kaWNhdGUgdGhlIGVuZC1vZi1saXN0Ci0JCSAqLwotCQlpZiAobm9kZS0+ZmxhZ3MgJiBBTk9CSl9FTkRfT0ZfUEVFUl9MSVNUKSB7Ci0KLQkJCS8qIFNlYXJjaGVkIGVudGlyZSBsaXN0LCB3ZSBhcmUgZG9uZSAqLwotCi0JCQlicmVhazsKLQkJfQotCi0JCS8qIERpZG4ndCBtYXRjaCBuYW1lLCBtb3ZlIG9uIHRvIHRoZSBuZXh0IHBlZXIgb2JqZWN0ICovCi0KLQkJbm9kZSA9IG5vZGUtPnBlZXI7Ci0JfQotCi0JLyogU2VhcmNoZWQgZW50aXJlIG5hbWVzcGFjZSBsZXZlbCwgbm90IGZvdW5kICovCi0KLQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX05BTUVTLAotCQkJICAiTmFtZSBbJTQuNHNdICglcykgbm90IGZvdW5kIGluIHNlYXJjaCBpbiBzY29wZSBbJTQuNHNdICVwIGZpcnN0IGNoaWxkICVwXG4iLAotCQkJICBBQ1BJX0NBU1RfUFRSKGNoYXIsICZ0YXJnZXRfbmFtZSksCi0JCQkgIGFjcGlfdXRfZ2V0X3R5cGVfbmFtZSh0eXBlKSwKLQkJCSAgYWNwaV91dF9nZXRfbm9kZV9uYW1lKHBhcmVudF9ub2RlKSwgcGFyZW50X25vZGUsCi0JCQkgIHBhcmVudF9ub2RlLT5jaGlsZCkpOwotCi0JcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PVF9GT1VORCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfbnNfc2VhcmNoX3BhcmVudF90cmVlCi0gKgotICogUEFSQU1FVEVSUzogIHRhcmdldF9uYW1lICAgICAtIEFzY2lpIEFDUEkgbmFtZSB0byBzZWFyY2ggZm9yCi0gKiAgICAgICAgICAgICAgTm9kZSAgICAgICAgICAgIC0gU3RhcnRpbmcgbm9kZSB3aGVyZSBzZWFyY2ggd2lsbCBiZWdpbgotICogICAgICAgICAgICAgIFR5cGUgICAgICAgICAgICAtIE9iamVjdCB0eXBlIHRvIG1hdGNoCi0gKiAgICAgICAgICAgICAgcmV0dXJuX25vZGUgICAgIC0gV2hlcmUgdGhlIG1hdGNoZWQgTm9kZSBpcyByZXR1cm5lZAotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKLSAqCi0gKiBERVNDUklQVElPTjogQ2FsbGVkIHdoZW4gYSBuYW1lIGhhcyBub3QgYmVlbiBmb3VuZCBpbiB0aGUgY3VycmVudCBuYW1lc3BhY2UKLSAqICAgICAgICAgICAgICBsZXZlbC4gQmVmb3JlIGFkZGluZyBpdCBvciBnaXZpbmcgdXAsIEFDUEkgc2NvcGUgcnVsZXMgcmVxdWlyZQotICogICAgICAgICAgICAgIHNlYXJjaGluZyBlbmNsb3Npbmcgc2NvcGVzIGluIGNhc2VzIGlkZW50aWZpZWQgYnkgYWNwaV9uc19sb2NhbCgpLgotICoKLSAqICAgICAgICAgICAgICAiQSBuYW1lIGlzIGxvY2F0ZWQgYnkgZmluZGluZyB0aGUgbWF0Y2hpbmcgbmFtZSBpbiB0aGUgY3VycmVudAotICogICAgICAgICAgICAgIG5hbWUgc3BhY2UsIGFuZCB0aGVuIGluIHRoZSBwYXJlbnQgbmFtZSBzcGFjZS4gSWYgdGhlIHBhcmVudAotICogICAgICAgICAgICAgIG5hbWUgc3BhY2UgZG9lcyBub3QgY29udGFpbiB0aGUgbmFtZSwgdGhlIHNlYXJjaCBjb250aW51ZXMKLSAqICAgICAgICAgICAgICByZWN1cnNpdmVseSB1bnRpbCBlaXRoZXIgdGhlIG5hbWUgaXMgZm91bmQgb3IgdGhlIG5hbWUgc3BhY2UKLSAqICAgICAgICAgICAgICBkb2VzIG5vdCBoYXZlIGEgcGFyZW50ICh0aGUgcm9vdCBvZiB0aGUgbmFtZSBzcGFjZSkuIFRoaXMKLSAqICAgICAgICAgICAgICBpbmRpY2F0ZXMgdGhhdCB0aGUgbmFtZSBpcyBub3QgZm91bmQiIChGcm9tIEFDUEkgU3BlY2lmaWNhdGlvbiwKLSAqICAgICAgICAgICAgICBzZWN0aW9uIDUuMykKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgYWNwaV9zdGF0dXMKLWFjcGlfbnNfc2VhcmNoX3BhcmVudF90cmVlKHUzMiB0YXJnZXRfbmFtZSwKLQkJCSAgIHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlLAotCQkJICAgYWNwaV9vYmplY3RfdHlwZSB0eXBlLAotCQkJICAgc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKipyZXR1cm5fbm9kZSkKLXsKLQlhY3BpX3N0YXR1cyBzdGF0dXM7Ci0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKnBhcmVudF9ub2RlOwotCi0JQUNQSV9GVU5DVElPTl9UUkFDRShuc19zZWFyY2hfcGFyZW50X3RyZWUpOwotCi0JcGFyZW50X25vZGUgPSBhY3BpX25zX2dldF9wYXJlbnRfbm9kZShub2RlKTsKLQotCS8qCi0JICogSWYgdGhlcmUgaXMgbm8gcGFyZW50IChpLmUuLCB3ZSBhcmUgYXQgdGhlIHJvb3QpIG9yIHR5cGUgaXMgImxvY2FsIiwKLQkgKiB3ZSB3b24ndCBiZSBzZWFyY2hpbmcgdGhlIHBhcmVudCB0cmVlLgotCSAqLwotCWlmICghcGFyZW50X25vZGUpIHsKLQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9OQU1FUywgIlslNC40c10gaGFzIG5vIHBhcmVudFxuIiwKLQkJCQkgIEFDUElfQ0FTVF9QVFIoY2hhciwgJnRhcmdldF9uYW1lKSkpOwotCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9UX0ZPVU5EKTsKLQl9Ci0KLQlpZiAoYWNwaV9uc19sb2NhbCh0eXBlKSkgewotCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX05BTUVTLAotCQkJCSAgIlslNC40c10gdHlwZSBbJXNdIG11c3QgYmUgbG9jYWwgdG8gdGhpcyBzY29wZSAobm8gcGFyZW50IHNlYXJjaClcbiIsCi0JCQkJICBBQ1BJX0NBU1RfUFRSKGNoYXIsICZ0YXJnZXRfbmFtZSksCi0JCQkJICBhY3BpX3V0X2dldF90eXBlX25hbWUodHlwZSkpKTsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PVF9GT1VORCk7Ci0JfQotCi0JLyogU2VhcmNoIHRoZSBwYXJlbnQgdHJlZSAqLwotCi0JQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9OQU1FUywKLQkJCSAgIlNlYXJjaGluZyBwYXJlbnQgWyU0LjRzXSBmb3IgWyU0LjRzXVxuIiwKLQkJCSAgYWNwaV91dF9nZXRfbm9kZV9uYW1lKHBhcmVudF9ub2RlKSwKLQkJCSAgQUNQSV9DQVNUX1BUUihjaGFyLCAmdGFyZ2V0X25hbWUpKSk7Ci0KLQkvKgotCSAqIFNlYXJjaCBwYXJlbnRzIHVudGlsIHRhcmdldCBpcyBmb3VuZCBvciB3ZSBoYXZlIGJhY2tlZCB1cCB0byB0aGUgcm9vdAotCSAqLwotCXdoaWxlIChwYXJlbnRfbm9kZSkgewotCQkvKgotCQkgKiBTZWFyY2ggcGFyZW50IHNjb3BlLiBVc2UgVFlQRV9BTlkgYmVjYXVzZSB3ZSBkb24ndCBjYXJlIGFib3V0IHRoZQotCQkgKiBvYmplY3QgdHlwZSBhdCB0aGlzIHBvaW50LCB3ZSBvbmx5IGNhcmUgYWJvdXQgdGhlIGV4aXN0ZW5jZSBvZgotCQkgKiB0aGUgYWN0dWFsIG5hbWUgd2UgYXJlIHNlYXJjaGluZyBmb3IuIFR5cGVjaGVja2luZyBjb21lcyBsYXRlci4KLQkJICovCi0JCXN0YXR1cyA9Ci0JCSAgICBhY3BpX25zX3NlYXJjaF9vbmVfc2NvcGUodGFyZ2V0X25hbWUsIHBhcmVudF9ub2RlLAotCQkJCQkgICAgIEFDUElfVFlQRV9BTlksIHJldHVybl9ub2RlKTsKLQkJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKSB7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLQkJfQotCi0JCS8qIE5vdCBmb3VuZCBoZXJlLCBnbyB1cCBhbm90aGVyIGxldmVsICh1bnRpbCB3ZSByZWFjaCB0aGUgcm9vdCkgKi8KLQotCQlwYXJlbnRfbm9kZSA9IGFjcGlfbnNfZ2V0X3BhcmVudF9ub2RlKHBhcmVudF9ub2RlKTsKLQl9Ci0KLQkvKiBOb3QgZm91bmQgaW4gcGFyZW50IHRyZWUgKi8KLQotCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT1RfRk9VTkQpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX25zX3NlYXJjaF9hbmRfZW50ZXIKLSAqCi0gKiBQQVJBTUVURVJTOiAgdGFyZ2V0X25hbWUgICAgICAgICAtIEFzY2lpIEFDUEkgbmFtZSB0byBzZWFyY2ggZm9yICg0IGNoYXJzKQotICogICAgICAgICAgICAgIHdhbGtfc3RhdGUgICAgICAgICAgLSBDdXJyZW50IHN0YXRlIG9mIHRoZSB3YWxrCi0gKiAgICAgICAgICAgICAgTm9kZSAgICAgICAgICAgICAgICAtIFN0YXJ0aW5nIG5vZGUgd2hlcmUgc2VhcmNoIHdpbGwgYmVnaW4KLSAqICAgICAgICAgICAgICBpbnRlcnByZXRlcl9tb2RlICAgIC0gQWRkIG5hbWVzIG9ubHkgaW4gQUNQSV9NT0RFX0xPQURfUEFTU194LgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdGhlcndpc2Usc2VhcmNoIG9ubHkuCi0gKiAgICAgICAgICAgICAgVHlwZSAgICAgICAgICAgICAgICAtIE9iamVjdCB0eXBlIHRvIG1hdGNoCi0gKiAgICAgICAgICAgICAgRmxhZ3MgICAgICAgICAgICAgICAtIEZsYWdzIGRlc2NyaWJpbmcgdGhlIHNlYXJjaCByZXN0cmljdGlvbnMKLSAqICAgICAgICAgICAgICByZXR1cm5fbm9kZSAgICAgICAgIC0gV2hlcmUgdGhlIE5vZGUgaXMgcmV0dXJuZWQKLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IFNlYXJjaCBmb3IgYSBuYW1lIHNlZ21lbnQgaW4gYSBzaW5nbGUgbmFtZXNwYWNlIGxldmVsLAotICogICAgICAgICAgICAgIG9wdGlvbmFsbHkgYWRkaW5nIGl0IGlmIGl0IGlzIG5vdCBmb3VuZC4gSWYgdGhlIHBhc3NlZAotICogICAgICAgICAgICAgIFR5cGUgaXMgbm90IEFueSBhbmQgdGhlIHR5cGUgcHJldmlvdXNseSBzdG9yZWQgaW4gdGhlCi0gKiAgICAgICAgICAgICAgZW50cnkgd2FzIEFueSAoaS5lLiB1bmtub3duKSwgdXBkYXRlIHRoZSBzdG9yZWQgdHlwZS4KLSAqCi0gKiAgICAgICAgICAgICAgSW4gQUNQSV9JTU9ERV9FWEVDVVRFLCBzZWFyY2ggb25seS4KLSAqICAgICAgICAgICAgICBJbiBvdGhlciBtb2Rlcywgc2VhcmNoIGFuZCBhZGQgaWYgbm90IGZvdW5kLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWFjcGlfc3RhdHVzCi1hY3BpX25zX3NlYXJjaF9hbmRfZW50ZXIodTMyIHRhcmdldF9uYW1lLAotCQkJIHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUsCi0JCQkgc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGUsCi0JCQkgYWNwaV9pbnRlcnByZXRlcl9tb2RlIGludGVycHJldGVyX21vZGUsCi0JCQkgYWNwaV9vYmplY3RfdHlwZSB0eXBlLAotCQkJIHUzMiBmbGFncywgc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKipyZXR1cm5fbm9kZSkKLXsKLQlhY3BpX3N0YXR1cyBzdGF0dXM7Ci0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5ld19ub2RlOwotCi0JQUNQSV9GVU5DVElPTl9UUkFDRShuc19zZWFyY2hfYW5kX2VudGVyKTsKLQotCS8qIFBhcmFtZXRlciB2YWxpZGF0aW9uICovCi0KLQlpZiAoIW5vZGUgfHwgIXRhcmdldF9uYW1lIHx8ICFyZXR1cm5fbm9kZSkgewotCQlBQ1BJX0VSUk9SKChBRV9JTkZPLAotCQkJICAgICJOdWxsIHBhcmFtZXRlcjogTm9kZSAlcCBOYW1lICVYIFJldHVybk5vZGUgJXAiLAotCQkJICAgIG5vZGUsIHRhcmdldF9uYW1lLCByZXR1cm5fbm9kZSkpOwotCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX1BBUkFNRVRFUik7Ci0JfQotCi0JLyoKLQkgKiBOYW1lIG11c3QgY29uc2lzdCBvZiB2YWxpZCBBQ1BJIGNoYXJhY3RlcnMuIFdlIHdpbGwgcmVwYWlyIHRoZSBuYW1lIGlmCi0JICogbmVjZXNzYXJ5IGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCB0byBhYm9ydCBiZWNhdXNlIG9mIHRoaXMsIGJ1dCB3ZSB3YW50Ci0JICogYWxsIG5hbWVzcGFjZSBuYW1lcyB0byBiZSBwcmludGFibGUuIEEgd2FybmluZyBtZXNzYWdlIGlzIGFwcHJvcHJpYXRlLgotCSAqCi0JICogVGhpcyBpc3N1ZSBjYW1lIHVwIGJlY2F1c2UgdGhlcmUgYXJlIGluIGZhY3QgbWFjaGluZXMgdGhhdCBleGhpYml0Ci0JICogdGhpcyBwcm9ibGVtLCBhbmQgd2Ugd2FudCB0byBiZSBhYmxlIHRvIGVuYWJsZSBBQ1BJIHN1cHBvcnQgZm9yIHRoZW0sCi0JICogZXZlbiB0aG91Z2ggdGhlcmUgYXJlIGEgZmV3IGJhZCBuYW1lcy4KLQkgKi8KLQlpZiAoIWFjcGlfdXRfdmFsaWRfYWNwaV9uYW1lKHRhcmdldF9uYW1lKSkgewotCQl0YXJnZXRfbmFtZSA9Ci0JCSAgICBhY3BpX3V0X3JlcGFpcl9uYW1lKEFDUElfQ0FTVF9QVFIoY2hhciwgJnRhcmdldF9uYW1lKSk7Ci0KLQkJLyogUmVwb3J0IHdhcm5pbmcgb25seSBpZiBpbiBzdHJpY3QgbW9kZSBvciBkZWJ1ZyBtb2RlICovCi0KLQkJaWYgKCFhY3BpX2dibF9lbmFibGVfaW50ZXJwcmV0ZXJfc2xhY2spIHsKLQkJCUFDUElfV0FSTklORygoQUVfSU5GTywKLQkJCQkgICAgICAiRm91bmQgYmFkIGNoYXJhY3RlcihzKSBpbiBuYW1lLCByZXBhaXJlZDogWyU0LjRzXVxuIiwKLQkJCQkgICAgICBBQ1BJX0NBU1RfUFRSKGNoYXIsICZ0YXJnZXRfbmFtZSkpKTsKLQkJfSBlbHNlIHsKLQkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywKLQkJCQkJICAiRm91bmQgYmFkIGNoYXJhY3RlcihzKSBpbiBuYW1lLCByZXBhaXJlZDogWyU0LjRzXVxuIiwKLQkJCQkJICBBQ1BJX0NBU1RfUFRSKGNoYXIsICZ0YXJnZXRfbmFtZSkpKTsKLQkJfQotCX0KLQotCS8qIFRyeSB0byBmaW5kIHRoZSBuYW1lIGluIHRoZSBuYW1lc3BhY2UgbGV2ZWwgc3BlY2lmaWVkIGJ5IHRoZSBjYWxsZXIgKi8KLQotCSpyZXR1cm5fbm9kZSA9IEFDUElfRU5UUllfTk9UX0ZPVU5EOwotCXN0YXR1cyA9IGFjcGlfbnNfc2VhcmNoX29uZV9zY29wZSh0YXJnZXRfbmFtZSwgbm9kZSwgdHlwZSwgcmV0dXJuX25vZGUpOwotCWlmIChzdGF0dXMgIT0gQUVfTk9UX0ZPVU5EKSB7Ci0JCS8qCi0JCSAqIElmIHdlIGZvdW5kIGl0IEFORCB0aGUgcmVxdWVzdCBzcGVjaWZpZXMgdGhhdCBhIGZpbmQgaXMgYW4gZXJyb3IsCi0JCSAqIHJldHVybiB0aGUgZXJyb3IKLQkJICovCi0JCWlmICgoc3RhdHVzID09IEFFX09LKSAmJiAoZmxhZ3MgJiBBQ1BJX05TX0VSUk9SX0lGX0ZPVU5EKSkgewotCQkJc3RhdHVzID0gQUVfQUxSRUFEWV9FWElTVFM7Ci0JCX0KLQotCQkvKiBFaXRoZXIgZm91bmQgaXQgb3IgdGhlcmUgd2FzIGFuIGVycm9yOiBmaW5pc2hlZCBlaXRoZXIgd2F5ICovCi0KLQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci0JfQotCi0JLyoKLQkgKiBUaGUgbmFtZSB3YXMgbm90IGZvdW5kLiBJZiB3ZSBhcmUgTk9UIHBlcmZvcm1pbmcgdGhlIGZpcnN0IHBhc3MKLQkgKiAobmFtZSBlbnRyeSkgb2YgbG9hZGluZyB0aGUgbmFtZXNwYWNlLCBzZWFyY2ggdGhlIHBhcmVudCB0cmVlIChhbGwgdGhlCi0JICogd2F5IHRvIHRoZSByb290IGlmIG5lY2Vzc2FyeS4pIFdlIGRvbid0IHdhbnQgdG8gcGVyZm9ybSB0aGUgcGFyZW50Ci0JICogc2VhcmNoIHdoZW4gdGhlIG5hbWVzcGFjZSBpcyBhY3R1YWxseSBiZWluZyBsb2FkZWQuIFdlIHdhbnQgdG8gcGVyZm9ybQotCSAqIHRoZSBzZWFyY2ggd2hlbiBuYW1lc3BhY2UgcmVmZXJlbmNlcyBhcmUgYmVpbmcgcmVzb2x2ZWQgKGxvYWQgcGFzcyAyKQotCSAqIGFuZCBkdXJpbmcgdGhlIGV4ZWN1dGlvbiBwaGFzZS4KLQkgKi8KLQlpZiAoKGludGVycHJldGVyX21vZGUgIT0gQUNQSV9JTU9ERV9MT0FEX1BBU1MxKSAmJgotCSAgICAoZmxhZ3MgJiBBQ1BJX05TX1NFQVJDSF9QQVJFTlQpKSB7Ci0JCS8qCi0JCSAqIE5vdCBmb3VuZCBhdCB0aGlzIGxldmVsIC0gc2VhcmNoIHBhcmVudCB0cmVlIGFjY29yZGluZyB0byB0aGUKLQkJICogQUNQSSBzcGVjaWZpY2F0aW9uCi0JCSAqLwotCQlzdGF0dXMgPQotCQkgICAgYWNwaV9uc19zZWFyY2hfcGFyZW50X3RyZWUodGFyZ2V0X25hbWUsIG5vZGUsIHR5cGUsCi0JCQkJCSAgICAgICByZXR1cm5fbm9kZSk7Ci0JCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkgewotCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci0JCX0KLQl9Ci0KLQkvKiBJbiBleGVjdXRlIG1vZGUsIGp1c3Qgc2VhcmNoLCBuZXZlciBhZGQgbmFtZXMuIEV4aXQgbm93ICovCi0KLQlpZiAoaW50ZXJwcmV0ZXJfbW9kZSA9PSBBQ1BJX0lNT0RFX0VYRUNVVEUpIHsKLQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9OQU1FUywKLQkJCQkgICIlNC40cyBOb3QgZm91bmQgaW4gJXAgW05vdCBhZGRpbmddXG4iLAotCQkJCSAgQUNQSV9DQVNUX1BUUihjaGFyLCAmdGFyZ2V0X25hbWUpLCBub2RlKSk7Ci0KLQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PVF9GT1VORCk7Ci0JfQotCi0JLyogQ3JlYXRlIHRoZSBuZXcgbmFtZWQgb2JqZWN0ICovCi0KLQluZXdfbm9kZSA9IGFjcGlfbnNfY3JlYXRlX25vZGUodGFyZ2V0X25hbWUpOwotCWlmICghbmV3X25vZGUpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX01FTU9SWSk7Ci0JfQotI2lmZGVmIEFDUElfQVNMX0NPTVBJTEVSCi0JLyoKLQkgKiBOb2RlIGlzIGFuIG9iamVjdCBkZWZpbmVkIGJ5IGFuIEV4dGVybmFsKCkgc3RhdGVtZW50Ci0JICovCi0JaWYgKGZsYWdzICYgQUNQSV9OU19FWFRFUk5BTCkgewotCQluZXdfbm9kZS0+ZmxhZ3MgfD0gQU5PQkpfSVNfRVhURVJOQUw7Ci0JfQotI2VuZGlmCi0KLQlpZiAoZmxhZ3MgJiBBQ1BJX05TX1RFTVBPUkFSWSkgewotCQluZXdfbm9kZS0+ZmxhZ3MgfD0gQU5PQkpfVEVNUE9SQVJZOwotCX0KLQotCS8qIEluc3RhbGwgdGhlIG5ldyBvYmplY3QgaW50byB0aGUgcGFyZW50J3MgbGlzdCBvZiBjaGlsZHJlbiAqLwotCi0JYWNwaV9uc19pbnN0YWxsX25vZGUod2Fsa19zdGF0ZSwgbm9kZSwgbmV3X25vZGUsIHR5cGUpOwotCSpyZXR1cm5fbm9kZSA9IG5ld19ub2RlOwotCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zdXRpbHMuYyBiL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnN1dGlscy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDgxN2UxLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnN1dGlscy5jCisrKyAvZGV2L251bGwKQEAgLTEsOTkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBNb2R1bGUgTmFtZTogbnN1dGlscyAtIFV0aWxpdGllcyBmb3IgYWNjZXNzaW5nIEFDUEkgbmFtZXNwYWNlLCBhY2Nlc3NpbmcKLSAqICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50cyBhbmQgc2libGluZ3MgYW5kIFNjb3BlIG1hbmlwdWxhdGlvbgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDgsIEludGVsIENvcnAuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCi0gKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSBhdCBtaW5pbXVtIGEgZGlzY2xhaW1lcgotICogICAgc3Vic3RhbnRpYWxseSBzaW1pbGFyIHRvIHRoZSAiTk8gV0FSUkFOVFkiIGRpc2NsYWltZXIgYmVsb3cKLSAqICAgICgiRGlzY2xhaW1lciIpIGFuZCBhbnkgcmVkaXN0cmlidXRpb24gbXVzdCBiZSBjb25kaXRpb25lZCB1cG9uCi0gKiAgICBpbmNsdWRpbmcgYSBzdWJzdGFudGlhbGx5IHNpbWlsYXIgRGlzY2xhaW1lciByZXF1aXJlbWVudCBmb3IgZnVydGhlcgotICogICAgYmluYXJ5IHJlZGlzdHJpYnV0aW9uLgotICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzCi0gKiAgICBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIE5PIFdBUlJBTlRZCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKLSAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCi0gKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORwotICogSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCi0gKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCi0gKi8KLQotI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgotI2luY2x1ZGUgPGFjcGkvYWNuYW1lc3AuaD4KLSNpbmNsdWRlIDxhY3BpL2FtbGNvZGUuaD4KLSNpbmNsdWRlIDxhY3BpL2FjdGFibGVzLmg+Ci0KLSNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX05BTUVTUEFDRQotQUNQSV9NT0RVTEVfTkFNRSgibnN1dGlscyIpCi0KLS8qIExvY2FsIHByb3RvdHlwZXMgKi8KLXN0YXRpYyB1OCBhY3BpX25zX3ZhbGlkX3BhdGhfc2VwYXJhdG9yKGNoYXIgc2VwKTsKLQotI2lmZGVmIEFDUElfT0JTT0xFVEVfRlVOQ1RJT05TCi1hY3BpX25hbWUgYWNwaV9uc19maW5kX3BhcmVudF9uYW1lKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlX3RvX3NlYXJjaCk7Ci0jZW5kaWYKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9uc19yZXBvcnRfZXJyb3IKLSAqCi0gKiBQQVJBTUVURVJTOiAgbW9kdWxlX25hbWUgICAgICAgICAtIENhbGxlcidzIG1vZHVsZSBuYW1lIChmb3IgZXJyb3Igb3V0cHV0KQotICogICAgICAgICAgICAgIGxpbmVfbnVtYmVyICAgICAgICAgLSBDYWxsZXIncyBsaW5lIG51bWJlciAoZm9yIGVycm9yIG91dHB1dCkKLSAqICAgICAgICAgICAgICBpbnRlcm5hbF9uYW1lICAgICAgIC0gTmFtZSBvciBwYXRoIG9mIHRoZSBuYW1lc3BhY2Ugbm9kZQotICogICAgICAgICAgICAgIGxvb2t1cF9zdGF0dXMgICAgICAgLSBFeGNlcHRpb24gY29kZSBmcm9tIE5TIGxvb2t1cAotICoKLSAqIFJFVFVSTjogICAgICBOb25lCi0gKgotICogREVTQ1JJUFRJT046IFByaW50IHdhcm5pbmcgbWVzc2FnZSB3aXRoIGZ1bGwgcGF0aG5hbWUKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi12b2lkCi1hY3BpX25zX3JlcG9ydF9lcnJvcihjb25zdCBjaGFyICptb2R1bGVfbmFtZSwKLQkJICAgICB1MzIgbGluZV9udW1iZXIsCi0JCSAgICAgY29uc3QgY2hhciAqaW50ZXJuYWxfbmFtZSwgYWNwaV9zdGF0dXMgbG9va3VwX3N0YXR1cykKLXsKLQlhY3BpX3N0YXR1cyBzdGF0dXM7Ci0JdTMyIGJhZF9uYW1lOwotCWNoYXIgKm5hbWUgPSBOVUxMOwotCi0JYWNwaV9vc19wcmludGYoIkFDUEkgRXJyb3IgKCVzLSUwNGQpOiAiLCBtb2R1bGVfbmFtZSwgbGluZV9udW1iZXIpOwotCi0JaWYgKGxvb2t1cF9zdGF0dXMgPT0gQUVfQkFEX0NIQVJBQ1RFUikgewotCi0JCS8qIFRoZXJlIGlzIGEgbm9uLWFzY2lpIGNoYXJhY3RlciBpbiB0aGUgbmFtZSAqLwotCi0JCUFDUElfTU9WRV8zMl9UT18zMigmYmFkX25hbWUsIGludGVybmFsX25hbWUpOwotCQlhY3BpX29zX3ByaW50ZigiWzB4JTQuNFhdIChOT04tQVNDSUkpIiwgYmFkX25hbWUpOwotCX0gZWxzZSB7Ci0JCS8qIENvbnZlcnQgcGF0aCB0byBleHRlcm5hbCBmb3JtYXQgKi8KLQotCQlzdGF0dXMgPSBhY3BpX25zX2V4dGVybmFsaXplX25hbWUoQUNQSV9VSU5UMzJfTUFYLAotCQkJCQkJICBpbnRlcm5hbF9uYW1lLCBOVUxMLCAmbmFtZSk7Ci0KLQkJLyogUHJpbnQgdGFyZ2V0IG5hbWUgKi8KLQotCQlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpIHsKLQkJCWFjcGlfb3NfcHJpbnRmKCJbJXNdIiwgbmFtZSk7Ci0JCX0gZWxzZSB7Ci0JCQlhY3BpX29zX3ByaW50ZigiW0NPVUxEIE5PVCBFWFRFUk5BTElaRSBOQU1FXSIpOwotCQl9Ci0KLQkJaWYgKG5hbWUpIHsKLQkJCUFDUElfRlJFRShuYW1lKTsKLQkJfQotCX0KLQotCWFjcGlfb3NfcHJpbnRmKCIgTmFtZXNwYWNlIGxvb2t1cCBmYWlsdXJlLCAlc1xuIiwKLQkJICAgICAgIGFjcGlfZm9ybWF0X2V4Y2VwdGlvbihsb29rdXBfc3RhdHVzKSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfbnNfcmVwb3J0X21ldGhvZF9lcnJvcgotICoKLSAqIFBBUkFNRVRFUlM6ICBtb2R1bGVfbmFtZSAgICAgICAgIC0gQ2FsbGVyJ3MgbW9kdWxlIG5hbWUgKGZvciBlcnJvciBvdXRwdXQpCi0gKiAgICAgICAgICAgICAgbGluZV9udW1iZXIgICAgICAgICAtIENhbGxlcidzIGxpbmUgbnVtYmVyIChmb3IgZXJyb3Igb3V0cHV0KQotICogICAgICAgICAgICAgIE1lc3NhZ2UgICAgICAgICAgICAgLSBFcnJvciBtZXNzYWdlIHRvIHVzZSBvbiBmYWlsdXJlCi0gKiAgICAgICAgICAgICAgcHJlZml4X25vZGUgICAgICAgICAtIFByZWZpeCByZWxhdGl2ZSB0byB0aGUgcGF0aAotICogICAgICAgICAgICAgIFBhdGggICAgICAgICAgICAgICAgLSBQYXRoIHRvIHRoZSBub2RlIChvcHRpb25hbCkKLSAqICAgICAgICAgICAgICBtZXRob2Rfc3RhdHVzICAgICAgIC0gRXhlY3V0aW9uIHN0YXR1cwotICoKLSAqIFJFVFVSTjogICAgICBOb25lCi0gKgotICogREVTQ1JJUFRJT046IFByaW50IHdhcm5pbmcgbWVzc2FnZSB3aXRoIGZ1bGwgcGF0aG5hbWUKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi12b2lkCi1hY3BpX25zX3JlcG9ydF9tZXRob2RfZXJyb3IoY29uc3QgY2hhciAqbW9kdWxlX25hbWUsCi0JCQkgICAgdTMyIGxpbmVfbnVtYmVyLAotCQkJICAgIGNvbnN0IGNoYXIgKm1lc3NhZ2UsCi0JCQkgICAgc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKnByZWZpeF9ub2RlLAotCQkJICAgIGNvbnN0IGNoYXIgKnBhdGgsIGFjcGlfc3RhdHVzIG1ldGhvZF9zdGF0dXMpCi17Ci0JYWNwaV9zdGF0dXMgc3RhdHVzOwotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlID0gcHJlZml4X25vZGU7Ci0KLQlhY3BpX29zX3ByaW50ZigiQUNQSSBFcnJvciAoJXMtJTA0ZCk6ICIsIG1vZHVsZV9uYW1lLCBsaW5lX251bWJlcik7Ci0KLQlpZiAocGF0aCkgewotCQlzdGF0dXMgPQotCQkgICAgYWNwaV9uc19nZXRfbm9kZShwcmVmaXhfbm9kZSwgcGF0aCwgQUNQSV9OU19OT19VUFNFQVJDSCwKLQkJCQkgICAgICZub2RlKTsKLQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCQlhY3BpX29zX3ByaW50ZigiW0NvdWxkIG5vdCBnZXQgbm9kZSBieSBwYXRobmFtZV0iKTsKLQkJfQotCX0KLQotCWFjcGlfbnNfcHJpbnRfbm9kZV9wYXRobmFtZShub2RlLCBtZXNzYWdlKTsKLQlhY3BpX29zX3ByaW50ZigiLCAlc1xuIiwgYWNwaV9mb3JtYXRfZXhjZXB0aW9uKG1ldGhvZF9zdGF0dXMpKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9uc19wcmludF9ub2RlX3BhdGhuYW1lCi0gKgotICogUEFSQU1FVEVSUzogIE5vZGUgICAgICAgICAgICAtIE9iamVjdAotICogICAgICAgICAgICAgIE1lc3NhZ2UgICAgICAgICAtIFByZWZpeCBtZXNzYWdlCi0gKgotICogREVTQ1JJUFRJT046IFByaW50IGFuIG9iamVjdCdzIGZ1bGwgbmFtZXNwYWNlIHBhdGhuYW1lCi0gKiAgICAgICAgICAgICAgTWFuYWdlcyBhbGxvY2F0aW9uL2ZyZWVpbmcgb2YgYSBwYXRobmFtZSBidWZmZXIKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi12b2lkCi1hY3BpX25zX3ByaW50X25vZGVfcGF0aG5hbWUoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGUsCi0JCQkgICAgY29uc3QgY2hhciAqbWVzc2FnZSkKLXsKLQlzdHJ1Y3QgYWNwaV9idWZmZXIgYnVmZmVyOwotCWFjcGlfc3RhdHVzIHN0YXR1czsKLQotCWlmICghbm9kZSkgewotCQlhY3BpX29zX3ByaW50ZigiW05VTEwgTkFNRV0iKTsKLQkJcmV0dXJuOwotCX0KLQotCS8qIENvbnZlcnQgaGFuZGxlIHRvIGZ1bGwgcGF0aG5hbWUgYW5kIHByaW50IGl0ICh3aXRoIHN1cHBsaWVkIG1lc3NhZ2UpICovCi0KLQlidWZmZXIubGVuZ3RoID0gQUNQSV9BTExPQ0FURV9MT0NBTF9CVUZGRVI7Ci0KLQlzdGF0dXMgPSBhY3BpX25zX2hhbmRsZV90b19wYXRobmFtZShub2RlLCAmYnVmZmVyKTsKLQlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpIHsKLQkJaWYgKG1lc3NhZ2UpIHsKLQkJCWFjcGlfb3NfcHJpbnRmKCIlcyAiLCBtZXNzYWdlKTsKLQkJfQotCi0JCWFjcGlfb3NfcHJpbnRmKCJbJXNdIChOb2RlICVwKSIsIChjaGFyICopYnVmZmVyLnBvaW50ZXIsIG5vZGUpOwotCQlBQ1BJX0ZSRUUoYnVmZmVyLnBvaW50ZXIpOwotCX0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9uc192YWxpZF9yb290X3ByZWZpeAotICoKLSAqIFBBUkFNRVRFUlM6ICBQcmVmaXggICAgICAgICAgLSBDaGFyYWN0ZXIgdG8gYmUgY2hlY2tlZAotICoKLSAqIFJFVFVSTjogICAgICBUUlVFIGlmIGEgdmFsaWQgcHJlZml4Ci0gKgotICogREVTQ1JJUFRJT046IENoZWNrIGlmIGEgY2hhcmFjdGVyIGlzIGEgdmFsaWQgQUNQSSBSb290IHByZWZpeAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXU4IGFjcGlfbnNfdmFsaWRfcm9vdF9wcmVmaXgoY2hhciBwcmVmaXgpCi17Ci0KLQlyZXR1cm4gKCh1OCkgKHByZWZpeCA9PSAnXFwnKSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfbnNfdmFsaWRfcGF0aF9zZXBhcmF0b3IKLSAqCi0gKiBQQVJBTUVURVJTOiAgU2VwICAgICAgICAgLSBDaGFyYWN0ZXIgdG8gYmUgY2hlY2tlZAotICoKLSAqIFJFVFVSTjogICAgICBUUlVFIGlmIGEgdmFsaWQgcGF0aCBzZXBhcmF0b3IKLSAqCi0gKiBERVNDUklQVElPTjogQ2hlY2sgaWYgYSBjaGFyYWN0ZXIgaXMgYSB2YWxpZCBBQ1BJIHBhdGggc2VwYXJhdG9yCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIHU4IGFjcGlfbnNfdmFsaWRfcGF0aF9zZXBhcmF0b3IoY2hhciBzZXApCi17Ci0KLQlyZXR1cm4gKCh1OCkgKHNlcCA9PSAnLicpKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9uc19nZXRfdHlwZQotICoKLSAqIFBBUkFNRVRFUlM6ICBOb2RlICAgICAgICAtIFBhcmVudCBOb2RlIHRvIGJlIGV4YW1pbmVkCi0gKgotICogUkVUVVJOOiAgICAgIFR5cGUgZmllbGQgZnJvbSBOb2RlIHdob3NlIGhhbmRsZSBpcyBwYXNzZWQKLSAqCi0gKiBERVNDUklQVElPTjogUmV0dXJuIHRoZSB0eXBlIG9mIGEgTmFtZXNwYWNlIG5vZGUKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1hY3BpX29iamVjdF90eXBlIGFjcGlfbnNfZ2V0X3R5cGUoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKiBub2RlKQotewotCUFDUElfRlVOQ1RJT05fVFJBQ0UobnNfZ2V0X3R5cGUpOwotCi0JaWYgKCFub2RlKSB7Ci0JCUFDUElfV0FSTklORygoQUVfSU5GTywgIk51bGwgTm9kZSBwYXJhbWV0ZXIiKSk7Ci0JCXJldHVybl9VSU5UMzIoQUNQSV9UWVBFX0FOWSk7Ci0JfQotCi0JcmV0dXJuX1VJTlQzMigoYWNwaV9vYmplY3RfdHlwZSkgbm9kZS0+dHlwZSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfbnNfbG9jYWwKLSAqCi0gKiBQQVJBTUVURVJTOiAgVHlwZSAgICAgICAgLSBBIG5hbWVzcGFjZSBvYmplY3QgdHlwZQotICoKLSAqIFJFVFVSTjogICAgICBMT0NBTCBpZiBuYW1lcyBtdXN0IGJlIGZvdW5kIGxvY2FsbHkgaW4gb2JqZWN0cyBvZiB0aGUKLSAqICAgICAgICAgICAgICBwYXNzZWQgdHlwZSwgMCBpZiBlbmNsb3Npbmcgc2NvcGVzIHNob3VsZCBiZSBzZWFyY2hlZAotICoKLSAqIERFU0NSSVBUSU9OOiBSZXR1cm5zIHNjb3BlIHJ1bGUgZm9yIHRoZSBnaXZlbiBvYmplY3QgdHlwZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi11MzIgYWNwaV9uc19sb2NhbChhY3BpX29iamVjdF90eXBlIHR5cGUpCi17Ci0JQUNQSV9GVU5DVElPTl9UUkFDRShuc19sb2NhbCk7Ci0KLQlpZiAoIWFjcGlfdXRfdmFsaWRfb2JqZWN0X3R5cGUodHlwZSkpIHsKLQotCQkvKiBUeXBlIGNvZGUgb3V0IG9mIHJhbmdlICAqLwotCi0JCUFDUElfV0FSTklORygoQUVfSU5GTywgIkludmFsaWQgT2JqZWN0IFR5cGUgJVgiLCB0eXBlKSk7Ci0JCXJldHVybl9VSU5UMzIoQUNQSV9OU19OT1JNQUwpOwotCX0KLQotCXJldHVybl9VSU5UMzIoKHUzMikgYWNwaV9nYmxfbnNfcHJvcGVydGllc1t0eXBlXSAmIEFDUElfTlNfTE9DQUwpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX25zX2dldF9pbnRlcm5hbF9uYW1lX2xlbmd0aAotICoKLSAqIFBBUkFNRVRFUlM6ICBJbmZvICAgICAgICAgICAgLSBJbmZvIHN0cnVjdCBpbml0aWFsaXplZCB3aXRoIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVybmFsIG5hbWUgcG9pbnRlci4KLSAqCi0gKiBSRVRVUk46ICAgICAgTm9uZQotICoKLSAqIERFU0NSSVBUSU9OOiBDYWxjdWxhdGUgdGhlIGxlbmd0aCBvZiB0aGUgaW50ZXJuYWwgKEFNTCkgbmFtZXN0cmluZwotICogICAgICAgICAgICAgIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGV4dGVybmFsIChBU0wpIG5hbWVzdHJpbmcuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdm9pZCBhY3BpX25zX2dldF9pbnRlcm5hbF9uYW1lX2xlbmd0aChzdHJ1Y3QgYWNwaV9uYW1lc3RyaW5nX2luZm8gKmluZm8pCi17Ci0JY29uc3QgY2hhciAqbmV4dF9leHRlcm5hbF9jaGFyOwotCXUzMiBpOwotCi0JQUNQSV9GVU5DVElPTl9FTlRSWSgpOwotCi0JbmV4dF9leHRlcm5hbF9jaGFyID0gaW5mby0+ZXh0ZXJuYWxfbmFtZTsKLQlpbmZvLT5udW1fY2FyYXRzID0gMDsKLQlpbmZvLT5udW1fc2VnbWVudHMgPSAwOwotCWluZm8tPmZ1bGx5X3F1YWxpZmllZCA9IEZBTFNFOwotCi0JLyoKLQkgKiBGb3IgdGhlIGludGVybmFsIG5hbWUsIHRoZSByZXF1aXJlZCBsZW5ndGggaXMgNCBieXRlcyBwZXIgc2VnbWVudCwgcGx1cwotCSAqIDEgZWFjaCBmb3Igcm9vdF9wcmVmaXgsIG11bHRpX25hbWVfcHJlZml4X29wLCBzZWdtZW50IGNvdW50LCB0cmFpbGluZyBudWxsCi0JICogKHdoaWNoIGlzIG5vdCByZWFsbHkgbmVlZGVkLCBidXQgbm8gdGhlcmUncyBoYXJtIGluIHB1dHRpbmcgaXQgdGhlcmUpCi0JICoKLQkgKiBzdHJsZW4oKSArIDEgY292ZXJzIHRoZSBmaXJzdCBuYW1lX3NlZywgd2hpY2ggaGFzIG5vIHBhdGggc2VwYXJhdG9yCi0JICovCi0JaWYgKGFjcGlfbnNfdmFsaWRfcm9vdF9wcmVmaXgobmV4dF9leHRlcm5hbF9jaGFyWzBdKSkgewotCQlpbmZvLT5mdWxseV9xdWFsaWZpZWQgPSBUUlVFOwotCQluZXh0X2V4dGVybmFsX2NoYXIrKzsKLQl9IGVsc2UgewotCQkvKgotCQkgKiBIYW5kbGUgQ2FyYXQgcHJlZml4ZXMKLQkJICovCi0JCXdoaWxlICgqbmV4dF9leHRlcm5hbF9jaGFyID09ICdeJykgewotCQkJaW5mby0+bnVtX2NhcmF0cysrOwotCQkJbmV4dF9leHRlcm5hbF9jaGFyKys7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIERldGVybWluZSB0aGUgbnVtYmVyIG9mIEFDUEkgbmFtZSAic2VnbWVudHMiIGJ5IGNvdW50aW5nIHRoZSBudW1iZXIgb2YKLQkgKiBwYXRoIHNlcGFyYXRvcnMgd2l0aGluIHRoZSBzdHJpbmcuIFN0YXJ0IHdpdGggb25lIHNlZ21lbnQgc2luY2UgdGhlCi0JICogc2VnbWVudCBjb3VudCBpcyBbKCMgc2VwYXJhdG9ycykgKyAxXSwgYW5kIHplcm8gc2VwYXJhdG9ycyBpcyBvay4KLQkgKi8KLQlpZiAoKm5leHRfZXh0ZXJuYWxfY2hhcikgewotCQlpbmZvLT5udW1fc2VnbWVudHMgPSAxOwotCQlmb3IgKGkgPSAwOyBuZXh0X2V4dGVybmFsX2NoYXJbaV07IGkrKykgewotCQkJaWYgKGFjcGlfbnNfdmFsaWRfcGF0aF9zZXBhcmF0b3IobmV4dF9leHRlcm5hbF9jaGFyW2ldKSkgewotCQkJCWluZm8tPm51bV9zZWdtZW50cysrOwotCQkJfQotCQl9Ci0JfQotCi0JaW5mby0+bGVuZ3RoID0gKEFDUElfTkFNRV9TSVpFICogaW5mby0+bnVtX3NlZ21lbnRzKSArCi0JICAgIDQgKyBpbmZvLT5udW1fY2FyYXRzOwotCi0JaW5mby0+bmV4dF9leHRlcm5hbF9jaGFyID0gbmV4dF9leHRlcm5hbF9jaGFyOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX25zX2J1aWxkX2ludGVybmFsX25hbWUKLSAqCi0gKiBQQVJBTUVURVJTOiAgSW5mbyAgICAgICAgICAgIC0gSW5mbyBzdHJ1Y3QgZnVsbHkgaW5pdGlhbGl6ZWQKLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IENvbnN0cnVjdCB0aGUgaW50ZXJuYWwgKEFNTCkgbmFtZXN0cmluZwotICogICAgICAgICAgICAgIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGV4dGVybmFsIChBU0wpIG5hbWVzdHJpbmcuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotYWNwaV9zdGF0dXMgYWNwaV9uc19idWlsZF9pbnRlcm5hbF9uYW1lKHN0cnVjdCBhY3BpX25hbWVzdHJpbmdfaW5mbyAqaW5mbykKLXsKLQl1MzIgbnVtX3NlZ21lbnRzID0gaW5mby0+bnVtX3NlZ21lbnRzOwotCWNoYXIgKmludGVybmFsX25hbWUgPSBpbmZvLT5pbnRlcm5hbF9uYW1lOwotCWNvbnN0IGNoYXIgKmV4dGVybmFsX25hbWUgPSBpbmZvLT5uZXh0X2V4dGVybmFsX2NoYXI7Ci0JY2hhciAqcmVzdWx0ID0gTlVMTDsKLQl1MzIgaTsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UobnNfYnVpbGRfaW50ZXJuYWxfbmFtZSk7Ci0KLQkvKiBTZXR1cCB0aGUgY29ycmVjdCBwcmVmaXhlcywgY291bnRzLCBhbmQgcG9pbnRlcnMgKi8KLQotCWlmIChpbmZvLT5mdWxseV9xdWFsaWZpZWQpIHsKLQkJaW50ZXJuYWxfbmFtZVswXSA9ICdcXCc7Ci0KLQkJaWYgKG51bV9zZWdtZW50cyA8PSAxKSB7Ci0JCQlyZXN1bHQgPSAmaW50ZXJuYWxfbmFtZVsxXTsKLQkJfSBlbHNlIGlmIChudW1fc2VnbWVudHMgPT0gMikgewotCQkJaW50ZXJuYWxfbmFtZVsxXSA9IEFNTF9EVUFMX05BTUVfUFJFRklYOwotCQkJcmVzdWx0ID0gJmludGVybmFsX25hbWVbMl07Ci0JCX0gZWxzZSB7Ci0JCQlpbnRlcm5hbF9uYW1lWzFdID0gQU1MX01VTFRJX05BTUVfUFJFRklYX09QOwotCQkJaW50ZXJuYWxfbmFtZVsyXSA9IChjaGFyKW51bV9zZWdtZW50czsKLQkJCXJlc3VsdCA9ICZpbnRlcm5hbF9uYW1lWzNdOwotCQl9Ci0JfSBlbHNlIHsKLQkJLyoKLQkJICogTm90IGZ1bGx5IHF1YWxpZmllZC4KLQkJICogSGFuZGxlIENhcmF0cyBmaXJzdCwgdGhlbiBhcHBlbmQgdGhlIG5hbWUgc2VnbWVudHMKLQkJICovCi0JCWkgPSAwOwotCQlpZiAoaW5mby0+bnVtX2NhcmF0cykgewotCQkJZm9yIChpID0gMDsgaSA8IGluZm8tPm51bV9jYXJhdHM7IGkrKykgewotCQkJCWludGVybmFsX25hbWVbaV0gPSAnXic7Ci0JCQl9Ci0JCX0KLQotCQlpZiAobnVtX3NlZ21lbnRzIDw9IDEpIHsKLQkJCXJlc3VsdCA9ICZpbnRlcm5hbF9uYW1lW2ldOwotCQl9IGVsc2UgaWYgKG51bV9zZWdtZW50cyA9PSAyKSB7Ci0JCQlpbnRlcm5hbF9uYW1lW2ldID0gQU1MX0RVQUxfTkFNRV9QUkVGSVg7Ci0JCQlyZXN1bHQgPSAmaW50ZXJuYWxfbmFtZVsoYWNwaV9zaXplKSBpICsgMV07Ci0JCX0gZWxzZSB7Ci0JCQlpbnRlcm5hbF9uYW1lW2ldID0gQU1MX01VTFRJX05BTUVfUFJFRklYX09QOwotCQkJaW50ZXJuYWxfbmFtZVsoYWNwaV9zaXplKSBpICsgMV0gPSAoY2hhciludW1fc2VnbWVudHM7Ci0JCQlyZXN1bHQgPSAmaW50ZXJuYWxfbmFtZVsoYWNwaV9zaXplKSBpICsgMl07Ci0JCX0KLQl9Ci0KLQkvKiBCdWlsZCB0aGUgbmFtZSAobWludXMgcGF0aCBzZXBhcmF0b3JzKSAqLwotCi0JZm9yICg7IG51bV9zZWdtZW50czsgbnVtX3NlZ21lbnRzLS0pIHsKLQkJZm9yIChpID0gMDsgaSA8IEFDUElfTkFNRV9TSVpFOyBpKyspIHsKLQkJCWlmIChhY3BpX25zX3ZhbGlkX3BhdGhfc2VwYXJhdG9yKCpleHRlcm5hbF9uYW1lKSB8fAotCQkJICAgICgqZXh0ZXJuYWxfbmFtZSA9PSAwKSkgewotCi0JCQkJLyogUGFkIHRoZSBzZWdtZW50IHdpdGggdW5kZXJzY29yZShzKSBpZiBzZWdtZW50IGlzIHNob3J0ICovCi0KLQkJCQlyZXN1bHRbaV0gPSAnXyc7Ci0JCQl9IGVsc2UgewotCQkJCS8qIENvbnZlcnQgdGhlIGNoYXJhY3RlciB0byB1cHBlcmNhc2UgYW5kIHNhdmUgaXQgKi8KLQotCQkJCXJlc3VsdFtpXSA9Ci0JCQkJICAgIChjaGFyKUFDUElfVE9VUFBFUigoaW50KSpleHRlcm5hbF9uYW1lKTsKLQkJCQlleHRlcm5hbF9uYW1lKys7Ci0JCQl9Ci0JCX0KLQotCQkvKiBOb3cgd2UgbXVzdCBoYXZlIGEgcGF0aCBzZXBhcmF0b3IsIG9yIHRoZSBwYXRobmFtZSBpcyBiYWQgKi8KLQotCQlpZiAoIWFjcGlfbnNfdmFsaWRfcGF0aF9zZXBhcmF0b3IoKmV4dGVybmFsX25hbWUpICYmCi0JCSAgICAoKmV4dGVybmFsX25hbWUgIT0gMCkpIHsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfUEFSQU1FVEVSKTsKLQkJfQotCi0JCS8qIE1vdmUgb24gdGhlIG5leHQgc2VnbWVudCAqLwotCi0JCWV4dGVybmFsX25hbWUrKzsKLQkJcmVzdWx0ICs9IEFDUElfTkFNRV9TSVpFOwotCX0KLQotCS8qIFRlcm1pbmF0ZSB0aGUgc3RyaW5nICovCi0KLQkqcmVzdWx0ID0gMDsKLQotCWlmIChpbmZvLT5mdWxseV9xdWFsaWZpZWQpIHsKLQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FWEVDLAotCQkJCSAgIlJldHVybmluZyBbJXBdIChhYnMpIFwiXFwlc1wiXG4iLAotCQkJCSAgaW50ZXJuYWxfbmFtZSwgaW50ZXJuYWxfbmFtZSkpOwotCX0gZWxzZSB7Ci0JCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVhFQywgIlJldHVybmluZyBbJXBdIChyZWwpIFwiJXNcIlxuIiwKLQkJCQkgIGludGVybmFsX25hbWUsIGludGVybmFsX25hbWUpKTsKLQl9Ci0KLQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX25zX2ludGVybmFsaXplX25hbWUKLSAqCi0gKiBQQVJBTUVURVJTOiAgKmV4dGVybmFsX25hbWUgICAgICAgICAgLSBFeHRlcm5hbCByZXByZXNlbnRhdGlvbiBvZiBuYW1lCi0gKiAgICAgICAgICAgICAgKipDb252ZXJ0ZWQgTmFtZSAgICAgICAgLSBXaGVyZSB0byByZXR1cm4gdGhlIHJlc3VsdGluZwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWwgcmVwcmVzZW50aW9uIG9mIHRoZSBuYW1lCi0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cwotICoKLSAqIERFU0NSSVBUSU9OOiBDb252ZXJ0IGFuIGV4dGVybmFsIHJlcHJlc2VudGF0aW9uIChlLmcuICJcX1BSXy5DUFUwIikKLSAqICAgICAgICAgICAgICB0byBpbnRlcm5hbCBmb3JtIChlLmcuIDVjIDJmIDAyIDVmIDUwIDUyIDVmIDQzIDUwIDU1IDMwKQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1hY3BpX3N0YXR1cwotYWNwaV9uc19pbnRlcm5hbGl6ZV9uYW1lKGNvbnN0IGNoYXIgKmV4dGVybmFsX25hbWUsIGNoYXIgKipjb252ZXJ0ZWRfbmFtZSkKLXsKLQljaGFyICppbnRlcm5hbF9uYW1lOwotCXN0cnVjdCBhY3BpX25hbWVzdHJpbmdfaW5mbyBpbmZvOwotCWFjcGlfc3RhdHVzIHN0YXR1czsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UobnNfaW50ZXJuYWxpemVfbmFtZSk7Ci0KLQlpZiAoKCFleHRlcm5hbF9uYW1lKSB8fCAoKmV4dGVybmFsX25hbWUgPT0gMCkgfHwgKCFjb252ZXJ0ZWRfbmFtZSkpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9QQVJBTUVURVIpOwotCX0KLQotCS8qIEdldCB0aGUgbGVuZ3RoIG9mIHRoZSBuZXcgaW50ZXJuYWwgbmFtZSAqLwotCi0JaW5mby5leHRlcm5hbF9uYW1lID0gZXh0ZXJuYWxfbmFtZTsKLQlhY3BpX25zX2dldF9pbnRlcm5hbF9uYW1lX2xlbmd0aCgmaW5mbyk7Ci0KLQkvKiBXZSBuZWVkIGEgc2VnbWVudCB0byBzdG9yZSB0aGUgaW50ZXJuYWwgIG5hbWUgKi8KLQotCWludGVybmFsX25hbWUgPSBBQ1BJX0FMTE9DQVRFX1pFUk9FRChpbmZvLmxlbmd0aCk7Ci0JaWYgKCFpbnRlcm5hbF9uYW1lKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT19NRU1PUlkpOwotCX0KLQotCS8qIEJ1aWxkIHRoZSBuYW1lICovCi0KLQlpbmZvLmludGVybmFsX25hbWUgPSBpbnRlcm5hbF9uYW1lOwotCXN0YXR1cyA9IGFjcGlfbnNfYnVpbGRfaW50ZXJuYWxfbmFtZSgmaW5mbyk7Ci0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCUFDUElfRlJFRShpbnRlcm5hbF9uYW1lKTsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci0JfQotCi0JKmNvbnZlcnRlZF9uYW1lID0gaW50ZXJuYWxfbmFtZTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX25zX2V4dGVybmFsaXplX25hbWUKLSAqCi0gKiBQQVJBTUVURVJTOiAgaW50ZXJuYWxfbmFtZV9sZW5ndGggLSBMZW50aCBvZiB0aGUgaW50ZXJuYWwgbmFtZSBiZWxvdwotICogICAgICAgICAgICAgIGludGVybmFsX25hbWUgICAgICAgLSBJbnRlcm5hbCByZXByZXNlbnRhdGlvbiBvZiBuYW1lCi0gKiAgICAgICAgICAgICAgY29udmVydGVkX25hbWVfbGVuZ3RoIC0gV2hlcmUgdGhlIGxlbmd0aCBpcyByZXR1cm5lZAotICogICAgICAgICAgICAgIGNvbnZlcnRlZF9uYW1lICAgICAgLSBXaGVyZSB0aGUgcmVzdWx0aW5nIGV4dGVybmFsIG5hbWUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgcmV0dXJuZWQKLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IENvbnZlcnQgaW50ZXJuYWwgbmFtZSAoZS5nLiA1YyAyZiAwMiA1ZiA1MCA1MiA1ZiA0MyA1MCA1NSAzMCkKLSAqICAgICAgICAgICAgICB0byBpdHMgZXh0ZXJuYWwgKHByaW50YWJsZSkgZm9ybSAoZS5nLiAiXF9QUl8uQ1BVMCIpCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotYWNwaV9zdGF0dXMKLWFjcGlfbnNfZXh0ZXJuYWxpemVfbmFtZSh1MzIgaW50ZXJuYWxfbmFtZV9sZW5ndGgsCi0JCQkgY29uc3QgY2hhciAqaW50ZXJuYWxfbmFtZSwKLQkJCSB1MzIgKiBjb252ZXJ0ZWRfbmFtZV9sZW5ndGgsIGNoYXIgKipjb252ZXJ0ZWRfbmFtZSkKLXsKLQl1MzIgbmFtZXNfaW5kZXggPSAwOwotCXUzMiBudW1fc2VnbWVudHMgPSAwOwotCXUzMiByZXF1aXJlZF9sZW5ndGg7Ci0JdTMyIHByZWZpeF9sZW5ndGggPSAwOwotCXUzMiBpID0gMDsKLQl1MzIgaiA9IDA7Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKG5zX2V4dGVybmFsaXplX25hbWUpOwotCi0JaWYgKCFpbnRlcm5hbF9uYW1lX2xlbmd0aCB8fCAhaW50ZXJuYWxfbmFtZSB8fCAhY29udmVydGVkX25hbWUpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9QQVJBTUVURVIpOwotCX0KLQotCS8qCi0JICogQ2hlY2sgZm9yIGEgcHJlZml4IChvbmUgJ1wnIHwgb25lIG9yIG1vcmUgJ14nKS4KLQkgKi8KLQlzd2l0Y2ggKGludGVybmFsX25hbWVbMF0pIHsKLQljYXNlICdcXCc6Ci0JCXByZWZpeF9sZW5ndGggPSAxOwotCQlicmVhazsKLQotCWNhc2UgJ14nOgotCQlmb3IgKGkgPSAwOyBpIDwgaW50ZXJuYWxfbmFtZV9sZW5ndGg7IGkrKykgewotCQkJaWYgKGludGVybmFsX25hbWVbaV0gPT0gJ14nKSB7Ci0JCQkJcHJlZml4X2xlbmd0aCA9IGkgKyAxOwotCQkJfSBlbHNlIHsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCWlmIChpID09IGludGVybmFsX25hbWVfbGVuZ3RoKSB7Ci0JCQlwcmVmaXhfbGVuZ3RoID0gaTsKLQkJfQotCi0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQotCi0JLyoKLQkgKiBDaGVjayBmb3Igb2JqZWN0IG5hbWVzLiAgTm90ZSB0aGF0IHRoZXJlIGNvdWxkIGJlIDAtMjU1IG9mIHRoZXNlCi0JICogNC1ieXRlIGVsZW1lbnRzLgotCSAqLwotCWlmIChwcmVmaXhfbGVuZ3RoIDwgaW50ZXJuYWxfbmFtZV9sZW5ndGgpIHsKLQkJc3dpdGNoIChpbnRlcm5hbF9uYW1lW3ByZWZpeF9sZW5ndGhdKSB7Ci0JCWNhc2UgQU1MX01VTFRJX05BTUVfUFJFRklYX09QOgotCi0JCQkvKiA8Y291bnQ+IDQtYnl0ZSBuYW1lcyAqLwotCi0JCQluYW1lc19pbmRleCA9IHByZWZpeF9sZW5ndGggKyAyOwotCQkJbnVtX3NlZ21lbnRzID0gKHU4KQotCQkJICAgIGludGVybmFsX25hbWVbKGFjcGlfc2l6ZSkgcHJlZml4X2xlbmd0aCArIDFdOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBBTUxfRFVBTF9OQU1FX1BSRUZJWDoKLQotCQkJLyogVHdvIDQtYnl0ZSBuYW1lcyAqLwotCi0JCQluYW1lc19pbmRleCA9IHByZWZpeF9sZW5ndGggKyAxOwotCQkJbnVtX3NlZ21lbnRzID0gMjsKLQkJCWJyZWFrOwotCi0JCWNhc2UgMDoKLQotCQkJLyogbnVsbF9uYW1lICovCi0KLQkJCW5hbWVzX2luZGV4ID0gMDsKLQkJCW51bV9zZWdtZW50cyA9IDA7Ci0JCQlicmVhazsKLQotCQlkZWZhdWx0OgotCi0JCQkvKiBvbmUgNC1ieXRlIG5hbWUgKi8KLQotCQkJbmFtZXNfaW5kZXggPSBwcmVmaXhfbGVuZ3RoOwotCQkJbnVtX3NlZ21lbnRzID0gMTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBDYWxjdWxhdGUgdGhlIGxlbmd0aCBvZiBjb252ZXJ0ZWRfbmFtZSwgd2hpY2ggZXF1YWxzIHRoZSBsZW5ndGgKLQkgKiBvZiB0aGUgcHJlZml4LCBsZW5ndGggb2YgYWxsIG9iamVjdCBuYW1lcywgbGVuZ3RoIG9mIGFueSByZXF1aXJlZAotCSAqIHB1bmN0dWF0aW9uICgnLicpIGJldHdlZW4gb2JqZWN0IG5hbWVzLCBwbHVzIHRoZSBOVUxMIHRlcm1pbmF0b3IuCi0JICovCi0JcmVxdWlyZWRfbGVuZ3RoID0gcHJlZml4X2xlbmd0aCArICg0ICogbnVtX3NlZ21lbnRzKSArCi0JICAgICgobnVtX3NlZ21lbnRzID4gMCkgPyAobnVtX3NlZ21lbnRzIC0gMSkgOiAwKSArIDE7Ci0KLQkvKgotCSAqIENoZWNrIHRvIHNlZSBpZiB3ZSdyZSBzdGlsbCBpbiBib3VuZHMuICBJZiBub3QsIHRoZXJlJ3MgYSBwcm9ibGVtCi0JICogd2l0aCBpbnRlcm5hbF9uYW1lIChpbnZhbGlkIGZvcm1hdCkuCi0JICovCi0JaWYgKHJlcXVpcmVkX2xlbmd0aCA+IGludGVybmFsX25hbWVfbGVuZ3RoKSB7Ci0JCUFDUElfRVJST1IoKEFFX0lORk8sICJJbnZhbGlkIGludGVybmFsIG5hbWUiKSk7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfUEFUSE5BTUUpOwotCX0KLQotCS8qCi0JICogQnVpbGQgY29udmVydGVkX25hbWUKLQkgKi8KLQkqY29udmVydGVkX25hbWUgPSBBQ1BJX0FMTE9DQVRFX1pFUk9FRChyZXF1aXJlZF9sZW5ndGgpOwotCWlmICghKCpjb252ZXJ0ZWRfbmFtZSkpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX01FTU9SWSk7Ci0JfQotCi0JaiA9IDA7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgcHJlZml4X2xlbmd0aDsgaSsrKSB7Ci0JCSgqY29udmVydGVkX25hbWUpW2orK10gPSBpbnRlcm5hbF9uYW1lW2ldOwotCX0KLQotCWlmIChudW1fc2VnbWVudHMgPiAwKSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBudW1fc2VnbWVudHM7IGkrKykgewotCQkJaWYgKGkgPiAwKSB7Ci0JCQkJKCpjb252ZXJ0ZWRfbmFtZSlbaisrXSA9ICcuJzsKLQkJCX0KLQotCQkJKCpjb252ZXJ0ZWRfbmFtZSlbaisrXSA9IGludGVybmFsX25hbWVbbmFtZXNfaW5kZXgrK107Ci0JCQkoKmNvbnZlcnRlZF9uYW1lKVtqKytdID0gaW50ZXJuYWxfbmFtZVtuYW1lc19pbmRleCsrXTsKLQkJCSgqY29udmVydGVkX25hbWUpW2orK10gPSBpbnRlcm5hbF9uYW1lW25hbWVzX2luZGV4KytdOwotCQkJKCpjb252ZXJ0ZWRfbmFtZSlbaisrXSA9IGludGVybmFsX25hbWVbbmFtZXNfaW5kZXgrK107Ci0JCX0KLQl9Ci0KLQlpZiAoY29udmVydGVkX25hbWVfbGVuZ3RoKSB7Ci0JCSpjb252ZXJ0ZWRfbmFtZV9sZW5ndGggPSAodTMyKSByZXF1aXJlZF9sZW5ndGg7Ci0JfQotCi0JcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9uc19tYXBfaGFuZGxlX3RvX25vZGUKLSAqCi0gKiBQQVJBTUVURVJTOiAgSGFuZGxlICAgICAgICAgIC0gSGFuZGxlIHRvIGJlIGNvbnZlcnRlZCB0byBhbiBOb2RlCi0gKgotICogUkVUVVJOOiAgICAgIEEgTmFtZSB0YWJsZSBlbnRyeSBwb2ludGVyCi0gKgotICogREVTQ1JJUFRJT046IENvbnZlcnQgYSBuYW1lc3BhY2UgaGFuZGxlIHRvIGEgcmVhbCBOb2RlCi0gKgotICogTm90ZTogUmVhbCBpbnRlZ2VyIGhhbmRsZXMgd291bGQgYWxsb3cgZm9yIG1vcmUgdmVyaWZpY2F0aW9uCi0gKiAgICAgICBhbmQga2VlcCBhbGwgcG9pbnRlcnMgd2l0aGluIHRoaXMgc3Vic3lzdGVtIC0gaG93ZXZlciB0aGlzIGludHJvZHVjZXMKLSAqICAgICAgIG1vcmUgKGFuZCBwZXJoYXBzIHVubmVjZXNzYXJ5KSBvdmVyaGVhZC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqYWNwaV9uc19tYXBfaGFuZGxlX3RvX25vZGUoYWNwaV9oYW5kbGUgaGFuZGxlKQotewotCi0JQUNQSV9GVU5DVElPTl9FTlRSWSgpOwotCi0JLyoKLQkgKiBTaW1wbGUgaW1wbGVtZW50YXRpb24KLQkgKi8KLQlpZiAoKCFoYW5kbGUpIHx8IChoYW5kbGUgPT0gQUNQSV9ST09UX09CSkVDVCkpIHsKLQkJcmV0dXJuIChhY3BpX2dibF9yb290X25vZGUpOwotCX0KLQotCS8qIFdlIGNhbiBhdCBsZWFzdCBhdHRlbXB0IHRvIHZlcmlmeSB0aGUgaGFuZGxlICovCi0KLQlpZiAoQUNQSV9HRVRfREVTQ1JJUFRPUl9UWVBFKGhhbmRsZSkgIT0gQUNQSV9ERVNDX1RZUEVfTkFNRUQpIHsKLQkJcmV0dXJuIChOVUxMKTsKLQl9Ci0KLQlyZXR1cm4gKEFDUElfQ0FTVF9QVFIoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUsIGhhbmRsZSkpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX25zX2NvbnZlcnRfZW50cnlfdG9faGFuZGxlCi0gKgotICogUEFSQU1FVEVSUzogIE5vZGUgICAgICAgICAgLSBOb2RlIHRvIGJlIGNvbnZlcnRlZCB0byBhIEhhbmRsZQotICoKLSAqIFJFVFVSTjogICAgICBBIHVzZXIgaGFuZGxlCi0gKgotICogREVTQ1JJUFRJT046IENvbnZlcnQgYSByZWFsIE5vZGUgdG8gYSBuYW1lc3BhY2UgaGFuZGxlCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotYWNwaV9oYW5kbGUgYWNwaV9uc19jb252ZXJ0X2VudHJ5X3RvX2hhbmRsZShzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZSkKLXsKLQotCS8qCi0JICogU2ltcGxlIGltcGxlbWVudGF0aW9uIGZvciBub3c7Ci0JICovCi0JcmV0dXJuICgoYWNwaV9oYW5kbGUpIG5vZGUpOwotCi0vKiBFeGFtcGxlIGZ1dHVyZSBpbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotCWlmICghTm9kZSkKLQl7Ci0JCXJldHVybiAoTlVMTCk7Ci0JfQotCi0JaWYgKE5vZGUgPT0gYWNwaV9nYmxfcm9vdF9ub2RlKQotCXsKLQkJcmV0dXJuIChBQ1BJX1JPT1RfT0JKRUNUKTsKLQl9Ci0KLQlyZXR1cm4gKChhY3BpX2hhbmRsZSkgTm9kZSk7Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX25zX3Rlcm1pbmF0ZQotICoKLSAqIFBBUkFNRVRFUlM6ICBub25lCi0gKgotICogUkVUVVJOOiAgICAgIG5vbmUKLSAqCi0gKiBERVNDUklQVElPTjogZnJlZSBtZW1vcnkgYWxsb2NhdGVkIGZvciBuYW1lc3BhY2UgYW5kIEFDUEkgdGFibGUgc3RvcmFnZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi12b2lkIGFjcGlfbnNfdGVybWluYXRlKHZvaWQpCi17Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2M7Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKG5zX3Rlcm1pbmF0ZSk7Ci0KLQkvKgotCSAqIDEpIEZyZWUgdGhlIGVudGlyZSBuYW1lc3BhY2UgLS0gYWxsIG5vZGVzIGFuZCBvYmplY3RzCi0JICoKLQkgKiBEZWxldGUgYWxsIG9iamVjdCBkZXNjcmlwdG9ycyBhdHRhY2hlZCB0byBuYW1lcHNhY2Ugbm9kZXMKLQkgKi8KLQlhY3BpX25zX2RlbGV0ZV9uYW1lc3BhY2Vfc3VidHJlZShhY3BpX2dibF9yb290X25vZGUpOwotCi0JLyogRGV0YWNoIGFueSBvYmplY3RzIGF0dGFjaGVkIHRvIHRoZSByb290ICovCi0KLQlvYmpfZGVzYyA9IGFjcGlfbnNfZ2V0X2F0dGFjaGVkX29iamVjdChhY3BpX2dibF9yb290X25vZGUpOwotCWlmIChvYmpfZGVzYykgewotCQlhY3BpX25zX2RldGFjaF9vYmplY3QoYWNwaV9nYmxfcm9vdF9ub2RlKTsKLQl9Ci0KLQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sICJOYW1lc3BhY2UgZnJlZWRcbiIpKTsKLQlyZXR1cm5fVk9JRDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9uc19vcGVuc19zY29wZQotICoKLSAqIFBBUkFNRVRFUlM6ICBUeXBlICAgICAgICAtIEEgdmFsaWQgbmFtZXNwYWNlIHR5cGUKLSAqCi0gKiBSRVRVUk46ICAgICAgTkVXU0NPUEUgaWYgdGhlIHBhc3NlZCB0eXBlICJvcGVucyBhIG5hbWUgc2NvcGUiIGFjY29yZGluZwotICogICAgICAgICAgICAgIHRvIHRoZSBBQ1BJIHNwZWNpZmljYXRpb24sIGVsc2UgMAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXUzMiBhY3BpX25zX29wZW5zX3Njb3BlKGFjcGlfb2JqZWN0X3R5cGUgdHlwZSkKLXsKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1NUUihuc19vcGVuc19zY29wZSwgYWNwaV91dF9nZXRfdHlwZV9uYW1lKHR5cGUpKTsKLQotCWlmICghYWNwaV91dF92YWxpZF9vYmplY3RfdHlwZSh0eXBlKSkgewotCi0JCS8qIHR5cGUgY29kZSBvdXQgb2YgcmFuZ2UgICovCi0KLQkJQUNQSV9XQVJOSU5HKChBRV9JTkZPLCAiSW52YWxpZCBPYmplY3QgVHlwZSAlWCIsIHR5cGUpKTsKLQkJcmV0dXJuX1VJTlQzMihBQ1BJX05TX05PUk1BTCk7Ci0JfQotCi0JcmV0dXJuX1VJTlQzMigoKHUzMikgYWNwaV9nYmxfbnNfcHJvcGVydGllc1t0eXBlXSkgJiBBQ1BJX05TX05FV1NDT1BFKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9uc19nZXRfbm9kZQotICoKLSAqIFBBUkFNRVRFUlM6ICAqUGF0aG5hbWUgICAtIE5hbWUgdG8gYmUgZm91bmQsIGluIGV4dGVybmFsIChBU0wpIGZvcm1hdC4gVGhlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIChiYWNrc2xhc2gpIGFuZCBeIChjYXJhdCkgcHJlZml4ZXMsIGFuZCB0aGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gKHBlcmlvZCkgdG8gc2VwYXJhdGUgc2VnbWVudHMgYXJlIHN1cHBvcnRlZC4KLSAqICAgICAgICAgICAgICBwcmVmaXhfbm9kZSAgLSBSb290IG9mIHN1YnRyZWUgdG8gYmUgc2VhcmNoZWQsIG9yIE5TX0FMTCBmb3IgdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb290IG9mIHRoZSBuYW1lIHNwYWNlLiAgSWYgTmFtZSBpcyBmdWxseQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVhbGlmaWVkIChmaXJzdCBzOCBpcyAnXCcpLCB0aGUgcGFzc2VkIHZhbHVlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiBTY29wZSB3aWxsIG5vdCBiZSBhY2Nlc3NlZC4KLSAqICAgICAgICAgICAgICBGbGFncyAgICAgICAtIFVzZWQgdG8gaW5kaWNhdGUgd2hldGhlciB0byBwZXJmb3JtIHVwc2VhcmNoIG9yCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3QuCi0gKiAgICAgICAgICAgICAgcmV0dXJuX25vZGUgLSBXaGVyZSB0aGUgTm9kZSBpcyByZXR1cm5lZAotICoKLSAqIERFU0NSSVBUSU9OOiBMb29rIHVwIGEgbmFtZSByZWxhdGl2ZSB0byBhIGdpdmVuIHNjb3BlIGFuZCByZXR1cm4gdGhlCi0gKiAgICAgICAgICAgICAgY29ycmVzcG9uZGluZyBOb2RlLiAgTk9URTogU2NvcGUgY2FuIGJlIG51bGwuCi0gKgotICogTVVURVg6ICAgICAgIExvY2tzIG5hbWVzcGFjZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWFjcGlfc3RhdHVzCi1hY3BpX25zX2dldF9ub2RlKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpwcmVmaXhfbm9kZSwKLQkJIGNvbnN0IGNoYXIgKnBhdGhuYW1lLAotCQkgdTMyIGZsYWdzLCBzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqKnJldHVybl9ub2RlKQotewotCXVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSBzY29wZV9pbmZvOwotCWFjcGlfc3RhdHVzIHN0YXR1czsKLQljaGFyICppbnRlcm5hbF9wYXRoOwotCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIobnNfZ2V0X25vZGUsIHBhdGhuYW1lKTsKLQotCWlmICghcGF0aG5hbWUpIHsKLQkJKnJldHVybl9ub2RlID0gcHJlZml4X25vZGU7Ci0JCWlmICghcHJlZml4X25vZGUpIHsKLQkJCSpyZXR1cm5fbm9kZSA9IGFjcGlfZ2JsX3Jvb3Rfbm9kZTsKLQkJfQotCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwotCX0KLQotCS8qIENvbnZlcnQgcGF0aCB0byBpbnRlcm5hbCByZXByZXNlbnRhdGlvbiAqLwotCi0Jc3RhdHVzID0gYWNwaV9uc19pbnRlcm5hbGl6ZV9uYW1lKHBhdGhuYW1lLCAmaW50ZXJuYWxfcGF0aCk7Ci0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotCX0KLQotCS8qIE11c3QgbG9jayBuYW1lc3BhY2UgZHVyaW5nIGxvb2t1cCAqLwotCi0Jc3RhdHVzID0gYWNwaV91dF9hY3F1aXJlX211dGV4KEFDUElfTVRYX05BTUVTUEFDRSk7Ci0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCWdvdG8gY2xlYW51cDsKLQl9Ci0KLQkvKiBTZXR1cCBsb29rdXAgc2NvcGUgKHNlYXJjaCBzdGFydGluZyBwb2ludCkgKi8KLQotCXNjb3BlX2luZm8uc2NvcGUubm9kZSA9IHByZWZpeF9ub2RlOwotCi0JLyogTG9va3VwIHRoZSBuYW1lIGluIHRoZSBuYW1lc3BhY2UgKi8KLQotCXN0YXR1cyA9IGFjcGlfbnNfbG9va3VwKCZzY29wZV9pbmZvLCBpbnRlcm5hbF9wYXRoLCBBQ1BJX1RZUEVfQU5ZLAotCQkJCUFDUElfSU1PREVfRVhFQ1VURSwKLQkJCQkoZmxhZ3MgfCBBQ1BJX05TX0RPTlRfT1BFTl9TQ09QRSksIE5VTEwsCi0JCQkJcmV0dXJuX25vZGUpOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sICIlcywgJXNcbiIsCi0JCQkJICBwYXRobmFtZSwgYWNwaV9mb3JtYXRfZXhjZXB0aW9uKHN0YXR1cykpKTsKLQl9Ci0KLQkodm9pZClhY3BpX3V0X3JlbGVhc2VfbXV0ZXgoQUNQSV9NVFhfTkFNRVNQQUNFKTsKLQotICAgICAgY2xlYW51cDoKLQlBQ1BJX0ZSRUUoaW50ZXJuYWxfcGF0aCk7Ci0JcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfbnNfZ2V0X3BhcmVudF9ub2RlCi0gKgotICogUEFSQU1FVEVSUzogIE5vZGUgICAgICAgLSBDdXJyZW50IHRhYmxlIGVudHJ5Ci0gKgotICogUkVUVVJOOiAgICAgIFBhcmVudCBlbnRyeSBvZiB0aGUgZ2l2ZW4gZW50cnkKLSAqCi0gKiBERVNDUklQVElPTjogT2J0YWluIHRoZSBwYXJlbnQgZW50cnkgZm9yIGEgZ2l2ZW4gZW50cnkgaW4gdGhlIG5hbWVzcGFjZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqYWNwaV9uc19nZXRfcGFyZW50X25vZGUoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUKLQkJCQkJCSAgICAqbm9kZSkKLXsKLQlBQ1BJX0ZVTkNUSU9OX0VOVFJZKCk7Ci0KLQlpZiAoIW5vZGUpIHsKLQkJcmV0dXJuIChOVUxMKTsKLQl9Ci0KLQkvKgotCSAqIFdhbGsgdG8gdGhlIGVuZCBvZiB0aGlzIHBlZXIgbGlzdC4gVGhlIGxhc3QgZW50cnkgaXMgbWFya2VkIHdpdGggYSBmbGFnCi0JICogYW5kIHRoZSBwZWVyIHBvaW50ZXIgaXMgcmVhbGx5IGEgcG9pbnRlciBiYWNrIHRvIHRoZSBwYXJlbnQuIFRoaXMgc2F2ZXMKLQkgKiBwdXR0aW5nIGEgcGFyZW50IGJhY2sgcG9pbnRlciBpbiBlYWNoIGFuZCBldmVyeSBuYW1lZCBvYmplY3QhCi0JICovCi0Jd2hpbGUgKCEobm9kZS0+ZmxhZ3MgJiBBTk9CSl9FTkRfT0ZfUEVFUl9MSVNUKSkgewotCQlub2RlID0gbm9kZS0+cGVlcjsKLQl9Ci0KLQlyZXR1cm4gKG5vZGUtPnBlZXIpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX25zX2dldF9uZXh0X3ZhbGlkX25vZGUKLSAqCi0gKiBQQVJBTUVURVJTOiAgTm9kZSAgICAgICAtIEN1cnJlbnQgdGFibGUgZW50cnkKLSAqCi0gKiBSRVRVUk46ICAgICAgTmV4dCB2YWxpZCBOb2RlIGluIHRoZSBsaW5rZWQgbm9kZSBsaXN0LiBOVUxMIGlmIG5vIG1vcmUgdmFsaWQKLSAqICAgICAgICAgICAgICBub2Rlcy4KLSAqCi0gKiBERVNDUklQVElPTjogRmluZCB0aGUgbmV4dCB2YWxpZCBub2RlIHdpdGhpbiBhIG5hbWUgdGFibGUuCi0gKiAgICAgICAgICAgICAgVXNlZnVsIGZvciBpbXBsZW1lbnRpbmcgTlVMTC1lbmQtb2YtbGlzdCBsb29wcy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqYWNwaV9uc19nZXRfbmV4dF92YWxpZF9ub2RlKHN0cnVjdAotCQkJCQkJCWFjcGlfbmFtZXNwYWNlX25vZGUKLQkJCQkJCQkqbm9kZSkKLXsKLQotCS8qIElmIHdlIGFyZSBhdCB0aGUgZW5kIG9mIHRoaXMgcGVlciBsaXN0LCByZXR1cm4gTlVMTCAqLwotCi0JaWYgKG5vZGUtPmZsYWdzICYgQU5PQkpfRU5EX09GX1BFRVJfTElTVCkgewotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQkvKiBPdGhlcndpc2UganVzdCByZXR1cm4gdGhlIG5leHQgcGVlciAqLwotCi0JcmV0dXJuIChub2RlLT5wZWVyKTsKLX0KLQotI2lmZGVmIEFDUElfT0JTT0xFVEVfRlVOQ1RJT05TCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX25zX2ZpbmRfcGFyZW50X25hbWUKLSAqCi0gKiBQQVJBTUVURVJTOiAgKmNoaWxkX25vZGUgICAgICAgICAgICAtIE5hbWVkIE9iaiB3aG9zZSBuYW1lIGlzIHRvIGJlIGZvdW5kCi0gKgotICogUkVUVVJOOiAgICAgIFRoZSBBQ1BJIG5hbWUKLSAqCi0gKiBERVNDUklQVElPTjogU2VhcmNoIGZvciB0aGUgZ2l2ZW4gb2JqIGluIGl0cyBwYXJlbnQgc2NvcGUgYW5kIHJldHVybiB0aGUKLSAqICAgICAgICAgICAgICBuYW1lIHNlZ21lbnQsIG9yICI/Pz8/IiBpZiB0aGUgcGFyZW50IG5hbWUgY2FuJ3QgYmUgZm91bmQKLSAqICAgICAgICAgICAgICAod2hpY2ggInNob3VsZCBub3QgaGFwcGVuIikuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotYWNwaV9uYW1lIGFjcGlfbnNfZmluZF9wYXJlbnRfbmFtZShzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqIGNoaWxkX25vZGUpCi17Ci0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKnBhcmVudF9ub2RlOwotCi0JQUNQSV9GVU5DVElPTl9UUkFDRShuc19maW5kX3BhcmVudF9uYW1lKTsKLQotCWlmIChjaGlsZF9ub2RlKSB7Ci0KLQkJLyogVmFsaWQgZW50cnkuICBHZXQgdGhlIHBhcmVudCBOb2RlICovCi0KLQkJcGFyZW50X25vZGUgPSBhY3BpX25zX2dldF9wYXJlbnRfbm9kZShjaGlsZF9ub2RlKTsKLQkJaWYgKHBhcmVudF9ub2RlKSB7Ci0JCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VYRUMsCi0JCQkJCSAgIlBhcmVudCBvZiAlcCBbJTQuNHNdIGlzICVwIFslNC40c11cbiIsCi0JCQkJCSAgY2hpbGRfbm9kZSwKLQkJCQkJICBhY3BpX3V0X2dldF9ub2RlX25hbWUoY2hpbGRfbm9kZSksCi0JCQkJCSAgcGFyZW50X25vZGUsCi0JCQkJCSAgYWNwaV91dF9nZXRfbm9kZV9uYW1lKHBhcmVudF9ub2RlKSkpOwotCi0JCQlpZiAocGFyZW50X25vZGUtPm5hbWUuaW50ZWdlcikgewotCQkJCXJldHVybl9WQUxVRSgoYWNwaV9uYW1lKSBwYXJlbnRfbm9kZS0+bmFtZS4KLQkJCQkJICAgICBpbnRlZ2VyKTsKLQkJCX0KLQkJfQotCi0JCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVhFQywKLQkJCQkgICJVbmFibGUgdG8gZmluZCBwYXJlbnQgb2YgJXAgKCU0LjRzKVxuIiwKLQkJCQkgIGNoaWxkX25vZGUsCi0JCQkJICBhY3BpX3V0X2dldF9ub2RlX25hbWUoY2hpbGRfbm9kZSkpKTsKLQl9Ci0KLQlyZXR1cm5fVkFMVUUoQUNQSV9VTktOT1dOX05BTUUpOwotfQotI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zd2Fsay5jIGIvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc3dhbGsuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2M5MDVjZS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zd2Fsay5jCisrKyAvZGV2L251bGwKQEAgLTEsMjk1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBNb2R1bGUgTmFtZTogbnN3YWxrIC0gRnVuY3Rpb25zIGZvciB3YWxraW5nIHRoZSBBQ1BJIG5hbWVzcGFjZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDgsIEludGVsIENvcnAuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCi0gKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSBhdCBtaW5pbXVtIGEgZGlzY2xhaW1lcgotICogICAgc3Vic3RhbnRpYWxseSBzaW1pbGFyIHRvIHRoZSAiTk8gV0FSUkFOVFkiIGRpc2NsYWltZXIgYmVsb3cKLSAqICAgICgiRGlzY2xhaW1lciIpIGFuZCBhbnkgcmVkaXN0cmlidXRpb24gbXVzdCBiZSBjb25kaXRpb25lZCB1cG9uCi0gKiAgICBpbmNsdWRpbmcgYSBzdWJzdGFudGlhbGx5IHNpbWlsYXIgRGlzY2xhaW1lciByZXF1aXJlbWVudCBmb3IgZnVydGhlcgotICogICAgYmluYXJ5IHJlZGlzdHJpYnV0aW9uLgotICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzCi0gKiAgICBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIE5PIFdBUlJBTlRZCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKLSAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCi0gKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORwotICogSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCi0gKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCi0gKi8KLQotI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgotI2luY2x1ZGUgPGFjcGkvYWNuYW1lc3AuaD4KLQotI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfTkFNRVNQQUNFCi1BQ1BJX01PRFVMRV9OQU1FKCJuc3dhbGsiKQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX25zX2dldF9uZXh0X25vZGUKLSAqCi0gKiBQQVJBTUVURVJTOiAgVHlwZSAgICAgICAgICAgICAgICAtIFR5cGUgb2Ygbm9kZSB0byBiZSBzZWFyY2hlZCBmb3IKLSAqICAgICAgICAgICAgICBwYXJlbnRfbm9kZSAgICAgICAgIC0gUGFyZW50IG5vZGUgd2hvc2UgY2hpbGRyZW4gd2UgYXJlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldHRpbmcKLSAqICAgICAgICAgICAgICBjaGlsZF9ub2RlICAgICAgICAgIC0gUHJldmlvdXMgY2hpbGQgdGhhdCB3YXMgZm91bmQuCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBORVhUIGNoaWxkIHdpbGwgYmUgcmV0dXJuZWQKLSAqCi0gKiBSRVRVUk46ICAgICAgc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgLSBQb2ludGVyIHRvIHRoZSBORVhUIGNoaWxkIG9yIE5VTEwgaWYKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9uZSBpcyBmb3VuZC4KLSAqCi0gKiBERVNDUklQVElPTjogUmV0dXJuIHRoZSBuZXh0IHBlZXIgbm9kZSB3aXRoaW4gdGhlIG5hbWVzcGFjZS4gIElmIEhhbmRsZQotICogICAgICAgICAgICAgIGlzIHZhbGlkLCBTY29wZSBpcyBpZ25vcmVkLiAgT3RoZXJ3aXNlLCB0aGUgZmlyc3Qgbm9kZQotICogICAgICAgICAgICAgIHdpdGhpbiBTY29wZSBpcyByZXR1cm5lZC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKmFjcGlfbnNfZ2V0X25leHRfbm9kZShhY3BpX29iamVjdF90eXBlIHR5cGUsIHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlCi0JCQkJCQkgICpwYXJlbnRfbm9kZSwgc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUKLQkJCQkJCSAgKmNoaWxkX25vZGUpCi17Ci0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5leHRfbm9kZSA9IE5VTEw7Ci0KLQlBQ1BJX0ZVTkNUSU9OX0VOVFJZKCk7Ci0KLQlpZiAoIWNoaWxkX25vZGUpIHsKLQotCQkvKiBJdCdzIHJlYWxseSB0aGUgcGFyZW50J3MgX3Njb3BlXyB0aGF0IHdlIHdhbnQgKi8KLQotCQluZXh0X25vZGUgPSBwYXJlbnRfbm9kZS0+Y2hpbGQ7Ci0JfQotCi0JZWxzZSB7Ci0JCS8qIFN0YXJ0IHNlYXJjaCBhdCB0aGUgTkVYVCBub2RlICovCi0KLQkJbmV4dF9ub2RlID0gYWNwaV9uc19nZXRfbmV4dF92YWxpZF9ub2RlKGNoaWxkX25vZGUpOwotCX0KLQotCS8qIElmIGFueSB0eXBlIGlzIE9LLCB3ZSBhcmUgZG9uZSAqLwotCi0JaWYgKHR5cGUgPT0gQUNQSV9UWVBFX0FOWSkgewotCi0JCS8qIG5leHRfbm9kZSBpcyBOVUxMIGlmIHdlIGFyZSBhdCB0aGUgZW5kLW9mLWxpc3QgKi8KLQotCQlyZXR1cm4gKG5leHRfbm9kZSk7Ci0JfQotCi0JLyogTXVzdCBzZWFyY2ggZm9yIHRoZSBub2RlIC0tIGJ1dCB3aXRoaW4gdGhpcyBzY29wZSBvbmx5ICovCi0KLQl3aGlsZSAobmV4dF9ub2RlKSB7Ci0KLQkJLyogSWYgdHlwZSBtYXRjaGVzLCB3ZSBhcmUgZG9uZSAqLwotCi0JCWlmIChuZXh0X25vZGUtPnR5cGUgPT0gdHlwZSkgewotCQkJcmV0dXJuIChuZXh0X25vZGUpOwotCQl9Ci0KLQkJLyogT3RoZXJ3aXNlLCBtb3ZlIG9uIHRvIHRoZSBuZXh0IG5vZGUgKi8KLQotCQluZXh0X25vZGUgPSBhY3BpX25zX2dldF9uZXh0X3ZhbGlkX25vZGUobmV4dF9ub2RlKTsKLQl9Ci0KLQkvKiBOb3QgZm91bmQgKi8KLQotCXJldHVybiAoTlVMTCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfbnNfd2Fsa19uYW1lc3BhY2UKLSAqCi0gKiBQQVJBTUVURVJTOiAgVHlwZSAgICAgICAgICAgICAgICAtIGFjcGlfb2JqZWN0X3R5cGUgdG8gc2VhcmNoIGZvcgotICogICAgICAgICAgICAgIHN0YXJ0X25vZGUgICAgICAgICAgLSBIYW5kbGUgaW4gbmFtZXNwYWNlIHdoZXJlIHNlYXJjaCBiZWdpbnMKLSAqICAgICAgICAgICAgICBtYXhfZGVwdGggICAgICAgICAgIC0gRGVwdGggdG8gd2hpY2ggc2VhcmNoIGlzIHRvIHJlYWNoCi0gKiAgICAgICAgICAgICAgRmxhZ3MgICAgICAgICAgICAgICAtIFdoZXRoZXIgdG8gdW5sb2NrIHRoZSBOUyBiZWZvcmUgaW52b2tpbmcKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGNhbGxiYWNrIHJvdXRpbmUKLSAqICAgICAgICAgICAgICB1c2VyX2Z1bmN0aW9uICAgICAgIC0gQ2FsbGVkIHdoZW4gYW4gb2JqZWN0IG9mICJUeXBlIiBpcyBmb3VuZAotICogICAgICAgICAgICAgIENvbnRleHQgICAgICAgICAgICAgLSBQYXNzZWQgdG8gdXNlciBmdW5jdGlvbgotICogICAgICAgICAgICAgIHJldHVybl92YWx1ZSAgICAgICAgLSBmcm9tIHRoZSB1c2VyX2Z1bmN0aW9uIGlmIHRlcm1pbmF0ZWQgZWFybHkuCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE90aGVyd2lzZSwgcmV0dXJucyBOVUxMLgotICogUkVUVVJOUzogICAgIFN0YXR1cwotICoKLSAqIERFU0NSSVBUSU9OOiBQZXJmb3JtcyBhIG1vZGlmaWVkIGRlcHRoLWZpcnN0IHdhbGsgb2YgdGhlIG5hbWVzcGFjZSB0cmVlLAotICogICAgICAgICAgICAgIHN0YXJ0aW5nIChhbmQgZW5kaW5nKSBhdCB0aGUgbm9kZSBzcGVjaWZpZWQgYnkgc3RhcnRfaGFuZGxlLgotICogICAgICAgICAgICAgIFRoZSB1c2VyX2Z1bmN0aW9uIGlzIGNhbGxlZCB3aGVuZXZlciBhIG5vZGUgdGhhdCBtYXRjaGVzCi0gKiAgICAgICAgICAgICAgdGhlIHR5cGUgcGFyYW1ldGVyIGlzIGZvdW5kLiAgSWYgdGhlIHVzZXIgZnVuY3Rpb24gcmV0dXJucwotICogICAgICAgICAgICAgIGEgbm9uLXplcm8gdmFsdWUsIHRoZSBzZWFyY2ggaXMgdGVybWluYXRlZCBpbW1lZGlhdGVseSBhbmQgdGhpcwotICogICAgICAgICAgICAgIHZhbHVlIGlzIHJldHVybmVkIHRvIHRoZSBjYWxsZXIuCi0gKgotICogICAgICAgICAgICAgIFRoZSBwb2ludCBvZiB0aGlzIHByb2NlZHVyZSBpcyB0byBwcm92aWRlIGEgZ2VuZXJpYyBuYW1lc3BhY2UKLSAqICAgICAgICAgICAgICB3YWxrIHJvdXRpbmUgdGhhdCBjYW4gYmUgY2FsbGVkIGZyb20gbXVsdGlwbGUgcGxhY2VzIHRvCi0gKiAgICAgICAgICAgICAgcHJvdmlkZSBtdWx0aXBsZSBzZXJ2aWNlczsgIHRoZSBVc2VyIEZ1bmN0aW9uIGNhbiBiZSB0YWlsb3JlZAotICogICAgICAgICAgICAgIHRvIGVhY2ggdGFzaywgd2hldGhlciBpdCBpcyBhIHByaW50IGZ1bmN0aW9uLCBhIGNvbXBhcmUKLSAqICAgICAgICAgICAgICBmdW5jdGlvbiwgZXRjLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWFjcGlfc3RhdHVzCi1hY3BpX25zX3dhbGtfbmFtZXNwYWNlKGFjcGlfb2JqZWN0X3R5cGUgdHlwZSwKLQkJICAgICAgIGFjcGlfaGFuZGxlIHN0YXJ0X25vZGUsCi0JCSAgICAgICB1MzIgbWF4X2RlcHRoLAotCQkgICAgICAgdTMyIGZsYWdzLAotCQkgICAgICAgYWNwaV93YWxrX2NhbGxiYWNrIHVzZXJfZnVuY3Rpb24sCi0JCSAgICAgICB2b2lkICpjb250ZXh0LCB2b2lkICoqcmV0dXJuX3ZhbHVlKQotewotCWFjcGlfc3RhdHVzIHN0YXR1czsKLQlhY3BpX3N0YXR1cyBtdXRleF9zdGF0dXM7Ci0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKmNoaWxkX25vZGU7Ci0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKnBhcmVudF9ub2RlOwotCWFjcGlfb2JqZWN0X3R5cGUgY2hpbGRfdHlwZTsKLQl1MzIgbGV2ZWw7Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKG5zX3dhbGtfbmFtZXNwYWNlKTsKLQotCS8qIFNwZWNpYWwgY2FzZSBmb3IgdGhlIG5hbWVzcGFjZSBSb290IE5vZGUgKi8KLQotCWlmIChzdGFydF9ub2RlID09IEFDUElfUk9PVF9PQkpFQ1QpIHsKLQkJc3RhcnRfbm9kZSA9IGFjcGlfZ2JsX3Jvb3Rfbm9kZTsKLQl9Ci0KLQkvKiBOdWxsIGNoaWxkIG1lYW5zICJnZXQgZmlyc3Qgbm9kZSIgKi8KLQotCXBhcmVudF9ub2RlID0gc3RhcnRfbm9kZTsKLQljaGlsZF9ub2RlID0gTlVMTDsKLQljaGlsZF90eXBlID0gQUNQSV9UWVBFX0FOWTsKLQlsZXZlbCA9IDE7Ci0KLQkvKgotCSAqIFRyYXZlcnNlIHRoZSB0cmVlIG9mIG5vZGVzIHVudGlsIHdlIGJ1YmJsZSBiYWNrIHVwIHRvIHdoZXJlIHdlCi0JICogc3RhcnRlZC4gV2hlbiBMZXZlbCBpcyB6ZXJvLCB0aGUgbG9vcCBpcyBkb25lIGJlY2F1c2Ugd2UgaGF2ZQotCSAqIGJ1YmJsZWQgdXAgdG8gKGFuZCBwYXNzZWQpIHRoZSBvcmlnaW5hbCBwYXJlbnQgaGFuZGxlIChzdGFydF9lbnRyeSkKLQkgKi8KLQl3aGlsZSAobGV2ZWwgPiAwKSB7Ci0KLQkJLyogR2V0IHRoZSBuZXh0IG5vZGUgaW4gdGhpcyBzY29wZS4gIE51bGwgaWYgbm90IGZvdW5kICovCi0KLQkJc3RhdHVzID0gQUVfT0s7Ci0JCWNoaWxkX25vZGUgPQotCQkgICAgYWNwaV9uc19nZXRfbmV4dF9ub2RlKEFDUElfVFlQRV9BTlksIHBhcmVudF9ub2RlLAotCQkJCQkgIGNoaWxkX25vZGUpOwotCQlpZiAoY2hpbGRfbm9kZSkgewotCi0JCQkvKiBGb3VuZCBuZXh0IGNoaWxkLCBnZXQgdGhlIHR5cGUgaWYgd2UgYXJlIG5vdCBzZWFyY2hpbmcgZm9yIEFOWSAqLwotCi0JCQlpZiAodHlwZSAhPSBBQ1BJX1RZUEVfQU5ZKSB7Ci0JCQkJY2hpbGRfdHlwZSA9IGNoaWxkX25vZGUtPnR5cGU7Ci0JCQl9Ci0KLQkJCS8qCi0JCQkgKiBJZ25vcmUgYWxsIHRlbXBvcmFyeSBuYW1lc3BhY2Ugbm9kZXMgKGNyZWF0ZWQgZHVyaW5nIGNvbnRyb2wKLQkJCSAqIG1ldGhvZCBleGVjdXRpb24pIHVubGVzcyB0b2xkIG90aGVyd2lzZS4gVGhlc2UgdGVtcG9yYXJ5IG5vZGVzCi0JCQkgKiBjYW4gY2F1c2UgYSByYWNlIGNvbmRpdGlvbiBiZWNhdXNlIHRoZXkgY2FuIGJlIGRlbGV0ZWQgZHVyaW5nIHRoZQotCQkJICogZXhlY3V0aW9uIG9mIHRoZSB1c2VyIGZ1bmN0aW9uIChpZiB0aGUgbmFtZXNwYWNlIGlzIHVubG9ja2VkIGJlZm9yZQotCQkJICogaW52b2NhdGlvbiBvZiB0aGUgdXNlciBmdW5jdGlvbi4pIE9ubHkgdGhlIGRlYnVnZ2VyIG5hbWVzcGFjZSBkdW1wCi0JCQkgKiB3aWxsIGV4YW1pbmUgdGhlIHRlbXBvcmFyeSBub2Rlcy4KLQkJCSAqLwotCQkJaWYgKChjaGlsZF9ub2RlLT5mbGFncyAmIEFOT0JKX1RFTVBPUkFSWSkgJiYKLQkJCSAgICAhKGZsYWdzICYgQUNQSV9OU19XQUxLX1RFTVBfTk9ERVMpKSB7Ci0JCQkJc3RhdHVzID0gQUVfQ1RSTF9ERVBUSDsKLQkJCX0KLQotCQkJLyogVHlwZSBtdXN0IG1hdGNoIHJlcXVlc3RlZCB0eXBlICovCi0KLQkJCWVsc2UgaWYgKGNoaWxkX3R5cGUgPT0gdHlwZSkgewotCQkJCS8qCi0JCQkJICogRm91bmQgYSBtYXRjaGluZyBub2RlLCBpbnZva2UgdGhlIHVzZXIgY2FsbGJhY2sgZnVuY3Rpb24uCi0JCQkJICogVW5sb2NrIHRoZSBuYW1lc3BhY2UgaWYgZmxhZyBpcyBzZXQuCi0JCQkJICovCi0JCQkJaWYgKGZsYWdzICYgQUNQSV9OU19XQUxLX1VOTE9DSykgewotCQkJCQltdXRleF9zdGF0dXMgPQotCQkJCQkgICAgYWNwaV91dF9yZWxlYXNlX211dGV4Ci0JCQkJCSAgICAoQUNQSV9NVFhfTkFNRVNQQUNFKTsKLQkJCQkJaWYgKEFDUElfRkFJTFVSRShtdXRleF9zdGF0dXMpKSB7Ci0JCQkJCQlyZXR1cm5fQUNQSV9TVEFUVVMKLQkJCQkJCSAgICAobXV0ZXhfc3RhdHVzKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCXN0YXR1cyA9Ci0JCQkJICAgIHVzZXJfZnVuY3Rpb24oY2hpbGRfbm9kZSwgbGV2ZWwsIGNvbnRleHQsCi0JCQkJCQkgIHJldHVybl92YWx1ZSk7Ci0KLQkJCQlpZiAoZmxhZ3MgJiBBQ1BJX05TX1dBTEtfVU5MT0NLKSB7Ci0JCQkJCW11dGV4X3N0YXR1cyA9Ci0JCQkJCSAgICBhY3BpX3V0X2FjcXVpcmVfbXV0ZXgKLQkJCQkJICAgIChBQ1BJX01UWF9OQU1FU1BBQ0UpOwotCQkJCQlpZiAoQUNQSV9GQUlMVVJFKG11dGV4X3N0YXR1cykpIHsKLQkJCQkJCXJldHVybl9BQ1BJX1NUQVRVUwotCQkJCQkJICAgIChtdXRleF9zdGF0dXMpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJc3dpdGNoIChzdGF0dXMpIHsKLQkJCQljYXNlIEFFX09LOgotCQkJCWNhc2UgQUVfQ1RSTF9ERVBUSDoKLQotCQkJCQkvKiBKdXN0IGtlZXAgZ29pbmcgKi8KLQkJCQkJYnJlYWs7Ci0KLQkJCQljYXNlIEFFX0NUUkxfVEVSTUlOQVRFOgotCi0JCQkJCS8qIEV4aXQgbm93LCB3aXRoIE9LIHN0YXR1cyAqLwotCi0JCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7Ci0KLQkJCQlkZWZhdWx0OgotCi0JCQkJCS8qIEFsbCBvdGhlcnMgYXJlIHZhbGlkIGV4Y2VwdGlvbnMgKi8KLQotCQkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8qCi0JCQkgKiBEZXB0aCBmaXJzdCBzZWFyY2g6IEF0dGVtcHQgdG8gZ28gZG93biBhbm90aGVyIGxldmVsIGluIHRoZQotCQkJICogbmFtZXNwYWNlIGlmIHdlIGFyZSBhbGxvd2VkIHRvLiAgRG9uJ3QgZ28gYW55IGZ1cnRoZXIgaWYgd2UgaGF2ZQotCQkJICogcmVhY2hlZCB0aGUgY2FsbGVyIHNwZWNpZmllZCBtYXhpbXVtIGRlcHRoIG9yIGlmIHRoZSB1c2VyCi0JCQkgKiBmdW5jdGlvbiBoYXMgc3BlY2lmaWVkIHRoYXQgdGhlIG1heGltdW0gZGVwdGggaGFzIGJlZW4gcmVhY2hlZC4KLQkJCSAqLwotCQkJaWYgKChsZXZlbCA8IG1heF9kZXB0aCkgJiYgKHN0YXR1cyAhPSBBRV9DVFJMX0RFUFRIKSkgewotCQkJCWlmIChhY3BpX25zX2dldF9uZXh0X25vZGUKLQkJCQkgICAgKEFDUElfVFlQRV9BTlksIGNoaWxkX25vZGUsIE5VTEwpKSB7Ci0KLQkJCQkJLyogVGhlcmUgaXMgYXQgbGVhc3Qgb25lIGNoaWxkIG9mIHRoaXMgbm9kZSwgdmlzaXQgaXQgKi8KLQotCQkJCQlsZXZlbCsrOwotCQkJCQlwYXJlbnRfbm9kZSA9IGNoaWxkX25vZGU7Ci0JCQkJCWNoaWxkX25vZGUgPSBOVUxMOwotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIHsKLQkJCS8qCi0JCQkgKiBObyBtb3JlIGNoaWxkcmVuIG9mIHRoaXMgbm9kZSAoYWNwaV9uc19nZXRfbmV4dF9ub2RlIGZhaWxlZCksIGdvCi0JCQkgKiBiYWNrIHVwd2FyZHMgaW4gdGhlIG5hbWVzcGFjZSB0cmVlIHRvIHRoZSBub2RlJ3MgcGFyZW50LgotCQkJICovCi0JCQlsZXZlbC0tOwotCQkJY2hpbGRfbm9kZSA9IHBhcmVudF9ub2RlOwotCQkJcGFyZW50X25vZGUgPSBhY3BpX25zX2dldF9wYXJlbnRfbm9kZShwYXJlbnRfbm9kZSk7Ci0JCX0KLQl9Ci0KLQkvKiBDb21wbGV0ZSB3YWxrLCBub3QgdGVybWluYXRlZCBieSB1c2VyIGZ1bmN0aW9uICovCi0KLQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc3hmZXZhbC5jIGIvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc3hmZXZhbC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDg1Y2MzLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnN4ZmV2YWwuYworKysgL2Rldi9udWxsCkBAIC0xLDgxMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIE1vZHVsZSBOYW1lOiBuc3hmZXZhbCAtIFB1YmxpYyBpbnRlcmZhY2VzIHRvIHRoZSBBQ1BJIHN1YnN5c3RlbQotICogICAgICAgICAgICAgICAgICAgICAgICAgQUNQSSBPYmplY3QgZXZhbHVhdGlvbiBpbnRlcmZhY2VzCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDgsIEludGVsIENvcnAuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCi0gKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSBhdCBtaW5pbXVtIGEgZGlzY2xhaW1lcgotICogICAgc3Vic3RhbnRpYWxseSBzaW1pbGFyIHRvIHRoZSAiTk8gV0FSUkFOVFkiIGRpc2NsYWltZXIgYmVsb3cKLSAqICAgICgiRGlzY2xhaW1lciIpIGFuZCBhbnkgcmVkaXN0cmlidXRpb24gbXVzdCBiZSBjb25kaXRpb25lZCB1cG9uCi0gKiAgICBpbmNsdWRpbmcgYSBzdWJzdGFudGlhbGx5IHNpbWlsYXIgRGlzY2xhaW1lciByZXF1aXJlbWVudCBmb3IgZnVydGhlcgotICogICAgYmluYXJ5IHJlZGlzdHJpYnV0aW9uLgotICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzCi0gKiAgICBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIE5PIFdBUlJBTlRZCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKLSAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCi0gKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORwotICogSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCi0gKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCi0gKi8KLQotI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgotI2luY2x1ZGUgPGFjcGkvYWNuYW1lc3AuaD4KLSNpbmNsdWRlIDxhY3BpL2FjaW50ZXJwLmg+Ci0KLSNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX05BTUVTUEFDRQotQUNQSV9NT0RVTEVfTkFNRSgibnN4ZmV2YWwiKQotCi0vKiBMb2NhbCBwcm90b3R5cGVzICovCi1zdGF0aWMgdm9pZCBhY3BpX25zX3Jlc29sdmVfcmVmZXJlbmNlcyhzdHJ1Y3QgYWNwaV9ldmFsdWF0ZV9pbmZvICppbmZvKTsKLQotI2lmZGVmIEFDUElfRlVUVVJFX1VTQUdFCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX2V2YWx1YXRlX29iamVjdF90eXBlZAotICoKLSAqIFBBUkFNRVRFUlM6ICBIYW5kbGUgICAgICAgICAgICAgIC0gT2JqZWN0IGhhbmRsZSAob3B0aW9uYWwpCi0gKiAgICAgICAgICAgICAgUGF0aG5hbWUgICAgICAgICAgICAtIE9iamVjdCBwYXRobmFtZSAob3B0aW9uYWwpCi0gKiAgICAgICAgICAgICAgZXh0ZXJuYWxfcGFyYW1zICAgICAtIExpc3Qgb2YgcGFyYW1ldGVycyB0byBwYXNzIHRvIG1ldGhvZCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVybWluYXRlZCBieSBOVUxMLiAgTWF5IGJlIE5VTEwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgbm8gcGFyYW1ldGVycyBhcmUgYmVpbmcgcGFzc2VkLgotICogICAgICAgICAgICAgIHJldHVybl9idWZmZXIgICAgICAgLSBXaGVyZSB0byBwdXQgbWV0aG9kJ3MgcmV0dXJuIHZhbHVlIChpZgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbnkpLiAgSWYgTlVMTCwgbm8gdmFsdWUgaXMgcmV0dXJuZWQuCi0gKiAgICAgICAgICAgICAgcmV0dXJuX3R5cGUgICAgICAgICAtIEV4cGVjdGVkIHR5cGUgb2YgcmV0dXJuIG9iamVjdAotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKLSAqCi0gKiBERVNDUklQVElPTjogRmluZCBhbmQgZXZhbHVhdGUgdGhlIGdpdmVuIG9iamVjdCwgcGFzc2luZyB0aGUgZ2l2ZW4KLSAqICAgICAgICAgICAgICBwYXJhbWV0ZXJzIGlmIG5lY2Vzc2FyeS4gIE9uZSBvZiAiSGFuZGxlIiBvciAiUGF0aG5hbWUiIG11c3QKLSAqICAgICAgICAgICAgICBiZSB2YWxpZCAobm9uLW51bGwpCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotYWNwaV9zdGF0dXMKLWFjcGlfZXZhbHVhdGVfb2JqZWN0X3R5cGVkKGFjcGlfaGFuZGxlIGhhbmRsZSwKLQkJCSAgIGFjcGlfc3RyaW5nIHBhdGhuYW1lLAotCQkJICAgc3RydWN0IGFjcGlfb2JqZWN0X2xpc3QgKmV4dGVybmFsX3BhcmFtcywKLQkJCSAgIHN0cnVjdCBhY3BpX2J1ZmZlciAqcmV0dXJuX2J1ZmZlciwKLQkJCSAgIGFjcGlfb2JqZWN0X3R5cGUgcmV0dXJuX3R5cGUpCi17Ci0JYWNwaV9zdGF0dXMgc3RhdHVzOwotCXU4IG11c3RfZnJlZSA9IEZBTFNFOwotCi0JQUNQSV9GVU5DVElPTl9UUkFDRShhY3BpX2V2YWx1YXRlX29iamVjdF90eXBlZCk7Ci0KLQkvKiBSZXR1cm4gYnVmZmVyIG11c3QgYmUgdmFsaWQgKi8KLQotCWlmICghcmV0dXJuX2J1ZmZlcikgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX1BBUkFNRVRFUik7Ci0JfQotCi0JaWYgKHJldHVybl9idWZmZXItPmxlbmd0aCA9PSBBQ1BJX0FMTE9DQVRFX0JVRkZFUikgewotCQltdXN0X2ZyZWUgPSBUUlVFOwotCX0KLQotCS8qIEV2YWx1YXRlIHRoZSBvYmplY3QgKi8KLQotCXN0YXR1cyA9Ci0JICAgIGFjcGlfZXZhbHVhdGVfb2JqZWN0KGhhbmRsZSwgcGF0aG5hbWUsIGV4dGVybmFsX3BhcmFtcywKLQkJCQkgcmV0dXJuX2J1ZmZlcik7Ci0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotCX0KLQotCS8qIFR5cGUgQU5ZIG1lYW5zICJkb24ndCBjYXJlIiAqLwotCi0JaWYgKHJldHVybl90eXBlID09IEFDUElfVFlQRV9BTlkpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKLQl9Ci0KLQlpZiAocmV0dXJuX2J1ZmZlci0+bGVuZ3RoID09IDApIHsKLQotCQkvKiBFcnJvciBiZWNhdXNlIGNhbGxlciBzcGVjaWZpY2FsbHkgYXNrZWQgZm9yIGEgcmV0dXJuIHZhbHVlICovCi0KLQkJQUNQSV9FUlJPUigoQUVfSU5GTywgIk5vIHJldHVybiB2YWx1ZSIpKTsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05VTExfT0JKRUNUKTsKLQl9Ci0KLQkvKiBFeGFtaW5lIHRoZSBvYmplY3QgdHlwZSByZXR1cm5lZCBmcm9tIGV2YWx1YXRlX29iamVjdCAqLwotCi0JaWYgKCgodW5pb24gYWNwaV9vYmplY3QgKilyZXR1cm5fYnVmZmVyLT5wb2ludGVyKS0+dHlwZSA9PSByZXR1cm5fdHlwZSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwotCX0KLQotCS8qIFJldHVybiBvYmplY3QgdHlwZSBkb2VzIG5vdCBtYXRjaCByZXF1ZXN0ZWQgdHlwZSAqLwotCi0JQUNQSV9FUlJPUigoQUVfSU5GTywKLQkJICAgICJJbmNvcnJlY3QgcmV0dXJuIHR5cGUgWyVzXSByZXF1ZXN0ZWQgWyVzXSIsCi0JCSAgICBhY3BpX3V0X2dldF90eXBlX25hbWUoKCh1bmlvbiBhY3BpX29iamVjdCAqKXJldHVybl9idWZmZXItPgotCQkJCQkgICBwb2ludGVyKS0+dHlwZSksCi0JCSAgICBhY3BpX3V0X2dldF90eXBlX25hbWUocmV0dXJuX3R5cGUpKSk7Ci0KLQlpZiAobXVzdF9mcmVlKSB7Ci0KLQkJLyogQ2FsbGVyIHVzZWQgQUNQSV9BTExPQ0FURV9CVUZGRVIsIGZyZWUgdGhlIHJldHVybiBidWZmZXIgKi8KLQotCQlBQ1BJX0ZSRUUocmV0dXJuX2J1ZmZlci0+cG9pbnRlcik7Ci0JCXJldHVybl9idWZmZXItPnBvaW50ZXIgPSBOVUxMOwotCX0KLQotCXJldHVybl9idWZmZXItPmxlbmd0aCA9IDA7Ci0JcmV0dXJuX0FDUElfU1RBVFVTKEFFX1RZUEUpOwotfQotCi1BQ1BJX0VYUE9SVF9TWU1CT0woYWNwaV9ldmFsdWF0ZV9vYmplY3RfdHlwZWQpCi0jZW5kaWYJCQkJLyogIEFDUElfRlVUVVJFX1VTQUdFICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9ldmFsdWF0ZV9vYmplY3QKLSAqCi0gKiBQQVJBTUVURVJTOiAgSGFuZGxlICAgICAgICAgICAgICAtIE9iamVjdCBoYW5kbGUgKG9wdGlvbmFsKQotICogICAgICAgICAgICAgIFBhdGhuYW1lICAgICAgICAgICAgLSBPYmplY3QgcGF0aG5hbWUgKG9wdGlvbmFsKQotICogICAgICAgICAgICAgIGV4dGVybmFsX3BhcmFtcyAgICAgLSBMaXN0IG9mIHBhcmFtZXRlcnMgdG8gcGFzcyB0byBtZXRob2QsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlcm1pbmF0ZWQgYnkgTlVMTC4gIE1heSBiZSBOVUxMCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5vIHBhcmFtZXRlcnMgYXJlIGJlaW5nIHBhc3NlZC4KLSAqICAgICAgICAgICAgICByZXR1cm5fYnVmZmVyICAgICAgIC0gV2hlcmUgdG8gcHV0IG1ldGhvZCdzIHJldHVybiB2YWx1ZSAoaWYKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW55KS4gIElmIE5VTEwsIG5vIHZhbHVlIGlzIHJldHVybmVkLgotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKLSAqCi0gKiBERVNDUklQVElPTjogRmluZCBhbmQgZXZhbHVhdGUgdGhlIGdpdmVuIG9iamVjdCwgcGFzc2luZyB0aGUgZ2l2ZW4KLSAqICAgICAgICAgICAgICBwYXJhbWV0ZXJzIGlmIG5lY2Vzc2FyeS4gIE9uZSBvZiAiSGFuZGxlIiBvciAiUGF0aG5hbWUiIG11c3QKLSAqICAgICAgICAgICAgICBiZSB2YWxpZCAobm9uLW51bGwpCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWFjcGlfc3RhdHVzCi1hY3BpX2V2YWx1YXRlX29iamVjdChhY3BpX2hhbmRsZSBoYW5kbGUsCi0JCSAgICAgYWNwaV9zdHJpbmcgcGF0aG5hbWUsCi0JCSAgICAgc3RydWN0IGFjcGlfb2JqZWN0X2xpc3QgKmV4dGVybmFsX3BhcmFtcywKLQkJICAgICBzdHJ1Y3QgYWNwaV9idWZmZXIgKnJldHVybl9idWZmZXIpCi17Ci0JYWNwaV9zdGF0dXMgc3RhdHVzOwotCXN0cnVjdCBhY3BpX2V2YWx1YXRlX2luZm8gKmluZm87Ci0JYWNwaV9zaXplIGJ1ZmZlcl9zcGFjZV9uZWVkZWQ7Ci0JdTMyIGk7Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGFjcGlfZXZhbHVhdGVfb2JqZWN0KTsKLQotCS8qIEFsbG9jYXRlIGFuZCBpbml0aWFsaXplIHRoZSBldmFsdWF0aW9uIGluZm9ybWF0aW9uIGJsb2NrICovCi0KLQlpbmZvID0gQUNQSV9BTExPQ0FURV9aRVJPRUQoc2l6ZW9mKHN0cnVjdCBhY3BpX2V2YWx1YXRlX2luZm8pKTsKLQlpZiAoIWluZm8pIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX01FTU9SWSk7Ci0JfQotCi0JaW5mby0+cGF0aG5hbWUgPSBwYXRobmFtZTsKLQotCS8qIENvbnZlcnQgYW5kIHZhbGlkYXRlIHRoZSBkZXZpY2UgaGFuZGxlICovCi0KLQlpbmZvLT5wcmVmaXhfbm9kZSA9IGFjcGlfbnNfbWFwX2hhbmRsZV90b19ub2RlKGhhbmRsZSk7Ci0JaWYgKCFpbmZvLT5wcmVmaXhfbm9kZSkgewotCQlzdGF0dXMgPSBBRV9CQURfUEFSQU1FVEVSOwotCQlnb3RvIGNsZWFudXA7Ci0JfQotCi0JLyoKLQkgKiBJZiB0aGVyZSBhcmUgcGFyYW1ldGVycyB0byBiZSBwYXNzZWQgdG8gYSBjb250cm9sIG1ldGhvZCwgdGhlIGV4dGVybmFsCi0JICogb2JqZWN0cyBtdXN0IGFsbCBiZSBjb252ZXJ0ZWQgdG8gaW50ZXJuYWwgb2JqZWN0cwotCSAqLwotCWlmIChleHRlcm5hbF9wYXJhbXMgJiYgZXh0ZXJuYWxfcGFyYW1zLT5jb3VudCkgewotCQkvKgotCQkgKiBBbGxvY2F0ZSBhIG5ldyBwYXJhbWV0ZXIgYmxvY2sgZm9yIHRoZSBpbnRlcm5hbCBvYmplY3RzCi0JCSAqIEFkZCAxIHRvIGNvdW50IHRvIGFsbG93IGZvciBudWxsIHRlcm1pbmF0ZWQgaW50ZXJuYWwgbGlzdAotCQkgKi8KLQkJaW5mby0+cGFyYW1ldGVycyA9IEFDUElfQUxMT0NBVEVfWkVST0VEKCgoYWNwaV9zaXplKQotCQkJCQkJCSBleHRlcm5hbF9wYXJhbXMtPgotCQkJCQkJCSBjb3VudCArCi0JCQkJCQkJIDEpICogc2l6ZW9mKHZvaWQgKikpOwotCQlpZiAoIWluZm8tPnBhcmFtZXRlcnMpIHsKLQkJCXN0YXR1cyA9IEFFX05PX01FTU9SWTsKLQkJCWdvdG8gY2xlYW51cDsKLQkJfQotCi0JCS8qIENvbnZlcnQgZWFjaCBleHRlcm5hbCBvYmplY3QgaW4gdGhlIGxpc3QgdG8gYW4gaW50ZXJuYWwgb2JqZWN0ICovCi0KLQkJZm9yIChpID0gMDsgaSA8IGV4dGVybmFsX3BhcmFtcy0+Y291bnQ7IGkrKykgewotCQkJc3RhdHVzID0KLQkJCSAgICBhY3BpX3V0X2NvcHlfZW9iamVjdF90b19pb2JqZWN0KCZleHRlcm5hbF9wYXJhbXMtPgotCQkJCQkJCSAgICBwb2ludGVyW2ldLAotCQkJCQkJCSAgICAmaW5mby0+Ci0JCQkJCQkJICAgIHBhcmFtZXRlcnNbaV0pOwotCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCQkJZ290byBjbGVhbnVwOwotCQkJfQotCQl9Ci0JCWluZm8tPnBhcmFtZXRlcnNbZXh0ZXJuYWxfcGFyYW1zLT5jb3VudF0gPSBOVUxMOwotCX0KLQotCS8qCi0JICogVGhyZWUgbWFqb3IgY2FzZXM6Ci0JICogMSkgRnVsbHkgcXVhbGlmaWVkIHBhdGhuYW1lCi0JICogMikgTm8gaGFuZGxlLCBub3QgZnVsbHkgcXVhbGlmaWVkIHBhdGhuYW1lIChlcnJvcikKLQkgKiAzKSBWYWxpZCBoYW5kbGUKLQkgKi8KLQlpZiAoKHBhdGhuYW1lKSAmJiAoYWNwaV9uc192YWxpZF9yb290X3ByZWZpeChwYXRobmFtZVswXSkpKSB7Ci0KLQkJLyogVGhlIHBhdGggaXMgZnVsbHkgcXVhbGlmaWVkLCBqdXN0IGV2YWx1YXRlIGJ5IG5hbWUgKi8KLQotCQlpbmZvLT5wcmVmaXhfbm9kZSA9IE5VTEw7Ci0JCXN0YXR1cyA9IGFjcGlfbnNfZXZhbHVhdGUoaW5mbyk7Ci0JfSBlbHNlIGlmICghaGFuZGxlKSB7Ci0JCS8qCi0JCSAqIEEgaGFuZGxlIGlzIG9wdGlvbmFsIGlmZiBhIGZ1bGx5IHF1YWxpZmllZCBwYXRobmFtZSBpcyBzcGVjaWZpZWQuCi0JCSAqIFNpbmNlIHdlJ3ZlIGFscmVhZHkgaGFuZGxlZCBmdWxseSBxdWFsaWZpZWQgbmFtZXMgYWJvdmUsIHRoaXMgaXMKLQkJICogYW4gZXJyb3IKLQkJICovCi0JCWlmICghcGF0aG5hbWUpIHsKLQkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywKLQkJCQkJICAiQm90aCBIYW5kbGUgYW5kIFBhdGhuYW1lIGFyZSBOVUxMIikpOwotCQl9IGVsc2UgewotCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLAotCQkJCQkgICJOdWxsIEhhbmRsZSB3aXRoIHJlbGF0aXZlIHBhdGhuYW1lIFslc10iLAotCQkJCQkgIHBhdGhuYW1lKSk7Ci0JCX0KLQotCQlzdGF0dXMgPSBBRV9CQURfUEFSQU1FVEVSOwotCX0gZWxzZSB7Ci0JCS8qIFdlIGhhdmUgYSBuYW1lc3BhY2UgYSBub2RlIGFuZCBhIHBvc3NpYmxlIHJlbGF0aXZlIHBhdGggKi8KLQotCQlzdGF0dXMgPSBhY3BpX25zX2V2YWx1YXRlKGluZm8pOwotCX0KLQotCS8qCi0JICogSWYgd2UgYXJlIGV4cGVjdGluZyBhIHJldHVybiB2YWx1ZSwgYW5kIGFsbCB3ZW50IHdlbGwgYWJvdmUsCi0JICogY29weSB0aGUgcmV0dXJuIHZhbHVlIHRvIGFuIGV4dGVybmFsIG9iamVjdC4KLQkgKi8KLQlpZiAocmV0dXJuX2J1ZmZlcikgewotCQlpZiAoIWluZm8tPnJldHVybl9vYmplY3QpIHsKLQkJCXJldHVybl9idWZmZXItPmxlbmd0aCA9IDA7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoQUNQSV9HRVRfREVTQ1JJUFRPUl9UWVBFKGluZm8tPnJldHVybl9vYmplY3QpID09Ci0JCQkgICAgQUNQSV9ERVNDX1RZUEVfTkFNRUQpIHsKLQkJCQkvKgotCQkJCSAqIElmIHdlIHJlY2VpdmVkIGEgTlMgTm9kZSBhcyBhIHJldHVybiBvYmplY3QsIHRoaXMgbWVhbnMgdGhhdAotCQkJCSAqIHRoZSBvYmplY3Qgd2UgYXJlIGV2YWx1YXRpbmcgaGFzIG5vdGhpbmcgaW50ZXJlc3RpbmcgdG8KLQkJCQkgKiByZXR1cm4gKHN1Y2ggYXMgYSBtdXRleCwgZXRjLikgIFdlIHJldHVybiBhbiBlcnJvciBiZWNhdXNlCi0JCQkJICogdGhlc2UgdHlwZXMgYXJlIGVzc2VudGlhbGx5IHVuc3VwcG9ydGVkIGJ5IHRoaXMgaW50ZXJmYWNlLgotCQkJCSAqIFdlIGRvbid0IGNoZWNrIHVwIGZyb250IGJlY2F1c2UgdGhpcyBtYWtlcyBpdCBlYXNpZXIgdG8gYWRkCi0JCQkJICogc3VwcG9ydCBmb3IgdmFyaW91cyB0eXBlcyBhdCBhIGxhdGVyIGRhdGUgaWYgbmVjZXNzYXJ5LgotCQkJCSAqLwotCQkJCXN0YXR1cyA9IEFFX1RZUEU7Ci0JCQkJaW5mby0+cmV0dXJuX29iamVjdCA9IE5VTEw7CS8qIE5vIG5lZWQgdG8gZGVsZXRlIGEgTlMgTm9kZSAqLwotCQkJCXJldHVybl9idWZmZXItPmxlbmd0aCA9IDA7Ci0JCQl9Ci0KLQkJCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkgewotCi0JCQkJLyogRGVyZWZlcmVuY2UgSW5kZXggYW5kIHJlZl9vZiByZWZlcmVuY2VzICovCi0KLQkJCQlhY3BpX25zX3Jlc29sdmVfcmVmZXJlbmNlcyhpbmZvKTsKLQotCQkJCS8qIEdldCB0aGUgc2l6ZSBvZiB0aGUgcmV0dXJuZWQgb2JqZWN0ICovCi0KLQkJCQlzdGF0dXMgPQotCQkJCSAgICBhY3BpX3V0X2dldF9vYmplY3Rfc2l6ZShpbmZvLT5yZXR1cm5fb2JqZWN0LAotCQkJCQkJCSAgICAmYnVmZmVyX3NwYWNlX25lZWRlZCk7Ci0JCQkJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKSB7Ci0KLQkJCQkJLyogVmFsaWRhdGUvQWxsb2NhdGUvQ2xlYXIgY2FsbGVyIGJ1ZmZlciAqLwotCi0JCQkJCXN0YXR1cyA9Ci0JCQkJCSAgICBhY3BpX3V0X2luaXRpYWxpemVfYnVmZmVyCi0JCQkJCSAgICAocmV0dXJuX2J1ZmZlciwKLQkJCQkJICAgICBidWZmZXJfc3BhY2VfbmVlZGVkKTsKLQkJCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCQkJCQkvKgotCQkJCQkJICogQ2FsbGVyJ3MgYnVmZmVyIGlzIHRvbyBzbWFsbCBvciBhIG5ldyBvbmUgY2FuJ3QKLQkJCQkJCSAqIGJlIGFsbG9jYXRlZAotCQkJCQkJICovCi0JCQkJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sCi0JCQkJCQkJCSAgIk5lZWRlZCBidWZmZXIgc2l6ZSAlWCwgJXNcbiIsCi0JCQkJCQkJCSAgKHUzMikKLQkJCQkJCQkJICBidWZmZXJfc3BhY2VfbmVlZGVkLAotCQkJCQkJCQkgIGFjcGlfZm9ybWF0X2V4Y2VwdGlvbgotCQkJCQkJCQkgIChzdGF0dXMpKSk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQkvKiBXZSBoYXZlIGVub3VnaCBzcGFjZSBmb3IgdGhlIG9iamVjdCwgYnVpbGQgaXQgKi8KLQotCQkJCQkJc3RhdHVzID0KLQkJCQkJCSAgICBhY3BpX3V0X2NvcHlfaW9iamVjdF90b19lb2JqZWN0Ci0JCQkJCQkgICAgKGluZm8tPnJldHVybl9vYmplY3QsCi0JCQkJCQkgICAgIHJldHVybl9idWZmZXIpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JaWYgKGluZm8tPnJldHVybl9vYmplY3QpIHsKLQkJLyoKLQkJICogRGVsZXRlIHRoZSBpbnRlcm5hbCByZXR1cm4gb2JqZWN0LiBOT1RFOiBJbnRlcnByZXRlciBtdXN0IGJlCi0JCSAqIGxvY2tlZCB0byBhdm9pZCByYWNlIGNvbmRpdGlvbi4KLQkJICovCi0JCWFjcGlfZXhfZW50ZXJfaW50ZXJwcmV0ZXIoKTsKLQotCQkvKiBSZW1vdmUgb25lIHJlZmVyZW5jZSBvbiB0aGUgcmV0dXJuIG9iamVjdCAoc2hvdWxkIGRlbGV0ZSBpdCkgKi8KLQotCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UoaW5mby0+cmV0dXJuX29iamVjdCk7Ci0JCWFjcGlfZXhfZXhpdF9pbnRlcnByZXRlcigpOwotCX0KLQotICAgICAgY2xlYW51cDoKLQotCS8qIEZyZWUgdGhlIGlucHV0IHBhcmFtZXRlciBsaXN0IChpZiB3ZSBjcmVhdGVkIG9uZSkgKi8KLQotCWlmIChpbmZvLT5wYXJhbWV0ZXJzKSB7Ci0KLQkJLyogRnJlZSB0aGUgYWxsb2NhdGVkIHBhcmFtZXRlciBibG9jayAqLwotCi0JCWFjcGlfdXRfZGVsZXRlX2ludGVybmFsX29iamVjdF9saXN0KGluZm8tPnBhcmFtZXRlcnMpOwotCX0KLQotCUFDUElfRlJFRShpbmZvKTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLX0KLQotQUNQSV9FWFBPUlRfU1lNQk9MKGFjcGlfZXZhbHVhdGVfb2JqZWN0KQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX25zX3Jlc29sdmVfcmVmZXJlbmNlcwotICoKLSAqIFBBUkFNRVRFUlM6ICBJbmZvICAgICAgICAgICAgICAgICAgICAtIEV2YWx1YXRpb24gaW5mbyBibG9jawotICoKLSAqIFJFVFVSTjogICAgICBJbmZvLT5yZXR1cm5fb2JqZWN0IGlzIHJlcGxhY2VkIHdpdGggdGhlIGRlcmVmZXJlbmNlZCBvYmplY3QKLSAqCi0gKiBERVNDUklQVElPTjogRGVyZWZlcmVuY2UgY2VydGFpbiByZWZlcmVuY2Ugb2JqZWN0cy4gQ2FsbGVkIGJlZm9yZSBhbgotICogICAgICAgICAgICAgIGludGVybmFsIHJldHVybiBvYmplY3QgaXMgY29udmVydGVkIHRvIGFuIGV4dGVybmFsIHVuaW9uIGFjcGlfb2JqZWN0LgotICoKLSAqIFBlcmZvcm1zIGFuIGF1dG9tYXRpYyBkZXJlZmVyZW5jZSBvZiBJbmRleCBhbmQgcmVmX29mIHJlZmVyZW5jZSBvYmplY3RzLgotICogVGhlc2UgcmVmZXJlbmNlIG9iamVjdHMgYXJlIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIHVuaW9uIGFjcGlfb2JqZWN0LCBzbyB0aGlzIGlzIGEKLSAqIGxhc3QgcmVzb3J0IGVmZm9ydCB0byByZXR1cm4gc29tZXRoaW5nIHVzZWZ1bC4gQWxzbywgcHJvdmlkZXMgY29tcGF0aWJpbGl0eQotICogd2l0aCBvdGhlciBBQ1BJIGltcGxlbWVudGF0aW9ucy4KLSAqCi0gKiBOT1RFOiBkb2VzIG5vdCBoYW5kbGUgcmVmZXJlbmNlcyB3aXRoaW4gcmV0dXJuZWQgcGFja2FnZSBvYmplY3RzIG9yIG5lc3RlZAotICogcmVmZXJlbmNlcywgYnV0IHRoaXMgc3VwcG9ydCBjb3VsZCBiZSBhZGRlZCBsYXRlciBpZiBmb3VuZCB0byBiZSBuZWNlc3NhcnkuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGFjcGlfbnNfcmVzb2x2ZV9yZWZlcmVuY2VzKHN0cnVjdCBhY3BpX2V2YWx1YXRlX2luZm8gKmluZm8pCi17Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2MgPSBOVUxMOwotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlOwotCi0JLyogV2UgYXJlIGludGVyZXN0ZWQgaW4gcmVmZXJlbmNlIG9iamVjdHMgb25seSAqLwotCi0JaWYgKEFDUElfR0VUX09CSkVDVF9UWVBFKGluZm8tPnJldHVybl9vYmplY3QpICE9Ci0JICAgIEFDUElfVFlQRV9MT0NBTF9SRUZFUkVOQ0UpIHsKLQkJcmV0dXJuOwotCX0KLQotCS8qCi0JICogVHdvIHR5cGVzIG9mIHJlZmVyZW5jZXMgYXJlIHN1cHBvcnRlZCAtIHRob3NlIGNyZWF0ZWQgYnkgSW5kZXggYW5kCi0JICogcmVmX29mIG9wZXJhdG9ycy4gQSBuYW1lIHJlZmVyZW5jZSAoQU1MX05BTUVQQVRIX09QKSBjYW4gYmUgY29udmVydGVkCi0JICogdG8gYW4gdW5pb24gYWNwaV9vYmplY3QsIHNvIGl0IGlzIG5vdCBkZXJlZmVyZW5jZWQgaGVyZS4gQSBkZGJfaGFuZGxlCi0JICogKEFNTF9MT0FEX09QKSBjYW5ub3QgYmUgZGVyZWZlcmVuY2VkLCBub3IgY2FuIGl0IGJlIGNvbnZlcnRlZCB0bwotCSAqIGFuIHVuaW9uIGFjcGlfb2JqZWN0LgotCSAqLwotCXN3aXRjaCAoaW5mby0+cmV0dXJuX29iamVjdC0+cmVmZXJlbmNlLmNsYXNzKSB7Ci0JY2FzZSBBQ1BJX1JFRkNMQVNTX0lOREVYOgotCi0JCW9ial9kZXNjID0gKihpbmZvLT5yZXR1cm5fb2JqZWN0LT5yZWZlcmVuY2Uud2hlcmUpOwotCQlicmVhazsKLQotCWNhc2UgQUNQSV9SRUZDTEFTU19SRUZPRjoKLQotCQlub2RlID0gaW5mby0+cmV0dXJuX29iamVjdC0+cmVmZXJlbmNlLm9iamVjdDsKLQkJaWYgKG5vZGUpIHsKLQkJCW9ial9kZXNjID0gbm9kZS0+b2JqZWN0OwotCQl9Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJcmV0dXJuOwotCX0KLQotCS8qIFJlcGxhY2UgdGhlIGV4aXN0aW5nIHJlZmVyZW5jZSBvYmplY3QgKi8KLQotCWlmIChvYmpfZGVzYykgewotCQlhY3BpX3V0X2FkZF9yZWZlcmVuY2Uob2JqX2Rlc2MpOwotCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UoaW5mby0+cmV0dXJuX29iamVjdCk7Ci0JCWluZm8tPnJldHVybl9vYmplY3QgPSBvYmpfZGVzYzsKLQl9Ci0KLQlyZXR1cm47Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfd2Fsa19uYW1lc3BhY2UKLSAqCi0gKiBQQVJBTUVURVJTOiAgVHlwZSAgICAgICAgICAgICAgICAtIGFjcGlfb2JqZWN0X3R5cGUgdG8gc2VhcmNoIGZvcgotICogICAgICAgICAgICAgIHN0YXJ0X29iamVjdCAgICAgICAgLSBIYW5kbGUgaW4gbmFtZXNwYWNlIHdoZXJlIHNlYXJjaCBiZWdpbnMKLSAqICAgICAgICAgICAgICBtYXhfZGVwdGggICAgICAgICAgIC0gRGVwdGggdG8gd2hpY2ggc2VhcmNoIGlzIHRvIHJlYWNoCi0gKiAgICAgICAgICAgICAgdXNlcl9mdW5jdGlvbiAgICAgICAtIENhbGxlZCB3aGVuIGFuIG9iamVjdCBvZiAiVHlwZSIgaXMgZm91bmQKLSAqICAgICAgICAgICAgICBDb250ZXh0ICAgICAgICAgICAgIC0gUGFzc2VkIHRvIHVzZXIgZnVuY3Rpb24KLSAqICAgICAgICAgICAgICByZXR1cm5fdmFsdWUgICAgICAgIC0gTG9jYXRpb24gd2hlcmUgcmV0dXJuIHZhbHVlIG9mCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJfZnVuY3Rpb24gaXMgcHV0IGlmIHRlcm1pbmF0ZWQgZWFybHkKLSAqCi0gKiBSRVRVUk5TICAgICAgUmV0dXJuIHZhbHVlIGZyb20gdGhlIHVzZXJfZnVuY3Rpb24gaWYgdGVybWluYXRlZCBlYXJseS4KLSAqICAgICAgICAgICAgICBPdGhlcndpc2UsIHJldHVybnMgTlVMTC4KLSAqCi0gKiBERVNDUklQVElPTjogUGVyZm9ybXMgYSBtb2RpZmllZCBkZXB0aC1maXJzdCB3YWxrIG9mIHRoZSBuYW1lc3BhY2UgdHJlZSwKLSAqICAgICAgICAgICAgICBzdGFydGluZyAoYW5kIGVuZGluZykgYXQgdGhlIG9iamVjdCBzcGVjaWZpZWQgYnkgc3RhcnRfaGFuZGxlLgotICogICAgICAgICAgICAgIFRoZSB1c2VyX2Z1bmN0aW9uIGlzIGNhbGxlZCB3aGVuZXZlciBhbiBvYmplY3QgdGhhdCBtYXRjaGVzCi0gKiAgICAgICAgICAgICAgdGhlIHR5cGUgcGFyYW1ldGVyIGlzIGZvdW5kLiAgSWYgdGhlIHVzZXIgZnVuY3Rpb24gcmV0dXJucwotICogICAgICAgICAgICAgIGEgbm9uLXplcm8gdmFsdWUsIHRoZSBzZWFyY2ggaXMgdGVybWluYXRlZCBpbW1lZGlhdGVseSBhbmQgdGhpcwotICogICAgICAgICAgICAgIHZhbHVlIGlzIHJldHVybmVkIHRvIHRoZSBjYWxsZXIuCi0gKgotICogICAgICAgICAgICAgIFRoZSBwb2ludCBvZiB0aGlzIHByb2NlZHVyZSBpcyB0byBwcm92aWRlIGEgZ2VuZXJpYyBuYW1lc3BhY2UKLSAqICAgICAgICAgICAgICB3YWxrIHJvdXRpbmUgdGhhdCBjYW4gYmUgY2FsbGVkIGZyb20gbXVsdGlwbGUgcGxhY2VzIHRvCi0gKiAgICAgICAgICAgICAgcHJvdmlkZSBtdWx0aXBsZSBzZXJ2aWNlczsgIHRoZSBVc2VyIEZ1bmN0aW9uIGNhbiBiZSB0YWlsb3JlZAotICogICAgICAgICAgICAgIHRvIGVhY2ggdGFzaywgd2hldGhlciBpdCBpcyBhIHByaW50IGZ1bmN0aW9uLCBhIGNvbXBhcmUKLSAqICAgICAgICAgICAgICBmdW5jdGlvbiwgZXRjLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWFjcGlfc3RhdHVzCi1hY3BpX3dhbGtfbmFtZXNwYWNlKGFjcGlfb2JqZWN0X3R5cGUgdHlwZSwKLQkJICAgIGFjcGlfaGFuZGxlIHN0YXJ0X29iamVjdCwKLQkJICAgIHUzMiBtYXhfZGVwdGgsCi0JCSAgICBhY3BpX3dhbGtfY2FsbGJhY2sgdXNlcl9mdW5jdGlvbiwKLQkJICAgIHZvaWQgKmNvbnRleHQsIHZvaWQgKipyZXR1cm5fdmFsdWUpCi17Ci0JYWNwaV9zdGF0dXMgc3RhdHVzOwotCi0JQUNQSV9GVU5DVElPTl9UUkFDRShhY3BpX3dhbGtfbmFtZXNwYWNlKTsKLQotCS8qIFBhcmFtZXRlciB2YWxpZGF0aW9uICovCi0KLQlpZiAoKHR5cGUgPiBBQ1BJX1RZUEVfTE9DQUxfTUFYKSB8fCAoIW1heF9kZXB0aCkgfHwgKCF1c2VyX2Z1bmN0aW9uKSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX1BBUkFNRVRFUik7Ci0JfQotCi0JLyoKLQkgKiBMb2NrIHRoZSBuYW1lc3BhY2UgYXJvdW5kIHRoZSB3YWxrLgotCSAqIFRoZSBuYW1lc3BhY2Ugd2lsbCBiZSB1bmxvY2tlZC9sb2NrZWQgYXJvdW5kIGVhY2ggY2FsbAotCSAqIHRvIHRoZSB1c2VyIGZ1bmN0aW9uIC0gc2luY2UgdGhpcyBmdW5jdGlvbgotCSAqIG11c3QgYmUgYWxsb3dlZCB0byBtYWtlIEFjcGkgY2FsbHMgaXRzZWxmLgotCSAqLwotCXN0YXR1cyA9IGFjcGlfdXRfYWNxdWlyZV9tdXRleChBQ1BJX01UWF9OQU1FU1BBQ0UpOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLQl9Ci0KLQlzdGF0dXMgPSBhY3BpX25zX3dhbGtfbmFtZXNwYWNlKHR5cGUsIHN0YXJ0X29iamVjdCwgbWF4X2RlcHRoLAotCQkJCQlBQ1BJX05TX1dBTEtfVU5MT0NLLAotCQkJCQl1c2VyX2Z1bmN0aW9uLCBjb250ZXh0LCByZXR1cm5fdmFsdWUpOwotCi0JKHZvaWQpYWNwaV91dF9yZWxlYXNlX211dGV4KEFDUElfTVRYX05BTUVTUEFDRSk7Ci0JcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci19Ci0KLUFDUElfRVhQT1JUX1NZTUJPTChhY3BpX3dhbGtfbmFtZXNwYWNlKQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX25zX2dldF9kZXZpY2VfY2FsbGJhY2sKLSAqCi0gKiBQQVJBTUVURVJTOiAgQ2FsbGJhY2sgZnJvbSBhY3BpX2dldF9kZXZpY2UKLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IFRha2VzIGNhbGxiYWNrcyBmcm9tIHdhbGtfbmFtZXNwYWNlIGFuZCBmaWx0ZXJzIG91dCBhbGwgbm9uLQotICogICAgICAgICAgICAgIHByZXNlbnQgZGV2aWNlcywgb3IgaWYgdGhleSBzcGVjaWZpZWQgYSBISUQsIGl0IGZpbHRlcnMgYmFzZWQKLSAqICAgICAgICAgICAgICBvbiB0aGF0LgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgYWNwaV9zdGF0dXMKLWFjcGlfbnNfZ2V0X2RldmljZV9jYWxsYmFjayhhY3BpX2hhbmRsZSBvYmpfaGFuZGxlLAotCQkJICAgIHUzMiBuZXN0aW5nX2xldmVsLAotCQkJICAgIHZvaWQgKmNvbnRleHQsIHZvaWQgKipyZXR1cm5fdmFsdWUpCi17Ci0Jc3RydWN0IGFjcGlfZ2V0X2RldmljZXNfaW5mbyAqaW5mbyA9IGNvbnRleHQ7Ci0JYWNwaV9zdGF0dXMgc3RhdHVzOwotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlOwotCXUzMiBmbGFnczsKLQlzdHJ1Y3QgYWNwaWNhX2RldmljZV9pZCBoaWQ7Ci0Jc3RydWN0IGFjcGlfY29tcGF0aWJsZV9pZF9saXN0ICpjaWQ7Ci0JdTMyIGk7Ci0JaW50IGZvdW5kOwotCi0Jc3RhdHVzID0gYWNwaV91dF9hY3F1aXJlX211dGV4KEFDUElfTVRYX05BTUVTUEFDRSk7Ci0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCXJldHVybiAoc3RhdHVzKTsKLQl9Ci0KLQlub2RlID0gYWNwaV9uc19tYXBfaGFuZGxlX3RvX25vZGUob2JqX2hhbmRsZSk7Ci0Jc3RhdHVzID0gYWNwaV91dF9yZWxlYXNlX211dGV4KEFDUElfTVRYX05BTUVTUEFDRSk7Ci0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCXJldHVybiAoc3RhdHVzKTsKLQl9Ci0KLQlpZiAoIW5vZGUpIHsKLQkJcmV0dXJuIChBRV9CQURfUEFSQU1FVEVSKTsKLQl9Ci0KLQkvKiBSdW4gX1NUQSB0byBkZXRlcm1pbmUgaWYgZGV2aWNlIGlzIHByZXNlbnQgKi8KLQotCXN0YXR1cyA9IGFjcGlfdXRfZXhlY3V0ZV9TVEEobm9kZSwgJmZsYWdzKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJcmV0dXJuIChBRV9DVFJMX0RFUFRIKTsKLQl9Ci0KLQlpZiAoIShmbGFncyAmIEFDUElfU1RBX0RFVklDRV9QUkVTRU5UKSAmJgotCSAgICAhKGZsYWdzICYgQUNQSV9TVEFfREVWSUNFX0ZVTkNUSU9OSU5HKSkgewotCQkvKgotCQkgKiBEb24ndCBleGFtaW5lIHRoZSBjaGlsZHJlbiBvZiB0aGUgZGV2aWNlIG9ubHkgd2hlbiB0aGUKLQkJICogZGV2aWNlIGlzIG5laXRoZXIgcHJlc2VudCBub3IgZnVuY3Rpb25hbC4gU2VlIEFDUEkgc3BlYywKLQkJICogZGVzY3JpcHRpb24gb2YgX1NUQSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLQkJICovCi0JCXJldHVybiAoQUVfQ1RSTF9ERVBUSCk7Ci0JfQotCi0JLyogRmlsdGVyIGJhc2VkIG9uIGRldmljZSBISUQgJiBDSUQgKi8KLQotCWlmIChpbmZvLT5oaWQgIT0gTlVMTCkgewotCQlzdGF0dXMgPSBhY3BpX3V0X2V4ZWN1dGVfSElEKG5vZGUsICZoaWQpOwotCQlpZiAoc3RhdHVzID09IEFFX05PVF9GT1VORCkgewotCQkJcmV0dXJuIChBRV9PSyk7Ci0JCX0gZWxzZSBpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJCXJldHVybiAoQUVfQ1RSTF9ERVBUSCk7Ci0JCX0KLQotCQlpZiAoQUNQSV9TVFJOQ01QKGhpZC52YWx1ZSwgaW5mby0+aGlkLCBzaXplb2YoaGlkLnZhbHVlKSkgIT0gMCkgewotCi0JCQkvKiBHZXQgdGhlIGxpc3Qgb2YgQ29tcGF0aWJsZSBJRHMgKi8KLQotCQkJc3RhdHVzID0gYWNwaV91dF9leGVjdXRlX0NJRChub2RlLCAmY2lkKTsKLQkJCWlmIChzdGF0dXMgPT0gQUVfTk9UX0ZPVU5EKSB7Ci0JCQkJcmV0dXJuIChBRV9PSyk7Ci0JCQl9IGVsc2UgaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCQkJcmV0dXJuIChBRV9DVFJMX0RFUFRIKTsKLQkJCX0KLQotCQkJLyogV2FsayB0aGUgQ0lEIGxpc3QgKi8KLQotCQkJZm91bmQgPSAwOwotCQkJZm9yIChpID0gMDsgaSA8IGNpZC0+Y291bnQ7IGkrKykgewotCQkJCWlmIChBQ1BJX1NUUk5DTVAoY2lkLT5pZFtpXS52YWx1ZSwgaW5mby0+aGlkLAotCQkJCQkJIHNpemVvZihzdHJ1Y3QKLQkJCQkJCQlhY3BpX2NvbXBhdGlibGVfaWQpKSA9PQotCQkJCSAgICAwKSB7Ci0JCQkJCWZvdW5kID0gMTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJQUNQSV9GUkVFKGNpZCk7Ci0JCQlpZiAoIWZvdW5kKQotCQkJCXJldHVybiAoQUVfT0spOwotCQl9Ci0JfQotCi0Jc3RhdHVzID0gaW5mby0+dXNlcl9mdW5jdGlvbihvYmpfaGFuZGxlLCBuZXN0aW5nX2xldmVsLCBpbmZvLT5jb250ZXh0LAotCQkJCSAgICAgcmV0dXJuX3ZhbHVlKTsKLQlyZXR1cm4gKHN0YXR1cyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfZ2V0X2RldmljZXMKLSAqCi0gKiBQQVJBTUVURVJTOiAgSElEICAgICAgICAgICAgICAgICAtIEhJRCB0byBzZWFyY2ggZm9yLiBDYW4gYmUgTlVMTC4KLSAqICAgICAgICAgICAgICB1c2VyX2Z1bmN0aW9uICAgICAgIC0gQ2FsbGVkIHdoZW4gYSBtYXRjaGluZyBvYmplY3QgaXMgZm91bmQKLSAqICAgICAgICAgICAgICBDb250ZXh0ICAgICAgICAgICAgIC0gUGFzc2VkIHRvIHVzZXIgZnVuY3Rpb24KLSAqICAgICAgICAgICAgICByZXR1cm5fdmFsdWUgICAgICAgIC0gTG9jYXRpb24gd2hlcmUgcmV0dXJuIHZhbHVlIG9mCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJfZnVuY3Rpb24gaXMgcHV0IGlmIHRlcm1pbmF0ZWQgZWFybHkKLSAqCi0gKiBSRVRVUk5TICAgICAgUmV0dXJuIHZhbHVlIGZyb20gdGhlIHVzZXJfZnVuY3Rpb24gaWYgdGVybWluYXRlZCBlYXJseS4KLSAqICAgICAgICAgICAgICBPdGhlcndpc2UsIHJldHVybnMgTlVMTC4KLSAqCi0gKiBERVNDUklQVElPTjogUGVyZm9ybXMgYSBtb2RpZmllZCBkZXB0aC1maXJzdCB3YWxrIG9mIHRoZSBuYW1lc3BhY2UgdHJlZSwKLSAqICAgICAgICAgICAgICBzdGFydGluZyAoYW5kIGVuZGluZykgYXQgdGhlIG9iamVjdCBzcGVjaWZpZWQgYnkgc3RhcnRfaGFuZGxlLgotICogICAgICAgICAgICAgIFRoZSB1c2VyX2Z1bmN0aW9uIGlzIGNhbGxlZCB3aGVuZXZlciBhbiBvYmplY3Qgb2YgdHlwZQotICogICAgICAgICAgICAgIERldmljZSBpcyBmb3VuZC4gIElmIHRoZSB1c2VyIGZ1bmN0aW9uIHJldHVybnMKLSAqICAgICAgICAgICAgICBhIG5vbi16ZXJvIHZhbHVlLCB0aGUgc2VhcmNoIGlzIHRlcm1pbmF0ZWQgaW1tZWRpYXRlbHkgYW5kIHRoaXMKLSAqICAgICAgICAgICAgICB2YWx1ZSBpcyByZXR1cm5lZCB0byB0aGUgY2FsbGVyLgotICoKLSAqICAgICAgICAgICAgICBUaGlzIGlzIGEgd3JhcHBlciBmb3Igd2Fsa19uYW1lc3BhY2UsIGJ1dCB0aGUgY2FsbGJhY2sgcGVyZm9ybXMKLSAqICAgICAgICAgICAgICBhZGRpdGlvbmFsIGZpbHRlcmluZy4gUGxlYXNlIHNlZSBhY3BpX25zX2dldF9kZXZpY2VfY2FsbGJhY2suCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotYWNwaV9zdGF0dXMKLWFjcGlfZ2V0X2RldmljZXMoY29uc3QgY2hhciAqSElELAotCQkgYWNwaV93YWxrX2NhbGxiYWNrIHVzZXJfZnVuY3Rpb24sCi0JCSB2b2lkICpjb250ZXh0LCB2b2lkICoqcmV0dXJuX3ZhbHVlKQotewotCWFjcGlfc3RhdHVzIHN0YXR1czsKLQlzdHJ1Y3QgYWNwaV9nZXRfZGV2aWNlc19pbmZvIGluZm87Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGFjcGlfZ2V0X2RldmljZXMpOwotCi0JLyogUGFyYW1ldGVyIHZhbGlkYXRpb24gKi8KLQotCWlmICghdXNlcl9mdW5jdGlvbikgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX1BBUkFNRVRFUik7Ci0JfQotCi0JLyoKLQkgKiBXZSdyZSBnb2luZyB0byBjYWxsIHRoZWlyIGNhbGxiYWNrIGZyb20gT1VSIGNhbGxiYWNrLCBzbyB3ZSBuZWVkCi0JICogdG8ga25vdyB3aGF0IGl0IGlzLCBhbmQgdGhlaXIgY29udGV4dCBwYXJhbWV0ZXIuCi0JICovCi0JaW5mby5oaWQgPSBISUQ7Ci0JaW5mby5jb250ZXh0ID0gY29udGV4dDsKLQlpbmZvLnVzZXJfZnVuY3Rpb24gPSB1c2VyX2Z1bmN0aW9uOwotCi0JLyoKLQkgKiBMb2NrIHRoZSBuYW1lc3BhY2UgYXJvdW5kIHRoZSB3YWxrLgotCSAqIFRoZSBuYW1lc3BhY2Ugd2lsbCBiZSB1bmxvY2tlZC9sb2NrZWQgYXJvdW5kIGVhY2ggY2FsbAotCSAqIHRvIHRoZSB1c2VyIGZ1bmN0aW9uIC0gc2luY2UgdGhpcyBmdW5jdGlvbgotCSAqIG11c3QgYmUgYWxsb3dlZCB0byBtYWtlIEFjcGkgY2FsbHMgaXRzZWxmLgotCSAqLwotCXN0YXR1cyA9IGFjcGlfdXRfYWNxdWlyZV9tdXRleChBQ1BJX01UWF9OQU1FU1BBQ0UpOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLQl9Ci0KLQlzdGF0dXMgPSBhY3BpX25zX3dhbGtfbmFtZXNwYWNlKEFDUElfVFlQRV9ERVZJQ0UsIEFDUElfUk9PVF9PQkpFQ1QsCi0JCQkJCUFDUElfVUlOVDMyX01BWCwgQUNQSV9OU19XQUxLX1VOTE9DSywKLQkJCQkJYWNwaV9uc19nZXRfZGV2aWNlX2NhbGxiYWNrLCAmaW5mbywKLQkJCQkJcmV0dXJuX3ZhbHVlKTsKLQotCSh2b2lkKWFjcGlfdXRfcmVsZWFzZV9tdXRleChBQ1BJX01UWF9OQU1FU1BBQ0UpOwotCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotfQotCi1BQ1BJX0VYUE9SVF9TWU1CT0woYWNwaV9nZXRfZGV2aWNlcykKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9hdHRhY2hfZGF0YQotICoKLSAqIFBBUkFNRVRFUlM6ICBvYmpfaGFuZGxlICAgICAgICAgIC0gTmFtZXNwYWNlIG5vZGUKLSAqICAgICAgICAgICAgICBIYW5kbGVyICAgICAgICAgICAgIC0gSGFuZGxlciBmb3IgdGhpcyBhdHRhY2htZW50Ci0gKiAgICAgICAgICAgICAgRGF0YSAgICAgICAgICAgICAgICAtIFBvaW50ZXIgdG8gZGF0YSB0byBiZSBhdHRhY2hlZAotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKLSAqCi0gKiBERVNDUklQVElPTjogQXR0YWNoIGFyYml0cmFyeSBkYXRhIGFuZCBoYW5kbGVyIHRvIGEgbmFtZXNwYWNlIG5vZGUuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWFjcGlfc3RhdHVzCi1hY3BpX2F0dGFjaF9kYXRhKGFjcGlfaGFuZGxlIG9ial9oYW5kbGUsCi0JCSBhY3BpX29iamVjdF9oYW5kbGVyIGhhbmRsZXIsIHZvaWQgKmRhdGEpCi17Ci0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGU7Ci0JYWNwaV9zdGF0dXMgc3RhdHVzOwotCi0JLyogUGFyYW1ldGVyIHZhbGlkYXRpb24gKi8KLQotCWlmICghb2JqX2hhbmRsZSB8fCAhaGFuZGxlciB8fCAhZGF0YSkgewotCQlyZXR1cm4gKEFFX0JBRF9QQVJBTUVURVIpOwotCX0KLQotCXN0YXR1cyA9IGFjcGlfdXRfYWNxdWlyZV9tdXRleChBQ1BJX01UWF9OQU1FU1BBQ0UpOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlyZXR1cm4gKHN0YXR1cyk7Ci0JfQotCi0JLyogQ29udmVydCBhbmQgdmFsaWRhdGUgdGhlIGhhbmRsZSAqLwotCi0Jbm9kZSA9IGFjcGlfbnNfbWFwX2hhbmRsZV90b19ub2RlKG9ial9oYW5kbGUpOwotCWlmICghbm9kZSkgewotCQlzdGF0dXMgPSBBRV9CQURfUEFSQU1FVEVSOwotCQlnb3RvIHVubG9ja19hbmRfZXhpdDsKLQl9Ci0KLQlzdGF0dXMgPSBhY3BpX25zX2F0dGFjaF9kYXRhKG5vZGUsIGhhbmRsZXIsIGRhdGEpOwotCi0gICAgICB1bmxvY2tfYW5kX2V4aXQ6Ci0JKHZvaWQpYWNwaV91dF9yZWxlYXNlX211dGV4KEFDUElfTVRYX05BTUVTUEFDRSk7Ci0JcmV0dXJuIChzdGF0dXMpOwotfQotCi1BQ1BJX0VYUE9SVF9TWU1CT0woYWNwaV9hdHRhY2hfZGF0YSkKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9kZXRhY2hfZGF0YQotICoKLSAqIFBBUkFNRVRFUlM6ICBvYmpfaGFuZGxlICAgICAgICAgIC0gTmFtZXNwYWNlIG5vZGUgaGFuZGxlCi0gKiAgICAgICAgICAgICAgSGFuZGxlciAgICAgICAgICAgICAtIEhhbmRsZXIgdXNlZCBpbiBjYWxsIHRvIGFjcGlfYXR0YWNoX2RhdGEKLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IFJlbW92ZSBkYXRhIHRoYXQgd2FzIHByZXZpb3VzbHkgYXR0YWNoZWQgdG8gYSBub2RlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1hY3BpX3N0YXR1cwotYWNwaV9kZXRhY2hfZGF0YShhY3BpX2hhbmRsZSBvYmpfaGFuZGxlLCBhY3BpX29iamVjdF9oYW5kbGVyIGhhbmRsZXIpCi17Ci0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGU7Ci0JYWNwaV9zdGF0dXMgc3RhdHVzOwotCi0JLyogUGFyYW1ldGVyIHZhbGlkYXRpb24gKi8KLQotCWlmICghb2JqX2hhbmRsZSB8fCAhaGFuZGxlcikgewotCQlyZXR1cm4gKEFFX0JBRF9QQVJBTUVURVIpOwotCX0KLQotCXN0YXR1cyA9IGFjcGlfdXRfYWNxdWlyZV9tdXRleChBQ1BJX01UWF9OQU1FU1BBQ0UpOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlyZXR1cm4gKHN0YXR1cyk7Ci0JfQotCi0JLyogQ29udmVydCBhbmQgdmFsaWRhdGUgdGhlIGhhbmRsZSAqLwotCi0Jbm9kZSA9IGFjcGlfbnNfbWFwX2hhbmRsZV90b19ub2RlKG9ial9oYW5kbGUpOwotCWlmICghbm9kZSkgewotCQlzdGF0dXMgPSBBRV9CQURfUEFSQU1FVEVSOwotCQlnb3RvIHVubG9ja19hbmRfZXhpdDsKLQl9Ci0KLQlzdGF0dXMgPSBhY3BpX25zX2RldGFjaF9kYXRhKG5vZGUsIGhhbmRsZXIpOwotCi0gICAgICB1bmxvY2tfYW5kX2V4aXQ6Ci0JKHZvaWQpYWNwaV91dF9yZWxlYXNlX211dGV4KEFDUElfTVRYX05BTUVTUEFDRSk7Ci0JcmV0dXJuIChzdGF0dXMpOwotfQotCi1BQ1BJX0VYUE9SVF9TWU1CT0woYWNwaV9kZXRhY2hfZGF0YSkKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9nZXRfZGF0YQotICoKLSAqIFBBUkFNRVRFUlM6ICBvYmpfaGFuZGxlICAgICAgICAgIC0gTmFtZXNwYWNlIG5vZGUKLSAqICAgICAgICAgICAgICBIYW5kbGVyICAgICAgICAgICAgIC0gSGFuZGxlciB1c2VkIGluIGNhbGwgdG8gYXR0YWNoX2RhdGEKLSAqICAgICAgICAgICAgICBEYXRhICAgICAgICAgICAgICAgIC0gV2hlcmUgdGhlIGRhdGEgaXMgcmV0dXJuZWQKLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IFJldHJpZXZlIGRhdGEgdGhhdCB3YXMgcHJldmlvdXNseSBhdHRhY2hlZCB0byBhIG5hbWVzcGFjZSBub2RlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1hY3BpX3N0YXR1cwotYWNwaV9nZXRfZGF0YShhY3BpX2hhbmRsZSBvYmpfaGFuZGxlLCBhY3BpX29iamVjdF9oYW5kbGVyIGhhbmRsZXIsIHZvaWQgKipkYXRhKQotewotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlOwotCWFjcGlfc3RhdHVzIHN0YXR1czsKLQotCS8qIFBhcmFtZXRlciB2YWxpZGF0aW9uICovCi0KLQlpZiAoIW9ial9oYW5kbGUgfHwgIWhhbmRsZXIgfHwgIWRhdGEpIHsKLQkJcmV0dXJuIChBRV9CQURfUEFSQU1FVEVSKTsKLQl9Ci0KLQlzdGF0dXMgPSBhY3BpX3V0X2FjcXVpcmVfbXV0ZXgoQUNQSV9NVFhfTkFNRVNQQUNFKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJcmV0dXJuIChzdGF0dXMpOwotCX0KLQotCS8qIENvbnZlcnQgYW5kIHZhbGlkYXRlIHRoZSBoYW5kbGUgKi8KLQotCW5vZGUgPSBhY3BpX25zX21hcF9oYW5kbGVfdG9fbm9kZShvYmpfaGFuZGxlKTsKLQlpZiAoIW5vZGUpIHsKLQkJc3RhdHVzID0gQUVfQkFEX1BBUkFNRVRFUjsKLQkJZ290byB1bmxvY2tfYW5kX2V4aXQ7Ci0JfQotCi0Jc3RhdHVzID0gYWNwaV9uc19nZXRfYXR0YWNoZWRfZGF0YShub2RlLCBoYW5kbGVyLCBkYXRhKTsKLQotICAgICAgdW5sb2NrX2FuZF9leGl0OgotCSh2b2lkKWFjcGlfdXRfcmVsZWFzZV9tdXRleChBQ1BJX01UWF9OQU1FU1BBQ0UpOwotCXJldHVybiAoc3RhdHVzKTsKLX0KLQotQUNQSV9FWFBPUlRfU1lNQk9MKGFjcGlfZ2V0X2RhdGEpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zeGZuYW1lLmMgYi9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zeGZuYW1lLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlZmE0ZTcuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc3hmbmFtZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMzU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBNb2R1bGUgTmFtZTogbnN4Zm5hbWUgLSBQdWJsaWMgaW50ZXJmYWNlcyB0byB0aGUgQUNQSSBzdWJzeXN0ZW0KLSAqICAgICAgICAgICAgICAgICAgICAgICAgIEFDUEkgTmFtZXNwYWNlIG9yaWVudGVkIGludGVyZmFjZXMKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA4LCBJbnRlbCBDb3JwLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAotICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgYXQgbWluaW11bSBhIGRpc2NsYWltZXIKLSAqICAgIHN1YnN0YW50aWFsbHkgc2ltaWxhciB0byB0aGUgIk5PIFdBUlJBTlRZIiBkaXNjbGFpbWVyIGJlbG93Ci0gKiAgICAoIkRpc2NsYWltZXIiKSBhbmQgYW55IHJlZGlzdHJpYnV0aW9uIG11c3QgYmUgY29uZGl0aW9uZWQgdXBvbgotICogICAgaW5jbHVkaW5nIGEgc3Vic3RhbnRpYWxseSBzaW1pbGFyIERpc2NsYWltZXIgcmVxdWlyZW1lbnQgZm9yIGZ1cnRoZXIKLSAqICAgIGJpbmFyeSByZWRpc3RyaWJ1dGlvbi4KLSAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcwotICogICAgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICogU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBOTyBXQVJSQU5UWQotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCi0gKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUwotICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcKLSAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQotICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgotICovCi0KLSNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KLSNpbmNsdWRlIDxhY3BpL2FjbmFtZXNwLmg+Ci0KLSNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX05BTUVTUEFDRQotQUNQSV9NT0RVTEVfTkFNRSgibnN4Zm5hbWUiKQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfZ2V0X2hhbmRsZQotICoKLSAqIFBBUkFNRVRFUlM6ICBQYXJlbnQgICAgICAgICAgLSBPYmplY3QgdG8gc2VhcmNoIHVuZGVyIChzZWFyY2ggc2NvcGUpLgotICogICAgICAgICAgICAgIFBhdGhuYW1lICAgICAgICAtIFBvaW50ZXIgdG8gYW4gYXNjaWl6IHN0cmluZyBjb250YWluaW5nIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUKLSAqICAgICAgICAgICAgICByZXRfaGFuZGxlICAgICAgLSBXaGVyZSB0aGUgcmV0dXJuIGhhbmRsZSBpcyByZXR1cm5lZAotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKLSAqCi0gKiBERVNDUklQVElPTjogVGhpcyByb3V0aW5lIHdpbGwgc2VhcmNoIGZvciBhIGNhbGxlciBzcGVjaWZpZWQgbmFtZSBpbiB0aGUKLSAqICAgICAgICAgICAgICBuYW1lIHNwYWNlLiAgVGhlIGNhbGxlciBjYW4gcmVzdHJpY3QgdGhlIHNlYXJjaCByZWdpb24gYnkKLSAqICAgICAgICAgICAgICBzcGVjaWZ5aW5nIGEgbm9uIE5VTEwgcGFyZW50LiAgVGhlIHBhcmVudCB2YWx1ZSBpcyBpdHNlbGYgYQotICogICAgICAgICAgICAgIG5hbWVzcGFjZSBoYW5kbGUuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWFjcGlfc3RhdHVzCi1hY3BpX2dldF9oYW5kbGUoYWNwaV9oYW5kbGUgcGFyZW50LAotCQlhY3BpX3N0cmluZyBwYXRobmFtZSwgYWNwaV9oYW5kbGUgKiByZXRfaGFuZGxlKQotewotCWFjcGlfc3RhdHVzIHN0YXR1czsKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZSA9IE5VTEw7Ci0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKnByZWZpeF9ub2RlID0gTlVMTDsKLQotCUFDUElfRlVOQ1RJT05fRU5UUlkoKTsKLQotCS8qIFBhcmFtZXRlciBWYWxpZGF0aW9uICovCi0KLQlpZiAoIXJldF9oYW5kbGUgfHwgIXBhdGhuYW1lKSB7Ci0JCXJldHVybiAoQUVfQkFEX1BBUkFNRVRFUik7Ci0JfQotCi0JLyogQ29udmVydCBhIHBhcmVudCBoYW5kbGUgdG8gYSBwcmVmaXggbm9kZSAqLwotCi0JaWYgKHBhcmVudCkgewotCQlwcmVmaXhfbm9kZSA9IGFjcGlfbnNfbWFwX2hhbmRsZV90b19ub2RlKHBhcmVudCk7Ci0JCWlmICghcHJlZml4X25vZGUpIHsKLQkJCXJldHVybiAoQUVfQkFEX1BBUkFNRVRFUik7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIFZhbGlkIGNhc2VzIGFyZToKLQkgKiAxKSBGdWxseSBxdWFsaWZpZWQgcGF0aG5hbWUKLQkgKiAyKSBQYXJlbnQgKyBSZWxhdGl2ZSBwYXRobmFtZQotCSAqCi0JICogRXJyb3IgZm9yIDxudWxsIFBhcmVudCArIHJlbGF0aXZlIHBhdGg+Ci0JICovCi0JaWYgKGFjcGlfbnNfdmFsaWRfcm9vdF9wcmVmaXgocGF0aG5hbWVbMF0pKSB7Ci0KLQkJLyogUGF0aG5hbWUgaXMgZnVsbHkgcXVhbGlmaWVkIChzdGFydHMgd2l0aCAnXCcpICovCi0KLQkJLyogU3BlY2lhbCBjYXNlIGZvciByb290LW9ubHksIHNpbmNlIHdlIGNhbid0IHNlYXJjaCBmb3IgaXQgKi8KLQotCQlpZiAoIUFDUElfU1RSQ01QKHBhdGhuYW1lLCBBQ1BJX05TX1JPT1RfUEFUSCkpIHsKLQkJCSpyZXRfaGFuZGxlID0KLQkJCSAgICBhY3BpX25zX2NvbnZlcnRfZW50cnlfdG9faGFuZGxlKGFjcGlfZ2JsX3Jvb3Rfbm9kZSk7Ci0JCQlyZXR1cm4gKEFFX09LKTsKLQkJfQotCX0gZWxzZSBpZiAoIXByZWZpeF9ub2RlKSB7Ci0KLQkJLyogUmVsYXRpdmUgcGF0aCB3aXRoIG51bGwgcHJlZml4IGlzIGRpc2FsbG93ZWQgKi8KLQotCQlyZXR1cm4gKEFFX0JBRF9QQVJBTUVURVIpOwotCX0KLQotCS8qIEZpbmQgdGhlIE5vZGUgYW5kIGNvbnZlcnQgdG8gYSBoYW5kbGUgKi8KLQotCXN0YXR1cyA9Ci0JICAgIGFjcGlfbnNfZ2V0X25vZGUocHJlZml4X25vZGUsIHBhdGhuYW1lLCBBQ1BJX05TX05PX1VQU0VBUkNILCAmbm9kZSk7Ci0JaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKSB7Ci0JCSpyZXRfaGFuZGxlID0gYWNwaV9uc19jb252ZXJ0X2VudHJ5X3RvX2hhbmRsZShub2RlKTsKLQl9Ci0KLQlyZXR1cm4gKHN0YXR1cyk7Ci19Ci0KLUFDUElfRVhQT1JUX1NZTUJPTChhY3BpX2dldF9oYW5kbGUpCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9nZXRfbmFtZQotICoKLSAqIFBBUkFNRVRFUlM6ICBIYW5kbGUgICAgICAgICAgLSBIYW5kbGUgdG8gYmUgY29udmVydGVkIHRvIGEgcGF0aG5hbWUKLSAqICAgICAgICAgICAgICBuYW1lX3R5cGUgICAgICAgLSBGdWxsIHBhdGhuYW1lIG9yIHNpbmdsZSBzZWdtZW50Ci0gKiAgICAgICAgICAgICAgQnVmZmVyICAgICAgICAgIC0gQnVmZmVyIGZvciByZXR1cm5lZCBwYXRoCi0gKgotICogUkVUVVJOOiAgICAgIFBvaW50ZXIgdG8gYSBzdHJpbmcgY29udGFpbmluZyB0aGUgZnVsbHkgcXVhbGlmaWVkIE5hbWUuCi0gKgotICogREVTQ1JJUFRJT046IFRoaXMgcm91dGluZSByZXR1cm5zIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBhc3NvY2lhdGVkIHdpdGgKLSAqICAgICAgICAgICAgICB0aGUgSGFuZGxlIHBhcmFtZXRlci4gIFRoaXMgYW5kIHRoZSBhY3BpX3BhdGhuYW1lX3RvX2hhbmRsZSBhcmUKLSAqICAgICAgICAgICAgICBjb21wbGVtZW50YXJ5IGZ1bmN0aW9ucy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYWNwaV9zdGF0dXMKLWFjcGlfZ2V0X25hbWUoYWNwaV9oYW5kbGUgaGFuZGxlLCB1MzIgbmFtZV90eXBlLCBzdHJ1Y3QgYWNwaV9idWZmZXIgKiBidWZmZXIpCi17Ci0JYWNwaV9zdGF0dXMgc3RhdHVzOwotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlOwotCi0JLyogUGFyYW1ldGVyIHZhbGlkYXRpb24gKi8KLQotCWlmIChuYW1lX3R5cGUgPiBBQ1BJX05BTUVfVFlQRV9NQVgpIHsKLQkJcmV0dXJuIChBRV9CQURfUEFSQU1FVEVSKTsKLQl9Ci0KLQlzdGF0dXMgPSBhY3BpX3V0X3ZhbGlkYXRlX2J1ZmZlcihidWZmZXIpOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlyZXR1cm4gKHN0YXR1cyk7Ci0JfQotCi0JaWYgKG5hbWVfdHlwZSA9PSBBQ1BJX0ZVTExfUEFUSE5BTUUpIHsKLQotCQkvKiBHZXQgdGhlIGZ1bGwgcGF0aG5hbWUgKEZyb20gdGhlIG5hbWVzcGFjZSByb290KSAqLwotCi0JCXN0YXR1cyA9IGFjcGlfbnNfaGFuZGxlX3RvX3BhdGhuYW1lKGhhbmRsZSwgYnVmZmVyKTsKLQkJcmV0dXJuIChzdGF0dXMpOwotCX0KLQotCS8qCi0JICogV2FudHMgdGhlIHNpbmdsZSBzZWdtZW50IEFDUEkgbmFtZS4KLQkgKiBWYWxpZGF0ZSBoYW5kbGUgYW5kIGNvbnZlcnQgdG8gYSBuYW1lc3BhY2UgTm9kZQotCSAqLwotCXN0YXR1cyA9IGFjcGlfdXRfYWNxdWlyZV9tdXRleChBQ1BJX01UWF9OQU1FU1BBQ0UpOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlyZXR1cm4gKHN0YXR1cyk7Ci0JfQotCi0Jbm9kZSA9IGFjcGlfbnNfbWFwX2hhbmRsZV90b19ub2RlKGhhbmRsZSk7Ci0JaWYgKCFub2RlKSB7Ci0JCXN0YXR1cyA9IEFFX0JBRF9QQVJBTUVURVI7Ci0JCWdvdG8gdW5sb2NrX2FuZF9leGl0OwotCX0KLQotCS8qIFZhbGlkYXRlL0FsbG9jYXRlL0NsZWFyIGNhbGxlciBidWZmZXIgKi8KLQotCXN0YXR1cyA9IGFjcGlfdXRfaW5pdGlhbGl6ZV9idWZmZXIoYnVmZmVyLCBBQ1BJX1BBVEhfU0VHTUVOVF9MRU5HVEgpOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlnb3RvIHVubG9ja19hbmRfZXhpdDsKLQl9Ci0KLQkvKiBKdXN0IGNvcHkgdGhlIEFDUEkgbmFtZSBmcm9tIHRoZSBOb2RlIGFuZCB6ZXJvIHRlcm1pbmF0ZSBpdCAqLwotCi0JQUNQSV9TVFJOQ1BZKGJ1ZmZlci0+cG9pbnRlciwgYWNwaV91dF9nZXRfbm9kZV9uYW1lKG5vZGUpLAotCQkgICAgIEFDUElfTkFNRV9TSVpFKTsKLQkoKGNoYXIgKilidWZmZXItPnBvaW50ZXIpW0FDUElfTkFNRV9TSVpFXSA9IDA7Ci0Jc3RhdHVzID0gQUVfT0s7Ci0KLSAgICAgIHVubG9ja19hbmRfZXhpdDoKLQotCSh2b2lkKWFjcGlfdXRfcmVsZWFzZV9tdXRleChBQ1BJX01UWF9OQU1FU1BBQ0UpOwotCXJldHVybiAoc3RhdHVzKTsKLX0KLQotQUNQSV9FWFBPUlRfU1lNQk9MKGFjcGlfZ2V0X25hbWUpCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9nZXRfb2JqZWN0X2luZm8KLSAqCi0gKiBQQVJBTUVURVJTOiAgSGFuZGxlICAgICAgICAgIC0gT2JqZWN0IEhhbmRsZQotICogICAgICAgICAgICAgIEJ1ZmZlciAgICAgICAgICAtIFdoZXJlIHRoZSBpbmZvIGlzIHJldHVybmVkCi0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cwotICoKLSAqIERFU0NSSVBUSU9OOiBSZXR1cm5zIGluZm9ybWF0aW9uIGFib3V0IGFuIG9iamVjdCBhcyBnbGVhbmVkIGZyb20gdGhlCi0gKiAgICAgICAgICAgICAgbmFtZXNwYWNlIG5vZGUgYW5kIHBvc3NpYmx5IGJ5IHJ1bm5pbmcgc2V2ZXJhbCBzdGFuZGFyZAotICogICAgICAgICAgICAgIGNvbnRyb2wgbWV0aG9kcyAoU3VjaCBhcyBpbiB0aGUgY2FzZSBvZiBhIGRldmljZS4pCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWFjcGlfc3RhdHVzCi1hY3BpX2dldF9vYmplY3RfaW5mbyhhY3BpX2hhbmRsZSBoYW5kbGUsIHN0cnVjdCBhY3BpX2J1ZmZlciAqIGJ1ZmZlcikKLXsKLQlhY3BpX3N0YXR1cyBzdGF0dXM7Ci0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGU7Ci0Jc3RydWN0IGFjcGlfZGV2aWNlX2luZm8gKmluZm87Ci0Jc3RydWN0IGFjcGlfZGV2aWNlX2luZm8gKnJldHVybl9pbmZvOwotCXN0cnVjdCBhY3BpX2NvbXBhdGlibGVfaWRfbGlzdCAqY2lkX2xpc3QgPSBOVUxMOwotCWFjcGlfc2l6ZSBzaXplOwotCi0JLyogUGFyYW1ldGVyIHZhbGlkYXRpb24gKi8KLQotCWlmICghaGFuZGxlIHx8ICFidWZmZXIpIHsKLQkJcmV0dXJuIChBRV9CQURfUEFSQU1FVEVSKTsKLQl9Ci0KLQlzdGF0dXMgPSBhY3BpX3V0X3ZhbGlkYXRlX2J1ZmZlcihidWZmZXIpOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlyZXR1cm4gKHN0YXR1cyk7Ci0JfQotCi0JaW5mbyA9IEFDUElfQUxMT0NBVEVfWkVST0VEKHNpemVvZihzdHJ1Y3QgYWNwaV9kZXZpY2VfaW5mbykpOwotCWlmICghaW5mbykgewotCQlyZXR1cm4gKEFFX05PX01FTU9SWSk7Ci0JfQotCi0Jc3RhdHVzID0gYWNwaV91dF9hY3F1aXJlX211dGV4KEFDUElfTVRYX05BTUVTUEFDRSk7Ci0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCWdvdG8gY2xlYW51cDsKLQl9Ci0KLQlub2RlID0gYWNwaV9uc19tYXBfaGFuZGxlX3RvX25vZGUoaGFuZGxlKTsKLQlpZiAoIW5vZGUpIHsKLQkJKHZvaWQpYWNwaV91dF9yZWxlYXNlX211dGV4KEFDUElfTVRYX05BTUVTUEFDRSk7Ci0JCXN0YXR1cyA9IEFFX0JBRF9QQVJBTUVURVI7Ci0JCWdvdG8gY2xlYW51cDsKLQl9Ci0KLQkvKiBJbml0IHJldHVybiBzdHJ1Y3R1cmUgKi8KLQotCXNpemUgPSBzaXplb2Yoc3RydWN0IGFjcGlfZGV2aWNlX2luZm8pOwotCi0JaW5mby0+dHlwZSA9IG5vZGUtPnR5cGU7Ci0JaW5mby0+bmFtZSA9IG5vZGUtPm5hbWUuaW50ZWdlcjsKLQlpbmZvLT52YWxpZCA9IDA7Ci0KLQlpZiAobm9kZS0+dHlwZSA9PSBBQ1BJX1RZUEVfTUVUSE9EKSB7Ci0JCWluZm8tPnBhcmFtX2NvdW50ID0gbm9kZS0+b2JqZWN0LT5tZXRob2QucGFyYW1fY291bnQ7Ci0JfQotCi0Jc3RhdHVzID0gYWNwaV91dF9yZWxlYXNlX211dGV4KEFDUElfTVRYX05BTUVTUEFDRSk7Ci0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCWdvdG8gY2xlYW51cDsKLQl9Ci0KLQkvKiBJZiBub3QgYSBkZXZpY2UsIHdlIGFyZSBhbGwgZG9uZSAqLwotCi0JaWYgKGluZm8tPnR5cGUgPT0gQUNQSV9UWVBFX0RFVklDRSkgewotCQkvKgotCQkgKiBHZXQgZXh0cmEgaW5mbyBmb3IgQUNQSSBEZXZpY2VzIG9iamVjdHMgb25seToKLQkJICogUnVuIHRoZSBEZXZpY2UgX0hJRCwgX1VJRCwgX0NJRCwgX1NUQSwgX0FEUiBhbmQgX3N4X2QgbWV0aG9kcy4KLQkJICoKLQkJICogTm90ZTogbm9uZSBvZiB0aGVzZSBtZXRob2RzIGFyZSByZXF1aXJlZCwgc28gdGhleSBtYXkgb3IgbWF5Ci0JCSAqIG5vdCBiZSBwcmVzZW50IGZvciB0aGlzIGRldmljZS4gIFRoZSBJbmZvLT5WYWxpZCBiaXRmaWVsZCBpcyB1c2VkCi0JCSAqIHRvIGluZGljYXRlIHdoaWNoIG1ldGhvZHMgd2VyZSBmb3VuZCBhbmQgcmFuIHN1Y2Nlc3NmdWxseS4KLQkJICovCi0KLQkJLyogRXhlY3V0ZSB0aGUgRGV2aWNlLl9ISUQgbWV0aG9kICovCi0KLQkJc3RhdHVzID0gYWNwaV91dF9leGVjdXRlX0hJRChub2RlLCAmaW5mby0+aGFyZHdhcmVfaWQpOwotCQlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpIHsKLQkJCWluZm8tPnZhbGlkIHw9IEFDUElfVkFMSURfSElEOwotCQl9Ci0KLQkJLyogRXhlY3V0ZSB0aGUgRGV2aWNlLl9VSUQgbWV0aG9kICovCi0KLQkJc3RhdHVzID0gYWNwaV91dF9leGVjdXRlX1VJRChub2RlLCAmaW5mby0+dW5pcXVlX2lkKTsKLQkJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKSB7Ci0JCQlpbmZvLT52YWxpZCB8PSBBQ1BJX1ZBTElEX1VJRDsKLQkJfQotCi0JCS8qIEV4ZWN1dGUgdGhlIERldmljZS5fQ0lEIG1ldGhvZCAqLwotCi0JCXN0YXR1cyA9IGFjcGlfdXRfZXhlY3V0ZV9DSUQobm9kZSwgJmNpZF9saXN0KTsKLQkJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKSB7Ci0JCQlzaXplICs9IGNpZF9saXN0LT5zaXplOwotCQkJaW5mby0+dmFsaWQgfD0gQUNQSV9WQUxJRF9DSUQ7Ci0JCX0KLQotCQkvKiBFeGVjdXRlIHRoZSBEZXZpY2UuX1NUQSBtZXRob2QgKi8KLQotCQlzdGF0dXMgPSBhY3BpX3V0X2V4ZWN1dGVfU1RBKG5vZGUsICZpbmZvLT5jdXJyZW50X3N0YXR1cyk7Ci0JCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkgewotCQkJaW5mby0+dmFsaWQgfD0gQUNQSV9WQUxJRF9TVEE7Ci0JCX0KLQotCQkvKiBFeGVjdXRlIHRoZSBEZXZpY2UuX0FEUiBtZXRob2QgKi8KLQotCQlzdGF0dXMgPSBhY3BpX3V0X2V2YWx1YXRlX251bWVyaWNfb2JqZWN0KE1FVEhPRF9OQU1FX19BRFIsIG5vZGUsCi0JCQkJCQkJICZpbmZvLT5hZGRyZXNzKTsKLQkJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKSB7Ci0JCQlpbmZvLT52YWxpZCB8PSBBQ1BJX1ZBTElEX0FEUjsKLQkJfQotCi0JCS8qIEV4ZWN1dGUgdGhlIERldmljZS5fc3hfZCBtZXRob2RzICovCi0KLQkJc3RhdHVzID0gYWNwaV91dF9leGVjdXRlX3N4ZHMobm9kZSwgaW5mby0+aGlnaGVzdF9kc3RhdGVzKTsKLQkJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKSB7Ci0JCQlpbmZvLT52YWxpZCB8PSBBQ1BJX1ZBTElEX1NYRFM7Ci0JCX0KLQl9Ci0KLQkvKiBWYWxpZGF0ZS9BbGxvY2F0ZS9DbGVhciBjYWxsZXIgYnVmZmVyICovCi0KLQlzdGF0dXMgPSBhY3BpX3V0X2luaXRpYWxpemVfYnVmZmVyKGJ1ZmZlciwgc2l6ZSk7Ci0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCWdvdG8gY2xlYW51cDsKLQl9Ci0KLQkvKiBQb3B1bGF0ZSB0aGUgcmV0dXJuIGJ1ZmZlciAqLwotCi0JcmV0dXJuX2luZm8gPSBidWZmZXItPnBvaW50ZXI7Ci0JQUNQSV9NRU1DUFkocmV0dXJuX2luZm8sIGluZm8sIHNpemVvZihzdHJ1Y3QgYWNwaV9kZXZpY2VfaW5mbykpOwotCi0JaWYgKGNpZF9saXN0KSB7Ci0JCUFDUElfTUVNQ1BZKCZyZXR1cm5faW5mby0+Y29tcGF0aWJpbGl0eV9pZCwgY2lkX2xpc3QsCi0JCQkgICAgY2lkX2xpc3QtPnNpemUpOwotCX0KLQotICAgICAgY2xlYW51cDoKLQlBQ1BJX0ZSRUUoaW5mbyk7Ci0JaWYgKGNpZF9saXN0KSB7Ci0JCUFDUElfRlJFRShjaWRfbGlzdCk7Ci0JfQotCXJldHVybiAoc3RhdHVzKTsKLX0KLQotQUNQSV9FWFBPUlRfU1lNQk9MKGFjcGlfZ2V0X29iamVjdF9pbmZvKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc3hmb2JqLmMgYi9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zeGZvYmouYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmIzNzVlZS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zeGZvYmouYworKysgL2Rldi9udWxsCkBAIC0xLDI4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIE1vZHVsZSBOYW1lOiBuc3hmb2JqIC0gUHVibGljIGludGVyZmFjZXMgdG8gdGhlIEFDUEkgc3Vic3lzdGVtCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICBBQ1BJIE9iamVjdCBvcmllbnRlZCBpbnRlcmZhY2VzCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDgsIEludGVsIENvcnAuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCi0gKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSBhdCBtaW5pbXVtIGEgZGlzY2xhaW1lcgotICogICAgc3Vic3RhbnRpYWxseSBzaW1pbGFyIHRvIHRoZSAiTk8gV0FSUkFOVFkiIGRpc2NsYWltZXIgYmVsb3cKLSAqICAgICgiRGlzY2xhaW1lciIpIGFuZCBhbnkgcmVkaXN0cmlidXRpb24gbXVzdCBiZSBjb25kaXRpb25lZCB1cG9uCi0gKiAgICBpbmNsdWRpbmcgYSBzdWJzdGFudGlhbGx5IHNpbWlsYXIgRGlzY2xhaW1lciByZXF1aXJlbWVudCBmb3IgZnVydGhlcgotICogICAgYmluYXJ5IHJlZGlzdHJpYnV0aW9uLgotICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzCi0gKiAgICBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIE5PIFdBUlJBTlRZCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKLSAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCi0gKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORwotICogSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCi0gKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCi0gKi8KLQotI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgotI2luY2x1ZGUgPGFjcGkvYWNuYW1lc3AuaD4KLQotI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfTkFNRVNQQUNFCi1BQ1BJX01PRFVMRV9OQU1FKCJuc3hmb2JqIikKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9nZXRfaWQKLSAqCi0gKiBQQVJBTUVURVJTOiAgSGFuZGxlICAgICAgICAgIC0gSGFuZGxlIG9mIG9iamVjdCB3aG9zZSBpZCBpcyBkZXNpcmVkCi0gKiAgICAgICAgICAgICAgcmV0X2lkICAgICAgICAgIC0gV2hlcmUgdGhlIGlkIHdpbGwgYmUgcGxhY2VkCi0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cwotICoKLSAqIERFU0NSSVBUSU9OOiBUaGlzIHJvdXRpbmUgcmV0dXJucyB0aGUgb3duZXIgaWQgYXNzb2NpYXRlZCB3aXRoIGEgaGFuZGxlCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWFjcGlfc3RhdHVzIGFjcGlfZ2V0X2lkKGFjcGlfaGFuZGxlIGhhbmRsZSwgYWNwaV9vd25lcl9pZCAqIHJldF9pZCkKLXsKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZTsKLQlhY3BpX3N0YXR1cyBzdGF0dXM7Ci0KLQkvKiBQYXJhbWV0ZXIgVmFsaWRhdGlvbiAqLwotCi0JaWYgKCFyZXRfaWQpIHsKLQkJcmV0dXJuIChBRV9CQURfUEFSQU1FVEVSKTsKLQl9Ci0KLQlzdGF0dXMgPSBhY3BpX3V0X2FjcXVpcmVfbXV0ZXgoQUNQSV9NVFhfTkFNRVNQQUNFKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJcmV0dXJuIChzdGF0dXMpOwotCX0KLQotCS8qIENvbnZlcnQgYW5kIHZhbGlkYXRlIHRoZSBoYW5kbGUgKi8KLQotCW5vZGUgPSBhY3BpX25zX21hcF9oYW5kbGVfdG9fbm9kZShoYW5kbGUpOwotCWlmICghbm9kZSkgewotCQkodm9pZClhY3BpX3V0X3JlbGVhc2VfbXV0ZXgoQUNQSV9NVFhfTkFNRVNQQUNFKTsKLQkJcmV0dXJuIChBRV9CQURfUEFSQU1FVEVSKTsKLQl9Ci0KLQkqcmV0X2lkID0gbm9kZS0+b3duZXJfaWQ7Ci0KLQlzdGF0dXMgPSBhY3BpX3V0X3JlbGVhc2VfbXV0ZXgoQUNQSV9NVFhfTkFNRVNQQUNFKTsKLQlyZXR1cm4gKHN0YXR1cyk7Ci19Ci0KLUFDUElfRVhQT1JUX1NZTUJPTChhY3BpX2dldF9pZCkKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9nZXRfdHlwZQotICoKLSAqIFBBUkFNRVRFUlM6ICBIYW5kbGUgICAgICAgICAgLSBIYW5kbGUgb2Ygb2JqZWN0IHdob3NlIHR5cGUgaXMgZGVzaXJlZAotICogICAgICAgICAgICAgIHJldF90eXBlICAgICAgICAtIFdoZXJlIHRoZSB0eXBlIHdpbGwgYmUgcGxhY2VkCi0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cwotICoKLSAqIERFU0NSSVBUSU9OOiBUaGlzIHJvdXRpbmUgcmV0dXJucyB0aGUgdHlwZSBhc3NvY2lhdGQgd2l0aCBhIHBhcnRpY3VsYXIgaGFuZGxlCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWFjcGlfc3RhdHVzIGFjcGlfZ2V0X3R5cGUoYWNwaV9oYW5kbGUgaGFuZGxlLCBhY3BpX29iamVjdF90eXBlICogcmV0X3R5cGUpCi17Ci0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGU7Ci0JYWNwaV9zdGF0dXMgc3RhdHVzOwotCi0JLyogUGFyYW1ldGVyIFZhbGlkYXRpb24gKi8KLQotCWlmICghcmV0X3R5cGUpIHsKLQkJcmV0dXJuIChBRV9CQURfUEFSQU1FVEVSKTsKLQl9Ci0KLQkvKgotCSAqIFNwZWNpYWwgY2FzZSBmb3IgdGhlIHByZWRlZmluZWQgUm9vdCBOb2RlCi0JICogKHJldHVybiB0eXBlIEFOWSkKLQkgKi8KLQlpZiAoaGFuZGxlID09IEFDUElfUk9PVF9PQkpFQ1QpIHsKLQkJKnJldF90eXBlID0gQUNQSV9UWVBFX0FOWTsKLQkJcmV0dXJuIChBRV9PSyk7Ci0JfQotCi0Jc3RhdHVzID0gYWNwaV91dF9hY3F1aXJlX211dGV4KEFDUElfTVRYX05BTUVTUEFDRSk7Ci0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCXJldHVybiAoc3RhdHVzKTsKLQl9Ci0KLQkvKiBDb252ZXJ0IGFuZCB2YWxpZGF0ZSB0aGUgaGFuZGxlICovCi0KLQlub2RlID0gYWNwaV9uc19tYXBfaGFuZGxlX3RvX25vZGUoaGFuZGxlKTsKLQlpZiAoIW5vZGUpIHsKLQkJKHZvaWQpYWNwaV91dF9yZWxlYXNlX211dGV4KEFDUElfTVRYX05BTUVTUEFDRSk7Ci0JCXJldHVybiAoQUVfQkFEX1BBUkFNRVRFUik7Ci0JfQotCi0JKnJldF90eXBlID0gbm9kZS0+dHlwZTsKLQotCXN0YXR1cyA9IGFjcGlfdXRfcmVsZWFzZV9tdXRleChBQ1BJX01UWF9OQU1FU1BBQ0UpOwotCXJldHVybiAoc3RhdHVzKTsKLX0KLQotQUNQSV9FWFBPUlRfU1lNQk9MKGFjcGlfZ2V0X3R5cGUpCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfZ2V0X3BhcmVudAotICoKLSAqIFBBUkFNRVRFUlM6ICBIYW5kbGUgICAgICAgICAgLSBIYW5kbGUgb2Ygb2JqZWN0IHdob3NlIHBhcmVudCBpcyBkZXNpcmVkCi0gKiAgICAgICAgICAgICAgcmV0X2hhbmRsZSAgICAgIC0gV2hlcmUgdGhlIHBhcmVudCBoYW5kbGUgd2lsbCBiZSBwbGFjZWQKLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IFJldHVybnMgYSBoYW5kbGUgdG8gdGhlIHBhcmVudCBvZiB0aGUgb2JqZWN0IHJlcHJlc2VudGVkIGJ5Ci0gKiAgICAgICAgICAgICAgSGFuZGxlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1hY3BpX3N0YXR1cyBhY3BpX2dldF9wYXJlbnQoYWNwaV9oYW5kbGUgaGFuZGxlLCBhY3BpX2hhbmRsZSAqIHJldF9oYW5kbGUpCi17Ci0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGU7Ci0JYWNwaV9zdGF0dXMgc3RhdHVzOwotCi0JaWYgKCFyZXRfaGFuZGxlKSB7Ci0JCXJldHVybiAoQUVfQkFEX1BBUkFNRVRFUik7Ci0JfQotCi0JLyogU3BlY2lhbCBjYXNlIGZvciB0aGUgcHJlZGVmaW5lZCBSb290IE5vZGUgKG5vIHBhcmVudCkgKi8KLQotCWlmIChoYW5kbGUgPT0gQUNQSV9ST09UX09CSkVDVCkgewotCQlyZXR1cm4gKEFFX05VTExfRU5UUlkpOwotCX0KLQotCXN0YXR1cyA9IGFjcGlfdXRfYWNxdWlyZV9tdXRleChBQ1BJX01UWF9OQU1FU1BBQ0UpOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlyZXR1cm4gKHN0YXR1cyk7Ci0JfQotCi0JLyogQ29udmVydCBhbmQgdmFsaWRhdGUgdGhlIGhhbmRsZSAqLwotCi0Jbm9kZSA9IGFjcGlfbnNfbWFwX2hhbmRsZV90b19ub2RlKGhhbmRsZSk7Ci0JaWYgKCFub2RlKSB7Ci0JCXN0YXR1cyA9IEFFX0JBRF9QQVJBTUVURVI7Ci0JCWdvdG8gdW5sb2NrX2FuZF9leGl0OwotCX0KLQotCS8qIEdldCB0aGUgcGFyZW50IGVudHJ5ICovCi0KLQkqcmV0X2hhbmRsZSA9Ci0JICAgIGFjcGlfbnNfY29udmVydF9lbnRyeV90b19oYW5kbGUoYWNwaV9uc19nZXRfcGFyZW50X25vZGUobm9kZSkpOwotCi0JLyogUmV0dXJuIGV4Y2VwdGlvbiBpZiBwYXJlbnQgaXMgbnVsbCAqLwotCi0JaWYgKCFhY3BpX25zX2dldF9wYXJlbnRfbm9kZShub2RlKSkgewotCQlzdGF0dXMgPSBBRV9OVUxMX0VOVFJZOwotCX0KLQotICAgICAgdW5sb2NrX2FuZF9leGl0OgotCi0JKHZvaWQpYWNwaV91dF9yZWxlYXNlX211dGV4KEFDUElfTVRYX05BTUVTUEFDRSk7Ci0JcmV0dXJuIChzdGF0dXMpOwotfQotCi1BQ1BJX0VYUE9SVF9TWU1CT0woYWNwaV9nZXRfcGFyZW50KQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX2dldF9uZXh0X29iamVjdAotICoKLSAqIFBBUkFNRVRFUlM6ICBUeXBlICAgICAgICAgICAgLSBUeXBlIG9mIG9iamVjdCB0byBiZSBzZWFyY2hlZCBmb3IKLSAqICAgICAgICAgICAgICBQYXJlbnQgICAgICAgICAgLSBQYXJlbnQgb2JqZWN0IHdob3NlIGNoaWxkcmVuIHdlIGFyZSBnZXR0aW5nCi0gKiAgICAgICAgICAgICAgbGFzdF9jaGlsZCAgICAgIC0gUHJldmlvdXMgY2hpbGQgdGhhdCB3YXMgZm91bmQuCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIE5FWFQgY2hpbGQgd2lsbCBiZSByZXR1cm5lZAotICogICAgICAgICAgICAgIHJldF9oYW5kbGUgICAgICAtIFdoZXJlIGhhbmRsZSB0byB0aGUgbmV4dCBvYmplY3QgaXMgcGxhY2VkCi0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cwotICoKLSAqIERFU0NSSVBUSU9OOiBSZXR1cm4gdGhlIG5leHQgcGVlciBvYmplY3Qgd2l0aGluIHRoZSBuYW1lc3BhY2UuICBJZiBIYW5kbGUgaXMKLSAqICAgICAgICAgICAgICB2YWxpZCwgU2NvcGUgaXMgaWdub3JlZC4gIE90aGVyd2lzZSwgdGhlIGZpcnN0IG9iamVjdCB3aXRoaW4KLSAqICAgICAgICAgICAgICBTY29wZSBpcyByZXR1cm5lZC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYWNwaV9zdGF0dXMKLWFjcGlfZ2V0X25leHRfb2JqZWN0KGFjcGlfb2JqZWN0X3R5cGUgdHlwZSwKLQkJICAgICBhY3BpX2hhbmRsZSBwYXJlbnQsCi0JCSAgICAgYWNwaV9oYW5kbGUgY2hpbGQsIGFjcGlfaGFuZGxlICogcmV0X2hhbmRsZSkKLXsKLQlhY3BpX3N0YXR1cyBzdGF0dXM7Ci0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGU7Ci0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKnBhcmVudF9ub2RlID0gTlVMTDsKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqY2hpbGRfbm9kZSA9IE5VTEw7Ci0KLQkvKiBQYXJhbWV0ZXIgdmFsaWRhdGlvbiAqLwotCi0JaWYgKHR5cGUgPiBBQ1BJX1RZUEVfRVhURVJOQUxfTUFYKSB7Ci0JCXJldHVybiAoQUVfQkFEX1BBUkFNRVRFUik7Ci0JfQotCi0Jc3RhdHVzID0gYWNwaV91dF9hY3F1aXJlX211dGV4KEFDUElfTVRYX05BTUVTUEFDRSk7Ci0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCXJldHVybiAoc3RhdHVzKTsKLQl9Ci0KLQkvKiBJZiBudWxsIGhhbmRsZSwgdXNlIHRoZSBwYXJlbnQgKi8KLQotCWlmICghY2hpbGQpIHsKLQotCQkvKiBTdGFydCBzZWFyY2ggYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgc3BlY2lmaWVkIHNjb3BlICovCi0KLQkJcGFyZW50X25vZGUgPSBhY3BpX25zX21hcF9oYW5kbGVfdG9fbm9kZShwYXJlbnQpOwotCQlpZiAoIXBhcmVudF9ub2RlKSB7Ci0JCQlzdGF0dXMgPSBBRV9CQURfUEFSQU1FVEVSOwotCQkJZ290byB1bmxvY2tfYW5kX2V4aXQ7Ci0JCX0KLQl9IGVsc2UgewotCQkvKiBOb24tbnVsbCBoYW5kbGUsIGlnbm9yZSB0aGUgcGFyZW50ICovCi0JCS8qIENvbnZlcnQgYW5kIHZhbGlkYXRlIHRoZSBoYW5kbGUgKi8KLQotCQljaGlsZF9ub2RlID0gYWNwaV9uc19tYXBfaGFuZGxlX3RvX25vZGUoY2hpbGQpOwotCQlpZiAoIWNoaWxkX25vZGUpIHsKLQkJCXN0YXR1cyA9IEFFX0JBRF9QQVJBTUVURVI7Ci0JCQlnb3RvIHVubG9ja19hbmRfZXhpdDsKLQkJfQotCX0KLQotCS8qIEludGVybmFsIGZ1bmN0aW9uIGRvZXMgdGhlIHJlYWwgd29yayAqLwotCi0Jbm9kZSA9IGFjcGlfbnNfZ2V0X25leHRfbm9kZSh0eXBlLCBwYXJlbnRfbm9kZSwgY2hpbGRfbm9kZSk7Ci0JaWYgKCFub2RlKSB7Ci0JCXN0YXR1cyA9IEFFX05PVF9GT1VORDsKLQkJZ290byB1bmxvY2tfYW5kX2V4aXQ7Ci0JfQotCi0JaWYgKHJldF9oYW5kbGUpIHsKLQkJKnJldF9oYW5kbGUgPSBhY3BpX25zX2NvbnZlcnRfZW50cnlfdG9faGFuZGxlKG5vZGUpOwotCX0KLQotICAgICAgdW5sb2NrX2FuZF9leGl0OgotCi0JKHZvaWQpYWNwaV91dF9yZWxlYXNlX211dGV4KEFDUElfTVRYX05BTUVTUEFDRSk7Ci0JcmV0dXJuIChzdGF0dXMpOwotfQotCi1BQ1BJX0VYUE9SVF9TWU1CT0woYWNwaV9nZXRfbmV4dF9vYmplY3QpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvbnVtYS5jIGIvZHJpdmVycy9hY3BpL251bWEuYwppbmRleCAyNWNlYWU5MS4uYzVlMjkyYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL251bWEuYworKysgYi9kcml2ZXJzL2FjcGkvbnVtYS5jCkBAIC0yOSw3ICsyOSw2IEBACiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9hY3BpLmg+CiAjaW5jbHVkZSA8YWNwaS9hY3BpX2J1cy5oPgotI2luY2x1ZGUgPGFjcGkvYWNtYWNyb3MuaD4KIAogI2RlZmluZSBBQ1BJX05VTUEJMHg4MDAwMDAwMAogI2RlZmluZSBfQ09NUE9ORU5UCUFDUElfTlVNQQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL29zbC5jIGIvZHJpdmVycy9hY3BpL29zbC5jCmluZGV4IGM4MTExNDIuLjY3MjlhNDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9vc2wuYworKysgYi9kcml2ZXJzL2FjcGkvb3NsLmMKQEAgLTcyNiw3ICs3MjYsNyBAQAogCiAJZHBjID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGFjcGlfb3NfZHBjKSwgR0ZQX0FUT01JQyk7CiAJaWYgKCFkcGMpCi0JCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT19NRU1PUlkpOworCQlyZXR1cm4gQUVfTk9fTUVNT1JZOwogCiAJZHBjLT5mdW5jdGlvbiA9IGZ1bmN0aW9uOwogCWRwYy0+Y29udGV4dCA9IGNvbnRleHQ7CkBAIC03NDcsNyArNzQ3LDcgQEAKIAkJc3RhdHVzID0gQUVfRVJST1I7CiAJCWtmcmVlKGRwYyk7CiAJfQotCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworCXJldHVybiBzdGF0dXM7CiB9CiAKIGFjcGlfc3RhdHVzIGFjcGlfb3NfZXhlY3V0ZShhY3BpX2V4ZWN1dGVfdHlwZSB0eXBlLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3BhcnNlci9NYWtlZmlsZSBiL2RyaXZlcnMvYWNwaS9wYXJzZXIvTWFrZWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiMjRlZTAuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9hY3BpL3BhcnNlci9NYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotIwotIyBNYWtlZmlsZSBmb3IgYWxsIExpbnV4IEFDUEkgaW50ZXJwcmV0ZXIgc3ViZGlyZWN0b3JpZXMKLSMKLQotb2JqLXkgOj0gcHNhcmdzLm8gICAgcHNwYXJzZS5vICBwc2xvb3AubyBwc3RyZWUubyAgIHBzd2Fsay5vICBcCi0JIHBzb3Bjb2RlLm8gIHBzc2NvcGUubyAgcHN1dGlscy5vICBwc3hmYWNlLm8KLQotRVhUUkFfQ0ZMQUdTICs9ICQoQUNQSV9DRkxBR1MpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvcGFyc2VyL3BzYXJncy5jIGIvZHJpdmVycy9hY3BpL3BhcnNlci9wc2FyZ3MuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDgzMGIyOS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL2FjcGkvcGFyc2VyL3BzYXJncy5jCisrKyAvZGV2L251bGwKQEAgLTEsNzUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBNb2R1bGUgTmFtZTogcHNhcmdzIC0gUGFyc2UgQU1MIG9wY29kZSBhcmd1bWVudHMKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA4LCBJbnRlbCBDb3JwLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAotICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgYXQgbWluaW11bSBhIGRpc2NsYWltZXIKLSAqICAgIHN1YnN0YW50aWFsbHkgc2ltaWxhciB0byB0aGUgIk5PIFdBUlJBTlRZIiBkaXNjbGFpbWVyIGJlbG93Ci0gKiAgICAoIkRpc2NsYWltZXIiKSBhbmQgYW55IHJlZGlzdHJpYnV0aW9uIG11c3QgYmUgY29uZGl0aW9uZWQgdXBvbgotICogICAgaW5jbHVkaW5nIGEgc3Vic3RhbnRpYWxseSBzaW1pbGFyIERpc2NsYWltZXIgcmVxdWlyZW1lbnQgZm9yIGZ1cnRoZXIKLSAqICAgIGJpbmFyeSByZWRpc3RyaWJ1dGlvbi4KLSAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcwotICogICAgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICogU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBOTyBXQVJSQU5UWQotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCi0gKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUwotICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcKLSAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQotICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgotICovCi0KLSNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KLSNpbmNsdWRlIDxhY3BpL2FjcGFyc2VyLmg+Ci0jaW5jbHVkZSA8YWNwaS9hbWxjb2RlLmg+Ci0jaW5jbHVkZSA8YWNwaS9hY25hbWVzcC5oPgotI2luY2x1ZGUgPGFjcGkvYWNkaXNwYXQuaD4KLQotI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfUEFSU0VSCi1BQ1BJX01PRFVMRV9OQU1FKCJwc2FyZ3MiKQotCi0vKiBMb2NhbCBwcm90b3R5cGVzICovCi1zdGF0aWMgdTMyCi1hY3BpX3BzX2dldF9uZXh0X3BhY2thZ2VfbGVuZ3RoKHN0cnVjdCBhY3BpX3BhcnNlX3N0YXRlICpwYXJzZXJfc3RhdGUpOwotCi1zdGF0aWMgdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKmFjcGlfcHNfZ2V0X25leHRfZmllbGQoc3RydWN0IGFjcGlfcGFyc2Vfc3RhdGUKLQkJCQkJCSAgICAgICAqcGFyc2VyX3N0YXRlKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9wc19nZXRfbmV4dF9wYWNrYWdlX2xlbmd0aAotICoKLSAqIFBBUkFNRVRFUlM6ICBwYXJzZXJfc3RhdGUgICAgICAgIC0gQ3VycmVudCBwYXJzZXIgc3RhdGUgb2JqZWN0Ci0gKgotICogUkVUVVJOOiAgICAgIERlY29kZWQgcGFja2FnZSBsZW5ndGguIE9uIGNvbXBsZXRpb24sIHRoZSBBTUwgcG9pbnRlciBwb2ludHMKLSAqICAgICAgICAgICAgICBwYXN0IHRoZSBsZW5ndGggYnl0ZSBvciBieXRlcy4KLSAqCi0gKiBERVNDUklQVElPTjogRGVjb2RlIGFuZCByZXR1cm4gYSBwYWNrYWdlIGxlbmd0aCBmaWVsZC4KLSAqICAgICAgICAgICAgICBOb3RlOiBMYXJnZXN0IHBhY2thZ2UgbGVuZ3RoIGlzIDI4IGJpdHMsIGZyb20gQUNQSSBzcGVjaWZpY2F0aW9uCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIHUzMgotYWNwaV9wc19nZXRfbmV4dF9wYWNrYWdlX2xlbmd0aChzdHJ1Y3QgYWNwaV9wYXJzZV9zdGF0ZSAqcGFyc2VyX3N0YXRlKQotewotCXU4ICphbWwgPSBwYXJzZXJfc3RhdGUtPmFtbDsKLQl1MzIgcGFja2FnZV9sZW5ndGggPSAwOwotCXUzMiBieXRlX2NvdW50OwotCXU4IGJ5dGVfemVyb19tYXNrID0gMHgzRjsJLyogRGVmYXVsdCBbMDo1XSAqLwotCi0JQUNQSV9GVU5DVElPTl9UUkFDRShwc19nZXRfbmV4dF9wYWNrYWdlX2xlbmd0aCk7Ci0KLQkvKgotCSAqIEJ5dGUgMCBiaXRzIFs2OjddIGNvbnRhaW4gdGhlIG51bWJlciBvZiBhZGRpdGlvbmFsIGJ5dGVzCi0JICogdXNlZCB0byBlbmNvZGUgdGhlIHBhY2thZ2UgbGVuZ3RoLCBlaXRoZXIgMCwxLDIsIG9yIDMKLQkgKi8KLQlieXRlX2NvdW50ID0gKGFtbFswXSA+PiA2KTsKLQlwYXJzZXJfc3RhdGUtPmFtbCArPSAoKGFjcGlfc2l6ZSkgYnl0ZV9jb3VudCArIDEpOwotCi0JLyogR2V0IGJ5dGVzIDMsIDIsIDEgYXMgbmVlZGVkICovCi0KLQl3aGlsZSAoYnl0ZV9jb3VudCkgewotCQkvKgotCQkgKiBGaW5hbCBiaXQgcG9zaXRpb25zIGZvciB0aGUgcGFja2FnZSBsZW5ndGggYnl0ZXM6Ci0JCSAqICAgICAgQnl0ZTMtPlsyMDoyN10KLQkJICogICAgICBCeXRlMi0+WzEyOjE5XQotCQkgKiAgICAgIEJ5dGUxLT5bMDQ6MTFdCi0JCSAqICAgICAgQnl0ZTAtPlswMDowM10KLQkJICovCi0JCXBhY2thZ2VfbGVuZ3RoIHw9IChhbWxbYnl0ZV9jb3VudF0gPDwgKChieXRlX2NvdW50IDw8IDMpIC0gNCkpOwotCi0JCWJ5dGVfemVyb19tYXNrID0gMHgwRjsJLyogVXNlIGJpdHMgWzA6M10gb2YgYnl0ZSAwICovCi0JCWJ5dGVfY291bnQtLTsKLQl9Ci0KLQkvKiBCeXRlIDAgaXMgYSBzcGVjaWFsIGNhc2UsIGVpdGhlciBiaXRzIFswOjNdIG9yIFswOjVdIGFyZSB1c2VkICovCi0KLQlwYWNrYWdlX2xlbmd0aCB8PSAoYW1sWzBdICYgYnl0ZV96ZXJvX21hc2spOwotCXJldHVybl9VSU5UMzIocGFja2FnZV9sZW5ndGgpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX3BzX2dldF9uZXh0X3BhY2thZ2VfZW5kCi0gKgotICogUEFSQU1FVEVSUzogIHBhcnNlcl9zdGF0ZSAgICAgICAgLSBDdXJyZW50IHBhcnNlciBzdGF0ZSBvYmplY3QKLSAqCi0gKiBSRVRVUk46ICAgICAgUG9pbnRlciB0byBlbmQtb2YtcGFja2FnZSArMQotICoKLSAqIERFU0NSSVBUSU9OOiBHZXQgbmV4dCBwYWNrYWdlIGxlbmd0aCBhbmQgcmV0dXJuIGEgcG9pbnRlciBwYXN0IHRoZSBlbmQgb2YKLSAqICAgICAgICAgICAgICB0aGUgcGFja2FnZS4gIENvbnN1bWVzIHRoZSBwYWNrYWdlIGxlbmd0aCBmaWVsZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXU4ICphY3BpX3BzX2dldF9uZXh0X3BhY2thZ2VfZW5kKHN0cnVjdCBhY3BpX3BhcnNlX3N0YXRlICpwYXJzZXJfc3RhdGUpCi17Ci0JdTggKnN0YXJ0ID0gcGFyc2VyX3N0YXRlLT5hbWw7Ci0JdTMyIHBhY2thZ2VfbGVuZ3RoOwotCi0JQUNQSV9GVU5DVElPTl9UUkFDRShwc19nZXRfbmV4dF9wYWNrYWdlX2VuZCk7Ci0KLQkvKiBGdW5jdGlvbiBiZWxvdyB1cGRhdGVzIHBhcnNlcl9zdGF0ZS0+QW1sICovCi0KLQlwYWNrYWdlX2xlbmd0aCA9IGFjcGlfcHNfZ2V0X25leHRfcGFja2FnZV9sZW5ndGgocGFyc2VyX3N0YXRlKTsKLQotCXJldHVybl9QVFIoc3RhcnQgKyBwYWNrYWdlX2xlbmd0aCk7CS8qIGVuZCBvZiBwYWNrYWdlICovCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfcHNfZ2V0X25leHRfbmFtZXN0cmluZwotICoKLSAqIFBBUkFNRVRFUlM6ICBwYXJzZXJfc3RhdGUgICAgICAgIC0gQ3VycmVudCBwYXJzZXIgc3RhdGUgb2JqZWN0Ci0gKgotICogUkVUVVJOOiAgICAgIFBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIHRoZSBuYW1lIHN0cmluZyAocG9pbnRlciBwb2ludHMgaW50bwotICogICAgICAgICAgICAgIHRoZSBBTUwuCi0gKgotICogREVTQ1JJUFRJT046IEdldCBuZXh0IHJhdyBuYW1lc3RyaW5nIHdpdGhpbiB0aGUgQU1MIHN0cmVhbS4gIEhhbmRsZXMgYWxsIG5hbWUKLSAqICAgICAgICAgICAgICBwcmVmaXggY2hhcmFjdGVycy4gIFNldCBwYXJzZXIgc3RhdGUgdG8gcG9pbnQgcGFzdCB0aGUgc3RyaW5nLgotICogICAgICAgICAgICAgIChOYW1lIGlzIGNvbnN1bWVkIGZyb20gdGhlIEFNTC4pCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotY2hhciAqYWNwaV9wc19nZXRfbmV4dF9uYW1lc3RyaW5nKHN0cnVjdCBhY3BpX3BhcnNlX3N0YXRlICpwYXJzZXJfc3RhdGUpCi17Ci0JdTggKnN0YXJ0ID0gcGFyc2VyX3N0YXRlLT5hbWw7Ci0JdTggKmVuZCA9IHBhcnNlcl9zdGF0ZS0+YW1sOwotCi0JQUNQSV9GVU5DVElPTl9UUkFDRShwc19nZXRfbmV4dF9uYW1lc3RyaW5nKTsKLQotCS8qIFBvaW50IHBhc3QgYW55IG5hbWVzdHJpbmcgcHJlZml4IGNoYXJhY3RlcnMgKGJhY2tzbGFzaCBvciBjYXJhdCkgKi8KLQotCXdoaWxlIChhY3BpX3BzX2lzX3ByZWZpeF9jaGFyKCplbmQpKSB7Ci0JCWVuZCsrOwotCX0KLQotCS8qIERlY29kZSB0aGUgcGF0aCBwcmVmaXggY2hhcmFjdGVyICovCi0KLQlzd2l0Y2ggKCplbmQpIHsKLQljYXNlIDA6Ci0KLQkJLyogbnVsbF9uYW1lICovCi0KLQkJaWYgKGVuZCA9PSBzdGFydCkgewotCQkJc3RhcnQgPSBOVUxMOwotCQl9Ci0JCWVuZCsrOwotCQlicmVhazsKLQotCWNhc2UgQU1MX0RVQUxfTkFNRV9QUkVGSVg6Ci0KLQkJLyogVHdvIG5hbWUgc2VnbWVudHMgKi8KLQotCQllbmQgKz0gMSArICgyICogQUNQSV9OQU1FX1NJWkUpOwotCQlicmVhazsKLQotCWNhc2UgQU1MX01VTFRJX05BTUVfUFJFRklYX09QOgotCi0JCS8qIE11bHRpcGxlIG5hbWUgc2VnbWVudHMsIDQgY2hhcnMgZWFjaCwgY291bnQgaW4gbmV4dCBieXRlICovCi0KLQkJZW5kICs9IDIgKyAoKihlbmQgKyAxKSAqIEFDUElfTkFNRV9TSVpFKTsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCi0JCS8qIFNpbmdsZSBuYW1lIHNlZ21lbnQgKi8KLQotCQllbmQgKz0gQUNQSV9OQU1FX1NJWkU7Ci0JCWJyZWFrOwotCX0KLQotCXBhcnNlcl9zdGF0ZS0+YW1sID0gZW5kOwotCXJldHVybl9QVFIoKGNoYXIgKilzdGFydCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfcHNfZ2V0X25leHRfbmFtZXBhdGgKLSAqCi0gKiBQQVJBTUVURVJTOiAgcGFyc2VyX3N0YXRlICAgICAgICAtIEN1cnJlbnQgcGFyc2VyIHN0YXRlIG9iamVjdAotICogICAgICAgICAgICAgIEFyZyAgICAgICAgICAgICAgICAgLSBXaGVyZSB0aGUgbmFtZXBhdGggd2lsbCBiZSBzdG9yZWQKLSAqICAgICAgICAgICAgICBhcmdfY291bnQgICAgICAgICAgIC0gSWYgdGhlIG5hbWVwYXRoIHBvaW50cyB0byBhIGNvbnRyb2wgbWV0aG9kCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBtZXRob2QncyBhcmd1bWVudCBpcyByZXR1cm5lZCBoZXJlLgotICogICAgICAgICAgICAgIHBvc3NpYmxlX21ldGhvZF9jYWxsIC0gV2hldGhlciB0aGUgbmFtZXBhdGggY2FuIHBvc3NpYmx5IGJlIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCBvZiBhIG1ldGhvZCBjYWxsCi0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cwotICoKLSAqIERFU0NSSVBUSU9OOiBHZXQgbmV4dCBuYW1lIChpZiBtZXRob2QgY2FsbCwgcmV0dXJuICMgb2YgcmVxdWlyZWQgYXJncykuCi0gKiAgICAgICAgICAgICAgTmFtZXMgYXJlIGxvb2tlZCB1cCBpbiB0aGUgaW50ZXJuYWwgbmFtZXNwYWNlIHRvIGRldGVybWluZQotICogICAgICAgICAgICAgIGlmIHRoZSBuYW1lIHJlcHJlc2VudHMgYSBjb250cm9sIG1ldGhvZC4gIElmIGEgbWV0aG9kCi0gKiAgICAgICAgICAgICAgaXMgZm91bmQsIHRoZSBudW1iZXIgb2YgYXJndW1lbnRzIHRvIHRoZSBtZXRob2QgaXMgcmV0dXJuZWQuCi0gKiAgICAgICAgICAgICAgVGhpcyBpbmZvcm1hdGlvbiBpcyBjcml0aWNhbCBmb3IgcGFyc2luZyB0byBjb250aW51ZSBjb3JyZWN0bHkuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotYWNwaV9zdGF0dXMKLWFjcGlfcHNfZ2V0X25leHRfbmFtZXBhdGgoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSwKLQkJCSAgc3RydWN0IGFjcGlfcGFyc2Vfc3RhdGUgKnBhcnNlcl9zdGF0ZSwKLQkJCSAgdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKmFyZywgdTggcG9zc2libGVfbWV0aG9kX2NhbGwpCi17Ci0JYWNwaV9zdGF0dXMgc3RhdHVzOwotCWNoYXIgKnBhdGg7Ci0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKm5hbWVfb3A7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqbWV0aG9kX2Rlc2M7Ci0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGU7Ci0JdTggKnN0YXJ0ID0gcGFyc2VyX3N0YXRlLT5hbWw7Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKHBzX2dldF9uZXh0X25hbWVwYXRoKTsKLQotCXBhdGggPSBhY3BpX3BzX2dldF9uZXh0X25hbWVzdHJpbmcocGFyc2VyX3N0YXRlKTsKLQlhY3BpX3BzX2luaXRfb3AoYXJnLCBBTUxfSU5UX05BTUVQQVRIX09QKTsKLQotCS8qIE51bGwgcGF0aCBjYXNlIGlzIGFsbG93ZWQsIGp1c3QgZXhpdCAqLwotCi0JaWYgKCFwYXRoKSB7Ci0JCWFyZy0+Y29tbW9uLnZhbHVlLm5hbWUgPSBwYXRoOwotCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwotCX0KLQotCS8qCi0JICogTG9va3VwIHRoZSBuYW1lIGluIHRoZSBpbnRlcm5hbCBuYW1lc3BhY2UsIHN0YXJ0aW5nIHdpdGggdGhlIGN1cnJlbnQKLQkgKiBzY29wZS4gV2UgZG9uJ3Qgd2FudCB0byBhZGQgYW55dGhpbmcgbmV3IHRvIHRoZSBuYW1lc3BhY2UgaGVyZSwKLQkgKiBob3dldmVyLCBzbyB3ZSB1c2UgTU9ERV9FWEVDVVRFLgotCSAqIEFsbG93IHNlYXJjaGluZyBvZiB0aGUgcGFyZW50IHRyZWUsIGJ1dCBkb24ndCBvcGVuIGEgbmV3IHNjb3BlIC0KLQkgKiB3ZSBqdXN0IHdhbnQgdG8gbG9va3VwIHRoZSBvYmplY3QgKG11c3QgYmUgbW9kZSBFWEVDVVRFIHRvIHBlcmZvcm0KLQkgKiB0aGUgdXBzZWFyY2gpCi0JICovCi0Jc3RhdHVzID0gYWNwaV9uc19sb29rdXAod2Fsa19zdGF0ZS0+c2NvcGVfaW5mbywgcGF0aCwKLQkJCQlBQ1BJX1RZUEVfQU5ZLCBBQ1BJX0lNT0RFX0VYRUNVVEUsCi0JCQkJQUNQSV9OU19TRUFSQ0hfUEFSRU5UIHwgQUNQSV9OU19ET05UX09QRU5fU0NPUEUsCi0JCQkJTlVMTCwgJm5vZGUpOwotCi0JLyoKLQkgKiBJZiB0aGlzIG5hbWUgaXMgYSBjb250cm9sIG1ldGhvZCBpbnZvY2F0aW9uLCB3ZSBtdXN0Ci0JICogc2V0dXAgdGhlIG1ldGhvZCBjYWxsCi0JICovCi0JaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpICYmCi0JICAgIHBvc3NpYmxlX21ldGhvZF9jYWxsICYmIChub2RlLT50eXBlID09IEFDUElfVFlQRV9NRVRIT0QpKSB7Ci0JCWlmICh3YWxrX3N0YXRlLT5vcGNvZGUgPT0gQU1MX1VOTE9BRF9PUCkgewotCQkJLyoKLQkJCSAqIGFjcGlfcHNfZ2V0X25leHRfbmFtZXN0cmluZyBoYXMgaW5jcmVhc2VkIHRoZSBBTUwgcG9pbnRlciwKLQkJCSAqIHNvIHdlIG5lZWQgdG8gcmVzdG9yZSB0aGUgc2F2ZWQgQU1MIHBvaW50ZXIgZm9yIG1ldGhvZCBjYWxsLgotCQkJICovCi0JCQl3YWxrX3N0YXRlLT5wYXJzZXJfc3RhdGUuYW1sID0gc3RhcnQ7Ci0JCQl3YWxrX3N0YXRlLT5hcmdfY291bnQgPSAxOwotCQkJYWNwaV9wc19pbml0X29wKGFyZywgQU1MX0lOVF9NRVRIT0RDQUxMX09QKTsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7Ci0JCX0KLQotCQkvKiBUaGlzIG5hbWUgaXMgYWN0dWFsbHkgYSBjb250cm9sIG1ldGhvZCBpbnZvY2F0aW9uICovCi0KLQkJbWV0aG9kX2Rlc2MgPSBhY3BpX25zX2dldF9hdHRhY2hlZF9vYmplY3Qobm9kZSk7Ci0JCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfUEFSU0UsCi0JCQkJICAiQ29udHJvbCBNZXRob2QgLSAlcCBEZXNjICVwIFBhdGg9JXBcbiIsIG5vZGUsCi0JCQkJICBtZXRob2RfZGVzYywgcGF0aCkpOwotCi0JCW5hbWVfb3AgPSBhY3BpX3BzX2FsbG9jX29wKEFNTF9JTlRfTkFNRVBBVEhfT1ApOwotCQlpZiAoIW5hbWVfb3ApIHsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT19NRU1PUlkpOwotCQl9Ci0KLQkJLyogQ2hhbmdlIEFyZyBpbnRvIGEgTUVUSE9EIENBTEwgYW5kIGF0dGFjaCBuYW1lIHRvIGl0ICovCi0KLQkJYWNwaV9wc19pbml0X29wKGFyZywgQU1MX0lOVF9NRVRIT0RDQUxMX09QKTsKLQkJbmFtZV9vcC0+Y29tbW9uLnZhbHVlLm5hbWUgPSBwYXRoOwotCi0JCS8qIFBvaW50IE1FVEhPRENBTEwvTkFNRSB0byB0aGUgTUVUSE9EIE5vZGUgKi8KLQotCQluYW1lX29wLT5jb21tb24ubm9kZSA9IG5vZGU7Ci0JCWFjcGlfcHNfYXBwZW5kX2FyZyhhcmcsIG5hbWVfb3ApOwotCi0JCWlmICghbWV0aG9kX2Rlc2MpIHsKLQkJCUFDUElfRVJST1IoKEFFX0lORk8sCi0JCQkJICAgICJDb250cm9sIE1ldGhvZCAlcCBoYXMgbm8gYXR0YWNoZWQgb2JqZWN0IiwKLQkJCQkgICAgbm9kZSkpOwotCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9JTlRFUk5BTCk7Ci0JCX0KLQotCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX1BBUlNFLAotCQkJCSAgIkNvbnRyb2wgTWV0aG9kIC0gJXAgQXJncyAlWFxuIiwKLQkJCQkgIG5vZGUsIG1ldGhvZF9kZXNjLT5tZXRob2QucGFyYW1fY291bnQpKTsKLQotCQkvKiBHZXQgdGhlIG51bWJlciBvZiBhcmd1bWVudHMgdG8gZXhwZWN0ICovCi0KLQkJd2Fsa19zdGF0ZS0+YXJnX2NvdW50ID0gbWV0aG9kX2Rlc2MtPm1ldGhvZC5wYXJhbV9jb3VudDsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKLQl9Ci0KLQkvKgotCSAqIFNwZWNpYWwgaGFuZGxpbmcgaWYgdGhlIG5hbWUgd2FzIG5vdCBmb3VuZCBkdXJpbmcgdGhlIGxvb2t1cCAtCi0JICogc29tZSBub3RfZm91bmQgY2FzZXMgYXJlIGFsbG93ZWQKLQkgKi8KLQlpZiAoc3RhdHVzID09IEFFX05PVF9GT1VORCkgewotCi0JCS8qIDEpIG5vdF9mb3VuZCBpcyBvayBkdXJpbmcgbG9hZCBwYXNzIDEvMiAoYWxsb3cgZm9yd2FyZCByZWZlcmVuY2VzKSAqLwotCi0JCWlmICgod2Fsa19zdGF0ZS0+cGFyc2VfZmxhZ3MgJiBBQ1BJX1BBUlNFX01PREVfTUFTSykgIT0KLQkJICAgIEFDUElfUEFSU0VfRVhFQ1VURSkgewotCQkJc3RhdHVzID0gQUVfT0s7Ci0JCX0KLQotCQkvKiAyKSBub3RfZm91bmQgZHVyaW5nIGEgY29uZF9yZWZfb2YoeCkgaXMgb2sgYnkgZGVmaW5pdGlvbiAqLwotCi0JCWVsc2UgaWYgKHdhbGtfc3RhdGUtPm9wLT5jb21tb24uYW1sX29wY29kZSA9PQotCQkJIEFNTF9DT05EX1JFRl9PRl9PUCkgewotCQkJc3RhdHVzID0gQUVfT0s7Ci0JCX0KLQotCQkvKgotCQkgKiAzKSBub3RfZm91bmQgd2hpbGUgYnVpbGRpbmcgYSBQYWNrYWdlIGlzIG9rIGF0IHRoaXMgcG9pbnQsIHdlCi0JCSAqIG1heSBmbGFnIGFzIGFuIGVycm9yIGxhdGVyIGlmIHNsYWNrIG1vZGUgaXMgbm90IGVuYWJsZWQuCi0JCSAqIChTb21lIEFTTCBjb2RlIGRlcGVuZHMgb24gYWxsb3dpbmcgdGhpcyBiZWhhdmlvcikKLQkJICovCi0JCWVsc2UgaWYgKChhcmctPmNvbW1vbi5wYXJlbnQpICYmCi0JCQkgKChhcmctPmNvbW1vbi5wYXJlbnQtPmNvbW1vbi5hbWxfb3Bjb2RlID09Ci0JCQkgICBBTUxfUEFDS0FHRV9PUCkKLQkJCSAgfHwgKGFyZy0+Y29tbW9uLnBhcmVudC0+Y29tbW9uLmFtbF9vcGNvZGUgPT0KLQkJCSAgICAgIEFNTF9WQVJfUEFDS0FHRV9PUCkpKSB7Ci0JCQlzdGF0dXMgPSBBRV9PSzsKLQkJfQotCX0KLQotCS8qIEZpbmFsIGV4Y2VwdGlvbiBjaGVjayAobWF5IGhhdmUgYmVlbiBjaGFuZ2VkIGZyb20gY29kZSBhYm92ZSkgKi8KLQotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlBQ1BJX0VSUk9SX05BTUVTUEFDRShwYXRoLCBzdGF0dXMpOwotCi0JCWlmICgod2Fsa19zdGF0ZS0+cGFyc2VfZmxhZ3MgJiBBQ1BJX1BBUlNFX01PREVfTUFTSykgPT0KLQkJICAgIEFDUElfUEFSU0VfRVhFQ1VURSkgewotCi0JCQkvKiBSZXBvcnQgYSBjb250cm9sIG1ldGhvZCBleGVjdXRpb24gZXJyb3IgKi8KLQotCQkJc3RhdHVzID0gYWNwaV9kc19tZXRob2RfZXJyb3Ioc3RhdHVzLCB3YWxrX3N0YXRlKTsKLQkJfQotCX0KLQotCS8qIFNhdmUgdGhlIG5hbWVwYXRoICovCi0KLQlhcmctPmNvbW1vbi52YWx1ZS5uYW1lID0gcGF0aDsKLQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9wc19nZXRfbmV4dF9zaW1wbGVfYXJnCi0gKgotICogUEFSQU1FVEVSUzogIHBhcnNlcl9zdGF0ZSAgICAgICAgLSBDdXJyZW50IHBhcnNlciBzdGF0ZSBvYmplY3QKLSAqICAgICAgICAgICAgICBhcmdfdHlwZSAgICAgICAgICAgIC0gVGhlIGFyZ3VtZW50IHR5cGUgKEFNTF8qX0FSRykKLSAqICAgICAgICAgICAgICBBcmcgICAgICAgICAgICAgICAgIC0gV2hlcmUgdGhlIGFyZ3VtZW50IGlzIHJldHVybmVkCi0gKgotICogUkVUVVJOOiAgICAgIE5vbmUKLSAqCi0gKiBERVNDUklQVElPTjogR2V0IHRoZSBuZXh0IHNpbXBsZSBhcmd1bWVudCAoY29uc3RhbnQsIHN0cmluZywgb3IgbmFtZXN0cmluZykKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi12b2lkCi1hY3BpX3BzX2dldF9uZXh0X3NpbXBsZV9hcmcoc3RydWN0IGFjcGlfcGFyc2Vfc3RhdGUgKnBhcnNlcl9zdGF0ZSwKLQkJCSAgICB1MzIgYXJnX3R5cGUsIHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICphcmcpCi17Ci0JdTMyIGxlbmd0aDsKLQl1MTYgb3Bjb2RlOwotCXU4ICphbWwgPSBwYXJzZXJfc3RhdGUtPmFtbDsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0VfVTMyKHBzX2dldF9uZXh0X3NpbXBsZV9hcmcsIGFyZ190eXBlKTsKLQotCXN3aXRjaCAoYXJnX3R5cGUpIHsKLQljYXNlIEFSR1BfQllURURBVEE6Ci0KLQkJLyogR2V0IDEgYnl0ZSBmcm9tIHRoZSBBTUwgc3RyZWFtICovCi0KLQkJb3Bjb2RlID0gQU1MX0JZVEVfT1A7Ci0JCWFyZy0+Y29tbW9uLnZhbHVlLmludGVnZXIgPSAoYWNwaV9pbnRlZ2VyKSAqIGFtbDsKLQkJbGVuZ3RoID0gMTsKLQkJYnJlYWs7Ci0KLQljYXNlIEFSR1BfV09SRERBVEE6Ci0KLQkJLyogR2V0IDIgYnl0ZXMgZnJvbSB0aGUgQU1MIHN0cmVhbSAqLwotCi0JCW9wY29kZSA9IEFNTF9XT1JEX09QOwotCQlBQ1BJX01PVkVfMTZfVE9fNjQoJmFyZy0+Y29tbW9uLnZhbHVlLmludGVnZXIsIGFtbCk7Ci0JCWxlbmd0aCA9IDI7Ci0JCWJyZWFrOwotCi0JY2FzZSBBUkdQX0RXT1JEREFUQToKLQotCQkvKiBHZXQgNCBieXRlcyBmcm9tIHRoZSBBTUwgc3RyZWFtICovCi0KLQkJb3Bjb2RlID0gQU1MX0RXT1JEX09QOwotCQlBQ1BJX01PVkVfMzJfVE9fNjQoJmFyZy0+Y29tbW9uLnZhbHVlLmludGVnZXIsIGFtbCk7Ci0JCWxlbmd0aCA9IDQ7Ci0JCWJyZWFrOwotCi0JY2FzZSBBUkdQX1FXT1JEREFUQToKLQotCQkvKiBHZXQgOCBieXRlcyBmcm9tIHRoZSBBTUwgc3RyZWFtICovCi0KLQkJb3Bjb2RlID0gQU1MX1FXT1JEX09QOwotCQlBQ1BJX01PVkVfNjRfVE9fNjQoJmFyZy0+Y29tbW9uLnZhbHVlLmludGVnZXIsIGFtbCk7Ci0JCWxlbmd0aCA9IDg7Ci0JCWJyZWFrOwotCi0JY2FzZSBBUkdQX0NIQVJMSVNUOgotCi0JCS8qIEdldCBhIHBvaW50ZXIgdG8gdGhlIHN0cmluZywgcG9pbnQgcGFzdCB0aGUgc3RyaW5nICovCi0KLQkJb3Bjb2RlID0gQU1MX1NUUklOR19PUDsKLQkJYXJnLT5jb21tb24udmFsdWUuc3RyaW5nID0gQUNQSV9DQVNUX1BUUihjaGFyLCBhbWwpOwotCi0JCS8qIEZpbmQgdGhlIG51bGwgdGVybWluYXRvciAqLwotCi0JCWxlbmd0aCA9IDA7Ci0JCXdoaWxlIChhbWxbbGVuZ3RoXSkgewotCQkJbGVuZ3RoKys7Ci0JCX0KLQkJbGVuZ3RoKys7Ci0JCWJyZWFrOwotCi0JY2FzZSBBUkdQX05BTUU6Ci0JY2FzZSBBUkdQX05BTUVTVFJJTkc6Ci0KLQkJYWNwaV9wc19pbml0X29wKGFyZywgQU1MX0lOVF9OQU1FUEFUSF9PUCk7Ci0JCWFyZy0+Y29tbW9uLnZhbHVlLm5hbWUgPQotCQkgICAgYWNwaV9wc19nZXRfbmV4dF9uYW1lc3RyaW5nKHBhcnNlcl9zdGF0ZSk7Ci0JCXJldHVybl9WT0lEOwotCi0JZGVmYXVsdDoKLQotCQlBQ1BJX0VSUk9SKChBRV9JTkZPLCAiSW52YWxpZCBBcmdUeXBlICVYIiwgYXJnX3R5cGUpKTsKLQkJcmV0dXJuX1ZPSUQ7Ci0JfQotCi0JYWNwaV9wc19pbml0X29wKGFyZywgb3Bjb2RlKTsKLQlwYXJzZXJfc3RhdGUtPmFtbCArPSBsZW5ndGg7Ci0JcmV0dXJuX1ZPSUQ7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfcHNfZ2V0X25leHRfZmllbGQKLSAqCi0gKiBQQVJBTUVURVJTOiAgcGFyc2VyX3N0YXRlICAgICAgICAtIEN1cnJlbnQgcGFyc2VyIHN0YXRlIG9iamVjdAotICoKLSAqIFJFVFVSTjogICAgICBBIG5ld2x5IGFsbG9jYXRlZCBGSUVMRCBvcAotICoKLSAqIERFU0NSSVBUSU9OOiBHZXQgbmV4dCBmaWVsZCAobmFtZWRfZmllbGQsIHJlc2VydmVkX2ZpZWxkLCBvciBhY2Nlc3NfZmllbGQpCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICphY3BpX3BzX2dldF9uZXh0X2ZpZWxkKHN0cnVjdCBhY3BpX3BhcnNlX3N0YXRlCi0JCQkJCQkgICAgICAgKnBhcnNlcl9zdGF0ZSkKLXsKLQl1MzIgYW1sX29mZnNldCA9ICh1MzIpCi0JICAgIEFDUElfUFRSX0RJRkYocGFyc2VyX3N0YXRlLT5hbWwsCi0JCQkgIHBhcnNlcl9zdGF0ZS0+YW1sX3N0YXJ0KTsKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqZmllbGQ7Ci0JdTE2IG9wY29kZTsKLQl1MzIgbmFtZTsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UocHNfZ2V0X25leHRfZmllbGQpOwotCi0JLyogRGV0ZXJtaW5lIGZpZWxkIHR5cGUgKi8KLQotCXN3aXRjaCAoQUNQSV9HRVQ4KHBhcnNlcl9zdGF0ZS0+YW1sKSkgewotCWRlZmF1bHQ6Ci0KLQkJb3Bjb2RlID0gQU1MX0lOVF9OQU1FREZJRUxEX09QOwotCQlicmVhazsKLQotCWNhc2UgMHgwMDoKLQotCQlvcGNvZGUgPSBBTUxfSU5UX1JFU0VSVkVERklFTERfT1A7Ci0JCXBhcnNlcl9zdGF0ZS0+YW1sKys7Ci0JCWJyZWFrOwotCi0JY2FzZSAweDAxOgotCi0JCW9wY29kZSA9IEFNTF9JTlRfQUNDRVNTRklFTERfT1A7Ci0JCXBhcnNlcl9zdGF0ZS0+YW1sKys7Ci0JCWJyZWFrOwotCX0KLQotCS8qIEFsbG9jYXRlIGEgbmV3IGZpZWxkIG9wICovCi0KLQlmaWVsZCA9IGFjcGlfcHNfYWxsb2Nfb3Aob3Bjb2RlKTsKLQlpZiAoIWZpZWxkKSB7Ci0JCXJldHVybl9QVFIoTlVMTCk7Ci0JfQotCi0JZmllbGQtPmNvbW1vbi5hbWxfb2Zmc2V0ID0gYW1sX29mZnNldDsKLQotCS8qIERlY29kZSB0aGUgZmllbGQgdHlwZSAqLwotCi0Jc3dpdGNoIChvcGNvZGUpIHsKLQljYXNlIEFNTF9JTlRfTkFNRURGSUVMRF9PUDoKLQotCQkvKiBHZXQgdGhlIDQtY2hhcmFjdGVyIG5hbWUgKi8KLQotCQlBQ1BJX01PVkVfMzJfVE9fMzIoJm5hbWUsIHBhcnNlcl9zdGF0ZS0+YW1sKTsKLQkJYWNwaV9wc19zZXRfbmFtZShmaWVsZCwgbmFtZSk7Ci0JCXBhcnNlcl9zdGF0ZS0+YW1sICs9IEFDUElfTkFNRV9TSVpFOwotCi0JCS8qIEdldCB0aGUgbGVuZ3RoIHdoaWNoIGlzIGVuY29kZWQgYXMgYSBwYWNrYWdlIGxlbmd0aCAqLwotCi0JCWZpZWxkLT5jb21tb24udmFsdWUuc2l6ZSA9Ci0JCSAgICBhY3BpX3BzX2dldF9uZXh0X3BhY2thZ2VfbGVuZ3RoKHBhcnNlcl9zdGF0ZSk7Ci0JCWJyZWFrOwotCi0JY2FzZSBBTUxfSU5UX1JFU0VSVkVERklFTERfT1A6Ci0KLQkJLyogR2V0IHRoZSBsZW5ndGggd2hpY2ggaXMgZW5jb2RlZCBhcyBhIHBhY2thZ2UgbGVuZ3RoICovCi0KLQkJZmllbGQtPmNvbW1vbi52YWx1ZS5zaXplID0KLQkJICAgIGFjcGlfcHNfZ2V0X25leHRfcGFja2FnZV9sZW5ndGgocGFyc2VyX3N0YXRlKTsKLQkJYnJlYWs7Ci0KLQljYXNlIEFNTF9JTlRfQUNDRVNTRklFTERfT1A6Ci0KLQkJLyoKLQkJICogR2V0IGFjY2Vzc190eXBlIGFuZCBhY2Nlc3NfYXR0cmliIGFuZCBtZXJnZSBpbnRvIHRoZSBmaWVsZCBPcAotCQkgKiBhY2Nlc3NfdHlwZSBpcyBmaXJzdCBvcGVyYW5kLCBhY2Nlc3NfYXR0cmlidXRlIGlzIHNlY29uZAotCQkgKi8KLQkJZmllbGQtPmNvbW1vbi52YWx1ZS5pbnRlZ2VyID0KLQkJICAgICgoKHUzMikgQUNQSV9HRVQ4KHBhcnNlcl9zdGF0ZS0+YW1sKSA8PCA4KSk7Ci0JCXBhcnNlcl9zdGF0ZS0+YW1sKys7Ci0JCWZpZWxkLT5jb21tb24udmFsdWUuaW50ZWdlciB8PSBBQ1BJX0dFVDgocGFyc2VyX3N0YXRlLT5hbWwpOwotCQlwYXJzZXJfc3RhdGUtPmFtbCsrOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0KLQkJLyogT3Bjb2RlIHdhcyBzZXQgaW4gcHJldmlvdXMgc3dpdGNoICovCi0JCWJyZWFrOwotCX0KLQotCXJldHVybl9QVFIoZmllbGQpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX3BzX2dldF9uZXh0X2FyZwotICoKLSAqIFBBUkFNRVRFUlM6ICB3YWxrX3N0YXRlICAgICAgICAgIC0gQ3VycmVudCBzdGF0ZQotICogICAgICAgICAgICAgIHBhcnNlcl9zdGF0ZSAgICAgICAgLSBDdXJyZW50IHBhcnNlciBzdGF0ZSBvYmplY3QKLSAqICAgICAgICAgICAgICBhcmdfdHlwZSAgICAgICAgICAgIC0gVGhlIGFyZ3VtZW50IHR5cGUgKEFNTF8qX0FSRykKLSAqICAgICAgICAgICAgICByZXR1cm5fYXJnICAgICAgICAgIC0gV2hlcmUgdGhlIG5leHQgYXJnIGlzIHJldHVybmVkCi0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cywgYW5kIGFuIG9wIG9iamVjdCBjb250YWluaW5nIHRoZSBuZXh0IGFyZ3VtZW50LgotICoKLSAqIERFU0NSSVBUSU9OOiBHZXQgbmV4dCBhcmd1bWVudCAoaW5jbHVkaW5nIGNvbXBsZXggbGlzdCBhcmd1bWVudHMgdGhhdCByZXF1aXJlCi0gKiAgICAgICAgICAgICAgcHVzaGluZyB0aGUgcGFyc2VyIHN0YWNrKQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWFjcGlfc3RhdHVzCi1hY3BpX3BzX2dldF9uZXh0X2FyZyhzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlLAotCQkgICAgIHN0cnVjdCBhY3BpX3BhcnNlX3N0YXRlICpwYXJzZXJfc3RhdGUsCi0JCSAgICAgdTMyIGFyZ190eXBlLCB1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqKnJldHVybl9hcmcpCi17Ci0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKmFyZyA9IE5VTEw7Ci0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKnByZXYgPSBOVUxMOwotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpmaWVsZDsKLQl1MzIgc3Vib3A7Ci0JYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUihwc19nZXRfbmV4dF9hcmcsIHBhcnNlcl9zdGF0ZSk7Ci0KLQlzd2l0Y2ggKGFyZ190eXBlKSB7Ci0JY2FzZSBBUkdQX0JZVEVEQVRBOgotCWNhc2UgQVJHUF9XT1JEREFUQToKLQljYXNlIEFSR1BfRFdPUkREQVRBOgotCWNhc2UgQVJHUF9DSEFSTElTVDoKLQljYXNlIEFSR1BfTkFNRToKLQljYXNlIEFSR1BfTkFNRVNUUklORzoKLQotCQkvKiBDb25zdGFudHMsIHN0cmluZ3MsIGFuZCBuYW1lc3RyaW5ncyBhcmUgYWxsIHRoZSBzYW1lIHNpemUgKi8KLQotCQlhcmcgPSBhY3BpX3BzX2FsbG9jX29wKEFNTF9CWVRFX09QKTsKLQkJaWYgKCFhcmcpIHsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT19NRU1PUlkpOwotCQl9Ci0JCWFjcGlfcHNfZ2V0X25leHRfc2ltcGxlX2FyZyhwYXJzZXJfc3RhdGUsIGFyZ190eXBlLCBhcmcpOwotCQlicmVhazsKLQotCWNhc2UgQVJHUF9QS0dMRU5HVEg6Ci0KLQkJLyogUGFja2FnZSBsZW5ndGgsIG5vdGhpbmcgcmV0dXJuZWQgKi8KLQotCQlwYXJzZXJfc3RhdGUtPnBrZ19lbmQgPQotCQkgICAgYWNwaV9wc19nZXRfbmV4dF9wYWNrYWdlX2VuZChwYXJzZXJfc3RhdGUpOwotCQlicmVhazsKLQotCWNhc2UgQVJHUF9GSUVMRExJU1Q6Ci0KLQkJaWYgKHBhcnNlcl9zdGF0ZS0+YW1sIDwgcGFyc2VyX3N0YXRlLT5wa2dfZW5kKSB7Ci0KLQkJCS8qIE5vbi1lbXB0eSBsaXN0ICovCi0KLQkJCXdoaWxlIChwYXJzZXJfc3RhdGUtPmFtbCA8IHBhcnNlcl9zdGF0ZS0+cGtnX2VuZCkgewotCQkJCWZpZWxkID0gYWNwaV9wc19nZXRfbmV4dF9maWVsZChwYXJzZXJfc3RhdGUpOwotCQkJCWlmICghZmllbGQpIHsKLQkJCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX01FTU9SWSk7Ci0JCQkJfQotCi0JCQkJaWYgKHByZXYpIHsKLQkJCQkJcHJldi0+Y29tbW9uLm5leHQgPSBmaWVsZDsKLQkJCQl9IGVsc2UgewotCQkJCQlhcmcgPSBmaWVsZDsKLQkJCQl9Ci0JCQkJcHJldiA9IGZpZWxkOwotCQkJfQotCi0JCQkvKiBTa2lwIHRvIEVuZCBvZiBieXRlIGRhdGEgKi8KLQotCQkJcGFyc2VyX3N0YXRlLT5hbWwgPSBwYXJzZXJfc3RhdGUtPnBrZ19lbmQ7Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIEFSR1BfQllURUxJU1Q6Ci0KLQkJaWYgKHBhcnNlcl9zdGF0ZS0+YW1sIDwgcGFyc2VyX3N0YXRlLT5wa2dfZW5kKSB7Ci0KLQkJCS8qIE5vbi1lbXB0eSBsaXN0ICovCi0KLQkJCWFyZyA9IGFjcGlfcHNfYWxsb2Nfb3AoQU1MX0lOVF9CWVRFTElTVF9PUCk7Ci0JCQlpZiAoIWFyZykgewotCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT19NRU1PUlkpOwotCQkJfQotCi0JCQkvKiBGaWxsIGluIGJ5dGVsaXN0IGRhdGEgKi8KLQotCQkJYXJnLT5jb21tb24udmFsdWUuc2l6ZSA9ICh1MzIpCi0JCQkgICAgQUNQSV9QVFJfRElGRihwYXJzZXJfc3RhdGUtPnBrZ19lbmQsCi0JCQkJCSAgcGFyc2VyX3N0YXRlLT5hbWwpOwotCQkJYXJnLT5uYW1lZC5kYXRhID0gcGFyc2VyX3N0YXRlLT5hbWw7Ci0KLQkJCS8qIFNraXAgdG8gRW5kIG9mIGJ5dGUgZGF0YSAqLwotCi0JCQlwYXJzZXJfc3RhdGUtPmFtbCA9IHBhcnNlcl9zdGF0ZS0+cGtnX2VuZDsKLQkJfQotCQlicmVhazsKLQotCWNhc2UgQVJHUF9UQVJHRVQ6Ci0JY2FzZSBBUkdQX1NVUEVSTkFNRToKLQljYXNlIEFSR1BfU0lNUExFTkFNRToKLQotCQlzdWJvcCA9IGFjcGlfcHNfcGVla19vcGNvZGUocGFyc2VyX3N0YXRlKTsKLQkJaWYgKHN1Ym9wID09IDAgfHwKLQkJICAgIGFjcGlfcHNfaXNfbGVhZGluZ19jaGFyKHN1Ym9wKSB8fAotCQkgICAgYWNwaV9wc19pc19wcmVmaXhfY2hhcihzdWJvcCkpIHsKLQotCQkJLyogbnVsbF9uYW1lIG9yIG5hbWVfc3RyaW5nICovCi0KLQkJCWFyZyA9IGFjcGlfcHNfYWxsb2Nfb3AoQU1MX0lOVF9OQU1FUEFUSF9PUCk7Ci0JCQlpZiAoIWFyZykgewotCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT19NRU1PUlkpOwotCQkJfQotCi0JCQkvKiBUbyBzdXBwb3J0IHN1cGVyX25hbWUgYXJnIG9mIFVubG9hZCAqLwotCi0JCQlpZiAod2Fsa19zdGF0ZS0+b3Bjb2RlID09IEFNTF9VTkxPQURfT1ApIHsKLQkJCQlzdGF0dXMgPQotCQkJCSAgICBhY3BpX3BzX2dldF9uZXh0X25hbWVwYXRoKHdhbGtfc3RhdGUsCi0JCQkJCQkJICAgICAgcGFyc2VyX3N0YXRlLCBhcmcsCi0JCQkJCQkJICAgICAgMSk7Ci0KLQkJCQkvKgotCQkJCSAqIElmIHRoZSBzdXBlcl9uYW1lIGFyZyBvZiBVbmxvYWQgaXMgYSBtZXRob2QgY2FsbCwKLQkJCQkgKiB3ZSBoYXZlIHJlc3RvcmVkIHRoZSBBTUwgcG9pbnRlciwganVzdCBmcmVlIHRoaXMgQXJnCi0JCQkJICovCi0JCQkJaWYgKGFyZy0+Y29tbW9uLmFtbF9vcGNvZGUgPT0KLQkJCQkgICAgQU1MX0lOVF9NRVRIT0RDQUxMX09QKSB7Ci0JCQkJCWFjcGlfcHNfZnJlZV9vcChhcmcpOwotCQkJCQlhcmcgPSBOVUxMOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJc3RhdHVzID0KLQkJCQkgICAgYWNwaV9wc19nZXRfbmV4dF9uYW1lcGF0aCh3YWxrX3N0YXRlLAotCQkJCQkJCSAgICAgIHBhcnNlcl9zdGF0ZSwgYXJnLAotCQkJCQkJCSAgICAgIDApOwotCQkJfQotCQl9IGVsc2UgewotCQkJLyogU2luZ2xlIGNvbXBsZXggYXJndW1lbnQsIG5vdGhpbmcgcmV0dXJuZWQgKi8KLQotCQkJd2Fsa19zdGF0ZS0+YXJnX2NvdW50ID0gMTsKLQkJfQotCQlicmVhazsKLQotCWNhc2UgQVJHUF9EQVRBT0JKOgotCWNhc2UgQVJHUF9URVJNQVJHOgotCi0JCS8qIFNpbmdsZSBjb21wbGV4IGFyZ3VtZW50LCBub3RoaW5nIHJldHVybmVkICovCi0KLQkJd2Fsa19zdGF0ZS0+YXJnX2NvdW50ID0gMTsKLQkJYnJlYWs7Ci0KLQljYXNlIEFSR1BfREFUQU9CSkxJU1Q6Ci0JY2FzZSBBUkdQX1RFUk1MSVNUOgotCWNhc2UgQVJHUF9PQkpMSVNUOgotCi0JCWlmIChwYXJzZXJfc3RhdGUtPmFtbCA8IHBhcnNlcl9zdGF0ZS0+cGtnX2VuZCkgewotCi0JCQkvKiBOb24tZW1wdHkgbGlzdCBvZiB2YXJpYWJsZSBhcmd1bWVudHMsIG5vdGhpbmcgcmV0dXJuZWQgKi8KLQotCQkJd2Fsa19zdGF0ZS0+YXJnX2NvdW50ID0gQUNQSV9WQVJfQVJHUzsKLQkJfQotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0KLQkJQUNQSV9FUlJPUigoQUVfSU5GTywgIkludmFsaWQgQXJnVHlwZTogJVgiLCBhcmdfdHlwZSkpOwotCQlzdGF0dXMgPSBBRV9BTUxfT1BFUkFORF9UWVBFOwotCQlicmVhazsKLQl9Ci0KLQkqcmV0dXJuX2FyZyA9IGFyZzsKLQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9wYXJzZXIvcHNsb29wLmMgYi9kcml2ZXJzL2FjcGkvcGFyc2VyL3BzbG9vcC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjQ3MDM5Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvYWNwaS9wYXJzZXIvcHNsb29wLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBNb2R1bGUgTmFtZTogcHNsb29wIC0gTWFpbiBBTUwgcGFyc2UgbG9vcAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDgsIEludGVsIENvcnAuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCi0gKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSBhdCBtaW5pbXVtIGEgZGlzY2xhaW1lcgotICogICAgc3Vic3RhbnRpYWxseSBzaW1pbGFyIHRvIHRoZSAiTk8gV0FSUkFOVFkiIGRpc2NsYWltZXIgYmVsb3cKLSAqICAgICgiRGlzY2xhaW1lciIpIGFuZCBhbnkgcmVkaXN0cmlidXRpb24gbXVzdCBiZSBjb25kaXRpb25lZCB1cG9uCi0gKiAgICBpbmNsdWRpbmcgYSBzdWJzdGFudGlhbGx5IHNpbWlsYXIgRGlzY2xhaW1lciByZXF1aXJlbWVudCBmb3IgZnVydGhlcgotICogICAgYmluYXJ5IHJlZGlzdHJpYnV0aW9uLgotICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzCi0gKiAgICBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIE5PIFdBUlJBTlRZCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKLSAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCi0gKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORwotICogSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCi0gKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCi0gKi8KLQotLyoKLSAqIFBhcnNlIHRoZSBBTUwgYW5kIGJ1aWxkIGFuIG9wZXJhdGlvbiB0cmVlIGFzIG1vc3QgaW50ZXJwcmV0ZXJzLCAoc3VjaCBhcwotICogUGVybCkgZG8uIFBhcnNpbmcgaXMgZG9uZSBieSBoYW5kIHJhdGhlciB0aGFuIHdpdGggYSBZQUNDIGdlbmVyYXRlZCBwYXJzZXIKLSAqIHRvIHRpZ2h0bHkgY29uc3RyYWluIHN0YWNrIGFuZCBkeW5hbWljIG1lbW9yeSB1c2FnZS4gUGFyc2luZyBpcyBrZXB0Ci0gKiBmbGV4aWJsZSBhbmQgdGhlIGNvZGUgZmFpcmx5IGNvbXBhY3QgYnkgcGFyc2luZyBiYXNlZCBvbiBhIGxpc3Qgb2YgQU1MCi0gKiBvcGNvZGUgdGVtcGxhdGVzIGluIGFtbF9vcF9pbmZvW10uCi0gKi8KLQotI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgotI2luY2x1ZGUgPGFjcGkvYWNwYXJzZXIuaD4KLSNpbmNsdWRlIDxhY3BpL2FjZGlzcGF0Lmg+Ci0jaW5jbHVkZSA8YWNwaS9hbWxjb2RlLmg+Ci0KLSNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX1BBUlNFUgotQUNQSV9NT0RVTEVfTkFNRSgicHNsb29wIikKLQotc3RhdGljIHUzMiBhY3BpX2dibF9kZXB0aCA9IDA7Ci0KLS8qIExvY2FsIHByb3RvdHlwZXMgKi8KLQotc3RhdGljIGFjcGlfc3RhdHVzIGFjcGlfcHNfZ2V0X2FtbF9vcGNvZGUoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSk7Ci0KLXN0YXRpYyBhY3BpX3N0YXR1cwotYWNwaV9wc19idWlsZF9uYW1lZF9vcChzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlLAotCQkgICAgICAgdTggKiBhbWxfb3Bfc3RhcnQsCi0JCSAgICAgICB1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqdW5uYW1lZF9vcCwKLQkJICAgICAgIHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICoqb3ApOwotCi1zdGF0aWMgYWNwaV9zdGF0dXMKLWFjcGlfcHNfY3JlYXRlX29wKHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUsCi0JCSAgdTggKiBhbWxfb3Bfc3RhcnQsIHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICoqbmV3X29wKTsKLQotc3RhdGljIGFjcGlfc3RhdHVzCi1hY3BpX3BzX2dldF9hcmd1bWVudHMoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSwKLQkJICAgICAgdTggKiBhbWxfb3Bfc3RhcnQsIHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpvcCk7Ci0KLXN0YXRpYyBhY3BpX3N0YXR1cwotYWNwaV9wc19jb21wbGV0ZV9vcChzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlLAotCQkgICAgdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKipvcCwgYWNwaV9zdGF0dXMgc3RhdHVzKTsKLQotc3RhdGljIGFjcGlfc3RhdHVzCi1hY3BpX3BzX2NvbXBsZXRlX2ZpbmFsX29wKHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUsCi0JCQkgIHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpvcCwgYWNwaV9zdGF0dXMgc3RhdHVzKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9wc19nZXRfYW1sX29wY29kZQotICoKLSAqIFBBUkFNRVRFUlM6ICB3YWxrX3N0YXRlICAgICAgICAgIC0gQ3VycmVudCBzdGF0ZQotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKLSAqCi0gKiBERVNDUklQVElPTjogRXh0cmFjdCB0aGUgbmV4dCBBTUwgb3Bjb2RlIGZyb20gdGhlIGlucHV0IHN0cmVhbS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgYWNwaV9zdGF0dXMgYWNwaV9wc19nZXRfYW1sX29wY29kZShzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKQotewotCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIocHNfZ2V0X2FtbF9vcGNvZGUsIHdhbGtfc3RhdGUpOwotCi0Jd2Fsa19zdGF0ZS0+YW1sX29mZnNldCA9Ci0JICAgICh1MzIpIEFDUElfUFRSX0RJRkYod2Fsa19zdGF0ZS0+cGFyc2VyX3N0YXRlLmFtbCwKLQkJCQl3YWxrX3N0YXRlLT5wYXJzZXJfc3RhdGUuYW1sX3N0YXJ0KTsKLQl3YWxrX3N0YXRlLT5vcGNvZGUgPSBhY3BpX3BzX3BlZWtfb3Bjb2RlKCYod2Fsa19zdGF0ZS0+cGFyc2VyX3N0YXRlKSk7Ci0KLQkvKgotCSAqIEZpcnN0IGN1dCB0byBkZXRlcm1pbmUgd2hhdCB3ZSBoYXZlIGZvdW5kOgotCSAqIDEpIEEgdmFsaWQgQU1MIG9wY29kZQotCSAqIDIpIEEgbmFtZSBzdHJpbmcKLQkgKiAzKSBBbiB1bmtub3duL2ludmFsaWQgb3Bjb2RlCi0JICovCi0Jd2Fsa19zdGF0ZS0+b3BfaW5mbyA9IGFjcGlfcHNfZ2V0X29wY29kZV9pbmZvKHdhbGtfc3RhdGUtPm9wY29kZSk7Ci0KLQlzd2l0Y2ggKHdhbGtfc3RhdGUtPm9wX2luZm8tPmNsYXNzKSB7Ci0JY2FzZSBBTUxfQ0xBU1NfQVNDSUk6Ci0JY2FzZSBBTUxfQ0xBU1NfUFJFRklYOgotCQkvKgotCQkgKiBTdGFydHMgd2l0aCBhIHZhbGlkIHByZWZpeCBvciBBU0NJSSBjaGFyLCB0aGlzIGlzIGEgbmFtZQotCQkgKiBzdHJpbmcuIENvbnZlcnQgdGhlIGJhcmUgbmFtZSBzdHJpbmcgdG8gYSBuYW1lcGF0aC4KLQkJICovCi0JCXdhbGtfc3RhdGUtPm9wY29kZSA9IEFNTF9JTlRfTkFNRVBBVEhfT1A7Ci0JCXdhbGtfc3RhdGUtPmFyZ190eXBlcyA9IEFSR1BfTkFNRVNUUklORzsKLQkJYnJlYWs7Ci0KLQljYXNlIEFNTF9DTEFTU19VTktOT1dOOgotCi0JCS8qIFRoZSBvcGNvZGUgaXMgdW5yZWNvZ25pemVkLiBKdXN0IHNraXAgdW5rbm93biBvcGNvZGVzICovCi0KLQkJQUNQSV9FUlJPUigoQUVfSU5GTywKLQkJCSAgICAiRm91bmQgdW5rbm93biBvcGNvZGUgJVggYXQgQU1MIGFkZHJlc3MgJXAgb2Zmc2V0ICVYLCBpZ25vcmluZyIsCi0JCQkgICAgd2Fsa19zdGF0ZS0+b3Bjb2RlLCB3YWxrX3N0YXRlLT5wYXJzZXJfc3RhdGUuYW1sLAotCQkJICAgIHdhbGtfc3RhdGUtPmFtbF9vZmZzZXQpKTsKLQotCQlBQ1BJX0RVTVBfQlVGRkVSKHdhbGtfc3RhdGUtPnBhcnNlcl9zdGF0ZS5hbWwsIDEyOCk7Ci0KLQkJLyogQXNzdW1lIG9uZS1ieXRlIGJhZCBvcGNvZGUgKi8KLQotCQl3YWxrX3N0YXRlLT5wYXJzZXJfc3RhdGUuYW1sKys7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9DVFJMX1BBUlNFX0NPTlRJTlVFKTsKLQotCWRlZmF1bHQ6Ci0KLQkJLyogRm91bmQgb3Bjb2RlIGluZm8sIHRoaXMgaXMgYSBub3JtYWwgb3Bjb2RlICovCi0KLQkJd2Fsa19zdGF0ZS0+cGFyc2VyX3N0YXRlLmFtbCArPQotCQkgICAgYWNwaV9wc19nZXRfb3Bjb2RlX3NpemUod2Fsa19zdGF0ZS0+b3Bjb2RlKTsKLQkJd2Fsa19zdGF0ZS0+YXJnX3R5cGVzID0gd2Fsa19zdGF0ZS0+b3BfaW5mby0+cGFyc2VfYXJnczsKLQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9wc19idWlsZF9uYW1lZF9vcAotICoKLSAqIFBBUkFNRVRFUlM6ICB3YWxrX3N0YXRlICAgICAgICAgIC0gQ3VycmVudCBzdGF0ZQotICogICAgICAgICAgICAgIGFtbF9vcF9zdGFydCAgICAgICAgLSBCZWdpbiBvZiBuYW1lZCBPcCBpbiBBTUwKLSAqICAgICAgICAgICAgICB1bm5hbWVkX29wICAgICAgICAgIC0gRWFybHkgT3AgKG5vdCBhIG5hbWVkIE9wKQotICogICAgICAgICAgICAgIE9wICAgICAgICAgICAgICAgICAgLSBSZXR1cm5lZCBPcAotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKLSAqCi0gKiBERVNDUklQVElPTjogUGFyc2UgYSBuYW1lZCBPcAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyBhY3BpX3N0YXR1cwotYWNwaV9wc19idWlsZF9uYW1lZF9vcChzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlLAotCQkgICAgICAgdTggKiBhbWxfb3Bfc3RhcnQsCi0JCSAgICAgICB1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqdW5uYW1lZF9vcCwKLQkJICAgICAgIHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICoqb3ApCi17Ci0JYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7Ci0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKmFyZyA9IE5VTEw7Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUihwc19idWlsZF9uYW1lZF9vcCwgd2Fsa19zdGF0ZSk7Ci0KLQl1bm5hbWVkX29wLT5jb21tb24udmFsdWUuYXJnID0gTlVMTDsKLQl1bm5hbWVkX29wLT5jb21tb24uYXJnX2xpc3RfbGVuZ3RoID0gMDsKLQl1bm5hbWVkX29wLT5jb21tb24uYW1sX29wY29kZSA9IHdhbGtfc3RhdGUtPm9wY29kZTsKLQotCS8qCi0JICogR2V0IGFuZCBhcHBlbmQgYXJndW1lbnRzIHVudGlsIHdlIGZpbmQgdGhlIG5vZGUgdGhhdCBjb250YWlucwotCSAqIHRoZSBuYW1lICh0aGUgdHlwZSBBUkdQX05BTUUpLgotCSAqLwotCXdoaWxlIChHRVRfQ1VSUkVOVF9BUkdfVFlQRSh3YWxrX3N0YXRlLT5hcmdfdHlwZXMpICYmCi0JICAgICAgIChHRVRfQ1VSUkVOVF9BUkdfVFlQRSh3YWxrX3N0YXRlLT5hcmdfdHlwZXMpICE9IEFSR1BfTkFNRSkpIHsKLQkJc3RhdHVzID0KLQkJICAgIGFjcGlfcHNfZ2V0X25leHRfYXJnKHdhbGtfc3RhdGUsCi0JCQkJCSAmKHdhbGtfc3RhdGUtPnBhcnNlcl9zdGF0ZSksCi0JCQkJCSBHRVRfQ1VSUkVOVF9BUkdfVFlQRSh3YWxrX3N0YXRlLT4KLQkJCQkJCQkgICAgICBhcmdfdHlwZXMpLCAmYXJnKTsKLQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLQkJfQotCi0JCWFjcGlfcHNfYXBwZW5kX2FyZyh1bm5hbWVkX29wLCBhcmcpOwotCQlJTkNSRU1FTlRfQVJHX0xJU1Qod2Fsa19zdGF0ZS0+YXJnX3R5cGVzKTsKLQl9Ci0KLQkvKgotCSAqIE1ha2Ugc3VyZSB0aGF0IHdlIGZvdW5kIGEgTkFNRSBhbmQgZGlkbid0IHJ1biBvdXQgb2YgYXJndW1lbnRzCi0JICovCi0JaWYgKCFHRVRfQ1VSUkVOVF9BUkdfVFlQRSh3YWxrX3N0YXRlLT5hcmdfdHlwZXMpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfTk9fT1BFUkFORCk7Ci0JfQotCi0JLyogV2Uga25vdyB0aGF0IHRoaXMgYXJnIGlzIGEgbmFtZSwgbW92ZSB0byBuZXh0IGFyZyAqLwotCi0JSU5DUkVNRU5UX0FSR19MSVNUKHdhbGtfc3RhdGUtPmFyZ190eXBlcyk7Ci0KLQkvKgotCSAqIEZpbmQgdGhlIG9iamVjdC4gVGhpcyB3aWxsIGVpdGhlciBpbnNlcnQgdGhlIG9iamVjdCBpbnRvCi0JICogdGhlIG5hbWVzcGFjZSBvciBzaW1wbHkgbG9vayBpdCB1cAotCSAqLwotCXdhbGtfc3RhdGUtPm9wID0gTlVMTDsKLQotCXN0YXR1cyA9IHdhbGtfc3RhdGUtPmRlc2NlbmRpbmdfY2FsbGJhY2sod2Fsa19zdGF0ZSwgb3ApOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlBQ1BJX0VYQ0VQVElPTigoQUVfSU5GTywgc3RhdHVzLCAiRHVyaW5nIG5hbWUgbG9va3VwL2NhdGFsb2ciKSk7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotCX0KLQotCWlmICghKm9wKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9DVFJMX1BBUlNFX0NPTlRJTlVFKTsKLQl9Ci0KLQlzdGF0dXMgPSBhY3BpX3BzX25leHRfcGFyc2Vfc3RhdGUod2Fsa19zdGF0ZSwgKm9wLCBzdGF0dXMpOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlpZiAoc3RhdHVzID09IEFFX0NUUkxfUEVORElORykgewotCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0NUUkxfUEFSU0VfUEVORElORyk7Ci0JCX0KLQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci0JfQotCi0JYWNwaV9wc19hcHBlbmRfYXJnKCpvcCwgdW5uYW1lZF9vcC0+Y29tbW9uLnZhbHVlLmFyZyk7Ci0JYWNwaV9nYmxfZGVwdGgrKzsKLQotCWlmICgoKm9wKS0+Y29tbW9uLmFtbF9vcGNvZGUgPT0gQU1MX1JFR0lPTl9PUCB8fAotCSAgICAoKm9wKS0+Y29tbW9uLmFtbF9vcGNvZGUgPT0gQU1MX0RBVEFfUkVHSU9OX09QKSB7Ci0JCS8qCi0JCSAqIERlZmVyIGZpbmFsIHBhcnNpbmcgb2YgYW4gb3BlcmF0aW9uX3JlZ2lvbiBib2R5LCBiZWNhdXNlIHdlIGRvbid0Ci0JCSAqIGhhdmUgZW5vdWdoIGluZm8gaW4gdGhlIGZpcnN0IHBhc3MgdG8gcGFyc2UgaXQgY29ycmVjdGx5IChpLmUuLAotCQkgKiB0aGVyZSBtYXkgYmUgbWV0aG9kIGNhbGxzIHdpdGhpbiB0aGUgdGVybV9hcmcgZWxlbWVudHMgb2YgdGhlIGJvZHkuKQotCQkgKgotCQkgKiBIb3dldmVyLCB3ZSBtdXN0IGNvbnRpbnVlIHBhcnNpbmcgYmVjYXVzZSB0aGUgb3ByZWdpb24gaXMgbm90IGEKLQkJICogc3RhbmRhbG9uZSBwYWNrYWdlIC0tIHdlIGRvbid0IGtub3cgd2hlcmUgdGhlIGVuZCBpcyBhdCB0aGlzIHBvaW50LgotCQkgKgotCQkgKiAoTGVuZ3RoIGlzIHVua25vd24gdW50aWwgcGFyc2Ugb2YgdGhlIGJvZHkgY29tcGxldGUpCi0JCSAqLwotCQkoKm9wKS0+bmFtZWQuZGF0YSA9IGFtbF9vcF9zdGFydDsKLQkJKCpvcCktPm5hbWVkLmxlbmd0aCA9IDA7Ci0JfQotCi0JcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9wc19jcmVhdGVfb3AKLSAqCi0gKiBQQVJBTUVURVJTOiAgd2Fsa19zdGF0ZSAgICAgICAgICAtIEN1cnJlbnQgc3RhdGUKLSAqICAgICAgICAgICAgICBhbWxfb3Bfc3RhcnQgICAgICAgIC0gT3Agc3RhcnQgaW4gQU1MCi0gKiAgICAgICAgICAgICAgbmV3X29wICAgICAgICAgICAgICAtIFJldHVybmVkIE9wCi0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cwotICoKLSAqIERFU0NSSVBUSU9OOiBHZXQgT3AgZnJvbSBBTUwKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgYWNwaV9zdGF0dXMKLWFjcGlfcHNfY3JlYXRlX29wKHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUsCi0JCSAgdTggKiBhbWxfb3Bfc3RhcnQsIHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICoqbmV3X29wKQotewotCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOwotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpvcDsKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqbmFtZWRfb3AgPSBOVUxMOwotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpwYXJlbnRfc2NvcGU7Ci0JdTggYXJndW1lbnRfY291bnQ7Ci0JY29uc3Qgc3RydWN0IGFjcGlfb3Bjb2RlX2luZm8gKm9wX2luZm87Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUihwc19jcmVhdGVfb3AsIHdhbGtfc3RhdGUpOwotCi0Jc3RhdHVzID0gYWNwaV9wc19nZXRfYW1sX29wY29kZSh3YWxrX3N0YXRlKTsKLQlpZiAoc3RhdHVzID09IEFFX0NUUkxfUEFSU0VfQ09OVElOVUUpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0NUUkxfUEFSU0VfQ09OVElOVUUpOwotCX0KLQotCS8qIENyZWF0ZSBPcCBzdHJ1Y3R1cmUgYW5kIGFwcGVuZCB0byBwYXJlbnQncyBhcmd1bWVudCBsaXN0ICovCi0KLQl3YWxrX3N0YXRlLT5vcF9pbmZvID0gYWNwaV9wc19nZXRfb3Bjb2RlX2luZm8od2Fsa19zdGF0ZS0+b3Bjb2RlKTsKLQlvcCA9IGFjcGlfcHNfYWxsb2Nfb3Aod2Fsa19zdGF0ZS0+b3Bjb2RlKTsKLQlpZiAoIW9wKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT19NRU1PUlkpOwotCX0KLQotCWlmICh3YWxrX3N0YXRlLT5vcF9pbmZvLT5mbGFncyAmIEFNTF9OQU1FRCkgewotCQlzdGF0dXMgPQotCQkgICAgYWNwaV9wc19idWlsZF9uYW1lZF9vcCh3YWxrX3N0YXRlLCBhbWxfb3Bfc3RhcnQsIG9wLAotCQkJCQkgICAmbmFtZWRfb3ApOwotCQlhY3BpX3BzX2ZyZWVfb3Aob3ApOwotCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotCQl9Ci0KLQkJKm5ld19vcCA9IG5hbWVkX29wOwotCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwotCX0KLQotCS8qIE5vdCBhIG5hbWVkIG9wY29kZSwganVzdCBhbGxvY2F0ZSBPcCBhbmQgYXBwZW5kIHRvIHBhcmVudCAqLwotCi0JaWYgKHdhbGtfc3RhdGUtPm9wX2luZm8tPmZsYWdzICYgQU1MX0NSRUFURSkgewotCQkvKgotCQkgKiBCYWNrdXAgdG8gYmVnaW5uaW5nIG9mIGNyZWF0ZV94WFhmaWVsZCBkZWNsYXJhdGlvbgotCQkgKiBib2R5X2xlbmd0aCBpcyB1bmtub3duIHVudGlsIHdlIHBhcnNlIHRoZSBib2R5Ci0JCSAqLwotCQlvcC0+bmFtZWQuZGF0YSA9IGFtbF9vcF9zdGFydDsKLQkJb3AtPm5hbWVkLmxlbmd0aCA9IDA7Ci0JfQotCi0JaWYgKHdhbGtfc3RhdGUtPm9wY29kZSA9PSBBTUxfQkFOS19GSUVMRF9PUCkgewotCQkvKgotCQkgKiBCYWNrdXAgdG8gYmVnaW5uaW5nIG9mIGJhbmtfZmllbGQgZGVjbGFyYXRpb24KLQkJICogYm9keV9sZW5ndGggaXMgdW5rbm93biB1bnRpbCB3ZSBwYXJzZSB0aGUgYm9keQotCQkgKi8KLQkJb3AtPm5hbWVkLmRhdGEgPSBhbWxfb3Bfc3RhcnQ7Ci0JCW9wLT5uYW1lZC5sZW5ndGggPSAwOwotCX0KLQotCXBhcmVudF9zY29wZSA9IGFjcGlfcHNfZ2V0X3BhcmVudF9zY29wZSgmKHdhbGtfc3RhdGUtPnBhcnNlcl9zdGF0ZSkpOwotCWFjcGlfcHNfYXBwZW5kX2FyZyhwYXJlbnRfc2NvcGUsIG9wKTsKLQotCWlmIChwYXJlbnRfc2NvcGUpIHsKLQkJb3BfaW5mbyA9Ci0JCSAgICBhY3BpX3BzX2dldF9vcGNvZGVfaW5mbyhwYXJlbnRfc2NvcGUtPmNvbW1vbi5hbWxfb3Bjb2RlKTsKLQkJaWYgKG9wX2luZm8tPmZsYWdzICYgQU1MX0hBU19UQVJHRVQpIHsKLQkJCWFyZ3VtZW50X2NvdW50ID0KLQkJCSAgICBhY3BpX3BzX2dldF9hcmd1bWVudF9jb3VudChvcF9pbmZvLT50eXBlKTsKLQkJCWlmIChwYXJlbnRfc2NvcGUtPmNvbW1vbi5hcmdfbGlzdF9sZW5ndGggPgotCQkJICAgIGFyZ3VtZW50X2NvdW50KSB7Ci0JCQkJb3AtPmNvbW1vbi5mbGFncyB8PSBBQ1BJX1BBUlNFT1BfVEFSR0VUOwotCQkJfQotCQl9IGVsc2UgaWYgKHBhcmVudF9zY29wZS0+Y29tbW9uLmFtbF9vcGNvZGUgPT0gQU1MX0lOQ1JFTUVOVF9PUCkgewotCQkJb3AtPmNvbW1vbi5mbGFncyB8PSBBQ1BJX1BBUlNFT1BfVEFSR0VUOwotCQl9Ci0JfQotCi0JaWYgKHdhbGtfc3RhdGUtPmRlc2NlbmRpbmdfY2FsbGJhY2sgIT0gTlVMTCkgewotCQkvKgotCQkgKiBGaW5kIHRoZSBvYmplY3QuIFRoaXMgd2lsbCBlaXRoZXIgaW5zZXJ0IHRoZSBvYmplY3QgaW50bwotCQkgKiB0aGUgbmFtZXNwYWNlIG9yIHNpbXBseSBsb29rIGl0IHVwCi0JCSAqLwotCQl3YWxrX3N0YXRlLT5vcCA9ICpuZXdfb3AgPSBvcDsKLQotCQlzdGF0dXMgPSB3YWxrX3N0YXRlLT5kZXNjZW5kaW5nX2NhbGxiYWNrKHdhbGtfc3RhdGUsICZvcCk7Ci0JCXN0YXR1cyA9IGFjcGlfcHNfbmV4dF9wYXJzZV9zdGF0ZSh3YWxrX3N0YXRlLCBvcCwgc3RhdHVzKTsKLQkJaWYgKHN0YXR1cyA9PSBBRV9DVFJMX1BFTkRJTkcpIHsKLQkJCXN0YXR1cyA9IEFFX0NUUkxfUEFSU0VfUEVORElORzsKLQkJfQotCX0KLQotCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX3BzX2dldF9hcmd1bWVudHMKLSAqCi0gKiBQQVJBTUVURVJTOiAgd2Fsa19zdGF0ZSAgICAgICAgICAtIEN1cnJlbnQgc3RhdGUKLSAqICAgICAgICAgICAgICBhbWxfb3Bfc3RhcnQgICAgICAgIC0gT3Agc3RhcnQgaW4gQU1MCi0gKiAgICAgICAgICAgICAgT3AgICAgICAgICAgICAgICAgICAtIEN1cnJlbnQgT3AKLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IEdldCBhcmd1bWVudHMgZm9yIHBhc3NlZCBPcC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgYWNwaV9zdGF0dXMKLWFjcGlfcHNfZ2V0X2FyZ3VtZW50cyhzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlLAotCQkgICAgICB1OCAqIGFtbF9vcF9zdGFydCwgdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKm9wKQotewotCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOwotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICphcmcgPSBOVUxMOwotCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIocHNfZ2V0X2FyZ3VtZW50cywgd2Fsa19zdGF0ZSk7Ci0KLQlzd2l0Y2ggKG9wLT5jb21tb24uYW1sX29wY29kZSkgewotCWNhc2UgQU1MX0JZVEVfT1A6CS8qIEFNTF9CWVRFREFUQV9BUkcgKi8KLQljYXNlIEFNTF9XT1JEX09QOgkvKiBBTUxfV09SRERBVEFfQVJHICovCi0JY2FzZSBBTUxfRFdPUkRfT1A6CS8qIEFNTF9EV09SREFUQV9BUkcgKi8KLQljYXNlIEFNTF9RV09SRF9PUDoJLyogQU1MX1FXT1JEQVRBX0FSRyAqLwotCWNhc2UgQU1MX1NUUklOR19PUDoJLyogQU1MX0FTQ0lJQ0hBUkxJU1RfQVJHICovCi0KLQkJLyogRmlsbCBpbiBjb25zdGFudCBvciBzdHJpbmcgYXJndW1lbnQgZGlyZWN0bHkgKi8KLQotCQlhY3BpX3BzX2dldF9uZXh0X3NpbXBsZV9hcmcoJih3YWxrX3N0YXRlLT5wYXJzZXJfc3RhdGUpLAotCQkJCQkgICAgR0VUX0NVUlJFTlRfQVJHX1RZUEUod2Fsa19zdGF0ZS0+Ci0JCQkJCQkJCSBhcmdfdHlwZXMpLAotCQkJCQkgICAgb3ApOwotCQlicmVhazsKLQotCWNhc2UgQU1MX0lOVF9OQU1FUEFUSF9PUDoJLyogQU1MX05BTUVTVFJJTkdfQVJHICovCi0KLQkJc3RhdHVzID0KLQkJICAgIGFjcGlfcHNfZ2V0X25leHRfbmFtZXBhdGgod2Fsa19zdGF0ZSwKLQkJCQkJICAgICAgJih3YWxrX3N0YXRlLT5wYXJzZXJfc3RhdGUpLCBvcCwKLQkJCQkJICAgICAgMSk7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci0JCX0KLQotCQl3YWxrX3N0YXRlLT5hcmdfdHlwZXMgPSAwOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCS8qCi0JCSAqIE9wIGlzIG5vdCBhIGNvbnN0YW50IG9yIHN0cmluZywgYXBwZW5kIGVhY2ggYXJndW1lbnQgdG8gdGhlIE9wCi0JCSAqLwotCQl3aGlsZSAoR0VUX0NVUlJFTlRfQVJHX1RZUEUod2Fsa19zdGF0ZS0+YXJnX3R5cGVzKQotCQkgICAgICAgJiYgIXdhbGtfc3RhdGUtPmFyZ19jb3VudCkgewotCQkJd2Fsa19zdGF0ZS0+YW1sX29mZnNldCA9Ci0JCQkgICAgKHUzMikgQUNQSV9QVFJfRElGRih3YWxrX3N0YXRlLT5wYXJzZXJfc3RhdGUuYW1sLAotCQkJCQkJd2Fsa19zdGF0ZS0+cGFyc2VyX3N0YXRlLgotCQkJCQkJYW1sX3N0YXJ0KTsKLQotCQkJc3RhdHVzID0KLQkJCSAgICBhY3BpX3BzX2dldF9uZXh0X2FyZyh3YWxrX3N0YXRlLAotCQkJCQkJICYod2Fsa19zdGF0ZS0+cGFyc2VyX3N0YXRlKSwKLQkJCQkJCSBHRVRfQ1VSUkVOVF9BUkdfVFlQRQotCQkJCQkJICh3YWxrX3N0YXRlLT5hcmdfdHlwZXMpLCAmYXJnKTsKLQkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotCQkJfQotCi0JCQlpZiAoYXJnKSB7Ci0JCQkJYXJnLT5jb21tb24uYW1sX29mZnNldCA9IHdhbGtfc3RhdGUtPmFtbF9vZmZzZXQ7Ci0JCQkJYWNwaV9wc19hcHBlbmRfYXJnKG9wLCBhcmcpOwotCQkJfQotCi0JCQlJTkNSRU1FTlRfQVJHX0xJU1Qod2Fsa19zdGF0ZS0+YXJnX3R5cGVzKTsKLQkJfQotCi0JCS8qIFNwZWNpYWwgcHJvY2Vzc2luZyBmb3IgY2VydGFpbiBvcGNvZGVzICovCi0KLQkJLyogVEJEIChyZW1vdmUpOiBUZW1wb3JhcnkgbWVjaGFuaXNtIHRvIGRpc2FibGUgdGhpcyBjb2RlIGlmIG5lZWRlZCAqLwotCi0jaWZkZWYgQUNQSV9FTkFCTEVfTU9EVUxFX0xFVkVMX0NPREUKLQotCQlpZiAoKHdhbGtfc3RhdGUtPnBhc3NfbnVtYmVyIDw9IEFDUElfSU1PREVfTE9BRF9QQVNTMSkgJiYKLQkJICAgICgod2Fsa19zdGF0ZS0+cGFyc2VfZmxhZ3MgJiBBQ1BJX1BBUlNFX0RJU0FTU0VNQkxFKSA9PSAwKSkgewotCQkJLyoKLQkJCSAqIFdlIHdhbnQgdG8gc2tpcCBJZi9FbHNlL1doaWxlIGNvbnN0cnVjdHMgZHVyaW5nIFBhc3MxIGJlY2F1c2Ugd2UKLQkJCSAqIHdhbnQgdG8gYWN0dWFsbHkgY29uZGl0aW9uYWxseSBleGVjdXRlIHRoZSBjb2RlIGR1cmluZyBQYXNzMi4KLQkJCSAqCi0JCQkgKiBFeGNlcHQgZm9yIGRpc2Fzc2VtYmx5LCB3aGVyZSB3ZSBhbHdheXMgd2FudCB0byB3YWxrIHRoZQotCQkJICogSWYvRWxzZS9XaGlsZSBwYWNrYWdlcwotCQkJICovCi0JCQlzd2l0Y2ggKG9wLT5jb21tb24uYW1sX29wY29kZSkgewotCQkJY2FzZSBBTUxfSUZfT1A6Ci0JCQljYXNlIEFNTF9FTFNFX09QOgotCQkJY2FzZSBBTUxfV0hJTEVfT1A6Ci0KLQkJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX1BBUlNFLAotCQkJCQkJICAiUGFzczE6IFNraXBwaW5nIGFuIElmL0Vsc2UvV2hpbGUgYm9keVxuIikpOwotCi0JCQkJLyogU2tpcCBib2R5IG9mIGlmL2Vsc2Uvd2hpbGUgaW4gcGFzcyAxICovCi0KLQkJCQl3YWxrX3N0YXRlLT5wYXJzZXJfc3RhdGUuYW1sID0KLQkJCQkgICAgd2Fsa19zdGF0ZS0+cGFyc2VyX3N0YXRlLnBrZ19lbmQ7Ci0JCQkJd2Fsa19zdGF0ZS0+YXJnX2NvdW50ID0gMDsKLQkJCQlicmVhazsKLQotCQkJZGVmYXVsdDoKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotI2VuZGlmCi0KLQkJc3dpdGNoIChvcC0+Y29tbW9uLmFtbF9vcGNvZGUpIHsKLQkJY2FzZSBBTUxfTUVUSE9EX09QOgotCQkJLyoKLQkJCSAqIFNraXAgcGFyc2luZyBvZiBjb250cm9sIG1ldGhvZCBiZWNhdXNlIHdlIGRvbid0IGhhdmUgZW5vdWdoCi0JCQkgKiBpbmZvIGluIHRoZSBmaXJzdCBwYXNzIHRvIHBhcnNlIGl0IGNvcnJlY3RseS4KLQkJCSAqCi0JCQkgKiBTYXZlIHRoZSBsZW5ndGggYW5kIGFkZHJlc3Mgb2YgdGhlIGJvZHkKLQkJCSAqLwotCQkJb3AtPm5hbWVkLmRhdGEgPSB3YWxrX3N0YXRlLT5wYXJzZXJfc3RhdGUuYW1sOwotCQkJb3AtPm5hbWVkLmxlbmd0aCA9ICh1MzIpCi0JCQkgICAgKHdhbGtfc3RhdGUtPnBhcnNlcl9zdGF0ZS5wa2dfZW5kIC0KLQkJCSAgICAgd2Fsa19zdGF0ZS0+cGFyc2VyX3N0YXRlLmFtbCk7Ci0KLQkJCS8qIFNraXAgYm9keSBvZiBtZXRob2QgKi8KLQotCQkJd2Fsa19zdGF0ZS0+cGFyc2VyX3N0YXRlLmFtbCA9Ci0JCQkgICAgd2Fsa19zdGF0ZS0+cGFyc2VyX3N0YXRlLnBrZ19lbmQ7Ci0JCQl3YWxrX3N0YXRlLT5hcmdfY291bnQgPSAwOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBBTUxfQlVGRkVSX09QOgotCQljYXNlIEFNTF9QQUNLQUdFX09QOgotCQljYXNlIEFNTF9WQVJfUEFDS0FHRV9PUDoKLQotCQkJaWYgKChvcC0+Y29tbW9uLnBhcmVudCkgJiYKLQkJCSAgICAob3AtPmNvbW1vbi5wYXJlbnQtPmNvbW1vbi5hbWxfb3Bjb2RlID09Ci0JCQkgICAgIEFNTF9OQU1FX09QKQotCQkJICAgICYmICh3YWxrX3N0YXRlLT5wYXNzX251bWJlciA8PQotCQkJCUFDUElfSU1PREVfTE9BRF9QQVNTMikpIHsKLQkJCQkvKgotCQkJCSAqIFNraXAgcGFyc2luZyBvZiBCdWZmZXJzIGFuZCBQYWNrYWdlcyBiZWNhdXNlIHdlIGRvbid0IGhhdmUKLQkJCQkgKiBlbm91Z2ggaW5mbyBpbiB0aGUgZmlyc3QgcGFzcyB0byBwYXJzZSB0aGVtIGNvcnJlY3RseS4KLQkJCQkgKi8KLQkJCQlvcC0+bmFtZWQuZGF0YSA9IGFtbF9vcF9zdGFydDsKLQkJCQlvcC0+bmFtZWQubGVuZ3RoID0gKHUzMikKLQkJCQkgICAgKHdhbGtfc3RhdGUtPnBhcnNlcl9zdGF0ZS5wa2dfZW5kIC0KLQkJCQkgICAgIGFtbF9vcF9zdGFydCk7Ci0KLQkJCQkvKiBTa2lwIGJvZHkgKi8KLQotCQkJCXdhbGtfc3RhdGUtPnBhcnNlcl9zdGF0ZS5hbWwgPQotCQkJCSAgICB3YWxrX3N0YXRlLT5wYXJzZXJfc3RhdGUucGtnX2VuZDsKLQkJCQl3YWxrX3N0YXRlLT5hcmdfY291bnQgPSAwOwotCQkJfQotCQkJYnJlYWs7Ci0KLQkJY2FzZSBBTUxfV0hJTEVfT1A6Ci0KLQkJCWlmICh3YWxrX3N0YXRlLT5jb250cm9sX3N0YXRlKSB7Ci0JCQkJd2Fsa19zdGF0ZS0+Y29udHJvbF9zdGF0ZS0+Y29udHJvbC5wYWNrYWdlX2VuZCA9Ci0JCQkJICAgIHdhbGtfc3RhdGUtPnBhcnNlcl9zdGF0ZS5wa2dfZW5kOwotCQkJfQotCQkJYnJlYWs7Ci0KLQkJZGVmYXVsdDoKLQotCQkJLyogTm8gYWN0aW9uIGZvciBhbGwgb3RoZXIgb3Bjb2RlcyAqLwotCQkJYnJlYWs7Ci0JCX0KLQotCQlicmVhazsKLQl9Ci0KLQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX3BzX2NvbXBsZXRlX29wCi0gKgotICogUEFSQU1FVEVSUzogIHdhbGtfc3RhdGUgICAgICAgICAgLSBDdXJyZW50IHN0YXRlCi0gKiAgICAgICAgICAgICAgT3AgICAgICAgICAgICAgICAgICAtIFJldHVybmVkIE9wCi0gKiAgICAgICAgICAgICAgU3RhdHVzICAgICAgICAgICAgICAtIFBhcnNlIHN0YXR1cyBiZWZvcmUgY29tcGxldGUgT3AKLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IENvbXBsZXRlIE9wCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIGFjcGlfc3RhdHVzCi1hY3BpX3BzX2NvbXBsZXRlX29wKHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUsCi0JCSAgICB1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqKm9wLCBhY3BpX3N0YXR1cyBzdGF0dXMpCi17Ci0JYWNwaV9zdGF0dXMgc3RhdHVzMjsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKHBzX2NvbXBsZXRlX29wLCB3YWxrX3N0YXRlKTsKLQotCS8qCi0JICogRmluaXNoZWQgb25lIGFyZ3VtZW50IG9mIHRoZSBjb250YWluaW5nIHNjb3BlCi0JICovCi0Jd2Fsa19zdGF0ZS0+cGFyc2VyX3N0YXRlLnNjb3BlLT5wYXJzZV9zY29wZS5hcmdfY291bnQtLTsKLQotCS8qIENsb3NlIHRoaXMgT3AgKHdpbGwgcmVzdWx0IGluIHBhcnNlIHN1YnRyZWUgZGVsZXRpb24pICovCi0KLQlzdGF0dXMyID0gYWNwaV9wc19jb21wbGV0ZV90aGlzX29wKHdhbGtfc3RhdGUsICpvcCk7Ci0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMyKSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzMik7Ci0JfQotCi0JKm9wID0gTlVMTDsKLQotCXN3aXRjaCAoc3RhdHVzKSB7Ci0JY2FzZSBBRV9PSzoKLQkJYnJlYWs7Ci0KLQljYXNlIEFFX0NUUkxfVFJBTlNGRVI6Ci0KLQkJLyogV2UgYXJlIGFib3V0IHRvIHRyYW5zZmVyIHRvIGEgY2FsbGVkIG1ldGhvZCAqLwotCi0JCXdhbGtfc3RhdGUtPnByZXZfb3AgPSBOVUxMOwotCQl3YWxrX3N0YXRlLT5wcmV2X2FyZ190eXBlcyA9IHdhbGtfc3RhdGUtPmFyZ190eXBlczsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci0KLQljYXNlIEFFX0NUUkxfRU5EOgotCi0JCWFjcGlfcHNfcG9wX3Njb3BlKCYod2Fsa19zdGF0ZS0+cGFyc2VyX3N0YXRlKSwgb3AsCi0JCQkJICAmd2Fsa19zdGF0ZS0+YXJnX3R5cGVzLAotCQkJCSAgJndhbGtfc3RhdGUtPmFyZ19jb3VudCk7Ci0KLQkJaWYgKCpvcCkgewotCQkJd2Fsa19zdGF0ZS0+b3AgPSAqb3A7Ci0JCQl3YWxrX3N0YXRlLT5vcF9pbmZvID0KLQkJCSAgICBhY3BpX3BzX2dldF9vcGNvZGVfaW5mbygoKm9wKS0+Y29tbW9uLmFtbF9vcGNvZGUpOwotCQkJd2Fsa19zdGF0ZS0+b3Bjb2RlID0gKCpvcCktPmNvbW1vbi5hbWxfb3Bjb2RlOwotCi0JCQlzdGF0dXMgPSB3YWxrX3N0YXRlLT5hc2NlbmRpbmdfY2FsbGJhY2sod2Fsa19zdGF0ZSk7Ci0JCQlzdGF0dXMgPQotCQkJICAgIGFjcGlfcHNfbmV4dF9wYXJzZV9zdGF0ZSh3YWxrX3N0YXRlLCAqb3AsIHN0YXR1cyk7Ci0KLQkJCXN0YXR1czIgPSBhY3BpX3BzX2NvbXBsZXRlX3RoaXNfb3Aod2Fsa19zdGF0ZSwgKm9wKTsKLQkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzMikpIHsKLQkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzMik7Ci0JCQl9Ci0JCX0KLQotCQlzdGF0dXMgPSBBRV9PSzsKLQkJYnJlYWs7Ci0KLQljYXNlIEFFX0NUUkxfQlJFQUs6Ci0JY2FzZSBBRV9DVFJMX0NPTlRJTlVFOgotCi0JCS8qIFBvcCBvZmYgc2NvcGVzIHVudGlsIHdlIGZpbmQgdGhlIFdoaWxlICovCi0KLQkJd2hpbGUgKCEoKm9wKSB8fCAoKCpvcCktPmNvbW1vbi5hbWxfb3Bjb2RlICE9IEFNTF9XSElMRV9PUCkpIHsKLQkJCWFjcGlfcHNfcG9wX3Njb3BlKCYod2Fsa19zdGF0ZS0+cGFyc2VyX3N0YXRlKSwgb3AsCi0JCQkJCSAgJndhbGtfc3RhdGUtPmFyZ190eXBlcywKLQkJCQkJICAmd2Fsa19zdGF0ZS0+YXJnX2NvdW50KTsKLQkJfQotCi0JCS8qIENsb3NlIHRoaXMgaXRlcmF0aW9uIG9mIHRoZSBXaGlsZSBsb29wICovCi0KLQkJd2Fsa19zdGF0ZS0+b3AgPSAqb3A7Ci0JCXdhbGtfc3RhdGUtPm9wX2luZm8gPQotCQkgICAgYWNwaV9wc19nZXRfb3Bjb2RlX2luZm8oKCpvcCktPmNvbW1vbi5hbWxfb3Bjb2RlKTsKLQkJd2Fsa19zdGF0ZS0+b3Bjb2RlID0gKCpvcCktPmNvbW1vbi5hbWxfb3Bjb2RlOwotCi0JCXN0YXR1cyA9IHdhbGtfc3RhdGUtPmFzY2VuZGluZ19jYWxsYmFjayh3YWxrX3N0YXRlKTsKLQkJc3RhdHVzID0gYWNwaV9wc19uZXh0X3BhcnNlX3N0YXRlKHdhbGtfc3RhdGUsICpvcCwgc3RhdHVzKTsKLQotCQlzdGF0dXMyID0gYWNwaV9wc19jb21wbGV0ZV90aGlzX29wKHdhbGtfc3RhdGUsICpvcCk7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzMikpIHsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMyKTsKLQkJfQotCi0JCXN0YXR1cyA9IEFFX09LOwotCQlicmVhazsKLQotCWNhc2UgQUVfQ1RSTF9URVJNSU5BVEU6Ci0KLQkJLyogQ2xlYW4gdXAgKi8KLQkJZG8gewotCQkJaWYgKCpvcCkgewotCQkJCXN0YXR1czIgPQotCQkJCSAgICBhY3BpX3BzX2NvbXBsZXRlX3RoaXNfb3Aod2Fsa19zdGF0ZSwgKm9wKTsKLQkJCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1czIpKSB7Ci0JCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMyKTsKLQkJCQl9Ci0KLQkJCQlhY3BpX3V0X2RlbGV0ZV9nZW5lcmljX3N0YXRlCi0JCQkJICAgIChhY3BpX3V0X3BvcF9nZW5lcmljX3N0YXRlCi0JCQkJICAgICAoJndhbGtfc3RhdGUtPmNvbnRyb2xfc3RhdGUpKTsKLQkJCX0KLQotCQkJYWNwaV9wc19wb3Bfc2NvcGUoJih3YWxrX3N0YXRlLT5wYXJzZXJfc3RhdGUpLCBvcCwKLQkJCQkJICAmd2Fsa19zdGF0ZS0+YXJnX3R5cGVzLAotCQkJCQkgICZ3YWxrX3N0YXRlLT5hcmdfY291bnQpOwotCi0JCX0gd2hpbGUgKCpvcCk7Ci0KLQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKLQotCWRlZmF1bHQ6CQkvKiBBbGwgb3RoZXIgbm9uLUFFX09LIHN0YXR1cyAqLwotCi0JCWRvIHsKLQkJCWlmICgqb3ApIHsKLQkJCQlzdGF0dXMyID0KLQkJCQkgICAgYWNwaV9wc19jb21wbGV0ZV90aGlzX29wKHdhbGtfc3RhdGUsICpvcCk7Ci0JCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMyKSkgewotCQkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzMik7Ci0JCQkJfQotCQkJfQotCi0JCQlhY3BpX3BzX3BvcF9zY29wZSgmKHdhbGtfc3RhdGUtPnBhcnNlcl9zdGF0ZSksIG9wLAotCQkJCQkgICZ3YWxrX3N0YXRlLT5hcmdfdHlwZXMsCi0JCQkJCSAgJndhbGtfc3RhdGUtPmFyZ19jb3VudCk7Ci0KLQkJfSB3aGlsZSAoKm9wKTsKLQotI2lmIDAKLQkJLyoKLQkJICogVEJEOiBDbGVhbnVwIHBhcnNlIG9wcyBvbiBlcnJvcgotCQkgKi8KLQkJaWYgKCpvcCA9PSBOVUxMKSB7Ci0JCQlhY3BpX3BzX3BvcF9zY29wZShwYXJzZXJfc3RhdGUsIG9wLAotCQkJCQkgICZ3YWxrX3N0YXRlLT5hcmdfdHlwZXMsCi0JCQkJCSAgJndhbGtfc3RhdGUtPmFyZ19jb3VudCk7Ci0JCX0KLSNlbmRpZgotCQl3YWxrX3N0YXRlLT5wcmV2X29wID0gTlVMTDsKLQkJd2Fsa19zdGF0ZS0+cHJldl9hcmdfdHlwZXMgPSB3YWxrX3N0YXRlLT5hcmdfdHlwZXM7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotCX0KLQotCS8qIFRoaXMgc2NvcGUgY29tcGxldGU/ICovCi0KLQlpZiAoYWNwaV9wc19oYXNfY29tcGxldGVkX3Njb3BlKCYod2Fsa19zdGF0ZS0+cGFyc2VyX3N0YXRlKSkpIHsKLQkJYWNwaV9wc19wb3Bfc2NvcGUoJih3YWxrX3N0YXRlLT5wYXJzZXJfc3RhdGUpLCBvcCwKLQkJCQkgICZ3YWxrX3N0YXRlLT5hcmdfdHlwZXMsCi0JCQkJICAmd2Fsa19zdGF0ZS0+YXJnX2NvdW50KTsKLQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9QQVJTRSwgIlBvcHBlZCBzY29wZSwgT3A9JXBcbiIsICpvcCkpOwotCX0gZWxzZSB7Ci0JCSpvcCA9IE5VTEw7Ci0JfQotCi0JQUNQSV9QUkVFTVBUSU9OX1BPSU5UKCk7Ci0KLQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX3BzX2NvbXBsZXRlX2ZpbmFsX29wCi0gKgotICogUEFSQU1FVEVSUzogIHdhbGtfc3RhdGUgICAgICAgICAgLSBDdXJyZW50IHN0YXRlCi0gKiAgICAgICAgICAgICAgT3AgICAgICAgICAgICAgICAgICAtIEN1cnJlbnQgT3AKLSAqICAgICAgICAgICAgICBTdGF0dXMgICAgICAgICAgICAgIC0gQ3VycmVudCBwYXJzZSBzdGF0dXMgYmVmb3JlIGNvbXBsZXRlIGxhc3QKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3AKLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IENvbXBsZXRlIGxhc3QgT3AuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIGFjcGlfc3RhdHVzCi1hY3BpX3BzX2NvbXBsZXRlX2ZpbmFsX29wKHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUsCi0JCQkgIHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpvcCwgYWNwaV9zdGF0dXMgc3RhdHVzKQotewotCWFjcGlfc3RhdHVzIHN0YXR1czI7Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUihwc19jb21wbGV0ZV9maW5hbF9vcCwgd2Fsa19zdGF0ZSk7Ci0KLQkvKgotCSAqIENvbXBsZXRlIHRoZSBsYXN0IE9wIChpZiBub3QgY29tcGxldGVkKSwgYW5kIGNsZWFyIHRoZSBzY29wZSBzdGFjay4KLQkgKiBJdCBpcyBlYXNpbHkgcG9zc2libGUgdG8gZW5kIGFuIEFNTCAicGFja2FnZSIgd2l0aCBhbiB1bmJvdW5kZWQgbnVtYmVyCi0JICogb2Ygb3BlbiBzY29wZXMgKHN1Y2ggYXMgd2hlbiBzZXZlcmFsIEFTTCBibG9ja3MgYXJlIGNsb3NlZCB3aXRoCi0JICogc2VxdWVudGlhbCBjbG9zaW5nIGJyYWNlcykuIFdlIHdhbnQgdG8gdGVybWluYXRlIGVhY2ggb25lIGNsZWFubHkuCi0JICovCi0JQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9QQVJTRSwgIkFNTCBwYWNrYWdlIGNvbXBsZXRlIGF0IE9wICVwXG4iLAotCQkJICBvcCkpOwotCWRvIHsKLQkJaWYgKG9wKSB7Ci0JCQlpZiAod2Fsa19zdGF0ZS0+YXNjZW5kaW5nX2NhbGxiYWNrICE9IE5VTEwpIHsKLQkJCQl3YWxrX3N0YXRlLT5vcCA9IG9wOwotCQkJCXdhbGtfc3RhdGUtPm9wX2luZm8gPQotCQkJCSAgICBhY3BpX3BzX2dldF9vcGNvZGVfaW5mbyhvcC0+Y29tbW9uLgotCQkJCQkJCSAgICBhbWxfb3Bjb2RlKTsKLQkJCQl3YWxrX3N0YXRlLT5vcGNvZGUgPSBvcC0+Y29tbW9uLmFtbF9vcGNvZGU7Ci0KLQkJCQlzdGF0dXMgPQotCQkJCSAgICB3YWxrX3N0YXRlLT5hc2NlbmRpbmdfY2FsbGJhY2sod2Fsa19zdGF0ZSk7Ci0JCQkJc3RhdHVzID0KLQkJCQkgICAgYWNwaV9wc19uZXh0X3BhcnNlX3N0YXRlKHdhbGtfc3RhdGUsIG9wLAotCQkJCQkJCSAgICAgc3RhdHVzKTsKLQkJCQlpZiAoc3RhdHVzID09IEFFX0NUUkxfUEVORElORykgewotCQkJCQlzdGF0dXMgPQotCQkJCQkgICAgYWNwaV9wc19jb21wbGV0ZV9vcCh3YWxrX3N0YXRlLCAmb3AsCi0JCQkJCQkJCUFFX09LKTsKLQkJCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCQkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCWlmIChzdGF0dXMgPT0gQUVfQ1RSTF9URVJNSU5BVEUpIHsKLQkJCQkJc3RhdHVzID0gQUVfT0s7Ci0KLQkJCQkJLyogQ2xlYW4gdXAgKi8KLQkJCQkJZG8gewotCQkJCQkJaWYgKG9wKSB7Ci0JCQkJCQkJc3RhdHVzMiA9Ci0JCQkJCQkJICAgIGFjcGlfcHNfY29tcGxldGVfdGhpc19vcAotCQkJCQkJCSAgICAod2Fsa19zdGF0ZSwgb3ApOwotCQkJCQkJCWlmIChBQ1BJX0ZBSUxVUkUKLQkJCQkJCQkgICAgKHN0YXR1czIpKSB7Ci0JCQkJCQkJCXJldHVybl9BQ1BJX1NUQVRVUwotCQkJCQkJCQkgICAgKHN0YXR1czIpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQotCQkJCQkJYWNwaV9wc19wb3Bfc2NvcGUoJgotCQkJCQkJCQkgICh3YWxrX3N0YXRlLT4KLQkJCQkJCQkJICAgcGFyc2VyX3N0YXRlKSwKLQkJCQkJCQkJICAmb3AsCi0JCQkJCQkJCSAgJndhbGtfc3RhdGUtPgotCQkJCQkJCQkgIGFyZ190eXBlcywKLQkJCQkJCQkJICAmd2Fsa19zdGF0ZS0+Ci0JCQkJCQkJCSAgYXJnX2NvdW50KTsKLQotCQkJCQl9IHdoaWxlIChvcCk7Ci0KLQkJCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci0JCQkJfQotCi0JCQkJZWxzZSBpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQotCQkJCQkvKiBGaXJzdCBlcnJvciBpcyBtb3N0IGltcG9ydGFudCAqLwotCi0JCQkJCSh2b2lkKQotCQkJCQkgICAgYWNwaV9wc19jb21wbGV0ZV90aGlzX29wKHdhbGtfc3RhdGUsCi0JCQkJCQkJCSAgICAgb3ApOwotCQkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXN0YXR1czIgPSBhY3BpX3BzX2NvbXBsZXRlX3RoaXNfb3Aod2Fsa19zdGF0ZSwgb3ApOwotCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMyKSkgewotCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMyKTsKLQkJCX0KLQkJfQotCi0JCWFjcGlfcHNfcG9wX3Njb3BlKCYod2Fsa19zdGF0ZS0+cGFyc2VyX3N0YXRlKSwgJm9wLAotCQkJCSAgJndhbGtfc3RhdGUtPmFyZ190eXBlcywKLQkJCQkgICZ3YWxrX3N0YXRlLT5hcmdfY291bnQpOwotCi0JfSB3aGlsZSAob3ApOwotCi0JcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfcHNfcGFyc2VfbG9vcAotICoKLSAqIFBBUkFNRVRFUlM6ICB3YWxrX3N0YXRlICAgICAgICAgIC0gQ3VycmVudCBzdGF0ZQotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKLSAqCi0gKiBERVNDUklQVElPTjogUGFyc2UgQU1MIChwb2ludGVkIHRvIGJ5IHRoZSBjdXJyZW50IHBhcnNlciBzdGF0ZSkgYW5kIHJldHVybgotICogICAgICAgICAgICAgIGEgdHJlZSBvZiBvcHMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotYWNwaV9zdGF0dXMgYWNwaV9wc19wYXJzZV9sb29wKHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUpCi17Ci0JYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7Ci0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKm9wID0gTlVMTDsJLyogY3VycmVudCBvcCAqLwotCXN0cnVjdCBhY3BpX3BhcnNlX3N0YXRlICpwYXJzZXJfc3RhdGU7Ci0JdTggKmFtbF9vcF9zdGFydCA9IE5VTEw7Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUihwc19wYXJzZV9sb29wLCB3YWxrX3N0YXRlKTsKLQotCWlmICh3YWxrX3N0YXRlLT5kZXNjZW5kaW5nX2NhbGxiYWNrID09IE5VTEwpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9QQVJBTUVURVIpOwotCX0KLQotCXBhcnNlcl9zdGF0ZSA9ICZ3YWxrX3N0YXRlLT5wYXJzZXJfc3RhdGU7Ci0Jd2Fsa19zdGF0ZS0+YXJnX3R5cGVzID0gMDsKLQotI2lmICghZGVmaW5lZCAoQUNQSV9OT19NRVRIT0RfRVhFQ1VUSU9OKSAmJiAhZGVmaW5lZCAoQUNQSV9DT05TVEFOVF9FVkFMX09OTFkpKQotCi0JaWYgKHdhbGtfc3RhdGUtPndhbGtfdHlwZSAmIEFDUElfV0FMS19NRVRIT0RfUkVTVEFSVCkgewotCi0JCS8qIFdlIGFyZSByZXN0YXJ0aW5nIGEgcHJlZW1wdGVkIGNvbnRyb2wgbWV0aG9kICovCi0KLQkJaWYgKGFjcGlfcHNfaGFzX2NvbXBsZXRlZF9zY29wZShwYXJzZXJfc3RhdGUpKSB7Ci0JCQkvKgotCQkJICogV2UgbXVzdCBjaGVjayBpZiBhIHByZWRpY2F0ZSB0byBhbiBJRiBvciBXSElMRSBzdGF0ZW1lbnQKLQkJCSAqIHdhcyBqdXN0IGNvbXBsZXRlZAotCQkJICovCi0JCQlpZiAoKHBhcnNlcl9zdGF0ZS0+c2NvcGUtPnBhcnNlX3Njb3BlLm9wKSAmJgotCQkJICAgICgocGFyc2VyX3N0YXRlLT5zY29wZS0+cGFyc2Vfc2NvcGUub3AtPmNvbW1vbi4KLQkJCSAgICAgIGFtbF9vcGNvZGUgPT0gQU1MX0lGX09QKQotCQkJICAgICB8fCAocGFyc2VyX3N0YXRlLT5zY29wZS0+cGFyc2Vfc2NvcGUub3AtPmNvbW1vbi4KLQkJCQkgYW1sX29wY29kZSA9PSBBTUxfV0hJTEVfT1ApKQotCQkJICAgICYmICh3YWxrX3N0YXRlLT5jb250cm9sX3N0YXRlKQotCQkJICAgICYmICh3YWxrX3N0YXRlLT5jb250cm9sX3N0YXRlLT5jb21tb24uc3RhdGUgPT0KLQkJCQlBQ1BJX0NPTlRST0xfUFJFRElDQVRFX0VYRUNVVElORykpIHsKLQkJCQkvKgotCQkJCSAqIEEgcHJlZGljYXRlIHdhcyBqdXN0IGNvbXBsZXRlZCwgZ2V0IHRoZSB2YWx1ZSBvZiB0aGUKLQkJCQkgKiBwcmVkaWNhdGUgYW5kIGJyYW5jaCBiYXNlZCBvbiB0aGF0IHZhbHVlCi0JCQkJICovCi0JCQkJd2Fsa19zdGF0ZS0+b3AgPSBOVUxMOwotCQkJCXN0YXR1cyA9Ci0JCQkJICAgIGFjcGlfZHNfZ2V0X3ByZWRpY2F0ZV92YWx1ZSh3YWxrX3N0YXRlLAotCQkJCQkJCQlBQ1BJX1RPX1BPSU5URVIKLQkJCQkJCQkJKFRSVUUpKTsKLQkJCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykKLQkJCQkgICAgJiYgKChzdGF0dXMgJiBBRV9DT0RFX01BU0spICE9Ci0JCQkJCUFFX0NPREVfQ09OVFJPTCkpIHsKLQkJCQkJaWYgKHN0YXR1cyA9PSBBRV9BTUxfTk9fUkVUVVJOX1ZBTFVFKSB7Ci0JCQkJCQlBQ1BJX0VYQ0VQVElPTigoQUVfSU5GTywgc3RhdHVzLAotCQkJCQkJCQkiSW52b2tlZCBtZXRob2QgZGlkIG5vdCByZXR1cm4gYSB2YWx1ZSIpKTsKLQotCQkJCQl9Ci0KLQkJCQkJQUNQSV9FWENFUFRJT04oKEFFX0lORk8sIHN0YXR1cywKLQkJCQkJCQkiR2V0UHJlZGljYXRlIEZhaWxlZCIpKTsKLQkJCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci0JCQkJfQotCi0JCQkJc3RhdHVzID0KLQkJCQkgICAgYWNwaV9wc19uZXh0X3BhcnNlX3N0YXRlKHdhbGtfc3RhdGUsIG9wLAotCQkJCQkJCSAgICAgc3RhdHVzKTsKLQkJCX0KLQotCQkJYWNwaV9wc19wb3Bfc2NvcGUocGFyc2VyX3N0YXRlLCAmb3AsCi0JCQkJCSAgJndhbGtfc3RhdGUtPmFyZ190eXBlcywKLQkJCQkJICAmd2Fsa19zdGF0ZS0+YXJnX2NvdW50KTsKLQkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfUEFSU0UsCi0JCQkJCSAgIlBvcHBlZCBzY29wZSwgT3A9JXBcbiIsIG9wKSk7Ci0JCX0gZWxzZSBpZiAod2Fsa19zdGF0ZS0+cHJldl9vcCkgewotCi0JCQkvKiBXZSB3ZXJlIGluIHRoZSBtaWRkbGUgb2YgYW4gb3AgKi8KLQotCQkJb3AgPSB3YWxrX3N0YXRlLT5wcmV2X29wOwotCQkJd2Fsa19zdGF0ZS0+YXJnX3R5cGVzID0gd2Fsa19zdGF0ZS0+cHJldl9hcmdfdHlwZXM7Ci0JCX0KLQl9Ci0jZW5kaWYKLQotCS8qIEl0ZXJhdGl2ZSBwYXJzaW5nIGxvb3AsIHdoaWxlIHRoZXJlIGlzIG1vcmUgQU1MIHRvIHByb2Nlc3M6ICovCi0KLQl3aGlsZSAoKHBhcnNlcl9zdGF0ZS0+YW1sIDwgcGFyc2VyX3N0YXRlLT5hbWxfZW5kKSB8fCAob3ApKSB7Ci0JCWFtbF9vcF9zdGFydCA9IHBhcnNlcl9zdGF0ZS0+YW1sOwotCQlpZiAoIW9wKSB7Ci0JCQlzdGF0dXMgPQotCQkJICAgIGFjcGlfcHNfY3JlYXRlX29wKHdhbGtfc3RhdGUsIGFtbF9vcF9zdGFydCwgJm9wKTsKLQkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQkJCWlmIChzdGF0dXMgPT0gQUVfQ1RSTF9QQVJTRV9DT05USU5VRSkgewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0KLQkJCQlpZiAoc3RhdHVzID09IEFFX0NUUkxfUEFSU0VfUEVORElORykgewotCQkJCQlzdGF0dXMgPSBBRV9PSzsKLQkJCQl9Ci0KLQkJCQlzdGF0dXMgPQotCQkJCSAgICBhY3BpX3BzX2NvbXBsZXRlX29wKHdhbGtfc3RhdGUsICZvcCwKLQkJCQkJCQlzdGF0dXMpOwotCQkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLQkJCQl9Ci0KLQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJb3AtPmNvbW1vbi5hbWxfb2Zmc2V0ID0gd2Fsa19zdGF0ZS0+YW1sX29mZnNldDsKLQotCQkJaWYgKHdhbGtfc3RhdGUtPm9wX2luZm8pIHsKLQkJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX1BBUlNFLAotCQkJCQkJICAiT3Bjb2RlICU0LjRYIFslc10gT3AgJXAgQW1sICVwIEFtbE9mZnNldCAlNS41WFxuIiwKLQkJCQkJCSAgKHUzMikgb3AtPmNvbW1vbi5hbWxfb3Bjb2RlLAotCQkJCQkJICB3YWxrX3N0YXRlLT5vcF9pbmZvLT5uYW1lLCBvcCwKLQkJCQkJCSAgcGFyc2VyX3N0YXRlLT5hbWwsCi0JCQkJCQkgIG9wLT5jb21tb24uYW1sX29mZnNldCkpOwotCQkJfQotCQl9Ci0KLQkJLyoKLQkJICogU3RhcnQgYXJnX2NvdW50IGF0IHplcm8gYmVjYXVzZSB3ZSBkb24ndCBrbm93IGlmIHRoZXJlIGFyZQotCQkgKiBhbnkgYXJncyB5ZXQKLQkJICovCi0JCXdhbGtfc3RhdGUtPmFyZ19jb3VudCA9IDA7Ci0KLQkJLyogQXJlIHRoZXJlIGFueSBhcmd1bWVudHMgdGhhdCBtdXN0IGJlIHByb2Nlc3NlZD8gKi8KLQotCQlpZiAod2Fsa19zdGF0ZS0+YXJnX3R5cGVzKSB7Ci0KLQkJCS8qIEdldCBhcmd1bWVudHMgKi8KLQotCQkJc3RhdHVzID0KLQkJCSAgICBhY3BpX3BzX2dldF9hcmd1bWVudHMod2Fsa19zdGF0ZSwgYW1sX29wX3N0YXJ0LCBvcCk7Ci0JCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJCQlzdGF0dXMgPQotCQkJCSAgICBhY3BpX3BzX2NvbXBsZXRlX29wKHdhbGtfc3RhdGUsICZvcCwKLQkJCQkJCQlzdGF0dXMpOwotCQkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLQkJCQl9Ci0KLQkJCQljb250aW51ZTsKLQkJCX0KLQkJfQotCi0JCS8qIENoZWNrIGZvciBhcmd1bWVudHMgdGhhdCBuZWVkIHRvIGJlIHByb2Nlc3NlZCAqLwotCi0JCWlmICh3YWxrX3N0YXRlLT5hcmdfY291bnQpIHsKLQkJCS8qCi0JCQkgKiBUaGVyZSBhcmUgYXJndW1lbnRzIChjb21wbGV4IG9uZXMpLCBwdXNoIE9wIGFuZAotCQkJICogcHJlcGFyZSBmb3IgYXJndW1lbnQKLQkJCSAqLwotCQkJc3RhdHVzID0gYWNwaV9wc19wdXNoX3Njb3BlKHBhcnNlcl9zdGF0ZSwgb3AsCi0JCQkJCQkgICAgd2Fsa19zdGF0ZS0+YXJnX3R5cGVzLAotCQkJCQkJICAgIHdhbGtfc3RhdGUtPmFyZ19jb3VudCk7Ci0JCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJCQlzdGF0dXMgPQotCQkJCSAgICBhY3BpX3BzX2NvbXBsZXRlX29wKHdhbGtfc3RhdGUsICZvcCwKLQkJCQkJCQlzdGF0dXMpOwotCQkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLQkJCQl9Ci0KLQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJb3AgPSBOVUxMOwotCQkJY29udGludWU7Ci0JCX0KLQotCQkvKgotCQkgKiBBbGwgYXJndW1lbnRzIGhhdmUgYmVlbiBwcm9jZXNzZWQgLS0gT3AgaXMgY29tcGxldGUsCi0JCSAqIHByZXBhcmUgZm9yIG5leHQKLQkJICovCi0JCXdhbGtfc3RhdGUtPm9wX2luZm8gPQotCQkgICAgYWNwaV9wc19nZXRfb3Bjb2RlX2luZm8ob3AtPmNvbW1vbi5hbWxfb3Bjb2RlKTsKLQkJaWYgKHdhbGtfc3RhdGUtPm9wX2luZm8tPmZsYWdzICYgQU1MX05BTUVEKSB7Ci0JCQlpZiAoYWNwaV9nYmxfZGVwdGgpIHsKLQkJCQlhY3BpX2dibF9kZXB0aC0tOwotCQkJfQotCi0JCQlpZiAob3AtPmNvbW1vbi5hbWxfb3Bjb2RlID09IEFNTF9SRUdJT05fT1AgfHwKLQkJCSAgICBvcC0+Y29tbW9uLmFtbF9vcGNvZGUgPT0gQU1MX0RBVEFfUkVHSU9OX09QKSB7Ci0JCQkJLyoKLQkJCQkgKiBTa2lwIHBhcnNpbmcgb2YgY29udHJvbCBtZXRob2Qgb3Igb3ByZWdpb24gYm9keSwKLQkJCQkgKiBiZWNhdXNlIHdlIGRvbid0IGhhdmUgZW5vdWdoIGluZm8gaW4gdGhlIGZpcnN0IHBhc3MKLQkJCQkgKiB0byBwYXJzZSB0aGVtIGNvcnJlY3RseS4KLQkJCQkgKgotCQkJCSAqIENvbXBsZXRlZCBwYXJzaW5nIGFuIG9wX3JlZ2lvbiBkZWNsYXJhdGlvbiwgd2Ugbm93Ci0JCQkJICoga25vdyB0aGUgbGVuZ3RoLgotCQkJCSAqLwotCQkJCW9wLT5uYW1lZC5sZW5ndGggPQotCQkJCSAgICAodTMyKSAocGFyc2VyX3N0YXRlLT5hbWwgLSBvcC0+bmFtZWQuZGF0YSk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAod2Fsa19zdGF0ZS0+b3BfaW5mby0+ZmxhZ3MgJiBBTUxfQ1JFQVRFKSB7Ci0JCQkvKgotCQkJICogQmFja3VwIHRvIGJlZ2lubmluZyBvZiBjcmVhdGVfeFhYZmllbGQgZGVjbGFyYXRpb24gKDEgZm9yCi0JCQkgKiBPcGNvZGUpCi0JCQkgKgotCQkJICogYm9keV9sZW5ndGggaXMgdW5rbm93biB1bnRpbCB3ZSBwYXJzZSB0aGUgYm9keQotCQkJICovCi0JCQlvcC0+bmFtZWQubGVuZ3RoID0KLQkJCSAgICAodTMyKSAocGFyc2VyX3N0YXRlLT5hbWwgLSBvcC0+bmFtZWQuZGF0YSk7Ci0JCX0KLQotCQlpZiAob3AtPmNvbW1vbi5hbWxfb3Bjb2RlID09IEFNTF9CQU5LX0ZJRUxEX09QKSB7Ci0JCQkvKgotCQkJICogQmFja3VwIHRvIGJlZ2lubmluZyBvZiBiYW5rX2ZpZWxkIGRlY2xhcmF0aW9uCi0JCQkgKgotCQkJICogYm9keV9sZW5ndGggaXMgdW5rbm93biB1bnRpbCB3ZSBwYXJzZSB0aGUgYm9keQotCQkJICovCi0JCQlvcC0+bmFtZWQubGVuZ3RoID0KLQkJCSAgICAodTMyKSAocGFyc2VyX3N0YXRlLT5hbWwgLSBvcC0+bmFtZWQuZGF0YSk7Ci0JCX0KLQotCQkvKiBUaGlzIG9wIGNvbXBsZXRlLCBub3RpZnkgdGhlIGRpc3BhdGNoZXIgKi8KLQotCQlpZiAod2Fsa19zdGF0ZS0+YXNjZW5kaW5nX2NhbGxiYWNrICE9IE5VTEwpIHsKLQkJCXdhbGtfc3RhdGUtPm9wID0gb3A7Ci0JCQl3YWxrX3N0YXRlLT5vcGNvZGUgPSBvcC0+Y29tbW9uLmFtbF9vcGNvZGU7Ci0KLQkJCXN0YXR1cyA9IHdhbGtfc3RhdGUtPmFzY2VuZGluZ19jYWxsYmFjayh3YWxrX3N0YXRlKTsKLQkJCXN0YXR1cyA9Ci0JCQkgICAgYWNwaV9wc19uZXh0X3BhcnNlX3N0YXRlKHdhbGtfc3RhdGUsIG9wLCBzdGF0dXMpOwotCQkJaWYgKHN0YXR1cyA9PSBBRV9DVFJMX1BFTkRJTkcpIHsKLQkJCQlzdGF0dXMgPSBBRV9PSzsKLQkJCX0KLQkJfQotCi0JCXN0YXR1cyA9IGFjcGlfcHNfY29tcGxldGVfb3Aod2Fsa19zdGF0ZSwgJm9wLCBzdGF0dXMpOwotCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotCQl9Ci0KLQl9CQkJLyogd2hpbGUgcGFyc2VyX3N0YXRlLT5BbWwgKi8KLQotCXN0YXR1cyA9IGFjcGlfcHNfY29tcGxldGVfZmluYWxfb3Aod2Fsa19zdGF0ZSwgb3AsIHN0YXR1cyk7Ci0JcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvcGFyc2VyL3Bzb3Bjb2RlLmMgYi9kcml2ZXJzL2FjcGkvcGFyc2VyL3Bzb3Bjb2RlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0MjVhYjMuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9hY3BpL3BhcnNlci9wc29wY29kZS5jCisrKyAvZGV2L251bGwKQEAgLTEsODA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBNb2R1bGUgTmFtZTogcHNvcGNvZGUgLSBQYXJzZXIvSW50ZXJwcmV0ZXIgb3Bjb2RlIGluZm9ybWF0aW9uIHRhYmxlCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwOCwgSW50ZWwgQ29ycC4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKLSAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIGF0IG1pbmltdW0gYSBkaXNjbGFpbWVyCi0gKiAgICBzdWJzdGFudGlhbGx5IHNpbWlsYXIgdG8gdGhlICJOTyBXQVJSQU5UWSIgZGlzY2xhaW1lciBiZWxvdwotICogICAgKCJEaXNjbGFpbWVyIikgYW5kIGFueSByZWRpc3RyaWJ1dGlvbiBtdXN0IGJlIGNvbmRpdGlvbmVkIHVwb24KLSAqICAgIGluY2x1ZGluZyBhIHN1YnN0YW50aWFsbHkgc2ltaWxhciBEaXNjbGFpbWVyIHJlcXVpcmVtZW50IGZvciBmdXJ0aGVyCi0gKiAgICBiaW5hcnkgcmVkaXN0cmlidXRpb24uCi0gKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMKLSAqICAgIG9mIGFueSBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTk8gV0FSUkFOVFkKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAotICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKLSAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HCi0gKiBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKLSAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KLSAqLwotCi0jaW5jbHVkZSA8YWNwaS9hY3BpLmg+Ci0jaW5jbHVkZSA8YWNwaS9hY3BhcnNlci5oPgotI2luY2x1ZGUgPGFjcGkvYWNvcGNvZGUuaD4KLSNpbmNsdWRlIDxhY3BpL2FtbGNvZGUuaD4KLQotI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfUEFSU0VSCi1BQ1BJX01PRFVMRV9OQU1FKCJwc29wY29kZSIpCi0KLXN0YXRpYyBjb25zdCB1OCBhY3BpX2dibF9hcmd1bWVudF9jb3VudFtdID0KLSAgICB7IDAsIDEsIDEsIDEsIDEsIDIsIDIsIDIsIDIsIDMsIDMsIDYgfTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBOQU1FOiAgICAgICAgYWNwaV9nYmxfYW1sX29wX2luZm8KLSAqCi0gKiBERVNDUklQVElPTjogT3Bjb2RlIHRhYmxlLiBFYWNoIGVudHJ5IGNvbnRhaW5zIDxvcGNvZGUsIHR5cGUsIG5hbWUsIG9wZXJhbmRzPgotICogICAgICAgICAgICAgIFRoZSBuYW1lIGlzIGEgc2ltcGxlIGFzY2lpIHN0cmluZywgdGhlIG9wZXJhbmQgc3BlY2lmaWVyIGlzIGFuCi0gKiAgICAgICAgICAgICAgYXNjaWkgc3RyaW5nIHdpdGggb25lIGxldHRlciBwZXIgb3BlcmFuZC4gIFRoZSBsZXR0ZXIgc3BlY2lmaWVzCi0gKiAgICAgICAgICAgICAgdGhlIG9wZXJhbmQgdHlwZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKgotICogU3VtbWFyeSBvZiBvcGNvZGUgdHlwZXMvZmxhZ3MKLSAqCi0KLSBPcGNvZGVzIHRoYXQgaGF2ZSBhc3NvY2lhdGVkIG5hbWVzcGFjZSBvYmplY3RzIChBTUxfTlNPQkpFQ1QgZmxhZykKLQotCUFNTF9TQ09QRV9PUAotCUFNTF9ERVZJQ0VfT1AKLQlBTUxfVEhFUk1BTF9aT05FX09QCi0JQU1MX01FVEhPRF9PUAotCUFNTF9QT1dFUl9SRVNfT1AKLQlBTUxfUFJPQ0VTU09SX09QCi0JQU1MX0ZJRUxEX09QCi0JQU1MX0lOREVYX0ZJRUxEX09QCi0JQU1MX0JBTktfRklFTERfT1AKLQlBTUxfTkFNRV9PUAotCUFNTF9BTElBU19PUAotCUFNTF9NVVRFWF9PUAotCUFNTF9FVkVOVF9PUAotCUFNTF9SRUdJT05fT1AKLQlBTUxfQ1JFQVRFX0ZJRUxEX09QCi0JQU1MX0NSRUFURV9CSVRfRklFTERfT1AKLQlBTUxfQ1JFQVRFX0JZVEVfRklFTERfT1AKLQlBTUxfQ1JFQVRFX1dPUkRfRklFTERfT1AKLQlBTUxfQ1JFQVRFX0RXT1JEX0ZJRUxEX09QCi0JQU1MX0NSRUFURV9RV09SRF9GSUVMRF9PUAotCUFNTF9JTlRfTkFNRURGSUVMRF9PUAotCUFNTF9JTlRfTUVUSE9EQ0FMTF9PUAotCUFNTF9JTlRfTkFNRVBBVEhfT1AKLQotICBPcGNvZGVzIHRoYXQgYXJlICJuYW1lc3BhY2UiIG9wY29kZXMgKEFNTF9OU09QQ09ERSBmbGFnKQotCi0JQU1MX1NDT1BFX09QCi0JQU1MX0RFVklDRV9PUAotCUFNTF9USEVSTUFMX1pPTkVfT1AKLQlBTUxfTUVUSE9EX09QCi0JQU1MX1BPV0VSX1JFU19PUAotCUFNTF9QUk9DRVNTT1JfT1AKLQlBTUxfRklFTERfT1AKLQlBTUxfSU5ERVhfRklFTERfT1AKLQlBTUxfQkFOS19GSUVMRF9PUAotCUFNTF9OQU1FX09QCi0JQU1MX0FMSUFTX09QCi0JQU1MX01VVEVYX09QCi0JQU1MX0VWRU5UX09QCi0JQU1MX1JFR0lPTl9PUAotCUFNTF9JTlRfTkFNRURGSUVMRF9PUAotCi0gIE9wY29kZXMgdGhhdCBoYXZlIGFuIGFzc29jaWF0ZWQgbmFtZXNwYWNlIG5vZGUgKEFNTF9OU05PREUgZmxhZykKLQotCUFNTF9TQ09QRV9PUAotCUFNTF9ERVZJQ0VfT1AKLQlBTUxfVEhFUk1BTF9aT05FX09QCi0JQU1MX01FVEhPRF9PUAotCUFNTF9QT1dFUl9SRVNfT1AKLQlBTUxfUFJPQ0VTU09SX09QCi0JQU1MX05BTUVfT1AKLQlBTUxfQUxJQVNfT1AKLQlBTUxfTVVURVhfT1AKLQlBTUxfRVZFTlRfT1AKLQlBTUxfUkVHSU9OX09QCi0JQU1MX0NSRUFURV9GSUVMRF9PUAotCUFNTF9DUkVBVEVfQklUX0ZJRUxEX09QCi0JQU1MX0NSRUFURV9CWVRFX0ZJRUxEX09QCi0JQU1MX0NSRUFURV9XT1JEX0ZJRUxEX09QCi0JQU1MX0NSRUFURV9EV09SRF9GSUVMRF9PUAotCUFNTF9DUkVBVEVfUVdPUkRfRklFTERfT1AKLQlBTUxfSU5UX05BTUVERklFTERfT1AKLQlBTUxfSU5UX01FVEhPRENBTExfT1AKLQlBTUxfSU5UX05BTUVQQVRIX09QCi0KLSAgT3Bjb2RlcyB0aGF0IGRlZmluZSBuYW1lZCBBQ1BJIG9iamVjdHMgKEFNTF9OQU1FRCBmbGFnKQotCi0JQU1MX1NDT1BFX09QCi0JQU1MX0RFVklDRV9PUAotCUFNTF9USEVSTUFMX1pPTkVfT1AKLQlBTUxfTUVUSE9EX09QCi0JQU1MX1BPV0VSX1JFU19PUAotCUFNTF9QUk9DRVNTT1JfT1AKLQlBTUxfTkFNRV9PUAotCUFNTF9BTElBU19PUAotCUFNTF9NVVRFWF9PUAotCUFNTF9FVkVOVF9PUAotCUFNTF9SRUdJT05fT1AKLQlBTUxfSU5UX05BTUVERklFTERfT1AKLQotICBPcGNvZGVzIHRoYXQgY29udGFpbiBleGVjdXRhYmxlIEFNTCBhcyBwYXJ0IG9mIHRoZSBkZWZpbml0aW9uIHRoYXQKLSAgbXVzdCBiZSBkZWZlcnJlZCB1bnRpbCBuZWVkZWQKLQotCUFNTF9NRVRIT0RfT1AKLQlBTUxfVkFSX1BBQ0tBR0VfT1AKLQlBTUxfQ1JFQVRFX0ZJRUxEX09QCi0JQU1MX0NSRUFURV9CSVRfRklFTERfT1AKLQlBTUxfQ1JFQVRFX0JZVEVfRklFTERfT1AKLQlBTUxfQ1JFQVRFX1dPUkRfRklFTERfT1AKLQlBTUxfQ1JFQVRFX0RXT1JEX0ZJRUxEX09QCi0JQU1MX0NSRUFURV9RV09SRF9GSUVMRF9PUAotCUFNTF9SRUdJT05fT1AKLQlBTUxfQlVGRkVSX09QCi0KLSAgRmllbGQgb3Bjb2RlcwotCi0JQU1MX0NSRUFURV9GSUVMRF9PUAotCUFNTF9GSUVMRF9PUAotCUFNTF9JTkRFWF9GSUVMRF9PUAotCUFNTF9CQU5LX0ZJRUxEX09QCi0KLSAgRmllbGQgIkNyZWF0ZSIgb3Bjb2RlcwotCi0JQU1MX0NSRUFURV9GSUVMRF9PUAotCUFNTF9DUkVBVEVfQklUX0ZJRUxEX09QCi0JQU1MX0NSRUFURV9CWVRFX0ZJRUxEX09QCi0JQU1MX0NSRUFURV9XT1JEX0ZJRUxEX09QCi0JQU1MX0NSRUFURV9EV09SRF9GSUVMRF9PUAotCUFNTF9DUkVBVEVfUVdPUkRfRklFTERfT1AKLQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoKLSAqIE1hc3RlciBPcGNvZGUgaW5mb3JtYXRpb24gdGFibGUuICBBIHN1bW1hcnkgb2YgZXZlcnl0aGluZyB3ZSBrbm93IGFib3V0IGVhY2gKLSAqIG9wY29kZSwgYWxsIGluIG9uZSBwbGFjZS4KLSAqLwotY29uc3Qgc3RydWN0IGFjcGlfb3Bjb2RlX2luZm8gYWNwaV9nYmxfYW1sX29wX2luZm9bQU1MX05VTV9PUENPREVTXSA9IHsKLS8qISBbQmVnaW5dIG5vIHNvdXJjZSBjb2RlIHRyYW5zbGF0aW9uICovCi0vKiBJbmRleCAgICAgICAgICAgTmFtZSAgICAgICAgICAgICAgICAgUGFyc2VyIEFyZ3MgICAgICAgICAgICAgICBJbnRlcnByZXRlciBBcmdzICAgICAgICAgICAgICAgIE9iamVjdFR5cGUgICAgICAgICAgICAgICAgICAgIENsYXNzICAgICAgICAgICAgICAgICAgICAgIFR5cGUgICAgICAgICAgICAgICAgICBGbGFncyAqLwotCi0vKiAwMCAqLyBBQ1BJX09QKCJaZXJvIiwgQVJHUF9aRVJPX09QLCBBUkdJX1pFUk9fT1AsIEFDUElfVFlQRV9JTlRFR0VSLAotCQkgQU1MX0NMQVNTX0FSR1VNRU5ULCBBTUxfVFlQRV9DT05TVEFOVCwgQU1MX0NPTlNUQU5UKSwKLS8qIDAxICovIEFDUElfT1AoIk9uZSIsIEFSR1BfT05FX09QLCBBUkdJX09ORV9PUCwgQUNQSV9UWVBFX0lOVEVHRVIsCi0JCSBBTUxfQ0xBU1NfQVJHVU1FTlQsIEFNTF9UWVBFX0NPTlNUQU5ULCBBTUxfQ09OU1RBTlQpLAotLyogMDIgKi8gQUNQSV9PUCgiQWxpYXMiLCBBUkdQX0FMSUFTX09QLCBBUkdJX0FMSUFTX09QLAotCQkgQUNQSV9UWVBFX0xPQ0FMX0FMSUFTLCBBTUxfQ0xBU1NfTkFNRURfT0JKRUNULAotCQkgQU1MX1RZUEVfTkFNRURfU0lNUExFLAotCQkgQU1MX0hBU19BUkdTIHwgQU1MX05TT0JKRUNUIHwgQU1MX05TT1BDT0RFIHwKLQkJIEFNTF9OU05PREUgfCBBTUxfTkFNRUQpLAotLyogMDMgKi8gQUNQSV9PUCgiTmFtZSIsIEFSR1BfTkFNRV9PUCwgQVJHSV9OQU1FX09QLCBBQ1BJX1RZUEVfQU5ZLAotCQkgQU1MX0NMQVNTX05BTUVEX09CSkVDVCwgQU1MX1RZUEVfTkFNRURfQ09NUExFWCwKLQkJIEFNTF9IQVNfQVJHUyB8IEFNTF9OU09CSkVDVCB8IEFNTF9OU09QQ09ERSB8Ci0JCSBBTUxfTlNOT0RFIHwgQU1MX05BTUVEKSwKLS8qIDA0ICovIEFDUElfT1AoIkJ5dGVDb25zdCIsIEFSR1BfQllURV9PUCwgQVJHSV9CWVRFX09QLAotCQkgQUNQSV9UWVBFX0lOVEVHRVIsIEFNTF9DTEFTU19BUkdVTUVOVCwKLQkJIEFNTF9UWVBFX0xJVEVSQUwsIEFNTF9DT05TVEFOVCksCi0vKiAwNSAqLyBBQ1BJX09QKCJXb3JkQ29uc3QiLCBBUkdQX1dPUkRfT1AsIEFSR0lfV09SRF9PUCwKLQkJIEFDUElfVFlQRV9JTlRFR0VSLCBBTUxfQ0xBU1NfQVJHVU1FTlQsCi0JCSBBTUxfVFlQRV9MSVRFUkFMLCBBTUxfQ09OU1RBTlQpLAotLyogMDYgKi8gQUNQSV9PUCgiRHdvcmRDb25zdCIsIEFSR1BfRFdPUkRfT1AsIEFSR0lfRFdPUkRfT1AsCi0JCSBBQ1BJX1RZUEVfSU5URUdFUiwgQU1MX0NMQVNTX0FSR1VNRU5ULAotCQkgQU1MX1RZUEVfTElURVJBTCwgQU1MX0NPTlNUQU5UKSwKLS8qIDA3ICovIEFDUElfT1AoIlN0cmluZyIsIEFSR1BfU1RSSU5HX09QLCBBUkdJX1NUUklOR19PUCwKLQkJIEFDUElfVFlQRV9TVFJJTkcsIEFNTF9DTEFTU19BUkdVTUVOVCwKLQkJIEFNTF9UWVBFX0xJVEVSQUwsIEFNTF9DT05TVEFOVCksCi0vKiAwOCAqLyBBQ1BJX09QKCJTY29wZSIsIEFSR1BfU0NPUEVfT1AsIEFSR0lfU0NPUEVfT1AsCi0JCSBBQ1BJX1RZUEVfTE9DQUxfU0NPUEUsIEFNTF9DTEFTU19OQU1FRF9PQkpFQ1QsCi0JCSBBTUxfVFlQRV9OQU1FRF9OT19PQkosCi0JCSBBTUxfSEFTX0FSR1MgfCBBTUxfTlNPQkpFQ1QgfCBBTUxfTlNPUENPREUgfAotCQkgQU1MX05TTk9ERSB8IEFNTF9OQU1FRCksCi0vKiAwOSAqLyBBQ1BJX09QKCJCdWZmZXIiLCBBUkdQX0JVRkZFUl9PUCwgQVJHSV9CVUZGRVJfT1AsCi0JCSBBQ1BJX1RZUEVfQlVGRkVSLCBBTUxfQ0xBU1NfQ1JFQVRFLAotCQkgQU1MX1RZUEVfQ1JFQVRFX09CSkVDVCwKLQkJIEFNTF9IQVNfQVJHUyB8IEFNTF9ERUZFUiB8IEFNTF9DT05TVEFOVCksCi0vKiAwQSAqLyBBQ1BJX09QKCJQYWNrYWdlIiwgQVJHUF9QQUNLQUdFX09QLCBBUkdJX1BBQ0tBR0VfT1AsCi0JCSBBQ1BJX1RZUEVfUEFDS0FHRSwgQU1MX0NMQVNTX0NSRUFURSwKLQkJIEFNTF9UWVBFX0NSRUFURV9PQkpFQ1QsCi0JCSBBTUxfSEFTX0FSR1MgfCBBTUxfREVGRVIgfCBBTUxfQ09OU1RBTlQpLAotLyogMEIgKi8gQUNQSV9PUCgiTWV0aG9kIiwgQVJHUF9NRVRIT0RfT1AsIEFSR0lfTUVUSE9EX09QLAotCQkgQUNQSV9UWVBFX01FVEhPRCwgQU1MX0NMQVNTX05BTUVEX09CSkVDVCwKLQkJIEFNTF9UWVBFX05BTUVEX0NPTVBMRVgsCi0JCSBBTUxfSEFTX0FSR1MgfCBBTUxfTlNPQkpFQ1QgfCBBTUxfTlNPUENPREUgfAotCQkgQU1MX05TTk9ERSB8IEFNTF9OQU1FRCB8IEFNTF9ERUZFUiksCi0vKiAwQyAqLyBBQ1BJX09QKCJMb2NhbDAiLCBBUkdQX0xPQ0FMMCwgQVJHSV9MT0NBTDAsCi0JCSBBQ1BJX1RZUEVfTE9DQUxfUkVGRVJFTkNFLCBBTUxfQ0xBU1NfQVJHVU1FTlQsCi0JCSBBTUxfVFlQRV9MT0NBTF9WQVJJQUJMRSwgMCksCi0vKiAwRCAqLyBBQ1BJX09QKCJMb2NhbDEiLCBBUkdQX0xPQ0FMMSwgQVJHSV9MT0NBTDEsCi0JCSBBQ1BJX1RZUEVfTE9DQUxfUkVGRVJFTkNFLCBBTUxfQ0xBU1NfQVJHVU1FTlQsCi0JCSBBTUxfVFlQRV9MT0NBTF9WQVJJQUJMRSwgMCksCi0vKiAwRSAqLyBBQ1BJX09QKCJMb2NhbDIiLCBBUkdQX0xPQ0FMMiwgQVJHSV9MT0NBTDIsCi0JCSBBQ1BJX1RZUEVfTE9DQUxfUkVGRVJFTkNFLCBBTUxfQ0xBU1NfQVJHVU1FTlQsCi0JCSBBTUxfVFlQRV9MT0NBTF9WQVJJQUJMRSwgMCksCi0vKiAwRiAqLyBBQ1BJX09QKCJMb2NhbDMiLCBBUkdQX0xPQ0FMMywgQVJHSV9MT0NBTDMsCi0JCSBBQ1BJX1RZUEVfTE9DQUxfUkVGRVJFTkNFLCBBTUxfQ0xBU1NfQVJHVU1FTlQsCi0JCSBBTUxfVFlQRV9MT0NBTF9WQVJJQUJMRSwgMCksCi0vKiAxMCAqLyBBQ1BJX09QKCJMb2NhbDQiLCBBUkdQX0xPQ0FMNCwgQVJHSV9MT0NBTDQsCi0JCSBBQ1BJX1RZUEVfTE9DQUxfUkVGRVJFTkNFLCBBTUxfQ0xBU1NfQVJHVU1FTlQsCi0JCSBBTUxfVFlQRV9MT0NBTF9WQVJJQUJMRSwgMCksCi0vKiAxMSAqLyBBQ1BJX09QKCJMb2NhbDUiLCBBUkdQX0xPQ0FMNSwgQVJHSV9MT0NBTDUsCi0JCSBBQ1BJX1RZUEVfTE9DQUxfUkVGRVJFTkNFLCBBTUxfQ0xBU1NfQVJHVU1FTlQsCi0JCSBBTUxfVFlQRV9MT0NBTF9WQVJJQUJMRSwgMCksCi0vKiAxMiAqLyBBQ1BJX09QKCJMb2NhbDYiLCBBUkdQX0xPQ0FMNiwgQVJHSV9MT0NBTDYsCi0JCSBBQ1BJX1RZUEVfTE9DQUxfUkVGRVJFTkNFLCBBTUxfQ0xBU1NfQVJHVU1FTlQsCi0JCSBBTUxfVFlQRV9MT0NBTF9WQVJJQUJMRSwgMCksCi0vKiAxMyAqLyBBQ1BJX09QKCJMb2NhbDciLCBBUkdQX0xPQ0FMNywgQVJHSV9MT0NBTDcsCi0JCSBBQ1BJX1RZUEVfTE9DQUxfUkVGRVJFTkNFLCBBTUxfQ0xBU1NfQVJHVU1FTlQsCi0JCSBBTUxfVFlQRV9MT0NBTF9WQVJJQUJMRSwgMCksCi0vKiAxNCAqLyBBQ1BJX09QKCJBcmcwIiwgQVJHUF9BUkcwLCBBUkdJX0FSRzAsCi0JCSBBQ1BJX1RZUEVfTE9DQUxfUkVGRVJFTkNFLCBBTUxfQ0xBU1NfQVJHVU1FTlQsCi0JCSBBTUxfVFlQRV9NRVRIT0RfQVJHVU1FTlQsIDApLAotLyogMTUgKi8gQUNQSV9PUCgiQXJnMSIsIEFSR1BfQVJHMSwgQVJHSV9BUkcxLAotCQkgQUNQSV9UWVBFX0xPQ0FMX1JFRkVSRU5DRSwgQU1MX0NMQVNTX0FSR1VNRU5ULAotCQkgQU1MX1RZUEVfTUVUSE9EX0FSR1VNRU5ULCAwKSwKLS8qIDE2ICovIEFDUElfT1AoIkFyZzIiLCBBUkdQX0FSRzIsIEFSR0lfQVJHMiwKLQkJIEFDUElfVFlQRV9MT0NBTF9SRUZFUkVOQ0UsIEFNTF9DTEFTU19BUkdVTUVOVCwKLQkJIEFNTF9UWVBFX01FVEhPRF9BUkdVTUVOVCwgMCksCi0vKiAxNyAqLyBBQ1BJX09QKCJBcmczIiwgQVJHUF9BUkczLCBBUkdJX0FSRzMsCi0JCSBBQ1BJX1RZUEVfTE9DQUxfUkVGRVJFTkNFLCBBTUxfQ0xBU1NfQVJHVU1FTlQsCi0JCSBBTUxfVFlQRV9NRVRIT0RfQVJHVU1FTlQsIDApLAotLyogMTggKi8gQUNQSV9PUCgiQXJnNCIsIEFSR1BfQVJHNCwgQVJHSV9BUkc0LAotCQkgQUNQSV9UWVBFX0xPQ0FMX1JFRkVSRU5DRSwgQU1MX0NMQVNTX0FSR1VNRU5ULAotCQkgQU1MX1RZUEVfTUVUSE9EX0FSR1VNRU5ULCAwKSwKLS8qIDE5ICovIEFDUElfT1AoIkFyZzUiLCBBUkdQX0FSRzUsIEFSR0lfQVJHNSwKLQkJIEFDUElfVFlQRV9MT0NBTF9SRUZFUkVOQ0UsIEFNTF9DTEFTU19BUkdVTUVOVCwKLQkJIEFNTF9UWVBFX01FVEhPRF9BUkdVTUVOVCwgMCksCi0vKiAxQSAqLyBBQ1BJX09QKCJBcmc2IiwgQVJHUF9BUkc2LCBBUkdJX0FSRzYsCi0JCSBBQ1BJX1RZUEVfTE9DQUxfUkVGRVJFTkNFLCBBTUxfQ0xBU1NfQVJHVU1FTlQsCi0JCSBBTUxfVFlQRV9NRVRIT0RfQVJHVU1FTlQsIDApLAotLyogMUIgKi8gQUNQSV9PUCgiU3RvcmUiLCBBUkdQX1NUT1JFX09QLCBBUkdJX1NUT1JFX09QLCBBQ1BJX1RZUEVfQU5ZLAotCQkgQU1MX0NMQVNTX0VYRUNVVEUsIEFNTF9UWVBFX0VYRUNfMUFfMVRfMVIsCi0JCSBBTUxfRkxBR1NfRVhFQ18xQV8xVF8xUiksCi0vKiAxQyAqLyBBQ1BJX09QKCJSZWZPZiIsIEFSR1BfUkVGX09GX09QLCBBUkdJX1JFRl9PRl9PUCwgQUNQSV9UWVBFX0FOWSwKLQkJIEFNTF9DTEFTU19FWEVDVVRFLCBBTUxfVFlQRV9FWEVDXzFBXzBUXzFSLAotCQkgQU1MX0ZMQUdTX0VYRUNfMUFfMFRfMVIpLAotLyogMUQgKi8gQUNQSV9PUCgiQWRkIiwgQVJHUF9BRERfT1AsIEFSR0lfQUREX09QLCBBQ1BJX1RZUEVfQU5ZLAotCQkgQU1MX0NMQVNTX0VYRUNVVEUsIEFNTF9UWVBFX0VYRUNfMkFfMVRfMVIsCi0JCSBBTUxfRkxBR1NfRVhFQ18yQV8xVF8xUiB8IEFNTF9NQVRIIHwgQU1MX0NPTlNUQU5UKSwKLS8qIDFFICovIEFDUElfT1AoIkNvbmNhdGVuYXRlIiwgQVJHUF9DT05DQVRfT1AsIEFSR0lfQ09OQ0FUX09QLAotCQkgQUNQSV9UWVBFX0FOWSwgQU1MX0NMQVNTX0VYRUNVVEUsCi0JCSBBTUxfVFlQRV9FWEVDXzJBXzFUXzFSLAotCQkgQU1MX0ZMQUdTX0VYRUNfMkFfMVRfMVIgfCBBTUxfQ09OU1RBTlQpLAotLyogMUYgKi8gQUNQSV9PUCgiU3VidHJhY3QiLCBBUkdQX1NVQlRSQUNUX09QLCBBUkdJX1NVQlRSQUNUX09QLAotCQkgQUNQSV9UWVBFX0FOWSwgQU1MX0NMQVNTX0VYRUNVVEUsCi0JCSBBTUxfVFlQRV9FWEVDXzJBXzFUXzFSLAotCQkgQU1MX0ZMQUdTX0VYRUNfMkFfMVRfMVIgfCBBTUxfTUFUSCB8IEFNTF9DT05TVEFOVCksCi0vKiAyMCAqLyBBQ1BJX09QKCJJbmNyZW1lbnQiLCBBUkdQX0lOQ1JFTUVOVF9PUCwgQVJHSV9JTkNSRU1FTlRfT1AsCi0JCSBBQ1BJX1RZUEVfQU5ZLCBBTUxfQ0xBU1NfRVhFQ1VURSwKLQkJIEFNTF9UWVBFX0VYRUNfMUFfMFRfMVIsCi0JCSBBTUxfRkxBR1NfRVhFQ18xQV8wVF8xUiB8IEFNTF9DT05TVEFOVCksCi0vKiAyMSAqLyBBQ1BJX09QKCJEZWNyZW1lbnQiLCBBUkdQX0RFQ1JFTUVOVF9PUCwgQVJHSV9ERUNSRU1FTlRfT1AsCi0JCSBBQ1BJX1RZUEVfQU5ZLCBBTUxfQ0xBU1NfRVhFQ1VURSwKLQkJIEFNTF9UWVBFX0VYRUNfMUFfMFRfMVIsCi0JCSBBTUxfRkxBR1NfRVhFQ18xQV8wVF8xUiB8IEFNTF9DT05TVEFOVCksCi0vKiAyMiAqLyBBQ1BJX09QKCJNdWx0aXBseSIsIEFSR1BfTVVMVElQTFlfT1AsIEFSR0lfTVVMVElQTFlfT1AsCi0JCSBBQ1BJX1RZUEVfQU5ZLCBBTUxfQ0xBU1NfRVhFQ1VURSwKLQkJIEFNTF9UWVBFX0VYRUNfMkFfMVRfMVIsCi0JCSBBTUxfRkxBR1NfRVhFQ18yQV8xVF8xUiB8IEFNTF9NQVRIIHwgQU1MX0NPTlNUQU5UKSwKLS8qIDIzICovIEFDUElfT1AoIkRpdmlkZSIsIEFSR1BfRElWSURFX09QLCBBUkdJX0RJVklERV9PUCwKLQkJIEFDUElfVFlQRV9BTlksIEFNTF9DTEFTU19FWEVDVVRFLAotCQkgQU1MX1RZUEVfRVhFQ18yQV8yVF8xUiwKLQkJIEFNTF9GTEFHU19FWEVDXzJBXzJUXzFSIHwgQU1MX0NPTlNUQU5UKSwKLS8qIDI0ICovIEFDUElfT1AoIlNoaWZ0TGVmdCIsIEFSR1BfU0hJRlRfTEVGVF9PUCwgQVJHSV9TSElGVF9MRUZUX09QLAotCQkgQUNQSV9UWVBFX0FOWSwgQU1MX0NMQVNTX0VYRUNVVEUsCi0JCSBBTUxfVFlQRV9FWEVDXzJBXzFUXzFSLAotCQkgQU1MX0ZMQUdTX0VYRUNfMkFfMVRfMVIgfCBBTUxfTUFUSCB8IEFNTF9DT05TVEFOVCksCi0vKiAyNSAqLyBBQ1BJX09QKCJTaGlmdFJpZ2h0IiwgQVJHUF9TSElGVF9SSUdIVF9PUCwgQVJHSV9TSElGVF9SSUdIVF9PUCwKLQkJIEFDUElfVFlQRV9BTlksIEFNTF9DTEFTU19FWEVDVVRFLAotCQkgQU1MX1RZUEVfRVhFQ18yQV8xVF8xUiwKLQkJIEFNTF9GTEFHU19FWEVDXzJBXzFUXzFSIHwgQU1MX01BVEggfCBBTUxfQ09OU1RBTlQpLAotLyogMjYgKi8gQUNQSV9PUCgiQW5kIiwgQVJHUF9CSVRfQU5EX09QLCBBUkdJX0JJVF9BTkRfT1AsIEFDUElfVFlQRV9BTlksCi0JCSBBTUxfQ0xBU1NfRVhFQ1VURSwgQU1MX1RZUEVfRVhFQ18yQV8xVF8xUiwKLQkJIEFNTF9GTEFHU19FWEVDXzJBXzFUXzFSIHwgQU1MX01BVEggfCBBTUxfQ09OU1RBTlQpLAotLyogMjcgKi8gQUNQSV9PUCgiTkFuZCIsIEFSR1BfQklUX05BTkRfT1AsIEFSR0lfQklUX05BTkRfT1AsCi0JCSBBQ1BJX1RZUEVfQU5ZLCBBTUxfQ0xBU1NfRVhFQ1VURSwKLQkJIEFNTF9UWVBFX0VYRUNfMkFfMVRfMVIsCi0JCSBBTUxfRkxBR1NfRVhFQ18yQV8xVF8xUiB8IEFNTF9NQVRIIHwgQU1MX0NPTlNUQU5UKSwKLS8qIDI4ICovIEFDUElfT1AoIk9yIiwgQVJHUF9CSVRfT1JfT1AsIEFSR0lfQklUX09SX09QLCBBQ1BJX1RZUEVfQU5ZLAotCQkgQU1MX0NMQVNTX0VYRUNVVEUsIEFNTF9UWVBFX0VYRUNfMkFfMVRfMVIsCi0JCSBBTUxfRkxBR1NfRVhFQ18yQV8xVF8xUiB8IEFNTF9NQVRIIHwgQU1MX0NPTlNUQU5UKSwKLS8qIDI5ICovIEFDUElfT1AoIk5PciIsIEFSR1BfQklUX05PUl9PUCwgQVJHSV9CSVRfTk9SX09QLCBBQ1BJX1RZUEVfQU5ZLAotCQkgQU1MX0NMQVNTX0VYRUNVVEUsIEFNTF9UWVBFX0VYRUNfMkFfMVRfMVIsCi0JCSBBTUxfRkxBR1NfRVhFQ18yQV8xVF8xUiB8IEFNTF9NQVRIIHwgQU1MX0NPTlNUQU5UKSwKLS8qIDJBICovIEFDUElfT1AoIlhPciIsIEFSR1BfQklUX1hPUl9PUCwgQVJHSV9CSVRfWE9SX09QLCBBQ1BJX1RZUEVfQU5ZLAotCQkgQU1MX0NMQVNTX0VYRUNVVEUsIEFNTF9UWVBFX0VYRUNfMkFfMVRfMVIsCi0JCSBBTUxfRkxBR1NfRVhFQ18yQV8xVF8xUiB8IEFNTF9NQVRIIHwgQU1MX0NPTlNUQU5UKSwKLS8qIDJCICovIEFDUElfT1AoIk5vdCIsIEFSR1BfQklUX05PVF9PUCwgQVJHSV9CSVRfTk9UX09QLCBBQ1BJX1RZUEVfQU5ZLAotCQkgQU1MX0NMQVNTX0VYRUNVVEUsIEFNTF9UWVBFX0VYRUNfMUFfMVRfMVIsCi0JCSBBTUxfRkxBR1NfRVhFQ18xQV8xVF8xUiB8IEFNTF9DT05TVEFOVCksCi0vKiAyQyAqLyBBQ1BJX09QKCJGaW5kU2V0TGVmdEJpdCIsIEFSR1BfRklORF9TRVRfTEVGVF9CSVRfT1AsCi0JCSBBUkdJX0ZJTkRfU0VUX0xFRlRfQklUX09QLCBBQ1BJX1RZUEVfQU5ZLAotCQkgQU1MX0NMQVNTX0VYRUNVVEUsIEFNTF9UWVBFX0VYRUNfMUFfMVRfMVIsCi0JCSBBTUxfRkxBR1NfRVhFQ18xQV8xVF8xUiB8IEFNTF9DT05TVEFOVCksCi0vKiAyRCAqLyBBQ1BJX09QKCJGaW5kU2V0UmlnaHRCaXQiLCBBUkdQX0ZJTkRfU0VUX1JJR0hUX0JJVF9PUCwKLQkJIEFSR0lfRklORF9TRVRfUklHSFRfQklUX09QLCBBQ1BJX1RZUEVfQU5ZLAotCQkgQU1MX0NMQVNTX0VYRUNVVEUsIEFNTF9UWVBFX0VYRUNfMUFfMVRfMVIsCi0JCSBBTUxfRkxBR1NfRVhFQ18xQV8xVF8xUiB8IEFNTF9DT05TVEFOVCksCi0vKiAyRSAqLyBBQ1BJX09QKCJEZXJlZk9mIiwgQVJHUF9ERVJFRl9PRl9PUCwgQVJHSV9ERVJFRl9PRl9PUCwKLQkJIEFDUElfVFlQRV9BTlksIEFNTF9DTEFTU19FWEVDVVRFLAotCQkgQU1MX1RZUEVfRVhFQ18xQV8wVF8xUiwgQU1MX0ZMQUdTX0VYRUNfMUFfMFRfMVIpLAotLyogMkYgKi8gQUNQSV9PUCgiTm90aWZ5IiwgQVJHUF9OT1RJRllfT1AsIEFSR0lfTk9USUZZX09QLAotCQkgQUNQSV9UWVBFX0FOWSwgQU1MX0NMQVNTX0VYRUNVVEUsCi0JCSBBTUxfVFlQRV9FWEVDXzJBXzBUXzBSLCBBTUxfRkxBR1NfRVhFQ18yQV8wVF8wUiksCi0vKiAzMCAqLyBBQ1BJX09QKCJTaXplT2YiLCBBUkdQX1NJWkVfT0ZfT1AsIEFSR0lfU0laRV9PRl9PUCwKLQkJIEFDUElfVFlQRV9BTlksIEFNTF9DTEFTU19FWEVDVVRFLAotCQkgQU1MX1RZUEVfRVhFQ18xQV8wVF8xUiwKLQkJIEFNTF9GTEFHU19FWEVDXzFBXzBUXzFSIHwgQU1MX05PX09QRVJBTkRfUkVTT0xWRSksCi0vKiAzMSAqLyBBQ1BJX09QKCJJbmRleCIsIEFSR1BfSU5ERVhfT1AsIEFSR0lfSU5ERVhfT1AsIEFDUElfVFlQRV9BTlksCi0JCSBBTUxfQ0xBU1NfRVhFQ1VURSwgQU1MX1RZUEVfRVhFQ18yQV8xVF8xUiwKLQkJIEFNTF9GTEFHU19FWEVDXzJBXzFUXzFSKSwKLS8qIDMyICovIEFDUElfT1AoIk1hdGNoIiwgQVJHUF9NQVRDSF9PUCwgQVJHSV9NQVRDSF9PUCwgQUNQSV9UWVBFX0FOWSwKLQkJIEFNTF9DTEFTU19FWEVDVVRFLCBBTUxfVFlQRV9FWEVDXzZBXzBUXzFSLAotCQkgQU1MX0ZMQUdTX0VYRUNfNkFfMFRfMVIgfCBBTUxfQ09OU1RBTlQpLAotLyogMzMgKi8gQUNQSV9PUCgiQ3JlYXRlRFdvcmRGaWVsZCIsIEFSR1BfQ1JFQVRFX0RXT1JEX0ZJRUxEX09QLAotCQkgQVJHSV9DUkVBVEVfRFdPUkRfRklFTERfT1AsCi0JCSBBQ1BJX1RZUEVfQlVGRkVSX0ZJRUxELCBBTUxfQ0xBU1NfQ1JFQVRFLAotCQkgQU1MX1RZUEVfQ1JFQVRFX0ZJRUxELAotCQkgQU1MX0hBU19BUkdTIHwgQU1MX05TT0JKRUNUIHwgQU1MX05TTk9ERSB8Ci0JCSBBTUxfREVGRVIgfCBBTUxfQ1JFQVRFKSwKLS8qIDM0ICovIEFDUElfT1AoIkNyZWF0ZVdvcmRGaWVsZCIsIEFSR1BfQ1JFQVRFX1dPUkRfRklFTERfT1AsCi0JCSBBUkdJX0NSRUFURV9XT1JEX0ZJRUxEX09QLAotCQkgQUNQSV9UWVBFX0JVRkZFUl9GSUVMRCwgQU1MX0NMQVNTX0NSRUFURSwKLQkJIEFNTF9UWVBFX0NSRUFURV9GSUVMRCwKLQkJIEFNTF9IQVNfQVJHUyB8IEFNTF9OU09CSkVDVCB8IEFNTF9OU05PREUgfAotCQkgQU1MX0RFRkVSIHwgQU1MX0NSRUFURSksCi0vKiAzNSAqLyBBQ1BJX09QKCJDcmVhdGVCeXRlRmllbGQiLCBBUkdQX0NSRUFURV9CWVRFX0ZJRUxEX09QLAotCQkgQVJHSV9DUkVBVEVfQllURV9GSUVMRF9PUCwKLQkJIEFDUElfVFlQRV9CVUZGRVJfRklFTEQsIEFNTF9DTEFTU19DUkVBVEUsCi0JCSBBTUxfVFlQRV9DUkVBVEVfRklFTEQsCi0JCSBBTUxfSEFTX0FSR1MgfCBBTUxfTlNPQkpFQ1QgfCBBTUxfTlNOT0RFIHwKLQkJIEFNTF9ERUZFUiB8IEFNTF9DUkVBVEUpLAotLyogMzYgKi8gQUNQSV9PUCgiQ3JlYXRlQml0RmllbGQiLCBBUkdQX0NSRUFURV9CSVRfRklFTERfT1AsCi0JCSBBUkdJX0NSRUFURV9CSVRfRklFTERfT1AsCi0JCSBBQ1BJX1RZUEVfQlVGRkVSX0ZJRUxELCBBTUxfQ0xBU1NfQ1JFQVRFLAotCQkgQU1MX1RZUEVfQ1JFQVRFX0ZJRUxELAotCQkgQU1MX0hBU19BUkdTIHwgQU1MX05TT0JKRUNUIHwgQU1MX05TTk9ERSB8Ci0JCSBBTUxfREVGRVIgfCBBTUxfQ1JFQVRFKSwKLS8qIDM3ICovIEFDUElfT1AoIk9iamVjdFR5cGUiLCBBUkdQX1RZUEVfT1AsIEFSR0lfVFlQRV9PUCwKLQkJIEFDUElfVFlQRV9BTlksIEFNTF9DTEFTU19FWEVDVVRFLAotCQkgQU1MX1RZUEVfRVhFQ18xQV8wVF8xUiwKLQkJIEFNTF9GTEFHU19FWEVDXzFBXzBUXzFSIHwgQU1MX05PX09QRVJBTkRfUkVTT0xWRSksCi0vKiAzOCAqLyBBQ1BJX09QKCJMQW5kIiwgQVJHUF9MQU5EX09QLCBBUkdJX0xBTkRfT1AsIEFDUElfVFlQRV9BTlksCi0JCSBBTUxfQ0xBU1NfRVhFQ1VURSwgQU1MX1RZUEVfRVhFQ18yQV8wVF8xUiwKLQkJIEFNTF9GTEFHU19FWEVDXzJBXzBUXzFSIHwgQU1MX0xPR0lDQUxfTlVNRVJJQyB8IEFNTF9DT05TVEFOVCksCi0vKiAzOSAqLyBBQ1BJX09QKCJMT3IiLCBBUkdQX0xPUl9PUCwgQVJHSV9MT1JfT1AsIEFDUElfVFlQRV9BTlksCi0JCSBBTUxfQ0xBU1NfRVhFQ1VURSwgQU1MX1RZUEVfRVhFQ18yQV8wVF8xUiwKLQkJIEFNTF9GTEFHU19FWEVDXzJBXzBUXzFSIHwgQU1MX0xPR0lDQUxfTlVNRVJJQyB8IEFNTF9DT05TVEFOVCksCi0vKiAzQSAqLyBBQ1BJX09QKCJMTm90IiwgQVJHUF9MTk9UX09QLCBBUkdJX0xOT1RfT1AsIEFDUElfVFlQRV9BTlksCi0JCSBBTUxfQ0xBU1NfRVhFQ1VURSwgQU1MX1RZUEVfRVhFQ18xQV8wVF8xUiwKLQkJIEFNTF9GTEFHU19FWEVDXzFBXzBUXzFSIHwgQU1MX0NPTlNUQU5UKSwKLS8qIDNCICovIEFDUElfT1AoIkxFcXVhbCIsIEFSR1BfTEVRVUFMX09QLCBBUkdJX0xFUVVBTF9PUCwKLQkJIEFDUElfVFlQRV9BTlksIEFNTF9DTEFTU19FWEVDVVRFLAotCQkgQU1MX1RZUEVfRVhFQ18yQV8wVF8xUiwKLQkJIEFNTF9GTEFHU19FWEVDXzJBXzBUXzFSIHwgQU1MX0xPR0lDQUwgfCBBTUxfQ09OU1RBTlQpLAotLyogM0MgKi8gQUNQSV9PUCgiTEdyZWF0ZXIiLCBBUkdQX0xHUkVBVEVSX09QLCBBUkdJX0xHUkVBVEVSX09QLAotCQkgQUNQSV9UWVBFX0FOWSwgQU1MX0NMQVNTX0VYRUNVVEUsCi0JCSBBTUxfVFlQRV9FWEVDXzJBXzBUXzFSLAotCQkgQU1MX0ZMQUdTX0VYRUNfMkFfMFRfMVIgfCBBTUxfTE9HSUNBTCB8IEFNTF9DT05TVEFOVCksCi0vKiAzRCAqLyBBQ1BJX09QKCJMTGVzcyIsIEFSR1BfTExFU1NfT1AsIEFSR0lfTExFU1NfT1AsIEFDUElfVFlQRV9BTlksCi0JCSBBTUxfQ0xBU1NfRVhFQ1VURSwgQU1MX1RZUEVfRVhFQ18yQV8wVF8xUiwKLQkJIEFNTF9GTEFHU19FWEVDXzJBXzBUXzFSIHwgQU1MX0xPR0lDQUwgfCBBTUxfQ09OU1RBTlQpLAotLyogM0UgKi8gQUNQSV9PUCgiSWYiLCBBUkdQX0lGX09QLCBBUkdJX0lGX09QLCBBQ1BJX1RZUEVfQU5ZLAotCQkgQU1MX0NMQVNTX0NPTlRST0wsIEFNTF9UWVBFX0NPTlRST0wsIEFNTF9IQVNfQVJHUyksCi0vKiAzRiAqLyBBQ1BJX09QKCJFbHNlIiwgQVJHUF9FTFNFX09QLCBBUkdJX0VMU0VfT1AsIEFDUElfVFlQRV9BTlksCi0JCSBBTUxfQ0xBU1NfQ09OVFJPTCwgQU1MX1RZUEVfQ09OVFJPTCwgQU1MX0hBU19BUkdTKSwKLS8qIDQwICovIEFDUElfT1AoIldoaWxlIiwgQVJHUF9XSElMRV9PUCwgQVJHSV9XSElMRV9PUCwgQUNQSV9UWVBFX0FOWSwKLQkJIEFNTF9DTEFTU19DT05UUk9MLCBBTUxfVFlQRV9DT05UUk9MLCBBTUxfSEFTX0FSR1MpLAotLyogNDEgKi8gQUNQSV9PUCgiTm9vcCIsIEFSR1BfTk9PUF9PUCwgQVJHSV9OT09QX09QLCBBQ1BJX1RZUEVfQU5ZLAotCQkgQU1MX0NMQVNTX0NPTlRST0wsIEFNTF9UWVBFX0NPTlRST0wsIDApLAotLyogNDIgKi8gQUNQSV9PUCgiUmV0dXJuIiwgQVJHUF9SRVRVUk5fT1AsIEFSR0lfUkVUVVJOX09QLAotCQkgQUNQSV9UWVBFX0FOWSwgQU1MX0NMQVNTX0NPTlRST0wsCi0JCSBBTUxfVFlQRV9DT05UUk9MLCBBTUxfSEFTX0FSR1MpLAotLyogNDMgKi8gQUNQSV9PUCgiQnJlYWsiLCBBUkdQX0JSRUFLX09QLCBBUkdJX0JSRUFLX09QLCBBQ1BJX1RZUEVfQU5ZLAotCQkgQU1MX0NMQVNTX0NPTlRST0wsIEFNTF9UWVBFX0NPTlRST0wsIDApLAotLyogNDQgKi8gQUNQSV9PUCgiQnJlYWtQb2ludCIsIEFSR1BfQlJFQUtfUE9JTlRfT1AsIEFSR0lfQlJFQUtfUE9JTlRfT1AsCi0JCSBBQ1BJX1RZUEVfQU5ZLCBBTUxfQ0xBU1NfQ09OVFJPTCwgQU1MX1RZUEVfQ09OVFJPTCwgMCksCi0vKiA0NSAqLyBBQ1BJX09QKCJPbmVzIiwgQVJHUF9PTkVTX09QLCBBUkdJX09ORVNfT1AsIEFDUElfVFlQRV9JTlRFR0VSLAotCQkgQU1MX0NMQVNTX0FSR1VNRU5ULCBBTUxfVFlQRV9DT05TVEFOVCwgQU1MX0NPTlNUQU5UKSwKLQotLyogUHJlZml4ZWQgb3Bjb2RlcyAoVHdvLWJ5dGUgb3Bjb2RlcyB3aXRoIGEgcHJlZml4IG9wKSAqLwotCi0vKiA0NiAqLyBBQ1BJX09QKCJNdXRleCIsIEFSR1BfTVVURVhfT1AsIEFSR0lfTVVURVhfT1AsIEFDUElfVFlQRV9NVVRFWCwKLQkJIEFNTF9DTEFTU19OQU1FRF9PQkpFQ1QsIEFNTF9UWVBFX05BTUVEX1NJTVBMRSwKLQkJIEFNTF9IQVNfQVJHUyB8IEFNTF9OU09CSkVDVCB8IEFNTF9OU09QQ09ERSB8Ci0JCSBBTUxfTlNOT0RFIHwgQU1MX05BTUVEKSwKLS8qIDQ3ICovIEFDUElfT1AoIkV2ZW50IiwgQVJHUF9FVkVOVF9PUCwgQVJHSV9FVkVOVF9PUCwgQUNQSV9UWVBFX0VWRU5ULAotCQkgQU1MX0NMQVNTX05BTUVEX09CSkVDVCwgQU1MX1RZUEVfTkFNRURfU0lNUExFLAotCQkgQU1MX05TT0JKRUNUIHwgQU1MX05TT1BDT0RFIHwgQU1MX05TTk9ERSB8IEFNTF9OQU1FRCksCi0vKiA0OCAqLyBBQ1BJX09QKCJDb25kUmVmT2YiLCBBUkdQX0NPTkRfUkVGX09GX09QLCBBUkdJX0NPTkRfUkVGX09GX09QLAotCQkgQUNQSV9UWVBFX0FOWSwgQU1MX0NMQVNTX0VYRUNVVEUsCi0JCSBBTUxfVFlQRV9FWEVDXzFBXzFUXzFSLCBBTUxfRkxBR1NfRVhFQ18xQV8xVF8xUiksCi0vKiA0OSAqLyBBQ1BJX09QKCJDcmVhdGVGaWVsZCIsIEFSR1BfQ1JFQVRFX0ZJRUxEX09QLAotCQkgQVJHSV9DUkVBVEVfRklFTERfT1AsIEFDUElfVFlQRV9CVUZGRVJfRklFTEQsCi0JCSBBTUxfQ0xBU1NfQ1JFQVRFLCBBTUxfVFlQRV9DUkVBVEVfRklFTEQsCi0JCSBBTUxfSEFTX0FSR1MgfCBBTUxfTlNPQkpFQ1QgfCBBTUxfTlNOT0RFIHwKLQkJIEFNTF9ERUZFUiB8IEFNTF9GSUVMRCB8IEFNTF9DUkVBVEUpLAotLyogNEEgKi8gQUNQSV9PUCgiTG9hZCIsIEFSR1BfTE9BRF9PUCwgQVJHSV9MT0FEX09QLCBBQ1BJX1RZUEVfQU5ZLAotCQkgQU1MX0NMQVNTX0VYRUNVVEUsIEFNTF9UWVBFX0VYRUNfMUFfMVRfMFIsCi0JCSBBTUxfRkxBR1NfRVhFQ18xQV8xVF8wUiksCi0vKiA0QiAqLyBBQ1BJX09QKCJTdGFsbCIsIEFSR1BfU1RBTExfT1AsIEFSR0lfU1RBTExfT1AsIEFDUElfVFlQRV9BTlksCi0JCSBBTUxfQ0xBU1NfRVhFQ1VURSwgQU1MX1RZUEVfRVhFQ18xQV8wVF8wUiwKLQkJIEFNTF9GTEFHU19FWEVDXzFBXzBUXzBSKSwKLS8qIDRDICovIEFDUElfT1AoIlNsZWVwIiwgQVJHUF9TTEVFUF9PUCwgQVJHSV9TTEVFUF9PUCwgQUNQSV9UWVBFX0FOWSwKLQkJIEFNTF9DTEFTU19FWEVDVVRFLCBBTUxfVFlQRV9FWEVDXzFBXzBUXzBSLAotCQkgQU1MX0ZMQUdTX0VYRUNfMUFfMFRfMFIpLAotLyogNEQgKi8gQUNQSV9PUCgiQWNxdWlyZSIsIEFSR1BfQUNRVUlSRV9PUCwgQVJHSV9BQ1FVSVJFX09QLAotCQkgQUNQSV9UWVBFX0FOWSwgQU1MX0NMQVNTX0VYRUNVVEUsCi0JCSBBTUxfVFlQRV9FWEVDXzJBXzBUXzFSLCBBTUxfRkxBR1NfRVhFQ18yQV8wVF8xUiksCi0vKiA0RSAqLyBBQ1BJX09QKCJTaWduYWwiLCBBUkdQX1NJR05BTF9PUCwgQVJHSV9TSUdOQUxfT1AsCi0JCSBBQ1BJX1RZUEVfQU5ZLCBBTUxfQ0xBU1NfRVhFQ1VURSwKLQkJIEFNTF9UWVBFX0VYRUNfMUFfMFRfMFIsIEFNTF9GTEFHU19FWEVDXzFBXzBUXzBSKSwKLS8qIDRGICovIEFDUElfT1AoIldhaXQiLCBBUkdQX1dBSVRfT1AsIEFSR0lfV0FJVF9PUCwgQUNQSV9UWVBFX0FOWSwKLQkJIEFNTF9DTEFTU19FWEVDVVRFLCBBTUxfVFlQRV9FWEVDXzJBXzBUXzFSLAotCQkgQU1MX0ZMQUdTX0VYRUNfMkFfMFRfMVIpLAotLyogNTAgKi8gQUNQSV9PUCgiUmVzZXQiLCBBUkdQX1JFU0VUX09QLCBBUkdJX1JFU0VUX09QLCBBQ1BJX1RZUEVfQU5ZLAotCQkgQU1MX0NMQVNTX0VYRUNVVEUsIEFNTF9UWVBFX0VYRUNfMUFfMFRfMFIsCi0JCSBBTUxfRkxBR1NfRVhFQ18xQV8wVF8wUiksCi0vKiA1MSAqLyBBQ1BJX09QKCJSZWxlYXNlIiwgQVJHUF9SRUxFQVNFX09QLCBBUkdJX1JFTEVBU0VfT1AsCi0JCSBBQ1BJX1RZUEVfQU5ZLCBBTUxfQ0xBU1NfRVhFQ1VURSwKLQkJIEFNTF9UWVBFX0VYRUNfMUFfMFRfMFIsIEFNTF9GTEFHU19FWEVDXzFBXzBUXzBSKSwKLS8qIDUyICovIEFDUElfT1AoIkZyb21CQ0QiLCBBUkdQX0ZST01fQkNEX09QLCBBUkdJX0ZST01fQkNEX09QLAotCQkgQUNQSV9UWVBFX0FOWSwgQU1MX0NMQVNTX0VYRUNVVEUsCi0JCSBBTUxfVFlQRV9FWEVDXzFBXzFUXzFSLAotCQkgQU1MX0ZMQUdTX0VYRUNfMUFfMVRfMVIgfCBBTUxfQ09OU1RBTlQpLAotLyogNTMgKi8gQUNQSV9PUCgiVG9CQ0QiLCBBUkdQX1RPX0JDRF9PUCwgQVJHSV9UT19CQ0RfT1AsIEFDUElfVFlQRV9BTlksCi0JCSBBTUxfQ0xBU1NfRVhFQ1VURSwgQU1MX1RZUEVfRVhFQ18xQV8xVF8xUiwKLQkJIEFNTF9GTEFHU19FWEVDXzFBXzFUXzFSIHwgQU1MX0NPTlNUQU5UKSwKLS8qIDU0ICovIEFDUElfT1AoIlVubG9hZCIsIEFSR1BfVU5MT0FEX09QLCBBUkdJX1VOTE9BRF9PUCwKLQkJIEFDUElfVFlQRV9BTlksIEFNTF9DTEFTU19FWEVDVVRFLAotCQkgQU1MX1RZUEVfRVhFQ18xQV8wVF8wUiwgQU1MX0ZMQUdTX0VYRUNfMUFfMFRfMFIpLAotLyogNTUgKi8gQUNQSV9PUCgiUmV2aXNpb24iLCBBUkdQX1JFVklTSU9OX09QLCBBUkdJX1JFVklTSU9OX09QLAotCQkgQUNQSV9UWVBFX0lOVEVHRVIsIEFNTF9DTEFTU19BUkdVTUVOVCwKLQkJIEFNTF9UWVBFX0NPTlNUQU5ULCAwKSwKLS8qIDU2ICovIEFDUElfT1AoIkRlYnVnIiwgQVJHUF9ERUJVR19PUCwgQVJHSV9ERUJVR19PUCwKLQkJIEFDUElfVFlQRV9MT0NBTF9SRUZFUkVOQ0UsIEFNTF9DTEFTU19BUkdVTUVOVCwKLQkJIEFNTF9UWVBFX0NPTlNUQU5ULCAwKSwKLS8qIDU3ICovIEFDUElfT1AoIkZhdGFsIiwgQVJHUF9GQVRBTF9PUCwgQVJHSV9GQVRBTF9PUCwgQUNQSV9UWVBFX0FOWSwKLQkJIEFNTF9DTEFTU19FWEVDVVRFLCBBTUxfVFlQRV9FWEVDXzNBXzBUXzBSLAotCQkgQU1MX0ZMQUdTX0VYRUNfM0FfMFRfMFIpLAotLyogNTggKi8gQUNQSV9PUCgiT3BlcmF0aW9uUmVnaW9uIiwgQVJHUF9SRUdJT05fT1AsIEFSR0lfUkVHSU9OX09QLAotCQkgQUNQSV9UWVBFX1JFR0lPTiwgQU1MX0NMQVNTX05BTUVEX09CSkVDVCwKLQkJIEFNTF9UWVBFX05BTUVEX0NPTVBMRVgsCi0JCSBBTUxfSEFTX0FSR1MgfCBBTUxfTlNPQkpFQ1QgfCBBTUxfTlNPUENPREUgfAotCQkgQU1MX05TTk9ERSB8IEFNTF9OQU1FRCB8IEFNTF9ERUZFUiksCi0vKiA1OSAqLyBBQ1BJX09QKCJGaWVsZCIsIEFSR1BfRklFTERfT1AsIEFSR0lfRklFTERfT1AsIEFDUElfVFlQRV9BTlksCi0JCSBBTUxfQ0xBU1NfTkFNRURfT0JKRUNULCBBTUxfVFlQRV9OQU1FRF9GSUVMRCwKLQkJIEFNTF9IQVNfQVJHUyB8IEFNTF9OU09CSkVDVCB8IEFNTF9OU09QQ09ERSB8IEFNTF9GSUVMRCksCi0vKiA1QSAqLyBBQ1BJX09QKCJEZXZpY2UiLCBBUkdQX0RFVklDRV9PUCwgQVJHSV9ERVZJQ0VfT1AsCi0JCSBBQ1BJX1RZUEVfREVWSUNFLCBBTUxfQ0xBU1NfTkFNRURfT0JKRUNULAotCQkgQU1MX1RZUEVfTkFNRURfTk9fT0JKLAotCQkgQU1MX0hBU19BUkdTIHwgQU1MX05TT0JKRUNUIHwgQU1MX05TT1BDT0RFIHwKLQkJIEFNTF9OU05PREUgfCBBTUxfTkFNRUQpLAotLyogNUIgKi8gQUNQSV9PUCgiUHJvY2Vzc29yIiwgQVJHUF9QUk9DRVNTT1JfT1AsIEFSR0lfUFJPQ0VTU09SX09QLAotCQkgQUNQSV9UWVBFX1BST0NFU1NPUiwgQU1MX0NMQVNTX05BTUVEX09CSkVDVCwKLQkJIEFNTF9UWVBFX05BTUVEX1NJTVBMRSwKLQkJIEFNTF9IQVNfQVJHUyB8IEFNTF9OU09CSkVDVCB8IEFNTF9OU09QQ09ERSB8Ci0JCSBBTUxfTlNOT0RFIHwgQU1MX05BTUVEKSwKLS8qIDVDICovIEFDUElfT1AoIlBvd2VyUmVzb3VyY2UiLCBBUkdQX1BPV0VSX1JFU19PUCwgQVJHSV9QT1dFUl9SRVNfT1AsCi0JCSBBQ1BJX1RZUEVfUE9XRVIsIEFNTF9DTEFTU19OQU1FRF9PQkpFQ1QsCi0JCSBBTUxfVFlQRV9OQU1FRF9TSU1QTEUsCi0JCSBBTUxfSEFTX0FSR1MgfCBBTUxfTlNPQkpFQ1QgfCBBTUxfTlNPUENPREUgfAotCQkgQU1MX05TTk9ERSB8IEFNTF9OQU1FRCksCi0vKiA1RCAqLyBBQ1BJX09QKCJUaGVybWFsWm9uZSIsIEFSR1BfVEhFUk1BTF9aT05FX09QLAotCQkgQVJHSV9USEVSTUFMX1pPTkVfT1AsIEFDUElfVFlQRV9USEVSTUFMLAotCQkgQU1MX0NMQVNTX05BTUVEX09CSkVDVCwgQU1MX1RZUEVfTkFNRURfTk9fT0JKLAotCQkgQU1MX0hBU19BUkdTIHwgQU1MX05TT0JKRUNUIHwgQU1MX05TT1BDT0RFIHwKLQkJIEFNTF9OU05PREUgfCBBTUxfTkFNRUQpLAotLyogNUUgKi8gQUNQSV9PUCgiSW5kZXhGaWVsZCIsIEFSR1BfSU5ERVhfRklFTERfT1AsIEFSR0lfSU5ERVhfRklFTERfT1AsCi0JCSBBQ1BJX1RZUEVfQU5ZLCBBTUxfQ0xBU1NfTkFNRURfT0JKRUNULAotCQkgQU1MX1RZUEVfTkFNRURfRklFTEQsCi0JCSBBTUxfSEFTX0FSR1MgfCBBTUxfTlNPQkpFQ1QgfCBBTUxfTlNPUENPREUgfCBBTUxfRklFTEQpLAotLyogNUYgKi8gQUNQSV9PUCgiQmFua0ZpZWxkIiwgQVJHUF9CQU5LX0ZJRUxEX09QLCBBUkdJX0JBTktfRklFTERfT1AsCi0JCSBBQ1BJX1RZUEVfTE9DQUxfQkFOS19GSUVMRCwgQU1MX0NMQVNTX05BTUVEX09CSkVDVCwKLQkJIEFNTF9UWVBFX05BTUVEX0ZJRUxELAotCQkgQU1MX0hBU19BUkdTIHwgQU1MX05TT0JKRUNUIHwgQU1MX05TT1BDT0RFIHwgQU1MX0ZJRUxEIHwKLQkJIEFNTF9ERUZFUiksCi0KLS8qIEludGVybmFsIG9wY29kZXMgdGhhdCBtYXAgdG8gaW52YWxpZCBBTUwgb3Bjb2RlcyAqLwotCi0vKiA2MCAqLyBBQ1BJX09QKCJMTm90RXF1YWwiLCBBUkdQX0xOT1RFUVVBTF9PUCwgQVJHSV9MTk9URVFVQUxfT1AsCi0JCSBBQ1BJX1RZUEVfQU5ZLCBBTUxfQ0xBU1NfSU5URVJOQUwsCi0JCSBBTUxfVFlQRV9CT0dVUywgQU1MX0hBU19BUkdTIHwgQU1MX0NPTlNUQU5UKSwKLS8qIDYxICovIEFDUElfT1AoIkxMZXNzRXF1YWwiLCBBUkdQX0xMRVNTRVFVQUxfT1AsIEFSR0lfTExFU1NFUVVBTF9PUCwKLQkJIEFDUElfVFlQRV9BTlksIEFNTF9DTEFTU19JTlRFUk5BTCwKLQkJIEFNTF9UWVBFX0JPR1VTLCBBTUxfSEFTX0FSR1MgfCBBTUxfQ09OU1RBTlQpLAotLyogNjIgKi8gQUNQSV9PUCgiTEdyZWF0ZXJFcXVhbCIsIEFSR1BfTEdSRUFURVJFUVVBTF9PUCwKLQkJIEFSR0lfTEdSRUFURVJFUVVBTF9PUCwgQUNQSV9UWVBFX0FOWSwKLQkJIEFNTF9DTEFTU19JTlRFUk5BTCwgQU1MX1RZUEVfQk9HVVMsCi0JCSBBTUxfSEFTX0FSR1MgfCBBTUxfQ09OU1RBTlQpLAotLyogNjMgKi8gQUNQSV9PUCgiLU5hbWVQYXRoLSIsIEFSR1BfTkFNRVBBVEhfT1AsIEFSR0lfTkFNRVBBVEhfT1AsCi0JCSBBQ1BJX1RZUEVfTE9DQUxfUkVGRVJFTkNFLCBBTUxfQ0xBU1NfQVJHVU1FTlQsCi0JCSBBTUxfVFlQRV9MSVRFUkFMLCBBTUxfTlNPQkpFQ1QgfCBBTUxfTlNOT0RFKSwKLS8qIDY0ICovIEFDUElfT1AoIi1NZXRob2RDYWxsLSIsIEFSR1BfTUVUSE9EQ0FMTF9PUCwgQVJHSV9NRVRIT0RDQUxMX09QLAotCQkgQUNQSV9UWVBFX01FVEhPRCwgQU1MX0NMQVNTX01FVEhPRF9DQUxMLAotCQkgQU1MX1RZUEVfTUVUSE9EX0NBTEwsCi0JCSBBTUxfSEFTX0FSR1MgfCBBTUxfTlNPQkpFQ1QgfCBBTUxfTlNOT0RFKSwKLS8qIDY1ICovIEFDUElfT1AoIi1CeXRlTGlzdC0iLCBBUkdQX0JZVEVMSVNUX09QLCBBUkdJX0JZVEVMSVNUX09QLAotCQkgQUNQSV9UWVBFX0FOWSwgQU1MX0NMQVNTX0FSR1VNRU5ULAotCQkgQU1MX1RZUEVfTElURVJBTCwgMCksCi0vKiA2NiAqLyBBQ1BJX09QKCItUmVzZXJ2ZWRGaWVsZC0iLCBBUkdQX1JFU0VSVkVERklFTERfT1AsCi0JCSBBUkdJX1JFU0VSVkVERklFTERfT1AsIEFDUElfVFlQRV9BTlksCi0JCSBBTUxfQ0xBU1NfSU5URVJOQUwsIEFNTF9UWVBFX0JPR1VTLCAwKSwKLS8qIDY3ICovIEFDUElfT1AoIi1OYW1lZEZpZWxkLSIsIEFSR1BfTkFNRURGSUVMRF9PUCwgQVJHSV9OQU1FREZJRUxEX09QLAotCQkgQUNQSV9UWVBFX0FOWSwgQU1MX0NMQVNTX0lOVEVSTkFMLAotCQkgQU1MX1RZUEVfQk9HVVMsCi0JCSBBTUxfTlNPQkpFQ1QgfCBBTUxfTlNPUENPREUgfCBBTUxfTlNOT0RFIHwgQU1MX05BTUVEKSwKLS8qIDY4ICovIEFDUElfT1AoIi1BY2Nlc3NGaWVsZC0iLCBBUkdQX0FDQ0VTU0ZJRUxEX09QLAotCQkgQVJHSV9BQ0NFU1NGSUVMRF9PUCwgQUNQSV9UWVBFX0FOWSwKLQkJIEFNTF9DTEFTU19JTlRFUk5BTCwgQU1MX1RZUEVfQk9HVVMsIDApLAotLyogNjkgKi8gQUNQSV9PUCgiLVN0YXRpY1N0cmluZyIsIEFSR1BfU1RBVElDU1RSSU5HX09QLAotCQkgQVJHSV9TVEFUSUNTVFJJTkdfT1AsIEFDUElfVFlQRV9BTlksCi0JCSBBTUxfQ0xBU1NfSU5URVJOQUwsIEFNTF9UWVBFX0JPR1VTLCAwKSwKLS8qIDZBICovIEFDUElfT1AoIi1SZXR1cm4gVmFsdWUtIiwgQVJHX05PTkUsIEFSR19OT05FLCBBQ1BJX1RZUEVfQU5ZLAotCQkgQU1MX0NMQVNTX1JFVFVSTl9WQUxVRSwgQU1MX1RZUEVfUkVUVVJOLAotCQkgQU1MX0hBU19BUkdTIHwgQU1MX0hBU19SRVRWQUwpLAotLyogNkIgKi8gQUNQSV9PUCgiLVVOS05PV05fT1AtIiwgQVJHX05PTkUsIEFSR19OT05FLCBBQ1BJX1RZUEVfSU5WQUxJRCwKLQkJIEFNTF9DTEFTU19VTktOT1dOLCBBTUxfVFlQRV9CT0dVUywgQU1MX0hBU19BUkdTKSwKLS8qIDZDICovIEFDUElfT1AoIi1BU0NJSV9PTkxZLSIsIEFSR19OT05FLCBBUkdfTk9ORSwgQUNQSV9UWVBFX0FOWSwKLQkJIEFNTF9DTEFTU19BU0NJSSwgQU1MX1RZUEVfQk9HVVMsIEFNTF9IQVNfQVJHUyksCi0vKiA2RCAqLyBBQ1BJX09QKCItUFJFRklYX09OTFktIiwgQVJHX05PTkUsIEFSR19OT05FLCBBQ1BJX1RZUEVfQU5ZLAotCQkgQU1MX0NMQVNTX1BSRUZJWCwgQU1MX1RZUEVfQk9HVVMsIEFNTF9IQVNfQVJHUyksCi0KLS8qIEFDUEkgMi4wIG9wY29kZXMgKi8KLQotLyogNkUgKi8gQUNQSV9PUCgiUXdvcmRDb25zdCIsIEFSR1BfUVdPUkRfT1AsIEFSR0lfUVdPUkRfT1AsCi0JCSBBQ1BJX1RZUEVfSU5URUdFUiwgQU1MX0NMQVNTX0FSR1VNRU5ULAotCQkgQU1MX1RZUEVfTElURVJBTCwgQU1MX0NPTlNUQU5UKSwKLQkvKiA2RiAqLyBBQ1BJX09QKCJQYWNrYWdlIiwgLyogVmFyICovIEFSR1BfVkFSX1BBQ0tBR0VfT1AsCi0JCQkgQVJHSV9WQVJfUEFDS0FHRV9PUCwgQUNQSV9UWVBFX1BBQ0tBR0UsCi0JCQkgQU1MX0NMQVNTX0NSRUFURSwgQU1MX1RZUEVfQ1JFQVRFX09CSkVDVCwKLQkJCSBBTUxfSEFTX0FSR1MgfCBBTUxfREVGRVIpLAotLyogNzAgKi8gQUNQSV9PUCgiQ29uY2F0ZW5hdGVSZXNUZW1wbGF0ZSIsIEFSR1BfQ09OQ0FUX1JFU19PUCwKLQkJIEFSR0lfQ09OQ0FUX1JFU19PUCwgQUNQSV9UWVBFX0FOWSwKLQkJIEFNTF9DTEFTU19FWEVDVVRFLCBBTUxfVFlQRV9FWEVDXzJBXzFUXzFSLAotCQkgQU1MX0ZMQUdTX0VYRUNfMkFfMVRfMVIgfCBBTUxfQ09OU1RBTlQpLAotLyogNzEgKi8gQUNQSV9PUCgiTW9kIiwgQVJHUF9NT0RfT1AsIEFSR0lfTU9EX09QLCBBQ1BJX1RZUEVfQU5ZLAotCQkgQU1MX0NMQVNTX0VYRUNVVEUsIEFNTF9UWVBFX0VYRUNfMkFfMVRfMVIsCi0JCSBBTUxfRkxBR1NfRVhFQ18yQV8xVF8xUiB8IEFNTF9DT05TVEFOVCksCi0vKiA3MiAqLyBBQ1BJX09QKCJDcmVhdGVRV29yZEZpZWxkIiwgQVJHUF9DUkVBVEVfUVdPUkRfRklFTERfT1AsCi0JCSBBUkdJX0NSRUFURV9RV09SRF9GSUVMRF9PUCwKLQkJIEFDUElfVFlQRV9CVUZGRVJfRklFTEQsIEFNTF9DTEFTU19DUkVBVEUsCi0JCSBBTUxfVFlQRV9DUkVBVEVfRklFTEQsCi0JCSBBTUxfSEFTX0FSR1MgfCBBTUxfTlNPQkpFQ1QgfCBBTUxfTlNOT0RFIHwKLQkJIEFNTF9ERUZFUiB8IEFNTF9DUkVBVEUpLAotLyogNzMgKi8gQUNQSV9PUCgiVG9CdWZmZXIiLCBBUkdQX1RPX0JVRkZFUl9PUCwgQVJHSV9UT19CVUZGRVJfT1AsCi0JCSBBQ1BJX1RZUEVfQU5ZLCBBTUxfQ0xBU1NfRVhFQ1VURSwKLQkJIEFNTF9UWVBFX0VYRUNfMUFfMVRfMVIsCi0JCSBBTUxfRkxBR1NfRVhFQ18xQV8xVF8xUiB8IEFNTF9DT05TVEFOVCksCi0vKiA3NCAqLyBBQ1BJX09QKCJUb0RlY2ltYWxTdHJpbmciLCBBUkdQX1RPX0RFQ19TVFJfT1AsCi0JCSBBUkdJX1RPX0RFQ19TVFJfT1AsIEFDUElfVFlQRV9BTlksCi0JCSBBTUxfQ0xBU1NfRVhFQ1VURSwgQU1MX1RZUEVfRVhFQ18xQV8xVF8xUiwKLQkJIEFNTF9GTEFHU19FWEVDXzFBXzFUXzFSIHwgQU1MX0NPTlNUQU5UKSwKLS8qIDc1ICovIEFDUElfT1AoIlRvSGV4U3RyaW5nIiwgQVJHUF9UT19IRVhfU1RSX09QLCBBUkdJX1RPX0hFWF9TVFJfT1AsCi0JCSBBQ1BJX1RZUEVfQU5ZLCBBTUxfQ0xBU1NfRVhFQ1VURSwKLQkJIEFNTF9UWVBFX0VYRUNfMUFfMVRfMVIsCi0JCSBBTUxfRkxBR1NfRVhFQ18xQV8xVF8xUiB8IEFNTF9DT05TVEFOVCksCi0vKiA3NiAqLyBBQ1BJX09QKCJUb0ludGVnZXIiLCBBUkdQX1RPX0lOVEVHRVJfT1AsIEFSR0lfVE9fSU5URUdFUl9PUCwKLQkJIEFDUElfVFlQRV9BTlksIEFNTF9DTEFTU19FWEVDVVRFLAotCQkgQU1MX1RZUEVfRVhFQ18xQV8xVF8xUiwKLQkJIEFNTF9GTEFHU19FWEVDXzFBXzFUXzFSIHwgQU1MX0NPTlNUQU5UKSwKLS8qIDc3ICovIEFDUElfT1AoIlRvU3RyaW5nIiwgQVJHUF9UT19TVFJJTkdfT1AsIEFSR0lfVE9fU1RSSU5HX09QLAotCQkgQUNQSV9UWVBFX0FOWSwgQU1MX0NMQVNTX0VYRUNVVEUsCi0JCSBBTUxfVFlQRV9FWEVDXzJBXzFUXzFSLAotCQkgQU1MX0ZMQUdTX0VYRUNfMkFfMVRfMVIgfCBBTUxfQ09OU1RBTlQpLAotLyogNzggKi8gQUNQSV9PUCgiQ29weU9iamVjdCIsIEFSR1BfQ09QWV9PUCwgQVJHSV9DT1BZX09QLAotCQkgQUNQSV9UWVBFX0FOWSwgQU1MX0NMQVNTX0VYRUNVVEUsCi0JCSBBTUxfVFlQRV9FWEVDXzFBXzFUXzFSLCBBTUxfRkxBR1NfRVhFQ18xQV8xVF8xUiksCi0vKiA3OSAqLyBBQ1BJX09QKCJNaWQiLCBBUkdQX01JRF9PUCwgQVJHSV9NSURfT1AsIEFDUElfVFlQRV9BTlksCi0JCSBBTUxfQ0xBU1NfRVhFQ1VURSwgQU1MX1RZUEVfRVhFQ18zQV8xVF8xUiwKLQkJIEFNTF9GTEFHU19FWEVDXzNBXzFUXzFSIHwgQU1MX0NPTlNUQU5UKSwKLS8qIDdBICovIEFDUElfT1AoIkNvbnRpbnVlIiwgQVJHUF9DT05USU5VRV9PUCwgQVJHSV9DT05USU5VRV9PUCwKLQkJIEFDUElfVFlQRV9BTlksIEFNTF9DTEFTU19DT05UUk9MLCBBTUxfVFlQRV9DT05UUk9MLCAwKSwKLS8qIDdCICovIEFDUElfT1AoIkxvYWRUYWJsZSIsIEFSR1BfTE9BRF9UQUJMRV9PUCwgQVJHSV9MT0FEX1RBQkxFX09QLAotCQkgQUNQSV9UWVBFX0FOWSwgQU1MX0NMQVNTX0VYRUNVVEUsCi0JCSBBTUxfVFlQRV9FWEVDXzZBXzBUXzFSLCBBTUxfRkxBR1NfRVhFQ182QV8wVF8xUiksCi0vKiA3QyAqLyBBQ1BJX09QKCJEYXRhVGFibGVSZWdpb24iLCBBUkdQX0RBVEFfUkVHSU9OX09QLAotCQkgQVJHSV9EQVRBX1JFR0lPTl9PUCwgQUNQSV9UWVBFX1JFR0lPTiwKLQkJIEFNTF9DTEFTU19OQU1FRF9PQkpFQ1QsIEFNTF9UWVBFX05BTUVEX0NPTVBMRVgsCi0JCSBBTUxfSEFTX0FSR1MgfCBBTUxfTlNPQkpFQ1QgfCBBTUxfTlNPUENPREUgfAotCQkgQU1MX05TTk9ERSB8IEFNTF9OQU1FRCB8IEFNTF9ERUZFUiksCi0vKiA3RCAqLyBBQ1BJX09QKCJbRXZhbFN1YlRyZWVdIiwgQVJHUF9TQ09QRV9PUCwgQVJHSV9TQ09QRV9PUCwKLQkJIEFDUElfVFlQRV9BTlksIEFNTF9DTEFTU19OQU1FRF9PQkpFQ1QsCi0JCSBBTUxfVFlQRV9OQU1FRF9OT19PQkosCi0JCSBBTUxfSEFTX0FSR1MgfCBBTUxfTlNPQkpFQ1QgfCBBTUxfTlNPUENPREUgfCBBTUxfTlNOT0RFKSwKLQotLyogQUNQSSAzLjAgb3Bjb2RlcyAqLwotCi0vKiA3RSAqLyBBQ1BJX09QKCJUaW1lciIsIEFSR1BfVElNRVJfT1AsIEFSR0lfVElNRVJfT1AsIEFDUElfVFlQRV9BTlksCi0JCSBBTUxfQ0xBU1NfRVhFQ1VURSwgQU1MX1RZUEVfRVhFQ18wQV8wVF8xUiwKLQkJIEFNTF9GTEFHU19FWEVDXzBBXzBUXzFSKQotCi0vKiEgW0VuZF0gbm8gc291cmNlIGNvZGUgdHJhbnNsYXRpb24gISovCi19OwotCi0vKgotICogVGhpcyB0YWJsZSBpcyBkaXJlY3RseSBpbmRleGVkIGJ5IHRoZSBvcGNvZGVzLCBhbmQgcmV0dXJucyBhbgotICogaW5kZXggaW50byB0aGUgdGFibGUgYWJvdmUKLSAqLwotc3RhdGljIGNvbnN0IHU4IGFjcGlfZ2JsX3Nob3J0X29wX2luZGV4WzI1Nl0gPSB7Ci0vKiAgICAgICAgICAgICAgMCAgICAgMSAgICAgMiAgICAgMyAgICAgNCAgICAgNSAgICAgNiAgICAgNyAgKi8KLS8qICAgICAgICAgICAgICA4ICAgICA5ICAgICBBICAgICBCICAgICBDICAgICBEICAgICBFICAgICBGICAqLwotLyogMHgwMCAqLyAweDAwLCAweDAxLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCAweDAyLCBfVU5LLAotLyogMHgwOCAqLyAweDAzLCBfVU5LLCAweDA0LCAweDA1LCAweDA2LCAweDA3LCAweDZFLCBfVU5LLAotLyogMHgxMCAqLyAweDA4LCAweDA5LCAweDBhLCAweDZGLCAweDBiLCBfVU5LLCBfVU5LLCBfVU5LLAotLyogMHgxOCAqLyBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLAotLyogMHgyMCAqLyBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLAotLyogMHgyOCAqLyBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCAweDYzLCBfUEZYLCBfUEZYLAotLyogMHgzMCAqLyAweDY3LCAweDY2LCAweDY4LCAweDY1LCAweDY5LCAweDY0LCAweDZBLCAweDdELAotLyogMHgzOCAqLyBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLAotLyogMHg0MCAqLyBfVU5LLCBfQVNDLCBfQVNDLCBfQVNDLCBfQVNDLCBfQVNDLCBfQVNDLCBfQVNDLAotLyogMHg0OCAqLyBfQVNDLCBfQVNDLCBfQVNDLCBfQVNDLCBfQVNDLCBfQVNDLCBfQVNDLCBfQVNDLAotLyogMHg1MCAqLyBfQVNDLCBfQVNDLCBfQVNDLCBfQVNDLCBfQVNDLCBfQVNDLCBfQVNDLCBfQVNDLAotLyogMHg1OCAqLyBfQVNDLCBfQVNDLCBfQVNDLCBfVU5LLCBfUEZYLCBfVU5LLCBfUEZYLCBfQVNDLAotLyogMHg2MCAqLyAweDBjLCAweDBkLCAweDBlLCAweDBmLCAweDEwLCAweDExLCAweDEyLCAweDEzLAotLyogMHg2OCAqLyAweDE0LCAweDE1LCAweDE2LCAweDE3LCAweDE4LCAweDE5LCAweDFhLCBfVU5LLAotLyogMHg3MCAqLyAweDFiLCAweDFjLCAweDFkLCAweDFlLCAweDFmLCAweDIwLCAweDIxLCAweDIyLAotLyogMHg3OCAqLyAweDIzLCAweDI0LCAweDI1LCAweDI2LCAweDI3LCAweDI4LCAweDI5LCAweDJhLAotLyogMHg4MCAqLyAweDJiLCAweDJjLCAweDJkLCAweDJlLCAweDcwLCAweDcxLCAweDJmLCAweDMwLAotLyogMHg4OCAqLyAweDMxLCAweDMyLCAweDMzLCAweDM0LCAweDM1LCAweDM2LCAweDM3LCAweDcyLAotLyogMHg5MCAqLyAweDM4LCAweDM5LCAweDNhLCAweDNiLCAweDNjLCAweDNkLCAweDczLCAweDc0LAotLyogMHg5OCAqLyAweDc1LCAweDc2LCBfVU5LLCBfVU5LLCAweDc3LCAweDc4LCAweDc5LCAweDdBLAotLyogMHhBMCAqLyAweDNlLCAweDNmLCAweDQwLCAweDQxLCAweDQyLCAweDQzLCAweDYwLCAweDYxLAotLyogMHhBOCAqLyAweDYyLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLAotLyogMHhCMCAqLyBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLAotLyogMHhCOCAqLyBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLAotLyogMHhDMCAqLyBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLAotLyogMHhDOCAqLyBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCAweDQ0LCBfVU5LLCBfVU5LLCBfVU5LLAotLyogMHhEMCAqLyBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLAotLyogMHhEOCAqLyBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLAotLyogMHhFMCAqLyBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLAotLyogMHhFOCAqLyBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLAotLyogMHhGMCAqLyBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLAotLyogMHhGOCAqLyBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCBfVU5LLCAweDQ1LAotfTsKLQotLyoKLSAqIFRoaXMgdGFibGUgaXMgaW5kZXhlZCBieSB0aGUgc2Vjb25kIG9wY29kZSBvZiB0aGUgZXh0ZW5kZWQgb3Bjb2RlCi0gKiBwYWlyLiAgSXQgcmV0dXJucyBhbiBpbmRleCBpbnRvIHRoZSBvcGNvZGUgdGFibGUgKGFjcGlfZ2JsX2FtbF9vcF9pbmZvKQotICovCi1zdGF0aWMgY29uc3QgdTggYWNwaV9nYmxfbG9uZ19vcF9pbmRleFtOVU1fRVhURU5ERURfT1BDT0RFXSA9IHsKLS8qICAgICAgICAgICAgICAwICAgICAxICAgICAyICAgICAzICAgICA0ICAgICA1ICAgICA2ICAgICA3ICAqLwotLyogICAgICAgICAgICAgIDggICAgIDkgICAgIEEgICAgIEIgICAgIEMgICAgIEQgICAgIEUgICAgIEYgICovCi0vKiAweDAwICovIF9VTkssIDB4NDYsIDB4NDcsIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssCi0vKiAweDA4ICovIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssCi0vKiAweDEwICovIF9VTkssIF9VTkssIDB4NDgsIDB4NDksIF9VTkssIF9VTkssIF9VTkssIF9VTkssCi0vKiAweDE4ICovIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIDB4N0IsCi0vKiAweDIwICovIDB4NGEsIDB4NGIsIDB4NGMsIDB4NGQsIDB4NGUsIDB4NGYsIDB4NTAsIDB4NTEsCi0vKiAweDI4ICovIDB4NTIsIDB4NTMsIDB4NTQsIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssCi0vKiAweDMwICovIDB4NTUsIDB4NTYsIDB4NTcsIDB4N2UsIF9VTkssIF9VTkssIF9VTkssIF9VTkssCi0vKiAweDM4ICovIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssCi0vKiAweDQwICovIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssCi0vKiAweDQ4ICovIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssCi0vKiAweDUwICovIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssCi0vKiAweDU4ICovIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssCi0vKiAweDYwICovIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssCi0vKiAweDY4ICovIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssCi0vKiAweDcwICovIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssCi0vKiAweDc4ICovIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssIF9VTkssCi0vKiAweDgwICovIDB4NTgsIDB4NTksIDB4NWEsIDB4NWIsIDB4NWMsIDB4NWQsIDB4NWUsIDB4NWYsCi0vKiAweDg4ICovIDB4N0MsCi19OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX3BzX2dldF9vcGNvZGVfaW5mbwotICoKLSAqIFBBUkFNRVRFUlM6ICBPcGNvZGUgICAgICAgICAgICAgIC0gVGhlIEFNTCBvcGNvZGUKLSAqCi0gKiBSRVRVUk46ICAgICAgQSBwb2ludGVyIHRvIHRoZSBpbmZvIGFib3V0IHRoZSBvcGNvZGUuCi0gKgotICogREVTQ1JJUFRJT046IEZpbmQgQU1MIG9wY29kZSBkZXNjcmlwdGlvbiBiYXNlZCBvbiB0aGUgb3Bjb2RlLgotICogICAgICAgICAgICAgIE5PVEU6IFRoaXMgcHJvY2VkdXJlIG11c3QgQUxXQVlTIHJldHVybiBhIHZhbGlkIHBvaW50ZXIhCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotY29uc3Qgc3RydWN0IGFjcGlfb3Bjb2RlX2luZm8gKmFjcGlfcHNfZ2V0X29wY29kZV9pbmZvKHUxNiBvcGNvZGUpCi17Ci0JQUNQSV9GVU5DVElPTl9OQU1FKHBzX2dldF9vcGNvZGVfaW5mbyk7Ci0KLQkvKgotCSAqIERldGVjdCBub3JtYWwgOC1iaXQgb3Bjb2RlIG9yIGV4dGVuZGVkIDE2LWJpdCBvcGNvZGUKLQkgKi8KLQlpZiAoIShvcGNvZGUgJiAweEZGMDApKSB7Ci0KLQkJLyogU2ltcGxlICg4LWJpdCkgb3Bjb2RlOiAwLTI1NSwgY2FuJ3QgaW5kZXggYmV5b25kIHRhYmxlICAqLwotCi0JCXJldHVybiAoJmFjcGlfZ2JsX2FtbF9vcF9pbmZvCi0JCQlbYWNwaV9nYmxfc2hvcnRfb3BfaW5kZXhbKHU4KSBvcGNvZGVdXSk7Ci0JfQotCi0JaWYgKCgob3Bjb2RlICYgMHhGRjAwKSA9PSBBTUxfRVhURU5ERURfT1BDT0RFKSAmJgotCSAgICAoKCh1OCkgb3Bjb2RlKSA8PSBNQVhfRVhURU5ERURfT1BDT0RFKSkgewotCi0JCS8qIFZhbGlkIGV4dGVuZGVkICgxNi1iaXQpIG9wY29kZSAqLwotCi0JCXJldHVybiAoJmFjcGlfZ2JsX2FtbF9vcF9pbmZvCi0JCQlbYWNwaV9nYmxfbG9uZ19vcF9pbmRleFsodTgpIG9wY29kZV1dKTsKLQl9Ci0KLQkvKiBVbmtub3duIEFNTCBvcGNvZGUgKi8KLQotCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVhFQywKLQkJCSAgIlVua25vd24gQU1MIG9wY29kZSBbJTQuNFhdXG4iLCBvcGNvZGUpKTsKLQotCXJldHVybiAoJmFjcGlfZ2JsX2FtbF9vcF9pbmZvW19VTktdKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9wc19nZXRfb3Bjb2RlX25hbWUKLSAqCi0gKiBQQVJBTUVURVJTOiAgT3Bjb2RlICAgICAgICAgICAgICAtIFRoZSBBTUwgb3Bjb2RlCi0gKgotICogUkVUVVJOOiAgICAgIEEgcG9pbnRlciB0byB0aGUgbmFtZSBvZiB0aGUgb3Bjb2RlIChBU0NJSSBTdHJpbmcpCi0gKiAgICAgICAgICAgICAgTm90ZTogTmV2ZXIgcmV0dXJucyBOVUxMLgotICoKLSAqIERFU0NSSVBUSU9OOiBUcmFuc2xhdGUgYW4gb3Bjb2RlIGludG8gYSBodW1hbi1yZWFkYWJsZSBzdHJpbmcKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1jaGFyICphY3BpX3BzX2dldF9vcGNvZGVfbmFtZSh1MTYgb3Bjb2RlKQotewotI2lmIGRlZmluZWQoQUNQSV9ESVNBU1NFTUJMRVIpIHx8IGRlZmluZWQgKEFDUElfREVCVUdfT1VUUFVUKQotCi0JY29uc3Qgc3RydWN0IGFjcGlfb3Bjb2RlX2luZm8gKm9wOwotCi0Jb3AgPSBhY3BpX3BzX2dldF9vcGNvZGVfaW5mbyhvcGNvZGUpOwotCi0JLyogQWx3YXlzIGd1YXJhbnRlZWQgdG8gcmV0dXJuIGEgdmFsaWQgcG9pbnRlciAqLwotCi0JcmV0dXJuIChvcC0+bmFtZSk7Ci0KLSNlbHNlCi0JcmV0dXJuICgiT3Bjb2RlTmFtZSB1bmF2YWlsYWJsZSIpOwotCi0jZW5kaWYKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9wc19nZXRfYXJndW1lbnRfY291bnQKLSAqCi0gKiBQQVJBTUVURVJTOiAgb3BfdHlwZSAgICAgICAgICAgICAtIFR5cGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBBTUwgb3Bjb2RlCi0gKgotICogUkVUVVJOOiAgICAgIEFyZ3VtZW50IGNvdW50Ci0gKgotICogREVTQ1JJUFRJT046IE9idGFpbiB0aGUgbnVtYmVyIG9mIGV4cGVjdGVkIGFyZ3VtZW50cyBmb3IgYW4gQU1MIG9wY29kZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXU4IGFjcGlfcHNfZ2V0X2FyZ3VtZW50X2NvdW50KHUzMiBvcF90eXBlKQotewotCi0JaWYgKG9wX3R5cGUgPD0gQU1MX1RZUEVfRVhFQ182QV8wVF8xUikgewotCQlyZXR1cm4gKGFjcGlfZ2JsX2FyZ3VtZW50X2NvdW50W29wX3R5cGVdKTsKLQl9Ci0KLQlyZXR1cm4gKDApOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3BhcnNlci9wc3BhcnNlLmMgYi9kcml2ZXJzL2FjcGkvcGFyc2VyL3BzcGFyc2UuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjhlOTMyZi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL2FjcGkvcGFyc2VyL3BzcGFyc2UuYworKysgL2Rldi9udWxsCkBAIC0xLDY4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogTW9kdWxlIE5hbWU6IHBzcGFyc2UgLSBQYXJzZXIgdG9wIGxldmVsIEFNTCBwYXJzZSByb3V0aW5lcwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDgsIEludGVsIENvcnAuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCi0gKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSBhdCBtaW5pbXVtIGEgZGlzY2xhaW1lcgotICogICAgc3Vic3RhbnRpYWxseSBzaW1pbGFyIHRvIHRoZSAiTk8gV0FSUkFOVFkiIGRpc2NsYWltZXIgYmVsb3cKLSAqICAgICgiRGlzY2xhaW1lciIpIGFuZCBhbnkgcmVkaXN0cmlidXRpb24gbXVzdCBiZSBjb25kaXRpb25lZCB1cG9uCi0gKiAgICBpbmNsdWRpbmcgYSBzdWJzdGFudGlhbGx5IHNpbWlsYXIgRGlzY2xhaW1lciByZXF1aXJlbWVudCBmb3IgZnVydGhlcgotICogICAgYmluYXJ5IHJlZGlzdHJpYnV0aW9uLgotICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzCi0gKiAgICBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIE5PIFdBUlJBTlRZCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKLSAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCi0gKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORwotICogSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCi0gKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCi0gKi8KLQotLyoKLSAqIFBhcnNlIHRoZSBBTUwgYW5kIGJ1aWxkIGFuIG9wZXJhdGlvbiB0cmVlIGFzIG1vc3QgaW50ZXJwcmV0ZXJzLAotICogbGlrZSBQZXJsLCBkby4gIFBhcnNpbmcgaXMgZG9uZSBieSBoYW5kIHJhdGhlciB0aGFuIHdpdGggYSBZQUNDCi0gKiBnZW5lcmF0ZWQgcGFyc2VyIHRvIHRpZ2h0bHkgY29uc3RyYWluIHN0YWNrIGFuZCBkeW5hbWljIG1lbW9yeQotICogdXNhZ2UuICBBdCB0aGUgc2FtZSB0aW1lLCBwYXJzaW5nIGlzIGtlcHQgZmxleGlibGUgYW5kIHRoZSBjb2RlCi0gKiBmYWlybHkgY29tcGFjdCBieSBwYXJzaW5nIGJhc2VkIG9uIGEgbGlzdCBvZiBBTUwgb3Bjb2RlCi0gKiB0ZW1wbGF0ZXMgaW4gYW1sX29wX2luZm9bXQotICovCi0KLSNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KLSNpbmNsdWRlIDxhY3BpL2FjcGFyc2VyLmg+Ci0jaW5jbHVkZSA8YWNwaS9hY2Rpc3BhdC5oPgotI2luY2x1ZGUgPGFjcGkvYW1sY29kZS5oPgotI2luY2x1ZGUgPGFjcGkvYWNuYW1lc3AuaD4KLSNpbmNsdWRlIDxhY3BpL2FjaW50ZXJwLmg+Ci0KLSNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX1BBUlNFUgotQUNQSV9NT0RVTEVfTkFNRSgicHNwYXJzZSIpCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfcHNfZ2V0X29wY29kZV9zaXplCi0gKgotICogUEFSQU1FVEVSUzogIE9wY29kZSAgICAgICAgICAtIEFuIEFNTCBvcGNvZGUKLSAqCi0gKiBSRVRVUk46ICAgICAgU2l6ZSBvZiB0aGUgb3Bjb2RlLCBpbiBieXRlcyAoMSBvciAyKQotICoKLSAqIERFU0NSSVBUSU9OOiBHZXQgdGhlIHNpemUgb2YgdGhlIGN1cnJlbnQgb3Bjb2RlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11MzIgYWNwaV9wc19nZXRfb3Bjb2RlX3NpemUodTMyIG9wY29kZSkKLXsKLQotCS8qIEV4dGVuZGVkICgyLWJ5dGUpIG9wY29kZSBpZiA+IDI1NSAqLwotCi0JaWYgKG9wY29kZSA+IDB4MDBGRikgewotCQlyZXR1cm4gKDIpOwotCX0KLQotCS8qIE90aGVyd2lzZSwganVzdCBhIHNpbmdsZSBieXRlIG9wY29kZSAqLwotCi0JcmV0dXJuICgxKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9wc19wZWVrX29wY29kZQotICoKLSAqIFBBUkFNRVRFUlM6ICBwYXJzZXJfc3RhdGUgICAgICAgIC0gQSBwYXJzZXIgc3RhdGUgb2JqZWN0Ci0gKgotICogUkVUVVJOOiAgICAgIE5leHQgQU1MIG9wY29kZQotICoKLSAqIERFU0NSSVBUSU9OOiBHZXQgbmV4dCBBTUwgb3Bjb2RlICh3aXRob3V0IGluY3JlbWVudGluZyBBTUwgcG9pbnRlcikKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi11MTYgYWNwaV9wc19wZWVrX29wY29kZShzdHJ1Y3QgYWNwaV9wYXJzZV9zdGF0ZSAqIHBhcnNlcl9zdGF0ZSkKLXsKLQl1OCAqYW1sOwotCXUxNiBvcGNvZGU7Ci0KLQlhbWwgPSBwYXJzZXJfc3RhdGUtPmFtbDsKLQlvcGNvZGUgPSAodTE2KSBBQ1BJX0dFVDgoYW1sKTsKLQotCWlmIChvcGNvZGUgPT0gQU1MX0VYVEVOREVEX09QX1BSRUZJWCkgewotCi0JCS8qIEV4dGVuZGVkIG9wY29kZSwgZ2V0IHRoZSBzZWNvbmQgb3Bjb2RlIGJ5dGUgKi8KLQotCQlhbWwrKzsKLQkJb3Bjb2RlID0gKHUxNikgKChvcGNvZGUgPDwgOCkgfCBBQ1BJX0dFVDgoYW1sKSk7Ci0JfQotCi0JcmV0dXJuIChvcGNvZGUpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX3BzX2NvbXBsZXRlX3RoaXNfb3AKLSAqCi0gKiBQQVJBTUVURVJTOiAgd2Fsa19zdGF0ZSAgICAgIC0gQ3VycmVudCBTdGF0ZQotICogICAgICAgICAgICAgIE9wICAgICAgICAgICAgICAtIE9wIHRvIGNvbXBsZXRlCi0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cwotICoKLSAqIERFU0NSSVBUSU9OOiBQZXJmb3JtIGFueSBjbGVhbnVwIGF0IHRoZSBjb21wbGV0aW9uIG9mIGFuIE9wLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWFjcGlfc3RhdHVzCi1hY3BpX3BzX2NvbXBsZXRlX3RoaXNfb3Aoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqIHdhbGtfc3RhdGUsCi0JCQkgdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKiBvcCkKLXsKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqcHJldjsKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqbmV4dDsKLQljb25zdCBzdHJ1Y3QgYWNwaV9vcGNvZGVfaW5mbyAqcGFyZW50X2luZm87Ci0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKnJlcGxhY2VtZW50X29wID0gTlVMTDsKLQlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKHBzX2NvbXBsZXRlX3RoaXNfb3AsIG9wKTsKLQotCS8qIENoZWNrIGZvciBudWxsIE9wLCBjYW4gaGFwcGVuIGlmIEFNTCBjb2RlIGlzIGNvcnJ1cHQgKi8KLQotCWlmICghb3ApIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsJLyogT0sgZm9yIG5vdyAqLwotCX0KLQotCS8qIERlbGV0ZSB0aGlzIG9wIGFuZCB0aGUgc3VidHJlZSBiZWxvdyBpdCBpZiBhc2tlZCB0byAqLwotCi0JaWYgKCgod2Fsa19zdGF0ZS0+cGFyc2VfZmxhZ3MgJiBBQ1BJX1BBUlNFX1RSRUVfTUFTSykgIT0KLQkgICAgIEFDUElfUEFSU0VfREVMRVRFX1RSRUUpCi0JICAgIHx8ICh3YWxrX3N0YXRlLT5vcF9pbmZvLT5jbGFzcyA9PSBBTUxfQ0xBU1NfQVJHVU1FTlQpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7Ci0JfQotCi0JLyogTWFrZSBzdXJlIHRoYXQgd2Ugb25seSBkZWxldGUgdGhpcyBzdWJ0cmVlICovCi0KLQlpZiAob3AtPmNvbW1vbi5wYXJlbnQpIHsKLQkJcHJldiA9IG9wLT5jb21tb24ucGFyZW50LT5jb21tb24udmFsdWUuYXJnOwotCQlpZiAoIXByZXYpIHsKLQotCQkJLyogTm90aGluZyBtb3JlIHRvIGRvICovCi0KLQkJCWdvdG8gY2xlYW51cDsKLQkJfQotCi0JCS8qCi0JCSAqIENoZWNrIGlmIHdlIG5lZWQgdG8gcmVwbGFjZSB0aGUgb3BlcmF0b3IgYW5kIGl0cyBzdWJ0cmVlCi0JCSAqIHdpdGggYSByZXR1cm4gdmFsdWUgb3AgKHBsYWNlaG9sZGVyIG9wKQotCQkgKi8KLQkJcGFyZW50X2luZm8gPQotCQkgICAgYWNwaV9wc19nZXRfb3Bjb2RlX2luZm8ob3AtPmNvbW1vbi5wYXJlbnQtPmNvbW1vbi4KLQkJCQkJICAgIGFtbF9vcGNvZGUpOwotCi0JCXN3aXRjaCAocGFyZW50X2luZm8tPmNsYXNzKSB7Ci0JCWNhc2UgQU1MX0NMQVNTX0NPTlRST0w6Ci0JCQlicmVhazsKLQotCQljYXNlIEFNTF9DTEFTU19DUkVBVEU6Ci0KLQkJCS8qCi0JCQkgKiBUaGVzZSBvcGNvZGVzIGNvbnRhaW4gdGVybV9hcmcgb3BlcmFuZHMuIFRoZSBjdXJyZW50Ci0JCQkgKiBvcCBtdXN0IGJlIHJlcGxhY2VkIGJ5IGEgcGxhY2Vob2xkZXIgcmV0dXJuIG9wCi0JCQkgKi8KLQkJCXJlcGxhY2VtZW50X29wID0KLQkJCSAgICBhY3BpX3BzX2FsbG9jX29wKEFNTF9JTlRfUkVUVVJOX1ZBTFVFX09QKTsKLQkJCWlmICghcmVwbGFjZW1lbnRfb3ApIHsKLQkJCQlzdGF0dXMgPSBBRV9OT19NRU1PUlk7Ci0JCQl9Ci0JCQlicmVhazsKLQotCQljYXNlIEFNTF9DTEFTU19OQU1FRF9PQkpFQ1Q6Ci0KLQkJCS8qCi0JCQkgKiBUaGVzZSBvcGNvZGVzIGNvbnRhaW4gdGVybV9hcmcgb3BlcmFuZHMuIFRoZSBjdXJyZW50Ci0JCQkgKiBvcCBtdXN0IGJlIHJlcGxhY2VkIGJ5IGEgcGxhY2Vob2xkZXIgcmV0dXJuIG9wCi0JCQkgKi8KLQkJCWlmICgob3AtPmNvbW1vbi5wYXJlbnQtPmNvbW1vbi5hbWxfb3Bjb2RlID09Ci0JCQkgICAgIEFNTF9SRUdJT05fT1ApCi0JCQkgICAgfHwgKG9wLT5jb21tb24ucGFyZW50LT5jb21tb24uYW1sX29wY29kZSA9PQotCQkJCUFNTF9EQVRBX1JFR0lPTl9PUCkKLQkJCSAgICB8fCAob3AtPmNvbW1vbi5wYXJlbnQtPmNvbW1vbi5hbWxfb3Bjb2RlID09Ci0JCQkJQU1MX0JVRkZFUl9PUCkKLQkJCSAgICB8fCAob3AtPmNvbW1vbi5wYXJlbnQtPmNvbW1vbi5hbWxfb3Bjb2RlID09Ci0JCQkJQU1MX1BBQ0tBR0VfT1ApCi0JCQkgICAgfHwgKG9wLT5jb21tb24ucGFyZW50LT5jb21tb24uYW1sX29wY29kZSA9PQotCQkJCUFNTF9CQU5LX0ZJRUxEX09QKQotCQkJICAgIHx8IChvcC0+Y29tbW9uLnBhcmVudC0+Y29tbW9uLmFtbF9vcGNvZGUgPT0KLQkJCQlBTUxfVkFSX1BBQ0tBR0VfT1ApKSB7Ci0JCQkJcmVwbGFjZW1lbnRfb3AgPQotCQkJCSAgICBhY3BpX3BzX2FsbG9jX29wKEFNTF9JTlRfUkVUVVJOX1ZBTFVFX09QKTsKLQkJCQlpZiAoIXJlcGxhY2VtZW50X29wKSB7Ci0JCQkJCXN0YXR1cyA9IEFFX05PX01FTU9SWTsKLQkJCQl9Ci0JCQl9IGVsc2UKLQkJCSAgICBpZiAoKG9wLT5jb21tb24ucGFyZW50LT5jb21tb24uYW1sX29wY29kZSA9PQotCQkJCSBBTUxfTkFNRV9PUCkKLQkJCQkmJiAod2Fsa19zdGF0ZS0+cGFzc19udW1iZXIgPD0KLQkJCQkgICAgQUNQSV9JTU9ERV9MT0FEX1BBU1MyKSkgewotCQkJCWlmICgob3AtPmNvbW1vbi5hbWxfb3Bjb2RlID09IEFNTF9CVUZGRVJfT1ApCi0JCQkJICAgIHx8IChvcC0+Y29tbW9uLmFtbF9vcGNvZGUgPT0gQU1MX1BBQ0tBR0VfT1ApCi0JCQkJICAgIHx8IChvcC0+Y29tbW9uLmFtbF9vcGNvZGUgPT0KLQkJCQkJQU1MX1ZBUl9QQUNLQUdFX09QKSkgewotCQkJCQlyZXBsYWNlbWVudF9vcCA9Ci0JCQkJCSAgICBhY3BpX3BzX2FsbG9jX29wKG9wLT5jb21tb24uCi0JCQkJCQkJICAgICBhbWxfb3Bjb2RlKTsKLQkJCQkJaWYgKCFyZXBsYWNlbWVudF9vcCkgewotCQkJCQkJc3RhdHVzID0gQUVfTk9fTUVNT1JZOwotCQkJCQl9IGVsc2UgewotCQkJCQkJcmVwbGFjZW1lbnRfb3AtPm5hbWVkLmRhdGEgPQotCQkJCQkJICAgIG9wLT5uYW1lZC5kYXRhOwotCQkJCQkJcmVwbGFjZW1lbnRfb3AtPm5hbWVkLmxlbmd0aCA9Ci0JCQkJCQkgICAgb3AtPm5hbWVkLmxlbmd0aDsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWJyZWFrOwotCi0JCWRlZmF1bHQ6Ci0KLQkJCXJlcGxhY2VtZW50X29wID0KLQkJCSAgICBhY3BpX3BzX2FsbG9jX29wKEFNTF9JTlRfUkVUVVJOX1ZBTFVFX09QKTsKLQkJCWlmICghcmVwbGFjZW1lbnRfb3ApIHsKLQkJCQlzdGF0dXMgPSBBRV9OT19NRU1PUlk7Ci0JCQl9Ci0JCX0KLQotCQkvKiBXZSBtdXN0IHVubGluayB0aGlzIG9wIGZyb20gdGhlIHBhcmVudCB0cmVlICovCi0KLQkJaWYgKHByZXYgPT0gb3ApIHsKLQotCQkJLyogVGhpcyBvcCBpcyB0aGUgZmlyc3QgaW4gdGhlIGxpc3QgKi8KLQotCQkJaWYgKHJlcGxhY2VtZW50X29wKSB7Ci0JCQkJcmVwbGFjZW1lbnRfb3AtPmNvbW1vbi5wYXJlbnQgPQotCQkJCSAgICBvcC0+Y29tbW9uLnBhcmVudDsKLQkJCQlyZXBsYWNlbWVudF9vcC0+Y29tbW9uLnZhbHVlLmFyZyA9IE5VTEw7Ci0JCQkJcmVwbGFjZW1lbnRfb3AtPmNvbW1vbi5ub2RlID0gb3AtPmNvbW1vbi5ub2RlOwotCQkJCW9wLT5jb21tb24ucGFyZW50LT5jb21tb24udmFsdWUuYXJnID0KLQkJCQkgICAgcmVwbGFjZW1lbnRfb3A7Ci0JCQkJcmVwbGFjZW1lbnRfb3AtPmNvbW1vbi5uZXh0ID0gb3AtPmNvbW1vbi5uZXh0OwotCQkJfSBlbHNlIHsKLQkJCQlvcC0+Y29tbW9uLnBhcmVudC0+Y29tbW9uLnZhbHVlLmFyZyA9Ci0JCQkJICAgIG9wLT5jb21tb24ubmV4dDsKLQkJCX0KLQkJfQotCi0JCS8qIFNlYXJjaCB0aGUgcGFyZW50IGxpc3QgKi8KLQotCQllbHNlCi0JCQl3aGlsZSAocHJldikgewotCi0JCQkJLyogVHJhdmVyc2UgYWxsIHNpYmxpbmdzIGluIHRoZSBwYXJlbnQncyBhcmd1bWVudCBsaXN0ICovCi0KLQkJCQluZXh0ID0gcHJldi0+Y29tbW9uLm5leHQ7Ci0JCQkJaWYgKG5leHQgPT0gb3ApIHsKLQkJCQkJaWYgKHJlcGxhY2VtZW50X29wKSB7Ci0JCQkJCQlyZXBsYWNlbWVudF9vcC0+Y29tbW9uLnBhcmVudCA9Ci0JCQkJCQkgICAgb3AtPmNvbW1vbi5wYXJlbnQ7Ci0JCQkJCQlyZXBsYWNlbWVudF9vcC0+Y29tbW9uLnZhbHVlLgotCQkJCQkJICAgIGFyZyA9IE5VTEw7Ci0JCQkJCQlyZXBsYWNlbWVudF9vcC0+Y29tbW9uLm5vZGUgPQotCQkJCQkJICAgIG9wLT5jb21tb24ubm9kZTsKLQkJCQkJCXByZXYtPmNvbW1vbi5uZXh0ID0KLQkJCQkJCSAgICByZXBsYWNlbWVudF9vcDsKLQkJCQkJCXJlcGxhY2VtZW50X29wLT5jb21tb24ubmV4dCA9Ci0JCQkJCQkgICAgb3AtPmNvbW1vbi5uZXh0OwotCQkJCQkJbmV4dCA9IE5VTEw7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlwcmV2LT5jb21tb24ubmV4dCA9Ci0JCQkJCQkgICAgb3AtPmNvbW1vbi5uZXh0OwotCQkJCQkJbmV4dCA9IE5VTEw7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcHJldiA9IG5leHQ7Ci0JCQl9Ci0JfQotCi0gICAgICBjbGVhbnVwOgotCi0JLyogTm93IHdlIGNhbiBhY3R1YWxseSBkZWxldGUgdGhlIHN1YnRyZWUgcm9vdGVkIGF0IE9wICovCi0KLQlhY3BpX3BzX2RlbGV0ZV9wYXJzZV90cmVlKG9wKTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9wc19uZXh0X3BhcnNlX3N0YXRlCi0gKgotICogUEFSQU1FVEVSUzogIHdhbGtfc3RhdGUgICAgICAgICAgLSBDdXJyZW50IHN0YXRlCi0gKiAgICAgICAgICAgICAgT3AgICAgICAgICAgICAgICAgICAtIEN1cnJlbnQgcGFyc2Ugb3AKLSAqICAgICAgICAgICAgICBjYWxsYmFja19zdGF0dXMgICAgIC0gU3RhdHVzIGZyb20gcHJldmlvdXMgb3BlcmF0aW9uCi0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cwotICoKLSAqIERFU0NSSVBUSU9OOiBVcGRhdGUgdGhlIHBhcnNlciBzdGF0ZSBiYXNlZCB1cG9uIHRoZSByZXR1cm4gZXhjZXB0aW9uIGZyb20KLSAqICAgICAgICAgICAgICB0aGUgcGFyc2VyIGNhbGxiYWNrLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWFjcGlfc3RhdHVzCi1hY3BpX3BzX25leHRfcGFyc2Vfc3RhdGUoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSwKLQkJCSB1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqb3AsCi0JCQkgYWNwaV9zdGF0dXMgY2FsbGJhY2tfc3RhdHVzKQotewotCXN0cnVjdCBhY3BpX3BhcnNlX3N0YXRlICpwYXJzZXJfc3RhdGUgPSAmd2Fsa19zdGF0ZS0+cGFyc2VyX3N0YXRlOwotCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX0NUUkxfUEVORElORzsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKHBzX25leHRfcGFyc2Vfc3RhdGUsIG9wKTsKLQotCXN3aXRjaCAoY2FsbGJhY2tfc3RhdHVzKSB7Ci0JY2FzZSBBRV9DVFJMX1RFUk1JTkFURToKLQkJLyoKLQkJICogQSBjb250cm9sIG1ldGhvZCB3YXMgdGVybWluYXRlZCB2aWEgYSBSRVRVUk4gc3RhdGVtZW50LgotCQkgKiBUaGUgd2FsayBvZiB0aGlzIG1ldGhvZCBpcyBjb21wbGV0ZS4KLQkJICovCi0JCXBhcnNlcl9zdGF0ZS0+YW1sID0gcGFyc2VyX3N0YXRlLT5hbWxfZW5kOwotCQlzdGF0dXMgPSBBRV9DVFJMX1RFUk1JTkFURTsKLQkJYnJlYWs7Ci0KLQljYXNlIEFFX0NUUkxfQlJFQUs6Ci0KLQkJcGFyc2VyX3N0YXRlLT5hbWwgPSB3YWxrX3N0YXRlLT5hbWxfbGFzdF93aGlsZTsKLQkJd2Fsa19zdGF0ZS0+Y29udHJvbF9zdGF0ZS0+Y29tbW9uLnZhbHVlID0gRkFMU0U7Ci0JCXN0YXR1cyA9IEFFX0NUUkxfQlJFQUs7Ci0JCWJyZWFrOwotCi0JY2FzZSBBRV9DVFJMX0NPTlRJTlVFOgotCi0JCXBhcnNlcl9zdGF0ZS0+YW1sID0gd2Fsa19zdGF0ZS0+YW1sX2xhc3Rfd2hpbGU7Ci0JCXN0YXR1cyA9IEFFX0NUUkxfQ09OVElOVUU7Ci0JCWJyZWFrOwotCi0JY2FzZSBBRV9DVFJMX1BFTkRJTkc6Ci0KLQkJcGFyc2VyX3N0YXRlLT5hbWwgPSB3YWxrX3N0YXRlLT5hbWxfbGFzdF93aGlsZTsKLQkJYnJlYWs7Ci0KLSNpZiAwCi0JY2FzZSBBRV9DVFJMX1NLSVA6Ci0KLQkJcGFyc2VyX3N0YXRlLT5hbWwgPSBwYXJzZXJfc3RhdGUtPnNjb3BlLT5wYXJzZV9zY29wZS5wa2dfZW5kOwotCQlzdGF0dXMgPSBBRV9PSzsKLQkJYnJlYWs7Ci0jZW5kaWYKLQotCWNhc2UgQUVfQ1RSTF9UUlVFOgotCQkvKgotCQkgKiBQcmVkaWNhdGUgb2YgYW4gSUYgd2FzIHRydWUsIGFuZCB3ZSBhcmUgYXQgdGhlIG1hdGNoaW5nIEVMU0UuCi0JCSAqIEp1c3QgY2xvc2Ugb3V0IHRoaXMgcGFja2FnZQotCQkgKi8KLQkJcGFyc2VyX3N0YXRlLT5hbWwgPSBhY3BpX3BzX2dldF9uZXh0X3BhY2thZ2VfZW5kKHBhcnNlcl9zdGF0ZSk7Ci0JCXN0YXR1cyA9IEFFX0NUUkxfUEVORElORzsKLQkJYnJlYWs7Ci0KLQljYXNlIEFFX0NUUkxfRkFMU0U6Ci0JCS8qCi0JCSAqIEVpdGhlciBhbiBJRi9XSElMRSBQcmVkaWNhdGUgd2FzIGZhbHNlIG9yIHdlIGVuY291bnRlcmVkIGEgQlJFQUsKLQkJICogb3Bjb2RlLiAgSW4gYm90aCBjYXNlcywgd2UgZG8gbm90IGV4ZWN1dGUgdGhlIHJlc3Qgb2YgdGhlCi0JCSAqIHBhY2thZ2U7ICBXZSBzaW1wbHkgY2xvc2Ugb3V0IHRoZSBwYXJlbnQgKGZpbmlzaGluZyB0aGUgd2FsayBvZgotCQkgKiB0aGlzIGJyYW5jaCBvZiB0aGUgdHJlZSkgYW5kIGNvbnRpbnVlIGV4ZWN1dGlvbiBhdCB0aGUgcGFyZW50Ci0JCSAqIGxldmVsLgotCQkgKi8KLQkJcGFyc2VyX3N0YXRlLT5hbWwgPSBwYXJzZXJfc3RhdGUtPnNjb3BlLT5wYXJzZV9zY29wZS5wa2dfZW5kOwotCi0JCS8qIEluIHRoZSBjYXNlIG9mIGEgQlJFQUssIGp1c3QgZm9yY2UgYSBwcmVkaWNhdGUgKGlmIGFueSkgdG8gRkFMU0UgKi8KLQotCQl3YWxrX3N0YXRlLT5jb250cm9sX3N0YXRlLT5jb21tb24udmFsdWUgPSBGQUxTRTsKLQkJc3RhdHVzID0gQUVfQ1RSTF9FTkQ7Ci0JCWJyZWFrOwotCi0JY2FzZSBBRV9DVFJMX1RSQU5TRkVSOgotCi0JCS8qIEEgbWV0aG9kIGNhbGwgKGludm9jYXRpb24pIC0tIHRyYW5zZmVyIGNvbnRyb2wgKi8KLQotCQlzdGF0dXMgPSBBRV9DVFJMX1RSQU5TRkVSOwotCQl3YWxrX3N0YXRlLT5wcmV2X29wID0gb3A7Ci0JCXdhbGtfc3RhdGUtPm1ldGhvZF9jYWxsX29wID0gb3A7Ci0JCXdhbGtfc3RhdGUtPm1ldGhvZF9jYWxsX25vZGUgPQotCQkgICAgKG9wLT5jb21tb24udmFsdWUuYXJnKS0+Y29tbW9uLm5vZGU7Ci0KLQkJLyogV2lsbCByZXR1cm4gdmFsdWUgKGlmIGFueSkgYmUgdXNlZCBieSB0aGUgY2FsbGVyPyAqLwotCi0JCXdhbGtfc3RhdGUtPnJldHVybl91c2VkID0KLQkJICAgIGFjcGlfZHNfaXNfcmVzdWx0X3VzZWQob3AsIHdhbGtfc3RhdGUpOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0KLQkJc3RhdHVzID0gY2FsbGJhY2tfc3RhdHVzOwotCQlpZiAoKGNhbGxiYWNrX3N0YXR1cyAmIEFFX0NPREVfTUFTSykgPT0gQUVfQ09ERV9DT05UUk9MKSB7Ci0JCQlzdGF0dXMgPSBBRV9PSzsKLQkJfQotCQlicmVhazsKLQl9Ci0KLQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9wc19wYXJzZV9hbWwKLSAqCi0gKiBQQVJBTUVURVJTOiAgd2Fsa19zdGF0ZSAgICAgIC0gQ3VycmVudCBzdGF0ZQotICoKLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IFBhcnNlIHJhdyBBTUwgYW5kIHJldHVybiBhIHRyZWUgb2Ygb3BzCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotYWNwaV9zdGF0dXMgYWNwaV9wc19wYXJzZV9hbWwoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSkKLXsKLQlhY3BpX3N0YXR1cyBzdGF0dXM7Ci0Jc3RydWN0IGFjcGlfdGhyZWFkX3N0YXRlICp0aHJlYWQ7Ci0Jc3RydWN0IGFjcGlfdGhyZWFkX3N0YXRlICpwcmV2X3dhbGtfbGlzdCA9IGFjcGlfZ2JsX2N1cnJlbnRfd2Fsa19saXN0OwotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKnByZXZpb3VzX3dhbGtfc3RhdGU7Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKHBzX3BhcnNlX2FtbCk7Ci0KLQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX1BBUlNFLAotCQkJICAiRW50ZXJlZCB3aXRoIFdhbGtTdGF0ZT0lcCBBbWw9JXAgc2l6ZT0lWFxuIiwKLQkJCSAgd2Fsa19zdGF0ZSwgd2Fsa19zdGF0ZS0+cGFyc2VyX3N0YXRlLmFtbCwKLQkJCSAgd2Fsa19zdGF0ZS0+cGFyc2VyX3N0YXRlLmFtbF9zaXplKSk7Ci0KLQkvKiBDcmVhdGUgYW5kIGluaXRpYWxpemUgYSBuZXcgdGhyZWFkIHN0YXRlICovCi0KLQl0aHJlYWQgPSBhY3BpX3V0X2NyZWF0ZV90aHJlYWRfc3RhdGUoKTsKLQlpZiAoIXRocmVhZCkgewotCQlhY3BpX2RzX2RlbGV0ZV93YWxrX3N0YXRlKHdhbGtfc3RhdGUpOwotCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9fTUVNT1JZKTsKLQl9Ci0KLQl3YWxrX3N0YXRlLT50aHJlYWQgPSB0aHJlYWQ7Ci0KLQkvKgotCSAqIElmIGV4ZWN1dGluZyBhIG1ldGhvZCwgdGhlIHN0YXJ0aW5nIHN5bmNfbGV2ZWwgaXMgdGhpcyBtZXRob2QncwotCSAqIHN5bmNfbGV2ZWwKLQkgKi8KLQlpZiAod2Fsa19zdGF0ZS0+bWV0aG9kX2Rlc2MpIHsKLQkJd2Fsa19zdGF0ZS0+dGhyZWFkLT5jdXJyZW50X3N5bmNfbGV2ZWwgPQotCQkgICAgd2Fsa19zdGF0ZS0+bWV0aG9kX2Rlc2MtPm1ldGhvZC5zeW5jX2xldmVsOwotCX0KLQotCWFjcGlfZHNfcHVzaF93YWxrX3N0YXRlKHdhbGtfc3RhdGUsIHRocmVhZCk7Ci0KLQkvKgotCSAqIFRoaXMgZ2xvYmFsIGFsbG93cyB0aGUgQU1MIGRlYnVnZ2VyIHRvIGdldCBhIGhhbmRsZSB0byB0aGUgY3VycmVudGx5Ci0JICogZXhlY3V0aW5nIGNvbnRyb2wgbWV0aG9kLgotCSAqLwotCWFjcGlfZ2JsX2N1cnJlbnRfd2Fsa19saXN0ID0gdGhyZWFkOwotCi0JLyoKLQkgKiBFeGVjdXRlIHRoZSB3YWxrIGxvb3AgYXMgbG9uZyBhcyB0aGVyZSBpcyBhIHZhbGlkIFdhbGsgU3RhdGUuICBUaGlzCi0JICogaGFuZGxlcyBuZXN0ZWQgY29udHJvbCBtZXRob2QgaW52b2NhdGlvbnMgd2l0aG91dCByZWN1cnNpb24uCi0JICovCi0JQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9QQVJTRSwgIlN0YXRlPSVwXG4iLCB3YWxrX3N0YXRlKSk7Ci0KLQlzdGF0dXMgPSBBRV9PSzsKLQl3aGlsZSAod2Fsa19zdGF0ZSkgewotCQlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpIHsKLQkJCS8qCi0JCQkgKiBUaGUgcGFyc2VfbG9vcCBleGVjdXRlcyBBTUwgdW50aWwgdGhlIG1ldGhvZCB0ZXJtaW5hdGVzCi0JCQkgKiBvciBjYWxscyBhbm90aGVyIG1ldGhvZC4KLQkJCSAqLwotCQkJc3RhdHVzID0gYWNwaV9wc19wYXJzZV9sb29wKHdhbGtfc3RhdGUpOwotCQl9Ci0KLQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9QQVJTRSwKLQkJCQkgICJDb21wbGV0ZWQgb25lIGNhbGwgdG8gd2FsayBsb29wLCAlcyBTdGF0ZT0lcFxuIiwKLQkJCQkgIGFjcGlfZm9ybWF0X2V4Y2VwdGlvbihzdGF0dXMpLCB3YWxrX3N0YXRlKSk7Ci0KLQkJaWYgKHN0YXR1cyA9PSBBRV9DVFJMX1RSQU5TRkVSKSB7Ci0JCQkvKgotCQkJICogQSBtZXRob2QgY2FsbCB3YXMgZGV0ZWN0ZWQuCi0JCQkgKiBUcmFuc2ZlciBjb250cm9sIHRvIHRoZSBjYWxsZWQgY29udHJvbCBtZXRob2QKLQkJCSAqLwotCQkJc3RhdHVzID0KLQkJCSAgICBhY3BpX2RzX2NhbGxfY29udHJvbF9tZXRob2QodGhyZWFkLCB3YWxrX3N0YXRlLAotCQkJCQkJCU5VTEwpOwotCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCQkJc3RhdHVzID0KLQkJCQkgICAgYWNwaV9kc19tZXRob2RfZXJyb3Ioc3RhdHVzLCB3YWxrX3N0YXRlKTsKLQkJCX0KLQotCQkJLyoKLQkJCSAqIElmIHRoZSB0cmFuc2ZlciB0byB0aGUgbmV3IG1ldGhvZCBtZXRob2QgY2FsbCB3b3JrZWQsIGEgbmV3IHdhbGsKLQkJCSAqIHN0YXRlIHdhcyBjcmVhdGVkIC0tIGdldCBpdAotCQkJICovCi0JCQl3YWxrX3N0YXRlID0gYWNwaV9kc19nZXRfY3VycmVudF93YWxrX3N0YXRlKHRocmVhZCk7Ci0JCQljb250aW51ZTsKLQkJfSBlbHNlIGlmIChzdGF0dXMgPT0gQUVfQ1RSTF9URVJNSU5BVEUpIHsKLQkJCXN0YXR1cyA9IEFFX09LOwotCQl9IGVsc2UgaWYgKChzdGF0dXMgIT0gQUVfT0spICYmICh3YWxrX3N0YXRlLT5tZXRob2RfZGVzYykpIHsKLQotCQkJLyogRWl0aGVyIHRoZSBtZXRob2QgcGFyc2Ugb3IgYWN0dWFsIGV4ZWN1dGlvbiBmYWlsZWQgKi8KLQotCQkJQUNQSV9FUlJPUl9NRVRIT0QoIk1ldGhvZCBwYXJzZS9leGVjdXRpb24gZmFpbGVkIiwKLQkJCQkJICB3YWxrX3N0YXRlLT5tZXRob2Rfbm9kZSwgTlVMTCwKLQkJCQkJICBzdGF0dXMpOwotCi0JCQkvKiBDaGVjayBmb3IgcG9zc2libGUgbXVsdGktdGhyZWFkIHJlZW50cmFuY3kgcHJvYmxlbSAqLwotCi0JCQlpZiAoKHN0YXR1cyA9PSBBRV9BTFJFQURZX0VYSVNUUykgJiYKLQkJCSAgICAoIXdhbGtfc3RhdGUtPm1ldGhvZF9kZXNjLT5tZXRob2QubXV0ZXgpKSB7Ci0JCQkJQUNQSV9JTkZPKChBRV9JTkZPLAotCQkJCQkgICAiTWFya2luZyBtZXRob2QgJTQuNHMgYXMgU2VyaWFsaXplZCBiZWNhdXNlIG9mIEFFX0FMUkVBRFlfRVhJU1RTIGVycm9yIiwKLQkJCQkJICAgd2Fsa19zdGF0ZS0+bWV0aG9kX25vZGUtPm5hbWUuCi0JCQkJCSAgIGFzY2lpKSk7Ci0KLQkJCQkvKgotCQkJCSAqIE1ldGhvZCB0cmllZCB0byBjcmVhdGUgYW4gb2JqZWN0IHR3aWNlLiBUaGUgcHJvYmFibGUgY2F1c2UgaXMKLQkJCQkgKiB0aGF0IHRoZSBtZXRob2QgY2Fubm90IGhhbmRsZSByZWVudHJhbmN5LgotCQkJCSAqCi0JCQkJICogVGhlIG1ldGhvZCBpcyBtYXJrZWQgbm90X3NlcmlhbGl6ZWQsIGJ1dCBpdCB0cmllZCB0byBjcmVhdGUKLQkJCQkgKiBhIG5hbWVkIG9iamVjdCwgY2F1c2luZyB0aGUgc2Vjb25kIHRocmVhZCBlbnRyYW5jZSB0byBmYWlsLgotCQkJCSAqIFdvcmthcm91bmQgdGhpcyBwcm9ibGVtIGJ5IG1hcmtpbmcgdGhlIG1ldGhvZCBwZXJtYW5lbnRseQotCQkJCSAqIGFzIFNlcmlhbGl6ZWQuCi0JCQkJICovCi0JCQkJd2Fsa19zdGF0ZS0+bWV0aG9kX2Rlc2MtPm1ldGhvZC5tZXRob2RfZmxhZ3MgfD0KLQkJCQkgICAgQU1MX01FVEhPRF9TRVJJQUxJWkVEOwotCQkJCXdhbGtfc3RhdGUtPm1ldGhvZF9kZXNjLT5tZXRob2Quc3luY19sZXZlbCA9IDA7Ci0JCQl9Ci0JCX0KLQotCQkvKiBXZSBhcmUgZG9uZSB3aXRoIHRoaXMgd2FsaywgbW92ZSBvbiB0byB0aGUgcGFyZW50IGlmIGFueSAqLwotCi0JCXdhbGtfc3RhdGUgPSBhY3BpX2RzX3BvcF93YWxrX3N0YXRlKHRocmVhZCk7Ci0KLQkJLyogUmVzZXQgdGhlIGN1cnJlbnQgc2NvcGUgdG8gdGhlIGJlZ2lubmluZyBvZiBzY29wZSBzdGFjayAqLwotCi0JCWFjcGlfZHNfc2NvcGVfc3RhY2tfY2xlYXIod2Fsa19zdGF0ZSk7Ci0KLQkJLyoKLQkJICogSWYgd2UganVzdCByZXR1cm5lZCBmcm9tIHRoZSBleGVjdXRpb24gb2YgYSBjb250cm9sIG1ldGhvZCBvciBpZiB3ZQotCQkgKiBlbmNvdW50ZXJlZCBhbiBlcnJvciBkdXJpbmcgdGhlIG1ldGhvZCBwYXJzZSBwaGFzZSwgdGhlcmUncyBsb3RzIG9mCi0JCSAqIGNsZWFudXAgdG8gZG8KLQkJICovCi0JCWlmICgoKHdhbGtfc3RhdGUtPnBhcnNlX2ZsYWdzICYgQUNQSV9QQVJTRV9NT0RFX01BU0spID09Ci0JCSAgICAgQUNQSV9QQVJTRV9FWEVDVVRFKSB8fCAoQUNQSV9GQUlMVVJFKHN0YXR1cykpKSB7Ci0JCQlhY3BpX2RzX3Rlcm1pbmF0ZV9jb250cm9sX21ldGhvZCh3YWxrX3N0YXRlLT4KLQkJCQkJCQkgbWV0aG9kX2Rlc2MsCi0JCQkJCQkJIHdhbGtfc3RhdGUpOwotCQl9Ci0KLQkJLyogRGVsZXRlIHRoaXMgd2FsayBzdGF0ZSBhbmQgYWxsIGxpbmtlZCBjb250cm9sIHN0YXRlcyAqLwotCi0JCWFjcGlfcHNfY2xlYW51cF9zY29wZSgmd2Fsa19zdGF0ZS0+cGFyc2VyX3N0YXRlKTsKLQkJcHJldmlvdXNfd2Fsa19zdGF0ZSA9IHdhbGtfc3RhdGU7Ci0KLQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9QQVJTRSwKLQkJCQkgICJSZXR1cm5WYWx1ZT0lcCwgSW1wbGljaXRWYWx1ZT0lcCBTdGF0ZT0lcFxuIiwKLQkJCQkgIHdhbGtfc3RhdGUtPnJldHVybl9kZXNjLAotCQkJCSAgd2Fsa19zdGF0ZS0+aW1wbGljaXRfcmV0dXJuX29iaiwgd2Fsa19zdGF0ZSkpOwotCi0JCS8qIENoZWNrIGlmIHdlIGhhdmUgcmVzdGFydGVkIGEgcHJlZW1wdGVkIHdhbGsgKi8KLQotCQl3YWxrX3N0YXRlID0gYWNwaV9kc19nZXRfY3VycmVudF93YWxrX3N0YXRlKHRocmVhZCk7Ci0JCWlmICh3YWxrX3N0YXRlKSB7Ci0JCQlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpIHsKLQkJCQkvKgotCQkJCSAqIFRoZXJlIGlzIGFub3RoZXIgd2FsayBzdGF0ZSwgcmVzdGFydCBpdC4KLQkJCQkgKiBJZiB0aGUgbWV0aG9kIHJldHVybiB2YWx1ZSBpcyBub3QgdXNlZCBieSB0aGUgcGFyZW50LAotCQkJCSAqIFRoZSBvYmplY3QgaXMgZGVsZXRlZAotCQkJCSAqLwotCQkJCWlmICghcHJldmlvdXNfd2Fsa19zdGF0ZS0+cmV0dXJuX2Rlc2MpIHsKLQkJCQkJLyoKLQkJCQkJICogSW4gc2xhY2sgbW9kZSBleGVjdXRpb24sIGlmIHRoZXJlIGlzIG5vIHJldHVybiB2YWx1ZQotCQkJCQkgKiB3ZSBzaG91bGQgaW1wbGljaXRseSByZXR1cm4gemVybyAoMCkgYXMgYSBkZWZhdWx0IHZhbHVlLgotCQkJCQkgKi8KLQkJCQkJaWYgKGFjcGlfZ2JsX2VuYWJsZV9pbnRlcnByZXRlcl9zbGFjayAmJgotCQkJCQkgICAgIXByZXZpb3VzX3dhbGtfc3RhdGUtPgotCQkJCQkgICAgaW1wbGljaXRfcmV0dXJuX29iaikgewotCQkJCQkJcHJldmlvdXNfd2Fsa19zdGF0ZS0+Ci0JCQkJCQkgICAgaW1wbGljaXRfcmV0dXJuX29iaiA9Ci0JCQkJCQkgICAgYWNwaV91dF9jcmVhdGVfaW50ZXJuYWxfb2JqZWN0Ci0JCQkJCQkgICAgKEFDUElfVFlQRV9JTlRFR0VSKTsKLQkJCQkJCWlmICghcHJldmlvdXNfd2Fsa19zdGF0ZS0+Ci0JCQkJCQkgICAgaW1wbGljaXRfcmV0dXJuX29iaikgewotCQkJCQkJCXJldHVybl9BQ1BJX1NUQVRVUwotCQkJCQkJCSAgICAoQUVfTk9fTUVNT1JZKTsKLQkJCQkJCX0KLQotCQkJCQkJcHJldmlvdXNfd2Fsa19zdGF0ZS0+Ci0JCQkJCQkgICAgaW1wbGljaXRfcmV0dXJuX29iai0+Ci0JCQkJCQkgICAgaW50ZWdlci52YWx1ZSA9IDA7Ci0JCQkJCX0KLQotCQkJCQkvKiBSZXN0YXJ0IHRoZSBjYWxsaW5nIGNvbnRyb2wgbWV0aG9kICovCi0KLQkJCQkJc3RhdHVzID0KLQkJCQkJICAgIGFjcGlfZHNfcmVzdGFydF9jb250cm9sX21ldGhvZAotCQkJCQkgICAgKHdhbGtfc3RhdGUsCi0JCQkJCSAgICAgcHJldmlvdXNfd2Fsa19zdGF0ZS0+Ci0JCQkJCSAgICAgaW1wbGljaXRfcmV0dXJuX29iaik7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLyoKLQkJCQkJICogV2UgaGF2ZSBhIHZhbGlkIHJldHVybiB2YWx1ZSwgZGVsZXRlIGFueSBpbXBsaWNpdAotCQkJCQkgKiByZXR1cm4gdmFsdWUuCi0JCQkJCSAqLwotCQkJCQlhY3BpX2RzX2NsZWFyX2ltcGxpY2l0X3JldHVybgotCQkJCQkgICAgKHByZXZpb3VzX3dhbGtfc3RhdGUpOwotCi0JCQkJCXN0YXR1cyA9Ci0JCQkJCSAgICBhY3BpX2RzX3Jlc3RhcnRfY29udHJvbF9tZXRob2QKLQkJCQkJICAgICh3YWxrX3N0YXRlLAotCQkJCQkgICAgIHByZXZpb3VzX3dhbGtfc3RhdGUtPnJldHVybl9kZXNjKTsKLQkJCQl9Ci0JCQkJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKSB7Ci0JCQkJCXdhbGtfc3RhdGUtPndhbGtfdHlwZSB8PQotCQkJCQkgICAgQUNQSV9XQUxLX01FVEhPRF9SRVNUQVJUOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJLyogT24gZXJyb3IsIGRlbGV0ZSBhbnkgcmV0dXJuIG9iamVjdCBvciBpbXBsaWNpdCByZXR1cm4gKi8KLQotCQkJCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZShwcmV2aW91c193YWxrX3N0YXRlLT4KLQkJCQkJCQkgcmV0dXJuX2Rlc2MpOwotCQkJCWFjcGlfZHNfY2xlYXJfaW1wbGljaXRfcmV0dXJuCi0JCQkJICAgIChwcmV2aW91c193YWxrX3N0YXRlKTsKLQkJCX0KLQkJfQotCi0JCS8qCi0JCSAqIEp1c3QgY29tcGxldGVkIGEgMXN0LWxldmVsIG1ldGhvZCwgc2F2ZSB0aGUgZmluYWwgaW50ZXJuYWwgcmV0dXJuCi0JCSAqIHZhbHVlIChpZiBhbnkpCi0JCSAqLwotCQllbHNlIGlmIChwcmV2aW91c193YWxrX3N0YXRlLT5jYWxsZXJfcmV0dXJuX2Rlc2MpIHsKLQkJCWlmIChwcmV2aW91c193YWxrX3N0YXRlLT5pbXBsaWNpdF9yZXR1cm5fb2JqKSB7Ci0JCQkJKihwcmV2aW91c193YWxrX3N0YXRlLT5jYWxsZXJfcmV0dXJuX2Rlc2MpID0KLQkJCQkgICAgcHJldmlvdXNfd2Fsa19zdGF0ZS0+aW1wbGljaXRfcmV0dXJuX29iajsKLQkJCX0gZWxzZSB7Ci0JCQkJLyogTlVMTCBpZiBubyByZXR1cm4gdmFsdWUgKi8KLQotCQkJCSoocHJldmlvdXNfd2Fsa19zdGF0ZS0+Y2FsbGVyX3JldHVybl9kZXNjKSA9Ci0JCQkJICAgIHByZXZpb3VzX3dhbGtfc3RhdGUtPnJldHVybl9kZXNjOwotCQkJfQotCQl9IGVsc2UgewotCQkJaWYgKHByZXZpb3VzX3dhbGtfc3RhdGUtPnJldHVybl9kZXNjKSB7Ci0KLQkJCQkvKiBDYWxsZXIgZG9lc24ndCB3YW50IGl0LCBtdXN0IGRlbGV0ZSBpdCAqLwotCi0JCQkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKHByZXZpb3VzX3dhbGtfc3RhdGUtPgotCQkJCQkJCSByZXR1cm5fZGVzYyk7Ci0JCQl9Ci0JCQlpZiAocHJldmlvdXNfd2Fsa19zdGF0ZS0+aW1wbGljaXRfcmV0dXJuX29iaikgewotCi0JCQkJLyogQ2FsbGVyIGRvZXNuJ3Qgd2FudCBpdCwgbXVzdCBkZWxldGUgaXQgKi8KLQotCQkJCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZShwcmV2aW91c193YWxrX3N0YXRlLT4KLQkJCQkJCQkgaW1wbGljaXRfcmV0dXJuX29iaik7Ci0JCQl9Ci0JCX0KLQotCQlhY3BpX2RzX2RlbGV0ZV93YWxrX3N0YXRlKHByZXZpb3VzX3dhbGtfc3RhdGUpOwotCX0KLQotCS8qIE5vcm1hbCBleGl0ICovCi0KLQlhY3BpX2V4X3JlbGVhc2VfYWxsX211dGV4ZXModGhyZWFkKTsKLQlhY3BpX3V0X2RlbGV0ZV9nZW5lcmljX3N0YXRlKEFDUElfQ0FTVF9QVFIKLQkJCQkgICAgICh1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUsIHRocmVhZCkpOwotCWFjcGlfZ2JsX2N1cnJlbnRfd2Fsa19saXN0ID0gcHJldl93YWxrX2xpc3Q7Ci0JcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvcGFyc2VyL3Bzc2NvcGUuYyBiL2RyaXZlcnMvYWNwaS9wYXJzZXIvcHNzY29wZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTUwZTY3Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvYWNwaS9wYXJzZXIvcHNzY29wZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBNb2R1bGUgTmFtZTogcHNzY29wZSAtIFBhcnNlciBzY29wZSBzdGFjayBtYW5hZ2VtZW50IHJvdXRpbmVzCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwOCwgSW50ZWwgQ29ycC4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKLSAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIGF0IG1pbmltdW0gYSBkaXNjbGFpbWVyCi0gKiAgICBzdWJzdGFudGlhbGx5IHNpbWlsYXIgdG8gdGhlICJOTyBXQVJSQU5UWSIgZGlzY2xhaW1lciBiZWxvdwotICogICAgKCJEaXNjbGFpbWVyIikgYW5kIGFueSByZWRpc3RyaWJ1dGlvbiBtdXN0IGJlIGNvbmRpdGlvbmVkIHVwb24KLSAqICAgIGluY2x1ZGluZyBhIHN1YnN0YW50aWFsbHkgc2ltaWxhciBEaXNjbGFpbWVyIHJlcXVpcmVtZW50IGZvciBmdXJ0aGVyCi0gKiAgICBiaW5hcnkgcmVkaXN0cmlidXRpb24uCi0gKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMKLSAqICAgIG9mIGFueSBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTk8gV0FSUkFOVFkKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAotICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKLSAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HCi0gKiBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKLSAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KLSAqLwotCi0jaW5jbHVkZSA8YWNwaS9hY3BpLmg+Ci0jaW5jbHVkZSA8YWNwaS9hY3BhcnNlci5oPgotCi0jZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9QQVJTRVIKLUFDUElfTU9EVUxFX05BTUUoInBzc2NvcGUiKQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX3BzX2dldF9wYXJlbnRfc2NvcGUKLSAqCi0gKiBQQVJBTUVURVJTOiAgcGFyc2VyX3N0YXRlICAgICAgICAtIEN1cnJlbnQgcGFyc2VyIHN0YXRlIG9iamVjdAotICoKLSAqIFJFVFVSTjogICAgICBQb2ludGVyIHRvIGFuIE9wIG9iamVjdAotICoKLSAqIERFU0NSSVBUSU9OOiBHZXQgcGFyZW50IG9mIGN1cnJlbnQgb3AgYmVpbmcgcGFyc2VkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICphY3BpX3BzX2dldF9wYXJlbnRfc2NvcGUoc3RydWN0IGFjcGlfcGFyc2Vfc3RhdGUKLQkJCQkJCSAgKnBhcnNlcl9zdGF0ZSkKLXsKLQotCXJldHVybiAocGFyc2VyX3N0YXRlLT5zY29wZS0+cGFyc2Vfc2NvcGUub3ApOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX3BzX2hhc19jb21wbGV0ZWRfc2NvcGUKLSAqCi0gKiBQQVJBTUVURVJTOiAgcGFyc2VyX3N0YXRlICAgICAgICAtIEN1cnJlbnQgcGFyc2VyIHN0YXRlIG9iamVjdAotICoKLSAqIFJFVFVSTjogICAgICBCb29sZWFuLCBUUlVFID0gc2NvcGUgY29tcGxldGVkLgotICoKLSAqIERFU0NSSVBUSU9OOiBJcyBwYXJzaW5nIG9mIGN1cnJlbnQgYXJndW1lbnQgY29tcGxldGU/ICBEZXRlcm1pbmVkIGJ5Ci0gKiAgICAgICAgICAgICAgMSkgQU1MIHBvaW50ZXIgaXMgYXQgb3IgYmV5b25kIHRoZSBlbmQgb2YgdGhlIHNjb3BlCi0gKiAgICAgICAgICAgICAgMikgVGhlIHNjb3BlIGFyZ3VtZW50IGNvdW50IGhhcyByZWFjaGVkIHplcm8uCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdTggYWNwaV9wc19oYXNfY29tcGxldGVkX3Njb3BlKHN0cnVjdCBhY3BpX3BhcnNlX3N0YXRlICogcGFyc2VyX3N0YXRlKQotewotCi0JcmV0dXJuICgodTgpCi0JCSgocGFyc2VyX3N0YXRlLT5hbWwgPj0gcGFyc2VyX3N0YXRlLT5zY29wZS0+cGFyc2Vfc2NvcGUuYXJnX2VuZAotCQkgIHx8ICFwYXJzZXJfc3RhdGUtPnNjb3BlLT5wYXJzZV9zY29wZS5hcmdfY291bnQpKSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfcHNfaW5pdF9zY29wZQotICoKLSAqIFBBUkFNRVRFUlM6ICBwYXJzZXJfc3RhdGUgICAgICAgIC0gQ3VycmVudCBwYXJzZXIgc3RhdGUgb2JqZWN0Ci0gKiAgICAgICAgICAgICAgUm9vdCAgICAgICAgICAgICAgICAtIHRoZSBSb290IE5vZGUgb2YgdGhpcyBuZXcgc2NvcGUKLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IEFsbG9jYXRlIGFuZCBpbml0IGEgbmV3IHNjb3BlIG9iamVjdAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWFjcGlfc3RhdHVzCi1hY3BpX3BzX2luaXRfc2NvcGUoc3RydWN0IGFjcGlfcGFyc2Vfc3RhdGUgKiBwYXJzZXJfc3RhdGUsCi0JCSAgIHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICogcm9vdF9vcCkKLXsKLQl1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgKnNjb3BlOwotCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIocHNfaW5pdF9zY29wZSwgcm9vdF9vcCk7Ci0KLQlzY29wZSA9IGFjcGlfdXRfY3JlYXRlX2dlbmVyaWNfc3RhdGUoKTsKLQlpZiAoIXNjb3BlKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT19NRU1PUlkpOwotCX0KLQotCXNjb3BlLT5jb21tb24uZGVzY3JpcHRvcl90eXBlID0gQUNQSV9ERVNDX1RZUEVfU1RBVEVfUlBTQ09QRTsKLQlzY29wZS0+cGFyc2Vfc2NvcGUub3AgPSByb290X29wOwotCXNjb3BlLT5wYXJzZV9zY29wZS5hcmdfY291bnQgPSBBQ1BJX1ZBUl9BUkdTOwotCXNjb3BlLT5wYXJzZV9zY29wZS5hcmdfZW5kID0gcGFyc2VyX3N0YXRlLT5hbWxfZW5kOwotCXNjb3BlLT5wYXJzZV9zY29wZS5wa2dfZW5kID0gcGFyc2VyX3N0YXRlLT5hbWxfZW5kOwotCi0JcGFyc2VyX3N0YXRlLT5zY29wZSA9IHNjb3BlOwotCXBhcnNlcl9zdGF0ZS0+c3RhcnRfb3AgPSByb290X29wOwotCi0JcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9wc19wdXNoX3Njb3BlCi0gKgotICogUEFSQU1FVEVSUzogIHBhcnNlcl9zdGF0ZSAgICAgICAgLSBDdXJyZW50IHBhcnNlciBzdGF0ZSBvYmplY3QKLSAqICAgICAgICAgICAgICBPcCAgICAgICAgICAgICAgICAgIC0gQ3VycmVudCBvcCB0byBiZSBwdXNoZWQKLSAqICAgICAgICAgICAgICByZW1haW5pbmdfYXJncyAgICAgIC0gTGlzdCBvZiBhcmdzIHJlbWFpbmluZwotICogICAgICAgICAgICAgIGFyZ19jb3VudCAgICAgICAgICAgLSBGaXhlZCBvciB2YXJpYWJsZSBudW1iZXIgb2YgYXJncwotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKLSAqCi0gKiBERVNDUklQVElPTjogUHVzaCBjdXJyZW50IG9wIHRvIGJlZ2luIHBhcnNpbmcgaXRzIGFyZ3VtZW50Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotYWNwaV9zdGF0dXMKLWFjcGlfcHNfcHVzaF9zY29wZShzdHJ1Y3QgYWNwaV9wYXJzZV9zdGF0ZSAqcGFyc2VyX3N0YXRlLAotCQkgICB1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqb3AsCi0JCSAgIHUzMiByZW1haW5pbmdfYXJncywgdTMyIGFyZ19jb3VudCkKLXsKLQl1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgKnNjb3BlOwotCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIocHNfcHVzaF9zY29wZSwgb3ApOwotCi0Jc2NvcGUgPSBhY3BpX3V0X2NyZWF0ZV9nZW5lcmljX3N0YXRlKCk7Ci0JaWYgKCFzY29wZSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9fTUVNT1JZKTsKLQl9Ci0KLQlzY29wZS0+Y29tbW9uLmRlc2NyaXB0b3JfdHlwZSA9IEFDUElfREVTQ19UWVBFX1NUQVRFX1BTQ09QRTsKLQlzY29wZS0+cGFyc2Vfc2NvcGUub3AgPSBvcDsKLQlzY29wZS0+cGFyc2Vfc2NvcGUuYXJnX2xpc3QgPSByZW1haW5pbmdfYXJnczsKLQlzY29wZS0+cGFyc2Vfc2NvcGUuYXJnX2NvdW50ID0gYXJnX2NvdW50OwotCXNjb3BlLT5wYXJzZV9zY29wZS5wa2dfZW5kID0gcGFyc2VyX3N0YXRlLT5wa2dfZW5kOwotCi0JLyogUHVzaCBvbnRvIHNjb3BlIHN0YWNrICovCi0KLQlhY3BpX3V0X3B1c2hfZ2VuZXJpY19zdGF0ZSgmcGFyc2VyX3N0YXRlLT5zY29wZSwgc2NvcGUpOwotCi0JaWYgKGFyZ19jb3VudCA9PSBBQ1BJX1ZBUl9BUkdTKSB7Ci0KLQkJLyogTXVsdGlwbGUgYXJndW1lbnRzICovCi0KLQkJc2NvcGUtPnBhcnNlX3Njb3BlLmFyZ19lbmQgPSBwYXJzZXJfc3RhdGUtPnBrZ19lbmQ7Ci0JfSBlbHNlIHsKLQkJLyogU2luZ2xlIGFyZ3VtZW50ICovCi0KLQkJc2NvcGUtPnBhcnNlX3Njb3BlLmFyZ19lbmQgPSBBQ1BJX1RPX1BPSU5URVIoQUNQSV9NQVhfUFRSKTsKLQl9Ci0KLQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX3BzX3BvcF9zY29wZQotICoKLSAqIFBBUkFNRVRFUlM6ICBwYXJzZXJfc3RhdGUgICAgICAgIC0gQ3VycmVudCBwYXJzZXIgc3RhdGUgb2JqZWN0Ci0gKiAgICAgICAgICAgICAgT3AgICAgICAgICAgICAgICAgICAtIFdoZXJlIHRoZSBwb3BwZWQgb3AgaXMgcmV0dXJuZWQKLSAqICAgICAgICAgICAgICBhcmdfbGlzdCAgICAgICAgICAgIC0gV2hlcmUgdGhlIHBvcHBlZCAibmV4dCBhcmd1bWVudCIgaXMKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuZWQKLSAqICAgICAgICAgICAgICBhcmdfY291bnQgICAgICAgICAgIC0gQ291bnQgb2Ygb2JqZWN0cyBpbiBhcmdfbGlzdAotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKLSAqCi0gKiBERVNDUklQVElPTjogUmV0dXJuIHRvIHBhcnNpbmcgYSBwcmV2aW91cyBvcAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXZvaWQKLWFjcGlfcHNfcG9wX3Njb3BlKHN0cnVjdCBhY3BpX3BhcnNlX3N0YXRlICpwYXJzZXJfc3RhdGUsCi0JCSAgdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKipvcCwgdTMyICogYXJnX2xpc3QsIHUzMiAqIGFyZ19jb3VudCkKLXsKLQl1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgKnNjb3BlID0gcGFyc2VyX3N0YXRlLT5zY29wZTsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UocHNfcG9wX3Njb3BlKTsKLQotCS8qIE9ubHkgcG9wIHRoZSBzY29wZSBpZiB0aGVyZSBpcyBpbiBmYWN0IGEgbmV4dCBzY29wZSAqLwotCi0JaWYgKHNjb3BlLT5jb21tb24ubmV4dCkgewotCQlzY29wZSA9IGFjcGlfdXRfcG9wX2dlbmVyaWNfc3RhdGUoJnBhcnNlcl9zdGF0ZS0+c2NvcGUpOwotCi0JCS8qIFJldHVybiB0byBwYXJzaW5nIHByZXZpb3VzIG9wICovCi0KLQkJKm9wID0gc2NvcGUtPnBhcnNlX3Njb3BlLm9wOwotCQkqYXJnX2xpc3QgPSBzY29wZS0+cGFyc2Vfc2NvcGUuYXJnX2xpc3Q7Ci0JCSphcmdfY291bnQgPSBzY29wZS0+cGFyc2Vfc2NvcGUuYXJnX2NvdW50OwotCQlwYXJzZXJfc3RhdGUtPnBrZ19lbmQgPSBzY29wZS0+cGFyc2Vfc2NvcGUucGtnX2VuZDsKLQotCQkvKiBBbGwgZG9uZSB3aXRoIHRoaXMgc2NvcGUgc3RhdGUgc3RydWN0dXJlICovCi0KLQkJYWNwaV91dF9kZWxldGVfZ2VuZXJpY19zdGF0ZShzY29wZSk7Ci0JfSBlbHNlIHsKLQkJLyogRW1wdHkgcGFyc2Ugc3RhY2ssIHByZXBhcmUgdG8gZmV0Y2ggbmV4dCBvcGNvZGUgKi8KLQotCQkqb3AgPSBOVUxMOwotCQkqYXJnX2xpc3QgPSAwOwotCQkqYXJnX2NvdW50ID0gMDsKLQl9Ci0KLQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX1BBUlNFLAotCQkJICAiUG9wcGVkIE9wICVwIEFyZ3MgJVhcbiIsICpvcCwgKmFyZ19jb3VudCkpOwotCXJldHVybl9WT0lEOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX3BzX2NsZWFudXBfc2NvcGUKLSAqCi0gKiBQQVJBTUVURVJTOiAgcGFyc2VyX3N0YXRlICAgICAgICAtIEN1cnJlbnQgcGFyc2VyIHN0YXRlIG9iamVjdAotICoKLSAqIFJFVFVSTjogICAgICBOb25lCi0gKgotICogREVTQ1JJUFRJT046IERlc3Ryb3kgYXZhaWxhYmxlIGxpc3QsIHJlbWFpbmluZyBzdGFjayBsZXZlbHMsIGFuZCByZXR1cm4KLSAqICAgICAgICAgICAgICByb290IHNjb3BlCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdm9pZCBhY3BpX3BzX2NsZWFudXBfc2NvcGUoc3RydWN0IGFjcGlfcGFyc2Vfc3RhdGUgKnBhcnNlcl9zdGF0ZSkKLXsKLQl1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgKnNjb3BlOwotCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIocHNfY2xlYW51cF9zY29wZSwgcGFyc2VyX3N0YXRlKTsKLQotCWlmICghcGFyc2VyX3N0YXRlKSB7Ci0JCXJldHVybl9WT0lEOwotCX0KLQotCS8qIERlbGV0ZSBhbnl0aGluZyBvbiB0aGUgc2NvcGUgc3RhY2sgKi8KLQotCXdoaWxlIChwYXJzZXJfc3RhdGUtPnNjb3BlKSB7Ci0JCXNjb3BlID0gYWNwaV91dF9wb3BfZ2VuZXJpY19zdGF0ZSgmcGFyc2VyX3N0YXRlLT5zY29wZSk7Ci0JCWFjcGlfdXRfZGVsZXRlX2dlbmVyaWNfc3RhdGUoc2NvcGUpOwotCX0KLQotCXJldHVybl9WT0lEOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3BhcnNlci9wc3RyZWUuYyBiL2RyaXZlcnMvYWNwaS9wYXJzZXIvcHN0cmVlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkZDM1NWQuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9hY3BpL3BhcnNlci9wc3RyZWUuYworKysgL2Rldi9udWxsCkBAIC0xLDMxMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogTW9kdWxlIE5hbWU6IHBzdHJlZSAtIFBhcnNlciBvcCB0cmVlIG1hbmlwdWxhdGlvbi90cmF2ZXJzYWwvc2VhcmNoCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwOCwgSW50ZWwgQ29ycC4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKLSAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIGF0IG1pbmltdW0gYSBkaXNjbGFpbWVyCi0gKiAgICBzdWJzdGFudGlhbGx5IHNpbWlsYXIgdG8gdGhlICJOTyBXQVJSQU5UWSIgZGlzY2xhaW1lciBiZWxvdwotICogICAgKCJEaXNjbGFpbWVyIikgYW5kIGFueSByZWRpc3RyaWJ1dGlvbiBtdXN0IGJlIGNvbmRpdGlvbmVkIHVwb24KLSAqICAgIGluY2x1ZGluZyBhIHN1YnN0YW50aWFsbHkgc2ltaWxhciBEaXNjbGFpbWVyIHJlcXVpcmVtZW50IGZvciBmdXJ0aGVyCi0gKiAgICBiaW5hcnkgcmVkaXN0cmlidXRpb24uCi0gKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMKLSAqICAgIG9mIGFueSBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTk8gV0FSUkFOVFkKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAotICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKLSAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HCi0gKiBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKLSAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KLSAqLwotCi0jaW5jbHVkZSA8YWNwaS9hY3BpLmg+Ci0jaW5jbHVkZSA8YWNwaS9hY3BhcnNlci5oPgotI2luY2x1ZGUgPGFjcGkvYW1sY29kZS5oPgotCi0jZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9QQVJTRVIKLUFDUElfTU9EVUxFX05BTUUoInBzdHJlZSIpCi0KLS8qIExvY2FsIHByb3RvdHlwZXMgKi8KLSNpZmRlZiBBQ1BJX09CU09MRVRFX0ZVTkNUSU9OUwotdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKmFjcGlfcHNfZ2V0X2NoaWxkKHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpvcCk7Ci0jZW5kaWYKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9wc19nZXRfYXJnCi0gKgotICogUEFSQU1FVEVSUzogIE9wICAgICAgICAgICAgICAtIEdldCBhbiBhcmd1bWVudCBmb3IgdGhpcyBvcAotICogICAgICAgICAgICAgIEFyZ24gICAgICAgICAgICAtIE50aCBhcmd1bWVudCB0byBnZXQKLSAqCi0gKiBSRVRVUk46ICAgICAgVGhlIGFyZ3VtZW50IChhcyBhbiBPcCBvYmplY3QpLiBOVUxMIGlmIGFyZ3VtZW50IGRvZXMgbm90IGV4aXN0Ci0gKgotICogREVTQ1JJUFRJT046IEdldCB0aGUgc3BlY2lmaWVkIG9wJ3MgYXJndW1lbnQuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKmFjcGlfcHNfZ2V0X2FyZyh1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqb3AsIHUzMiBhcmduKQotewotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICphcmcgPSBOVUxMOwotCWNvbnN0IHN0cnVjdCBhY3BpX29wY29kZV9pbmZvICpvcF9pbmZvOwotCi0JQUNQSV9GVU5DVElPTl9FTlRSWSgpOwotCi0JLyogR2V0IHRoZSBpbmZvIHN0cnVjdHVyZSBmb3IgdGhpcyBvcGNvZGUgKi8KLQotCW9wX2luZm8gPSBhY3BpX3BzX2dldF9vcGNvZGVfaW5mbyhvcC0+Y29tbW9uLmFtbF9vcGNvZGUpOwotCWlmIChvcF9pbmZvLT5jbGFzcyA9PSBBTUxfQ0xBU1NfVU5LTk9XTikgewotCi0JCS8qIEludmFsaWQgb3Bjb2RlIG9yIEFTQ0lJIGNoYXJhY3RlciAqLwotCi0JCXJldHVybiAoTlVMTCk7Ci0JfQotCi0JLyogQ2hlY2sgaWYgdGhpcyBvcGNvZGUgcmVxdWlyZXMgYXJndW1lbnQgc3ViLW9iamVjdHMgKi8KLQotCWlmICghKG9wX2luZm8tPmZsYWdzICYgQU1MX0hBU19BUkdTKSkgewotCi0JCS8qIEhhcyBubyBsaW5rZWQgYXJndW1lbnQgb2JqZWN0cyAqLwotCi0JCXJldHVybiAoTlVMTCk7Ci0JfQotCi0JLyogR2V0IHRoZSByZXF1ZXN0ZWQgYXJndW1lbnQgb2JqZWN0ICovCi0KLQlhcmcgPSBvcC0+Y29tbW9uLnZhbHVlLmFyZzsKLQl3aGlsZSAoYXJnICYmIGFyZ24pIHsKLQkJYXJnbi0tOwotCQlhcmcgPSBhcmctPmNvbW1vbi5uZXh0OwotCX0KLQotCXJldHVybiAoYXJnKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9wc19hcHBlbmRfYXJnCi0gKgotICogUEFSQU1FVEVSUzogIE9wICAgICAgICAgICAgICAtIEFwcGVuZCBhbiBhcmd1bWVudCB0byB0aGlzIE9wLgotICogICAgICAgICAgICAgIEFyZyAgICAgICAgICAgICAtIEFyZ3VtZW50IE9wIHRvIGFwcGVuZAotICoKLSAqIFJFVFVSTjogICAgICBOb25lLgotICoKLSAqIERFU0NSSVBUSU9OOiBBcHBlbmQgYW4gYXJndW1lbnQgdG8gYW4gb3AncyBhcmd1bWVudCBsaXN0IChhIE5VTEwgYXJnIGlzIE9LKQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXZvaWQKLWFjcGlfcHNfYXBwZW5kX2FyZyh1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqb3AsIHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICphcmcpCi17Ci0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKnByZXZfYXJnOwotCWNvbnN0IHN0cnVjdCBhY3BpX29wY29kZV9pbmZvICpvcF9pbmZvOwotCi0JQUNQSV9GVU5DVElPTl9FTlRSWSgpOwotCi0JaWYgKCFvcCkgewotCQlyZXR1cm47Ci0JfQotCi0JLyogR2V0IHRoZSBpbmZvIHN0cnVjdHVyZSBmb3IgdGhpcyBvcGNvZGUgKi8KLQotCW9wX2luZm8gPSBhY3BpX3BzX2dldF9vcGNvZGVfaW5mbyhvcC0+Y29tbW9uLmFtbF9vcGNvZGUpOwotCWlmIChvcF9pbmZvLT5jbGFzcyA9PSBBTUxfQ0xBU1NfVU5LTk9XTikgewotCi0JCS8qIEludmFsaWQgb3Bjb2RlICovCi0KLQkJQUNQSV9FUlJPUigoQUVfSU5GTywgIkludmFsaWQgQU1MIE9wY29kZTogMHglMi4yWCIsCi0JCQkgICAgb3AtPmNvbW1vbi5hbWxfb3Bjb2RlKSk7Ci0JCXJldHVybjsKLQl9Ci0KLQkvKiBDaGVjayBpZiB0aGlzIG9wY29kZSByZXF1aXJlcyBhcmd1bWVudCBzdWItb2JqZWN0cyAqLwotCi0JaWYgKCEob3BfaW5mby0+ZmxhZ3MgJiBBTUxfSEFTX0FSR1MpKSB7Ci0KLQkJLyogSGFzIG5vIGxpbmtlZCBhcmd1bWVudCBvYmplY3RzICovCi0KLQkJcmV0dXJuOwotCX0KLQotCS8qIEFwcGVuZCB0aGUgYXJndW1lbnQgdG8gdGhlIGxpbmtlZCBhcmd1bWVudCBsaXN0ICovCi0KLQlpZiAob3AtPmNvbW1vbi52YWx1ZS5hcmcpIHsKLQotCQkvKiBBcHBlbmQgdG8gZXhpc3RpbmcgYXJndW1lbnQgbGlzdCAqLwotCi0JCXByZXZfYXJnID0gb3AtPmNvbW1vbi52YWx1ZS5hcmc7Ci0JCXdoaWxlIChwcmV2X2FyZy0+Y29tbW9uLm5leHQpIHsKLQkJCXByZXZfYXJnID0gcHJldl9hcmctPmNvbW1vbi5uZXh0OwotCQl9Ci0JCXByZXZfYXJnLT5jb21tb24ubmV4dCA9IGFyZzsKLQl9IGVsc2UgewotCQkvKiBObyBhcmd1bWVudCBsaXN0LCB0aGlzIHdpbGwgYmUgdGhlIGZpcnN0IGFyZ3VtZW50ICovCi0KLQkJb3AtPmNvbW1vbi52YWx1ZS5hcmcgPSBhcmc7Ci0JfQotCi0JLyogU2V0IHRoZSBwYXJlbnQgaW4gdGhpcyBhcmcgYW5kIGFueSBhcmdzIGxpbmtlZCBhZnRlciBpdCAqLwotCi0Jd2hpbGUgKGFyZykgewotCQlhcmctPmNvbW1vbi5wYXJlbnQgPSBvcDsKLQkJYXJnID0gYXJnLT5jb21tb24ubmV4dDsKLQotCQlvcC0+Y29tbW9uLmFyZ19saXN0X2xlbmd0aCsrOwotCX0KLX0KLQotI2lmZGVmIEFDUElfRlVUVVJFX1VTQUdFCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX3BzX2dldF9kZXB0aF9uZXh0Ci0gKgotICogUEFSQU1FVEVSUzogIE9yaWdpbiAgICAgICAgICAtIFJvb3Qgb2Ygc3VidHJlZSB0byBzZWFyY2gKLSAqICAgICAgICAgICAgICBPcCAgICAgICAgICAgICAgLSBMYXN0IChwcmV2aW91cykgT3AgdGhhdCB3YXMgZm91bmQKLSAqCi0gKiBSRVRVUk46ICAgICAgTmV4dCBPcCBmb3VuZCBpbiB0aGUgc2VhcmNoLgotICoKLSAqIERFU0NSSVBUSU9OOiBHZXQgbmV4dCBvcCBpbiB0cmVlICh3YWxraW5nIHRoZSB0cmVlIGluIGRlcHRoLWZpcnN0IG9yZGVyKQotICogICAgICAgICAgICAgIFJldHVybiBOVUxMIHdoZW4gcmVhY2hpbmcgIm9yaWdpbiIgb3Igd2hlbiB3YWxraW5nIHVwIGZyb20gcm9vdAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICphY3BpX3BzX2dldF9kZXB0aF9uZXh0KHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpvcmlnaW4sCi0JCQkJCQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqb3ApCi17Ci0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKm5leHQgPSBOVUxMOwotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpwYXJlbnQ7Ci0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKmFyZzsKLQotCUFDUElfRlVOQ1RJT05fRU5UUlkoKTsKLQotCWlmICghb3ApIHsKLQkJcmV0dXJuIChOVUxMKTsKLQl9Ci0KLQkvKiBMb29rIGZvciBhbiBhcmd1bWVudCBvciBjaGlsZCAqLwotCi0JbmV4dCA9IGFjcGlfcHNfZ2V0X2FyZyhvcCwgMCk7Ci0JaWYgKG5leHQpIHsKLQkJcmV0dXJuIChuZXh0KTsKLQl9Ci0KLQkvKiBMb29rIGZvciBhIHNpYmxpbmcgKi8KLQotCW5leHQgPSBvcC0+Y29tbW9uLm5leHQ7Ci0JaWYgKG5leHQpIHsKLQkJcmV0dXJuIChuZXh0KTsKLQl9Ci0KLQkvKiBMb29rIGZvciBhIHNpYmxpbmcgb2YgcGFyZW50ICovCi0KLQlwYXJlbnQgPSBvcC0+Y29tbW9uLnBhcmVudDsKLQotCXdoaWxlIChwYXJlbnQpIHsKLQkJYXJnID0gYWNwaV9wc19nZXRfYXJnKHBhcmVudCwgMCk7Ci0JCXdoaWxlIChhcmcgJiYgKGFyZyAhPSBvcmlnaW4pICYmIChhcmcgIT0gb3ApKSB7Ci0JCQlhcmcgPSBhcmctPmNvbW1vbi5uZXh0OwotCQl9Ci0KLQkJaWYgKGFyZyA9PSBvcmlnaW4pIHsKLQotCQkJLyogUmVhY2hlZCBwYXJlbnQgb2Ygb3JpZ2luLCBlbmQgc2VhcmNoICovCi0KLQkJCXJldHVybiAoTlVMTCk7Ci0JCX0KLQotCQlpZiAocGFyZW50LT5jb21tb24ubmV4dCkgewotCi0JCQkvKiBGb3VuZCBzaWJsaW5nIG9mIHBhcmVudCAqLwotCi0JCQlyZXR1cm4gKHBhcmVudC0+Y29tbW9uLm5leHQpOwotCQl9Ci0KLQkJb3AgPSBwYXJlbnQ7Ci0JCXBhcmVudCA9IHBhcmVudC0+Y29tbW9uLnBhcmVudDsKLQl9Ci0KLQlyZXR1cm4gKG5leHQpOwotfQotCi0jaWZkZWYgQUNQSV9PQlNPTEVURV9GVU5DVElPTlMKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfcHNfZ2V0X2NoaWxkCi0gKgotICogUEFSQU1FVEVSUzogIE9wICAgICAgICAgICAgICAtIEdldCB0aGUgY2hpbGQgb2YgdGhpcyBPcAotICoKLSAqIFJFVFVSTjogICAgICBDaGlsZCBPcCwgTnVsbCBpZiBub25lIGlzIGZvdW5kLgotICoKLSAqIERFU0NSSVBUSU9OOiBHZXQgb3AncyBjaGlsZHJlbiBvciBOVUxMIGlmIG5vbmUKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi11bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqYWNwaV9wc19nZXRfY2hpbGQodW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKm9wKQotewotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpjaGlsZCA9IE5VTEw7Ci0KLQlBQ1BJX0ZVTkNUSU9OX0VOVFJZKCk7Ci0KLQlzd2l0Y2ggKG9wLT5jb21tb24uYW1sX29wY29kZSkgewotCWNhc2UgQU1MX1NDT1BFX09QOgotCWNhc2UgQU1MX0VMU0VfT1A6Ci0JY2FzZSBBTUxfREVWSUNFX09QOgotCWNhc2UgQU1MX1RIRVJNQUxfWk9ORV9PUDoKLQljYXNlIEFNTF9JTlRfTUVUSE9EQ0FMTF9PUDoKLQotCQljaGlsZCA9IGFjcGlfcHNfZ2V0X2FyZyhvcCwgMCk7Ci0JCWJyZWFrOwotCi0JY2FzZSBBTUxfQlVGRkVSX09QOgotCWNhc2UgQU1MX1BBQ0tBR0VfT1A6Ci0JY2FzZSBBTUxfTUVUSE9EX09QOgotCWNhc2UgQU1MX0lGX09QOgotCWNhc2UgQU1MX1dISUxFX09QOgotCWNhc2UgQU1MX0ZJRUxEX09QOgotCi0JCWNoaWxkID0gYWNwaV9wc19nZXRfYXJnKG9wLCAxKTsKLQkJYnJlYWs7Ci0KLQljYXNlIEFNTF9QT1dFUl9SRVNfT1A6Ci0JY2FzZSBBTUxfSU5ERVhfRklFTERfT1A6Ci0KLQkJY2hpbGQgPSBhY3BpX3BzX2dldF9hcmcob3AsIDIpOwotCQlicmVhazsKLQotCWNhc2UgQU1MX1BST0NFU1NPUl9PUDoKLQljYXNlIEFNTF9CQU5LX0ZJRUxEX09QOgotCi0JCWNoaWxkID0gYWNwaV9wc19nZXRfYXJnKG9wLCAzKTsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQkvKiBBbGwgb3RoZXJzIGhhdmUgbm8gY2hpbGRyZW4gKi8KLQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIChjaGlsZCk7Ci19Ci0jZW5kaWYKLSNlbmRpZgkJCQkvKiAgQUNQSV9GVVRVUkVfVVNBR0UgICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvcGFyc2VyL3BzdXRpbHMuYyBiL2RyaXZlcnMvYWNwaS9wYXJzZXIvcHN1dGlscy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Y2YxZjY1Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvYWNwaS9wYXJzZXIvcHN1dGlscy5jCisrKyAvZGV2L251bGwKQEAgLTEsMjQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBNb2R1bGUgTmFtZTogcHN1dGlscyAtIFBhcnNlciBtaXNjZWxsYW5lb3VzIHV0aWxpdGllcyAoUGFyc2VyIG9ubHkpCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwOCwgSW50ZWwgQ29ycC4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKLSAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIGF0IG1pbmltdW0gYSBkaXNjbGFpbWVyCi0gKiAgICBzdWJzdGFudGlhbGx5IHNpbWlsYXIgdG8gdGhlICJOTyBXQVJSQU5UWSIgZGlzY2xhaW1lciBiZWxvdwotICogICAgKCJEaXNjbGFpbWVyIikgYW5kIGFueSByZWRpc3RyaWJ1dGlvbiBtdXN0IGJlIGNvbmRpdGlvbmVkIHVwb24KLSAqICAgIGluY2x1ZGluZyBhIHN1YnN0YW50aWFsbHkgc2ltaWxhciBEaXNjbGFpbWVyIHJlcXVpcmVtZW50IGZvciBmdXJ0aGVyCi0gKiAgICBiaW5hcnkgcmVkaXN0cmlidXRpb24uCi0gKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMKLSAqICAgIG9mIGFueSBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTk8gV0FSUkFOVFkKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAotICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKLSAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HCi0gKiBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKLSAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KLSAqLwotCi0jaW5jbHVkZSA8YWNwaS9hY3BpLmg+Ci0jaW5jbHVkZSA8YWNwaS9hY3BhcnNlci5oPgotI2luY2x1ZGUgPGFjcGkvYW1sY29kZS5oPgotCi0jZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9QQVJTRVIKLUFDUElfTU9EVUxFX05BTUUoInBzdXRpbHMiKQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX3BzX2NyZWF0ZV9zY29wZV9vcAotICoKLSAqIFBBUkFNRVRFUlM6ICBOb25lCi0gKgotICogUkVUVVJOOiAgICAgIEEgbmV3IFNjb3BlIG9iamVjdCwgbnVsbCBvbiBmYWlsdXJlCi0gKgotICogREVTQ1JJUFRJT046IENyZWF0ZSBhIFNjb3BlIGFuZCBhc3NvY2lhdGVkIG5hbWVwYXRoIG9wIHdpdGggdGhlIHJvb3QgbmFtZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqYWNwaV9wc19jcmVhdGVfc2NvcGVfb3Aodm9pZCkKLXsKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqc2NvcGVfb3A7Ci0KLQlzY29wZV9vcCA9IGFjcGlfcHNfYWxsb2Nfb3AoQU1MX1NDT1BFX09QKTsKLQlpZiAoIXNjb3BlX29wKSB7Ci0JCXJldHVybiAoTlVMTCk7Ci0JfQotCi0Jc2NvcGVfb3AtPm5hbWVkLm5hbWUgPSBBQ1BJX1JPT1RfTkFNRTsKLQlyZXR1cm4gKHNjb3BlX29wKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9wc19pbml0X29wCi0gKgotICogUEFSQU1FVEVSUzogIE9wICAgICAgICAgICAgICAtIEEgbmV3bHkgYWxsb2NhdGVkIE9wIG9iamVjdAotICogICAgICAgICAgICAgIE9wY29kZSAgICAgICAgICAtIE9wY29kZSB0byBzdG9yZSBpbiB0aGUgT3AKLSAqCi0gKiBSRVRVUk46ICAgICAgTm9uZQotICoKLSAqIERFU0NSSVBUSU9OOiBJbml0aWFsaXplIGEgcGFyc2UgKE9wKSBvYmplY3QKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi12b2lkIGFjcGlfcHNfaW5pdF9vcCh1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqb3AsIHUxNiBvcGNvZGUpCi17Ci0JQUNQSV9GVU5DVElPTl9FTlRSWSgpOwotCi0Jb3AtPmNvbW1vbi5kZXNjcmlwdG9yX3R5cGUgPSBBQ1BJX0RFU0NfVFlQRV9QQVJTRVI7Ci0Jb3AtPmNvbW1vbi5hbWxfb3Bjb2RlID0gb3Bjb2RlOwotCi0JQUNQSV9ESVNBU01fT05MWV9NRU1CRVJTKEFDUElfU1RSTkNQWShvcC0+Y29tbW9uLmFtbF9vcF9uYW1lLAotCQkJCQkgICAgICAoYWNwaV9wc19nZXRfb3Bjb2RlX2luZm8KLQkJCQkJICAgICAgIChvcGNvZGUpKS0+bmFtZSwKLQkJCQkJICAgICAgc2l6ZW9mKG9wLT5jb21tb24uYW1sX29wX25hbWUpKSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfcHNfYWxsb2Nfb3AKLSAqCi0gKiBQQVJBTUVURVJTOiAgT3Bjb2RlICAgICAgICAgIC0gT3Bjb2RlIHRoYXQgd2lsbCBiZSBzdG9yZWQgaW4gdGhlIG5ldyBPcAotICoKLSAqIFJFVFVSTjogICAgICBQb2ludGVyIHRvIHRoZSBuZXcgT3AsIG51bGwgb24gZmFpbHVyZQotICoKLSAqIERFU0NSSVBUSU9OOiBBbGxvY2F0ZSBhbiBhY3BpX29wLCBjaG9vc2Ugb3AgdHlwZSAoYW5kIHRodXMgc2l6ZSkgYmFzZWQgb24KLSAqICAgICAgICAgICAgICBvcGNvZGUuICBBIGNhY2hlIG9mIG9wY29kZXMgaXMgYXZhaWxhYmxlIGZvciB0aGUgcHVyZQotICogICAgICAgICAgICAgIEdFTkVSSUNfT1AsIHNpbmNlIHRoaXMgaXMgYnkgZmFyIHRoZSBtb3N0IGNvbW1vbmx5IHVzZWQuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKmFjcGlfcHNfYWxsb2Nfb3AodTE2IG9wY29kZSkKLXsKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqb3A7Ci0JY29uc3Qgc3RydWN0IGFjcGlfb3Bjb2RlX2luZm8gKm9wX2luZm87Ci0JdTggZmxhZ3MgPSBBQ1BJX1BBUlNFT1BfR0VORVJJQzsKLQotCUFDUElfRlVOQ1RJT05fRU5UUlkoKTsKLQotCW9wX2luZm8gPSBhY3BpX3BzX2dldF9vcGNvZGVfaW5mbyhvcGNvZGUpOwotCi0JLyogRGV0ZXJtaW5lIHR5cGUgb2YgcGFyc2Vfb3AgcmVxdWlyZWQgKi8KLQotCWlmIChvcF9pbmZvLT5mbGFncyAmIEFNTF9ERUZFUikgewotCQlmbGFncyA9IEFDUElfUEFSU0VPUF9ERUZFUlJFRDsKLQl9IGVsc2UgaWYgKG9wX2luZm8tPmZsYWdzICYgQU1MX05BTUVEKSB7Ci0JCWZsYWdzID0gQUNQSV9QQVJTRU9QX05BTUVEOwotCX0gZWxzZSBpZiAob3Bjb2RlID09IEFNTF9JTlRfQllURUxJU1RfT1ApIHsKLQkJZmxhZ3MgPSBBQ1BJX1BBUlNFT1BfQllURUxJU1Q7Ci0JfQotCi0JLyogQWxsb2NhdGUgdGhlIG1pbmltdW0gcmVxdWlyZWQgc2l6ZSBvYmplY3QgKi8KLQotCWlmIChmbGFncyA9PSBBQ1BJX1BBUlNFT1BfR0VORVJJQykgewotCi0JCS8qIFRoZSBnZW5lcmljIG9wIChkZWZhdWx0KSBpcyBieSBmYXIgdGhlIG1vc3QgY29tbW9uICgxNiB0byAxKSAqLwotCi0JCW9wID0gYWNwaV9vc19hY3F1aXJlX29iamVjdChhY3BpX2dibF9wc19ub2RlX2NhY2hlKTsKLQl9IGVsc2UgewotCQkvKiBFeHRlbmRlZCBwYXJzZW9wICovCi0KLQkJb3AgPSBhY3BpX29zX2FjcXVpcmVfb2JqZWN0KGFjcGlfZ2JsX3BzX25vZGVfZXh0X2NhY2hlKTsKLQl9Ci0KLQkvKiBJbml0aWFsaXplIHRoZSBPcCAqLwotCi0JaWYgKG9wKSB7Ci0JCWFjcGlfcHNfaW5pdF9vcChvcCwgb3Bjb2RlKTsKLQkJb3AtPmNvbW1vbi5mbGFncyA9IGZsYWdzOwotCX0KLQotCXJldHVybiAob3ApOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX3BzX2ZyZWVfb3AKLSAqCi0gKiBQQVJBTUVURVJTOiAgT3AgICAgICAgICAgICAgIC0gT3AgdG8gYmUgZnJlZWQKLSAqCi0gKiBSRVRVUk46ICAgICAgTm9uZS4KLSAqCi0gKiBERVNDUklQVElPTjogRnJlZSBhbiBPcCBvYmplY3QuICBFaXRoZXIgcHV0IGl0IG9uIHRoZSBHRU5FUklDX09QIGNhY2hlIGxpc3QKLSAqICAgICAgICAgICAgICBvciBhY3R1YWxseSBmcmVlIGl0LgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXZvaWQgYWNwaV9wc19mcmVlX29wKHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpvcCkKLXsKLQlBQ1BJX0ZVTkNUSU9OX05BTUUocHNfZnJlZV9vcCk7Ci0KLQlpZiAob3AtPmNvbW1vbi5hbWxfb3Bjb2RlID09IEFNTF9JTlRfUkVUVVJOX1ZBTFVFX09QKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfQUxMT0NBVElPTlMsICJGcmVlIHJldHZhbCBvcDogJXBcbiIsCi0JCQkJICBvcCkpOwotCX0KLQotCWlmIChvcC0+Y29tbW9uLmZsYWdzICYgQUNQSV9QQVJTRU9QX0dFTkVSSUMpIHsKLQkJKHZvaWQpYWNwaV9vc19yZWxlYXNlX29iamVjdChhY3BpX2dibF9wc19ub2RlX2NhY2hlLCBvcCk7Ci0JfSBlbHNlIHsKLQkJKHZvaWQpYWNwaV9vc19yZWxlYXNlX29iamVjdChhY3BpX2dibF9wc19ub2RlX2V4dF9jYWNoZSwgb3ApOwotCX0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgVXRpbGl0eSBmdW5jdGlvbnMKLSAqCi0gKiBERVNDUklQVElPTjogTG93IGxldmVsIGNoYXJhY3RlciBhbmQgb2JqZWN0IGZ1bmN0aW9ucwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qCi0gKiBJcyAiYyIgYSBuYW1lc3RyaW5nIGxlYWQgY2hhcmFjdGVyPwotICovCi11OCBhY3BpX3BzX2lzX2xlYWRpbmdfY2hhcih1MzIgYykKLXsKLQlyZXR1cm4gKCh1OCkgKGMgPT0gJ18nIHx8IChjID49ICdBJyAmJiBjIDw9ICdaJykpKTsKLX0KLQotLyoKLSAqIElzICJjIiBhIG5hbWVzdHJpbmcgcHJlZml4IGNoYXJhY3Rlcj8KLSAqLwotdTggYWNwaV9wc19pc19wcmVmaXhfY2hhcih1MzIgYykKLXsKLQlyZXR1cm4gKCh1OCkgKGMgPT0gJ1xcJyB8fCBjID09ICdeJykpOwotfQotCi0vKgotICogR2V0IG9wJ3MgbmFtZSAoNC1ieXRlIG5hbWUgc2VnbWVudCkgb3IgMCBpZiB1bm5hbWVkCi0gKi8KLSNpZmRlZiBBQ1BJX0ZVVFVSRV9VU0FHRQotdTMyIGFjcGlfcHNfZ2V0X25hbWUodW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKiBvcCkKLXsKLQotCS8qIFRoZSAiZ2VuZXJpYyIgb2JqZWN0IGhhcyBubyBuYW1lIGFzc29jaWF0ZWQgd2l0aCBpdCAqLwotCi0JaWYgKG9wLT5jb21tb24uZmxhZ3MgJiBBQ1BJX1BBUlNFT1BfR0VORVJJQykgewotCQlyZXR1cm4gKDApOwotCX0KLQotCS8qIE9ubHkgdGhlICJFeHRlbmRlZCIgcGFyc2Ugb2JqZWN0cyBoYXZlIGEgbmFtZSAqLwotCi0JcmV0dXJuIChvcC0+bmFtZWQubmFtZSk7Ci19Ci0jZW5kaWYJCQkJLyogIEFDUElfRlVUVVJFX1VTQUdFICAqLwotCi0vKgotICogU2V0IG9wJ3MgbmFtZQotICovCi12b2lkIGFjcGlfcHNfc2V0X25hbWUodW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKm9wLCB1MzIgbmFtZSkKLXsKLQotCS8qIFRoZSAiZ2VuZXJpYyIgb2JqZWN0IGhhcyBubyBuYW1lIGFzc29jaWF0ZWQgd2l0aCBpdCAqLwotCi0JaWYgKG9wLT5jb21tb24uZmxhZ3MgJiBBQ1BJX1BBUlNFT1BfR0VORVJJQykgewotCQlyZXR1cm47Ci0JfQotCi0Jb3AtPm5hbWVkLm5hbWUgPSBuYW1lOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3BhcnNlci9wc3dhbGsuYyBiL2RyaXZlcnMvYWNwaS9wYXJzZXIvcHN3YWxrLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiODZhZDUuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9hY3BpL3BhcnNlci9wc3dhbGsuYworKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogTW9kdWxlIE5hbWU6IHBzd2FsayAtIFBhcnNlciByb3V0aW5lcyB0byB3YWxrIHBhcnNlZCBvcCB0cmVlKHMpCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwOCwgSW50ZWwgQ29ycC4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKLSAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIGF0IG1pbmltdW0gYSBkaXNjbGFpbWVyCi0gKiAgICBzdWJzdGFudGlhbGx5IHNpbWlsYXIgdG8gdGhlICJOTyBXQVJSQU5UWSIgZGlzY2xhaW1lciBiZWxvdwotICogICAgKCJEaXNjbGFpbWVyIikgYW5kIGFueSByZWRpc3RyaWJ1dGlvbiBtdXN0IGJlIGNvbmRpdGlvbmVkIHVwb24KLSAqICAgIGluY2x1ZGluZyBhIHN1YnN0YW50aWFsbHkgc2ltaWxhciBEaXNjbGFpbWVyIHJlcXVpcmVtZW50IGZvciBmdXJ0aGVyCi0gKiAgICBiaW5hcnkgcmVkaXN0cmlidXRpb24uCi0gKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMKLSAqICAgIG9mIGFueSBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTk8gV0FSUkFOVFkKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAotICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKLSAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HCi0gKiBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKLSAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KLSAqLwotCi0jaW5jbHVkZSA8YWNwaS9hY3BpLmg+Ci0jaW5jbHVkZSA8YWNwaS9hY3BhcnNlci5oPgotCi0jZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9QQVJTRVIKLUFDUElfTU9EVUxFX05BTUUoInBzd2FsayIpCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfcHNfZGVsZXRlX3BhcnNlX3RyZWUKLSAqCi0gKiBQQVJBTUVURVJTOiAgc3VidHJlZV9yb290ICAgICAgICAtIFJvb3Qgb2YgdHJlZSAob3Igc3VidHJlZSkgdG8gZGVsZXRlCi0gKgotICogUkVUVVJOOiAgICAgIE5vbmUKLSAqCi0gKiBERVNDUklQVElPTjogRGVsZXRlIGEgcG9ydGlvbiBvZiBvciBhbiBlbnRpcmUgcGFyc2UgdHJlZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBhY3BpX3BzX2RlbGV0ZV9wYXJzZV90cmVlKHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpzdWJ0cmVlX3Jvb3QpCi17Ci0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKm9wID0gc3VidHJlZV9yb290OwotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpuZXh0ID0gTlVMTDsKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqcGFyZW50ID0gTlVMTDsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKHBzX2RlbGV0ZV9wYXJzZV90cmVlLCBzdWJ0cmVlX3Jvb3QpOwotCi0JLyogVmlzaXQgYWxsIG5vZGVzIGluIHRoZSBzdWJ0cmVlICovCi0KLQl3aGlsZSAob3ApIHsKLQotCQkvKiBDaGVjayBpZiB3ZSBhcmUgbm90IGFzY2VuZGluZyAqLwotCi0JCWlmIChvcCAhPSBwYXJlbnQpIHsKLQotCQkJLyogTG9vayBmb3IgYW4gYXJndW1lbnQgb3IgY2hpbGQgb2YgdGhlIGN1cnJlbnQgb3AgKi8KLQotCQkJbmV4dCA9IGFjcGlfcHNfZ2V0X2FyZyhvcCwgMCk7Ci0JCQlpZiAobmV4dCkgewotCi0JCQkJLyogU3RpbGwgZ29pbmcgZG93bndhcmQgaW4gdHJlZSAoT3AgaXMgbm90IGNvbXBsZXRlZCB5ZXQpICovCi0KLQkJCQlvcCA9IG5leHQ7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCX0KLQotCQkvKiBObyBtb3JlIGNoaWxkcmVuLCB0aGlzIE9wIGlzIGNvbXBsZXRlLiAqLwotCi0JCW5leHQgPSBvcC0+Y29tbW9uLm5leHQ7Ci0JCXBhcmVudCA9IG9wLT5jb21tb24ucGFyZW50OwotCi0JCWFjcGlfcHNfZnJlZV9vcChvcCk7Ci0KLQkJLyogSWYgd2UgYXJlIGJhY2sgdG8gdGhlIHN0YXJ0aW5nIHBvaW50LCB0aGUgd2FsayBpcyBjb21wbGV0ZS4gKi8KLQotCQlpZiAob3AgPT0gc3VidHJlZV9yb290KSB7Ci0JCQlyZXR1cm5fVk9JRDsKLQkJfQotCQlpZiAobmV4dCkgewotCQkJb3AgPSBuZXh0OwotCQl9IGVsc2UgewotCQkJb3AgPSBwYXJlbnQ7Ci0JCX0KLQl9Ci0KLQlyZXR1cm5fVk9JRDsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9wYXJzZXIvcHN4ZmFjZS5jIGIvZHJpdmVycy9hY3BpL3BhcnNlci9wc3hmYWNlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3MDQ2OWEuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9hY3BpL3BhcnNlci9wc3hmYWNlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIE1vZHVsZSBOYW1lOiBwc3hmYWNlIC0gUGFyc2VyIGV4dGVybmFsIGludGVyZmFjZXMKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA4LCBJbnRlbCBDb3JwLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAotICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgYXQgbWluaW11bSBhIGRpc2NsYWltZXIKLSAqICAgIHN1YnN0YW50aWFsbHkgc2ltaWxhciB0byB0aGUgIk5PIFdBUlJBTlRZIiBkaXNjbGFpbWVyIGJlbG93Ci0gKiAgICAoIkRpc2NsYWltZXIiKSBhbmQgYW55IHJlZGlzdHJpYnV0aW9uIG11c3QgYmUgY29uZGl0aW9uZWQgdXBvbgotICogICAgaW5jbHVkaW5nIGEgc3Vic3RhbnRpYWxseSBzaW1pbGFyIERpc2NsYWltZXIgcmVxdWlyZW1lbnQgZm9yIGZ1cnRoZXIKLSAqICAgIGJpbmFyeSByZWRpc3RyaWJ1dGlvbi4KLSAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcwotICogICAgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICogU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBOTyBXQVJSQU5UWQotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCi0gKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUwotICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcKLSAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQotICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgotICovCi0KLSNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KLSNpbmNsdWRlIDxhY3BpL2FjcGFyc2VyLmg+Ci0jaW5jbHVkZSA8YWNwaS9hY2Rpc3BhdC5oPgotI2luY2x1ZGUgPGFjcGkvYWNpbnRlcnAuaD4KLQotI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfUEFSU0VSCi1BQ1BJX01PRFVMRV9OQU1FKCJwc3hmYWNlIikKLQotLyogTG9jYWwgUHJvdG90eXBlcyAqLwotc3RhdGljIHZvaWQgYWNwaV9wc19zdGFydF90cmFjZShzdHJ1Y3QgYWNwaV9ldmFsdWF0ZV9pbmZvICppbmZvKTsKLQotc3RhdGljIHZvaWQgYWNwaV9wc19zdG9wX3RyYWNlKHN0cnVjdCBhY3BpX2V2YWx1YXRlX2luZm8gKmluZm8pOwotCi1zdGF0aWMgdm9pZAotYWNwaV9wc191cGRhdGVfcGFyYW1ldGVyX2xpc3Qoc3RydWN0IGFjcGlfZXZhbHVhdGVfaW5mbyAqaW5mbywgdTE2IGFjdGlvbik7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfZGVidWdfdHJhY2UKLSAqCi0gKiBQQVJBTUVURVJTOiAgbWV0aG9kX25hbWUgICAgIC0gVmFsaWQgQUNQSSBuYW1lIHN0cmluZwotICogICAgICAgICAgICAgIGRlYnVnX2xldmVsICAgICAtIE9wdGlvbmFsIGxldmVsIG1hc2suIDAgdG8gdXNlIGRlZmF1bHQKLSAqICAgICAgICAgICAgICBkZWJ1Z19sYXllciAgICAgLSBPcHRpb25hbCBsYXllciBtYXNrLiAwIHRvIHVzZSBkZWZhdWx0Ci0gKiAgICAgICAgICAgICAgRmxhZ3MgICAgICAgICAgIC0gYml0IDE6IG9uZSBzaG90KDEpIG9yIHBlcnNpc3RlbnQoMCkKLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IEV4dGVybmFsIGludGVyZmFjZSB0byBlbmFibGUgZGVidWcgdHJhY2luZyBkdXJpbmcgY29udHJvbAotICogICAgICAgICAgICAgIG1ldGhvZCBleGVjdXRpb24KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1hY3BpX3N0YXR1cwotYWNwaV9kZWJ1Z190cmFjZShjaGFyICpuYW1lLCB1MzIgZGVidWdfbGV2ZWwsIHUzMiBkZWJ1Z19sYXllciwgdTMyIGZsYWdzKQotewotCWFjcGlfc3RhdHVzIHN0YXR1czsKLQotCXN0YXR1cyA9IGFjcGlfdXRfYWNxdWlyZV9tdXRleChBQ1BJX01UWF9OQU1FU1BBQ0UpOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlyZXR1cm4gKHN0YXR1cyk7Ci0JfQotCi0JLyogVEJEczogVmFsaWRhdGUgbmFtZSwgYWxsb3cgZnVsbCBwYXRoIG9yIGp1c3QgbmFtZXNlZyAqLwotCi0JYWNwaV9nYmxfdHJhY2VfbWV0aG9kX25hbWUgPSAqQUNQSV9DQVNUX1BUUih1MzIsIG5hbWUpOwotCWFjcGlfZ2JsX3RyYWNlX2ZsYWdzID0gZmxhZ3M7Ci0KLQlpZiAoZGVidWdfbGV2ZWwpIHsKLQkJYWNwaV9nYmxfdHJhY2VfZGJnX2xldmVsID0gZGVidWdfbGV2ZWw7Ci0JfQotCWlmIChkZWJ1Z19sYXllcikgewotCQlhY3BpX2dibF90cmFjZV9kYmdfbGF5ZXIgPSBkZWJ1Z19sYXllcjsKLQl9Ci0KLQkodm9pZClhY3BpX3V0X3JlbGVhc2VfbXV0ZXgoQUNQSV9NVFhfTkFNRVNQQUNFKTsKLQlyZXR1cm4gKEFFX09LKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9wc19zdGFydF90cmFjZQotICoKLSAqIFBBUkFNRVRFUlM6ICBJbmZvICAgICAgICAtIE1ldGhvZCBpbmZvIHN0cnVjdAotICoKLSAqIFJFVFVSTjogICAgICBOb25lCi0gKgotICogREVTQ1JJUFRJT046IFN0YXJ0IGNvbnRyb2wgbWV0aG9kIGV4ZWN1dGlvbiB0cmFjZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyB2b2lkIGFjcGlfcHNfc3RhcnRfdHJhY2Uoc3RydWN0IGFjcGlfZXZhbHVhdGVfaW5mbyAqaW5mbykKLXsKLQlhY3BpX3N0YXR1cyBzdGF0dXM7Ci0KLQlBQ1BJX0ZVTkNUSU9OX0VOVFJZKCk7Ci0KLQlzdGF0dXMgPSBhY3BpX3V0X2FjcXVpcmVfbXV0ZXgoQUNQSV9NVFhfTkFNRVNQQUNFKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJcmV0dXJuOwotCX0KLQotCWlmICgoIWFjcGlfZ2JsX3RyYWNlX21ldGhvZF9uYW1lKSB8fAotCSAgICAoYWNwaV9nYmxfdHJhY2VfbWV0aG9kX25hbWUgIT0gaW5mby0+cmVzb2x2ZWRfbm9kZS0+bmFtZS5pbnRlZ2VyKSkgewotCQlnb3RvIGV4aXQ7Ci0JfQotCi0JYWNwaV9nYmxfb3JpZ2luYWxfZGJnX2xldmVsID0gYWNwaV9kYmdfbGV2ZWw7Ci0JYWNwaV9nYmxfb3JpZ2luYWxfZGJnX2xheWVyID0gYWNwaV9kYmdfbGF5ZXI7Ci0KLQlhY3BpX2RiZ19sZXZlbCA9IDB4MDBGRkZGRkY7Ci0JYWNwaV9kYmdfbGF5ZXIgPSBBQ1BJX1VJTlQzMl9NQVg7Ci0KLQlpZiAoYWNwaV9nYmxfdHJhY2VfZGJnX2xldmVsKSB7Ci0JCWFjcGlfZGJnX2xldmVsID0gYWNwaV9nYmxfdHJhY2VfZGJnX2xldmVsOwotCX0KLQlpZiAoYWNwaV9nYmxfdHJhY2VfZGJnX2xheWVyKSB7Ci0JCWFjcGlfZGJnX2xheWVyID0gYWNwaV9nYmxfdHJhY2VfZGJnX2xheWVyOwotCX0KLQotICAgICAgZXhpdDoKLQkodm9pZClhY3BpX3V0X3JlbGVhc2VfbXV0ZXgoQUNQSV9NVFhfTkFNRVNQQUNFKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9wc19zdG9wX3RyYWNlCi0gKgotICogUEFSQU1FVEVSUzogIEluZm8gICAgICAgIC0gTWV0aG9kIGluZm8gc3RydWN0Ci0gKgotICogUkVUVVJOOiAgICAgIE5vbmUKLSAqCi0gKiBERVNDUklQVElPTjogU3RvcCBjb250cm9sIG1ldGhvZCBleGVjdXRpb24gdHJhY2UKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgdm9pZCBhY3BpX3BzX3N0b3BfdHJhY2Uoc3RydWN0IGFjcGlfZXZhbHVhdGVfaW5mbyAqaW5mbykKLXsKLQlhY3BpX3N0YXR1cyBzdGF0dXM7Ci0KLQlBQ1BJX0ZVTkNUSU9OX0VOVFJZKCk7Ci0KLQlzdGF0dXMgPSBhY3BpX3V0X2FjcXVpcmVfbXV0ZXgoQUNQSV9NVFhfTkFNRVNQQUNFKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJcmV0dXJuOwotCX0KLQotCWlmICgoIWFjcGlfZ2JsX3RyYWNlX21ldGhvZF9uYW1lKSB8fAotCSAgICAoYWNwaV9nYmxfdHJhY2VfbWV0aG9kX25hbWUgIT0gaW5mby0+cmVzb2x2ZWRfbm9kZS0+bmFtZS5pbnRlZ2VyKSkgewotCQlnb3RvIGV4aXQ7Ci0JfQotCi0JLyogRGlzYWJsZSBmdXJ0aGVyIHRyYWNpbmcgaWYgdHlwZSBpcyBvbmUtc2hvdCAqLwotCi0JaWYgKGFjcGlfZ2JsX3RyYWNlX2ZsYWdzICYgMSkgewotCQlhY3BpX2dibF90cmFjZV9tZXRob2RfbmFtZSA9IDA7Ci0JCWFjcGlfZ2JsX3RyYWNlX2RiZ19sZXZlbCA9IDA7Ci0JCWFjcGlfZ2JsX3RyYWNlX2RiZ19sYXllciA9IDA7Ci0JfQotCi0JYWNwaV9kYmdfbGV2ZWwgPSBhY3BpX2dibF9vcmlnaW5hbF9kYmdfbGV2ZWw7Ci0JYWNwaV9kYmdfbGF5ZXIgPSBhY3BpX2dibF9vcmlnaW5hbF9kYmdfbGF5ZXI7Ci0KLSAgICAgIGV4aXQ6Ci0JKHZvaWQpYWNwaV91dF9yZWxlYXNlX211dGV4KEFDUElfTVRYX05BTUVTUEFDRSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfcHNfZXhlY3V0ZV9tZXRob2QKLSAqCi0gKiBQQVJBTUVURVJTOiAgSW5mbyAgICAgICAgICAgIC0gTWV0aG9kIGluZm8gYmxvY2ssIGNvbnRhaW5zOgotICogICAgICAgICAgICAgICAgICBOb2RlICAgICAgICAgICAgLSBNZXRob2QgTm9kZSB0byBleGVjdXRlCi0gKiAgICAgICAgICAgICAgICAgIG9ial9kZXNjICAgICAgICAtIE1ldGhvZCBvYmplY3QKLSAqICAgICAgICAgICAgICAgICAgUGFyYW1ldGVycyAgICAgIC0gTGlzdCBvZiBwYXJhbWV0ZXJzIHRvIHBhc3MgdG8gdGhlIG1ldGhvZCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVybWluYXRlZCBieSBOVUxMLiBQYXJhbXMgaXRzZWxmIG1heSBiZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMIGlmIG5vIHBhcmFtZXRlcnMgYXJlIGJlaW5nIHBhc3NlZC4KLSAqICAgICAgICAgICAgICAgICAgcmV0dXJuX29iamVjdCAgIC0gV2hlcmUgdG8gcHV0IG1ldGhvZCdzIHJldHVybiB2YWx1ZSAoaWYKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW55KS4gSWYgTlVMTCwgbm8gdmFsdWUgaXMgcmV0dXJuZWQuCi0gKiAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcl90eXBlICAtIFR5cGUgb2YgUGFyYW1ldGVyIGxpc3QKLSAqICAgICAgICAgICAgICAgICAgcmV0dXJuX29iamVjdCAgIC0gV2hlcmUgdG8gcHV0IG1ldGhvZCdzIHJldHVybiB2YWx1ZSAoaWYKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW55KS4gSWYgTlVMTCwgbm8gdmFsdWUgaXMgcmV0dXJuZWQuCi0gKiAgICAgICAgICAgICAgICAgIHBhc3NfbnVtYmVyICAgICAtIFBhcnNlIG9yIGV4ZWN1dGUgcGFzcwotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKLSAqCi0gKiBERVNDUklQVElPTjogRXhlY3V0ZSBhIGNvbnRyb2wgbWV0aG9kCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotYWNwaV9zdGF0dXMgYWNwaV9wc19leGVjdXRlX21ldGhvZChzdHJ1Y3QgYWNwaV9ldmFsdWF0ZV9pbmZvICppbmZvKQotewotCWFjcGlfc3RhdHVzIHN0YXR1czsKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqb3A7Ci0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZTsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UocHNfZXhlY3V0ZV9tZXRob2QpOwotCi0JLyogVmFsaWRhdGUgdGhlIEluZm8gYW5kIG1ldGhvZCBOb2RlICovCi0KLQlpZiAoIWluZm8gfHwgIWluZm8tPnJlc29sdmVkX25vZGUpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05VTExfRU5UUlkpOwotCX0KLQotCS8qIEluaXQgZm9yIG5ldyBtZXRob2QsIHdhaXQgb24gY29uY3VycmVuY3kgc2VtYXBob3JlICovCi0KLQlzdGF0dXMgPQotCSAgICBhY3BpX2RzX2JlZ2luX21ldGhvZF9leGVjdXRpb24oaW5mby0+cmVzb2x2ZWRfbm9kZSwgaW5mby0+b2JqX2Rlc2MsCi0JCQkJCSAgIE5VTEwpOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLQl9Ci0KLQkvKgotCSAqIFRoZSBjYWxsZXIgIm93bnMiIHRoZSBwYXJhbWV0ZXJzLCBzbyBnaXZlIGVhY2ggb25lIGFuIGV4dHJhIHJlZmVyZW5jZQotCSAqLwotCWFjcGlfcHNfdXBkYXRlX3BhcmFtZXRlcl9saXN0KGluZm8sIFJFRl9JTkNSRU1FTlQpOwotCi0JLyogQmVnaW4gdHJhY2luZyBpZiByZXF1ZXN0ZWQgKi8KLQotCWFjcGlfcHNfc3RhcnRfdHJhY2UoaW5mbyk7Ci0KLQkvKgotCSAqIEV4ZWN1dGUgdGhlIG1ldGhvZC4gUGVyZm9ybXMgcGFyc2Ugc2ltdWx0YW5lb3VzbHkKLQkgKi8KLQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX1BBUlNFLAotCQkJICAiKioqKiBCZWdpbiBNZXRob2QgUGFyc2UvRXhlY3V0ZSBbJTQuNHNdICoqKiogTm9kZT0lcCBPYmo9JXBcbiIsCi0JCQkgIGluZm8tPnJlc29sdmVkX25vZGUtPm5hbWUuYXNjaWksIGluZm8tPnJlc29sdmVkX25vZGUsCi0JCQkgIGluZm8tPm9ial9kZXNjKSk7Ci0KLQkvKiBDcmVhdGUgYW5kIGluaXQgYSBSb290IE5vZGUgKi8KLQotCW9wID0gYWNwaV9wc19jcmVhdGVfc2NvcGVfb3AoKTsKLQlpZiAoIW9wKSB7Ci0JCXN0YXR1cyA9IEFFX05PX01FTU9SWTsKLQkJZ290byBjbGVhbnVwOwotCX0KLQotCS8qIENyZWF0ZSBhbmQgaW5pdGlhbGl6ZSBhIG5ldyB3YWxrIHN0YXRlICovCi0KLQlpbmZvLT5wYXNzX251bWJlciA9IEFDUElfSU1PREVfRVhFQ1VURTsKLQl3YWxrX3N0YXRlID0KLQkgICAgYWNwaV9kc19jcmVhdGVfd2Fsa19zdGF0ZShpbmZvLT5vYmpfZGVzYy0+bWV0aG9kLm93bmVyX2lkLCBOVUxMLAotCQkJCSAgICAgIE5VTEwsIE5VTEwpOwotCWlmICghd2Fsa19zdGF0ZSkgewotCQlzdGF0dXMgPSBBRV9OT19NRU1PUlk7Ci0JCWdvdG8gY2xlYW51cDsKLQl9Ci0KLQlzdGF0dXMgPSBhY3BpX2RzX2luaXRfYW1sX3dhbGsod2Fsa19zdGF0ZSwgb3AsIGluZm8tPnJlc29sdmVkX25vZGUsCi0JCQkJICAgICAgIGluZm8tPm9ial9kZXNjLT5tZXRob2QuYW1sX3N0YXJ0LAotCQkJCSAgICAgICBpbmZvLT5vYmpfZGVzYy0+bWV0aG9kLmFtbF9sZW5ndGgsIGluZm8sCi0JCQkJICAgICAgIGluZm8tPnBhc3NfbnVtYmVyKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJYWNwaV9kc19kZWxldGVfd2Fsa19zdGF0ZSh3YWxrX3N0YXRlKTsKLQkJZ290byBjbGVhbnVwOwotCX0KLQotCS8qIFBhcnNlIHRoZSBBTUwgKi8KLQotCXN0YXR1cyA9IGFjcGlfcHNfcGFyc2VfYW1sKHdhbGtfc3RhdGUpOwotCi0JLyogd2Fsa19zdGF0ZSB3YXMgZGVsZXRlZCBieSBwYXJzZV9hbWwgKi8KLQotICAgICAgY2xlYW51cDoKLQlhY3BpX3BzX2RlbGV0ZV9wYXJzZV90cmVlKG9wKTsKLQotCS8qIEVuZCBvcHRpb25hbCB0cmFjaW5nICovCi0KLQlhY3BpX3BzX3N0b3BfdHJhY2UoaW5mbyk7Ci0KLQkvKiBUYWtlIGF3YXkgdGhlIGV4dHJhIHJlZmVyZW5jZSB0aGF0IHdlIGdhdmUgdGhlIHBhcmFtZXRlcnMgYWJvdmUgKi8KLQotCWFjcGlfcHNfdXBkYXRlX3BhcmFtZXRlcl9saXN0KGluZm8sIFJFRl9ERUNSRU1FTlQpOwotCi0JLyogRXhpdCBub3cgaWYgZXJyb3IgYWJvdmUgKi8KLQotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLQl9Ci0KLQkvKgotCSAqIElmIHRoZSBtZXRob2QgaGFzIHJldHVybmVkIGFuIG9iamVjdCwgc2lnbmFsIHRoaXMgdG8gdGhlIGNhbGxlciB3aXRoCi0JICogYSBjb250cm9sIGV4Y2VwdGlvbiBjb2RlCi0JICovCi0JaWYgKGluZm8tPnJldHVybl9vYmplY3QpIHsKLQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9QQVJTRSwgIk1ldGhvZCByZXR1cm5lZCBPYmpEZXNjPSVwXG4iLAotCQkJCSAgaW5mby0+cmV0dXJuX29iamVjdCkpOwotCQlBQ1BJX0RVTVBfU1RBQ0tfRU5UUlkoaW5mby0+cmV0dXJuX29iamVjdCk7Ci0KLQkJc3RhdHVzID0gQUVfQ1RSTF9SRVRVUk5fVkFMVUU7Ci0JfQotCi0JcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfcHNfdXBkYXRlX3BhcmFtZXRlcl9saXN0Ci0gKgotICogUEFSQU1FVEVSUzogIEluZm8gICAgICAgICAgICAtIFNlZSBzdHJ1Y3QgYWNwaV9ldmFsdWF0ZV9pbmZvCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFVzZWQ6IHBhcmFtZXRlcl90eXBlIGFuZCBQYXJhbWV0ZXJzKQotICogICAgICAgICAgICAgIEFjdGlvbiAgICAgICAgICAtIEFkZCBvciBSZW1vdmUgcmVmZXJlbmNlCi0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cwotICoKLSAqIERFU0NSSVBUSU9OOiBVcGRhdGUgcmVmZXJlbmNlIGNvdW50IG9uIGFsbCBtZXRob2QgcGFyYW1ldGVyIG9iamVjdHMKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgdm9pZAotYWNwaV9wc191cGRhdGVfcGFyYW1ldGVyX2xpc3Qoc3RydWN0IGFjcGlfZXZhbHVhdGVfaW5mbyAqaW5mbywgdTE2IGFjdGlvbikKLXsKLQl1MzIgaTsKLQotCWlmIChpbmZvLT5wYXJhbWV0ZXJzKSB7Ci0KLQkJLyogVXBkYXRlIHJlZmVyZW5jZSBjb3VudCBmb3IgZWFjaCBwYXJhbWV0ZXIgKi8KLQotCQlmb3IgKGkgPSAwOyBpbmZvLT5wYXJhbWV0ZXJzW2ldOyBpKyspIHsKLQotCQkJLyogSWdub3JlIGVycm9ycywganVzdCBkbyB0aGVtIGFsbCAqLwotCi0JCQkodm9pZClhY3BpX3V0X3VwZGF0ZV9vYmplY3RfcmVmZXJlbmNlKGluZm8tPgotCQkJCQkJCSAgICAgIHBhcmFtZXRlcnNbaV0sCi0JCQkJCQkJICAgICAgYWN0aW9uKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9wY2lfYmluZC5jIGIvZHJpdmVycy9hY3BpL3BjaV9iaW5kLmMKaW5kZXggNGIyNTJlYS4uOTU2NTBmOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3BjaV9iaW5kLmMKKysrIGIvZHJpdmVycy9hY3BpL3BjaV9iaW5kLmMKQEAgLTk5LDcgKzk5LDcgQEAKIAkgKi8KIAogCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywKLQkJCSAgIkRldmljZSAlcyBoYXMgUENJIGFkZHJlc3MgJTAyeDolMDJ4OiUwMnguJTAyeFxuIiwKKwkJCSAgIkRldmljZSAlcyBoYXMgUENJIGFkZHJlc3MgJTA0eDolMDJ4OiUwMnguJWRcbiIsCiAJCQkgIGFjcGlfZGV2aWNlX2JpZChkZXZpY2UpLCBpZC0+c2VnbWVudCwgaWQtPmJ1cywKIAkJCSAgaWQtPmRldmljZSwgaWQtPmZ1bmN0aW9uKSk7CiAKQEAgLTExMSwxMiArMTExLDExIEBACiBpbnQgYWNwaV9wY2lfYmluZChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSkKIHsKIAlpbnQgcmVzdWx0ID0gMDsKLQlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKLQlzdHJ1Y3QgYWNwaV9wY2lfZGF0YSAqZGF0YSA9IE5VTEw7Ci0Jc3RydWN0IGFjcGlfcGNpX2RhdGEgKnBkYXRhID0gTlVMTDsKLQljaGFyICpwYXRobmFtZSA9IE5VTEw7Ci0Jc3RydWN0IGFjcGlfYnVmZmVyIGJ1ZmZlciA9IHsgMCwgTlVMTCB9OwotCWFjcGlfaGFuZGxlIGhhbmRsZSA9IE5VTEw7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCXN0cnVjdCBhY3BpX3BjaV9kYXRhICpkYXRhOworCXN0cnVjdCBhY3BpX3BjaV9kYXRhICpwZGF0YTsKKwlzdHJ1Y3QgYWNwaV9idWZmZXIgYnVmZmVyID0geyBBQ1BJX0FMTE9DQVRFX0JVRkZFUiwgTlVMTCB9OworCWFjcGlfaGFuZGxlIGhhbmRsZTsKIAlzdHJ1Y3QgcGNpX2RldiAqZGV2OwogCXN0cnVjdCBwY2lfYnVzICpidXM7CiAKQEAgLTEyNCwyMSArMTIzLDE4IEBACiAJaWYgKCFkZXZpY2UgfHwgIWRldmljZS0+cGFyZW50KQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCXBhdGhuYW1lID0ga3phbGxvYyhBQ1BJX1BBVEhOQU1FX01BWCwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwYXRobmFtZSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0JYnVmZmVyLmxlbmd0aCA9IEFDUElfUEFUSE5BTUVfTUFYOwotCWJ1ZmZlci5wb2ludGVyID0gcGF0aG5hbWU7Ci0KIAlkYXRhID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGFjcGlfcGNpX2RhdGEpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWRhdGEpIHsKLQkJa2ZyZWUocGF0aG5hbWUpOworCWlmICghZGF0YSkKIAkJcmV0dXJuIC1FTk9NRU07CisKKwlzdGF0dXMgPSBhY3BpX2dldF9uYW1lKGRldmljZS0+aGFuZGxlLCBBQ1BJX0ZVTExfUEFUSE5BTUUsICZidWZmZXIpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlrZnJlZShkYXRhKTsKKwkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCi0JYWNwaV9nZXRfbmFtZShkZXZpY2UtPmhhbmRsZSwgQUNQSV9GVUxMX1BBVEhOQU1FLCAmYnVmZmVyKTsKIAlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sICJCaW5kaW5nIFBDSSBkZXZpY2UgWyVzXS4uLlxuIiwKLQkJCSAgcGF0aG5hbWUpKTsKKwkJCSAgKGNoYXIgKilidWZmZXIucG9pbnRlcikpOwogCiAJLyogCiAJICogU2VnbWVudCAmIEJ1cwpAQCAtMTY2LDcgKzE2Miw3IEBACiAJZGF0YS0+aWQuZGV2aWNlID0gZGV2aWNlLT5wbnAuYnVzX2FkZHJlc3MgPj4gMTY7CiAJZGF0YS0+aWQuZnVuY3Rpb24gPSBkZXZpY2UtPnBucC5idXNfYWRkcmVzcyAmIDB4RkZGRjsKIAotCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgIi4uLnRvICUwMng6JTAyeDolMDJ4LiUwMnhcbiIsCisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLCAiLi4udG8gJTA0eDolMDJ4OiUwMnguJWRcbiIsCiAJCQkgIGRhdGEtPmlkLnNlZ21lbnQsIGRhdGEtPmlkLmJ1cywgZGF0YS0+aWQuZGV2aWNlLAogCQkJICBkYXRhLT5pZC5mdW5jdGlvbikpOwogCkBAIC0xOTYsNyArMTkyLDcgQEAKIAl9CiAJaWYgKCFkYXRhLT5kZXYpIHsKIAkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLAotCQkJCSAgIkRldmljZSAlMDJ4OiUwMng6JTAyeC4lMDJ4IG5vdCBwcmVzZW50IGluIFBDSSBuYW1lc3BhY2VcbiIsCisJCQkJICAiRGV2aWNlICUwNHg6JTAyeDolMDJ4LiVkIG5vdCBwcmVzZW50IGluIFBDSSBuYW1lc3BhY2VcbiIsCiAJCQkJICBkYXRhLT5pZC5zZWdtZW50LCBkYXRhLT5pZC5idXMsCiAJCQkJICBkYXRhLT5pZC5kZXZpY2UsIGRhdGEtPmlkLmZ1bmN0aW9uKSk7CiAJCXJlc3VsdCA9IC1FTk9ERVY7CkBAIC0yMDQsNyArMjAwLDcgQEAKIAl9CiAJaWYgKCFkYXRhLT5kZXYtPmJ1cykgewogCQlwcmludGsoS0VSTl9FUlIgUFJFRklYCi0JCQkgICAgIkRldmljZSAlMDJ4OiUwMng6JTAyeC4lMDJ4IGhhcyBpbnZhbGlkICdidXMnIGZpZWxkXG4iLAorCQkJICAgICJEZXZpY2UgJTA0eDolMDJ4OiUwMnguJWQgaGFzIGludmFsaWQgJ2J1cycgZmllbGRcbiIsCiAJCQkgICAgZGF0YS0+aWQuc2VnbWVudCwgZGF0YS0+aWQuYnVzLAogCQkJICAgIGRhdGEtPmlkLmRldmljZSwgZGF0YS0+aWQuZnVuY3Rpb24pOwogCQlyZXN1bHQgPSAtRU5PREVWOwpAQCAtMjE5LDcgKzIxNSw3IEBACiAJICovCiAJaWYgKGRhdGEtPmRldi0+c3Vib3JkaW5hdGUpIHsKIAkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLAotCQkJCSAgIkRldmljZSAlMDJ4OiUwMng6JTAyeC4lMDJ4IGlzIGEgUENJIGJyaWRnZVxuIiwKKwkJCQkgICJEZXZpY2UgJTA0eDolMDJ4OiUwMnguJWQgaXMgYSBQQ0kgYnJpZGdlXG4iLAogCQkJCSAgZGF0YS0+aWQuc2VnbWVudCwgZGF0YS0+aWQuYnVzLAogCQkJCSAgZGF0YS0+aWQuZGV2aWNlLCBkYXRhLT5pZC5mdW5jdGlvbikpOwogCQlkYXRhLT5idXMgPSBkYXRhLT5kZXYtPnN1Ym9yZGluYXRlOwpAQCAtMjYyLDcgKzI1OCw3IEBACiAJfQogCiAgICAgICBlbmQ6Ci0Ja2ZyZWUocGF0aG5hbWUpOworCWtmcmVlKGJ1ZmZlci5wb2ludGVyKTsKIAlpZiAocmVzdWx0KQogCQlrZnJlZShkYXRhKTsKIApAQCAtMjcyLDI1ICsyNjgsMjEgQEAKIHN0YXRpYyBpbnQgYWNwaV9wY2lfdW5iaW5kKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKQogewogCWludCByZXN1bHQgPSAwOwotCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOwotCXN0cnVjdCBhY3BpX3BjaV9kYXRhICpkYXRhID0gTlVMTDsKLQljaGFyICpwYXRobmFtZSA9IE5VTEw7Ci0Jc3RydWN0IGFjcGlfYnVmZmVyIGJ1ZmZlciA9IHsgMCwgTlVMTCB9OworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwlzdHJ1Y3QgYWNwaV9wY2lfZGF0YSAqZGF0YTsKKwlzdHJ1Y3QgYWNwaV9idWZmZXIgYnVmZmVyID0geyBBQ1BJX0FMTE9DQVRFX0JVRkZFUiwgTlVMTCB9OwogCiAKIAlpZiAoIWRldmljZSB8fCAhZGV2aWNlLT5wYXJlbnQpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JcGF0aG5hbWUgPSBremFsbG9jKEFDUElfUEFUSE5BTUVfTUFYLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXBhdGhuYW1lKQotCQlyZXR1cm4gLUVOT01FTTsKKwlzdGF0dXMgPSBhY3BpX2dldF9uYW1lKGRldmljZS0+aGFuZGxlLCBBQ1BJX0ZVTExfUEFUSE5BTUUsICZidWZmZXIpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkKKwkJcmV0dXJuIC1FTk9ERVY7CiAKLQlidWZmZXIubGVuZ3RoID0gQUNQSV9QQVRITkFNRV9NQVg7Ci0JYnVmZmVyLnBvaW50ZXIgPSBwYXRobmFtZTsKLQlhY3BpX2dldF9uYW1lKGRldmljZS0+aGFuZGxlLCBBQ1BJX0ZVTExfUEFUSE5BTUUsICZidWZmZXIpOwogCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgIlVuYmluZGluZyBQQ0kgZGV2aWNlIFslc10uLi5cbiIsCi0JCQkgIHBhdGhuYW1lKSk7Ci0Ja2ZyZWUocGF0aG5hbWUpOworCQkJICAoY2hhciAqKSBidWZmZXIucG9pbnRlcikpOworCWtmcmVlKGJ1ZmZlci5wb2ludGVyKTsKIAogCXN0YXR1cyA9CiAJICAgIGFjcGlfZ2V0X2RhdGEoZGV2aWNlLT5oYW5kbGUsIGFjcGlfcGNpX2RhdGFfaGFuZGxlciwKQEAgLTMyMiw1MCArMzE0LDQ0IEBACiAJCSAgIHN0cnVjdCBhY3BpX3BjaV9pZCAqaWQsIHN0cnVjdCBwY2lfYnVzICpidXMpCiB7CiAJaW50IHJlc3VsdCA9IDA7Ci0JYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CisJYWNwaV9zdGF0dXMgc3RhdHVzOwogCXN0cnVjdCBhY3BpX3BjaV9kYXRhICpkYXRhID0gTlVMTDsKLQljaGFyICpwYXRobmFtZSA9IE5VTEw7Ci0Jc3RydWN0IGFjcGlfYnVmZmVyIGJ1ZmZlciA9IHsgMCwgTlVMTCB9OwotCi0JcGF0aG5hbWUgPSBremFsbG9jKEFDUElfUEFUSE5BTUVfTUFYLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXBhdGhuYW1lKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWJ1ZmZlci5sZW5ndGggPSBBQ1BJX1BBVEhOQU1FX01BWDsKLQlidWZmZXIucG9pbnRlciA9IHBhdGhuYW1lOworCXN0cnVjdCBhY3BpX2J1ZmZlciBidWZmZXIgPSB7IEFDUElfQUxMT0NBVEVfQlVGRkVSLCBOVUxMIH07CiAKIAlpZiAoIWRldmljZSB8fCAhaWQgfHwgIWJ1cykgewotCQlrZnJlZShwYXRobmFtZSk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAogCWRhdGEgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYWNwaV9wY2lfZGF0YSksIEdGUF9LRVJORUwpOwotCWlmICghZGF0YSkgewotCQlrZnJlZShwYXRobmFtZSk7CisJaWYgKCFkYXRhKQogCQlyZXR1cm4gLUVOT01FTTsKLQl9CiAKIAlkYXRhLT5pZCA9ICppZDsKIAlkYXRhLT5idXMgPSBidXM7CiAJZGV2aWNlLT5vcHMuYmluZCA9IGFjcGlfcGNpX2JpbmQ7CiAJZGV2aWNlLT5vcHMudW5iaW5kID0gYWNwaV9wY2lfdW5iaW5kOwogCi0JYWNwaV9nZXRfbmFtZShkZXZpY2UtPmhhbmRsZSwgQUNQSV9GVUxMX1BBVEhOQU1FLCAmYnVmZmVyKTsKKwlzdGF0dXMgPSBhY3BpX2dldF9uYW1lKGRldmljZS0+aGFuZGxlLCBBQ1BJX0ZVTExfUEFUSE5BTUUsICZidWZmZXIpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlrZnJlZSAoZGF0YSk7CisJCXJldHVybiAtRU5PREVWOworCX0KIAogCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgIkJpbmRpbmcgUENJIHJvb3QgYnJpZGdlIFslc10gdG8gIgotCQkJICAiJTAyeDolMDJ4XG4iLCBwYXRobmFtZSwgaWQtPnNlZ21lbnQsIGlkLT5idXMpKTsKKwkJCSIlMDR4OiUwMnhcbiIsIChjaGFyICopYnVmZmVyLnBvaW50ZXIsCisJCQlpZC0+c2VnbWVudCwgaWQtPmJ1cykpOwogCiAJc3RhdHVzID0gYWNwaV9hdHRhY2hfZGF0YShkZXZpY2UtPmhhbmRsZSwgYWNwaV9wY2lfZGF0YV9oYW5kbGVyLCBkYXRhKTsKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJQUNQSV9FWENFUFRJT04oKEFFX0lORk8sIHN0YXR1cywKIAkJCQkiVW5hYmxlIHRvIGF0dGFjaCBBQ1BJLVBDSSBjb250ZXh0IHRvIGRldmljZSAlcyIsCi0JCQkJcGF0aG5hbWUpKTsKKwkJCQkoY2hhciAqKWJ1ZmZlci5wb2ludGVyKSk7CiAJCXJlc3VsdCA9IC1FTk9ERVY7CiAJCWdvdG8gZW5kOwogCX0KIAogICAgICAgZW5kOgotCWtmcmVlKHBhdGhuYW1lKTsKKwlrZnJlZShidWZmZXIucG9pbnRlcik7CiAJaWYgKHJlc3VsdCAhPSAwKQogCQlrZnJlZShkYXRhKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3BjaV9pcnEuYyBiL2RyaXZlcnMvYWNwaS9wY2lfaXJxLmMKaW5kZXggYmY3OWQ4My4uODkxYmRmNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3BjaV9pcnEuYworKysgYi9kcml2ZXJzL2FjcGkvcGNpX2lycS5jCkBAIC00LDYgKzQsOCBAQAogICogIENvcHlyaWdodCAoQykgMjAwMSwgMjAwMiBBbmR5IEdyb3ZlciA8YW5kcmV3Lmdyb3ZlckBpbnRlbC5jb20+CiAgKiAgQ29weXJpZ2h0IChDKSAyMDAxLCAyMDAyIFBhdWwgRGllZmVuYmF1Z2ggPHBhdWwucy5kaWVmZW5iYXVnaEBpbnRlbC5jb20+CiAgKiAgQ29weXJpZ2h0IChDKSAyMDAyICAgICAgIERvbWluaWsgQnJvZG93c2tpIDxkZXZlbEBicm9kby5kZT4KKyAqICAoYykgQ29weXJpZ2h0IDIwMDggSGV3bGV0dC1QYWNrYXJkIERldmVsb3BtZW50IENvbXBhbnksIEwuUC4KKyAqCUJqb3JuIEhlbGdhYXMgPGJqb3JuLmhlbGdhYXNAaHAuY29tPgogICoKICAqIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CiAgKgpAQCAtNDEsMjkgKzQzLDM2IEBACiAjZGVmaW5lIF9DT01QT05FTlQJCUFDUElfUENJX0NPTVBPTkVOVAogQUNQSV9NT0RVTEVfTkFNRSgicGNpX2lycSIpOwogCi1zdGF0aWMgc3RydWN0IGFjcGlfcHJ0X2xpc3QgYWNwaV9wcnQ7CitzdHJ1Y3QgYWNwaV9wcnRfZW50cnkgeworCXN0cnVjdCBsaXN0X2hlYWQJbGlzdDsKKwlzdHJ1Y3QgYWNwaV9wY2lfaWQJaWQ7CisJdTgJCQlwaW47CisJYWNwaV9oYW5kbGUJCWxpbms7CisJdTMyCQkJaW5kZXg7CQkvKiBHU0ksIG9yIGxpbmsgX0NSUyBpbmRleCAqLworfTsKKworc3RhdGljIExJU1RfSEVBRChhY3BpX3BydF9saXN0KTsKIHN0YXRpYyBERUZJTkVfU1BJTkxPQ0soYWNwaV9wcnRfbG9jayk7CiAKK3N0YXRpYyBpbmxpbmUgY2hhciBwaW5fbmFtZShpbnQgcGluKQoreworCXJldHVybiAnQScgKyBwaW4gLSAxOworfQorCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgICAgICAgICAgICAgICAgICAgIFBDSSBJUlEgUm91dGluZyBUYWJsZSAoUFJUKSBTdXBwb3J0CiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi1zdGF0aWMgc3RydWN0IGFjcGlfcHJ0X2VudHJ5ICphY3BpX3BjaV9pcnFfZmluZF9wcnRfZW50cnkoaW50IHNlZ21lbnQsCi0JCQkJCQkJICBpbnQgYnVzLAotCQkJCQkJCSAgaW50IGRldmljZSwgaW50IHBpbikKK3N0YXRpYyBzdHJ1Y3QgYWNwaV9wcnRfZW50cnkgKmFjcGlfcGNpX2lycV9maW5kX3BydF9lbnRyeShzdHJ1Y3QgcGNpX2RldiAqZGV2LAorCQkJCQkJCSAgaW50IHBpbikKIHsKLQlzdHJ1Y3QgYWNwaV9wcnRfZW50cnkgKmVudHJ5ID0gTlVMTDsKKwlzdHJ1Y3QgYWNwaV9wcnRfZW50cnkgKmVudHJ5OworCWludCBzZWdtZW50ID0gcGNpX2RvbWFpbl9ucihkZXYtPmJ1cyk7CisJaW50IGJ1cyA9IGRldi0+YnVzLT5udW1iZXI7CisJaW50IGRldmljZSA9IFBDSV9TTE9UKGRldi0+ZGV2Zm4pOwogCi0JaWYgKCFhY3BpX3BydC5jb3VudCkKLQkJcmV0dXJuIE5VTEw7Ci0KLQkvKgotCSAqIFBhcnNlIHRocm91Z2ggYWxsIFBSVCBlbnRyaWVzIGxvb2tpbmcgZm9yIGEgbWF0Y2ggb24gdGhlIHNwZWNpZmllZAotCSAqIFBDSSBkZXZpY2UncyBzZWdtZW50LCBidXMsIGRldmljZSwgYW5kIHBpbiAoZG9uJ3QgY2FyZSBhYm91dCBmdW5jKS4KLQkgKgotCSAqLwogCXNwaW5fbG9jaygmYWNwaV9wcnRfbG9jayk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeShlbnRyeSwgJmFjcGlfcHJ0LmVudHJpZXMsIG5vZGUpIHsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGVudHJ5LCAmYWNwaV9wcnRfbGlzdCwgbGlzdCkgewogCQlpZiAoKHNlZ21lbnQgPT0gZW50cnktPmlkLnNlZ21lbnQpCiAJCSAgICAmJiAoYnVzID09IGVudHJ5LT5pZC5idXMpCiAJCSAgICAmJiAoZGV2aWNlID09IGVudHJ5LT5pZC5kZXZpY2UpCkBAIC03Miw3ICs4MSw2IEBACiAJCQlyZXR1cm4gZW50cnk7CiAJCX0KIAl9Ci0KIAlzcGluX3VubG9jaygmYWNwaV9wcnRfbG9jayk7CiAJcmV0dXJuIE5VTEw7CiB9CkBAIC0xMjQsMjUgKzEzMiwyNyBAQAogCWNoYXIJCQkqYWN0dWFsX3NvdXJjZTsKIH07CiAKKyNkZWZpbmUgUENJX0lOVFhfUElOKGMpCQkoYyAtICdBJyArIDEpCisKIC8qCiAgKiBUaGVzZSBzeXN0ZW1zIGhhdmUgaW5jb3JyZWN0IF9QUlQgZW50cmllcy4gIFRoZSBCSU9TIGNsYWltcyB0aGUgUENJCiAgKiBpbnRlcnJ1cHQgYXQgdGhlIGxpc3RlZCBzZWdtZW50L2J1cy9kZXZpY2UvcGluIGlzIGNvbm5lY3RlZCB0byB0aGUgZmlyc3QKICAqIGxpbmsgZGV2aWNlLCBidXQgaXQgaXMgYWN0dWFsbHkgY29ubmVjdGVkIHRvIHRoZSBzZWNvbmQuCiAgKi8KIHN0YXRpYyBzdHJ1Y3QgcHJ0X3F1aXJrIHBydF9xdWlya3NbXSA9IHsKLQl7IG1lZGlvbl9tZDk1ODAsIDAsIDAsIDksICdBJywKKwl7IG1lZGlvbl9tZDk1ODAsIDAsIDAsIDksIFBDSV9JTlRYX1BJTignQScpLAogCQkiXFxfU0JfLlBDSTAuSVNBXy5MTktBIiwKIAkJIlxcX1NCXy5QQ0kwLklTQV8uTE5LQiJ9LAotCXsgZGVsbF9vcHRpcGxleCwgMCwgMCwgMHhkLCAnQScsCisJeyBkZWxsX29wdGlwbGV4LCAwLCAwLCAweGQsIFBDSV9JTlRYX1BJTignQScpLAogCQkiXFxfU0JfLkxOS0IiLAogCQkiXFxfU0JfLkxOS0EifSwKLQl7IGhwX3Q1NzEwLCAwLCAwLCAxLCAnQScsCisJeyBocF90NTcxMCwgMCwgMCwgMSwgUENJX0lOVFhfUElOKCdBJyksCiAJCSJcXF9TQl8uUENJMC5MTksxIiwKIAkJIlxcX1NCXy5QQ0kwLkxOSzMifSwKIH07CiAKLXN0YXRpYyB2b2lkCi1kb19wcnRfZml4dXBzKHN0cnVjdCBhY3BpX3BydF9lbnRyeSAqZW50cnksIHN0cnVjdCBhY3BpX3BjaV9yb3V0aW5nX3RhYmxlICpwcnQpCitzdGF0aWMgdm9pZCBkb19wcnRfZml4dXBzKHN0cnVjdCBhY3BpX3BydF9lbnRyeSAqZW50cnksCisJCQkgIHN0cnVjdCBhY3BpX3BjaV9yb3V0aW5nX3RhYmxlICpwcnQpCiB7CiAJaW50IGk7CiAJc3RydWN0IHBydF9xdWlyayAqcXVpcms7CkBAIC0xNTgsNDIgKzE2OCw0MyBAQAogCQkgICAgZW50cnktPmlkLnNlZ21lbnQgPT0gcXVpcmstPnNlZ21lbnQgJiYKIAkJICAgIGVudHJ5LT5pZC5idXMgPT0gcXVpcmstPmJ1cyAmJgogCQkgICAgZW50cnktPmlkLmRldmljZSA9PSBxdWlyay0+ZGV2aWNlICYmCi0JCSAgICBlbnRyeS0+cGluICsgJ0EnID09IHF1aXJrLT5waW4gJiYKKwkJICAgIGVudHJ5LT5waW4gPT0gcXVpcmstPnBpbiAmJgogCQkgICAgIXN0cmNtcChwcnQtPnNvdXJjZSwgcXVpcmstPnNvdXJjZSkgJiYKIAkJICAgIHN0cmxlbihwcnQtPnNvdXJjZSkgPj0gc3RybGVuKHF1aXJrLT5hY3R1YWxfc291cmNlKSkgewogCQkJcHJpbnRrKEtFUk5fV0FSTklORyBQUkVGSVggImZpcm13YXJlIHJlcG9ydHMgIgogCQkJCSIlMDR4OiUwMng6JTAyeCBQQ0kgSU5UICVjIGNvbm5lY3RlZCB0byAlczsgIgogCQkJCSJjaGFuZ2luZyB0byAlc1xuIiwKIAkJCQllbnRyeS0+aWQuc2VnbWVudCwgZW50cnktPmlkLmJ1cywKLQkJCQllbnRyeS0+aWQuZGV2aWNlLCAnQScgKyBlbnRyeS0+cGluLAorCQkJCWVudHJ5LT5pZC5kZXZpY2UsIHBpbl9uYW1lKGVudHJ5LT5waW4pLAogCQkJCXBydC0+c291cmNlLCBxdWlyay0+YWN0dWFsX3NvdXJjZSk7CiAJCQlzdHJjcHkocHJ0LT5zb3VyY2UsIHF1aXJrLT5hY3R1YWxfc291cmNlKTsKIAkJfQogCX0KIH0KIAotc3RhdGljIGludAotYWNwaV9wY2lfaXJxX2FkZF9lbnRyeShhY3BpX2hhbmRsZSBoYW5kbGUsCi0JCSAgICAgICBpbnQgc2VnbWVudCwgaW50IGJ1cywgc3RydWN0IGFjcGlfcGNpX3JvdXRpbmdfdGFibGUgKnBydCkKK3N0YXRpYyBpbnQgYWNwaV9wY2lfaXJxX2FkZF9lbnRyeShhY3BpX2hhbmRsZSBoYW5kbGUsIGludCBzZWdtZW50LCBpbnQgYnVzLAorCQkJCSAgc3RydWN0IGFjcGlfcGNpX3JvdXRpbmdfdGFibGUgKnBydCkKIHsKLQlzdHJ1Y3QgYWNwaV9wcnRfZW50cnkgKmVudHJ5ID0gTlVMTDsKLQotCi0JaWYgKCFwcnQpCi0JCXJldHVybiAtRUlOVkFMOworCXN0cnVjdCBhY3BpX3BydF9lbnRyeSAqZW50cnk7CiAKIAllbnRyeSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBhY3BpX3BydF9lbnRyeSksIEdGUF9LRVJORUwpOwogCWlmICghZW50cnkpCiAJCXJldHVybiAtRU5PTUVNOwogCisJLyoKKwkgKiBOb3RlIHRoYXQgdGhlIF9QUlQgdXNlcyAwPUlOVEEsIDE9SU5UQiwgZXRjLCB3aGlsZSBQQ0kgdXNlcworCSAqIDE9SU5UQSwgMj1JTlRCLiAgV2UgdXNlIHRoZSBQQ0kgZW5jb2RpbmcgdGhyb3VnaG91dCwgc28gY29udmVydAorCSAqIGl0IGhlcmUuCisJICovCiAJZW50cnktPmlkLnNlZ21lbnQgPSBzZWdtZW50OwogCWVudHJ5LT5pZC5idXMgPSBidXM7CiAJZW50cnktPmlkLmRldmljZSA9IChwcnQtPmFkZHJlc3MgPj4gMTYpICYgMHhGRkZGOwotCWVudHJ5LT5pZC5mdW5jdGlvbiA9IHBydC0+YWRkcmVzcyAmIDB4RkZGRjsKLQllbnRyeS0+cGluID0gcHJ0LT5waW47CisJZW50cnktPnBpbiA9IHBydC0+cGluICsgMTsKIAogCWRvX3BydF9maXh1cHMoZW50cnksIHBydCk7CiAKKwllbnRyeS0+aW5kZXggPSBwcnQtPnNvdXJjZV9pbmRleDsKKwogCS8qCiAJICogVHlwZSAxOiBEeW5hbWljCiAJICogLS0tLS0tLS0tLS0tLS0tCkBAIC0yMDcsMTAgKzIxOCw5IEBACiAJICogICAgICAgKGUuZy4gZXhpc3RzIHNvbWV3aGVyZSAnYmVsb3cnIHRoaXMgX1BSVCBlbnRyeSBpbiB0aGUgQUNQSQogCSAqICAgICAgIG5hbWVzcGFjZSkuCiAJICovCi0JaWYgKHBydC0+c291cmNlWzBdKSB7Ci0JCWFjcGlfZ2V0X2hhbmRsZShoYW5kbGUsIHBydC0+c291cmNlLCAmZW50cnktPmxpbmsuaGFuZGxlKTsKLQkJZW50cnktPmxpbmsuaW5kZXggPSBwcnQtPnNvdXJjZV9pbmRleDsKLQl9CisJaWYgKHBydC0+c291cmNlWzBdKQorCQlhY3BpX2dldF9oYW5kbGUoaGFuZGxlLCBwcnQtPnNvdXJjZSwgJmVudHJ5LT5saW5rKTsKKwogCS8qCiAJICogVHlwZSAyOiBTdGF0aWMKIAkgKiAtLS0tLS0tLS0tLS0tLQpAQCAtMjE4LDg0ICsyMjgsMzggQEAKIAkgKiB0aGUgSVJRIHZhbHVlLCB3aGljaCBpcyBoYXJkd2lyZWQgdG8gc3BlY2lmaWMgaW50ZXJydXB0IGlucHV0cyBvbgogCSAqIHRoZSBpbnRlcnJ1cHQgY29udHJvbGxlci4KIAkgKi8KLQllbHNlCi0JCWVudHJ5LT5saW5rLmluZGV4ID0gcHJ0LT5zb3VyY2VfaW5kZXg7CiAKIAlBQ1BJX0RFQlVHX1BSSU5UX1JBVygoQUNQSV9EQl9JTkZPLAotCQkJICAgICAgIiAgICAgICUwMlg6JTAyWDolMDJYWyVjXSAtPiAlc1slZF1cbiIsCisJCQkgICAgICAiICAgICAgJTA0eDolMDJ4OiUwMnhbJWNdIC0+ICVzWyVkXVxuIiwKIAkJCSAgICAgIGVudHJ5LT5pZC5zZWdtZW50LCBlbnRyeS0+aWQuYnVzLAotCQkJICAgICAgZW50cnktPmlkLmRldmljZSwgKCdBJyArIGVudHJ5LT5waW4pLCBwcnQtPnNvdXJjZSwKLQkJCSAgICAgIGVudHJ5LT5saW5rLmluZGV4KSk7CisJCQkgICAgICBlbnRyeS0+aWQuZGV2aWNlLCBwaW5fbmFtZShlbnRyeS0+cGluKSwKKwkJCSAgICAgIHBydC0+c291cmNlLCBlbnRyeS0+aW5kZXgpKTsKIAogCXNwaW5fbG9jaygmYWNwaV9wcnRfbG9jayk7Ci0JbGlzdF9hZGRfdGFpbCgmZW50cnktPm5vZGUsICZhY3BpX3BydC5lbnRyaWVzKTsKLQlhY3BpX3BydC5jb3VudCsrOworCWxpc3RfYWRkX3RhaWwoJmVudHJ5LT5saXN0LCAmYWNwaV9wcnRfbGlzdCk7CiAJc3Bpbl91bmxvY2soJmFjcGlfcHJ0X2xvY2spOwogCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkCi1hY3BpX3BjaV9pcnFfZGVsX2VudHJ5KGludCBzZWdtZW50LCBpbnQgYnVzLCBzdHJ1Y3QgYWNwaV9wcnRfZW50cnkgKmVudHJ5KQotewotCWlmIChzZWdtZW50ID09IGVudHJ5LT5pZC5zZWdtZW50ICYmIGJ1cyA9PSBlbnRyeS0+aWQuYnVzKSB7Ci0JCWFjcGlfcHJ0LmNvdW50LS07Ci0JCWxpc3RfZGVsKCZlbnRyeS0+bm9kZSk7Ci0JCWtmcmVlKGVudHJ5KTsKLQl9Ci19Ci0KIGludCBhY3BpX3BjaV9pcnFfYWRkX3BydChhY3BpX2hhbmRsZSBoYW5kbGUsIGludCBzZWdtZW50LCBpbnQgYnVzKQogewotCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOwotCWNoYXIgKnBhdGhuYW1lID0gTlVMTDsKLQlzdHJ1Y3QgYWNwaV9idWZmZXIgYnVmZmVyID0geyAwLCBOVUxMIH07Ci0Jc3RydWN0IGFjcGlfcGNpX3JvdXRpbmdfdGFibGUgKnBydCA9IE5VTEw7Ci0Jc3RydWN0IGFjcGlfcGNpX3JvdXRpbmdfdGFibGUgKmVudHJ5ID0gTlVMTDsKLQlzdGF0aWMgaW50IGZpcnN0X3RpbWUgPSAxOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwlzdHJ1Y3QgYWNwaV9idWZmZXIgYnVmZmVyID0geyBBQ1BJX0FMTE9DQVRFX0JVRkZFUiwgTlVMTCB9OworCXN0cnVjdCBhY3BpX3BjaV9yb3V0aW5nX3RhYmxlICplbnRyeTsKIAotCi0JcGF0aG5hbWUgPSBremFsbG9jKEFDUElfUEFUSE5BTUVfTUFYLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXBhdGhuYW1lKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWlmIChmaXJzdF90aW1lKSB7Ci0JCWFjcGlfcHJ0LmNvdW50ID0gMDsKLQkJSU5JVF9MSVNUX0hFQUQoJmFjcGlfcHJ0LmVudHJpZXMpOwotCQlmaXJzdF90aW1lID0gMDsKLQl9Ci0KLQkvKiAKLQkgKiBOT1RFOiBXZSdyZSBnaXZlbiBhICdoYW5kbGUnIHRvIHRoZSBfUFJUIG9iamVjdCdzIHBhcmVudCBkZXZpY2UKLQkgKiAgICAgICAoZWl0aGVyIGEgUENJIHJvb3QgYnJpZGdlIG9yIFBDSS1QQ0kgYnJpZGdlKS4KLQkgKi8KLQotCWJ1ZmZlci5sZW5ndGggPSBBQ1BJX1BBVEhOQU1FX01BWDsKLQlidWZmZXIucG9pbnRlciA9IHBhdGhuYW1lOwotCWFjcGlfZ2V0X25hbWUoaGFuZGxlLCBBQ1BJX0ZVTExfUEFUSE5BTUUsICZidWZmZXIpOworCS8qICdoYW5kbGUnIGlzIHRoZSBfUFJUJ3MgcGFyZW50IChyb290IGJyaWRnZSBvciBQQ0ktUENJIGJyaWRnZSkgKi8KKwlzdGF0dXMgPSBhY3BpX2dldF9uYW1lKGhhbmRsZSwgQUNQSV9GVUxMX1BBVEhOQU1FLCAmYnVmZmVyKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpCisJCXJldHVybiAtRU5PREVWOwogCiAJcHJpbnRrKEtFUk5fREVCVUcgIkFDUEk6IFBDSSBJbnRlcnJ1cHQgUm91dGluZyBUYWJsZSBbJXMuX1BSVF1cbiIsCi0JICAgICAgIHBhdGhuYW1lKTsKKwkgICAgICAgKGNoYXIgKikgYnVmZmVyLnBvaW50ZXIpOwogCi0JLyogCi0JICogRXZhbHVhdGUgdGhpcyBfUFJUIGFuZCBhZGQgaXRzIGVudHJpZXMgdG8gb3VyIGdsb2JhbCBsaXN0IChhY3BpX3BydCkuCi0JICovCisJa2ZyZWUoYnVmZmVyLnBvaW50ZXIpOwogCi0JYnVmZmVyLmxlbmd0aCA9IDA7CisJYnVmZmVyLmxlbmd0aCA9IEFDUElfQUxMT0NBVEVfQlVGRkVSOwogCWJ1ZmZlci5wb2ludGVyID0gTlVMTDsKLQlrZnJlZShwYXRobmFtZSk7Ci0Jc3RhdHVzID0gYWNwaV9nZXRfaXJxX3JvdXRpbmdfdGFibGUoaGFuZGxlLCAmYnVmZmVyKTsKLQlpZiAoc3RhdHVzICE9IEFFX0JVRkZFUl9PVkVSRkxPVykgewotCQlBQ1BJX0VYQ0VQVElPTigoQUVfSU5GTywgc3RhdHVzLCAiRXZhbHVhdGluZyBfUFJUIFslc10iLAotCQkJCWFjcGlfZm9ybWF0X2V4Y2VwdGlvbihzdGF0dXMpKSk7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQotCXBydCA9IGt6YWxsb2MoYnVmZmVyLmxlbmd0aCwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwcnQpIHsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCWJ1ZmZlci5wb2ludGVyID0gcHJ0OwogCiAJc3RhdHVzID0gYWNwaV9nZXRfaXJxX3JvdXRpbmdfdGFibGUoaGFuZGxlLCAmYnVmZmVyKTsKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKQEAgLTMwNSwzNiArMjY5LDMwIEBACiAJCXJldHVybiAtRU5PREVWOwogCX0KIAotCWVudHJ5ID0gcHJ0OwotCisJZW50cnkgPSBidWZmZXIucG9pbnRlcjsKIAl3aGlsZSAoZW50cnkgJiYgKGVudHJ5LT5sZW5ndGggPiAwKSkgewogCQlhY3BpX3BjaV9pcnFfYWRkX2VudHJ5KGhhbmRsZSwgc2VnbWVudCwgYnVzLCBlbnRyeSk7CiAJCWVudHJ5ID0gKHN0cnVjdCBhY3BpX3BjaV9yb3V0aW5nX3RhYmxlICopCiAJCSAgICAoKHVuc2lnbmVkIGxvbmcpZW50cnkgKyBlbnRyeS0+bGVuZ3RoKTsKIAl9CiAKLQlrZnJlZShwcnQpOwotCisJa2ZyZWUoYnVmZmVyLnBvaW50ZXIpOwogCXJldHVybiAwOwogfQogCiB2b2lkIGFjcGlfcGNpX2lycV9kZWxfcHJ0KGludCBzZWdtZW50LCBpbnQgYnVzKQogewotCXN0cnVjdCBsaXN0X2hlYWQgKm5vZGUgPSBOVUxMLCAqbiA9IE5VTEw7Ci0Jc3RydWN0IGFjcGlfcHJ0X2VudHJ5ICplbnRyeSA9IE5VTEw7Ci0KLQlpZiAoIWFjcGlfcHJ0LmNvdW50KSB7Ci0JCXJldHVybjsKLQl9CisJc3RydWN0IGFjcGlfcHJ0X2VudHJ5ICplbnRyeSwgKnRtcDsKIAogCXByaW50ayhLRVJOX0RFQlVHCi0JICAgICAgICJBQ1BJOiBEZWxldGUgUENJIEludGVycnVwdCBSb3V0aW5nIFRhYmxlIGZvciAleDoleFxuIiwgc2VnbWVudCwKLQkgICAgICAgYnVzKTsKKwkgICAgICAgIkFDUEk6IERlbGV0ZSBQQ0kgSW50ZXJydXB0IFJvdXRpbmcgVGFibGUgZm9yICUwNHg6JTAyeFxuIiwKKwkgICAgICAgc2VnbWVudCwgYnVzKTsKIAlzcGluX2xvY2soJmFjcGlfcHJ0X2xvY2spOwotCWxpc3RfZm9yX2VhY2hfc2FmZShub2RlLCBuLCAmYWNwaV9wcnQuZW50cmllcykgewotCQllbnRyeSA9IGxpc3RfZW50cnkobm9kZSwgc3RydWN0IGFjcGlfcHJ0X2VudHJ5LCBub2RlKTsKLQotCQlhY3BpX3BjaV9pcnFfZGVsX2VudHJ5KHNlZ21lbnQsIGJ1cywgZW50cnkpOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShlbnRyeSwgdG1wLCAmYWNwaV9wcnRfbGlzdCwgbGlzdCkgeworCQlpZiAoc2VnbWVudCA9PSBlbnRyeS0+aWQuc2VnbWVudCAmJiBidXMgPT0gZW50cnktPmlkLmJ1cykgeworCQkJbGlzdF9kZWwoJmVudHJ5LT5saXN0KTsKKwkJCWtmcmVlKGVudHJ5KTsKKwkJfQogCX0KIAlzcGluX3VubG9jaygmYWNwaV9wcnRfbG9jayk7CiB9CkBAIC0zNDIsMTYyICszMDAsMjYgQEAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFBDSSBJbnRlcnJ1cHQgUm91dGluZyBTdXBwb3J0CiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotdHlwZWRlZiBpbnQgKCppcnFfbG9va3VwX2Z1bmMpIChzdHJ1Y3QgYWNwaV9wcnRfZW50cnkgKiwgaW50ICosIGludCAqLCBjaGFyICoqKTsKLQotc3RhdGljIGludAotYWNwaV9wY2lfYWxsb2NhdGVfaXJxKHN0cnVjdCBhY3BpX3BydF9lbnRyeSAqZW50cnksCi0JCSAgICAgIGludCAqdHJpZ2dlcmluZywgaW50ICpwb2xhcml0eSwgY2hhciAqKmxpbmspCitzdGF0aWMgc3RydWN0IGFjcGlfcHJ0X2VudHJ5ICphY3BpX3BjaV9pcnFfbG9va3VwKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCBwaW4pCiB7Ci0JaW50IGlycTsKKwlzdHJ1Y3QgYWNwaV9wcnRfZW50cnkgKmVudHJ5OworCXN0cnVjdCBwY2lfZGV2ICpicmlkZ2U7CisJdTggYnJpZGdlX3Bpbiwgb3JpZ19waW4gPSBwaW47CiAKLQotCWlmIChlbnRyeS0+bGluay5oYW5kbGUpIHsKLQkJaXJxID0gYWNwaV9wY2lfbGlua19hbGxvY2F0ZV9pcnEoZW50cnktPmxpbmsuaGFuZGxlLAotCQkJCQkJIGVudHJ5LT5saW5rLmluZGV4LCB0cmlnZ2VyaW5nLAotCQkJCQkJIHBvbGFyaXR5LCBsaW5rKTsKLQkJaWYgKGlycSA8IDApIHsKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgUFJFRklYCi0JCQkJICAgICAgIkludmFsaWQgSVJRIGxpbmsgcm91dGluZyBlbnRyeVxuIik7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQl9IGVsc2UgewotCQlpcnEgPSBlbnRyeS0+bGluay5pbmRleDsKLQkJKnRyaWdnZXJpbmcgPSBBQ1BJX0xFVkVMX1NFTlNJVElWRTsKLQkJKnBvbGFyaXR5ID0gQUNQSV9BQ1RJVkVfTE9XOworCWVudHJ5ID0gYWNwaV9wY2lfaXJxX2ZpbmRfcHJ0X2VudHJ5KGRldiwgcGluKTsKKwlpZiAoZW50cnkpIHsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLCAiRm91bmQgJXNbJWNdIF9QUlQgZW50cnlcbiIsCisJCQkJICBwY2lfbmFtZShkZXYpLCBwaW5fbmFtZShwaW4pKSk7CisJCXJldHVybiBlbnRyeTsKIAl9CiAKLQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sICJGb3VuZCBJUlEgJWRcbiIsIGlycSkpOwotCXJldHVybiBpcnE7Ci19Ci0KLXN0YXRpYyBpbnQKLWFjcGlfcGNpX2ZyZWVfaXJxKHN0cnVjdCBhY3BpX3BydF9lbnRyeSAqZW50cnksCi0JCSAgaW50ICp0cmlnZ2VyaW5nLCBpbnQgKnBvbGFyaXR5LCBjaGFyICoqbGluaykKLXsKLQlpbnQgaXJxOwotCi0JaWYgKGVudHJ5LT5saW5rLmhhbmRsZSkgewotCQlpcnEgPSBhY3BpX3BjaV9saW5rX2ZyZWVfaXJxKGVudHJ5LT5saW5rLmhhbmRsZSk7Ci0JfSBlbHNlIHsKLQkJaXJxID0gZW50cnktPmxpbmsuaW5kZXg7Ci0JfQotCXJldHVybiBpcnE7Ci19Ci0KLSNpZmRlZiBDT05GSUdfWDg2X0lPX0FQSUMKLWV4dGVybiBpbnQgbm9pb2FwaWNxdWlyazsKLQotc3RhdGljIGludCBicmlkZ2VfaGFzX2Jvb3RfaW50ZXJydXB0X3ZhcmlhbnQoc3RydWN0IHBjaV9idXMgKmJ1cykKLXsKLQlzdHJ1Y3QgcGNpX2J1cyAqYnVzX2l0OwotCi0JZm9yIChidXNfaXQgPSBidXMgOyBidXNfaXQgOyBidXNfaXQgPSBidXNfaXQtPnBhcmVudCkgewotCQlpZiAoIWJ1c19pdC0+c2VsZikKLQkJCXJldHVybiAwOwotCi0JCXByaW50ayhLRVJOX0lORk8gInZlbmRvcj0lMDR4IGRldmljZT0lMDR4XG4iLCBidXNfaXQtPnNlbGYtPnZlbmRvciwKLQkJCQlidXNfaXQtPnNlbGYtPmRldmljZSk7Ci0KLQkJaWYgKGJ1c19pdC0+c2VsZi0+aXJxX3Jlcm91dGVfdmFyaWFudCkKLQkJCXJldHVybiBidXNfaXQtPnNlbGYtPmlycV9yZXJvdXRlX3ZhcmlhbnQ7Ci0JfQotCXJldHVybiAwOwotfQotI2VuZGlmIC8qIENPTkZJR19YODZfSU9fQVBJQyAqLwotCi0vKgotICogYWNwaV9wY2lfaXJxX2xvb2t1cAotICogc3VjY2VzczogcmV0dXJuIElSUSA+PSAwCi0gKiBmYWlsdXJlOiByZXR1cm4gLTEKLSAqLwotc3RhdGljIGludAotYWNwaV9wY2lfaXJxX2xvb2t1cChzdHJ1Y3QgcGNpX2J1cyAqYnVzLAotCQkgICAgaW50IGRldmljZSwKLQkJICAgIGludCBwaW4sCi0JCSAgICBpbnQgKnRyaWdnZXJpbmcsCi0JCSAgICBpbnQgKnBvbGFyaXR5LCBjaGFyICoqbGluaywgaXJxX2xvb2t1cF9mdW5jIGZ1bmMpCi17Ci0Jc3RydWN0IGFjcGlfcHJ0X2VudHJ5ICplbnRyeSA9IE5VTEw7Ci0JaW50IHNlZ21lbnQgPSBwY2lfZG9tYWluX25yKGJ1cyk7Ci0JaW50IGJ1c19uciA9IGJ1cy0+bnVtYmVyOwotCWludCByZXQ7Ci0KLQotCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywKLQkJCSAgIlNlYXJjaGluZyBmb3IgUFJUIGVudHJ5IGZvciAlMDJ4OiUwMng6JTAyeFslY11cbiIsCi0JCQkgIHNlZ21lbnQsIGJ1c19uciwgZGV2aWNlLCAoJ0EnICsgcGluKSkpOwotCi0JZW50cnkgPSBhY3BpX3BjaV9pcnFfZmluZF9wcnRfZW50cnkoc2VnbWVudCwgYnVzX25yLCBkZXZpY2UsIHBpbik7Ci0JaWYgKCFlbnRyeSkgewotCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sICJQUlQgZW50cnkgbm90IGZvdW5kXG4iKSk7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlyZXQgPSBmdW5jKGVudHJ5LCB0cmlnZ2VyaW5nLCBwb2xhcml0eSwgbGluayk7Ci0KLSNpZmRlZiBDT05GSUdfWDg2X0lPX0FQSUMKLQkvKgotCSAqIFNvbWUgY2hpcHNldHMgKGUuZy4gaW50ZWwgNjcwMFBYSCkgZ2VuZXJhdGUgYSBsZWdhY3kgSU5UeCB3aGVuIHRoZQotCSAqIElSUSBlbnRyeSBpbiB0aGUgY2hpcHNldCdzIElPLUFQSUMgaXMgbWFza2VkIChhcywgZS5nLiB0aGUgUlQga2VybmVsCi0JICogZG9lcyBkdXJpbmcgaW50ZXJydXB0IGhhbmRsaW5nKS4gV2hlbiB0aGlzIElOVHggZ2VuZXJhdGlvbiBjYW5ub3QgYmUKLQkgKiBkaXNhYmxlZCwgd2UgcmVyb3V0ZSB0aGVzZSBpbnRlcnJ1cHRzIHRvIHRoZWlyIGxlZ2FjeSBlcXVpdmFsZW50IHRvCi0JICogZ2V0IHJpZCBvZiBzcHVyaW91cyBpbnRlcnJ1cHRzLgotCSAqLwotICAgICAgICBpZiAoIW5vaW9hcGljcXVpcmspIHsKLQkJc3dpdGNoIChicmlkZ2VfaGFzX2Jvb3RfaW50ZXJydXB0X3ZhcmlhbnQoYnVzKSkgewotCQljYXNlIDA6Ci0JCQkvKiBubyByZXJvdXRpbmcgbmVjZXNzYXJ5ICovCi0JCQlicmVhazsKLQotCQljYXNlIElOVEVMX0lSUV9SRVJPVVRFX1ZBUklBTlQ6Ci0JCQkvKgotCQkJICogUmVtYXAgYWNjb3JkaW5nIHRvIElOVHggcm91dGluZyB0YWJsZSBpbiA2NzAwUFhICi0JCQkgKiBzcGVjcywgaW50ZWwgb3JkZXIgbnVtYmVyIDMwMjYyOC0wMDIsIHNlY3Rpb24KLQkJCSAqIDIuMTUuMi4gT3RoZXIgY2hpcHNldHMgKDgwMzMyLCAuLi4pIGhhdmUgdGhlIHNhbWUKLQkJCSAqIG1hcHBpbmcgYW5kIGFyZSBoYW5kbGVkIGhlcmUgYXMgd2VsbC4KLQkJCSAqLwotCQkJcHJpbnRrKEtFUk5fSU5GTyAicGNpIGlycSAlZCAtPiByZXJvdXRlZCB0byBsZWdhY3kgIgotCQkJCQkgImlycSAlZFxuIiwgcmV0LCAocmV0ICUgNCkgKyAxNik7Ci0JCQlyZXQgPSAocmV0ICUgNCkgKyAxNjsKLQkJCWJyZWFrOwotCi0JCWRlZmF1bHQ6Ci0JCQlwcmludGsoS0VSTl9JTkZPICJub3QgcmVyb3V0aW5nIGlycSAlZCB0byBsZWdhY3kgaXJxOiAiCi0JCQkJCSAidW5rbm93biBtYXBwaW5nXG4iLCByZXQpOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0jZW5kaWYgLyogQ09ORklHX1g4Nl9JT19BUElDICovCi0KLQlyZXR1cm4gcmV0OwotfQotCi0vKgotICogYWNwaV9wY2lfaXJxX2Rlcml2ZQotICogc3VjY2VzczogcmV0dXJuIElSUSA+PSAwCi0gKiBmYWlsdXJlOiByZXR1cm4gPCAwCi0gKi8KLXN0YXRpYyBpbnQKLWFjcGlfcGNpX2lycV9kZXJpdmUoc3RydWN0IHBjaV9kZXYgKmRldiwKLQkJICAgIGludCBwaW4sCi0JCSAgICBpbnQgKnRyaWdnZXJpbmcsCi0JCSAgICBpbnQgKnBvbGFyaXR5LCBjaGFyICoqbGluaywgaXJxX2xvb2t1cF9mdW5jIGZ1bmMpCi17Ci0Jc3RydWN0IHBjaV9kZXYgKmJyaWRnZSA9IGRldjsKLQlpbnQgaXJxID0gLTE7Ci0JdTggYnJpZGdlX3BpbiA9IDAsIG9yaWdfcGluID0gcGluOwotCi0KLQlpZiAoIWRldikKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KIAkvKiAKIAkgKiBBdHRlbXB0IHRvIGRlcml2ZSBhbiBJUlEgZm9yIHRoaXMgZGV2aWNlIGZyb20gYSBwYXJlbnQgYnJpZGdlJ3MKIAkgKiBQQ0kgaW50ZXJydXB0IHJvdXRpbmcgZW50cnkgKGVnLiB5ZW50YSBicmlkZ2UgYW5kIGFkZC1pbiBjYXJkIGJyaWRnZSkuCiAJICovCi0Jd2hpbGUgKGlycSA8IDAgJiYgYnJpZGdlLT5idXMtPnNlbGYpIHsKLQkJcGluID0gKHBpbiArIFBDSV9TTE9UKGJyaWRnZS0+ZGV2Zm4pKSAlIDQ7Ci0JCWJyaWRnZSA9IGJyaWRnZS0+YnVzLT5zZWxmOworCWJyaWRnZSA9IGRldi0+YnVzLT5zZWxmOworCXdoaWxlIChicmlkZ2UpIHsKKwkJcGluID0gKCgocGluIC0gMSkgKyBQQ0lfU0xPVChkZXYtPmRldmZuKSkgJSA0KSArIDE7CiAKIAkJaWYgKChicmlkZ2UtPmNsYXNzID4+IDgpID09IFBDSV9DTEFTU19CUklER0VfQ0FSREJVUykgewogCQkJLyogUEMgY2FyZCBoYXMgdGhlIHNhbWUgSVJRIGFzIGl0cyBjYXJkYnJpZGdlICovCkBAIC01MDYsNTAgKzMyOCw0MCBAQAogCQkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywKIAkJCQkJCSAgIk5vIGludGVycnVwdCBwaW4gY29uZmlndXJlZCBmb3IgZGV2aWNlICVzXG4iLAogCQkJCQkJICBwY2lfbmFtZShicmlkZ2UpKSk7Ci0JCQkJcmV0dXJuIC0xOworCQkJCXJldHVybiBOVUxMOwogCQkJfQotCQkJLyogUGluIGlzIGZyb20gMCB0byAzICovCi0JCQlicmlkZ2VfcGluLS07CiAJCQlwaW4gPSBicmlkZ2VfcGluOwogCQl9CiAKLQkJaXJxID0gYWNwaV9wY2lfaXJxX2xvb2t1cChicmlkZ2UtPmJ1cywgUENJX1NMT1QoYnJpZGdlLT5kZXZmbiksCi0JCQkJCSAgcGluLCB0cmlnZ2VyaW5nLCBwb2xhcml0eSwKLQkJCQkJICBsaW5rLCBmdW5jKTsKKwkJZW50cnkgPSBhY3BpX3BjaV9pcnFfZmluZF9wcnRfZW50cnkoYnJpZGdlLCBwaW4pOworCQlpZiAoZW50cnkpIHsKKwkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywKKwkJCQkJICJEZXJpdmVkIEdTSSBmb3IgJXMgSU5UICVjIGZyb20gJXNcbiIsCisJCQkJCSBwY2lfbmFtZShkZXYpLCBwaW5fbmFtZShvcmlnX3BpbiksCisJCQkJCSBwY2lfbmFtZShicmlkZ2UpKSk7CisJCQlyZXR1cm4gZW50cnk7CisJCX0KKworCQlkZXYgPSBicmlkZ2U7CisJCWJyaWRnZSA9IGRldi0+YnVzLT5zZWxmOwogCX0KIAotCWlmIChpcnEgPCAwKSB7Ci0JCWRldl93YXJuKCZkZXYtPmRldiwgImNhbid0IGRlcml2ZSByb3V0aW5nIGZvciBQQ0kgSU5UICVjXG4iLAotCQkJICdBJyArIG9yaWdfcGluKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgIkRlcml2ZSBJUlEgJWQgZm9yIGRldmljZSAlcyBmcm9tICVzXG4iLAotCQkJICBpcnEsIHBjaV9uYW1lKGRldiksIHBjaV9uYW1lKGJyaWRnZSkpKTsKLQotCXJldHVybiBpcnE7CisJZGV2X3dhcm4oJmRldi0+ZGV2LCAiY2FuJ3QgZGVyaXZlIHJvdXRpbmcgZm9yIFBDSSBJTlQgJWNcbiIsCisJCSBwaW5fbmFtZShvcmlnX3BpbikpOworCXJldHVybiBOVUxMOwogfQogCi0vKgotICogYWNwaV9wY2lfaXJxX2VuYWJsZQotICogc3VjY2VzczogcmV0dXJuIDAKLSAqIGZhaWx1cmU6IHJldHVybiA8IDAKLSAqLwotCiBpbnQgYWNwaV9wY2lfaXJxX2VuYWJsZShzdHJ1Y3QgcGNpX2RldiAqZGV2KQogewotCWludCBpcnEgPSAwOwotCXU4IHBpbiA9IDA7CisJc3RydWN0IGFjcGlfcHJ0X2VudHJ5ICplbnRyeTsKKwlpbnQgZ3NpOworCXU4IHBpbjsKIAlpbnQgdHJpZ2dlcmluZyA9IEFDUElfTEVWRUxfU0VOU0lUSVZFOwogCWludCBwb2xhcml0eSA9IEFDUElfQUNUSVZFX0xPVzsKIAljaGFyICpsaW5rID0gTlVMTDsKIAljaGFyIGxpbmtfZGVzY1sxNl07CiAJaW50IHJjOwogCi0KLQlpZiAoIWRldikKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KIAlwaW4gPSBkZXYtPnBpbjsKIAlpZiAoIXBpbikgewogCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sCkBAIC01NTcsMzEgKzM2OSw5IEBACiAJCQkJICBwY2lfbmFtZShkZXYpKSk7CiAJCXJldHVybiAwOwogCX0KLQlwaW4tLTsKIAotCWlmICghZGV2LT5idXMpIHsKLQkJZGV2X2VycigmZGV2LT5kZXYsICJpbnZhbGlkIChOVUxMKSAnYnVzJyBmaWVsZFxuIik7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQotCS8qIAotCSAqIEZpcnN0IHdlIGNoZWNrIHRoZSBQQ0kgSVJRIHJvdXRpbmcgdGFibGUgKFBSVCkgZm9yIGFuIElSUS4gIFBSVAotCSAqIHZhbHVlcyBvdmVycmlkZSBhbnkgQklPUy1hc3NpZ25lZCBJUlFzIHNldCBkdXJpbmcgYm9vdC4KLQkgKi8KLQlpcnEgPSBhY3BpX3BjaV9pcnFfbG9va3VwKGRldi0+YnVzLCBQQ0lfU0xPVChkZXYtPmRldmZuKSwgcGluLAotCQkJCSAgJnRyaWdnZXJpbmcsICZwb2xhcml0eSwgJmxpbmssCi0JCQkJICBhY3BpX3BjaV9hbGxvY2F0ZV9pcnEpOwotCi0JLyoKLQkgKiBJZiBubyBQUlQgZW50cnkgd2FzIGZvdW5kLCB3ZSdsbCB0cnkgdG8gZGVyaXZlIGFuIElSUSBmcm9tIHRoZQotCSAqIGRldmljZSdzIHBhcmVudCBicmlkZ2UuCi0JICovCi0JaWYgKGlycSA8IDApCi0JCWlycSA9IGFjcGlfcGNpX2lycV9kZXJpdmUoZGV2LCBwaW4sICZ0cmlnZ2VyaW5nLAotCQkJCQkgICZwb2xhcml0eSwgJmxpbmssCi0JCQkJCSAgYWNwaV9wY2lfYWxsb2NhdGVfaXJxKTsKLQotCWlmIChpcnEgPCAwKSB7CisJZW50cnkgPSBhY3BpX3BjaV9pcnFfbG9va3VwKGRldiwgcGluKTsKKwlpZiAoIWVudHJ5KSB7CiAJCS8qCiAJCSAqIElERSBsZWdhY3kgbW9kZSBjb250cm9sbGVyIElSUXMgYXJlIG1hZ2ljLiBXaHkgZG8gY29tcGF0CiAJCSAqIGV4dGVuc2lvbnMgYWx3YXlzIG1ha2Ugc3VjaCBhIG5hc3R5IG1lc3MuCkBAIC01OTAsMTIgKzM4MCwyNCBAQAogCQkJCShkZXYtPmNsYXNzICYgMHgwNSkgPT0gMCkKIAkJCXJldHVybiAwOwogCX0KKworCWlmIChlbnRyeSkgeworCQlpZiAoZW50cnktPmxpbmspCisJCQlnc2kgPSBhY3BpX3BjaV9saW5rX2FsbG9jYXRlX2lycShlbnRyeS0+bGluaywKKwkJCQkJCQkgZW50cnktPmluZGV4LAorCQkJCQkJCSAmdHJpZ2dlcmluZywgJnBvbGFyaXR5LAorCQkJCQkJCSAmbGluayk7CisJCWVsc2UKKwkJCWdzaSA9IGVudHJ5LT5pbmRleDsKKwl9IGVsc2UKKwkJZ3NpID0gLTE7CisKIAkvKgogCSAqIE5vIElSUSBrbm93biB0byB0aGUgQUNQSSBzdWJzeXN0ZW0gLSBtYXliZSB0aGUgQklPUyAvIAogCSAqIGRyaXZlciByZXBvcnRlZCBvbmUsIHRoZW4gdXNlIGl0LiBFeGl0IGluIGFueSBjYXNlLgogCSAqLwotCWlmIChpcnEgPCAwKSB7Ci0JCWRldl93YXJuKCZkZXYtPmRldiwgIlBDSSBJTlQgJWM6IG5vIEdTSSIsICdBJyArIHBpbik7CisJaWYgKGdzaSA8IDApIHsKKwkJZGV2X3dhcm4oJmRldi0+ZGV2LCAiUENJIElOVCAlYzogbm8gR1NJIiwgcGluX25hbWUocGluKSk7CiAJCS8qIEludGVycnVwdCBMaW5lIHZhbHVlcyBhYm92ZSAweEYgYXJlIGZvcmJpZGRlbiAqLwogCQlpZiAoZGV2LT5pcnEgPiAwICYmIChkZXYtPmlycSA8PSAweEYpKSB7CiAJCQlwcmludGsoIiAtIHVzaW5nIElSUSAlZFxuIiwgZGV2LT5pcnEpOwpAQCAtNjA4LDEwICs0MTAsMTAgQEAKIAkJfQogCX0KIAotCXJjID0gYWNwaV9yZWdpc3Rlcl9nc2koaXJxLCB0cmlnZ2VyaW5nLCBwb2xhcml0eSk7CisJcmMgPSBhY3BpX3JlZ2lzdGVyX2dzaShnc2ksIHRyaWdnZXJpbmcsIHBvbGFyaXR5KTsKIAlpZiAocmMgPCAwKSB7CiAJCWRldl93YXJuKCZkZXYtPmRldiwgIlBDSSBJTlQgJWM6IGZhaWxlZCB0byByZWdpc3RlciBHU0lcbiIsCi0JCQkgJ0EnICsgcGluKTsKKwkJCSBwaW5fbmFtZShwaW4pKTsKIAkJcmV0dXJuIHJjOwogCX0KIAlkZXYtPmlycSA9IHJjOwpAQCAtNjIyLDcgKzQyNCw3IEBACiAJCWxpbmtfZGVzY1swXSA9ICdcMCc7CiAKIAlkZXZfaW5mbygmZGV2LT5kZXYsICJQQ0kgSU5UICVjJXMgLT4gR1NJICV1ICglcywgJXMpIC0+IElSUSAlZFxuIiwKLQkJICdBJyArIHBpbiwgbGlua19kZXNjLCBpcnEsCisJCSBwaW5fbmFtZShwaW4pLCBsaW5rX2Rlc2MsIGdzaSwKIAkJICh0cmlnZ2VyaW5nID09IEFDUElfTEVWRUxfU0VOU0lUSVZFKSA/ICJsZXZlbCIgOiAiZWRnZSIsCiAJCSAocG9sYXJpdHkgPT0gQUNQSV9BQ1RJVkVfTE9XKSA/ICJsb3ciIDogImhpZ2giLCBkZXYtPmlycSk7CiAKQEAgLTYzNiw0MiArNDM4LDI4IEBACiAKIHZvaWQgYWNwaV9wY2lfaXJxX2Rpc2FibGUoc3RydWN0IHBjaV9kZXYgKmRldikKIHsKLQlpbnQgZ3NpID0gMDsKLQl1OCBwaW4gPSAwOwotCWludCB0cmlnZ2VyaW5nID0gQUNQSV9MRVZFTF9TRU5TSVRJVkU7Ci0JaW50IHBvbGFyaXR5ID0gQUNQSV9BQ1RJVkVfTE9XOwotCi0KLQlpZiAoIWRldiB8fCAhZGV2LT5idXMpCi0JCXJldHVybjsKKwlzdHJ1Y3QgYWNwaV9wcnRfZW50cnkgKmVudHJ5OworCWludCBnc2k7CisJdTggcGluOwogCiAJcGluID0gZGV2LT5waW47CiAJaWYgKCFwaW4pCiAJCXJldHVybjsKLQlwaW4tLTsKIAotCS8qCi0JICogRmlyc3Qgd2UgY2hlY2sgdGhlIFBDSSBJUlEgcm91dGluZyB0YWJsZSAoUFJUKSBmb3IgYW4gSVJRLgotCSAqLwotCWdzaSA9IGFjcGlfcGNpX2lycV9sb29rdXAoZGV2LT5idXMsIFBDSV9TTE9UKGRldi0+ZGV2Zm4pLCBwaW4sCi0JCQkJICAmdHJpZ2dlcmluZywgJnBvbGFyaXR5LCBOVUxMLAotCQkJCSAgYWNwaV9wY2lfZnJlZV9pcnEpOwotCS8qCi0JICogSWYgbm8gUFJUIGVudHJ5IHdhcyBmb3VuZCwgd2UnbGwgdHJ5IHRvIGRlcml2ZSBhbiBJUlEgZnJvbSB0aGUKLQkgKiBkZXZpY2UncyBwYXJlbnQgYnJpZGdlLgotCSAqLwotCWlmIChnc2kgPCAwKQotCQlnc2kgPSBhY3BpX3BjaV9pcnFfZGVyaXZlKGRldiwgcGluLAotCQkJCQkgICZ0cmlnZ2VyaW5nLCAmcG9sYXJpdHksIE5VTEwsCi0JCQkJCSAgYWNwaV9wY2lfZnJlZV9pcnEpOwotCWlmIChnc2kgPCAwKQorCWVudHJ5ID0gYWNwaV9wY2lfaXJxX2xvb2t1cChkZXYsIHBpbik7CisJaWYgKCFlbnRyeSkKIAkJcmV0dXJuOwogCisJaWYgKGVudHJ5LT5saW5rKQorCQlnc2kgPSBhY3BpX3BjaV9saW5rX2ZyZWVfaXJxKGVudHJ5LT5saW5rKTsKKwllbHNlCisJCWdzaSA9IGVudHJ5LT5pbmRleDsKKwogCS8qCiAJICogVEJEOiBJdCBtaWdodCBiZSB3b3J0aCBjbGVhcmluZyBkZXYtPmlycSBieSBtYWdpYyBjb25zdGFudAogCSAqIChlLmcuIFBDSV9VTkRFRklORURfSVJRKS4KIAkgKi8KIAotCWRldl9pbmZvKCZkZXYtPmRldiwgIlBDSSBJTlQgJWMgZGlzYWJsZWRcbiIsICdBJyArIHBpbik7CisJZGV2X2luZm8oJmRldi0+ZGV2LCAiUENJIElOVCAlYyBkaXNhYmxlZFxuIiwgcGluX25hbWUocGluKSk7CiAJYWNwaV91bnJlZ2lzdGVyX2dzaShnc2kpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3BjaV9saW5rLmMgYi9kcml2ZXJzL2FjcGkvcGNpX2xpbmsuYwppbmRleCBlNTJhZDkxLi4xYzZlNzNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvcGNpX2xpbmsuYworKysgYi9kcml2ZXJzL2FjcGkvcGNpX2xpbmsuYwpAQCAtNzk2LDEwICs3OTYsNiBAQAogCXN0cnVjdCBsaXN0X2hlYWQgKm5vZGUgPSBOVUxMOwogCXN0cnVjdCBhY3BpX3BjaV9saW5rICpsaW5rID0gTlVMTDsKIAotCi0JLyogTWFrZSBzdXJlIFNDSSBpcyBlbmFibGVkIGFnYWluIChBcHBsZSBmaXJtd2FyZSBidWc/KSAqLwotCWFjcGlfc2V0X3JlZ2lzdGVyKEFDUElfQklUUkVHX1NDSV9FTkFCTEUsIDEpOwotCiAJbGlzdF9mb3JfZWFjaChub2RlLCAmYWNwaV9saW5rLmVudHJpZXMpIHsKIAkJbGluayA9IGxpc3RfZW50cnkobm9kZSwgc3RydWN0IGFjcGlfcGNpX2xpbmssIG5vZGUpOwogCQlpZiAoIWxpbmspIHsKQEAgLTkxMiw3ICs5MDgsNyBAQAogCiBfX3NldHVwKCJhY3BpX2lycV9ub2JhbGFuY2UiLCBhY3BpX2lycV9ub2JhbGFuY2Vfc2V0KTsKIAotaW50IF9faW5pdCBhY3BpX2lycV9iYWxhbmNlX3NldChjaGFyICpzdHIpCitzdGF0aWMgaW50IF9faW5pdCBhY3BpX2lycV9iYWxhbmNlX3NldChjaGFyICpzdHIpCiB7CiAJYWNwaV9pcnFfYmFsYW5jZSA9IDE7CiAJcmV0dXJuIDE7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvcGNpX3Jvb3QuYyBiL2RyaXZlcnMvYWNwaS9wY2lfcm9vdC5jCmluZGV4IDY0MjU1NGIuLjViMzhhMDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9wY2lfcm9vdC5jCisrKyBiL2RyaXZlcnMvYWNwaS9wY2lfcm9vdC5jCkBAIC0zMSw2ICszMSw3IEBACiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9wbS5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS1hY3BpLmg+CiAjaW5jbHVkZSA8bGludXgvYWNwaS5oPgogI2luY2x1ZGUgPGFjcGkvYWNwaV9idXMuaD4KICNpbmNsdWRlIDxhY3BpL2FjcGlfZHJpdmVycy5oPgpAQCAtMTkzLDYgKzE5NCw3IEBACiAJdW5zaWduZWQgbG9uZyBsb25nIHZhbHVlID0gMDsKIAlhY3BpX2hhbmRsZSBoYW5kbGUgPSBOVUxMOwogCXN0cnVjdCBhY3BpX2RldmljZSAqY2hpbGQ7CisJdTMyIGZsYWdzLCBiYXNlX2ZsYWdzOwogCiAKIAlpZiAoIWRldmljZSkKQEAgLTIxMCw2ICsyMTIsMTMgQEAKIAogCWRldmljZS0+b3BzLmJpbmQgPSBhY3BpX3BjaV9iaW5kOwogCisJLyoKKwkgKiBBbGwgc3VwcG9ydGVkIGFyY2hpdGVjdHVyZXMgdGhhdCB1c2UgQUNQSSBoYXZlIHN1cHBvcnQgZm9yCisJICogUENJIGRvbWFpbnMsIHNvIHdlIGluZGljYXRlIHRoaXMgaW4gX09TQyBzdXBwb3J0IGNhcGFiaWxpdGllcy4KKwkgKi8KKwlmbGFncyA9IGJhc2VfZmxhZ3MgPSBPU0NfUENJX1NFR01FTlRfR1JPVVBTX1NVUFBPUlQ7CisJcGNpX2FjcGlfb3NjX3N1cHBvcnQoZGV2aWNlLT5oYW5kbGUsIGZsYWdzKTsKKwogCS8qIAogCSAqIFNlZ21lbnQKIAkgKiAtLS0tLS0tCkBAIC0zMzUsNiArMzQ0LDE3IEBACiAJbGlzdF9mb3JfZWFjaF9lbnRyeShjaGlsZCwgJmRldmljZS0+Y2hpbGRyZW4sIG5vZGUpCiAJCWFjcGlfcGNpX2JyaWRnZV9zY2FuKGNoaWxkKTsKIAorCS8qIEluZGljYXRlIHN1cHBvcnQgZm9yIHZhcmlvdXMgX09TQyBjYXBhYmlsaXRpZXMuICovCisJaWYgKHBjaV9leHRfY2ZnX2F2YWlsKHJvb3QtPmJ1cy0+c2VsZikpCisJCWZsYWdzIHw9IE9TQ19FWFRfUENJX0NPTkZJR19TVVBQT1JUOworCWlmIChwY2llX2FzcG1fZW5hYmxlZCgpKQorCQlmbGFncyB8PSBPU0NfQUNUSVZFX1NUQVRFX1BXUl9TVVBQT1JUIHwKKwkJCU9TQ19DTE9DS19QV1JfQ0FQQUJJTElUWV9TVVBQT1JUOworCWlmIChwY2lfbXNpX2VuYWJsZWQoKSkKKwkJZmxhZ3MgfD0gT1NDX01TSV9TVVBQT1JUOworCWlmIChmbGFncyAhPSBiYXNlX2ZsYWdzKQorCQlwY2lfYWNwaV9vc2Nfc3VwcG9ydChkZXZpY2UtPmhhbmRsZSwgZmxhZ3MpOworCiAgICAgICBlbmQ6CiAJaWYgKHJlc3VsdCkgewogCQlpZiAoIWxpc3RfZW1wdHkoJnJvb3QtPm5vZGUpKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3Bvd2VyLmMgYi9kcml2ZXJzL2FjcGkvcG93ZXIuYwppbmRleCBiYjdkNTBkLi5jOTI2ZTdkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvcG93ZXIuYworKysgYi9kcml2ZXJzL2FjcGkvcG93ZXIuYwpAQCAtMTM5LDYgKzEzOSw4IEBACiB7CiAJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CiAJdW5zaWduZWQgbG9uZyBsb25nIHN0YSA9IDA7CisJY2hhciBub2RlX25hbWVbNV07CisJc3RydWN0IGFjcGlfYnVmZmVyIGJ1ZmZlciA9IHsgc2l6ZW9mKG5vZGVfbmFtZSksIG5vZGVfbmFtZSB9OwogCiAKIAlpZiAoIWhhbmRsZSB8fCAhc3RhdGUpCkBAIC0xNTEsOCArMTUzLDEwIEBACiAJKnN0YXRlID0gKHN0YSAmIDB4MDEpP0FDUElfUE9XRVJfUkVTT1VSQ0VfU1RBVEVfT046CiAJCQkgICAgICBBQ1BJX1BPV0VSX1JFU09VUkNFX1NUQVRFX09GRjsKIAorCWFjcGlfZ2V0X25hbWUoaGFuZGxlLCBBQ1BJX1NJTkdMRV9OQU1FLCAmYnVmZmVyKTsKKwogCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgIlJlc291cmNlIFslc10gaXMgJXNcbiIsCi0JCQkgIGFjcGlfdXRfZ2V0X25vZGVfbmFtZShoYW5kbGUpLAorCQkJICBub2RlX25hbWUsCiAJCQkJKnN0YXRlID8gIm9uIiA6ICJvZmYiKSk7CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9wcm9jLmMgYi9kcml2ZXJzL2FjcGkvcHJvYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyOGM5MTFkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9hY3BpL3Byb2MuYwpAQCAtMCwwICsxLDUzMSBAQAorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N1c3BlbmQuaD4KKyNpbmNsdWRlIDxsaW51eC9iY2QuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjaW5jbHVkZSA8YWNwaS9hY3BpX2J1cy5oPgorI2luY2x1ZGUgPGFjcGkvYWNwaV9kcml2ZXJzLmg+CisKKyNpZmRlZiBDT05GSUdfWDg2CisjaW5jbHVkZSA8bGludXgvbWMxNDY4MThydGMuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAic2xlZXAuaCIKKworI2RlZmluZSBfQ09NUE9ORU5UCQlBQ1BJX1NZU1RFTV9DT01QT05FTlQKKworLyoKKyAqIHRoaXMgZmlsZSBwcm92aWRlcyBzdXBwb3J0IGZvcjoKKyAqIC9wcm9jL2FjcGkvc2xlZXAKKyAqIC9wcm9jL2FjcGkvYWxhcm0KKyAqIC9wcm9jL2FjcGkvd2FrZXVwCisgKi8KKworQUNQSV9NT0RVTEVfTkFNRSgic2xlZXAiKQorI2lmZGVmCUNPTkZJR19BQ1BJX1BST0NGUworc3RhdGljIGludCBhY3BpX3N5c3RlbV9zbGVlcF9zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqb2Zmc2V0KQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8PSBBQ1BJX1NUQVRFX1M1OyBpKyspIHsKKwkJaWYgKHNsZWVwX3N0YXRlc1tpXSkgeworCQkJc2VxX3ByaW50ZihzZXEsICJTJWQgIiwgaSk7CisJCX0KKwl9CisKKwlzZXFfcHV0cyhzZXEsICJcbiIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWNwaV9zeXN0ZW1fc2xlZXBfb3Blbl9mcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgYWNwaV9zeXN0ZW1fc2xlZXBfc2VxX3Nob3csIFBERShpbm9kZSktPmRhdGEpOworfQorCitzdGF0aWMgc3NpemVfdAorYWNwaV9zeXN0ZW1fd3JpdGVfc2xlZXAoc3RydWN0IGZpbGUgKmZpbGUsCisJCQljb25zdCBjaGFyIF9fdXNlciAqIGJ1ZmZlciwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKiBwcG9zKQoreworCWNoYXIgc3RyWzEyXTsKKwl1MzIgc3RhdGUgPSAwOworCWludCBlcnJvciA9IDA7CisKKwlpZiAoY291bnQgPiBzaXplb2Yoc3RyKSAtIDEpCisJCWdvdG8gRG9uZTsKKwltZW1zZXQoc3RyLCAwLCBzaXplb2Yoc3RyKSk7CisJaWYgKGNvcHlfZnJvbV91c2VyKHN0ciwgYnVmZmVyLCBjb3VudCkpCisJCXJldHVybiAtRUZBVUxUOworCisJLyogQ2hlY2sgZm9yIFM0IGJpb3MgcmVxdWVzdCAqLworCWlmICghc3RyY21wKHN0ciwgIjRiIikpIHsKKwkJZXJyb3IgPSBhY3BpX3N1c3BlbmQoNCk7CisJCWdvdG8gRG9uZTsKKwl9CisJc3RhdGUgPSBzaW1wbGVfc3RydG91bChzdHIsIE5VTEwsIDApOworI2lmZGVmIENPTkZJR19ISUJFUk5BVElPTgorCWlmIChzdGF0ZSA9PSA0KSB7CisJCWVycm9yID0gaGliZXJuYXRlKCk7CisJCWdvdG8gRG9uZTsKKwl9CisjZW5kaWYKKwllcnJvciA9IGFjcGlfc3VzcGVuZChzdGF0ZSk7CisgICAgICBEb25lOgorCXJldHVybiBlcnJvciA/IGVycm9yIDogY291bnQ7Cit9CisjZW5kaWYJCQkJLyogQ09ORklHX0FDUElfUFJPQ0ZTICovCisKKyNpZiBkZWZpbmVkKENPTkZJR19SVENfRFJWX0NNT1MpIHx8IGRlZmluZWQoQ09ORklHX1JUQ19EUlZfQ01PU19NT0RVTEUpIHx8ICFkZWZpbmVkKENPTkZJR19YODYpCisvKiB1c2UgL3N5cy9jbGFzcy9ydGMvcnRjWC93YWtlYWxhcm0gaW5zdGVhZDsgaXQncyBub3QgQUNQSS1zcGVjaWZpYyAqLworI2Vsc2UKKyNkZWZpbmUJSEFWRV9BQ1BJX0xFR0FDWV9BTEFSTQorI2VuZGlmCisKKyNpZmRlZglIQVZFX0FDUElfTEVHQUNZX0FMQVJNCisKK3N0YXRpYyB1MzIgY21vc19iY2RfcmVhZChpbnQgb2Zmc2V0LCBpbnQgcnRjX2NvbnRyb2wpOworCitzdGF0aWMgaW50IGFjcGlfc3lzdGVtX2FsYXJtX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICpvZmZzZXQpCit7CisJdTMyIHNlYywgbWluLCBocjsKKwl1MzIgZGF5LCBtbywgeXIsIGNlbnQgPSAwOworCXUzMiB0b2RheSA9IDA7CisJdW5zaWduZWQgY2hhciBydGNfY29udHJvbCA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZydGNfbG9jaywgZmxhZ3MpOworCisJcnRjX2NvbnRyb2wgPSBDTU9TX1JFQUQoUlRDX0NPTlRST0wpOworCXNlYyA9IGNtb3NfYmNkX3JlYWQoUlRDX1NFQ09ORFNfQUxBUk0sIHJ0Y19jb250cm9sKTsKKwltaW4gPSBjbW9zX2JjZF9yZWFkKFJUQ19NSU5VVEVTX0FMQVJNLCBydGNfY29udHJvbCk7CisJaHIgPSBjbW9zX2JjZF9yZWFkKFJUQ19IT1VSU19BTEFSTSwgcnRjX2NvbnRyb2wpOworCisJLyogSWYgd2UgZXZlciBnZXQgYW4gRkFDUCB3aXRoIHByb3BlciB2YWx1ZXMuLi4gKi8KKwlpZiAoYWNwaV9nYmxfRkFEVC5kYXlfYWxhcm0pIHsKKwkJLyogQUNQSSBzcGVjOiBvbmx5IGxvdyA2IGl0cyBzaG91bGQgYmUgY2FyZWQgKi8KKwkJZGF5ID0gQ01PU19SRUFEKGFjcGlfZ2JsX0ZBRFQuZGF5X2FsYXJtKSAmIDB4M0Y7CisJCWlmICghKHJ0Y19jb250cm9sICYgUlRDX0RNX0JJTkFSWSkgfHwgUlRDX0FMV0FZU19CQ0QpCisJCQlkYXkgPSBiY2QyYmluKGRheSk7CisJfSBlbHNlCisJCWRheSA9IGNtb3NfYmNkX3JlYWQoUlRDX0RBWV9PRl9NT05USCwgcnRjX2NvbnRyb2wpOworCWlmIChhY3BpX2dibF9GQURULm1vbnRoX2FsYXJtKQorCQltbyA9IGNtb3NfYmNkX3JlYWQoYWNwaV9nYmxfRkFEVC5tb250aF9hbGFybSwgcnRjX2NvbnRyb2wpOworCWVsc2UgeworCQltbyA9IGNtb3NfYmNkX3JlYWQoUlRDX01PTlRILCBydGNfY29udHJvbCk7CisJCXRvZGF5ID0gY21vc19iY2RfcmVhZChSVENfREFZX09GX01PTlRILCBydGNfY29udHJvbCk7CisJfQorCWlmIChhY3BpX2dibF9GQURULmNlbnR1cnkpCisJCWNlbnQgPSBjbW9zX2JjZF9yZWFkKGFjcGlfZ2JsX0ZBRFQuY2VudHVyeSwgcnRjX2NvbnRyb2wpOworCisJeXIgPSBjbW9zX2JjZF9yZWFkKFJUQ19ZRUFSLCBydGNfY29udHJvbCk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZydGNfbG9jaywgZmxhZ3MpOworCisJLyogd2UncmUgdHJ1c3RpbmcgdGhlIEZBRFQgKHNlZSBhYm92ZSkgKi8KKwlpZiAoIWFjcGlfZ2JsX0ZBRFQuY2VudHVyeSkKKwkJLyogSWYgd2UncmUgbm90IHRydXN0aW5nIHRoZSBGQURULCB3ZSBzaG91bGQgYXQgbGVhc3QgbWFrZSBpdAorCQkgKiByaWdodCBmb3IgX3RoaXNfIGNlbnR1cnkuLi4gZWhtLCB3aGF0IGlzIF90aGlzXyBjZW50dXJ5PworCQkgKgorCQkgKiBUQkQ6CisJCSAqICBBU0FQOiBmaW5kIHBpZWNlIG9mIGNvZGUgaW4gdGhlIGtlcm5lbCwgZS5nLiBzdGFyIHRyYWNrZXIgZHJpdmVyLAorCQkgKiAgICAgICAgd2hpY2ggd2UgY2FuIHRydXN0IHRvIGRldGVybWluZSB0aGUgY2VudHVyeSBjb3JyZWN0bHkuIEF0b20KKwkJICogICAgICAgIHdhdGNoIGRyaXZlciB3b3VsZCBiZSBuaWNlLCB0b28uLi4KKwkJICoKKwkJICogIGlmIHRoYXQgaGFzIG5vdCBoYXBwZW5lZCwgY2hhbmdlIGZvciBmaXJzdCByZWxlYXNlIGluIDIwNTA6CisJCSAqICAgICAgICBpZiAoeXI8NTApCisJCSAqICAgICAgICAgICAgICAgIHlyICs9IDIxMDA7CisJCSAqICAgICAgICBlbHNlCisJCSAqICAgICAgICAgICAgICAgIHlyICs9IDIwMDA7ICAgLy8gY3VycmVudCBsaW5lIG9mIGNvZGUKKwkJICoKKwkJICogIGlmIHRoYXQgaGFzIG5vdCBoYXBwZW5lZCBlaXRoZXIsIHBsZWFzZSBkbyBvbiAyMDk5LzEyLzMxOjIzOjU5OjU5CisJCSAqICAgICAgICBzLzIwMDAvMjEwMAorCQkgKgorCQkgKi8KKwkJeXIgKz0gMjAwMDsKKwllbHNlCisJCXlyICs9IGNlbnQgKiAxMDA7CisKKwkvKgorCSAqIFNob3cgY29ycmVjdCBkYXRlcyBmb3IgYWxhcm1zIHVwIHRvIGEgbW9udGggaW50byB0aGUgZnV0dXJlLgorCSAqIFRoaXMgc29sdmVzIGlzc3VlcyBmb3IgbmVhcmx5IGFsbCBzaXR1YXRpb25zIHdpdGggdGhlIGNvbW1vbgorCSAqIDMwLWRheSBhbGFybSBjbG9ja3MgaW4gUEMgaGFyZHdhcmUuCisJICovCisJaWYgKGRheSA8IHRvZGF5KSB7CisJCWlmIChtbyA8IDEyKSB7CisJCQltbyArPSAxOworCQl9IGVsc2UgeworCQkJbW8gPSAxOworCQkJeXIgKz0gMTsKKwkJfQorCX0KKworCXNlcV9wcmludGYoc2VxLCAiJTQuNHUtIiwgeXIpOworCShtbyA+IDEyKSA/IHNlcV9wdXRzKHNlcSwgIioqLSIpIDogc2VxX3ByaW50ZihzZXEsICIlMi4ydS0iLCBtbyk7CisJKGRheSA+IDMxKSA/IHNlcV9wdXRzKHNlcSwgIioqICIpIDogc2VxX3ByaW50ZihzZXEsICIlMi4ydSAiLCBkYXkpOworCShociA+IDIzKSA/IHNlcV9wdXRzKHNlcSwgIioqOiIpIDogc2VxX3ByaW50ZihzZXEsICIlMi4ydToiLCBocik7CisJKG1pbiA+IDU5KSA/IHNlcV9wdXRzKHNlcSwgIioqOiIpIDogc2VxX3ByaW50ZihzZXEsICIlMi4ydToiLCBtaW4pOworCShzZWMgPiA1OSkgPyBzZXFfcHV0cyhzZXEsICIqKlxuIikgOiBzZXFfcHJpbnRmKHNlcSwgIiUyLjJ1XG4iLCBzZWMpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWNwaV9zeXN0ZW1fYWxhcm1fb3Blbl9mcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgYWNwaV9zeXN0ZW1fYWxhcm1fc2VxX3Nob3csIFBERShpbm9kZSktPmRhdGEpOworfQorCitzdGF0aWMgaW50IGdldF9kYXRlX2ZpZWxkKGNoYXIgKipwLCB1MzIgKiB2YWx1ZSkKK3sKKwljaGFyICpuZXh0ID0gTlVMTDsKKwljaGFyICpzdHJpbmdfZW5kID0gTlVMTDsKKwlpbnQgcmVzdWx0ID0gLUVJTlZBTDsKKworCS8qCisJICogVHJ5IHRvIGZpbmQgZGVsaW1ldGVyLCBvbmx5IHRvIGluc2VydCBudWxsLiAgVGhlIGVuZCBvZiB0aGUKKwkgKiBzdHJpbmcgd29uJ3QgaGF2ZSBvbmUsIGJ1dCBpcyBzdGlsbCB2YWxpZC4KKwkgKi8KKwlpZiAoKnAgPT0gTlVMTCkKKwkJcmV0dXJuIHJlc3VsdDsKKworCW5leHQgPSBzdHJwYnJrKCpwLCAiLSA6Iik7CisJaWYgKG5leHQpCisJCSpuZXh0KysgPSAnXDAnOworCisJKnZhbHVlID0gc2ltcGxlX3N0cnRvdWwoKnAsICZzdHJpbmdfZW5kLCAxMCk7CisKKwkvKiBTaWduYWwgc3VjY2VzcyBpZiB3ZSBnb3QgYSBnb29kIGRpZ2l0ICovCisJaWYgKHN0cmluZ19lbmQgIT0gKnApCisJCXJlc3VsdCA9IDA7CisKKwlpZiAobmV4dCkKKwkJKnAgPSBuZXh0OworCWVsc2UKKwkJKnAgPSBOVUxMOworCisJcmV0dXJuIHJlc3VsdDsKK30KKworLyogUmVhZCBhIHBvc3NpYmx5IEJDRCByZWdpc3RlciwgYWx3YXlzIHJldHVybiBiaW5hcnkgKi8KK3N0YXRpYyB1MzIgY21vc19iY2RfcmVhZChpbnQgb2Zmc2V0LCBpbnQgcnRjX2NvbnRyb2wpCit7CisJdTMyIHZhbCA9IENNT1NfUkVBRChvZmZzZXQpOworCWlmICghKHJ0Y19jb250cm9sICYgUlRDX0RNX0JJTkFSWSkgfHwgUlRDX0FMV0FZU19CQ0QpCisJCXZhbCA9IGJjZDJiaW4odmFsKTsKKwlyZXR1cm4gdmFsOworfQorCisvKiBXcml0ZSBiaW5hcnkgdmFsdWUgaW50byBwb3NzaWJseSBCQ0QgcmVnaXN0ZXIgKi8KK3N0YXRpYyB2b2lkIGNtb3NfYmNkX3dyaXRlKHUzMiB2YWwsIGludCBvZmZzZXQsIGludCBydGNfY29udHJvbCkKK3sKKwlpZiAoIShydGNfY29udHJvbCAmIFJUQ19ETV9CSU5BUlkpIHx8IFJUQ19BTFdBWVNfQkNEKQorCQl2YWwgPSBiaW4yYmNkKHZhbCk7CisJQ01PU19XUklURSh2YWwsIG9mZnNldCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90CithY3BpX3N5c3RlbV93cml0ZV9hbGFybShzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCWNvbnN0IGNoYXIgX191c2VyICogYnVmZmVyLCBzaXplX3QgY291bnQsIGxvZmZfdCAqIHBwb3MpCit7CisJaW50IHJlc3VsdCA9IDA7CisJY2hhciBhbGFybV9zdHJpbmdbMzBdID0geyAnXDAnIH07CisJY2hhciAqcCA9IGFsYXJtX3N0cmluZzsKKwl1MzIgc2VjLCBtaW4sIGhyLCBkYXksIG1vLCB5cjsKKwlpbnQgYWRqdXN0ID0gMDsKKwl1bnNpZ25lZCBjaGFyIHJ0Y19jb250cm9sID0gMDsKKworCWlmIChjb3VudCA+IHNpemVvZihhbGFybV9zdHJpbmcpIC0gMSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoYWxhcm1fc3RyaW5nLCBidWZmZXIsIGNvdW50KSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlhbGFybV9zdHJpbmdbY291bnRdID0gJ1wwJzsKKworCS8qIGNoZWNrIGZvciB0aW1lIGFkanVzdG1lbnQgKi8KKwlpZiAoYWxhcm1fc3RyaW5nWzBdID09ICcrJykgeworCQlwKys7CisJCWFkanVzdCA9IDE7CisJfQorCisJaWYgKChyZXN1bHQgPSBnZXRfZGF0ZV9maWVsZCgmcCwgJnlyKSkpCisJCWdvdG8gZW5kOworCWlmICgocmVzdWx0ID0gZ2V0X2RhdGVfZmllbGQoJnAsICZtbykpKQorCQlnb3RvIGVuZDsKKwlpZiAoKHJlc3VsdCA9IGdldF9kYXRlX2ZpZWxkKCZwLCAmZGF5KSkpCisJCWdvdG8gZW5kOworCWlmICgocmVzdWx0ID0gZ2V0X2RhdGVfZmllbGQoJnAsICZocikpKQorCQlnb3RvIGVuZDsKKwlpZiAoKHJlc3VsdCA9IGdldF9kYXRlX2ZpZWxkKCZwLCAmbWluKSkpCisJCWdvdG8gZW5kOworCWlmICgocmVzdWx0ID0gZ2V0X2RhdGVfZmllbGQoJnAsICZzZWMpKSkKKwkJZ290byBlbmQ7CisKKwlzcGluX2xvY2tfaXJxKCZydGNfbG9jayk7CisKKwlydGNfY29udHJvbCA9IENNT1NfUkVBRChSVENfQ09OVFJPTCk7CisKKwlpZiAoYWRqdXN0KSB7CisJCXlyICs9IGNtb3NfYmNkX3JlYWQoUlRDX1lFQVIsIHJ0Y19jb250cm9sKTsKKwkJbW8gKz0gY21vc19iY2RfcmVhZChSVENfTU9OVEgsIHJ0Y19jb250cm9sKTsKKwkJZGF5ICs9IGNtb3NfYmNkX3JlYWQoUlRDX0RBWV9PRl9NT05USCwgcnRjX2NvbnRyb2wpOworCQlociArPSBjbW9zX2JjZF9yZWFkKFJUQ19IT1VSUywgcnRjX2NvbnRyb2wpOworCQltaW4gKz0gY21vc19iY2RfcmVhZChSVENfTUlOVVRFUywgcnRjX2NvbnRyb2wpOworCQlzZWMgKz0gY21vc19iY2RfcmVhZChSVENfU0VDT05EUywgcnRjX2NvbnRyb2wpOworCX0KKworCXNwaW5fdW5sb2NrX2lycSgmcnRjX2xvY2spOworCisJaWYgKHNlYyA+IDU5KSB7CisJCW1pbiArPSBzZWMvNjA7CisJCXNlYyA9IHNlYyU2MDsKKwl9CisJaWYgKG1pbiA+IDU5KSB7CisJCWhyICs9IG1pbi82MDsKKwkJbWluID0gbWluJTYwOworCX0KKwlpZiAoaHIgPiAyMykgeworCQlkYXkgKz0gaHIvMjQ7CisJCWhyID0gaHIlMjQ7CisJfQorCWlmIChkYXkgPiAzMSkgeworCQltbyArPSBkYXkvMzI7CisJCWRheSA9IGRheSUzMjsKKwl9CisJaWYgKG1vID4gMTIpIHsKKwkJeXIgKz0gbW8vMTM7CisJCW1vID0gbW8lMTM7CisJfQorCisJc3Bpbl9sb2NrX2lycSgmcnRjX2xvY2spOworCS8qCisJICogRGlzYWJsZSBhbGFybSBpbnRlcnJ1cHQgYmVmb3JlIHNldHRpbmcgYWxhcm0gdGltZXIgb3IgZWxzZQorCSAqIHdoZW4gQUNQSV9FVkVOVF9SVEMgaXMgZW5hYmxlZCwgYSBzcHVyaW91cyBBQ1BJIGludGVycnVwdCBvY2N1cnMKKwkgKi8KKwlydGNfY29udHJvbCAmPSB+UlRDX0FJRTsKKwlDTU9TX1dSSVRFKHJ0Y19jb250cm9sLCBSVENfQ09OVFJPTCk7CisJQ01PU19SRUFEKFJUQ19JTlRSX0ZMQUdTKTsKKworCS8qIHdyaXRlIHRoZSBmaWVsZHMgdGhlIHJ0YyBrbm93cyBhYm91dCAqLworCWNtb3NfYmNkX3dyaXRlKGhyLCBSVENfSE9VUlNfQUxBUk0sIHJ0Y19jb250cm9sKTsKKwljbW9zX2JjZF93cml0ZShtaW4sIFJUQ19NSU5VVEVTX0FMQVJNLCBydGNfY29udHJvbCk7CisJY21vc19iY2Rfd3JpdGUoc2VjLCBSVENfU0VDT05EU19BTEFSTSwgcnRjX2NvbnRyb2wpOworCisJLyoKKwkgKiBJZiB0aGUgc3lzdGVtIHN1cHBvcnRzIGFuIGVuaGFuY2VkIGFsYXJtIGl0IHdpbGwgaGF2ZSBub24temVybworCSAqIG9mZnNldHMgaW50byB0aGUgQ01PUyBSQU0gaGVyZSAtLSB3aGljaCBmb3Igc29tZSByZWFzb24gYXJlIHBvaW50aW5nCisJICogdG8gdGhlIFJUQyBhcmVhIG9mIG1lbW9yeS4KKwkgKi8KKwlpZiAoYWNwaV9nYmxfRkFEVC5kYXlfYWxhcm0pCisJCWNtb3NfYmNkX3dyaXRlKGRheSwgYWNwaV9nYmxfRkFEVC5kYXlfYWxhcm0sIHJ0Y19jb250cm9sKTsKKwlpZiAoYWNwaV9nYmxfRkFEVC5tb250aF9hbGFybSkKKwkJY21vc19iY2Rfd3JpdGUobW8sIGFjcGlfZ2JsX0ZBRFQubW9udGhfYWxhcm0sIHJ0Y19jb250cm9sKTsKKwlpZiAoYWNwaV9nYmxfRkFEVC5jZW50dXJ5KSB7CisJCWlmIChhZGp1c3QpCisJCQl5ciArPSBjbW9zX2JjZF9yZWFkKGFjcGlfZ2JsX0ZBRFQuY2VudHVyeSwgcnRjX2NvbnRyb2wpICogMTAwOworCQljbW9zX2JjZF93cml0ZSh5ciAvIDEwMCwgYWNwaV9nYmxfRkFEVC5jZW50dXJ5LCBydGNfY29udHJvbCk7CisJfQorCS8qIGVuYWJsZSB0aGUgcnRjIGFsYXJtIGludGVycnVwdCAqLworCXJ0Y19jb250cm9sIHw9IFJUQ19BSUU7CisJQ01PU19XUklURShydGNfY29udHJvbCwgUlRDX0NPTlRST0wpOworCUNNT1NfUkVBRChSVENfSU5UUl9GTEFHUyk7CisKKwlzcGluX3VubG9ja19pcnEoJnJ0Y19sb2NrKTsKKworCWFjcGlfY2xlYXJfZXZlbnQoQUNQSV9FVkVOVF9SVEMpOworCWFjcGlfZW5hYmxlX2V2ZW50KEFDUElfRVZFTlRfUlRDLCAwKTsKKworCSpwcG9zICs9IGNvdW50OworCisJcmVzdWx0ID0gMDsKKyAgICAgIGVuZDoKKwlyZXR1cm4gcmVzdWx0ID8gcmVzdWx0IDogY291bnQ7Cit9CisjZW5kaWYJCQkJLyogSEFWRV9BQ1BJX0xFR0FDWV9BTEFSTSAqLworCitleHRlcm4gc3RydWN0IGxpc3RfaGVhZCBhY3BpX3dha2V1cF9kZXZpY2VfbGlzdDsKK2V4dGVybiBzcGlubG9ja190IGFjcGlfZGV2aWNlX2xvY2s7CisKK3N0YXRpYyBpbnQKK2FjcGlfc3lzdGVtX3dha2V1cF9kZXZpY2Vfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKm9mZnNldCkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpub2RlLCAqbmV4dDsKKworCXNlcV9wcmludGYoc2VxLCAiRGV2aWNlXHRTLXN0YXRlXHQgIFN0YXR1cyAgIFN5c2ZzIG5vZGVcbiIpOworCisJc3Bpbl9sb2NrKCZhY3BpX2RldmljZV9sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX3NhZmUobm9kZSwgbmV4dCwgJmFjcGlfd2FrZXVwX2RldmljZV9saXN0KSB7CisJCXN0cnVjdCBhY3BpX2RldmljZSAqZGV2ID0KKwkJICAgIGNvbnRhaW5lcl9vZihub2RlLCBzdHJ1Y3QgYWNwaV9kZXZpY2UsIHdha2V1cF9saXN0KTsKKwkJc3RydWN0IGRldmljZSAqbGRldjsKKworCQlpZiAoIWRldi0+d2FrZXVwLmZsYWdzLnZhbGlkKQorCQkJY29udGludWU7CisJCXNwaW5fdW5sb2NrKCZhY3BpX2RldmljZV9sb2NrKTsKKworCQlsZGV2ID0gYWNwaV9nZXRfcGh5c2ljYWxfZGV2aWNlKGRldi0+aGFuZGxlKTsKKwkJc2VxX3ByaW50ZihzZXEsICIlc1x0ICBTJWRcdCVjJS04cyAgIiwKKwkJCSAgIGRldi0+cG5wLmJ1c19pZCwKKwkJCSAgICh1MzIpIGRldi0+d2FrZXVwLnNsZWVwX3N0YXRlLAorCQkJICAgZGV2LT53YWtldXAuZmxhZ3MucnVuX3dha2UgPyAnKicgOiAnICcsCisJCQkgICBkZXYtPndha2V1cC5zdGF0ZS5lbmFibGVkID8gImVuYWJsZWQiIDogImRpc2FibGVkIik7CisJCWlmIChsZGV2KQorCQkJc2VxX3ByaW50ZihzZXEsICIlczolcyIsCisJCQkJICAgbGRldi0+YnVzID8gbGRldi0+YnVzLT5uYW1lIDogIm5vLWJ1cyIsCisJCQkJICAgZGV2X25hbWUobGRldikpOworCQlzZXFfcHJpbnRmKHNlcSwgIlxuIik7CisJCXB1dF9kZXZpY2UobGRldik7CisKKwkJc3Bpbl9sb2NrKCZhY3BpX2RldmljZV9sb2NrKTsKKwl9CisJc3Bpbl91bmxvY2soJmFjcGlfZGV2aWNlX2xvY2spOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBwaHlzaWNhbF9kZXZpY2VfZW5hYmxlX3dha2V1cChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmFkZXYpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gYWNwaV9nZXRfcGh5c2ljYWxfZGV2aWNlKGFkZXYtPmhhbmRsZSk7CisKKwlpZiAoZGV2ICYmIGRldmljZV9jYW5fd2FrZXVwKGRldikpCisJCWRldmljZV9zZXRfd2FrZXVwX2VuYWJsZShkZXYsIGFkZXYtPndha2V1cC5zdGF0ZS5lbmFibGVkKTsKK30KKworc3RhdGljIHNzaXplX3QKK2FjcGlfc3lzdGVtX3dyaXRlX3dha2V1cF9kZXZpY2Uoc3RydWN0IGZpbGUgKmZpbGUsCisJCQkJY29uc3QgY2hhciBfX3VzZXIgKiBidWZmZXIsCisJCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKiBwcG9zKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKm5vZGUsICpuZXh0OworCWNoYXIgc3RyYnVmWzVdOworCWNoYXIgc3RyWzVdID0gIiI7CisJaW50IGxlbiA9IGNvdW50OworCXN0cnVjdCBhY3BpX2RldmljZSAqZm91bmRfZGV2ID0gTlVMTDsKKworCWlmIChsZW4gPiA0KQorCQlsZW4gPSA0OworCisJaWYgKGNvcHlfZnJvbV91c2VyKHN0cmJ1ZiwgYnVmZmVyLCBsZW4pKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlzdHJidWZbbGVuXSA9ICdcMCc7CisJc3NjYW5mKHN0cmJ1ZiwgIiVzIiwgc3RyKTsKKworCXNwaW5fbG9jaygmYWNwaV9kZXZpY2VfbG9jayk7CisJbGlzdF9mb3JfZWFjaF9zYWZlKG5vZGUsIG5leHQsICZhY3BpX3dha2V1cF9kZXZpY2VfbGlzdCkgeworCQlzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldiA9CisJCSAgICBjb250YWluZXJfb2Yobm9kZSwgc3RydWN0IGFjcGlfZGV2aWNlLCB3YWtldXBfbGlzdCk7CisJCWlmICghZGV2LT53YWtldXAuZmxhZ3MudmFsaWQpCisJCQljb250aW51ZTsKKworCQlpZiAoIXN0cm5jbXAoZGV2LT5wbnAuYnVzX2lkLCBzdHIsIDQpKSB7CisJCQlkZXYtPndha2V1cC5zdGF0ZS5lbmFibGVkID0KKwkJCSAgICBkZXYtPndha2V1cC5zdGF0ZS5lbmFibGVkID8gMCA6IDE7CisJCQlmb3VuZF9kZXYgPSBkZXY7CisJCQlicmVhazsKKwkJfQorCX0KKwlpZiAoZm91bmRfZGV2KSB7CisJCXBoeXNpY2FsX2RldmljZV9lbmFibGVfd2FrZXVwKGZvdW5kX2Rldik7CisJCWxpc3RfZm9yX2VhY2hfc2FmZShub2RlLCBuZXh0LCAmYWNwaV93YWtldXBfZGV2aWNlX2xpc3QpIHsKKwkJCXN0cnVjdCBhY3BpX2RldmljZSAqZGV2ID0gY29udGFpbmVyX29mKG5vZGUsCisJCQkJCQkJICAgICAgIHN0cnVjdAorCQkJCQkJCSAgICAgICBhY3BpX2RldmljZSwKKwkJCQkJCQkgICAgICAgd2FrZXVwX2xpc3QpOworCisJCQlpZiAoKGRldiAhPSBmb3VuZF9kZXYpICYmCisJCQkgICAgKGRldi0+d2FrZXVwLmdwZV9udW1iZXIgPT0KKwkJCSAgICAgZm91bmRfZGV2LT53YWtldXAuZ3BlX251bWJlcikKKwkJCSAgICAmJiAoZGV2LT53YWtldXAuZ3BlX2RldmljZSA9PQorCQkJCWZvdW5kX2Rldi0+d2FrZXVwLmdwZV9kZXZpY2UpKSB7CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJCSAgICAgICAiQUNQSTogJyVzJyBhbmQgJyVzJyBoYXZlIHRoZSBzYW1lIEdQRSwgIgorCQkJCSAgICAgICAiY2FuJ3QgZGlzYWJsZS9lbmFibGUgb25lIHNlcGVyYXRlbHlcbiIsCisJCQkJICAgICAgIGRldi0+cG5wLmJ1c19pZCwgZm91bmRfZGV2LT5wbnAuYnVzX2lkKTsKKwkJCQlkZXYtPndha2V1cC5zdGF0ZS5lbmFibGVkID0KKwkJCQkgICAgZm91bmRfZGV2LT53YWtldXAuc3RhdGUuZW5hYmxlZDsKKwkJCQlwaHlzaWNhbF9kZXZpY2VfZW5hYmxlX3dha2V1cChkZXYpOworCQkJfQorCQl9CisJfQorCXNwaW5fdW5sb2NrKCZhY3BpX2RldmljZV9sb2NrKTsKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBpbnQKK2FjcGlfc3lzdGVtX3dha2V1cF9kZXZpY2Vfb3Blbl9mcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgYWNwaV9zeXN0ZW1fd2FrZXVwX2RldmljZV9zZXFfc2hvdywKKwkJCSAgIFBERShpbm9kZSktPmRhdGEpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhY3BpX3N5c3RlbV93YWtldXBfZGV2aWNlX2ZvcHMgPSB7CisJLm93bmVyID0gVEhJU19NT0RVTEUsCisJLm9wZW4gPSBhY3BpX3N5c3RlbV93YWtldXBfZGV2aWNlX29wZW5fZnMsCisJLnJlYWQgPSBzZXFfcmVhZCwKKwkud3JpdGUgPSBhY3BpX3N5c3RlbV93cml0ZV93YWtldXBfZGV2aWNlLAorCS5sbHNlZWsgPSBzZXFfbHNlZWssCisJLnJlbGVhc2UgPSBzaW5nbGVfcmVsZWFzZSwKK307CisKKyNpZmRlZglDT05GSUdfQUNQSV9QUk9DRlMKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGFjcGlfc3lzdGVtX3NsZWVwX2ZvcHMgPSB7CisJLm93bmVyID0gVEhJU19NT0RVTEUsCisJLm9wZW4gPSBhY3BpX3N5c3RlbV9zbGVlcF9vcGVuX2ZzLAorCS5yZWFkID0gc2VxX3JlYWQsCisJLndyaXRlID0gYWNwaV9zeXN0ZW1fd3JpdGVfc2xlZXAsCisJLmxsc2VlayA9IHNlcV9sc2VlaywKKwkucmVsZWFzZSA9IHNpbmdsZV9yZWxlYXNlLAorfTsKKyNlbmRpZgkJCQkvKiBDT05GSUdfQUNQSV9QUk9DRlMgKi8KKworI2lmZGVmCUhBVkVfQUNQSV9MRUdBQ1lfQUxBUk0KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGFjcGlfc3lzdGVtX2FsYXJtX2ZvcHMgPSB7CisJLm93bmVyID0gVEhJU19NT0RVTEUsCisJLm9wZW4gPSBhY3BpX3N5c3RlbV9hbGFybV9vcGVuX2ZzLAorCS5yZWFkID0gc2VxX3JlYWQsCisJLndyaXRlID0gYWNwaV9zeXN0ZW1fd3JpdGVfYWxhcm0sCisJLmxsc2VlayA9IHNlcV9sc2VlaywKKwkucmVsZWFzZSA9IHNpbmdsZV9yZWxlYXNlLAorfTsKKworc3RhdGljIHUzMiBydGNfaGFuZGxlcih2b2lkICpjb250ZXh0KQoreworCWFjcGlfY2xlYXJfZXZlbnQoQUNQSV9FVkVOVF9SVEMpOworCWFjcGlfZGlzYWJsZV9ldmVudChBQ1BJX0VWRU5UX1JUQywgMCk7CisKKwlyZXR1cm4gQUNQSV9JTlRFUlJVUFRfSEFORExFRDsKK30KKyNlbmRpZgkJCQkvKiBIQVZFX0FDUElfTEVHQUNZX0FMQVJNICovCisKK3N0YXRpYyBpbnQgX19pbml0IGFjcGlfc2xlZXBfcHJvY19pbml0KHZvaWQpCit7CisJaWYgKGFjcGlfZGlzYWJsZWQpCisJCXJldHVybiAwOworCisjaWZkZWYJQ09ORklHX0FDUElfUFJPQ0ZTCisJLyogJ3NsZWVwJyBbUi9XXSAqLworCXByb2NfY3JlYXRlKCJzbGVlcCIsIFNfSUZSRUcgfCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJICAgIGFjcGlfcm9vdF9kaXIsICZhY3BpX3N5c3RlbV9zbGVlcF9mb3BzKTsKKyNlbmRpZgkJCQkvKiBDT05GSUdfQUNQSV9QUk9DRlMgKi8KKworI2lmZGVmCUhBVkVfQUNQSV9MRUdBQ1lfQUxBUk0KKwkvKiAnYWxhcm0nIFtSL1ddICovCisJcHJvY19jcmVhdGUoImFsYXJtIiwgU19JRlJFRyB8IFNfSVJVR08gfCBTX0lXVVNSLAorCQkgICAgYWNwaV9yb290X2RpciwgJmFjcGlfc3lzdGVtX2FsYXJtX2ZvcHMpOworCisJYWNwaV9pbnN0YWxsX2ZpeGVkX2V2ZW50X2hhbmRsZXIoQUNQSV9FVkVOVF9SVEMsIHJ0Y19oYW5kbGVyLCBOVUxMKTsKKwkvKgorCSAqIERpc2FibGUgdGhlIFJUQyBldmVudCBhZnRlciBpbnN0YWxsaW5nIFJUQyBoYW5kbGVyLgorCSAqIE9ubHkgd2hlbiBSVEMgYWxhcm0gaXMgc2V0IHdpbGwgaXQgYmUgZW5hYmxlZC4KKwkgKi8KKwlhY3BpX2NsZWFyX2V2ZW50KEFDUElfRVZFTlRfUlRDKTsKKwlhY3BpX2Rpc2FibGVfZXZlbnQoQUNQSV9FVkVOVF9SVEMsIDApOworI2VuZGlmCQkJCS8qIEhBVkVfQUNQSV9MRUdBQ1lfQUxBUk0gKi8KKworCS8qICd3YWtldXAgZGV2aWNlJyBbUi9XXSAqLworCXByb2NfY3JlYXRlKCJ3YWtldXAiLCBTX0lGUkVHIHwgU19JUlVHTyB8IFNfSVdVU1IsCisJCSAgICBhY3BpX3Jvb3RfZGlyLCAmYWNwaV9zeXN0ZW1fd2FrZXVwX2RldmljZV9mb3BzKTsKKworCXJldHVybiAwOworfQorCitsYXRlX2luaXRjYWxsKGFjcGlfc2xlZXBfcHJvY19pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9yZWJvb3QuYyBiL2RyaXZlcnMvYWNwaS9yZWJvb3QuYwppbmRleCBhNmI2NjJjLi45M2Y5MTE0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvcmVib290LmMKKysrIGIvZHJpdmVycy9hY3BpL3JlYm9vdC5jCkBAIC00Miw3ICs0Miw3IEBACiAJY2FzZSBBQ1BJX0FEUl9TUEFDRV9TWVNURU1fTUVNT1JZOgogCWNhc2UgQUNQSV9BRFJfU1BBQ0VfU1lTVEVNX0lPOgogCQlwcmludGsoS0VSTl9ERUJVRyAiQUNQSSBNRU1PUlkgb3IgSS9PIFJFU0VUX1JFRy5cbiIpOwotCQlhY3BpX2h3X2xvd19sZXZlbF93cml0ZSg4LCByZXNldF92YWx1ZSwgcnIpOworCQlhY3BpX3Jlc2V0KCk7CiAJCWJyZWFrOwogCX0KIAkvKiBXYWl0IHRlbiBzZWNvbmRzICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvcmVzb3VyY2VzL01ha2VmaWxlIGIvZHJpdmVycy9hY3BpL3Jlc291cmNlcy9NYWtlZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGRlNGY2OS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL2FjcGkvcmVzb3VyY2VzL01ha2VmaWxlCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotIwotIyBNYWtlZmlsZSBmb3IgYWxsIExpbnV4IEFDUEkgaW50ZXJwcmV0ZXIgc3ViZGlyZWN0b3JpZXMKLSMKLQotb2JqLXkgOj0gcnNhZGRyLm8gcnNjcmVhdGUubyByc2luZm8ubyByc2lvLm8gcnNsaXN0Lm8gcnNtaXNjLm8gcnN4ZmFjZS5vIFwKLQkgcnNjYWxjLm8gIHJzaXJxLm8gIHJzbWVtb3J5Lm8gIHJzdXRpbHMubwotCi1vYmotJChBQ1BJX0ZVVFVSRV9VU0FHRSkgKz0gcnNkdW1wLm8KLQotRVhUUkFfQ0ZMQUdTICs9ICQoQUNQSV9DRkxBR1MpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvcmVzb3VyY2VzL3JzYWRkci5jIGIvZHJpdmVycy9hY3BpL3Jlc291cmNlcy9yc2FkZHIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Y5NjMzMi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL2FjcGkvcmVzb3VyY2VzL3JzYWRkci5jCisrKyAvZGV2L251bGwKQEAgLTEsMzgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogTW9kdWxlIE5hbWU6IHJzYWRkciAtIEFkZHJlc3MgcmVzb3VyY2UgZGVzY3JpcHRvcnMgKDE2LzMyLzY0KQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA4LCBJbnRlbCBDb3JwLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAotICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgYXQgbWluaW11bSBhIGRpc2NsYWltZXIKLSAqICAgIHN1YnN0YW50aWFsbHkgc2ltaWxhciB0byB0aGUgIk5PIFdBUlJBTlRZIiBkaXNjbGFpbWVyIGJlbG93Ci0gKiAgICAoIkRpc2NsYWltZXIiKSBhbmQgYW55IHJlZGlzdHJpYnV0aW9uIG11c3QgYmUgY29uZGl0aW9uZWQgdXBvbgotICogICAgaW5jbHVkaW5nIGEgc3Vic3RhbnRpYWxseSBzaW1pbGFyIERpc2NsYWltZXIgcmVxdWlyZW1lbnQgZm9yIGZ1cnRoZXIKLSAqICAgIGJpbmFyeSByZWRpc3RyaWJ1dGlvbi4KLSAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcwotICogICAgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICogU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBOTyBXQVJSQU5UWQotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCi0gKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUwotICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcKLSAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQotICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgotICovCi0KLSNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KLSNpbmNsdWRlIDxhY3BpL2FjcmVzcmMuaD4KLQotI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfUkVTT1VSQ0VTCi1BQ1BJX01PRFVMRV9OQU1FKCJyc2FkZHIiKQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIGFjcGlfcnNfY29udmVydF9hZGRyZXNzMTYgLSBBbGwgV09SRCAoMTYtYml0KSBhZGRyZXNzIHJlc291cmNlcwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdHJ1Y3QgYWNwaV9yc2NvbnZlcnRfaW5mbyBhY3BpX3JzX2NvbnZlcnRfYWRkcmVzczE2WzVdID0gewotCXtBQ1BJX1JTQ19JTklUR0VULCBBQ1BJX1JFU09VUkNFX1RZUEVfQUREUkVTUzE2LAotCSBBQ1BJX1JTX1NJWkUoc3RydWN0IGFjcGlfcmVzb3VyY2VfYWRkcmVzczE2KSwKLQkgQUNQSV9SU0NfVEFCTEVfU0laRShhY3BpX3JzX2NvbnZlcnRfYWRkcmVzczE2KX0sCi0KLQl7QUNQSV9SU0NfSU5JVFNFVCwgQUNQSV9SRVNPVVJDRV9OQU1FX0FERFJFU1MxNiwKLQkgc2l6ZW9mKHN0cnVjdCBhbWxfcmVzb3VyY2VfYWRkcmVzczE2KSwKLQkgMH0sCi0KLQkvKiBSZXNvdXJjZSBUeXBlLCBHZW5lcmFsIEZsYWdzLCBhbmQgVHlwZS1TcGVjaWZpYyBGbGFncyAqLwotCi0Je0FDUElfUlNDX0FERFJFU1MsIDAsIDAsIDB9LAotCi0JLyoKLQkgKiBUaGVzZSBmaWVsZHMgYXJlIGNvbnRpZ3VvdXMgaW4gYm90aCB0aGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbjoKLQkgKiBBZGRyZXNzIEdyYW51bGFyaXR5Ci0JICogQWRkcmVzcyBSYW5nZSBNaW5pbXVtCi0JICogQWRkcmVzcyBSYW5nZSBNYXhpbXVtCi0JICogQWRkcmVzcyBUcmFuc2xhdGlvbiBPZmZzZXQKLQkgKiBBZGRyZXNzIExlbmd0aAotCSAqLwotCXtBQ1BJX1JTQ19NT1ZFMTYsIEFDUElfUlNfT0ZGU0VUKGRhdGEuYWRkcmVzczE2LmdyYW51bGFyaXR5KSwKLQkgQU1MX09GRlNFVChhZGRyZXNzMTYuZ3JhbnVsYXJpdHkpLAotCSA1fSwKLQotCS8qIE9wdGlvbmFsIHJlc291cmNlX3NvdXJjZSAoSW5kZXggYW5kIFN0cmluZykgKi8KLQotCXtBQ1BJX1JTQ19TT1VSQ0UsIEFDUElfUlNfT0ZGU0VUKGRhdGEuYWRkcmVzczE2LnJlc291cmNlX3NvdXJjZSksCi0JIDAsCi0JIHNpemVvZihzdHJ1Y3QgYW1sX3Jlc291cmNlX2FkZHJlc3MxNil9Ci19OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIGFjcGlfcnNfY29udmVydF9hZGRyZXNzMzIgLSBBbGwgRFdPUkQgKDMyLWJpdCkgYWRkcmVzcyByZXNvdXJjZXMKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdHJ1Y3QgYWNwaV9yc2NvbnZlcnRfaW5mbyBhY3BpX3JzX2NvbnZlcnRfYWRkcmVzczMyWzVdID0gewotCXtBQ1BJX1JTQ19JTklUR0VULCBBQ1BJX1JFU09VUkNFX1RZUEVfQUREUkVTUzMyLAotCSBBQ1BJX1JTX1NJWkUoc3RydWN0IGFjcGlfcmVzb3VyY2VfYWRkcmVzczMyKSwKLQkgQUNQSV9SU0NfVEFCTEVfU0laRShhY3BpX3JzX2NvbnZlcnRfYWRkcmVzczMyKX0sCi0KLQl7QUNQSV9SU0NfSU5JVFNFVCwgQUNQSV9SRVNPVVJDRV9OQU1FX0FERFJFU1MzMiwKLQkgc2l6ZW9mKHN0cnVjdCBhbWxfcmVzb3VyY2VfYWRkcmVzczMyKSwKLQkgMH0sCi0KLQkvKiBSZXNvdXJjZSBUeXBlLCBHZW5lcmFsIEZsYWdzLCBhbmQgVHlwZS1TcGVjaWZpYyBGbGFncyAqLwotCi0Je0FDUElfUlNDX0FERFJFU1MsIDAsIDAsIDB9LAotCi0JLyoKLQkgKiBUaGVzZSBmaWVsZHMgYXJlIGNvbnRpZ3VvdXMgaW4gYm90aCB0aGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbjoKLQkgKiBBZGRyZXNzIEdyYW51bGFyaXR5Ci0JICogQWRkcmVzcyBSYW5nZSBNaW5pbXVtCi0JICogQWRkcmVzcyBSYW5nZSBNYXhpbXVtCi0JICogQWRkcmVzcyBUcmFuc2xhdGlvbiBPZmZzZXQKLQkgKiBBZGRyZXNzIExlbmd0aAotCSAqLwotCXtBQ1BJX1JTQ19NT1ZFMzIsIEFDUElfUlNfT0ZGU0VUKGRhdGEuYWRkcmVzczMyLmdyYW51bGFyaXR5KSwKLQkgQU1MX09GRlNFVChhZGRyZXNzMzIuZ3JhbnVsYXJpdHkpLAotCSA1fSwKLQotCS8qIE9wdGlvbmFsIHJlc291cmNlX3NvdXJjZSAoSW5kZXggYW5kIFN0cmluZykgKi8KLQotCXtBQ1BJX1JTQ19TT1VSQ0UsIEFDUElfUlNfT0ZGU0VUKGRhdGEuYWRkcmVzczMyLnJlc291cmNlX3NvdXJjZSksCi0JIDAsCi0JIHNpemVvZihzdHJ1Y3QgYW1sX3Jlc291cmNlX2FkZHJlc3MzMil9Ci19OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIGFjcGlfcnNfY29udmVydF9hZGRyZXNzNjQgLSBBbGwgUVdPUkQgKDY0LWJpdCkgYWRkcmVzcyByZXNvdXJjZXMKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdHJ1Y3QgYWNwaV9yc2NvbnZlcnRfaW5mbyBhY3BpX3JzX2NvbnZlcnRfYWRkcmVzczY0WzVdID0gewotCXtBQ1BJX1JTQ19JTklUR0VULCBBQ1BJX1JFU09VUkNFX1RZUEVfQUREUkVTUzY0LAotCSBBQ1BJX1JTX1NJWkUoc3RydWN0IGFjcGlfcmVzb3VyY2VfYWRkcmVzczY0KSwKLQkgQUNQSV9SU0NfVEFCTEVfU0laRShhY3BpX3JzX2NvbnZlcnRfYWRkcmVzczY0KX0sCi0KLQl7QUNQSV9SU0NfSU5JVFNFVCwgQUNQSV9SRVNPVVJDRV9OQU1FX0FERFJFU1M2NCwKLQkgc2l6ZW9mKHN0cnVjdCBhbWxfcmVzb3VyY2VfYWRkcmVzczY0KSwKLQkgMH0sCi0KLQkvKiBSZXNvdXJjZSBUeXBlLCBHZW5lcmFsIEZsYWdzLCBhbmQgVHlwZS1TcGVjaWZpYyBGbGFncyAqLwotCi0Je0FDUElfUlNDX0FERFJFU1MsIDAsIDAsIDB9LAotCi0JLyoKLQkgKiBUaGVzZSBmaWVsZHMgYXJlIGNvbnRpZ3VvdXMgaW4gYm90aCB0aGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbjoKLQkgKiBBZGRyZXNzIEdyYW51bGFyaXR5Ci0JICogQWRkcmVzcyBSYW5nZSBNaW5pbXVtCi0JICogQWRkcmVzcyBSYW5nZSBNYXhpbXVtCi0JICogQWRkcmVzcyBUcmFuc2xhdGlvbiBPZmZzZXQKLQkgKiBBZGRyZXNzIExlbmd0aAotCSAqLwotCXtBQ1BJX1JTQ19NT1ZFNjQsIEFDUElfUlNfT0ZGU0VUKGRhdGEuYWRkcmVzczY0LmdyYW51bGFyaXR5KSwKLQkgQU1MX09GRlNFVChhZGRyZXNzNjQuZ3JhbnVsYXJpdHkpLAotCSA1fSwKLQotCS8qIE9wdGlvbmFsIHJlc291cmNlX3NvdXJjZSAoSW5kZXggYW5kIFN0cmluZykgKi8KLQotCXtBQ1BJX1JTQ19TT1VSQ0UsIEFDUElfUlNfT0ZGU0VUKGRhdGEuYWRkcmVzczY0LnJlc291cmNlX3NvdXJjZSksCi0JIDAsCi0JIHNpemVvZihzdHJ1Y3QgYW1sX3Jlc291cmNlX2FkZHJlc3M2NCl9Ci19OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIGFjcGlfcnNfY29udmVydF9leHRfYWRkcmVzczY0IC0gQWxsIEV4dGVuZGVkICg2NC1iaXQpIGFkZHJlc3MgcmVzb3VyY2VzCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RydWN0IGFjcGlfcnNjb252ZXJ0X2luZm8gYWNwaV9yc19jb252ZXJ0X2V4dF9hZGRyZXNzNjRbNV0gPSB7Ci0Je0FDUElfUlNDX0lOSVRHRVQsIEFDUElfUkVTT1VSQ0VfVFlQRV9FWFRFTkRFRF9BRERSRVNTNjQsCi0JIEFDUElfUlNfU0laRShzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9leHRlbmRlZF9hZGRyZXNzNjQpLAotCSBBQ1BJX1JTQ19UQUJMRV9TSVpFKGFjcGlfcnNfY29udmVydF9leHRfYWRkcmVzczY0KX0sCi0KLQl7QUNQSV9SU0NfSU5JVFNFVCwgQUNQSV9SRVNPVVJDRV9OQU1FX0VYVEVOREVEX0FERFJFU1M2NCwKLQkgc2l6ZW9mKHN0cnVjdCBhbWxfcmVzb3VyY2VfZXh0ZW5kZWRfYWRkcmVzczY0KSwKLQkgMH0sCi0KLQkvKiBSZXNvdXJjZSBUeXBlLCBHZW5lcmFsIEZsYWdzLCBhbmQgVHlwZS1TcGVjaWZpYyBGbGFncyAqLwotCi0Je0FDUElfUlNDX0FERFJFU1MsIDAsIDAsIDB9LAotCi0JLyogUmV2aXNpb24gSUQgKi8KLQotCXtBQ1BJX1JTQ19NT1ZFOCwgQUNQSV9SU19PRkZTRVQoZGF0YS5leHRfYWRkcmVzczY0LnJldmlzaW9uX2lEKSwKLQkgQU1MX09GRlNFVChleHRfYWRkcmVzczY0LnJldmlzaW9uX2lEKSwKLQkgMX0sCi0JLyoKLQkgKiBUaGVzZSBmaWVsZHMgYXJlIGNvbnRpZ3VvdXMgaW4gYm90aCB0aGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbjoKLQkgKiBBZGRyZXNzIEdyYW51bGFyaXR5Ci0JICogQWRkcmVzcyBSYW5nZSBNaW5pbXVtCi0JICogQWRkcmVzcyBSYW5nZSBNYXhpbXVtCi0JICogQWRkcmVzcyBUcmFuc2xhdGlvbiBPZmZzZXQKLQkgKiBBZGRyZXNzIExlbmd0aAotCSAqIFR5cGUtU3BlY2lmaWMgQXR0cmlidXRlCi0JICovCi0Je0FDUElfUlNDX01PVkU2NCwgQUNQSV9SU19PRkZTRVQoZGF0YS5leHRfYWRkcmVzczY0LmdyYW51bGFyaXR5KSwKLQkgQU1MX09GRlNFVChleHRfYWRkcmVzczY0LmdyYW51bGFyaXR5KSwKLQkgNn0KLX07Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogYWNwaV9yc19jb252ZXJ0X2dlbmVyYWxfZmxhZ3MgLSBGbGFncyBjb21tb24gdG8gYWxsIGFkZHJlc3MgZGVzY3JpcHRvcnMKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgc3RydWN0IGFjcGlfcnNjb252ZXJ0X2luZm8gYWNwaV9yc19jb252ZXJ0X2dlbmVyYWxfZmxhZ3NbNl0gPSB7Ci0Je0FDUElfUlNDX0ZMQUdJTklULCAwLCBBTUxfT0ZGU0VUKGFkZHJlc3MuZmxhZ3MpLAotCSBBQ1BJX1JTQ19UQUJMRV9TSVpFKGFjcGlfcnNfY29udmVydF9nZW5lcmFsX2ZsYWdzKX0sCi0KLQkvKiBSZXNvdXJjZSBUeXBlIChNZW1vcnksIElvLCBidXNfbnVtYmVyLCBldGMuKSAqLwotCi0Je0FDUElfUlNDX01PVkU4LCBBQ1BJX1JTX09GRlNFVChkYXRhLmFkZHJlc3MucmVzb3VyY2VfdHlwZSksCi0JIEFNTF9PRkZTRVQoYWRkcmVzcy5yZXNvdXJjZV90eXBlKSwKLQkgMX0sCi0KLQkvKiBHZW5lcmFsIEZsYWdzIC0gQ29uc3VtZSwgRGVjb2RlLCBtaW5fZml4ZWQsIG1heF9maXhlZCAqLwotCi0Je0FDUElfUlNDXzFCSVRGTEFHLCBBQ1BJX1JTX09GRlNFVChkYXRhLmFkZHJlc3MucHJvZHVjZXJfY29uc3VtZXIpLAotCSBBTUxfT0ZGU0VUKGFkZHJlc3MuZmxhZ3MpLAotCSAwfSwKLQotCXtBQ1BJX1JTQ18xQklURkxBRywgQUNQSV9SU19PRkZTRVQoZGF0YS5hZGRyZXNzLmRlY29kZSksCi0JIEFNTF9PRkZTRVQoYWRkcmVzcy5mbGFncyksCi0JIDF9LAotCi0Je0FDUElfUlNDXzFCSVRGTEFHLCBBQ1BJX1JTX09GRlNFVChkYXRhLmFkZHJlc3MubWluX2FkZHJlc3NfZml4ZWQpLAotCSBBTUxfT0ZGU0VUKGFkZHJlc3MuZmxhZ3MpLAotCSAyfSwKLQotCXtBQ1BJX1JTQ18xQklURkxBRywgQUNQSV9SU19PRkZTRVQoZGF0YS5hZGRyZXNzLm1heF9hZGRyZXNzX2ZpeGVkKSwKLQkgQU1MX09GRlNFVChhZGRyZXNzLmZsYWdzKSwKLQkgM30KLX07Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogYWNwaV9yc19jb252ZXJ0X21lbV9mbGFncyAtIEZsYWdzIGNvbW1vbiB0byBNZW1vcnkgYWRkcmVzcyBkZXNjcmlwdG9ycwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyBzdHJ1Y3QgYWNwaV9yc2NvbnZlcnRfaW5mbyBhY3BpX3JzX2NvbnZlcnRfbWVtX2ZsYWdzWzVdID0gewotCXtBQ1BJX1JTQ19GTEFHSU5JVCwgMCwgQU1MX09GRlNFVChhZGRyZXNzLnNwZWNpZmljX2ZsYWdzKSwKLQkgQUNQSV9SU0NfVEFCTEVfU0laRShhY3BpX3JzX2NvbnZlcnRfbWVtX2ZsYWdzKX0sCi0KLQkvKiBNZW1vcnktc3BlY2lmaWMgZmxhZ3MgKi8KLQotCXtBQ1BJX1JTQ18xQklURkxBRywgQUNQSV9SU19PRkZTRVQoZGF0YS5hZGRyZXNzLmluZm8ubWVtLndyaXRlX3Byb3RlY3QpLAotCSBBTUxfT0ZGU0VUKGFkZHJlc3Muc3BlY2lmaWNfZmxhZ3MpLAotCSAwfSwKLQotCXtBQ1BJX1JTQ18yQklURkxBRywgQUNQSV9SU19PRkZTRVQoZGF0YS5hZGRyZXNzLmluZm8ubWVtLmNhY2hpbmcpLAotCSBBTUxfT0ZGU0VUKGFkZHJlc3Muc3BlY2lmaWNfZmxhZ3MpLAotCSAxfSwKLQotCXtBQ1BJX1JTQ18yQklURkxBRywgQUNQSV9SU19PRkZTRVQoZGF0YS5hZGRyZXNzLmluZm8ubWVtLnJhbmdlX3R5cGUpLAotCSBBTUxfT0ZGU0VUKGFkZHJlc3Muc3BlY2lmaWNfZmxhZ3MpLAotCSAzfSwKLQotCXtBQ1BJX1JTQ18xQklURkxBRywgQUNQSV9SU19PRkZTRVQoZGF0YS5hZGRyZXNzLmluZm8ubWVtLnRyYW5zbGF0aW9uKSwKLQkgQU1MX09GRlNFVChhZGRyZXNzLnNwZWNpZmljX2ZsYWdzKSwKLQkgNX0KLX07Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogYWNwaV9yc19jb252ZXJ0X2lvX2ZsYWdzIC0gRmxhZ3MgY29tbW9uIHRvIEkvTyBhZGRyZXNzIGRlc2NyaXB0b3JzCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIHN0cnVjdCBhY3BpX3JzY29udmVydF9pbmZvIGFjcGlfcnNfY29udmVydF9pb19mbGFnc1s0XSA9IHsKLQl7QUNQSV9SU0NfRkxBR0lOSVQsIDAsIEFNTF9PRkZTRVQoYWRkcmVzcy5zcGVjaWZpY19mbGFncyksCi0JIEFDUElfUlNDX1RBQkxFX1NJWkUoYWNwaV9yc19jb252ZXJ0X2lvX2ZsYWdzKX0sCi0KLQkvKiBJL08tc3BlY2lmaWMgZmxhZ3MgKi8KLQotCXtBQ1BJX1JTQ18yQklURkxBRywgQUNQSV9SU19PRkZTRVQoZGF0YS5hZGRyZXNzLmluZm8uaW8ucmFuZ2VfdHlwZSksCi0JIEFNTF9PRkZTRVQoYWRkcmVzcy5zcGVjaWZpY19mbGFncyksCi0JIDB9LAotCi0Je0FDUElfUlNDXzFCSVRGTEFHLCBBQ1BJX1JTX09GRlNFVChkYXRhLmFkZHJlc3MuaW5mby5pby50cmFuc2xhdGlvbiksCi0JIEFNTF9PRkZTRVQoYWRkcmVzcy5zcGVjaWZpY19mbGFncyksCi0JIDR9LAotCi0Je0FDUElfUlNDXzFCSVRGTEFHLAotCSBBQ1BJX1JTX09GRlNFVChkYXRhLmFkZHJlc3MuaW5mby5pby50cmFuc2xhdGlvbl90eXBlKSwKLQkgQU1MX09GRlNFVChhZGRyZXNzLnNwZWNpZmljX2ZsYWdzKSwKLQkgNX0KLX07Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfcnNfZ2V0X2FkZHJlc3NfY29tbW9uCi0gKgotICogUEFSQU1FVEVSUzogIFJlc291cmNlICAgICAgICAgICAgLSBQb2ludGVyIHRvIHRoZSBpbnRlcm5hbCByZXNvdXJjZSBzdHJ1Y3QKLSAqICAgICAgICAgICAgICBBbWwgICAgICAgICAgICAgICAgIC0gUG9pbnRlciB0byB0aGUgQU1MIHJlc291cmNlIGRlc2NyaXB0b3IKLSAqCi0gKiBSRVRVUk46ICAgICAgVFJVRSBpZiB0aGUgcmVzb3VyY2VfdHlwZSBmaWVsZCBpcyBPSywgRkFMU0Ugb3RoZXJ3aXNlCi0gKgotICogREVTQ1JJUFRJT046IENvbnZlcnQgY29tbW9uIGZsYWcgZmllbGRzIGZyb20gYSByYXcgQU1MIHJlc291cmNlIGRlc2NyaXB0b3IKLSAqICAgICAgICAgICAgICB0byBhbiBpbnRlcm5hbCByZXNvdXJjZSBkZXNjcmlwdG9yCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdTgKLWFjcGlfcnNfZ2V0X2FkZHJlc3NfY29tbW9uKHN0cnVjdCBhY3BpX3Jlc291cmNlICpyZXNvdXJjZSwKLQkJCSAgIHVuaW9uIGFtbF9yZXNvdXJjZSAqYW1sKQotewotCUFDUElfRlVOQ1RJT05fRU5UUlkoKTsKLQotCS8qIFZhbGlkYXRlIHRoZSBSZXNvdXJjZSBUeXBlICovCi0KLQlpZiAoKGFtbC0+YWRkcmVzcy5yZXNvdXJjZV90eXBlID4gMikKLQkgICAgJiYgKGFtbC0+YWRkcmVzcy5yZXNvdXJjZV90eXBlIDwgMHhDMCkpIHsKLQkJcmV0dXJuIChGQUxTRSk7Ci0JfQotCi0JLyogR2V0IHRoZSBSZXNvdXJjZSBUeXBlIGFuZCBHZW5lcmFsIEZsYWdzICovCi0KLQkodm9pZClhY3BpX3JzX2NvbnZlcnRfYW1sX3RvX3Jlc291cmNlKHJlc291cmNlLCBhbWwsCi0JCQkJCSAgICAgIGFjcGlfcnNfY29udmVydF9nZW5lcmFsX2ZsYWdzKTsKLQotCS8qIEdldCB0aGUgVHlwZS1TcGVjaWZpYyBGbGFncyAoTWVtb3J5IGFuZCBJL08gZGVzY3JpcHRvcnMgb25seSkgKi8KLQotCWlmIChyZXNvdXJjZS0+ZGF0YS5hZGRyZXNzLnJlc291cmNlX3R5cGUgPT0gQUNQSV9NRU1PUllfUkFOR0UpIHsKLQkJKHZvaWQpYWNwaV9yc19jb252ZXJ0X2FtbF90b19yZXNvdXJjZShyZXNvdXJjZSwgYW1sLAotCQkJCQkJICAgICAgYWNwaV9yc19jb252ZXJ0X21lbV9mbGFncyk7Ci0JfSBlbHNlIGlmIChyZXNvdXJjZS0+ZGF0YS5hZGRyZXNzLnJlc291cmNlX3R5cGUgPT0gQUNQSV9JT19SQU5HRSkgewotCQkodm9pZClhY3BpX3JzX2NvbnZlcnRfYW1sX3RvX3Jlc291cmNlKHJlc291cmNlLCBhbWwsCi0JCQkJCQkgICAgICBhY3BpX3JzX2NvbnZlcnRfaW9fZmxhZ3MpOwotCX0gZWxzZSB7Ci0JCS8qIEdlbmVyaWMgcmVzb3VyY2UgdHlwZSwganVzdCBncmFiIHRoZSB0eXBlX3NwZWNpZmljIGJ5dGUgKi8KLQotCQlyZXNvdXJjZS0+ZGF0YS5hZGRyZXNzLmluZm8udHlwZV9zcGVjaWZpYyA9Ci0JCSAgICBhbWwtPmFkZHJlc3Muc3BlY2lmaWNfZmxhZ3M7Ci0JfQotCi0JcmV0dXJuIChUUlVFKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9yc19zZXRfYWRkcmVzc19jb21tb24KLSAqCi0gKiBQQVJBTUVURVJTOiAgQW1sICAgICAgICAgICAgICAgICAtIFBvaW50ZXIgdG8gdGhlIEFNTCByZXNvdXJjZSBkZXNjcmlwdG9yCi0gKiAgICAgICAgICAgICAgUmVzb3VyY2UgICAgICAgICAgICAtIFBvaW50ZXIgdG8gdGhlIGludGVybmFsIHJlc291cmNlIHN0cnVjdAotICoKLSAqIFJFVFVSTjogICAgICBOb25lCi0gKgotICogREVTQ1JJUFRJT046IENvbnZlcnQgY29tbW9uIGZsYWcgZmllbGRzIGZyb20gYSByZXNvdXJjZSBkZXNjcmlwdG9yIHRvIGFuCi0gKiAgICAgICAgICAgICAgQU1MIGRlc2NyaXB0b3IKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi12b2lkCi1hY3BpX3JzX3NldF9hZGRyZXNzX2NvbW1vbih1bmlvbiBhbWxfcmVzb3VyY2UgKmFtbCwKLQkJCSAgIHN0cnVjdCBhY3BpX3Jlc291cmNlICpyZXNvdXJjZSkKLXsKLQlBQ1BJX0ZVTkNUSU9OX0VOVFJZKCk7Ci0KLQkvKiBTZXQgdGhlIFJlc291cmNlIFR5cGUgYW5kIEdlbmVyYWwgRmxhZ3MgKi8KLQotCSh2b2lkKWFjcGlfcnNfY29udmVydF9yZXNvdXJjZV90b19hbWwocmVzb3VyY2UsIGFtbCwKLQkJCQkJICAgICAgYWNwaV9yc19jb252ZXJ0X2dlbmVyYWxfZmxhZ3MpOwotCi0JLyogU2V0IHRoZSBUeXBlLVNwZWNpZmljIEZsYWdzIChNZW1vcnkgYW5kIEkvTyBkZXNjcmlwdG9ycyBvbmx5KSAqLwotCi0JaWYgKHJlc291cmNlLT5kYXRhLmFkZHJlc3MucmVzb3VyY2VfdHlwZSA9PSBBQ1BJX01FTU9SWV9SQU5HRSkgewotCQkodm9pZClhY3BpX3JzX2NvbnZlcnRfcmVzb3VyY2VfdG9fYW1sKHJlc291cmNlLCBhbWwsCi0JCQkJCQkgICAgICBhY3BpX3JzX2NvbnZlcnRfbWVtX2ZsYWdzKTsKLQl9IGVsc2UgaWYgKHJlc291cmNlLT5kYXRhLmFkZHJlc3MucmVzb3VyY2VfdHlwZSA9PSBBQ1BJX0lPX1JBTkdFKSB7Ci0JCSh2b2lkKWFjcGlfcnNfY29udmVydF9yZXNvdXJjZV90b19hbWwocmVzb3VyY2UsIGFtbCwKLQkJCQkJCSAgICAgIGFjcGlfcnNfY29udmVydF9pb19mbGFncyk7Ci0JfSBlbHNlIHsKLQkJLyogR2VuZXJpYyByZXNvdXJjZSB0eXBlLCBqdXN0IGNvcHkgdGhlIHR5cGVfc3BlY2lmaWMgYnl0ZSAqLwotCi0JCWFtbC0+YWRkcmVzcy5zcGVjaWZpY19mbGFncyA9Ci0JCSAgICByZXNvdXJjZS0+ZGF0YS5hZGRyZXNzLmluZm8udHlwZV9zcGVjaWZpYzsKLQl9Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvcmVzb3VyY2VzL3JzY2FsYy5jIGIvZHJpdmVycy9hY3BpL3Jlc291cmNlcy9yc2NhbGMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGVhYWVjZi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL2FjcGkvcmVzb3VyY2VzL3JzY2FsYy5jCisrKyAvZGV2L251bGwKQEAgLTEsNjE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogTW9kdWxlIE5hbWU6IHJzY2FsYyAtIENhbGN1bGF0ZSBzdHJlYW0gYW5kIGxpc3QgbGVuZ3RocwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA4LCBJbnRlbCBDb3JwLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAotICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgYXQgbWluaW11bSBhIGRpc2NsYWltZXIKLSAqICAgIHN1YnN0YW50aWFsbHkgc2ltaWxhciB0byB0aGUgIk5PIFdBUlJBTlRZIiBkaXNjbGFpbWVyIGJlbG93Ci0gKiAgICAoIkRpc2NsYWltZXIiKSBhbmQgYW55IHJlZGlzdHJpYnV0aW9uIG11c3QgYmUgY29uZGl0aW9uZWQgdXBvbgotICogICAgaW5jbHVkaW5nIGEgc3Vic3RhbnRpYWxseSBzaW1pbGFyIERpc2NsYWltZXIgcmVxdWlyZW1lbnQgZm9yIGZ1cnRoZXIKLSAqICAgIGJpbmFyeSByZWRpc3RyaWJ1dGlvbi4KLSAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcwotICogICAgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICogU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBOTyBXQVJSQU5UWQotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCi0gKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUwotICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcKLSAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQotICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgotICovCi0KLSNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KLSNpbmNsdWRlIDxhY3BpL2FjcmVzcmMuaD4KLSNpbmNsdWRlIDxhY3BpL2FjbmFtZXNwLmg+Ci0KLSNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX1JFU09VUkNFUwotQUNQSV9NT0RVTEVfTkFNRSgicnNjYWxjIikKLQotLyogTG9jYWwgcHJvdG90eXBlcyAqLwotc3RhdGljIHU4IGFjcGlfcnNfY291bnRfc2V0X2JpdHModTE2IGJpdF9maWVsZCk7Ci0KLXN0YXRpYyBhY3BpX3JzX2xlbmd0aAotYWNwaV9yc19zdHJ1Y3Rfb3B0aW9uX2xlbmd0aChzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9zb3VyY2UgKnJlc291cmNlX3NvdXJjZSk7Ci0KLXN0YXRpYyB1MzIKLWFjcGlfcnNfc3RyZWFtX29wdGlvbl9sZW5ndGgodTMyIHJlc291cmNlX2xlbmd0aCwgdTMyIG1pbmltdW1fdG90YWxfbGVuZ3RoKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9yc19jb3VudF9zZXRfYml0cwotICoKLSAqIFBBUkFNRVRFUlM6ICBiaXRfZmllbGQgICAgICAgLSBGaWVsZCBpbiB3aGljaCB0byBjb3VudCBiaXRzCi0gKgotICogUkVUVVJOOiAgICAgIE51bWJlciBvZiBiaXRzIHNldCB3aXRoaW4gdGhlIGZpZWxkCi0gKgotICogREVTQ1JJUFRJT046IENvdW50IHRoZSBudW1iZXIgb2YgYml0cyBzZXQgaW4gYSByZXNvdXJjZSBmaWVsZC4gVXNlZCBmb3IKLSAqICAgICAgICAgICAgICAoU2hvcnQgZGVzY3JpcHRvcikgaW50ZXJydXB0IGFuZCBETUEgbGlzdHMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIHU4IGFjcGlfcnNfY291bnRfc2V0X2JpdHModTE2IGJpdF9maWVsZCkKLXsKLQl1OCBiaXRzX3NldDsKLQotCUFDUElfRlVOQ1RJT05fRU5UUlkoKTsKLQotCWZvciAoYml0c19zZXQgPSAwOyBiaXRfZmllbGQ7IGJpdHNfc2V0KyspIHsKLQotCQkvKiBaZXJvIHRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXQgdGhhdCBpcyBzZXQgKi8KLQotCQliaXRfZmllbGQgJj0gKHUxNikgKGJpdF9maWVsZCAtIDEpOwotCX0KLQotCXJldHVybiBiaXRzX3NldDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9yc19zdHJ1Y3Rfb3B0aW9uX2xlbmd0aAotICoKLSAqIFBBUkFNRVRFUlM6ICByZXNvdXJjZV9zb3VyY2UgICAgIC0gUG9pbnRlciB0byBvcHRpb25hbCBkZXNjcmlwdG9yIGZpZWxkCi0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cwotICoKLSAqIERFU0NSSVBUSU9OOiBDb21tb24gY29kZSB0byBoYW5kbGUgb3B0aW9uYWwgcmVzb3VyY2Vfc291cmNlX2luZGV4IGFuZAotICogICAgICAgICAgICAgIHJlc291cmNlX3NvdXJjZSBmaWVsZHMgaW4gc29tZSBMYXJnZSBkZXNjcmlwdG9ycy4gVXNlZCBkdXJpbmcKLSAqICAgICAgICAgICAgICBsaXN0LXRvLXN0cmVhbSBjb252ZXJzaW9uCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIGFjcGlfcnNfbGVuZ3RoCi1hY3BpX3JzX3N0cnVjdF9vcHRpb25fbGVuZ3RoKHN0cnVjdCBhY3BpX3Jlc291cmNlX3NvdXJjZSAqcmVzb3VyY2Vfc291cmNlKQotewotCUFDUElfRlVOQ1RJT05fRU5UUlkoKTsKLQotCS8qCi0JICogSWYgdGhlIHJlc291cmNlX3NvdXJjZSBzdHJpbmcgaXMgdmFsaWQsIHJldHVybiB0aGUgc2l6ZSBvZiB0aGUgc3RyaW5nCi0JICogKHN0cmluZ19sZW5ndGggaW5jbHVkZXMgdGhlIE5VTEwgdGVybWluYXRvcikgcGx1cyB0aGUgc2l6ZSBvZiB0aGUKLQkgKiByZXNvdXJjZV9zb3VyY2VfaW5kZXggKDEpLgotCSAqLwotCWlmIChyZXNvdXJjZV9zb3VyY2UtPnN0cmluZ19wdHIpIHsKLQkJcmV0dXJuICgoYWNwaV9yc19sZW5ndGgpIChyZXNvdXJjZV9zb3VyY2UtPnN0cmluZ19sZW5ndGggKyAxKSk7Ci0JfQotCi0JcmV0dXJuICgwKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9yc19zdHJlYW1fb3B0aW9uX2xlbmd0aAotICoKLSAqIFBBUkFNRVRFUlM6ICByZXNvdXJjZV9sZW5ndGggICAgIC0gTGVuZ3RoIGZyb20gdGhlIHJlc291cmNlIGhlYWRlcgotICogICAgICAgICAgICAgIG1pbmltdW1fdG90YWxfbGVuZ3RoIC0gTWluaW11bSBsZW5ndGggb2YgdGhpcyByZXNvdXJjZSwgYmVmb3JlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFueSBvcHRpb25hbCBmaWVsZHMuIEluY2x1ZGVzIGhlYWRlciBzaXplCi0gKgotICogUkVUVVJOOiAgICAgIExlbmd0aCBvZiBvcHRpb25hbCBzdHJpbmcgKDAgaWYgbm8gc3RyaW5nIHByZXNlbnQpCi0gKgotICogREVTQ1JJUFRJT046IENvbW1vbiBjb2RlIHRvIGhhbmRsZSBvcHRpb25hbCByZXNvdXJjZV9zb3VyY2VfaW5kZXggYW5kCi0gKiAgICAgICAgICAgICAgcmVzb3VyY2Vfc291cmNlIGZpZWxkcyBpbiBzb21lIExhcmdlIGRlc2NyaXB0b3JzLiBVc2VkIGR1cmluZwotICogICAgICAgICAgICAgIHN0cmVhbS10by1saXN0IGNvbnZlcnNpb24KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgdTMyCi1hY3BpX3JzX3N0cmVhbV9vcHRpb25fbGVuZ3RoKHUzMiByZXNvdXJjZV9sZW5ndGgsCi0JCQkgICAgIHUzMiBtaW5pbXVtX2FtbF9yZXNvdXJjZV9sZW5ndGgpCi17Ci0JdTMyIHN0cmluZ19sZW5ndGggPSAwOwotCi0JQUNQSV9GVU5DVElPTl9FTlRSWSgpOwotCi0JLyoKLQkgKiBUaGUgcmVzb3VyY2Vfc291cmNlX2luZGV4IGFuZCByZXNvdXJjZV9zb3VyY2UgYXJlIG9wdGlvbmFsIGVsZW1lbnRzIG9mIHNvbWUKLQkgKiBMYXJnZS10eXBlIHJlc291cmNlIGRlc2NyaXB0b3JzLgotCSAqLwotCi0JLyoKLQkgKiBJZiB0aGUgbGVuZ3RoIG9mIHRoZSBhY3R1YWwgcmVzb3VyY2UgZGVzY3JpcHRvciBpcyBncmVhdGVyIHRoYW4gdGhlIEFDUEkKLQkgKiBzcGVjLWRlZmluZWQgbWluaW11bSBsZW5ndGgsIGl0IG1lYW5zIHRoYXQgYSByZXNvdXJjZV9zb3VyY2VfaW5kZXggZXhpc3RzCi0JICogYW5kIGlzIGZvbGxvd2VkIGJ5IGEgKHJlcXVpcmVkKSBudWxsIHRlcm1pbmF0ZWQgc3RyaW5nLiBUaGUgc3RyaW5nIGxlbmd0aAotCSAqIChpbmNsdWRpbmcgdGhlIG51bGwgdGVybWluYXRvcikgaXMgdGhlIHJlc291cmNlIGxlbmd0aCBtaW51cyB0aGUgbWluaW11bQotCSAqIGxlbmd0aCwgbWludXMgb25lIGJ5dGUgZm9yIHRoZSByZXNvdXJjZV9zb3VyY2VfaW5kZXggaXRzZWxmLgotCSAqLwotCWlmIChyZXNvdXJjZV9sZW5ndGggPiBtaW5pbXVtX2FtbF9yZXNvdXJjZV9sZW5ndGgpIHsKLQotCQkvKiBDb21wdXRlIHRoZSBsZW5ndGggb2YgdGhlIG9wdGlvbmFsIHN0cmluZyAqLwotCi0JCXN0cmluZ19sZW5ndGggPQotCQkgICAgcmVzb3VyY2VfbGVuZ3RoIC0gbWluaW11bV9hbWxfcmVzb3VyY2VfbGVuZ3RoIC0gMTsKLQl9Ci0KLQkvKgotCSAqIFJvdW5kIHRoZSBsZW5ndGggdXAgdG8gYSBtdWx0aXBsZSBvZiB0aGUgbmF0aXZlIHdvcmQgaW4gb3JkZXIgdG8KLQkgKiBndWFyYW50ZWUgdGhhdCB0aGUgZW50aXJlIHJlc291cmNlIGRlc2NyaXB0b3IgaXMgbmF0aXZlIHdvcmQgYWxpZ25lZAotCSAqLwotCXJldHVybiAoKHUzMikgQUNQSV9ST1VORF9VUF9UT19OQVRJVkVfV09SRChzdHJpbmdfbGVuZ3RoKSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfcnNfZ2V0X2FtbF9sZW5ndGgKLSAqCi0gKiBQQVJBTUVURVJTOiAgUmVzb3VyY2UgICAgICAgICAgICAtIFBvaW50ZXIgdG8gdGhlIHJlc291cmNlIGxpbmtlZCBsaXN0Ci0gKiAgICAgICAgICAgICAgc2l6ZV9uZWVkZWQgICAgICAgICAtIFdoZXJlIHRoZSByZXF1aXJlZCBzaXplIGlzIHJldHVybmVkCi0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cwotICoKLSAqIERFU0NSSVBUSU9OOiBUYWtlcyBhIGxpbmtlZCBsaXN0IG9mIGludGVybmFsIHJlc291cmNlIGRlc2NyaXB0b3JzIGFuZAotICogICAgICAgICAgICAgIGNhbGN1bGF0ZXMgdGhlIHNpemUgYnVmZmVyIG5lZWRlZCB0byBob2xkIHRoZSBjb3JyZXNwb25kaW5nCi0gKiAgICAgICAgICAgICAgZXh0ZXJuYWwgcmVzb3VyY2UgYnl0ZSBzdHJlYW0uCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotYWNwaV9zdGF0dXMKLWFjcGlfcnNfZ2V0X2FtbF9sZW5ndGgoc3RydWN0IGFjcGlfcmVzb3VyY2UgKiByZXNvdXJjZSwgYWNwaV9zaXplICogc2l6ZV9uZWVkZWQpCi17Ci0JYWNwaV9zaXplIGFtbF9zaXplX25lZWRlZCA9IDA7Ci0JYWNwaV9yc19sZW5ndGggdG90YWxfc2l6ZTsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UocnNfZ2V0X2FtbF9sZW5ndGgpOwotCi0JLyogVHJhdmVyc2UgZW50aXJlIGxpc3Qgb2YgaW50ZXJuYWwgcmVzb3VyY2UgZGVzY3JpcHRvcnMgKi8KLQotCXdoaWxlIChyZXNvdXJjZSkgewotCi0JCS8qIFZhbGlkYXRlIHRoZSBkZXNjcmlwdG9yIHR5cGUgKi8KLQotCQlpZiAocmVzb3VyY2UtPnR5cGUgPiBBQ1BJX1JFU09VUkNFX1RZUEVfTUFYKSB7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX0lOVkFMSURfUkVTT1VSQ0VfVFlQRSk7Ci0JCX0KLQotCQkvKiBHZXQgdGhlIGJhc2Ugc2l6ZSBvZiB0aGUgKGV4dGVybmFsIHN0cmVhbSkgcmVzb3VyY2UgZGVzY3JpcHRvciAqLwotCi0JCXRvdGFsX3NpemUgPSBhY3BpX2dibF9hbWxfcmVzb3VyY2Vfc2l6ZXNbcmVzb3VyY2UtPnR5cGVdOwotCi0JCS8qCi0JCSAqIEF1Z21lbnQgdGhlIGJhc2Ugc2l6ZSBmb3IgZGVzY3JpcHRvcnMgd2l0aCBvcHRpb25hbCBhbmQvb3IKLQkJICogdmFyaWFibGUtbGVuZ3RoIGZpZWxkcwotCQkgKi8KLQkJc3dpdGNoIChyZXNvdXJjZS0+dHlwZSkgewotCQljYXNlIEFDUElfUkVTT1VSQ0VfVFlQRV9JUlE6Ci0KLQkJCS8qIExlbmd0aCBjYW4gYmUgMyBvciAyICovCi0KLQkJCWlmIChyZXNvdXJjZS0+ZGF0YS5pcnEuZGVzY3JpcHRvcl9sZW5ndGggPT0gMikgewotCQkJCXRvdGFsX3NpemUtLTsKLQkJCX0KLQkJCWJyZWFrOwotCi0JCWNhc2UgQUNQSV9SRVNPVVJDRV9UWVBFX1NUQVJUX0RFUEVOREVOVDoKLQotCQkJLyogTGVuZ3RoIGNhbiBiZSAxIG9yIDAgKi8KLQotCQkJaWYgKHJlc291cmNlLT5kYXRhLmlycS5kZXNjcmlwdG9yX2xlbmd0aCA9PSAwKSB7Ci0JCQkJdG90YWxfc2l6ZS0tOwotCQkJfQotCQkJYnJlYWs7Ci0KLQkJY2FzZSBBQ1BJX1JFU09VUkNFX1RZUEVfVkVORE9SOgotCQkJLyoKLQkJCSAqIFZlbmRvciBEZWZpbmVkIFJlc291cmNlOgotCQkJICogRm9yIGEgVmVuZG9yIFNwZWNpZmljIHJlc291cmNlLCBpZiB0aGUgTGVuZ3RoIGlzIGJldHdlZW4gMSBhbmQgNwotCQkJICogaXQgd2lsbCBiZSBjcmVhdGVkIGFzIGEgU21hbGwgUmVzb3VyY2UgZGF0YSB0eXBlLCBvdGhlcndpc2UgaXQKLQkJCSAqIGlzIGEgTGFyZ2UgUmVzb3VyY2UgZGF0YSB0eXBlLgotCQkJICovCi0JCQlpZiAocmVzb3VyY2UtPmRhdGEudmVuZG9yLmJ5dGVfbGVuZ3RoID4gNykgewotCi0JCQkJLyogQmFzZSBzaXplIG9mIGEgTGFyZ2UgcmVzb3VyY2UgZGVzY3JpcHRvciAqLwotCi0JCQkJdG90YWxfc2l6ZSA9Ci0JCQkJICAgIHNpemVvZihzdHJ1Y3QgYW1sX3Jlc291cmNlX2xhcmdlX2hlYWRlcik7Ci0JCQl9Ci0KLQkJCS8qIEFkZCB0aGUgc2l6ZSBvZiB0aGUgdmVuZG9yLXNwZWNpZmljIGRhdGEgKi8KLQotCQkJdG90YWxfc2l6ZSA9IChhY3BpX3JzX2xlbmd0aCkKLQkJCSAgICAodG90YWxfc2l6ZSArIHJlc291cmNlLT5kYXRhLnZlbmRvci5ieXRlX2xlbmd0aCk7Ci0JCQlicmVhazsKLQotCQljYXNlIEFDUElfUkVTT1VSQ0VfVFlQRV9FTkRfVEFHOgotCQkJLyoKLQkJCSAqIEVuZCBUYWc6Ci0JCQkgKiBXZSBhcmUgZG9uZSAtLSByZXR1cm4gdGhlIGFjY3VtdWxhdGVkIHRvdGFsIHNpemUuCi0JCQkgKi8KLQkJCSpzaXplX25lZWRlZCA9IGFtbF9zaXplX25lZWRlZCArIHRvdGFsX3NpemU7Ci0KLQkJCS8qIE5vcm1hbCBleGl0ICovCi0KLQkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7Ci0KLQkJY2FzZSBBQ1BJX1JFU09VUkNFX1RZUEVfQUREUkVTUzE2OgotCQkJLyoKLQkJCSAqIDE2LUJpdCBBZGRyZXNzIFJlc291cmNlOgotCQkJICogQWRkIHRoZSBzaXplIG9mIHRoZSBvcHRpb25hbCByZXNvdXJjZV9zb3VyY2UgaW5mbwotCQkJICovCi0JCQl0b3RhbF9zaXplID0gKGFjcGlfcnNfbGVuZ3RoKQotCQkJICAgICh0b3RhbF9zaXplICsKLQkJCSAgICAgYWNwaV9yc19zdHJ1Y3Rfb3B0aW9uX2xlbmd0aCgmcmVzb3VyY2UtPmRhdGEuCi0JCQkJCQkJICBhZGRyZXNzMTYuCi0JCQkJCQkJICByZXNvdXJjZV9zb3VyY2UpKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgQUNQSV9SRVNPVVJDRV9UWVBFX0FERFJFU1MzMjoKLQkJCS8qCi0JCQkgKiAzMi1CaXQgQWRkcmVzcyBSZXNvdXJjZToKLQkJCSAqIEFkZCB0aGUgc2l6ZSBvZiB0aGUgb3B0aW9uYWwgcmVzb3VyY2Vfc291cmNlIGluZm8KLQkJCSAqLwotCQkJdG90YWxfc2l6ZSA9IChhY3BpX3JzX2xlbmd0aCkKLQkJCSAgICAodG90YWxfc2l6ZSArCi0JCQkgICAgIGFjcGlfcnNfc3RydWN0X29wdGlvbl9sZW5ndGgoJnJlc291cmNlLT5kYXRhLgotCQkJCQkJCSAgYWRkcmVzczMyLgotCQkJCQkJCSAgcmVzb3VyY2Vfc291cmNlKSk7Ci0JCQlicmVhazsKLQotCQljYXNlIEFDUElfUkVTT1VSQ0VfVFlQRV9BRERSRVNTNjQ6Ci0JCQkvKgotCQkJICogNjQtQml0IEFkZHJlc3MgUmVzb3VyY2U6Ci0JCQkgKiBBZGQgdGhlIHNpemUgb2YgdGhlIG9wdGlvbmFsIHJlc291cmNlX3NvdXJjZSBpbmZvCi0JCQkgKi8KLQkJCXRvdGFsX3NpemUgPSAoYWNwaV9yc19sZW5ndGgpCi0JCQkgICAgKHRvdGFsX3NpemUgKwotCQkJICAgICBhY3BpX3JzX3N0cnVjdF9vcHRpb25fbGVuZ3RoKCZyZXNvdXJjZS0+ZGF0YS4KLQkJCQkJCQkgIGFkZHJlc3M2NC4KLQkJCQkJCQkgIHJlc291cmNlX3NvdXJjZSkpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBBQ1BJX1JFU09VUkNFX1RZUEVfRVhURU5ERURfSVJROgotCQkJLyoKLQkJCSAqIEV4dGVuZGVkIElSUSBSZXNvdXJjZToKLQkJCSAqIEFkZCB0aGUgc2l6ZSBvZiBlYWNoIGFkZGl0aW9uYWwgb3B0aW9uYWwgaW50ZXJydXB0IGJleW9uZCB0aGUKLQkJCSAqIHJlcXVpcmVkIDEgKDQgYnl0ZXMgZm9yIGVhY2ggdTMyIGludGVycnVwdCBudW1iZXIpCi0JCQkgKi8KLQkJCXRvdGFsX3NpemUgPSAoYWNwaV9yc19sZW5ndGgpCi0JCQkgICAgKHRvdGFsX3NpemUgKwotCQkJICAgICAoKHJlc291cmNlLT5kYXRhLmV4dGVuZGVkX2lycS5pbnRlcnJ1cHRfY291bnQgLQotCQkJICAgICAgIDEpICogNCkgKwotCQkJICAgICAvKiBBZGQgdGhlIHNpemUgb2YgdGhlIG9wdGlvbmFsIHJlc291cmNlX3NvdXJjZSBpbmZvICovCi0JCQkgICAgIGFjcGlfcnNfc3RydWN0X29wdGlvbl9sZW5ndGgoJnJlc291cmNlLT5kYXRhLgotCQkJCQkJCSAgZXh0ZW5kZWRfaXJxLgotCQkJCQkJCSAgcmVzb3VyY2Vfc291cmNlKSk7Ci0JCQlicmVhazsKLQotCQlkZWZhdWx0OgotCQkJYnJlYWs7Ci0JCX0KLQotCQkvKiBVcGRhdGUgdGhlIHRvdGFsICovCi0KLQkJYW1sX3NpemVfbmVlZGVkICs9IHRvdGFsX3NpemU7Ci0KLQkJLyogUG9pbnQgdG8gdGhlIG5leHQgb2JqZWN0ICovCi0KLQkJcmVzb3VyY2UgPQotCQkgICAgQUNQSV9BRERfUFRSKHN0cnVjdCBhY3BpX3Jlc291cmNlLCByZXNvdXJjZSwKLQkJCQkgcmVzb3VyY2UtPmxlbmd0aCk7Ci0JfQotCi0JLyogRGlkIG5vdCBmaW5kIGFuIGVuZF90YWcgcmVzb3VyY2UgZGVzY3JpcHRvciAqLwotCi0JcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9OT19SRVNPVVJDRV9FTkRfVEFHKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9yc19nZXRfbGlzdF9sZW5ndGgKLSAqCi0gKiBQQVJBTUVURVJTOiAgYW1sX2J1ZmZlciAgICAgICAgICAtIFBvaW50ZXIgdG8gdGhlIHJlc291cmNlIGJ5dGUgc3RyZWFtCi0gKiAgICAgICAgICAgICAgYW1sX2J1ZmZlcl9sZW5ndGggICAtIFNpemUgb2YgYW1sX2J1ZmZlcgotICogICAgICAgICAgICAgIHNpemVfbmVlZGVkICAgICAgICAgLSBXaGVyZSB0aGUgc2l6ZSBuZWVkZWQgaXMgcmV0dXJuZWQKLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IFRha2VzIGFuIGV4dGVybmFsIHJlc291cmNlIGJ5dGUgc3RyZWFtIGFuZCBjYWxjdWxhdGVzIHRoZSBzaXplCi0gKiAgICAgICAgICAgICAgYnVmZmVyIG5lZWRlZCB0byBob2xkIHRoZSBjb3JyZXNwb25kaW5nIGludGVybmFsIHJlc291cmNlCi0gKiAgICAgICAgICAgICAgZGVzY3JpcHRvciBsaW5rZWQgbGlzdC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1hY3BpX3N0YXR1cwotYWNwaV9yc19nZXRfbGlzdF9sZW5ndGgodTggKiBhbWxfYnVmZmVyLAotCQkJdTMyIGFtbF9idWZmZXJfbGVuZ3RoLCBhY3BpX3NpemUgKiBzaXplX25lZWRlZCkKLXsKLQlhY3BpX3N0YXR1cyBzdGF0dXM7Ci0JdTggKmVuZF9hbWw7Ci0JdTggKmJ1ZmZlcjsKLQl1MzIgYnVmZmVyX3NpemU7Ci0JdTE2IHRlbXAxNjsKLQl1MTYgcmVzb3VyY2VfbGVuZ3RoOwotCXUzMiBleHRyYV9zdHJ1Y3RfYnl0ZXM7Ci0JdTggcmVzb3VyY2VfaW5kZXg7Ci0JdTggbWluaW11bV9hbWxfcmVzb3VyY2VfbGVuZ3RoOwotCi0JQUNQSV9GVU5DVElPTl9UUkFDRShyc19nZXRfbGlzdF9sZW5ndGgpOwotCi0JKnNpemVfbmVlZGVkID0gMDsKLQllbmRfYW1sID0gYW1sX2J1ZmZlciArIGFtbF9idWZmZXJfbGVuZ3RoOwotCi0JLyogV2FsayB0aGUgbGlzdCBvZiBBTUwgcmVzb3VyY2UgZGVzY3JpcHRvcnMgKi8KLQotCXdoaWxlIChhbWxfYnVmZmVyIDwgZW5kX2FtbCkgewotCi0JCS8qIFZhbGlkYXRlIHRoZSBSZXNvdXJjZSBUeXBlIGFuZCBSZXNvdXJjZSBMZW5ndGggKi8KLQotCQlzdGF0dXMgPSBhY3BpX3V0X3ZhbGlkYXRlX3Jlc291cmNlKGFtbF9idWZmZXIsICZyZXNvdXJjZV9pbmRleCk7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci0JCX0KLQotCQkvKiBHZXQgdGhlIHJlc291cmNlIGxlbmd0aCBhbmQgYmFzZSAobWluaW11bSkgQU1MIHNpemUgKi8KLQotCQlyZXNvdXJjZV9sZW5ndGggPSBhY3BpX3V0X2dldF9yZXNvdXJjZV9sZW5ndGgoYW1sX2J1ZmZlcik7Ci0JCW1pbmltdW1fYW1sX3Jlc291cmNlX2xlbmd0aCA9Ci0JCSAgICBhY3BpX2dibF9yZXNvdXJjZV9hbWxfc2l6ZXNbcmVzb3VyY2VfaW5kZXhdOwotCi0JCS8qCi0JCSAqIEF1Z21lbnQgdGhlIHNpemUgZm9yIGRlc2NyaXB0b3JzIHdpdGggb3B0aW9uYWwKLQkJICogYW5kL29yIHZhcmlhYmxlIGxlbmd0aCBmaWVsZHMKLQkJICovCi0JCWV4dHJhX3N0cnVjdF9ieXRlcyA9IDA7Ci0JCWJ1ZmZlciA9Ci0JCSAgICBhbWxfYnVmZmVyICsgYWNwaV91dF9nZXRfcmVzb3VyY2VfaGVhZGVyX2xlbmd0aChhbWxfYnVmZmVyKTsKLQotCQlzd2l0Y2ggKGFjcGlfdXRfZ2V0X3Jlc291cmNlX3R5cGUoYW1sX2J1ZmZlcikpIHsKLQkJY2FzZSBBQ1BJX1JFU09VUkNFX05BTUVfSVJROgotCQkJLyoKLQkJCSAqIElSUSBSZXNvdXJjZToKLQkJCSAqIEdldCB0aGUgbnVtYmVyIG9mIGJpdHMgc2V0IGluIHRoZSAxNi1iaXQgSVJRIG1hc2sKLQkJCSAqLwotCQkJQUNQSV9NT1ZFXzE2X1RPXzE2KCZ0ZW1wMTYsIGJ1ZmZlcik7Ci0JCQlleHRyYV9zdHJ1Y3RfYnl0ZXMgPSBhY3BpX3JzX2NvdW50X3NldF9iaXRzKHRlbXAxNik7Ci0JCQlicmVhazsKLQotCQljYXNlIEFDUElfUkVTT1VSQ0VfTkFNRV9ETUE6Ci0JCQkvKgotCQkJICogRE1BIFJlc291cmNlOgotCQkJICogR2V0IHRoZSBudW1iZXIgb2YgYml0cyBzZXQgaW4gdGhlIDgtYml0IERNQSBtYXNrCi0JCQkgKi8KLQkJCWV4dHJhX3N0cnVjdF9ieXRlcyA9IGFjcGlfcnNfY291bnRfc2V0X2JpdHMoKmJ1ZmZlcik7Ci0JCQlicmVhazsKLQotCQljYXNlIEFDUElfUkVTT1VSQ0VfTkFNRV9WRU5ET1JfU01BTEw6Ci0JCWNhc2UgQUNQSV9SRVNPVVJDRV9OQU1FX1ZFTkRPUl9MQVJHRToKLQkJCS8qCi0JCQkgKiBWZW5kb3IgUmVzb3VyY2U6Ci0JCQkgKiBHZXQgdGhlIG51bWJlciBvZiB2ZW5kb3IgZGF0YSBieXRlcwotCQkJICovCi0JCQlleHRyYV9zdHJ1Y3RfYnl0ZXMgPSByZXNvdXJjZV9sZW5ndGg7Ci0JCQlicmVhazsKLQotCQljYXNlIEFDUElfUkVTT1VSQ0VfTkFNRV9FTkRfVEFHOgotCQkJLyoKLQkJCSAqIEVuZCBUYWc6Ci0JCQkgKiBUaGlzIGlzIHRoZSBub3JtYWwgZXhpdCwgYWRkIHNpemUgb2YgZW5kX3RhZwotCQkJICovCi0JCQkqc2l6ZV9uZWVkZWQgKz0gQUNQSV9SU19TSVpFX01JTjsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7Ci0KLQkJY2FzZSBBQ1BJX1JFU09VUkNFX05BTUVfQUREUkVTUzMyOgotCQljYXNlIEFDUElfUkVTT1VSQ0VfTkFNRV9BRERSRVNTMTY6Ci0JCWNhc2UgQUNQSV9SRVNPVVJDRV9OQU1FX0FERFJFU1M2NDoKLQkJCS8qCi0JCQkgKiBBZGRyZXNzIFJlc291cmNlOgotCQkJICogQWRkIHRoZSBzaXplIG9mIHRoZSBvcHRpb25hbCByZXNvdXJjZV9zb3VyY2UKLQkJCSAqLwotCQkJZXh0cmFfc3RydWN0X2J5dGVzID0KLQkJCSAgICBhY3BpX3JzX3N0cmVhbV9vcHRpb25fbGVuZ3RoKHJlc291cmNlX2xlbmd0aCwKLQkJCQkJCQkgbWluaW11bV9hbWxfcmVzb3VyY2VfbGVuZ3RoKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgQUNQSV9SRVNPVVJDRV9OQU1FX0VYVEVOREVEX0lSUToKLQkJCS8qCi0JCQkgKiBFeHRlbmRlZCBJUlEgUmVzb3VyY2U6Ci0JCQkgKiBVc2luZyB0aGUgaW50ZXJydXB0X3RhYmxlX2xlbmd0aCwgYWRkIDQgYnl0ZXMgZm9yIGVhY2ggYWRkaXRpb25hbAotCQkJICogaW50ZXJydXB0LiBOb3RlOiBhdCBsZWFzdCBvbmUgaW50ZXJydXB0IGlzIHJlcXVpcmVkIGFuZCBpcwotCQkJICogaW5jbHVkZWQgaW4gdGhlIG1pbmltdW0gZGVzY3JpcHRvciBzaXplIChyZWFzb24gZm9yIHRoZSAtMSkKLQkJCSAqLwotCQkJZXh0cmFfc3RydWN0X2J5dGVzID0gKGJ1ZmZlclsxXSAtIDEpICogc2l6ZW9mKHUzMik7Ci0KLQkJCS8qIEFkZCB0aGUgc2l6ZSBvZiB0aGUgb3B0aW9uYWwgcmVzb3VyY2Vfc291cmNlICovCi0KLQkJCWV4dHJhX3N0cnVjdF9ieXRlcyArPQotCQkJICAgIGFjcGlfcnNfc3RyZWFtX29wdGlvbl9sZW5ndGgocmVzb3VyY2VfbGVuZ3RoIC0KLQkJCQkJCQkgZXh0cmFfc3RydWN0X2J5dGVzLAotCQkJCQkJCSBtaW5pbXVtX2FtbF9yZXNvdXJjZV9sZW5ndGgpOwotCQkJYnJlYWs7Ci0KLQkJZGVmYXVsdDoKLQkJCWJyZWFrOwotCQl9Ci0KLQkJLyoKLQkJICogVXBkYXRlIHRoZSByZXF1aXJlZCBidWZmZXIgc2l6ZSBmb3IgdGhlIGludGVybmFsIGRlc2NyaXB0b3Igc3RydWN0cwotCQkgKgotCQkgKiBJbXBvcnRhbnQ6IFJvdW5kIHRoZSBzaXplIHVwIGZvciB0aGUgYXBwcm9wcmlhdGUgYWxpZ25tZW50LiBUaGlzCi0JCSAqIGlzIGEgcmVxdWlyZW1lbnQgb24gSUE2NC4KLQkJICovCi0JCWJ1ZmZlcl9zaXplID0gYWNwaV9nYmxfcmVzb3VyY2Vfc3RydWN0X3NpemVzW3Jlc291cmNlX2luZGV4XSArCi0JCSAgICBleHRyYV9zdHJ1Y3RfYnl0ZXM7Ci0JCWJ1ZmZlcl9zaXplID0gKHUzMikgQUNQSV9ST1VORF9VUF9UT19OQVRJVkVfV09SRChidWZmZXJfc2l6ZSk7Ci0KLQkJKnNpemVfbmVlZGVkICs9IGJ1ZmZlcl9zaXplOwotCi0JCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfUkVTT1VSQ0VTLAotCQkJCSAgIlR5cGUgJS4yWCwgQW1sTGVuZ3RoICUuMlggSW50ZXJuYWxMZW5ndGggJS4yWFxuIiwKLQkJCQkgIGFjcGlfdXRfZ2V0X3Jlc291cmNlX3R5cGUoYW1sX2J1ZmZlciksCi0JCQkJICBhY3BpX3V0X2dldF9kZXNjcmlwdG9yX2xlbmd0aChhbWxfYnVmZmVyKSwKLQkJCQkgIGJ1ZmZlcl9zaXplKSk7Ci0KLQkJLyoKLQkJICogUG9pbnQgdG8gdGhlIG5leHQgcmVzb3VyY2Ugd2l0aGluIHRoZSBBTUwgc3RyZWFtIHVzaW5nIHRoZSBsZW5ndGgKLQkJICogY29udGFpbmVkIGluIHRoZSByZXNvdXJjZSBkZXNjcmlwdG9yIGhlYWRlcgotCQkgKi8KLQkJYW1sX2J1ZmZlciArPSBhY3BpX3V0X2dldF9kZXNjcmlwdG9yX2xlbmd0aChhbWxfYnVmZmVyKTsKLQl9Ci0KLQkvKiBEaWQgbm90IGZpbmQgYW4gZW5kX3RhZyByZXNvdXJjZSBkZXNjcmlwdG9yICovCi0KLQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX05PX1JFU09VUkNFX0VORF9UQUcpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX3JzX2dldF9wY2lfcm91dGluZ190YWJsZV9sZW5ndGgKLSAqCi0gKiBQQVJBTUVURVJTOiAgcGFja2FnZV9vYmplY3QgICAgICAgICAgLSBQb2ludGVyIHRvIHRoZSBwYWNrYWdlIG9iamVjdAotICogICAgICAgICAgICAgIGJ1ZmZlcl9zaXplX25lZWRlZCAgICAgIC0gdTMyIHBvaW50ZXIgb2YgdGhlIHNpemUgYnVmZmVyCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWVkZWQgdG8gcHJvcGVybHkgcmV0dXJuIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VkIGRhdGEKLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IEdpdmVuIGEgcGFja2FnZSByZXByZXNlbnRpbmcgYSBQQ0kgcm91dGluZyB0YWJsZSwgdGhpcwotICogICAgICAgICAgICAgIGNhbGN1bGF0ZXMgdGhlIHNpemUgb2YgdGhlIGNvcnJlc3BvbmRpbmcgbGlua2VkIGxpc3Qgb2YKLSAqICAgICAgICAgICAgICBkZXNjcmlwdGlvbnMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotYWNwaV9zdGF0dXMKLWFjcGlfcnNfZ2V0X3BjaV9yb3V0aW5nX3RhYmxlX2xlbmd0aCh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpwYWNrYWdlX29iamVjdCwKLQkJCQkgICAgIGFjcGlfc2l6ZSAqIGJ1ZmZlcl9zaXplX25lZWRlZCkKLXsKLQl1MzIgbnVtYmVyX29mX2VsZW1lbnRzOwotCWFjcGlfc2l6ZSB0ZW1wX3NpemVfbmVlZGVkID0gMDsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICoqdG9wX29iamVjdF9saXN0OwotCXUzMiBpbmRleDsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpwYWNrYWdlX2VsZW1lbnQ7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKnN1Yl9vYmplY3RfbGlzdDsKLQl1OCBuYW1lX2ZvdW5kOwotCXUzMiB0YWJsZV9pbmRleDsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UocnNfZ2V0X3BjaV9yb3V0aW5nX3RhYmxlX2xlbmd0aCk7Ci0KLQludW1iZXJfb2ZfZWxlbWVudHMgPSBwYWNrYWdlX29iamVjdC0+cGFja2FnZS5jb3VudDsKLQotCS8qCi0JICogQ2FsY3VsYXRlIHRoZSBzaXplIG9mIHRoZSByZXR1cm4gYnVmZmVyLgotCSAqIFRoZSBiYXNlIHNpemUgaXMgdGhlIG51bWJlciBvZiBlbGVtZW50cyAqIHRoZSBzaXplcyBvZiB0aGUKLQkgKiBzdHJ1Y3R1cmVzLiAgQWRkaXRpb25hbCBzcGFjZSBmb3IgdGhlIHN0cmluZ3MgaXMgYWRkZWQgYmVsb3cuCi0JICogVGhlIG1pbnVzIG9uZSBpcyB0byBzdWJ0cmFjdCB0aGUgc2l6ZSBvZiB0aGUgdTggU291cmNlWzFdCi0JICogbWVtYmVyIGJlY2F1c2UgaXQgaXMgYWRkZWQgYmVsb3cuCi0JICoKLQkgKiBCdXQgZWFjaCBQUlRfRU5UUlkgc3RydWN0dXJlIGhhcyBhIHBvaW50ZXIgdG8gYSBzdHJpbmcgYW5kCi0JICogdGhlIHNpemUgb2YgdGhhdCBzdHJpbmcgbXVzdCBiZSBmb3VuZC4KLQkgKi8KLQl0b3Bfb2JqZWN0X2xpc3QgPSBwYWNrYWdlX29iamVjdC0+cGFja2FnZS5lbGVtZW50czsKLQotCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IG51bWJlcl9vZl9lbGVtZW50czsgaW5kZXgrKykgewotCi0JCS8qIERlcmVmZXJlbmNlIHRoZSBzdWItcGFja2FnZSAqLwotCi0JCXBhY2thZ2VfZWxlbWVudCA9ICp0b3Bfb2JqZWN0X2xpc3Q7Ci0KLQkJLyoKLQkJICogVGhlIHN1Yl9vYmplY3RfbGlzdCB3aWxsIG5vdyBwb2ludCB0byBhbiBhcnJheSBvZiB0aGUKLQkJICogZm91ciBJUlEgZWxlbWVudHM6IEFkZHJlc3MsIFBpbiwgU291cmNlIGFuZCBzb3VyY2VfaW5kZXgKLQkJICovCi0JCXN1Yl9vYmplY3RfbGlzdCA9IHBhY2thZ2VfZWxlbWVudC0+cGFja2FnZS5lbGVtZW50czsKLQotCQkvKiBTY2FuIHRoZSBpcnFfdGFibGVfZWxlbWVudHMgZm9yIHRoZSBTb3VyY2UgTmFtZSBTdHJpbmcgKi8KLQotCQluYW1lX2ZvdW5kID0gRkFMU0U7Ci0KLQkJZm9yICh0YWJsZV9pbmRleCA9IDA7IHRhYmxlX2luZGV4IDwgNCAmJiAhbmFtZV9mb3VuZDsKLQkJICAgICB0YWJsZV9pbmRleCsrKSB7Ci0JCQlpZiAoKnN1Yl9vYmplY3RfbGlzdCAmJgkvKiBOdWxsIG9iamVjdCBhbGxvd2VkICovCi0JCQkgICAgKChBQ1BJX1RZUEVfU1RSSU5HID09Ci0JCQkgICAgICBBQ1BJX0dFVF9PQkpFQ1RfVFlQRSgqc3ViX29iamVjdF9saXN0KSkgfHwKLQkJCSAgICAgKChBQ1BJX1RZUEVfTE9DQUxfUkVGRVJFTkNFID09Ci0JCQkgICAgICAgQUNQSV9HRVRfT0JKRUNUX1RZUEUoKnN1Yl9vYmplY3RfbGlzdCkpICYmCi0JCQkgICAgICAoKCpzdWJfb2JqZWN0X2xpc3QpLT5yZWZlcmVuY2UuY2xhc3MgPT0KLQkJCSAgICAgICBBQ1BJX1JFRkNMQVNTX05BTUUpKSkpIHsKLQkJCQluYW1lX2ZvdW5kID0gVFJVRTsKLQkJCX0gZWxzZSB7Ci0JCQkJLyogTG9vayBhdCB0aGUgbmV4dCBlbGVtZW50ICovCi0KLQkJCQlzdWJfb2JqZWN0X2xpc3QrKzsKLQkJCX0KLQkJfQotCi0JCXRlbXBfc2l6ZV9uZWVkZWQgKz0gKHNpemVvZihzdHJ1Y3QgYWNwaV9wY2lfcm91dGluZ190YWJsZSkgLSA0KTsKLQotCQkvKiBXYXMgYSBTdHJpbmcgdHlwZSBmb3VuZD8gKi8KLQotCQlpZiAobmFtZV9mb3VuZCkgewotCQkJaWYgKEFDUElfR0VUX09CSkVDVF9UWVBFKCpzdWJfb2JqZWN0X2xpc3QpID09Ci0JCQkgICAgQUNQSV9UWVBFX1NUUklORykgewotCQkJCS8qCi0JCQkJICogVGhlIGxlbmd0aCBTdHJpbmcuTGVuZ3RoIGZpZWxkIGRvZXMgbm90IGluY2x1ZGUgdGhlCi0JCQkJICogdGVybWluYXRpbmcgTlVMTCwgYWRkIDEKLQkJCQkgKi8KLQkJCQl0ZW1wX3NpemVfbmVlZGVkICs9ICgoYWNwaV9zaXplKQotCQkJCQkJICAgICAoKnN1Yl9vYmplY3RfbGlzdCktPnN0cmluZy4KLQkJCQkJCSAgICAgbGVuZ3RoICsgMSk7Ci0JCQl9IGVsc2UgewotCQkJCXRlbXBfc2l6ZV9uZWVkZWQgKz0KLQkJCQkgICAgYWNwaV9uc19nZXRfcGF0aG5hbWVfbGVuZ3RoKCgqc3ViX29iamVjdF9saXN0KS0+cmVmZXJlbmNlLm5vZGUpOwotCQkJCWlmICghdGVtcF9zaXplX25lZWRlZCkgewotCQkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX1BBUkFNRVRFUik7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgewotCQkJLyoKLQkJCSAqIElmIG5vIG5hbWUgd2FzIGZvdW5kLCB0aGVuIHRoaXMgaXMgYSBOVUxMLCB3aGljaCBpcwotCQkJICogdHJhbnNsYXRlZCBhcyBhIHUzMiB6ZXJvLgotCQkJICovCi0JCQl0ZW1wX3NpemVfbmVlZGVkICs9IHNpemVvZih1MzIpOwotCQl9Ci0KLQkJLyogUm91bmQgdXAgdGhlIHNpemUgc2luY2UgZWFjaCBlbGVtZW50IG11c3QgYmUgYWxpZ25lZCAqLwotCi0JCXRlbXBfc2l6ZV9uZWVkZWQgPSBBQ1BJX1JPVU5EX1VQX1RPXzY0QklUKHRlbXBfc2l6ZV9uZWVkZWQpOwotCi0JCS8qIFBvaW50IHRvIHRoZSBuZXh0IHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKi8KLQotCQl0b3Bfb2JqZWN0X2xpc3QrKzsKLQl9Ci0KLQkvKgotCSAqIEFkZCBhbiBleHRyYSBlbGVtZW50IHRvIHRoZSBlbmQgb2YgdGhlIGxpc3QsIGVzc2VudGlhbGx5IGEKLQkgKiBOVUxMIHRlcm1pbmF0b3IKLQkgKi8KLQkqYnVmZmVyX3NpemVfbmVlZGVkID0KLQkgICAgdGVtcF9zaXplX25lZWRlZCArIHNpemVvZihzdHJ1Y3QgYWNwaV9wY2lfcm91dGluZ190YWJsZSk7Ci0JcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9yZXNvdXJjZXMvcnNjcmVhdGUuYyBiL2RyaXZlcnMvYWNwaS9yZXNvdXJjZXMvcnNjcmVhdGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzBiYmZhMi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL2FjcGkvcmVzb3VyY2VzL3JzY3JlYXRlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBNb2R1bGUgTmFtZTogcnNjcmVhdGUgLSBDcmVhdGUgcmVzb3VyY2UgbGlzdHMvdGFibGVzCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDgsIEludGVsIENvcnAuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCi0gKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSBhdCBtaW5pbXVtIGEgZGlzY2xhaW1lcgotICogICAgc3Vic3RhbnRpYWxseSBzaW1pbGFyIHRvIHRoZSAiTk8gV0FSUkFOVFkiIGRpc2NsYWltZXIgYmVsb3cKLSAqICAgICgiRGlzY2xhaW1lciIpIGFuZCBhbnkgcmVkaXN0cmlidXRpb24gbXVzdCBiZSBjb25kaXRpb25lZCB1cG9uCi0gKiAgICBpbmNsdWRpbmcgYSBzdWJzdGFudGlhbGx5IHNpbWlsYXIgRGlzY2xhaW1lciByZXF1aXJlbWVudCBmb3IgZnVydGhlcgotICogICAgYmluYXJ5IHJlZGlzdHJpYnV0aW9uLgotICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzCi0gKiAgICBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIE5PIFdBUlJBTlRZCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKLSAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCi0gKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORwotICogSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCi0gKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCi0gKi8KLQotI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgotI2luY2x1ZGUgPGFjcGkvYWNyZXNyYy5oPgotI2luY2x1ZGUgPGFjcGkvYWNuYW1lc3AuaD4KLQotI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfUkVTT1VSQ0VTCi1BQ1BJX01PRFVMRV9OQU1FKCJyc2NyZWF0ZSIpCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfcnNfY3JlYXRlX3Jlc291cmNlX2xpc3QKLSAqCi0gKiBQQVJBTUVURVJTOiAgYW1sX2J1ZmZlciAgICAgICAgICAtIFBvaW50ZXIgdG8gdGhlIHJlc291cmNlIGJ5dGUgc3RyZWFtCi0gKiAgICAgICAgICAgICAgb3V0cHV0X2J1ZmZlciAgICAgICAtIFBvaW50ZXIgdG8gdGhlIHVzZXIncyBidWZmZXIKLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzOiBBRV9PSyBpZiBva2F5LCBlbHNlIGEgdmFsaWQgYWNwaV9zdGF0dXMgY29kZQotICogICAgICAgICAgICAgIElmIG91dHB1dF9idWZmZXIgaXMgbm90IGxhcmdlIGVub3VnaCwgb3V0cHV0X2J1ZmZlcl9sZW5ndGgKLSAqICAgICAgICAgICAgICBpbmRpY2F0ZXMgaG93IGxhcmdlIG91dHB1dF9idWZmZXIgc2hvdWxkIGJlLCBlbHNlIGl0Ci0gKiAgICAgICAgICAgICAgaW5kaWNhdGVzIGhvdyBtYXkgdTggZWxlbWVudHMgb2Ygb3V0cHV0X2J1ZmZlciBhcmUgdmFsaWQuCi0gKgotICogREVTQ1JJUFRJT046IFRha2VzIHRoZSBieXRlIHN0cmVhbSByZXR1cm5lZCBmcm9tIGEgX0NSUywgX1BSUyBjb250cm9sIG1ldGhvZAotICogICAgICAgICAgICAgIGV4ZWN1dGlvbiBhbmQgcGFyc2VzIHRoZSBzdHJlYW0gdG8gY3JlYXRlIGEgbGlua2VkIGxpc3QKLSAqICAgICAgICAgICAgICBvZiBkZXZpY2UgcmVzb3VyY2VzLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1hY3BpX3N0YXR1cwotYWNwaV9yc19jcmVhdGVfcmVzb3VyY2VfbGlzdCh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICphbWxfYnVmZmVyLAotCQkJICAgICBzdHJ1Y3QgYWNwaV9idWZmZXIgKm91dHB1dF9idWZmZXIpCi17Ci0KLQlhY3BpX3N0YXR1cyBzdGF0dXM7Ci0JdTggKmFtbF9zdGFydDsKLQlhY3BpX3NpemUgbGlzdF9zaXplX25lZWRlZCA9IDA7Ci0JdTMyIGFtbF9idWZmZXJfbGVuZ3RoOwotCXZvaWQgKnJlc291cmNlOwotCi0JQUNQSV9GVU5DVElPTl9UUkFDRShyc19jcmVhdGVfcmVzb3VyY2VfbGlzdCk7Ci0KLQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sICJBbWxCdWZmZXIgPSAlcFxuIiwgYW1sX2J1ZmZlcikpOwotCi0JLyogUGFyYW1zIGFscmVhZHkgdmFsaWRhdGVkLCBzbyB3ZSBkb24ndCByZS12YWxpZGF0ZSBoZXJlICovCi0KLQlhbWxfYnVmZmVyX2xlbmd0aCA9IGFtbF9idWZmZXItPmJ1ZmZlci5sZW5ndGg7Ci0JYW1sX3N0YXJ0ID0gYW1sX2J1ZmZlci0+YnVmZmVyLnBvaW50ZXI7Ci0KLQkvKgotCSAqIFBhc3MgdGhlIGFtbF9idWZmZXIgaW50byBhIG1vZHVsZSB0aGF0IGNhbiBjYWxjdWxhdGUKLQkgKiB0aGUgYnVmZmVyIHNpemUgbmVlZGVkIGZvciB0aGUgbGlua2VkIGxpc3QKLQkgKi8KLQlzdGF0dXMgPSBhY3BpX3JzX2dldF9saXN0X2xlbmd0aChhbWxfc3RhcnQsIGFtbF9idWZmZXJfbGVuZ3RoLAotCQkJCQkgJmxpc3Rfc2l6ZV9uZWVkZWQpOwotCi0JQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLCAiU3RhdHVzPSVYIExpc3RTaXplTmVlZGVkPSVYXG4iLAotCQkJICBzdGF0dXMsICh1MzIpIGxpc3Rfc2l6ZV9uZWVkZWQpKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci0JfQotCi0JLyogVmFsaWRhdGUvQWxsb2NhdGUvQ2xlYXIgY2FsbGVyIGJ1ZmZlciAqLwotCi0Jc3RhdHVzID0gYWNwaV91dF9pbml0aWFsaXplX2J1ZmZlcihvdXRwdXRfYnVmZmVyLCBsaXN0X3NpemVfbmVlZGVkKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci0JfQotCi0JLyogRG8gdGhlIGNvbnZlcnNpb24gKi8KLQotCXJlc291cmNlID0gb3V0cHV0X2J1ZmZlci0+cG9pbnRlcjsKLQlzdGF0dXMgPSBhY3BpX3V0X3dhbGtfYW1sX3Jlc291cmNlcyhhbWxfc3RhcnQsIGFtbF9idWZmZXJfbGVuZ3RoLAotCQkJCQkgICAgYWNwaV9yc19jb252ZXJ0X2FtbF90b19yZXNvdXJjZXMsCi0JCQkJCSAgICAmcmVzb3VyY2UpOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLQl9Ci0KLQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sICJPdXRwdXRCdWZmZXIgJXAgTGVuZ3RoICVYXG4iLAotCQkJICBvdXRwdXRfYnVmZmVyLT5wb2ludGVyLCAodTMyKSBvdXRwdXRfYnVmZmVyLT5sZW5ndGgpKTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX3JzX2NyZWF0ZV9wY2lfcm91dGluZ190YWJsZQotICoKLSAqIFBBUkFNRVRFUlM6ICBwYWNrYWdlX29iamVjdCAgICAgICAgICAtIFBvaW50ZXIgdG8gYW4gdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2FnZQotICogICAgICAgICAgICAgIG91dHB1dF9idWZmZXIgICAgICAgICAgIC0gUG9pbnRlciB0byB0aGUgdXNlcidzIGJ1ZmZlcgotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMgIEFFX09LIGlmIG9rYXksIGVsc2UgYSB2YWxpZCBhY3BpX3N0YXR1cyBjb2RlLgotICogICAgICAgICAgICAgIElmIHRoZSBvdXRwdXRfYnVmZmVyIGlzIHRvbyBzbWFsbCwgdGhlIGVycm9yIHdpbGwgYmUKLSAqICAgICAgICAgICAgICBBRV9CVUZGRVJfT1ZFUkZMT1cgYW5kIG91dHB1dF9idWZmZXItPkxlbmd0aCB3aWxsIHBvaW50Ci0gKiAgICAgICAgICAgICAgdG8gdGhlIHNpemUgYnVmZmVyIG5lZWRlZC4KLSAqCi0gKiBERVNDUklQVElPTjogVGFrZXMgdGhlIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgcGFja2FnZSBhbmQgY3JlYXRlcyBhCi0gKiAgICAgICAgICAgICAgbGlua2VkIGxpc3Qgb2YgUENJIGludGVycnVwdCBkZXNjcmlwdGlvbnMKLSAqCi0gKiBOT1RFOiBJdCBpcyB0aGUgY2FsbGVyJ3MgcmVzcG9uc2liaWxpdHkgdG8gZW5zdXJlIHRoYXQgdGhlIHN0YXJ0IG9mIHRoZQotICogb3V0cHV0IGJ1ZmZlciBpcyBhbGlnbmVkIHByb3Blcmx5IChpZiBuZWNlc3NhcnkpLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWFjcGlfc3RhdHVzCi1hY3BpX3JzX2NyZWF0ZV9wY2lfcm91dGluZ190YWJsZSh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpwYWNrYWdlX29iamVjdCwKLQkJCQkgc3RydWN0IGFjcGlfYnVmZmVyICpvdXRwdXRfYnVmZmVyKQotewotCXU4ICpidWZmZXI7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKnRvcF9vYmplY3RfbGlzdDsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICoqc3ViX29iamVjdF9saXN0OwotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjOwotCWFjcGlfc2l6ZSBidWZmZXJfc2l6ZV9uZWVkZWQgPSAwOwotCXUzMiBudW1iZXJfb2ZfZWxlbWVudHM7Ci0JdTMyIGluZGV4OwotCXN0cnVjdCBhY3BpX3BjaV9yb3V0aW5nX3RhYmxlICp1c2VyX3BydDsKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZTsKLQlhY3BpX3N0YXR1cyBzdGF0dXM7Ci0Jc3RydWN0IGFjcGlfYnVmZmVyIHBhdGhfYnVmZmVyOwotCi0JQUNQSV9GVU5DVElPTl9UUkFDRShyc19jcmVhdGVfcGNpX3JvdXRpbmdfdGFibGUpOwotCi0JLyogUGFyYW1zIGFscmVhZHkgdmFsaWRhdGVkLCBzbyB3ZSBkb24ndCByZS12YWxpZGF0ZSBoZXJlICovCi0KLQkvKiBHZXQgdGhlIHJlcXVpcmVkIGJ1ZmZlciBsZW5ndGggKi8KLQotCXN0YXR1cyA9IGFjcGlfcnNfZ2V0X3BjaV9yb3V0aW5nX3RhYmxlX2xlbmd0aChwYWNrYWdlX29iamVjdCwKLQkJCQkJCSAgICAgICZidWZmZXJfc2l6ZV9uZWVkZWQpOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLQl9Ci0KLQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sICJCdWZmZXJTaXplTmVlZGVkID0gJVhcbiIsCi0JCQkgICh1MzIpIGJ1ZmZlcl9zaXplX25lZWRlZCkpOwotCi0JLyogVmFsaWRhdGUvQWxsb2NhdGUvQ2xlYXIgY2FsbGVyIGJ1ZmZlciAqLwotCi0Jc3RhdHVzID0gYWNwaV91dF9pbml0aWFsaXplX2J1ZmZlcihvdXRwdXRfYnVmZmVyLCBidWZmZXJfc2l6ZV9uZWVkZWQpOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLQl9Ci0KLQkvKgotCSAqIExvb3AgdGhyb3VnaCB0aGUgQUNQSV9JTlRFUk5BTF9PQkpFQ1RTIC0gRWFjaCBvYmplY3Qgc2hvdWxkIGJlIGEKLQkgKiBwYWNrYWdlIHRoYXQgaW4gdHVybiBjb250YWlucyBhbiBhY3BpX2ludGVnZXIgQWRkcmVzcywgYSB1OCBQaW4sCi0JICogYSBOYW1lLCBhbmQgYSB1OCBzb3VyY2VfaW5kZXguCi0JICovCi0JdG9wX29iamVjdF9saXN0ID0gcGFja2FnZV9vYmplY3QtPnBhY2thZ2UuZWxlbWVudHM7Ci0JbnVtYmVyX29mX2VsZW1lbnRzID0gcGFja2FnZV9vYmplY3QtPnBhY2thZ2UuY291bnQ7Ci0JYnVmZmVyID0gb3V0cHV0X2J1ZmZlci0+cG9pbnRlcjsKLQl1c2VyX3BydCA9IEFDUElfQ0FTVF9QVFIoc3RydWN0IGFjcGlfcGNpX3JvdXRpbmdfdGFibGUsIGJ1ZmZlcik7Ci0KLQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBudW1iZXJfb2ZfZWxlbWVudHM7IGluZGV4KyspIHsKLQkJaW50IHNvdXJjZV9uYW1lX2luZGV4ID0gMjsKLQkJaW50IHNvdXJjZV9pbmRleF9pbmRleCA9IDM7Ci0KLQkJLyoKLQkJICogUG9pbnQgdXNlcl9wcnQgcGFzdCB0aGlzIGN1cnJlbnQgc3RydWN0dXJlCi0JCSAqCi0JCSAqIE5PVEU6IE9uIHRoZSBmaXJzdCBpdGVyYXRpb24sIHVzZXJfcHJ0LT5MZW5ndGggd2lsbAotCQkgKiBiZSB6ZXJvIGJlY2F1c2Ugd2UgY2xlYXJlZCB0aGUgcmV0dXJuIGJ1ZmZlciBlYXJsaWVyCi0JCSAqLwotCQlidWZmZXIgKz0gdXNlcl9wcnQtPmxlbmd0aDsKLQkJdXNlcl9wcnQgPSBBQ1BJX0NBU1RfUFRSKHN0cnVjdCBhY3BpX3BjaV9yb3V0aW5nX3RhYmxlLCBidWZmZXIpOwotCi0JCS8qCi0JCSAqIEZpbGwgaW4gdGhlIExlbmd0aCBmaWVsZCB3aXRoIHRoZSBpbmZvcm1hdGlvbiB3ZSBoYXZlIGF0IHRoaXMgcG9pbnQuCi0JCSAqIFRoZSBtaW51cyBmb3VyIGlzIHRvIHN1YnRyYWN0IHRoZSBzaXplIG9mIHRoZSB1OCBTb3VyY2VbNF0gbWVtYmVyCi0JCSAqIGJlY2F1c2UgaXQgaXMgYWRkZWQgYmVsb3cuCi0JCSAqLwotCQl1c2VyX3BydC0+bGVuZ3RoID0gKHNpemVvZihzdHJ1Y3QgYWNwaV9wY2lfcm91dGluZ190YWJsZSkgLSA0KTsKLQotCQkvKiBFYWNoIGVsZW1lbnQgb2YgdGhlIHRvcC1sZXZlbCBwYWNrYWdlIG11c3QgYWxzbyBiZSBhIHBhY2thZ2UgKi8KLQotCQlpZiAoQUNQSV9HRVRfT0JKRUNUX1RZUEUoKnRvcF9vYmplY3RfbGlzdCkgIT0gQUNQSV9UWVBFX1BBQ0tBR0UpIHsKLQkJCUFDUElfRVJST1IoKEFFX0lORk8sCi0JCQkJICAgICIoUFJUWyVYXSkgTmVlZCBzdWItcGFja2FnZSwgZm91bmQgJXMiLAotCQkJCSAgICBpbmRleCwKLQkJCQkgICAgYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZQotCQkJCSAgICAoKnRvcF9vYmplY3RfbGlzdCkpKTsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfT1BFUkFORF9UWVBFKTsKLQkJfQotCi0JCS8qIEVhY2ggc3ViLXBhY2thZ2UgbXVzdCBiZSBvZiBsZW5ndGggNCAqLwotCi0JCWlmICgoKnRvcF9vYmplY3RfbGlzdCktPnBhY2thZ2UuY291bnQgIT0gNCkgewotCQkJQUNQSV9FUlJPUigoQUVfSU5GTywKLQkJCQkgICAgIihQUlRbJVhdKSBOZWVkIHBhY2thZ2Ugb2YgbGVuZ3RoIDQsIGZvdW5kIGxlbmd0aCAlZCIsCi0JCQkJICAgIGluZGV4LCAoKnRvcF9vYmplY3RfbGlzdCktPnBhY2thZ2UuY291bnQpKTsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfUEFDS0FHRV9MSU1JVCk7Ci0JCX0KLQotCQkvKgotCQkgKiBEZXJlZmVyZW5jZSB0aGUgc3ViLXBhY2thZ2UuCi0JCSAqIFRoZSBzdWJfb2JqZWN0X2xpc3Qgd2lsbCBub3cgcG9pbnQgdG8gYW4gYXJyYXkgb2YgdGhlIGZvdXIgSVJRCi0JCSAqIGVsZW1lbnRzOiBbQWRkcmVzcywgUGluLCBTb3VyY2UsIHNvdXJjZV9pbmRleF0KLQkJICovCi0JCXN1Yl9vYmplY3RfbGlzdCA9ICgqdG9wX29iamVjdF9saXN0KS0+cGFja2FnZS5lbGVtZW50czsKLQotCQkvKiAxKSBGaXJzdCBzdWJvYmplY3Q6IERlcmVmZXJlbmNlIHRoZSBQUlQuQWRkcmVzcyAqLwotCi0JCW9ial9kZXNjID0gc3ViX29iamVjdF9saXN0WzBdOwotCQlpZiAoQUNQSV9HRVRfT0JKRUNUX1RZUEUob2JqX2Rlc2MpICE9IEFDUElfVFlQRV9JTlRFR0VSKSB7Ci0JCQlBQ1BJX0VSUk9SKChBRV9JTkZPLAotCQkJCSAgICAiKFBSVFslWF0uQWRkcmVzcykgTmVlZCBJbnRlZ2VyLCBmb3VuZCAlcyIsCi0JCQkJICAgIGluZGV4LAotCQkJCSAgICBhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lKG9ial9kZXNjKSkpOwotCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9EQVRBKTsKLQkJfQotCi0JCXVzZXJfcHJ0LT5hZGRyZXNzID0gb2JqX2Rlc2MtPmludGVnZXIudmFsdWU7Ci0KLQkJLyogMikgU2Vjb25kIHN1Ym9iamVjdDogRGVyZWZlcmVuY2UgdGhlIFBSVC5QaW4gKi8KLQotCQlvYmpfZGVzYyA9IHN1Yl9vYmplY3RfbGlzdFsxXTsKLQkJaWYgKEFDUElfR0VUX09CSkVDVF9UWVBFKG9ial9kZXNjKSAhPSBBQ1BJX1RZUEVfSU5URUdFUikgewotCQkJQUNQSV9FUlJPUigoQUVfSU5GTywKLQkJCQkgICAgIihQUlRbJVhdLlBpbikgTmVlZCBJbnRlZ2VyLCBmb3VuZCAlcyIsCi0JCQkJICAgIGluZGV4LAotCQkJCSAgICBhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lKG9ial9kZXNjKSkpOwotCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9EQVRBKTsKLQkJfQotCi0JCS8qCi0JCSAqIElmIEJJT1MgZXJyb25lb3VzbHkgcmV2ZXJzZWQgdGhlIF9QUlQgc291cmNlX25hbWUgYW5kIHNvdXJjZV9pbmRleCwKLQkJICogdGhlbiByZXZlcnNlIHRoZW0gYmFjay4KLQkJICovCi0JCWlmIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRShzdWJfb2JqZWN0X2xpc3RbM10pICE9Ci0JCSAgICBBQ1BJX1RZUEVfSU5URUdFUikgewotCQkJaWYgKGFjcGlfZ2JsX2VuYWJsZV9pbnRlcnByZXRlcl9zbGFjaykgewotCQkJCXNvdXJjZV9uYW1lX2luZGV4ID0gMzsKLQkJCQlzb3VyY2VfaW5kZXhfaW5kZXggPSAyOwotCQkJCXByaW50ayhLRVJOX1dBUk5JTkcKLQkJCQkgICAgICAgIkFDUEk6IEhhbmRsaW5nIEdhcmJsZWQgX1BSVCBlbnRyeVxuIik7Ci0JCQl9IGVsc2UgewotCQkJCUFDUElfRVJST1IoKEFFX0lORk8sCi0JCQkJCSAgICAiKFBSVFslWF0uc291cmNlX2luZGV4KSBOZWVkIEludGVnZXIsIGZvdW5kICVzIiwKLQkJCQkJICAgIGluZGV4LAotCQkJCQkgICAgYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZQotCQkJCQkgICAgKHN1Yl9vYmplY3RfbGlzdFszXSkpKTsKLQkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX0RBVEEpOwotCQkJfQotCQl9Ci0KLQkJdXNlcl9wcnQtPnBpbiA9ICh1MzIpIG9ial9kZXNjLT5pbnRlZ2VyLnZhbHVlOwotCi0JCS8qCi0JCSAqIElmIHRoZSBCSU9TIGhhcyBlcnJvbmVvdXNseSByZXZlcnNlZCB0aGUgX1BSVCBzb3VyY2VfbmFtZSAoaW5kZXggMikKLQkJICogYW5kIHRoZSBzb3VyY2VfaW5kZXggKGluZGV4IDMpLCBmaXggaXQuIF9QUlQgaXMgaW1wb3J0YW50IGVub3VnaCB0bwotCQkgKiB3b3JrYXJvdW5kIHRoaXMgQklPUyBlcnJvci4gVGhpcyBhbHNvIHByb3ZpZGVzIGNvbXBhdGliaWxpdHkgd2l0aAotCQkgKiBvdGhlciBBQ1BJIGltcGxlbWVudGF0aW9ucy4KLQkJICovCi0JCW9ial9kZXNjID0gc3ViX29iamVjdF9saXN0WzNdOwotCQlpZiAoIW9ial9kZXNjCi0JCSAgICB8fCAoQUNQSV9HRVRfT0JKRUNUX1RZUEUob2JqX2Rlc2MpICE9IEFDUElfVFlQRV9JTlRFR0VSKSkgewotCQkJc3ViX29iamVjdF9saXN0WzNdID0gc3ViX29iamVjdF9saXN0WzJdOwotCQkJc3ViX29iamVjdF9saXN0WzJdID0gb2JqX2Rlc2M7Ci0KLQkJCUFDUElfV0FSTklORygoQUVfSU5GTywKLQkJCQkgICAgICAiKFBSVFslWF0uU291cmNlKSBTb3VyY2VOYW1lIGFuZCBTb3VyY2VJbmRleCBhcmUgcmV2ZXJzZWQsIGZpeGVkIiwKLQkJCQkgICAgICBpbmRleCkpOwotCQl9Ci0KLQkJLyoKLQkJICogMykgVGhpcmQgc3Vib2JqZWN0OiBEZXJlZmVyZW5jZSB0aGUgUFJULnNvdXJjZV9uYW1lCi0JCSAqIFRoZSBuYW1lIG1heSBiZSB1bnJlc29sdmVkIChzbGFjayBtb2RlKSwgc28gYWxsb3cgYSBudWxsIG9iamVjdAotCQkgKi8KLQkJb2JqX2Rlc2MgPSBzdWJfb2JqZWN0X2xpc3Rbc291cmNlX25hbWVfaW5kZXhdOwotCQlpZiAob2JqX2Rlc2MpIHsKLQkJCXN3aXRjaCAoQUNQSV9HRVRfT0JKRUNUX1RZUEUob2JqX2Rlc2MpKSB7Ci0JCQljYXNlIEFDUElfVFlQRV9MT0NBTF9SRUZFUkVOQ0U6Ci0KLQkJCQlpZiAob2JqX2Rlc2MtPnJlZmVyZW5jZS5jbGFzcyAhPQotCQkJCSAgICBBQ1BJX1JFRkNMQVNTX05BTUUpIHsKLQkJCQkJQUNQSV9FUlJPUigoQUVfSU5GTywKLQkJCQkJCSAgICAiKFBSVFslWF0uU291cmNlKSBOZWVkIG5hbWUsIGZvdW5kIFJlZmVyZW5jZSBDbGFzcyAlWCIsCi0JCQkJCQkgICAgaW5kZXgsCi0JCQkJCQkgICAgb2JqX2Rlc2MtPnJlZmVyZW5jZS5jbGFzcykpOwotCQkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX0RBVEEpOwotCQkJCX0KLQotCQkJCW5vZGUgPSBvYmpfZGVzYy0+cmVmZXJlbmNlLm5vZGU7Ci0KLQkJCQkvKiBVc2UgKnJlbWFpbmluZyogbGVuZ3RoIG9mIHRoZSBidWZmZXIgYXMgbWF4IGZvciBwYXRobmFtZSAqLwotCi0JCQkJcGF0aF9idWZmZXIubGVuZ3RoID0gb3V0cHV0X2J1ZmZlci0+bGVuZ3RoIC0KLQkJCQkgICAgKHUzMikgKCh1OCAqKSB1c2VyX3BydC0+c291cmNlIC0KLQkJCQkJICAgKHU4ICopIG91dHB1dF9idWZmZXItPnBvaW50ZXIpOwotCQkJCXBhdGhfYnVmZmVyLnBvaW50ZXIgPSB1c2VyX3BydC0+c291cmNlOwotCi0JCQkJc3RhdHVzID0KLQkJCQkgICAgYWNwaV9uc19oYW5kbGVfdG9fcGF0aG5hbWUoKGFjcGlfaGFuZGxlKQotCQkJCQkJCSAgICAgICBub2RlLAotCQkJCQkJCSAgICAgICAmcGF0aF9idWZmZXIpOwotCi0JCQkJLyogKzEgdG8gaW5jbHVkZSBudWxsIHRlcm1pbmF0b3IgKi8KLQotCQkJCXVzZXJfcHJ0LT5sZW5ndGggKz0KLQkJCQkgICAgKHUzMikgQUNQSV9TVFJMRU4odXNlcl9wcnQtPnNvdXJjZSkgKyAxOwotCQkJCWJyZWFrOwotCi0JCQljYXNlIEFDUElfVFlQRV9TVFJJTkc6Ci0KLQkJCQlBQ1BJX1NUUkNQWSh1c2VyX3BydC0+c291cmNlLAotCQkJCQkgICAgb2JqX2Rlc2MtPnN0cmluZy5wb2ludGVyKTsKLQotCQkJCS8qCi0JCQkJICogQWRkIHRvIHRoZSBMZW5ndGggZmllbGQgdGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nCi0JCQkJICogKGFkZCAxIGZvciB0ZXJtaW5hdG9yKQotCQkJCSAqLwotCQkJCXVzZXJfcHJ0LT5sZW5ndGggKz0gb2JqX2Rlc2MtPnN0cmluZy5sZW5ndGggKyAxOwotCQkJCWJyZWFrOwotCi0JCQljYXNlIEFDUElfVFlQRV9JTlRFR0VSOgotCQkJCS8qCi0JCQkJICogSWYgdGhpcyBpcyBhIG51bWJlciwgdGhlbiB0aGUgU291cmNlIE5hbWUgaXMgTlVMTCwgc2luY2UgdGhlCi0JCQkJICogZW50aXJlIGJ1ZmZlciB3YXMgemVyb2VkIG91dCwgd2UgY2FuIGxlYXZlIHRoaXMgYWxvbmUuCi0JCQkJICoKLQkJCQkgKiBBZGQgdG8gdGhlIExlbmd0aCBmaWVsZCB0aGUgbGVuZ3RoIG9mIHRoZSB1MzIgTlVMTAotCQkJCSAqLwotCQkJCXVzZXJfcHJ0LT5sZW5ndGggKz0gc2l6ZW9mKHUzMik7Ci0JCQkJYnJlYWs7Ci0KLQkJCWRlZmF1bHQ6Ci0KLQkJCQlBQ1BJX0VSUk9SKChBRV9JTkZPLAotCQkJCQkgICAgIihQUlRbJVhdLlNvdXJjZSkgTmVlZCBSZWYvU3RyaW5nL0ludGVnZXIsIGZvdW5kICVzIiwKLQkJCQkJICAgIGluZGV4LAotCQkJCQkgICAgYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZQotCQkJCQkgICAgKG9ial9kZXNjKSkpOwotCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfREFUQSk7Ci0JCQl9Ci0JCX0KLQotCQkvKiBOb3cgYWxpZ24gdGhlIGN1cnJlbnQgbGVuZ3RoICovCi0KLQkJdXNlcl9wcnQtPmxlbmd0aCA9Ci0JCSAgICAodTMyKSBBQ1BJX1JPVU5EX1VQX1RPXzY0QklUKHVzZXJfcHJ0LT5sZW5ndGgpOwotCi0JCS8qIDQpIEZvdXJ0aCBzdWJvYmplY3Q6IERlcmVmZXJlbmNlIHRoZSBQUlQuc291cmNlX2luZGV4ICovCi0KLQkJb2JqX2Rlc2MgPSBzdWJfb2JqZWN0X2xpc3Rbc291cmNlX2luZGV4X2luZGV4XTsKLQkJaWYgKEFDUElfR0VUX09CSkVDVF9UWVBFKG9ial9kZXNjKSAhPSBBQ1BJX1RZUEVfSU5URUdFUikgewotCQkJQUNQSV9FUlJPUigoQUVfSU5GTywKLQkJCQkgICAgIihQUlRbJVhdLlNvdXJjZUluZGV4KSBOZWVkIEludGVnZXIsIGZvdW5kICVzIiwKLQkJCQkgICAgaW5kZXgsCi0JCQkJICAgIGFjcGlfdXRfZ2V0X29iamVjdF90eXBlX25hbWUob2JqX2Rlc2MpKSk7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX0RBVEEpOwotCQl9Ci0KLQkJdXNlcl9wcnQtPnNvdXJjZV9pbmRleCA9ICh1MzIpIG9ial9kZXNjLT5pbnRlZ2VyLnZhbHVlOwotCi0JCS8qIFBvaW50IHRvIHRoZSBuZXh0IHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgaW4gdGhlIHRvcCBsZXZlbCBwYWNrYWdlICovCi0KLQkJdG9wX29iamVjdF9saXN0Kys7Ci0JfQotCi0JQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLCAiT3V0cHV0QnVmZmVyICVwIExlbmd0aCAlWFxuIiwKLQkJCSAgb3V0cHV0X2J1ZmZlci0+cG9pbnRlciwgKHUzMikgb3V0cHV0X2J1ZmZlci0+bGVuZ3RoKSk7Ci0JcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9yc19jcmVhdGVfYW1sX3Jlc291cmNlcwotICoKLSAqIFBBUkFNRVRFUlM6ICBsaW5rZWRfbGlzdF9idWZmZXIgICAgICAtIFBvaW50ZXIgdG8gdGhlIHJlc291cmNlIGxpbmtlZCBsaXN0Ci0gKiAgICAgICAgICAgICAgb3V0cHV0X2J1ZmZlciAgICAgICAgICAgLSBQb2ludGVyIHRvIHRoZSB1c2VyJ3MgYnVmZmVyCi0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cyAgQUVfT0sgaWYgb2theSwgZWxzZSBhIHZhbGlkIGFjcGlfc3RhdHVzIGNvZGUuCi0gKiAgICAgICAgICAgICAgSWYgdGhlIG91dHB1dF9idWZmZXIgaXMgdG9vIHNtYWxsLCB0aGUgZXJyb3Igd2lsbCBiZQotICogICAgICAgICAgICAgIEFFX0JVRkZFUl9PVkVSRkxPVyBhbmQgb3V0cHV0X2J1ZmZlci0+TGVuZ3RoIHdpbGwgcG9pbnQKLSAqICAgICAgICAgICAgICB0byB0aGUgc2l6ZSBidWZmZXIgbmVlZGVkLgotICoKLSAqIERFU0NSSVBUSU9OOiBUYWtlcyB0aGUgbGlua2VkIGxpc3Qgb2YgZGV2aWNlIHJlc291cmNlcyBhbmQKLSAqICAgICAgICAgICAgICBjcmVhdGVzIGEgYnl0ZXN0cmVhbSB0byBiZSB1c2VkIGFzIGlucHV0IGZvciB0aGUKLSAqICAgICAgICAgICAgICBfU1JTIGNvbnRyb2wgbWV0aG9kLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWFjcGlfc3RhdHVzCi1hY3BpX3JzX2NyZWF0ZV9hbWxfcmVzb3VyY2VzKHN0cnVjdCBhY3BpX3Jlc291cmNlICpsaW5rZWRfbGlzdF9idWZmZXIsCi0JCQkgICAgIHN0cnVjdCBhY3BpX2J1ZmZlciAqb3V0cHV0X2J1ZmZlcikKLXsKLQlhY3BpX3N0YXR1cyBzdGF0dXM7Ci0JYWNwaV9zaXplIGFtbF9zaXplX25lZWRlZCA9IDA7Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKHJzX2NyZWF0ZV9hbWxfcmVzb3VyY2VzKTsKLQotCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgIkxpbmtlZExpc3RCdWZmZXIgPSAlcFxuIiwKLQkJCSAgbGlua2VkX2xpc3RfYnVmZmVyKSk7Ci0KLQkvKgotCSAqIFBhcmFtcyBhbHJlYWR5IHZhbGlkYXRlZCwgc28gd2UgZG9uJ3QgcmUtdmFsaWRhdGUgaGVyZQotCSAqCi0JICogUGFzcyB0aGUgbGlua2VkX2xpc3RfYnVmZmVyIGludG8gYSBtb2R1bGUgdGhhdCBjYWxjdWxhdGVzCi0JICogdGhlIGJ1ZmZlciBzaXplIG5lZWRlZCBmb3IgdGhlIGJ5dGUgc3RyZWFtLgotCSAqLwotCXN0YXR1cyA9IGFjcGlfcnNfZ2V0X2FtbF9sZW5ndGgobGlua2VkX2xpc3RfYnVmZmVyLCAmYW1sX3NpemVfbmVlZGVkKTsKLQotCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgIkFtbFNpemVOZWVkZWQ9JVgsICVzXG4iLAotCQkJICAodTMyKSBhbWxfc2l6ZV9uZWVkZWQsCi0JCQkgIGFjcGlfZm9ybWF0X2V4Y2VwdGlvbihzdGF0dXMpKSk7Ci0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotCX0KLQotCS8qIFZhbGlkYXRlL0FsbG9jYXRlL0NsZWFyIGNhbGxlciBidWZmZXIgKi8KLQotCXN0YXR1cyA9IGFjcGlfdXRfaW5pdGlhbGl6ZV9idWZmZXIob3V0cHV0X2J1ZmZlciwgYW1sX3NpemVfbmVlZGVkKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci0JfQotCi0JLyogRG8gdGhlIGNvbnZlcnNpb24gKi8KLQotCXN0YXR1cyA9Ci0JICAgIGFjcGlfcnNfY29udmVydF9yZXNvdXJjZXNfdG9fYW1sKGxpbmtlZF9saXN0X2J1ZmZlciwKLQkJCQkJICAgICBhbWxfc2l6ZV9uZWVkZWQsCi0JCQkJCSAgICAgb3V0cHV0X2J1ZmZlci0+cG9pbnRlcik7Ci0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotCX0KLQotCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgIk91dHB1dEJ1ZmZlciAlcCBMZW5ndGggJVhcbiIsCi0JCQkgIG91dHB1dF9idWZmZXItPnBvaW50ZXIsICh1MzIpIG91dHB1dF9idWZmZXItPmxlbmd0aCkpOwotCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvcmVzb3VyY2VzL3JzZHVtcC5jIGIvZHJpdmVycy9hY3BpL3Jlc291cmNlcy9yc2R1bXAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmJiYmI3Yi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL2FjcGkvcmVzb3VyY2VzL3JzZHVtcC5jCisrKyAvZGV2L251bGwKQEAgLTEsNzcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogTW9kdWxlIE5hbWU6IHJzZHVtcCAtIEZ1bmN0aW9ucyB0byBkaXNwbGF5IHRoZSByZXNvdXJjZSBzdHJ1Y3R1cmVzLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA4LCBJbnRlbCBDb3JwLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAotICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgYXQgbWluaW11bSBhIGRpc2NsYWltZXIKLSAqICAgIHN1YnN0YW50aWFsbHkgc2ltaWxhciB0byB0aGUgIk5PIFdBUlJBTlRZIiBkaXNjbGFpbWVyIGJlbG93Ci0gKiAgICAoIkRpc2NsYWltZXIiKSBhbmQgYW55IHJlZGlzdHJpYnV0aW9uIG11c3QgYmUgY29uZGl0aW9uZWQgdXBvbgotICogICAgaW5jbHVkaW5nIGEgc3Vic3RhbnRpYWxseSBzaW1pbGFyIERpc2NsYWltZXIgcmVxdWlyZW1lbnQgZm9yIGZ1cnRoZXIKLSAqICAgIGJpbmFyeSByZWRpc3RyaWJ1dGlvbi4KLSAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcwotICogICAgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICogU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBOTyBXQVJSQU5UWQotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCi0gKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUwotICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcKLSAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQotICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgotICovCi0KLSNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KLSNpbmNsdWRlIDxhY3BpL2FjcmVzcmMuaD4KLQotI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfUkVTT1VSQ0VTCi1BQ1BJX01PRFVMRV9OQU1FKCJyc2R1bXAiKQotI2lmIGRlZmluZWQoQUNQSV9ERUJVR19PVVRQVVQpIHx8IGRlZmluZWQoQUNQSV9ERUJVR0dFUikKLS8qIExvY2FsIHByb3RvdHlwZXMgKi8KLXN0YXRpYyB2b2lkIGFjcGlfcnNfb3V0X3N0cmluZyhjaGFyICp0aXRsZSwgY2hhciAqdmFsdWUpOwotCi1zdGF0aWMgdm9pZCBhY3BpX3JzX291dF9pbnRlZ2VyOChjaGFyICp0aXRsZSwgdTggdmFsdWUpOwotCi1zdGF0aWMgdm9pZCBhY3BpX3JzX291dF9pbnRlZ2VyMTYoY2hhciAqdGl0bGUsIHUxNiB2YWx1ZSk7Ci0KLXN0YXRpYyB2b2lkIGFjcGlfcnNfb3V0X2ludGVnZXIzMihjaGFyICp0aXRsZSwgdTMyIHZhbHVlKTsKLQotc3RhdGljIHZvaWQgYWNwaV9yc19vdXRfaW50ZWdlcjY0KGNoYXIgKnRpdGxlLCB1NjQgdmFsdWUpOwotCi1zdGF0aWMgdm9pZCBhY3BpX3JzX291dF90aXRsZShjaGFyICp0aXRsZSk7Ci0KLXN0YXRpYyB2b2lkIGFjcGlfcnNfZHVtcF9ieXRlX2xpc3QodTE2IGxlbmd0aCwgdTggKiBkYXRhKTsKLQotc3RhdGljIHZvaWQgYWNwaV9yc19kdW1wX2R3b3JkX2xpc3QodTggbGVuZ3RoLCB1MzIgKiBkYXRhKTsKLQotc3RhdGljIHZvaWQgYWNwaV9yc19kdW1wX3Nob3J0X2J5dGVfbGlzdCh1OCBsZW5ndGgsIHU4ICogZGF0YSk7Ci0KLXN0YXRpYyB2b2lkCi1hY3BpX3JzX2R1bXBfcmVzb3VyY2Vfc291cmNlKHN0cnVjdCBhY3BpX3Jlc291cmNlX3NvdXJjZSAqcmVzb3VyY2Vfc291cmNlKTsKLQotc3RhdGljIHZvaWQgYWNwaV9yc19kdW1wX2FkZHJlc3NfY29tbW9uKHVuaW9uIGFjcGlfcmVzb3VyY2VfZGF0YSAqcmVzb3VyY2UpOwotCi1zdGF0aWMgdm9pZAotYWNwaV9yc19kdW1wX2Rlc2NyaXB0b3Iodm9pZCAqcmVzb3VyY2UsIHN0cnVjdCBhY3BpX3JzZHVtcF9pbmZvICp0YWJsZSk7Ci0KLSNkZWZpbmUgQUNQSV9SU0RfT0ZGU0VUKGYpICAgICAgICAgICh1OCkgQUNQSV9PRkZTRVQgKHVuaW9uIGFjcGlfcmVzb3VyY2VfZGF0YSxmKQotI2RlZmluZSBBQ1BJX1BSVF9PRkZTRVQoZikgICAgICAgICAgKHU4KSBBQ1BJX09GRlNFVCAoc3RydWN0IGFjcGlfcGNpX3JvdXRpbmdfdGFibGUsZikKLSNkZWZpbmUgQUNQSV9SU0RfVEFCTEVfU0laRShuYW1lKSAgIChzaXplb2YobmFtZSkgLyBzaXplb2YgKHN0cnVjdCBhY3BpX3JzZHVtcF9pbmZvKSkKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBSZXNvdXJjZSBEZXNjcmlwdG9yIGluZm8gdGFibGVzCi0gKgotICogTm90ZTogVGhlIGZpcnN0IHRhYmxlIGVudHJ5IG11c3QgYmUgYSBUaXRsZSBvciBMaXRlcmFsIGFuZCBtdXN0IGNvbnRhaW4KLSAqIHRoZSB0YWJsZSBsZW5ndGggKG51bWJlciBvZiB0YWJsZSBlbnRyaWVzKQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0cnVjdCBhY3BpX3JzZHVtcF9pbmZvIGFjcGlfcnNfZHVtcF9pcnFbN10gPSB7Ci0Je0FDUElfUlNEX1RJVExFLCBBQ1BJX1JTRF9UQUJMRV9TSVpFKGFjcGlfcnNfZHVtcF9pcnEpLCAiSVJRIiwgTlVMTH0sCi0Je0FDUElfUlNEX1VJTlQ4LCBBQ1BJX1JTRF9PRkZTRVQoaXJxLmRlc2NyaXB0b3JfbGVuZ3RoKSwKLQkgIkRlc2NyaXB0b3IgTGVuZ3RoIiwgTlVMTH0sCi0Je0FDUElfUlNEXzFCSVRGTEFHLCBBQ1BJX1JTRF9PRkZTRVQoaXJxLnRyaWdnZXJpbmcpLCAiVHJpZ2dlcmluZyIsCi0JIGFjcGlfZ2JsX2hlX2RlY29kZX0sCi0Je0FDUElfUlNEXzFCSVRGTEFHLCBBQ1BJX1JTRF9PRkZTRVQoaXJxLnBvbGFyaXR5KSwgIlBvbGFyaXR5IiwKLQkgYWNwaV9nYmxfbGxfZGVjb2RlfSwKLQl7QUNQSV9SU0RfMUJJVEZMQUcsIEFDUElfUlNEX09GRlNFVChpcnEuc2hhcmFibGUpLCAiU2hhcmluZyIsCi0JIGFjcGlfZ2JsX3Nocl9kZWNvZGV9LAotCXtBQ1BJX1JTRF9VSU5UOCwgQUNQSV9SU0RfT0ZGU0VUKGlycS5pbnRlcnJ1cHRfY291bnQpLAotCSAiSW50ZXJydXB0IENvdW50IiwgTlVMTH0sCi0Je0FDUElfUlNEX1NIT1JUTElTVCwgQUNQSV9SU0RfT0ZGU0VUKGlycS5pbnRlcnJ1cHRzWzBdKSwKLQkgIkludGVycnVwdCBMaXN0IiwgTlVMTH0KLX07Ci0KLXN0cnVjdCBhY3BpX3JzZHVtcF9pbmZvIGFjcGlfcnNfZHVtcF9kbWFbNl0gPSB7Ci0Je0FDUElfUlNEX1RJVExFLCBBQ1BJX1JTRF9UQUJMRV9TSVpFKGFjcGlfcnNfZHVtcF9kbWEpLCAiRE1BIiwgTlVMTH0sCi0Je0FDUElfUlNEXzJCSVRGTEFHLCBBQ1BJX1JTRF9PRkZTRVQoZG1hLnR5cGUpLCAiU3BlZWQiLAotCSBhY3BpX2dibF90eXBfZGVjb2RlfSwKLQl7QUNQSV9SU0RfMUJJVEZMQUcsIEFDUElfUlNEX09GRlNFVChkbWEuYnVzX21hc3RlciksICJNYXN0ZXJpbmciLAotCSBhY3BpX2dibF9ibV9kZWNvZGV9LAotCXtBQ1BJX1JTRF8yQklURkxBRywgQUNQSV9SU0RfT0ZGU0VUKGRtYS50cmFuc2ZlciksICJUcmFuc2ZlciBUeXBlIiwKLQkgYWNwaV9nYmxfc2l6X2RlY29kZX0sCi0Je0FDUElfUlNEX1VJTlQ4LCBBQ1BJX1JTRF9PRkZTRVQoZG1hLmNoYW5uZWxfY291bnQpLCAiQ2hhbm5lbCBDb3VudCIsCi0JIE5VTEx9LAotCXtBQ1BJX1JTRF9TSE9SVExJU1QsIEFDUElfUlNEX09GRlNFVChkbWEuY2hhbm5lbHNbMF0pLCAiQ2hhbm5lbCBMaXN0IiwKLQkgTlVMTH0KLX07Ci0KLXN0cnVjdCBhY3BpX3JzZHVtcF9pbmZvIGFjcGlfcnNfZHVtcF9zdGFydF9kcGZbNF0gPSB7Ci0Je0FDUElfUlNEX1RJVExFLCBBQ1BJX1JTRF9UQUJMRV9TSVpFKGFjcGlfcnNfZHVtcF9zdGFydF9kcGYpLAotCSAiU3RhcnQtRGVwZW5kZW50LUZ1bmN0aW9ucyIsIE5VTEx9LAotCXtBQ1BJX1JTRF9VSU5UOCwgQUNQSV9SU0RfT0ZGU0VUKHN0YXJ0X2RwZi5kZXNjcmlwdG9yX2xlbmd0aCksCi0JICJEZXNjcmlwdG9yIExlbmd0aCIsIE5VTEx9LAotCXtBQ1BJX1JTRF8yQklURkxBRywgQUNQSV9SU0RfT0ZGU0VUKHN0YXJ0X2RwZi5jb21wYXRpYmlsaXR5X3ByaW9yaXR5KSwKLQkgIkNvbXBhdGliaWxpdHkgUHJpb3JpdHkiLCBhY3BpX2dibF9jb25maWdfZGVjb2RlfSwKLQl7QUNQSV9SU0RfMkJJVEZMQUcsIEFDUElfUlNEX09GRlNFVChzdGFydF9kcGYucGVyZm9ybWFuY2Vfcm9idXN0bmVzcyksCi0JICJQZXJmb3JtYW5jZS9Sb2J1c3RuZXNzIiwgYWNwaV9nYmxfY29uZmlnX2RlY29kZX0KLX07Ci0KLXN0cnVjdCBhY3BpX3JzZHVtcF9pbmZvIGFjcGlfcnNfZHVtcF9lbmRfZHBmWzFdID0gewotCXtBQ1BJX1JTRF9USVRMRSwgQUNQSV9SU0RfVEFCTEVfU0laRShhY3BpX3JzX2R1bXBfZW5kX2RwZiksCi0JICJFbmQtRGVwZW5kZW50LUZ1bmN0aW9ucyIsIE5VTEx9Ci19OwotCi1zdHJ1Y3QgYWNwaV9yc2R1bXBfaW5mbyBhY3BpX3JzX2R1bXBfaW9bNl0gPSB7Ci0Je0FDUElfUlNEX1RJVExFLCBBQ1BJX1JTRF9UQUJMRV9TSVpFKGFjcGlfcnNfZHVtcF9pbyksICJJL08iLCBOVUxMfSwKLQl7QUNQSV9SU0RfMUJJVEZMQUcsIEFDUElfUlNEX09GRlNFVChpby5pb19kZWNvZGUpLCAiQWRkcmVzcyBEZWNvZGluZyIsCi0JIGFjcGlfZ2JsX2lvX2RlY29kZX0sCi0Je0FDUElfUlNEX1VJTlQxNiwgQUNQSV9SU0RfT0ZGU0VUKGlvLm1pbmltdW0pLCAiQWRkcmVzcyBNaW5pbXVtIiwgTlVMTH0sCi0Je0FDUElfUlNEX1VJTlQxNiwgQUNQSV9SU0RfT0ZGU0VUKGlvLm1heGltdW0pLCAiQWRkcmVzcyBNYXhpbXVtIiwgTlVMTH0sCi0Je0FDUElfUlNEX1VJTlQ4LCBBQ1BJX1JTRF9PRkZTRVQoaW8uYWxpZ25tZW50KSwgIkFsaWdubWVudCIsIE5VTEx9LAotCXtBQ1BJX1JTRF9VSU5UOCwgQUNQSV9SU0RfT0ZGU0VUKGlvLmFkZHJlc3NfbGVuZ3RoKSwgIkFkZHJlc3MgTGVuZ3RoIiwKLQkgTlVMTH0KLX07Ci0KLXN0cnVjdCBhY3BpX3JzZHVtcF9pbmZvIGFjcGlfcnNfZHVtcF9maXhlZF9pb1szXSA9IHsKLQl7QUNQSV9SU0RfVElUTEUsIEFDUElfUlNEX1RBQkxFX1NJWkUoYWNwaV9yc19kdW1wX2ZpeGVkX2lvKSwKLQkgIkZpeGVkIEkvTyIsIE5VTEx9LAotCXtBQ1BJX1JTRF9VSU5UMTYsIEFDUElfUlNEX09GRlNFVChmaXhlZF9pby5hZGRyZXNzKSwgIkFkZHJlc3MiLCBOVUxMfSwKLQl7QUNQSV9SU0RfVUlOVDgsIEFDUElfUlNEX09GRlNFVChmaXhlZF9pby5hZGRyZXNzX2xlbmd0aCksCi0JICJBZGRyZXNzIExlbmd0aCIsIE5VTEx9Ci19OwotCi1zdHJ1Y3QgYWNwaV9yc2R1bXBfaW5mbyBhY3BpX3JzX2R1bXBfdmVuZG9yWzNdID0gewotCXtBQ1BJX1JTRF9USVRMRSwgQUNQSV9SU0RfVEFCTEVfU0laRShhY3BpX3JzX2R1bXBfdmVuZG9yKSwKLQkgIlZlbmRvciBTcGVjaWZpYyIsIE5VTEx9LAotCXtBQ1BJX1JTRF9VSU5UMTYsIEFDUElfUlNEX09GRlNFVCh2ZW5kb3IuYnl0ZV9sZW5ndGgpLCAiTGVuZ3RoIiwgTlVMTH0sCi0Je0FDUElfUlNEX0xPTkdMSVNULCBBQ1BJX1JTRF9PRkZTRVQodmVuZG9yLmJ5dGVfZGF0YVswXSksICJWZW5kb3IgRGF0YSIsCi0JIE5VTEx9Ci19OwotCi1zdHJ1Y3QgYWNwaV9yc2R1bXBfaW5mbyBhY3BpX3JzX2R1bXBfZW5kX3RhZ1sxXSA9IHsKLQl7QUNQSV9SU0RfVElUTEUsIEFDUElfUlNEX1RBQkxFX1NJWkUoYWNwaV9yc19kdW1wX2VuZF90YWcpLCAiRW5kVGFnIiwKLQkgTlVMTH0KLX07Ci0KLXN0cnVjdCBhY3BpX3JzZHVtcF9pbmZvIGFjcGlfcnNfZHVtcF9tZW1vcnkyNFs2XSA9IHsKLQl7QUNQSV9SU0RfVElUTEUsIEFDUElfUlNEX1RBQkxFX1NJWkUoYWNwaV9yc19kdW1wX21lbW9yeTI0KSwKLQkgIjI0LUJpdCBNZW1vcnkgUmFuZ2UiLCBOVUxMfSwKLQl7QUNQSV9SU0RfMUJJVEZMQUcsIEFDUElfUlNEX09GRlNFVChtZW1vcnkyNC53cml0ZV9wcm90ZWN0KSwKLQkgIldyaXRlIFByb3RlY3QiLCBhY3BpX2dibF9yd19kZWNvZGV9LAotCXtBQ1BJX1JTRF9VSU5UMTYsIEFDUElfUlNEX09GRlNFVChtZW1vcnkyNC5taW5pbXVtKSwgIkFkZHJlc3MgTWluaW11bSIsCi0JIE5VTEx9LAotCXtBQ1BJX1JTRF9VSU5UMTYsIEFDUElfUlNEX09GRlNFVChtZW1vcnkyNC5tYXhpbXVtKSwgIkFkZHJlc3MgTWF4aW11bSIsCi0JIE5VTEx9LAotCXtBQ1BJX1JTRF9VSU5UMTYsIEFDUElfUlNEX09GRlNFVChtZW1vcnkyNC5hbGlnbm1lbnQpLCAiQWxpZ25tZW50IiwKLQkgTlVMTH0sCi0Je0FDUElfUlNEX1VJTlQxNiwgQUNQSV9SU0RfT0ZGU0VUKG1lbW9yeTI0LmFkZHJlc3NfbGVuZ3RoKSwKLQkgIkFkZHJlc3MgTGVuZ3RoIiwgTlVMTH0KLX07Ci0KLXN0cnVjdCBhY3BpX3JzZHVtcF9pbmZvIGFjcGlfcnNfZHVtcF9tZW1vcnkzMls2XSA9IHsKLQl7QUNQSV9SU0RfVElUTEUsIEFDUElfUlNEX1RBQkxFX1NJWkUoYWNwaV9yc19kdW1wX21lbW9yeTMyKSwKLQkgIjMyLUJpdCBNZW1vcnkgUmFuZ2UiLCBOVUxMfSwKLQl7QUNQSV9SU0RfMUJJVEZMQUcsIEFDUElfUlNEX09GRlNFVChtZW1vcnkzMi53cml0ZV9wcm90ZWN0KSwKLQkgIldyaXRlIFByb3RlY3QiLCBhY3BpX2dibF9yd19kZWNvZGV9LAotCXtBQ1BJX1JTRF9VSU5UMzIsIEFDUElfUlNEX09GRlNFVChtZW1vcnkzMi5taW5pbXVtKSwgIkFkZHJlc3MgTWluaW11bSIsCi0JIE5VTEx9LAotCXtBQ1BJX1JTRF9VSU5UMzIsIEFDUElfUlNEX09GRlNFVChtZW1vcnkzMi5tYXhpbXVtKSwgIkFkZHJlc3MgTWF4aW11bSIsCi0JIE5VTEx9LAotCXtBQ1BJX1JTRF9VSU5UMzIsIEFDUElfUlNEX09GRlNFVChtZW1vcnkzMi5hbGlnbm1lbnQpLCAiQWxpZ25tZW50IiwKLQkgTlVMTH0sCi0Je0FDUElfUlNEX1VJTlQzMiwgQUNQSV9SU0RfT0ZGU0VUKG1lbW9yeTMyLmFkZHJlc3NfbGVuZ3RoKSwKLQkgIkFkZHJlc3MgTGVuZ3RoIiwgTlVMTH0KLX07Ci0KLXN0cnVjdCBhY3BpX3JzZHVtcF9pbmZvIGFjcGlfcnNfZHVtcF9maXhlZF9tZW1vcnkzMls0XSA9IHsKLQl7QUNQSV9SU0RfVElUTEUsIEFDUElfUlNEX1RBQkxFX1NJWkUoYWNwaV9yc19kdW1wX2ZpeGVkX21lbW9yeTMyKSwKLQkgIjMyLUJpdCBGaXhlZCBNZW1vcnkgUmFuZ2UiLCBOVUxMfSwKLQl7QUNQSV9SU0RfMUJJVEZMQUcsIEFDUElfUlNEX09GRlNFVChmaXhlZF9tZW1vcnkzMi53cml0ZV9wcm90ZWN0KSwKLQkgIldyaXRlIFByb3RlY3QiLCBhY3BpX2dibF9yd19kZWNvZGV9LAotCXtBQ1BJX1JTRF9VSU5UMzIsIEFDUElfUlNEX09GRlNFVChmaXhlZF9tZW1vcnkzMi5hZGRyZXNzKSwgIkFkZHJlc3MiLAotCSBOVUxMfSwKLQl7QUNQSV9SU0RfVUlOVDMyLCBBQ1BJX1JTRF9PRkZTRVQoZml4ZWRfbWVtb3J5MzIuYWRkcmVzc19sZW5ndGgpLAotCSAiQWRkcmVzcyBMZW5ndGgiLCBOVUxMfQotfTsKLQotc3RydWN0IGFjcGlfcnNkdW1wX2luZm8gYWNwaV9yc19kdW1wX2FkZHJlc3MxNls4XSA9IHsKLQl7QUNQSV9SU0RfVElUTEUsIEFDUElfUlNEX1RBQkxFX1NJWkUoYWNwaV9yc19kdW1wX2FkZHJlc3MxNiksCi0JICIxNi1CaXQgV09SRCBBZGRyZXNzIFNwYWNlIiwgTlVMTH0sCi0Je0FDUElfUlNEX0FERFJFU1MsIDAsIE5VTEwsIE5VTEx9LAotCXtBQ1BJX1JTRF9VSU5UMTYsIEFDUElfUlNEX09GRlNFVChhZGRyZXNzMTYuZ3JhbnVsYXJpdHkpLCAiR3JhbnVsYXJpdHkiLAotCSBOVUxMfSwKLQl7QUNQSV9SU0RfVUlOVDE2LCBBQ1BJX1JTRF9PRkZTRVQoYWRkcmVzczE2Lm1pbmltdW0pLCAiQWRkcmVzcyBNaW5pbXVtIiwKLQkgTlVMTH0sCi0Je0FDUElfUlNEX1VJTlQxNiwgQUNQSV9SU0RfT0ZGU0VUKGFkZHJlc3MxNi5tYXhpbXVtKSwgIkFkZHJlc3MgTWF4aW11bSIsCi0JIE5VTEx9LAotCXtBQ1BJX1JTRF9VSU5UMTYsIEFDUElfUlNEX09GRlNFVChhZGRyZXNzMTYudHJhbnNsYXRpb25fb2Zmc2V0KSwKLQkgIlRyYW5zbGF0aW9uIE9mZnNldCIsIE5VTEx9LAotCXtBQ1BJX1JTRF9VSU5UMTYsIEFDUElfUlNEX09GRlNFVChhZGRyZXNzMTYuYWRkcmVzc19sZW5ndGgpLAotCSAiQWRkcmVzcyBMZW5ndGgiLCBOVUxMfSwKLQl7QUNQSV9SU0RfU09VUkNFLCBBQ1BJX1JTRF9PRkZTRVQoYWRkcmVzczE2LnJlc291cmNlX3NvdXJjZSksIE5VTEwsIE5VTEx9Ci19OwotCi1zdHJ1Y3QgYWNwaV9yc2R1bXBfaW5mbyBhY3BpX3JzX2R1bXBfYWRkcmVzczMyWzhdID0gewotCXtBQ1BJX1JTRF9USVRMRSwgQUNQSV9SU0RfVEFCTEVfU0laRShhY3BpX3JzX2R1bXBfYWRkcmVzczMyKSwKLQkgIjMyLUJpdCBEV09SRCBBZGRyZXNzIFNwYWNlIiwgTlVMTH0sCi0Je0FDUElfUlNEX0FERFJFU1MsIDAsIE5VTEwsIE5VTEx9LAotCXtBQ1BJX1JTRF9VSU5UMzIsIEFDUElfUlNEX09GRlNFVChhZGRyZXNzMzIuZ3JhbnVsYXJpdHkpLCAiR3JhbnVsYXJpdHkiLAotCSBOVUxMfSwKLQl7QUNQSV9SU0RfVUlOVDMyLCBBQ1BJX1JTRF9PRkZTRVQoYWRkcmVzczMyLm1pbmltdW0pLCAiQWRkcmVzcyBNaW5pbXVtIiwKLQkgTlVMTH0sCi0Je0FDUElfUlNEX1VJTlQzMiwgQUNQSV9SU0RfT0ZGU0VUKGFkZHJlc3MzMi5tYXhpbXVtKSwgIkFkZHJlc3MgTWF4aW11bSIsCi0JIE5VTEx9LAotCXtBQ1BJX1JTRF9VSU5UMzIsIEFDUElfUlNEX09GRlNFVChhZGRyZXNzMzIudHJhbnNsYXRpb25fb2Zmc2V0KSwKLQkgIlRyYW5zbGF0aW9uIE9mZnNldCIsIE5VTEx9LAotCXtBQ1BJX1JTRF9VSU5UMzIsIEFDUElfUlNEX09GRlNFVChhZGRyZXNzMzIuYWRkcmVzc19sZW5ndGgpLAotCSAiQWRkcmVzcyBMZW5ndGgiLCBOVUxMfSwKLQl7QUNQSV9SU0RfU09VUkNFLCBBQ1BJX1JTRF9PRkZTRVQoYWRkcmVzczMyLnJlc291cmNlX3NvdXJjZSksIE5VTEwsIE5VTEx9Ci19OwotCi1zdHJ1Y3QgYWNwaV9yc2R1bXBfaW5mbyBhY3BpX3JzX2R1bXBfYWRkcmVzczY0WzhdID0gewotCXtBQ1BJX1JTRF9USVRMRSwgQUNQSV9SU0RfVEFCTEVfU0laRShhY3BpX3JzX2R1bXBfYWRkcmVzczY0KSwKLQkgIjY0LUJpdCBRV09SRCBBZGRyZXNzIFNwYWNlIiwgTlVMTH0sCi0Je0FDUElfUlNEX0FERFJFU1MsIDAsIE5VTEwsIE5VTEx9LAotCXtBQ1BJX1JTRF9VSU5UNjQsIEFDUElfUlNEX09GRlNFVChhZGRyZXNzNjQuZ3JhbnVsYXJpdHkpLCAiR3JhbnVsYXJpdHkiLAotCSBOVUxMfSwKLQl7QUNQSV9SU0RfVUlOVDY0LCBBQ1BJX1JTRF9PRkZTRVQoYWRkcmVzczY0Lm1pbmltdW0pLCAiQWRkcmVzcyBNaW5pbXVtIiwKLQkgTlVMTH0sCi0Je0FDUElfUlNEX1VJTlQ2NCwgQUNQSV9SU0RfT0ZGU0VUKGFkZHJlc3M2NC5tYXhpbXVtKSwgIkFkZHJlc3MgTWF4aW11bSIsCi0JIE5VTEx9LAotCXtBQ1BJX1JTRF9VSU5UNjQsIEFDUElfUlNEX09GRlNFVChhZGRyZXNzNjQudHJhbnNsYXRpb25fb2Zmc2V0KSwKLQkgIlRyYW5zbGF0aW9uIE9mZnNldCIsIE5VTEx9LAotCXtBQ1BJX1JTRF9VSU5UNjQsIEFDUElfUlNEX09GRlNFVChhZGRyZXNzNjQuYWRkcmVzc19sZW5ndGgpLAotCSAiQWRkcmVzcyBMZW5ndGgiLCBOVUxMfSwKLQl7QUNQSV9SU0RfU09VUkNFLCBBQ1BJX1JTRF9PRkZTRVQoYWRkcmVzczY0LnJlc291cmNlX3NvdXJjZSksIE5VTEwsIE5VTEx9Ci19OwotCi1zdHJ1Y3QgYWNwaV9yc2R1bXBfaW5mbyBhY3BpX3JzX2R1bXBfZXh0X2FkZHJlc3M2NFs4XSA9IHsKLQl7QUNQSV9SU0RfVElUTEUsIEFDUElfUlNEX1RBQkxFX1NJWkUoYWNwaV9yc19kdW1wX2V4dF9hZGRyZXNzNjQpLAotCSAiNjQtQml0IEV4dGVuZGVkIEFkZHJlc3MgU3BhY2UiLCBOVUxMfSwKLQl7QUNQSV9SU0RfQUREUkVTUywgMCwgTlVMTCwgTlVMTH0sCi0Je0FDUElfUlNEX1VJTlQ2NCwgQUNQSV9SU0RfT0ZGU0VUKGV4dF9hZGRyZXNzNjQuZ3JhbnVsYXJpdHkpLAotCSAiR3JhbnVsYXJpdHkiLCBOVUxMfSwKLQl7QUNQSV9SU0RfVUlOVDY0LCBBQ1BJX1JTRF9PRkZTRVQoZXh0X2FkZHJlc3M2NC5taW5pbXVtKSwKLQkgIkFkZHJlc3MgTWluaW11bSIsIE5VTEx9LAotCXtBQ1BJX1JTRF9VSU5UNjQsIEFDUElfUlNEX09GRlNFVChleHRfYWRkcmVzczY0Lm1heGltdW0pLAotCSAiQWRkcmVzcyBNYXhpbXVtIiwgTlVMTH0sCi0Je0FDUElfUlNEX1VJTlQ2NCwgQUNQSV9SU0RfT0ZGU0VUKGV4dF9hZGRyZXNzNjQudHJhbnNsYXRpb25fb2Zmc2V0KSwKLQkgIlRyYW5zbGF0aW9uIE9mZnNldCIsIE5VTEx9LAotCXtBQ1BJX1JTRF9VSU5UNjQsIEFDUElfUlNEX09GRlNFVChleHRfYWRkcmVzczY0LmFkZHJlc3NfbGVuZ3RoKSwKLQkgIkFkZHJlc3MgTGVuZ3RoIiwgTlVMTH0sCi0Je0FDUElfUlNEX1VJTlQ2NCwgQUNQSV9SU0RfT0ZGU0VUKGV4dF9hZGRyZXNzNjQudHlwZV9zcGVjaWZpYyksCi0JICJUeXBlLVNwZWNpZmljIEF0dHJpYnV0ZSIsIE5VTEx9Ci19OwotCi1zdHJ1Y3QgYWNwaV9yc2R1bXBfaW5mbyBhY3BpX3JzX2R1bXBfZXh0X2lycVs4XSA9IHsKLQl7QUNQSV9SU0RfVElUTEUsIEFDUElfUlNEX1RBQkxFX1NJWkUoYWNwaV9yc19kdW1wX2V4dF9pcnEpLAotCSAiRXh0ZW5kZWQgSVJRIiwgTlVMTH0sCi0Je0FDUElfUlNEXzFCSVRGTEFHLCBBQ1BJX1JTRF9PRkZTRVQoZXh0ZW5kZWRfaXJxLnByb2R1Y2VyX2NvbnN1bWVyKSwKLQkgIlR5cGUiLCBhY3BpX2dibF9jb25zdW1lX2RlY29kZX0sCi0Je0FDUElfUlNEXzFCSVRGTEFHLCBBQ1BJX1JTRF9PRkZTRVQoZXh0ZW5kZWRfaXJxLnRyaWdnZXJpbmcpLAotCSAiVHJpZ2dlcmluZyIsIGFjcGlfZ2JsX2hlX2RlY29kZX0sCi0Je0FDUElfUlNEXzFCSVRGTEFHLCBBQ1BJX1JTRF9PRkZTRVQoZXh0ZW5kZWRfaXJxLnBvbGFyaXR5KSwgIlBvbGFyaXR5IiwKLQkgYWNwaV9nYmxfbGxfZGVjb2RlfSwKLQl7QUNQSV9SU0RfMUJJVEZMQUcsIEFDUElfUlNEX09GRlNFVChleHRlbmRlZF9pcnEuc2hhcmFibGUpLCAiU2hhcmluZyIsCi0JIGFjcGlfZ2JsX3Nocl9kZWNvZGV9LAotCXtBQ1BJX1JTRF9TT1VSQ0UsIEFDUElfUlNEX09GRlNFVChleHRlbmRlZF9pcnEucmVzb3VyY2Vfc291cmNlKSwgTlVMTCwKLQkgTlVMTH0sCi0Je0FDUElfUlNEX1VJTlQ4LCBBQ1BJX1JTRF9PRkZTRVQoZXh0ZW5kZWRfaXJxLmludGVycnVwdF9jb3VudCksCi0JICJJbnRlcnJ1cHQgQ291bnQiLCBOVUxMfSwKLQl7QUNQSV9SU0RfRFdPUkRMSVNULCBBQ1BJX1JTRF9PRkZTRVQoZXh0ZW5kZWRfaXJxLmludGVycnVwdHNbMF0pLAotCSAiSW50ZXJydXB0IExpc3QiLCBOVUxMfQotfTsKLQotc3RydWN0IGFjcGlfcnNkdW1wX2luZm8gYWNwaV9yc19kdW1wX2dlbmVyaWNfcmVnWzZdID0gewotCXtBQ1BJX1JTRF9USVRMRSwgQUNQSV9SU0RfVEFCTEVfU0laRShhY3BpX3JzX2R1bXBfZ2VuZXJpY19yZWcpLAotCSAiR2VuZXJpYyBSZWdpc3RlciIsIE5VTEx9LAotCXtBQ1BJX1JTRF9VSU5UOCwgQUNQSV9SU0RfT0ZGU0VUKGdlbmVyaWNfcmVnLnNwYWNlX2lkKSwgIlNwYWNlIElEIiwKLQkgTlVMTH0sCi0Je0FDUElfUlNEX1VJTlQ4LCBBQ1BJX1JTRF9PRkZTRVQoZ2VuZXJpY19yZWcuYml0X3dpZHRoKSwgIkJpdCBXaWR0aCIsCi0JIE5VTEx9LAotCXtBQ1BJX1JTRF9VSU5UOCwgQUNQSV9SU0RfT0ZGU0VUKGdlbmVyaWNfcmVnLmJpdF9vZmZzZXQpLCAiQml0IE9mZnNldCIsCi0JIE5VTEx9LAotCXtBQ1BJX1JTRF9VSU5UOCwgQUNQSV9SU0RfT0ZGU0VUKGdlbmVyaWNfcmVnLmFjY2Vzc19zaXplKSwKLQkgIkFjY2VzcyBTaXplIiwgTlVMTH0sCi0Je0FDUElfUlNEX1VJTlQ2NCwgQUNQSV9SU0RfT0ZGU0VUKGdlbmVyaWNfcmVnLmFkZHJlc3MpLCAiQWRkcmVzcyIsIE5VTEx9Ci19OwotCi0vKgotICogVGFibGVzIHVzZWQgZm9yIGNvbW1vbiBhZGRyZXNzIGRlc2NyaXB0b3IgZmxhZyBmaWVsZHMKLSAqLwotc3RhdGljIHN0cnVjdCBhY3BpX3JzZHVtcF9pbmZvIGFjcGlfcnNfZHVtcF9nZW5lcmFsX2ZsYWdzWzVdID0gewotCXtBQ1BJX1JTRF9USVRMRSwgQUNQSV9SU0RfVEFCTEVfU0laRShhY3BpX3JzX2R1bXBfZ2VuZXJhbF9mbGFncyksIE5VTEwsCi0JIE5VTEx9LAotCXtBQ1BJX1JTRF8xQklURkxBRywgQUNQSV9SU0RfT0ZGU0VUKGFkZHJlc3MucHJvZHVjZXJfY29uc3VtZXIpLAotCSAiQ29uc3VtZXIvUHJvZHVjZXIiLCBhY3BpX2dibF9jb25zdW1lX2RlY29kZX0sCi0Je0FDUElfUlNEXzFCSVRGTEFHLCBBQ1BJX1JTRF9PRkZTRVQoYWRkcmVzcy5kZWNvZGUpLCAiQWRkcmVzcyBEZWNvZGUiLAotCSBhY3BpX2dibF9kZWNfZGVjb2RlfSwKLQl7QUNQSV9SU0RfMUJJVEZMQUcsIEFDUElfUlNEX09GRlNFVChhZGRyZXNzLm1pbl9hZGRyZXNzX2ZpeGVkKSwKLQkgIk1pbiBSZWxvY2F0YWJpbGl0eSIsIGFjcGlfZ2JsX21pbl9kZWNvZGV9LAotCXtBQ1BJX1JTRF8xQklURkxBRywgQUNQSV9SU0RfT0ZGU0VUKGFkZHJlc3MubWF4X2FkZHJlc3NfZml4ZWQpLAotCSAiTWF4IFJlbG9jYXRhYmlsaXR5IiwgYWNwaV9nYmxfbWF4X2RlY29kZX0KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYWNwaV9yc2R1bXBfaW5mbyBhY3BpX3JzX2R1bXBfbWVtb3J5X2ZsYWdzWzVdID0gewotCXtBQ1BJX1JTRF9MSVRFUkFMLCBBQ1BJX1JTRF9UQUJMRV9TSVpFKGFjcGlfcnNfZHVtcF9tZW1vcnlfZmxhZ3MpLAotCSAiUmVzb3VyY2UgVHlwZSIsICh2b2lkICopIk1lbW9yeSBSYW5nZSJ9LAotCXtBQ1BJX1JTRF8xQklURkxBRywgQUNQSV9SU0RfT0ZGU0VUKGFkZHJlc3MuaW5mby5tZW0ud3JpdGVfcHJvdGVjdCksCi0JICJXcml0ZSBQcm90ZWN0IiwgYWNwaV9nYmxfcndfZGVjb2RlfSwKLQl7QUNQSV9SU0RfMkJJVEZMQUcsIEFDUElfUlNEX09GRlNFVChhZGRyZXNzLmluZm8ubWVtLmNhY2hpbmcpLAotCSAiQ2FjaGluZyIsIGFjcGlfZ2JsX21lbV9kZWNvZGV9LAotCXtBQ1BJX1JTRF8yQklURkxBRywgQUNQSV9SU0RfT0ZGU0VUKGFkZHJlc3MuaW5mby5tZW0ucmFuZ2VfdHlwZSksCi0JICJSYW5nZSBUeXBlIiwgYWNwaV9nYmxfbXRwX2RlY29kZX0sCi0Je0FDUElfUlNEXzFCSVRGTEFHLCBBQ1BJX1JTRF9PRkZTRVQoYWRkcmVzcy5pbmZvLm1lbS50cmFuc2xhdGlvbiksCi0JICJUcmFuc2xhdGlvbiIsIGFjcGlfZ2JsX3R0cF9kZWNvZGV9Ci19OwotCi1zdGF0aWMgc3RydWN0IGFjcGlfcnNkdW1wX2luZm8gYWNwaV9yc19kdW1wX2lvX2ZsYWdzWzRdID0gewotCXtBQ1BJX1JTRF9MSVRFUkFMLCBBQ1BJX1JTRF9UQUJMRV9TSVpFKGFjcGlfcnNfZHVtcF9pb19mbGFncyksCi0JICJSZXNvdXJjZSBUeXBlIiwgKHZvaWQgKikiSS9PIFJhbmdlIn0sCi0Je0FDUElfUlNEXzJCSVRGTEFHLCBBQ1BJX1JTRF9PRkZTRVQoYWRkcmVzcy5pbmZvLmlvLnJhbmdlX3R5cGUpLAotCSAiUmFuZ2UgVHlwZSIsIGFjcGlfZ2JsX3JuZ19kZWNvZGV9LAotCXtBQ1BJX1JTRF8xQklURkxBRywgQUNQSV9SU0RfT0ZGU0VUKGFkZHJlc3MuaW5mby5pby50cmFuc2xhdGlvbiksCi0JICJUcmFuc2xhdGlvbiIsIGFjcGlfZ2JsX3R0cF9kZWNvZGV9LAotCXtBQ1BJX1JTRF8xQklURkxBRywgQUNQSV9SU0RfT0ZGU0VUKGFkZHJlc3MuaW5mby5pby50cmFuc2xhdGlvbl90eXBlKSwKLQkgIlRyYW5zbGF0aW9uIFR5cGUiLCBhY3BpX2dibF90cnNfZGVjb2RlfQotfTsKLQotLyoKLSAqIFRhYmxlIHVzZWQgdG8gZHVtcCBfUFJUIGNvbnRlbnRzCi0gKi8KLXN0YXRpYyBzdHJ1Y3QgYWNwaV9yc2R1bXBfaW5mbyBhY3BpX3JzX2R1bXBfcHJ0WzVdID0gewotCXtBQ1BJX1JTRF9USVRMRSwgQUNQSV9SU0RfVEFCTEVfU0laRShhY3BpX3JzX2R1bXBfcHJ0KSwgTlVMTCwgTlVMTH0sCi0Je0FDUElfUlNEX1VJTlQ2NCwgQUNQSV9QUlRfT0ZGU0VUKGFkZHJlc3MpLCAiQWRkcmVzcyIsIE5VTEx9LAotCXtBQ1BJX1JTRF9VSU5UMzIsIEFDUElfUFJUX09GRlNFVChwaW4pLCAiUGluIiwgTlVMTH0sCi0Je0FDUElfUlNEX1NUUklORywgQUNQSV9QUlRfT0ZGU0VUKHNvdXJjZVswXSksICJTb3VyY2UiLCBOVUxMfSwKLQl7QUNQSV9SU0RfVUlOVDMyLCBBQ1BJX1BSVF9PRkZTRVQoc291cmNlX2luZGV4KSwgIlNvdXJjZSBJbmRleCIsIE5VTEx9Ci19OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX3JzX2R1bXBfZGVzY3JpcHRvcgotICoKLSAqIFBBUkFNRVRFUlM6ICBSZXNvdXJjZQotICoKLSAqIFJFVFVSTjogICAgICBOb25lCi0gKgotICogREVTQ1JJUFRJT046Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIHZvaWQKLWFjcGlfcnNfZHVtcF9kZXNjcmlwdG9yKHZvaWQgKnJlc291cmNlLCBzdHJ1Y3QgYWNwaV9yc2R1bXBfaW5mbyAqdGFibGUpCi17Ci0JdTggKnRhcmdldCA9IE5VTEw7Ci0JdTggKnByZXZpb3VzX3RhcmdldDsKLQljaGFyICpuYW1lOwotCXU4IGNvdW50OwotCi0JLyogRmlyc3QgdGFibGUgZW50cnkgbXVzdCBjb250YWluIHRoZSB0YWJsZSBsZW5ndGggKCMgb2YgdGFibGUgZW50cmllcykgKi8KLQotCWNvdW50ID0gdGFibGUtPm9mZnNldDsKLQotCXdoaWxlIChjb3VudCkgewotCQlwcmV2aW91c190YXJnZXQgPSB0YXJnZXQ7Ci0JCXRhcmdldCA9IEFDUElfQUREX1BUUih1OCwgcmVzb3VyY2UsIHRhYmxlLT5vZmZzZXQpOwotCQluYW1lID0gdGFibGUtPm5hbWU7Ci0KLQkJc3dpdGNoICh0YWJsZS0+b3Bjb2RlKSB7Ci0JCWNhc2UgQUNQSV9SU0RfVElUTEU6Ci0JCQkvKgotCQkJICogT3B0aW9uYWwgcmVzb3VyY2UgdGl0bGUKLQkJCSAqLwotCQkJaWYgKHRhYmxlLT5uYW1lKSB7Ci0JCQkJYWNwaV9vc19wcmludGYoIiVzIFJlc291cmNlXG4iLCBuYW1lKTsKLQkJCX0KLQkJCWJyZWFrOwotCi0JCQkvKiBTdHJpbmdzICovCi0KLQkJY2FzZSBBQ1BJX1JTRF9MSVRFUkFMOgotCQkJYWNwaV9yc19vdXRfc3RyaW5nKG5hbWUsCi0JCQkJCSAgIEFDUElfQ0FTVF9QVFIoY2hhciwgdGFibGUtPnBvaW50ZXIpKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgQUNQSV9SU0RfU1RSSU5HOgotCQkJYWNwaV9yc19vdXRfc3RyaW5nKG5hbWUsIEFDUElfQ0FTVF9QVFIoY2hhciwgdGFyZ2V0KSk7Ci0JCQlicmVhazsKLQotCQkJLyogRGF0YSBpdGVtcywgOC8xNi8zMi82NCBiaXQgKi8KLQotCQljYXNlIEFDUElfUlNEX1VJTlQ4OgotCQkJYWNwaV9yc19vdXRfaW50ZWdlcjgobmFtZSwgQUNQSV9HRVQ4KHRhcmdldCkpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBBQ1BJX1JTRF9VSU5UMTY6Ci0JCQlhY3BpX3JzX291dF9pbnRlZ2VyMTYobmFtZSwgQUNQSV9HRVQxNih0YXJnZXQpKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgQUNQSV9SU0RfVUlOVDMyOgotCQkJYWNwaV9yc19vdXRfaW50ZWdlcjMyKG5hbWUsIEFDUElfR0VUMzIodGFyZ2V0KSk7Ci0JCQlicmVhazsKLQotCQljYXNlIEFDUElfUlNEX1VJTlQ2NDoKLQkJCWFjcGlfcnNfb3V0X2ludGVnZXI2NChuYW1lLCBBQ1BJX0dFVDY0KHRhcmdldCkpOwotCQkJYnJlYWs7Ci0KLQkJCS8qIEZsYWdzOiAxLWJpdCBhbmQgMi1iaXQgZmxhZ3Mgc3VwcG9ydGVkICovCi0KLQkJY2FzZSBBQ1BJX1JTRF8xQklURkxBRzoKLQkJCWFjcGlfcnNfb3V0X3N0cmluZyhuYW1lLCBBQ1BJX0NBU1RfUFRSKGNoYXIsCi0JCQkJCQkJICAgICAgIHRhYmxlLT4KLQkJCQkJCQkgICAgICAgcG9pbnRlclsqdGFyZ2V0ICYKLQkJCQkJCQkJICAgICAgIDB4MDFdKSk7Ci0JCQlicmVhazsKLQotCQljYXNlIEFDUElfUlNEXzJCSVRGTEFHOgotCQkJYWNwaV9yc19vdXRfc3RyaW5nKG5hbWUsIEFDUElfQ0FTVF9QVFIoY2hhciwKLQkJCQkJCQkgICAgICAgdGFibGUtPgotCQkJCQkJCSAgICAgICBwb2ludGVyWyp0YXJnZXQgJgotCQkJCQkJCQkgICAgICAgMHgwM10pKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgQUNQSV9SU0RfU0hPUlRMSVNUOgotCQkJLyoKLQkJCSAqIFNob3J0IGJ5dGUgbGlzdCAoc2luZ2xlIGxpbmUgb3V0cHV0KSBmb3IgRE1BIGFuZCBJUlEgcmVzb3VyY2VzCi0JCQkgKiBOb3RlOiBUaGUgbGlzdCBsZW5ndGggaXMgb2J0YWluZWQgZnJvbSB0aGUgcHJldmlvdXMgdGFibGUgZW50cnkKLQkJCSAqLwotCQkJaWYgKHByZXZpb3VzX3RhcmdldCkgewotCQkJCWFjcGlfcnNfb3V0X3RpdGxlKG5hbWUpOwotCQkJCWFjcGlfcnNfZHVtcF9zaG9ydF9ieXRlX2xpc3QoKnByZXZpb3VzX3RhcmdldCwKLQkJCQkJCQkgICAgIHRhcmdldCk7Ci0JCQl9Ci0JCQlicmVhazsKLQotCQljYXNlIEFDUElfUlNEX0xPTkdMSVNUOgotCQkJLyoKLQkJCSAqIExvbmcgYnl0ZSBsaXN0IGZvciBWZW5kb3IgcmVzb3VyY2UgZGF0YQotCQkJICogTm90ZTogVGhlIGxpc3QgbGVuZ3RoIGlzIG9idGFpbmVkIGZyb20gdGhlIHByZXZpb3VzIHRhYmxlIGVudHJ5Ci0JCQkgKi8KLQkJCWlmIChwcmV2aW91c190YXJnZXQpIHsKLQkJCQlhY3BpX3JzX2R1bXBfYnl0ZV9saXN0KEFDUElfR0VUMTYKLQkJCQkJCSAgICAgICAocHJldmlvdXNfdGFyZ2V0KSwKLQkJCQkJCSAgICAgICB0YXJnZXQpOwotCQkJfQotCQkJYnJlYWs7Ci0KLQkJY2FzZSBBQ1BJX1JTRF9EV09SRExJU1Q6Ci0JCQkvKgotCQkJICogRHdvcmQgbGlzdCBmb3IgRXh0ZW5kZWQgSW50ZXJydXB0IHJlc291cmNlcwotCQkJICogTm90ZTogVGhlIGxpc3QgbGVuZ3RoIGlzIG9idGFpbmVkIGZyb20gdGhlIHByZXZpb3VzIHRhYmxlIGVudHJ5Ci0JCQkgKi8KLQkJCWlmIChwcmV2aW91c190YXJnZXQpIHsKLQkJCQlhY3BpX3JzX2R1bXBfZHdvcmRfbGlzdCgqcHJldmlvdXNfdGFyZ2V0LAotCQkJCQkJCUFDUElfQ0FTVF9QVFIodTMyLAotCQkJCQkJCQkgICAgICB0YXJnZXQpKTsKLQkJCX0KLQkJCWJyZWFrOwotCi0JCWNhc2UgQUNQSV9SU0RfQUREUkVTUzoKLQkJCS8qCi0JCQkgKiBDb21tb24gZmxhZ3MgZm9yIGFsbCBBZGRyZXNzIHJlc291cmNlcwotCQkJICovCi0JCQlhY3BpX3JzX2R1bXBfYWRkcmVzc19jb21tb24oQUNQSV9DQVNUX1BUUgotCQkJCQkJICAgICh1bmlvbiBhY3BpX3Jlc291cmNlX2RhdGEsCi0JCQkJCQkgICAgIHRhcmdldCkpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBBQ1BJX1JTRF9TT1VSQ0U6Ci0JCQkvKgotCQkJICogT3B0aW9uYWwgcmVzb3VyY2Vfc291cmNlIGZvciBBZGRyZXNzIHJlc291cmNlcwotCQkJICovCi0JCQlhY3BpX3JzX2R1bXBfcmVzb3VyY2Vfc291cmNlKEFDUElfQ0FTVF9QVFIoc3RydWN0Ci0JCQkJCQkJCSAgIGFjcGlfcmVzb3VyY2Vfc291cmNlLAotCQkJCQkJCQkgICB0YXJnZXQpKTsKLQkJCWJyZWFrOwotCi0JCWRlZmF1bHQ6Ci0JCQlhY3BpX29zX3ByaW50ZigiKioqKiBJbnZhbGlkIHRhYmxlIG9wY29kZSBbJVhdICoqKipcbiIsCi0JCQkJICAgICAgIHRhYmxlLT5vcGNvZGUpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJdGFibGUrKzsKLQkJY291bnQtLTsKLQl9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfcnNfZHVtcF9yZXNvdXJjZV9zb3VyY2UKLSAqCi0gKiBQQVJBTUVURVJTOiAgcmVzb3VyY2Vfc291cmNlICAgICAtIFBvaW50ZXIgdG8gYSBSZXNvdXJjZSBTb3VyY2Ugc3RydWN0Ci0gKgotICogUkVUVVJOOiAgICAgIE5vbmUKLSAqCi0gKiBERVNDUklQVElPTjogQ29tbW9uIHJvdXRpbmUgZm9yIGR1bXBpbmcgdGhlIG9wdGlvbmFsIHJlc291cmNlX3NvdXJjZSBhbmQgdGhlCi0gKiAgICAgICAgICAgICAgY29ycmVzcG9uZGluZyByZXNvdXJjZV9zb3VyY2VfaW5kZXguCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIHZvaWQKLWFjcGlfcnNfZHVtcF9yZXNvdXJjZV9zb3VyY2Uoc3RydWN0IGFjcGlfcmVzb3VyY2Vfc291cmNlICpyZXNvdXJjZV9zb3VyY2UpCi17Ci0JQUNQSV9GVU5DVElPTl9FTlRSWSgpOwotCi0JaWYgKHJlc291cmNlX3NvdXJjZS0+aW5kZXggPT0gMHhGRikgewotCQlyZXR1cm47Ci0JfQotCi0JYWNwaV9yc19vdXRfaW50ZWdlcjgoIlJlc291cmNlIFNvdXJjZSBJbmRleCIsIHJlc291cmNlX3NvdXJjZS0+aW5kZXgpOwotCi0JYWNwaV9yc19vdXRfc3RyaW5nKCJSZXNvdXJjZSBTb3VyY2UiLAotCQkJICAgcmVzb3VyY2Vfc291cmNlLT5zdHJpbmdfcHRyID8KLQkJCSAgIHJlc291cmNlX3NvdXJjZS0+c3RyaW5nX3B0ciA6ICJbTm90IFNwZWNpZmllZF0iKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9yc19kdW1wX2FkZHJlc3NfY29tbW9uCi0gKgotICogUEFSQU1FVEVSUzogIFJlc291cmNlICAgICAgICAtIFBvaW50ZXIgdG8gYW4gaW50ZXJuYWwgcmVzb3VyY2UgZGVzY3JpcHRvcgotICoKLSAqIFJFVFVSTjogICAgICBOb25lCi0gKgotICogREVTQ1JJUFRJT046IER1bXAgdGhlIGZpZWxkcyB0aGF0IGFyZSBjb21tb24gdG8gYWxsIEFkZHJlc3MgcmVzb3VyY2UKLSAqICAgICAgICAgICAgICBkZXNjcmlwdG9ycwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyB2b2lkIGFjcGlfcnNfZHVtcF9hZGRyZXNzX2NvbW1vbih1bmlvbiBhY3BpX3Jlc291cmNlX2RhdGEgKnJlc291cmNlKQotewotCUFDUElfRlVOQ1RJT05fRU5UUlkoKTsKLQotCS8qIERlY29kZSB0aGUgdHlwZS1zcGVjaWZpYyBmbGFncyAqLwotCi0Jc3dpdGNoIChyZXNvdXJjZS0+YWRkcmVzcy5yZXNvdXJjZV90eXBlKSB7Ci0JY2FzZSBBQ1BJX01FTU9SWV9SQU5HRToKLQotCQlhY3BpX3JzX2R1bXBfZGVzY3JpcHRvcihyZXNvdXJjZSwgYWNwaV9yc19kdW1wX21lbW9yeV9mbGFncyk7Ci0JCWJyZWFrOwotCi0JY2FzZSBBQ1BJX0lPX1JBTkdFOgotCi0JCWFjcGlfcnNfZHVtcF9kZXNjcmlwdG9yKHJlc291cmNlLCBhY3BpX3JzX2R1bXBfaW9fZmxhZ3MpOwotCQlicmVhazsKLQotCWNhc2UgQUNQSV9CVVNfTlVNQkVSX1JBTkdFOgotCi0JCWFjcGlfcnNfb3V0X3N0cmluZygiUmVzb3VyY2UgVHlwZSIsICJCdXMgTnVtYmVyIFJhbmdlIik7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQotCQlhY3BpX3JzX291dF9pbnRlZ2VyOCgiUmVzb3VyY2UgVHlwZSIsCi0JCQkJICAgICAodTgpIHJlc291cmNlLT5hZGRyZXNzLnJlc291cmNlX3R5cGUpOwotCQlicmVhazsKLQl9Ci0KLQkvKiBEZWNvZGUgdGhlIGdlbmVyYWwgZmxhZ3MgKi8KLQotCWFjcGlfcnNfZHVtcF9kZXNjcmlwdG9yKHJlc291cmNlLCBhY3BpX3JzX2R1bXBfZ2VuZXJhbF9mbGFncyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfcnNfZHVtcF9yZXNvdXJjZV9saXN0Ci0gKgotICogUEFSQU1FVEVSUzogIHJlc291cmNlX2xpc3QgICAgICAgLSBQb2ludGVyIHRvIGEgcmVzb3VyY2UgZGVzY3JpcHRvciBsaXN0Ci0gKgotICogUkVUVVJOOiAgICAgIE5vbmUKLSAqCi0gKiBERVNDUklQVElPTjogRGlzcGF0Y2hlcyB0aGUgc3RydWN0dXJlIHRvIHRoZSBjb3JyZWN0IGR1bXAgcm91dGluZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi12b2lkIGFjcGlfcnNfZHVtcF9yZXNvdXJjZV9saXN0KHN0cnVjdCBhY3BpX3Jlc291cmNlICpyZXNvdXJjZV9saXN0KQotewotCXUzMiBjb3VudCA9IDA7Ci0JdTMyIHR5cGU7Ci0KLQlBQ1BJX0ZVTkNUSU9OX0VOVFJZKCk7Ci0KLQlpZiAoIShhY3BpX2RiZ19sZXZlbCAmIEFDUElfTFZfUkVTT1VSQ0VTKQotCSAgICB8fCAhKF9DT01QT05FTlQgJiBhY3BpX2RiZ19sYXllcikpIHsKLQkJcmV0dXJuOwotCX0KLQotCS8qIFdhbGsgbGlzdCBhbmQgZHVtcCBhbGwgcmVzb3VyY2UgZGVzY3JpcHRvcnMgKEVORF9UQUcgdGVybWluYXRlcykgKi8KLQotCWRvIHsKLQkJYWNwaV9vc19wcmludGYoIlxuWyUwMlhdICIsIGNvdW50KTsKLQkJY291bnQrKzsKLQotCQkvKiBWYWxpZGF0ZSBUeXBlIGJlZm9yZSBkaXNwYXRjaCAqLwotCi0JCXR5cGUgPSByZXNvdXJjZV9saXN0LT50eXBlOwotCQlpZiAodHlwZSA+IEFDUElfUkVTT1VSQ0VfVFlQRV9NQVgpIHsKLQkJCWFjcGlfb3NfcHJpbnRmCi0JCQkgICAgKCJJbnZhbGlkIGRlc2NyaXB0b3IgdHlwZSAoJVgpIGluIHJlc291cmNlIGxpc3RcbiIsCi0JCQkgICAgIHJlc291cmNlX2xpc3QtPnR5cGUpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLyogRHVtcCB0aGUgcmVzb3VyY2UgZGVzY3JpcHRvciAqLwotCi0JCWFjcGlfcnNfZHVtcF9kZXNjcmlwdG9yKCZyZXNvdXJjZV9saXN0LT5kYXRhLAotCQkJCQlhY3BpX2dibF9kdW1wX3Jlc291cmNlX2Rpc3BhdGNoW3R5cGVdKTsKLQotCQkvKiBQb2ludCB0byB0aGUgbmV4dCByZXNvdXJjZSBzdHJ1Y3R1cmUgKi8KLQotCQlyZXNvdXJjZV9saXN0ID0KLQkJICAgIEFDUElfQUREX1BUUihzdHJ1Y3QgYWNwaV9yZXNvdXJjZSwgcmVzb3VyY2VfbGlzdCwKLQkJCQkgcmVzb3VyY2VfbGlzdC0+bGVuZ3RoKTsKLQotCQkvKiBFeGl0IHdoZW4gRU5EX1RBRyBkZXNjcmlwdG9yIGlzIHJlYWNoZWQgKi8KLQotCX0gd2hpbGUgKHR5cGUgIT0gQUNQSV9SRVNPVVJDRV9UWVBFX0VORF9UQUcpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX3JzX2R1bXBfaXJxX2xpc3QKLSAqCi0gKiBQQVJBTUVURVJTOiAgcm91dGVfdGFibGUgICAgIC0gUG9pbnRlciB0byB0aGUgcm91dGluZyB0YWJsZSB0byBkdW1wLgotICoKLSAqIFJFVFVSTjogICAgICBOb25lCi0gKgotICogREVTQ1JJUFRJT046IFByaW50IElSUSByb3V0aW5nIHRhYmxlCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdm9pZCBhY3BpX3JzX2R1bXBfaXJxX2xpc3QodTggKiByb3V0ZV90YWJsZSkKLXsKLQlzdHJ1Y3QgYWNwaV9wY2lfcm91dGluZ190YWJsZSAqcHJ0X2VsZW1lbnQ7Ci0JdTggY291bnQ7Ci0KLQlBQ1BJX0ZVTkNUSU9OX0VOVFJZKCk7Ci0KLQlpZiAoIShhY3BpX2RiZ19sZXZlbCAmIEFDUElfTFZfUkVTT1VSQ0VTKQotCSAgICB8fCAhKF9DT01QT05FTlQgJiBhY3BpX2RiZ19sYXllcikpIHsKLQkJcmV0dXJuOwotCX0KLQotCXBydF9lbGVtZW50ID0gQUNQSV9DQVNUX1BUUihzdHJ1Y3QgYWNwaV9wY2lfcm91dGluZ190YWJsZSwgcm91dGVfdGFibGUpOwotCi0JLyogRHVtcCBhbGwgdGFibGUgZWxlbWVudHMsIEV4aXQgb24gemVybyBsZW5ndGggZWxlbWVudCAqLwotCi0JZm9yIChjb3VudCA9IDA7IHBydF9lbGVtZW50LT5sZW5ndGg7IGNvdW50KyspIHsKLQkJYWNwaV9vc19wcmludGYoIlxuWyUwMlhdIFBDSSBJUlEgUm91dGluZyBUYWJsZSBQYWNrYWdlXG4iLAotCQkJICAgICAgIGNvdW50KTsKLQkJYWNwaV9yc19kdW1wX2Rlc2NyaXB0b3IocHJ0X2VsZW1lbnQsIGFjcGlfcnNfZHVtcF9wcnQpOwotCi0JCXBydF9lbGVtZW50ID0gQUNQSV9BRERfUFRSKHN0cnVjdCBhY3BpX3BjaV9yb3V0aW5nX3RhYmxlLAotCQkJCQkgICBwcnRfZWxlbWVudCwgcHJ0X2VsZW1lbnQtPmxlbmd0aCk7Ci0JfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX3JzX291dCoKLSAqCi0gKiBQQVJBTUVURVJTOiAgVGl0bGUgICAgICAgLSBOYW1lIG9mIHRoZSByZXNvdXJjZSBmaWVsZAotICogICAgICAgICAgICAgIFZhbHVlICAgICAgIC0gVmFsdWUgb2YgdGhlIHJlc291cmNlIGZpZWxkCi0gKgotICogUkVUVVJOOiAgICAgIE5vbmUKLSAqCi0gKiBERVNDUklQVElPTjogTWlzY2VsbGFuZW91cyBoZWxwZXIgZnVuY3Rpb25zIHRvIGNvbnNpc3RlbnRseSBmb3JtYXQgdGhlCi0gKiAgICAgICAgICAgICAgb3V0cHV0IG9mIHRoZSByZXNvdXJjZSBkdW1wIHJvdXRpbmVzCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIHZvaWQgYWNwaV9yc19vdXRfc3RyaW5nKGNoYXIgKnRpdGxlLCBjaGFyICp2YWx1ZSkKLXsKLQlhY3BpX29zX3ByaW50ZigiJTI3cyA6ICVzIiwgdGl0bGUsIHZhbHVlKTsKLQlpZiAoISp2YWx1ZSkgewotCQlhY3BpX29zX3ByaW50ZigiW05VTEwgTkFNRVNUUklOR10iKTsKLQl9Ci0JYWNwaV9vc19wcmludGYoIlxuIik7Ci19Ci0KLXN0YXRpYyB2b2lkIGFjcGlfcnNfb3V0X2ludGVnZXI4KGNoYXIgKnRpdGxlLCB1OCB2YWx1ZSkKLXsKLQlhY3BpX29zX3ByaW50ZigiJTI3cyA6ICUyLjJYXG4iLCB0aXRsZSwgdmFsdWUpOwotfQotCi1zdGF0aWMgdm9pZCBhY3BpX3JzX291dF9pbnRlZ2VyMTYoY2hhciAqdGl0bGUsIHUxNiB2YWx1ZSkKLXsKLQlhY3BpX29zX3ByaW50ZigiJTI3cyA6ICU0LjRYXG4iLCB0aXRsZSwgdmFsdWUpOwotfQotCi1zdGF0aWMgdm9pZCBhY3BpX3JzX291dF9pbnRlZ2VyMzIoY2hhciAqdGl0bGUsIHUzMiB2YWx1ZSkKLXsKLQlhY3BpX29zX3ByaW50ZigiJTI3cyA6ICU4LjhYXG4iLCB0aXRsZSwgdmFsdWUpOwotfQotCi1zdGF0aWMgdm9pZCBhY3BpX3JzX291dF9pbnRlZ2VyNjQoY2hhciAqdGl0bGUsIHU2NCB2YWx1ZSkKLXsKLQlhY3BpX29zX3ByaW50ZigiJTI3cyA6ICU4LjhYJTguOFhcbiIsIHRpdGxlLCBBQ1BJX0ZPUk1BVF9VSU5UNjQodmFsdWUpKTsKLX0KLQotc3RhdGljIHZvaWQgYWNwaV9yc19vdXRfdGl0bGUoY2hhciAqdGl0bGUpCi17Ci0JYWNwaV9vc19wcmludGYoIiUyN3MgOiAiLCB0aXRsZSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfcnNfZHVtcCpMaXN0Ci0gKgotICogUEFSQU1FVEVSUzogIExlbmd0aCAgICAgIC0gTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0Ci0gKiAgICAgICAgICAgICAgRGF0YSAgICAgICAgLSBTdGFydCBvZiB0aGUgbGlzdAotICoKLSAqIFJFVFVSTjogICAgICBOb25lCi0gKgotICogREVTQ1JJUFRJT046IE1pc2NlbGxhbmVvdXMgZnVuY3Rpb25zIHRvIGR1bXAgbGlzdHMgb2YgcmF3IGRhdGEKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgdm9pZCBhY3BpX3JzX2R1bXBfYnl0ZV9saXN0KHUxNiBsZW5ndGgsIHU4ICogZGF0YSkKLXsKLQl1OCBpOwotCi0JZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCWFjcGlfb3NfcHJpbnRmKCIlMjVzJTIuMlggOiAlMi4yWFxuIiwgIkJ5dGUiLCBpLCBkYXRhW2ldKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIGFjcGlfcnNfZHVtcF9zaG9ydF9ieXRlX2xpc3QodTggbGVuZ3RoLCB1OCAqIGRhdGEpCi17Ci0JdTggaTsKLQotCWZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotCQlhY3BpX29zX3ByaW50ZigiJVggIiwgZGF0YVtpXSk7Ci0JfQotCWFjcGlfb3NfcHJpbnRmKCJcbiIpOwotfQotCi1zdGF0aWMgdm9pZCBhY3BpX3JzX2R1bXBfZHdvcmRfbGlzdCh1OCBsZW5ndGgsIHUzMiAqIGRhdGEpCi17Ci0JdTggaTsKLQotCWZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotCQlhY3BpX29zX3ByaW50ZigiJTI1cyUyLjJYIDogJTguOFhcbiIsICJEd29yZCIsIGksIGRhdGFbaV0pOwotCX0KLX0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvcmVzb3VyY2VzL3JzaW5mby5jIGIvZHJpdmVycy9hY3BpL3Jlc291cmNlcy9yc2luZm8uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2YwYTFmZS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL2FjcGkvcmVzb3VyY2VzL3JzaW5mby5jCisrKyAvZGV2L251bGwKQEAgLTEsMjA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogTW9kdWxlIE5hbWU6IHJzaW5mbyAtIERpc3BhdGNoIGFuZCBJbmZvIHRhYmxlcwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA4LCBJbnRlbCBDb3JwLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAotICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgYXQgbWluaW11bSBhIGRpc2NsYWltZXIKLSAqICAgIHN1YnN0YW50aWFsbHkgc2ltaWxhciB0byB0aGUgIk5PIFdBUlJBTlRZIiBkaXNjbGFpbWVyIGJlbG93Ci0gKiAgICAoIkRpc2NsYWltZXIiKSBhbmQgYW55IHJlZGlzdHJpYnV0aW9uIG11c3QgYmUgY29uZGl0aW9uZWQgdXBvbgotICogICAgaW5jbHVkaW5nIGEgc3Vic3RhbnRpYWxseSBzaW1pbGFyIERpc2NsYWltZXIgcmVxdWlyZW1lbnQgZm9yIGZ1cnRoZXIKLSAqICAgIGJpbmFyeSByZWRpc3RyaWJ1dGlvbi4KLSAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcwotICogICAgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICogU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBOTyBXQVJSQU5UWQotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCi0gKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUwotICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcKLSAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQotICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgotICovCi0KLSNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KLSNpbmNsdWRlIDxhY3BpL2FjcmVzcmMuaD4KLQotI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfUkVTT1VSQ0VTCi1BQ1BJX01PRFVMRV9OQU1FKCJyc2luZm8iKQotCi0vKgotICogUmVzb3VyY2UgZGlzcGF0Y2ggYW5kIGluZm9ybWF0aW9uIHRhYmxlcy4gQW55IG5ldyByZXNvdXJjZSB0eXBlcyAoZWl0aGVyCi0gKiBMYXJnZSBvciBTbWFsbCkgbXVzdCBiZSByZWZsZWN0ZWQgaW4gZWFjaCBvZiB0aGVzZSB0YWJsZXMsIHNvIHRoZXkgYXJlIGhlcmUKLSAqIGluIG9uZSBwbGFjZS4KLSAqCi0gKiBUaGUgdGFibGVzIGZvciBMYXJnZSBkZXNjcmlwdG9ycyBhcmUgaW5kZXhlZCBieSBiaXRzIDY6MCBvZiB0aGUgQU1MCi0gKiBkZXNjcmlwdG9yIHR5cGUgYnl0ZS4gVGhlIHRhYmxlcyBmb3IgU21hbGwgZGVzY3JpcHRvcnMgYXJlIGluZGV4ZWQgYnkKLSAqIGJpdHMgNjozIG9mIHRoZSBkZXNjcmlwdG9yIGJ5dGUuIFRoZSB0YWJsZXMgZm9yIGludGVybmFsIHJlc291cmNlCi0gKiBkZXNjcmlwdG9ycyBhcmUgaW5kZXhlZCBieSB0aGUgYWNwaV9yZXNvdXJjZV90eXBlIGZpZWxkLgotICovCi0vKiBEaXNwYXRjaCB0YWJsZSBmb3IgcmVzb3VyY2UtdG8tQU1MIChTZXQgUmVzb3VyY2UpIGNvbnZlcnNpb24gZnVuY3Rpb25zICovCi1zdHJ1Y3QgYWNwaV9yc2NvbnZlcnRfaW5mbyAqYWNwaV9nYmxfc2V0X3Jlc291cmNlX2Rpc3BhdGNoW10gPSB7Ci0JYWNwaV9yc19zZXRfaXJxLAkvKiAweDAwLCBBQ1BJX1JFU09VUkNFX1RZUEVfSVJRICovCi0JYWNwaV9yc19jb252ZXJ0X2RtYSwJLyogMHgwMSwgQUNQSV9SRVNPVVJDRV9UWVBFX0RNQSAqLwotCWFjcGlfcnNfc2V0X3N0YXJ0X2RwZiwJLyogMHgwMiwgQUNQSV9SRVNPVVJDRV9UWVBFX1NUQVJUX0RFUEVOREVOVCAqLwotCWFjcGlfcnNfY29udmVydF9lbmRfZHBmLAkvKiAweDAzLCBBQ1BJX1JFU09VUkNFX1RZUEVfRU5EX0RFUEVOREVOVCAqLwotCWFjcGlfcnNfY29udmVydF9pbywJLyogMHgwNCwgQUNQSV9SRVNPVVJDRV9UWVBFX0lPICovCi0JYWNwaV9yc19jb252ZXJ0X2ZpeGVkX2lvLAkvKiAweDA1LCBBQ1BJX1JFU09VUkNFX1RZUEVfRklYRURfSU8gKi8KLQlhY3BpX3JzX3NldF92ZW5kb3IsCS8qIDB4MDYsIEFDUElfUkVTT1VSQ0VfVFlQRV9WRU5ET1IgKi8KLQlhY3BpX3JzX2NvbnZlcnRfZW5kX3RhZywJLyogMHgwNywgQUNQSV9SRVNPVVJDRV9UWVBFX0VORF9UQUcgKi8KLQlhY3BpX3JzX2NvbnZlcnRfbWVtb3J5MjQsCS8qIDB4MDgsIEFDUElfUkVTT1VSQ0VfVFlQRV9NRU1PUlkyNCAqLwotCWFjcGlfcnNfY29udmVydF9tZW1vcnkzMiwJLyogMHgwOSwgQUNQSV9SRVNPVVJDRV9UWVBFX01FTU9SWTMyICovCi0JYWNwaV9yc19jb252ZXJ0X2ZpeGVkX21lbW9yeTMyLAkvKiAweDBBLCBBQ1BJX1JFU09VUkNFX1RZUEVfRklYRURfTUVNT1JZMzIgKi8KLQlhY3BpX3JzX2NvbnZlcnRfYWRkcmVzczE2LAkvKiAweDBCLCBBQ1BJX1JFU09VUkNFX1RZUEVfQUREUkVTUzE2ICovCi0JYWNwaV9yc19jb252ZXJ0X2FkZHJlc3MzMiwJLyogMHgwQywgQUNQSV9SRVNPVVJDRV9UWVBFX0FERFJFU1MzMiAqLwotCWFjcGlfcnNfY29udmVydF9hZGRyZXNzNjQsCS8qIDB4MEQsIEFDUElfUkVTT1VSQ0VfVFlQRV9BRERSRVNTNjQgKi8KLQlhY3BpX3JzX2NvbnZlcnRfZXh0X2FkZHJlc3M2NCwJLyogMHgwRSwgQUNQSV9SRVNPVVJDRV9UWVBFX0VYVEVOREVEX0FERFJFU1M2NCAqLwotCWFjcGlfcnNfY29udmVydF9leHRfaXJxLAkvKiAweDBGLCBBQ1BJX1JFU09VUkNFX1RZUEVfRVhURU5ERURfSVJRICovCi0JYWNwaV9yc19jb252ZXJ0X2dlbmVyaWNfcmVnCS8qIDB4MTAsIEFDUElfUkVTT1VSQ0VfVFlQRV9HRU5FUklDX1JFR0lTVEVSICovCi19OwotCi0vKiBEaXNwYXRjaCB0YWJsZXMgZm9yIEFNTC10by1yZXNvdXJjZSAoR2V0IFJlc291cmNlKSBjb252ZXJzaW9uIGZ1bmN0aW9ucyAqLwotCi1zdHJ1Y3QgYWNwaV9yc2NvbnZlcnRfaW5mbyAqYWNwaV9nYmxfZ2V0X3Jlc291cmNlX2Rpc3BhdGNoW10gPSB7Ci0JLyogU21hbGwgZGVzY3JpcHRvcnMgKi8KLQotCU5VTEwsCQkJLyogMHgwMCwgUmVzZXJ2ZWQgKi8KLQlOVUxMLAkJCS8qIDB4MDEsIFJlc2VydmVkICovCi0JTlVMTCwJCQkvKiAweDAyLCBSZXNlcnZlZCAqLwotCU5VTEwsCQkJLyogMHgwMywgUmVzZXJ2ZWQgKi8KLQlhY3BpX3JzX2dldF9pcnEsCS8qIDB4MDQsIEFDUElfUkVTT1VSQ0VfTkFNRV9JUlEgKi8KLQlhY3BpX3JzX2NvbnZlcnRfZG1hLAkvKiAweDA1LCBBQ1BJX1JFU09VUkNFX05BTUVfRE1BICovCi0JYWNwaV9yc19nZXRfc3RhcnRfZHBmLAkvKiAweDA2LCBBQ1BJX1JFU09VUkNFX05BTUVfU1RBUlRfREVQRU5ERU5UICovCi0JYWNwaV9yc19jb252ZXJ0X2VuZF9kcGYsCS8qIDB4MDcsIEFDUElfUkVTT1VSQ0VfTkFNRV9FTkRfREVQRU5ERU5UICovCi0JYWNwaV9yc19jb252ZXJ0X2lvLAkvKiAweDA4LCBBQ1BJX1JFU09VUkNFX05BTUVfSU8gKi8KLQlhY3BpX3JzX2NvbnZlcnRfZml4ZWRfaW8sCS8qIDB4MDksIEFDUElfUkVTT1VSQ0VfTkFNRV9GSVhFRF9JTyAqLwotCU5VTEwsCQkJLyogMHgwQSwgUmVzZXJ2ZWQgKi8KLQlOVUxMLAkJCS8qIDB4MEIsIFJlc2VydmVkICovCi0JTlVMTCwJCQkvKiAweDBDLCBSZXNlcnZlZCAqLwotCU5VTEwsCQkJLyogMHgwRCwgUmVzZXJ2ZWQgKi8KLQlhY3BpX3JzX2dldF92ZW5kb3Jfc21hbGwsCS8qIDB4MEUsIEFDUElfUkVTT1VSQ0VfTkFNRV9WRU5ET1JfU01BTEwgKi8KLQlhY3BpX3JzX2NvbnZlcnRfZW5kX3RhZywJLyogMHgwRiwgQUNQSV9SRVNPVVJDRV9OQU1FX0VORF9UQUcgKi8KLQotCS8qIExhcmdlIGRlc2NyaXB0b3JzICovCi0KLQlOVUxMLAkJCS8qIDB4MDAsIFJlc2VydmVkICovCi0JYWNwaV9yc19jb252ZXJ0X21lbW9yeTI0LAkvKiAweDAxLCBBQ1BJX1JFU09VUkNFX05BTUVfTUVNT1JZMjQgKi8KLQlhY3BpX3JzX2NvbnZlcnRfZ2VuZXJpY19yZWcsCS8qIDB4MDIsIEFDUElfUkVTT1VSQ0VfTkFNRV9HRU5FUklDX1JFR0lTVEVSICovCi0JTlVMTCwJCQkvKiAweDAzLCBSZXNlcnZlZCAqLwotCWFjcGlfcnNfZ2V0X3ZlbmRvcl9sYXJnZSwJLyogMHgwNCwgQUNQSV9SRVNPVVJDRV9OQU1FX1ZFTkRPUl9MQVJHRSAqLwotCWFjcGlfcnNfY29udmVydF9tZW1vcnkzMiwJLyogMHgwNSwgQUNQSV9SRVNPVVJDRV9OQU1FX01FTU9SWTMyICovCi0JYWNwaV9yc19jb252ZXJ0X2ZpeGVkX21lbW9yeTMyLAkvKiAweDA2LCBBQ1BJX1JFU09VUkNFX05BTUVfRklYRURfTUVNT1JZMzIgKi8KLQlhY3BpX3JzX2NvbnZlcnRfYWRkcmVzczMyLAkvKiAweDA3LCBBQ1BJX1JFU09VUkNFX05BTUVfQUREUkVTUzMyICovCi0JYWNwaV9yc19jb252ZXJ0X2FkZHJlc3MxNiwJLyogMHgwOCwgQUNQSV9SRVNPVVJDRV9OQU1FX0FERFJFU1MxNiAqLwotCWFjcGlfcnNfY29udmVydF9leHRfaXJxLAkvKiAweDA5LCBBQ1BJX1JFU09VUkNFX05BTUVfRVhURU5ERURfSVJRICovCi0JYWNwaV9yc19jb252ZXJ0X2FkZHJlc3M2NCwJLyogMHgwQSwgQUNQSV9SRVNPVVJDRV9OQU1FX0FERFJFU1M2NCAqLwotCWFjcGlfcnNfY29udmVydF9leHRfYWRkcmVzczY0CS8qIDB4MEIsIEFDUElfUkVTT1VSQ0VfTkFNRV9FWFRFTkRFRF9BRERSRVNTNjQgKi8KLX07Ci0KLSNpZmRlZiBBQ1BJX0ZVVFVSRV9VU0FHRQotI2lmIGRlZmluZWQoQUNQSV9ERUJVR19PVVRQVVQpIHx8IGRlZmluZWQoQUNQSV9ERUJVR0dFUikKLQotLyogRGlzcGF0Y2ggdGFibGUgZm9yIHJlc291cmNlIGR1bXAgZnVuY3Rpb25zICovCi0KLXN0cnVjdCBhY3BpX3JzZHVtcF9pbmZvICphY3BpX2dibF9kdW1wX3Jlc291cmNlX2Rpc3BhdGNoW10gPSB7Ci0JYWNwaV9yc19kdW1wX2lycSwJLyogQUNQSV9SRVNPVVJDRV9UWVBFX0lSUSAqLwotCWFjcGlfcnNfZHVtcF9kbWEsCS8qIEFDUElfUkVTT1VSQ0VfVFlQRV9ETUEgKi8KLQlhY3BpX3JzX2R1bXBfc3RhcnRfZHBmLAkvKiBBQ1BJX1JFU09VUkNFX1RZUEVfU1RBUlRfREVQRU5ERU5UICovCi0JYWNwaV9yc19kdW1wX2VuZF9kcGYsCS8qIEFDUElfUkVTT1VSQ0VfVFlQRV9FTkRfREVQRU5ERU5UICovCi0JYWNwaV9yc19kdW1wX2lvLAkvKiBBQ1BJX1JFU09VUkNFX1RZUEVfSU8gKi8KLQlhY3BpX3JzX2R1bXBfZml4ZWRfaW8sCS8qIEFDUElfUkVTT1VSQ0VfVFlQRV9GSVhFRF9JTyAqLwotCWFjcGlfcnNfZHVtcF92ZW5kb3IsCS8qIEFDUElfUkVTT1VSQ0VfVFlQRV9WRU5ET1IgKi8KLQlhY3BpX3JzX2R1bXBfZW5kX3RhZywJLyogQUNQSV9SRVNPVVJDRV9UWVBFX0VORF9UQUcgKi8KLQlhY3BpX3JzX2R1bXBfbWVtb3J5MjQsCS8qIEFDUElfUkVTT1VSQ0VfVFlQRV9NRU1PUlkyNCAqLwotCWFjcGlfcnNfZHVtcF9tZW1vcnkzMiwJLyogQUNQSV9SRVNPVVJDRV9UWVBFX01FTU9SWTMyICovCi0JYWNwaV9yc19kdW1wX2ZpeGVkX21lbW9yeTMyLAkvKiBBQ1BJX1JFU09VUkNFX1RZUEVfRklYRURfTUVNT1JZMzIgKi8KLQlhY3BpX3JzX2R1bXBfYWRkcmVzczE2LAkvKiBBQ1BJX1JFU09VUkNFX1RZUEVfQUREUkVTUzE2ICovCi0JYWNwaV9yc19kdW1wX2FkZHJlc3MzMiwJLyogQUNQSV9SRVNPVVJDRV9UWVBFX0FERFJFU1MzMiAqLwotCWFjcGlfcnNfZHVtcF9hZGRyZXNzNjQsCS8qIEFDUElfUkVTT1VSQ0VfVFlQRV9BRERSRVNTNjQgKi8KLQlhY3BpX3JzX2R1bXBfZXh0X2FkZHJlc3M2NCwJLyogQUNQSV9SRVNPVVJDRV9UWVBFX0VYVEVOREVEX0FERFJFU1M2NCAqLwotCWFjcGlfcnNfZHVtcF9leHRfaXJxLAkvKiBBQ1BJX1JFU09VUkNFX1RZUEVfRVhURU5ERURfSVJRICovCi0JYWNwaV9yc19kdW1wX2dlbmVyaWNfcmVnLAkvKiBBQ1BJX1JFU09VUkNFX1RZUEVfR0VORVJJQ19SRUdJU1RFUiAqLwotfTsKLSNlbmRpZgotCi0jZW5kaWYJCQkJLyogQUNQSV9GVVRVUkVfVVNBR0UgKi8KLS8qCi0gKiBCYXNlIHNpemVzIGZvciBleHRlcm5hbCBBTUwgcmVzb3VyY2UgZGVzY3JpcHRvcnMsIGluZGV4ZWQgYnkgaW50ZXJuYWwgdHlwZS4KLSAqIEluY2x1ZGVzIHNpemUgb2YgdGhlIGRlc2NyaXB0b3IgaGVhZGVyICgxIGJ5dGUgZm9yIHNtYWxsIGRlc2NyaXB0b3JzLAotICogMyBieXRlcyBmb3IgbGFyZ2UgZGVzY3JpcHRvcnMpCi0gKi8KLWNvbnN0IHU4IGFjcGlfZ2JsX2FtbF9yZXNvdXJjZV9zaXplc1tdID0gewotCXNpemVvZihzdHJ1Y3QgYW1sX3Jlc291cmNlX2lycSksCS8qIEFDUElfUkVTT1VSQ0VfVFlQRV9JUlEgKG9wdGlvbmFsIEJ5dGUgMyBhbHdheXMgY3JlYXRlZCkgKi8KLQlzaXplb2Yoc3RydWN0IGFtbF9yZXNvdXJjZV9kbWEpLAkvKiBBQ1BJX1JFU09VUkNFX1RZUEVfRE1BICovCi0Jc2l6ZW9mKHN0cnVjdCBhbWxfcmVzb3VyY2Vfc3RhcnRfZGVwZW5kZW50KSwJLyogQUNQSV9SRVNPVVJDRV9UWVBFX1NUQVJUX0RFUEVOREVOVCAob3B0aW9uYWwgQnl0ZSAxIGFsd2F5cyBjcmVhdGVkKSAqLwotCXNpemVvZihzdHJ1Y3QgYW1sX3Jlc291cmNlX2VuZF9kZXBlbmRlbnQpLAkvKiBBQ1BJX1JFU09VUkNFX1RZUEVfRU5EX0RFUEVOREVOVCAqLwotCXNpemVvZihzdHJ1Y3QgYW1sX3Jlc291cmNlX2lvKSwJLyogQUNQSV9SRVNPVVJDRV9UWVBFX0lPICovCi0Jc2l6ZW9mKHN0cnVjdCBhbWxfcmVzb3VyY2VfZml4ZWRfaW8pLAkvKiBBQ1BJX1JFU09VUkNFX1RZUEVfRklYRURfSU8gKi8KLQlzaXplb2Yoc3RydWN0IGFtbF9yZXNvdXJjZV92ZW5kb3Jfc21hbGwpLAkvKiBBQ1BJX1JFU09VUkNFX1RZUEVfVkVORE9SICovCi0Jc2l6ZW9mKHN0cnVjdCBhbWxfcmVzb3VyY2VfZW5kX3RhZyksCS8qIEFDUElfUkVTT1VSQ0VfVFlQRV9FTkRfVEFHICovCi0Jc2l6ZW9mKHN0cnVjdCBhbWxfcmVzb3VyY2VfbWVtb3J5MjQpLAkvKiBBQ1BJX1JFU09VUkNFX1RZUEVfTUVNT1JZMjQgKi8KLQlzaXplb2Yoc3RydWN0IGFtbF9yZXNvdXJjZV9tZW1vcnkzMiksCS8qIEFDUElfUkVTT1VSQ0VfVFlQRV9NRU1PUlkzMiAqLwotCXNpemVvZihzdHJ1Y3QgYW1sX3Jlc291cmNlX2ZpeGVkX21lbW9yeTMyKSwJLyogQUNQSV9SRVNPVVJDRV9UWVBFX0ZJWEVEX01FTU9SWTMyICovCi0Jc2l6ZW9mKHN0cnVjdCBhbWxfcmVzb3VyY2VfYWRkcmVzczE2KSwJLyogQUNQSV9SRVNPVVJDRV9UWVBFX0FERFJFU1MxNiAqLwotCXNpemVvZihzdHJ1Y3QgYW1sX3Jlc291cmNlX2FkZHJlc3MzMiksCS8qIEFDUElfUkVTT1VSQ0VfVFlQRV9BRERSRVNTMzIgKi8KLQlzaXplb2Yoc3RydWN0IGFtbF9yZXNvdXJjZV9hZGRyZXNzNjQpLAkvKiBBQ1BJX1JFU09VUkNFX1RZUEVfQUREUkVTUzY0ICovCi0Jc2l6ZW9mKHN0cnVjdCBhbWxfcmVzb3VyY2VfZXh0ZW5kZWRfYWRkcmVzczY0KSwJLypBQ1BJX1JFU09VUkNFX1RZUEVfRVhURU5ERURfQUREUkVTUzY0ICovCi0Jc2l6ZW9mKHN0cnVjdCBhbWxfcmVzb3VyY2VfZXh0ZW5kZWRfaXJxKSwJLyogQUNQSV9SRVNPVVJDRV9UWVBFX0VYVEVOREVEX0lSUSAqLwotCXNpemVvZihzdHJ1Y3QgYW1sX3Jlc291cmNlX2dlbmVyaWNfcmVnaXN0ZXIpCS8qIEFDUElfUkVTT1VSQ0VfVFlQRV9HRU5FUklDX1JFR0lTVEVSICovCi19OwotCi1jb25zdCB1OCBhY3BpX2dibF9yZXNvdXJjZV9zdHJ1Y3Rfc2l6ZXNbXSA9IHsKLQkvKiBTbWFsbCBkZXNjcmlwdG9ycyAqLwotCi0JMCwKLQkwLAotCTAsCi0JMCwKLQlBQ1BJX1JTX1NJWkUoc3RydWN0IGFjcGlfcmVzb3VyY2VfaXJxKSwKLQlBQ1BJX1JTX1NJWkUoc3RydWN0IGFjcGlfcmVzb3VyY2VfZG1hKSwKLQlBQ1BJX1JTX1NJWkUoc3RydWN0IGFjcGlfcmVzb3VyY2Vfc3RhcnRfZGVwZW5kZW50KSwKLQlBQ1BJX1JTX1NJWkVfTUlOLAotCUFDUElfUlNfU0laRShzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9pbyksCi0JQUNQSV9SU19TSVpFKHN0cnVjdCBhY3BpX3Jlc291cmNlX2ZpeGVkX2lvKSwKLQkwLAotCTAsCi0JMCwKLQkwLAotCUFDUElfUlNfU0laRShzdHJ1Y3QgYWNwaV9yZXNvdXJjZV92ZW5kb3IpLAotCUFDUElfUlNfU0laRV9NSU4sCi0KLQkvKiBMYXJnZSBkZXNjcmlwdG9ycyAqLwotCi0JMCwKLQlBQ1BJX1JTX1NJWkUoc3RydWN0IGFjcGlfcmVzb3VyY2VfbWVtb3J5MjQpLAotCUFDUElfUlNfU0laRShzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9nZW5lcmljX3JlZ2lzdGVyKSwKLQkwLAotCUFDUElfUlNfU0laRShzdHJ1Y3QgYWNwaV9yZXNvdXJjZV92ZW5kb3IpLAotCUFDUElfUlNfU0laRShzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9tZW1vcnkzMiksCi0JQUNQSV9SU19TSVpFKHN0cnVjdCBhY3BpX3Jlc291cmNlX2ZpeGVkX21lbW9yeTMyKSwKLQlBQ1BJX1JTX1NJWkUoc3RydWN0IGFjcGlfcmVzb3VyY2VfYWRkcmVzczMyKSwKLQlBQ1BJX1JTX1NJWkUoc3RydWN0IGFjcGlfcmVzb3VyY2VfYWRkcmVzczE2KSwKLQlBQ1BJX1JTX1NJWkUoc3RydWN0IGFjcGlfcmVzb3VyY2VfZXh0ZW5kZWRfaXJxKSwKLQlBQ1BJX1JTX1NJWkUoc3RydWN0IGFjcGlfcmVzb3VyY2VfYWRkcmVzczY0KSwKLQlBQ1BJX1JTX1NJWkUoc3RydWN0IGFjcGlfcmVzb3VyY2VfZXh0ZW5kZWRfYWRkcmVzczY0KQotfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9yZXNvdXJjZXMvcnNpby5jIGIvZHJpdmVycy9hY3BpL3Jlc291cmNlcy9yc2lvLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2NmQ0MmUuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9hY3BpL3Jlc291cmNlcy9yc2lvLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBNb2R1bGUgTmFtZTogcnNpbyAtIElPIGFuZCBETUEgcmVzb3VyY2UgZGVzY3JpcHRvcnMKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwOCwgSW50ZWwgQ29ycC4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKLSAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIGF0IG1pbmltdW0gYSBkaXNjbGFpbWVyCi0gKiAgICBzdWJzdGFudGlhbGx5IHNpbWlsYXIgdG8gdGhlICJOTyBXQVJSQU5UWSIgZGlzY2xhaW1lciBiZWxvdwotICogICAgKCJEaXNjbGFpbWVyIikgYW5kIGFueSByZWRpc3RyaWJ1dGlvbiBtdXN0IGJlIGNvbmRpdGlvbmVkIHVwb24KLSAqICAgIGluY2x1ZGluZyBhIHN1YnN0YW50aWFsbHkgc2ltaWxhciBEaXNjbGFpbWVyIHJlcXVpcmVtZW50IGZvciBmdXJ0aGVyCi0gKiAgICBiaW5hcnkgcmVkaXN0cmlidXRpb24uCi0gKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMKLSAqICAgIG9mIGFueSBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTk8gV0FSUkFOVFkKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAotICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKLSAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HCi0gKiBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKLSAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KLSAqLwotCi0jaW5jbHVkZSA8YWNwaS9hY3BpLmg+Ci0jaW5jbHVkZSA8YWNwaS9hY3Jlc3JjLmg+Ci0KLSNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX1JFU09VUkNFUwotQUNQSV9NT0RVTEVfTkFNRSgicnNpbyIpCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogYWNwaV9yc19jb252ZXJ0X2lvCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0cnVjdCBhY3BpX3JzY29udmVydF9pbmZvIGFjcGlfcnNfY29udmVydF9pb1s1XSA9IHsKLQl7QUNQSV9SU0NfSU5JVEdFVCwgQUNQSV9SRVNPVVJDRV9UWVBFX0lPLAotCSBBQ1BJX1JTX1NJWkUoc3RydWN0IGFjcGlfcmVzb3VyY2VfaW8pLAotCSBBQ1BJX1JTQ19UQUJMRV9TSVpFKGFjcGlfcnNfY29udmVydF9pbyl9LAotCi0Je0FDUElfUlNDX0lOSVRTRVQsIEFDUElfUkVTT1VSQ0VfTkFNRV9JTywKLQkgc2l6ZW9mKHN0cnVjdCBhbWxfcmVzb3VyY2VfaW8pLAotCSAwfSwKLQotCS8qIERlY29kZSBmbGFnICovCi0KLQl7QUNQSV9SU0NfMUJJVEZMQUcsIEFDUElfUlNfT0ZGU0VUKGRhdGEuaW8uaW9fZGVjb2RlKSwKLQkgQU1MX09GRlNFVChpby5mbGFncyksCi0JIDB9LAotCS8qCi0JICogVGhlc2UgZmllbGRzIGFyZSBjb250aWd1b3VzIGluIGJvdGggdGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb246Ci0JICogQWRkcmVzcyBBbGlnbm1lbnQKLQkgKiBMZW5ndGgKLQkgKiBNaW5pbXVtIEJhc2UgQWRkcmVzcwotCSAqIE1heGltdW0gQmFzZSBBZGRyZXNzCi0JICovCi0Je0FDUElfUlNDX01PVkU4LCBBQ1BJX1JTX09GRlNFVChkYXRhLmlvLmFsaWdubWVudCksCi0JIEFNTF9PRkZTRVQoaW8uYWxpZ25tZW50KSwKLQkgMn0sCi0KLQl7QUNQSV9SU0NfTU9WRTE2LCBBQ1BJX1JTX09GRlNFVChkYXRhLmlvLm1pbmltdW0pLAotCSBBTUxfT0ZGU0VUKGlvLm1pbmltdW0pLAotCSAyfQotfTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBhY3BpX3JzX2NvbnZlcnRfZml4ZWRfaW8KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdHJ1Y3QgYWNwaV9yc2NvbnZlcnRfaW5mbyBhY3BpX3JzX2NvbnZlcnRfZml4ZWRfaW9bNF0gPSB7Ci0Je0FDUElfUlNDX0lOSVRHRVQsIEFDUElfUkVTT1VSQ0VfVFlQRV9GSVhFRF9JTywKLQkgQUNQSV9SU19TSVpFKHN0cnVjdCBhY3BpX3Jlc291cmNlX2ZpeGVkX2lvKSwKLQkgQUNQSV9SU0NfVEFCTEVfU0laRShhY3BpX3JzX2NvbnZlcnRfZml4ZWRfaW8pfSwKLQotCXtBQ1BJX1JTQ19JTklUU0VULCBBQ1BJX1JFU09VUkNFX05BTUVfRklYRURfSU8sCi0JIHNpemVvZihzdHJ1Y3QgYW1sX3Jlc291cmNlX2ZpeGVkX2lvKSwKLQkgMH0sCi0JLyoKLQkgKiBUaGVzZSBmaWVsZHMgYXJlIGNvbnRpZ3VvdXMgaW4gYm90aCB0aGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbjoKLQkgKiBCYXNlIEFkZHJlc3MKLQkgKiBMZW5ndGgKLQkgKi8KLQl7QUNQSV9SU0NfTU9WRTgsIEFDUElfUlNfT0ZGU0VUKGRhdGEuZml4ZWRfaW8uYWRkcmVzc19sZW5ndGgpLAotCSBBTUxfT0ZGU0VUKGZpeGVkX2lvLmFkZHJlc3NfbGVuZ3RoKSwKLQkgMX0sCi0KLQl7QUNQSV9SU0NfTU9WRTE2LCBBQ1BJX1JTX09GRlNFVChkYXRhLmZpeGVkX2lvLmFkZHJlc3MpLAotCSBBTUxfT0ZGU0VUKGZpeGVkX2lvLmFkZHJlc3MpLAotCSAxfQotfTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBhY3BpX3JzX2NvbnZlcnRfZ2VuZXJpY19yZWcKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdHJ1Y3QgYWNwaV9yc2NvbnZlcnRfaW5mbyBhY3BpX3JzX2NvbnZlcnRfZ2VuZXJpY19yZWdbNF0gPSB7Ci0Je0FDUElfUlNDX0lOSVRHRVQsIEFDUElfUkVTT1VSQ0VfVFlQRV9HRU5FUklDX1JFR0lTVEVSLAotCSBBQ1BJX1JTX1NJWkUoc3RydWN0IGFjcGlfcmVzb3VyY2VfZ2VuZXJpY19yZWdpc3RlciksCi0JIEFDUElfUlNDX1RBQkxFX1NJWkUoYWNwaV9yc19jb252ZXJ0X2dlbmVyaWNfcmVnKX0sCi0KLQl7QUNQSV9SU0NfSU5JVFNFVCwgQUNQSV9SRVNPVVJDRV9OQU1FX0dFTkVSSUNfUkVHSVNURVIsCi0JIHNpemVvZihzdHJ1Y3QgYW1sX3Jlc291cmNlX2dlbmVyaWNfcmVnaXN0ZXIpLAotCSAwfSwKLQkvKgotCSAqIFRoZXNlIGZpZWxkcyBhcmUgY29udGlndW91cyBpbiBib3RoIHRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uOgotCSAqIEFkZHJlc3MgU3BhY2UgSUQKLQkgKiBSZWdpc3RlciBCaXQgV2lkdGgKLQkgKiBSZWdpc3RlciBCaXQgT2Zmc2V0Ci0JICogQWNjZXNzIFNpemUKLQkgKi8KLQl7QUNQSV9SU0NfTU9WRTgsIEFDUElfUlNfT0ZGU0VUKGRhdGEuZ2VuZXJpY19yZWcuc3BhY2VfaWQpLAotCSBBTUxfT0ZGU0VUKGdlbmVyaWNfcmVnLmFkZHJlc3Nfc3BhY2VfaWQpLAotCSA0fSwKLQotCS8qIEdldCB0aGUgUmVnaXN0ZXIgQWRkcmVzcyAqLwotCi0Je0FDUElfUlNDX01PVkU2NCwgQUNQSV9SU19PRkZTRVQoZGF0YS5nZW5lcmljX3JlZy5hZGRyZXNzKSwKLQkgQU1MX09GRlNFVChnZW5lcmljX3JlZy5hZGRyZXNzKSwKLQkgMX0KLX07Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogYWNwaV9yc19jb252ZXJ0X2VuZF9kcGYKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdHJ1Y3QgYWNwaV9yc2NvbnZlcnRfaW5mbyBhY3BpX3JzX2NvbnZlcnRfZW5kX2RwZlsyXSA9IHsKLQl7QUNQSV9SU0NfSU5JVEdFVCwgQUNQSV9SRVNPVVJDRV9UWVBFX0VORF9ERVBFTkRFTlQsCi0JIEFDUElfUlNfU0laRV9NSU4sCi0JIEFDUElfUlNDX1RBQkxFX1NJWkUoYWNwaV9yc19jb252ZXJ0X2VuZF9kcGYpfSwKLQotCXtBQ1BJX1JTQ19JTklUU0VULCBBQ1BJX1JFU09VUkNFX05BTUVfRU5EX0RFUEVOREVOVCwKLQkgc2l6ZW9mKHN0cnVjdCBhbWxfcmVzb3VyY2VfZW5kX2RlcGVuZGVudCksCi0JIDB9Ci19OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIGFjcGlfcnNfY29udmVydF9lbmRfdGFnCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RydWN0IGFjcGlfcnNjb252ZXJ0X2luZm8gYWNwaV9yc19jb252ZXJ0X2VuZF90YWdbMl0gPSB7Ci0Je0FDUElfUlNDX0lOSVRHRVQsIEFDUElfUkVTT1VSQ0VfVFlQRV9FTkRfVEFHLAotCSBBQ1BJX1JTX1NJWkVfTUlOLAotCSBBQ1BJX1JTQ19UQUJMRV9TSVpFKGFjcGlfcnNfY29udmVydF9lbmRfdGFnKX0sCi0KLQkvKgotCSAqIE5vdGU6IFRoZSBjaGVja3N1bSBmaWVsZCBpcyBzZXQgdG8gemVybywgbWVhbmluZyB0aGF0IHRoZSByZXNvdXJjZQotCSAqIGRhdGEgaXMgdHJlYXRlZCBhcyBpZiB0aGUgY2hlY2tzdW0gb3BlcmF0aW9uIHN1Y2NlZWRlZC4KLQkgKiAoQUNQSSBTcGVjIDEuMGIgU2VjdGlvbiA2LjQuMi44KQotCSAqLwotCXtBQ1BJX1JTQ19JTklUU0VULCBBQ1BJX1JFU09VUkNFX05BTUVfRU5EX1RBRywKLQkgc2l6ZW9mKHN0cnVjdCBhbWxfcmVzb3VyY2VfZW5kX3RhZyksCi0JIDB9Ci19OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIGFjcGlfcnNfZ2V0X3N0YXJ0X2RwZgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0cnVjdCBhY3BpX3JzY29udmVydF9pbmZvIGFjcGlfcnNfZ2V0X3N0YXJ0X2RwZls2XSA9IHsKLQl7QUNQSV9SU0NfSU5JVEdFVCwgQUNQSV9SRVNPVVJDRV9UWVBFX1NUQVJUX0RFUEVOREVOVCwKLQkgQUNQSV9SU19TSVpFKHN0cnVjdCBhY3BpX3Jlc291cmNlX3N0YXJ0X2RlcGVuZGVudCksCi0JIEFDUElfUlNDX1RBQkxFX1NJWkUoYWNwaV9yc19nZXRfc3RhcnRfZHBmKX0sCi0KLQkvKiBEZWZhdWx0cyBmb3IgQ29tcGF0aWJpbGl0eSBhbmQgUGVyZm9ybWFuY2UgcHJpb3JpdGllcyAqLwotCi0Je0FDUElfUlNDX1NFVDgsIEFDUElfUlNfT0ZGU0VUKGRhdGEuc3RhcnRfZHBmLmNvbXBhdGliaWxpdHlfcHJpb3JpdHkpLAotCSBBQ1BJX0FDQ0VQVEFCTEVfQ09ORklHVVJBVElPTiwKLQkgMn0sCi0KLQkvKiBHZXQgdGhlIGRlc2NyaXB0b3IgbGVuZ3RoICgwIG9yIDEgZm9yIFN0YXJ0IERwZiBkZXNjcmlwdG9yKSAqLwotCi0Je0FDUElfUlNDXzFCSVRGTEFHLCBBQ1BJX1JTX09GRlNFVChkYXRhLnN0YXJ0X2RwZi5kZXNjcmlwdG9yX2xlbmd0aCksCi0JIEFNTF9PRkZTRVQoc3RhcnRfZHBmLmRlc2NyaXB0b3JfdHlwZSksCi0JIDB9LAotCi0JLyogQWxsIGRvbmUgaWYgdGhlcmUgaXMgbm8gZmxhZyBieXRlIHByZXNlbnQgaW4gdGhlIGRlc2NyaXB0b3IgKi8KLQotCXtBQ1BJX1JTQ19FWElUX05FLCBBQ1BJX1JTQ19DT01QQVJFX0FNTF9MRU5HVEgsIDAsIDF9LAotCi0JLyogRmxhZyBieXRlIGlzIHByZXNlbnQsIGdldCB0aGUgZmxhZ3MgKi8KLQotCXtBQ1BJX1JTQ18yQklURkxBRywKLQkgQUNQSV9SU19PRkZTRVQoZGF0YS5zdGFydF9kcGYuY29tcGF0aWJpbGl0eV9wcmlvcml0eSksCi0JIEFNTF9PRkZTRVQoc3RhcnRfZHBmLmZsYWdzKSwKLQkgMH0sCi0KLQl7QUNQSV9SU0NfMkJJVEZMQUcsCi0JIEFDUElfUlNfT0ZGU0VUKGRhdGEuc3RhcnRfZHBmLnBlcmZvcm1hbmNlX3JvYnVzdG5lc3MpLAotCSBBTUxfT0ZGU0VUKHN0YXJ0X2RwZi5mbGFncyksCi0JIDJ9Ci19OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIGFjcGlfcnNfc2V0X3N0YXJ0X2RwZgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0cnVjdCBhY3BpX3JzY29udmVydF9pbmZvIGFjcGlfcnNfc2V0X3N0YXJ0X2RwZlsxMF0gPSB7Ci0JLyogU3RhcnQgd2l0aCBhIGRlZmF1bHQgZGVzY3JpcHRvciBvZiBsZW5ndGggMSAqLwotCi0Je0FDUElfUlNDX0lOSVRTRVQsIEFDUElfUkVTT1VSQ0VfTkFNRV9TVEFSVF9ERVBFTkRFTlQsCi0JIHNpemVvZihzdHJ1Y3QgYW1sX3Jlc291cmNlX3N0YXJ0X2RlcGVuZGVudCksCi0JIEFDUElfUlNDX1RBQkxFX1NJWkUoYWNwaV9yc19zZXRfc3RhcnRfZHBmKX0sCi0KLQkvKiBTZXQgdGhlIGRlZmF1bHQgZmxhZyB2YWx1ZXMgKi8KLQotCXtBQ1BJX1JTQ18yQklURkxBRywKLQkgQUNQSV9SU19PRkZTRVQoZGF0YS5zdGFydF9kcGYuY29tcGF0aWJpbGl0eV9wcmlvcml0eSksCi0JIEFNTF9PRkZTRVQoc3RhcnRfZHBmLmZsYWdzKSwKLQkgMH0sCi0KLQl7QUNQSV9SU0NfMkJJVEZMQUcsCi0JIEFDUElfUlNfT0ZGU0VUKGRhdGEuc3RhcnRfZHBmLnBlcmZvcm1hbmNlX3JvYnVzdG5lc3MpLAotCSBBTUxfT0ZGU0VUKHN0YXJ0X2RwZi5mbGFncyksCi0JIDJ9LAotCS8qCi0JICogQWxsIGRvbmUgaWYgdGhlIG91dHB1dCBkZXNjcmlwdG9yIGxlbmd0aCBpcyByZXF1aXJlZCB0byBiZSAxCi0JICogKGkuZS4sIG9wdGltaXphdGlvbiB0byAwIGJ5dGVzIGNhbm5vdCBiZSBhdHRlbXB0ZWQpCi0JICovCi0Je0FDUElfUlNDX0VYSVRfRVEsIEFDUElfUlNDX0NPTVBBUkVfVkFMVUUsCi0JIEFDUElfUlNfT0ZGU0VUKGRhdGEuc3RhcnRfZHBmLmRlc2NyaXB0b3JfbGVuZ3RoKSwKLQkgMX0sCi0KLQkvKiBTZXQgbGVuZ3RoIHRvIDAgYnl0ZXMgKG5vIGZsYWdzIGJ5dGUpICovCi0KLQl7QUNQSV9SU0NfTEVOR1RILCAwLCAwLAotCSBzaXplb2Yoc3RydWN0IGFtbF9yZXNvdXJjZV9zdGFydF9kZXBlbmRlbnRfbm9wcmlvKX0sCi0KLQkvKgotCSAqIEFsbCBkb25lIGlmIHRoZSBvdXRwdXQgZGVzY3JpcHRvciBsZW5ndGggaXMgcmVxdWlyZWQgdG8gYmUgMC4KLQkgKgotCSAqIFRCRDogUGVyaGFwcyB3ZSBzaG91bGQgY2hlY2sgZm9yIGVycm9yIGlmIGlucHV0IGZsYWdzIGFyZSBub3QKLQkgKiBjb21wYXRpYmxlIHdpdGggYSAwLWJ5dGUgZGVzY3JpcHRvci4KLQkgKi8KLQl7QUNQSV9SU0NfRVhJVF9FUSwgQUNQSV9SU0NfQ09NUEFSRV9WQUxVRSwKLQkgQUNQSV9SU19PRkZTRVQoZGF0YS5zdGFydF9kcGYuZGVzY3JpcHRvcl9sZW5ndGgpLAotCSAwfSwKLQotCS8qIFJlc2V0IGxlbmd0aCB0byAxIGJ5dGUgKGRlc2NyaXB0b3Igd2l0aCBmbGFncyBieXRlKSAqLwotCi0Je0FDUElfUlNDX0xFTkdUSCwgMCwgMCwgc2l6ZW9mKHN0cnVjdCBhbWxfcmVzb3VyY2Vfc3RhcnRfZGVwZW5kZW50KX0sCi0KLQkvKgotCSAqIEFsbCBkb25lIGlmIGZsYWdzIGJ5dGUgaXMgbmVjZXNzYXJ5IC0tIGlmIGVpdGhlciBwcmlvcml0eSB2YWx1ZQotCSAqIGlzIG5vdCBBQ1BJX0FDQ0VQVEFCTEVfQ09ORklHVVJBVElPTgotCSAqLwotCXtBQ1BJX1JTQ19FWElUX05FLCBBQ1BJX1JTQ19DT01QQVJFX1ZBTFVFLAotCSBBQ1BJX1JTX09GRlNFVChkYXRhLnN0YXJ0X2RwZi5jb21wYXRpYmlsaXR5X3ByaW9yaXR5KSwKLQkgQUNQSV9BQ0NFUFRBQkxFX0NPTkZJR1VSQVRJT059LAotCi0Je0FDUElfUlNDX0VYSVRfTkUsIEFDUElfUlNDX0NPTVBBUkVfVkFMVUUsCi0JIEFDUElfUlNfT0ZGU0VUKGRhdGEuc3RhcnRfZHBmLnBlcmZvcm1hbmNlX3JvYnVzdG5lc3MpLAotCSBBQ1BJX0FDQ0VQVEFCTEVfQ09ORklHVVJBVElPTn0sCi0KLQkvKiBGbGFnIGJ5dGUgaXMgbm90IG5lY2Vzc2FyeSAqLwotCi0Je0FDUElfUlNDX0xFTkdUSCwgMCwgMCwKLQkgc2l6ZW9mKHN0cnVjdCBhbWxfcmVzb3VyY2Vfc3RhcnRfZGVwZW5kZW50X25vcHJpbyl9Ci19OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3Jlc291cmNlcy9yc2lycS5jIGIvZHJpdmVycy9hY3BpL3Jlc291cmNlcy9yc2lycS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODgwNWVmLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvYWNwaS9yZXNvdXJjZXMvcnNpcnEuYworKysgL2Rldi9udWxsCkBAIC0xLDI2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIE1vZHVsZSBOYW1lOiByc2lycSAtIElSUSByZXNvdXJjZSBkZXNjcmlwdG9ycwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA4LCBJbnRlbCBDb3JwLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAotICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgYXQgbWluaW11bSBhIGRpc2NsYWltZXIKLSAqICAgIHN1YnN0YW50aWFsbHkgc2ltaWxhciB0byB0aGUgIk5PIFdBUlJBTlRZIiBkaXNjbGFpbWVyIGJlbG93Ci0gKiAgICAoIkRpc2NsYWltZXIiKSBhbmQgYW55IHJlZGlzdHJpYnV0aW9uIG11c3QgYmUgY29uZGl0aW9uZWQgdXBvbgotICogICAgaW5jbHVkaW5nIGEgc3Vic3RhbnRpYWxseSBzaW1pbGFyIERpc2NsYWltZXIgcmVxdWlyZW1lbnQgZm9yIGZ1cnRoZXIKLSAqICAgIGJpbmFyeSByZWRpc3RyaWJ1dGlvbi4KLSAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcwotICogICAgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICogU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBOTyBXQVJSQU5UWQotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCi0gKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUwotICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcKLSAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQotICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgotICovCi0KLSNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KLSNpbmNsdWRlIDxhY3BpL2FjcmVzcmMuaD4KLQotI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfUkVTT1VSQ0VTCi1BQ1BJX01PRFVMRV9OQU1FKCJyc2lycSIpCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogYWNwaV9yc19nZXRfaXJxCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0cnVjdCBhY3BpX3JzY29udmVydF9pbmZvIGFjcGlfcnNfZ2V0X2lycVs4XSA9IHsKLQl7QUNQSV9SU0NfSU5JVEdFVCwgQUNQSV9SRVNPVVJDRV9UWVBFX0lSUSwKLQkgQUNQSV9SU19TSVpFKHN0cnVjdCBhY3BpX3Jlc291cmNlX2lycSksCi0JIEFDUElfUlNDX1RBQkxFX1NJWkUoYWNwaV9yc19nZXRfaXJxKX0sCi0KLQkvKiBHZXQgdGhlIElSUSBtYXNrIChieXRlcyAxOjIpICovCi0KLQl7QUNQSV9SU0NfQklUTUFTSzE2LCBBQ1BJX1JTX09GRlNFVChkYXRhLmlycS5pbnRlcnJ1cHRzWzBdKSwKLQkgQU1MX09GRlNFVChpcnEuaXJxX21hc2spLAotCSBBQ1BJX1JTX09GRlNFVChkYXRhLmlycS5pbnRlcnJ1cHRfY291bnQpfSwKLQotCS8qIFNldCBkZWZhdWx0IGZsYWdzIChvdGhlcnMgYXJlIHplcm8pICovCi0KLQl7QUNQSV9SU0NfU0VUOCwgQUNQSV9SU19PRkZTRVQoZGF0YS5pcnEudHJpZ2dlcmluZyksCi0JIEFDUElfRURHRV9TRU5TSVRJVkUsCi0JIDF9LAotCi0JLyogR2V0IHRoZSBkZXNjcmlwdG9yIGxlbmd0aCAoMiBvciAzIGZvciBJUlEgZGVzY3JpcHRvcikgKi8KLQotCXtBQ1BJX1JTQ18yQklURkxBRywgQUNQSV9SU19PRkZTRVQoZGF0YS5pcnEuZGVzY3JpcHRvcl9sZW5ndGgpLAotCSBBTUxfT0ZGU0VUKGlycS5kZXNjcmlwdG9yX3R5cGUpLAotCSAwfSwKLQotCS8qIEFsbCBkb25lIGlmIG5vIGZsYWcgYnl0ZSBwcmVzZW50IGluIGRlc2NyaXB0b3IgKi8KLQotCXtBQ1BJX1JTQ19FWElUX05FLCBBQ1BJX1JTQ19DT01QQVJFX0FNTF9MRU5HVEgsIDAsIDN9LAotCi0JLyogR2V0IGZsYWdzOiBUcmlnZ2VyaW5nWzBdLCBQb2xhcml0eVszXSwgU2hhcmluZ1s0XSAqLwotCi0Je0FDUElfUlNDXzFCSVRGTEFHLCBBQ1BJX1JTX09GRlNFVChkYXRhLmlycS50cmlnZ2VyaW5nKSwKLQkgQU1MX09GRlNFVChpcnEuZmxhZ3MpLAotCSAwfSwKLQotCXtBQ1BJX1JTQ18xQklURkxBRywgQUNQSV9SU19PRkZTRVQoZGF0YS5pcnEucG9sYXJpdHkpLAotCSBBTUxfT0ZGU0VUKGlycS5mbGFncyksCi0JIDN9LAotCi0Je0FDUElfUlNDXzFCSVRGTEFHLCBBQ1BJX1JTX09GRlNFVChkYXRhLmlycS5zaGFyYWJsZSksCi0JIEFNTF9PRkZTRVQoaXJxLmZsYWdzKSwKLQkgNH0KLX07Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogYWNwaV9yc19zZXRfaXJxCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RydWN0IGFjcGlfcnNjb252ZXJ0X2luZm8gYWNwaV9yc19zZXRfaXJxWzEzXSA9IHsKLQkvKiBTdGFydCB3aXRoIGEgZGVmYXVsdCBkZXNjcmlwdG9yIG9mIGxlbmd0aCAzICovCi0KLQl7QUNQSV9SU0NfSU5JVFNFVCwgQUNQSV9SRVNPVVJDRV9OQU1FX0lSUSwKLQkgc2l6ZW9mKHN0cnVjdCBhbWxfcmVzb3VyY2VfaXJxKSwKLQkgQUNQSV9SU0NfVEFCTEVfU0laRShhY3BpX3JzX3NldF9pcnEpfSwKLQotCS8qIENvbnZlcnQgaW50ZXJydXB0IGxpc3QgdG8gMTYtYml0IElSUSBiaXRtYXNrICovCi0KLQl7QUNQSV9SU0NfQklUTUFTSzE2LCBBQ1BJX1JTX09GRlNFVChkYXRhLmlycS5pbnRlcnJ1cHRzWzBdKSwKLQkgQU1MX09GRlNFVChpcnEuaXJxX21hc2spLAotCSBBQ1BJX1JTX09GRlNFVChkYXRhLmlycS5pbnRlcnJ1cHRfY291bnQpfSwKLQotCS8qIFNldCB0aGUgZmxhZ3MgYnl0ZSAqLwotCi0Je0FDUElfUlNDXzFCSVRGTEFHLCBBQ1BJX1JTX09GRlNFVChkYXRhLmlycS50cmlnZ2VyaW5nKSwKLQkgQU1MX09GRlNFVChpcnEuZmxhZ3MpLAotCSAwfSwKLQotCXtBQ1BJX1JTQ18xQklURkxBRywgQUNQSV9SU19PRkZTRVQoZGF0YS5pcnEucG9sYXJpdHkpLAotCSBBTUxfT0ZGU0VUKGlycS5mbGFncyksCi0JIDN9LAotCi0Je0FDUElfUlNDXzFCSVRGTEFHLCBBQ1BJX1JTX09GRlNFVChkYXRhLmlycS5zaGFyYWJsZSksCi0JIEFNTF9PRkZTRVQoaXJxLmZsYWdzKSwKLQkgNH0sCi0KLQkvKgotCSAqIEFsbCBkb25lIGlmIHRoZSBvdXRwdXQgZGVzY3JpcHRvciBsZW5ndGggaXMgcmVxdWlyZWQgdG8gYmUgMwotCSAqIChpLmUuLCBvcHRpbWl6YXRpb24gdG8gMiBieXRlcyBjYW5ub3QgYmUgYXR0ZW1wdGVkKQotCSAqLwotCXtBQ1BJX1JTQ19FWElUX0VRLCBBQ1BJX1JTQ19DT01QQVJFX1ZBTFVFLAotCSBBQ1BJX1JTX09GRlNFVChkYXRhLmlycS5kZXNjcmlwdG9yX2xlbmd0aCksCi0JIDN9LAotCi0JLyogU2V0IGxlbmd0aCB0byAyIGJ5dGVzIChubyBmbGFncyBieXRlKSAqLwotCi0Je0FDUElfUlNDX0xFTkdUSCwgMCwgMCwgc2l6ZW9mKHN0cnVjdCBhbWxfcmVzb3VyY2VfaXJxX25vZmxhZ3MpfSwKLQotCS8qCi0JICogQWxsIGRvbmUgaWYgdGhlIG91dHB1dCBkZXNjcmlwdG9yIGxlbmd0aCBpcyByZXF1aXJlZCB0byBiZSAyLgotCSAqCi0JICogVEJEOiBQZXJoYXBzIHdlIHNob3VsZCBjaGVjayBmb3IgZXJyb3IgaWYgaW5wdXQgZmxhZ3MgYXJlIG5vdAotCSAqIGNvbXBhdGlibGUgd2l0aCBhIDItYnl0ZSBkZXNjcmlwdG9yLgotCSAqLwotCXtBQ1BJX1JTQ19FWElUX0VRLCBBQ1BJX1JTQ19DT01QQVJFX1ZBTFVFLAotCSBBQ1BJX1JTX09GRlNFVChkYXRhLmlycS5kZXNjcmlwdG9yX2xlbmd0aCksCi0JIDJ9LAotCi0JLyogUmVzZXQgbGVuZ3RoIHRvIDMgYnl0ZXMgKGRlc2NyaXB0b3Igd2l0aCBmbGFncyBieXRlKSAqLwotCi0Je0FDUElfUlNDX0xFTkdUSCwgMCwgMCwgc2l6ZW9mKHN0cnVjdCBhbWxfcmVzb3VyY2VfaXJxKX0sCi0KLQkvKgotCSAqIENoZWNrIGlmIHRoZSBmbGFncyBieXRlIGlzIG5lY2Vzc2FyeS4gTm90IG5lZWRlZCBpZiB0aGUgZmxhZ3MgYXJlOgotCSAqIEFDUElfRURHRV9TRU5TSVRJVkUsIEFDUElfQUNUSVZFX0hJR0gsIEFDUElfRVhDTFVTSVZFCi0JICovCi0Je0FDUElfUlNDX0VYSVRfTkUsIEFDUElfUlNDX0NPTVBBUkVfVkFMVUUsCi0JIEFDUElfUlNfT0ZGU0VUKGRhdGEuaXJxLnRyaWdnZXJpbmcpLAotCSBBQ1BJX0VER0VfU0VOU0lUSVZFfSwKLQotCXtBQ1BJX1JTQ19FWElUX05FLCBBQ1BJX1JTQ19DT01QQVJFX1ZBTFVFLAotCSBBQ1BJX1JTX09GRlNFVChkYXRhLmlycS5wb2xhcml0eSksCi0JIEFDUElfQUNUSVZFX0hJR0h9LAotCi0Je0FDUElfUlNDX0VYSVRfTkUsIEFDUElfUlNDX0NPTVBBUkVfVkFMVUUsCi0JIEFDUElfUlNfT0ZGU0VUKGRhdGEuaXJxLnNoYXJhYmxlKSwKLQkgQUNQSV9FWENMVVNJVkV9LAotCi0JLyogV2UgY2FuIG9wdGltaXplIHRvIGEgMi1ieXRlIGlycV9ub19mbGFncygpIGRlc2NyaXB0b3IgKi8KLQotCXtBQ1BJX1JTQ19MRU5HVEgsIDAsIDAsIHNpemVvZihzdHJ1Y3QgYW1sX3Jlc291cmNlX2lycV9ub2ZsYWdzKX0KLX07Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogYWNwaV9yc19jb252ZXJ0X2V4dF9pcnEKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdHJ1Y3QgYWNwaV9yc2NvbnZlcnRfaW5mbyBhY3BpX3JzX2NvbnZlcnRfZXh0X2lycVs5XSA9IHsKLQl7QUNQSV9SU0NfSU5JVEdFVCwgQUNQSV9SRVNPVVJDRV9UWVBFX0VYVEVOREVEX0lSUSwKLQkgQUNQSV9SU19TSVpFKHN0cnVjdCBhY3BpX3Jlc291cmNlX2V4dGVuZGVkX2lycSksCi0JIEFDUElfUlNDX1RBQkxFX1NJWkUoYWNwaV9yc19jb252ZXJ0X2V4dF9pcnEpfSwKLQotCXtBQ1BJX1JTQ19JTklUU0VULCBBQ1BJX1JFU09VUkNFX05BTUVfRVhURU5ERURfSVJRLAotCSBzaXplb2Yoc3RydWN0IGFtbF9yZXNvdXJjZV9leHRlbmRlZF9pcnEpLAotCSAwfSwKLQotCS8qIEZsYWcgYml0cyAqLwotCi0Je0FDUElfUlNDXzFCSVRGTEFHLCBBQ1BJX1JTX09GRlNFVChkYXRhLmV4dGVuZGVkX2lycS5wcm9kdWNlcl9jb25zdW1lciksCi0JIEFNTF9PRkZTRVQoZXh0ZW5kZWRfaXJxLmZsYWdzKSwKLQkgMH0sCi0KLQl7QUNQSV9SU0NfMUJJVEZMQUcsIEFDUElfUlNfT0ZGU0VUKGRhdGEuZXh0ZW5kZWRfaXJxLnRyaWdnZXJpbmcpLAotCSBBTUxfT0ZGU0VUKGV4dGVuZGVkX2lycS5mbGFncyksCi0JIDF9LAotCi0Je0FDUElfUlNDXzFCSVRGTEFHLCBBQ1BJX1JTX09GRlNFVChkYXRhLmV4dGVuZGVkX2lycS5wb2xhcml0eSksCi0JIEFNTF9PRkZTRVQoZXh0ZW5kZWRfaXJxLmZsYWdzKSwKLQkgMn0sCi0KLQl7QUNQSV9SU0NfMUJJVEZMQUcsIEFDUElfUlNfT0ZGU0VUKGRhdGEuZXh0ZW5kZWRfaXJxLnNoYXJhYmxlKSwKLQkgQU1MX09GRlNFVChleHRlbmRlZF9pcnEuZmxhZ3MpLAotCSAzfSwKLQotCS8qIElSUSBUYWJsZSBsZW5ndGggKEJ5dGU0KSAqLwotCi0Je0FDUElfUlNDX0NPVU5ULCBBQ1BJX1JTX09GRlNFVChkYXRhLmV4dGVuZGVkX2lycS5pbnRlcnJ1cHRfY291bnQpLAotCSBBTUxfT0ZGU0VUKGV4dGVuZGVkX2lycS5pbnRlcnJ1cHRfY291bnQpLAotCSBzaXplb2YodTMyKX0KLQksCi0KLQkvKiBDb3B5IGV2ZXJ5IElSUSBpbiB0aGUgdGFibGUsIGVhY2ggaXMgMzIgYml0cyAqLwotCi0Je0FDUElfUlNDX01PVkUzMiwgQUNQSV9SU19PRkZTRVQoZGF0YS5leHRlbmRlZF9pcnEuaW50ZXJydXB0c1swXSksCi0JIEFNTF9PRkZTRVQoZXh0ZW5kZWRfaXJxLmludGVycnVwdHNbMF0pLAotCSAwfQotCSwKLQotCS8qIE9wdGlvbmFsIHJlc291cmNlX3NvdXJjZSAoSW5kZXggYW5kIFN0cmluZykgKi8KLQotCXtBQ1BJX1JTQ19TT1VSQ0VYLCBBQ1BJX1JTX09GRlNFVChkYXRhLmV4dGVuZGVkX2lycS5yZXNvdXJjZV9zb3VyY2UpLAotCSBBQ1BJX1JTX09GRlNFVChkYXRhLmV4dGVuZGVkX2lycS5pbnRlcnJ1cHRzWzBdKSwKLQkgc2l6ZW9mKHN0cnVjdCBhbWxfcmVzb3VyY2VfZXh0ZW5kZWRfaXJxKX0KLX07Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogYWNwaV9yc19jb252ZXJ0X2RtYQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0cnVjdCBhY3BpX3JzY29udmVydF9pbmZvIGFjcGlfcnNfY29udmVydF9kbWFbNl0gPSB7Ci0Je0FDUElfUlNDX0lOSVRHRVQsIEFDUElfUkVTT1VSQ0VfVFlQRV9ETUEsCi0JIEFDUElfUlNfU0laRShzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9kbWEpLAotCSBBQ1BJX1JTQ19UQUJMRV9TSVpFKGFjcGlfcnNfY29udmVydF9kbWEpfSwKLQotCXtBQ1BJX1JTQ19JTklUU0VULCBBQ1BJX1JFU09VUkNFX05BTUVfRE1BLAotCSBzaXplb2Yoc3RydWN0IGFtbF9yZXNvdXJjZV9kbWEpLAotCSAwfSwKLQotCS8qIEZsYWdzOiB0cmFuc2ZlciBwcmVmZXJlbmNlLCBidXMgbWFzdGVyaW5nLCBjaGFubmVsIHNwZWVkICovCi0KLQl7QUNQSV9SU0NfMkJJVEZMQUcsIEFDUElfUlNfT0ZGU0VUKGRhdGEuZG1hLnRyYW5zZmVyKSwKLQkgQU1MX09GRlNFVChkbWEuZmxhZ3MpLAotCSAwfSwKLQotCXtBQ1BJX1JTQ18xQklURkxBRywgQUNQSV9SU19PRkZTRVQoZGF0YS5kbWEuYnVzX21hc3RlciksCi0JIEFNTF9PRkZTRVQoZG1hLmZsYWdzKSwKLQkgMn0sCi0KLQl7QUNQSV9SU0NfMkJJVEZMQUcsIEFDUElfUlNfT0ZGU0VUKGRhdGEuZG1hLnR5cGUpLAotCSBBTUxfT0ZGU0VUKGRtYS5mbGFncyksCi0JIDV9LAotCi0JLyogRE1BIGNoYW5uZWwgbWFzayBiaXRzICovCi0KLQl7QUNQSV9SU0NfQklUTUFTSywgQUNQSV9SU19PRkZTRVQoZGF0YS5kbWEuY2hhbm5lbHNbMF0pLAotCSBBTUxfT0ZGU0VUKGRtYS5kbWFfY2hhbm5lbF9tYXNrKSwKLQkgQUNQSV9SU19PRkZTRVQoZGF0YS5kbWEuY2hhbm5lbF9jb3VudCl9Ci19OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3Jlc291cmNlcy9yc2xpc3QuYyBiL2RyaXZlcnMvYWNwaS9yZXNvdXJjZXMvcnNsaXN0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3OGM3ZTcuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9hY3BpL3Jlc291cmNlcy9yc2xpc3QuYworKysgL2Rldi9udWxsCkBAIC0xLDIwMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIE1vZHVsZSBOYW1lOiByc2xpc3QgLSBMaW5rZWQgbGlzdCB1dGlsaXRpZXMKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwOCwgSW50ZWwgQ29ycC4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKLSAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIGF0IG1pbmltdW0gYSBkaXNjbGFpbWVyCi0gKiAgICBzdWJzdGFudGlhbGx5IHNpbWlsYXIgdG8gdGhlICJOTyBXQVJSQU5UWSIgZGlzY2xhaW1lciBiZWxvdwotICogICAgKCJEaXNjbGFpbWVyIikgYW5kIGFueSByZWRpc3RyaWJ1dGlvbiBtdXN0IGJlIGNvbmRpdGlvbmVkIHVwb24KLSAqICAgIGluY2x1ZGluZyBhIHN1YnN0YW50aWFsbHkgc2ltaWxhciBEaXNjbGFpbWVyIHJlcXVpcmVtZW50IGZvciBmdXJ0aGVyCi0gKiAgICBiaW5hcnkgcmVkaXN0cmlidXRpb24uCi0gKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMKLSAqICAgIG9mIGFueSBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTk8gV0FSUkFOVFkKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAotICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKLSAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HCi0gKiBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKLSAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KLSAqLwotCi0jaW5jbHVkZSA8YWNwaS9hY3BpLmg+Ci0jaW5jbHVkZSA8YWNwaS9hY3Jlc3JjLmg+Ci0KLSNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX1JFU09VUkNFUwotQUNQSV9NT0RVTEVfTkFNRSgicnNsaXN0IikKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9yc19jb252ZXJ0X2FtbF90b19yZXNvdXJjZXMKLSAqCi0gKiBQQVJBTUVURVJTOiAgYWNwaV93YWxrX2FtbF9jYWxsYmFjawotICogICAgICAgICAgICAgIHJlc291cmNlX3B0ciAgICAgICAgICAgIC0gUG9pbnRlciB0byB0aGUgYnVmZmVyIHRoYXQgd2lsbAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbiB0aGUgb3V0cHV0IHN0cnVjdHVyZXMKLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IENvbnZlcnQgYW4gQU1MIHJlc291cmNlIHRvIGFuIGludGVybmFsIHJlcHJlc2VudGF0aW9uIG9mIHRoZQotICogICAgICAgICAgICAgIHJlc291cmNlIHRoYXQgaXMgYWxpZ25lZCBhbmQgZWFzaWVyIHRvIGFjY2Vzcy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYWNwaV9zdGF0dXMKLWFjcGlfcnNfY29udmVydF9hbWxfdG9fcmVzb3VyY2VzKHU4ICogYW1sLAotCQkJCSB1MzIgbGVuZ3RoLAotCQkJCSB1MzIgb2Zmc2V0LCB1OCByZXNvdXJjZV9pbmRleCwgdm9pZCAqKmNvbnRleHQpCi17Ci0Jc3RydWN0IGFjcGlfcmVzb3VyY2UgKipyZXNvdXJjZV9wdHIgPQotCSAgICBBQ1BJX0NBU1RfSU5ESVJFQ1RfUFRSKHN0cnVjdCBhY3BpX3Jlc291cmNlLCBjb250ZXh0KTsKLQlzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAqcmVzb3VyY2U7Ci0JYWNwaV9zdGF0dXMgc3RhdHVzOwotCi0JQUNQSV9GVU5DVElPTl9UUkFDRShyc19jb252ZXJ0X2FtbF90b19yZXNvdXJjZXMpOwotCi0JLyoKLQkgKiBDaGVjayB0aGF0IHRoZSBpbnB1dCBidWZmZXIgYW5kIGFsbCBzdWJzZXF1ZW50IHBvaW50ZXJzIGludG8gaXQKLQkgKiBhcmUgYWxpZ25lZCBvbiBhIG5hdGl2ZSB3b3JkIGJvdW5kYXJ5LiBNb3N0IGltcG9ydGFudCBvbiBJQTY0Ci0JICovCi0JcmVzb3VyY2UgPSAqcmVzb3VyY2VfcHRyOwotCWlmIChBQ1BJX0lTX01JU0FMSUdORUQocmVzb3VyY2UpKSB7Ci0JCUFDUElfV0FSTklORygoQUVfSU5GTywKLQkJCSAgICAgICJNaXNhbGlnbmVkIHJlc291cmNlIHBvaW50ZXIgJXAiLCByZXNvdXJjZSkpOwotCX0KLQotCS8qIENvbnZlcnQgdGhlIEFNTCBieXRlIHN0cmVhbSByZXNvdXJjZSB0byBhIGxvY2FsIHJlc291cmNlIHN0cnVjdCAqLwotCi0Jc3RhdHVzID0KLQkgICAgYWNwaV9yc19jb252ZXJ0X2FtbF90b19yZXNvdXJjZShyZXNvdXJjZSwKLQkJCQkJICAgIEFDUElfQ0FTVF9QVFIodW5pb24gYW1sX3Jlc291cmNlLAotCQkJCQkJCSAgYW1sKSwKLQkJCQkJICAgIGFjcGlfZ2JsX2dldF9yZXNvdXJjZV9kaXNwYXRjaAotCQkJCQkgICAgW3Jlc291cmNlX2luZGV4XSk7Ci0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCUFDUElfRVhDRVBUSU9OKChBRV9JTkZPLCBzdGF0dXMsCi0JCQkJIkNvdWxkIG5vdCBjb252ZXJ0IEFNTCByZXNvdXJjZSAoVHlwZSAlWCkiLAotCQkJCSphbWwpKTsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci0JfQotCi0JQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9SRVNPVVJDRVMsCi0JCQkgICJUeXBlICUuMlgsIEFtbExlbmd0aCAlLjJYIEludGVybmFsTGVuZ3RoICUuMlhcbiIsCi0JCQkgIGFjcGlfdXRfZ2V0X3Jlc291cmNlX3R5cGUoYW1sKSwgbGVuZ3RoLAotCQkJICByZXNvdXJjZS0+bGVuZ3RoKSk7Ci0KLQkvKiBQb2ludCB0byB0aGUgbmV4dCBzdHJ1Y3R1cmUgaW4gdGhlIG91dHB1dCBidWZmZXIgKi8KLQotCSpyZXNvdXJjZV9wdHIgPSBBQ1BJX0FERF9QVFIodm9pZCwgcmVzb3VyY2UsIHJlc291cmNlLT5sZW5ndGgpOwotCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfcnNfY29udmVydF9yZXNvdXJjZXNfdG9fYW1sCi0gKgotICogUEFSQU1FVEVSUzogIFJlc291cmNlICAgICAgICAgICAgLSBQb2ludGVyIHRvIHRoZSByZXNvdXJjZSBsaW5rZWQgbGlzdAotICogICAgICAgICAgICAgIGFtbF9zaXplX25lZWRlZCAgICAgLSBDYWxjdWxhdGVkIHNpemUgb2YgdGhlIGJ5dGUgc3RyZWFtCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRlZCBmcm9tIGNhbGxpbmcgYWNwaV9yc19nZXRfYW1sX2xlbmd0aCgpCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBzaXplIG9mIHRoZSBvdXRwdXRfYnVmZmVyIGlzCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1YXJhbnRlZWQgdG8gYmUgPj0gYW1sX3NpemVfbmVlZGVkCi0gKiAgICAgICAgICAgICAgb3V0cHV0X2J1ZmZlciAgICAgICAtIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0aGF0IHdpbGwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbiB0aGUgYnl0ZSBzdHJlYW0KLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IFRha2VzIHRoZSByZXNvdXJjZSBsaW5rZWQgbGlzdCBhbmQgcGFyc2VzIGl0LCBjcmVhdGluZyBhCi0gKiAgICAgICAgICAgICAgYnl0ZSBzdHJlYW0gb2YgcmVzb3VyY2VzIGluIHRoZSBjYWxsZXIncyBvdXRwdXQgYnVmZmVyCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotYWNwaV9zdGF0dXMKLWFjcGlfcnNfY29udmVydF9yZXNvdXJjZXNfdG9fYW1sKHN0cnVjdCBhY3BpX3Jlc291cmNlICpyZXNvdXJjZSwKLQkJCQkgYWNwaV9zaXplIGFtbF9zaXplX25lZWRlZCwgdTggKiBvdXRwdXRfYnVmZmVyKQotewotCXU4ICphbWwgPSBvdXRwdXRfYnVmZmVyOwotCXU4ICplbmRfYW1sID0gb3V0cHV0X2J1ZmZlciArIGFtbF9zaXplX25lZWRlZDsKLQlhY3BpX3N0YXR1cyBzdGF0dXM7Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKHJzX2NvbnZlcnRfcmVzb3VyY2VzX3RvX2FtbCk7Ci0KLQkvKiBXYWxrIHRoZSByZXNvdXJjZSBkZXNjcmlwdG9yIGxpc3QsIGNvbnZlcnQgZWFjaCBkZXNjcmlwdG9yICovCi0KLQl3aGlsZSAoYW1sIDwgZW5kX2FtbCkgewotCi0JCS8qIFZhbGlkYXRlIHRoZSAoaW50ZXJuYWwpIFJlc291cmNlIFR5cGUgKi8KLQotCQlpZiAocmVzb3VyY2UtPnR5cGUgPiBBQ1BJX1JFU09VUkNFX1RZUEVfTUFYKSB7Ci0JCQlBQ1BJX0VSUk9SKChBRV9JTkZPLAotCQkJCSAgICAiSW52YWxpZCBkZXNjcmlwdG9yIHR5cGUgKCVYKSBpbiByZXNvdXJjZSBsaXN0IiwKLQkJCQkgICAgcmVzb3VyY2UtPnR5cGUpKTsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfREFUQSk7Ci0JCX0KLQotCQkvKiBQZXJmb3JtIHRoZSBjb252ZXJzaW9uICovCi0KLQkJc3RhdHVzID0gYWNwaV9yc19jb252ZXJ0X3Jlc291cmNlX3RvX2FtbChyZXNvdXJjZSwgQUNQSV9DQVNUX1BUUih1bmlvbgotCQkJCQkJCQkJCSBhbWxfcmVzb3VyY2UsCi0JCQkJCQkJCQkJIGFtbCksCi0JCQkJCQkJIGFjcGlfZ2JsX3NldF9yZXNvdXJjZV9kaXNwYXRjaAotCQkJCQkJCSBbcmVzb3VyY2UtPnR5cGVdKTsKLQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCQlBQ1BJX0VYQ0VQVElPTigoQUVfSU5GTywgc3RhdHVzLAotCQkJCQkiQ291bGQgbm90IGNvbnZlcnQgcmVzb3VyY2UgKHR5cGUgJVgpIHRvIEFNTCIsCi0JCQkJCXJlc291cmNlLT50eXBlKSk7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLQkJfQotCi0JCS8qIFBlcmZvcm0gZmluYWwgc2FuaXR5IGNoZWNrIG9uIHRoZSBuZXcgQU1MIHJlc291cmNlIGRlc2NyaXB0b3IgKi8KLQotCQlzdGF0dXMgPQotCQkgICAgYWNwaV91dF92YWxpZGF0ZV9yZXNvdXJjZShBQ1BJX0NBU1RfUFRSCi0JCQkJCSAgICAgICh1bmlvbiBhbWxfcmVzb3VyY2UsIGFtbCksIE5VTEwpOwotCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotCQl9Ci0KLQkJLyogQ2hlY2sgZm9yIGVuZC1vZi1saXN0LCBub3JtYWwgZXhpdCAqLwotCi0JCWlmIChyZXNvdXJjZS0+dHlwZSA9PSBBQ1BJX1JFU09VUkNFX1RZUEVfRU5EX1RBRykgewotCi0JCQkvKiBBbiBFbmQgVGFnIGluZGljYXRlcyB0aGUgZW5kIG9mIHRoZSBpbnB1dCBSZXNvdXJjZSBUZW1wbGF0ZSAqLwotCi0JCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwotCQl9Ci0KLQkJLyoKLQkJICogRXh0cmFjdCB0aGUgdG90YWwgbGVuZ3RoIG9mIHRoZSBuZXcgZGVzY3JpcHRvciBhbmQgc2V0IHRoZQotCQkgKiBBbWwgdG8gcG9pbnQgdG8gdGhlIG5leHQgKG91dHB1dCkgcmVzb3VyY2UgZGVzY3JpcHRvcgotCQkgKi8KLQkJYW1sICs9IGFjcGlfdXRfZ2V0X2Rlc2NyaXB0b3JfbGVuZ3RoKGFtbCk7Ci0KLQkJLyogUG9pbnQgdG8gdGhlIG5leHQgaW5wdXQgcmVzb3VyY2UgZGVzY3JpcHRvciAqLwotCi0JCXJlc291cmNlID0KLQkJICAgIEFDUElfQUREX1BUUihzdHJ1Y3QgYWNwaV9yZXNvdXJjZSwgcmVzb3VyY2UsCi0JCQkJIHJlc291cmNlLT5sZW5ndGgpOwotCX0KLQotCS8qIENvbXBsZXRlZCBidWZmZXIsIGJ1dCBkaWQgbm90IGZpbmQgYW4gZW5kX3RhZyByZXNvdXJjZSBkZXNjcmlwdG9yICovCi0KLQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX05PX1JFU09VUkNFX0VORF9UQUcpOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3Jlc291cmNlcy9yc21lbW9yeS5jIGIvZHJpdmVycy9hY3BpL3Jlc291cmNlcy9yc21lbW9yeS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2M2IyMWFiLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvYWNwaS9yZXNvdXJjZXMvcnNtZW1vcnkuYworKysgL2Rldi9udWxsCkBAIC0xLDIzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIE1vZHVsZSBOYW1lOiByc21lbTI0IC0gTWVtb3J5IHJlc291cmNlIGRlc2NyaXB0b3JzCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDgsIEludGVsIENvcnAuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCi0gKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSBhdCBtaW5pbXVtIGEgZGlzY2xhaW1lcgotICogICAgc3Vic3RhbnRpYWxseSBzaW1pbGFyIHRvIHRoZSAiTk8gV0FSUkFOVFkiIGRpc2NsYWltZXIgYmVsb3cKLSAqICAgICgiRGlzY2xhaW1lciIpIGFuZCBhbnkgcmVkaXN0cmlidXRpb24gbXVzdCBiZSBjb25kaXRpb25lZCB1cG9uCi0gKiAgICBpbmNsdWRpbmcgYSBzdWJzdGFudGlhbGx5IHNpbWlsYXIgRGlzY2xhaW1lciByZXF1aXJlbWVudCBmb3IgZnVydGhlcgotICogICAgYmluYXJ5IHJlZGlzdHJpYnV0aW9uLgotICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzCi0gKiAgICBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIE5PIFdBUlJBTlRZCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKLSAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCi0gKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORwotICogSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCi0gKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCi0gKi8KLQotI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgotI2luY2x1ZGUgPGFjcGkvYWNyZXNyYy5oPgotCi0jZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9SRVNPVVJDRVMKLUFDUElfTU9EVUxFX05BTUUoInJzbWVtb3J5IikKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBhY3BpX3JzX2NvbnZlcnRfbWVtb3J5MjQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RydWN0IGFjcGlfcnNjb252ZXJ0X2luZm8gYWNwaV9yc19jb252ZXJ0X21lbW9yeTI0WzRdID0gewotCXtBQ1BJX1JTQ19JTklUR0VULCBBQ1BJX1JFU09VUkNFX1RZUEVfTUVNT1JZMjQsCi0JIEFDUElfUlNfU0laRShzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9tZW1vcnkyNCksCi0JIEFDUElfUlNDX1RBQkxFX1NJWkUoYWNwaV9yc19jb252ZXJ0X21lbW9yeTI0KX0sCi0KLQl7QUNQSV9SU0NfSU5JVFNFVCwgQUNQSV9SRVNPVVJDRV9OQU1FX01FTU9SWTI0LAotCSBzaXplb2Yoc3RydWN0IGFtbF9yZXNvdXJjZV9tZW1vcnkyNCksCi0JIDB9LAotCi0JLyogUmVhZC9Xcml0ZSBiaXQgKi8KLQotCXtBQ1BJX1JTQ18xQklURkxBRywgQUNQSV9SU19PRkZTRVQoZGF0YS5tZW1vcnkyNC53cml0ZV9wcm90ZWN0KSwKLQkgQU1MX09GRlNFVChtZW1vcnkyNC5mbGFncyksCi0JIDB9LAotCS8qCi0JICogVGhlc2UgZmllbGRzIGFyZSBjb250aWd1b3VzIGluIGJvdGggdGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb246Ci0JICogTWluaW11bSBCYXNlIEFkZHJlc3MKLQkgKiBNYXhpbXVtIEJhc2UgQWRkcmVzcwotCSAqIEFkZHJlc3MgQmFzZSBBbGlnbm1lbnQKLQkgKiBSYW5nZSBMZW5ndGgKLQkgKi8KLQl7QUNQSV9SU0NfTU9WRTE2LCBBQ1BJX1JTX09GRlNFVChkYXRhLm1lbW9yeTI0Lm1pbmltdW0pLAotCSBBTUxfT0ZGU0VUKG1lbW9yeTI0Lm1pbmltdW0pLAotCSA0fQotfTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBhY3BpX3JzX2NvbnZlcnRfbWVtb3J5MzIKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdHJ1Y3QgYWNwaV9yc2NvbnZlcnRfaW5mbyBhY3BpX3JzX2NvbnZlcnRfbWVtb3J5MzJbNF0gPSB7Ci0Je0FDUElfUlNDX0lOSVRHRVQsIEFDUElfUkVTT1VSQ0VfVFlQRV9NRU1PUlkzMiwKLQkgQUNQSV9SU19TSVpFKHN0cnVjdCBhY3BpX3Jlc291cmNlX21lbW9yeTMyKSwKLQkgQUNQSV9SU0NfVEFCTEVfU0laRShhY3BpX3JzX2NvbnZlcnRfbWVtb3J5MzIpfSwKLQotCXtBQ1BJX1JTQ19JTklUU0VULCBBQ1BJX1JFU09VUkNFX05BTUVfTUVNT1JZMzIsCi0JIHNpemVvZihzdHJ1Y3QgYW1sX3Jlc291cmNlX21lbW9yeTMyKSwKLQkgMH0sCi0KLQkvKiBSZWFkL1dyaXRlIGJpdCAqLwotCi0Je0FDUElfUlNDXzFCSVRGTEFHLCBBQ1BJX1JTX09GRlNFVChkYXRhLm1lbW9yeTMyLndyaXRlX3Byb3RlY3QpLAotCSBBTUxfT0ZGU0VUKG1lbW9yeTMyLmZsYWdzKSwKLQkgMH0sCi0JLyoKLQkgKiBUaGVzZSBmaWVsZHMgYXJlIGNvbnRpZ3VvdXMgaW4gYm90aCB0aGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbjoKLQkgKiBNaW5pbXVtIEJhc2UgQWRkcmVzcwotCSAqIE1heGltdW0gQmFzZSBBZGRyZXNzCi0JICogQWRkcmVzcyBCYXNlIEFsaWdubWVudAotCSAqIFJhbmdlIExlbmd0aAotCSAqLwotCXtBQ1BJX1JTQ19NT1ZFMzIsIEFDUElfUlNfT0ZGU0VUKGRhdGEubWVtb3J5MzIubWluaW11bSksCi0JIEFNTF9PRkZTRVQobWVtb3J5MzIubWluaW11bSksCi0JIDR9Ci19OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIGFjcGlfcnNfY29udmVydF9maXhlZF9tZW1vcnkzMgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0cnVjdCBhY3BpX3JzY29udmVydF9pbmZvIGFjcGlfcnNfY29udmVydF9maXhlZF9tZW1vcnkzMls0XSA9IHsKLQl7QUNQSV9SU0NfSU5JVEdFVCwgQUNQSV9SRVNPVVJDRV9UWVBFX0ZJWEVEX01FTU9SWTMyLAotCSBBQ1BJX1JTX1NJWkUoc3RydWN0IGFjcGlfcmVzb3VyY2VfZml4ZWRfbWVtb3J5MzIpLAotCSBBQ1BJX1JTQ19UQUJMRV9TSVpFKGFjcGlfcnNfY29udmVydF9maXhlZF9tZW1vcnkzMil9LAotCi0Je0FDUElfUlNDX0lOSVRTRVQsIEFDUElfUkVTT1VSQ0VfTkFNRV9GSVhFRF9NRU1PUlkzMiwKLQkgc2l6ZW9mKHN0cnVjdCBhbWxfcmVzb3VyY2VfZml4ZWRfbWVtb3J5MzIpLAotCSAwfSwKLQotCS8qIFJlYWQvV3JpdGUgYml0ICovCi0KLQl7QUNQSV9SU0NfMUJJVEZMQUcsIEFDUElfUlNfT0ZGU0VUKGRhdGEuZml4ZWRfbWVtb3J5MzIud3JpdGVfcHJvdGVjdCksCi0JIEFNTF9PRkZTRVQoZml4ZWRfbWVtb3J5MzIuZmxhZ3MpLAotCSAwfSwKLQkvKgotCSAqIFRoZXNlIGZpZWxkcyBhcmUgY29udGlndW91cyBpbiBib3RoIHRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uOgotCSAqIEJhc2UgQWRkcmVzcwotCSAqIFJhbmdlIExlbmd0aAotCSAqLwotCXtBQ1BJX1JTQ19NT1ZFMzIsIEFDUElfUlNfT0ZGU0VUKGRhdGEuZml4ZWRfbWVtb3J5MzIuYWRkcmVzcyksCi0JIEFNTF9PRkZTRVQoZml4ZWRfbWVtb3J5MzIuYWRkcmVzcyksCi0JIDJ9Ci19OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIGFjcGlfcnNfZ2V0X3ZlbmRvcl9zbWFsbAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0cnVjdCBhY3BpX3JzY29udmVydF9pbmZvIGFjcGlfcnNfZ2V0X3ZlbmRvcl9zbWFsbFszXSA9IHsKLQl7QUNQSV9SU0NfSU5JVEdFVCwgQUNQSV9SRVNPVVJDRV9UWVBFX1ZFTkRPUiwKLQkgQUNQSV9SU19TSVpFKHN0cnVjdCBhY3BpX3Jlc291cmNlX3ZlbmRvciksCi0JIEFDUElfUlNDX1RBQkxFX1NJWkUoYWNwaV9yc19nZXRfdmVuZG9yX3NtYWxsKX0sCi0KLQkvKiBMZW5ndGggb2YgdGhlIHZlbmRvciBkYXRhIChieXRlIGNvdW50KSAqLwotCi0Je0FDUElfUlNDX0NPVU5UMTYsIEFDUElfUlNfT0ZGU0VUKGRhdGEudmVuZG9yLmJ5dGVfbGVuZ3RoKSwKLQkgMCwKLQkgc2l6ZW9mKHU4KX0KLQksCi0KLQkvKiBWZW5kb3IgZGF0YSAqLwotCi0Je0FDUElfUlNDX01PVkU4LCBBQ1BJX1JTX09GRlNFVChkYXRhLnZlbmRvci5ieXRlX2RhdGFbMF0pLAotCSBzaXplb2Yoc3RydWN0IGFtbF9yZXNvdXJjZV9zbWFsbF9oZWFkZXIpLAotCSAwfQotfTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBhY3BpX3JzX2dldF92ZW5kb3JfbGFyZ2UKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdHJ1Y3QgYWNwaV9yc2NvbnZlcnRfaW5mbyBhY3BpX3JzX2dldF92ZW5kb3JfbGFyZ2VbM10gPSB7Ci0Je0FDUElfUlNDX0lOSVRHRVQsIEFDUElfUkVTT1VSQ0VfVFlQRV9WRU5ET1IsCi0JIEFDUElfUlNfU0laRShzdHJ1Y3QgYWNwaV9yZXNvdXJjZV92ZW5kb3IpLAotCSBBQ1BJX1JTQ19UQUJMRV9TSVpFKGFjcGlfcnNfZ2V0X3ZlbmRvcl9sYXJnZSl9LAotCi0JLyogTGVuZ3RoIG9mIHRoZSB2ZW5kb3IgZGF0YSAoYnl0ZSBjb3VudCkgKi8KLQotCXtBQ1BJX1JTQ19DT1VOVDE2LCBBQ1BJX1JTX09GRlNFVChkYXRhLnZlbmRvci5ieXRlX2xlbmd0aCksCi0JIDAsCi0JIHNpemVvZih1OCl9Ci0JLAotCi0JLyogVmVuZG9yIGRhdGEgKi8KLQotCXtBQ1BJX1JTQ19NT1ZFOCwgQUNQSV9SU19PRkZTRVQoZGF0YS52ZW5kb3IuYnl0ZV9kYXRhWzBdKSwKLQkgc2l6ZW9mKHN0cnVjdCBhbWxfcmVzb3VyY2VfbGFyZ2VfaGVhZGVyKSwKLQkgMH0KLX07Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogYWNwaV9yc19zZXRfdmVuZG9yCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RydWN0IGFjcGlfcnNjb252ZXJ0X2luZm8gYWNwaV9yc19zZXRfdmVuZG9yWzddID0gewotCS8qIERlZmF1bHQgaXMgYSBzbWFsbCB2ZW5kb3IgZGVzY3JpcHRvciAqLwotCi0Je0FDUElfUlNDX0lOSVRTRVQsIEFDUElfUkVTT1VSQ0VfTkFNRV9WRU5ET1JfU01BTEwsCi0JIHNpemVvZihzdHJ1Y3QgYW1sX3Jlc291cmNlX3NtYWxsX2hlYWRlciksCi0JIEFDUElfUlNDX1RBQkxFX1NJWkUoYWNwaV9yc19zZXRfdmVuZG9yKX0sCi0KLQkvKiBHZXQgdGhlIGxlbmd0aCBhbmQgY29weSB0aGUgZGF0YSAqLwotCi0Je0FDUElfUlNDX0NPVU5UMTYsIEFDUElfUlNfT0ZGU0VUKGRhdGEudmVuZG9yLmJ5dGVfbGVuZ3RoKSwKLQkgMCwKLQkgMH0sCi0KLQl7QUNQSV9SU0NfTU9WRTgsIEFDUElfUlNfT0ZGU0VUKGRhdGEudmVuZG9yLmJ5dGVfZGF0YVswXSksCi0JIHNpemVvZihzdHJ1Y3QgYW1sX3Jlc291cmNlX3NtYWxsX2hlYWRlciksCi0JIDB9LAotCi0JLyoKLQkgKiBBbGwgZG9uZSBpZiB0aGUgVmVuZG9yIGJ5dGUgbGVuZ3RoIGlzIDcgb3IgbGVzcywgbWVhbmluZyB0aGF0IGl0IHdpbGwKLQkgKiBmaXQgd2l0aGluIGEgc21hbGwgZGVzY3JpcHRvcgotCSAqLwotCXtBQ1BJX1JTQ19FWElUX0xFLCAwLCAwLCA3fSwKLQotCS8qIE11c3QgY3JlYXRlIGEgbGFyZ2UgdmVuZG9yIGRlc2NyaXB0b3IgKi8KLQotCXtBQ1BJX1JTQ19JTklUU0VULCBBQ1BJX1JFU09VUkNFX05BTUVfVkVORE9SX0xBUkdFLAotCSBzaXplb2Yoc3RydWN0IGFtbF9yZXNvdXJjZV9sYXJnZV9oZWFkZXIpLAotCSAwfSwKLQotCXtBQ1BJX1JTQ19DT1VOVDE2LCBBQ1BJX1JTX09GRlNFVChkYXRhLnZlbmRvci5ieXRlX2xlbmd0aCksCi0JIDAsCi0JIDB9LAotCi0Je0FDUElfUlNDX01PVkU4LCBBQ1BJX1JTX09GRlNFVChkYXRhLnZlbmRvci5ieXRlX2RhdGFbMF0pLAotCSBzaXplb2Yoc3RydWN0IGFtbF9yZXNvdXJjZV9sYXJnZV9oZWFkZXIpLAotCSAwfQotfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9yZXNvdXJjZXMvcnNtaXNjLmMgYi9kcml2ZXJzL2FjcGkvcmVzb3VyY2VzL3JzbWlzYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NmE2YzAzLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvYWNwaS9yZXNvdXJjZXMvcnNtaXNjLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1NjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBNb2R1bGUgTmFtZTogcnNtaXNjIC0gTWlzY2VsbGFuZW91cyByZXNvdXJjZSBkZXNjcmlwdG9ycwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA4LCBJbnRlbCBDb3JwLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAotICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgYXQgbWluaW11bSBhIGRpc2NsYWltZXIKLSAqICAgIHN1YnN0YW50aWFsbHkgc2ltaWxhciB0byB0aGUgIk5PIFdBUlJBTlRZIiBkaXNjbGFpbWVyIGJlbG93Ci0gKiAgICAoIkRpc2NsYWltZXIiKSBhbmQgYW55IHJlZGlzdHJpYnV0aW9uIG11c3QgYmUgY29uZGl0aW9uZWQgdXBvbgotICogICAgaW5jbHVkaW5nIGEgc3Vic3RhbnRpYWxseSBzaW1pbGFyIERpc2NsYWltZXIgcmVxdWlyZW1lbnQgZm9yIGZ1cnRoZXIKLSAqICAgIGJpbmFyeSByZWRpc3RyaWJ1dGlvbi4KLSAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcwotICogICAgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICogU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBOTyBXQVJSQU5UWQotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCi0gKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUwotICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcKLSAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQotICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgotICovCi0KLSNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KLSNpbmNsdWRlIDxhY3BpL2FjcmVzcmMuaD4KLQotI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfUkVTT1VSQ0VTCi1BQ1BJX01PRFVMRV9OQU1FKCJyc21pc2MiKQotI2RlZmluZSBJTklUX1JFU09VUkNFX1RZUEUoaSkgICAgICAgaS0+cmVzb3VyY2Vfb2Zmc2V0Ci0jZGVmaW5lIElOSVRfUkVTT1VSQ0VfTEVOR1RIKGkpICAgICBpLT5hbWxfb2Zmc2V0Ci0jZGVmaW5lIElOSVRfVEFCTEVfTEVOR1RIKGkpICAgICAgICBpLT52YWx1ZQotI2RlZmluZSBDT01QQVJFX09QQ09ERShpKSAgICAgICAgICAgaS0+cmVzb3VyY2Vfb2Zmc2V0Ci0jZGVmaW5lIENPTVBBUkVfVEFSR0VUKGkpICAgICAgICAgICBpLT5hbWxfb2Zmc2V0Ci0jZGVmaW5lIENPTVBBUkVfVkFMVUUoaSkgICAgICAgICAgICBpLT52YWx1ZQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9yc19jb252ZXJ0X2FtbF90b19yZXNvdXJjZQotICoKLSAqIFBBUkFNRVRFUlM6ICBSZXNvdXJjZSAgICAgICAgICAgIC0gUG9pbnRlciB0byB0aGUgcmVzb3VyY2UgZGVzY3JpcHRvcgotICogICAgICAgICAgICAgIEFtbCAgICAgICAgICAgICAgICAgLSBXaGVyZSB0aGUgQU1MIGRlc2NyaXB0b3IgaXMgcmV0dXJuZWQKLSAqICAgICAgICAgICAgICBJbmZvICAgICAgICAgICAgICAgIC0gUG9pbnRlciB0byBhcHByb3ByaWF0ZSBjb252ZXJzaW9uIHRhYmxlCi0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cwotICoKLSAqIERFU0NSSVBUSU9OOiBDb252ZXJ0IGFuIGV4dGVybmFsIEFNTCByZXNvdXJjZSBkZXNjcmlwdG9yIHRvIHRoZSBjb3JyZXNwb25kaW5nCi0gKiAgICAgICAgICAgICAgaW50ZXJuYWwgcmVzb3VyY2UgZGVzY3JpcHRvcgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1hY3BpX3N0YXR1cwotYWNwaV9yc19jb252ZXJ0X2FtbF90b19yZXNvdXJjZShzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAqcmVzb3VyY2UsCi0JCQkJdW5pb24gYW1sX3Jlc291cmNlICphbWwsCi0JCQkJc3RydWN0IGFjcGlfcnNjb252ZXJ0X2luZm8gKmluZm8pCi17Ci0JYWNwaV9yc19sZW5ndGggYW1sX3Jlc291cmNlX2xlbmd0aDsKLQl2b2lkICpzb3VyY2U7Ci0Jdm9pZCAqZGVzdGluYXRpb247Ci0JY2hhciAqdGFyZ2V0OwotCXU4IGNvdW50OwotCXU4IGZsYWdzX21vZGUgPSBGQUxTRTsKLQl1MTYgaXRlbV9jb3VudCA9IDA7Ci0JdTE2IHRlbXAxNiA9IDA7Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKHJzX2NvbnZlcnRfYW1sX3RvX3Jlc291cmNlKTsKLQotCWlmICgoKGFjcGlfc2l6ZSkgcmVzb3VyY2UpICYgMHgzKSB7Ci0KLQkJLyogRWFjaCBpbnRlcm5hbCByZXNvdXJjZSBzdHJ1Y3QgaXMgZXhwZWN0ZWQgdG8gYmUgMzItYml0IGFsaWduZWQgKi8KLQotCQlBQ1BJX1dBUk5JTkcoKEFFX0lORk8sCi0JCQkgICAgICAiTWlzYWxpZ25lZCByZXNvdXJjZSBwb2ludGVyIChnZXQpOiAlcCBUeXBlICUyLjJYIExlbiAlWCIsCi0JCQkgICAgICByZXNvdXJjZSwgcmVzb3VyY2UtPnR5cGUsIHJlc291cmNlLT5sZW5ndGgpKTsKLQl9Ci0KLQkvKiBFeHRyYWN0IHRoZSByZXNvdXJjZSBMZW5ndGggZmllbGQgKGRvZXMgbm90IGluY2x1ZGUgaGVhZGVyIGxlbmd0aCkgKi8KLQotCWFtbF9yZXNvdXJjZV9sZW5ndGggPSBhY3BpX3V0X2dldF9yZXNvdXJjZV9sZW5ndGgoYW1sKTsKLQotCS8qCi0JICogRmlyc3QgdGFibGUgZW50cnkgbXVzdCBiZSBBQ1BJX1JTQ19JTklUeHh4IGFuZCBtdXN0IGNvbnRhaW4gdGhlCi0JICogdGFibGUgbGVuZ3RoICgjIG9mIHRhYmxlIGVudHJpZXMpCi0JICovCi0JY291bnQgPSBJTklUX1RBQkxFX0xFTkdUSChpbmZvKTsKLQotCXdoaWxlIChjb3VudCkgewotCQkvKgotCQkgKiBTb3VyY2UgaXMgdGhlIGV4dGVybmFsIEFNTCBieXRlIHN0cmVhbSBidWZmZXIsCi0JCSAqIGRlc3RpbmF0aW9uIGlzIHRoZSBpbnRlcm5hbCByZXNvdXJjZSBkZXNjcmlwdG9yCi0JCSAqLwotCQlzb3VyY2UgPSBBQ1BJX0FERF9QVFIodm9pZCwgYW1sLCBpbmZvLT5hbWxfb2Zmc2V0KTsKLQkJZGVzdGluYXRpb24gPQotCQkgICAgQUNQSV9BRERfUFRSKHZvaWQsIHJlc291cmNlLCBpbmZvLT5yZXNvdXJjZV9vZmZzZXQpOwotCi0JCXN3aXRjaCAoaW5mby0+b3Bjb2RlKSB7Ci0JCWNhc2UgQUNQSV9SU0NfSU5JVEdFVDoKLQkJCS8qCi0JCQkgKiBHZXQgdGhlIHJlc291cmNlIHR5cGUgYW5kIHRoZSBpbml0aWFsIChtaW5pbXVtKSBsZW5ndGgKLQkJCSAqLwotCQkJQUNQSV9NRU1TRVQocmVzb3VyY2UsIDAsIElOSVRfUkVTT1VSQ0VfTEVOR1RIKGluZm8pKTsKLQkJCXJlc291cmNlLT50eXBlID0gSU5JVF9SRVNPVVJDRV9UWVBFKGluZm8pOwotCQkJcmVzb3VyY2UtPmxlbmd0aCA9IElOSVRfUkVTT1VSQ0VfTEVOR1RIKGluZm8pOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBBQ1BJX1JTQ19JTklUU0VUOgotCQkJYnJlYWs7Ci0KLQkJY2FzZSBBQ1BJX1JTQ19GTEFHSU5JVDoKLQotCQkJZmxhZ3NfbW9kZSA9IFRSVUU7Ci0JCQlicmVhazsKLQotCQljYXNlIEFDUElfUlNDXzFCSVRGTEFHOgotCQkJLyoKLQkJCSAqIE1hc2sgYW5kIHNoaWZ0IHRoZSBmbGFnIGJpdAotCQkJICovCi0JCQlBQ1BJX1NFVDgoZGVzdGluYXRpb24pID0gKHU4KQotCQkJICAgICgoQUNQSV9HRVQ4KHNvdXJjZSkgPj4gaW5mby0+dmFsdWUpICYgMHgwMSk7Ci0JCQlicmVhazsKLQotCQljYXNlIEFDUElfUlNDXzJCSVRGTEFHOgotCQkJLyoKLQkJCSAqIE1hc2sgYW5kIHNoaWZ0IHRoZSBmbGFnIGJpdHMKLQkJCSAqLwotCQkJQUNQSV9TRVQ4KGRlc3RpbmF0aW9uKSA9ICh1OCkKLQkJCSAgICAoKEFDUElfR0VUOChzb3VyY2UpID4+IGluZm8tPnZhbHVlKSAmIDB4MDMpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBBQ1BJX1JTQ19DT1VOVDoKLQotCQkJaXRlbV9jb3VudCA9IEFDUElfR0VUOChzb3VyY2UpOwotCQkJQUNQSV9TRVQ4KGRlc3RpbmF0aW9uKSA9ICh1OCkgaXRlbV9jb3VudDsKLQotCQkJcmVzb3VyY2UtPmxlbmd0aCA9IHJlc291cmNlLT5sZW5ndGggKwotCQkJICAgIChpbmZvLT52YWx1ZSAqIChpdGVtX2NvdW50IC0gMSkpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBBQ1BJX1JTQ19DT1VOVDE2OgotCi0JCQlpdGVtX2NvdW50ID0gYW1sX3Jlc291cmNlX2xlbmd0aDsKLQkJCUFDUElfU0VUMTYoZGVzdGluYXRpb24pID0gaXRlbV9jb3VudDsKLQotCQkJcmVzb3VyY2UtPmxlbmd0aCA9IHJlc291cmNlLT5sZW5ndGggKwotCQkJICAgIChpbmZvLT52YWx1ZSAqIChpdGVtX2NvdW50IC0gMSkpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBBQ1BJX1JTQ19MRU5HVEg6Ci0KLQkJCXJlc291cmNlLT5sZW5ndGggPSByZXNvdXJjZS0+bGVuZ3RoICsgaW5mby0+dmFsdWU7Ci0JCQlicmVhazsKLQotCQljYXNlIEFDUElfUlNDX01PVkU4OgotCQljYXNlIEFDUElfUlNDX01PVkUxNjoKLQkJY2FzZSBBQ1BJX1JTQ19NT1ZFMzI6Ci0JCWNhc2UgQUNQSV9SU0NfTU9WRTY0OgotCQkJLyoKLQkJCSAqIFJhdyBkYXRhIG1vdmUuIFVzZSB0aGUgSW5mbyB2YWx1ZSBmaWVsZCB1bmxlc3MgaXRlbV9jb3VudCBoYXMKLQkJCSAqIGJlZW4gcHJldmlvdXNseSBpbml0aWFsaXplZCB2aWEgYSBDT1VOVCBvcGNvZGUKLQkJCSAqLwotCQkJaWYgKGluZm8tPnZhbHVlKSB7Ci0JCQkJaXRlbV9jb3VudCA9IGluZm8tPnZhbHVlOwotCQkJfQotCQkJYWNwaV9yc19tb3ZlX2RhdGEoZGVzdGluYXRpb24sIHNvdXJjZSwgaXRlbV9jb3VudCwKLQkJCQkJICBpbmZvLT5vcGNvZGUpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBBQ1BJX1JTQ19TRVQ4OgotCi0JCQlBQ1BJX01FTVNFVChkZXN0aW5hdGlvbiwgaW5mby0+YW1sX29mZnNldCwgaW5mby0+dmFsdWUpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBBQ1BJX1JTQ19EQVRBODoKLQotCQkJdGFyZ2V0ID0gQUNQSV9BRERfUFRSKGNoYXIsIHJlc291cmNlLCBpbmZvLT52YWx1ZSk7Ci0JCQlBQ1BJX01FTUNQWShkZXN0aW5hdGlvbiwgc291cmNlLCBBQ1BJX0dFVDE2KHRhcmdldCkpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBBQ1BJX1JTQ19BRERSRVNTOgotCQkJLyoKLQkJCSAqIENvbW1vbiBoYW5kbGVyIGZvciBhZGRyZXNzIGRlc2NyaXB0b3IgZmxhZ3MKLQkJCSAqLwotCQkJaWYgKCFhY3BpX3JzX2dldF9hZGRyZXNzX2NvbW1vbihyZXNvdXJjZSwgYW1sKSkgewotCQkJCXJldHVybl9BQ1BJX1NUQVRVUwotCQkJCSAgICAoQUVfQU1MX0lOVkFMSURfUkVTT1VSQ0VfVFlQRSk7Ci0JCQl9Ci0JCQlicmVhazsKLQotCQljYXNlIEFDUElfUlNDX1NPVVJDRToKLQkJCS8qCi0JCQkgKiBPcHRpb25hbCByZXNvdXJjZV9zb3VyY2UgKEluZGV4IGFuZCBTdHJpbmcpCi0JCQkgKi8KLQkJCXJlc291cmNlLT5sZW5ndGggKz0KLQkJCSAgICBhY3BpX3JzX2dldF9yZXNvdXJjZV9zb3VyY2UoYW1sX3Jlc291cmNlX2xlbmd0aCwKLQkJCQkJCQlpbmZvLT52YWx1ZSwKLQkJCQkJCQlkZXN0aW5hdGlvbiwgYW1sLCBOVUxMKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgQUNQSV9SU0NfU09VUkNFWDoKLQkJCS8qCi0JCQkgKiBPcHRpb25hbCByZXNvdXJjZV9zb3VyY2UgKEluZGV4IGFuZCBTdHJpbmcpLiBUaGlzIGlzIHRoZSBtb3JlCi0JCQkgKiBjb21wbGljYXRlZCBjYXNlIHVzZWQgYnkgdGhlIEludGVycnVwdCgpIG1hY3JvCi0JCQkgKi8KLQkJCXRhcmdldCA9Ci0JCQkgICAgQUNQSV9BRERfUFRSKGNoYXIsIHJlc291cmNlLAotCQkJCQkgaW5mby0+YW1sX29mZnNldCArIChpdGVtX2NvdW50ICogNCkpOwotCi0JCQlyZXNvdXJjZS0+bGVuZ3RoICs9Ci0JCQkgICAgYWNwaV9yc19nZXRfcmVzb3VyY2Vfc291cmNlKGFtbF9yZXNvdXJjZV9sZW5ndGgsCi0JCQkJCQkJKGFjcGlfcnNfbGVuZ3RoKSAoKChpdGVtX2NvdW50IC0gMSkgKiBzaXplb2YodTMyKSkgKyBpbmZvLT52YWx1ZSksIGRlc3RpbmF0aW9uLCBhbWwsIHRhcmdldCk7Ci0JCQlicmVhazsKLQotCQljYXNlIEFDUElfUlNDX0JJVE1BU0s6Ci0JCQkvKgotCQkJICogOC1iaXQgZW5jb2RlZCBiaXRtYXNrIChETUEgbWFjcm8pCi0JCQkgKi8KLQkJCWl0ZW1fY291bnQgPQotCQkJICAgIGFjcGlfcnNfZGVjb2RlX2JpdG1hc2soQUNQSV9HRVQ4KHNvdXJjZSksCi0JCQkJCQkgICBkZXN0aW5hdGlvbik7Ci0JCQlpZiAoaXRlbV9jb3VudCkgewotCQkJCXJlc291cmNlLT5sZW5ndGggKz0gKGl0ZW1fY291bnQgLSAxKTsKLQkJCX0KLQotCQkJdGFyZ2V0ID0gQUNQSV9BRERfUFRSKGNoYXIsIHJlc291cmNlLCBpbmZvLT52YWx1ZSk7Ci0JCQlBQ1BJX1NFVDgodGFyZ2V0KSA9ICh1OCkgaXRlbV9jb3VudDsKLQkJCWJyZWFrOwotCi0JCWNhc2UgQUNQSV9SU0NfQklUTUFTSzE2OgotCQkJLyoKLQkJCSAqIDE2LWJpdCBlbmNvZGVkIGJpdG1hc2sgKElSUSBtYWNybykKLQkJCSAqLwotCQkJQUNQSV9NT1ZFXzE2X1RPXzE2KCZ0ZW1wMTYsIHNvdXJjZSk7Ci0KLQkJCWl0ZW1fY291bnQgPQotCQkJICAgIGFjcGlfcnNfZGVjb2RlX2JpdG1hc2sodGVtcDE2LCBkZXN0aW5hdGlvbik7Ci0JCQlpZiAoaXRlbV9jb3VudCkgewotCQkJCXJlc291cmNlLT5sZW5ndGggKz0gKGl0ZW1fY291bnQgLSAxKTsKLQkJCX0KLQotCQkJdGFyZ2V0ID0gQUNQSV9BRERfUFRSKGNoYXIsIHJlc291cmNlLCBpbmZvLT52YWx1ZSk7Ci0JCQlBQ1BJX1NFVDgodGFyZ2V0KSA9ICh1OCkgaXRlbV9jb3VudDsKLQkJCWJyZWFrOwotCi0JCWNhc2UgQUNQSV9SU0NfRVhJVF9ORToKLQkJCS8qCi0JCQkgKiBDb250cm9sIC0gRXhpdCBjb252ZXJzaW9uIGlmIG5vdCBlcXVhbAotCQkJICovCi0JCQlzd2l0Y2ggKGluZm8tPnJlc291cmNlX29mZnNldCkgewotCQkJY2FzZSBBQ1BJX1JTQ19DT01QQVJFX0FNTF9MRU5HVEg6Ci0JCQkJaWYgKGFtbF9yZXNvdXJjZV9sZW5ndGggIT0gaW5mby0+dmFsdWUpIHsKLQkJCQkJZ290byBleGl0OwotCQkJCX0KLQkJCQlicmVhazsKLQotCQkJY2FzZSBBQ1BJX1JTQ19DT01QQVJFX1ZBTFVFOgotCQkJCWlmIChBQ1BJX0dFVDgoc291cmNlKSAhPSBpbmZvLT52YWx1ZSkgewotCQkJCQlnb3RvIGV4aXQ7Ci0JCQkJfQotCQkJCWJyZWFrOwotCi0JCQlkZWZhdWx0OgotCi0JCQkJQUNQSV9FUlJPUigoQUVfSU5GTywKLQkJCQkJICAgICJJbnZhbGlkIGNvbnZlcnNpb24gc3ViLW9wY29kZSIpKTsKLQkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX1BBUkFNRVRFUik7Ci0JCQl9Ci0JCQlicmVhazsKLQotCQlkZWZhdWx0OgotCi0JCQlBQ1BJX0VSUk9SKChBRV9JTkZPLCAiSW52YWxpZCBjb252ZXJzaW9uIG9wY29kZSIpKTsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfUEFSQU1FVEVSKTsKLQkJfQotCi0JCWNvdW50LS07Ci0JCWluZm8rKzsKLQl9Ci0KLSAgICAgIGV4aXQ6Ci0JaWYgKCFmbGFnc19tb2RlKSB7Ci0KLQkJLyogUm91bmQgdGhlIHJlc291cmNlIHN0cnVjdCBsZW5ndGggdXAgdG8gdGhlIG5leHQgYm91bmRhcnkgKDMyIG9yIDY0KSAqLwotCi0JCXJlc291cmNlLT5sZW5ndGggPQotCQkgICAgKHUzMikgQUNQSV9ST1VORF9VUF9UT19OQVRJVkVfV09SRChyZXNvdXJjZS0+bGVuZ3RoKTsKLQl9Ci0JcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9yc19jb252ZXJ0X3Jlc291cmNlX3RvX2FtbAotICoKLSAqIFBBUkFNRVRFUlM6ICBSZXNvdXJjZSAgICAgICAgICAgIC0gUG9pbnRlciB0byB0aGUgcmVzb3VyY2UgZGVzY3JpcHRvcgotICogICAgICAgICAgICAgIEFtbCAgICAgICAgICAgICAgICAgLSBXaGVyZSB0aGUgQU1MIGRlc2NyaXB0b3IgaXMgcmV0dXJuZWQKLSAqICAgICAgICAgICAgICBJbmZvICAgICAgICAgICAgICAgIC0gUG9pbnRlciB0byBhcHByb3ByaWF0ZSBjb252ZXJzaW9uIHRhYmxlCi0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cwotICoKLSAqIERFU0NSSVBUSU9OOiBDb252ZXJ0IGFuIGludGVybmFsIHJlc291cmNlIGRlc2NyaXB0b3IgdG8gdGhlIGNvcnJlc3BvbmRpbmcKLSAqICAgICAgICAgICAgICBleHRlcm5hbCBBTUwgcmVzb3VyY2UgZGVzY3JpcHRvci4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1hY3BpX3N0YXR1cwotYWNwaV9yc19jb252ZXJ0X3Jlc291cmNlX3RvX2FtbChzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAqcmVzb3VyY2UsCi0JCQkJdW5pb24gYW1sX3Jlc291cmNlICphbWwsCi0JCQkJc3RydWN0IGFjcGlfcnNjb252ZXJ0X2luZm8gKmluZm8pCi17Ci0Jdm9pZCAqc291cmNlID0gTlVMTDsKLQl2b2lkICpkZXN0aW5hdGlvbjsKLQlhY3BpX3JzZGVzY19zaXplIGFtbF9sZW5ndGggPSAwOwotCXU4IGNvdW50OwotCXUxNiB0ZW1wMTYgPSAwOwotCXUxNiBpdGVtX2NvdW50ID0gMDsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UocnNfY29udmVydF9yZXNvdXJjZV90b19hbWwpOwotCi0JLyoKLQkgKiBGaXJzdCB0YWJsZSBlbnRyeSBtdXN0IGJlIEFDUElfUlNDX0lOSVR4eHggYW5kIG11c3QgY29udGFpbiB0aGUKLQkgKiB0YWJsZSBsZW5ndGggKCMgb2YgdGFibGUgZW50cmllcykKLQkgKi8KLQljb3VudCA9IElOSVRfVEFCTEVfTEVOR1RIKGluZm8pOwotCi0Jd2hpbGUgKGNvdW50KSB7Ci0JCS8qCi0JCSAqIFNvdXJjZSBpcyB0aGUgaW50ZXJuYWwgcmVzb3VyY2UgZGVzY3JpcHRvciwKLQkJICogZGVzdGluYXRpb24gaXMgdGhlIGV4dGVybmFsIEFNTCBieXRlIHN0cmVhbSBidWZmZXIKLQkJICovCi0JCXNvdXJjZSA9IEFDUElfQUREX1BUUih2b2lkLCByZXNvdXJjZSwgaW5mby0+cmVzb3VyY2Vfb2Zmc2V0KTsKLQkJZGVzdGluYXRpb24gPSBBQ1BJX0FERF9QVFIodm9pZCwgYW1sLCBpbmZvLT5hbWxfb2Zmc2V0KTsKLQotCQlzd2l0Y2ggKGluZm8tPm9wY29kZSkgewotCQljYXNlIEFDUElfUlNDX0lOSVRTRVQ6Ci0KLQkJCUFDUElfTUVNU0VUKGFtbCwgMCwgSU5JVF9SRVNPVVJDRV9MRU5HVEgoaW5mbykpOwotCQkJYW1sX2xlbmd0aCA9IElOSVRfUkVTT1VSQ0VfTEVOR1RIKGluZm8pOwotCQkJYWNwaV9yc19zZXRfcmVzb3VyY2VfaGVhZGVyKElOSVRfUkVTT1VSQ0VfVFlQRShpbmZvKSwKLQkJCQkJCSAgICBhbWxfbGVuZ3RoLCBhbWwpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBBQ1BJX1JTQ19JTklUR0VUOgotCQkJYnJlYWs7Ci0KLQkJY2FzZSBBQ1BJX1JTQ19GTEFHSU5JVDoKLQkJCS8qCi0JCQkgKiBDbGVhciB0aGUgZmxhZyBieXRlCi0JCQkgKi8KLQkJCUFDUElfU0VUOChkZXN0aW5hdGlvbikgPSAwOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBBQ1BJX1JTQ18xQklURkxBRzoKLQkJCS8qCi0JCQkgKiBNYXNrIGFuZCBzaGlmdCB0aGUgZmxhZyBiaXQKLQkJCSAqLwotCQkJQUNQSV9TRVQ4KGRlc3RpbmF0aW9uKSB8PSAodTgpCi0JCQkgICAgKChBQ1BJX0dFVDgoc291cmNlKSAmIDB4MDEpIDw8IGluZm8tPnZhbHVlKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgQUNQSV9SU0NfMkJJVEZMQUc6Ci0JCQkvKgotCQkJICogTWFzayBhbmQgc2hpZnQgdGhlIGZsYWcgYml0cwotCQkJICovCi0JCQlBQ1BJX1NFVDgoZGVzdGluYXRpb24pIHw9ICh1OCkKLQkJCSAgICAoKEFDUElfR0VUOChzb3VyY2UpICYgMHgwMykgPDwgaW5mby0+dmFsdWUpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBBQ1BJX1JTQ19DT1VOVDoKLQotCQkJaXRlbV9jb3VudCA9IEFDUElfR0VUOChzb3VyY2UpOwotCQkJQUNQSV9TRVQ4KGRlc3RpbmF0aW9uKSA9ICh1OCkgaXRlbV9jb3VudDsKLQotCQkJYW1sX2xlbmd0aCA9Ci0JCQkgICAgKHUxNikgKGFtbF9sZW5ndGggKwotCQkJCSAgIChpbmZvLT52YWx1ZSAqIChpdGVtX2NvdW50IC0gMSkpKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgQUNQSV9SU0NfQ09VTlQxNjoKLQotCQkJaXRlbV9jb3VudCA9IEFDUElfR0VUMTYoc291cmNlKTsKLQkJCWFtbF9sZW5ndGggPSAodTE2KSAoYW1sX2xlbmd0aCArIGl0ZW1fY291bnQpOwotCQkJYWNwaV9yc19zZXRfcmVzb3VyY2VfbGVuZ3RoKGFtbF9sZW5ndGgsIGFtbCk7Ci0JCQlicmVhazsKLQotCQljYXNlIEFDUElfUlNDX0xFTkdUSDoKLQotCQkJYWNwaV9yc19zZXRfcmVzb3VyY2VfbGVuZ3RoKGluZm8tPnZhbHVlLCBhbWwpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBBQ1BJX1JTQ19NT1ZFODoKLQkJY2FzZSBBQ1BJX1JTQ19NT1ZFMTY6Ci0JCWNhc2UgQUNQSV9SU0NfTU9WRTMyOgotCQljYXNlIEFDUElfUlNDX01PVkU2NDoKLQotCQkJaWYgKGluZm8tPnZhbHVlKSB7Ci0JCQkJaXRlbV9jb3VudCA9IGluZm8tPnZhbHVlOwotCQkJfQotCQkJYWNwaV9yc19tb3ZlX2RhdGEoZGVzdGluYXRpb24sIHNvdXJjZSwgaXRlbV9jb3VudCwKLQkJCQkJICBpbmZvLT5vcGNvZGUpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBBQ1BJX1JTQ19BRERSRVNTOgotCi0JCQkvKiBTZXQgdGhlIFJlc291cmNlIFR5cGUsIEdlbmVyYWwgRmxhZ3MsIGFuZCBUeXBlLVNwZWNpZmljIEZsYWdzICovCi0KLQkJCWFjcGlfcnNfc2V0X2FkZHJlc3NfY29tbW9uKGFtbCwgcmVzb3VyY2UpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBBQ1BJX1JTQ19TT1VSQ0VYOgotCQkJLyoKLQkJCSAqIE9wdGlvbmFsIHJlc291cmNlX3NvdXJjZSAoSW5kZXggYW5kIFN0cmluZykKLQkJCSAqLwotCQkJYW1sX2xlbmd0aCA9Ci0JCQkgICAgYWNwaV9yc19zZXRfcmVzb3VyY2Vfc291cmNlKGFtbCwgKGFjcGlfcnNfbGVuZ3RoKQotCQkJCQkJCWFtbF9sZW5ndGgsIHNvdXJjZSk7Ci0JCQlhY3BpX3JzX3NldF9yZXNvdXJjZV9sZW5ndGgoYW1sX2xlbmd0aCwgYW1sKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgQUNQSV9SU0NfU09VUkNFOgotCQkJLyoKLQkJCSAqIE9wdGlvbmFsIHJlc291cmNlX3NvdXJjZSAoSW5kZXggYW5kIFN0cmluZykuIFRoaXMgaXMgdGhlIG1vcmUKLQkJCSAqIGNvbXBsaWNhdGVkIGNhc2UgdXNlZCBieSB0aGUgSW50ZXJydXB0KCkgbWFjcm8KLQkJCSAqLwotCQkJYW1sX2xlbmd0aCA9Ci0JCQkgICAgYWNwaV9yc19zZXRfcmVzb3VyY2Vfc291cmNlKGFtbCwgaW5mby0+dmFsdWUsCi0JCQkJCQkJc291cmNlKTsKLQkJCWFjcGlfcnNfc2V0X3Jlc291cmNlX2xlbmd0aChhbWxfbGVuZ3RoLCBhbWwpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBBQ1BJX1JTQ19CSVRNQVNLOgotCQkJLyoKLQkJCSAqIDgtYml0IGVuY29kZWQgYml0bWFzayAoRE1BIG1hY3JvKQotCQkJICovCi0JCQlBQ1BJX1NFVDgoZGVzdGluYXRpb24pID0gKHU4KQotCQkJICAgIGFjcGlfcnNfZW5jb2RlX2JpdG1hc2soc291cmNlLAotCQkJCQkJICAgKkFDUElfQUREX1BUUih1OCwgcmVzb3VyY2UsCi0JCQkJCQkJCSBpbmZvLT52YWx1ZSkpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBBQ1BJX1JTQ19CSVRNQVNLMTY6Ci0JCQkvKgotCQkJICogMTYtYml0IGVuY29kZWQgYml0bWFzayAoSVJRIG1hY3JvKQotCQkJICovCi0JCQl0ZW1wMTYgPSBhY3BpX3JzX2VuY29kZV9iaXRtYXNrKHNvdXJjZSwKLQkJCQkJCQkqQUNQSV9BRERfUFRSKHU4LAotCQkJCQkJCQkgICAgICByZXNvdXJjZSwKLQkJCQkJCQkJICAgICAgaW5mby0+Ci0JCQkJCQkJCSAgICAgIHZhbHVlKSk7Ci0JCQlBQ1BJX01PVkVfMTZfVE9fMTYoZGVzdGluYXRpb24sICZ0ZW1wMTYpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBBQ1BJX1JTQ19FWElUX0xFOgotCQkJLyoKLQkJCSAqIENvbnRyb2wgLSBFeGl0IGNvbnZlcnNpb24gaWYgbGVzcyB0aGFuIG9yIGVxdWFsCi0JCQkgKi8KLQkJCWlmIChpdGVtX2NvdW50IDw9IGluZm8tPnZhbHVlKSB7Ci0JCQkJZ290byBleGl0OwotCQkJfQotCQkJYnJlYWs7Ci0KLQkJY2FzZSBBQ1BJX1JTQ19FWElUX05FOgotCQkJLyoKLQkJCSAqIENvbnRyb2wgLSBFeGl0IGNvbnZlcnNpb24gaWYgbm90IGVxdWFsCi0JCQkgKi8KLQkJCXN3aXRjaCAoQ09NUEFSRV9PUENPREUoaW5mbykpIHsKLQkJCWNhc2UgQUNQSV9SU0NfQ09NUEFSRV9WQUxVRToKLQotCQkJCWlmICgqQUNQSV9BRERfUFRSKHU4LCByZXNvdXJjZSwKLQkJCQkJCSAgQ09NUEFSRV9UQVJHRVQoaW5mbykpICE9Ci0JCQkJICAgIENPTVBBUkVfVkFMVUUoaW5mbykpIHsKLQkJCQkJZ290byBleGl0OwotCQkJCX0KLQkJCQlicmVhazsKLQotCQkJZGVmYXVsdDoKLQotCQkJCUFDUElfRVJST1IoKEFFX0lORk8sCi0JCQkJCSAgICAiSW52YWxpZCBjb252ZXJzaW9uIHN1Yi1vcGNvZGUiKSk7Ci0JCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9QQVJBTUVURVIpOwotCQkJfQotCQkJYnJlYWs7Ci0KLQkJY2FzZSBBQ1BJX1JTQ19FWElUX0VROgotCQkJLyoKLQkJCSAqIENvbnRyb2wgLSBFeGl0IGNvbnZlcnNpb24gaWYgZXF1YWwKLQkJCSAqLwotCQkJaWYgKCpBQ1BJX0FERF9QVFIodTgsIHJlc291cmNlLAotCQkJCQkgIENPTVBBUkVfVEFSR0VUKGluZm8pKSA9PQotCQkJICAgIENPTVBBUkVfVkFMVUUoaW5mbykpIHsKLQkJCQlnb3RvIGV4aXQ7Ci0JCQl9Ci0JCQlicmVhazsKLQotCQlkZWZhdWx0OgotCi0JCQlBQ1BJX0VSUk9SKChBRV9JTkZPLCAiSW52YWxpZCBjb252ZXJzaW9uIG9wY29kZSIpKTsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfUEFSQU1FVEVSKTsKLQkJfQotCi0JCWNvdW50LS07Ci0JCWluZm8rKzsKLQl9Ci0KLSAgICAgIGV4aXQ6Ci0JcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKLX0KLQotI2lmIDAKLS8qIFByZXZpb3VzIHJlc291cmNlIHZhbGlkYXRpb25zICovCi0KLWlmIChhbWwtPmV4dF9hZGRyZXNzNjQucmV2aXNpb25faUQgIT0gQU1MX1JFU09VUkNFX0VYVEVOREVEX0FERFJFU1NfUkVWSVNJT04pIHsKLQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfU1VQUE9SVCk7Ci19Ci0KLWlmIChyZXNvdXJjZS0+ZGF0YS5zdGFydF9kcGYucGVyZm9ybWFuY2Vfcm9idXN0bmVzcyA+PSAzKSB7Ci0JcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9CQURfUkVTT1VSQ0VfVkFMVUUpOwotfQotCi1pZiAoKChhbWwtPmlycS5mbGFncyAmIDB4MDkpID09IDB4MDApIHx8ICgoYW1sLT5pcnEuZmxhZ3MgJiAweDA5KSA9PSAweDA5KSkgewotCS8qCi0JICogT25seSBbYWN0aXZlX2hpZ2gsIGVkZ2Vfc2Vuc2l0aXZlXSBvciBbYWN0aXZlX2xvdywgbGV2ZWxfc2Vuc2l0aXZlXQotCSAqIHBvbGFyaXR5L3RyaWdnZXIgaW50ZXJydXB0cyBhcmUgYWxsb3dlZCAoQUNQSSBzcGVjLCBzZWN0aW9uCi0JICogIklSUSBGb3JtYXQiKSwgc28gMHgwMCBhbmQgMHgwOSBhcmUgaWxsZWdhbC4KLQkgKi8KLQlBQ1BJX0VSUk9SKChBRV9JTkZPLAotCQkgICAgIkludmFsaWQgaW50ZXJydXB0IHBvbGFyaXR5L3RyaWdnZXIgaW4gcmVzb3VyY2UgbGlzdCwgJVgiLAotCQkgICAgYW1sLT5pcnEuZmxhZ3MpKTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX0RBVEEpOwotfQotCi1yZXNvdXJjZS0+ZGF0YS5leHRlbmRlZF9pcnEuaW50ZXJydXB0X2NvdW50ID0gdGVtcDg7Ci1pZiAodGVtcDggPCAxKSB7Ci0KLQkvKiBNdXN0IGhhdmUgYXQgbGVhc3Qgb25lIElSUSAqLwotCi0JcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9CQURfUkVTT1VSQ0VfTEVOR1RIKTsKLX0KLQotaWYgKHJlc291cmNlLT5kYXRhLmRtYS50cmFuc2ZlciA9PSAweDAzKSB7Ci0JQUNQSV9FUlJPUigoQUVfSU5GTywgIkludmFsaWQgRE1BLlRyYW5zZmVyIHByZWZlcmVuY2UgKDMpIikpOwotCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfREFUQSk7Ci19Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9yZXNvdXJjZXMvcnN1dGlscy5jIGIvZHJpdmVycy9hY3BpL3Jlc291cmNlcy9yc3V0aWxzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3YjNiY2QuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9hY3BpL3Jlc291cmNlcy9yc3V0aWxzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3MjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBNb2R1bGUgTmFtZTogcnN1dGlscyAtIFV0aWxpdGllcyBmb3IgdGhlIHJlc291cmNlIG1hbmFnZXIKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwOCwgSW50ZWwgQ29ycC4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKLSAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIGF0IG1pbmltdW0gYSBkaXNjbGFpbWVyCi0gKiAgICBzdWJzdGFudGlhbGx5IHNpbWlsYXIgdG8gdGhlICJOTyBXQVJSQU5UWSIgZGlzY2xhaW1lciBiZWxvdwotICogICAgKCJEaXNjbGFpbWVyIikgYW5kIGFueSByZWRpc3RyaWJ1dGlvbiBtdXN0IGJlIGNvbmRpdGlvbmVkIHVwb24KLSAqICAgIGluY2x1ZGluZyBhIHN1YnN0YW50aWFsbHkgc2ltaWxhciBEaXNjbGFpbWVyIHJlcXVpcmVtZW50IGZvciBmdXJ0aGVyCi0gKiAgICBiaW5hcnkgcmVkaXN0cmlidXRpb24uCi0gKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMKLSAqICAgIG9mIGFueSBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTk8gV0FSUkFOVFkKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAotICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKLSAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HCi0gKiBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKLSAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KLSAqLwotCi0jaW5jbHVkZSA8YWNwaS9hY3BpLmg+Ci0jaW5jbHVkZSA8YWNwaS9hY25hbWVzcC5oPgotI2luY2x1ZGUgPGFjcGkvYWNyZXNyYy5oPgotCi0jZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9SRVNPVVJDRVMKLUFDUElfTU9EVUxFX05BTUUoInJzdXRpbHMiKQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX3JzX2RlY29kZV9iaXRtYXNrCi0gKgotICogUEFSQU1FVEVSUzogIE1hc2sgICAgICAgICAgICAtIEJpdG1hc2sgdG8gZGVjb2RlCi0gKiAgICAgICAgICAgICAgTGlzdCAgICAgICAgICAgIC0gV2hlcmUgdGhlIGNvbnZlcnRlZCBsaXN0IGlzIHJldHVybmVkCi0gKgotICogUkVUVVJOOiAgICAgIENvdW50IG9mIGJpdHMgc2V0IChsZW5ndGggb2YgbGlzdCkKLSAqCi0gKiBERVNDUklQVElPTjogQ29udmVydCBhIGJpdCBtYXNrIGludG8gYSBsaXN0IG9mIHZhbHVlcwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11OCBhY3BpX3JzX2RlY29kZV9iaXRtYXNrKHUxNiBtYXNrLCB1OCAqIGxpc3QpCi17Ci0JdTggaTsKLQl1OCBiaXRfY291bnQ7Ci0KLQlBQ1BJX0ZVTkNUSU9OX0VOVFJZKCk7Ci0KLQkvKiBEZWNvZGUgdGhlIG1hc2sgYml0cyAqLwotCi0JZm9yIChpID0gMCwgYml0X2NvdW50ID0gMDsgbWFzazsgaSsrKSB7Ci0JCWlmIChtYXNrICYgMHgwMDAxKSB7Ci0JCQlsaXN0W2JpdF9jb3VudF0gPSBpOwotCQkJYml0X2NvdW50Kys7Ci0JCX0KLQotCQltYXNrID4+PSAxOwotCX0KLQotCXJldHVybiAoYml0X2NvdW50KTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9yc19lbmNvZGVfYml0bWFzawotICoKLSAqIFBBUkFNRVRFUlM6ICBMaXN0ICAgICAgICAgICAgLSBMaXN0IG9mIHZhbHVlcyB0byBlbmNvZGUKLSAqICAgICAgICAgICAgICBDb3VudCAgICAgICAgICAgLSBMZW5ndGggb2YgbGlzdAotICoKLSAqIFJFVFVSTjogICAgICBFbmNvZGVkIGJpdG1hc2sKLSAqCi0gKiBERVNDUklQVElPTjogQ29udmVydCBhIGxpc3Qgb2YgdmFsdWVzIHRvIGFuIGVuY29kZWQgYml0bWFzawotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXUxNiBhY3BpX3JzX2VuY29kZV9iaXRtYXNrKHU4ICogbGlzdCwgdTggY291bnQpCi17Ci0JdTMyIGk7Ci0JdTE2IG1hc2s7Ci0KLQlBQ1BJX0ZVTkNUSU9OX0VOVFJZKCk7Ci0KLQkvKiBFbmNvZGUgdGhlIGxpc3QgaW50byBhIHNpbmdsZSBiaXRtYXNrICovCi0KLQlmb3IgKGkgPSAwLCBtYXNrID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLQkJbWFzayB8PSAoMHgxIDw8IGxpc3RbaV0pOwotCX0KLQotCXJldHVybiBtYXNrOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX3JzX21vdmVfZGF0YQotICoKLSAqIFBBUkFNRVRFUlM6ICBEZXN0aW5hdGlvbiAgICAgICAgIC0gUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gZGVzY3JpcHRvcgotICogICAgICAgICAgICAgIFNvdXJjZSAgICAgICAgICAgICAgLSBQb2ludGVyIHRvIHRoZSBzb3VyY2UgZGVzY3JpcHRvcgotICogICAgICAgICAgICAgIGl0ZW1fY291bnQgICAgICAgICAgLSBIb3cgbWFueSBpdGVtcyB0byBtb3ZlCi0gKiAgICAgICAgICAgICAgbW92ZV90eXBlICAgICAgICAgICAtIEJ5dGUgd2lkdGgKLSAqCi0gKiBSRVRVUk46ICAgICAgTm9uZQotICoKLSAqIERFU0NSSVBUSU9OOiBNb3ZlIG11bHRpcGxlIGRhdGEgaXRlbXMgZnJvbSBvbmUgZGVzY3JpcHRvciB0byBhbm90aGVyLiBIYW5kbGVzCi0gKiAgICAgICAgICAgICAgYWxpZ25tZW50IGlzc3VlcyBhbmQgZW5kaWFuIGlzc3VlcyBpZiBuZWNlc3NhcnksIGFzIGNvbmZpZ3VyZWQKLSAqICAgICAgICAgICAgICB2aWEgdGhlIEFDUElfTU9WRV8qIG1hY3Jvcy4gKFRoaXMgaXMgd2h5IGEgbWVtY3B5IGlzIG5vdCB1c2VkKQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXZvaWQKLWFjcGlfcnNfbW92ZV9kYXRhKHZvaWQgKmRlc3RpbmF0aW9uLCB2b2lkICpzb3VyY2UsIHUxNiBpdGVtX2NvdW50LCB1OCBtb3ZlX3R5cGUpCi17Ci0JdTMyIGk7Ci0KLQlBQ1BJX0ZVTkNUSU9OX0VOVFJZKCk7Ci0KLQkvKiBPbmUgbW92ZSBwZXIgaXRlbSAqLwotCi0JZm9yIChpID0gMDsgaSA8IGl0ZW1fY291bnQ7IGkrKykgewotCQlzd2l0Y2ggKG1vdmVfdHlwZSkgewotCQkJLyoKLQkJCSAqIEZvciB0aGUgOC1iaXQgY2FzZSwgd2UgY2FuIHBlcmZvcm0gdGhlIG1vdmUgYWxsIGF0IG9uY2UKLQkJCSAqIHNpbmNlIHRoZXJlIGFyZSBubyBhbGlnbm1lbnQgb3IgZW5kaWFuIGlzc3VlcwotCQkJICovCi0JCWNhc2UgQUNQSV9SU0NfTU9WRTg6Ci0JCQlBQ1BJX01FTUNQWShkZXN0aW5hdGlvbiwgc291cmNlLCBpdGVtX2NvdW50KTsKLQkJCXJldHVybjsKLQotCQkJLyoKLQkJCSAqIDE2LSwgMzItLCBhbmQgNjQtYml0IGNhc2VzIG11c3QgdXNlIHRoZSBtb3ZlIG1hY3JvcyB0aGF0IHBlcmZvcm0KLQkJCSAqIGVuZGlhbiBjb252ZXJzaW9uIGFuZC9vciBhY2NvbW9kYXRlIGhhcmR3YXJlIHRoYXQgY2Fubm90IHBlcmZvcm0KLQkJCSAqIG1pc2FsaWduZWQgbWVtb3J5IHRyYW5zZmVycwotCQkJICovCi0JCWNhc2UgQUNQSV9SU0NfTU9WRTE2OgotCQkJQUNQSV9NT1ZFXzE2X1RPXzE2KCZBQ1BJX0NBU1RfUFRSKHUxNiwgZGVzdGluYXRpb24pW2ldLAotCQkJCQkgICAmQUNQSV9DQVNUX1BUUih1MTYsIHNvdXJjZSlbaV0pOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBBQ1BJX1JTQ19NT1ZFMzI6Ci0JCQlBQ1BJX01PVkVfMzJfVE9fMzIoJkFDUElfQ0FTVF9QVFIodTMyLCBkZXN0aW5hdGlvbilbaV0sCi0JCQkJCSAgICZBQ1BJX0NBU1RfUFRSKHUzMiwgc291cmNlKVtpXSk7Ci0JCQlicmVhazsKLQotCQljYXNlIEFDUElfUlNDX01PVkU2NDoKLQkJCUFDUElfTU9WRV82NF9UT182NCgmQUNQSV9DQVNUX1BUUih1NjQsIGRlc3RpbmF0aW9uKVtpXSwKLQkJCQkJICAgJkFDUElfQ0FTVF9QVFIodTY0LCBzb3VyY2UpW2ldKTsKLQkJCWJyZWFrOwotCi0JCWRlZmF1bHQ6Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfcnNfc2V0X3Jlc291cmNlX2xlbmd0aAotICoKLSAqIFBBUkFNRVRFUlM6ICB0b3RhbF9sZW5ndGggICAgICAgIC0gTGVuZ3RoIG9mIHRoZSBBTUwgZGVzY3JpcHRvciwgaW5jbHVkaW5nCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBoZWFkZXIgYW5kIGxlbmd0aCBmaWVsZHMuCi0gKiAgICAgICAgICAgICAgQW1sICAgICAgICAgICAgICAgICAtIFBvaW50ZXIgdG8gdGhlIHJhdyBBTUwgZGVzY3JpcHRvcgotICoKLSAqIFJFVFVSTjogICAgICBOb25lCi0gKgotICogREVTQ1JJUFRJT046IFNldCB0aGUgcmVzb3VyY2VfbGVuZ3RoIGZpZWxkIG9mIGFuIEFNTAotICogICAgICAgICAgICAgIHJlc291cmNlIGRlc2NyaXB0b3IsIGJvdGggTGFyZ2UgYW5kIFNtYWxsIGRlc2NyaXB0b3JzIGFyZQotICogICAgICAgICAgICAgIHN1cHBvcnRlZCBhdXRvbWF0aWNhbGx5LiBOb3RlOiBEZXNjcmlwdG9yIFR5cGUgZmllbGQgbXVzdAotICogICAgICAgICAgICAgIGJlIHZhbGlkLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXZvaWQKLWFjcGlfcnNfc2V0X3Jlc291cmNlX2xlbmd0aChhY3BpX3JzZGVzY19zaXplIHRvdGFsX2xlbmd0aCwKLQkJCSAgICB1bmlvbiBhbWxfcmVzb3VyY2UgKmFtbCkKLXsKLQlhY3BpX3JzX2xlbmd0aCByZXNvdXJjZV9sZW5ndGg7Ci0KLQlBQ1BJX0ZVTkNUSU9OX0VOVFJZKCk7Ci0KLQkvKiBMZW5ndGggaXMgdGhlIHRvdGFsIGRlc2NyaXB0b3IgbGVuZ3RoIG1pbnVzIHRoZSBoZWFkZXIgbGVuZ3RoICovCi0KLQlyZXNvdXJjZV9sZW5ndGggPSAoYWNwaV9yc19sZW5ndGgpCi0JICAgICh0b3RhbF9sZW5ndGggLSBhY3BpX3V0X2dldF9yZXNvdXJjZV9oZWFkZXJfbGVuZ3RoKGFtbCkpOwotCi0JLyogTGVuZ3RoIGlzIHN0b3JlZCBkaWZmZXJlbnRseSBmb3IgbGFyZ2UgYW5kIHNtYWxsIGRlc2NyaXB0b3JzICovCi0KLQlpZiAoYW1sLT5zbWFsbF9oZWFkZXIuZGVzY3JpcHRvcl90eXBlICYgQUNQSV9SRVNPVVJDRV9OQU1FX0xBUkdFKSB7Ci0KLQkJLyogTGFyZ2UgZGVzY3JpcHRvciAtLSBieXRlcyAxLTIgY29udGFpbiB0aGUgMTYtYml0IGxlbmd0aCAqLwotCi0JCUFDUElfTU9WRV8xNl9UT18xNigmYW1sLT5sYXJnZV9oZWFkZXIucmVzb3VyY2VfbGVuZ3RoLAotCQkJCSAgICZyZXNvdXJjZV9sZW5ndGgpOwotCX0gZWxzZSB7Ci0JCS8qIFNtYWxsIGRlc2NyaXB0b3IgLS0gYml0cyAyOjAgb2YgYnl0ZSAwIGNvbnRhaW4gdGhlIGxlbmd0aCAqLwotCi0JCWFtbC0+c21hbGxfaGVhZGVyLmRlc2NyaXB0b3JfdHlwZSA9ICh1OCkKLQotCQkgICAgLyogQ2xlYXIgYW55IGV4aXN0aW5nIGxlbmd0aCwgcHJlc2VydmluZyBkZXNjcmlwdG9yIHR5cGUgYml0cyAqLwotCQkgICAgKChhbWwtPnNtYWxsX2hlYWRlci4KLQkJICAgICAgZGVzY3JpcHRvcl90eXBlICYgfkFDUElfUkVTT1VSQ0VfTkFNRV9TTUFMTF9MRU5HVEhfTUFTSykKLQotCQkgICAgIHwgcmVzb3VyY2VfbGVuZ3RoKTsKLQl9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfcnNfc2V0X3Jlc291cmNlX2hlYWRlcgotICoKLSAqIFBBUkFNRVRFUlM6ICBkZXNjcmlwdG9yX3R5cGUgICAgIC0gQnl0ZSB0byBiZSBpbnNlcnRlZCBhcyB0aGUgdHlwZQotICogICAgICAgICAgICAgIHRvdGFsX2xlbmd0aCAgICAgICAgLSBMZW5ndGggb2YgdGhlIEFNTCBkZXNjcmlwdG9yLCBpbmNsdWRpbmcKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGhlYWRlciBhbmQgbGVuZ3RoIGZpZWxkcy4KLSAqICAgICAgICAgICAgICBBbWwgICAgICAgICAgICAgICAgIC0gUG9pbnRlciB0byB0aGUgcmF3IEFNTCBkZXNjcmlwdG9yCi0gKgotICogUkVUVVJOOiAgICAgIE5vbmUKLSAqCi0gKiBERVNDUklQVElPTjogU2V0IHRoZSBkZXNjcmlwdG9yX3R5cGUgYW5kIHJlc291cmNlX2xlbmd0aCBmaWVsZHMgb2YgYW4gQU1MCi0gKiAgICAgICAgICAgICAgcmVzb3VyY2UgZGVzY3JpcHRvciwgYm90aCBMYXJnZSBhbmQgU21hbGwgZGVzY3JpcHRvcnMgYXJlCi0gKiAgICAgICAgICAgICAgc3VwcG9ydGVkIGF1dG9tYXRpY2FsbHkKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi12b2lkCi1hY3BpX3JzX3NldF9yZXNvdXJjZV9oZWFkZXIodTggZGVzY3JpcHRvcl90eXBlLAotCQkJICAgIGFjcGlfcnNkZXNjX3NpemUgdG90YWxfbGVuZ3RoLAotCQkJICAgIHVuaW9uIGFtbF9yZXNvdXJjZSAqYW1sKQotewotCUFDUElfRlVOQ1RJT05fRU5UUlkoKTsKLQotCS8qIFNldCB0aGUgUmVzb3VyY2UgVHlwZSAqLwotCi0JYW1sLT5zbWFsbF9oZWFkZXIuZGVzY3JpcHRvcl90eXBlID0gZGVzY3JpcHRvcl90eXBlOwotCi0JLyogU2V0IHRoZSBSZXNvdXJjZSBMZW5ndGggKi8KLQotCWFjcGlfcnNfc2V0X3Jlc291cmNlX2xlbmd0aCh0b3RhbF9sZW5ndGgsIGFtbCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfcnNfc3RyY3B5Ci0gKgotICogUEFSQU1FVEVSUzogIERlc3RpbmF0aW9uICAgICAgICAgLSBQb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBzdHJpbmcKLSAqICAgICAgICAgICAgICBTb3VyY2UgICAgICAgICAgICAgIC0gUG9pbnRlciB0byB0aGUgc291cmNlIHN0cmluZwotICoKLSAqIFJFVFVSTjogICAgICBTdHJpbmcgbGVuZ3RoLCBpbmNsdWRpbmcgTlVMTCB0ZXJtaW5hdG9yCi0gKgotICogREVTQ1JJUFRJT046IExvY2FsIHN0cmluZyBjb3B5IHRoYXQgcmV0dXJucyB0aGUgc3RyaW5nIGxlbmd0aCwgc2F2aW5nIGEKLSAqICAgICAgICAgICAgICBzdHJjcHkgZm9sbG93ZWQgYnkgYSBzdHJsZW4uCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIHUxNiBhY3BpX3JzX3N0cmNweShjaGFyICpkZXN0aW5hdGlvbiwgY2hhciAqc291cmNlKQotewotCXUxNiBpOwotCi0JQUNQSV9GVU5DVElPTl9FTlRSWSgpOwotCi0JZm9yIChpID0gMDsgc291cmNlW2ldOyBpKyspIHsKLQkJZGVzdGluYXRpb25baV0gPSBzb3VyY2VbaV07Ci0JfQotCi0JZGVzdGluYXRpb25baV0gPSAwOwotCi0JLyogUmV0dXJuIHN0cmluZyBsZW5ndGggaW5jbHVkaW5nIHRoZSBOVUxMIHRlcm1pbmF0b3IgKi8KLQotCXJldHVybiAoKHUxNikgKGkgKyAxKSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfcnNfZ2V0X3Jlc291cmNlX3NvdXJjZQotICoKLSAqIFBBUkFNRVRFUlM6ICByZXNvdXJjZV9sZW5ndGggICAgIC0gTGVuZ3RoIGZpZWxkIG9mIHRoZSBkZXNjcmlwdG9yCi0gKiAgICAgICAgICAgICAgbWluaW11bV9sZW5ndGggICAgICAtIE1pbmltdW0gbGVuZ3RoIG9mIHRoZSBkZXNjcmlwdG9yIChtaW51cwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbnkgb3B0aW9uYWwgZmllbGRzKQotICogICAgICAgICAgICAgIHJlc291cmNlX3NvdXJjZSAgICAgLSBXaGVyZSB0aGUgcmVzb3VyY2Vfc291cmNlIGlzIHJldHVybmVkCi0gKiAgICAgICAgICAgICAgQW1sICAgICAgICAgICAgICAgICAtIFBvaW50ZXIgdG8gdGhlIHJhdyBBTUwgZGVzY3JpcHRvcgotICogICAgICAgICAgICAgIHN0cmluZ19wdHIgICAgICAgICAgLSAob3B0aW9uYWwpIHdoZXJlIHRvIHN0b3JlIHRoZSBhY3R1YWwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2Vfc291cmNlIHN0cmluZwotICoKLSAqIFJFVFVSTjogICAgICBMZW5ndGggb2YgdGhlIHN0cmluZyBwbHVzIE5VTEwgdGVybWluYXRvciwgcm91bmRlZCB1cCB0byBuYXRpdmUKLSAqICAgICAgICAgICAgICB3b3JkIGJvdW5kYXJ5Ci0gKgotICogREVTQ1JJUFRJT046IENvcHkgdGhlIG9wdGlvbmFsIHJlc291cmNlX3NvdXJjZSBkYXRhIGZyb20gYSByYXcgQU1MIGRlc2NyaXB0b3IKLSAqICAgICAgICAgICAgICB0byBhbiBpbnRlcm5hbCByZXNvdXJjZSBkZXNjcmlwdG9yCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotYWNwaV9yc19sZW5ndGgKLWFjcGlfcnNfZ2V0X3Jlc291cmNlX3NvdXJjZShhY3BpX3JzX2xlbmd0aCByZXNvdXJjZV9sZW5ndGgsCi0JCQkgICAgYWNwaV9yc19sZW5ndGggbWluaW11bV9sZW5ndGgsCi0JCQkgICAgc3RydWN0IGFjcGlfcmVzb3VyY2Vfc291cmNlICogcmVzb3VyY2Vfc291cmNlLAotCQkJICAgIHVuaW9uIGFtbF9yZXNvdXJjZSAqIGFtbCwgY2hhciAqc3RyaW5nX3B0cikKLXsKLQlhY3BpX3JzZGVzY19zaXplIHRvdGFsX2xlbmd0aDsKLQl1OCAqYW1sX3Jlc291cmNlX3NvdXJjZTsKLQotCUFDUElfRlVOQ1RJT05fRU5UUlkoKTsKLQotCXRvdGFsX2xlbmd0aCA9Ci0JICAgIHJlc291cmNlX2xlbmd0aCArIHNpemVvZihzdHJ1Y3QgYW1sX3Jlc291cmNlX2xhcmdlX2hlYWRlcik7Ci0JYW1sX3Jlc291cmNlX3NvdXJjZSA9IEFDUElfQUREX1BUUih1OCwgYW1sLCBtaW5pbXVtX2xlbmd0aCk7Ci0KLQkvKgotCSAqIHJlc291cmNlX3NvdXJjZSBpcyBwcmVzZW50IGlmIHRoZSBsZW5ndGggb2YgdGhlIGRlc2NyaXB0b3IgaXMgbG9uZ2VyIHRoYW4KLQkgKiB0aGUgbWluaW11bSBsZW5ndGguCi0JICoKLQkgKiBOb3RlOiBTb21lIHJlc291cmNlIGRlc2NyaXB0b3JzIHdpbGwgaGF2ZSBhbiBhZGRpdGlvbmFsIG51bGwsIHNvCi0JICogd2UgYWRkIDEgdG8gdGhlIG1pbmltdW0gbGVuZ3RoLgotCSAqLwotCWlmICh0b3RhbF9sZW5ndGggPiAoYWNwaV9yc2Rlc2Nfc2l6ZSkgKG1pbmltdW1fbGVuZ3RoICsgMSkpIHsKLQotCQkvKiBHZXQgdGhlIHJlc291cmNlX3NvdXJjZV9pbmRleCAqLwotCi0JCXJlc291cmNlX3NvdXJjZS0+aW5kZXggPSBhbWxfcmVzb3VyY2Vfc291cmNlWzBdOwotCi0JCXJlc291cmNlX3NvdXJjZS0+c3RyaW5nX3B0ciA9IHN0cmluZ19wdHI7Ci0JCWlmICghc3RyaW5nX3B0cikgewotCQkJLyoKLQkJCSAqIFN0cmluZyBkZXN0aW5hdGlvbiBwb2ludGVyIGlzIG5vdCBzcGVjaWZpZWQ7IFNldCB0aGUgU3RyaW5nCi0JCQkgKiBwb2ludGVyIHRvIHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgcmVzb3VyY2Vfc291cmNlIHN0cnVjdHVyZS4KLQkJCSAqLwotCQkJcmVzb3VyY2Vfc291cmNlLT5zdHJpbmdfcHRyID0KLQkJCSAgICBBQ1BJX0FERF9QVFIoY2hhciwgcmVzb3VyY2Vfc291cmNlLAotCQkJCQkgc2l6ZW9mKHN0cnVjdCBhY3BpX3Jlc291cmNlX3NvdXJjZSkpOwotCQl9Ci0KLQkJLyoKLQkJICogSW4gb3JkZXIgZm9yIHRoZSBSZXNvdXJjZSBsZW5ndGggdG8gYmUgYSBtdWx0aXBsZSBvZiB0aGUgbmF0aXZlCi0JCSAqIHdvcmQsIGNhbGN1bGF0ZSB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcgKCsxIGZvciBOVUxMIHRlcm1pbmF0b3IpCi0JCSAqIGFuZCBleHBhbmQgdG8gdGhlIG5leHQgd29yZCBtdWx0aXBsZS4KLQkJICoKLQkJICogWmVybyB0aGUgZW50aXJlIGFyZWEgb2YgdGhlIGJ1ZmZlci4KLQkJICovCi0JCXRvdGFsX2xlbmd0aCA9ICh1MzIpCi0JCUFDUElfU1RSTEVOKEFDUElfQ0FTVF9QVFIoY2hhciwgJmFtbF9yZXNvdXJjZV9zb3VyY2VbMV0pKSArIDE7Ci0JCXRvdGFsX2xlbmd0aCA9ICh1MzIpIEFDUElfUk9VTkRfVVBfVE9fTkFUSVZFX1dPUkQodG90YWxfbGVuZ3RoKTsKLQotCQlBQ1BJX01FTVNFVChyZXNvdXJjZV9zb3VyY2UtPnN0cmluZ19wdHIsIDAsIHRvdGFsX2xlbmd0aCk7Ci0KLQkJLyogQ29weSB0aGUgcmVzb3VyY2Vfc291cmNlIHN0cmluZyB0byB0aGUgZGVzdGluYXRpb24gKi8KLQotCQlyZXNvdXJjZV9zb3VyY2UtPnN0cmluZ19sZW5ndGggPQotCQkgICAgYWNwaV9yc19zdHJjcHkocmVzb3VyY2Vfc291cmNlLT5zdHJpbmdfcHRyLAotCQkJCSAgIEFDUElfQ0FTVF9QVFIoY2hhciwKLQkJCQkJCSAmYW1sX3Jlc291cmNlX3NvdXJjZVsxXSkpOwotCi0JCXJldHVybiAoKGFjcGlfcnNfbGVuZ3RoKSB0b3RhbF9sZW5ndGgpOwotCX0KLQotCS8qIHJlc291cmNlX3NvdXJjZSBpcyBub3QgcHJlc2VudCAqLwotCi0JcmVzb3VyY2Vfc291cmNlLT5pbmRleCA9IDA7Ci0JcmVzb3VyY2Vfc291cmNlLT5zdHJpbmdfbGVuZ3RoID0gMDsKLQlyZXNvdXJjZV9zb3VyY2UtPnN0cmluZ19wdHIgPSBOVUxMOwotCXJldHVybiAoMCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfcnNfc2V0X3Jlc291cmNlX3NvdXJjZQotICoKLSAqIFBBUkFNRVRFUlM6ICBBbWwgICAgICAgICAgICAgICAgIC0gUG9pbnRlciB0byB0aGUgcmF3IEFNTCBkZXNjcmlwdG9yCi0gKiAgICAgICAgICAgICAgbWluaW11bV9sZW5ndGggICAgICAtIE1pbmltdW0gbGVuZ3RoIG9mIHRoZSBkZXNjcmlwdG9yIChtaW51cwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbnkgb3B0aW9uYWwgZmllbGRzKQotICogICAgICAgICAgICAgIHJlc291cmNlX3NvdXJjZSAgICAgLSBJbnRlcm5hbCByZXNvdXJjZV9zb3VyY2UKLQotICoKLSAqIFJFVFVSTjogICAgICBUb3RhbCBsZW5ndGggb2YgdGhlIEFNTCBkZXNjcmlwdG9yCi0gKgotICogREVTQ1JJUFRJT046IENvbnZlcnQgYW4gb3B0aW9uYWwgcmVzb3VyY2Vfc291cmNlIGZyb20gaW50ZXJuYWwgZm9ybWF0IHRvIGEKLSAqICAgICAgICAgICAgICByYXcgQU1MIHJlc291cmNlIGRlc2NyaXB0b3IKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1hY3BpX3JzZGVzY19zaXplCi1hY3BpX3JzX3NldF9yZXNvdXJjZV9zb3VyY2UodW5pb24gYW1sX3Jlc291cmNlICogYW1sLAotCQkJICAgIGFjcGlfcnNfbGVuZ3RoIG1pbmltdW1fbGVuZ3RoLAotCQkJICAgIHN0cnVjdCBhY3BpX3Jlc291cmNlX3NvdXJjZSAqIHJlc291cmNlX3NvdXJjZSkKLXsKLQl1OCAqYW1sX3Jlc291cmNlX3NvdXJjZTsKLQlhY3BpX3JzZGVzY19zaXplIGRlc2NyaXB0b3JfbGVuZ3RoOwotCi0JQUNQSV9GVU5DVElPTl9FTlRSWSgpOwotCi0JZGVzY3JpcHRvcl9sZW5ndGggPSBtaW5pbXVtX2xlbmd0aDsKLQotCS8qIE5vbi16ZXJvIHN0cmluZyBsZW5ndGggaW5kaWNhdGVzIHByZXNlbmNlIG9mIGEgcmVzb3VyY2Vfc291cmNlICovCi0KLQlpZiAocmVzb3VyY2Vfc291cmNlLT5zdHJpbmdfbGVuZ3RoKSB7Ci0KLQkJLyogUG9pbnQgdG8gdGhlIGVuZCBvZiB0aGUgQU1MIGRlc2NyaXB0b3IgKi8KLQotCQlhbWxfcmVzb3VyY2Vfc291cmNlID0gQUNQSV9BRERfUFRSKHU4LCBhbWwsIG1pbmltdW1fbGVuZ3RoKTsKLQotCQkvKiBDb3B5IHRoZSByZXNvdXJjZV9zb3VyY2VfaW5kZXggKi8KLQotCQlhbWxfcmVzb3VyY2Vfc291cmNlWzBdID0gKHU4KSByZXNvdXJjZV9zb3VyY2UtPmluZGV4OwotCi0JCS8qIENvcHkgdGhlIHJlc291cmNlX3NvdXJjZSBzdHJpbmcgKi8KLQotCQlBQ1BJX1NUUkNQWShBQ1BJX0NBU1RfUFRSKGNoYXIsICZhbWxfcmVzb3VyY2Vfc291cmNlWzFdKSwKLQkJCSAgICByZXNvdXJjZV9zb3VyY2UtPnN0cmluZ19wdHIpOwotCi0JCS8qCi0JCSAqIEFkZCB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcgKCsgMSBmb3IgbnVsbCB0ZXJtaW5hdG9yKSB0byB0aGUKLQkJICogZmluYWwgZGVzY3JpcHRvciBsZW5ndGgKLQkJICovCi0JCWRlc2NyaXB0b3JfbGVuZ3RoICs9Ci0JCSAgICAoKGFjcGlfcnNkZXNjX3NpemUpIHJlc291cmNlX3NvdXJjZS0+c3RyaW5nX2xlbmd0aCArIDEpOwotCX0KLQotCS8qIFJldHVybiB0aGUgbmV3IHRvdGFsIGxlbmd0aCBvZiB0aGUgQU1MIGRlc2NyaXB0b3IgKi8KLQotCXJldHVybiAoZGVzY3JpcHRvcl9sZW5ndGgpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX3JzX2dldF9wcnRfbWV0aG9kX2RhdGEKLSAqCi0gKiBQQVJBTUVURVJTOiAgTm9kZSAgICAgICAgICAgIC0gRGV2aWNlIG5vZGUKLSAqICAgICAgICAgICAgICByZXRfYnVmZmVyICAgICAgLSBQb2ludGVyIHRvIGEgYnVmZmVyIHN0cnVjdHVyZSBmb3IgdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cwotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKLSAqCi0gKiBERVNDUklQVElPTjogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gZ2V0IHRoZSBfUFJUIHZhbHVlIG9mIGFuIG9iamVjdAotICogICAgICAgICAgICAgIGNvbnRhaW5lZCBpbiBhbiBvYmplY3Qgc3BlY2lmaWVkIGJ5IHRoZSBoYW5kbGUgcGFzc2VkIGluCi0gKgotICogICAgICAgICAgICAgIElmIHRoZSBmdW5jdGlvbiBmYWlscyBhbiBhcHByb3ByaWF0ZSBzdGF0dXMgd2lsbCBiZSByZXR1cm5lZAotICogICAgICAgICAgICAgIGFuZCB0aGUgY29udGVudHMgb2YgdGhlIGNhbGxlcnMgYnVmZmVyIGlzIHVuZGVmaW5lZC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1hY3BpX3N0YXR1cwotYWNwaV9yc19nZXRfcHJ0X21ldGhvZF9kYXRhKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICogbm9kZSwKLQkJCSAgICBzdHJ1Y3QgYWNwaV9idWZmZXIgKiByZXRfYnVmZmVyKQotewotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjOwotCWFjcGlfc3RhdHVzIHN0YXR1czsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UocnNfZ2V0X3BydF9tZXRob2RfZGF0YSk7Ci0KLQkvKiBQYXJhbWV0ZXJzIGd1YXJhbnRlZWQgdmFsaWQgYnkgY2FsbGVyICovCi0KLQkvKiBFeGVjdXRlIHRoZSBtZXRob2QsIG5vIHBhcmFtZXRlcnMgKi8KLQotCXN0YXR1cyA9IGFjcGlfdXRfZXZhbHVhdGVfb2JqZWN0KG5vZGUsIE1FVEhPRF9OQU1FX19QUlQsCi0JCQkJCSBBQ1BJX0JUWVBFX1BBQ0tBR0UsICZvYmpfZGVzYyk7Ci0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotCX0KLQotCS8qCi0JICogQ3JlYXRlIGEgcmVzb3VyY2UgbGlua2VkIGxpc3QgZnJvbSB0aGUgYnl0ZSBzdHJlYW0gYnVmZmVyIHRoYXQgY29tZXMKLQkgKiBiYWNrIGZyb20gdGhlIF9DUlMgbWV0aG9kIGV4ZWN1dGlvbi4KLQkgKi8KLQlzdGF0dXMgPSBhY3BpX3JzX2NyZWF0ZV9wY2lfcm91dGluZ190YWJsZShvYmpfZGVzYywgcmV0X2J1ZmZlcik7Ci0KLQkvKiBPbiBleGl0LCB3ZSBtdXN0IGRlbGV0ZSB0aGUgb2JqZWN0IHJldHVybmVkIGJ5IGV2YWx1YXRlX29iamVjdCAqLwotCi0JYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKG9ial9kZXNjKTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9yc19nZXRfY3JzX21ldGhvZF9kYXRhCi0gKgotICogUEFSQU1FVEVSUzogIE5vZGUgICAgICAgICAgICAtIERldmljZSBub2RlCi0gKiAgICAgICAgICAgICAgcmV0X2J1ZmZlciAgICAgIC0gUG9pbnRlciB0byBhIGJ1ZmZlciBzdHJ1Y3R1cmUgZm9yIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMKLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGdldCB0aGUgX0NSUyB2YWx1ZSBvZiBhbiBvYmplY3QKLSAqICAgICAgICAgICAgICBjb250YWluZWQgaW4gYW4gb2JqZWN0IHNwZWNpZmllZCBieSB0aGUgaGFuZGxlIHBhc3NlZCBpbgotICoKLSAqICAgICAgICAgICAgICBJZiB0aGUgZnVuY3Rpb24gZmFpbHMgYW4gYXBwcm9wcmlhdGUgc3RhdHVzIHdpbGwgYmUgcmV0dXJuZWQKLSAqICAgICAgICAgICAgICBhbmQgdGhlIGNvbnRlbnRzIG9mIHRoZSBjYWxsZXJzIGJ1ZmZlciBpcyB1bmRlZmluZWQuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotYWNwaV9zdGF0dXMKLWFjcGlfcnNfZ2V0X2Nyc19tZXRob2RfZGF0YShzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZSwKLQkJCSAgICBzdHJ1Y3QgYWNwaV9idWZmZXIgKnJldF9idWZmZXIpCi17Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2M7Ci0JYWNwaV9zdGF0dXMgc3RhdHVzOwotCi0JQUNQSV9GVU5DVElPTl9UUkFDRShyc19nZXRfY3JzX21ldGhvZF9kYXRhKTsKLQotCS8qIFBhcmFtZXRlcnMgZ3VhcmFudGVlZCB2YWxpZCBieSBjYWxsZXIgKi8KLQotCS8qIEV4ZWN1dGUgdGhlIG1ldGhvZCwgbm8gcGFyYW1ldGVycyAqLwotCi0Jc3RhdHVzID0gYWNwaV91dF9ldmFsdWF0ZV9vYmplY3Qobm9kZSwgTUVUSE9EX05BTUVfX0NSUywKLQkJCQkJIEFDUElfQlRZUEVfQlVGRkVSLCAmb2JqX2Rlc2MpOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLQl9Ci0KLQkvKgotCSAqIE1ha2UgdGhlIGNhbGwgdG8gY3JlYXRlIGEgcmVzb3VyY2UgbGlua2VkIGxpc3QgZnJvbSB0aGUKLQkgKiBieXRlIHN0cmVhbSBidWZmZXIgdGhhdCBjb21lcyBiYWNrIGZyb20gdGhlIF9DUlMgbWV0aG9kCi0JICogZXhlY3V0aW9uLgotCSAqLwotCXN0YXR1cyA9IGFjcGlfcnNfY3JlYXRlX3Jlc291cmNlX2xpc3Qob2JqX2Rlc2MsIHJldF9idWZmZXIpOwotCi0JLyogT24gZXhpdCwgd2UgbXVzdCBkZWxldGUgdGhlIG9iamVjdCByZXR1cm5lZCBieSBldmFsdWF0ZV9vYmplY3QgKi8KLQotCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZShvYmpfZGVzYyk7Ci0JcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfcnNfZ2V0X3Byc19tZXRob2RfZGF0YQotICoKLSAqIFBBUkFNRVRFUlM6ICBOb2RlICAgICAgICAgICAgLSBEZXZpY2Ugbm9kZQotICogICAgICAgICAgICAgIHJldF9idWZmZXIgICAgICAtIFBvaW50ZXIgdG8gYSBidWZmZXIgc3RydWN0dXJlIGZvciB0aGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzCi0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cwotICoKLSAqIERFU0NSSVBUSU9OOiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBnZXQgdGhlIF9QUlMgdmFsdWUgb2YgYW4gb2JqZWN0Ci0gKiAgICAgICAgICAgICAgY29udGFpbmVkIGluIGFuIG9iamVjdCBzcGVjaWZpZWQgYnkgdGhlIGhhbmRsZSBwYXNzZWQgaW4KLSAqCi0gKiAgICAgICAgICAgICAgSWYgdGhlIGZ1bmN0aW9uIGZhaWxzIGFuIGFwcHJvcHJpYXRlIHN0YXR1cyB3aWxsIGJlIHJldHVybmVkCi0gKiAgICAgICAgICAgICAgYW5kIHRoZSBjb250ZW50cyBvZiB0aGUgY2FsbGVycyBidWZmZXIgaXMgdW5kZWZpbmVkLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZmRlZiBBQ1BJX0ZVVFVSRV9VU0FHRQotYWNwaV9zdGF0dXMKLWFjcGlfcnNfZ2V0X3Byc19tZXRob2RfZGF0YShzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZSwKLQkJCSAgICBzdHJ1Y3QgYWNwaV9idWZmZXIgKnJldF9idWZmZXIpCi17Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2M7Ci0JYWNwaV9zdGF0dXMgc3RhdHVzOwotCi0JQUNQSV9GVU5DVElPTl9UUkFDRShyc19nZXRfcHJzX21ldGhvZF9kYXRhKTsKLQotCS8qIFBhcmFtZXRlcnMgZ3VhcmFudGVlZCB2YWxpZCBieSBjYWxsZXIgKi8KLQotCS8qIEV4ZWN1dGUgdGhlIG1ldGhvZCwgbm8gcGFyYW1ldGVycyAqLwotCi0Jc3RhdHVzID0gYWNwaV91dF9ldmFsdWF0ZV9vYmplY3Qobm9kZSwgTUVUSE9EX05BTUVfX1BSUywKLQkJCQkJIEFDUElfQlRZUEVfQlVGRkVSLCAmb2JqX2Rlc2MpOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLQl9Ci0KLQkvKgotCSAqIE1ha2UgdGhlIGNhbGwgdG8gY3JlYXRlIGEgcmVzb3VyY2UgbGlua2VkIGxpc3QgZnJvbSB0aGUKLQkgKiBieXRlIHN0cmVhbSBidWZmZXIgdGhhdCBjb21lcyBiYWNrIGZyb20gdGhlIF9DUlMgbWV0aG9kCi0JICogZXhlY3V0aW9uLgotCSAqLwotCXN0YXR1cyA9IGFjcGlfcnNfY3JlYXRlX3Jlc291cmNlX2xpc3Qob2JqX2Rlc2MsIHJldF9idWZmZXIpOwotCi0JLyogT24gZXhpdCwgd2UgbXVzdCBkZWxldGUgdGhlIG9iamVjdCByZXR1cm5lZCBieSBldmFsdWF0ZV9vYmplY3QgKi8KLQotCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZShvYmpfZGVzYyk7Ci0JcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci19Ci0jZW5kaWYJCQkJLyogIEFDUElfRlVUVVJFX1VTQUdFICAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX3JzX2dldF9tZXRob2RfZGF0YQotICoKLSAqIFBBUkFNRVRFUlM6ICBIYW5kbGUgICAgICAgICAgLSBIYW5kbGUgdG8gdGhlIGNvbnRhaW5pbmcgb2JqZWN0Ci0gKiAgICAgICAgICAgICAgUGF0aCAgICAgICAgICAgIC0gUGF0aCB0byBtZXRob2QsIHJlbGF0aXZlIHRvIEhhbmRsZQotICogICAgICAgICAgICAgIHJldF9idWZmZXIgICAgICAtIFBvaW50ZXIgdG8gYSBidWZmZXIgc3RydWN0dXJlIGZvciB0aGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzCi0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cwotICoKLSAqIERFU0NSSVBUSU9OOiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBnZXQgdGhlIF9DUlMgb3IgX1BSUyB2YWx1ZSBvZiBhbgotICogICAgICAgICAgICAgIG9iamVjdCBjb250YWluZWQgaW4gYW4gb2JqZWN0IHNwZWNpZmllZCBieSB0aGUgaGFuZGxlIHBhc3NlZCBpbgotICoKLSAqICAgICAgICAgICAgICBJZiB0aGUgZnVuY3Rpb24gZmFpbHMgYW4gYXBwcm9wcmlhdGUgc3RhdHVzIHdpbGwgYmUgcmV0dXJuZWQKLSAqICAgICAgICAgICAgICBhbmQgdGhlIGNvbnRlbnRzIG9mIHRoZSBjYWxsZXJzIGJ1ZmZlciBpcyB1bmRlZmluZWQuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotYWNwaV9zdGF0dXMKLWFjcGlfcnNfZ2V0X21ldGhvZF9kYXRhKGFjcGlfaGFuZGxlIGhhbmRsZSwKLQkJCWNoYXIgKnBhdGgsIHN0cnVjdCBhY3BpX2J1ZmZlciAqcmV0X2J1ZmZlcikKLXsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYzsKLQlhY3BpX3N0YXR1cyBzdGF0dXM7Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKHJzX2dldF9tZXRob2RfZGF0YSk7Ci0KLQkvKiBQYXJhbWV0ZXJzIGd1YXJhbnRlZWQgdmFsaWQgYnkgY2FsbGVyICovCi0KLQkvKiBFeGVjdXRlIHRoZSBtZXRob2QsIG5vIHBhcmFtZXRlcnMgKi8KLQotCXN0YXR1cyA9Ci0JICAgIGFjcGlfdXRfZXZhbHVhdGVfb2JqZWN0KGhhbmRsZSwgcGF0aCwgQUNQSV9CVFlQRV9CVUZGRVIsICZvYmpfZGVzYyk7Ci0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotCX0KLQotCS8qCi0JICogTWFrZSB0aGUgY2FsbCB0byBjcmVhdGUgYSByZXNvdXJjZSBsaW5rZWQgbGlzdCBmcm9tIHRoZQotCSAqIGJ5dGUgc3RyZWFtIGJ1ZmZlciB0aGF0IGNvbWVzIGJhY2sgZnJvbSB0aGUgbWV0aG9kCi0JICogZXhlY3V0aW9uLgotCSAqLwotCXN0YXR1cyA9IGFjcGlfcnNfY3JlYXRlX3Jlc291cmNlX2xpc3Qob2JqX2Rlc2MsIHJldF9idWZmZXIpOwotCi0JLyogT24gZXhpdCwgd2UgbXVzdCBkZWxldGUgdGhlIG9iamVjdCByZXR1cm5lZCBieSBldmFsdWF0ZV9vYmplY3QgKi8KLQotCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZShvYmpfZGVzYyk7Ci0JcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfcnNfc2V0X3Nyc19tZXRob2RfZGF0YQotICoKLSAqIFBBUkFNRVRFUlM6ICBOb2RlICAgICAgICAgICAgLSBEZXZpY2Ugbm9kZQotICogICAgICAgICAgICAgIGluX2J1ZmZlciAgICAgICAtIFBvaW50ZXIgdG8gYSBidWZmZXIgc3RydWN0dXJlIG9mIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcgotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKLSAqCi0gKiBERVNDUklQVElPTjogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gc2V0IHRoZSBfU1JTIG9mIGFuIG9iamVjdCBjb250YWluZWQKLSAqICAgICAgICAgICAgICBpbiBhbiBvYmplY3Qgc3BlY2lmaWVkIGJ5IHRoZSBoYW5kbGUgcGFzc2VkIGluCi0gKgotICogICAgICAgICAgICAgIElmIHRoZSBmdW5jdGlvbiBmYWlscyBhbiBhcHByb3ByaWF0ZSBzdGF0dXMgd2lsbCBiZSByZXR1cm5lZAotICogICAgICAgICAgICAgIGFuZCB0aGUgY29udGVudHMgb2YgdGhlIGNhbGxlcnMgYnVmZmVyIGlzIHVuZGVmaW5lZC4KLSAqCi0gKiBOb3RlOiBQYXJhbWV0ZXJzIGd1YXJhbnRlZWQgdmFsaWQgYnkgY2FsbGVyCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotYWNwaV9zdGF0dXMKLWFjcGlfcnNfc2V0X3Nyc19tZXRob2RfZGF0YShzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZSwKLQkJCSAgICBzdHJ1Y3QgYWNwaV9idWZmZXIgKmluX2J1ZmZlcikKLXsKLQlzdHJ1Y3QgYWNwaV9ldmFsdWF0ZV9pbmZvICppbmZvOwotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKmFyZ3NbMl07Ci0JYWNwaV9zdGF0dXMgc3RhdHVzOwotCXN0cnVjdCBhY3BpX2J1ZmZlciBidWZmZXI7Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKHJzX3NldF9zcnNfbWV0aG9kX2RhdGEpOwotCi0JLyogQWxsb2NhdGUgYW5kIGluaXRpYWxpemUgdGhlIGV2YWx1YXRpb24gaW5mb3JtYXRpb24gYmxvY2sgKi8KLQotCWluZm8gPSBBQ1BJX0FMTE9DQVRFX1pFUk9FRChzaXplb2Yoc3RydWN0IGFjcGlfZXZhbHVhdGVfaW5mbykpOwotCWlmICghaW5mbykgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9fTUVNT1JZKTsKLQl9Ci0KLQlpbmZvLT5wcmVmaXhfbm9kZSA9IG5vZGU7Ci0JaW5mby0+cGF0aG5hbWUgPSBNRVRIT0RfTkFNRV9fU1JTOwotCWluZm8tPnBhcmFtZXRlcnMgPSBhcmdzOwotCWluZm8tPmZsYWdzID0gQUNQSV9JR05PUkVfUkVUVVJOX1ZBTFVFOwotCi0JLyoKLQkgKiBUaGUgaW5fYnVmZmVyIHBhcmFtZXRlciB3aWxsIHBvaW50IHRvIGEgbGlua2VkIGxpc3Qgb2YKLQkgKiByZXNvdXJjZSBwYXJhbWV0ZXJzLiBJdCBuZWVkcyB0byBiZSBmb3JtYXR0ZWQgaW50byBhCi0JICogYnl0ZSBzdHJlYW0gdG8gYmUgc2VudCBpbiBhcyBhbiBpbnB1dCBwYXJhbWV0ZXIgdG8gX1NSUwotCSAqCi0JICogQ29udmVydCB0aGUgbGlua2VkIGxpc3QgaW50byBhIGJ5dGUgc3RyZWFtCi0JICovCi0JYnVmZmVyLmxlbmd0aCA9IEFDUElfQUxMT0NBVEVfTE9DQUxfQlVGRkVSOwotCXN0YXR1cyA9IGFjcGlfcnNfY3JlYXRlX2FtbF9yZXNvdXJjZXMoaW5fYnVmZmVyLT5wb2ludGVyLCAmYnVmZmVyKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJZ290byBjbGVhbnVwOwotCX0KLQotCS8qIENyZWF0ZSBhbmQgaW5pdGlhbGl6ZSB0aGUgbWV0aG9kIHBhcmFtZXRlciBvYmplY3QgKi8KLQotCWFyZ3NbMF0gPSBhY3BpX3V0X2NyZWF0ZV9pbnRlcm5hbF9vYmplY3QoQUNQSV9UWVBFX0JVRkZFUik7Ci0JaWYgKCFhcmdzWzBdKSB7Ci0JCS8qCi0JCSAqIE11c3QgZnJlZSB0aGUgYnVmZmVyIGFsbG9jYXRlZCBhYm92ZSAob3RoZXJ3aXNlIGl0IGlzIGZyZWVkCi0JCSAqIGxhdGVyKQotCQkgKi8KLQkJQUNQSV9GUkVFKGJ1ZmZlci5wb2ludGVyKTsKLQkJc3RhdHVzID0gQUVfTk9fTUVNT1JZOwotCQlnb3RvIGNsZWFudXA7Ci0JfQotCi0JYXJnc1swXS0+YnVmZmVyLmxlbmd0aCA9ICh1MzIpIGJ1ZmZlci5sZW5ndGg7Ci0JYXJnc1swXS0+YnVmZmVyLnBvaW50ZXIgPSBidWZmZXIucG9pbnRlcjsKLQlhcmdzWzBdLT5jb21tb24uZmxhZ3MgPSBBT1BPQkpfREFUQV9WQUxJRDsKLQlhcmdzWzFdID0gTlVMTDsKLQotCS8qIEV4ZWN1dGUgdGhlIG1ldGhvZCwgbm8gcmV0dXJuIHZhbHVlIGlzIGV4cGVjdGVkICovCi0KLQlzdGF0dXMgPSBhY3BpX25zX2V2YWx1YXRlKGluZm8pOwotCi0JLyogQ2xlYW4gdXAgYW5kIHJldHVybiB0aGUgc3RhdHVzIGZyb20gYWNwaV9uc19ldmFsdWF0ZSAqLwotCi0JYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKGFyZ3NbMF0pOwotCi0gICAgICBjbGVhbnVwOgotCUFDUElfRlJFRShpbmZvKTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9yZXNvdXJjZXMvcnN4ZmFjZS5jIGIvZHJpdmVycy9hY3BpL3Jlc291cmNlcy9yc3hmYWNlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1OWY0YzQuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9hY3BpL3Jlc291cmNlcy9yc3hmYWNlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1NzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBNb2R1bGUgTmFtZTogcnN4ZmFjZSAtIFB1YmxpYyBpbnRlcmZhY2VzIHRvIHRoZSByZXNvdXJjZSBtYW5hZ2VyCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDgsIEludGVsIENvcnAuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCi0gKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSBhdCBtaW5pbXVtIGEgZGlzY2xhaW1lcgotICogICAgc3Vic3RhbnRpYWxseSBzaW1pbGFyIHRvIHRoZSAiTk8gV0FSUkFOVFkiIGRpc2NsYWltZXIgYmVsb3cKLSAqICAgICgiRGlzY2xhaW1lciIpIGFuZCBhbnkgcmVkaXN0cmlidXRpb24gbXVzdCBiZSBjb25kaXRpb25lZCB1cG9uCi0gKiAgICBpbmNsdWRpbmcgYSBzdWJzdGFudGlhbGx5IHNpbWlsYXIgRGlzY2xhaW1lciByZXF1aXJlbWVudCBmb3IgZnVydGhlcgotICogICAgYmluYXJ5IHJlZGlzdHJpYnV0aW9uLgotICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzCi0gKiAgICBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIE5PIFdBUlJBTlRZCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKLSAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCi0gKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORwotICogSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCi0gKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCi0gKi8KLQotI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgotI2luY2x1ZGUgPGFjcGkvYWNyZXNyYy5oPgotI2luY2x1ZGUgPGFjcGkvYWNuYW1lc3AuaD4KLQotI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfUkVTT1VSQ0VTCi1BQ1BJX01PRFVMRV9OQU1FKCJyc3hmYWNlIikKLQotLyogTG9jYWwgbWFjcm9zIGZvciAxNiwzMi1iaXQgdG8gNjQtYml0IGNvbnZlcnNpb24gKi8KLSNkZWZpbmUgQUNQSV9DT1BZX0ZJRUxEKG91dCwgaW4sIGZpZWxkKSAgKChvdXQpLT5maWVsZCA9IChpbiktPmZpZWxkKQotI2RlZmluZSBBQ1BJX0NPUFlfQUREUkVTUyhvdXQsIGluKSAgICAgICAgICAgICAgICAgICAgICBcCi0JQUNQSV9DT1BZX0ZJRUxEKG91dCwgaW4sIHJlc291cmNlX3R5cGUpOyAgICAgICAgICAgICBcCi0JQUNQSV9DT1BZX0ZJRUxEKG91dCwgaW4sIHByb2R1Y2VyX2NvbnN1bWVyKTsgICAgICAgICBcCi0JQUNQSV9DT1BZX0ZJRUxEKG91dCwgaW4sIGRlY29kZSk7ICAgICAgICAgICAgICAgICAgICBcCi0JQUNQSV9DT1BZX0ZJRUxEKG91dCwgaW4sIG1pbl9hZGRyZXNzX2ZpeGVkKTsgICAgICAgICBcCi0JQUNQSV9DT1BZX0ZJRUxEKG91dCwgaW4sIG1heF9hZGRyZXNzX2ZpeGVkKTsgICAgICAgICBcCi0JQUNQSV9DT1BZX0ZJRUxEKG91dCwgaW4sIGluZm8pOyAgICAgICAgICAgICAgICAgICAgICBcCi0JQUNQSV9DT1BZX0ZJRUxEKG91dCwgaW4sIGdyYW51bGFyaXR5KTsgICAgICAgICAgICAgICBcCi0JQUNQSV9DT1BZX0ZJRUxEKG91dCwgaW4sIG1pbmltdW0pOyAgICAgICAgICAgICAgICAgICBcCi0JQUNQSV9DT1BZX0ZJRUxEKG91dCwgaW4sIG1heGltdW0pOyAgICAgICAgICAgICAgICAgICBcCi0JQUNQSV9DT1BZX0ZJRUxEKG91dCwgaW4sIHRyYW5zbGF0aW9uX29mZnNldCk7ICAgICAgICBcCi0JQUNQSV9DT1BZX0ZJRUxEKG91dCwgaW4sIGFkZHJlc3NfbGVuZ3RoKTsgICAgICAgICAgICBcCi0JQUNQSV9DT1BZX0ZJRUxEKG91dCwgaW4sIHJlc291cmNlX3NvdXJjZSk7Ci0vKiBMb2NhbCBwcm90b3R5cGVzICovCi1zdGF0aWMgYWNwaV9zdGF0dXMKLWFjcGlfcnNfbWF0Y2hfdmVuZG9yX3Jlc291cmNlKHN0cnVjdCBhY3BpX3Jlc291cmNlICpyZXNvdXJjZSwgdm9pZCAqY29udGV4dCk7Ci0KLXN0YXRpYyBhY3BpX3N0YXR1cwotYWNwaV9yc192YWxpZGF0ZV9wYXJhbWV0ZXJzKGFjcGlfaGFuZGxlIGRldmljZV9oYW5kbGUsCi0JCQkgICAgc3RydWN0IGFjcGlfYnVmZmVyICpidWZmZXIsCi0JCQkgICAgc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKipyZXR1cm5fbm9kZSk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfcnNfdmFsaWRhdGVfcGFyYW1ldGVycwotICoKLSAqIFBBUkFNRVRFUlM6ICBkZXZpY2VfaGFuZGxlICAgLSBIYW5kbGUgdG8gYSBkZXZpY2UKLSAqICAgICAgICAgICAgICBCdWZmZXIgICAgICAgICAgLSBQb2ludGVyIHRvIGEgZGF0YSBidWZmZXIKLSAqICAgICAgICAgICAgICByZXR1cm5fbm9kZSAgICAgLSBQb2ludGVyIHRvIHdoZXJlIHRoZSBkZXZpY2Ugbm9kZSBpcyByZXR1cm5lZAotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKLSAqCi0gKiBERVNDUklQVElPTjogQ29tbW9uIHBhcmFtZXRlciB2YWxpZGF0aW9uIGZvciByZXNvdXJjZSBpbnRlcmZhY2VzCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIGFjcGlfc3RhdHVzCi1hY3BpX3JzX3ZhbGlkYXRlX3BhcmFtZXRlcnMoYWNwaV9oYW5kbGUgZGV2aWNlX2hhbmRsZSwKLQkJCSAgICBzdHJ1Y3QgYWNwaV9idWZmZXIgKmJ1ZmZlciwKLQkJCSAgICBzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqKnJldHVybl9ub2RlKQotewotCWFjcGlfc3RhdHVzIHN0YXR1czsKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZTsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UocnNfdmFsaWRhdGVfcGFyYW1ldGVycyk7Ci0KLQkvKgotCSAqIE11c3QgaGF2ZSBhIHZhbGlkIGhhbmRsZSB0byBhbiBBQ1BJIGRldmljZQotCSAqLwotCWlmICghZGV2aWNlX2hhbmRsZSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX1BBUkFNRVRFUik7Ci0JfQotCi0Jbm9kZSA9IGFjcGlfbnNfbWFwX2hhbmRsZV90b19ub2RlKGRldmljZV9oYW5kbGUpOwotCWlmICghbm9kZSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX1BBUkFNRVRFUik7Ci0JfQotCi0JaWYgKG5vZGUtPnR5cGUgIT0gQUNQSV9UWVBFX0RFVklDRSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfVFlQRSk7Ci0JfQotCi0JLyoKLQkgKiBWYWxpZGF0ZSB0aGUgdXNlciBidWZmZXIgb2JqZWN0Ci0JICoKLQkgKiBpZiB0aGVyZSBpcyBhIG5vbi16ZXJvIGJ1ZmZlciBsZW5ndGggd2UgYWxzbyBuZWVkIGEgdmFsaWQgcG9pbnRlciBpbgotCSAqIHRoZSBidWZmZXIuIElmIGl0J3MgYSB6ZXJvIGJ1ZmZlciBsZW5ndGgsIHdlJ2xsIGJlIHJldHVybmluZyB0aGUKLQkgKiBuZWVkZWQgYnVmZmVyIHNpemUgKGxhdGVyKSwgc28ga2VlcCBnb2luZy4KLQkgKi8KLQlzdGF0dXMgPSBhY3BpX3V0X3ZhbGlkYXRlX2J1ZmZlcihidWZmZXIpOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLQl9Ci0KLQkqcmV0dXJuX25vZGUgPSBub2RlOwotCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfZ2V0X2lycV9yb3V0aW5nX3RhYmxlCi0gKgotICogUEFSQU1FVEVSUzogIGRldmljZV9oYW5kbGUgICAtIEhhbmRsZSB0byB0aGUgQnVzIGRldmljZSB3ZSBhcmUgcXVlcnlpbmcKLSAqICAgICAgICAgICAgICByZXRfYnVmZmVyICAgICAgLSBQb2ludGVyIHRvIGEgYnVmZmVyIHRvIHJlY2VpdmUgdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCByZXNvdXJjZXMgZm9yIHRoZSBkZXZpY2UKLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGdldCB0aGUgSVJRIHJvdXRpbmcgdGFibGUgZm9yIGEKLSAqICAgICAgICAgICAgICBzcGVjaWZpYyBidXMuIFRoZSBjYWxsZXIgbXVzdCBmaXJzdCBhY3F1aXJlIGEgaGFuZGxlIGZvciB0aGUKLSAqICAgICAgICAgICAgICBkZXNpcmVkIGJ1cy4gVGhlIHJvdXRpbmUgdGFibGUgaXMgcGxhY2VkIGluIHRoZSBidWZmZXIgcG9pbnRlZAotICogICAgICAgICAgICAgIHRvIGJ5IHRoZSByZXRfYnVmZmVyIHZhcmlhYmxlIHBhcmFtZXRlci4KLSAqCi0gKiAgICAgICAgICAgICAgSWYgdGhlIGZ1bmN0aW9uIGZhaWxzIGFuIGFwcHJvcHJpYXRlIHN0YXR1cyB3aWxsIGJlIHJldHVybmVkCi0gKiAgICAgICAgICAgICAgYW5kIHRoZSB2YWx1ZSBvZiByZXRfYnVmZmVyIGlzIHVuZGVmaW5lZC4KLSAqCi0gKiAgICAgICAgICAgICAgVGhpcyBmdW5jdGlvbiBhdHRlbXB0cyB0byBleGVjdXRlIHRoZSBfUFJUIG1ldGhvZCBjb250YWluZWQgaW4KLSAqICAgICAgICAgICAgICB0aGUgb2JqZWN0IGluZGljYXRlZCBieSB0aGUgcGFzc2VkIGRldmljZV9oYW5kbGUuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotYWNwaV9zdGF0dXMKLWFjcGlfZ2V0X2lycV9yb3V0aW5nX3RhYmxlKGFjcGlfaGFuZGxlIGRldmljZV9oYW5kbGUsCi0JCQkgICBzdHJ1Y3QgYWNwaV9idWZmZXIgKnJldF9idWZmZXIpCi17Ci0JYWNwaV9zdGF0dXMgc3RhdHVzOwotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlOwotCi0JQUNQSV9GVU5DVElPTl9UUkFDRShhY3BpX2dldF9pcnFfcm91dGluZ190YWJsZSk7Ci0KLQkvKiBWYWxpZGF0ZSBwYXJhbWV0ZXJzIHRoZW4gZGlzcGF0Y2ggdG8gaW50ZXJuYWwgcm91dGluZSAqLwotCi0Jc3RhdHVzID0gYWNwaV9yc192YWxpZGF0ZV9wYXJhbWV0ZXJzKGRldmljZV9oYW5kbGUsIHJldF9idWZmZXIsICZub2RlKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci0JfQotCi0Jc3RhdHVzID0gYWNwaV9yc19nZXRfcHJ0X21ldGhvZF9kYXRhKG5vZGUsIHJldF9idWZmZXIpOwotCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotfQotCi1BQ1BJX0VYUE9SVF9TWU1CT0woYWNwaV9nZXRfaXJxX3JvdXRpbmdfdGFibGUpCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfZ2V0X2N1cnJlbnRfcmVzb3VyY2VzCi0gKgotICogUEFSQU1FVEVSUzogIGRldmljZV9oYW5kbGUgICAtIEhhbmRsZSB0byB0aGUgZGV2aWNlIG9iamVjdCBmb3IgdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlIHdlIGFyZSBxdWVyeWluZwotICogICAgICAgICAgICAgIHJldF9idWZmZXIgICAgICAtIFBvaW50ZXIgdG8gYSBidWZmZXIgdG8gcmVjZWl2ZSB0aGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50IHJlc291cmNlcyBmb3IgdGhlIGRldmljZQotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKLSAqCi0gKiBERVNDUklQVElPTjogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gZ2V0IHRoZSBjdXJyZW50IHJlc291cmNlcyBmb3IgYQotICogICAgICAgICAgICAgIHNwZWNpZmljIGRldmljZS4gVGhlIGNhbGxlciBtdXN0IGZpcnN0IGFjcXVpcmUgYSBoYW5kbGUgZm9yCi0gKiAgICAgICAgICAgICAgdGhlIGRlc2lyZWQgZGV2aWNlLiBUaGUgcmVzb3VyY2UgZGF0YSBpcyBwbGFjZWQgaW4gdGhlIGJ1ZmZlcgotICogICAgICAgICAgICAgIHBvaW50ZWQgdG8gYnkgdGhlIHJldF9idWZmZXIgdmFyaWFibGUgcGFyYW1ldGVyLgotICoKLSAqICAgICAgICAgICAgICBJZiB0aGUgZnVuY3Rpb24gZmFpbHMgYW4gYXBwcm9wcmlhdGUgc3RhdHVzIHdpbGwgYmUgcmV0dXJuZWQKLSAqICAgICAgICAgICAgICBhbmQgdGhlIHZhbHVlIG9mIHJldF9idWZmZXIgaXMgdW5kZWZpbmVkLgotICoKLSAqICAgICAgICAgICAgICBUaGlzIGZ1bmN0aW9uIGF0dGVtcHRzIHRvIGV4ZWN1dGUgdGhlIF9DUlMgbWV0aG9kIGNvbnRhaW5lZCBpbgotICogICAgICAgICAgICAgIHRoZSBvYmplY3QgaW5kaWNhdGVkIGJ5IHRoZSBwYXNzZWQgZGV2aWNlX2hhbmRsZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYWNwaV9zdGF0dXMKLWFjcGlfZ2V0X2N1cnJlbnRfcmVzb3VyY2VzKGFjcGlfaGFuZGxlIGRldmljZV9oYW5kbGUsCi0JCQkgICBzdHJ1Y3QgYWNwaV9idWZmZXIgKnJldF9idWZmZXIpCi17Ci0JYWNwaV9zdGF0dXMgc3RhdHVzOwotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlOwotCi0JQUNQSV9GVU5DVElPTl9UUkFDRShhY3BpX2dldF9jdXJyZW50X3Jlc291cmNlcyk7Ci0KLQkvKiBWYWxpZGF0ZSBwYXJhbWV0ZXJzIHRoZW4gZGlzcGF0Y2ggdG8gaW50ZXJuYWwgcm91dGluZSAqLwotCi0Jc3RhdHVzID0gYWNwaV9yc192YWxpZGF0ZV9wYXJhbWV0ZXJzKGRldmljZV9oYW5kbGUsIHJldF9idWZmZXIsICZub2RlKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci0JfQotCi0Jc3RhdHVzID0gYWNwaV9yc19nZXRfY3JzX21ldGhvZF9kYXRhKG5vZGUsIHJldF9idWZmZXIpOwotCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotfQotCi1BQ1BJX0VYUE9SVF9TWU1CT0woYWNwaV9nZXRfY3VycmVudF9yZXNvdXJjZXMpCi0jaWZkZWYgQUNQSV9GVVRVUkVfVVNBR0UKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfZ2V0X3Bvc3NpYmxlX3Jlc291cmNlcwotICoKLSAqIFBBUkFNRVRFUlM6ICBkZXZpY2VfaGFuZGxlICAgLSBIYW5kbGUgdG8gdGhlIGRldmljZSBvYmplY3QgZm9yIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSB3ZSBhcmUgcXVlcnlpbmcKLSAqICAgICAgICAgICAgICByZXRfYnVmZmVyICAgICAgLSBQb2ludGVyIHRvIGEgYnVmZmVyIHRvIHJlY2VpdmUgdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VzIGZvciB0aGUgZGV2aWNlCi0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cwotICoKLSAqIERFU0NSSVBUSU9OOiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBnZXQgYSBsaXN0IG9mIHRoZSBwb3NzaWJsZSByZXNvdXJjZXMKLSAqICAgICAgICAgICAgICBmb3IgYSBzcGVjaWZpYyBkZXZpY2UuIFRoZSBjYWxsZXIgbXVzdCBmaXJzdCBhY3F1aXJlIGEgaGFuZGxlCi0gKiAgICAgICAgICAgICAgZm9yIHRoZSBkZXNpcmVkIGRldmljZS4gVGhlIHJlc291cmNlIGRhdGEgaXMgcGxhY2VkIGluIHRoZQotICogICAgICAgICAgICAgIGJ1ZmZlciBwb2ludGVkIHRvIGJ5IHRoZSByZXRfYnVmZmVyIHZhcmlhYmxlLgotICoKLSAqICAgICAgICAgICAgICBJZiB0aGUgZnVuY3Rpb24gZmFpbHMgYW4gYXBwcm9wcmlhdGUgc3RhdHVzIHdpbGwgYmUgcmV0dXJuZWQKLSAqICAgICAgICAgICAgICBhbmQgdGhlIHZhbHVlIG9mIHJldF9idWZmZXIgaXMgdW5kZWZpbmVkLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1hY3BpX3N0YXR1cwotYWNwaV9nZXRfcG9zc2libGVfcmVzb3VyY2VzKGFjcGlfaGFuZGxlIGRldmljZV9oYW5kbGUsCi0JCQkgICAgc3RydWN0IGFjcGlfYnVmZmVyICpyZXRfYnVmZmVyKQotewotCWFjcGlfc3RhdHVzIHN0YXR1czsKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZTsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UoYWNwaV9nZXRfcG9zc2libGVfcmVzb3VyY2VzKTsKLQotCS8qIFZhbGlkYXRlIHBhcmFtZXRlcnMgdGhlbiBkaXNwYXRjaCB0byBpbnRlcm5hbCByb3V0aW5lICovCi0KLQlzdGF0dXMgPSBhY3BpX3JzX3ZhbGlkYXRlX3BhcmFtZXRlcnMoZGV2aWNlX2hhbmRsZSwgcmV0X2J1ZmZlciwgJm5vZGUpOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLQl9Ci0KLQlzdGF0dXMgPSBhY3BpX3JzX2dldF9wcnNfbWV0aG9kX2RhdGEobm9kZSwgcmV0X2J1ZmZlcik7Ci0JcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci19Ci0KLUFDUElfRVhQT1JUX1NZTUJPTChhY3BpX2dldF9wb3NzaWJsZV9yZXNvdXJjZXMpCi0jZW5kaWYJCQkJLyogIEFDUElfRlVUVVJFX1VTQUdFICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9zZXRfY3VycmVudF9yZXNvdXJjZXMKLSAqCi0gKiBQQVJBTUVURVJTOiAgZGV2aWNlX2hhbmRsZSAgIC0gSGFuZGxlIHRvIHRoZSBkZXZpY2Ugb2JqZWN0IGZvciB0aGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2Ugd2UgYXJlIHNldHRpbmcgcmVzb3VyY2VzCi0gKiAgICAgICAgICAgICAgaW5fYnVmZmVyICAgICAgIC0gUG9pbnRlciB0byBhIGJ1ZmZlciBjb250YWluaW5nIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlcyB0byBiZSBzZXQgZm9yIHRoZSBkZXZpY2UKLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHNldCB0aGUgY3VycmVudCByZXNvdXJjZXMgZm9yIGEKLSAqICAgICAgICAgICAgICBzcGVjaWZpYyBkZXZpY2UuIFRoZSBjYWxsZXIgbXVzdCBmaXJzdCBhY3F1aXJlIGEgaGFuZGxlIGZvcgotICogICAgICAgICAgICAgIHRoZSBkZXNpcmVkIGRldmljZS4gVGhlIHJlc291cmNlIGRhdGEgaXMgcGFzc2VkIHRvIHRoZSByb3V0aW5lCi0gKiAgICAgICAgICAgICAgdGhlIGJ1ZmZlciBwb2ludGVkIHRvIGJ5IHRoZSBpbl9idWZmZXIgdmFyaWFibGUuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWFjcGlfc3RhdHVzCi1hY3BpX3NldF9jdXJyZW50X3Jlc291cmNlcyhhY3BpX2hhbmRsZSBkZXZpY2VfaGFuZGxlLAotCQkJICAgc3RydWN0IGFjcGlfYnVmZmVyICppbl9idWZmZXIpCi17Ci0JYWNwaV9zdGF0dXMgc3RhdHVzOwotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlOwotCi0JQUNQSV9GVU5DVElPTl9UUkFDRShhY3BpX3NldF9jdXJyZW50X3Jlc291cmNlcyk7Ci0KLQkvKiBWYWxpZGF0ZSB0aGUgYnVmZmVyLCBkb24ndCBhbGxvdyB6ZXJvIGxlbmd0aCAqLwotCi0JaWYgKCghaW5fYnVmZmVyKSB8fCAoIWluX2J1ZmZlci0+cG9pbnRlcikgfHwgKCFpbl9idWZmZXItPmxlbmd0aCkpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9QQVJBTUVURVIpOwotCX0KLQotCS8qIFZhbGlkYXRlIHBhcmFtZXRlcnMgdGhlbiBkaXNwYXRjaCB0byBpbnRlcm5hbCByb3V0aW5lICovCi0KLQlzdGF0dXMgPSBhY3BpX3JzX3ZhbGlkYXRlX3BhcmFtZXRlcnMoZGV2aWNlX2hhbmRsZSwgaW5fYnVmZmVyLCAmbm9kZSk7Ci0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotCX0KLQotCXN0YXR1cyA9IGFjcGlfcnNfc2V0X3Nyc19tZXRob2RfZGF0YShub2RlLCBpbl9idWZmZXIpOwotCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotfQotCi1BQ1BJX0VYUE9SVF9TWU1CT0woYWNwaV9zZXRfY3VycmVudF9yZXNvdXJjZXMpCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9yZXNvdXJjZV90b19hZGRyZXNzNjQKLSAqCi0gKiBQQVJBTUVURVJTOiAgUmVzb3VyY2UgICAgICAgIC0gUG9pbnRlciB0byBhIHJlc291cmNlCi0gKiAgICAgICAgICAgICAgT3V0ICAgICAgICAgICAgIC0gUG9pbnRlciB0byB0aGUgdXNlcnMncyByZXR1cm4gYnVmZmVyCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGEgc3RydWN0IGFjcGlfcmVzb3VyY2VfYWRkcmVzczY0KQotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKLSAqCi0gKiBERVNDUklQVElPTjogSWYgdGhlIHJlc291cmNlIGlzIGFuIGFkZHJlc3MxNiwgYWRkcmVzczMyLCBvciBhZGRyZXNzNjQsCi0gKiAgICAgICAgICAgICAgY29weSBpdCB0byB0aGUgYWRkcmVzczY0IHJldHVybiBidWZmZXIuIFRoaXMgc2F2ZXMgdGhlCi0gKiAgICAgICAgICAgICAgY2FsbGVyIGZyb20gaGF2aW5nIHRvIGR1cGxpY2F0ZSBjb2RlIGZvciBkaWZmZXJlbnQtc2l6ZWQKLSAqICAgICAgICAgICAgICBhZGRyZXNzZXMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWFjcGlfc3RhdHVzCi1hY3BpX3Jlc291cmNlX3RvX2FkZHJlc3M2NChzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAqcmVzb3VyY2UsCi0JCQkgICBzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9hZGRyZXNzNjQgKm91dCkKLXsKLQlzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9hZGRyZXNzMTYgKmFkZHJlc3MxNjsKLQlzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9hZGRyZXNzMzIgKmFkZHJlc3MzMjsKLQotCWlmICghcmVzb3VyY2UgfHwgIW91dCkgewotCQlyZXR1cm4gKEFFX0JBRF9QQVJBTUVURVIpOwotCX0KLQotCS8qIENvbnZlcnQgMTYgb3IgMzIgYWRkcmVzcyBkZXNjcmlwdG9yIHRvIDY0ICovCi0KLQlzd2l0Y2ggKHJlc291cmNlLT50eXBlKSB7Ci0JY2FzZSBBQ1BJX1JFU09VUkNFX1RZUEVfQUREUkVTUzE2OgotCi0JCWFkZHJlc3MxNiA9IChzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9hZGRyZXNzMTYgKikmcmVzb3VyY2UtPmRhdGE7Ci0JCUFDUElfQ09QWV9BRERSRVNTKG91dCwgYWRkcmVzczE2KTsKLQkJYnJlYWs7Ci0KLQljYXNlIEFDUElfUkVTT1VSQ0VfVFlQRV9BRERSRVNTMzI6Ci0KLQkJYWRkcmVzczMyID0gKHN0cnVjdCBhY3BpX3Jlc291cmNlX2FkZHJlc3MzMiAqKSZyZXNvdXJjZS0+ZGF0YTsKLQkJQUNQSV9DT1BZX0FERFJFU1Mob3V0LCBhZGRyZXNzMzIpOwotCQlicmVhazsKLQotCWNhc2UgQUNQSV9SRVNPVVJDRV9UWVBFX0FERFJFU1M2NDoKLQotCQkvKiBTaW1wbGUgY29weSBmb3IgNjQgYml0IHNvdXJjZSAqLwotCi0JCUFDUElfTUVNQ1BZKG91dCwgJnJlc291cmNlLT5kYXRhLAotCQkJICAgIHNpemVvZihzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9hZGRyZXNzNjQpKTsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlyZXR1cm4gKEFFX0JBRF9QQVJBTUVURVIpOwotCX0KLQotCXJldHVybiAoQUVfT0spOwotfQotCi1BQ1BJX0VYUE9SVF9TWU1CT0woYWNwaV9yZXNvdXJjZV90b19hZGRyZXNzNjQpCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfZ2V0X3ZlbmRvcl9yZXNvdXJjZQotICoKLSAqIFBBUkFNRVRFUlM6ICBkZXZpY2VfaGFuZGxlICAgLSBIYW5kbGUgZm9yIHRoZSBwYXJlbnQgZGV2aWNlIG9iamVjdAotICogICAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAtIE1ldGhvZCBuYW1lIGZvciB0aGUgcGFyZW50IHJlc291cmNlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE1FVEhPRF9OQU1FX19DUlMgb3IgTUVUSE9EX05BTUVfX1BSUykKLSAqICAgICAgICAgICAgICBVdWlkICAgICAgICAgICAgLSBQb2ludGVyIHRvIHRoZSBVVUlEIHRvIGJlIG1hdGNoZWQuCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZXMgYm90aCBzdWJ0eXBlIGFuZCAxNi1ieXRlIFVVSUQKLSAqICAgICAgICAgICAgICByZXRfYnVmZmVyICAgICAgLSBXaGVyZSB0aGUgdmVuZG9yIHJlc291cmNlIGlzIHJldHVybmVkCi0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cwotICoKLSAqIERFU0NSSVBUSU9OOiBXYWxrIGEgcmVzb3VyY2UgdGVtcGxhdGUgZm9yIHRoZSBzcGVjaWZpZWQgZXZpY2UgdG8gZmluZCBhCi0gKiAgICAgICAgICAgICAgdmVuZG9yLWRlZmluZWQgcmVzb3VyY2UgdGhhdCBtYXRjaGVzIHRoZSBzdXBwbGllZCBVVUlEIGFuZAotICogICAgICAgICAgICAgIFVVSUQgc3VidHlwZS4gUmV0dXJucyBhIHN0cnVjdCBhY3BpX3Jlc291cmNlIG9mIHR5cGUgVmVuZG9yLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1hY3BpX3N0YXR1cwotYWNwaV9nZXRfdmVuZG9yX3Jlc291cmNlKGFjcGlfaGFuZGxlIGRldmljZV9oYW5kbGUsCi0JCQkgY2hhciAqbmFtZSwKLQkJCSBzdHJ1Y3QgYWNwaV92ZW5kb3JfdXVpZCAqIHV1aWQsCi0JCQkgc3RydWN0IGFjcGlfYnVmZmVyICogcmV0X2J1ZmZlcikKLXsKLQlzdHJ1Y3QgYWNwaV92ZW5kb3Jfd2Fsa19pbmZvIGluZm87Ci0JYWNwaV9zdGF0dXMgc3RhdHVzOwotCi0JLyogT3RoZXIgcGFyYW1ldGVycyBhcmUgdmFsaWRhdGVkIGJ5IGFjcGlfd2Fsa19yZXNvdXJjZXMgKi8KLQotCWlmICghdXVpZCB8fCAhcmV0X2J1ZmZlcikgewotCQlyZXR1cm4gKEFFX0JBRF9QQVJBTUVURVIpOwotCX0KLQotCWluZm8udXVpZCA9IHV1aWQ7Ci0JaW5mby5idWZmZXIgPSByZXRfYnVmZmVyOwotCWluZm8uc3RhdHVzID0gQUVfTk9UX0VYSVNUOwotCi0JLyogV2FsayB0aGUgX0NSUyBvciBfUFJTIHJlc291cmNlIGxpc3QgZm9yIHRoaXMgZGV2aWNlICovCi0KLQlzdGF0dXMgPQotCSAgICBhY3BpX3dhbGtfcmVzb3VyY2VzKGRldmljZV9oYW5kbGUsIG5hbWUsCi0JCQkJYWNwaV9yc19tYXRjaF92ZW5kb3JfcmVzb3VyY2UsICZpbmZvKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJcmV0dXJuIChzdGF0dXMpOwotCX0KLQotCXJldHVybiAoaW5mby5zdGF0dXMpOwotfQotCi1BQ1BJX0VYUE9SVF9TWU1CT0woYWNwaV9nZXRfdmVuZG9yX3Jlc291cmNlKQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX3JzX21hdGNoX3ZlbmRvcl9yZXNvdXJjZQotICoKLSAqIFBBUkFNRVRFUlM6ICBhY3BpX3dhbGtfcmVzb3VyY2VfY2FsbGJhY2sKLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IE1hdGNoIGEgdmVuZG9yIHJlc291cmNlIHZpYSB0aGUgQUNQSSAzLjAgVVVJRAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgYWNwaV9zdGF0dXMKLWFjcGlfcnNfbWF0Y2hfdmVuZG9yX3Jlc291cmNlKHN0cnVjdCBhY3BpX3Jlc291cmNlICpyZXNvdXJjZSwgdm9pZCAqY29udGV4dCkKLXsKLQlzdHJ1Y3QgYWNwaV92ZW5kb3Jfd2Fsa19pbmZvICppbmZvID0gY29udGV4dDsKLQlzdHJ1Y3QgYWNwaV9yZXNvdXJjZV92ZW5kb3JfdHlwZWQgKnZlbmRvcjsKLQlzdHJ1Y3QgYWNwaV9idWZmZXIgKmJ1ZmZlcjsKLQlhY3BpX3N0YXR1cyBzdGF0dXM7Ci0KLQkvKiBJZ25vcmUgYWxsIGRlc2NyaXB0b3JzIGV4Y2VwdCBWZW5kb3IgKi8KLQotCWlmIChyZXNvdXJjZS0+dHlwZSAhPSBBQ1BJX1JFU09VUkNFX1RZUEVfVkVORE9SKSB7Ci0JCXJldHVybiAoQUVfT0spOwotCX0KLQotCXZlbmRvciA9ICZyZXNvdXJjZS0+ZGF0YS52ZW5kb3JfdHlwZWQ7Ci0KLQkvKgotCSAqIEZvciBhIHZhbGlkIG1hdGNoLCB0aGVzZSBjb25kaXRpb25zIG11c3QgaG9sZDoKLQkgKgotCSAqIDEpIExlbmd0aCBvZiBkZXNjcmlwdG9yIGRhdGEgbXVzdCBiZSBhdCBsZWFzdCBhcyBsb25nIGFzIGEgVVVJRCBzdHJ1Y3QKLQkgKiAyKSBUaGUgVVVJRCBzdWJ0eXBlcyBtdXN0IG1hdGNoCi0JICogMykgVGhlIFVVSUQgZGF0YSBtdXN0IG1hdGNoCi0JICovCi0JaWYgKCh2ZW5kb3ItPmJ5dGVfbGVuZ3RoIDwgKEFDUElfVVVJRF9MRU5HVEggKyAxKSkgfHwKLQkgICAgKHZlbmRvci0+dXVpZF9zdWJ0eXBlICE9IGluZm8tPnV1aWQtPnN1YnR5cGUpIHx8Ci0JICAgIChBQ1BJX01FTUNNUCh2ZW5kb3ItPnV1aWQsIGluZm8tPnV1aWQtPmRhdGEsIEFDUElfVVVJRF9MRU5HVEgpKSkgewotCQlyZXR1cm4gKEFFX09LKTsKLQl9Ci0KLQkvKiBWYWxpZGF0ZS9BbGxvY2F0ZS9DbGVhciBjYWxsZXIgYnVmZmVyICovCi0KLQlidWZmZXIgPSBpbmZvLT5idWZmZXI7Ci0Jc3RhdHVzID0gYWNwaV91dF9pbml0aWFsaXplX2J1ZmZlcihidWZmZXIsIHJlc291cmNlLT5sZW5ndGgpOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlyZXR1cm4gKHN0YXR1cyk7Ci0JfQotCi0JLyogRm91bmQgdGhlIGNvcnJlY3QgcmVzb3VyY2UsIGNvcHkgYW5kIHJldHVybiBpdCAqLwotCi0JQUNQSV9NRU1DUFkoYnVmZmVyLT5wb2ludGVyLCByZXNvdXJjZSwgcmVzb3VyY2UtPmxlbmd0aCk7Ci0JYnVmZmVyLT5sZW5ndGggPSByZXNvdXJjZS0+bGVuZ3RoOwotCi0JLyogRm91bmQgdGhlIGRlc2lyZWQgZGVzY3JpcHRvciwgdGVybWluYXRlIHJlc291cmNlIHdhbGsgKi8KLQotCWluZm8tPnN0YXR1cyA9IEFFX09LOwotCXJldHVybiAoQUVfQ1RSTF9URVJNSU5BVEUpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX3dhbGtfcmVzb3VyY2VzCi0gKgotICogUEFSQU1FVEVSUzogIGRldmljZV9oYW5kbGUgICAtIEhhbmRsZSB0byB0aGUgZGV2aWNlIG9iamVjdCBmb3IgdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlIHdlIGFyZSBxdWVyeWluZwotICogICAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAtIE1ldGhvZCBuYW1lIG9mIHRoZSByZXNvdXJjZXMgd2Ugd2FudAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNRVRIT0RfTkFNRV9fQ1JTIG9yIE1FVEhPRF9OQU1FX19QUlMpCi0gKiAgICAgICAgICAgICAgdXNlcl9mdW5jdGlvbiAgIC0gQ2FsbGVkIGZvciBlYWNoIHJlc291cmNlCi0gKiAgICAgICAgICAgICAgQ29udGV4dCAgICAgICAgIC0gUGFzc2VkIHRvIHVzZXJfZnVuY3Rpb24KLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IFJldHJpZXZlcyB0aGUgY3VycmVudCBvciBwb3NzaWJsZSByZXNvdXJjZSBsaXN0IGZvciB0aGUKLSAqICAgICAgICAgICAgICBzcGVjaWZpZWQgZGV2aWNlLiBUaGUgdXNlcl9mdW5jdGlvbiBpcyBjYWxsZWQgb25jZSBmb3IKLSAqICAgICAgICAgICAgICBlYWNoIHJlc291cmNlIGluIHRoZSBsaXN0LgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1hY3BpX3N0YXR1cwotYWNwaV93YWxrX3Jlc291cmNlcyhhY3BpX2hhbmRsZSBkZXZpY2VfaGFuZGxlLAotCQkgICAgY2hhciAqbmFtZSwKLQkJICAgIGFjcGlfd2Fsa19yZXNvdXJjZV9jYWxsYmFjayB1c2VyX2Z1bmN0aW9uLCB2b2lkICpjb250ZXh0KQotewotCWFjcGlfc3RhdHVzIHN0YXR1czsKLQlzdHJ1Y3QgYWNwaV9idWZmZXIgYnVmZmVyOwotCXN0cnVjdCBhY3BpX3Jlc291cmNlICpyZXNvdXJjZTsKLQlzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAqcmVzb3VyY2VfZW5kOwotCi0JQUNQSV9GVU5DVElPTl9UUkFDRShhY3BpX3dhbGtfcmVzb3VyY2VzKTsKLQotCS8qIFBhcmFtZXRlciB2YWxpZGF0aW9uICovCi0KLQlpZiAoIWRldmljZV9oYW5kbGUgfHwgIXVzZXJfZnVuY3Rpb24gfHwgIW5hbWUgfHwKLQkgICAgKCFBQ1BJX0NPTVBBUkVfTkFNRShuYW1lLCBNRVRIT0RfTkFNRV9fQ1JTKSAmJgotCSAgICAgIUFDUElfQ09NUEFSRV9OQU1FKG5hbWUsIE1FVEhPRF9OQU1FX19QUlMpKSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX1BBUkFNRVRFUik7Ci0JfQotCi0JLyogR2V0IHRoZSBfQ1JTIG9yIF9QUlMgcmVzb3VyY2UgbGlzdCAqLwotCi0JYnVmZmVyLmxlbmd0aCA9IEFDUElfQUxMT0NBVEVfTE9DQUxfQlVGRkVSOwotCXN0YXR1cyA9IGFjcGlfcnNfZ2V0X21ldGhvZF9kYXRhKGRldmljZV9oYW5kbGUsIG5hbWUsICZidWZmZXIpOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLQl9Ci0KLQkvKiBCdWZmZXIgbm93IGNvbnRhaW5zIHRoZSByZXNvdXJjZSBsaXN0ICovCi0KLQlyZXNvdXJjZSA9IEFDUElfQ0FTVF9QVFIoc3RydWN0IGFjcGlfcmVzb3VyY2UsIGJ1ZmZlci5wb2ludGVyKTsKLQlyZXNvdXJjZV9lbmQgPQotCSAgICBBQ1BJX0FERF9QVFIoc3RydWN0IGFjcGlfcmVzb3VyY2UsIGJ1ZmZlci5wb2ludGVyLCBidWZmZXIubGVuZ3RoKTsKLQotCS8qIFdhbGsgdGhlIHJlc291cmNlIGxpc3QgdW50aWwgdGhlIGVuZF90YWcgaXMgZm91bmQgKG9yIGJ1ZmZlciBlbmQpICovCi0KLQl3aGlsZSAocmVzb3VyY2UgPCByZXNvdXJjZV9lbmQpIHsKLQotCQkvKiBTYW5pdHkgY2hlY2sgdGhlIHJlc291cmNlICovCi0KLQkJaWYgKHJlc291cmNlLT50eXBlID4gQUNQSV9SRVNPVVJDRV9UWVBFX01BWCkgewotCQkJc3RhdHVzID0gQUVfQU1MX0lOVkFMSURfUkVTT1VSQ0VfVFlQRTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJLyogSW52b2tlIHRoZSB1c2VyIGZ1bmN0aW9uLCBhYm9ydCBvbiBhbnkgZXJyb3IgcmV0dXJuZWQgKi8KLQotCQlzdGF0dXMgPSB1c2VyX2Z1bmN0aW9uKHJlc291cmNlLCBjb250ZXh0KTsKLQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCQlpZiAoc3RhdHVzID09IEFFX0NUUkxfVEVSTUlOQVRFKSB7Ci0KLQkJCQkvKiBUaGlzIGlzIGFuIE9LIHRlcm1pbmF0aW9uIGJ5IHRoZSB1c2VyIGZ1bmN0aW9uICovCi0KLQkJCQlzdGF0dXMgPSBBRV9PSzsKLQkJCX0KLQkJCWJyZWFrOwotCQl9Ci0KLQkJLyogZW5kX3RhZyBpbmRpY2F0ZXMgZW5kLW9mLWxpc3QgKi8KLQotCQlpZiAocmVzb3VyY2UtPnR5cGUgPT0gQUNQSV9SRVNPVVJDRV9UWVBFX0VORF9UQUcpIHsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJLyogR2V0IHRoZSBuZXh0IHJlc291cmNlIGRlc2NyaXB0b3IgKi8KLQotCQlyZXNvdXJjZSA9Ci0JCSAgICBBQ1BJX0FERF9QVFIoc3RydWN0IGFjcGlfcmVzb3VyY2UsIHJlc291cmNlLAotCQkJCSByZXNvdXJjZS0+bGVuZ3RoKTsKLQl9Ci0KLQlBQ1BJX0ZSRUUoYnVmZmVyLnBvaW50ZXIpOwotCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotfQotCi1BQ1BJX0VYUE9SVF9TWU1CT0woYWNwaV93YWxrX3Jlc291cmNlcykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9zYnNoYy5jIGIvZHJpdmVycy9hY3BpL3Nic2hjLmMKaW5kZXggZTUzZTU5MC4uMDYxOTczNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3Nic2hjLmMKKysrIGIvZHJpdmVycy9hY3BpL3Nic2hjLmMKQEAgLTEwLDcgKzEwLDYgQEAKIAogI2luY2x1ZGUgPGFjcGkvYWNwaV9idXMuaD4KICNpbmNsdWRlIDxhY3BpL2FjcGlfZHJpdmVycy5oPgotI2luY2x1ZGUgPGFjcGkvYWN0eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3NjYW4uYyBiL2RyaXZlcnMvYWNwaS9zY2FuLmMKaW5kZXggMzliNzIzMy4uYzU0ZDdiNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3NjYW4uYworKysgYi9kcml2ZXJzL2FjcGkvc2Nhbi5jCkBAIC0xMCw3ICsxMCw2IEBACiAjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgogCiAjaW5jbHVkZSA8YWNwaS9hY3BpX2RyaXZlcnMuaD4KLSNpbmNsdWRlIDxhY3BpL2FjaW50ZXJwLmg+CS8qIGZvciBhY3BpX2V4X2Vpc2FfaWRfdG9fc3RyaW5nKCkgKi8KIAogI2RlZmluZSBfQ09NUE9ORU5UCQlBQ1BJX0JVU19DT01QT05FTlQKIEFDUElfTU9EVUxFX05BTUUoInNjYW4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9zbGVlcC5jIGIvZHJpdmVycy9hY3BpL3NsZWVwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2UzYzYwOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvYWNwaS9zbGVlcC5jCkBAIC0wLDAgKzEsNzQ3IEBACisvKgorICogc2xlZXAuYyAtIEFDUEkgc2xlZXAgc3VwcG9ydC4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUgQWxleGV5IFN0YXJpa292c2tpeSA8YWxleGV5Lnkuc3Rhcmlrb3Zza2l5QGludGVsLmNvbT4KKyAqIENvcHlyaWdodCAoYykgMjAwNCBEYXZpZCBTaGFvaHVhIExpIDxzaGFvaHVhLmxpQGludGVsLmNvbT4KKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAzIFBhdHJpY2sgTW9jaGVsCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMgT3BlbiBTb3VyY2UgRGV2ZWxvcG1lbnQgTGFiCisgKgorICogVGhpcyBmaWxlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBHUEx2Mi4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvZG1pLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc3VzcGVuZC5oPgorI2luY2x1ZGUgPGxpbnV4L3JlYm9vdC5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKyNpbmNsdWRlIDxhY3BpL2FjcGlfYnVzLmg+CisjaW5jbHVkZSA8YWNwaS9hY3BpX2RyaXZlcnMuaD4KKyNpbmNsdWRlICJzbGVlcC5oIgorCit1OCBzbGVlcF9zdGF0ZXNbQUNQSV9TX1NUQVRFX0NPVU5UXTsKKworc3RhdGljIHZvaWQgYWNwaV9zbGVlcF90dHNfc3dpdGNoKHUzMiBhY3BpX3N0YXRlKQoreworCXVuaW9uIGFjcGlfb2JqZWN0IGluX2FyZyA9IHsgQUNQSV9UWVBFX0lOVEVHRVIgfTsKKwlzdHJ1Y3QgYWNwaV9vYmplY3RfbGlzdCBhcmdfbGlzdCA9IHsgMSwgJmluX2FyZyB9OworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOworCisJaW5fYXJnLmludGVnZXIudmFsdWUgPSBhY3BpX3N0YXRlOworCXN0YXR1cyA9IGFjcGlfZXZhbHVhdGVfb2JqZWN0KE5VTEwsICJcXF9UVFMiLCAmYXJnX2xpc3QsIE5VTEwpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSAmJiBzdGF0dXMgIT0gQUVfTk9UX0ZPVU5EKSB7CisJCS8qCisJCSAqIE9TIGNhbid0IGV2YWx1YXRlIHRoZSBfVFRTIG9iamVjdCBjb3JyZWN0bHkuIFNvbWUgd2FybmluZworCQkgKiBtZXNzYWdlIHdpbGwgYmUgcHJpbnRlZC4gQnV0IGl0IHdvbid0IGJyZWFrIGFueXRoaW5nLgorCQkgKi8KKwkJcHJpbnRrKEtFUk5fTk9USUNFICJGYWlsdXJlIGluIGV2YWx1YXRpbmcgX1RUUyBvYmplY3RcbiIpOworCX0KK30KKworc3RhdGljIGludCB0dHNfbm90aWZ5X3JlYm9vdChzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnRoaXMsCisJCQl1bnNpZ25lZCBsb25nIGNvZGUsIHZvaWQgKngpCit7CisJYWNwaV9zbGVlcF90dHNfc3dpdGNoKEFDUElfU1RBVEVfUzUpOworCXJldHVybiBOT1RJRllfRE9ORTsKK30KKworc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayB0dHNfbm90aWZpZXIgPSB7CisJLm5vdGlmaWVyX2NhbGwJPSB0dHNfbm90aWZ5X3JlYm9vdCwKKwkubmV4dAkJPSBOVUxMLAorCS5wcmlvcml0eQk9IDAsCit9OworCitzdGF0aWMgaW50IGFjcGlfc2xlZXBfcHJlcGFyZSh1MzIgYWNwaV9zdGF0ZSkKK3sKKyNpZmRlZiBDT05GSUdfQUNQSV9TTEVFUAorCS8qIGRvIHdlIGhhdmUgYSB3YWtldXAgYWRkcmVzcyBmb3IgUzIgYW5kIFMzPyAqLworCWlmIChhY3BpX3N0YXRlID09IEFDUElfU1RBVEVfUzMpIHsKKwkJaWYgKCFhY3BpX3dha2V1cF9hZGRyZXNzKSB7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCQlhY3BpX3NldF9maXJtd2FyZV93YWtpbmdfdmVjdG9yKAorCQkJCShhY3BpX3BoeXNpY2FsX2FkZHJlc3MpYWNwaV93YWtldXBfYWRkcmVzcyk7CisKKwl9CisJQUNQSV9GTFVTSF9DUFVfQ0FDSEUoKTsKKwlhY3BpX2VuYWJsZV93YWtldXBfZGV2aWNlX3ByZXAoYWNwaV9zdGF0ZSk7CisjZW5kaWYKKwlwcmludGsoS0VSTl9JTkZPIFBSRUZJWCAiUHJlcGFyaW5nIHRvIGVudGVyIHN5c3RlbSBzbGVlcCBzdGF0ZSBTJWRcbiIsCisJCWFjcGlfc3RhdGUpOworCWFjcGlfZW50ZXJfc2xlZXBfc3RhdGVfcHJlcChhY3BpX3N0YXRlKTsKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIENPTkZJR19BQ1BJX1NMRUVQCitzdGF0aWMgdTMyIGFjcGlfdGFyZ2V0X3NsZWVwX3N0YXRlID0gQUNQSV9TVEFURV9TMDsKKy8qCisgKiBBQ1BJIDEuMCB3YW50cyB1cyB0byBleGVjdXRlIF9QVFMgYmVmb3JlIHN1c3BlbmRpbmcgZGV2aWNlcywgc28gd2UgYWxsb3cgdGhlCisgKiB1c2VyIHRvIHJlcXVlc3QgdGhhdCBiZWhhdmlvciBieSB1c2luZyB0aGUgJ2FjcGlfb2xkX3N1c3BlbmRfb3JkZXJpbmcnCisgKiBrZXJuZWwgY29tbWFuZCBsaW5lIG9wdGlvbiB0aGF0IGNhdXNlcyB0aGUgZm9sbG93aW5nIHZhcmlhYmxlIHRvIGJlIHNldC4KKyAqLworc3RhdGljIGJvb2wgb2xkX3N1c3BlbmRfb3JkZXJpbmc7CisKK3ZvaWQgX19pbml0IGFjcGlfb2xkX3N1c3BlbmRfb3JkZXJpbmcodm9pZCkKK3sKKwlvbGRfc3VzcGVuZF9vcmRlcmluZyA9IHRydWU7Cit9CisKKy8qCisgKiBBY2NvcmRpbmcgdG8gdGhlIEFDUEkgc3BlY2lmaWNhdGlvbiB0aGUgQklPUyBzaG91bGQgbWFrZSBzdXJlIHRoYXQgQUNQSSBpcworICogZW5hYmxlZCBhbmQgU0NJX0VOIGJpdCBpcyBzZXQgb24gd2FrZS11cCBmcm9tIFMxIC0gUzMgc2xlZXAgc3RhdGVzLiAgU3RpbGwsCisgKiBzb21lIEJJT1NlcyBkb24ndCBkbyB0aGF0IGFuZCB0aGVyZWZvcmUgd2UgdXNlIGFjcGlfZW5hYmxlKCkgdG8gZW5hYmxlIEFDUEkKKyAqIG9uIHN1Y2ggc3lzdGVtcyBkdXJpbmcgcmVzdW1lLiAgVW5mb3J0dW5hdGVseSB0aGF0IGRvZXNuJ3QgaGVscCBpbgorICogcGFydGljdWxhcmx5IHBhdGhvbG9naWNhbCBjYXNlcyBpbiB3aGljaCBTQ0lfRU4gaGFzIHRvIGJlIHNldCBkaXJlY3RseSBvbgorICogcmVzdW1lLCBhbHRob3VnaCB0aGUgc3BlY2lmaWNhdGlvbiBzdGF0ZXMgdmVyeSBjbGVhcmx5IHRoYXQgdGhpcyBmbGFnIGlzCisgKiBvd25lZCBieSB0aGUgaGFyZHdhcmUuICBUaGUgc2V0X3NjaV9lbl9vbl9yZXN1bWUgdmFyaWFibGUgd2lsbCBiZSBzZXQgaW4gc3VjaAorICogY2FzZXMuCisgKi8KK3N0YXRpYyBib29sIHNldF9zY2lfZW5fb25fcmVzdW1lOworLyoKKyAqIFRoZSBBQ1BJIHNwZWNpZmljYXRpb24gd2FudHMgdXMgdG8gc2F2ZSBOVlMgbWVtb3J5IHJlZ2lvbnMgZHVyaW5nIGhpYmVybmF0aW9uCisgKiBhbmQgdG8gcmVzdG9yZSB0aGVtIGR1cmluZyB0aGUgc3Vic2VxdWVudCByZXN1bWUuICBIb3dldmVyLCBpdCBpcyBub3QgY2VydGFpbgorICogaWYgdGhpcyBtZWNoYW5pc20gaXMgZ29pbmcgdG8gd29yayBvbiBhbGwgbWFjaGluZXMsIHNvIHdlIGFsbG93IHRoZSB1c2VyIHRvCisgKiBkaXNhYmxlIHRoaXMgbWVjaGFuaXNtIHVzaW5nIHRoZSAnYWNwaV9zbGVlcD1zNF9ub252cycga2VybmVsIGNvbW1hbmQgbGluZQorICogb3B0aW9uLgorICovCitzdGF0aWMgYm9vbCBzNF9ub19udnM7CisKK3ZvaWQgX19pbml0IGFjcGlfczRfbm9fbnZzKHZvaWQpCit7CisJczRfbm9fbnZzID0gdHJ1ZTsKK30KKworLyoqCisgKglhY3BpX3BtX2Rpc2FibGVfZ3BlcyAtIERpc2FibGUgdGhlIEdQRXMuCisgKi8KK3N0YXRpYyBpbnQgYWNwaV9wbV9kaXNhYmxlX2dwZXModm9pZCkKK3sKKwlhY3BpX2Rpc2FibGVfYWxsX2dwZXMoKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKglfX2FjcGlfcG1fcHJlcGFyZSAtIFByZXBhcmUgdGhlIHBsYXRmb3JtIHRvIGVudGVyIHRoZSB0YXJnZXQgc3RhdGUuCisgKgorICoJSWYgbmVjZXNzYXJ5LCBzZXQgdGhlIGZpcm13YXJlIHdha2luZyB2ZWN0b3IgYW5kIGRvIGFyY2gtc3BlY2lmaWMKKyAqCW5hc3RpbmVzcyB0byBnZXQgdGhlIHdha2V1cCBjb2RlIHRvIHRoZSB3YWtpbmcgdmVjdG9yLgorICovCitzdGF0aWMgaW50IF9fYWNwaV9wbV9wcmVwYXJlKHZvaWQpCit7CisJaW50IGVycm9yID0gYWNwaV9zbGVlcF9wcmVwYXJlKGFjcGlfdGFyZ2V0X3NsZWVwX3N0YXRlKTsKKworCWlmIChlcnJvcikKKwkJYWNwaV90YXJnZXRfc2xlZXBfc3RhdGUgPSBBQ1BJX1NUQVRFX1MwOworCXJldHVybiBlcnJvcjsKK30KKworLyoqCisgKglhY3BpX3BtX3ByZXBhcmUgLSBQcmVwYXJlIHRoZSBwbGF0Zm9ybSB0byBlbnRlciB0aGUgdGFyZ2V0IHNsZWVwCisgKgkJc3RhdGUgYW5kIGRpc2FibGUgdGhlIEdQRXMuCisgKi8KK3N0YXRpYyBpbnQgYWNwaV9wbV9wcmVwYXJlKHZvaWQpCit7CisJaW50IGVycm9yID0gX19hY3BpX3BtX3ByZXBhcmUoKTsKKworCWlmICghZXJyb3IpCisJCWFjcGlfZGlzYWJsZV9hbGxfZ3BlcygpOworCXJldHVybiBlcnJvcjsKK30KKworLyoqCisgKglhY3BpX3BtX2ZpbmlzaCAtIEluc3RydWN0IHRoZSBwbGF0Zm9ybSB0byBsZWF2ZSBhIHNsZWVwIHN0YXRlLgorICoKKyAqCVRoaXMgaXMgY2FsbGVkIGFmdGVyIHdlIHdha2UgYmFjayB1cCAob3IgaWYgZW50ZXJpbmcgdGhlIHNsZWVwIHN0YXRlCisgKglmYWlsZWQpLgorICovCitzdGF0aWMgdm9pZCBhY3BpX3BtX2ZpbmlzaCh2b2lkKQoreworCXUzMiBhY3BpX3N0YXRlID0gYWNwaV90YXJnZXRfc2xlZXBfc3RhdGU7CisKKwlpZiAoYWNwaV9zdGF0ZSA9PSBBQ1BJX1NUQVRFX1MwKQorCQlyZXR1cm47CisKKwlwcmludGsoS0VSTl9JTkZPIFBSRUZJWCAiV2FraW5nIHVwIGZyb20gc3lzdGVtIHNsZWVwIHN0YXRlIFMlZFxuIiwKKwkJYWNwaV9zdGF0ZSk7CisJYWNwaV9kaXNhYmxlX3dha2V1cF9kZXZpY2UoYWNwaV9zdGF0ZSk7CisJYWNwaV9sZWF2ZV9zbGVlcF9zdGF0ZShhY3BpX3N0YXRlKTsKKworCS8qIHJlc2V0IGZpcm13YXJlIHdha2luZyB2ZWN0b3IgKi8KKwlhY3BpX3NldF9maXJtd2FyZV93YWtpbmdfdmVjdG9yKChhY3BpX3BoeXNpY2FsX2FkZHJlc3MpIDApOworCisJYWNwaV90YXJnZXRfc2xlZXBfc3RhdGUgPSBBQ1BJX1NUQVRFX1MwOworfQorCisvKioKKyAqCWFjcGlfcG1fZW5kIC0gRmluaXNoIHVwIHN1c3BlbmQgc2VxdWVuY2UuCisgKi8KK3N0YXRpYyB2b2lkIGFjcGlfcG1fZW5kKHZvaWQpCit7CisJLyoKKwkgKiBUaGlzIGlzIG5lY2Vzc2FyeSBpbiBjYXNlIGFjcGlfcG1fZmluaXNoKCkgaXMgbm90IGNhbGxlZCBkdXJpbmcgYQorCSAqIGZhaWxpbmcgdHJhbnNpdGlvbiB0byBhIHNsZWVwIHN0YXRlLgorCSAqLworCWFjcGlfdGFyZ2V0X3NsZWVwX3N0YXRlID0gQUNQSV9TVEFURV9TMDsKKwlhY3BpX3NsZWVwX3R0c19zd2l0Y2goYWNwaV90YXJnZXRfc2xlZXBfc3RhdGUpOworfQorI2Vsc2UgLyogIUNPTkZJR19BQ1BJX1NMRUVQICovCisjZGVmaW5lIGFjcGlfdGFyZ2V0X3NsZWVwX3N0YXRlCUFDUElfU1RBVEVfUzAKKyNlbmRpZiAvKiBDT05GSUdfQUNQSV9TTEVFUCAqLworCisjaWZkZWYgQ09ORklHX1NVU1BFTkQKK2V4dGVybiB2b2lkIGRvX3N1c3BlbmRfbG93bGV2ZWwodm9pZCk7CisKK3N0YXRpYyB1MzIgYWNwaV9zdXNwZW5kX3N0YXRlc1tdID0geworCVtQTV9TVVNQRU5EX09OXSA9IEFDUElfU1RBVEVfUzAsCisJW1BNX1NVU1BFTkRfU1RBTkRCWV0gPSBBQ1BJX1NUQVRFX1MxLAorCVtQTV9TVVNQRU5EX01FTV0gPSBBQ1BJX1NUQVRFX1MzLAorCVtQTV9TVVNQRU5EX01BWF0gPSBBQ1BJX1NUQVRFX1M1Cit9OworCisvKioKKyAqCWFjcGlfc3VzcGVuZF9iZWdpbiAtIFNldCB0aGUgdGFyZ2V0IHN5c3RlbSBzbGVlcCBzdGF0ZSB0byB0aGUgc3RhdGUKKyAqCQlhc3NvY2lhdGVkIHdpdGggZ2l2ZW4gQHBtX3N0YXRlLCBpZiBzdXBwb3J0ZWQuCisgKi8KK3N0YXRpYyBpbnQgYWNwaV9zdXNwZW5kX2JlZ2luKHN1c3BlbmRfc3RhdGVfdCBwbV9zdGF0ZSkKK3sKKwl1MzIgYWNwaV9zdGF0ZSA9IGFjcGlfc3VzcGVuZF9zdGF0ZXNbcG1fc3RhdGVdOworCWludCBlcnJvciA9IDA7CisKKwlpZiAoc2xlZXBfc3RhdGVzW2FjcGlfc3RhdGVdKSB7CisJCWFjcGlfdGFyZ2V0X3NsZWVwX3N0YXRlID0gYWNwaV9zdGF0ZTsKKwkJYWNwaV9zbGVlcF90dHNfc3dpdGNoKGFjcGlfdGFyZ2V0X3NsZWVwX3N0YXRlKTsKKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9FUlIgIkFDUEkgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIHN0YXRlOiAlZFxuIiwKKwkJCXBtX3N0YXRlKTsKKwkJZXJyb3IgPSAtRU5PU1lTOworCX0KKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qKgorICoJYWNwaV9zdXNwZW5kX2VudGVyIC0gQWN0dWFsbHkgZW50ZXIgYSBzbGVlcCBzdGF0ZS4KKyAqCUBwbV9zdGF0ZTogaWdub3JlZAorICoKKyAqCUZsdXNoIGNhY2hlcyBhbmQgZ28gdG8gc2xlZXAuIEZvciBTVFIgd2UgaGF2ZSB0byBjYWxsIGFyY2gtc3BlY2lmaWMKKyAqCWFzc2VtYmx5LCB3aGljaCBpbiB0dXJuIGNhbGwgYWNwaV9lbnRlcl9zbGVlcF9zdGF0ZSgpLgorICoJSXQncyB1bmZvcnR1bmF0ZSwgYnV0IGl0IHdvcmtzLiBQbGVhc2UgZml4IGlmIHlvdSdyZSBmZWVsaW5nIGZyaXNreS4KKyAqLworc3RhdGljIGludCBhY3BpX3N1c3BlbmRfZW50ZXIoc3VzcGVuZF9zdGF0ZV90IHBtX3N0YXRlKQoreworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOworCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAwOworCXUzMiBhY3BpX3N0YXRlID0gYWNwaV90YXJnZXRfc2xlZXBfc3RhdGU7CisKKwlBQ1BJX0ZMVVNIX0NQVV9DQUNIRSgpOworCisJLyogRG8gYXJjaCBzcGVjaWZpYyBzYXZpbmcgb2Ygc3RhdGUuICovCisJaWYgKGFjcGlfc3RhdGUgPT0gQUNQSV9TVEFURV9TMykgeworCQlpbnQgZXJyb3IgPSBhY3BpX3NhdmVfc3RhdGVfbWVtKCk7CisKKwkJaWYgKGVycm9yKQorCQkJcmV0dXJuIGVycm9yOworCX0KKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwlhY3BpX2VuYWJsZV93YWtldXBfZGV2aWNlKGFjcGlfc3RhdGUpOworCXN3aXRjaCAoYWNwaV9zdGF0ZSkgeworCWNhc2UgQUNQSV9TVEFURV9TMToKKwkJYmFycmllcigpOworCQlzdGF0dXMgPSBhY3BpX2VudGVyX3NsZWVwX3N0YXRlKGFjcGlfc3RhdGUpOworCQlicmVhazsKKworCWNhc2UgQUNQSV9TVEFURV9TMzoKKwkJZG9fc3VzcGVuZF9sb3dsZXZlbCgpOworCQlicmVhazsKKwl9CisKKwkvKiBJZiBBQ1BJIGlzIG5vdCBlbmFibGVkIGJ5IHRoZSBCSU9TLCB3ZSBuZWVkIHRvIGVuYWJsZSBpdCBoZXJlLiAqLworCWlmIChzZXRfc2NpX2VuX29uX3Jlc3VtZSkKKwkJYWNwaV9zZXRfcmVnaXN0ZXIoQUNQSV9CSVRSRUdfU0NJX0VOQUJMRSwgMSk7CisJZWxzZQorCQlhY3BpX2VuYWJsZSgpOworCisJLyogUmVwcm9ncmFtIGNvbnRyb2wgcmVnaXN0ZXJzIGFuZCBleGVjdXRlIF9CRlMgKi8KKwlhY3BpX2xlYXZlX3NsZWVwX3N0YXRlX3ByZXAoYWNwaV9zdGF0ZSk7CisKKwkvKiBBQ1BJIDMuMCBzcGVjcyAoUDYyKSBzYXlzIHRoYXQgaXQncyB0aGUgcmVzcG9uc2liaWxpdHkKKwkgKiBvZiB0aGUgT1NQTSB0byBjbGVhciB0aGUgc3RhdHVzIGJpdCBbIGltcGx5aW5nIHRoYXQgdGhlCisJICogUE9XRVJfQlVUVE9OIGV2ZW50IHNob3VsZCBub3QgcmVhY2ggdXNlcnNwYWNlIF0KKwkgKi8KKwlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykgJiYgKGFjcGlfc3RhdGUgPT0gQUNQSV9TVEFURV9TMykpCisJCWFjcGlfY2xlYXJfZXZlbnQoQUNQSV9FVkVOVF9QT1dFUl9CVVRUT04pOworCisJLyoKKwkgKiBEaXNhYmxlIGFuZCBjbGVhciBHUEUgc3RhdHVzIGJlZm9yZSBpbnRlcnJ1cHQgaXMgZW5hYmxlZC4gU29tZSBHUEVzCisJICogKGxpa2Ugd2FrZXVwIEdQRSkgaGF2ZW4ndCBoYW5kbGVyLCB0aGlzIGNhbiBhdm9pZCBzdWNoIEdQRSBtaXNmaXJlLgorCSAqIGFjcGlfbGVhdmVfc2xlZXBfc3RhdGUgd2lsbCByZWVuYWJsZSBzcGVjaWZpYyBHUEVzIGxhdGVyCisJICovCisJYWNwaV9kaXNhYmxlX2FsbF9ncGVzKCk7CisKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJcHJpbnRrKEtFUk5fREVCVUcgIkJhY2sgdG8gQyFcbiIpOworCisJLyogcmVzdG9yZSBwcm9jZXNzb3Igc3RhdGUgKi8KKwlpZiAoYWNwaV9zdGF0ZSA9PSBBQ1BJX1NUQVRFX1MzKQorCQlhY3BpX3Jlc3RvcmVfc3RhdGVfbWVtKCk7CisKKwlyZXR1cm4gQUNQSV9TVUNDRVNTKHN0YXR1cykgPyAwIDogLUVGQVVMVDsKK30KKworc3RhdGljIGludCBhY3BpX3N1c3BlbmRfc3RhdGVfdmFsaWQoc3VzcGVuZF9zdGF0ZV90IHBtX3N0YXRlKQoreworCXUzMiBhY3BpX3N0YXRlOworCisJc3dpdGNoIChwbV9zdGF0ZSkgeworCWNhc2UgUE1fU1VTUEVORF9PTjoKKwljYXNlIFBNX1NVU1BFTkRfU1RBTkRCWToKKwljYXNlIFBNX1NVU1BFTkRfTUVNOgorCQlhY3BpX3N0YXRlID0gYWNwaV9zdXNwZW5kX3N0YXRlc1twbV9zdGF0ZV07CisKKwkJcmV0dXJuIHNsZWVwX3N0YXRlc1thY3BpX3N0YXRlXTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gMDsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fc3VzcGVuZF9vcHMgYWNwaV9zdXNwZW5kX29wcyA9IHsKKwkudmFsaWQgPSBhY3BpX3N1c3BlbmRfc3RhdGVfdmFsaWQsCisJLmJlZ2luID0gYWNwaV9zdXNwZW5kX2JlZ2luLAorCS5wcmVwYXJlID0gYWNwaV9wbV9wcmVwYXJlLAorCS5lbnRlciA9IGFjcGlfc3VzcGVuZF9lbnRlciwKKwkuZmluaXNoID0gYWNwaV9wbV9maW5pc2gsCisJLmVuZCA9IGFjcGlfcG1fZW5kLAorfTsKKworLyoqCisgKglhY3BpX3N1c3BlbmRfYmVnaW5fb2xkIC0gU2V0IHRoZSB0YXJnZXQgc3lzdGVtIHNsZWVwIHN0YXRlIHRvIHRoZQorICoJCXN0YXRlIGFzc29jaWF0ZWQgd2l0aCBnaXZlbiBAcG1fc3RhdGUsIGlmIHN1cHBvcnRlZCwgYW5kCisgKgkJZXhlY3V0ZSB0aGUgX1BUUyBjb250cm9sIG1ldGhvZC4gIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBpZiB0aGUKKyAqCQlwcmUtQUNQSSAyLjAgc3VzcGVuZCBvcmRlcmluZyBoYXMgYmVlbiByZXF1ZXN0ZWQuCisgKi8KK3N0YXRpYyBpbnQgYWNwaV9zdXNwZW5kX2JlZ2luX29sZChzdXNwZW5kX3N0YXRlX3QgcG1fc3RhdGUpCit7CisJaW50IGVycm9yID0gYWNwaV9zdXNwZW5kX2JlZ2luKHBtX3N0YXRlKTsKKworCWlmICghZXJyb3IpCisJCWVycm9yID0gX19hY3BpX3BtX3ByZXBhcmUoKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qCisgKiBUaGUgZm9sbG93aW5nIGNhbGxiYWNrcyBhcmUgdXNlZCBpZiB0aGUgcHJlLUFDUEkgMi4wIHN1c3BlbmQgb3JkZXJpbmcgaGFzCisgKiBiZWVuIHJlcXVlc3RlZC4KKyAqLworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9zdXNwZW5kX29wcyBhY3BpX3N1c3BlbmRfb3BzX29sZCA9IHsKKwkudmFsaWQgPSBhY3BpX3N1c3BlbmRfc3RhdGVfdmFsaWQsCisJLmJlZ2luID0gYWNwaV9zdXNwZW5kX2JlZ2luX29sZCwKKwkucHJlcGFyZSA9IGFjcGlfcG1fZGlzYWJsZV9ncGVzLAorCS5lbnRlciA9IGFjcGlfc3VzcGVuZF9lbnRlciwKKwkuZmluaXNoID0gYWNwaV9wbV9maW5pc2gsCisJLmVuZCA9IGFjcGlfcG1fZW5kLAorCS5yZWNvdmVyID0gYWNwaV9wbV9maW5pc2gsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpbml0X29sZF9zdXNwZW5kX29yZGVyaW5nKGNvbnN0IHN0cnVjdCBkbWlfc3lzdGVtX2lkICpkKQoreworCW9sZF9zdXNwZW5kX29yZGVyaW5nID0gdHJ1ZTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2luaXQgaW5pdF9zZXRfc2NpX2VuX29uX3Jlc3VtZShjb25zdCBzdHJ1Y3QgZG1pX3N5c3RlbV9pZCAqZCkKK3sKKwlzZXRfc2NpX2VuX29uX3Jlc3VtZSA9IHRydWU7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZG1pX3N5c3RlbV9pZCBfX2luaXRkYXRhIGFjcGlzbGVlcF9kbWlfdGFibGVbXSA9IHsKKwl7CisJLmNhbGxiYWNrID0gaW5pdF9vbGRfc3VzcGVuZF9vcmRlcmluZywKKwkuaWRlbnQgPSAiQWJpdCBLTjkgKG5Gb3JjZTQgdmFyaWFudCkiLAorCS5tYXRjaGVzID0geworCQlETUlfTUFUQ0goRE1JX0JPQVJEX1ZFTkRPUiwgImh0dHA6Ly93d3cuYWJpdC5jb20udHcvIiksCisJCURNSV9NQVRDSChETUlfQk9BUkRfTkFNRSwgIktOOSBTZXJpZXMoTkYtQ0s4MDQpIiksCisJCX0sCisJfSwKKwl7CisJLmNhbGxiYWNrID0gaW5pdF9vbGRfc3VzcGVuZF9vcmRlcmluZywKKwkuaWRlbnQgPSAiSFAgeHc0NjAwIFdvcmtzdGF0aW9uIiwKKwkubWF0Y2hlcyA9IHsKKwkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiSGV3bGV0dC1QYWNrYXJkIiksCisJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiSFAgeHc0NjAwIFdvcmtzdGF0aW9uIiksCisJCX0sCisJfSwKKwl7CisJLmNhbGxiYWNrID0gaW5pdF9zZXRfc2NpX2VuX29uX3Jlc3VtZSwKKwkuaWRlbnQgPSAiQXBwbGUgTWFjQm9vayAxLDEiLAorCS5tYXRjaGVzID0geworCQlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJBcHBsZSBDb21wdXRlciwgSW5jLiIpLAorCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIk1hY0Jvb2sxLDEiKSwKKwkJfSwKKwl9LAorCXsKKwkuY2FsbGJhY2sgPSBpbml0X3NldF9zY2lfZW5fb25fcmVzdW1lLAorCS5pZGVudCA9ICJBcHBsZSBNYWNNaW5pIDEsMSIsCisJLm1hdGNoZXMgPSB7CisJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkFwcGxlIENvbXB1dGVyLCBJbmMuIiksCisJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiTWFjbWluaTEsMSIpLAorCQl9LAorCX0sCisJe30sCit9OworI2VuZGlmIC8qIENPTkZJR19TVVNQRU5EICovCisKKyNpZmRlZiBDT05GSUdfSElCRVJOQVRJT04KK3N0YXRpYyB1bnNpZ25lZCBsb25nIHM0X2hhcmR3YXJlX3NpZ25hdHVyZTsKK3N0YXRpYyBzdHJ1Y3QgYWNwaV90YWJsZV9mYWNzICpmYWNzOworc3RhdGljIGJvb2wgbm9zaWdjaGVjazsKKwordm9pZCBfX2luaXQgYWNwaV9ub19zNF9od19zaWduYXR1cmUodm9pZCkKK3sKKwlub3NpZ2NoZWNrID0gdHJ1ZTsKK30KKworc3RhdGljIGludCBhY3BpX2hpYmVybmF0aW9uX2JlZ2luKHZvaWQpCit7CisJaW50IGVycm9yOworCisJZXJyb3IgPSBzNF9ub19udnMgPyAwIDogaGliZXJuYXRlX252c19hbGxvYygpOworCWlmICghZXJyb3IpIHsKKwkJYWNwaV90YXJnZXRfc2xlZXBfc3RhdGUgPSBBQ1BJX1NUQVRFX1M0OworCQlhY3BpX3NsZWVwX3R0c19zd2l0Y2goYWNwaV90YXJnZXRfc2xlZXBfc3RhdGUpOworCX0KKworCXJldHVybiBlcnJvcjsKK30KKworc3RhdGljIGludCBhY3BpX2hpYmVybmF0aW9uX3ByZV9zbmFwc2hvdCh2b2lkKQoreworCWludCBlcnJvciA9IGFjcGlfcG1fcHJlcGFyZSgpOworCisJaWYgKCFlcnJvcikKKwkJaGliZXJuYXRlX252c19zYXZlKCk7CisKKwlyZXR1cm4gZXJyb3I7Cit9CisKK3N0YXRpYyBpbnQgYWNwaV9oaWJlcm5hdGlvbl9lbnRlcih2b2lkKQoreworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOworCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAwOworCisJQUNQSV9GTFVTSF9DUFVfQ0FDSEUoKTsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwlhY3BpX2VuYWJsZV93YWtldXBfZGV2aWNlKEFDUElfU1RBVEVfUzQpOworCS8qIFRoaXMgc2hvdWxkbid0IHJldHVybi4gIElmIGl0IHJldHVybnMsIHdlIGhhdmUgYSBwcm9ibGVtICovCisJc3RhdHVzID0gYWNwaV9lbnRlcl9zbGVlcF9zdGF0ZShBQ1BJX1NUQVRFX1M0KTsKKwkvKiBSZXByb2dyYW0gY29udHJvbCByZWdpc3RlcnMgYW5kIGV4ZWN1dGUgX0JGUyAqLworCWFjcGlfbGVhdmVfc2xlZXBfc3RhdGVfcHJlcChBQ1BJX1NUQVRFX1M0KTsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisKKwlyZXR1cm4gQUNQSV9TVUNDRVNTKHN0YXR1cykgPyAwIDogLUVGQVVMVDsKK30KKworc3RhdGljIHZvaWQgYWNwaV9oaWJlcm5hdGlvbl9maW5pc2godm9pZCkKK3sKKwloaWJlcm5hdGVfbnZzX2ZyZWUoKTsKKwlhY3BpX3BtX2ZpbmlzaCgpOworfQorCitzdGF0aWMgdm9pZCBhY3BpX2hpYmVybmF0aW9uX2xlYXZlKHZvaWQpCit7CisJLyoKKwkgKiBJZiBBQ1BJIGlzIG5vdCBlbmFibGVkIGJ5IHRoZSBCSU9TIGFuZCB0aGUgYm9vdCBrZXJuZWwsIHdlIG5lZWQgdG8KKwkgKiBlbmFibGUgaXQgaGVyZS4KKwkgKi8KKwlhY3BpX2VuYWJsZSgpOworCS8qIFJlcHJvZ3JhbSBjb250cm9sIHJlZ2lzdGVycyBhbmQgZXhlY3V0ZSBfQkZTICovCisJYWNwaV9sZWF2ZV9zbGVlcF9zdGF0ZV9wcmVwKEFDUElfU1RBVEVfUzQpOworCS8qIENoZWNrIHRoZSBoYXJkd2FyZSBzaWduYXR1cmUgKi8KKwlpZiAoZmFjcyAmJiBzNF9oYXJkd2FyZV9zaWduYXR1cmUgIT0gZmFjcy0+aGFyZHdhcmVfc2lnbmF0dXJlKSB7CisJCXByaW50ayhLRVJOX0VNRVJHICJBQ1BJOiBIYXJkd2FyZSBjaGFuZ2VkIHdoaWxlIGhpYmVybmF0ZWQsICIKKwkJCSJjYW5ub3QgcmVzdW1lIVxuIik7CisJCXBhbmljKCJBQ1BJIFM0IGhhcmR3YXJlIHNpZ25hdHVyZSBtaXNtYXRjaCIpOworCX0KKwkvKiBSZXN0b3JlIHRoZSBOVlMgbWVtb3J5IGFyZWEgKi8KKwloaWJlcm5hdGVfbnZzX3Jlc3RvcmUoKTsKK30KKworc3RhdGljIHZvaWQgYWNwaV9wbV9lbmFibGVfZ3Blcyh2b2lkKQoreworCWFjcGlfZW5hYmxlX2FsbF9ydW50aW1lX2dwZXMoKTsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9oaWJlcm5hdGlvbl9vcHMgYWNwaV9oaWJlcm5hdGlvbl9vcHMgPSB7CisJLmJlZ2luID0gYWNwaV9oaWJlcm5hdGlvbl9iZWdpbiwKKwkuZW5kID0gYWNwaV9wbV9lbmQsCisJLnByZV9zbmFwc2hvdCA9IGFjcGlfaGliZXJuYXRpb25fcHJlX3NuYXBzaG90LAorCS5maW5pc2ggPSBhY3BpX2hpYmVybmF0aW9uX2ZpbmlzaCwKKwkucHJlcGFyZSA9IGFjcGlfcG1fcHJlcGFyZSwKKwkuZW50ZXIgPSBhY3BpX2hpYmVybmF0aW9uX2VudGVyLAorCS5sZWF2ZSA9IGFjcGlfaGliZXJuYXRpb25fbGVhdmUsCisJLnByZV9yZXN0b3JlID0gYWNwaV9wbV9kaXNhYmxlX2dwZXMsCisJLnJlc3RvcmVfY2xlYW51cCA9IGFjcGlfcG1fZW5hYmxlX2dwZXMsCit9OworCisvKioKKyAqCWFjcGlfaGliZXJuYXRpb25fYmVnaW5fb2xkIC0gU2V0IHRoZSB0YXJnZXQgc3lzdGVtIHNsZWVwIHN0YXRlIHRvCisgKgkJQUNQSV9TVEFURV9TNCBhbmQgZXhlY3V0ZSB0aGUgX1BUUyBjb250cm9sIG1ldGhvZC4gIFRoaXMKKyAqCQlmdW5jdGlvbiBpcyB1c2VkIGlmIHRoZSBwcmUtQUNQSSAyLjAgc3VzcGVuZCBvcmRlcmluZyBoYXMgYmVlbgorICoJCXJlcXVlc3RlZC4KKyAqLworc3RhdGljIGludCBhY3BpX2hpYmVybmF0aW9uX2JlZ2luX29sZCh2b2lkKQoreworCWludCBlcnJvcjsKKwkvKgorCSAqIFRoZSBfVFRTIG9iamVjdCBzaG91bGQgYWx3YXlzIGJlIGV2YWx1YXRlZCBiZWZvcmUgdGhlIF9QVFMgb2JqZWN0LgorCSAqIFdoZW4gdGhlIG9sZF9zdXNwZW5kZWRfb3JkZXJpbmcgaXMgdHJ1ZSwgdGhlIF9QVFMgb2JqZWN0IGlzCisJICogZXZhbHVhdGVkIGluIHRoZSBhY3BpX3NsZWVwX3ByZXBhcmUuCisJICovCisJYWNwaV9zbGVlcF90dHNfc3dpdGNoKEFDUElfU1RBVEVfUzQpOworCisJZXJyb3IgPSBhY3BpX3NsZWVwX3ByZXBhcmUoQUNQSV9TVEFURV9TNCk7CisKKwlpZiAoIWVycm9yKSB7CisJCWlmICghczRfbm9fbnZzKQorCQkJZXJyb3IgPSBoaWJlcm5hdGVfbnZzX2FsbG9jKCk7CisJCWlmICghZXJyb3IpCisJCQlhY3BpX3RhcmdldF9zbGVlcF9zdGF0ZSA9IEFDUElfU1RBVEVfUzQ7CisJfQorCXJldHVybiBlcnJvcjsKK30KKworc3RhdGljIGludCBhY3BpX2hpYmVybmF0aW9uX3ByZV9zbmFwc2hvdF9vbGQodm9pZCkKK3sKKwlpbnQgZXJyb3IgPSBhY3BpX3BtX2Rpc2FibGVfZ3BlcygpOworCisJaWYgKCFlcnJvcikKKwkJaGliZXJuYXRlX252c19zYXZlKCk7CisKKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qCisgKiBUaGUgZm9sbG93aW5nIGNhbGxiYWNrcyBhcmUgdXNlZCBpZiB0aGUgcHJlLUFDUEkgMi4wIHN1c3BlbmQgb3JkZXJpbmcgaGFzCisgKiBiZWVuIHJlcXVlc3RlZC4KKyAqLworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9oaWJlcm5hdGlvbl9vcHMgYWNwaV9oaWJlcm5hdGlvbl9vcHNfb2xkID0geworCS5iZWdpbiA9IGFjcGlfaGliZXJuYXRpb25fYmVnaW5fb2xkLAorCS5lbmQgPSBhY3BpX3BtX2VuZCwKKwkucHJlX3NuYXBzaG90ID0gYWNwaV9oaWJlcm5hdGlvbl9wcmVfc25hcHNob3Rfb2xkLAorCS5maW5pc2ggPSBhY3BpX2hpYmVybmF0aW9uX2ZpbmlzaCwKKwkucHJlcGFyZSA9IGFjcGlfcG1fZGlzYWJsZV9ncGVzLAorCS5lbnRlciA9IGFjcGlfaGliZXJuYXRpb25fZW50ZXIsCisJLmxlYXZlID0gYWNwaV9oaWJlcm5hdGlvbl9sZWF2ZSwKKwkucHJlX3Jlc3RvcmUgPSBhY3BpX3BtX2Rpc2FibGVfZ3BlcywKKwkucmVzdG9yZV9jbGVhbnVwID0gYWNwaV9wbV9lbmFibGVfZ3BlcywKKwkucmVjb3ZlciA9IGFjcGlfcG1fZmluaXNoLAorfTsKKyNlbmRpZiAvKiBDT05GSUdfSElCRVJOQVRJT04gKi8KKworaW50IGFjcGlfc3VzcGVuZCh1MzIgYWNwaV9zdGF0ZSkKK3sKKwlzdXNwZW5kX3N0YXRlX3Qgc3RhdGVzW10gPSB7CisJCVsxXSA9IFBNX1NVU1BFTkRfU1RBTkRCWSwKKwkJWzNdID0gUE1fU1VTUEVORF9NRU0sCisJCVs1XSA9IFBNX1NVU1BFTkRfTUFYCisJfTsKKworCWlmIChhY3BpX3N0YXRlIDwgNiAmJiBzdGF0ZXNbYWNwaV9zdGF0ZV0pCisJCXJldHVybiBwbV9zdXNwZW5kKHN0YXRlc1thY3BpX3N0YXRlXSk7CisJaWYgKGFjcGlfc3RhdGUgPT0gNCkKKwkJcmV0dXJuIGhpYmVybmF0ZSgpOworCXJldHVybiAtRUlOVkFMOworfQorCisjaWZkZWYgQ09ORklHX1BNX1NMRUVQCisvKioKKyAqCWFjcGlfcG1fZGV2aWNlX3NsZWVwX3N0YXRlIC0gcmV0dXJuIHByZWZlcnJlZCBwb3dlciBzdGF0ZSBvZiBBQ1BJIGRldmljZQorICoJCWluIHRoZSBzeXN0ZW0gc2xlZXAgc3RhdGUgZ2l2ZW4gYnkgJWFjcGlfdGFyZ2V0X3NsZWVwX3N0YXRlCisgKglAZGV2OiBkZXZpY2UgdG8gZXhhbWluZTsgaXRzIGRyaXZlciBtb2RlbCB3YWtldXAgZmxhZ3MgY29udHJvbAorICoJCXdoZXRoZXIgaXQgc2hvdWxkIGJlIGFibGUgdG8gd2FrZSB1cCB0aGUgc3lzdGVtCisgKglAZF9taW5fcDogdXNlZCB0byBzdG9yZSB0aGUgdXBwZXIgbGltaXQgb2YgYWxsb3dlZCBzdGF0ZXMgcmFuZ2UKKyAqCVJldHVybiB2YWx1ZTogcHJlZmVycmVkIHBvd2VyIHN0YXRlIG9mIHRoZSBkZXZpY2Ugb24gc3VjY2VzcywgLUVOT0RFViBvbgorICoJCWZhaWx1cmUgKGllLiBpZiB0aGVyZSdzIG5vICdzdHJ1Y3QgYWNwaV9kZXZpY2UnIGZvciBAZGV2KQorICoKKyAqCUZpbmQgdGhlIGxvd2VzdCBwb3dlciAoaGlnaGVzdCBudW1iZXIpIEFDUEkgZGV2aWNlIHBvd2VyIHN0YXRlIHRoYXQKKyAqCWRldmljZSBAZGV2IGNhbiBiZSBpbiB3aGlsZSB0aGUgc3lzdGVtIGlzIGluIHRoZSBzbGVlcCBzdGF0ZSByZXByZXNlbnRlZAorICoJYnkgJWFjcGlfdGFyZ2V0X3NsZWVwX3N0YXRlLiAgSWYgQHdha2UgaXMgbm9uemVybywgdGhlIGRldmljZSBzaG91bGQgYmUKKyAqCWFibGUgdG8gd2FrZSB1cCB0aGUgc3lzdGVtIGZyb20gdGhpcyBzbGVlcCBzdGF0ZS4gIElmIEBkX21pbl9wIGlzIHNldCwKKyAqCXRoZSBoaWdoZXN0IHBvd2VyIChsb3dlc3QgbnVtYmVyKSBkZXZpY2UgcG93ZXIgc3RhdGUgb2YgQGRldiBhbGxvd2VkCisgKglpbiB0aGlzIHN5c3RlbSBzbGVlcCBzdGF0ZSBpcyBzdG9yZWQgYXQgdGhlIGxvY2F0aW9uIHBvaW50ZWQgdG8gYnkgaXQuCisgKgorICoJVGhlIGNhbGxlciBtdXN0IGVuc3VyZSB0aGF0IEBkZXYgaXMgdmFsaWQgYmVmb3JlIHVzaW5nIHRoaXMgZnVuY3Rpb24uCisgKglUaGUgY2FsbGVyIGlzIGFsc28gcmVzcG9uc2libGUgZm9yIGZpZ3VyaW5nIG91dCBpZiB0aGUgZGV2aWNlIGlzCisgKglzdXBwb3NlZCB0byBiZSBhYmxlIHRvIHdha2UgdXAgdGhlIHN5c3RlbSBhbmQgcGFzc2luZyB0aGlzIGluZm9ybWF0aW9uCisgKgl2aWEgQHdha2UuCisgKi8KKworaW50IGFjcGlfcG1fZGV2aWNlX3NsZWVwX3N0YXRlKHN0cnVjdCBkZXZpY2UgKmRldiwgaW50ICpkX21pbl9wKQoreworCWFjcGlfaGFuZGxlIGhhbmRsZSA9IERFVklDRV9BQ1BJX0hBTkRMRShkZXYpOworCXN0cnVjdCBhY3BpX2RldmljZSAqYWRldjsKKwljaGFyIGFjcGlfbWV0aG9kW10gPSAiX1N4RCI7CisJdW5zaWduZWQgbG9uZyBsb25nIGRfbWluLCBkX21heDsKKworCWlmICghaGFuZGxlIHx8IEFDUElfRkFJTFVSRShhY3BpX2J1c19nZXRfZGV2aWNlKGhhbmRsZSwgJmFkZXYpKSkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiQUNQSSBoYW5kbGUgaGFzIG5vIGNvbnRleHQhXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJYWNwaV9tZXRob2RbMl0gPSAnMCcgKyBhY3BpX3RhcmdldF9zbGVlcF9zdGF0ZTsKKwkvKgorCSAqIElmIHRoZSBzbGVlcCBzdGF0ZSBpcyBTMCwgd2Ugd2lsbCByZXR1cm4gRDMsIGJ1dCBpZiB0aGUgZGV2aWNlIGhhcworCSAqIF9TMFcsIHdlIHdpbGwgdXNlIHRoZSB2YWx1ZSBmcm9tIF9TMFcKKwkgKi8KKwlkX21pbiA9IEFDUElfU1RBVEVfRDA7CisJZF9tYXggPSBBQ1BJX1NUQVRFX0QzOworCisJLyoKKwkgKiBJZiBwcmVzZW50LCBfU3hEIG1ldGhvZHMgcmV0dXJuIHRoZSBtaW5pbXVtIEQtc3RhdGUgKGhpZ2hlc3QgcG93ZXIKKwkgKiBzdGF0ZSkgd2UgY2FuIHVzZSBmb3IgdGhlIGNvcnJlc3BvbmRpbmcgUy1zdGF0ZXMuICBPdGhlcndpc2UsIHRoZQorCSAqIG1pbmltdW0gRC1zdGF0ZSBpcyBEMCAoQUNQSSAzLngpLgorCSAqCisJICogTk9URTogV2UgcmVseSBvbiBhY3BpX2V2YWx1YXRlX2ludGVnZXIoKSBub3QgY2xvYmJlcmluZyB0aGUgaW50ZWdlcgorCSAqIHByb3ZpZGVkIC0tIHRoYXQncyBvdXIgZmF1bHQgcmVjb3ZlcnksIHdlIGlnbm9yZSByZXR2YWwuCisJICovCisJaWYgKGFjcGlfdGFyZ2V0X3NsZWVwX3N0YXRlID4gQUNQSV9TVEFURV9TMCkKKwkJYWNwaV9ldmFsdWF0ZV9pbnRlZ2VyKGhhbmRsZSwgYWNwaV9tZXRob2QsIE5VTEwsICZkX21pbik7CisKKwkvKgorCSAqIElmIF9QUlcgc2F5cyB3ZSBjYW4gd2FrZSB1cCB0aGUgc3lzdGVtIGZyb20gdGhlIHRhcmdldCBzbGVlcCBzdGF0ZSwKKwkgKiB0aGUgRC1zdGF0ZSByZXR1cm5lZCBieSBfU3hEIGlzIHN1ZmZpY2llbnQgZm9yIHRoYXQgKHdlIGFzc3VtZSBhCisJICogd2FrZXVwLWF3YXJlIGRyaXZlciBpZiB3YWtlIGlzIHNldCkuICBTdGlsbCwgaWYgX1N4VyBleGlzdHMKKwkgKiAoQUNQSSAzLngpLCBpdCBzaG91bGQgcmV0dXJuIHRoZSBtYXhpbXVtIChsb3dlc3QgcG93ZXIpIEQtc3RhdGUgdGhhdAorCSAqIGNhbiB3YWtlIHRoZSBzeXN0ZW0uICBfUzBXIG1heSBiZSB2YWxpZCwgdG9vLgorCSAqLworCWlmIChhY3BpX3RhcmdldF9zbGVlcF9zdGF0ZSA9PSBBQ1BJX1NUQVRFX1MwIHx8CisJICAgIChkZXZpY2VfbWF5X3dha2V1cChkZXYpICYmIGFkZXYtPndha2V1cC5zdGF0ZS5lbmFibGVkICYmCisJICAgICBhZGV2LT53YWtldXAuc2xlZXBfc3RhdGUgPD0gYWNwaV90YXJnZXRfc2xlZXBfc3RhdGUpKSB7CisJCWFjcGlfc3RhdHVzIHN0YXR1czsKKworCQlhY3BpX21ldGhvZFszXSA9ICdXJzsKKwkJc3RhdHVzID0gYWNwaV9ldmFsdWF0ZV9pbnRlZ2VyKGhhbmRsZSwgYWNwaV9tZXRob2QsIE5VTEwsCisJCQkJCQkmZF9tYXgpOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCWRfbWF4ID0gZF9taW47CisJCX0gZWxzZSBpZiAoZF9tYXggPCBkX21pbikgeworCQkJLyogV2FybiB0aGUgdXNlciBvZiB0aGUgYnJva2VuIERTRFQgKi8KKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIkFDUEk6IFdyb25nIHZhbHVlIGZyb20gJXNcbiIsCisJCQkJYWNwaV9tZXRob2QpOworCQkJLyogU2FuaXRpemUgaXQgKi8KKwkJCWRfbWluID0gZF9tYXg7CisJCX0KKwl9CisKKwlpZiAoZF9taW5fcCkKKwkJKmRfbWluX3AgPSBkX21pbjsKKwlyZXR1cm4gZF9tYXg7Cit9CisKKy8qKgorICoJYWNwaV9wbV9kZXZpY2Vfc2xlZXBfd2FrZSAtIGVuYWJsZSBvciBkaXNhYmxlIHRoZSBzeXN0ZW0gd2FrZS11cAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwYWJpbGl0eSBvZiBnaXZlbiBkZXZpY2UKKyAqCUBkZXY6IGRldmljZSB0byBoYW5kbGUKKyAqCUBlbmFibGU6ICd0cnVlJyAtIGVuYWJsZSwgJ2ZhbHNlJyAtIGRpc2FibGUgdGhlIHdha2UtdXAgY2FwYWJpbGl0eQorICovCitpbnQgYWNwaV9wbV9kZXZpY2Vfc2xlZXBfd2FrZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGJvb2wgZW5hYmxlKQoreworCWFjcGlfaGFuZGxlIGhhbmRsZTsKKwlzdHJ1Y3QgYWNwaV9kZXZpY2UgKmFkZXY7CisKKwlpZiAoIWRldmljZV9tYXlfd2FrZXVwKGRldikpCisJCXJldHVybiAtRUlOVkFMOworCisJaGFuZGxlID0gREVWSUNFX0FDUElfSEFORExFKGRldik7CisJaWYgKCFoYW5kbGUgfHwgQUNQSV9GQUlMVVJFKGFjcGlfYnVzX2dldF9kZXZpY2UoaGFuZGxlLCAmYWRldikpKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICJBQ1BJIGhhbmRsZSBoYXMgbm8gY29udGV4dCFcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlyZXR1cm4gZW5hYmxlID8KKwkJYWNwaV9lbmFibGVfd2FrZXVwX2RldmljZV9wb3dlcihhZGV2LCBhY3BpX3RhcmdldF9zbGVlcF9zdGF0ZSkgOgorCQlhY3BpX2Rpc2FibGVfd2FrZXVwX2RldmljZV9wb3dlcihhZGV2KTsKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCBhY3BpX3Bvd2VyX29mZl9wcmVwYXJlKHZvaWQpCit7CisJLyogUHJlcGFyZSB0byBwb3dlciBvZmYgdGhlIHN5c3RlbSAqLworCWFjcGlfc2xlZXBfcHJlcGFyZShBQ1BJX1NUQVRFX1M1KTsKKwlhY3BpX2Rpc2FibGVfYWxsX2dwZXMoKTsKK30KKworc3RhdGljIHZvaWQgYWNwaV9wb3dlcl9vZmYodm9pZCkKK3sKKwkvKiBhY3BpX3NsZWVwX3ByZXBhcmUoQUNQSV9TVEFURV9TNSkgc2hvdWxkIGhhdmUgYWxyZWFkeSBiZWVuIGNhbGxlZCAqLworCXByaW50aygiJXMgY2FsbGVkXG4iLCBfX2Z1bmNfXyk7CisJbG9jYWxfaXJxX2Rpc2FibGUoKTsKKwlhY3BpX2VuYWJsZV93YWtldXBfZGV2aWNlKEFDUElfU1RBVEVfUzUpOworCWFjcGlfZW50ZXJfc2xlZXBfc3RhdGUoQUNQSV9TVEFURV9TNSk7Cit9CisKK2ludCBfX2luaXQgYWNwaV9zbGVlcF9pbml0KHZvaWQpCit7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCXU4IHR5cGVfYSwgdHlwZV9iOworI2lmZGVmIENPTkZJR19TVVNQRU5ECisJaW50IGkgPSAwOworCisJZG1pX2NoZWNrX3N5c3RlbShhY3Bpc2xlZXBfZG1pX3RhYmxlKTsKKyNlbmRpZgorCisJaWYgKGFjcGlfZGlzYWJsZWQpCisJCXJldHVybiAwOworCisJc2xlZXBfc3RhdGVzW0FDUElfU1RBVEVfUzBdID0gMTsKKwlwcmludGsoS0VSTl9JTkZPIFBSRUZJWCAiKHN1cHBvcnRzIFMwIik7CisKKyNpZmRlZiBDT05GSUdfU1VTUEVORAorCWZvciAoaSA9IEFDUElfU1RBVEVfUzE7IGkgPCBBQ1BJX1NUQVRFX1M0OyBpKyspIHsKKwkJc3RhdHVzID0gYWNwaV9nZXRfc2xlZXBfdHlwZV9kYXRhKGksICZ0eXBlX2EsICZ0eXBlX2IpOworCQlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpIHsKKwkJCXNsZWVwX3N0YXRlc1tpXSA9IDE7CisJCQlwcmludGsoIiBTJWQiLCBpKTsKKwkJfQorCX0KKworCXN1c3BlbmRfc2V0X29wcyhvbGRfc3VzcGVuZF9vcmRlcmluZyA/CisJCSZhY3BpX3N1c3BlbmRfb3BzX29sZCA6ICZhY3BpX3N1c3BlbmRfb3BzKTsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0hJQkVSTkFUSU9OCisJc3RhdHVzID0gYWNwaV9nZXRfc2xlZXBfdHlwZV9kYXRhKEFDUElfU1RBVEVfUzQsICZ0eXBlX2EsICZ0eXBlX2IpOworCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkgeworCQloaWJlcm5hdGlvbl9zZXRfb3BzKG9sZF9zdXNwZW5kX29yZGVyaW5nID8KKwkJCSZhY3BpX2hpYmVybmF0aW9uX29wc19vbGQgOiAmYWNwaV9oaWJlcm5hdGlvbl9vcHMpOworCQlzbGVlcF9zdGF0ZXNbQUNQSV9TVEFURV9TNF0gPSAxOworCQlwcmludGsoIiBTNCIpOworCQlpZiAoIW5vc2lnY2hlY2spIHsKKwkJCWFjcGlfZ2V0X3RhYmxlKEFDUElfU0lHX0ZBQ1MsIDEsCisJCQkJKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqKikmZmFjcyk7CisJCQlpZiAoZmFjcykKKwkJCQlzNF9oYXJkd2FyZV9zaWduYXR1cmUgPQorCQkJCQlmYWNzLT5oYXJkd2FyZV9zaWduYXR1cmU7CisJCX0KKwl9CisjZW5kaWYKKwlzdGF0dXMgPSBhY3BpX2dldF9zbGVlcF90eXBlX2RhdGEoQUNQSV9TVEFURV9TNSwgJnR5cGVfYSwgJnR5cGVfYik7CisJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCXNsZWVwX3N0YXRlc1tBQ1BJX1NUQVRFX1M1XSA9IDE7CisJCXByaW50aygiIFM1Iik7CisJCXBtX3Bvd2VyX29mZl9wcmVwYXJlID0gYWNwaV9wb3dlcl9vZmZfcHJlcGFyZTsKKwkJcG1fcG93ZXJfb2ZmID0gYWNwaV9wb3dlcl9vZmY7CisJfQorCXByaW50aygiKVxuIik7CisJLyoKKwkgKiBSZWdpc3RlciB0aGUgdHRzX25vdGlmaWVyIHRvIHJlYm9vdCBub3RpZmllciBsaXN0IHNvIHRoYXQgdGhlIF9UVFMKKwkgKiBvYmplY3QgY2FuIGFsc28gYmUgZXZhbHVhdGVkIHdoZW4gdGhlIHN5c3RlbSBlbnRlcnMgUzUuCisJICovCisJcmVnaXN0ZXJfcmVib290X25vdGlmaWVyKCZ0dHNfbm90aWZpZXIpOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3NsZWVwL3NsZWVwLmggYi9kcml2ZXJzL2FjcGkvc2xlZXAuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9hY3BpL3NsZWVwL3NsZWVwLmgKcmVuYW1lIHRvIGRyaXZlcnMvYWNwaS9zbGVlcC5oCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvc2xlZXAvTWFrZWZpbGUgYi9kcml2ZXJzL2FjcGkvc2xlZXAvTWFrZWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxZmI4ODguLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9hY3BpL3NsZWVwL01ha2VmaWxlCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1vYmoteQkJCQkJOj0gd2FrZXVwLm8KLW9iai15CQkJCQkrPSBtYWluLm8KLW9iai0kKENPTkZJR19BQ1BJX1NMRUVQKQkJKz0gcHJvYy5vCi0KLUVYVFJBX0NGTEFHUyArPSAkKEFDUElfQ0ZMQUdTKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3NsZWVwL21haW4uYyBiL2RyaXZlcnMvYWNwaS9zbGVlcC9tYWluLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4YTY5MWNjLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvYWNwaS9zbGVlcC9tYWluLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2OTYgKzAsMCBAQAotLyoKLSAqIHNsZWVwLmMgLSBBQ1BJIHNsZWVwIHN1cHBvcnQuCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDA1IEFsZXhleSBTdGFyaWtvdnNraXkgPGFsZXhleS55LnN0YXJpa292c2tpeUBpbnRlbC5jb20+Ci0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgRGF2aWQgU2hhb2h1YSBMaSA8c2hhb2h1YS5saUBpbnRlbC5jb20+Ci0gKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBQYXRyaWNrIE1vY2hlbAotICogQ29weXJpZ2h0IChjKSAyMDAzIE9wZW4gU291cmNlIERldmVsb3BtZW50IExhYgotICoKLSAqIFRoaXMgZmlsZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgR1BMdjIuCi0gKgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L2lycS5oPgotI2luY2x1ZGUgPGxpbnV4L2RtaS5oPgotI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L3N1c3BlbmQuaD4KLSNpbmNsdWRlIDxsaW51eC9yZWJvb3QuaD4KLQotI2luY2x1ZGUgPGFzbS9pby5oPgotCi0jaW5jbHVkZSA8YWNwaS9hY3BpX2J1cy5oPgotI2luY2x1ZGUgPGFjcGkvYWNwaV9kcml2ZXJzLmg+Ci0jaW5jbHVkZSAic2xlZXAuaCIKLQotdTggc2xlZXBfc3RhdGVzW0FDUElfU19TVEFURV9DT1VOVF07Ci0KLXN0YXRpYyB2b2lkIGFjcGlfc2xlZXBfdHRzX3N3aXRjaCh1MzIgYWNwaV9zdGF0ZSkKLXsKLQl1bmlvbiBhY3BpX29iamVjdCBpbl9hcmcgPSB7IEFDUElfVFlQRV9JTlRFR0VSIH07Ci0Jc3RydWN0IGFjcGlfb2JqZWN0X2xpc3QgYXJnX2xpc3QgPSB7IDEsICZpbl9hcmcgfTsKLQlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKLQotCWluX2FyZy5pbnRlZ2VyLnZhbHVlID0gYWNwaV9zdGF0ZTsKLQlzdGF0dXMgPSBhY3BpX2V2YWx1YXRlX29iamVjdChOVUxMLCAiXFxfVFRTIiwgJmFyZ19saXN0LCBOVUxMKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykgJiYgc3RhdHVzICE9IEFFX05PVF9GT1VORCkgewotCQkvKgotCQkgKiBPUyBjYW4ndCBldmFsdWF0ZSB0aGUgX1RUUyBvYmplY3QgY29ycmVjdGx5LiBTb21lIHdhcm5pbmcKLQkJICogbWVzc2FnZSB3aWxsIGJlIHByaW50ZWQuIEJ1dCBpdCB3b24ndCBicmVhayBhbnl0aGluZy4KLQkJICovCi0JCXByaW50ayhLRVJOX05PVElDRSAiRmFpbHVyZSBpbiBldmFsdWF0aW5nIF9UVFMgb2JqZWN0XG4iKTsKLQl9Ci19Ci0KLXN0YXRpYyBpbnQgdHRzX25vdGlmeV9yZWJvb3Qoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICp0aGlzLAotCQkJdW5zaWduZWQgbG9uZyBjb2RlLCB2b2lkICp4KQotewotCWFjcGlfc2xlZXBfdHRzX3N3aXRjaChBQ1BJX1NUQVRFX1M1KTsKLQlyZXR1cm4gTk9USUZZX0RPTkU7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgdHRzX25vdGlmaWVyID0gewotCS5ub3RpZmllcl9jYWxsCT0gdHRzX25vdGlmeV9yZWJvb3QsCi0JLm5leHQJCT0gTlVMTCwKLQkucHJpb3JpdHkJPSAwLAotfTsKLQotc3RhdGljIGludCBhY3BpX3NsZWVwX3ByZXBhcmUodTMyIGFjcGlfc3RhdGUpCi17Ci0jaWZkZWYgQ09ORklHX0FDUElfU0xFRVAKLQkvKiBkbyB3ZSBoYXZlIGEgd2FrZXVwIGFkZHJlc3MgZm9yIFMyIGFuZCBTMz8gKi8KLQlpZiAoYWNwaV9zdGF0ZSA9PSBBQ1BJX1NUQVRFX1MzKSB7Ci0JCWlmICghYWNwaV93YWtldXBfYWRkcmVzcykgewotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCX0KLQkJYWNwaV9zZXRfZmlybXdhcmVfd2FraW5nX3ZlY3RvcigKLQkJCQkoYWNwaV9waHlzaWNhbF9hZGRyZXNzKWFjcGlfd2FrZXVwX2FkZHJlc3MpOwotCi0JfQotCUFDUElfRkxVU0hfQ1BVX0NBQ0hFKCk7Ci0JYWNwaV9lbmFibGVfd2FrZXVwX2RldmljZV9wcmVwKGFjcGlfc3RhdGUpOwotI2VuZGlmCi0JcHJpbnRrKEtFUk5fSU5GTyBQUkVGSVggIlByZXBhcmluZyB0byBlbnRlciBzeXN0ZW0gc2xlZXAgc3RhdGUgUyVkXG4iLAotCQlhY3BpX3N0YXRlKTsKLQlhY3BpX2VudGVyX3NsZWVwX3N0YXRlX3ByZXAoYWNwaV9zdGF0ZSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLSNpZmRlZiBDT05GSUdfQUNQSV9TTEVFUAotc3RhdGljIHUzMiBhY3BpX3RhcmdldF9zbGVlcF9zdGF0ZSA9IEFDUElfU1RBVEVfUzA7Ci0vKgotICogQUNQSSAxLjAgd2FudHMgdXMgdG8gZXhlY3V0ZSBfUFRTIGJlZm9yZSBzdXNwZW5kaW5nIGRldmljZXMsIHNvIHdlIGFsbG93IHRoZQotICogdXNlciB0byByZXF1ZXN0IHRoYXQgYmVoYXZpb3IgYnkgdXNpbmcgdGhlICdhY3BpX29sZF9zdXNwZW5kX29yZGVyaW5nJwotICoga2VybmVsIGNvbW1hbmQgbGluZSBvcHRpb24gdGhhdCBjYXVzZXMgdGhlIGZvbGxvd2luZyB2YXJpYWJsZSB0byBiZSBzZXQuCi0gKi8KLXN0YXRpYyBib29sIG9sZF9zdXNwZW5kX29yZGVyaW5nOwotCi12b2lkIF9faW5pdCBhY3BpX29sZF9zdXNwZW5kX29yZGVyaW5nKHZvaWQpCi17Ci0Jb2xkX3N1c3BlbmRfb3JkZXJpbmcgPSB0cnVlOwotfQotCi0vKgotICogQWNjb3JkaW5nIHRvIHRoZSBBQ1BJIHNwZWNpZmljYXRpb24gdGhlIEJJT1Mgc2hvdWxkIG1ha2Ugc3VyZSB0aGF0IEFDUEkgaXMKLSAqIGVuYWJsZWQgYW5kIFNDSV9FTiBiaXQgaXMgc2V0IG9uIHdha2UtdXAgZnJvbSBTMSAtIFMzIHNsZWVwIHN0YXRlcy4gIFN0aWxsLAotICogc29tZSBCSU9TZXMgZG9uJ3QgZG8gdGhhdCBhbmQgdGhlcmVmb3JlIHdlIHVzZSBhY3BpX2VuYWJsZSgpIHRvIGVuYWJsZSBBQ1BJCi0gKiBvbiBzdWNoIHN5c3RlbXMgZHVyaW5nIHJlc3VtZS4gIFVuZm9ydHVuYXRlbHkgdGhhdCBkb2Vzbid0IGhlbHAgaW4KLSAqIHBhcnRpY3VsYXJseSBwYXRob2xvZ2ljYWwgY2FzZXMgaW4gd2hpY2ggU0NJX0VOIGhhcyB0byBiZSBzZXQgZGlyZWN0bHkgb24KLSAqIHJlc3VtZSwgYWx0aG91Z2ggdGhlIHNwZWNpZmljYXRpb24gc3RhdGVzIHZlcnkgY2xlYXJseSB0aGF0IHRoaXMgZmxhZyBpcwotICogb3duZWQgYnkgdGhlIGhhcmR3YXJlLiAgVGhlIHNldF9zY2lfZW5fb25fcmVzdW1lIHZhcmlhYmxlIHdpbGwgYmUgc2V0IGluIHN1Y2gKLSAqIGNhc2VzLgotICovCi1zdGF0aWMgYm9vbCBzZXRfc2NpX2VuX29uX3Jlc3VtZTsKLQotLyoqCi0gKglhY3BpX3BtX2Rpc2FibGVfZ3BlcyAtIERpc2FibGUgdGhlIEdQRXMuCi0gKi8KLXN0YXRpYyBpbnQgYWNwaV9wbV9kaXNhYmxlX2dwZXModm9pZCkKLXsKLQlhY3BpX2h3X2Rpc2FibGVfYWxsX2dwZXMoKTsKLQlyZXR1cm4gMDsKLX0KLQotLyoqCi0gKglfX2FjcGlfcG1fcHJlcGFyZSAtIFByZXBhcmUgdGhlIHBsYXRmb3JtIHRvIGVudGVyIHRoZSB0YXJnZXQgc3RhdGUuCi0gKgotICoJSWYgbmVjZXNzYXJ5LCBzZXQgdGhlIGZpcm13YXJlIHdha2luZyB2ZWN0b3IgYW5kIGRvIGFyY2gtc3BlY2lmaWMKLSAqCW5hc3RpbmVzcyB0byBnZXQgdGhlIHdha2V1cCBjb2RlIHRvIHRoZSB3YWtpbmcgdmVjdG9yLgotICovCi1zdGF0aWMgaW50IF9fYWNwaV9wbV9wcmVwYXJlKHZvaWQpCi17Ci0JaW50IGVycm9yID0gYWNwaV9zbGVlcF9wcmVwYXJlKGFjcGlfdGFyZ2V0X3NsZWVwX3N0YXRlKTsKLQotCWlmIChlcnJvcikKLQkJYWNwaV90YXJnZXRfc2xlZXBfc3RhdGUgPSBBQ1BJX1NUQVRFX1MwOwotCXJldHVybiBlcnJvcjsKLX0KLQotLyoqCi0gKglhY3BpX3BtX3ByZXBhcmUgLSBQcmVwYXJlIHRoZSBwbGF0Zm9ybSB0byBlbnRlciB0aGUgdGFyZ2V0IHNsZWVwCi0gKgkJc3RhdGUgYW5kIGRpc2FibGUgdGhlIEdQRXMuCi0gKi8KLXN0YXRpYyBpbnQgYWNwaV9wbV9wcmVwYXJlKHZvaWQpCi17Ci0JaW50IGVycm9yID0gX19hY3BpX3BtX3ByZXBhcmUoKTsKLQotCWlmICghZXJyb3IpCi0JCWFjcGlfaHdfZGlzYWJsZV9hbGxfZ3BlcygpOwotCXJldHVybiBlcnJvcjsKLX0KLQotLyoqCi0gKglhY3BpX3BtX2ZpbmlzaCAtIEluc3RydWN0IHRoZSBwbGF0Zm9ybSB0byBsZWF2ZSBhIHNsZWVwIHN0YXRlLgotICoKLSAqCVRoaXMgaXMgY2FsbGVkIGFmdGVyIHdlIHdha2UgYmFjayB1cCAob3IgaWYgZW50ZXJpbmcgdGhlIHNsZWVwIHN0YXRlCi0gKglmYWlsZWQpLgotICovCi1zdGF0aWMgdm9pZCBhY3BpX3BtX2ZpbmlzaCh2b2lkKQotewotCXUzMiBhY3BpX3N0YXRlID0gYWNwaV90YXJnZXRfc2xlZXBfc3RhdGU7Ci0KLQlpZiAoYWNwaV9zdGF0ZSA9PSBBQ1BJX1NUQVRFX1MwKQotCQlyZXR1cm47Ci0KLQlwcmludGsoS0VSTl9JTkZPIFBSRUZJWCAiV2FraW5nIHVwIGZyb20gc3lzdGVtIHNsZWVwIHN0YXRlIFMlZFxuIiwKLQkJYWNwaV9zdGF0ZSk7Ci0JYWNwaV9kaXNhYmxlX3dha2V1cF9kZXZpY2UoYWNwaV9zdGF0ZSk7Ci0JYWNwaV9sZWF2ZV9zbGVlcF9zdGF0ZShhY3BpX3N0YXRlKTsKLQotCS8qIHJlc2V0IGZpcm13YXJlIHdha2luZyB2ZWN0b3IgKi8KLQlhY3BpX3NldF9maXJtd2FyZV93YWtpbmdfdmVjdG9yKChhY3BpX3BoeXNpY2FsX2FkZHJlc3MpIDApOwotCi0JYWNwaV90YXJnZXRfc2xlZXBfc3RhdGUgPSBBQ1BJX1NUQVRFX1MwOwotfQotCi0vKioKLSAqCWFjcGlfcG1fZW5kIC0gRmluaXNoIHVwIHN1c3BlbmQgc2VxdWVuY2UuCi0gKi8KLXN0YXRpYyB2b2lkIGFjcGlfcG1fZW5kKHZvaWQpCi17Ci0JLyoKLQkgKiBUaGlzIGlzIG5lY2Vzc2FyeSBpbiBjYXNlIGFjcGlfcG1fZmluaXNoKCkgaXMgbm90IGNhbGxlZCBkdXJpbmcgYQotCSAqIGZhaWxpbmcgdHJhbnNpdGlvbiB0byBhIHNsZWVwIHN0YXRlLgotCSAqLwotCWFjcGlfdGFyZ2V0X3NsZWVwX3N0YXRlID0gQUNQSV9TVEFURV9TMDsKLQlhY3BpX3NsZWVwX3R0c19zd2l0Y2goYWNwaV90YXJnZXRfc2xlZXBfc3RhdGUpOwotfQotI2Vsc2UgLyogIUNPTkZJR19BQ1BJX1NMRUVQICovCi0jZGVmaW5lIGFjcGlfdGFyZ2V0X3NsZWVwX3N0YXRlCUFDUElfU1RBVEVfUzAKLSNlbmRpZiAvKiBDT05GSUdfQUNQSV9TTEVFUCAqLwotCi0jaWZkZWYgQ09ORklHX1NVU1BFTkQKLWV4dGVybiB2b2lkIGRvX3N1c3BlbmRfbG93bGV2ZWwodm9pZCk7Ci0KLXN0YXRpYyB1MzIgYWNwaV9zdXNwZW5kX3N0YXRlc1tdID0gewotCVtQTV9TVVNQRU5EX09OXSA9IEFDUElfU1RBVEVfUzAsCi0JW1BNX1NVU1BFTkRfU1RBTkRCWV0gPSBBQ1BJX1NUQVRFX1MxLAotCVtQTV9TVVNQRU5EX01FTV0gPSBBQ1BJX1NUQVRFX1MzLAotCVtQTV9TVVNQRU5EX01BWF0gPSBBQ1BJX1NUQVRFX1M1Ci19OwotCi0vKioKLSAqCWFjcGlfc3VzcGVuZF9iZWdpbiAtIFNldCB0aGUgdGFyZ2V0IHN5c3RlbSBzbGVlcCBzdGF0ZSB0byB0aGUgc3RhdGUKLSAqCQlhc3NvY2lhdGVkIHdpdGggZ2l2ZW4gQHBtX3N0YXRlLCBpZiBzdXBwb3J0ZWQuCi0gKi8KLXN0YXRpYyBpbnQgYWNwaV9zdXNwZW5kX2JlZ2luKHN1c3BlbmRfc3RhdGVfdCBwbV9zdGF0ZSkKLXsKLQl1MzIgYWNwaV9zdGF0ZSA9IGFjcGlfc3VzcGVuZF9zdGF0ZXNbcG1fc3RhdGVdOwotCWludCBlcnJvciA9IDA7Ci0KLQlpZiAoc2xlZXBfc3RhdGVzW2FjcGlfc3RhdGVdKSB7Ci0JCWFjcGlfdGFyZ2V0X3NsZWVwX3N0YXRlID0gYWNwaV9zdGF0ZTsKLQkJYWNwaV9zbGVlcF90dHNfc3dpdGNoKGFjcGlfdGFyZ2V0X3NsZWVwX3N0YXRlKTsKLQl9IGVsc2UgewotCQlwcmludGsoS0VSTl9FUlIgIkFDUEkgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIHN0YXRlOiAlZFxuIiwKLQkJCXBtX3N0YXRlKTsKLQkJZXJyb3IgPSAtRU5PU1lTOwotCX0KLQlyZXR1cm4gZXJyb3I7Ci19Ci0KLS8qKgotICoJYWNwaV9zdXNwZW5kX2VudGVyIC0gQWN0dWFsbHkgZW50ZXIgYSBzbGVlcCBzdGF0ZS4KLSAqCUBwbV9zdGF0ZTogaWdub3JlZAotICoKLSAqCUZsdXNoIGNhY2hlcyBhbmQgZ28gdG8gc2xlZXAuIEZvciBTVFIgd2UgaGF2ZSB0byBjYWxsIGFyY2gtc3BlY2lmaWMKLSAqCWFzc2VtYmx5LCB3aGljaCBpbiB0dXJuIGNhbGwgYWNwaV9lbnRlcl9zbGVlcF9zdGF0ZSgpLgotICoJSXQncyB1bmZvcnR1bmF0ZSwgYnV0IGl0IHdvcmtzLiBQbGVhc2UgZml4IGlmIHlvdSdyZSBmZWVsaW5nIGZyaXNreS4KLSAqLwotc3RhdGljIGludCBhY3BpX3N1c3BlbmRfZW50ZXIoc3VzcGVuZF9zdGF0ZV90IHBtX3N0YXRlKQotewotCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAwOwotCXUzMiBhY3BpX3N0YXRlID0gYWNwaV90YXJnZXRfc2xlZXBfc3RhdGU7Ci0KLQlBQ1BJX0ZMVVNIX0NQVV9DQUNIRSgpOwotCi0JLyogRG8gYXJjaCBzcGVjaWZpYyBzYXZpbmcgb2Ygc3RhdGUuICovCi0JaWYgKGFjcGlfc3RhdGUgPT0gQUNQSV9TVEFURV9TMykgewotCQlpbnQgZXJyb3IgPSBhY3BpX3NhdmVfc3RhdGVfbWVtKCk7Ci0KLQkJaWYgKGVycm9yKQotCQkJcmV0dXJuIGVycm9yOwotCX0KLQotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQlhY3BpX2VuYWJsZV93YWtldXBfZGV2aWNlKGFjcGlfc3RhdGUpOwotCXN3aXRjaCAoYWNwaV9zdGF0ZSkgewotCWNhc2UgQUNQSV9TVEFURV9TMToKLQkJYmFycmllcigpOwotCQlzdGF0dXMgPSBhY3BpX2VudGVyX3NsZWVwX3N0YXRlKGFjcGlfc3RhdGUpOwotCQlicmVhazsKLQotCWNhc2UgQUNQSV9TVEFURV9TMzoKLQkJZG9fc3VzcGVuZF9sb3dsZXZlbCgpOwotCQlicmVhazsKLQl9Ci0KLQkvKiBJZiBBQ1BJIGlzIG5vdCBlbmFibGVkIGJ5IHRoZSBCSU9TLCB3ZSBuZWVkIHRvIGVuYWJsZSBpdCBoZXJlLiAqLwotCWlmIChzZXRfc2NpX2VuX29uX3Jlc3VtZSkKLQkJYWNwaV9zZXRfcmVnaXN0ZXIoQUNQSV9CSVRSRUdfU0NJX0VOQUJMRSwgMSk7Ci0JZWxzZQotCQlhY3BpX2VuYWJsZSgpOwotCi0JLyogUmVwcm9ncmFtIGNvbnRyb2wgcmVnaXN0ZXJzIGFuZCBleGVjdXRlIF9CRlMgKi8KLQlhY3BpX2xlYXZlX3NsZWVwX3N0YXRlX3ByZXAoYWNwaV9zdGF0ZSk7Ci0KLQkvKiBBQ1BJIDMuMCBzcGVjcyAoUDYyKSBzYXlzIHRoYXQgaXQncyB0aGUgcmVzcG9uc2liaWxpdHkKLQkgKiBvZiB0aGUgT1NQTSB0byBjbGVhciB0aGUgc3RhdHVzIGJpdCBbIGltcGx5aW5nIHRoYXQgdGhlCi0JICogUE9XRVJfQlVUVE9OIGV2ZW50IHNob3VsZCBub3QgcmVhY2ggdXNlcnNwYWNlIF0KLQkgKi8KLQlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykgJiYgKGFjcGlfc3RhdGUgPT0gQUNQSV9TVEFURV9TMykpCi0JCWFjcGlfY2xlYXJfZXZlbnQoQUNQSV9FVkVOVF9QT1dFUl9CVVRUT04pOwotCi0JLyoKLQkgKiBEaXNhYmxlIGFuZCBjbGVhciBHUEUgc3RhdHVzIGJlZm9yZSBpbnRlcnJ1cHQgaXMgZW5hYmxlZC4gU29tZSBHUEVzCi0JICogKGxpa2Ugd2FrZXVwIEdQRSkgaGF2ZW4ndCBoYW5kbGVyLCB0aGlzIGNhbiBhdm9pZCBzdWNoIEdQRSBtaXNmaXJlLgotCSAqIGFjcGlfbGVhdmVfc2xlZXBfc3RhdGUgd2lsbCByZWVuYWJsZSBzcGVjaWZpYyBHUEVzIGxhdGVyCi0JICovCi0JYWNwaV9od19kaXNhYmxlX2FsbF9ncGVzKCk7Ci0KLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci0JcHJpbnRrKEtFUk5fREVCVUcgIkJhY2sgdG8gQyFcbiIpOwotCi0JLyogcmVzdG9yZSBwcm9jZXNzb3Igc3RhdGUgKi8KLQlpZiAoYWNwaV9zdGF0ZSA9PSBBQ1BJX1NUQVRFX1MzKQotCQlhY3BpX3Jlc3RvcmVfc3RhdGVfbWVtKCk7Ci0KLQlyZXR1cm4gQUNQSV9TVUNDRVNTKHN0YXR1cykgPyAwIDogLUVGQVVMVDsKLX0KLQotc3RhdGljIGludCBhY3BpX3N1c3BlbmRfc3RhdGVfdmFsaWQoc3VzcGVuZF9zdGF0ZV90IHBtX3N0YXRlKQotewotCXUzMiBhY3BpX3N0YXRlOwotCi0Jc3dpdGNoIChwbV9zdGF0ZSkgewotCWNhc2UgUE1fU1VTUEVORF9PTjoKLQljYXNlIFBNX1NVU1BFTkRfU1RBTkRCWToKLQljYXNlIFBNX1NVU1BFTkRfTUVNOgotCQlhY3BpX3N0YXRlID0gYWNwaV9zdXNwZW5kX3N0YXRlc1twbV9zdGF0ZV07Ci0KLQkJcmV0dXJuIHNsZWVwX3N0YXRlc1thY3BpX3N0YXRlXTsKLQlkZWZhdWx0OgotCQlyZXR1cm4gMDsKLQl9Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fc3VzcGVuZF9vcHMgYWNwaV9zdXNwZW5kX29wcyA9IHsKLQkudmFsaWQgPSBhY3BpX3N1c3BlbmRfc3RhdGVfdmFsaWQsCi0JLmJlZ2luID0gYWNwaV9zdXNwZW5kX2JlZ2luLAotCS5wcmVwYXJlID0gYWNwaV9wbV9wcmVwYXJlLAotCS5lbnRlciA9IGFjcGlfc3VzcGVuZF9lbnRlciwKLQkuZmluaXNoID0gYWNwaV9wbV9maW5pc2gsCi0JLmVuZCA9IGFjcGlfcG1fZW5kLAotfTsKLQotLyoqCi0gKglhY3BpX3N1c3BlbmRfYmVnaW5fb2xkIC0gU2V0IHRoZSB0YXJnZXQgc3lzdGVtIHNsZWVwIHN0YXRlIHRvIHRoZQotICoJCXN0YXRlIGFzc29jaWF0ZWQgd2l0aCBnaXZlbiBAcG1fc3RhdGUsIGlmIHN1cHBvcnRlZCwgYW5kCi0gKgkJZXhlY3V0ZSB0aGUgX1BUUyBjb250cm9sIG1ldGhvZC4gIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBpZiB0aGUKLSAqCQlwcmUtQUNQSSAyLjAgc3VzcGVuZCBvcmRlcmluZyBoYXMgYmVlbiByZXF1ZXN0ZWQuCi0gKi8KLXN0YXRpYyBpbnQgYWNwaV9zdXNwZW5kX2JlZ2luX29sZChzdXNwZW5kX3N0YXRlX3QgcG1fc3RhdGUpCi17Ci0JaW50IGVycm9yID0gYWNwaV9zdXNwZW5kX2JlZ2luKHBtX3N0YXRlKTsKLQotCWlmICghZXJyb3IpCi0JCWVycm9yID0gX19hY3BpX3BtX3ByZXBhcmUoKTsKLQlyZXR1cm4gZXJyb3I7Ci19Ci0KLS8qCi0gKiBUaGUgZm9sbG93aW5nIGNhbGxiYWNrcyBhcmUgdXNlZCBpZiB0aGUgcHJlLUFDUEkgMi4wIHN1c3BlbmQgb3JkZXJpbmcgaGFzCi0gKiBiZWVuIHJlcXVlc3RlZC4KLSAqLwotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9zdXNwZW5kX29wcyBhY3BpX3N1c3BlbmRfb3BzX29sZCA9IHsKLQkudmFsaWQgPSBhY3BpX3N1c3BlbmRfc3RhdGVfdmFsaWQsCi0JLmJlZ2luID0gYWNwaV9zdXNwZW5kX2JlZ2luX29sZCwKLQkucHJlcGFyZSA9IGFjcGlfcG1fZGlzYWJsZV9ncGVzLAotCS5lbnRlciA9IGFjcGlfc3VzcGVuZF9lbnRlciwKLQkuZmluaXNoID0gYWNwaV9wbV9maW5pc2gsCi0JLmVuZCA9IGFjcGlfcG1fZW5kLAotCS5yZWNvdmVyID0gYWNwaV9wbV9maW5pc2gsCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBpbml0X29sZF9zdXNwZW5kX29yZGVyaW5nKGNvbnN0IHN0cnVjdCBkbWlfc3lzdGVtX2lkICpkKQotewotCW9sZF9zdXNwZW5kX29yZGVyaW5nID0gdHJ1ZTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBfX2luaXQgaW5pdF9zZXRfc2NpX2VuX29uX3Jlc3VtZShjb25zdCBzdHJ1Y3QgZG1pX3N5c3RlbV9pZCAqZCkKLXsKLQlzZXRfc2NpX2VuX29uX3Jlc3VtZSA9IHRydWU7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgZG1pX3N5c3RlbV9pZCBfX2luaXRkYXRhIGFjcGlzbGVlcF9kbWlfdGFibGVbXSA9IHsKLQl7Ci0JLmNhbGxiYWNrID0gaW5pdF9vbGRfc3VzcGVuZF9vcmRlcmluZywKLQkuaWRlbnQgPSAiQWJpdCBLTjkgKG5Gb3JjZTQgdmFyaWFudCkiLAotCS5tYXRjaGVzID0gewotCQlETUlfTUFUQ0goRE1JX0JPQVJEX1ZFTkRPUiwgImh0dHA6Ly93d3cuYWJpdC5jb20udHcvIiksCi0JCURNSV9NQVRDSChETUlfQk9BUkRfTkFNRSwgIktOOSBTZXJpZXMoTkYtQ0s4MDQpIiksCi0JCX0sCi0JfSwKLQl7Ci0JLmNhbGxiYWNrID0gaW5pdF9vbGRfc3VzcGVuZF9vcmRlcmluZywKLQkuaWRlbnQgPSAiSFAgeHc0NjAwIFdvcmtzdGF0aW9uIiwKLQkubWF0Y2hlcyA9IHsKLQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiSGV3bGV0dC1QYWNrYXJkIiksCi0JCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiSFAgeHc0NjAwIFdvcmtzdGF0aW9uIiksCi0JCX0sCi0JfSwKLQl7Ci0JLmNhbGxiYWNrID0gaW5pdF9zZXRfc2NpX2VuX29uX3Jlc3VtZSwKLQkuaWRlbnQgPSAiQXBwbGUgTWFjQm9vayAxLDEiLAotCS5tYXRjaGVzID0gewotCQlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJBcHBsZSBDb21wdXRlciwgSW5jLiIpLAotCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIk1hY0Jvb2sxLDEiKSwKLQkJfSwKLQl9LAotCXsKLQkuY2FsbGJhY2sgPSBpbml0X3NldF9zY2lfZW5fb25fcmVzdW1lLAotCS5pZGVudCA9ICJBcHBsZSBNYWNNaW5pIDEsMSIsCi0JLm1hdGNoZXMgPSB7Ci0JCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkFwcGxlIENvbXB1dGVyLCBJbmMuIiksCi0JCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiTWFjbWluaTEsMSIpLAotCQl9LAotCX0sCi0Je30sCi19OwotI2VuZGlmIC8qIENPTkZJR19TVVNQRU5EICovCi0KLSNpZmRlZiBDT05GSUdfSElCRVJOQVRJT04KLXN0YXRpYyB1bnNpZ25lZCBsb25nIHM0X2hhcmR3YXJlX3NpZ25hdHVyZTsKLXN0YXRpYyBzdHJ1Y3QgYWNwaV90YWJsZV9mYWNzICpmYWNzOwotc3RhdGljIGJvb2wgbm9zaWdjaGVjazsKLQotdm9pZCBfX2luaXQgYWNwaV9ub19zNF9od19zaWduYXR1cmUodm9pZCkKLXsKLQlub3NpZ2NoZWNrID0gdHJ1ZTsKLX0KLQotc3RhdGljIGludCBhY3BpX2hpYmVybmF0aW9uX2JlZ2luKHZvaWQpCi17Ci0JYWNwaV90YXJnZXRfc2xlZXBfc3RhdGUgPSBBQ1BJX1NUQVRFX1M0OwotCWFjcGlfc2xlZXBfdHRzX3N3aXRjaChhY3BpX3RhcmdldF9zbGVlcF9zdGF0ZSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgYWNwaV9oaWJlcm5hdGlvbl9lbnRlcih2b2lkKQotewotCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAwOwotCi0JQUNQSV9GTFVTSF9DUFVfQ0FDSEUoKTsKLQotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQlhY3BpX2VuYWJsZV93YWtldXBfZGV2aWNlKEFDUElfU1RBVEVfUzQpOwotCS8qIFRoaXMgc2hvdWxkbid0IHJldHVybi4gIElmIGl0IHJldHVybnMsIHdlIGhhdmUgYSBwcm9ibGVtICovCi0Jc3RhdHVzID0gYWNwaV9lbnRlcl9zbGVlcF9zdGF0ZShBQ1BJX1NUQVRFX1M0KTsKLQkvKiBSZXByb2dyYW0gY29udHJvbCByZWdpc3RlcnMgYW5kIGV4ZWN1dGUgX0JGUyAqLwotCWFjcGlfbGVhdmVfc2xlZXBfc3RhdGVfcHJlcChBQ1BJX1NUQVRFX1M0KTsKLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci0KLQlyZXR1cm4gQUNQSV9TVUNDRVNTKHN0YXR1cykgPyAwIDogLUVGQVVMVDsKLX0KLQotc3RhdGljIHZvaWQgYWNwaV9oaWJlcm5hdGlvbl9sZWF2ZSh2b2lkKQotewotCS8qCi0JICogSWYgQUNQSSBpcyBub3QgZW5hYmxlZCBieSB0aGUgQklPUyBhbmQgdGhlIGJvb3Qga2VybmVsLCB3ZSBuZWVkIHRvCi0JICogZW5hYmxlIGl0IGhlcmUuCi0JICovCi0JYWNwaV9lbmFibGUoKTsKLQkvKiBSZXByb2dyYW0gY29udHJvbCByZWdpc3RlcnMgYW5kIGV4ZWN1dGUgX0JGUyAqLwotCWFjcGlfbGVhdmVfc2xlZXBfc3RhdGVfcHJlcChBQ1BJX1NUQVRFX1M0KTsKLQkvKiBDaGVjayB0aGUgaGFyZHdhcmUgc2lnbmF0dXJlICovCi0JaWYgKGZhY3MgJiYgczRfaGFyZHdhcmVfc2lnbmF0dXJlICE9IGZhY3MtPmhhcmR3YXJlX3NpZ25hdHVyZSkgewotCQlwcmludGsoS0VSTl9FTUVSRyAiQUNQSTogSGFyZHdhcmUgY2hhbmdlZCB3aGlsZSBoaWJlcm5hdGVkLCAiCi0JCQkiY2Fubm90IHJlc3VtZSFcbiIpOwotCQlwYW5pYygiQUNQSSBTNCBoYXJkd2FyZSBzaWduYXR1cmUgbWlzbWF0Y2giKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIGFjcGlfcG1fZW5hYmxlX2dwZXModm9pZCkKLXsKLQlhY3BpX2h3X2VuYWJsZV9hbGxfcnVudGltZV9ncGVzKCk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1faGliZXJuYXRpb25fb3BzIGFjcGlfaGliZXJuYXRpb25fb3BzID0gewotCS5iZWdpbiA9IGFjcGlfaGliZXJuYXRpb25fYmVnaW4sCi0JLmVuZCA9IGFjcGlfcG1fZW5kLAotCS5wcmVfc25hcHNob3QgPSBhY3BpX3BtX3ByZXBhcmUsCi0JLmZpbmlzaCA9IGFjcGlfcG1fZmluaXNoLAotCS5wcmVwYXJlID0gYWNwaV9wbV9wcmVwYXJlLAotCS5lbnRlciA9IGFjcGlfaGliZXJuYXRpb25fZW50ZXIsCi0JLmxlYXZlID0gYWNwaV9oaWJlcm5hdGlvbl9sZWF2ZSwKLQkucHJlX3Jlc3RvcmUgPSBhY3BpX3BtX2Rpc2FibGVfZ3BlcywKLQkucmVzdG9yZV9jbGVhbnVwID0gYWNwaV9wbV9lbmFibGVfZ3BlcywKLX07Ci0KLS8qKgotICoJYWNwaV9oaWJlcm5hdGlvbl9iZWdpbl9vbGQgLSBTZXQgdGhlIHRhcmdldCBzeXN0ZW0gc2xlZXAgc3RhdGUgdG8KLSAqCQlBQ1BJX1NUQVRFX1M0IGFuZCBleGVjdXRlIHRoZSBfUFRTIGNvbnRyb2wgbWV0aG9kLiAgVGhpcwotICoJCWZ1bmN0aW9uIGlzIHVzZWQgaWYgdGhlIHByZS1BQ1BJIDIuMCBzdXNwZW5kIG9yZGVyaW5nIGhhcyBiZWVuCi0gKgkJcmVxdWVzdGVkLgotICovCi1zdGF0aWMgaW50IGFjcGlfaGliZXJuYXRpb25fYmVnaW5fb2xkKHZvaWQpCi17Ci0JaW50IGVycm9yOwotCS8qCi0JICogVGhlIF9UVFMgb2JqZWN0IHNob3VsZCBhbHdheXMgYmUgZXZhbHVhdGVkIGJlZm9yZSB0aGUgX1BUUyBvYmplY3QuCi0JICogV2hlbiB0aGUgb2xkX3N1c3BlbmRlZF9vcmRlcmluZyBpcyB0cnVlLCB0aGUgX1BUUyBvYmplY3QgaXMKLQkgKiBldmFsdWF0ZWQgaW4gdGhlIGFjcGlfc2xlZXBfcHJlcGFyZS4KLQkgKi8KLQlhY3BpX3NsZWVwX3R0c19zd2l0Y2goQUNQSV9TVEFURV9TNCk7Ci0KLQllcnJvciA9IGFjcGlfc2xlZXBfcHJlcGFyZShBQ1BJX1NUQVRFX1M0KTsKLQotCWlmICghZXJyb3IpCi0JCWFjcGlfdGFyZ2V0X3NsZWVwX3N0YXRlID0gQUNQSV9TVEFURV9TNDsKLQlyZXR1cm4gZXJyb3I7Ci19Ci0KLS8qCi0gKiBUaGUgZm9sbG93aW5nIGNhbGxiYWNrcyBhcmUgdXNlZCBpZiB0aGUgcHJlLUFDUEkgMi4wIHN1c3BlbmQgb3JkZXJpbmcgaGFzCi0gKiBiZWVuIHJlcXVlc3RlZC4KLSAqLwotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9oaWJlcm5hdGlvbl9vcHMgYWNwaV9oaWJlcm5hdGlvbl9vcHNfb2xkID0gewotCS5iZWdpbiA9IGFjcGlfaGliZXJuYXRpb25fYmVnaW5fb2xkLAotCS5lbmQgPSBhY3BpX3BtX2VuZCwKLQkucHJlX3NuYXBzaG90ID0gYWNwaV9wbV9kaXNhYmxlX2dwZXMsCi0JLmZpbmlzaCA9IGFjcGlfcG1fZmluaXNoLAotCS5wcmVwYXJlID0gYWNwaV9wbV9kaXNhYmxlX2dwZXMsCi0JLmVudGVyID0gYWNwaV9oaWJlcm5hdGlvbl9lbnRlciwKLQkubGVhdmUgPSBhY3BpX2hpYmVybmF0aW9uX2xlYXZlLAotCS5wcmVfcmVzdG9yZSA9IGFjcGlfcG1fZGlzYWJsZV9ncGVzLAotCS5yZXN0b3JlX2NsZWFudXAgPSBhY3BpX3BtX2VuYWJsZV9ncGVzLAotCS5yZWNvdmVyID0gYWNwaV9wbV9maW5pc2gsCi19OwotI2VuZGlmIC8qIENPTkZJR19ISUJFUk5BVElPTiAqLwotCi1pbnQgYWNwaV9zdXNwZW5kKHUzMiBhY3BpX3N0YXRlKQotewotCXN1c3BlbmRfc3RhdGVfdCBzdGF0ZXNbXSA9IHsKLQkJWzFdID0gUE1fU1VTUEVORF9TVEFOREJZLAotCQlbM10gPSBQTV9TVVNQRU5EX01FTSwKLQkJWzVdID0gUE1fU1VTUEVORF9NQVgKLQl9OwotCi0JaWYgKGFjcGlfc3RhdGUgPCA2ICYmIHN0YXRlc1thY3BpX3N0YXRlXSkKLQkJcmV0dXJuIHBtX3N1c3BlbmQoc3RhdGVzW2FjcGlfc3RhdGVdKTsKLQlpZiAoYWNwaV9zdGF0ZSA9PSA0KQotCQlyZXR1cm4gaGliZXJuYXRlKCk7Ci0JcmV0dXJuIC1FSU5WQUw7Ci19Ci0KLSNpZmRlZiBDT05GSUdfUE1fU0xFRVAKLS8qKgotICoJYWNwaV9wbV9kZXZpY2Vfc2xlZXBfc3RhdGUgLSByZXR1cm4gcHJlZmVycmVkIHBvd2VyIHN0YXRlIG9mIEFDUEkgZGV2aWNlCi0gKgkJaW4gdGhlIHN5c3RlbSBzbGVlcCBzdGF0ZSBnaXZlbiBieSAlYWNwaV90YXJnZXRfc2xlZXBfc3RhdGUKLSAqCUBkZXY6IGRldmljZSB0byBleGFtaW5lOyBpdHMgZHJpdmVyIG1vZGVsIHdha2V1cCBmbGFncyBjb250cm9sCi0gKgkJd2hldGhlciBpdCBzaG91bGQgYmUgYWJsZSB0byB3YWtlIHVwIHRoZSBzeXN0ZW0KLSAqCUBkX21pbl9wOiB1c2VkIHRvIHN0b3JlIHRoZSB1cHBlciBsaW1pdCBvZiBhbGxvd2VkIHN0YXRlcyByYW5nZQotICoJUmV0dXJuIHZhbHVlOiBwcmVmZXJyZWQgcG93ZXIgc3RhdGUgb2YgdGhlIGRldmljZSBvbiBzdWNjZXNzLCAtRU5PREVWIG9uCi0gKgkJZmFpbHVyZSAoaWUuIGlmIHRoZXJlJ3Mgbm8gJ3N0cnVjdCBhY3BpX2RldmljZScgZm9yIEBkZXYpCi0gKgotICoJRmluZCB0aGUgbG93ZXN0IHBvd2VyIChoaWdoZXN0IG51bWJlcikgQUNQSSBkZXZpY2UgcG93ZXIgc3RhdGUgdGhhdAotICoJZGV2aWNlIEBkZXYgY2FuIGJlIGluIHdoaWxlIHRoZSBzeXN0ZW0gaXMgaW4gdGhlIHNsZWVwIHN0YXRlIHJlcHJlc2VudGVkCi0gKglieSAlYWNwaV90YXJnZXRfc2xlZXBfc3RhdGUuICBJZiBAd2FrZSBpcyBub256ZXJvLCB0aGUgZGV2aWNlIHNob3VsZCBiZQotICoJYWJsZSB0byB3YWtlIHVwIHRoZSBzeXN0ZW0gZnJvbSB0aGlzIHNsZWVwIHN0YXRlLiAgSWYgQGRfbWluX3AgaXMgc2V0LAotICoJdGhlIGhpZ2hlc3QgcG93ZXIgKGxvd2VzdCBudW1iZXIpIGRldmljZSBwb3dlciBzdGF0ZSBvZiBAZGV2IGFsbG93ZWQKLSAqCWluIHRoaXMgc3lzdGVtIHNsZWVwIHN0YXRlIGlzIHN0b3JlZCBhdCB0aGUgbG9jYXRpb24gcG9pbnRlZCB0byBieSBpdC4KLSAqCi0gKglUaGUgY2FsbGVyIG11c3QgZW5zdXJlIHRoYXQgQGRldiBpcyB2YWxpZCBiZWZvcmUgdXNpbmcgdGhpcyBmdW5jdGlvbi4KLSAqCVRoZSBjYWxsZXIgaXMgYWxzbyByZXNwb25zaWJsZSBmb3IgZmlndXJpbmcgb3V0IGlmIHRoZSBkZXZpY2UgaXMKLSAqCXN1cHBvc2VkIHRvIGJlIGFibGUgdG8gd2FrZSB1cCB0aGUgc3lzdGVtIGFuZCBwYXNzaW5nIHRoaXMgaW5mb3JtYXRpb24KLSAqCXZpYSBAd2FrZS4KLSAqLwotCi1pbnQgYWNwaV9wbV9kZXZpY2Vfc2xlZXBfc3RhdGUoc3RydWN0IGRldmljZSAqZGV2LCBpbnQgKmRfbWluX3ApCi17Ci0JYWNwaV9oYW5kbGUgaGFuZGxlID0gREVWSUNFX0FDUElfSEFORExFKGRldik7Ci0Jc3RydWN0IGFjcGlfZGV2aWNlICphZGV2OwotCWNoYXIgYWNwaV9tZXRob2RbXSA9ICJfU3hEIjsKLQl1bnNpZ25lZCBsb25nIGxvbmcgZF9taW4sIGRfbWF4OwotCi0JaWYgKCFoYW5kbGUgfHwgQUNQSV9GQUlMVVJFKGFjcGlfYnVzX2dldF9kZXZpY2UoaGFuZGxlLCAmYWRldikpKSB7Ci0JCXByaW50ayhLRVJOX0RFQlVHICJBQ1BJIGhhbmRsZSBoYXMgbm8gY29udGV4dCFcbiIpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0KLQlhY3BpX21ldGhvZFsyXSA9ICcwJyArIGFjcGlfdGFyZ2V0X3NsZWVwX3N0YXRlOwotCS8qCi0JICogSWYgdGhlIHNsZWVwIHN0YXRlIGlzIFMwLCB3ZSB3aWxsIHJldHVybiBEMywgYnV0IGlmIHRoZSBkZXZpY2UgaGFzCi0JICogX1MwVywgd2Ugd2lsbCB1c2UgdGhlIHZhbHVlIGZyb20gX1MwVwotCSAqLwotCWRfbWluID0gQUNQSV9TVEFURV9EMDsKLQlkX21heCA9IEFDUElfU1RBVEVfRDM7Ci0KLQkvKgotCSAqIElmIHByZXNlbnQsIF9TeEQgbWV0aG9kcyByZXR1cm4gdGhlIG1pbmltdW0gRC1zdGF0ZSAoaGlnaGVzdCBwb3dlcgotCSAqIHN0YXRlKSB3ZSBjYW4gdXNlIGZvciB0aGUgY29ycmVzcG9uZGluZyBTLXN0YXRlcy4gIE90aGVyd2lzZSwgdGhlCi0JICogbWluaW11bSBELXN0YXRlIGlzIEQwIChBQ1BJIDMueCkuCi0JICoKLQkgKiBOT1RFOiBXZSByZWx5IG9uIGFjcGlfZXZhbHVhdGVfaW50ZWdlcigpIG5vdCBjbG9iYmVyaW5nIHRoZSBpbnRlZ2VyCi0JICogcHJvdmlkZWQgLS0gdGhhdCdzIG91ciBmYXVsdCByZWNvdmVyeSwgd2UgaWdub3JlIHJldHZhbC4KLQkgKi8KLQlpZiAoYWNwaV90YXJnZXRfc2xlZXBfc3RhdGUgPiBBQ1BJX1NUQVRFX1MwKQotCQlhY3BpX2V2YWx1YXRlX2ludGVnZXIoaGFuZGxlLCBhY3BpX21ldGhvZCwgTlVMTCwgJmRfbWluKTsKLQotCS8qCi0JICogSWYgX1BSVyBzYXlzIHdlIGNhbiB3YWtlIHVwIHRoZSBzeXN0ZW0gZnJvbSB0aGUgdGFyZ2V0IHNsZWVwIHN0YXRlLAotCSAqIHRoZSBELXN0YXRlIHJldHVybmVkIGJ5IF9TeEQgaXMgc3VmZmljaWVudCBmb3IgdGhhdCAod2UgYXNzdW1lIGEKLQkgKiB3YWtldXAtYXdhcmUgZHJpdmVyIGlmIHdha2UgaXMgc2V0KS4gIFN0aWxsLCBpZiBfU3hXIGV4aXN0cwotCSAqIChBQ1BJIDMueCksIGl0IHNob3VsZCByZXR1cm4gdGhlIG1heGltdW0gKGxvd2VzdCBwb3dlcikgRC1zdGF0ZSB0aGF0Ci0JICogY2FuIHdha2UgdGhlIHN5c3RlbS4gIF9TMFcgbWF5IGJlIHZhbGlkLCB0b28uCi0JICovCi0JaWYgKGFjcGlfdGFyZ2V0X3NsZWVwX3N0YXRlID09IEFDUElfU1RBVEVfUzAgfHwKLQkgICAgKGRldmljZV9tYXlfd2FrZXVwKGRldikgJiYgYWRldi0+d2FrZXVwLnN0YXRlLmVuYWJsZWQgJiYKLQkgICAgIGFkZXYtPndha2V1cC5zbGVlcF9zdGF0ZSA8PSBhY3BpX3RhcmdldF9zbGVlcF9zdGF0ZSkpIHsKLQkJYWNwaV9zdGF0dXMgc3RhdHVzOwotCi0JCWFjcGlfbWV0aG9kWzNdID0gJ1cnOwotCQlzdGF0dXMgPSBhY3BpX2V2YWx1YXRlX2ludGVnZXIoaGFuZGxlLCBhY3BpX21ldGhvZCwgTlVMTCwKLQkJCQkJCSZkX21heCk7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQkJZF9tYXggPSBkX21pbjsKLQkJfSBlbHNlIGlmIChkX21heCA8IGRfbWluKSB7Ci0JCQkvKiBXYXJuIHRoZSB1c2VyIG9mIHRoZSBicm9rZW4gRFNEVCAqLwotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiQUNQSTogV3JvbmcgdmFsdWUgZnJvbSAlc1xuIiwKLQkJCQlhY3BpX21ldGhvZCk7Ci0JCQkvKiBTYW5pdGl6ZSBpdCAqLwotCQkJZF9taW4gPSBkX21heDsKLQkJfQotCX0KLQotCWlmIChkX21pbl9wKQotCQkqZF9taW5fcCA9IGRfbWluOwotCXJldHVybiBkX21heDsKLX0KLQotLyoqCi0gKglhY3BpX3BtX2RldmljZV9zbGVlcF93YWtlIC0gZW5hYmxlIG9yIGRpc2FibGUgdGhlIHN5c3RlbSB3YWtlLXVwCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXBhYmlsaXR5IG9mIGdpdmVuIGRldmljZQotICoJQGRldjogZGV2aWNlIHRvIGhhbmRsZQotICoJQGVuYWJsZTogJ3RydWUnIC0gZW5hYmxlLCAnZmFsc2UnIC0gZGlzYWJsZSB0aGUgd2FrZS11cCBjYXBhYmlsaXR5Ci0gKi8KLWludCBhY3BpX3BtX2RldmljZV9zbGVlcF93YWtlKHN0cnVjdCBkZXZpY2UgKmRldiwgYm9vbCBlbmFibGUpCi17Ci0JYWNwaV9oYW5kbGUgaGFuZGxlOwotCXN0cnVjdCBhY3BpX2RldmljZSAqYWRldjsKLQotCWlmICghZGV2aWNlX21heV93YWtldXAoZGV2KSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQloYW5kbGUgPSBERVZJQ0VfQUNQSV9IQU5ETEUoZGV2KTsKLQlpZiAoIWhhbmRsZSB8fCBBQ1BJX0ZBSUxVUkUoYWNwaV9idXNfZ2V0X2RldmljZShoYW5kbGUsICZhZGV2KSkpIHsKLQkJcHJpbnRrKEtFUk5fREVCVUcgIkFDUEkgaGFuZGxlIGhhcyBubyBjb250ZXh0IVxuIik7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQotCXJldHVybiBlbmFibGUgPwotCQlhY3BpX2VuYWJsZV93YWtldXBfZGV2aWNlX3Bvd2VyKGFkZXYsIGFjcGlfdGFyZ2V0X3NsZWVwX3N0YXRlKSA6Ci0JCWFjcGlfZGlzYWJsZV93YWtldXBfZGV2aWNlX3Bvd2VyKGFkZXYpOwotfQotI2VuZGlmCi0KLXN0YXRpYyB2b2lkIGFjcGlfcG93ZXJfb2ZmX3ByZXBhcmUodm9pZCkKLXsKLQkvKiBQcmVwYXJlIHRvIHBvd2VyIG9mZiB0aGUgc3lzdGVtICovCi0JYWNwaV9zbGVlcF9wcmVwYXJlKEFDUElfU1RBVEVfUzUpOwotCWFjcGlfaHdfZGlzYWJsZV9hbGxfZ3BlcygpOwotfQotCi1zdGF0aWMgdm9pZCBhY3BpX3Bvd2VyX29mZih2b2lkKQotewotCS8qIGFjcGlfc2xlZXBfcHJlcGFyZShBQ1BJX1NUQVRFX1M1KSBzaG91bGQgaGF2ZSBhbHJlYWR5IGJlZW4gY2FsbGVkICovCi0JcHJpbnRrKCIlcyBjYWxsZWRcbiIsIF9fZnVuY19fKTsKLQlsb2NhbF9pcnFfZGlzYWJsZSgpOwotCWFjcGlfZW5hYmxlX3dha2V1cF9kZXZpY2UoQUNQSV9TVEFURV9TNSk7Ci0JYWNwaV9lbnRlcl9zbGVlcF9zdGF0ZShBQ1BJX1NUQVRFX1M1KTsKLX0KLQotaW50IF9faW5pdCBhY3BpX3NsZWVwX2luaXQodm9pZCkKLXsKLQlhY3BpX3N0YXR1cyBzdGF0dXM7Ci0JdTggdHlwZV9hLCB0eXBlX2I7Ci0jaWZkZWYgQ09ORklHX1NVU1BFTkQKLQlpbnQgaSA9IDA7Ci0KLQlkbWlfY2hlY2tfc3lzdGVtKGFjcGlzbGVlcF9kbWlfdGFibGUpOwotI2VuZGlmCi0KLQlpZiAoYWNwaV9kaXNhYmxlZCkKLQkJcmV0dXJuIDA7Ci0KLQlzbGVlcF9zdGF0ZXNbQUNQSV9TVEFURV9TMF0gPSAxOwotCXByaW50ayhLRVJOX0lORk8gUFJFRklYICIoc3VwcG9ydHMgUzAiKTsKLQotI2lmZGVmIENPTkZJR19TVVNQRU5ECi0JZm9yIChpID0gQUNQSV9TVEFURV9TMTsgaSA8IEFDUElfU1RBVEVfUzQ7IGkrKykgewotCQlzdGF0dXMgPSBhY3BpX2dldF9zbGVlcF90eXBlX2RhdGEoaSwgJnR5cGVfYSwgJnR5cGVfYik7Ci0JCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkgewotCQkJc2xlZXBfc3RhdGVzW2ldID0gMTsKLQkJCXByaW50aygiIFMlZCIsIGkpOwotCQl9Ci0JfQotCi0Jc3VzcGVuZF9zZXRfb3BzKG9sZF9zdXNwZW5kX29yZGVyaW5nID8KLQkJJmFjcGlfc3VzcGVuZF9vcHNfb2xkIDogJmFjcGlfc3VzcGVuZF9vcHMpOwotI2VuZGlmCi0KLSNpZmRlZiBDT05GSUdfSElCRVJOQVRJT04KLQlzdGF0dXMgPSBhY3BpX2dldF9zbGVlcF90eXBlX2RhdGEoQUNQSV9TVEFURV9TNCwgJnR5cGVfYSwgJnR5cGVfYik7Ci0JaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKSB7Ci0JCWhpYmVybmF0aW9uX3NldF9vcHMob2xkX3N1c3BlbmRfb3JkZXJpbmcgPwotCQkJJmFjcGlfaGliZXJuYXRpb25fb3BzX29sZCA6ICZhY3BpX2hpYmVybmF0aW9uX29wcyk7Ci0JCXNsZWVwX3N0YXRlc1tBQ1BJX1NUQVRFX1M0XSA9IDE7Ci0JCXByaW50aygiIFM0Iik7Ci0JCWlmICghbm9zaWdjaGVjaykgewotCQkJYWNwaV9nZXRfdGFibGVfYnlfaW5kZXgoQUNQSV9UQUJMRV9JTkRFWF9GQUNTLAotCQkJCShzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKiopJmZhY3MpOwotCQkJaWYgKGZhY3MpCi0JCQkJczRfaGFyZHdhcmVfc2lnbmF0dXJlID0KLQkJCQkJZmFjcy0+aGFyZHdhcmVfc2lnbmF0dXJlOwotCQl9Ci0JfQotI2VuZGlmCi0Jc3RhdHVzID0gYWNwaV9nZXRfc2xlZXBfdHlwZV9kYXRhKEFDUElfU1RBVEVfUzUsICZ0eXBlX2EsICZ0eXBlX2IpOwotCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkgewotCQlzbGVlcF9zdGF0ZXNbQUNQSV9TVEFURV9TNV0gPSAxOwotCQlwcmludGsoIiBTNSIpOwotCQlwbV9wb3dlcl9vZmZfcHJlcGFyZSA9IGFjcGlfcG93ZXJfb2ZmX3ByZXBhcmU7Ci0JCXBtX3Bvd2VyX29mZiA9IGFjcGlfcG93ZXJfb2ZmOwotCX0KLQlwcmludGsoIilcbiIpOwotCS8qCi0JICogUmVnaXN0ZXIgdGhlIHR0c19ub3RpZmllciB0byByZWJvb3Qgbm90aWZpZXIgbGlzdCBzbyB0aGF0IHRoZSBfVFRTCi0JICogb2JqZWN0IGNhbiBhbHNvIGJlIGV2YWx1YXRlZCB3aGVuIHRoZSBzeXN0ZW0gZW50ZXJzIFM1LgotCSAqLwotCXJlZ2lzdGVyX3JlYm9vdF9ub3RpZmllcigmdHRzX25vdGlmaWVyKTsKLQlyZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9zbGVlcC9wcm9jLmMgYi9kcml2ZXJzL2FjcGkvc2xlZXAvcHJvYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZGJjMjI3Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvYWNwaS9zbGVlcC9wcm9jLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MjYgKzAsMCBAQAotI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3N1c3BlbmQuaD4KLSNpbmNsdWRlIDxsaW51eC9iY2QuaD4KLSNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgotCi0jaW5jbHVkZSA8YWNwaS9hY3BpX2J1cy5oPgotI2luY2x1ZGUgPGFjcGkvYWNwaV9kcml2ZXJzLmg+Ci0KLSNpZmRlZiBDT05GSUdfWDg2Ci0jaW5jbHVkZSA8bGludXgvbWMxNDY4MThydGMuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSAic2xlZXAuaCIKLQotI2RlZmluZSBfQ09NUE9ORU5UCQlBQ1BJX1NZU1RFTV9DT01QT05FTlQKLQotLyoKLSAqIHRoaXMgZmlsZSBwcm92aWRlcyBzdXBwb3J0IGZvcjoKLSAqIC9wcm9jL2FjcGkvc2xlZXAKLSAqIC9wcm9jL2FjcGkvYWxhcm0KLSAqIC9wcm9jL2FjcGkvd2FrZXVwCi0gKi8KLQotQUNQSV9NT0RVTEVfTkFNRSgic2xlZXAiKQotI2lmZGVmCUNPTkZJR19BQ1BJX1BST0NGUwotc3RhdGljIGludCBhY3BpX3N5c3RlbV9zbGVlcF9zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqb2Zmc2V0KQotewotCWludCBpOwotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9zeXN0ZW1fc2xlZXBfc2VxX3Nob3ciKTsKLQotCWZvciAoaSA9IDA7IGkgPD0gQUNQSV9TVEFURV9TNTsgaSsrKSB7Ci0JCWlmIChzbGVlcF9zdGF0ZXNbaV0pIHsKLQkJCXNlcV9wcmludGYoc2VxLCAiUyVkICIsIGkpOwotCQl9Ci0JfQotCi0Jc2VxX3B1dHMoc2VxLCAiXG4iKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGFjcGlfc3lzdGVtX3NsZWVwX29wZW5fZnMoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0JcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIGFjcGlfc3lzdGVtX3NsZWVwX3NlcV9zaG93LCBQREUoaW5vZGUpLT5kYXRhKTsKLX0KLQotc3RhdGljIHNzaXplX3QKLWFjcGlfc3lzdGVtX3dyaXRlX3NsZWVwKHN0cnVjdCBmaWxlICpmaWxlLAotCQkJY29uc3QgY2hhciBfX3VzZXIgKiBidWZmZXIsIHNpemVfdCBjb3VudCwgbG9mZl90ICogcHBvcykKLXsKLQljaGFyIHN0clsxMl07Ci0JdTMyIHN0YXRlID0gMDsKLQlpbnQgZXJyb3IgPSAwOwotCi0JaWYgKGNvdW50ID4gc2l6ZW9mKHN0cikgLSAxKQotCQlnb3RvIERvbmU7Ci0JbWVtc2V0KHN0ciwgMCwgc2l6ZW9mKHN0cikpOwotCWlmIChjb3B5X2Zyb21fdXNlcihzdHIsIGJ1ZmZlciwgY291bnQpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQotCS8qIENoZWNrIGZvciBTNCBiaW9zIHJlcXVlc3QgKi8KLQlpZiAoIXN0cmNtcChzdHIsICI0YiIpKSB7Ci0JCWVycm9yID0gYWNwaV9zdXNwZW5kKDQpOwotCQlnb3RvIERvbmU7Ci0JfQotCXN0YXRlID0gc2ltcGxlX3N0cnRvdWwoc3RyLCBOVUxMLCAwKTsKLSNpZmRlZiBDT05GSUdfSElCRVJOQVRJT04KLQlpZiAoc3RhdGUgPT0gNCkgewotCQllcnJvciA9IGhpYmVybmF0ZSgpOwotCQlnb3RvIERvbmU7Ci0JfQotI2VuZGlmCi0JZXJyb3IgPSBhY3BpX3N1c3BlbmQoc3RhdGUpOwotICAgICAgRG9uZToKLQlyZXR1cm4gZXJyb3IgPyBlcnJvciA6IGNvdW50OwotfQotI2VuZGlmCQkJCS8qIENPTkZJR19BQ1BJX1BST0NGUyAqLwotCi0jaWYgZGVmaW5lZChDT05GSUdfUlRDX0RSVl9DTU9TKSB8fCBkZWZpbmVkKENPTkZJR19SVENfRFJWX0NNT1NfTU9EVUxFKSB8fCAhZGVmaW5lZChDT05GSUdfWDg2KQotLyogdXNlIC9zeXMvY2xhc3MvcnRjL3J0Y1gvd2FrZWFsYXJtIGluc3RlYWQ7IGl0J3Mgbm90IEFDUEktc3BlY2lmaWMgKi8KLSNlbHNlCi0jZGVmaW5lCUhBVkVfQUNQSV9MRUdBQ1lfQUxBUk0KLSNlbmRpZgotCi0jaWZkZWYJSEFWRV9BQ1BJX0xFR0FDWV9BTEFSTQotCi1zdGF0aWMgaW50IGFjcGlfc3lzdGVtX2FsYXJtX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICpvZmZzZXQpCi17Ci0JdTMyIHNlYywgbWluLCBocjsKLQl1MzIgZGF5LCBtbywgeXIsIGNlbnQgPSAwOwotCXVuc2lnbmVkIGNoYXIgcnRjX2NvbnRyb2wgPSAwOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX3N5c3RlbV9hbGFybV9zZXFfc2hvdyIpOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnJ0Y19sb2NrLCBmbGFncyk7Ci0KLQlzZWMgPSBDTU9TX1JFQUQoUlRDX1NFQ09ORFNfQUxBUk0pOwotCW1pbiA9IENNT1NfUkVBRChSVENfTUlOVVRFU19BTEFSTSk7Ci0JaHIgPSBDTU9TX1JFQUQoUlRDX0hPVVJTX0FMQVJNKTsKLQlydGNfY29udHJvbCA9IENNT1NfUkVBRChSVENfQ09OVFJPTCk7Ci0KLQkvKiBJZiB3ZSBldmVyIGdldCBhbiBGQUNQIHdpdGggcHJvcGVyIHZhbHVlcy4uLiAqLwotCWlmIChhY3BpX2dibF9GQURULmRheV9hbGFybSkKLQkJLyogQUNQSSBzcGVjOiBvbmx5IGxvdyA2IGl0cyBzaG91bGQgYmUgY2FyZWQgKi8KLQkJZGF5ID0gQ01PU19SRUFEKGFjcGlfZ2JsX0ZBRFQuZGF5X2FsYXJtKSAmIDB4M0Y7Ci0JZWxzZQotCQlkYXkgPSBDTU9TX1JFQUQoUlRDX0RBWV9PRl9NT05USCk7Ci0JaWYgKGFjcGlfZ2JsX0ZBRFQubW9udGhfYWxhcm0pCi0JCW1vID0gQ01PU19SRUFEKGFjcGlfZ2JsX0ZBRFQubW9udGhfYWxhcm0pOwotCWVsc2UKLQkJbW8gPSBDTU9TX1JFQUQoUlRDX01PTlRIKTsKLQlpZiAoYWNwaV9nYmxfRkFEVC5jZW50dXJ5KQotCQljZW50ID0gQ01PU19SRUFEKGFjcGlfZ2JsX0ZBRFQuY2VudHVyeSk7Ci0KLQl5ciA9IENNT1NfUkVBRChSVENfWUVBUik7Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZydGNfbG9jaywgZmxhZ3MpOwotCi0JaWYgKCEocnRjX2NvbnRyb2wgJiBSVENfRE1fQklOQVJZKSB8fCBSVENfQUxXQVlTX0JDRCkgewotCQlzZWMgPSBiY2QyYmluKHNlYyk7Ci0JCW1pbiA9IGJjZDJiaW4obWluKTsKLQkJaHIgPSBiY2QyYmluKGhyKTsKLQkJZGF5ID0gYmNkMmJpbihkYXkpOwotCQltbyA9IGJjZDJiaW4obW8pOwotCQl5ciA9IGJjZDJiaW4oeXIpOwotCQljZW50ID0gYmNkMmJpbihjZW50KTsKLQl9Ci0KLQkvKiB3ZSdyZSB0cnVzdGluZyB0aGUgRkFEVCAoc2VlIGFib3ZlKSAqLwotCWlmICghYWNwaV9nYmxfRkFEVC5jZW50dXJ5KQotCQkvKiBJZiB3ZSdyZSBub3QgdHJ1c3RpbmcgdGhlIEZBRFQsIHdlIHNob3VsZCBhdCBsZWFzdCBtYWtlIGl0Ci0JCSAqIHJpZ2h0IGZvciBfdGhpc18gY2VudHVyeS4uLiBlaG0sIHdoYXQgaXMgX3RoaXNfIGNlbnR1cnk/Ci0JCSAqCi0JCSAqIFRCRDoKLQkJICogIEFTQVA6IGZpbmQgcGllY2Ugb2YgY29kZSBpbiB0aGUga2VybmVsLCBlLmcuIHN0YXIgdHJhY2tlciBkcml2ZXIsCi0JCSAqICAgICAgICB3aGljaCB3ZSBjYW4gdHJ1c3QgdG8gZGV0ZXJtaW5lIHRoZSBjZW50dXJ5IGNvcnJlY3RseS4gQXRvbQotCQkgKiAgICAgICAgd2F0Y2ggZHJpdmVyIHdvdWxkIGJlIG5pY2UsIHRvby4uLgotCQkgKgotCQkgKiAgaWYgdGhhdCBoYXMgbm90IGhhcHBlbmVkLCBjaGFuZ2UgZm9yIGZpcnN0IHJlbGVhc2UgaW4gMjA1MDoKLQkJICogICAgICAgIGlmICh5cjw1MCkKLQkJICogICAgICAgICAgICAgICAgeXIgKz0gMjEwMDsKLQkJICogICAgICAgIGVsc2UKLQkJICogICAgICAgICAgICAgICAgeXIgKz0gMjAwMDsgICAvLyBjdXJyZW50IGxpbmUgb2YgY29kZQotCQkgKgotCQkgKiAgaWYgdGhhdCBoYXMgbm90IGhhcHBlbmVkIGVpdGhlciwgcGxlYXNlIGRvIG9uIDIwOTkvMTIvMzE6MjM6NTk6NTkKLQkJICogICAgICAgIHMvMjAwMC8yMTAwCi0JCSAqCi0JCSAqLwotCQl5ciArPSAyMDAwOwotCWVsc2UKLQkJeXIgKz0gY2VudCAqIDEwMDsKLQotCXNlcV9wcmludGYoc2VxLCAiJTQuNHUtIiwgeXIpOwotCShtbyA+IDEyKSA/IHNlcV9wdXRzKHNlcSwgIioqLSIpIDogc2VxX3ByaW50ZihzZXEsICIlMi4ydS0iLCBtbyk7Ci0JKGRheSA+IDMxKSA/IHNlcV9wdXRzKHNlcSwgIioqICIpIDogc2VxX3ByaW50ZihzZXEsICIlMi4ydSAiLCBkYXkpOwotCShociA+IDIzKSA/IHNlcV9wdXRzKHNlcSwgIioqOiIpIDogc2VxX3ByaW50ZihzZXEsICIlMi4ydToiLCBocik7Ci0JKG1pbiA+IDU5KSA/IHNlcV9wdXRzKHNlcSwgIioqOiIpIDogc2VxX3ByaW50ZihzZXEsICIlMi4ydToiLCBtaW4pOwotCShzZWMgPiA1OSkgPyBzZXFfcHV0cyhzZXEsICIqKlxuIikgOiBzZXFfcHJpbnRmKHNlcSwgIiUyLjJ1XG4iLCBzZWMpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgYWNwaV9zeXN0ZW1fYWxhcm1fb3Blbl9mcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgYWNwaV9zeXN0ZW1fYWxhcm1fc2VxX3Nob3csIFBERShpbm9kZSktPmRhdGEpOwotfQotCi1zdGF0aWMgaW50IGdldF9kYXRlX2ZpZWxkKGNoYXIgKipwLCB1MzIgKiB2YWx1ZSkKLXsKLQljaGFyICpuZXh0ID0gTlVMTDsKLQljaGFyICpzdHJpbmdfZW5kID0gTlVMTDsKLQlpbnQgcmVzdWx0ID0gLUVJTlZBTDsKLQotCS8qCi0JICogVHJ5IHRvIGZpbmQgZGVsaW1ldGVyLCBvbmx5IHRvIGluc2VydCBudWxsLiAgVGhlIGVuZCBvZiB0aGUKLQkgKiBzdHJpbmcgd29uJ3QgaGF2ZSBvbmUsIGJ1dCBpcyBzdGlsbCB2YWxpZC4KLQkgKi8KLQlpZiAoKnAgPT0gTlVMTCkKLQkJcmV0dXJuIHJlc3VsdDsKLQotCW5leHQgPSBzdHJwYnJrKCpwLCAiLSA6Iik7Ci0JaWYgKG5leHQpCi0JCSpuZXh0KysgPSAnXDAnOwotCi0JKnZhbHVlID0gc2ltcGxlX3N0cnRvdWwoKnAsICZzdHJpbmdfZW5kLCAxMCk7Ci0KLQkvKiBTaWduYWwgc3VjY2VzcyBpZiB3ZSBnb3QgYSBnb29kIGRpZ2l0ICovCi0JaWYgKHN0cmluZ19lbmQgIT0gKnApCi0JCXJlc3VsdCA9IDA7Ci0KLQlpZiAobmV4dCkKLQkJKnAgPSBuZXh0OwotCWVsc2UKLQkJKnAgPSBOVUxMOwotCi0JcmV0dXJuIHJlc3VsdDsKLX0KLQotLyogUmVhZCBhIHBvc3NpYmx5IEJDRCByZWdpc3RlciwgYWx3YXlzIHJldHVybiBiaW5hcnkgKi8KLXN0YXRpYyB1MzIgY21vc19iY2RfcmVhZChpbnQgb2Zmc2V0LCBpbnQgcnRjX2NvbnRyb2wpCi17Ci0JdTMyIHZhbCA9IENNT1NfUkVBRChvZmZzZXQpOwotCWlmICghKHJ0Y19jb250cm9sICYgUlRDX0RNX0JJTkFSWSkgfHwgUlRDX0FMV0FZU19CQ0QpCi0JCXZhbCA9IGJjZDJiaW4odmFsKTsKLQlyZXR1cm4gdmFsOwotfQotCi0vKiBXcml0ZSBiaW5hcnkgdmFsdWUgaW50byBwb3NzaWJseSBCQ0QgcmVnaXN0ZXIgKi8KLXN0YXRpYyB2b2lkIGNtb3NfYmNkX3dyaXRlKHUzMiB2YWwsIGludCBvZmZzZXQsIGludCBydGNfY29udHJvbCkKLXsKLQlpZiAoIShydGNfY29udHJvbCAmIFJUQ19ETV9CSU5BUlkpIHx8IFJUQ19BTFdBWVNfQkNEKQotCQl2YWwgPSBiaW4yYmNkKHZhbCk7Ci0JQ01PU19XUklURSh2YWwsIG9mZnNldCk7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90Ci1hY3BpX3N5c3RlbV93cml0ZV9hbGFybShzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJCWNvbnN0IGNoYXIgX191c2VyICogYnVmZmVyLCBzaXplX3QgY291bnQsIGxvZmZfdCAqIHBwb3MpCi17Ci0JaW50IHJlc3VsdCA9IDA7Ci0JY2hhciBhbGFybV9zdHJpbmdbMzBdID0geyAnXDAnIH07Ci0JY2hhciAqcCA9IGFsYXJtX3N0cmluZzsKLQl1MzIgc2VjLCBtaW4sIGhyLCBkYXksIG1vLCB5cjsKLQlpbnQgYWRqdXN0ID0gMDsKLQl1bnNpZ25lZCBjaGFyIHJ0Y19jb250cm9sID0gMDsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfc3lzdGVtX3dyaXRlX2FsYXJtIik7Ci0KLQlpZiAoY291bnQgPiBzaXplb2YoYWxhcm1fc3RyaW5nKSAtIDEpCi0JCXJldHVybl9WQUxVRSgtRUlOVkFMKTsKLQotCWlmIChjb3B5X2Zyb21fdXNlcihhbGFybV9zdHJpbmcsIGJ1ZmZlciwgY291bnQpKQotCQlyZXR1cm5fVkFMVUUoLUVGQVVMVCk7Ci0KLQlhbGFybV9zdHJpbmdbY291bnRdID0gJ1wwJzsKLQotCS8qIGNoZWNrIGZvciB0aW1lIGFkanVzdG1lbnQgKi8KLQlpZiAoYWxhcm1fc3RyaW5nWzBdID09ICcrJykgewotCQlwKys7Ci0JCWFkanVzdCA9IDE7Ci0JfQotCi0JaWYgKChyZXN1bHQgPSBnZXRfZGF0ZV9maWVsZCgmcCwgJnlyKSkpCi0JCWdvdG8gZW5kOwotCWlmICgocmVzdWx0ID0gZ2V0X2RhdGVfZmllbGQoJnAsICZtbykpKQotCQlnb3RvIGVuZDsKLQlpZiAoKHJlc3VsdCA9IGdldF9kYXRlX2ZpZWxkKCZwLCAmZGF5KSkpCi0JCWdvdG8gZW5kOwotCWlmICgocmVzdWx0ID0gZ2V0X2RhdGVfZmllbGQoJnAsICZocikpKQotCQlnb3RvIGVuZDsKLQlpZiAoKHJlc3VsdCA9IGdldF9kYXRlX2ZpZWxkKCZwLCAmbWluKSkpCi0JCWdvdG8gZW5kOwotCWlmICgocmVzdWx0ID0gZ2V0X2RhdGVfZmllbGQoJnAsICZzZWMpKSkKLQkJZ290byBlbmQ7Ci0KLQlzcGluX2xvY2tfaXJxKCZydGNfbG9jayk7Ci0KLQlydGNfY29udHJvbCA9IENNT1NfUkVBRChSVENfQ09OVFJPTCk7Ci0KLQlpZiAoYWRqdXN0KSB7Ci0JCXlyICs9IGNtb3NfYmNkX3JlYWQoUlRDX1lFQVIsIHJ0Y19jb250cm9sKTsKLQkJbW8gKz0gY21vc19iY2RfcmVhZChSVENfTU9OVEgsIHJ0Y19jb250cm9sKTsKLQkJZGF5ICs9IGNtb3NfYmNkX3JlYWQoUlRDX0RBWV9PRl9NT05USCwgcnRjX2NvbnRyb2wpOwotCQlociArPSBjbW9zX2JjZF9yZWFkKFJUQ19IT1VSUywgcnRjX2NvbnRyb2wpOwotCQltaW4gKz0gY21vc19iY2RfcmVhZChSVENfTUlOVVRFUywgcnRjX2NvbnRyb2wpOwotCQlzZWMgKz0gY21vc19iY2RfcmVhZChSVENfU0VDT05EUywgcnRjX2NvbnRyb2wpOwotCX0KLQotCXNwaW5fdW5sb2NrX2lycSgmcnRjX2xvY2spOwotCi0JaWYgKHNlYyA+IDU5KSB7Ci0JCW1pbiArPSBzZWMvNjA7Ci0JCXNlYyA9IHNlYyU2MDsKLQl9Ci0JaWYgKG1pbiA+IDU5KSB7Ci0JCWhyICs9IG1pbi82MDsKLQkJbWluID0gbWluJTYwOwotCX0KLQlpZiAoaHIgPiAyMykgewotCQlkYXkgKz0gaHIvMjQ7Ci0JCWhyID0gaHIlMjQ7Ci0JfQotCWlmIChkYXkgPiAzMSkgewotCQltbyArPSBkYXkvMzI7Ci0JCWRheSA9IGRheSUzMjsKLQl9Ci0JaWYgKG1vID4gMTIpIHsKLQkJeXIgKz0gbW8vMTM7Ci0JCW1vID0gbW8lMTM7Ci0JfQotCi0Jc3Bpbl9sb2NrX2lycSgmcnRjX2xvY2spOwotCS8qCi0JICogRGlzYWJsZSBhbGFybSBpbnRlcnJ1cHQgYmVmb3JlIHNldHRpbmcgYWxhcm0gdGltZXIgb3IgZWxzZQotCSAqIHdoZW4gQUNQSV9FVkVOVF9SVEMgaXMgZW5hYmxlZCwgYSBzcHVyaW91cyBBQ1BJIGludGVycnVwdCBvY2N1cnMKLQkgKi8KLQlydGNfY29udHJvbCAmPSB+UlRDX0FJRTsKLQlDTU9TX1dSSVRFKHJ0Y19jb250cm9sLCBSVENfQ09OVFJPTCk7Ci0JQ01PU19SRUFEKFJUQ19JTlRSX0ZMQUdTKTsKLQotCS8qIHdyaXRlIHRoZSBmaWVsZHMgdGhlIHJ0YyBrbm93cyBhYm91dCAqLwotCWNtb3NfYmNkX3dyaXRlKGhyLCBSVENfSE9VUlNfQUxBUk0sIHJ0Y19jb250cm9sKTsKLQljbW9zX2JjZF93cml0ZShtaW4sIFJUQ19NSU5VVEVTX0FMQVJNLCBydGNfY29udHJvbCk7Ci0JY21vc19iY2Rfd3JpdGUoc2VjLCBSVENfU0VDT05EU19BTEFSTSwgcnRjX2NvbnRyb2wpOwotCi0JLyoKLQkgKiBJZiB0aGUgc3lzdGVtIHN1cHBvcnRzIGFuIGVuaGFuY2VkIGFsYXJtIGl0IHdpbGwgaGF2ZSBub24temVybwotCSAqIG9mZnNldHMgaW50byB0aGUgQ01PUyBSQU0gaGVyZSAtLSB3aGljaCBmb3Igc29tZSByZWFzb24gYXJlIHBvaW50aW5nCi0JICogdG8gdGhlIFJUQyBhcmVhIG9mIG1lbW9yeS4KLQkgKi8KLQlpZiAoYWNwaV9nYmxfRkFEVC5kYXlfYWxhcm0pCi0JCWNtb3NfYmNkX3dyaXRlKGRheSwgYWNwaV9nYmxfRkFEVC5kYXlfYWxhcm0sIHJ0Y19jb250cm9sKTsKLQlpZiAoYWNwaV9nYmxfRkFEVC5tb250aF9hbGFybSkKLQkJY21vc19iY2Rfd3JpdGUobW8sIGFjcGlfZ2JsX0ZBRFQubW9udGhfYWxhcm0sIHJ0Y19jb250cm9sKTsKLQlpZiAoYWNwaV9nYmxfRkFEVC5jZW50dXJ5KSB7Ci0JCWlmIChhZGp1c3QpCi0JCQl5ciArPSBjbW9zX2JjZF9yZWFkKGFjcGlfZ2JsX0ZBRFQuY2VudHVyeSwgcnRjX2NvbnRyb2wpICogMTAwOwotCQljbW9zX2JjZF93cml0ZSh5ciAvIDEwMCwgYWNwaV9nYmxfRkFEVC5jZW50dXJ5LCBydGNfY29udHJvbCk7Ci0JfQotCS8qIGVuYWJsZSB0aGUgcnRjIGFsYXJtIGludGVycnVwdCAqLwotCXJ0Y19jb250cm9sIHw9IFJUQ19BSUU7Ci0JQ01PU19XUklURShydGNfY29udHJvbCwgUlRDX0NPTlRST0wpOwotCUNNT1NfUkVBRChSVENfSU5UUl9GTEFHUyk7Ci0KLQlzcGluX3VubG9ja19pcnEoJnJ0Y19sb2NrKTsKLQotCWFjcGlfY2xlYXJfZXZlbnQoQUNQSV9FVkVOVF9SVEMpOwotCWFjcGlfZW5hYmxlX2V2ZW50KEFDUElfRVZFTlRfUlRDLCAwKTsKLQotCSpwcG9zICs9IGNvdW50OwotCi0JcmVzdWx0ID0gMDsKLSAgICAgIGVuZDoKLQlyZXR1cm5fVkFMVUUocmVzdWx0ID8gcmVzdWx0IDogY291bnQpOwotfQotI2VuZGlmCQkJCS8qIEhBVkVfQUNQSV9MRUdBQ1lfQUxBUk0gKi8KLQotZXh0ZXJuIHN0cnVjdCBsaXN0X2hlYWQgYWNwaV93YWtldXBfZGV2aWNlX2xpc3Q7Ci1leHRlcm4gc3BpbmxvY2tfdCBhY3BpX2RldmljZV9sb2NrOwotCi1zdGF0aWMgaW50Ci1hY3BpX3N5c3RlbV93YWtldXBfZGV2aWNlX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICpvZmZzZXQpCi17Ci0Jc3RydWN0IGxpc3RfaGVhZCAqbm9kZSwgKm5leHQ7Ci0KLQlzZXFfcHJpbnRmKHNlcSwgIkRldmljZVx0Uy1zdGF0ZVx0ICBTdGF0dXMgICBTeXNmcyBub2RlXG4iKTsKLQotCXNwaW5fbG9jaygmYWNwaV9kZXZpY2VfbG9jayk7Ci0JbGlzdF9mb3JfZWFjaF9zYWZlKG5vZGUsIG5leHQsICZhY3BpX3dha2V1cF9kZXZpY2VfbGlzdCkgewotCQlzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldiA9Ci0JCSAgICBjb250YWluZXJfb2Yobm9kZSwgc3RydWN0IGFjcGlfZGV2aWNlLCB3YWtldXBfbGlzdCk7Ci0JCXN0cnVjdCBkZXZpY2UgKmxkZXY7Ci0KLQkJaWYgKCFkZXYtPndha2V1cC5mbGFncy52YWxpZCkKLQkJCWNvbnRpbnVlOwotCQlzcGluX3VubG9jaygmYWNwaV9kZXZpY2VfbG9jayk7Ci0KLQkJbGRldiA9IGFjcGlfZ2V0X3BoeXNpY2FsX2RldmljZShkZXYtPmhhbmRsZSk7Ci0JCXNlcV9wcmludGYoc2VxLCAiJXNcdCAgUyVkXHQlYyUtOHMgICIsCi0JCQkgICBkZXYtPnBucC5idXNfaWQsCi0JCQkgICAodTMyKSBkZXYtPndha2V1cC5zbGVlcF9zdGF0ZSwKLQkJCSAgIGRldi0+d2FrZXVwLmZsYWdzLnJ1bl93YWtlID8gJyonIDogJyAnLAotCQkJICAgZGV2LT53YWtldXAuc3RhdGUuZW5hYmxlZCA/ICJlbmFibGVkIiA6ICJkaXNhYmxlZCIpOwotCQlpZiAobGRldikKLQkJCXNlcV9wcmludGYoc2VxLCAiJXM6JXMiLAotCQkJCSAgIGxkZXYtPmJ1cyA/IGxkZXYtPmJ1cy0+bmFtZSA6ICJuby1idXMiLAotCQkJCSAgIGRldl9uYW1lKGxkZXYpKTsKLQkJc2VxX3ByaW50ZihzZXEsICJcbiIpOwotCQlwdXRfZGV2aWNlKGxkZXYpOwotCi0JCXNwaW5fbG9jaygmYWNwaV9kZXZpY2VfbG9jayk7Ci0JfQotCXNwaW5fdW5sb2NrKCZhY3BpX2RldmljZV9sb2NrKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgcGh5c2ljYWxfZGV2aWNlX2VuYWJsZV93YWtldXAoc3RydWN0IGFjcGlfZGV2aWNlICphZGV2KQotewotCXN0cnVjdCBkZXZpY2UgKmRldiA9IGFjcGlfZ2V0X3BoeXNpY2FsX2RldmljZShhZGV2LT5oYW5kbGUpOwotCi0JaWYgKGRldiAmJiBkZXZpY2VfY2FuX3dha2V1cChkZXYpKQotCQlkZXZpY2Vfc2V0X3dha2V1cF9lbmFibGUoZGV2LCBhZGV2LT53YWtldXAuc3RhdGUuZW5hYmxlZCk7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90Ci1hY3BpX3N5c3RlbV93cml0ZV93YWtldXBfZGV2aWNlKHN0cnVjdCBmaWxlICpmaWxlLAotCQkJCWNvbnN0IGNoYXIgX191c2VyICogYnVmZmVyLAotCQkJCXNpemVfdCBjb3VudCwgbG9mZl90ICogcHBvcykKLXsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpub2RlLCAqbmV4dDsKLQljaGFyIHN0cmJ1Zls1XTsKLQljaGFyIHN0cls1XSA9ICIiOwotCWludCBsZW4gPSBjb3VudDsKLQlzdHJ1Y3QgYWNwaV9kZXZpY2UgKmZvdW5kX2RldiA9IE5VTEw7Ci0KLQlpZiAobGVuID4gNCkKLQkJbGVuID0gNDsKLQotCWlmIChjb3B5X2Zyb21fdXNlcihzdHJidWYsIGJ1ZmZlciwgbGVuKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0Jc3RyYnVmW2xlbl0gPSAnXDAnOwotCXNzY2FuZihzdHJidWYsICIlcyIsIHN0cik7Ci0KLQlzcGluX2xvY2soJmFjcGlfZGV2aWNlX2xvY2spOwotCWxpc3RfZm9yX2VhY2hfc2FmZShub2RlLCBuZXh0LCAmYWNwaV93YWtldXBfZGV2aWNlX2xpc3QpIHsKLQkJc3RydWN0IGFjcGlfZGV2aWNlICpkZXYgPQotCQkgICAgY29udGFpbmVyX29mKG5vZGUsIHN0cnVjdCBhY3BpX2RldmljZSwgd2FrZXVwX2xpc3QpOwotCQlpZiAoIWRldi0+d2FrZXVwLmZsYWdzLnZhbGlkKQotCQkJY29udGludWU7Ci0KLQkJaWYgKCFzdHJuY21wKGRldi0+cG5wLmJ1c19pZCwgc3RyLCA0KSkgewotCQkJZGV2LT53YWtldXAuc3RhdGUuZW5hYmxlZCA9Ci0JCQkgICAgZGV2LT53YWtldXAuc3RhdGUuZW5hYmxlZCA/IDAgOiAxOwotCQkJZm91bmRfZGV2ID0gZGV2OwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JaWYgKGZvdW5kX2RldikgewotCQlwaHlzaWNhbF9kZXZpY2VfZW5hYmxlX3dha2V1cChmb3VuZF9kZXYpOwotCQlsaXN0X2Zvcl9lYWNoX3NhZmUobm9kZSwgbmV4dCwgJmFjcGlfd2FrZXVwX2RldmljZV9saXN0KSB7Ci0JCQlzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldiA9IGNvbnRhaW5lcl9vZihub2RlLAotCQkJCQkJCSAgICAgICBzdHJ1Y3QKLQkJCQkJCQkgICAgICAgYWNwaV9kZXZpY2UsCi0JCQkJCQkJICAgICAgIHdha2V1cF9saXN0KTsKLQotCQkJaWYgKChkZXYgIT0gZm91bmRfZGV2KSAmJgotCQkJICAgIChkZXYtPndha2V1cC5ncGVfbnVtYmVyID09Ci0JCQkgICAgIGZvdW5kX2Rldi0+d2FrZXVwLmdwZV9udW1iZXIpCi0JCQkgICAgJiYgKGRldi0+d2FrZXVwLmdwZV9kZXZpY2UgPT0KLQkJCQlmb3VuZF9kZXYtPndha2V1cC5ncGVfZGV2aWNlKSkgewotCQkJCXByaW50ayhLRVJOX1dBUk5JTkcKLQkJCQkgICAgICAgIkFDUEk6ICclcycgYW5kICclcycgaGF2ZSB0aGUgc2FtZSBHUEUsICIKLQkJCQkgICAgICAgImNhbid0IGRpc2FibGUvZW5hYmxlIG9uZSBzZXBlcmF0ZWx5XG4iLAotCQkJCSAgICAgICBkZXYtPnBucC5idXNfaWQsIGZvdW5kX2Rldi0+cG5wLmJ1c19pZCk7Ci0JCQkJZGV2LT53YWtldXAuc3RhdGUuZW5hYmxlZCA9Ci0JCQkJICAgIGZvdW5kX2Rldi0+d2FrZXVwLnN0YXRlLmVuYWJsZWQ7Ci0JCQkJcGh5c2ljYWxfZGV2aWNlX2VuYWJsZV93YWtldXAoZGV2KTsKLQkJCX0KLQkJfQotCX0KLQlzcGluX3VubG9jaygmYWNwaV9kZXZpY2VfbG9jayk7Ci0JcmV0dXJuIGNvdW50OwotfQotCi1zdGF0aWMgaW50Ci1hY3BpX3N5c3RlbV93YWtldXBfZGV2aWNlX29wZW5fZnMoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0JcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIGFjcGlfc3lzdGVtX3dha2V1cF9kZXZpY2Vfc2VxX3Nob3csCi0JCQkgICBQREUoaW5vZGUpLT5kYXRhKTsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYWNwaV9zeXN0ZW1fd2FrZXVwX2RldmljZV9mb3BzID0gewotCS5vd25lciA9IFRISVNfTU9EVUxFLAotCS5vcGVuID0gYWNwaV9zeXN0ZW1fd2FrZXVwX2RldmljZV9vcGVuX2ZzLAotCS5yZWFkID0gc2VxX3JlYWQsCi0JLndyaXRlID0gYWNwaV9zeXN0ZW1fd3JpdGVfd2FrZXVwX2RldmljZSwKLQkubGxzZWVrID0gc2VxX2xzZWVrLAotCS5yZWxlYXNlID0gc2luZ2xlX3JlbGVhc2UsCi19OwotCi0jaWZkZWYJQ09ORklHX0FDUElfUFJPQ0ZTCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhY3BpX3N5c3RlbV9zbGVlcF9mb3BzID0gewotCS5vd25lciA9IFRISVNfTU9EVUxFLAotCS5vcGVuID0gYWNwaV9zeXN0ZW1fc2xlZXBfb3Blbl9mcywKLQkucmVhZCA9IHNlcV9yZWFkLAotCS53cml0ZSA9IGFjcGlfc3lzdGVtX3dyaXRlX3NsZWVwLAotCS5sbHNlZWsgPSBzZXFfbHNlZWssCi0JLnJlbGVhc2UgPSBzaW5nbGVfcmVsZWFzZSwKLX07Ci0jZW5kaWYJCQkJLyogQ09ORklHX0FDUElfUFJPQ0ZTICovCi0KLSNpZmRlZglIQVZFX0FDUElfTEVHQUNZX0FMQVJNCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhY3BpX3N5c3RlbV9hbGFybV9mb3BzID0gewotCS5vd25lciA9IFRISVNfTU9EVUxFLAotCS5vcGVuID0gYWNwaV9zeXN0ZW1fYWxhcm1fb3Blbl9mcywKLQkucmVhZCA9IHNlcV9yZWFkLAotCS53cml0ZSA9IGFjcGlfc3lzdGVtX3dyaXRlX2FsYXJtLAotCS5sbHNlZWsgPSBzZXFfbHNlZWssCi0JLnJlbGVhc2UgPSBzaW5nbGVfcmVsZWFzZSwKLX07Ci0KLXN0YXRpYyB1MzIgcnRjX2hhbmRsZXIodm9pZCAqY29udGV4dCkKLXsKLQlhY3BpX2NsZWFyX2V2ZW50KEFDUElfRVZFTlRfUlRDKTsKLQlhY3BpX2Rpc2FibGVfZXZlbnQoQUNQSV9FVkVOVF9SVEMsIDApOwotCi0JcmV0dXJuIEFDUElfSU5URVJSVVBUX0hBTkRMRUQ7Ci19Ci0jZW5kaWYJCQkJLyogSEFWRV9BQ1BJX0xFR0FDWV9BTEFSTSAqLwotCi1zdGF0aWMgaW50IF9faW5pdCBhY3BpX3NsZWVwX3Byb2NfaW5pdCh2b2lkKQotewotCWlmIChhY3BpX2Rpc2FibGVkKQotCQlyZXR1cm4gMDsKLQotI2lmZGVmCUNPTkZJR19BQ1BJX1BST0NGUwotCS8qICdzbGVlcCcgW1IvV10gKi8KLQlwcm9jX2NyZWF0ZSgic2xlZXAiLCBTX0lGUkVHIHwgU19JUlVHTyB8IFNfSVdVU1IsCi0JCSAgICBhY3BpX3Jvb3RfZGlyLCAmYWNwaV9zeXN0ZW1fc2xlZXBfZm9wcyk7Ci0jZW5kaWYJCQkJLyogQ09ORklHX0FDUElfUFJPQ0ZTICovCi0KLSNpZmRlZglIQVZFX0FDUElfTEVHQUNZX0FMQVJNCi0JLyogJ2FsYXJtJyBbUi9XXSAqLwotCXByb2NfY3JlYXRlKCJhbGFybSIsIFNfSUZSRUcgfCBTX0lSVUdPIHwgU19JV1VTUiwKLQkJICAgIGFjcGlfcm9vdF9kaXIsICZhY3BpX3N5c3RlbV9hbGFybV9mb3BzKTsKLQotCWFjcGlfaW5zdGFsbF9maXhlZF9ldmVudF9oYW5kbGVyKEFDUElfRVZFTlRfUlRDLCBydGNfaGFuZGxlciwgTlVMTCk7Ci0JLyoKLQkgKiBEaXNhYmxlIHRoZSBSVEMgZXZlbnQgYWZ0ZXIgaW5zdGFsbGluZyBSVEMgaGFuZGxlci4KLQkgKiBPbmx5IHdoZW4gUlRDIGFsYXJtIGlzIHNldCB3aWxsIGl0IGJlIGVuYWJsZWQuCi0JICovCi0JYWNwaV9jbGVhcl9ldmVudChBQ1BJX0VWRU5UX1JUQyk7Ci0JYWNwaV9kaXNhYmxlX2V2ZW50KEFDUElfRVZFTlRfUlRDLCAwKTsKLSNlbmRpZgkJCQkvKiBIQVZFX0FDUElfTEVHQUNZX0FMQVJNICovCi0KLQkvKiAnd2FrZXVwIGRldmljZScgW1IvV10gKi8KLQlwcm9jX2NyZWF0ZSgid2FrZXVwIiwgU19JRlJFRyB8IFNfSVJVR08gfCBTX0lXVVNSLAotCQkgICAgYWNwaV9yb290X2RpciwgJmFjcGlfc3lzdGVtX3dha2V1cF9kZXZpY2VfZm9wcyk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotbGF0ZV9pbml0Y2FsbChhY3BpX3NsZWVwX3Byb2NfaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvc2xlZXAvd2FrZXVwLmMgYi9kcml2ZXJzL2FjcGkvc2xlZXAvd2FrZXVwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlYTRjMjMuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9hY3BpL3NsZWVwL3dha2V1cC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTczICswLDAgQEAKLS8qCi0gKiB3YWtldXAuYyAtIHN1cHBvcnQgd2FrZXVwIGRldmljZXMKLSAqIENvcHlyaWdodCAoQykgMjAwNCBMaSBTaGFvaHVhIDxzaGFvaHVhLmxpQGludGVsLmNvbT4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KLSNpbmNsdWRlIDxhY3BpL2FjcGlfZHJpdmVycy5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8YWNwaS9hY2V2ZW50cy5oPgotI2luY2x1ZGUgInNsZWVwLmgiCi0KLSNkZWZpbmUgX0NPTVBPTkVOVAkJQUNQSV9TWVNURU1fQ09NUE9ORU5UCi1BQ1BJX01PRFVMRV9OQU1FKCJ3YWtldXBfZGV2aWNlcyIpCi0KLWV4dGVybiBzdHJ1Y3QgbGlzdF9oZWFkIGFjcGlfd2FrZXVwX2RldmljZV9saXN0OwotZXh0ZXJuIHNwaW5sb2NrX3QgYWNwaV9kZXZpY2VfbG9jazsKLQotLyoqCi0gKiBhY3BpX2VuYWJsZV93YWtldXBfZGV2aWNlX3ByZXAgLSBwcmVwYXJlIHdha2V1cCBkZXZpY2VzCi0gKglAc2xlZXBfc3RhdGU6CUFDUEkgc3RhdGUKLSAqIEVuYWJsZSBhbGwgd2FrdXAgZGV2aWNlcyBwb3dlciBpZiB0aGUgZGV2aWNlcycgd2FrZXVwIGxldmVsCi0gKiBpcyBoaWdoZXIgdGhhbiByZXF1ZXN0ZWQgc2xlZXAgbGV2ZWwKLSAqLwotCi12b2lkIGFjcGlfZW5hYmxlX3dha2V1cF9kZXZpY2VfcHJlcCh1OCBzbGVlcF9zdGF0ZSkKLXsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpub2RlLCAqbmV4dDsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfZW5hYmxlX3dha2V1cF9kZXZpY2VfcHJlcCIpOwotCi0Jc3Bpbl9sb2NrKCZhY3BpX2RldmljZV9sb2NrKTsKLQlsaXN0X2Zvcl9lYWNoX3NhZmUobm9kZSwgbmV4dCwgJmFjcGlfd2FrZXVwX2RldmljZV9saXN0KSB7Ci0JCXN0cnVjdCBhY3BpX2RldmljZSAqZGV2ID0gY29udGFpbmVyX29mKG5vZGUsCi0JCQkJCQkgICAgICAgc3RydWN0IGFjcGlfZGV2aWNlLAotCQkJCQkJICAgICAgIHdha2V1cF9saXN0KTsKLQotCQlpZiAoIWRldi0+d2FrZXVwLmZsYWdzLnZhbGlkIHx8Ci0JCSAgICAhZGV2LT53YWtldXAuc3RhdGUuZW5hYmxlZCB8fAotCQkgICAgKHNsZWVwX3N0YXRlID4gKHUzMikgZGV2LT53YWtldXAuc2xlZXBfc3RhdGUpKQotCQkJY29udGludWU7Ci0KLQkJc3Bpbl91bmxvY2soJmFjcGlfZGV2aWNlX2xvY2spOwotCQlhY3BpX2VuYWJsZV93YWtldXBfZGV2aWNlX3Bvd2VyKGRldiwgc2xlZXBfc3RhdGUpOwotCQlzcGluX2xvY2soJmFjcGlfZGV2aWNlX2xvY2spOwotCX0KLQlzcGluX3VubG9jaygmYWNwaV9kZXZpY2VfbG9jayk7Ci19Ci0KLS8qKgotICogYWNwaV9lbmFibGVfd2FrZXVwX2RldmljZSAtIGVuYWJsZSB3YWtldXAgZGV2aWNlcwotICoJQHNsZWVwX3N0YXRlOglBQ1BJIHN0YXRlCi0gKiBFbmFibGUgYWxsIHdha3VwIGRldmljZXMncyBHUEUKLSAqLwotdm9pZCBhY3BpX2VuYWJsZV93YWtldXBfZGV2aWNlKHU4IHNsZWVwX3N0YXRlKQotewotCXN0cnVjdCBsaXN0X2hlYWQgKm5vZGUsICpuZXh0OwotCi0JLyogCi0JICogQ2F1dGlvbjogdGhpcyByb3V0aW5lIG11c3QgYmUgaW52b2tlZCB3aGVuIGludGVycnVwdCBpcyBkaXNhYmxlZCAKLQkgKiBSZWZlciBBQ1BJMi4wOiBQMjEyCi0JICovCi0JQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9lbmFibGVfd2FrZXVwX2RldmljZSIpOwotCXNwaW5fbG9jaygmYWNwaV9kZXZpY2VfbG9jayk7Ci0JbGlzdF9mb3JfZWFjaF9zYWZlKG5vZGUsIG5leHQsICZhY3BpX3dha2V1cF9kZXZpY2VfbGlzdCkgewotCQlzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldiA9Ci0JCQljb250YWluZXJfb2Yobm9kZSwgc3RydWN0IGFjcGlfZGV2aWNlLCB3YWtldXBfbGlzdCk7Ci0KLQkJaWYgKCFkZXYtPndha2V1cC5mbGFncy52YWxpZCkKLQkJCWNvbnRpbnVlOwotCi0JCS8qIElmIHVzZXJzIHdhbnQgdG8gZGlzYWJsZSBydW4td2FrZSBHUEUsCi0JCSAqIHdlIG9ubHkgZGlzYWJsZSBpdCBmb3Igd2FrZSBhbmQgbGVhdmUgaXQgZm9yIHJ1bnRpbWUKLQkJICovCi0JCWlmICgoIWRldi0+d2FrZXVwLnN0YXRlLmVuYWJsZWQgJiYgIWRldi0+d2FrZXVwLmZsYWdzLnByZXBhcmVkKQotCQkgICAgfHwgc2xlZXBfc3RhdGUgPiAodTMyKSBkZXYtPndha2V1cC5zbGVlcF9zdGF0ZSkgewotCQkJaWYgKGRldi0+d2FrZXVwLmZsYWdzLnJ1bl93YWtlKSB7Ci0JCQkJc3Bpbl91bmxvY2soJmFjcGlfZGV2aWNlX2xvY2spOwotCQkJCS8qIHNldF9ncGVfdHlwZSB3aWxsIGRpc2FibGUgR1BFLCBsZWF2ZSBpdCBsaWtlIHRoYXQgKi8KLQkJCQlhY3BpX3NldF9ncGVfdHlwZShkZXYtPndha2V1cC5ncGVfZGV2aWNlLAotCQkJCQkJICBkZXYtPndha2V1cC5ncGVfbnVtYmVyLAotCQkJCQkJICBBQ1BJX0dQRV9UWVBFX1JVTlRJTUUpOwotCQkJCXNwaW5fbG9jaygmYWNwaV9kZXZpY2VfbG9jayk7Ci0JCQl9Ci0JCQljb250aW51ZTsKLQkJfQotCQlzcGluX3VubG9jaygmYWNwaV9kZXZpY2VfbG9jayk7Ci0JCWlmICghZGV2LT53YWtldXAuZmxhZ3MucnVuX3dha2UpCi0JCQlhY3BpX2VuYWJsZV9ncGUoZGV2LT53YWtldXAuZ3BlX2RldmljZSwKLQkJCQkJZGV2LT53YWtldXAuZ3BlX251bWJlcik7Ci0JCXNwaW5fbG9jaygmYWNwaV9kZXZpY2VfbG9jayk7Ci0JfQotCXNwaW5fdW5sb2NrKCZhY3BpX2RldmljZV9sb2NrKTsKLX0KLQotLyoqCi0gKiBhY3BpX2Rpc2FibGVfd2FrZXVwX2RldmljZSAtIGRpc2FibGUgZGV2aWNlcycgd2FrZXVwIGNhcGFiaWxpdHkKLSAqCUBzbGVlcF9zdGF0ZToJQUNQSSBzdGF0ZQotICogRGlzYWJsZSBhbGwgd2FrdXAgZGV2aWNlcydzIEdQRSBhbmQgd2FrZXVwIGNhcGFiaWxpdHkKLSAqLwotdm9pZCBhY3BpX2Rpc2FibGVfd2FrZXVwX2RldmljZSh1OCBzbGVlcF9zdGF0ZSkKLXsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpub2RlLCAqbmV4dDsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfZGlzYWJsZV93YWtldXBfZGV2aWNlIik7Ci0KLQlzcGluX2xvY2soJmFjcGlfZGV2aWNlX2xvY2spOwotCWxpc3RfZm9yX2VhY2hfc2FmZShub2RlLCBuZXh0LCAmYWNwaV93YWtldXBfZGV2aWNlX2xpc3QpIHsKLQkJc3RydWN0IGFjcGlfZGV2aWNlICpkZXYgPQotCQkJY29udGFpbmVyX29mKG5vZGUsIHN0cnVjdCBhY3BpX2RldmljZSwgd2FrZXVwX2xpc3QpOwotCi0JCWlmICghZGV2LT53YWtldXAuZmxhZ3MudmFsaWQpCi0JCQljb250aW51ZTsKLQotCQlpZiAoKCFkZXYtPndha2V1cC5zdGF0ZS5lbmFibGVkICYmICFkZXYtPndha2V1cC5mbGFncy5wcmVwYXJlZCkKLQkJICAgIHx8IHNsZWVwX3N0YXRlID4gKHUzMikgZGV2LT53YWtldXAuc2xlZXBfc3RhdGUpIHsKLQkJCWlmIChkZXYtPndha2V1cC5mbGFncy5ydW5fd2FrZSkgewotCQkJCXNwaW5fdW5sb2NrKCZhY3BpX2RldmljZV9sb2NrKTsKLQkJCQlhY3BpX3NldF9ncGVfdHlwZShkZXYtPndha2V1cC5ncGVfZGV2aWNlLAotCQkJCQkJICBkZXYtPndha2V1cC5ncGVfbnVtYmVyLAotCQkJCQkJICBBQ1BJX0dQRV9UWVBFX1dBS0VfUlVOKTsKLQkJCQkvKiBSZS1lbmFibGUgaXQsIHNpbmNlIHNldF9ncGVfdHlwZSB3aWxsIGRpc2FibGUgaXQgKi8KLQkJCQlhY3BpX2VuYWJsZV9ncGUoZGV2LT53YWtldXAuZ3BlX2RldmljZSwKLQkJCQkJCWRldi0+d2FrZXVwLmdwZV9udW1iZXIpOwotCQkJCXNwaW5fbG9jaygmYWNwaV9kZXZpY2VfbG9jayk7Ci0JCQl9Ci0JCQljb250aW51ZTsKLQkJfQotCi0JCXNwaW5fdW5sb2NrKCZhY3BpX2RldmljZV9sb2NrKTsKLQkJYWNwaV9kaXNhYmxlX3dha2V1cF9kZXZpY2VfcG93ZXIoZGV2KTsKLQkJLyogTmV2ZXIgZGlzYWJsZSBydW4td2FrZSBHUEUgKi8KLQkJaWYgKCFkZXYtPndha2V1cC5mbGFncy5ydW5fd2FrZSkgewotCQkJYWNwaV9kaXNhYmxlX2dwZShkZXYtPndha2V1cC5ncGVfZGV2aWNlLAotCQkJCQkgZGV2LT53YWtldXAuZ3BlX251bWJlcik7Ci0JCQlhY3BpX2NsZWFyX2dwZShkZXYtPndha2V1cC5ncGVfZGV2aWNlLAotCQkJCSAgICAgICBkZXYtPndha2V1cC5ncGVfbnVtYmVyLCBBQ1BJX05PVF9JU1IpOwotCQl9Ci0JCXNwaW5fbG9jaygmYWNwaV9kZXZpY2VfbG9jayk7Ci0JfQotCXNwaW5fdW5sb2NrKCZhY3BpX2RldmljZV9sb2NrKTsKLX0KLQotc3RhdGljIGludCBfX2luaXQgYWNwaV93YWtldXBfZGV2aWNlX2luaXQodm9pZCkKLXsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpub2RlLCAqbmV4dDsKLQotCWlmIChhY3BpX2Rpc2FibGVkKQotCQlyZXR1cm4gMDsKLQotCXNwaW5fbG9jaygmYWNwaV9kZXZpY2VfbG9jayk7Ci0JbGlzdF9mb3JfZWFjaF9zYWZlKG5vZGUsIG5leHQsICZhY3BpX3dha2V1cF9kZXZpY2VfbGlzdCkgewotCQlzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldiA9IGNvbnRhaW5lcl9vZihub2RlLAotCQkJCQkJICAgICAgIHN0cnVjdCBhY3BpX2RldmljZSwKLQkJCQkJCSAgICAgICB3YWtldXBfbGlzdCk7Ci0JCS8qIEluIGNhc2UgdXNlciBkb2Vzbid0IGxvYWQgYnV0dG9uIGRyaXZlciAqLwotCQlpZiAoIWRldi0+d2FrZXVwLmZsYWdzLnJ1bl93YWtlIHx8IGRldi0+d2FrZXVwLnN0YXRlLmVuYWJsZWQpCi0JCQljb250aW51ZTsKLQkJc3Bpbl91bmxvY2soJmFjcGlfZGV2aWNlX2xvY2spOwotCQlhY3BpX3NldF9ncGVfdHlwZShkZXYtPndha2V1cC5ncGVfZGV2aWNlLAotCQkJCSAgZGV2LT53YWtldXAuZ3BlX251bWJlciwKLQkJCQkgIEFDUElfR1BFX1RZUEVfV0FLRV9SVU4pOwotCQlhY3BpX2VuYWJsZV9ncGUoZGV2LT53YWtldXAuZ3BlX2RldmljZSwKLQkJCQlkZXYtPndha2V1cC5ncGVfbnVtYmVyKTsKLQkJZGV2LT53YWtldXAuc3RhdGUuZW5hYmxlZCA9IDE7Ci0JCXNwaW5fbG9jaygmYWNwaV9kZXZpY2VfbG9jayk7Ci0JfQotCXNwaW5fdW5sb2NrKCZhY3BpX2RldmljZV9sb2NrKTsKLQlyZXR1cm4gMDsKLX0KLQotbGF0ZV9pbml0Y2FsbChhY3BpX3dha2V1cF9kZXZpY2VfaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvc3lzdGVtLmMgYi9kcml2ZXJzL2FjcGkvc3lzdGVtLmMKaW5kZXggNmU0MTA3Zi4uMzkxZDAzNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3N5c3RlbS5jCisrKyBiL2RyaXZlcnMvYWNwaS9zeXN0ZW0uYwpAQCAtMTkyLDY1ICsxOTIsNiBAQAogfTsKIHN0YXRpYyBzdHJ1Y3Qga29ial9hdHRyaWJ1dGUgKmNvdW50ZXJfYXR0cnM7CiAKLXN0YXRpYyBpbnQgY291bnRfbnVtX2dwZXModm9pZCkKLXsKLQlpbnQgY291bnQgPSAwOwotCXN0cnVjdCBhY3BpX2dwZV94cnVwdF9pbmZvICpncGVfeHJ1cHRfaW5mbzsKLQlzdHJ1Y3QgYWNwaV9ncGVfYmxvY2tfaW5mbyAqZ3BlX2Jsb2NrOwotCWFjcGlfY3B1X2ZsYWdzIGZsYWdzOwotCi0JZmxhZ3MgPSBhY3BpX29zX2FjcXVpcmVfbG9jayhhY3BpX2dibF9ncGVfbG9jayk7Ci0KLQlncGVfeHJ1cHRfaW5mbyA9IGFjcGlfZ2JsX2dwZV94cnVwdF9saXN0X2hlYWQ7Ci0Jd2hpbGUgKGdwZV94cnVwdF9pbmZvKSB7Ci0JCWdwZV9ibG9jayA9IGdwZV94cnVwdF9pbmZvLT5ncGVfYmxvY2tfbGlzdF9oZWFkOwotCQl3aGlsZSAoZ3BlX2Jsb2NrKSB7Ci0JCQljb3VudCArPSBncGVfYmxvY2stPnJlZ2lzdGVyX2NvdW50ICoKLQkJCSAgICBBQ1BJX0dQRV9SRUdJU1RFUl9XSURUSDsKLQkJCWdwZV9ibG9jayA9IGdwZV9ibG9jay0+bmV4dDsKLQkJfQotCQlncGVfeHJ1cHRfaW5mbyA9IGdwZV94cnVwdF9pbmZvLT5uZXh0OwotCX0KLQlhY3BpX29zX3JlbGVhc2VfbG9jayhhY3BpX2dibF9ncGVfbG9jaywgZmxhZ3MpOwotCi0JcmV0dXJuIGNvdW50OwotfQotCi1zdGF0aWMgaW50IGdldF9ncGVfZGV2aWNlKGludCBpbmRleCwgYWNwaV9oYW5kbGUgKmhhbmRsZSkKLXsKLQlzdHJ1Y3QgYWNwaV9ncGVfeHJ1cHRfaW5mbyAqZ3BlX3hydXB0X2luZm87Ci0Jc3RydWN0IGFjcGlfZ3BlX2Jsb2NrX2luZm8gKmdwZV9ibG9jazsKLQlhY3BpX2NwdV9mbGFncyBmbGFnczsKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZTsKLQotCWZsYWdzID0gYWNwaV9vc19hY3F1aXJlX2xvY2soYWNwaV9nYmxfZ3BlX2xvY2spOwotCi0JZ3BlX3hydXB0X2luZm8gPSBhY3BpX2dibF9ncGVfeHJ1cHRfbGlzdF9oZWFkOwotCXdoaWxlIChncGVfeHJ1cHRfaW5mbykgewotCQlncGVfYmxvY2sgPSBncGVfeHJ1cHRfaW5mby0+Z3BlX2Jsb2NrX2xpc3RfaGVhZDsKLQkJbm9kZSA9IGdwZV9ibG9jay0+bm9kZTsKLQkJd2hpbGUgKGdwZV9ibG9jaykgewotCQkJaW5kZXggLT0gZ3BlX2Jsb2NrLT5yZWdpc3Rlcl9jb3VudCAqCi0JCQkgICAgQUNQSV9HUEVfUkVHSVNURVJfV0lEVEg7Ci0JCQlpZiAoaW5kZXggPCAwKSB7Ci0JCQkJYWNwaV9vc19yZWxlYXNlX2xvY2soYWNwaV9nYmxfZ3BlX2xvY2ssIGZsYWdzKTsKLQkJCQkvKiByZXR1cm4gTlVMTCBpZiBpdCdzIEZBRFQgR1BFICovCi0JCQkJaWYgKG5vZGUtPnR5cGUgIT0gQUNQSV9UWVBFX0RFVklDRSkKLQkJCQkJKmhhbmRsZSA9IE5VTEw7Ci0JCQkJZWxzZQotCQkJCQkqaGFuZGxlID0gbm9kZTsKLQkJCQlyZXR1cm4gMDsKLQkJCX0KLQkJCW5vZGUgPSBncGVfYmxvY2stPm5vZGU7Ci0JCQlncGVfYmxvY2sgPSBncGVfYmxvY2stPm5leHQ7Ci0JCX0KLQkJZ3BlX3hydXB0X2luZm8gPSBncGVfeHJ1cHRfaW5mby0+bmV4dDsKLQl9Ci0JYWNwaV9vc19yZWxlYXNlX2xvY2soYWNwaV9nYmxfZ3BlX2xvY2ssIGZsYWdzKTsKLQotCXJldHVybiAtRU5PREVWOwotfQotCiBzdGF0aWMgdm9pZCBkZWxldGVfZ3BlX2F0dHJfYXJyYXkodm9pZCkKIHsKIAlzdHJ1Y3QgZXZlbnRfY291bnRlciAqdG1wID0gYWxsX2NvdW50ZXJzOwpAQCAtMzA5LDcgKzI1MCw3IEBACiAJCWdvdG8gZW5kOwogCiAJaWYgKGluZGV4IDwgbnVtX2dwZXMpIHsKLQkJcmVzdWx0ID0gZ2V0X2dwZV9kZXZpY2UoaW5kZXgsIGhhbmRsZSk7CisJCXJlc3VsdCA9IGFjcGlfZ2V0X2dwZV9kZXZpY2UoaW5kZXgsIGhhbmRsZSk7CiAJCWlmIChyZXN1bHQpIHsKIAkJCUFDUElfRVhDRVBUSU9OKChBRV9JTkZPLCBBRV9OT1RfRk9VTkQsCiAJCQkJIkludmFsaWQgR1BFIDB4JXhcbiIsIGluZGV4KSk7CkBAIC00MzYsNyArMzc3LDcgQEAKIAlpZiAoYWxsX2NvdW50ZXJzKQogCQlyZXR1cm47CiAKLQludW1fZ3BlcyA9IGNvdW50X251bV9ncGVzKCk7CisJbnVtX2dwZXMgPSBhY3BpX2N1cnJlbnRfZ3BlX2NvdW50OwogCW51bV9jb3VudGVycyA9IG51bV9ncGVzICsgQUNQSV9OVU1fRklYRURfRVZFTlRTICsgTlVNX0NPVU5URVJTX0VYVFJBOwogCiAJYWxsX2F0dHJzID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGF0dHJpYnV0ZSAqKSAqIChudW1fY291bnRlcnMgKyAxKSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS90YWJsZXMvTWFrZWZpbGUgYi9kcml2ZXJzL2FjcGkvdGFibGVzL01ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Mzg1ZWZhLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvYWNwaS90YWJsZXMvTWFrZWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLSMKLSMgTWFrZWZpbGUgZm9yIGFsbCBMaW51eCBBQ1BJIGludGVycHJldGVyIHN1YmRpcmVjdG9yaWVzCi0jCi0KLW9iai15IDo9IHRieGZhY2UubyB0Ymluc3RhbC5vIHRidXRpbHMubyB0YmZpbmQubyB0YmZhZHQubyB0Ynhmcm9vdC5vCi0KLUVYVFJBX0NGTEFHUyArPSAkKEFDUElfQ0ZMQUdTKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3RhYmxlcy90YmZhZHQuYyBiL2RyaXZlcnMvYWNwaS90YWJsZXMvdGJmYWR0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4MTcxNTguLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9hY3BpL3RhYmxlcy90YmZhZHQuYworKysgL2Rldi9udWxsCkBAIC0xLDQ3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogTW9kdWxlIE5hbWU6IHRiZmFkdCAgIC0gRkFEVCB0YWJsZSB1dGlsaXRpZXMKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA4LCBJbnRlbCBDb3JwLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAotICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgYXQgbWluaW11bSBhIGRpc2NsYWltZXIKLSAqICAgIHN1YnN0YW50aWFsbHkgc2ltaWxhciB0byB0aGUgIk5PIFdBUlJBTlRZIiBkaXNjbGFpbWVyIGJlbG93Ci0gKiAgICAoIkRpc2NsYWltZXIiKSBhbmQgYW55IHJlZGlzdHJpYnV0aW9uIG11c3QgYmUgY29uZGl0aW9uZWQgdXBvbgotICogICAgaW5jbHVkaW5nIGEgc3Vic3RhbnRpYWxseSBzaW1pbGFyIERpc2NsYWltZXIgcmVxdWlyZW1lbnQgZm9yIGZ1cnRoZXIKLSAqICAgIGJpbmFyeSByZWRpc3RyaWJ1dGlvbi4KLSAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcwotICogICAgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICogU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBOTyBXQVJSQU5UWQotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCi0gKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUwotICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcKLSAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQotICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgotICovCi0KLSNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KLSNpbmNsdWRlIDxhY3BpL2FjdGFibGVzLmg+Ci0KLSNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX1RBQkxFUwotQUNQSV9NT0RVTEVfTkFNRSgidGJmYWR0IikKLQotLyogTG9jYWwgcHJvdG90eXBlcyAqLwotc3RhdGljIHZvaWQgaW5saW5lCi1hY3BpX3RiX2luaXRfZ2VuZXJpY19hZGRyZXNzKHN0cnVjdCBhY3BpX2dlbmVyaWNfYWRkcmVzcyAqZ2VuZXJpY19hZGRyZXNzLAotCQkJICAgICB1OCBieXRlX3dpZHRoLCB1NjQgYWRkcmVzcyk7Ci0KLXN0YXRpYyB2b2lkIGFjcGlfdGJfY29udmVydF9mYWR0KHZvaWQpOwotCi1zdGF0aWMgdm9pZCBhY3BpX3RiX3ZhbGlkYXRlX2ZhZHQodm9pZCk7Ci0KLS8qIFRhYmxlIGZvciBjb252ZXJzaW9uIG9mIEZBRFQgdG8gY29tbW9uIGludGVybmFsIGZvcm1hdCBhbmQgRkFEVCB2YWxpZGF0aW9uICovCi0KLXR5cGVkZWYgc3RydWN0IGFjcGlfZmFkdF9pbmZvIHsKLQljaGFyICpuYW1lOwotCXU4IHRhcmdldDsKLQl1OCBzb3VyY2U7Ci0JdTggbGVuZ3RoOwotCXU4IHR5cGU7Ci0KLX0gYWNwaV9mYWR0X2luZm87Ci0KLSNkZWZpbmUgQUNQSV9GQURUX1JFUVVJUkVEICAgICAgICAgIDEKLSNkZWZpbmUgQUNQSV9GQURUX1NFUEFSQVRFX0xFTkdUSCAgIDIKLQotc3RhdGljIHN0cnVjdCBhY3BpX2ZhZHRfaW5mbyBmYWR0X2luZm9fdGFibGVbXSA9IHsKLQl7IlBtMWFFdmVudEJsb2NrIiwgQUNQSV9GQURUX09GRlNFVCh4cG0xYV9ldmVudF9ibG9jayksCi0JIEFDUElfRkFEVF9PRkZTRVQocG0xYV9ldmVudF9ibG9jayksCi0JIEFDUElfRkFEVF9PRkZTRVQocG0xX2V2ZW50X2xlbmd0aCksIEFDUElfRkFEVF9SRVFVSVJFRH0sCi0KLQl7IlBtMWJFdmVudEJsb2NrIiwgQUNQSV9GQURUX09GRlNFVCh4cG0xYl9ldmVudF9ibG9jayksCi0JIEFDUElfRkFEVF9PRkZTRVQocG0xYl9ldmVudF9ibG9jayksCi0JIEFDUElfRkFEVF9PRkZTRVQocG0xX2V2ZW50X2xlbmd0aCksIDB9LAotCi0JeyJQbTFhQ29udHJvbEJsb2NrIiwgQUNQSV9GQURUX09GRlNFVCh4cG0xYV9jb250cm9sX2Jsb2NrKSwKLQkgQUNQSV9GQURUX09GRlNFVChwbTFhX2NvbnRyb2xfYmxvY2spLAotCSBBQ1BJX0ZBRFRfT0ZGU0VUKHBtMV9jb250cm9sX2xlbmd0aCksIEFDUElfRkFEVF9SRVFVSVJFRH0sCi0KLQl7IlBtMWJDb250cm9sQmxvY2siLCBBQ1BJX0ZBRFRfT0ZGU0VUKHhwbTFiX2NvbnRyb2xfYmxvY2spLAotCSBBQ1BJX0ZBRFRfT0ZGU0VUKHBtMWJfY29udHJvbF9ibG9jayksCi0JIEFDUElfRkFEVF9PRkZTRVQocG0xX2NvbnRyb2xfbGVuZ3RoKSwgMH0sCi0KLQl7IlBtMkNvbnRyb2xCbG9jayIsIEFDUElfRkFEVF9PRkZTRVQoeHBtMl9jb250cm9sX2Jsb2NrKSwKLQkgQUNQSV9GQURUX09GRlNFVChwbTJfY29udHJvbF9ibG9jayksCi0JIEFDUElfRkFEVF9PRkZTRVQocG0yX2NvbnRyb2xfbGVuZ3RoKSwgQUNQSV9GQURUX1NFUEFSQVRFX0xFTkdUSH0sCi0KLQl7IlBtVGltZXJCbG9jayIsIEFDUElfRkFEVF9PRkZTRVQoeHBtX3RpbWVyX2Jsb2NrKSwKLQkgQUNQSV9GQURUX09GRlNFVChwbV90aW1lcl9ibG9jayksCi0JIEFDUElfRkFEVF9PRkZTRVQocG1fdGltZXJfbGVuZ3RoKSwgQUNQSV9GQURUX1JFUVVJUkVEfSwKLQotCXsiR3BlMEJsb2NrIiwgQUNQSV9GQURUX09GRlNFVCh4Z3BlMF9ibG9jayksCi0JIEFDUElfRkFEVF9PRkZTRVQoZ3BlMF9ibG9jayksCi0JIEFDUElfRkFEVF9PRkZTRVQoZ3BlMF9ibG9ja19sZW5ndGgpLCBBQ1BJX0ZBRFRfU0VQQVJBVEVfTEVOR1RIfSwKLQotCXsiR3BlMUJsb2NrIiwgQUNQSV9GQURUX09GRlNFVCh4Z3BlMV9ibG9jayksCi0JIEFDUElfRkFEVF9PRkZTRVQoZ3BlMV9ibG9jayksCi0JIEFDUElfRkFEVF9PRkZTRVQoZ3BlMV9ibG9ja19sZW5ndGgpLCBBQ1BJX0ZBRFRfU0VQQVJBVEVfTEVOR1RIfQotfTsKLQotI2RlZmluZSBBQ1BJX0ZBRFRfSU5GT19FTlRSSUVTICAgICAgICAoc2l6ZW9mIChmYWR0X2luZm9fdGFibGUpIC8gc2l6ZW9mIChzdHJ1Y3QgYWNwaV9mYWR0X2luZm8pKQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX3RiX2luaXRfZ2VuZXJpY19hZGRyZXNzCi0gKgotICogUEFSQU1FVEVSUzogIGdlbmVyaWNfYWRkcmVzcyAgICAgLSBHQVMgc3RydWN0IHRvIGJlIGluaXRpYWxpemVkCi0gKiAgICAgICAgICAgICAgYnl0ZV93aWR0aCAgICAgICAgICAtIFdpZHRoIG9mIHRoaXMgcmVnaXN0ZXIKLSAqICAgICAgICAgICAgICBBZGRyZXNzICAgICAgICAgICAgIC0gQWRkcmVzcyBvZiB0aGUgcmVnaXN0ZXIKLSAqCi0gKiBSRVRVUk46ICAgICAgTm9uZQotICoKLSAqIERFU0NSSVBUSU9OOiBJbml0aWFsaXplIGEgR2VuZXJpYyBBZGRyZXNzIFN0cnVjdHVyZSAoR0FTKQotICogICAgICAgICAgICAgIFNlZSB0aGUgQUNQSSBzcGVjaWZpY2F0aW9uIGZvciBhIGZ1bGwgZGVzY3JpcHRpb24gYW5kCi0gKiAgICAgICAgICAgICAgZGVmaW5pdGlvbiBvZiB0aGlzIHN0cnVjdHVyZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgdm9pZCBpbmxpbmUKLWFjcGlfdGJfaW5pdF9nZW5lcmljX2FkZHJlc3Moc3RydWN0IGFjcGlfZ2VuZXJpY19hZGRyZXNzICpnZW5lcmljX2FkZHJlc3MsCi0JCQkgICAgIHU4IGJ5dGVfd2lkdGgsIHU2NCBhZGRyZXNzKQotewotCi0JLyoKLQkgKiBUaGUgNjQtYml0IEFkZHJlc3MgZmllbGQgaXMgbm9uLWFsaWduZWQgaW4gdGhlIGJ5dGUgcGFja2VkCi0JICogR0FTIHN0cnVjdC4KLQkgKi8KLQlBQ1BJX01PVkVfNjRfVE9fNjQoJmdlbmVyaWNfYWRkcmVzcy0+YWRkcmVzcywgJmFkZHJlc3MpOwotCi0JLyogQWxsIG90aGVyIGZpZWxkcyBhcmUgYnl0ZS13aWRlICovCi0KLQlnZW5lcmljX2FkZHJlc3MtPnNwYWNlX2lkID0gQUNQSV9BRFJfU1BBQ0VfU1lTVEVNX0lPOwotCWdlbmVyaWNfYWRkcmVzcy0+Yml0X3dpZHRoID0gYnl0ZV93aWR0aCA8PCAzOwotCWdlbmVyaWNfYWRkcmVzcy0+Yml0X29mZnNldCA9IDA7Ci0JZ2VuZXJpY19hZGRyZXNzLT5hY2Nlc3Nfd2lkdGggPSAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX3RiX3BhcnNlX2ZhZHQKLSAqCi0gKiBQQVJBTUVURVJTOiAgdGFibGVfaW5kZXggICAgICAgICAtIEluZGV4IGZvciB0aGUgRkFEVAotICogICAgICAgICAgICAgIEZsYWdzICAgICAgICAgICAgICAgLSBGbGFncwotICoKLSAqIFJFVFVSTjogICAgICBOb25lCi0gKgotICogREVTQ1JJUFRJT046IEluaXRpYWxpemUgdGhlIEZBRFQsIERTRFQgYW5kIEZBQ1MgdGFibGVzCi0gKiAgICAgICAgICAgICAgKEZBRFQgY29udGFpbnMgdGhlIGFkZHJlc3NlcyBvZiB0aGUgRFNEVCBhbmQgRkFDUykKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi12b2lkIGFjcGlfdGJfcGFyc2VfZmFkdCh1MzIgdGFibGVfaW5kZXgsIHU4IGZsYWdzKQotewotCXUzMiBsZW5ndGg7Ci0Jc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICp0YWJsZTsKLQotCS8qCi0JICogVGhlIEZBRFQgaGFzIG11bHRpcGxlIHZlcnNpb25zIHdpdGggZGlmZmVyZW50IGxlbmd0aHMsCi0JICogYW5kIGl0IGNvbnRhaW5zIHBvaW50ZXJzIHRvIGJvdGggdGhlIERTRFQgYW5kIEZBQ1MgdGFibGVzLgotCSAqCi0JICogR2V0IGEgbG9jYWwgY29weSBvZiB0aGUgRkFEVCBhbmQgY29udmVydCBpdCB0byBhIGNvbW1vbiBmb3JtYXQKLQkgKiBNYXAgZW50aXJlIEZBRFQsIGFzc3VtZWQgdG8gYmUgc21hbGxlciB0aGFuIG9uZSBwYWdlLgotCSAqLwotCWxlbmd0aCA9IGFjcGlfZ2JsX3Jvb3RfdGFibGVfbGlzdC50YWJsZXNbdGFibGVfaW5kZXhdLmxlbmd0aDsKLQotCXRhYmxlID0KLQkgICAgYWNwaV9vc19tYXBfbWVtb3J5KGFjcGlfZ2JsX3Jvb3RfdGFibGVfbGlzdC50YWJsZXNbdGFibGVfaW5kZXhdLgotCQkJICAgICAgIGFkZHJlc3MsIGxlbmd0aCk7Ci0JaWYgKCF0YWJsZSkgewotCQlyZXR1cm47Ci0JfQotCi0JLyoKLQkgKiBWYWxpZGF0ZSB0aGUgRkFEVCBjaGVja3N1bSBiZWZvcmUgd2UgY29weSB0aGUgdGFibGUuIElnbm9yZQotCSAqIGNoZWNrc3VtIGVycm9yIGFzIHdlIHdhbnQgdG8gdHJ5IHRvIGdldCB0aGUgRFNEVCBhbmQgRkFDUy4KLQkgKi8KLQkodm9pZClhY3BpX3RiX3ZlcmlmeV9jaGVja3N1bSh0YWJsZSwgbGVuZ3RoKTsKLQotCS8qIE9idGFpbiBhIGxvY2FsIGNvcHkgb2YgdGhlIEZBRFQgaW4gY29tbW9uIEFDUEkgMi4wKyBmb3JtYXQgKi8KLQotCWFjcGlfdGJfY3JlYXRlX2xvY2FsX2ZhZHQodGFibGUsIGxlbmd0aCk7Ci0KLQkvKiBBbGwgZG9uZSB3aXRoIHRoZSByZWFsIEZBRFQsIHVubWFwIGl0ICovCi0KLQlhY3BpX29zX3VubWFwX21lbW9yeSh0YWJsZSwgbGVuZ3RoKTsKLQotCS8qIE9idGFpbiB0aGUgRFNEVCBhbmQgRkFDUyB0YWJsZXMgdmlhIHRoZWlyIGFkZHJlc3NlcyB3aXRoaW4gdGhlIEZBRFQgKi8KLQotCWFjcGlfdGJfaW5zdGFsbF90YWJsZSgoYWNwaV9waHlzaWNhbF9hZGRyZXNzKSBhY3BpX2dibF9GQURULlhkc2R0LAotCQkJICAgICAgZmxhZ3MsIEFDUElfU0lHX0RTRFQsIEFDUElfVEFCTEVfSU5ERVhfRFNEVCk7Ci0KLQlhY3BpX3RiX2luc3RhbGxfdGFibGUoKGFjcGlfcGh5c2ljYWxfYWRkcmVzcykgYWNwaV9nYmxfRkFEVC5YZmFjcywKLQkJCSAgICAgIGZsYWdzLCBBQ1BJX1NJR19GQUNTLCBBQ1BJX1RBQkxFX0lOREVYX0ZBQ1MpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX3RiX2NyZWF0ZV9sb2NhbF9mYWR0Ci0gKgotICogUEFSQU1FVEVSUzogIFRhYmxlICAgICAgICAgICAgICAgLSBQb2ludGVyIHRvIEJJT1MgRkFEVAotICogICAgICAgICAgICAgIExlbmd0aCAgICAgICAgICAgICAgLSBMZW5ndGggb2YgdGhlIHRhYmxlCi0gKgotICogUkVUVVJOOiAgICAgIE5vbmUKLSAqCi0gKiBERVNDUklQVElPTjogR2V0IGEgbG9jYWwgY29weSBvZiB0aGUgRkFEVCBhbmQgY29udmVydCBpdCB0byBhIGNvbW1vbiBmb3JtYXQuCi0gKiAgICAgICAgICAgICAgUGVyZm9ybXMgdmFsaWRhdGlvbiBvbiBzb21lIGltcG9ydGFudCBGQURUIGZpZWxkcy4KLSAqCi0gKiBOT1RFOiAgICAgICAgV2UgY3JlYXRlIGEgbG9jYWwgY29weSBvZiB0aGUgRkFEVCByZWdhcmRsZXNzIG9mIHRoZSB2ZXJzaW9uLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXZvaWQgYWNwaV90Yl9jcmVhdGVfbG9jYWxfZmFkdChzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKnRhYmxlLCB1MzIgbGVuZ3RoKQotewotCi0JLyoKLQkgKiBDaGVjayBpZiB0aGUgRkFEVCBpcyBsYXJnZXIgdGhhbiB0aGUgbGFyZ2VzdCB0YWJsZSB0aGF0IHdlIGV4cGVjdAotCSAqICh0aGUgQUNQSSAyLjAvMy4wIHZlcnNpb24pLiBJZiBzbywgdHJ1bmNhdGUgdGhlIHRhYmxlLCBhbmQgaXNzdWUKLQkgKiBhIHdhcm5pbmcuCi0JICovCi0JaWYgKGxlbmd0aCA+IHNpemVvZihzdHJ1Y3QgYWNwaV90YWJsZV9mYWR0KSkgewotCQlBQ1BJX1dBUk5JTkcoKEFFX0lORk8sCi0JCQkgICAgICAiRkFEVCAocmV2aXNpb24gJXUpIGlzIGxvbmdlciB0aGFuIEFDUEkgMi4wIHZlcnNpb24sIHRydW5jYXRpbmcgbGVuZ3RoIDB4JVggdG8gMHglelgiLAotCQkJICAgICAgdGFibGUtPnJldmlzaW9uLCAodW5zaWduZWQpbGVuZ3RoLAotCQkJICAgICAgc2l6ZW9mKHN0cnVjdCBhY3BpX3RhYmxlX2ZhZHQpKSk7Ci0JfQotCi0JLyogQ2xlYXIgdGhlIGVudGlyZSBsb2NhbCBGQURUICovCi0KLQlBQ1BJX01FTVNFVCgmYWNwaV9nYmxfRkFEVCwgMCwgc2l6ZW9mKHN0cnVjdCBhY3BpX3RhYmxlX2ZhZHQpKTsKLQotCS8qIENvcHkgdGhlIG9yaWdpbmFsIEZBRFQsIHVwIHRvIHNpemVvZiAoc3RydWN0IGFjcGlfdGFibGVfZmFkdCkgKi8KLQotCUFDUElfTUVNQ1BZKCZhY3BpX2dibF9GQURULCB0YWJsZSwKLQkJICAgIEFDUElfTUlOKGxlbmd0aCwgc2l6ZW9mKHN0cnVjdCBhY3BpX3RhYmxlX2ZhZHQpKSk7Ci0KLQkvKgotCSAqIDEpIENvbnZlcnQgdGhlIGxvY2FsIGNvcHkgb2YgdGhlIEZBRFQgdG8gdGhlIGNvbW1vbiBpbnRlcm5hbCBmb3JtYXQKLQkgKiAyKSBWYWxpZGF0ZSBzb21lIG9mIHRoZSBpbXBvcnRhbnQgdmFsdWVzIHdpdGhpbiB0aGUgRkFEVAotCSAqLwotCWFjcGlfdGJfY29udmVydF9mYWR0KCk7Ci0JYWNwaV90Yl92YWxpZGF0ZV9mYWR0KCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfdGJfY29udmVydF9mYWR0Ci0gKgotICogUEFSQU1FVEVSUzogIE5vbmUsIHVzZXMgYWNwaV9nYmxfRkFEVAotICoKLSAqIFJFVFVSTjogICAgICBOb25lCi0gKgotICogREVTQ1JJUFRJT046IENvbnZlcnRzIGFsbCB2ZXJzaW9ucyBvZiB0aGUgRkFEVCB0byBhIGNvbW1vbiBpbnRlcm5hbCBmb3JtYXQuCi0gKiAgICAgICAgICAgICAgRXhwYW5kIGFsbCAzMi1iaXQgYWRkcmVzc2VzIHRvIDY0LWJpdC4KLSAqCi0gKiBOT1RFOiAgICAgICAgYWNwaV9nYmxfRkFEVCBtdXN0IGJlIG9mIHNpemUgKHN0cnVjdCBhY3BpX3RhYmxlX2ZhZHQpLAotICogICAgICAgICAgICAgIGFuZCBtdXN0IGNvbnRhaW4gYSBjb3B5IG9mIHRoZSBhY3R1YWwgRkFEVC4KLSAqCi0gKiBBQ1BJQ0Egd2lsbCB1c2UgdGhlICJYIiBmaWVsZHMgb2YgdGhlIEZBRFQgZm9yIGFsbCBhZGRyZXNzZXMuCi0gKgotICogIlgiIGZpZWxkcyBhcmUgb3B0aW9uYWwgZXh0ZW5zaW9ucyB0byB0aGUgb3JpZ2luYWwgVjEuMCBmaWVsZHMuIEV2ZW4gaWYKLSAqIHRoZXkgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZSwgdGhleSBjYW4gYmUgb3B0aW9uYWxseSBub3QgdXNlZCBieQotICogc2V0dGluZyB0aGVtIHRvIHplcm8uIFRoZXJlZm9yZSwgd2UgbXVzdCBzZWxlY3RpdmVseSBleHBhbmQgVjEuMCBmaWVsZHMKLSAqIGlmIHRoZSBjb3JyZXNwb25kaW5nIFggZmllbGQgaXMgemVyby4KLSAqCi0gKiBGb3IgQUNQSSAxLjAgRkFEVHMsIGFsbCBhZGRyZXNzIGZpZWxkcyBhcmUgZXhwYW5kZWQgdG8gdGhlIGNvcnJlc3BvbmRpbmcKLSAqICJYIiBmaWVsZHMuCi0gKgotICogRm9yIEFDUEkgMi4wIEZBRFRzLCBhbnkgIlgiIGZpZWxkcyB0aGF0IGFyZSBOVUxMIGFyZSBmaWxsZWQgaW4gYnkKLSAqIGV4cGFuZGluZyB0aGUgY29ycmVzcG9uZGluZyBBQ1BJIDEuMCBmaWVsZC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgdm9pZCBhY3BpX3RiX2NvbnZlcnRfZmFkdCh2b2lkKQotewotCXU4IHBtMV9yZWdpc3Rlcl9sZW5ndGg7Ci0Jc3RydWN0IGFjcGlfZ2VuZXJpY19hZGRyZXNzICp0YXJnZXQ7Ci0JdTMyIGk7Ci0KLQkvKiBVcGRhdGUgdGhlIGxvY2FsIEZBRFQgdGFibGUgaGVhZGVyIGxlbmd0aCAqLwotCi0JYWNwaV9nYmxfRkFEVC5oZWFkZXIubGVuZ3RoID0gc2l6ZW9mKHN0cnVjdCBhY3BpX3RhYmxlX2ZhZHQpOwotCi0JLyogRXhwYW5kIHRoZSAzMi1iaXQgRkFDUyBhbmQgRFNEVCBhZGRyZXNzZXMgdG8gNjQtYml0IGFzIG5lY2Vzc2FyeSAqLwotCi0JaWYgKCFhY3BpX2dibF9GQURULlhmYWNzKSB7Ci0JCWFjcGlfZ2JsX0ZBRFQuWGZhY3MgPSAodTY0KSBhY3BpX2dibF9GQURULmZhY3M7Ci0JfQotCi0JaWYgKCFhY3BpX2dibF9GQURULlhkc2R0KSB7Ci0JCWFjcGlfZ2JsX0ZBRFQuWGRzZHQgPSAodTY0KSBhY3BpX2dibF9GQURULmRzZHQ7Ci0JfQotCi0JLyoKLQkgKiBGb3IgQUNQSSAxLjAgRkFEVHMgKHJldmlzaW9uIDEgb3IgMiksIGVuc3VyZSB0aGF0IHJlc2VydmVkIGZpZWxkcyB3aGljaAotCSAqIHNob3VsZCBiZSB6ZXJvIGFyZSBpbmRlZWQgemVyby4gVGhpcyB3aWxsIHdvcmthcm91bmQgQklPU3MgdGhhdAotCSAqIGluYWR2ZXJ0ZW50bHkgcGxhY2UgdmFsdWVzIGluIHRoZXNlIGZpZWxkcy4KLQkgKgotCSAqIFRoZSBBQ1BJIDEuMCByZXNlcnZlZCBmaWVsZHMgdGhhdCB3aWxsIGJlIHplcm9lZCBhcmUgdGhlIGJ5dGVzIGxvY2F0ZWQgYXQKLQkgKiBvZmZzZXQgNDUsIDU1LCA5NSwgYW5kIHRoZSB3b3JkIGxvY2F0ZWQgYXQgb2Zmc2V0IDEwOSwgMTEwLgotCSAqLwotCWlmIChhY3BpX2dibF9GQURULmhlYWRlci5yZXZpc2lvbiA8IEZBRFQyX1JFVklTSU9OX0lEKSB7Ci0JCWFjcGlfZ2JsX0ZBRFQucHJlZmVycmVkX3Byb2ZpbGUgPSAwOwotCQlhY3BpX2dibF9GQURULnBzdGF0ZV9jb250cm9sID0gMDsKLQkJYWNwaV9nYmxfRkFEVC5jc3RfY29udHJvbCA9IDA7Ci0JCWFjcGlfZ2JsX0ZBRFQuYm9vdF9mbGFncyA9IDA7Ci0JfQotCi0JLyoKLQkgKiBFeHBhbmQgdGhlIEFDUEkgMS4wIDMyLWJpdCBWMS4wIGFkZHJlc3NlcyB0byB0aGUgQUNQSSAyLjAgNjQtYml0ICJYIgotCSAqIGdlbmVyaWMgYWRkcmVzcyBzdHJ1Y3R1cmVzIGFzIG5lY2Vzc2FyeS4KLQkgKi8KLQlmb3IgKGkgPSAwOyBpIDwgQUNQSV9GQURUX0lORk9fRU5UUklFUzsgaSsrKSB7Ci0JCXRhcmdldCA9Ci0JCSAgICBBQ1BJX0FERF9QVFIoc3RydWN0IGFjcGlfZ2VuZXJpY19hZGRyZXNzLCAmYWNwaV9nYmxfRkFEVCwKLQkJCQkgZmFkdF9pbmZvX3RhYmxlW2ldLnRhcmdldCk7Ci0KLQkJLyogRXhwYW5kIG9ubHkgaWYgdGhlIFggdGFyZ2V0IGlzIG51bGwgKi8KLQotCQlpZiAoIXRhcmdldC0+YWRkcmVzcykgewotCQkJYWNwaV90Yl9pbml0X2dlbmVyaWNfYWRkcmVzcyh0YXJnZXQsCi0JCQkJCQkgICAgICpBQ1BJX0FERF9QVFIodTgsCi0JCQkJCQkJCSAgICZhY3BpX2dibF9GQURULAotCQkJCQkJCQkgICBmYWR0X2luZm9fdGFibGUKLQkJCQkJCQkJICAgW2ldLmxlbmd0aCksCi0JCQkJCQkgICAgICh1NjQpICogQUNQSV9BRERfUFRSKHUzMiwKLQkJCQkJCQkJCSAgJmFjcGlfZ2JsX0ZBRFQsCi0JCQkJCQkJCQkgIGZhZHRfaW5mb190YWJsZQotCQkJCQkJCQkJICBbaV0uCi0JCQkJCQkJCQkgIHNvdXJjZSkpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBDYWxjdWxhdGUgc2VwYXJhdGUgR0FTIHN0cnVjdHMgZm9yIHRoZSBQTTEgRW5hYmxlIHJlZ2lzdGVycy4KLQkgKiBUaGVzZSBhZGRyZXNzZXMgZG8gbm90IGFwcGVhciAoZGlyZWN0bHkpIGluIHRoZSBGQURULCBzbyBpdCBpcwotCSAqIHVzZWZ1bCB0byBjYWxjdWxhdGUgdGhlbSBvbmNlLCBoZXJlLgotCSAqCi0JICogVGhlIFBNIGV2ZW50IGJsb2NrcyBhcmUgc3BsaXQgaW50byB0d28gcmVnaXN0ZXIgYmxvY2tzLCBmaXJzdCBpcyB0aGUKLQkgKiBQTSBTdGF0dXMgUmVnaXN0ZXIgYmxvY2ssIGZvbGxvd2VkIGltbWVkaWF0ZWx5IGJ5IHRoZSBQTSBFbmFibGUKLQkgKiBSZWdpc3RlciBibG9jay4gRWFjaCBpcyBvZiBsZW5ndGggKHhwbTF4X2V2ZW50X2Jsb2NrLmJpdF93aWR0aC8yKS4KLQkgKgotCSAqIE9uIHZhcmlvdXMgc3lzdGVtcyB0aGUgdjIgZmllbGRzIChhbmQgcGFydGljdWxhcmx5IHRoZSBiaXQgd2lkdGhzKQotCSAqIGNhbm5vdCBiZSByZWxpZWQgdXBvbiwgdGhvdWdoLiBIZW5jZSByZXNvcnQgdG8gdXNpbmcgdGhlIHYxIGxlbmd0aAotCSAqIGhlcmUgKGFuZCB3YXJuIGFib3V0IHRoZSBpbmNvbnNpc3RlbmN5KS4KLQkgKi8KLQlpZiAoYWNwaV9nYmxfRkFEVC54cG0xYV9ldmVudF9ibG9jay5iaXRfd2lkdGgKLQkgICAgIT0gYWNwaV9nYmxfRkFEVC5wbTFfZXZlbnRfbGVuZ3RoICogOCkKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiRkFEVDogIgotCQkgICAgICAgIlhfUE0xYV9FVlRfQkxLLmJpdF93aWR0aCAoJXUpIGRvZXMgbm90IG1hdGNoIgotCQkgICAgICAgIiBQTTFfRVZUX0xFTiAoJXUpXG4iLAotCQkgICAgICAgYWNwaV9nYmxfRkFEVC54cG0xYV9ldmVudF9ibG9jay5iaXRfd2lkdGgsCi0JCSAgICAgICBhY3BpX2dibF9GQURULnBtMV9ldmVudF9sZW5ndGgpOwotCXBtMV9yZWdpc3Rlcl9sZW5ndGggPSAodTgpIEFDUElfRElWXzIoYWNwaV9nYmxfRkFEVC5wbTFfZXZlbnRfbGVuZ3RoKTsKLQotCS8qIFRoZSBQTTFBIHJlZ2lzdGVyIGJsb2NrIGlzIHJlcXVpcmVkICovCi0KLQlhY3BpX3RiX2luaXRfZ2VuZXJpY19hZGRyZXNzKCZhY3BpX2dibF94cG0xYV9lbmFibGUsCi0JCQkJICAgICBwbTFfcmVnaXN0ZXJfbGVuZ3RoLAotCQkJCSAgICAgKGFjcGlfZ2JsX0ZBRFQueHBtMWFfZXZlbnRfYmxvY2suYWRkcmVzcyArCi0JCQkJICAgICAgcG0xX3JlZ2lzdGVyX2xlbmd0aCkpOwotCS8qIERvbid0IGZvcmdldCB0byBjb3B5IHNwYWNlX2lkIG9mIHRoZSBHQVMgKi8KLQlhY3BpX2dibF94cG0xYV9lbmFibGUuc3BhY2VfaWQgPQotCSAgICBhY3BpX2dibF9GQURULnhwbTFhX2V2ZW50X2Jsb2NrLnNwYWNlX2lkOwotCi0JLyogVGhlIFBNMUIgcmVnaXN0ZXIgYmxvY2sgaXMgb3B0aW9uYWwsIGlnbm9yZSBpZiBub3QgcHJlc2VudCAqLwotCi0JaWYgKGFjcGlfZ2JsX0ZBRFQueHBtMWJfZXZlbnRfYmxvY2suYWRkcmVzcykgewotCQlpZiAoYWNwaV9nYmxfRkFEVC54cG0xYl9ldmVudF9ibG9jay5iaXRfd2lkdGgKLQkJICAgICE9IGFjcGlfZ2JsX0ZBRFQucG0xX2V2ZW50X2xlbmd0aCAqIDgpCi0JCQlwcmludGsoS0VSTl9XQVJOSU5HICJGQURUOiAiCi0JCQkgICAgICAgIlhfUE0xYl9FVlRfQkxLLmJpdF93aWR0aCAoJXUpIGRvZXMgbm90IG1hdGNoIgotCQkJICAgICAgICIgUE0xX0VWVF9MRU4gKCV1KVxuIiwKLQkJCSAgICAgICBhY3BpX2dibF9GQURULnhwbTFiX2V2ZW50X2Jsb2NrLmJpdF93aWR0aCwKLQkJCSAgICAgICBhY3BpX2dibF9GQURULnBtMV9ldmVudF9sZW5ndGgpOwotCQlhY3BpX3RiX2luaXRfZ2VuZXJpY19hZGRyZXNzKCZhY3BpX2dibF94cG0xYl9lbmFibGUsCi0JCQkJCSAgICAgcG0xX3JlZ2lzdGVyX2xlbmd0aCwKLQkJCQkJICAgICAoYWNwaV9nYmxfRkFEVC54cG0xYl9ldmVudF9ibG9jay4KLQkJCQkJICAgICAgYWRkcmVzcyArIHBtMV9yZWdpc3Rlcl9sZW5ndGgpKTsKLQkJLyogRG9uJ3QgZm9yZ2V0IHRvIGNvcHkgc3BhY2VfaWQgb2YgdGhlIEdBUyAqLwotCQlhY3BpX2dibF94cG0xYl9lbmFibGUuc3BhY2VfaWQgPQotCQkgICAgYWNwaV9nYmxfRkFEVC54cG0xYl9ldmVudF9ibG9jay5zcGFjZV9pZDsKLQotCX0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX3RiX3ZhbGlkYXRlX2ZhZHQKLSAqCi0gKiBQQVJBTUVURVJTOiAgVGFibGUgICAgICAgICAgIC0gUG9pbnRlciB0byB0aGUgRkFEVCB0byBiZSB2YWxpZGF0ZWQKLSAqCi0gKiBSRVRVUk46ICAgICAgTm9uZQotICoKLSAqIERFU0NSSVBUSU9OOiBWYWxpZGF0ZSB2YXJpb3VzIGltcG9ydGFudCBmaWVsZHMgd2l0aGluIHRoZSBGQURULiBJZiBhIHByb2JsZW0KLSAqICAgICAgICAgICAgICBpcyBmb3VuZCwgaXNzdWUgYSBtZXNzYWdlLCBidXQgbm8gc3RhdHVzIGlzIHJldHVybmVkLgotICogICAgICAgICAgICAgIFVzZWQgYnkgYm90aCB0aGUgdGFibGUgbWFuYWdlciBhbmQgdGhlIGRpc2Fzc2VtYmxlci4KLSAqCi0gKiBQb3NzaWJsZSBhZGRpdGlvbmFsIGNoZWNrczoKLSAqIChhY3BpX2dibF9GQURULnBtMV9ldmVudF9sZW5ndGggPj0gNCkKLSAqIChhY3BpX2dibF9GQURULnBtMV9jb250cm9sX2xlbmd0aCA+PSAyKQotICogKGFjcGlfZ2JsX0ZBRFQucG1fdGltZXJfbGVuZ3RoID49IDQpCi0gKiBHcGUgYmxvY2sgbGVuZ3RocyBtdXN0IGJlIG11bHRpcGxlIG9mIDIKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgdm9pZCBhY3BpX3RiX3ZhbGlkYXRlX2ZhZHQodm9pZCkKLXsKLQl1MzIgKmFkZHJlc3MzMjsKLQlzdHJ1Y3QgYWNwaV9nZW5lcmljX2FkZHJlc3MgKmFkZHJlc3M2NDsKLQl1OCBsZW5ndGg7Ci0JdTMyIGk7Ci0KLQkvKiBFeGFtaW5lIGFsbCBvZiB0aGUgNjQtYml0IGV4dGVuZGVkIGFkZHJlc3MgZmllbGRzIChYIGZpZWxkcykgKi8KLQotCWZvciAoaSA9IDA7IGkgPCBBQ1BJX0ZBRFRfSU5GT19FTlRSSUVTOyBpKyspIHsKLQotCQkvKiBHZW5lcmF0ZSBwb2ludGVycyB0byB0aGUgMzItYml0IGFuZCA2NC1iaXQgYWRkcmVzc2VzIGFuZCBnZXQgdGhlIGxlbmd0aCAqLwotCi0JCWFkZHJlc3M2NCA9Ci0JCSAgICBBQ1BJX0FERF9QVFIoc3RydWN0IGFjcGlfZ2VuZXJpY19hZGRyZXNzLCAmYWNwaV9nYmxfRkFEVCwKLQkJCQkgZmFkdF9pbmZvX3RhYmxlW2ldLnRhcmdldCk7Ci0JCWFkZHJlc3MzMiA9Ci0JCSAgICBBQ1BJX0FERF9QVFIodTMyLCAmYWNwaV9nYmxfRkFEVCwKLQkJCQkgZmFkdF9pbmZvX3RhYmxlW2ldLnNvdXJjZSk7Ci0JCWxlbmd0aCA9Ci0JCSAgICAqQUNQSV9BRERfUFRSKHU4LCAmYWNwaV9nYmxfRkFEVCwKLQkJCQkgIGZhZHRfaW5mb190YWJsZVtpXS5sZW5ndGgpOwotCi0JCWlmIChmYWR0X2luZm9fdGFibGVbaV0udHlwZSAmIEFDUElfRkFEVF9SRVFVSVJFRCkgewotCQkJLyoKLQkJCSAqIEZpZWxkIGlzIHJlcXVpcmVkIChQbTFhX2V2ZW50LCBQbTFhX2NvbnRyb2wsIHBtX3RpbWVyKS4KLQkJCSAqIEJvdGggdGhlIGFkZHJlc3MgYW5kIGxlbmd0aCBtdXN0IGJlIG5vbi16ZXJvLgotCQkJICovCi0JCQlpZiAoIWFkZHJlc3M2NC0+YWRkcmVzcyB8fCAhbGVuZ3RoKSB7Ci0JCQkJQUNQSV9FUlJPUigoQUVfSU5GTywKLQkJCQkJICAgICJSZXF1aXJlZCBmaWVsZCBcIiVzXCIgaGFzIHplcm8gYWRkcmVzcyBhbmQvb3IgbGVuZ3RoOiAlOC44WCU4LjhYLyVYIiwKLQkJCQkJICAgIGZhZHRfaW5mb190YWJsZVtpXS5uYW1lLAotCQkJCQkgICAgQUNQSV9GT1JNQVRfVUlOVDY0KGFkZHJlc3M2NC0+Ci0JCQkJCQkJICAgICAgIGFkZHJlc3MpLAotCQkJCQkgICAgbGVuZ3RoKSk7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoZmFkdF9pbmZvX3RhYmxlW2ldLnR5cGUgJiBBQ1BJX0ZBRFRfU0VQQVJBVEVfTEVOR1RIKSB7Ci0JCQkvKgotCQkJICogRmllbGQgaXMgb3B0aW9uYWwgKFBNMkNvbnRyb2wsIEdQRTAsIEdQRTEpIEFORCBoYXMgaXRzIG93bgotCQkJICogbGVuZ3RoIGZpZWxkLiBJZiBwcmVzZW50LCBib3RoIHRoZSBhZGRyZXNzIGFuZCBsZW5ndGggbXVzdCBiZSB2YWxpZC4KLQkJCSAqLwotCQkJaWYgKChhZGRyZXNzNjQtPmFkZHJlc3MgJiYgIWxlbmd0aCkKLQkJCSAgICB8fCAoIWFkZHJlc3M2NC0+YWRkcmVzcyAmJiBsZW5ndGgpKSB7Ci0JCQkJQUNQSV9XQVJOSU5HKChBRV9JTkZPLAotCQkJCQkgICAgICAiT3B0aW9uYWwgZmllbGQgXCIlc1wiIGhhcyB6ZXJvIGFkZHJlc3Mgb3IgbGVuZ3RoOiAlOC44WCU4LjhYLyVYIiwKLQkJCQkJICAgICAgZmFkdF9pbmZvX3RhYmxlW2ldLm5hbWUsCi0JCQkJCSAgICAgIEFDUElfRk9STUFUX1VJTlQ2NChhZGRyZXNzNjQtPgotCQkJCQkJCQkgYWRkcmVzcyksCi0JCQkJCSAgICAgIGxlbmd0aCkpOwotCQkJfQotCQl9Ci0KLQkJLyogSWYgYm90aCAzMi0gYW5kIDY0LWJpdCBhZGRyZXNzZXMgYXJlIHZhbGlkIChub24temVybyksIHRoZXkgbXVzdCBtYXRjaCAqLwotCi0JCWlmIChhZGRyZXNzNjQtPmFkZHJlc3MgJiYgKmFkZHJlc3MzMiAmJgotCQkgICAgKGFkZHJlc3M2NC0+YWRkcmVzcyAhPSAodTY0KSAqIGFkZHJlc3MzMikpIHsKLQkJCUFDUElfRVJST1IoKEFFX0lORk8sCi0JCQkJICAgICIzMi82NFggYWRkcmVzcyBtaXNtYXRjaCBpbiBcIiVzXCI6IFslOC44WF0gWyU4LjhYJTguOFhdLCB1c2luZyA2NFgiLAotCQkJCSAgICBmYWR0X2luZm9fdGFibGVbaV0ubmFtZSwgKmFkZHJlc3MzMiwKLQkJCQkgICAgQUNQSV9GT1JNQVRfVUlOVDY0KGFkZHJlc3M2NC0+YWRkcmVzcykpKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS90YWJsZXMvdGJmaW5kLmMgYi9kcml2ZXJzL2FjcGkvdGFibGVzL3RiZmluZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MzE1ODRkLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvYWNwaS90YWJsZXMvdGJmaW5kLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIE1vZHVsZSBOYW1lOiB0YmZpbmQgICAtIGZpbmQgdGFibGUKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA4LCBJbnRlbCBDb3JwLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAotICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgYXQgbWluaW11bSBhIGRpc2NsYWltZXIKLSAqICAgIHN1YnN0YW50aWFsbHkgc2ltaWxhciB0byB0aGUgIk5PIFdBUlJBTlRZIiBkaXNjbGFpbWVyIGJlbG93Ci0gKiAgICAoIkRpc2NsYWltZXIiKSBhbmQgYW55IHJlZGlzdHJpYnV0aW9uIG11c3QgYmUgY29uZGl0aW9uZWQgdXBvbgotICogICAgaW5jbHVkaW5nIGEgc3Vic3RhbnRpYWxseSBzaW1pbGFyIERpc2NsYWltZXIgcmVxdWlyZW1lbnQgZm9yIGZ1cnRoZXIKLSAqICAgIGJpbmFyeSByZWRpc3RyaWJ1dGlvbi4KLSAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcwotICogICAgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICogU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBOTyBXQVJSQU5UWQotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCi0gKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUwotICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcKLSAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQotICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgotICovCi0KLSNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KLSNpbmNsdWRlIDxhY3BpL2FjdGFibGVzLmg+Ci0KLSNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX1RBQkxFUwotQUNQSV9NT0RVTEVfTkFNRSgidGJmaW5kIikKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV90Yl9maW5kX3RhYmxlCi0gKgotICogUEFSQU1FVEVSUzogIFNpZ25hdHVyZSAgICAgICAgICAgLSBTdHJpbmcgd2l0aCBBQ1BJIHRhYmxlIHNpZ25hdHVyZQotICogICAgICAgICAgICAgIG9lbV9pZCAgICAgICAgICAgICAgLSBTdHJpbmcgd2l0aCB0aGUgdGFibGUgT0VNIElECi0gKiAgICAgICAgICAgICAgb2VtX3RhYmxlX2lkICAgICAgICAtIFN0cmluZyB3aXRoIHRoZSBPRU0gVGFibGUgSUQKLSAqICAgICAgICAgICAgICB0YWJsZV9pbmRleCAgICAgICAgIC0gV2hlcmUgdGhlIHRhYmxlIGluZGV4IGlzIHJldHVybmVkCi0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cyBhbmQgdGFibGUgaW5kZXgKLSAqCi0gKiBERVNDUklQVElPTjogRmluZCBhbiBBQ1BJIHRhYmxlIChpbiB0aGUgUlNEVC9YU0RUKSB0aGF0IG1hdGNoZXMgdGhlCi0gKiAgICAgICAgICAgICAgU2lnbmF0dXJlLCBPRU0gSUQgYW5kIE9FTSBUYWJsZSBJRC4gUmV0dXJucyBhbiBpbmRleCB0aGF0IGNhbgotICogICAgICAgICAgICAgIGJlIHVzZWQgdG8gZ2V0IHRoZSB0YWJsZSBoZWFkZXIgb3IgZW50aXJlIHRhYmxlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1hY3BpX3N0YXR1cwotYWNwaV90Yl9maW5kX3RhYmxlKGNoYXIgKnNpZ25hdHVyZSwKLQkJICAgY2hhciAqb2VtX2lkLCBjaGFyICpvZW1fdGFibGVfaWQsIHUzMiAqdGFibGVfaW5kZXgpCi17Ci0JdTMyIGk7Ci0JYWNwaV9zdGF0dXMgc3RhdHVzOwotCXN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciBoZWFkZXI7Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKHRiX2ZpbmRfdGFibGUpOwotCi0JLyogTm9ybWFsaXplIHRoZSBpbnB1dCBzdHJpbmdzICovCi0KLQlBQ1BJX01FTVNFVCgmaGVhZGVyLCAwLCBzaXplb2Yoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyKSk7Ci0JQUNQSV9TVFJOQ1BZKGhlYWRlci5zaWduYXR1cmUsIHNpZ25hdHVyZSwgQUNQSV9OQU1FX1NJWkUpOwotCUFDUElfU1RSTkNQWShoZWFkZXIub2VtX2lkLCBvZW1faWQsIEFDUElfT0VNX0lEX1NJWkUpOwotCUFDUElfU1RSTkNQWShoZWFkZXIub2VtX3RhYmxlX2lkLCBvZW1fdGFibGVfaWQsIEFDUElfT0VNX1RBQkxFX0lEX1NJWkUpOwotCi0JLyogU2VhcmNoIGZvciB0aGUgdGFibGUgKi8KLQotCWZvciAoaSA9IDA7IGkgPCBhY3BpX2dibF9yb290X3RhYmxlX2xpc3QuY291bnQ7ICsraSkgewotCQlpZiAoQUNQSV9NRU1DTVAoJihhY3BpX2dibF9yb290X3RhYmxlX2xpc3QudGFibGVzW2ldLnNpZ25hdHVyZSksCi0JCQkJaGVhZGVyLnNpZ25hdHVyZSwgQUNQSV9OQU1FX1NJWkUpKSB7Ci0KLQkJCS8qIE5vdCB0aGUgcmVxdWVzdGVkIHRhYmxlICovCi0KLQkJCWNvbnRpbnVlOwotCQl9Ci0KLQkJLyogVGFibGUgd2l0aCBtYXRjaGluZyBzaWduYXR1cmUgaGFzIGJlZW4gZm91bmQgKi8KLQotCQlpZiAoIWFjcGlfZ2JsX3Jvb3RfdGFibGVfbGlzdC50YWJsZXNbaV0ucG9pbnRlcikgewotCi0JCQkvKiBUYWJsZSBpcyBub3QgY3VycmVudGx5IG1hcHBlZCwgbWFwIGl0ICovCi0KLQkJCXN0YXR1cyA9Ci0JCQkgICAgYWNwaV90Yl92ZXJpZnlfdGFibGUoJmFjcGlfZ2JsX3Jvb3RfdGFibGVfbGlzdC4KLQkJCQkJCSB0YWJsZXNbaV0pOwotCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci0JCQl9Ci0KLQkJCWlmICghYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LnRhYmxlc1tpXS5wb2ludGVyKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCX0KLQotCQkvKiBDaGVjayBmb3IgdGFibGUgbWF0Y2ggb24gYWxsIElEcyAqLwotCi0JCWlmICghQUNQSV9NRU1DTVAKLQkJICAgIChhY3BpX2dibF9yb290X3RhYmxlX2xpc3QudGFibGVzW2ldLnBvaW50ZXItPnNpZ25hdHVyZSwKLQkJICAgICBoZWFkZXIuc2lnbmF0dXJlLCBBQ1BJX05BTUVfU0laRSkgJiYgKCFvZW1faWRbMF0KLQkJCQkJCQkgICB8fAotCQkJCQkJCSAgICFBQ1BJX01FTUNNUAotCQkJCQkJCSAgIChhY3BpX2dibF9yb290X3RhYmxlX2xpc3QuCi0JCQkJCQkJICAgIHRhYmxlc1tpXS5wb2ludGVyLT4KLQkJCQkJCQkgICAgb2VtX2lkLAotCQkJCQkJCSAgICBoZWFkZXIub2VtX2lkLAotCQkJCQkJCSAgICBBQ1BJX09FTV9JRF9TSVpFKSkKLQkJICAgICYmICghb2VtX3RhYmxlX2lkWzBdCi0JCQl8fCAhQUNQSV9NRU1DTVAoYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LnRhYmxlc1tpXS4KLQkJCQkJcG9pbnRlci0+b2VtX3RhYmxlX2lkLAotCQkJCQloZWFkZXIub2VtX3RhYmxlX2lkLAotCQkJCQlBQ1BJX09FTV9UQUJMRV9JRF9TSVpFKSkpIHsKLQkJCSp0YWJsZV9pbmRleCA9IGk7Ci0KLQkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfVEFCTEVTLAotCQkJCQkgICJGb3VuZCB0YWJsZSBbJTQuNHNdXG4iLAotCQkJCQkgIGhlYWRlci5zaWduYXR1cmUpKTsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7Ci0JCX0KLQl9Ci0KLQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9UX0ZPVU5EKTsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS90YWJsZXMvdGJpbnN0YWwuYyBiL2RyaXZlcnMvYWNwaS90YWJsZXMvdGJpbnN0YWwuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTg3NDdjZS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL2FjcGkvdGFibGVzL3RiaW5zdGFsLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1NzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIE1vZHVsZSBOYW1lOiB0Ymluc3RhbCAtIEFDUEkgdGFibGUgaW5zdGFsbGF0aW9uIGFuZCByZW1vdmFsCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwOCwgSW50ZWwgQ29ycC4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKLSAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIGF0IG1pbmltdW0gYSBkaXNjbGFpbWVyCi0gKiAgICBzdWJzdGFudGlhbGx5IHNpbWlsYXIgdG8gdGhlICJOTyBXQVJSQU5UWSIgZGlzY2xhaW1lciBiZWxvdwotICogICAgKCJEaXNjbGFpbWVyIikgYW5kIGFueSByZWRpc3RyaWJ1dGlvbiBtdXN0IGJlIGNvbmRpdGlvbmVkIHVwb24KLSAqICAgIGluY2x1ZGluZyBhIHN1YnN0YW50aWFsbHkgc2ltaWxhciBEaXNjbGFpbWVyIHJlcXVpcmVtZW50IGZvciBmdXJ0aGVyCi0gKiAgICBiaW5hcnkgcmVkaXN0cmlidXRpb24uCi0gKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMKLSAqICAgIG9mIGFueSBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTk8gV0FSUkFOVFkKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAotICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKLSAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HCi0gKiBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKLSAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KLSAqLwotCi0jaW5jbHVkZSA8YWNwaS9hY3BpLmg+Ci0jaW5jbHVkZSA8YWNwaS9hY25hbWVzcC5oPgotI2luY2x1ZGUgPGFjcGkvYWN0YWJsZXMuaD4KLQotI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfVEFCTEVTCi1BQ1BJX01PRFVMRV9OQU1FKCJ0Ymluc3RhbCIpCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV90Yl92ZXJpZnlfdGFibGUKLSAqCi0gKiBQQVJBTUVURVJTOiAgdGFibGVfZGVzYyAgICAgICAgICAtIHRhYmxlCi0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cwotICoKLSAqIERFU0NSSVBUSU9OOiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byB2ZXJpZnkgYW5kIG1hcCB0YWJsZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWFjcGlfc3RhdHVzIGFjcGlfdGJfdmVyaWZ5X3RhYmxlKHN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgKnRhYmxlX2Rlc2MpCi17Ci0JYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKHRiX3ZlcmlmeV90YWJsZSk7Ci0KLQkvKiBNYXAgdGhlIHRhYmxlIGlmIG5lY2Vzc2FyeSAqLwotCi0JaWYgKCF0YWJsZV9kZXNjLT5wb2ludGVyKSB7Ci0JCWlmICgodGFibGVfZGVzYy0+ZmxhZ3MgJiBBQ1BJX1RBQkxFX09SSUdJTl9NQVNLKSA9PQotCQkgICAgQUNQSV9UQUJMRV9PUklHSU5fTUFQUEVEKSB7Ci0JCQl0YWJsZV9kZXNjLT5wb2ludGVyID0KLQkJCSAgICBhY3BpX29zX21hcF9tZW1vcnkodGFibGVfZGVzYy0+YWRkcmVzcywKLQkJCQkJICAgICAgIHRhYmxlX2Rlc2MtPmxlbmd0aCk7Ci0JCX0KLQkJaWYgKCF0YWJsZV9kZXNjLT5wb2ludGVyKSB7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9fTUVNT1JZKTsKLQkJfQotCX0KLQotCS8qIEZBQ1MgaXMgdGhlIG9kZCB0YWJsZSwgaGFzIG5vIHN0YW5kYXJkIEFDUEkgaGVhZGVyIGFuZCBubyBjaGVja3N1bSAqLwotCi0JaWYgKCFBQ1BJX0NPTVBBUkVfTkFNRSgmdGFibGVfZGVzYy0+c2lnbmF0dXJlLCBBQ1BJX1NJR19GQUNTKSkgewotCi0JCS8qIEFsd2F5cyBjYWxjdWxhdGUgY2hlY2tzdW0sIGlnbm9yZSBiYWQgY2hlY2tzdW0gaWYgcmVxdWVzdGVkICovCi0KLQkJc3RhdHVzID0KLQkJICAgIGFjcGlfdGJfdmVyaWZ5X2NoZWNrc3VtKHRhYmxlX2Rlc2MtPnBvaW50ZXIsCi0JCQkJCSAgICB0YWJsZV9kZXNjLT5sZW5ndGgpOwotCX0KLQotCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX3RiX2FkZF90YWJsZQotICoKLSAqIFBBUkFNRVRFUlM6ICB0YWJsZV9kZXNjICAgICAgICAgIC0gVGFibGUgZGVzY3JpcHRvcgotICogICAgICAgICAgICAgIHRhYmxlX2luZGV4ICAgICAgICAgLSBXaGVyZSB0aGUgdGFibGUgaW5kZXggaXMgcmV0dXJuZWQKLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGFkZCB0aGUgQUNQSSB0YWJsZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWFjcGlfc3RhdHVzCi1hY3BpX3RiX2FkZF90YWJsZShzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjICp0YWJsZV9kZXNjLCB1MzIgKnRhYmxlX2luZGV4KQotewotCXUzMiBpOwotCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOwotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSh0Yl9hZGRfdGFibGUpOwotCi0JaWYgKCF0YWJsZV9kZXNjLT5wb2ludGVyKSB7Ci0JCXN0YXR1cyA9IGFjcGlfdGJfdmVyaWZ5X3RhYmxlKHRhYmxlX2Rlc2MpOwotCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykgfHwgIXRhYmxlX2Rlc2MtPnBvaW50ZXIpIHsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBPcmlnaW5hbGx5LCB3ZSBjaGVja2VkIHRoZSB0YWJsZSBzaWduYXR1cmUgZm9yICJTU0RUIiBvciAiUFNEVCIgaGVyZS4KLQkgKiBOZXh0LCB3ZSBhZGRlZCBzdXBwb3J0IGZvciBPRU14IHRhYmxlcywgc2lnbmF0dXJlICJPRU0iLgotCSAqIFZhbGlkIHRhYmxlcyB3ZXJlIGVuY291bnRlcmVkIHdpdGggYSBudWxsIHNpZ25hdHVyZSwgc28gd2UndmUganVzdAotCSAqIGdpdmVuIHVwIG9uIHZhbGlkYXRpbmcgdGhlIHNpZ25hdHVyZSwgc2luY2UgaXQgc2VlbXMgdG8gYmUgYSB3YXN0ZQotCSAqIG9mIGNvZGUuIFRoZSBvcmlnaW5hbCBjb2RlIHdhcyByZW1vdmVkICgwNS8yMDA4KS4KLQkgKi8KLQotCSh2b2lkKWFjcGlfdXRfYWNxdWlyZV9tdXRleChBQ1BJX01UWF9UQUJMRVMpOwotCi0JLyogQ2hlY2sgaWYgdGFibGUgaXMgYWxyZWFkeSByZWdpc3RlcmVkICovCi0KLQlmb3IgKGkgPSAwOyBpIDwgYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LmNvdW50OyArK2kpIHsKLQkJaWYgKCFhY3BpX2dibF9yb290X3RhYmxlX2xpc3QudGFibGVzW2ldLnBvaW50ZXIpIHsKLQkJCXN0YXR1cyA9Ci0JCQkgICAgYWNwaV90Yl92ZXJpZnlfdGFibGUoJmFjcGlfZ2JsX3Jvb3RfdGFibGVfbGlzdC4KLQkJCQkJCSB0YWJsZXNbaV0pOwotCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpCi0JCQkgICAgfHwgIWFjcGlfZ2JsX3Jvb3RfdGFibGVfbGlzdC50YWJsZXNbaV0ucG9pbnRlcikgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQl9Ci0KLQkJLyoKLQkJICogQ2hlY2sgZm9yIGEgdGFibGUgbWF0Y2ggb24gdGhlIGVudGlyZSB0YWJsZSBsZW5ndGgsCi0JCSAqIG5vdCBqdXN0IHRoZSBoZWFkZXIuCi0JCSAqLwotCQlpZiAodGFibGVfZGVzYy0+bGVuZ3RoICE9Ci0JCSAgICBhY3BpX2dibF9yb290X3RhYmxlX2xpc3QudGFibGVzW2ldLmxlbmd0aCkgewotCQkJY29udGludWU7Ci0JCX0KLQotCQlpZiAoQUNQSV9NRU1DTVAodGFibGVfZGVzYy0+cG9pbnRlciwKLQkJCQlhY3BpX2dibF9yb290X3RhYmxlX2xpc3QudGFibGVzW2ldLnBvaW50ZXIsCi0JCQkJYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LnRhYmxlc1tpXS5sZW5ndGgpKSB7Ci0JCQljb250aW51ZTsKLQkJfQotCi0JCS8qCi0JCSAqIE5vdGU6IHRoZSBjdXJyZW50IG1lY2hhbmlzbSBkb2VzIG5vdCB1bnJlZ2lzdGVyIGEgdGFibGUgaWYgaXQgaXMKLQkJICogZHluYW1pY2FsbHkgdW5sb2FkZWQuIFRoZSByZWxhdGVkIG5hbWVzcGFjZSBlbnRyaWVzIGFyZSBkZWxldGVkLAotCQkgKiBidXQgdGhlIHRhYmxlIHJlbWFpbnMgaW4gdGhlIHJvb3QgdGFibGUgbGlzdC4KLQkJICoKLQkJICogVGhlIGFzc3VtcHRpb24gaGVyZSBpcyB0aGF0IHRoZSBudW1iZXIgb2YgZGlmZmVyZW50IHRhYmxlcyB0aGF0Ci0JCSAqIHdpbGwgYmUgbG9hZGVkIGlzIGFjdHVhbGx5IHNtYWxsLCBhbmQgdGhlcmUgaXMgbWluaW1hbCBvdmVyaGVhZAotCQkgKiBpbiBqdXN0IGtlZXBpbmcgdGhlIHRhYmxlIGluIGNhc2UgaXQgaXMgbmVlZGVkIGFnYWluLgotCQkgKgotCQkgKiBJZiB0aGlzIGFzc3VtcHRpb24gY2hhbmdlcyBpbiB0aGUgZnV0dXJlIChwZXJoYXBzIG9uIGxhcmdlCi0JCSAqIG1hY2hpbmVzIHdpdGggbWFueSB0YWJsZSBsb2FkL3VubG9hZCBvcGVyYXRpb25zKSwgdGFibGVzIHdpbGwKLQkJICogbmVlZCB0byBiZSB1bnJlZ2lzdGVyZWQgd2hlbiB0aGV5IGFyZSB1bmxvYWRlZCwgYW5kIHNsb3RzIGluIHRoZQotCQkgKiByb290IHRhYmxlIGxpc3Qgc2hvdWxkIGJlIHJldXNlZCB3aGVuIGVtcHR5LgotCQkgKi8KLQotCQkvKgotCQkgKiBUYWJsZSBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQuCi0JCSAqIFdlIGNhbiBkZWxldGUgdGhlIHRhYmxlIHRoYXQgd2FzIHBhc3NlZCBhcyBhIHBhcmFtZXRlci4KLQkJICovCi0JCWFjcGlfdGJfZGVsZXRlX3RhYmxlKHRhYmxlX2Rlc2MpOwotCQkqdGFibGVfaW5kZXggPSBpOwotCi0JCWlmIChhY3BpX2dibF9yb290X3RhYmxlX2xpc3QudGFibGVzW2ldLgotCQkgICAgZmxhZ3MgJiBBQ1BJX1RBQkxFX0lTX0xPQURFRCkgewotCi0JCQkvKiBUYWJsZSBpcyBzdGlsbCBsb2FkZWQsIHRoaXMgaXMgYW4gZXJyb3IgKi8KLQotCQkJc3RhdHVzID0gQUVfQUxSRUFEWV9FWElTVFM7Ci0JCQlnb3RvIHJlbGVhc2U7Ci0JCX0gZWxzZSB7Ci0JCQkvKiBUYWJsZSB3YXMgdW5sb2FkZWQsIGFsbG93IGl0IHRvIGJlIHJlbG9hZGVkICovCi0KLQkJCXRhYmxlX2Rlc2MtPnBvaW50ZXIgPQotCQkJICAgIGFjcGlfZ2JsX3Jvb3RfdGFibGVfbGlzdC50YWJsZXNbaV0ucG9pbnRlcjsKLQkJCXRhYmxlX2Rlc2MtPmFkZHJlc3MgPQotCQkJICAgIGFjcGlfZ2JsX3Jvb3RfdGFibGVfbGlzdC50YWJsZXNbaV0uYWRkcmVzczsKLQkJCXN0YXR1cyA9IEFFX09LOwotCQkJZ290byBwcmludF9oZWFkZXI7Ci0JCX0KLQl9Ci0KLQkvKiBBZGQgdGhlIHRhYmxlIHRvIHRoZSBnbG9iYWwgcm9vdCB0YWJsZSBsaXN0ICovCi0KLQlzdGF0dXMgPSBhY3BpX3RiX3N0b3JlX3RhYmxlKHRhYmxlX2Rlc2MtPmFkZHJlc3MsIHRhYmxlX2Rlc2MtPnBvaW50ZXIsCi0JCQkJICAgICB0YWJsZV9kZXNjLT5sZW5ndGgsIHRhYmxlX2Rlc2MtPmZsYWdzLAotCQkJCSAgICAgdGFibGVfaW5kZXgpOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlnb3RvIHJlbGVhc2U7Ci0JfQotCi0gICAgICBwcmludF9oZWFkZXI6Ci0JYWNwaV90Yl9wcmludF90YWJsZV9oZWFkZXIodGFibGVfZGVzYy0+YWRkcmVzcywgdGFibGVfZGVzYy0+cG9pbnRlcik7Ci0KLSAgICAgIHJlbGVhc2U6Ci0JKHZvaWQpYWNwaV91dF9yZWxlYXNlX211dGV4KEFDUElfTVRYX1RBQkxFUyk7Ci0JcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfdGJfcmVzaXplX3Jvb3RfdGFibGVfbGlzdAotICoKLSAqIFBBUkFNRVRFUlM6ICBOb25lCi0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cwotICoKLSAqIERFU0NSSVBUSU9OOiBFeHBhbmQgdGhlIHNpemUgb2YgZ2xvYmFsIHRhYmxlIGFycmF5Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotYWNwaV9zdGF0dXMgYWNwaV90Yl9yZXNpemVfcm9vdF90YWJsZV9saXN0KHZvaWQpCi17Ci0Jc3RydWN0IGFjcGlfdGFibGVfZGVzYyAqdGFibGVzOwotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSh0Yl9yZXNpemVfcm9vdF90YWJsZV9saXN0KTsKLQotCS8qIGFsbG93X3Jlc2l6ZSBmbGFnIGlzIGEgcGFyYW1ldGVyIHRvIGFjcGlfaW5pdGlhbGl6ZV90YWJsZXMgKi8KLQotCWlmICghKGFjcGlfZ2JsX3Jvb3RfdGFibGVfbGlzdC5mbGFncyAmIEFDUElfUk9PVF9BTExPV19SRVNJWkUpKSB7Ci0JCUFDUElfRVJST1IoKEFFX0lORk8sCi0JCQkgICAgIlJlc2l6ZSBvZiBSb290IFRhYmxlIEFycmF5IGlzIG5vdCBhbGxvd2VkIikpOwotCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfU1VQUE9SVCk7Ci0JfQotCi0JLyogSW5jcmVhc2UgdGhlIFRhYmxlIEFycmF5IHNpemUgKi8KLQotCXRhYmxlcyA9IEFDUElfQUxMT0NBVEVfWkVST0VEKCgoYWNwaV9zaXplKSBhY3BpX2dibF9yb290X3RhYmxlX2xpc3QuCi0JCQkJICAgICAgIHNpemUgKyBBQ1BJX1JPT1RfVEFCTEVfU0laRV9JTkNSRU1FTlQpCi0JCQkJICAgICAgKiBzaXplb2Yoc3RydWN0IGFjcGlfdGFibGVfZGVzYykpOwotCWlmICghdGFibGVzKSB7Ci0JCUFDUElfRVJST1IoKEFFX0lORk8sCi0JCQkgICAgIkNvdWxkIG5vdCBhbGxvY2F0ZSBuZXcgcm9vdCB0YWJsZSBhcnJheSIpKTsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX01FTU9SWSk7Ci0JfQotCi0JLyogQ29weSBhbmQgZnJlZSB0aGUgcHJldmlvdXMgdGFibGUgYXJyYXkgKi8KLQotCWlmIChhY3BpX2dibF9yb290X3RhYmxlX2xpc3QudGFibGVzKSB7Ci0JCUFDUElfTUVNQ1BZKHRhYmxlcywgYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LnRhYmxlcywKLQkJCSAgICAoYWNwaV9zaXplKSBhY3BpX2dibF9yb290X3RhYmxlX2xpc3Quc2l6ZSAqCi0JCQkgICAgc2l6ZW9mKHN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MpKTsKLQotCQlpZiAoYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LmZsYWdzICYgQUNQSV9ST09UX09SSUdJTl9BTExPQ0FURUQpIHsKLQkJCUFDUElfRlJFRShhY3BpX2dibF9yb290X3RhYmxlX2xpc3QudGFibGVzKTsKLQkJfQotCX0KLQotCWFjcGlfZ2JsX3Jvb3RfdGFibGVfbGlzdC50YWJsZXMgPSB0YWJsZXM7Ci0JYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LnNpemUgKz0gQUNQSV9ST09UX1RBQkxFX1NJWkVfSU5DUkVNRU5UOwotCWFjcGlfZ2JsX3Jvb3RfdGFibGVfbGlzdC5mbGFncyB8PSAodTgpIEFDUElfUk9PVF9PUklHSU5fQUxMT0NBVEVEOwotCi0JcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV90Yl9zdG9yZV90YWJsZQotICoKLSAqIFBBUkFNRVRFUlM6ICBBZGRyZXNzICAgICAgICAgICAgIC0gVGFibGUgYWRkcmVzcwotICogICAgICAgICAgICAgIFRhYmxlICAgICAgICAgICAgICAgLSBUYWJsZSBoZWFkZXIKLSAqICAgICAgICAgICAgICBMZW5ndGggICAgICAgICAgICAgIC0gVGFibGUgbGVuZ3RoCi0gKiAgICAgICAgICAgICAgRmxhZ3MgICAgICAgICAgICAgICAtIGZsYWdzCi0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cyBhbmQgdGFibGUgaW5kZXguCi0gKgotICogREVTQ1JJUFRJT046IEFkZCBhbiBBQ1BJIHRhYmxlIHRvIHRoZSBnbG9iYWwgdGFibGUgbGlzdAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWFjcGlfc3RhdHVzCi1hY3BpX3RiX3N0b3JlX3RhYmxlKGFjcGlfcGh5c2ljYWxfYWRkcmVzcyBhZGRyZXNzLAotCQkgICAgc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICp0YWJsZSwKLQkJICAgIHUzMiBsZW5ndGgsIHU4IGZsYWdzLCB1MzIgKnRhYmxlX2luZGV4KQotewotCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOwotCi0JLyogRW5zdXJlIHRoYXQgdGhlcmUgaXMgcm9vbSBmb3IgdGhlIHRhYmxlIGluIHRoZSBSb290IFRhYmxlIExpc3QgKi8KLQotCWlmIChhY3BpX2dibF9yb290X3RhYmxlX2xpc3QuY291bnQgPj0gYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LnNpemUpIHsKLQkJc3RhdHVzID0gYWNwaV90Yl9yZXNpemVfcm9vdF90YWJsZV9saXN0KCk7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQkJcmV0dXJuIChzdGF0dXMpOwotCQl9Ci0JfQotCi0JLyogSW5pdGlhbGl6ZSBhZGRlZCB0YWJsZSAqLwotCi0JYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LnRhYmxlc1thY3BpX2dibF9yb290X3RhYmxlX2xpc3QuY291bnRdLgotCSAgICBhZGRyZXNzID0gYWRkcmVzczsKLQlhY3BpX2dibF9yb290X3RhYmxlX2xpc3QudGFibGVzW2FjcGlfZ2JsX3Jvb3RfdGFibGVfbGlzdC5jb3VudF0uCi0JICAgIHBvaW50ZXIgPSB0YWJsZTsKLQlhY3BpX2dibF9yb290X3RhYmxlX2xpc3QudGFibGVzW2FjcGlfZ2JsX3Jvb3RfdGFibGVfbGlzdC5jb3VudF0ubGVuZ3RoID0KLQkgICAgbGVuZ3RoOwotCWFjcGlfZ2JsX3Jvb3RfdGFibGVfbGlzdC50YWJsZXNbYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LmNvdW50XS4KLQkgICAgb3duZXJfaWQgPSAwOwotCWFjcGlfZ2JsX3Jvb3RfdGFibGVfbGlzdC50YWJsZXNbYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LmNvdW50XS5mbGFncyA9Ci0JICAgIGZsYWdzOwotCi0JQUNQSV9NT1ZFXzMyX1RPXzMyKCYKLQkJCSAgIChhY3BpX2dibF9yb290X3RhYmxlX2xpc3QuCi0JCQkgICAgdGFibGVzW2FjcGlfZ2JsX3Jvb3RfdGFibGVfbGlzdC5jb3VudF0uc2lnbmF0dXJlKSwKLQkJCSAgIHRhYmxlLT5zaWduYXR1cmUpOwotCi0JKnRhYmxlX2luZGV4ID0gYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LmNvdW50OwotCWFjcGlfZ2JsX3Jvb3RfdGFibGVfbGlzdC5jb3VudCsrOwotCXJldHVybiAoc3RhdHVzKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV90Yl9kZWxldGVfdGFibGUKLSAqCi0gKiBQQVJBTUVURVJTOiAgdGFibGVfaW5kZXggICAgICAgICAtIFRhYmxlIGluZGV4Ci0gKgotICogUkVUVVJOOiAgICAgIE5vbmUKLSAqCi0gKiBERVNDUklQVElPTjogRGVsZXRlIG9uZSBpbnRlcm5hbCBBQ1BJIHRhYmxlCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdm9pZCBhY3BpX3RiX2RlbGV0ZV90YWJsZShzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjICp0YWJsZV9kZXNjKQotewotCS8qIFRhYmxlIG11c3QgYmUgbWFwcGVkIG9yIGFsbG9jYXRlZCAqLwotCWlmICghdGFibGVfZGVzYy0+cG9pbnRlcikgewotCQlyZXR1cm47Ci0JfQotCXN3aXRjaCAodGFibGVfZGVzYy0+ZmxhZ3MgJiBBQ1BJX1RBQkxFX09SSUdJTl9NQVNLKSB7Ci0JY2FzZSBBQ1BJX1RBQkxFX09SSUdJTl9NQVBQRUQ6Ci0JCWFjcGlfb3NfdW5tYXBfbWVtb3J5KHRhYmxlX2Rlc2MtPnBvaW50ZXIsIHRhYmxlX2Rlc2MtPmxlbmd0aCk7Ci0JCWJyZWFrOwotCWNhc2UgQUNQSV9UQUJMRV9PUklHSU5fQUxMT0NBVEVEOgotCQlBQ1BJX0ZSRUUodGFibGVfZGVzYy0+cG9pbnRlcik7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6OwotCX0KLQotCXRhYmxlX2Rlc2MtPnBvaW50ZXIgPSBOVUxMOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX3RiX3Rlcm1pbmF0ZQotICoKLSAqIFBBUkFNRVRFUlM6ICBOb25lCi0gKgotICogUkVUVVJOOiAgICAgIE5vbmUKLSAqCi0gKiBERVNDUklQVElPTjogRGVsZXRlIGFsbCBpbnRlcm5hbCBBQ1BJIHRhYmxlcwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXZvaWQgYWNwaV90Yl90ZXJtaW5hdGUodm9pZCkKLXsKLQl1MzIgaTsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UodGJfdGVybWluYXRlKTsKLQotCSh2b2lkKWFjcGlfdXRfYWNxdWlyZV9tdXRleChBQ1BJX01UWF9UQUJMRVMpOwotCi0JLyogRGVsZXRlIHRoZSBpbmRpdmlkdWFsIHRhYmxlcyAqLwotCi0JZm9yIChpID0gMDsgaSA8IGFjcGlfZ2JsX3Jvb3RfdGFibGVfbGlzdC5jb3VudDsgKytpKSB7Ci0JCWFjcGlfdGJfZGVsZXRlX3RhYmxlKCZhY3BpX2dibF9yb290X3RhYmxlX2xpc3QudGFibGVzW2ldKTsKLQl9Ci0KLQkvKgotCSAqIERlbGV0ZSB0aGUgcm9vdCB0YWJsZSBhcnJheSBpZiBhbGxvY2F0ZWQgbG9jYWxseS4gQXJyYXkgY2Fubm90IGJlCi0JICogbWFwcGVkLCBzbyB3ZSBkb24ndCBuZWVkIHRvIGNoZWNrIGZvciB0aGF0IGZsYWcuCi0JICovCi0JaWYgKGFjcGlfZ2JsX3Jvb3RfdGFibGVfbGlzdC5mbGFncyAmIEFDUElfUk9PVF9PUklHSU5fQUxMT0NBVEVEKSB7Ci0JCUFDUElfRlJFRShhY3BpX2dibF9yb290X3RhYmxlX2xpc3QudGFibGVzKTsKLQl9Ci0KLQlhY3BpX2dibF9yb290X3RhYmxlX2xpc3QudGFibGVzID0gTlVMTDsKLQlhY3BpX2dibF9yb290X3RhYmxlX2xpc3QuZmxhZ3MgPSAwOwotCWFjcGlfZ2JsX3Jvb3RfdGFibGVfbGlzdC5jb3VudCA9IDA7Ci0KLQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sICJBQ1BJIFRhYmxlcyBmcmVlZFxuIikpOwotCSh2b2lkKWFjcGlfdXRfcmVsZWFzZV9tdXRleChBQ1BJX01UWF9UQUJMRVMpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX3RiX2RlbGV0ZV9uYW1lc3BhY2VfYnlfb3duZXIKLSAqCi0gKiBQQVJBTUVURVJTOiAgdGFibGVfaW5kZXggICAgICAgICAtIFRhYmxlIGluZGV4Ci0gKgotICogUkVUVVJOOiAgICAgIE5vbmUKLSAqCi0gKiBERVNDUklQVElPTjogRGVsZXRlIGFsbCBuYW1lc3BhY2Ugb2JqZWN0cyBjcmVhdGVkIHdoZW4gdGhpcyB0YWJsZSB3YXMgbG9hZGVkLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXZvaWQgYWNwaV90Yl9kZWxldGVfbmFtZXNwYWNlX2J5X293bmVyKHUzMiB0YWJsZV9pbmRleCkKLXsKLQlhY3BpX293bmVyX2lkIG93bmVyX2lkOwotCi0JKHZvaWQpYWNwaV91dF9hY3F1aXJlX211dGV4KEFDUElfTVRYX1RBQkxFUyk7Ci0JaWYgKHRhYmxlX2luZGV4IDwgYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LmNvdW50KSB7Ci0JCW93bmVyX2lkID0KLQkJICAgIGFjcGlfZ2JsX3Jvb3RfdGFibGVfbGlzdC50YWJsZXNbdGFibGVfaW5kZXhdLm93bmVyX2lkOwotCX0gZWxzZSB7Ci0JCSh2b2lkKWFjcGlfdXRfcmVsZWFzZV9tdXRleChBQ1BJX01UWF9UQUJMRVMpOwotCQlyZXR1cm47Ci0JfQotCi0JKHZvaWQpYWNwaV91dF9yZWxlYXNlX211dGV4KEFDUElfTVRYX1RBQkxFUyk7Ci0JYWNwaV9uc19kZWxldGVfbmFtZXNwYWNlX2J5X293bmVyKG93bmVyX2lkKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV90Yl9hbGxvY2F0ZV9vd25lcl9pZAotICoKLSAqIFBBUkFNRVRFUlM6ICB0YWJsZV9pbmRleCAgICAgICAgIC0gVGFibGUgaW5kZXgKLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IEFsbG9jYXRlcyBvd25lcl9pZCBpbiB0YWJsZV9kZXNjCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotYWNwaV9zdGF0dXMgYWNwaV90Yl9hbGxvY2F0ZV9vd25lcl9pZCh1MzIgdGFibGVfaW5kZXgpCi17Ci0JYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfQkFEX1BBUkFNRVRFUjsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UodGJfYWxsb2NhdGVfb3duZXJfaWQpOwotCi0JKHZvaWQpYWNwaV91dF9hY3F1aXJlX211dGV4KEFDUElfTVRYX1RBQkxFUyk7Ci0JaWYgKHRhYmxlX2luZGV4IDwgYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LmNvdW50KSB7Ci0JCXN0YXR1cyA9IGFjcGlfdXRfYWxsb2NhdGVfb3duZXJfaWQKLQkJICAgICgmKGFjcGlfZ2JsX3Jvb3RfdGFibGVfbGlzdC50YWJsZXNbdGFibGVfaW5kZXhdLm93bmVyX2lkKSk7Ci0JfQotCi0JKHZvaWQpYWNwaV91dF9yZWxlYXNlX211dGV4KEFDUElfTVRYX1RBQkxFUyk7Ci0JcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfdGJfcmVsZWFzZV9vd25lcl9pZAotICoKLSAqIFBBUkFNRVRFUlM6ICB0YWJsZV9pbmRleCAgICAgICAgIC0gVGFibGUgaW5kZXgKLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IFJlbGVhc2VzIG93bmVyX2lkIGluIHRhYmxlX2Rlc2MKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1hY3BpX3N0YXR1cyBhY3BpX3RiX3JlbGVhc2Vfb3duZXJfaWQodTMyIHRhYmxlX2luZGV4KQotewotCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX0JBRF9QQVJBTUVURVI7Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKHRiX3JlbGVhc2Vfb3duZXJfaWQpOwotCi0JKHZvaWQpYWNwaV91dF9hY3F1aXJlX211dGV4KEFDUElfTVRYX1RBQkxFUyk7Ci0JaWYgKHRhYmxlX2luZGV4IDwgYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LmNvdW50KSB7Ci0JCWFjcGlfdXRfcmVsZWFzZV9vd25lcl9pZCgmCi0JCQkJCSAoYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LgotCQkJCQkgIHRhYmxlc1t0YWJsZV9pbmRleF0ub3duZXJfaWQpKTsKLQkJc3RhdHVzID0gQUVfT0s7Ci0JfQotCi0JKHZvaWQpYWNwaV91dF9yZWxlYXNlX211dGV4KEFDUElfTVRYX1RBQkxFUyk7Ci0JcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfdGJfZ2V0X293bmVyX2lkCi0gKgotICogUEFSQU1FVEVSUzogIHRhYmxlX2luZGV4ICAgICAgICAgLSBUYWJsZSBpbmRleAotICogICAgICAgICAgICAgIG93bmVyX2lkICAgICAgICAgICAgLSBXaGVyZSB0aGUgdGFibGUgb3duZXJfaWQgaXMgcmV0dXJuZWQKLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IHJldHVybnMgb3duZXJfaWQgZm9yIHRoZSBBQ1BJIHRhYmxlCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotYWNwaV9zdGF0dXMgYWNwaV90Yl9nZXRfb3duZXJfaWQodTMyIHRhYmxlX2luZGV4LCBhY3BpX293bmVyX2lkICpvd25lcl9pZCkKLXsKLQlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9CQURfUEFSQU1FVEVSOwotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSh0Yl9nZXRfb3duZXJfaWQpOwotCi0JKHZvaWQpYWNwaV91dF9hY3F1aXJlX211dGV4KEFDUElfTVRYX1RBQkxFUyk7Ci0JaWYgKHRhYmxlX2luZGV4IDwgYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LmNvdW50KSB7Ci0JCSpvd25lcl9pZCA9Ci0JCSAgICBhY3BpX2dibF9yb290X3RhYmxlX2xpc3QudGFibGVzW3RhYmxlX2luZGV4XS5vd25lcl9pZDsKLQkJc3RhdHVzID0gQUVfT0s7Ci0JfQotCi0JKHZvaWQpYWNwaV91dF9yZWxlYXNlX211dGV4KEFDUElfTVRYX1RBQkxFUyk7Ci0JcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfdGJfaXNfdGFibGVfbG9hZGVkCi0gKgotICogUEFSQU1FVEVSUzogIHRhYmxlX2luZGV4ICAgICAgICAgLSBUYWJsZSBpbmRleAotICoKLSAqIFJFVFVSTjogICAgICBUYWJsZSBMb2FkZWQgRmxhZwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXU4IGFjcGlfdGJfaXNfdGFibGVfbG9hZGVkKHUzMiB0YWJsZV9pbmRleCkKLXsKLQl1OCBpc19sb2FkZWQgPSBGQUxTRTsKLQotCSh2b2lkKWFjcGlfdXRfYWNxdWlyZV9tdXRleChBQ1BJX01UWF9UQUJMRVMpOwotCWlmICh0YWJsZV9pbmRleCA8IGFjcGlfZ2JsX3Jvb3RfdGFibGVfbGlzdC5jb3VudCkgewotCQlpc19sb2FkZWQgPSAodTgpCi0JCSAgICAoYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LnRhYmxlc1t0YWJsZV9pbmRleF0uCi0JCSAgICAgZmxhZ3MgJiBBQ1BJX1RBQkxFX0lTX0xPQURFRCk7Ci0JfQotCi0JKHZvaWQpYWNwaV91dF9yZWxlYXNlX211dGV4KEFDUElfTVRYX1RBQkxFUyk7Ci0JcmV0dXJuIChpc19sb2FkZWQpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX3RiX3NldF90YWJsZV9sb2FkZWRfZmxhZwotICoKLSAqIFBBUkFNRVRFUlM6ICB0YWJsZV9pbmRleCAgICAgICAgIC0gVGFibGUgaW5kZXgKLSAqICAgICAgICAgICAgICBpc19sb2FkZWQgICAgICAgICAgIC0gVFJVRSBpZiB0YWJsZSBpcyBsb2FkZWQsIEZBTFNFIG90aGVyd2lzZQotICoKLSAqIFJFVFVSTjogICAgICBOb25lCi0gKgotICogREVTQ1JJUFRJT046IFNldHMgdGhlIHRhYmxlIGxvYWRlZCBmbGFnIHRvIGVpdGhlciBUUlVFIG9yIEZBTFNFLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXZvaWQgYWNwaV90Yl9zZXRfdGFibGVfbG9hZGVkX2ZsYWcodTMyIHRhYmxlX2luZGV4LCB1OCBpc19sb2FkZWQpCi17Ci0KLQkodm9pZClhY3BpX3V0X2FjcXVpcmVfbXV0ZXgoQUNQSV9NVFhfVEFCTEVTKTsKLQlpZiAodGFibGVfaW5kZXggPCBhY3BpX2dibF9yb290X3RhYmxlX2xpc3QuY291bnQpIHsKLQkJaWYgKGlzX2xvYWRlZCkgewotCQkJYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LnRhYmxlc1t0YWJsZV9pbmRleF0uZmxhZ3MgfD0KLQkJCSAgICBBQ1BJX1RBQkxFX0lTX0xPQURFRDsKLQkJfSBlbHNlIHsKLQkJCWFjcGlfZ2JsX3Jvb3RfdGFibGVfbGlzdC50YWJsZXNbdGFibGVfaW5kZXhdLmZsYWdzICY9Ci0JCQkgICAgfkFDUElfVEFCTEVfSVNfTE9BREVEOwotCQl9Ci0JfQotCi0JKHZvaWQpYWNwaV91dF9yZWxlYXNlX211dGV4KEFDUElfTVRYX1RBQkxFUyk7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvdGFibGVzL3RidXRpbHMuYyBiL2RyaXZlcnMvYWNwaS90YWJsZXMvdGJ1dGlscy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwY2M5MmVmLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvYWNwaS90YWJsZXMvdGJ1dGlscy5jCisrKyAvZGV2L251bGwKQEAgLTEsNTU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBNb2R1bGUgTmFtZTogdGJ1dGlscyAgIC0gdGFibGUgdXRpbGl0aWVzCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwOCwgSW50ZWwgQ29ycC4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKLSAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIGF0IG1pbmltdW0gYSBkaXNjbGFpbWVyCi0gKiAgICBzdWJzdGFudGlhbGx5IHNpbWlsYXIgdG8gdGhlICJOTyBXQVJSQU5UWSIgZGlzY2xhaW1lciBiZWxvdwotICogICAgKCJEaXNjbGFpbWVyIikgYW5kIGFueSByZWRpc3RyaWJ1dGlvbiBtdXN0IGJlIGNvbmRpdGlvbmVkIHVwb24KLSAqICAgIGluY2x1ZGluZyBhIHN1YnN0YW50aWFsbHkgc2ltaWxhciBEaXNjbGFpbWVyIHJlcXVpcmVtZW50IGZvciBmdXJ0aGVyCi0gKiAgICBiaW5hcnkgcmVkaXN0cmlidXRpb24uCi0gKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMKLSAqICAgIG9mIGFueSBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTk8gV0FSUkFOVFkKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAotICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKLSAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HCi0gKiBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKLSAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KLSAqLwotCi0jaW5jbHVkZSA8YWNwaS9hY3BpLmg+Ci0jaW5jbHVkZSA8YWNwaS9hY3RhYmxlcy5oPgotCi0jZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9UQUJMRVMKLUFDUElfTU9EVUxFX05BTUUoInRidXRpbHMiKQotCi0vKiBMb2NhbCBwcm90b3R5cGVzICovCi1zdGF0aWMgYWNwaV9waHlzaWNhbF9hZGRyZXNzCi1hY3BpX3RiX2dldF9yb290X3RhYmxlX2VudHJ5KHU4ICp0YWJsZV9lbnRyeSwgdTMyIHRhYmxlX2VudHJ5X3NpemUpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX3RiX2NoZWNrX3hzZHQKLSAqCi0gKiBQQVJBTUVURVJTOiAgYWRkcmVzcyAgICAgICAgICAgICAgICAgICAgLSBQb2ludGVyIHRvIHRoZSBYU0RUCi0gKgotICogUkVUVVJOOiAgICAgIHN0YXR1cwotICoJCUFFX09LIC0gWFNEVCBpcyBva2F5Ci0gKgkJQUVfTk9fTUVNT1JZIC0gY2FuJ3QgbWFwIFhTRFQKLSAqCQlBRV9JTlZBTElEX1RBQkxFX0xFTkdUSCAtIGludmFsaWQgdGFibGUgbGVuZ3RoCi0gKgkJQUVfTlVMTF9FTlRSWSAtIFhTRFQgaGFzIE5VTEwgZW50cnkKLSAqCi0gKiBERVNDUklQVElPTjogdmFsaWRhdGUgWFNEVAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgYWNwaV9zdGF0dXMKLWFjcGlfdGJfY2hlY2tfeHNkdChhY3BpX3BoeXNpY2FsX2FkZHJlc3MgYWRkcmVzcykKLXsKLQlzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKnRhYmxlOwotCXUzMiBsZW5ndGg7Ci0JdTY0IHhzZHRfZW50cnlfYWRkcmVzczsKLQl1OCAqdGFibGVfZW50cnk7Ci0JdTMyIHRhYmxlX2NvdW50OwotCWludCBpOwotCi0JdGFibGUgPSBhY3BpX29zX21hcF9tZW1vcnkoYWRkcmVzcywgc2l6ZW9mKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlcikpOwotCWlmICghdGFibGUpCi0JCXJldHVybiBBRV9OT19NRU1PUlk7Ci0KLQlsZW5ndGggPSB0YWJsZS0+bGVuZ3RoOwotCWFjcGlfb3NfdW5tYXBfbWVtb3J5KHRhYmxlLCBzaXplb2Yoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyKSk7Ci0JaWYgKGxlbmd0aCA8IHNpemVvZihzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIpKQotCQlyZXR1cm4gQUVfSU5WQUxJRF9UQUJMRV9MRU5HVEg7Ci0KLQl0YWJsZSA9IGFjcGlfb3NfbWFwX21lbW9yeShhZGRyZXNzLCBsZW5ndGgpOwotCWlmICghdGFibGUpCi0JCXJldHVybiBBRV9OT19NRU1PUlk7Ci0KLQkvKiBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0YWJsZXMgZGVzY3JpYmVkIGluIFhTRFQgKi8KLQl0YWJsZV9jb3VudCA9Ci0JCSh1MzIpICgodGFibGUtPmxlbmd0aCAtCi0JCXNpemVvZihzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIpKSAvIHNpemVvZih1NjQpKTsKLQl0YWJsZV9lbnRyeSA9Ci0JCUFDUElfQ0FTVF9QVFIodTgsIHRhYmxlKSArIHNpemVvZihzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIpOwotCWZvciAoaSA9IDA7IGkgPCB0YWJsZV9jb3VudDsgaSsrKSB7Ci0JCUFDUElfTU9WRV82NF9UT182NCgmeHNkdF9lbnRyeV9hZGRyZXNzLCB0YWJsZV9lbnRyeSk7Ci0JCWlmICgheHNkdF9lbnRyeV9hZGRyZXNzKSB7Ci0JCQkvKiBYU0RUIGhhcyBOVUxMIGVudHJ5ICovCi0JCQlicmVhazsKLQkJfQotCQl0YWJsZV9lbnRyeSArPSBzaXplb2YodTY0KTsKLQl9Ci0JYWNwaV9vc191bm1hcF9tZW1vcnkodGFibGUsIGxlbmd0aCk7Ci0KLQlpZiAoaSA8IHRhYmxlX2NvdW50KQotCQlyZXR1cm4gQUVfTlVMTF9FTlRSWTsKLQllbHNlCi0JCXJldHVybiBBRV9PSzsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV90Yl90YWJsZXNfbG9hZGVkCi0gKgotICogUEFSQU1FVEVSUzogIE5vbmUKLSAqCi0gKiBSRVRVUk46ICAgICAgVFJVRSBpZiByZXF1aXJlZCBBQ1BJIHRhYmxlcyBhcmUgbG9hZGVkCi0gKgotICogREVTQ1JJUFRJT046IERldGVybWluZSBpZiB0aGUgbWluaW11bSByZXF1aXJlZCBBQ1BJIHRhYmxlcyBhcmUgcHJlc2VudAotICogICAgICAgICAgICAgIChGQURULCBGQUNTLCBEU0RUKQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXU4IGFjcGlfdGJfdGFibGVzX2xvYWRlZCh2b2lkKQotewotCi0JaWYgKGFjcGlfZ2JsX3Jvb3RfdGFibGVfbGlzdC5jb3VudCA+PSAzKSB7Ci0JCXJldHVybiAoVFJVRSk7Ci0JfQotCi0JcmV0dXJuIChGQUxTRSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfdGJfcHJpbnRfdGFibGVfaGVhZGVyCi0gKgotICogUEFSQU1FVEVSUzogIEFkZHJlc3MgICAgICAgICAgICAgLSBUYWJsZSBwaHlzaWNhbCBhZGRyZXNzCi0gKiAgICAgICAgICAgICAgSGVhZGVyICAgICAgICAgICAgICAtIFRhYmxlIGhlYWRlcgotICoKLSAqIFJFVFVSTjogICAgICBOb25lCi0gKgotICogREVTQ1JJUFRJT046IFByaW50IGFuIEFDUEkgdGFibGUgaGVhZGVyLiBTcGVjaWFsIGNhc2VzIGZvciBGQUNTIGFuZCBSU0RQLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXZvaWQKLWFjcGlfdGJfcHJpbnRfdGFibGVfaGVhZGVyKGFjcGlfcGh5c2ljYWxfYWRkcmVzcyBhZGRyZXNzLAotCQkJICAgc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICpoZWFkZXIpCi17Ci0KLQlpZiAoQUNQSV9DT01QQVJFX05BTUUoaGVhZGVyLT5zaWduYXR1cmUsIEFDUElfU0lHX0ZBQ1MpKSB7Ci0KLQkJLyogRkFDUyBvbmx5IGhhcyBzaWduYXR1cmUgYW5kIGxlbmd0aCBmaWVsZHMgb2YgY29tbW9uIHRhYmxlIGhlYWRlciAqLwotCi0JCUFDUElfSU5GTygoQUVfSU5GTywgIiU0LjRzICUwOGxYLCAlMDRYIiwKLQkJCSAgIGhlYWRlci0+c2lnbmF0dXJlLCAodW5zaWduZWQgbG9uZylhZGRyZXNzLAotCQkJICAgaGVhZGVyLT5sZW5ndGgpKTsKLQl9IGVsc2UgaWYgKEFDUElfQ09NUEFSRV9OQU1FKGhlYWRlci0+c2lnbmF0dXJlLCBBQ1BJX1NJR19SU0RQKSkgewotCi0JCS8qIFJTRFAgaGFzIG5vIGNvbW1vbiBmaWVsZHMgKi8KLQotCQlBQ1BJX0lORk8oKEFFX0lORk8sICJSU0RQICUwOGxYLCAlMDRYIChyJWQgJTYuNnMpIiwKLQkJCSAgICh1bnNpZ25lZCBsb25nKWFkZHJlc3MsCi0JCQkgICAoQUNQSV9DQVNUX1BUUihzdHJ1Y3QgYWNwaV90YWJsZV9yc2RwLCBoZWFkZXIpLT4KLQkJCSAgICByZXZpc2lvbiA+Ci0JCQkgICAgMCkgPyBBQ1BJX0NBU1RfUFRSKHN0cnVjdCBhY3BpX3RhYmxlX3JzZHAsCi0JCQkJCSAgICAgICBoZWFkZXIpLT5sZW5ndGggOiAyMCwKLQkJCSAgIEFDUElfQ0FTVF9QVFIoc3RydWN0IGFjcGlfdGFibGVfcnNkcCwKLQkJCQkJIGhlYWRlciktPnJldmlzaW9uLAotCQkJICAgQUNQSV9DQVNUX1BUUihzdHJ1Y3QgYWNwaV90YWJsZV9yc2RwLAotCQkJCQkgaGVhZGVyKS0+b2VtX2lkKSk7Ci0JfSBlbHNlIHsKLQkJLyogU3RhbmRhcmQgQUNQSSB0YWJsZSB3aXRoIGZ1bGwgY29tbW9uIGhlYWRlciAqLwotCi0JCUFDUElfSU5GTygoQUVfSU5GTywKLQkJCSAgICIlNC40cyAlMDhsWCwgJTA0WCAociVkICU2LjZzICU4LjhzICU4WCAlNC40cyAlOFgpIiwKLQkJCSAgIGhlYWRlci0+c2lnbmF0dXJlLCAodW5zaWduZWQgbG9uZylhZGRyZXNzLAotCQkJICAgaGVhZGVyLT5sZW5ndGgsIGhlYWRlci0+cmV2aXNpb24sIGhlYWRlci0+b2VtX2lkLAotCQkJICAgaGVhZGVyLT5vZW1fdGFibGVfaWQsIGhlYWRlci0+b2VtX3JldmlzaW9uLAotCQkJICAgaGVhZGVyLT5hc2xfY29tcGlsZXJfaWQsCi0JCQkgICBoZWFkZXItPmFzbF9jb21waWxlcl9yZXZpc2lvbikpOwotCX0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV90Yl92YWxpZGF0ZV9jaGVja3N1bQotICoKLSAqIFBBUkFNRVRFUlM6ICBUYWJsZSAgICAgICAgICAgICAgIC0gQUNQSSB0YWJsZSB0byB2ZXJpZnkKLSAqICAgICAgICAgICAgICBMZW5ndGggICAgICAgICAgICAgIC0gTGVuZ3RoIG9mIGVudGlyZSB0YWJsZQotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKLSAqCi0gKiBERVNDUklQVElPTjogVmVyaWZpZXMgdGhhdCB0aGUgdGFibGUgY2hlY2tzdW1zIHRvIHplcm8uIE9wdGlvbmFsbHkgcmV0dXJucwotICogICAgICAgICAgICAgIGV4Y2VwdGlvbiBvbiBiYWQgY2hlY2tzdW0uCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotYWNwaV9zdGF0dXMgYWNwaV90Yl92ZXJpZnlfY2hlY2tzdW0oc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICp0YWJsZSwgdTMyIGxlbmd0aCkKLXsKLQl1OCBjaGVja3N1bTsKLQotCS8qIENvbXB1dGUgdGhlIGNoZWNrc3VtIG9uIHRoZSB0YWJsZSAqLwotCi0JY2hlY2tzdW0gPSBhY3BpX3RiX2NoZWNrc3VtKEFDUElfQ0FTVF9QVFIodTgsIHRhYmxlKSwgbGVuZ3RoKTsKLQotCS8qIENoZWNrc3VtIG9rPyAoc2hvdWxkIGJlIHplcm8pICovCi0KLQlpZiAoY2hlY2tzdW0pIHsKLQkJQUNQSV9XQVJOSU5HKChBRV9JTkZPLAotCQkJICAgICAgIkluY29ycmVjdCBjaGVja3N1bSBpbiB0YWJsZSBbJTQuNHNdIC0gJTIuMlgsIHNob3VsZCBiZSAlMi4yWCIsCi0JCQkgICAgICB0YWJsZS0+c2lnbmF0dXJlLCB0YWJsZS0+Y2hlY2tzdW0sCi0JCQkgICAgICAodTgpICh0YWJsZS0+Y2hlY2tzdW0gLSBjaGVja3N1bSkpKTsKLQotI2lmIChBQ1BJX0NIRUNLU1VNX0FCT1JUKQotCi0JCXJldHVybiAoQUVfQkFEX0NIRUNLU1VNKTsKLSNlbmRpZgotCX0KLQotCXJldHVybiAoQUVfT0spOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX3RiX2NoZWNrc3VtCi0gKgotICogUEFSQU1FVEVSUzogIEJ1ZmZlciAgICAgICAgICAtIFBvaW50ZXIgdG8gbWVtb3J5IHJlZ2lvbiB0byBiZSBjaGVja2VkCi0gKiAgICAgICAgICAgICAgTGVuZ3RoICAgICAgICAgIC0gTGVuZ3RoIG9mIHRoaXMgbWVtb3J5IHJlZ2lvbgotICoKLSAqIFJFVFVSTjogICAgICBDaGVja3N1bSAodTgpCi0gKgotICogREVTQ1JJUFRJT046IENhbGN1bGF0ZXMgY2lyY3VsYXIgY2hlY2tzdW0gb2YgbWVtb3J5IHJlZ2lvbi4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi11OCBhY3BpX3RiX2NoZWNrc3VtKHU4ICpidWZmZXIsIHUzMiBsZW5ndGgpCi17Ci0JdTggc3VtID0gMDsKLQl1OCAqZW5kID0gYnVmZmVyICsgbGVuZ3RoOwotCi0Jd2hpbGUgKGJ1ZmZlciA8IGVuZCkgewotCQlzdW0gPSAodTgpIChzdW0gKyAqKGJ1ZmZlcisrKSk7Ci0JfQotCi0JcmV0dXJuIHN1bTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV90Yl9pbnN0YWxsX3RhYmxlCi0gKgotICogUEFSQU1FVEVSUzogIEFkZHJlc3MgICAgICAgICAgICAgICAgIC0gUGh5c2ljYWwgYWRkcmVzcyBvZiBEU0RUIG9yIEZBQ1MKLSAqICAgICAgICAgICAgICBGbGFncyAgICAgICAgICAgICAgICAgICAtIEZsYWdzCi0gKiAgICAgICAgICAgICAgU2lnbmF0dXJlICAgICAgICAgICAgICAgLSBUYWJsZSBzaWduYXR1cmUsIE5VTEwgaWYgbm8gbmVlZCB0bwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2gKLSAqICAgICAgICAgICAgICB0YWJsZV9pbmRleCAgICAgICAgICAgICAtIEluZGV4IGludG8gcm9vdCB0YWJsZSBhcnJheQotICoKLSAqIFJFVFVSTjogICAgICBOb25lCi0gKgotICogREVTQ1JJUFRJT046IEluc3RhbGwgYW4gQUNQSSB0YWJsZSBpbnRvIHRoZSBnbG9iYWwgZGF0YSBzdHJ1Y3R1cmUuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdm9pZAotYWNwaV90Yl9pbnN0YWxsX3RhYmxlKGFjcGlfcGh5c2ljYWxfYWRkcmVzcyBhZGRyZXNzLAotCQkgICAgICB1OCBmbGFncywgY2hhciAqc2lnbmF0dXJlLCB1MzIgdGFibGVfaW5kZXgpCi17Ci0Jc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICp0YWJsZTsKLQotCWlmICghYWRkcmVzcykgewotCQlBQ1BJX0VSUk9SKChBRV9JTkZPLAotCQkJICAgICJOdWxsIHBoeXNpY2FsIGFkZHJlc3MgZm9yIEFDUEkgdGFibGUgWyVzXSIsCi0JCQkgICAgc2lnbmF0dXJlKSk7Ci0JCXJldHVybjsKLQl9Ci0KLQkvKiBNYXAganVzdCB0aGUgdGFibGUgaGVhZGVyICovCi0KLQl0YWJsZSA9IGFjcGlfb3NfbWFwX21lbW9yeShhZGRyZXNzLCBzaXplb2Yoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyKSk7Ci0JaWYgKCF0YWJsZSkgewotCQlyZXR1cm47Ci0JfQotCi0JLyogSWYgYSBwYXJ0aWN1bGFyIHNpZ25hdHVyZSBpcyBleHBlY3RlZCwgc2lnbmF0dXJlIG11c3QgbWF0Y2ggKi8KLQotCWlmIChzaWduYXR1cmUgJiYgIUFDUElfQ09NUEFSRV9OQU1FKHRhYmxlLT5zaWduYXR1cmUsIHNpZ25hdHVyZSkpIHsKLQkJQUNQSV9FUlJPUigoQUVfSU5GTywKLQkJCSAgICAiSW52YWxpZCBzaWduYXR1cmUgMHglWCBmb3IgQUNQSSB0YWJsZSBbJXNdIiwKLQkJCSAgICAqQUNQSV9DQVNUX1BUUih1MzIsIHRhYmxlLT5zaWduYXR1cmUpLCBzaWduYXR1cmUpKTsKLQkJZ290byB1bm1hcF9hbmRfZXhpdDsKLQl9Ci0KLQkvKiBJbml0aWFsaXplIHRoZSB0YWJsZSBlbnRyeSAqLwotCi0JYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LnRhYmxlc1t0YWJsZV9pbmRleF0uYWRkcmVzcyA9IGFkZHJlc3M7Ci0JYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LnRhYmxlc1t0YWJsZV9pbmRleF0ubGVuZ3RoID0gdGFibGUtPmxlbmd0aDsKLQlhY3BpX2dibF9yb290X3RhYmxlX2xpc3QudGFibGVzW3RhYmxlX2luZGV4XS5mbGFncyA9IGZsYWdzOwotCi0JQUNQSV9NT1ZFXzMyX1RPXzMyKCYKLQkJCSAgIChhY3BpX2dibF9yb290X3RhYmxlX2xpc3QudGFibGVzW3RhYmxlX2luZGV4XS4KLQkJCSAgICBzaWduYXR1cmUpLCB0YWJsZS0+c2lnbmF0dXJlKTsKLQotCWFjcGlfdGJfcHJpbnRfdGFibGVfaGVhZGVyKGFkZHJlc3MsIHRhYmxlKTsKLQotCWlmICh0YWJsZV9pbmRleCA9PSBBQ1BJX1RBQkxFX0lOREVYX0RTRFQpIHsKLQotCQkvKiBHbG9iYWwgaW50ZWdlciB3aWR0aCBpcyBiYXNlZCB1cG9uIHJldmlzaW9uIG9mIHRoZSBEU0RUICovCi0KLQkJYWNwaV91dF9zZXRfaW50ZWdlcl93aWR0aCh0YWJsZS0+cmV2aXNpb24pOwotCX0KLQotICAgICAgdW5tYXBfYW5kX2V4aXQ6Ci0JYWNwaV9vc191bm1hcF9tZW1vcnkodGFibGUsIHNpemVvZihzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIpKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV90Yl9nZXRfcm9vdF90YWJsZV9lbnRyeQotICoKLSAqIFBBUkFNRVRFUlM6ICB0YWJsZV9lbnRyeSAgICAgICAgIC0gUG9pbnRlciB0byB0aGUgUlNEVC9YU0RUIHRhYmxlIGVudHJ5Ci0gKiAgICAgICAgICAgICAgdGFibGVfZW50cnlfc2l6ZSAgICAtIHNpemVvZiAzMiBvciA2NCAoUlNEVCBvciBYU0RUKQotICoKLSAqIFJFVFVSTjogICAgICBQaHlzaWNhbCBhZGRyZXNzIGV4dHJhY3RlZCBmcm9tIHRoZSByb290IHRhYmxlCi0gKgotICogREVTQ1JJUFRJT046IEdldCBvbmUgcm9vdCB0YWJsZSBlbnRyeS4gSGFuZGxlcyAzMi1iaXQgYW5kIDY0LWJpdCBjYXNlcyBvbgotICogICAgICAgICAgICAgIGJvdGggMzItYml0IGFuZCA2NC1iaXQgcGxhdGZvcm1zCi0gKgotICogTk9URTogICAgICAgIGFjcGlfcGh5c2ljYWxfYWRkcmVzcyBpcyAzMi1iaXQgb24gMzItYml0IHBsYXRmb3JtcywgNjQtYml0IG9uCi0gKiAgICAgICAgICAgICAgNjQtYml0IHBsYXRmb3Jtcy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgYWNwaV9waHlzaWNhbF9hZGRyZXNzCi1hY3BpX3RiX2dldF9yb290X3RhYmxlX2VudHJ5KHU4ICp0YWJsZV9lbnRyeSwgdTMyIHRhYmxlX2VudHJ5X3NpemUpCi17Ci0JdTY0IGFkZHJlc3M2NDsKLQotCS8qCi0JICogR2V0IHRoZSB0YWJsZSBwaHlzaWNhbCBhZGRyZXNzICgzMi1iaXQgZm9yIFJTRFQsIDY0LWJpdCBmb3IgWFNEVCk6Ci0JICogTm90ZTogQWRkcmVzc2VzIGFyZSAzMi1iaXQgYWxpZ25lZCAobm90IDY0KSBpbiBib3RoIFJTRFQgYW5kIFhTRFQKLQkgKi8KLQlpZiAodGFibGVfZW50cnlfc2l6ZSA9PSBzaXplb2YodTMyKSkgewotCQkvKgotCQkgKiAzMi1iaXQgcGxhdGZvcm0sIFJTRFQ6IFJldHVybiAzMi1iaXQgdGFibGUgZW50cnkKLQkJICogNjQtYml0IHBsYXRmb3JtLCBSU0RUOiBFeHBhbmQgMzItYml0IHRvIDY0LWJpdCBhbmQgcmV0dXJuCi0JCSAqLwotCQlyZXR1cm4gKChhY3BpX3BoeXNpY2FsX2FkZHJlc3MpCi0JCQkoKkFDUElfQ0FTVF9QVFIodTMyLCB0YWJsZV9lbnRyeSkpKTsKLQl9IGVsc2UgewotCQkvKgotCQkgKiAzMi1iaXQgcGxhdGZvcm0sIFhTRFQ6IFRydW5jYXRlIDY0LWJpdCB0byAzMi1iaXQgYW5kIHJldHVybgotCQkgKiA2NC1iaXQgcGxhdGZvcm0sIFhTRFQ6IE1vdmUgKHVuYWxpZ25lZCkgNjQtYml0IHRvIGxvY2FsLCByZXR1cm4gNjQtYml0Ci0JCSAqLwotCQlBQ1BJX01PVkVfNjRfVE9fNjQoJmFkZHJlc3M2NCwgdGFibGVfZW50cnkpOwotCi0jaWYgQUNQSV9NQUNISU5FX1dJRFRIID09IDMyCi0JCWlmIChhZGRyZXNzNjQgPiBBQ1BJX1VJTlQzMl9NQVgpIHsKLQotCQkJLyogV2lsbCB0cnVuY2F0ZSA2NC1iaXQgYWRkcmVzcyB0byAzMiBiaXRzLCBpc3N1ZSB3YXJuaW5nICovCi0KLQkJCUFDUElfV0FSTklORygoQUVfSU5GTywKLQkJCQkgICAgICAiNjQtYml0IFBoeXNpY2FsIEFkZHJlc3MgaW4gWFNEVCBpcyB0b28gbGFyZ2UgKCU4LjhYJTguOFgpLCB0cnVuY2F0aW5nIiwKLQkJCQkgICAgICBBQ1BJX0ZPUk1BVF9VSU5UNjQoYWRkcmVzczY0KSkpOwotCQl9Ci0jZW5kaWYKLQkJcmV0dXJuICgoYWNwaV9waHlzaWNhbF9hZGRyZXNzKSAoYWRkcmVzczY0KSk7Ci0JfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX3RiX3BhcnNlX3Jvb3RfdGFibGUKLSAqCi0gKiBQQVJBTUVURVJTOiAgUnNkcCAgICAgICAgICAgICAgICAgICAgLSBQb2ludGVyIHRvIHRoZSBSU0RQCi0gKiAgICAgICAgICAgICAgRmxhZ3MgICAgICAgICAgICAgICAgICAgLSBGbGFncwotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKLSAqCi0gKiBERVNDUklQVElPTjogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gcGFyc2UgdGhlIFJvb3QgU3lzdGVtIERlc2NyaXB0aW9uCi0gKiAgICAgICAgICAgICAgVGFibGUgKFJTRFQgb3IgWFNEVCkKLSAqCi0gKiBOT1RFOiAgICAgICAgVGFibGVzIGFyZSBtYXBwZWQgKG5vdCBjb3BpZWQpIGZvciBlZmZpY2llbmN5LiBUaGUgRkFDUyBtdXN0Ci0gKiAgICAgICAgICAgICAgYmUgbWFwcGVkIGFuZCBjYW5ub3QgYmUgY29waWVkIGJlY2F1c2UgaXQgY29udGFpbnMgdGhlIGFjdHVhbAotICogICAgICAgICAgICAgIG1lbW9yeSBsb2NhdGlvbiBvZiB0aGUgQUNQSSBHbG9iYWwgTG9jay4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1hY3BpX3N0YXR1cyBfX2luaXQKLWFjcGlfdGJfcGFyc2Vfcm9vdF90YWJsZShhY3BpX3BoeXNpY2FsX2FkZHJlc3MgcnNkcF9hZGRyZXNzLCB1OCBmbGFncykKLXsKLQlzdHJ1Y3QgYWNwaV90YWJsZV9yc2RwICpyc2RwOwotCXUzMiB0YWJsZV9lbnRyeV9zaXplOwotCXUzMiBpOwotCXUzMiB0YWJsZV9jb3VudDsKLQlzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKnRhYmxlOwotCWFjcGlfcGh5c2ljYWxfYWRkcmVzcyBhZGRyZXNzOwotCWFjcGlfcGh5c2ljYWxfYWRkcmVzcyB1bmluaXRpYWxpemVkX3Zhcihyc2R0X2FkZHJlc3MpOwotCXUzMiBsZW5ndGg7Ci0JdTggKnRhYmxlX2VudHJ5OwotCWFjcGlfc3RhdHVzIHN0YXR1czsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UodGJfcGFyc2Vfcm9vdF90YWJsZSk7Ci0KLQkvKgotCSAqIE1hcCB0aGUgZW50aXJlIFJTRFAgYW5kIGV4dHJhY3QgdGhlIGFkZHJlc3Mgb2YgdGhlIFJTRFQgb3IgWFNEVAotCSAqLwotCXJzZHAgPSBhY3BpX29zX21hcF9tZW1vcnkocnNkcF9hZGRyZXNzLCBzaXplb2Yoc3RydWN0IGFjcGlfdGFibGVfcnNkcCkpOwotCWlmICghcnNkcCkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9fTUVNT1JZKTsKLQl9Ci0KLQlhY3BpX3RiX3ByaW50X3RhYmxlX2hlYWRlcihyc2RwX2FkZHJlc3MsCi0JCQkJICAgQUNQSV9DQVNUX1BUUihzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIsCi0JCQkJCQkgcnNkcCkpOwotCi0JLyogRGlmZmVyZW50aWF0ZSBiZXR3ZWVuIFJTRFQgYW5kIFhTRFQgcm9vdCB0YWJsZXMgKi8KLQotCWlmIChyc2RwLT5yZXZpc2lvbiA+IDEgJiYgcnNkcC0+eHNkdF9waHlzaWNhbF9hZGRyZXNzKSB7Ci0JCS8qCi0JCSAqIFJvb3QgdGFibGUgaXMgYW4gWFNEVCAoNjQtYml0IHBoeXNpY2FsIGFkZHJlc3NlcykuIFdlIG11c3QgdXNlIHRoZQotCQkgKiBYU0RUIGlmIHRoZSByZXZpc2lvbiBpcyA+IDEgYW5kIHRoZSBYU0RUIHBvaW50ZXIgaXMgcHJlc2VudCwgYXMgcGVyCi0JCSAqIHRoZSBBQ1BJIHNwZWNpZmljYXRpb24uCi0JCSAqLwotCQlhZGRyZXNzID0gKGFjcGlfcGh5c2ljYWxfYWRkcmVzcykgcnNkcC0+eHNkdF9waHlzaWNhbF9hZGRyZXNzOwotCQl0YWJsZV9lbnRyeV9zaXplID0gc2l6ZW9mKHU2NCk7Ci0JCXJzZHRfYWRkcmVzcyA9IChhY3BpX3BoeXNpY2FsX2FkZHJlc3MpCi0JCQkJCXJzZHAtPnJzZHRfcGh5c2ljYWxfYWRkcmVzczsKLQl9IGVsc2UgewotCQkvKiBSb290IHRhYmxlIGlzIGFuIFJTRFQgKDMyLWJpdCBwaHlzaWNhbCBhZGRyZXNzZXMpICovCi0KLQkJYWRkcmVzcyA9IChhY3BpX3BoeXNpY2FsX2FkZHJlc3MpIHJzZHAtPnJzZHRfcGh5c2ljYWxfYWRkcmVzczsKLQkJdGFibGVfZW50cnlfc2l6ZSA9IHNpemVvZih1MzIpOwotCX0KLQotCS8qCi0JICogSXQgaXMgbm90IHBvc3NpYmxlIHRvIG1hcCBtb3JlIHRoYW4gb25lIGVudHJ5IGluIHNvbWUgZW52aXJvbm1lbnRzLAotCSAqIHNvIHVubWFwIHRoZSBSU0RQIGhlcmUgYmVmb3JlIG1hcHBpbmcgb3RoZXIgdGFibGVzCi0JICovCi0JYWNwaV9vc191bm1hcF9tZW1vcnkocnNkcCwgc2l6ZW9mKHN0cnVjdCBhY3BpX3RhYmxlX3JzZHApKTsKLQotCWlmICh0YWJsZV9lbnRyeV9zaXplID09IHNpemVvZih1NjQpKSB7Ci0JCWlmIChhY3BpX3RiX2NoZWNrX3hzZHQoYWRkcmVzcykgPT0gQUVfTlVMTF9FTlRSWSkgewotCQkJLyogWFNEVCBoYXMgTlVMTCBlbnRyeSwgUlNEVCBpcyB1c2VkICovCi0JCQlhZGRyZXNzID0gcnNkdF9hZGRyZXNzOwotCQkJdGFibGVfZW50cnlfc2l6ZSA9IHNpemVvZih1MzIpOwotCQkJQUNQSV9XQVJOSU5HKChBRV9JTkZPLCAiQklPUyBYU0RUIGhhcyBOVUxMIGVudHJ5LCAiCi0JCQkJCSJ1c2luZyBSU0RUIikpOwotCQl9Ci0JfQotCS8qIE1hcCB0aGUgUlNEVC9YU0RUIHRhYmxlIGhlYWRlciB0byBnZXQgdGhlIGZ1bGwgdGFibGUgbGVuZ3RoICovCi0KLQl0YWJsZSA9IGFjcGlfb3NfbWFwX21lbW9yeShhZGRyZXNzLCBzaXplb2Yoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyKSk7Ci0JaWYgKCF0YWJsZSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9fTUVNT1JZKTsKLQl9Ci0KLQlhY3BpX3RiX3ByaW50X3RhYmxlX2hlYWRlcihhZGRyZXNzLCB0YWJsZSk7Ci0KLQkvKiBHZXQgdGhlIGxlbmd0aCBvZiB0aGUgZnVsbCB0YWJsZSwgdmVyaWZ5IGxlbmd0aCBhbmQgbWFwIGVudGlyZSB0YWJsZSAqLwotCi0JbGVuZ3RoID0gdGFibGUtPmxlbmd0aDsKLQlhY3BpX29zX3VubWFwX21lbW9yeSh0YWJsZSwgc2l6ZW9mKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlcikpOwotCi0JaWYgKGxlbmd0aCA8IHNpemVvZihzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIpKSB7Ci0JCUFDUElfRVJST1IoKEFFX0lORk8sICJJbnZhbGlkIGxlbmd0aCAweCVYIGluIFJTRFQvWFNEVCIsCi0JCQkgICAgbGVuZ3RoKSk7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9JTlZBTElEX1RBQkxFX0xFTkdUSCk7Ci0JfQotCi0JdGFibGUgPSBhY3BpX29zX21hcF9tZW1vcnkoYWRkcmVzcywgbGVuZ3RoKTsKLQlpZiAoIXRhYmxlKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT19NRU1PUlkpOwotCX0KLQotCS8qIFZhbGlkYXRlIHRoZSByb290IHRhYmxlIGNoZWNrc3VtICovCi0KLQlzdGF0dXMgPSBhY3BpX3RiX3ZlcmlmeV9jaGVja3N1bSh0YWJsZSwgbGVuZ3RoKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJYWNwaV9vc191bm1hcF9tZW1vcnkodGFibGUsIGxlbmd0aCk7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotCX0KLQotCS8qIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHRhYmxlcyBkZXNjcmliZWQgaW4gdGhlIHJvb3QgdGFibGUgKi8KLQotCXRhYmxlX2NvdW50ID0KLQkgICAgKHUzMikgKCh0YWJsZS0+bGVuZ3RoIC0KLQkJICAgIHNpemVvZihzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIpKSAvIHRhYmxlX2VudHJ5X3NpemUpOwotCi0JLyoKLQkgKiBGaXJzdCB0d28gZW50cmllcyBpbiB0aGUgdGFibGUgYXJyYXkgYXJlIHJlc2VydmVkIGZvciB0aGUgRFNEVCBhbmQgRkFDUywKLQkgKiB3aGljaCBhcmUgbm90IGFjdHVhbGx5IHByZXNlbnQgaW4gdGhlIFJTRFQvWFNEVCAtIHRoZXkgY29tZSBmcm9tIHRoZSBGQURUCi0JICovCi0JdGFibGVfZW50cnkgPQotCSAgICBBQ1BJX0NBU1RfUFRSKHU4LCB0YWJsZSkgKyBzaXplb2Yoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyKTsKLQlhY3BpX2dibF9yb290X3RhYmxlX2xpc3QuY291bnQgPSAyOwotCi0JLyoKLQkgKiBJbml0aWFsaXplIHRoZSByb290IHRhYmxlIGFycmF5IGZyb20gdGhlIFJTRFQvWFNEVAotCSAqLwotCWZvciAoaSA9IDA7IGkgPCB0YWJsZV9jb3VudDsgaSsrKSB7Ci0JCWlmIChhY3BpX2dibF9yb290X3RhYmxlX2xpc3QuY291bnQgPj0KLQkJICAgIGFjcGlfZ2JsX3Jvb3RfdGFibGVfbGlzdC5zaXplKSB7Ci0KLQkJCS8qIFRoZXJlIGlzIG5vIG1vcmUgcm9vbSBpbiB0aGUgcm9vdCB0YWJsZSBhcnJheSwgYXR0ZW1wdCByZXNpemUgKi8KLQotCQkJc3RhdHVzID0gYWNwaV90Yl9yZXNpemVfcm9vdF90YWJsZV9saXN0KCk7Ci0JCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJCQlBQ1BJX1dBUk5JTkcoKEFFX0lORk8sCi0JCQkJCSAgICAgICJUcnVuY2F0aW5nICV1IHRhYmxlIGVudHJpZXMhIiwKLQkJCQkJICAgICAgKHVuc2lnbmVkKQotCQkJCQkgICAgICAoYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LnNpemUgLQotCQkJCQkgICAgICAgYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LgotCQkJCQkgICAgICAgY291bnQpKSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCQkvKiBHZXQgdGhlIHRhYmxlIHBoeXNpY2FsIGFkZHJlc3MgKDMyLWJpdCBmb3IgUlNEVCwgNjQtYml0IGZvciBYU0RUKSAqLwotCi0JCWFjcGlfZ2JsX3Jvb3RfdGFibGVfbGlzdC50YWJsZXNbYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LmNvdW50XS4KLQkJICAgIGFkZHJlc3MgPQotCQkgICAgYWNwaV90Yl9nZXRfcm9vdF90YWJsZV9lbnRyeSh0YWJsZV9lbnRyeSwgdGFibGVfZW50cnlfc2l6ZSk7Ci0KLQkJdGFibGVfZW50cnkgKz0gdGFibGVfZW50cnlfc2l6ZTsKLQkJYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LmNvdW50Kys7Ci0JfQotCi0JLyoKLQkgKiBJdCBpcyBub3QgcG9zc2libGUgdG8gbWFwIG1vcmUgdGhhbiBvbmUgZW50cnkgaW4gc29tZSBlbnZpcm9ubWVudHMsCi0JICogc28gdW5tYXAgdGhlIHJvb3QgdGFibGUgaGVyZSBiZWZvcmUgbWFwcGluZyBvdGhlciB0YWJsZXMKLQkgKi8KLQlhY3BpX29zX3VubWFwX21lbW9yeSh0YWJsZSwgbGVuZ3RoKTsKLQotCS8qCi0JICogQ29tcGxldGUgdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSByb290IHRhYmxlIGFycmF5IGJ5IGV4YW1pbmluZwotCSAqIHRoZSBoZWFkZXIgb2YgZWFjaCB0YWJsZQotCSAqLwotCWZvciAoaSA9IDI7IGkgPCBhY3BpX2dibF9yb290X3RhYmxlX2xpc3QuY291bnQ7IGkrKykgewotCQlhY3BpX3RiX2luc3RhbGxfdGFibGUoYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LnRhYmxlc1tpXS4KLQkJCQkgICAgICBhZGRyZXNzLCBmbGFncywgTlVMTCwgaSk7Ci0KLQkJLyogU3BlY2lhbCBjYXNlIGZvciBGQURUIC0gZ2V0IHRoZSBEU0RUIGFuZCBGQUNTICovCi0KLQkJaWYgKEFDUElfQ09NUEFSRV9OQU1FCi0JCSAgICAoJmFjcGlfZ2JsX3Jvb3RfdGFibGVfbGlzdC50YWJsZXNbaV0uc2lnbmF0dXJlLAotCQkgICAgIEFDUElfU0lHX0ZBRFQpKSB7Ci0JCQlhY3BpX3RiX3BhcnNlX2ZhZHQoaSwgZmxhZ3MpOwotCQl9Ci0JfQotCi0JcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS90YWJsZXMvdGJ4ZmFjZS5jIGIvZHJpdmVycy9hY3BpL3RhYmxlcy90YnhmYWNlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkNzc3MGEuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9hY3BpL3RhYmxlcy90YnhmYWNlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3MzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIE1vZHVsZSBOYW1lOiB0YnhmYWNlIC0gUHVibGljIGludGVyZmFjZXMgdG8gdGhlIEFDUEkgc3Vic3lzdGVtCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICBBQ1BJIHRhYmxlIG9yaWVudGVkIGludGVyZmFjZXMKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA4LCBJbnRlbCBDb3JwLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAotICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgYXQgbWluaW11bSBhIGRpc2NsYWltZXIKLSAqICAgIHN1YnN0YW50aWFsbHkgc2ltaWxhciB0byB0aGUgIk5PIFdBUlJBTlRZIiBkaXNjbGFpbWVyIGJlbG93Ci0gKiAgICAoIkRpc2NsYWltZXIiKSBhbmQgYW55IHJlZGlzdHJpYnV0aW9uIG11c3QgYmUgY29uZGl0aW9uZWQgdXBvbgotICogICAgaW5jbHVkaW5nIGEgc3Vic3RhbnRpYWxseSBzaW1pbGFyIERpc2NsYWltZXIgcmVxdWlyZW1lbnQgZm9yIGZ1cnRoZXIKLSAqICAgIGJpbmFyeSByZWRpc3RyaWJ1dGlvbi4KLSAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcwotICogICAgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICogU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBOTyBXQVJSQU5UWQotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCi0gKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUwotICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcKLSAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQotICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgotICovCi0KLSNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KLSNpbmNsdWRlIDxhY3BpL2FjbmFtZXNwLmg+Ci0jaW5jbHVkZSA8YWNwaS9hY3RhYmxlcy5oPgotCi0jZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9UQUJMRVMKLUFDUElfTU9EVUxFX05BTUUoInRieGZhY2UiKQotCi0vKiBMb2NhbCBwcm90b3R5cGVzICovCi1zdGF0aWMgYWNwaV9zdGF0dXMgYWNwaV90Yl9sb2FkX25hbWVzcGFjZSh2b2lkKTsKLQotc3RhdGljIGludCBub19hdXRvX3NzZHQ7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfYWxsb2NhdGVfcm9vdF90YWJsZQotICoKLSAqIFBBUkFNRVRFUlM6ICBpbml0aWFsX3RhYmxlX2NvdW50IC0gU2l6ZSBvZiBpbml0aWFsX3RhYmxlX2FycmF5LCBpbiBudW1iZXIgb2YKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGFjcGlfdGFibGVfZGVzYyBzdHJ1Y3R1cmVzCi0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cwotICoKLSAqIERFU0NSSVBUSU9OOiBBbGxvY2F0ZSBhIHJvb3QgdGFibGUgYXJyYXkuIFVzZWQgYnkgaV9hU0wgY29tcGlsZXIgYW5kCi0gKiAgICAgICAgICAgICAgYWNwaV9pbml0aWFsaXplX3RhYmxlcy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1hY3BpX3N0YXR1cyBhY3BpX2FsbG9jYXRlX3Jvb3RfdGFibGUodTMyIGluaXRpYWxfdGFibGVfY291bnQpCi17Ci0KLQlhY3BpX2dibF9yb290X3RhYmxlX2xpc3Quc2l6ZSA9IGluaXRpYWxfdGFibGVfY291bnQ7Ci0JYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LmZsYWdzID0gQUNQSV9ST09UX0FMTE9XX1JFU0laRTsKLQotCXJldHVybiAoYWNwaV90Yl9yZXNpemVfcm9vdF90YWJsZV9saXN0KCkpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX2luaXRpYWxpemVfdGFibGVzCi0gKgotICogUEFSQU1FVEVSUzogIGluaXRpYWxfdGFibGVfYXJyYXkgLSBQb2ludGVyIHRvIGFuIGFycmF5IG9mIHByZS1hbGxvY2F0ZWQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGFjcGlfdGFibGVfZGVzYyBzdHJ1Y3R1cmVzLiBJZiBOVUxMLCB0aGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXkgaXMgZHluYW1pY2FsbHkgYWxsb2NhdGVkLgotICogICAgICAgICAgICAgIGluaXRpYWxfdGFibGVfY291bnQgLSBTaXplIG9mIGluaXRpYWxfdGFibGVfYXJyYXksIGluIG51bWJlciBvZgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjIHN0cnVjdHVyZXMKLSAqICAgICAgICAgICAgICBhbGxvd19yZWFsbG9jICAgICAgIC0gRmxhZyB0byB0ZWxsIFRhYmxlIE1hbmFnZXIgaWYgcmVzaXplIG9mCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZS1hbGxvY2F0ZWQgYXJyYXkgaXMgYWxsb3dlZC4gSWdub3JlZAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBpbml0aWFsX3RhYmxlX2FycmF5IGlzIE5VTEwuCi0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cwotICoKLSAqIERFU0NSSVBUSU9OOiBJbml0aWFsaXplIHRoZSB0YWJsZSBtYW5hZ2VyLCBnZXQgdGhlIFJTRFAgYW5kIFJTRFQvWFNEVC4KLSAqCi0gKiBOT1RFOiAgICAgICAgQWxsb3dzIHN0YXRpYyBhbGxvY2F0aW9uIG9mIHRoZSBpbml0aWFsIHRhYmxlIGFycmF5IGluIG9yZGVyCi0gKiAgICAgICAgICAgICAgdG8gYXZvaWQgdGhlIHVzZSBvZiBkeW5hbWljIG1lbW9yeSBpbiBjb25maW5lZCBlbnZpcm9ubWVudHMKLSAqICAgICAgICAgICAgICBzdWNoIGFzIHRoZSBrZXJuZWwgYm9vdCBzZXF1ZW5jZSB3aGVyZSBpdCBtYXkgbm90IGJlIGF2YWlsYWJsZS4KLSAqCi0gKiAgICAgICAgICAgICAgSWYgdGhlIGhvc3QgT1MgbWVtb3J5IG1hbmFnZXJzIGFyZSBpbml0aWFsaXplZCwgdXNlIE5VTEwgZm9yCi0gKiAgICAgICAgICAgICAgaW5pdGlhbF90YWJsZV9hcnJheSwgYW5kIHRoZSB0YWJsZSB3aWxsIGJlIGR5bmFtaWNhbGx5IGFsbG9jYXRlZC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1hY3BpX3N0YXR1cyBfX2luaXQKLWFjcGlfaW5pdGlhbGl6ZV90YWJsZXMoc3RydWN0IGFjcGlfdGFibGVfZGVzYyAqIGluaXRpYWxfdGFibGVfYXJyYXksCi0JCSAgICAgICB1MzIgaW5pdGlhbF90YWJsZV9jb3VudCwgdTggYWxsb3dfcmVzaXplKQotewotCWFjcGlfcGh5c2ljYWxfYWRkcmVzcyByc2RwX2FkZHJlc3M7Ci0JYWNwaV9zdGF0dXMgc3RhdHVzOwotCi0JQUNQSV9GVU5DVElPTl9UUkFDRShhY3BpX2luaXRpYWxpemVfdGFibGVzKTsKLQotCS8qCi0JICogU2V0IHVwIHRoZSBSb290IFRhYmxlIEFycmF5Ci0JICogQWxsb2NhdGUgdGhlIHRhYmxlIGFycmF5IGlmIHJlcXVlc3RlZAotCSAqLwotCWlmICghaW5pdGlhbF90YWJsZV9hcnJheSkgewotCQlzdGF0dXMgPSBhY3BpX2FsbG9jYXRlX3Jvb3RfdGFibGUoaW5pdGlhbF90YWJsZV9jb3VudCk7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci0JCX0KLQl9IGVsc2UgewotCQkvKiBSb290IFRhYmxlIEFycmF5IGhhcyBiZWVuIHN0YXRpY2FsbHkgYWxsb2NhdGVkIGJ5IHRoZSBob3N0ICovCi0KLQkJQUNQSV9NRU1TRVQoaW5pdGlhbF90YWJsZV9hcnJheSwgMCwKLQkJCSAgICAoYWNwaV9zaXplKSBpbml0aWFsX3RhYmxlX2NvdW50ICoKLQkJCSAgICBzaXplb2Yoc3RydWN0IGFjcGlfdGFibGVfZGVzYykpOwotCi0JCWFjcGlfZ2JsX3Jvb3RfdGFibGVfbGlzdC50YWJsZXMgPSBpbml0aWFsX3RhYmxlX2FycmF5OwotCQlhY3BpX2dibF9yb290X3RhYmxlX2xpc3Quc2l6ZSA9IGluaXRpYWxfdGFibGVfY291bnQ7Ci0JCWFjcGlfZ2JsX3Jvb3RfdGFibGVfbGlzdC5mbGFncyA9IEFDUElfUk9PVF9PUklHSU5fVU5LTk9XTjsKLQkJaWYgKGFsbG93X3Jlc2l6ZSkgewotCQkJYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LmZsYWdzIHw9Ci0JCQkgICAgQUNQSV9ST09UX0FMTE9XX1JFU0laRTsKLQkJfQotCX0KLQotCS8qIEdldCB0aGUgYWRkcmVzcyBvZiB0aGUgUlNEUCAqLwotCi0JcnNkcF9hZGRyZXNzID0gYWNwaV9vc19nZXRfcm9vdF9wb2ludGVyKCk7Ci0JaWYgKCFyc2RwX2FkZHJlc3MpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PVF9GT1VORCk7Ci0JfQotCi0JLyoKLQkgKiBHZXQgdGhlIHJvb3QgdGFibGUgKFJTRFQgb3IgWFNEVCkgYW5kIGV4dHJhY3QgYWxsIGVudHJpZXMgdG8gdGhlIGxvY2FsCi0JICogUm9vdCBUYWJsZSBBcnJheS4gVGhpcyBhcnJheSBjb250YWlucyB0aGUgaW5mb3JtYXRpb24gb2YgdGhlIFJTRFQvWFNEVAotCSAqIGluIGEgY29tbW9uLCBtb3JlIHVzZWFibGUgZm9ybWF0LgotCSAqLwotCXN0YXR1cyA9Ci0JICAgIGFjcGlfdGJfcGFyc2Vfcm9vdF90YWJsZShyc2RwX2FkZHJlc3MsIEFDUElfVEFCTEVfT1JJR0lOX01BUFBFRCk7Ci0JcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfcmVhbGxvY2F0ZV9yb290X3RhYmxlCi0gKgotICogUEFSQU1FVEVSUzogIE5vbmUKLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IFJlYWxsb2NhdGUgUm9vdCBUYWJsZSBMaXN0IGludG8gZHluYW1pYyBtZW1vcnkuIENvcGllcyB0aGUKLSAqICAgICAgICAgICAgICByb290IGxpc3QgZnJvbSB0aGUgcHJldmlvdXNseSBwcm92aWRlZCBzY3JhdGNoIGFyZWEuIFNob3VsZAotICogICAgICAgICAgICAgIGJlIGNhbGxlZCBvbmNlIGR5bmFtaWMgbWVtb3J5IGFsbG9jYXRpb24gaXMgYXZhaWxhYmxlIGluIHRoZQotICogICAgICAgICAgICAgIGtlcm5lbAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1hY3BpX3N0YXR1cyBhY3BpX3JlYWxsb2NhdGVfcm9vdF90YWJsZSh2b2lkKQotewotCXN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgKnRhYmxlczsKLQlhY3BpX3NpemUgbmV3X3NpemU7Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGFjcGlfcmVhbGxvY2F0ZV9yb290X3RhYmxlKTsKLQotCS8qCi0JICogT25seSByZWFsbG9jYXRlIHRoZSByb290IHRhYmxlIGlmIHRoZSBob3N0IHByb3ZpZGVkIGEgc3RhdGljIGJ1ZmZlcgotCSAqIGZvciB0aGUgdGFibGUgYXJyYXkgaW4gdGhlIGNhbGwgdG8gYWNwaV9pbml0aWFsaXplX3RhYmxlcy4KLQkgKi8KLQlpZiAoYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LmZsYWdzICYgQUNQSV9ST09UX09SSUdJTl9BTExPQ0FURUQpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX1NVUFBPUlQpOwotCX0KLQotCW5ld19zaXplID0gKChhY3BpX3NpemUpIGFjcGlfZ2JsX3Jvb3RfdGFibGVfbGlzdC5jb3VudCArCi0JCSAgICBBQ1BJX1JPT1RfVEFCTEVfU0laRV9JTkNSRU1FTlQpICoKLQkgICAgc2l6ZW9mKHN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MpOwotCi0JLyogQ3JlYXRlIG5ldyBhcnJheSBhbmQgY29weSB0aGUgb2xkIGFycmF5ICovCi0KLQl0YWJsZXMgPSBBQ1BJX0FMTE9DQVRFX1pFUk9FRChuZXdfc2l6ZSk7Ci0JaWYgKCF0YWJsZXMpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX01FTU9SWSk7Ci0JfQotCi0JQUNQSV9NRU1DUFkodGFibGVzLCBhY3BpX2dibF9yb290X3RhYmxlX2xpc3QudGFibGVzLCBuZXdfc2l6ZSk7Ci0KLQlhY3BpX2dibF9yb290X3RhYmxlX2xpc3Quc2l6ZSA9IGFjcGlfZ2JsX3Jvb3RfdGFibGVfbGlzdC5jb3VudDsKLQlhY3BpX2dibF9yb290X3RhYmxlX2xpc3QudGFibGVzID0gdGFibGVzOwotCWFjcGlfZ2JsX3Jvb3RfdGFibGVfbGlzdC5mbGFncyA9Ci0JICAgIEFDUElfUk9PVF9PUklHSU5fQUxMT0NBVEVEIHwgQUNQSV9ST09UX0FMTE9XX1JFU0laRTsKLQotCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfbG9hZF90YWJsZQotICoKLSAqIFBBUkFNRVRFUlM6ICB0YWJsZV9wdHIgICAgICAgLSBwb2ludGVyIHRvIGEgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIGVudGlyZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlIHRvIGJlIGxvYWRlZAotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKLSAqCi0gKiBERVNDUklQVElPTjogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gbG9hZCBhIHRhYmxlIGZyb20gdGhlIGNhbGxlcidzCi0gKiAgICAgICAgICAgICAgYnVmZmVyLiBUaGUgYnVmZmVyIG11c3QgY29udGFpbiBhbiBlbnRpcmUgQUNQSSBUYWJsZSBpbmNsdWRpbmcKLSAqICAgICAgICAgICAgICBhIHZhbGlkIGhlYWRlci4gVGhlIGhlYWRlciBmaWVsZHMgd2lsbCBiZSB2ZXJpZmllZCwgYW5kIGlmIGl0Ci0gKiAgICAgICAgICAgICAgaXMgZGV0ZXJtaW5lZCB0aGF0IHRoZSB0YWJsZSBpcyBpbnZhbGlkLCB0aGUgY2FsbCB3aWxsIGZhaWwuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWFjcGlfc3RhdHVzIGFjcGlfbG9hZF90YWJsZShzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKnRhYmxlX3B0cikKLXsKLQlhY3BpX3N0YXR1cyBzdGF0dXM7Ci0JdTMyIHRhYmxlX2luZGV4OwotCXN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgdGFibGVfZGVzYzsKLQotCWlmICghdGFibGVfcHRyKQotCQlyZXR1cm4gQUVfQkFEX1BBUkFNRVRFUjsKLQotCUFDUElfTUVNU0VUKCZ0YWJsZV9kZXNjLCAwLCBzaXplb2Yoc3RydWN0IGFjcGlfdGFibGVfZGVzYykpOwotCXRhYmxlX2Rlc2MucG9pbnRlciA9IHRhYmxlX3B0cjsKLQl0YWJsZV9kZXNjLmxlbmd0aCA9IHRhYmxlX3B0ci0+bGVuZ3RoOwotCXRhYmxlX2Rlc2MuZmxhZ3MgPSBBQ1BJX1RBQkxFX09SSUdJTl9VTktOT1dOOwotCi0JLyoKLQkgKiBJbnN0YWxsIHRoZSBuZXcgdGFibGUgaW50byB0aGUgbG9jYWwgZGF0YSBzdHJ1Y3R1cmVzCi0JICovCi0Jc3RhdHVzID0gYWNwaV90Yl9hZGRfdGFibGUoJnRhYmxlX2Rlc2MsICZ0YWJsZV9pbmRleCk7Ci0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCXJldHVybiBzdGF0dXM7Ci0JfQotCXN0YXR1cyA9IGFjcGlfbnNfbG9hZF90YWJsZSh0YWJsZV9pbmRleCwgYWNwaV9nYmxfcm9vdF9ub2RlKTsKLQlyZXR1cm4gc3RhdHVzOwotfQotCi1BQ1BJX0VYUE9SVF9TWU1CT0woYWNwaV9sb2FkX3RhYmxlKQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfZ2V0X3RhYmxlX2hlYWRlcgotICoKLSAqIFBBUkFNRVRFUlM6ICBTaWduYXR1cmUgICAgICAgICAgIC0gQUNQSSBzaWduYXR1cmUgb2YgbmVlZGVkIHRhYmxlCi0gKiAgICAgICAgICAgICAgSW5zdGFuY2UgICAgICAgICAgICAtIFdoaWNoIGluc3RhbmNlIChmb3IgU1NEVHMpCi0gKiAgICAgICAgICAgICAgb3V0X3RhYmxlX2hlYWRlciAgICAtIFRoZSBwb2ludGVyIHRvIHRoZSB0YWJsZSBoZWFkZXIgdG8gZmlsbAotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMgYW5kIHBvaW50ZXIgdG8gbWFwcGVkIHRhYmxlIGhlYWRlcgotICoKLSAqIERFU0NSSVBUSU9OOiBGaW5kcyBhbiBBQ1BJIHRhYmxlIGhlYWRlci4KLSAqCi0gKiBOT1RFOiAgICAgICAgQ2FsbGVyIGlzIHJlc3BvbnNpYmxlIGluIHVubWFwcGluZyB0aGUgaGVhZGVyIHdpdGgKLSAqICAgICAgICAgICAgICBhY3BpX29zX3VubWFwX21lbW9yeQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWFjcGlfc3RhdHVzCi1hY3BpX2dldF90YWJsZV9oZWFkZXIoY2hhciAqc2lnbmF0dXJlLAotCQkgICAgICB1MzIgaW5zdGFuY2UsIHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqb3V0X3RhYmxlX2hlYWRlcikKLXsKLSAgICAgICB1MzIgaTsKLSAgICAgICB1MzIgajsKLQlzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKmhlYWRlcjsKLQotCS8qIFBhcmFtZXRlciB2YWxpZGF0aW9uICovCi0KLQlpZiAoIXNpZ25hdHVyZSB8fCAhb3V0X3RhYmxlX2hlYWRlcikgewotCQlyZXR1cm4gKEFFX0JBRF9QQVJBTUVURVIpOwotCX0KLQotCS8qCi0JICogV2FsayB0aGUgcm9vdCB0YWJsZSBsaXN0Ci0JICovCi0JZm9yIChpID0gMCwgaiA9IDA7IGkgPCBhY3BpX2dibF9yb290X3RhYmxlX2xpc3QuY291bnQ7IGkrKykgewotCQlpZiAoIUFDUElfQ09NUEFSRV9OQU1FCi0JCSAgICAoJihhY3BpX2dibF9yb290X3RhYmxlX2xpc3QudGFibGVzW2ldLnNpZ25hdHVyZSksCi0JCSAgICAgc2lnbmF0dXJlKSkgewotCQkJY29udGludWU7Ci0JCX0KLQotCQlpZiAoKytqIDwgaW5zdGFuY2UpIHsKLQkJCWNvbnRpbnVlOwotCQl9Ci0KLQkJaWYgKCFhY3BpX2dibF9yb290X3RhYmxlX2xpc3QudGFibGVzW2ldLnBvaW50ZXIpIHsKLQkJCWlmICgoYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LnRhYmxlc1tpXS4KLQkJCSAgICAgZmxhZ3MgJiBBQ1BJX1RBQkxFX09SSUdJTl9NQVNLKSA9PQotCQkJICAgIEFDUElfVEFCTEVfT1JJR0lOX01BUFBFRCkgewotCQkJCWhlYWRlciA9Ci0JCQkJICAgIGFjcGlfb3NfbWFwX21lbW9yeShhY3BpX2dibF9yb290X3RhYmxlX2xpc3QuCi0JCQkJCQkgICAgICAgdGFibGVzW2ldLmFkZHJlc3MsCi0JCQkJCQkgICAgICAgc2l6ZW9mKHN0cnVjdAotCQkJCQkJCSAgICAgIGFjcGlfdGFibGVfaGVhZGVyKSk7Ci0JCQkJaWYgKCFoZWFkZXIpIHsKLQkJCQkJcmV0dXJuIEFFX05PX01FTU9SWTsKLQkJCQl9Ci0JCQkJQUNQSV9NRU1DUFkob3V0X3RhYmxlX2hlYWRlciwgaGVhZGVyLAotCQkJCQkgICAgc2l6ZW9mKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlcikpOwotCQkJCWFjcGlfb3NfdW5tYXBfbWVtb3J5KGhlYWRlciwKLQkJCQkJCSAgICAgc2l6ZW9mKHN0cnVjdAotCQkJCQkJCSAgICBhY3BpX3RhYmxlX2hlYWRlcikpOwotCQkJfSBlbHNlIHsKLQkJCQlyZXR1cm4gQUVfTk9UX0ZPVU5EOwotCQkJfQotCQl9IGVsc2UgewotCQkJQUNQSV9NRU1DUFkob3V0X3RhYmxlX2hlYWRlciwKLQkJCQkgICAgYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LnRhYmxlc1tpXS5wb2ludGVyLAotCQkJCSAgICBzaXplb2Yoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyKSk7Ci0JCX0KLQkJcmV0dXJuIChBRV9PSyk7Ci0JfQotCi0JcmV0dXJuIChBRV9OT1RfRk9VTkQpOwotfQotCi1BQ1BJX0VYUE9SVF9TWU1CT0woYWNwaV9nZXRfdGFibGVfaGVhZGVyKQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfdW5sb2FkX3RhYmxlX2lkCi0gKgotICogUEFSQU1FVEVSUzogIGlkICAgICAgICAgICAgLSBPd25lciBJRCBvZiB0aGUgdGFibGUgdG8gYmUgcmVtb3ZlZC4KLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IFRoaXMgcm91dGluZSBpcyB1c2VkIHRvIGZvcmNlIHRoZSB1bmxvYWQgb2YgYSB0YWJsZSAoYnkgaWQpCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWFjcGlfc3RhdHVzIGFjcGlfdW5sb2FkX3RhYmxlX2lkKGFjcGlfb3duZXJfaWQgaWQpCi17Ci0JaW50IGk7Ci0JYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfTk9UX0VYSVNUOwotCi0JQUNQSV9GVU5DVElPTl9UUkFDRShhY3BpX3VubG9hZF90YWJsZV9pZCk7Ci0KLQkvKiBGaW5kIHRhYmxlIGluIHRoZSBnbG9iYWwgdGFibGUgbGlzdCAqLwotCWZvciAoaSA9IDA7IGkgPCBhY3BpX2dibF9yb290X3RhYmxlX2xpc3QuY291bnQ7ICsraSkgewotCQlpZiAoaWQgIT0gYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LnRhYmxlc1tpXS5vd25lcl9pZCkgewotCQkJY29udGludWU7Ci0JCX0KLQkJLyoKLQkJICogRGVsZXRlIGFsbCBuYW1lc3BhY2Ugb2JqZWN0cyBvd25lZCBieSB0aGlzIHRhYmxlLiBOb3RlIHRoYXQgdGhlc2UKLQkJICogb2JqZWN0cyBjYW4gYXBwZWFyIGFueXdoZXJlIGluIHRoZSBuYW1lc3BhY2UgYnkgdmlydHVlIG9mIHRoZSBBTUwKLQkJICogIlNjb3BlIiBvcGVyYXRvci4gVGh1cywgd2UgbmVlZCB0byB0cmFjayBvd25lcnNoaXAgYnkgYW4gSUQsIG5vdAotCQkgKiBzaW1wbHkgYSBwb3NpdGlvbiB3aXRoaW4gdGhlIGhpZXJhcmNoeQotCQkgKi8KLQkJYWNwaV90Yl9kZWxldGVfbmFtZXNwYWNlX2J5X293bmVyKGkpOwotCQlzdGF0dXMgPSBhY3BpX3RiX3JlbGVhc2Vfb3duZXJfaWQoaSk7Ci0JCWFjcGlfdGJfc2V0X3RhYmxlX2xvYWRlZF9mbGFnKGksIEZBTFNFKTsKLQkJYnJlYWs7Ci0JfQotCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotfQotCi1BQ1BJX0VYUE9SVF9TWU1CT0woYWNwaV91bmxvYWRfdGFibGVfaWQpCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfZ2V0X3RhYmxlCi0gKgotICogUEFSQU1FVEVSUzogIFNpZ25hdHVyZSAgICAgICAgICAgLSBBQ1BJIHNpZ25hdHVyZSBvZiBuZWVkZWQgdGFibGUKLSAqICAgICAgICAgICAgICBJbnN0YW5jZSAgICAgICAgICAgIC0gV2hpY2ggaW5zdGFuY2UgKGZvciBTU0RUcykKLSAqICAgICAgICAgICAgICBvdXRfdGFibGUgICAgICAgICAgIC0gV2hlcmUgdGhlIHBvaW50ZXIgdG8gdGhlIHRhYmxlIGlzIHJldHVybmVkCi0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cyBhbmQgcG9pbnRlciB0byB0YWJsZQotICoKLSAqIERFU0NSSVBUSU9OOiBGaW5kcyBhbmQgdmVyaWZpZXMgYW4gQUNQSSB0YWJsZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1hY3BpX3N0YXR1cwotYWNwaV9nZXRfdGFibGUoY2hhciAqc2lnbmF0dXJlLAotCSAgICAgICB1MzIgaW5zdGFuY2UsIHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqKm91dF90YWJsZSkKLXsKLSAgICAgICB1MzIgaTsKLSAgICAgICB1MzIgajsKLQlhY3BpX3N0YXR1cyBzdGF0dXM7Ci0KLQkvKiBQYXJhbWV0ZXIgdmFsaWRhdGlvbiAqLwotCi0JaWYgKCFzaWduYXR1cmUgfHwgIW91dF90YWJsZSkgewotCQlyZXR1cm4gKEFFX0JBRF9QQVJBTUVURVIpOwotCX0KLQotCS8qCi0JICogV2FsayB0aGUgcm9vdCB0YWJsZSBsaXN0Ci0JICovCi0JZm9yIChpID0gMCwgaiA9IDA7IGkgPCBhY3BpX2dibF9yb290X3RhYmxlX2xpc3QuY291bnQ7IGkrKykgewotCQlpZiAoIUFDUElfQ09NUEFSRV9OQU1FCi0JCSAgICAoJihhY3BpX2dibF9yb290X3RhYmxlX2xpc3QudGFibGVzW2ldLnNpZ25hdHVyZSksCi0JCSAgICAgc2lnbmF0dXJlKSkgewotCQkJY29udGludWU7Ci0JCX0KLQotCQlpZiAoKytqIDwgaW5zdGFuY2UpIHsKLQkJCWNvbnRpbnVlOwotCQl9Ci0KLQkJc3RhdHVzID0KLQkJICAgIGFjcGlfdGJfdmVyaWZ5X3RhYmxlKCZhY3BpX2dibF9yb290X3RhYmxlX2xpc3QudGFibGVzW2ldKTsKLQkJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKSB7Ci0JCQkqb3V0X3RhYmxlID0gYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LnRhYmxlc1tpXS5wb2ludGVyOwotCQl9Ci0KLQkJaWYgKCFhY3BpX2dibF9wZXJtYW5lbnRfbW1hcCkgewotCQkJYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LnRhYmxlc1tpXS5wb2ludGVyID0gTlVMTDsKLQkJfQotCi0JCXJldHVybiAoc3RhdHVzKTsKLQl9Ci0KLQlyZXR1cm4gKEFFX05PVF9GT1VORCk7Ci19Ci0KLUFDUElfRVhQT1JUX1NZTUJPTChhY3BpX2dldF90YWJsZSkKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9nZXRfdGFibGVfYnlfaW5kZXgKLSAqCi0gKiBQQVJBTUVURVJTOiAgdGFibGVfaW5kZXggICAgICAgICAtIFRhYmxlIGluZGV4Ci0gKiAgICAgICAgICAgICAgVGFibGUgICAgICAgICAgICAgICAtIFdoZXJlIHRoZSBwb2ludGVyIHRvIHRoZSB0YWJsZSBpcyByZXR1cm5lZAotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMgYW5kIHBvaW50ZXIgdG8gdGhlIHRhYmxlCi0gKgotICogREVTQ1JJUFRJT046IE9idGFpbiBhIHRhYmxlIGJ5IGFuIGluZGV4IGludG8gdGhlIGdsb2JhbCB0YWJsZSBsaXN0LgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1hY3BpX3N0YXR1cwotYWNwaV9nZXRfdGFibGVfYnlfaW5kZXgodTMyIHRhYmxlX2luZGV4LCBzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKip0YWJsZSkKLXsKLQlhY3BpX3N0YXR1cyBzdGF0dXM7Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGFjcGlfZ2V0X3RhYmxlX2J5X2luZGV4KTsKLQotCS8qIFBhcmFtZXRlciB2YWxpZGF0aW9uICovCi0KLQlpZiAoIXRhYmxlKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfUEFSQU1FVEVSKTsKLQl9Ci0KLQkodm9pZClhY3BpX3V0X2FjcXVpcmVfbXV0ZXgoQUNQSV9NVFhfVEFCTEVTKTsKLQotCS8qIFZhbGlkYXRlIGluZGV4ICovCi0KLQlpZiAodGFibGVfaW5kZXggPj0gYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LmNvdW50KSB7Ci0JCSh2b2lkKWFjcGlfdXRfcmVsZWFzZV9tdXRleChBQ1BJX01UWF9UQUJMRVMpOwotCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX1BBUkFNRVRFUik7Ci0JfQotCi0JaWYgKCFhY3BpX2dibF9yb290X3RhYmxlX2xpc3QudGFibGVzW3RhYmxlX2luZGV4XS5wb2ludGVyKSB7Ci0KLQkJLyogVGFibGUgaXMgbm90IG1hcHBlZCwgbWFwIGl0ICovCi0KLQkJc3RhdHVzID0KLQkJICAgIGFjcGlfdGJfdmVyaWZ5X3RhYmxlKCZhY3BpX2dibF9yb290X3RhYmxlX2xpc3QuCi0JCQkJCSB0YWJsZXNbdGFibGVfaW5kZXhdKTsKLQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCQkodm9pZClhY3BpX3V0X3JlbGVhc2VfbXV0ZXgoQUNQSV9NVFhfVEFCTEVTKTsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotCQl9Ci0JfQotCi0JKnRhYmxlID0gYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LnRhYmxlc1t0YWJsZV9pbmRleF0ucG9pbnRlcjsKLQkodm9pZClhY3BpX3V0X3JlbGVhc2VfbXV0ZXgoQUNQSV9NVFhfVEFCTEVTKTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwotfQotCi1BQ1BJX0VYUE9SVF9TWU1CT0woYWNwaV9nZXRfdGFibGVfYnlfaW5kZXgpCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfdGJfbG9hZF9uYW1lc3BhY2UKLSAqCi0gKiBQQVJBTUVURVJTOiAgTm9uZQotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKLSAqCi0gKiBERVNDUklQVElPTjogTG9hZCB0aGUgbmFtZXNwYWNlIGZyb20gdGhlIERTRFQgYW5kIGFsbCBTU0RUcy9QU0RUcyBmb3VuZCBpbgotICogICAgICAgICAgICAgIHRoZSBSU0RUL1hTRFQuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBhY3BpX3N0YXR1cyBhY3BpX3RiX2xvYWRfbmFtZXNwYWNlKHZvaWQpCi17Ci0JYWNwaV9zdGF0dXMgc3RhdHVzOwotCXN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqdGFibGU7Ci0JdTMyIGk7Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKHRiX2xvYWRfbmFtZXNwYWNlKTsKLQotCSh2b2lkKWFjcGlfdXRfYWNxdWlyZV9tdXRleChBQ1BJX01UWF9UQUJMRVMpOwotCi0JLyoKLQkgKiBMb2FkIHRoZSBuYW1lc3BhY2UuIFRoZSBEU0RUIGlzIHJlcXVpcmVkLCBidXQgYW55IFNTRFQgYW5kIFBTRFQgdGFibGVzCi0JICogYXJlIG9wdGlvbmFsLgotCSAqLwotCWlmICghYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LmNvdW50IHx8Ci0JICAgICFBQ1BJX0NPTVBBUkVfTkFNRSgmCi0JCQkgICAgICAgKGFjcGlfZ2JsX3Jvb3RfdGFibGVfbGlzdC4KLQkJCQl0YWJsZXNbQUNQSV9UQUJMRV9JTkRFWF9EU0RUXS5zaWduYXR1cmUpLAotCQkJICAgICAgIEFDUElfU0lHX0RTRFQpCi0JICAgIHx8Ci0JICAgIEFDUElfRkFJTFVSRShhY3BpX3RiX3ZlcmlmeV90YWJsZQotCQkJICgmYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LgotCQkJICB0YWJsZXNbQUNQSV9UQUJMRV9JTkRFWF9EU0RUXSkpKSB7Ci0JCXN0YXR1cyA9IEFFX05PX0FDUElfVEFCTEVTOwotCQlnb3RvIHVubG9ja19hbmRfZXhpdDsKLQl9Ci0KLQkvKgotCSAqIEZpbmQgRFNEVCB0YWJsZQotCSAqLwotCXN0YXR1cyA9Ci0JICAgIGFjcGlfb3NfdGFibGVfb3ZlcnJpZGUoYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LgotCQkJCSAgIHRhYmxlc1tBQ1BJX1RBQkxFX0lOREVYX0RTRFRdLnBvaW50ZXIsCi0JCQkJICAgJnRhYmxlKTsKLQlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykgJiYgdGFibGUpIHsKLQkJLyoKLQkJICogRFNEVCB0YWJsZSBoYXMgYmVlbiBmb3VuZAotCQkgKi8KLQkJYWNwaV90Yl9kZWxldGVfdGFibGUoJmFjcGlfZ2JsX3Jvb3RfdGFibGVfbGlzdC4KLQkJCQkgICAgIHRhYmxlc1tBQ1BJX1RBQkxFX0lOREVYX0RTRFRdKTsKLQkJYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LnRhYmxlc1tBQ1BJX1RBQkxFX0lOREVYX0RTRFRdLnBvaW50ZXIgPQotCQkgICAgdGFibGU7Ci0JCWFjcGlfZ2JsX3Jvb3RfdGFibGVfbGlzdC50YWJsZXNbQUNQSV9UQUJMRV9JTkRFWF9EU0RUXS5sZW5ndGggPQotCQkgICAgdGFibGUtPmxlbmd0aDsKLQkJYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LnRhYmxlc1tBQ1BJX1RBQkxFX0lOREVYX0RTRFRdLmZsYWdzID0KLQkJICAgIEFDUElfVEFCTEVfT1JJR0lOX1VOS05PV047Ci0KLQkJQUNQSV9JTkZPKChBRV9JTkZPLCAiVGFibGUgRFNEVCByZXBsYWNlZCBieSBob3N0IE9TIikpOwotCQlhY3BpX3RiX3ByaW50X3RhYmxlX2hlYWRlcigwLCB0YWJsZSk7Ci0KLQkJaWYgKG5vX2F1dG9fc3NkdCA9PSAwKSB7Ci0JCQlwcmludGsoS0VSTl9XQVJOSU5HICJBQ1BJOiBEU0RUIG92ZXJyaWRlIHVzZXMgb3JpZ2luYWwgU1NEVHMgdW5sZXNzIFwiYWNwaV9ub19hdXRvX3NzZHRcIlxuIik7Ci0JCX0KLQl9Ci0KLQlzdGF0dXMgPQotCSAgICBhY3BpX3RiX3ZlcmlmeV90YWJsZSgmYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LgotCQkJCSB0YWJsZXNbQUNQSV9UQUJMRV9JTkRFWF9EU0RUXSk7Ci0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0KLQkJLyogQSB2YWxpZCBEU0RUIGlzIHJlcXVpcmVkICovCi0KLQkJc3RhdHVzID0gQUVfTk9fQUNQSV9UQUJMRVM7Ci0JCWdvdG8gdW5sb2NrX2FuZF9leGl0OwotCX0KLQotCSh2b2lkKWFjcGlfdXRfcmVsZWFzZV9tdXRleChBQ1BJX01UWF9UQUJMRVMpOwotCi0JLyoKLQkgKiBMb2FkIGFuZCBwYXJzZSB0YWJsZXMuCi0JICovCi0Jc3RhdHVzID0gYWNwaV9uc19sb2FkX3RhYmxlKEFDUElfVEFCTEVfSU5ERVhfRFNEVCwgYWNwaV9nYmxfcm9vdF9ub2RlKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci0JfQotCi0JLyoKLQkgKiBMb2FkIGFueSBTU0RUIG9yIFBTRFQgdGFibGVzLiBOb3RlOiBMb29wIGxlYXZlcyB0YWJsZXMgbG9ja2VkCi0JICovCi0JKHZvaWQpYWNwaV91dF9hY3F1aXJlX211dGV4KEFDUElfTVRYX1RBQkxFUyk7Ci0JZm9yIChpID0gMDsgaSA8IGFjcGlfZ2JsX3Jvb3RfdGFibGVfbGlzdC5jb3VudDsgKytpKSB7Ci0JCWlmICgoIUFDUElfQ09NUEFSRV9OQU1FCi0JCSAgICAgKCYoYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LnRhYmxlc1tpXS5zaWduYXR1cmUpLAotCQkgICAgICBBQ1BJX1NJR19TU0RUKQotCQkgICAgICYmCi0JCSAgICAgIUFDUElfQ09NUEFSRV9OQU1FKCYKLQkJCQkJKGFjcGlfZ2JsX3Jvb3RfdGFibGVfbGlzdC50YWJsZXNbaV0uCi0JCQkJCSBzaWduYXR1cmUpLCBBQ1BJX1NJR19QU0RUKSkKLQkJICAgIHx8Ci0JCSAgICBBQ1BJX0ZBSUxVUkUoYWNwaV90Yl92ZXJpZnlfdGFibGUKLQkJCQkgKCZhY3BpX2dibF9yb290X3RhYmxlX2xpc3QudGFibGVzW2ldKSkpIHsKLQkJCWNvbnRpbnVlOwotCQl9Ci0KLQkJaWYgKG5vX2F1dG9fc3NkdCkgewotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiQUNQSTogU1NEVCBpZ25vcmVkIGR1ZSB0byBcImFjcGlfbm9fYXV0b19zc2R0XCJcbiIpOwotCQkJY29udGludWU7Ci0JCX0KLQotCQkvKiBJZ25vcmUgZXJyb3JzIHdoaWxlIGxvYWRpbmcgdGFibGVzLCBnZXQgYXMgbWFueSBhcyBwb3NzaWJsZSAqLwotCi0JCSh2b2lkKWFjcGlfdXRfcmVsZWFzZV9tdXRleChBQ1BJX01UWF9UQUJMRVMpOwotCQkodm9pZClhY3BpX25zX2xvYWRfdGFibGUoaSwgYWNwaV9nYmxfcm9vdF9ub2RlKTsKLQkJKHZvaWQpYWNwaV91dF9hY3F1aXJlX211dGV4KEFDUElfTVRYX1RBQkxFUyk7Ci0JfQotCi0JQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTklULCAiQUNQSSBUYWJsZXMgc3VjY2Vzc2Z1bGx5IGFjcXVpcmVkXG4iKSk7Ci0KLSAgICAgIHVubG9ja19hbmRfZXhpdDoKLQkodm9pZClhY3BpX3V0X3JlbGVhc2VfbXV0ZXgoQUNQSV9NVFhfVEFCTEVTKTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9sb2FkX3RhYmxlcwotICoKLSAqIFBBUkFNRVRFUlM6ICBOb25lCi0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cwotICoKLSAqIERFU0NSSVBUSU9OOiBMb2FkIHRoZSBBQ1BJIHRhYmxlcyBmcm9tIHRoZSBSU0RUL1hTRFQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1hY3BpX3N0YXR1cyBhY3BpX2xvYWRfdGFibGVzKHZvaWQpCi17Ci0JYWNwaV9zdGF0dXMgc3RhdHVzOwotCi0JQUNQSV9GVU5DVElPTl9UUkFDRShhY3BpX2xvYWRfdGFibGVzKTsKLQotCS8qCi0JICogTG9hZCB0aGUgbmFtZXNwYWNlIGZyb20gdGhlIHRhYmxlcwotCSAqLwotCXN0YXR1cyA9IGFjcGlfdGJfbG9hZF9uYW1lc3BhY2UoKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJQUNQSV9FWENFUFRJT04oKEFFX0lORk8sIHN0YXR1cywKLQkJCQkiV2hpbGUgbG9hZGluZyBuYW1lc3BhY2UgZnJvbSBBQ1BJIHRhYmxlcyIpKTsKLQl9Ci0KLQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLX0KLQotQUNQSV9FWFBPUlRfU1lNQk9MKGFjcGlfbG9hZF90YWJsZXMpCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9pbnN0YWxsX3RhYmxlX2hhbmRsZXIKLSAqCi0gKiBQQVJBTUVURVJTOiAgSGFuZGxlciAgICAgICAgIC0gVGFibGUgZXZlbnQgaGFuZGxlcgotICogICAgICAgICAgICAgIENvbnRleHQgICAgICAgICAtIFZhbHVlIHBhc3NlZCB0byB0aGUgaGFuZGxlciBvbiBlYWNoIGV2ZW50Ci0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cwotICoKLSAqIERFU0NSSVBUSU9OOiBJbnN0YWxsIHRhYmxlIGV2ZW50IGhhbmRsZXIKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYWNwaV9zdGF0dXMKLWFjcGlfaW5zdGFsbF90YWJsZV9oYW5kbGVyKGFjcGlfdGJsX2hhbmRsZXIgaGFuZGxlciwgdm9pZCAqY29udGV4dCkKLXsKLQlhY3BpX3N0YXR1cyBzdGF0dXM7Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGFjcGlfaW5zdGFsbF90YWJsZV9oYW5kbGVyKTsKLQotCWlmICghaGFuZGxlcikgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX1BBUkFNRVRFUik7Ci0JfQotCi0Jc3RhdHVzID0gYWNwaV91dF9hY3F1aXJlX211dGV4KEFDUElfTVRYX0VWRU5UUyk7Ci0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotCX0KLQotCS8qIERvbid0IGFsbG93IG1vcmUgdGhhbiBvbmUgaGFuZGxlciAqLwotCi0JaWYgKGFjcGlfZ2JsX3RhYmxlX2hhbmRsZXIpIHsKLQkJc3RhdHVzID0gQUVfQUxSRUFEWV9FWElTVFM7Ci0JCWdvdG8gY2xlYW51cDsKLQl9Ci0KLQkvKiBJbnN0YWxsIHRoZSBoYW5kbGVyICovCi0KLQlhY3BpX2dibF90YWJsZV9oYW5kbGVyID0gaGFuZGxlcjsKLQlhY3BpX2dibF90YWJsZV9oYW5kbGVyX2NvbnRleHQgPSBjb250ZXh0OwotCi0gICAgICBjbGVhbnVwOgotCSh2b2lkKWFjcGlfdXRfcmVsZWFzZV9tdXRleChBQ1BJX01UWF9FVkVOVFMpOwotCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotfQotCi1BQ1BJX0VYUE9SVF9TWU1CT0woYWNwaV9pbnN0YWxsX3RhYmxlX2hhbmRsZXIpCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfcmVtb3ZlX3RhYmxlX2hhbmRsZXIKLSAqCi0gKiBQQVJBTUVURVJTOiAgSGFuZGxlciAgICAgICAgIC0gVGFibGUgZXZlbnQgaGFuZGxlciB0aGF0IHdhcyBpbnN0YWxsZWQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2aW91c2x5LgotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKLSAqCi0gKiBERVNDUklQVElPTjogUmVtb3ZlIHRhYmxlIGV2ZW50IGhhbmRsZXIKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYWNwaV9zdGF0dXMgYWNwaV9yZW1vdmVfdGFibGVfaGFuZGxlcihhY3BpX3RibF9oYW5kbGVyIGhhbmRsZXIpCi17Ci0JYWNwaV9zdGF0dXMgc3RhdHVzOwotCi0JQUNQSV9GVU5DVElPTl9UUkFDRShhY3BpX3JlbW92ZV90YWJsZV9oYW5kbGVyKTsKLQotCXN0YXR1cyA9IGFjcGlfdXRfYWNxdWlyZV9tdXRleChBQ1BJX01UWF9FVkVOVFMpOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLQl9Ci0KLQkvKiBNYWtlIHN1cmUgdGhhdCB0aGUgaW5zdGFsbGVkIGhhbmRsZXIgaXMgdGhlIHNhbWUgKi8KLQotCWlmICghaGFuZGxlciB8fCBoYW5kbGVyICE9IGFjcGlfZ2JsX3RhYmxlX2hhbmRsZXIpIHsKLQkJc3RhdHVzID0gQUVfQkFEX1BBUkFNRVRFUjsKLQkJZ290byBjbGVhbnVwOwotCX0KLQotCS8qIFJlbW92ZSB0aGUgaGFuZGxlciAqLwotCi0JYWNwaV9nYmxfdGFibGVfaGFuZGxlciA9IE5VTEw7Ci0KLSAgICAgIGNsZWFudXA6Ci0JKHZvaWQpYWNwaV91dF9yZWxlYXNlX211dGV4KEFDUElfTVRYX0VWRU5UUyk7Ci0JcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci19Ci0KLUFDUElfRVhQT1JUX1NZTUJPTChhY3BpX3JlbW92ZV90YWJsZV9oYW5kbGVyKQotCi0KLXN0YXRpYyBpbnQgX19pbml0IGFjcGlfbm9fYXV0b19zc2R0X3NldHVwKGNoYXIgKnMpIHsKLQotICAgICAgICBwcmludGsoS0VSTl9OT1RJQ0UgIkFDUEk6IFNTRFQgYXV0by1sb2FkIGRpc2FibGVkXG4iKTsKLQotICAgICAgICBub19hdXRvX3NzZHQgPSAxOwotCi0gICAgICAgIHJldHVybiAxOwotfQotCi1fX3NldHVwKCJhY3BpX25vX2F1dG9fc3NkdCIsIGFjcGlfbm9fYXV0b19zc2R0X3NldHVwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS90YWJsZXMvdGJ4ZnJvb3QuYyBiL2RyaXZlcnMvYWNwaS90YWJsZXMvdGJ4ZnJvb3QuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQxNTdlMC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL2FjcGkvdGFibGVzL3RieGZyb290LmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIE1vZHVsZSBOYW1lOiB0Ynhmcm9vdCAtIEZpbmQgdGhlIHJvb3QgQUNQSSB0YWJsZSAoUlNEVCkKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA4LCBJbnRlbCBDb3JwLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAotICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgYXQgbWluaW11bSBhIGRpc2NsYWltZXIKLSAqICAgIHN1YnN0YW50aWFsbHkgc2ltaWxhciB0byB0aGUgIk5PIFdBUlJBTlRZIiBkaXNjbGFpbWVyIGJlbG93Ci0gKiAgICAoIkRpc2NsYWltZXIiKSBhbmQgYW55IHJlZGlzdHJpYnV0aW9uIG11c3QgYmUgY29uZGl0aW9uZWQgdXBvbgotICogICAgaW5jbHVkaW5nIGEgc3Vic3RhbnRpYWxseSBzaW1pbGFyIERpc2NsYWltZXIgcmVxdWlyZW1lbnQgZm9yIGZ1cnRoZXIKLSAqICAgIGJpbmFyeSByZWRpc3RyaWJ1dGlvbi4KLSAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcwotICogICAgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICogU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBOTyBXQVJSQU5UWQotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCi0gKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUwotICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcKLSAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQotICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgotICovCi0KLSNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KLSNpbmNsdWRlIDxhY3BpL2FjdGFibGVzLmg+Ci0KLSNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX1RBQkxFUwotQUNQSV9NT0RVTEVfTkFNRSgidGJ4ZnJvb3QiKQotCi0vKiBMb2NhbCBwcm90b3R5cGVzICovCi1zdGF0aWMgdTggKmFjcGlfdGJfc2Nhbl9tZW1vcnlfZm9yX3JzZHAodTggKiBzdGFydF9hZGRyZXNzLCB1MzIgbGVuZ3RoKTsKLQotc3RhdGljIGFjcGlfc3RhdHVzIGFjcGlfdGJfdmFsaWRhdGVfcnNkcChzdHJ1Y3QgYWNwaV90YWJsZV9yc2RwICpyc2RwKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV90Yl92YWxpZGF0ZV9yc2RwCi0gKgotICogUEFSQU1FVEVSUzogIFJzZHAgICAgICAgICAgICAgICAgLSBQb2ludGVyIHRvIHVudmFsaWRhdGVkIFJTRFAKLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IFZhbGlkYXRlIHRoZSBSU0RQIChwdHIpCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIGFjcGlfc3RhdHVzIGFjcGlfdGJfdmFsaWRhdGVfcnNkcChzdHJ1Y3QgYWNwaV90YWJsZV9yc2RwICpyc2RwKQotewotCUFDUElfRlVOQ1RJT05fRU5UUlkoKTsKLQotCS8qCi0JICogVGhlIHNpZ25hdHVyZSBhbmQgY2hlY2tzdW0gbXVzdCBib3RoIGJlIGNvcnJlY3QKLQkgKgotCSAqIE5vdGU6IFNvbWV0aW1lcyB0aGVyZSBleGlzdHMgbW9yZSB0aGFuIG9uZSBSU0RQIGluIG1lbW9yeTsgdGhlIHZhbGlkCi0JICogUlNEUCBoYXMgYSB2YWxpZCBjaGVja3N1bSwgYWxsIG90aGVycyBoYXZlIGFuIGludmFsaWQgY2hlY2tzdW0uCi0JICovCi0JaWYgKEFDUElfU1RSTkNNUCgoY2hhciAqKXJzZHAsIEFDUElfU0lHX1JTRFAsIHNpemVvZihBQ1BJX1NJR19SU0RQKSAtIDEpCi0JICAgICE9IDApIHsKLQotCQkvKiBOb3BlLCBCQUQgU2lnbmF0dXJlICovCi0KLQkJcmV0dXJuIChBRV9CQURfU0lHTkFUVVJFKTsKLQl9Ci0KLQkvKiBDaGVjayB0aGUgc3RhbmRhcmQgY2hlY2tzdW0gKi8KLQotCWlmIChhY3BpX3RiX2NoZWNrc3VtKCh1OCAqKSByc2RwLCBBQ1BJX1JTRFBfQ0hFQ0tTVU1fTEVOR1RIKSAhPSAwKSB7Ci0JCXJldHVybiAoQUVfQkFEX0NIRUNLU1VNKTsKLQl9Ci0KLQkvKiBDaGVjayBleHRlbmRlZCBjaGVja3N1bSBpZiB0YWJsZSB2ZXJzaW9uID49IDIgKi8KLQotCWlmICgocnNkcC0+cmV2aXNpb24gPj0gMikgJiYKLQkgICAgKGFjcGlfdGJfY2hlY2tzdW0oKHU4ICopIHJzZHAsIEFDUElfUlNEUF9YQ0hFQ0tTVU1fTEVOR1RIKSAhPSAwKSkgewotCQlyZXR1cm4gKEFFX0JBRF9DSEVDS1NVTSk7Ci0JfQotCi0JcmV0dXJuIChBRV9PSyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfZmluZF9yb290X3BvaW50ZXIKLSAqCi0gKiBQQVJBTUVURVJTOiAgdGFibGVfYWRkcmVzcyAgICAgICAgICAgLSBXaGVyZSB0aGUgdGFibGUgcG9pbnRlciBpcyByZXR1cm5lZAotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMsIFJTRFAgcGh5c2ljYWwgYWRkcmVzcwotICoKLSAqIERFU0NSSVBUSU9OOiBTZWFyY2ggbG93ZXIgMV9tYnl0ZSBvZiBtZW1vcnkgZm9yIHRoZSByb290IHN5c3RlbSBkZXNjcmlwdG9yCi0gKiAgICAgICAgICAgICAgcG9pbnRlciBzdHJ1Y3R1cmUuICBJZiBpdCBpcyBmb3VuZCwgc2V0ICpSU0RQIHRvIHBvaW50IHRvIGl0LgotICoKLSAqIE5PVEUxOiAgICAgICBUaGUgUlNEUCBtdXN0IGJlIGVpdGhlciBpbiB0aGUgZmlyc3QgMV9rIG9mIHRoZSBFeHRlbmRlZAotICogICAgICAgICAgICAgIEJJT1MgRGF0YSBBcmVhIG9yIGJldHdlZW4gRTAwMDAgYW5kIEZGRkZGIChGcm9tIEFDUEkgU3BlYy4pCi0gKiAgICAgICAgICAgICAgT25seSBhIDMyLWJpdCBwaHlzaWNhbCBhZGRyZXNzIGlzIG5lY2Vzc2FyeS4KLSAqCi0gKiBOT1RFMjogICAgICAgVGhpcyBmdW5jdGlvbiBpcyBhbHdheXMgYXZhaWxhYmxlLCByZWdhcmRsZXNzIG9mIHRoZQotICogICAgICAgICAgICAgIGluaXRpYWxpemF0aW9uIHN0YXRlIG9mIHRoZSByZXN0IG9mIEFDUEkuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotYWNwaV9zdGF0dXMgYWNwaV9maW5kX3Jvb3RfcG9pbnRlcihhY3BpX3NpemUgKnRhYmxlX2FkZHJlc3MpCi17Ci0JdTggKnRhYmxlX3B0cjsKLQl1OCAqbWVtX3JvdmVyOwotCXUzMiBwaHlzaWNhbF9hZGRyZXNzOwotCi0JQUNQSV9GVU5DVElPTl9UUkFDRShhY3BpX2ZpbmRfcm9vdF9wb2ludGVyKTsKLQotCS8qIDFhKSBHZXQgdGhlIGxvY2F0aW9uIG9mIHRoZSBFeHRlbmRlZCBCSU9TIERhdGEgQXJlYSAoRUJEQSkgKi8KLQotCXRhYmxlX3B0ciA9IGFjcGlfb3NfbWFwX21lbW9yeSgoYWNwaV9waHlzaWNhbF9hZGRyZXNzKQotCQkJCSAgICAgICBBQ1BJX0VCREFfUFRSX0xPQ0FUSU9OLAotCQkJCSAgICAgICBBQ1BJX0VCREFfUFRSX0xFTkdUSCk7Ci0JaWYgKCF0YWJsZV9wdHIpIHsKLQkJQUNQSV9FUlJPUigoQUVfSU5GTywKLQkJCSAgICAiQ291bGQgbm90IG1hcCBtZW1vcnkgYXQgJTguOFggZm9yIGxlbmd0aCAlWCIsCi0JCQkgICAgQUNQSV9FQkRBX1BUUl9MT0NBVElPTiwgQUNQSV9FQkRBX1BUUl9MRU5HVEgpKTsKLQotCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9fTUVNT1JZKTsKLQl9Ci0KLQlBQ1BJX01PVkVfMTZfVE9fMzIoJnBoeXNpY2FsX2FkZHJlc3MsIHRhYmxlX3B0cik7Ci0KLQkvKiBDb252ZXJ0IHNlZ21lbnQgcGFydCB0byBwaHlzaWNhbCBhZGRyZXNzICovCi0KLQlwaHlzaWNhbF9hZGRyZXNzIDw8PSA0OwotCWFjcGlfb3NfdW5tYXBfbWVtb3J5KHRhYmxlX3B0ciwgQUNQSV9FQkRBX1BUUl9MRU5HVEgpOwotCi0JLyogRUJEQSBwcmVzZW50PyAqLwotCi0JaWYgKHBoeXNpY2FsX2FkZHJlc3MgPiAweDQwMCkgewotCQkvKgotCQkgKiAxYikgU2VhcmNoIEVCREEgcGFyYWdyYXBocyAoRUJEQSBpcyByZXF1aXJlZCB0byBiZSBhCi0JCSAqICAgICBtaW5pbXVtIG9mIDFfayBsZW5ndGgpCi0JCSAqLwotCQl0YWJsZV9wdHIgPSBhY3BpX29zX21hcF9tZW1vcnkoKGFjcGlfcGh5c2ljYWxfYWRkcmVzcykKLQkJCQkJICAgICAgIHBoeXNpY2FsX2FkZHJlc3MsCi0JCQkJCSAgICAgICBBQ1BJX0VCREFfV0lORE9XX1NJWkUpOwotCQlpZiAoIXRhYmxlX3B0cikgewotCQkJQUNQSV9FUlJPUigoQUVfSU5GTywKLQkJCQkgICAgIkNvdWxkIG5vdCBtYXAgbWVtb3J5IGF0ICU4LjhYIGZvciBsZW5ndGggJVgiLAotCQkJCSAgICBwaHlzaWNhbF9hZGRyZXNzLCBBQ1BJX0VCREFfV0lORE9XX1NJWkUpKTsKLQotCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX01FTU9SWSk7Ci0JCX0KLQotCQltZW1fcm92ZXIgPQotCQkgICAgYWNwaV90Yl9zY2FuX21lbW9yeV9mb3JfcnNkcCh0YWJsZV9wdHIsCi0JCQkJCQkgQUNQSV9FQkRBX1dJTkRPV19TSVpFKTsKLQkJYWNwaV9vc191bm1hcF9tZW1vcnkodGFibGVfcHRyLCBBQ1BJX0VCREFfV0lORE9XX1NJWkUpOwotCi0JCWlmIChtZW1fcm92ZXIpIHsKLQotCQkJLyogUmV0dXJuIHRoZSBwaHlzaWNhbCBhZGRyZXNzICovCi0KLQkJCXBoeXNpY2FsX2FkZHJlc3MgKz0KLQkJCSAgICAodTMyKSBBQ1BJX1BUUl9ESUZGKG1lbV9yb3ZlciwgdGFibGVfcHRyKTsKLQotCQkJKnRhYmxlX2FkZHJlc3MgPSBwaHlzaWNhbF9hZGRyZXNzOwotCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKLQkJfQotCX0KLQotCS8qCi0JICogMikgU2VhcmNoIHVwcGVyIG1lbW9yeTogMTYtYnl0ZSBib3VuZGFyaWVzIGluIEUwMDAwaC1GRkZGRmgKLQkgKi8KLQl0YWJsZV9wdHIgPSBhY3BpX29zX21hcF9tZW1vcnkoKGFjcGlfcGh5c2ljYWxfYWRkcmVzcykKLQkJCQkgICAgICAgQUNQSV9ISV9SU0RQX1dJTkRPV19CQVNFLAotCQkJCSAgICAgICBBQ1BJX0hJX1JTRFBfV0lORE9XX1NJWkUpOwotCi0JaWYgKCF0YWJsZV9wdHIpIHsKLQkJQUNQSV9FUlJPUigoQUVfSU5GTywKLQkJCSAgICAiQ291bGQgbm90IG1hcCBtZW1vcnkgYXQgJTguOFggZm9yIGxlbmd0aCAlWCIsCi0JCQkgICAgQUNQSV9ISV9SU0RQX1dJTkRPV19CQVNFLAotCQkJICAgIEFDUElfSElfUlNEUF9XSU5ET1dfU0laRSkpOwotCi0JCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT19NRU1PUlkpOwotCX0KLQotCW1lbV9yb3ZlciA9Ci0JICAgIGFjcGlfdGJfc2Nhbl9tZW1vcnlfZm9yX3JzZHAodGFibGVfcHRyLCBBQ1BJX0hJX1JTRFBfV0lORE9XX1NJWkUpOwotCWFjcGlfb3NfdW5tYXBfbWVtb3J5KHRhYmxlX3B0ciwgQUNQSV9ISV9SU0RQX1dJTkRPV19TSVpFKTsKLQotCWlmIChtZW1fcm92ZXIpIHsKLQotCQkvKiBSZXR1cm4gdGhlIHBoeXNpY2FsIGFkZHJlc3MgKi8KLQotCQlwaHlzaWNhbF9hZGRyZXNzID0gKHUzMikKLQkJICAgIChBQ1BJX0hJX1JTRFBfV0lORE9XX0JBU0UgKwotCQkgICAgIEFDUElfUFRSX0RJRkYobWVtX3JvdmVyLCB0YWJsZV9wdHIpKTsKLQotCQkqdGFibGVfYWRkcmVzcyA9IHBoeXNpY2FsX2FkZHJlc3M7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7Ci0JfQotCi0JLyogQSB2YWxpZCBSU0RQIHdhcyBub3QgZm91bmQgKi8KLQotCUFDUElfRVJST1IoKEFFX0lORk8sICJBIHZhbGlkIFJTRFAgd2FzIG5vdCBmb3VuZCIpKTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9UX0ZPVU5EKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV90Yl9zY2FuX21lbW9yeV9mb3JfcnNkcAotICoKLSAqIFBBUkFNRVRFUlM6ICBzdGFydF9hZGRyZXNzICAgICAgIC0gU3RhcnRpbmcgcG9pbnRlciBmb3Igc2VhcmNoCi0gKiAgICAgICAgICAgICAgTGVuZ3RoICAgICAgICAgICAgICAtIE1heGltdW0gbGVuZ3RoIHRvIHNlYXJjaAotICoKLSAqIFJFVFVSTjogICAgICBQb2ludGVyIHRvIHRoZSBSU0RQIGlmIGZvdW5kLCBvdGhlcndpc2UgTlVMTC4KLSAqCi0gKiBERVNDUklQVElPTjogU2VhcmNoIGEgYmxvY2sgb2YgbWVtb3J5IGZvciB0aGUgUlNEUCBzaWduYXR1cmUKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHU4ICphY3BpX3RiX3NjYW5fbWVtb3J5X2Zvcl9yc2RwKHU4ICogc3RhcnRfYWRkcmVzcywgdTMyIGxlbmd0aCkKLXsKLQlhY3BpX3N0YXR1cyBzdGF0dXM7Ci0JdTggKm1lbV9yb3ZlcjsKLQl1OCAqZW5kX2FkZHJlc3M7Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKHRiX3NjYW5fbWVtb3J5X2Zvcl9yc2RwKTsKLQotCWVuZF9hZGRyZXNzID0gc3RhcnRfYWRkcmVzcyArIGxlbmd0aDsKLQotCS8qIFNlYXJjaCBmcm9tIGdpdmVuIHN0YXJ0IGFkZHJlc3MgZm9yIHRoZSByZXF1ZXN0ZWQgbGVuZ3RoICovCi0KLQlmb3IgKG1lbV9yb3ZlciA9IHN0YXJ0X2FkZHJlc3M7IG1lbV9yb3ZlciA8IGVuZF9hZGRyZXNzOwotCSAgICAgbWVtX3JvdmVyICs9IEFDUElfUlNEUF9TQ0FOX1NURVApIHsKLQotCQkvKiBUaGUgUlNEUCBzaWduYXR1cmUgYW5kIGNoZWNrc3VtIG11c3QgYm90aCBiZSBjb3JyZWN0ICovCi0KLQkJc3RhdHVzID0KLQkJICAgIGFjcGlfdGJfdmFsaWRhdGVfcnNkcChBQ1BJX0NBU1RfUFRSCi0JCQkJCSAgKHN0cnVjdCBhY3BpX3RhYmxlX3JzZHAsIG1lbV9yb3ZlcikpOwotCQlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpIHsKLQotCQkJLyogU2lnIGFuZCBjaGVja3N1bSB2YWxpZCwgd2UgaGF2ZSBmb3VuZCBhIHJlYWwgUlNEUCAqLwotCi0JCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sCi0JCQkJCSAgIlJTRFAgbG9jYXRlZCBhdCBwaHlzaWNhbCBhZGRyZXNzICVwXG4iLAotCQkJCQkgIG1lbV9yb3ZlcikpOwotCQkJcmV0dXJuX1BUUihtZW1fcm92ZXIpOwotCQl9Ci0KLQkJLyogTm8gc2lnIG1hdGNoIG9yIGJhZCBjaGVja3N1bSwga2VlcCBzZWFyY2hpbmcgKi8KLQl9Ci0KLQkvKiBTZWFyY2hlZCBlbnRpcmUgYmxvY2ssIG5vIFJTRFAgd2FzIGZvdW5kICovCi0KLQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sCi0JCQkgICJTZWFyY2hlZCBlbnRpcmUgYmxvY2sgZnJvbSAlcCwgdmFsaWQgUlNEUCB3YXMgbm90IGZvdW5kXG4iLAotCQkJICBzdGFydF9hZGRyZXNzKSk7Ci0JcmV0dXJuX1BUUihOVUxMKTsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS90aGVybWFsLmMgYi9kcml2ZXJzL2FjcGkvdGhlcm1hbC5jCmluZGV4IDA3M2ZmMDkuLjk5ZTZmMWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS90aGVybWFsLmMKKysrIGIvZHJpdmVycy9hY3BpL3RoZXJtYWwuYwpAQCAtNDE2LDcgKzQxNiw4IEBACiAJfQogCiAJLyogUGFzc2l2ZSAob3B0aW9uYWwpICovCi0JaWYgKGZsYWcgJiBBQ1BJX1RSSVBTX1BBU1NJVkUpIHsKKwlpZiAoKChmbGFnICYgQUNQSV9UUklQU19QQVNTSVZFKSAmJiB0ei0+dHJpcHMucGFzc2l2ZS5mbGFncy52YWxpZCkgfHwKKwkJKGZsYWcgPT0gQUNQSV9UUklQU19JTklUKSkgewogCQl2YWxpZCA9IHR6LT50cmlwcy5wYXNzaXZlLmZsYWdzLnZhbGlkOwogCQlpZiAocHN2ID09IC0xKSB7CiAJCQlzdGF0dXMgPSBBRV9TVVBQT1JUOwpAQCAtNDYyLDggKzQ2MywxMSBAQAogCQltZW1zZXQoJmRldmljZXMsIDAsIHNpemVvZihzdHJ1Y3QgYWNwaV9oYW5kbGVfbGlzdCkpOwogCQlzdGF0dXMgPSBhY3BpX2V2YWx1YXRlX3JlZmVyZW5jZSh0ei0+ZGV2aWNlLT5oYW5kbGUsICJfUFNMIiwKIAkJCQkJCQlOVUxMLCAmZGV2aWNlcyk7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HIFBSRUZJWAorCQkJCSJJbnZhbGlkIHBhc3NpdmUgdGhyZXNob2xkXG4iKTsKIAkJCXR6LT50cmlwcy5wYXNzaXZlLmZsYWdzLnZhbGlkID0gMDsKKwkJfQogCQllbHNlCiAJCQl0ei0+dHJpcHMucGFzc2l2ZS5mbGFncy52YWxpZCA9IDE7CiAKQEAgLTQ4Nyw3ICs0OTEsOCBAQAogCQlpZiAoYWN0ID09IC0xKQogCQkJYnJlYWs7IC8qIGRpc2FibGUgYWxsIGFjdGl2ZSB0cmlwIHBvaW50cyAqLwogCi0JCWlmIChmbGFnICYgQUNQSV9UUklQU19BQ1RJVkUpIHsKKwkJaWYgKChmbGFnID09IEFDUElfVFJJUFNfSU5JVCkgfHwgKChmbGFnICYgQUNQSV9UUklQU19BQ1RJVkUpICYmCisJCQl0ei0+dHJpcHMuYWN0aXZlW2ldLmZsYWdzLnZhbGlkKSkgewogCQkJc3RhdHVzID0gYWNwaV9ldmFsdWF0ZV9pbnRlZ2VyKHR6LT5kZXZpY2UtPmhhbmRsZSwKIAkJCQkJCQluYW1lLCBOVUxMLCAmdG1wKTsKIAkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewpAQCAtNTIxLDggKzUyNiwxMSBAQAogCQkJbWVtc2V0KCZkZXZpY2VzLCAwLCBzaXplb2Yoc3RydWN0IGFjcGlfaGFuZGxlX2xpc3QpKTsKIAkJCXN0YXR1cyA9IGFjcGlfZXZhbHVhdGVfcmVmZXJlbmNlKHR6LT5kZXZpY2UtPmhhbmRsZSwKIAkJCQkJCW5hbWUsIE5VTEwsICZkZXZpY2VzKTsKLQkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkKKwkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgUFJFRklYCisJCQkJCSJJbnZhbGlkIGFjdGl2ZSVkIHRocmVzaG9sZFxuIiwgaSk7CiAJCQkJdHotPnRyaXBzLmFjdGl2ZVtpXS5mbGFncy52YWxpZCA9IDA7CisJCQl9CiAJCQllbHNlCiAJCQkJdHotPnRyaXBzLmFjdGl2ZVtpXS5mbGFncy52YWxpZCA9IDE7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvTWFrZWZpbGUgYi9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL01ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OGVmZjE0Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvTWFrZWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLSMKLSMgTWFrZWZpbGUgZm9yIGFsbCBMaW51eCBBQ1BJIGludGVycHJldGVyIHN1YmRpcmVjdG9yaWVzCi0jCi0KLW9iai15IDo9IHV0YWxsb2MubyB1dGRlYnVnLm8gdXRldmFsLm8gdXRpbml0Lm8gdXRtaXNjLm8gdXR4ZmFjZS5vIFwKLQkJdXRjb3B5Lm8gdXRkZWxldGUubyB1dGdsb2JhbC5vIHV0bWF0aC5vIHV0b2JqZWN0Lm8gXAotCQl1dHN0YXRlLm8gdXRtdXRleC5vIHV0b2JqZWN0Lm8gdXRjYWNoZS5vIHV0cmVzcmMubwotCi1FWFRSQV9DRkxBR1MgKz0gJChBQ1BJX0NGTEFHUykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXRhbGxvYy5jIGIvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dGFsbG9jLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0MWM1MzUuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dGFsbG9jLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIE1vZHVsZSBOYW1lOiB1dGFsbG9jIC0gbG9jYWwgbWVtb3J5IGFsbG9jYXRpb24gcm91dGluZXMKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA4LCBJbnRlbCBDb3JwLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAotICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgYXQgbWluaW11bSBhIGRpc2NsYWltZXIKLSAqICAgIHN1YnN0YW50aWFsbHkgc2ltaWxhciB0byB0aGUgIk5PIFdBUlJBTlRZIiBkaXNjbGFpbWVyIGJlbG93Ci0gKiAgICAoIkRpc2NsYWltZXIiKSBhbmQgYW55IHJlZGlzdHJpYnV0aW9uIG11c3QgYmUgY29uZGl0aW9uZWQgdXBvbgotICogICAgaW5jbHVkaW5nIGEgc3Vic3RhbnRpYWxseSBzaW1pbGFyIERpc2NsYWltZXIgcmVxdWlyZW1lbnQgZm9yIGZ1cnRoZXIKLSAqICAgIGJpbmFyeSByZWRpc3RyaWJ1dGlvbi4KLSAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcwotICogICAgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICogU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBOTyBXQVJSQU5UWQotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCi0gKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUwotICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcKLSAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQotICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgotICovCi0KLSNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KLSNpbmNsdWRlIDxhY3BpL2FjZGVidWcuaD4KLQotI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfVVRJTElUSUVTCi1BQ1BJX01PRFVMRV9OQU1FKCJ1dGFsbG9jIikKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV91dF9jcmVhdGVfY2FjaGVzCi0gKgotICogUEFSQU1FVEVSUzogIE5vbmUKLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IENyZWF0ZSBhbGwgbG9jYWwgY2FjaGVzCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWFjcGlfc3RhdHVzIGFjcGlfdXRfY3JlYXRlX2NhY2hlcyh2b2lkKQotewotCWFjcGlfc3RhdHVzIHN0YXR1czsKLQotCS8qIE9iamVjdCBDYWNoZXMsIGZvciBmcmVxdWVudGx5IHVzZWQgb2JqZWN0cyAqLwotCi0Jc3RhdHVzID0KLQkgICAgYWNwaV9vc19jcmVhdGVfY2FjaGUoIkFjcGktTmFtZXNwYWNlIiwKLQkJCQkgc2l6ZW9mKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlKSwKLQkJCQkgQUNQSV9NQVhfTkFNRVNQQUNFX0NBQ0hFX0RFUFRILAotCQkJCSAmYWNwaV9nYmxfbmFtZXNwYWNlX2NhY2hlKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJcmV0dXJuIChzdGF0dXMpOwotCX0KLQotCXN0YXR1cyA9Ci0JICAgIGFjcGlfb3NfY3JlYXRlX2NhY2hlKCJBY3BpLVN0YXRlIiwgc2l6ZW9mKHVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSksCi0JCQkJIEFDUElfTUFYX1NUQVRFX0NBQ0hFX0RFUFRILAotCQkJCSAmYWNwaV9nYmxfc3RhdGVfY2FjaGUpOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlyZXR1cm4gKHN0YXR1cyk7Ci0JfQotCi0Jc3RhdHVzID0KLQkgICAgYWNwaV9vc19jcmVhdGVfY2FjaGUoIkFjcGktUGFyc2UiLAotCQkJCSBzaXplb2Yoc3RydWN0IGFjcGlfcGFyc2Vfb2JqX2NvbW1vbiksCi0JCQkJIEFDUElfTUFYX1BBUlNFX0NBQ0hFX0RFUFRILAotCQkJCSAmYWNwaV9nYmxfcHNfbm9kZV9jYWNoZSk7Ci0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCXJldHVybiAoc3RhdHVzKTsKLQl9Ci0KLQlzdGF0dXMgPQotCSAgICBhY3BpX29zX2NyZWF0ZV9jYWNoZSgiQWNwaS1QYXJzZUV4dCIsCi0JCQkJIHNpemVvZihzdHJ1Y3QgYWNwaV9wYXJzZV9vYmpfbmFtZWQpLAotCQkJCSBBQ1BJX01BWF9FWFRQQVJTRV9DQUNIRV9ERVBUSCwKLQkJCQkgJmFjcGlfZ2JsX3BzX25vZGVfZXh0X2NhY2hlKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJcmV0dXJuIChzdGF0dXMpOwotCX0KLQotCXN0YXR1cyA9Ci0JICAgIGFjcGlfb3NfY3JlYXRlX2NhY2hlKCJBY3BpLU9wZXJhbmQiLAotCQkJCSBzaXplb2YodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCksCi0JCQkJIEFDUElfTUFYX09CSkVDVF9DQUNIRV9ERVBUSCwKLQkJCQkgJmFjcGlfZ2JsX29wZXJhbmRfY2FjaGUpOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlyZXR1cm4gKHN0YXR1cyk7Ci0JfQotI2lmZGVmIEFDUElfREJHX1RSQUNLX0FMTE9DQVRJT05TCi0KLQkvKiBNZW1vcnkgYWxsb2NhdGlvbiBsaXN0cyAqLwotCi0Jc3RhdHVzID0gYWNwaV91dF9jcmVhdGVfbGlzdCgiQWNwaS1HbG9iYWwiLCAwLCAmYWNwaV9nYmxfZ2xvYmFsX2xpc3QpOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlyZXR1cm4gKHN0YXR1cyk7Ci0JfQotCi0Jc3RhdHVzID0KLQkgICAgYWNwaV91dF9jcmVhdGVfbGlzdCgiQWNwaS1OYW1lc3BhY2UiLAotCQkJCXNpemVvZihzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSksCi0JCQkJJmFjcGlfZ2JsX25zX25vZGVfbGlzdCk7Ci0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCXJldHVybiAoc3RhdHVzKTsKLQl9Ci0jZW5kaWYKLQotCXJldHVybiAoQUVfT0spOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X2RlbGV0ZV9jYWNoZXMKLSAqCi0gKiBQQVJBTUVURVJTOiAgTm9uZQotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKLSAqCi0gKiBERVNDUklQVElPTjogUHVyZ2UgYW5kIGRlbGV0ZSBhbGwgbG9jYWwgY2FjaGVzCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotYWNwaV9zdGF0dXMgYWNwaV91dF9kZWxldGVfY2FjaGVzKHZvaWQpCi17Ci0jaWZkZWYgQUNQSV9EQkdfVFJBQ0tfQUxMT0NBVElPTlMKLQljaGFyIGJ1ZmZlcls3XTsKLQotCWlmIChhY3BpX2dibF9kaXNwbGF5X2ZpbmFsX21lbV9zdGF0cykgewotCQlBQ1BJX1NUUkNQWShidWZmZXIsICJNRU1PUlkiKTsKLQkJKHZvaWQpYWNwaV9kYl9kaXNwbGF5X3N0YXRpc3RpY3MoYnVmZmVyKTsKLQl9Ci0jZW5kaWYKLQotCSh2b2lkKWFjcGlfb3NfZGVsZXRlX2NhY2hlKGFjcGlfZ2JsX25hbWVzcGFjZV9jYWNoZSk7Ci0JYWNwaV9nYmxfbmFtZXNwYWNlX2NhY2hlID0gTlVMTDsKLQotCSh2b2lkKWFjcGlfb3NfZGVsZXRlX2NhY2hlKGFjcGlfZ2JsX3N0YXRlX2NhY2hlKTsKLQlhY3BpX2dibF9zdGF0ZV9jYWNoZSA9IE5VTEw7Ci0KLQkodm9pZClhY3BpX29zX2RlbGV0ZV9jYWNoZShhY3BpX2dibF9vcGVyYW5kX2NhY2hlKTsKLQlhY3BpX2dibF9vcGVyYW5kX2NhY2hlID0gTlVMTDsKLQotCSh2b2lkKWFjcGlfb3NfZGVsZXRlX2NhY2hlKGFjcGlfZ2JsX3BzX25vZGVfY2FjaGUpOwotCWFjcGlfZ2JsX3BzX25vZGVfY2FjaGUgPSBOVUxMOwotCi0JKHZvaWQpYWNwaV9vc19kZWxldGVfY2FjaGUoYWNwaV9nYmxfcHNfbm9kZV9leHRfY2FjaGUpOwotCWFjcGlfZ2JsX3BzX25vZGVfZXh0X2NhY2hlID0gTlVMTDsKLQotI2lmZGVmIEFDUElfREJHX1RSQUNLX0FMTE9DQVRJT05TCi0KLQkvKiBEZWJ1ZyBvbmx5IC0gZGlzcGxheSBsZWZ0b3ZlciBtZW1vcnkgYWxsb2NhdGlvbiwgaWYgYW55ICovCi0KLQlhY3BpX3V0X2R1bXBfYWxsb2NhdGlvbnMoQUNQSV9VSU5UMzJfTUFYLCBOVUxMKTsKLQotCS8qIEZyZWUgbWVtb3J5IGxpc3RzICovCi0KLQlBQ1BJX0ZSRUUoYWNwaV9nYmxfZ2xvYmFsX2xpc3QpOwotCWFjcGlfZ2JsX2dsb2JhbF9saXN0ID0gTlVMTDsKLQotCUFDUElfRlJFRShhY3BpX2dibF9uc19ub2RlX2xpc3QpOwotCWFjcGlfZ2JsX25zX25vZGVfbGlzdCA9IE5VTEw7Ci0jZW5kaWYKLQotCXJldHVybiAoQUVfT0spOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X3ZhbGlkYXRlX2J1ZmZlcgotICoKLSAqIFBBUkFNRVRFUlM6ICBCdWZmZXIgICAgICAgICAgICAgIC0gQnVmZmVyIGRlc2NyaXB0b3IgdG8gYmUgdmFsaWRhdGVkCi0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cwotICoKLSAqIERFU0NSSVBUSU9OOiBQZXJmb3JtIHBhcmFtZXRlciB2YWxpZGF0aW9uIGNoZWNrcyBvbiBhbiBzdHJ1Y3QgYWNwaV9idWZmZXIKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1hY3BpX3N0YXR1cyBhY3BpX3V0X3ZhbGlkYXRlX2J1ZmZlcihzdHJ1Y3QgYWNwaV9idWZmZXIgKiBidWZmZXIpCi17Ci0KLQkvKiBPYnZpb3VzbHksIHRoZSBzdHJ1Y3R1cmUgcG9pbnRlciBtdXN0IGJlIHZhbGlkICovCi0KLQlpZiAoIWJ1ZmZlcikgewotCQlyZXR1cm4gKEFFX0JBRF9QQVJBTUVURVIpOwotCX0KLQotCS8qIFNwZWNpYWwgc2VtYW50aWNzIGZvciB0aGUgbGVuZ3RoICovCi0KLQlpZiAoKGJ1ZmZlci0+bGVuZ3RoID09IEFDUElfTk9fQlVGRkVSKSB8fAotCSAgICAoYnVmZmVyLT5sZW5ndGggPT0gQUNQSV9BTExPQ0FURV9CVUZGRVIpIHx8Ci0JICAgIChidWZmZXItPmxlbmd0aCA9PSBBQ1BJX0FMTE9DQVRFX0xPQ0FMX0JVRkZFUikpIHsKLQkJcmV0dXJuIChBRV9PSyk7Ci0JfQotCi0JLyogTGVuZ3RoIGlzIHZhbGlkLCB0aGUgYnVmZmVyIHBvaW50ZXIgbXVzdCBiZSBhbHNvICovCi0KLQlpZiAoIWJ1ZmZlci0+cG9pbnRlcikgewotCQlyZXR1cm4gKEFFX0JBRF9QQVJBTUVURVIpOwotCX0KLQotCXJldHVybiAoQUVfT0spOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X2luaXRpYWxpemVfYnVmZmVyCi0gKgotICogUEFSQU1FVEVSUzogIEJ1ZmZlciAgICAgICAgICAgICAgLSBCdWZmZXIgdG8gYmUgdmFsaWRhdGVkCi0gKiAgICAgICAgICAgICAgcmVxdWlyZWRfbGVuZ3RoICAgICAtIExlbmd0aCBuZWVkZWQKLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IFZhbGlkYXRlIHRoYXQgdGhlIGJ1ZmZlciBpcyBvZiB0aGUgcmVxdWlyZWQgbGVuZ3RoIG9yCi0gKiAgICAgICAgICAgICAgYWxsb2NhdGUgYSBuZXcgYnVmZmVyLiBSZXR1cm5lZCBidWZmZXIgaXMgYWx3YXlzIHplcm9lZC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1hY3BpX3N0YXR1cwotYWNwaV91dF9pbml0aWFsaXplX2J1ZmZlcihzdHJ1Y3QgYWNwaV9idWZmZXIgKiBidWZmZXIsCi0JCQkgIGFjcGlfc2l6ZSByZXF1aXJlZF9sZW5ndGgpCi17Ci0JYWNwaV9zaXplIGlucHV0X2J1ZmZlcl9sZW5ndGg7Ci0KLQkvKiBQYXJhbWV0ZXIgdmFsaWRhdGlvbiAqLwotCi0JaWYgKCFidWZmZXIgfHwgIXJlcXVpcmVkX2xlbmd0aCkgewotCQlyZXR1cm4gKEFFX0JBRF9QQVJBTUVURVIpOwotCX0KLQotCS8qCi0JICogQnVmZmVyLT5MZW5ndGggaXMgdXNlZCBhcyBib3RoIGFuIGlucHV0IGFuZCBvdXRwdXQgcGFyYW1ldGVyLiBHZXQgdGhlCi0JICogaW5wdXQgYWN0dWFsIGxlbmd0aCBhbmQgc2V0IHRoZSBvdXRwdXQgcmVxdWlyZWQgYnVmZmVyIGxlbmd0aC4KLQkgKi8KLQlpbnB1dF9idWZmZXJfbGVuZ3RoID0gYnVmZmVyLT5sZW5ndGg7Ci0JYnVmZmVyLT5sZW5ndGggPSByZXF1aXJlZF9sZW5ndGg7Ci0KLQkvKgotCSAqIFRoZSBpbnB1dCBidWZmZXIgbGVuZ3RoIGNvbnRhaW5zIHRoZSBhY3R1YWwgYnVmZmVyIGxlbmd0aCwgb3IgdGhlIHR5cGUKLQkgKiBvZiBidWZmZXIgdG8gYmUgYWxsb2NhdGVkIGJ5IHRoaXMgcm91dGluZS4KLQkgKi8KLQlzd2l0Y2ggKGlucHV0X2J1ZmZlcl9sZW5ndGgpIHsKLQljYXNlIEFDUElfTk9fQlVGRkVSOgotCi0JCS8qIFJldHVybiB0aGUgZXhjZXB0aW9uIChhbmQgdGhlIHJlcXVpcmVkIGJ1ZmZlciBsZW5ndGgpICovCi0KLQkJcmV0dXJuIChBRV9CVUZGRVJfT1ZFUkZMT1cpOwotCi0JY2FzZSBBQ1BJX0FMTE9DQVRFX0JVRkZFUjoKLQotCQkvKiBBbGxvY2F0ZSBhIG5ldyBidWZmZXIgKi8KLQotCQlidWZmZXItPnBvaW50ZXIgPSBhY3BpX29zX2FsbG9jYXRlKHJlcXVpcmVkX2xlbmd0aCk7Ci0JCWJyZWFrOwotCi0JY2FzZSBBQ1BJX0FMTE9DQVRFX0xPQ0FMX0JVRkZFUjoKLQotCQkvKiBBbGxvY2F0ZSBhIG5ldyBidWZmZXIgd2l0aCBsb2NhbCBpbnRlcmZhY2UgdG8gYWxsb3cgdHJhY2tpbmcgKi8KLQotCQlidWZmZXItPnBvaW50ZXIgPSBBQ1BJX0FMTE9DQVRFKHJlcXVpcmVkX2xlbmd0aCk7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQotCQkvKiBFeGlzdGluZyBidWZmZXI6IFZhbGlkYXRlIHRoZSBzaXplIG9mIHRoZSBidWZmZXIgKi8KLQotCQlpZiAoaW5wdXRfYnVmZmVyX2xlbmd0aCA8IHJlcXVpcmVkX2xlbmd0aCkgewotCQkJcmV0dXJuIChBRV9CVUZGRVJfT1ZFUkZMT1cpOwotCQl9Ci0JCWJyZWFrOwotCX0KLQotCS8qIFZhbGlkYXRlIGFsbG9jYXRpb24gZnJvbSBhYm92ZSBvciBpbnB1dCBidWZmZXIgcG9pbnRlciAqLwotCi0JaWYgKCFidWZmZXItPnBvaW50ZXIpIHsKLQkJcmV0dXJuIChBRV9OT19NRU1PUlkpOwotCX0KLQotCS8qIEhhdmUgYSB2YWxpZCBidWZmZXIsIGNsZWFyIGl0ICovCi0KLQlBQ1BJX01FTVNFVChidWZmZXItPnBvaW50ZXIsIDAsIHJlcXVpcmVkX2xlbmd0aCk7Ci0JcmV0dXJuIChBRV9PSyk7Ci19Ci0KLSNpZmRlZiBOT1RfVVNFRF9CWV9MSU5VWAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV91dF9hbGxvY2F0ZQotICoKLSAqIFBBUkFNRVRFUlM6ICBTaXplICAgICAgICAgICAgICAgIC0gU2l6ZSBvZiB0aGUgYWxsb2NhdGlvbgotICogICAgICAgICAgICAgIENvbXBvbmVudCAgICAgICAgICAgLSBDb21wb25lbnQgdHlwZSBvZiBjYWxsZXIKLSAqICAgICAgICAgICAgICBNb2R1bGUgICAgICAgICAgICAgIC0gU291cmNlIGZpbGUgbmFtZSBvZiBjYWxsZXIKLSAqICAgICAgICAgICAgICBMaW5lICAgICAgICAgICAgICAgIC0gTGluZSBudW1iZXIgb2YgY2FsbGVyCi0gKgotICogUkVUVVJOOiAgICAgIEFkZHJlc3Mgb2YgdGhlIGFsbG9jYXRlZCBtZW1vcnkgb24gc3VjY2VzcywgTlVMTCBvbiBmYWlsdXJlLgotICoKLSAqIERFU0NSSVBUSU9OOiBTdWJzeXN0ZW0gZXF1aXZhbGVudCBvZiBtYWxsb2MuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdm9pZCAqYWNwaV91dF9hbGxvY2F0ZShhY3BpX3NpemUgc2l6ZSwKLQkJICAgICAgIHUzMiBjb21wb25lbnQsIGNvbnN0IGNoYXIgKm1vZHVsZSwgdTMyIGxpbmUpCi17Ci0Jdm9pZCAqYWxsb2NhdGlvbjsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0VfVTMyKHV0X2FsbG9jYXRlLCBzaXplKTsKLQotCS8qIENoZWNrIGZvciBhbiBpbmFkdmVydGVudCBzaXplIG9mIHplcm8gYnl0ZXMgKi8KLQotCWlmICghc2l6ZSkgewotCQlBQ1BJX1dBUk5JTkcoKG1vZHVsZSwgbGluZSwKLQkJCSAgICAgICJBdHRlbXB0IHRvIGFsbG9jYXRlIHplcm8gYnl0ZXMsIGFsbG9jYXRpbmcgMSBieXRlIikpOwotCQlzaXplID0gMTsKLQl9Ci0KLQlhbGxvY2F0aW9uID0gYWNwaV9vc19hbGxvY2F0ZShzaXplKTsKLQlpZiAoIWFsbG9jYXRpb24pIHsKLQotCQkvKiBSZXBvcnQgYWxsb2NhdGlvbiBlcnJvciAqLwotCi0JCUFDUElfV0FSTklORygobW9kdWxlLCBsaW5lLAotCQkJICAgICAgIkNvdWxkIG5vdCBhbGxvY2F0ZSBzaXplICVYIiwgKHUzMikgc2l6ZSkpOwotCi0JCXJldHVybl9QVFIoTlVMTCk7Ci0JfQotCi0JcmV0dXJuX1BUUihhbGxvY2F0aW9uKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV91dF9hbGxvY2F0ZV96ZXJvZWQKLSAqCi0gKiBQQVJBTUVURVJTOiAgU2l6ZSAgICAgICAgICAgICAgICAtIFNpemUgb2YgdGhlIGFsbG9jYXRpb24KLSAqICAgICAgICAgICAgICBDb21wb25lbnQgICAgICAgICAgIC0gQ29tcG9uZW50IHR5cGUgb2YgY2FsbGVyCi0gKiAgICAgICAgICAgICAgTW9kdWxlICAgICAgICAgICAgICAtIFNvdXJjZSBmaWxlIG5hbWUgb2YgY2FsbGVyCi0gKiAgICAgICAgICAgICAgTGluZSAgICAgICAgICAgICAgICAtIExpbmUgbnVtYmVyIG9mIGNhbGxlcgotICoKLSAqIFJFVFVSTjogICAgICBBZGRyZXNzIG9mIHRoZSBhbGxvY2F0ZWQgbWVtb3J5IG9uIHN1Y2Nlc3MsIE5VTEwgb24gZmFpbHVyZS4KLSAqCi0gKiBERVNDUklQVElPTjogU3Vic3lzdGVtIGVxdWl2YWxlbnQgb2YgY2FsbG9jLiBBbGxvY2F0ZSBhbmQgemVybyBtZW1vcnkuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdm9pZCAqYWNwaV91dF9hbGxvY2F0ZV96ZXJvZWQoYWNwaV9zaXplIHNpemUsCi0JCQkgICAgICB1MzIgY29tcG9uZW50LCBjb25zdCBjaGFyICptb2R1bGUsIHUzMiBsaW5lKQotewotCXZvaWQgKmFsbG9jYXRpb247Ci0KLQlBQ1BJX0ZVTkNUSU9OX0VOVFJZKCk7Ci0KLQlhbGxvY2F0aW9uID0gYWNwaV91dF9hbGxvY2F0ZShzaXplLCBjb21wb25lbnQsIG1vZHVsZSwgbGluZSk7Ci0JaWYgKGFsbG9jYXRpb24pIHsKLQotCQkvKiBDbGVhciB0aGUgbWVtb3J5IGJsb2NrICovCi0KLQkJQUNQSV9NRU1TRVQoYWxsb2NhdGlvbiwgMCwgc2l6ZSk7Ci0JfQotCi0JcmV0dXJuIChhbGxvY2F0aW9uKTsKLX0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dGNhY2hlLmMgYi9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0Y2FjaGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQ1ZmE4MC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0Y2FjaGUuYworKysgL2Rldi9udWxsCkBAIC0xLDMxNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogTW9kdWxlIE5hbWU6IHV0Y2FjaGUgLSBsb2NhbCBjYWNoZSBhbGxvY2F0aW9uIHJvdXRpbmVzCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwOCwgSW50ZWwgQ29ycC4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKLSAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIGF0IG1pbmltdW0gYSBkaXNjbGFpbWVyCi0gKiAgICBzdWJzdGFudGlhbGx5IHNpbWlsYXIgdG8gdGhlICJOTyBXQVJSQU5UWSIgZGlzY2xhaW1lciBiZWxvdwotICogICAgKCJEaXNjbGFpbWVyIikgYW5kIGFueSByZWRpc3RyaWJ1dGlvbiBtdXN0IGJlIGNvbmRpdGlvbmVkIHVwb24KLSAqICAgIGluY2x1ZGluZyBhIHN1YnN0YW50aWFsbHkgc2ltaWxhciBEaXNjbGFpbWVyIHJlcXVpcmVtZW50IGZvciBmdXJ0aGVyCi0gKiAgICBiaW5hcnkgcmVkaXN0cmlidXRpb24uCi0gKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMKLSAqICAgIG9mIGFueSBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTk8gV0FSUkFOVFkKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAotICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKLSAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HCi0gKiBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKLSAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KLSAqLwotCi0jaW5jbHVkZSA8YWNwaS9hY3BpLmg+Ci0KLSNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX1VUSUxJVElFUwotQUNQSV9NT0RVTEVfTkFNRSgidXRjYWNoZSIpCi0jaWZkZWYgQUNQSV9VU0VfTE9DQUxfQ0FDSEUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfb3NfY3JlYXRlX2NhY2hlCi0gKgotICogUEFSQU1FVEVSUzogIGNhY2hlX25hbWUgICAgICAtIEFzY2lpIG5hbWUgZm9yIHRoZSBjYWNoZQotICogICAgICAgICAgICAgIG9iamVjdF9zaXplICAgICAtIFNpemUgb2YgZWFjaCBjYWNoZWQgb2JqZWN0Ci0gKiAgICAgICAgICAgICAgbWF4X2RlcHRoICAgICAgIC0gTWF4aW11bSBkZXB0aCBvZiB0aGUgY2FjaGUgKGluIG9iamVjdHMpCi0gKiAgICAgICAgICAgICAgcmV0dXJuX2NhY2hlICAgIC0gV2hlcmUgdGhlIG5ldyBjYWNoZSBvYmplY3QgaXMgcmV0dXJuZWQKLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IENyZWF0ZSBhIGNhY2hlIG9iamVjdAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1hY3BpX3N0YXR1cwotYWNwaV9vc19jcmVhdGVfY2FjaGUoY2hhciAqY2FjaGVfbmFtZSwKLQkJICAgICB1MTYgb2JqZWN0X3NpemUsCi0JCSAgICAgdTE2IG1heF9kZXB0aCwgc3RydWN0IGFjcGlfbWVtb3J5X2xpc3QgKiogcmV0dXJuX2NhY2hlKQotewotCXN0cnVjdCBhY3BpX21lbW9yeV9saXN0ICpjYWNoZTsKLQotCUFDUElfRlVOQ1RJT05fRU5UUlkoKTsKLQotCWlmICghY2FjaGVfbmFtZSB8fCAhcmV0dXJuX2NhY2hlIHx8IChvYmplY3Rfc2l6ZSA8IDE2KSkgewotCQlyZXR1cm4gKEFFX0JBRF9QQVJBTUVURVIpOwotCX0KLQotCS8qIENyZWF0ZSB0aGUgY2FjaGUgb2JqZWN0ICovCi0KLQljYWNoZSA9IGFjcGlfb3NfYWxsb2NhdGUoc2l6ZW9mKHN0cnVjdCBhY3BpX21lbW9yeV9saXN0KSk7Ci0JaWYgKCFjYWNoZSkgewotCQlyZXR1cm4gKEFFX05PX01FTU9SWSk7Ci0JfQotCi0JLyogUG9wdWxhdGUgdGhlIGNhY2hlIG9iamVjdCBhbmQgcmV0dXJuIGl0ICovCi0KLQlBQ1BJX01FTVNFVChjYWNoZSwgMCwgc2l6ZW9mKHN0cnVjdCBhY3BpX21lbW9yeV9saXN0KSk7Ci0JY2FjaGUtPmxpbmtfb2Zmc2V0ID0gODsKLQljYWNoZS0+bGlzdF9uYW1lID0gY2FjaGVfbmFtZTsKLQljYWNoZS0+b2JqZWN0X3NpemUgPSBvYmplY3Rfc2l6ZTsKLQljYWNoZS0+bWF4X2RlcHRoID0gbWF4X2RlcHRoOwotCi0JKnJldHVybl9jYWNoZSA9IGNhY2hlOwotCXJldHVybiAoQUVfT0spOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX29zX3B1cmdlX2NhY2hlCi0gKgotICogUEFSQU1FVEVSUzogIENhY2hlICAgICAgICAgICAtIEhhbmRsZSB0byBjYWNoZSBvYmplY3QKLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IEZyZWUgYWxsIG9iamVjdHMgd2l0aGluIHRoZSByZXF1ZXN0ZWQgY2FjaGUuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotYWNwaV9zdGF0dXMgYWNwaV9vc19wdXJnZV9jYWNoZShzdHJ1Y3QgYWNwaV9tZW1vcnlfbGlzdCAqIGNhY2hlKQotewotCWNoYXIgKm5leHQ7Ci0KLQlBQ1BJX0ZVTkNUSU9OX0VOVFJZKCk7Ci0KLQlpZiAoIWNhY2hlKSB7Ci0JCXJldHVybiAoQUVfQkFEX1BBUkFNRVRFUik7Ci0JfQotCi0JLyogV2FsayB0aGUgbGlzdCBvZiBvYmplY3RzIGluIHRoaXMgY2FjaGUgKi8KLQotCXdoaWxlIChjYWNoZS0+bGlzdF9oZWFkKSB7Ci0KLQkJLyogRGVsZXRlIGFuZCB1bmxpbmsgb25lIGNhY2hlZCBzdGF0ZSBvYmplY3QgKi8KLQotCQluZXh0ID0gKihBQ1BJX0NBU1RfSU5ESVJFQ1RfUFRSKGNoYXIsCi0JCQkJCQkmKCgoY2hhciAqKWNhY2hlLT4KLQkJCQkJCSAgIGxpc3RfaGVhZClbY2FjaGUtPgotCQkJCQkJCSAgICAgIGxpbmtfb2Zmc2V0XSkpKTsKLQkJQUNQSV9GUkVFKGNhY2hlLT5saXN0X2hlYWQpOwotCi0JCWNhY2hlLT5saXN0X2hlYWQgPSBuZXh0OwotCQljYWNoZS0+Y3VycmVudF9kZXB0aC0tOwotCX0KLQotCXJldHVybiAoQUVfT0spOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX29zX2RlbGV0ZV9jYWNoZQotICoKLSAqIFBBUkFNRVRFUlM6ICBDYWNoZSAgICAgICAgICAgLSBIYW5kbGUgdG8gY2FjaGUgb2JqZWN0Ci0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cwotICoKLSAqIERFU0NSSVBUSU9OOiBGcmVlIGFsbCBvYmplY3RzIHdpdGhpbiB0aGUgcmVxdWVzdGVkIGNhY2hlIGFuZCBkZWxldGUgdGhlCi0gKiAgICAgICAgICAgICAgY2FjaGUgb2JqZWN0LgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWFjcGlfc3RhdHVzIGFjcGlfb3NfZGVsZXRlX2NhY2hlKHN0cnVjdCBhY3BpX21lbW9yeV9saXN0ICogY2FjaGUpCi17Ci0JYWNwaV9zdGF0dXMgc3RhdHVzOwotCi0JQUNQSV9GVU5DVElPTl9FTlRSWSgpOwotCi0JLyogUHVyZ2UgYWxsIG9iamVjdHMgaW4gdGhlIGNhY2hlICovCi0KLQlzdGF0dXMgPSBhY3BpX29zX3B1cmdlX2NhY2hlKGNhY2hlKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJcmV0dXJuIChzdGF0dXMpOwotCX0KLQotCS8qIE5vdyB3ZSBjYW4gZGVsZXRlIHRoZSBjYWNoZSBvYmplY3QgKi8KLQotCUFDUElfRlJFRShjYWNoZSk7Ci0JcmV0dXJuIChBRV9PSyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfb3NfcmVsZWFzZV9vYmplY3QKLSAqCi0gKiBQQVJBTUVURVJTOiAgQ2FjaGUgICAgICAgLSBIYW5kbGUgdG8gY2FjaGUgb2JqZWN0Ci0gKiAgICAgICAgICAgICAgT2JqZWN0ICAgICAgLSBUaGUgb2JqZWN0IHRvIGJlIHJlbGVhc2VkCi0gKgotICogUkVUVVJOOiAgICAgIE5vbmUKLSAqCi0gKiBERVNDUklQVElPTjogUmVsZWFzZSBhbiBvYmplY3QgdG8gdGhlIHNwZWNpZmllZCBjYWNoZS4gIElmIGNhY2hlIGlzIGZ1bGwsCi0gKiAgICAgICAgICAgICAgdGhlIG9iamVjdCBpcyBkZWxldGVkLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWFjcGlfc3RhdHVzCi1hY3BpX29zX3JlbGVhc2Vfb2JqZWN0KHN0cnVjdCBhY3BpX21lbW9yeV9saXN0ICogY2FjaGUsIHZvaWQgKm9iamVjdCkKLXsKLQlhY3BpX3N0YXR1cyBzdGF0dXM7Ci0KLQlBQ1BJX0ZVTkNUSU9OX0VOVFJZKCk7Ci0KLQlpZiAoIWNhY2hlIHx8ICFvYmplY3QpIHsKLQkJcmV0dXJuIChBRV9CQURfUEFSQU1FVEVSKTsKLQl9Ci0KLQkvKiBJZiBjYWNoZSBpcyBmdWxsLCBqdXN0IGZyZWUgdGhpcyBvYmplY3QgKi8KLQotCWlmIChjYWNoZS0+Y3VycmVudF9kZXB0aCA+PSBjYWNoZS0+bWF4X2RlcHRoKSB7Ci0JCUFDUElfRlJFRShvYmplY3QpOwotCQlBQ1BJX01FTV9UUkFDS0lORyhjYWNoZS0+dG90YWxfZnJlZWQrKyk7Ci0JfQotCi0JLyogT3RoZXJ3aXNlIHB1dCB0aGlzIG9iamVjdCBiYWNrIGludG8gdGhlIGNhY2hlICovCi0KLQllbHNlIHsKLQkJc3RhdHVzID0gYWNwaV91dF9hY3F1aXJlX211dGV4KEFDUElfTVRYX0NBQ0hFUyk7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQkJcmV0dXJuIChzdGF0dXMpOwotCQl9Ci0KLQkJLyogTWFyayB0aGUgb2JqZWN0IGFzIGNhY2hlZCAqLwotCi0JCUFDUElfTUVNU0VUKG9iamVjdCwgMHhDQSwgY2FjaGUtPm9iamVjdF9zaXplKTsKLQkJQUNQSV9TRVRfREVTQ1JJUFRPUl9UWVBFKG9iamVjdCwgQUNQSV9ERVNDX1RZUEVfQ0FDSEVEKTsKLQotCQkvKiBQdXQgdGhlIG9iamVjdCBhdCB0aGUgaGVhZCBvZiB0aGUgY2FjaGUgbGlzdCAqLwotCi0JCSooQUNQSV9DQVNUX0lORElSRUNUX1BUUihjaGFyLAotCQkJCQkgJigoKGNoYXIgKilvYmplY3QpW2NhY2hlLT4KLQkJCQkJCQkgICAgbGlua19vZmZzZXRdKSkpID0KLQkJICAgIGNhY2hlLT5saXN0X2hlYWQ7Ci0JCWNhY2hlLT5saXN0X2hlYWQgPSBvYmplY3Q7Ci0JCWNhY2hlLT5jdXJyZW50X2RlcHRoKys7Ci0KLQkJKHZvaWQpYWNwaV91dF9yZWxlYXNlX211dGV4KEFDUElfTVRYX0NBQ0hFUyk7Ci0JfQotCi0JcmV0dXJuIChBRV9PSyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfb3NfYWNxdWlyZV9vYmplY3QKLSAqCi0gKiBQQVJBTUVURVJTOiAgQ2FjaGUgICAgICAgICAgIC0gSGFuZGxlIHRvIGNhY2hlIG9iamVjdAotICoKLSAqIFJFVFVSTjogICAgICB0aGUgYWNxdWlyZWQgb2JqZWN0LiAgTlVMTCBvbiBlcnJvcgotICoKLSAqIERFU0NSSVBUSU9OOiBHZXQgYW4gb2JqZWN0IGZyb20gdGhlIHNwZWNpZmllZCBjYWNoZS4gIElmIGNhY2hlIGlzIGVtcHR5LAotICogICAgICAgICAgICAgIHRoZSBvYmplY3QgaXMgYWxsb2NhdGVkLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXZvaWQgKmFjcGlfb3NfYWNxdWlyZV9vYmplY3Qoc3RydWN0IGFjcGlfbWVtb3J5X2xpc3QgKmNhY2hlKQotewotCWFjcGlfc3RhdHVzIHN0YXR1czsKLQl2b2lkICpvYmplY3Q7Ci0KLQlBQ1BJX0ZVTkNUSU9OX05BTUUob3NfYWNxdWlyZV9vYmplY3QpOwotCi0JaWYgKCFjYWNoZSkgewotCQlyZXR1cm4gKE5VTEwpOwotCX0KLQotCXN0YXR1cyA9IGFjcGlfdXRfYWNxdWlyZV9tdXRleChBQ1BJX01UWF9DQUNIRVMpOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlyZXR1cm4gKE5VTEwpOwotCX0KLQotCUFDUElfTUVNX1RSQUNLSU5HKGNhY2hlLT5yZXF1ZXN0cysrKTsKLQotCS8qIENoZWNrIHRoZSBjYWNoZSBmaXJzdCAqLwotCi0JaWYgKGNhY2hlLT5saXN0X2hlYWQpIHsKLQotCQkvKiBUaGVyZSBpcyBhbiBvYmplY3QgYXZhaWxhYmxlLCB1c2UgaXQgKi8KLQotCQlvYmplY3QgPSBjYWNoZS0+bGlzdF9oZWFkOwotCQljYWNoZS0+bGlzdF9oZWFkID0gKihBQ1BJX0NBU1RfSU5ESVJFQ1RfUFRSKGNoYXIsCi0JCQkJCQkJICAgICYoKChjaGFyICopCi0JCQkJCQkJICAgICAgIG9iamVjdClbY2FjaGUtPgotCQkJCQkJCQkgICAgICAgbGlua19vZmZzZXRdKSkpOwotCi0JCWNhY2hlLT5jdXJyZW50X2RlcHRoLS07Ci0KLQkJQUNQSV9NRU1fVFJBQ0tJTkcoY2FjaGUtPmhpdHMrKyk7Ci0JCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVhFQywKLQkJCQkgICJPYmplY3QgJXAgZnJvbSAlcyBjYWNoZVxuIiwgb2JqZWN0LAotCQkJCSAgY2FjaGUtPmxpc3RfbmFtZSkpOwotCi0JCXN0YXR1cyA9IGFjcGlfdXRfcmVsZWFzZV9tdXRleChBQ1BJX01UWF9DQUNIRVMpOwotCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJCXJldHVybiAoTlVMTCk7Ci0JCX0KLQotCQkvKiBDbGVhciAoemVybykgdGhlIHByZXZpb3VzbHkgdXNlZCBPYmplY3QgKi8KLQotCQlBQ1BJX01FTVNFVChvYmplY3QsIDAsIGNhY2hlLT5vYmplY3Rfc2l6ZSk7Ci0JfSBlbHNlIHsKLQkJLyogVGhlIGNhY2hlIGlzIGVtcHR5LCBjcmVhdGUgYSBuZXcgb2JqZWN0ICovCi0KLQkJQUNQSV9NRU1fVFJBQ0tJTkcoY2FjaGUtPnRvdGFsX2FsbG9jYXRlZCsrKTsKLQotI2lmZGVmIEFDUElfREJHX1RSQUNLX0FMTE9DQVRJT05TCi0JCWlmICgoY2FjaGUtPnRvdGFsX2FsbG9jYXRlZCAtIGNhY2hlLT50b3RhbF9mcmVlZCkgPgotCQkgICAgY2FjaGUtPm1heF9vY2N1cGllZCkgewotCQkJY2FjaGUtPm1heF9vY2N1cGllZCA9Ci0JCQkgICAgY2FjaGUtPnRvdGFsX2FsbG9jYXRlZCAtIGNhY2hlLT50b3RhbF9mcmVlZDsKLQkJfQotI2VuZGlmCi0KLQkJLyogQXZvaWQgZGVhZGxvY2sgd2l0aCBBQ1BJX0FMTE9DQVRFX1pFUk9FRCAqLwotCi0JCXN0YXR1cyA9IGFjcGlfdXRfcmVsZWFzZV9tdXRleChBQ1BJX01UWF9DQUNIRVMpOwotCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJCXJldHVybiAoTlVMTCk7Ci0JCX0KLQotCQlvYmplY3QgPSBBQ1BJX0FMTE9DQVRFX1pFUk9FRChjYWNoZS0+b2JqZWN0X3NpemUpOwotCQlpZiAoIW9iamVjdCkgewotCQkJcmV0dXJuIChOVUxMKTsKLQkJfQotCX0KLQotCXJldHVybiAob2JqZWN0KTsKLX0KLSNlbmRpZgkJCQkvKiBBQ1BJX1VTRV9MT0NBTF9DQUNIRSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dGNvcHkuYyBiL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXRjb3B5LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViMmY3YzIuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dGNvcHkuYworKysgL2Rldi9udWxsCkBAIC0xLDk2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogTW9kdWxlIE5hbWU6IHV0Y29weSAtIEludGVybmFsIHRvIGV4dGVybmFsIG9iamVjdCB0cmFuc2xhdGlvbiB1dGlsaXRpZXMKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA4LCBJbnRlbCBDb3JwLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAotICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgYXQgbWluaW11bSBhIGRpc2NsYWltZXIKLSAqICAgIHN1YnN0YW50aWFsbHkgc2ltaWxhciB0byB0aGUgIk5PIFdBUlJBTlRZIiBkaXNjbGFpbWVyIGJlbG93Ci0gKiAgICAoIkRpc2NsYWltZXIiKSBhbmQgYW55IHJlZGlzdHJpYnV0aW9uIG11c3QgYmUgY29uZGl0aW9uZWQgdXBvbgotICogICAgaW5jbHVkaW5nIGEgc3Vic3RhbnRpYWxseSBzaW1pbGFyIERpc2NsYWltZXIgcmVxdWlyZW1lbnQgZm9yIGZ1cnRoZXIKLSAqICAgIGJpbmFyeSByZWRpc3RyaWJ1dGlvbi4KLSAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcwotICogICAgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICogU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBOTyBXQVJSQU5UWQotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCi0gKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUwotICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcKLSAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQotICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgotICovCi0KLSNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KLSNpbmNsdWRlIDxhY3BpL2FjbmFtZXNwLmg+Ci0KLQotI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfVVRJTElUSUVTCi1BQ1BJX01PRFVMRV9OQU1FKCJ1dGNvcHkiKQotCi0vKiBMb2NhbCBwcm90b3R5cGVzICovCi1zdGF0aWMgYWNwaV9zdGF0dXMKLWFjcGlfdXRfY29weV9pc2ltcGxlX3RvX2VzaW1wbGUodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqaW50ZXJuYWxfb2JqZWN0LAotCQkJCXVuaW9uIGFjcGlfb2JqZWN0ICpleHRlcm5hbF9vYmplY3QsCi0JCQkJdTggKiBkYXRhX3NwYWNlLCBhY3BpX3NpemUgKiBidWZmZXJfc3BhY2VfdXNlZCk7Ci0KLXN0YXRpYyBhY3BpX3N0YXR1cwotYWNwaV91dF9jb3B5X2llbGVtZW50X3RvX2llbGVtZW50KHU4IG9iamVjdF90eXBlLAotCQkJCSAgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqc291cmNlX29iamVjdCwKLQkJCQkgIHVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSAqc3RhdGUsCi0JCQkJICB2b2lkICpjb250ZXh0KTsKLQotc3RhdGljIGFjcGlfc3RhdHVzCi1hY3BpX3V0X2NvcHlfaXBhY2thZ2VfdG9fZXBhY2thZ2UodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqaW50ZXJuYWxfb2JqZWN0LAotCQkJCSAgdTggKiBidWZmZXIsIGFjcGlfc2l6ZSAqIHNwYWNlX3VzZWQpOwotCi1zdGF0aWMgYWNwaV9zdGF0dXMKLWFjcGlfdXRfY29weV9lc2ltcGxlX3RvX2lzaW1wbGUodW5pb24gYWNwaV9vYmplY3QgKnVzZXJfb2JqLAotCQkJCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKipyZXR1cm5fb2JqKTsKLQotc3RhdGljIGFjcGlfc3RhdHVzCi1hY3BpX3V0X2NvcHlfZXBhY2thZ2VfdG9faXBhY2thZ2UodW5pb24gYWNwaV9vYmplY3QgKmV4dGVybmFsX29iamVjdCwKLQkJCQkgIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKippbnRlcm5hbF9vYmplY3QpOwotCi1zdGF0aWMgYWNwaV9zdGF0dXMKLWFjcGlfdXRfY29weV9zaW1wbGVfb2JqZWN0KHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnNvdXJjZV9kZXNjLAotCQkJICAgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqZGVzdF9kZXNjKTsKLQotc3RhdGljIGFjcGlfc3RhdHVzCi1hY3BpX3V0X2NvcHlfaWVsZW1lbnRfdG9fZWVsZW1lbnQodTggb2JqZWN0X3R5cGUsCi0JCQkJICB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpzb3VyY2Vfb2JqZWN0LAotCQkJCSAgdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICpzdGF0ZSwKLQkJCQkgIHZvaWQgKmNvbnRleHQpOwotCi1zdGF0aWMgYWNwaV9zdGF0dXMKLWFjcGlfdXRfY29weV9pcGFja2FnZV90b19pcGFja2FnZSh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpzb3VyY2Vfb2JqLAotCQkJCSAgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqZGVzdF9vYmosCi0JCQkJICBzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV91dF9jb3B5X2lzaW1wbGVfdG9fZXNpbXBsZQotICoKLSAqIFBBUkFNRVRFUlM6ICBpbnRlcm5hbF9vYmplY3QgICAgIC0gU291cmNlIG9iamVjdCB0byBiZSBjb3BpZWQKLSAqICAgICAgICAgICAgICBleHRlcm5hbF9vYmplY3QgICAgIC0gV2hlcmUgdG8gcmV0dXJuIHRoZSBjb3BpZWQgb2JqZWN0Ci0gKiAgICAgICAgICAgICAgZGF0YV9zcGFjZSAgICAgICAgICAtIFdoZXJlIG9iamVjdCBkYXRhIGlzIHJldHVybmVkIChzdWNoIGFzCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciBhbmQgc3RyaW5nIGRhdGEpCi0gKiAgICAgICAgICAgICAgYnVmZmVyX3NwYWNlX3VzZWQgICAtIExlbmd0aCBvZiBkYXRhX3NwYWNlIHRoYXQgd2FzIHVzZWQKLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGNvcHkgYSBzaW1wbGUgaW50ZXJuYWwgb2JqZWN0IHRvCi0gKiAgICAgICAgICAgICAgYW4gZXh0ZXJuYWwgb2JqZWN0LgotICoKLSAqICAgICAgICAgICAgICBUaGUgZGF0YV9zcGFjZSBidWZmZXIgaXMgYXNzdW1lZCB0byBoYXZlIHN1ZmZpY2llbnQgc3BhY2UgZm9yCi0gKiAgICAgICAgICAgICAgdGhlIG9iamVjdC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgYWNwaV9zdGF0dXMKLWFjcGlfdXRfY29weV9pc2ltcGxlX3RvX2VzaW1wbGUodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqaW50ZXJuYWxfb2JqZWN0LAotCQkJCXVuaW9uIGFjcGlfb2JqZWN0ICpleHRlcm5hbF9vYmplY3QsCi0JCQkJdTggKiBkYXRhX3NwYWNlLCBhY3BpX3NpemUgKiBidWZmZXJfc3BhY2VfdXNlZCkKLXsKLQlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UodXRfY29weV9pc2ltcGxlX3RvX2VzaW1wbGUpOwotCi0JKmJ1ZmZlcl9zcGFjZV91c2VkID0gMDsKLQotCS8qCi0JICogQ2hlY2sgZm9yIE5VTEwgb2JqZWN0IGNhc2UgKGNvdWxkIGJlIGFuIHVuaW5pdGlhbGl6ZWQKLQkgKiBwYWNrYWdlIGVsZW1lbnQpCi0JICovCi0JaWYgKCFpbnRlcm5hbF9vYmplY3QpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKLQl9Ci0KLQkvKiBBbHdheXMgY2xlYXIgdGhlIGV4dGVybmFsIG9iamVjdCAqLwotCi0JQUNQSV9NRU1TRVQoZXh0ZXJuYWxfb2JqZWN0LCAwLCBzaXplb2YodW5pb24gYWNwaV9vYmplY3QpKTsKLQotCS8qCi0JICogSW4gZ2VuZXJhbCwgdGhlIGV4dGVybmFsIG9iamVjdCB3aWxsIGJlIHRoZSBzYW1lIHR5cGUgYXMKLQkgKiB0aGUgaW50ZXJuYWwgb2JqZWN0Ci0JICovCi0JZXh0ZXJuYWxfb2JqZWN0LT50eXBlID0gQUNQSV9HRVRfT0JKRUNUX1RZUEUoaW50ZXJuYWxfb2JqZWN0KTsKLQotCS8qIEhvd2V2ZXIsIG9ubHkgYSBsaW1pdGVkIG51bWJlciBvZiBleHRlcm5hbCB0eXBlcyBhcmUgc3VwcG9ydGVkICovCi0KLQlzd2l0Y2ggKEFDUElfR0VUX09CSkVDVF9UWVBFKGludGVybmFsX29iamVjdCkpIHsKLQljYXNlIEFDUElfVFlQRV9TVFJJTkc6Ci0KLQkJZXh0ZXJuYWxfb2JqZWN0LT5zdHJpbmcucG9pbnRlciA9IChjaGFyICopZGF0YV9zcGFjZTsKLQkJZXh0ZXJuYWxfb2JqZWN0LT5zdHJpbmcubGVuZ3RoID0gaW50ZXJuYWxfb2JqZWN0LT5zdHJpbmcubGVuZ3RoOwotCQkqYnVmZmVyX3NwYWNlX3VzZWQgPSBBQ1BJX1JPVU5EX1VQX1RPX05BVElWRV9XT1JEKChhY3BpX3NpemUpCi0JCQkJCQkJCSAgaW50ZXJuYWxfb2JqZWN0LT4KLQkJCQkJCQkJICBzdHJpbmcuCi0JCQkJCQkJCSAgbGVuZ3RoICsgMSk7Ci0KLQkJQUNQSV9NRU1DUFkoKHZvaWQgKilkYXRhX3NwYWNlLAotCQkJICAgICh2b2lkICopaW50ZXJuYWxfb2JqZWN0LT5zdHJpbmcucG9pbnRlciwKLQkJCSAgICAoYWNwaV9zaXplKSBpbnRlcm5hbF9vYmplY3QtPnN0cmluZy5sZW5ndGggKyAxKTsKLQkJYnJlYWs7Ci0KLQljYXNlIEFDUElfVFlQRV9CVUZGRVI6Ci0KLQkJZXh0ZXJuYWxfb2JqZWN0LT5idWZmZXIucG9pbnRlciA9IGRhdGFfc3BhY2U7Ci0JCWV4dGVybmFsX29iamVjdC0+YnVmZmVyLmxlbmd0aCA9IGludGVybmFsX29iamVjdC0+YnVmZmVyLmxlbmd0aDsKLQkJKmJ1ZmZlcl9zcGFjZV91c2VkID0KLQkJICAgIEFDUElfUk9VTkRfVVBfVE9fTkFUSVZFX1dPUkQoaW50ZXJuYWxfb2JqZWN0LT5zdHJpbmcuCi0JCQkJCQkgbGVuZ3RoKTsKLQotCQlBQ1BJX01FTUNQWSgodm9pZCAqKWRhdGFfc3BhY2UsCi0JCQkgICAgKHZvaWQgKilpbnRlcm5hbF9vYmplY3QtPmJ1ZmZlci5wb2ludGVyLAotCQkJICAgIGludGVybmFsX29iamVjdC0+YnVmZmVyLmxlbmd0aCk7Ci0JCWJyZWFrOwotCi0JY2FzZSBBQ1BJX1RZUEVfSU5URUdFUjoKLQotCQlleHRlcm5hbF9vYmplY3QtPmludGVnZXIudmFsdWUgPSBpbnRlcm5hbF9vYmplY3QtPmludGVnZXIudmFsdWU7Ci0JCWJyZWFrOwotCi0JY2FzZSBBQ1BJX1RZUEVfTE9DQUxfUkVGRVJFTkNFOgotCi0JCS8qIFRoaXMgaXMgYW4gb2JqZWN0IHJlZmVyZW5jZS4gKi8KLQotCQlzd2l0Y2ggKGludGVybmFsX29iamVjdC0+cmVmZXJlbmNlLmNsYXNzKSB7Ci0JCWNhc2UgQUNQSV9SRUZDTEFTU19OQU1FOgotCi0JCQkvKgotCQkJICogRm9yIG5hbWVwYXRoLCByZXR1cm4gdGhlIG9iamVjdCBoYW5kbGUgKCJyZWZlcmVuY2UiKQotCQkJICogV2UgYXJlIHJlZmVycmluZyB0byB0aGUgbmFtZXNwYWNlIG5vZGUKLQkJCSAqLwotCQkJZXh0ZXJuYWxfb2JqZWN0LT5yZWZlcmVuY2UuaGFuZGxlID0KLQkJCSAgICBpbnRlcm5hbF9vYmplY3QtPnJlZmVyZW5jZS5ub2RlOwotCQkJZXh0ZXJuYWxfb2JqZWN0LT5yZWZlcmVuY2UuYWN0dWFsX3R5cGUgPQotCQkJICAgIGFjcGlfbnNfZ2V0X3R5cGUoaW50ZXJuYWxfb2JqZWN0LT5yZWZlcmVuY2Uubm9kZSk7Ci0JCQlicmVhazsKLQotCQlkZWZhdWx0OgotCi0JCQkvKiBBbGwgb3RoZXIgcmVmZXJlbmNlIHR5cGVzIGFyZSB1bnN1cHBvcnRlZCAqLwotCi0JCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfVFlQRSk7Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIEFDUElfVFlQRV9QUk9DRVNTT1I6Ci0KLQkJZXh0ZXJuYWxfb2JqZWN0LT5wcm9jZXNzb3IucHJvY19pZCA9Ci0JCSAgICBpbnRlcm5hbF9vYmplY3QtPnByb2Nlc3Nvci5wcm9jX2lkOwotCQlleHRlcm5hbF9vYmplY3QtPnByb2Nlc3Nvci5wYmxrX2FkZHJlc3MgPQotCQkgICAgaW50ZXJuYWxfb2JqZWN0LT5wcm9jZXNzb3IuYWRkcmVzczsKLQkJZXh0ZXJuYWxfb2JqZWN0LT5wcm9jZXNzb3IucGJsa19sZW5ndGggPQotCQkgICAgaW50ZXJuYWxfb2JqZWN0LT5wcm9jZXNzb3IubGVuZ3RoOwotCQlicmVhazsKLQotCWNhc2UgQUNQSV9UWVBFX1BPV0VSOgotCi0JCWV4dGVybmFsX29iamVjdC0+cG93ZXJfcmVzb3VyY2Uuc3lzdGVtX2xldmVsID0KLQkJICAgIGludGVybmFsX29iamVjdC0+cG93ZXJfcmVzb3VyY2Uuc3lzdGVtX2xldmVsOwotCi0JCWV4dGVybmFsX29iamVjdC0+cG93ZXJfcmVzb3VyY2UucmVzb3VyY2Vfb3JkZXIgPQotCQkgICAgaW50ZXJuYWxfb2JqZWN0LT5wb3dlcl9yZXNvdXJjZS5yZXNvdXJjZV9vcmRlcjsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQkvKgotCQkgKiBUaGVyZSBpcyBubyBjb3JyZXNwb25kaW5nIGV4dGVybmFsIG9iamVjdCB0eXBlCi0JCSAqLwotCQlBQ1BJX0VSUk9SKChBRV9JTkZPLAotCQkJICAgICJVbnN1cHBvcnRlZCBvYmplY3QgdHlwZSwgY2Fubm90IGNvbnZlcnQgdG8gZXh0ZXJuYWwgb2JqZWN0OiAlcyIsCi0JCQkgICAgYWNwaV91dF9nZXRfdHlwZV9uYW1lKEFDUElfR0VUX09CSkVDVF9UWVBFCi0JCQkJCQkgIChpbnRlcm5hbF9vYmplY3QpKSkpOwotCi0JCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9TVVBQT1JUKTsKLQl9Ci0KLQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV91dF9jb3B5X2llbGVtZW50X3RvX2VlbGVtZW50Ci0gKgotICogUEFSQU1FVEVSUzogIGFjcGlfcGtnX2NhbGxiYWNrCi0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cwotICoKLSAqIERFU0NSSVBUSU9OOiBDb3B5IG9uZSBwYWNrYWdlIGVsZW1lbnQgdG8gYW5vdGhlciBwYWNrYWdlIGVsZW1lbnQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgYWNwaV9zdGF0dXMKLWFjcGlfdXRfY29weV9pZWxlbWVudF90b19lZWxlbWVudCh1OCBvYmplY3RfdHlwZSwKLQkJCQkgIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnNvdXJjZV9vYmplY3QsCi0JCQkJICB1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgKnN0YXRlLAotCQkJCSAgdm9pZCAqY29udGV4dCkKLXsKLQlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKLQlzdHJ1Y3QgYWNwaV9wa2dfaW5mbyAqaW5mbyA9IChzdHJ1Y3QgYWNwaV9wa2dfaW5mbyAqKWNvbnRleHQ7Ci0JYWNwaV9zaXplIG9iamVjdF9zcGFjZTsKLQl1MzIgdGhpc19pbmRleDsKLQl1bmlvbiBhY3BpX29iamVjdCAqdGFyZ2V0X29iamVjdDsKLQotCUFDUElfRlVOQ1RJT05fRU5UUlkoKTsKLQotCXRoaXNfaW5kZXggPSBzdGF0ZS0+cGtnLmluZGV4OwotCXRhcmdldF9vYmplY3QgPSAodW5pb24gYWNwaV9vYmplY3QgKikKLQkgICAgJigodW5pb24gYWNwaV9vYmplY3QgKikoc3RhdGUtPnBrZy5kZXN0X29iamVjdCkpLT5wYWNrYWdlLgotCSAgICBlbGVtZW50c1t0aGlzX2luZGV4XTsKLQotCXN3aXRjaCAob2JqZWN0X3R5cGUpIHsKLQljYXNlIEFDUElfQ09QWV9UWVBFX1NJTVBMRToKLQotCQkvKgotCQkgKiBUaGlzIGlzIGEgc2ltcGxlIG9yIG51bGwgb2JqZWN0Ci0JCSAqLwotCQlzdGF0dXMgPSBhY3BpX3V0X2NvcHlfaXNpbXBsZV90b19lc2ltcGxlKHNvdXJjZV9vYmplY3QsCi0JCQkJCQkJIHRhcmdldF9vYmplY3QsCi0JCQkJCQkJIGluZm8tPmZyZWVfc3BhY2UsCi0JCQkJCQkJICZvYmplY3Rfc3BhY2UpOwotCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJCXJldHVybiAoc3RhdHVzKTsKLQkJfQotCQlicmVhazsKLQotCWNhc2UgQUNQSV9DT1BZX1RZUEVfUEFDS0FHRToKLQotCQkvKgotCQkgKiBCdWlsZCB0aGUgcGFja2FnZSBvYmplY3QKLQkJICovCi0JCXRhcmdldF9vYmplY3QtPnR5cGUgPSBBQ1BJX1RZUEVfUEFDS0FHRTsKLQkJdGFyZ2V0X29iamVjdC0+cGFja2FnZS5jb3VudCA9IHNvdXJjZV9vYmplY3QtPnBhY2thZ2UuY291bnQ7Ci0JCXRhcmdldF9vYmplY3QtPnBhY2thZ2UuZWxlbWVudHMgPQotCQkgICAgQUNQSV9DQVNUX1BUUih1bmlvbiBhY3BpX29iamVjdCwgaW5mby0+ZnJlZV9zcGFjZSk7Ci0KLQkJLyoKLQkJICogUGFzcyB0aGUgbmV3IHBhY2thZ2Ugb2JqZWN0IGJhY2sgdG8gdGhlIHBhY2thZ2Ugd2FsayByb3V0aW5lCi0JCSAqLwotCQlzdGF0ZS0+cGtnLnRoaXNfdGFyZ2V0X29iaiA9IHRhcmdldF9vYmplY3Q7Ci0KLQkJLyoKLQkJICogU2F2ZSBzcGFjZSBmb3IgdGhlIGFycmF5IG9mIG9iamVjdHMgKFBhY2thZ2UgZWxlbWVudHMpCi0JCSAqIHVwZGF0ZSB0aGUgYnVmZmVyIGxlbmd0aCBjb3VudGVyCi0JCSAqLwotCQlvYmplY3Rfc3BhY2UgPSBBQ1BJX1JPVU5EX1VQX1RPX05BVElWRV9XT1JEKChhY3BpX3NpemUpCi0JCQkJCQkJICAgIHRhcmdldF9vYmplY3QtPgotCQkJCQkJCSAgICBwYWNrYWdlLmNvdW50ICoKLQkJCQkJCQkgICAgc2l6ZW9mKHVuaW9uCi0JCQkJCQkJCSAgIGFjcGlfb2JqZWN0KSk7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJcmV0dXJuIChBRV9CQURfUEFSQU1FVEVSKTsKLQl9Ci0KLQlpbmZvLT5mcmVlX3NwYWNlICs9IG9iamVjdF9zcGFjZTsKLQlpbmZvLT5sZW5ndGggKz0gb2JqZWN0X3NwYWNlOwotCXJldHVybiAoc3RhdHVzKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV91dF9jb3B5X2lwYWNrYWdlX3RvX2VwYWNrYWdlCi0gKgotICogUEFSQU1FVEVSUzogIGludGVybmFsX29iamVjdCAgICAgLSBQb2ludGVyIHRvIHRoZSBvYmplY3Qgd2UgYXJlIHJldHVybmluZwotICogICAgICAgICAgICAgIEJ1ZmZlciAgICAgICAgICAgICAgLSBXaGVyZSB0aGUgb2JqZWN0IGlzIHJldHVybmVkCi0gKiAgICAgICAgICAgICAgc3BhY2VfdXNlZCAgICAgICAgICAtIFdoZXJlIHRoZSBvYmplY3QgbGVuZ3RoIGlzIHJldHVybmVkCi0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cwotICoKLSAqIERFU0NSSVBUSU9OOiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBwbGFjZSBhIHBhY2thZ2Ugb2JqZWN0IGluIGEgdXNlcgotICogICAgICAgICAgICAgIGJ1ZmZlci4gIEEgcGFja2FnZSBvYmplY3QgYnkgZGVmaW5pdGlvbiBjb250YWlucyBvdGhlciBvYmplY3RzLgotICoKLSAqICAgICAgICAgICAgICBUaGUgYnVmZmVyIGlzIGFzc3VtZWQgdG8gaGF2ZSBzdWZmaWNpZW50IHNwYWNlIGZvciB0aGUgb2JqZWN0LgotICogICAgICAgICAgICAgIFRoZSBjYWxsZXIgbXVzdCBoYXZlIHZlcmlmaWVkIHRoZSBidWZmZXIgbGVuZ3RoIG5lZWRlZCB1c2luZyB0aGUKLSAqICAgICAgICAgICAgICBhY3BpX3V0X2dldF9vYmplY3Rfc2l6ZSBmdW5jdGlvbiBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyBhY3BpX3N0YXR1cwotYWNwaV91dF9jb3B5X2lwYWNrYWdlX3RvX2VwYWNrYWdlKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKmludGVybmFsX29iamVjdCwKLQkJCQkgIHU4ICogYnVmZmVyLCBhY3BpX3NpemUgKiBzcGFjZV91c2VkKQotewotCXVuaW9uIGFjcGlfb2JqZWN0ICpleHRlcm5hbF9vYmplY3Q7Ci0JYWNwaV9zdGF0dXMgc3RhdHVzOwotCXN0cnVjdCBhY3BpX3BrZ19pbmZvIGluZm87Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKHV0X2NvcHlfaXBhY2thZ2VfdG9fZXBhY2thZ2UpOwotCi0JLyoKLQkgKiBGaXJzdCBwYWNrYWdlIGF0IGhlYWQgb2YgdGhlIGJ1ZmZlcgotCSAqLwotCWV4dGVybmFsX29iamVjdCA9IEFDUElfQ0FTVF9QVFIodW5pb24gYWNwaV9vYmplY3QsIGJ1ZmZlcik7Ci0KLQkvKgotCSAqIEZyZWUgc3BhY2UgYmVnaW5zIHJpZ2h0IGFmdGVyIHRoZSBmaXJzdCBwYWNrYWdlCi0JICovCi0JaW5mby5sZW5ndGggPSBBQ1BJX1JPVU5EX1VQX1RPX05BVElWRV9XT1JEKHNpemVvZih1bmlvbiBhY3BpX29iamVjdCkpOwotCWluZm8uZnJlZV9zcGFjZSA9Ci0JICAgIGJ1ZmZlciArIEFDUElfUk9VTkRfVVBfVE9fTkFUSVZFX1dPUkQoc2l6ZW9mKHVuaW9uIGFjcGlfb2JqZWN0KSk7Ci0JaW5mby5vYmplY3Rfc3BhY2UgPSAwOwotCWluZm8ubnVtX3BhY2thZ2VzID0gMTsKLQotCWV4dGVybmFsX29iamVjdC0+dHlwZSA9IEFDUElfR0VUX09CSkVDVF9UWVBFKGludGVybmFsX29iamVjdCk7Ci0JZXh0ZXJuYWxfb2JqZWN0LT5wYWNrYWdlLmNvdW50ID0gaW50ZXJuYWxfb2JqZWN0LT5wYWNrYWdlLmNvdW50OwotCWV4dGVybmFsX29iamVjdC0+cGFja2FnZS5lbGVtZW50cyA9IEFDUElfQ0FTVF9QVFIodW5pb24gYWNwaV9vYmplY3QsCi0JCQkJCQkJICBpbmZvLmZyZWVfc3BhY2UpOwotCi0JLyoKLQkgKiBMZWF2ZSByb29tIGZvciBhbiBhcnJheSBvZiBBQ1BJX09CSkVDVFMgaW4gdGhlIGJ1ZmZlcgotCSAqIGFuZCBtb3ZlIHRoZSBmcmVlIHNwYWNlIHBhc3QgaXQKLQkgKi8KLQlpbmZvLmxlbmd0aCArPSAoYWNwaV9zaXplKSBleHRlcm5hbF9vYmplY3QtPnBhY2thZ2UuY291bnQgKgotCSAgICBBQ1BJX1JPVU5EX1VQX1RPX05BVElWRV9XT1JEKHNpemVvZih1bmlvbiBhY3BpX29iamVjdCkpOwotCWluZm8uZnJlZV9zcGFjZSArPSBleHRlcm5hbF9vYmplY3QtPnBhY2thZ2UuY291bnQgKgotCSAgICBBQ1BJX1JPVU5EX1VQX1RPX05BVElWRV9XT1JEKHNpemVvZih1bmlvbiBhY3BpX29iamVjdCkpOwotCi0Jc3RhdHVzID0gYWNwaV91dF93YWxrX3BhY2thZ2VfdHJlZShpbnRlcm5hbF9vYmplY3QsIGV4dGVybmFsX29iamVjdCwKLQkJCQkJICAgYWNwaV91dF9jb3B5X2llbGVtZW50X3RvX2VlbGVtZW50LAotCQkJCQkgICAmaW5mbyk7Ci0KLQkqc3BhY2VfdXNlZCA9IGluZm8ubGVuZ3RoOwotCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X2NvcHlfaW9iamVjdF90b19lb2JqZWN0Ci0gKgotICogUEFSQU1FVEVSUzogIGludGVybmFsX29iamVjdCAgICAgLSBUaGUgaW50ZXJuYWwgb2JqZWN0IHRvIGJlIGNvbnZlcnRlZAotICogICAgICAgICAgICAgIGJ1ZmZlcl9wdHIgICAgICAgICAgLSBXaGVyZSB0aGUgb2JqZWN0IGlzIHJldHVybmVkCi0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cwotICoKLSAqIERFU0NSSVBUSU9OOiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBidWlsZCBhbiBBUEkgb2JqZWN0IHRvIGJlIHJldHVybmVkIHRvCi0gKiAgICAgICAgICAgICAgdGhlIGNhbGxlci4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1hY3BpX3N0YXR1cwotYWNwaV91dF9jb3B5X2lvYmplY3RfdG9fZW9iamVjdCh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICppbnRlcm5hbF9vYmplY3QsCi0JCQkJc3RydWN0IGFjcGlfYnVmZmVyICpyZXRfYnVmZmVyKQotewotCWFjcGlfc3RhdHVzIHN0YXR1czsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UodXRfY29weV9pb2JqZWN0X3RvX2VvYmplY3QpOwotCi0JaWYgKEFDUElfR0VUX09CSkVDVF9UWVBFKGludGVybmFsX29iamVjdCkgPT0gQUNQSV9UWVBFX1BBQ0tBR0UpIHsKLQkJLyoKLQkJICogUGFja2FnZSBvYmplY3Q6ICBDb3B5IGFsbCBzdWJvYmplY3RzIChpbmNsdWRpbmcKLQkJICogbmVzdGVkIHBhY2thZ2VzKQotCQkgKi8KLQkJc3RhdHVzID0gYWNwaV91dF9jb3B5X2lwYWNrYWdlX3RvX2VwYWNrYWdlKGludGVybmFsX29iamVjdCwKLQkJCQkJCQkgICByZXRfYnVmZmVyLT5wb2ludGVyLAotCQkJCQkJCSAgICZyZXRfYnVmZmVyLT5sZW5ndGgpOwotCX0gZWxzZSB7Ci0JCS8qCi0JCSAqIEJ1aWxkIGEgc2ltcGxlIG9iamVjdCAobm8gbmVzdGVkIG9iamVjdHMpCi0JCSAqLwotCQlzdGF0dXMgPSBhY3BpX3V0X2NvcHlfaXNpbXBsZV90b19lc2ltcGxlKGludGVybmFsX29iamVjdCwKLQkJCQkJCQkgQUNQSV9DQVNUX1BUUih1bmlvbgotCQkJCQkJCQkgICAgICAgYWNwaV9vYmplY3QsCi0JCQkJCQkJCSAgICAgICByZXRfYnVmZmVyLT4KLQkJCQkJCQkJICAgICAgIHBvaW50ZXIpLAotCQkJCQkJCSBBQ1BJX0FERF9QVFIodTgsCi0JCQkJCQkJCSAgICAgIHJldF9idWZmZXItPgotCQkJCQkJCQkgICAgICBwb2ludGVyLAotCQkJCQkJCQkgICAgICBBQ1BJX1JPVU5EX1VQX1RPX05BVElWRV9XT1JECi0JCQkJCQkJCSAgICAgIChzaXplb2YKLQkJCQkJCQkJICAgICAgICh1bmlvbgotCQkJCQkJCQkJYWNwaV9vYmplY3QpKSksCi0JCQkJCQkJICZyZXRfYnVmZmVyLT5sZW5ndGgpOwotCQkvKgotCQkgKiBidWlsZCBzaW1wbGUgZG9lcyBub3QgaW5jbHVkZSB0aGUgb2JqZWN0IHNpemUgaW4gdGhlIGxlbmd0aAotCQkgKiBzbyB3ZSBhZGQgaXQgaW4gaGVyZQotCQkgKi8KLQkJcmV0X2J1ZmZlci0+bGVuZ3RoICs9IHNpemVvZih1bmlvbiBhY3BpX29iamVjdCk7Ci0JfQotCi0JcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfdXRfY29weV9lc2ltcGxlX3RvX2lzaW1wbGUKLSAqCi0gKiBQQVJBTUVURVJTOiAgZXh0ZXJuYWxfb2JqZWN0ICAgICAtIFRoZSBleHRlcm5hbCBvYmplY3QgdG8gYmUgY29udmVydGVkCi0gKiAgICAgICAgICAgICAgcmV0X2ludGVybmFsX29iamVjdCAtIFdoZXJlIHRoZSBpbnRlcm5hbCBvYmplY3QgaXMgcmV0dXJuZWQKLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IFRoaXMgZnVuY3Rpb24gY29waWVzIGFuIGV4dGVybmFsIG9iamVjdCB0byBhbiBpbnRlcm5hbCBvbmUuCi0gKiAgICAgICAgICAgICAgTk9URTogUG9pbnRlcnMgY2FuIGJlIGNvcGllZCwgd2UgZG9uJ3QgbmVlZCB0byBjb3B5IGRhdGEuCi0gKiAgICAgICAgICAgICAgKFRoZSBwb2ludGVycyBoYXZlIHRvIGJlIHZhbGlkIGluIG91ciBhZGRyZXNzIHNwYWNlIG5vIG1hdHRlcgotICogICAgICAgICAgICAgIHdoYXQgd2UgZG8gd2l0aCB0aGVtISkKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgYWNwaV9zdGF0dXMKLWFjcGlfdXRfY29weV9lc2ltcGxlX3RvX2lzaW1wbGUodW5pb24gYWNwaV9vYmplY3QgKmV4dGVybmFsX29iamVjdCwKLQkJCQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICoqcmV0X2ludGVybmFsX29iamVjdCkKLXsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICppbnRlcm5hbF9vYmplY3Q7Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKHV0X2NvcHlfZXNpbXBsZV90b19pc2ltcGxlKTsKLQotCS8qCi0JICogU2ltcGxlIHR5cGVzIHN1cHBvcnRlZCBhcmU6IFN0cmluZywgQnVmZmVyLCBJbnRlZ2VyCi0JICovCi0Jc3dpdGNoIChleHRlcm5hbF9vYmplY3QtPnR5cGUpIHsKLQljYXNlIEFDUElfVFlQRV9TVFJJTkc6Ci0JY2FzZSBBQ1BJX1RZUEVfQlVGRkVSOgotCWNhc2UgQUNQSV9UWVBFX0lOVEVHRVI6Ci0JY2FzZSBBQ1BJX1RZUEVfTE9DQUxfUkVGRVJFTkNFOgotCi0JCWludGVybmFsX29iamVjdCA9IGFjcGlfdXRfY3JlYXRlX2ludGVybmFsX29iamVjdCgodTgpCi0JCQkJCQkJCSBleHRlcm5hbF9vYmplY3QtPgotCQkJCQkJCQkgdHlwZSk7Ci0JCWlmICghaW50ZXJuYWxfb2JqZWN0KSB7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9fTUVNT1JZKTsKLQkJfQotCQlicmVhazsKLQotCWNhc2UgQUNQSV9UWVBFX0FOWToJLyogVGhpcyBpcyB0aGUgY2FzZSBmb3IgYSBOVUxMIG9iamVjdCAqLwotCi0JCSpyZXRfaW50ZXJuYWxfb2JqZWN0ID0gTlVMTDsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKLQotCWRlZmF1bHQ6Ci0JCS8qIEFsbCBvdGhlciB0eXBlcyBhcmUgbm90IHN1cHBvcnRlZCAqLwotCi0JCUFDUElfRVJST1IoKEFFX0lORk8sCi0JCQkgICAgIlVuc3VwcG9ydGVkIG9iamVjdCB0eXBlLCBjYW5ub3QgY29udmVydCB0byBpbnRlcm5hbCBvYmplY3Q6ICVzIiwKLQkJCSAgICBhY3BpX3V0X2dldF90eXBlX25hbWUoZXh0ZXJuYWxfb2JqZWN0LT50eXBlKSkpOwotCi0JCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9TVVBQT1JUKTsKLQl9Ci0KLQkvKiBNdXN0IENPUFkgc3RyaW5nIGFuZCBidWZmZXIgY29udGVudHMgKi8KLQotCXN3aXRjaCAoZXh0ZXJuYWxfb2JqZWN0LT50eXBlKSB7Ci0JY2FzZSBBQ1BJX1RZUEVfU1RSSU5HOgotCi0JCWludGVybmFsX29iamVjdC0+c3RyaW5nLnBvaW50ZXIgPQotCQkgICAgQUNQSV9BTExPQ0FURV9aRVJPRUQoKGFjcGlfc2l6ZSkgZXh0ZXJuYWxfb2JqZWN0LT5zdHJpbmcuCi0JCQkJCSBsZW5ndGggKyAxKTsKLQkJaWYgKCFpbnRlcm5hbF9vYmplY3QtPnN0cmluZy5wb2ludGVyKSB7Ci0JCQlnb3RvIGVycm9yX2V4aXQ7Ci0JCX0KLQotCQlBQ1BJX01FTUNQWShpbnRlcm5hbF9vYmplY3QtPnN0cmluZy5wb2ludGVyLAotCQkJICAgIGV4dGVybmFsX29iamVjdC0+c3RyaW5nLnBvaW50ZXIsCi0JCQkgICAgZXh0ZXJuYWxfb2JqZWN0LT5zdHJpbmcubGVuZ3RoKTsKLQotCQlpbnRlcm5hbF9vYmplY3QtPnN0cmluZy5sZW5ndGggPSBleHRlcm5hbF9vYmplY3QtPnN0cmluZy5sZW5ndGg7Ci0JCWJyZWFrOwotCi0JY2FzZSBBQ1BJX1RZUEVfQlVGRkVSOgotCi0JCWludGVybmFsX29iamVjdC0+YnVmZmVyLnBvaW50ZXIgPQotCQkgICAgQUNQSV9BTExPQ0FURV9aRVJPRUQoZXh0ZXJuYWxfb2JqZWN0LT5idWZmZXIubGVuZ3RoKTsKLQkJaWYgKCFpbnRlcm5hbF9vYmplY3QtPmJ1ZmZlci5wb2ludGVyKSB7Ci0JCQlnb3RvIGVycm9yX2V4aXQ7Ci0JCX0KLQotCQlBQ1BJX01FTUNQWShpbnRlcm5hbF9vYmplY3QtPmJ1ZmZlci5wb2ludGVyLAotCQkJICAgIGV4dGVybmFsX29iamVjdC0+YnVmZmVyLnBvaW50ZXIsCi0JCQkgICAgZXh0ZXJuYWxfb2JqZWN0LT5idWZmZXIubGVuZ3RoKTsKLQotCQlpbnRlcm5hbF9vYmplY3QtPmJ1ZmZlci5sZW5ndGggPSBleHRlcm5hbF9vYmplY3QtPmJ1ZmZlci5sZW5ndGg7Ci0KLQkJLyogTWFyayBidWZmZXIgZGF0YSB2YWxpZCAqLwotCi0JCWludGVybmFsX29iamVjdC0+YnVmZmVyLmZsYWdzIHw9IEFPUE9CSl9EQVRBX1ZBTElEOwotCQlicmVhazsKLQotCWNhc2UgQUNQSV9UWVBFX0lOVEVHRVI6Ci0KLQkJaW50ZXJuYWxfb2JqZWN0LT5pbnRlZ2VyLnZhbHVlID0gZXh0ZXJuYWxfb2JqZWN0LT5pbnRlZ2VyLnZhbHVlOwotCQlicmVhazsKLQotCWNhc2UgQUNQSV9UWVBFX0xPQ0FMX1JFRkVSRU5DRToKLQotCQkvKiBUQkQ6IHNob3VsZCB2YWxpZGF0ZSBpbmNvbWluZyBoYW5kbGUgKi8KLQotCQlpbnRlcm5hbF9vYmplY3QtPnJlZmVyZW5jZS5jbGFzcyA9IEFDUElfUkVGQ0xBU1NfTkFNRTsKLQkJaW50ZXJuYWxfb2JqZWN0LT5yZWZlcmVuY2Uubm9kZSA9Ci0JCSAgICBleHRlcm5hbF9vYmplY3QtPnJlZmVyZW5jZS5oYW5kbGU7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJLyogT3RoZXIgdHlwZXMgY2FuJ3QgZ2V0IGhlcmUgKi8KLQkJYnJlYWs7Ci0JfQotCi0JKnJldF9pbnRlcm5hbF9vYmplY3QgPSBpbnRlcm5hbF9vYmplY3Q7Ci0JcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKLQotICAgICAgZXJyb3JfZXhpdDoKLQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UoaW50ZXJuYWxfb2JqZWN0KTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9fTUVNT1JZKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV91dF9jb3B5X2VwYWNrYWdlX3RvX2lwYWNrYWdlCi0gKgotICogUEFSQU1FVEVSUzogIGV4dGVybmFsX29iamVjdCAgICAgLSBUaGUgZXh0ZXJuYWwgb2JqZWN0IHRvIGJlIGNvbnZlcnRlZAotICogICAgICAgICAgICAgIGludGVybmFsX29iamVjdCAgICAgLSBXaGVyZSB0aGUgaW50ZXJuYWwgb2JqZWN0IGlzIHJldHVybmVkCi0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cwotICoKLSAqIERFU0NSSVBUSU9OOiBDb3B5IGFuIGV4dGVybmFsIHBhY2thZ2Ugb2JqZWN0IHRvIGFuIGludGVybmFsIHBhY2thZ2UuCi0gKiAgICAgICAgICAgICAgSGFuZGxlcyBuZXN0ZWQgcGFja2FnZXMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIGFjcGlfc3RhdHVzCi1hY3BpX3V0X2NvcHlfZXBhY2thZ2VfdG9faXBhY2thZ2UodW5pb24gYWNwaV9vYmplY3QgKmV4dGVybmFsX29iamVjdCwKLQkJCQkgIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKippbnRlcm5hbF9vYmplY3QpCi17Ci0JYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqcGFja2FnZV9vYmplY3Q7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKnBhY2thZ2VfZWxlbWVudHM7Ci0JdTMyIGk7Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKHV0X2NvcHlfZXBhY2thZ2VfdG9faXBhY2thZ2UpOwotCi0JLyogQ3JlYXRlIHRoZSBwYWNrYWdlIG9iamVjdCAqLwotCi0JcGFja2FnZV9vYmplY3QgPQotCSAgICBhY3BpX3V0X2NyZWF0ZV9wYWNrYWdlX29iamVjdChleHRlcm5hbF9vYmplY3QtPnBhY2thZ2UuY291bnQpOwotCWlmICghcGFja2FnZV9vYmplY3QpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX01FTU9SWSk7Ci0JfQotCi0JcGFja2FnZV9lbGVtZW50cyA9IHBhY2thZ2Vfb2JqZWN0LT5wYWNrYWdlLmVsZW1lbnRzOwotCi0JLyoKLQkgKiBSZWN1cnNpdmUgaW1wbGVtZW50YXRpb24uIFByb2JhYmx5IG9rLCBzaW5jZSBuZXN0ZWQgZXh0ZXJuYWwgcGFja2FnZXMKLQkgKiBhcyBwYXJhbWV0ZXJzIHNob3VsZCBiZSB2ZXJ5IHJhcmUuCi0JICovCi0JZm9yIChpID0gMDsgaSA8IGV4dGVybmFsX29iamVjdC0+cGFja2FnZS5jb3VudDsgaSsrKSB7Ci0JCXN0YXR1cyA9Ci0JCSAgICBhY3BpX3V0X2NvcHlfZW9iamVjdF90b19pb2JqZWN0KCZleHRlcm5hbF9vYmplY3QtPnBhY2thZ2UuCi0JCQkJCQkgICAgZWxlbWVudHNbaV0sCi0JCQkJCQkgICAgJnBhY2thZ2VfZWxlbWVudHNbaV0pOwotCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQotCQkJLyogVHJ1bmNhdGUgcGFja2FnZSBhbmQgZGVsZXRlIGl0ICovCi0KLQkJCXBhY2thZ2Vfb2JqZWN0LT5wYWNrYWdlLmNvdW50ID0gaTsKLQkJCXBhY2thZ2VfZWxlbWVudHNbaV0gPSBOVUxMOwotCQkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKHBhY2thZ2Vfb2JqZWN0KTsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotCQl9Ci0JfQotCi0JLyogTWFyayBwYWNrYWdlIGRhdGEgdmFsaWQgKi8KLQotCXBhY2thZ2Vfb2JqZWN0LT5wYWNrYWdlLmZsYWdzIHw9IEFPUE9CSl9EQVRBX1ZBTElEOwotCi0JKmludGVybmFsX29iamVjdCA9IHBhY2thZ2Vfb2JqZWN0OwotCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X2NvcHlfZW9iamVjdF90b19pb2JqZWN0Ci0gKgotICogUEFSQU1FVEVSUzogIGV4dGVybmFsX29iamVjdCAgICAgLSBUaGUgZXh0ZXJuYWwgb2JqZWN0IHRvIGJlIGNvbnZlcnRlZAotICogICAgICAgICAgICAgIGludGVybmFsX29iamVjdCAgICAgLSBXaGVyZSB0aGUgaW50ZXJuYWwgb2JqZWN0IGlzIHJldHVybmVkCi0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cyAgICAgICAgICAgICAgLSB0aGUgc3RhdHVzIG9mIHRoZSBjYWxsCi0gKgotICogREVTQ1JJUFRJT046IENvbnZlcnRzIGFuIGV4dGVybmFsIG9iamVjdCB0byBhbiBpbnRlcm5hbCBvYmplY3QuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotYWNwaV9zdGF0dXMKLWFjcGlfdXRfY29weV9lb2JqZWN0X3RvX2lvYmplY3QodW5pb24gYWNwaV9vYmplY3QgKmV4dGVybmFsX29iamVjdCwKLQkJCQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICoqaW50ZXJuYWxfb2JqZWN0KQotewotCWFjcGlfc3RhdHVzIHN0YXR1czsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UodXRfY29weV9lb2JqZWN0X3RvX2lvYmplY3QpOwotCi0JaWYgKGV4dGVybmFsX29iamVjdC0+dHlwZSA9PSBBQ1BJX1RZUEVfUEFDS0FHRSkgewotCQlzdGF0dXMgPQotCQkgICAgYWNwaV91dF9jb3B5X2VwYWNrYWdlX3RvX2lwYWNrYWdlKGV4dGVybmFsX29iamVjdCwKLQkJCQkJCSAgICAgIGludGVybmFsX29iamVjdCk7Ci0JfSBlbHNlIHsKLQkJLyoKLQkJICogQnVpbGQgYSBzaW1wbGUgb2JqZWN0IChubyBuZXN0ZWQgb2JqZWN0cykKLQkJICovCi0JCXN0YXR1cyA9Ci0JCSAgICBhY3BpX3V0X2NvcHlfZXNpbXBsZV90b19pc2ltcGxlKGV4dGVybmFsX29iamVjdCwKLQkJCQkJCSAgICBpbnRlcm5hbF9vYmplY3QpOwotCX0KLQotCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X2NvcHlfc2ltcGxlX29iamVjdAotICoKLSAqIFBBUkFNRVRFUlM6ICBzb3VyY2VfZGVzYyAgICAgICAgIC0gVGhlIGludGVybmFsIG9iamVjdCB0byBiZSBjb3BpZWQKLSAqICAgICAgICAgICAgICBkZXN0X2Rlc2MgICAgICAgICAgIC0gTmV3IHRhcmdldCBvYmplY3QKLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IFNpbXBsZSBjb3B5IG9mIG9uZSBpbnRlcm5hbCBvYmplY3QgdG8gYW5vdGhlci4gIFJlZmVyZW5jZSBjb3VudAotICogICAgICAgICAgICAgIG9mIHRoZSBkZXN0aW5hdGlvbiBvYmplY3QgaXMgcHJlc2VydmVkLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyBhY3BpX3N0YXR1cwotYWNwaV91dF9jb3B5X3NpbXBsZV9vYmplY3QodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqc291cmNlX2Rlc2MsCi0JCQkgICB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpkZXN0X2Rlc2MpCi17Ci0JdTE2IHJlZmVyZW5jZV9jb3VudDsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpuZXh0X29iamVjdDsKLQotCS8qIFNhdmUgZmllbGRzIGZyb20gZGVzdGluYXRpb24gdGhhdCB3ZSBkb24ndCB3YW50IHRvIG92ZXJ3cml0ZSAqLwotCi0JcmVmZXJlbmNlX2NvdW50ID0gZGVzdF9kZXNjLT5jb21tb24ucmVmZXJlbmNlX2NvdW50OwotCW5leHRfb2JqZWN0ID0gZGVzdF9kZXNjLT5jb21tb24ubmV4dF9vYmplY3Q7Ci0KLQkvKiBDb3B5IHRoZSBlbnRpcmUgc291cmNlIG9iamVjdCBvdmVyIHRoZSBkZXN0aW5hdGlvbiBvYmplY3QgKi8KLQotCUFDUElfTUVNQ1BZKChjaGFyICopZGVzdF9kZXNjLCAoY2hhciAqKXNvdXJjZV9kZXNjLAotCQkgICAgc2l6ZW9mKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QpKTsKLQotCS8qIFJlc3RvcmUgdGhlIHNhdmVkIGZpZWxkcyAqLwotCi0JZGVzdF9kZXNjLT5jb21tb24ucmVmZXJlbmNlX2NvdW50ID0gcmVmZXJlbmNlX2NvdW50OwotCWRlc3RfZGVzYy0+Y29tbW9uLm5leHRfb2JqZWN0ID0gbmV4dF9vYmplY3Q7Ci0KLQkvKiBOZXcgb2JqZWN0IGlzIG5vdCBzdGF0aWMsIHJlZ2FyZGxlc3Mgb2Ygc291cmNlICovCi0KLQlkZXN0X2Rlc2MtPmNvbW1vbi5mbGFncyAmPSB+QU9QT0JKX1NUQVRJQ19QT0lOVEVSOwotCi0JLyogSGFuZGxlIHRoZSBvYmplY3RzIHdpdGggZXh0cmEgZGF0YSAqLwotCi0Jc3dpdGNoIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRShkZXN0X2Rlc2MpKSB7Ci0JY2FzZSBBQ1BJX1RZUEVfQlVGRkVSOgotCQkvKgotCQkgKiBBbGxvY2F0ZSBhbmQgY29weSB0aGUgYWN0dWFsIGJ1ZmZlciBpZiBhbmQgb25seSBpZjoKLQkJICogMSkgVGhlcmUgaXMgYSB2YWxpZCBidWZmZXIgcG9pbnRlcgotCQkgKiAyKSBUaGUgYnVmZmVyIGhhcyBhIGxlbmd0aCA+IDAKLQkJICovCi0JCWlmICgoc291cmNlX2Rlc2MtPmJ1ZmZlci5wb2ludGVyKSAmJgotCQkgICAgKHNvdXJjZV9kZXNjLT5idWZmZXIubGVuZ3RoKSkgewotCQkJZGVzdF9kZXNjLT5idWZmZXIucG9pbnRlciA9Ci0JCQkgICAgQUNQSV9BTExPQ0FURShzb3VyY2VfZGVzYy0+YnVmZmVyLmxlbmd0aCk7Ci0JCQlpZiAoIWRlc3RfZGVzYy0+YnVmZmVyLnBvaW50ZXIpIHsKLQkJCQlyZXR1cm4gKEFFX05PX01FTU9SWSk7Ci0JCQl9Ci0KLQkJCS8qIENvcHkgdGhlIGFjdHVhbCBidWZmZXIgZGF0YSAqLwotCi0JCQlBQ1BJX01FTUNQWShkZXN0X2Rlc2MtPmJ1ZmZlci5wb2ludGVyLAotCQkJCSAgICBzb3VyY2VfZGVzYy0+YnVmZmVyLnBvaW50ZXIsCi0JCQkJICAgIHNvdXJjZV9kZXNjLT5idWZmZXIubGVuZ3RoKTsKLQkJfQotCQlicmVhazsKLQotCWNhc2UgQUNQSV9UWVBFX1NUUklORzoKLQkJLyoKLQkJICogQWxsb2NhdGUgYW5kIGNvcHkgdGhlIGFjdHVhbCBzdHJpbmcgaWYgYW5kIG9ubHkgaWY6Ci0JCSAqIDEpIFRoZXJlIGlzIGEgdmFsaWQgc3RyaW5nIHBvaW50ZXIKLQkJICogKFBvaW50ZXIgdG8gYSBOVUxMIHN0cmluZyBpcyBhbGxvd2VkKQotCQkgKi8KLQkJaWYgKHNvdXJjZV9kZXNjLT5zdHJpbmcucG9pbnRlcikgewotCQkJZGVzdF9kZXNjLT5zdHJpbmcucG9pbnRlciA9Ci0JCQkgICAgQUNQSV9BTExPQ0FURSgoYWNwaV9zaXplKSBzb3VyY2VfZGVzYy0+c3RyaW5nLgotCQkJCQkgIGxlbmd0aCArIDEpOwotCQkJaWYgKCFkZXN0X2Rlc2MtPnN0cmluZy5wb2ludGVyKSB7Ci0JCQkJcmV0dXJuIChBRV9OT19NRU1PUlkpOwotCQkJfQotCi0JCQkvKiBDb3B5IHRoZSBhY3R1YWwgc3RyaW5nIGRhdGEgKi8KLQotCQkJQUNQSV9NRU1DUFkoZGVzdF9kZXNjLT5zdHJpbmcucG9pbnRlciwKLQkJCQkgICAgc291cmNlX2Rlc2MtPnN0cmluZy5wb2ludGVyLAotCQkJCSAgICAoYWNwaV9zaXplKSBzb3VyY2VfZGVzYy0+c3RyaW5nLmxlbmd0aCArIDEpOwotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBBQ1BJX1RZUEVfTE9DQUxfUkVGRVJFTkNFOgotCQkvKgotCQkgKiBXZSBjb3BpZWQgdGhlIHJlZmVyZW5jZSBvYmplY3QsIHNvIHdlIG5vdyBtdXN0IGFkZCBhIHJlZmVyZW5jZQotCQkgKiB0byB0aGUgb2JqZWN0IHBvaW50ZWQgdG8gYnkgdGhlIHJlZmVyZW5jZQotCQkgKgotCQkgKiBEREJIYW5kbGUgcmVmZXJlbmNlIChmcm9tIExvYWQvbG9hZF90YWJsZSkgaXMgYSBzcGVjaWFsIHJlZmVyZW5jZSwKLQkJICogaXQgZG9lcyBub3QgaGF2ZSBhIFJlZmVyZW5jZS5PYmplY3QsIHNvIGRvZXMgbm90IG5lZWQgdG8KLQkJICogaW5jcmVhc2UgdGhlIHJlZmVyZW5jZSBjb3VudAotCQkgKi8KLQkJaWYgKHNvdXJjZV9kZXNjLT5yZWZlcmVuY2UuY2xhc3MgPT0gQUNQSV9SRUZDTEFTU19UQUJMRSkgewotCQkJYnJlYWs7Ci0JCX0KLQotCQlhY3BpX3V0X2FkZF9yZWZlcmVuY2Uoc291cmNlX2Rlc2MtPnJlZmVyZW5jZS5vYmplY3QpOwotCQlicmVhazsKLQotCWNhc2UgQUNQSV9UWVBFX1JFR0lPTjoKLQkJLyoKLQkJICogV2UgY29waWVkIHRoZSBSZWdpb24gSGFuZGxlciwgc28gd2Ugbm93IG11c3QgYWRkIGEgcmVmZXJlbmNlCi0JCSAqLwotCQlpZiAoZGVzdF9kZXNjLT5yZWdpb24uaGFuZGxlcikgewotCQkJYWNwaV91dF9hZGRfcmVmZXJlbmNlKGRlc3RfZGVzYy0+cmVnaW9uLmhhbmRsZXIpOwotCQl9Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJLyogTm90aGluZyB0byBkbyBmb3Igb3RoZXIgc2ltcGxlIG9iamVjdHMgKi8KLQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIChBRV9PSyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfdXRfY29weV9pZWxlbWVudF90b19pZWxlbWVudAotICoKLSAqIFBBUkFNRVRFUlM6ICBhY3BpX3BrZ19jYWxsYmFjawotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKLSAqCi0gKiBERVNDUklQVElPTjogQ29weSBvbmUgcGFja2FnZSBlbGVtZW50IHRvIGFub3RoZXIgcGFja2FnZSBlbGVtZW50Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIGFjcGlfc3RhdHVzCi1hY3BpX3V0X2NvcHlfaWVsZW1lbnRfdG9faWVsZW1lbnQodTggb2JqZWN0X3R5cGUsCi0JCQkJICB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpzb3VyY2Vfb2JqZWN0LAotCQkJCSAgdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICpzdGF0ZSwKLQkJCQkgIHZvaWQgKmNvbnRleHQpCi17Ci0JYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7Ci0JdTMyIHRoaXNfaW5kZXg7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKnRoaXNfdGFyZ2V0X3B0cjsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICp0YXJnZXRfb2JqZWN0OwotCi0JQUNQSV9GVU5DVElPTl9FTlRSWSgpOwotCi0JdGhpc19pbmRleCA9IHN0YXRlLT5wa2cuaW5kZXg7Ci0JdGhpc190YXJnZXRfcHRyID0gKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKiopCi0JICAgICZzdGF0ZS0+cGtnLmRlc3Rfb2JqZWN0LT5wYWNrYWdlLmVsZW1lbnRzW3RoaXNfaW5kZXhdOwotCi0Jc3dpdGNoIChvYmplY3RfdHlwZSkgewotCWNhc2UgQUNQSV9DT1BZX1RZUEVfU0lNUExFOgotCi0JCS8qIEEgbnVsbCBzb3VyY2Ugb2JqZWN0IGluZGljYXRlcyBhIChsZWdhbCkgbnVsbCBwYWNrYWdlIGVsZW1lbnQgKi8KLQotCQlpZiAoc291cmNlX29iamVjdCkgewotCQkJLyoKLQkJCSAqIFRoaXMgaXMgYSBzaW1wbGUgb2JqZWN0LCBqdXN0IGNvcHkgaXQKLQkJCSAqLwotCQkJdGFyZ2V0X29iamVjdCA9Ci0JCQkgICAgYWNwaV91dF9jcmVhdGVfaW50ZXJuYWxfb2JqZWN0KEFDUElfR0VUX09CSkVDVF9UWVBFCi0JCQkJCQkJICAgKHNvdXJjZV9vYmplY3QpKTsKLQkJCWlmICghdGFyZ2V0X29iamVjdCkgewotCQkJCXJldHVybiAoQUVfTk9fTUVNT1JZKTsKLQkJCX0KLQotCQkJc3RhdHVzID0KLQkJCSAgICBhY3BpX3V0X2NvcHlfc2ltcGxlX29iamVjdChzb3VyY2Vfb2JqZWN0LAotCQkJCQkJICAgICAgIHRhcmdldF9vYmplY3QpOwotCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCQkJZ290byBlcnJvcl9leGl0OwotCQkJfQotCi0JCQkqdGhpc190YXJnZXRfcHRyID0gdGFyZ2V0X29iamVjdDsKLQkJfSBlbHNlIHsKLQkJCS8qIFBhc3MgdGhyb3VnaCBhIG51bGwgZWxlbWVudCAqLwotCi0JCQkqdGhpc190YXJnZXRfcHRyID0gTlVMTDsKLQkJfQotCQlicmVhazsKLQotCWNhc2UgQUNQSV9DT1BZX1RZUEVfUEFDS0FHRToKLQotCQkvKgotCQkgKiBUaGlzIG9iamVjdCBpcyBhIHBhY2thZ2UgLSBnbyBkb3duIGFub3RoZXIgbmVzdGluZyBsZXZlbAotCQkgKiBDcmVhdGUgYW5kIGJ1aWxkIHRoZSBwYWNrYWdlIG9iamVjdAotCQkgKi8KLQkJdGFyZ2V0X29iamVjdCA9Ci0JCSAgICBhY3BpX3V0X2NyZWF0ZV9wYWNrYWdlX29iamVjdChzb3VyY2Vfb2JqZWN0LT5wYWNrYWdlLmNvdW50KTsKLQkJaWYgKCF0YXJnZXRfb2JqZWN0KSB7Ci0JCQlyZXR1cm4gKEFFX05PX01FTU9SWSk7Ci0JCX0KLQotCQl0YXJnZXRfb2JqZWN0LT5jb21tb24uZmxhZ3MgPSBzb3VyY2Vfb2JqZWN0LT5jb21tb24uZmxhZ3M7Ci0KLQkJLyogUGFzcyB0aGUgbmV3IHBhY2thZ2Ugb2JqZWN0IGJhY2sgdG8gdGhlIHBhY2thZ2Ugd2FsayByb3V0aW5lICovCi0KLQkJc3RhdGUtPnBrZy50aGlzX3RhcmdldF9vYmogPSB0YXJnZXRfb2JqZWN0OwotCi0JCS8qIFN0b3JlIHRoZSBvYmplY3QgcG9pbnRlciBpbiB0aGUgcGFyZW50IHBhY2thZ2Ugb2JqZWN0ICovCi0KLQkJKnRoaXNfdGFyZ2V0X3B0ciA9IHRhcmdldF9vYmplY3Q7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJcmV0dXJuIChBRV9CQURfUEFSQU1FVEVSKTsKLQl9Ci0KLQlyZXR1cm4gKHN0YXR1cyk7Ci0KLSAgICAgIGVycm9yX2V4aXQ6Ci0JYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKHRhcmdldF9vYmplY3QpOwotCXJldHVybiAoc3RhdHVzKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV91dF9jb3B5X2lwYWNrYWdlX3RvX2lwYWNrYWdlCi0gKgotICogUEFSQU1FVEVSUzogICpzb3VyY2Vfb2JqICAgICAtIFBvaW50ZXIgdG8gdGhlIHNvdXJjZSBwYWNrYWdlIG9iamVjdAotICogICAgICAgICAgICAgICpkZXN0X29iaiAgICAgICAtIFdoZXJlIHRoZSBpbnRlcm5hbCBvYmplY3QgaXMgcmV0dXJuZWQKLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzICAgICAgICAgIC0gdGhlIHN0YXR1cyBvZiB0aGUgY2FsbAotICoKLSAqIERFU0NSSVBUSU9OOiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBjb3B5IGFuIGludGVybmFsIHBhY2thZ2Ugb2JqZWN0Ci0gKiAgICAgICAgICAgICAgaW50byBhbm90aGVyIGludGVybmFsIHBhY2thZ2Ugb2JqZWN0LgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyBhY3BpX3N0YXR1cwotYWNwaV91dF9jb3B5X2lwYWNrYWdlX3RvX2lwYWNrYWdlKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnNvdXJjZV9vYmosCi0JCQkJICB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpkZXN0X29iaiwKLQkJCQkgIHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUpCi17Ci0JYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKHV0X2NvcHlfaXBhY2thZ2VfdG9faXBhY2thZ2UpOwotCi0JZGVzdF9vYmotPmNvbW1vbi50eXBlID0gQUNQSV9HRVRfT0JKRUNUX1RZUEUoc291cmNlX29iaik7Ci0JZGVzdF9vYmotPmNvbW1vbi5mbGFncyA9IHNvdXJjZV9vYmotPmNvbW1vbi5mbGFnczsKLQlkZXN0X29iai0+cGFja2FnZS5jb3VudCA9IHNvdXJjZV9vYmotPnBhY2thZ2UuY291bnQ7Ci0KLQkvKgotCSAqIENyZWF0ZSB0aGUgb2JqZWN0IGFycmF5IGFuZCB3YWxrIHRoZSBzb3VyY2UgcGFja2FnZSB0cmVlCi0JICovCi0JZGVzdF9vYmotPnBhY2thZ2UuZWxlbWVudHMgPSBBQ1BJX0FMTE9DQVRFX1pFUk9FRCgoKGFjcGlfc2l6ZSkKLQkJCQkJCQkgICBzb3VyY2Vfb2JqLT5wYWNrYWdlLgotCQkJCQkJCSAgIGNvdW50ICsKLQkJCQkJCQkgICAxKSAqIHNpemVvZih2b2lkICopKTsKLQlpZiAoIWRlc3Rfb2JqLT5wYWNrYWdlLmVsZW1lbnRzKSB7Ci0JCUFDUElfRVJST1IoKEFFX0lORk8sICJQYWNrYWdlIGFsbG9jYXRpb24gZmFpbHVyZSIpKTsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX01FTU9SWSk7Ci0JfQotCi0JLyoKLQkgKiBDb3B5IHRoZSBwYWNrYWdlIGVsZW1lbnQtYnktZWxlbWVudCBieSB3YWxraW5nIHRoZSBwYWNrYWdlICJ0cmVlIi4KLQkgKiBUaGlzIGhhbmRsZXMgbmVzdGVkIHBhY2thZ2VzIG9mIGFyYml0cmFyeSBkZXB0aC4KLQkgKi8KLQlzdGF0dXMgPSBhY3BpX3V0X3dhbGtfcGFja2FnZV90cmVlKHNvdXJjZV9vYmosIGRlc3Rfb2JqLAotCQkJCQkgICBhY3BpX3V0X2NvcHlfaWVsZW1lbnRfdG9faWVsZW1lbnQsCi0JCQkJCSAgIHdhbGtfc3RhdGUpOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCi0JCS8qIE9uIGZhaWx1cmUsIGRlbGV0ZSB0aGUgZGVzdGluYXRpb24gcGFja2FnZSBvYmplY3QgKi8KLQotCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UoZGVzdF9vYmopOwotCX0KLQotCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X2NvcHlfaW9iamVjdF90b19pb2JqZWN0Ci0gKgotICogUEFSQU1FVEVSUzogIHdhbGtfc3RhdGUgICAgICAgICAgLSBDdXJyZW50IHdhbGsgc3RhdGUKLSAqICAgICAgICAgICAgICBzb3VyY2VfZGVzYyAgICAgICAgIC0gVGhlIGludGVybmFsIG9iamVjdCB0byBiZSBjb3BpZWQKLSAqICAgICAgICAgICAgICBkZXN0X2Rlc2MgICAgICAgICAgIC0gV2hlcmUgdGhlIGNvcGllZCBvYmplY3QgaXMgcmV0dXJuZWQKLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IENvcHkgYW4gaW50ZXJuYWwgb2JqZWN0IHRvIGEgbmV3IGludGVybmFsIG9iamVjdAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWFjcGlfc3RhdHVzCi1hY3BpX3V0X2NvcHlfaW9iamVjdF90b19pb2JqZWN0KHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnNvdXJjZV9kZXNjLAotCQkJCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKipkZXN0X2Rlc2MsCi0JCQkJc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSkKLXsKLQlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UodXRfY29weV9pb2JqZWN0X3RvX2lvYmplY3QpOwotCi0JLyogQ3JlYXRlIHRoZSB0b3AgbGV2ZWwgb2JqZWN0ICovCi0KLQkqZGVzdF9kZXNjID0KLQkgICAgYWNwaV91dF9jcmVhdGVfaW50ZXJuYWxfb2JqZWN0KEFDUElfR0VUX09CSkVDVF9UWVBFKHNvdXJjZV9kZXNjKSk7Ci0JaWYgKCEqZGVzdF9kZXNjKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT19NRU1PUlkpOwotCX0KLQotCS8qIENvcHkgdGhlIG9iamVjdCBhbmQgcG9zc2libGUgc3Vib2JqZWN0cyAqLwotCi0JaWYgKEFDUElfR0VUX09CSkVDVF9UWVBFKHNvdXJjZV9kZXNjKSA9PSBBQ1BJX1RZUEVfUEFDS0FHRSkgewotCQlzdGF0dXMgPQotCQkgICAgYWNwaV91dF9jb3B5X2lwYWNrYWdlX3RvX2lwYWNrYWdlKHNvdXJjZV9kZXNjLCAqZGVzdF9kZXNjLAotCQkJCQkJICAgICAgd2Fsa19zdGF0ZSk7Ci0JfSBlbHNlIHsKLQkJc3RhdHVzID0gYWNwaV91dF9jb3B5X3NpbXBsZV9vYmplY3Qoc291cmNlX2Rlc2MsICpkZXN0X2Rlc2MpOwotCX0KLQotCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dGRlYnVnLmMgYi9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0ZGVidWcuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQ2NmVjYi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0ZGVidWcuYworKysgL2Rldi9udWxsCkBAIC0xLDY1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogTW9kdWxlIE5hbWU6IHV0ZGVidWcgLSBEZWJ1ZyBwcmludCByb3V0aW5lcwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDgsIEludGVsIENvcnAuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCi0gKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSBhdCBtaW5pbXVtIGEgZGlzY2xhaW1lcgotICogICAgc3Vic3RhbnRpYWxseSBzaW1pbGFyIHRvIHRoZSAiTk8gV0FSUkFOVFkiIGRpc2NsYWltZXIgYmVsb3cKLSAqICAgICgiRGlzY2xhaW1lciIpIGFuZCBhbnkgcmVkaXN0cmlidXRpb24gbXVzdCBiZSBjb25kaXRpb25lZCB1cG9uCi0gKiAgICBpbmNsdWRpbmcgYSBzdWJzdGFudGlhbGx5IHNpbWlsYXIgRGlzY2xhaW1lciByZXF1aXJlbWVudCBmb3IgZnVydGhlcgotICogICAgYmluYXJ5IHJlZGlzdHJpYnV0aW9uLgotICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzCi0gKiAgICBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIE5PIFdBUlJBTlRZCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKLSAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCi0gKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORwotICogSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCi0gKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCi0gKi8KLQotI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgotCi0jZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9VVElMSVRJRVMKLUFDUElfTU9EVUxFX05BTUUoInV0ZGVidWciKQotI2lmZGVmIEFDUElfREVCVUdfT1VUUFVUCi1zdGF0aWMgYWNwaV90aHJlYWRfaWQgYWNwaV9nYmxfcHJldl90aHJlYWRfaWQ7Ci1zdGF0aWMgY2hhciAqYWNwaV9nYmxfZm5fZW50cnlfc3RyID0gIi0tLS1FbnRyeSI7Ci1zdGF0aWMgY2hhciAqYWNwaV9nYmxfZm5fZXhpdF9zdHIgPSAiLS0tLUV4aXQtIjsKLQotLyogTG9jYWwgcHJvdG90eXBlcyAqLwotCi1zdGF0aWMgY29uc3QgY2hhciAqYWNwaV91dF90cmltX2Z1bmN0aW9uX25hbWUoY29uc3QgY2hhciAqZnVuY3Rpb25fbmFtZSk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfdXRfaW5pdF9zdGFja19wdHJfdHJhY2UKLSAqCi0gKiBQQVJBTUVURVJTOiAgTm9uZQotICoKLSAqIFJFVFVSTjogICAgICBOb25lCi0gKgotICogREVTQ1JJUFRJT046IFNhdmUgdGhlIGN1cnJlbnQgQ1BVIHN0YWNrIHBvaW50ZXIgYXQgc3Vic3lzdGVtIHN0YXJ0dXAKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi12b2lkIGFjcGlfdXRfaW5pdF9zdGFja19wdHJfdHJhY2Uodm9pZCkKLXsKLQlhY3BpX3NpemUgY3VycmVudF9zcDsKLQotCWFjcGlfZ2JsX2VudHJ5X3N0YWNrX3BvaW50ZXIgPSAmY3VycmVudF9zcDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV91dF90cmFja19zdGFja19wdHIKLSAqCi0gKiBQQVJBTUVURVJTOiAgTm9uZQotICoKLSAqIFJFVFVSTjogICAgICBOb25lCi0gKgotICogREVTQ1JJUFRJT046IFNhdmUgdGhlIGN1cnJlbnQgQ1BVIHN0YWNrIHBvaW50ZXIKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi12b2lkIGFjcGlfdXRfdHJhY2tfc3RhY2tfcHRyKHZvaWQpCi17Ci0JYWNwaV9zaXplIGN1cnJlbnRfc3A7Ci0KLQlpZiAoJmN1cnJlbnRfc3AgPCBhY3BpX2dibF9sb3dlc3Rfc3RhY2tfcG9pbnRlcikgewotCQlhY3BpX2dibF9sb3dlc3Rfc3RhY2tfcG9pbnRlciA9ICZjdXJyZW50X3NwOwotCX0KLQotCWlmIChhY3BpX2dibF9uZXN0aW5nX2xldmVsID4gYWNwaV9nYmxfZGVlcGVzdF9uZXN0aW5nKSB7Ci0JCWFjcGlfZ2JsX2RlZXBlc3RfbmVzdGluZyA9IGFjcGlfZ2JsX25lc3RpbmdfbGV2ZWw7Ci0JfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X3RyaW1fZnVuY3Rpb25fbmFtZQotICoKLSAqIFBBUkFNRVRFUlM6ICBmdW5jdGlvbl9uYW1lICAgICAgIC0gQXNjaWkgc3RyaW5nIGNvbnRhaW5pbmcgYSBwcm9jZWR1cmUgbmFtZQotICoKLSAqIFJFVFVSTjogICAgICBVcGRhdGVkIHBvaW50ZXIgdG8gdGhlIGZ1bmN0aW9uIG5hbWUKLSAqCi0gKiBERVNDUklQVElPTjogUmVtb3ZlIHRoZSAiQWNwaSIgcHJlZml4IGZyb20gdGhlIGZ1bmN0aW9uIG5hbWUsIGlmIHByZXNlbnQuCi0gKiAgICAgICAgICAgICAgVGhpcyBhbGxvd3MgY29tcGlsZXIgbWFjcm9zIHN1Y2ggYXMgX19mdW5jX18gdG8gYmUgdXNlZAotICogICAgICAgICAgICAgIHdpdGggbm8gY2hhbmdlIHRvIHRoZSBkZWJ1ZyBvdXRwdXQuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIGNvbnN0IGNoYXIgKmFjcGlfdXRfdHJpbV9mdW5jdGlvbl9uYW1lKGNvbnN0IGNoYXIgKmZ1bmN0aW9uX25hbWUpCi17Ci0KLQkvKiBBbGwgRnVuY3Rpb24gbmFtZXMgYXJlIGxvbmdlciB0aGFuIDQgY2hhcnMsIGNoZWNrIGlzIHNhZmUgKi8KLQotCWlmICgqKEFDUElfQ0FTVF9QVFIodTMyLCBmdW5jdGlvbl9uYW1lKSkgPT0gQUNQSV9QUkVGSVhfTUlYRUQpIHsKLQotCQkvKiBUaGlzIGlzIHRoZSBjYXNlIHdoZXJlIHRoZSBvcmlnaW5hbCBzb3VyY2UgaGFzIG5vdCBiZWVuIG1vZGlmaWVkICovCi0KLQkJcmV0dXJuIChmdW5jdGlvbl9uYW1lICsgNCk7Ci0JfQotCi0JaWYgKCooQUNQSV9DQVNUX1BUUih1MzIsIGZ1bmN0aW9uX25hbWUpKSA9PSBBQ1BJX1BSRUZJWF9MT1dFUikgewotCi0JCS8qIFRoaXMgaXMgdGhlIGNhc2Ugd2hlcmUgdGhlIHNvdXJjZSBoYXMgYmVlbiAnbGludXhpemVkJyAqLwotCi0JCXJldHVybiAoZnVuY3Rpb25fbmFtZSArIDUpOwotCX0KLQotCXJldHVybiAoZnVuY3Rpb25fbmFtZSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfdXRfZGVidWdfcHJpbnQKLSAqCi0gKiBQQVJBTUVURVJTOiAgcmVxdWVzdGVkX2RlYnVnX2xldmVsIC0gUmVxdWVzdGVkIGRlYnVnIHByaW50IGxldmVsCi0gKiAgICAgICAgICAgICAgbGluZV9udW1iZXIgICAgICAgICAtIENhbGxlcidzIGxpbmUgbnVtYmVyIChmb3IgZXJyb3Igb3V0cHV0KQotICogICAgICAgICAgICAgIGZ1bmN0aW9uX25hbWUgICAgICAgLSBDYWxsZXIncyBwcm9jZWR1cmUgbmFtZQotICogICAgICAgICAgICAgIG1vZHVsZV9uYW1lICAgICAgICAgLSBDYWxsZXIncyBtb2R1bGUgbmFtZQotICogICAgICAgICAgICAgIGNvbXBvbmVudF9pZCAgICAgICAgLSBDYWxsZXIncyBjb21wb25lbnQgSUQKLSAqICAgICAgICAgICAgICBGb3JtYXQgICAgICAgICAgICAgIC0gUHJpbnRmIGZvcm1hdCBmaWVsZAotICogICAgICAgICAgICAgIC4uLiAgICAgICAgICAgICAgICAgLSBPcHRpb25hbCBwcmludGYgYXJndW1lbnRzCi0gKgotICogUkVUVVJOOiAgICAgIE5vbmUKLSAqCi0gKiBERVNDUklQVElPTjogUHJpbnQgZXJyb3IgbWVzc2FnZSB3aXRoIHByZWZpeCBjb25zaXN0aW5nIG9mIHRoZSBtb2R1bGUgbmFtZSwKLSAqICAgICAgICAgICAgICBsaW5lIG51bWJlciwgYW5kIGNvbXBvbmVudCBJRC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi12b2lkIEFDUElfSU5URVJOQUxfVkFSX1hGQUNFCi1hY3BpX3V0X2RlYnVnX3ByaW50KHUzMiByZXF1ZXN0ZWRfZGVidWdfbGV2ZWwsCi0JCSAgICB1MzIgbGluZV9udW1iZXIsCi0JCSAgICBjb25zdCBjaGFyICpmdW5jdGlvbl9uYW1lLAotCQkgICAgY29uc3QgY2hhciAqbW9kdWxlX25hbWUsCi0JCSAgICB1MzIgY29tcG9uZW50X2lkLCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKLXsKLQlhY3BpX3RocmVhZF9pZCB0aHJlYWRfaWQ7Ci0JdmFfbGlzdCBhcmdzOwotCi0JLyoKLQkgKiBTdGF5IHNpbGVudCBpZiB0aGUgZGVidWcgbGV2ZWwgb3IgY29tcG9uZW50IElEIGlzIGRpc2FibGVkCi0JICovCi0JaWYgKCEocmVxdWVzdGVkX2RlYnVnX2xldmVsICYgYWNwaV9kYmdfbGV2ZWwpIHx8Ci0JICAgICEoY29tcG9uZW50X2lkICYgYWNwaV9kYmdfbGF5ZXIpKSB7Ci0JCXJldHVybjsKLQl9Ci0KLQkvKgotCSAqIFRocmVhZCB0cmFja2luZyBhbmQgY29udGV4dCBzd2l0Y2ggbm90aWZpY2F0aW9uCi0JICovCi0JdGhyZWFkX2lkID0gYWNwaV9vc19nZXRfdGhyZWFkX2lkKCk7Ci0JaWYgKHRocmVhZF9pZCAhPSBhY3BpX2dibF9wcmV2X3RocmVhZF9pZCkgewotCQlpZiAoQUNQSV9MVl9USFJFQURTICYgYWNwaV9kYmdfbGV2ZWwpIHsKLQkJCWFjcGlfb3NfcHJpbnRmCi0JCQkgICAgKCJcbioqKiogQ29udGV4dCBTd2l0Y2ggZnJvbSBUSUQgJWxYIHRvIFRJRCAlbFggKioqKlxuXG4iLAotCQkJICAgICAodW5zaWduZWQgbG9uZylhY3BpX2dibF9wcmV2X3RocmVhZF9pZCwKLQkJCSAgICAgKHVuc2lnbmVkIGxvbmcpdGhyZWFkX2lkKTsKLQkJfQotCi0JCWFjcGlfZ2JsX3ByZXZfdGhyZWFkX2lkID0gdGhyZWFkX2lkOwotCX0KLQotCS8qCi0JICogRGlzcGxheSB0aGUgbW9kdWxlIG5hbWUsIGN1cnJlbnQgbGluZSBudW1iZXIsIHRocmVhZCBJRCAoaWYgcmVxdWVzdGVkKSwKLQkgKiBjdXJyZW50IHByb2NlZHVyZSBuZXN0aW5nIGxldmVsLCBhbmQgdGhlIGN1cnJlbnQgcHJvY2VkdXJlIG5hbWUKLQkgKi8KLQlhY3BpX29zX3ByaW50ZigiJThzLSUwNGxkICIsIG1vZHVsZV9uYW1lLCBsaW5lX251bWJlcik7Ci0KLQlpZiAoQUNQSV9MVl9USFJFQURTICYgYWNwaV9kYmdfbGV2ZWwpIHsKLQkJYWNwaV9vc19wcmludGYoIlslMDRsWF0gIiwgKHVuc2lnbmVkIGxvbmcpdGhyZWFkX2lkKTsKLQl9Ci0KLQlhY3BpX29zX3ByaW50ZigiWyUwMmxkXSAlLTIyLjIyczogIiwKLQkJICAgICAgIGFjcGlfZ2JsX25lc3RpbmdfbGV2ZWwsCi0JCSAgICAgICBhY3BpX3V0X3RyaW1fZnVuY3Rpb25fbmFtZShmdW5jdGlvbl9uYW1lKSk7Ci0KLQl2YV9zdGFydChhcmdzLCBmb3JtYXQpOwotCWFjcGlfb3NfdnByaW50Zihmb3JtYXQsIGFyZ3MpOwotCXZhX2VuZChhcmdzKTsKLX0KLQotQUNQSV9FWFBPUlRfU1lNQk9MKGFjcGlfdXRfZGVidWdfcHJpbnQpCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfdXRfZGVidWdfcHJpbnRfcmF3Ci0gKgotICogUEFSQU1FVEVSUzogIHJlcXVlc3RlZF9kZWJ1Z19sZXZlbCAtIFJlcXVlc3RlZCBkZWJ1ZyBwcmludCBsZXZlbAotICogICAgICAgICAgICAgIGxpbmVfbnVtYmVyICAgICAgICAgLSBDYWxsZXIncyBsaW5lIG51bWJlcgotICogICAgICAgICAgICAgIGZ1bmN0aW9uX25hbWUgICAgICAgLSBDYWxsZXIncyBwcm9jZWR1cmUgbmFtZQotICogICAgICAgICAgICAgIG1vZHVsZV9uYW1lICAgICAgICAgLSBDYWxsZXIncyBtb2R1bGUgbmFtZQotICogICAgICAgICAgICAgIGNvbXBvbmVudF9pZCAgICAgICAgLSBDYWxsZXIncyBjb21wb25lbnQgSUQKLSAqICAgICAgICAgICAgICBGb3JtYXQgICAgICAgICAgICAgIC0gUHJpbnRmIGZvcm1hdCBmaWVsZAotICogICAgICAgICAgICAgIC4uLiAgICAgICAgICAgICAgICAgLSBPcHRpb25hbCBwcmludGYgYXJndW1lbnRzCi0gKgotICogUkVUVVJOOiAgICAgIE5vbmUKLSAqCi0gKiBERVNDUklQVElPTjogUHJpbnQgbWVzc2FnZSB3aXRoIG5vIGhlYWRlcnMuICBIYXMgc2FtZSBpbnRlcmZhY2UgYXMKLSAqICAgICAgICAgICAgICBkZWJ1Z19wcmludCBzbyB0aGF0IHRoZSBzYW1lIG1hY3JvcyBjYW4gYmUgdXNlZC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBBQ1BJX0lOVEVSTkFMX1ZBUl9YRkFDRQotYWNwaV91dF9kZWJ1Z19wcmludF9yYXcodTMyIHJlcXVlc3RlZF9kZWJ1Z19sZXZlbCwKLQkJCXUzMiBsaW5lX251bWJlciwKLQkJCWNvbnN0IGNoYXIgKmZ1bmN0aW9uX25hbWUsCi0JCQljb25zdCBjaGFyICptb2R1bGVfbmFtZSwKLQkJCXUzMiBjb21wb25lbnRfaWQsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQotewotCXZhX2xpc3QgYXJnczsKLQotCWlmICghKHJlcXVlc3RlZF9kZWJ1Z19sZXZlbCAmIGFjcGlfZGJnX2xldmVsKSB8fAotCSAgICAhKGNvbXBvbmVudF9pZCAmIGFjcGlfZGJnX2xheWVyKSkgewotCQlyZXR1cm47Ci0JfQotCi0JdmFfc3RhcnQoYXJncywgZm9ybWF0KTsKLQlhY3BpX29zX3ZwcmludGYoZm9ybWF0LCBhcmdzKTsKLQl2YV9lbmQoYXJncyk7Ci19Ci0KLUFDUElfRVhQT1JUX1NZTUJPTChhY3BpX3V0X2RlYnVnX3ByaW50X3JhdykKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV91dF90cmFjZQotICoKLSAqIFBBUkFNRVRFUlM6ICBsaW5lX251bWJlciAgICAgICAgIC0gQ2FsbGVyJ3MgbGluZSBudW1iZXIKLSAqICAgICAgICAgICAgICBmdW5jdGlvbl9uYW1lICAgICAgIC0gQ2FsbGVyJ3MgcHJvY2VkdXJlIG5hbWUKLSAqICAgICAgICAgICAgICBtb2R1bGVfbmFtZSAgICAgICAgIC0gQ2FsbGVyJ3MgbW9kdWxlIG5hbWUKLSAqICAgICAgICAgICAgICBjb21wb25lbnRfaWQgICAgICAgIC0gQ2FsbGVyJ3MgY29tcG9uZW50IElECi0gKgotICogUkVUVVJOOiAgICAgIE5vbmUKLSAqCi0gKiBERVNDUklQVElPTjogRnVuY3Rpb24gZW50cnkgdHJhY2UuICBQcmludHMgb25seSBpZiBUUkFDRV9GVU5DVElPTlMgYml0IGlzCi0gKiAgICAgICAgICAgICAgc2V0IGluIGRlYnVnX2xldmVsCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQKLWFjcGlfdXRfdHJhY2UodTMyIGxpbmVfbnVtYmVyLAotCSAgICAgIGNvbnN0IGNoYXIgKmZ1bmN0aW9uX25hbWUsCi0JICAgICAgY29uc3QgY2hhciAqbW9kdWxlX25hbWUsIHUzMiBjb21wb25lbnRfaWQpCi17Ci0KLQlhY3BpX2dibF9uZXN0aW5nX2xldmVsKys7Ci0JYWNwaV91dF90cmFja19zdGFja19wdHIoKTsKLQotCWFjcGlfdXRfZGVidWdfcHJpbnQoQUNQSV9MVl9GVU5DVElPTlMsCi0JCQkgICAgbGluZV9udW1iZXIsIGZ1bmN0aW9uX25hbWUsIG1vZHVsZV9uYW1lLAotCQkJICAgIGNvbXBvbmVudF9pZCwgIiVzXG4iLCBhY3BpX2dibF9mbl9lbnRyeV9zdHIpOwotfQotCi1BQ1BJX0VYUE9SVF9TWU1CT0woYWNwaV91dF90cmFjZSkKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV91dF90cmFjZV9wdHIKLSAqCi0gKiBQQVJBTUVURVJTOiAgbGluZV9udW1iZXIgICAgICAgICAtIENhbGxlcidzIGxpbmUgbnVtYmVyCi0gKiAgICAgICAgICAgICAgZnVuY3Rpb25fbmFtZSAgICAgICAtIENhbGxlcidzIHByb2NlZHVyZSBuYW1lCi0gKiAgICAgICAgICAgICAgbW9kdWxlX25hbWUgICAgICAgICAtIENhbGxlcidzIG1vZHVsZSBuYW1lCi0gKiAgICAgICAgICAgICAgY29tcG9uZW50X2lkICAgICAgICAtIENhbGxlcidzIGNvbXBvbmVudCBJRAotICogICAgICAgICAgICAgIFBvaW50ZXIgICAgICAgICAgICAgLSBQb2ludGVyIHRvIGRpc3BsYXkKLSAqCi0gKiBSRVRVUk46ICAgICAgTm9uZQotICoKLSAqIERFU0NSSVBUSU9OOiBGdW5jdGlvbiBlbnRyeSB0cmFjZS4gIFByaW50cyBvbmx5IGlmIFRSQUNFX0ZVTkNUSU9OUyBiaXQgaXMKLSAqICAgICAgICAgICAgICBzZXQgaW4gZGVidWdfbGV2ZWwKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZAotYWNwaV91dF90cmFjZV9wdHIodTMyIGxpbmVfbnVtYmVyLAotCQkgIGNvbnN0IGNoYXIgKmZ1bmN0aW9uX25hbWUsCi0JCSAgY29uc3QgY2hhciAqbW9kdWxlX25hbWUsIHUzMiBjb21wb25lbnRfaWQsIHZvaWQgKnBvaW50ZXIpCi17Ci0JYWNwaV9nYmxfbmVzdGluZ19sZXZlbCsrOwotCWFjcGlfdXRfdHJhY2tfc3RhY2tfcHRyKCk7Ci0KLQlhY3BpX3V0X2RlYnVnX3ByaW50KEFDUElfTFZfRlVOQ1RJT05TLAotCQkJICAgIGxpbmVfbnVtYmVyLCBmdW5jdGlvbl9uYW1lLCBtb2R1bGVfbmFtZSwKLQkJCSAgICBjb21wb25lbnRfaWQsICIlcyAlcFxuIiwgYWNwaV9nYmxfZm5fZW50cnlfc3RyLAotCQkJICAgIHBvaW50ZXIpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X3RyYWNlX3N0cgotICoKLSAqIFBBUkFNRVRFUlM6ICBsaW5lX251bWJlciAgICAgICAgIC0gQ2FsbGVyJ3MgbGluZSBudW1iZXIKLSAqICAgICAgICAgICAgICBmdW5jdGlvbl9uYW1lICAgICAgIC0gQ2FsbGVyJ3MgcHJvY2VkdXJlIG5hbWUKLSAqICAgICAgICAgICAgICBtb2R1bGVfbmFtZSAgICAgICAgIC0gQ2FsbGVyJ3MgbW9kdWxlIG5hbWUKLSAqICAgICAgICAgICAgICBjb21wb25lbnRfaWQgICAgICAgIC0gQ2FsbGVyJ3MgY29tcG9uZW50IElECi0gKiAgICAgICAgICAgICAgU3RyaW5nICAgICAgICAgICAgICAtIEFkZGl0aW9uYWwgc3RyaW5nIHRvIGRpc3BsYXkKLSAqCi0gKiBSRVRVUk46ICAgICAgTm9uZQotICoKLSAqIERFU0NSSVBUSU9OOiBGdW5jdGlvbiBlbnRyeSB0cmFjZS4gIFByaW50cyBvbmx5IGlmIFRSQUNFX0ZVTkNUSU9OUyBiaXQgaXMKLSAqICAgICAgICAgICAgICBzZXQgaW4gZGVidWdfbGV2ZWwKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi12b2lkCi1hY3BpX3V0X3RyYWNlX3N0cih1MzIgbGluZV9udW1iZXIsCi0JCSAgY29uc3QgY2hhciAqZnVuY3Rpb25fbmFtZSwKLQkJICBjb25zdCBjaGFyICptb2R1bGVfbmFtZSwgdTMyIGNvbXBvbmVudF9pZCwgY2hhciAqc3RyaW5nKQotewotCi0JYWNwaV9nYmxfbmVzdGluZ19sZXZlbCsrOwotCWFjcGlfdXRfdHJhY2tfc3RhY2tfcHRyKCk7Ci0KLQlhY3BpX3V0X2RlYnVnX3ByaW50KEFDUElfTFZfRlVOQ1RJT05TLAotCQkJICAgIGxpbmVfbnVtYmVyLCBmdW5jdGlvbl9uYW1lLCBtb2R1bGVfbmFtZSwKLQkJCSAgICBjb21wb25lbnRfaWQsICIlcyAlc1xuIiwgYWNwaV9nYmxfZm5fZW50cnlfc3RyLAotCQkJICAgIHN0cmluZyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfdXRfdHJhY2VfdTMyCi0gKgotICogUEFSQU1FVEVSUzogIGxpbmVfbnVtYmVyICAgICAgICAgLSBDYWxsZXIncyBsaW5lIG51bWJlcgotICogICAgICAgICAgICAgIGZ1bmN0aW9uX25hbWUgICAgICAgLSBDYWxsZXIncyBwcm9jZWR1cmUgbmFtZQotICogICAgICAgICAgICAgIG1vZHVsZV9uYW1lICAgICAgICAgLSBDYWxsZXIncyBtb2R1bGUgbmFtZQotICogICAgICAgICAgICAgIGNvbXBvbmVudF9pZCAgICAgICAgLSBDYWxsZXIncyBjb21wb25lbnQgSUQKLSAqICAgICAgICAgICAgICBJbnRlZ2VyICAgICAgICAgICAgIC0gSW50ZWdlciB0byBkaXNwbGF5Ci0gKgotICogUkVUVVJOOiAgICAgIE5vbmUKLSAqCi0gKiBERVNDUklQVElPTjogRnVuY3Rpb24gZW50cnkgdHJhY2UuICBQcmludHMgb25seSBpZiBUUkFDRV9GVU5DVElPTlMgYml0IGlzCi0gKiAgICAgICAgICAgICAgc2V0IGluIGRlYnVnX2xldmVsCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdm9pZAotYWNwaV91dF90cmFjZV91MzIodTMyIGxpbmVfbnVtYmVyLAotCQkgIGNvbnN0IGNoYXIgKmZ1bmN0aW9uX25hbWUsCi0JCSAgY29uc3QgY2hhciAqbW9kdWxlX25hbWUsIHUzMiBjb21wb25lbnRfaWQsIHUzMiBpbnRlZ2VyKQotewotCi0JYWNwaV9nYmxfbmVzdGluZ19sZXZlbCsrOwotCWFjcGlfdXRfdHJhY2tfc3RhY2tfcHRyKCk7Ci0KLQlhY3BpX3V0X2RlYnVnX3ByaW50KEFDUElfTFZfRlVOQ1RJT05TLAotCQkJICAgIGxpbmVfbnVtYmVyLCBmdW5jdGlvbl9uYW1lLCBtb2R1bGVfbmFtZSwKLQkJCSAgICBjb21wb25lbnRfaWQsICIlcyAlMDhYXG4iLCBhY3BpX2dibF9mbl9lbnRyeV9zdHIsCi0JCQkgICAgaW50ZWdlcik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfdXRfZXhpdAotICoKLSAqIFBBUkFNRVRFUlM6ICBsaW5lX251bWJlciAgICAgICAgIC0gQ2FsbGVyJ3MgbGluZSBudW1iZXIKLSAqICAgICAgICAgICAgICBmdW5jdGlvbl9uYW1lICAgICAgIC0gQ2FsbGVyJ3MgcHJvY2VkdXJlIG5hbWUKLSAqICAgICAgICAgICAgICBtb2R1bGVfbmFtZSAgICAgICAgIC0gQ2FsbGVyJ3MgbW9kdWxlIG5hbWUKLSAqICAgICAgICAgICAgICBjb21wb25lbnRfaWQgICAgICAgIC0gQ2FsbGVyJ3MgY29tcG9uZW50IElECi0gKgotICogUkVUVVJOOiAgICAgIE5vbmUKLSAqCi0gKiBERVNDUklQVElPTjogRnVuY3Rpb24gZXhpdCB0cmFjZS4gIFByaW50cyBvbmx5IGlmIFRSQUNFX0ZVTkNUSU9OUyBiaXQgaXMKLSAqICAgICAgICAgICAgICBzZXQgaW4gZGVidWdfbGV2ZWwKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi12b2lkCi1hY3BpX3V0X2V4aXQodTMyIGxpbmVfbnVtYmVyLAotCSAgICAgY29uc3QgY2hhciAqZnVuY3Rpb25fbmFtZSwKLQkgICAgIGNvbnN0IGNoYXIgKm1vZHVsZV9uYW1lLCB1MzIgY29tcG9uZW50X2lkKQotewotCi0JYWNwaV91dF9kZWJ1Z19wcmludChBQ1BJX0xWX0ZVTkNUSU9OUywKLQkJCSAgICBsaW5lX251bWJlciwgZnVuY3Rpb25fbmFtZSwgbW9kdWxlX25hbWUsCi0JCQkgICAgY29tcG9uZW50X2lkLCAiJXNcbiIsIGFjcGlfZ2JsX2ZuX2V4aXRfc3RyKTsKLQotCWFjcGlfZ2JsX25lc3RpbmdfbGV2ZWwtLTsKLX0KLQotQUNQSV9FWFBPUlRfU1lNQk9MKGFjcGlfdXRfZXhpdCkKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV91dF9zdGF0dXNfZXhpdAotICoKLSAqIFBBUkFNRVRFUlM6ICBsaW5lX251bWJlciAgICAgICAgIC0gQ2FsbGVyJ3MgbGluZSBudW1iZXIKLSAqICAgICAgICAgICAgICBmdW5jdGlvbl9uYW1lICAgICAgIC0gQ2FsbGVyJ3MgcHJvY2VkdXJlIG5hbWUKLSAqICAgICAgICAgICAgICBtb2R1bGVfbmFtZSAgICAgICAgIC0gQ2FsbGVyJ3MgbW9kdWxlIG5hbWUKLSAqICAgICAgICAgICAgICBjb21wb25lbnRfaWQgICAgICAgIC0gQ2FsbGVyJ3MgY29tcG9uZW50IElECi0gKiAgICAgICAgICAgICAgU3RhdHVzICAgICAgICAgICAgICAtIEV4aXQgc3RhdHVzIGNvZGUKLSAqCi0gKiBSRVRVUk46ICAgICAgTm9uZQotICoKLSAqIERFU0NSSVBUSU9OOiBGdW5jdGlvbiBleGl0IHRyYWNlLiAgUHJpbnRzIG9ubHkgaWYgVFJBQ0VfRlVOQ1RJT05TIGJpdCBpcwotICogICAgICAgICAgICAgIHNldCBpbiBkZWJ1Z19sZXZlbC4gUHJpbnRzIGV4aXQgc3RhdHVzIGFsc28uCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQKLWFjcGlfdXRfc3RhdHVzX2V4aXQodTMyIGxpbmVfbnVtYmVyLAotCQkgICAgY29uc3QgY2hhciAqZnVuY3Rpb25fbmFtZSwKLQkJICAgIGNvbnN0IGNoYXIgKm1vZHVsZV9uYW1lLAotCQkgICAgdTMyIGNvbXBvbmVudF9pZCwgYWNwaV9zdGF0dXMgc3RhdHVzKQotewotCi0JaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKSB7Ci0JCWFjcGlfdXRfZGVidWdfcHJpbnQoQUNQSV9MVl9GVU5DVElPTlMsCi0JCQkJICAgIGxpbmVfbnVtYmVyLCBmdW5jdGlvbl9uYW1lLCBtb2R1bGVfbmFtZSwKLQkJCQkgICAgY29tcG9uZW50X2lkLCAiJXMgJXNcbiIsCi0JCQkJICAgIGFjcGlfZ2JsX2ZuX2V4aXRfc3RyLAotCQkJCSAgICBhY3BpX2Zvcm1hdF9leGNlcHRpb24oc3RhdHVzKSk7Ci0JfSBlbHNlIHsKLQkJYWNwaV91dF9kZWJ1Z19wcmludChBQ1BJX0xWX0ZVTkNUSU9OUywKLQkJCQkgICAgbGluZV9udW1iZXIsIGZ1bmN0aW9uX25hbWUsIG1vZHVsZV9uYW1lLAotCQkJCSAgICBjb21wb25lbnRfaWQsICIlcyAqKioqRXhjZXB0aW9uKioqKjogJXNcbiIsCi0JCQkJICAgIGFjcGlfZ2JsX2ZuX2V4aXRfc3RyLAotCQkJCSAgICBhY3BpX2Zvcm1hdF9leGNlcHRpb24oc3RhdHVzKSk7Ci0JfQotCi0JYWNwaV9nYmxfbmVzdGluZ19sZXZlbC0tOwotfQotCi1BQ1BJX0VYUE9SVF9TWU1CT0woYWNwaV91dF9zdGF0dXNfZXhpdCkKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV91dF92YWx1ZV9leGl0Ci0gKgotICogUEFSQU1FVEVSUzogIGxpbmVfbnVtYmVyICAgICAgICAgLSBDYWxsZXIncyBsaW5lIG51bWJlcgotICogICAgICAgICAgICAgIGZ1bmN0aW9uX25hbWUgICAgICAgLSBDYWxsZXIncyBwcm9jZWR1cmUgbmFtZQotICogICAgICAgICAgICAgIG1vZHVsZV9uYW1lICAgICAgICAgLSBDYWxsZXIncyBtb2R1bGUgbmFtZQotICogICAgICAgICAgICAgIGNvbXBvbmVudF9pZCAgICAgICAgLSBDYWxsZXIncyBjb21wb25lbnQgSUQKLSAqICAgICAgICAgICAgICBWYWx1ZSAgICAgICAgICAgICAgIC0gVmFsdWUgdG8gYmUgcHJpbnRlZCB3aXRoIGV4aXQgbXNnCi0gKgotICogUkVUVVJOOiAgICAgIE5vbmUKLSAqCi0gKiBERVNDUklQVElPTjogRnVuY3Rpb24gZXhpdCB0cmFjZS4gIFByaW50cyBvbmx5IGlmIFRSQUNFX0ZVTkNUSU9OUyBiaXQgaXMKLSAqICAgICAgICAgICAgICBzZXQgaW4gZGVidWdfbGV2ZWwuIFByaW50cyBleGl0IHZhbHVlIGFsc28uCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQKLWFjcGlfdXRfdmFsdWVfZXhpdCh1MzIgbGluZV9udW1iZXIsCi0JCSAgIGNvbnN0IGNoYXIgKmZ1bmN0aW9uX25hbWUsCi0JCSAgIGNvbnN0IGNoYXIgKm1vZHVsZV9uYW1lLAotCQkgICB1MzIgY29tcG9uZW50X2lkLCBhY3BpX2ludGVnZXIgdmFsdWUpCi17Ci0KLQlhY3BpX3V0X2RlYnVnX3ByaW50KEFDUElfTFZfRlVOQ1RJT05TLAotCQkJICAgIGxpbmVfbnVtYmVyLCBmdW5jdGlvbl9uYW1lLCBtb2R1bGVfbmFtZSwKLQkJCSAgICBjb21wb25lbnRfaWQsICIlcyAlOC44WCU4LjhYXG4iLAotCQkJICAgIGFjcGlfZ2JsX2ZuX2V4aXRfc3RyLCBBQ1BJX0ZPUk1BVF9VSU5UNjQodmFsdWUpKTsKLQotCWFjcGlfZ2JsX25lc3RpbmdfbGV2ZWwtLTsKLX0KLQotQUNQSV9FWFBPUlRfU1lNQk9MKGFjcGlfdXRfdmFsdWVfZXhpdCkKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV91dF9wdHJfZXhpdAotICoKLSAqIFBBUkFNRVRFUlM6ICBsaW5lX251bWJlciAgICAgICAgIC0gQ2FsbGVyJ3MgbGluZSBudW1iZXIKLSAqICAgICAgICAgICAgICBmdW5jdGlvbl9uYW1lICAgICAgIC0gQ2FsbGVyJ3MgcHJvY2VkdXJlIG5hbWUKLSAqICAgICAgICAgICAgICBtb2R1bGVfbmFtZSAgICAgICAgIC0gQ2FsbGVyJ3MgbW9kdWxlIG5hbWUKLSAqICAgICAgICAgICAgICBjb21wb25lbnRfaWQgICAgICAgIC0gQ2FsbGVyJ3MgY29tcG9uZW50IElECi0gKiAgICAgICAgICAgICAgUHRyICAgICAgICAgICAgICAgICAtIFBvaW50ZXIgdG8gZGlzcGxheQotICoKLSAqIFJFVFVSTjogICAgICBOb25lCi0gKgotICogREVTQ1JJUFRJT046IEZ1bmN0aW9uIGV4aXQgdHJhY2UuICBQcmludHMgb25seSBpZiBUUkFDRV9GVU5DVElPTlMgYml0IGlzCi0gKiAgICAgICAgICAgICAgc2V0IGluIGRlYnVnX2xldmVsLiBQcmludHMgZXhpdCB2YWx1ZSBhbHNvLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkCi1hY3BpX3V0X3B0cl9leGl0KHUzMiBsaW5lX251bWJlciwKLQkJIGNvbnN0IGNoYXIgKmZ1bmN0aW9uX25hbWUsCi0JCSBjb25zdCBjaGFyICptb2R1bGVfbmFtZSwgdTMyIGNvbXBvbmVudF9pZCwgdTggKnB0cikKLXsKLQotCWFjcGlfdXRfZGVidWdfcHJpbnQoQUNQSV9MVl9GVU5DVElPTlMsCi0JCQkgICAgbGluZV9udW1iZXIsIGZ1bmN0aW9uX25hbWUsIG1vZHVsZV9uYW1lLAotCQkJICAgIGNvbXBvbmVudF9pZCwgIiVzICVwXG4iLCBhY3BpX2dibF9mbl9leGl0X3N0ciwgcHRyKTsKLQotCWFjcGlfZ2JsX25lc3RpbmdfbGV2ZWwtLTsKLX0KLQotI2VuZGlmCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfdXRfZHVtcF9idWZmZXIKLSAqCi0gKiBQQVJBTUVURVJTOiAgQnVmZmVyICAgICAgICAgICAgICAtIEJ1ZmZlciB0byBkdW1wCi0gKiAgICAgICAgICAgICAgQ291bnQgICAgICAgICAgICAgICAtIEFtb3VudCB0byBkdW1wLCBpbiBieXRlcwotICogICAgICAgICAgICAgIERpc3BsYXkgICAgICAgICAgICAgLSBCWVRFLCBXT1JELCBEV09SRCwgb3IgUVdPUkQgZGlzcGxheQotICogICAgICAgICAgICAgIGNvbXBvbmVudF9pRCAgICAgICAgLSBDYWxsZXIncyBjb21wb25lbnQgSUQKLSAqCi0gKiBSRVRVUk46ICAgICAgTm9uZQotICoKLSAqIERFU0NSSVBUSU9OOiBHZW5lcmljIGR1bXAgYnVmZmVyIGluIGJvdGggaGV4IGFuZCBhc2NpaS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi12b2lkIGFjcGlfdXRfZHVtcF9idWZmZXIyKHU4ICogYnVmZmVyLCB1MzIgY291bnQsIHUzMiBkaXNwbGF5KQotewotCXUzMiBpID0gMDsKLQl1MzIgajsKLQl1MzIgdGVtcDMyOwotCXU4IGJ1Zl9jaGFyOwotCi0JaWYgKCFidWZmZXIpIHsKLQkJYWNwaV9vc19wcmludGYoIk51bGwgQnVmZmVyIFBvaW50ZXIgaW4gRHVtcEJ1ZmZlciFcbiIpOwotCQlyZXR1cm47Ci0JfQotCi0JaWYgKChjb3VudCA8IDQpIHx8IChjb3VudCAmIDB4MDEpKSB7Ci0JCWRpc3BsYXkgPSBEQl9CWVRFX0RJU1BMQVk7Ci0JfQotCi0JLyogTmFzdHkgbGl0dGxlIGR1bXAgYnVmZmVyIHJvdXRpbmUhICovCi0KLQl3aGlsZSAoaSA8IGNvdW50KSB7Ci0KLQkJLyogUHJpbnQgY3VycmVudCBvZmZzZXQgKi8KLQotCQlhY3BpX29zX3ByaW50ZigiJTYuNFg6ICIsIGkpOwotCi0JCS8qIFByaW50IDE2IGhleCBjaGFycyAqLwotCi0JCWZvciAoaiA9IDA7IGogPCAxNjspIHsKLQkJCWlmIChpICsgaiA+PSBjb3VudCkgewotCi0JCQkJLyogRHVtcCBmaWxsIHNwYWNlcyAqLwotCi0JCQkJYWNwaV9vc19wcmludGYoIiUqcyIsICgoZGlzcGxheSAqIDIpICsgMSksICIgIik7Ci0JCQkJaiArPSBkaXNwbGF5OwotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQlzd2l0Y2ggKGRpc3BsYXkpIHsKLQkJCWNhc2UgREJfQllURV9ESVNQTEFZOgotCQkJZGVmYXVsdDoJLyogRGVmYXVsdCBpcyBCWVRFIGRpc3BsYXkgKi8KLQotCQkJCWFjcGlfb3NfcHJpbnRmKCIlMDJYICIsCi0JCQkJCSAgICAgICBidWZmZXJbKGFjcGlfc2l6ZSkgaSArIGpdKTsKLQkJCQlicmVhazsKLQotCQkJY2FzZSBEQl9XT1JEX0RJU1BMQVk6Ci0KLQkJCQlBQ1BJX01PVkVfMTZfVE9fMzIoJnRlbXAzMiwKLQkJCQkJCSAgICZidWZmZXJbKGFjcGlfc2l6ZSkgaSArIGpdKTsKLQkJCQlhY3BpX29zX3ByaW50ZigiJTA0WCAiLCB0ZW1wMzIpOwotCQkJCWJyZWFrOwotCi0JCQljYXNlIERCX0RXT1JEX0RJU1BMQVk6Ci0KLQkJCQlBQ1BJX01PVkVfMzJfVE9fMzIoJnRlbXAzMiwKLQkJCQkJCSAgICZidWZmZXJbKGFjcGlfc2l6ZSkgaSArIGpdKTsKLQkJCQlhY3BpX29zX3ByaW50ZigiJTA4WCAiLCB0ZW1wMzIpOwotCQkJCWJyZWFrOwotCi0JCQljYXNlIERCX1FXT1JEX0RJU1BMQVk6Ci0KLQkJCQlBQ1BJX01PVkVfMzJfVE9fMzIoJnRlbXAzMiwKLQkJCQkJCSAgICZidWZmZXJbKGFjcGlfc2l6ZSkgaSArIGpdKTsKLQkJCQlhY3BpX29zX3ByaW50ZigiJTA4WCIsIHRlbXAzMik7Ci0KLQkJCQlBQ1BJX01PVkVfMzJfVE9fMzIoJnRlbXAzMiwKLQkJCQkJCSAgICZidWZmZXJbKGFjcGlfc2l6ZSkgaSArIGogKwotCQkJCQkJCSAgIDRdKTsKLQkJCQlhY3BpX29zX3ByaW50ZigiJTA4WCAiLCB0ZW1wMzIpOwotCQkJCWJyZWFrOwotCQkJfQotCi0JCQlqICs9IGRpc3BsYXk7Ci0JCX0KLQotCQkvKgotCQkgKiBQcmludCB0aGUgQVNDSUkgZXF1aXZhbGVudCBjaGFyYWN0ZXJzIGJ1dCB3YXRjaCBvdXQgZm9yIHRoZSBiYWQKLQkJICogdW5wcmludGFibGUgb25lcyAocHJpbnRhYmxlIGNoYXJzIGFyZSAweDIwIHRocm91Z2ggMHg3RSkKLQkJICovCi0JCWFjcGlfb3NfcHJpbnRmKCIgIik7Ci0JCWZvciAoaiA9IDA7IGogPCAxNjsgaisrKSB7Ci0JCQlpZiAoaSArIGogPj0gY291bnQpIHsKLQkJCQlhY3BpX29zX3ByaW50ZigiXG4iKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJCWJ1Zl9jaGFyID0gYnVmZmVyWyhhY3BpX3NpemUpIGkgKyBqXTsKLQkJCWlmIChBQ1BJX0lTX1BSSU5UKGJ1Zl9jaGFyKSkgewotCQkJCWFjcGlfb3NfcHJpbnRmKCIlYyIsIGJ1Zl9jaGFyKTsKLQkJCX0gZWxzZSB7Ci0JCQkJYWNwaV9vc19wcmludGYoIi4iKTsKLQkJCX0KLQkJfQotCi0JCS8qIERvbmUgd2l0aCB0aGF0IGxpbmUuICovCi0KLQkJYWNwaV9vc19wcmludGYoIlxuIik7Ci0JCWkgKz0gMTY7Ci0JfQotCi0JcmV0dXJuOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X2R1bXBfYnVmZmVyCi0gKgotICogUEFSQU1FVEVSUzogIEJ1ZmZlciAgICAgICAgICAgICAgLSBCdWZmZXIgdG8gZHVtcAotICogICAgICAgICAgICAgIENvdW50ICAgICAgICAgICAgICAgLSBBbW91bnQgdG8gZHVtcCwgaW4gYnl0ZXMKLSAqICAgICAgICAgICAgICBEaXNwbGF5ICAgICAgICAgICAgIC0gQllURSwgV09SRCwgRFdPUkQsIG9yIFFXT1JEIGRpc3BsYXkKLSAqICAgICAgICAgICAgICBjb21wb25lbnRfaUQgICAgICAgIC0gQ2FsbGVyJ3MgY29tcG9uZW50IElECi0gKgotICogUkVUVVJOOiAgICAgIE5vbmUKLSAqCi0gKiBERVNDUklQVElPTjogR2VuZXJpYyBkdW1wIGJ1ZmZlciBpbiBib3RoIGhleCBhbmQgYXNjaWkuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdm9pZCBhY3BpX3V0X2R1bXBfYnVmZmVyKHU4ICogYnVmZmVyLCB1MzIgY291bnQsIHUzMiBkaXNwbGF5LCB1MzIgY29tcG9uZW50X2lkKQotewotCi0JLyogT25seSBkdW1wIHRoZSBidWZmZXIgaWYgdHJhY2luZyBpcyBlbmFibGVkICovCi0KLQlpZiAoISgoQUNQSV9MVl9UQUJMRVMgJiBhY3BpX2RiZ19sZXZlbCkgJiYKLQkgICAgICAoY29tcG9uZW50X2lkICYgYWNwaV9kYmdfbGF5ZXIpKSkgewotCQlyZXR1cm47Ci0JfQotCi0JYWNwaV91dF9kdW1wX2J1ZmZlcjIoYnVmZmVyLCBjb3VudCwgZGlzcGxheSk7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0ZGVsZXRlLmMgYi9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0ZGVsZXRlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxOTdjNmIuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dGRlbGV0ZS5jCisrKyAvZGV2L251bGwKQEAgLTEsNjc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogTW9kdWxlIE5hbWU6IHV0ZGVsZXRlIC0gb2JqZWN0IGRlbGV0aW9uIGFuZCByZWZlcmVuY2UgY291bnQgdXRpbGl0aWVzCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDgsIEludGVsIENvcnAuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCi0gKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSBhdCBtaW5pbXVtIGEgZGlzY2xhaW1lcgotICogICAgc3Vic3RhbnRpYWxseSBzaW1pbGFyIHRvIHRoZSAiTk8gV0FSUkFOVFkiIGRpc2NsYWltZXIgYmVsb3cKLSAqICAgICgiRGlzY2xhaW1lciIpIGFuZCBhbnkgcmVkaXN0cmlidXRpb24gbXVzdCBiZSBjb25kaXRpb25lZCB1cG9uCi0gKiAgICBpbmNsdWRpbmcgYSBzdWJzdGFudGlhbGx5IHNpbWlsYXIgRGlzY2xhaW1lciByZXF1aXJlbWVudCBmb3IgZnVydGhlcgotICogICAgYmluYXJ5IHJlZGlzdHJpYnV0aW9uLgotICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzCi0gKiAgICBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIE5PIFdBUlJBTlRZCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKLSAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCi0gKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORwotICogSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCi0gKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCi0gKi8KLQotI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgotI2luY2x1ZGUgPGFjcGkvYWNpbnRlcnAuaD4KLSNpbmNsdWRlIDxhY3BpL2FjbmFtZXNwLmg+Ci0jaW5jbHVkZSA8YWNwaS9hY2V2ZW50cy5oPgotCi0jZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9VVElMSVRJRVMKLUFDUElfTU9EVUxFX05BTUUoInV0ZGVsZXRlIikKLQotLyogTG9jYWwgcHJvdG90eXBlcyAqLwotc3RhdGljIHZvaWQgYWNwaV91dF9kZWxldGVfaW50ZXJuYWxfb2JqKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9iamVjdCk7Ci0KLXN0YXRpYyB2b2lkCi1hY3BpX3V0X3VwZGF0ZV9yZWZfY291bnQodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqZWN0LCB1MzIgYWN0aW9uKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV91dF9kZWxldGVfaW50ZXJuYWxfb2JqCi0gKgotICogUEFSQU1FVEVSUzogIE9iamVjdCAgICAgICAgIC0gT2JqZWN0IHRvIGJlIGRlbGV0ZWQKLSAqCi0gKiBSRVRVUk46ICAgICAgTm9uZQotICoKLSAqIERFU0NSSVBUSU9OOiBMb3cgbGV2ZWwgb2JqZWN0IGRlbGV0aW9uLCBhZnRlciByZWZlcmVuY2UgY291bnRzIGhhdmUgYmVlbgotICogICAgICAgICAgICAgIHVwZGF0ZWQgKEFsbCByZWZlcmVuY2UgY291bnRzLCBpbmNsdWRpbmcgc3ViLW9iamVjdHMhKQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyB2b2lkIGFjcGlfdXRfZGVsZXRlX2ludGVybmFsX29iaih1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmplY3QpCi17Ci0Jdm9pZCAqb2JqX3BvaW50ZXIgPSBOVUxMOwotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKmhhbmRsZXJfZGVzYzsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpzZWNvbmRfZGVzYzsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpuZXh0X2Rlc2M7Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUih1dF9kZWxldGVfaW50ZXJuYWxfb2JqLCBvYmplY3QpOwotCi0JaWYgKCFvYmplY3QpIHsKLQkJcmV0dXJuX1ZPSUQ7Ci0JfQotCi0JLyoKLQkgKiBNdXN0IGRlbGV0ZSBvciBmcmVlIGFueSBwb2ludGVycyB3aXRoaW4gdGhlIG9iamVjdCB0aGF0IGFyZSBub3QKLQkgKiBhY3R1YWwgQUNQSSBvYmplY3RzIChmb3IgZXhhbXBsZSwgYSByYXcgYnVmZmVyIHBvaW50ZXIpLgotCSAqLwotCXN3aXRjaCAoQUNQSV9HRVRfT0JKRUNUX1RZUEUob2JqZWN0KSkgewotCWNhc2UgQUNQSV9UWVBFX1NUUklORzoKLQotCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0FMTE9DQVRJT05TLAotCQkJCSAgIioqKiogU3RyaW5nICVwLCBwdHIgJXBcbiIsIG9iamVjdCwKLQkJCQkgIG9iamVjdC0+c3RyaW5nLnBvaW50ZXIpKTsKLQotCQkvKiBGcmVlIHRoZSBhY3R1YWwgc3RyaW5nIGJ1ZmZlciAqLwotCi0JCWlmICghKG9iamVjdC0+Y29tbW9uLmZsYWdzICYgQU9QT0JKX1NUQVRJQ19QT0lOVEVSKSkgewotCi0JCQkvKiBCdXQgb25seSBpZiBpdCBpcyBOT1QgYSBwb2ludGVyIGludG8gYW4gQUNQSSB0YWJsZSAqLwotCi0JCQlvYmpfcG9pbnRlciA9IG9iamVjdC0+c3RyaW5nLnBvaW50ZXI7Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIEFDUElfVFlQRV9CVUZGRVI6Ci0KLQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9BTExPQ0FUSU9OUywKLQkJCQkgICIqKioqIEJ1ZmZlciAlcCwgcHRyICVwXG4iLCBvYmplY3QsCi0JCQkJICBvYmplY3QtPmJ1ZmZlci5wb2ludGVyKSk7Ci0KLQkJLyogRnJlZSB0aGUgYWN0dWFsIGJ1ZmZlciAqLwotCi0JCWlmICghKG9iamVjdC0+Y29tbW9uLmZsYWdzICYgQU9QT0JKX1NUQVRJQ19QT0lOVEVSKSkgewotCi0JCQkvKiBCdXQgb25seSBpZiBpdCBpcyBOT1QgYSBwb2ludGVyIGludG8gYW4gQUNQSSB0YWJsZSAqLwotCi0JCQlvYmpfcG9pbnRlciA9IG9iamVjdC0+YnVmZmVyLnBvaW50ZXI7Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIEFDUElfVFlQRV9QQUNLQUdFOgotCi0JCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfQUxMT0NBVElPTlMsCi0JCQkJICAiICoqKiogUGFja2FnZSBvZiBjb3VudCAlWFxuIiwKLQkJCQkgIG9iamVjdC0+cGFja2FnZS5jb3VudCkpOwotCi0JCS8qCi0JCSAqIEVsZW1lbnRzIG9mIHRoZSBwYWNrYWdlIGFyZSBub3QgaGFuZGxlZCBoZXJlLCB0aGV5IGFyZSBkZWxldGVkCi0JCSAqIHNlcGFyYXRlbHkKLQkJICovCi0KLQkJLyogRnJlZSB0aGUgKHZhcmlhYmxlIGxlbmd0aCkgZWxlbWVudCBwb2ludGVyIGFycmF5ICovCi0KLQkJb2JqX3BvaW50ZXIgPSBvYmplY3QtPnBhY2thZ2UuZWxlbWVudHM7Ci0JCWJyZWFrOwotCi0JCS8qCi0JCSAqIFRoZXNlIG9iamVjdHMgaGF2ZSBhIHBvc3NpYmxlIGxpc3Qgb2Ygbm90aWZ5IGhhbmRsZXJzLgotCQkgKiBEZXZpY2Ugb2JqZWN0IGFsc28gbWF5IGhhdmUgYSBHUEUgYmxvY2suCi0JCSAqLwotCWNhc2UgQUNQSV9UWVBFX0RFVklDRToKLQotCQlpZiAob2JqZWN0LT5kZXZpY2UuZ3BlX2Jsb2NrKSB7Ci0JCQkodm9pZClhY3BpX2V2X2RlbGV0ZV9ncGVfYmxvY2sob2JqZWN0LT5kZXZpY2UuCi0JCQkJCQkgICAgICAgZ3BlX2Jsb2NrKTsKLQkJfQotCi0JCS8qbGludCAtZmFsbHRocm91Z2ggKi8KLQotCWNhc2UgQUNQSV9UWVBFX1BST0NFU1NPUjoKLQljYXNlIEFDUElfVFlQRV9USEVSTUFMOgotCi0JCS8qIFdhbGsgdGhlIG5vdGlmeSBoYW5kbGVyIGxpc3QgZm9yIHRoaXMgb2JqZWN0ICovCi0KLQkJaGFuZGxlcl9kZXNjID0gb2JqZWN0LT5jb21tb25fbm90aWZ5LmhhbmRsZXI7Ci0JCXdoaWxlIChoYW5kbGVyX2Rlc2MpIHsKLQkJCW5leHRfZGVzYyA9IGhhbmRsZXJfZGVzYy0+YWRkcmVzc19zcGFjZS5uZXh0OwotCQkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKGhhbmRsZXJfZGVzYyk7Ci0JCQloYW5kbGVyX2Rlc2MgPSBuZXh0X2Rlc2M7Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIEFDUElfVFlQRV9NVVRFWDoKLQotCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0FMTE9DQVRJT05TLAotCQkJCSAgIioqKioqIE11dGV4ICVwLCBPUyBNdXRleCAlcFxuIiwKLQkJCQkgIG9iamVjdCwgb2JqZWN0LT5tdXRleC5vc19tdXRleCkpOwotCi0JCWlmIChvYmplY3QgPT0gYWNwaV9nYmxfZ2xvYmFsX2xvY2tfbXV0ZXgpIHsKLQotCQkJLyogR2xvYmFsIExvY2sgaGFzIGV4dHJhIHNlbWFwaG9yZSAqLwotCi0JCQkodm9pZCkKLQkJCSAgICBhY3BpX29zX2RlbGV0ZV9zZW1hcGhvcmUKLQkJCSAgICAoYWNwaV9nYmxfZ2xvYmFsX2xvY2tfc2VtYXBob3JlKTsKLQkJCWFjcGlfZ2JsX2dsb2JhbF9sb2NrX3NlbWFwaG9yZSA9IE5VTEw7Ci0KLQkJCWFjcGlfb3NfZGVsZXRlX211dGV4KG9iamVjdC0+bXV0ZXgub3NfbXV0ZXgpOwotCQkJYWNwaV9nYmxfZ2xvYmFsX2xvY2tfbXV0ZXggPSBOVUxMOwotCQl9IGVsc2UgewotCQkJYWNwaV9leF91bmxpbmtfbXV0ZXgob2JqZWN0KTsKLQkJCWFjcGlfb3NfZGVsZXRlX211dGV4KG9iamVjdC0+bXV0ZXgub3NfbXV0ZXgpOwotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBBQ1BJX1RZUEVfRVZFTlQ6Ci0KLQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9BTExPQ0FUSU9OUywKLQkJCQkgICIqKioqKiBFdmVudCAlcCwgT1MgU2VtYXBob3JlICVwXG4iLAotCQkJCSAgb2JqZWN0LCBvYmplY3QtPmV2ZW50Lm9zX3NlbWFwaG9yZSkpOwotCi0JCSh2b2lkKWFjcGlfb3NfZGVsZXRlX3NlbWFwaG9yZShvYmplY3QtPmV2ZW50Lm9zX3NlbWFwaG9yZSk7Ci0JCW9iamVjdC0+ZXZlbnQub3Nfc2VtYXBob3JlID0gTlVMTDsKLQkJYnJlYWs7Ci0KLQljYXNlIEFDUElfVFlQRV9NRVRIT0Q6Ci0KLQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9BTExPQ0FUSU9OUywKLQkJCQkgICIqKioqKiBNZXRob2QgJXBcbiIsIG9iamVjdCkpOwotCi0JCS8qIERlbGV0ZSB0aGUgbWV0aG9kIG11dGV4IGlmIGl0IGV4aXN0cyAqLwotCi0JCWlmIChvYmplY3QtPm1ldGhvZC5tdXRleCkgewotCQkJYWNwaV9vc19kZWxldGVfbXV0ZXgob2JqZWN0LT5tZXRob2QubXV0ZXgtPm11dGV4LgotCQkJCQkgICAgIG9zX211dGV4KTsKLQkJCWFjcGlfdXRfZGVsZXRlX29iamVjdF9kZXNjKG9iamVjdC0+bWV0aG9kLm11dGV4KTsKLQkJCW9iamVjdC0+bWV0aG9kLm11dGV4ID0gTlVMTDsKLQkJfQotCQlicmVhazsKLQotCWNhc2UgQUNQSV9UWVBFX1JFR0lPTjoKLQotCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0FMTE9DQVRJT05TLAotCQkJCSAgIioqKioqIFJlZ2lvbiAlcFxuIiwgb2JqZWN0KSk7Ci0KLQkJc2Vjb25kX2Rlc2MgPSBhY3BpX25zX2dldF9zZWNvbmRhcnlfb2JqZWN0KG9iamVjdCk7Ci0JCWlmIChzZWNvbmRfZGVzYykgewotCQkJLyoKLQkJCSAqIEZyZWUgdGhlIHJlZ2lvbl9jb250ZXh0IGlmIGFuZCBvbmx5IGlmIHRoZSBoYW5kbGVyIGlzIG9uZSBvZiB0aGUKLQkJCSAqIGRlZmF1bHQgaGFuZGxlcnMgLS0gYW5kIHRoZXJlZm9yZSwgd2UgY3JlYXRlZCB0aGUgY29udGV4dCBvYmplY3QKLQkJCSAqIGxvY2FsbHksIGl0IHdhcyBub3QgY3JlYXRlZCBieSBhbiBleHRlcm5hbCBjYWxsZXIuCi0JCQkgKi8KLQkJCWhhbmRsZXJfZGVzYyA9IG9iamVjdC0+cmVnaW9uLmhhbmRsZXI7Ci0JCQlpZiAoaGFuZGxlcl9kZXNjKSB7Ci0JCQkJaWYgKGhhbmRsZXJfZGVzYy0+YWRkcmVzc19zcGFjZS5oYW5kbGVyX2ZsYWdzICYKLQkJCQkgICAgQUNQSV9BRERSX0hBTkRMRVJfREVGQVVMVF9JTlNUQUxMRUQpIHsKLQotCQkJCQkvKiBEZWFjdGl2YXRlIHJlZ2lvbiBhbmQgZnJlZSByZWdpb24gY29udGV4dCAqLwotCi0JCQkJCWlmIChoYW5kbGVyX2Rlc2MtPmFkZHJlc3Nfc3BhY2Uuc2V0dXApIHsKLQkJCQkJCSh2b2lkKWhhbmRsZXJfZGVzYy0+Ci0JCQkJCQkgICAgYWRkcmVzc19zcGFjZS5zZXR1cChvYmplY3QsCi0JCQkJCQkJCQlBQ1BJX1JFR0lPTl9ERUFDVElWQVRFLAotCQkJCQkJCQkJaGFuZGxlcl9kZXNjLT4KLQkJCQkJCQkJCWFkZHJlc3Nfc3BhY2UuCi0JCQkJCQkJCQljb250ZXh0LAotCQkJCQkJCQkJJnNlY29uZF9kZXNjLT4KLQkJCQkJCQkJCWV4dHJhLgotCQkJCQkJCQkJcmVnaW9uX2NvbnRleHQpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKGhhbmRsZXJfZGVzYyk7Ci0JCQl9Ci0KLQkJCS8qIE5vdyB3ZSBjYW4gZnJlZSB0aGUgRXh0cmEgb2JqZWN0ICovCi0KLQkJCWFjcGlfdXRfZGVsZXRlX29iamVjdF9kZXNjKHNlY29uZF9kZXNjKTsKLQkJfQotCQlicmVhazsKLQotCWNhc2UgQUNQSV9UWVBFX0JVRkZFUl9GSUVMRDoKLQotCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0FMTE9DQVRJT05TLAotCQkJCSAgIioqKioqIEJ1ZmZlciBGaWVsZCAlcFxuIiwgb2JqZWN0KSk7Ci0KLQkJc2Vjb25kX2Rlc2MgPSBhY3BpX25zX2dldF9zZWNvbmRhcnlfb2JqZWN0KG9iamVjdCk7Ci0JCWlmIChzZWNvbmRfZGVzYykgewotCQkJYWNwaV91dF9kZWxldGVfb2JqZWN0X2Rlc2Moc2Vjb25kX2Rlc2MpOwotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBBQ1BJX1RZUEVfTE9DQUxfQkFOS19GSUVMRDoKLQotCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0FMTE9DQVRJT05TLAotCQkJCSAgIioqKioqIEJhbmsgRmllbGQgJXBcbiIsIG9iamVjdCkpOwotCi0JCXNlY29uZF9kZXNjID0gYWNwaV9uc19nZXRfc2Vjb25kYXJ5X29iamVjdChvYmplY3QpOwotCQlpZiAoc2Vjb25kX2Rlc2MpIHsKLQkJCWFjcGlfdXRfZGVsZXRlX29iamVjdF9kZXNjKHNlY29uZF9kZXNjKTsKLQkJfQotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX0KLQotCS8qIEZyZWUgYW55IGFsbG9jYXRlZCBtZW1vcnkgKHBvaW50ZXIgd2l0aGluIHRoZSBvYmplY3QpIGZvdW5kIGFib3ZlICovCi0KLQlpZiAob2JqX3BvaW50ZXIpIHsKLQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9BTExPQ0FUSU9OUywKLQkJCQkgICJEZWxldGluZyBPYmplY3QgU3VicHRyICVwXG4iLCBvYmpfcG9pbnRlcikpOwotCQlBQ1BJX0ZSRUUob2JqX3BvaW50ZXIpOwotCX0KLQotCS8qIE5vdyB0aGUgb2JqZWN0IGNhbiBiZSBzYWZlbHkgZGVsZXRlZCAqLwotCi0JQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9BTExPQ0FUSU9OUywgIkRlbGV0aW5nIE9iamVjdCAlcCBbJXNdXG4iLAotCQkJICBvYmplY3QsIGFjcGlfdXRfZ2V0X29iamVjdF90eXBlX25hbWUob2JqZWN0KSkpOwotCi0JYWNwaV91dF9kZWxldGVfb2JqZWN0X2Rlc2Mob2JqZWN0KTsKLQlyZXR1cm5fVk9JRDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV91dF9kZWxldGVfaW50ZXJuYWxfb2JqZWN0X2xpc3QKLSAqCi0gKiBQQVJBTUVURVJTOiAgb2JqX2xpc3QgICAgICAgIC0gUG9pbnRlciB0byB0aGUgbGlzdCB0byBiZSBkZWxldGVkCi0gKgotICogUkVUVVJOOiAgICAgIE5vbmUKLSAqCi0gKiBERVNDUklQVElPTjogVGhpcyBmdW5jdGlvbiBkZWxldGVzIGFuIGludGVybmFsIG9iamVjdCBsaXN0LCBpbmNsdWRpbmcgYm90aAotICogICAgICAgICAgICAgIHNpbXBsZSBvYmplY3RzIGFuZCBwYWNrYWdlIG9iamVjdHMKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi12b2lkIGFjcGlfdXRfZGVsZXRlX2ludGVybmFsX29iamVjdF9saXN0KHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKipvYmpfbGlzdCkKLXsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICoqaW50ZXJuYWxfb2JqOwotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSh1dF9kZWxldGVfaW50ZXJuYWxfb2JqZWN0X2xpc3QpOwotCi0JLyogV2FsayB0aGUgbnVsbC10ZXJtaW5hdGVkIGludGVybmFsIGxpc3QgKi8KLQotCWZvciAoaW50ZXJuYWxfb2JqID0gb2JqX2xpc3Q7ICppbnRlcm5hbF9vYmo7IGludGVybmFsX29iaisrKSB7Ci0JCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZSgqaW50ZXJuYWxfb2JqKTsKLQl9Ci0KLQkvKiBGcmVlIHRoZSBjb21iaW5lZCBwYXJhbWV0ZXIgcG9pbnRlciBsaXN0IGFuZCBvYmplY3QgYXJyYXkgKi8KLQotCUFDUElfRlJFRShvYmpfbGlzdCk7Ci0JcmV0dXJuX1ZPSUQ7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfdXRfdXBkYXRlX3JlZl9jb3VudAotICoKLSAqIFBBUkFNRVRFUlM6ICBPYmplY3QgICAgICAgICAgLSBPYmplY3Qgd2hvc2UgcmVmIGNvdW50IGlzIHRvIGJlIHVwZGF0ZWQKLSAqICAgICAgICAgICAgICBBY3Rpb24gICAgICAgICAgLSBXaGF0IHRvIGRvCi0gKgotICogUkVUVVJOOiAgICAgIE5ldyByZWYgY291bnQKLSAqCi0gKiBERVNDUklQVElPTjogTW9kaWZ5IHRoZSByZWYgY291bnQgYW5kIHJldHVybiBpdC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgdm9pZAotYWNwaV91dF91cGRhdGVfcmVmX2NvdW50KHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9iamVjdCwgdTMyIGFjdGlvbikKLXsKLQl1MTYgY291bnQ7Ci0JdTE2IG5ld19jb3VudDsKLQotCUFDUElfRlVOQ1RJT05fTkFNRSh1dF91cGRhdGVfcmVmX2NvdW50KTsKLQotCWlmICghb2JqZWN0KSB7Ci0JCXJldHVybjsKLQl9Ci0KLQljb3VudCA9IG9iamVjdC0+Y29tbW9uLnJlZmVyZW5jZV9jb3VudDsKLQluZXdfY291bnQgPSBjb3VudDsKLQotCS8qCi0JICogUGVyZm9ybSB0aGUgcmVmZXJlbmNlIGNvdW50IGFjdGlvbiAoaW5jcmVtZW50LCBkZWNyZW1lbnQsIGZvcmNlIGRlbGV0ZSkKLQkgKi8KLQlzd2l0Y2ggKGFjdGlvbikgewotCWNhc2UgUkVGX0lOQ1JFTUVOVDoKLQotCQluZXdfY291bnQrKzsKLQkJb2JqZWN0LT5jb21tb24ucmVmZXJlbmNlX2NvdW50ID0gbmV3X2NvdW50OwotCi0JCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfQUxMT0NBVElPTlMsCi0JCQkJICAiT2JqICVwIFJlZnM9JVgsIFtJbmNyZW1lbnRlZF1cbiIsCi0JCQkJICBvYmplY3QsIG5ld19jb3VudCkpOwotCQlicmVhazsKLQotCWNhc2UgUkVGX0RFQ1JFTUVOVDoKLQotCQlpZiAoY291bnQgPCAxKSB7Ci0JCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0FMTE9DQVRJT05TLAotCQkJCQkgICJPYmogJXAgUmVmcz0lWCwgY2FuJ3QgZGVjcmVtZW50ISAoU2V0IHRvIDApXG4iLAotCQkJCQkgIG9iamVjdCwgbmV3X2NvdW50KSk7Ci0KLQkJCW5ld19jb3VudCA9IDA7Ci0JCX0gZWxzZSB7Ci0JCQluZXdfY291bnQtLTsKLQotCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9BTExPQ0FUSU9OUywKLQkJCQkJICAiT2JqICVwIFJlZnM9JVgsIFtEZWNyZW1lbnRlZF1cbiIsCi0JCQkJCSAgb2JqZWN0LCBuZXdfY291bnQpKTsKLQkJfQotCi0JCWlmIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRShvYmplY3QpID09IEFDUElfVFlQRV9NRVRIT0QpIHsKLQkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfQUxMT0NBVElPTlMsCi0JCQkJCSAgIk1ldGhvZCBPYmogJXAgUmVmcz0lWCwgW0RlY3JlbWVudGVkXVxuIiwKLQkJCQkJICBvYmplY3QsIG5ld19jb3VudCkpOwotCQl9Ci0KLQkJb2JqZWN0LT5jb21tb24ucmVmZXJlbmNlX2NvdW50ID0gbmV3X2NvdW50OwotCQlpZiAobmV3X2NvdW50ID09IDApIHsKLQkJCWFjcGlfdXRfZGVsZXRlX2ludGVybmFsX29iaihvYmplY3QpOwotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBSRUZfRk9SQ0VfREVMRVRFOgotCi0JCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfQUxMT0NBVElPTlMsCi0JCQkJICAiT2JqICVwIFJlZnM9JVgsIEZvcmNlIGRlbGV0ZSEgKFNldCB0byAwKVxuIiwKLQkJCQkgIG9iamVjdCwgY291bnQpKTsKLQotCQluZXdfY291bnQgPSAwOwotCQlvYmplY3QtPmNvbW1vbi5yZWZlcmVuY2VfY291bnQgPSBuZXdfY291bnQ7Ci0JCWFjcGlfdXRfZGVsZXRlX2ludGVybmFsX29iaihvYmplY3QpOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0KLQkJQUNQSV9FUlJPUigoQUVfSU5GTywgIlVua25vd24gYWN0aW9uICglWCkiLCBhY3Rpb24pKTsKLQkJYnJlYWs7Ci0JfQotCi0JLyoKLQkgKiBTYW5pdHkgY2hlY2sgdGhlIHJlZmVyZW5jZSBjb3VudCwgZm9yIGRlYnVnIHB1cnBvc2VzIG9ubHkuCi0JICogKEEgZGVsZXRlZCBvYmplY3Qgd2lsbCBoYXZlIGEgaHVnZSByZWZlcmVuY2UgY291bnQpCi0JICovCi0JaWYgKGNvdW50ID4gQUNQSV9NQVhfUkVGRVJFTkNFX0NPVU5UKSB7Ci0JCUFDUElfV0FSTklORygoQUVfSU5GTywKLQkJCSAgICAgICJMYXJnZSBSZWZlcmVuY2UgQ291bnQgKCVYKSBpbiBvYmplY3QgJXAiLCBjb3VudCwKLQkJCSAgICAgIG9iamVjdCkpOwotCX0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV91dF91cGRhdGVfb2JqZWN0X3JlZmVyZW5jZQotICoKLSAqIFBBUkFNRVRFUlM6ICBPYmplY3QgICAgICAgICAgICAgIC0gSW5jcmVtZW50IHJlZiBjb3VudCBmb3IgdGhpcyBvYmplY3QKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGFsbCBzdWItb2JqZWN0cwotICogICAgICAgICAgICAgIEFjdGlvbiAgICAgICAgICAgICAgLSBFaXRoZXIgUkVGX0lOQ1JFTUVOVCBvciBSRUZfREVDUkVNRU5UIG9yCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFRl9GT1JDRV9ERUxFVEUKLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IEluY3JlbWVudCB0aGUgb2JqZWN0IHJlZmVyZW5jZSBjb3VudAotICoKLSAqIE9iamVjdCByZWZlcmVuY2VzIGFyZSBpbmNyZW1lbnRlZCB3aGVuOgotICogMSkgQW4gb2JqZWN0IGlzIGF0dGFjaGVkIHRvIGEgTm9kZSAobmFtZXNwYWNlIG9iamVjdCkKLSAqIDIpIEFuIG9iamVjdCBpcyBjb3BpZWQgKGFsbCBzdWJvYmplY3RzIG11c3QgYmUgaW5jcmVtZW50ZWQpCi0gKgotICogT2JqZWN0IHJlZmVyZW5jZXMgYXJlIGRlY3JlbWVudGVkIHdoZW46Ci0gKiAxKSBBbiBvYmplY3QgaXMgZGV0YWNoZWQgZnJvbSBhbiBOb2RlCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotYWNwaV9zdGF0dXMKLWFjcGlfdXRfdXBkYXRlX29iamVjdF9yZWZlcmVuY2UodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqZWN0LCB1MTYgYWN0aW9uKQotewotCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOwotCXVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSAqc3RhdGVfbGlzdCA9IE5VTEw7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqbmV4dF9vYmplY3QgPSBOVUxMOwotCXVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSAqc3RhdGU7Ci0JdTMyIGk7Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUih1dF91cGRhdGVfb2JqZWN0X3JlZmVyZW5jZSwgb2JqZWN0KTsKLQotCXdoaWxlIChvYmplY3QpIHsKLQotCQkvKiBNYWtlIHN1cmUgdGhhdCB0aGlzIGlzbid0IGEgbmFtZXNwYWNlIGhhbmRsZSAqLwotCi0JCWlmIChBQ1BJX0dFVF9ERVNDUklQVE9SX1RZUEUob2JqZWN0KSA9PSBBQ1BJX0RFU0NfVFlQRV9OQU1FRCkgewotCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9BTExPQ0FUSU9OUywKLQkJCQkJICAiT2JqZWN0ICVwIGlzIE5TIGhhbmRsZVxuIiwgb2JqZWN0KSk7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwotCQl9Ci0KLQkJLyoKLQkJICogQWxsIHN1Yi1vYmplY3RzIG11c3QgaGF2ZSB0aGVpciByZWZlcmVuY2UgY291bnQgaW5jcmVtZW50ZWQgYWxzby4KLQkJICogRGlmZmVyZW50IG9iamVjdCB0eXBlcyBoYXZlIGRpZmZlcmVudCBzdWJvYmplY3RzLgotCQkgKi8KLQkJc3dpdGNoIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRShvYmplY3QpKSB7Ci0JCWNhc2UgQUNQSV9UWVBFX0RFVklDRToKLQkJY2FzZSBBQ1BJX1RZUEVfUFJPQ0VTU09SOgotCQljYXNlIEFDUElfVFlQRV9QT1dFUjoKLQkJY2FzZSBBQ1BJX1RZUEVfVEhFUk1BTDoKLQotCQkJLyogVXBkYXRlIHRoZSBub3RpZnkgb2JqZWN0cyBmb3IgdGhlc2UgdHlwZXMgKGlmIHByZXNlbnQpICovCi0KLQkJCWFjcGlfdXRfdXBkYXRlX3JlZl9jb3VudChvYmplY3QtPmNvbW1vbl9ub3RpZnkuCi0JCQkJCQkgc3lzdGVtX25vdGlmeSwgYWN0aW9uKTsKLQkJCWFjcGlfdXRfdXBkYXRlX3JlZl9jb3VudChvYmplY3QtPmNvbW1vbl9ub3RpZnkuCi0JCQkJCQkgZGV2aWNlX25vdGlmeSwgYWN0aW9uKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgQUNQSV9UWVBFX1BBQ0tBR0U6Ci0JCQkvKgotCQkJICogV2UgbXVzdCB1cGRhdGUgYWxsIHRoZSBzdWItb2JqZWN0cyBvZiB0aGUgcGFja2FnZSwKLQkJCSAqIGVhY2ggb2Ygd2hvbSBtYXkgaGF2ZSB0aGVpciBvd24gc3ViLW9iamVjdHMuCi0JCQkgKi8KLQkJCWZvciAoaSA9IDA7IGkgPCBvYmplY3QtPnBhY2thZ2UuY291bnQ7IGkrKykgewotCQkJCS8qCi0JCQkJICogUHVzaCBlYWNoIGVsZW1lbnQgb250byB0aGUgc3RhY2sgZm9yIGxhdGVyIHByb2Nlc3NpbmcuCi0JCQkJICogTm90ZTogVGhlcmUgY2FuIGJlIG51bGwgZWxlbWVudHMgd2l0aGluIHRoZSBwYWNrYWdlLAotCQkJCSAqIHRoZXNlIGFyZSBzaW1wbHkgaWdub3JlZAotCQkJCSAqLwotCQkJCXN0YXR1cyA9Ci0JCQkJICAgIGFjcGlfdXRfY3JlYXRlX3VwZGF0ZV9zdGF0ZV9hbmRfcHVzaAotCQkJCSAgICAob2JqZWN0LT5wYWNrYWdlLmVsZW1lbnRzW2ldLCBhY3Rpb24sCi0JCQkJICAgICAmc3RhdGVfbGlzdCk7Ci0JCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCQkJCWdvdG8gZXJyb3JfZXhpdDsKLQkJCQl9Ci0JCQl9Ci0JCQlicmVhazsKLQotCQljYXNlIEFDUElfVFlQRV9CVUZGRVJfRklFTEQ6Ci0KLQkJCW5leHRfb2JqZWN0ID0gb2JqZWN0LT5idWZmZXJfZmllbGQuYnVmZmVyX29iajsKLQkJCWJyZWFrOwotCi0JCWNhc2UgQUNQSV9UWVBFX0xPQ0FMX1JFR0lPTl9GSUVMRDoKLQotCQkJbmV4dF9vYmplY3QgPSBvYmplY3QtPmZpZWxkLnJlZ2lvbl9vYmo7Ci0JCQlicmVhazsKLQotCQljYXNlIEFDUElfVFlQRV9MT0NBTF9CQU5LX0ZJRUxEOgotCi0JCQluZXh0X29iamVjdCA9IG9iamVjdC0+YmFua19maWVsZC5iYW5rX29iajsKLQkJCXN0YXR1cyA9Ci0JCQkgICAgYWNwaV91dF9jcmVhdGVfdXBkYXRlX3N0YXRlX2FuZF9wdXNoKG9iamVjdC0+Ci0JCQkJCQkJCSBiYW5rX2ZpZWxkLgotCQkJCQkJCQkgcmVnaW9uX29iaiwKLQkJCQkJCQkJIGFjdGlvbiwKLQkJCQkJCQkJICZzdGF0ZV9saXN0KTsKLQkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQkJCWdvdG8gZXJyb3JfZXhpdDsKLQkJCX0KLQkJCWJyZWFrOwotCi0JCWNhc2UgQUNQSV9UWVBFX0xPQ0FMX0lOREVYX0ZJRUxEOgotCi0JCQluZXh0X29iamVjdCA9IG9iamVjdC0+aW5kZXhfZmllbGQuaW5kZXhfb2JqOwotCQkJc3RhdHVzID0KLQkJCSAgICBhY3BpX3V0X2NyZWF0ZV91cGRhdGVfc3RhdGVfYW5kX3B1c2gob2JqZWN0LT4KLQkJCQkJCQkJIGluZGV4X2ZpZWxkLgotCQkJCQkJCQkgZGF0YV9vYmosCi0JCQkJCQkJCSBhY3Rpb24sCi0JCQkJCQkJCSAmc3RhdGVfbGlzdCk7Ci0JCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJCQlnb3RvIGVycm9yX2V4aXQ7Ci0JCQl9Ci0JCQlicmVhazsKLQotCQljYXNlIEFDUElfVFlQRV9MT0NBTF9SRUZFUkVOQ0U6Ci0JCQkvKgotCQkJICogVGhlIHRhcmdldCBvZiBhbiBJbmRleCAoYSBwYWNrYWdlLCBzdHJpbmcsIG9yIGJ1ZmZlcikgb3IgYSBuYW1lZAotCQkJICogcmVmZXJlbmNlIG11c3QgdHJhY2sgY2hhbmdlcyB0byB0aGUgcmVmIGNvdW50IG9mIHRoZSBpbmRleCBvcgotCQkJICogdGFyZ2V0IG9iamVjdC4KLQkJCSAqLwotCQkJaWYgKChvYmplY3QtPnJlZmVyZW5jZS5jbGFzcyA9PSBBQ1BJX1JFRkNMQVNTX0lOREVYKSB8fAotCQkJICAgIChvYmplY3QtPnJlZmVyZW5jZS5jbGFzcyA9PSBBQ1BJX1JFRkNMQVNTX05BTUUpKSB7Ci0JCQkJbmV4dF9vYmplY3QgPSBvYmplY3QtPnJlZmVyZW5jZS5vYmplY3Q7Ci0JCQl9Ci0JCQlicmVhazsKLQotCQljYXNlIEFDUElfVFlQRV9SRUdJT046Ci0JCWRlZmF1bHQ6Ci0JCQlicmVhazsJLyogTm8gc3Vib2JqZWN0cyBmb3IgYWxsIG90aGVyIHR5cGVzICovCi0JCX0KLQotCQkvKgotCQkgKiBOb3cgd2UgY2FuIHVwZGF0ZSB0aGUgY291bnQgaW4gdGhlIG1haW4gb2JqZWN0LiBUaGlzIGNhbiBvbmx5Ci0JCSAqIGhhcHBlbiBhZnRlciB3ZSB1cGRhdGUgdGhlIHN1Yi1vYmplY3RzIGluIGNhc2UgdGhpcyBjYXVzZXMgdGhlCi0JCSAqIG1haW4gb2JqZWN0IHRvIGJlIGRlbGV0ZWQuCi0JCSAqLwotCQlhY3BpX3V0X3VwZGF0ZV9yZWZfY291bnQob2JqZWN0LCBhY3Rpb24pOwotCQlvYmplY3QgPSBOVUxMOwotCi0JCS8qIE1vdmUgb24gdG8gdGhlIG5leHQgb2JqZWN0IHRvIGJlIHVwZGF0ZWQgKi8KLQotCQlpZiAobmV4dF9vYmplY3QpIHsKLQkJCW9iamVjdCA9IG5leHRfb2JqZWN0OwotCQkJbmV4dF9vYmplY3QgPSBOVUxMOwotCQl9IGVsc2UgaWYgKHN0YXRlX2xpc3QpIHsKLQkJCXN0YXRlID0gYWNwaV91dF9wb3BfZ2VuZXJpY19zdGF0ZSgmc3RhdGVfbGlzdCk7Ci0JCQlvYmplY3QgPSBzdGF0ZS0+dXBkYXRlLm9iamVjdDsKLQkJCWFjcGlfdXRfZGVsZXRlX2dlbmVyaWNfc3RhdGUoc3RhdGUpOwotCQl9Ci0JfQotCi0JcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKLQotICAgICAgZXJyb3JfZXhpdDoKLQotCUFDUElfRVhDRVBUSU9OKChBRV9JTkZPLCBzdGF0dXMsCi0JCQkiQ291bGQgbm90IHVwZGF0ZSBvYmplY3QgcmVmZXJlbmNlIGNvdW50IikpOwotCi0JLyogRnJlZSBhbnkgc3RhY2tlZCBVcGRhdGUgU3RhdGUgb2JqZWN0cyAqLwotCi0Jd2hpbGUgKHN0YXRlX2xpc3QpIHsKLQkJc3RhdGUgPSBhY3BpX3V0X3BvcF9nZW5lcmljX3N0YXRlKCZzdGF0ZV9saXN0KTsKLQkJYWNwaV91dF9kZWxldGVfZ2VuZXJpY19zdGF0ZShzdGF0ZSk7Ci0JfQotCi0JcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfdXRfYWRkX3JlZmVyZW5jZQotICoKLSAqIFBBUkFNRVRFUlM6ICBPYmplY3QgICAgICAgICAgLSBPYmplY3Qgd2hvc2UgcmVmZXJlbmNlIGNvdW50IGlzIHRvIGJlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jcmVtZW50ZWQKLSAqCi0gKiBSRVRVUk46ICAgICAgTm9uZQotICoKLSAqIERFU0NSSVBUSU9OOiBBZGQgb25lIHJlZmVyZW5jZSB0byBhbiBBQ1BJIG9iamVjdAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXZvaWQgYWNwaV91dF9hZGRfcmVmZXJlbmNlKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9iamVjdCkKLXsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKHV0X2FkZF9yZWZlcmVuY2UsIG9iamVjdCk7Ci0KLQkvKiBFbnN1cmUgdGhhdCB3ZSBoYXZlIGEgdmFsaWQgb2JqZWN0ICovCi0KLQlpZiAoIWFjcGlfdXRfdmFsaWRfaW50ZXJuYWxfb2JqZWN0KG9iamVjdCkpIHsKLQkJcmV0dXJuX1ZPSUQ7Ci0JfQotCi0JQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9BTExPQ0FUSU9OUywKLQkJCSAgIk9iaiAlcCBDdXJyZW50IFJlZnM9JVggW1RvIEJlIEluY3JlbWVudGVkXVxuIiwKLQkJCSAgb2JqZWN0LCBvYmplY3QtPmNvbW1vbi5yZWZlcmVuY2VfY291bnQpKTsKLQotCS8qIEluY3JlbWVudCB0aGUgcmVmZXJlbmNlIGNvdW50ICovCi0KLQkodm9pZClhY3BpX3V0X3VwZGF0ZV9vYmplY3RfcmVmZXJlbmNlKG9iamVjdCwgUkVGX0lOQ1JFTUVOVCk7Ci0JcmV0dXJuX1ZPSUQ7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZQotICoKLSAqIFBBUkFNRVRFUlM6ICBPYmplY3QgICAgICAgICAtIE9iamVjdCB3aG9zZSByZWYgY291bnQgd2lsbCBiZSBkZWNyZW1lbnRlZAotICoKLSAqIFJFVFVSTjogICAgICBOb25lCi0gKgotICogREVTQ1JJUFRJT046IERlY3JlbWVudCB0aGUgcmVmZXJlbmNlIGNvdW50IG9mIGFuIEFDUEkgaW50ZXJuYWwgb2JqZWN0Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdm9pZCBhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqZWN0KQotewotCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIodXRfcmVtb3ZlX3JlZmVyZW5jZSwgb2JqZWN0KTsKLQotCS8qCi0JICogQWxsb3cgYSBOVUxMIHBvaW50ZXIgdG8gYmUgcGFzc2VkIGluLCBqdXN0IGlnbm9yZSBpdC4gVGhpcyBzYXZlcwotCSAqIGVhY2ggY2FsbGVyIGZyb20gaGF2aW5nIHRvIGNoZWNrLiBBbHNvLCBpZ25vcmUgTlMgbm9kZXMuCi0JICoKLQkgKi8KLQlpZiAoIW9iamVjdCB8fAotCSAgICAoQUNQSV9HRVRfREVTQ1JJUFRPUl9UWVBFKG9iamVjdCkgPT0gQUNQSV9ERVNDX1RZUEVfTkFNRUQpKSB7Ci0JCXJldHVybl9WT0lEOwotCX0KLQotCS8qIEVuc3VyZSB0aGF0IHdlIGhhdmUgYSB2YWxpZCBvYmplY3QgKi8KLQotCWlmICghYWNwaV91dF92YWxpZF9pbnRlcm5hbF9vYmplY3Qob2JqZWN0KSkgewotCQlyZXR1cm5fVk9JRDsKLQl9Ci0KLQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0FMTE9DQVRJT05TLAotCQkJICAiT2JqICVwIEN1cnJlbnQgUmVmcz0lWCBbVG8gQmUgRGVjcmVtZW50ZWRdXG4iLAotCQkJICBvYmplY3QsIG9iamVjdC0+Y29tbW9uLnJlZmVyZW5jZV9jb3VudCkpOwotCi0JLyoKLQkgKiBEZWNyZW1lbnQgdGhlIHJlZmVyZW5jZSBjb3VudCwgYW5kIG9ubHkgYWN0dWFsbHkgZGVsZXRlIHRoZSBvYmplY3QKLQkgKiBpZiB0aGUgcmVmZXJlbmNlIGNvdW50IGJlY29tZXMgMC4gKE11c3QgYWxzbyBkZWNyZW1lbnQgdGhlIHJlZiBjb3VudAotCSAqIG9mIGFsbCBzdWJvYmplY3RzISkKLQkgKi8KLQkodm9pZClhY3BpX3V0X3VwZGF0ZV9vYmplY3RfcmVmZXJlbmNlKG9iamVjdCwgUkVGX0RFQ1JFTUVOVCk7Ci0JcmV0dXJuX1ZPSUQ7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0ZXZhbC5jIGIvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dGV2YWwuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzUyNzQ3ZS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0ZXZhbC5jCisrKyAvZGV2L251bGwKQEAgLTEsNzUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBNb2R1bGUgTmFtZTogdXRldmFsIC0gT2JqZWN0IGV2YWx1YXRpb24KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA4LCBJbnRlbCBDb3JwLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAotICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgYXQgbWluaW11bSBhIGRpc2NsYWltZXIKLSAqICAgIHN1YnN0YW50aWFsbHkgc2ltaWxhciB0byB0aGUgIk5PIFdBUlJBTlRZIiBkaXNjbGFpbWVyIGJlbG93Ci0gKiAgICAoIkRpc2NsYWltZXIiKSBhbmQgYW55IHJlZGlzdHJpYnV0aW9uIG11c3QgYmUgY29uZGl0aW9uZWQgdXBvbgotICogICAgaW5jbHVkaW5nIGEgc3Vic3RhbnRpYWxseSBzaW1pbGFyIERpc2NsYWltZXIgcmVxdWlyZW1lbnQgZm9yIGZ1cnRoZXIKLSAqICAgIGJpbmFyeSByZWRpc3RyaWJ1dGlvbi4KLSAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcwotICogICAgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICogU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBOTyBXQVJSQU5UWQotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCi0gKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUwotICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcKLSAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQotICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgotICovCi0KLSNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KLSNpbmNsdWRlIDxhY3BpL2FjbmFtZXNwLmg+Ci0jaW5jbHVkZSA8YWNwaS9hY2ludGVycC5oPgotCi0jZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9VVElMSVRJRVMKLUFDUElfTU9EVUxFX05BTUUoInV0ZXZhbCIpCi0KLS8qIExvY2FsIHByb3RvdHlwZXMgKi8KLXN0YXRpYyB2b2lkCi1hY3BpX3V0X2NvcHlfaWRfc3RyaW5nKGNoYXIgKmRlc3RpbmF0aW9uLCBjaGFyICpzb3VyY2UsIGFjcGlfc2l6ZSBtYXhfbGVuZ3RoKTsKLQotc3RhdGljIGFjcGlfc3RhdHVzCi1hY3BpX3V0X3RyYW5zbGF0ZV9vbmVfY2lkKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjLAotCQkJICBzdHJ1Y3QgYWNwaV9jb21wYXRpYmxlX2lkICpvbmVfY2lkKTsKLQotLyoKLSAqIFN0cmluZ3Mgc3VwcG9ydGVkIGJ5IHRoZSBfT1NJIHByZWRlZmluZWQgKGludGVybmFsKSBtZXRob2QuCi0gKi8KLXN0YXRpYyBjaGFyICphY3BpX2ludGVyZmFjZXNfc3VwcG9ydGVkW10gPSB7Ci0JLyogT3BlcmF0aW5nIFN5c3RlbSBWZW5kb3IgU3RyaW5ncyAqLwotCi0JIldpbmRvd3MgMjAwMCIsCQkvKiBXaW5kb3dzIDIwMDAgKi8KLQkiV2luZG93cyAyMDAxIiwJCS8qIFdpbmRvd3MgWFAgKi8KLQkiV2luZG93cyAyMDAxIFNQMSIsCS8qIFdpbmRvd3MgWFAgU1AxICovCi0JIldpbmRvd3MgMjAwMSBTUDIiLAkvKiBXaW5kb3dzIFhQIFNQMiAqLwotCSJXaW5kb3dzIDIwMDEuMSIsCS8qIFdpbmRvd3MgU2VydmVyIDIwMDMgKi8KLQkiV2luZG93cyAyMDAxLjEgU1AxIiwJLyogV2luZG93cyBTZXJ2ZXIgMjAwMyBTUDEgLSBBZGRlZCAwMy8yMDA2ICovCi0JIldpbmRvd3MgMjAwNiIsCQkvKiBXaW5kb3dzIFZpc3RhIC0gQWRkZWQgMDMvMjAwNiAqLwotCi0JLyogRmVhdHVyZSBHcm91cCBTdHJpbmdzICovCi0KLQkiRXh0ZW5kZWQgQWRkcmVzcyBTcGFjZSBEZXNjcmlwdG9yIgotCSAgICAvKgotCSAgICAgKiBBbGwgIm9wdGlvbmFsIiBmZWF0dXJlIGdyb3VwIHN0cmluZ3MgKGZlYXR1cmVzIHRoYXQgYXJlIGltcGxlbWVudGVkCi0JICAgICAqIGJ5IHRoZSBob3N0KSBzaG91bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIGhvc3QgdmVyc2lvbiBvZgotCSAgICAgKiBhY3BpX29zX3ZhbGlkYXRlX2ludGVyZmFjZSBhbmQgc2hvdWxkIG5vdCBiZSBhZGRlZCBoZXJlLgotCSAgICAgKi8KLX07Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfdXRfb3NpX2ltcGxlbWVudGF0aW9uCi0gKgotICogUEFSQU1FVEVSUzogIHdhbGtfc3RhdGUgICAgICAgICAgLSBDdXJyZW50IHdhbGsgc3RhdGUKLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IEltcGxlbWVudGF0aW9uIG9mIHRoZSBfT1NJIHByZWRlZmluZWQgY29udHJvbCBtZXRob2QKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1hY3BpX3N0YXR1cyBhY3BpX3V0X29zaV9pbXBsZW1lbnRhdGlvbihzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKQotewotCWFjcGlfc3RhdHVzIHN0YXR1czsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpzdHJpbmdfZGVzYzsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpyZXR1cm5fZGVzYzsKLQl1MzIgaTsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UodXRfb3NpX2ltcGxlbWVudGF0aW9uKTsKLQotCS8qIFZhbGlkYXRlIHRoZSBzdHJpbmcgaW5wdXQgYXJndW1lbnQgKi8KLQotCXN0cmluZ19kZXNjID0gd2Fsa19zdGF0ZS0+YXJndW1lbnRzWzBdLm9iamVjdDsKLQlpZiAoIXN0cmluZ19kZXNjIHx8IChzdHJpbmdfZGVzYy0+Y29tbW9uLnR5cGUgIT0gQUNQSV9UWVBFX1NUUklORykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX1RZUEUpOwotCX0KLQotCS8qIENyZWF0ZSBhIHJldHVybiBvYmplY3QgKi8KLQotCXJldHVybl9kZXNjID0gYWNwaV91dF9jcmVhdGVfaW50ZXJuYWxfb2JqZWN0KEFDUElfVFlQRV9JTlRFR0VSKTsKLQlpZiAoIXJldHVybl9kZXNjKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT19NRU1PUlkpOwotCX0KLQotCS8qIERlZmF1bHQgcmV0dXJuIHZhbHVlIGlzIFNVUFBPUlRFRCAqLwotCi0JcmV0dXJuX2Rlc2MtPmludGVnZXIudmFsdWUgPSBBQ1BJX1VJTlQzMl9NQVg7Ci0Jd2Fsa19zdGF0ZS0+cmV0dXJuX2Rlc2MgPSByZXR1cm5fZGVzYzsKLQotCS8qIENvbXBhcmUgaW5wdXQgc3RyaW5nIHRvIHN0YXRpYyB0YWJsZSBvZiBzdXBwb3J0ZWQgaW50ZXJmYWNlcyAqLwotCi0JZm9yIChpID0gMDsgaSA8IEFDUElfQVJSQVlfTEVOR1RIKGFjcGlfaW50ZXJmYWNlc19zdXBwb3J0ZWQpOyBpKyspIHsKLQkJaWYgKCFBQ1BJX1NUUkNNUAotCQkgICAgKHN0cmluZ19kZXNjLT5zdHJpbmcucG9pbnRlciwKLQkJICAgICBhY3BpX2ludGVyZmFjZXNfc3VwcG9ydGVkW2ldKSkgewotCi0JCQkvKiBUaGUgaW50ZXJmYWNlIGlzIHN1cHBvcnRlZCAqLwotCi0JCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQ1RSTF9URVJNSU5BVEUpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBEaWQgbm90IG1hdGNoIHRoZSBzdHJpbmcgaW4gdGhlIHN0YXRpYyB0YWJsZSwgY2FsbCB0aGUgaG9zdCBPU0wgdG8KLQkgKiBjaGVjayBmb3IgYSBtYXRjaCB3aXRoIG9uZSBvZiB0aGUgb3B0aW9uYWwgc3RyaW5ncyAoc3VjaCBhcwotCSAqICJNb2R1bGUgRGV2aWNlIiwgIjMuMCBUaGVybWFsIE1vZGVsIiwgZXRjLikKLQkgKi8KLQlzdGF0dXMgPSBhY3BpX29zX3ZhbGlkYXRlX2ludGVyZmFjZShzdHJpbmdfZGVzYy0+c3RyaW5nLnBvaW50ZXIpOwotCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkgewotCi0JCS8qIFRoZSBpbnRlcmZhY2UgaXMgc3VwcG9ydGVkICovCi0KLQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0NUUkxfVEVSTUlOQVRFKTsKLQl9Ci0KLQkvKiBUaGUgaW50ZXJmYWNlIGlzIG5vdCBzdXBwb3J0ZWQgKi8KLQotCXJldHVybl9kZXNjLT5pbnRlZ2VyLnZhbHVlID0gMDsKLQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQ1RSTF9URVJNSU5BVEUpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX29zaV9pbnZhbGlkYXRlCi0gKgotICogUEFSQU1FVEVSUzogIGludGVyZmFjZV9zdHJpbmcKLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IGludmFsaWRhdGUgc3RyaW5nIGluIHByZS1kZWZpZW5kIF9PU0kgc3RyaW5nIGxpc3QKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1hY3BpX3N0YXR1cyBhY3BpX29zaV9pbnZhbGlkYXRlKGNoYXIgKmludGVyZmFjZSkKLXsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBBQ1BJX0FSUkFZX0xFTkdUSChhY3BpX2ludGVyZmFjZXNfc3VwcG9ydGVkKTsgaSsrKSB7Ci0JCWlmICghQUNQSV9TVFJDTVAoaW50ZXJmYWNlLCBhY3BpX2ludGVyZmFjZXNfc3VwcG9ydGVkW2ldKSkgewotCQkJKmFjcGlfaW50ZXJmYWNlc19zdXBwb3J0ZWRbaV0gPSAnXDAnOwotCQkJcmV0dXJuIEFFX09LOwotCQl9Ci0JfQotCXJldHVybiBBRV9OT1RfRk9VTkQ7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfdXRfZXZhbHVhdGVfb2JqZWN0Ci0gKgotICogUEFSQU1FVEVSUzogIHByZWZpeF9ub2RlICAgICAgICAgLSBTdGFydGluZyBub2RlCi0gKiAgICAgICAgICAgICAgUGF0aCAgICAgICAgICAgICAgICAtIFBhdGggdG8gb2JqZWN0IGZyb20gc3RhcnRpbmcgbm9kZQotICogICAgICAgICAgICAgIGV4cGVjdGVkX3JldHVybl90eXBlcyAtIEJpdG1hcCBvZiBhbGxvd2VkIHJldHVybiB0eXBlcwotICogICAgICAgICAgICAgIHJldHVybl9kZXNjICAgICAgICAgLSBXaGVyZSBhIHJldHVybiB2YWx1ZSBpcyBzdG9yZWQKLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IEV2YWx1YXRlcyBhIG5hbWVzcGFjZSBvYmplY3QgYW5kIHZlcmlmaWVzIHRoZSB0eXBlIG9mIHRoZQotICogICAgICAgICAgICAgIHJldHVybiBvYmplY3QuICBDb21tb24gY29kZSB0aGF0IHNpbXBsaWZpZXMgYWNjZXNzaW5nIG9iamVjdHMKLSAqICAgICAgICAgICAgICB0aGF0IGhhdmUgcmVxdWlyZWQgcmV0dXJuIG9iamVjdHMgb2YgZml4ZWQgdHlwZXMuCi0gKgotICogICAgICAgICAgICAgIE5PVEU6IEludGVybmFsIGZ1bmN0aW9uLCBubyBwYXJhbWV0ZXIgdmFsaWRhdGlvbgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWFjcGlfc3RhdHVzCi1hY3BpX3V0X2V2YWx1YXRlX29iamVjdChzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqcHJlZml4X25vZGUsCi0JCQljaGFyICpwYXRoLAotCQkJdTMyIGV4cGVjdGVkX3JldHVybl9idHlwZXMsCi0JCQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICoqcmV0dXJuX2Rlc2MpCi17Ci0Jc3RydWN0IGFjcGlfZXZhbHVhdGVfaW5mbyAqaW5mbzsKLQlhY3BpX3N0YXR1cyBzdGF0dXM7Ci0JdTMyIHJldHVybl9idHlwZTsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UodXRfZXZhbHVhdGVfb2JqZWN0KTsKLQotCS8qIEFsbG9jYXRlIHRoZSBldmFsdWF0aW9uIGluZm9ybWF0aW9uIGJsb2NrICovCi0KLQlpbmZvID0gQUNQSV9BTExPQ0FURV9aRVJPRUQoc2l6ZW9mKHN0cnVjdCBhY3BpX2V2YWx1YXRlX2luZm8pKTsKLQlpZiAoIWluZm8pIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX01FTU9SWSk7Ci0JfQotCi0JaW5mby0+cHJlZml4X25vZGUgPSBwcmVmaXhfbm9kZTsKLQlpbmZvLT5wYXRobmFtZSA9IHBhdGg7Ci0KLQkvKiBFdmFsdWF0ZSB0aGUgb2JqZWN0L21ldGhvZCAqLwotCi0Jc3RhdHVzID0gYWNwaV9uc19ldmFsdWF0ZShpbmZvKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJaWYgKHN0YXR1cyA9PSBBRV9OT1RfRk9VTkQpIHsKLQkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVhFQywKLQkJCQkJICAiWyU0LjRzLiVzXSB3YXMgbm90IGZvdW5kXG4iLAotCQkJCQkgIGFjcGlfdXRfZ2V0X25vZGVfbmFtZShwcmVmaXhfbm9kZSksCi0JCQkJCSAgcGF0aCkpOwotCQl9IGVsc2UgewotCQkJQUNQSV9FUlJPUl9NRVRIT0QoIk1ldGhvZCBleGVjdXRpb24gZmFpbGVkIiwKLQkJCQkJICBwcmVmaXhfbm9kZSwgcGF0aCwgc3RhdHVzKTsKLQkJfQotCi0JCWdvdG8gY2xlYW51cDsKLQl9Ci0KLQkvKiBEaWQgd2UgZ2V0IGEgcmV0dXJuIG9iamVjdD8gKi8KLQotCWlmICghaW5mby0+cmV0dXJuX29iamVjdCkgewotCQlpZiAoZXhwZWN0ZWRfcmV0dXJuX2J0eXBlcykgewotCQkJQUNQSV9FUlJPUl9NRVRIT0QoIk5vIG9iamVjdCB3YXMgcmV0dXJuZWQgZnJvbSIsCi0JCQkJCSAgcHJlZml4X25vZGUsIHBhdGgsIEFFX05PVF9FWElTVCk7Ci0KLQkJCXN0YXR1cyA9IEFFX05PVF9FWElTVDsKLQkJfQotCi0JCWdvdG8gY2xlYW51cDsKLQl9Ci0KLQkvKiBNYXAgdGhlIHJldHVybiBvYmplY3QgdHlwZSB0byB0aGUgYml0bWFwcGVkIHR5cGUgKi8KLQotCXN3aXRjaCAoQUNQSV9HRVRfT0JKRUNUX1RZUEUoaW5mby0+cmV0dXJuX29iamVjdCkpIHsKLQljYXNlIEFDUElfVFlQRV9JTlRFR0VSOgotCQlyZXR1cm5fYnR5cGUgPSBBQ1BJX0JUWVBFX0lOVEVHRVI7Ci0JCWJyZWFrOwotCi0JY2FzZSBBQ1BJX1RZUEVfQlVGRkVSOgotCQlyZXR1cm5fYnR5cGUgPSBBQ1BJX0JUWVBFX0JVRkZFUjsKLQkJYnJlYWs7Ci0KLQljYXNlIEFDUElfVFlQRV9TVFJJTkc6Ci0JCXJldHVybl9idHlwZSA9IEFDUElfQlRZUEVfU1RSSU5HOwotCQlicmVhazsKLQotCWNhc2UgQUNQSV9UWVBFX1BBQ0tBR0U6Ci0JCXJldHVybl9idHlwZSA9IEFDUElfQlRZUEVfUEFDS0FHRTsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlyZXR1cm5fYnR5cGUgPSAwOwotCQlicmVhazsKLQl9Ci0KLQlpZiAoKGFjcGlfZ2JsX2VuYWJsZV9pbnRlcnByZXRlcl9zbGFjaykgJiYgKCFleHBlY3RlZF9yZXR1cm5fYnR5cGVzKSkgewotCQkvKgotCQkgKiBXZSByZWNlaXZlZCBhIHJldHVybiBvYmplY3QsIGJ1dCBvbmUgd2FzIG5vdCBleHBlY3RlZC4gIFRoaXMgY2FuCi0JCSAqIGhhcHBlbiBmcmVxdWVudGx5IGlmIHRoZSAiaW1wbGljaXQgcmV0dXJuIiBmZWF0dXJlIGlzIGVuYWJsZWQuCi0JCSAqIEp1c3QgZGVsZXRlIHRoZSByZXR1cm4gb2JqZWN0IGFuZCByZXR1cm4gQUVfT0suCi0JCSAqLwotCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UoaW5mby0+cmV0dXJuX29iamVjdCk7Ci0JCWdvdG8gY2xlYW51cDsKLQl9Ci0KLQkvKiBJcyB0aGUgcmV0dXJuIG9iamVjdCBvbmUgb2YgdGhlIGV4cGVjdGVkIHR5cGVzPyAqLwotCi0JaWYgKCEoZXhwZWN0ZWRfcmV0dXJuX2J0eXBlcyAmIHJldHVybl9idHlwZSkpIHsKLQkJQUNQSV9FUlJPUl9NRVRIT0QoIlJldHVybiBvYmplY3QgdHlwZSBpcyBpbmNvcnJlY3QiLAotCQkJCSAgcHJlZml4X25vZGUsIHBhdGgsIEFFX1RZUEUpOwotCi0JCUFDUElfRVJST1IoKEFFX0lORk8sCi0JCQkgICAgIlR5cGUgcmV0dXJuZWQgZnJvbSAlcyB3YXMgaW5jb3JyZWN0OiAlcywgZXhwZWN0ZWQgQnR5cGVzOiAlWCIsCi0JCQkgICAgcGF0aCwKLQkJCSAgICBhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lKGluZm8tPnJldHVybl9vYmplY3QpLAotCQkJICAgIGV4cGVjdGVkX3JldHVybl9idHlwZXMpKTsKLQotCQkvKiBPbiBlcnJvciBleGl0LCB3ZSBtdXN0IGRlbGV0ZSB0aGUgcmV0dXJuIG9iamVjdCAqLwotCi0JCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZShpbmZvLT5yZXR1cm5fb2JqZWN0KTsKLQkJc3RhdHVzID0gQUVfVFlQRTsKLQkJZ290byBjbGVhbnVwOwotCX0KLQotCS8qIE9iamVjdCB0eXBlIGlzIE9LLCByZXR1cm4gaXQgKi8KLQotCSpyZXR1cm5fZGVzYyA9IGluZm8tPnJldHVybl9vYmplY3Q7Ci0KLSAgICAgIGNsZWFudXA6Ci0JQUNQSV9GUkVFKGluZm8pOwotCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X2V2YWx1YXRlX251bWVyaWNfb2JqZWN0Ci0gKgotICogUEFSQU1FVEVSUzogIG9iamVjdF9uYW1lICAgICAgICAgLSBPYmplY3QgbmFtZSB0byBiZSBldmFsdWF0ZWQKLSAqICAgICAgICAgICAgICBkZXZpY2Vfbm9kZSAgICAgICAgIC0gTm9kZSBmb3IgdGhlIGRldmljZQotICogICAgICAgICAgICAgIEFkZHJlc3MgICAgICAgICAgICAgLSBXaGVyZSB0aGUgdmFsdWUgaXMgcmV0dXJuZWQKLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IEV2YWx1YXRlcyBhIG51bWVyaWMgbmFtZXNwYWNlIG9iamVjdCBmb3IgYSBzZWxlY3RlZCBkZXZpY2UKLSAqICAgICAgICAgICAgICBhbmQgc3RvcmVzIHJlc3VsdCBpbiAqQWRkcmVzcy4KLSAqCi0gKiAgICAgICAgICAgICAgTk9URTogSW50ZXJuYWwgZnVuY3Rpb24sIG5vIHBhcmFtZXRlciB2YWxpZGF0aW9uCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotYWNwaV9zdGF0dXMKLWFjcGlfdXRfZXZhbHVhdGVfbnVtZXJpY19vYmplY3QoY2hhciAqb2JqZWN0X25hbWUsCi0JCQkJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKmRldmljZV9ub2RlLAotCQkJCWFjcGlfaW50ZWdlciAqIGFkZHJlc3MpCi17Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2M7Ci0JYWNwaV9zdGF0dXMgc3RhdHVzOwotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSh1dF9ldmFsdWF0ZV9udW1lcmljX29iamVjdCk7Ci0KLQlzdGF0dXMgPSBhY3BpX3V0X2V2YWx1YXRlX29iamVjdChkZXZpY2Vfbm9kZSwgb2JqZWN0X25hbWUsCi0JCQkJCSBBQ1BJX0JUWVBFX0lOVEVHRVIsICZvYmpfZGVzYyk7Ci0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotCX0KLQotCS8qIEdldCB0aGUgcmV0dXJuZWQgSW50ZWdlciAqLwotCi0JKmFkZHJlc3MgPSBvYmpfZGVzYy0+aW50ZWdlci52YWx1ZTsKLQotCS8qIE9uIGV4aXQsIHdlIG11c3QgZGVsZXRlIHRoZSByZXR1cm4gb2JqZWN0ICovCi0KLQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2Uob2JqX2Rlc2MpOwotCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X2NvcHlfaWRfc3RyaW5nCi0gKgotICogUEFSQU1FVEVSUzogIERlc3RpbmF0aW9uICAgICAgICAgLSBXaGVyZSB0byBjb3B5IHRoZSBzdHJpbmcKLSAqICAgICAgICAgICAgICBTb3VyY2UgICAgICAgICAgICAgIC0gU291cmNlIHN0cmluZwotICogICAgICAgICAgICAgIG1heF9sZW5ndGggICAgICAgICAgLSBMZW5ndGggb2YgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcgotICoKLSAqIFJFVFVSTjogICAgICBOb25lCi0gKgotICogREVTQ1JJUFRJT046IENvcGllcyBhbiBJRCBzdHJpbmcgZm9yIHRoZSBfSElELCBfQ0lELCBhbmQgX1VJRCBtZXRob2RzLgotICogICAgICAgICAgICAgIFBlcmZvcm1zIHJlbW92YWwgb2YgYSBsZWFkaW5nIGFzdGVyaXNrIGlmIHByZXNlbnQgLS0gd29ya2Fyb3VuZAotICogICAgICAgICAgICAgIGZvciBhIGtub3duIGlzc3VlIG9uIGEgYnVuY2ggb2YgbWFjaGluZXMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIHZvaWQKLWFjcGlfdXRfY29weV9pZF9zdHJpbmcoY2hhciAqZGVzdGluYXRpb24sIGNoYXIgKnNvdXJjZSwgYWNwaV9zaXplIG1heF9sZW5ndGgpCi17Ci0KLQkvKgotCSAqIFdvcmthcm91bmQgZm9yIElEIHN0cmluZ3MgdGhhdCBoYXZlIGEgbGVhZGluZyBhc3Rlcmlzay4gVGhpcyBjb25zdHJ1Y3QKLQkgKiBpcyBub3QgYWxsb3dlZCBieSB0aGUgQUNQSSBzcGVjaWZpY2F0aW9uICAoSUQgc3RyaW5ncyBtdXN0IGJlCi0JICogYWxwaGFudW1lcmljKSwgYnV0IGVub3VnaCBleGlzdGluZyBtYWNoaW5lcyBoYXZlIHRoaXMgZW1iZWRkZWQgaW4gdGhlaXIKLQkgKiBJRCBzdHJpbmdzIHRoYXQgdGhlIGZvbGxvd2luZyBjb2RlIGlzIHVzZWZ1bC4KLQkgKi8KLQlpZiAoKnNvdXJjZSA9PSAnKicpIHsKLQkJc291cmNlKys7Ci0JfQotCi0JLyogRG8gdGhlIGFjdHVhbCBjb3B5ICovCi0KLQlBQ1BJX1NUUk5DUFkoZGVzdGluYXRpb24sIHNvdXJjZSwgbWF4X2xlbmd0aCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfdXRfZXhlY3V0ZV9ISUQKLSAqCi0gKiBQQVJBTUVURVJTOiAgZGV2aWNlX25vZGUgICAgICAgICAtIE5vZGUgZm9yIHRoZSBkZXZpY2UKLSAqICAgICAgICAgICAgICBIaWQgICAgICAgICAgICAgICAgIC0gV2hlcmUgdGhlIEhJRCBpcyByZXR1cm5lZAotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKLSAqCi0gKiBERVNDUklQVElPTjogRXhlY3V0ZXMgdGhlIF9ISUQgY29udHJvbCBtZXRob2QgdGhhdCByZXR1cm5zIHRoZSBoYXJkd2FyZQotICogICAgICAgICAgICAgIElEIG9mIHRoZSBkZXZpY2UuCi0gKgotICogICAgICAgICAgICAgIE5PVEU6IEludGVybmFsIGZ1bmN0aW9uLCBubyBwYXJhbWV0ZXIgdmFsaWRhdGlvbgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWFjcGlfc3RhdHVzCi1hY3BpX3V0X2V4ZWN1dGVfSElEKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpkZXZpY2Vfbm9kZSwKLQkJICAgIHN0cnVjdCBhY3BpY2FfZGV2aWNlX2lkICpoaWQpCi17Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2M7Ci0JYWNwaV9zdGF0dXMgc3RhdHVzOwotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSh1dF9leGVjdXRlX0hJRCk7Ci0KLQlzdGF0dXMgPSBhY3BpX3V0X2V2YWx1YXRlX29iamVjdChkZXZpY2Vfbm9kZSwgTUVUSE9EX05BTUVfX0hJRCwKLQkJCQkJIEFDUElfQlRZUEVfSU5URUdFUiB8IEFDUElfQlRZUEVfU1RSSU5HLAotCQkJCQkgJm9ial9kZXNjKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci0JfQotCi0JaWYgKEFDUElfR0VUX09CSkVDVF9UWVBFKG9ial9kZXNjKSA9PSBBQ1BJX1RZUEVfSU5URUdFUikgewotCi0JCS8qIENvbnZlcnQgdGhlIE51bWVyaWMgSElEIHRvIHN0cmluZyAqLwotCi0JCWFjcGlfZXhfZWlzYV9pZF90b19zdHJpbmcoKHUzMikgb2JqX2Rlc2MtPmludGVnZXIudmFsdWUsCi0JCQkJCSAgaGlkLT52YWx1ZSk7Ci0JfSBlbHNlIHsKLQkJLyogQ29weSB0aGUgU3RyaW5nIEhJRCBmcm9tIHRoZSByZXR1cm5lZCBvYmplY3QgKi8KLQotCQlhY3BpX3V0X2NvcHlfaWRfc3RyaW5nKGhpZC0+dmFsdWUsIG9ial9kZXNjLT5zdHJpbmcucG9pbnRlciwKLQkJCQkgICAgICAgc2l6ZW9mKGhpZC0+dmFsdWUpKTsKLQl9Ci0KLQkvKiBPbiBleGl0LCB3ZSBtdXN0IGRlbGV0ZSB0aGUgcmV0dXJuIG9iamVjdCAqLwotCi0JYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKG9ial9kZXNjKTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV91dF90cmFuc2xhdGVfb25lX2NpZAotICoKLSAqIFBBUkFNRVRFUlM6ICBvYmpfZGVzYyAgICAgICAgICAgIC0gX0NJRCBvYmplY3QsIG11c3QgYmUgaW50ZWdlciBvciBzdHJpbmcKLSAqICAgICAgICAgICAgICBvbmVfY2lkICAgICAgICAgICAgIC0gV2hlcmUgdGhlIENJRCBzdHJpbmcgaXMgcmV0dXJuZWQKLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IFJldHVybiBhIG51bWVyaWMgb3Igc3RyaW5nIF9DSUQgdmFsdWUgYXMgYSBzdHJpbmcuCi0gKiAgICAgICAgICAgICAgKENvbXBhdGlibGUgSUQpCi0gKgotICogICAgICAgICAgICAgIE5PVEU6ICBBc3N1bWVzIGEgbWF4aW11bSBfQ0lEIHN0cmluZyBsZW5ndGggb2YKLSAqICAgICAgICAgICAgICAgICAgICAgQUNQSV9NQVhfQ0lEX0xFTkdUSC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgYWNwaV9zdGF0dXMKLWFjcGlfdXRfdHJhbnNsYXRlX29uZV9jaWQodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2MsCi0JCQkgIHN0cnVjdCBhY3BpX2NvbXBhdGlibGVfaWQgKm9uZV9jaWQpCi17Ci0KLQlzd2l0Y2ggKEFDUElfR0VUX09CSkVDVF9UWVBFKG9ial9kZXNjKSkgewotCWNhc2UgQUNQSV9UWVBFX0lOVEVHRVI6Ci0KLQkJLyogQ29udmVydCB0aGUgTnVtZXJpYyBDSUQgdG8gc3RyaW5nICovCi0KLQkJYWNwaV9leF9laXNhX2lkX3RvX3N0cmluZygodTMyKSBvYmpfZGVzYy0+aW50ZWdlci52YWx1ZSwKLQkJCQkJICBvbmVfY2lkLT52YWx1ZSk7Ci0JCXJldHVybiAoQUVfT0spOwotCi0JY2FzZSBBQ1BJX1RZUEVfU1RSSU5HOgotCi0JCWlmIChvYmpfZGVzYy0+c3RyaW5nLmxlbmd0aCA+IEFDUElfTUFYX0NJRF9MRU5HVEgpIHsKLQkJCXJldHVybiAoQUVfQU1MX1NUUklOR19MSU1JVCk7Ci0JCX0KLQotCQkvKiBDb3B5IHRoZSBTdHJpbmcgQ0lEIGZyb20gdGhlIHJldHVybmVkIG9iamVjdCAqLwotCi0JCWFjcGlfdXRfY29weV9pZF9zdHJpbmcob25lX2NpZC0+dmFsdWUsIG9ial9kZXNjLT5zdHJpbmcucG9pbnRlciwKLQkJCQkgICAgICAgQUNQSV9NQVhfQ0lEX0xFTkdUSCk7Ci0JCXJldHVybiAoQUVfT0spOwotCi0JZGVmYXVsdDoKLQotCQlyZXR1cm4gKEFFX1RZUEUpOwotCX0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV91dF9leGVjdXRlX0NJRAotICoKLSAqIFBBUkFNRVRFUlM6ICBkZXZpY2Vfbm9kZSAgICAgICAgIC0gTm9kZSBmb3IgdGhlIGRldmljZQotICogICAgICAgICAgICAgIHJldHVybl9jaWRfbGlzdCAgICAgLSBXaGVyZSB0aGUgQ0lEIGxpc3QgaXMgcmV0dXJuZWQKLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IEV4ZWN1dGVzIHRoZSBfQ0lEIGNvbnRyb2wgbWV0aG9kIHRoYXQgcmV0dXJucyBvbmUgb3IgbW9yZQotICogICAgICAgICAgICAgIGNvbXBhdGlibGUgaGFyZHdhcmUgSURzIGZvciB0aGUgZGV2aWNlLgotICoKLSAqICAgICAgICAgICAgICBOT1RFOiBJbnRlcm5hbCBmdW5jdGlvbiwgbm8gcGFyYW1ldGVyIHZhbGlkYXRpb24KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1hY3BpX3N0YXR1cwotYWNwaV91dF9leGVjdXRlX0NJRChzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqIGRldmljZV9ub2RlLAotCQkgICAgc3RydWN0IGFjcGlfY29tcGF0aWJsZV9pZF9saXN0ICoqIHJldHVybl9jaWRfbGlzdCkKLXsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYzsKLQlhY3BpX3N0YXR1cyBzdGF0dXM7Ci0JdTMyIGNvdW50OwotCXUzMiBzaXplOwotCXN0cnVjdCBhY3BpX2NvbXBhdGlibGVfaWRfbGlzdCAqY2lkX2xpc3Q7Ci0JdTMyIGk7Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKHV0X2V4ZWN1dGVfQ0lEKTsKLQotCS8qIEV2YWx1YXRlIHRoZSBfQ0lEIG1ldGhvZCBmb3IgdGhpcyBkZXZpY2UgKi8KLQotCXN0YXR1cyA9IGFjcGlfdXRfZXZhbHVhdGVfb2JqZWN0KGRldmljZV9ub2RlLCBNRVRIT0RfTkFNRV9fQ0lELAotCQkJCQkgQUNQSV9CVFlQRV9JTlRFR0VSIHwgQUNQSV9CVFlQRV9TVFJJTkcKLQkJCQkJIHwgQUNQSV9CVFlQRV9QQUNLQUdFLCAmb2JqX2Rlc2MpOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLQl9Ci0KLQkvKiBHZXQgdGhlIG51bWJlciBvZiBfQ0lEcyByZXR1cm5lZCAqLwotCi0JY291bnQgPSAxOwotCWlmIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRShvYmpfZGVzYykgPT0gQUNQSV9UWVBFX1BBQ0tBR0UpIHsKLQkJY291bnQgPSBvYmpfZGVzYy0+cGFja2FnZS5jb3VudDsKLQl9Ci0KLQkvKiBBbGxvY2F0ZSBhIHdvcnN0LWNhc2UgYnVmZmVyIGZvciB0aGUgX0NJRHMgKi8KLQotCXNpemUgPSAoKChjb3VudCAtIDEpICogc2l6ZW9mKHN0cnVjdCBhY3BpX2NvbXBhdGlibGVfaWQpKSArCi0JCXNpemVvZihzdHJ1Y3QgYWNwaV9jb21wYXRpYmxlX2lkX2xpc3QpKTsKLQotCWNpZF9saXN0ID0gQUNQSV9BTExPQ0FURV9aRVJPRUQoKGFjcGlfc2l6ZSkgc2l6ZSk7Ci0JaWYgKCFjaWRfbGlzdCkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9fTUVNT1JZKTsKLQl9Ci0KLQkvKiBJbml0IENJRCBsaXN0ICovCi0KLQljaWRfbGlzdC0+Y291bnQgPSBjb3VudDsKLQljaWRfbGlzdC0+c2l6ZSA9IHNpemU7Ci0KLQkvKgotCSAqICBBIF9DSUQgY2FuIHJldHVybiBlaXRoZXIgYSBzaW5nbGUgY29tcGF0aWJsZSBJRCBvciBhIHBhY2thZ2Ugb2YKLQkgKiAgY29tcGF0aWJsZSBJRHMuICBFYWNoIGNvbXBhdGlibGUgSUQgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOgotCSAqICAxKSBJbnRlZ2VyICgzMiBiaXQgY29tcHJlc3NlZCBFSVNBIElEKSBvcgotCSAqICAyKSBTdHJpbmcgKFBDSSBJRCBmb3JtYXQsIGUuZy4gIlBDSVxWRU5fdnZ2diZERVZfZGRkZCZTVUJTWVNfc3Nzc3Nzc3MiKQotCSAqLwotCi0JLyogVGhlIF9DSUQgb2JqZWN0IGNhbiBiZSBlaXRoZXIgYSBzaW5nbGUgQ0lEIG9yIGEgcGFja2FnZSAobGlzdCkgb2YgQ0lEcyAqLwotCi0JaWYgKEFDUElfR0VUX09CSkVDVF9UWVBFKG9ial9kZXNjKSA9PSBBQ1BJX1RZUEVfUEFDS0FHRSkgewotCi0JCS8qIFRyYW5zbGF0ZSBlYWNoIHBhY2thZ2UgZWxlbWVudCAqLwotCi0JCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0JCQlzdGF0dXMgPQotCQkJICAgIGFjcGlfdXRfdHJhbnNsYXRlX29uZV9jaWQob2JqX2Rlc2MtPnBhY2thZ2UuCi0JCQkJCQkgICAgICBlbGVtZW50c1tpXSwKLQkJCQkJCSAgICAgICZjaWRfbGlzdC0+aWRbaV0pOwotCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9IGVsc2UgewotCQkvKiBPbmx5IG9uZSBDSUQsIHRyYW5zbGF0ZSB0byBhIHN0cmluZyAqLwotCi0JCXN0YXR1cyA9IGFjcGlfdXRfdHJhbnNsYXRlX29uZV9jaWQob2JqX2Rlc2MsIGNpZF9saXN0LT5pZCk7Ci0JfQotCi0JLyogQ2xlYW51cCBvbiBlcnJvciAqLwotCi0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCUFDUElfRlJFRShjaWRfbGlzdCk7Ci0JfSBlbHNlIHsKLQkJKnJldHVybl9jaWRfbGlzdCA9IGNpZF9saXN0OwotCX0KLQotCS8qIE9uIGV4aXQsIHdlIG11c3QgZGVsZXRlIHRoZSBfQ0lEIHJldHVybiBvYmplY3QgKi8KLQotCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZShvYmpfZGVzYyk7Ci0JcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfdXRfZXhlY3V0ZV9VSUQKLSAqCi0gKiBQQVJBTUVURVJTOiAgZGV2aWNlX25vZGUgICAgICAgICAtIE5vZGUgZm9yIHRoZSBkZXZpY2UKLSAqICAgICAgICAgICAgICBVaWQgICAgICAgICAgICAgICAgIC0gV2hlcmUgdGhlIFVJRCBpcyByZXR1cm5lZAotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKLSAqCi0gKiBERVNDUklQVElPTjogRXhlY3V0ZXMgdGhlIF9VSUQgY29udHJvbCBtZXRob2QgdGhhdCByZXR1cm5zIHRoZSBoYXJkd2FyZQotICogICAgICAgICAgICAgIElEIG9mIHRoZSBkZXZpY2UuCi0gKgotICogICAgICAgICAgICAgIE5PVEU6IEludGVybmFsIGZ1bmN0aW9uLCBubyBwYXJhbWV0ZXIgdmFsaWRhdGlvbgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWFjcGlfc3RhdHVzCi1hY3BpX3V0X2V4ZWN1dGVfVUlEKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpkZXZpY2Vfbm9kZSwKLQkJICAgIHN0cnVjdCBhY3BpY2FfZGV2aWNlX2lkICp1aWQpCi17Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2M7Ci0JYWNwaV9zdGF0dXMgc3RhdHVzOwotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSh1dF9leGVjdXRlX1VJRCk7Ci0KLQlzdGF0dXMgPSBhY3BpX3V0X2V2YWx1YXRlX29iamVjdChkZXZpY2Vfbm9kZSwgTUVUSE9EX05BTUVfX1VJRCwKLQkJCQkJIEFDUElfQlRZUEVfSU5URUdFUiB8IEFDUElfQlRZUEVfU1RSSU5HLAotCQkJCQkgJm9ial9kZXNjKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci0JfQotCi0JaWYgKEFDUElfR0VUX09CSkVDVF9UWVBFKG9ial9kZXNjKSA9PSBBQ1BJX1RZUEVfSU5URUdFUikgewotCi0JCS8qIENvbnZlcnQgdGhlIE51bWVyaWMgVUlEIHRvIHN0cmluZyAqLwotCi0JCWFjcGlfZXhfdW5zaWduZWRfaW50ZWdlcl90b19zdHJpbmcob2JqX2Rlc2MtPmludGVnZXIudmFsdWUsCi0JCQkJCQkgICB1aWQtPnZhbHVlKTsKLQl9IGVsc2UgewotCQkvKiBDb3B5IHRoZSBTdHJpbmcgVUlEIGZyb20gdGhlIHJldHVybmVkIG9iamVjdCAqLwotCi0JCWFjcGlfdXRfY29weV9pZF9zdHJpbmcodWlkLT52YWx1ZSwgb2JqX2Rlc2MtPnN0cmluZy5wb2ludGVyLAotCQkJCSAgICAgICBzaXplb2YodWlkLT52YWx1ZSkpOwotCX0KLQotCS8qIE9uIGV4aXQsIHdlIG11c3QgZGVsZXRlIHRoZSByZXR1cm4gb2JqZWN0ICovCi0KLQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2Uob2JqX2Rlc2MpOwotCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X2V4ZWN1dGVfU1RBCi0gKgotICogUEFSQU1FVEVSUzogIGRldmljZV9ub2RlICAgICAgICAgLSBOb2RlIGZvciB0aGUgZGV2aWNlCi0gKiAgICAgICAgICAgICAgRmxhZ3MgICAgICAgICAgICAgICAtIFdoZXJlIHRoZSBzdGF0dXMgZmxhZ3MgYXJlIHJldHVybmVkCi0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cwotICoKLSAqIERFU0NSSVBUSU9OOiBFeGVjdXRlcyBfU1RBIGZvciBzZWxlY3RlZCBkZXZpY2UgYW5kIHN0b3JlcyByZXN1bHRzIGluCi0gKiAgICAgICAgICAgICAgKkZsYWdzLgotICoKLSAqICAgICAgICAgICAgICBOT1RFOiBJbnRlcm5hbCBmdW5jdGlvbiwgbm8gcGFyYW1ldGVyIHZhbGlkYXRpb24KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1hY3BpX3N0YXR1cwotYWNwaV91dF9leGVjdXRlX1NUQShzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqZGV2aWNlX25vZGUsIHUzMiAqIGZsYWdzKQotewotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjOwotCWFjcGlfc3RhdHVzIHN0YXR1czsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UodXRfZXhlY3V0ZV9TVEEpOwotCi0Jc3RhdHVzID0gYWNwaV91dF9ldmFsdWF0ZV9vYmplY3QoZGV2aWNlX25vZGUsIE1FVEhPRF9OQU1FX19TVEEsCi0JCQkJCSBBQ1BJX0JUWVBFX0lOVEVHRVIsICZvYmpfZGVzYyk7Ci0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCWlmIChBRV9OT1RfRk9VTkQgPT0gc3RhdHVzKSB7Ci0JCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VYRUMsCi0JCQkJCSAgIl9TVEEgb24gJTQuNHMgd2FzIG5vdCBmb3VuZCwgYXNzdW1pbmcgZGV2aWNlIGlzIHByZXNlbnRcbiIsCi0JCQkJCSAgYWNwaV91dF9nZXRfbm9kZV9uYW1lKGRldmljZV9ub2RlKSkpOwotCi0JCQkqZmxhZ3MgPSBBQ1BJX1VJTlQzMl9NQVg7Ci0JCQlzdGF0dXMgPSBBRV9PSzsKLQkJfQotCi0JCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotCX0KLQotCS8qIEV4dHJhY3QgdGhlIHN0YXR1cyBmbGFncyAqLwotCi0JKmZsYWdzID0gKHUzMikgb2JqX2Rlc2MtPmludGVnZXIudmFsdWU7Ci0KLQkvKiBPbiBleGl0LCB3ZSBtdXN0IGRlbGV0ZSB0aGUgcmV0dXJuIG9iamVjdCAqLwotCi0JYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKG9ial9kZXNjKTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV91dF9leGVjdXRlX1N4ZHMKLSAqCi0gKiBQQVJBTUVURVJTOiAgZGV2aWNlX25vZGUgICAgICAgICAtIE5vZGUgZm9yIHRoZSBkZXZpY2UKLSAqICAgICAgICAgICAgICBGbGFncyAgICAgICAgICAgICAgIC0gV2hlcmUgdGhlIHN0YXR1cyBmbGFncyBhcmUgcmV0dXJuZWQKLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IEV4ZWN1dGVzIF9TVEEgZm9yIHNlbGVjdGVkIGRldmljZSBhbmQgc3RvcmVzIHJlc3VsdHMgaW4KLSAqICAgICAgICAgICAgICAqRmxhZ3MuCi0gKgotICogICAgICAgICAgICAgIE5PVEU6IEludGVybmFsIGZ1bmN0aW9uLCBubyBwYXJhbWV0ZXIgdmFsaWRhdGlvbgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWFjcGlfc3RhdHVzCi1hY3BpX3V0X2V4ZWN1dGVfc3hkcyhzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqZGV2aWNlX25vZGUsIHU4ICogaGlnaGVzdCkKLXsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYzsKLQlhY3BpX3N0YXR1cyBzdGF0dXM7Ci0JdTMyIGk7Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKHV0X2V4ZWN1dGVfc3hkcyk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7Ci0JCWhpZ2hlc3RbaV0gPSAweEZGOwotCQlzdGF0dXMgPSBhY3BpX3V0X2V2YWx1YXRlX29iamVjdChkZXZpY2Vfbm9kZSwKLQkJCQkJCSBBQ1BJX0NBU1RfUFRSKGNoYXIsCi0JCQkJCQkJICAgICAgIGFjcGlfZ2JsX2hpZ2hlc3RfZHN0YXRlX25hbWVzCi0JCQkJCQkJICAgICAgIFtpXSksCi0JCQkJCQkgQUNQSV9CVFlQRV9JTlRFR0VSLCAmb2JqX2Rlc2MpOwotCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJCWlmIChzdGF0dXMgIT0gQUVfTk9UX0ZPVU5EKSB7Ci0JCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FWEVDLAotCQkJCQkJICAiJXMgb24gRGV2aWNlICU0LjRzLCAlc1xuIiwKLQkJCQkJCSAgQUNQSV9DQVNUX1BUUihjaGFyLAotCQkJCQkJCQlhY3BpX2dibF9oaWdoZXN0X2RzdGF0ZV9uYW1lcwotCQkJCQkJCQlbaV0pLAotCQkJCQkJICBhY3BpX3V0X2dldF9ub2RlX25hbWUKLQkJCQkJCSAgKGRldmljZV9ub2RlKSwKLQkJCQkJCSAgYWNwaV9mb3JtYXRfZXhjZXB0aW9uCi0JCQkJCQkgIChzdGF0dXMpKSk7Ci0KLQkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCS8qIEV4dHJhY3QgdGhlIERzdGF0ZSB2YWx1ZSAqLwotCi0JCQloaWdoZXN0W2ldID0gKHU4KSBvYmpfZGVzYy0+aW50ZWdlci52YWx1ZTsKLQotCQkJLyogRGVsZXRlIHRoZSByZXR1cm4gb2JqZWN0ICovCi0KLQkJCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZShvYmpfZGVzYyk7Ci0JCX0KLQl9Ci0KLQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dGdsb2JhbC5jIGIvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dGdsb2JhbC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxN2VkNWFjLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXRnbG9iYWwuYworKysgL2Rldi9udWxsCkBAIC0xLDgxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogTW9kdWxlIE5hbWU6IHV0Z2xvYmFsIC0gR2xvYmFsIHZhcmlhYmxlcyBmb3IgdGhlIEFDUEkgc3Vic3lzdGVtCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwOCwgSW50ZWwgQ29ycC4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKLSAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIGF0IG1pbmltdW0gYSBkaXNjbGFpbWVyCi0gKiAgICBzdWJzdGFudGlhbGx5IHNpbWlsYXIgdG8gdGhlICJOTyBXQVJSQU5UWSIgZGlzY2xhaW1lciBiZWxvdwotICogICAgKCJEaXNjbGFpbWVyIikgYW5kIGFueSByZWRpc3RyaWJ1dGlvbiBtdXN0IGJlIGNvbmRpdGlvbmVkIHVwb24KLSAqICAgIGluY2x1ZGluZyBhIHN1YnN0YW50aWFsbHkgc2ltaWxhciBEaXNjbGFpbWVyIHJlcXVpcmVtZW50IGZvciBmdXJ0aGVyCi0gKiAgICBiaW5hcnkgcmVkaXN0cmlidXRpb24uCi0gKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMKLSAqICAgIG9mIGFueSBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTk8gV0FSUkFOVFkKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAotICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKLSAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HCi0gKiBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKLSAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KLSAqLwotCi0jZGVmaW5lIERFRklORV9BQ1BJX0dMT0JBTFMKLQotI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgotI2luY2x1ZGUgPGFjcGkvYWNuYW1lc3AuaD4KLQotQUNQSV9FWFBPUlRfU1lNQk9MKGFjcGlfZ2JsX0ZBRFQpCi0jZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9VVElMSVRJRVMKLSAgICBBQ1BJX01PRFVMRV9OQU1FKCJ1dGdsb2JhbCIpCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogU3RhdGljIGdsb2JhbCB2YXJpYWJsZSBpbml0aWFsaXphdGlvbi4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIFdlIHdhbnQgdGhlIGRlYnVnIHN3aXRjaGVzIHN0YXRpY2FsbHkgaW5pdGlhbGl6ZWQgc28gdGhleQotICogYXJlIGFscmVhZHkgc2V0IHdoZW4gdGhlIGRlYnVnZ2VyIGlzIGVudGVyZWQuCi0gKi8KLS8qIERlYnVnIHN3aXRjaCAtIGxldmVsIGFuZCB0cmFjZSBtYXNrICovCi11MzIgYWNwaV9kYmdfbGV2ZWwgPSBBQ1BJX0RFQlVHX0RFRkFVTFQ7Ci0KLS8qIERlYnVnIHN3aXRjaCAtIGxheWVyIChjb21wb25lbnQpIG1hc2sgKi8KLQotdTMyIGFjcGlfZGJnX2xheWVyID0gMDsKLXUzMiBhY3BpX2dibF9uZXN0aW5nX2xldmVsID0gMDsKLQotLyogRGVidWdnZXIgZ2xvYmFscyAqLwotCi11OCBhY3BpX2dibF9kYl90ZXJtaW5hdGVfdGhyZWFkcyA9IEZBTFNFOwotdTggYWNwaV9nYmxfYWJvcnRfbWV0aG9kID0gRkFMU0U7Ci11OCBhY3BpX2dibF9tZXRob2RfZXhlY3V0aW5nID0gRkFMU0U7Ci0KLS8qIFN5c3RlbSBmbGFncyAqLwotCi11MzIgYWNwaV9nYmxfc3RhcnR1cF9mbGFncyA9IDA7Ci0KLS8qIFN5c3RlbSBzdGFydHMgdW5pbml0aWFsaXplZCAqLwotCi11OCBhY3BpX2dibF9zaHV0ZG93biA9IFRSVUU7Ci0KLWNvbnN0IGNoYXIgKmFjcGlfZ2JsX3NsZWVwX3N0YXRlX25hbWVzW0FDUElfU19TVEFURV9DT1VOVF0gPSB7Ci0JIlxcX1MwXyIsCi0JIlxcX1MxXyIsCi0JIlxcX1MyXyIsCi0JIlxcX1MzXyIsCi0JIlxcX1M0XyIsCi0JIlxcX1M1XyIKLX07Ci0KLWNvbnN0IGNoYXIgKmFjcGlfZ2JsX2hpZ2hlc3RfZHN0YXRlX25hbWVzWzRdID0gewotCSJfUzFEIiwKLQkiX1MyRCIsCi0JIl9TM0QiLAotCSJfUzREIgotfTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9mb3JtYXRfZXhjZXB0aW9uCi0gKgotICogUEFSQU1FVEVSUzogIFN0YXR1cyAgICAgICAtIFRoZSBhY3BpX3N0YXR1cyBjb2RlIHRvIGJlIGZvcm1hdHRlZAotICoKLSAqIFJFVFVSTjogICAgICBBIHN0cmluZyBjb250YWluaW5nIHRoZSBleGNlcHRpb24gdGV4dC4gQSB2YWxpZCBwb2ludGVyIGlzCi0gKiAgICAgICAgICAgICAgYWx3YXlzIHJldHVybmVkLgotICoKLSAqIERFU0NSSVBUSU9OOiBUaGlzIGZ1bmN0aW9uIHRyYW5zbGF0ZXMgYW4gQUNQSSBleGNlcHRpb24gaW50byBhbiBBU0NJSSBzdHJpbmcKLSAqICAgICAgICAgICAgICBJdCBpcyBoZXJlIGluc3RlYWQgb2YgdXR4ZmFjZS5jIHNvIGl0IGlzIGFsd2F5cyBwcmVzZW50LgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWNvbnN0IGNoYXIgKmFjcGlfZm9ybWF0X2V4Y2VwdGlvbihhY3BpX3N0YXR1cyBzdGF0dXMpCi17Ci0JY29uc3QgY2hhciAqZXhjZXB0aW9uID0gTlVMTDsKLQotCUFDUElfRlVOQ1RJT05fRU5UUlkoKTsKLQotCWV4Y2VwdGlvbiA9IGFjcGlfdXRfdmFsaWRhdGVfZXhjZXB0aW9uKHN0YXR1cyk7Ci0JaWYgKCFleGNlcHRpb24pIHsKLQotCQkvKiBFeGNlcHRpb24gY29kZSB3YXMgbm90IHJlY29nbml6ZWQgKi8KLQotCQlBQ1BJX0VSUk9SKChBRV9JTkZPLAotCQkJICAgICJVbmtub3duIGV4Y2VwdGlvbiBjb2RlOiAweCU4LjhYIiwgc3RhdHVzKSk7Ci0KLQkJZXhjZXB0aW9uID0gIlVOS05PV05fU1RBVFVTX0NPREUiOwotCQlkdW1wX3N0YWNrKCk7Ci0JfQotCi0JcmV0dXJuIChBQ1BJX0NBU1RfUFRSKGNvbnN0IGNoYXIsIGV4Y2VwdGlvbikpOwotfQotCi1BQ1BJX0VYUE9SVF9TWU1CT0woYWNwaV9mb3JtYXRfZXhjZXB0aW9uKQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIE5hbWVzcGFjZSBnbG9iYWxzCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBQcmVkZWZpbmVkIEFDUEkgTmFtZXMgKEJ1aWx0LWluIHRvIHRoZSBJbnRlcnByZXRlcikKLSAqCi0gKiBOT1RFUzoKLSAqIDEpIF9TQl8gaXMgZGVmaW5lZCB0byBiZSBhIGRldmljZSB0byBhbGxvdyBcX1NCXy5fSU5JIHRvIGJlIHJ1bgotICogICAgZHVyaW5nIHRoZSBpbml0aWFsaXphdGlvbiBzZXF1ZW5jZS4KLSAqIDIpIF9UWl8gaXMgZGVmaW5lZCB0byBiZSBhIHRoZXJtYWwgem9uZSBpbiBvcmRlciB0byBhbGxvdyBBU0wgY29kZSB0bwotICogICAgcGVyZm9ybSBhIE5vdGlmeSgpIG9wZXJhdGlvbiBvbiBpdC4KLSAqLwotY29uc3Qgc3RydWN0IGFjcGlfcHJlZGVmaW5lZF9uYW1lcyBhY3BpX2dibF9wcmVfZGVmaW5lZF9uYW1lc1tdID0gewotCXsiX0dQRSIsIEFDUElfVFlQRV9MT0NBTF9TQ09QRSwgTlVMTH0sCi0JeyJfUFJfIiwgQUNQSV9UWVBFX0xPQ0FMX1NDT1BFLCBOVUxMfSwKLQl7Il9TQl8iLCBBQ1BJX1RZUEVfREVWSUNFLCBOVUxMfSwKLQl7Il9TSV8iLCBBQ1BJX1RZUEVfTE9DQUxfU0NPUEUsIE5VTEx9LAotCXsiX1RaXyIsIEFDUElfVFlQRV9USEVSTUFMLCBOVUxMfSwKLQl7Il9SRVYiLCBBQ1BJX1RZUEVfSU5URUdFUiwgKGNoYXIgKilBQ1BJX0NBX1NVUFBPUlRfTEVWRUx9LAotCXsiX09TXyIsIEFDUElfVFlQRV9TVFJJTkcsIEFDUElfT1NfTkFNRX0sCi0JeyJfR0xfIiwgQUNQSV9UWVBFX01VVEVYLCAoY2hhciAqKTF9LAotCi0jaWYgIWRlZmluZWQgKEFDUElfTk9fTUVUSE9EX0VYRUNVVElPTikgfHwgZGVmaW5lZCAoQUNQSV9DT05TVEFOVF9FVkFMX09OTFkpCi0JeyJfT1NJIiwgQUNQSV9UWVBFX01FVEhPRCwgKGNoYXIgKikxfSwKLSNlbmRpZgotCi0JLyogVGFibGUgdGVybWluYXRvciAqLwotCi0Je05VTEwsIEFDUElfVFlQRV9BTlksIE5VTEx9Ci19OwotCi0vKgotICogUHJvcGVydGllcyBvZiB0aGUgQUNQSSBPYmplY3QgVHlwZXMsIGJvdGggaW50ZXJuYWwgYW5kIGV4dGVybmFsLgotICogVGhlIHRhYmxlIGlzIGluZGV4ZWQgYnkgdmFsdWVzIG9mIGFjcGlfb2JqZWN0X3R5cGUKLSAqLwotY29uc3QgdTggYWNwaV9nYmxfbnNfcHJvcGVydGllc1tdID0gewotCUFDUElfTlNfTk9STUFMLAkJLyogMDAgQW55ICAgICAgICAgICAgICAqLwotCUFDUElfTlNfTk9STUFMLAkJLyogMDEgTnVtYmVyICAgICAgICAgICAqLwotCUFDUElfTlNfTk9STUFMLAkJLyogMDIgU3RyaW5nICAgICAgICAgICAqLwotCUFDUElfTlNfTk9STUFMLAkJLyogMDMgQnVmZmVyICAgICAgICAgICAqLwotCUFDUElfTlNfTk9STUFMLAkJLyogMDQgUGFja2FnZSAgICAgICAgICAqLwotCUFDUElfTlNfTk9STUFMLAkJLyogMDUgZmllbGRfdW5pdCAgICAgICAqLwotCUFDUElfTlNfTkVXU0NPUEUsCS8qIDA2IERldmljZSAgICAgICAgICAgKi8KLQlBQ1BJX05TX05PUk1BTCwJCS8qIDA3IEV2ZW50ICAgICAgICAgICAgKi8KLQlBQ1BJX05TX05FV1NDT1BFLAkvKiAwOCBNZXRob2QgICAgICAgICAgICovCi0JQUNQSV9OU19OT1JNQUwsCQkvKiAwOSBNdXRleCAgICAgICAgICAgICovCi0JQUNQSV9OU19OT1JNQUwsCQkvKiAxMCBSZWdpb24gICAgICAgICAgICovCi0JQUNQSV9OU19ORVdTQ09QRSwJLyogMTEgUG93ZXIgICAgICAgICAgICAqLwotCUFDUElfTlNfTkVXU0NPUEUsCS8qIDEyIFByb2Nlc3NvciAgICAgICAgKi8KLQlBQ1BJX05TX05FV1NDT1BFLAkvKiAxMyBUaGVybWFsICAgICAgICAgICovCi0JQUNQSV9OU19OT1JNQUwsCQkvKiAxNCBidWZmZXJfZmllbGQgICAgICovCi0JQUNQSV9OU19OT1JNQUwsCQkvKiAxNSBkZGJfaGFuZGxlICAgICAgICovCi0JQUNQSV9OU19OT1JNQUwsCQkvKiAxNiBEZWJ1ZyBPYmplY3QgICAgICovCi0JQUNQSV9OU19OT1JNQUwsCQkvKiAxNyBkZWZfZmllbGQgICAgICAgICovCi0JQUNQSV9OU19OT1JNQUwsCQkvKiAxOCBiYW5rX2ZpZWxkICAgICAgICovCi0JQUNQSV9OU19OT1JNQUwsCQkvKiAxOSBpbmRleF9maWVsZCAgICAgICovCi0JQUNQSV9OU19OT1JNQUwsCQkvKiAyMCBSZWZlcmVuY2UgICAgICAgICovCi0JQUNQSV9OU19OT1JNQUwsCQkvKiAyMSBBbGlhcyAgICAgICAgICAgICovCi0JQUNQSV9OU19OT1JNQUwsCQkvKiAyMiBtZXRob2RfYWxpYXMgICAgICovCi0JQUNQSV9OU19OT1JNQUwsCQkvKiAyMyBOb3RpZnkgICAgICAgICAgICovCi0JQUNQSV9OU19OT1JNQUwsCQkvKiAyNCBBZGRyZXNzIEhhbmRsZXIgICovCi0JQUNQSV9OU19ORVdTQ09QRSB8IEFDUElfTlNfTE9DQUwsCS8qIDI1IFJlc291cmNlIERlc2MgICAgKi8KLQlBQ1BJX05TX05FV1NDT1BFIHwgQUNQSV9OU19MT0NBTCwJLyogMjYgUmVzb3VyY2UgRmllbGQgICAqLwotCUFDUElfTlNfTkVXU0NPUEUsCS8qIDI3IFNjb3BlICAgICAgICAgICAgKi8KLQlBQ1BJX05TX05PUk1BTCwJCS8qIDI4IEV4dHJhICAgICAgICAgICAgKi8KLQlBQ1BJX05TX05PUk1BTCwJCS8qIDI5IERhdGEgICAgICAgICAgICAgKi8KLQlBQ1BJX05TX05PUk1BTAkJLyogMzAgSW52YWxpZCAgICAgICAgICAqLwotfTsKLQotLyogSGV4IHRvIEFTQ0lJIGNvbnZlcnNpb24gdGFibGUgKi8KLQotc3RhdGljIGNvbnN0IGNoYXIgYWNwaV9nYmxfaGV4X3RvX2FzY2lpW10gPSB7Ci0JJzAnLCAnMScsICcyJywgJzMnLCAnNCcsICc1JywgJzYnLCAnNycsCi0JJzgnLCAnOScsICdBJywgJ0InLCAnQycsICdEJywgJ0UnLCAnRicKLX07Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfdXRfaGV4X3RvX2FzY2lpX2NoYXIKLSAqCi0gKiBQQVJBTUVURVJTOiAgSW50ZWdlciAgICAgICAgICAgICAtIENvbnRhaW5zIHRoZSBoZXggZGlnaXQKLSAqICAgICAgICAgICAgICBQb3NpdGlvbiAgICAgICAgICAgIC0gYml0IHBvc2l0aW9uIG9mIHRoZSBkaWdpdCB3aXRoaW4gdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVnZXIgKG11bHRpcGxlIG9mIDQpCi0gKgotICogUkVUVVJOOiAgICAgIFRoZSBjb252ZXJ0ZWQgQXNjaWkgY2hhcmFjdGVyCi0gKgotICogREVTQ1JJUFRJT046IENvbnZlcnQgYSBoZXggZGlnaXQgdG8gYW4gQXNjaWkgY2hhcmFjdGVyCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotY2hhciBhY3BpX3V0X2hleF90b19hc2NpaV9jaGFyKGFjcGlfaW50ZWdlciBpbnRlZ2VyLCB1MzIgcG9zaXRpb24pCi17Ci0KLQlyZXR1cm4gKGFjcGlfZ2JsX2hleF90b19hc2NpaVsoaW50ZWdlciA+PiBwb3NpdGlvbikgJiAweEZdKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEV2ZW50IGFuZCBIYXJkd2FyZSBnbG9iYWxzCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RydWN0IGFjcGlfYml0X3JlZ2lzdGVyX2luZm8gYWNwaV9nYmxfYml0X3JlZ2lzdGVyX2luZm9bQUNQSV9OVU1fQklUUkVHXSA9IHsKLQkvKiBOYW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmVudCBSZWdpc3RlciAgICAgICAgICAgICBSZWdpc3RlciBCaXQgUG9zaXRpb24gICAgICAgICAgICAgICAgICAgUmVnaXN0ZXIgQml0IE1hc2sgICAgICAgKi8KLQotCS8qIEFDUElfQklUUkVHX1RJTUVSX1NUQVRVUyAgICAgICAgICovIHtBQ1BJX1JFR0lTVEVSX1BNMV9TVEFUVVMsCi0JCQkJCQlBQ1BJX0JJVFBPU0lUSU9OX1RJTUVSX1NUQVRVUywKLQkJCQkJCUFDUElfQklUTUFTS19USU1FUl9TVEFUVVN9LAotCS8qIEFDUElfQklUUkVHX0JVU19NQVNURVJfU1RBVFVTICAgICovIHtBQ1BJX1JFR0lTVEVSX1BNMV9TVEFUVVMsCi0JCQkJCQlBQ1BJX0JJVFBPU0lUSU9OX0JVU19NQVNURVJfU1RBVFVTLAotCQkJCQkJQUNQSV9CSVRNQVNLX0JVU19NQVNURVJfU1RBVFVTfSwKLQkvKiBBQ1BJX0JJVFJFR19HTE9CQUxfTE9DS19TVEFUVVMgICAqLyB7QUNQSV9SRUdJU1RFUl9QTTFfU1RBVFVTLAotCQkJCQkJQUNQSV9CSVRQT1NJVElPTl9HTE9CQUxfTE9DS19TVEFUVVMsCi0JCQkJCQlBQ1BJX0JJVE1BU0tfR0xPQkFMX0xPQ0tfU1RBVFVTfSwKLQkvKiBBQ1BJX0JJVFJFR19QT1dFUl9CVVRUT05fU1RBVFVTICAqLyB7QUNQSV9SRUdJU1RFUl9QTTFfU1RBVFVTLAotCQkJCQkJQUNQSV9CSVRQT1NJVElPTl9QT1dFUl9CVVRUT05fU1RBVFVTLAotCQkJCQkJQUNQSV9CSVRNQVNLX1BPV0VSX0JVVFRPTl9TVEFUVVN9LAotCS8qIEFDUElfQklUUkVHX1NMRUVQX0JVVFRPTl9TVEFUVVMgICovIHtBQ1BJX1JFR0lTVEVSX1BNMV9TVEFUVVMsCi0JCQkJCQlBQ1BJX0JJVFBPU0lUSU9OX1NMRUVQX0JVVFRPTl9TVEFUVVMsCi0JCQkJCQlBQ1BJX0JJVE1BU0tfU0xFRVBfQlVUVE9OX1NUQVRVU30sCi0JLyogQUNQSV9CSVRSRUdfUlRfQ0xPQ0tfU1RBVFVTICAgICAgKi8ge0FDUElfUkVHSVNURVJfUE0xX1NUQVRVUywKLQkJCQkJCUFDUElfQklUUE9TSVRJT05fUlRfQ0xPQ0tfU1RBVFVTLAotCQkJCQkJQUNQSV9CSVRNQVNLX1JUX0NMT0NLX1NUQVRVU30sCi0JLyogQUNQSV9CSVRSRUdfV0FLRV9TVEFUVVMgICAgICAgICAgKi8ge0FDUElfUkVHSVNURVJfUE0xX1NUQVRVUywKLQkJCQkJCUFDUElfQklUUE9TSVRJT05fV0FLRV9TVEFUVVMsCi0JCQkJCQlBQ1BJX0JJVE1BU0tfV0FLRV9TVEFUVVN9LAotCS8qIEFDUElfQklUUkVHX1BDSUVYUF9XQUtFX1NUQVRVUyAgICovIHtBQ1BJX1JFR0lTVEVSX1BNMV9TVEFUVVMsCi0JCQkJCQlBQ1BJX0JJVFBPU0lUSU9OX1BDSUVYUF9XQUtFX1NUQVRVUywKLQkJCQkJCUFDUElfQklUTUFTS19QQ0lFWFBfV0FLRV9TVEFUVVN9LAotCi0JLyogQUNQSV9CSVRSRUdfVElNRVJfRU5BQkxFICAgICAgICAgKi8ge0FDUElfUkVHSVNURVJfUE0xX0VOQUJMRSwKLQkJCQkJCUFDUElfQklUUE9TSVRJT05fVElNRVJfRU5BQkxFLAotCQkJCQkJQUNQSV9CSVRNQVNLX1RJTUVSX0VOQUJMRX0sCi0JLyogQUNQSV9CSVRSRUdfR0xPQkFMX0xPQ0tfRU5BQkxFICAgKi8ge0FDUElfUkVHSVNURVJfUE0xX0VOQUJMRSwKLQkJCQkJCUFDUElfQklUUE9TSVRJT05fR0xPQkFMX0xPQ0tfRU5BQkxFLAotCQkJCQkJQUNQSV9CSVRNQVNLX0dMT0JBTF9MT0NLX0VOQUJMRX0sCi0JLyogQUNQSV9CSVRSRUdfUE9XRVJfQlVUVE9OX0VOQUJMRSAgKi8ge0FDUElfUkVHSVNURVJfUE0xX0VOQUJMRSwKLQkJCQkJCUFDUElfQklUUE9TSVRJT05fUE9XRVJfQlVUVE9OX0VOQUJMRSwKLQkJCQkJCUFDUElfQklUTUFTS19QT1dFUl9CVVRUT05fRU5BQkxFfSwKLQkvKiBBQ1BJX0JJVFJFR19TTEVFUF9CVVRUT05fRU5BQkxFICAqLyB7QUNQSV9SRUdJU1RFUl9QTTFfRU5BQkxFLAotCQkJCQkJQUNQSV9CSVRQT1NJVElPTl9TTEVFUF9CVVRUT05fRU5BQkxFLAotCQkJCQkJQUNQSV9CSVRNQVNLX1NMRUVQX0JVVFRPTl9FTkFCTEV9LAotCS8qIEFDUElfQklUUkVHX1JUX0NMT0NLX0VOQUJMRSAgICAgICovIHtBQ1BJX1JFR0lTVEVSX1BNMV9FTkFCTEUsCi0JCQkJCQlBQ1BJX0JJVFBPU0lUSU9OX1JUX0NMT0NLX0VOQUJMRSwKLQkJCQkJCUFDUElfQklUTUFTS19SVF9DTE9DS19FTkFCTEV9LAotCS8qIEFDUElfQklUUkVHX1BDSUVYUF9XQUtFX0RJU0FCTEUgICovIHtBQ1BJX1JFR0lTVEVSX1BNMV9FTkFCTEUsCi0JCQkJCQlBQ1BJX0JJVFBPU0lUSU9OX1BDSUVYUF9XQUtFX0RJU0FCTEUsCi0JCQkJCQlBQ1BJX0JJVE1BU0tfUENJRVhQX1dBS0VfRElTQUJMRX0sCi0KLQkvKiBBQ1BJX0JJVFJFR19TQ0lfRU5BQkxFICAgICAgICAgICAqLyB7QUNQSV9SRUdJU1RFUl9QTTFfQ09OVFJPTCwKLQkJCQkJCUFDUElfQklUUE9TSVRJT05fU0NJX0VOQUJMRSwKLQkJCQkJCUFDUElfQklUTUFTS19TQ0lfRU5BQkxFfSwKLQkvKiBBQ1BJX0JJVFJFR19CVVNfTUFTVEVSX1JMRCAgICAgICAqLyB7QUNQSV9SRUdJU1RFUl9QTTFfQ09OVFJPTCwKLQkJCQkJCUFDUElfQklUUE9TSVRJT05fQlVTX01BU1RFUl9STEQsCi0JCQkJCQlBQ1BJX0JJVE1BU0tfQlVTX01BU1RFUl9STER9LAotCS8qIEFDUElfQklUUkVHX0dMT0JBTF9MT0NLX1JFTEVBU0UgICovIHtBQ1BJX1JFR0lTVEVSX1BNMV9DT05UUk9MLAotCQkJCQkJQUNQSV9CSVRQT1NJVElPTl9HTE9CQUxfTE9DS19SRUxFQVNFLAotCQkJCQkJQUNQSV9CSVRNQVNLX0dMT0JBTF9MT0NLX1JFTEVBU0V9LAotCS8qIEFDUElfQklUUkVHX1NMRUVQX1RZUEVfQSAgICAgICAgICovIHtBQ1BJX1JFR0lTVEVSX1BNMV9DT05UUk9MLAotCQkJCQkJQUNQSV9CSVRQT1NJVElPTl9TTEVFUF9UWVBFX1gsCi0JCQkJCQlBQ1BJX0JJVE1BU0tfU0xFRVBfVFlQRV9YfSwKLQkvKiBBQ1BJX0JJVFJFR19TTEVFUF9UWVBFX0IgICAgICAgICAqLyB7QUNQSV9SRUdJU1RFUl9QTTFfQ09OVFJPTCwKLQkJCQkJCUFDUElfQklUUE9TSVRJT05fU0xFRVBfVFlQRV9YLAotCQkJCQkJQUNQSV9CSVRNQVNLX1NMRUVQX1RZUEVfWH0sCi0JLyogQUNQSV9CSVRSRUdfU0xFRVBfRU5BQkxFICAgICAgICAgKi8ge0FDUElfUkVHSVNURVJfUE0xX0NPTlRST0wsCi0JCQkJCQlBQ1BJX0JJVFBPU0lUSU9OX1NMRUVQX0VOQUJMRSwKLQkJCQkJCUFDUElfQklUTUFTS19TTEVFUF9FTkFCTEV9LAotCi0JLyogQUNQSV9CSVRSRUdfQVJCX0RJUyAgICAgICAgICAgICAgKi8ge0FDUElfUkVHSVNURVJfUE0yX0NPTlRST0wsCi0JCQkJCQlBQ1BJX0JJVFBPU0lUSU9OX0FSQl9ESVNBQkxFLAotCQkJCQkJQUNQSV9CSVRNQVNLX0FSQl9ESVNBQkxFfQotfTsKLQotc3RydWN0IGFjcGlfZml4ZWRfZXZlbnRfaW5mbyBhY3BpX2dibF9maXhlZF9ldmVudF9pbmZvW0FDUElfTlVNX0ZJWEVEX0VWRU5UU10gPSB7Ci0JLyogQUNQSV9FVkVOVF9QTVRJTUVSICAgICAgICovIHtBQ1BJX0JJVFJFR19USU1FUl9TVEFUVVMsCi0JCQkJCUFDUElfQklUUkVHX1RJTUVSX0VOQUJMRSwKLQkJCQkJQUNQSV9CSVRNQVNLX1RJTUVSX1NUQVRVUywKLQkJCQkJQUNQSV9CSVRNQVNLX1RJTUVSX0VOQUJMRX0sCi0JLyogQUNQSV9FVkVOVF9HTE9CQUwgICAgICAgICovIHtBQ1BJX0JJVFJFR19HTE9CQUxfTE9DS19TVEFUVVMsCi0JCQkJCUFDUElfQklUUkVHX0dMT0JBTF9MT0NLX0VOQUJMRSwKLQkJCQkJQUNQSV9CSVRNQVNLX0dMT0JBTF9MT0NLX1NUQVRVUywKLQkJCQkJQUNQSV9CSVRNQVNLX0dMT0JBTF9MT0NLX0VOQUJMRX0sCi0JLyogQUNQSV9FVkVOVF9QT1dFUl9CVVRUT04gICovIHtBQ1BJX0JJVFJFR19QT1dFUl9CVVRUT05fU1RBVFVTLAotCQkJCQlBQ1BJX0JJVFJFR19QT1dFUl9CVVRUT05fRU5BQkxFLAotCQkJCQlBQ1BJX0JJVE1BU0tfUE9XRVJfQlVUVE9OX1NUQVRVUywKLQkJCQkJQUNQSV9CSVRNQVNLX1BPV0VSX0JVVFRPTl9FTkFCTEV9LAotCS8qIEFDUElfRVZFTlRfU0xFRVBfQlVUVE9OICAqLyB7QUNQSV9CSVRSRUdfU0xFRVBfQlVUVE9OX1NUQVRVUywKLQkJCQkJQUNQSV9CSVRSRUdfU0xFRVBfQlVUVE9OX0VOQUJMRSwKLQkJCQkJQUNQSV9CSVRNQVNLX1NMRUVQX0JVVFRPTl9TVEFUVVMsCi0JCQkJCUFDUElfQklUTUFTS19TTEVFUF9CVVRUT05fRU5BQkxFfSwKLQkvKiBBQ1BJX0VWRU5UX1JUQyAgICAgICAgICAgKi8ge0FDUElfQklUUkVHX1JUX0NMT0NLX1NUQVRVUywKLQkJCQkJQUNQSV9CSVRSRUdfUlRfQ0xPQ0tfRU5BQkxFLAotCQkJCQlBQ1BJX0JJVE1BU0tfUlRfQ0xPQ0tfU1RBVFVTLAotCQkJCQlBQ1BJX0JJVE1BU0tfUlRfQ0xPQ0tfRU5BQkxFfSwKLX07Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfdXRfZ2V0X3JlZ2lvbl9uYW1lCi0gKgotICogUEFSQU1FVEVSUzogIE5vbmUuCi0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cwotICoKLSAqIERFU0NSSVBUSU9OOiBUcmFuc2xhdGUgYSBTcGFjZSBJRCBpbnRvIGEgbmFtZSBzdHJpbmcgKERlYnVnIG9ubHkpCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogUmVnaW9uIHR5cGUgZGVjb2RpbmcgKi8KLQotY29uc3QgY2hhciAqYWNwaV9nYmxfcmVnaW9uX3R5cGVzW0FDUElfTlVNX1BSRURFRklORURfUkVHSU9OU10gPSB7Ci0JIlN5c3RlbU1lbW9yeSIsCi0JIlN5c3RlbUlPIiwKLQkiUENJX0NvbmZpZyIsCi0JIkVtYmVkZGVkQ29udHJvbCIsCi0JIlNNQnVzIiwKLQkiQ01PUyIsCi0JIlBDSUJBUlRhcmdldCIsCi0JIkRhdGFUYWJsZSIKLX07Ci0KLWNoYXIgKmFjcGlfdXRfZ2V0X3JlZ2lvbl9uYW1lKHU4IHNwYWNlX2lkKQotewotCi0JaWYgKHNwYWNlX2lkID49IEFDUElfVVNFUl9SRUdJT05fQkVHSU4pIHsKLQkJcmV0dXJuICgiVXNlckRlZmluZWRSZWdpb24iKTsKLQl9IGVsc2UgaWYgKHNwYWNlX2lkID49IEFDUElfTlVNX1BSRURFRklORURfUkVHSU9OUykgewotCQlyZXR1cm4gKCJJbnZhbGlkU3BhY2VJZCIpOwotCX0KLQotCXJldHVybiAoQUNQSV9DQVNUX1BUUihjaGFyLCBhY3BpX2dibF9yZWdpb25fdHlwZXNbc3BhY2VfaWRdKSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfdXRfZ2V0X2V2ZW50X25hbWUKLSAqCi0gKiBQQVJBTUVURVJTOiAgTm9uZS4KLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IFRyYW5zbGF0ZSBhIEV2ZW50IElEIGludG8gYSBuYW1lIHN0cmluZyAoRGVidWcgb25seSkKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBFdmVudCB0eXBlIGRlY29kaW5nICovCi0KLXN0YXRpYyBjb25zdCBjaGFyICphY3BpX2dibF9ldmVudF90eXBlc1tBQ1BJX05VTV9GSVhFRF9FVkVOVFNdID0gewotCSJQTV9UaW1lciIsCi0JIkdsb2JhbExvY2siLAotCSJQb3dlckJ1dHRvbiIsCi0JIlNsZWVwQnV0dG9uIiwKLQkiUmVhbFRpbWVDbG9jayIsCi19OwotCi1jaGFyICphY3BpX3V0X2dldF9ldmVudF9uYW1lKHUzMiBldmVudF9pZCkKLXsKLQotCWlmIChldmVudF9pZCA+IEFDUElfRVZFTlRfTUFYKSB7Ci0JCXJldHVybiAoIkludmFsaWRFdmVudElEIik7Ci0JfQotCi0JcmV0dXJuIChBQ1BJX0NBU1RfUFRSKGNoYXIsIGFjcGlfZ2JsX2V2ZW50X3R5cGVzW2V2ZW50X2lkXSkpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X2dldF90eXBlX25hbWUKLSAqCi0gKiBQQVJBTUVURVJTOiAgTm9uZS4KLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IFRyYW5zbGF0ZSBhIFR5cGUgSUQgaW50byBhIG5hbWUgc3RyaW5nIChEZWJ1ZyBvbmx5KQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qCi0gKiBFbGVtZW50cyBvZiBhY3BpX2dibF9uc190eXBlX25hbWVzIGJlbG93IG11c3QgbWF0Y2gKLSAqIG9uZS10by1vbmUgd2l0aCB2YWx1ZXMgb2YgYWNwaV9vYmplY3RfdHlwZQotICoKLSAqIFRoZSB0eXBlIEFDUElfVFlQRV9BTlkgKFVudHlwZWQpIGlzIHVzZWQgYXMgYSAiZG9uJ3QgY2FyZSIgd2hlbiBzZWFyY2hpbmc7Ci0gKiB3aGVuIHN0b3JlZCBpbiBhIHRhYmxlIGl0IHJlYWxseSBtZWFucyB0aGF0IHdlIGhhdmUgdGh1cyBmYXIgc2VlbiBubwotICogZXZpZGVuY2UgdG8gaW5kaWNhdGUgd2hhdCB0eXBlIGlzIGFjdHVhbGx5IGdvaW5nIHRvIGJlIHN0b3JlZCBmb3IgdGhpcyBlbnRyeS4KLSAqLwotc3RhdGljIGNvbnN0IGNoYXIgYWNwaV9nYmxfYmFkX3R5cGVbXSA9ICJVTkRFRklORUQiOwotCi0vKiBQcmludGFibGUgbmFtZXMgb2YgdGhlIEFDUEkgb2JqZWN0IHR5cGVzICovCi0KLXN0YXRpYyBjb25zdCBjaGFyICphY3BpX2dibF9uc190eXBlX25hbWVzW10gPSB7Ci0JLyogMDAgKi8gIlVudHlwZWQiLAotCS8qIDAxICovICJJbnRlZ2VyIiwKLQkvKiAwMiAqLyAiU3RyaW5nIiwKLQkvKiAwMyAqLyAiQnVmZmVyIiwKLQkvKiAwNCAqLyAiUGFja2FnZSIsCi0JLyogMDUgKi8gIkZpZWxkVW5pdCIsCi0JLyogMDYgKi8gIkRldmljZSIsCi0JLyogMDcgKi8gIkV2ZW50IiwKLQkvKiAwOCAqLyAiTWV0aG9kIiwKLQkvKiAwOSAqLyAiTXV0ZXgiLAotCS8qIDEwICovICJSZWdpb24iLAotCS8qIDExICovICJQb3dlciIsCi0JLyogMTIgKi8gIlByb2Nlc3NvciIsCi0JLyogMTMgKi8gIlRoZXJtYWwiLAotCS8qIDE0ICovICJCdWZmZXJGaWVsZCIsCi0JLyogMTUgKi8gIkRkYkhhbmRsZSIsCi0JLyogMTYgKi8gIkRlYnVnT2JqZWN0IiwKLQkvKiAxNyAqLyAiUmVnaW9uRmllbGQiLAotCS8qIDE4ICovICJCYW5rRmllbGQiLAotCS8qIDE5ICovICJJbmRleEZpZWxkIiwKLQkvKiAyMCAqLyAiUmVmZXJlbmNlIiwKLQkvKiAyMSAqLyAiQWxpYXMiLAotCS8qIDIyICovICJNZXRob2RBbGlhcyIsCi0JLyogMjMgKi8gIk5vdGlmeSIsCi0JLyogMjQgKi8gIkFkZHJIYW5kbGVyIiwKLQkvKiAyNSAqLyAiUmVzb3VyY2VEZXNjIiwKLQkvKiAyNiAqLyAiUmVzb3VyY2VGbGQiLAotCS8qIDI3ICovICJTY29wZSIsCi0JLyogMjggKi8gIkV4dHJhIiwKLQkvKiAyOSAqLyAiRGF0YSIsCi0JLyogMzAgKi8gIkludmFsaWQiCi19OwotCi1jaGFyICphY3BpX3V0X2dldF90eXBlX25hbWUoYWNwaV9vYmplY3RfdHlwZSB0eXBlKQotewotCi0JaWYgKHR5cGUgPiBBQ1BJX1RZUEVfSU5WQUxJRCkgewotCQlyZXR1cm4gKEFDUElfQ0FTVF9QVFIoY2hhciwgYWNwaV9nYmxfYmFkX3R5cGUpKTsKLQl9Ci0KLQlyZXR1cm4gKEFDUElfQ0FTVF9QVFIoY2hhciwgYWNwaV9nYmxfbnNfdHlwZV9uYW1lc1t0eXBlXSkpOwotfQotCi1jaGFyICphY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjKQotewotCi0JaWYgKCFvYmpfZGVzYykgewotCQlyZXR1cm4gKCJbTlVMTCBPYmplY3QgRGVzY3JpcHRvcl0iKTsKLQl9Ci0KLQlyZXR1cm4gKGFjcGlfdXRfZ2V0X3R5cGVfbmFtZShBQ1BJX0dFVF9PQkpFQ1RfVFlQRShvYmpfZGVzYykpKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV91dF9nZXRfbm9kZV9uYW1lCi0gKgotICogUEFSQU1FVEVSUzogIE9iamVjdCAgICAgICAgICAgICAgIC0gQSBuYW1lc3BhY2Ugbm9kZQotICoKLSAqIFJFVFVSTjogICAgICBQb2ludGVyIHRvIGEgc3RyaW5nCi0gKgotICogREVTQ1JJUFRJT046IFZhbGlkYXRlIHRoZSBub2RlIGFuZCByZXR1cm4gdGhlIG5vZGUncyBBQ1BJIG5hbWUuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotY2hhciAqYWNwaV91dF9nZXRfbm9kZV9uYW1lKHZvaWQgKm9iamVjdCkKLXsKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZSA9IChzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqKW9iamVjdDsKLQotCS8qIE11c3QgcmV0dXJuIGEgc3RyaW5nIG9mIGV4YWN0bHkgNCBjaGFyYWN0ZXJzID09IEFDUElfTkFNRV9TSVpFICovCi0KLQlpZiAoIW9iamVjdCkgewotCQlyZXR1cm4gKCJOVUxMIik7Ci0JfQotCi0JLyogQ2hlY2sgZm9yIFJvb3Qgbm9kZSAqLwotCi0JaWYgKChvYmplY3QgPT0gQUNQSV9ST09UX09CSkVDVCkgfHwgKG9iamVjdCA9PSBhY3BpX2dibF9yb290X25vZGUpKSB7Ci0JCXJldHVybiAoIlwiXFxcIiAiKTsKLQl9Ci0KLQkvKiBEZXNjcmlwdG9yIG11c3QgYmUgYSBuYW1lc3BhY2Ugbm9kZSAqLwotCi0JaWYgKEFDUElfR0VUX0RFU0NSSVBUT1JfVFlQRShub2RlKSAhPSBBQ1BJX0RFU0NfVFlQRV9OQU1FRCkgewotCQlyZXR1cm4gKCIjIyMjIik7Ci0JfQotCi0JLyogTmFtZSBtdXN0IGJlIGEgdmFsaWQgQUNQSSBuYW1lICovCi0KLQlpZiAoIWFjcGlfdXRfdmFsaWRfYWNwaV9uYW1lKG5vZGUtPm5hbWUuaW50ZWdlcikpIHsKLQkJbm9kZS0+bmFtZS5pbnRlZ2VyID0gYWNwaV91dF9yZXBhaXJfbmFtZShub2RlLT5uYW1lLmFzY2lpKTsKLQl9Ci0KLQkvKiBSZXR1cm4gdGhlIG5hbWUgKi8KLQotCXJldHVybiAobm9kZS0+bmFtZS5hc2NpaSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfdXRfZ2V0X2Rlc2NyaXB0b3JfbmFtZQotICoKLSAqIFBBUkFNRVRFUlM6ICBPYmplY3QgICAgICAgICAgICAgICAtIEFuIEFDUEkgb2JqZWN0Ci0gKgotICogUkVUVVJOOiAgICAgIFBvaW50ZXIgdG8gYSBzdHJpbmcKLSAqCi0gKiBERVNDUklQVElPTjogVmFsaWRhdGUgb2JqZWN0IGFuZCByZXR1cm4gdGhlIGRlc2NyaXB0b3IgdHlwZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIFByaW50YWJsZSBuYW1lcyBvZiBvYmplY3QgZGVzY3JpcHRvciB0eXBlcyAqLwotCi1zdGF0aWMgY29uc3QgY2hhciAqYWNwaV9nYmxfZGVzY190eXBlX25hbWVzW10gPSB7Ci0JLyogMDAgKi8gIkludmFsaWQiLAotCS8qIDAxICovICJDYWNoZWQiLAotCS8qIDAyICovICJTdGF0ZS1HZW5lcmljIiwKLQkvKiAwMyAqLyAiU3RhdGUtVXBkYXRlIiwKLQkvKiAwNCAqLyAiU3RhdGUtUGFja2FnZSIsCi0JLyogMDUgKi8gIlN0YXRlLUNvbnRyb2wiLAotCS8qIDA2ICovICJTdGF0ZS1Sb290UGFyc2VTY29wZSIsCi0JLyogMDcgKi8gIlN0YXRlLVBhcnNlU2NvcGUiLAotCS8qIDA4ICovICJTdGF0ZS1XYWxrU2NvcGUiLAotCS8qIDA5ICovICJTdGF0ZS1SZXN1bHQiLAotCS8qIDEwICovICJTdGF0ZS1Ob3RpZnkiLAotCS8qIDExICovICJTdGF0ZS1UaHJlYWQiLAotCS8qIDEyICovICJXYWxrIiwKLQkvKiAxMyAqLyAiUGFyc2VyIiwKLQkvKiAxNCAqLyAiT3BlcmFuZCIsCi0JLyogMTUgKi8gIk5vZGUiCi19OwotCi1jaGFyICphY3BpX3V0X2dldF9kZXNjcmlwdG9yX25hbWUodm9pZCAqb2JqZWN0KQotewotCi0JaWYgKCFvYmplY3QpIHsKLQkJcmV0dXJuICgiTlVMTCBPQkpFQ1QiKTsKLQl9Ci0KLQlpZiAoQUNQSV9HRVRfREVTQ1JJUFRPUl9UWVBFKG9iamVjdCkgPiBBQ1BJX0RFU0NfVFlQRV9NQVgpIHsKLQkJcmV0dXJuIChBQ1BJX0NBU1RfUFRSKGNoYXIsIGFjcGlfZ2JsX2JhZF90eXBlKSk7Ci0JfQotCi0JcmV0dXJuIChBQ1BJX0NBU1RfUFRSKGNoYXIsCi0JCQkgICAgICBhY3BpX2dibF9kZXNjX3R5cGVfbmFtZXNbQUNQSV9HRVRfREVTQ1JJUFRPUl9UWVBFCi0JCQkJCQkgICAgICAgKG9iamVjdCldKSk7Ci0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV91dF9nZXRfcmVmZXJlbmNlX25hbWUKLSAqCi0gKiBQQVJBTUVURVJTOiAgT2JqZWN0ICAgICAgICAgICAgICAgLSBBbiBBQ1BJIHJlZmVyZW5jZSBvYmplY3QKLSAqCi0gKiBSRVRVUk46ICAgICAgUG9pbnRlciB0byBhIHN0cmluZwotICoKLSAqIERFU0NSSVBUSU9OOiBEZWNvZGUgYSByZWZlcmVuY2Ugb2JqZWN0IHN1Yi10eXBlIHRvIGEgc3RyaW5nLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIFByaW50YWJsZSBuYW1lcyBvZiByZWZlcmVuY2Ugb2JqZWN0IHN1Yi10eXBlcyAqLwotCi1zdGF0aWMgY29uc3QgY2hhciAqYWNwaV9nYmxfcmVmX2NsYXNzX25hbWVzW10gPSB7Ci0JLyogMDAgKi8gIkxvY2FsIiwKLQkvKiAwMSAqLyAiQXJndW1lbnQiLAotCS8qIDAyICovICJSZWZPZiIsCi0JLyogMDMgKi8gIkluZGV4IiwKLQkvKiAwNCAqLyAiRGRiSGFuZGxlIiwKLQkvKiAwNSAqLyAiTmFtZWQgT2JqZWN0IiwKLQkvKiAwNiAqLyAiRGVidWciCi19OwotCi1jb25zdCBjaGFyICphY3BpX3V0X2dldF9yZWZlcmVuY2VfbmFtZSh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmplY3QpCi17Ci0JaWYgKCFvYmplY3QpCi0JCXJldHVybiAiTlVMTCBPYmplY3QiOwotCi0JaWYgKEFDUElfR0VUX0RFU0NSSVBUT1JfVFlQRShvYmplY3QpICE9IEFDUElfREVTQ19UWVBFX09QRVJBTkQpCi0JCXJldHVybiAiTm90IGFuIE9wZXJhbmQgb2JqZWN0IjsKLQotCWlmIChvYmplY3QtPmNvbW1vbi50eXBlICE9IEFDUElfVFlQRV9MT0NBTF9SRUZFUkVOQ0UpCi0JCXJldHVybiAiTm90IGEgUmVmZXJlbmNlIG9iamVjdCI7Ci0KLQlpZiAob2JqZWN0LT5yZWZlcmVuY2UuY2xhc3MgPiBBQ1BJX1JFRkNMQVNTX01BWCkKLQkJcmV0dXJuICJVbmtub3duIFJlZmVyZW5jZSBjbGFzcyI7Ci0KLQlyZXR1cm4gYWNwaV9nYmxfcmVmX2NsYXNzX25hbWVzW29iamVjdC0+cmVmZXJlbmNlLmNsYXNzXTsKLX0KLQotI2lmIGRlZmluZWQoQUNQSV9ERUJVR19PVVRQVVQpIHx8IGRlZmluZWQoQUNQSV9ERUJVR0dFUikKLS8qCi0gKiBTdHJpbmdzIGFuZCBwcm9jZWR1cmVzIHVzZWQgZm9yIGRlYnVnIG9ubHkKLSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X2dldF9tdXRleF9uYW1lCi0gKgotICogUEFSQU1FVEVSUzogIG11dGV4X2lkICAgICAgICAtIFRoZSBwcmVkZWZpbmVkIElEIGZvciB0aGlzIG11dGV4LgotICoKLSAqIFJFVFVSTjogICAgICBTdHJpbmcgY29udGFpbmluZyB0aGUgbmFtZSBvZiB0aGUgbXV0ZXguIEFsd2F5cyByZXR1cm5zIGEgdmFsaWQKLSAqICAgICAgICAgICAgICBwb2ludGVyLgotICoKLSAqIERFU0NSSVBUSU9OOiBUcmFuc2xhdGUgYSBtdXRleCBJRCBpbnRvIGEgbmFtZSBzdHJpbmcgKERlYnVnIG9ubHkpCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotY2hhciAqYWNwaV91dF9nZXRfbXV0ZXhfbmFtZSh1MzIgbXV0ZXhfaWQpCi17Ci0KLQlpZiAobXV0ZXhfaWQgPiBBQ1BJX01BWF9NVVRFWCkgewotCQlyZXR1cm4gKCJJbnZhbGlkIE11dGV4IElEIik7Ci0JfQotCi0JcmV0dXJuIChhY3BpX2dibF9tdXRleF9uYW1lc1ttdXRleF9pZF0pOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X2dldF9ub3RpZnlfbmFtZQotICoKLSAqIFBBUkFNRVRFUlM6ICBub3RpZnlfdmFsdWUgICAgLSBWYWx1ZSBmcm9tIHRoZSBOb3RpZnkoKSByZXF1ZXN0Ci0gKgotICogUkVUVVJOOiAgICAgIFN0cmluZyBjb3JyZXNwb25kaW5nIHRvIHRoZSBOb3RpZnkgVmFsdWUuCi0gKgotICogREVTQ1JJUFRJT046IFRyYW5zbGF0ZSBhIE5vdGlmeSBWYWx1ZSB0byBhIG5vdGlmeSBuYW1lc3RyaW5nLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIE5hbWVzIGZvciBOb3RpZnkoKSB2YWx1ZXMsIHVzZWQgZm9yIGRlYnVnIG91dHB1dCAqLwotCi1zdGF0aWMgY29uc3QgY2hhciAqYWNwaV9nYmxfbm90aWZ5X3ZhbHVlX25hbWVzW10gPSB7Ci0JIkJ1cyBDaGVjayIsCi0JIkRldmljZSBDaGVjayIsCi0JIkRldmljZSBXYWtlIiwKLQkiRWplY3QgUmVxdWVzdCIsCi0JIkRldmljZSBDaGVjayBMaWdodCIsCi0JIkZyZXF1ZW5jeSBNaXNtYXRjaCIsCi0JIkJ1cyBNb2RlIE1pc21hdGNoIiwKLQkiUG93ZXIgRmF1bHQiLAotCSJDYXBhYmlsaXRpZXMgQ2hlY2siLAotCSJEZXZpY2UgUExEIENoZWNrIiwKLQkiUmVzZXJ2ZWQiLAotCSJTeXN0ZW0gTG9jYWxpdHkgVXBkYXRlIgotfTsKLQotY29uc3QgY2hhciAqYWNwaV91dF9nZXRfbm90aWZ5X25hbWUodTMyIG5vdGlmeV92YWx1ZSkKLXsKLQotCWlmIChub3RpZnlfdmFsdWUgPD0gQUNQSV9OT1RJRllfTUFYKSB7Ci0JCXJldHVybiAoYWNwaV9nYmxfbm90aWZ5X3ZhbHVlX25hbWVzW25vdGlmeV92YWx1ZV0pOwotCX0gZWxzZSBpZiAobm90aWZ5X3ZhbHVlIDw9IEFDUElfTUFYX1NZU19OT1RJRlkpIHsKLQkJcmV0dXJuICgiUmVzZXJ2ZWQiKTsKLQl9IGVsc2UgewkJLyogR3JlYXRlciBvciBlcXVhbCB0byAweDgwICovCi0KLQkJcmV0dXJuICgiKipEZXZpY2UgU3BlY2lmaWMqKiIpOwotCX0KLX0KLSNlbmRpZgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X3ZhbGlkX29iamVjdF90eXBlCi0gKgotICogUEFSQU1FVEVSUzogIFR5cGUgICAgICAgICAgICAtIE9iamVjdCB0eXBlIHRvIGJlIHZhbGlkYXRlZAotICoKLSAqIFJFVFVSTjogICAgICBUUlVFIGlmIHZhbGlkIG9iamVjdCB0eXBlLCBGQUxTRSBvdGhlcndpc2UKLSAqCi0gKiBERVNDUklQVElPTjogVmFsaWRhdGUgYW4gb2JqZWN0IHR5cGUKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi11OCBhY3BpX3V0X3ZhbGlkX29iamVjdF90eXBlKGFjcGlfb2JqZWN0X3R5cGUgdHlwZSkKLXsKLQotCWlmICh0eXBlID4gQUNQSV9UWVBFX0xPQ0FMX01BWCkgewotCi0JCS8qIE5vdGU6IEFzc3VtZXMgYWxsIFRZUEVzIGFyZSBjb250aWd1b3VzIChleHRlcm5hbC9sb2NhbCkgKi8KLQotCQlyZXR1cm4gKEZBTFNFKTsKLQl9Ci0KLQlyZXR1cm4gKFRSVUUpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X2luaXRfZ2xvYmFscwotICoKLSAqIFBBUkFNRVRFUlM6ICBOb25lCi0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cwotICoKLSAqIERFU0NSSVBUSU9OOiBJbml0IGxpYnJhcnkgZ2xvYmFscy4gIEFsbCBnbG9iYWxzIHRoYXQgcmVxdWlyZSBzcGVjaWZpYwotICogICAgICAgICAgICAgIGluaXRpYWxpemF0aW9uIHNob3VsZCBiZSBpbml0aWFsaXplZCBoZXJlIQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWFjcGlfc3RhdHVzIGFjcGlfdXRfaW5pdF9nbG9iYWxzKHZvaWQpCi17Ci0JYWNwaV9zdGF0dXMgc3RhdHVzOwotCXUzMiBpOwotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSh1dF9pbml0X2dsb2JhbHMpOwotCi0JLyogQ3JlYXRlIGFsbCBtZW1vcnkgY2FjaGVzICovCi0KLQlzdGF0dXMgPSBhY3BpX3V0X2NyZWF0ZV9jYWNoZXMoKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci0JfQotCi0JLyogTXV0ZXggbG9ja2VkIGZsYWdzICovCi0KLQlmb3IgKGkgPSAwOyBpIDwgQUNQSV9OVU1fTVVURVg7IGkrKykgewotCQlhY3BpX2dibF9tdXRleF9pbmZvW2ldLm11dGV4ID0gTlVMTDsKLQkJYWNwaV9nYmxfbXV0ZXhfaW5mb1tpXS50aHJlYWRfaWQgPSBBQ1BJX01VVEVYX05PVF9BQ1FVSVJFRDsKLQkJYWNwaV9nYmxfbXV0ZXhfaW5mb1tpXS51c2VfY291bnQgPSAwOwotCX0KLQotCWZvciAoaSA9IDA7IGkgPCBBQ1BJX05VTV9PV05FUklEX01BU0tTOyBpKyspIHsKLQkJYWNwaV9nYmxfb3duZXJfaWRfbWFza1tpXSA9IDA7Ci0JfQotCWFjcGlfZ2JsX293bmVyX2lkX21hc2tbQUNQSV9OVU1fT1dORVJJRF9NQVNLUyAtIDFdID0gMHg4MDAwMDAwMDsJLyogTGFzdCBJRCBpcyBuZXZlciB2YWxpZCAqLwotCi0JLyogR1BFIHN1cHBvcnQgKi8KLQotCWFjcGlfZ2JsX2dwZV94cnVwdF9saXN0X2hlYWQgPSBOVUxMOwotCWFjcGlfZ2JsX2dwZV9mYWR0X2Jsb2Nrc1swXSA9IE5VTEw7Ci0JYWNwaV9nYmxfZ3BlX2ZhZHRfYmxvY2tzWzFdID0gTlVMTDsKLQotCS8qIEdsb2JhbCBoYW5kbGVycyAqLwotCi0JYWNwaV9nYmxfc3lzdGVtX25vdGlmeS5oYW5kbGVyID0gTlVMTDsKLQlhY3BpX2dibF9kZXZpY2Vfbm90aWZ5LmhhbmRsZXIgPSBOVUxMOwotCWFjcGlfZ2JsX2V4Y2VwdGlvbl9oYW5kbGVyID0gTlVMTDsKLQlhY3BpX2dibF9pbml0X2hhbmRsZXIgPSBOVUxMOwotCWFjcGlfZ2JsX3RhYmxlX2hhbmRsZXIgPSBOVUxMOwotCi0JLyogR2xvYmFsIExvY2sgc3VwcG9ydCAqLwotCi0JYWNwaV9nYmxfZ2xvYmFsX2xvY2tfc2VtYXBob3JlID0gTlVMTDsKLQlhY3BpX2dibF9nbG9iYWxfbG9ja19tdXRleCA9IE5VTEw7Ci0JYWNwaV9nYmxfZ2xvYmFsX2xvY2tfYWNxdWlyZWQgPSBGQUxTRTsKLQlhY3BpX2dibF9nbG9iYWxfbG9ja19oYW5kbGUgPSAwOwotCi0JLyogTWlzY2VsbGFuZW91cyB2YXJpYWJsZXMgKi8KLQotCWFjcGlfZ2JsX2NtX3NpbmdsZV9zdGVwID0gRkFMU0U7Ci0JYWNwaV9nYmxfZGJfdGVybWluYXRlX3RocmVhZHMgPSBGQUxTRTsKLQlhY3BpX2dibF9zaHV0ZG93biA9IEZBTFNFOwotCWFjcGlfZ2JsX25zX2xvb2t1cF9jb3VudCA9IDA7Ci0JYWNwaV9nYmxfcHNfZmluZF9jb3VudCA9IDA7Ci0JYWNwaV9nYmxfYWNwaV9oYXJkd2FyZV9wcmVzZW50ID0gVFJVRTsKLQlhY3BpX2dibF9sYXN0X293bmVyX2lkX2luZGV4ID0gMDsKLQlhY3BpX2dibF9uZXh0X293bmVyX2lkX29mZnNldCA9IDA7Ci0JYWNwaV9nYmxfdHJhY2VfbWV0aG9kX25hbWUgPSAwOwotCWFjcGlfZ2JsX3RyYWNlX2RiZ19sZXZlbCA9IDA7Ci0JYWNwaV9nYmxfdHJhY2VfZGJnX2xheWVyID0gMDsKLQlhY3BpX2dibF9kZWJ1Z2dlcl9jb25maWd1cmF0aW9uID0gREVCVUdHRVJfVEhSRUFESU5HOwotCWFjcGlfZ2JsX2RiX291dHB1dF9mbGFncyA9IEFDUElfREJfQ09OU09MRV9PVVRQVVQ7Ci0KLQkvKiBIYXJkd2FyZSBvcmllbnRlZCAqLwotCi0JYWNwaV9nYmxfZXZlbnRzX2luaXRpYWxpemVkID0gRkFMU0U7Ci0JYWNwaV9nYmxfc3lzdGVtX2F3YWtlX2FuZF9ydW5uaW5nID0gVFJVRTsKLQotCS8qIE5hbWVzcGFjZSAqLwotCi0JYWNwaV9nYmxfcm9vdF9ub2RlID0gTlVMTDsKLQlhY3BpX2dibF9yb290X25vZGVfc3RydWN0Lm5hbWUuaW50ZWdlciA9IEFDUElfUk9PVF9OQU1FOwotCWFjcGlfZ2JsX3Jvb3Rfbm9kZV9zdHJ1Y3QuZGVzY3JpcHRvcl90eXBlID0gQUNQSV9ERVNDX1RZUEVfTkFNRUQ7Ci0JYWNwaV9nYmxfcm9vdF9ub2RlX3N0cnVjdC50eXBlID0gQUNQSV9UWVBFX0RFVklDRTsKLQlhY3BpX2dibF9yb290X25vZGVfc3RydWN0LmNoaWxkID0gTlVMTDsKLQlhY3BpX2dibF9yb290X25vZGVfc3RydWN0LnBlZXIgPSBOVUxMOwotCWFjcGlfZ2JsX3Jvb3Rfbm9kZV9zdHJ1Y3Qub2JqZWN0ID0gTlVMTDsKLQlhY3BpX2dibF9yb290X25vZGVfc3RydWN0LmZsYWdzID0gQU5PQkpfRU5EX09GX1BFRVJfTElTVDsKLQotI2lmZGVmIEFDUElfREVCVUdfT1VUUFVUCi0JYWNwaV9nYmxfbG93ZXN0X3N0YWNrX3BvaW50ZXIgPSBBQ1BJX0NBU1RfUFRSKGFjcGlfc2l6ZSwgQUNQSV9TSVpFX01BWCk7Ci0jZW5kaWYKLQotI2lmZGVmIEFDUElfREJHX1RSQUNLX0FMTE9DQVRJT05TCi0JYWNwaV9nYmxfZGlzcGxheV9maW5hbF9tZW1fc3RhdHMgPSBGQUxTRTsKLSNlbmRpZgotCi0JcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKLX0KLQotQUNQSV9FWFBPUlRfU1lNQk9MKGFjcGlfZGJnX2xldmVsKQotQUNQSV9FWFBPUlRfU1lNQk9MKGFjcGlfZGJnX2xheWVyKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dGluaXQuYyBiL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXRpbml0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhZTUxNWYuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dGluaXQuYworKysgL2Rldi9udWxsCkBAIC0xLDE1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogTW9kdWxlIE5hbWU6IHV0aW5pdCAtIENvbW1vbiBBQ1BJIHN1YnN5c3RlbSBpbml0aWFsaXphdGlvbgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDgsIEludGVsIENvcnAuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCi0gKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSBhdCBtaW5pbXVtIGEgZGlzY2xhaW1lcgotICogICAgc3Vic3RhbnRpYWxseSBzaW1pbGFyIHRvIHRoZSAiTk8gV0FSUkFOVFkiIGRpc2NsYWltZXIgYmVsb3cKLSAqICAgICgiRGlzY2xhaW1lciIpIGFuZCBhbnkgcmVkaXN0cmlidXRpb24gbXVzdCBiZSBjb25kaXRpb25lZCB1cG9uCi0gKiAgICBpbmNsdWRpbmcgYSBzdWJzdGFudGlhbGx5IHNpbWlsYXIgRGlzY2xhaW1lciByZXF1aXJlbWVudCBmb3IgZnVydGhlcgotICogICAgYmluYXJ5IHJlZGlzdHJpYnV0aW9uLgotICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzCi0gKiAgICBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIE5PIFdBUlJBTlRZCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKLSAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCi0gKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORwotICogSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCi0gKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCi0gKi8KLQotI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgotI2luY2x1ZGUgPGFjcGkvYWNuYW1lc3AuaD4KLSNpbmNsdWRlIDxhY3BpL2FjZXZlbnRzLmg+Ci0jaW5jbHVkZSA8YWNwaS9hY3RhYmxlcy5oPgotCi0jZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9VVElMSVRJRVMKLUFDUElfTU9EVUxFX05BTUUoInV0aW5pdCIpCi0KLS8qIExvY2FsIHByb3RvdHlwZXMgKi8KLXN0YXRpYyB2b2lkIGFjcGlfdXRfdGVybWluYXRlKHZvaWQpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfdXRfdGVybWluYXRlCi0gKgotICogUEFSQU1FVEVSUzogIG5vbmUKLSAqCi0gKiBSRVRVUk46ICAgICAgbm9uZQotICoKLSAqIERFU0NSSVBUSU9OOiBGcmVlIGdsb2JhbCBtZW1vcnkKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgdm9pZCBhY3BpX3V0X3Rlcm1pbmF0ZSh2b2lkKQotewotCXN0cnVjdCBhY3BpX2dwZV9ibG9ja19pbmZvICpncGVfYmxvY2s7Ci0Jc3RydWN0IGFjcGlfZ3BlX2Jsb2NrX2luZm8gKm5leHRfZ3BlX2Jsb2NrOwotCXN0cnVjdCBhY3BpX2dwZV94cnVwdF9pbmZvICpncGVfeHJ1cHRfaW5mbzsKLQlzdHJ1Y3QgYWNwaV9ncGVfeHJ1cHRfaW5mbyAqbmV4dF9ncGVfeHJ1cHRfaW5mbzsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UodXRfdGVybWluYXRlKTsKLQotCS8qIEZyZWUgZ2xvYmFsIEdQRSBibG9ja3MgYW5kIHJlbGF0ZWQgaW5mbyBzdHJ1Y3R1cmVzICovCi0KLQlncGVfeHJ1cHRfaW5mbyA9IGFjcGlfZ2JsX2dwZV94cnVwdF9saXN0X2hlYWQ7Ci0Jd2hpbGUgKGdwZV94cnVwdF9pbmZvKSB7Ci0JCWdwZV9ibG9jayA9IGdwZV94cnVwdF9pbmZvLT5ncGVfYmxvY2tfbGlzdF9oZWFkOwotCQl3aGlsZSAoZ3BlX2Jsb2NrKSB7Ci0JCQluZXh0X2dwZV9ibG9jayA9IGdwZV9ibG9jay0+bmV4dDsKLQkJCUFDUElfRlJFRShncGVfYmxvY2stPmV2ZW50X2luZm8pOwotCQkJQUNQSV9GUkVFKGdwZV9ibG9jay0+cmVnaXN0ZXJfaW5mbyk7Ci0JCQlBQ1BJX0ZSRUUoZ3BlX2Jsb2NrKTsKLQotCQkJZ3BlX2Jsb2NrID0gbmV4dF9ncGVfYmxvY2s7Ci0JCX0KLQkJbmV4dF9ncGVfeHJ1cHRfaW5mbyA9IGdwZV94cnVwdF9pbmZvLT5uZXh0OwotCQlBQ1BJX0ZSRUUoZ3BlX3hydXB0X2luZm8pOwotCQlncGVfeHJ1cHRfaW5mbyA9IG5leHRfZ3BlX3hydXB0X2luZm87Ci0JfQotCi0JcmV0dXJuX1ZPSUQ7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfdXRfc3Vic3lzdGVtX3NodXRkb3duCi0gKgotICogUEFSQU1FVEVSUzogIG5vbmUKLSAqCi0gKiBSRVRVUk46ICAgICAgbm9uZQotICoKLSAqIERFU0NSSVBUSU9OOiBTaHV0ZG93biB0aGUgdmFyaW91cyBzdWJzeXN0ZW1zLiAgRG9uJ3QgZGVsZXRlIHRoZSBtdXRleAotICogICAgICAgICAgICAgIG9iamVjdHMgaGVyZSAtLSBiZWNhdXNlIHRoZSBBTUwgZGVidWdnZXIgbWF5IGJlIHN0aWxsIHJ1bm5pbmcuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdm9pZCBhY3BpX3V0X3N1YnN5c3RlbV9zaHV0ZG93bih2b2lkKQotewotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSh1dF9zdWJzeXN0ZW1fc2h1dGRvd24pOwotCi0JLyogSnVzdCBleGl0IGlmIHN1YnN5c3RlbSBpcyBhbHJlYWR5IHNodXRkb3duICovCi0KLQlpZiAoYWNwaV9nYmxfc2h1dGRvd24pIHsKLQkJQUNQSV9FUlJPUigoQUVfSU5GTywgIkFDUEkgU3Vic3lzdGVtIGlzIGFscmVhZHkgdGVybWluYXRlZCIpKTsKLQkJcmV0dXJuX1ZPSUQ7Ci0JfQotCi0JLyogU3Vic3lzdGVtIGFwcGVhcnMgYWN0aXZlLCBnbyBhaGVhZCBhbmQgc2h1dCBpdCBkb3duICovCi0KLQlhY3BpX2dibF9zaHV0ZG93biA9IFRSVUU7Ci0JYWNwaV9nYmxfc3RhcnR1cF9mbGFncyA9IDA7Ci0JQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLCAiU2h1dHRpbmcgZG93biBBQ1BJIFN1YnN5c3RlbVxuIikpOwotCi0jaWZuZGVmIEFDUElfQVNMX0NPTVBJTEVSCi0KLQkvKiBDbG9zZSB0aGUgYWNwaV9ldmVudCBIYW5kbGluZyAqLwotCi0JYWNwaV9ldl90ZXJtaW5hdGUoKTsKLSNlbmRpZgotCi0JLyogQ2xvc2UgdGhlIE5hbWVzcGFjZSAqLwotCi0JYWNwaV9uc190ZXJtaW5hdGUoKTsKLQotCS8qIERlbGV0ZSB0aGUgQUNQSSB0YWJsZXMgKi8KLQotCWFjcGlfdGJfdGVybWluYXRlKCk7Ci0KLQkvKiBDbG9zZSB0aGUgZ2xvYmFscyAqLwotCi0JYWNwaV91dF90ZXJtaW5hdGUoKTsKLQotCS8qIFB1cmdlIHRoZSBsb2NhbCBjYWNoZXMgKi8KLQotCSh2b2lkKWFjcGlfdXRfZGVsZXRlX2NhY2hlcygpOwotCXJldHVybl9WT0lEOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dG1hdGguYyBiL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXRtYXRoLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5MjczMjQuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dG1hdGguYworKysgL2Rldi9udWxsCkBAIC0xLDMxMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIE1vZHVsZSBOYW1lOiB1dG1hdGggLSBJbnRlZ2VyIG1hdGggc3VwcG9ydCByb3V0aW5lcwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA4LCBJbnRlbCBDb3JwLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAotICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgYXQgbWluaW11bSBhIGRpc2NsYWltZXIKLSAqICAgIHN1YnN0YW50aWFsbHkgc2ltaWxhciB0byB0aGUgIk5PIFdBUlJBTlRZIiBkaXNjbGFpbWVyIGJlbG93Ci0gKiAgICAoIkRpc2NsYWltZXIiKSBhbmQgYW55IHJlZGlzdHJpYnV0aW9uIG11c3QgYmUgY29uZGl0aW9uZWQgdXBvbgotICogICAgaW5jbHVkaW5nIGEgc3Vic3RhbnRpYWxseSBzaW1pbGFyIERpc2NsYWltZXIgcmVxdWlyZW1lbnQgZm9yIGZ1cnRoZXIKLSAqICAgIGJpbmFyeSByZWRpc3RyaWJ1dGlvbi4KLSAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcwotICogICAgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICogU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBOTyBXQVJSQU5UWQotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCi0gKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUwotICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcKLSAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQotICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgotICovCi0KLSNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KLQotI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfVVRJTElUSUVTCi1BQ1BJX01PRFVMRV9OQU1FKCJ1dG1hdGgiKQotCi0vKgotICogU3VwcG9ydCBmb3IgZG91YmxlLXByZWNpc2lvbiBpbnRlZ2VyIGRpdmlkZS4gIFRoaXMgY29kZSBpcyBpbmNsdWRlZCBoZXJlCi0gKiBpbiBvcmRlciB0byBzdXBwb3J0IGtlcm5lbCBlbnZpcm9ubWVudHMgd2hlcmUgdGhlIGRvdWJsZS1wcmVjaXNpb24gbWF0aAotICogbGlicmFyeSBpcyBub3QgYXZhaWxhYmxlLgotICovCi0jaWZuZGVmIEFDUElfVVNFX05BVElWRV9ESVZJREUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfdXRfc2hvcnRfZGl2aWRlCi0gKgotICogUEFSQU1FVEVSUzogIERpdmlkZW5kICAgICAgICAgICAgLSA2NC1iaXQgZGl2aWRlbmQKLSAqICAgICAgICAgICAgICBEaXZpc29yICAgICAgICAgICAgIC0gMzItYml0IGRpdmlzb3IKLSAqICAgICAgICAgICAgICBvdXRfcXVvdGllbnQgICAgICAgIC0gUG9pbnRlciB0byB3aGVyZSB0aGUgcXVvdGllbnQgaXMgcmV0dXJuZWQKLSAqICAgICAgICAgICAgICBvdXRfcmVtYWluZGVyICAgICAgIC0gUG9pbnRlciB0byB3aGVyZSB0aGUgcmVtYWluZGVyIGlzIHJldHVybmVkCi0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cyAoQ2hlY2tzIGZvciBkaXZpZGUtYnktemVybykKLSAqCi0gKiBERVNDUklQVElPTjogUGVyZm9ybSBhIHNob3J0IChtYXhpbXVtIDY0IGJpdHMgZGl2aWRlZCBieSAzMiBiaXRzKQotICogICAgICAgICAgICAgIGRpdmlkZSBhbmQgbW9kdWxvLiAgVGhlIHJlc3VsdCBpcyBhIDY0LWJpdCBxdW90aWVudCBhbmQgYQotICogICAgICAgICAgICAgIDMyLWJpdCByZW1haW5kZXIuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWFjcGlfc3RhdHVzCi1hY3BpX3V0X3Nob3J0X2RpdmlkZShhY3BpX2ludGVnZXIgZGl2aWRlbmQsCi0JCSAgICAgdTMyIGRpdmlzb3IsCi0JCSAgICAgYWNwaV9pbnRlZ2VyICogb3V0X3F1b3RpZW50LCB1MzIgKiBvdXRfcmVtYWluZGVyKQotewotCXVuaW9uIHVpbnQ2NF9vdmVybGF5IGRpdmlkZW5kX292bDsKLQl1bmlvbiB1aW50NjRfb3ZlcmxheSBxdW90aWVudDsKLQl1MzIgcmVtYWluZGVyMzI7Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKHV0X3Nob3J0X2RpdmlkZSk7Ci0KLQkvKiBBbHdheXMgY2hlY2sgZm9yIGEgemVybyBkaXZpc29yICovCi0KLQlpZiAoZGl2aXNvciA9PSAwKSB7Ci0JCUFDUElfRVJST1IoKEFFX0lORk8sICJEaXZpZGUgYnkgemVybyIpKTsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9ESVZJREVfQllfWkVSTyk7Ci0JfQotCi0JZGl2aWRlbmRfb3ZsLmZ1bGwgPSBkaXZpZGVuZDsKLQotCS8qCi0JICogVGhlIHF1b3RpZW50IGlzIDY0IGJpdHMsIHRoZSByZW1haW5kZXIgaXMgYWx3YXlzIDMyIGJpdHMsCi0JICogYW5kIGlzIGdlbmVyYXRlZCBieSB0aGUgc2Vjb25kIGRpdmlkZS4KLQkgKi8KLQlBQ1BJX0RJVl82NF9CWV8zMigwLCBkaXZpZGVuZF9vdmwucGFydC5oaSwgZGl2aXNvciwKLQkJCSAgcXVvdGllbnQucGFydC5oaSwgcmVtYWluZGVyMzIpOwotCUFDUElfRElWXzY0X0JZXzMyKHJlbWFpbmRlcjMyLCBkaXZpZGVuZF9vdmwucGFydC5sbywgZGl2aXNvciwKLQkJCSAgcXVvdGllbnQucGFydC5sbywgcmVtYWluZGVyMzIpOwotCi0JLyogUmV0dXJuIG9ubHkgd2hhdCB3YXMgcmVxdWVzdGVkICovCi0KLQlpZiAob3V0X3F1b3RpZW50KSB7Ci0JCSpvdXRfcXVvdGllbnQgPSBxdW90aWVudC5mdWxsOwotCX0KLQlpZiAob3V0X3JlbWFpbmRlcikgewotCQkqb3V0X3JlbWFpbmRlciA9IHJlbWFpbmRlcjMyOwotCX0KLQotCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfdXRfZGl2aWRlCi0gKgotICogUEFSQU1FVEVSUzogIGluX2RpdmlkZW5kICAgICAgICAgLSBEaXZpZGVuZAotICogICAgICAgICAgICAgIGluX2Rpdmlzb3IgICAgICAgICAgLSBEaXZpc29yCi0gKiAgICAgICAgICAgICAgb3V0X3F1b3RpZW50ICAgICAgICAtIFBvaW50ZXIgdG8gd2hlcmUgdGhlIHF1b3RpZW50IGlzIHJldHVybmVkCi0gKiAgICAgICAgICAgICAgb3V0X3JlbWFpbmRlciAgICAgICAtIFBvaW50ZXIgdG8gd2hlcmUgdGhlIHJlbWFpbmRlciBpcyByZXR1cm5lZAotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMgKENoZWNrcyBmb3IgZGl2aWRlLWJ5LXplcm8pCi0gKgotICogREVTQ1JJUFRJT046IFBlcmZvcm0gYSBkaXZpZGUgYW5kIG1vZHVsby4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1hY3BpX3N0YXR1cwotYWNwaV91dF9kaXZpZGUoYWNwaV9pbnRlZ2VyIGluX2RpdmlkZW5kLAotCSAgICAgICBhY3BpX2ludGVnZXIgaW5fZGl2aXNvciwKLQkgICAgICAgYWNwaV9pbnRlZ2VyICogb3V0X3F1b3RpZW50LCBhY3BpX2ludGVnZXIgKiBvdXRfcmVtYWluZGVyKQotewotCXVuaW9uIHVpbnQ2NF9vdmVybGF5IGRpdmlkZW5kOwotCXVuaW9uIHVpbnQ2NF9vdmVybGF5IGRpdmlzb3I7Ci0JdW5pb24gdWludDY0X292ZXJsYXkgcXVvdGllbnQ7Ci0JdW5pb24gdWludDY0X292ZXJsYXkgcmVtYWluZGVyOwotCXVuaW9uIHVpbnQ2NF9vdmVybGF5IG5vcm1hbGl6ZWRfZGl2aWRlbmQ7Ci0JdW5pb24gdWludDY0X292ZXJsYXkgbm9ybWFsaXplZF9kaXZpc29yOwotCXUzMiBwYXJ0aWFsMTsKLQl1bmlvbiB1aW50NjRfb3ZlcmxheSBwYXJ0aWFsMjsKLQl1bmlvbiB1aW50NjRfb3ZlcmxheSBwYXJ0aWFsMzsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UodXRfZGl2aWRlKTsKLQotCS8qIEFsd2F5cyBjaGVjayBmb3IgYSB6ZXJvIGRpdmlzb3IgKi8KLQotCWlmIChpbl9kaXZpc29yID09IDApIHsKLQkJQUNQSV9FUlJPUigoQUVfSU5GTywgIkRpdmlkZSBieSB6ZXJvIikpOwotCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX0RJVklERV9CWV9aRVJPKTsKLQl9Ci0KLQlkaXZpc29yLmZ1bGwgPSBpbl9kaXZpc29yOwotCWRpdmlkZW5kLmZ1bGwgPSBpbl9kaXZpZGVuZDsKLQlpZiAoZGl2aXNvci5wYXJ0LmhpID09IDApIHsKLQkJLyoKLQkJICogMSkgU2ltcGxlc3QgY2FzZSBpcyB3aGVyZSB0aGUgZGl2aXNvciBpcyAzMiBiaXRzLCB3ZSBjYW4KLQkJICoganVzdCBkbyB0d28gZGl2aWRlcwotCQkgKi8KLQkJcmVtYWluZGVyLnBhcnQuaGkgPSAwOwotCi0JCS8qCi0JCSAqIFRoZSBxdW90aWVudCBpcyA2NCBiaXRzLCB0aGUgcmVtYWluZGVyIGlzIGFsd2F5cyAzMiBiaXRzLAotCQkgKiBhbmQgaXMgZ2VuZXJhdGVkIGJ5IHRoZSBzZWNvbmQgZGl2aWRlLgotCQkgKi8KLQkJQUNQSV9ESVZfNjRfQllfMzIoMCwgZGl2aWRlbmQucGFydC5oaSwgZGl2aXNvci5wYXJ0LmxvLAotCQkJCSAgcXVvdGllbnQucGFydC5oaSwgcGFydGlhbDEpOwotCQlBQ1BJX0RJVl82NF9CWV8zMihwYXJ0aWFsMSwgZGl2aWRlbmQucGFydC5sbywgZGl2aXNvci5wYXJ0LmxvLAotCQkJCSAgcXVvdGllbnQucGFydC5sbywgcmVtYWluZGVyLnBhcnQubG8pOwotCX0KLQotCWVsc2UgewotCQkvKgotCQkgKiAyKSBUaGUgZ2VuZXJhbCBjYXNlIHdoZXJlIHRoZSBkaXZpc29yIGlzIGEgZnVsbCA2NCBiaXRzCi0JCSAqIGlzIG1vcmUgZGlmZmljdWx0Ci0JCSAqLwotCQlxdW90aWVudC5wYXJ0LmhpID0gMDsKLQkJbm9ybWFsaXplZF9kaXZpZGVuZCA9IGRpdmlkZW5kOwotCQlub3JtYWxpemVkX2Rpdmlzb3IgPSBkaXZpc29yOwotCi0JCS8qIE5vcm1hbGl6ZSB0aGUgb3BlcmFuZHMgKHNoaWZ0IHVudGlsIHRoZSBkaXZpc29yIGlzIDwgMzIgYml0cykgKi8KLQotCQlkbyB7Ci0JCQlBQ1BJX1NISUZUX1JJR0hUXzY0KG5vcm1hbGl6ZWRfZGl2aXNvci5wYXJ0LmhpLAotCQkJCQkgICAgbm9ybWFsaXplZF9kaXZpc29yLnBhcnQubG8pOwotCQkJQUNQSV9TSElGVF9SSUdIVF82NChub3JtYWxpemVkX2RpdmlkZW5kLnBhcnQuaGksCi0JCQkJCSAgICBub3JtYWxpemVkX2RpdmlkZW5kLnBhcnQubG8pOwotCi0JCX0gd2hpbGUgKG5vcm1hbGl6ZWRfZGl2aXNvci5wYXJ0LmhpICE9IDApOwotCi0JCS8qIFBhcnRpYWwgZGl2aWRlICovCi0KLQkJQUNQSV9ESVZfNjRfQllfMzIobm9ybWFsaXplZF9kaXZpZGVuZC5wYXJ0LmhpLAotCQkJCSAgbm9ybWFsaXplZF9kaXZpZGVuZC5wYXJ0LmxvLAotCQkJCSAgbm9ybWFsaXplZF9kaXZpc29yLnBhcnQubG8sCi0JCQkJICBxdW90aWVudC5wYXJ0LmxvLCBwYXJ0aWFsMSk7Ci0KLQkJLyoKLQkJICogVGhlIHF1b3RpZW50IGlzIGFsd2F5cyAzMiBiaXRzLCBhbmQgc2ltcGx5IHJlcXVpcmVzIGFkanVzdG1lbnQuCi0JCSAqIFRoZSA2NC1iaXQgcmVtYWluZGVyIG11c3QgYmUgZ2VuZXJhdGVkLgotCQkgKi8KLQkJcGFydGlhbDEgPSBxdW90aWVudC5wYXJ0LmxvICogZGl2aXNvci5wYXJ0LmhpOwotCQlwYXJ0aWFsMi5mdWxsID0KLQkJICAgIChhY3BpX2ludGVnZXIpIHF1b3RpZW50LnBhcnQubG8gKiBkaXZpc29yLnBhcnQubG87Ci0JCXBhcnRpYWwzLmZ1bGwgPSAoYWNwaV9pbnRlZ2VyKSBwYXJ0aWFsMi5wYXJ0LmhpICsgcGFydGlhbDE7Ci0KLQkJcmVtYWluZGVyLnBhcnQuaGkgPSBwYXJ0aWFsMy5wYXJ0LmxvOwotCQlyZW1haW5kZXIucGFydC5sbyA9IHBhcnRpYWwyLnBhcnQubG87Ci0KLQkJaWYgKHBhcnRpYWwzLnBhcnQuaGkgPT0gMCkgewotCQkJaWYgKHBhcnRpYWwzLnBhcnQubG8gPj0gZGl2aWRlbmQucGFydC5oaSkgewotCQkJCWlmIChwYXJ0aWFsMy5wYXJ0LmxvID09IGRpdmlkZW5kLnBhcnQuaGkpIHsKLQkJCQkJaWYgKHBhcnRpYWwyLnBhcnQubG8gPiBkaXZpZGVuZC5wYXJ0LmxvKSB7Ci0JCQkJCQlxdW90aWVudC5wYXJ0LmxvLS07Ci0JCQkJCQlyZW1haW5kZXIuZnVsbCAtPSBkaXZpc29yLmZ1bGw7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlxdW90aWVudC5wYXJ0LmxvLS07Ci0JCQkJCXJlbWFpbmRlci5mdWxsIC09IGRpdmlzb3IuZnVsbDsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXJlbWFpbmRlci5mdWxsID0gcmVtYWluZGVyLmZ1bGwgLSBkaXZpZGVuZC5mdWxsOwotCQkJcmVtYWluZGVyLnBhcnQuaGkgPSAodTMyKSAtICgoczMyKSByZW1haW5kZXIucGFydC5oaSk7Ci0JCQlyZW1haW5kZXIucGFydC5sbyA9ICh1MzIpIC0gKChzMzIpIHJlbWFpbmRlci5wYXJ0LmxvKTsKLQotCQkJaWYgKHJlbWFpbmRlci5wYXJ0LmxvKSB7Ci0JCQkJcmVtYWluZGVyLnBhcnQuaGktLTsKLQkJCX0KLQkJfQotCX0KLQotCS8qIFJldHVybiBvbmx5IHdoYXQgd2FzIHJlcXVlc3RlZCAqLwotCi0JaWYgKG91dF9xdW90aWVudCkgewotCQkqb3V0X3F1b3RpZW50ID0gcXVvdGllbnQuZnVsbDsKLQl9Ci0JaWYgKG91dF9yZW1haW5kZXIpIHsKLQkJKm91dF9yZW1haW5kZXIgPSByZW1haW5kZXIuZnVsbDsKLQl9Ci0KLQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwotfQotCi0jZWxzZQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV91dF9zaG9ydF9kaXZpZGUsIGFjcGlfdXRfZGl2aWRlCi0gKgotICogUEFSQU1FVEVSUzogIFNlZSBmdW5jdGlvbiBoZWFkZXJzIGFib3ZlCi0gKgotICogREVTQ1JJUFRJT046IE5hdGl2ZSB2ZXJzaW9ucyBvZiB0aGUgdXRfZGl2aWRlIGZ1bmN0aW9ucy4gVXNlIHRoZXNlIGlmIGVpdGhlcgotICogICAgICAgICAgICAgIDEpIFRoZSB0YXJnZXQgaXMgYSA2NC1iaXQgcGxhdGZvcm0gYW5kIHRoZXJlZm9yZSA2NC1iaXQKLSAqICAgICAgICAgICAgICAgICBpbnRlZ2VyIG1hdGggaXMgc3VwcG9ydGVkIGRpcmVjdGx5IGJ5IHRoZSBtYWNoaW5lLgotICogICAgICAgICAgICAgIDIpIFRoZSB0YXJnZXQgaXMgYSAzMi1iaXQgb3IgMTYtYml0IHBsYXRmb3JtLCBhbmQgdGhlCi0gKiAgICAgICAgICAgICAgICAgZG91YmxlLXByZWNpc2lvbiBpbnRlZ2VyIG1hdGggbGlicmFyeSBpcyBhdmFpbGFibGUgdG8KLSAqICAgICAgICAgICAgICAgICBwZXJmb3JtIHRoZSBkaXZpZGUuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWFjcGlfc3RhdHVzCi1hY3BpX3V0X3Nob3J0X2RpdmlkZShhY3BpX2ludGVnZXIgaW5fZGl2aWRlbmQsCi0JCSAgICAgdTMyIGRpdmlzb3IsCi0JCSAgICAgYWNwaV9pbnRlZ2VyICogb3V0X3F1b3RpZW50LCB1MzIgKiBvdXRfcmVtYWluZGVyKQotewotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSh1dF9zaG9ydF9kaXZpZGUpOwotCi0JLyogQWx3YXlzIGNoZWNrIGZvciBhIHplcm8gZGl2aXNvciAqLwotCi0JaWYgKGRpdmlzb3IgPT0gMCkgewotCQlBQ1BJX0VSUk9SKChBRV9JTkZPLCAiRGl2aWRlIGJ5IHplcm8iKSk7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfRElWSURFX0JZX1pFUk8pOwotCX0KLQotCS8qIFJldHVybiBvbmx5IHdoYXQgd2FzIHJlcXVlc3RlZCAqLwotCi0JaWYgKG91dF9xdW90aWVudCkgewotCQkqb3V0X3F1b3RpZW50ID0gaW5fZGl2aWRlbmQgLyBkaXZpc29yOwotCX0KLQlpZiAob3V0X3JlbWFpbmRlcikgewotCQkqb3V0X3JlbWFpbmRlciA9ICh1MzIpIChpbl9kaXZpZGVuZCAlIGRpdmlzb3IpOwotCX0KLQotCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7Ci19Ci0KLWFjcGlfc3RhdHVzCi1hY3BpX3V0X2RpdmlkZShhY3BpX2ludGVnZXIgaW5fZGl2aWRlbmQsCi0JICAgICAgIGFjcGlfaW50ZWdlciBpbl9kaXZpc29yLAotCSAgICAgICBhY3BpX2ludGVnZXIgKiBvdXRfcXVvdGllbnQsIGFjcGlfaW50ZWdlciAqIG91dF9yZW1haW5kZXIpCi17Ci0JQUNQSV9GVU5DVElPTl9UUkFDRSh1dF9kaXZpZGUpOwotCi0JLyogQWx3YXlzIGNoZWNrIGZvciBhIHplcm8gZGl2aXNvciAqLwotCi0JaWYgKGluX2Rpdmlzb3IgPT0gMCkgewotCQlBQ1BJX0VSUk9SKChBRV9JTkZPLCAiRGl2aWRlIGJ5IHplcm8iKSk7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfRElWSURFX0JZX1pFUk8pOwotCX0KLQotCS8qIFJldHVybiBvbmx5IHdoYXQgd2FzIHJlcXVlc3RlZCAqLwotCi0JaWYgKG91dF9xdW90aWVudCkgewotCQkqb3V0X3F1b3RpZW50ID0gaW5fZGl2aWRlbmQgLyBpbl9kaXZpc29yOwotCX0KLQlpZiAob3V0X3JlbWFpbmRlcikgewotCQkqb3V0X3JlbWFpbmRlciA9IGluX2RpdmlkZW5kICUgaW5fZGl2aXNvcjsKLQl9Ci0KLQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwotfQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXRtaXNjLmMgYi9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0bWlzYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDg5YTE1Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXRtaXNjLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogTW9kdWxlIE5hbWU6IHV0bWlzYyAtIGNvbW1vbiB1dGlsaXR5IHByb2NlZHVyZXMKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwOCwgSW50ZWwgQ29ycC4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKLSAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIGF0IG1pbmltdW0gYSBkaXNjbGFpbWVyCi0gKiAgICBzdWJzdGFudGlhbGx5IHNpbWlsYXIgdG8gdGhlICJOTyBXQVJSQU5UWSIgZGlzY2xhaW1lciBiZWxvdwotICogICAgKCJEaXNjbGFpbWVyIikgYW5kIGFueSByZWRpc3RyaWJ1dGlvbiBtdXN0IGJlIGNvbmRpdGlvbmVkIHVwb24KLSAqICAgIGluY2x1ZGluZyBhIHN1YnN0YW50aWFsbHkgc2ltaWxhciBEaXNjbGFpbWVyIHJlcXVpcmVtZW50IGZvciBmdXJ0aGVyCi0gKiAgICBiaW5hcnkgcmVkaXN0cmlidXRpb24uCi0gKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMKLSAqICAgIG9mIGFueSBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTk8gV0FSUkFOVFkKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAotICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKLSAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HCi0gKiBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKLSAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0KLSNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KLSNpbmNsdWRlIDxhY3BpL2FjbmFtZXNwLmg+Ci0KLSNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX1VUSUxJVElFUwotQUNQSV9NT0RVTEVfTkFNRSgidXRtaXNjIikKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV91dF92YWxpZGF0ZV9leGNlcHRpb24KLSAqCi0gKiBQQVJBTUVURVJTOiAgU3RhdHVzICAgICAgIC0gVGhlIGFjcGlfc3RhdHVzIGNvZGUgdG8gYmUgZm9ybWF0dGVkCi0gKgotICogUkVUVVJOOiAgICAgIEEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIGV4Y2VwdGlvbiB0ZXh0LiBOVUxMIGlmIGV4Y2VwdGlvbiBpcwotICogICAgICAgICAgICAgIG5vdCB2YWxpZC4KLSAqCi0gKiBERVNDUklQVElPTjogVGhpcyBmdW5jdGlvbiB2YWxpZGF0ZXMgYW5kIHRyYW5zbGF0ZXMgYW4gQUNQSSBleGNlcHRpb24gaW50bwotICogICAgICAgICAgICAgIGFuIEFTQ0lJIHN0cmluZy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotY29uc3QgY2hhciAqYWNwaV91dF92YWxpZGF0ZV9leGNlcHRpb24oYWNwaV9zdGF0dXMgc3RhdHVzKQotewotCXUzMiBzdWJfc3RhdHVzOwotCWNvbnN0IGNoYXIgKmV4Y2VwdGlvbiA9IE5VTEw7Ci0KLQlBQ1BJX0ZVTkNUSU9OX0VOVFJZKCk7Ci0KLQkvKgotCSAqIFN0YXR1cyBpcyBjb21wb3NlZCBvZiB0d28gcGFydHMsIGEgInR5cGUiIGFuZCBhbiBhY3R1YWwgY29kZQotCSAqLwotCXN1Yl9zdGF0dXMgPSAoc3RhdHVzICYgfkFFX0NPREVfTUFTSyk7Ci0KLQlzd2l0Y2ggKHN0YXR1cyAmIEFFX0NPREVfTUFTSykgewotCWNhc2UgQUVfQ09ERV9FTlZJUk9OTUVOVEFMOgotCi0JCWlmIChzdWJfc3RhdHVzIDw9IEFFX0NPREVfRU5WX01BWCkgewotCQkJZXhjZXB0aW9uID0gYWNwaV9nYmxfZXhjZXB0aW9uX25hbWVzX2VudltzdWJfc3RhdHVzXTsKLQkJfQotCQlicmVhazsKLQotCWNhc2UgQUVfQ09ERV9QUk9HUkFNTUVSOgotCi0JCWlmIChzdWJfc3RhdHVzIDw9IEFFX0NPREVfUEdNX01BWCkgewotCQkJZXhjZXB0aW9uID0gYWNwaV9nYmxfZXhjZXB0aW9uX25hbWVzX3BnbVtzdWJfc3RhdHVzXTsKLQkJfQotCQlicmVhazsKLQotCWNhc2UgQUVfQ09ERV9BQ1BJX1RBQkxFUzoKLQotCQlpZiAoc3ViX3N0YXR1cyA8PSBBRV9DT0RFX1RCTF9NQVgpIHsKLQkJCWV4Y2VwdGlvbiA9IGFjcGlfZ2JsX2V4Y2VwdGlvbl9uYW1lc190Ymxbc3ViX3N0YXR1c107Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIEFFX0NPREVfQU1MOgotCi0JCWlmIChzdWJfc3RhdHVzIDw9IEFFX0NPREVfQU1MX01BWCkgewotCQkJZXhjZXB0aW9uID0gYWNwaV9nYmxfZXhjZXB0aW9uX25hbWVzX2FtbFtzdWJfc3RhdHVzXTsKLQkJfQotCQlicmVhazsKLQotCWNhc2UgQUVfQ09ERV9DT05UUk9MOgotCi0JCWlmIChzdWJfc3RhdHVzIDw9IEFFX0NPREVfQ1RSTF9NQVgpIHsKLQkJCWV4Y2VwdGlvbiA9IGFjcGlfZ2JsX2V4Y2VwdGlvbl9uYW1lc19jdHJsW3N1Yl9zdGF0dXNdOwotCQl9Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIChBQ1BJX0NBU1RfUFRSKGNvbnN0IGNoYXIsIGV4Y2VwdGlvbikpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X2lzX2FtbF90YWJsZQotICoKLSAqIFBBUkFNRVRFUlM6ICBUYWJsZSAgICAgICAgICAgICAgIC0gQW4gQUNQSSB0YWJsZQotICoKLSAqIFJFVFVSTjogICAgICBUUlVFIGlmIHRhYmxlIGNvbnRhaW5zIGV4ZWN1dGFibGUgQU1MOyBGQUxTRSBvdGhlcndpc2UKLSAqCi0gKiBERVNDUklQVElPTjogQ2hlY2sgQUNQSSBTaWduYXR1cmUgZm9yIGEgdGFibGUgdGhhdCBjb250YWlucyBBTUwgY29kZS4KLSAqICAgICAgICAgICAgICBDdXJyZW50bHksIHRoZXNlIGFyZSBEU0RULFNTRFQsUFNEVC4gQWxsIG90aGVyIHRhYmxlIHR5cGVzIGFyZQotICogICAgICAgICAgICAgIGRhdGEgdGFibGVzIHRoYXQgZG8gbm90IGNvbnRhaW4gQU1MIGNvZGUuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdTggYWNwaV91dF9pc19hbWxfdGFibGUoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICp0YWJsZSkKLXsKLQotCS8qIFRoZXNlIGFyZSB0aGUgb25seSB0YWJsZXMgdGhhdCBjb250YWluIGV4ZWN1dGFibGUgQU1MICovCi0KLQlpZiAoQUNQSV9DT01QQVJFX05BTUUodGFibGUtPnNpZ25hdHVyZSwgQUNQSV9TSUdfRFNEVCkgfHwKLQkgICAgQUNQSV9DT01QQVJFX05BTUUodGFibGUtPnNpZ25hdHVyZSwgQUNQSV9TSUdfUFNEVCkgfHwKLQkgICAgQUNQSV9DT01QQVJFX05BTUUodGFibGUtPnNpZ25hdHVyZSwgQUNQSV9TSUdfU1NEVCkpIHsKLQkJcmV0dXJuIChUUlVFKTsKLQl9Ci0KLQlyZXR1cm4gKEZBTFNFKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV91dF9hbGxvY2F0ZV9vd25lcl9pZAotICoKLSAqIFBBUkFNRVRFUlM6ICBvd25lcl9pZCAgICAgICAgLSBXaGVyZSB0aGUgbmV3IG93bmVyIElEIGlzIHJldHVybmVkCi0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cwotICoKLSAqIERFU0NSSVBUSU9OOiBBbGxvY2F0ZSBhIHRhYmxlIG9yIG1ldGhvZCBvd25lciBJRC4gVGhlIG93bmVyIElEIGlzIHVzZWQgdG8KLSAqICAgICAgICAgICAgICB0cmFjayBvYmplY3RzIGNyZWF0ZWQgYnkgdGhlIHRhYmxlIG9yIG1ldGhvZCwgdG8gYmUgZGVsZXRlZAotICogICAgICAgICAgICAgIHdoZW4gdGhlIG1ldGhvZCBleGl0cyBvciB0aGUgdGFibGUgaXMgdW5sb2FkZWQuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotYWNwaV9zdGF0dXMgYWNwaV91dF9hbGxvY2F0ZV9vd25lcl9pZChhY3BpX293bmVyX2lkICogb3duZXJfaWQpCi17Ci0JdTMyIGk7Ci0JdTMyIGo7Ci0JdTMyIGs7Ci0JYWNwaV9zdGF0dXMgc3RhdHVzOwotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSh1dF9hbGxvY2F0ZV9vd25lcl9pZCk7Ci0KLQkvKiBHdWFyZCBhZ2FpbnN0IG11bHRpcGxlIGFsbG9jYXRpb25zIG9mIElEIHRvIHRoZSBzYW1lIGxvY2F0aW9uICovCi0KLQlpZiAoKm93bmVyX2lkKSB7Ci0JCUFDUElfRVJST1IoKEFFX0lORk8sICJPd25lciBJRCBbJTIuMlhdIGFscmVhZHkgZXhpc3RzIiwKLQkJCSAgICAqb3duZXJfaWQpKTsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FMUkVBRFlfRVhJU1RTKTsKLQl9Ci0KLQkvKiBNdXRleCBmb3IgdGhlIGdsb2JhbCBJRCBtYXNrICovCi0KLQlzdGF0dXMgPSBhY3BpX3V0X2FjcXVpcmVfbXV0ZXgoQUNQSV9NVFhfQ0FDSEVTKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci0JfQotCi0JLyoKLQkgKiBGaW5kIGEgZnJlZSBvd25lciBJRCwgY3ljbGUgdGhyb3VnaCBhbGwgcG9zc2libGUgSURzIG9uIHJlcGVhdGVkCi0JICogYWxsb2NhdGlvbnMuIChBQ1BJX05VTV9PV05FUklEX01BU0tTICsgMSkgYmVjYXVzZSBmaXJzdCBpbmRleCBtYXkgaGF2ZQotCSAqIHRvIGJlIHNjYW5uZWQgdHdpY2UuCi0JICovCi0JZm9yIChpID0gMCwgaiA9IGFjcGlfZ2JsX2xhc3Rfb3duZXJfaWRfaW5kZXg7Ci0JICAgICBpIDwgKEFDUElfTlVNX09XTkVSSURfTUFTS1MgKyAxKTsgaSsrLCBqKyspIHsKLQkJaWYgKGogPj0gQUNQSV9OVU1fT1dORVJJRF9NQVNLUykgewotCQkJaiA9IDA7CS8qIFdyYXBhcm91bmQgdG8gc3RhcnQgb2YgbWFzayBhcnJheSAqLwotCQl9Ci0KLQkJZm9yIChrID0gYWNwaV9nYmxfbmV4dF9vd25lcl9pZF9vZmZzZXQ7IGsgPCAzMjsgaysrKSB7Ci0JCQlpZiAoYWNwaV9nYmxfb3duZXJfaWRfbWFza1tqXSA9PSBBQ1BJX1VJTlQzMl9NQVgpIHsKLQotCQkJCS8qIFRoZXJlIGFyZSBubyBmcmVlIElEcyBpbiB0aGlzIG1hc2sgKi8KLQotCQkJCWJyZWFrOwotCQkJfQotCi0JCQlpZiAoIShhY3BpX2dibF9vd25lcl9pZF9tYXNrW2pdICYgKDEgPDwgaykpKSB7Ci0JCQkJLyoKLQkJCQkgKiBGb3VuZCBhIGZyZWUgSUQuIFRoZSBhY3R1YWwgSUQgaXMgdGhlIGJpdCBpbmRleCBwbHVzIG9uZSwKLQkJCQkgKiBtYWtpbmcgemVybyBhbiBpbnZhbGlkIE93bmVyIElELiBTYXZlIHRoaXMgYXMgdGhlIGxhc3QgSUQKLQkJCQkgKiBhbGxvY2F0ZWQgYW5kIHVwZGF0ZSB0aGUgZ2xvYmFsIElEIG1hc2suCi0JCQkJICovCi0JCQkJYWNwaV9nYmxfb3duZXJfaWRfbWFza1tqXSB8PSAoMSA8PCBrKTsKLQotCQkJCWFjcGlfZ2JsX2xhc3Rfb3duZXJfaWRfaW5kZXggPSAodTgpIGo7Ci0JCQkJYWNwaV9nYmxfbmV4dF9vd25lcl9pZF9vZmZzZXQgPSAodTgpIChrICsgMSk7Ci0KLQkJCQkvKgotCQkJCSAqIENvbnN0cnVjdCBlbmNvZGVkIElEIGZyb20gdGhlIGluZGV4IGFuZCBiaXQgcG9zaXRpb24KLQkJCQkgKgotCQkJCSAqIE5vdGU6IExhc3QgW2pdLmsgKGJpdCAyNTUpIGlzIG5ldmVyIHVzZWQgYW5kIGlzIG1hcmtlZAotCQkJCSAqIHBlcm1hbmVudGx5IGFsbG9jYXRlZCAocHJldmVudHMgKzEgb3ZlcmZsb3cpCi0JCQkJICovCi0JCQkJKm93bmVyX2lkID0KLQkJCQkgICAgKGFjcGlfb3duZXJfaWQpICgoayArIDEpICsgQUNQSV9NVUxfMzIoaikpOwotCi0JCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9WQUxVRVMsCi0JCQkJCQkgICJBbGxvY2F0ZWQgT3duZXJJZDogJTIuMlhcbiIsCi0JCQkJCQkgICh1bnNpZ25lZCBpbnQpKm93bmVyX2lkKSk7Ci0JCQkJZ290byBleGl0OwotCQkJfQotCQl9Ci0KLQkJYWNwaV9nYmxfbmV4dF9vd25lcl9pZF9vZmZzZXQgPSAwOwotCX0KLQotCS8qCi0JICogQWxsIG93bmVyX2lkcyBoYXZlIGJlZW4gYWxsb2NhdGVkLiBUaGlzIHR5cGljYWxseSBzaG91bGQKLQkgKiBub3QgaGFwcGVuIHNpbmNlIHRoZSBJRHMgYXJlIHJldXNlZCBhZnRlciBkZWFsbG9jYXRpb24uIFRoZSBJRHMgYXJlCi0JICogYWxsb2NhdGVkIHVwb24gdGFibGUgbG9hZCAob25lIHBlciB0YWJsZSkgYW5kIG1ldGhvZCBleGVjdXRpb24sIGFuZAotCSAqIHRoZXkgYXJlIHJlbGVhc2VkIHdoZW4gYSB0YWJsZSBpcyB1bmxvYWRlZCBvciBhIG1ldGhvZCBjb21wbGV0ZXMKLQkgKiBleGVjdXRpb24uCi0JICoKLQkgKiBJZiB0aGlzIGVycm9yIGhhcHBlbnMsIHRoZXJlIG1heSBiZSB2ZXJ5IGRlZXAgbmVzdGluZyBvZiBpbnZva2VkIGNvbnRyb2wKLQkgKiBtZXRob2RzLCBvciB0aGVyZSBtYXkgYmUgYSBidWcgd2hlcmUgdGhlIElEcyBhcmUgbm90IHJlbGVhc2VkLgotCSAqLwotCXN0YXR1cyA9IEFFX09XTkVSX0lEX0xJTUlUOwotCUFDUElfRVJST1IoKEFFX0lORk8sCi0JCSAgICAiQ291bGQgbm90IGFsbG9jYXRlIG5ldyBPd25lcklkICgyNTUgbWF4KSwgQUVfT1dORVJfSURfTElNSVQiKSk7Ci0KLSAgICAgIGV4aXQ6Ci0JKHZvaWQpYWNwaV91dF9yZWxlYXNlX211dGV4KEFDUElfTVRYX0NBQ0hFUyk7Ci0JcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfdXRfcmVsZWFzZV9vd25lcl9pZAotICoKLSAqIFBBUkFNRVRFUlM6ICBvd25lcl9pZF9wdHIgICAgICAgIC0gUG9pbnRlciB0byBhIHByZXZpb3VzbHkgYWxsb2NhdGVkIG93bmVyX2lECi0gKgotICogUkVUVVJOOiAgICAgIE5vbmUuIE5vIGVycm9yIGlzIHJldHVybmVkIGJlY2F1c2Ugd2UgYXJlIGVpdGhlciBleGl0aW5nIGEKLSAqICAgICAgICAgICAgICBjb250cm9sIG1ldGhvZCBvciB1bmxvYWRpbmcgYSB0YWJsZS4gRWl0aGVyIHdheSwgd2Ugd291bGQKLSAqICAgICAgICAgICAgICBpZ25vcmUgYW55IGVycm9yIGFueXdheS4KLSAqCi0gKiBERVNDUklQVElPTjogUmVsZWFzZSBhIHRhYmxlIG9yIG1ldGhvZCBvd25lciBJRC4gIFZhbGlkIElEcyBhcmUgMSAtIDI1NQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXZvaWQgYWNwaV91dF9yZWxlYXNlX293bmVyX2lkKGFjcGlfb3duZXJfaWQgKiBvd25lcl9pZF9wdHIpCi17Ci0JYWNwaV9vd25lcl9pZCBvd25lcl9pZCA9ICpvd25lcl9pZF9wdHI7Ci0JYWNwaV9zdGF0dXMgc3RhdHVzOwotCXUzMiBpbmRleDsKLQl1MzIgYml0OwotCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9VMzIodXRfcmVsZWFzZV9vd25lcl9pZCwgb3duZXJfaWQpOwotCi0JLyogQWx3YXlzIGNsZWFyIHRoZSBpbnB1dCBvd25lcl9pZCAoemVybyBpcyBhbiBpbnZhbGlkIElEKSAqLwotCi0JKm93bmVyX2lkX3B0ciA9IDA7Ci0KLQkvKiBaZXJvIGlzIG5vdCBhIHZhbGlkIG93bmVyX2lEICovCi0KLQlpZiAob3duZXJfaWQgPT0gMCkgewotCQlBQ1BJX0VSUk9SKChBRV9JTkZPLCAiSW52YWxpZCBPd25lcklkOiAlMi4yWCIsIG93bmVyX2lkKSk7Ci0JCXJldHVybl9WT0lEOwotCX0KLQotCS8qIE11dGV4IGZvciB0aGUgZ2xvYmFsIElEIG1hc2sgKi8KLQotCXN0YXR1cyA9IGFjcGlfdXRfYWNxdWlyZV9tdXRleChBQ1BJX01UWF9DQUNIRVMpOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlyZXR1cm5fVk9JRDsKLQl9Ci0KLQkvKiBOb3JtYWxpemUgdGhlIElEIHRvIHplcm8gKi8KLQotCW93bmVyX2lkLS07Ci0KLQkvKiBEZWNvZGUgSUQgdG8gaW5kZXgvb2Zmc2V0IHBhaXIgKi8KLQotCWluZGV4ID0gQUNQSV9ESVZfMzIob3duZXJfaWQpOwotCWJpdCA9IDEgPDwgQUNQSV9NT0RfMzIob3duZXJfaWQpOwotCi0JLyogRnJlZSB0aGUgb3duZXIgSUQgb25seSBpZiBpdCBpcyB2YWxpZCAqLwotCi0JaWYgKGFjcGlfZ2JsX293bmVyX2lkX21hc2tbaW5kZXhdICYgYml0KSB7Ci0JCWFjcGlfZ2JsX293bmVyX2lkX21hc2tbaW5kZXhdIF49IGJpdDsKLQl9IGVsc2UgewotCQlBQ1BJX0VSUk9SKChBRV9JTkZPLAotCQkJICAgICJSZWxlYXNlIG9mIG5vbi1hbGxvY2F0ZWQgT3duZXJJZDogJTIuMlgiLAotCQkJICAgIG93bmVyX2lkICsgMSkpOwotCX0KLQotCSh2b2lkKWFjcGlfdXRfcmVsZWFzZV9tdXRleChBQ1BJX01UWF9DQUNIRVMpOwotCXJldHVybl9WT0lEOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X3N0cnVwciAoc3RydXByKQotICoKLSAqIFBBUkFNRVRFUlM6ICBzcmNfc3RyaW5nICAgICAgLSBUaGUgc291cmNlIHN0cmluZyB0byBjb252ZXJ0Ci0gKgotICogUkVUVVJOOiAgICAgIE5vbmUKLSAqCi0gKiBERVNDUklQVElPTjogQ29udmVydCBzdHJpbmcgdG8gdXBwZXJjYXNlCi0gKgotICogTk9URTogVGhpcyBpcyBub3QgYSBQT1NJWCBmdW5jdGlvbiwgc28gaXQgYXBwZWFycyBoZXJlLCBub3QgaW4gdXRjbGliLmMKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi12b2lkIGFjcGlfdXRfc3RydXByKGNoYXIgKnNyY19zdHJpbmcpCi17Ci0JY2hhciAqc3RyaW5nOwotCi0JQUNQSV9GVU5DVElPTl9FTlRSWSgpOwotCi0JaWYgKCFzcmNfc3RyaW5nKSB7Ci0JCXJldHVybjsKLQl9Ci0KLQkvKiBXYWxrIGVudGlyZSBzdHJpbmcsIHVwcGVyY2FzaW5nIHRoZSBsZXR0ZXJzICovCi0KLQlmb3IgKHN0cmluZyA9IHNyY19zdHJpbmc7ICpzdHJpbmc7IHN0cmluZysrKSB7Ci0JCSpzdHJpbmcgPSAoY2hhcilBQ1BJX1RPVVBQRVIoKnN0cmluZyk7Ci0JfQotCi0JcmV0dXJuOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X3ByaW50X3N0cmluZwotICoKLSAqIFBBUkFNRVRFUlM6ICBTdHJpbmcgICAgICAgICAgLSBOdWxsIHRlcm1pbmF0ZWQgQVNDSUkgc3RyaW5nCi0gKiAgICAgICAgICAgICAgbWF4X2xlbmd0aCAgICAgIC0gTWF4aW11bSBvdXRwdXQgbGVuZ3RoCi0gKgotICogUkVUVVJOOiAgICAgIE5vbmUKLSAqCi0gKiBERVNDUklQVElPTjogRHVtcCBhbiBBU0NJSSBzdHJpbmcgd2l0aCBzdXBwb3J0IGZvciBBQ1BJLWRlZmluZWQgZXNjYXBlCi0gKiAgICAgICAgICAgICAgc2VxdWVuY2VzLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXZvaWQgYWNwaV91dF9wcmludF9zdHJpbmcoY2hhciAqc3RyaW5nLCB1OCBtYXhfbGVuZ3RoKQotewotCXUzMiBpOwotCi0JaWYgKCFzdHJpbmcpIHsKLQkJYWNwaV9vc19wcmludGYoIjxcIk5VTEwgU1RSSU5HIFBUUlwiPiIpOwotCQlyZXR1cm47Ci0JfQotCi0JYWNwaV9vc19wcmludGYoIlwiIik7Ci0JZm9yIChpID0gMDsgc3RyaW5nW2ldICYmIChpIDwgbWF4X2xlbmd0aCk7IGkrKykgewotCi0JCS8qIEVzY2FwZSBzZXF1ZW5jZXMgKi8KLQotCQlzd2l0Y2ggKHN0cmluZ1tpXSkgewotCQljYXNlIDB4MDc6Ci0JCQlhY3BpX29zX3ByaW50ZigiXFxhIik7CS8qIEJFTEwgKi8KLQkJCWJyZWFrOwotCi0JCWNhc2UgMHgwODoKLQkJCWFjcGlfb3NfcHJpbnRmKCJcXGIiKTsJLyogQkFDS1NQQUNFICovCi0JCQlicmVhazsKLQotCQljYXNlIDB4MEM6Ci0JCQlhY3BpX29zX3ByaW50ZigiXFxmIik7CS8qIEZPUk1GRUVEICovCi0JCQlicmVhazsKLQotCQljYXNlIDB4MEE6Ci0JCQlhY3BpX29zX3ByaW50ZigiXFxuIik7CS8qIExJTkVGRUVEICovCi0JCQlicmVhazsKLQotCQljYXNlIDB4MEQ6Ci0JCQlhY3BpX29zX3ByaW50ZigiXFxyIik7CS8qIENBUlJJQUdFIFJFVFVSTiAqLwotCQkJYnJlYWs7Ci0KLQkJY2FzZSAweDA5OgotCQkJYWNwaV9vc19wcmludGYoIlxcdCIpOwkvKiBIT1JJWk9OVEFMIFRBQiAqLwotCQkJYnJlYWs7Ci0KLQkJY2FzZSAweDBCOgotCQkJYWNwaV9vc19wcmludGYoIlxcdiIpOwkvKiBWRVJUSUNBTCBUQUIgKi8KLQkJCWJyZWFrOwotCi0JCWNhc2UgJ1wnJzoJLyogU2luZ2xlIFF1b3RlICovCi0JCWNhc2UgJ1wiJzoJLyogRG91YmxlIFF1b3RlICovCi0JCWNhc2UgJ1xcJzoJLyogQmFja3NsYXNoICovCi0JCQlhY3BpX29zX3ByaW50ZigiXFwlYyIsIChpbnQpc3RyaW5nW2ldKTsKLQkJCWJyZWFrOwotCi0JCWRlZmF1bHQ6Ci0KLQkJCS8qIENoZWNrIGZvciBwcmludGFibGUgY2hhcmFjdGVyIG9yIGhleCBlc2NhcGUgKi8KLQotCQkJaWYgKEFDUElfSVNfUFJJTlQoc3RyaW5nW2ldKSkgewotCQkJCS8qIFRoaXMgaXMgYSBub3JtYWwgY2hhcmFjdGVyICovCi0KLQkJCQlhY3BpX29zX3ByaW50ZigiJWMiLCAoaW50KXN0cmluZ1tpXSk7Ci0JCQl9IGVsc2UgewotCQkJCS8qIEFsbCBvdGhlcnMgd2lsbCBiZSBIZXggZXNjYXBlcyAqLwotCi0JCQkJYWNwaV9vc19wcmludGYoIlxceCUyLjJYIiwgKHMzMikgc3RyaW5nW2ldKTsKLQkJCX0KLQkJCWJyZWFrOwotCQl9Ci0JfQotCWFjcGlfb3NfcHJpbnRmKCJcIiIpOwotCi0JaWYgKGkgPT0gbWF4X2xlbmd0aCAmJiBzdHJpbmdbaV0pIHsKLQkJYWNwaV9vc19wcmludGYoIi4uLiIpOwotCX0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV91dF9kd29yZF9ieXRlX3N3YXAKLSAqCi0gKiBQQVJBTUVURVJTOiAgVmFsdWUgICAgICAgICAgIC0gVmFsdWUgdG8gYmUgY29udmVydGVkCi0gKgotICogUkVUVVJOOiAgICAgIHUzMiBpbnRlZ2VyIHdpdGggYnl0ZXMgc3dhcHBlZAotICoKLSAqIERFU0NSSVBUSU9OOiBDb252ZXJ0IGEgMzItYml0IHZhbHVlIHRvIGJpZy1lbmRpYW4gKHN3YXAgdGhlIGJ5dGVzKQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXUzMiBhY3BpX3V0X2R3b3JkX2J5dGVfc3dhcCh1MzIgdmFsdWUpCi17Ci0JdW5pb24gewotCQl1MzIgdmFsdWU7Ci0JCXU4IGJ5dGVzWzRdOwotCX0gb3V0OwotCXVuaW9uIHsKLQkJdTMyIHZhbHVlOwotCQl1OCBieXRlc1s0XTsKLQl9IGluOwotCi0JQUNQSV9GVU5DVElPTl9FTlRSWSgpOwotCi0JaW4udmFsdWUgPSB2YWx1ZTsKLQotCW91dC5ieXRlc1swXSA9IGluLmJ5dGVzWzNdOwotCW91dC5ieXRlc1sxXSA9IGluLmJ5dGVzWzJdOwotCW91dC5ieXRlc1syXSA9IGluLmJ5dGVzWzFdOwotCW91dC5ieXRlc1szXSA9IGluLmJ5dGVzWzBdOwotCi0JcmV0dXJuIChvdXQudmFsdWUpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X3NldF9pbnRlZ2VyX3dpZHRoCi0gKgotICogUEFSQU1FVEVSUzogIFJldmlzaW9uICAgICAgICAgICAgRnJvbSBEU0RUIGhlYWRlcgotICoKLSAqIFJFVFVSTjogICAgICBOb25lCi0gKgotICogREVTQ1JJUFRJT046IFNldCB0aGUgZ2xvYmFsIGludGVnZXIgYml0IHdpZHRoIGJhc2VkIHVwb24gdGhlIHJldmlzaW9uCi0gKiAgICAgICAgICAgICAgb2YgdGhlIERTRFQuICBGb3IgUmV2aXNpb24gMSBhbmQgMCwgSW50ZWdlcnMgYXJlIDMyIGJpdHMuCi0gKiAgICAgICAgICAgICAgRm9yIFJldmlzaW9uIDIgYW5kIGFib3ZlLCBJbnRlZ2VycyBhcmUgNjQgYml0cy4gIFllcywgdGhpcwotICogICAgICAgICAgICAgIG1ha2VzIGEgZGlmZmVyZW5jZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi12b2lkIGFjcGlfdXRfc2V0X2ludGVnZXJfd2lkdGgodTggcmV2aXNpb24pCi17Ci0KLQlpZiAocmV2aXNpb24gPCAyKSB7Ci0KLQkJLyogMzItYml0IGNhc2UgKi8KLQotCQlhY3BpX2dibF9pbnRlZ2VyX2JpdF93aWR0aCA9IDMyOwotCQlhY3BpX2dibF9pbnRlZ2VyX255YmJsZV93aWR0aCA9IDg7Ci0JCWFjcGlfZ2JsX2ludGVnZXJfYnl0ZV93aWR0aCA9IDQ7Ci0JfSBlbHNlIHsKLQkJLyogNjQtYml0IGNhc2UgKEFDUEkgMi4wKykgKi8KLQotCQlhY3BpX2dibF9pbnRlZ2VyX2JpdF93aWR0aCA9IDY0OwotCQlhY3BpX2dibF9pbnRlZ2VyX255YmJsZV93aWR0aCA9IDE2OwotCQlhY3BpX2dibF9pbnRlZ2VyX2J5dGVfd2lkdGggPSA4OwotCX0KLX0KLQotI2lmZGVmIEFDUElfREVCVUdfT1VUUFVUCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X2Rpc3BsYXlfaW5pdF9wYXRobmFtZQotICoKLSAqIFBBUkFNRVRFUlM6ICBUeXBlICAgICAgICAgICAgICAgIC0gT2JqZWN0IHR5cGUgb2YgdGhlIG5vZGUKLSAqICAgICAgICAgICAgICBvYmpfaGFuZGxlICAgICAgICAgIC0gSGFuZGxlIHdob3NlIHBhdGhuYW1lIHdpbGwgYmUgZGlzcGxheWVkCi0gKiAgICAgICAgICAgICAgUGF0aCAgICAgICAgICAgICAgICAtIEFkZGl0aW9uYWwgcGF0aCBzdHJpbmcgdG8gYmUgYXBwZW5kZWQuCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE5VTEwgaWYgbm8gZXh0cmEgcGF0aCkKLSAqCi0gKiBSRVRVUk46ICAgICAgYWNwaV9zdGF0dXMKLSAqCi0gKiBERVNDUklQVElPTjogRGlzcGxheSBmdWxsIHBhdGhuYW1lIG9mIGFuIG9iamVjdCwgREVCVUcgT05MWQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXZvaWQKLWFjcGlfdXRfZGlzcGxheV9pbml0X3BhdGhuYW1lKHU4IHR5cGUsCi0JCQkgICAgICBzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqb2JqX2hhbmRsZSwKLQkJCSAgICAgIGNoYXIgKnBhdGgpCi17Ci0JYWNwaV9zdGF0dXMgc3RhdHVzOwotCXN0cnVjdCBhY3BpX2J1ZmZlciBidWZmZXI7Ci0KLQlBQ1BJX0ZVTkNUSU9OX0VOVFJZKCk7Ci0KLQkvKiBPbmx5IHByaW50IHRoZSBwYXRoIGlmIHRoZSBhcHByb3ByaWF0ZSBkZWJ1ZyBsZXZlbCBpcyBlbmFibGVkICovCi0KLQlpZiAoIShhY3BpX2RiZ19sZXZlbCAmIEFDUElfTFZfSU5JVF9OQU1FUykpIHsKLQkJcmV0dXJuOwotCX0KLQotCS8qIEdldCB0aGUgZnVsbCBwYXRobmFtZSB0byB0aGUgbm9kZSAqLwotCi0JYnVmZmVyLmxlbmd0aCA9IEFDUElfQUxMT0NBVEVfTE9DQUxfQlVGRkVSOwotCXN0YXR1cyA9IGFjcGlfbnNfaGFuZGxlX3RvX3BhdGhuYW1lKG9ial9oYW5kbGUsICZidWZmZXIpOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlyZXR1cm47Ci0JfQotCi0JLyogUHJpbnQgd2hhdCB3ZSdyZSBkb2luZyAqLwotCi0Jc3dpdGNoICh0eXBlKSB7Ci0JY2FzZSBBQ1BJX1RZUEVfTUVUSE9EOgotCQlhY3BpX29zX3ByaW50ZigiRXhlY3V0aW5nICAiKTsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlhY3BpX29zX3ByaW50ZigiSW5pdGlhbGl6aW5nICIpOwotCQlicmVhazsKLQl9Ci0KLQkvKiBQcmludCB0aGUgb2JqZWN0IHR5cGUgYW5kIHBhdGhuYW1lICovCi0KLQlhY3BpX29zX3ByaW50ZigiJS0xMnMgJXMiLAotCQkgICAgICAgYWNwaV91dF9nZXRfdHlwZV9uYW1lKHR5cGUpLCAoY2hhciAqKWJ1ZmZlci5wb2ludGVyKTsKLQotCS8qIEV4dHJhIHBhdGggaXMgdXNlZCB0byBhcHBlbmQgbmFtZXMgbGlrZSBfU1RBLCBfSU5JLCBldGMuICovCi0KLQlpZiAocGF0aCkgewotCQlhY3BpX29zX3ByaW50ZigiLiVzIiwgcGF0aCk7Ci0JfQotCWFjcGlfb3NfcHJpbnRmKCJcbiIpOwotCi0JQUNQSV9GUkVFKGJ1ZmZlci5wb2ludGVyKTsKLX0KLSNlbmRpZgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X3ZhbGlkX2FjcGlfY2hhcgotICoKLSAqIFBBUkFNRVRFUlM6ICBDaGFyICAgICAgICAgICAgLSBUaGUgY2hhcmFjdGVyIHRvIGJlIGV4YW1pbmVkCi0gKiAgICAgICAgICAgICAgUG9zaXRpb24gICAgICAgIC0gQnl0ZSBwb3NpdGlvbiAoMC0zKQotICoKLSAqIFJFVFVSTjogICAgICBUUlVFIGlmIHRoZSBjaGFyYWN0ZXIgaXMgdmFsaWQsIEZBTFNFIG90aGVyd2lzZQotICoKLSAqIERFU0NSSVBUSU9OOiBDaGVjayBmb3IgYSB2YWxpZCBBQ1BJIGNoYXJhY3Rlci4gTXVzdCBiZSBvbmUgb2Y6Ci0gKiAgICAgICAgICAgICAgMSkgVXBwZXIgY2FzZSBhbHBoYQotICogICAgICAgICAgICAgIDIpIG51bWVyaWMKLSAqICAgICAgICAgICAgICAzKSB1bmRlcnNjb3JlCi0gKgotICogICAgICAgICAgICAgIFdlIGFsbG93IGEgJyEnIGFzIHRoZSBsYXN0IGNoYXJhY3RlciBiZWNhdXNlIG9mIHRoZSBBU0YhIHRhYmxlCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdTggYWNwaV91dF92YWxpZF9hY3BpX2NoYXIoY2hhciBjaGFyYWN0ZXIsIHUzMiBwb3NpdGlvbikKLXsKLQotCWlmICghKChjaGFyYWN0ZXIgPj0gJ0EnICYmIGNoYXJhY3RlciA8PSAnWicpIHx8Ci0JICAgICAgKGNoYXJhY3RlciA+PSAnMCcgJiYgY2hhcmFjdGVyIDw9ICc5JykgfHwgKGNoYXJhY3RlciA9PSAnXycpKSkgewotCi0JCS8qIEFsbG93IGEgJyEnIGluIHRoZSBsYXN0IHBvc2l0aW9uICovCi0KLQkJaWYgKGNoYXJhY3RlciA9PSAnIScgJiYgcG9zaXRpb24gPT0gMykgewotCQkJcmV0dXJuIChUUlVFKTsKLQkJfQotCi0JCXJldHVybiAoRkFMU0UpOwotCX0KLQotCXJldHVybiAoVFJVRSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfdXRfdmFsaWRfYWNwaV9uYW1lCi0gKgotICogUEFSQU1FVEVSUzogIE5hbWUgICAgICAgICAgICAtIFRoZSBuYW1lIHRvIGJlIGV4YW1pbmVkCi0gKgotICogUkVUVVJOOiAgICAgIFRSVUUgaWYgdGhlIG5hbWUgaXMgdmFsaWQsIEZBTFNFIG90aGVyd2lzZQotICoKLSAqIERFU0NSSVBUSU9OOiBDaGVjayBmb3IgYSB2YWxpZCBBQ1BJIG5hbWUuICBFYWNoIGNoYXJhY3RlciBtdXN0IGJlIG9uZSBvZjoKLSAqICAgICAgICAgICAgICAxKSBVcHBlciBjYXNlIGFscGhhCi0gKiAgICAgICAgICAgICAgMikgbnVtZXJpYwotICogICAgICAgICAgICAgIDMpIHVuZGVyc2NvcmUKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi11OCBhY3BpX3V0X3ZhbGlkX2FjcGlfbmFtZSh1MzIgbmFtZSkKLXsKLQl1MzIgaTsKLQotCUFDUElfRlVOQ1RJT05fRU5UUlkoKTsKLQotCWZvciAoaSA9IDA7IGkgPCBBQ1BJX05BTUVfU0laRTsgaSsrKSB7Ci0JCWlmICghYWNwaV91dF92YWxpZF9hY3BpX2NoYXIKLQkJICAgICgoQUNQSV9DQVNUX1BUUihjaGFyLCAmbmFtZSkpW2ldLCBpKSkgewotCQkJcmV0dXJuIChGQUxTRSk7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gKFRSVUUpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X3JlcGFpcl9uYW1lCi0gKgotICogUEFSQU1FVEVSUzogIE5hbWUgICAgICAgICAgICAtIFRoZSBBQ1BJIG5hbWUgdG8gYmUgcmVwYWlyZWQKLSAqCi0gKiBSRVRVUk46ICAgICAgUmVwYWlyZWQgdmVyc2lvbiBvZiB0aGUgbmFtZQotICoKLSAqIERFU0NSSVBUSU9OOiBSZXBhaXIgYW4gQUNQSSBuYW1lOiBDaGFuZ2UgaW52YWxpZCBjaGFyYWN0ZXJzIHRvICcqJyBhbmQKLSAqICAgICAgICAgICAgICByZXR1cm4gdGhlIG5ldyBuYW1lLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWFjcGlfbmFtZSBhY3BpX3V0X3JlcGFpcl9uYW1lKGNoYXIgKm5hbWUpCi17Ci0gICAgICAgdTMyIGk7Ci0JY2hhciBuZXdfbmFtZVtBQ1BJX05BTUVfU0laRV07Ci0KLQlmb3IgKGkgPSAwOyBpIDwgQUNQSV9OQU1FX1NJWkU7IGkrKykgewotCQluZXdfbmFtZVtpXSA9IG5hbWVbaV07Ci0KLQkJLyoKLQkJICogUmVwbGFjZSBhIGJhZCBjaGFyYWN0ZXIgd2l0aCBzb21ldGhpbmcgcHJpbnRhYmxlLCB5ZXQgdGVjaG5pY2FsbHkKLQkJICogc3RpbGwgaW52YWxpZC4gVGhpcyBwcmV2ZW50cyBhbnkgY29sbGlzaW9ucyB3aXRoIGV4aXN0aW5nICJnb29kIgotCQkgKiBuYW1lcyBpbiB0aGUgbmFtZXNwYWNlLgotCQkgKi8KLQkJaWYgKCFhY3BpX3V0X3ZhbGlkX2FjcGlfY2hhcihuYW1lW2ldLCBpKSkgewotCQkJbmV3X25hbWVbaV0gPSAnKic7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gKCoodTMyICopIG5ld19uYW1lKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV91dF9zdHJ0b3VsNjQKLSAqCi0gKiBQQVJBTUVURVJTOiAgU3RyaW5nICAgICAgICAgIC0gTnVsbCB0ZXJtaW5hdGVkIHN0cmluZwotICogICAgICAgICAgICAgIEJhc2UgICAgICAgICAgICAtIFJhZGl4IG9mIHRoZSBzdHJpbmc6IDE2IG9yIEFDUElfQU5ZX0JBU0U7Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUNQSV9BTllfQkFTRSBtZWFucyAnaW4gYmVoYWxmIG9mIHRvX2ludGVnZXInCi0gKiAgICAgICAgICAgICAgcmV0X2ludGVnZXIgICAgIC0gV2hlcmUgdGhlIGNvbnZlcnRlZCBpbnRlZ2VyIGlzIHJldHVybmVkCi0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cyBhbmQgQ29udmVydGVkIHZhbHVlCi0gKgotICogREVTQ1JJUFRJT046IENvbnZlcnQgYSBzdHJpbmcgaW50byBhbiB1bnNpZ25lZCB2YWx1ZS4gUGVyZm9ybXMgZWl0aGVyIGEKLSAqICAgICAgICAgICAgICAzMi1iaXQgb3IgNjQtYml0IGNvbnZlcnNpb24sIGRlcGVuZGluZyBvbiB0aGUgY3VycmVudCBtb2RlCi0gKiAgICAgICAgICAgICAgb2YgdGhlIGludGVycHJldGVyLgotICogICAgICAgICAgICAgIE5PVEU6IERvZXMgbm90IHN1cHBvcnQgT2N0YWwgc3RyaW5ncywgbm90IG5lZWRlZC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1hY3BpX3N0YXR1cwotYWNwaV91dF9zdHJ0b3VsNjQoY2hhciAqc3RyaW5nLCB1MzIgYmFzZSwgYWNwaV9pbnRlZ2VyICogcmV0X2ludGVnZXIpCi17Ci0JdTMyIHRoaXNfZGlnaXQgPSAwOwotCWFjcGlfaW50ZWdlciByZXR1cm5fdmFsdWUgPSAwOwotCWFjcGlfaW50ZWdlciBxdW90aWVudDsKLQlhY3BpX2ludGVnZXIgZGl2aWRlbmQ7Ci0JdTMyIHRvX2ludGVnZXJfb3AgPSAoYmFzZSA9PSBBQ1BJX0FOWV9CQVNFKTsKLQl1MzIgbW9kZTMyID0gKGFjcGlfZ2JsX2ludGVnZXJfYnl0ZV93aWR0aCA9PSA0KTsKLQl1OCB2YWxpZF9kaWdpdHMgPSAwOwotCXU4IHNpZ25fb2YweCA9IDA7Ci0JdTggdGVybSA9IDA7Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1NUUih1dF9zdHJvdWw2NCwgc3RyaW5nKTsKLQotCXN3aXRjaCAoYmFzZSkgewotCWNhc2UgQUNQSV9BTllfQkFTRToKLQljYXNlIDE2OgotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCS8qIEludmFsaWQgQmFzZSAqLwotCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX1BBUkFNRVRFUik7Ci0JfQotCi0JaWYgKCFzdHJpbmcpIHsKLQkJZ290byBlcnJvcl9leGl0OwotCX0KLQotCS8qIFNraXAgb3ZlciBhbnkgd2hpdGUgc3BhY2UgaW4gdGhlIGJ1ZmZlciAqLwotCi0Jd2hpbGUgKCgqc3RyaW5nKSAmJiAoQUNQSV9JU19TUEFDRSgqc3RyaW5nKSB8fCAqc3RyaW5nID09ICdcdCcpKSB7Ci0JCXN0cmluZysrOwotCX0KLQotCWlmICh0b19pbnRlZ2VyX29wKSB7Ci0JCS8qCi0JCSAqIEJhc2UgZXF1YWwgdG8gQUNQSV9BTllfQkFTRSBtZWFucyAndG9faW50ZWdlciBvcGVyYXRpb24gY2FzZScuCi0JCSAqIFdlIG5lZWQgdG8gZGV0ZXJtaW5lIGlmIGl0IGlzIGRlY2ltYWwgb3IgaGV4YWRlY2ltYWwuCi0JCSAqLwotCQlpZiAoKCpzdHJpbmcgPT0gJzAnKSAmJiAoQUNQSV9UT0xPV0VSKCooc3RyaW5nICsgMSkpID09ICd4JykpIHsKLQkJCXNpZ25fb2YweCA9IDE7Ci0JCQliYXNlID0gMTY7Ci0KLQkJCS8qIFNraXAgb3ZlciB0aGUgbGVhZGluZyAnMHgnICovCi0JCQlzdHJpbmcgKz0gMjsKLQkJfSBlbHNlIHsKLQkJCWJhc2UgPSAxMDsKLQkJfQotCX0KLQotCS8qIEFueSBzdHJpbmcgbGVmdD8gQ2hlY2sgdGhhdCAnMHgnIGlzIG5vdCBmb2xsb3dlZCBieSB3aGl0ZSBzcGFjZS4gKi8KLQotCWlmICghKCpzdHJpbmcpIHx8IEFDUElfSVNfU1BBQ0UoKnN0cmluZykgfHwgKnN0cmluZyA9PSAnXHQnKSB7Ci0JCWlmICh0b19pbnRlZ2VyX29wKSB7Ci0JCQlnb3RvIGVycm9yX2V4aXQ7Ci0JCX0gZWxzZSB7Ci0JCQlnb3RvIGFsbF9kb25lOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBQZXJmb3JtIGEgMzItYml0IG9yIDY0LWJpdCBjb252ZXJzaW9uLCBkZXBlbmRpbmcgdXBvbiB0aGUgY3VycmVudAotCSAqIGV4ZWN1dGlvbiBtb2RlIG9mIHRoZSBpbnRlcnByZXRlcgotCSAqLwotCWRpdmlkZW5kID0gKG1vZGUzMikgPyBBQ1BJX1VJTlQzMl9NQVggOiBBQ1BJX1VJTlQ2NF9NQVg7Ci0KLQkvKiBNYWluIGxvb3A6IGNvbnZlcnQgdGhlIHN0cmluZyB0byBhIDMyLSBvciA2NC1iaXQgaW50ZWdlciAqLwotCi0Jd2hpbGUgKCpzdHJpbmcpIHsKLQkJaWYgKEFDUElfSVNfRElHSVQoKnN0cmluZykpIHsKLQotCQkJLyogQ29udmVydCBBU0NJSSAwLTkgdG8gRGVjaW1hbCB2YWx1ZSAqLwotCi0JCQl0aGlzX2RpZ2l0ID0gKCh1OCkgKiBzdHJpbmcpIC0gJzAnOwotCQl9IGVsc2UgaWYgKGJhc2UgPT0gMTApIHsKLQotCQkJLyogRGlnaXQgaXMgb3V0IG9mIHJhbmdlOyBwb3NzaWJsZSBpbiB0b19pbnRlZ2VyIGNhc2Ugb25seSAqLwotCi0JCQl0ZXJtID0gMTsKLQkJfSBlbHNlIHsKLQkJCXRoaXNfZGlnaXQgPSAodTgpIEFDUElfVE9VUFBFUigqc3RyaW5nKTsKLQkJCWlmIChBQ1BJX0lTX1hESUdJVCgoY2hhcil0aGlzX2RpZ2l0KSkgewotCi0JCQkJLyogQ29udmVydCBBU0NJSSBIZXggY2hhciB0byB2YWx1ZSAqLwotCi0JCQkJdGhpc19kaWdpdCA9IHRoaXNfZGlnaXQgLSAnQScgKyAxMDsKLQkJCX0gZWxzZSB7Ci0JCQkJdGVybSA9IDE7Ci0JCQl9Ci0JCX0KLQotCQlpZiAodGVybSkgewotCQkJaWYgKHRvX2ludGVnZXJfb3ApIHsKLQkJCQlnb3RvIGVycm9yX2V4aXQ7Ci0JCQl9IGVsc2UgewotCQkJCWJyZWFrOwotCQkJfQotCQl9IGVsc2UgaWYgKCh2YWxpZF9kaWdpdHMgPT0gMCkgJiYgKHRoaXNfZGlnaXQgPT0gMCkKLQkJCSAgICYmICFzaWduX29mMHgpIHsKLQotCQkJLyogU2tpcCB6ZXJvcyAqLwotCQkJc3RyaW5nKys7Ci0JCQljb250aW51ZTsKLQkJfQotCi0JCXZhbGlkX2RpZ2l0cysrOwotCi0JCWlmIChzaWduX29mMHggJiYgKCh2YWxpZF9kaWdpdHMgPiAxNikKLQkJCQkgIHx8ICgodmFsaWRfZGlnaXRzID4gOCkgJiYgbW9kZTMyKSkpIHsKLQkJCS8qCi0JCQkgKiBUaGlzIGlzIHRvX2ludGVnZXIgb3BlcmF0aW9uIGNhc2UuCi0JCQkgKiBObyBhbnkgcmVzdHJpY3Rpb25zIGZvciBzdHJpbmctdG8taW50ZWdlciBjb252ZXJzaW9uLAotCQkJICogc2VlIEFDUEkgc3BlYy4KLQkJCSAqLwotCQkJZ290byBlcnJvcl9leGl0OwotCQl9Ci0KLQkJLyogRGl2aWRlIHRoZSBkaWdpdCBpbnRvIHRoZSBjb3JyZWN0IHBvc2l0aW9uICovCi0KLQkJKHZvaWQpCi0JCSAgICBhY3BpX3V0X3Nob3J0X2RpdmlkZSgoZGl2aWRlbmQgLSAoYWNwaV9pbnRlZ2VyKSB0aGlzX2RpZ2l0KSwKLQkJCQkJIGJhc2UsICZxdW90aWVudCwgTlVMTCk7Ci0KLQkJaWYgKHJldHVybl92YWx1ZSA+IHF1b3RpZW50KSB7Ci0JCQlpZiAodG9faW50ZWdlcl9vcCkgewotCQkJCWdvdG8gZXJyb3JfZXhpdDsKLQkJCX0gZWxzZSB7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm5fdmFsdWUgKj0gYmFzZTsKLQkJcmV0dXJuX3ZhbHVlICs9IHRoaXNfZGlnaXQ7Ci0JCXN0cmluZysrOwotCX0KLQotCS8qIEFsbCBkb25lLCBub3JtYWwgZXhpdCAqLwotCi0gICAgICBhbGxfZG9uZToKLQotCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVhFQywgIkNvbnZlcnRlZCB2YWx1ZTogJTguOFglOC44WFxuIiwKLQkJCSAgQUNQSV9GT1JNQVRfVUlOVDY0KHJldHVybl92YWx1ZSkpKTsKLQotCSpyZXRfaW50ZWdlciA9IHJldHVybl92YWx1ZTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwotCi0gICAgICBlcnJvcl9leGl0OgotCS8qIEJhc2Ugd2FzIHNldC92YWxpZGF0ZWQgYWJvdmUgKi8KLQotCWlmIChiYXNlID09IDEwKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfREVDSU1BTF9DT05TVEFOVCk7Ci0JfSBlbHNlIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9IRVhfQ09OU1RBTlQpOwotCX0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV91dF9jcmVhdGVfdXBkYXRlX3N0YXRlX2FuZF9wdXNoCi0gKgotICogUEFSQU1FVEVSUzogIE9iamVjdCAgICAgICAgICAtIE9iamVjdCB0byBiZSBhZGRlZCB0byB0aGUgbmV3IHN0YXRlCi0gKiAgICAgICAgICAgICAgQWN0aW9uICAgICAgICAgIC0gSW5jcmVtZW50L0RlY3JlbWVudAotICogICAgICAgICAgICAgIHN0YXRlX2xpc3QgICAgICAtIExpc3QgdGhlIHN0YXRlIHdpbGwgYmUgYWRkZWQgdG8KLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IENyZWF0ZSBhIG5ldyBzdGF0ZSBhbmQgcHVzaCBpdAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWFjcGlfc3RhdHVzCi1hY3BpX3V0X2NyZWF0ZV91cGRhdGVfc3RhdGVfYW5kX3B1c2godW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqZWN0LAotCQkJCSAgICAgdTE2IGFjdGlvbiwKLQkJCQkgICAgIHVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSAqKnN0YXRlX2xpc3QpCi17Ci0JdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICpzdGF0ZTsKLQotCUFDUElfRlVOQ1RJT05fRU5UUlkoKTsKLQotCS8qIElnbm9yZSBudWxsIG9iamVjdHM7IHRoZXNlIGFyZSBleHBlY3RlZCAqLwotCi0JaWYgKCFvYmplY3QpIHsKLQkJcmV0dXJuIChBRV9PSyk7Ci0JfQotCi0Jc3RhdGUgPSBhY3BpX3V0X2NyZWF0ZV91cGRhdGVfc3RhdGUob2JqZWN0LCBhY3Rpb24pOwotCWlmICghc3RhdGUpIHsKLQkJcmV0dXJuIChBRV9OT19NRU1PUlkpOwotCX0KLQotCWFjcGlfdXRfcHVzaF9nZW5lcmljX3N0YXRlKHN0YXRlX2xpc3QsIHN0YXRlKTsKLQlyZXR1cm4gKEFFX09LKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV91dF93YWxrX3BhY2thZ2VfdHJlZQotICoKLSAqIFBBUkFNRVRFUlM6ICBzb3VyY2Vfb2JqZWN0ICAgICAgIC0gVGhlIHBhY2thZ2UgdG8gd2FsawotICogICAgICAgICAgICAgIHRhcmdldF9vYmplY3QgICAgICAgLSBUYXJnZXQgb2JqZWN0IChpZiBwYWNrYWdlIGlzIGJlaW5nIGNvcGllZCkKLSAqICAgICAgICAgICAgICB3YWxrX2NhbGxiYWNrICAgICAgIC0gQ2FsbGVkIG9uY2UgZm9yIGVhY2ggcGFja2FnZSBlbGVtZW50Ci0gKiAgICAgICAgICAgICAgQ29udGV4dCAgICAgICAgICAgICAtIFBhc3NlZCB0byB0aGUgY2FsbGJhY2sgZnVuY3Rpb24KLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IFdhbGsgdGhyb3VnaCBhIHBhY2thZ2UKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1hY3BpX3N0YXR1cwotYWNwaV91dF93YWxrX3BhY2thZ2VfdHJlZSh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICogc291cmNlX29iamVjdCwKLQkJCSAgdm9pZCAqdGFyZ2V0X29iamVjdCwKLQkJCSAgYWNwaV9wa2dfY2FsbGJhY2sgd2Fsa19jYWxsYmFjaywgdm9pZCAqY29udGV4dCkKLXsKLQlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKLQl1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgKnN0YXRlX2xpc3QgPSBOVUxMOwotCXVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSAqc3RhdGU7Ci0JdTMyIHRoaXNfaW5kZXg7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqdGhpc19zb3VyY2Vfb2JqOwotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSh1dF93YWxrX3BhY2thZ2VfdHJlZSk7Ci0KLQlzdGF0ZSA9IGFjcGlfdXRfY3JlYXRlX3BrZ19zdGF0ZShzb3VyY2Vfb2JqZWN0LCB0YXJnZXRfb2JqZWN0LCAwKTsKLQlpZiAoIXN0YXRlKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT19NRU1PUlkpOwotCX0KLQotCXdoaWxlIChzdGF0ZSkgewotCi0JCS8qIEdldCBvbmUgZWxlbWVudCBvZiB0aGUgcGFja2FnZSAqLwotCi0JCXRoaXNfaW5kZXggPSBzdGF0ZS0+cGtnLmluZGV4OwotCQl0aGlzX3NvdXJjZV9vYmogPSAodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKQotCQkgICAgc3RhdGUtPnBrZy5zb3VyY2Vfb2JqZWN0LT5wYWNrYWdlLmVsZW1lbnRzW3RoaXNfaW5kZXhdOwotCi0JCS8qCi0JCSAqIENoZWNrIGZvcjoKLQkJICogMSkgQW4gdW5pbml0aWFsaXplZCBwYWNrYWdlIGVsZW1lbnQuICBJdCBpcyBjb21wbGV0ZWx5Ci0JCSAqICAgIGxlZ2FsIHRvIGRlY2xhcmUgYSBwYWNrYWdlIGFuZCBsZWF2ZSBpdCB1bmluaXRpYWxpemVkCi0JCSAqIDIpIE5vdCBhbiBpbnRlcm5hbCBvYmplY3QgLSBjYW4gYmUgYSBuYW1lc3BhY2Ugbm9kZSBpbnN0ZWFkCi0JCSAqIDMpIEFueSB0eXBlIG90aGVyIHRoYW4gYSBwYWNrYWdlLiAgUGFja2FnZXMgYXJlIGhhbmRsZWQgaW4gZWxzZQotCQkgKiAgICBjYXNlIGJlbG93LgotCQkgKi8KLQkJaWYgKCghdGhpc19zb3VyY2Vfb2JqKSB8fAotCQkgICAgKEFDUElfR0VUX0RFU0NSSVBUT1JfVFlQRSh0aGlzX3NvdXJjZV9vYmopICE9Ci0JCSAgICAgQUNQSV9ERVNDX1RZUEVfT1BFUkFORCkKLQkJICAgIHx8IChBQ1BJX0dFVF9PQkpFQ1RfVFlQRSh0aGlzX3NvdXJjZV9vYmopICE9Ci0JCQlBQ1BJX1RZUEVfUEFDS0FHRSkpIHsKLQkJCXN0YXR1cyA9Ci0JCQkgICAgd2Fsa19jYWxsYmFjayhBQ1BJX0NPUFlfVFlQRV9TSU1QTEUsCi0JCQkJCSAgdGhpc19zb3VyY2Vfb2JqLCBzdGF0ZSwgY29udGV4dCk7Ci0JCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLQkJCX0KLQotCQkJc3RhdGUtPnBrZy5pbmRleCsrOwotCQkJd2hpbGUgKHN0YXRlLT5wa2cuaW5kZXggPj0KLQkJCSAgICAgICBzdGF0ZS0+cGtnLnNvdXJjZV9vYmplY3QtPnBhY2thZ2UuY291bnQpIHsKLQkJCQkvKgotCQkJCSAqIFdlJ3ZlIGhhbmRsZWQgYWxsIG9mIHRoZSBvYmplY3RzIGF0IHRoaXMgbGV2ZWwsICBUaGlzIG1lYW5zCi0JCQkJICogdGhhdCB3ZSBoYXZlIGp1c3QgY29tcGxldGVkIGEgcGFja2FnZS4gIFRoYXQgcGFja2FnZSBtYXkKLQkJCQkgKiBoYXZlIGNvbnRhaW5lZCBvbmUgb3IgbW9yZSBwYWNrYWdlcyBpdHNlbGYuCi0JCQkJICoKLQkJCQkgKiBEZWxldGUgdGhpcyBzdGF0ZSBhbmQgcG9wIHRoZSBwcmV2aW91cyBzdGF0ZSAocGFja2FnZSkuCi0JCQkJICovCi0JCQkJYWNwaV91dF9kZWxldGVfZ2VuZXJpY19zdGF0ZShzdGF0ZSk7Ci0JCQkJc3RhdGUgPSBhY3BpX3V0X3BvcF9nZW5lcmljX3N0YXRlKCZzdGF0ZV9saXN0KTsKLQotCQkJCS8qIEZpbmlzaGVkIHdoZW4gdGhlcmUgYXJlIG5vIG1vcmUgc3RhdGVzICovCi0KLQkJCQlpZiAoIXN0YXRlKSB7Ci0JCQkJCS8qCi0JCQkJCSAqIFdlIGhhdmUgaGFuZGxlZCBhbGwgb2YgdGhlIG9iamVjdHMgaW4gdGhlIHRvcCBsZXZlbAotCQkJCQkgKiBwYWNrYWdlIGp1c3QgYWRkIHRoZSBsZW5ndGggb2YgdGhlIHBhY2thZ2Ugb2JqZWN0cwotCQkJCQkgKiBhbmQgZXhpdAotCQkJCQkgKi8KLQkJCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKLQkJCQl9Ci0KLQkJCQkvKgotCQkJCSAqIEdvIGJhY2sgdXAgYSBsZXZlbCBhbmQgbW92ZSB0aGUgaW5kZXggcGFzdCB0aGUganVzdAotCQkJCSAqIGNvbXBsZXRlZCBwYWNrYWdlIG9iamVjdC4KLQkJCQkgKi8KLQkJCQlzdGF0ZS0+cGtnLmluZGV4Kys7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQkvKiBUaGlzIGlzIGEgc3Vib2JqZWN0IG9mIHR5cGUgcGFja2FnZSAqLwotCi0JCQlzdGF0dXMgPQotCQkJICAgIHdhbGtfY2FsbGJhY2soQUNQSV9DT1BZX1RZUEVfUEFDS0FHRSwKLQkJCQkJICB0aGlzX3NvdXJjZV9vYmosIHN0YXRlLCBjb250ZXh0KTsKLQkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotCQkJfQotCi0JCQkvKgotCQkJICogUHVzaCB0aGUgY3VycmVudCBzdGF0ZSBhbmQgY3JlYXRlIGEgbmV3IG9uZQotCQkJICogVGhlIGNhbGxiYWNrIGFib3ZlIHJldHVybmVkIGEgbmV3IHRhcmdldCBwYWNrYWdlIG9iamVjdC4KLQkJCSAqLwotCQkJYWNwaV91dF9wdXNoX2dlbmVyaWNfc3RhdGUoJnN0YXRlX2xpc3QsIHN0YXRlKTsKLQkJCXN0YXRlID0gYWNwaV91dF9jcmVhdGVfcGtnX3N0YXRlKHRoaXNfc291cmNlX29iaiwKLQkJCQkJCQkgc3RhdGUtPnBrZy4KLQkJCQkJCQkgdGhpc190YXJnZXRfb2JqLCAwKTsKLQkJCWlmICghc3RhdGUpIHsKLQotCQkJCS8qIEZyZWUgYW55IHN0YWNrZWQgVXBkYXRlIFN0YXRlIG9iamVjdHMgKi8KLQotCQkJCXdoaWxlIChzdGF0ZV9saXN0KSB7Ci0JCQkJCXN0YXRlID0KLQkJCQkJICAgIGFjcGlfdXRfcG9wX2dlbmVyaWNfc3RhdGUKLQkJCQkJICAgICgmc3RhdGVfbGlzdCk7Ci0JCQkJCWFjcGlfdXRfZGVsZXRlX2dlbmVyaWNfc3RhdGUoc3RhdGUpOwotCQkJCX0KLQkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9fTUVNT1JZKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qIFdlIHNob3VsZCBuZXZlciBnZXQgaGVyZSAqLwotCi0JcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9JTlRFUk5BTCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfdXRfZXJyb3IsIGFjcGlfdXRfd2FybmluZywgYWNwaV91dF9pbmZvCi0gKgotICogUEFSQU1FVEVSUzogIG1vZHVsZV9uYW1lICAgICAgICAgLSBDYWxsZXIncyBtb2R1bGUgbmFtZSAoZm9yIGVycm9yIG91dHB1dCkKLSAqICAgICAgICAgICAgICBsaW5lX251bWJlciAgICAgICAgIC0gQ2FsbGVyJ3MgbGluZSBudW1iZXIgKGZvciBlcnJvciBvdXRwdXQpCi0gKiAgICAgICAgICAgICAgRm9ybWF0ICAgICAgICAgICAgICAtIFByaW50ZiBmb3JtYXQgc3RyaW5nICsgYWRkaXRpb25hbCBhcmdzCi0gKgotICogUkVUVVJOOiAgICAgIE5vbmUKLSAqCi0gKiBERVNDUklQVElPTjogUHJpbnQgbWVzc2FnZSB3aXRoIG1vZHVsZS9saW5lL3ZlcnNpb24gaW5mbwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXZvaWQgQUNQSV9JTlRFUk5BTF9WQVJfWEZBQ0UKLWFjcGlfdXRfZXJyb3IoY29uc3QgY2hhciAqbW9kdWxlX25hbWUsIHUzMiBsaW5lX251bWJlciwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCi17Ci0JdmFfbGlzdCBhcmdzOwotCi0JYWNwaV9vc19wcmludGYoIkFDUEkgRXJyb3IgKCVzLSUwNGQpOiAiLCBtb2R1bGVfbmFtZSwgbGluZV9udW1iZXIpOwotCi0JdmFfc3RhcnQoYXJncywgZm9ybWF0KTsKLQlhY3BpX29zX3ZwcmludGYoZm9ybWF0LCBhcmdzKTsKLQlhY3BpX29zX3ByaW50ZigiIFslWF1cbiIsIEFDUElfQ0FfVkVSU0lPTik7Ci0JdmFfZW5kKGFyZ3MpOwotfQotCi12b2lkIEFDUElfSU5URVJOQUxfVkFSX1hGQUNFCi1hY3BpX3V0X2V4Y2VwdGlvbihjb25zdCBjaGFyICptb2R1bGVfbmFtZSwKLQkJICB1MzIgbGluZV9udW1iZXIsIGFjcGlfc3RhdHVzIHN0YXR1cywgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCi17Ci0JdmFfbGlzdCBhcmdzOwotCi0JYWNwaV9vc19wcmludGYoIkFDUEkgRXhjZXB0aW9uICglcy0lMDRkKTogJXMsICIsIG1vZHVsZV9uYW1lLAotCQkgICAgICAgbGluZV9udW1iZXIsIGFjcGlfZm9ybWF0X2V4Y2VwdGlvbihzdGF0dXMpKTsKLQotCXZhX3N0YXJ0KGFyZ3MsIGZvcm1hdCk7Ci0JYWNwaV9vc192cHJpbnRmKGZvcm1hdCwgYXJncyk7Ci0JYWNwaV9vc19wcmludGYoIiBbJVhdXG4iLCBBQ1BJX0NBX1ZFUlNJT04pOwotCXZhX2VuZChhcmdzKTsKLX0KLQotRVhQT1JUX1NZTUJPTChhY3BpX3V0X2V4Y2VwdGlvbik7Ci0KLXZvaWQgQUNQSV9JTlRFUk5BTF9WQVJfWEZBQ0UKLWFjcGlfdXRfd2FybmluZyhjb25zdCBjaGFyICptb2R1bGVfbmFtZSwKLQkJdTMyIGxpbmVfbnVtYmVyLCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKLXsKLQl2YV9saXN0IGFyZ3M7Ci0KLQlhY3BpX29zX3ByaW50ZigiQUNQSSBXYXJuaW5nICglcy0lMDRkKTogIiwgbW9kdWxlX25hbWUsIGxpbmVfbnVtYmVyKTsKLQotCXZhX3N0YXJ0KGFyZ3MsIGZvcm1hdCk7Ci0JYWNwaV9vc192cHJpbnRmKGZvcm1hdCwgYXJncyk7Ci0JYWNwaV9vc19wcmludGYoIiBbJVhdXG4iLCBBQ1BJX0NBX1ZFUlNJT04pOwotCXZhX2VuZChhcmdzKTsKLX0KLQotdm9pZCBBQ1BJX0lOVEVSTkFMX1ZBUl9YRkFDRQotYWNwaV91dF9pbmZvKGNvbnN0IGNoYXIgKm1vZHVsZV9uYW1lLCB1MzIgbGluZV9udW1iZXIsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQotewotCXZhX2xpc3QgYXJnczsKLQotCS8qCi0JICogUmVtb3ZlZCBtb2R1bGVfbmFtZSwgbGluZV9udW1iZXIsIGFuZCBhY3BpY2EgdmVyc2lvbiwgbm90IG5lZWRlZAotCSAqIGZvciBpbmZvIG91dHB1dAotCSAqLwotCWFjcGlfb3NfcHJpbnRmKCJBQ1BJOiAiKTsKLQotCXZhX3N0YXJ0KGFyZ3MsIGZvcm1hdCk7Ci0JYWNwaV9vc192cHJpbnRmKGZvcm1hdCwgYXJncyk7Ci0JYWNwaV9vc19wcmludGYoIlxuIik7Ci0JdmFfZW5kKGFyZ3MpOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dG11dGV4LmMgYi9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0bXV0ZXguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzMzMWRkZS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0bXV0ZXguYworKysgL2Rldi9udWxsCkBAIC0xLDM0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIE1vZHVsZSBOYW1lOiB1dG11dGV4IC0gbG9jYWwgbXV0ZXggc3VwcG9ydAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA4LCBJbnRlbCBDb3JwLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAotICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgYXQgbWluaW11bSBhIGRpc2NsYWltZXIKLSAqICAgIHN1YnN0YW50aWFsbHkgc2ltaWxhciB0byB0aGUgIk5PIFdBUlJBTlRZIiBkaXNjbGFpbWVyIGJlbG93Ci0gKiAgICAoIkRpc2NsYWltZXIiKSBhbmQgYW55IHJlZGlzdHJpYnV0aW9uIG11c3QgYmUgY29uZGl0aW9uZWQgdXBvbgotICogICAgaW5jbHVkaW5nIGEgc3Vic3RhbnRpYWxseSBzaW1pbGFyIERpc2NsYWltZXIgcmVxdWlyZW1lbnQgZm9yIGZ1cnRoZXIKLSAqICAgIGJpbmFyeSByZWRpc3RyaWJ1dGlvbi4KLSAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcwotICogICAgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICogU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBOTyBXQVJSQU5UWQotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCi0gKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUwotICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcKLSAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQotICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgotICovCi0KLSNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KLQotI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfVVRJTElUSUVTCi1BQ1BJX01PRFVMRV9OQU1FKCJ1dG11dGV4IikKLQotLyogTG9jYWwgcHJvdG90eXBlcyAqLwotc3RhdGljIGFjcGlfc3RhdHVzIGFjcGlfdXRfY3JlYXRlX211dGV4KGFjcGlfbXV0ZXhfaGFuZGxlIG11dGV4X2lkKTsKLQotc3RhdGljIGFjcGlfc3RhdHVzIGFjcGlfdXRfZGVsZXRlX211dGV4KGFjcGlfbXV0ZXhfaGFuZGxlIG11dGV4X2lkKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV91dF9tdXRleF9pbml0aWFsaXplCi0gKgotICogUEFSQU1FVEVSUzogIE5vbmUuCi0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cwotICoKLSAqIERFU0NSSVBUSU9OOiBDcmVhdGUgdGhlIHN5c3RlbSBtdXRleCBvYmplY3RzLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWFjcGlfc3RhdHVzIGFjcGlfdXRfbXV0ZXhfaW5pdGlhbGl6ZSh2b2lkKQotewotCXUzMiBpOwotCWFjcGlfc3RhdHVzIHN0YXR1czsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UodXRfbXV0ZXhfaW5pdGlhbGl6ZSk7Ci0KLQkvKgotCSAqIENyZWF0ZSBlYWNoIG9mIHRoZSBwcmVkZWZpbmVkIG11dGV4IG9iamVjdHMKLQkgKi8KLQlmb3IgKGkgPSAwOyBpIDwgQUNQSV9OVU1fTVVURVg7IGkrKykgewotCQlzdGF0dXMgPSBhY3BpX3V0X2NyZWF0ZV9tdXRleChpKTsKLQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLQkJfQotCX0KLQotCS8qIENyZWF0ZSB0aGUgc3BpbmxvY2tzIGZvciB1c2UgYXQgaW50ZXJydXB0IGxldmVsICovCi0KLQlzcGluX2xvY2tfaW5pdChhY3BpX2dibF9ncGVfbG9jayk7Ci0Jc3Bpbl9sb2NrX2luaXQoYWNwaV9nYmxfaGFyZHdhcmVfbG9jayk7Ci0KLQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV91dF9tdXRleF90ZXJtaW5hdGUKLSAqCi0gKiBQQVJBTUVURVJTOiAgTm9uZS4KLSAqCi0gKiBSRVRVUk46ICAgICAgTm9uZS4KLSAqCi0gKiBERVNDUklQVElPTjogRGVsZXRlIGFsbCBvZiB0aGUgc3lzdGVtIG11dGV4IG9iamVjdHMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdm9pZCBhY3BpX3V0X211dGV4X3Rlcm1pbmF0ZSh2b2lkKQotewotCXUzMiBpOwotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSh1dF9tdXRleF90ZXJtaW5hdGUpOwotCi0JLyoKLQkgKiBEZWxldGUgZWFjaCBwcmVkZWZpbmVkIG11dGV4IG9iamVjdAotCSAqLwotCWZvciAoaSA9IDA7IGkgPCBBQ1BJX05VTV9NVVRFWDsgaSsrKSB7Ci0JCSh2b2lkKWFjcGlfdXRfZGVsZXRlX211dGV4KGkpOwotCX0KLQotCS8qIERlbGV0ZSB0aGUgc3BpbmxvY2tzICovCi0KLQlhY3BpX29zX2RlbGV0ZV9sb2NrKGFjcGlfZ2JsX2dwZV9sb2NrKTsKLQlhY3BpX29zX2RlbGV0ZV9sb2NrKGFjcGlfZ2JsX2hhcmR3YXJlX2xvY2spOwotCXJldHVybl9WT0lEOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X2NyZWF0ZV9tdXRleAotICoKLSAqIFBBUkFNRVRFUlM6ICBtdXRleF9pRCAgICAgICAgLSBJRCBvZiB0aGUgbXV0ZXggdG8gYmUgY3JlYXRlZAotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKLSAqCi0gKiBERVNDUklQVElPTjogQ3JlYXRlIGEgbXV0ZXggb2JqZWN0LgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyBhY3BpX3N0YXR1cyBhY3BpX3V0X2NyZWF0ZV9tdXRleChhY3BpX211dGV4X2hhbmRsZSBtdXRleF9pZCkKLXsKLQlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0VfVTMyKHV0X2NyZWF0ZV9tdXRleCwgbXV0ZXhfaWQpOwotCi0JaWYgKG11dGV4X2lkID4gQUNQSV9NQVhfTVVURVgpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9QQVJBTUVURVIpOwotCX0KLQotCWlmICghYWNwaV9nYmxfbXV0ZXhfaW5mb1ttdXRleF9pZF0ubXV0ZXgpIHsKLQkJc3RhdHVzID0KLQkJICAgIGFjcGlfb3NfY3JlYXRlX211dGV4KCZhY3BpX2dibF9tdXRleF9pbmZvW211dGV4X2lkXS5tdXRleCk7Ci0JCWFjcGlfZ2JsX211dGV4X2luZm9bbXV0ZXhfaWRdLnRocmVhZF9pZCA9Ci0JCSAgICBBQ1BJX01VVEVYX05PVF9BQ1FVSVJFRDsKLQkJYWNwaV9nYmxfbXV0ZXhfaW5mb1ttdXRleF9pZF0udXNlX2NvdW50ID0gMDsKLQl9Ci0KLQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV91dF9kZWxldGVfbXV0ZXgKLSAqCi0gKiBQQVJBTUVURVJTOiAgbXV0ZXhfaUQgICAgICAgIC0gSUQgb2YgdGhlIG11dGV4IHRvIGJlIGRlbGV0ZWQKLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IERlbGV0ZSBhIG11dGV4IG9iamVjdC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgYWNwaV9zdGF0dXMgYWNwaV91dF9kZWxldGVfbXV0ZXgoYWNwaV9tdXRleF9oYW5kbGUgbXV0ZXhfaWQpCi17Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1UzMih1dF9kZWxldGVfbXV0ZXgsIG11dGV4X2lkKTsKLQotCWlmIChtdXRleF9pZCA+IEFDUElfTUFYX01VVEVYKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfUEFSQU1FVEVSKTsKLQl9Ci0KLQlhY3BpX29zX2RlbGV0ZV9tdXRleChhY3BpX2dibF9tdXRleF9pbmZvW211dGV4X2lkXS5tdXRleCk7Ci0KLQlhY3BpX2dibF9tdXRleF9pbmZvW211dGV4X2lkXS5tdXRleCA9IE5VTEw7Ci0JYWNwaV9nYmxfbXV0ZXhfaW5mb1ttdXRleF9pZF0udGhyZWFkX2lkID0gQUNQSV9NVVRFWF9OT1RfQUNRVUlSRUQ7Ci0KLQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X2FjcXVpcmVfbXV0ZXgKLSAqCi0gKiBQQVJBTUVURVJTOiAgbXV0ZXhfaUQgICAgICAgIC0gSUQgb2YgdGhlIG11dGV4IHRvIGJlIGFjcXVpcmVkCi0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cwotICoKLSAqIERFU0NSSVBUSU9OOiBBY3F1aXJlIGEgbXV0ZXggb2JqZWN0LgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWFjcGlfc3RhdHVzIGFjcGlfdXRfYWNxdWlyZV9tdXRleChhY3BpX211dGV4X2hhbmRsZSBtdXRleF9pZCkKLXsKLQlhY3BpX3N0YXR1cyBzdGF0dXM7Ci0JYWNwaV90aHJlYWRfaWQgdGhpc190aHJlYWRfaWQ7Ci0KLQlBQ1BJX0ZVTkNUSU9OX05BTUUodXRfYWNxdWlyZV9tdXRleCk7Ci0KLQlpZiAobXV0ZXhfaWQgPiBBQ1BJX01BWF9NVVRFWCkgewotCQlyZXR1cm4gKEFFX0JBRF9QQVJBTUVURVIpOwotCX0KLQotCXRoaXNfdGhyZWFkX2lkID0gYWNwaV9vc19nZXRfdGhyZWFkX2lkKCk7Ci0KLSNpZmRlZiBBQ1BJX01VVEVYX0RFQlVHCi0JewotCQl1MzIgaTsKLQkJLyoKLQkJICogTXV0ZXggZGVidWcgY29kZSwgZm9yIGludGVybmFsIGRlYnVnZ2luZyBvbmx5LgotCQkgKgotCQkgKiBEZWFkbG9jayBwcmV2ZW50aW9uLiAgQ2hlY2sgaWYgdGhpcyB0aHJlYWQgb3ducyBhbnkgbXV0ZXhlcyBvZiB2YWx1ZQotCQkgKiBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhpcyBvbmUuICBJZiBzbywgdGhlIHRocmVhZCBoYXMgdmlvbGF0ZWQKLQkJICogdGhlIG11dGV4IG9yZGVyaW5nIHJ1bGUuICBUaGlzIGluZGljYXRlcyBhIGNvZGluZyBlcnJvciBzb21ld2hlcmUgaW4KLQkJICogdGhlIEFDUEkgc3Vic3lzdGVtIGNvZGUuCi0JCSAqLwotCQlmb3IgKGkgPSBtdXRleF9pZDsgaSA8IEFDUElfTlVNX01VVEVYOyBpKyspIHsKLQkJCWlmIChhY3BpX2dibF9tdXRleF9pbmZvW2ldLnRocmVhZF9pZCA9PSB0aGlzX3RocmVhZF9pZCkgewotCQkJCWlmIChpID09IG11dGV4X2lkKSB7Ci0JCQkJCUFDUElfRVJST1IoKEFFX0lORk8sCi0JCQkJCQkgICAgIk11dGV4IFslc10gYWxyZWFkeSBhY3F1aXJlZCBieSB0aGlzIHRocmVhZCBbJVhdIiwKLQkJCQkJCSAgICBhY3BpX3V0X2dldF9tdXRleF9uYW1lCi0JCQkJCQkgICAgKG11dGV4X2lkKSwKLQkJCQkJCSAgICB0aGlzX3RocmVhZF9pZCkpOwotCi0JCQkJCXJldHVybiAoQUVfQUxSRUFEWV9BQ1FVSVJFRCk7Ci0JCQkJfQotCi0JCQkJQUNQSV9FUlJPUigoQUVfSU5GTywKLQkJCQkJICAgICJJbnZhbGlkIGFjcXVpcmUgb3JkZXI6IFRocmVhZCAlWCBvd25zIFslc10sIHdhbnRzIFslc10iLAotCQkJCQkgICAgdGhpc190aHJlYWRfaWQsCi0JCQkJCSAgICBhY3BpX3V0X2dldF9tdXRleF9uYW1lKGkpLAotCQkJCQkgICAgYWNwaV91dF9nZXRfbXV0ZXhfbmFtZShtdXRleF9pZCkpKTsKLQotCQkJCXJldHVybiAoQUVfQUNRVUlSRV9ERUFETE9DSyk7Ci0JCQl9Ci0JCX0KLQl9Ci0jZW5kaWYKLQotCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfTVVURVgsCi0JCQkgICJUaHJlYWQgJWxYIGF0dGVtcHRpbmcgdG8gYWNxdWlyZSBNdXRleCBbJXNdXG4iLAotCQkJICAodW5zaWduZWQgbG9uZyl0aGlzX3RocmVhZF9pZCwKLQkJCSAgYWNwaV91dF9nZXRfbXV0ZXhfbmFtZShtdXRleF9pZCkpKTsKLQotCXN0YXR1cyA9IGFjcGlfb3NfYWNxdWlyZV9tdXRleChhY3BpX2dibF9tdXRleF9pbmZvW211dGV4X2lkXS5tdXRleCwKLQkJCQkgICAgICAgQUNQSV9XQUlUX0ZPUkVWRVIpOwotCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkgewotCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX01VVEVYLAotCQkJCSAgIlRocmVhZCAlbFggYWNxdWlyZWQgTXV0ZXggWyVzXVxuIiwKLQkJCQkgICh1bnNpZ25lZCBsb25nKXRoaXNfdGhyZWFkX2lkLAotCQkJCSAgYWNwaV91dF9nZXRfbXV0ZXhfbmFtZShtdXRleF9pZCkpKTsKLQotCQlhY3BpX2dibF9tdXRleF9pbmZvW211dGV4X2lkXS51c2VfY291bnQrKzsKLQkJYWNwaV9nYmxfbXV0ZXhfaW5mb1ttdXRleF9pZF0udGhyZWFkX2lkID0gdGhpc190aHJlYWRfaWQ7Ci0JfSBlbHNlIHsKLQkJQUNQSV9FWENFUFRJT04oKEFFX0lORk8sIHN0YXR1cywKLQkJCQkiVGhyZWFkICVsWCBjb3VsZCBub3QgYWNxdWlyZSBNdXRleCBbJVhdIiwKLQkJCQkodW5zaWduZWQgbG9uZyl0aGlzX3RocmVhZF9pZCwgbXV0ZXhfaWQpKTsKLQl9Ci0KLQlyZXR1cm4gKHN0YXR1cyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfdXRfcmVsZWFzZV9tdXRleAotICoKLSAqIFBBUkFNRVRFUlM6ICBtdXRleF9pRCAgICAgICAgLSBJRCBvZiB0aGUgbXV0ZXggdG8gYmUgcmVsZWFzZWQKLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IFJlbGVhc2UgYSBtdXRleCBvYmplY3QuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotYWNwaV9zdGF0dXMgYWNwaV91dF9yZWxlYXNlX211dGV4KGFjcGlfbXV0ZXhfaGFuZGxlIG11dGV4X2lkKQotewotCWFjcGlfdGhyZWFkX2lkIHRoaXNfdGhyZWFkX2lkOwotCi0JQUNQSV9GVU5DVElPTl9OQU1FKHV0X3JlbGVhc2VfbXV0ZXgpOwotCi0JdGhpc190aHJlYWRfaWQgPSBhY3BpX29zX2dldF90aHJlYWRfaWQoKTsKLQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX01VVEVYLAotCQkJICAiVGhyZWFkICVsWCByZWxlYXNpbmcgTXV0ZXggWyVzXVxuIiwKLQkJCSAgKHVuc2lnbmVkIGxvbmcpdGhpc190aHJlYWRfaWQsCi0JCQkgIGFjcGlfdXRfZ2V0X211dGV4X25hbWUobXV0ZXhfaWQpKSk7Ci0KLQlpZiAobXV0ZXhfaWQgPiBBQ1BJX01BWF9NVVRFWCkgewotCQlyZXR1cm4gKEFFX0JBRF9QQVJBTUVURVIpOwotCX0KLQotCS8qCi0JICogTXV0ZXggbXVzdCBiZSBhY3F1aXJlZCBpbiBvcmRlciB0byByZWxlYXNlIGl0IQotCSAqLwotCWlmIChhY3BpX2dibF9tdXRleF9pbmZvW211dGV4X2lkXS50aHJlYWRfaWQgPT0gQUNQSV9NVVRFWF9OT1RfQUNRVUlSRUQpIHsKLQkJQUNQSV9FUlJPUigoQUVfSU5GTywKLQkJCSAgICAiTXV0ZXggWyVYXSBpcyBub3QgYWNxdWlyZWQsIGNhbm5vdCByZWxlYXNlIiwKLQkJCSAgICBtdXRleF9pZCkpOwotCi0JCXJldHVybiAoQUVfTk9UX0FDUVVJUkVEKTsKLQl9Ci0jaWZkZWYgQUNQSV9NVVRFWF9ERUJVRwotCXsKLQkJdTMyIGk7Ci0JCS8qCi0JCSAqIE11dGV4IGRlYnVnIGNvZGUsIGZvciBpbnRlcm5hbCBkZWJ1Z2dpbmcgb25seS4KLQkJICoKLQkJICogRGVhZGxvY2sgcHJldmVudGlvbi4gIENoZWNrIGlmIHRoaXMgdGhyZWFkIG93bnMgYW55IG11dGV4ZXMgb2YgdmFsdWUKLQkJICogZ3JlYXRlciB0aGFuIHRoaXMgb25lLiAgSWYgc28sIHRoZSB0aHJlYWQgaGFzIHZpb2xhdGVkIHRoZSBtdXRleAotCQkgKiBvcmRlcmluZyBydWxlLiAgVGhpcyBpbmRpY2F0ZXMgYSBjb2RpbmcgZXJyb3Igc29tZXdoZXJlIGluCi0JCSAqIHRoZSBBQ1BJIHN1YnN5c3RlbSBjb2RlLgotCQkgKi8KLQkJZm9yIChpID0gbXV0ZXhfaWQ7IGkgPCBBQ1BJX05VTV9NVVRFWDsgaSsrKSB7Ci0JCQlpZiAoYWNwaV9nYmxfbXV0ZXhfaW5mb1tpXS50aHJlYWRfaWQgPT0gdGhpc190aHJlYWRfaWQpIHsKLQkJCQlpZiAoaSA9PSBtdXRleF9pZCkgewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0KLQkJCQlBQ1BJX0VSUk9SKChBRV9JTkZPLAotCQkJCQkgICAgIkludmFsaWQgcmVsZWFzZSBvcmRlcjogb3ducyBbJXNdLCByZWxlYXNpbmcgWyVzXSIsCi0JCQkJCSAgICBhY3BpX3V0X2dldF9tdXRleF9uYW1lKGkpLAotCQkJCQkgICAgYWNwaV91dF9nZXRfbXV0ZXhfbmFtZShtdXRleF9pZCkpKTsKLQotCQkJCXJldHVybiAoQUVfUkVMRUFTRV9ERUFETE9DSyk7Ci0JCQl9Ci0JCX0KLQl9Ci0jZW5kaWYKLQotCS8qIE1hcmsgdW5sb2NrZWQgRklSU1QgKi8KLQotCWFjcGlfZ2JsX211dGV4X2luZm9bbXV0ZXhfaWRdLnRocmVhZF9pZCA9IEFDUElfTVVURVhfTk9UX0FDUVVJUkVEOwotCi0JYWNwaV9vc19yZWxlYXNlX211dGV4KGFjcGlfZ2JsX211dGV4X2luZm9bbXV0ZXhfaWRdLm11dGV4KTsKLQlyZXR1cm4gKEFFX09LKTsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXRvYmplY3QuYyBiL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXRvYmplY3QuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzM1NGU3YS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0b2JqZWN0LmMKKysrIC9kZXYvbnVsbApAQCAtMSw2NzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIE1vZHVsZSBOYW1lOiB1dG9iamVjdCAtIEFDUEkgb2JqZWN0IGNyZWF0ZS9kZWxldGUvc2l6ZS9jYWNoZSByb3V0aW5lcwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDgsIEludGVsIENvcnAuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCi0gKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSBhdCBtaW5pbXVtIGEgZGlzY2xhaW1lcgotICogICAgc3Vic3RhbnRpYWxseSBzaW1pbGFyIHRvIHRoZSAiTk8gV0FSUkFOVFkiIGRpc2NsYWltZXIgYmVsb3cKLSAqICAgICgiRGlzY2xhaW1lciIpIGFuZCBhbnkgcmVkaXN0cmlidXRpb24gbXVzdCBiZSBjb25kaXRpb25lZCB1cG9uCi0gKiAgICBpbmNsdWRpbmcgYSBzdWJzdGFudGlhbGx5IHNpbWlsYXIgRGlzY2xhaW1lciByZXF1aXJlbWVudCBmb3IgZnVydGhlcgotICogICAgYmluYXJ5IHJlZGlzdHJpYnV0aW9uLgotICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzCi0gKiAgICBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIE5PIFdBUlJBTlRZCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKLSAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCi0gKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORwotICogSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCi0gKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCi0gKi8KLQotI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgotI2luY2x1ZGUgPGFjcGkvYWNuYW1lc3AuaD4KLQotI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfVVRJTElUSUVTCi1BQ1BJX01PRFVMRV9OQU1FKCJ1dG9iamVjdCIpCi0KLS8qIExvY2FsIHByb3RvdHlwZXMgKi8KLXN0YXRpYyBhY3BpX3N0YXR1cwotYWNwaV91dF9nZXRfc2ltcGxlX29iamVjdF9zaXplKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9iaiwKLQkJCSAgICAgICBhY3BpX3NpemUgKiBvYmpfbGVuZ3RoKTsKLQotc3RhdGljIGFjcGlfc3RhdHVzCi1hY3BpX3V0X2dldF9wYWNrYWdlX29iamVjdF9zaXplKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9iaiwKLQkJCQlhY3BpX3NpemUgKiBvYmpfbGVuZ3RoKTsKLQotc3RhdGljIGFjcGlfc3RhdHVzCi1hY3BpX3V0X2dldF9lbGVtZW50X2xlbmd0aCh1OCBvYmplY3RfdHlwZSwKLQkJCSAgIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnNvdXJjZV9vYmplY3QsCi0JCQkgICB1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgKnN0YXRlLCB2b2lkICpjb250ZXh0KTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV91dF9jcmVhdGVfaW50ZXJuYWxfb2JqZWN0X2RiZwotICoKLSAqIFBBUkFNRVRFUlM6ICBtb2R1bGVfbmFtZSAgICAgICAgIC0gU291cmNlIGZpbGUgbmFtZSBvZiBjYWxsZXIKLSAqICAgICAgICAgICAgICBsaW5lX251bWJlciAgICAgICAgIC0gTGluZSBudW1iZXIgb2YgY2FsbGVyCi0gKiAgICAgICAgICAgICAgY29tcG9uZW50X2lkICAgICAgICAtIENvbXBvbmVudCB0eXBlIG9mIGNhbGxlcgotICogICAgICAgICAgICAgIFR5cGUgICAgICAgICAgICAgICAgLSBBQ1BJIFR5cGUgb2YgdGhlIG5ldyBvYmplY3QKLSAqCi0gKiBSRVRVUk46ICAgICAgQSBuZXcgaW50ZXJuYWwgb2JqZWN0LCBudWxsIG9uIGZhaWx1cmUKLSAqCi0gKiBERVNDUklQVElPTjogQ3JlYXRlIGFuZCBpbml0aWFsaXplIGEgbmV3IGludGVybmFsIG9iamVjdC4KLSAqCi0gKiBOT1RFOiAgICAgICAgV2UgYWx3YXlzIGFsbG9jYXRlIHRoZSB3b3JzdC1jYXNlIG9iamVjdCBkZXNjcmlwdG9yIGJlY2F1c2UKLSAqICAgICAgICAgICAgICB0aGVzZSBvYmplY3RzIGFyZSBjYWNoZWQsIGFuZCB3ZSB3YW50IHRoZW0gdG8gYmUKLSAqICAgICAgICAgICAgICBvbmUtc2l6ZS1zYXRpc2lmaWVzLWFueS1yZXF1ZXN0LiAgVGhpcyBpbiBpdHNlbGYgbWF5IG5vdCBiZQotICogICAgICAgICAgICAgIHRoZSBtb3N0IG1lbW9yeSBlZmZpY2llbnQsIGJ1dCB0aGUgZWZmaWNpZW5jeSBvZiB0aGUgb2JqZWN0Ci0gKiAgICAgICAgICAgICAgY2FjaGUgc2hvdWxkIG1vcmUgdGhhbiBtYWtlIHVwIGZvciB0aGlzIQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKmFjcGlfdXRfY3JlYXRlX2ludGVybmFsX29iamVjdF9kYmcoY29uc3QgY2hhcgotCQkJCQkJCSAgICAgICptb2R1bGVfbmFtZSwKLQkJCQkJCQkgICAgICB1MzIgbGluZV9udW1iZXIsCi0JCQkJCQkJICAgICAgdTMyIGNvbXBvbmVudF9pZCwKLQkJCQkJCQkgICAgICBhY3BpX29iamVjdF90eXBlCi0JCQkJCQkJICAgICAgdHlwZSkKLXsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmplY3Q7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqc2Vjb25kX29iamVjdDsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0VfU1RSKHV0X2NyZWF0ZV9pbnRlcm5hbF9vYmplY3RfZGJnLAotCQkJCWFjcGlfdXRfZ2V0X3R5cGVfbmFtZSh0eXBlKSk7Ci0KLQkvKiBBbGxvY2F0ZSB0aGUgcmF3IG9iamVjdCBkZXNjcmlwdG9yICovCi0KLQlvYmplY3QgPQotCSAgICBhY3BpX3V0X2FsbG9jYXRlX29iamVjdF9kZXNjX2RiZyhtb2R1bGVfbmFtZSwgbGluZV9udW1iZXIsCi0JCQkJCSAgICAgY29tcG9uZW50X2lkKTsKLQlpZiAoIW9iamVjdCkgewotCQlyZXR1cm5fUFRSKE5VTEwpOwotCX0KLQotCXN3aXRjaCAodHlwZSkgewotCWNhc2UgQUNQSV9UWVBFX1JFR0lPTjoKLQljYXNlIEFDUElfVFlQRV9CVUZGRVJfRklFTEQ6Ci0JY2FzZSBBQ1BJX1RZUEVfTE9DQUxfQkFOS19GSUVMRDoKLQotCQkvKiBUaGVzZSB0eXBlcyByZXF1aXJlIGEgc2Vjb25kYXJ5IG9iamVjdCAqLwotCi0JCXNlY29uZF9vYmplY3QgPSBhY3BpX3V0X2FsbG9jYXRlX29iamVjdF9kZXNjX2RiZyhtb2R1bGVfbmFtZSwKLQkJCQkJCQkJIGxpbmVfbnVtYmVyLAotCQkJCQkJCQkgY29tcG9uZW50X2lkKTsKLQkJaWYgKCFzZWNvbmRfb2JqZWN0KSB7Ci0JCQlhY3BpX3V0X2RlbGV0ZV9vYmplY3RfZGVzYyhvYmplY3QpOwotCQkJcmV0dXJuX1BUUihOVUxMKTsKLQkJfQotCi0JCXNlY29uZF9vYmplY3QtPmNvbW1vbi50eXBlID0gQUNQSV9UWVBFX0xPQ0FMX0VYVFJBOwotCQlzZWNvbmRfb2JqZWN0LT5jb21tb24ucmVmZXJlbmNlX2NvdW50ID0gMTsKLQotCQkvKiBMaW5rIHRoZSBzZWNvbmQgb2JqZWN0IHRvIHRoZSBmaXJzdCAqLwotCi0JCW9iamVjdC0+Y29tbW9uLm5leHRfb2JqZWN0ID0gc2Vjb25kX29iamVjdDsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQkvKiBBbGwgb3RoZXJzIGhhdmUgbm8gc2Vjb25kYXJ5IG9iamVjdCAqLwotCQlicmVhazsKLQl9Ci0KLQkvKiBTYXZlIHRoZSBvYmplY3QgdHlwZSBpbiB0aGUgb2JqZWN0IGRlc2NyaXB0b3IgKi8KLQotCW9iamVjdC0+Y29tbW9uLnR5cGUgPSAodTgpIHR5cGU7Ci0KLQkvKiBJbml0IHRoZSByZWZlcmVuY2UgY291bnQgKi8KLQotCW9iamVjdC0+Y29tbW9uLnJlZmVyZW5jZV9jb3VudCA9IDE7Ci0KLQkvKiBBbnkgcGVyLXR5cGUgaW5pdGlhbGl6YXRpb24gc2hvdWxkIGdvIGhlcmUgKi8KLQotCXJldHVybl9QVFIob2JqZWN0KTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV91dF9jcmVhdGVfcGFja2FnZV9vYmplY3QKLSAqCi0gKiBQQVJBTUVURVJTOiAgQ291bnQgICAgICAgICAgICAgICAtIE51bWJlciBvZiBwYWNrYWdlIGVsZW1lbnRzCi0gKgotICogUkVUVVJOOiAgICAgIFBvaW50ZXIgdG8gYSBuZXcgUGFja2FnZSBvYmplY3QsIG51bGwgb24gZmFpbHVyZQotICoKLSAqIERFU0NSSVBUSU9OOiBDcmVhdGUgYSBmdWxseSBpbml0aWFsaXplZCBwYWNrYWdlIG9iamVjdAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKmFjcGlfdXRfY3JlYXRlX3BhY2thZ2Vfb2JqZWN0KHUzMiBjb3VudCkKLXsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpwYWNrYWdlX2Rlc2M7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKnBhY2thZ2VfZWxlbWVudHM7Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1UzMih1dF9jcmVhdGVfcGFja2FnZV9vYmplY3QsIGNvdW50KTsKLQotCS8qIENyZWF0ZSBhIG5ldyBQYWNrYWdlIG9iamVjdCAqLwotCi0JcGFja2FnZV9kZXNjID0gYWNwaV91dF9jcmVhdGVfaW50ZXJuYWxfb2JqZWN0KEFDUElfVFlQRV9QQUNLQUdFKTsKLQlpZiAoIXBhY2thZ2VfZGVzYykgewotCQlyZXR1cm5fUFRSKE5VTEwpOwotCX0KLQotCS8qCi0JICogQ3JlYXRlIHRoZSBlbGVtZW50IGFycmF5LiBDb3VudCsxIGFsbG93cyB0aGUgYXJyYXkgdG8gYmUgbnVsbAotCSAqIHRlcm1pbmF0ZWQuCi0JICovCi0JcGFja2FnZV9lbGVtZW50cyA9IEFDUElfQUxMT0NBVEVfWkVST0VEKCgoYWNwaV9zaXplKSBjb3VudCArCi0JCQkJCQkgMSkgKiBzaXplb2Yodm9pZCAqKSk7Ci0JaWYgKCFwYWNrYWdlX2VsZW1lbnRzKSB7Ci0JCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZShwYWNrYWdlX2Rlc2MpOwotCQlyZXR1cm5fUFRSKE5VTEwpOwotCX0KLQotCXBhY2thZ2VfZGVzYy0+cGFja2FnZS5jb3VudCA9IGNvdW50OwotCXBhY2thZ2VfZGVzYy0+cGFja2FnZS5lbGVtZW50cyA9IHBhY2thZ2VfZWxlbWVudHM7Ci0JcmV0dXJuX1BUUihwYWNrYWdlX2Rlc2MpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X2NyZWF0ZV9idWZmZXJfb2JqZWN0Ci0gKgotICogUEFSQU1FVEVSUzogIGJ1ZmZlcl9zaXplICAgICAgICAgICAgLSBTaXplIG9mIGJ1ZmZlciB0byBiZSBjcmVhdGVkCi0gKgotICogUkVUVVJOOiAgICAgIFBvaW50ZXIgdG8gYSBuZXcgQnVmZmVyIG9iamVjdCwgbnVsbCBvbiBmYWlsdXJlCi0gKgotICogREVTQ1JJUFRJT046IENyZWF0ZSBhIGZ1bGx5IGluaXRpYWxpemVkIGJ1ZmZlciBvYmplY3QKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi11bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICphY3BpX3V0X2NyZWF0ZV9idWZmZXJfb2JqZWN0KGFjcGlfc2l6ZSBidWZmZXJfc2l6ZSkKLXsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpidWZmZXJfZGVzYzsKLQl1OCAqYnVmZmVyID0gTlVMTDsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0VfVTMyKHV0X2NyZWF0ZV9idWZmZXJfb2JqZWN0LCBidWZmZXJfc2l6ZSk7Ci0KLQkvKiBDcmVhdGUgYSBuZXcgQnVmZmVyIG9iamVjdCAqLwotCi0JYnVmZmVyX2Rlc2MgPSBhY3BpX3V0X2NyZWF0ZV9pbnRlcm5hbF9vYmplY3QoQUNQSV9UWVBFX0JVRkZFUik7Ci0JaWYgKCFidWZmZXJfZGVzYykgewotCQlyZXR1cm5fUFRSKE5VTEwpOwotCX0KLQotCS8qIENyZWF0ZSBhbiBhY3R1YWwgYnVmZmVyIG9ubHkgaWYgc2l6ZSA+IDAgKi8KLQotCWlmIChidWZmZXJfc2l6ZSA+IDApIHsKLQotCQkvKiBBbGxvY2F0ZSB0aGUgYWN0dWFsIGJ1ZmZlciAqLwotCi0JCWJ1ZmZlciA9IEFDUElfQUxMT0NBVEVfWkVST0VEKGJ1ZmZlcl9zaXplKTsKLQkJaWYgKCFidWZmZXIpIHsKLQkJCUFDUElfRVJST1IoKEFFX0lORk8sICJDb3VsZCBub3QgYWxsb2NhdGUgc2l6ZSAlWCIsCi0JCQkJICAgICh1MzIpIGJ1ZmZlcl9zaXplKSk7Ci0JCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UoYnVmZmVyX2Rlc2MpOwotCQkJcmV0dXJuX1BUUihOVUxMKTsKLQkJfQotCX0KLQotCS8qIENvbXBsZXRlIGJ1ZmZlciBvYmplY3QgaW5pdGlhbGl6YXRpb24gKi8KLQotCWJ1ZmZlcl9kZXNjLT5idWZmZXIuZmxhZ3MgfD0gQU9QT0JKX0RBVEFfVkFMSUQ7Ci0JYnVmZmVyX2Rlc2MtPmJ1ZmZlci5wb2ludGVyID0gYnVmZmVyOwotCWJ1ZmZlcl9kZXNjLT5idWZmZXIubGVuZ3RoID0gKHUzMikgYnVmZmVyX3NpemU7Ci0KLQkvKiBSZXR1cm4gdGhlIG5ldyBidWZmZXIgZGVzY3JpcHRvciAqLwotCi0JcmV0dXJuX1BUUihidWZmZXJfZGVzYyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfdXRfY3JlYXRlX3N0cmluZ19vYmplY3QKLSAqCi0gKiBQQVJBTUVURVJTOiAgc3RyaW5nX3NpemUgICAgICAgICAtIFNpemUgb2Ygc3RyaW5nIHRvIGJlIGNyZWF0ZWQuIERvZXMgbm90Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGUgTlVMTCB0ZXJtaW5hdG9yLCB0aGlzIGlzIGFkZGVkCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9tYXRpY2FsbHkuCi0gKgotICogUkVUVVJOOiAgICAgIFBvaW50ZXIgdG8gYSBuZXcgU3RyaW5nIG9iamVjdAotICoKLSAqIERFU0NSSVBUSU9OOiBDcmVhdGUgYSBmdWxseSBpbml0aWFsaXplZCBzdHJpbmcgb2JqZWN0Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqYWNwaV91dF9jcmVhdGVfc3RyaW5nX29iamVjdChhY3BpX3NpemUgc3RyaW5nX3NpemUpCi17Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqc3RyaW5nX2Rlc2M7Ci0JY2hhciAqc3RyaW5nOwotCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9VMzIodXRfY3JlYXRlX3N0cmluZ19vYmplY3QsIHN0cmluZ19zaXplKTsKLQotCS8qIENyZWF0ZSBhIG5ldyBTdHJpbmcgb2JqZWN0ICovCi0KLQlzdHJpbmdfZGVzYyA9IGFjcGlfdXRfY3JlYXRlX2ludGVybmFsX29iamVjdChBQ1BJX1RZUEVfU1RSSU5HKTsKLQlpZiAoIXN0cmluZ19kZXNjKSB7Ci0JCXJldHVybl9QVFIoTlVMTCk7Ci0JfQotCi0JLyoKLQkgKiBBbGxvY2F0ZSB0aGUgYWN0dWFsIHN0cmluZyBidWZmZXIgLS0gKFNpemUgKyAxKSBmb3IgTlVMTCB0ZXJtaW5hdG9yLgotCSAqIE5PVEU6IFplcm8tbGVuZ3RoIHN0cmluZ3MgYXJlIE5VTEwgdGVybWluYXRlZAotCSAqLwotCXN0cmluZyA9IEFDUElfQUxMT0NBVEVfWkVST0VEKHN0cmluZ19zaXplICsgMSk7Ci0JaWYgKCFzdHJpbmcpIHsKLQkJQUNQSV9FUlJPUigoQUVfSU5GTywgIkNvdWxkIG5vdCBhbGxvY2F0ZSBzaXplICVYIiwKLQkJCSAgICAodTMyKSBzdHJpbmdfc2l6ZSkpOwotCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2Uoc3RyaW5nX2Rlc2MpOwotCQlyZXR1cm5fUFRSKE5VTEwpOwotCX0KLQotCS8qIENvbXBsZXRlIHN0cmluZyBvYmplY3QgaW5pdGlhbGl6YXRpb24gKi8KLQotCXN0cmluZ19kZXNjLT5zdHJpbmcucG9pbnRlciA9IHN0cmluZzsKLQlzdHJpbmdfZGVzYy0+c3RyaW5nLmxlbmd0aCA9ICh1MzIpIHN0cmluZ19zaXplOwotCi0JLyogUmV0dXJuIHRoZSBuZXcgc3RyaW5nIGRlc2NyaXB0b3IgKi8KLQotCXJldHVybl9QVFIoc3RyaW5nX2Rlc2MpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X3ZhbGlkX2ludGVybmFsX29iamVjdAotICoKLSAqIFBBUkFNRVRFUlM6ICBPYmplY3QgICAgICAgICAgICAgIC0gT2JqZWN0IHRvIGJlIHZhbGlkYXRlZAotICoKLSAqIFJFVFVSTjogICAgICBUUlVFIGlmIG9iamVjdCBpcyB2YWxpZCwgRkFMU0Ugb3RoZXJ3aXNlCi0gKgotICogREVTQ1JJUFRJT046IFZhbGlkYXRlIGEgcG9pbnRlciB0byBiZSBhbiB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdTggYWNwaV91dF92YWxpZF9pbnRlcm5hbF9vYmplY3Qodm9pZCAqb2JqZWN0KQotewotCi0JQUNQSV9GVU5DVElPTl9OQU1FKHV0X3ZhbGlkX2ludGVybmFsX29iamVjdCk7Ci0KLQkvKiBDaGVjayBmb3IgYSBudWxsIHBvaW50ZXIgKi8KLQotCWlmICghb2JqZWN0KSB7Ci0JCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgIioqKiogTnVsbCBPYmplY3QgUHRyXG4iKSk7Ci0JCXJldHVybiAoRkFMU0UpOwotCX0KLQotCS8qIENoZWNrIHRoZSBkZXNjcmlwdG9yIHR5cGUgZmllbGQgKi8KLQotCXN3aXRjaCAoQUNQSV9HRVRfREVTQ1JJUFRPUl9UWVBFKG9iamVjdCkpIHsKLQljYXNlIEFDUElfREVTQ19UWVBFX09QRVJBTkQ6Ci0KLQkJLyogVGhlIG9iamVjdCBhcHBlYXJzIHRvIGJlIGEgdmFsaWQgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAqLwotCi0JCXJldHVybiAoVFJVRSk7Ci0KLQlkZWZhdWx0OgotCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sCi0JCQkJICAiJXAgaXMgbm90IG5vdCBhbiBBQ1BJIG9wZXJhbmQgb2JqIFslc11cbiIsCi0JCQkJICBvYmplY3QsIGFjcGlfdXRfZ2V0X2Rlc2NyaXB0b3JfbmFtZShvYmplY3QpKSk7Ci0JCWJyZWFrOwotCX0KLQotCXJldHVybiAoRkFMU0UpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X2FsbG9jYXRlX29iamVjdF9kZXNjX2RiZwotICoKLSAqIFBBUkFNRVRFUlM6ICBtb2R1bGVfbmFtZSAgICAgICAgIC0gQ2FsbGVyJ3MgbW9kdWxlIG5hbWUgKGZvciBlcnJvciBvdXRwdXQpCi0gKiAgICAgICAgICAgICAgbGluZV9udW1iZXIgICAgICAgICAtIENhbGxlcidzIGxpbmUgbnVtYmVyIChmb3IgZXJyb3Igb3V0cHV0KQotICogICAgICAgICAgICAgIGNvbXBvbmVudF9pZCAgICAgICAgLSBDYWxsZXIncyBjb21wb25lbnQgSUQgKGZvciBlcnJvciBvdXRwdXQpCi0gKgotICogUkVUVVJOOiAgICAgIFBvaW50ZXIgdG8gbmV3bHkgYWxsb2NhdGVkIG9iamVjdCBkZXNjcmlwdG9yLiAgTnVsbCBvbiBlcnJvcgotICoKLSAqIERFU0NSSVBUSU9OOiBBbGxvY2F0ZSBhIG5ldyBvYmplY3QgZGVzY3JpcHRvci4gIEdyYWNlZnVsbHkgaGFuZGxlCi0gKiAgICAgICAgICAgICAgZXJyb3IgY29uZGl0aW9ucy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi12b2lkICphY3BpX3V0X2FsbG9jYXRlX29iamVjdF9kZXNjX2RiZyhjb25zdCBjaGFyICptb2R1bGVfbmFtZSwKLQkJCQkgICAgICAgdTMyIGxpbmVfbnVtYmVyLCB1MzIgY29tcG9uZW50X2lkKQotewotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9iamVjdDsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UodXRfYWxsb2NhdGVfb2JqZWN0X2Rlc2NfZGJnKTsKLQotCW9iamVjdCA9IGFjcGlfb3NfYWNxdWlyZV9vYmplY3QoYWNwaV9nYmxfb3BlcmFuZF9jYWNoZSk7Ci0JaWYgKCFvYmplY3QpIHsKLQkJQUNQSV9FUlJPUigobW9kdWxlX25hbWUsIGxpbmVfbnVtYmVyLAotCQkJICAgICJDb3VsZCBub3QgYWxsb2NhdGUgYW4gb2JqZWN0IGRlc2NyaXB0b3IiKSk7Ci0KLQkJcmV0dXJuX1BUUihOVUxMKTsKLQl9Ci0KLQkvKiBNYXJrIHRoZSBkZXNjcmlwdG9yIHR5cGUgKi8KLQotCW1lbXNldChvYmplY3QsIDAsIHNpemVvZih1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0KSk7Ci0JQUNQSV9TRVRfREVTQ1JJUFRPUl9UWVBFKG9iamVjdCwgQUNQSV9ERVNDX1RZUEVfT1BFUkFORCk7Ci0KLQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0FMTE9DQVRJT05TLCAiJXAgU2l6ZSAlWFxuIiwKLQkJCSAgb2JqZWN0LCAodTMyKSBzaXplb2YodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCkpKTsKLQotCXJldHVybl9QVFIob2JqZWN0KTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV91dF9kZWxldGVfb2JqZWN0X2Rlc2MKLSAqCi0gKiBQQVJBTUVURVJTOiAgT2JqZWN0ICAgICAgICAgIC0gQW4gQWNwaSBpbnRlcm5hbCBvYmplY3QgdG8gYmUgZGVsZXRlZAotICoKLSAqIFJFVFVSTjogICAgICBOb25lLgotICoKLSAqIERFU0NSSVBUSU9OOiBGcmVlIGFuIEFDUEkgb2JqZWN0IGRlc2NyaXB0b3Igb3IgYWRkIGl0IHRvIHRoZSBvYmplY3QgY2FjaGUKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi12b2lkIGFjcGlfdXRfZGVsZXRlX29iamVjdF9kZXNjKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9iamVjdCkKLXsKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUih1dF9kZWxldGVfb2JqZWN0X2Rlc2MsIG9iamVjdCk7Ci0KLQkvKiBPYmplY3QgbXVzdCBiZSBhbiB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICovCi0KLQlpZiAoQUNQSV9HRVRfREVTQ1JJUFRPUl9UWVBFKG9iamVjdCkgIT0gQUNQSV9ERVNDX1RZUEVfT1BFUkFORCkgewotCQlBQ1BJX0VSUk9SKChBRV9JTkZPLAotCQkJICAgICIlcCBpcyBub3QgYW4gQUNQSSBPcGVyYW5kIG9iamVjdCBbJXNdIiwgb2JqZWN0LAotCQkJICAgIGFjcGlfdXRfZ2V0X2Rlc2NyaXB0b3JfbmFtZShvYmplY3QpKSk7Ci0JCXJldHVybl9WT0lEOwotCX0KLQotCSh2b2lkKWFjcGlfb3NfcmVsZWFzZV9vYmplY3QoYWNwaV9nYmxfb3BlcmFuZF9jYWNoZSwgb2JqZWN0KTsKLQlyZXR1cm5fVk9JRDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV91dF9nZXRfc2ltcGxlX29iamVjdF9zaXplCi0gKgotICogUEFSQU1FVEVSUzogIGludGVybmFsX29iamVjdCAgICAtIEFuIEFDUEkgb3BlcmFuZCBvYmplY3QKLSAqICAgICAgICAgICAgICBvYmpfbGVuZ3RoICAgICAgICAgLSBXaGVyZSB0aGUgbGVuZ3RoIGlzIHJldHVybmVkCi0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cwotICoKLSAqIERFU0NSSVBUSU9OOiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBkZXRlcm1pbmUgdGhlIHNwYWNlIHJlcXVpcmVkIHRvCi0gKiAgICAgICAgICAgICAgY29udGFpbiBhIHNpbXBsZSBvYmplY3QgZm9yIHJldHVybiB0byBhbiBleHRlcm5hbCB1c2VyLgotICoKLSAqICAgICAgICAgICAgICBUaGUgbGVuZ3RoIGluY2x1ZGVzIHRoZSBvYmplY3Qgc3RydWN0dXJlIHBsdXMgYW55IGFkZGl0aW9uYWwKLSAqICAgICAgICAgICAgICBuZWVkZWQgc3BhY2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIGFjcGlfc3RhdHVzCi1hY3BpX3V0X2dldF9zaW1wbGVfb2JqZWN0X3NpemUodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqaW50ZXJuYWxfb2JqZWN0LAotCQkJICAgICAgIGFjcGlfc2l6ZSAqIG9ial9sZW5ndGgpCi17Ci0JYWNwaV9zaXplIGxlbmd0aDsKLQlhY3BpX3NpemUgc2l6ZTsKLQlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKHV0X2dldF9zaW1wbGVfb2JqZWN0X3NpemUsIGludGVybmFsX29iamVjdCk7Ci0KLQkvKgotCSAqIEhhbmRsZSBhIG51bGwgb2JqZWN0IChDb3VsZCBiZSBhIHVuaW5pdGlhbGl6ZWQgcGFja2FnZQotCSAqIGVsZW1lbnQgLS0gd2hpY2ggaXMgbGVnYWwpCi0JICovCi0JaWYgKCFpbnRlcm5hbF9vYmplY3QpIHsKLQkJKm9ial9sZW5ndGggPSBzaXplb2YodW5pb24gYWNwaV9vYmplY3QpOwotCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwotCX0KLQotCS8qIFN0YXJ0IHdpdGggdGhlIGxlbmd0aCBvZiB0aGUgQWNwaSBvYmplY3QgKi8KLQotCWxlbmd0aCA9IHNpemVvZih1bmlvbiBhY3BpX29iamVjdCk7Ci0KLQlpZiAoQUNQSV9HRVRfREVTQ1JJUFRPUl9UWVBFKGludGVybmFsX29iamVjdCkgPT0gQUNQSV9ERVNDX1RZUEVfTkFNRUQpIHsKLQotCQkvKiBPYmplY3QgaXMgYSBuYW1lZCBvYmplY3QgKHJlZmVyZW5jZSksIGp1c3QgcmV0dXJuIHRoZSBsZW5ndGggKi8KLQotCQkqb2JqX2xlbmd0aCA9IEFDUElfUk9VTkRfVVBfVE9fTkFUSVZFX1dPUkQobGVuZ3RoKTsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci0JfQotCi0JLyoKLQkgKiBUaGUgZmluYWwgbGVuZ3RoIGRlcGVuZHMgb24gdGhlIG9iamVjdCB0eXBlCi0JICogU3RyaW5ncyBhbmQgQnVmZmVycyBhcmUgcGFja2VkIHJpZ2h0IHVwIGFnYWluc3QgdGhlIHBhcmVudCBvYmplY3QgYW5kCi0JICogbXVzdCBiZSBhY2Nlc3NlZCBieXRld2lzZSBvciB0aGVyZSBtYXkgYmUgYWxpZ25tZW50IHByb2JsZW1zIG9uCi0JICogY2VydGFpbiBwcm9jZXNzb3JzCi0JICovCi0Jc3dpdGNoIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRShpbnRlcm5hbF9vYmplY3QpKSB7Ci0JY2FzZSBBQ1BJX1RZUEVfU1RSSU5HOgotCi0JCWxlbmd0aCArPSAoYWNwaV9zaXplKSBpbnRlcm5hbF9vYmplY3QtPnN0cmluZy5sZW5ndGggKyAxOwotCQlicmVhazsKLQotCWNhc2UgQUNQSV9UWVBFX0JVRkZFUjoKLQotCQlsZW5ndGggKz0gKGFjcGlfc2l6ZSkgaW50ZXJuYWxfb2JqZWN0LT5idWZmZXIubGVuZ3RoOwotCQlicmVhazsKLQotCWNhc2UgQUNQSV9UWVBFX0lOVEVHRVI6Ci0JY2FzZSBBQ1BJX1RZUEVfUFJPQ0VTU09SOgotCWNhc2UgQUNQSV9UWVBFX1BPV0VSOgotCi0JCS8qIE5vIGV4dHJhIGRhdGEgZm9yIHRoZXNlIHR5cGVzICovCi0KLQkJYnJlYWs7Ci0KLQljYXNlIEFDUElfVFlQRV9MT0NBTF9SRUZFUkVOQ0U6Ci0KLQkJc3dpdGNoIChpbnRlcm5hbF9vYmplY3QtPnJlZmVyZW5jZS5jbGFzcykgewotCQljYXNlIEFDUElfUkVGQ0xBU1NfTkFNRToKLQotCQkJLyoKLQkJCSAqIEdldCB0aGUgYWN0dWFsIGxlbmd0aCBvZiB0aGUgZnVsbCBwYXRobmFtZSB0byB0aGlzIG9iamVjdC4KLQkJCSAqIFRoZSByZWZlcmVuY2Ugd2lsbCBiZSBjb252ZXJ0ZWQgdG8gdGhlIHBhdGhuYW1lIHRvIHRoZSBvYmplY3QKLQkJCSAqLwotCQkJc2l6ZSA9Ci0JCQkgICAgYWNwaV9uc19nZXRfcGF0aG5hbWVfbGVuZ3RoKGludGVybmFsX29iamVjdC0+Ci0JCQkJCQkJcmVmZXJlbmNlLm5vZGUpOwotCQkJaWYgKCFzaXplKSB7Ci0JCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9QQVJBTUVURVIpOwotCQkJfQotCi0JCQlsZW5ndGggKz0gQUNQSV9ST1VORF9VUF9UT19OQVRJVkVfV09SRChzaXplKTsKLQkJCWJyZWFrOwotCi0JCWRlZmF1bHQ6Ci0KLQkJCS8qCi0JCQkgKiBObyBvdGhlciByZWZlcmVuY2Ugb3Bjb2RlcyBhcmUgc3VwcG9ydGVkLgotCQkJICogTm90YWJseSwgTG9jYWxzIGFuZCBBcmdzIGFyZSBub3Qgc3VwcG9ydGVkLCBidXQgdGhpcyBtYXkgYmUKLQkJCSAqIHJlcXVpcmVkIGV2ZW50dWFsbHkuCi0JCQkgKi8KLQkJCUFDUElfRVJST1IoKEFFX0lORk8sCi0JCQkJICAgICJDYW5ub3QgY29udmVydCB0byBleHRlcm5hbCBvYmplY3QgLSAiCi0JCQkJICAgICJ1bnN1cHBvcnRlZCBSZWZlcmVuY2UgQ2xhc3MgWyVzXSAlWCBpbiBvYmplY3QgJXAiLAotCQkJCSAgICBhY3BpX3V0X2dldF9yZWZlcmVuY2VfbmFtZShpbnRlcm5hbF9vYmplY3QpLAotCQkJCSAgICBpbnRlcm5hbF9vYmplY3QtPnJlZmVyZW5jZS5jbGFzcywKLQkJCQkgICAgaW50ZXJuYWxfb2JqZWN0KSk7Ci0JCQlzdGF0dXMgPSBBRV9UWVBFOwotCQkJYnJlYWs7Ci0JCX0KLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCi0JCUFDUElfRVJST1IoKEFFX0lORk8sICJDYW5ub3QgY29udmVydCB0byBleHRlcm5hbCBvYmplY3QgLSAiCi0JCQkgICAgInVuc3VwcG9ydGVkIHR5cGUgWyVzXSAlWCBpbiBvYmplY3QgJXAiLAotCQkJICAgIGFjcGlfdXRfZ2V0X29iamVjdF90eXBlX25hbWUoaW50ZXJuYWxfb2JqZWN0KSwKLQkJCSAgICBBQ1BJX0dFVF9PQkpFQ1RfVFlQRShpbnRlcm5hbF9vYmplY3QpLAotCQkJICAgIGludGVybmFsX29iamVjdCkpOwotCQlzdGF0dXMgPSBBRV9UWVBFOwotCQlicmVhazsKLQl9Ci0KLQkvKgotCSAqIEFjY291bnQgZm9yIHRoZSBzcGFjZSByZXF1aXJlZCBieSB0aGUgb2JqZWN0IHJvdW5kZWQgdXAgdG8gdGhlIG5leHQKLQkgKiBtdWx0aXBsZSBvZiB0aGUgbWFjaGluZSB3b3JkIHNpemUuICBUaGlzIGtlZXBzIGVhY2ggb2JqZWN0IGFsaWduZWQKLQkgKiBvbiBhIG1hY2hpbmUgd29yZCBib3VuZGFyeS4gKHByZXZlbnRpbmcgYWxpZ25tZW50IGZhdWx0cyBvbiBzb21lCi0JICogbWFjaGluZXMuKQotCSAqLwotCSpvYmpfbGVuZ3RoID0gQUNQSV9ST1VORF9VUF9UT19OQVRJVkVfV09SRChsZW5ndGgpOwotCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X2dldF9lbGVtZW50X2xlbmd0aAotICoKLSAqIFBBUkFNRVRFUlM6ICBhY3BpX3BrZ19jYWxsYmFjawotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKLSAqCi0gKiBERVNDUklQVElPTjogR2V0IHRoZSBsZW5ndGggb2Ygb25lIHBhY2thZ2UgZWxlbWVudC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgYWNwaV9zdGF0dXMKLWFjcGlfdXRfZ2V0X2VsZW1lbnRfbGVuZ3RoKHU4IG9iamVjdF90eXBlLAotCQkJICAgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqc291cmNlX29iamVjdCwKLQkJCSAgIHVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSAqc3RhdGUsIHZvaWQgKmNvbnRleHQpCi17Ci0JYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7Ci0Jc3RydWN0IGFjcGlfcGtnX2luZm8gKmluZm8gPSAoc3RydWN0IGFjcGlfcGtnX2luZm8gKiljb250ZXh0OwotCWFjcGlfc2l6ZSBvYmplY3Rfc3BhY2U7Ci0KLQlzd2l0Y2ggKG9iamVjdF90eXBlKSB7Ci0JY2FzZSBBQ1BJX0NPUFlfVFlQRV9TSU1QTEU6Ci0KLQkJLyoKLQkJICogU2ltcGxlIG9iamVjdCAtIGp1c3QgZ2V0IHRoZSBzaXplIChOdWxsIG9iamVjdC9lbnRyeSBpcyBoYW5kbGVkCi0JCSAqIGhlcmUgYWxzbykgYW5kIHN1bSBpdCBpbnRvIHRoZSBydW5uaW5nIHBhY2thZ2UgbGVuZ3RoCi0JCSAqLwotCQlzdGF0dXMgPQotCQkgICAgYWNwaV91dF9nZXRfc2ltcGxlX29iamVjdF9zaXplKHNvdXJjZV9vYmplY3QsCi0JCQkJCQkgICAmb2JqZWN0X3NwYWNlKTsKLQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCQlyZXR1cm4gKHN0YXR1cyk7Ci0JCX0KLQotCQlpbmZvLT5sZW5ndGggKz0gb2JqZWN0X3NwYWNlOwotCQlicmVhazsKLQotCWNhc2UgQUNQSV9DT1BZX1RZUEVfUEFDS0FHRToKLQotCQkvKiBQYWNrYWdlIG9iamVjdCAtIG5vdGhpbmcgbXVjaCB0byBkbyBoZXJlLCBsZXQgdGhlIHdhbGsgaGFuZGxlIGl0ICovCi0KLQkJaW5mby0+bnVtX3BhY2thZ2VzKys7Ci0JCXN0YXRlLT5wa2cudGhpc190YXJnZXRfb2JqID0gTlVMTDsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCi0JCS8qIE5vIG90aGVyIHR5cGVzIGFsbG93ZWQgKi8KLQotCQlyZXR1cm4gKEFFX0JBRF9QQVJBTUVURVIpOwotCX0KLQotCXJldHVybiAoc3RhdHVzKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV91dF9nZXRfcGFja2FnZV9vYmplY3Rfc2l6ZQotICoKLSAqIFBBUkFNRVRFUlM6ICBpbnRlcm5hbF9vYmplY3QgICAgIC0gQW4gQUNQSSBpbnRlcm5hbCBvYmplY3QKLSAqICAgICAgICAgICAgICBvYmpfbGVuZ3RoICAgICAgICAgIC0gV2hlcmUgdGhlIGxlbmd0aCBpcyByZXR1cm5lZAotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKLSAqCi0gKiBERVNDUklQVElPTjogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gZGV0ZXJtaW5lIHRoZSBzcGFjZSByZXF1aXJlZCB0bwotICogICAgICAgICAgICAgIGNvbnRhaW4gYSBwYWNrYWdlIG9iamVjdCBmb3IgcmV0dXJuIHRvIGFuIGV4dGVybmFsIHVzZXIuCi0gKgotICogICAgICAgICAgICAgIFRoaXMgaXMgbW9kZXJhdGVseSBjb21wbGV4IHNpbmNlIGEgcGFja2FnZSBjb250YWlucyBvdGhlcgotICogICAgICAgICAgICAgIG9iamVjdHMgaW5jbHVkaW5nIHBhY2thZ2VzLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyBhY3BpX3N0YXR1cwotYWNwaV91dF9nZXRfcGFja2FnZV9vYmplY3Rfc2l6ZSh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICppbnRlcm5hbF9vYmplY3QsCi0JCQkJYWNwaV9zaXplICogb2JqX2xlbmd0aCkKLXsKLQlhY3BpX3N0YXR1cyBzdGF0dXM7Ci0Jc3RydWN0IGFjcGlfcGtnX2luZm8gaW5mbzsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKHV0X2dldF9wYWNrYWdlX29iamVjdF9zaXplLCBpbnRlcm5hbF9vYmplY3QpOwotCi0JaW5mby5sZW5ndGggPSAwOwotCWluZm8ub2JqZWN0X3NwYWNlID0gMDsKLQlpbmZvLm51bV9wYWNrYWdlcyA9IDE7Ci0KLQlzdGF0dXMgPSBhY3BpX3V0X3dhbGtfcGFja2FnZV90cmVlKGludGVybmFsX29iamVjdCwgTlVMTCwKLQkJCQkJICAgYWNwaV91dF9nZXRfZWxlbWVudF9sZW5ndGgsICZpbmZvKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci0JfQotCi0JLyoKLQkgKiBXZSBoYXZlIGhhbmRsZWQgYWxsIG9mIHRoZSBvYmplY3RzIGluIGFsbCBsZXZlbHMgb2YgdGhlIHBhY2thZ2UuCi0JICoganVzdCBhZGQgdGhlIGxlbmd0aCBvZiB0aGUgcGFja2FnZSBvYmplY3RzIHRoZW1zZWx2ZXMuCi0JICogUm91bmQgdXAgdG8gdGhlIG5leHQgbWFjaGluZSB3b3JkLgotCSAqLwotCWluZm8ubGVuZ3RoICs9IEFDUElfUk9VTkRfVVBfVE9fTkFUSVZFX1dPUkQoc2l6ZW9mKHVuaW9uIGFjcGlfb2JqZWN0KSkgKgotCSAgICAoYWNwaV9zaXplKSBpbmZvLm51bV9wYWNrYWdlczsKLQotCS8qIFJldHVybiB0aGUgdG90YWwgcGFja2FnZSBsZW5ndGggKi8KLQotCSpvYmpfbGVuZ3RoID0gaW5mby5sZW5ndGg7Ci0JcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfdXRfZ2V0X29iamVjdF9zaXplCi0gKgotICogUEFSQU1FVEVSUzogIGludGVybmFsX29iamVjdCAgICAgLSBBbiBBQ1BJIGludGVybmFsIG9iamVjdAotICogICAgICAgICAgICAgIG9ial9sZW5ndGggICAgICAgICAgLSBXaGVyZSB0aGUgbGVuZ3RoIHdpbGwgYmUgcmV0dXJuZWQKLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGRldGVybWluZSB0aGUgc3BhY2UgcmVxdWlyZWQgdG8KLSAqICAgICAgICAgICAgICBjb250YWluIGFuIG9iamVjdCBmb3IgcmV0dXJuIHRvIGFuIEFQSSB1c2VyLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWFjcGlfc3RhdHVzCi1hY3BpX3V0X2dldF9vYmplY3Rfc2l6ZSh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICppbnRlcm5hbF9vYmplY3QsCi0JCQlhY3BpX3NpemUgKiBvYmpfbGVuZ3RoKQotewotCWFjcGlfc3RhdHVzIHN0YXR1czsKLQotCUFDUElfRlVOQ1RJT05fRU5UUlkoKTsKLQotCWlmICgoQUNQSV9HRVRfREVTQ1JJUFRPUl9UWVBFKGludGVybmFsX29iamVjdCkgPT0KLQkgICAgIEFDUElfREVTQ19UWVBFX09QRVJBTkQpCi0JICAgICYmIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRShpbnRlcm5hbF9vYmplY3QpID09IEFDUElfVFlQRV9QQUNLQUdFKSkgewotCQlzdGF0dXMgPQotCQkgICAgYWNwaV91dF9nZXRfcGFja2FnZV9vYmplY3Rfc2l6ZShpbnRlcm5hbF9vYmplY3QsCi0JCQkJCQkgICAgb2JqX2xlbmd0aCk7Ci0JfSBlbHNlIHsKLQkJc3RhdHVzID0KLQkJICAgIGFjcGlfdXRfZ2V0X3NpbXBsZV9vYmplY3Rfc2l6ZShpbnRlcm5hbF9vYmplY3QsIG9ial9sZW5ndGgpOwotCX0KLQotCXJldHVybiAoc3RhdHVzKTsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXRyZXNyYy5jIGIvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dHJlc3JjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzZTNlMTMuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dHJlc3JjLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2MTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBNb2R1bGUgTmFtZTogdXRyZXNyYyAtIFJlc291cmNlIG1hbmFnZW1lbnQgdXRpbGl0aWVzCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDgsIEludGVsIENvcnAuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCi0gKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSBhdCBtaW5pbXVtIGEgZGlzY2xhaW1lcgotICogICAgc3Vic3RhbnRpYWxseSBzaW1pbGFyIHRvIHRoZSAiTk8gV0FSUkFOVFkiIGRpc2NsYWltZXIgYmVsb3cKLSAqICAgICgiRGlzY2xhaW1lciIpIGFuZCBhbnkgcmVkaXN0cmlidXRpb24gbXVzdCBiZSBjb25kaXRpb25lZCB1cG9uCi0gKiAgICBpbmNsdWRpbmcgYSBzdWJzdGFudGlhbGx5IHNpbWlsYXIgRGlzY2xhaW1lciByZXF1aXJlbWVudCBmb3IgZnVydGhlcgotICogICAgYmluYXJ5IHJlZGlzdHJpYnV0aW9uLgotICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzCi0gKiAgICBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIE5PIFdBUlJBTlRZCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKLSAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCi0gKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORwotICogSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCi0gKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCi0gKi8KLQotI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgotI2luY2x1ZGUgPGFjcGkvYW1scmVzcmMuaD4KLQotI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfVVRJTElUSUVTCi1BQ1BJX01PRFVMRV9OQU1FKCJ1dHJlc3JjIikKLSNpZiBkZWZpbmVkKEFDUElfRElTQVNTRU1CTEVSKSB8fCBkZWZpbmVkIChBQ1BJX0RFQlVHR0VSKQotLyoKLSAqIFN0cmluZ3MgdXNlZCB0byBkZWNvZGUgcmVzb3VyY2UgZGVzY3JpcHRvcnMuCi0gKiBVc2VkIGJ5IGJvdGggdGhlIGRpc2Fzc3NlbWJsZXIgYW5kIHRoZSBkZWJ1Z2dlciByZXNvdXJjZSBkdW1wIHJvdXRpbmVzCi0gKi8KLWNvbnN0IGNoYXIgKmFjcGlfZ2JsX2JtX2RlY29kZVtdID0gewotCSJOb3RCdXNNYXN0ZXIiLAotCSJCdXNNYXN0ZXIiCi19OwotCi1jb25zdCBjaGFyICphY3BpX2dibF9jb25maWdfZGVjb2RlW10gPSB7Ci0JIjAgLSBHb29kIENvbmZpZ3VyYXRpb24iLAotCSIxIC0gQWNjZXB0YWJsZSBDb25maWd1cmF0aW9uIiwKLQkiMiAtIFN1Ym9wdGltYWwgQ29uZmlndXJhdGlvbiIsCi0JIjMgLSAqKipJbnZhbGlkIENvbmZpZ3VyYXRpb24qKioiLAotfTsKLQotY29uc3QgY2hhciAqYWNwaV9nYmxfY29uc3VtZV9kZWNvZGVbXSA9IHsKLQkiUmVzb3VyY2VQcm9kdWNlciIsCi0JIlJlc291cmNlQ29uc3VtZXIiCi19OwotCi1jb25zdCBjaGFyICphY3BpX2dibF9kZWNfZGVjb2RlW10gPSB7Ci0JIlBvc0RlY29kZSIsCi0JIlN1YkRlY29kZSIKLX07Ci0KLWNvbnN0IGNoYXIgKmFjcGlfZ2JsX2hlX2RlY29kZVtdID0gewotCSJMZXZlbCIsCi0JIkVkZ2UiCi19OwotCi1jb25zdCBjaGFyICphY3BpX2dibF9pb19kZWNvZGVbXSA9IHsKLQkiRGVjb2RlMTAiLAotCSJEZWNvZGUxNiIKLX07Ci0KLWNvbnN0IGNoYXIgKmFjcGlfZ2JsX2xsX2RlY29kZVtdID0gewotCSJBY3RpdmVIaWdoIiwKLQkiQWN0aXZlTG93IgotfTsKLQotY29uc3QgY2hhciAqYWNwaV9nYmxfbWF4X2RlY29kZVtdID0gewotCSJNYXhOb3RGaXhlZCIsCi0JIk1heEZpeGVkIgotfTsKLQotY29uc3QgY2hhciAqYWNwaV9nYmxfbWVtX2RlY29kZVtdID0gewotCSJOb25DYWNoZWFibGUiLAotCSJDYWNoZWFibGUiLAotCSJXcml0ZUNvbWJpbmluZyIsCi0JIlByZWZldGNoYWJsZSIKLX07Ci0KLWNvbnN0IGNoYXIgKmFjcGlfZ2JsX21pbl9kZWNvZGVbXSA9IHsKLQkiTWluTm90Rml4ZWQiLAotCSJNaW5GaXhlZCIKLX07Ci0KLWNvbnN0IGNoYXIgKmFjcGlfZ2JsX210cF9kZWNvZGVbXSA9IHsKLQkiQWRkcmVzc1JhbmdlTWVtb3J5IiwKLQkiQWRkcmVzc1JhbmdlUmVzZXJ2ZWQiLAotCSJBZGRyZXNzUmFuZ2VBQ1BJIiwKLQkiQWRkcmVzc1JhbmdlTlZTIgotfTsKLQotY29uc3QgY2hhciAqYWNwaV9nYmxfcm5nX2RlY29kZVtdID0gewotCSJJbnZhbGlkUmFuZ2VzIiwKLQkiTm9uSVNBT25seVJhbmdlcyIsCi0JIklTQU9ubHlSYW5nZXMiLAotCSJFbnRpcmVSYW5nZSIKLX07Ci0KLWNvbnN0IGNoYXIgKmFjcGlfZ2JsX3J3X2RlY29kZVtdID0gewotCSJSZWFkT25seSIsCi0JIlJlYWRXcml0ZSIKLX07Ci0KLWNvbnN0IGNoYXIgKmFjcGlfZ2JsX3Nocl9kZWNvZGVbXSA9IHsKLQkiRXhjbHVzaXZlIiwKLQkiU2hhcmVkIgotfTsKLQotY29uc3QgY2hhciAqYWNwaV9nYmxfc2l6X2RlY29kZVtdID0gewotCSJUcmFuc2ZlcjgiLAotCSJUcmFuc2ZlcjhfMTYiLAotCSJUcmFuc2ZlcjE2IiwKLQkiSW52YWxpZFNpemUiCi19OwotCi1jb25zdCBjaGFyICphY3BpX2dibF90cnNfZGVjb2RlW10gPSB7Ci0JIkRlbnNlVHJhbnNsYXRpb24iLAotCSJTcGFyc2VUcmFuc2xhdGlvbiIKLX07Ci0KLWNvbnN0IGNoYXIgKmFjcGlfZ2JsX3R0cF9kZWNvZGVbXSA9IHsKLQkiVHlwZVN0YXRpYyIsCi0JIlR5cGVUcmFuc2xhdGlvbiIKLX07Ci0KLWNvbnN0IGNoYXIgKmFjcGlfZ2JsX3R5cF9kZWNvZGVbXSA9IHsKLQkiQ29tcGF0aWJpbGl0eSIsCi0JIlR5cGVBIiwKLQkiVHlwZUIiLAotCSJUeXBlRiIKLX07Ci0KLSNlbmRpZgotCi0vKgotICogQmFzZSBzaXplcyBvZiB0aGUgcmF3IEFNTCByZXNvdXJjZSBkZXNjcmlwdG9ycywgaW5kZXhlZCBieSByZXNvdXJjZSB0eXBlLgotICogWmVybyBpbmRpY2F0ZXMgYSByZXNlcnZlZCAoYW5kIHRoZXJlZm9yZSBpbnZhbGlkKSByZXNvdXJjZSB0eXBlLgotICovCi1jb25zdCB1OCBhY3BpX2dibF9yZXNvdXJjZV9hbWxfc2l6ZXNbXSA9IHsKLQkvKiBTbWFsbCBkZXNjcmlwdG9ycyAqLwotCi0JMCwKLQkwLAotCTAsCi0JMCwKLQlBQ1BJX0FNTF9TSVpFX1NNQUxMKHN0cnVjdCBhbWxfcmVzb3VyY2VfaXJxKSwKLQlBQ1BJX0FNTF9TSVpFX1NNQUxMKHN0cnVjdCBhbWxfcmVzb3VyY2VfZG1hKSwKLQlBQ1BJX0FNTF9TSVpFX1NNQUxMKHN0cnVjdCBhbWxfcmVzb3VyY2Vfc3RhcnRfZGVwZW5kZW50KSwKLQlBQ1BJX0FNTF9TSVpFX1NNQUxMKHN0cnVjdCBhbWxfcmVzb3VyY2VfZW5kX2RlcGVuZGVudCksCi0JQUNQSV9BTUxfU0laRV9TTUFMTChzdHJ1Y3QgYW1sX3Jlc291cmNlX2lvKSwKLQlBQ1BJX0FNTF9TSVpFX1NNQUxMKHN0cnVjdCBhbWxfcmVzb3VyY2VfZml4ZWRfaW8pLAotCTAsCi0JMCwKLQkwLAotCTAsCi0JQUNQSV9BTUxfU0laRV9TTUFMTChzdHJ1Y3QgYW1sX3Jlc291cmNlX3ZlbmRvcl9zbWFsbCksCi0JQUNQSV9BTUxfU0laRV9TTUFMTChzdHJ1Y3QgYW1sX3Jlc291cmNlX2VuZF90YWcpLAotCi0JLyogTGFyZ2UgZGVzY3JpcHRvcnMgKi8KLQotCTAsCi0JQUNQSV9BTUxfU0laRV9MQVJHRShzdHJ1Y3QgYW1sX3Jlc291cmNlX21lbW9yeTI0KSwKLQlBQ1BJX0FNTF9TSVpFX0xBUkdFKHN0cnVjdCBhbWxfcmVzb3VyY2VfZ2VuZXJpY19yZWdpc3RlciksCi0JMCwKLQlBQ1BJX0FNTF9TSVpFX0xBUkdFKHN0cnVjdCBhbWxfcmVzb3VyY2VfdmVuZG9yX2xhcmdlKSwKLQlBQ1BJX0FNTF9TSVpFX0xBUkdFKHN0cnVjdCBhbWxfcmVzb3VyY2VfbWVtb3J5MzIpLAotCUFDUElfQU1MX1NJWkVfTEFSR0Uoc3RydWN0IGFtbF9yZXNvdXJjZV9maXhlZF9tZW1vcnkzMiksCi0JQUNQSV9BTUxfU0laRV9MQVJHRShzdHJ1Y3QgYW1sX3Jlc291cmNlX2FkZHJlc3MzMiksCi0JQUNQSV9BTUxfU0laRV9MQVJHRShzdHJ1Y3QgYW1sX3Jlc291cmNlX2FkZHJlc3MxNiksCi0JQUNQSV9BTUxfU0laRV9MQVJHRShzdHJ1Y3QgYW1sX3Jlc291cmNlX2V4dGVuZGVkX2lycSksCi0JQUNQSV9BTUxfU0laRV9MQVJHRShzdHJ1Y3QgYW1sX3Jlc291cmNlX2FkZHJlc3M2NCksCi0JQUNQSV9BTUxfU0laRV9MQVJHRShzdHJ1Y3QgYW1sX3Jlc291cmNlX2V4dGVuZGVkX2FkZHJlc3M2NCkKLX07Ci0KLS8qCi0gKiBSZXNvdXJjZSB0eXBlcywgdXNlZCB0byB2YWxpZGF0ZSB0aGUgcmVzb3VyY2UgbGVuZ3RoIGZpZWxkLgotICogVGhlIGxlbmd0aCBvZiBmaXhlZC1sZW5ndGggdHlwZXMgbXVzdCBtYXRjaCBleGFjdGx5LCB2YXJpYWJsZQotICogbGVuZ3RocyBtdXN0IG1lZXQgdGhlIG1pbmltdW0gcmVxdWlyZWQgbGVuZ3RoLCBldGMuCi0gKiBaZXJvIGluZGljYXRlcyBhIHJlc2VydmVkIChhbmQgdGhlcmVmb3JlIGludmFsaWQpIHJlc291cmNlIHR5cGUuCi0gKi8KLXN0YXRpYyBjb25zdCB1OCBhY3BpX2dibF9yZXNvdXJjZV90eXBlc1tdID0gewotCS8qIFNtYWxsIGRlc2NyaXB0b3JzICovCi0KLQkwLAotCTAsCi0JMCwKLQkwLAotCUFDUElfU01BTExfVkFSSUFCTEVfTEVOR1RILAotCUFDUElfRklYRURfTEVOR1RILAotCUFDUElfU01BTExfVkFSSUFCTEVfTEVOR1RILAotCUFDUElfRklYRURfTEVOR1RILAotCUFDUElfRklYRURfTEVOR1RILAotCUFDUElfRklYRURfTEVOR1RILAotCTAsCi0JMCwKLQkwLAotCTAsCi0JQUNQSV9WQVJJQUJMRV9MRU5HVEgsCi0JQUNQSV9GSVhFRF9MRU5HVEgsCi0KLQkvKiBMYXJnZSBkZXNjcmlwdG9ycyAqLwotCi0JMCwKLQlBQ1BJX0ZJWEVEX0xFTkdUSCwKLQlBQ1BJX0ZJWEVEX0xFTkdUSCwKLQkwLAotCUFDUElfVkFSSUFCTEVfTEVOR1RILAotCUFDUElfRklYRURfTEVOR1RILAotCUFDUElfRklYRURfTEVOR1RILAotCUFDUElfVkFSSUFCTEVfTEVOR1RILAotCUFDUElfVkFSSUFCTEVfTEVOR1RILAotCUFDUElfVkFSSUFCTEVfTEVOR1RILAotCUFDUElfVkFSSUFCTEVfTEVOR1RILAotCUFDUElfRklYRURfTEVOR1RICi19OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X3dhbGtfYW1sX3Jlc291cmNlcwotICoKLSAqIFBBUkFNRVRFUlM6ICBBbWwgICAgICAgICAgICAgLSBQb2ludGVyIHRvIHRoZSByYXcgQU1MIHJlc291cmNlIHRlbXBsYXRlCi0gKiAgICAgICAgICAgICAgYW1sX2xlbmd0aCAgICAgIC0gTGVuZ3RoIG9mIHRoZSBlbnRpcmUgdGVtcGxhdGUKLSAqICAgICAgICAgICAgICB1c2VyX2Z1bmN0aW9uICAgLSBDYWxsZWQgb25jZSBmb3IgZWFjaCBkZXNjcmlwdG9yIGZvdW5kLiBJZgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIGEgcG9pbnRlciB0byB0aGUgZW5kX3RhZyBpcyByZXR1cm5lZAotICogICAgICAgICAgICAgIENvbnRleHQgICAgICAgICAtIFBhc3NlZCB0byB1c2VyX2Z1bmN0aW9uCi0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cwotICoKLSAqIERFU0NSSVBUSU9OOiBXYWxrIGEgcmF3IEFNTCByZXNvdXJjZSBsaXN0KGJ1ZmZlcikuIFVzZXIgZnVuY3Rpb24gY2FsbGVkCi0gKiAgICAgICAgICAgICAgb25jZSBmb3IgZWFjaCByZXNvdXJjZSBmb3VuZC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1hY3BpX3N0YXR1cwotYWNwaV91dF93YWxrX2FtbF9yZXNvdXJjZXModTggKiBhbWwsCi0JCQkgICBhY3BpX3NpemUgYW1sX2xlbmd0aCwKLQkJCSAgIGFjcGlfd2Fsa19hbWxfY2FsbGJhY2sgdXNlcl9mdW5jdGlvbiwgdm9pZCAqKmNvbnRleHQpCi17Ci0JYWNwaV9zdGF0dXMgc3RhdHVzOwotCXU4ICplbmRfYW1sOwotCXU4IHJlc291cmNlX2luZGV4OwotCXUzMiBsZW5ndGg7Ci0JdTMyIG9mZnNldCA9IDA7Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKHV0X3dhbGtfYW1sX3Jlc291cmNlcyk7Ci0KLQkvKiBUaGUgYWJzb2x1dGUgbWluaW11bSByZXNvdXJjZSB0ZW1wbGF0ZSBpcyBvbmUgZW5kX3RhZyBkZXNjcmlwdG9yICovCi0KLQlpZiAoYW1sX2xlbmd0aCA8IHNpemVvZihzdHJ1Y3QgYW1sX3Jlc291cmNlX2VuZF90YWcpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfTk9fUkVTT1VSQ0VfRU5EX1RBRyk7Ci0JfQotCi0JLyogUG9pbnQgdG8gdGhlIGVuZCBvZiB0aGUgcmVzb3VyY2UgdGVtcGxhdGUgYnVmZmVyICovCi0KLQllbmRfYW1sID0gYW1sICsgYW1sX2xlbmd0aDsKLQotCS8qIFdhbGsgdGhlIGJ5dGUgbGlzdCwgYWJvcnQgb24gYW55IGludmFsaWQgZGVzY3JpcHRvciB0eXBlIG9yIGxlbmd0aCAqLwotCi0Jd2hpbGUgKGFtbCA8IGVuZF9hbWwpIHsKLQotCQkvKiBWYWxpZGF0ZSB0aGUgUmVzb3VyY2UgVHlwZSBhbmQgUmVzb3VyY2UgTGVuZ3RoICovCi0KLQkJc3RhdHVzID0gYWNwaV91dF92YWxpZGF0ZV9yZXNvdXJjZShhbWwsICZyZXNvdXJjZV9pbmRleCk7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci0JCX0KLQotCQkvKiBHZXQgdGhlIGxlbmd0aCBvZiB0aGlzIGRlc2NyaXB0b3IgKi8KLQotCQlsZW5ndGggPSBhY3BpX3V0X2dldF9kZXNjcmlwdG9yX2xlbmd0aChhbWwpOwotCi0JCS8qIEludm9rZSB0aGUgdXNlciBmdW5jdGlvbiAqLwotCi0JCWlmICh1c2VyX2Z1bmN0aW9uKSB7Ci0JCQlzdGF0dXMgPQotCQkJICAgIHVzZXJfZnVuY3Rpb24oYW1sLCBsZW5ndGgsIG9mZnNldCwgcmVzb3VyY2VfaW5kZXgsCi0JCQkJCSAgY29udGV4dCk7Ci0JCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJCQlyZXR1cm4gKHN0YXR1cyk7Ci0JCQl9Ci0JCX0KLQotCQkvKiBBbiBlbmRfdGFnIGRlc2NyaXB0b3IgdGVybWluYXRlcyB0aGlzIHJlc291cmNlIHRlbXBsYXRlICovCi0KLQkJaWYgKGFjcGlfdXRfZ2V0X3Jlc291cmNlX3R5cGUoYW1sKSA9PQotCQkgICAgQUNQSV9SRVNPVVJDRV9OQU1FX0VORF9UQUcpIHsKLQkJCS8qCi0JCQkgKiBUaGVyZSBtdXN0IGJlIGF0IGxlYXN0IG9uZSBtb3JlIGJ5dGUgaW4gdGhlIGJ1ZmZlciBmb3IKLQkJCSAqIHRoZSAybmQgYnl0ZSBvZiB0aGUgZW5kX3RhZwotCQkJICovCi0JCQlpZiAoKGFtbCArIDEpID49IGVuZF9hbWwpIHsKLQkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX05PX1JFU09VUkNFX0VORF9UQUcpOwotCQkJfQotCi0JCQkvKiBSZXR1cm4gdGhlIHBvaW50ZXIgdG8gdGhlIGVuZF90YWcgaWYgcmVxdWVzdGVkICovCi0KLQkJCWlmICghdXNlcl9mdW5jdGlvbikgewotCQkJCSpjb250ZXh0ID0gYW1sOwotCQkJfQotCi0JCQkvKiBOb3JtYWwgZXhpdCAqLwotCi0JCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwotCQl9Ci0KLQkJYW1sICs9IGxlbmd0aDsKLQkJb2Zmc2V0ICs9IGxlbmd0aDsKLQl9Ci0KLQkvKiBEaWQgbm90IGZpbmQgYW4gZW5kX3RhZyBkZXNjcmlwdG9yICovCi0KLQlyZXR1cm4gKEFFX0FNTF9OT19SRVNPVVJDRV9FTkRfVEFHKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV91dF92YWxpZGF0ZV9yZXNvdXJjZQotICoKLSAqIFBBUkFNRVRFUlM6ICBBbWwgICAgICAgICAgICAgLSBQb2ludGVyIHRvIHRoZSByYXcgQU1MIHJlc291cmNlIGRlc2NyaXB0b3IKLSAqICAgICAgICAgICAgICByZXR1cm5faW5kZXggICAgLSBXaGVyZSB0aGUgcmVzb3VyY2UgaW5kZXggaXMgcmV0dXJuZWQuIE5VTEwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiB0aGUgaW5kZXggaXMgbm90IHJlcXVpcmVkLgotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMsIGFuZCBvcHRpb25hbGx5IHRoZSBJbmRleCBpbnRvIHRoZSBnbG9iYWwgcmVzb3VyY2UgdGFibGVzCi0gKgotICogREVTQ1JJUFRJT046IFZhbGlkYXRlIGFuIEFNTCByZXNvdXJjZSBkZXNjcmlwdG9yIGJ5IGNoZWNraW5nIHRoZSBSZXNvdXJjZQotICogICAgICAgICAgICAgIFR5cGUgYW5kIFJlc291cmNlIExlbmd0aC4gUmV0dXJucyBhbiBpbmRleCBpbnRvIHRoZSBnbG9iYWwKLSAqICAgICAgICAgICAgICByZXNvdXJjZSBpbmZvcm1hdGlvbi9kaXNwYXRjaCB0YWJsZXMgZm9yIGxhdGVyIHVzZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1hY3BpX3N0YXR1cyBhY3BpX3V0X3ZhbGlkYXRlX3Jlc291cmNlKHZvaWQgKmFtbCwgdTggKiByZXR1cm5faW5kZXgpCi17Ci0JdTggcmVzb3VyY2VfdHlwZTsKLQl1OCByZXNvdXJjZV9pbmRleDsKLQlhY3BpX3JzX2xlbmd0aCByZXNvdXJjZV9sZW5ndGg7Ci0JYWNwaV9yc19sZW5ndGggbWluaW11bV9yZXNvdXJjZV9sZW5ndGg7Ci0KLQlBQ1BJX0ZVTkNUSU9OX0VOVFJZKCk7Ci0KLQkvKgotCSAqIDEpIFZhbGlkYXRlIHRoZSByZXNvdXJjZV90eXBlIGZpZWxkIChCeXRlIDApCi0JICovCi0JcmVzb3VyY2VfdHlwZSA9IEFDUElfR0VUOChhbWwpOwotCi0JLyoKLQkgKiBCeXRlIDAgY29udGFpbnMgdGhlIGRlc2NyaXB0b3IgbmFtZSAoUmVzb3VyY2UgVHlwZSkKLQkgKiBFeGFtaW5lIHRoZSBsYXJnZS9zbWFsbCBiaXQgaW4gdGhlIHJlc291cmNlIGhlYWRlcgotCSAqLwotCWlmIChyZXNvdXJjZV90eXBlICYgQUNQSV9SRVNPVVJDRV9OQU1FX0xBUkdFKSB7Ci0KLQkJLyogVmVyaWZ5IHRoZSBsYXJnZSByZXNvdXJjZSB0eXBlIChuYW1lKSBhZ2FpbnN0IHRoZSBtYXggKi8KLQotCQlpZiAocmVzb3VyY2VfdHlwZSA+IEFDUElfUkVTT1VSQ0VfTkFNRV9MQVJHRV9NQVgpIHsKLQkJCXJldHVybiAoQUVfQU1MX0lOVkFMSURfUkVTT1VSQ0VfVFlQRSk7Ci0JCX0KLQotCQkvKgotCQkgKiBMYXJnZSBSZXNvdXJjZSBUeXBlIC0tIGJpdHMgNjowIGNvbnRhaW4gdGhlIG5hbWUKLQkJICogVHJhbnNsYXRlIHJhbmdlIDB4ODAtMHg4QiB0byBpbmRleCByYW5nZSAweDEwLTB4MUIKLQkJICovCi0JCXJlc291cmNlX2luZGV4ID0gKHU4KSAocmVzb3VyY2VfdHlwZSAtIDB4NzApOwotCX0gZWxzZSB7Ci0JCS8qCi0JCSAqIFNtYWxsIFJlc291cmNlIFR5cGUgLS0gYml0cyA2OjMgY29udGFpbiB0aGUgbmFtZQotCQkgKiBTaGlmdCByYW5nZSB0byBpbmRleCByYW5nZSAweDAwLTB4MEYKLQkJICovCi0JCXJlc291cmNlX2luZGV4ID0gKHU4KQotCQkgICAgKChyZXNvdXJjZV90eXBlICYgQUNQSV9SRVNPVVJDRV9OQU1FX1NNQUxMX01BU0spID4+IDMpOwotCX0KLQotCS8qIENoZWNrIHZhbGlkaXR5IG9mIHRoZSByZXNvdXJjZSB0eXBlLCB6ZXJvIGluZGljYXRlcyBuYW1lIGlzIGludmFsaWQgKi8KLQotCWlmICghYWNwaV9nYmxfcmVzb3VyY2VfdHlwZXNbcmVzb3VyY2VfaW5kZXhdKSB7Ci0JCXJldHVybiAoQUVfQU1MX0lOVkFMSURfUkVTT1VSQ0VfVFlQRSk7Ci0JfQotCi0JLyoKLQkgKiAyKSBWYWxpZGF0ZSB0aGUgcmVzb3VyY2VfbGVuZ3RoIGZpZWxkLiBUaGlzIGVuc3VyZXMgdGhhdCB0aGUgbGVuZ3RoCi0JICogICAgaXMgYXQgbGVhc3QgcmVhc29uYWJsZSwgYW5kIGd1YXJhbnRlZXMgdGhhdCBpdCBpcyBub24temVyby4KLQkgKi8KLQlyZXNvdXJjZV9sZW5ndGggPSBhY3BpX3V0X2dldF9yZXNvdXJjZV9sZW5ndGgoYW1sKTsKLQltaW5pbXVtX3Jlc291cmNlX2xlbmd0aCA9IGFjcGlfZ2JsX3Jlc291cmNlX2FtbF9zaXplc1tyZXNvdXJjZV9pbmRleF07Ci0KLQkvKiBWYWxpZGF0ZSBiYXNlZCB1cG9uIHRoZSB0eXBlIG9mIHJlc291cmNlIC0gZml4ZWQgbGVuZ3RoIG9yIHZhcmlhYmxlICovCi0KLQlzd2l0Y2ggKGFjcGlfZ2JsX3Jlc291cmNlX3R5cGVzW3Jlc291cmNlX2luZGV4XSkgewotCWNhc2UgQUNQSV9GSVhFRF9MRU5HVEg6Ci0KLQkJLyogRml4ZWQgbGVuZ3RoIHJlc291cmNlLCBsZW5ndGggbXVzdCBtYXRjaCBleGFjdGx5ICovCi0KLQkJaWYgKHJlc291cmNlX2xlbmd0aCAhPSBtaW5pbXVtX3Jlc291cmNlX2xlbmd0aCkgewotCQkJcmV0dXJuIChBRV9BTUxfQkFEX1JFU09VUkNFX0xFTkdUSCk7Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIEFDUElfVkFSSUFCTEVfTEVOR1RIOgotCi0JCS8qIFZhcmlhYmxlIGxlbmd0aCByZXNvdXJjZSwgbGVuZ3RoIG11c3QgYmUgYXQgbGVhc3QgdGhlIG1pbmltdW0gKi8KLQotCQlpZiAocmVzb3VyY2VfbGVuZ3RoIDwgbWluaW11bV9yZXNvdXJjZV9sZW5ndGgpIHsKLQkJCXJldHVybiAoQUVfQU1MX0JBRF9SRVNPVVJDRV9MRU5HVEgpOwotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBBQ1BJX1NNQUxMX1ZBUklBQkxFX0xFTkdUSDoKLQotCQkvKiBTbWFsbCB2YXJpYWJsZSBsZW5ndGggcmVzb3VyY2UsIGxlbmd0aCBjYW4gYmUgKE1pbikgb3IgKE1pbi0xKSAqLwotCi0JCWlmICgocmVzb3VyY2VfbGVuZ3RoID4gbWluaW11bV9yZXNvdXJjZV9sZW5ndGgpIHx8Ci0JCSAgICAocmVzb3VyY2VfbGVuZ3RoIDwgKG1pbmltdW1fcmVzb3VyY2VfbGVuZ3RoIC0gMSkpKSB7Ci0JCQlyZXR1cm4gKEFFX0FNTF9CQURfUkVTT1VSQ0VfTEVOR1RIKTsKLQkJfQotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0KLQkJLyogU2hvdWxkbid0IGhhcHBlbiAoYmVjYXVzZSBvZiB2YWxpZGF0aW9uIGVhcmxpZXIpLCBidXQgYmUgc3VyZSAqLwotCi0JCXJldHVybiAoQUVfQU1MX0lOVkFMSURfUkVTT1VSQ0VfVFlQRSk7Ci0JfQotCi0JLyogT3B0aW9uYWxseSByZXR1cm4gdGhlIHJlc291cmNlIHRhYmxlIGluZGV4ICovCi0KLQlpZiAocmV0dXJuX2luZGV4KSB7Ci0JCSpyZXR1cm5faW5kZXggPSByZXNvdXJjZV9pbmRleDsKLQl9Ci0KLQlyZXR1cm4gKEFFX09LKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV91dF9nZXRfcmVzb3VyY2VfdHlwZQotICoKLSAqIFBBUkFNRVRFUlM6ICBBbWwgICAgICAgICAgICAgLSBQb2ludGVyIHRvIHRoZSByYXcgQU1MIHJlc291cmNlIGRlc2NyaXB0b3IKLSAqCi0gKiBSRVRVUk46ICAgICAgVGhlIFJlc291cmNlIFR5cGUgd2l0aCBubyBleHRyYW5lb3VzIGJpdHMgKGV4Y2VwdCB0aGUKLSAqICAgICAgICAgICAgICBMYXJnZS9TbWFsbCBkZXNjcmlwdG9yIGJpdCAtLSB0aGlzIGlzIGxlZnQgYWxvbmUpCi0gKgotICogREVTQ1JJUFRJT046IEV4dHJhY3QgdGhlIFJlc291cmNlIFR5cGUvTmFtZSBmcm9tIHRoZSBmaXJzdCBieXRlIG9mCi0gKiAgICAgICAgICAgICAgYSByZXNvdXJjZSBkZXNjcmlwdG9yLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXU4IGFjcGlfdXRfZ2V0X3Jlc291cmNlX3R5cGUodm9pZCAqYW1sKQotewotCUFDUElfRlVOQ1RJT05fRU5UUlkoKTsKLQotCS8qCi0JICogQnl0ZSAwIGNvbnRhaW5zIHRoZSBkZXNjcmlwdG9yIG5hbWUgKFJlc291cmNlIFR5cGUpCi0JICogRXhhbWluZSB0aGUgbGFyZ2Uvc21hbGwgYml0IGluIHRoZSByZXNvdXJjZSBoZWFkZXIKLQkgKi8KLQlpZiAoQUNQSV9HRVQ4KGFtbCkgJiBBQ1BJX1JFU09VUkNFX05BTUVfTEFSR0UpIHsKLQotCQkvKiBMYXJnZSBSZXNvdXJjZSBUeXBlIC0tIGJpdHMgNjowIGNvbnRhaW4gdGhlIG5hbWUgKi8KLQotCQlyZXR1cm4gKEFDUElfR0VUOChhbWwpKTsKLQl9IGVsc2UgewotCQkvKiBTbWFsbCBSZXNvdXJjZSBUeXBlIC0tIGJpdHMgNjozIGNvbnRhaW4gdGhlIG5hbWUgKi8KLQotCQlyZXR1cm4gKCh1OCkgKEFDUElfR0VUOChhbWwpICYgQUNQSV9SRVNPVVJDRV9OQU1FX1NNQUxMX01BU0spKTsKLQl9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfdXRfZ2V0X3Jlc291cmNlX2xlbmd0aAotICoKLSAqIFBBUkFNRVRFUlM6ICBBbWwgICAgICAgICAgICAgLSBQb2ludGVyIHRvIHRoZSByYXcgQU1MIHJlc291cmNlIGRlc2NyaXB0b3IKLSAqCi0gKiBSRVRVUk46ICAgICAgQnl0ZSBMZW5ndGgKLSAqCi0gKiBERVNDUklQVElPTjogR2V0IHRoZSAiUmVzb3VyY2UgTGVuZ3RoIiBvZiBhIHJhdyBBTUwgZGVzY3JpcHRvci4gQnkKLSAqICAgICAgICAgICAgICBkZWZpbml0aW9uLCB0aGlzIGRvZXMgbm90IGluY2x1ZGUgdGhlIHNpemUgb2YgdGhlIGRlc2NyaXB0b3IKLSAqICAgICAgICAgICAgICBoZWFkZXIgb3IgdGhlIGxlbmd0aCBmaWVsZCBpdHNlbGYuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdTE2IGFjcGlfdXRfZ2V0X3Jlc291cmNlX2xlbmd0aCh2b2lkICphbWwpCi17Ci0JYWNwaV9yc19sZW5ndGggcmVzb3VyY2VfbGVuZ3RoOwotCi0JQUNQSV9GVU5DVElPTl9FTlRSWSgpOwotCi0JLyoKLQkgKiBCeXRlIDAgY29udGFpbnMgdGhlIGRlc2NyaXB0b3IgbmFtZSAoUmVzb3VyY2UgVHlwZSkKLQkgKiBFeGFtaW5lIHRoZSBsYXJnZS9zbWFsbCBiaXQgaW4gdGhlIHJlc291cmNlIGhlYWRlcgotCSAqLwotCWlmIChBQ1BJX0dFVDgoYW1sKSAmIEFDUElfUkVTT1VSQ0VfTkFNRV9MQVJHRSkgewotCi0JCS8qIExhcmdlIFJlc291cmNlIHR5cGUgLS0gYnl0ZXMgMS0yIGNvbnRhaW4gdGhlIDE2LWJpdCBsZW5ndGggKi8KLQotCQlBQ1BJX01PVkVfMTZfVE9fMTYoJnJlc291cmNlX2xlbmd0aCwgQUNQSV9BRERfUFRSKHU4LCBhbWwsIDEpKTsKLQotCX0gZWxzZSB7Ci0JCS8qIFNtYWxsIFJlc291cmNlIHR5cGUgLS0gYml0cyAyOjAgb2YgYnl0ZSAwIGNvbnRhaW4gdGhlIGxlbmd0aCAqLwotCi0JCXJlc291cmNlX2xlbmd0aCA9ICh1MTYpIChBQ1BJX0dFVDgoYW1sKSAmCi0JCQkJCSBBQ1BJX1JFU09VUkNFX05BTUVfU01BTExfTEVOR1RIX01BU0spOwotCX0KLQotCXJldHVybiAocmVzb3VyY2VfbGVuZ3RoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV91dF9nZXRfcmVzb3VyY2VfaGVhZGVyX2xlbmd0aAotICoKLSAqIFBBUkFNRVRFUlM6ICBBbWwgICAgICAgICAgICAgLSBQb2ludGVyIHRvIHRoZSByYXcgQU1MIHJlc291cmNlIGRlc2NyaXB0b3IKLSAqCi0gKiBSRVRVUk46ICAgICAgTGVuZ3RoIG9mIHRoZSBBTUwgaGVhZGVyIChkZXBlbmRzIG9uIGxhcmdlL3NtYWxsIGRlc2NyaXB0b3IpCi0gKgotICogREVTQ1JJUFRJT046IEdldCB0aGUgbGVuZ3RoIG9mIHRoZSBoZWFkZXIgZm9yIHRoaXMgcmVzb3VyY2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdTggYWNwaV91dF9nZXRfcmVzb3VyY2VfaGVhZGVyX2xlbmd0aCh2b2lkICphbWwpCi17Ci0JQUNQSV9GVU5DVElPTl9FTlRSWSgpOwotCi0JLyogRXhhbWluZSB0aGUgbGFyZ2Uvc21hbGwgYml0IGluIHRoZSByZXNvdXJjZSBoZWFkZXIgKi8KLQotCWlmIChBQ1BJX0dFVDgoYW1sKSAmIEFDUElfUkVTT1VSQ0VfTkFNRV9MQVJHRSkgewotCQlyZXR1cm4gKHNpemVvZihzdHJ1Y3QgYW1sX3Jlc291cmNlX2xhcmdlX2hlYWRlcikpOwotCX0gZWxzZSB7Ci0JCXJldHVybiAoc2l6ZW9mKHN0cnVjdCBhbWxfcmVzb3VyY2Vfc21hbGxfaGVhZGVyKSk7Ci0JfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X2dldF9kZXNjcmlwdG9yX2xlbmd0aAotICoKLSAqIFBBUkFNRVRFUlM6ICBBbWwgICAgICAgICAgICAgLSBQb2ludGVyIHRvIHRoZSByYXcgQU1MIHJlc291cmNlIGRlc2NyaXB0b3IKLSAqCi0gKiBSRVRVUk46ICAgICAgQnl0ZSBsZW5ndGgKLSAqCi0gKiBERVNDUklQVElPTjogR2V0IHRoZSB0b3RhbCBieXRlIGxlbmd0aCBvZiBhIHJhdyBBTUwgZGVzY3JpcHRvciwgaW5jbHVkaW5nIHRoZQotICogICAgICAgICAgICAgIGxlbmd0aCBvZiB0aGUgZGVzY3JpcHRvciBoZWFkZXIgYW5kIHRoZSBsZW5ndGggZmllbGQgaXRzZWxmLgotICogICAgICAgICAgICAgIFVzZWQgdG8gd2FsayBkZXNjcmlwdG9yIGxpc3RzLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXUzMiBhY3BpX3V0X2dldF9kZXNjcmlwdG9yX2xlbmd0aCh2b2lkICphbWwpCi17Ci0JQUNQSV9GVU5DVElPTl9FTlRSWSgpOwotCi0JLyoKLQkgKiBHZXQgdGhlIFJlc291cmNlIExlbmd0aCAoZG9lcyBub3QgaW5jbHVkZSBoZWFkZXIgbGVuZ3RoKSBhbmQgYWRkCi0JICogdGhlIGhlYWRlciBsZW5ndGggKGRlcGVuZHMgb24gaWYgdGhpcyBpcyBhIHNtYWxsIG9yIGxhcmdlIHJlc291cmNlKQotCSAqLwotCXJldHVybiAoYWNwaV91dF9nZXRfcmVzb3VyY2VfbGVuZ3RoKGFtbCkgKwotCQlhY3BpX3V0X2dldF9yZXNvdXJjZV9oZWFkZXJfbGVuZ3RoKGFtbCkpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X2dldF9yZXNvdXJjZV9lbmRfdGFnCi0gKgotICogUEFSQU1FVEVSUzogIG9ial9kZXNjICAgICAgICAtIFRoZSByZXNvdXJjZSB0ZW1wbGF0ZSBidWZmZXIgb2JqZWN0Ci0gKiAgICAgICAgICAgICAgZW5kX3RhZyAgICAgICAgIC0gV2hlcmUgdGhlIHBvaW50ZXIgdG8gdGhlIGVuZF90YWcgaXMgcmV0dXJuZWQKLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzLCBwb2ludGVyIHRvIHRoZSBlbmQgdGFnCi0gKgotICogREVTQ1JJUFRJT046IEZpbmQgdGhlIGVuZF90YWcgcmVzb3VyY2UgZGVzY3JpcHRvciBpbiBhbiBBTUwgcmVzb3VyY2UgdGVtcGxhdGUKLSAqICAgICAgICAgICAgICBOb3RlOiBhbGxvd3MgYSBidWZmZXIgbGVuZ3RoIG9mIHplcm8uCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotYWNwaV9zdGF0dXMKLWFjcGlfdXRfZ2V0X3Jlc291cmNlX2VuZF90YWcodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqIG9ial9kZXNjLAotCQkJICAgICB1OCAqKiBlbmRfdGFnKQotewotCWFjcGlfc3RhdHVzIHN0YXR1czsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UodXRfZ2V0X3Jlc291cmNlX2VuZF90YWcpOwotCi0JLyogQWxsb3cgYSBidWZmZXIgbGVuZ3RoIG9mIHplcm8gKi8KLQotCWlmICghb2JqX2Rlc2MtPmJ1ZmZlci5sZW5ndGgpIHsKLQkJKmVuZF90YWcgPSBvYmpfZGVzYy0+YnVmZmVyLnBvaW50ZXI7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7Ci0JfQotCi0JLyogVmFsaWRhdGUgdGhlIHRlbXBsYXRlIGFuZCBnZXQgYSBwb2ludGVyIHRvIHRoZSBlbmRfdGFnICovCi0KLQlzdGF0dXMgPSBhY3BpX3V0X3dhbGtfYW1sX3Jlc291cmNlcyhvYmpfZGVzYy0+YnVmZmVyLnBvaW50ZXIsCi0JCQkJCSAgICBvYmpfZGVzYy0+YnVmZmVyLmxlbmd0aCwgTlVMTCwKLQkJCQkJICAgICh2b2lkICoqKWVuZF90YWcpOwotCi0JcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0c3RhdGUuYyBiL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXRzdGF0ZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2M2E2ZDNkLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXRzdGF0ZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMzQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogTW9kdWxlIE5hbWU6IHV0c3RhdGUgLSBzdGF0ZSBvYmplY3Qgc3VwcG9ydCBwcm9jZWR1cmVzCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDgsIEludGVsIENvcnAuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCi0gKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSBhdCBtaW5pbXVtIGEgZGlzY2xhaW1lcgotICogICAgc3Vic3RhbnRpYWxseSBzaW1pbGFyIHRvIHRoZSAiTk8gV0FSUkFOVFkiIGRpc2NsYWltZXIgYmVsb3cKLSAqICAgICgiRGlzY2xhaW1lciIpIGFuZCBhbnkgcmVkaXN0cmlidXRpb24gbXVzdCBiZSBjb25kaXRpb25lZCB1cG9uCi0gKiAgICBpbmNsdWRpbmcgYSBzdWJzdGFudGlhbGx5IHNpbWlsYXIgRGlzY2xhaW1lciByZXF1aXJlbWVudCBmb3IgZnVydGhlcgotICogICAgYmluYXJ5IHJlZGlzdHJpYnV0aW9uLgotICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzCi0gKiAgICBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIE5PIFdBUlJBTlRZCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKLSAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCi0gKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORwotICogSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCi0gKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCi0gKi8KLQotI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgotCi0jZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9VVElMSVRJRVMKLUFDUElfTU9EVUxFX05BTUUoInV0c3RhdGUiKQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X2NyZWF0ZV9wa2dfc3RhdGVfYW5kX3B1c2gKLSAqCi0gKiBQQVJBTUVURVJTOiAgT2JqZWN0ICAgICAgICAgIC0gT2JqZWN0IHRvIGJlIGFkZGVkIHRvIHRoZSBuZXcgc3RhdGUKLSAqICAgICAgICAgICAgICBBY3Rpb24gICAgICAgICAgLSBJbmNyZW1lbnQvRGVjcmVtZW50Ci0gKiAgICAgICAgICAgICAgc3RhdGVfbGlzdCAgICAgIC0gTGlzdCB0aGUgc3RhdGUgd2lsbCBiZSBhZGRlZCB0bwotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKLSAqCi0gKiBERVNDUklQVElPTjogQ3JlYXRlIGEgbmV3IHN0YXRlIGFuZCBwdXNoIGl0Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWFjcGlfc3RhdHVzCi1hY3BpX3V0X2NyZWF0ZV9wa2dfc3RhdGVfYW5kX3B1c2godm9pZCAqaW50ZXJuYWxfb2JqZWN0LAotCQkJCSAgdm9pZCAqZXh0ZXJuYWxfb2JqZWN0LAotCQkJCSAgdTE2IGluZGV4LAotCQkJCSAgdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICoqc3RhdGVfbGlzdCkKLXsKLQl1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgKnN0YXRlOwotCi0JQUNQSV9GVU5DVElPTl9FTlRSWSgpOwotCi0Jc3RhdGUgPQotCSAgICBhY3BpX3V0X2NyZWF0ZV9wa2dfc3RhdGUoaW50ZXJuYWxfb2JqZWN0LCBleHRlcm5hbF9vYmplY3QsIGluZGV4KTsKLQlpZiAoIXN0YXRlKSB7Ci0JCXJldHVybiAoQUVfTk9fTUVNT1JZKTsKLQl9Ci0KLQlhY3BpX3V0X3B1c2hfZ2VuZXJpY19zdGF0ZShzdGF0ZV9saXN0LCBzdGF0ZSk7Ci0JcmV0dXJuIChBRV9PSyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfdXRfcHVzaF9nZW5lcmljX3N0YXRlCi0gKgotICogUEFSQU1FVEVSUzogIGxpc3RfaGVhZCAgICAgICAgICAgLSBIZWFkIG9mIHRoZSBzdGF0ZSBzdGFjawotICogICAgICAgICAgICAgIFN0YXRlICAgICAgICAgICAgICAgLSBTdGF0ZSBvYmplY3QgdG8gcHVzaAotICoKLSAqIFJFVFVSTjogICAgICBOb25lCi0gKgotICogREVTQ1JJUFRJT046IFB1c2ggYSBzdGF0ZSBvYmplY3Qgb250byBhIHN0YXRlIHN0YWNrCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdm9pZAotYWNwaV91dF9wdXNoX2dlbmVyaWNfc3RhdGUodW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICoqbGlzdF9oZWFkLAotCQkJICAgdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICpzdGF0ZSkKLXsKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKHV0X3B1c2hfZ2VuZXJpY19zdGF0ZSk7Ci0KLQkvKiBQdXNoIHRoZSBzdGF0ZSBvYmplY3Qgb250byB0aGUgZnJvbnQgb2YgdGhlIGxpc3QgKHN0YWNrKSAqLwotCi0Jc3RhdGUtPmNvbW1vbi5uZXh0ID0gKmxpc3RfaGVhZDsKLQkqbGlzdF9oZWFkID0gc3RhdGU7Ci0KLQlyZXR1cm5fVk9JRDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV91dF9wb3BfZ2VuZXJpY19zdGF0ZQotICoKLSAqIFBBUkFNRVRFUlM6ICBsaXN0X2hlYWQgICAgICAgICAgIC0gSGVhZCBvZiB0aGUgc3RhdGUgc3RhY2sKLSAqCi0gKiBSRVRVUk46ICAgICAgVGhlIHBvcHBlZCBzdGF0ZSBvYmplY3QKLSAqCi0gKiBERVNDUklQVElPTjogUG9wIGEgc3RhdGUgb2JqZWN0IGZyb20gYSBzdGF0ZSBzdGFjawotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSAqYWNwaV91dF9wb3BfZ2VuZXJpY19zdGF0ZSh1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUKLQkJCQkJCSAgICAqKmxpc3RfaGVhZCkKLXsKLQl1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgKnN0YXRlOwotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSh1dF9wb3BfZ2VuZXJpY19zdGF0ZSk7Ci0KLQkvKiBSZW1vdmUgdGhlIHN0YXRlIG9iamVjdCBhdCB0aGUgaGVhZCBvZiB0aGUgbGlzdCAoc3RhY2spICovCi0KLQlzdGF0ZSA9ICpsaXN0X2hlYWQ7Ci0JaWYgKHN0YXRlKSB7Ci0KLQkJLyogVXBkYXRlIHRoZSBsaXN0IGhlYWQgKi8KLQotCQkqbGlzdF9oZWFkID0gc3RhdGUtPmNvbW1vbi5uZXh0OwotCX0KLQotCXJldHVybl9QVFIoc3RhdGUpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X2NyZWF0ZV9nZW5lcmljX3N0YXRlCi0gKgotICogUEFSQU1FVEVSUzogIE5vbmUKLSAqCi0gKiBSRVRVUk46ICAgICAgVGhlIG5ldyBzdGF0ZSBvYmplY3QuIE5VTEwgb24gZmFpbHVyZS4KLSAqCi0gKiBERVNDUklQVElPTjogQ3JlYXRlIGEgZ2VuZXJpYyBzdGF0ZSBvYmplY3QuICBBdHRlbXB0IHRvIG9idGFpbiBvbmUgZnJvbQotICogICAgICAgICAgICAgIHRoZSBnbG9iYWwgc3RhdGUgY2FjaGU7ICBJZiBub25lIGF2YWlsYWJsZSwgY3JlYXRlIGEgbmV3IG9uZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi11bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgKmFjcGlfdXRfY3JlYXRlX2dlbmVyaWNfc3RhdGUodm9pZCkKLXsKLQl1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgKnN0YXRlOwotCi0JQUNQSV9GVU5DVElPTl9FTlRSWSgpOwotCi0Jc3RhdGUgPSBhY3BpX29zX2FjcXVpcmVfb2JqZWN0KGFjcGlfZ2JsX3N0YXRlX2NhY2hlKTsKLQlpZiAoc3RhdGUpIHsKLQotCQkvKiBJbml0aWFsaXplICovCi0JCW1lbXNldChzdGF0ZSwgMCwgc2l6ZW9mKHVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSkpOwotCQlzdGF0ZS0+Y29tbW9uLmRlc2NyaXB0b3JfdHlwZSA9IEFDUElfREVTQ19UWVBFX1NUQVRFOwotCX0KLQotCXJldHVybiAoc3RhdGUpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X2NyZWF0ZV90aHJlYWRfc3RhdGUKLSAqCi0gKiBQQVJBTUVURVJTOiAgTm9uZQotICoKLSAqIFJFVFVSTjogICAgICBOZXcgVGhyZWFkIFN0YXRlLiBOVUxMIG9uIGZhaWx1cmUKLSAqCi0gKiBERVNDUklQVElPTjogQ3JlYXRlIGEgIlRocmVhZCBTdGF0ZSIgLSBhIGZsYXZvciBvZiB0aGUgZ2VuZXJpYyBzdGF0ZSB1c2VkCi0gKiAgICAgICAgICAgICAgdG8gdHJhY2sgcGVyLXRocmVhZCBpbmZvIGR1cmluZyBtZXRob2QgZXhlY3V0aW9uCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RydWN0IGFjcGlfdGhyZWFkX3N0YXRlICphY3BpX3V0X2NyZWF0ZV90aHJlYWRfc3RhdGUodm9pZCkKLXsKLQl1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgKnN0YXRlOwotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSh1dF9jcmVhdGVfdGhyZWFkX3N0YXRlKTsKLQotCS8qIENyZWF0ZSB0aGUgZ2VuZXJpYyBzdGF0ZSBvYmplY3QgKi8KLQotCXN0YXRlID0gYWNwaV91dF9jcmVhdGVfZ2VuZXJpY19zdGF0ZSgpOwotCWlmICghc3RhdGUpIHsKLQkJcmV0dXJuX1BUUihOVUxMKTsKLQl9Ci0KLQkvKiBJbml0IGZpZWxkcyBzcGVjaWZpYyB0byB0aGUgdXBkYXRlIHN0cnVjdCAqLwotCi0Jc3RhdGUtPmNvbW1vbi5kZXNjcmlwdG9yX3R5cGUgPSBBQ1BJX0RFU0NfVFlQRV9TVEFURV9USFJFQUQ7Ci0Jc3RhdGUtPnRocmVhZC50aHJlYWRfaWQgPSBhY3BpX29zX2dldF90aHJlYWRfaWQoKTsKLQotCS8qIENoZWNrIGZvciBpbnZhbGlkIHRocmVhZCBJRCAtIHplcm8gaXMgdmVyeSBiYWQsIGl0IHdpbGwgYnJlYWsgdGhpbmdzICovCi0KLQlpZiAoIXN0YXRlLT50aHJlYWQudGhyZWFkX2lkKSB7Ci0JCUFDUElfRVJST1IoKEFFX0lORk8sICJJbnZhbGlkIHplcm8gSUQgZnJvbSBBY3BpT3NHZXRUaHJlYWRJZCIpKTsKLQkJc3RhdGUtPnRocmVhZC50aHJlYWRfaWQgPSAoYWNwaV90aHJlYWRfaWQpIDE7Ci0JfQotCi0JcmV0dXJuX1BUUigoc3RydWN0IGFjcGlfdGhyZWFkX3N0YXRlICopc3RhdGUpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X2NyZWF0ZV91cGRhdGVfc3RhdGUKLSAqCi0gKiBQQVJBTUVURVJTOiAgT2JqZWN0ICAgICAgICAgIC0gSW5pdGlhbCBPYmplY3QgdG8gYmUgaW5zdGFsbGVkIGluIHRoZSBzdGF0ZQotICogICAgICAgICAgICAgIEFjdGlvbiAgICAgICAgICAtIFVwZGF0ZSBhY3Rpb24gdG8gYmUgcGVyZm9ybWVkCi0gKgotICogUkVUVVJOOiAgICAgIE5ldyBzdGF0ZSBvYmplY3QsIG51bGwgb24gZmFpbHVyZQotICoKLSAqIERFU0NSSVBUSU9OOiBDcmVhdGUgYW4gIlVwZGF0ZSBTdGF0ZSIgLSBhIGZsYXZvciBvZiB0aGUgZ2VuZXJpYyBzdGF0ZSB1c2VkCi0gKiAgICAgICAgICAgICAgdG8gdXBkYXRlIHJlZmVyZW5jZSBjb3VudHMgYW5kIGRlbGV0ZSBjb21wbGV4IG9iamVjdHMgc3VjaAotICogICAgICAgICAgICAgIGFzIHBhY2thZ2VzLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSAqYWNwaV91dF9jcmVhdGVfdXBkYXRlX3N0YXRlKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QKLQkJCQkJCSAgICAgICpvYmplY3QsIHUxNiBhY3Rpb24pCi17Ci0JdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICpzdGF0ZTsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKHV0X2NyZWF0ZV91cGRhdGVfc3RhdGUsIG9iamVjdCk7Ci0KLQkvKiBDcmVhdGUgdGhlIGdlbmVyaWMgc3RhdGUgb2JqZWN0ICovCi0KLQlzdGF0ZSA9IGFjcGlfdXRfY3JlYXRlX2dlbmVyaWNfc3RhdGUoKTsKLQlpZiAoIXN0YXRlKSB7Ci0JCXJldHVybl9QVFIoTlVMTCk7Ci0JfQotCi0JLyogSW5pdCBmaWVsZHMgc3BlY2lmaWMgdG8gdGhlIHVwZGF0ZSBzdHJ1Y3QgKi8KLQotCXN0YXRlLT5jb21tb24uZGVzY3JpcHRvcl90eXBlID0gQUNQSV9ERVNDX1RZUEVfU1RBVEVfVVBEQVRFOwotCXN0YXRlLT51cGRhdGUub2JqZWN0ID0gb2JqZWN0OwotCXN0YXRlLT51cGRhdGUudmFsdWUgPSBhY3Rpb247Ci0KLQlyZXR1cm5fUFRSKHN0YXRlKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV91dF9jcmVhdGVfcGtnX3N0YXRlCi0gKgotICogUEFSQU1FVEVSUzogIE9iamVjdCAgICAgICAgICAtIEluaXRpYWwgT2JqZWN0IHRvIGJlIGluc3RhbGxlZCBpbiB0aGUgc3RhdGUKLSAqICAgICAgICAgICAgICBBY3Rpb24gICAgICAgICAgLSBVcGRhdGUgYWN0aW9uIHRvIGJlIHBlcmZvcm1lZAotICoKLSAqIFJFVFVSTjogICAgICBOZXcgc3RhdGUgb2JqZWN0LCBudWxsIG9uIGZhaWx1cmUKLSAqCi0gKiBERVNDUklQVElPTjogQ3JlYXRlIGEgIlBhY2thZ2UgU3RhdGUiCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICphY3BpX3V0X2NyZWF0ZV9wa2dfc3RhdGUodm9pZCAqaW50ZXJuYWxfb2JqZWN0LAotCQkJCQkJICAgdm9pZCAqZXh0ZXJuYWxfb2JqZWN0LAotCQkJCQkJICAgdTE2IGluZGV4KQotewotCXVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSAqc3RhdGU7Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUih1dF9jcmVhdGVfcGtnX3N0YXRlLCBpbnRlcm5hbF9vYmplY3QpOwotCi0JLyogQ3JlYXRlIHRoZSBnZW5lcmljIHN0YXRlIG9iamVjdCAqLwotCi0Jc3RhdGUgPSBhY3BpX3V0X2NyZWF0ZV9nZW5lcmljX3N0YXRlKCk7Ci0JaWYgKCFzdGF0ZSkgewotCQlyZXR1cm5fUFRSKE5VTEwpOwotCX0KLQotCS8qIEluaXQgZmllbGRzIHNwZWNpZmljIHRvIHRoZSB1cGRhdGUgc3RydWN0ICovCi0KLQlzdGF0ZS0+Y29tbW9uLmRlc2NyaXB0b3JfdHlwZSA9IEFDUElfREVTQ19UWVBFX1NUQVRFX1BBQ0tBR0U7Ci0Jc3RhdGUtPnBrZy5zb3VyY2Vfb2JqZWN0ID0gKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKilpbnRlcm5hbF9vYmplY3Q7Ci0Jc3RhdGUtPnBrZy5kZXN0X29iamVjdCA9IGV4dGVybmFsX29iamVjdDsKLQlzdGF0ZS0+cGtnLmluZGV4ID0gaW5kZXg7Ci0Jc3RhdGUtPnBrZy5udW1fcGFja2FnZXMgPSAxOwotCi0JcmV0dXJuX1BUUihzdGF0ZSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfdXRfY3JlYXRlX2NvbnRyb2xfc3RhdGUKLSAqCi0gKiBQQVJBTUVURVJTOiAgTm9uZQotICoKLSAqIFJFVFVSTjogICAgICBOZXcgc3RhdGUgb2JqZWN0LCBudWxsIG9uIGZhaWx1cmUKLSAqCi0gKiBERVNDUklQVElPTjogQ3JlYXRlIGEgIkNvbnRyb2wgU3RhdGUiIC0gYSBmbGF2b3Igb2YgdGhlIGdlbmVyaWMgc3RhdGUgdXNlZAotICogICAgICAgICAgICAgIHRvIHN1cHBvcnQgbmVzdGVkIElGL1dISUxFIGNvbnN0cnVjdHMgaW4gdGhlIEFNTC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi11bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgKmFjcGlfdXRfY3JlYXRlX2NvbnRyb2xfc3RhdGUodm9pZCkKLXsKLQl1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgKnN0YXRlOwotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSh1dF9jcmVhdGVfY29udHJvbF9zdGF0ZSk7Ci0KLQkvKiBDcmVhdGUgdGhlIGdlbmVyaWMgc3RhdGUgb2JqZWN0ICovCi0KLQlzdGF0ZSA9IGFjcGlfdXRfY3JlYXRlX2dlbmVyaWNfc3RhdGUoKTsKLQlpZiAoIXN0YXRlKSB7Ci0JCXJldHVybl9QVFIoTlVMTCk7Ci0JfQotCi0JLyogSW5pdCBmaWVsZHMgc3BlY2lmaWMgdG8gdGhlIGNvbnRyb2wgc3RydWN0ICovCi0KLQlzdGF0ZS0+Y29tbW9uLmRlc2NyaXB0b3JfdHlwZSA9IEFDUElfREVTQ19UWVBFX1NUQVRFX0NPTlRST0w7Ci0Jc3RhdGUtPmNvbW1vbi5zdGF0ZSA9IEFDUElfQ09OVFJPTF9DT05ESVRJT05BTF9FWEVDVVRJTkc7Ci0KLQlyZXR1cm5fUFRSKHN0YXRlKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV91dF9kZWxldGVfZ2VuZXJpY19zdGF0ZQotICoKLSAqIFBBUkFNRVRFUlM6ICBTdGF0ZSAgICAgICAgICAgICAgIC0gVGhlIHN0YXRlIG9iamVjdCB0byBiZSBkZWxldGVkCi0gKgotICogUkVUVVJOOiAgICAgIE5vbmUKLSAqCi0gKiBERVNDUklQVElPTjogUmVsZWFzZSBhIHN0YXRlIG9iamVjdCB0byB0aGUgc3RhdGUgY2FjaGUuIE5VTEwgc3RhdGUgb2JqZWN0cwotICogICAgICAgICAgICAgIGFyZSBpZ25vcmVkLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXZvaWQgYWNwaV91dF9kZWxldGVfZ2VuZXJpY19zdGF0ZSh1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgKnN0YXRlKQotewotCUFDUElfRlVOQ1RJT05fVFJBQ0UodXRfZGVsZXRlX2dlbmVyaWNfc3RhdGUpOwotCi0JLyogSWdub3JlIG51bGwgc3RhdGUgKi8KLQotCWlmIChzdGF0ZSkgewotCQkodm9pZClhY3BpX29zX3JlbGVhc2Vfb2JqZWN0KGFjcGlfZ2JsX3N0YXRlX2NhY2hlLCBzdGF0ZSk7Ci0JfQotCXJldHVybl9WT0lEOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dHhmYWNlLmMgYi9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0eGZhY2UuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE5OGE0ZC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0eGZhY2UuYworKysgL2Rldi9udWxsCkBAIC0xLDUwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogTW9kdWxlIE5hbWU6IHV0eGZhY2UgLSBFeHRlcm5hbCBpbnRlcmZhY2VzIGZvciAiZ2xvYmFsIiBBQ1BJIGZ1bmN0aW9ucwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDgsIEludGVsIENvcnAuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCi0gKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSBhdCBtaW5pbXVtIGEgZGlzY2xhaW1lcgotICogICAgc3Vic3RhbnRpYWxseSBzaW1pbGFyIHRvIHRoZSAiTk8gV0FSUkFOVFkiIGRpc2NsYWltZXIgYmVsb3cKLSAqICAgICgiRGlzY2xhaW1lciIpIGFuZCBhbnkgcmVkaXN0cmlidXRpb24gbXVzdCBiZSBjb25kaXRpb25lZCB1cG9uCi0gKiAgICBpbmNsdWRpbmcgYSBzdWJzdGFudGlhbGx5IHNpbWlsYXIgRGlzY2xhaW1lciByZXF1aXJlbWVudCBmb3IgZnVydGhlcgotICogICAgYmluYXJ5IHJlZGlzdHJpYnV0aW9uLgotICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzCi0gKiAgICBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIE5PIFdBUlJBTlRZCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKLSAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCi0gKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORwotICogSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCi0gKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCi0gKi8KLQotI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgotI2luY2x1ZGUgPGFjcGkvYWNldmVudHMuaD4KLSNpbmNsdWRlIDxhY3BpL2FjbmFtZXNwLmg+Ci0jaW5jbHVkZSA8YWNwaS9hY2RlYnVnLmg+Ci0KLSNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX1VUSUxJVElFUwotQUNQSV9NT0RVTEVfTkFNRSgidXR4ZmFjZSIpCi0KLSNpZm5kZWYgQUNQSV9BU0xfQ09NUElMRVIKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfaW5pdGlhbGl6ZV9zdWJzeXN0ZW0KLSAqCi0gKiBQQVJBTUVURVJTOiAgTm9uZQotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKLSAqCi0gKiBERVNDUklQVElPTjogSW5pdGlhbGl6ZXMgYWxsIGdsb2JhbCB2YXJpYWJsZXMuICBUaGlzIGlzIHRoZSBmaXJzdCBmdW5jdGlvbgotICogICAgICAgICAgICAgIGNhbGxlZCwgc28gYW55IGVhcmx5IGluaXRpYWxpemF0aW9uIGJlbG9uZ3MgaGVyZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYWNwaV9zdGF0dXMgX19pbml0IGFjcGlfaW5pdGlhbGl6ZV9zdWJzeXN0ZW0odm9pZCkKLXsKLQlhY3BpX3N0YXR1cyBzdGF0dXM7Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGFjcGlfaW5pdGlhbGl6ZV9zdWJzeXN0ZW0pOwotCi0JYWNwaV9nYmxfc3RhcnR1cF9mbGFncyA9IEFDUElfU1VCU1lTVEVNX0lOSVRJQUxJWkU7Ci0JQUNQSV9ERUJVR19FWEVDKGFjcGlfdXRfaW5pdF9zdGFja19wdHJfdHJhY2UoKSk7Ci0KLQkvKiBJbml0aWFsaXplIHRoZSBPUy1EZXBlbmRlbnQgbGF5ZXIgKi8KLQotCXN0YXR1cyA9IGFjcGlfb3NfaW5pdGlhbGl6ZSgpOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlBQ1BJX0VYQ0VQVElPTigoQUVfSU5GTywgc3RhdHVzLCAiRHVyaW5nIE9TTCBpbml0aWFsaXphdGlvbiIpKTsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci0JfQotCi0JLyogSW5pdGlhbGl6ZSBhbGwgZ2xvYmFscyB1c2VkIGJ5IHRoZSBzdWJzeXN0ZW0gKi8KLQotCXN0YXR1cyA9IGFjcGlfdXRfaW5pdF9nbG9iYWxzKCk7Ci0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCUFDUElfRVhDRVBUSU9OKChBRV9JTkZPLCBzdGF0dXMsCi0JCQkJIkR1cmluZyBpbml0aWFsaXphdGlvbiBvZiBnbG9iYWxzIikpOwotCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLQl9Ci0KLQkvKiBDcmVhdGUgdGhlIGRlZmF1bHQgbXV0ZXggb2JqZWN0cyAqLwotCi0Jc3RhdHVzID0gYWNwaV91dF9tdXRleF9pbml0aWFsaXplKCk7Ci0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCUFDUElfRVhDRVBUSU9OKChBRV9JTkZPLCBzdGF0dXMsCi0JCQkJIkR1cmluZyBHbG9iYWwgTXV0ZXggY3JlYXRpb24iKSk7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotCX0KLQotCS8qCi0JICogSW5pdGlhbGl6ZSB0aGUgbmFtZXNwYWNlIG1hbmFnZXIgYW5kCi0JICogdGhlIHJvb3Qgb2YgdGhlIG5hbWVzcGFjZSB0cmVlCi0JICovCi0Jc3RhdHVzID0gYWNwaV9uc19yb290X2luaXRpYWxpemUoKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJQUNQSV9FWENFUFRJT04oKEFFX0lORk8sIHN0YXR1cywKLQkJCQkiRHVyaW5nIE5hbWVzcGFjZSBpbml0aWFsaXphdGlvbiIpKTsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci0JfQotCi0JLyogSWYgY29uZmlndXJlZCwgaW5pdGlhbGl6ZSB0aGUgQU1MIGRlYnVnZ2VyICovCi0KLQlBQ1BJX0RFQlVHR0VSX0VYRUMoc3RhdHVzID0gYWNwaV9kYl9pbml0aWFsaXplKCkpOwotCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX2VuYWJsZV9zdWJzeXN0ZW0KLSAqCi0gKiBQQVJBTUVURVJTOiAgRmxhZ3MgICAgICAgICAgIC0gSW5pdC9lbmFibGUgT3B0aW9ucwotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKLSAqCi0gKiBERVNDUklQVElPTjogQ29tcGxldGVzIHRoZSBzdWJzeXN0ZW0gaW5pdGlhbGl6YXRpb24gaW5jbHVkaW5nIGhhcmR3YXJlLgotICogICAgICAgICAgICAgIFB1dHMgc3lzdGVtIGludG8gQUNQSSBtb2RlIGlmIGl0IGlzbid0IGFscmVhZHkuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWFjcGlfc3RhdHVzIGFjcGlfZW5hYmxlX3N1YnN5c3RlbSh1MzIgZmxhZ3MpCi17Ci0JYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGFjcGlfZW5hYmxlX3N1YnN5c3RlbSk7Ci0KLQkvKiBFbmFibGUgQUNQSSBtb2RlICovCi0KLQlpZiAoIShmbGFncyAmIEFDUElfTk9fQUNQSV9FTkFCTEUpKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVhFQywKLQkJCQkgICJbSW5pdF0gR29pbmcgaW50byBBQ1BJIG1vZGVcbiIpKTsKLQotCQlhY3BpX2dibF9vcmlnaW5hbF9tb2RlID0gYWNwaV9od19nZXRfbW9kZSgpOwotCi0JCXN0YXR1cyA9IGFjcGlfZW5hYmxlKCk7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQkJQUNQSV9XQVJOSU5HKChBRV9JTkZPLCAiQWNwaUVuYWJsZSBmYWlsZWQiKSk7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLQkJfQotCX0KLQotCS8qCi0JICogSW5zdGFsbCB0aGUgZGVmYXVsdCBvcF9yZWdpb24gaGFuZGxlcnMuIFRoZXNlIGFyZSBpbnN0YWxsZWQgdW5sZXNzCi0JICogb3RoZXIgaGFuZGxlcnMgaGF2ZSBhbHJlYWR5IGJlZW4gaW5zdGFsbGVkIHZpYSB0aGUKLQkgKiBpbnN0YWxsX2FkZHJlc3Nfc3BhY2VfaGFuZGxlciBpbnRlcmZhY2UuCi0JICovCi0JaWYgKCEoZmxhZ3MgJiBBQ1BJX05PX0FERFJFU1NfU1BBQ0VfSU5JVCkpIHsKLQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FWEVDLAotCQkJCSAgIltJbml0XSBJbnN0YWxsaW5nIGRlZmF1bHQgYWRkcmVzcyBzcGFjZSBoYW5kbGVyc1xuIikpOwotCi0JCXN0YXR1cyA9IGFjcGlfZXZfaW5zdGFsbF9yZWdpb25faGFuZGxlcnMoKTsKLQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLQkJfQotCX0KLQotCS8qCi0JICogSW5pdGlhbGl6ZSBBQ1BJIEV2ZW50IGhhbmRsaW5nIChGaXhlZCBhbmQgR2VuZXJhbCBQdXJwb3NlKQotCSAqCi0JICogTm90ZTE6IFdlIG11c3QgaGF2ZSB0aGUgaGFyZHdhcmUgYW5kIGV2ZW50cyBpbml0aWFsaXplZCBiZWZvcmUgd2UgY2FuCi0JICogZXhlY3V0ZSBhbnkgY29udHJvbCBtZXRob2RzIHNhZmVseS4gQW55IGNvbnRyb2wgbWV0aG9kIGNhbiByZXF1aXJlCi0JICogQUNQSSBoYXJkd2FyZSBzdXBwb3J0LCBzbyB0aGUgaGFyZHdhcmUgbXVzdCBiZSBmdWxseSBpbml0aWFsaXplZCBiZWZvcmUKLQkgKiBhbnkgbWV0aG9kIGV4ZWN1dGlvbiEKLQkgKgotCSAqIE5vdGUyOiBGaXhlZCBldmVudHMgYXJlIGluaXRpYWxpemVkIGFuZCBlbmFibGVkIGhlcmUuIEdQRXMgYXJlCi0JICogaW5pdGlhbGl6ZWQsIGJ1dCBjYW5ub3QgYmUgZW5hYmxlZCB1bnRpbCBhZnRlciB0aGUgaGFyZHdhcmUgaXMKLQkgKiBjb21wbGV0ZWx5IGluaXRpYWxpemVkIChTQ0kgYW5kIGdsb2JhbF9sb2NrIGFjdGl2YXRlZCkKLQkgKi8KLQlpZiAoIShmbGFncyAmIEFDUElfTk9fRVZFTlRfSU5JVCkpIHsKLQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FWEVDLAotCQkJCSAgIltJbml0XSBJbml0aWFsaXppbmcgQUNQSSBldmVudHNcbiIpKTsKLQotCQlzdGF0dXMgPSBhY3BpX2V2X2luaXRpYWxpemVfZXZlbnRzKCk7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIEluc3RhbGwgdGhlIFNDSSBoYW5kbGVyIGFuZCBHbG9iYWwgTG9jayBoYW5kbGVyLiBUaGlzIGNvbXBsZXRlcyB0aGUKLQkgKiBoYXJkd2FyZSBpbml0aWFsaXphdGlvbi4KLQkgKi8KLQlpZiAoIShmbGFncyAmIEFDUElfTk9fSEFORExFUl9JTklUKSkgewotCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VYRUMsCi0JCQkJICAiW0luaXRdIEluc3RhbGxpbmcgU0NJL0dMIGhhbmRsZXJzXG4iKSk7Ci0KLQkJc3RhdHVzID0gYWNwaV9ldl9pbnN0YWxsX3hydXB0X2hhbmRsZXJzKCk7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci0JCX0KLQl9Ci0KLQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLX0KLQotQUNQSV9FWFBPUlRfU1lNQk9MKGFjcGlfZW5hYmxlX3N1YnN5c3RlbSkKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9pbml0aWFsaXplX29iamVjdHMKLSAqCi0gKiBQQVJBTUVURVJTOiAgRmxhZ3MgICAgICAgICAgIC0gSW5pdC9lbmFibGUgT3B0aW9ucwotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKLSAqCi0gKiBERVNDUklQVElPTjogQ29tcGxldGVzIG5hbWVzcGFjZSBpbml0aWFsaXphdGlvbiBieSBpbml0aWFsaXppbmcgZGV2aWNlCi0gKiAgICAgICAgICAgICAgb2JqZWN0cyBhbmQgZXhlY3V0aW5nIEFNTCBjb2RlIGZvciBSZWdpb25zLCBidWZmZXJzLCBldGMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWFjcGlfc3RhdHVzIGFjcGlfaW5pdGlhbGl6ZV9vYmplY3RzKHUzMiBmbGFncykKLXsKLQlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UoYWNwaV9pbml0aWFsaXplX29iamVjdHMpOwotCi0JLyoKLQkgKiBSdW4gYWxsIF9SRUcgbWV0aG9kcwotCSAqCi0JICogTm90ZTogQW55IG9iamVjdHMgYWNjZXNzZWQgYnkgdGhlIF9SRUcgbWV0aG9kcyB3aWxsIGJlIGF1dG9tYXRpY2FsbHkKLQkgKiBpbml0aWFsaXplZCwgZXZlbiBpZiB0aGV5IGNvbnRhaW4gZXhlY3V0YWJsZSBBTUwgKHNlZSB0aGUgY2FsbCB0bwotCSAqIGFjcGlfbnNfaW5pdGlhbGl6ZV9vYmplY3RzIGJlbG93KS4KLQkgKi8KLQlpZiAoIShmbGFncyAmIEFDUElfTk9fQUREUkVTU19TUEFDRV9JTklUKSkgewotCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VYRUMsCi0JCQkJICAiW0luaXRdIEV4ZWN1dGluZyBfUkVHIE9wUmVnaW9uIG1ldGhvZHNcbiIpKTsKLQotCQlzdGF0dXMgPSBhY3BpX2V2X2luaXRpYWxpemVfb3BfcmVnaW9ucygpOwotCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBJbml0aWFsaXplIHRoZSBvYmplY3RzIHRoYXQgcmVtYWluIHVuaW5pdGlhbGl6ZWQuIFRoaXMgcnVucyB0aGUKLQkgKiBleGVjdXRhYmxlIEFNTCB0aGF0IG1heSBiZSBwYXJ0IG9mIHRoZSBkZWNsYXJhdGlvbiBvZiB0aGVzZSBvYmplY3RzOgotCSAqIG9wZXJhdGlvbl9yZWdpb25zLCBidWZmZXJfZmllbGRzLCBCdWZmZXJzLCBhbmQgUGFja2FnZXMuCi0JICovCi0JaWYgKCEoZmxhZ3MgJiBBQ1BJX05PX09CSkVDVF9JTklUKSkgewotCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VYRUMsCi0JCQkJICAiW0luaXRdIENvbXBsZXRpbmcgSW5pdGlhbGl6YXRpb24gb2YgQUNQSSBPYmplY3RzXG4iKSk7Ci0KLQkJc3RhdHVzID0gYWNwaV9uc19pbml0aWFsaXplX29iamVjdHMoKTsKLQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLQkJfQotCX0KLQotCS8qCi0JICogSW5pdGlhbGl6ZSBhbGwgZGV2aWNlIG9iamVjdHMgaW4gdGhlIG5hbWVzcGFjZS4gVGhpcyBydW5zIHRoZSBkZXZpY2UKLQkgKiBfU1RBIGFuZCBfSU5JIG1ldGhvZHMuCi0JICovCi0JaWYgKCEoZmxhZ3MgJiBBQ1BJX05PX0RFVklDRV9JTklUKSkgewotCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VYRUMsCi0JCQkJICAiW0luaXRdIEluaXRpYWxpemluZyBBQ1BJIERldmljZXNcbiIpKTsKLQotCQlzdGF0dXMgPSBhY3BpX25zX2luaXRpYWxpemVfZGV2aWNlcygpOwotCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBDb21wbGV0ZSB0aGUgR1BFIGluaXRpYWxpemF0aW9uIGZvciB0aGUgR1BFIGJsb2NrcyBkZWZpbmVkIGluIHRoZSBGQURUCi0JICogKEdQRSBibG9jayAwIGFuZCAxKS4KLQkgKgotCSAqIE5vdGUxOiBUaGlzIGlzIHdoZXJlIHRoZSBfUFJXIG1ldGhvZHMgYXJlIGV4ZWN1dGVkIGZvciB0aGUgR1BFcy4gVGhlc2UKLQkgKiBtZXRob2RzIGNhbiBvbmx5IGJlIGV4ZWN1dGVkIGFmdGVyIHRoZSBTQ0kgYW5kIEdsb2JhbCBMb2NrIGhhbmRsZXJzIGFyZQotCSAqIGluc3RhbGxlZCBhbmQgaW5pdGlhbGl6ZWQuCi0JICoKLQkgKiBOb3RlMjogQ3VycmVudGx5LCB0aGVyZSBzZWVtcyB0byBiZSBubyBuZWVkIHRvIHJ1biB0aGUgX1JFRyBtZXRob2RzCi0JICogYmVmb3JlIGV4ZWN1dGlvbiBvZiB0aGUgX1BSVyBtZXRob2RzIGFuZCBlbmFibGluZyBvZiB0aGUgR1BFcy4KLQkgKi8KLQlpZiAoIShmbGFncyAmIEFDUElfTk9fRVZFTlRfSU5JVCkpIHsKLQkJc3RhdHVzID0gYWNwaV9ldl9pbnN0YWxsX2ZhZHRfZ3BlcygpOwotCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpCi0JCQlyZXR1cm4gKHN0YXR1cyk7Ci0JfQotCi0JLyoKLQkgKiBFbXB0eSB0aGUgY2FjaGVzIChkZWxldGUgdGhlIGNhY2hlZCBvYmplY3RzKSBvbiB0aGUgYXNzdW1wdGlvbiB0aGF0Ci0JICogdGhlIHRhYmxlIGxvYWQgZmlsbGVkIHRoZW0gdXAgbW9yZSB0aGFuIHRoZXkgd2lsbCBiZSBhdCBydW50aW1lIC0tCi0JICogdGh1cyB3YXN0aW5nIG5vbi1wYWdlZCBtZW1vcnkuCi0JICovCi0Jc3RhdHVzID0gYWNwaV9wdXJnZV9jYWNoZWRfb2JqZWN0cygpOwotCi0JYWNwaV9nYmxfc3RhcnR1cF9mbGFncyB8PSBBQ1BJX0lOSVRJQUxJWkVEX09LOwotCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotfQotCi1BQ1BJX0VYUE9SVF9TWU1CT0woYWNwaV9pbml0aWFsaXplX29iamVjdHMpCi0KLSNlbmRpZgotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV90ZXJtaW5hdGUKLSAqCi0gKiBQQVJBTUVURVJTOiAgTm9uZQotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKLSAqCi0gKiBERVNDUklQVElPTjogU2h1dGRvd24gdGhlIEFDUEkgc3Vic3lzdGVtLiAgUmVsZWFzZSBhbGwgcmVzb3VyY2VzLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1hY3BpX3N0YXR1cyBhY3BpX3Rlcm1pbmF0ZSh2b2lkKQotewotCWFjcGlfc3RhdHVzIHN0YXR1czsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UoYWNwaV90ZXJtaW5hdGUpOwotCi0JLyogVGVybWluYXRlIHRoZSBBTUwgRGVidWdnZXIgaWYgcHJlc2VudCAqLwotCi0JQUNQSV9ERUJVR0dFUl9FWEVDKGFjcGlfZ2JsX2RiX3Rlcm1pbmF0ZV90aHJlYWRzID0gVFJVRSk7Ci0KLQkvKiBTaHV0ZG93biBhbmQgZnJlZSBhbGwgcmVzb3VyY2VzICovCi0KLQlhY3BpX3V0X3N1YnN5c3RlbV9zaHV0ZG93bigpOwotCi0JLyogRnJlZSB0aGUgbXV0ZXggb2JqZWN0cyAqLwotCi0JYWNwaV91dF9tdXRleF90ZXJtaW5hdGUoKTsKLQotI2lmZGVmIEFDUElfREVCVUdHRVIKLQotCS8qIFNodXQgZG93biB0aGUgZGVidWdnZXIgKi8KLQotCWFjcGlfZGJfdGVybWluYXRlKCk7Ci0jZW5kaWYKLQotCS8qIE5vdyB3ZSBjYW4gc2h1dGRvd24gdGhlIE9TLWRlcGVuZGVudCBsYXllciAqLwotCi0Jc3RhdHVzID0gYWNwaV9vc190ZXJtaW5hdGUoKTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLX0KLQotQUNQSV9FWFBPUlRfU1lNQk9MKGFjcGlfdGVybWluYXRlKQotI2lmbmRlZiBBQ1BJX0FTTF9DT01QSUxFUgotI2lmZGVmIEFDUElfRlVUVVJFX1VTQUdFCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX3N1YnN5c3RlbV9zdGF0dXMKLSAqCi0gKiBQQVJBTUVURVJTOiAgTm9uZQotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMgb2YgdGhlIEFDUEkgc3Vic3lzdGVtCi0gKgotICogREVTQ1JJUFRJT046IE90aGVyIGRyaXZlcnMgdGhhdCB1c2UgdGhlIEFDUEkgc3Vic3lzdGVtIHNob3VsZCBjYWxsIHRoaXMKLSAqICAgICAgICAgICAgICBiZWZvcmUgbWFraW5nIGFueSBvdGhlciBjYWxscywgdG8gZW5zdXJlIHRoZSBzdWJzeXN0ZW0KLSAqICAgICAgICAgICAgICBpbml0aWFsaXplZCBzdWNjZXNzZnVsbHkuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWFjcGlfc3RhdHVzIGFjcGlfc3Vic3lzdGVtX3N0YXR1cyh2b2lkKQotewotCi0JaWYgKGFjcGlfZ2JsX3N0YXJ0dXBfZmxhZ3MgJiBBQ1BJX0lOSVRJQUxJWkVEX09LKSB7Ci0JCXJldHVybiAoQUVfT0spOwotCX0gZWxzZSB7Ci0JCXJldHVybiAoQUVfRVJST1IpOwotCX0KLX0KLQotQUNQSV9FWFBPUlRfU1lNQk9MKGFjcGlfc3Vic3lzdGVtX3N0YXR1cykKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9nZXRfc3lzdGVtX2luZm8KLSAqCi0gKiBQQVJBTUVURVJTOiAgb3V0X2J1ZmZlciAgICAgIC0gQSBidWZmZXIgdG8gcmVjZWl2ZSB0aGUgcmVzb3VyY2VzIGZvciB0aGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UKLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzICAgICAgICAgIC0gdGhlIHN0YXR1cyBvZiB0aGUgY2FsbAotICoKLSAqIERFU0NSSVBUSU9OOiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBnZXQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGN1cnJlbnQKLSAqICAgICAgICAgICAgICBzdGF0ZSBvZiB0aGUgQUNQSSBzdWJzeXN0ZW0uICBJdCB3aWxsIHJldHVybiBzeXN0ZW0gaW5mb3JtYXRpb24KLSAqICAgICAgICAgICAgICBpbiB0aGUgb3V0X2J1ZmZlci4KLSAqCi0gKiAgICAgICAgICAgICAgSWYgdGhlIGZ1bmN0aW9uIGZhaWxzIGFuIGFwcHJvcHJpYXRlIHN0YXR1cyB3aWxsIGJlIHJldHVybmVkCi0gKiAgICAgICAgICAgICAgYW5kIHRoZSB2YWx1ZSBvZiBvdXRfYnVmZmVyIGlzIHVuZGVmaW5lZC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYWNwaV9zdGF0dXMgYWNwaV9nZXRfc3lzdGVtX2luZm8oc3RydWN0IGFjcGlfYnVmZmVyICogb3V0X2J1ZmZlcikKLXsKLQlzdHJ1Y3QgYWNwaV9zeXN0ZW1faW5mbyAqaW5mb19wdHI7Ci0JYWNwaV9zdGF0dXMgc3RhdHVzOwotCi0JQUNQSV9GVU5DVElPTl9UUkFDRShhY3BpX2dldF9zeXN0ZW1faW5mbyk7Ci0KLQkvKiBQYXJhbWV0ZXIgdmFsaWRhdGlvbiAqLwotCi0Jc3RhdHVzID0gYWNwaV91dF92YWxpZGF0ZV9idWZmZXIob3V0X2J1ZmZlcik7Ci0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotCX0KLQotCS8qIFZhbGlkYXRlL0FsbG9jYXRlL0NsZWFyIGNhbGxlciBidWZmZXIgKi8KLQotCXN0YXR1cyA9Ci0JICAgIGFjcGlfdXRfaW5pdGlhbGl6ZV9idWZmZXIob3V0X2J1ZmZlciwKLQkJCQkgICAgICBzaXplb2Yoc3RydWN0IGFjcGlfc3lzdGVtX2luZm8pKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci0JfQotCi0JLyoKLQkgKiBQb3B1bGF0ZSB0aGUgcmV0dXJuIGJ1ZmZlcgotCSAqLwotCWluZm9fcHRyID0gKHN0cnVjdCBhY3BpX3N5c3RlbV9pbmZvICopb3V0X2J1ZmZlci0+cG9pbnRlcjsKLQotCWluZm9fcHRyLT5hY3BpX2NhX3ZlcnNpb24gPSBBQ1BJX0NBX1ZFUlNJT047Ci0KLQkvKiBTeXN0ZW0gZmxhZ3MgKEFDUEkgY2FwYWJpbGl0aWVzKSAqLwotCi0JaW5mb19wdHItPmZsYWdzID0gQUNQSV9TWVNfTU9ERV9BQ1BJOwotCi0JLyogVGltZXIgcmVzb2x1dGlvbiAtIDI0IG9yIDMyIGJpdHMgICovCi0KLQlpZiAoYWNwaV9nYmxfRkFEVC5mbGFncyAmIEFDUElfRkFEVF8zMkJJVF9USU1FUikgewotCQlpbmZvX3B0ci0+dGltZXJfcmVzb2x1dGlvbiA9IDI0OwotCX0gZWxzZSB7Ci0JCWluZm9fcHRyLT50aW1lcl9yZXNvbHV0aW9uID0gMzI7Ci0JfQotCi0JLyogQ2xlYXIgdGhlIHJlc2VydmVkIGZpZWxkcyAqLwotCi0JaW5mb19wdHItPnJlc2VydmVkMSA9IDA7Ci0JaW5mb19wdHItPnJlc2VydmVkMiA9IDA7Ci0KLQkvKiBDdXJyZW50IGRlYnVnIGxldmVscyAqLwotCi0JaW5mb19wdHItPmRlYnVnX2xheWVyID0gYWNwaV9kYmdfbGF5ZXI7Ci0JaW5mb19wdHItPmRlYnVnX2xldmVsID0gYWNwaV9kYmdfbGV2ZWw7Ci0KLQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwotfQotCi1BQ1BJX0VYUE9SVF9TWU1CT0woYWNwaV9nZXRfc3lzdGVtX2luZm8pCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX2luc3RhbGxfaW5pdGlhbGl6YXRpb25faGFuZGxlcgotICoKLSAqIFBBUkFNRVRFUlM6ICBIYW5kbGVyICAgICAgICAgICAgIC0gQ2FsbGJhY2sgcHJvY2VkdXJlCi0gKiAgICAgICAgICAgICAgRnVuY3Rpb24gICAgICAgICAgICAtIE5vdCAoY3VycmVudGx5KSB1c2VkLCBzZWUgYmVsb3cKLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IEluc3RhbGwgYW4gaW5pdGlhbGl6YXRpb24gaGFuZGxlcgotICoKLSAqIFRCRDogV2hlbiBhIHNlY29uZCBmdW5jdGlvbiBpcyBhZGRlZCwgbXVzdCBzYXZlIHRoZSBGdW5jdGlvbiBhbHNvLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYWNwaV9zdGF0dXMKLWFjcGlfaW5zdGFsbF9pbml0aWFsaXphdGlvbl9oYW5kbGVyKGFjcGlfaW5pdF9oYW5kbGVyIGhhbmRsZXIsIHUzMiBmdW5jdGlvbikKLXsKLQotCWlmICghaGFuZGxlcikgewotCQlyZXR1cm4gKEFFX0JBRF9QQVJBTUVURVIpOwotCX0KLQotCWlmIChhY3BpX2dibF9pbml0X2hhbmRsZXIpIHsKLQkJcmV0dXJuIChBRV9BTFJFQURZX0VYSVNUUyk7Ci0JfQotCi0JYWNwaV9nYmxfaW5pdF9oYW5kbGVyID0gaGFuZGxlcjsKLQlyZXR1cm4gQUVfT0s7Ci19Ci0KLUFDUElfRVhQT1JUX1NZTUJPTChhY3BpX2luc3RhbGxfaW5pdGlhbGl6YXRpb25faGFuZGxlcikKLSNlbmRpZgkJCQkvKiAgQUNQSV9GVVRVUkVfVVNBR0UgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9wdXJnZV9jYWNoZWRfb2JqZWN0cwotICoKLSAqIFBBUkFNRVRFUlM6ICBOb25lCi0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cwotICoKLSAqIERFU0NSSVBUSU9OOiBFbXB0eSBhbGwgY2FjaGVzIChkZWxldGUgdGhlIGNhY2hlZCBvYmplY3RzKQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYWNwaV9zdGF0dXMgYWNwaV9wdXJnZV9jYWNoZWRfb2JqZWN0cyh2b2lkKQotewotCUFDUElfRlVOQ1RJT05fVFJBQ0UoYWNwaV9wdXJnZV9jYWNoZWRfb2JqZWN0cyk7Ci0KLQkodm9pZClhY3BpX29zX3B1cmdlX2NhY2hlKGFjcGlfZ2JsX3N0YXRlX2NhY2hlKTsKLQkodm9pZClhY3BpX29zX3B1cmdlX2NhY2hlKGFjcGlfZ2JsX29wZXJhbmRfY2FjaGUpOwotCSh2b2lkKWFjcGlfb3NfcHVyZ2VfY2FjaGUoYWNwaV9nYmxfcHNfbm9kZV9jYWNoZSk7Ci0JKHZvaWQpYWNwaV9vc19wdXJnZV9jYWNoZShhY3BpX2dibF9wc19ub2RlX2V4dF9jYWNoZSk7Ci0JcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKLX0KLQotQUNQSV9FWFBPUlRfU1lNQk9MKGFjcGlfcHVyZ2VfY2FjaGVkX29iamVjdHMpCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS92aWRlby5jIGIvZHJpdmVycy9hY3BpL3ZpZGVvLmMKaW5kZXggYmFhNDQxOS4uZjI2MTczNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3ZpZGVvLmMKKysrIGIvZHJpdmVycy9hY3BpL3ZpZGVvLmMKQEAgLTM2LDYgKzM2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9iYWNrbGlnaHQuaD4KICNpbmNsdWRlIDxsaW51eC90aGVybWFsLmg+CiAjaW5jbHVkZSA8bGludXgvdmlkZW9fb3V0cHV0Lmg+CisjaW5jbHVkZSA8bGludXgvc29ydC5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAKICNpbmNsdWRlIDxhY3BpL2FjcGlfYnVzLmg+CkBAIC00ODEsNiArNDgyLDcgQEAKIAlpbnQgc3RhdHVzID0gQUVfT0s7CiAJdW5pb24gYWNwaV9vYmplY3QgYXJnMCA9IHsgQUNQSV9UWVBFX0lOVEVHRVIgfTsKIAlzdHJ1Y3QgYWNwaV9vYmplY3RfbGlzdCBhcmdzID0geyAxLCAmYXJnMCB9OworCWludCBzdGF0ZTsKIAogCiAJYXJnMC5pbnRlZ2VyLnZhbHVlID0gbGV2ZWw7CkBAIC00ODksNiArNDkxLDEwIEBACiAJCXN0YXR1cyA9IGFjcGlfZXZhbHVhdGVfb2JqZWN0KGRldmljZS0+ZGV2LT5oYW5kbGUsICJfQkNNIiwKIAkJCQkJICAgICAgJmFyZ3MsIE5VTEwpOwogCWRldmljZS0+YnJpZ2h0bmVzcy0+Y3VyciA9IGxldmVsOworCWZvciAoc3RhdGUgPSAyOyBzdGF0ZSA8IGRldmljZS0+YnJpZ2h0bmVzcy0+Y291bnQ7IHN0YXRlKyspCisJCWlmIChsZXZlbCA9PSBkZXZpY2UtPmJyaWdodG5lc3MtPmxldmVsc1tzdGF0ZV0pCisJCQlkZXZpY2UtPmJhY2tsaWdodC0+cHJvcHMuYnJpZ2h0bmVzcyA9IHN0YXRlIC0gMjsKKwogCXJldHVybiBzdGF0dXM7CiB9CiAKQEAgLTYyNiw2ICs2MzIsMTYgQEAKIH0KIAogLyoKKyAqIFNpbXBsZSBjb21wYXJpc29uIGZ1bmN0aW9uIHVzZWQgdG8gc29ydCBiYWNrbGlnaHQgbGV2ZWxzLgorICovCisKK3N0YXRpYyBpbnQKK2FjcGlfdmlkZW9fY21wX2xldmVsKGNvbnN0IHZvaWQgKmEsIGNvbnN0IHZvaWQgKmIpCit7CisJcmV0dXJuICooaW50ICopYSAtICooaW50ICopYjsKK30KKworLyoKICAqICBBcmc6CQogICogIAlkZXZpY2UJOiB2aWRlbyBvdXRwdXQgZGV2aWNlIChMQ0QsIENSVCwgLi4pCiAgKgpAQCAtNjc2LDYgKzY5MiwxMCBAQAogCQljb3VudCsrOwogCX0KIAorCS8qIGRvbid0IHNvcnQgdGhlIGZpcnN0IHR3byBicmlnaHRuZXNzIGxldmVscyAqLworCXNvcnQoJmJyLT5sZXZlbHNbMl0sIGNvdW50IC0gMiwgc2l6ZW9mKGJyLT5sZXZlbHNbMl0pLAorCQlhY3BpX3ZpZGVvX2NtcF9sZXZlbCwgTlVMTCk7CisKIAlpZiAoY291bnQgPCAyKQogCQlnb3RvIG91dF9mcmVlX2xldmVsczsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3ZpZGVvX2RldGVjdC5jIGIvZHJpdmVycy9hY3BpL3ZpZGVvX2RldGVjdC5jCmluZGV4IGYwMjJlYjYuLjUwZTNkMmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS92aWRlb19kZXRlY3QuYworKysgYi9kcml2ZXJzL2FjcGkvdmlkZW9fZGV0ZWN0LmMKQEAgLTIzNCw3ICsyMzQsNyBAQAogICogVG8gZm9yY2UgdGhhdCBiYWNrbGlnaHQgb3IgZGlzcGxheSBvdXRwdXQgc3dpdGNoaW5nIGlzIHByb2Nlc3NlZCBieSB2ZW5kb3IKICAqIHNwZWNpZmljIGFjcGkgZHJpdmVycyBvciB2aWRlby5rbyBkcml2ZXIuCiAgKi8KLWludCBfX2luaXQgYWNwaV9iYWNrbGlnaHQoY2hhciAqc3RyKQorc3RhdGljIGludCBfX2luaXQgYWNwaV9iYWNrbGlnaHQoY2hhciAqc3RyKQogewogCWlmIChzdHIgPT0gTlVMTCB8fCAqc3RyID09ICdcMCcpCiAJCXJldHVybiAxOwpAQCAtMjUwLDcgKzI1MCw3IEBACiB9CiBfX3NldHVwKCJhY3BpX2JhY2tsaWdodD0iLCBhY3BpX2JhY2tsaWdodCk7CiAKLWludCBfX2luaXQgYWNwaV9kaXNwbGF5X291dHB1dChjaGFyICpzdHIpCitzdGF0aWMgaW50IF9faW5pdCBhY3BpX2Rpc3BsYXlfb3V0cHV0KGNoYXIgKnN0cikKIHsKIAlpZiAoc3RyID09IE5VTEwgfHwgKnN0ciA9PSAnXDAnKQogCQlyZXR1cm4gMTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS93YWtldXAuYyBiL2RyaXZlcnMvYWNwaS93YWtldXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDM0ODA2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9hY3BpL3dha2V1cC5jCkBAIC0wLDAgKzEsMTY3IEBACisvKgorICogd2FrZXVwLmMgLSBzdXBwb3J0IHdha2V1cCBkZXZpY2VzCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgTGkgU2hhb2h1YSA8c2hhb2h1YS5saUBpbnRlbC5jb20+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9hY3BpLmg+CisjaW5jbHVkZSA8YWNwaS9hY3BpX2RyaXZlcnMuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgInNsZWVwLmgiCisKKyNkZWZpbmUgX0NPTVBPTkVOVAkJQUNQSV9TWVNURU1fQ09NUE9ORU5UCitBQ1BJX01PRFVMRV9OQU1FKCJ3YWtldXBfZGV2aWNlcyIpCisKK2V4dGVybiBzdHJ1Y3QgbGlzdF9oZWFkIGFjcGlfd2FrZXVwX2RldmljZV9saXN0OworZXh0ZXJuIHNwaW5sb2NrX3QgYWNwaV9kZXZpY2VfbG9jazsKKworLyoqCisgKiBhY3BpX2VuYWJsZV93YWtldXBfZGV2aWNlX3ByZXAgLSBwcmVwYXJlIHdha2V1cCBkZXZpY2VzCisgKglAc2xlZXBfc3RhdGU6CUFDUEkgc3RhdGUKKyAqIEVuYWJsZSBhbGwgd2FrdXAgZGV2aWNlcyBwb3dlciBpZiB0aGUgZGV2aWNlcycgd2FrZXVwIGxldmVsCisgKiBpcyBoaWdoZXIgdGhhbiByZXF1ZXN0ZWQgc2xlZXAgbGV2ZWwKKyAqLworCit2b2lkIGFjcGlfZW5hYmxlX3dha2V1cF9kZXZpY2VfcHJlcCh1OCBzbGVlcF9zdGF0ZSkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpub2RlLCAqbmV4dDsKKworCXNwaW5fbG9jaygmYWNwaV9kZXZpY2VfbG9jayk7CisJbGlzdF9mb3JfZWFjaF9zYWZlKG5vZGUsIG5leHQsICZhY3BpX3dha2V1cF9kZXZpY2VfbGlzdCkgeworCQlzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldiA9IGNvbnRhaW5lcl9vZihub2RlLAorCQkJCQkJICAgICAgIHN0cnVjdCBhY3BpX2RldmljZSwKKwkJCQkJCSAgICAgICB3YWtldXBfbGlzdCk7CisKKwkJaWYgKCFkZXYtPndha2V1cC5mbGFncy52YWxpZCB8fAorCQkgICAgIWRldi0+d2FrZXVwLnN0YXRlLmVuYWJsZWQgfHwKKwkJICAgIChzbGVlcF9zdGF0ZSA+ICh1MzIpIGRldi0+d2FrZXVwLnNsZWVwX3N0YXRlKSkKKwkJCWNvbnRpbnVlOworCisJCXNwaW5fdW5sb2NrKCZhY3BpX2RldmljZV9sb2NrKTsKKwkJYWNwaV9lbmFibGVfd2FrZXVwX2RldmljZV9wb3dlcihkZXYsIHNsZWVwX3N0YXRlKTsKKwkJc3Bpbl9sb2NrKCZhY3BpX2RldmljZV9sb2NrKTsKKwl9CisJc3Bpbl91bmxvY2soJmFjcGlfZGV2aWNlX2xvY2spOworfQorCisvKioKKyAqIGFjcGlfZW5hYmxlX3dha2V1cF9kZXZpY2UgLSBlbmFibGUgd2FrZXVwIGRldmljZXMKKyAqCUBzbGVlcF9zdGF0ZToJQUNQSSBzdGF0ZQorICogRW5hYmxlIGFsbCB3YWt1cCBkZXZpY2VzJ3MgR1BFCisgKi8KK3ZvaWQgYWNwaV9lbmFibGVfd2FrZXVwX2RldmljZSh1OCBzbGVlcF9zdGF0ZSkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpub2RlLCAqbmV4dDsKKworCS8qIAorCSAqIENhdXRpb246IHRoaXMgcm91dGluZSBtdXN0IGJlIGludm9rZWQgd2hlbiBpbnRlcnJ1cHQgaXMgZGlzYWJsZWQgCisJICogUmVmZXIgQUNQSTIuMDogUDIxMgorCSAqLworCXNwaW5fbG9jaygmYWNwaV9kZXZpY2VfbG9jayk7CisJbGlzdF9mb3JfZWFjaF9zYWZlKG5vZGUsIG5leHQsICZhY3BpX3dha2V1cF9kZXZpY2VfbGlzdCkgeworCQlzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldiA9CisJCQljb250YWluZXJfb2Yobm9kZSwgc3RydWN0IGFjcGlfZGV2aWNlLCB3YWtldXBfbGlzdCk7CisKKwkJaWYgKCFkZXYtPndha2V1cC5mbGFncy52YWxpZCkKKwkJCWNvbnRpbnVlOworCisJCS8qIElmIHVzZXJzIHdhbnQgdG8gZGlzYWJsZSBydW4td2FrZSBHUEUsCisJCSAqIHdlIG9ubHkgZGlzYWJsZSBpdCBmb3Igd2FrZSBhbmQgbGVhdmUgaXQgZm9yIHJ1bnRpbWUKKwkJICovCisJCWlmICgoIWRldi0+d2FrZXVwLnN0YXRlLmVuYWJsZWQgJiYgIWRldi0+d2FrZXVwLmZsYWdzLnByZXBhcmVkKQorCQkgICAgfHwgc2xlZXBfc3RhdGUgPiAodTMyKSBkZXYtPndha2V1cC5zbGVlcF9zdGF0ZSkgeworCQkJaWYgKGRldi0+d2FrZXVwLmZsYWdzLnJ1bl93YWtlKSB7CisJCQkJc3Bpbl91bmxvY2soJmFjcGlfZGV2aWNlX2xvY2spOworCQkJCS8qIHNldF9ncGVfdHlwZSB3aWxsIGRpc2FibGUgR1BFLCBsZWF2ZSBpdCBsaWtlIHRoYXQgKi8KKwkJCQlhY3BpX3NldF9ncGVfdHlwZShkZXYtPndha2V1cC5ncGVfZGV2aWNlLAorCQkJCQkJICBkZXYtPndha2V1cC5ncGVfbnVtYmVyLAorCQkJCQkJICBBQ1BJX0dQRV9UWVBFX1JVTlRJTUUpOworCQkJCXNwaW5fbG9jaygmYWNwaV9kZXZpY2VfbG9jayk7CisJCQl9CisJCQljb250aW51ZTsKKwkJfQorCQlzcGluX3VubG9jaygmYWNwaV9kZXZpY2VfbG9jayk7CisJCWlmICghZGV2LT53YWtldXAuZmxhZ3MucnVuX3dha2UpCisJCQlhY3BpX2VuYWJsZV9ncGUoZGV2LT53YWtldXAuZ3BlX2RldmljZSwKKwkJCQkJZGV2LT53YWtldXAuZ3BlX251bWJlcik7CisJCXNwaW5fbG9jaygmYWNwaV9kZXZpY2VfbG9jayk7CisJfQorCXNwaW5fdW5sb2NrKCZhY3BpX2RldmljZV9sb2NrKTsKK30KKworLyoqCisgKiBhY3BpX2Rpc2FibGVfd2FrZXVwX2RldmljZSAtIGRpc2FibGUgZGV2aWNlcycgd2FrZXVwIGNhcGFiaWxpdHkKKyAqCUBzbGVlcF9zdGF0ZToJQUNQSSBzdGF0ZQorICogRGlzYWJsZSBhbGwgd2FrdXAgZGV2aWNlcydzIEdQRSBhbmQgd2FrZXVwIGNhcGFiaWxpdHkKKyAqLwordm9pZCBhY3BpX2Rpc2FibGVfd2FrZXVwX2RldmljZSh1OCBzbGVlcF9zdGF0ZSkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpub2RlLCAqbmV4dDsKKworCXNwaW5fbG9jaygmYWNwaV9kZXZpY2VfbG9jayk7CisJbGlzdF9mb3JfZWFjaF9zYWZlKG5vZGUsIG5leHQsICZhY3BpX3dha2V1cF9kZXZpY2VfbGlzdCkgeworCQlzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldiA9CisJCQljb250YWluZXJfb2Yobm9kZSwgc3RydWN0IGFjcGlfZGV2aWNlLCB3YWtldXBfbGlzdCk7CisKKwkJaWYgKCFkZXYtPndha2V1cC5mbGFncy52YWxpZCkKKwkJCWNvbnRpbnVlOworCisJCWlmICgoIWRldi0+d2FrZXVwLnN0YXRlLmVuYWJsZWQgJiYgIWRldi0+d2FrZXVwLmZsYWdzLnByZXBhcmVkKQorCQkgICAgfHwgc2xlZXBfc3RhdGUgPiAodTMyKSBkZXYtPndha2V1cC5zbGVlcF9zdGF0ZSkgeworCQkJaWYgKGRldi0+d2FrZXVwLmZsYWdzLnJ1bl93YWtlKSB7CisJCQkJc3Bpbl91bmxvY2soJmFjcGlfZGV2aWNlX2xvY2spOworCQkJCWFjcGlfc2V0X2dwZV90eXBlKGRldi0+d2FrZXVwLmdwZV9kZXZpY2UsCisJCQkJCQkgIGRldi0+d2FrZXVwLmdwZV9udW1iZXIsCisJCQkJCQkgIEFDUElfR1BFX1RZUEVfV0FLRV9SVU4pOworCQkJCS8qIFJlLWVuYWJsZSBpdCwgc2luY2Ugc2V0X2dwZV90eXBlIHdpbGwgZGlzYWJsZSBpdCAqLworCQkJCWFjcGlfZW5hYmxlX2dwZShkZXYtPndha2V1cC5ncGVfZGV2aWNlLAorCQkJCQkJZGV2LT53YWtldXAuZ3BlX251bWJlcik7CisJCQkJc3Bpbl9sb2NrKCZhY3BpX2RldmljZV9sb2NrKTsKKwkJCX0KKwkJCWNvbnRpbnVlOworCQl9CisKKwkJc3Bpbl91bmxvY2soJmFjcGlfZGV2aWNlX2xvY2spOworCQlhY3BpX2Rpc2FibGVfd2FrZXVwX2RldmljZV9wb3dlcihkZXYpOworCQkvKiBOZXZlciBkaXNhYmxlIHJ1bi13YWtlIEdQRSAqLworCQlpZiAoIWRldi0+d2FrZXVwLmZsYWdzLnJ1bl93YWtlKSB7CisJCQlhY3BpX2Rpc2FibGVfZ3BlKGRldi0+d2FrZXVwLmdwZV9kZXZpY2UsCisJCQkJCSBkZXYtPndha2V1cC5ncGVfbnVtYmVyKTsKKwkJCWFjcGlfY2xlYXJfZ3BlKGRldi0+d2FrZXVwLmdwZV9kZXZpY2UsCisJCQkJICAgICAgIGRldi0+d2FrZXVwLmdwZV9udW1iZXIsIEFDUElfTk9UX0lTUik7CisJCX0KKwkJc3Bpbl9sb2NrKCZhY3BpX2RldmljZV9sb2NrKTsKKwl9CisJc3Bpbl91bmxvY2soJmFjcGlfZGV2aWNlX2xvY2spOworfQorCitzdGF0aWMgaW50IF9faW5pdCBhY3BpX3dha2V1cF9kZXZpY2VfaW5pdCh2b2lkKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKm5vZGUsICpuZXh0OworCisJaWYgKGFjcGlfZGlzYWJsZWQpCisJCXJldHVybiAwOworCisJc3Bpbl9sb2NrKCZhY3BpX2RldmljZV9sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX3NhZmUobm9kZSwgbmV4dCwgJmFjcGlfd2FrZXVwX2RldmljZV9saXN0KSB7CisJCXN0cnVjdCBhY3BpX2RldmljZSAqZGV2ID0gY29udGFpbmVyX29mKG5vZGUsCisJCQkJCQkgICAgICAgc3RydWN0IGFjcGlfZGV2aWNlLAorCQkJCQkJICAgICAgIHdha2V1cF9saXN0KTsKKwkJLyogSW4gY2FzZSB1c2VyIGRvZXNuJ3QgbG9hZCBidXR0b24gZHJpdmVyICovCisJCWlmICghZGV2LT53YWtldXAuZmxhZ3MucnVuX3dha2UgfHwgZGV2LT53YWtldXAuc3RhdGUuZW5hYmxlZCkKKwkJCWNvbnRpbnVlOworCQlzcGluX3VubG9jaygmYWNwaV9kZXZpY2VfbG9jayk7CisJCWFjcGlfc2V0X2dwZV90eXBlKGRldi0+d2FrZXVwLmdwZV9kZXZpY2UsCisJCQkJICBkZXYtPndha2V1cC5ncGVfbnVtYmVyLAorCQkJCSAgQUNQSV9HUEVfVFlQRV9XQUtFX1JVTik7CisJCWFjcGlfZW5hYmxlX2dwZShkZXYtPndha2V1cC5ncGVfZGV2aWNlLAorCQkJCWRldi0+d2FrZXVwLmdwZV9udW1iZXIpOworCQlkZXYtPndha2V1cC5zdGF0ZS5lbmFibGVkID0gMTsKKwkJc3Bpbl9sb2NrKCZhY3BpX2RldmljZV9sb2NrKTsKKwl9CisJc3Bpbl91bmxvY2soJmFjcGlfZGV2aWNlX2xvY2spOworCXJldHVybiAwOworfQorCitsYXRlX2luaXRjYWxsKGFjcGlfd2FrZXVwX2RldmljZV9pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYW1iYS9idXMuYyBiL2RyaXZlcnMvYW1iYS9idXMuYwppbmRleCA2Yjk0ZmI3Li4wMGM0NmUwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FtYmEvYnVzLmMKKysrIGIvZHJpdmVycy9hbWJhL2J1cy5jCkBAIC0xMiw5ICsxMiwxMCBAQAogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L2FtYmEvYnVzLmg+CiAKLSNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CiAjaW5jbHVkZSA8YXNtL3NpemVzLmg+CiAKICNkZWZpbmUgdG9fYW1iYV9kZXZpY2UoZCkJY29udGFpbmVyX29mKGQsIHN0cnVjdCBhbWJhX2RldmljZSwgZGV2KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvS2NvbmZpZyBiL2RyaXZlcnMvYXRhL0tjb25maWcKaW5kZXggMWE3YmU5Ni4uNTAzYTkwOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvS2NvbmZpZworKysgYi9kcml2ZXJzL2F0YS9LY29uZmlnCkBAIC02OTgsNiArNjk4LDE1IEBACiAKIAkgIElmIHVuc3VyZSwgc2F5IE4uCiAKK2NvbmZpZyBQQVRBX09DVEVPTl9DRgorCXRyaXN0YXRlICJPQ1RFT04gQm9vdCBCdXMgQ29tcGFjdCBGbGFzaCBzdXBwb3J0IgorCWRlcGVuZHMgb24gQ1BVX0NBVklVTV9PQ1RFT04KKwloZWxwCisJICBUaGlzIG9wdGlvbiBlbmFibGVzIGEgcG9sbGVkIGNvbXBhY3QgZmxhc2ggZHJpdmVyIGZvciB1c2Ugd2l0aAorCSAgY29tcGFjdCBmbGFzaCBjYXJkcyBhdHRhY2hlZCB0byB0aGUgT0NURU9OIGJvb3QgYnVzLgorCisJICBJZiB1bnN1cmUsIHNheSBOLgorCiBjb25maWcgUEFUQV9TQ0MKIAl0cmlzdGF0ZSAiVG9zaGliYSdzIENlbGwgUmVmZXJlbmNlIFNldCBJREUgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIFBDSSAmJiBQUENfQ0VMTEVCCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9NYWtlZmlsZSBiL2RyaXZlcnMvYXRhL01ha2VmaWxlCmluZGV4IDY3NDk2NWYuLjdmMWVjZjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvYXRhL01ha2VmaWxlCkBAIC02OSw2ICs2OSw3IEBACiBvYmotJChDT05GSUdfUEFUQV9TQ0MpCQkrPSBwYXRhX3NjYy5vCiBvYmotJChDT05GSUdfUEFUQV9TQ0gpCQkrPSBwYXRhX3NjaC5vCiBvYmotJChDT05GSUdfUEFUQV9CRjU0WCkJKz0gcGF0YV9iZjU0eC5vCitvYmotJChDT05GSUdfUEFUQV9PQ1RFT05fQ0YpCSs9IHBhdGFfb2N0ZW9uX2NmLm8KIG9iai0kKENPTkZJR19QQVRBX1BMQVRGT1JNKQkrPSBwYXRhX3BsYXRmb3JtLm8KIG9iai0kKENPTkZJR19QQVRBX09GX1BMQVRGT1JNKQkrPSBwYXRhX29mX3BsYXRmb3JtLm8KIG9iai0kKENPTkZJR19QQVRBX0lDU0lERSkJKz0gcGF0YV9pY3NpZGUubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvYWhjaS5jIGIvZHJpdmVycy9hdGEvYWhjaS5jCmluZGV4IDY1NjQ0OGMuLjk2MDM5NjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL2FoY2kuYworKysgYi9kcml2ZXJzL2F0YS9haGNpLmMKQEAgLTEwNSw3ICsxMDUsNyBAQAogCWJvYXJkX2FoY2lfaWduX2lmZXJyCT0gMiwKIAlib2FyZF9haGNpX3NiNjAwCT0gMywKIAlib2FyZF9haGNpX212CQk9IDQsCi0JYm9hcmRfYWhjaV9zYjcwMAk9IDUsCisJYm9hcmRfYWhjaV9zYjcwMAk9IDUsIC8qIGZvciBTQjcwMCBhbmQgU0I4MDAgKi8KIAlib2FyZF9haGNpX21jcDY1CT0gNiwKIAlib2FyZF9haGNpX25vcG1wCT0gNywKIApAQCAtNDM5LDcgKzQzOSw3IEBACiAJCS51ZG1hX21hc2sJPSBBVEFfVURNQTYsCiAJCS5wb3J0X29wcwk9ICZhaGNpX29wcywKIAl9LAotCS8qIGJvYXJkX2FoY2lfc2I3MDAgKi8KKwkvKiBib2FyZF9haGNpX3NiNzAwLCBmb3IgU0I3MDAgYW5kIFNCODAwICovCiAJewogCQlBSENJX0hGTEFHUwkoQUhDSV9IRkxBR19JR05fU0VSUl9JTlRFUk5BTCksCiAJCS5mbGFncwkJPSBBSENJX0ZMQUdfQ09NTU9OLApAQCAtMjQ0Niw2ICsyNDQ2LDggQEAKIAkJc3BlZWRfcyA9ICIxLjUiOwogCWVsc2UgaWYgKHNwZWVkID09IDIpCiAJCXNwZWVkX3MgPSAiMyI7CisJZWxzZSBpZiAoc3BlZWQgPT0gMykKKwkJc3BlZWRfcyA9ICI2IjsKIAllbHNlCiAJCXNwZWVkX3MgPSAiPyI7CiAKQEAgLTI2MTAsNiArMjYxMiwxMCBAQAogCSAgICAocGRldi0+cmV2aXNpb24gPT0gMHhhMSB8fCBwZGV2LT5yZXZpc2lvbiA9PSAweGEyKSkKIAkJaHByaXYtPmZsYWdzIHw9IEFIQ0lfSEZMQUdfTk9fTVNJOwogCisJLyogU0I4MDAgZG9lcyBOT1QgbmVlZCB0aGUgd29ya2Fyb3VuZCB0byBpZ25vcmUgU0VSUl9JTlRFUk5BTCAqLworCWlmIChib2FyZF9pZCA9PSBib2FyZF9haGNpX3NiNzAwICYmIHBkZXYtPnJldmlzaW9uID49IDB4NDApCisJCWhwcml2LT5mbGFncyAmPSB+QUhDSV9IRkxBR19JR05fU0VSUl9JTlRFUk5BTDsKKwogCWlmICgoaHByaXYtPmZsYWdzICYgQUhDSV9IRkxBR19OT19NU0kpIHx8IHBjaV9lbmFibGVfbXNpKHBkZXYpKQogCQlwY2lfaW50eChwZGV2LCAxKTsKIApAQCAtMjY1NCw2ICsyNjYwLDkgQEAKIAlob3N0LT5pb21hcCA9IHBjaW1faW9tYXBfdGFibGUocGRldik7CiAJaG9zdC0+cHJpdmF0ZV9kYXRhID0gaHByaXY7CiAKKwlpZiAoIShocHJpdi0+Y2FwICYgSE9TVF9DQVBfU1NTKSkKKwkJaG9zdC0+ZmxhZ3MgfD0gQVRBX0hPU1RfUEFSQUxMRUxfU0NBTjsKKwogCWlmIChwaS5mbGFncyAmIEFUQV9GTEFHX0VNKQogCQlhaGNpX3Jlc2V0X2VtKGhvc3QpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9hdGFfcGlpeC5jIGIvZHJpdmVycy9hdGEvYXRhX3BpaXguYwppbmRleCA1ZmRmMTY3Li44ODdkOGY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9hdGFfcGlpeC5jCisrKyBiL2RyaXZlcnMvYXRhL2F0YV9waWl4LmMKQEAgLTE1NCwxMSArMTU0LDEzIEBACiAKIHN0cnVjdCBwaWl4X2hvc3RfcHJpdiB7CiAJY29uc3QgaW50ICptYXA7CisJdTMyIHNhdmVkX2lvY2ZnOwogCXZvaWQgX19pb21lbSAqc2lkcHI7CiB9OwogCiBzdGF0aWMgaW50IHBpaXhfaW5pdF9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsCiAJCQkgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCk7CitzdGF0aWMgdm9pZCBwaWl4X3JlbW92ZV9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpOwogc3RhdGljIGludCBwaWl4X3BhdGFfcHJlcmVzZXQoc3RydWN0IGF0YV9saW5rICpsaW5rLCB1bnNpZ25lZCBsb25nIGRlYWRsaW5lKTsKIHN0YXRpYyB2b2lkIHBpaXhfc2V0X3Bpb21vZGUoc3RydWN0IGF0YV9wb3J0ICphcCwgc3RydWN0IGF0YV9kZXZpY2UgKmFkZXYpOwogc3RhdGljIHZvaWQgcGlpeF9zZXRfZG1hbW9kZShzdHJ1Y3QgYXRhX3BvcnQgKmFwLCBzdHJ1Y3QgYXRhX2RldmljZSAqYWRldik7CkBAIC0yOTYsNyArMjk4LDcgQEAKIAkubmFtZQkJCT0gRFJWX05BTUUsCiAJLmlkX3RhYmxlCQk9IHBpaXhfcGNpX3RibCwKIAkucHJvYmUJCQk9IHBpaXhfaW5pdF9vbmUsCi0JLnJlbW92ZQkJCT0gYXRhX3BjaV9yZW1vdmVfb25lLAorCS5yZW1vdmUJCQk9IHBpaXhfcmVtb3ZlX29uZSwKICNpZmRlZiBDT05GSUdfUE0KIAkuc3VzcGVuZAkJPSBwaWl4X3BjaV9kZXZpY2Vfc3VzcGVuZCwKIAkucmVzdW1lCQkJPSBwaWl4X3BjaV9kZXZpY2VfcmVzdW1lLApAQCAtMzA4LDcgKzMxMCw3IEBACiB9OwogCiBzdGF0aWMgc3RydWN0IGF0YV9wb3J0X29wZXJhdGlvbnMgcGlpeF9wYXRhX29wcyA9IHsKLQkuaW5oZXJpdHMJCT0gJmF0YV9ibWRtYV9wb3J0X29wcywKKwkuaW5oZXJpdHMJCT0gJmF0YV9ibWRtYTMyX3BvcnRfb3BzLAogCS5jYWJsZV9kZXRlY3QJCT0gYXRhX2NhYmxlXzQwd2lyZSwKIAkuc2V0X3Bpb21vZGUJCT0gcGlpeF9zZXRfcGlvbW9kZSwKIAkuc2V0X2RtYW1vZGUJCT0gcGlpeF9zZXRfZG1hbW9kZSwKQEAgLTYxMCw4ICs2MTIsOSBAQAogc3RhdGljIGludCBpY2hfcGF0YV9jYWJsZV9kZXRlY3Qoc3RydWN0IGF0YV9wb3J0ICphcCkKIHsKIAlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHRvX3BjaV9kZXYoYXAtPmhvc3QtPmRldik7CisJc3RydWN0IHBpaXhfaG9zdF9wcml2ICpocHJpdiA9IGFwLT5ob3N0LT5wcml2YXRlX2RhdGE7CiAJY29uc3Qgc3RydWN0IGljaF9sYXB0b3AgKmxhcCA9ICZpY2hfbGFwdG9wWzBdOwotCXU4IHRtcCwgbWFzazsKKwl1OCBtYXNrOwogCiAJLyogQ2hlY2sgZm9yIHNwZWNpYWxzIC0gQWNlciBBc3BpcmUgNTYwMldMTWkgKi8KIAl3aGlsZSAobGFwLT5kZXZpY2UpIHsKQEAgLTYyNSw4ICs2MjgsNyBAQAogCiAJLyogY2hlY2sgQklPUyBjYWJsZSBkZXRlY3QgcmVzdWx0cyAqLwogCW1hc2sgPSBhcC0+cG9ydF9ubyA9PSAwID8gUElJWF84MENfUFJJIDogUElJWF84MENfU0VDOwotCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIFBJSVhfSU9DRkcsICZ0bXApOwotCWlmICgodG1wICYgbWFzaykgPT0gMCkKKwlpZiAoKGhwcml2LT5zYXZlZF9pb2NmZyAmIG1hc2spID09IDApCiAJCXJldHVybiBBVEFfQ0JMX1BBVEE0MDsKIAlyZXR1cm4gQVRBX0NCTF9QQVRBODA7CiB9CkBAIC0xMzUwLDcgKzEzNTIsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBwaWl4X2lvY2ZnX2JpdDE4X3F1aXJrKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQorc3RhdGljIHZvaWQgcGlpeF9pb2NmZ19iaXQxOF9xdWlyayhzdHJ1Y3QgYXRhX2hvc3QgKmhvc3QpCiB7CiAJc3RhdGljIGNvbnN0IHN0cnVjdCBkbWlfc3lzdGVtX2lkIHN5c2lkc1tdID0gewogCQl7CkBAIC0xMzY3LDcgKzEzNjksOCBAQAogCiAJCXsgfQkvKiB0ZXJtaW5hdGUgbGlzdCAqLwogCX07Ci0JdTMyIGlvY2ZnOworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdG9fcGNpX2Rldihob3N0LT5kZXYpOworCXN0cnVjdCBwaWl4X2hvc3RfcHJpdiAqaHByaXYgPSBob3N0LT5wcml2YXRlX2RhdGE7CiAKIAlpZiAoIWRtaV9jaGVja19zeXN0ZW0oc3lzaWRzKSkKIAkJcmV0dXJuOwpAQCAtMTM3NiwxMiArMTM3OSwxMSBAQAogCSAqIHNlZW0gdG8gdXNlIGl0IHRvIGRpc2FibGUgYSBjaGFubmVsLiAgQ2xlYXIgdGhlIGJpdCBvbiB0aGUKIAkgKiBhZmZlY3RlZCBzeXN0ZW1zLgogCSAqLwotCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwZGV2LCBQSUlYX0lPQ0ZHLCAmaW9jZmcpOwotCWlmIChpb2NmZyAmICgxIDw8IDE4KSkgeworCWlmIChocHJpdi0+c2F2ZWRfaW9jZmcgJiAoMSA8PCAxOCkpIHsKIAkJZGV2X3ByaW50ayhLRVJOX0lORk8sICZwZGV2LT5kZXYsCiAJCQkgICAiYXBwbHlpbmcgSU9DRkcgYml0MTggcXVpcmtcbiIpOwotCQlpb2NmZyAmPSB+KDEgPDwgMTgpOwotCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBkZXYsIFBJSVhfSU9DRkcsIGlvY2ZnKTsKKwkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwZGV2LCBQSUlYX0lPQ0ZHLAorCQkJCSAgICAgICBocHJpdi0+c2F2ZWRfaW9jZmcgJiB+KDEgPDwgMTgpKTsKIAl9CiB9CiAKQEAgLTE0MzAsNiArMTQzMiwxNyBAQAogCWlmIChyYykKIAkJcmV0dXJuIHJjOwogCisJaHByaXYgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKmhwcml2KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFocHJpdikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkvKiBTYXZlIElPQ0ZHLCB0aGlzIHdpbGwgYmUgdXNlZCBmb3IgY2FibGUgZGV0ZWN0aW9uLCBxdWlyaworCSAqIGRldGVjdGlvbiBhbmQgcmVzdG9yYXRpb24gb24gZGV0YWNoLiAgVGhpcyBpcyBuZWNlc3NhcnkKKwkgKiBiZWNhdXNlIHNvbWUgQUNQSSBpbXBsZW1lbnRhdGlvbnMgbWVzcyB1cCBjYWJsZSByZWxhdGVkCisJICogYml0cyBvbiBfU1RNLiAgUmVwb3J0ZWQgb24ga2VybmVsIGJ6IzExODc5LgorCSAqLworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwZGV2LCBQSUlYX0lPQ0ZHLCAmaHByaXYtPnNhdmVkX2lvY2ZnKTsKKwogCS8qIElDSDZSIG1heSBiZSBkcml2ZW4gYnkgZWl0aGVyIGF0YV9waWl4IG9yIGFoY2kgZHJpdmVyCiAJICogcmVnYXJkbGVzcyBvZiBCSU9TIGNvbmZpZ3VyYXRpb24uICBNYWtlIHN1cmUgQUhDSSBtb2RlIGlzCiAJICogb2ZmLgpAQCAtMTQ0MSwxMCArMTQ1NCw2IEBACiAJfQogCiAJLyogU0FUQSBtYXAgaW5pdCBjYW4gY2hhbmdlIHBvcnRfaW5mbywgZG8gaXQgYmVmb3JlIHByZXBwaW5nIGhvc3QgKi8KLQlocHJpdiA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqaHByaXYpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWhwcml2KQotCQlyZXR1cm4gLUVOT01FTTsKLQogCWlmIChwb3J0X2ZsYWdzICYgQVRBX0ZMQUdfU0FUQSkKIAkJaHByaXYtPm1hcCA9IHBpaXhfaW5pdF9zYXRhX21hcChwZGV2LCBwb3J0X2luZm8sCiAJCQkJCXBpaXhfbWFwX2RiX3RhYmxlW2VudC0+ZHJpdmVyX2RhdGFdKTsKQEAgLTE0NjMsNyArMTQ3Miw3IEBACiAJfQogCiAJLyogYXBwbHkgSU9DRkcgYml0MTggcXVpcmsgKi8KLQlwaWl4X2lvY2ZnX2JpdDE4X3F1aXJrKHBkZXYpOworCXBpaXhfaW9jZmdfYml0MThfcXVpcmsoaG9zdCk7CiAKIAkvKiBPbiBJQ0g1LCBzb21lIEJJT1NlbiBkaXNhYmxlIHRoZSBpbnRlcnJ1cHQgdXNpbmcgdGhlCiAJICogUENJX0NPTU1BTkRfSU5UWF9ESVNBQkxFIGJpdCBhZGRlZCBpbiBQQ0kgMi4zLgpAQCAtMTQ4OCw2ICsxNDk3LDE2IEBACiAJcmV0dXJuIGF0YV9wY2lfc2ZmX2FjdGl2YXRlX2hvc3QoaG9zdCwgYXRhX3NmZl9pbnRlcnJ1cHQsICZwaWl4X3NodCk7CiB9CiAKK3N0YXRpYyB2b2lkIHBpaXhfcmVtb3ZlX29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgYXRhX2hvc3QgKmhvc3QgPSBkZXZfZ2V0X2RydmRhdGEoJnBkZXYtPmRldik7CisJc3RydWN0IHBpaXhfaG9zdF9wcml2ICpocHJpdiA9IGhvc3QtPnByaXZhdGVfZGF0YTsKKworCXBjaV93cml0ZV9jb25maWdfZHdvcmQocGRldiwgUElJWF9JT0NGRywgaHByaXYtPnNhdmVkX2lvY2ZnKTsKKworCWF0YV9wY2lfcmVtb3ZlX29uZShwZGV2KTsKK30KKwogc3RhdGljIGludCBfX2luaXQgcGlpeF9pbml0KHZvaWQpCiB7CiAJaW50IHJjOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvbGliYXRhLWFjcGkuYyBiL2RyaXZlcnMvYXRhL2xpYmF0YS1hY3BpLmMKaW5kZXggZWYwMmU0ODguLjYyNzNkOTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL2xpYmF0YS1hY3BpLmMKKysrIGIvZHJpdmVycy9hdGEvbGliYXRhLWFjcGkuYwpAQCAtMTksMTIgKzE5LDYgQEAKICNpbmNsdWRlICJsaWJhdGEuaCIKIAogI2luY2x1ZGUgPGFjcGkvYWNwaV9idXMuaD4KLSNpbmNsdWRlIDxhY3BpL2FjbmFtZXMuaD4KLSNpbmNsdWRlIDxhY3BpL2FjbmFtZXNwLmg+Ci0jaW5jbHVkZSA8YWNwaS9hY3BhcnNlci5oPgotI2luY2x1ZGUgPGFjcGkvYWNleGNlcC5oPgotI2luY2x1ZGUgPGFjcGkvYWNtYWNyb3MuaD4KLSNpbmNsdWRlIDxhY3BpL2FjdHlwZXMuaD4KIAogZW51bSB7CiAJQVRBX0FDUElfRklMVEVSX1NFVFhGRVIJPSAxIDw8IDAsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9saWJhdGEtY29yZS5jIGIvZHJpdmVycy9hdGEvbGliYXRhLWNvcmUuYwppbmRleCBmZWNjYTQyLi44OGMyNDI4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9saWJhdGEtY29yZS5jCisrKyBiL2RyaXZlcnMvYXRhL2xpYmF0YS1jb3JlLmMKQEAgLTU2LDYgKzU2LDcgQEAKICNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KICNpbmNsdWRlIDxsaW51eC9zY2F0dGVybGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvYXN5bmMuaD4KICNpbmNsdWRlIDxzY3NpL3Njc2kuaD4KICNpbmNsdWRlIDxzY3NpL3Njc2lfY21uZC5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CkBAIC0xMDA2LDYgKzEwMDcsNyBAQAogCXN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc3BkX3N0cltdID0gewogCQkiMS41IEdicHMiLAogCQkiMy4wIEdicHMiLAorCQkiNi4wIEdicHMiLAogCX07CiAKIAlpZiAoc3BkID09IDAgfHwgKHNwZCAtIDEpID49IEFSUkFZX1NJWkUoc3BkX3N0cikpCkBAIC0xOTk5LDYgKzIwMDEsMTAgQEAKIAkgICBhcyB0aGUgY2FsbGVyIHNob3VsZCBrbm93IHRoaXMgKi8KIAlpZiAoYWRldi0+bGluay0+YXAtPmZsYWdzICYgQVRBX0ZMQUdfTk9fSU9SRFkpCiAJCXJldHVybiAwOworCS8qIENGIHNwZWMuIHI0LjEgVGFibGUgMjIgc2F5cyBubyBpb3JkeSBvbiBQSU81IGFuZCBQSU82LiAgKi8KKwlpZiAoYXRhX2lkX2lzX2NmYShhZGV2LT5pZCkKKwkgICAgJiYgKGFkZXYtPnBpb19tb2RlID09IFhGRVJfUElPXzUgfHwgYWRldi0+cGlvX21vZGUgPT0gWEZFUl9QSU9fNikpCisJCXJldHVybiAwOwogCS8qIFBJTzMgYW5kIGhpZ2hlciBpdCBpcyBtYW5kYXRvcnkgKi8KIAlpZiAoYWRldi0+cGlvX21vZGUgPiBYRkVSX1BJT18yKQogCQlyZXR1cm4gMTsKQEAgLTMwMjMsMzMgKzMwMjksMzMgQEAKICAqLwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGF0YV90aW1pbmcgYXRhX3RpbWluZ1tdID0gewotLyoJeyBYRkVSX1BJT19TTE9XLCAxMjAsIDI5MCwgMjQwLCA5NjAsIDI5MCwgMjQwLCA5NjAsICAgMCB9LCAqLwotCXsgWEZFUl9QSU9fMCwgICAgIDcwLCAyOTAsIDI0MCwgNjAwLCAxNjUsIDE1MCwgNjAwLCAgIDAgfSwKLQl7IFhGRVJfUElPXzEsICAgICA1MCwgMjkwLCAgOTMsIDM4MywgMTI1LCAxMDAsIDM4MywgICAwIH0sCi0JeyBYRkVSX1BJT18yLCAgICAgMzAsIDI5MCwgIDQwLCAzMzAsIDEwMCwgIDkwLCAyNDAsICAgMCB9LAotCXsgWEZFUl9QSU9fMywgICAgIDMwLCAgODAsICA3MCwgMTgwLCAgODAsICA3MCwgMTgwLCAgIDAgfSwKLQl7IFhGRVJfUElPXzQsICAgICAyNSwgIDcwLCAgMjUsIDEyMCwgIDcwLCAgMjUsIDEyMCwgICAwIH0sCi0JeyBYRkVSX1BJT181LCAgICAgMTUsICA2NSwgIDI1LCAxMDAsICA2NSwgIDI1LCAxMDAsICAgMCB9LAotCXsgWEZFUl9QSU9fNiwgICAgIDEwLCAgNTUsICAyMCwgIDgwLCAgNTUsICAyMCwgIDgwLCAgIDAgfSwKKy8qCXsgWEZFUl9QSU9fU0xPVywgMTIwLCAyOTAsIDI0MCwgOTYwLCAyOTAsIDI0MCwgMCwgIDk2MCwgICAwIH0sICovCisJeyBYRkVSX1BJT18wLCAgICAgNzAsIDI5MCwgMjQwLCA2MDAsIDE2NSwgMTUwLCAwLCAgNjAwLCAgIDAgfSwKKwl7IFhGRVJfUElPXzEsICAgICA1MCwgMjkwLCAgOTMsIDM4MywgMTI1LCAxMDAsIDAsICAzODMsICAgMCB9LAorCXsgWEZFUl9QSU9fMiwgICAgIDMwLCAyOTAsICA0MCwgMzMwLCAxMDAsICA5MCwgMCwgIDI0MCwgICAwIH0sCisJeyBYRkVSX1BJT18zLCAgICAgMzAsICA4MCwgIDcwLCAxODAsICA4MCwgIDcwLCAwLCAgMTgwLCAgIDAgfSwKKwl7IFhGRVJfUElPXzQsICAgICAyNSwgIDcwLCAgMjUsIDEyMCwgIDcwLCAgMjUsIDAsICAxMjAsICAgMCB9LAorCXsgWEZFUl9QSU9fNSwgICAgIDE1LCAgNjUsICAyNSwgMTAwLCAgNjUsICAyNSwgMCwgIDEwMCwgICAwIH0sCisJeyBYRkVSX1BJT182LCAgICAgMTAsICA1NSwgIDIwLCAgODAsICA1NSwgIDIwLCAwLCAgIDgwLCAgIDAgfSwKIAotCXsgWEZFUl9TV19ETUFfMCwgMTIwLCAgIDAsICAgMCwgICAwLCA0ODAsIDQ4MCwgOTYwLCAgIDAgfSwKLQl7IFhGRVJfU1dfRE1BXzEsICA5MCwgICAwLCAgIDAsICAgMCwgMjQwLCAyNDAsIDQ4MCwgICAwIH0sCi0JeyBYRkVSX1NXX0RNQV8yLCAgNjAsICAgMCwgICAwLCAgIDAsIDEyMCwgMTIwLCAyNDAsICAgMCB9LAorCXsgWEZFUl9TV19ETUFfMCwgMTIwLCAgIDAsICAgMCwgICAwLCA0ODAsIDQ4MCwgNTAsIDk2MCwgICAwIH0sCisJeyBYRkVSX1NXX0RNQV8xLCAgOTAsICAgMCwgICAwLCAgIDAsIDI0MCwgMjQwLCAzMCwgNDgwLCAgIDAgfSwKKwl7IFhGRVJfU1dfRE1BXzIsICA2MCwgICAwLCAgIDAsICAgMCwgMTIwLCAxMjAsIDIwLCAyNDAsICAgMCB9LAogCi0JeyBYRkVSX01XX0RNQV8wLCAgNjAsICAgMCwgICAwLCAgIDAsIDIxNSwgMjE1LCA0ODAsICAgMCB9LAotCXsgWEZFUl9NV19ETUFfMSwgIDQ1LCAgIDAsICAgMCwgICAwLCAgODAsICA1MCwgMTUwLCAgIDAgfSwKLQl7IFhGRVJfTVdfRE1BXzIsICAyNSwgICAwLCAgIDAsICAgMCwgIDcwLCAgMjUsIDEyMCwgICAwIH0sCi0JeyBYRkVSX01XX0RNQV8zLCAgMjUsICAgMCwgICAwLCAgIDAsICA2NSwgIDI1LCAxMDAsICAgMCB9LAotCXsgWEZFUl9NV19ETUFfNCwgIDI1LCAgIDAsICAgMCwgICAwLCAgNTUsICAyMCwgIDgwLCAgIDAgfSwKKwl7IFhGRVJfTVdfRE1BXzAsICA2MCwgICAwLCAgIDAsICAgMCwgMjE1LCAyMTUsIDIwLCA0ODAsICAgMCB9LAorCXsgWEZFUl9NV19ETUFfMSwgIDQ1LCAgIDAsICAgMCwgICAwLCAgODAsICA1MCwgNSwgIDE1MCwgICAwIH0sCisJeyBYRkVSX01XX0RNQV8yLCAgMjUsICAgMCwgICAwLCAgIDAsICA3MCwgIDI1LCA1LCAgMTIwLCAgIDAgfSwKKwl7IFhGRVJfTVdfRE1BXzMsICAyNSwgICAwLCAgIDAsICAgMCwgIDY1LCAgMjUsIDUsICAxMDAsICAgMCB9LAorCXsgWEZFUl9NV19ETUFfNCwgIDI1LCAgIDAsICAgMCwgICAwLCAgNTUsICAyMCwgNSwgICA4MCwgICAwIH0sCiAKLS8qCXsgWEZFUl9VRE1BX1NMT1csICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAxNTAgfSwgKi8KLQl7IFhGRVJfVURNQV8wLCAgICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgMTIwIH0sCi0JeyBYRkVSX1VETUFfMSwgICAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICA4MCB9LAotCXsgWEZFUl9VRE1BXzIsICAgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgNjAgfSwKLQl7IFhGRVJfVURNQV8zLCAgICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgIDQ1IH0sCi0JeyBYRkVSX1VETUFfNCwgICAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAzMCB9LAotCXsgWEZFUl9VRE1BXzUsICAgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgMjAgfSwKLQl7IFhGRVJfVURNQV82LCAgICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgIDE1IH0sCisvKgl7IFhGRVJfVURNQV9TTE9XLCAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsIDAsICAgIDAsIDE1MCB9LCAqLworCXsgWEZFUl9VRE1BXzAsICAgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgMCwgICAgMCwgMTIwIH0sCisJeyBYRkVSX1VETUFfMSwgICAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAwLCAgICAwLCAgODAgfSwKKwl7IFhGRVJfVURNQV8yLCAgICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsIDAsICAgIDAsICA2MCB9LAorCXsgWEZFUl9VRE1BXzMsICAgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgMCwgICAgMCwgIDQ1IH0sCisJeyBYRkVSX1VETUFfNCwgICAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAwLCAgICAwLCAgMzAgfSwKKwl7IFhGRVJfVURNQV81LCAgICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsIDAsICAgIDAsICAyMCB9LAorCXsgWEZFUl9VRE1BXzYsICAgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgMCwgICAgMCwgIDE1IH0sCiAKIAl7IDB4RkYgfQogfTsKQEAgLTMwNTksMTQgKzMwNjUsMTUgQEAKIAogc3RhdGljIHZvaWQgYXRhX3RpbWluZ19xdWFudGl6ZShjb25zdCBzdHJ1Y3QgYXRhX3RpbWluZyAqdCwgc3RydWN0IGF0YV90aW1pbmcgKnEsIGludCBULCBpbnQgVVQpCiB7Ci0JcS0+c2V0dXAgICA9IEVaKHQtPnNldHVwICAgKiAxMDAwLCAgVCk7Ci0JcS0+YWN0OGIgICA9IEVaKHQtPmFjdDhiICAgKiAxMDAwLCAgVCk7Ci0JcS0+cmVjOGIgICA9IEVaKHQtPnJlYzhiICAgKiAxMDAwLCAgVCk7Ci0JcS0+Y3ljOGIgICA9IEVaKHQtPmN5YzhiICAgKiAxMDAwLCAgVCk7Ci0JcS0+YWN0aXZlICA9IEVaKHQtPmFjdGl2ZSAgKiAxMDAwLCAgVCk7Ci0JcS0+cmVjb3ZlciA9IEVaKHQtPnJlY292ZXIgKiAxMDAwLCAgVCk7Ci0JcS0+Y3ljbGUgICA9IEVaKHQtPmN5Y2xlICAgKiAxMDAwLCAgVCk7Ci0JcS0+dWRtYSAgICA9IEVaKHQtPnVkbWEgICAgKiAxMDAwLCBVVCk7CisJcS0+c2V0dXAJPSBFWih0LT5zZXR1cCAgICAgICogMTAwMCwgIFQpOworCXEtPmFjdDhiCT0gRVoodC0+YWN0OGIgICAgICAqIDEwMDAsICBUKTsKKwlxLT5yZWM4Ygk9IEVaKHQtPnJlYzhiICAgICAgKiAxMDAwLCAgVCk7CisJcS0+Y3ljOGIJPSBFWih0LT5jeWM4YiAgICAgICogMTAwMCwgIFQpOworCXEtPmFjdGl2ZQk9IEVaKHQtPmFjdGl2ZSAgICAgKiAxMDAwLCAgVCk7CisJcS0+cmVjb3Zlcgk9IEVaKHQtPnJlY292ZXIgICAgKiAxMDAwLCAgVCk7CisJcS0+ZG1hY2tfaG9sZAk9IEVaKHQtPmRtYWNrX2hvbGQgKiAxMDAwLCAgVCk7CisJcS0+Y3ljbGUJPSBFWih0LT5jeWNsZSAgICAgICogMTAwMCwgIFQpOworCXEtPnVkbWEJCT0gRVoodC0+dWRtYSAgICAgICAqIDEwMDAsIFVUKTsKIH0KIAogdm9pZCBhdGFfdGltaW5nX21lcmdlKGNvbnN0IHN0cnVjdCBhdGFfdGltaW5nICphLCBjb25zdCBzdHJ1Y3QgYXRhX3RpbWluZyAqYiwKQEAgLTMwNzgsNiArMzA4NSw3IEBACiAJaWYgKHdoYXQgJiBBVEFfVElNSU5HX0NZQzhCICApIG0tPmN5YzhiICAgPSBtYXgoYS0+Y3ljOGIsICAgYi0+Y3ljOGIpOwogCWlmICh3aGF0ICYgQVRBX1RJTUlOR19BQ1RJVkUgKSBtLT5hY3RpdmUgID0gbWF4KGEtPmFjdGl2ZSwgIGItPmFjdGl2ZSk7CiAJaWYgKHdoYXQgJiBBVEFfVElNSU5HX1JFQ09WRVIpIG0tPnJlY292ZXIgPSBtYXgoYS0+cmVjb3ZlciwgYi0+cmVjb3Zlcik7CisJaWYgKHdoYXQgJiBBVEFfVElNSU5HX0RNQUNLX0hPTEQpIG0tPmRtYWNrX2hvbGQgPSBtYXgoYS0+ZG1hY2tfaG9sZCwgYi0+ZG1hY2tfaG9sZCk7CiAJaWYgKHdoYXQgJiBBVEFfVElNSU5HX0NZQ0xFICApIG0tPmN5Y2xlICAgPSBtYXgoYS0+Y3ljbGUsICAgYi0+Y3ljbGUpOwogCWlmICh3aGF0ICYgQVRBX1RJTUlOR19VRE1BICAgKSBtLT51ZG1hICAgID0gbWF4KGEtPnVkbWEsICAgIGItPnVkbWEpOwogfQpAQCAtNDU1MCw3ICs0NTU4LDcgQEAKIAlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnID0gcWMtPnNnOwogCWludCBkaXIgPSBxYy0+ZG1hX2RpcjsKIAotCVdBUk5fT04oc2cgPT0gTlVMTCk7CisJV0FSTl9PTl9PTkNFKHNnID09IE5VTEwpOwogCiAJVlBSSU5USygidW5tYXBwaW5nICV1IHNnIGVsZW1lbnRzXG4iLCBxYy0+bl9lbGVtKTsKIApAQCAtNDc3MCw3ICs0Nzc4LDcgQEAKIAlzdHJ1Y3QgYXRhX3BvcnQgKmFwID0gcWMtPmFwOwogCXVuc2lnbmVkIGludCB0YWc7CiAKLQlXQVJOX09OKHFjID09IE5VTEwpOwkvKiBhdGFfcWNfZnJvbV90YWcgX21pZ2h0XyByZXR1cm4gTlVMTCAqLworCVdBUk5fT05fT05DRShxYyA9PSBOVUxMKTsgLyogYXRhX3FjX2Zyb21fdGFnIF9taWdodF8gcmV0dXJuIE5VTEwgKi8KIAogCXFjLT5mbGFncyA9IDA7CiAJdGFnID0gcWMtPnRhZzsKQEAgLTQ3ODUsOCArNDc5Myw4IEBACiAJc3RydWN0IGF0YV9wb3J0ICphcCA9IHFjLT5hcDsKIAlzdHJ1Y3QgYXRhX2xpbmsgKmxpbmsgPSBxYy0+ZGV2LT5saW5rOwogCi0JV0FSTl9PTihxYyA9PSBOVUxMKTsJLyogYXRhX3FjX2Zyb21fdGFnIF9taWdodF8gcmV0dXJuIE5VTEwgKi8KLQlXQVJOX09OKCEocWMtPmZsYWdzICYgQVRBX1FDRkxBR19BQ1RJVkUpKTsKKwlXQVJOX09OX09OQ0UocWMgPT0gTlVMTCk7IC8qIGF0YV9xY19mcm9tX3RhZyBfbWlnaHRfIHJldHVybiBOVUxMICovCisJV0FSTl9PTl9PTkNFKCEocWMtPmZsYWdzICYgQVRBX1FDRkxBR19BQ1RJVkUpKTsKIAogCWlmIChsaWtlbHkocWMtPmZsYWdzICYgQVRBX1FDRkxBR19ETUFNQVApKQogCQlhdGFfc2dfY2xlYW4ocWMpOwpAQCAtNDg3Miw3ICs0ODgwLDcgQEAKIAkJc3RydWN0IGF0YV9kZXZpY2UgKmRldiA9IHFjLT5kZXY7CiAJCXN0cnVjdCBhdGFfZWhfaW5mbyAqZWhpID0gJmRldi0+bGluay0+ZWhfaW5mbzsKIAotCQlXQVJOX09OKGFwLT5wZmxhZ3MgJiBBVEFfUEZMQUdfRlJPWkVOKTsKKwkJV0FSTl9PTl9PTkNFKGFwLT5wZmxhZ3MgJiBBVEFfUEZMQUdfRlJPWkVOKTsKIAogCQlpZiAodW5saWtlbHkocWMtPmVycl9tYXNrKSkKIAkJCXFjLT5mbGFncyB8PSBBVEFfUUNGTEFHX0ZBSUxFRDsKQEAgLTQ5OTQsMTYgKzUwMDIsMTYgQEAKIAkgKiBjaGVjayBpcyBza2lwcGVkIGZvciBvbGQgRUggYmVjYXVzZSBpdCByZXVzZXMgYWN0aXZlIHFjIHRvCiAJICogcmVxdWVzdCBBVEFQSSBzZW5zZS4KIAkgKi8KLQlXQVJOX09OKGFwLT5vcHMtPmVycm9yX2hhbmRsZXIgJiYgYXRhX3RhZ192YWxpZChsaW5rLT5hY3RpdmVfdGFnKSk7CisJV0FSTl9PTl9PTkNFKGFwLT5vcHMtPmVycm9yX2hhbmRsZXIgJiYgYXRhX3RhZ192YWxpZChsaW5rLT5hY3RpdmVfdGFnKSk7CiAKIAlpZiAoYXRhX2lzX25jcShwcm90KSkgewotCQlXQVJOX09OKGxpbmstPnNhY3RpdmUgJiAoMSA8PCBxYy0+dGFnKSk7CisJCVdBUk5fT05fT05DRShsaW5rLT5zYWN0aXZlICYgKDEgPDwgcWMtPnRhZykpOwogCiAJCWlmICghbGluay0+c2FjdGl2ZSkKIAkJCWFwLT5ucl9hY3RpdmVfbGlua3MrKzsKIAkJbGluay0+c2FjdGl2ZSB8PSAxIDw8IHFjLT50YWc7CiAJfSBlbHNlIHsKLQkJV0FSTl9PTihsaW5rLT5zYWN0aXZlKTsKKwkJV0FSTl9PTl9PTkNFKGxpbmstPnNhY3RpdmUpOwogCiAJCWFwLT5ucl9hY3RpdmVfbGlua3MrKzsKIAkJbGluay0+YWN0aXZlX3RhZyA9IHFjLT50YWc7CkBAIC01OTA5LDYgKzU5MTcsNjUgQEAKIAlob3N0LT5vcHMgPSBvcHM7CiB9CiAKKworc3RhdGljIHZvaWQgYXN5bmNfcG9ydF9wcm9iZSh2b2lkICpkYXRhLCBhc3luY19jb29raWVfdCBjb29raWUpCit7CisJaW50IHJjOworCXN0cnVjdCBhdGFfcG9ydCAqYXAgPSBkYXRhOworCisJLyoKKwkgKiBJZiB3ZSdyZSBub3QgYWxsb3dlZCB0byBzY2FuIHRoaXMgaG9zdCBpbiBwYXJhbGxlbCwKKwkgKiB3ZSBuZWVkIHRvIHdhaXQgdW50aWwgYWxsIHByZXZpb3VzIHNjYW5zIGhhdmUgY29tcGxldGVkCisJICogYmVmb3JlIGdvaW5nIGZ1cnRoZXIuCisJICogSmVmZiBHYXJ6aWsgc2F5cyB0aGlzIGlzIG9ubHkgd2l0aGluIGEgY29udHJvbGxlciwgc28gd2UKKwkgKiBkb24ndCBuZWVkIHRvIHdhaXQgZm9yIHBvcnQgMCwgb25seSBmb3IgbGF0ZXIgcG9ydHMuCisJICovCisJaWYgKCEoYXAtPmhvc3QtPmZsYWdzICYgQVRBX0hPU1RfUEFSQUxMRUxfU0NBTikgJiYgYXAtPnBvcnRfbm8gIT0gMCkKKwkJYXN5bmNfc3luY2hyb25pemVfY29va2llKGNvb2tpZSk7CisKKwkvKiBwcm9iZSAqLworCWlmIChhcC0+b3BzLT5lcnJvcl9oYW5kbGVyKSB7CisJCXN0cnVjdCBhdGFfZWhfaW5mbyAqZWhpID0gJmFwLT5saW5rLmVoX2luZm87CisJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkJYXRhX3BvcnRfcHJvYmUoYXApOworCisJCS8qIGtpY2sgRUggZm9yIGJvb3QgcHJvYmluZyAqLworCQlzcGluX2xvY2tfaXJxc2F2ZShhcC0+bG9jaywgZmxhZ3MpOworCisJCWVoaS0+cHJvYmVfbWFzayB8PSBBVEFfQUxMX0RFVklDRVM7CisJCWVoaS0+YWN0aW9uIHw9IEFUQV9FSF9SRVNFVCB8IEFUQV9FSF9MUE07CisJCWVoaS0+ZmxhZ3MgfD0gQVRBX0VISV9OT19BVVRPUFNZIHwgQVRBX0VISV9RVUlFVDsKKworCQlhcC0+cGZsYWdzICY9IH5BVEFfUEZMQUdfSU5JVElBTElaSU5HOworCQlhcC0+cGZsYWdzIHw9IEFUQV9QRkxBR19MT0FESU5HOworCQlhdGFfcG9ydF9zY2hlZHVsZV9laChhcCk7CisKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShhcC0+bG9jaywgZmxhZ3MpOworCisJCS8qIHdhaXQgZm9yIEVIIHRvIGZpbmlzaCAqLworCQlhdGFfcG9ydF93YWl0X2VoKGFwKTsKKwl9IGVsc2UgeworCQlEUFJJTlRLKCJhdGEldTogYnVzIHByb2JlIGJlZ2luXG4iLCBhcC0+cHJpbnRfaWQpOworCQlyYyA9IGF0YV9idXNfcHJvYmUoYXApOworCQlEUFJJTlRLKCJhdGEldTogYnVzIHByb2JlIGVuZFxuIiwgYXAtPnByaW50X2lkKTsKKworCQlpZiAocmMpIHsKKwkJCS8qIEZJWE1FOiBkbyBzb21ldGhpbmcgdXNlZnVsIGhlcmU/CisJCQkgKiBDdXJyZW50IGxpYmF0YSBiZWhhdmlvciB3aWxsCisJCQkgKiB0ZWFyIGRvd24gZXZlcnl0aGluZyB3aGVuCisJCQkgKiB0aGUgbW9kdWxlIGlzIHJlbW92ZWQKKwkJCSAqIG9yIHRoZSBoL3cgaXMgdW5wbHVnZ2VkLgorCQkJICovCisJCX0KKwl9CisKKwkvKiBpbiBvcmRlciB0byBrZWVwIGRldmljZSBvcmRlciwgd2UgbmVlZCB0byBzeW5jaHJvbml6ZSBhdCB0aGlzIHBvaW50ICovCisJYXN5bmNfc3luY2hyb25pemVfY29va2llKGNvb2tpZSk7CisKKwlhdGFfc2NzaV9zY2FuX2hvc3QoYXAsIDEpOworCit9CiAvKioKICAqCWF0YV9ob3N0X3JlZ2lzdGVyIC0gcmVnaXN0ZXIgaW5pdGlhbGl6ZWQgQVRBIGhvc3QKICAqCUBob3N0OiBBVEEgaG9zdCB0byByZWdpc3RlcgpAQCAtNTk4OCw1MiArNjA1NSw5IEBACiAJRFBSSU5USygicHJvYmUgYmVnaW5cbiIpOwogCWZvciAoaSA9IDA7IGkgPCBob3N0LT5uX3BvcnRzOyBpKyspIHsKIAkJc3RydWN0IGF0YV9wb3J0ICphcCA9IGhvc3QtPnBvcnRzW2ldOwotCi0JCS8qIHByb2JlICovCi0JCWlmIChhcC0+b3BzLT5lcnJvcl9oYW5kbGVyKSB7Ci0JCQlzdHJ1Y3QgYXRhX2VoX2luZm8gKmVoaSA9ICZhcC0+bGluay5laF9pbmZvOwotCQkJdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCQkJYXRhX3BvcnRfcHJvYmUoYXApOwotCi0JCQkvKiBraWNrIEVIIGZvciBib290IHByb2JpbmcgKi8KLQkJCXNwaW5fbG9ja19pcnFzYXZlKGFwLT5sb2NrLCBmbGFncyk7Ci0KLQkJCWVoaS0+cHJvYmVfbWFzayB8PSBBVEFfQUxMX0RFVklDRVM7Ci0JCQllaGktPmFjdGlvbiB8PSBBVEFfRUhfUkVTRVQgfCBBVEFfRUhfTFBNOwotCQkJZWhpLT5mbGFncyB8PSBBVEFfRUhJX05PX0FVVE9QU1kgfCBBVEFfRUhJX1FVSUVUOwotCi0JCQlhcC0+cGZsYWdzICY9IH5BVEFfUEZMQUdfSU5JVElBTElaSU5HOwotCQkJYXAtPnBmbGFncyB8PSBBVEFfUEZMQUdfTE9BRElORzsKLQkJCWF0YV9wb3J0X3NjaGVkdWxlX2VoKGFwKTsKLQotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShhcC0+bG9jaywgZmxhZ3MpOwotCi0JCQkvKiB3YWl0IGZvciBFSCB0byBmaW5pc2ggKi8KLQkJCWF0YV9wb3J0X3dhaXRfZWgoYXApOwotCQl9IGVsc2UgewotCQkJRFBSSU5USygiYXRhJXU6IGJ1cyBwcm9iZSBiZWdpblxuIiwgYXAtPnByaW50X2lkKTsKLQkJCXJjID0gYXRhX2J1c19wcm9iZShhcCk7Ci0JCQlEUFJJTlRLKCJhdGEldTogYnVzIHByb2JlIGVuZFxuIiwgYXAtPnByaW50X2lkKTsKLQotCQkJaWYgKHJjKSB7Ci0JCQkJLyogRklYTUU6IGRvIHNvbWV0aGluZyB1c2VmdWwgaGVyZT8KLQkJCQkgKiBDdXJyZW50IGxpYmF0YSBiZWhhdmlvciB3aWxsCi0JCQkJICogdGVhciBkb3duIGV2ZXJ5dGhpbmcgd2hlbgotCQkJCSAqIHRoZSBtb2R1bGUgaXMgcmVtb3ZlZAotCQkJCSAqIG9yIHRoZSBoL3cgaXMgdW5wbHVnZ2VkLgotCQkJCSAqLwotCQkJfQotCQl9CisJCWFzeW5jX3NjaGVkdWxlKGFzeW5jX3BvcnRfcHJvYmUsIGFwKTsKIAl9Ci0KLQkvKiBwcm9iZXMgYXJlIGRvbmUsIG5vdyBzY2FuIGVhY2ggcG9ydCdzIGRpc2socykgKi8KLQlEUFJJTlRLKCJob3N0IHByb2JlIGJlZ2luXG4iKTsKLQlmb3IgKGkgPSAwOyBpIDwgaG9zdC0+bl9wb3J0czsgaSsrKSB7Ci0JCXN0cnVjdCBhdGFfcG9ydCAqYXAgPSBob3N0LT5wb3J0c1tpXTsKLQotCQlhdGFfc2NzaV9zY2FuX2hvc3QoYXAsIDEpOwotCX0KKwlEUFJJTlRLKCJwcm9iZSBlbmRcbiIpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC02NjE2LDcgKzY2NDAsNiBAQAogRVhQT1JUX1NZTUJPTF9HUEwoYXRhX3BvcnRfZGlzYWJsZSk7CiBFWFBPUlRfU1lNQk9MX0dQTChhdGFfcmF0ZWxpbWl0KTsKIEVYUE9SVF9TWU1CT0xfR1BMKGF0YV93YWl0X3JlZ2lzdGVyKTsKLUVYUE9SVF9TWU1CT0xfR1BMKGF0YV9zY3NpX2lvY3RsKTsKIEVYUE9SVF9TWU1CT0xfR1BMKGF0YV9zY3NpX3F1ZXVlY21kKTsKIEVYUE9SVF9TWU1CT0xfR1BMKGF0YV9zY3NpX3NsYXZlX2NvbmZpZyk7CiBFWFBPUlRfU1lNQk9MX0dQTChhdGFfc2NzaV9zbGF2ZV9kZXN0cm95KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL2xpYmF0YS1zY3NpLmMgYi9kcml2ZXJzL2F0YS9saWJhdGEtc2NzaS5jCmluZGV4IDllOTIxMDcuLmExYTZlNjI5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9saWJhdGEtc2NzaS5jCisrKyBiL2RyaXZlcnMvYXRhL2xpYmF0YS1zY3NpLmMKQEAgLTQyMyw5ICs0MjMsOSBAQAogICoJUkVUVVJOUzoKICAqCVplcm8gb24gc3VjY2VzcywgbmVnYXRpdmUgZXJybm8gb24gZXJyb3IuCiAgKi8KLXN0YXRpYyBpbnQgYXRhX2dldF9pZGVudGl0eShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYsIHZvaWQgX191c2VyICphcmcpCitzdGF0aWMgaW50IGF0YV9nZXRfaWRlbnRpdHkoc3RydWN0IGF0YV9wb3J0ICphcCwgc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2LAorCQkJICAgIHZvaWQgX191c2VyICphcmcpCiB7Ci0Jc3RydWN0IGF0YV9wb3J0ICphcCA9IGF0YV9zaG9zdF90b19wb3J0KHNkZXYtPmhvc3QpOwogCXN0cnVjdCBhdGFfZGV2aWNlICpkZXYgPSBhdGFfc2NzaV9maW5kX2RldihhcCwgc2Rldik7CiAJdTE2IF9fdXNlciAqZHN0ID0gYXJnOwogCWNoYXIgYnVmWzQwXTsKQEAgLTY0NSw3ICs2NDUsOCBAQAogCXJldHVybiByYzsKIH0KIAotaW50IGF0YV9zY3NpX2lvY3RsKHN0cnVjdCBzY3NpX2RldmljZSAqc2NzaWRldiwgaW50IGNtZCwgdm9pZCBfX3VzZXIgKmFyZykKK2ludCBhdGFfc2FzX3Njc2lfaW9jdGwoc3RydWN0IGF0YV9wb3J0ICphcCwgc3RydWN0IHNjc2lfZGV2aWNlICpzY3NpZGV2LAorCQkgICAgIGludCBjbWQsIHZvaWQgX191c2VyICphcmcpCiB7CiAJaW50IHZhbCA9IC1FSU5WQUwsIHJjID0gLUVJTlZBTDsKIApAQCAtNjYzLDcgKzY2NCw3IEBACiAJCXJldHVybiAwOwogCiAJY2FzZSBIRElPX0dFVF9JREVOVElUWToKLQkJcmV0dXJuIGF0YV9nZXRfaWRlbnRpdHkoc2NzaWRldiwgYXJnKTsKKwkJcmV0dXJuIGF0YV9nZXRfaWRlbnRpdHkoYXAsIHNjc2lkZXYsIGFyZyk7CiAKIAljYXNlIEhESU9fRFJJVkVfQ01EOgogCQlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikgfHwgIWNhcGFibGUoQ0FQX1NZU19SQVdJTykpCkBAIC02ODIsNiArNjgzLDE0IEBACiAKIAlyZXR1cm4gcmM7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChhdGFfc2FzX3Njc2lfaW9jdGwpOworCitpbnQgYXRhX3Njc2lfaW9jdGwoc3RydWN0IHNjc2lfZGV2aWNlICpzY3NpZGV2LCBpbnQgY21kLCB2b2lkIF9fdXNlciAqYXJnKQoreworCXJldHVybiBhdGFfc2FzX3Njc2lfaW9jdGwoYXRhX3Nob3N0X3RvX3BvcnQoc2NzaWRldi0+aG9zdCksCisJCQkJc2NzaWRldiwgY21kLCBhcmcpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoYXRhX3Njc2lfaW9jdGwpOwogCiAvKioKICAqCWF0YV9zY3NpX3FjX25ldyAtIGFjcXVpcmUgbmV3IGF0YV9xdWV1ZWRfY21kIHJlZmVyZW5jZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvbGliYXRhLXNmZi5jIGIvZHJpdmVycy9hdGEvbGliYXRhLXNmZi5jCmluZGV4IDkwMzNkMTYuLjVhNGFhZDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL2xpYmF0YS1zZmYuYworKysgYi9kcml2ZXJzL2F0YS9saWJhdGEtc2ZmLmMKQEAgLTY2LDYgKzY2LDcgQEAKIAogCS5wb3J0X3N0YXJ0CQk9IGF0YV9zZmZfcG9ydF9zdGFydCwKIH07CitFWFBPUlRfU1lNQk9MX0dQTChhdGFfc2ZmX3BvcnRfb3BzKTsKIAogY29uc3Qgc3RydWN0IGF0YV9wb3J0X29wZXJhdGlvbnMgYXRhX2JtZG1hX3BvcnRfb3BzID0gewogCS5pbmhlcml0cwkJPSAmYXRhX3NmZl9wb3J0X29wcywKQEAgLTc3LDYgKzc4LDE0IEBACiAJLmJtZG1hX3N0b3AJCT0gYXRhX2JtZG1hX3N0b3AsCiAJLmJtZG1hX3N0YXR1cwkJPSBhdGFfYm1kbWFfc3RhdHVzLAogfTsKK0VYUE9SVF9TWU1CT0xfR1BMKGF0YV9ibWRtYV9wb3J0X29wcyk7CisKK2NvbnN0IHN0cnVjdCBhdGFfcG9ydF9vcGVyYXRpb25zIGF0YV9ibWRtYTMyX3BvcnRfb3BzID0geworCS5pbmhlcml0cwkJPSAmYXRhX2JtZG1hX3BvcnRfb3BzLAorCisJLnNmZl9kYXRhX3hmZXIJCT0gYXRhX3NmZl9kYXRhX3hmZXIzMiwKK307CitFWFBPUlRfU1lNQk9MX0dQTChhdGFfYm1kbWEzMl9wb3J0X29wcyk7CiAKIC8qKgogICoJYXRhX2ZpbGxfc2cgLSBGaWxsIFBDSSBJREUgUFJEIHRhYmxlCkBAIC0xNjYsOCArMTc1LDkgQEAKIAkJCWJsZW4gPSBsZW4gJiAweGZmZmY7CiAJCQlhcC0+cHJkW3BpXS5hZGRyID0gY3B1X3RvX2xlMzIoYWRkcik7CiAJCQlpZiAoYmxlbiA9PSAwKSB7Ci0JCQkgICAvKiBTb21lIFBBVEEgY2hpcHNldHMgbGlrZSB0aGUgQ1M1NTMwIGNhbid0Ci0JCQkgICAgICBjb3BlIHdpdGggMHgwMDAwIG1lYW5pbmcgNjRLIGFzIHRoZSBzcGVjIHNheXMgKi8KKwkJCQkvKiBTb21lIFBBVEEgY2hpcHNldHMgbGlrZSB0aGUgQ1M1NTMwIGNhbid0CisJCQkJICAgY29wZSB3aXRoIDB4MDAwMCBtZWFuaW5nIDY0SyBhcyB0aGUgc3BlYworCQkJCSAgIHNheXMgKi8KIAkJCQlhcC0+cHJkW3BpXS5mbGFnc19sZW4gPSBjcHVfdG9fbGUzMigweDgwMDApOwogCQkJCWJsZW4gPSAweDgwMDA7CiAJCQkJYXAtPnByZFsrK3BpXS5hZGRyID0gY3B1X3RvX2xlMzIoYWRkciArIDB4ODAwMCk7CkBAIC0yMDAsNiArMjEwLDcgQEAKIAogCWF0YV9maWxsX3NnKHFjKTsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKGF0YV9zZmZfcWNfcHJlcCk7CiAKIC8qKgogICoJYXRhX3NmZl9kdW1iX3FjX3ByZXAgLSBQcmVwYXJlIHRhc2tmaWxlIGZvciBzdWJtaXNzaW9uCkBAIC0yMTcsNiArMjI4LDcgQEAKIAogCWF0YV9maWxsX3NnX2R1bWIocWMpOwogfQorRVhQT1JUX1NZTUJPTF9HUEwoYXRhX3NmZl9kdW1iX3FjX3ByZXApOwogCiAvKioKICAqCWF0YV9zZmZfY2hlY2tfc3RhdHVzIC0gUmVhZCBkZXZpY2Ugc3RhdHVzIHJlZyAmIGNsZWFyIGludGVycnVwdApAQCAtMjMzLDYgKzI0NSw3IEBACiB7CiAJcmV0dXJuIGlvcmVhZDgoYXAtPmlvYWRkci5zdGF0dXNfYWRkcik7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChhdGFfc2ZmX2NoZWNrX3N0YXR1cyk7CiAKIC8qKgogICoJYXRhX3NmZl9hbHRzdGF0dXMgLSBSZWFkIGRldmljZSBhbHRlcm5hdGUgc3RhdHVzIHJlZwpAQCAtMjc1LDcgKzI4OCw3IEBACiAJCXN0YXR1cyA9IGF0YV9zZmZfYWx0c3RhdHVzKGFwKTsKIAkJLyogTm90IHVzOiBXZSBhcmUgYnVzeSAqLwogCQlpZiAoc3RhdHVzICYgQVRBX0JVU1kpCi0JCSAgICAJcmV0dXJuIHN0YXR1czsKKwkJCXJldHVybiBzdGF0dXM7CiAJfQogCS8qIENsZWFyIElOVFJRIGxhdGNoICovCiAJc3RhdHVzID0gYXAtPm9wcy0+c2ZmX2NoZWNrX3N0YXR1cyhhcCk7CkBAIC0zMTksNiArMzMyLDcgQEAKIAlhdGFfc2ZmX3N5bmMoYXApOwogCW5kZWxheSg0MDApOwogfQorRVhQT1JUX1NZTUJPTF9HUEwoYXRhX3NmZl9wYXVzZSk7CiAKIC8qKgogICoJYXRhX3NmZl9kbWFfcGF1c2UJLQlQYXVzZSBiZWZvcmUgY29tbWVuY2luZyBETUEKQEAgLTMyNyw3ICszNDEsNyBAQAogICoJUGVyZm9ybSBJL08gZmVuY2luZyBhbmQgZW5zdXJlIHN1ZmZpY2llbnQgY3ljbGUgZGVsYXlzIG9jY3VyCiAgKglmb3IgdGhlIEhETUExOjAgdHJhbnNpdGlvbgogICovCi0gCisKIHZvaWQgYXRhX3NmZl9kbWFfcGF1c2Uoc3RydWN0IGF0YV9wb3J0ICphcCkKIHsKIAlpZiAoYXAtPm9wcy0+c2ZmX2NoZWNrX2FsdHN0YXR1cyB8fCBhcC0+aW9hZGRyLmFsdHN0YXR1c19hZGRyKSB7CkBAIC0zNDEsNiArMzU1LDcgQEAKIAkgICBjb3JydXB0aW9uLiAqLwogCUJVRygpOwogfQorRVhQT1JUX1NZTUJPTF9HUEwoYXRhX3NmZl9kbWFfcGF1c2UpOwogCiAvKioKICAqCWF0YV9zZmZfYnVzeV9zbGVlcCAtIHNsZWVwIHVudGlsIEJTWSBjbGVhcnMsIG9yIHRpbWVvdXQKQEAgLTM5Niw2ICs0MTEsNyBAQAogCiAJcmV0dXJuIDA7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChhdGFfc2ZmX2J1c3lfc2xlZXApOwogCiBzdGF0aWMgaW50IGF0YV9zZmZfY2hlY2tfcmVhZHkoc3RydWN0IGF0YV9saW5rICpsaW5rKQogewpAQCAtNDIyLDYgKzQzOCw3IEBACiB7CiAJcmV0dXJuIGF0YV93YWl0X3JlYWR5KGxpbmssIGRlYWRsaW5lLCBhdGFfc2ZmX2NoZWNrX3JlYWR5KTsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKGF0YV9zZmZfd2FpdF9yZWFkeSk7CiAKIC8qKgogICoJYXRhX3NmZl9kZXZfc2VsZWN0IC0gU2VsZWN0IGRldmljZSAwLzEgb24gQVRBIGJ1cwpAQCAtNDQ5LDYgKzQ2Niw3IEBACiAJaW93cml0ZTgodG1wLCBhcC0+aW9hZGRyLmRldmljZV9hZGRyKTsKIAlhdGFfc2ZmX3BhdXNlKGFwKTsJLyogbmVlZGVkOyBhbHNvIGZsdXNoZXMsIGZvciBtbWlvICovCiB9CitFWFBPUlRfU1lNQk9MX0dQTChhdGFfc2ZmX2Rldl9zZWxlY3QpOwogCiAvKioKICAqCWF0YV9kZXZfc2VsZWN0IC0gU2VsZWN0IGRldmljZSAwLzEgb24gQVRBIGJ1cwpAQCAtNTEzLDYgKzUzMSw3IEBACiAKIAlyZXR1cm4gdG1wOwogfQorRVhQT1JUX1NZTUJPTF9HUEwoYXRhX3NmZl9pcnFfb24pOwogCiAvKioKICAqCWF0YV9zZmZfaXJxX2NsZWFyIC0gQ2xlYXIgUENJIElERSBCTURNQSBpbnRlcnJ1cHQuCkBAIC01MzQsNiArNTUzLDcgQEAKIAogCWlvd3JpdGU4KGlvcmVhZDgobW1pbyArIEFUQV9ETUFfU1RBVFVTKSwgbW1pbyArIEFUQV9ETUFfU1RBVFVTKTsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKGF0YV9zZmZfaXJxX2NsZWFyKTsKIAogLyoqCiAgKglhdGFfc2ZmX3RmX2xvYWQgLSBzZW5kIHRhc2tmaWxlIHJlZ2lzdGVycyB0byBob3N0IGNvbnRyb2xsZXIKQEAgLTU1OCw3ICs1NzgsNyBAQAogCX0KIAogCWlmIChpc19hZGRyICYmICh0Zi0+ZmxhZ3MgJiBBVEFfVEZMQUdfTEJBNDgpKSB7Ci0JCVdBUk5fT04oIWlvYWRkci0+Y3RsX2FkZHIpOworCQlXQVJOX09OX09OQ0UoIWlvYWRkci0+Y3RsX2FkZHIpOwogCQlpb3dyaXRlOCh0Zi0+aG9iX2ZlYXR1cmUsIGlvYWRkci0+ZmVhdHVyZV9hZGRyKTsKIAkJaW93cml0ZTgodGYtPmhvYl9uc2VjdCwgaW9hZGRyLT5uc2VjdF9hZGRyKTsKIAkJaW93cml0ZTgodGYtPmhvYl9sYmFsLCBpb2FkZHItPmxiYWxfYWRkcik7CkBAIC01OTMsNiArNjEzLDcgQEAKIAogCWF0YV93YWl0X2lkbGUoYXApOwogfQorRVhQT1JUX1NZTUJPTF9HUEwoYXRhX3NmZl90Zl9sb2FkKTsKIAogLyoqCiAgKglhdGFfc2ZmX3RmX3JlYWQgLSBpbnB1dCBkZXZpY2UncyBBVEEgdGFza2ZpbGUgc2hhZG93IHJlZ2lzdGVycwpAQCAtNjMwLDkgKzY1MSwxMCBAQAogCQkJaW93cml0ZTgodGYtPmN0bCwgaW9hZGRyLT5jdGxfYWRkcik7CiAJCQlhcC0+bGFzdF9jdGwgPSB0Zi0+Y3RsOwogCQl9IGVsc2UKLQkJCVdBUk5fT04oMSk7CisJCQlXQVJOX09OX09OQ0UoMSk7CiAJfQogfQorRVhQT1JUX1NZTUJPTF9HUEwoYXRhX3NmZl90Zl9yZWFkKTsKIAogLyoqCiAgKglhdGFfc2ZmX2V4ZWNfY29tbWFuZCAtIGlzc3VlIEFUQSBjb21tYW5kIHRvIGhvc3QgY29udHJvbGxlcgpAQCAtNjUyLDYgKzY3NCw3IEBACiAJaW93cml0ZTgodGYtPmNvbW1hbmQsIGFwLT5pb2FkZHIuY29tbWFuZF9hZGRyKTsKIAlhdGFfc2ZmX3BhdXNlKGFwKTsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKGF0YV9zZmZfZXhlY19jb21tYW5kKTsKIAogLyoqCiAgKglhdGFfdGZfdG9faG9zdCAtIGlzc3VlIEFUQSB0YXNrZmlsZSB0byBob3N0IGNvbnRyb2xsZXIKQEAgLTcxNyw2ICs3NDAsNTMgQEAKIAogCXJldHVybiB3b3JkcyA8PCAxOwogfQorRVhQT1JUX1NZTUJPTF9HUEwoYXRhX3NmZl9kYXRhX3hmZXIpOworCisvKioKKyAqCWF0YV9zZmZfZGF0YV94ZmVyMzIgLSBUcmFuc2ZlciBkYXRhIGJ5IFBJTworICoJQGRldjogZGV2aWNlIHRvIHRhcmdldAorICoJQGJ1ZjogZGF0YSBidWZmZXIKKyAqCUBidWZsZW46IGJ1ZmZlciBsZW5ndGgKKyAqCUBydzogcmVhZC93cml0ZQorICoKKyAqCVRyYW5zZmVyIGRhdGEgZnJvbS90byB0aGUgZGV2aWNlIGRhdGEgcmVnaXN0ZXIgYnkgUElPIHVzaW5nIDMyYml0CisgKglJL08gb3BlcmF0aW9ucy4KKyAqCisgKglMT0NLSU5HOgorICoJSW5oZXJpdGVkIGZyb20gY2FsbGVyLgorICoKKyAqCVJFVFVSTlM6CisgKglCeXRlcyBjb25zdW1lZC4KKyAqLworCit1bnNpZ25lZCBpbnQgYXRhX3NmZl9kYXRhX3hmZXIzMihzdHJ1Y3QgYXRhX2RldmljZSAqZGV2LCB1bnNpZ25lZCBjaGFyICpidWYsCisJCQkgICAgICAgdW5zaWduZWQgaW50IGJ1ZmxlbiwgaW50IHJ3KQoreworCXN0cnVjdCBhdGFfcG9ydCAqYXAgPSBkZXYtPmxpbmstPmFwOworCXZvaWQgX19pb21lbSAqZGF0YV9hZGRyID0gYXAtPmlvYWRkci5kYXRhX2FkZHI7CisJdW5zaWduZWQgaW50IHdvcmRzID0gYnVmbGVuID4+IDI7CisJaW50IHNsb3AgPSBidWZsZW4gJiAzOworCisJLyogVHJhbnNmZXIgbXVsdGlwbGUgb2YgNCBieXRlcyAqLworCWlmIChydyA9PSBSRUFEKQorCQlpb3JlYWQzMl9yZXAoZGF0YV9hZGRyLCBidWYsIHdvcmRzKTsKKwllbHNlCisJCWlvd3JpdGUzMl9yZXAoZGF0YV9hZGRyLCBidWYsIHdvcmRzKTsKKworCWlmICh1bmxpa2VseShzbG9wKSkgeworCQlfX2xlMzIgcGFkOworCQlpZiAocncgPT0gUkVBRCkgeworCQkJcGFkID0gY3B1X3RvX2xlMzIoaW9yZWFkMzIoYXAtPmlvYWRkci5kYXRhX2FkZHIpKTsKKwkJCW1lbWNweShidWYgKyBidWZsZW4gLSBzbG9wLCAmcGFkLCBzbG9wKTsKKwkJfSBlbHNlIHsKKwkJCW1lbWNweSgmcGFkLCBidWYgKyBidWZsZW4gLSBzbG9wLCBzbG9wKTsKKwkJCWlvd3JpdGUzMihsZTMyX3RvX2NwdShwYWQpLCBhcC0+aW9hZGRyLmRhdGFfYWRkcik7CisJCX0KKwkJd29yZHMrKzsKKwl9CisJcmV0dXJuIHdvcmRzIDw8IDI7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChhdGFfc2ZmX2RhdGFfeGZlcjMyKTsKIAogLyoqCiAgKglhdGFfc2ZmX2RhdGFfeGZlcl9ub2lycSAtIFRyYW5zZmVyIGRhdGEgYnkgUElPCkBAIC03NDYsNiArODE2LDcgQEAKIAogCXJldHVybiBjb25zdW1lZDsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKGF0YV9zZmZfZGF0YV94ZmVyX25vaXJxKTsKIAogLyoqCiAgKglhdGFfcGlvX3NlY3RvciAtIFRyYW5zZmVyIGEgc2VjdG9yIG9mIGRhdGEuCkBAIC04MjAsNyArODkxLDcgQEAKIAkJLyogUkVBRC9XUklURSBNVUxUSVBMRSAqLwogCQl1bnNpZ25lZCBpbnQgbnNlY3Q7CiAKLQkJV0FSTl9PTihxYy0+ZGV2LT5tdWx0aV9jb3VudCA9PSAwKTsKKwkJV0FSTl9PTl9PTkNFKHFjLT5kZXYtPm11bHRpX2NvdW50ID09IDApOwogCiAJCW5zZWN0ID0gbWluKChxYy0+bmJ5dGVzIC0gcWMtPmN1cmJ5dGVzKSAvIHFjLT5zZWN0X3NpemUsCiAJCQkgICAgcWMtPmRldi0+bXVsdGlfY291bnQpOwpAQCAtODQ3LDcgKzkxOCw3IEBACiB7CiAJLyogc2VuZCBTQ1NJIGNkYiAqLwogCURQUklOVEsoInNlbmQgY2RiXG4iKTsKLQlXQVJOX09OKHFjLT5kZXYtPmNkYl9sZW4gPCAxMik7CisJV0FSTl9PTl9PTkNFKHFjLT5kZXYtPmNkYl9sZW4gPCAxMik7CiAKIAlhcC0+b3BzLT5zZmZfZGF0YV94ZmVyKHFjLT5kZXYsIHFjLT5jZGIsIHFjLT5kZXYtPmNkYl9sZW4sIDEpOwogCWF0YV9zZmZfc3luYyhhcCk7CkBAIC05MjIsMTMgKzk5MywxNSBAQAogCQlidWYgPSBrbWFwX2F0b21pYyhwYWdlLCBLTV9JUlEwKTsKIAogCQkvKiBkbyB0aGUgYWN0dWFsIGRhdGEgdHJhbnNmZXIgKi8KLQkJY29uc3VtZWQgPSBhcC0+b3BzLT5zZmZfZGF0YV94ZmVyKGRldiwgIGJ1ZiArIG9mZnNldCwgY291bnQsIHJ3KTsKKwkJY29uc3VtZWQgPSBhcC0+b3BzLT5zZmZfZGF0YV94ZmVyKGRldiwgIGJ1ZiArIG9mZnNldCwKKwkJCQkJCQkJY291bnQsIHJ3KTsKIAogCQlrdW5tYXBfYXRvbWljKGJ1ZiwgS01fSVJRMCk7CiAJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIAl9IGVsc2UgewogCQlidWYgPSBwYWdlX2FkZHJlc3MocGFnZSk7Ci0JCWNvbnN1bWVkID0gYXAtPm9wcy0+c2ZmX2RhdGFfeGZlcihkZXYsICBidWYgKyBvZmZzZXQsIGNvdW50LCBydyk7CisJCWNvbnN1bWVkID0gYXAtPm9wcy0+c2ZmX2RhdGFfeGZlcihkZXYsICBidWYgKyBvZmZzZXQsCisJCQkJCQkJCWNvdW50LCBydyk7CiAJfQogCiAJYnl0ZXMgLT0gbWluKGJ5dGVzLCBjb25zdW1lZCk7CkBAIC05NDAsOSArMTAxMywxMiBAQAogCQlxYy0+Y3Vyc2dfb2ZzID0gMDsKIAl9CiAKLQkvKiBjb25zdW1lZCBjYW4gYmUgbGFyZ2VyIHRoYW4gY291bnQgb25seSBmb3IgdGhlIGxhc3QgdHJhbnNmZXIgKi8KLQlXQVJOX09OKHFjLT5jdXJzZyAmJiBjb3VudCAhPSBjb25zdW1lZCk7Ci0KKwkvKgorCSAqIFRoZXJlIHVzZWQgdG8gYmUgYSAgV0FSTl9PTl9PTkNFKHFjLT5jdXJzZyAmJiBjb3VudCAhPSBjb25zdW1lZCk7CisJICogVW5mb3J0dW5hdGVseSBfX2F0YXBpX3Bpb19ieXRlcyBkb2Vzbid0IGtub3cgZW5vdWdoIHRvIGRvIHRoZSBXQVJOCisJICogY2hlY2sgY29ycmVjdGx5IGFzIGl0IGRvZXNuJ3Qga25vdyBpZiBpdCBpcyB0aGUgbGFzdCByZXF1ZXN0IGJlaW5nCisJICogbWFkZS4gU29tZWJvZHkgc2hvdWxkIGltcGxlbWVudCBhIHByb3BlciBzYW5pdHkgY2hlY2suCisJICovCiAJaWYgKGJ5dGVzKQogCQlnb3RvIG5leHRfc2c7CiAJcmV0dXJuIDA7CkBAIC0xMDEzLDE4ICsxMDg5LDE5IEBACiAgKglSRVRVUk5TOgogICoJMSBpZiBvayBpbiB3b3JrcXVldWUsIDAgb3RoZXJ3aXNlLgogICovCi1zdGF0aWMgaW5saW5lIGludCBhdGFfaHNtX29rX2luX3dxKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMpCitzdGF0aWMgaW5saW5lIGludCBhdGFfaHNtX29rX2luX3dxKHN0cnVjdCBhdGFfcG9ydCAqYXAsCisJCQkJCQlzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjKQogewogCWlmIChxYy0+dGYuZmxhZ3MgJiBBVEFfVEZMQUdfUE9MTElORykKIAkJcmV0dXJuIDE7CiAKIAlpZiAoYXAtPmhzbV90YXNrX3N0YXRlID09IEhTTV9TVF9GSVJTVCkgewogCQlpZiAocWMtPnRmLnByb3RvY29sID09IEFUQV9QUk9UX1BJTyAmJgotCQkgICAgKHFjLT50Zi5mbGFncyAmIEFUQV9URkxBR19XUklURSkpCisJCSAgIChxYy0+dGYuZmxhZ3MgJiBBVEFfVEZMQUdfV1JJVEUpKQogCQkgICAgcmV0dXJuIDE7CiAKIAkJaWYgKGF0YV9pc19hdGFwaShxYy0+dGYucHJvdG9jb2wpICYmCi0JCSAgICAhKHFjLT5kZXYtPmZsYWdzICYgQVRBX0RGTEFHX0NEQl9JTlRSKSkKKwkJICAgIShxYy0+ZGV2LT5mbGFncyAmIEFUQV9ERkxBR19DREJfSU5UUikpCiAJCQlyZXR1cm4gMTsKIAl9CiAKQEAgLTEwOTgsMTMgKzExNzUsMTMgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzID0gMDsKIAlpbnQgcG9sbF9uZXh0OwogCi0JV0FSTl9PTigocWMtPmZsYWdzICYgQVRBX1FDRkxBR19BQ1RJVkUpID09IDApOworCVdBUk5fT05fT05DRSgocWMtPmZsYWdzICYgQVRBX1FDRkxBR19BQ1RJVkUpID09IDApOwogCiAJLyogTWFrZSBzdXJlIGF0YV9zZmZfcWNfaXNzdWUoKSBkb2VzIG5vdCB0aHJvdyB0aGluZ3MKIAkgKiBsaWtlIERNQSBwb2xsaW5nIGludG8gdGhlIHdvcmtxdWV1ZS4gTm90aWNlIHRoYXQKIAkgKiBpbl93cSBpcyBub3QgZXF1aXZhbGVudCB0byAocWMtPnRmLmZsYWdzICYgQVRBX1RGTEFHX1BPTExJTkcpLgogCSAqLwotCVdBUk5fT04oaW5fd3EgIT0gYXRhX2hzbV9va19pbl93cShhcCwgcWMpKTsKKwlXQVJOX09OX09OQ0UoaW5fd3EgIT0gYXRhX2hzbV9va19pbl93cShhcCwgcWMpKTsKIAogZnNtX3N0YXJ0OgogCURQUklOVEsoImF0YSV1OiBwcm90b2NvbCAlZCB0YXNrX3N0YXRlICVkIChkZXZfc3RhdCAweCVYKVxuIiwKQEAgLTEzMTMsNyArMTM5MCw3IEBACiAJCURQUklOVEsoImF0YSV1OiBkZXYgJXUgY29tbWFuZCBjb21wbGV0ZSwgZHJ2X3N0YXQgMHgleFxuIiwKIAkJCWFwLT5wcmludF9pZCwgcWMtPmRldi0+ZGV2bm8sIHN0YXR1cyk7CiAKLQkJV0FSTl9PTihxYy0+ZXJyX21hc2sgJiAoQUNfRVJSX0RFViB8IEFDX0VSUl9IU00pKTsKKwkJV0FSTl9PTl9PTkNFKHFjLT5lcnJfbWFzayAmIChBQ19FUlJfREVWIHwgQUNfRVJSX0hTTSkpOwogCiAJCWFwLT5oc21fdGFza19zdGF0ZSA9IEhTTV9TVF9JRExFOwogCkBAIC0xMzM4LDYgKzE0MTUsNyBAQAogCiAJcmV0dXJuIHBvbGxfbmV4dDsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKGF0YV9zZmZfaHNtX21vdmUpOwogCiB2b2lkIGF0YV9waW9fdGFzayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7CkBAIC0xMzQ4LDcgKzE0MjYsNyBAQAogCWludCBwb2xsX25leHQ7CiAKIGZzbV9zdGFydDoKLQlXQVJOX09OKGFwLT5oc21fdGFza19zdGF0ZSA9PSBIU01fU1RfSURMRSk7CisJV0FSTl9PTl9PTkNFKGFwLT5oc21fdGFza19zdGF0ZSA9PSBIU01fU1RfSURMRSk7CiAKIAkvKgogCSAqIFRoaXMgaXMgcHVyZWx5IGhldXJpc3RpYy4gIFRoaXMgaXMgYSBmYXN0IHBhdGguCkBAIC0xNDM3LDcgKzE1MTUsNyBAQAogCQlicmVhazsKIAogCWNhc2UgQVRBX1BST1RfRE1BOgotCQlXQVJOX09OKHFjLT50Zi5mbGFncyAmIEFUQV9URkxBR19QT0xMSU5HKTsKKwkJV0FSTl9PTl9PTkNFKHFjLT50Zi5mbGFncyAmIEFUQV9URkxBR19QT0xMSU5HKTsKIAogCQlhcC0+b3BzLT5zZmZfdGZfbG9hZChhcCwgJnFjLT50Zik7ICAvKiBsb2FkIHRmIHJlZ2lzdGVycyAqLwogCQlhcC0+b3BzLT5ibWRtYV9zZXR1cChxYyk7CSAgICAvKiBzZXQgdXAgYm1kbWEgKi8KQEAgLTE0ODksNyArMTU2Nyw3IEBACiAJCWJyZWFrOwogCiAJY2FzZSBBVEFQSV9QUk9UX0RNQToKLQkJV0FSTl9PTihxYy0+dGYuZmxhZ3MgJiBBVEFfVEZMQUdfUE9MTElORyk7CisJCVdBUk5fT05fT05DRShxYy0+dGYuZmxhZ3MgJiBBVEFfVEZMQUdfUE9MTElORyk7CiAKIAkJYXAtPm9wcy0+c2ZmX3RmX2xvYWQoYXAsICZxYy0+dGYpOyAgLyogbG9hZCB0ZiByZWdpc3RlcnMgKi8KIAkJYXAtPm9wcy0+Ym1kbWFfc2V0dXAocWMpOwkgICAgLyogc2V0IHVwIGJtZG1hICovCkBAIC0xNTAxLDEyICsxNTc5LDEzIEBACiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKLQkJV0FSTl9PTigxKTsKKwkJV0FSTl9PTl9PTkNFKDEpOwogCQlyZXR1cm4gQUNfRVJSX1NZU1RFTTsKIAl9CiAKIAlyZXR1cm4gMDsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKGF0YV9zZmZfcWNfaXNzdWUpOwogCiAvKioKICAqCWF0YV9zZmZfcWNfZmlsbF9ydGYgLSBmaWxsIHJlc3VsdCBURiB1c2luZyAtPnNmZl90Zl9yZWFkCkBAIC0xNTI2LDYgKzE2MDUsNyBAQAogCXFjLT5hcC0+b3BzLT5zZmZfdGZfcmVhZChxYy0+YXAsICZxYy0+cmVzdWx0X3RmKTsKIAlyZXR1cm4gdHJ1ZTsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKGF0YV9zZmZfcWNfZmlsbF9ydGYpOwogCiAvKioKICAqCWF0YV9zZmZfaG9zdF9pbnRyIC0gSGFuZGxlIGhvc3QgaW50ZXJydXB0IGZvciBnaXZlbiAocG9ydCwgdGFzaykKQEAgLTE2MjMsNiArMTcwMyw3IEBACiAjZW5kaWYKIAlyZXR1cm4gMDsJLyogaXJxIG5vdCBoYW5kbGVkICovCiB9CitFWFBPUlRfU1lNQk9MX0dQTChhdGFfc2ZmX2hvc3RfaW50cik7CiAKIC8qKgogICoJYXRhX3NmZl9pbnRlcnJ1cHQgLSBEZWZhdWx0IEFUQSBob3N0IGludGVycnVwdCBoYW5kbGVyCkBAIC0xNjY3LDYgKzE3NDgsNyBAQAogCiAJcmV0dXJuIElSUV9SRVRWQUwoaGFuZGxlZCk7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChhdGFfc2ZmX2ludGVycnVwdCk7CiAKIC8qKgogICoJYXRhX3NmZl9mcmVlemUgLSBGcmVlemUgU0ZGIGNvbnRyb2xsZXIgcG9ydApAQCAtMTY5NSw2ICsxNzc3LDcgQEAKIAogCWFwLT5vcHMtPnNmZl9pcnFfY2xlYXIoYXApOwogfQorRVhQT1JUX1NZTUJPTF9HUEwoYXRhX3NmZl9mcmVlemUpOwogCiAvKioKICAqCWF0YV9zZmZfdGhhdyAtIFRoYXcgU0ZGIGNvbnRyb2xsZXIgcG9ydApAQCAtMTcxMiw2ICsxNzk1LDcgQEAKIAlhcC0+b3BzLT5zZmZfaXJxX2NsZWFyKGFwKTsKIAlhcC0+b3BzLT5zZmZfaXJxX29uKGFwKTsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKGF0YV9zZmZfdGhhdyk7CiAKIC8qKgogICoJYXRhX3NmZl9wcmVyZXNldCAtIHByZXBhcmUgU0ZGIGxpbmsgZm9yIHJlc2V0CkBAIC0xNzUzLDYgKzE4MzcsNyBAQAogCiAJcmV0dXJuIDA7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChhdGFfc2ZmX3ByZXJlc2V0KTsKIAogLyoqCiAgKglhdGFfZGV2Y2hrIC0gUEFUQSBkZXZpY2UgcHJlc2VuY2UgZGV0ZWN0aW9uCkBAIC0xODY1LDYgKzE5NTAsNyBAQAogCiAJcmV0dXJuIGNsYXNzOwogfQorRVhQT1JUX1NZTUJPTF9HUEwoYXRhX3NmZl9kZXZfY2xhc3NpZnkpOwogCiAvKioKICAqCWF0YV9zZmZfd2FpdF9hZnRlcl9yZXNldCAtIHdhaXQgZm9yIGRldmljZXMgdG8gYmVjb21lIHJlYWR5IGFmdGVyIHJlc2V0CkBAIC0xOTQxLDYgKzIwMjcsNyBAQAogCiAJcmV0dXJuIHJldDsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKGF0YV9zZmZfd2FpdF9hZnRlcl9yZXNldCk7CiAKIHN0YXRpYyBpbnQgYXRhX2J1c19zb2Z0cmVzZXQoc3RydWN0IGF0YV9wb3J0ICphcCwgdW5zaWduZWQgaW50IGRldm1hc2ssCiAJCQkgICAgIHVuc2lnbmVkIGxvbmcgZGVhZGxpbmUpCkBAIC0yMDEzLDYgKzIxMDAsNyBAQAogCURQUklOVEsoIkVYSVQsIGNsYXNzZXNbMF09JXUgWzFdPSV1XG4iLCBjbGFzc2VzWzBdLCBjbGFzc2VzWzFdKTsKIAlyZXR1cm4gMDsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKGF0YV9zZmZfc29mdHJlc2V0KTsKIAogLyoqCiAgKglzYXRhX3NmZl9oYXJkcmVzZXQgLSByZXNldCBob3N0IHBvcnQgdmlhIFNBVEEgcGh5IHJlc2V0CkBAIC0yMDQ1LDYgKzIxMzMsNyBAQAogCURQUklOVEsoIkVYSVQsIGNsYXNzPSV1XG4iLCAqY2xhc3MpOwogCXJldHVybiByYzsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKHNhdGFfc2ZmX2hhcmRyZXNldCk7CiAKIC8qKgogICoJYXRhX3NmZl9wb3N0cmVzZXQgLSBTRkYgcG9zdHJlc2V0IGNhbGxiYWNrCkBAIC0yMDgwLDYgKzIxNjksNyBAQAogCWlmIChhcC0+aW9hZGRyLmN0bF9hZGRyKQogCQlpb3dyaXRlOChhcC0+Y3RsLCBhcC0+aW9hZGRyLmN0bF9hZGRyKTsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKGF0YV9zZmZfcG9zdHJlc2V0KTsKIAogLyoqCiAgKglhdGFfc2ZmX2Vycm9yX2hhbmRsZXIgLSBTdG9jayBlcnJvciBoYW5kbGVyIGZvciBCTURNQSBjb250cm9sbGVyCkBAIC0yMTUyLDYgKzIyNDIsNyBAQAogCWF0YV9kb19laChhcCwgYXAtPm9wcy0+cHJlcmVzZXQsIHNvZnRyZXNldCwgaGFyZHJlc2V0LAogCQkgIGFwLT5vcHMtPnBvc3RyZXNldCk7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChhdGFfc2ZmX2Vycm9yX2hhbmRsZXIpOwogCiAvKioKICAqCWF0YV9zZmZfcG9zdF9pbnRlcm5hbF9jbWQgLSBTdG9jayBwb3N0X2ludGVybmFsX2NtZCBmb3IgU0ZGIGNvbnRyb2xsZXIKQEAgLTIxNzQsNiArMjI2NSw3IEBACiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKGFwLT5sb2NrLCBmbGFncyk7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChhdGFfc2ZmX3Bvc3RfaW50ZXJuYWxfY21kKTsKIAogLyoqCiAgKglhdGFfc2ZmX3BvcnRfc3RhcnQgLSBTZXQgcG9ydCB1cCBmb3IgZG1hLgpAQCAtMjE5NCw2ICsyMjg2LDcgQEAKIAkJcmV0dXJuIGF0YV9wb3J0X3N0YXJ0KGFwKTsKIAlyZXR1cm4gMDsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKGF0YV9zZmZfcG9ydF9zdGFydCk7CiAKIC8qKgogICoJYXRhX3NmZl9zdGRfcG9ydHMgLSBpbml0aWFsaXplIGlvYWRkciB3aXRoIHN0YW5kYXJkIHBvcnQgb2Zmc2V0cy4KQEAgLTIyMTksNiArMjMxMiw3IEBACiAJaW9hZGRyLT5zdGF0dXNfYWRkciA9IGlvYWRkci0+Y21kX2FkZHIgKyBBVEFfUkVHX1NUQVRVUzsKIAlpb2FkZHItPmNvbW1hbmRfYWRkciA9IGlvYWRkci0+Y21kX2FkZHIgKyBBVEFfUkVHX0NNRDsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKGF0YV9zZmZfc3RkX3BvcnRzKTsKIAogdW5zaWduZWQgbG9uZyBhdGFfYm1kbWFfbW9kZV9maWx0ZXIoc3RydWN0IGF0YV9kZXZpY2UgKmFkZXYsCiAJCQkJICAgIHVuc2lnbmVkIGxvbmcgeGZlcl9tYXNrKQpAQCAtMjIzMCw2ICsyMzI0LDcgQEAKIAkJeGZlcl9tYXNrICY9IH4oQVRBX01BU0tfTVdETUEgfCBBVEFfTUFTS19VRE1BKTsKIAlyZXR1cm4geGZlcl9tYXNrOwogfQorRVhQT1JUX1NZTUJPTF9HUEwoYXRhX2JtZG1hX21vZGVfZmlsdGVyKTsKIAogLyoqCiAgKglhdGFfYm1kbWFfc2V0dXAgLSBTZXQgdXAgUENJIElERSBCTURNQSB0cmFuc2FjdGlvbgpAQCAtMjI1OCw2ICsyMzUzLDcgQEAKIAkvKiBpc3N1ZSByL3cgY29tbWFuZCAqLwogCWFwLT5vcHMtPnNmZl9leGVjX2NvbW1hbmQoYXAsICZxYy0+dGYpOwogfQorRVhQT1JUX1NZTUJPTF9HUEwoYXRhX2JtZG1hX3NldHVwKTsKIAogLyoqCiAgKglhdGFfYm1kbWFfc3RhcnQgLSBTdGFydCBhIFBDSSBJREUgQk1ETUEgdHJhbnNhY3Rpb24KQEAgLTIyOTAsNiArMjM4Niw3IEBACiAJICogdW5uZWNjZXNzYXJpbHkgZGVsYXllZCBmb3IgTU1JTwogCSAqLwogfQorRVhQT1JUX1NZTUJPTF9HUEwoYXRhX2JtZG1hX3N0YXJ0KTsKIAogLyoqCiAgKglhdGFfYm1kbWFfc3RvcCAtIFN0b3AgUENJIElERSBCTURNQSB0cmFuc2ZlcgpAQCAtMjMxNCw2ICsyNDExLDcgQEAKIAkvKiBvbmUtUElPLWN5Y2xlIGd1YXJhbnRlZWQgd2FpdCwgcGVyIHNwZWMsIGZvciBIRE1BMTowIHRyYW5zaXRpb24gKi8KIAlhdGFfc2ZmX2RtYV9wYXVzZShhcCk7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChhdGFfYm1kbWFfc3RvcCk7CiAKIC8qKgogICoJYXRhX2JtZG1hX3N0YXR1cyAtIFJlYWQgUENJIElERSBCTURNQSBzdGF0dXMKQEAgLTIzMzAsNiArMjQyOCw3IEBACiB7CiAJcmV0dXJuIGlvcmVhZDgoYXAtPmlvYWRkci5ibWRtYV9hZGRyICsgQVRBX0RNQV9TVEFUVVMpOwogfQorRVhQT1JUX1NZTUJPTF9HUEwoYXRhX2JtZG1hX3N0YXR1cyk7CiAKIC8qKgogICoJYXRhX2J1c19yZXNldCAtIHJlc2V0IGhvc3QgcG9ydCBhbmQgYXNzb2NpYXRlZCBBVEEgY2hhbm5lbApAQCAtMjQyMiw2ICsyNTIxLDcgQEAKIAogCURQUklOVEsoIkVYSVRcbiIpOwogfQorRVhQT1JUX1NZTUJPTF9HUEwoYXRhX2J1c19yZXNldCk7CiAKICNpZmRlZiBDT05GSUdfUENJCiAKQEAgLTI0NDksNiArMjU0OSw3IEBACiAJCXJldHVybiAtRU9QTk9UU1VQUDsKIAlyZXR1cm4gMDsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKGF0YV9wY2lfYm1kbWFfY2xlYXJfc2ltcGxleCk7CiAKIC8qKgogICoJYXRhX3BjaV9ibWRtYV9pbml0IC0gYWNxdWlyZSBQQ0kgQk1ETUEgcmVzb3VyY2VzIGFuZCBpbml0IEFUQSBob3N0CkBAIC0yNTAxLDExICsyNjAyLDEyIEBACiAJCQlob3N0LT5mbGFncyB8PSBBVEFfSE9TVF9TSU1QTEVYOwogCiAJCWF0YV9wb3J0X2Rlc2MoYXAsICJibWRtYSAweCVsbHgiLAotCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgNCkgKyA4ICogaSk7CisJCSAgICAodW5zaWduZWQgbG9uZyBsb25nKXBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCA0KSArIDggKiBpKTsKIAl9CiAKIAlyZXR1cm4gMDsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKGF0YV9wY2lfYm1kbWFfaW5pdCk7CiAKIHN0YXRpYyBpbnQgYXRhX3Jlc291cmNlc19wcmVzZW50KHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBpbnQgcG9ydCkKIHsKQEAgLTI1MTMsNyArMjYxNSw3IEBACiAKIAkvKiBDaGVjayB0aGUgUENJIHJlc291cmNlcyBmb3IgdGhpcyBjaGFubmVsIGFyZSBlbmFibGVkICovCiAJcG9ydCA9IHBvcnQgKiAyOwotCWZvciAoaSA9IDA7IGkgPCAyOyBpICsrKSB7CisJZm9yIChpID0gMDsgaSA8IDI7IGkrKykgewogCQlpZiAocGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIHBvcnQgKyBpKSA9PSAwIHx8CiAJCSAgICBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIHBvcnQgKyBpKSA9PSAwKQogCQkJcmV0dXJuIDA7CkBAIC0yNTk4LDYgKzI3MDAsNyBAQAogCiAJcmV0dXJuIDA7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChhdGFfcGNpX3NmZl9pbml0X2hvc3QpOwogCiAvKioKICAqCWF0YV9wY2lfc2ZmX3ByZXBhcmVfaG9zdCAtIGhlbHBlciB0byBwcmVwYXJlIG5hdGl2ZSBQQ0kgQVRBIGhvc3QKQEAgLTI2MTUsNyArMjcxOCw3IEBACiAgKgkwIG9uIHN1Y2Nlc3MsIC1lcnJubyBvdGhlcndpc2UuCiAgKi8KIGludCBhdGFfcGNpX3NmZl9wcmVwYXJlX2hvc3Qoc3RydWN0IHBjaV9kZXYgKnBkZXYsCi0JCQkgICAgIGNvbnN0IHN0cnVjdCBhdGFfcG9ydF9pbmZvICogY29uc3QgKiBwcGksCisJCQkgICAgIGNvbnN0IHN0cnVjdCBhdGFfcG9ydF9pbmZvICogY29uc3QgKnBwaSwKIAkJCSAgICAgc3RydWN0IGF0YV9ob3N0ICoqcl9ob3N0KQogewogCXN0cnVjdCBhdGFfaG9zdCAqaG9zdDsKQEAgLTI2NDUsMTcgKzI3NDgsMTggQEAKIAkqcl9ob3N0ID0gaG9zdDsKIAlyZXR1cm4gMDsKIAotIGVycl9ibWRtYToKK2Vycl9ibWRtYToKIAkvKiBUaGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIFBDSSBhbmQgaW9tYXAgcmVzb3VyY2VzIGFyZQogCSAqIG1lcmdlZCBhbmQgcmVsZWFzaW5nIHRoZSB0b3AgZ3JvdXAgd29uJ3QgcmVsZWFzZSB0aGUKIAkgKiBhY3F1aXJlZCByZXNvdXJjZXMgaWYgc29tZSBvZiB0aG9zZSBoYXZlIGJlZW4gYWNxdWlyZWQKIAkgKiBiZWZvcmUgZW50ZXJpbmcgdGhpcyBmdW5jdGlvbi4KIAkgKi8KIAlwY2ltX2lvdW5tYXBfcmVnaW9ucyhwZGV2LCAweGYpOwotIGVycl9vdXQ6CitlcnJfb3V0OgogCWRldnJlc19yZWxlYXNlX2dyb3VwKCZwZGV2LT5kZXYsIE5VTEwpOwogCXJldHVybiByYzsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKGF0YV9wY2lfc2ZmX3ByZXBhcmVfaG9zdCk7CiAKIC8qKgogICoJYXRhX3BjaV9zZmZfYWN0aXZhdGVfaG9zdCAtIHN0YXJ0IFNGRiBob3N0LCByZXF1ZXN0IElSUSBhbmQgcmVnaXN0ZXIgaXQKQEAgLTI3NDEsNyArMjg0NSw3IEBACiAJfQogCiAJcmMgPSBhdGFfaG9zdF9yZWdpc3Rlcihob3N0LCBzaHQpOwotIG91dDoKK291dDoKIAlpZiAocmMgPT0gMCkKIAkJZGV2cmVzX3JlbW92ZV9ncm91cChkZXYsIE5VTEwpOwogCWVsc2UKQEAgLTI3NDksNiArMjg1Myw3IEBACiAKIAlyZXR1cm4gcmM7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChhdGFfcGNpX3NmZl9hY3RpdmF0ZV9ob3N0KTsKIAogLyoqCiAgKglhdGFfcGNpX3NmZl9pbml0X29uZSAtIEluaXRpYWxpemUvcmVnaXN0ZXIgUENJIElERSBob3N0IGNvbnRyb2xsZXIKQEAgLTI3NzYsNyArMjg4MSw3IEBACiAgKglaZXJvIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIG9uIGVycm5vLWJhc2VkIHZhbHVlIG9uIGVycm9yLgogICovCiBpbnQgYXRhX3BjaV9zZmZfaW5pdF9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsCi0JCQkgY29uc3Qgc3RydWN0IGF0YV9wb3J0X2luZm8gKiBjb25zdCAqIHBwaSwKKwkJCSBjb25zdCBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyAqIGNvbnN0ICpwcGksCiAJCQkgc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSAqc2h0LCB2b2lkICpob3N0X3ByaXYpCiB7CiAJc3RydWN0IGRldmljZSAqZGV2ID0gJnBkZXYtPmRldjsKQEAgLTI4MTUsNyArMjkyMCw3IEBACiAKIAlwY2lfc2V0X21hc3RlcihwZGV2KTsKIAlyYyA9IGF0YV9wY2lfc2ZmX2FjdGl2YXRlX2hvc3QoaG9zdCwgYXRhX3NmZl9pbnRlcnJ1cHQsIHNodCk7Ci0gb3V0Ogorb3V0OgogCWlmIChyYyA9PSAwKQogCQlkZXZyZXNfcmVtb3ZlX2dyb3VwKCZwZGV2LT5kZXYsIE5VTEwpOwogCWVsc2UKQEAgLTI4MjMsNTQgKzI5MjgsNyBAQAogCiAJcmV0dXJuIHJjOwogfQotCi0jZW5kaWYgLyogQ09ORklHX1BDSSAqLwotCi1FWFBPUlRfU1lNQk9MX0dQTChhdGFfc2ZmX3BvcnRfb3BzKTsKLUVYUE9SVF9TWU1CT0xfR1BMKGF0YV9ibWRtYV9wb3J0X29wcyk7Ci1FWFBPUlRfU1lNQk9MX0dQTChhdGFfc2ZmX3FjX3ByZXApOwotRVhQT1JUX1NZTUJPTF9HUEwoYXRhX3NmZl9kdW1iX3FjX3ByZXApOwotRVhQT1JUX1NZTUJPTF9HUEwoYXRhX3NmZl9kZXZfc2VsZWN0KTsKLUVYUE9SVF9TWU1CT0xfR1BMKGF0YV9zZmZfY2hlY2tfc3RhdHVzKTsKLUVYUE9SVF9TWU1CT0xfR1BMKGF0YV9zZmZfZG1hX3BhdXNlKTsKLUVYUE9SVF9TWU1CT0xfR1BMKGF0YV9zZmZfcGF1c2UpOwotRVhQT1JUX1NZTUJPTF9HUEwoYXRhX3NmZl9idXN5X3NsZWVwKTsKLUVYUE9SVF9TWU1CT0xfR1BMKGF0YV9zZmZfd2FpdF9yZWFkeSk7Ci1FWFBPUlRfU1lNQk9MX0dQTChhdGFfc2ZmX3RmX2xvYWQpOwotRVhQT1JUX1NZTUJPTF9HUEwoYXRhX3NmZl90Zl9yZWFkKTsKLUVYUE9SVF9TWU1CT0xfR1BMKGF0YV9zZmZfZXhlY19jb21tYW5kKTsKLUVYUE9SVF9TWU1CT0xfR1BMKGF0YV9zZmZfZGF0YV94ZmVyKTsKLUVYUE9SVF9TWU1CT0xfR1BMKGF0YV9zZmZfZGF0YV94ZmVyX25vaXJxKTsKLUVYUE9SVF9TWU1CT0xfR1BMKGF0YV9zZmZfaXJxX29uKTsKLUVYUE9SVF9TWU1CT0xfR1BMKGF0YV9zZmZfaXJxX2NsZWFyKTsKLUVYUE9SVF9TWU1CT0xfR1BMKGF0YV9zZmZfaHNtX21vdmUpOwotRVhQT1JUX1NZTUJPTF9HUEwoYXRhX3NmZl9xY19pc3N1ZSk7Ci1FWFBPUlRfU1lNQk9MX0dQTChhdGFfc2ZmX3FjX2ZpbGxfcnRmKTsKLUVYUE9SVF9TWU1CT0xfR1BMKGF0YV9zZmZfaG9zdF9pbnRyKTsKLUVYUE9SVF9TWU1CT0xfR1BMKGF0YV9zZmZfaW50ZXJydXB0KTsKLUVYUE9SVF9TWU1CT0xfR1BMKGF0YV9zZmZfZnJlZXplKTsKLUVYUE9SVF9TWU1CT0xfR1BMKGF0YV9zZmZfdGhhdyk7Ci1FWFBPUlRfU1lNQk9MX0dQTChhdGFfc2ZmX3ByZXJlc2V0KTsKLUVYUE9SVF9TWU1CT0xfR1BMKGF0YV9zZmZfZGV2X2NsYXNzaWZ5KTsKLUVYUE9SVF9TWU1CT0xfR1BMKGF0YV9zZmZfd2FpdF9hZnRlcl9yZXNldCk7Ci1FWFBPUlRfU1lNQk9MX0dQTChhdGFfc2ZmX3NvZnRyZXNldCk7Ci1FWFBPUlRfU1lNQk9MX0dQTChzYXRhX3NmZl9oYXJkcmVzZXQpOwotRVhQT1JUX1NZTUJPTF9HUEwoYXRhX3NmZl9wb3N0cmVzZXQpOwotRVhQT1JUX1NZTUJPTF9HUEwoYXRhX3NmZl9lcnJvcl9oYW5kbGVyKTsKLUVYUE9SVF9TWU1CT0xfR1BMKGF0YV9zZmZfcG9zdF9pbnRlcm5hbF9jbWQpOwotRVhQT1JUX1NZTUJPTF9HUEwoYXRhX3NmZl9wb3J0X3N0YXJ0KTsKLUVYUE9SVF9TWU1CT0xfR1BMKGF0YV9zZmZfc3RkX3BvcnRzKTsKLUVYUE9SVF9TWU1CT0xfR1BMKGF0YV9ibWRtYV9tb2RlX2ZpbHRlcik7Ci1FWFBPUlRfU1lNQk9MX0dQTChhdGFfYm1kbWFfc2V0dXApOwotRVhQT1JUX1NZTUJPTF9HUEwoYXRhX2JtZG1hX3N0YXJ0KTsKLUVYUE9SVF9TWU1CT0xfR1BMKGF0YV9ibWRtYV9zdG9wKTsKLUVYUE9SVF9TWU1CT0xfR1BMKGF0YV9ibWRtYV9zdGF0dXMpOwotRVhQT1JUX1NZTUJPTF9HUEwoYXRhX2J1c19yZXNldCk7Ci0jaWZkZWYgQ09ORklHX1BDSQotRVhQT1JUX1NZTUJPTF9HUEwoYXRhX3BjaV9ibWRtYV9jbGVhcl9zaW1wbGV4KTsKLUVYUE9SVF9TWU1CT0xfR1BMKGF0YV9wY2lfYm1kbWFfaW5pdCk7Ci1FWFBPUlRfU1lNQk9MX0dQTChhdGFfcGNpX3NmZl9pbml0X2hvc3QpOwotRVhQT1JUX1NZTUJPTF9HUEwoYXRhX3BjaV9zZmZfcHJlcGFyZV9ob3N0KTsKLUVYUE9SVF9TWU1CT0xfR1BMKGF0YV9wY2lfc2ZmX2FjdGl2YXRlX2hvc3QpOwogRVhQT1JUX1NZTUJPTF9HUEwoYXRhX3BjaV9zZmZfaW5pdF9vbmUpOworCiAjZW5kaWYgLyogQ09ORklHX1BDSSAqLworCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9wYXRhX2FjcGkuYyBiL2RyaXZlcnMvYXRhL3BhdGFfYWNwaS5jCmluZGV4IGUyZTMzMmQuLjhiNzdhOTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfYWNwaS5jCisrKyBiL2RyaXZlcnMvYXRhL3BhdGFfYWNwaS5jCkBAIC0xMywxMiArMTMsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CiAjaW5jbHVkZSA8YWNwaS9hY3BpX2J1cy5oPgotI2luY2x1ZGUgPGFjcGkvYWNuYW1lcy5oPgotI2luY2x1ZGUgPGFjcGkvYWNuYW1lc3AuaD4KLSNpbmNsdWRlIDxhY3BpL2FjcGFyc2VyLmg+Ci0jaW5jbHVkZSA8YWNwaS9hY2V4Y2VwLmg+Ci0jaW5jbHVkZSA8YWNwaS9hY21hY3Jvcy5oPgotI2luY2x1ZGUgPGFjcGkvYWN0eXBlcy5oPgogCiAjaW5jbHVkZSA8bGludXgvbGliYXRhLmg+CiAjaW5jbHVkZSA8bGludXgvYXRhLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9wYXRhX2FsaS5jIGIvZHJpdmVycy9hdGEvcGF0YV9hbGkuYwppbmRleCA3M2M0NjZlLi5lYjk5ZGJlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX2FsaS5jCisrKyBiL2RyaXZlcnMvYXRhL3BhdGFfYWxpLmMKQEAgLTE5LDcgKzE5LDkgQEAKICAqCiAgKiAgVE9ETy9DSEVDSwogICoJQ2Fubm90IGhhdmUgQVRBUEkgb24gYm90aCBtYXN0ZXIgJiBzbGF2ZSBmb3IgcmV2IDwgYzIgKD8/PykgYnV0Ci0gKglvdGhlcndpc2Ugc2hvdWxkIGRvIGF0YXBpIERNQS4KKyAqCW90aGVyd2lzZSBzaG91bGQgZG8gYXRhcGkgRE1BIChGb3Igbm93IGZvciBvbGQgd2UgZG8gUElPIG9ubHkgZm9yCisgKglBVEFQSSkKKyAqCVJldmlldyBTdW5ibGFkZSB3b3JrYXJvdW5kLgogICovCiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KQEAgLTMzLDEyICszNSwxNCBAQAogI2luY2x1ZGUgPGxpbnV4L2RtaS5oPgogCiAjZGVmaW5lIERSVl9OQU1FICJwYXRhX2FsaSIKLSNkZWZpbmUgRFJWX1ZFUlNJT04gIjAuNy41IgorI2RlZmluZSBEUlZfVkVSU0lPTiAiMC43LjgiCiAKIHN0YXRpYyBpbnQgYWxpX2F0YXBpX2RtYSA9IDA7CiBtb2R1bGVfcGFyYW1fbmFtZWQoYXRhcGlfZG1hLCBhbGlfYXRhcGlfZG1hLCBpbnQsIDA2NDQpOwogTU9EVUxFX1BBUk1fREVTQyhhdGFwaV9kbWEsICJFbmFibGUgQVRBUEkgRE1BICgwPWRpc2FibGUsIDE9ZW5hYmxlKSIpOwogCitzdGF0aWMgc3RydWN0IHBjaV9kZXYgKmFsaV9pc2FfYnJpZGdlOworCiAvKgogICoJQ2FibGUgc3BlY2lhbCBjYXNlcwogICovCkBAIC0xNDcsOCArMTUxLDcgQEAKIAogCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIHBpb19maWZvLCAmZmlmbyk7CiAJZmlmbyAmPSB+KDB4MEYgPDwgc2hpZnQpOwotCWlmIChvbikKLQkJZmlmbyB8PSAob24gPDwgc2hpZnQpOworCWZpZm8gfD0gKG9uIDw8IHNoaWZ0KTsKIAlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgcGlvX2ZpZm8sIGZpZm8pOwogfQogCkBAIC0zMzcsNiArMzQwLDIzIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyB2b2lkIGFsaV9jMl9jM19wb3N0cmVzZXQoc3RydWN0IGF0YV9saW5rICpsaW5rLCB1bnNpZ25lZCBpbnQgKmNsYXNzZXMpCit7CisJdTggcjsKKwlpbnQgcG9ydF9iaXQgPSA0IDw8IGxpbmstPmFwLT5wb3J0X25vOworCisJLyogSWYgb3VyIGJyaWRnZSBpcyBhbiBBTEkgMTUzMyB0aGVuIGRvIHRoZSBleHRyYSB3b3JrICovCisJaWYgKGFsaV9pc2FfYnJpZGdlKSB7CisJCS8qIFRyaXN0YXRlIGFuZCByZS1lbmFibGUgdGhlIGJ1cyBzaWduYWxzICovCisJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGFsaV9pc2FfYnJpZGdlLCAweDU4LCAmcik7CisJCXIgJj0gfnBvcnRfYml0OworCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoYWxpX2lzYV9icmlkZ2UsIDB4NTgsIHIpOworCQlyIHw9IHBvcnRfYml0OworCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoYWxpX2lzYV9icmlkZ2UsIDB4NTgsIHIpOworCX0KKwlhdGFfc2ZmX3Bvc3RyZXNldChsaW5rLCBjbGFzc2VzKTsKK30KKwogc3RhdGljIHN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgYWxpX3NodCA9IHsKIAlBVEFfQk1ETUFfU0hUKERSVl9OQU1FKSwKIH07CkBAIC0zNDksMTAgKzM2OSwxMSBAQAogCS5pbmhlcml0cwk9ICZhdGFfc2ZmX3BvcnRfb3BzLAogCS5jYWJsZV9kZXRlY3QJPSBhdGFfY2FibGVfNDB3aXJlLAogCS5zZXRfcGlvbW9kZQk9IGFsaV9zZXRfcGlvbW9kZSwKKwkuc2ZmX2RhdGFfeGZlciAgPSBhdGFfc2ZmX2RhdGFfeGZlcjMyLAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBhdGFfcG9ydF9vcGVyYXRpb25zIGFsaV9kbWFfYmFzZV9vcHMgPSB7Ci0JLmluaGVyaXRzCT0gJmF0YV9ibWRtYV9wb3J0X29wcywKKwkuaW5oZXJpdHMJPSAmYXRhX2JtZG1hMzJfcG9ydF9vcHMsCiAJLnNldF9waW9tb2RlCT0gYWxpX3NldF9waW9tb2RlLAogCS5zZXRfZG1hbW9kZQk9IGFsaV9zZXRfZG1hbW9kZSwKIH07CkBAIC0zNzcsNiArMzk4LDE3IEBACiAJLmNoZWNrX2F0YXBpX2RtYSA9IGFsaV9jaGVja19hdGFwaV9kbWEsCiAJLmNhYmxlX2RldGVjdAk9IGFsaV9jMl9jYWJsZV9kZXRlY3QsCiAJLmRldl9jb25maWcJPSBhbGlfbG9ja19zZWN0b3JzLAorCS5wb3N0cmVzZXQJPSBhbGlfYzJfYzNfcG9zdHJlc2V0LAorfTsKKworLyoKKyAqCVBvcnQgb3BlcmF0aW9ucyBmb3IgRE1BIGNhcGFibGUgQUxpIHdpdGggY2FibGUgZGV0ZWN0CisgKi8KK3N0YXRpYyBzdHJ1Y3QgYXRhX3BvcnRfb3BlcmF0aW9ucyBhbGlfYzRfcG9ydF9vcHMgPSB7CisJLmluaGVyaXRzCT0gJmFsaV9kbWFfYmFzZV9vcHMsCisJLmNoZWNrX2F0YXBpX2RtYSA9IGFsaV9jaGVja19hdGFwaV9kbWEsCisJLmNhYmxlX2RldGVjdAk9IGFsaV9jMl9jYWJsZV9kZXRlY3QsCisJLmRldl9jb25maWcJPSBhbGlfbG9ja19zZWN0b3JzLAogfTsKIAogLyoKQEAgLTQwMSw1MiArNDMzLDQ5IEBACiBzdGF0aWMgdm9pZCBhbGlfaW5pdF9jaGlwc2V0KHN0cnVjdCBwY2lfZGV2ICpwZGV2KQogewogCXU4IHRtcDsKLQlzdHJ1Y3QgcGNpX2RldiAqbm9ydGgsICppc2FfYnJpZGdlOworCXN0cnVjdCBwY2lfZGV2ICpub3J0aDsKIAogCS8qCiAJICogVGhlIGNoaXBzZXQgcmV2aXNpb24gc2VsZWN0cyB0aGUgZHJpdmVyIG9wZXJhdGlvbnMgYW5kCiAJICogbW9kZSBkYXRhLgogCSAqLwogCi0JaWYgKHBkZXYtPnJldmlzaW9uID49IDB4MjAgJiYgcGRldi0+cmV2aXNpb24gPCAweEMyKSB7Ci0JCS8qIDE1NDMtRS9GLCAxNTQzQy1DLCAxNTQzQy1ELCAxNTQzQy1FICovCisJaWYgKHBkZXYtPnJldmlzaW9uIDw9IDB4MjApIHsKKwkJcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgMHg1MywgJnRtcCk7CisJCXRtcCB8PSAweDAzOworCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgMHg1MywgdG1wKTsKKwl9IGVsc2UgeworCQlwY2lfcmVhZF9jb25maWdfYnl0ZShwZGV2LCAweDRhLCAmdG1wKTsKKwkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIDB4NGEsIHRtcCB8IDB4MjApOwogCQlwY2lfcmVhZF9jb25maWdfYnl0ZShwZGV2LCAweDRCLCAmdG1wKTsKLQkJLyogQ2xlYXIgQ0QtUk9NIERNQSB3cml0ZSBiaXQgKi8KLQkJdG1wICY9IDB4N0Y7Ci0JCXBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCAweDRCLCB0bXApOwotCX0gZWxzZSBpZiAocGRldi0+cmV2aXNpb24gPj0gMHhDMikgewotCQkvKiBFbmFibGUgY2FibGUgZGV0ZWN0aW9uIGxvZ2ljICovCi0JCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIDB4NEIsICZ0bXApOwotCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgMHg0QiwgdG1wIHwgMHgwOCk7Ci0JfQotCW5vcnRoID0gcGNpX2dldF9idXNfYW5kX3Nsb3QoMCwgUENJX0RFVkZOKDAsMCkpOwotCWlzYV9icmlkZ2UgPSBwY2lfZ2V0X2RldmljZShQQ0lfVkVORE9SX0lEX0FMLCBQQ0lfREVWSUNFX0lEX0FMX00xNTMzLCBOVUxMKTsKLQotCWlmIChub3J0aCAmJiBub3J0aC0+dmVuZG9yID09IFBDSV9WRU5ET1JfSURfQUwgJiYgaXNhX2JyaWRnZSkgewotCQkvKiBDb25maWd1cmUgdGhlIEFMaSBicmlkZ2UgbG9naWMuIEZvciBub24gQUxpIHJlbHkgb24gQklPUy4KLQkJICAgU2V0IHRoZSBzb3V0aCBicmlkZ2UgZW5hYmxlIGJpdCAqLwotCQlwY2lfcmVhZF9jb25maWdfYnl0ZShpc2FfYnJpZGdlLCAweDc5LCAmdG1wKTsKLQkJaWYgKHBkZXYtPnJldmlzaW9uID09IDB4QzIpCi0JCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoaXNhX2JyaWRnZSwgMHg3OSwgdG1wIHwgMHgwNCk7Ci0JCWVsc2UgaWYgKHBkZXYtPnJldmlzaW9uID4gMHhDMiAmJiBwZGV2LT5yZXZpc2lvbiA8IDB4QzUpCi0JCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoaXNhX2JyaWRnZSwgMHg3OSwgdG1wIHwgMHgwMik7Ci0JfQotCWlmIChwZGV2LT5yZXZpc2lvbiA+PSAweDIwKSB7CisJCWlmIChwZGV2LT5yZXZpc2lvbiA8IDB4QzIpCisJCQkvKiAxNTQzLUUvRiwgMTU0M0MtQywgMTU0M0MtRCwgMTU0M0MtRSAqLworCQkJLyogQ2xlYXIgQ0QtUk9NIERNQSB3cml0ZSBiaXQgKi8KKwkJCXRtcCAmPSAweDdGOworCQkvKiBDYWJsZSBhbmQgVURNQSAqLworCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgMHg0QiwgdG1wIHwgMHgwOSk7CiAJCS8qCiAJCSAqIENEX1JPTSBETUEgb24gKDB4NTMgYml0IDApLiBFbmFibGUgdGhpcyBldmVuIGlmIHdlIHdhbnQKIAkJICogdG8gdXNlIFBJTy4gMHg1MyBiaXQgMSAocmV2IDIwIG9ubHkpIC0gZW5hYmxlIEZJRk8gY29udHJvbAogCQkgKiB2aWEgMHg1NC81NS4KIAkJICovCiAJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIDB4NTMsICZ0bXApOwotCQlpZiAocGRldi0+cmV2aXNpb24gPD0gMHgyMCkKLQkJCXRtcCAmPSB+MHgwMjsKIAkJaWYgKHBkZXYtPnJldmlzaW9uID49IDB4YzcpCiAJCQl0bXAgfD0gMHgwMzsKIAkJZWxzZQogCQkJdG1wIHw9IDB4MDE7CS8qIENEX1JPTSBlbmFibGUgZm9yIERNQSAqLwogCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgMHg1MywgdG1wKTsKIAl9Ci0JcGNpX2Rldl9wdXQoaXNhX2JyaWRnZSk7CisJbm9ydGggPSBwY2lfZ2V0X2J1c19hbmRfc2xvdCgwLCBQQ0lfREVWRk4oMCwwKSk7CisJaWYgKG5vcnRoICYmIG5vcnRoLT52ZW5kb3IgPT0gUENJX1ZFTkRPUl9JRF9BTCAmJiBhbGlfaXNhX2JyaWRnZSkgeworCQkvKiBDb25maWd1cmUgdGhlIEFMaSBicmlkZ2UgbG9naWMuIEZvciBub24gQUxpIHJlbHkgb24gQklPUy4KKwkJICAgU2V0IHRoZSBzb3V0aCBicmlkZ2UgZW5hYmxlIGJpdCAqLworCQlwY2lfcmVhZF9jb25maWdfYnl0ZShhbGlfaXNhX2JyaWRnZSwgMHg3OSwgJnRtcCk7CisJCWlmIChwZGV2LT5yZXZpc2lvbiA9PSAweEMyKQorCQkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGFsaV9pc2FfYnJpZGdlLCAweDc5LCB0bXAgfCAweDA0KTsKKwkJZWxzZSBpZiAocGRldi0+cmV2aXNpb24gPiAweEMyICYmIHBkZXYtPnJldmlzaW9uIDwgMHhDNSkKKwkJCXBjaV93cml0ZV9jb25maWdfYnl0ZShhbGlfaXNhX2JyaWRnZSwgMHg3OSwgdG1wIHwgMHgwMik7CisJfQogCXBjaV9kZXZfcHV0KG5vcnRoKTsKIAlhdGFfcGNpX2JtZG1hX2NsZWFyX3NpbXBsZXgocGRldik7CiB9CkBAIC01MDMsNyArNTMyLDcgQEAKIAkJLnBpb19tYXNrID0gMHgxZiwKIAkJLm13ZG1hX21hc2sgPSAweDA3LAogCQkudWRtYV9tYXNrID0gQVRBX1VETUE1LAotCQkucG9ydF9vcHMgPSAmYWxpX2MyX3BvcnRfb3BzCisJCS5wb3J0X29wcyA9ICZhbGlfYzRfcG9ydF9vcHMKIAl9OwogCS8qIFJldmlzaW9uIDB4QzUgaXMgVURNQTEzMyB3aXRoIExCQTQ4IERNQSAqLwogCXN0YXRpYyBjb25zdCBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyBpbmZvX2M1ID0gewpAQCAtNTE2LDcgKzU0NSw2IEBACiAKIAljb25zdCBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyAqcHBpW10gPSB7IE5VTEwsIE5VTEwgfTsKIAl1OCB0bXA7Ci0Jc3RydWN0IHBjaV9kZXYgKmlzYV9icmlkZ2U7CiAJaW50IHJjOwogCiAJcmMgPSBwY2ltX2VuYWJsZV9kZXZpY2UocGRldik7CkBAIC01NDMsMTQgKzU3MSwxMiBAQAogCiAJYWxpX2luaXRfY2hpcHNldChwZGV2KTsKIAotCWlzYV9icmlkZ2UgPSBwY2lfZ2V0X2RldmljZShQQ0lfVkVORE9SX0lEX0FMLCBQQ0lfREVWSUNFX0lEX0FMX00xNTMzLCBOVUxMKTsKLQlpZiAoaXNhX2JyaWRnZSAmJiBwZGV2LT5yZXZpc2lvbiA+PSAweDIwICYmIHBkZXYtPnJldmlzaW9uIDwgMHhDMikgeworCWlmIChhbGlfaXNhX2JyaWRnZSAmJiBwZGV2LT5yZXZpc2lvbiA+PSAweDIwICYmIHBkZXYtPnJldmlzaW9uIDwgMHhDMikgewogCQkvKiBBcmUgd2UgcGFpcmVkIHdpdGggYSBVRE1BIGNhcGFibGUgY2hpcCAqLwotCQlwY2lfcmVhZF9jb25maWdfYnl0ZShpc2FfYnJpZGdlLCAweDVFLCAmdG1wKTsKKwkJcGNpX3JlYWRfY29uZmlnX2J5dGUoYWxpX2lzYV9icmlkZ2UsIDB4NUUsICZ0bXApOwogCQlpZiAoKHRtcCAmIDB4MUUpID09IDB4MTIpCiAJICAgICAgICAJcHBpWzBdID0gJmluZm9fMjBfdWRtYTsKIAl9Ci0JcGNpX2Rldl9wdXQoaXNhX2JyaWRnZSk7CiAKIAlyZXR1cm4gYXRhX3BjaV9zZmZfaW5pdF9vbmUocGRldiwgcHBpLCAmYWxpX3NodCwgTlVMTCk7CiB9CkBAIC01OTAsMTMgKzYxNiwyMCBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBhbGlfaW5pdCh2b2lkKQogewotCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZhbGlfcGNpX2RyaXZlcik7CisJaW50IHJldDsKKwlhbGlfaXNhX2JyaWRnZSA9IHBjaV9nZXRfZGV2aWNlKFBDSV9WRU5ET1JfSURfQUwsIFBDSV9ERVZJQ0VfSURfQUxfTTE1MzMsIE5VTEwpOworCisJcmV0ID0gcGNpX3JlZ2lzdGVyX2RyaXZlcigmYWxpX3BjaV9kcml2ZXIpOworCWlmIChyZXQgPCAwKQorCQlwY2lfZGV2X3B1dChhbGlfaXNhX2JyaWRnZSk7CisJcmV0dXJuIHJldDsKIH0KIAogCiBzdGF0aWMgdm9pZCBfX2V4aXQgYWxpX2V4aXQodm9pZCkKIHsKIAlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmFsaV9wY2lfZHJpdmVyKTsKKwlwY2lfZGV2X3B1dChhbGlfaXNhX2JyaWRnZSk7CiB9CiAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9hbWQuYyBiL2RyaXZlcnMvYXRhL3BhdGFfYW1kLmMKaW5kZXggMGVjOWM3ZC4uNjM3MTlhYjllIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX2FtZC5jCisrKyBiL2RyaXZlcnMvYXRhL3BhdGFfYW1kLmMKQEAgLTI0LDcgKzI0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9saWJhdGEuaD4KIAogI2RlZmluZSBEUlZfTkFNRSAicGF0YV9hbWQiCi0jZGVmaW5lIERSVl9WRVJTSU9OICIwLjMuMTAiCisjZGVmaW5lIERSVl9WRVJTSU9OICIwLjMuMTEiCiAKIC8qKgogICoJdGltaW5nX3NldHVwCQktCXNoYXJlZCB0aW1pbmcgY29tcHV0YXRpb24gYW5kIGxvYWQKQEAgLTM0NSw3ICszNDUsNyBAQAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBhdGFfcG9ydF9vcGVyYXRpb25zIGFtZF9iYXNlX3BvcnRfb3BzID0gewotCS5pbmhlcml0cwk9ICZhdGFfYm1kbWFfcG9ydF9vcHMsCisJLmluaGVyaXRzCT0gJmF0YV9ibWRtYTMyX3BvcnRfb3BzLAogCS5wcmVyZXNldAk9IGFtZF9wcmVfcmVzZXQsCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9wYXRhX2F0aWl4cC5jIGIvZHJpdmVycy9hdGEvcGF0YV9hdGlpeHAuYwppbmRleCAwZTJjZGU4Li41MDZhZGRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX2F0aWl4cC5jCisrKyBiL2RyaXZlcnMvYXRhL3BhdGFfYXRpaXhwLmMKQEAgLTMyLDIxICszMiw2IEBACiAJQVRJSVhQX0lERV9VRE1BX01PREUgCT0gMHg1NgogfTsKIAotc3RhdGljIGludCBhdGlpeHBfcHJlX3Jlc2V0KHN0cnVjdCBhdGFfbGluayAqbGluaywgdW5zaWduZWQgbG9uZyBkZWFkbGluZSkKLXsKLQlzdHJ1Y3QgYXRhX3BvcnQgKmFwID0gbGluay0+YXA7Ci0Jc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfYml0cyBhdGlpeHBfZW5hYmxlX2JpdHNbXSA9IHsKLQkJeyAweDQ4LCAxLCAweDAxLCAweDAwIH0sCi0JCXsgMHg0OCwgMSwgMHgwOCwgMHgwMCB9Ci0JfTsKLQlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHRvX3BjaV9kZXYoYXAtPmhvc3QtPmRldik7Ci0KLQlpZiAoIXBjaV90ZXN0X2NvbmZpZ19iaXRzKHBkZXYsICZhdGlpeHBfZW5hYmxlX2JpdHNbYXAtPnBvcnRfbm9dKSkKLQkJcmV0dXJuIC1FTk9FTlQ7Ci0KLQlyZXR1cm4gYXRhX3NmZl9wcmVyZXNldChsaW5rLCBkZWFkbGluZSk7Ci19Ci0KIHN0YXRpYyBpbnQgYXRpaXhwX2NhYmxlX2RldGVjdChzdHJ1Y3QgYXRhX3BvcnQgKmFwKQogewogCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdG9fcGNpX2RldihhcC0+aG9zdC0+ZGV2KTsKQEAgLTIyOSwxMCArMjE0LDkgQEAKIAkuY2FibGVfZGV0ZWN0CT0gYXRpaXhwX2NhYmxlX2RldGVjdCwKIAkuc2V0X3Bpb21vZGUJPSBhdGlpeHBfc2V0X3Bpb21vZGUsCiAJLnNldF9kbWFtb2RlCT0gYXRpaXhwX3NldF9kbWFtb2RlLAotCS5wcmVyZXNldAk9IGF0aWl4cF9wcmVfcmVzZXQsCiB9OwogCi1zdGF0aWMgaW50IGF0aWl4cF9pbml0X29uZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpCitzdGF0aWMgaW50IGF0aWl4cF9pbml0X29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkKQogewogCXN0YXRpYyBjb25zdCBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyBpbmZvID0gewogCQkuZmxhZ3MgPSBBVEFfRkxBR19TTEFWRV9QT1NTLApAQCAtMjQxLDggKzIyNSwxOCBAQAogCQkudWRtYV9tYXNrID0gMHgzRiwKIAkJLnBvcnRfb3BzID0gJmF0aWl4cF9wb3J0X29wcwogCX07Ci0JY29uc3Qgc3RydWN0IGF0YV9wb3J0X2luZm8gKnBwaVtdID0geyAmaW5mbywgTlVMTCB9OwotCXJldHVybiBhdGFfcGNpX3NmZl9pbml0X29uZShkZXYsIHBwaSwgJmF0aWl4cF9zaHQsIE5VTEwpOworCXN0YXRpYyBjb25zdCBzdHJ1Y3QgcGNpX2JpdHMgYXRpaXhwX2VuYWJsZV9iaXRzW10gPSB7CisJCXsgMHg0OCwgMSwgMHgwMSwgMHgwMCB9LAorCQl7IDB4NDgsIDEsIDB4MDgsIDB4MDAgfQorCX07CisJY29uc3Qgc3RydWN0IGF0YV9wb3J0X2luZm8gKnBwaVtdID0geyAmaW5mbywgJmluZm8gfTsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspCisJCWlmICghcGNpX3Rlc3RfY29uZmlnX2JpdHMocGRldiwgJmF0aWl4cF9lbmFibGVfYml0c1tpXSkpCisJCQlwcGlbaV0gPSAmYXRhX2R1bW15X3BvcnRfaW5mbzsKKworCXJldHVybiBhdGFfcGNpX3NmZl9pbml0X29uZShwZGV2LCBwcGksICZhdGlpeHBfc2h0LCBOVUxMKTsKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkIGF0aWl4cFtdID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9ocHQzNjYuYyBiL2RyaXZlcnMvYXRhL3BhdGFfaHB0MzY2LmMKaW5kZXggZTBjNGYwNS4uNjVjMjhlNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvcGF0YV9ocHQzNjYuYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX2hwdDM2Ni5jCkBAIC0zMCw3ICszMCw3IEBACiAjZGVmaW5lIERSVl9WRVJTSU9OCSIwLjYuMiIKIAogc3RydWN0IGhwdF9jbG9jayB7Ci0JdTgJeGZlcl9zcGVlZDsKKwl1OAl4ZmVyX21vZGU7CiAJdTMyCXRpbWluZzsKIH07CiAKQEAgLTE4OSwyOCArMTg5LDYgQEAKIAlyZXR1cm4gYXRhX2JtZG1hX21vZGVfZmlsdGVyKGFkZXYsIG1hc2spOwogfQogCi0vKioKLSAqCWhwdDM2eF9maW5kX21vZGUJLQlyZXNldCB0aGUgaHB0MzZ4IGJ1cwotICoJQGFwOiBBVEEgcG9ydAotICoJQHNwZWVkOiB0cmFuc2ZlciBtb2RlCi0gKgotICoJUmV0dXJuIHRoZSAzMmJpdCByZWdpc3RlciBwcm9ncmFtbWluZyBpbmZvcm1hdGlvbiBmb3IgdGhpcyBjaGFubmVsCi0gKgl0aGF0IG1hdGNoZXMgdGhlIHNwZWVkIHByb3ZpZGVkLgotICovCi0KLXN0YXRpYyB1MzIgaHB0MzZ4X2ZpbmRfbW9kZShzdHJ1Y3QgYXRhX3BvcnQgKmFwLCBpbnQgc3BlZWQpCi17Ci0Jc3RydWN0IGhwdF9jbG9jayAqY2xvY2tzID0gYXAtPmhvc3QtPnByaXZhdGVfZGF0YTsKLQotCXdoaWxlKGNsb2Nrcy0+eGZlcl9zcGVlZCkgewotCQlpZiAoY2xvY2tzLT54ZmVyX3NwZWVkID09IHNwZWVkKQotCQkJcmV0dXJuIGNsb2Nrcy0+dGltaW5nOwotCQljbG9ja3MrKzsKLQl9Ci0JQlVHKCk7Ci0JcmV0dXJuIDB4ZmZmZmZmZmZVOwkvKiBzaWxlbmNlIGNvbXBpbGVyIHdhcm5pbmcgKi8KLX0KLQogc3RhdGljIGludCBocHQzNnhfY2FibGVfZGV0ZWN0KHN0cnVjdCBhdGFfcG9ydCAqYXApCiB7CiAJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0b19wY2lfZGV2KGFwLT5ob3N0LT5kZXYpOwpAQCAtMjI2LDYgKzIwNCw0OSBAQAogCXJldHVybiBBVEFfQ0JMX1BBVEE4MDsKIH0KIAorc3RhdGljIHZvaWQgaHB0MzY2X3NldF9tb2RlKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHN0cnVjdCBhdGFfZGV2aWNlICphZGV2LAorCQkJICAgIHU4IG1vZGUpCit7CisJc3RydWN0IGhwdF9jbG9jayAqY2xvY2tzID0gYXAtPmhvc3QtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHRvX3BjaV9kZXYoYXAtPmhvc3QtPmRldik7CisJdTMyIGFkZHIxID0gMHg0MCArIDQgKiAoYWRldi0+ZGV2bm8gKyAyICogYXAtPnBvcnRfbm8pOworCXUzMiBhZGRyMiA9IDB4NTEgKyA0ICogYXAtPnBvcnRfbm87CisJdTMyIG1hc2ssIHJlZzsKKwl1OCBmYXN0OworCisJLyogRmFzdCBpbnRlcnJ1cHQgcHJlZGljdGlvbiBkaXNhYmxlLCBob2xkIG9mZiBpbnRlcnJ1cHQgZGlzYWJsZSAqLworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIGFkZHIyLCAmZmFzdCk7CisJaWYgKGZhc3QgJiAweDgwKSB7CisJCWZhc3QgJj0gfjB4ODA7CisJCXBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCBhZGRyMiwgZmFzdCk7CisJfQorCisJLyogZGV0ZXJtaW5lIHRpbWluZyBtYXNrIGFuZCBmaW5kIG1hdGNoaW5nIGNsb2NrIGVudHJ5ICovCisJaWYgKG1vZGUgPCBYRkVSX01XX0RNQV8wKQorCQltYXNrID0gMHhjMWY4ZmZmZjsKKwllbHNlIGlmIChtb2RlIDwgWEZFUl9VRE1BXzApCisJCW1hc2sgPSAweDMwMzgwMGZmOworCWVsc2UKKwkJbWFzayA9IDB4MzAwNzAwMDA7CisKKwl3aGlsZSAoY2xvY2tzLT54ZmVyX21vZGUpIHsKKwkJaWYgKGNsb2Nrcy0+eGZlcl9tb2RlID09IG1vZGUpCisJCQlicmVhazsKKwkJY2xvY2tzKys7CisJfQorCWlmICghY2xvY2tzLT54ZmVyX21vZGUpCisJCUJVRygpOworCisJLyoKKwkgKiBDb21iaW5lIG5ldyBtb2RlIGJpdHMgd2l0aCBvbGQgY29uZmlnIGJpdHMgYW5kIGRpc2FibGUKKwkgKiBvbi1jaGlwIFBJTyBGSUZPL2J1ZmZlciAoYW5kIFBJTyBNU1QgbW9kZSBhcyB3ZWxsKSB0byBhdm9pZAorCSAqIHByb2JsZW1zIGhhbmRsaW5nIEkvTyBlcnJvcnMgbGF0ZXIuCisJICovCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBkZXYsIGFkZHIxLCAmcmVnKTsKKwlyZWcgPSAoKHJlZyAmIH5tYXNrKSB8IChjbG9ja3MtPnRpbWluZyAmIG1hc2spKSAmIH4weGMwMDAwMDAwOworCXBjaV93cml0ZV9jb25maWdfZHdvcmQocGRldiwgYWRkcjEsIHJlZyk7Cit9CisKIC8qKgogICoJaHB0MzY2X3NldF9waW9tb2RlCQktCVBJTyBzZXR1cAogICoJQGFwOiBBVEEgaW50ZXJmYWNlCkBAIC0yMzYsMjggKzI1Nyw3IEBACiAKIHN0YXRpYyB2b2lkIGhwdDM2Nl9zZXRfcGlvbW9kZShzdHJ1Y3QgYXRhX3BvcnQgKmFwLCBzdHJ1Y3QgYXRhX2RldmljZSAqYWRldikKIHsKLQlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHRvX3BjaV9kZXYoYXAtPmhvc3QtPmRldik7Ci0JdTMyIGFkZHIxLCBhZGRyMjsKLQl1MzIgcmVnOwotCXUzMiBtb2RlOwotCXU4IGZhc3Q7Ci0KLQlhZGRyMSA9IDB4NDAgKyA0ICogKGFkZXYtPmRldm5vICsgMiAqIGFwLT5wb3J0X25vKTsKLQlhZGRyMiA9IDB4NTEgKyA0ICogYXAtPnBvcnRfbm87Ci0KLQkvKiBGYXN0IGludGVycnVwdCBwcmVkaWN0aW9uIGRpc2FibGUsIGhvbGQgb2ZmIGludGVycnVwdCBkaXNhYmxlICovCi0JcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgYWRkcjIsICZmYXN0KTsKLQlpZiAoZmFzdCAmIDB4ODApIHsKLQkJZmFzdCAmPSB+MHg4MDsKLQkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIGFkZHIyLCBmYXN0KTsKLQl9Ci0KLQlwY2lfcmVhZF9jb25maWdfZHdvcmQocGRldiwgYWRkcjEsICZyZWcpOwotCW1vZGUgPSBocHQzNnhfZmluZF9tb2RlKGFwLCBhZGV2LT5waW9fbW9kZSk7Ci0JbW9kZSAmPSB+MHg4MDAwMDAwOwkvKiBObyBGSUZPIGluIFBJTyAqLwotCW1vZGUgJj0gfjB4MzAwNzAwMDA7CS8qIExlYXZlIGNvbmZpZyBiaXRzIGFsb25lICovCi0JcmVnICY9IDB4MzAwNzAwMDA7CS8qIFN0cmlwIHRpbWluZyBiaXRzICovCi0JcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwZGV2LCBhZGRyMSwgcmVnIHwgbW9kZSk7CisJaHB0MzY2X3NldF9tb2RlKGFwLCBhZGV2LCBhZGV2LT5waW9fbW9kZSk7CiB9CiAKIC8qKgpAQCAtMjcxLDI4ICsyNzEsNyBAQAogCiBzdGF0aWMgdm9pZCBocHQzNjZfc2V0X2RtYW1vZGUoc3RydWN0IGF0YV9wb3J0ICphcCwgc3RydWN0IGF0YV9kZXZpY2UgKmFkZXYpCiB7Ci0Jc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0b19wY2lfZGV2KGFwLT5ob3N0LT5kZXYpOwotCXUzMiBhZGRyMSwgYWRkcjI7Ci0JdTMyIHJlZzsKLQl1MzIgbW9kZTsKLQl1OCBmYXN0OwotCi0JYWRkcjEgPSAweDQwICsgNCAqIChhZGV2LT5kZXZubyArIDIgKiBhcC0+cG9ydF9ubyk7Ci0JYWRkcjIgPSAweDUxICsgNCAqIGFwLT5wb3J0X25vOwotCi0JLyogRmFzdCBpbnRlcnJ1cHQgcHJlZGljdGlvbiBkaXNhYmxlLCBob2xkIG9mZiBpbnRlcnJ1cHQgZGlzYWJsZSAqLwotCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIGFkZHIyLCAmZmFzdCk7Ci0JaWYgKGZhc3QgJiAweDgwKSB7Ci0JCWZhc3QgJj0gfjB4ODA7Ci0JCXBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCBhZGRyMiwgZmFzdCk7Ci0JfQotCi0JcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBkZXYsIGFkZHIxLCAmcmVnKTsKLQltb2RlID0gaHB0MzZ4X2ZpbmRfbW9kZShhcCwgYWRldi0+ZG1hX21vZGUpOwotCW1vZGUgfD0gMHg4MDAwMDAwOwkvKiBGSUZPIGluIE1XRE1BIG9yIFVETUEgKi8KLQltb2RlICY9IH4weEMwMDAwMDAwOwkvKiBMZWF2ZSBjb25maWcgYml0cyBhbG9uZSAqLwotCXJlZyAmPSAweEMwMDAwMDAwOwkvKiBTdHJpcCB0aW1pbmcgYml0cyAqLwotCXBjaV93cml0ZV9jb25maWdfZHdvcmQocGRldiwgYWRkcjEsIHJlZyB8IG1vZGUpOworCWhwdDM2Nl9zZXRfbW9kZShhcCwgYWRldiwgYWRldi0+ZG1hX21vZGUpOwogfQogCiBzdGF0aWMgc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSBocHQzNnhfc2h0ID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9ocHQzeDMuYyBiL2RyaXZlcnMvYXRhL3BhdGFfaHB0M3gzLmMKaW5kZXggZjExYTMyMC4uZjE5Y2M2NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvcGF0YV9ocHQzeDMuYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX2hwdDN4My5jCkBAIC0yMyw3ICsyMyw3IEBACiAjaW5jbHVkZSA8bGludXgvbGliYXRhLmg+CiAKICNkZWZpbmUgRFJWX05BTUUJInBhdGFfaHB0M3gzIgotI2RlZmluZSBEUlZfVkVSU0lPTgkiMC41LjMiCisjZGVmaW5lIERSVl9WRVJTSU9OCSIwLjYuMSIKIAogLyoqCiAgKglocHQzeDNfc2V0X3Bpb21vZGUJCS0JUElPIHNldHVwCkBAIC04MCwxNCArODAsNDggQEAKIAlyMiAmPSB+KDB4MTEgPDwgZG4pOwkvKiBDbGVhciBNV0RNQSBhbmQgVURNQSBiaXRzICovCiAKIAlpZiAoYWRldi0+ZG1hX21vZGUgPj0gWEZFUl9VRE1BXzApCi0JCXIyIHw9ICgweDEwIDw8IGRuKTsJLyogVWx0cmEgbW9kZSAqLworCQlyMiB8PSAoMHgwMSA8PCBkbik7CS8qIFVsdHJhIG1vZGUgKi8KIAllbHNlCi0JCXIyIHw9ICgweDAxIDw8IGRuKTsJLyogTVdETUEgKi8KKwkJcjIgfD0gKDB4MTAgPDwgZG4pOwkvKiBNV0RNQSAqLwogCiAJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwZGV2LCAweDQ0LCByMSk7CiAJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwZGV2LCAweDQ4LCByMik7CiB9Ci0jZW5kaWYgLyogQ09ORklHX1BBVEFfSFBUM1gzX0RNQSAqLworCisvKioKKyAqCWhwdDN4M19mcmVlemUJCS0JRE1BIHdvcmthcm91bmQKKyAqCUBhcDogcG9ydCB0byBmcmVlemUKKyAqCisgKglXaGVuIGZyZWV6aW5nIGFuIEhQVDN4MyB3ZSBtdXN0IHN0b3AgYW55IHBlbmRpbmcgRE1BIGJlZm9yZQorICoJd3JpdGluZyB0byB0aGUgY29udHJvbCByZWdpc3RlciBvciB0aGUgY2hpcCB3aWxsIGhhbmcKKyAqLworCitzdGF0aWMgdm9pZCBocHQzeDNfZnJlZXplKHN0cnVjdCBhdGFfcG9ydCAqYXApCit7CisJdm9pZCBfX2lvbWVtICptbWlvID0gYXAtPmlvYWRkci5ibWRtYV9hZGRyOworCisJaW93cml0ZTgoaW9yZWFkOChtbWlvICsgQVRBX0RNQV9DTUQpICYgfiBBVEFfRE1BX1NUQVJULAorCQkJbW1pbyArIEFUQV9ETUFfQ01EKTsKKwlhdGFfc2ZmX2RtYV9wYXVzZShhcCk7CisJYXRhX3NmZl9mcmVlemUoYXApOworfQorCisvKioKKyAqCWhwdDN4M19ibWRtYV9zZXR1cAktCURNQSB3b3JrYXJvdW5kCisgKglAcWM6IFF1ZXVlZCBjb21tYW5kCisgKgorICoJV2hlbiBpc3N1aW5nIEJNRE1BIHdlIG11c3QgY2xlYW4gdXAgdGhlIGVycm9yL2FjdGl2ZSBiaXRzIGluCisgKglzb2Z0d2FyZSBvbiB0aGlzIGRldmljZQorICovCisKK3N0YXRpYyB2b2lkIGhwdDN4M19ibWRtYV9zZXR1cChzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjKQoreworCXN0cnVjdCBhdGFfcG9ydCAqYXAgPSBxYy0+YXA7CisJdTggciA9IGlvcmVhZDgoYXAtPmlvYWRkci5ibWRtYV9hZGRyICsgQVRBX0RNQV9TVEFUVVMpOworCXIgfD0gQVRBX0RNQV9JTlRSIHwgQVRBX0RNQV9FUlI7CisJaW93cml0ZTgociwgYXAtPmlvYWRkci5ibWRtYV9hZGRyICsgQVRBX0RNQV9TVEFUVVMpOworCXJldHVybiBhdGFfYm1kbWFfc2V0dXAocWMpOworfQogCiAvKioKICAqCWhwdDN4M19hdGFwaV9kbWEJLQlBVEFQSSBETUEgY2hlY2sKQEAgLTEwMSwxOCArMTM1LDIzIEBACiAJcmV0dXJuIDE7CiB9CiAKKyNlbmRpZiAvKiBDT05GSUdfUEFUQV9IUFQzWDNfRE1BICovCisKIHN0YXRpYyBzdHJ1Y3Qgc2NzaV9ob3N0X3RlbXBsYXRlIGhwdDN4M19zaHQgPSB7CiAJQVRBX0JNRE1BX1NIVChEUlZfTkFNRSksCiB9OwogCiBzdGF0aWMgc3RydWN0IGF0YV9wb3J0X29wZXJhdGlvbnMgaHB0M3gzX3BvcnRfb3BzID0gewogCS5pbmhlcml0cwk9ICZhdGFfYm1kbWFfcG9ydF9vcHMsCi0JLmNoZWNrX2F0YXBpX2RtYT0gaHB0M3gzX2F0YXBpX2RtYSwKIAkuY2FibGVfZGV0ZWN0CT0gYXRhX2NhYmxlXzQwd2lyZSwKIAkuc2V0X3Bpb21vZGUJPSBocHQzeDNfc2V0X3Bpb21vZGUsCiAjaWYgZGVmaW5lZChDT05GSUdfUEFUQV9IUFQzWDNfRE1BKQogCS5zZXRfZG1hbW9kZQk9IGhwdDN4M19zZXRfZG1hbW9kZSwKKwkuYm1kbWFfc2V0dXAJPSBocHQzeDNfYm1kbWFfc2V0dXAsCisJLmNoZWNrX2F0YXBpX2RtYT0gaHB0M3gzX2F0YXBpX2RtYSwKKwkuZnJlZXplCQk9IGhwdDN4M19mcmVlemUsCiAjZW5kaWYKKwkKIH07CiAKIC8qKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9pdDgyMXguYyBiL2RyaXZlcnMvYXRhL3BhdGFfaXQ4MjF4LmMKaW5kZXggZjgyOGEyOS4uZjFiYjJmOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvcGF0YV9pdDgyMXguYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX2l0ODIxeC5jCkBAIC04MCw3ICs4MCw3IEBACiAKIAogI2RlZmluZSBEUlZfTkFNRSAicGF0YV9pdDgyMXgiCi0jZGVmaW5lIERSVl9WRVJTSU9OICIwLjQuMCIKKyNkZWZpbmUgRFJWX1ZFUlNJT04gIjAuNC4yIgogCiBzdHJ1Y3QgaXQ4MjF4X2RldgogewpAQCAtNDk0LDggKzQ5NCw2IEBACiAgKglzcGVjaWFsLiBJbiBvdXIgY2FzZSB3ZSBuZWVkIHRvIGxvY2sgdGhlIHNlY3RvciBjb3VudCB0byBhdm9pZAogICoJYmxvd2luZyB0aGUgYnJhaW5zIG91dCBvZiB0aGUgZmlybXdhcmUgd2l0aCBsYXJnZSBMQkE0OCByZXF1ZXN0cwogICoKLSAqCUZJWE1FOiBXaGVuIEZVQSBhcHBlYXJzIHdlIG5lZWQgdG8gYmxvY2sgRlVBIHRvby4gQW5kIFNNQVJUIGFuZAotICoJYmFzaWNhbGx5IHdlIG5lZWQgdG8gZmlsdGVyIGNvbW1hbmRzIGZvciB0aGlzIGNoaXAuCiAgKi8KIAogc3RhdGljIHZvaWQgaXQ4MjF4X2Rldl9jb25maWcoc3RydWN0IGF0YV9kZXZpY2UgKmFkZXYpCkBAIC04OTAsNiArODg4LDEzIEBACiAJCS5mbGFncyA9IEFUQV9GTEFHX1NMQVZFX1BPU1MsCiAJCS5waW9fbWFzayA9IDB4MWYsCiAJCS5td2RtYV9tYXNrID0gMHgwNywKKwkJLnVkbWFfbWFzayA9IEFUQV9VRE1BNiwKKwkJLnBvcnRfb3BzID0gJml0ODIxeF9yZGNfcG9ydF9vcHMKKwl9OworCXN0YXRpYyBjb25zdCBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyBpbmZvX3JkY18xMSA9IHsKKwkJLmZsYWdzID0gQVRBX0ZMQUdfU0xBVkVfUE9TUywKKwkJLnBpb19tYXNrID0gMHgxZiwKKwkJLm13ZG1hX21hc2sgPSAweDA3LAogCQkvKiBObyBVRE1BICovCiAJCS5wb3J0X29wcyA9ICZpdDgyMXhfcmRjX3BvcnRfb3BzCiAJfTsKQEAgLTkwMyw3ICs5MDgsMTEgQEAKIAkJcmV0dXJuIHJjOwogCQkKIAlpZiAocGRldi0+dmVuZG9yID09IFBDSV9WRU5ET1JfSURfUkRDKSB7Ci0JCXBwaVswXSA9ICZpbmZvX3JkYzsKKwkJLyogRGVhbCB3aXRoIFZvcnRleDg2U1ggKi8KKwkJaWYgKHBkZXYtPnJldmlzaW9uID09IDB4MTEpCisJCQlwcGlbMF0gPSAmaW5mb19yZGNfMTE7CisJCWVsc2UKKwkJCXBwaVswXSA9ICZpbmZvX3JkYzsKIAl9IGVsc2UgewogCQkvKiBGb3JjZSB0aGUgY2FyZCBpbnRvIGJ5cGFzcyBtb2RlIGlmIHNvIHJlcXVlc3RlZCAqLwogCQlpZiAoaXQ4MjEyX25vcmFpZCkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9tcGlpeC5jIGIvZHJpdmVycy9hdGEvcGF0YV9tcGlpeC5jCmluZGV4IDdjOGZhYTQ4Li5hYTU3NmNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX21waWl4LmMKKysrIGIvZHJpdmVycy9hdGEvcGF0YV9tcGlpeC5jCkBAIC0zNSw3ICszNSw3IEBACiAjaW5jbHVkZSA8bGludXgvbGliYXRhLmg+CiAKICNkZWZpbmUgRFJWX05BTUUgInBhdGFfbXBpaXgiCi0jZGVmaW5lIERSVl9WRVJTSU9OICIwLjcuNiIKKyNkZWZpbmUgRFJWX1ZFUlNJT04gIjAuNy43IgogCiBlbnVtIHsKIAlJREVUSU0gPSAweDZDLAkJLyogSURFIGNvbnRyb2wgcmVnaXN0ZXIgKi8KQEAgLTE0Niw2ICsxNDYsNyBAQAogCS5jYWJsZV9kZXRlY3QJPSBhdGFfY2FibGVfNDB3aXJlLAogCS5zZXRfcGlvbW9kZQk9IG1waWl4X3NldF9waW9tb2RlLAogCS5wcmVyZXNldAk9IG1waWl4X3ByZV9yZXNldCwKKwkuc2ZmX2RhdGFfeGZlcgk9IGF0YV9zZmZfZGF0YV94ZmVyMzIsCiB9OwogCiBzdGF0aWMgaW50IG1waWl4X2luaXRfb25lKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3BhdGFfb2N0ZW9uX2NmLmMgYi9kcml2ZXJzL2F0YS9wYXRhX29jdGVvbl9jZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmZTRlZjMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2F0YS9wYXRhX29jdGVvbl9jZi5jCkBAIC0wLDAgKzEsOTY1IEBACisvKgorICogRHJpdmVyIGZvciB0aGUgT2N0ZW9uIGJvb3RidXMgY29tcGFjdCBmbGFzaC4KKyAqCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgLSAyMDA5IENhdml1bSBOZXR3b3JrcworICogQ29weXJpZ2h0IChDKSAyMDA4IFdpbmQgUml2ZXIgU3lzdGVtcworICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9saWJhdGEuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgorCisjaW5jbHVkZSA8YXNtL29jdGVvbi9vY3Rlb24uaD4KKworLyoKKyAqIFRoZSBPY3Rlb24gYm9vdGJ1cyBjb21wYWN0IGZsYXNoIGludGVyZmFjZSBpcyBjb25uZWN0ZWQgaW4gYXQgbGVhc3QKKyAqIDMgZGlmZmVyZW50IGNvbmZpZ3VyYXRpb25zIG9uIHZhcmlvdXMgZXZhbHVhdGlvbiBib2FyZHM6CisgKgorICogLS0gOCAgYml0cyBubyBpcnEsIG5vIERNQQorICogLS0gMTYgYml0cyBubyBpcnEsIG5vIERNQQorICogLS0gMTYgYml0cyBUcnVlIElERSBtb2RlIHdpdGggRE1BLCBidXQgbm8gaXJxLgorICoKKyAqIEluIHRoZSBsYXN0IGNhc2UgdGhlIERNQSBlbmdpbmUgY2FuIGdlbmVyYXRlIGFuIGludGVycnVwdCB3aGVuIHRoZQorICogdHJhbnNmZXIgaXMgY29tcGxldGUuICBGb3IgdGhlIGZpcnN0IHR3byBjYXNlcyBvbmx5IFBJTyBpcyBzdXBwb3J0ZWQuCisgKgorICovCisKKyNkZWZpbmUgRFJWX05BTUUJInBhdGFfb2N0ZW9uX2NmIgorI2RlZmluZSBEUlZfVkVSU0lPTgkiMi4xIgorCisKK3N0cnVjdCBvY3Rlb25fY2ZfcG9ydCB7CisJc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKndxOworCXN0cnVjdCBkZWxheWVkX3dvcmsgZGVsYXllZF9maW5pc2g7CisJc3RydWN0IGF0YV9wb3J0ICphcDsKKwlpbnQgZG1hX2ZpbmlzaGVkOworfTsKKworc3RhdGljIHN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgb2N0ZW9uX2NmX3NodCA9IHsKKwlBVEFfUElPX1NIVChEUlZfTkFNRSksCit9OworCisvKioKKyAqIENvbnZlcnQgbmFub3NlY29uZCBiYXNlZCB0aW1lIHRvIHNldHRpbmcgdXNlZCBpbiB0aGUKKyAqIGJvb3QgYnVzIHRpbWluZyByZWdpc3RlciwgYmFzZWQgb24gdGltaW5nIG11bHRpcGxlCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgbnNfdG9fdGltX3JlZyh1bnNpZ25lZCBpbnQgdGltX211bHQsIHVuc2lnbmVkIGludCBuc2VjcykKK3sKKwl1bnNpZ25lZCBpbnQgdmFsOworCisJLyoKKwkgKiBDb21wdXRlICMgb2YgZWNsb2NrIHBlcmlvZHMgdG8gZ2V0IGRlc2lyZWQgZHVyYXRpb24gaW4KKwkgKiBuYW5vc2Vjb25kcy4KKwkgKi8KKwl2YWwgPSBESVZfUk9VTkRfVVAobnNlY3MgKiAob2N0ZW9uX2dldF9jbG9ja19yYXRlKCkgLyAxMDAwMDAwKSwKKwkJCSAgMTAwMCAqIHRpbV9tdWx0KTsKKworCXJldHVybiB2YWw7Cit9CisKK3N0YXRpYyB2b2lkIG9jdGVvbl9jZl9zZXRfYm9vdF9yZWdfY2ZnKGludCBjcykKK3sKKwl1bmlvbiBjdm14X21pb19ib290X3JlZ19jZmd4IHJlZ19jZmc7CisJcmVnX2NmZy51NjQgPSBjdm14X3JlYWRfY3NyKENWTVhfTUlPX0JPT1RfUkVHX0NGR1goY3MpKTsKKwlyZWdfY2ZnLnMuZG1hY2sgPSAwOwkvKiBEb24ndCBhc3NlcnQgRE1BQ0sgb24gYWNjZXNzICovCisJcmVnX2NmZy5zLnRpbV9tdWx0ID0gMjsJLyogVGltaW5nIG11dGlwbGllciAyeCAqLworCXJlZ19jZmcucy5yZF9kbHkgPSAwOwkvKiBTYW1wbGUgb24gZmFsbGluZyBlZGdlIG9mIEJPT1RfT0UgKi8KKwlyZWdfY2ZnLnMuc2FtID0gMDsJLyogRG9uJ3QgY29tYmluZSB3cml0ZSBhbmQgb3V0cHV0IGVuYWJsZSAqLworCXJlZ19jZmcucy53ZV9leHQgPSAwOwkvKiBObyB3cml0ZSBlbmFibGUgZXh0ZW5zaW9uICovCisJcmVnX2NmZy5zLm9lX2V4dCA9IDA7CS8qIE5vIHJlYWQgZW5hYmxlIGV4dGVuc2lvbiAqLworCXJlZ19jZmcucy5lbiA9IDE7CS8qIEVuYWJsZSB0aGlzIHJlZ2lvbiAqLworCXJlZ19jZmcucy5vcmJpdCA9IDA7CS8qIERvbid0IGNvbWJpbmUgd2l0aCBwcmV2aW91cyByZWdpb24gKi8KKwlyZWdfY2ZnLnMuYWxlID0gMDsJLyogRG9uJ3QgZG8gYWRkcmVzcyBtdWx0aXBsZXhpbmcgKi8KKwljdm14X3dyaXRlX2NzcihDVk1YX01JT19CT09UX1JFR19DRkdYKGNzKSwgcmVnX2NmZy51NjQpOworfQorCisvKioKKyAqIENhbGxlZCBhZnRlciBsaWJhdGEgZGV0ZXJtaW5lcyB0aGUgbmVlZGVkIFBJTyBtb2RlLiBUaGlzCisgKiBmdW5jdGlvbiBwcm9ncmFtcyB0aGUgT2N0ZW9uIGJvb3RidXMgcmVnaW9ucyB0byBzdXBwb3J0IHRoZQorICogdGltaW5nIHJlcXVpcmVtZW50cyBvZiB0aGUgUElPIG1vZGUuCisgKgorICogQGFwOiAgICAgQVRBIHBvcnQgaW5mb3JtYXRpb24KKyAqIEBkZXY6ICAgIEFUQSBkZXZpY2UKKyAqLworc3RhdGljIHZvaWQgb2N0ZW9uX2NmX3NldF9waW9tb2RlKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHN0cnVjdCBhdGFfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG9jdGVvbl9jZl9kYXRhICpvY2QgPSBhcC0+ZGV2LT5wbGF0Zm9ybV9kYXRhOworCXVuaW9uIGN2bXhfbWlvX2Jvb3RfcmVnX3RpbXggcmVnX3RpbTsKKwlpbnQgY3MgPSBvY2QtPmJhc2VfcmVnaW9uOworCWludCBUOworCXN0cnVjdCBhdGFfdGltaW5nIHRpbWluZzsKKworCWludCB1c2VfaW9yZHk7CisJaW50IHRyaDsKKwlpbnQgcGF1c2U7CisJLyogVGhlc2UgbmFtZXMgYXJlIHRpbWluZyBwYXJhbWV0ZXJzIGZyb20gdGhlIEFUQSBzcGVjICovCisJaW50IHQxOworCWludCB0MjsKKwlpbnQgdDJpOworCisJVCA9IChpbnQpKDIwMDAwMDAwMDAwMDBMTCAvIG9jdGVvbl9nZXRfY2xvY2tfcmF0ZSgpKTsKKworCWlmIChhdGFfdGltaW5nX2NvbXB1dGUoZGV2LCBkZXYtPnBpb19tb2RlLCAmdGltaW5nLCBULCBUKSkKKwkJQlVHKCk7CisKKwl0MSA9IHRpbWluZy5zZXR1cDsKKwlpZiAodDEpCisJCXQxLS07CisJdDIgPSB0aW1pbmcuYWN0aXZlOworCWlmICh0MikKKwkJdDItLTsKKwl0MmkgPSB0aW1pbmcuYWN0OGI7CisJaWYgKHQyaSkKKwkJdDJpLS07CisKKwl0cmggPSBuc190b190aW1fcmVnKDIsIDIwKTsKKwlpZiAodHJoKQorCQl0cmgtLTsKKworCXBhdXNlID0gdGltaW5nLmN5Y2xlIC0gdGltaW5nLmFjdGl2ZSAtIHRpbWluZy5zZXR1cCAtIHRyaDsKKwlpZiAocGF1c2UpCisJCXBhdXNlLS07CisKKwlvY3Rlb25fY2Zfc2V0X2Jvb3RfcmVnX2NmZyhjcyk7CisJaWYgKG9jZC0+ZG1hX2VuZ2luZSA+PSAwKQorCQkvKiBUcnVlIElERSBtb2RlLCBwcm9ncmFtIGJvdGggY2hpcCBzZWxlY3RzLiAgKi8KKwkJb2N0ZW9uX2NmX3NldF9ib290X3JlZ19jZmcoY3MgKyAxKTsKKworCisJdXNlX2lvcmR5ID0gYXRhX3Bpb19uZWVkX2lvcmR5KGRldik7CisKKwlyZWdfdGltLnU2NCA9IGN2bXhfcmVhZF9jc3IoQ1ZNWF9NSU9fQk9PVF9SRUdfVElNWChjcykpOworCS8qIERpc2FibGUgcGFnZSBtb2RlICovCisJcmVnX3RpbS5zLnBhZ2VtID0gMDsKKwkvKiBFbmFibGUgZHluYW1pYyB0aW1pbmcgKi8KKwlyZWdfdGltLnMud2FpdG0gPSB1c2VfaW9yZHk7CisJLyogUGFnZXMgYXJlIGRpc2FibGVkICovCisJcmVnX3RpbS5zLnBhZ2VzID0gMDsKKwkvKiBXZSBkb24ndCB1c2UgbXVsdGlwbGV4ZWQgYWRkcmVzcyBtb2RlICovCisJcmVnX3RpbS5zLmFsZSA9IDA7CisJLyogTm90IHVzZWQgKi8KKwlyZWdfdGltLnMucGFnZSA9IDA7CisJLyogVGltZSBhZnRlciBJT1JEWSB0byBjb25pbnVlIHRvIGFzc2VydCB0aGUgZGF0YSAqLworCXJlZ190aW0ucy53YWl0ID0gMDsKKwkvKiBUaW1lIHRvIHdhaXQgdG8gY29tcGxldGUgdGhlIGN5Y2xlLiAqLworCXJlZ190aW0ucy5wYXVzZSA9IHBhdXNlOworCS8qIEhvdyBsb25nIHRvIGhvbGQgYWZ0ZXIgYSB3cml0ZSB0byBkZS1hc3NlcnQgQ0UuICovCisJcmVnX3RpbS5zLndyX2hsZCA9IHRyaDsKKwkvKiBIb3cgbG9uZyB0byB3YWl0IGFmdGVyIGEgcmVhZCB0byBkZS1hc3NlcnQgQ0UuICovCisJcmVnX3RpbS5zLnJkX2hsZCA9IHRyaDsKKwkvKiBIb3cgbG9uZyB3cml0ZSBlbmFibGUgaXMgYXNzZXJ0ZWQgKi8KKwlyZWdfdGltLnMud2UgPSB0MjsKKwkvKiBIb3cgbG9uZyByZWFkIGVuYWJsZSBpcyBhc3NlcnRlZCAqLworCXJlZ190aW0ucy5vZSA9IHQyOworCS8qIFRpbWUgYWZ0ZXIgQ0UgdGhhdCByZWFkL3dyaXRlIHN0YXJ0cyAqLworCXJlZ190aW0ucy5jZSA9IG5zX3RvX3RpbV9yZWcoMiwgNSk7CisJLyogVGltZSBiZWZvcmUgQ0UgdGhhdCBhZGRyZXNzIGlzIHZhbGlkICovCisJcmVnX3RpbS5zLmFkciA9IDA7CisKKwkvKiBQcm9ncmFtIHRoZSBib290YnVzIHJlZ2lvbiB0aW1pbmcgZm9yIHRoZSBkYXRhIHBvcnQgY2hpcCBzZWxlY3QuICovCisJY3ZteF93cml0ZV9jc3IoQ1ZNWF9NSU9fQk9PVF9SRUdfVElNWChjcyksIHJlZ190aW0udTY0KTsKKwlpZiAob2NkLT5kbWFfZW5naW5lID49IDApCisJCS8qIFRydWUgSURFIG1vZGUsIHByb2dyYW0gYm90aCBjaGlwIHNlbGVjdHMuICAqLworCQljdm14X3dyaXRlX2NzcihDVk1YX01JT19CT09UX1JFR19USU1YKGNzICsgMSksIHJlZ190aW0udTY0KTsKK30KKworc3RhdGljIHZvaWQgb2N0ZW9uX2NmX3NldF9kbWFtb2RlKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHN0cnVjdCBhdGFfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG9jdGVvbl9jZl9kYXRhICpvY2QgPSBkZXYtPmxpbmstPmFwLT5kZXYtPnBsYXRmb3JtX2RhdGE7CisJdW5pb24gY3ZteF9taW9fYm9vdF9kbWFfdGlteCBkbWFfdGltOworCXVuc2lnbmVkIGludCBvZV9hOworCXVuc2lnbmVkIGludCBvZV9uOworCXVuc2lnbmVkIGludCBkbWFfYWNraDsKKwl1bnNpZ25lZCBpbnQgZG1hX2FycTsKKwl1bnNpZ25lZCBpbnQgcGF1c2U7CisJdW5zaWduZWQgaW50IFQwLCBUa3IsIFRkOworCXVuc2lnbmVkIGludCB0aW1fbXVsdDsKKworCWNvbnN0IHN0cnVjdCBhdGFfdGltaW5nICp0aW1pbmc7CisKKwl0aW1pbmcgPSBhdGFfdGltaW5nX2ZpbmRfbW9kZShkZXYtPmRtYV9tb2RlKTsKKwlUMAk9IHRpbWluZy0+Y3ljbGU7CisJVGQJPSB0aW1pbmctPmFjdGl2ZTsKKwlUa3IJPSB0aW1pbmctPnJlY292ZXI7CisJZG1hX2Fja2ggPSB0aW1pbmctPmRtYWNrX2hvbGQ7CisKKwlkbWFfdGltLnU2NCA9IDA7CisJLyogZG1hX3RpbS5zLnRpbV9tdWx0ID0gMCAtLT4gNHggKi8KKwl0aW1fbXVsdCA9IDQ7CisKKwkvKiBub3Qgc3BlYydlZCwgdmFsdWUgaW4gZWNsb2Nrcywgbm90IGFmZmVjdGVkIGJ5IHRpbV9tdWx0ICovCisJZG1hX2FycSA9IDg7CisJcGF1c2UgPSAyNSAtIGRtYV9hcnEgKiAxMDAwIC8KKwkJKG9jdGVvbl9nZXRfY2xvY2tfcmF0ZSgpIC8gMTAwMDAwMCk7IC8qIFR6ICovCisKKwlvZV9hID0gVGQ7CisJLyogVGtyIGZyb20gY2Ygc3BlYywgbGVuZ3RoZW5lZCB0byBtZWV0IFQwICovCisJb2VfbiA9IG1heChUMCAtIG9lX2EsIFRrcik7CisKKwlkbWFfdGltLnMuZG1hY2tfcGkgPSAxOworCisJZG1hX3RpbS5zLm9lX24gPSBuc190b190aW1fcmVnKHRpbV9tdWx0LCBvZV9uKTsKKwlkbWFfdGltLnMub2VfYSA9IG5zX3RvX3RpbV9yZWcodGltX211bHQsIG9lX2EpOworCisJLyoKKwkgKiBUaGlzIGlzIHRJLCBDLkYuIHNwZWMuIHNheXMgMCwgYnV0IFNvbnkgQ0YgY2FyZCByZXF1aXJlcworCSAqIG1vcmUsIHdlIHVzZSAyMCBuUy4KKwkgKi8KKwlkbWFfdGltLnMuZG1hY2tfcyA9IG5zX3RvX3RpbV9yZWcodGltX211bHQsIDIwKTs7CisJZG1hX3RpbS5zLmRtYWNrX2ggPSBuc190b190aW1fcmVnKHRpbV9tdWx0LCBkbWFfYWNraCk7CisKKwlkbWFfdGltLnMuZG1hcnEgPSBkbWFfYXJxOworCWRtYV90aW0ucy5wYXVzZSA9IG5zX3RvX3RpbV9yZWcodGltX211bHQsIHBhdXNlKTsKKworCWRtYV90aW0ucy5yZF9kbHkgPSAwOwkvKiBTYW1wbGUgcmlnaHQgb24gZWRnZSAqLworCisJLyogIHdyaXRlcyBvbmx5ICovCisJZG1hX3RpbS5zLndlX24gPSBuc190b190aW1fcmVnKHRpbV9tdWx0LCBvZV9uKTsKKwlkbWFfdGltLnMud2VfYSA9IG5zX3RvX3RpbV9yZWcodGltX211bHQsIG9lX2EpOworCisJcHJfZGVidWcoIm5zIHRvIHRpY2tzIChtdWx0ICVkKSBvZiAlZCBpczogJWRcbiIsIHRpbV9tdWx0LCA2MCwKKwkJIG5zX3RvX3RpbV9yZWcodGltX211bHQsIDYwKSk7CisJcHJfZGVidWcoIm9lX246ICVkLCBvZV9hOiAlZCwgZG1hY2tfczogJWQsIGRtYWNrX2g6ICIKKwkJICIlZCwgZG1hcnE6ICVkLCBwYXVzZTogJWRcbiIsCisJCSBkbWFfdGltLnMub2VfbiwgZG1hX3RpbS5zLm9lX2EsIGRtYV90aW0ucy5kbWFja19zLAorCQkgZG1hX3RpbS5zLmRtYWNrX2gsIGRtYV90aW0ucy5kbWFycSwgZG1hX3RpbS5zLnBhdXNlKTsKKworCWN2bXhfd3JpdGVfY3NyKENWTVhfTUlPX0JPT1RfRE1BX1RJTVgob2NkLT5kbWFfZW5naW5lKSwKKwkJICAgICAgIGRtYV90aW0udTY0KTsKKworfQorCisvKioKKyAqIEhhbmRsZSBhbiA4IGJpdCBJL08gcmVxdWVzdC4KKyAqCisgKiBAZGV2OiAgICAgICAgRGV2aWNlIHRvIGFjY2VzcworICogQGJ1ZmZlcjogICAgIERhdGEgYnVmZmVyCisgKiBAYnVmbGVuOiAgICAgTGVuZ3RoIG9mIHRoZSBidWZmZXIuCisgKiBAcnc6ICAgICAgICAgVHJ1ZSB0byB3cml0ZS4KKyAqLworc3RhdGljIHVuc2lnbmVkIGludCBvY3Rlb25fY2ZfZGF0YV94ZmVyOChzdHJ1Y3QgYXRhX2RldmljZSAqZGV2LAorCQkJCQkgdW5zaWduZWQgY2hhciAqYnVmZmVyLAorCQkJCQkgdW5zaWduZWQgaW50IGJ1ZmxlbiwKKwkJCQkJIGludCBydykKK3sKKwlzdHJ1Y3QgYXRhX3BvcnQgKmFwCQk9IGRldi0+bGluay0+YXA7CisJdm9pZCBfX2lvbWVtICpkYXRhX2FkZHIJCT0gYXAtPmlvYWRkci5kYXRhX2FkZHI7CisJdW5zaWduZWQgbG9uZyB3b3JkczsKKwlpbnQgY291bnQ7CisKKwl3b3JkcyA9IGJ1ZmxlbjsKKwlpZiAocncpIHsKKwkJY291bnQgPSAxNjsKKwkJd2hpbGUgKHdvcmRzLS0pIHsKKwkJCWlvd3JpdGU4KCpidWZmZXIsIGRhdGFfYWRkcik7CisJCQlidWZmZXIrKzsKKwkJCS8qCisJCQkgKiBFdmVyeSAxNiB3cml0ZXMgZG8gYSByZWFkIHNvIHRoZSBib290YnVzCisJCQkgKiBGSUZPIGRvZXNuJ3QgZmlsbCB1cC4KKwkJCSAqLworCQkJaWYgKC0tY291bnQgPT0gMCkgeworCQkJCWlvcmVhZDgoYXAtPmlvYWRkci5hbHRzdGF0dXNfYWRkcik7CisJCQkJY291bnQgPSAxNjsKKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCWlvcmVhZDhfcmVwKGRhdGFfYWRkciwgYnVmZmVyLCB3b3Jkcyk7CisJfQorCXJldHVybiBidWZsZW47Cit9CisKKy8qKgorICogSGFuZGxlIGEgMTYgYml0IEkvTyByZXF1ZXN0LgorICoKKyAqIEBkZXY6ICAgICAgICBEZXZpY2UgdG8gYWNjZXNzCisgKiBAYnVmZmVyOiAgICAgRGF0YSBidWZmZXIKKyAqIEBidWZsZW46ICAgICBMZW5ndGggb2YgdGhlIGJ1ZmZlci4KKyAqIEBydzogICAgICAgICBUcnVlIHRvIHdyaXRlLgorICovCitzdGF0aWMgdW5zaWduZWQgaW50IG9jdGVvbl9jZl9kYXRhX3hmZXIxNihzdHJ1Y3QgYXRhX2RldmljZSAqZGV2LAorCQkJCQkgIHVuc2lnbmVkIGNoYXIgKmJ1ZmZlciwKKwkJCQkJICB1bnNpZ25lZCBpbnQgYnVmbGVuLAorCQkJCQkgIGludCBydykKK3sKKwlzdHJ1Y3QgYXRhX3BvcnQgKmFwCQk9IGRldi0+bGluay0+YXA7CisJdm9pZCBfX2lvbWVtICpkYXRhX2FkZHIJCT0gYXAtPmlvYWRkci5kYXRhX2FkZHI7CisJdW5zaWduZWQgbG9uZyB3b3JkczsKKwlpbnQgY291bnQ7CisKKwl3b3JkcyA9IGJ1ZmxlbiAvIDI7CisJaWYgKHJ3KSB7CisJCWNvdW50ID0gMTY7CisJCXdoaWxlICh3b3Jkcy0tKSB7CisJCQlpb3dyaXRlMTYoKih1aW50MTZfdCAqKWJ1ZmZlciwgZGF0YV9hZGRyKTsKKwkJCWJ1ZmZlciArPSBzaXplb2YodWludDE2X3QpOworCQkJLyoKKwkJCSAqIEV2ZXJ5IDE2IHdyaXRlcyBkbyBhIHJlYWQgc28gdGhlIGJvb3RidXMKKwkJCSAqIEZJRk8gZG9lc24ndCBmaWxsIHVwLgorCQkJICovCisJCQlpZiAoLS1jb3VudCA9PSAwKSB7CisJCQkJaW9yZWFkOChhcC0+aW9hZGRyLmFsdHN0YXR1c19hZGRyKTsKKwkJCQljb3VudCA9IDE2OworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJd2hpbGUgKHdvcmRzLS0pIHsKKwkJCSoodWludDE2X3QgKilidWZmZXIgPSBpb3JlYWQxNihkYXRhX2FkZHIpOworCQkJYnVmZmVyICs9IHNpemVvZih1aW50MTZfdCk7CisJCX0KKwl9CisJLyogVHJhbnNmZXIgdHJhaWxpbmcgMSBieXRlLCBpZiBhbnkuICovCisJaWYgKHVubGlrZWx5KGJ1ZmxlbiAmIDB4MDEpKSB7CisJCV9fbGUxNiBhbGlnbl9idWZbMV0gPSB7IDAgfTsKKworCQlpZiAocncgPT0gUkVBRCkgeworCQkJYWxpZ25fYnVmWzBdID0gY3B1X3RvX2xlMTYoaW9yZWFkMTYoZGF0YV9hZGRyKSk7CisJCQltZW1jcHkoYnVmZmVyLCBhbGlnbl9idWYsIDEpOworCQl9IGVsc2UgeworCQkJbWVtY3B5KGFsaWduX2J1ZiwgYnVmZmVyLCAxKTsKKwkJCWlvd3JpdGUxNihsZTE2X3RvX2NwdShhbGlnbl9idWZbMF0pLCBkYXRhX2FkZHIpOworCQl9CisJCXdvcmRzKys7CisJfQorCXJldHVybiBidWZsZW47Cit9CisKKy8qKgorICogUmVhZCB0aGUgdGFza2ZpbGUgZm9yIDE2Yml0IG5vbi1UcnVlIElERSBvbmx5LgorICovCitzdGF0aWMgdm9pZCBvY3Rlb25fY2ZfdGZfcmVhZDE2KHN0cnVjdCBhdGFfcG9ydCAqYXAsIHN0cnVjdCBhdGFfdGFza2ZpbGUgKnRmKQoreworCXUxNiBibG9iOworCS8qIFRoZSBiYXNlIG9mIHRoZSByZWdpc3RlcnMgaXMgYXQgaW9hZGRyLmRhdGFfYWRkci4gKi8KKwl2b2lkIF9faW9tZW0gKmJhc2UgPSBhcC0+aW9hZGRyLmRhdGFfYWRkcjsKKworCWJsb2IgPSBfX3Jhd19yZWFkdyhiYXNlICsgMHhjKTsKKwl0Zi0+ZmVhdHVyZSA9IGJsb2IgPj4gODsKKworCWJsb2IgPSBfX3Jhd19yZWFkdyhiYXNlICsgMik7CisJdGYtPm5zZWN0ID0gYmxvYiAmIDB4ZmY7CisJdGYtPmxiYWwgPSBibG9iID4+IDg7CisKKwlibG9iID0gX19yYXdfcmVhZHcoYmFzZSArIDQpOworCXRmLT5sYmFtID0gYmxvYiAmIDB4ZmY7CisJdGYtPmxiYWggPSBibG9iID4+IDg7CisKKwlibG9iID0gX19yYXdfcmVhZHcoYmFzZSArIDYpOworCXRmLT5kZXZpY2UgPSBibG9iICYgMHhmZjsKKwl0Zi0+Y29tbWFuZCA9IGJsb2IgPj4gODsKKworCWlmICh0Zi0+ZmxhZ3MgJiBBVEFfVEZMQUdfTEJBNDgpIHsKKwkJaWYgKGxpa2VseShhcC0+aW9hZGRyLmN0bF9hZGRyKSkgeworCQkJaW93cml0ZTgodGYtPmN0bCB8IEFUQV9IT0IsIGFwLT5pb2FkZHIuY3RsX2FkZHIpOworCisJCQlibG9iID0gX19yYXdfcmVhZHcoYmFzZSArIDB4Yyk7CisJCQl0Zi0+aG9iX2ZlYXR1cmUgPSBibG9iID4+IDg7CisKKwkJCWJsb2IgPSBfX3Jhd19yZWFkdyhiYXNlICsgMik7CisJCQl0Zi0+aG9iX25zZWN0ID0gYmxvYiAmIDB4ZmY7CisJCQl0Zi0+aG9iX2xiYWwgPSBibG9iID4+IDg7CisKKwkJCWJsb2IgPSBfX3Jhd19yZWFkdyhiYXNlICsgNCk7CisJCQl0Zi0+aG9iX2xiYW0gPSBibG9iICYgMHhmZjsKKwkJCXRmLT5ob2JfbGJhaCA9IGJsb2IgPj4gODsKKworCQkJaW93cml0ZTgodGYtPmN0bCwgYXAtPmlvYWRkci5jdGxfYWRkcik7CisJCQlhcC0+bGFzdF9jdGwgPSB0Zi0+Y3RsOworCQl9IGVsc2UgeworCQkJV0FSTl9PTigxKTsKKwkJfQorCX0KK30KKworc3RhdGljIHU4IG9jdGVvbl9jZl9jaGVja19zdGF0dXMxNihzdHJ1Y3QgYXRhX3BvcnQgKmFwKQoreworCXUxNiBibG9iOworCXZvaWQgX19pb21lbSAqYmFzZSA9IGFwLT5pb2FkZHIuZGF0YV9hZGRyOworCisJYmxvYiA9IF9fcmF3X3JlYWR3KGJhc2UgKyA2KTsKKwlyZXR1cm4gYmxvYiA+PiA4OworfQorCitzdGF0aWMgaW50IG9jdGVvbl9jZl9zb2Z0cmVzZXQxNihzdHJ1Y3QgYXRhX2xpbmsgKmxpbmssIHVuc2lnbmVkIGludCAqY2xhc3NlcywKKwkJCQkgdW5zaWduZWQgbG9uZyBkZWFkbGluZSkKK3sKKwlzdHJ1Y3QgYXRhX3BvcnQgKmFwID0gbGluay0+YXA7CisJdm9pZCBfX2lvbWVtICpiYXNlID0gYXAtPmlvYWRkci5kYXRhX2FkZHI7CisJaW50IHJjOworCXU4IGVycjsKKworCURQUklOVEsoImFib3V0IHRvIHNvZnRyZXNldFxuIik7CisJX19yYXdfd3JpdGV3KGFwLT5jdGwsIGJhc2UgKyAweGUpOworCXVkZWxheSgyMCk7CisJX19yYXdfd3JpdGV3KGFwLT5jdGwgfCBBVEFfU1JTVCwgYmFzZSArIDB4ZSk7CisJdWRlbGF5KDIwKTsKKwlfX3Jhd193cml0ZXcoYXAtPmN0bCwgYmFzZSArIDB4ZSk7CisKKwlyYyA9IGF0YV9zZmZfd2FpdF9hZnRlcl9yZXNldChsaW5rLCAxLCBkZWFkbGluZSk7CisJaWYgKHJjKSB7CisJCWF0YV9saW5rX3ByaW50ayhsaW5rLCBLRVJOX0VSUiwgIlNSU1QgZmFpbGVkIChlcnJubz0lZClcbiIsIHJjKTsKKwkJcmV0dXJuIHJjOworCX0KKworCS8qIGRldGVybWluZSBieSBzaWduYXR1cmUgd2hldGhlciB3ZSBoYXZlIEFUQSBvciBBVEFQSSBkZXZpY2VzICovCisJY2xhc3Nlc1swXSA9IGF0YV9zZmZfZGV2X2NsYXNzaWZ5KCZsaW5rLT5kZXZpY2VbMF0sIDEsICZlcnIpOworCURQUklOVEsoIkVYSVQsIGNsYXNzZXNbMF09JXUgWzFdPSV1XG4iLCBjbGFzc2VzWzBdLCBjbGFzc2VzWzFdKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBMb2FkIHRoZSB0YXNrZmlsZSBmb3IgMTZiaXQgbm9uLVRydWUgSURFIG9ubHkuICBUaGUgZGV2aWNlX2FkZHIgaXMKKyAqIG5vdCBsb2FkZWQsIHdlIGRvIHRoaXMgYXMgcGFydCBvZiBvY3Rlb25fY2ZfZXhlY19jb21tYW5kMTYuCisgKi8KK3N0YXRpYyB2b2lkIG9jdGVvbl9jZl90Zl9sb2FkMTYoc3RydWN0IGF0YV9wb3J0ICphcCwKKwkJCQljb25zdCBzdHJ1Y3QgYXRhX3Rhc2tmaWxlICp0ZikKK3sKKwl1bnNpZ25lZCBpbnQgaXNfYWRkciA9IHRmLT5mbGFncyAmIEFUQV9URkxBR19JU0FERFI7CisJLyogVGhlIGJhc2Ugb2YgdGhlIHJlZ2lzdGVycyBpcyBhdCBpb2FkZHIuZGF0YV9hZGRyLiAqLworCXZvaWQgX19pb21lbSAqYmFzZSA9IGFwLT5pb2FkZHIuZGF0YV9hZGRyOworCisJaWYgKHRmLT5jdGwgIT0gYXAtPmxhc3RfY3RsKSB7CisJCWlvd3JpdGU4KHRmLT5jdGwsIGFwLT5pb2FkZHIuY3RsX2FkZHIpOworCQlhcC0+bGFzdF9jdGwgPSB0Zi0+Y3RsOworCQlhdGFfd2FpdF9pZGxlKGFwKTsKKwl9CisJaWYgKGlzX2FkZHIgJiYgKHRmLT5mbGFncyAmIEFUQV9URkxBR19MQkE0OCkpIHsKKwkJX19yYXdfd3JpdGV3KHRmLT5ob2JfZmVhdHVyZSA8PCA4LCBiYXNlICsgMHhjKTsKKwkJX19yYXdfd3JpdGV3KHRmLT5ob2JfbnNlY3QgfCB0Zi0+aG9iX2xiYWwgPDwgOCwgYmFzZSArIDIpOworCQlfX3Jhd193cml0ZXcodGYtPmhvYl9sYmFtIHwgdGYtPmhvYl9sYmFoIDw8IDgsIGJhc2UgKyA0KTsKKwkJVlBSSU5USygiaG9iOiBmZWF0IDB4JVggbnNlY3QgMHglWCwgbGJhIDB4JVggMHglWCAweCVYXG4iLAorCQkJdGYtPmhvYl9mZWF0dXJlLAorCQkJdGYtPmhvYl9uc2VjdCwKKwkJCXRmLT5ob2JfbGJhbCwKKwkJCXRmLT5ob2JfbGJhbSwKKwkJCXRmLT5ob2JfbGJhaCk7CisJfQorCWlmIChpc19hZGRyKSB7CisJCV9fcmF3X3dyaXRldyh0Zi0+ZmVhdHVyZSA8PCA4LCBiYXNlICsgMHhjKTsKKwkJX19yYXdfd3JpdGV3KHRmLT5uc2VjdCB8IHRmLT5sYmFsIDw8IDgsIGJhc2UgKyAyKTsKKwkJX19yYXdfd3JpdGV3KHRmLT5sYmFtIHwgdGYtPmxiYWggPDwgOCwgYmFzZSArIDQpOworCQlWUFJJTlRLKCJmZWF0IDB4JVggbnNlY3QgMHglWCwgbGJhIDB4JVggMHglWCAweCVYXG4iLAorCQkJdGYtPmZlYXR1cmUsCisJCQl0Zi0+bnNlY3QsCisJCQl0Zi0+bGJhbCwKKwkJCXRmLT5sYmFtLAorCQkJdGYtPmxiYWgpOworCX0KKwlhdGFfd2FpdF9pZGxlKGFwKTsKK30KKworCitzdGF0aWMgdm9pZCBvY3Rlb25fY2ZfZGV2X3NlbGVjdChzdHJ1Y3QgYXRhX3BvcnQgKmFwLCB1bnNpZ25lZCBpbnQgZGV2aWNlKQoreworLyogIFRoZXJlIGlzIG9ubHkgb25lIGRldmljZSwgZG8gbm90aGluZy4gKi8KKwlyZXR1cm47Cit9CisKKy8qCisgKiBJc3N1ZSBBVEEgY29tbWFuZCB0byBob3N0IGNvbnRyb2xsZXIuICBUaGUgZGV2aWNlX2FkZHIgaXMgYWxzbyBzZW50CisgKiBhcyBpdCBtdXN0IGJlIHdyaXR0ZW4gaW4gYSBjb21iaW5lZCB3cml0ZSB3aXRoIHRoZSBjb21tYW5kLgorICovCitzdGF0aWMgdm9pZCBvY3Rlb25fY2ZfZXhlY19jb21tYW5kMTYoc3RydWN0IGF0YV9wb3J0ICphcCwKKwkJCQljb25zdCBzdHJ1Y3QgYXRhX3Rhc2tmaWxlICp0ZikKK3sKKwkvKiBUaGUgYmFzZSBvZiB0aGUgcmVnaXN0ZXJzIGlzIGF0IGlvYWRkci5kYXRhX2FkZHIuICovCisJdm9pZCBfX2lvbWVtICpiYXNlID0gYXAtPmlvYWRkci5kYXRhX2FkZHI7CisJdTE2IGJsb2I7CisKKwlpZiAodGYtPmZsYWdzICYgQVRBX1RGTEFHX0RFVklDRSkgeworCQlWUFJJTlRLKCJkZXZpY2UgMHglWFxuIiwgdGYtPmRldmljZSk7CisJCWJsb2IgPSB0Zi0+ZGV2aWNlOworCX0gZWxzZSB7CisJCWJsb2IgPSAwOworCX0KKworCURQUklOVEsoImF0YSV1OiBjbWQgMHglWFxuIiwgYXAtPnByaW50X2lkLCB0Zi0+Y29tbWFuZCk7CisJYmxvYiB8PSAodGYtPmNvbW1hbmQgPDwgOCk7CisJX19yYXdfd3JpdGV3KGJsb2IsIGJhc2UgKyA2KTsKKworCisJYXRhX3dhaXRfaWRsZShhcCk7Cit9CisKK3N0YXRpYyB1OCBvY3Rlb25fY2ZfaXJxX29uKHN0cnVjdCBhdGFfcG9ydCAqYXApCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIG9jdGVvbl9jZl9pcnFfY2xlYXIoc3RydWN0IGF0YV9wb3J0ICphcCkKK3sKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIG9jdGVvbl9jZl9kbWFfc2V0dXAoc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYykKK3sKKwlzdHJ1Y3QgYXRhX3BvcnQgKmFwID0gcWMtPmFwOworCXN0cnVjdCBvY3Rlb25fY2ZfcG9ydCAqY2ZfcG9ydDsKKworCWNmX3BvcnQgPSAoc3RydWN0IG9jdGVvbl9jZl9wb3J0ICopYXAtPnByaXZhdGVfZGF0YTsKKwlEUFJJTlRLKCJFTlRFUlxuIik7CisJLyogaXNzdWUgci93IGNvbW1hbmQgKi8KKwlxYy0+Y3Vyc2cgPSBxYy0+c2c7CisJY2ZfcG9ydC0+ZG1hX2ZpbmlzaGVkID0gMDsKKwlhcC0+b3BzLT5zZmZfZXhlY19jb21tYW5kKGFwLCAmcWMtPnRmKTsKKwlEUFJJTlRLKCJFWElUXG4iKTsKK30KKworLyoqCisgKiBTdGFydCBhIERNQSB0cmFuc2ZlciB0aGF0IHdhcyBhbHJlYWR5IHNldHVwCisgKgorICogQHFjOiAgICAgSW5mb3JtYXRpb24gYWJvdXQgdGhlIERNQQorICovCitzdGF0aWMgdm9pZCBvY3Rlb25fY2ZfZG1hX3N0YXJ0KHN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMpCit7CisJc3RydWN0IG9jdGVvbl9jZl9kYXRhICpvY2QgPSBxYy0+YXAtPmRldi0+cGxhdGZvcm1fZGF0YTsKKwl1bmlvbiBjdm14X21pb19ib290X2RtYV9jZmd4IG1pb19ib290X2RtYV9jZmc7CisJdW5pb24gY3ZteF9taW9fYm9vdF9kbWFfaW50eCBtaW9fYm9vdF9kbWFfaW50OworCXN0cnVjdCBzY2F0dGVybGlzdCAqc2c7CisKKwlWUFJJTlRLKCIlZCBzY2F0dGVybGlzdHNcbiIsIHFjLT5uX2VsZW0pOworCisJLyogR2V0IHRoZSBzY2F0dGVyIGxpc3QgZW50cnkgd2UgbmVlZCB0byBETUEgaW50byAqLworCXNnID0gcWMtPmN1cnNnOworCUJVR19PTighc2cpOworCisJLyoKKwkgKiBDbGVhciB0aGUgRE1BIGNvbXBsZXRlIHN0YXR1cy4KKwkgKi8KKwltaW9fYm9vdF9kbWFfaW50LnU2NCA9IDA7CisJbWlvX2Jvb3RfZG1hX2ludC5zLmRvbmUgPSAxOworCWN2bXhfd3JpdGVfY3NyKENWTVhfTUlPX0JPT1RfRE1BX0lOVFgob2NkLT5kbWFfZW5naW5lKSwKKwkJICAgICAgIG1pb19ib290X2RtYV9pbnQudTY0KTsKKworCS8qIEVuYWJsZSB0aGUgaW50ZXJydXB0LiAgKi8KKwljdm14X3dyaXRlX2NzcihDVk1YX01JT19CT09UX0RNQV9JTlRfRU5YKG9jZC0+ZG1hX2VuZ2luZSksCisJCSAgICAgICBtaW9fYm9vdF9kbWFfaW50LnU2NCk7CisKKwkvKiBTZXQgdGhlIGRpcmVjdGlvbiBvZiB0aGUgRE1BICovCisJbWlvX2Jvb3RfZG1hX2NmZy51NjQgPSAwOworCW1pb19ib290X2RtYV9jZmcucy5lbiA9IDE7CisJbWlvX2Jvb3RfZG1hX2NmZy5zLnJ3ID0gKChxYy0+dGYuZmxhZ3MgJiBBVEFfVEZMQUdfV1JJVEUpICE9IDApOworCisJLyoKKwkgKiBEb24ndCBzdG9wIHRoZSBETUEgaWYgdGhlIGRldmljZSBkZWFzc2VydHMgRE1BUlEuIE1hbnkKKwkgKiBjb21wYWN0IGZsYXNoZXMgZGVhc3NlcnQgRE1BUlEgZm9yIGEgc2hvcnQgdGltZSBiZXR3ZWVuCisJICogc2VjdG9ycy4gSW5zdGVhZCBvZiBzdG9wcGluZyBhbmQgcmVzdGFydGluZyB0aGUgRE1BLCB3ZSdsbAorCSAqIGxldCB0aGUgaGFyZHdhcmUgZG8gaXQuIElmIHRoZSBETUEgaXMgcmVhbGx5IHN0b3BwZWQgZWFybHkKKwkgKiBkdWUgdG8gYW4gZXJyb3IgY29uZGl0aW9uLCBhIGxhdGVyIHRpbWVvdXQgd2lsbCBmb3JjZSB1cyB0bworCSAqIHN0b3AuCisJICovCisJbWlvX2Jvb3RfZG1hX2NmZy5zLmNsciA9IDA7CisKKwkvKiBTaXplIGlzIHNwZWNpZmllZCBpbiAxNmJpdCB3b3JkcyBhbmQgbWludXMgb25lIG5vdGF0aW9uICovCisJbWlvX2Jvb3RfZG1hX2NmZy5zLnNpemUgPSBzZ19kbWFfbGVuKHNnKSAvIDIgLSAxOworCisJLyogV2UgbmVlZCB0byBzd2FwIHRoZSBoaWdoIGFuZCBsb3cgYnl0ZXMgb2YgZXZlcnkgMTYgYml0cyAqLworCW1pb19ib290X2RtYV9jZmcucy5zd2FwOCA9IDE7CisKKwltaW9fYm9vdF9kbWFfY2ZnLnMuYWRyID0gc2dfZG1hX2FkZHJlc3Moc2cpOworCisJVlBSSU5USygiJXMgJWQgYnl0ZXMgYWRkcmVzcz0lcFxuIiwKKwkJKG1pb19ib290X2RtYV9jZmcucy5ydykgPyAid3JpdGUiIDogInJlYWQiLCBzZy0+bGVuZ3RoLAorCQkodm9pZCAqKSh1bnNpZ25lZCBsb25nKW1pb19ib290X2RtYV9jZmcucy5hZHIpOworCisJY3ZteF93cml0ZV9jc3IoQ1ZNWF9NSU9fQk9PVF9ETUFfQ0ZHWChvY2QtPmRtYV9lbmdpbmUpLAorCQkgICAgICAgbWlvX2Jvb3RfZG1hX2NmZy51NjQpOworfQorCisvKioKKyAqCisgKglMT0NLSU5HOgorICoJc3Bpbl9sb2NrX2lycXNhdmUoaG9zdCBsb2NrKQorICoKKyAqLworc3RhdGljIHVuc2lnbmVkIGludCBvY3Rlb25fY2ZfZG1hX2ZpbmlzaGVkKHN0cnVjdCBhdGFfcG9ydCAqYXAsCisJCQkJCXN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMpCit7CisJc3RydWN0IGF0YV9laF9pbmZvICplaGkgPSAmYXAtPmxpbmsuZWhfaW5mbzsKKwlzdHJ1Y3Qgb2N0ZW9uX2NmX2RhdGEgKm9jZCA9IGFwLT5kZXYtPnBsYXRmb3JtX2RhdGE7CisJdW5pb24gY3ZteF9taW9fYm9vdF9kbWFfY2ZneCBkbWFfY2ZnOworCXVuaW9uIGN2bXhfbWlvX2Jvb3RfZG1hX2ludHggZG1hX2ludDsKKwlzdHJ1Y3Qgb2N0ZW9uX2NmX3BvcnQgKmNmX3BvcnQ7CisJdTggc3RhdHVzOworCisJVlBSSU5USygiYXRhJXU6IHByb3RvY29sICVkIHRhc2tfc3RhdGUgJWRcbiIsCisJCWFwLT5wcmludF9pZCwgcWMtPnRmLnByb3RvY29sLCBhcC0+aHNtX3Rhc2tfc3RhdGUpOworCisKKwlpZiAoYXAtPmhzbV90YXNrX3N0YXRlICE9IEhTTV9TVF9MQVNUKQorCQlyZXR1cm4gMDsKKworCWNmX3BvcnQgPSAoc3RydWN0IG9jdGVvbl9jZl9wb3J0ICopYXAtPnByaXZhdGVfZGF0YTsKKworCWRtYV9jZmcudTY0ID0gY3ZteF9yZWFkX2NzcihDVk1YX01JT19CT09UX0RNQV9DRkdYKG9jZC0+ZG1hX2VuZ2luZSkpOworCWlmIChkbWFfY2ZnLnMuc2l6ZSAhPSAweGZmZmZmKSB7CisJCS8qIEVycm9yLCB0aGUgdHJhbnNmZXIgd2FzIG5vdCBjb21wbGV0ZS4gICovCisJCXFjLT5lcnJfbWFzayB8PSBBQ19FUlJfSE9TVF9CVVM7CisJCWFwLT5oc21fdGFza19zdGF0ZSA9IEhTTV9TVF9FUlI7CisJfQorCisJLyogU3RvcCBhbmQgY2xlYXIgdGhlIGRtYSBlbmdpbmUuICAqLworCWRtYV9jZmcudTY0ID0gMDsKKwlkbWFfY2ZnLnMuc2l6ZSA9IC0xOworCWN2bXhfd3JpdGVfY3NyKENWTVhfTUlPX0JPT1RfRE1BX0NGR1gob2NkLT5kbWFfZW5naW5lKSwgZG1hX2NmZy51NjQpOworCisJLyogRGlzYWJsZSB0aGUgaW50ZXJydXB0LiAgKi8KKwlkbWFfaW50LnU2NCA9IDA7CisJY3ZteF93cml0ZV9jc3IoQ1ZNWF9NSU9fQk9PVF9ETUFfSU5UX0VOWChvY2QtPmRtYV9lbmdpbmUpLCBkbWFfaW50LnU2NCk7CisKKwkvKiBDbGVhciB0aGUgRE1BIGNvbXBsZXRlIHN0YXR1cyAqLworCWRtYV9pbnQucy5kb25lID0gMTsKKwljdm14X3dyaXRlX2NzcihDVk1YX01JT19CT09UX0RNQV9JTlRYKG9jZC0+ZG1hX2VuZ2luZSksIGRtYV9pbnQudTY0KTsKKworCXN0YXR1cyA9IGFwLT5vcHMtPnNmZl9jaGVja19zdGF0dXMoYXApOworCisJYXRhX3NmZl9oc21fbW92ZShhcCwgcWMsIHN0YXR1cywgMCk7CisKKwlpZiAodW5saWtlbHkocWMtPmVycl9tYXNrKSAmJiAocWMtPnRmLnByb3RvY29sID09IEFUQV9QUk9UX0RNQSkpCisJCWF0YV9laGlfcHVzaF9kZXNjKGVoaSwgIkRNQSBzdGF0IDB4JXgiLCBzdGF0dXMpOworCisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBDaGVjayBpZiBhbnkgcXVldWVkIGNvbW1hbmRzIGhhdmUgbW9yZSBETUFzLCBpZiBzbyBzdGFydCB0aGUgbmV4dAorICogdHJhbnNmZXIsIGVsc2UgZG8gZW5kIG9mIHRyYW5zZmVyIGhhbmRsaW5nLgorICovCitzdGF0aWMgaXJxcmV0dXJuX3Qgb2N0ZW9uX2NmX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaW5zdGFuY2UpCit7CisJc3RydWN0IGF0YV9ob3N0ICpob3N0ID0gZGV2X2luc3RhbmNlOworCXN0cnVjdCBvY3Rlb25fY2ZfcG9ydCAqY2ZfcG9ydDsKKwlpbnQgaTsKKwl1bnNpZ25lZCBpbnQgaGFuZGxlZCA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZob3N0LT5sb2NrLCBmbGFncyk7CisKKwlEUFJJTlRLKCJFTlRFUlxuIik7CisJZm9yIChpID0gMDsgaSA8IGhvc3QtPm5fcG9ydHM7IGkrKykgeworCQl1OCBzdGF0dXM7CisJCXN0cnVjdCBhdGFfcG9ydCAqYXA7CisJCXN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWM7CisJCXVuaW9uIGN2bXhfbWlvX2Jvb3RfZG1hX2ludHggZG1hX2ludDsKKwkJdW5pb24gY3ZteF9taW9fYm9vdF9kbWFfY2ZneCBkbWFfY2ZnOworCQlzdHJ1Y3Qgb2N0ZW9uX2NmX2RhdGEgKm9jZDsKKworCQlhcCA9IGhvc3QtPnBvcnRzW2ldOworCQlvY2QgPSBhcC0+ZGV2LT5wbGF0Zm9ybV9kYXRhOworCQlpZiAoIWFwIHx8IChhcC0+ZmxhZ3MgJiBBVEFfRkxBR19ESVNBQkxFRCkpCisJCQljb250aW51ZTsKKworCQlvY2QgPSBhcC0+ZGV2LT5wbGF0Zm9ybV9kYXRhOworCQljZl9wb3J0ID0gKHN0cnVjdCBvY3Rlb25fY2ZfcG9ydCAqKWFwLT5wcml2YXRlX2RhdGE7CisJCWRtYV9pbnQudTY0ID0KKwkJCWN2bXhfcmVhZF9jc3IoQ1ZNWF9NSU9fQk9PVF9ETUFfSU5UWChvY2QtPmRtYV9lbmdpbmUpKTsKKwkJZG1hX2NmZy51NjQgPQorCQkJY3ZteF9yZWFkX2NzcihDVk1YX01JT19CT09UX0RNQV9DRkdYKG9jZC0+ZG1hX2VuZ2luZSkpOworCisJCXFjID0gYXRhX3FjX2Zyb21fdGFnKGFwLCBhcC0+bGluay5hY3RpdmVfdGFnKTsKKworCQlpZiAocWMgJiYgKCEocWMtPnRmLmZsYWdzICYgQVRBX1RGTEFHX1BPTExJTkcpKSAmJgorCQkgICAgKHFjLT5mbGFncyAmIEFUQV9RQ0ZMQUdfQUNUSVZFKSkgeworCQkJaWYgKGRtYV9pbnQucy5kb25lICYmICFkbWFfY2ZnLnMuZW4pIHsKKwkJCQlpZiAoIXNnX2lzX2xhc3QocWMtPmN1cnNnKSkgeworCQkJCQlxYy0+Y3Vyc2cgPSBzZ19uZXh0KHFjLT5jdXJzZyk7CisJCQkJCWhhbmRsZWQgPSAxOworCQkJCQlvY3Rlb25fY2ZfZG1hX3N0YXJ0KHFjKTsKKwkJCQkJY29udGludWU7CisJCQkJfSBlbHNlIHsKKwkJCQkJY2ZfcG9ydC0+ZG1hX2ZpbmlzaGVkID0gMTsKKwkJCQl9CisJCQl9CisJCQlpZiAoIWNmX3BvcnQtPmRtYV9maW5pc2hlZCkKKwkJCQljb250aW51ZTsKKwkJCXN0YXR1cyA9IGlvcmVhZDgoYXAtPmlvYWRkci5hbHRzdGF0dXNfYWRkcik7CisJCQlpZiAoc3RhdHVzICYgKEFUQV9CVVNZIHwgQVRBX0RSUSkpIHsKKwkJCQkvKgorCQkJCSAqIFdlIGFyZSBidXN5LCB0cnkgdG8gaGFuZGxlIGl0CisJCQkJICogbGF0ZXIuICBUaGlzIGlzIHRoZSBETUEgZmluaXNoZWQKKwkJCQkgKiBpbnRlcnJ1cHQsIGFuZCBpdCBjb3VsZCB0YWtlIGEKKwkJCQkgKiBsaXR0bGUgd2hpbGUgZm9yIHRoZSBjYXJkIHRvIGJlCisJCQkJICogcmVhZHkgZm9yIG1vcmUgY29tbWFuZHMuCisJCQkJICovCisJCQkJLyogQ2xlYXIgRE1BIGlycS4gKi8KKwkJCQlkbWFfaW50LnU2NCA9IDA7CisJCQkJZG1hX2ludC5zLmRvbmUgPSAxOworCQkJCWN2bXhfd3JpdGVfY3NyKENWTVhfTUlPX0JPT1RfRE1BX0lOVFgob2NkLT5kbWFfZW5naW5lKSwKKwkJCQkJICAgICAgIGRtYV9pbnQudTY0KTsKKworCQkJCXF1ZXVlX2RlbGF5ZWRfd29yayhjZl9wb3J0LT53cSwKKwkJCQkJCSAgICZjZl9wb3J0LT5kZWxheWVkX2ZpbmlzaCwgMSk7CisJCQkJaGFuZGxlZCA9IDE7CisJCQl9IGVsc2UgeworCQkJCWhhbmRsZWQgfD0gb2N0ZW9uX2NmX2RtYV9maW5pc2hlZChhcCwgcWMpOworCQkJfQorCQl9CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhvc3QtPmxvY2ssIGZsYWdzKTsKKwlEUFJJTlRLKCJFWElUXG4iKTsKKwlyZXR1cm4gSVJRX1JFVFZBTChoYW5kbGVkKTsKK30KKworc3RhdGljIHZvaWQgb2N0ZW9uX2NmX2RlbGF5ZWRfZmluaXNoKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3Qgb2N0ZW9uX2NmX3BvcnQgKmNmX3BvcnQgPSBjb250YWluZXJfb2Yod29yaywKKwkJCQkJCSAgICAgIHN0cnVjdCBvY3Rlb25fY2ZfcG9ydCwKKwkJCQkJCSAgICAgIGRlbGF5ZWRfZmluaXNoLndvcmspOworCXN0cnVjdCBhdGFfcG9ydCAqYXAgPSBjZl9wb3J0LT5hcDsKKwlzdHJ1Y3QgYXRhX2hvc3QgKmhvc3QgPSBhcC0+aG9zdDsKKwlzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdTggc3RhdHVzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmhvc3QtPmxvY2ssIGZsYWdzKTsKKworCS8qCisJICogSWYgdGhlIHBvcnQgaXMgbm90IHdhaXRpbmcgZm9yIGNvbXBsZXRpb24sIGl0IG11c3QgaGF2ZQorCSAqIGhhbmRsZWQgaXQgcHJldmlvdXNseS4gIFRoZSBoc21fdGFza19zdGF0ZSBpcworCSAqIHByb3RlY3RlZCBieSBob3N0LT5sb2NrLgorCSAqLworCWlmIChhcC0+aHNtX3Rhc2tfc3RhdGUgIT0gSFNNX1NUX0xBU1QgfHwgIWNmX3BvcnQtPmRtYV9maW5pc2hlZCkKKwkJZ290byBvdXQ7CisKKwlzdGF0dXMgPSBpb3JlYWQ4KGFwLT5pb2FkZHIuYWx0c3RhdHVzX2FkZHIpOworCWlmIChzdGF0dXMgJiAoQVRBX0JVU1kgfCBBVEFfRFJRKSkgeworCQkvKiBTdGlsbCBidXN5LCB0cnkgYWdhaW4uICovCisJCXF1ZXVlX2RlbGF5ZWRfd29yayhjZl9wb3J0LT53cSwKKwkJCQkgICAmY2ZfcG9ydC0+ZGVsYXllZF9maW5pc2gsIDEpOworCQlnb3RvIG91dDsKKwl9CisJcWMgPSBhdGFfcWNfZnJvbV90YWcoYXAsIGFwLT5saW5rLmFjdGl2ZV90YWcpOworCWlmIChxYyAmJiAoIShxYy0+dGYuZmxhZ3MgJiBBVEFfVEZMQUdfUE9MTElORykpICYmCisJICAgIChxYy0+ZmxhZ3MgJiBBVEFfUUNGTEFHX0FDVElWRSkpCisJCW9jdGVvbl9jZl9kbWFfZmluaXNoZWQoYXAsIHFjKTsKK291dDoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZob3N0LT5sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIG9jdGVvbl9jZl9kZXZfY29uZmlnKHN0cnVjdCBhdGFfZGV2aWNlICpkZXYpCit7CisJLyoKKwkgKiBBIG1heGltdW0gb2YgMl4yMCAtIDEgMTYgYml0IHRyYW5zZmVycyBhcmUgcG9zc2libGUgd2l0aAorCSAqIHRoZSBib290YnVzIERNQS4gIFNvIHdlIG5lZWQgdG8gdGhyb3R0bGUgbWF4X3NlY3RvcnMgdG8KKwkgKiAoMl4xMiAtIDEgPT0gNDA5NSkgdG8gYXNzdXJlIHRoYXQgdGhpcyBjYW4gbmV2ZXIgaGFwcGVuLgorCSAqLworCWRldi0+bWF4X3NlY3RvcnMgPSBtaW4oZGV2LT5tYXhfc2VjdG9ycywgNDA5NVUpOworfQorCisvKgorICogVHJhcCBpZiBkcml2ZXIgdHJpZXMgdG8gZG8gc3RhbmRhcmQgYm1kbWEgY29tbWFuZHMuICBUaGV5IGFyZSBub3QKKyAqIHN1cHBvcnRlZC4KKyAqLworc3RhdGljIHZvaWQgdW5yZWFjaGFibGVfcWMoc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYykKK3sKKwlCVUcoKTsKK30KKworc3RhdGljIHU4IHVucmVhY2hhYmxlX3BvcnQoc3RydWN0IGF0YV9wb3J0ICphcCkKK3sKKwlCVUcoKTsKK30KKworLyoKKyAqIFdlIGRvbid0IGRvIEFUQVBJIERNQSBzbyByZXR1cm4gMC4KKyAqLworc3RhdGljIGludCBvY3Rlb25fY2ZfY2hlY2tfYXRhcGlfZG1hKHN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgb2N0ZW9uX2NmX3FjX2lzc3VlKHN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMpCit7CisJc3RydWN0IGF0YV9wb3J0ICphcCA9IHFjLT5hcDsKKworCXN3aXRjaCAocWMtPnRmLnByb3RvY29sKSB7CisJY2FzZSBBVEFfUFJPVF9ETUE6CisJCVdBUk5fT04ocWMtPnRmLmZsYWdzICYgQVRBX1RGTEFHX1BPTExJTkcpOworCisJCWFwLT5vcHMtPnNmZl90Zl9sb2FkKGFwLCAmcWMtPnRmKTsgIC8qIGxvYWQgdGYgcmVnaXN0ZXJzICovCisJCW9jdGVvbl9jZl9kbWFfc2V0dXAocWMpOwkgICAgLyogc2V0IHVwIGRtYSAqLworCQlvY3Rlb25fY2ZfZG1hX3N0YXJ0KHFjKTsJICAgIC8qIGluaXRpYXRlIGRtYSAqLworCQlhcC0+aHNtX3Rhc2tfc3RhdGUgPSBIU01fU1RfTEFTVDsKKwkJYnJlYWs7CisKKwljYXNlIEFUQVBJX1BST1RfRE1BOgorCQlkZXZfZXJyKGFwLT5kZXYsICJFcnJvciwgQVRBUEkgbm90IHN1cHBvcnRlZFxuIik7CisJCUJVRygpOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIGF0YV9zZmZfcWNfaXNzdWUocWMpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGF0YV9wb3J0X29wZXJhdGlvbnMgb2N0ZW9uX2NmX29wcyA9IHsKKwkuaW5oZXJpdHMJCT0gJmF0YV9zZmZfcG9ydF9vcHMsCisJLmNoZWNrX2F0YXBpX2RtYQk9IG9jdGVvbl9jZl9jaGVja19hdGFwaV9kbWEsCisJLnFjX3ByZXAJCT0gYXRhX25vb3BfcWNfcHJlcCwKKwkucWNfaXNzdWUJCT0gb2N0ZW9uX2NmX3FjX2lzc3VlLAorCS5zZmZfZGV2X3NlbGVjdAkJPSBvY3Rlb25fY2ZfZGV2X3NlbGVjdCwKKwkuc2ZmX2lycV9vbgkJPSBvY3Rlb25fY2ZfaXJxX29uLAorCS5zZmZfaXJxX2NsZWFyCQk9IG9jdGVvbl9jZl9pcnFfY2xlYXIsCisJLmJtZG1hX3NldHVwCQk9IHVucmVhY2hhYmxlX3FjLAorCS5ibWRtYV9zdGFydAkJPSB1bnJlYWNoYWJsZV9xYywKKwkuYm1kbWFfc3RvcAkJPSB1bnJlYWNoYWJsZV9xYywKKwkuYm1kbWFfc3RhdHVzCQk9IHVucmVhY2hhYmxlX3BvcnQsCisJLmNhYmxlX2RldGVjdAkJPSBhdGFfY2FibGVfNDB3aXJlLAorCS5zZXRfcGlvbW9kZQkJPSBvY3Rlb25fY2Zfc2V0X3Bpb21vZGUsCisJLnNldF9kbWFtb2RlCQk9IG9jdGVvbl9jZl9zZXRfZG1hbW9kZSwKKwkuZGV2X2NvbmZpZwkJPSBvY3Rlb25fY2ZfZGV2X2NvbmZpZywKK307CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IG9jdGVvbl9jZl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCByZXNvdXJjZSAqcmVzX2NzMCwgKnJlc19jczE7CisKKwl2b2lkIF9faW9tZW0gKmNzMDsKKwl2b2lkIF9faW9tZW0gKmNzMSA9IE5VTEw7CisJc3RydWN0IGF0YV9ob3N0ICpob3N0OworCXN0cnVjdCBhdGFfcG9ydCAqYXA7CisJc3RydWN0IG9jdGVvbl9jZl9kYXRhICpvY2Q7CisJaW50IGlycSA9IDA7CisJaXJxX2hhbmRsZXJfdCBpcnFfaGFuZGxlciA9IE5VTEw7CisJdm9pZCBfX2lvbWVtICpiYXNlOworCXN0cnVjdCBvY3Rlb25fY2ZfcG9ydCAqY2ZfcG9ydDsKKworCXJlc19jczAgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCisJaWYgKCFyZXNfY3MwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW9jZCA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCisJY3MwID0gZGV2bV9pb3JlbWFwX25vY2FjaGUoJnBkZXYtPmRldiwgcmVzX2NzMC0+c3RhcnQsCisJCQkJICAgcmVzX2NzMC0+ZW5kIC0gcmVzX2NzMC0+c3RhcnQgKyAxKTsKKworCWlmICghY3MwKQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qIERldGVybWluZSBmcm9tIGF2YWlsYWJpbGl0eSBvZiBETUEgaWYgVHJ1ZSBJREUgbW9kZSBvciBub3QgKi8KKwlpZiAob2NkLT5kbWFfZW5naW5lID49IDApIHsKKwkJcmVzX2NzMSA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMSk7CisJCWlmICghcmVzX2NzMSkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCWNzMSA9IGRldm1faW9yZW1hcF9ub2NhY2hlKCZwZGV2LT5kZXYsIHJlc19jczEtPnN0YXJ0LAorCQkJCQkgICByZXNfY3MwLT5lbmQgLSByZXNfY3MxLT5zdGFydCArIDEpOworCisJCWlmICghY3MxKQorCQkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJY2ZfcG9ydCA9IGt6YWxsb2Moc2l6ZW9mKCpjZl9wb3J0KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFjZl9wb3J0KQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qIGFsbG9jYXRlIGhvc3QgKi8KKwlob3N0ID0gYXRhX2hvc3RfYWxsb2MoJnBkZXYtPmRldiwgMSk7CisJaWYgKCFob3N0KQorCQlnb3RvIGZyZWVfY2ZfcG9ydDsKKworCWFwID0gaG9zdC0+cG9ydHNbMF07CisJYXAtPnByaXZhdGVfZGF0YSA9IGNmX3BvcnQ7CisJY2ZfcG9ydC0+YXAgPSBhcDsKKwlhcC0+b3BzID0gJm9jdGVvbl9jZl9vcHM7CisJYXAtPnBpb19tYXNrID0gMHg3ZjsgLyogU3VwcG9ydCBQSU8gMC02ICovCisJYXAtPmZsYWdzIHw9IEFUQV9GTEFHX01NSU8gfCBBVEFfRkxBR19OT19MRUdBQ1kKKwkJICB8IEFUQV9GTEFHX05PX0FUQVBJIHwgQVRBX0ZMQUdfUElPX1BPTExJTkc7CisKKwliYXNlID0gY3MwICsgb2NkLT5iYXNlX3JlZ2lvbl9iaWFzOworCWlmICghb2NkLT5pczE2Yml0KSB7CisJCWFwLT5pb2FkZHIuY21kX2FkZHIJPSBiYXNlOworCQlhdGFfc2ZmX3N0ZF9wb3J0cygmYXAtPmlvYWRkcik7CisKKwkJYXAtPmlvYWRkci5hbHRzdGF0dXNfYWRkciA9IGJhc2UgKyAweGU7CisJCWFwLT5pb2FkZHIuY3RsX2FkZHIJPSBiYXNlICsgMHhlOworCQlvY3Rlb25fY2Zfb3BzLnNmZl9kYXRhX3hmZXIgPSBvY3Rlb25fY2ZfZGF0YV94ZmVyODsKKwl9IGVsc2UgaWYgKGNzMSkgeworCQkvKiBQcmVzZW5jZSBvZiBjczEgaW5kaWNhdGVzIFRydWUgSURFIG1vZGUuICAqLworCQlhcC0+aW9hZGRyLmNtZF9hZGRyCT0gYmFzZSArIChBVEFfUkVHX0NNRCA8PCAxKSArIDE7CisJCWFwLT5pb2FkZHIuZGF0YV9hZGRyCT0gYmFzZSArIChBVEFfUkVHX0RBVEEgPDwgMSk7CisJCWFwLT5pb2FkZHIuZXJyb3JfYWRkcgk9IGJhc2UgKyAoQVRBX1JFR19FUlIgPDwgMSkgKyAxOworCQlhcC0+aW9hZGRyLmZlYXR1cmVfYWRkcgk9IGJhc2UgKyAoQVRBX1JFR19GRUFUVVJFIDw8IDEpICsgMTsKKwkJYXAtPmlvYWRkci5uc2VjdF9hZGRyCT0gYmFzZSArIChBVEFfUkVHX05TRUNUIDw8IDEpICsgMTsKKwkJYXAtPmlvYWRkci5sYmFsX2FkZHIJPSBiYXNlICsgKEFUQV9SRUdfTEJBTCA8PCAxKSArIDE7CisJCWFwLT5pb2FkZHIubGJhbV9hZGRyCT0gYmFzZSArIChBVEFfUkVHX0xCQU0gPDwgMSkgKyAxOworCQlhcC0+aW9hZGRyLmxiYWhfYWRkcgk9IGJhc2UgKyAoQVRBX1JFR19MQkFIIDw8IDEpICsgMTsKKwkJYXAtPmlvYWRkci5kZXZpY2VfYWRkcgk9IGJhc2UgKyAoQVRBX1JFR19ERVZJQ0UgPDwgMSkgKyAxOworCQlhcC0+aW9hZGRyLnN0YXR1c19hZGRyCT0gYmFzZSArIChBVEFfUkVHX1NUQVRVUyA8PCAxKSArIDE7CisJCWFwLT5pb2FkZHIuY29tbWFuZF9hZGRyCT0gYmFzZSArIChBVEFfUkVHX0NNRCA8PCAxKSArIDE7CisJCWFwLT5pb2FkZHIuYWx0c3RhdHVzX2FkZHIgPSBjczEgKyAoNiA8PCAxKSArIDE7CisJCWFwLT5pb2FkZHIuY3RsX2FkZHIJPSBjczEgKyAoNiA8PCAxKSArIDE7CisJCW9jdGVvbl9jZl9vcHMuc2ZmX2RhdGFfeGZlciA9IG9jdGVvbl9jZl9kYXRhX3hmZXIxNjsKKworCQlhcC0+bXdkbWFfbWFzawk9IDB4MWY7IC8qIFN1cHBvcnQgTVdETUEgMC00ICovCisJCWlycSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7CisJCWlycV9oYW5kbGVyID0gb2N0ZW9uX2NmX2ludGVycnVwdDsKKworCQkvKiBUcnVlIElERSBtb2RlIG5lZWRzIGRlbGF5ZWQgd29yayB0byBwb2xsIGZvciBub3QtYnVzeS4gICovCisJCWNmX3BvcnQtPndxID0gY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoRFJWX05BTUUpOworCQlpZiAoIWNmX3BvcnQtPndxKQorCQkJZ290byBmcmVlX2NmX3BvcnQ7CisJCUlOSVRfREVMQVlFRF9XT1JLKCZjZl9wb3J0LT5kZWxheWVkX2ZpbmlzaCwKKwkJCQkgIG9jdGVvbl9jZl9kZWxheWVkX2ZpbmlzaCk7CisKKwl9IGVsc2UgeworCQkvKiAxNiBiaXQgYnV0IG5vdCBUcnVlIElERSAqLworCQlvY3Rlb25fY2Zfb3BzLnNmZl9kYXRhX3hmZXIJPSBvY3Rlb25fY2ZfZGF0YV94ZmVyMTY7CisJCW9jdGVvbl9jZl9vcHMuc29mdHJlc2V0CQk9IG9jdGVvbl9jZl9zb2Z0cmVzZXQxNjsKKwkJb2N0ZW9uX2NmX29wcy5zZmZfY2hlY2tfc3RhdHVzCT0gb2N0ZW9uX2NmX2NoZWNrX3N0YXR1czE2OworCQlvY3Rlb25fY2Zfb3BzLnNmZl90Zl9yZWFkCT0gb2N0ZW9uX2NmX3RmX3JlYWQxNjsKKwkJb2N0ZW9uX2NmX29wcy5zZmZfdGZfbG9hZAk9IG9jdGVvbl9jZl90Zl9sb2FkMTY7CisJCW9jdGVvbl9jZl9vcHMuc2ZmX2V4ZWNfY29tbWFuZAk9IG9jdGVvbl9jZl9leGVjX2NvbW1hbmQxNjsKKworCQlhcC0+aW9hZGRyLmRhdGFfYWRkcgk9IGJhc2UgKyBBVEFfUkVHX0RBVEE7CisJCWFwLT5pb2FkZHIubnNlY3RfYWRkcgk9IGJhc2UgKyBBVEFfUkVHX05TRUNUOworCQlhcC0+aW9hZGRyLmxiYWxfYWRkcgk9IGJhc2UgKyBBVEFfUkVHX0xCQUw7CisJCWFwLT5pb2FkZHIuY3RsX2FkZHIJPSBiYXNlICsgMHhlOworCQlhcC0+aW9hZGRyLmFsdHN0YXR1c19hZGRyID0gYmFzZSArIDB4ZTsKKwl9CisKKwlhdGFfcG9ydF9kZXNjKGFwLCAiY21kICVwIGN0bCAlcCIsIGJhc2UsIGFwLT5pb2FkZHIuY3RsX2FkZHIpOworCisKKwlkZXZfaW5mbygmcGRldi0+ZGV2LCAidmVyc2lvbiAiIERSVl9WRVJTSU9OIiAlZCBiaXQlcy5cbiIsCisJCSAob2NkLT5pczE2Yml0KSA/IDE2IDogOCwKKwkJIChjczEpID8gIiwgVHJ1ZSBJREUiIDogIiIpOworCisKKwlyZXR1cm4gYXRhX2hvc3RfYWN0aXZhdGUoaG9zdCwgaXJxLCBpcnFfaGFuZGxlciwgMCwgJm9jdGVvbl9jZl9zaHQpOworCitmcmVlX2NmX3BvcnQ6CisJa2ZyZWUoY2ZfcG9ydCk7CisJcmV0dXJuIC1FTk9NRU07Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIG9jdGVvbl9jZl9kcml2ZXIgPSB7CisJLnByb2JlCQk9IG9jdGVvbl9jZl9wcm9iZSwKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUJPSBEUlZfTkFNRSwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJfSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IG9jdGVvbl9jZl9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3Rlcigmb2N0ZW9uX2NmX2RyaXZlcik7Cit9CisKKworTU9EVUxFX0FVVEhPUigiRGF2aWQgRGFuZXkgPGRkYW5leUBjYXZpdW1uZXR3b3Jrcy5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oImxvdy1sZXZlbCBkcml2ZXIgZm9yIENhdml1bSBPQ1RFT04gQ29tcGFjdCBGbGFzaCBQQVRBIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfVkVSU0lPTihEUlZfVkVSU0lPTik7CitNT0RVTEVfQUxJQVMoInBsYXRmb3JtOiIgRFJWX05BTUUpOworCittb2R1bGVfaW5pdChvY3Rlb25fY2ZfaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9wYXRhX3BsYXRmb3JtLmMgYi9kcml2ZXJzL2F0YS9wYXRhX3BsYXRmb3JtLmMKaW5kZXggNmFmYTA3YS4uZDhkNzQzYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvcGF0YV9wbGF0Zm9ybS5jCisrKyBiL2RyaXZlcnMvYXRhL3BhdGFfcGxhdGZvcm0uYwpAQCAtMTg2LDcgKzE4Niw3IEBACiAgKglBIHBsYXRmb3JtIGJ1cyBBVEEgZGV2aWNlIGhhcyBiZWVuIHVucGx1Z2dlZC4gUGVyZm9ybSB0aGUgbmVlZGVkCiAgKgljbGVhbnVwLiBBbHNvIGNhbGxlZCBvbiBtb2R1bGUgdW5sb2FkIGZvciBhbnkgYWN0aXZlIGRldmljZXMuCiAgKi8KLWludCBfX2RldmV4aXQgX19wYXRhX3BsYXRmb3JtX3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpkZXYpCitpbnQgX19wYXRhX3BsYXRmb3JtX3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGF0YV9ob3N0ICpob3N0ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3BhdGFfc2lsNjgwLmMgYi9kcml2ZXJzL2F0YS9wYXRhX3NpbDY4MC5jCmluZGV4IDgzNTgwYTUuLjllNzY0ZTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfc2lsNjgwLmMKKysrIGIvZHJpdmVycy9hdGEvcGF0YV9zaWw2ODAuYwpAQCAtMzIsNyArMzIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2xpYmF0YS5oPgogCiAjZGVmaW5lIERSVl9OQU1FICJwYXRhX3NpbDY4MCIKLSNkZWZpbmUgRFJWX1ZFUlNJT04gIjAuNC44IgorI2RlZmluZSBEUlZfVkVSU0lPTiAiMC40LjkiCiAKICNkZWZpbmUgU0lMNjgwX01NSU9fQkFSCQk1CiAKQEAgLTE5NSw3ICsxOTUsNyBAQAogfTsKIAogc3RhdGljIHN0cnVjdCBhdGFfcG9ydF9vcGVyYXRpb25zIHNpbDY4MF9wb3J0X29wcyA9IHsKLQkuaW5oZXJpdHMJPSAmYXRhX2JtZG1hX3BvcnRfb3BzLAorCS5pbmhlcml0cwk9ICZhdGFfYm1kbWEzMl9wb3J0X29wcywKIAkuY2FibGVfZGV0ZWN0CT0gc2lsNjgwX2NhYmxlX2RldGVjdCwKIAkuc2V0X3Bpb21vZGUJPSBzaWw2ODBfc2V0X3Bpb21vZGUsCiAJLnNldF9kbWFtb2RlCT0gc2lsNjgwX3NldF9kbWFtb2RlLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvc2F0YV9mc2wuYyBiL2RyaXZlcnMvYXRhL3NhdGFfZnNsLmMKaW5kZXggMWE1NmRiOS4uNTViYzg4YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvc2F0YV9mc2wuYworKysgYi9kcml2ZXJzL2F0YS9zYXRhX2ZzbC5jCkBAIC0xMjg4LDcgKzEyODgsNyBAQAogc3RhdGljIGludCBzYXRhX2ZzbF9wcm9iZShzdHJ1Y3Qgb2ZfZGV2aWNlICpvZmRldiwKIAkJCWNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoKQogewotCWludCByZXR2YWwgPSAwOworCWludCByZXR2YWwgPSAtRU5YSU87CiAJdm9pZCBfX2lvbWVtICpoY3JfYmFzZSA9IE5VTEw7CiAJdm9pZCBfX2lvbWVtICpzc3JfYmFzZSA9IE5VTEw7CiAJdm9pZCBfX2lvbWVtICpjc3JfYmFzZSA9IE5VTEw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9zYXRhX3NpbDI0LmMgYi9kcml2ZXJzL2F0YS9zYXRhX3NpbDI0LmMKaW5kZXggY2NlZTkzMC4uMjU5MGMyMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvc2F0YV9zaWwyNC5jCisrKyBiL2RyaXZlcnMvYXRhL3NhdGFfc2lsMjQuYwpAQCAtNTEsMTMgKzUxLDYgQEAKIAlfX2xlMzIJZmxhZ3M7CiB9OwogCi0vKgotICogUG9ydCBtdWx0aXBsaWVyCi0gKi8KLXN0cnVjdCBzaWwyNF9wb3J0X211bHRpcGxpZXIgewotCV9fbGUzMglkaWFnOwotCV9fbGUzMglzYWN0aXZlOwotfTsKIAogZW51bSB7CiAJU0lMMjRfSE9TVF9CQVIJCT0gMCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3NhdGFfdmlhLmMgYi9kcml2ZXJzL2F0YS9zYXRhX3ZpYS5jCmluZGV4IGMxODkzNWYuLjVjNjJkYTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3NhdGFfdmlhLmMKKysrIGIvZHJpdmVycy9hdGEvc2F0YV92aWEuYwpAQCAtOTIsNiArOTIsOCBAQAogCXsgUENJX1ZERVZJQ0UoVklBLCAweDUzNzIpLCB2dDY0MjAgfSwKIAl7IFBDSV9WREVWSUNFKFZJQSwgMHg3MzcyKSwgdnQ2NDIwIH0sCiAJeyBQQ0lfVkRFVklDRShWSUEsIDB4NTI4NyksIHZ0ODI1MSB9LCAvKiAyIHNhdGEgY2hubHMgKE1hc3Rlci9TbGF2ZSkgKi8KKwl7IFBDSV9WREVWSUNFKFZJQSwgMHg5MDAwKSwgdnQ4MjUxIH0sCisJeyBQQ0lfVkRFVklDRShWSUEsIDB4OTA0MCksIHZ0ODI1MSB9LAogCiAJeyB9CS8qIHRlcm1pbmF0ZSBsaXN0ICovCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdG0vaXBoYXNlLmMgYi9kcml2ZXJzL2F0bS9pcGhhc2UuYwppbmRleCAwODg4ODVlLi5lMWM3NjExIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0bS9pcGhhc2UuYworKysgYi9kcml2ZXJzL2F0bS9pcGhhc2UuYwpAQCAtNjQsNyArNjQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KICNpbmNsdWRlICJpcGhhc2UuaCIJCSAgCiAjaW5jbHVkZSAic3VuaS5oIgkJICAKLSNkZWZpbmUgc3dhcCh4KSAoKCh4ICYgMHhmZikgPDwgOCkgfCAoKHggJiAweGZmMDApID4+IDgpKSAgCisjZGVmaW5lIHN3YXBfYnl0ZV9vcmRlcih4KSAoKCh4ICYgMHhmZikgPDwgOCkgfCAoKHggJiAweGZmMDApID4+IDgpKQogCiAjZGVmaW5lIFBSSVYoZGV2KSAoKHN0cnVjdCBzdW5pX3ByaXYgKikgZGV2LT5waHlfZGF0YSkKIApAQCAtMTMwNiw3ICsxMzA2LDcgQEAKICAgICAgICAgICAvLyBnZXQgcmVhbCBwa3QgbGVuZ3RoICBwd2FuZ190ZXN0CiAgICAgICAgICAgdHJhaWxlciA9IChzdHJ1Y3QgY3Bjc190cmFpbGVyKikoKHVfY2hhciAqKXNrYi0+ZGF0YSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2ItPmxlbiAtIHNpemVvZigqdHJhaWxlcikpOwotICAgICAgICAgIGxlbmd0aCA9ICBzd2FwKHRyYWlsZXItPmxlbmd0aCk7CisJICBsZW5ndGggPSBzd2FwX2J5dGVfb3JkZXIodHJhaWxlci0+bGVuZ3RoKTsKICAgICAgICAgICBpZiAoKGxlbmd0aCA+IGlhZGV2LT5yeF9idWZfc3opIHx8IChsZW5ndGggPiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChza2ItPmxlbiAtIHNpemVvZihzdHJ1Y3QgY3Bjc190cmFpbGVyKSkpKQogICAgICAgICAgIHsKQEAgLTI5OTUsNyArMjk5NSw3IEBACiAJCXNrYi0+bGVuLCBQQ0lfRE1BX1RPREVWSUNFKTsKIAl3cl9wdHItPmxvY2FsX3BrdF9hZGRyID0gKGJ1Zl9kZXNjX3B0ci0+YnVmX3N0YXJ0X2hpIDw8IDE2KSB8IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZfZGVzY19wdHItPmJ1Zl9zdGFydF9sbzsgIAotCS8qIHdyX3B0ci0+Ynl0ZXMgPSBzd2FwKHRvdGFsX2xlbik7CWRpZG4ndCBzZWVtIHRvIGFmZmVjdCA/PyAqLyAgCisJLyogd3JfcHRyLT5ieXRlcyA9IHN3YXBfYnl0ZV9vcmRlcih0b3RhbF9sZW4pOyBkaWRuJ3Qgc2VlbSB0byBhZmZlY3Q/PyAqLwogCXdyX3B0ci0+Ynl0ZXMgPSBza2ItPmxlbjsgIAogCiAgICAgICAgIC8qIGh3IGJ1ZyAtIERMRXMgb2YgMHgyZCwgMHgyZSwgMHgyZiBjYXVzZSBETUEgbG9ja3VwICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvS2NvbmZpZyBiL2RyaXZlcnMvYmFzZS9LY29uZmlnCmluZGV4IGQ4ZThjNDkuLjhmMDA2ZjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9LY29uZmlnCisrKyBiL2RyaXZlcnMvYmFzZS9LY29uZmlnCkBAIC01NCw3ICs1NCw3IEBACiAJICBzdWNoIGZpcm13YXJlLCBhbmQgZG8gbm90IHdpc2ggdG8gdXNlIGFuIGluaXRyZC4KIAogCSAgVGhpcyBzaW5nbGUgb3B0aW9uIGNvbnRyb2xzIHRoZSBpbmNsdXNpb24gb2YgZmlybXdhcmUgZm9yCi0JICBldmVyeSBkcml2ZXIgd2hpY2ggdXNlcyByZXF1ZXN0X2Zpcm1hcmUoKSBhbmQgc2hpcHMgaXRzCisJICBldmVyeSBkcml2ZXIgd2hpY2ggdXNlcyByZXF1ZXN0X2Zpcm13YXJlKCkgYW5kIHNoaXBzIGl0cwogCSAgZmlybXdhcmUgaW4gdGhlIGtlcm5lbCBzb3VyY2UgdHJlZSwgdG8gYXZvaWQgYSBwcm9saWZlcmF0aW9uCiAJICBvZiAnSW5jbHVkZSBmaXJtd2FyZSBmb3IgeHh4IGRldmljZScgb3B0aW9ucy4KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL2Jhc2UuaCBiL2RyaXZlcnMvYmFzZS9iYXNlLmgKaW5kZXggYjY3NmY4Zi4uMGE1ZjA1NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL2Jhc2UuaAorKysgYi9kcml2ZXJzL2Jhc2UvYmFzZS5oCkBAIC02MywzMiArNjMsNiBAQAogI2RlZmluZSB0b19jbGFzcyhvYmopCVwKIAljb250YWluZXJfb2Yob2JqLCBzdHJ1Y3QgY2xhc3NfcHJpdmF0ZSwgY2xhc3Nfc3Vic3lzLmtvYmopCiAKLS8qKgotICogc3RydWN0IGRldmljZV9wcml2YXRlIC0gc3RydWN0dXJlIHRvIGhvbGQgdGhlIHByaXZhdGUgdG8gdGhlIGRyaXZlciBjb3JlIHBvcnRpb25zIG9mIHRoZSBkZXZpY2Ugc3RydWN0dXJlLgotICoKLSAqIEBrbGlzdF9jaGlsZHJlbiAtIGtsaXN0IGNvbnRhaW5pbmcgYWxsIGNoaWxkcmVuIG9mIHRoaXMgZGV2aWNlCi0gKiBAa25vZGVfcGFyZW50IC0gbm9kZSBpbiBzaWJsaW5nIGxpc3QKLSAqIEBrbm9kZV9kcml2ZXIgLSBub2RlIGluIGRyaXZlciBsaXN0Ci0gKiBAa25vZGVfYnVzIC0gbm9kZSBpbiBidXMgbGlzdAotICogQGRldmljZSAtIHBvaW50ZXIgYmFjayB0byB0aGUgc3RydWN0IGNsYXNzIHRoYXQgdGhpcyBzdHJ1Y3R1cmUgaXMKLSAqIGFzc29jaWF0ZWQgd2l0aC4KLSAqCi0gKiBOb3RoaW5nIG91dHNpZGUgb2YgdGhlIGRyaXZlciBjb3JlIHNob3VsZCBldmVyIHRvdWNoIHRoZXNlIGZpZWxkcy4KLSAqLwotc3RydWN0IGRldmljZV9wcml2YXRlIHsKLQlzdHJ1Y3Qga2xpc3Qga2xpc3RfY2hpbGRyZW47Ci0Jc3RydWN0IGtsaXN0X25vZGUga25vZGVfcGFyZW50OwotCXN0cnVjdCBrbGlzdF9ub2RlIGtub2RlX2RyaXZlcjsKLQlzdHJ1Y3Qga2xpc3Rfbm9kZSBrbm9kZV9idXM7Ci0Jc3RydWN0IGRldmljZSAqZGV2aWNlOwotfTsKLSNkZWZpbmUgdG9fZGV2aWNlX3ByaXZhdGVfcGFyZW50KG9iaikJXAotCWNvbnRhaW5lcl9vZihvYmosIHN0cnVjdCBkZXZpY2VfcHJpdmF0ZSwga25vZGVfcGFyZW50KQotI2RlZmluZSB0b19kZXZpY2VfcHJpdmF0ZV9kcml2ZXIob2JqKQlcCi0JY29udGFpbmVyX29mKG9iaiwgc3RydWN0IGRldmljZV9wcml2YXRlLCBrbm9kZV9kcml2ZXIpCi0jZGVmaW5lIHRvX2RldmljZV9wcml2YXRlX2J1cyhvYmopCVwKLQljb250YWluZXJfb2Yob2JqLCBzdHJ1Y3QgZGV2aWNlX3ByaXZhdGUsIGtub2RlX2J1cykKLQogLyogaW5pdGlhbGlzYXRpb24gZnVuY3Rpb25zICovCiBleHRlcm4gaW50IGRldmljZXNfaW5pdCh2b2lkKTsKIGV4dGVybiBpbnQgYnVzZXNfaW5pdCh2b2lkKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9idXMuYyBiL2RyaXZlcnMvYmFzZS9idXMuYwppbmRleCAwZjBhNTA0Li44M2YzMmI4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvYnVzLmMKKysrIGIvZHJpdmVycy9iYXNlL2J1cy5jCkBAIC0yNTMsMTQgKzI1Myw3IEBACiBzdGF0aWMgc3RydWN0IGRldmljZSAqbmV4dF9kZXZpY2Uoc3RydWN0IGtsaXN0X2l0ZXIgKmkpCiB7CiAJc3RydWN0IGtsaXN0X25vZGUgKm4gPSBrbGlzdF9uZXh0KGkpOwotCXN0cnVjdCBkZXZpY2UgKmRldiA9IE5VTEw7Ci0Jc3RydWN0IGRldmljZV9wcml2YXRlICpkZXZfcHJ2OwotCi0JaWYgKG4pIHsKLQkJZGV2X3BydiA9IHRvX2RldmljZV9wcml2YXRlX2J1cyhuKTsKLQkJZGV2ID0gZGV2X3Bydi0+ZGV2aWNlOwotCX0KLQlyZXR1cm4gZGV2OworCXJldHVybiBuID8gY29udGFpbmVyX29mKG4sIHN0cnVjdCBkZXZpY2UsIGtub2RlX2J1cykgOiBOVUxMOwogfQogCiAvKioKQEAgLTI5Myw3ICsyODYsNyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWtsaXN0X2l0ZXJfaW5pdF9ub2RlKCZidXMtPnAtPmtsaXN0X2RldmljZXMsICZpLAotCQkJICAgICAoc3RhcnQgPyAmc3RhcnQtPnAtPmtub2RlX2J1cyA6IE5VTEwpKTsKKwkJCSAgICAgKHN0YXJ0ID8gJnN0YXJ0LT5rbm9kZV9idXMgOiBOVUxMKSk7CiAJd2hpbGUgKChkZXYgPSBuZXh0X2RldmljZSgmaSkpICYmICFlcnJvcikKIAkJZXJyb3IgPSBmbihkZXYsIGRhdGEpOwogCWtsaXN0X2l0ZXJfZXhpdCgmaSk7CkBAIC0zMjcsNyArMzIwLDcgQEAKIAkJcmV0dXJuIE5VTEw7CiAKIAlrbGlzdF9pdGVyX2luaXRfbm9kZSgmYnVzLT5wLT5rbGlzdF9kZXZpY2VzLCAmaSwKLQkJCSAgICAgKHN0YXJ0ID8gJnN0YXJ0LT5wLT5rbm9kZV9idXMgOiBOVUxMKSk7CisJCQkgICAgIChzdGFydCA/ICZzdGFydC0+a25vZGVfYnVzIDogTlVMTCkpOwogCXdoaWxlICgoZGV2ID0gbmV4dF9kZXZpY2UoJmkpKSkKIAkJaWYgKG1hdGNoKGRldiwgZGF0YSkgJiYgZ2V0X2RldmljZShkZXYpKQogCQkJYnJlYWs7CkBAIC01MTQsOCArNTA3LDcgQEAKIAkJCXJldCA9IGRldmljZV9hdHRhY2goZGV2KTsKIAkJV0FSTl9PTihyZXQgPCAwKTsKIAkJaWYgKHJldCA+PSAwKQotCQkJa2xpc3RfYWRkX3RhaWwoJmRldi0+cC0+a25vZGVfYnVzLAotCQkJCSAgICAgICAmYnVzLT5wLT5rbGlzdF9kZXZpY2VzKTsKKwkJCWtsaXN0X2FkZF90YWlsKCZkZXYtPmtub2RlX2J1cywgJmJ1cy0+cC0+a2xpc3RfZGV2aWNlcyk7CiAJfQogfQogCkBAIC01MzYsOCArNTI4LDggQEAKIAkJc3lzZnNfcmVtb3ZlX2xpbmsoJmRldi0+YnVzLT5wLT5kZXZpY2VzX2tzZXQtPmtvYmosCiAJCQkJICBkZXZfbmFtZShkZXYpKTsKIAkJZGV2aWNlX3JlbW92ZV9hdHRycyhkZXYtPmJ1cywgZGV2KTsKLQkJaWYgKGtsaXN0X25vZGVfYXR0YWNoZWQoJmRldi0+cC0+a25vZGVfYnVzKSkKLQkJCWtsaXN0X2RlbCgmZGV2LT5wLT5rbm9kZV9idXMpOworCQlpZiAoa2xpc3Rfbm9kZV9hdHRhY2hlZCgmZGV2LT5rbm9kZV9idXMpKQorCQkJa2xpc3RfZGVsKCZkZXYtPmtub2RlX2J1cyk7CiAKIAkJcHJfZGVidWcoImJ1czogJyVzJzogcmVtb3ZlIGRldmljZSAlc1xuIiwKIAkJCSBkZXYtPmJ1cy0+bmFtZSwgZGV2X25hbWUoZGV2KSk7CkBAIC04MzksMTYgKzgzMSwxNCBAQAogCiBzdGF0aWMgdm9pZCBrbGlzdF9kZXZpY2VzX2dldChzdHJ1Y3Qga2xpc3Rfbm9kZSAqbikKIHsKLQlzdHJ1Y3QgZGV2aWNlX3ByaXZhdGUgKmRldl9wcnYgPSB0b19kZXZpY2VfcHJpdmF0ZV9idXMobik7Ci0Jc3RydWN0IGRldmljZSAqZGV2ID0gZGV2X3Bydi0+ZGV2aWNlOworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGNvbnRhaW5lcl9vZihuLCBzdHJ1Y3QgZGV2aWNlLCBrbm9kZV9idXMpOwogCiAJZ2V0X2RldmljZShkZXYpOwogfQogCiBzdGF0aWMgdm9pZCBrbGlzdF9kZXZpY2VzX3B1dChzdHJ1Y3Qga2xpc3Rfbm9kZSAqbikKIHsKLQlzdHJ1Y3QgZGV2aWNlX3ByaXZhdGUgKmRldl9wcnYgPSB0b19kZXZpY2VfcHJpdmF0ZV9idXMobik7Ci0Jc3RydWN0IGRldmljZSAqZGV2ID0gZGV2X3Bydi0+ZGV2aWNlOworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGNvbnRhaW5lcl9vZihuLCBzdHJ1Y3QgZGV2aWNlLCBrbm9kZV9idXMpOwogCiAJcHV0X2RldmljZShkZXYpOwogfQpAQCAtMTAwMywyMCArOTkzLDE4IEBACiB7CiAJc3RydWN0IGxpc3RfaGVhZCAqcG9zOwogCXN0cnVjdCBrbGlzdF9ub2RlICpuOwotCXN0cnVjdCBkZXZpY2VfcHJpdmF0ZSAqZGV2X3BydjsKIAlzdHJ1Y3QgZGV2aWNlICpiOwogCiAJbGlzdF9mb3JfZWFjaChwb3MsIGxpc3QpIHsKIAkJbiA9IGNvbnRhaW5lcl9vZihwb3MsIHN0cnVjdCBrbGlzdF9ub2RlLCBuX25vZGUpOwotCQlkZXZfcHJ2ID0gdG9fZGV2aWNlX3ByaXZhdGVfYnVzKG4pOwotCQliID0gZGV2X3Bydi0+ZGV2aWNlOworCQliID0gY29udGFpbmVyX29mKG4sIHN0cnVjdCBkZXZpY2UsIGtub2RlX2J1cyk7CiAJCWlmIChjb21wYXJlKGEsIGIpIDw9IDApIHsKLQkJCWxpc3RfbW92ZV90YWlsKCZhLT5wLT5rbm9kZV9idXMubl9ub2RlLAotCQkJCSAgICAgICAmYi0+cC0+a25vZGVfYnVzLm5fbm9kZSk7CisJCQlsaXN0X21vdmVfdGFpbCgmYS0+a25vZGVfYnVzLm5fbm9kZSwKKwkJCQkgICAgICAgJmItPmtub2RlX2J1cy5uX25vZGUpOwogCQkJcmV0dXJuOwogCQl9CiAJfQotCWxpc3RfbW92ZV90YWlsKCZhLT5wLT5rbm9kZV9idXMubl9ub2RlLCBsaXN0KTsKKwlsaXN0X21vdmVfdGFpbCgmYS0+a25vZGVfYnVzLm5fbm9kZSwgbGlzdCk7CiB9CiAKIHZvaWQgYnVzX3NvcnRfYnJlYWR0aGZpcnN0KHN0cnVjdCBidXNfdHlwZSAqYnVzLApAQCAtMTAyNiw3ICsxMDE0LDYgQEAKIAlMSVNUX0hFQUQoc29ydGVkX2RldmljZXMpOwogCXN0cnVjdCBsaXN0X2hlYWQgKnBvcywgKnRtcDsKIAlzdHJ1Y3Qga2xpc3Rfbm9kZSAqbjsKLQlzdHJ1Y3QgZGV2aWNlX3ByaXZhdGUgKmRldl9wcnY7CiAJc3RydWN0IGRldmljZSAqZGV2OwogCXN0cnVjdCBrbGlzdCAqZGV2aWNlX2tsaXN0OwogCkBAIC0xMDM1LDggKzEwMjIsNyBAQAogCXNwaW5fbG9jaygmZGV2aWNlX2tsaXN0LT5rX2xvY2spOwogCWxpc3RfZm9yX2VhY2hfc2FmZShwb3MsIHRtcCwgJmRldmljZV9rbGlzdC0+a19saXN0KSB7CiAJCW4gPSBjb250YWluZXJfb2YocG9zLCBzdHJ1Y3Qga2xpc3Rfbm9kZSwgbl9ub2RlKTsKLQkJZGV2X3BydiA9IHRvX2RldmljZV9wcml2YXRlX2J1cyhuKTsKLQkJZGV2ID0gZGV2X3Bydi0+ZGV2aWNlOworCQlkZXYgPSBjb250YWluZXJfb2Yobiwgc3RydWN0IGRldmljZSwga25vZGVfYnVzKTsKIAkJZGV2aWNlX2luc2VydGlvbl9zb3J0X2tsaXN0KGRldiwgJnNvcnRlZF9kZXZpY2VzLCBjb21wYXJlKTsKIAl9CiAJbGlzdF9zcGxpY2UoJnNvcnRlZF9kZXZpY2VzLCAmZGV2aWNlX2tsaXN0LT5rX2xpc3QpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL2NvcmUuYyBiL2RyaXZlcnMvYmFzZS9jb3JlLmMKaW5kZXggNjFkZjUwOC4uODA3OWFmYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL2NvcmUuYworKysgYi9kcml2ZXJzL2Jhc2UvY29yZS5jCkBAIC0xMDksNyArMTA5LDYgQEAKIHN0YXRpYyB2b2lkIGRldmljZV9yZWxlYXNlKHN0cnVjdCBrb2JqZWN0ICprb2JqKQogewogCXN0cnVjdCBkZXZpY2UgKmRldiA9IHRvX2Rldihrb2JqKTsKLQlzdHJ1Y3QgZGV2aWNlX3ByaXZhdGUgKnAgPSBkZXYtPnA7CiAKIAlpZiAoZGV2LT5yZWxlYXNlKQogCQlkZXYtPnJlbGVhc2UoZGV2KTsKQEAgLTEyMSw3ICsxMjAsNiBAQAogCQlXQVJOKDEsIEtFUk5fRVJSICJEZXZpY2UgJyVzJyBkb2VzIG5vdCBoYXZlIGEgcmVsZWFzZSgpICIKIAkJCSJmdW5jdGlvbiwgaXQgaXMgYnJva2VuIGFuZCBtdXN0IGJlIGZpeGVkLlxuIiwKIAkJCWRldl9uYW1lKGRldikpOwotCWtmcmVlKHApOwogfQogCiBzdGF0aWMgc3RydWN0IGtvYmpfdHlwZSBkZXZpY2Vfa3R5cGUgPSB7CkBAIC01MDksMTYgKzUwNywxNCBAQAogCiBzdGF0aWMgdm9pZCBrbGlzdF9jaGlsZHJlbl9nZXQoc3RydWN0IGtsaXN0X25vZGUgKm4pCiB7Ci0Jc3RydWN0IGRldmljZV9wcml2YXRlICpwID0gdG9fZGV2aWNlX3ByaXZhdGVfcGFyZW50KG4pOwotCXN0cnVjdCBkZXZpY2UgKmRldiA9IHAtPmRldmljZTsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBjb250YWluZXJfb2Yobiwgc3RydWN0IGRldmljZSwga25vZGVfcGFyZW50KTsKIAogCWdldF9kZXZpY2UoZGV2KTsKIH0KIAogc3RhdGljIHZvaWQga2xpc3RfY2hpbGRyZW5fcHV0KHN0cnVjdCBrbGlzdF9ub2RlICpuKQogewotCXN0cnVjdCBkZXZpY2VfcHJpdmF0ZSAqcCA9IHRvX2RldmljZV9wcml2YXRlX3BhcmVudChuKTsKLQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBwLT5kZXZpY2U7CisJc3RydWN0IGRldmljZSAqZGV2ID0gY29udGFpbmVyX29mKG4sIHN0cnVjdCBkZXZpY2UsIGtub2RlX3BhcmVudCk7CiAKIAlwdXRfZGV2aWNlKGRldik7CiB9CkBAIC01NDAsMTUgKzUzNiw5IEBACiAgKi8KIHZvaWQgZGV2aWNlX2luaXRpYWxpemUoc3RydWN0IGRldmljZSAqZGV2KQogewotCWRldi0+cCA9IGt6YWxsb2Moc2l6ZW9mKCpkZXYtPnApLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWRldi0+cCkgewotCQlXQVJOX09OKDEpOwotCQlyZXR1cm47Ci0JfQotCWRldi0+cC0+ZGV2aWNlID0gZGV2OwogCWRldi0+a29iai5rc2V0ID0gZGV2aWNlc19rc2V0OwogCWtvYmplY3RfaW5pdCgmZGV2LT5rb2JqLCAmZGV2aWNlX2t0eXBlKTsKLQlrbGlzdF9pbml0KCZkZXYtPnAtPmtsaXN0X2NoaWxkcmVuLCBrbGlzdF9jaGlsZHJlbl9nZXQsCisJa2xpc3RfaW5pdCgmZGV2LT5rbGlzdF9jaGlsZHJlbiwga2xpc3RfY2hpbGRyZW5fZ2V0LAogCQkgICBrbGlzdF9jaGlsZHJlbl9wdXQpOwogCUlOSVRfTElTVF9IRUFEKCZkZXYtPmRtYV9wb29scyk7CiAJaW5pdF9NVVRFWCgmZGV2LT5zZW0pOwpAQCAtOTMyLDggKzkyMiw3IEBACiAJa29iamVjdF91ZXZlbnQoJmRldi0+a29iaiwgS09CSl9BREQpOwogCWJ1c19hdHRhY2hfZGV2aWNlKGRldik7CiAJaWYgKHBhcmVudCkKLQkJa2xpc3RfYWRkX3RhaWwoJmRldi0+cC0+a25vZGVfcGFyZW50LAotCQkJICAgICAgICZwYXJlbnQtPnAtPmtsaXN0X2NoaWxkcmVuKTsKKwkJa2xpc3RfYWRkX3RhaWwoJmRldi0+a25vZGVfcGFyZW50LCAmcGFyZW50LT5rbGlzdF9jaGlsZHJlbik7CiAKIAlpZiAoZGV2LT5jbGFzcykgewogCQltdXRleF9sb2NrKCZkZXYtPmNsYXNzLT5wLT5jbGFzc19tdXRleCk7CkBAIC0xMDQ3LDcgKzEwMzYsNyBAQAogCWRldmljZV9wbV9yZW1vdmUoZGV2KTsKIAlkcG1fc3lzZnNfcmVtb3ZlKGRldik7CiAJaWYgKHBhcmVudCkKLQkJa2xpc3RfZGVsKCZkZXYtPnAtPmtub2RlX3BhcmVudCk7CisJCWtsaXN0X2RlbCgmZGV2LT5rbm9kZV9wYXJlbnQpOwogCWlmIChNQUpPUihkZXYtPmRldnQpKSB7CiAJCWRldmljZV9yZW1vdmVfc3lzX2Rldl9lbnRyeShkZXYpOwogCQlkZXZpY2VfcmVtb3ZlX2ZpbGUoZGV2LCAmZGV2dF9hdHRyKTsKQEAgLTExMDgsMTQgKzEwOTcsNyBAQAogc3RhdGljIHN0cnVjdCBkZXZpY2UgKm5leHRfZGV2aWNlKHN0cnVjdCBrbGlzdF9pdGVyICppKQogewogCXN0cnVjdCBrbGlzdF9ub2RlICpuID0ga2xpc3RfbmV4dChpKTsKLQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBOVUxMOwotCXN0cnVjdCBkZXZpY2VfcHJpdmF0ZSAqcDsKLQotCWlmIChuKSB7Ci0JCXAgPSB0b19kZXZpY2VfcHJpdmF0ZV9wYXJlbnQobik7Ci0JCWRldiA9IHAtPmRldmljZTsKLQl9Ci0JcmV0dXJuIGRldjsKKwlyZXR1cm4gbiA/IGNvbnRhaW5lcl9vZihuLCBzdHJ1Y3QgZGV2aWNlLCBrbm9kZV9wYXJlbnQpIDogTlVMTDsKIH0KIAogLyoqCkBAIC0xMTM3LDcgKzExMTksNyBAQAogCXN0cnVjdCBkZXZpY2UgKmNoaWxkOwogCWludCBlcnJvciA9IDA7CiAKLQlrbGlzdF9pdGVyX2luaXQoJnBhcmVudC0+cC0+a2xpc3RfY2hpbGRyZW4sICZpKTsKKwlrbGlzdF9pdGVyX2luaXQoJnBhcmVudC0+a2xpc3RfY2hpbGRyZW4sICZpKTsKIAl3aGlsZSAoKGNoaWxkID0gbmV4dF9kZXZpY2UoJmkpKSAmJiAhZXJyb3IpCiAJCWVycm9yID0gZm4oY2hpbGQsIGRhdGEpOwogCWtsaXN0X2l0ZXJfZXhpdCgmaSk7CkBAIC0xMTY4LDcgKzExNTAsNyBAQAogCWlmICghcGFyZW50KQogCQlyZXR1cm4gTlVMTDsKIAotCWtsaXN0X2l0ZXJfaW5pdCgmcGFyZW50LT5wLT5rbGlzdF9jaGlsZHJlbiwgJmkpOworCWtsaXN0X2l0ZXJfaW5pdCgmcGFyZW50LT5rbGlzdF9jaGlsZHJlbiwgJmkpOwogCXdoaWxlICgoY2hpbGQgPSBuZXh0X2RldmljZSgmaSkpKQogCQlpZiAobWF0Y2goY2hpbGQsIGRhdGEpICYmIGdldF9kZXZpY2UoY2hpbGQpKQogCQkJYnJlYWs7CkBAIC0xNTgyLDEwICsxNTY0LDkgQEAKIAlvbGRfcGFyZW50ID0gZGV2LT5wYXJlbnQ7CiAJZGV2LT5wYXJlbnQgPSBuZXdfcGFyZW50OwogCWlmIChvbGRfcGFyZW50KQotCQlrbGlzdF9yZW1vdmUoJmRldi0+cC0+a25vZGVfcGFyZW50KTsKKwkJa2xpc3RfcmVtb3ZlKCZkZXYtPmtub2RlX3BhcmVudCk7CiAJaWYgKG5ld19wYXJlbnQpIHsKLQkJa2xpc3RfYWRkX3RhaWwoJmRldi0+cC0+a25vZGVfcGFyZW50LAotCQkJICAgICAgICZuZXdfcGFyZW50LT5wLT5rbGlzdF9jaGlsZHJlbik7CisJCWtsaXN0X2FkZF90YWlsKCZkZXYtPmtub2RlX3BhcmVudCwgJm5ld19wYXJlbnQtPmtsaXN0X2NoaWxkcmVuKTsKIAkJc2V0X2Rldl9ub2RlKGRldiwgZGV2X3RvX25vZGUobmV3X3BhcmVudCkpOwogCX0KIApAQCAtMTU5NywxMSArMTU3OCwxMSBAQAogCQlkZXZpY2VfbW92ZV9jbGFzc19saW5rcyhkZXYsIG5ld19wYXJlbnQsIG9sZF9wYXJlbnQpOwogCQlpZiAoIWtvYmplY3RfbW92ZSgmZGV2LT5rb2JqLCAmb2xkX3BhcmVudC0+a29iaikpIHsKIAkJCWlmIChuZXdfcGFyZW50KQotCQkJCWtsaXN0X3JlbW92ZSgmZGV2LT5wLT5rbm9kZV9wYXJlbnQpOworCQkJCWtsaXN0X3JlbW92ZSgmZGV2LT5rbm9kZV9wYXJlbnQpOwogCQkJZGV2LT5wYXJlbnQgPSBvbGRfcGFyZW50OwogCQkJaWYgKG9sZF9wYXJlbnQpIHsKLQkJCQlrbGlzdF9hZGRfdGFpbCgmZGV2LT5wLT5rbm9kZV9wYXJlbnQsCi0JCQkJCSAgICAgICAmb2xkX3BhcmVudC0+cC0+a2xpc3RfY2hpbGRyZW4pOworCQkJCWtsaXN0X2FkZF90YWlsKCZkZXYtPmtub2RlX3BhcmVudCwKKwkJCQkJICAgICAgICZvbGRfcGFyZW50LT5rbGlzdF9jaGlsZHJlbik7CiAJCQkJc2V0X2Rldl9ub2RlKGRldiwgZGV2X3RvX25vZGUob2xkX3BhcmVudCkpOwogCQkJfQogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvZGQuYyBiL2RyaXZlcnMvYmFzZS9kZC5jCmluZGV4IDZmZGFmNzYuLjMxNWJlZDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9kZC5jCisrKyBiL2RyaXZlcnMvYmFzZS9kZC5jCkBAIC0yOCw3ICsyOCw3IEBACiAKIHN0YXRpYyB2b2lkIGRyaXZlcl9ib3VuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7Ci0JaWYgKGtsaXN0X25vZGVfYXR0YWNoZWQoJmRldi0+cC0+a25vZGVfZHJpdmVyKSkgeworCWlmIChrbGlzdF9ub2RlX2F0dGFjaGVkKCZkZXYtPmtub2RlX2RyaXZlcikpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGRldmljZSAlcyBhbHJlYWR5IGJvdW5kXG4iLAogCQkJX19mdW5jX18sIGtvYmplY3RfbmFtZSgmZGV2LT5rb2JqKSk7CiAJCXJldHVybjsKQEAgLTQxLDcgKzQxLDcgQEAKIAkJYmxvY2tpbmdfbm90aWZpZXJfY2FsbF9jaGFpbigmZGV2LT5idXMtPnAtPmJ1c19ub3RpZmllciwKIAkJCQkJICAgICBCVVNfTk9USUZZX0JPVU5EX0RSSVZFUiwgZGV2KTsKIAotCWtsaXN0X2FkZF90YWlsKCZkZXYtPnAtPmtub2RlX2RyaXZlciwgJmRldi0+ZHJpdmVyLT5wLT5rbGlzdF9kZXZpY2VzKTsKKwlrbGlzdF9hZGRfdGFpbCgmZGV2LT5rbm9kZV9kcml2ZXIsICZkZXYtPmRyaXZlci0+cC0+a2xpc3RfZGV2aWNlcyk7CiB9CiAKIHN0YXRpYyBpbnQgZHJpdmVyX3N5c2ZzX2FkZChzdHJ1Y3QgZGV2aWNlICpkZXYpCkBAIC0zMTAsNyArMzEwLDcgQEAKIAkJCWRydi0+cmVtb3ZlKGRldik7CiAJCWRldnJlc19yZWxlYXNlX2FsbChkZXYpOwogCQlkZXYtPmRyaXZlciA9IE5VTEw7Ci0JCWtsaXN0X3JlbW92ZSgmZGV2LT5wLT5rbm9kZV9kcml2ZXIpOworCQlrbGlzdF9yZW1vdmUoJmRldi0+a25vZGVfZHJpdmVyKTsKIAl9CiB9CiAKQEAgLTM0MCw3ICszNDAsNiBAQAogICovCiB2b2lkIGRyaXZlcl9kZXRhY2goc3RydWN0IGRldmljZV9kcml2ZXIgKmRydikKIHsKLQlzdHJ1Y3QgZGV2aWNlX3ByaXZhdGUgKmRldl9wcnY7CiAJc3RydWN0IGRldmljZSAqZGV2OwogCiAJZm9yICg7OykgewpAQCAtMzQ5LDEwICszNDgsOCBAQAogCQkJc3Bpbl91bmxvY2soJmRydi0+cC0+a2xpc3RfZGV2aWNlcy5rX2xvY2spOwogCQkJYnJlYWs7CiAJCX0KLQkJZGV2X3BydiA9IGxpc3RfZW50cnkoZHJ2LT5wLT5rbGlzdF9kZXZpY2VzLmtfbGlzdC5wcmV2LAotCQkJCSAgICAgc3RydWN0IGRldmljZV9wcml2YXRlLAotCQkJCSAgICAga25vZGVfZHJpdmVyLm5fbm9kZSk7Ci0JCWRldiA9IGRldl9wcnYtPmRldmljZTsKKwkJZGV2ID0gbGlzdF9lbnRyeShkcnYtPnAtPmtsaXN0X2RldmljZXMua19saXN0LnByZXYsCisJCQkJc3RydWN0IGRldmljZSwga25vZGVfZHJpdmVyLm5fbm9kZSk7CiAJCWdldF9kZXZpY2UoZGV2KTsKIAkJc3Bpbl91bmxvY2soJmRydi0+cC0+a2xpc3RfZGV2aWNlcy5rX2xvY2spOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvZHJpdmVyLmMgYi9kcml2ZXJzL2Jhc2UvZHJpdmVyLmMKaW5kZXggYjc2Y2M2OS4uMWUyYmRhNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL2RyaXZlci5jCisrKyBiL2RyaXZlcnMvYmFzZS9kcml2ZXIuYwpAQCAtMTksMTQgKzE5LDcgQEAKIHN0YXRpYyBzdHJ1Y3QgZGV2aWNlICpuZXh0X2RldmljZShzdHJ1Y3Qga2xpc3RfaXRlciAqaSkKIHsKIAlzdHJ1Y3Qga2xpc3Rfbm9kZSAqbiA9IGtsaXN0X25leHQoaSk7Ci0Jc3RydWN0IGRldmljZSAqZGV2ID0gTlVMTDsKLQlzdHJ1Y3QgZGV2aWNlX3ByaXZhdGUgKmRldl9wcnY7Ci0KLQlpZiAobikgewotCQlkZXZfcHJ2ID0gdG9fZGV2aWNlX3ByaXZhdGVfZHJpdmVyKG4pOwotCQlkZXYgPSBkZXZfcHJ2LT5kZXZpY2U7Ci0JfQotCXJldHVybiBkZXY7CisJcmV0dXJuIG4gPyBjb250YWluZXJfb2Yobiwgc3RydWN0IGRldmljZSwga25vZGVfZHJpdmVyKSA6IE5VTEw7CiB9CiAKIC8qKgpAQCAtNDksNyArNDIsNyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWtsaXN0X2l0ZXJfaW5pdF9ub2RlKCZkcnYtPnAtPmtsaXN0X2RldmljZXMsICZpLAotCQkJICAgICBzdGFydCA/ICZzdGFydC0+cC0+a25vZGVfZHJpdmVyIDogTlVMTCk7CisJCQkgICAgIHN0YXJ0ID8gJnN0YXJ0LT5rbm9kZV9kcml2ZXIgOiBOVUxMKTsKIAl3aGlsZSAoKGRldiA9IG5leHRfZGV2aWNlKCZpKSkgJiYgIWVycm9yKQogCQllcnJvciA9IGZuKGRldiwgZGF0YSk7CiAJa2xpc3RfaXRlcl9leGl0KCZpKTsKQEAgLTgzLDcgKzc2LDcgQEAKIAkJcmV0dXJuIE5VTEw7CiAKIAlrbGlzdF9pdGVyX2luaXRfbm9kZSgmZHJ2LT5wLT5rbGlzdF9kZXZpY2VzLCAmaSwKLQkJCSAgICAgKHN0YXJ0ID8gJnN0YXJ0LT5wLT5rbm9kZV9kcml2ZXIgOiBOVUxMKSk7CisJCQkgICAgIChzdGFydCA/ICZzdGFydC0+a25vZGVfZHJpdmVyIDogTlVMTCkpOwogCXdoaWxlICgoZGV2ID0gbmV4dF9kZXZpY2UoJmkpKSkKIAkJaWYgKG1hdGNoKGRldiwgZGF0YSkgJiYgZ2V0X2RldmljZShkZXYpKQogCQkJYnJlYWs7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvdG9wb2xvZ3kuYyBiL2RyaXZlcnMvYmFzZS90b3BvbG9neS5jCmluZGV4IGE4YmMxY2IuLmE3NzhmYjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS90b3BvbG9neS5jCisrKyBiL2RyaXZlcnMvYmFzZS90b3BvbG9neS5jCkBAIC0yOCw2ICsyOCw3IEBACiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9jcHUuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9oYXJkaXJxLmg+CiAjaW5jbHVkZSA8bGludXgvdG9wb2xvZ3kuaD4KIAogI2RlZmluZSBkZWZpbmVfb25lX3JvKF9uYW1lKSAJCVwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svYW1pZmxvcC5jIGIvZHJpdmVycy9ibG9jay9hbWlmbG9wLmMKaW5kZXggNGIxZDRhYy4uOGRmNDM2ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9hbWlmbG9wLmMKKysrIGIvZHJpdmVycy9ibG9jay9hbWlmbG9wLmMKQEAgLTE1Niw3ICsxNTYsNyBAQAogc3RhdGljIHZvbGF0aWxlIGludCBmZGNfbmVzdGVkOwogc3RhdGljIERFQ0xBUkVfV0FJVF9RVUVVRV9IRUFEKGZkY193YWl0KTsKICAKLXN0YXRpYyBERUNMQVJFX1dBSVRfUVVFVUVfSEVBRChtb3Rvcl93YWl0KTsKK3N0YXRpYyBERUNMQVJFX0NPTVBMRVRJT04obW90b3Jfb25fY29tcGxldGlvbik7CiAKIHN0YXRpYyB2b2xhdGlsZSBpbnQgc2VsZWN0ZWQgPSAtMTsJLyogY3VycmVudGx5IHNlbGVjdGVkIGRyaXZlICovCiAKQEAgLTE4NCw4ICsxODQsNyBAQAogc3RhdGljIHVuc2lnbmVkIGNoYXIgbWZtZGVjb2RlWzEyOF07CiAKIC8qIGZsb3BweSBpbnRlcm5hbCBtaWxsaXNlY29uZCB0aW1lciBzdHVmZiAqLwotc3RhdGljIHZvbGF0aWxlIGludCBtc19idXN5ID0gLTE7Ci1zdGF0aWMgREVDTEFSRV9XQUlUX1FVRVVFX0hFQUQobXNfd2FpdCk7CitzdGF0aWMgREVDTEFSRV9DT01QTEVUSU9OKG1zX3dhaXRfY29tcGxldGlvbik7CiAjZGVmaW5lIE1TX1RJQ0tTICgoYW1pZ2FfZWNsb2NrKzUwKS8xMDAwKQogCiAvKgpAQCAtMjExLDggKzIxMCw3IEBACiAKIHN0YXRpYyBpcnFyZXR1cm5fdCBtc19pc3IoaW50IGlycSwgdm9pZCAqZHVtbXkpCiB7Ci0JbXNfYnVzeSA9IC0xOwotCXdha2VfdXAoJm1zX3dhaXQpOworCWNvbXBsZXRlKCZtc193YWl0X2NvbXBsZXRpb24pOwogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIApAQCAtMjIwLDE5ICsyMTgsMTcgQEAKICAgIEEgbW9yZSBnZW5lcmljIHJvdXRpbmUgd291bGQgZG8gYSBzY2hlZHVsZSBhIGxhIHRpbWVyLmRldmljZSAqLwogc3RhdGljIHZvaWQgbXNfZGVsYXkoaW50IG1zKQogewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IHRpY2tzOworCXN0YXRpYyBERUZJTkVfTVVURVgobXV0ZXgpOworCiAJaWYgKG1zID4gMCkgewotCQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0JCXdoaWxlIChtc19idXN5ID09IDApCi0JCQlzbGVlcF9vbigmbXNfd2FpdCk7Ci0JCW1zX2J1c3kgPSAwOwotCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJCW11dGV4X2xvY2soJm11dGV4KTsKIAkJdGlja3MgPSBNU19USUNLUyptcy0xOwogCQljaWFhLnRibG89dGlja3MlMjU2OwogCQljaWFhLnRiaGk9dGlja3MvMjU2OwogCQljaWFhLmNyYj0weDE5OyAvKmNvdW50IGVjbG9jaywgZm9yY2UgbG9hZCwgb25lLXNob290LCBzdGFydCAqLwotCQlzbGVlcF9vbigmbXNfd2FpdCk7CisJCXdhaXRfZm9yX2NvbXBsZXRpb24oJm1zX3dhaXRfY29tcGxldGlvbik7CisJCW11dGV4X3VubG9jaygmbXV0ZXgpOwogCX0KIH0KIApAQCAtMjU0LDggKzI1MCw3IEBACiAJcHJpbnRrKCJnZXRfZmRjOiBkcml2ZSAlZCAgZmRjX2J1c3kgJWQgIGZkY19uZXN0ZWQgJWRcbiIsZHJpdmUsZmRjX2J1c3ksZmRjX25lc3RlZCk7CiAjZW5kaWYKIAlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0Jd2hpbGUgKCF0cnlfZmRjKGRyaXZlKSkKLQkJc2xlZXBfb24oJmZkY193YWl0KTsKKwl3YWl0X2V2ZW50KGZkY193YWl0LCB0cnlfZmRjKGRyaXZlKSk7CiAJZmRjX2J1c3kgPSBkcml2ZTsKIAlmZGNfbmVzdGVkKys7CiAJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwpAQCAtMzMwLDcgKzMyNSw3IEBACiBzdGF0aWMgdm9pZCBtb3Rvcl9vbl9jYWxsYmFjayh1bnNpZ25lZCBsb25nIG5yKQogewogCWlmICghKGNpYWEucHJhICYgRFNLUkRZKSB8fCAtLW9uX2F0dGVtcHRzID09IDApIHsKLQkJd2FrZV91cCAoJm1vdG9yX3dhaXQpOworCQljb21wbGV0ZV9hbGwoJm1vdG9yX29uX2NvbXBsZXRpb24pOwogCX0gZWxzZSB7CiAJCW1vdG9yX29uX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgSFovMTA7CiAJCWFkZF90aW1lcigmbW90b3Jfb25fdGltZXIpOwpAQCAtMzQ3LDExICszNDIsMTIgQEAKIAkJdW5pdFtucl0ubW90b3IgPSAxOwogCQlmZF9zZWxlY3QobnIpOwogCisJCUlOSVRfQ09NUExFVElPTihtb3Rvcl9vbl9jb21wbGV0aW9uKTsKIAkJbW90b3Jfb25fdGltZXIuZGF0YSA9IG5yOwogCQltb2RfdGltZXIoJm1vdG9yX29uX3RpbWVyLCBqaWZmaWVzICsgSFovMik7CiAKIAkJb25fYXR0ZW1wdHMgPSAxMDsKLQkJc2xlZXBfb24gKCZtb3Rvcl93YWl0KTsKKwkJd2FpdF9mb3JfY29tcGxldGlvbigmbW90b3Jfb25fY29tcGxldGlvbik7CiAJCWZkX2Rlc2VsZWN0KG5yKTsKIAl9CiAKQEAgLTU4Miw4ICs1NzgsNyBAQAogewogCWRyaXZlJj0zOwogCWdldF9mZGMoZHJpdmUpOwotCXdoaWxlIChibG9ja19mbGFnKQotCQlzbGVlcF9vbigmd2FpdF9mZF9ibG9jayk7CisJd2FpdF9ldmVudCh3YWl0X2ZkX2Jsb2NrLCAhYmxvY2tfZmxhZyk7CiAJZmRfc2VsZWN0KGRyaXZlKTsKIAkvKiBzZXR1cCBhZGtjb24gYml0cyBjb3JyZWN0bHkgKi8KIAljdXN0b20uYWRrY29uID0gQURLX01TQlNZTkM7CkBAIC01OTgsOCArNTkzLDcgQEAKIAogCWJsb2NrX2ZsYWcgPSAxOwogCi0Jd2hpbGUgKGJsb2NrX2ZsYWcpCi0JCXNsZWVwX29uICgmd2FpdF9mZF9ibG9jayk7CisJd2FpdF9ldmVudCh3YWl0X2ZkX2Jsb2NrLCAhYmxvY2tfZmxhZyk7CiAKIAljdXN0b20uZHNrbGVuID0gMDsKIAlmZF9kZXNlbGVjdChkcml2ZSk7CkBAIC02MTYsOCArNjEwLDcgQEAKIAkJcmVsX2ZkYygpOwogCQlyZXR1cm4gMDsKIAl9Ci0Jd2hpbGUgKGJsb2NrX2ZsYWcpCi0JCXNsZWVwX29uKCZ3YWl0X2ZkX2Jsb2NrKTsKKwl3YWl0X2V2ZW50KHdhaXRfZmRfYmxvY2ssICFibG9ja19mbGFnKTsKIAlmZF9zZWxlY3QoZHJpdmUpOwogCS8qIGNsZWFyIGFka2NvbiBiaXRzICovCiAJY3VzdG9tLmFka2NvbiA9IEFES19QUkVDT01QMXxBREtfUFJFQ09NUDB8QURLX1dPUkRTWU5DfEFES19NU0JTWU5DOwpAQCAtMTI5NCw4ICsxMjg3LDcgQEAKIAkJCXdyaXRlcGVuZGluZyA9IDA7CiAJCQlyZXR1cm4gMDsKIAkJfQotCQl3aGlsZSAoYmxvY2tfZmxhZyA9PSAyKQotCQkJc2xlZXBfb24gKCZ3YWl0X2ZkX2Jsb2NrKTsKKwkJd2FpdF9ldmVudCh3YWl0X2ZkX2Jsb2NrLCBibG9ja19mbGFnICE9IDIpOwogCX0KIAllbHNlIHsKIAkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9uYmQuYyBiL2RyaXZlcnMvYmxvY2svbmJkLmMKaW5kZXggN2JjYzFkOC4uMzRmODBmYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9uYmQuYworKysgYi9kcml2ZXJzL2Jsb2NrL25iZC5jCkBAIC00MDYsNiArNDA2LDcgQEAKIAlyZXQgPSBzeXNmc19jcmVhdGVfZmlsZSgmZGlza190b19kZXYobG8tPmRpc2spLT5rb2JqLCAmcGlkX2F0dHIuYXR0cik7CiAJaWYgKHJldCkgewogCQlwcmludGsoS0VSTl9FUlIgIm5iZDogc3lzZnNfY3JlYXRlX2ZpbGUgZmFpbGVkISIpOworCQlsby0+cGlkID0gMDsKIAkJcmV0dXJuIHJldDsKIAl9CiAKQEAgLTQxMyw2ICs0MTQsNyBAQAogCQluYmRfZW5kX3JlcXVlc3QocmVxKTsKIAogCXN5c2ZzX3JlbW92ZV9maWxlKCZkaXNrX3RvX2Rldihsby0+ZGlzayktPmtvYmosICZwaWRfYXR0ci5hdHRyKTsKKwlsby0+cGlkID0gMDsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNjQ4LDYgKzY1MCw4IEBACiAJCXNldF9jYXBhY2l0eShsby0+ZGlzaywgbG8tPmJ5dGVzaXplID4+IDkpOwogCQlyZXR1cm4gMDsKIAljYXNlIE5CRF9ET19JVDoKKwkJaWYgKGxvLT5waWQpCisJCQlyZXR1cm4gLUVCVVNZOwogCQlpZiAoIWxvLT5maWxlKQogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCXRocmVhZCA9IGt0aHJlYWRfY3JlYXRlKG5iZF90aHJlYWQsIGxvLCBsby0+ZGlzay0+ZGlza19uYW1lKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svcHMzZGlzay5jIGIvZHJpdmVycy9ibG9jay9wczNkaXNrLmMKaW5kZXggOTM2NDY2Zi4uYmNjYzQyYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9wczNkaXNrLmMKKysrIGIvZHJpdmVycy9ibG9jay9wczNkaXNrLmMKQEAgLTE0MSw3ICsxNDEsNyBAQAogCiAJc3RhcnRfc2VjdG9yID0gcmVxLT5zZWN0b3IgKiBwcml2LT5ibG9ja2luZ19mYWN0b3I7CiAJc2VjdG9ycyA9IHJlcS0+bnJfc2VjdG9ycyAqIHByaXYtPmJsb2NraW5nX2ZhY3RvcjsKLQlkZXZfZGJnKCZkZXYtPnNiZC5jb3JlLCAiJXM6JXU6ICVzICVsdSBzZWN0b3JzIHN0YXJ0aW5nIGF0ICVsdVxuIiwKKwlkZXZfZGJnKCZkZXYtPnNiZC5jb3JlLCAiJXM6JXU6ICVzICVsbHUgc2VjdG9ycyBzdGFydGluZyBhdCAlbGx1XG4iLAogCQlfX2Z1bmNfXywgX19MSU5FX18sIG9wLCBzZWN0b3JzLCBzdGFydF9zZWN0b3IpOwogCiAJaWYgKHdyaXRlKSB7CkBAIC0xNzgsNyArMTc4LDcgQEAKIAkJCQkJICAgICAgTFYxX1NUT1JBR0VfQVRBX0hERE9VVCwgMCwgMCwgMCwKIAkJCQkJICAgICAgMCwgJmRldi0+dGFnKTsKIAlpZiAocmVzKSB7Ci0JCWRldl9lcnIoJmRldi0+c2JkLmNvcmUsICIlczoldTogc3luYyBjYWNoZSBmYWlsZWQgMHglbHhcbiIsCisJCWRldl9lcnIoJmRldi0+c2JkLmNvcmUsICIlczoldTogc3luYyBjYWNoZSBmYWlsZWQgMHglbGx4XG4iLAogCQkJX19mdW5jX18sIF9fTElORV9fLCByZXMpOwogCQllbmRfcmVxdWVzdChyZXEsIDApOwogCQlyZXR1cm4gMDsKQEAgLTIzOCwxMSArMjM4LDExIEBACiAKIAlpZiAodGFnICE9IGRldi0+dGFnKQogCQlkZXZfZXJyKCZkZXYtPnNiZC5jb3JlLAotCQkJIiVzOiV1OiB0YWcgbWlzbWF0Y2gsIGdvdCAlbHgsIGV4cGVjdGVkICVseFxuIiwKKwkJCSIlczoldTogdGFnIG1pc21hdGNoLCBnb3QgJWxseCwgZXhwZWN0ZWQgJWxseFxuIiwKIAkJCV9fZnVuY19fLCBfX0xJTkVfXywgdGFnLCBkZXYtPnRhZyk7CiAKIAlpZiAocmVzKSB7Ci0JCWRldl9lcnIoJmRldi0+c2JkLmNvcmUsICIlczoldTogcmVzPSVkIHN0YXR1cz0weCVseFxuIiwKKwkJZGV2X2VycigmZGV2LT5zYmQuY29yZSwgIiVzOiV1OiByZXM9JWQgc3RhdHVzPTB4JWxseFxuIiwKIAkJCV9fZnVuY19fLCBfX0xJTkVfXywgcmVzLCBzdGF0dXMpOwogCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CiAJfQpAQCAtMjY5LDcgKzI2OSw3IEBACiAJCW9wID0gcmVhZCA/ICJyZWFkIiA6ICJ3cml0ZSI7CiAJfQogCWlmIChzdGF0dXMpIHsKLQkJZGV2X2RiZygmZGV2LT5zYmQuY29yZSwgIiVzOiV1OiAlcyBmYWlsZWQgMHglbHhcbiIsIF9fZnVuY19fLAorCQlkZXZfZGJnKCZkZXYtPnNiZC5jb3JlLCAiJXM6JXU6ICVzIGZhaWxlZCAweCVsbHhcbiIsIF9fZnVuY19fLAogCQkJX19MSU5FX18sIG9wLCBzdGF0dXMpOwogCQllcnJvciA9IC1FSU87CiAJfSBlbHNlIHsKQEAgLTI5Nyw3ICsyOTcsNyBAQAogCiAJcmVzID0gcHMzc3Rvcl9zZW5kX2NvbW1hbmQoZGV2LCBMVjFfU1RPUkFHRV9BVEFfSERET1VULCAwLCAwLCAwLCAwKTsKIAlpZiAocmVzKSB7Ci0JCWRldl9lcnIoJmRldi0+c2JkLmNvcmUsICIlczoldTogc3luYyBjYWNoZSBmYWlsZWQgMHglbHhcbiIsCisJCWRldl9lcnIoJmRldi0+c2JkLmNvcmUsICIlczoldTogc3luYyBjYWNoZSBmYWlsZWQgMHglbGx4XG4iLAogCQkJX19mdW5jX18sIF9fTElORV9fLCByZXMpOwogCQlyZXR1cm4gLUVJTzsKIAl9CkBAIC0zODgsNyArMzg4LDcgQEAKIAkJCQkgICBzaXplb2YoYXRhX2NtbmQpLCBhdGFfY21uZC5idWZmZXIsCiAJCQkJICAgYXRhX2NtbmQuYXJnbGVuKTsKIAlpZiAocmVzKSB7Ci0JCWRldl9lcnIoJmRldi0+c2JkLmNvcmUsICIlczoldTogaWRlbnRpZnkgZGlzayBmYWlsZWQgMHglbHhcbiIsCisJCWRldl9lcnIoJmRldi0+c2JkLmNvcmUsICIlczoldTogaWRlbnRpZnkgZGlzayBmYWlsZWQgMHglbGx4XG4iLAogCQkJX19mdW5jX18sIF9fTElORV9fLCByZXMpOwogCQlyZXR1cm4gLUVJTzsKIAl9CkBAIC00MjYsNyArNDI2LDcgQEAKIAogCWlmIChkZXYtPmJsa19zaXplIDwgNTEyKSB7CiAJCWRldl9lcnIoJmRldi0+c2JkLmNvcmUsCi0JCQkiJXM6JXU6IGNhbm5vdCBoYW5kbGUgYmxvY2sgc2l6ZSAlbHVcbiIsIF9fZnVuY19fLAorCQkJIiVzOiV1OiBjYW5ub3QgaGFuZGxlIGJsb2NrIHNpemUgJWxsdVxuIiwgX19mdW5jX18sCiAJCQlfX0xJTkVfXywgZGV2LT5ibGtfc2l6ZSk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KQEAgLTUxMiw3ICs1MTIsNyBAQAogCQkgICAgIGRldi0+cmVnaW9uc1tkZXYtPnJlZ2lvbl9pZHhdLnNpemUqcHJpdi0+YmxvY2tpbmdfZmFjdG9yKTsKIAogCWRldl9pbmZvKCZkZXYtPnNiZC5jb3JlLAotCQkgIiVzIGlzIGEgJXMgKCVsdSBNaUIgdG90YWwsICVsdSBNaUIgZm9yIE90aGVyT1MpXG4iLAorCQkgIiVzIGlzIGEgJXMgKCVsbHUgTWlCIHRvdGFsLCAlbHUgTWlCIGZvciBPdGhlck9TKVxuIiwKIAkJIGdlbmRpc2stPmRpc2tfbmFtZSwgcHJpdi0+bW9kZWwsIHByaXYtPnJhd19jYXBhY2l0eSA+PiAxMSwKIAkJIGdldF9jYXBhY2l0eShnZW5kaXNrKSA+PiAxMSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svc3VudmRjLmMgYi9kcml2ZXJzL2Jsb2NrL3N1bnZkYy5jCmluZGV4IDk1M2MwYjguLjU4NjFlMzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svc3VudmRjLmMKKysrIGIvZHJpdmVycy9ibG9jay9zdW52ZGMuYwpAQCAtMTUzLDcgKzE1Myw3IEBACiAJcGt0LnZkaXNrX2Jsb2NrX3NpemUgPSBwb3J0LT52ZGlza19ibG9ja19zaXplOwogCXBrdC5tYXhfeGZlcl9zaXplID0gcG9ydC0+bWF4X3hmZXJfc2l6ZTsKIAotCXZpb2RiZyhIUywgIlNFTkQgQVRUUiB4ZmVyX21vZGVbMHgleF0gYmxrc3pbJXVdIG1heF94ZmVyWyVsdV1cbiIsCisJdmlvZGJnKEhTLCAiU0VORCBBVFRSIHhmZXJfbW9kZVsweCV4XSBibGtzelsldV0gbWF4X3hmZXJbJWxsdV1cbiIsCiAJICAgICAgIHBrdC54ZmVyX21vZGUsIHBrdC52ZGlza19ibG9ja19zaXplLCBwa3QubWF4X3hmZXJfc2l6ZSk7CiAKIAlyZXR1cm4gdmlvX2xkY19zZW5kKCZwb3J0LT52aW8sICZwa3QsIHNpemVvZihwa3QpKTsKQEAgLTE2NCw4ICsxNjQsOCBAQAogCXN0cnVjdCB2ZGNfcG9ydCAqcG9ydCA9IHRvX3ZkY19wb3J0KHZpbyk7CiAJc3RydWN0IHZpb19kaXNrX2F0dHJfaW5mbyAqcGt0ID0gYXJnOwogCi0JdmlvZGJnKEhTLCAiR09UIEFUVFIgc3R5cGVbMHgleF0gb3BzWyVseF0gZGlza19zaXplWyVsdV0gZGlza190eXBlWyV4XSAiCi0JICAgICAgICJ4ZmVyX21vZGVbMHgleF0gYmxrc3pbJXVdIG1heF94ZmVyWyVsdV1cbiIsCisJdmlvZGJnKEhTLCAiR09UIEFUVFIgc3R5cGVbMHgleF0gb3BzWyVsbHhdIGRpc2tfc2l6ZVslbGx1XSBkaXNrX3R5cGVbJXhdICIKKwkgICAgICAgInhmZXJfbW9kZVsweCV4XSBibGtzelsldV0gbWF4X3hmZXJbJWxsdV1cbiIsCiAJICAgICAgIHBrdC0+dGFnLnN0eXBlLCBwa3QtPm9wZXJhdGlvbnMsCiAJICAgICAgIHBrdC0+dmRpc2tfc2l6ZSwgcGt0LT52ZGlza190eXBlLAogCSAgICAgICBwa3QtPnhmZXJfbW9kZSwgcGt0LT52ZGlza19ibG9ja19zaXplLApAQCAtNzUzLDcgKzc1Myw3IEBACiAKIAllcnIgPSAtRU5PREVWOwogCWlmICgodmRldi0+ZGV2X25vIDw8IFBBUlRJVElPTl9TSElGVCkgJiB+KHU2NClNSU5PUk1BU0spIHsKLQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiUG9ydCBpZCBbJWx1XSB0b28gbGFyZ2UuXG4iLAorCQlwcmludGsoS0VSTl9FUlIgUEZYICJQb3J0IGlkIFslbGx1XSB0b28gbGFyZ2UuXG4iLAogCQkgICAgICAgdmRldi0+ZGV2X25vKTsKIAkJZ290byBlcnJfb3V0X3JlbGVhc2VfbWRlc2M7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay91Yi5jIGIvZHJpdmVycy9ibG9jay91Yi5jCmluZGV4IDA0OGQ3MWQuLjEyZmI4MTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svdWIuYworKysgYi9kcml2ZXJzL2Jsb2NrL3ViLmMKQEAgLTE1NzksNyArMTU3OSw3IEBACiAJc3RydWN0IHViX2RldiAqc2MgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IHViX2RldiwgcmVzZXRfd29yayk7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzdHJ1Y3QgdWJfbHVuICpsdW47Ci0JaW50IGxrciwgcmM7CisJaW50IHJjOwogCiAJaWYgKCFzYy0+cmVzZXQpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFJ1bm5pbmcgcmVzZXQgdW5yZXF1ZXN0ZWRcbiIsCkBAIC0xNTk3LDEwICsxNTk3LDExIEBACiAJfSBlbHNlIGlmIChzYy0+ZGV2LT5hY3Rjb25maWctPmRlc2MuYk51bUludGVyZmFjZXMgIT0gMSkgewogCQk7CiAJfSBlbHNlIHsKLQkJaWYgKChsa3IgPSB1c2JfbG9ja19kZXZpY2VfZm9yX3Jlc2V0KHNjLT5kZXYsIHNjLT5pbnRmKSkgPCAwKSB7CisJCXJjID0gdXNiX2xvY2tfZGV2aWNlX2Zvcl9yZXNldChzYy0+ZGV2LCBzYy0+aW50Zik7CisJCWlmIChyYyA8IDApIHsKIAkJCXByaW50ayhLRVJOX05PVElDRQogCQkJICAgICIlczogdXNiX2xvY2tfZGV2aWNlX2Zvcl9yZXNldCBmYWlsZWQgKCVkKVxuIiwKLQkJCSAgICBzYy0+bmFtZSwgbGtyKTsKKwkJCSAgICBzYy0+bmFtZSwgcmMpOwogCQl9IGVsc2UgewogCQkJcmMgPSB1c2JfcmVzZXRfZGV2aWNlKHNjLT5kZXYpOwogCQkJaWYgKHJjIDwgMCkgewpAQCAtMTYwOCw5ICsxNjA5LDcgQEAKIAkJCQkgICAgInVzYl9sb2NrX2RldmljZV9mb3JfcmVzZXQgZmFpbGVkICglZClcbiIsCiAJCQkJICAgIHNjLT5uYW1lLCByYyk7CiAJCQl9Ci0KLQkJCWlmIChsa3IpCi0JCQkJdXNiX3VubG9ja19kZXZpY2Uoc2MtPmRldik7CisJCQl1c2JfdW5sb2NrX2RldmljZShzYy0+ZGV2KTsKIAkJfQogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay94c3lzYWNlLmMgYi9kcml2ZXJzL2Jsb2NrL3hzeXNhY2UuYwppbmRleCAyOWUxZGZhLi4zODFkNjg2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL3hzeXNhY2UuYworKysgYi9kcml2ZXJzL2Jsb2NrL3hzeXNhY2UuYwpAQCAtMTIwNiw2ICsxMjA2LDcgQEAKIAl7IC5jb21wYXRpYmxlID0gInhsbngsb3BiLXN5c2FjZS0xLjAwLmIiLCB9LAogCXsgLmNvbXBhdGlibGUgPSAieGxueCxvcGItc3lzYWNlLTEuMDAuYyIsIH0sCiAJeyAuY29tcGF0aWJsZSA9ICJ4bG54LHhwcy1zeXNhY2UtMS4wMC5hIiwgfSwKKwl7IC5jb21wYXRpYmxlID0gInhsbngsc3lzYWNlIiwgfSwKIAl7fSwKIH07CiBNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBhY2Vfb2ZfbWF0Y2gpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL0tjb25maWcgYi9kcml2ZXJzL2NoYXIvS2NvbmZpZwppbmRleCAzNTkxNGI2Li5mNWJlODA4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvS2NvbmZpZworKysgYi9kcml2ZXJzL2NoYXIvS2NvbmZpZwpAQCAtNjE2LDYgKzYxNiw3IEBACiAJZGVmYXVsdCB5CiAJc2VsZWN0IEhWQ19EUklWRVIKIAlzZWxlY3QgSFZDX0lSUQorCXNlbGVjdCBWSU9QQVRICiAJaGVscAogCSAgaVNlcmllcyBtYWNoaW5lcyBzdXBwb3J0IGEgaHlwZXJ2aXNvciB2aXJ0dWFsIGNvbnNvbGUuCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9hbWlzZXJpYWwuYyBiL2RyaXZlcnMvY2hhci9hbWlzZXJpYWwuYwppbmRleCA0ZTBjZmRlLi5hNTg4NjllIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvYW1pc2VyaWFsLmMKKysrIGIvZHJpdmVycy9jaGFyL2FtaXNlcmlhbC5jCkBAIC0xOTYzLDYgKzE5NjMsNyBAQAogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJc3RydWN0IHNlcmlhbF9zdGF0ZSAqIHN0YXRlOworCWludCBlcnJvcjsKIAogCWlmICghTUFDSF9JU19BTUlHQSB8fCAhQU1JR0FIV19QUkVTRU5UKEFNSV9TRVJJQUwpKQogCQlyZXR1cm4gLUVOT0RFVjsKQEAgLTE5NzUsOCArMTk3NiwxMSBAQAogCSAqICBXZSByZXF1ZXN0IFNFUkRBVCBhbmQgU0VSUEVSIG9ubHksIGJlY2F1c2UgdGhlIHNlcmlhbCByZWdpc3RlcnMgYXJlCiAJICogIHRvbyBzcHJlYWRlZCBvdmVyIHRoZSBjdXN0b20gcmVnaXN0ZXIgc3BhY2UKIAkgKi8KLQlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihDVVNUT01fUEhZU0FERFIrMHgzMCwgNCwgImFtaXNlcmlhbCBbUGF1bGFdIikpCi0JCXJldHVybiAtRUJVU1k7CisJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24oQ1VTVE9NX1BIWVNBRERSKzB4MzAsIDQsCisJCQkJImFtaXNlcmlhbCBbUGF1bGFdIikpIHsKKwkJZXJyb3IgPSAtRUJVU1k7CisJCWdvdG8gZmFpbF9wdXRfdHR5X2RyaXZlcjsKKwl9CiAKIAlJUlFfcG9ydHMgPSBOVUxMOwogCkBAIC0xOTk3LDggKzIwMDEsOSBAQAogCXNlcmlhbF9kcml2ZXItPmZsYWdzID0gVFRZX0RSSVZFUl9SRUFMX1JBVzsKIAl0dHlfc2V0X29wZXJhdGlvbnMoc2VyaWFsX2RyaXZlciwgJnNlcmlhbF9vcHMpOwogCi0JaWYgKHR0eV9yZWdpc3Rlcl9kcml2ZXIoc2VyaWFsX2RyaXZlcikpCi0JCXBhbmljKCJDb3VsZG4ndCByZWdpc3RlciBzZXJpYWwgZHJpdmVyXG4iKTsKKwllcnJvciA9IHR0eV9yZWdpc3Rlcl9kcml2ZXIoc2VyaWFsX2RyaXZlcik7CisJaWYgKGVycm9yKQorCQlnb3RvIGZhaWxfcmVsZWFzZV9tZW1fcmVnaW9uOwogCiAJc3RhdGUgPSByc190YWJsZTsKIAlzdGF0ZS0+bWFnaWMgPSBTU1RBVEVfTUFHSUM7CkBAIC0yMDI0LDggKzIwMjksMTQgQEAKIAlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CiAKIAkvKiBzZXQgSVNScywgYW5kIHRoZW4gZGlzYWJsZSB0aGUgcnggaW50ZXJydXB0cyAqLwotCXJlcXVlc3RfaXJxKElSUV9BTUlHQV9UQkUsIHNlcl90eF9pbnQsIDAsICJzZXJpYWwgVFgiLCBzdGF0ZSk7Ci0JcmVxdWVzdF9pcnEoSVJRX0FNSUdBX1JCRiwgc2VyX3J4X2ludCwgSVJRRl9ESVNBQkxFRCwgInNlcmlhbCBSWCIsIHN0YXRlKTsKKwllcnJvciA9IHJlcXVlc3RfaXJxKElSUV9BTUlHQV9UQkUsIHNlcl90eF9pbnQsIDAsICJzZXJpYWwgVFgiLCBzdGF0ZSk7CisJaWYgKGVycm9yKQorCQlnb3RvIGZhaWxfdW5yZWdpc3RlcjsKKworCWVycm9yID0gcmVxdWVzdF9pcnEoSVJRX0FNSUdBX1JCRiwgc2VyX3J4X2ludCwgSVJRRl9ESVNBQkxFRCwKKwkJCSAgICAic2VyaWFsIFJYIiwgc3RhdGUpOworCWlmIChlcnJvcikKKwkJZ290byBmYWlsX2ZyZWVfaXJxOwogCiAJLyogdHVybiBvZmYgUnggYW5kIFR4IGludGVycnVwdHMgKi8KIAljdXN0b20uaW50ZW5hID0gSUZfUkJGIHwgSUZfVEJFOwpAQCAtMjA0NSw2ICsyMDU2LDE2IEBACiAJY2lhYi5kZHJhICY9IH4oU0VSX0RDRCB8IFNFUl9DVFMgfCBTRVJfRFNSKTsgIC8qIGlucHV0cyAqLwogCiAJcmV0dXJuIDA7CisKK2ZhaWxfZnJlZV9pcnE6CisJZnJlZV9pcnEoSVJRX0FNSUdBX1RCRSwgc3RhdGUpOworZmFpbF91bnJlZ2lzdGVyOgorCXR0eV91bnJlZ2lzdGVyX2RyaXZlcihzZXJpYWxfZHJpdmVyKTsKK2ZhaWxfcmVsZWFzZV9tZW1fcmVnaW9uOgorCXJlbGVhc2VfbWVtX3JlZ2lvbihDVVNUT01fUEhZU0FERFIrMHgzMCwgNCk7CitmYWlsX3B1dF90dHlfZHJpdmVyOgorCXB1dF90dHlfZHJpdmVyKHNlcmlhbF9kcml2ZXIpOworCXJldHVybiBlcnJvcjsKIH0KIAogc3RhdGljIF9fZXhpdCB2b2lkIHJzX2V4aXQodm9pZCkgCkBAIC0yMDY0LDYgKzIwODUsOSBAQAogCSAga2ZyZWUoaW5mbyk7CiAJfQogCisJZnJlZV9pcnEoSVJRX0FNSUdBX1RCRSwgcnNfdGFibGUpOworCWZyZWVfaXJxKElSUV9BTUlHQV9SQkYsIHJzX3RhYmxlKTsKKwogCXJlbGVhc2VfbWVtX3JlZ2lvbihDVVNUT01fUEhZU0FERFIrMHgzMCwgNCk7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9ic3IuYyBiL2RyaXZlcnMvY2hhci9ic3IuYwppbmRleCA5NzdkZmIxLi5mNjA5NGFlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvYnNyLmMKKysrIGIvZHJpdmVycy9jaGFyL2Jzci5jCkBAIC0xMDMsNyArMTAzLDcgQEAKIGJzcl9sZW5fc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCiB7CiAJc3RydWN0IGJzcl9kZXYgKmJzcl9kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQlyZXR1cm4gc3ByaW50ZihidWYsICIlbHVcbiIsIGJzcl9kZXYtPmJzcl9sZW4pOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVsbHVcbiIsIGJzcl9kZXYtPmJzcl9sZW4pOwogfQogCiBzdGF0aWMgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgYnNyX2Rldl9hdHRyc1tdID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2VwY2EuYyBiL2RyaXZlcnMvY2hhci9lcGNhLmMKaW5kZXggMzlhZDgyMC4uYWY3YzEzYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2VwY2EuYworKysgYi9kcml2ZXJzL2NoYXIvZXBjYS5jCkBAIC03NjksNyArNzY5LDcgQEAKIAkvKiBDaGVjayBzdGF0dXMgb2YgYm9hcmQgY29uZmlndXJlZCBpbiBzeXN0ZW0uICAqLwogCiAJLyoKLQkgKiBJIGNoZWNrIHRvIHNlZSBpZiB0aGUgZXBjYV9zZXR1cCByb3V0aW5lIGRldGVjdGVkIGFuIHVzZXIgZXJyb3IuIEl0CisJICogSSBjaGVjayB0byBzZWUgaWYgdGhlIGVwY2Ffc2V0dXAgcm91dGluZSBkZXRlY3RlZCBhIHVzZXIgZXJyb3IuIEl0CiAJICogbWlnaHQgYmUgYmV0dGVyIHRvIHB1dCB0aGlzIGluIHBjX2luaXQsIGJ1dCBmb3IgdGhlIG1vbWVudCBpdCBnb2VzCiAJICogaGVyZS4KIAkgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9odmNfYmVhdC5jIGIvZHJpdmVycy9jaGFyL2h2Y19iZWF0LmMKaW5kZXggOTFjZGIzNS4uMGFmYzhiOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2h2Y19iZWF0LmMKKysrIGIvZHJpdmVycy9jaGFyL2h2Y19iZWF0LmMKQEAgLTQ0LDcgKzQ0LDcgQEAKIAlzdGF0aWMgdW5zaWduZWQgY2hhciBxW3NpemVvZih1bnNpZ25lZCBsb25nKSAqIDJdCiAJCV9fYXR0cmlidXRlX18oKGFsaWduZWQoc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKSkpOwogCXN0YXRpYyBpbnQgcWxlbiA9IDA7Ci0JdW5zaWduZWQgbG9uZyBnb3Q7CisJdTY0IGdvdDsKIAogYWdhaW46CiAJaWYgKHFsZW4pIHsKQEAgLTYzLDcgKzYzLDcgQEAKIAkJfQogCX0KIAlpZiAoYmVhdF9nZXRfdGVybV9jaGFyKHZ0ZXJtbm8sICZnb3QsCi0JCSgodW5zaWduZWQgbG9uZyAqKXEpLCAoKHVuc2lnbmVkIGxvbmcgKilxKSArIDEpID09IDApIHsKKwkJKCh1NjQgKilxKSwgKCh1NjQgKilxKSArIDEpID09IDApIHsKIAkJcWxlbiA9IGdvdDsKIAkJZ290byBhZ2FpbjsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvaHZjX2NvbnNvbGUuYyBiL2RyaXZlcnMvY2hhci9odmNfY29uc29sZS5jCmluZGV4IDVhOGE0YzIuLjk0ZTdlM2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9odmNfY29uc29sZS5jCisrKyBiL2RyaXZlcnMvY2hhci9odmNfY29uc29sZS5jCkBAIC0zMTgsNyArMzE4LDYgQEAKIAl9IC8qIGVsc2UgY291bnQgPT0gMCAqLwogCiAJdHR5LT5kcml2ZXJfZGF0YSA9IGhwOwotCXR0eS0+bG93X2xhdGVuY3kgPSAxOyAvKiBNYWtlcyBmbHVzaGVzIHRvIGxkaXNjIHN5bmNocm9ub3VzLiAqLwogCiAJaHAtPnR0eSA9IHR0eTsKIApAQCAtNzY0LDEzICs3NjMsMTEgQEAKIAkJCXJldHVybiBFUlJfUFRSKGVycik7CiAJfQogCi0JaHAgPSBrbWFsbG9jKEFMSUdOKHNpemVvZigqaHApLCBzaXplb2YobG9uZykpICsgb3V0YnVmX3NpemUsCisJaHAgPSBremFsbG9jKEFMSUdOKHNpemVvZigqaHApLCBzaXplb2YobG9uZykpICsgb3V0YnVmX3NpemUsCiAJCQlHRlBfS0VSTkVMKTsKIAlpZiAoIWhwKQogCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKIAotCW1lbXNldChocCwgMHgwMCwgc2l6ZW9mKCpocCkpOwotCiAJaHAtPnZ0ZXJtbm8gPSB2dGVybW5vOwogCWhwLT5kYXRhID0gZGF0YTsKIAlocC0+b3BzID0gb3BzOwpAQCAtODc2LDggKzg3MywxMSBAQAogCQlnb3RvIHN0b3BfdGhyZWFkOwogCX0KIAotCS8qIEZJWE1FOiBUaGlzIG1iKCkgc2VlbXMgY29tcGxldGVseSByYW5kb20uICBSZW1vdmUgaXQuICovCi0JbWIoKTsKKwkvKgorCSAqIE1ha2Ugc3VyZSB0dHkgaXMgZnVsbHkgcmVnaXN0ZXJlZCBiZWZvcmUgYWxsb3dpbmcgaXQgdG8gYmUKKwkgKiBmb3VuZCBieSBodmNfY29uc29sZV9kZXZpY2UuCisJICovCisJc21wX21iKCk7CiAJaHZjX2RyaXZlciA9IGRydjsKIAlyZXR1cm4gMDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2h2Y19pcnEuYyBiL2RyaXZlcnMvY2hhci9odmNfaXJxLmMKaW5kZXggZDA5ZTU2OC4uMjYyM2UxNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2h2Y19pcnEuYworKysgYi9kcml2ZXJzL2NoYXIvaHZjX2lycS5jCkBAIC0zNyw3ICszNyw3IEBACiAKIHZvaWQgbm90aWZpZXJfZGVsX2lycShzdHJ1Y3QgaHZjX3N0cnVjdCAqaHAsIGludCBpcnEpCiB7Ci0JaWYgKCFpcnEpCisJaWYgKCFocC0+aXJxX3JlcXVlc3RlZCkKIAkJcmV0dXJuOwogCWZyZWVfaXJxKGlycSwgaHApOwogCWhwLT5pcnFfcmVxdWVzdGVkID0gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9odmNfaXVjdi5jIGIvZHJpdmVycy9jaGFyL2h2Y19pdWN2LmMKaW5kZXggNWVhN2Q3Ny4uYTUzNDk2OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2h2Y19pdWN2LmMKKysrIGIvZHJpdmVycy9jaGFyL2h2Y19pdWN2LmMKQEAgLTEsMjYgKzEsMzAgQEAKIC8qCi0gKiBodmNfaXVjdi5jIC0gei9WTSBJVUNWIGJhY2stZW5kIGZvciB0aGUgSHlwZXJ2aXNvciBDb25zb2xlIChIVkMpCisgKiBodmNfaXVjdi5jIC0gei9WTSBJVUNWIGh5cGVydmlzb3IgY29uc29sZSAoSFZDKSBkZXZpY2UgZHJpdmVyCiAgKgotICogVGhpcyBiYWNrLWVuZCBmb3IgSFZDIHByb3ZpZGVzIHRlcm1pbmFsIGFjY2VzcyB2aWEKKyAqIFRoaXMgSFZDIGRldmljZSBkcml2ZXIgcHJvdmlkZXMgdGVybWluYWwgYWNjZXNzIHVzaW5nCiAgKiB6L1ZNIElVQ1YgY29tbXVuaWNhdGlvbiBwYXRocy4KICAqCi0gKiBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDguCisgKiBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDgKICAqCiAgKiBBdXRob3Iocyk6CUhlbmRyaWsgQnJ1ZWNrbmVyIDxicnVlY2tuZXJAbGludXgudm5ldC5pYm0uY29tPgogICovCiAjZGVmaW5lIEtNU0dfQ09NUE9ORU5UCQkiaHZjX2l1Y3YiCisjZGVmaW5lIHByX2ZtdChmbXQpCQlLTVNHX0NPTVBPTkVOVCAiOiAiIGZtdAogCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxhc20vZWJjZGljLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvbWVtcG9vbC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgorI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KICNpbmNsdWRlIDxuZXQvaXVjdi9pdWN2Lmg+CiAKICNpbmNsdWRlICJodmNfY29uc29sZS5oIgogCiAKLS8qIEhWQyBiYWNrZW5kIGZvciB6L1ZNIElVQ1YgKi8KKy8qIEdlbmVyYWwgZGV2aWNlIGRyaXZlciBzZXR0aW5ncyAqLwogI2RlZmluZSBIVkNfSVVDVl9NQUdJQwkJMHhjOWU0YzNlNQogI2RlZmluZSBNQVhfSFZDX0lVQ1ZfTElORVMJSFZDX0FMTE9DX1RUWV9BREFQVEVSUwogI2RlZmluZSBNRU1QT09MX01JTl9OUgkJKFBBR0VfU0laRSAvIHNpemVvZihzdHJ1Y3QgaXVjdl90dHlfYnVmZmVyKS80KQpAQCAtMzMsMTQgKzM3LDE0IEBACiAjZGVmaW5lIE1TR19UWVBFX1dJTlNJWkUJMHgwOAkvKiBUZXJtaW5hbCB3aW5kb3cgc2l6ZSB1cGRhdGUgKi8KICNkZWZpbmUgTVNHX1RZUEVfREFUQQkJMHgxMAkvKiBUZXJtaW5hbCBkYXRhICovCiAKLSNkZWZpbmUgTVNHX1NJWkUocykJCSgocykgKyBvZmZzZXRvZihzdHJ1Y3QgaXVjdl90dHlfbXNnLCBkYXRhKSkKIHN0cnVjdCBpdWN2X3R0eV9tc2cgewogCXU4CXZlcnNpb247CQkvKiBNZXNzYWdlIHZlcnNpb24gKi8KIAl1OAl0eXBlOwkJCS8qIE1lc3NhZ2UgdHlwZSAqLwotI2RlZmluZSBNU0dfTUFYX0RBVEFMRU4JCSh+KHUxNikwKQorI2RlZmluZSBNU0dfTUFYX0RBVEFMRU4JCSgodTE2KSh+MCkpCiAJdTE2CWRhdGFsZW47CQkvKiBQYXlsb2FkIGxlbmd0aCAqLwogCXU4CWRhdGFbXTsJCQkvKiBQYXlsb2FkIGJ1ZmZlciAqLwogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKyNkZWZpbmUgTVNHX1NJWkUocykJCSgocykgKyBvZmZzZXRvZihzdHJ1Y3QgaXVjdl90dHlfbXNnLCBkYXRhKSkKIAogZW51bSBpdWN2X3N0YXRlX3QgewogCUlVQ1ZfRElTQ09OTgk9IDAsCkBAIC01NCwxOSArNTgsMjYgQEAKIH07CiAKIHN0cnVjdCBodmNfaXVjdl9wcml2YXRlIHsKLQlzdHJ1Y3QgaHZjX3N0cnVjdAkqaHZjOyAvKiBIVkMgY29uc29sZSBzdHJ1Y3QgcmVmZXJlbmNlICovCisJc3RydWN0IGh2Y19zdHJ1Y3QJKmh2YzsJCS8qIEhWQyBzdHJ1Y3QgcmVmZXJlbmNlICovCiAJdTgJCQlzcnZfbmFtZVs4XTsJLyogSVVDViBzZXJ2aWNlIG5hbWUgKGViY2RpYykgKi8KKwl1bnNpZ25lZCBjaGFyCQlpc19jb25zb2xlOwkvKiBMaW51eCBjb25zb2xlIHVzYWdlIGZsYWcgKi8KIAllbnVtIGl1Y3Zfc3RhdGVfdAlpdWN2X3N0YXRlOwkvKiBJVUNWIGNvbm5lY3Rpb24gc3RhdHVzICovCiAJZW51bSB0dHlfc3RhdGVfdAl0dHlfc3RhdGU7CS8qIFRUWSBzdGF0dXMgKi8KIAlzdHJ1Y3QgaXVjdl9wYXRoCSpwYXRoOwkJLyogSVVDViBwYXRoIHBvaW50ZXIgKi8KIAlzcGlubG9ja190CQlsb2NrOwkJLyogaHZjX2l1Y3ZfcHJpdmF0ZSBsb2NrICovCisjZGVmaW5lIFNOREJVRl9TSVpFCQkoUEFHRV9TSVpFKQkvKiBtdXN0IGJlIDwgTVNHX01BWF9EQVRBTEVOICovCisJdm9pZAkJCSpzbmRidWY7CS8qIHNlbmQgYnVmZmVyCQkgICovCisJc2l6ZV90CQkJc25kYnVmX2xlbjsJLyogbGVuZ3RoIG9mIHNlbmQgYnVmZmVyICAqLworI2RlZmluZSBRVUVVRV9TTkRCVUZfREVMQVkJKEhaIC8gMjUpCisJc3RydWN0IGRlbGF5ZWRfd29yawlzbmRidWZfd29yazsJLyogd29yazogc2VuZCBpdWN2IG1zZyhzKSAqLworCXdhaXRfcXVldWVfaGVhZF90CXNuZGJ1Zl93YWl0cTsJLyogd2FpdCBmb3Igc2VuZCBjb21wbGV0aW9uICovCiAJc3RydWN0IGxpc3RfaGVhZAl0dHlfb3V0cXVldWU7CS8qIG91dGdvaW5nIElVQ1YgbWVzc2FnZXMgKi8KIAlzdHJ1Y3QgbGlzdF9oZWFkCXR0eV9pbnF1ZXVlOwkvKiBpbmNvbWluZyBJVUNWIG1lc3NhZ2VzICovCiB9OwogCiBzdHJ1Y3QgaXVjdl90dHlfYnVmZmVyIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkCWxpc3Q7CS8qIGxpc3QgcG9pbnRlciAqLwotCXN0cnVjdCBpdWN2X21lc3NhZ2UJbXNnOwkvKiBzdG9yZSBhbiBpbmNvbWluZyBJVUNWIG1lc3NhZ2UgKi8KKwlzdHJ1Y3QgaXVjdl9tZXNzYWdlCW1zZzsJLyogc3RvcmUgYW4gSVVDViBtZXNzYWdlICovCiAJc2l6ZV90CQkJb2Zmc2V0OwkvKiBkYXRhIGJ1ZmZlciBvZmZzZXQgKi8KIAlzdHJ1Y3QgaXVjdl90dHlfbXNnCSptYnVmOwkvKiBidWZmZXIgdG8gc3RvcmUgaW5wdXQvb3V0cHV0IGRhdGEgKi8KIH07CkBAIC03OCwxMSArODksMTIgQEAKIHN0YXRpYyB2b2lkIGh2Y19pdWN2X21zZ19jb21wbGV0ZShzdHJ1Y3QgaXVjdl9wYXRoICosIHN0cnVjdCBpdWN2X21lc3NhZ2UgKik7CiAKIAotLyogS2VybmVsIG1vZHVsZSBwYXJhbWV0ZXJzICovCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBodmNfaXVjdl9kZXZpY2VzOworLyogS2VybmVsIG1vZHVsZSBwYXJhbWV0ZXI6IHVzZSBvbmUgdGVybWluYWwgZGV2aWNlIGFzIGRlZmF1bHQgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIGh2Y19pdWN2X2RldmljZXMgPSAxOwogCiAvKiBBcnJheSBvZiBhbGxvY2F0ZWQgaHZjIGl1Y3YgdHR5IGxpbmVzLi4uICovCiBzdGF0aWMgc3RydWN0IGh2Y19pdWN2X3ByaXZhdGUgKmh2Y19pdWN2X3RhYmxlW01BWF9IVkNfSVVDVl9MSU5FU107CisjZGVmaW5lIElVQ1ZfSFZDX0NPTl9JRFgJKDApCiAKIC8qIEttZW0gY2FjaGUgYW5kIG1lbXBvb2wgZm9yIGl1Y3ZfdHR5X2J1ZmZlciBlbGVtZW50cyAqLwogc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICpodmNfaXVjdl9idWZmZXJfY2FjaGU7CkBAIC0xMTIsNyArMTI0LDcgQEAKIH0KIAogLyoqCi0gKiBhbGxvY190dHlfYnVmZmVyKCkgLSBSZXR1cm5zIGEgbmV3IHN0cnVjdCBpdWN2X3R0eV9idWZmZXIgZWxlbWVudC4KKyAqIGFsbG9jX3R0eV9idWZmZXIoKSAtIFJldHVybiBhIG5ldyBzdHJ1Y3QgaXVjdl90dHlfYnVmZmVyIGVsZW1lbnQuCiAgKiBAc2l6ZToJU2l6ZSBvZiB0aGUgaW50ZXJuYWwgYnVmZmVyIHVzZWQgdG8gc3RvcmUgZGF0YS4KICAqIEBmbGFnczoJTWVtb3J5IGFsbG9jYXRpb24gZmxhZ3MgcGFzc2VkIHRvIG1lbXBvb2wuCiAgKgpAQCAtMTIwLDcgKzEzMiw2IEBACiAgKiBhbGxvY2F0ZXMgYW4gaW50ZXJuYWwgZGF0YSBidWZmZXIgd2l0aCB0aGUgc3BlY2lmaWVkIHNpemUgQHNpemUuCiAgKiBOb3RlOiBUaGUgdG90YWwgbWVzc2FnZSBzaXplIGFyaXNlcyBmcm9tIHRoZSBpbnRlcm5hbCBidWZmZXIgc2l6ZSBhbmQgdGhlCiAgKgkgbWVtYmVycyBvZiB0aGUgaXVjdl90dHlfbXNnIHN0cnVjdHVyZS4KLSAqCiAgKiBUaGUgZnVuY3Rpb24gcmV0dXJucyBOVUxMIGlmIG1lbW9yeSBhbGxvY2F0aW9uIGhhcyBmYWlsZWQuCiAgKi8KIHN0YXRpYyBzdHJ1Y3QgaXVjdl90dHlfYnVmZmVyICphbGxvY190dHlfYnVmZmVyKHNpemVfdCBzaXplLCBnZnBfdCBmbGFncykKQEAgLTEzMCw3ICsxNDEsNyBAQAogCWJ1ZnAgPSBtZW1wb29sX2FsbG9jKGh2Y19pdWN2X21lbXBvb2wsIGZsYWdzKTsKIAlpZiAoIWJ1ZnApCiAJCXJldHVybiBOVUxMOwotCW1lbXNldChidWZwLCAwLCBzaXplb2Yoc3RydWN0IGl1Y3ZfdHR5X2J1ZmZlcikpOworCW1lbXNldChidWZwLCAwLCBzaXplb2YoKmJ1ZnApKTsKIAogCWlmIChzaXplID4gMCkgewogCQlidWZwLT5tc2cubGVuZ3RoID0gTVNHX1NJWkUoc2l6ZSk7CkBAIC0xNDksOSArMTYwLDYgQEAKIC8qKgogICogZGVzdHJveV90dHlfYnVmZmVyKCkgLSBkZXN0cm95IHN0cnVjdCBpdWN2X3R0eV9idWZmZXIgZWxlbWVudC4KICAqIEBidWZwOglQb2ludGVyIHRvIGEgc3RydWN0IGl1Y3ZfdHR5X2J1ZmZlciBlbGVtZW50LCBTSEFMTCBOT1QgYmUgTlVMTC4KLSAqCi0gKiBUaGUgZGVzdHJveV90dHlfYnVmZmVyKCkgZnVuY3Rpb24gZnJlZXMgdGhlIGludGVybmFsIGRhdGEgYnVmZmVyIGFuZCByZXR1cm5zCi0gKiB0aGUgc3RydWN0IGl1Y3ZfdHR5X2J1ZmZlciBlbGVtZW50IGJhY2sgdG8gdGhlIG1lbXBvb2wgZm9yIGZyZWVpbmcuCiAgKi8KIHN0YXRpYyB2b2lkIGRlc3Ryb3lfdHR5X2J1ZmZlcihzdHJ1Y3QgaXVjdl90dHlfYnVmZmVyICpidWZwKQogewpAQCAtMTYxLDExICsxNjksNyBAQAogCiAvKioKICAqIGRlc3Ryb3lfdHR5X2J1ZmZlcl9saXN0KCkgLSBjYWxsIGRlc3Ryb3lfdHR5X2J1ZmZlcigpIGZvciBlYWNoIGxpc3QgZWxlbWVudC4KLSAqIEBsaXN0OglMaXN0IGhlYWQgcG9pbnRlciB0byBhIGxpc3QgY29udGFpbmluZyBzdHJ1Y3QgaXVjdl90dHlfYnVmZmVyCi0gKgkJZWxlbWVudHMuCi0gKgotICogQ2FsbHMgZGVzdHJveV90dHlfYnVmZmVyKCkgZm9yIGVhY2ggc3RydWN0IGl1Y3ZfdHR5X2J1ZmZlciBlbGVtZW50IGluIHRoZQotICogbGlzdCBAbGlzdC4KKyAqIEBsaXN0OglMaXN0IGNvbnRhaW5pbmcgc3RydWN0IGl1Y3ZfdHR5X2J1ZmZlciBlbGVtZW50cy4KICAqLwogc3RhdGljIHZvaWQgZGVzdHJveV90dHlfYnVmZmVyX2xpc3Qoc3RydWN0IGxpc3RfaGVhZCAqbGlzdCkKIHsKQEAgLTE3OCwyNCArMTgyLDI0IEBACiB9CiAKIC8qKgotICogaHZjX2l1Y3Zfd3JpdGUoKSAtIFJlY2VpdmUgSVVDViBtZXNzYWdlIHdyaXRlIGRhdGEgdG8gSFZDIGNvbnNvbGUgYnVmZmVyLgotICogQHByaXY6CQlQb2ludGVyIHRvIGh2Y19pdWN2X3ByaXZhdGUgc3RydWN0dXJlLgotICogQGJ1ZjoJCUhWQyBjb25zb2xlIGJ1ZmZlciBmb3Igd3JpdGluZyByZWNlaXZlZCB0ZXJtaW5hbCBkYXRhLgotICogQGNvdW50OgkJSFZDIGNvbnNvbGUgYnVmZmVyIHNpemUuCisgKiBodmNfaXVjdl93cml0ZSgpIC0gUmVjZWl2ZSBJVUNWIG1lc3NhZ2UgJiB3cml0ZSBkYXRhIHRvIEhWQyBidWZmZXIuCisgKiBAcHJpdjoJCVBvaW50ZXIgdG8gc3RydWN0IGh2Y19pdWN2X3ByaXZhdGUKKyAqIEBidWY6CQlIVkMgYnVmZmVyIGZvciB3cml0aW5nIHJlY2VpdmVkIHRlcm1pbmFsIGRhdGEuCisgKiBAY291bnQ6CQlIVkMgYnVmZmVyIHNpemUuCiAgKiBAaGFzX21vcmVfZGF0YToJUG9pbnRlciB0byBhbiBpbnQgdmFyaWFibGUuCiAgKgogICogVGhlIGZ1bmN0aW9uIHBpY2tzIHVwIHBlbmRpbmcgbWVzc2FnZXMgZnJvbSB0aGUgaW5wdXQgcXVldWUgYW5kIHJlY2VpdmVzCiAgKiB0aGUgbWVzc2FnZSBkYXRhIHRoYXQgaXMgdGhlbiB3cml0dGVuIHRvIHRoZSBzcGVjaWZpZWQgYnVmZmVyIEBidWYuCi0gKiBJZiB0aGUgYnVmZmVyIHNpemUgQGNvdW50IGlzIGxlc3MgdGhhbiB0aGUgZGF0YSBtZXNzYWdlIHNpemUsIHRoZW4gdGhlCisgKiBJZiB0aGUgYnVmZmVyIHNpemUgQGNvdW50IGlzIGxlc3MgdGhhbiB0aGUgZGF0YSBtZXNzYWdlIHNpemUsIHRoZQogICogbWVzc2FnZSBpcyBrZXB0IG9uIHRoZSBpbnB1dCBxdWV1ZSBhbmQgQGhhc19tb3JlX2RhdGEgaXMgc2V0IHRvIDEuCi0gKiBJZiB0aGUgbWVzc2FnZSBkYXRhIGhhcyBiZWVuIGVudGlyZWx5IHdyaXR0ZW4sIHRoZSBtZXNzYWdlIGlzIHJlbW92ZWQgZnJvbQorICogSWYgYWxsIG1lc3NhZ2UgZGF0YSBoYXMgYmVlbiB3cml0dGVuLCB0aGUgbWVzc2FnZSBpcyByZW1vdmVkIGZyb20KICAqIHRoZSBpbnB1dCBxdWV1ZS4KICAqCiAgKiBUaGUgZnVuY3Rpb24gcmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4gdG8gdGhlIHRlcm1pbmFsLCB6ZXJvIGlmCiAgKiB0aGVyZSBhcmUgbm8gcGVuZGluZyBkYXRhIG1lc3NhZ2VzIGF2YWlsYWJsZSBvciBpZiB0aGVyZSBpcyBubyBlc3RhYmxpc2hlZAogICogSVVDViBwYXRoLgogICogSWYgdGhlIElVQ1YgcGF0aCBoYXMgYmVlbiBzZXZlcmVkLCB0aGVuIC1FUElQRSBpcyByZXR1cm5lZCB0byBjYXVzZSBhCi0gKiBoYW5nIHVwICh0aGF0IGlzIGlzc3VlZCBieSB0aGUgSFZDIGNvbnNvbGUgbGF5ZXIpLgorICogaGFuZyB1cCAodGhhdCBpcyBpc3N1ZWQgYnkgdGhlIEhWQyBsYXllcikuCiAgKi8KIHN0YXRpYyBpbnQgaHZjX2l1Y3Zfd3JpdGUoc3RydWN0IGh2Y19pdWN2X3ByaXZhdGUgKnByaXYsCiAJCQkgIGNoYXIgKmJ1ZiwgaW50IGNvdW50LCBpbnQgKmhhc19tb3JlX2RhdGEpCkBAIC0yMDQsMTIgKzIwOCwxMiBAQAogCWludCB3cml0dGVuOwogCWludCByYzsKIAotCS8qIEltbWVkaWF0ZWx5IHJldHVybiBpZiB0aGVyZSBpcyBubyBJVUNWIGNvbm5lY3Rpb24gKi8KKwkvKiBpbW1lZGlhdGVseSByZXR1cm4gaWYgdGhlcmUgaXMgbm8gSVVDViBjb25uZWN0aW9uICovCiAJaWYgKHByaXYtPml1Y3Zfc3RhdGUgPT0gSVVDVl9ESVNDT05OKQogCQlyZXR1cm4gMDsKIAotCS8qIElmIHRoZSBJVUNWIHBhdGggaGFzIGJlZW4gc2V2ZXJlZCwgcmV0dXJuIC1FUElQRSB0byBpbmZvcm0gdGhlCi0JICogaHZjIGNvbnNvbGUgbGF5ZXIgdG8gaGFuZyB1cCB0aGUgdHR5IGRldmljZS4gKi8KKwkvKiBpZiB0aGUgSVVDViBwYXRoIGhhcyBiZWVuIHNldmVyZWQsIHJldHVybiAtRVBJUEUgdG8gaW5mb3JtIHRoZQorCSAqIEhWQyBsYXllciB0byBoYW5nIHVwIHRoZSB0dHkgZGV2aWNlLiAqLwogCWlmIChwcml2LT5pdWN2X3N0YXRlID09IElVQ1ZfU0VWRVJFRCkKIAkJcmV0dXJuIC1FUElQRTsKIApAQCAtMjE3LDcgKzIyMSw3IEBACiAJaWYgKGxpc3RfZW1wdHkoJnByaXYtPnR0eV9pbnF1ZXVlKSkKIAkJcmV0dXJuIDA7CiAKLQkvKiByZWNlaXZlIGEgaXVjdiBtZXNzYWdlIGFuZCBmbGlwIGRhdGEgdG8gdGhlIHR0eSAobGRpc2MpICovCisJLyogcmVjZWl2ZSBhbiBpdWN2IG1lc3NhZ2UgYW5kIGZsaXAgZGF0YSB0byB0aGUgdHR5IChsZGlzYykgKi8KIAlyYiA9IGxpc3RfZmlyc3RfZW50cnkoJnByaXYtPnR0eV9pbnF1ZXVlLCBzdHJ1Y3QgaXVjdl90dHlfYnVmZmVyLCBsaXN0KTsKIAogCXdyaXR0ZW4gPSAwOwpAQCAtMjYwLDcgKzI2NCw3IEBACiAJY2FzZSBNU0dfVFlQRV9XSU5TSVpFOgogCQlpZiAocmItPm1idWYtPmRhdGFsZW4gIT0gc2l6ZW9mKHN0cnVjdCB3aW5zaXplKSkKIAkJCWJyZWFrOwotCQlodmNfcmVzaXplKHByaXYtPmh2YywgKigoc3RydWN0IHdpbnNpemUgKilyYi0+bWJ1Zi0+ZGF0YSkpOworCQlodmNfcmVzaXplKHByaXYtPmh2YywgKigoc3RydWN0IHdpbnNpemUgKikgcmItPm1idWYtPmRhdGEpKTsKIAkJYnJlYWs7CiAKIAljYXNlIE1TR19UWVBFX0VSUk9SOgkvKiBpZ25vcmVkIC4uLiAqLwpAQCAtMjg0LDEwICsyODgsOSBAQAogICogQGJ1ZjoJUG9pbnRlciB0byBhIGJ1ZmZlciB0byBzdG9yZSBkYXRhCiAgKiBAY291bnQ6CVNpemUgb2YgYnVmZmVyIGF2YWlsYWJsZSBmb3Igd3JpdGluZwogICoKLSAqIFRoZSBodmNfY29uc29sZSB0aHJlYWQgY2FsbHMgdGhpcyBtZXRob2QgdG8gcmVhZCBjaGFyYWN0ZXJzIGZyb20KLSAqIHRoZSB0ZXJtaW5hbCBiYWNrZW5kLiBJZiBhbiBJVUNWIGNvbW11bmljYXRpb24gcGF0aCBoYXMgYmVlbiBlc3RhYmxpc2hlZCwKLSAqIHBlbmRpbmcgSVVDViBtZXNzYWdlcyBhcmUgcmVjZWl2ZWQgYW5kIGRhdGEgaXMgY29waWVkIGludG8gYnVmZmVyIEBidWYKLSAqIHVwIHRvIEBjb3VudCBieXRlcy4KKyAqIFRoZSBIVkMgdGhyZWFkIGNhbGxzIHRoaXMgbWV0aG9kIHRvIHJlYWQgY2hhcmFjdGVycyBmcm9tIHRoZSBiYWNrLWVuZC4KKyAqIElmIGFuIElVQ1YgY29tbXVuaWNhdGlvbiBwYXRoIGhhcyBiZWVuIGVzdGFibGlzaGVkLCBwZW5kaW5nIElVQ1YgbWVzc2FnZXMKKyAqIGFyZSByZWNlaXZlZCBhbmQgZGF0YSBpcyBjb3BpZWQgaW50byBidWZmZXIgQGJ1ZiB1cCB0byBAY291bnQgYnl0ZXMuCiAgKgogICogTG9ja2luZzoJVGhlIHJvdXRpbmUgZ2V0cyBjYWxsZWQgdW5kZXIgYW4gaXJxc2F2ZSgpIHNwaW5sb2NrOyBhbmQKICAqCQl0aGUgcm91dGluZSBsb2NrcyB0aGUgc3RydWN0IGh2Y19pdWN2X3ByaXZhdGUtPmxvY2sgdG8gY2FsbApAQCAtMzE4LDY2ICszMjEsMTIyIEBACiB9CiAKIC8qKgotICogaHZjX2l1Y3Zfc2VuZCgpIC0gU2VuZCBhbiBJVUNWIG1lc3NhZ2UgY29udGFpbmluZyB0ZXJtaW5hbCBkYXRhLgorICogaHZjX2l1Y3ZfcXVldWUoKSAtIEJ1ZmZlciB0ZXJtaW5hbCBkYXRhIGZvciBzZW5kaW5nLgogICogQHByaXY6CVBvaW50ZXIgdG8gc3RydWN0IGh2Y19pdWN2X3ByaXZhdGUgaW5zdGFuY2UuCiAgKiBAYnVmOglCdWZmZXIgY29udGFpbmluZyBkYXRhIHRvIHNlbmQuCi0gKiBAc2l6ZToJU2l6ZSBvZiBidWZmZXIgYW5kIGFtb3VudCBvZiBkYXRhIHRvIHNlbmQuCisgKiBAY291bnQ6CVNpemUgb2YgYnVmZmVyIGFuZCBhbW91bnQgb2YgZGF0YSB0byBzZW5kLgogICoKLSAqIElmIGFuIElVQ1YgY29tbXVuaWNhdGlvbiBwYXRoIGlzIGVzdGFibGlzaGVkLCB0aGUgZnVuY3Rpb24gY29waWVzIHRoZSBidWZmZXIKLSAqIGRhdGEgdG8gYSBuZXdseSBhbGxvY2F0ZWQgc3RydWN0IGl1Y3ZfdHR5X2J1ZmZlciBlbGVtZW50LCBzZW5kcyB0aGUgZGF0YSBhbmQKLSAqIHB1dHMgdGhlIGVsZW1lbnQgdG8gdGhlIG91dHF1ZXVlLgorICogVGhlIGZ1bmN0aW9uIHF1ZXVlcyBkYXRhIGZvciBzZW5kaW5nLiBUbyBhY3R1YWxseSBzZW5kIHRoZSBidWZmZXJlZCBkYXRhLAorICogYSB3b3JrIHF1ZXVlIGZ1bmN0aW9uIGlzIHNjaGVkdWxlZCAod2l0aCBRVUVVRV9TTkRCVUZfREVMQVkpLgorICogVGhlIGZ1bmN0aW9uIHJldHVybnMgdGhlIG51bWJlciBvZiBkYXRhIGJ5dGVzIHRoYXQgaGFzIGJlZW4gYnVmZmVyZWQuCiAgKgotICogSWYgdGhlcmUgaXMgbm8gSVVDViBjb21tdW5pY2F0aW9uIHBhdGggZXN0YWJsaXNoZWQsIHRoZSBmdW5jdGlvbiByZXR1cm5zIDAuCi0gKiBJZiBhbiBleGlzdGluZyBJVUNWIGNvbW11bmljYXRvbiBwYXRoIGhhcyBiZWVuIHNldmVyZWQsIHRoZSBmdW5jdGlvbiByZXR1cm5zCi0gKiAtRVBJUEUgKGNhbiBiZSBwYXNzZWQgdG8gSFZDIGxheWVyIHRvIGNhdXNlIGEgdHR5IGhhbmd1cCkuCisgKiBJZiB0aGUgZGV2aWNlIGlzIG5vdCBjb25uZWN0ZWQsIGRhdGEgaXMgaWdub3JlZCBhbmQgdGhlIGZ1bmN0aW9uIHJldHVybnMKKyAqIEBjb3VudC4KKyAqIElmIHRoZSBidWZmZXIgaXMgZnVsbCwgdGhlIGZ1bmN0aW9uIHJldHVybnMgMC4KKyAqIElmIGFuIGV4aXN0aW5nIElVQ1YgY29tbXVuaWNhdG9uIHBhdGggaGFzIGJlZW4gc2V2ZXJlZCwgLUVQSVBFIGlzIHJldHVybmVkCisgKiAodGhhdCBjYW4gYmUgcGFzc2VkIHRvIEhWQyBsYXllciB0byBjYXVzZSBhIHR0eSBoYW5ndXApLgogICovCi1zdGF0aWMgaW50IGh2Y19pdWN2X3NlbmQoc3RydWN0IGh2Y19pdWN2X3ByaXZhdGUgKnByaXYsIGNvbnN0IGNoYXIgKmJ1ZiwKLQkJCSBpbnQgY291bnQpCitzdGF0aWMgaW50IGh2Y19pdWN2X3F1ZXVlKHN0cnVjdCBodmNfaXVjdl9wcml2YXRlICpwcml2LCBjb25zdCBjaGFyICpidWYsCisJCQkgIGludCBjb3VudCkKK3sKKwlzaXplX3QgbGVuOworCisJaWYgKHByaXYtPml1Y3Zfc3RhdGUgPT0gSVVDVl9ESVNDT05OKQorCQlyZXR1cm4gY291bnQ7CQkJLyogaWdub3JlIGRhdGEgKi8KKworCWlmIChwcml2LT5pdWN2X3N0YXRlID09IElVQ1ZfU0VWRVJFRCkKKwkJcmV0dXJuIC1FUElQRTsKKworCWxlbiA9IG1pbl90KHNpemVfdCwgY291bnQsIFNOREJVRl9TSVpFIC0gcHJpdi0+c25kYnVmX2xlbik7CisJaWYgKCFsZW4pCisJCXJldHVybiAwOworCisJbWVtY3B5KHByaXYtPnNuZGJ1ZiArIHByaXYtPnNuZGJ1Zl9sZW4sIGJ1ZiwgbGVuKTsKKwlwcml2LT5zbmRidWZfbGVuICs9IGxlbjsKKworCWlmIChwcml2LT5pdWN2X3N0YXRlID09IElVQ1ZfQ09OTkVDVEVEKQorCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJnByaXYtPnNuZGJ1Zl93b3JrLCBRVUVVRV9TTkRCVUZfREVMQVkpOworCisJcmV0dXJuIGxlbjsKK30KKworLyoqCisgKiBodmNfaXVjdl9zZW5kKCkgLSBTZW5kIGFuIElVQ1YgbWVzc2FnZSBjb250YWluaW5nIHRlcm1pbmFsIGRhdGEuCisgKiBAcHJpdjoJUG9pbnRlciB0byBzdHJ1Y3QgaHZjX2l1Y3ZfcHJpdmF0ZSBpbnN0YW5jZS4KKyAqCisgKiBJZiBhbiBJVUNWIGNvbW11bmljYXRpb24gcGF0aCBoYXMgYmVlbiBlc3RhYmxpc2hlZCwgdGhlIGJ1ZmZlcmVkIG91dHB1dCBkYXRhCisgKiBpcyBzZW50IHZpYSBhbiBJVUNWIG1lc3NhZ2UgYW5kIHRoZSBudW1iZXIgb2YgYnl0ZXMgc2VudCBpcyByZXR1cm5lZC4KKyAqIFJldHVybnMgMCBpZiB0aGVyZSBpcyBubyBlc3RhYmxpc2hlZCBJVUNWIGNvbW11bmljYXRpb24gcGF0aCBvcgorICogLUVQSVBFIGlmIGFuIGV4aXN0aW5nIElVQ1YgY29tbXVuaWNhdG9uIHBhdGggaGFzIGJlZW4gc2V2ZXJlZC4KKyAqLworc3RhdGljIGludCBodmNfaXVjdl9zZW5kKHN0cnVjdCBodmNfaXVjdl9wcml2YXRlICpwcml2KQogewogCXN0cnVjdCBpdWN2X3R0eV9idWZmZXIgKnNiOwotCWludCByYzsKLQl1MTYgbGVuOworCWludCByYywgbGVuOwogCiAJaWYgKHByaXYtPml1Y3Zfc3RhdGUgPT0gSVVDVl9TRVZFUkVEKQogCQlyZXR1cm4gLUVQSVBFOwogCiAJaWYgKHByaXYtPml1Y3Zfc3RhdGUgPT0gSVVDVl9ESVNDT05OKQotCQlyZXR1cm4gMDsKKwkJcmV0dXJuIC1FSU87CiAKLQlsZW4gPSBtaW5fdCh1MTYsIE1TR19NQVhfREFUQUxFTiwgY291bnQpOworCWlmICghcHJpdi0+c25kYnVmX2xlbikKKwkJcmV0dXJuIDA7CiAKIAkvKiBhbGxvY2F0ZSBpbnRlcm5hbCBidWZmZXIgdG8gc3RvcmUgbXNnIGRhdGEgYW5kIGFsc28gY29tcHV0ZSB0b3RhbAogCSAqIG1lc3NhZ2UgbGVuZ3RoICovCi0Jc2IgPSBhbGxvY190dHlfYnVmZmVyKGxlbiwgR0ZQX0FUT01JQyk7CisJc2IgPSBhbGxvY190dHlfYnVmZmVyKHByaXYtPnNuZGJ1Zl9sZW4sIEdGUF9BVE9NSUMpOwogCWlmICghc2IpCiAJCXJldHVybiAtRU5PTUVNOwogCi0Jc2ItPm1idWYtPmRhdGFsZW4gPSBsZW47Ci0JbWVtY3B5KHNiLT5tYnVmLT5kYXRhLCBidWYsIGxlbik7CisJbWVtY3B5KHNiLT5tYnVmLT5kYXRhLCBwcml2LT5zbmRidWYsIHByaXYtPnNuZGJ1Zl9sZW4pOworCXNiLT5tYnVmLT5kYXRhbGVuID0gKHUxNikgcHJpdi0+c25kYnVmX2xlbjsKKwlzYi0+bXNnLmxlbmd0aCA9IE1TR19TSVpFKHNiLT5tYnVmLT5kYXRhbGVuKTsKIAogCWxpc3RfYWRkX3RhaWwoJnNiLT5saXN0LCAmcHJpdi0+dHR5X291dHF1ZXVlKTsKIAogCXJjID0gX19pdWN2X21lc3NhZ2Vfc2VuZChwcml2LT5wYXRoLCAmc2ItPm1zZywgMCwgMCwKIAkJCQkgKHZvaWQgKikgc2ItPm1idWYsIHNiLT5tc2cubGVuZ3RoKTsKIAlpZiAocmMpIHsKKwkJLyogZHJvcCB0aGUgbWVzc2FnZSBoZXJlOyBob3dldmVyIHdlIG1pZ2h0IHdhbnQgdG8gaGFuZGxlCisJCSAqIDB4MDMgKG1zZyBsaW1pdCByZWFjaGVkKSBieSB0cnlpbmcgYWdhaW4uLi4gKi8KIAkJbGlzdF9kZWwoJnNiLT5saXN0KTsKIAkJZGVzdHJveV90dHlfYnVmZmVyKHNiKTsKLQkJbGVuID0gMDsKIAl9CisJbGVuID0gcHJpdi0+c25kYnVmX2xlbjsKKwlwcml2LT5zbmRidWZfbGVuID0gMDsKIAogCXJldHVybiBsZW47CiB9CiAKIC8qKgorICogaHZjX2l1Y3Zfc25kYnVmX3dvcmsoKSAtIFNlbmQgYnVmZmVyZWQgZGF0YSBvdmVyIElVQ1YKKyAqIEB3b3JrOglXb3JrIHN0cnVjdHVyZS4KKyAqCisgKiBUaGlzIHdvcmsgcXVldWUgZnVuY3Rpb24gc2VuZHMgYnVmZmVyZWQgb3V0cHV0IGRhdGEgb3ZlciBJVUNWIGFuZCwKKyAqIGlmIG5vdCBhbGwgYnVmZmVyZWQgZGF0YSBjb3VsZCBiZSBzZW50LCByZXNjaGVkdWxlcyBpdHNlbGYuCisgKi8KK3N0YXRpYyB2b2lkIGh2Y19pdWN2X3NuZGJ1Zl93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgaHZjX2l1Y3ZfcHJpdmF0ZSAqcHJpdjsKKworCXByaXYgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGh2Y19pdWN2X3ByaXZhdGUsIHNuZGJ1Zl93b3JrLndvcmspOworCWlmICghcHJpdikKKwkJcmV0dXJuOworCisJc3Bpbl9sb2NrX2JoKCZwcml2LT5sb2NrKTsKKwlodmNfaXVjdl9zZW5kKHByaXYpOworCXNwaW5fdW5sb2NrX2JoKCZwcml2LT5sb2NrKTsKK30KKworLyoqCiAgKiBodmNfaXVjdl9wdXRfY2hhcnMoKSAtIEhWQyBwdXRfY2hhcnMgb3BlcmF0aW9uLgogICogQHZ0ZXJtbm86CUhWQyB2aXJ0dWFsIHRlcm1pbmFsIG51bWJlci4KICAqIEBidWY6CVBvaW50ZXIgdG8gYW4gYnVmZmVyIHRvIHJlYWQgZGF0YSBmcm9tCiAgKiBAY291bnQ6CVNpemUgb2YgYnVmZmVyIGF2YWlsYWJsZSBmb3IgcmVhZGluZwogICoKLSAqIFRoZSBodmNfY29uc29sZSB0aHJlYWQgY2FsbHMgdGhpcyBtZXRob2QgdG8gd3JpdGUgY2hhcmFjdGVycyBmcm9tCi0gKiB0byB0aGUgdGVybWluYWwgYmFja2VuZC4KLSAqIFRoZSBmdW5jdGlvbiBjYWxscyBodmNfaXVjdl9zZW5kKCkgdW5kZXIgdGhlIGxvY2sgb2YgdGhlCi0gKiBzdHJ1Y3QgaHZjX2l1Y3ZfcHJpdmF0ZSBpbnN0YW5jZSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSB0dHkgQHZ0ZXJtbm8uCisgKiBUaGUgSFZDIHRocmVhZCBjYWxscyB0aGlzIG1ldGhvZCB0byB3cml0ZSBjaGFyYWN0ZXJzIHRvIHRoZSBiYWNrLWVuZC4KKyAqIFRoZSBmdW5jdGlvbiBjYWxscyBodmNfaXVjdl9xdWV1ZSgpIHRvIHF1ZXVlIHRlcm1pbmFsIGRhdGEgZm9yIHNlbmRpbmcuCiAgKgogICogTG9ja2luZzoJVGhlIG1ldGhvZCBnZXRzIGNhbGxlZCB1bmRlciBhbiBpcnFzYXZlKCkgc3BpbmxvY2s7IGFuZAogICoJCWxvY2tzIHN0cnVjdCBodmNfaXVjdl9wcml2YXRlLT5sb2NrLgpAQCAtMzg1LDcgKzQ0NCw3IEBACiBzdGF0aWMgaW50IGh2Y19pdWN2X3B1dF9jaGFycyh1aW50MzJfdCB2dGVybW5vLCBjb25zdCBjaGFyICpidWYsIGludCBjb3VudCkKIHsKIAlzdHJ1Y3QgaHZjX2l1Y3ZfcHJpdmF0ZSAqcHJpdiA9IGh2Y19pdWN2X2dldF9wcml2YXRlKHZ0ZXJtbm8pOwotCWludCBzZW50OworCWludCBxdWV1ZWQ7CiAKIAlpZiAoY291bnQgPD0gMCkKIAkJcmV0dXJuIDA7CkBAIC0zOTQsMTAgKzQ1MywxMCBAQAogCQlyZXR1cm4gLUVOT0RFVjsKIAogCXNwaW5fbG9jaygmcHJpdi0+bG9jayk7Ci0Jc2VudCA9IGh2Y19pdWN2X3NlbmQocHJpdiwgYnVmLCBjb3VudCk7CisJcXVldWVkID0gaHZjX2l1Y3ZfcXVldWUocHJpdiwgYnVmLCBjb3VudCk7CiAJc3Bpbl91bmxvY2soJnByaXYtPmxvY2spOwogCi0JcmV0dXJuIHNlbnQ7CisJcmV0dXJuIHF1ZXVlZDsKIH0KIAogLyoqCkBAIC00MDYsNyArNDY1LDcgQEAKICAqIEBpZDoJQWRkaXRpb25hbCBkYXRhIChvcmlnaW5hbGx5IHBhc3NlZCB0byBodmNfYWxsb2MpOiB0aGUgaW5kZXggb2YgYW4gc3RydWN0CiAgKglodmNfaXVjdl9wcml2YXRlIGluc3RhbmNlLgogICoKLSAqIFRoZSBmdW5jdGlvbiBzZXRzIHRoZSB0dHkgc3RhdGUgdG8gVFRZX09QRU4gZm9yIHRoZSBzdHJ1Y3QgaHZjX2l1Y3ZfcHJpdmF0ZQorICogVGhlIGZ1bmN0aW9uIHNldHMgdGhlIHR0eSBzdGF0ZSB0byBUVFlfT1BFTkVEIGZvciB0aGUgc3RydWN0IGh2Y19pdWN2X3ByaXZhdGUKICAqIGluc3RhbmNlIHRoYXQgaXMgZGVyaXZlZCBmcm9tIEBpZC4gQWx3YXlzIHJldHVybnMgMC4KICAqCiAgKiBMb2NraW5nOglzdHJ1Y3QgaHZjX2l1Y3ZfcHJpdmF0ZS0+bG9jaywgc3Bpbl9sb2NrX2JoCkBAIC00MjcsMTIgKzQ4Niw4IEBACiB9CiAKIC8qKgotICogaHZjX2l1Y3ZfY2xlYW51cCgpIC0gQ2xlYW4gdXAgZnVuY3Rpb24gaWYgdGhlIHR0eSBwb3J0aW9uIGlzIGZpbmFsbHkgY2xvc2VkLgorICogaHZjX2l1Y3ZfY2xlYW51cCgpIC0gQ2xlYW4gdXAgYW5kIHJlc2V0IGEgei9WTSBJVUNWIEhWQyBpbnN0YW5jZS4KICAqIEBwcml2OglQb2ludGVyIHRvIHRoZSBzdHJ1Y3QgaHZjX2l1Y3ZfcHJpdmF0ZSBpbnN0YW5jZS4KLSAqCi0gKiBUaGUgZnVuY3Rpb25zIHNldmVycyB0aGUgZXN0YWJsaXNoZWQgSVVDViBjb21tdW5pY2F0aW9uIHBhdGggKGlmIGFueSksIGFuZAotICogZGVzdHJveSBzdHJ1Y3QgaXVjdl90dHlfYnVmZmVyIGVsZW1lbnRzIGZyb20gdGhlIGluLSBhbmQgb3V0cXVldWUuIEZpbmFsbHksCi0gKiB0aGUgZnVuY3Rpb25zIHJlc2V0cyB0aGUgc3RhdGVzIHRvIFRUWV9DTE9TRUQgYW5kIElVQ1ZfRElTQ09OTi4KICAqLwogc3RhdGljIHZvaWQgaHZjX2l1Y3ZfY2xlYW51cChzdHJ1Y3QgaHZjX2l1Y3ZfcHJpdmF0ZSAqcHJpdikKIHsKQEAgLTQ0MSwyNSArNDk2LDYyIEBACiAKIAlwcml2LT50dHlfc3RhdGUgPSBUVFlfQ0xPU0VEOwogCXByaXYtPml1Y3Zfc3RhdGUgPSBJVUNWX0RJU0NPTk47CisKKwlwcml2LT5zbmRidWZfbGVuID0gMDsKIH0KIAogLyoqCi0gKiBodmNfaXVjdl9ub3RpZmllcl9oYW5ndXAoKSAtIEhWQyBub3RpZmllciBmb3IgdHR5IGhhbmd1cHMuCi0gKiBAaHA6IFBvaW50ZXIgdG8gdGhlIEhWQyBkZXZpY2UgKHN0cnVjdCBodmNfc3RydWN0KQotICogQGlkOiBBZGRpdGlvbmFsIGRhdGEgKG9yaWdpbmFsbHkgcGFzc2VkIHRvIGh2Y19hbGxvYyk6IHRoZSBpbmRleCBvZiBhbiBzdHJ1Y3QKLSAqCWh2Y19pdWN2X3ByaXZhdGUgaW5zdGFuY2UuCisgKiB0dHlfb3V0cXVldWVfZW1wdHkoKSAtIFRlc3QgaWYgdGhlIHR0eSBvdXRxIGlzIGVtcHR5CisgKiBAcHJpdjoJUG9pbnRlciB0byBzdHJ1Y3QgaHZjX2l1Y3ZfcHJpdmF0ZSBpbnN0YW5jZS4KKyAqLworc3RhdGljIGlubGluZSBpbnQgdHR5X291dHF1ZXVlX2VtcHR5KHN0cnVjdCBodmNfaXVjdl9wcml2YXRlICpwcml2KQoreworCWludCByYzsKKworCXNwaW5fbG9ja19iaCgmcHJpdi0+bG9jayk7CisJcmMgPSBsaXN0X2VtcHR5KCZwcml2LT50dHlfb3V0cXVldWUpOworCXNwaW5fdW5sb2NrX2JoKCZwcml2LT5sb2NrKTsKKworCXJldHVybiByYzsKK30KKworLyoqCisgKiBmbHVzaF9zbmRidWZfc3luYygpIC0gRmx1c2ggc2VuZCBidWZmZXIgYW5kIHdhaXQgZm9yIGNvbXBsZXRpb24KKyAqIEBwcml2OglQb2ludGVyIHRvIHN0cnVjdCBodmNfaXVjdl9wcml2YXRlIGluc3RhbmNlLgogICoKLSAqIFRoaXMgcm91dGluZSBub3RpZmllcyB0aGUgSFZDIGJhY2tlbmQgdGhhdCBhIHR0eSBoYW5ndXAgKGNhcnJpZXIgbG9zcywKKyAqIFRoZSByb3V0aW5lIGNhbmNlbHMgYSBwZW5kaW5nIHNuZGJ1ZiB3b3JrLCBjYWxscyBodmNfaXVjdl9zZW5kKCkKKyAqIHRvIGZsdXNoIGFueSBidWZmZXJlZCB0ZXJtaW5hbCBvdXRwdXQgZGF0YSBhbmQgd2FpdHMgZm9yIGNvbXBsZXRpb24uCisgKi8KK3N0YXRpYyB2b2lkIGZsdXNoX3NuZGJ1Zl9zeW5jKHN0cnVjdCBodmNfaXVjdl9wcml2YXRlICpwcml2KQoreworCWludCBzeW5jX3dhaXQ7CisKKwljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJnByaXYtPnNuZGJ1Zl93b3JrKTsKKworCXNwaW5fbG9ja19iaCgmcHJpdi0+bG9jayk7CisJaHZjX2l1Y3Zfc2VuZChwcml2KTsJCS8qIGZvcmNlIHNlbmRpbmcgYnVmZmVyZWQgZGF0YSAqLworCXN5bmNfd2FpdCA9ICFsaXN0X2VtcHR5KCZwcml2LT50dHlfb3V0cXVldWUpOyAvKiBhbnl0aGluZyBxdWV1ZWQgPyAqLworCXNwaW5fdW5sb2NrX2JoKCZwcml2LT5sb2NrKTsKKworCWlmIChzeW5jX3dhaXQpCisJCXdhaXRfZXZlbnRfdGltZW91dChwcml2LT5zbmRidWZfd2FpdHEsCisJCQkJICAgdHR5X291dHF1ZXVlX2VtcHR5KHByaXYpLCBIWik7Cit9CisKKy8qKgorICogaHZjX2l1Y3Zfbm90aWZpZXJfaGFuZ3VwKCkgLSBIVkMgbm90aWZpZXIgZm9yIFRUWSBoYW5ndXBzLgorICogQGhwOgkJUG9pbnRlciB0byB0aGUgSFZDIGRldmljZSAoc3RydWN0IGh2Y19zdHJ1Y3QpCisgKiBAaWQ6CQlBZGRpdGlvbmFsIGRhdGEgKG9yaWdpbmFsbHkgcGFzc2VkIHRvIGh2Y19hbGxvYyk6CisgKgkJdGhlIGluZGV4IG9mIGFuIHN0cnVjdCBodmNfaXVjdl9wcml2YXRlIGluc3RhbmNlLgorICoKKyAqIFRoaXMgcm91dGluZSBub3RpZmllcyB0aGUgSFZDIGJhY2stZW5kIHRoYXQgYSB0dHkgaGFuZ3VwIChjYXJyaWVyIGxvc3MsCiAgKiB2aXJ0dWFsIG9yIG90aGVyd2lzZSkgaGFzIG9jY3VyZWQuCi0gKgotICogVGhlIEhWQyBiYWNrZW5kIGZvciB6L1ZNIElVQ1YgaWdub3JlcyB2aXJ0dWFsIGhhbmd1cHMgKHZoYW5ndXAoKSksIHRvIGtlZXAKLSAqIGFuIGV4aXN0aW5nIElVQ1YgY29tbXVuaWNhdGlvbiBwYXRoIGVzdGFibGlzaGVkLgorICogVGhlIHovVk0gSVVDViBIVkMgZGV2aWNlIGRyaXZlciBpZ25vcmVzIHZpcnR1YWwgaGFuZ3VwcyAodmhhbmd1cCgpKQorICogdG8ga2VlcCBhbiBleGlzdGluZyBJVUNWIGNvbW11bmljYXRpb24gcGF0aCBlc3RhYmxpc2hlZC4KICAqIChCYWNrZ3JvdW5kOiB2aGFuZ3VwKCkgaXMgY2FsbGVkIGZyb20gdXNlciBzcGFjZSAoYnkgZ2V0dHkgb3IgbG9naW4pIHRvCiAgKgkJZGlzYWJsZSB3cml0aW5nIHRvIHRoZSB0dHkgYnkgb3RoZXIgYXBwbGljYXRpb25zKS4KLSAqCi0gKiBJZiB0aGUgdHR5IGhhcyBiZWVuIG9wZW5lZCAoZS5nLiBnZXR0eSkgYW5kIGFuIGVzdGFibGlzaGVkIElVQ1YgcGF0aCBoYXMgYmVlbgotICogc2V2ZXJlZCAod2UgY2F1c2VkIHRoZSB0dHkgaGFuZ3VwIGluIHRoYXQgY2FzZSksIHRoZW4gdGhlIGZ1bmN0aW9ucyBpbnZva2VzCi0gKiBodmNfaXVjdl9jbGVhbnVwKCkgdG8gY2xlYW4gdXAuCisgKiBJZiB0aGUgdHR5IGhhcyBiZWVuIG9wZW5lZCBhbmQgYW4gZXN0YWJsaXNoZWQgSVVDViBwYXRoIGhhcyBiZWVuIHNldmVyZWQKKyAqICh3ZSBjYXVzZWQgdGhlIHR0eSBoYW5ndXApLCB0aGUgZnVuY3Rpb24gY2FsbHMgaHZjX2l1Y3ZfY2xlYW51cCgpLgogICoKICAqIExvY2tpbmc6CXN0cnVjdCBodmNfaXVjdl9wcml2YXRlLT5sb2NrCiAgKi8KQEAgLTQ3MSwxMiArNTYzLDEyIEBACiAJaWYgKCFwcml2KQogCQlyZXR1cm47CiAKKwlmbHVzaF9zbmRidWZfc3luYyhwcml2KTsKKwogCXNwaW5fbG9ja19iaCgmcHJpdi0+bG9jayk7CiAJLyogTk9URTogSWYgdGhlIGhhbmd1cCB3YXMgc2NoZWR1bGVkIGJ5IG91cnNlbGYgKGZyb20gdGhlIGl1Y3YKLQkgKgkgcGF0aF9zZXJ2ZXJlZCBjYWxsYmFjayBbSVVDVl9TRVZFUkVEXSksIHRoZW4gd2UgaGF2ZSB0bwotCSAqCSBmaW5hbGx5IGNsZWFuIHVwIHRoZSB0dHkgYmFja2VuZCBzdHJ1Y3R1cmUgYW5kIHNldCBzdGF0ZSB0bwotCSAqCSBUVFlfQ0xPU0VELgotCSAqCisJICoJIHBhdGhfc2VydmVyZWQgY2FsbGJhY2sgW0lVQ1ZfU0VWRVJFRF0pLCB3ZSBoYXZlIHRvIGNsZWFuIHVwCisJICoJIG91ciBzdHJ1Y3R1cmUgYW5kIHRvIHNldCBzdGF0ZSB0byBUVFlfQ0xPU0VELgogCSAqCSBJZiB0aGUgdHR5IHdhcyBodW5nIHVwIG90aGVyd2lzZSAoZS5nLiB2aGFuZ3VwKCkpLCB0aGVuIHdlCiAJICoJIGlnbm9yZSB0aGlzIGhhbmd1cCBhbmQga2VlcCBhbiBlc3RhYmxpc2hlZCBJVUNWIHBhdGggb3Blbi4uLgogCSAqCSAoLi4udGhlIHJlYXNvbiBpcyB0aGF0IHdlIGFyZSBub3QgYWJsZSB0byBjb25uZWN0IGJhY2sgdG8gdGhlCkBAIC00OTQsMTAgKzU4Niw5IEBACiAgKiBAaWQ6CQlBZGRpdGlvbmFsIGRhdGEgKG9yaWdpbmFsbHkgcGFzc2VkIHRvIGh2Y19hbGxvYyk6CiAgKgkJdGhlIGluZGV4IG9mIGFuIHN0cnVjdCBodmNfaXVjdl9wcml2YXRlIGluc3RhbmNlLgogICoKLSAqIFRoaXMgcm91dGluZSBub3RpZmllcyB0aGUgSFZDIGJhY2tlbmQgdGhhdCB0aGUgbGFzdCB0dHkgZGV2aWNlIGZpbGUKLSAqIGRlc2NyaXB0b3IgaGFzIGJlZW4gY2xvc2VkLgotICogVGhlIGZ1bmN0aW9uIGNhbGxzIGh2Y19pdWN2X2NsZWFudXAoKSB0byBjbGVhbiB1cCB0aGUgc3RydWN0IGh2Y19pdWN2X3ByaXZhdGUKLSAqIGluc3RhbmNlLgorICogVGhpcyByb3V0aW5lIG5vdGlmaWVzIHRoZSBIVkMgYmFjay1lbmQgdGhhdCB0aGUgbGFzdCB0dHkgZGV2aWNlIGZkIGhhcyBiZWVuCisgKiBjbG9zZWQuICBUaGUgZnVuY3Rpb24gY2FsbHMgaHZjX2l1Y3ZfY2xlYW51cCgpIHRvIGNsZWFuIHVwIHRoZSBzdHJ1Y3QKKyAqIGh2Y19pdWN2X3ByaXZhdGUgaW5zdGFuY2UuCiAgKgogICogTG9ja2luZzoJc3RydWN0IGh2Y19pdWN2X3ByaXZhdGUtPmxvY2sKICAqLwpAQCAtNTEwLDYgKzYwMSw4IEBACiAJaWYgKCFwcml2KQogCQlyZXR1cm47CiAKKwlmbHVzaF9zbmRidWZfc3luYyhwcml2KTsKKwogCXNwaW5fbG9ja19iaCgmcHJpdi0+bG9jayk7CiAJcGF0aCA9IHByaXYtPnBhdGg7CQkvKiBzYXZlIHJlZmVyZW5jZSB0byBJVUNWIHBhdGggKi8KIAlwcml2LT5wYXRoID0gTlVMTDsKQEAgLTUyNywyMCArNjIwLDE4IEBACiAvKioKICAqIGh2Y19pdWN2X3BhdGhfcGVuZGluZygpIC0gSVVDViBoYW5kbGVyIHRvIHByb2Nlc3MgYSBjb25uZWN0aW9uIHJlcXVlc3QuCiAgKiBAcGF0aDoJUGVuZGluZyBwYXRoIChzdHJ1Y3QgaXVjdl9wYXRoKQotICogQGlwdm1pZDoJT3JpZ2luYXRvciB6L1ZNIHN5c3RlbSBpZGVudGlmaWVyCisgKiBAaXB2bWlkOgl6L1ZNIHN5c3RlbSBpZGVudGlmaWVyIG9mIG9yaWdpbmF0b3IKICAqIEBpcHVzZXI6CVVzZXIgc3BlY2lmaWVkIGRhdGEgZm9yIHRoaXMgcGF0aAogICoJCShBRl9JVUNWOiBwb3J0L3NlcnZpY2UgbmFtZSBhbmQgb3JpZ2luYXRvciBwb3J0KQogICoKLSAqIFRoZSBmdW5jdGlvbiB1c2VzIHRoZSBAaXB1c2VyIGRhdGEgdG8gY2hlY2sgdG8gZGV0ZXJtaW5lIGlmIHRoZSBwZW5kaW5nCi0gKiBwYXRoIGJlbG9uZ3MgdG8gYSB0ZXJtaW5hbCBtYW5hZ2VkIGJ5IHRoaXMgSFZDIGJhY2tlbmQuCi0gKiBJZiB0aGUgY2hlY2sgaXMgc3VjY2Vzc2Z1bCwgdGhlbiBhbiBhZGRpdGlvbmFsIGNoZWNrIGlzIGRvbmUgdG8gZW5zdXJlCi0gKiB0aGF0IGEgdGVybWluYWwgY2Fubm90IGJlIGFjY2Vzc2VkIG11bHRpcGxlIHRpbWVzIChvbmx5IG9uZSBjb25uZWN0aW9uCi0gKiB0byBhIHRlcm1pbmFsIGlzIGFsbG93ZWQpLiBJbiB0aGF0IHBhcnRpY3VsYXIgY2FzZSwgdGhlIHBlbmRpbmcgcGF0aCBpcwotICogc2V2ZXJlZC4gSWYgaXQgaXMgdGhlIGZpcnN0IGNvbm5lY3Rpb24sIHRoZSBwZW5kaW5nIHBhdGggaXMgYWNjZXB0ZWQgYW5kCi0gKiBhc3NvY2lhdGVkIHRvIHRoZSBzdHJ1Y3QgaHZjX2l1Y3ZfcHJpdmF0ZS4gVGhlIGl1Y3Ygc3RhdGUgaXMgdXBkYXRlZCB0bwotICogcmVmbGVjdCB0aGF0IGEgY29tbXVuaWNhdGlvbiBwYXRoIGhhcyBiZWVuIGVzdGFibGlzaGVkLgorICogVGhlIGZ1bmN0aW9uIHVzZXMgdGhlIEBpcHVzZXIgZGF0YSB0byBkZXRlcm1pbmUgaWYgdGhlIHBlbmRpbmcgcGF0aCBiZWxvbmdzCisgKiB0byBhIHRlcm1pbmFsIG1hbmFnZWQgYnkgdGhpcyBkZXZpY2UgZHJpdmVyLgorICogSWYgdGhlIHBhdGggYmVsb25ncyB0byB0aGlzIGRyaXZlciwgZW5zdXJlIHRoYXQgdGhlIHRlcm1pbmFsIGlzIG5vdCBhY2Nlc3NlZAorICogbXVsdGlwbGUgdGltZXMgKG9ubHkgb25lIGNvbm5lY3Rpb24gdG8gYSB0ZXJtaW5hbCBpcyBhbGxvd2VkKS4KKyAqIElmIHRoZSB0ZXJtaW5hbCBpcyBub3QgeWV0IGNvbm5lY3RlZCwgdGhlIHBlbmRpbmcgcGF0aCBpcyBhY2NlcHRlZCBhbmQgaXMKKyAqIGFzc29jaWF0ZWQgdG8gdGhlIGFwcHJvcHJpYXRlIHN0cnVjdCBodmNfaXVjdl9wcml2YXRlIGluc3RhbmNlLgogICoKLSAqIFJldHVybnMgMCBpZiB0aGUgcGF0aCBiZWxvbmdzIHRvIGEgdGVybWluYWwgbWFuYWdlZCBieSB0aGUgdGhpcyBIVkMgYmFja2VuZDsKKyAqIFJldHVybnMgMCBpZiBAcGF0aCBiZWxvbmdzIHRvIGEgdGVybWluYWwgbWFuYWdlZCBieSB0aGUgdGhpcyBkZXZpY2UgZHJpdmVyOwogICogb3RoZXJ3aXNlIHJldHVybnMgLUVOT0RFViBpbiBvcmRlciB0byBkaXNwYXRjaCB0aGlzIHBhdGggdG8gb3RoZXIgaGFuZGxlcnMuCiAgKgogICogTG9ja2luZzoJc3RydWN0IGh2Y19pdWN2X3ByaXZhdGUtPmxvY2sKQEAgLTU1OSw3ICs2NTAsNiBAQAogCQkJcHJpdiA9IGh2Y19pdWN2X3RhYmxlW2ldOwogCQkJYnJlYWs7CiAJCX0KLQogCWlmICghcHJpdikKIAkJcmV0dXJuIC1FTk9ERVY7CiAKQEAgLTU4OCw2ICs2NzgsOSBAQAogCXByaXYtPnBhdGggPSBwYXRoOwogCXByaXYtPml1Y3Zfc3RhdGUgPSBJVUNWX0NPTk5FQ1RFRDsKIAorCS8qIGZsdXNoIGJ1ZmZlcmVkIG91dHB1dCBkYXRhLi4uICovCisJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZwcml2LT5zbmRidWZfd29yaywgNSk7CisKIG91dF9wYXRoX2hhbmRsZWQ6CiAJc3Bpbl91bmxvY2soJnByaXYtPmxvY2spOwogCXJldHVybiAwOwpAQCAtNjAzLDggKzY5Niw3IEBACiAgKiBzZXRzIHRoZSBpdWN2IHN0YXRlIHRvIElVQ1ZfU0VWRVJFRCBmb3IgdGhlIGFzc29jaWF0ZWQgc3RydWN0CiAgKiBodmNfaXVjdl9wcml2YXRlIGluc3RhbmNlLiBMYXRlciwgdGhlIElVQ1ZfU0VWRVJFRCBzdGF0ZSB0cmlnZ2VycyBhIHR0eQogICogaGFuZ3VwIChodmNfaXVjdl9nZXRfY2hhcnMoKSAvIGh2Y19pdWN2X3dyaXRlKCkpLgotICoKLSAqIElmIHR0eSBwb3J0aW9uIG9mIHRoZSBIVkMgaXMgY2xvc2VkIHRoZW4gY2xlYW4gdXAgdGhlIG91dHF1ZXVlIGluIGFkZGl0aW9uLgorICogSWYgdHR5IHBvcnRpb24gb2YgdGhlIEhWQyBpcyBjbG9zZWQsIGNsZWFuIHVwIHRoZSBvdXRxdWV1ZS4KICAqCiAgKiBMb2NraW5nOglzdHJ1Y3QgaHZjX2l1Y3ZfcHJpdmF0ZS0+bG9jawogICovCkBAIC02MTUsMTUgKzcwNywyNSBAQAogCXNwaW5fbG9jaygmcHJpdi0+bG9jayk7CiAJcHJpdi0+aXVjdl9zdGF0ZSA9IElVQ1ZfU0VWRVJFRDsKIAotCS8qIE5PVEU6IElmIHRoZSB0dHkgaGFzIG5vdCB5ZXQgYmVlbiBvcGVuZWQgYnkgYSBnZXR0eSBwcm9ncmFtCi0JICoJIChlLmcuIHRvIHNlZSBjb25zb2xlIG1lc3NhZ2VzKSwgdGhlbiBjbGVhbnVwIHRoZQotCSAqCSBodmNfaXVjdl9wcml2YXRlIHN0cnVjdHVyZSB0byBhbGxvdyByZS1jb25uZWN0cy4KKwkvKiBJZiB0aGUgdHR5IGhhcyBub3QgeWV0IGJlZW4gb3BlbmVkLCBjbGVhbiB1cCB0aGUgaHZjX2l1Y3ZfcHJpdmF0ZQorCSAqIHN0cnVjdHVyZSB0byBhbGxvdyByZS1jb25uZWN0cy4KKwkgKiBUaGlzIGlzIGFsc28gZG9uZSBmb3Igb3VyIGNvbnNvbGUgZGV2aWNlIGJlY2F1c2UgY29uc29sZSBoYW5ndXBzCisJICogYXJlIGhhbmRsZWQgc3BlY2lhbGx5IGFuZCBubyBub3RpZmllciBpcyBjYWxsZWQgYnkgSFZDLgorCSAqIFRoZSB0dHkgc2Vzc2lvbiBpcyBhY3RpdmUgKFRUWV9PUEVOKSBhbmQgcmVhZHkgZm9yIHJlLWNvbm5lY3RzLi4uCiAJICoKLQkgKgkgSWYgdGhlIHR0eSBoYXMgYmVlbiBvcGVuZWQsIHRoZSBnZXRfY2hhcnMoKSBjYWxsYmFjayByZXR1cm5zCi0JICoJIC1FUElQRSB0byBzaWduYWwgdGhlIGh2YyBjb25zb2xlIGxheWVyIHRvIGhhbmcgdXAgdGhlIHR0eS4gKi8KKwkgKiBJZiBpdCBoYXMgYmVlbiBvcGVuZWQsIGxldCBnZXRfY2hhcnMoKSByZXR1cm4gLUVQSVBFIHRvIHNpZ25hbCB0aGUKKwkgKiBIVkMgbGF5ZXIgdG8gaGFuZyB1cCB0aGUgdHR5LgorCSAqIElmIHNvLCB3ZSBuZWVkIHRvIHdha2UgdXAgdGhlIEhWQyB0aHJlYWQgdG8gY2FsbCBnZXRfY2hhcnMoKS4uLgorCSAqLwogCXByaXYtPnBhdGggPSBOVUxMOwogCWlmIChwcml2LT50dHlfc3RhdGUgPT0gVFRZX0NMT1NFRCkKIAkJaHZjX2l1Y3ZfY2xlYW51cChwcml2KTsKKwllbHNlCisJCWlmIChwcml2LT5pc19jb25zb2xlKSB7CisJCQlodmNfaXVjdl9jbGVhbnVwKHByaXYpOworCQkJcHJpdi0+dHR5X3N0YXRlID0gVFRZX09QRU5FRDsKKwkJfSBlbHNlCisJCQlodmNfa2ljaygpOwogCXNwaW5fdW5sb2NrKCZwcml2LT5sb2NrKTsKIAogCS8qIGZpbmFsbHkgc2V2ZXIgcGF0aCAob3V0c2lkZSBvZiBwcml2LT5sb2NrIGR1ZSB0byBsb2NrIG9yZGVyaW5nKSAqLwpAQCAtNjM2LDkgKzczOCw5IEBACiAgKiBAcGF0aDoJUGVuZGluZyBwYXRoIChzdHJ1Y3QgaXVjdl9wYXRoKQogICogQG1zZzoJUG9pbnRlciB0byB0aGUgSVVDViBtZXNzYWdlCiAgKgotICogVGhlIGZ1bmN0aW9uIHN0b3JlcyBhbiBpbmNvbWluZyBtZXNzYWdlIG9uIHRoZSBpbnB1dCBxdWV1ZSBmb3IgbGF0ZXIKKyAqIFRoZSBmdW5jdGlvbiBwdXRzIGFuIGluY29taW5nIG1lc3NhZ2Ugb24gdGhlIGlucHV0IHF1ZXVlIGZvciBsYXRlcgogICogcHJvY2Vzc2luZyAoYnkgaHZjX2l1Y3ZfZ2V0X2NoYXJzKCkgLyBodmNfaXVjdl93cml0ZSgpKS4KLSAqIEhvd2V2ZXIsIGlmIHRoZSB0dHkgaGFzIG5vdCB5ZXQgYmVlbiBvcGVuZWQsIHRoZSBtZXNzYWdlIGlzIHJlamVjdGVkLgorICogSWYgdGhlIHR0eSBoYXMgbm90IHlldCBiZWVuIG9wZW5lZCwgdGhlIG1lc3NhZ2UgaXMgcmVqZWN0ZWQuCiAgKgogICogTG9ja2luZzoJc3RydWN0IGh2Y19pdWN2X3ByaXZhdGUtPmxvY2sKICAqLwpAQCAtNjQ4LDYgKzc1MCwxMiBAQAogCXN0cnVjdCBodmNfaXVjdl9wcml2YXRlICpwcml2ID0gcGF0aC0+cHJpdmF0ZTsKIAlzdHJ1Y3QgaXVjdl90dHlfYnVmZmVyICpyYjsKIAorCS8qIHJlamVjdCBtZXNzYWdlcyB0aGF0IGV4Y2VlZCBtYXggc2l6ZSBvZiBpdWN2X3R0eV9tc2ctPmRhdGFsZW4gKi8KKwlpZiAobXNnLT5sZW5ndGggPiBNU0dfU0laRShNU0dfTUFYX0RBVEFMRU4pKSB7CisJCWl1Y3ZfbWVzc2FnZV9yZWplY3QocGF0aCwgbXNnKTsKKwkJcmV0dXJuOworCX0KKwogCXNwaW5fbG9jaygmcHJpdi0+bG9jayk7CiAKIAkvKiByZWplY3QgbWVzc2FnZXMgaWYgdHR5IGhhcyBub3QgeWV0IGJlZW4gb3BlbmVkICovCkBAIC02NTYsNyArNzY0LDcgQEAKIAkJZ290byB1bmxvY2tfcmV0dXJuOwogCX0KIAotCS8qIGFsbG9jYXRlIGJ1ZmZlciBhbiBlbXB0eSBidWZmZXIgZWxlbWVudCAqLworCS8qIGFsbG9jYXRlIHR0eSBidWZmZXIgdG8gc2F2ZSBpdWN2IG1zZyBvbmx5ICovCiAJcmIgPSBhbGxvY190dHlfYnVmZmVyKDAsIEdGUF9BVE9NSUMpOwogCWlmICghcmIpIHsKIAkJaXVjdl9tZXNzYWdlX3JlamVjdChwYXRoLCBtc2cpOwpAQCAtNjY2LDcgKzc3NCw3IEBACiAKIAlsaXN0X2FkZF90YWlsKCZyYi0+bGlzdCwgJnByaXYtPnR0eV9pbnF1ZXVlKTsKIAotCWh2Y19raWNrKCk7CS8qIHdha3VwIGh2YyBjb25zb2xlIHRocmVhZCAqLworCWh2Y19raWNrKCk7CS8qIHdha2UgdXAgaHZjIHRocmVhZCAqLwogCiB1bmxvY2tfcmV0dXJuOgogCXNwaW5fdW5sb2NrKCZwcml2LT5sb2NrKTsKQEAgLTY3NywxMCArNzg1LDEwIEBACiAgKiBAcGF0aDoJUGVuZGluZyBwYXRoIChzdHJ1Y3QgaXVjdl9wYXRoKQogICogQG1zZzoJUG9pbnRlciB0byB0aGUgSVVDViBtZXNzYWdlCiAgKgotICogVGhlIGZ1bmN0aW9uIGlzIGNhbGxlZCB1cG9uIGNvbXBsZXRpb24gb2YgbWVzc2FnZSBkZWxpdmVyeSBhbmQgdGhlCi0gKiBtZXNzYWdlIGlzIHJlbW92ZWQgZnJvbSB0aGUgb3V0cXVldWUuIEFkZGl0aW9uYWwgZGVsaXZlcnkgaW5mb3JtYXRpb24KLSAqIGNhbiBiZSBmb3VuZCBpbiBtc2ctPmF1ZGl0OiByZWplY3RlZCBtZXNzYWdlcyAoMHgwNDAwMDAgKElQQURSSkNUKSkgYW5kCi0gKiBwdXJnZWQgbWVzc2FnZXMgKDB4MDEwMDAwIChJUEFEUEdOUikpLgorICogVGhlIGZ1bmN0aW9uIGlzIGNhbGxlZCB1cG9uIGNvbXBsZXRpb24gb2YgbWVzc2FnZSBkZWxpdmVyeSB0byByZW1vdmUgdGhlCisgKiBtZXNzYWdlIGZyb20gdGhlIG91dHF1ZXVlLiBBZGRpdGlvbmFsIGRlbGl2ZXJ5IGluZm9ybWF0aW9uIGNhbiBiZSBmb3VuZAorICogbXNnLT5hdWRpdDogcmVqZWN0ZWQgbWVzc2FnZXMgKDB4MDQwMDAwIChJUEFEUkpDVCkpLCBhbmQKKyAqCSAgICAgICBwdXJnZWQgbWVzc2FnZXMJICgweDAxMDAwMCAoSVBBRFBHTlIpKS4KICAqCiAgKiBMb2NraW5nOglzdHJ1Y3QgaHZjX2l1Y3ZfcHJpdmF0ZS0+bG9jawogICovCkBAIC02OTcsNiArODA1LDcgQEAKIAkJCWxpc3RfbW92ZSgmZW50LT5saXN0LCAmbGlzdF9yZW1vdmUpOwogCQkJYnJlYWs7CiAJCX0KKwl3YWtlX3VwKCZwcml2LT5zbmRidWZfd2FpdHEpOwogCXNwaW5fdW5sb2NrKCZwcml2LT5sb2NrKTsKIAlkZXN0cm95X3R0eV9idWZmZXJfbGlzdCgmbGlzdF9yZW1vdmUpOwogfQpAQCAtNzEzLDEzICs4MjIsMTQgQEAKIAogLyoqCiAgKiBodmNfaXVjdl9hbGxvYygpIC0gQWxsb2NhdGVzIGEgbmV3IHN0cnVjdCBodmNfaXVjdl9wcml2YXRlIGluc3RhbmNlCi0gKiBAaWQ6CWh2Y19pdWN2X3RhYmxlIGluZGV4CisgKiBAaWQ6CQkJaHZjX2l1Y3ZfdGFibGUgaW5kZXgKKyAqIEBpc19jb25zb2xlOgkJRmxhZyBpZiB0aGUgaW5zdGFuY2UgaXMgdXNlZCBhcyBMaW51eCBjb25zb2xlCiAgKgotICogVGhpcyBmdW5jdGlvbiBhbGxvY2F0ZXMgYSBuZXcgaHZjX2l1Y3ZfcHJpdmF0ZSBzdHJ1Y3QgYW5kIHB1dCB0aGUKLSAqIGluc3RhbmNlIGludG8gaHZjX2l1Y3ZfdGFibGUgYXQgaW5kZXggQGlkLgorICogVGhpcyBmdW5jdGlvbiBhbGxvY2F0ZXMgYSBuZXcgaHZjX2l1Y3ZfcHJpdmF0ZSBzdHJ1Y3R1cmUgYW5kIHN0b3JlcworICogdGhlIGluc3RhbmNlIGluIGh2Y19pdWN2X3RhYmxlIGF0IGluZGV4IEBpZC4KICAqIFJldHVybnMgMCBvbiBzdWNjZXNzOyBvdGhlcndpc2Ugbm9uLXplcm8uCiAgKi8KLXN0YXRpYyBpbnQgX19pbml0IGh2Y19pdWN2X2FsbG9jKGludCBpZCkKK3N0YXRpYyBpbnQgX19pbml0IGh2Y19pdWN2X2FsbG9jKGludCBpZCwgdW5zaWduZWQgaW50IGlzX2NvbnNvbGUpCiB7CiAJc3RydWN0IGh2Y19pdWN2X3ByaXZhdGUgKnByaXY7CiAJY2hhciBuYW1lWzldOwpAQCAtNzMyLDE4ICs4NDIsMzMgQEAKIAlzcGluX2xvY2tfaW5pdCgmcHJpdi0+bG9jayk7CiAJSU5JVF9MSVNUX0hFQUQoJnByaXYtPnR0eV9vdXRxdWV1ZSk7CiAJSU5JVF9MSVNUX0hFQUQoJnByaXYtPnR0eV9pbnF1ZXVlKTsKKwlJTklUX0RFTEFZRURfV09SSygmcHJpdi0+c25kYnVmX3dvcmssIGh2Y19pdWN2X3NuZGJ1Zl93b3JrKTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZwcml2LT5zbmRidWZfd2FpdHEpOwogCi0JLyogRmluYWxseSBhbGxvY2F0ZSBodmMgKi8KLQlwcml2LT5odmMgPSBodmNfYWxsb2MoSFZDX0lVQ1ZfTUFHSUMgKyBpZCwKLQkJCSAgICAgIEhWQ19JVUNWX01BR0lDICsgaWQsICZodmNfaXVjdl9vcHMsIFBBR0VfU0laRSk7CisJcHJpdi0+c25kYnVmID0gKHZvaWQgKikgZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwpOworCWlmICghcHJpdi0+c25kYnVmKSB7CisJCWtmcmVlKHByaXYpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwkvKiBzZXQgY29uc29sZSBmbGFnICovCisJcHJpdi0+aXNfY29uc29sZSA9IGlzX2NvbnNvbGU7CisKKwkvKiBmaW5hbGx5IGFsbG9jYXRlIGh2YyAqLworCXByaXYtPmh2YyA9IGh2Y19hbGxvYyhIVkNfSVVDVl9NQUdJQyArIGlkLCAvKgkJICBQQUdFX1NJWkUgKi8KKwkJCSAgICAgIEhWQ19JVUNWX01BR0lDICsgaWQsICZodmNfaXVjdl9vcHMsIDI1Nik7CiAJaWYgKElTX0VSUihwcml2LT5odmMpKSB7CiAJCXJjID0gUFRSX0VSUihwcml2LT5odmMpOworCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpIHByaXYtPnNuZGJ1Zik7CiAJCWtmcmVlKHByaXYpOwogCQlyZXR1cm4gcmM7CiAJfQogCisJLyogbm90aWZ5IEhWQyB0aHJlYWQgaW5zdGVhZCBvZiB1c2luZyBwb2xsaW5nICovCisJcHJpdi0+aHZjLT5pcnFfcmVxdWVzdGVkID0gMTsKKwogCS8qIHNldHVwIGl1Y3YgcmVsYXRlZCBpbmZvcm1hdGlvbiAqLwotCXNucHJpbnRmKG5hbWUsIDksICJpaHZjJS00ZCIsIGlkKTsKKwlzbnByaW50ZihuYW1lLCA5LCAibG54aHZjJS0yZCIsIGlkKTsKIAltZW1jcHkocHJpdi0+c3J2X25hbWUsIG5hbWUsIDgpOwogCUFTQ0VCQyhwcml2LT5zcnZfbmFtZSwgOCk7CiAKQEAgLTc1MiwxNSArODc3LDE2IEBACiB9CiAKIC8qKgotICogaHZjX2l1Y3ZfaW5pdCgpIC0gSW5pdGlhbGl6YXRpb24gb2YgSFZDIGJhY2tlbmQgZm9yIHovVk0gSVVDVgorICogaHZjX2l1Y3ZfaW5pdCgpIC0gei9WTSBJVUNWIEhWQyBkZXZpY2UgZHJpdmVyIGluaXRpYWxpemF0aW9uCiAgKi8KIHN0YXRpYyBpbnQgX19pbml0IGh2Y19pdWN2X2luaXQodm9pZCkKIHsKLQlpbnQgcmMsIGk7CisJaW50IHJjOworCXVuc2lnbmVkIGludCBpOwogCiAJaWYgKCFNQUNISU5FX0lTX1ZNKSB7Ci0JCXByX3dhcm5pbmcoIlRoZSB6L1ZNIElVQ1YgSHlwZXJ2aXNvciBjb25zb2xlIGNhbm5vdCBiZSAiCi0JCQkgICAidXNlZCB3aXRob3V0IHovVk0uXG4iKTsKKwkJcHJfaW5mbygiVGhlIHovVk0gSVVDViBIVkMgZGV2aWNlIGRyaXZlciBjYW5ub3QgIgorCQkJICAgImJlIHVzZWQgd2l0aG91dCB6L1ZNXG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCkBAIC03NzQsMjYgKzkwMCwzMyBAQAogCQkJCQkgICBzaXplb2Yoc3RydWN0IGl1Y3ZfdHR5X2J1ZmZlciksCiAJCQkJCSAgIDAsIDAsIE5VTEwpOwogCWlmICghaHZjX2l1Y3ZfYnVmZmVyX2NhY2hlKSB7Ci0JCXByX2VycigiTm90IGVub3VnaCBtZW1vcnkgZm9yIGRyaXZlciBpbml0aWFsaXphdGlvbiAiCi0JCQkiKHJzPSVkKS5cbiIsIDEpOworCQlwcl9lcnIoIkFsbG9jYXRpbmcgbWVtb3J5IGZhaWxlZCB3aXRoIHJlYXNvbiBjb2RlPSVkXG4iLCAxKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCiAJaHZjX2l1Y3ZfbWVtcG9vbCA9IG1lbXBvb2xfY3JlYXRlX3NsYWJfcG9vbChNRU1QT09MX01JTl9OUiwKIAkJCQkJCSAgICBodmNfaXVjdl9idWZmZXJfY2FjaGUpOwogCWlmICghaHZjX2l1Y3ZfbWVtcG9vbCkgewotCQlwcl9lcnIoIk5vdCBlbm91Z2ggbWVtb3J5IGZvciBkcml2ZXIgaW5pdGlhbGl6YXRpb24gIgotCQkJIihycz0lZCkuXG4iLCAyKTsKKwkJcHJfZXJyKCJBbGxvY2F0aW5nIG1lbW9yeSBmYWlsZWQgd2l0aCByZWFzb24gY29kZT0lZFxuIiwgMik7CiAJCWttZW1fY2FjaGVfZGVzdHJveShodmNfaXVjdl9idWZmZXJfY2FjaGUpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKKwkvKiByZWdpc3RlciB0aGUgZmlyc3QgdGVybWluYWwgZGV2aWNlIGFzIGNvbnNvbGUKKwkgKiAobXVzdCBiZSBkb25lIGJlZm9yZSBhbGxvY2F0aW5nIGh2YyB0ZXJtaW5hbCBkZXZpY2VzKSAqLworCXJjID0gaHZjX2luc3RhbnRpYXRlKEhWQ19JVUNWX01BR0lDLCBJVUNWX0hWQ19DT05fSURYLCAmaHZjX2l1Y3Zfb3BzKTsKKwlpZiAocmMpIHsKKwkJcHJfZXJyKCJSZWdpc3RlcmluZyBIVkMgdGVybWluYWwgZGV2aWNlIGFzICIKKwkJICAgICAgICJMaW51eCBjb25zb2xlIGZhaWxlZFxuIik7CisJCWdvdG8gb3V0X2Vycm9yX21lbW9yeTsKKwl9CisKIAkvKiBhbGxvY2F0ZSBodmNfaXVjdl9wcml2YXRlIHN0cnVjdHMgKi8KIAlmb3IgKGkgPSAwOyBpIDwgaHZjX2l1Y3ZfZGV2aWNlczsgaSsrKSB7Ci0JCXJjID0gaHZjX2l1Y3ZfYWxsb2MoaSk7CisJCXJjID0gaHZjX2l1Y3ZfYWxsb2MoaSwgKGkgPT0gSVVDVl9IVkNfQ09OX0lEWCkgPyAxIDogMCk7CiAJCWlmIChyYykgewotCQkJcHJfZXJyKCJDb3VsZCBub3QgY3JlYXRlIG5ldyB6L1ZNIElVQ1YgSFZDIGJhY2tlbmQgIgotCQkJCSJyYz0lZC5cbiIsIHJjKTsKKwkJCXByX2VycigiQ3JlYXRpbmcgYSBuZXcgSFZDIHRlcm1pbmFsIGRldmljZSAiCisJCQkJImZhaWxlZCB3aXRoIGVycm9yIGNvZGU9JWRcbiIsIHJjKTsKIAkJCWdvdG8gb3V0X2Vycm9yX2h2YzsKIAkJfQogCX0KQEAgLTgwMSw3ICs5MzQsOCBAQAogCS8qIHJlZ2lzdGVyIElVQ1YgY2FsbGJhY2sgaGFuZGxlciAqLwogCXJjID0gaXVjdl9yZWdpc3RlcigmaHZjX2l1Y3ZfaGFuZGxlciwgMCk7CiAJaWYgKHJjKSB7Ci0JCXByX2VycigiQ291bGQgbm90IHJlZ2lzdGVyIGl1Y3YgaGFuZGxlciAocmM9JWQpLlxuIiwgcmMpOworCQlwcl9lcnIoIlJlZ2lzdGVyaW5nIElVQ1YgaGFuZGxlcnMgZmFpbGVkIHdpdGggZXJyb3IgY29kZT0lZFxuIiwKKwkJCXJjKTsKIAkJZ290byBvdXRfZXJyb3JfaXVjdjsKIAl9CiAKQEAgLTgxNiwyMiArOTUwLDEzIEBACiAJCQkJaHZjX3JlbW92ZShodmNfaXVjdl90YWJsZVtpXS0+aHZjKTsKIAkJCWtmcmVlKGh2Y19pdWN2X3RhYmxlW2ldKTsKIAkJfQorb3V0X2Vycm9yX21lbW9yeToKIAltZW1wb29sX2Rlc3Ryb3koaHZjX2l1Y3ZfbWVtcG9vbCk7CiAJa21lbV9jYWNoZV9kZXN0cm95KGh2Y19pdWN2X2J1ZmZlcl9jYWNoZSk7CiAJcmV0dXJuIHJjOwogfQogCiAvKioKLSAqIGh2Y19pdWN2X2NvbnNvbGVfaW5pdCgpIC0gRWFybHkgY29uc29sZSBpbml0aWFsaXphdGlvbgotICovCi1zdGF0aWMJaW50IF9faW5pdCBodmNfaXVjdl9jb25zb2xlX2luaXQodm9pZCkKLXsKLQlpZiAoIU1BQ0hJTkVfSVNfVk0gfHwgIWh2Y19pdWN2X2RldmljZXMpCi0JCXJldHVybiAtRU5PREVWOwotCXJldHVybiBodmNfaW5zdGFudGlhdGUoSFZDX0lVQ1ZfTUFHSUMsIDAsICZodmNfaXVjdl9vcHMpOwotfQotCi0vKioKICAqIGh2Y19pdWN2X2NvbmZpZygpIC0gUGFyc2luZyBvZiBodmNfaXVjdj0gIGtlcm5lbCBjb21tYW5kIGxpbmUgcGFyYW1ldGVyCiAgKiBAdmFsOglQYXJhbWV0ZXIgdmFsdWUgKG51bWVyaWMpCiAgKi8KQEAgLTg0MSwxMCArOTY2LDUgQEAKIH0KIAogCi1tb2R1bGVfaW5pdChodmNfaXVjdl9pbml0KTsKLWNvbnNvbGVfaW5pdGNhbGwoaHZjX2l1Y3ZfY29uc29sZV9pbml0KTsKK2RldmljZV9pbml0Y2FsbChodmNfaXVjdl9pbml0KTsKIF9fc2V0dXAoImh2Y19pdWN2PSIsIGh2Y19pdWN2X2NvbmZpZyk7Ci0KLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLU1PRFVMRV9ERVNDUklQVElPTigiSFZDIGJhY2stZW5kIGZvciB6L1ZNIElVQ1YuIik7Ci1NT0RVTEVfQVVUSE9SKCJIZW5kcmlrIEJydWVja25lciA8YnJ1ZWNrbmVyQGxpbnV4LnZuZXQuaWJtLmNvbT4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9od19yYW5kb20vbjItZHJ2LmMgYi9kcml2ZXJzL2NoYXIvaHdfcmFuZG9tL24yLWRydi5jCmluZGV4IDg4NTlhZWEuLjliM2UwOWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9od19yYW5kb20vbjItZHJ2LmMKKysrIGIvZHJpdmVycy9jaGFyL2h3X3JhbmRvbS9uMi1kcnYuYwpAQCAtNDgyLDcgKzQ4Miw3IEBACiAJaW50IGk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgU0VMRlRFU1RfQlVGRkVSX1dPUkRTOyBpKyspCi0JCWRldl9lcnIoJm5wLT5vcC0+ZGV2LCAiVGVzdCBidWZmZXIgc2xvdCAlZCBbMHglMDE2bHhdXG4iLAorCQlkZXZfZXJyKCZucC0+b3AtPmRldiwgIlRlc3QgYnVmZmVyIHNsb3QgJWQgWzB4JTAxNmxseF1cbiIsCiAJCQlpLCBucC0+dGVzdF9idWZmZXJbaV0pOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcHMzZmxhc2guYyBiL2RyaXZlcnMvY2hhci9wczNmbGFzaC5jCmluZGV4IDc5YjZmNDYuLmFmYmU0NTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9wczNmbGFzaC5jCisrKyBiL2RyaXZlcnMvY2hhci9wczNmbGFzaC5jCkBAIC00NCw3ICs0NCw3IEBACiAJdTY0IHJlcyA9IHBzM3N0b3JfcmVhZF93cml0ZV9zZWN0b3JzKGRldiwgbHBhciwgc3RhcnRfc2VjdG9yLCBzZWN0b3JzLAogCQkJCQkgICAgIHdyaXRlKTsKIAlpZiAocmVzKSB7Ci0JCWRldl9lcnIoJmRldi0+c2JkLmNvcmUsICIlczoldTogJXMgZmFpbGVkIDB4JWx4XG4iLCBfX2Z1bmNfXywKKwkJZGV2X2VycigmZGV2LT5zYmQuY29yZSwgIiVzOiV1OiAlcyBmYWlsZWQgMHglbGx4XG4iLCBfX2Z1bmNfXywKIAkJCV9fTElORV9fLCB3cml0ZSA/ICJ3cml0ZSIgOiAicmVhZCIsIHJlcyk7CiAJCXJldHVybiAtRUlPOwogCX0KQEAgLTU5LDcgKzU5LDcgQEAKIAogCW1heF9zZWN0b3JzID0gZGV2LT5ib3VuY2Vfc2l6ZSAvIGRldi0+YmxrX3NpemU7CiAJaWYgKHNlY3RvcnMgPiBtYXhfc2VjdG9ycykgewotCQlkZXZfZGJnKCZkZXYtPnNiZC5jb3JlLCAiJXM6JXUgTGltaXRpbmcgc2VjdG9ycyB0byAlbHVcbiIsCisJCWRldl9kYmcoJmRldi0+c2JkLmNvcmUsICIlczoldSBMaW1pdGluZyBzZWN0b3JzIHRvICVsbHVcbiIsCiAJCQlfX2Z1bmNfXywgX19MSU5FX18sIG1heF9zZWN0b3JzKTsKIAkJc2VjdG9ycyA9IG1heF9zZWN0b3JzOwogCX0KQEAgLTE0NCw3ICsxNDQsNyBAQAogCQkJZ290byBmYWlsOwogCQl9CiAKLQkJbiA9IG1pbihyZW1haW5pbmcsIHNlY3RvcnNfcmVhZCpkZXYtPmJsa19zaXplLW9mZnNldCk7CisJCW4gPSBtaW5fdCh1NjQsIHJlbWFpbmluZywgc2VjdG9yc19yZWFkKmRldi0+YmxrX3NpemUtb2Zmc2V0KTsKIAkJZGV2X2RiZygmZGV2LT5zYmQuY29yZSwKIAkJCSIlczoldTogY29weSAlbHUgYnl0ZXMgZnJvbSAweCVwIHRvIHVzZXIgMHglcFxuIiwKIAkJCV9fZnVuY19fLCBfX0xJTkVfXywgbiwgZGV2LT5ib3VuY2VfYnVmK29mZnNldCwgYnVmKTsKQEAgLTIyNSw3ICsyMjUsNyBAQAogCQlpZiAoZW5kX3JlYWRfc2VjdG9yID49IHN0YXJ0X3JlYWRfc2VjdG9yKSB7CiAJCQkvKiBNZXJnZSBoZWFkIGFuZCB0YWlsICovCiAJCQlkZXZfZGJnKCZkZXYtPnNiZC5jb3JlLAotCQkJCSJNZXJnZWQgaGVhZCBhbmQgdGFpbDogJWx1IHNlY3RvcnMgYXQgJWx1XG4iLAorCQkJCSJNZXJnZWQgaGVhZCBhbmQgdGFpbDogJWxsdSBzZWN0b3JzIGF0ICVsbHVcbiIsCiAJCQkJY2h1bmtfc2VjdG9ycywgc3RhcnRfd3JpdGVfc2VjdG9yKTsKIAkJCXJlcyA9IHBzM2ZsYXNoX3JlYWRfc2VjdG9ycyhkZXYsIHN0YXJ0X3dyaXRlX3NlY3RvciwKIAkJCQkJCSAgICBjaHVua19zZWN0b3JzLCAwKTsKQEAgLTIzNSw3ICsyMzUsNyBAQAogCQkJaWYgKGhlYWQpIHsKIAkJCQkvKiBSZWFkIGhlYWQgKi8KIAkJCQlkZXZfZGJnKCZkZXYtPnNiZC5jb3JlLAotCQkJCQkiaGVhZDogJWx1IHNlY3RvcnMgYXQgJWx1XG4iLCBoZWFkLAorCQkJCQkiaGVhZDogJWxsdSBzZWN0b3JzIGF0ICVsbHVcbiIsIGhlYWQsCiAJCQkJCXN0YXJ0X3dyaXRlX3NlY3Rvcik7CiAJCQkJcmVzID0gcHMzZmxhc2hfcmVhZF9zZWN0b3JzKGRldiwKIAkJCQkJCQkgICAgc3RhcnRfd3JpdGVfc2VjdG9yLApAQCAtMjQ3LDcgKzI0Nyw3IEBACiAJCQkgICAgc3RhcnRfd3JpdGVfc2VjdG9yK2NodW5rX3NlY3RvcnMpIHsKIAkJCQkvKiBSZWFkIHRhaWwgKi8KIAkJCQlkZXZfZGJnKCZkZXYtPnNiZC5jb3JlLAotCQkJCQkidGFpbDogJWx1IHNlY3RvcnMgYXQgJWx1XG4iLCB0YWlsLAorCQkJCQkidGFpbDogJWxsdSBzZWN0b3JzIGF0ICVsbHVcbiIsIHRhaWwsCiAJCQkJCXN0YXJ0X3JlYWRfc2VjdG9yKTsKIAkJCQlzZWNfb2ZmID0gc3RhcnRfcmVhZF9zZWN0b3Itc3RhcnRfd3JpdGVfc2VjdG9yOwogCQkJCXJlcyA9IHBzM2ZsYXNoX3JlYWRfc2VjdG9ycyhkZXYsCkBAIC0yNTgsNyArMjU4LDcgQEAKIAkJCX0KIAkJfQogCi0JCW4gPSBtaW4ocmVtYWluaW5nLCBkZXYtPmJvdW5jZV9zaXplLW9mZnNldCk7CisJCW4gPSBtaW5fdCh1NjQsIHJlbWFpbmluZywgZGV2LT5ib3VuY2Vfc2l6ZS1vZmZzZXQpOwogCQlkZXZfZGJnKCZkZXYtPnNiZC5jb3JlLAogCQkJIiVzOiV1OiBjb3B5ICVsdSBieXRlcyBmcm9tIHVzZXIgMHglcCB0byAweCVwXG4iLAogCQkJX19mdW5jX18sIF9fTElORV9fLCBuLCBidWYsIGRldi0+Ym91bmNlX2J1ZitvZmZzZXQpOwpAQCAtMjk5LDExICsyOTksMTEgQEAKIAogCWlmICh0YWcgIT0gZGV2LT50YWcpCiAJCWRldl9lcnIoJmRldi0+c2JkLmNvcmUsCi0JCQkiJXM6JXU6IHRhZyBtaXNtYXRjaCwgZ290ICVseCwgZXhwZWN0ZWQgJWx4XG4iLAorCQkJIiVzOiV1OiB0YWcgbWlzbWF0Y2gsIGdvdCAlbGx4LCBleHBlY3RlZCAlbGx4XG4iLAogCQkJX19mdW5jX18sIF9fTElORV9fLCB0YWcsIGRldi0+dGFnKTsKIAogCWlmIChyZXMpIHsKLQkJZGV2X2VycigmZGV2LT5zYmQuY29yZSwgIiVzOiV1OiByZXM9JWQgc3RhdHVzPTB4JWx4XG4iLAorCQlkZXZfZXJyKCZkZXYtPnNiZC5jb3JlLCAiJXM6JXU6IHJlcz0lZCBzdGF0dXM9MHglbGx4XG4iLAogCQkJX19mdW5jX18sIF9fTElORV9fLCByZXMsIHN0YXR1cyk7CiAJfSBlbHNlIHsKIAkJZGV2LT5sdjFfc3RhdHVzID0gc3RhdHVzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3B0eS5jIGIvZHJpdmVycy9jaGFyL3B0eS5jCmluZGV4IDExMmE2YmEuLjMxMDM4YTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9wdHkuYworKysgYi9kcml2ZXJzL2NoYXIvcHR5LmMKQEAgLTMyLDcgKzMyLDcgQEAKIAogLyogVGhlc2UgYXJlIGdsb2JhbCBiZWNhdXNlIHRoZXkgYXJlIGFjY2Vzc2VkIGluIHR0eV9pby5jICovCiAjaWZkZWYgQ09ORklHX1VOSVg5OF9QVFlTCi1zdHJ1Y3QgdHR5X2RyaXZlciAqcHRtX2RyaXZlcjsKK3N0YXRpYyBzdHJ1Y3QgdHR5X2RyaXZlciAqcHRtX2RyaXZlcjsKIHN0YXRpYyBzdHJ1Y3QgdHR5X2RyaXZlciAqcHRzX2RyaXZlcjsKICNlbmRpZgogCkBAIC0yMzAsOSArMjMwLDcgQEAKIC8qKgogICoJcHR5X2RvX3Jlc2l6ZQkJLQlyZXNpemUgZXZlbnQKICAqCUB0dHk6IHR0eSBiZWluZyByZXNpemVkCi0gKglAcmVhbF90dHk6IHJlYWwgdHR5IChub3QgdGhlIHNhbWUgYXMgdHR5IGlmIHVzaW5nIGEgcHR5L3R0eSBwYWlyKQotICoJQHJvd3M6IHJvd3MgKGNoYXJhY3RlcikKLSAqCUBjb2xzOiBjb2xzIChjaGFyYWN0ZXIpCisgKglAd3M6IHdpbmRvdyBzaXplIGJlaW5nIHNldC4KICAqCiAgKglVcGRhdGUgdGhlIHRlcm1pb3MgdmFyaWFibGVzIGFuZCBzZW5kIHRoZSBuZWNjZXNzYXJ5IHNpZ25hbHMgdG8KICAqCXBlZm9ybSBhIHRlcm1pbmFsIHJlc2l6ZSBjb3JyZWN0bHkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9ydGMuYyBiL2RyaXZlcnMvY2hhci9ydGMuYwppbmRleCAyMGQ2ZWZiLi5lMGQwZjhiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvcnRjLmMKKysrIGIvZHJpdmVycy9jaGFyL3J0Yy5jCkBAIC00OCw5ICs0OCwxMCBAQAogICoJCUNPTkZJR19IUEVUX0VNVUxBVEVfUlRDCiAgKgkxLjEyYQlNYWNpZWogVy4gUm96eWNraTogSGFuZGxlIG1lbW9yeS1tYXBwZWQgY2hpcHMgcHJvcGVybHkuCiAgKgkxLjEyYWMJQWxhbiBDb3g6IEFsbG93IHJlYWQgYWNjZXNzIHRvIHRoZSBkYXkgb2Ygd2VlayByZWdpc3RlcgorICoJMS4xMmIJRGF2aWQgSm9objogUmVtb3ZlIGNhbGxzIHRvIHRoZSBCS0wuCiAgKi8KIAotI2RlZmluZSBSVENfVkVSU0lPTgkJIjEuMTJhYyIKKyNkZWZpbmUgUlRDX1ZFUlNJT04JCSIxLjEyYiIKIAogLyoKICAqCU5vdGUgdGhhdCAqYWxsKiBjYWxscyB0byBDTU9TX1JFQUQgYW5kIENNT1NfV1JJVEUgYXJlIGRvbmUgd2l0aApAQCAtNzMsNyArNzQsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+Ci0jaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KICNpbmNsdWRlIDxsaW51eC9zeXNjdGwuaD4KICNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CiAjaW5jbHVkZSA8bGludXgvYmNkLmg+CkBAIC0xODIsOCArMTgyLDggQEAKIAogLyoKICAqIHJ0Y19zdGF0dXMgaXMgbmV2ZXIgY2hhbmdlZCBieSBydGNfaW50ZXJydXB0LCBhbmQgaW9jdGwvb3Blbi9jbG9zZSBpcwotICogcHJvdGVjdGVkIGJ5IHRoZSBiaWcga2VybmVsIGxvY2suIEhvd2V2ZXIsIGlvY3RsIGNhbiBzdGlsbCBkaXNhYmxlIHRoZSB0aW1lcgotICogaW4gcnRjX3N0YXR1cyBhbmQgdGhlbiB3aXRoIGRlbF90aW1lciBhZnRlciB0aGUgaW50ZXJydXB0IGhhcyByZWFkCisgKiBwcm90ZWN0ZWQgYnkgdGhlIHNwaW4gbG9jayBydGNfbG9jay4gSG93ZXZlciwgaW9jdGwgY2FuIHN0aWxsIGRpc2FibGUgdGhlCisgKiB0aW1lciBpbiBydGNfc3RhdHVzIGFuZCB0aGVuIHdpdGggZGVsX3RpbWVyIGFmdGVyIHRoZSBpbnRlcnJ1cHQgaGFzIHJlYWQKICAqIHJ0Y19zdGF0dXMgYnV0IGJlZm9yZSBtb2RfdGltZXIgaXMgY2FsbGVkLCB3aGljaCB3b3VsZCB0aGVuIHJlZW5hYmxlIHRoZQogICogdGltZXIgKGJ1dCB5b3Ugd291bGQgbmVlZCB0byBoYXZlIGFuIGF3ZnVsIHRpbWluZyBiZWZvcmUgeW91J2QgdHJpcCBvbiBpdCkKICAqLwpAQCAtNzIwLDkgKzcyMCw3IEBACiBzdGF0aWMgbG9uZyBydGNfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQogewogCWxvbmcgcmV0OwotCWxvY2tfa2VybmVsKCk7CiAJcmV0ID0gcnRjX2RvX2lvY3RsKGNtZCwgYXJnLCAwKTsKLQl1bmxvY2tfa2VybmVsKCk7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtNzMxLDEyICs3MjksOCBAQAogICoJQWxzbyBjbGVhciB0aGUgcHJldmlvdXMgaW50ZXJydXB0IGRhdGEgb24gYW4gb3BlbiwgYW5kIGNsZWFuCiAgKgl1cCB0aGluZ3Mgb24gYSBjbG9zZS4KICAqLwotCi0vKiBXZSB1c2UgcnRjX2xvY2sgdG8gcHJvdGVjdCBhZ2FpbnN0IGNvbmN1cnJlbnQgb3BlbnMuIFNvIHRoZSBCS0wgaXMgbm90Ci0gKiBuZWVkZWQgaGVyZS4gT3IgYW55d2hlcmUgZWxzZSBpbiB0aGlzIGRyaXZlci4gKi8KIHN0YXRpYyBpbnQgcnRjX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCiB7Ci0JbG9ja19rZXJuZWwoKTsKIAlzcGluX2xvY2tfaXJxKCZydGNfbG9jayk7CiAKIAlpZiAocnRjX3N0YXR1cyAmIFJUQ19JU19PUEVOKQpAQCAtNzQ2LDEyICs3NDAsMTAgQEAKIAogCXJ0Y19pcnFfZGF0YSA9IDA7CiAJc3Bpbl91bmxvY2tfaXJxKCZydGNfbG9jayk7Ci0JdW5sb2NrX2tlcm5lbCgpOwogCXJldHVybiAwOwogCiBvdXRfYnVzeToKIAlzcGluX3VubG9ja19pcnEoJnJ0Y19sb2NrKTsKLQl1bmxvY2tfa2VybmVsKCk7CiAJcmV0dXJuIC1FQlVTWTsKIH0KIApAQCAtODAwLDcgKzc5Miw2IEBACiB9CiAKICNpZmRlZiBSVENfSVJRCi0vKiBDYWxsZWQgd2l0aG91dCB0aGUga2VybmVsIGxvY2sgLSBmaW5lICovCiBzdGF0aWMgdW5zaWduZWQgaW50IHJ0Y19wb2xsKHN0cnVjdCBmaWxlICpmaWxlLCBwb2xsX3RhYmxlICp3YWl0KQogewogCXVuc2lnbmVkIGxvbmcgbDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9zZXJfYTIyMzIuYyBiL2RyaXZlcnMvY2hhci9zZXJfYTIyMzIuYwppbmRleCAzMzg3MmEyLi4zM2EyYjUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvc2VyX2EyMjMyLmMKKysrIGIvZHJpdmVycy9jaGFyL3Nlcl9hMjIzMi5jCkBAIC03MTgsNiArNzE4LDcgQEAKIAl1X2NoYXIgKmZyb207CiAJdm9sYXRpbGUgdV9jaGFyICp0bzsKIAl2b2xhdGlsZSBzdHJ1Y3QgYTIyMzJtZW1vcnkgKm1lbTsKKwlpbnQgZXJyb3IsIGk7CiAKICNpZmRlZiBDT05GSUdfU01QCiAJcmV0dXJuIC1FTk9ERVY7CS8qIFRoaXMgZHJpdmVyIGlzIG5vdCBTTVAgYXdhcmUuIElzIHRoZXJlIGFuIFNNUCBab3Jyb0lJLWJ1cy1tYWNoaW5lPyAqLwpAQCAtNzk3LDggKzc5OCwxNSBAQAogCSovCiAJaWYgKGEyMjMyX2luaXRfZHJpdmVycygpKSByZXR1cm4gLUVOT0RFVjsgLy8gbWF5YmUgd2Ugc2hvdWxkIHVzZSBhIGRpZmZlcmVudCAtRXh4eD8KIAotCXJlcXVlc3RfaXJxKElSUV9BTUlHQV9WRVJUQiwgYTIyMzJfdmJsX2ludGVyLCAwLCAiQTIyMzIgc2VyaWFsIFZCTCIsIGEyMjMyX2RyaXZlcl9JRCk7Ci0JcmV0dXJuIDA7CisJZXJyb3IgPSByZXF1ZXN0X2lycShJUlFfQU1JR0FfVkVSVEIsIGEyMjMyX3ZibF9pbnRlciwgMCwKKwkJCSAgICAiQTIyMzIgc2VyaWFsIFZCTCIsIGEyMjMyX2RyaXZlcl9JRCk7CisJaWYgKGVycm9yKSB7CisJCWZvciAoaSA9IDA7IGkgPCBucl9hMjIzMjsgaSsrKQorCQkJem9ycm9fcmVsZWFzZV9kZXZpY2UoemRfYTIyMzJbaV0pOworCQl0dHlfdW5yZWdpc3Rlcl9kcml2ZXIoYTIyMzJfZHJpdmVyKTsKKwkJcHV0X3R0eV9kcml2ZXIoYTIyMzJfZHJpdmVyKTsKKwl9CisJcmV0dXJuIGVycm9yOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgYTIyMzJib2FyZF9leGl0KHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvc3luY2xpbmtfZ3QuYyBiL2RyaXZlcnMvY2hhci9zeW5jbGlua19ndC5jCmluZGV4IDUzNTQ0ZTIuLmYzMjlmNDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9zeW5jbGlua19ndC5jCisrKyBiL2RyaXZlcnMvY2hhci9zeW5jbGlua19ndC5jCkBAIC0xLDYgKzEsNCBAQAogLyoKLSAqICRJZDogc3luY2xpbmtfZ3QuYyx2IDQuNTAgMjAwNy8wNy8yNSAxOToyOToyNSBwYXVsa2YgRXhwICQKLSAqCiAgKiBEZXZpY2UgZHJpdmVyIGZvciBNaWNyb2dhdGUgU3luY0xpbmsgR1Qgc2VyaWFsIGFkYXB0ZXJzLgogICoKICAqIHdyaXR0ZW4gYnkgUGF1bCBGdWxnaHVtIGZvciBNaWNyb2dhdGUgQ29ycG9yYXRpb24KQEAgLTkxLDcgKzg5LDYgQEAKICAqIG1vZHVsZSBpZGVudGlmaWNhdGlvbgogICovCiBzdGF0aWMgY2hhciAqZHJpdmVyX25hbWUgICAgID0gIlN5bmNMaW5rIEdUIjsKLXN0YXRpYyBjaGFyICpkcml2ZXJfdmVyc2lvbiAgPSAiJFJldmlzaW9uOiA0LjUwICQiOwogc3RhdGljIGNoYXIgKnR0eV9kcml2ZXJfbmFtZSA9ICJzeW5jbGlua19ndCI7CiBzdGF0aWMgY2hhciAqdHR5X2Rldl9wcmVmaXggID0gInR0eVNMRyI7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CkBAIC0xMzA5LDcgKzEzMDYsNyBAQAogCW9mZl90CWJlZ2luID0gMDsKIAlzdHJ1Y3Qgc2xndF9pbmZvICppbmZvOwogCi0JbGVuICs9IHNwcmludGYocGFnZSwgInN5bmNsaW5rX2d0IGRyaXZlcjolc1xuIiwgZHJpdmVyX3ZlcnNpb24pOworCWxlbiArPSBzcHJpbnRmKHBhZ2UsICJzeW5jbGlua19ndCBkcml2ZXJcbiIpOwogCiAJaW5mbyA9IHNsZ3RfZGV2aWNlX2xpc3Q7CiAJd2hpbGUoIGluZm8gKSB7CkBAIC0yNDQxLDcgKzI0MzgsNyBAQAogCWluZm8tPnJpX2Noa2NvdW50ID0gMDsKIAlpbmZvLT5kc3JfY2hrY291bnQgPSAwOwogCi0Jc2xndF9pcnFfb24oaW5mbywgSVJRX0RDRCB8IElSUV9DVFMgfCBJUlFfRFNSKTsKKwlzbGd0X2lycV9vbihpbmZvLCBJUlFfRENEIHwgSVJRX0NUUyB8IElSUV9EU1IgfCBJUlFfUkkpOwogCWdldF9zaWduYWxzKGluZm8pOwogCiAJaWYgKGluZm8tPm5ldGNvdW50IHx8CkBAIC0zNTc2LDcgKzM1NzMsNyBAQAogCXN0cnVjdCBzbGd0X2luZm8gKmluZm87CiAJc3RydWN0IHNsZ3RfaW5mbyAqdG1wOwogCi0JcHJpbnRrKCJ1bmxvYWQgJXMgJXNcbiIsIGRyaXZlcl9uYW1lLCBkcml2ZXJfdmVyc2lvbik7CisJcHJpbnRrKEtFUk5fSU5GTyAidW5sb2FkICVzXG4iLCBkcml2ZXJfbmFtZSk7CiAKIAlpZiAoc2VyaWFsX2RyaXZlcikgewogCQlmb3IgKGluZm89c2xndF9kZXZpY2VfbGlzdCA7IGluZm8gIT0gTlVMTCA7IGluZm89aW5mby0+bmV4dF9kZXZpY2UpCkBAIC0zNjE5LDcgKzM2MTYsNyBAQAogewogCWludCByYzsKIAotIAlwcmludGsoIiVzICVzXG4iLCBkcml2ZXJfbmFtZSwgZHJpdmVyX3ZlcnNpb24pOworCXByaW50ayhLRVJOX0lORk8gIiVzXG4iLCBkcml2ZXJfbmFtZSk7CiAKIAlzZXJpYWxfZHJpdmVyID0gYWxsb2NfdHR5X2RyaXZlcihNQVhfREVWSUNFUyk7CiAJaWYgKCFzZXJpYWxfZHJpdmVyKSB7CkBAIC0zNjUwLDkgKzM2NDcsOCBAQAogCQlnb3RvIGVycm9yOwogCX0KIAotIAlwcmludGsoIiVzICVzLCB0dHkgbWFqb3IjJWRcbiIsCi0JCWRyaXZlcl9uYW1lLCBkcml2ZXJfdmVyc2lvbiwKLQkJc2VyaWFsX2RyaXZlci0+bWFqb3IpOworCXByaW50ayhLRVJOX0lORk8gIiVzLCB0dHkgbWFqb3IjJWRcbiIsCisJICAgICAgIGRyaXZlcl9uYW1lLCBzZXJpYWxfZHJpdmVyLT5tYWpvcik7CiAKIAlzbGd0X2RldmljZV9jb3VudCA9IDA7CiAJaWYgKChyYyA9IHBjaV9yZWdpc3Rlcl9kcml2ZXIoJnBjaV9kcml2ZXIpKSA8IDApIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9zeXNycS5jIGIvZHJpdmVycy9jaGFyL3N5c3JxLmMKaW5kZXggZDQxYjlmNi4uMzNhOTM1MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3N5c3JxLmMKKysrIGIvZHJpdmVycy9jaGFyL3N5c3JxLmMKQEAgLTQ3Myw2ICs0NzMsMTIgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnN5c3JxX2tleV90YWJsZV9sb2NrLCBmbGFncyk7CisJLyoKKwkgKiBSYWlzZSB0aGUgYXBwYXJlbnQgbG9nbGV2ZWwgdG8gbWF4aW11bSBzbyB0aGF0IHRoZSBzeXNycSBoZWFkZXIKKwkgKiBpcyBzaG93biB0byBwcm92aWRlIHRoZSB1c2VyIHdpdGggcG9zaXRpdmUgZmVlZGJhY2suICBXZSBkbyBub3QKKwkgKiBzaW1wbHkgZW1pdCB0aGlzIGF0IEtFUk5fRU1FUkcgYXMgdGhhdCB3b3VsZCBjaGFuZ2UgbWVzc2FnZQorCSAqIHJvdXRpbmcgaW4gdGhlIGNvbnN1bWVycyBvZiAvcHJvYy9rbXNnLgorCSAqLwogCW9yaWdfbG9nX2xldmVsID0gY29uc29sZV9sb2dsZXZlbDsKIAljb25zb2xlX2xvZ2xldmVsID0gNzsKIAlwcmludGsoS0VSTl9JTkZPICJTeXNScSA6ICIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3RwbS90cG1fYmlvcy5jIGIvZHJpdmVycy9jaGFyL3RwbS90cG1fYmlvcy5jCmluZGV4IDY4ZjA1MmIuLmVkMzA2ZWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci90cG0vdHBtX2Jpb3MuYworKysgYi9kcml2ZXJzL2NoYXIvdHBtL3RwbV9iaW9zLmMKQEAgLTIzLDggKzIzLDYgQEAKICNpbmNsdWRlIDxsaW51eC9zZWN1cml0eS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgotI2luY2x1ZGUgPGFjcGkvYWN0eXBlcy5oPgotI2luY2x1ZGUgPGFjcGkvYWN0YmwuaD4KICNpbmNsdWRlICJ0cG0uaCIKIAogI2RlZmluZSBUQ0dfRVZFTlRfTkFNRV9MRU5fTUFYCTI1NQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3RwbS90cG1fbnNjLmMgYi9kcml2ZXJzL2NoYXIvdHBtL3RwbV9uc2MuYwppbmRleCBhYjE4YzFlLi43MGVmYmEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvdHBtL3RwbV9uc2MuYworKysgYi9kcml2ZXJzL2NoYXIvdHBtL3RwbV9uc2MuYwpAQCAtMjczLDEyICsyNzMsMjMgQEAKIAl9CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgZGV2aWNlX2RyaXZlciBuc2NfZHJ2ID0gewotCS5uYW1lID0gInRwbV9uc2MiLAotCS5idXMgPSAmcGxhdGZvcm1fYnVzX3R5cGUsCi0JLm93bmVyID0gVEhJU19NT0RVTEUsCi0JLnN1c3BlbmQgPSB0cG1fcG1fc3VzcGVuZCwKLQkucmVzdW1lID0gdHBtX3BtX3Jlc3VtZSwKK3N0YXRpYyBpbnQgdHBtX25zY19zdXNwZW5kKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldiwgcG1fbWVzc2FnZV90IG1zZykKK3sKKwlyZXR1cm4gdHBtX3BtX3N1c3BlbmQoJmRldi0+ZGV2LCBtc2cpOworfQorCitzdGF0aWMgaW50IHRwbV9uc2NfcmVzdW1lKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gdHBtX3BtX3Jlc3VtZSgmZGV2LT5kZXYpOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBuc2NfZHJ2ID0geworCS5zdXNwZW5kICAgICAgICAgPSB0cG1fbnNjX3N1c3BlbmQsCisJLnJlc3VtZSAgICAgICAgICA9IHRwbV9uc2NfcmVzdW1lLAorCS5kcml2ZXIgICAgICAgICAgPSB7CisJCS5uYW1lICAgID0gInRwbV9uc2MiLAorCQkub3duZXIgICA9IFRISVNfTU9EVUxFLAorCX0sCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBpbml0X25zYyh2b2lkKQpAQCAtMjk3LDcgKzMwOCw3IEBACiAJCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKLQllcnIgPSBkcml2ZXJfcmVnaXN0ZXIoJm5zY19kcnYpOworCWVyciA9IHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmbnNjX2Rydik7CiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKIApAQCAtMzA4LDE3ICszMTksMTUgQEAKIAkvKiBlbmFibGUgdGhlIERQTSBtb2R1bGUgKi8KIAl0cG1fd3JpdGVfaW5kZXgobnNjQWRkckJhc2UsIE5TQ19MRENfSU5ERVgsIDB4MDEpOwogCi0JcGRldiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UpLCBHRlBfS0VSTkVMKTsKKwlwZGV2ID0gcGxhdGZvcm1fZGV2aWNlX2FsbG9jKCJ0cG1fbnNjbDAiLCAtMSk7CiAJaWYgKCFwZGV2KSB7CiAJCXJjID0gLUVOT01FTTsKIAkJZ290byBlcnJfdW5yZWdfZHJ2OwogCX0KIAotCXBkZXYtPm5hbWUgPSAidHBtX25zY2wwIjsKLQlwZGV2LT5pZCA9IC0xOwogCXBkZXYtPm51bV9yZXNvdXJjZXMgPSAwOworCXBkZXYtPmRldi5kcml2ZXIgPSAmbnNjX2Rydi5kcml2ZXI7CiAJcGRldi0+ZGV2LnJlbGVhc2UgPSB0cG1fbnNjX3JlbW92ZTsKLQlwZGV2LT5kZXYuZHJpdmVyID0gJm5zY19kcnY7CiAKIAlpZiAoKHJjID0gcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKHBkZXYpKSA8IDApCiAJCWdvdG8gZXJyX2ZyZWVfZGV2OwpAQCAtMzc3LDcgKzM4Niw3IEBACiBlcnJfZnJlZV9kZXY6CiAJa2ZyZWUocGRldik7CiBlcnJfdW5yZWdfZHJ2OgotCWRyaXZlcl91bnJlZ2lzdGVyKCZuc2NfZHJ2KTsKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmbnNjX2Rydik7CiAJcmV0dXJuIHJjOwogfQogCkBAIC0zOTAsNyArMzk5LDcgQEAKIAkJcGRldiA9IE5VTEw7CiAJfQogCi0JZHJpdmVyX3VucmVnaXN0ZXIoJm5zY19kcnYpOworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZuc2NfZHJ2KTsKIH0KIAogbW9kdWxlX2luaXQoaW5pdF9uc2MpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3R0eV9pb2N0bC5jIGIvZHJpdmVycy9jaGFyL3R0eV9pb2N0bC5jCmluZGV4IGE0MDhjOGUuLjZmNGM3ZDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci90dHlfaW9jdGwuYworKysgYi9kcml2ZXJzL2NoYXIvdHR5X2lvY3RsLmMKQEAgLTEwNTcsNyArMTA1Nyw3IEBACiAJaWYgKHJldHZhbCkKIAkJcmV0dXJuIHJldHZhbDsKIAotCWxkID0gdHR5X2xkaXNjX3JlZih0dHkpOworCWxkID0gdHR5X2xkaXNjX3JlZl93YWl0KHR0eSk7CiAJc3dpdGNoIChhcmcpIHsKIAljYXNlIFRDSUZMVVNIOgogCQlpZiAobGQgJiYgbGQtPm9wcy0+Zmx1c2hfYnVmZmVyKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3ZtZV9zY2MuYyBiL2RyaXZlcnMvY2hhci92bWVfc2NjLmMKaW5kZXggMGU4MjM0Yi4uOTk0ZTFhNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3ZtZV9zY2MuYworKysgYi9kcml2ZXJzL2NoYXIvdm1lX3NjYy5jCkBAIC0xOTgsNiArMTk4LDcgQEAKIHN0YXRpYyBpbnQgbXZtZTE0N19zY2NfaW5pdCh2b2lkKQogewogCXN0cnVjdCBzY2NfcG9ydCAqcG9ydDsKKwlpbnQgZXJyb3I7CiAKIAlwcmludGsoS0VSTl9JTkZPICJTQ0M6IE1WTUUxNDcgU2VyaWFsIERyaXZlclxuIik7CiAJLyogSW5pdCBjaGFubmVsIEEgKi8KQEAgLTIwNywxNCArMjA4LDIzIEBACiAJcG9ydC0+ZGF0YXAgPSBwb3J0LT5jdHJscCArIDE7CiAJcG9ydC0+cG9ydF9hID0gJnNjY19wb3J0c1swXTsKIAlwb3J0LT5wb3J0X2IgPSAmc2NjX3BvcnRzWzFdOwotCXJlcXVlc3RfaXJxKE1WTUUxNDdfSVJRX1NDQ0FfVFgsIHNjY190eF9pbnQsIElSUUZfRElTQUJMRUQsCisJZXJyb3IgPSByZXF1ZXN0X2lycShNVk1FMTQ3X0lSUV9TQ0NBX1RYLCBzY2NfdHhfaW50LCBJUlFGX0RJU0FCTEVELAogCQkgICAgICAgICAgICAiU0NDLUEgVFgiLCBwb3J0KTsKLQlyZXF1ZXN0X2lycShNVk1FMTQ3X0lSUV9TQ0NBX1NUQVQsIHNjY19zdGF0X2ludCwgSVJRRl9ESVNBQkxFRCwKKwlpZiAoZXJyb3IpCisJCWdvdG8gZmFpbDsKKwllcnJvciA9IHJlcXVlc3RfaXJxKE1WTUUxNDdfSVJRX1NDQ0FfU1RBVCwgc2NjX3N0YXRfaW50LCBJUlFGX0RJU0FCTEVELAogCQkgICAgICAgICAgICAiU0NDLUEgc3RhdHVzIiwgcG9ydCk7Ci0JcmVxdWVzdF9pcnEoTVZNRTE0N19JUlFfU0NDQV9SWCwgc2NjX3J4X2ludCwgSVJRRl9ESVNBQkxFRCwKKwlpZiAoZXJyb3IpCisJCWdvdG8gZmFpbF9mcmVlX2FfdHg7CisJZXJyb3IgPSByZXF1ZXN0X2lycShNVk1FMTQ3X0lSUV9TQ0NBX1JYLCBzY2NfcnhfaW50LCBJUlFGX0RJU0FCTEVELAogCQkgICAgICAgICAgICAiU0NDLUEgUlgiLCBwb3J0KTsKLQlyZXF1ZXN0X2lycShNVk1FMTQ3X0lSUV9TQ0NBX1NQQ09ORCwgc2NjX3NwY29uZF9pbnQsIElSUUZfRElTQUJMRUQsCi0JCSAgICAgICAgICAgICJTQ0MtQSBzcGVjaWFsIGNvbmQiLCBwb3J0KTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gZmFpbF9mcmVlX2Ffc3RhdDsKKwllcnJvciA9IHJlcXVlc3RfaXJxKE1WTUUxNDdfSVJRX1NDQ0FfU1BDT05ELCBzY2Nfc3Bjb25kX2ludCwKKwkJCSAgICBJUlFGX0RJU0FCTEVELCAiU0NDLUEgc3BlY2lhbCBjb25kIiwgcG9ydCk7CisJaWYgKGVycm9yKQorCQlnb3RvIGZhaWxfZnJlZV9hX3J4OworCiAJewogCQlTQ0NfQUNDRVNTX0lOSVQocG9ydCk7CiAKQEAgLTIzNCwxNCArMjQ0LDIzIEBACiAJcG9ydC0+ZGF0YXAgPSBwb3J0LT5jdHJscCArIDE7CiAJcG9ydC0+cG9ydF9hID0gJnNjY19wb3J0c1swXTsKIAlwb3J0LT5wb3J0X2IgPSAmc2NjX3BvcnRzWzFdOwotCXJlcXVlc3RfaXJxKE1WTUUxNDdfSVJRX1NDQ0JfVFgsIHNjY190eF9pbnQsIElSUUZfRElTQUJMRUQsCisJZXJyb3IgPSByZXF1ZXN0X2lycShNVk1FMTQ3X0lSUV9TQ0NCX1RYLCBzY2NfdHhfaW50LCBJUlFGX0RJU0FCTEVELAogCQkgICAgICAgICAgICAiU0NDLUIgVFgiLCBwb3J0KTsKLQlyZXF1ZXN0X2lycShNVk1FMTQ3X0lSUV9TQ0NCX1NUQVQsIHNjY19zdGF0X2ludCwgSVJRRl9ESVNBQkxFRCwKKwlpZiAoZXJyb3IpCisJCWdvdG8gZmFpbF9mcmVlX2Ffc3Bjb25kOworCWVycm9yID0gcmVxdWVzdF9pcnEoTVZNRTE0N19JUlFfU0NDQl9TVEFULCBzY2Nfc3RhdF9pbnQsIElSUUZfRElTQUJMRUQsCiAJCSAgICAgICAgICAgICJTQ0MtQiBzdGF0dXMiLCBwb3J0KTsKLQlyZXF1ZXN0X2lycShNVk1FMTQ3X0lSUV9TQ0NCX1JYLCBzY2NfcnhfaW50LCBJUlFGX0RJU0FCTEVELAorCWlmIChlcnJvcikKKwkJZ290byBmYWlsX2ZyZWVfYl90eDsKKwllcnJvciA9IHJlcXVlc3RfaXJxKE1WTUUxNDdfSVJRX1NDQ0JfUlgsIHNjY19yeF9pbnQsIElSUUZfRElTQUJMRUQsCiAJCSAgICAgICAgICAgICJTQ0MtQiBSWCIsIHBvcnQpOwotCXJlcXVlc3RfaXJxKE1WTUUxNDdfSVJRX1NDQ0JfU1BDT05ELCBzY2Nfc3Bjb25kX2ludCwgSVJRRl9ESVNBQkxFRCwKLQkJICAgICAgICAgICAgIlNDQy1CIHNwZWNpYWwgY29uZCIsIHBvcnQpOworCWlmIChlcnJvcikKKwkJZ290byBmYWlsX2ZyZWVfYl9zdGF0OworCWVycm9yID0gcmVxdWVzdF9pcnEoTVZNRTE0N19JUlFfU0NDQl9TUENPTkQsIHNjY19zcGNvbmRfaW50LAorCQkJICAgIElSUUZfRElTQUJMRUQsICJTQ0MtQiBzcGVjaWFsIGNvbmQiLCBwb3J0KTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gZmFpbF9mcmVlX2Jfcng7CisKIAl7CiAJCVNDQ19BQ0NFU1NfSU5JVChwb3J0KTsKIApAQCAtMjU3LDYgKzI3NiwyMyBAQAogCXNjY19pbml0X2RyaXZlcnMoKTsKIAogCXJldHVybiAwOworCitmYWlsX2ZyZWVfYl9yeDoKKwlmcmVlX2lycShNVk1FMTQ3X0lSUV9TQ0NCX1JYLCBwb3J0KTsKK2ZhaWxfZnJlZV9iX3N0YXQ6CisJZnJlZV9pcnEoTVZNRTE0N19JUlFfU0NDQl9TVEFULCBwb3J0KTsKK2ZhaWxfZnJlZV9iX3R4OgorCWZyZWVfaXJxKE1WTUUxNDdfSVJRX1NDQ0JfVFgsIHBvcnQpOworZmFpbF9mcmVlX2Ffc3Bjb25kOgorCWZyZWVfaXJxKE1WTUUxNDdfSVJRX1NDQ0FfU1BDT05ELCBwb3J0KTsKK2ZhaWxfZnJlZV9hX3J4OgorCWZyZWVfaXJxKE1WTUUxNDdfSVJRX1NDQ0FfUlgsIHBvcnQpOworZmFpbF9mcmVlX2Ffc3RhdDoKKwlmcmVlX2lycShNVk1FMTQ3X0lSUV9TQ0NBX1NUQVQsIHBvcnQpOworZmFpbF9mcmVlX2FfdHg6CisJZnJlZV9pcnEoTVZNRTE0N19JUlFfU0NDQV9UWCwgcG9ydCk7CitmYWlsOgorCXJldHVybiBlcnJvcjsKIH0KICNlbmRpZgogCkBAIC0yNjUsNiArMzAxLDcgQEAKIHN0YXRpYyBpbnQgbXZtZTE2Ml9zY2NfaW5pdCh2b2lkKQogewogCXN0cnVjdCBzY2NfcG9ydCAqcG9ydDsKKwlpbnQgZXJyb3I7CiAKIAlpZiAoIShtdm1lMTZ4X2NvbmZpZyAmIE1WTUUxNnhfQ09ORklHX0dPVF9TQ0NBKSkKIAkJcmV0dXJuICgtRU5PREVWKTsKQEAgLTI3NywxNCArMzE0LDIzIEBACiAJcG9ydC0+ZGF0YXAgPSBwb3J0LT5jdHJscCArIDI7CiAJcG9ydC0+cG9ydF9hID0gJnNjY19wb3J0c1swXTsKIAlwb3J0LT5wb3J0X2IgPSAmc2NjX3BvcnRzWzFdOwotCXJlcXVlc3RfaXJxKE1WTUUxNjJfSVJRX1NDQ0FfVFgsIHNjY190eF9pbnQsIElSUUZfRElTQUJMRUQsCisJZXJyb3IgPSByZXF1ZXN0X2lycShNVk1FMTYyX0lSUV9TQ0NBX1RYLCBzY2NfdHhfaW50LCBJUlFGX0RJU0FCTEVELAogCQkgICAgICAgICAgICAiU0NDLUEgVFgiLCBwb3J0KTsKLQlyZXF1ZXN0X2lycShNVk1FMTYyX0lSUV9TQ0NBX1NUQVQsIHNjY19zdGF0X2ludCwgSVJRRl9ESVNBQkxFRCwKKwlpZiAoZXJyb3IpCisJCWdvdG8gZmFpbDsKKwllcnJvciA9IHJlcXVlc3RfaXJxKE1WTUUxNjJfSVJRX1NDQ0FfU1RBVCwgc2NjX3N0YXRfaW50LCBJUlFGX0RJU0FCTEVELAogCQkgICAgICAgICAgICAiU0NDLUEgc3RhdHVzIiwgcG9ydCk7Ci0JcmVxdWVzdF9pcnEoTVZNRTE2Ml9JUlFfU0NDQV9SWCwgc2NjX3J4X2ludCwgSVJRRl9ESVNBQkxFRCwKKwlpZiAoZXJyb3IpCisJCWdvdG8gZmFpbF9mcmVlX2FfdHg7CisJZXJyb3IgPSByZXF1ZXN0X2lycShNVk1FMTYyX0lSUV9TQ0NBX1JYLCBzY2NfcnhfaW50LCBJUlFGX0RJU0FCTEVELAogCQkgICAgICAgICAgICAiU0NDLUEgUlgiLCBwb3J0KTsKLQlyZXF1ZXN0X2lycShNVk1FMTYyX0lSUV9TQ0NBX1NQQ09ORCwgc2NjX3NwY29uZF9pbnQsIElSUUZfRElTQUJMRUQsCi0JCSAgICAgICAgICAgICJTQ0MtQSBzcGVjaWFsIGNvbmQiLCBwb3J0KTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gZmFpbF9mcmVlX2Ffc3RhdDsKKwllcnJvciA9IHJlcXVlc3RfaXJxKE1WTUUxNjJfSVJRX1NDQ0FfU1BDT05ELCBzY2Nfc3Bjb25kX2ludCwKKwkJCSAgICBJUlFGX0RJU0FCTEVELCAiU0NDLUEgc3BlY2lhbCBjb25kIiwgcG9ydCk7CisJaWYgKGVycm9yKQorCQlnb3RvIGZhaWxfZnJlZV9hX3J4OworCiAJewogCQlTQ0NfQUNDRVNTX0lOSVQocG9ydCk7CiAKQEAgLTMwNCwxNCArMzUwLDIyIEBACiAJcG9ydC0+ZGF0YXAgPSBwb3J0LT5jdHJscCArIDI7CiAJcG9ydC0+cG9ydF9hID0gJnNjY19wb3J0c1swXTsKIAlwb3J0LT5wb3J0X2IgPSAmc2NjX3BvcnRzWzFdOwotCXJlcXVlc3RfaXJxKE1WTUUxNjJfSVJRX1NDQ0JfVFgsIHNjY190eF9pbnQsIElSUUZfRElTQUJMRUQsCisJZXJyb3IgPSByZXF1ZXN0X2lycShNVk1FMTYyX0lSUV9TQ0NCX1RYLCBzY2NfdHhfaW50LCBJUlFGX0RJU0FCTEVELAogCQkgICAgICAgICAgICAiU0NDLUIgVFgiLCBwb3J0KTsKLQlyZXF1ZXN0X2lycShNVk1FMTYyX0lSUV9TQ0NCX1NUQVQsIHNjY19zdGF0X2ludCwgSVJRRl9ESVNBQkxFRCwKKwlpZiAoZXJyb3IpCisJCWdvdG8gZmFpbF9mcmVlX2Ffc3Bjb25kOworCWVycm9yID0gcmVxdWVzdF9pcnEoTVZNRTE2Ml9JUlFfU0NDQl9TVEFULCBzY2Nfc3RhdF9pbnQsIElSUUZfRElTQUJMRUQsCiAJCSAgICAgICAgICAgICJTQ0MtQiBzdGF0dXMiLCBwb3J0KTsKLQlyZXF1ZXN0X2lycShNVk1FMTYyX0lSUV9TQ0NCX1JYLCBzY2NfcnhfaW50LCBJUlFGX0RJU0FCTEVELAorCWlmIChlcnJvcikKKwkJZ290byBmYWlsX2ZyZWVfYl90eDsKKwllcnJvciA9IHJlcXVlc3RfaXJxKE1WTUUxNjJfSVJRX1NDQ0JfUlgsIHNjY19yeF9pbnQsIElSUUZfRElTQUJMRUQsCiAJCSAgICAgICAgICAgICJTQ0MtQiBSWCIsIHBvcnQpOwotCXJlcXVlc3RfaXJxKE1WTUUxNjJfSVJRX1NDQ0JfU1BDT05ELCBzY2Nfc3Bjb25kX2ludCwgSVJRRl9ESVNBQkxFRCwKLQkJICAgICAgICAgICAgIlNDQy1CIHNwZWNpYWwgY29uZCIsIHBvcnQpOworCWlmIChlcnJvcikKKwkJZ290byBmYWlsX2ZyZWVfYl9zdGF0OworCWVycm9yID0gcmVxdWVzdF9pcnEoTVZNRTE2Ml9JUlFfU0NDQl9TUENPTkQsIHNjY19zcGNvbmRfaW50LAorCQkJICAgIElSUUZfRElTQUJMRUQsICJTQ0MtQiBzcGVjaWFsIGNvbmQiLCBwb3J0KTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gZmFpbF9mcmVlX2Jfcng7CiAKIAl7CiAJCVNDQ19BQ0NFU1NfSU5JVChwb3J0KTsJLyogRWl0aGVyIGNoYW5uZWwgd2lsbCBkbyAqLwpAQCAtMzI4LDYgKzM4MiwyMyBAQAogCXNjY19pbml0X2RyaXZlcnMoKTsKIAogCXJldHVybiAwOworCitmYWlsX2ZyZWVfYl9yeDoKKwlmcmVlX2lycShNVk1FMTYyX0lSUV9TQ0NCX1JYLCBwb3J0KTsKK2ZhaWxfZnJlZV9iX3N0YXQ6CisJZnJlZV9pcnEoTVZNRTE2Ml9JUlFfU0NDQl9TVEFULCBwb3J0KTsKK2ZhaWxfZnJlZV9iX3R4OgorCWZyZWVfaXJxKE1WTUUxNjJfSVJRX1NDQ0JfVFgsIHBvcnQpOworZmFpbF9mcmVlX2Ffc3Bjb25kOgorCWZyZWVfaXJxKE1WTUUxNjJfSVJRX1NDQ0FfU1BDT05ELCBwb3J0KTsKK2ZhaWxfZnJlZV9hX3J4OgorCWZyZWVfaXJxKE1WTUUxNjJfSVJRX1NDQ0FfUlgsIHBvcnQpOworZmFpbF9mcmVlX2Ffc3RhdDoKKwlmcmVlX2lycShNVk1FMTYyX0lSUV9TQ0NBX1NUQVQsIHBvcnQpOworZmFpbF9mcmVlX2FfdHg6CisJZnJlZV9pcnEoTVZNRTE2Ml9JUlFfU0NDQV9UWCwgcG9ydCk7CitmYWlsOgorCXJldHVybiBlcnJvcjsKIH0KICNlbmRpZgogCkBAIC0zMzYsNiArNDA3LDcgQEAKIHN0YXRpYyBpbnQgYnZtZTYwMDBfc2NjX2luaXQodm9pZCkKIHsKIAlzdHJ1Y3Qgc2NjX3BvcnQgKnBvcnQ7CisJaW50IGVycm9yOwogCiAJcHJpbnRrKEtFUk5fSU5GTyAiU0NDOiBCVk1FNjAwMCBTZXJpYWwgRHJpdmVyXG4iKTsKIAkvKiBJbml0IGNoYW5uZWwgQSAqLwpAQCAtMzQ1LDE0ICs0MTcsMjMgQEAKIAlwb3J0LT5kYXRhcCA9IHBvcnQtPmN0cmxwICsgNDsKIAlwb3J0LT5wb3J0X2EgPSAmc2NjX3BvcnRzWzBdOwogCXBvcnQtPnBvcnRfYiA9ICZzY2NfcG9ydHNbMV07Ci0JcmVxdWVzdF9pcnEoQlZNRV9JUlFfU0NDQV9UWCwgc2NjX3R4X2ludCwgSVJRRl9ESVNBQkxFRCwKKwllcnJvciA9IHJlcXVlc3RfaXJxKEJWTUVfSVJRX1NDQ0FfVFgsIHNjY190eF9pbnQsIElSUUZfRElTQUJMRUQsCiAJCSAgICAgICAgICAgICJTQ0MtQSBUWCIsIHBvcnQpOwotCXJlcXVlc3RfaXJxKEJWTUVfSVJRX1NDQ0FfU1RBVCwgc2NjX3N0YXRfaW50LCBJUlFGX0RJU0FCTEVELAorCWlmIChlcnJvcikKKwkJZ290byBmYWlsOworCWVycm9yID0gcmVxdWVzdF9pcnEoQlZNRV9JUlFfU0NDQV9TVEFULCBzY2Nfc3RhdF9pbnQsIElSUUZfRElTQUJMRUQsCiAJCSAgICAgICAgICAgICJTQ0MtQSBzdGF0dXMiLCBwb3J0KTsKLQlyZXF1ZXN0X2lycShCVk1FX0lSUV9TQ0NBX1JYLCBzY2NfcnhfaW50LCBJUlFGX0RJU0FCTEVELAorCWlmIChlcnJvcikKKwkJZ290byBmYWlsX2ZyZWVfYV90eDsKKwllcnJvciA9IHJlcXVlc3RfaXJxKEJWTUVfSVJRX1NDQ0FfUlgsIHNjY19yeF9pbnQsIElSUUZfRElTQUJMRUQsCiAJCSAgICAgICAgICAgICJTQ0MtQSBSWCIsIHBvcnQpOwotCXJlcXVlc3RfaXJxKEJWTUVfSVJRX1NDQ0FfU1BDT05ELCBzY2Nfc3Bjb25kX2ludCwgSVJRRl9ESVNBQkxFRCwKLQkJICAgICAgICAgICAgIlNDQy1BIHNwZWNpYWwgY29uZCIsIHBvcnQpOworCWlmIChlcnJvcikKKwkJZ290byBmYWlsX2ZyZWVfYV9zdGF0OworCWVycm9yID0gcmVxdWVzdF9pcnEoQlZNRV9JUlFfU0NDQV9TUENPTkQsIHNjY19zcGNvbmRfaW50LAorCQkJICAgIElSUUZfRElTQUJMRUQsICJTQ0MtQSBzcGVjaWFsIGNvbmQiLCBwb3J0KTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gZmFpbF9mcmVlX2Ffcng7CisKIAl7CiAJCVNDQ19BQ0NFU1NfSU5JVChwb3J0KTsKIApAQCAtMzcyLDE0ICs0NTMsMjIgQEAKIAlwb3J0LT5kYXRhcCA9IHBvcnQtPmN0cmxwICsgNDsKIAlwb3J0LT5wb3J0X2EgPSAmc2NjX3BvcnRzWzBdOwogCXBvcnQtPnBvcnRfYiA9ICZzY2NfcG9ydHNbMV07Ci0JcmVxdWVzdF9pcnEoQlZNRV9JUlFfU0NDQl9UWCwgc2NjX3R4X2ludCwgSVJRRl9ESVNBQkxFRCwKKwllcnJvciA9IHJlcXVlc3RfaXJxKEJWTUVfSVJRX1NDQ0JfVFgsIHNjY190eF9pbnQsIElSUUZfRElTQUJMRUQsCiAJCSAgICAgICAgICAgICJTQ0MtQiBUWCIsIHBvcnQpOwotCXJlcXVlc3RfaXJxKEJWTUVfSVJRX1NDQ0JfU1RBVCwgc2NjX3N0YXRfaW50LCBJUlFGX0RJU0FCTEVELAorCWlmIChlcnJvcikKKwkJZ290byBmYWlsX2ZyZWVfYV9zcGNvbmQ7CisJZXJyb3IgPSByZXF1ZXN0X2lycShCVk1FX0lSUV9TQ0NCX1NUQVQsIHNjY19zdGF0X2ludCwgSVJRRl9ESVNBQkxFRCwKIAkJICAgICAgICAgICAgIlNDQy1CIHN0YXR1cyIsIHBvcnQpOwotCXJlcXVlc3RfaXJxKEJWTUVfSVJRX1NDQ0JfUlgsIHNjY19yeF9pbnQsIElSUUZfRElTQUJMRUQsCisJaWYgKGVycm9yKQorCQlnb3RvIGZhaWxfZnJlZV9iX3R4OworCWVycm9yID0gcmVxdWVzdF9pcnEoQlZNRV9JUlFfU0NDQl9SWCwgc2NjX3J4X2ludCwgSVJRRl9ESVNBQkxFRCwKIAkJICAgICAgICAgICAgIlNDQy1CIFJYIiwgcG9ydCk7Ci0JcmVxdWVzdF9pcnEoQlZNRV9JUlFfU0NDQl9TUENPTkQsIHNjY19zcGNvbmRfaW50LCBJUlFGX0RJU0FCTEVELAotCQkgICAgICAgICAgICAiU0NDLUIgc3BlY2lhbCBjb25kIiwgcG9ydCk7CisJaWYgKGVycm9yKQorCQlnb3RvIGZhaWxfZnJlZV9iX3N0YXQ7CisJZXJyb3IgPSByZXF1ZXN0X2lycShCVk1FX0lSUV9TQ0NCX1NQQ09ORCwgc2NjX3NwY29uZF9pbnQsCisJCQkgICAgSVJRRl9ESVNBQkxFRCwgIlNDQy1CIHNwZWNpYWwgY29uZCIsIHBvcnQpOworCWlmIChlcnJvcikKKwkJZ290byBmYWlsX2ZyZWVfYl9yeDsKIAogCXsKIAkJU0NDX0FDQ0VTU19JTklUKHBvcnQpOwkvKiBFaXRoZXIgY2hhbm5lbCB3aWxsIGRvICovCkBAIC0zOTMsNiArNDgyLDIzIEBACiAJc2NjX2luaXRfZHJpdmVycygpOwogCiAJcmV0dXJuIDA7CisKK2ZhaWw6CisJZnJlZV9pcnEoQlZNRV9JUlFfU0NDQV9TVEFULCBwb3J0KTsKK2ZhaWxfZnJlZV9hX3R4OgorCWZyZWVfaXJxKEJWTUVfSVJRX1NDQ0FfUlgsIHBvcnQpOworZmFpbF9mcmVlX2Ffc3RhdDoKKwlmcmVlX2lycShCVk1FX0lSUV9TQ0NBX1NQQ09ORCwgcG9ydCk7CitmYWlsX2ZyZWVfYV9yeDoKKwlmcmVlX2lycShCVk1FX0lSUV9TQ0NCX1RYLCBwb3J0KTsKK2ZhaWxfZnJlZV9hX3NwY29uZDoKKwlmcmVlX2lycShCVk1FX0lSUV9TQ0NCX1NUQVQsIHBvcnQpOworZmFpbF9mcmVlX2JfdHg6CisJZnJlZV9pcnEoQlZNRV9JUlFfU0NDQl9SWCwgcG9ydCk7CitmYWlsX2ZyZWVfYl9zdGF0OgorCWZyZWVfaXJxKEJWTUVfSVJRX1NDQ0JfU1BDT05ELCBwb3J0KTsKK2ZhaWxfZnJlZV9iX3J4OgorCXJldHVybiBlcnJvcjsKIH0KICNlbmRpZgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvdnQuYyBiL2RyaXZlcnMvY2hhci92dC5jCmluZGV4IDgwMDE0MjEuLjc5MDBiZDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci92dC5jCisrKyBiL2RyaXZlcnMvY2hhci92dC5jCkBAIC05NjksOCArOTY5LDcgQEAKICAqCVRha2VzIHRoZSBjb25zb2xlIHNlbSBhbmQgdGhlIGNhbGxlZCBtZXRob2RzIHRoZW4gdGFrZSB0aGUgdHR5CiAgKgl0ZXJtaW9zX211dGV4IGFuZCB0aGUgdHR5IGN0cmxfbG9jayBpbiB0aGF0IG9yZGVyLgogICovCi0KLWludCB2dF9yZXNpemUoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IHdpbnNpemUgKndzKQorc3RhdGljIGludCB2dF9yZXNpemUoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IHdpbnNpemUgKndzKQogewogCXN0cnVjdCB2Y19kYXRhICp2YyA9IHR0eS0+ZHJpdmVyX2RhdGE7CiAJaW50IHJldDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3B1ZnJlcS9LY29uZmlnIGIvZHJpdmVycy9jcHVmcmVxL0tjb25maWcKaW5kZXggNWYwNzZhZS4uYThjOGQ5YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jcHVmcmVxL0tjb25maWcKKysrIGIvZHJpdmVycy9jcHVmcmVxL0tjb25maWcKQEAgLTgzLDcgKzgzLDcgQEAKIAlzZWxlY3QgQ1BVX0ZSRVFfR09WX1VTRVJTUEFDRQogCWhlbHAKIAkgIFVzZSB0aGUgQ1BVRnJlcSBnb3Zlcm5vciAndXNlcnNwYWNlJyBhcyBkZWZhdWx0LiBUaGlzIGFsbG93cwotCSAgeW91IHRvIHNldCB0aGUgQ1BVIGZyZXF1ZW5jeSBtYW51YWxseSBvciB3aGVuIGFuIHVzZXJzcGFjZSAKKwkgIHlvdSB0byBzZXQgdGhlIENQVSBmcmVxdWVuY3kgbWFudWFsbHkgb3Igd2hlbiBhIHVzZXJzcGFjZSAKIAkgIHByb2dyYW0gc2hhbGwgYmUgYWJsZSB0byBzZXQgdGhlIENQVSBkeW5hbWljYWxseSB3aXRob3V0IGhhdmluZwogCSAgdG8gZW5hYmxlIHRoZSB1c2Vyc3BhY2UgZ292ZXJub3IgbWFudWFsbHkuCiAKQEAgLTEzOCw3ICsxMzgsNyBAQAogCXRyaXN0YXRlICIndXNlcnNwYWNlJyBnb3Zlcm5vciBmb3IgdXNlcnNwYWNlIGZyZXF1ZW5jeSBzY2FsaW5nIgogCWhlbHAKIAkgIEVuYWJsZSB0aGlzIGNwdWZyZXEgZ292ZXJub3Igd2hlbiB5b3UgZWl0aGVyIHdhbnQgdG8gc2V0IHRoZQotCSAgQ1BVIGZyZXF1ZW5jeSBtYW51YWxseSBvciB3aGVuIGFuIHVzZXJzcGFjZSBwcm9ncmFtIHNoYWxsCisJICBDUFUgZnJlcXVlbmN5IG1hbnVhbGx5IG9yIHdoZW4gYSB1c2Vyc3BhY2UgcHJvZ3JhbSBzaGFsbAogCSAgYmUgYWJsZSB0byBzZXQgdGhlIENQVSBkeW5hbWljYWxseSwgbGlrZSBvbiBMQVJUIAogCSAgPGh0dHA6Ly93d3cubGFydG1ha2VyLm5sLz4uCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3B1ZnJlcS9jcHVmcmVxLmMgYi9kcml2ZXJzL2NwdWZyZXEvY3B1ZnJlcS5jCmluZGV4IDAxZGRlODAuLmI1NWNiNjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY3B1ZnJlcS9jcHVmcmVxLmMKKysrIGIvZHJpdmVycy9jcHVmcmVxL2NwdWZyZXEuYwpAQCAtNTg0LDEyICs1ODQsMTIgQEAKIAlyZXR1cm4gaTsKIH0KIAotc3RhdGljIHNzaXplX3Qgc2hvd19jcHVzKGNwdW1hc2tfdCBtYXNrLCBjaGFyICpidWYpCitzdGF0aWMgc3NpemVfdCBzaG93X2NwdXMoY29uc3Qgc3RydWN0IGNwdW1hc2sgKm1hc2ssIGNoYXIgKmJ1ZikKIHsKIAlzc2l6ZV90IGkgPSAwOwogCXVuc2lnbmVkIGludCBjcHU7CiAKLQlmb3JfZWFjaF9jcHVfbWFza19ucihjcHUsIG1hc2spIHsKKwlmb3JfZWFjaF9jcHUoY3B1LCBtYXNrKSB7CiAJCWlmIChpKQogCQkJaSArPSBzY25wcmludGYoJmJ1ZltpXSwgKFBBR0VfU0laRSAtIGkgLSAyKSwgIiAiKTsKIAkJaSArPSBzY25wcmludGYoJmJ1ZltpXSwgKFBBR0VfU0laRSAtIGkgLSAyKSwgIiV1IiwgY3B1KTsKQEAgLTYwNiw3ICs2MDYsNyBAQAogICovCiBzdGF0aWMgc3NpemVfdCBzaG93X3JlbGF0ZWRfY3B1cyhzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSwgY2hhciAqYnVmKQogewotCWlmIChjcHVzX2VtcHR5KHBvbGljeS0+cmVsYXRlZF9jcHVzKSkKKwlpZiAoY3B1bWFza19lbXB0eShwb2xpY3ktPnJlbGF0ZWRfY3B1cykpCiAJCXJldHVybiBzaG93X2NwdXMocG9saWN5LT5jcHVzLCBidWYpOwogCXJldHVybiBzaG93X2NwdXMocG9saWN5LT5yZWxhdGVkX2NwdXMsIGJ1Zik7CiB9CkBAIC04MDYsOSArODA2LDIwIEBACiAJCXJldCA9IC1FTk9NRU07CiAJCWdvdG8gbm9tZW1fb3V0OwogCX0KKwlpZiAoIWFsbG9jX2NwdW1hc2tfdmFyKCZwb2xpY3ktPmNwdXMsIEdGUF9LRVJORUwpKSB7CisJCWtmcmVlKHBvbGljeSk7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gbm9tZW1fb3V0OworCX0KKwlpZiAoIWFsbG9jX2NwdW1hc2tfdmFyKCZwb2xpY3ktPnJlbGF0ZWRfY3B1cywgR0ZQX0tFUk5FTCkpIHsKKwkJZnJlZV9jcHVtYXNrX3Zhcihwb2xpY3ktPmNwdXMpOworCQlrZnJlZShwb2xpY3kpOworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIG5vbWVtX291dDsKKwl9CiAKIAlwb2xpY3ktPmNwdSA9IGNwdTsKLQlwb2xpY3ktPmNwdXMgPSBjcHVtYXNrX29mX2NwdShjcHUpOworCWNwdW1hc2tfY29weShwb2xpY3ktPmNwdXMsIGNwdW1hc2tfb2YoY3B1KSk7CiAKIAkvKiBJbml0aWFsbHkgc2V0IENQVSBpdHNlbGYgYXMgdGhlIHBvbGljeV9jcHUgKi8KIAlwZXJfY3B1KHBvbGljeV9jcHUsIGNwdSkgPSBjcHU7CkBAIC04NDMsNyArODU0LDcgQEAKIAl9CiAjZW5kaWYKIAotCWZvcl9lYWNoX2NwdV9tYXNrX25yKGosIHBvbGljeS0+Y3B1cykgeworCWZvcl9lYWNoX2NwdShqLCBwb2xpY3ktPmNwdXMpIHsKIAkJaWYgKGNwdSA9PSBqKQogCQkJY29udGludWU7CiAKQEAgLTg2MSw3ICs4NzIsNyBAQAogCQkJCWdvdG8gZXJyX291dF9kcml2ZXJfZXhpdDsKIAogCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmNwdWZyZXFfZHJpdmVyX2xvY2ssIGZsYWdzKTsKLQkJCW1hbmFnZWRfcG9saWN5LT5jcHVzID0gcG9saWN5LT5jcHVzOworCQkJY3B1bWFza19jb3B5KG1hbmFnZWRfcG9saWN5LT5jcHVzLCBwb2xpY3ktPmNwdXMpOwogCQkJcGVyX2NwdShjcHVmcmVxX2NwdV9kYXRhLCBjcHUpID0gbWFuYWdlZF9wb2xpY3k7CiAJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjcHVmcmVxX2RyaXZlcl9sb2NrLCBmbGFncyk7CiAKQEAgLTkxNiwxNCArOTI3LDE0IEBACiAJfQogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmNwdWZyZXFfZHJpdmVyX2xvY2ssIGZsYWdzKTsKLQlmb3JfZWFjaF9jcHVfbWFza19ucihqLCBwb2xpY3ktPmNwdXMpIHsKKwlmb3JfZWFjaF9jcHUoaiwgcG9saWN5LT5jcHVzKSB7CiAJCXBlcl9jcHUoY3B1ZnJlcV9jcHVfZGF0YSwgaikgPSBwb2xpY3k7CiAJCXBlcl9jcHUocG9saWN5X2NwdSwgaikgPSBwb2xpY3ktPmNwdTsKIAl9CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY3B1ZnJlcV9kcml2ZXJfbG9jaywgZmxhZ3MpOwogCiAJLyogc3ltbGluayBhZmZlY3RlZCBDUFVzICovCi0JZm9yX2VhY2hfY3B1X21hc2tfbnIoaiwgcG9saWN5LT5jcHVzKSB7CisJZm9yX2VhY2hfY3B1KGosIHBvbGljeS0+Y3B1cykgewogCQlpZiAoaiA9PSBjcHUpCiAJCQljb250aW51ZTsKIAkJaWYgKCFjcHVfb25saW5lKGopKQpAQCAtOTYzLDcgKzk3NCw3IEBACiAKIGVycl9vdXRfdW5yZWdpc3RlcjoKIAlzcGluX2xvY2tfaXJxc2F2ZSgmY3B1ZnJlcV9kcml2ZXJfbG9jaywgZmxhZ3MpOwotCWZvcl9lYWNoX2NwdV9tYXNrX25yKGosIHBvbGljeS0+Y3B1cykKKwlmb3JfZWFjaF9jcHUoaiwgcG9saWN5LT5jcHVzKQogCQlwZXJfY3B1KGNwdWZyZXFfY3B1X2RhdGEsIGopID0gTlVMTDsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjcHVmcmVxX2RyaXZlcl9sb2NrLCBmbGFncyk7CiAKQEAgLTEwMjQsNyArMTAzNSw3IEBACiAJICovCiAJaWYgKHVubGlrZWx5KGNwdSAhPSBkYXRhLT5jcHUpKSB7CiAJCWRwcmludGsoInJlbW92aW5nIGxpbmtcbiIpOwotCQljcHVfY2xlYXIoY3B1LCBkYXRhLT5jcHVzKTsKKwkJY3B1bWFza19jbGVhcl9jcHUoY3B1LCBkYXRhLT5jcHVzKTsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY3B1ZnJlcV9kcml2ZXJfbG9jaywgZmxhZ3MpOwogCQlzeXNmc19yZW1vdmVfbGluaygmc3lzX2Rldi0+a29iaiwgImNwdWZyZXEiKTsKIAkJY3B1ZnJlcV9jcHVfcHV0KGRhdGEpOwpAQCAtMTA0NSw4ICsxMDU2LDggQEAKIAkgKiBwZXJfY3B1KGNwdWZyZXFfY3B1X2RhdGEpIHdoaWxlIGhvbGRpbmcgdGhlIGxvY2ssIGFuZCByZW1vdmUKIAkgKiB0aGUgc3lzZnMgbGlua3MgYWZ0ZXJ3YXJkcy4KIAkgKi8KLQlpZiAodW5saWtlbHkoY3B1c193ZWlnaHQoZGF0YS0+Y3B1cykgPiAxKSkgewotCQlmb3JfZWFjaF9jcHVfbWFza19ucihqLCBkYXRhLT5jcHVzKSB7CisJaWYgKHVubGlrZWx5KGNwdW1hc2tfd2VpZ2h0KGRhdGEtPmNwdXMpID4gMSkpIHsKKwkJZm9yX2VhY2hfY3B1KGosIGRhdGEtPmNwdXMpIHsKIAkJCWlmIChqID09IGNwdSkKIAkJCQljb250aW51ZTsKIAkJCXBlcl9jcHUoY3B1ZnJlcV9jcHVfZGF0YSwgaikgPSBOVUxMOwpAQCAtMTA1NSw4ICsxMDY2LDggQEAKIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNwdWZyZXFfZHJpdmVyX2xvY2ssIGZsYWdzKTsKIAotCWlmICh1bmxpa2VseShjcHVzX3dlaWdodChkYXRhLT5jcHVzKSA+IDEpKSB7Ci0JCWZvcl9lYWNoX2NwdV9tYXNrX25yKGosIGRhdGEtPmNwdXMpIHsKKwlpZiAodW5saWtlbHkoY3B1bWFza193ZWlnaHQoZGF0YS0+Y3B1cykgPiAxKSkgeworCQlmb3JfZWFjaF9jcHUoaiwgZGF0YS0+Y3B1cykgewogCQkJaWYgKGogPT0gY3B1KQogCQkJCWNvbnRpbnVlOwogCQkJZHByaW50aygicmVtb3ZpbmcgbGluayBmb3IgY3B1ICV1XG4iLCBqKTsKQEAgLTEwOTAsNyArMTEwMSwxMCBAQAogCWlmIChjcHVmcmVxX2RyaXZlci0+ZXhpdCkKIAkJY3B1ZnJlcV9kcml2ZXItPmV4aXQoZGF0YSk7CiAKKwlmcmVlX2NwdW1hc2tfdmFyKGRhdGEtPnJlbGF0ZWRfY3B1cyk7CisJZnJlZV9jcHVtYXNrX3ZhcihkYXRhLT5jcHVzKTsKIAlrZnJlZShkYXRhKTsKKwlwZXJfY3B1KGNwdWZyZXFfY3B1X2RhdGEsIGNwdSkgPSBOVUxMOwogCiAJY3B1ZnJlcV9kZWJ1Z19lbmFibGVfcmF0ZWxpbWl0KCk7CiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NwdWZyZXEvY3B1ZnJlcV9jb25zZXJ2YXRpdmUuYyBiL2RyaXZlcnMvY3B1ZnJlcS9jcHVmcmVxX2NvbnNlcnZhdGl2ZS5jCmluZGV4IGUyNjU3ODMuLjAzMjA5NjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY3B1ZnJlcS9jcHVmcmVxX2NvbnNlcnZhdGl2ZS5jCisrKyBiL2RyaXZlcnMvY3B1ZnJlcS9jcHVmcmVxX2NvbnNlcnZhdGl2ZS5jCkBAIC00OTgsNyArNDk4LDcgQEAKIAkJCXJldHVybiByYzsKIAkJfQogCi0JCWZvcl9lYWNoX2NwdV9tYXNrX25yKGosIHBvbGljeS0+Y3B1cykgeworCQlmb3JfZWFjaF9jcHUoaiwgcG9saWN5LT5jcHVzKSB7CiAJCQlzdHJ1Y3QgY3B1X2Ric19pbmZvX3MgKmpfZGJzX2luZm87CiAJCQlqX2Ric19pbmZvID0gJnBlcl9jcHUoY3B1X2Ric19pbmZvLCBqKTsKIAkJCWpfZGJzX2luZm8tPmN1cl9wb2xpY3kgPSBwb2xpY3k7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NwdWZyZXEvY3B1ZnJlcV9vbmRlbWFuZC5jIGIvZHJpdmVycy9jcHVmcmVxL2NwdWZyZXFfb25kZW1hbmQuYwppbmRleCAyYWIzYzEyLi42YTJiMDM2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NwdWZyZXEvY3B1ZnJlcV9vbmRlbWFuZC5jCisrKyBiL2RyaXZlcnMvY3B1ZnJlcS9jcHVmcmVxX29uZGVtYW5kLmMKQEAgLTQwMCw3ICs0MDAsNyBAQAogCS8qIEdldCBBYnNvbHV0ZSBMb2FkIC0gaW4gdGVybXMgb2YgZnJlcSAqLwogCW1heF9sb2FkX2ZyZXEgPSAwOwogCi0JZm9yX2VhY2hfY3B1X21hc2tfbnIoaiwgcG9saWN5LT5jcHVzKSB7CisJZm9yX2VhY2hfY3B1KGosIHBvbGljeS0+Y3B1cykgewogCQlzdHJ1Y3QgY3B1X2Ric19pbmZvX3MgKmpfZGJzX2luZm87CiAJCWNwdXRpbWU2NF90IGN1cl93YWxsX3RpbWUsIGN1cl9pZGxlX3RpbWU7CiAJCXVuc2lnbmVkIGludCBpZGxlX3RpbWUsIHdhbGxfdGltZTsKQEAgLTU2OCw3ICs1NjgsNyBAQAogCQkJcmV0dXJuIHJjOwogCQl9CiAKLQkJZm9yX2VhY2hfY3B1X21hc2tfbnIoaiwgcG9saWN5LT5jcHVzKSB7CisJCWZvcl9lYWNoX2NwdShqLCBwb2xpY3ktPmNwdXMpIHsKIAkJCXN0cnVjdCBjcHVfZGJzX2luZm9fcyAqal9kYnNfaW5mbzsKIAkJCWpfZGJzX2luZm8gPSAmcGVyX2NwdShjcHVfZGJzX2luZm8sIGopOwogCQkJal9kYnNfaW5mby0+Y3VyX3BvbGljeSA9IHBvbGljeTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3B1aWRsZS9nb3Zlcm5vcnMvbWVudS5jIGIvZHJpdmVycy9jcHVpZGxlL2dvdmVybm9ycy9tZW51LmMKaW5kZXggOGQ3Y2YzZi4uZjFkZjU5ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jcHVpZGxlL2dvdmVybm9ycy9tZW51LmMKKysrIGIvZHJpdmVycy9jcHVpZGxlL2dvdmVybm9ycy9tZW51LmMKQEAgLTE1LDEyICsxNSwxNCBAQAogI2luY2x1ZGUgPGxpbnV4L3RpY2suaD4KIAogI2RlZmluZSBCUkVBS19GVVpaCTQJLyogNCB1cyAqLworI2RlZmluZSBQUkVEX0hJU1RPUllfUENUCTUwCiAKIHN0cnVjdCBtZW51X2RldmljZSB7CiAJaW50CQlsYXN0X3N0YXRlX2lkeDsKIAogCXVuc2lnbmVkIGludAlleHBlY3RlZF91czsKIAl1bnNpZ25lZCBpbnQJcHJlZGljdGVkX3VzOworCXVuc2lnbmVkIGludCAgICBjdXJyZW50X3ByZWRpY3RlZF91czsKIAl1bnNpZ25lZCBpbnQJbGFzdF9tZWFzdXJlZF91czsKIAl1bnNpZ25lZCBpbnQJZWxhcHNlZF91czsKIH07CkBAIC00Nyw2ICs0OSwxMiBAQAogCWRhdGEtPmV4cGVjdGVkX3VzID0KIAkJKHUzMikga3RpbWVfdG9fbnModGlja19ub2h6X2dldF9zbGVlcF9sZW5ndGgoKSkgLyAxMDAwOwogCisJLyogUmVjYWxjdWxhdGUgcHJlZGljdGVkX3VzIGJhc2VkIG9uIHByZWRpY3Rpb25faGlzdG9yeV9wY3QgKi8KKwlkYXRhLT5wcmVkaWN0ZWRfdXMgKj0gUFJFRF9ISVNUT1JZX1BDVDsKKwlkYXRhLT5wcmVkaWN0ZWRfdXMgKz0gKDEwMCAtIFBSRURfSElTVE9SWV9QQ1QpICoKKwkJCQlkYXRhLT5jdXJyZW50X3ByZWRpY3RlZF91czsKKwlkYXRhLT5wcmVkaWN0ZWRfdXMgLz0gMTAwOworCiAJLyogZmluZCB0aGUgZGVlcGVzdCBpZGxlIHN0YXRlIHRoYXQgc2F0aXNmaWVzIG91ciBjb25zdHJhaW50cyAqLwogCWZvciAoaSA9IENQVUlETEVfRFJJVkVSX1NUQVRFX1NUQVJUICsgMTsgaSA8IGRldi0+c3RhdGVfY291bnQ7IGkrKykgewogCQlzdHJ1Y3QgY3B1aWRsZV9zdGF0ZSAqcyA9ICZkZXYtPnN0YXRlc1tpXTsKQEAgLTk3LDcgKzEwNSw3IEBACiAJCW1lYXN1cmVkX3VzID0gLTE7CiAKIAkvKiBQcmVkaWN0IHRpbWUgdW50aWwgbmV4dCBicmVhayBldmVudCAqLwotCWRhdGEtPnByZWRpY3RlZF91cyA9IG1heChtZWFzdXJlZF91cywgZGF0YS0+bGFzdF9tZWFzdXJlZF91cyk7CisJZGF0YS0+Y3VycmVudF9wcmVkaWN0ZWRfdXMgPSBtYXgobWVhc3VyZWRfdXMsIGRhdGEtPmxhc3RfbWVhc3VyZWRfdXMpOwogCiAJaWYgKGxhc3RfaWRsZV91cyArIEJSRUFLX0ZVWlogPAogCSAgICBkYXRhLT5leHBlY3RlZF91cyAtIHRhcmdldC0+ZXhpdF9sYXRlbmN5KSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2RjYS9kY2EtY29yZS5jIGIvZHJpdmVycy9kY2EvZGNhLWNvcmUuYwppbmRleCBkODgzZTFiLi41NTQzMzg0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2RjYS9kY2EtY29yZS5jCisrKyBiL2RyaXZlcnMvZGNhL2RjYS1jb3JlLmMKQEAgLTI3MCw2ICsyNzAsNiBAQAogCWRjYV9zeXNmc19leGl0KCk7CiB9CiAKLXN1YnN5c19pbml0Y2FsbChkY2FfaW5pdCk7CithcmNoX2luaXRjYWxsKGRjYV9pbml0KTsKIG1vZHVsZV9leGl0KGRjYV9leGl0KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9kaW8vZGlvLXN5c2ZzLmMgYi9kcml2ZXJzL2Rpby9kaW8tc3lzZnMuYwppbmRleCBmNDY0NjMwLi5lZTFhM2I1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Rpby9kaW8tc3lzZnMuYworKysgYi9kcml2ZXJzL2Rpby9kaW8tc3lzZnMuYwpAQCAtNTgsMjAgKzU4LDI1IEBACiAJc3RydWN0IGRpb19kZXYgKmQgPSB0b19kaW9fZGV2KGRldik7CiAKIAlyZXR1cm4gc3ByaW50ZihidWYsICIweCUwOGx4IDB4JTA4bHggMHglMDhseFxuIiwKLQkJICAgICAgIGRpb19yZXNvdXJjZV9zdGFydChkKSwgZGlvX3Jlc291cmNlX2VuZChkKSwKKwkJICAgICAgICh1bnNpZ25lZCBsb25nKWRpb19yZXNvdXJjZV9zdGFydChkKSwKKwkJICAgICAgICh1bnNpZ25lZCBsb25nKWRpb19yZXNvdXJjZV9lbmQoZCksCiAJCSAgICAgICBkaW9fcmVzb3VyY2VfZmxhZ3MoZCkpOwogfQogc3RhdGljIERFVklDRV9BVFRSKHJlc291cmNlLCBTX0lSVUdPLCBkaW9fc2hvd19yZXNvdXJjZSwgTlVMTCk7CiAKLXZvaWQgZGlvX2NyZWF0ZV9zeXNmc19kZXZfZmlsZXMoc3RydWN0IGRpb19kZXYgKmQpCitpbnQgZGlvX2NyZWF0ZV9zeXNmc19kZXZfZmlsZXMoc3RydWN0IGRpb19kZXYgKmQpCiB7CiAJc3RydWN0IGRldmljZSAqZGV2ID0gJmQtPmRldjsKKwlpbnQgZXJyb3I7CiAKIAkvKiBjdXJyZW50IGNvbmZpZ3VyYXRpb24ncyBhdHRyaWJ1dGVzICovCi0JZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJmRldl9hdHRyX2lkKTsKLQlkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfaXBsKTsKLQlkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfc2VjaWQpOwotCWRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl9uYW1lKTsKLQlkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfcmVzb3VyY2UpOworCWlmICgoZXJyb3IgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfaWQpKSB8fAorCSAgICAoZXJyb3IgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfaXBsKSkgfHwKKwkgICAgKGVycm9yID0gZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJmRldl9hdHRyX3NlY2lkKSkgfHwKKwkgICAgKGVycm9yID0gZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJmRldl9hdHRyX25hbWUpKSB8fAorCSAgICAoZXJyb3IgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfcmVzb3VyY2UpKSkKKwkJcmV0dXJuIGVycm9yOworCisJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZGlvL2Rpby5jIGIvZHJpdmVycy9kaW8vZGlvLmMKaW5kZXggMDdmMjc0Zi4uMTBjM2M0OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9kaW8vZGlvLmMKKysrIGIvZHJpdmVycy9kaW8vZGlvLmMKQEAgLTE3Myw2ICsxNzMsNyBAQAogCW1tX3NlZ21lbnRfdCBmczsKIAlpbnQgaTsKIAlzdHJ1Y3QgZGlvX2RldiAqZGV2OworCWludCBlcnJvcjsKIAogCWlmICghTUFDSF9JU19IUDMwMCkKIAkJcmV0dXJuIDA7CkBAIC0xODIsNyArMTgzLDExIEBACiAJLyogSW5pdGlhbGl6ZSB0aGUgRElPIGJ1cyAqLyAKIAlJTklUX0xJU1RfSEVBRCgmZGlvX2J1cy5kZXZpY2VzKTsKIAlzdHJjcHkoZGlvX2J1cy5kZXYuYnVzX2lkLCAiZGlvIik7Ci0JZGV2aWNlX3JlZ2lzdGVyKCZkaW9fYnVzLmRldik7CisJZXJyb3IgPSBkZXZpY2VfcmVnaXN0ZXIoJmRpb19idXMuZGV2KTsKKwlpZiAoZXJyb3IpIHsKKwkJcHJfZXJyKCJESU86IEVycm9yIHJlZ2lzdGVyaW5nIGRpb19idXNcbiIpOworCQlyZXR1cm4gZXJyb3I7CisJfQogCiAJLyogUmVxdWVzdCBhbGwgcmVzb3VyY2VzICovCiAJZGlvX2J1cy5udW1fcmVzb3VyY2VzID0gKGhwMzAwX21vZGVsID09IEhQXzMyMCA/IDEgOiAyKTsKQEAgLTI1Miw4ICsyNTcsMTUgQEAKIAogCQlpZiAoc2NvZGUgPj0gRElPSUlfU0NCQVNFKQogCQkJaW91bm1hcCh2YSk7Ci0JCWRldmljZV9yZWdpc3RlcigmZGV2LT5kZXYpOwotCQlkaW9fY3JlYXRlX3N5c2ZzX2Rldl9maWxlcyhkZXYpOworCQllcnJvciA9IGRldmljZV9yZWdpc3RlcigmZGV2LT5kZXYpOworCQlpZiAoZXJyb3IpIHsKKwkJCXByX2VycigiRElPOiBFcnJvciByZWdpc3RlcmluZyBkZXZpY2UgJXNcbiIsCisJCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWVycm9yID0gZGlvX2NyZWF0ZV9zeXNmc19kZXZfZmlsZXMoZGV2KTsKKwkJaWYgKGVycm9yKQorCQkJZGV2X2VycigmZGV2LT5kZXYsICJFcnJvciBjcmVhdGluZyBzeXNmcyBmaWxlc1xuIik7CiAgICAgICAgIH0KIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZG1hL0tjb25maWcgYi9kcml2ZXJzL2RtYS9LY29uZmlnCmluZGV4IDkwNGU1NzUuLmUzNGIwNjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZG1hL0tjb25maWcKKysrIGIvZHJpdmVycy9kbWEvS2NvbmZpZwpAQCAtMzMsNyArMzMsNiBAQAogY29uZmlnIElOVEVMX0lPUF9BRE1BCiAJdHJpc3RhdGUgIkludGVsIElPUCBBRE1BIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBBUkNIX0lPUDMyWCB8fCBBUkNIX0lPUDMzWCB8fCBBUkNIX0lPUDEzWFgKLQlzZWxlY3QgQVNZTkNfQ09SRQogCXNlbGVjdCBETUFfRU5HSU5FCiAJaGVscAogCSAgRW5hYmxlIHN1cHBvcnQgZm9yIHRoZSBJbnRlbChSKSBJT1AgU2VyaWVzIFJBSUQgZW5naW5lcy4KQEAgLTU5LDcgKzU4LDYgQEAKIGNvbmZpZyBNVl9YT1IKIAlib29sICJNYXJ2ZWxsIFhPUiBlbmdpbmUgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIFBMQVRfT1JJT04KLQlzZWxlY3QgQVNZTkNfQ09SRQogCXNlbGVjdCBETUFfRU5HSU5FCiAJLS0taGVscC0tLQogCSAgRW5hYmxlIHN1cHBvcnQgZm9yIHRoZSBNYXJ2ZWxsIFhPUiBlbmdpbmUuCmRpZmYgLS1naXQgYS9kcml2ZXJzL2RtYS9kbWFlbmdpbmUuYyBiL2RyaXZlcnMvZG1hL2RtYWVuZ2luZS5jCmluZGV4IDY1Nzk5NjUuLjQwM2RiZTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZG1hL2RtYWVuZ2luZS5jCisrKyBiL2RyaXZlcnMvZG1hL2RtYWVuZ2luZS5jCkBAIC0zMSwzMiArMzEsMTggQEAKICAqCiAgKiBMT0NLSU5HOgogICoKLSAqIFRoZSBzdWJzeXN0ZW0ga2VlcHMgdHdvIGdsb2JhbCBsaXN0cywgZG1hX2RldmljZV9saXN0IGFuZCBkbWFfY2xpZW50X2xpc3QuCi0gKiBCb3RoIG9mIHRoZXNlIGFyZSBwcm90ZWN0ZWQgYnkgYSBtdXRleCwgZG1hX2xpc3RfbXV0ZXguCisgKiBUaGUgc3Vic3lzdGVtIGtlZXBzIGEgZ2xvYmFsIGxpc3Qgb2YgZG1hX2RldmljZSBzdHJ1Y3RzIGl0IGlzIHByb3RlY3RlZCBieSBhCisgKiBtdXRleCwgZG1hX2xpc3RfbXV0ZXguCisgKgorICogQSBzdWJzeXN0ZW0gY2FuIGdldCBhY2Nlc3MgdG8gYSBjaGFubmVsIGJ5IGNhbGxpbmcgZG1hZW5naW5lX2dldCgpIGZvbGxvd2VkCisgKiBieSBkbWFfZmluZF9jaGFubmVsKCksIG9yIGlmIGl0IGhhcyBuZWVkIGZvciBhbiBleGNsdXNpdmUgY2hhbm5lbCBpdCBjYW4gY2FsbAorICogZG1hX3JlcXVlc3RfY2hhbm5lbCgpLiAgT25jZSBhIGNoYW5uZWwgaXMgYWxsb2NhdGVkIGEgcmVmZXJlbmNlIGlzIHRha2VuCisgKiBhZ2FpbnN0IGl0cyBjb3JyZXNwb25kaW5nIGRyaXZlciB0byBkaXNhYmxlIHJlbW92YWwuCiAgKgogICogRWFjaCBkZXZpY2UgaGFzIGEgY2hhbm5lbHMgbGlzdCwgd2hpY2ggcnVucyB1bmxvY2tlZCBidXQgaXMgbmV2ZXIgbW9kaWZpZWQKICAqIG9uY2UgdGhlIGRldmljZSBpcyByZWdpc3RlcmVkLCBpdCdzIGp1c3Qgc2V0dXAgYnkgdGhlIGRyaXZlci4KICAqCi0gKiBFYWNoIGNsaWVudCBpcyByZXNwb25zaWJsZSBmb3Iga2VlcGluZyB0cmFjayBvZiB0aGUgY2hhbm5lbHMgaXQgdXNlcy4gIFNlZQotICogdGhlIGRlZmluaXRpb24gb2YgZG1hX2V2ZW50X2NhbGxiYWNrIGluIGRtYWVuZ2luZS5oLgotICoKLSAqIEVhY2ggZGV2aWNlIGhhcyBhIGtyZWYsIHdoaWNoIGlzIGluaXRpYWxpemVkIHRvIDEgd2hlbiB0aGUgZGV2aWNlIGlzCi0gKiByZWdpc3RlcmVkLiBBIGtyZWZfZ2V0IGlzIGRvbmUgZm9yIGVhY2ggZGV2aWNlIHJlZ2lzdGVyZWQuICBXaGVuIHRoZQotICogZGV2aWNlIGlzIHJlbGVhc2VkLCB0aGUgY29ycmVzcG9uZGluZyBrcmVmX3B1dCBpcyBkb25lIGluIHRoZSByZWxlYXNlCi0gKiBtZXRob2QuIEV2ZXJ5IHRpbWUgb25lIG9mIHRoZSBkZXZpY2UncyBjaGFubmVscyBpcyBhbGxvY2F0ZWQgdG8gYSBjbGllbnQsCi0gKiBhIGtyZWZfZ2V0IG9jY3Vycy4gIFdoZW4gdGhlIGNoYW5uZWwgaXMgZnJlZWQsIHRoZSBjb3JyZXNwb25kaW5nIGtyZWZfcHV0Ci0gKiBoYXBwZW5zLiBUaGUgZGV2aWNlJ3MgcmVsZWFzZSBmdW5jdGlvbiBkb2VzIGEgY29tcGxldGlvbiwgc28KLSAqIHVucmVnaXN0ZXJfZGV2aWNlIGRvZXMgYSByZW1vdmUgZXZlbnQsIGRldmljZV91bnJlZ2lzdGVyLCBhIGtyZWZfcHV0Ci0gKiBmb3IgdGhlIGZpcnN0IHJlZmVyZW5jZSwgdGhlbiB3YWl0cyBvbiB0aGUgY29tcGxldGlvbiBmb3IgYWxsIG90aGVyCi0gKiByZWZlcmVuY2VzIHRvIGZpbmlzaC4KLSAqCi0gKiBFYWNoIGNoYW5uZWwgaGFzIGFuIG9wZW4tY29kZWQgaW1wbGVtZW50YXRpb24gb2YgUnVzdHkgUnVzc2VsbCdzICJiaWdyZWYsIgotICogd2l0aCBhIGtyZWYgYW5kIGEgcGVyX2NwdSBsb2NhbF90LiAgQSBkbWFfY2hhbl9nZXQgaXMgY2FsbGVkIHdoZW4gYSBjbGllbnQKLSAqIHNpZ25hbHMgdGhhdCBpdCB3YW50cyB0byB1c2UgYSBjaGFubmVsLCBhbmQgZG1hX2NoYW5fcHV0IGlzIGNhbGxlZCB3aGVuCi0gKiBhIGNoYW5uZWwgaXMgcmVtb3ZlZCBvciBhIGNsaWVudCB1c2luZyBpdCBpcyB1bnJlZ2lzdGVyZWQuICBBIGNsaWVudCBjYW4KLSAqIHRha2UgZXh0cmEgcmVmZXJlbmNlcyBwZXIgb3V0c3RhbmRpbmcgdHJhbnNhY3Rpb24sIGFzIGlzIHRoZSBjYXNlIHdpdGgKLSAqIHRoZSBORVQgRE1BIGNsaWVudC4gIFRoZSByZWxlYXNlIGZ1bmN0aW9uIGRvZXMgYSBrcmVmX3B1dCBvbiB0aGUgZGV2aWNlLgotICoJLUNocmlzTCwgRGFuVworICogU2VlIERvY3VtZW50YXRpb24vZG1hZW5naW5lLnR4dCBmb3IgbW9yZSBkZXRhaWxzCiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KQEAgLTcwLDU0ICs1Niw4NSBAQAogI2luY2x1ZGUgPGxpbnV4L3JjdXBkYXRlLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CisjaW5jbHVkZSA8bGludXgvcmN1bGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lkci5oPgogCiBzdGF0aWMgREVGSU5FX01VVEVYKGRtYV9saXN0X211dGV4KTsKIHN0YXRpYyBMSVNUX0hFQUQoZG1hX2RldmljZV9saXN0KTsKLXN0YXRpYyBMSVNUX0hFQUQoZG1hX2NsaWVudF9saXN0KTsKK3N0YXRpYyBsb25nIGRtYWVuZ2luZV9yZWZfY291bnQ7CitzdGF0aWMgc3RydWN0IGlkciBkbWFfaWRyOwogCiAvKiAtLS0gc3lzZnMgaW1wbGVtZW50YXRpb24gLS0tICovCiAKKy8qKgorICogZGV2X3RvX2RtYV9jaGFuIC0gY29udmVydCBhIGRldmljZSBwb2ludGVyIHRvIHRoZSBpdHMgc3lzZnMgY29udGFpbmVyIG9iamVjdAorICogQGRldiAtIGRldmljZSBub2RlCisgKgorICogTXVzdCBiZSBjYWxsZWQgdW5kZXIgZG1hX2xpc3RfbXV0ZXgKKyAqLworc3RhdGljIHN0cnVjdCBkbWFfY2hhbiAqZGV2X3RvX2RtYV9jaGFuKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZG1hX2NoYW5fZGV2ICpjaGFuX2RldjsKKworCWNoYW5fZGV2ID0gY29udGFpbmVyX29mKGRldiwgdHlwZW9mKCpjaGFuX2RldiksIGRldmljZSk7CisJcmV0dXJuIGNoYW5fZGV2LT5jaGFuOworfQorCiBzdGF0aWMgc3NpemVfdCBzaG93X21lbWNweV9jb3VudChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCiB7Ci0Jc3RydWN0IGRtYV9jaGFuICpjaGFuID0gdG9fZG1hX2NoYW4oZGV2KTsKKwlzdHJ1Y3QgZG1hX2NoYW4gKmNoYW47CiAJdW5zaWduZWQgbG9uZyBjb3VudCA9IDA7CiAJaW50IGk7CisJaW50IGVycjsKIAotCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShpKQotCQljb3VudCArPSBwZXJfY3B1X3B0cihjaGFuLT5sb2NhbCwgaSktPm1lbWNweV9jb3VudDsKKwltdXRleF9sb2NrKCZkbWFfbGlzdF9tdXRleCk7CisJY2hhbiA9IGRldl90b19kbWFfY2hhbihkZXYpOworCWlmIChjaGFuKSB7CisJCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShpKQorCQkJY291bnQgKz0gcGVyX2NwdV9wdHIoY2hhbi0+bG9jYWwsIGkpLT5tZW1jcHlfY291bnQ7CisJCWVyciA9IHNwcmludGYoYnVmLCAiJWx1XG4iLCBjb3VudCk7CisJfSBlbHNlCisJCWVyciA9IC1FTk9ERVY7CisJbXV0ZXhfdW5sb2NrKCZkbWFfbGlzdF9tdXRleCk7CiAKLQlyZXR1cm4gc3ByaW50ZihidWYsICIlbHVcbiIsIGNvdW50KTsKKwlyZXR1cm4gZXJyOwogfQogCiBzdGF0aWMgc3NpemVfdCBzaG93X2J5dGVzX3RyYW5zZmVycmVkKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCiAJCQkJICAgICAgY2hhciAqYnVmKQogewotCXN0cnVjdCBkbWFfY2hhbiAqY2hhbiA9IHRvX2RtYV9jaGFuKGRldik7CisJc3RydWN0IGRtYV9jaGFuICpjaGFuOwogCXVuc2lnbmVkIGxvbmcgY291bnQgPSAwOwogCWludCBpOworCWludCBlcnI7CiAKLQlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoaSkKLQkJY291bnQgKz0gcGVyX2NwdV9wdHIoY2hhbi0+bG9jYWwsIGkpLT5ieXRlc190cmFuc2ZlcnJlZDsKKwltdXRleF9sb2NrKCZkbWFfbGlzdF9tdXRleCk7CisJY2hhbiA9IGRldl90b19kbWFfY2hhbihkZXYpOworCWlmIChjaGFuKSB7CisJCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShpKQorCQkJY291bnQgKz0gcGVyX2NwdV9wdHIoY2hhbi0+bG9jYWwsIGkpLT5ieXRlc190cmFuc2ZlcnJlZDsKKwkJZXJyID0gc3ByaW50ZihidWYsICIlbHVcbiIsIGNvdW50KTsKKwl9IGVsc2UKKwkJZXJyID0gLUVOT0RFVjsKKwltdXRleF91bmxvY2soJmRtYV9saXN0X211dGV4KTsKIAotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVsdVxuIiwgY291bnQpOworCXJldHVybiBlcnI7CiB9CiAKIHN0YXRpYyBzc2l6ZV90IHNob3dfaW5fdXNlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKLQlzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4gPSB0b19kbWFfY2hhbihkZXYpOwotCWludCBpbl91c2UgPSAwOworCXN0cnVjdCBkbWFfY2hhbiAqY2hhbjsKKwlpbnQgZXJyOwogCi0JaWYgKHVubGlrZWx5KGNoYW4tPnNsb3dfcmVmKSAmJgotCQlhdG9taWNfcmVhZCgmY2hhbi0+cmVmY291bnQucmVmY291bnQpID4gMSkKLQkJaW5fdXNlID0gMTsKLQllbHNlIHsKLQkJaWYgKGxvY2FsX3JlYWQoJihwZXJfY3B1X3B0cihjaGFuLT5sb2NhbCwKLQkJCWdldF9jcHUoKSktPnJlZmNvdW50KSkgPiAwKQotCQkJaW5fdXNlID0gMTsKLQkJcHV0X2NwdSgpOwotCX0KKwltdXRleF9sb2NrKCZkbWFfbGlzdF9tdXRleCk7CisJY2hhbiA9IGRldl90b19kbWFfY2hhbihkZXYpOworCWlmIChjaGFuKQorCQllcnIgPSBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBjaGFuLT5jbGllbnRfY291bnQpOworCWVsc2UKKwkJZXJyID0gLUVOT0RFVjsKKwltdXRleF91bmxvY2soJmRtYV9saXN0X211dGV4KTsKIAotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBpbl91c2UpOworCXJldHVybiBlcnI7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSBkbWFfYXR0cnNbXSA9IHsKQEAgLTEyNyw3OCArMTQ0LDExMiBAQAogCV9fQVRUUl9OVUxMCiB9OwogCi1zdGF0aWMgdm9pZCBkbWFfYXN5bmNfZGV2aWNlX2NsZWFudXAoc3RydWN0IGtyZWYgKmtyZWYpOwotCi1zdGF0aWMgdm9pZCBkbWFfZGV2X3JlbGVhc2Uoc3RydWN0IGRldmljZSAqZGV2KQorc3RhdGljIHZvaWQgY2hhbl9kZXZfcmVsZWFzZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7Ci0Jc3RydWN0IGRtYV9jaGFuICpjaGFuID0gdG9fZG1hX2NoYW4oZGV2KTsKLQlrcmVmX3B1dCgmY2hhbi0+ZGV2aWNlLT5yZWZjb3VudCwgZG1hX2FzeW5jX2RldmljZV9jbGVhbnVwKTsKKwlzdHJ1Y3QgZG1hX2NoYW5fZGV2ICpjaGFuX2RldjsKKworCWNoYW5fZGV2ID0gY29udGFpbmVyX29mKGRldiwgdHlwZW9mKCpjaGFuX2RldiksIGRldmljZSk7CisJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoY2hhbl9kZXYtPmlkcl9yZWYpKSB7CisJCW11dGV4X2xvY2soJmRtYV9saXN0X211dGV4KTsKKwkJaWRyX3JlbW92ZSgmZG1hX2lkciwgY2hhbl9kZXYtPmRldl9pZCk7CisJCW11dGV4X3VubG9jaygmZG1hX2xpc3RfbXV0ZXgpOworCQlrZnJlZShjaGFuX2Rldi0+aWRyX3JlZik7CisJfQorCWtmcmVlKGNoYW5fZGV2KTsKIH0KIAogc3RhdGljIHN0cnVjdCBjbGFzcyBkbWFfZGV2Y2xhc3MgPSB7CiAJLm5hbWUJCT0gImRtYSIsCiAJLmRldl9hdHRycwk9IGRtYV9hdHRycywKLQkuZGV2X3JlbGVhc2UJPSBkbWFfZGV2X3JlbGVhc2UsCisJLmRldl9yZWxlYXNlCT0gY2hhbl9kZXZfcmVsZWFzZSwKIH07CiAKIC8qIC0tLSBjbGllbnQgYW5kIGRldmljZSByZWdpc3RyYXRpb24gLS0tICovCiAKLSNkZWZpbmUgZG1hX2NoYW5fc2F0aXNmaWVzX21hc2soY2hhbiwgbWFzaykgXAotCV9fZG1hX2NoYW5fc2F0aXNmaWVzX21hc2soKGNoYW4pLCAmKG1hc2spKQorI2RlZmluZSBkbWFfZGV2aWNlX3NhdGlzZmllc19tYXNrKGRldmljZSwgbWFzaykgXAorCV9fZG1hX2RldmljZV9zYXRpc2ZpZXNfbWFzaygoZGV2aWNlKSwgJihtYXNrKSkKIHN0YXRpYyBpbnQKLV9fZG1hX2NoYW5fc2F0aXNmaWVzX21hc2soc3RydWN0IGRtYV9jaGFuICpjaGFuLCBkbWFfY2FwX21hc2tfdCAqd2FudCkKK19fZG1hX2RldmljZV9zYXRpc2ZpZXNfbWFzayhzdHJ1Y3QgZG1hX2RldmljZSAqZGV2aWNlLCBkbWFfY2FwX21hc2tfdCAqd2FudCkKIHsKIAlkbWFfY2FwX21hc2tfdCBoYXM7CiAKLQliaXRtYXBfYW5kKGhhcy5iaXRzLCB3YW50LT5iaXRzLCBjaGFuLT5kZXZpY2UtPmNhcF9tYXNrLmJpdHMsCisJYml0bWFwX2FuZChoYXMuYml0cywgd2FudC0+Yml0cywgZGV2aWNlLT5jYXBfbWFzay5iaXRzLAogCQlETUFfVFhfVFlQRV9FTkQpOwogCXJldHVybiBiaXRtYXBfZXF1YWwod2FudC0+Yml0cywgaGFzLmJpdHMsIERNQV9UWF9UWVBFX0VORCk7CiB9CiAKLS8qKgotICogZG1hX2NsaWVudF9jaGFuX2FsbG9jIC0gdHJ5IHRvIGFsbG9jYXRlIGNoYW5uZWxzIHRvIGEgY2xpZW50Ci0gKiBAY2xpZW50OiAmZG1hX2NsaWVudAotICoKLSAqIENhbGxlZCB3aXRoIGRtYV9saXN0X211dGV4IGhlbGQuCi0gKi8KLXN0YXRpYyB2b2lkIGRtYV9jbGllbnRfY2hhbl9hbGxvYyhzdHJ1Y3QgZG1hX2NsaWVudCAqY2xpZW50KQorc3RhdGljIHN0cnVjdCBtb2R1bGUgKmRtYV9jaGFuX3RvX293bmVyKHN0cnVjdCBkbWFfY2hhbiAqY2hhbikKIHsKLQlzdHJ1Y3QgZG1hX2RldmljZSAqZGV2aWNlOwotCXN0cnVjdCBkbWFfY2hhbiAqY2hhbjsKLQlpbnQgZGVzYzsJLyogYWxsb2NhdGVkIGRlc2NyaXB0b3IgY291bnQgKi8KLQllbnVtIGRtYV9zdGF0ZV9jbGllbnQgYWNrOworCXJldHVybiBjaGFuLT5kZXZpY2UtPmRldi0+ZHJpdmVyLT5vd25lcjsKK30KIAotCS8qIEZpbmQgYSBjaGFubmVsICovCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShkZXZpY2UsICZkbWFfZGV2aWNlX2xpc3QsIGdsb2JhbF9ub2RlKSB7Ci0JCS8qIERvZXMgdGhlIGNsaWVudCByZXF1aXJlIGEgc3BlY2lmaWMgRE1BIGNvbnRyb2xsZXI/ICovCi0JCWlmIChjbGllbnQtPnNsYXZlICYmIGNsaWVudC0+c2xhdmUtPmRtYV9kZXYKLQkJCQkmJiBjbGllbnQtPnNsYXZlLT5kbWFfZGV2ICE9IGRldmljZS0+ZGV2KQotCQkJY29udGludWU7CisvKioKKyAqIGJhbGFuY2VfcmVmX2NvdW50IC0gY2F0Y2ggdXAgdGhlIGNoYW5uZWwgcmVmZXJlbmNlIGNvdW50CisgKiBAY2hhbiAtIGNoYW5uZWwgdG8gYmFsYW5jZSAtPmNsaWVudF9jb3VudCB2ZXJzdXMgZG1hZW5naW5lX3JlZl9jb3VudAorICoKKyAqIGJhbGFuY2VfcmVmX2NvdW50IG11c3QgYmUgY2FsbGVkIHVuZGVyIGRtYV9saXN0X211dGV4CisgKi8KK3N0YXRpYyB2b2lkIGJhbGFuY2VfcmVmX2NvdW50KHN0cnVjdCBkbWFfY2hhbiAqY2hhbikKK3sKKwlzdHJ1Y3QgbW9kdWxlICpvd25lciA9IGRtYV9jaGFuX3RvX293bmVyKGNoYW4pOwogCi0JCWxpc3RfZm9yX2VhY2hfZW50cnkoY2hhbiwgJmRldmljZS0+Y2hhbm5lbHMsIGRldmljZV9ub2RlKSB7Ci0JCQlpZiAoIWRtYV9jaGFuX3NhdGlzZmllc19tYXNrKGNoYW4sIGNsaWVudC0+Y2FwX21hc2spKQotCQkJCWNvbnRpbnVlOwotCi0JCQlkZXNjID0gY2hhbi0+ZGV2aWNlLT5kZXZpY2VfYWxsb2NfY2hhbl9yZXNvdXJjZXMoCi0JCQkJCWNoYW4sIGNsaWVudCk7Ci0JCQlpZiAoZGVzYyA+PSAwKSB7Ci0JCQkJYWNrID0gY2xpZW50LT5ldmVudF9jYWxsYmFjayhjbGllbnQsCi0JCQkJCQljaGFuLAotCQkJCQkJRE1BX1JFU09VUkNFX0FWQUlMQUJMRSk7Ci0KLQkJCQkvKiB3ZSBhcmUgZG9uZSBvbmNlIHRoaXMgY2xpZW50IHJlamVjdHMKLQkJCQkgKiBhbiBhdmFpbGFibGUgcmVzb3VyY2UKLQkJCQkgKi8KLQkJCQlpZiAoYWNrID09IERNQV9BQ0spIHsKLQkJCQkJZG1hX2NoYW5fZ2V0KGNoYW4pOwotCQkJCQljaGFuLT5jbGllbnRfY291bnQrKzsKLQkJCQl9IGVsc2UgaWYgKGFjayA9PSBETUFfTkFLKQotCQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KKwl3aGlsZSAoY2hhbi0+Y2xpZW50X2NvdW50IDwgZG1hZW5naW5lX3JlZl9jb3VudCkgeworCQlfX21vZHVsZV9nZXQob3duZXIpOworCQljaGFuLT5jbGllbnRfY291bnQrKzsKIAl9CiB9CiAKKy8qKgorICogZG1hX2NoYW5fZ2V0IC0gdHJ5IHRvIGdyYWIgYSBkbWEgY2hhbm5lbCdzIHBhcmVudCBkcml2ZXIgbW9kdWxlCisgKiBAY2hhbiAtIGNoYW5uZWwgdG8gZ3JhYgorICoKKyAqIE11c3QgYmUgY2FsbGVkIHVuZGVyIGRtYV9saXN0X211dGV4CisgKi8KK3N0YXRpYyBpbnQgZG1hX2NoYW5fZ2V0KHN0cnVjdCBkbWFfY2hhbiAqY2hhbikKK3sKKwlpbnQgZXJyID0gLUVOT0RFVjsKKwlzdHJ1Y3QgbW9kdWxlICpvd25lciA9IGRtYV9jaGFuX3RvX293bmVyKGNoYW4pOworCisJaWYgKGNoYW4tPmNsaWVudF9jb3VudCkgeworCQlfX21vZHVsZV9nZXQob3duZXIpOworCQllcnIgPSAwOworCX0gZWxzZSBpZiAodHJ5X21vZHVsZV9nZXQob3duZXIpKQorCQllcnIgPSAwOworCisJaWYgKGVyciA9PSAwKQorCQljaGFuLT5jbGllbnRfY291bnQrKzsKKworCS8qIGFsbG9jYXRlIHVwb24gZmlyc3QgY2xpZW50IHJlZmVyZW5jZSAqLworCWlmIChjaGFuLT5jbGllbnRfY291bnQgPT0gMSAmJiBlcnIgPT0gMCkgeworCQlpbnQgZGVzY19jbnQgPSBjaGFuLT5kZXZpY2UtPmRldmljZV9hbGxvY19jaGFuX3Jlc291cmNlcyhjaGFuKTsKKworCQlpZiAoZGVzY19jbnQgPCAwKSB7CisJCQllcnIgPSBkZXNjX2NudDsKKwkJCWNoYW4tPmNsaWVudF9jb3VudCA9IDA7CisJCQltb2R1bGVfcHV0KG93bmVyKTsKKwkJfSBlbHNlIGlmICghZG1hX2hhc19jYXAoRE1BX1BSSVZBVEUsIGNoYW4tPmRldmljZS0+Y2FwX21hc2spKQorCQkJYmFsYW5jZV9yZWZfY291bnQoY2hhbik7CisJfQorCisJcmV0dXJuIGVycjsKK30KKworLyoqCisgKiBkbWFfY2hhbl9wdXQgLSBkcm9wIGEgcmVmZXJlbmNlIHRvIGEgZG1hIGNoYW5uZWwncyBwYXJlbnQgZHJpdmVyIG1vZHVsZQorICogQGNoYW4gLSBjaGFubmVsIHRvIHJlbGVhc2UKKyAqCisgKiBNdXN0IGJlIGNhbGxlZCB1bmRlciBkbWFfbGlzdF9tdXRleAorICovCitzdGF0aWMgdm9pZCBkbWFfY2hhbl9wdXQoc3RydWN0IGRtYV9jaGFuICpjaGFuKQoreworCWlmICghY2hhbi0+Y2xpZW50X2NvdW50KQorCQlyZXR1cm47IC8qIHRoaXMgY2hhbm5lbCBmYWlsZWQgYWxsb2NfY2hhbl9yZXNvdXJjZXMgKi8KKwljaGFuLT5jbGllbnRfY291bnQtLTsKKwltb2R1bGVfcHV0KGRtYV9jaGFuX3RvX293bmVyKGNoYW4pKTsKKwlpZiAoY2hhbi0+Y2xpZW50X2NvdW50ID09IDApCisJCWNoYW4tPmRldmljZS0+ZGV2aWNlX2ZyZWVfY2hhbl9yZXNvdXJjZXMoY2hhbik7Cit9CisKIGVudW0gZG1hX3N0YXR1cyBkbWFfc3luY193YWl0KHN0cnVjdCBkbWFfY2hhbiAqY2hhbiwgZG1hX2Nvb2tpZV90IGNvb2tpZSkKIHsKIAllbnVtIGRtYV9zdGF0dXMgc3RhdHVzOwpAQCAtMjE4LDEzOCArMjY5LDM0MiBAQAogRVhQT1JUX1NZTUJPTChkbWFfc3luY193YWl0KTsKIAogLyoqCi0gKiBkbWFfY2hhbl9jbGVhbnVwIC0gcmVsZWFzZSBhIERNQSBjaGFubmVsJ3MgcmVzb3VyY2VzCi0gKiBAa3JlZjoga2VybmVsIHJlZmVyZW5jZSBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucyB0aGUgRE1BIGNoYW5uZWwgZGV2aWNlCisgKiBkbWFfY2FwX21hc2tfYWxsIC0gZW5hYmxlIGl0ZXJhdGlvbiBvdmVyIGFsbCBvcGVyYXRpb24gdHlwZXMKICAqLwotdm9pZCBkbWFfY2hhbl9jbGVhbnVwKHN0cnVjdCBrcmVmICprcmVmKQotewotCXN0cnVjdCBkbWFfY2hhbiAqY2hhbiA9IGNvbnRhaW5lcl9vZihrcmVmLCBzdHJ1Y3QgZG1hX2NoYW4sIHJlZmNvdW50KTsKLQljaGFuLT5kZXZpY2UtPmRldmljZV9mcmVlX2NoYW5fcmVzb3VyY2VzKGNoYW4pOwotCWtyZWZfcHV0KCZjaGFuLT5kZXZpY2UtPnJlZmNvdW50LCBkbWFfYXN5bmNfZGV2aWNlX2NsZWFudXApOwotfQotRVhQT1JUX1NZTUJPTChkbWFfY2hhbl9jbGVhbnVwKTsKLQotc3RhdGljIHZvaWQgZG1hX2NoYW5fZnJlZV9yY3Uoc3RydWN0IHJjdV9oZWFkICpyY3UpCi17Ci0Jc3RydWN0IGRtYV9jaGFuICpjaGFuID0gY29udGFpbmVyX29mKHJjdSwgc3RydWN0IGRtYV9jaGFuLCByY3UpOwotCWludCBiaWFzID0gMHg3RkZGRkZGRjsKLQlpbnQgaTsKLQlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoaSkKLQkJYmlhcyAtPSBsb2NhbF9yZWFkKCZwZXJfY3B1X3B0cihjaGFuLT5sb2NhbCwgaSktPnJlZmNvdW50KTsKLQlhdG9taWNfc3ViKGJpYXMsICZjaGFuLT5yZWZjb3VudC5yZWZjb3VudCk7Ci0Ja3JlZl9wdXQoJmNoYW4tPnJlZmNvdW50LCBkbWFfY2hhbl9jbGVhbnVwKTsKLX0KLQotc3RhdGljIHZvaWQgZG1hX2NoYW5fcmVsZWFzZShzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4pCi17Ci0JYXRvbWljX2FkZCgweDdGRkZGRkZGLCAmY2hhbi0+cmVmY291bnQucmVmY291bnQpOwotCWNoYW4tPnNsb3dfcmVmID0gMTsKLQljYWxsX3JjdSgmY2hhbi0+cmN1LCBkbWFfY2hhbl9mcmVlX3JjdSk7Ci19CitzdGF0aWMgZG1hX2NhcF9tYXNrX3QgZG1hX2NhcF9tYXNrX2FsbDsKIAogLyoqCi0gKiBkbWFfY2hhbnNfbm90aWZ5X2F2YWlsYWJsZSAtIGJyb2FkY2FzdCBhdmFpbGFibGUgY2hhbm5lbHMgdG8gdGhlIGNsaWVudHMKKyAqIGRtYV9jaGFuX3RibF9lbnQgLSB0cmFja3MgY2hhbm5lbCBhbGxvY2F0aW9ucyBwZXIgY29yZS9vcGVyYXRpb24KKyAqIEBjaGFuIC0gYXNzb2NpYXRlZCBjaGFubmVsIGZvciB0aGlzIGVudHJ5CiAgKi8KLXN0YXRpYyB2b2lkIGRtYV9jbGllbnRzX25vdGlmeV9hdmFpbGFibGUodm9pZCkKLXsKLQlzdHJ1Y3QgZG1hX2NsaWVudCAqY2xpZW50OwotCi0JbXV0ZXhfbG9jaygmZG1hX2xpc3RfbXV0ZXgpOwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShjbGllbnQsICZkbWFfY2xpZW50X2xpc3QsIGdsb2JhbF9ub2RlKQotCQlkbWFfY2xpZW50X2NoYW5fYWxsb2MoY2xpZW50KTsKLQotCW11dGV4X3VubG9jaygmZG1hX2xpc3RfbXV0ZXgpOwotfQorc3RydWN0IGRtYV9jaGFuX3RibF9lbnQgeworCXN0cnVjdCBkbWFfY2hhbiAqY2hhbjsKK307CiAKIC8qKgotICogZG1hX2NoYW5zX25vdGlmeV9hdmFpbGFibGUgLSB0ZWxsIHRoZSBjbGllbnRzIHRoYXQgYSBjaGFubmVsIGlzIGdvaW5nIGF3YXkKLSAqIEBjaGFuOiBjaGFubmVsIG9uIGl0cyB3YXkgb3V0CisgKiBjaGFubmVsX3RhYmxlIC0gcGVyY3B1IGxvb2t1cCB0YWJsZSBmb3IgbWVtb3J5LXRvLW1lbW9yeSBvZmZsb2FkIHByb3ZpZGVycwogICovCi1zdGF0aWMgdm9pZCBkbWFfY2xpZW50c19ub3RpZnlfcmVtb3ZlZChzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4pCitzdGF0aWMgc3RydWN0IGRtYV9jaGFuX3RibF9lbnQgKmNoYW5uZWxfdGFibGVbRE1BX1RYX1RZUEVfRU5EXTsKKworc3RhdGljIGludCBfX2luaXQgZG1hX2NoYW5uZWxfdGFibGVfaW5pdCh2b2lkKQogewotCXN0cnVjdCBkbWFfY2xpZW50ICpjbGllbnQ7Ci0JZW51bSBkbWFfc3RhdGVfY2xpZW50IGFjazsKKwllbnVtIGRtYV90cmFuc2FjdGlvbl90eXBlIGNhcDsKKwlpbnQgZXJyID0gMDsKIAotCW11dGV4X2xvY2soJmRtYV9saXN0X211dGV4KTsKKwliaXRtYXBfZmlsbChkbWFfY2FwX21hc2tfYWxsLmJpdHMsIERNQV9UWF9UWVBFX0VORCk7CiAKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNsaWVudCwgJmRtYV9jbGllbnRfbGlzdCwgZ2xvYmFsX25vZGUpIHsKLQkJYWNrID0gY2xpZW50LT5ldmVudF9jYWxsYmFjayhjbGllbnQsIGNoYW4sCi0JCQkJRE1BX1JFU09VUkNFX1JFTU9WRUQpOworCS8qICdpbnRlcnJ1cHQnLCAncHJpdmF0ZScsIGFuZCAnc2xhdmUnIGFyZSBjaGFubmVsIGNhcGFiaWxpdGllcywKKwkgKiBidXQgYXJlIG5vdCBhc3NvY2lhdGVkIHdpdGggYW4gb3BlcmF0aW9uIHNvIHRoZXkgZG8gbm90IG5lZWQKKwkgKiBhbiBlbnRyeSBpbiB0aGUgY2hhbm5lbF90YWJsZQorCSAqLworCWNsZWFyX2JpdChETUFfSU5URVJSVVBULCBkbWFfY2FwX21hc2tfYWxsLmJpdHMpOworCWNsZWFyX2JpdChETUFfUFJJVkFURSwgZG1hX2NhcF9tYXNrX2FsbC5iaXRzKTsKKwljbGVhcl9iaXQoRE1BX1NMQVZFLCBkbWFfY2FwX21hc2tfYWxsLmJpdHMpOwogCi0JCS8qIGNsaWVudCB3YXMgaG9sZGluZyByZXNvdXJjZXMgZm9yIHRoaXMgY2hhbm5lbCBzbwotCQkgKiBmcmVlIGl0Ci0JCSAqLwotCQlpZiAoYWNrID09IERNQV9BQ0spIHsKLQkJCWRtYV9jaGFuX3B1dChjaGFuKTsKLQkJCWNoYW4tPmNsaWVudF9jb3VudC0tOworCWZvcl9lYWNoX2RtYV9jYXBfbWFzayhjYXAsIGRtYV9jYXBfbWFza19hbGwpIHsKKwkJY2hhbm5lbF90YWJsZVtjYXBdID0gYWxsb2NfcGVyY3B1KHN0cnVjdCBkbWFfY2hhbl90YmxfZW50KTsKKwkJaWYgKCFjaGFubmVsX3RhYmxlW2NhcF0pIHsKKwkJCWVyciA9IC1FTk9NRU07CisJCQlicmVhazsKIAkJfQogCX0KIAotCW11dGV4X3VubG9jaygmZG1hX2xpc3RfbXV0ZXgpOworCWlmIChlcnIpIHsKKwkJcHJfZXJyKCJkbWFlbmdpbmU6IGluaXRpYWxpemF0aW9uIGZhaWx1cmVcbiIpOworCQlmb3JfZWFjaF9kbWFfY2FwX21hc2soY2FwLCBkbWFfY2FwX21hc2tfYWxsKQorCQkJaWYgKGNoYW5uZWxfdGFibGVbY2FwXSkKKwkJCQlmcmVlX3BlcmNwdShjaGFubmVsX3RhYmxlW2NhcF0pOworCX0KKworCXJldHVybiBlcnI7CiB9CithcmNoX2luaXRjYWxsKGRtYV9jaGFubmVsX3RhYmxlX2luaXQpOwogCiAvKioKLSAqIGRtYV9hc3luY19jbGllbnRfcmVnaXN0ZXIgLSByZWdpc3RlciBhICZkbWFfY2xpZW50Ci0gKiBAY2xpZW50OiBwdHIgdG8gYSBjbGllbnQgc3RydWN0dXJlIHdpdGggdmFsaWQgJ2V2ZW50X2NhbGxiYWNrJyBhbmQgJ2NhcF9tYXNrJworICogZG1hX2ZpbmRfY2hhbm5lbCAtIGZpbmQgYSBjaGFubmVsIHRvIGNhcnJ5IG91dCB0aGUgb3BlcmF0aW9uCisgKiBAdHhfdHlwZTogdHJhbnNhY3Rpb24gdHlwZQogICovCi12b2lkIGRtYV9hc3luY19jbGllbnRfcmVnaXN0ZXIoc3RydWN0IGRtYV9jbGllbnQgKmNsaWVudCkKK3N0cnVjdCBkbWFfY2hhbiAqZG1hX2ZpbmRfY2hhbm5lbChlbnVtIGRtYV90cmFuc2FjdGlvbl90eXBlIHR4X3R5cGUpCiB7Ci0JLyogdmFsaWRhdGUgY2xpZW50IGRhdGEgKi8KLQlCVUdfT04oZG1hX2hhc19jYXAoRE1BX1NMQVZFLCBjbGllbnQtPmNhcF9tYXNrKSAmJgotCQkhY2xpZW50LT5zbGF2ZSk7CisJc3RydWN0IGRtYV9jaGFuICpjaGFuOworCWludCBjcHU7CiAKLQltdXRleF9sb2NrKCZkbWFfbGlzdF9tdXRleCk7Ci0JbGlzdF9hZGRfdGFpbCgmY2xpZW50LT5nbG9iYWxfbm9kZSwgJmRtYV9jbGllbnRfbGlzdCk7Ci0JbXV0ZXhfdW5sb2NrKCZkbWFfbGlzdF9tdXRleCk7CisJV0FSTl9PTkNFKGRtYWVuZ2luZV9yZWZfY291bnQgPT0gMCwKKwkJICAiY2xpZW50IGNhbGxlZCAlcyB3aXRob3V0IGEgcmVmZXJlbmNlIiwgX19mdW5jX18pOworCisJY3B1ID0gZ2V0X2NwdSgpOworCWNoYW4gPSBwZXJfY3B1X3B0cihjaGFubmVsX3RhYmxlW3R4X3R5cGVdLCBjcHUpLT5jaGFuOworCXB1dF9jcHUoKTsKKworCXJldHVybiBjaGFuOwogfQotRVhQT1JUX1NZTUJPTChkbWFfYXN5bmNfY2xpZW50X3JlZ2lzdGVyKTsKK0VYUE9SVF9TWU1CT0woZG1hX2ZpbmRfY2hhbm5lbCk7CiAKIC8qKgotICogZG1hX2FzeW5jX2NsaWVudF91bnJlZ2lzdGVyIC0gdW5yZWdpc3RlciBhIGNsaWVudCBhbmQgZnJlZSB0aGUgJmRtYV9jbGllbnQKLSAqIEBjbGllbnQ6ICZkbWFfY2xpZW50IHRvIGZyZWUKLSAqCi0gKiBGb3JjZSBmcmVlcyBhbnkgYWxsb2NhdGVkIERNQSBjaGFubmVscywgZnJlZXMgdGhlICZkbWFfY2xpZW50IG1lbW9yeQorICogZG1hX2lzc3VlX3BlbmRpbmdfYWxsIC0gZmx1c2ggYWxsIHBlbmRpbmcgb3BlcmF0aW9ucyBhY3Jvc3MgYWxsIGNoYW5uZWxzCiAgKi8KLXZvaWQgZG1hX2FzeW5jX2NsaWVudF91bnJlZ2lzdGVyKHN0cnVjdCBkbWFfY2xpZW50ICpjbGllbnQpCit2b2lkIGRtYV9pc3N1ZV9wZW5kaW5nX2FsbCh2b2lkKQogewogCXN0cnVjdCBkbWFfZGV2aWNlICpkZXZpY2U7CiAJc3RydWN0IGRtYV9jaGFuICpjaGFuOwotCWVudW0gZG1hX3N0YXRlX2NsaWVudCBhY2s7CiAKLQlpZiAoIWNsaWVudCkKLQkJcmV0dXJuOworCVdBUk5fT05DRShkbWFlbmdpbmVfcmVmX2NvdW50ID09IDAsCisJCSAgImNsaWVudCBjYWxsZWQgJXMgd2l0aG91dCBhIHJlZmVyZW5jZSIsIF9fZnVuY19fKTsKIAotCW11dGV4X2xvY2soJmRtYV9saXN0X211dGV4KTsKLQkvKiBmcmVlIGFsbCBjaGFubmVscyB0aGUgY2xpZW50IGlzIGhvbGRpbmcgKi8KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRldmljZSwgJmRtYV9kZXZpY2VfbGlzdCwgZ2xvYmFsX25vZGUpCi0JCWxpc3RfZm9yX2VhY2hfZW50cnkoY2hhbiwgJmRldmljZS0+Y2hhbm5lbHMsIGRldmljZV9ub2RlKSB7Ci0JCQlhY2sgPSBjbGllbnQtPmV2ZW50X2NhbGxiYWNrKGNsaWVudCwgY2hhbiwKLQkJCQlETUFfUkVTT1VSQ0VfUkVNT1ZFRCk7Ci0KLQkJCWlmIChhY2sgPT0gRE1BX0FDSykgewotCQkJCWRtYV9jaGFuX3B1dChjaGFuKTsKLQkJCQljaGFuLT5jbGllbnRfY291bnQtLTsKLQkJCX0KLQkJfQotCi0JbGlzdF9kZWwoJmNsaWVudC0+Z2xvYmFsX25vZGUpOwotCW11dGV4X3VubG9jaygmZG1hX2xpc3RfbXV0ZXgpOworCXJjdV9yZWFkX2xvY2soKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShkZXZpY2UsICZkbWFfZGV2aWNlX2xpc3QsIGdsb2JhbF9ub2RlKSB7CisJCWlmIChkbWFfaGFzX2NhcChETUFfUFJJVkFURSwgZGV2aWNlLT5jYXBfbWFzaykpCisJCQljb250aW51ZTsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShjaGFuLCAmZGV2aWNlLT5jaGFubmVscywgZGV2aWNlX25vZGUpCisJCQlpZiAoY2hhbi0+Y2xpZW50X2NvdW50KQorCQkJCWRldmljZS0+ZGV2aWNlX2lzc3VlX3BlbmRpbmcoY2hhbik7CisJfQorCXJjdV9yZWFkX3VubG9jaygpOwogfQotRVhQT1JUX1NZTUJPTChkbWFfYXN5bmNfY2xpZW50X3VucmVnaXN0ZXIpOworRVhQT1JUX1NZTUJPTChkbWFfaXNzdWVfcGVuZGluZ19hbGwpOwogCiAvKioKLSAqIGRtYV9hc3luY19jbGllbnRfY2hhbl9yZXF1ZXN0IC0gc2VuZCBhbGwgYXZhaWxhYmxlIGNoYW5uZWxzIHRvIHRoZQotICogY2xpZW50IHRoYXQgc2F0aXNmeSB0aGUgY2FwYWJpbGl0eSBtYXNrCi0gKiBAY2xpZW50IC0gcmVxdWVzdGVyCisgKiBudGhfY2hhbiAtIHJldHVybnMgdGhlIG50aCBjaGFubmVsIG9mIHRoZSBnaXZlbiBjYXBhYmlsaXR5CisgKiBAY2FwOiBjYXBhYmlsaXR5IHRvIG1hdGNoCisgKiBAbjogbnRoIGNoYW5uZWwgZGVzaXJlZAorICoKKyAqIERlZmF1bHRzIHRvIHJldHVybmluZyB0aGUgY2hhbm5lbCB3aXRoIHRoZSBkZXNpcmVkIGNhcGFiaWxpdHkgYW5kIHRoZQorICogbG93ZXN0IHJlZmVyZW5jZSBjb3VudCB3aGVuICduJyBjYW5ub3QgYmUgc2F0aXNmaWVkLiAgTXVzdCBiZSBjYWxsZWQKKyAqIHVuZGVyIGRtYV9saXN0X211dGV4LgogICovCi12b2lkIGRtYV9hc3luY19jbGllbnRfY2hhbl9yZXF1ZXN0KHN0cnVjdCBkbWFfY2xpZW50ICpjbGllbnQpCitzdGF0aWMgc3RydWN0IGRtYV9jaGFuICpudGhfY2hhbihlbnVtIGRtYV90cmFuc2FjdGlvbl90eXBlIGNhcCwgaW50IG4pCit7CisJc3RydWN0IGRtYV9kZXZpY2UgKmRldmljZTsKKwlzdHJ1Y3QgZG1hX2NoYW4gKmNoYW47CisJc3RydWN0IGRtYV9jaGFuICpyZXQgPSBOVUxMOworCXN0cnVjdCBkbWFfY2hhbiAqbWluID0gTlVMTDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoZGV2aWNlLCAmZG1hX2RldmljZV9saXN0LCBnbG9iYWxfbm9kZSkgeworCQlpZiAoIWRtYV9oYXNfY2FwKGNhcCwgZGV2aWNlLT5jYXBfbWFzaykgfHwKKwkJICAgIGRtYV9oYXNfY2FwKERNQV9QUklWQVRFLCBkZXZpY2UtPmNhcF9tYXNrKSkKKwkJCWNvbnRpbnVlOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNoYW4sICZkZXZpY2UtPmNoYW5uZWxzLCBkZXZpY2Vfbm9kZSkgeworCQkJaWYgKCFjaGFuLT5jbGllbnRfY291bnQpCisJCQkJY29udGludWU7CisJCQlpZiAoIW1pbikKKwkJCQltaW4gPSBjaGFuOworCQkJZWxzZSBpZiAoY2hhbi0+dGFibGVfY291bnQgPCBtaW4tPnRhYmxlX2NvdW50KQorCQkJCW1pbiA9IGNoYW47CisKKwkJCWlmIChuLS0gPT0gMCkgeworCQkJCXJldCA9IGNoYW47CisJCQkJYnJlYWs7IC8qIGRvbmUgKi8KKwkJCX0KKwkJfQorCQlpZiAocmV0KQorCQkJYnJlYWs7IC8qIGRvbmUgKi8KKwl9CisKKwlpZiAoIXJldCkKKwkJcmV0ID0gbWluOworCisJaWYgKHJldCkKKwkJcmV0LT50YWJsZV9jb3VudCsrOworCisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBkbWFfY2hhbm5lbF9yZWJhbGFuY2UgLSByZWRpc3RyaWJ1dGUgdGhlIGF2YWlsYWJsZSBjaGFubmVscworICoKKyAqIE9wdGltaXplIGZvciBjcHUgaXNvbGF0aW9uIChlYWNoIGNwdSBnZXRzIGEgZGVkaWNhdGVkIGNoYW5uZWwgZm9yIGFuCisgKiBvcGVyYXRpb24gdHlwZSkgaW4gdGhlIFNNUCBjYXNlLCAgYW5kIG9wZXJhdGlvbiBpc29sYXRpb24gKGF2b2lkCisgKiBtdWx0aS10YXNraW5nIGNoYW5uZWxzKSBpbiB0aGUgbm9uLVNNUCBjYXNlLiAgTXVzdCBiZSBjYWxsZWQgdW5kZXIKKyAqIGRtYV9saXN0X211dGV4LgorICovCitzdGF0aWMgdm9pZCBkbWFfY2hhbm5lbF9yZWJhbGFuY2Uodm9pZCkKK3sKKwlzdHJ1Y3QgZG1hX2NoYW4gKmNoYW47CisJc3RydWN0IGRtYV9kZXZpY2UgKmRldmljZTsKKwlpbnQgY3B1OworCWludCBjYXA7CisJaW50IG47CisKKwkvKiB1bmRvIHRoZSBsYXN0IGRpc3RyaWJ1dGlvbiAqLworCWZvcl9lYWNoX2RtYV9jYXBfbWFzayhjYXAsIGRtYV9jYXBfbWFza19hbGwpCisJCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShjcHUpCisJCQlwZXJfY3B1X3B0cihjaGFubmVsX3RhYmxlW2NhcF0sIGNwdSktPmNoYW4gPSBOVUxMOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShkZXZpY2UsICZkbWFfZGV2aWNlX2xpc3QsIGdsb2JhbF9ub2RlKSB7CisJCWlmIChkbWFfaGFzX2NhcChETUFfUFJJVkFURSwgZGV2aWNlLT5jYXBfbWFzaykpCisJCQljb250aW51ZTsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShjaGFuLCAmZGV2aWNlLT5jaGFubmVscywgZGV2aWNlX25vZGUpCisJCQljaGFuLT50YWJsZV9jb3VudCA9IDA7CisJfQorCisJLyogZG9uJ3QgcG9wdWxhdGUgdGhlIGNoYW5uZWxfdGFibGUgaWYgbm8gY2xpZW50cyBhcmUgYXZhaWxhYmxlICovCisJaWYgKCFkbWFlbmdpbmVfcmVmX2NvdW50KQorCQlyZXR1cm47CisKKwkvKiByZWRpc3RyaWJ1dGUgYXZhaWxhYmxlIGNoYW5uZWxzICovCisJbiA9IDA7CisJZm9yX2VhY2hfZG1hX2NhcF9tYXNrKGNhcCwgZG1hX2NhcF9tYXNrX2FsbCkKKwkJZm9yX2VhY2hfb25saW5lX2NwdShjcHUpIHsKKwkJCWlmIChudW1fcG9zc2libGVfY3B1cygpID4gMSkKKwkJCQljaGFuID0gbnRoX2NoYW4oY2FwLCBuKyspOworCQkJZWxzZQorCQkJCWNoYW4gPSBudGhfY2hhbihjYXAsIC0xKTsKKworCQkJcGVyX2NwdV9wdHIoY2hhbm5lbF90YWJsZVtjYXBdLCBjcHUpLT5jaGFuID0gY2hhbjsKKwkJfQorfQorCitzdGF0aWMgc3RydWN0IGRtYV9jaGFuICpwcml2YXRlX2NhbmRpZGF0ZShkbWFfY2FwX21hc2tfdCAqbWFzaywgc3RydWN0IGRtYV9kZXZpY2UgKmRldiwKKwkJCQkJICBkbWFfZmlsdGVyX2ZuIGZuLCB2b2lkICpmbl9wYXJhbSkKK3sKKwlzdHJ1Y3QgZG1hX2NoYW4gKmNoYW47CisKKwlpZiAoIV9fZG1hX2RldmljZV9zYXRpc2ZpZXNfbWFzayhkZXYsIG1hc2spKSB7CisJCXByX2RlYnVnKCIlczogd3JvbmcgY2FwYWJpbGl0aWVzXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiBOVUxMOworCX0KKwkvKiBkZXZpY2VzIHdpdGggbXVsdGlwbGUgY2hhbm5lbHMgbmVlZCBzcGVjaWFsIGhhbmRsaW5nIGFzIHdlIG5lZWQgdG8KKwkgKiBlbnN1cmUgdGhhdCBhbGwgY2hhbm5lbHMgYXJlIGVpdGhlciBwcml2YXRlIG9yIHB1YmxpYy4KKwkgKi8KKwlpZiAoZGV2LT5jaGFuY250ID4gMSAmJiAhZG1hX2hhc19jYXAoRE1BX1BSSVZBVEUsIGRldi0+Y2FwX21hc2spKQorCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNoYW4sICZkZXYtPmNoYW5uZWxzLCBkZXZpY2Vfbm9kZSkgeworCQkJLyogc29tZSBjaGFubmVscyBhcmUgYWxyZWFkeSBwdWJsaWNseSBhbGxvY2F0ZWQgKi8KKwkJCWlmIChjaGFuLT5jbGllbnRfY291bnQpCisJCQkJcmV0dXJuIE5VTEw7CisJCX0KKworCWxpc3RfZm9yX2VhY2hfZW50cnkoY2hhbiwgJmRldi0+Y2hhbm5lbHMsIGRldmljZV9ub2RlKSB7CisJCWlmIChjaGFuLT5jbGllbnRfY291bnQpIHsKKwkJCXByX2RlYnVnKCIlczogJXMgYnVzeVxuIiwKKwkJCQkgX19mdW5jX18sIGRtYV9jaGFuX25hbWUoY2hhbikpOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKGZuICYmICFmbihjaGFuLCBmbl9wYXJhbSkpIHsKKwkJCXByX2RlYnVnKCIlczogJXMgZmlsdGVyIHNhaWQgZmFsc2VcbiIsCisJCQkJIF9fZnVuY19fLCBkbWFfY2hhbl9uYW1lKGNoYW4pKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCXJldHVybiBjaGFuOworCX0KKworCXJldHVybiBOVUxMOworfQorCisvKioKKyAqIGRtYV9yZXF1ZXN0X2NoYW5uZWwgLSB0cnkgdG8gYWxsb2NhdGUgYW4gZXhjbHVzaXZlIGNoYW5uZWwKKyAqIEBtYXNrOiBjYXBhYmlsaXRpZXMgdGhhdCB0aGUgY2hhbm5lbCBtdXN0IHNhdGlzZnkKKyAqIEBmbjogb3B0aW9uYWwgY2FsbGJhY2sgdG8gZGlzcG9zaXRpb24gYXZhaWxhYmxlIGNoYW5uZWxzCisgKiBAZm5fcGFyYW06IG9wYXF1ZSBwYXJhbWV0ZXIgdG8gcGFzcyB0byBkbWFfZmlsdGVyX2ZuCisgKi8KK3N0cnVjdCBkbWFfY2hhbiAqX19kbWFfcmVxdWVzdF9jaGFubmVsKGRtYV9jYXBfbWFza190ICptYXNrLCBkbWFfZmlsdGVyX2ZuIGZuLCB2b2lkICpmbl9wYXJhbSkKK3sKKwlzdHJ1Y3QgZG1hX2RldmljZSAqZGV2aWNlLCAqX2Q7CisJc3RydWN0IGRtYV9jaGFuICpjaGFuID0gTlVMTDsKKwlpbnQgZXJyOworCisJLyogRmluZCBhIGNoYW5uZWwgKi8KKwltdXRleF9sb2NrKCZkbWFfbGlzdF9tdXRleCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGRldmljZSwgX2QsICZkbWFfZGV2aWNlX2xpc3QsIGdsb2JhbF9ub2RlKSB7CisJCWNoYW4gPSBwcml2YXRlX2NhbmRpZGF0ZShtYXNrLCBkZXZpY2UsIGZuLCBmbl9wYXJhbSk7CisJCWlmIChjaGFuKSB7CisJCQkvKiBGb3VuZCBhIHN1aXRhYmxlIGNoYW5uZWwsIHRyeSB0byBncmFiLCBwcmVwLCBhbmQKKwkJCSAqIHJldHVybiBpdC4gIFdlIGZpcnN0IHNldCBETUFfUFJJVkFURSB0byBkaXNhYmxlCisJCQkgKiBiYWxhbmNlX3JlZl9jb3VudCBhcyB0aGlzIGNoYW5uZWwgd2lsbCBub3QgYmUKKwkJCSAqIHB1Ymxpc2hlZCBpbiB0aGUgZ2VuZXJhbC1wdXJwb3NlIGFsbG9jYXRvcgorCQkJICovCisJCQlkbWFfY2FwX3NldChETUFfUFJJVkFURSwgZGV2aWNlLT5jYXBfbWFzayk7CisJCQllcnIgPSBkbWFfY2hhbl9nZXQoY2hhbik7CisKKwkJCWlmIChlcnIgPT0gLUVOT0RFVikgeworCQkJCXByX2RlYnVnKCIlczogJXMgbW9kdWxlIHJlbW92ZWRcbiIsIF9fZnVuY19fLAorCQkJCQkgZG1hX2NoYW5fbmFtZShjaGFuKSk7CisJCQkJbGlzdF9kZWxfcmN1KCZkZXZpY2UtPmdsb2JhbF9ub2RlKTsKKwkJCX0gZWxzZSBpZiAoZXJyKQorCQkJCXByX2VycigiZG1hZW5naW5lOiBmYWlsZWQgdG8gZ2V0ICVzOiAoJWQpXG4iLAorCQkJCSAgICAgICBkbWFfY2hhbl9uYW1lKGNoYW4pLCBlcnIpOworCQkJZWxzZQorCQkJCWJyZWFrOworCQkJY2hhbiA9IE5VTEw7CisJCX0KKwl9CisJbXV0ZXhfdW5sb2NrKCZkbWFfbGlzdF9tdXRleCk7CisKKwlwcl9kZWJ1ZygiJXM6ICVzICglcylcbiIsIF9fZnVuY19fLCBjaGFuID8gInN1Y2Nlc3MiIDogImZhaWwiLAorCQkgY2hhbiA/IGRtYV9jaGFuX25hbWUoY2hhbikgOiBOVUxMKTsKKworCXJldHVybiBjaGFuOworfQorRVhQT1JUX1NZTUJPTF9HUEwoX19kbWFfcmVxdWVzdF9jaGFubmVsKTsKKwordm9pZCBkbWFfcmVsZWFzZV9jaGFubmVsKHN0cnVjdCBkbWFfY2hhbiAqY2hhbikKIHsKIAltdXRleF9sb2NrKCZkbWFfbGlzdF9tdXRleCk7Ci0JZG1hX2NsaWVudF9jaGFuX2FsbG9jKGNsaWVudCk7CisJV0FSTl9PTkNFKGNoYW4tPmNsaWVudF9jb3VudCAhPSAxLAorCQkgICJjaGFuIHJlZmVyZW5jZSBjb3VudCAlZCAhPSAxXG4iLCBjaGFuLT5jbGllbnRfY291bnQpOworCWRtYV9jaGFuX3B1dChjaGFuKTsKIAltdXRleF91bmxvY2soJmRtYV9saXN0X211dGV4KTsKIH0KLUVYUE9SVF9TWU1CT0woZG1hX2FzeW5jX2NsaWVudF9jaGFuX3JlcXVlc3QpOworRVhQT1JUX1NZTUJPTF9HUEwoZG1hX3JlbGVhc2VfY2hhbm5lbCk7CisKKy8qKgorICogZG1hZW5naW5lX2dldCAtIHJlZ2lzdGVyIGludGVyZXN0IGluIGRtYV9jaGFubmVscworICovCit2b2lkIGRtYWVuZ2luZV9nZXQodm9pZCkKK3sKKwlzdHJ1Y3QgZG1hX2RldmljZSAqZGV2aWNlLCAqX2Q7CisJc3RydWN0IGRtYV9jaGFuICpjaGFuOworCWludCBlcnI7CisKKwltdXRleF9sb2NrKCZkbWFfbGlzdF9tdXRleCk7CisJZG1hZW5naW5lX3JlZl9jb3VudCsrOworCisJLyogdHJ5IHRvIGdyYWIgY2hhbm5lbHMgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZGV2aWNlLCBfZCwgJmRtYV9kZXZpY2VfbGlzdCwgZ2xvYmFsX25vZGUpIHsKKwkJaWYgKGRtYV9oYXNfY2FwKERNQV9QUklWQVRFLCBkZXZpY2UtPmNhcF9tYXNrKSkKKwkJCWNvbnRpbnVlOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNoYW4sICZkZXZpY2UtPmNoYW5uZWxzLCBkZXZpY2Vfbm9kZSkgeworCQkJZXJyID0gZG1hX2NoYW5fZ2V0KGNoYW4pOworCQkJaWYgKGVyciA9PSAtRU5PREVWKSB7CisJCQkJLyogbW9kdWxlIHJlbW92ZWQgYmVmb3JlIHdlIGNvdWxkIHVzZSBpdCAqLworCQkJCWxpc3RfZGVsX3JjdSgmZGV2aWNlLT5nbG9iYWxfbm9kZSk7CisJCQkJYnJlYWs7CisJCQl9IGVsc2UgaWYgKGVycikKKwkJCQlwcl9lcnIoImRtYWVuZ2luZTogZmFpbGVkIHRvIGdldCAlczogKCVkKVxuIiwKKwkJCQkgICAgICAgZG1hX2NoYW5fbmFtZShjaGFuKSwgZXJyKTsKKwkJfQorCX0KKworCS8qIGlmIHRoaXMgaXMgdGhlIGZpcnN0IHJlZmVyZW5jZSBhbmQgdGhlcmUgd2VyZSBjaGFubmVscworCSAqIHdhaXRpbmcgd2UgbmVlZCB0byByZWJhbGFuY2UgdG8gZ2V0IHRob3NlIGNoYW5uZWxzCisJICogaW5jb3Jwb3JhdGVkIGludG8gdGhlIGNoYW5uZWwgdGFibGUKKwkgKi8KKwlpZiAoZG1hZW5naW5lX3JlZl9jb3VudCA9PSAxKQorCQlkbWFfY2hhbm5lbF9yZWJhbGFuY2UoKTsKKwltdXRleF91bmxvY2soJmRtYV9saXN0X211dGV4KTsKK30KK0VYUE9SVF9TWU1CT0woZG1hZW5naW5lX2dldCk7CisKKy8qKgorICogZG1hZW5naW5lX3B1dCAtIGxldCBkbWEgZHJpdmVycyBiZSByZW1vdmVkIHdoZW4gcmVmX2NvdW50ID09IDAKKyAqLwordm9pZCBkbWFlbmdpbmVfcHV0KHZvaWQpCit7CisJc3RydWN0IGRtYV9kZXZpY2UgKmRldmljZTsKKwlzdHJ1Y3QgZG1hX2NoYW4gKmNoYW47CisKKwltdXRleF9sb2NrKCZkbWFfbGlzdF9tdXRleCk7CisJZG1hZW5naW5lX3JlZl9jb3VudC0tOworCUJVR19PTihkbWFlbmdpbmVfcmVmX2NvdW50IDwgMCk7CisJLyogZHJvcCBjaGFubmVsIHJlZmVyZW5jZXMgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRldmljZSwgJmRtYV9kZXZpY2VfbGlzdCwgZ2xvYmFsX25vZGUpIHsKKwkJaWYgKGRtYV9oYXNfY2FwKERNQV9QUklWQVRFLCBkZXZpY2UtPmNhcF9tYXNrKSkKKwkJCWNvbnRpbnVlOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNoYW4sICZkZXZpY2UtPmNoYW5uZWxzLCBkZXZpY2Vfbm9kZSkKKwkJCWRtYV9jaGFuX3B1dChjaGFuKTsKKwl9CisJbXV0ZXhfdW5sb2NrKCZkbWFfbGlzdF9tdXRleCk7Cit9CitFWFBPUlRfU1lNQk9MKGRtYWVuZ2luZV9wdXQpOwogCiAvKioKICAqIGRtYV9hc3luY19kZXZpY2VfcmVnaXN0ZXIgLSByZWdpc3RlcnMgRE1BIGRldmljZXMgZm91bmQKQEAgLTM1Nyw5ICs2MTIsOSBAQAogICovCiBpbnQgZG1hX2FzeW5jX2RldmljZV9yZWdpc3RlcihzdHJ1Y3QgZG1hX2RldmljZSAqZGV2aWNlKQogewotCXN0YXRpYyBpbnQgaWQ7CiAJaW50IGNoYW5jbnQgPSAwLCByYzsKIAlzdHJ1Y3QgZG1hX2NoYW4qIGNoYW47CisJYXRvbWljX3QgKmlkcl9yZWY7CiAKIAlpZiAoIWRldmljZSkKIAkJcmV0dXJuIC1FTk9ERVY7CkBAIC0zODYsNTcgKzY0MSw4MyBAQAogCUJVR19PTighZGV2aWNlLT5kZXZpY2VfaXNzdWVfcGVuZGluZyk7CiAJQlVHX09OKCFkZXZpY2UtPmRldik7CiAKLQlpbml0X2NvbXBsZXRpb24oJmRldmljZS0+ZG9uZSk7Ci0Ja3JlZl9pbml0KCZkZXZpY2UtPnJlZmNvdW50KTsKLQorCWlkcl9yZWYgPSBrbWFsbG9jKHNpemVvZigqaWRyX3JlZiksIEdGUF9LRVJORUwpOworCWlmICghaWRyX3JlZikKKwkJcmV0dXJuIC1FTk9NRU07CisJYXRvbWljX3NldChpZHJfcmVmLCAwKTsKKyBpZHJfcmV0cnk6CisJaWYgKCFpZHJfcHJlX2dldCgmZG1hX2lkciwgR0ZQX0tFUk5FTCkpCisJCXJldHVybiAtRU5PTUVNOwogCW11dGV4X2xvY2soJmRtYV9saXN0X211dGV4KTsKLQlkZXZpY2UtPmRldl9pZCA9IGlkKys7CisJcmMgPSBpZHJfZ2V0X25ldygmZG1hX2lkciwgTlVMTCwgJmRldmljZS0+ZGV2X2lkKTsKIAltdXRleF91bmxvY2soJmRtYV9saXN0X211dGV4KTsKKwlpZiAocmMgPT0gLUVBR0FJTikKKwkJZ290byBpZHJfcmV0cnk7CisJZWxzZSBpZiAocmMgIT0gMCkKKwkJcmV0dXJuIHJjOwogCiAJLyogcmVwcmVzZW50IGNoYW5uZWxzIGluIHN5c2ZzLiBQcm9iYWJseSB3YW50IGRldnMgdG9vICovCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShjaGFuLCAmZGV2aWNlLT5jaGFubmVscywgZGV2aWNlX25vZGUpIHsKIAkJY2hhbi0+bG9jYWwgPSBhbGxvY19wZXJjcHUodHlwZW9mKCpjaGFuLT5sb2NhbCkpOwogCQlpZiAoY2hhbi0+bG9jYWwgPT0gTlVMTCkKIAkJCWNvbnRpbnVlOworCQljaGFuLT5kZXYgPSBremFsbG9jKHNpemVvZigqY2hhbi0+ZGV2KSwgR0ZQX0tFUk5FTCk7CisJCWlmIChjaGFuLT5kZXYgPT0gTlVMTCkgeworCQkJZnJlZV9wZXJjcHUoY2hhbi0+bG9jYWwpOworCQkJY29udGludWU7CisJCX0KIAogCQljaGFuLT5jaGFuX2lkID0gY2hhbmNudCsrOwotCQljaGFuLT5kZXYuY2xhc3MgPSAmZG1hX2RldmNsYXNzOwotCQljaGFuLT5kZXYucGFyZW50ID0gZGV2aWNlLT5kZXY7Ci0JCWRldl9zZXRfbmFtZSgmY2hhbi0+ZGV2LCAiZG1hJWRjaGFuJWQiLAorCQljaGFuLT5kZXYtPmRldmljZS5jbGFzcyA9ICZkbWFfZGV2Y2xhc3M7CisJCWNoYW4tPmRldi0+ZGV2aWNlLnBhcmVudCA9IGRldmljZS0+ZGV2OworCQljaGFuLT5kZXYtPmNoYW4gPSBjaGFuOworCQljaGFuLT5kZXYtPmlkcl9yZWYgPSBpZHJfcmVmOworCQljaGFuLT5kZXYtPmRldl9pZCA9IGRldmljZS0+ZGV2X2lkOworCQlhdG9taWNfaW5jKGlkcl9yZWYpOworCQlkZXZfc2V0X25hbWUoJmNoYW4tPmRldi0+ZGV2aWNlLCAiZG1hJWRjaGFuJWQiLAogCQkJICAgICBkZXZpY2UtPmRldl9pZCwgY2hhbi0+Y2hhbl9pZCk7CiAKLQkJcmMgPSBkZXZpY2VfcmVnaXN0ZXIoJmNoYW4tPmRldik7CisJCXJjID0gZGV2aWNlX3JlZ2lzdGVyKCZjaGFuLT5kZXYtPmRldmljZSk7CiAJCWlmIChyYykgewotCQkJY2hhbmNudC0tOwogCQkJZnJlZV9wZXJjcHUoY2hhbi0+bG9jYWwpOwogCQkJY2hhbi0+bG9jYWwgPSBOVUxMOwogCQkJZ290byBlcnJfb3V0OwogCQl9Ci0KLQkJLyogT25lIGZvciB0aGUgY2hhbm5lbCwgb25lIG9mIHRoZSBjbGFzcyBkZXZpY2UgKi8KLQkJa3JlZl9nZXQoJmRldmljZS0+cmVmY291bnQpOwotCQlrcmVmX2dldCgmZGV2aWNlLT5yZWZjb3VudCk7Ci0JCWtyZWZfaW5pdCgmY2hhbi0+cmVmY291bnQpOwogCQljaGFuLT5jbGllbnRfY291bnQgPSAwOwotCQljaGFuLT5zbG93X3JlZiA9IDA7Ci0JCUlOSVRfUkNVX0hFQUQoJmNoYW4tPnJjdSk7CiAJfQorCWRldmljZS0+Y2hhbmNudCA9IGNoYW5jbnQ7CiAKIAltdXRleF9sb2NrKCZkbWFfbGlzdF9tdXRleCk7Ci0JbGlzdF9hZGRfdGFpbCgmZGV2aWNlLT5nbG9iYWxfbm9kZSwgJmRtYV9kZXZpY2VfbGlzdCk7CisJLyogdGFrZSByZWZlcmVuY2VzIG9uIHB1YmxpYyBjaGFubmVscyAqLworCWlmIChkbWFlbmdpbmVfcmVmX2NvdW50ICYmICFkbWFfaGFzX2NhcChETUFfUFJJVkFURSwgZGV2aWNlLT5jYXBfbWFzaykpCisJCWxpc3RfZm9yX2VhY2hfZW50cnkoY2hhbiwgJmRldmljZS0+Y2hhbm5lbHMsIGRldmljZV9ub2RlKSB7CisJCQkvKiBpZiBjbGllbnRzIGFyZSBhbHJlYWR5IHdhaXRpbmcgZm9yIGNoYW5uZWxzIHdlIG5lZWQKKwkJCSAqIHRvIHRha2UgcmVmZXJlbmNlcyBvbiB0aGVpciBiZWhhbGYKKwkJCSAqLworCQkJaWYgKGRtYV9jaGFuX2dldChjaGFuKSA9PSAtRU5PREVWKSB7CisJCQkJLyogbm90ZSB3ZSBjYW4gb25seSBnZXQgaGVyZSBmb3IgdGhlIGZpcnN0CisJCQkJICogY2hhbm5lbCBhcyB0aGUgcmVtYWluaW5nIGNoYW5uZWxzIGFyZQorCQkJCSAqIGd1YXJhbnRlZWQgdG8gZ2V0IGEgcmVmZXJlbmNlCisJCQkJICovCisJCQkJcmMgPSAtRU5PREVWOworCQkJCW11dGV4X3VubG9jaygmZG1hX2xpc3RfbXV0ZXgpOworCQkJCWdvdG8gZXJyX291dDsKKwkJCX0KKwkJfQorCWxpc3RfYWRkX3RhaWxfcmN1KCZkZXZpY2UtPmdsb2JhbF9ub2RlLCAmZG1hX2RldmljZV9saXN0KTsKKwlkbWFfY2hhbm5lbF9yZWJhbGFuY2UoKTsKIAltdXRleF91bmxvY2soJmRtYV9saXN0X211dGV4KTsKIAotCWRtYV9jbGllbnRzX25vdGlmeV9hdmFpbGFibGUoKTsKLQogCXJldHVybiAwOwogCiBlcnJfb3V0OgogCWxpc3RfZm9yX2VhY2hfZW50cnkoY2hhbiwgJmRldmljZS0+Y2hhbm5lbHMsIGRldmljZV9ub2RlKSB7CiAJCWlmIChjaGFuLT5sb2NhbCA9PSBOVUxMKQogCQkJY29udGludWU7Ci0JCWtyZWZfcHV0KCZkZXZpY2UtPnJlZmNvdW50LCBkbWFfYXN5bmNfZGV2aWNlX2NsZWFudXApOwotCQlkZXZpY2VfdW5yZWdpc3RlcigmY2hhbi0+ZGV2KTsKLQkJY2hhbmNudC0tOworCQltdXRleF9sb2NrKCZkbWFfbGlzdF9tdXRleCk7CisJCWNoYW4tPmRldi0+Y2hhbiA9IE5VTEw7CisJCW11dGV4X3VubG9jaygmZG1hX2xpc3RfbXV0ZXgpOworCQlkZXZpY2VfdW5yZWdpc3RlcigmY2hhbi0+ZGV2LT5kZXZpY2UpOwogCQlmcmVlX3BlcmNwdShjaGFuLT5sb2NhbCk7CiAJfQogCXJldHVybiByYzsKQEAgLTQ0NCwzNyArNzI1LDMwIEBACiBFWFBPUlRfU1lNQk9MKGRtYV9hc3luY19kZXZpY2VfcmVnaXN0ZXIpOwogCiAvKioKLSAqIGRtYV9hc3luY19kZXZpY2VfY2xlYW51cCAtIGZ1bmN0aW9uIGNhbGxlZCB3aGVuIGFsbCByZWZlcmVuY2VzIGFyZSByZWxlYXNlZAotICogQGtyZWY6IGtlcm5lbCByZWZlcmVuY2Ugb2JqZWN0Ci0gKi8KLXN0YXRpYyB2b2lkIGRtYV9hc3luY19kZXZpY2VfY2xlYW51cChzdHJ1Y3Qga3JlZiAqa3JlZikKLXsKLQlzdHJ1Y3QgZG1hX2RldmljZSAqZGV2aWNlOwotCi0JZGV2aWNlID0gY29udGFpbmVyX29mKGtyZWYsIHN0cnVjdCBkbWFfZGV2aWNlLCByZWZjb3VudCk7Ci0JY29tcGxldGUoJmRldmljZS0+ZG9uZSk7Ci19Ci0KLS8qKgotICogZG1hX2FzeW5jX2RldmljZV91bnJlZ2lzdGVyIC0gdW5yZWdpc3RlcnMgRE1BIGRldmljZXMKKyAqIGRtYV9hc3luY19kZXZpY2VfdW5yZWdpc3RlciAtIHVucmVnaXN0ZXIgYSBETUEgZGV2aWNlCiAgKiBAZGV2aWNlOiAmZG1hX2RldmljZQorICoKKyAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYnkgZG1hIGRyaXZlciBleGl0IHJvdXRpbmVzLCBkbWFlbmdpbmUgaG9sZHMgbW9kdWxlCisgKiByZWZlcmVuY2VzIHRvIHByZXZlbnQgaXQgYmVpbmcgY2FsbGVkIHdoaWxlIGNoYW5uZWxzIGFyZSBpbiB1c2UuCiAgKi8KIHZvaWQgZG1hX2FzeW5jX2RldmljZV91bnJlZ2lzdGVyKHN0cnVjdCBkbWFfZGV2aWNlICpkZXZpY2UpCiB7CiAJc3RydWN0IGRtYV9jaGFuICpjaGFuOwogCiAJbXV0ZXhfbG9jaygmZG1hX2xpc3RfbXV0ZXgpOwotCWxpc3RfZGVsKCZkZXZpY2UtPmdsb2JhbF9ub2RlKTsKKwlsaXN0X2RlbF9yY3UoJmRldmljZS0+Z2xvYmFsX25vZGUpOworCWRtYV9jaGFubmVsX3JlYmFsYW5jZSgpOwogCW11dGV4X3VubG9jaygmZG1hX2xpc3RfbXV0ZXgpOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShjaGFuLCAmZGV2aWNlLT5jaGFubmVscywgZGV2aWNlX25vZGUpIHsKLQkJZG1hX2NsaWVudHNfbm90aWZ5X3JlbW92ZWQoY2hhbik7Ci0JCWRldmljZV91bnJlZ2lzdGVyKCZjaGFuLT5kZXYpOwotCQlkbWFfY2hhbl9yZWxlYXNlKGNoYW4pOworCQlXQVJOX09OQ0UoY2hhbi0+Y2xpZW50X2NvdW50LAorCQkJICAiJXMgY2FsbGVkIHdoaWxlICVkIGNsaWVudHMgaG9sZCBhIHJlZmVyZW5jZVxuIiwKKwkJCSAgX19mdW5jX18sIGNoYW4tPmNsaWVudF9jb3VudCk7CisJCW11dGV4X2xvY2soJmRtYV9saXN0X211dGV4KTsKKwkJY2hhbi0+ZGV2LT5jaGFuID0gTlVMTDsKKwkJbXV0ZXhfdW5sb2NrKCZkbWFfbGlzdF9tdXRleCk7CisJCWRldmljZV91bnJlZ2lzdGVyKCZjaGFuLT5kZXYtPmRldmljZSk7CiAJfQotCi0Ja3JlZl9wdXQoJmRldmljZS0+cmVmY291bnQsIGRtYV9hc3luY19kZXZpY2VfY2xlYW51cCk7Ci0Jd2FpdF9mb3JfY29tcGxldGlvbigmZGV2aWNlLT5kb25lKTsKIH0KIEVYUE9SVF9TWU1CT0woZG1hX2FzeW5jX2RldmljZV91bnJlZ2lzdGVyKTsKIApAQCAtNjI2LDEwICs5MDAsOTYgQEAKIH0KIEVYUE9SVF9TWU1CT0woZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3JfaW5pdCk7CiAKKy8qIGRtYV93YWl0X2Zvcl9hc3luY190eCAtIHNwaW4gd2FpdCBmb3IgYSB0cmFuc2FjdGlvbiB0byBjb21wbGV0ZQorICogQHR4OiBpbi1mbGlnaHQgdHJhbnNhY3Rpb24gdG8gd2FpdCBvbgorICoKKyAqIFRoaXMgcm91dGluZSBhc3N1bWVzIHRoYXQgdHggd2FzIG9idGFpbmVkIGZyb20gYSBjYWxsIHRvIGFzeW5jX21lbWNweSwKKyAqIGFzeW5jX3hvciwgYXN5bmNfbWVtc2V0LCBldGMgd2hpY2ggZW5zdXJlcyB0aGF0IHR4IGlzICJpbi1mbGlnaHQiIChwcmVwcGVkCisgKiBhbmQgc3VibWl0dGVkKS4gIFdhbGtpbmcgdGhlIHBhcmVudCBjaGFpbiBpcyBvbmx5IG1lYW50IHRvIGNvdmVyIGZvciBETUEKKyAqIGRyaXZlcnMgdGhhdCBkbyBub3QgaW1wbGVtZW50IHRoZSBETUFfSU5URVJSVVBUIGNhcGFiaWxpdHkgYW5kIG1heSByYWNlIHdpdGgKKyAqIHRoZSBkcml2ZXIncyBkZXNjcmlwdG9yIGNsZWFudXAgcm91dGluZS4KKyAqLworZW51bSBkbWFfc3RhdHVzCitkbWFfd2FpdF9mb3JfYXN5bmNfdHgoc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICp0eCkKK3sKKwllbnVtIGRtYV9zdGF0dXMgc3RhdHVzOworCXN0cnVjdCBkbWFfYXN5bmNfdHhfZGVzY3JpcHRvciAqaXRlcjsKKwlzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKnBhcmVudDsKKworCWlmICghdHgpCisJCXJldHVybiBETUFfU1VDQ0VTUzsKKworCVdBUk5fT05DRSh0eC0+cGFyZW50LCAiJXM6IHNwZWN1bGF0aXZlbHkgd2Fsa2luZyBkZXBlbmRlbmN5IGNoYWluIGZvciIKKwkJICAiICVzXG4iLCBfX2Z1bmNfXywgZG1hX2NoYW5fbmFtZSh0eC0+Y2hhbikpOworCisJLyogcG9sbCB0aHJvdWdoIHRoZSBkZXBlbmRlbmN5IGNoYWluLCByZXR1cm4gd2hlbiB0eCBpcyBjb21wbGV0ZSAqLworCWRvIHsKKwkJaXRlciA9IHR4OworCisJCS8qIGZpbmQgdGhlIHJvb3Qgb2YgdGhlIHVuc3VibWl0dGVkIGRlcGVuZGVuY3kgY2hhaW4gKi8KKwkJZG8geworCQkJcGFyZW50ID0gaXRlci0+cGFyZW50OworCQkJaWYgKCFwYXJlbnQpCisJCQkJYnJlYWs7CisJCQllbHNlCisJCQkJaXRlciA9IHBhcmVudDsKKwkJfSB3aGlsZSAocGFyZW50KTsKKworCQkvKiB0aGVyZSBpcyBhIHNtYWxsIHdpbmRvdyBmb3IgLT5wYXJlbnQgPT0gTlVMTCBhbmQKKwkJICogLT5jb29raWUgPT0gLUVCVVNZCisJCSAqLworCQl3aGlsZSAoaXRlci0+Y29va2llID09IC1FQlVTWSkKKwkJCWNwdV9yZWxheCgpOworCisJCXN0YXR1cyA9IGRtYV9zeW5jX3dhaXQoaXRlci0+Y2hhbiwgaXRlci0+Y29va2llKTsKKwl9IHdoaWxlIChzdGF0dXMgPT0gRE1BX0lOX1BST0dSRVNTIHx8IChpdGVyICE9IHR4KSk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZG1hX3dhaXRfZm9yX2FzeW5jX3R4KTsKKworLyogZG1hX3J1bl9kZXBlbmRlbmNpZXMgLSBoZWxwZXIgcm91dGluZSBmb3IgZG1hIGRyaXZlcnMgdG8gcHJvY2VzcworICoJKHN0YXJ0KSBkZXBlbmRlbnQgb3BlcmF0aW9ucyBvbiB0aGVpciB0YXJnZXQgY2hhbm5lbAorICogQHR4OiB0cmFuc2FjdGlvbiB3aXRoIGRlcGVuZGVuY2llcworICovCit2b2lkIGRtYV9ydW5fZGVwZW5kZW5jaWVzKHN0cnVjdCBkbWFfYXN5bmNfdHhfZGVzY3JpcHRvciAqdHgpCit7CisJc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICpkZXAgPSB0eC0+bmV4dDsKKwlzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKmRlcF9uZXh0OworCXN0cnVjdCBkbWFfY2hhbiAqY2hhbjsKKworCWlmICghZGVwKQorCQlyZXR1cm47CisKKwljaGFuID0gZGVwLT5jaGFuOworCisJLyoga2VlcCBzdWJtaXR0aW5nIHVwIHVudGlsIGEgY2hhbm5lbCBzd2l0Y2ggaXMgZGV0ZWN0ZWQKKwkgKiBpbiB0aGF0IGNhc2Ugd2Ugd2lsbCBiZSBjYWxsZWQgYWdhaW4gYXMgYSByZXN1bHQgb2YKKwkgKiBwcm9jZXNzaW5nIHRoZSBpbnRlcnJ1cHQgZnJvbSBhc3luY190eF9jaGFubmVsX3N3aXRjaAorCSAqLworCWZvciAoOyBkZXA7IGRlcCA9IGRlcF9uZXh0KSB7CisJCXNwaW5fbG9ja19iaCgmZGVwLT5sb2NrKTsKKwkJZGVwLT5wYXJlbnQgPSBOVUxMOworCQlkZXBfbmV4dCA9IGRlcC0+bmV4dDsKKwkJaWYgKGRlcF9uZXh0ICYmIGRlcF9uZXh0LT5jaGFuID09IGNoYW4pCisJCQlkZXAtPm5leHQgPSBOVUxMOyAvKiAtPm5leHQgd2lsbCBiZSBzdWJtaXR0ZWQgKi8KKwkJZWxzZQorCQkJZGVwX25leHQgPSBOVUxMOyAvKiBzdWJtaXQgY3VycmVudCBkZXAgYW5kIHRlcm1pbmF0ZSAqLworCQlzcGluX3VubG9ja19iaCgmZGVwLT5sb2NrKTsKKworCQlkZXAtPnR4X3N1Ym1pdChkZXApOworCX0KKworCWNoYW4tPmRldmljZS0+ZGV2aWNlX2lzc3VlX3BlbmRpbmcoY2hhbik7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChkbWFfcnVuX2RlcGVuZGVuY2llcyk7CisKIHN0YXRpYyBpbnQgX19pbml0IGRtYV9idXNfaW5pdCh2b2lkKQogeworCWlkcl9pbml0KCZkbWFfaWRyKTsKIAltdXRleF9pbml0KCZkbWFfbGlzdF9tdXRleCk7CiAJcmV0dXJuIGNsYXNzX3JlZ2lzdGVyKCZkbWFfZGV2Y2xhc3MpOwogfQotc3Vic3lzX2luaXRjYWxsKGRtYV9idXNfaW5pdCk7CithcmNoX2luaXRjYWxsKGRtYV9idXNfaW5pdCk7CisKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9kbWEvZG1hdGVzdC5jIGIvZHJpdmVycy9kbWEvZG1hdGVzdC5jCmluZGV4IGVkOTYzNmIuLjM2MDNmMWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZG1hL2RtYXRlc3QuYworKysgYi9kcml2ZXJzL2RtYS9kbWF0ZXN0LmMKQEAgLTM1LDcgKzM1LDcgQEAKIAogc3RhdGljIHVuc2lnbmVkIGludCBtYXhfY2hhbm5lbHM7CiBtb2R1bGVfcGFyYW0obWF4X2NoYW5uZWxzLCB1aW50LCBTX0lSVUdPKTsKLU1PRFVMRV9QQVJNX0RFU0MobnJfY2hhbm5lbHMsCitNT0RVTEVfUEFSTV9ERVNDKG1heF9jaGFubmVscywKIAkJIk1heGltdW0gbnVtYmVyIG9mIGNoYW5uZWxzIHRvIHVzZSAoZGVmYXVsdDogYWxsKSIpOwogCiAvKgpAQCAtNzEsNyArNzEsNyBAQAogCiAvKgogICogVGhlc2UgYXJlIHByb3RlY3RlZCBieSBkbWFfbGlzdF9tdXRleCBzaW5jZSB0aGV5J3JlIG9ubHkgdXNlZCBieQotICogdGhlIERNQSBjbGllbnQgZXZlbnQgY2FsbGJhY2sKKyAqIHRoZSBETUEgZmlsdGVyIGZ1bmN0aW9uIGNhbGxiYWNrCiAgKi8KIHN0YXRpYyBMSVNUX0hFQUQoZG1hdGVzdF9jaGFubmVscyk7CiBzdGF0aWMgdW5zaWduZWQgaW50IG5yX2NoYW5uZWxzOwpAQCAtODAsNyArODAsNyBAQAogewogCWlmICh0ZXN0X2NoYW5uZWxbMF0gPT0gJ1wwJykKIAkJcmV0dXJuIHRydWU7Ci0JcmV0dXJuIHN0cmNtcChkZXZfbmFtZSgmY2hhbi0+ZGV2KSwgdGVzdF9jaGFubmVsKSA9PSAwOworCXJldHVybiBzdHJjbXAoZG1hX2NoYW5fbmFtZShjaGFuKSwgdGVzdF9jaGFubmVsKSA9PSAwOwogfQogCiBzdGF0aWMgYm9vbCBkbWF0ZXN0X21hdGNoX2RldmljZShzdHJ1Y3QgZG1hX2RldmljZSAqZGV2aWNlKQpAQCAtMjE1LDcgKzIxNSw2IEBACiAKIAlzbXBfcm1iKCk7CiAJY2hhbiA9IHRocmVhZC0+Y2hhbjsKLQlkbWFfY2hhbl9nZXQoY2hhbik7CiAKIAl3aGlsZSAoIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSkgewogCQl0b3RhbF90ZXN0cysrOwpAQCAtMjkzLDcgKzI5Miw2IEBACiAJfQogCiAJcmV0ID0gMDsKLQlkbWFfY2hhbl9wdXQoY2hhbik7CiAJa2ZyZWUodGhyZWFkLT5kc3RidWYpOwogZXJyX2RzdGJ1ZjoKIAlrZnJlZSh0aHJlYWQtPnNyY2J1Zik7CkBAIC0zMTksMjEgKzMxNywxNiBAQAogCWtmcmVlKGR0Yyk7CiB9CiAKLXN0YXRpYyBlbnVtIGRtYV9zdGF0ZV9jbGllbnQgZG1hdGVzdF9hZGRfY2hhbm5lbChzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4pCitzdGF0aWMgaW50IGRtYXRlc3RfYWRkX2NoYW5uZWwoc3RydWN0IGRtYV9jaGFuICpjaGFuKQogewogCXN0cnVjdCBkbWF0ZXN0X2NoYW4JKmR0YzsKIAlzdHJ1Y3QgZG1hdGVzdF90aHJlYWQJKnRocmVhZDsKIAl1bnNpZ25lZCBpbnQJCWk7CiAKLQkvKiBIYXZlIHdlIGFscmVhZHkgYmVlbiB0b2xkIGFib3V0IHRoaXMgY2hhbm5lbD8gKi8KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGR0YywgJmRtYXRlc3RfY2hhbm5lbHMsIG5vZGUpCi0JCWlmIChkdGMtPmNoYW4gPT0gY2hhbikKLQkJCXJldHVybiBETUFfRFVQOwotCiAJZHRjID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGRtYXRlc3RfY2hhbiksIEdGUF9LRVJORUwpOwogCWlmICghZHRjKSB7Ci0JCXByX3dhcm5pbmcoImRtYXRlc3Q6IE5vIG1lbW9yeSBmb3IgJXNcbiIsIGRldl9uYW1lKCZjaGFuLT5kZXYpKTsKLQkJcmV0dXJuIERNQV9OQUs7CisJCXByX3dhcm5pbmcoImRtYXRlc3Q6IE5vIG1lbW9yeSBmb3IgJXNcbiIsIGRtYV9jaGFuX25hbWUoY2hhbikpOworCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKIAlkdGMtPmNoYW4gPSBjaGFuOwpAQCAtMzQzLDE2ICszMzYsMTYgQEAKIAkJdGhyZWFkID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGRtYXRlc3RfdGhyZWFkKSwgR0ZQX0tFUk5FTCk7CiAJCWlmICghdGhyZWFkKSB7CiAJCQlwcl93YXJuaW5nKCJkbWF0ZXN0OiBObyBtZW1vcnkgZm9yICVzLXRlc3QldVxuIiwKLQkJCQkgICBkZXZfbmFtZSgmY2hhbi0+ZGV2KSwgaSk7CisJCQkJICAgZG1hX2NoYW5fbmFtZShjaGFuKSwgaSk7CiAJCQlicmVhazsKIAkJfQogCQl0aHJlYWQtPmNoYW4gPSBkdGMtPmNoYW47CiAJCXNtcF93bWIoKTsKIAkJdGhyZWFkLT50YXNrID0ga3RocmVhZF9ydW4oZG1hdGVzdF9mdW5jLCB0aHJlYWQsICIlcy10ZXN0JXUiLAotCQkJCWRldl9uYW1lKCZjaGFuLT5kZXYpLCBpKTsKKwkJCQlkbWFfY2hhbl9uYW1lKGNoYW4pLCBpKTsKIAkJaWYgKElTX0VSUih0aHJlYWQtPnRhc2spKSB7CiAJCQlwcl93YXJuaW5nKCJkbWF0ZXN0OiBGYWlsZWQgdG8gcnVuIHRocmVhZCAlcy10ZXN0JXVcbiIsCi0JCQkJCWRldl9uYW1lKCZjaGFuLT5kZXYpLCBpKTsKKwkJCQkJZG1hX2NoYW5fbmFtZShjaGFuKSwgaSk7CiAJCQlrZnJlZSh0aHJlYWQpOwogCQkJYnJlYWs7CiAJCX0KQEAgLTM2Miw4NiArMzU1LDYyIEBACiAJCWxpc3RfYWRkX3RhaWwoJnRocmVhZC0+bm9kZSwgJmR0Yy0+dGhyZWFkcyk7CiAJfQogCi0JcHJfaW5mbygiZG1hdGVzdDogU3RhcnRlZCAldSB0aHJlYWRzIHVzaW5nICVzXG4iLCBpLCBkZXZfbmFtZSgmY2hhbi0+ZGV2KSk7CisJcHJfaW5mbygiZG1hdGVzdDogU3RhcnRlZCAldSB0aHJlYWRzIHVzaW5nICVzXG4iLCBpLCBkbWFfY2hhbl9uYW1lKGNoYW4pKTsKIAogCWxpc3RfYWRkX3RhaWwoJmR0Yy0+bm9kZSwgJmRtYXRlc3RfY2hhbm5lbHMpOwogCW5yX2NoYW5uZWxzKys7CiAKLQlyZXR1cm4gRE1BX0FDSzsKKwlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGVudW0gZG1hX3N0YXRlX2NsaWVudCBkbWF0ZXN0X3JlbW92ZV9jaGFubmVsKHN0cnVjdCBkbWFfY2hhbiAqY2hhbikKK3N0YXRpYyBib29sIGZpbHRlcihzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4sIHZvaWQgKnBhcmFtKQogewotCXN0cnVjdCBkbWF0ZXN0X2NoYW4JKmR0YywgKl9kdGM7Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZHRjLCBfZHRjLCAmZG1hdGVzdF9jaGFubmVscywgbm9kZSkgewotCQlpZiAoZHRjLT5jaGFuID09IGNoYW4pIHsKLQkJCWxpc3RfZGVsKCZkdGMtPm5vZGUpOwotCQkJZG1hdGVzdF9jbGVhbnVwX2NoYW5uZWwoZHRjKTsKLQkJCXByX2RlYnVnKCJkbWF0ZXN0OiBsb3N0IGNoYW5uZWwgJXNcbiIsCi0JCQkJCWRldl9uYW1lKCZjaGFuLT5kZXYpKTsKLQkJCXJldHVybiBETUFfQUNLOwotCQl9Ci0JfQotCi0JcmV0dXJuIERNQV9EVVA7CisJaWYgKCFkbWF0ZXN0X21hdGNoX2NoYW5uZWwoY2hhbikgfHwgIWRtYXRlc3RfbWF0Y2hfZGV2aWNlKGNoYW4tPmRldmljZSkpCisJCXJldHVybiBmYWxzZTsKKwllbHNlCisJCXJldHVybiB0cnVlOwogfQogCi0vKgotICogU3RhcnQgdGVzdGluZyB0aHJlYWRzIGFzIG5ldyBjaGFubmVscyBhcmUgYXNzaWduZWQgdG8gdXMsIGFuZCBraWxsCi0gKiB0aGVtIHdoZW4gdGhlIGNoYW5uZWxzIGdvIGF3YXkuCi0gKgotICogV2hlbiB3ZSB1bnJlZ2lzdGVyIHRoZSBjbGllbnQsIGFsbCBjaGFubmVscyBhcmUgcmVtb3ZlZCBzbyB0aGlzCi0gKiB3aWxsIGFsc28gdGFrZSBjYXJlIG9mIGNsZWFuaW5nIHRoaW5ncyB1cCB3aGVuIHRoZSBtb2R1bGUgaXMKLSAqIHVubG9hZGVkLgotICovCi1zdGF0aWMgZW51bSBkbWFfc3RhdGVfY2xpZW50Ci1kbWF0ZXN0X2V2ZW50KHN0cnVjdCBkbWFfY2xpZW50ICpjbGllbnQsIHN0cnVjdCBkbWFfY2hhbiAqY2hhbiwKLQkJZW51bSBkbWFfc3RhdGUgc3RhdGUpCi17Ci0JZW51bSBkbWFfc3RhdGVfY2xpZW50CWFjayA9IERNQV9OQUs7Ci0KLQlzd2l0Y2ggKHN0YXRlKSB7Ci0JY2FzZSBETUFfUkVTT1VSQ0VfQVZBSUxBQkxFOgotCQlpZiAoIWRtYXRlc3RfbWF0Y2hfY2hhbm5lbChjaGFuKQotCQkJCXx8ICFkbWF0ZXN0X21hdGNoX2RldmljZShjaGFuLT5kZXZpY2UpKQotCQkJYWNrID0gRE1BX0RVUDsKLQkJZWxzZSBpZiAobWF4X2NoYW5uZWxzICYmIG5yX2NoYW5uZWxzID49IG1heF9jaGFubmVscykKLQkJCWFjayA9IERNQV9OQUs7Ci0JCWVsc2UKLQkJCWFjayA9IGRtYXRlc3RfYWRkX2NoYW5uZWwoY2hhbik7Ci0JCWJyZWFrOwotCi0JY2FzZSBETUFfUkVTT1VSQ0VfUkVNT1ZFRDoKLQkJYWNrID0gZG1hdGVzdF9yZW1vdmVfY2hhbm5lbChjaGFuKTsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlwcl9pbmZvKCJkbWF0ZXN0OiBVbmhhbmRsZWQgZXZlbnQgJXUgKCVzKVxuIiwKLQkJCQlzdGF0ZSwgZGV2X25hbWUoJmNoYW4tPmRldikpOwotCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gYWNrOwotfQotCi1zdGF0aWMgc3RydWN0IGRtYV9jbGllbnQgZG1hdGVzdF9jbGllbnQgPSB7Ci0JLmV2ZW50X2NhbGxiYWNrCT0gZG1hdGVzdF9ldmVudCwKLX07Ci0KIHN0YXRpYyBpbnQgX19pbml0IGRtYXRlc3RfaW5pdCh2b2lkKQogewotCWRtYV9jYXBfc2V0KERNQV9NRU1DUFksIGRtYXRlc3RfY2xpZW50LmNhcF9tYXNrKTsKLQlkbWFfYXN5bmNfY2xpZW50X3JlZ2lzdGVyKCZkbWF0ZXN0X2NsaWVudCk7Ci0JZG1hX2FzeW5jX2NsaWVudF9jaGFuX3JlcXVlc3QoJmRtYXRlc3RfY2xpZW50KTsKKwlkbWFfY2FwX21hc2tfdCBtYXNrOworCXN0cnVjdCBkbWFfY2hhbiAqY2hhbjsKKwlpbnQgZXJyID0gMDsKIAotCXJldHVybiAwOworCWRtYV9jYXBfemVybyhtYXNrKTsKKwlkbWFfY2FwX3NldChETUFfTUVNQ1BZLCBtYXNrKTsKKwlmb3IgKDs7KSB7CisJCWNoYW4gPSBkbWFfcmVxdWVzdF9jaGFubmVsKG1hc2ssIGZpbHRlciwgTlVMTCk7CisJCWlmIChjaGFuKSB7CisJCQllcnIgPSBkbWF0ZXN0X2FkZF9jaGFubmVsKGNoYW4pOworCQkJaWYgKGVyciA9PSAwKQorCQkJCWNvbnRpbnVlOworCQkJZWxzZSB7CisJCQkJZG1hX3JlbGVhc2VfY2hhbm5lbChjaGFuKTsKKwkJCQlicmVhazsgLyogYWRkX2NoYW5uZWwgZmFpbGVkLCBwdW50ICovCisJCQl9CisJCX0gZWxzZQorCQkJYnJlYWs7IC8qIG5vIG1vcmUgY2hhbm5lbHMgYXZhaWxhYmxlICovCisJCWlmIChtYXhfY2hhbm5lbHMgJiYgbnJfY2hhbm5lbHMgPj0gbWF4X2NoYW5uZWxzKQorCQkJYnJlYWs7IC8qIHdlIGhhdmUgYWxsIHdlIG5lZWQgKi8KKwl9CisKKwlyZXR1cm4gZXJyOwogfQotbW9kdWxlX2luaXQoZG1hdGVzdF9pbml0KTsKKy8qIHdoZW4gY29tcGlsZWQtaW4gd2FpdCBmb3IgZHJpdmVycyB0byBsb2FkIGZpcnN0ICovCitsYXRlX2luaXRjYWxsKGRtYXRlc3RfaW5pdCk7CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBkbWF0ZXN0X2V4aXQodm9pZCkKIHsKLQlkbWFfYXN5bmNfY2xpZW50X3VucmVnaXN0ZXIoJmRtYXRlc3RfY2xpZW50KTsKKwlzdHJ1Y3QgZG1hdGVzdF9jaGFuICpkdGMsICpfZHRjOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGR0YywgX2R0YywgJmRtYXRlc3RfY2hhbm5lbHMsIG5vZGUpIHsKKwkJbGlzdF9kZWwoJmR0Yy0+bm9kZSk7CisJCWRtYXRlc3RfY2xlYW51cF9jaGFubmVsKGR0Yyk7CisJCXByX2RlYnVnKCJkbWF0ZXN0OiBkcm9wcGVkIGNoYW5uZWwgJXNcbiIsCisJCQkgZG1hX2NoYW5fbmFtZShkdGMtPmNoYW4pKTsKKwkJZG1hX3JlbGVhc2VfY2hhbm5lbChkdGMtPmNoYW4pOworCX0KIH0KIG1vZHVsZV9leGl0KGRtYXRlc3RfZXhpdCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZG1hL2R3X2RtYWMuYyBiL2RyaXZlcnMvZG1hL2R3X2RtYWMuYwppbmRleCAwNzc4ZDk5Li42YjcwMmNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2RtYS9kd19kbWFjLmMKKysrIGIvZHJpdmVycy9kbWEvZHdfZG1hYy5jCkBAIC03MCw2ICs3MCwxNSBAQAogICogdGhlIGNvbnRyb2xsZXIsIHRob3VnaC4KICAqLwogCitzdGF0aWMgc3RydWN0IGRldmljZSAqY2hhbjJkZXYoc3RydWN0IGRtYV9jaGFuICpjaGFuKQoreworCXJldHVybiAmY2hhbi0+ZGV2LT5kZXZpY2U7Cit9CitzdGF0aWMgc3RydWN0IGRldmljZSAqY2hhbjJwYXJlbnQoc3RydWN0IGRtYV9jaGFuICpjaGFuKQoreworCXJldHVybiBjaGFuLT5kZXYtPmRldmljZS5wYXJlbnQ7Cit9CisKIHN0YXRpYyBzdHJ1Y3QgZHdfZGVzYyAqZHdjX2ZpcnN0X2FjdGl2ZShzdHJ1Y3QgZHdfZG1hX2NoYW4gKmR3YykKIHsKIAlyZXR1cm4gbGlzdF9lbnRyeShkd2MtPmFjdGl2ZV9saXN0Lm5leHQsIHN0cnVjdCBkd19kZXNjLCBkZXNjX25vZGUpOwpAQCAtOTMsMTIgKzEwMiwxMiBAQAogCQkJcmV0ID0gZGVzYzsKIAkJCWJyZWFrOwogCQl9Ci0JCWRldl9kYmcoJmR3Yy0+Y2hhbi5kZXYsICJkZXNjICVwIG5vdCBBQ0tlZFxuIiwgZGVzYyk7CisJCWRldl9kYmcoY2hhbjJkZXYoJmR3Yy0+Y2hhbiksICJkZXNjICVwIG5vdCBBQ0tlZFxuIiwgZGVzYyk7CiAJCWkrKzsKIAl9CiAJc3Bpbl91bmxvY2tfYmgoJmR3Yy0+bG9jayk7CiAKLQlkZXZfdmRiZygmZHdjLT5jaGFuLmRldiwgInNjYW5uZWQgJXUgZGVzY3JpcHRvcnMgb24gZnJlZWxpc3RcbiIsIGkpOworCWRldl92ZGJnKGNoYW4yZGV2KCZkd2MtPmNoYW4pLCAic2Nhbm5lZCAldSBkZXNjcmlwdG9ycyBvbiBmcmVlbGlzdFxuIiwgaSk7CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtMTA4LDEwICsxMTcsMTAgQEAKIAlzdHJ1Y3QgZHdfZGVzYwkqY2hpbGQ7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNoaWxkLCAmZGVzYy0+dHhkLnR4X2xpc3QsIGRlc2Nfbm9kZSkKLQkJZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUoZHdjLT5jaGFuLmRldi5wYXJlbnQsCisJCWRtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KGNoYW4ycGFyZW50KCZkd2MtPmNoYW4pLAogCQkJCWNoaWxkLT50eGQucGh5cywgc2l6ZW9mKGNoaWxkLT5sbGkpLAogCQkJCURNQV9UT19ERVZJQ0UpOwotCWRtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KGR3Yy0+Y2hhbi5kZXYucGFyZW50LAorCWRtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KGNoYW4ycGFyZW50KCZkd2MtPmNoYW4pLAogCQkJZGVzYy0+dHhkLnBoeXMsIHNpemVvZihkZXNjLT5sbGkpLAogCQkJRE1BX1RPX0RFVklDRSk7CiB9CkBAIC0xMjksMTEgKzEzOCwxMSBAQAogCiAJCXNwaW5fbG9ja19iaCgmZHdjLT5sb2NrKTsKIAkJbGlzdF9mb3JfZWFjaF9lbnRyeShjaGlsZCwgJmRlc2MtPnR4ZC50eF9saXN0LCBkZXNjX25vZGUpCi0JCQlkZXZfdmRiZygmZHdjLT5jaGFuLmRldiwKKwkJCWRldl92ZGJnKGNoYW4yZGV2KCZkd2MtPmNoYW4pLAogCQkJCQkibW92aW5nIGNoaWxkIGRlc2MgJXAgdG8gZnJlZWxpc3RcbiIsCiAJCQkJCWNoaWxkKTsKIAkJbGlzdF9zcGxpY2VfaW5pdCgmZGVzYy0+dHhkLnR4X2xpc3QsICZkd2MtPmZyZWVfbGlzdCk7Ci0JCWRldl92ZGJnKCZkd2MtPmNoYW4uZGV2LCAibW92aW5nIGRlc2MgJXAgdG8gZnJlZWxpc3RcbiIsIGRlc2MpOworCQlkZXZfdmRiZyhjaGFuMmRldigmZHdjLT5jaGFuKSwgIm1vdmluZyBkZXNjICVwIHRvIGZyZWVsaXN0XG4iLCBkZXNjKTsKIAkJbGlzdF9hZGQoJmRlc2MtPmRlc2Nfbm9kZSwgJmR3Yy0+ZnJlZV9saXN0KTsKIAkJc3Bpbl91bmxvY2tfYmgoJmR3Yy0+bG9jayk7CiAJfQpAQCAtMTYzLDkgKzE3Miw5IEBACiAKIAkvKiBBU1NFUlQ6ICBjaGFubmVsIGlzIGlkbGUgKi8KIAlpZiAoZG1hX3JlYWRsKGR3LCBDSF9FTikgJiBkd2MtPm1hc2spIHsKLQkJZGV2X2VycigmZHdjLT5jaGFuLmRldiwKKwkJZGV2X2VycihjaGFuMmRldigmZHdjLT5jaGFuKSwKIAkJCSJCVUc6IEF0dGVtcHRlZCB0byBzdGFydCBub24taWRsZSBjaGFubmVsXG4iKTsKLQkJZGV2X2VycigmZHdjLT5jaGFuLmRldiwKKwkJZGV2X2VycihjaGFuMmRldigmZHdjLT5jaGFuKSwKIAkJCSIgIFNBUjogMHgleCBEQVI6IDB4JXggTExQOiAweCV4IENUTDogMHgleDolMDh4XG4iLAogCQkJY2hhbm5lbF9yZWFkbChkd2MsIFNBUiksCiAJCQljaGFubmVsX3JlYWRsKGR3YywgREFSKSwKQEAgLTE5Myw3ICsyMDIsNyBAQAogCXZvaWQJCQkJKnBhcmFtOwogCXN0cnVjdCBkbWFfYXN5bmNfdHhfZGVzY3JpcHRvcgkqdHhkID0gJmRlc2MtPnR4ZDsKIAotCWRldl92ZGJnKCZkd2MtPmNoYW4uZGV2LCAiZGVzY3JpcHRvciAldSBjb21wbGV0ZVxuIiwgdHhkLT5jb29raWUpOworCWRldl92ZGJnKGNoYW4yZGV2KCZkd2MtPmNoYW4pLCAiZGVzY3JpcHRvciAldSBjb21wbGV0ZVxuIiwgdHhkLT5jb29raWUpOwogCiAJZHdjLT5jb21wbGV0ZWQgPSB0eGQtPmNvb2tpZTsKIAljYWxsYmFjayA9IHR4ZC0+Y2FsbGJhY2s7CkBAIC0yMDgsMTEgKzIxNywxMSBAQAogCSAqIG1hcHBlZCBiZWZvcmUgdGhleSB3ZXJlIHN1Ym1pdHRlZC4uLgogCSAqLwogCWlmICghKHR4ZC0+ZmxhZ3MgJiBETUFfQ09NUExfU0tJUF9ERVNUX1VOTUFQKSkKLQkJZG1hX3VubWFwX3BhZ2UoZHdjLT5jaGFuLmRldi5wYXJlbnQsIGRlc2MtPmxsaS5kYXIsIGRlc2MtPmxlbiwKLQkJCQlETUFfRlJPTV9ERVZJQ0UpOworCQlkbWFfdW5tYXBfcGFnZShjaGFuMnBhcmVudCgmZHdjLT5jaGFuKSwgZGVzYy0+bGxpLmRhciwKKwkJCSAgICAgICBkZXNjLT5sZW4sIERNQV9GUk9NX0RFVklDRSk7CiAJaWYgKCEodHhkLT5mbGFncyAmIERNQV9DT01QTF9TS0lQX1NSQ19VTk1BUCkpCi0JCWRtYV91bm1hcF9wYWdlKGR3Yy0+Y2hhbi5kZXYucGFyZW50LCBkZXNjLT5sbGkuc2FyLCBkZXNjLT5sZW4sCi0JCQkJRE1BX1RPX0RFVklDRSk7CisJCWRtYV91bm1hcF9wYWdlKGNoYW4ycGFyZW50KCZkd2MtPmNoYW4pLCBkZXNjLT5sbGkuc2FyLAorCQkJICAgICAgIGRlc2MtPmxlbiwgRE1BX1RPX0RFVklDRSk7CiAKIAkvKgogCSAqIFRoZSBBUEkgcmVxdWlyZXMgdGhhdCBubyBzdWJtaXNzaW9ucyBhcmUgZG9uZSBmcm9tIGEKQEAgLTIyOCw3ICsyMzcsNyBAQAogCUxJU1RfSEVBRChsaXN0KTsKIAogCWlmIChkbWFfcmVhZGwoZHcsIENIX0VOKSAmIGR3Yy0+bWFzaykgewotCQlkZXZfZXJyKCZkd2MtPmNoYW4uZGV2LAorCQlkZXZfZXJyKGNoYW4yZGV2KCZkd2MtPmNoYW4pLAogCQkJIkJVRzogWEZFUiBiaXQgc2V0LCBidXQgY2hhbm5lbCBub3QgaWRsZSFcbiIpOwogCiAJCS8qIFRyeSB0byBjb250aW51ZSBhZnRlciByZXNldHRpbmcgdGhlIGNoYW5uZWwuLi4gKi8KQEAgLTI3Myw3ICsyODIsNyBAQAogCQlyZXR1cm47CiAJfQogCi0JZGV2X3ZkYmcoJmR3Yy0+Y2hhbi5kZXYsICJzY2FuX2Rlc2NyaXB0b3JzOiBsbHA9MHgleFxuIiwgbGxwKTsKKwlkZXZfdmRiZyhjaGFuMmRldigmZHdjLT5jaGFuKSwgInNjYW5fZGVzY3JpcHRvcnM6IGxscD0weCV4XG4iLCBsbHApOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGRlc2MsIF9kZXNjLCAmZHdjLT5hY3RpdmVfbGlzdCwgZGVzY19ub2RlKSB7CiAJCWlmIChkZXNjLT5sbGkubGxwID09IGxscCkKQEAgLTI5Miw3ICszMDEsNyBAQAogCQlkd2NfZGVzY3JpcHRvcl9jb21wbGV0ZShkd2MsIGRlc2MpOwogCX0KIAotCWRldl9lcnIoJmR3Yy0+Y2hhbi5kZXYsCisJZGV2X2VycihjaGFuMmRldigmZHdjLT5jaGFuKSwKIAkJIkJVRzogQWxsIGRlc2NyaXB0b3JzIGRvbmUsIGJ1dCBjaGFubmVsIG5vdCBpZGxlIVxuIik7CiAKIAkvKiBUcnkgdG8gY29udGludWUgYWZ0ZXIgcmVzZXR0aW5nIHRoZSBjaGFubmVsLi4uICovCkBAIC0zMDgsNyArMzE3LDcgQEAKIAogc3RhdGljIHZvaWQgZHdjX2R1bXBfbGxpKHN0cnVjdCBkd19kbWFfY2hhbiAqZHdjLCBzdHJ1Y3QgZHdfbGxpICpsbGkpCiB7Ci0JZGV2X3ByaW50ayhLRVJOX0NSSVQsICZkd2MtPmNoYW4uZGV2LAorCWRldl9wcmludGsoS0VSTl9DUklULCBjaGFuMmRldigmZHdjLT5jaGFuKSwKIAkJCSIgIGRlc2M6IHMweCV4IGQweCV4IGwweCV4IGMweCV4OiV4XG4iLAogCQkJbGxpLT5zYXIsIGxsaS0+ZGFyLCBsbGktPmxscCwKIAkJCWxsaS0+Y3RsaGksIGxsaS0+Y3RsbG8pOwpAQCAtMzQyLDkgKzM1MSw5IEBACiAJICogY29udHJvbGxlciBmbGFnZ2VkIGFuIGVycm9yIGluc3RlYWQgb2Ygc2NyaWJibGluZyBvdmVyCiAJICogcmFuZG9tIG1lbW9yeSBsb2NhdGlvbnMuCiAJICovCi0JZGV2X3ByaW50ayhLRVJOX0NSSVQsICZkd2MtPmNoYW4uZGV2LAorCWRldl9wcmludGsoS0VSTl9DUklULCBjaGFuMmRldigmZHdjLT5jaGFuKSwKIAkJCSJCYWQgZGVzY3JpcHRvciBzdWJtaXR0ZWQgZm9yIERNQSFcbiIpOwotCWRldl9wcmludGsoS0VSTl9DUklULCAmZHdjLT5jaGFuLmRldiwKKwlkZXZfcHJpbnRrKEtFUk5fQ1JJVCwgY2hhbjJkZXYoJmR3Yy0+Y2hhbiksCiAJCQkiICBjb29raWU6ICVkXG4iLCBiYWRfZGVzYy0+dHhkLmNvb2tpZSk7CiAJZHdjX2R1bXBfbGxpKGR3YywgJmJhZF9kZXNjLT5sbGkpOwogCWxpc3RfZm9yX2VhY2hfZW50cnkoY2hpbGQsICZiYWRfZGVzYy0+dHhkLnR4X2xpc3QsIGRlc2Nfbm9kZSkKQEAgLTQ0MiwxMiArNDUxLDEyIEBACiAJICogZm9yIERNQS4gQnV0IHRoaXMgaXMgaGFyZCB0byBkbyBpbiBhIHJhY2UtZnJlZSBtYW5uZXIuCiAJICovCiAJaWYgKGxpc3RfZW1wdHkoJmR3Yy0+YWN0aXZlX2xpc3QpKSB7Ci0JCWRldl92ZGJnKCZ0eC0+Y2hhbi0+ZGV2LCAidHhfc3VibWl0OiBzdGFydGVkICV1XG4iLAorCQlkZXZfdmRiZyhjaGFuMmRldih0eC0+Y2hhbiksICJ0eF9zdWJtaXQ6IHN0YXJ0ZWQgJXVcbiIsCiAJCQkJZGVzYy0+dHhkLmNvb2tpZSk7CiAJCWR3Y19kb3N0YXJ0KGR3YywgZGVzYyk7CiAJCWxpc3RfYWRkX3RhaWwoJmRlc2MtPmRlc2Nfbm9kZSwgJmR3Yy0+YWN0aXZlX2xpc3QpOwogCX0gZWxzZSB7Ci0JCWRldl92ZGJnKCZ0eC0+Y2hhbi0+ZGV2LCAidHhfc3VibWl0OiBxdWV1ZWQgJXVcbiIsCisJCWRldl92ZGJnKGNoYW4yZGV2KHR4LT5jaGFuKSwgInR4X3N1Ym1pdDogcXVldWVkICV1XG4iLAogCQkJCWRlc2MtPnR4ZC5jb29raWUpOwogCiAJCWxpc3RfYWRkX3RhaWwoJmRlc2MtPmRlc2Nfbm9kZSwgJmR3Yy0+cXVldWUpOwpAQCAtNDcyLDExICs0ODEsMTEgQEAKIAl1bnNpZ25lZCBpbnQJCWRzdF93aWR0aDsKIAl1MzIJCQljdGxsbzsKIAotCWRldl92ZGJnKCZjaGFuLT5kZXYsICJwcmVwX2RtYV9tZW1jcHkgZDB4JXggczB4JXggbDB4JXp4IGYweCVseFxuIiwKKwlkZXZfdmRiZyhjaGFuMmRldihjaGFuKSwgInByZXBfZG1hX21lbWNweSBkMHgleCBzMHgleCBsMHglenggZjB4JWx4XG4iLAogCQkJZGVzdCwgc3JjLCBsZW4sIGZsYWdzKTsKIAogCWlmICh1bmxpa2VseSghbGVuKSkgewotCQlkZXZfZGJnKCZjaGFuLT5kZXYsICJwcmVwX2RtYV9tZW1jcHk6IGxlbmd0aCBpcyB6ZXJvIVxuIik7CisJCWRldl9kYmcoY2hhbjJkZXYoY2hhbiksICJwcmVwX2RtYV9tZW1jcHk6IGxlbmd0aCBpcyB6ZXJvIVxuIik7CiAJCXJldHVybiBOVUxMOwogCX0KIApAQCAtNTE2LDcgKzUyNSw3IEBACiAJCQlmaXJzdCA9IGRlc2M7CiAJCX0gZWxzZSB7CiAJCQlwcmV2LT5sbGkubGxwID0gZGVzYy0+dHhkLnBoeXM7Ci0JCQlkbWFfc3luY19zaW5nbGVfZm9yX2RldmljZShjaGFuLT5kZXYucGFyZW50LAorCQkJZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2UoY2hhbjJwYXJlbnQoY2hhbiksCiAJCQkJCXByZXYtPnR4ZC5waHlzLCBzaXplb2YocHJldi0+bGxpKSwKIAkJCQkJRE1BX1RPX0RFVklDRSk7CiAJCQlsaXN0X2FkZF90YWlsKCZkZXNjLT5kZXNjX25vZGUsCkBAIC01MzEsNyArNTQwLDcgQEAKIAkJcHJldi0+bGxpLmN0bGxvIHw9IERXQ19DVExMX0lOVF9FTjsKIAogCXByZXYtPmxsaS5sbHAgPSAwOwotCWRtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKGNoYW4tPmRldi5wYXJlbnQsCisJZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2UoY2hhbjJwYXJlbnQoY2hhbiksCiAJCQlwcmV2LT50eGQucGh5cywgc2l6ZW9mKHByZXYtPmxsaSksCiAJCQlETUFfVE9fREVWSUNFKTsKIApAQCAtNTYyLDE1ICs1NzEsMTUgQEAKIAlzdHJ1Y3Qgc2NhdHRlcmxpc3QJKnNnOwogCXNpemVfdAkJCXRvdGFsX2xlbiA9IDA7CiAKLQlkZXZfdmRiZygmY2hhbi0+ZGV2LCAicHJlcF9kbWFfc2xhdmVcbiIpOworCWRldl92ZGJnKGNoYW4yZGV2KGNoYW4pLCAicHJlcF9kbWFfc2xhdmVcbiIpOwogCiAJaWYgKHVubGlrZWx5KCFkd3MgfHwgIXNnX2xlbikpCiAJCXJldHVybiBOVUxMOwogCi0JcmVnX3dpZHRoID0gZHdzLT5zbGF2ZS5yZWdfd2lkdGg7CisJcmVnX3dpZHRoID0gZHdzLT5yZWdfd2lkdGg7CiAJcHJldiA9IGZpcnN0ID0gTlVMTDsKIAotCXNnX2xlbiA9IGRtYV9tYXBfc2coY2hhbi0+ZGV2LnBhcmVudCwgc2dsLCBzZ19sZW4sIGRpcmVjdGlvbik7CisJc2dfbGVuID0gZG1hX21hcF9zZyhjaGFuMnBhcmVudChjaGFuKSwgc2dsLCBzZ19sZW4sIGRpcmVjdGlvbik7CiAKIAlzd2l0Y2ggKGRpcmVjdGlvbikgewogCWNhc2UgRE1BX1RPX0RFVklDRToKQEAgLTU3OSw3ICs1ODgsNyBAQAogCQkJCXwgRFdDX0NUTExfRFNUX0ZJWAogCQkJCXwgRFdDX0NUTExfU1JDX0lOQwogCQkJCXwgRFdDX0NUTExfRkNfTTJQKTsKLQkJcmVnID0gZHdzLT5zbGF2ZS50eF9yZWc7CisJCXJlZyA9IGR3cy0+dHhfcmVnOwogCQlmb3JfZWFjaF9zZyhzZ2wsIHNnLCBzZ19sZW4sIGkpIHsKIAkJCXN0cnVjdCBkd19kZXNjCSpkZXNjOwogCQkJdTMyCQlsZW47CkBAIC01ODcsNyArNTk2LDcgQEAKIAogCQkJZGVzYyA9IGR3Y19kZXNjX2dldChkd2MpOwogCQkJaWYgKCFkZXNjKSB7Ci0JCQkJZGV2X2VycigmY2hhbi0+ZGV2LAorCQkJCWRldl9lcnIoY2hhbjJkZXYoY2hhbiksCiAJCQkJCSJub3QgZW5vdWdoIGRlc2NyaXB0b3JzIGF2YWlsYWJsZVxuIik7CiAJCQkJZ290byBlcnJfZGVzY19nZXQ7CiAJCQl9CkBAIC02MDcsNyArNjE2LDcgQEAKIAkJCQlmaXJzdCA9IGRlc2M7CiAJCQl9IGVsc2UgewogCQkJCXByZXYtPmxsaS5sbHAgPSBkZXNjLT50eGQucGh5czsKLQkJCQlkbWFfc3luY19zaW5nbGVfZm9yX2RldmljZShjaGFuLT5kZXYucGFyZW50LAorCQkJCWRtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKGNoYW4ycGFyZW50KGNoYW4pLAogCQkJCQkJcHJldi0+dHhkLnBoeXMsCiAJCQkJCQlzaXplb2YocHJldi0+bGxpKSwKIAkJCQkJCURNQV9UT19ERVZJQ0UpOwpAQCAtNjI1LDcgKzYzNCw3IEBACiAJCQkJfCBEV0NfQ1RMTF9TUkNfRklYCiAJCQkJfCBEV0NfQ1RMTF9GQ19QMk0pOwogCi0JCXJlZyA9IGR3cy0+c2xhdmUucnhfcmVnOworCQlyZWcgPSBkd3MtPnJ4X3JlZzsKIAkJZm9yX2VhY2hfc2coc2dsLCBzZywgc2dfbGVuLCBpKSB7CiAJCQlzdHJ1Y3QgZHdfZGVzYwkqZGVzYzsKIAkJCXUzMgkJbGVuOwpAQCAtNjMzLDcgKzY0Miw3IEBACiAKIAkJCWRlc2MgPSBkd2NfZGVzY19nZXQoZHdjKTsKIAkJCWlmICghZGVzYykgewotCQkJCWRldl9lcnIoJmNoYW4tPmRldiwKKwkJCQlkZXZfZXJyKGNoYW4yZGV2KGNoYW4pLAogCQkJCQkibm90IGVub3VnaCBkZXNjcmlwdG9ycyBhdmFpbGFibGVcbiIpOwogCQkJCWdvdG8gZXJyX2Rlc2NfZ2V0OwogCQkJfQpAQCAtNjUzLDcgKzY2Miw3IEBACiAJCQkJZmlyc3QgPSBkZXNjOwogCQkJfSBlbHNlIHsKIAkJCQlwcmV2LT5sbGkubGxwID0gZGVzYy0+dHhkLnBoeXM7Ci0JCQkJZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2UoY2hhbi0+ZGV2LnBhcmVudCwKKwkJCQlkbWFfc3luY19zaW5nbGVfZm9yX2RldmljZShjaGFuMnBhcmVudChjaGFuKSwKIAkJCQkJCXByZXYtPnR4ZC5waHlzLAogCQkJCQkJc2l6ZW9mKHByZXYtPmxsaSksCiAJCQkJCQlETUFfVE9fREVWSUNFKTsKQEAgLTY3Myw3ICs2ODIsNyBAQAogCQlwcmV2LT5sbGkuY3RsbG8gfD0gRFdDX0NUTExfSU5UX0VOOwogCiAJcHJldi0+bGxpLmxscCA9IDA7Ci0JZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2UoY2hhbi0+ZGV2LnBhcmVudCwKKwlkbWFfc3luY19zaW5nbGVfZm9yX2RldmljZShjaGFuMnBhcmVudChjaGFuKSwKIAkJCXByZXYtPnR4ZC5waHlzLCBzaXplb2YocHJldi0+bGxpKSwKIAkJCURNQV9UT19ERVZJQ0UpOwogCkBAIC03NTgsMjkgKzc2NywyMSBAQAogCXNwaW5fdW5sb2NrX2JoKCZkd2MtPmxvY2spOwogfQogCi1zdGF0aWMgaW50IGR3Y19hbGxvY19jaGFuX3Jlc291cmNlcyhzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4sCi0JCXN0cnVjdCBkbWFfY2xpZW50ICpjbGllbnQpCitzdGF0aWMgaW50IGR3Y19hbGxvY19jaGFuX3Jlc291cmNlcyhzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4pCiB7CiAJc3RydWN0IGR3X2RtYV9jaGFuCSpkd2MgPSB0b19kd19kbWFfY2hhbihjaGFuKTsKIAlzdHJ1Y3QgZHdfZG1hCQkqZHcgPSB0b19kd19kbWEoY2hhbi0+ZGV2aWNlKTsKIAlzdHJ1Y3QgZHdfZGVzYwkJKmRlc2M7Ci0Jc3RydWN0IGRtYV9zbGF2ZQkqc2xhdmU7CiAJc3RydWN0IGR3X2RtYV9zbGF2ZQkqZHdzOwogCWludAkJCWk7CiAJdTMyCQkJY2ZnaGk7CiAJdTMyCQkJY2ZnbG87CiAKLQlkZXZfdmRiZygmY2hhbi0+ZGV2LCAiYWxsb2NfY2hhbl9yZXNvdXJjZXNcbiIpOwotCi0JLyogQ2hhbm5lbHMgZG9pbmcgc2xhdmUgRE1BIGNhbiBvbmx5IGhhbmRsZSBvbmUgY2xpZW50LiAqLwotCWlmIChkd2MtPmR3cyB8fCBjbGllbnQtPnNsYXZlKSB7Ci0JCWlmIChjaGFuLT5jbGllbnRfY291bnQpCi0JCQlyZXR1cm4gLUVCVVNZOwotCX0KKwlkZXZfdmRiZyhjaGFuMmRldihjaGFuKSwgImFsbG9jX2NoYW5fcmVzb3VyY2VzXG4iKTsKIAogCS8qIEFTU0VSVDogIGNoYW5uZWwgaXMgaWRsZSAqLwogCWlmIChkbWFfcmVhZGwoZHcsIENIX0VOKSAmIGR3Yy0+bWFzaykgewotCQlkZXZfZGJnKCZjaGFuLT5kZXYsICJETUEgY2hhbm5lbCBub3QgaWRsZT9cbiIpOworCQlkZXZfZGJnKGNoYW4yZGV2KGNoYW4pLCAiRE1BIGNoYW5uZWwgbm90IGlkbGU/XG4iKTsKIAkJcmV0dXJuIC1FSU87CiAJfQogCkBAIC03ODksMjMgKzc5MCwxNyBAQAogCWNmZ2hpID0gRFdDX0NGR0hfRklGT19NT0RFOwogCWNmZ2xvID0gMDsKIAotCXNsYXZlID0gY2xpZW50LT5zbGF2ZTsKLQlpZiAoc2xhdmUpIHsKKwlkd3MgPSBkd2MtPmR3czsKKwlpZiAoZHdzKSB7CiAJCS8qCiAJCSAqIFdlIG5lZWQgY29udHJvbGxlci1zcGVjaWZpYyBkYXRhIHRvIHNldCB1cCBzbGF2ZQogCQkgKiB0cmFuc2ZlcnMuCiAJCSAqLwotCQlCVUdfT04oIXNsYXZlLT5kbWFfZGV2IHx8IHNsYXZlLT5kbWFfZGV2ICE9IGR3LT5kbWEuZGV2KTsKKwkJQlVHX09OKCFkd3MtPmRtYV9kZXYgfHwgZHdzLT5kbWFfZGV2ICE9IGR3LT5kbWEuZGV2KTsKIAotCQlkd3MgPSBjb250YWluZXJfb2Yoc2xhdmUsIHN0cnVjdCBkd19kbWFfc2xhdmUsIHNsYXZlKTsKLQotCQlkd2MtPmR3cyA9IGR3czsKIAkJY2ZnaGkgPSBkd3MtPmNmZ19oaTsKIAkJY2ZnbG8gPSBkd3MtPmNmZ19sbzsKLQl9IGVsc2UgewotCQlkd2MtPmR3cyA9IE5VTEw7CiAJfQotCiAJY2hhbm5lbF93cml0ZWwoZHdjLCBDRkdfTE8sIGNmZ2xvKTsKIAljaGFubmVsX3dyaXRlbChkd2MsIENGR19ISSwgY2ZnaGkpOwogCkBAIC04MjIsNyArODE3LDcgQEAKIAogCQlkZXNjID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGR3X2Rlc2MpLCBHRlBfS0VSTkVMKTsKIAkJaWYgKCFkZXNjKSB7Ci0JCQlkZXZfaW5mbygmY2hhbi0+ZGV2LAorCQkJZGV2X2luZm8oY2hhbjJkZXYoY2hhbiksCiAJCQkJIm9ubHkgYWxsb2NhdGVkICVkIGRlc2NyaXB0b3JzXG4iLCBpKTsKIAkJCXNwaW5fbG9ja19iaCgmZHdjLT5sb2NrKTsKIAkJCWJyZWFrOwpAQCAtODMyLDcgKzgyNyw3IEBACiAJCWRlc2MtPnR4ZC50eF9zdWJtaXQgPSBkd2NfdHhfc3VibWl0OwogCQlkZXNjLT50eGQuZmxhZ3MgPSBETUFfQ1RSTF9BQ0s7CiAJCUlOSVRfTElTVF9IRUFEKCZkZXNjLT50eGQudHhfbGlzdCk7Ci0JCWRlc2MtPnR4ZC5waHlzID0gZG1hX21hcF9zaW5nbGUoY2hhbi0+ZGV2LnBhcmVudCwgJmRlc2MtPmxsaSwKKwkJZGVzYy0+dHhkLnBoeXMgPSBkbWFfbWFwX3NpbmdsZShjaGFuMnBhcmVudChjaGFuKSwgJmRlc2MtPmxsaSwKIAkJCQlzaXplb2YoZGVzYy0+bGxpKSwgRE1BX1RPX0RFVklDRSk7CiAJCWR3Y19kZXNjX3B1dChkd2MsIGRlc2MpOwogCkBAIC04NDcsNyArODQyLDcgQEAKIAogCXNwaW5fdW5sb2NrX2JoKCZkd2MtPmxvY2spOwogCi0JZGV2X2RiZygmY2hhbi0+ZGV2LAorCWRldl9kYmcoY2hhbjJkZXYoY2hhbiksCiAJCSJhbGxvY19jaGFuX3Jlc291cmNlcyBhbGxvY2F0ZWQgJWQgZGVzY3JpcHRvcnNcbiIsIGkpOwogCiAJcmV0dXJuIGk7CkBAIC04NjAsNyArODU1LDcgQEAKIAlzdHJ1Y3QgZHdfZGVzYwkJKmRlc2MsICpfZGVzYzsKIAlMSVNUX0hFQUQobGlzdCk7CiAKLQlkZXZfZGJnKCZjaGFuLT5kZXYsICJmcmVlX2NoYW5fcmVzb3VyY2VzIChkZXNjcyBhbGxvY2F0ZWQ9JXUpXG4iLAorCWRldl9kYmcoY2hhbjJkZXYoY2hhbiksICJmcmVlX2NoYW5fcmVzb3VyY2VzIChkZXNjcyBhbGxvY2F0ZWQ9JXUpXG4iLAogCQkJZHdjLT5kZXNjc19hbGxvY2F0ZWQpOwogCiAJLyogQVNTRVJUOiAgY2hhbm5lbCBpcyBpZGxlICovCkBAIC04ODEsMTMgKzg3NiwxMyBAQAogCXNwaW5fdW5sb2NrX2JoKCZkd2MtPmxvY2spOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGRlc2MsIF9kZXNjLCAmbGlzdCwgZGVzY19ub2RlKSB7Ci0JCWRldl92ZGJnKCZjaGFuLT5kZXYsICIgIGZyZWVpbmcgZGVzY3JpcHRvciAlcFxuIiwgZGVzYyk7Ci0JCWRtYV91bm1hcF9zaW5nbGUoY2hhbi0+ZGV2LnBhcmVudCwgZGVzYy0+dHhkLnBoeXMsCisJCWRldl92ZGJnKGNoYW4yZGV2KGNoYW4pLCAiICBmcmVlaW5nIGRlc2NyaXB0b3IgJXBcbiIsIGRlc2MpOworCQlkbWFfdW5tYXBfc2luZ2xlKGNoYW4ycGFyZW50KGNoYW4pLCBkZXNjLT50eGQucGh5cywKIAkJCQlzaXplb2YoZGVzYy0+bGxpKSwgRE1BX1RPX0RFVklDRSk7CiAJCWtmcmVlKGRlc2MpOwogCX0KIAotCWRldl92ZGJnKCZjaGFuLT5kZXYsICJmcmVlX2NoYW5fcmVzb3VyY2VzIGRvbmVcbiIpOworCWRldl92ZGJnKGNoYW4yZGV2KGNoYW4pLCAiZnJlZV9jaGFuX3Jlc291cmNlcyBkb25lXG4iKTsKIH0KIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZG1hL2ZzbGRtYS5jIGIvZHJpdmVycy9kbWEvZnNsZG1hLmMKaW5kZXggMGI5NWRjYy4uY2E3MGEyMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9kbWEvZnNsZG1hLmMKKysrIGIvZHJpdmVycy9kbWEvZnNsZG1hLmMKQEAgLTM2Niw4ICszNjYsNyBAQAogICoKICAqIFJldHVybiAtIFRoZSBudW1iZXIgb2YgZGVzY3JpcHRvcnMgYWxsb2NhdGVkLgogICovCi1zdGF0aWMgaW50IGZzbF9kbWFfYWxsb2NfY2hhbl9yZXNvdXJjZXMoc3RydWN0IGRtYV9jaGFuICpjaGFuLAotCQkJCQlzdHJ1Y3QgZG1hX2NsaWVudCAqY2xpZW50KQorc3RhdGljIGludCBmc2xfZG1hX2FsbG9jX2NoYW5fcmVzb3VyY2VzKHN0cnVjdCBkbWFfY2hhbiAqY2hhbikKIHsKIAlzdHJ1Y3QgZnNsX2RtYV9jaGFuICpmc2xfY2hhbiA9IHRvX2ZzbF9jaGFuKGNoYW4pOwogCkBAIC04MjMsNyArODIyLDcgQEAKIAkgKi8KIAlXQVJOX09OKGZkZXYtPmZlYXR1cmUgIT0gbmV3X2ZzbF9jaGFuLT5mZWF0dXJlKTsKIAotCW5ld19mc2xfY2hhbi0+ZGV2ID0gJm5ld19mc2xfY2hhbi0+Y29tbW9uLmRldjsKKwluZXdfZnNsX2NoYW4tPmRldiA9ICZuZXdfZnNsX2NoYW4tPmNvbW1vbi5kZXYtPmRldmljZTsKIAluZXdfZnNsX2NoYW4tPnJlZ19iYXNlID0gaW9yZW1hcChuZXdfZnNsX2NoYW4tPnJlZy5zdGFydCwKIAkJCW5ld19mc2xfY2hhbi0+cmVnLmVuZCAtIG5ld19mc2xfY2hhbi0+cmVnLnN0YXJ0ICsgMSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZG1hL2lvYXQuYyBiL2RyaXZlcnMvZG1hL2lvYXQuYwppbmRleCA5YjE2YTNhLi40MTA1ZDY1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2RtYS9pb2F0LmMKKysrIGIvZHJpdmVycy9kbWEvaW9hdC5jCkBAIC03NSw2MCArNzUsMTAgQEAKIG1vZHVsZV9wYXJhbShpb2F0X2RjYV9lbmFibGVkLCBpbnQsIDA2NDQpOwogTU9EVUxFX1BBUk1fREVTQyhpb2F0X2RjYV9lbmFibGVkLCAiY29udHJvbCBzdXBwb3J0IG9mIGRjYSBzZXJ2aWNlIChkZWZhdWx0OiAxKSIpOwogCi1zdGF0aWMgaW50IGlvYXRfc2V0dXBfZnVuY3Rpb25hbGl0eShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgdm9pZCBfX2lvbWVtICppb2Jhc2UpCi17Ci0Jc3RydWN0IGlvYXRfZGV2aWNlICpkZXZpY2UgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7Ci0JdTggdmVyc2lvbjsKLQlpbnQgZXJyID0gMDsKLQotCXZlcnNpb24gPSByZWFkYihpb2Jhc2UgKyBJT0FUX1ZFUl9PRkZTRVQpOwotCXN3aXRjaCAodmVyc2lvbikgewotCWNhc2UgSU9BVF9WRVJfMV8yOgotCQlkZXZpY2UtPmRtYSA9IGlvYXRfZG1hX3Byb2JlKHBkZXYsIGlvYmFzZSk7Ci0JCWlmIChkZXZpY2UtPmRtYSAmJiBpb2F0X2RjYV9lbmFibGVkKQotCQkJZGV2aWNlLT5kY2EgPSBpb2F0X2RjYV9pbml0KHBkZXYsIGlvYmFzZSk7Ci0JCWJyZWFrOwotCWNhc2UgSU9BVF9WRVJfMl8wOgotCQlkZXZpY2UtPmRtYSA9IGlvYXRfZG1hX3Byb2JlKHBkZXYsIGlvYmFzZSk7Ci0JCWlmIChkZXZpY2UtPmRtYSAmJiBpb2F0X2RjYV9lbmFibGVkKQotCQkJZGV2aWNlLT5kY2EgPSBpb2F0Ml9kY2FfaW5pdChwZGV2LCBpb2Jhc2UpOwotCQlicmVhazsKLQljYXNlIElPQVRfVkVSXzNfMDoKLQkJZGV2aWNlLT5kbWEgPSBpb2F0X2RtYV9wcm9iZShwZGV2LCBpb2Jhc2UpOwotCQlpZiAoZGV2aWNlLT5kbWEgJiYgaW9hdF9kY2FfZW5hYmxlZCkKLQkJCWRldmljZS0+ZGNhID0gaW9hdDNfZGNhX2luaXQocGRldiwgaW9iYXNlKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJZXJyID0gLUVOT0RFVjsKLQkJYnJlYWs7Ci0JfQotCWlmICghZGV2aWNlLT5kbWEpCi0JCWVyciA9IC1FTk9ERVY7Ci0JcmV0dXJuIGVycjsKLX0KLQotc3RhdGljIHZvaWQgaW9hdF9zaHV0ZG93bl9mdW5jdGlvbmFsaXR5KHN0cnVjdCBwY2lfZGV2ICpwZGV2KQotewotCXN0cnVjdCBpb2F0X2RldmljZSAqZGV2aWNlID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOwotCi0JZGV2X2VycigmcGRldi0+ZGV2LCAiUmVtb3ZpbmcgZG1hIGFuZCBkY2Egc2VydmljZXNcbiIpOwotCWlmIChkZXZpY2UtPmRjYSkgewotCQl1bnJlZ2lzdGVyX2RjYV9wcm92aWRlcihkZXZpY2UtPmRjYSk7Ci0JCWZyZWVfZGNhX3Byb3ZpZGVyKGRldmljZS0+ZGNhKTsKLQkJZGV2aWNlLT5kY2EgPSBOVUxMOwotCX0KLQotCWlmIChkZXZpY2UtPmRtYSkgewotCQlpb2F0X2RtYV9yZW1vdmUoZGV2aWNlLT5kbWEpOwotCQlkZXZpY2UtPmRtYSA9IE5VTEw7Ci0JfQotfQotCiBzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgaW9hdF9wY2lfZHJpdmVyID0gewogCS5uYW1lCQk9ICJpb2F0ZG1hIiwKIAkuaWRfdGFibGUJPSBpb2F0X3BjaV90YmwsCiAJLnByb2JlCQk9IGlvYXRfcHJvYmUsCi0JLnNodXRkb3duCT0gaW9hdF9zaHV0ZG93bl9mdW5jdGlvbmFsaXR5LAogCS5yZW1vdmUJCT0gX19kZXZleGl0X3AoaW9hdF9yZW1vdmUpLAogfTsKIApAQCAtMTc5LDcgKzEyOSwyOSBAQAogCiAJcGNpX3NldF9tYXN0ZXIocGRldik7CiAKLQllcnIgPSBpb2F0X3NldHVwX2Z1bmN0aW9uYWxpdHkocGRldiwgaW9iYXNlKTsKKwlzd2l0Y2ggKHJlYWRiKGlvYmFzZSArIElPQVRfVkVSX09GRlNFVCkpIHsKKwljYXNlIElPQVRfVkVSXzFfMjoKKwkJZGV2aWNlLT5kbWEgPSBpb2F0X2RtYV9wcm9iZShwZGV2LCBpb2Jhc2UpOworCQlpZiAoZGV2aWNlLT5kbWEgJiYgaW9hdF9kY2FfZW5hYmxlZCkKKwkJCWRldmljZS0+ZGNhID0gaW9hdF9kY2FfaW5pdChwZGV2LCBpb2Jhc2UpOworCQlicmVhazsKKwljYXNlIElPQVRfVkVSXzJfMDoKKwkJZGV2aWNlLT5kbWEgPSBpb2F0X2RtYV9wcm9iZShwZGV2LCBpb2Jhc2UpOworCQlpZiAoZGV2aWNlLT5kbWEgJiYgaW9hdF9kY2FfZW5hYmxlZCkKKwkJCWRldmljZS0+ZGNhID0gaW9hdDJfZGNhX2luaXQocGRldiwgaW9iYXNlKTsKKwkJYnJlYWs7CisJY2FzZSBJT0FUX1ZFUl8zXzA6CisJCWRldmljZS0+ZG1hID0gaW9hdF9kbWFfcHJvYmUocGRldiwgaW9iYXNlKTsKKwkJaWYgKGRldmljZS0+ZG1hICYmIGlvYXRfZGNhX2VuYWJsZWQpCisJCQlkZXZpY2UtPmRjYSA9IGlvYXQzX2RjYV9pbml0KHBkZXYsIGlvYmFzZSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWVyciA9IC1FTk9ERVY7CisJCWJyZWFrOworCX0KKwlpZiAoIWRldmljZS0+ZG1hKQorCQllcnIgPSAtRU5PREVWOworCiAJaWYgKGVycikKIAkJZ290byBlcnJfdmVyc2lvbjsKIApAQCAtMTk4LDE3ICsxNzAsMjEgQEAKIAlyZXR1cm4gZXJyOwogfQogCi0vKgotICogSXQgaXMgdW5zYWZlIHRvIHJlbW92ZSB0aGlzIG1vZHVsZTogaWYgcmVtb3ZlZCB3aGlsZSBhIHJlcXVlc3RlZAotICogZG1hIGlzIG91dHN0YW5kaW5nLCBlc3AuIGZyb20gdGNwLCBpdCBpcyBwb3NzaWJsZSB0byBoYW5nIHdoaWxlCi0gKiB3YWl0aW5nIGZvciBzb21ldGhpbmcgdGhhdCB3aWxsIG5ldmVyIGZpbmlzaC4gIEhvd2V2ZXIsIGlmIHlvdSdyZQotICogZmVlbGluZyBsdWNreSwgdGhpcyB1c3VhbGx5IHdvcmtzIGp1c3QgZmluZS4KLSAqLwogc3RhdGljIHZvaWQgX19kZXZleGl0IGlvYXRfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQogewogCXN0cnVjdCBpb2F0X2RldmljZSAqZGV2aWNlID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOwogCi0JaW9hdF9zaHV0ZG93bl9mdW5jdGlvbmFsaXR5KHBkZXYpOworCWRldl9lcnIoJnBkZXYtPmRldiwgIlJlbW92aW5nIGRtYSBhbmQgZGNhIHNlcnZpY2VzXG4iKTsKKwlpZiAoZGV2aWNlLT5kY2EpIHsKKwkJdW5yZWdpc3Rlcl9kY2FfcHJvdmlkZXIoZGV2aWNlLT5kY2EpOworCQlmcmVlX2RjYV9wcm92aWRlcihkZXZpY2UtPmRjYSk7CisJCWRldmljZS0+ZGNhID0gTlVMTDsKKwl9CisKKwlpZiAoZGV2aWNlLT5kbWEpIHsKKwkJaW9hdF9kbWFfcmVtb3ZlKGRldmljZS0+ZG1hKTsKKwkJZGV2aWNlLT5kbWEgPSBOVUxMOworCX0KIAogCWtmcmVlKGRldmljZSk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2RtYS9pb2F0X2RtYS5jIGIvZHJpdmVycy9kbWEvaW9hdF9kbWEuYwppbmRleCA2NjA3ZmRkLi5iMzc1OWM0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2RtYS9pb2F0X2RtYS5jCisrKyBiL2RyaXZlcnMvZG1hL2lvYXRfZG1hLmMKQEAgLTczNCw4ICs3MzQsNyBAQAogICogaW9hdF9kbWFfYWxsb2NfY2hhbl9yZXNvdXJjZXMgLSByZXR1cm5zIHRoZSBudW1iZXIgb2YgYWxsb2NhdGVkIGRlc2NyaXB0b3JzCiAgKiBAY2hhbjogdGhlIGNoYW5uZWwgdG8gYmUgZmlsbGVkIG91dAogICovCi1zdGF0aWMgaW50IGlvYXRfZG1hX2FsbG9jX2NoYW5fcmVzb3VyY2VzKHN0cnVjdCBkbWFfY2hhbiAqY2hhbiwKLQkJCQkJIHN0cnVjdCBkbWFfY2xpZW50ICpjbGllbnQpCitzdGF0aWMgaW50IGlvYXRfZG1hX2FsbG9jX2NoYW5fcmVzb3VyY2VzKHN0cnVjdCBkbWFfY2hhbiAqY2hhbikKIHsKIAlzdHJ1Y3QgaW9hdF9kbWFfY2hhbiAqaW9hdF9jaGFuID0gdG9faW9hdF9jaGFuKGNoYW4pOwogCXN0cnVjdCBpb2F0X2Rlc2Nfc3cgKmRlc2M7CkBAIC0xMzQxLDEyICsxMzQwLDExIEBACiAgKi8KICNkZWZpbmUgSU9BVF9URVNUX1NJWkUgMjAwMAogCi1ERUNMQVJFX0NPTVBMRVRJT04odGVzdF9jb21wbGV0aW9uKTsKIHN0YXRpYyB2b2lkIGlvYXRfZG1hX3Rlc3RfY2FsbGJhY2sodm9pZCAqZG1hX2FzeW5jX3BhcmFtKQogewotCXByaW50ayhLRVJOX0VSUiAiaW9hdGRtYTogaW9hdF9kbWFfdGVzdF9jYWxsYmFjayglcClcbiIsCi0JCWRtYV9hc3luY19wYXJhbSk7Ci0JY29tcGxldGUoJnRlc3RfY29tcGxldGlvbik7CisJc3RydWN0IGNvbXBsZXRpb24gKmNtcCA9IGRtYV9hc3luY19wYXJhbTsKKworCWNvbXBsZXRlKGNtcCk7CiB9CiAKIC8qKgpAQCAtMTM2Myw2ICsxMzYxLDcgQEAKIAlkbWFfYWRkcl90IGRtYV9kZXN0LCBkbWFfc3JjOwogCWRtYV9jb29raWVfdCBjb29raWU7CiAJaW50IGVyciA9IDA7CisJc3RydWN0IGNvbXBsZXRpb24gY21wOwogCiAJc3JjID0ga3phbGxvYyhzaXplb2YodTgpICogSU9BVF9URVNUX1NJWkUsIEdGUF9LRVJORUwpOwogCWlmICghc3JjKQpAQCAtMTM4MSw3ICsxMzgwLDcgQEAKIAlkbWFfY2hhbiA9IGNvbnRhaW5lcl9vZihkZXZpY2UtPmNvbW1vbi5jaGFubmVscy5uZXh0LAogCQkJCXN0cnVjdCBkbWFfY2hhbiwKIAkJCQlkZXZpY2Vfbm9kZSk7Ci0JaWYgKGRldmljZS0+Y29tbW9uLmRldmljZV9hbGxvY19jaGFuX3Jlc291cmNlcyhkbWFfY2hhbiwgTlVMTCkgPCAxKSB7CisJaWYgKGRldmljZS0+Y29tbW9uLmRldmljZV9hbGxvY19jaGFuX3Jlc291cmNlcyhkbWFfY2hhbikgPCAxKSB7CiAJCWRldl9lcnIoJmRldmljZS0+cGRldi0+ZGV2LAogCQkJInNlbGZ0ZXN0IGNhbm5vdCBhbGxvY2F0ZSBjaGFuIHJlc291cmNlXG4iKTsKIAkJZXJyID0gLUVOT0RFVjsKQEAgLTE0MDIsOCArMTQwMSw5IEBACiAJfQogCiAJYXN5bmNfdHhfYWNrKHR4KTsKKwlpbml0X2NvbXBsZXRpb24oJmNtcCk7CiAJdHgtPmNhbGxiYWNrID0gaW9hdF9kbWFfdGVzdF9jYWxsYmFjazsKLQl0eC0+Y2FsbGJhY2tfcGFyYW0gPSAodm9pZCAqKTB4ODA4NjsKKwl0eC0+Y2FsbGJhY2tfcGFyYW0gPSAmY21wOwogCWNvb2tpZSA9IHR4LT50eF9zdWJtaXQodHgpOwogCWlmIChjb29raWUgPCAwKSB7CiAJCWRldl9lcnIoJmRldmljZS0+cGRldi0+ZGV2LApAQCAtMTQxMyw3ICsxNDEzLDcgQEAKIAl9CiAJZGV2aWNlLT5jb21tb24uZGV2aWNlX2lzc3VlX3BlbmRpbmcoZG1hX2NoYW4pOwogCi0Jd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZ0ZXN0X2NvbXBsZXRpb24sIG1zZWNzX3RvX2ppZmZpZXMoMzAwMCkpOworCXdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmY21wLCBtc2Vjc190b19qaWZmaWVzKDMwMDApKTsKIAogCWlmIChkZXZpY2UtPmNvbW1vbi5kZXZpY2VfaXNfdHhfY29tcGxldGUoZG1hX2NoYW4sIGNvb2tpZSwgTlVMTCwgTlVMTCkKIAkJCQkJIT0gRE1BX1NVQ0NFU1MpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZG1hL2lvcC1hZG1hLmMgYi9kcml2ZXJzL2RtYS9pb3AtYWRtYS5jCmluZGV4IDZiZTMxNzIuLmVhNTQ0MGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZG1hL2lvcC1hZG1hLmMKKysrIGIvZHJpdmVycy9kbWEvaW9wLWFkbWEuYwpAQCAtMjQsNyArMjQsNiBAQAogCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2FzeW5jX3R4Lmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CkBAIC0xMTYsNyArMTE1LDcgQEAKIAl9CiAKIAkvKiBydW4gZGVwZW5kZW50IG9wZXJhdGlvbnMgKi8KLQlhc3luY190eF9ydW5fZGVwZW5kZW5jaWVzKCZkZXNjLT5hc3luY190eCk7CisJZG1hX3J1bl9kZXBlbmRlbmNpZXMoJmRlc2MtPmFzeW5jX3R4KTsKIAogCXJldHVybiBjb29raWU7CiB9CkBAIC0yNzAsOCArMjY5LDYgQEAKIAkJCWJyZWFrOwogCX0KIAotCUJVR19PTighc2Vlbl9jdXJyZW50KTsKLQogCWlmIChjb29raWUgPiAwKSB7CiAJCWlvcF9jaGFuLT5jb21wbGV0ZWRfY29va2llID0gY29va2llOwogCQlwcl9kZWJ1ZygiXHRjb21wbGV0ZWQgY29va2llICVkXG4iLCBjb29raWUpOwpAQCAtNDcxLDggKzQ2OCw3IEBACiAgKiBncmVhdGVyIHRoYW4gMnggdGhlIG51bWJlciBzbG90cyBuZWVkZWQgdG8gc2F0aXNmeSBhIGRldmljZS0+bWF4X3hvcgogICogcmVxdWVzdC4KICAqICovCi1zdGF0aWMgaW50IGlvcF9hZG1hX2FsbG9jX2NoYW5fcmVzb3VyY2VzKHN0cnVjdCBkbWFfY2hhbiAqY2hhbiwKLQkJCQkJIHN0cnVjdCBkbWFfY2xpZW50ICpjbGllbnQpCitzdGF0aWMgaW50IGlvcF9hZG1hX2FsbG9jX2NoYW5fcmVzb3VyY2VzKHN0cnVjdCBkbWFfY2hhbiAqY2hhbikKIHsKIAljaGFyICpod19kZXNjOwogCWludCBpZHg7CkBAIC04NjYsNyArODYyLDcgQEAKIAlkbWFfY2hhbiA9IGNvbnRhaW5lcl9vZihkZXZpY2UtPmNvbW1vbi5jaGFubmVscy5uZXh0LAogCQkJCXN0cnVjdCBkbWFfY2hhbiwKIAkJCQlkZXZpY2Vfbm9kZSk7Ci0JaWYgKGlvcF9hZG1hX2FsbG9jX2NoYW5fcmVzb3VyY2VzKGRtYV9jaGFuLCBOVUxMKSA8IDEpIHsKKwlpZiAoaW9wX2FkbWFfYWxsb2NfY2hhbl9yZXNvdXJjZXMoZG1hX2NoYW4pIDwgMSkgewogCQllcnIgPSAtRU5PREVWOwogCQlnb3RvIG91dDsKIAl9CkBAIC05NjQsNyArOTYwLDcgQEAKIAlkbWFfY2hhbiA9IGNvbnRhaW5lcl9vZihkZXZpY2UtPmNvbW1vbi5jaGFubmVscy5uZXh0LAogCQkJCXN0cnVjdCBkbWFfY2hhbiwKIAkJCQlkZXZpY2Vfbm9kZSk7Ci0JaWYgKGlvcF9hZG1hX2FsbG9jX2NoYW5fcmVzb3VyY2VzKGRtYV9jaGFuLCBOVUxMKSA8IDEpIHsKKwlpZiAoaW9wX2FkbWFfYWxsb2NfY2hhbl9yZXNvdXJjZXMoZG1hX2NoYW4pIDwgMSkgewogCQllcnIgPSAtRU5PREVWOwogCQlnb3RvIG91dDsKIAl9CkBAIC0xMTE1LDI2ICsxMTExLDEzIEBACiAJc3RydWN0IGlvcF9hZG1hX2RldmljZSAqZGV2aWNlID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEoZGV2KTsKIAlzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4sICpfY2hhbjsKIAlzdHJ1Y3QgaW9wX2FkbWFfY2hhbiAqaW9wX2NoYW47Ci0JaW50IGk7CiAJc3RydWN0IGlvcF9hZG1hX3BsYXRmb3JtX2RhdGEgKnBsYXRfZGF0YSA9IGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CiAKIAlkbWFfYXN5bmNfZGV2aWNlX3VucmVnaXN0ZXIoJmRldmljZS0+Y29tbW9uKTsKIAotCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKLQkJdW5zaWduZWQgaW50IGlycTsKLQkJaXJxID0gcGxhdGZvcm1fZ2V0X2lycShkZXYsIGkpOwotCQlmcmVlX2lycShpcnEsIGRldmljZSk7Ci0JfQotCiAJZG1hX2ZyZWVfY29oZXJlbnQoJmRldi0+ZGV2LCBwbGF0X2RhdGEtPnBvb2xfc2l6ZSwKIAkJCWRldmljZS0+ZG1hX2Rlc2NfcG9vbF92aXJ0LCBkZXZpY2UtPmRtYV9kZXNjX3Bvb2wpOwogCi0JZG8gewotCQlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKLQkJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOwotCQlyZWxlYXNlX21lbV9yZWdpb24ocmVzLT5zdGFydCwgcmVzLT5lbmQgLSByZXMtPnN0YXJ0KTsKLQl9IHdoaWxlICgwKTsKLQogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShjaGFuLCBfY2hhbiwgJmRldmljZS0+Y29tbW9uLmNoYW5uZWxzLAogCQkJCWRldmljZV9ub2RlKSB7CiAJCWlvcF9jaGFuID0gdG9faW9wX2FkbWFfY2hhbihjaGFuKTsKQEAgLTEyNTUsNyArMTIzOCw2IEBACiAJc3Bpbl9sb2NrX2luaXQoJmlvcF9jaGFuLT5sb2NrKTsKIAlJTklUX0xJU1RfSEVBRCgmaW9wX2NoYW4tPmNoYWluKTsKIAlJTklUX0xJU1RfSEVBRCgmaW9wX2NoYW4tPmFsbF9zbG90cyk7Ci0JSU5JVF9SQ1VfSEVBRCgmaW9wX2NoYW4tPmNvbW1vbi5yY3UpOwogCWlvcF9jaGFuLT5jb21tb24uZGV2aWNlID0gZG1hX2RldjsKIAlsaXN0X2FkZF90YWlsKCZpb3BfY2hhbi0+Y29tbW9uLmRldmljZV9ub2RlLCAmZG1hX2Rldi0+Y2hhbm5lbHMpOwogCkBAIC0xNDMxLDE2ICsxNDEzLDEyIEBACiAJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmaW9wX2FkbWFfZHJpdmVyKTsKIH0KIAotLyogaXQncyBjdXJyZW50bHkgdW5zYWZlIHRvIHVubG9hZCB0aGlzIG1vZHVsZSAqLwotI2lmIDAKIHN0YXRpYyB2b2lkIF9fZXhpdCBpb3BfYWRtYV9leGl0ICh2b2lkKQogewogCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZpb3BfYWRtYV9kcml2ZXIpOwogCXJldHVybjsKIH0KIG1vZHVsZV9leGl0KGlvcF9hZG1hX2V4aXQpOwotI2VuZGlmCi0KIG1vZHVsZV9pbml0KGlvcF9hZG1hX2luaXQpOwogCiBNT0RVTEVfQVVUSE9SKCJJbnRlbCBDb3Jwb3JhdGlvbiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9kbWEvbXZfeG9yLmMgYi9kcml2ZXJzL2RtYS9tdl94b3IuYwppbmRleCBiY2RhMTc0Li5kMzVjYmQxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2RtYS9tdl94b3IuYworKysgYi9kcml2ZXJzL2RtYS9tdl94b3IuYwpAQCAtMTgsNyArMTgsNiBAQAogCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2FzeW5jX3R4Lmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CkBAIC0zNDAsNyArMzM5LDcgQEAKIAl9CiAKIAkvKiBydW4gZGVwZW5kZW50IG9wZXJhdGlvbnMgKi8KLQlhc3luY190eF9ydW5fZGVwZW5kZW5jaWVzKCZkZXNjLT5hc3luY190eCk7CisJZG1hX3J1bl9kZXBlbmRlbmNpZXMoJmRlc2MtPmFzeW5jX3R4KTsKIAogCXJldHVybiBjb29raWU7CiB9CkBAIC02MDcsOCArNjA2LDcgQEAKIH0KIAogLyogcmV0dXJucyB0aGUgbnVtYmVyIG9mIGFsbG9jYXRlZCBkZXNjcmlwdG9ycyAqLwotc3RhdGljIGludCBtdl94b3JfYWxsb2NfY2hhbl9yZXNvdXJjZXMoc3RydWN0IGRtYV9jaGFuICpjaGFuLAotCQkJCSAgICAgICBzdHJ1Y3QgZG1hX2NsaWVudCAqY2xpZW50KQorc3RhdGljIGludCBtdl94b3JfYWxsb2NfY2hhbl9yZXNvdXJjZXMoc3RydWN0IGRtYV9jaGFuICpjaGFuKQogewogCWNoYXIgKmh3X2Rlc2M7CiAJaW50IGlkeDsKQEAgLTk1OCw3ICs5NTYsNyBAQAogCWRtYV9jaGFuID0gY29udGFpbmVyX29mKGRldmljZS0+Y29tbW9uLmNoYW5uZWxzLm5leHQsCiAJCQkJc3RydWN0IGRtYV9jaGFuLAogCQkJCWRldmljZV9ub2RlKTsKLQlpZiAobXZfeG9yX2FsbG9jX2NoYW5fcmVzb3VyY2VzKGRtYV9jaGFuLCBOVUxMKSA8IDEpIHsKKwlpZiAobXZfeG9yX2FsbG9jX2NoYW5fcmVzb3VyY2VzKGRtYV9jaGFuKSA8IDEpIHsKIAkJZXJyID0gLUVOT0RFVjsKIAkJZ290byBvdXQ7CiAJfQpAQCAtMTA1Myw3ICsxMDUxLDcgQEAKIAlkbWFfY2hhbiA9IGNvbnRhaW5lcl9vZihkZXZpY2UtPmNvbW1vbi5jaGFubmVscy5uZXh0LAogCQkJCXN0cnVjdCBkbWFfY2hhbiwKIAkJCQlkZXZpY2Vfbm9kZSk7Ci0JaWYgKG12X3hvcl9hbGxvY19jaGFuX3Jlc291cmNlcyhkbWFfY2hhbiwgTlVMTCkgPCAxKSB7CisJaWYgKG12X3hvcl9hbGxvY19jaGFuX3Jlc291cmNlcyhkbWFfY2hhbikgPCAxKSB7CiAJCWVyciA9IC1FTk9ERVY7CiAJCWdvdG8gb3V0OwogCX0KQEAgLTEyMjEsNyArMTIxOSw2IEBACiAJSU5JVF9MSVNUX0hFQUQoJm12X2NoYW4tPmNoYWluKTsKIAlJTklUX0xJU1RfSEVBRCgmbXZfY2hhbi0+Y29tcGxldGVkX3Nsb3RzKTsKIAlJTklUX0xJU1RfSEVBRCgmbXZfY2hhbi0+YWxsX3Nsb3RzKTsKLQlJTklUX1JDVV9IRUFEKCZtdl9jaGFuLT5jb21tb24ucmN1KTsKIAltdl9jaGFuLT5jb21tb24uZGV2aWNlID0gZG1hX2RldjsKIAogCWxpc3RfYWRkX3RhaWwoJm12X2NoYW4tPmNvbW1vbi5kZXZpY2Vfbm9kZSwgJmRtYV9kZXYtPmNoYW5uZWxzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZmlyZXdpcmUvZnctY2FyZC5jIGIvZHJpdmVycy9maXJld2lyZS9mdy1jYXJkLmMKaW5kZXggNDE4YzE4Zi4uNmJkOTFhMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9maXJld2lyZS9mdy1jYXJkLmMKKysrIGIvZHJpdmVycy9maXJld2lyZS9mdy1jYXJkLmMKQEAgLTc1LDcgKzc1LDcgQEAKIAkgKiBjb250cm9sbGVyLCBibG9jayByZWFkcyB0byB0aGUgY29uZmlnIHJvbSBhY2Nlc3NlcyB0aGUgaG9zdAogCSAqIG1lbW9yeSwgYnV0IHF1YWRsZXQgcmVhZCBhY2Nlc3MgdGhlIGhhcmR3YXJlIGJ1cyBpbmZvIGJsb2NrCiAJICogcmVnaXN0ZXJzLiAgVGhhdCdzIGp1c3QgY3JhY2ssIGJ1dCBpdCBtZWFucyB3ZSBzaG91bGQgbWFrZQotCSAqIHN1cmUgdGhlIGNvbnRlbnRzIG9mIGJ1cyBpbmZvIGJsb2NrIGluIGhvc3QgbWVtb3J5IG1hdGhjZXMKKwkgKiBzdXJlIHRoZSBjb250ZW50cyBvZiBidXMgaW5mbyBibG9jayBpbiBob3N0IG1lbW9yeSBtYXRjaGVzCiAJICogdGhlIHZlcnNpb24gc3RvcmVkIGluIHRoZSBPSENJIHJlZ2lzdGVycy4KIAkgKi8KIApAQCAtMTg5LDYgKzE4OSwxNyBAQAogCTYzLCA1LCA3LCA4LCAxMCwgMTMsIDE2LCAxOCwgMjEsIDI0LCAyNiwgMjksIDMyLCAzNSwgMzcsIDQwCiB9OwogCit2b2lkCitmd19zY2hlZHVsZV9ibV93b3JrKHN0cnVjdCBmd19jYXJkICpjYXJkLCB1bnNpZ25lZCBsb25nIGRlbGF5KQoreworCWludCBzY2hlZHVsZWQ7CisKKwlmd19jYXJkX2dldChjYXJkKTsKKwlzY2hlZHVsZWQgPSBzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmNhcmQtPndvcmssIGRlbGF5KTsKKwlpZiAoIXNjaGVkdWxlZCkKKwkJZndfY2FyZF9wdXQoY2FyZCk7Cit9CisKIHN0YXRpYyB2b2lkCiBmd19jYXJkX2JtX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewpAQCAtMTk4LDYgKzIwOSw4IEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgcm9vdF9pZCwgbmV3X3Jvb3RfaWQsIGlybV9pZCwgZ2FwX2NvdW50LCBnZW5lcmF0aW9uLCBncmFjZSwgcmNvZGU7CiAJYm9vbCBkb19yZXNldCA9IGZhbHNlOworCWJvb2wgcm9vdF9kZXZpY2VfaXNfcnVubmluZzsKKwlib29sIHJvb3RfZGV2aWNlX2lzX2NtYzsKIAlfX2JlMzIgbG9ja19kYXRhWzJdOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKQEAgLTIwNiwxNSArMjE5LDE2IEBACiAKIAlpZiAobG9jYWxfbm9kZSA9PSBOVUxMKSB7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKLQkJcmV0dXJuOworCQlnb3RvIG91dF9wdXRfY2FyZDsKIAl9CiAJZndfbm9kZV9nZXQobG9jYWxfbm9kZSk7CiAJZndfbm9kZV9nZXQocm9vdF9ub2RlKTsKIAogCWdlbmVyYXRpb24gPSBjYXJkLT5nZW5lcmF0aW9uOwogCXJvb3RfZGV2aWNlID0gcm9vdF9ub2RlLT5kYXRhOwotCWlmIChyb290X2RldmljZSkKLQkJZndfZGV2aWNlX2dldChyb290X2RldmljZSk7CisJcm9vdF9kZXZpY2VfaXNfcnVubmluZyA9IHJvb3RfZGV2aWNlICYmCisJCQlhdG9taWNfcmVhZCgmcm9vdF9kZXZpY2UtPnN0YXRlKSA9PSBGV19ERVZJQ0VfUlVOTklORzsKKwlyb290X2RldmljZV9pc19jbWMgPSByb290X2RldmljZSAmJiByb290X2RldmljZS0+Y21jOwogCXJvb3RfaWQgPSByb290X25vZGUtPm5vZGVfaWQ7CiAJZ3JhY2UgPSB0aW1lX2FmdGVyKGppZmZpZXMsIGNhcmQtPnJlc2V0X2ppZmZpZXMgKyBESVZfUk9VTkRfVVAoSFosIDEwKSk7CiAKQEAgLTI4MCw3ICsyOTQsNyBAQAogCQkgKiB0aGlzIHRhc2sgMTAwbXMgZnJvbSBub3cuCiAJCSAqLwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7Ci0JCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmY2FyZC0+d29yaywgRElWX1JPVU5EX1VQKEhaLCAxMCkpOworCQlmd19zY2hlZHVsZV9ibV93b3JrKGNhcmQsIERJVl9ST1VORF9VUChIWiwgMTApKTsKIAkJZ290byBvdXQ7CiAJfQogCkBAIC0yOTcsMTQgKzMxMSwxNCBAQAogCQkgKiBjb25maWcgcm9tLiAgSW4gZWl0aGVyIGNhc2UsIHBpY2sgYW5vdGhlciByb290LgogCQkgKi8KIAkJbmV3X3Jvb3RfaWQgPSBsb2NhbF9ub2RlLT5ub2RlX2lkOwotCX0gZWxzZSBpZiAoYXRvbWljX3JlYWQoJnJvb3RfZGV2aWNlLT5zdGF0ZSkgIT0gRldfREVWSUNFX1JVTk5JTkcpIHsKKwl9IGVsc2UgaWYgKCFyb290X2RldmljZV9pc19ydW5uaW5nKSB7CiAJCS8qCiAJCSAqIElmIHdlIGhhdmVuJ3QgcHJvYmVkIHRoaXMgZGV2aWNlIHlldCwgYmFpbCBvdXQgbm93CiAJCSAqIGFuZCBsZXQncyB0cnkgYWdhaW4gb25jZSB0aGF0J3MgZG9uZS4KIAkJICovCiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKIAkJZ290byBvdXQ7Ci0JfSBlbHNlIGlmIChyb290X2RldmljZS0+Y21jKSB7CisJfSBlbHNlIGlmIChyb290X2RldmljZV9pc19jbWMpIHsKIAkJLyoKIAkJICogRklYTUU6IEkgc3VwcG9zZSB3ZSBzaG91bGQgc2V0IHRoZSBjbXN0ciBiaXQgaW4gdGhlCiAJCSAqIFNUQVRFX0NMRUFSIHJlZ2lzdGVyIG9mIHRoaXMgbm9kZSwgYXMgZGVzY3JpYmVkIGluCkBAIC0zNTEsMTAgKzM2NSwxMCBAQAogCQlmd19jb3JlX2luaXRpYXRlX2J1c19yZXNldChjYXJkLCAxKTsKIAl9CiAgb3V0OgotCWlmIChyb290X2RldmljZSkKLQkJZndfZGV2aWNlX3B1dChyb290X2RldmljZSk7CiAJZndfbm9kZV9wdXQocm9vdF9ub2RlKTsKIAlmd19ub2RlX3B1dChsb2NhbF9ub2RlKTsKKyBvdXRfcHV0X2NhcmQ6CisJZndfY2FyZF9wdXQoY2FyZCk7CiB9CiAKIHN0YXRpYyB2b2lkCkBAIC01MTAsNyArNTI0LDYgQEAKIAlmd19jYXJkX3B1dChjYXJkKTsKIAl3YWl0X2Zvcl9jb21wbGV0aW9uKCZjYXJkLT5kb25lKTsKIAotCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmY2FyZC0+d29yayk7CiAJV0FSTl9PTighbGlzdF9lbXB0eSgmY2FyZC0+dHJhbnNhY3Rpb25fbGlzdCkpOwogCWRlbF90aW1lcl9zeW5jKCZjYXJkLT5mbHVzaF90aW1lcik7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2ZpcmV3aXJlL2Z3LWRldmljZS5jIGIvZHJpdmVycy9maXJld2lyZS9mdy1kZXZpY2UuYwppbmRleCA2YjliZTQyLi4yYWY1YThkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2ZpcmV3aXJlL2Z3LWRldmljZS5jCisrKyBiL2RyaXZlcnMvZmlyZXdpcmUvZnctZGV2aWNlLmMKQEAgLTE1OSw3ICsxNTksOCBAQAogCiAJLyoKIAkgKiBUYWtlIHRoZSBjYXJkIGxvY2sgc28gd2UgZG9uJ3Qgc2V0IHRoaXMgdG8gTlVMTCB3aGlsZSBhCi0JICogRldfTk9ERV9VUERBVEVEIGNhbGxiYWNrIGlzIGJlaW5nIGhhbmRsZWQuCisJICogRldfTk9ERV9VUERBVEVEIGNhbGxiYWNrIGlzIGJlaW5nIGhhbmRsZWQgb3Igd2hpbGUgdGhlCisJICogYnVzIG1hbmFnZXIgd29yayBsb29rcyBhdCB0aGlzIG5vZGUuCiAJICovCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKIAlkZXZpY2UtPm5vZGUtPmRhdGEgPSBOVUxMOwpAQCAtNjE3LDcgKzYxOCw3IEBACiAgKi8KIERFQ0xBUkVfUldTRU0oZndfZGV2aWNlX3J3c2VtKTsKIAotc3RhdGljIERFRklORV9JRFIoZndfZGV2aWNlX2lkcik7CitERUZJTkVfSURSKGZ3X2RldmljZV9pZHIpOwogaW50IGZ3X2NkZXZfbWFqb3I7CiAKIHN0cnVjdCBmd19kZXZpY2UgKmZ3X2RldmljZV9nZXRfYnlfZGV2dChkZXZfdCBkZXZ0KQpAQCAtNjg5LDE4ICs2OTAsMTkgQEAKIAkJCWZ3X25vdGlmeSgiZ2l2aW5nIHVwIG9uIGNvbmZpZyByb20gZm9yIG5vZGUgaWQgJXhcbiIsCiAJCQkJICBkZXZpY2UtPm5vZGVfaWQpOwogCQkJaWYgKGRldmljZS0+bm9kZSA9PSBkZXZpY2UtPmNhcmQtPnJvb3Rfbm9kZSkKLQkJCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmRldmljZS0+Y2FyZC0+d29yaywgMCk7CisJCQkJZndfc2NoZWR1bGVfYm1fd29yayhkZXZpY2UtPmNhcmQsIDApOwogCQkJZndfZGV2aWNlX3JlbGVhc2UoJmRldmljZS0+ZGV2aWNlKTsKIAkJfQogCQlyZXR1cm47CiAJfQogCi0JZXJyID0gLUVOT01FTTsKKwlkZXZpY2VfaW5pdGlhbGl6ZSgmZGV2aWNlLT5kZXZpY2UpOwogCiAJZndfZGV2aWNlX2dldChkZXZpY2UpOwogCWRvd25fd3JpdGUoJmZ3X2RldmljZV9yd3NlbSk7Ci0JaWYgKGlkcl9wcmVfZ2V0KCZmd19kZXZpY2VfaWRyLCBHRlBfS0VSTkVMKSkKLQkJZXJyID0gaWRyX2dldF9uZXcoJmZ3X2RldmljZV9pZHIsIGRldmljZSwgJm1pbm9yKTsKKwllcnIgPSBpZHJfcHJlX2dldCgmZndfZGV2aWNlX2lkciwgR0ZQX0tFUk5FTCkgPworCSAgICAgIGlkcl9nZXRfbmV3KCZmd19kZXZpY2VfaWRyLCBkZXZpY2UsICZtaW5vcikgOgorCSAgICAgIC1FTk9NRU07CiAJdXBfd3JpdGUoJmZ3X2RldmljZV9yd3NlbSk7CiAKIAlpZiAoZXJyIDwgMCkKQEAgLTc1OCw3ICs3NjAsNyBAQAogCSAqIHByZXR0eSBoYXJtbGVzcy4KIAkgKi8KIAlpZiAoZGV2aWNlLT5ub2RlID09IGRldmljZS0+Y2FyZC0+cm9vdF9ub2RlKQotCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmRldmljZS0+Y2FyZC0+d29yaywgMCk7CisJCWZ3X3NjaGVkdWxlX2JtX3dvcmsoZGV2aWNlLT5jYXJkLCAwKTsKIAogCXJldHVybjsKIApAQCAtODkyLDcgKzg5NCw3IEBACiAJZndfZGV2aWNlX3NodXRkb3duKHdvcmspOwogIG91dDoKIAlpZiAobm9kZV9pZCA9PSBjYXJkLT5yb290X25vZGUtPm5vZGVfaWQpCi0JCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmY2FyZC0+d29yaywgMCk7CisJCWZ3X3NjaGVkdWxlX2JtX3dvcmsoY2FyZCwgMCk7CiB9CiAKIHZvaWQgZndfbm9kZV9ldmVudChzdHJ1Y3QgZndfY2FyZCAqY2FyZCwgc3RydWN0IGZ3X25vZGUgKm5vZGUsIGludCBldmVudCkKQEAgLTkxMSwxMyArOTEzLDE0IEBACiAKIAkJLyoKIAkJICogRG8gbWluaW1hbCBpbnRpYWxpemF0aW9uIG9mIHRoZSBkZXZpY2UgaGVyZSwgdGhlCi0JCSAqIHJlc3Qgd2lsbCBoYXBwZW4gaW4gZndfZGV2aWNlX2luaXQoKS4gIFdlIG5lZWQgdGhlCi0JCSAqIGNhcmQgYW5kIG5vZGUgc28gd2UgY2FuIHJlYWQgdGhlIGNvbmZpZyByb20gYW5kIHdlCi0JCSAqIG5lZWQgdG8gZG8gZGV2aWNlX2luaXRpYWxpemUoKSBub3cgc28KLQkJICogZGV2aWNlX2Zvcl9lYWNoX2NoaWxkKCkgaW4gRldfTk9ERV9VUERBVEVEIGlzCi0JCSAqIGRvZXNuJ3QgZnJlYWsgb3V0LgorCQkgKiByZXN0IHdpbGwgaGFwcGVuIGluIGZ3X2RldmljZV9pbml0KCkuCisJCSAqCisJCSAqIEF0dGVudGlvbjogIEEgbG90IG9mIHRoaW5ncywgZXZlbiBmd19kZXZpY2VfZ2V0KCksCisJCSAqIGNhbm5vdCBiZSBkb25lIGJlZm9yZSBmd19kZXZpY2VfaW5pdCgpIGZpbmlzaGVkIQorCQkgKiBZb3UgY2FuIGJhc2ljYWxseSBqdXN0IGNoZWNrIGRldmljZS0+c3RhdGUgYW5kCisJCSAqIHNjaGVkdWxlIHdvcmsgdW50aWwgdGhlbiwgYnV0IG9ubHkgd2hpbGUgaG9sZGluZworCQkgKiBjYXJkLT5sb2NrLgogCQkgKi8KLQkJZGV2aWNlX2luaXRpYWxpemUoJmRldmljZS0+ZGV2aWNlKTsKIAkJYXRvbWljX3NldCgmZGV2aWNlLT5zdGF0ZSwgRldfREVWSUNFX0lOSVRJQUxJWklORyk7CiAJCWRldmljZS0+Y2FyZCA9IGZ3X2NhcmRfZ2V0KGNhcmQpOwogCQlkZXZpY2UtPm5vZGUgPSBmd19ub2RlX2dldChub2RlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZmlyZXdpcmUvZnctZGV2aWNlLmggYi9kcml2ZXJzL2ZpcmV3aXJlL2Z3LWRldmljZS5oCmluZGV4IDQyMzA1YmIuLmRmNTE3MzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZmlyZXdpcmUvZnctZGV2aWNlLmgKKysrIGIvZHJpdmVycy9maXJld2lyZS9mdy1kZXZpY2UuaApAQCAtMjEsNiArMjEsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvZnMuaD4KICNpbmNsdWRlIDxsaW51eC9jZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvaWRyLmg+CiAjaW5jbHVkZSA8bGludXgvcndzZW0uaD4KICNpbmNsdWRlIDxhc20vYXRvbWljLmg+CiAKQEAgLTk5LDYgKzEwMCw3IEBACiB2b2lkIGZ3X2RldmljZV9jZGV2X3JlbW92ZShzdHJ1Y3QgZndfZGV2aWNlICpkZXZpY2UpOwogCiBleHRlcm4gc3RydWN0IHJ3X3NlbWFwaG9yZSBmd19kZXZpY2VfcndzZW07CitleHRlcm4gc3RydWN0IGlkciBmd19kZXZpY2VfaWRyOwogZXh0ZXJuIGludCBmd19jZGV2X21ham9yOwogCiAvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9maXJld2lyZS9mdy1zYnAyLmMgYi9kcml2ZXJzL2ZpcmV3aXJlL2Z3LXNicDIuYwppbmRleCBlNTQ0MDNlLi5lODhkNTA2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2ZpcmV3aXJlL2Z3LXNicDIuYworKysgYi9kcml2ZXJzL2ZpcmV3aXJlL2Z3LXNicDIuYwpAQCAtNjcwLDE3ICs2NzAsNiBAQAogCQkJJmQsIHNpemVvZihkKSwgY29tcGxldGVfYWdlbnRfcmVzZXRfd3JpdGVfbm9fd2FpdCwgdCk7CiB9CiAKLXN0YXRpYyB2b2lkIHNicDJfc2V0X2dlbmVyYXRpb24oc3RydWN0IHNicDJfbG9naWNhbF91bml0ICpsdSwgaW50IGdlbmVyYXRpb24pCi17Ci0Jc3RydWN0IGZ3X2NhcmQgKmNhcmQgPSBmd19kZXZpY2UobHUtPnRndC0+dW5pdC0+ZGV2aWNlLnBhcmVudCktPmNhcmQ7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCS8qIHNlcmlhbGl6ZSB3aXRoIGNvbXBhcmlzb25zIG9mIGx1LT5nZW5lcmF0aW9uIGFuZCBjYXJkLT5nZW5lcmF0aW9uICovCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKLQlsdS0+Z2VuZXJhdGlvbiA9IGdlbmVyYXRpb247Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwotfQotCiBzdGF0aWMgaW5saW5lIHZvaWQgc2JwMl9hbGxvd19ibG9jayhzdHJ1Y3Qgc2JwMl9sb2dpY2FsX3VuaXQgKmx1KQogewogCS8qCkBAIC04ODQsNyArODczLDcgQEAKIAkJZ290byBvdXQ7CiAKIAlnZW5lcmF0aW9uICAgID0gZGV2aWNlLT5nZW5lcmF0aW9uOwotCXNtcF9ybWIoKTsgICAgLyogbm9kZV9pZCBtdXN0IG5vdCBiZSBvbGRlciB0aGFuIGdlbmVyYXRpb24gKi8KKwlzbXBfcm1iKCk7ICAgIC8qIG5vZGUgSURzIG11c3Qgbm90IGJlIG9sZGVyIHRoYW4gZ2VuZXJhdGlvbiAqLwogCW5vZGVfaWQgICAgICAgPSBkZXZpY2UtPm5vZGVfaWQ7CiAJbG9jYWxfbm9kZV9pZCA9IGRldmljZS0+Y2FyZC0+bm9kZV9pZDsKIApAQCAtOTA4LDcgKzg5Nyw4IEBACiAKIAl0Z3QtPm5vZGVfaWQJICA9IG5vZGVfaWQ7CiAJdGd0LT5hZGRyZXNzX2hpZ2ggPSBsb2NhbF9ub2RlX2lkIDw8IDE2OwotCXNicDJfc2V0X2dlbmVyYXRpb24obHUsIGdlbmVyYXRpb24pOworCXNtcF93bWIoKTsJICAvKiBub2RlIElEcyBtdXN0IG5vdCBiZSBvbGRlciB0aGFuIGdlbmVyYXRpb24gKi8KKwlsdS0+Z2VuZXJhdGlvbgkgID0gZ2VuZXJhdGlvbjsKIAogCWx1LT5jb21tYW5kX2Jsb2NrX2FnZW50X2FkZHJlc3MgPQogCQkoKHU2NCkoYmUzMl90b19jcHUocmVzcG9uc2UuY29tbWFuZF9ibG9ja19hZ2VudC5oaWdoKSAmIDB4ZmZmZikKQEAgLTEyMDEsNyArMTE5MSw3IEBACiAJCWdvdG8gb3V0OwogCiAJZ2VuZXJhdGlvbiAgICA9IGRldmljZS0+Z2VuZXJhdGlvbjsKLQlzbXBfcm1iKCk7ICAgIC8qIG5vZGVfaWQgbXVzdCBub3QgYmUgb2xkZXIgdGhhbiBnZW5lcmF0aW9uICovCisJc21wX3JtYigpOyAgICAvKiBub2RlIElEcyBtdXN0IG5vdCBiZSBvbGRlciB0aGFuIGdlbmVyYXRpb24gKi8KIAlub2RlX2lkICAgICAgID0gZGV2aWNlLT5ub2RlX2lkOwogCWxvY2FsX25vZGVfaWQgPSBkZXZpY2UtPmNhcmQtPm5vZGVfaWQ7CiAKQEAgLTEyMjgsNyArMTIxOCw4IEBACiAKIAl0Z3QtPm5vZGVfaWQgICAgICA9IG5vZGVfaWQ7CiAJdGd0LT5hZGRyZXNzX2hpZ2ggPSBsb2NhbF9ub2RlX2lkIDw8IDE2OwotCXNicDJfc2V0X2dlbmVyYXRpb24obHUsIGdlbmVyYXRpb24pOworCXNtcF93bWIoKTsJICAvKiBub2RlIElEcyBtdXN0IG5vdCBiZSBvbGRlciB0aGFuIGdlbmVyYXRpb24gKi8KKwlsdS0+Z2VuZXJhdGlvbgkgID0gZ2VuZXJhdGlvbjsKIAogCWZ3X25vdGlmeSgiJXM6IHJlY29ubmVjdGVkIHRvIExVTiAlMDR4ICglZCByZXRyaWVzKVxuIiwKIAkJICB0Z3QtPmJ1c19pZCwgbHUtPmx1biwgbHUtPnJldHJpZXMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9maXJld2lyZS9mdy10b3BvbG9neS5jIGIvZHJpdmVycy9maXJld2lyZS9mdy10b3BvbG9neS5jCmluZGV4IDVlMjA0NzEzLi5jOWJlNmU2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2ZpcmV3aXJlL2Z3LXRvcG9sb2d5LmMKKysrIGIvZHJpdmVycy9maXJld2lyZS9mdy10b3BvbG9neS5jCkBAIC0zNTUsNiArMzU1LDkgQEAKIHsKIAlmd19ub2RlX2V2ZW50KGNhcmQsIG5vZGUsIEZXX05PREVfREVTVFJPWUVEKTsKIAlmd19ub2RlX3B1dChub2RlKTsKKworCS8qIFRvcG9sb2d5IGhhcyBjaGFuZ2VkIC0gcmVzZXQgYnVzIG1hbmFnZXIgcmV0cnkgY291bnRlciAqLworCWNhcmQtPmJtX3JldHJpZXMgPSAwOwogfQogCiBzdGF0aWMgdm9pZApAQCAtMzc0LDYgKzM3Nyw5IEBACiAJfQogCiAJZndfbm9kZV9ldmVudChjYXJkLCBub2RlLCBGV19OT0RFX0NSRUFURUQpOworCisJLyogVG9wb2xvZ3kgaGFzIGNoYW5nZWQgLSByZXNldCBidXMgbWFuYWdlciByZXRyeSBjb3VudGVyICovCisJY2FyZC0+Ym1fcmV0cmllcyA9IDA7CiB9CiAKIHZvaWQgZndfZGVzdHJveV9ub2RlcyhzdHJ1Y3QgZndfY2FyZCAqY2FyZCkKQEAgLTUxNCwxNCArNTIwLDYgQEAKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLCBmbGFncyk7CiAKLQkvKgotCSAqIElmIHRoZSBuZXcgdG9wb2xvZ3kgaGFzIGEgZGlmZmVyZW50IHNlbGZfaWRfY291bnQgdGhlIHRvcG9sb2d5Ci0JICogY2hhbmdlZCwgZWl0aGVyIG5vZGVzIHdlcmUgYWRkZWQgb3IgcmVtb3ZlZC4gSW4gdGhhdCBjYXNlIHdlCi0JICogcmVzZXQgdGhlIElSTSByZXNldCBjb3VudGVyLgotCSAqLwotCWlmIChjYXJkLT5zZWxmX2lkX2NvdW50ICE9IHNlbGZfaWRfY291bnQpCi0JCWNhcmQtPmJtX3JldHJpZXMgPSAwOwotCiAJY2FyZC0+bm9kZV9pZCA9IG5vZGVfaWQ7CiAJLyoKIAkgKiBVcGRhdGUgbm9kZV9pZCBiZWZvcmUgZ2VuZXJhdGlvbiB0byBwcmV2ZW50IGFueWJvZHkgZnJvbSB1c2luZwpAQCAtNTMwLDcgKzUyOCw3IEBACiAJc21wX3dtYigpOwogCWNhcmQtPmdlbmVyYXRpb24gPSBnZW5lcmF0aW9uOwogCWNhcmQtPnJlc2V0X2ppZmZpZXMgPSBqaWZmaWVzOwotCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmY2FyZC0+d29yaywgMCk7CisJZndfc2NoZWR1bGVfYm1fd29yayhjYXJkLCAwKTsKIAogCWxvY2FsX25vZGUgPSBidWlsZF90cmVlKGNhcmQsIHNlbGZfaWRzLCBzZWxmX2lkX2NvdW50KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9maXJld2lyZS9mdy10cmFuc2FjdGlvbi5jIGIvZHJpdmVycy9maXJld2lyZS9mdy10cmFuc2FjdGlvbi5jCmluZGV4IDI4ODRmODcuLjY5OWFjMDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZmlyZXdpcmUvZnctdHJhbnNhY3Rpb24uYworKysgYi9kcml2ZXJzL2ZpcmV3aXJlL2Z3LXRyYW5zYWN0aW9uLmMKQEAgLTE5LDYgKzE5LDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgorI2luY2x1ZGUgPGxpbnV4L2lkci5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2tyZWYuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KQEAgLTk3MSw2ICs5NzIsNyBAQAogewogCXVucmVnaXN0ZXJfY2hyZGV2KGZ3X2NkZXZfbWFqb3IsICJmaXJld2lyZSIpOwogCWJ1c191bnJlZ2lzdGVyKCZmd19idXNfdHlwZSk7CisJaWRyX2Rlc3Ryb3koJmZ3X2RldmljZV9pZHIpOwogfQogCiBtb2R1bGVfaW5pdChmd19jb3JlX2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9maXJld2lyZS9mdy10cmFuc2FjdGlvbi5oIGIvZHJpdmVycy9maXJld2lyZS9mdy10cmFuc2FjdGlvbi5oCmluZGV4IDgzOTQ2NmYwLi5jOWFiMTJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2ZpcmV3aXJlL2Z3LXRyYW5zYWN0aW9uLmgKKysrIGIvZHJpdmVycy9maXJld2lyZS9mdy10cmFuc2FjdGlvbi5oCkBAIC0yMzcsMTQgKzIzNyw2IEBACiAJaW50IGxpbmtfc3BlZWQ7CiAJaW50IGNvbmZpZ19yb21fZ2VuZXJhdGlvbjsKIAotCS8qCi0JICogV2UgbmVlZCB0byBzdG9yZSB1cCB0byA0IHNlbGYgSUQgZm9yIGEgbWF4aW11bSBvZiA2MwotCSAqIGRldmljZXMgcGx1cyAzIHdvcmRzIGZvciB0aGUgdG9wb2xvZ3kgbWFwIGhlYWRlci4KLQkgKi8KLQlpbnQgc2VsZl9pZF9jb3VudDsKLQl1MzIgdG9wb2xvZ3lfbWFwWzI1MiArIDNdOwotCXUzMiBicm9hZGNhc3RfY2hhbm5lbDsKLQogCXNwaW5sb2NrX3QgbG9jazsgLyogVGFrZSB0aGlzIGxvY2sgd2hlbiBoYW5kbGluZyB0aGUgbGlzdHMgaW4KIAkJCSAgKiB0aGlzIHN0cnVjdC4gKi8KIAlzdHJ1Y3QgZndfbm9kZSAqbG9jYWxfbm9kZTsKQEAgLTI2Miw2ICsyNTQsOSBAQAogCXN0cnVjdCBkZWxheWVkX3dvcmsgd29yazsKIAlpbnQgYm1fcmV0cmllczsKIAlpbnQgYm1fZ2VuZXJhdGlvbjsKKworCXUzMiBicm9hZGNhc3RfY2hhbm5lbDsKKwl1MzIgdG9wb2xvZ3lfbWFwWyhDU1JfVE9QT0xPR1lfTUFQX0VORCAtIENTUl9UT1BPTE9HWV9NQVApIC8gNF07CiB9OwogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBmd19jYXJkICpmd19jYXJkX2dldChzdHJ1Y3QgZndfY2FyZCAqY2FyZCkKQEAgLTI3OCw2ICsyNzMsOCBAQAogCWtyZWZfcHV0KCZjYXJkLT5rcmVmLCBmd19jYXJkX3JlbGVhc2UpOwogfQogCitleHRlcm4gdm9pZCBmd19zY2hlZHVsZV9ibV93b3JrKHN0cnVjdCBmd19jYXJkICpjYXJkLCB1bnNpZ25lZCBsb25nIGRlbGF5KTsKKwogLyoKICAqIFRoZSBpc28gcGFja2V0IGZvcm1hdCBhbGxvd3MgZm9yIGFuIGltbWVkaWF0ZSBoZWFkZXIvcGF5bG9hZCBwYXJ0CiAgKiBzdG9yZWQgaW4gJ2hlYWRlcicgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIHBhY2tldCBpbmZvIHBsdXMgYW4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZmlybXdhcmUvZGNkYmFzLmMgYi9kcml2ZXJzL2Zpcm13YXJlL2RjZGJhcy5jCmluZGV4IDUwYTA3MWYuLjc3N2ZiYTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZmlybXdhcmUvZGNkYmFzLmMKKysrIGIvZHJpdmVycy9maXJtd2FyZS9kY2RiYXMuYwpAQCAtMjM4LDExICsyMzgsMTEgQEAKIH0KIAogLyoqCi0gKiBzbWlfcmVxdWVzdDogZ2VuZXJhdGUgU01JIHJlcXVlc3QKKyAqIGRjZGJhc19zbWlfcmVxdWVzdDogZ2VuZXJhdGUgU01JIHJlcXVlc3QKICAqCiAgKiBDYWxsZWQgd2l0aCBzbWlfZGF0YV9sb2NrLgogICovCi1zdGF0aWMgaW50IHNtaV9yZXF1ZXN0KHN0cnVjdCBzbWlfY21kICpzbWlfY21kKQoraW50IGRjZGJhc19zbWlfcmVxdWVzdChzdHJ1Y3Qgc21pX2NtZCAqc21pX2NtZCkKIHsKIAljcHVtYXNrX3Qgb2xkX21hc2s7CiAJaW50IHJldCA9IDA7CkBAIC0zMDksMTQgKzMwOSwxNCBAQAogCXN3aXRjaCAodmFsKSB7CiAJY2FzZSAyOgogCQkvKiBSYXcgU01JICovCi0JCXJldCA9IHNtaV9yZXF1ZXN0KHNtaV9jbWQpOworCQlyZXQgPSBkY2RiYXNfc21pX3JlcXVlc3Qoc21pX2NtZCk7CiAJCWlmICghcmV0KQogCQkJcmV0ID0gY291bnQ7CiAJCWJyZWFrOwogCWNhc2UgMToKIAkJLyogQ2FsbGluZyBJbnRlcmZhY2UgU01JICovCiAJCXNtaV9jbWQtPmVieCA9ICh1MzIpIHZpcnRfdG9fcGh5cyhzbWlfY21kLT5jb21tYW5kX2J1ZmZlcik7Ci0JCXJldCA9IHNtaV9yZXF1ZXN0KHNtaV9jbWQpOworCQlyZXQgPSBkY2RiYXNfc21pX3JlcXVlc3Qoc21pX2NtZCk7CiAJCWlmICghcmV0KQogCQkJcmV0ID0gY291bnQ7CiAJCWJyZWFrOwpAQCAtMzMzLDYgKzMzMyw3IEBACiAJbXV0ZXhfdW5sb2NrKCZzbWlfZGF0YV9sb2NrKTsKIAlyZXR1cm4gcmV0OwogfQorRVhQT1JUX1NZTUJPTChkY2RiYXNfc21pX3JlcXVlc3QpOwogCiAvKioKICAqIGhvc3RfY29udHJvbF9zbWk6IGdlbmVyYXRlIGhvc3QgY29udHJvbCBTTUkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZmlybXdhcmUvZGNkYmFzLmggYi9kcml2ZXJzL2Zpcm13YXJlL2RjZGJhcy5oCmluZGV4IDg3YmMzNDEuLmNhM2NiMGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZmlybXdhcmUvZGNkYmFzLmgKKysrIGIvZHJpdmVycy9maXJtd2FyZS9kY2RiYXMuaApAQCAtMTAxLDUgKzEwMSw3IEBACiAJfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgcGFyYW1ldGVyczsKIH0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwogCitpbnQgZGNkYmFzX3NtaV9yZXF1ZXN0KHN0cnVjdCBzbWlfY21kICpzbWlfY21kKTsKKwogI2VuZGlmIC8qIF9EQ0RCQVNfSF8gKi8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9maXJtd2FyZS9kZWxsX3JidS5jIGIvZHJpdmVycy9maXJtd2FyZS9kZWxsX3JidS5jCmluZGV4IDEzOTQ2ZWIuLmI0NzA0ZTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZmlybXdhcmUvZGVsbF9yYnUuYworKysgYi9kcml2ZXJzL2Zpcm13YXJlL2RlbGxfcmJ1LmMKQEAgLTU3Niw3ICs1NzYsNyBAQAogewogCWludCBzaXplID0gMDsKIAlpZiAoIXBvcykKLQkJc2l6ZSA9IHNwcmludGYoYnVmZmVyLCAiJXNcbiIsIGltYWdlX3R5cGUpOworCQlzaXplID0gc2NucHJpbnRmKGJ1ZmZlciwgY291bnQsICIlc1xuIiwgaW1hZ2VfdHlwZSk7CiAJcmV0dXJuIHNpemU7CiB9CiAKQEAgLTY0OCw3ICs2NDgsNyBAQAogCWludCBzaXplID0gMDsKIAlpZiAoIXBvcykgewogCQlzcGluX2xvY2soJnJidV9kYXRhLmxvY2spOwotCQlzaXplID0gc3ByaW50ZihidWZmZXIsICIlbHVcbiIsIHJidV9kYXRhLnBhY2tldHNpemUpOworCQlzaXplID0gc2NucHJpbnRmKGJ1ZmZlciwgY291bnQsICIlbHVcbiIsIHJidV9kYXRhLnBhY2tldHNpemUpOwogCQlzcGluX3VubG9jaygmcmJ1X2RhdGEubG9jayk7CiAJfQogCXJldHVybiBzaXplOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9maXJtd2FyZS9tZW1tYXAuYyBiL2RyaXZlcnMvZmlybXdhcmUvbWVtbWFwLmMKaW5kZXggM2JmOGVlMS4uMjYxYjlhYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9maXJtd2FyZS9tZW1tYXAuYworKysgYi9kcml2ZXJzL2Zpcm13YXJlL21lbW1hcC5jCkBAIC01Niw5ICs1Niw5IEBACiAJc3NpemVfdCAoKnNob3cpKHN0cnVjdCBmaXJtd2FyZV9tYXBfZW50cnkgKmVudHJ5LCBjaGFyICpidWYpOwogfTsKIAotc3RydWN0IG1lbW1hcF9hdHRyaWJ1dGUgbWVtbWFwX3N0YXJ0X2F0dHIgPSBfX0FUVFJfUk8oc3RhcnQpOwotc3RydWN0IG1lbW1hcF9hdHRyaWJ1dGUgbWVtbWFwX2VuZF9hdHRyICAgPSBfX0FUVFJfUk8oZW5kKTsKLXN0cnVjdCBtZW1tYXBfYXR0cmlidXRlIG1lbW1hcF90eXBlX2F0dHIgID0gX19BVFRSX1JPKHR5cGUpOworc3RhdGljIHN0cnVjdCBtZW1tYXBfYXR0cmlidXRlIG1lbW1hcF9zdGFydF9hdHRyID0gX19BVFRSX1JPKHN0YXJ0KTsKK3N0YXRpYyBzdHJ1Y3QgbWVtbWFwX2F0dHJpYnV0ZSBtZW1tYXBfZW5kX2F0dHIgICA9IF9fQVRUUl9STyhlbmQpOworc3RhdGljIHN0cnVjdCBtZW1tYXBfYXR0cmlidXRlIG1lbW1hcF90eXBlX2F0dHIgID0gX19BVFRSX1JPKHR5cGUpOwogCiAvKgogICogVGhlc2UgYXJlIGRlZmF1bHQgYXR0cmlidXRlcyB0aGF0IGFyZSBhZGRlZCBmb3IgZXZlcnkgbWVtbWFwIGVudHJ5LgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncGlvL21heDczMDEuYyBiL2RyaXZlcnMvZ3Bpby9tYXg3MzAxLmMKaW5kZXggOGIyNGQ3OC4uM2U3ZjRlMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncGlvL21heDczMDEuYworKysgYi9kcml2ZXJzL2dwaW8vbWF4NzMwMS5jCkBAIC0yMTcsOCArMjE3LDEwIEBACiAJaW50IGksIHJldDsKIAogCXBkYXRhID0gc3BpLT5kZXYucGxhdGZvcm1fZGF0YTsKLQlpZiAoIXBkYXRhIHx8ICFwZGF0YS0+YmFzZSkKLQkJcmV0dXJuIC1FTk9ERVY7CisJaWYgKCFwZGF0YSB8fCAhcGRhdGEtPmJhc2UpIHsKKwkJZGV2X2RiZygmc3BpLT5kZXYsICJpbmNvcnJlY3Qgb3IgbWlzc2luZyBwbGF0Zm9ybSBkYXRhXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQogCiAJLyoKIAkgKiBiaXRzX3Blcl93b3JkIGNhbm5vdCBiZSBjb25maWd1cmVkIGluIHBsYXRmb3JtIGRhdGEKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3Bpby9tYXg3MzJ4LmMgYi9kcml2ZXJzL2dwaW8vbWF4NzMyeC5jCmluZGV4IDU1YWU5YTQuLmY3ODY4MjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3Bpby9tYXg3MzJ4LmMKKysrIGIvZHJpdmVycy9ncGlvL21heDczMnguYwpAQCAtMjY3LDggKzI2NywxMCBAQAogCWludCByZXQsIG5yX3BvcnQ7CiAKIAlwZGF0YSA9IGNsaWVudC0+ZGV2LnBsYXRmb3JtX2RhdGE7Ci0JaWYgKHBkYXRhID09IE5VTEwpCi0JCXJldHVybiAtRU5PREVWOworCWlmIChwZGF0YSA9PSBOVUxMKSB7CisJCWRldl9kYmcoJmNsaWVudC0+ZGV2LCAibm8gcGxhdGZvcm0gZGF0YVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KIAogCWNoaXAgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbWF4NzMyeF9jaGlwKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKGNoaXAgPT0gTlVMTCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3Bpby9tY3AyM3MwOC5jIGIvZHJpdmVycy9ncGlvL21jcDIzczA4LmMKaW5kZXggODljMWQyMi4uZjZmYWUwZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncGlvL21jcDIzczA4LmMKKysrIGIvZHJpdmVycy9ncGlvL21jcDIzczA4LmMKQEAgLTMxMCw4ICszMTAsMTAgQEAKIAl1bnNpZ25lZAkJCWJhc2U7CiAKIAlwZGF0YSA9IHNwaS0+ZGV2LnBsYXRmb3JtX2RhdGE7Ci0JaWYgKCFwZGF0YSB8fCAhZ3Bpb19pc192YWxpZChwZGF0YS0+YmFzZSkpCi0JCXJldHVybiAtRU5PREVWOworCWlmICghcGRhdGEgfHwgIWdwaW9faXNfdmFsaWQocGRhdGEtPmJhc2UpKSB7CisJCWRldl9kYmcoJnNwaS0+ZGV2LCAiaW52YWxpZCBvciBtaXNzaW5nIHBsYXRmb3JtIGRhdGFcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CiAKIAlmb3IgKGFkZHIgPSAwOyBhZGRyIDwgNDsgYWRkcisrKSB7CiAJCWlmICghcGRhdGEtPmNoaXBbYWRkcl0uaXNfcHJlc2VudCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3Bpby9wY2E5NTN4LmMgYi9kcml2ZXJzL2dwaW8vcGNhOTUzeC5jCmluZGV4IDM3ZjM1Mzg4Li44ZGMwMTY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwaW8vcGNhOTUzeC5jCisrKyBiL2RyaXZlcnMvZ3Bpby9wY2E5NTN4LmMKQEAgLTIwMiw4ICsyMDIsMTAgQEAKIAlpbnQgcmV0OwogCiAJcGRhdGEgPSBjbGllbnQtPmRldi5wbGF0Zm9ybV9kYXRhOwotCWlmIChwZGF0YSA9PSBOVUxMKQotCQlyZXR1cm4gLUVOT0RFVjsKKwlpZiAocGRhdGEgPT0gTlVMTCkgeworCQlkZXZfZGJnKCZjbGllbnQtPmRldiwgIm5vIHBsYXRmb3JtIGRhdGFcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CiAKIAljaGlwID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHBjYTk1M3hfY2hpcCksIEdGUF9LRVJORUwpOwogCWlmIChjaGlwID09IE5VTEwpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwaW8vcGNmODU3eC5jIGIvZHJpdmVycy9ncGlvL3BjZjg1N3guYwppbmRleCA0YmMyMDcwLi45NTI1NzI0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwaW8vcGNmODU3eC5jCisrKyBiL2RyaXZlcnMvZ3Bpby9wY2Y4NTd4LmMKQEAgLTE4OCw4ICsxODgsMTAgQEAKIAlpbnQJCQkJc3RhdHVzOwogCiAJcGRhdGEgPSBjbGllbnQtPmRldi5wbGF0Zm9ybV9kYXRhOwotCWlmICghcGRhdGEpCi0JCXJldHVybiAtRU5PREVWOworCWlmICghcGRhdGEpIHsKKwkJZGV2X2RiZygmY2xpZW50LT5kZXYsICJubyBwbGF0Zm9ybSBkYXRhXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQogCiAJLyogQWxsb2NhdGUsIGluaXRpYWxpemUsIGFuZCByZWdpc3RlciB0aGlzIGdwaW9fY2hpcC4gKi8KIAlncGlvID0ga3phbGxvYyhzaXplb2YgKmdwaW8sIEdGUF9LRVJORUwpOwpAQCAtMjQ4LDggKzI1MCwxMCBAQAogCQllbHNlCiAJCQlzdGF0dXMgPSBpMmNfcmVhZF9sZTE2KGNsaWVudCk7CiAKLQl9IGVsc2UKLQkJc3RhdHVzID0gLUVOT0RFVjsKKwl9IGVsc2UgeworCQlkZXZfZGJnKCZjbGllbnQtPmRldiwgInVuc3VwcG9ydGVkIG51bWJlciBvZiBncGlvc1xuIik7CisJCXN0YXR1cyA9IC1FSU5WQUw7CisJfQogCiAJaWYgKHN0YXR1cyA8IDApCiAJCWdvdG8gZmFpbDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fY3J0Yy5jIGIvZHJpdmVycy9ncHUvZHJtL2RybV9jcnRjLmMKaW5kZXggNTNjODcyNS4uNWIyY2JiNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2RybV9jcnRjLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2RybV9jcnRjLmMKQEAgLTIxMCw3ICsyMTAsNyBAQAogCWludCByZXQ7CiAKIAlXQVJOKCFtdXRleF9pc19sb2NrZWQoJmRldi0+bW9kZV9jb25maWcubXV0ZXgpLAotCSAgICAgIiVzIGNhbGxlZCB3L28gbW9kZV9jb25maWcgbG9ja1xuIiwgX19GVU5DVElPTl9fKTsKKwkgICAgICIlcyBjYWxsZWQgdy9vIG1vZGVfY29uZmlnIGxvY2tcbiIsIF9fZnVuY19fKTsKIGFnYWluOgogCWlmIChpZHJfcHJlX2dldCgmZGV2LT5tb2RlX2NvbmZpZy5jcnRjX2lkciwgR0ZQX0tFUk5FTCkgPT0gMCkgewogCQlEUk1fRVJST1IoIlJhbiBvdXQgbWVtb3J5IGdldHRpbmcgYSBtb2RlIG51bWJlclxuIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vZHJtX2NydGNfaGVscGVyLmMgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX2NydGNfaGVscGVyLmMKaW5kZXggZDhhOTgyYi4uOTY0YzVlYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2RybV9jcnRjX2hlbHBlci5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fY3J0Y19oZWxwZXIuYwpAQCAtMzYsNyArMzYsNyBAQAogLyoKICAqIERldGFpbGVkIG1vZGUgaW5mbyBmb3IgODAweDYwMEA2MEh6CiAgKi8KLXN0YXRpYyBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSBzdGRfbW9kZVtdID0geworc3RhdGljIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlIHN0ZF9tb2Rlc1tdID0gewogCXsgRFJNX01PREUoIjgwMHg2MDAiLCBEUk1fTU9ERV9UWVBFX0RFRkFVTFQsIDQwMDAwLCA4MDAsIDg0MCwKIAkJICAgOTY4LCAxMDU2LCAwLCA2MDAsIDYwMSwgNjA1LCA2MjgsIDAsCiAJCSAgIERSTV9NT0RFX0ZMQUdfUEhTWU5DIHwgRFJNX01PREVfRkxBR19QVlNZTkMpIH0sCkBAIC02MCwxNSArNjAsMTggQEAKICAqIGNoYW5nZXMgaGF2ZSBvY2N1cnJlZC4KICAqCiAgKiBGSVhNRTogdGFrZSBpbnRvIGFjY291bnQgbW9uaXRvciBsaW1pdHMKKyAqCisgKiBSRVRVUk5TOgorICogTnVtYmVyIG9mIG1vZGVzIGZvdW5kIG9uIEBjb25uZWN0b3IuCiAgKi8KLXZvaWQgZHJtX2hlbHBlcl9wcm9iZV9zaW5nbGVfY29ubmVjdG9yX21vZGVzKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IsCi0JCQkJCSAgICAgdWludDMyX3QgbWF4WCwgdWludDMyX3QgbWF4WSkKK2ludCBkcm1faGVscGVyX3Byb2JlX3NpbmdsZV9jb25uZWN0b3JfbW9kZXMoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvciwKKwkJCQkJICAgIHVpbnQzMl90IG1heFgsIHVpbnQzMl90IG1heFkpCiB7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNvbm5lY3Rvci0+ZGV2OwogCXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlLCAqdDsKIAlzdHJ1Y3QgZHJtX2Nvbm5lY3Rvcl9oZWxwZXJfZnVuY3MgKmNvbm5lY3Rvcl9mdW5jcyA9CiAJCWNvbm5lY3Rvci0+aGVscGVyX3ByaXZhdGU7Ci0JaW50IHJldDsKKwlpbnQgY291bnQgPSAwOwogCiAJRFJNX0RFQlVHKCIlc1xuIiwgZHJtX2dldF9jb25uZWN0b3JfbmFtZShjb25uZWN0b3IpKTsKIAkvKiBzZXQgYWxsIG1vZGVzIHRvIHRoZSB1bnZlcmlmaWVkIHN0YXRlICovCkBAIC04MSwxNCArODQsMTQgQEAKIAkJRFJNX0RFQlVHKCIlcyBpcyBkaXNjb25uZWN0ZWRcbiIsCiAJCQkgIGRybV9nZXRfY29ubmVjdG9yX25hbWUoY29ubmVjdG9yKSk7CiAJCS8qIFRPRE8gc2V0IEVESUQgdG8gTlVMTCAqLwotCQlyZXR1cm47CisJCXJldHVybiAwOwogCX0KIAotCXJldCA9ICgqY29ubmVjdG9yX2Z1bmNzLT5nZXRfbW9kZXMpKGNvbm5lY3Rvcik7CisJY291bnQgPSAoKmNvbm5lY3Rvcl9mdW5jcy0+Z2V0X21vZGVzKShjb25uZWN0b3IpOworCWlmICghY291bnQpCisJCXJldHVybiAwOwogCi0JaWYgKHJldCkgewotCQlkcm1fbW9kZV9jb25uZWN0b3JfbGlzdF91cGRhdGUoY29ubmVjdG9yKTsKLQl9CisJZHJtX21vZGVfY29ubmVjdG9yX2xpc3RfdXBkYXRlKGNvbm5lY3Rvcik7CiAKIAlpZiAobWF4WCAmJiBtYXhZKQogCQlkcm1fbW9kZV92YWxpZGF0ZV9zaXplKGRldiwgJmNvbm5lY3Rvci0+bW9kZXMsIG1heFgsCkBAIC0xMDIsMjUgKzEwNSw4IEBACiAKIAlkcm1fbW9kZV9wcnVuZV9pbnZhbGlkKGRldiwgJmNvbm5lY3Rvci0+bW9kZXMsIHRydWUpOwogCi0JaWYgKGxpc3RfZW1wdHkoJmNvbm5lY3Rvci0+bW9kZXMpKSB7Ci0JCXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICpzdGRtb2RlOwotCi0JCURSTV9ERUJVRygiTm8gdmFsaWQgbW9kZXMgb24gJXNcbiIsCi0JCQkgIGRybV9nZXRfY29ubmVjdG9yX25hbWUoY29ubmVjdG9yKSk7Ci0KLQkJLyogU2hvdWxkIHdlIGRvIHRoaXMgaGVyZSA/Pz8KLQkJICogV2hlbiBubyB2YWxpZCBFRElEIG1vZGVzIGFyZSBhdmFpbGFibGUgd2UgZW5kIHVwCi0JCSAqIGhlcmUgYW5kIGJhaWxlZCBpbiB0aGUgcGFzdCwgbm93IHdlIGFkZCBhIHN0YW5kYXJkCi0JCSAqIDY0MHg0ODBANjBIeiBtb2RlIGFuZCBjYXJyeSBvbi4KLQkJICovCi0JCXN0ZG1vZGUgPSBkcm1fbW9kZV9kdXBsaWNhdGUoZGV2LCAmc3RkX21vZGVbMF0pOwotCQlkcm1fbW9kZV9wcm9iZWRfYWRkKGNvbm5lY3Rvciwgc3RkbW9kZSk7Ci0JCWRybV9tb2RlX2xpc3RfY29uY2F0KCZjb25uZWN0b3ItPnByb2JlZF9tb2RlcywKLQkJCQkgICAgICZjb25uZWN0b3ItPm1vZGVzKTsKLQotCQlEUk1fREVCVUcoIkFkZGluZyBzdGFuZGFyZCA2NDB4NDgwIEAgNjBIeiB0byAlc1xuIiwKLQkJCSAgZHJtX2dldF9jb25uZWN0b3JfbmFtZShjb25uZWN0b3IpKTsKLQl9CisJaWYgKGxpc3RfZW1wdHkoJmNvbm5lY3Rvci0+bW9kZXMpKQorCQlyZXR1cm4gMDsKIAogCWRybV9tb2RlX3NvcnQoJmNvbm5lY3Rvci0+bW9kZXMpOwogCkBAIC0xMzEsMjAgKzExNyw1OCBAQAogCQlkcm1fbW9kZV9zZXRfY3J0Y2luZm8obW9kZSwgQ1JUQ19JTlRFUkxBQ0VfSEFMVkVfVik7CiAJCWRybV9tb2RlX2RlYnVnX3ByaW50bW9kZWxpbmUobW9kZSk7CiAJfQorCisJcmV0dXJuIGNvdW50OwogfQogRVhQT1JUX1NZTUJPTChkcm1faGVscGVyX3Byb2JlX3NpbmdsZV9jb25uZWN0b3JfbW9kZXMpOwogCi12b2lkIGRybV9oZWxwZXJfcHJvYmVfY29ubmVjdG9yX21vZGVzKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVpbnQzMl90IG1heFgsCitpbnQgZHJtX2hlbHBlcl9wcm9iZV9jb25uZWN0b3JfbW9kZXMoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdWludDMyX3QgbWF4WCwKIAkJCQkgICAgICB1aW50MzJfdCBtYXhZKQogewogCXN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3I7CisJaW50IGNvdW50ID0gMDsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnkoY29ubmVjdG9yLCAmZGV2LT5tb2RlX2NvbmZpZy5jb25uZWN0b3JfbGlzdCwgaGVhZCkgewotCQlkcm1faGVscGVyX3Byb2JlX3NpbmdsZV9jb25uZWN0b3JfbW9kZXMoY29ubmVjdG9yLCBtYXhYLCBtYXhZKTsKKwkJY291bnQgKz0gZHJtX2hlbHBlcl9wcm9iZV9zaW5nbGVfY29ubmVjdG9yX21vZGVzKGNvbm5lY3RvciwKKwkJCQkJCQkJIG1heFgsIG1heFkpOwogCX0KKworCXJldHVybiBjb3VudDsKIH0KIEVYUE9SVF9TWU1CT0woZHJtX2hlbHBlcl9wcm9iZV9jb25uZWN0b3JfbW9kZXMpOwogCitzdGF0aWMgdm9pZCBkcm1faGVscGVyX2FkZF9zdGRfbW9kZXMoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKKwkJCQkgICAgIHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IpCit7CisJc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUsICp0OworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoc3RkX21vZGVzKTsgaSsrKSB7CisJCXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICpzdGRtb2RlOworCisJCS8qCisJCSAqIFdoZW4gbm8gdmFsaWQgRURJRCBtb2RlcyBhcmUgYXZhaWxhYmxlIHdlIGVuZCB1cAorCQkgKiBoZXJlIGFuZCBiYWlsZWQgaW4gdGhlIHBhc3QsIG5vdyB3ZSBhZGQgc29tZSBzdGFuZGFyZAorCQkgKiBtb2RlcyBhbmQgbW92ZSBvbi4KKwkJICovCisJCXN0ZG1vZGUgPSBkcm1fbW9kZV9kdXBsaWNhdGUoZGV2LCAmc3RkX21vZGVzW2ldKTsKKwkJZHJtX21vZGVfcHJvYmVkX2FkZChjb25uZWN0b3IsIHN0ZG1vZGUpOworCQlkcm1fbW9kZV9saXN0X2NvbmNhdCgmY29ubmVjdG9yLT5wcm9iZWRfbW9kZXMsCisJCQkJICAgICAmY29ubmVjdG9yLT5tb2Rlcyk7CisKKwkJRFJNX0RFQlVHKCJBZGRpbmcgbW9kZSAlcyB0byAlc1xuIiwgc3RkbW9kZS0+bmFtZSwKKwkJCSAgZHJtX2dldF9jb25uZWN0b3JfbmFtZShjb25uZWN0b3IpKTsKKwl9CisJZHJtX21vZGVfc29ydCgmY29ubmVjdG9yLT5tb2Rlcyk7CisKKwlEUk1fREVCVUcoIkFkZGVkIHN0ZCBtb2RlcyBvbiAlc1xuIiwgZHJtX2dldF9jb25uZWN0b3JfbmFtZShjb25uZWN0b3IpKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobW9kZSwgdCwgJmNvbm5lY3Rvci0+bW9kZXMsIGhlYWQpIHsKKwkJbW9kZS0+dnJlZnJlc2ggPSBkcm1fbW9kZV92cmVmcmVzaChtb2RlKTsKKworCQlkcm1fbW9kZV9zZXRfY3J0Y2luZm8obW9kZSwgQ1JUQ19JTlRFUkxBQ0VfSEFMVkVfVik7CisJCWRybV9tb2RlX2RlYnVnX3ByaW50bW9kZWxpbmUobW9kZSk7CisJfQorfQogCiAvKioKICAqIGRybV9oZWxwZXJfY3J0Y19pbl91c2UgLSBjaGVjayBpZiBhIGdpdmVuIENSVEMgaXMgaW4gYSBtb2RlX2NvbmZpZwpAQCAtMjM3LDYgKzI2MSw4IEBACiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNvbm5lY3RvciwgJmRldi0+bW9kZV9jb25maWcuY29ubmVjdG9yX2xpc3QsIGhlYWQpIHsKIAkJZW5hYmxlZFtpXSA9IGRybV9jb25uZWN0b3JfZW5hYmxlZChjb25uZWN0b3IsIHRydWUpOworCQlEUk1fREVCVUcoImNvbm5lY3RvciAlZCBlbmFibGVkPyAlc1xuIiwgY29ubmVjdG9yLT5iYXNlLmlkLAorCQkJICBlbmFibGVkW2ldID8gInllcyIgOiAibm8iKTsKIAkJYW55X2VuYWJsZWQgfD0gZW5hYmxlZFtpXTsKIAkJaSsrOwogCX0KQEAgLTI2NSwxMSArMjkxLDE3IEBACiAJCQljb250aW51ZTsKIAkJfQogCisJCURSTV9ERUJVRygibG9va2luZyBmb3IgcHJlZmVycmVkIG1vZGUgb24gY29ubmVjdG9yICVkXG4iLAorCQkJICBjb25uZWN0b3ItPmJhc2UuaWQpOworCiAJCW1vZGVzW2ldID0gZHJtX2hhc19wcmVmZXJyZWRfbW9kZShjb25uZWN0b3IsIHdpZHRoLCBoZWlnaHQpOwotCQlpZiAoIW1vZGVzW2ldKSB7CisJCS8qIE5vIHByZWZlcnJlZCBtb2RlcywgcGljayBvbmUgb2ZmIHRoZSBsaXN0ICovCisJCWlmICghbW9kZXNbaV0gJiYgIWxpc3RfZW1wdHkoJmNvbm5lY3Rvci0+bW9kZXMpKSB7CiAJCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KG1vZGVzW2ldLCAmY29ubmVjdG9yLT5tb2RlcywgaGVhZCkKIAkJCQlicmVhazsKIAkJfQorCQlEUk1fREVCVUcoImZvdW5kIG1vZGUgJXNcbiIsIG1vZGVzW2ldID8gbW9kZXNbaV0tPm5hbWUgOgorCQkJICAibm9uZSIpOwogCQlpKys7CiAJfQogCXJldHVybiB0cnVlOwpAQCAtMzY5LDYgKzQwMSw4IEBACiAJaW50IHdpZHRoLCBoZWlnaHQ7CiAJaW50IGksIHJldDsKIAorCURSTV9ERUJVRygiXG4iKTsKKwogCXdpZHRoID0gZGV2LT5tb2RlX2NvbmZpZy5tYXhfd2lkdGg7CiAJaGVpZ2h0ID0gZGV2LT5tb2RlX2NvbmZpZy5tYXhfaGVpZ2h0OwogCkBAIC0zOTAsNiArNDI0LDggQEAKIAlpZiAoIXJldCkKIAkJRFJNX0VSUk9SKCJVbmFibGUgdG8gZmluZCBpbml0aWFsIG1vZGVzXG4iKTsKIAorCURSTV9ERUJVRygicGlja2luZyBDUlRDcyBmb3IgJWR4JWQgY29uZmlnXG4iLCB3aWR0aCwgaGVpZ2h0KTsKKwogCWRybV9waWNrX2NydGNzKGRldiwgY3J0Y3MsIG1vZGVzLCAwLCB3aWR0aCwgaGVpZ2h0KTsKIAogCWkgPSAwOwpAQCAtNDAzLDYgKzQzOSw4IEBACiAJCX0KIAogCQlpZiAobW9kZSAmJiBjcnRjKSB7CisJCQlEUk1fREVCVUcoImRlc2lyZWQgbW9kZSAlcyBzZXQgb24gY3J0YyAlZFxuIiwKKwkJCQkgIG1vZGUtPm5hbWUsIGNydGMtPmJhc2UuaWQpOwogCQkJY3J0Yy0+ZGVzaXJlZF9tb2RlID0gbW9kZTsKIAkJCWNvbm5lY3Rvci0+ZW5jb2Rlci0+Y3J0YyA9IGNydGM7CiAJCX0gZWxzZQpAQCAtNDQyLDYgKzQ4MCw3IEBACiAJaW50IHNhdmVkX3gsIHNhdmVkX3k7CiAJc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyOwogCWJvb2wgcmV0ID0gdHJ1ZTsKKwlib29sIGRlcHRoX2NoYW5nZWQsIGJwcF9jaGFuZ2VkOwogCiAJYWRqdXN0ZWRfbW9kZSA9IGRybV9tb2RlX2R1cGxpY2F0ZShkZXYsIG1vZGUpOwogCkBAIC00NTAsNiArNDg5LDE1IEBACiAJaWYgKCFjcnRjLT5lbmFibGVkKQogCQlyZXR1cm4gdHJ1ZTsKIAorCWlmIChvbGRfZmIgJiYgY3J0Yy0+ZmIpIHsKKwkJZGVwdGhfY2hhbmdlZCA9IChvbGRfZmItPmRlcHRoICE9IGNydGMtPmZiLT5kZXB0aCk7CisJCWJwcF9jaGFuZ2VkID0gKG9sZF9mYi0+Yml0c19wZXJfcGl4ZWwgIT0KKwkJCSAgICAgICBjcnRjLT5mYi0+Yml0c19wZXJfcGl4ZWwpOworCX0gZWxzZSB7CisJCWRlcHRoX2NoYW5nZWQgPSB0cnVlOworCQlicHBfY2hhbmdlZCA9IHRydWU7CisJfQorCiAJc2F2ZWRfbW9kZSA9IGNydGMtPm1vZGU7CiAJc2F2ZWRfeCA9IGNydGMtPng7CiAJc2F2ZWRfeSA9IGNydGMtPnk7CkBAIC00NjIsNyArNTEwLDggQEAKIAljcnRjLT55ID0geTsKIAogCWlmIChkcm1fbW9kZV9lcXVhbCgmc2F2ZWRfbW9kZSwgJmNydGMtPm1vZGUpKSB7Ci0JCWlmIChzYXZlZF94ICE9IGNydGMtPnggfHwgc2F2ZWRfeSAhPSBjcnRjLT55KSB7CisJCWlmIChzYXZlZF94ICE9IGNydGMtPnggfHwgc2F2ZWRfeSAhPSBjcnRjLT55IHx8CisJCSAgICBkZXB0aF9jaGFuZ2VkIHx8IGJwcF9jaGFuZ2VkKSB7CiAJCQljcnRjX2Z1bmNzLT5tb2RlX3NldF9iYXNlKGNydGMsIGNydGMtPngsIGNydGMtPnksCiAJCQkJCQkgIG9sZF9mYik7CiAJCQlnb3RvIGRvbmU7CkBAIC01NjgsOCArNjE3LDggQEAKIAlzdHJ1Y3QgZHJtX2VuY29kZXIgKipzYXZlX2VuY29kZXJzLCAqbmV3X2VuY29kZXI7CiAJc3RydWN0IGRybV9mcmFtZWJ1ZmZlciAqb2xkX2ZiOwogCWJvb2wgc2F2ZV9lbmFibGVkOwotCWJvb2wgY2hhbmdlZCA9IGZhbHNlOwotCWJvb2wgZmxpcF9vcl9tb3ZlID0gZmFsc2U7CisJYm9vbCBtb2RlX2NoYW5nZWQgPSBmYWxzZTsKKwlib29sIGZiX2NoYW5nZWQgPSBmYWxzZTsKIAlzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yOwogCWludCBjb3VudCA9IDAsIHJvLCBmYWlsID0gMDsKIAlzdHJ1Y3QgZHJtX2NydGNfaGVscGVyX2Z1bmNzICpjcnRjX2Z1bmNzOwpAQCAtNTk3LDcgKzY0NiwxMCBAQAogCS8qIHNhdmUgcHJldmlvdXMgY29uZmlnICovCiAJc2F2ZV9lbmFibGVkID0gc2V0LT5jcnRjLT5lbmFibGVkOwogCi0JLyogdGhpcyBpcyBtZWFudCB0byBiZSBudW1fY29ubmVjdG9yIG5vdCBudW1fY3J0YyAqLworCS8qCisJICogV2UgZG8gbW9kZV9jb25maWcubnVtX2Nvbm5lY3RvcnMgaGVyZSBzaW5jZSB3ZSdsbCBsb29rIGF0IHRoZQorCSAqIENSVEMgYW5kIGVuY29kZXIgYXNzb2NpYXRlZCB3aXRoIGVhY2ggY29ubmVjdG9yIGxhdGVyLgorCSAqLwogCXNhdmVfY3J0Y3MgPSBremFsbG9jKGRldi0+bW9kZV9jb25maWcubnVtX2Nvbm5lY3RvciAqCiAJCQkgICAgIHNpemVvZihzdHJ1Y3QgZHJtX2NydGMgKiksIEdGUF9LRVJORUwpOwogCWlmICghc2F2ZV9jcnRjcykKQEAgLTYxMywyMSArNjY1LDI1IEBACiAJLyogV2Ugc2hvdWxkIGJlIGFibGUgdG8gY2hlY2sgaGVyZSBpZiB0aGUgZmIgaGFzIHRoZSBzYW1lIHByb3BlcnRpZXMKIAkgKiBhbmQgdGhlbiBqdXN0IGZsaXBfb3JfbW92ZSBpdCAqLwogCWlmIChzZXQtPmNydGMtPmZiICE9IHNldC0+ZmIpIHsKLQkJLyogaWYgd2UgaGF2ZSBubyBmYiB0aGVuIGl0cyBhIGNoYW5nZSBub3QgYSBmbGlwICovCisJCS8qIElmIHdlIGhhdmUgbm8gZmIgdGhlbiB0cmVhdCBpdCBhcyBhIGZ1bGwgbW9kZSBzZXQgKi8KIAkJaWYgKHNldC0+Y3J0Yy0+ZmIgPT0gTlVMTCkKLQkJCWNoYW5nZWQgPSB0cnVlOworCQkJbW9kZV9jaGFuZ2VkID0gdHJ1ZTsKKwkJZWxzZSBpZiAoKHNldC0+ZmItPmJpdHNfcGVyX3BpeGVsICE9CisJCQkgc2V0LT5jcnRjLT5mYi0+Yml0c19wZXJfcGl4ZWwpIHx8CisJCQkgc2V0LT5mYi0+ZGVwdGggIT0gc2V0LT5jcnRjLT5mYi0+ZGVwdGgpCisJCQlmYl9jaGFuZ2VkID0gdHJ1ZTsKIAkJZWxzZQotCQkJZmxpcF9vcl9tb3ZlID0gdHJ1ZTsKKwkJCWZiX2NoYW5nZWQgPSB0cnVlOwogCX0KIAogCWlmIChzZXQtPnggIT0gc2V0LT5jcnRjLT54IHx8IHNldC0+eSAhPSBzZXQtPmNydGMtPnkpCi0JCWZsaXBfb3JfbW92ZSA9IHRydWU7CisJCWZiX2NoYW5nZWQgPSB0cnVlOwogCiAJaWYgKHNldC0+bW9kZSAmJiAhZHJtX21vZGVfZXF1YWwoc2V0LT5tb2RlLCAmc2V0LT5jcnRjLT5tb2RlKSkgewogCQlEUk1fREVCVUcoIm1vZGVzIGFyZSBkaWZmZXJlbnRcbiIpOwogCQlkcm1fbW9kZV9kZWJ1Z19wcmludG1vZGVsaW5lKCZzZXQtPmNydGMtPm1vZGUpOwogCQlkcm1fbW9kZV9kZWJ1Z19wcmludG1vZGVsaW5lKHNldC0+bW9kZSk7Ci0JCWNoYW5nZWQgPSB0cnVlOworCQltb2RlX2NoYW5nZWQgPSB0cnVlOwogCX0KIAogCS8qIGEpIHRyYXZlcnNlIHBhc3NlZCBpbiBjb25uZWN0b3IgbGlzdCBhbmQgZ2V0IGVuY29kZXJzIGZvciB0aGVtICovCkBAIC02NTAsNyArNzA2LDcgQEAKIAkJfQogCiAJCWlmIChuZXdfZW5jb2RlciAhPSBjb25uZWN0b3ItPmVuY29kZXIpIHsKLQkJCWNoYW5nZWQgPSB0cnVlOworCQkJbW9kZV9jaGFuZ2VkID0gdHJ1ZTsKIAkJCWNvbm5lY3Rvci0+ZW5jb2RlciA9IG5ld19lbmNvZGVyOwogCQl9CiAJfQpAQCAtNjc3LDE2ICs3MzMsMTYgQEAKIAkJCQluZXdfY3J0YyA9IHNldC0+Y3J0YzsKIAkJfQogCQlpZiAobmV3X2NydGMgIT0gY29ubmVjdG9yLT5lbmNvZGVyLT5jcnRjKSB7Ci0JCQljaGFuZ2VkID0gdHJ1ZTsKKwkJCW1vZGVfY2hhbmdlZCA9IHRydWU7CiAJCQljb25uZWN0b3ItPmVuY29kZXItPmNydGMgPSBuZXdfY3J0YzsKIAkJfQogCX0KIAogCS8qIG1vZGVfc2V0X2Jhc2UgaXMgbm90IGEgcmVxdWlyZWQgZnVuY3Rpb24gKi8KLQlpZiAoZmxpcF9vcl9tb3ZlICYmICFjcnRjX2Z1bmNzLT5tb2RlX3NldF9iYXNlKQotCQljaGFuZ2VkID0gdHJ1ZTsKKwlpZiAoZmJfY2hhbmdlZCAmJiAhY3J0Y19mdW5jcy0+bW9kZV9zZXRfYmFzZSkKKwkJbW9kZV9jaGFuZ2VkID0gdHJ1ZTsKIAotCWlmIChjaGFuZ2VkKSB7CisJaWYgKG1vZGVfY2hhbmdlZCkgewogCQlvbGRfZmIgPSBzZXQtPmNydGMtPmZiOwogCQlzZXQtPmNydGMtPmZiID0gc2V0LT5mYjsKIAkJc2V0LT5jcnRjLT5lbmFibGVkID0gKHNldC0+bW9kZSAhPSBOVUxMKTsKQEAgLTcwNSw3ICs3NjEsNyBAQAogCQkJc2V0LT5jcnRjLT5kZXNpcmVkX21vZGUgPSBzZXQtPm1vZGU7CiAJCX0KIAkJZHJtX2hlbHBlcl9kaXNhYmxlX3VudXNlZF9mdW5jdGlvbnMoZGV2KTsKLQl9IGVsc2UgaWYgKGZsaXBfb3JfbW92ZSkgeworCX0gZWxzZSBpZiAoZmJfY2hhbmdlZCkgewogCQlvbGRfZmIgPSBzZXQtPmNydGMtPmZiOwogCQlpZiAoc2V0LT5jcnRjLT5mYiAhPSBzZXQtPmZiKQogCQkJc2V0LT5jcnRjLT5mYiA9IHNldC0+ZmI7CkBAIC03NjQsMTAgKzgyMCwzMSBAQAogICovCiBib29sIGRybV9oZWxwZXJfaW5pdGlhbF9jb25maWcoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgYm9vbCBjYW5fZ3JvdykKIHsKLQlpbnQgcmV0ID0gZmFsc2U7CisJc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcjsKKwlpbnQgY291bnQgPSAwOwogCi0JZHJtX2hlbHBlcl9wbHVnZ2VkX2V2ZW50KGRldik7Ci0JcmV0dXJuIHJldDsKKwljb3VudCA9IGRybV9oZWxwZXJfcHJvYmVfY29ubmVjdG9yX21vZGVzKGRldiwKKwkJCQkJCSBkZXYtPm1vZGVfY29uZmlnLm1heF93aWR0aCwKKwkJCQkJCSBkZXYtPm1vZGVfY29uZmlnLm1heF9oZWlnaHQpOworCisJLyoKKwkgKiBOb25lIG9mIHRoZSBhdmFpbGFibGUgY29ubmVjdG9ycyBoYWQgYW55IG1vZGVzLCBzbyBhZGQgc29tZQorCSAqIGFuZCB0cnkgdG8gbGlnaHQgdGhlbSB1cCBhbnl3YXkKKwkgKi8KKwlpZiAoIWNvdW50KSB7CisJCURSTV9FUlJPUigiY29ubmVjdG9ycyBoYXZlIG5vIG1vZGVzLCB1c2luZyBzdGFuZGFyZCBtb2Rlc1xuIik7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkoY29ubmVjdG9yLAorCQkJCSAgICAmZGV2LT5tb2RlX2NvbmZpZy5jb25uZWN0b3JfbGlzdCwKKwkJCQkgICAgaGVhZCkKKwkJCWRybV9oZWxwZXJfYWRkX3N0ZF9tb2RlcyhkZXYsIGNvbm5lY3Rvcik7CisJfQorCisJZHJtX3NldHVwX2NydGNzKGRldik7CisKKwkvKiBhbGVydCB0aGUgZHJpdmVyIGZiIGxheWVyICovCisJZGV2LT5tb2RlX2NvbmZpZy5mdW5jcy0+ZmJfY2hhbmdlZChkZXYpOworCisJcmV0dXJuIDA7CiB9CiBFWFBPUlRfU1lNQk9MKGRybV9oZWxwZXJfaW5pdGlhbF9jb25maWcpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vZHJtX2lycS5jIGIvZHJpdmVycy9ncHUvZHJtL2RybV9pcnEuYwppbmRleCA3MjRlNTA1Li40NzdjYWExIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vZHJtX2lycS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1faXJxLmMKQEAgLTI2Nyw3ICsyNjcsOCBAQAogICovCiBpbnQgZHJtX2lycV91bmluc3RhbGwoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7Ci0JaW50IGlycV9lbmFibGVkOworCXVuc2lnbmVkIGxvbmcgaXJxZmxhZ3M7CisJaW50IGlycV9lbmFibGVkLCBpOwogCiAJaWYgKCFkcm1fY29yZV9jaGVja19mZWF0dXJlKGRldiwgRFJJVkVSX0hBVkVfSVJRKSkKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0yNzcsNiArMjc4LDE2IEBACiAJZGV2LT5pcnFfZW5hYmxlZCA9IDA7CiAJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CiAKKwkvKgorCSAqIFdha2UgdXAgYW55IHdhaXRlcnMgc28gdGhleSBkb24ndCBoYW5nLgorCSAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPnZibF9sb2NrLCBpcnFmbGFncyk7CisJZm9yIChpID0gMDsgaSA8IGRldi0+bnVtX2NydGNzOyBpKyspIHsKKwkJRFJNX1dBS0VVUCgmZGV2LT52YmxfcXVldWVbaV0pOworCQlkZXYtPnZibGFua19lbmFibGVkW2ldID0gMDsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT52YmxfbG9jaywgaXJxZmxhZ3MpOworCiAJaWYgKCFpcnFfZW5hYmxlZCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKQEAgLTY1Miw4ICs2NjMsOSBAQAogCQkJICB2Ymx3YWl0LT5yZXF1ZXN0LnNlcXVlbmNlLCBjcnRjKTsKIAkJZGV2LT5sYXN0X3ZibGFua193YWl0W2NydGNdID0gdmJsd2FpdC0+cmVxdWVzdC5zZXF1ZW5jZTsKIAkJRFJNX1dBSVRfT04ocmV0LCBkZXYtPnZibF9xdWV1ZVtjcnRjXSwgMyAqIERSTV9IWiwKLQkJCSAgICAoKGRybV92YmxhbmtfY291bnQoZGV2LCBjcnRjKQotCQkJICAgICAgLSB2Ymx3YWl0LT5yZXF1ZXN0LnNlcXVlbmNlKSA8PSAoMSA8PCAyMykpKTsKKwkJCSAgICAoKChkcm1fdmJsYW5rX2NvdW50KGRldiwgY3J0YykgLQorCQkJICAgICAgIHZibHdhaXQtPnJlcXVlc3Quc2VxdWVuY2UpIDw9ICgxIDw8IDIzKSkgfHwKKwkJCSAgICAgIWRldi0+aXJxX2VuYWJsZWQpKTsKIAogCQlpZiAocmV0ICE9IC1FSU5UUikgewogCQkJc3RydWN0IHRpbWV2YWwgbm93OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9kbWEuYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZG1hLmMKaW5kZXggNjJhNGJmNy4uYmJhZGYxYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9kbWEuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2RtYS5jCkBAIC0xNzcsNiArMTc3LDE0IEBACiAJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJc3RydWN0IGRybV9pOTE1X21hc3Rlcl9wcml2YXRlICptYXN0ZXJfcHJpdiA9IGRldi0+cHJpbWFyeS0+bWFzdGVyLT5kcml2ZXJfcHJpdjsKIAorCW1hc3Rlcl9wcml2LT5zYXJlYSA9IGRybV9nZXRzYXJlYShkZXYpOworCWlmIChtYXN0ZXJfcHJpdi0+c2FyZWEpIHsKKwkJbWFzdGVyX3ByaXYtPnNhcmVhX3ByaXYgPSAoZHJtX2k5MTVfc2FyZWFfdCAqKQorCQkJKCh1OCAqKW1hc3Rlcl9wcml2LT5zYXJlYS0+aGFuZGxlICsgaW5pdC0+c2FyZWFfcHJpdl9vZmZzZXQpOworCX0gZWxzZSB7CisJCURSTV9ERUJVRygic2FyZWEgbm90IGZvdW5kIGFzc3VtaW5nIERSSTIgdXNlcnNwYWNlXG4iKTsKKwl9CisKIAlpZiAoaW5pdC0+cmluZ19zaXplICE9IDApIHsKIAkJaWYgKGRldl9wcml2LT5yaW5nLnJpbmdfb2JqICE9IE5VTEwpIHsKIAkJCWk5MTVfZG1hX2NsZWFudXAoZGV2KTsKQEAgLTExNTIsNiArMTE2MCw4IEBACiAJaWYgKGRybV9jb3JlX2NoZWNrX2ZlYXR1cmUoZGV2LCBEUklWRVJfTU9ERVNFVCkpIHsKIAkJaW50ZWxfbW9kZXNldF9jbGVhbnVwKGRldik7CiAKKwkJaTkxNV9nZW1fZnJlZV9hbGxfcGh5c19vYmplY3QoZGV2KTsKKwogCQltdXRleF9sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CiAJCWk5MTVfZ2VtX2NsZWFudXBfcmluZ2J1ZmZlcihkZXYpOwogCQltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZHJ2LmggYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2Rydi5oCmluZGV4IDU2M2RlMTguLmUxMzUxODI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2Rydi5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZHJ2LmgKQEAgLTcyLDYgKzcyLDE4IEBACiAjZGVmaW5lIFdBVENIX0lOQUNUSVZFCTAKICNkZWZpbmUgV0FUQ0hfUFdSSVRFCTAKIAorI2RlZmluZSBJOTE1X0dFTV9QSFlTX0NVUlNPUl8wIDEKKyNkZWZpbmUgSTkxNV9HRU1fUEhZU19DVVJTT1JfMSAyCisjZGVmaW5lIEk5MTVfR0VNX1BIWVNfT1ZFUkxBWV9SRUdTIDMKKyNkZWZpbmUgSTkxNV9NQVhfUEhZU19PQkpFQ1QgKEk5MTVfR0VNX1BIWVNfT1ZFUkxBWV9SRUdTKQorCitzdHJ1Y3QgZHJtX2k5MTVfZ2VtX3BoeXNfb2JqZWN0IHsKKwlpbnQgaWQ7CisJc3RydWN0IHBhZ2UgKipwYWdlX2xpc3Q7CisJZHJtX2RtYV9oYW5kbGVfdCAqaGFuZGxlOworCXN0cnVjdCBkcm1fZ2VtX29iamVjdCAqY3VyX29iajsKK307CisKIHR5cGVkZWYgc3RydWN0IF9kcm1faTkxNV9yaW5nX2J1ZmZlciB7CiAJaW50IHRhaWxfbWFzazsKIAl1bnNpZ25lZCBsb25nIFNpemU7CkBAIC0zNTgsNiArMzcwLDkgQEAKIAkJdWludDMyX3QgYml0XzZfc3dpenpsZV94OwogCQkvKiogQml0IDYgc3dpenpsaW5nIHJlcXVpcmVkIGZvciBZIHRpbGluZyAqLwogCQl1aW50MzJfdCBiaXRfNl9zd2l6emxlX3k7CisKKwkJLyogc3RvcmFnZSBmb3IgcGh5c2ljYWwgb2JqZWN0cyAqLworCQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX3BoeXNfb2JqZWN0ICpwaHlzX29ianNbSTkxNV9NQVhfUEhZU19PQkpFQ1RdOwogCX0gbW07CiB9IGRybV9pOTE1X3ByaXZhdGVfdDsKIApAQCAtNDM2LDYgKzQ1MSw5IEBACiAJLyoqIFVzZXIgc3BhY2UgcGluIGNvdW50IGFuZCBmaWxwIG93bmluZyB0aGUgcGluICovCiAJdWludDMyX3QgdXNlcl9waW5fY291bnQ7CiAJc3RydWN0IGRybV9maWxlICpwaW5fZmlscDsKKworCS8qKiBmb3IgcGh5IGFsbG9jYXRlZCBvYmplY3RzICovCisJc3RydWN0IGRybV9pOTE1X2dlbV9waHlzX29iamVjdCAqcGh5c19vYmo7CiB9OwogCiAvKioKQEAgLTU5OCw2ICs2MTYsMTEgQEAKIGludCBpOTE1X2dlbV9mYXVsdChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgc3RydWN0IHZtX2ZhdWx0ICp2bWYpOwogaW50IGk5MTVfZ2VtX29iamVjdF9zZXRfdG9fZ3R0X2RvbWFpbihzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iaiwKIAkJCQkgICAgICBpbnQgd3JpdGUpOworaW50IGk5MTVfZ2VtX2F0dGFjaF9waHlzX29iamVjdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAorCQkJCXN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqLCBpbnQgaWQpOwordm9pZCBpOTE1X2dlbV9kZXRhY2hfcGh5c19vYmplY3Qoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKKwkJCQkgc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmopOwordm9pZCBpOTE1X2dlbV9mcmVlX2FsbF9waHlzX29iamVjdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKIAogLyogaTkxNV9nZW1fdGlsaW5nLmMgKi8KIHZvaWQgaTkxNV9nZW1fZGV0ZWN0X2JpdF82X3N3aXp6bGUoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbS5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW0uYwppbmRleCAxNGFmYzIzLi45NjMxNmZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtLmMKQEAgLTU1LDYgKzU1LDkgQEAKIHN0YXRpYyB2b2lkIGk5MTVfZ2VtX29iamVjdF9nZXRfZmVuY2VfcmVnKHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqKTsKIHN0YXRpYyB2b2lkIGk5MTVfZ2VtX2NsZWFyX2ZlbmNlX3JlZyhzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iaik7CiBzdGF0aWMgaW50IGk5MTVfZ2VtX2V2aWN0X3NvbWV0aGluZyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgaTkxNV9nZW1fcGh5c19wd3JpdGUoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmosCisJCQkJc3RydWN0IGRybV9pOTE1X2dlbV9wd3JpdGUgKmFyZ3MsCisJCQkJc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYpOwogCiBpbnQgaTkxNV9nZW1fZG9faW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1bnNpZ25lZCBsb25nIHN0YXJ0LAogCQkgICAgIHVuc2lnbmVkIGxvbmcgZW5kKQpAQCAtMzg2LDggKzM4OSwxMCBAQAogCSAqIHByZWFkL3B3cml0ZSBjdXJyZW50bHkgYXJlIHJlYWRpbmcgYW5kIHdyaXRpbmcgZnJvbSB0aGUgQ1BVCiAJICogcGVyc3BlY3RpdmUsIHJlcXVpcmluZyBtYW51YWwgZGV0aWxpbmcgYnkgdGhlIGNsaWVudC4KIAkgKi8KLQlpZiAob2JqX3ByaXYtPnRpbGluZ19tb2RlID09IEk5MTVfVElMSU5HX05PTkUgJiYKLQkgICAgZGV2LT5ndHRfdG90YWwgIT0gMCkKKwlpZiAob2JqX3ByaXYtPnBoeXNfb2JqKQorCQlyZXQgPSBpOTE1X2dlbV9waHlzX3B3cml0ZShkZXYsIG9iaiwgYXJncywgZmlsZV9wcml2KTsKKwllbHNlIGlmIChvYmpfcHJpdi0+dGlsaW5nX21vZGUgPT0gSTkxNV9USUxJTkdfTk9ORSAmJgorCQkgZGV2LT5ndHRfdG90YWwgIT0gMCkKIAkJcmV0ID0gaTkxNV9nZW1fZ3R0X3B3cml0ZShkZXYsIG9iaiwgYXJncywgZmlsZV9wcml2KTsKIAllbHNlCiAJCXJldCA9IGk5MTVfZ2VtX3NobWVtX3B3cml0ZShkZXYsIG9iaiwgYXJncywgZmlsZV9wcml2KTsKQEAgLTE0NDUsNyArMTQ1MCw3IEBACiAKIAlpZiAoKG9ial9wcml2LT5ndHRfb2Zmc2V0ICYgfkk5MTVfRkVOQ0VfU1RBUlRfTUFTSykgfHwKIAkgICAgKG9ial9wcml2LT5ndHRfb2Zmc2V0ICYgKG9iai0+c2l6ZSAtIDEpKSkgewotCQlXQVJOKDEsICIlczogb2JqZWN0IG5vdCAxTSBvciBzaXplIGFsaWduZWRcbiIsIF9fRlVOQ1RJT05fXyk7CisJCVdBUk4oMSwgIiVzOiBvYmplY3Qgbm90IDFNIG9yIHNpemUgYWxpZ25lZFxuIiwgX19mdW5jX18pOwogCQlyZXR1cm47CiAJfQogCkBAIC0xNDc4LDcgKzE0ODMsNyBAQAogCiAJaWYgKChvYmpfcHJpdi0+Z3R0X29mZnNldCAmIH5JOTE1X0ZFTkNFX1NUQVJUX01BU0spIHx8CiAJICAgIChvYmpfcHJpdi0+Z3R0X29mZnNldCAmIChvYmotPnNpemUgLSAxKSkpIHsKLQkJV0FSTigxLCAiJXM6IG9iamVjdCBub3QgMU0gb3Igc2l6ZSBhbGlnbmVkXG4iLCBfX0ZVTkNUSU9OX18pOworCQlXQVJOKDEsICIlczogb2JqZWN0IG5vdCAxTSBvciBzaXplIGFsaWduZWRcbiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtMjg1OCw2ICsyODYzLDkgQEAKIAl3aGlsZSAob2JqX3ByaXYtPnBpbl9jb3VudCA+IDApCiAJCWk5MTVfZ2VtX29iamVjdF91bnBpbihvYmopOwogCisJaWYgKG9ial9wcml2LT5waHlzX29iaikKKwkJaTkxNV9nZW1fZGV0YWNoX3BoeXNfb2JqZWN0KGRldiwgb2JqKTsKKwogCWk5MTVfZ2VtX29iamVjdF91bmJpbmQob2JqKTsKIAogCWxpc3QgPSAmb2JqLT5tYXBfbGlzdDsKQEAgLTMyOTMsMyArMzMwMSwxODAgQEAKIAogCWk5MTVfZ2VtX2RldGVjdF9iaXRfNl9zd2l6emxlKGRldik7CiB9CisKKy8qCisgKiBDcmVhdGUgYSBwaHlzaWNhbGx5IGNvbnRpZ3VvdXMgbWVtb3J5IG9iamVjdCBmb3IgdGhpcyBvYmplY3QKKyAqIGUuZy4gZm9yIGN1cnNvciArIG92ZXJsYXkgcmVncworICovCitpbnQgaTkxNV9nZW1faW5pdF9waHlzX29iamVjdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAorCQkJICAgICAgaW50IGlkLCBpbnQgc2l6ZSkKK3sKKwlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX3BoeXNfb2JqZWN0ICpwaHlzX29iajsKKwlpbnQgcmV0OworCisJaWYgKGRldl9wcml2LT5tbS5waHlzX29ianNbaWQgLSAxXSB8fCAhc2l6ZSkKKwkJcmV0dXJuIDA7CisKKwlwaHlzX29iaiA9IGRybV9jYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBkcm1faTkxNV9nZW1fcGh5c19vYmplY3QpLCBEUk1fTUVNX0RSSVZFUik7CisJaWYgKCFwaHlzX29iaikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlwaHlzX29iai0+aWQgPSBpZDsKKworCXBoeXNfb2JqLT5oYW5kbGUgPSBkcm1fcGNpX2FsbG9jKGRldiwgc2l6ZSwgMCwgMHhmZmZmZmZmZik7CisJaWYgKCFwaHlzX29iai0+aGFuZGxlKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8ga2ZyZWVfb2JqOworCX0KKyNpZmRlZiBDT05GSUdfWDg2CisJc2V0X21lbW9yeV93YygodW5zaWduZWQgbG9uZylwaHlzX29iai0+aGFuZGxlLT52YWRkciwgcGh5c19vYmotPmhhbmRsZS0+c2l6ZSAvIFBBR0VfU0laRSk7CisjZW5kaWYKKworCWRldl9wcml2LT5tbS5waHlzX29ianNbaWQgLSAxXSA9IHBoeXNfb2JqOworCisJcmV0dXJuIDA7CitrZnJlZV9vYmo6CisJZHJtX2ZyZWUocGh5c19vYmosIHNpemVvZihzdHJ1Y3QgZHJtX2k5MTVfZ2VtX3BoeXNfb2JqZWN0KSwgRFJNX01FTV9EUklWRVIpOworCXJldHVybiByZXQ7Cit9CisKK3ZvaWQgaTkxNV9nZW1fZnJlZV9waHlzX29iamVjdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgaWQpCit7CisJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IGRybV9pOTE1X2dlbV9waHlzX29iamVjdCAqcGh5c19vYmo7CisKKwlpZiAoIWRldl9wcml2LT5tbS5waHlzX29ianNbaWQgLSAxXSkKKwkJcmV0dXJuOworCisJcGh5c19vYmogPSBkZXZfcHJpdi0+bW0ucGh5c19vYmpzW2lkIC0gMV07CisJaWYgKHBoeXNfb2JqLT5jdXJfb2JqKSB7CisJCWk5MTVfZ2VtX2RldGFjaF9waHlzX29iamVjdChkZXYsIHBoeXNfb2JqLT5jdXJfb2JqKTsKKwl9CisKKyNpZmRlZiBDT05GSUdfWDg2CisJc2V0X21lbW9yeV93YigodW5zaWduZWQgbG9uZylwaHlzX29iai0+aGFuZGxlLT52YWRkciwgcGh5c19vYmotPmhhbmRsZS0+c2l6ZSAvIFBBR0VfU0laRSk7CisjZW5kaWYKKwlkcm1fcGNpX2ZyZWUoZGV2LCBwaHlzX29iai0+aGFuZGxlKTsKKwlrZnJlZShwaHlzX29iaik7CisJZGV2X3ByaXYtPm1tLnBoeXNfb2Jqc1tpZCAtIDFdID0gTlVMTDsKK30KKwordm9pZCBpOTE1X2dlbV9mcmVlX2FsbF9waHlzX29iamVjdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEk5MTVfTUFYX1BIWVNfT0JKRUNUOyBpKyspCisJCWk5MTVfZ2VtX2ZyZWVfcGh5c19vYmplY3QoZGV2LCBpKTsKK30KKwordm9pZCBpOTE1X2dlbV9kZXRhY2hfcGh5c19vYmplY3Qoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKKwkJCQkgc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmopCit7CisJc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9ial9wcml2OworCWludCBpOworCWludCByZXQ7CisJaW50IHBhZ2VfY291bnQ7CisKKwlvYmpfcHJpdiA9IG9iai0+ZHJpdmVyX3ByaXZhdGU7CisJaWYgKCFvYmpfcHJpdi0+cGh5c19vYmopCisJCXJldHVybjsKKworCXJldCA9IGk5MTVfZ2VtX29iamVjdF9nZXRfcGFnZV9saXN0KG9iaik7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisKKwlwYWdlX2NvdW50ID0gb2JqLT5zaXplIC8gUEFHRV9TSVpFOworCisJZm9yIChpID0gMDsgaSA8IHBhZ2VfY291bnQ7IGkrKykgeworCQljaGFyICpkc3QgPSBrbWFwX2F0b21pYyhvYmpfcHJpdi0+cGFnZV9saXN0W2ldLCBLTV9VU0VSMCk7CisJCWNoYXIgKnNyYyA9IG9ial9wcml2LT5waHlzX29iai0+aGFuZGxlLT52YWRkciArIChpICogUEFHRV9TSVpFKTsKKworCQltZW1jcHkoZHN0LCBzcmMsIFBBR0VfU0laRSk7CisJCWt1bm1hcF9hdG9taWMoZHN0LCBLTV9VU0VSMCk7CisJfQorCWRybV9jbGZsdXNoX3BhZ2VzKG9ial9wcml2LT5wYWdlX2xpc3QsIHBhZ2VfY291bnQpOworCWRybV9hZ3BfY2hpcHNldF9mbHVzaChkZXYpOworb3V0OgorCW9ial9wcml2LT5waHlzX29iai0+Y3VyX29iaiA9IE5VTEw7CisJb2JqX3ByaXYtPnBoeXNfb2JqID0gTlVMTDsKK30KKworaW50CitpOTE1X2dlbV9hdHRhY2hfcGh5c19vYmplY3Qoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKKwkJCSAgICBzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iaiwgaW50IGlkKQoreworCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmpfcHJpdjsKKwlpbnQgcmV0ID0gMDsKKwlpbnQgcGFnZV9jb3VudDsKKwlpbnQgaTsKKworCWlmIChpZCA+IEk5MTVfTUFYX1BIWVNfT0JKRUNUKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW9ial9wcml2ID0gb2JqLT5kcml2ZXJfcHJpdmF0ZTsKKworCWlmIChvYmpfcHJpdi0+cGh5c19vYmopIHsKKwkJaWYgKG9ial9wcml2LT5waHlzX29iai0+aWQgPT0gaWQpCisJCQlyZXR1cm4gMDsKKwkJaTkxNV9nZW1fZGV0YWNoX3BoeXNfb2JqZWN0KGRldiwgb2JqKTsKKwl9CisKKworCS8qIGNyZWF0ZSBhIG5ldyBvYmplY3QgKi8KKwlpZiAoIWRldl9wcml2LT5tbS5waHlzX29ianNbaWQgLSAxXSkgeworCQlyZXQgPSBpOTE1X2dlbV9pbml0X3BoeXNfb2JqZWN0KGRldiwgaWQsCisJCQkJCQlvYmotPnNpemUpOworCQlpZiAocmV0KSB7CisJCQlEUk1fRVJST1IoImZhaWxlZCB0byBpbml0IHBoeXMgb2JqZWN0ICVkIHNpemU6ICVkXG4iLCBpZCwgb2JqLT5zaXplKTsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCisJLyogYmluZCB0byB0aGUgb2JqZWN0ICovCisJb2JqX3ByaXYtPnBoeXNfb2JqID0gZGV2X3ByaXYtPm1tLnBoeXNfb2Jqc1tpZCAtIDFdOworCW9ial9wcml2LT5waHlzX29iai0+Y3VyX29iaiA9IG9iajsKKworCXJldCA9IGk5MTVfZ2VtX29iamVjdF9nZXRfcGFnZV9saXN0KG9iaik7CisJaWYgKHJldCkgeworCQlEUk1fRVJST1IoImZhaWxlZCB0byBnZXQgcGFnZSBsaXN0XG4iKTsKKwkJZ290byBvdXQ7CisJfQorCisJcGFnZV9jb3VudCA9IG9iai0+c2l6ZSAvIFBBR0VfU0laRTsKKworCWZvciAoaSA9IDA7IGkgPCBwYWdlX2NvdW50OyBpKyspIHsKKwkJY2hhciAqc3JjID0ga21hcF9hdG9taWMob2JqX3ByaXYtPnBhZ2VfbGlzdFtpXSwgS01fVVNFUjApOworCQljaGFyICpkc3QgPSBvYmpfcHJpdi0+cGh5c19vYmotPmhhbmRsZS0+dmFkZHIgKyAoaSAqIFBBR0VfU0laRSk7CisKKwkJbWVtY3B5KGRzdCwgc3JjLCBQQUdFX1NJWkUpOworCQlrdW5tYXBfYXRvbWljKHNyYywgS01fVVNFUjApOworCX0KKworCXJldHVybiAwOworb3V0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQKK2k5MTVfZ2VtX3BoeXNfcHdyaXRlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqLAorCQkgICAgIHN0cnVjdCBkcm1faTkxNV9nZW1fcHdyaXRlICphcmdzLAorCQkgICAgIHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2KQoreworCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmpfcHJpdiA9IG9iai0+ZHJpdmVyX3ByaXZhdGU7CisJdm9pZCAqb2JqX2FkZHI7CisJaW50IHJldDsKKwljaGFyIF9fdXNlciAqdXNlcl9kYXRhOworCisJdXNlcl9kYXRhID0gKGNoYXIgX191c2VyICopICh1aW50cHRyX3QpIGFyZ3MtPmRhdGFfcHRyOworCW9ial9hZGRyID0gb2JqX3ByaXYtPnBoeXNfb2JqLT5oYW5kbGUtPnZhZGRyICsgYXJncy0+b2Zmc2V0OworCisJRFJNX0VSUk9SKCJvYmpfYWRkciAlcCwgJWxsZFxuIiwgb2JqX2FkZHIsIGFyZ3MtPnNpemUpOworCXJldCA9IGNvcHlfZnJvbV91c2VyKG9ial9hZGRyLCB1c2VyX2RhdGEsIGFyZ3MtPnNpemUpOworCWlmIChyZXQpCisJCXJldHVybiAtRUZBVUxUOworCisJZHJtX2FncF9jaGlwc2V0X2ZsdXNoKGRldik7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2lycS5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9pcnEuYwppbmRleCAwY2FkYWZiLi42MjkwMjE5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2lycS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfaXJxLmMKQEAgLTQxMSw2ICs0MTEsMTIgQEAKIHsKIAlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gKGRybV9pOTE1X3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOwogCXVuc2lnbmVkIGxvbmcgaXJxZmxhZ3M7CisJaW50IHBpcGVjb25mX3JlZyA9IChwaXBlID09IDApID8gUElQRUFDT05GIDogUElQRUJDT05GOworCXUzMiBwaXBlY29uZjsKKworCXBpcGVjb25mID0gSTkxNV9SRUFEKHBpcGVjb25mX3JlZyk7CisJaWYgKCEocGlwZWNvbmYgJiBQSVBFQUNPTkZfRU5BQkxFKSkKKwkJcmV0dXJuIC1FSU5WQUw7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2X3ByaXYtPnVzZXJfaXJxX2xvY2ssIGlycWZsYWdzKTsKIAlpZiAoSVNfSTk2NUcoZGV2KSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2Rpc3BsYXkuYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2Rpc3BsYXkuYwppbmRleCA4Y2NiOWMzLi4zMWMzNzMyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9kaXNwbGF5LmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZGlzcGxheS5jCkBAIC00MDEsNiArNDAxLDggQEAKIAlJOTE1X1dSSVRFKGRzcHN0cmlkZSwgY3J0Yy0+ZmItPnBpdGNoKTsKIAogCWRzcGNudHIgPSBJOTE1X1JFQUQoZHNwY250cl9yZWcpOworCS8qIE1hc2sgb3V0IHBpeGVsIGZvcm1hdCBiaXRzIGluIGNhc2Ugd2UgY2hhbmdlIGl0ICovCisJZHNwY250ciAmPSB+RElTUFBMQU5FX1BJWEZPUk1BVF9NQVNLOwogCXN3aXRjaCAoY3J0Yy0+ZmItPmJpdHNfcGVyX3BpeGVsKSB7CiAJY2FzZSA4OgogCQlkc3BjbnRyIHw9IERJU1BQTEFORV84QlBQOwpAQCAtMTAxNCwyMSArMTAxNiwyNSBAQAogCiAJaWYgKGJvLT5zaXplIDwgd2lkdGggKiBoZWlnaHQgKiA0KSB7CiAJCURSTV9FUlJPUigiYnVmZmVyIGlzIHRvIHNtYWxsXG4iKTsKLQkJZHJtX2dlbV9vYmplY3RfdW5yZWZlcmVuY2UoYm8pOwotCQlyZXR1cm4gLUVOT01FTTsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBmYWlsOwogCX0KIAotCWlmIChkZXZfcHJpdi0+Y3Vyc29yX25lZWRzX3BoeXNpY2FsKSB7Ci0JCWFkZHIgPSBkZXYtPmFncC0+YmFzZSArIG9ial9wcml2LT5ndHRfb2Zmc2V0OwotCX0gZWxzZSB7CisJLyogd2Ugb25seSBuZWVkIHRvIHBpbiBpbnNpZGUgR1RUIGlmIGN1cnNvciBpcyBub24tcGh5ICovCisJaWYgKCFkZXZfcHJpdi0+Y3Vyc29yX25lZWRzX3BoeXNpY2FsKSB7CisJCXJldCA9IGk5MTVfZ2VtX29iamVjdF9waW4oYm8sIFBBR0VfU0laRSk7CisJCWlmIChyZXQpIHsKKwkJCURSTV9FUlJPUigiZmFpbGVkIHRvIHBpbiBjdXJzb3IgYm9cbiIpOworCQkJZ290byBmYWlsOworCQl9CiAJCWFkZHIgPSBvYmpfcHJpdi0+Z3R0X29mZnNldDsKLQl9Ci0KLQlyZXQgPSBpOTE1X2dlbV9vYmplY3RfcGluKGJvLCBQQUdFX1NJWkUpOwotCWlmIChyZXQpIHsKLQkJRFJNX0VSUk9SKCJmYWlsZWQgdG8gcGluIGN1cnNvciBib1xuIik7Ci0JCWRybV9nZW1fb2JqZWN0X3VucmVmZXJlbmNlKGJvKTsKLQkJcmV0dXJuIHJldDsKKwl9IGVsc2UgeworCQlyZXQgPSBpOTE1X2dlbV9hdHRhY2hfcGh5c19vYmplY3QoZGV2LCBibywgKHBpcGUgPT0gMCkgPyBJOTE1X0dFTV9QSFlTX0NVUlNPUl8wIDogSTkxNV9HRU1fUEhZU19DVVJTT1JfMSk7CisJCWlmIChyZXQpIHsKKwkJCURSTV9FUlJPUigiZmFpbGVkIHRvIGF0dGFjaCBwaHlzIG9iamVjdFxuIik7CisJCQlnb3RvIGZhaWw7CisJCX0KKwkJYWRkciA9IG9ial9wcml2LT5waHlzX29iai0+aGFuZGxlLT5idXNhZGRyOwogCX0KIAogCXRlbXAgPSAwOwpAQCAtMTA0MSwxNCArMTA0NywyNSBAQAogCUk5MTVfV1JJVEUoYmFzZSwgYWRkcik7CiAKIAlpZiAoaW50ZWxfY3J0Yy0+Y3Vyc29yX2JvKSB7Ci0JCWk5MTVfZ2VtX29iamVjdF91bnBpbihpbnRlbF9jcnRjLT5jdXJzb3JfYm8pOworCQlpZiAoZGV2X3ByaXYtPmN1cnNvcl9uZWVkc19waHlzaWNhbCkgeworCQkJaWYgKGludGVsX2NydGMtPmN1cnNvcl9ibyAhPSBibykKKwkJCQlpOTE1X2dlbV9kZXRhY2hfcGh5c19vYmplY3QoZGV2LCBpbnRlbF9jcnRjLT5jdXJzb3JfYm8pOworCQl9IGVsc2UKKwkJCWk5MTVfZ2VtX29iamVjdF91bnBpbihpbnRlbF9jcnRjLT5jdXJzb3JfYm8pOworCQltdXRleF9sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CiAJCWRybV9nZW1fb2JqZWN0X3VucmVmZXJlbmNlKGludGVsX2NydGMtPmN1cnNvcl9ibyk7CisJCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwogCX0KIAogCWludGVsX2NydGMtPmN1cnNvcl9hZGRyID0gYWRkcjsKIAlpbnRlbF9jcnRjLT5jdXJzb3JfYm8gPSBibzsKIAogCXJldHVybiAwOworZmFpbDoKKwltdXRleF9sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CisJZHJtX2dlbV9vYmplY3RfdW5yZWZlcmVuY2UoYm8pOworCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgaW50ZWxfY3J0Y19jdXJzb3JfbW92ZShzdHJ1Y3QgZHJtX2NydGMgKmNydGMsIGludCB4LCBpbnQgeSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2x2ZHMuYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2x2ZHMuYwppbmRleCBjY2VjZmFmLi4yZmFmZGNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9sdmRzLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfbHZkcy5jCkBAIC00NTYsNiArNDU2LDEzIEBACiAJCWRldl9wcml2LT5wYW5lbF9maXhlZF9tb2RlID0KIAkJCWRybV9tb2RlX2R1cGxpY2F0ZShkZXYsIGRldl9wcml2LT52YnRfbW9kZSk7CiAJCW11dGV4X3VubG9jaygmZGV2LT5tb2RlX2NvbmZpZy5tdXRleCk7CisJCWlmIChkZXZfcHJpdi0+cGFuZWxfZml4ZWRfbW9kZSkgeworCQkJZGV2X3ByaXYtPnBhbmVsX2ZpeGVkX21vZGUtPnR5cGUgfD0KKwkJCQlEUk1fTU9ERV9UWVBFX1BSRUZFUlJFRDsKKwkJCWRybV9tb2RlX3Byb2JlZF9hZGQoY29ubmVjdG9yLAorCQkJCQkgICAgZGV2X3ByaXYtPnBhbmVsX2ZpeGVkX21vZGUpOworCQkJZ290byBvdXQ7CisJCX0KIAl9CiAKIAkvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvdXNiaGlkL2hpZC1jb3JlLmMgYi9kcml2ZXJzL2hpZC91c2JoaWQvaGlkLWNvcmUuYwppbmRleCAwM2NiNDk0Li5mMGEwZjcyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2hpZC91c2JoaWQvaGlkLWNvcmUuYworKysgYi9kcml2ZXJzL2hpZC91c2JoaWQvaGlkLWNvcmUuYwpAQCAtMTAyLDcgKzEwMiw3IEBACiAJc3RydWN0IHVzYmhpZF9kZXZpY2UgKnVzYmhpZCA9CiAJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgdXNiaGlkX2RldmljZSwgcmVzZXRfd29yayk7CiAJc3RydWN0IGhpZF9kZXZpY2UgKmhpZCA9IHVzYmhpZC0+aGlkOwotCWludCByY19sb2NrLCByYyA9IDA7CisJaW50IHJjID0gMDsKIAogCWlmICh0ZXN0X2JpdChISURfQ0xFQVJfSEFMVCwgJnVzYmhpZC0+aW9mbCkpIHsKIAkJZGV2X2RiZygmdXNiaGlkLT5pbnRmLT5kZXYsICJjbGVhciBoYWx0XG4iKTsKQEAgLTExMywxMSArMTEzLDEwIEBACiAKIAllbHNlIGlmICh0ZXN0X2JpdChISURfUkVTRVRfUEVORElORywgJnVzYmhpZC0+aW9mbCkpIHsKIAkJZGV2X2RiZygmdXNiaGlkLT5pbnRmLT5kZXYsICJyZXNldHRpbmcgZGV2aWNlXG4iKTsKLQkJcmMgPSByY19sb2NrID0gdXNiX2xvY2tfZGV2aWNlX2Zvcl9yZXNldChoaWRfdG9fdXNiX2RldihoaWQpLCB1c2JoaWQtPmludGYpOwotCQlpZiAocmNfbG9jayA+PSAwKSB7CisJCXJjID0gdXNiX2xvY2tfZGV2aWNlX2Zvcl9yZXNldChoaWRfdG9fdXNiX2RldihoaWQpLCB1c2JoaWQtPmludGYpOworCQlpZiAocmMgPT0gMCkgewogCQkJcmMgPSB1c2JfcmVzZXRfZGV2aWNlKGhpZF90b191c2JfZGV2KGhpZCkpOwotCQkJaWYgKHJjX2xvY2spCi0JCQkJdXNiX3VubG9ja19kZXZpY2UoaGlkX3RvX3VzYl9kZXYoaGlkKSk7CisJCQl1c2JfdW5sb2NrX2RldmljZShoaWRfdG9fdXNiX2RldihoaWQpKTsKIAkJfQogCQljbGVhcl9iaXQoSElEX1JFU0VUX1BFTkRJTkcsICZ1c2JoaWQtPmlvZmwpOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL3VzYmhpZC9oaWRkZXYuYyBiL2RyaXZlcnMvaGlkL3VzYmhpZC9oaWRkZXYuYwppbmRleCA2YTk4ZjlmLi5kNzNlZWEzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2hpZC91c2JoaWQvaGlkZGV2LmMKKysrIGIvZHJpdmVycy9oaWQvdXNiaGlkL2hpZGRldi5jCkBAIC04NzQsMTIgKzg3NCwxNCBAQAogCUlOSVRfTElTVF9IRUFEKCZoaWRkZXYtPmxpc3QpOwogCXNwaW5fbG9ja19pbml0KCZoaWRkZXYtPmxpc3RfbG9jayk7CiAJbXV0ZXhfaW5pdCgmaGlkZGV2LT5leGlzdGFuY2Vsb2NrKTsKKwloaWQtPmhpZGRldiA9IGhpZGRldjsKIAloaWRkZXYtPmhpZCA9IGhpZDsKIAloaWRkZXYtPmV4aXN0ID0gMTsKIAogCXJldHZhbCA9IHVzYl9yZWdpc3Rlcl9kZXYodXNiaGlkLT5pbnRmLCAmaGlkZGV2X2NsYXNzKTsKIAlpZiAocmV0dmFsKSB7CiAJCWVycl9oaWQoIk5vdCBhYmxlIHRvIGdldCBhIG1pbm9yIGZvciB0aGlzIGRldmljZS4iKTsKKwkJaGlkLT5oaWRkZXYgPSBOVUxMOwogCQlrZnJlZShoaWRkZXYpOwogCQlyZXR1cm4gLTE7CiAJfSBlbHNlIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vS2NvbmZpZyBiL2RyaXZlcnMvaHdtb24vS2NvbmZpZwppbmRleCBjNzA5ZTgyLi5iODRiZjA2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL0tjb25maWcKKysrIGIvZHJpdmVycy9od21vbi9LY29uZmlnCkBAIC0xODksNiArMTg5LDE2IEBACiAJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gSWYgc28sIHRoZSBtb2R1bGUKIAkgIHdpbGwgYmUgY2FsbGVkIGFkdDc0NzMuCiAKK2NvbmZpZyBTRU5TT1JTX0FEVDc0NzUKKwl0cmlzdGF0ZSAiQW5hbG9nIERldmljZXMgQURUNzQ3NSIKKwlkZXBlbmRzIG9uIEkyQyAmJiBFWFBFUklNRU5UQUwKKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgdGhlIEFuYWxvZyBEZXZpY2VzCisJICBBRFQ3NDc1IGhhcmR3YXJlIG1vbml0b3JpbmcgY2hpcHMuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWxkIGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIGFkdDc0NzUuCisKIGNvbmZpZyBTRU5TT1JTX0s4VEVNUAogCXRyaXN0YXRlICJBTUQgQXRobG9uNjQvRlggb3IgT3B0ZXJvbiB0ZW1wZXJhdHVyZSBzZW5zb3IiCiAJZGVwZW5kcyBvbiBYODYgJiYgUENJICYmIEVYUEVSSU1FTlRBTApAQCAtMjg0LDExICsyOTQsMTIgQEAKIAkgIHdpbGwgYmUgY2FsbGVkIGY3MTgwNWYuCiAKIGNvbmZpZyBTRU5TT1JTX0Y3MTg4MkZHCi0JdHJpc3RhdGUgIkZpbnRlayBGNzE4ODJGRyBhbmQgRjcxODgzRkciCisJdHJpc3RhdGUgIkZpbnRlayBGNzE4NjJGRywgRjcxODgyRkcgYW5kIEY4MDAwIgogCWRlcGVuZHMgb24gRVhQRVJJTUVOVEFMCiAJaGVscAogCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIGhhcmR3YXJlIG1vbml0b3JpbmcKLQkgIGZlYXR1cmVzIG9mIHRoZSBGaW50ZWsgRjcxODgyRkcgYW5kIEY3MTg4M0ZHIFN1cGVyLUkvTyBjaGlwcy4KKwkgIGZlYXR1cmVzIG9mIHRoZSBGaW50ZWsgRjcxODgyRkcvRjcxODgzRkcsIEY3MTg2MkZHLzcxODYzRkcKKwkgIGFuZCBGODAwMCBTdXBlci1JL08gY2hpcHMuCiAKIAkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKIAkgIHdpbGwgYmUgY2FsbGVkIGY3MTg4MmZnLgpAQCAtMzA0LDkgKzMxNSwxMyBAQAogCSAgd2lsbCBiZSBjYWxsZWQgZjc1Mzc1cy4KIAogY29uZmlnIFNFTlNPUlNfRlNDSEVSCi0JdHJpc3RhdGUgIkZTQyBIZXJtZXMiCisJdHJpc3RhdGUgIkZTQyBIZXJtZXMgKERFUFJFQ0FURUQpIgogCWRlcGVuZHMgb24gWDg2ICYmIEkyQwogCWhlbHAKKwkgIFRoaXMgZHJpdmVyIGlzIERFUFJFQ0FURUQgcGxlYXNlIHVzZSB0aGUgbmV3IG1lcmdlZCBmc2NobWQKKwkgICgiRlNDIFBvc2VpZG9uLCBTY3lsbGEsIEhlcm1lcywgSGVpbWRhbGwgYW5kIEhlcmFjbGVzIikgZHJpdmVyCisJICBpbnN0ZWFkLgorCiAJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgRnVqaXRzdSBTaWVtZW5zCiAJICBDb21wdXRlcnMgSGVybWVzIHNlbnNvciBjaGlwcy4KIApAQCAtMzE0LDkgKzMyOSwxMyBAQAogCSAgd2lsbCBiZSBjYWxsZWQgZnNjaGVyLgogCiBjb25maWcgU0VOU09SU19GU0NQT1MKLQl0cmlzdGF0ZSAiRlNDIFBvc2VpZG9uIgorCXRyaXN0YXRlICJGU0MgUG9zZWlkb24gKERFUFJFQ0FURUQpIgogCWRlcGVuZHMgb24gWDg2ICYmIEkyQwogCWhlbHAKKwkgIFRoaXMgZHJpdmVyIGlzIERFUFJFQ0FURUQgcGxlYXNlIHVzZSB0aGUgbmV3IG1lcmdlZCBmc2NobWQKKwkgICgiRlNDIFBvc2VpZG9uLCBTY3lsbGEsIEhlcm1lcywgSGVpbWRhbGwgYW5kIEhlcmFjbGVzIikgZHJpdmVyCisJICBpbnN0ZWFkLgorCiAJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgRnVqaXRzdSBTaWVtZW5zCiAJICBDb21wdXRlcnMgUG9zZWlkb24gc2Vuc29yIGNoaXBzLgogCkBAIC0zMjUsMTQgKzM0NCwxNSBAQAogCiBjb25maWcgU0VOU09SU19GU0NITUQKIAl0cmlzdGF0ZSAiRlNDIFBvc2VpZG9uLCBTY3lsbGEsIEhlcm1lcywgSGVpbWRhbGwgYW5kIEhlcmFjbGVzIgotCWRlcGVuZHMgb24gWDg2ICYmIEkyQyAmJiBFWFBFUklNRU5UQUwKKwlkZXBlbmRzIG9uIFg4NiAmJiBJMkMKIAloZWxwCiAJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgdmFyaW91cyBGdWppdHN1IFNpZW1lbnMKLQkgIENvbXB1dGVycyBzZW5zb3IgY2hpcHMuCisJICBDb21wdXRlcnMgc2Vuc29yIGNoaXBzLCBpbmNsdWRpbmcgc3VwcG9ydCBmb3IgdGhlIGludGVncmF0ZWQKKwkgIHdhdGNoZG9nLgogCi0JICBUaGlzIGlzIGEgbmV3IG1lcmdlZCBkcml2ZXIgZm9yIEZTQyBzZW5zb3IgY2hpcHMgd2hpY2ggaXMgaW50ZW5kZWQKLQkgIGFzIGEgcmVwbGFjbWVudCBmb3IgdGhlIGZzY3BvcywgZnNjc2N5IGFuZCBmc2NoZXIgZHJpdmVycyBhbmQgYWRkcwotCSAgc3VwcG9ydCBmb3Igc2V2ZXJhbCBvdGhlciBGQ1Mgc2Vuc29yIGNoaXBzLgorCSAgVGhpcyBpcyBhIG1lcmdlZCBkcml2ZXIgZm9yIEZTQyBzZW5zb3IgY2hpcHMgcmVwbGFjaW5nIHRoZSBmc2Nwb3MsCisJICBmc2NzY3kgYW5kIGZzY2hlciBkcml2ZXJzIGFuZCBhZGRpbmcgc3VwcG9ydCBmb3Igc2V2ZXJhbCBvdGhlciBGU0MKKwkgIHNlbnNvciBjaGlwcy4KIAogCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQogCSAgd2lsbCBiZSBjYWxsZWQgZnNjaG1kLgpAQCAtMzk5LDcgKzQxOSw4IEBACiAJc2VsZWN0IEhXTU9OX1ZJRAogCWhlbHAKIAkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciBJVEUgSVQ4NzA1RiwgSVQ4NzEyRiwKLQkgIElUODcxNkYsIElUODcxOEYgYW5kIElUODcyNkYgc2Vuc29yIGNoaXBzLCBhbmQgdGhlIFNpUzk2MCBjbG9uZS4KKwkgIElUODcxNkYsIElUODcxOEYsIElUODcyMEYgYW5kIElUODcyNkYgc2Vuc29yIGNoaXBzLCBhbmQgdGhlCisJICBTaVM5NjAgY2xvbmUuCiAKIAkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKIAkgIHdpbGwgYmUgY2FsbGVkIGl0ODcuCkBAIC00MTcsMTEgKzQzOCwxMiBAQAogCSAgd2lsbCBiZSBjYWxsZWQgbG02My4KIAogY29uZmlnIFNFTlNPUlNfTE03MAotCXRyaXN0YXRlICJOYXRpb25hbCBTZW1pY29uZHVjdG9yIExNNzAiCisJdHJpc3RhdGUgIk5hdGlvbmFsIFNlbWljb25kdWN0b3IgTE03MCAvIFRleGFzIEluc3RydW1lbnRzIFRNUDEyMSIKIAlkZXBlbmRzIG9uIFNQSV9NQVNURVIgJiYgRVhQRVJJTUVOVEFMCiAJaGVscAogCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIHRoZSBOYXRpb25hbCBTZW1pY29uZHVjdG9yCi0JICBMTTcwIGRpZ2l0YWwgdGVtcGVyYXR1cmUgc2Vuc29yIGNoaXAuCisJICBMTTcwIGFuZCBUZXhhcyBJbnN0cnVtZW50cyBUTVAxMjEvVE1QMTIzIGRpZ2l0YWwgdGVtcGVyYXR1cmUKKwkgIHNlbnNvciBjaGlwcy4KIAogCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQogCSAgd2lsbCBiZSBjYWxsZWQgbG03MC4KQEAgLTU0OCw2ICs1NzAsMTcgQEAKIAkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKIAkgIHdpbGwgYmUgY2FsbGVkIGxtOTMuCiAKK2NvbmZpZyBTRU5TT1JTX0xUQzQyNDUKKwl0cmlzdGF0ZSAiTGluZWFyIFRlY2hub2xvZ3kgTFRDNDI0NSIKKwlkZXBlbmRzIG9uIEkyQyAmJiBFWFBFUklNRU5UQUwKKwlkZWZhdWx0IG4KKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgTGluZWFyIFRlY2hub2xvZ3kgTFRDNDI0NQorCSAgTXVsdGlwbGUgU3VwcGx5IEhvdCBTd2FwIENvbnRyb2xsZXIgSTJDIGludGVyZmFjZS4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuIElmIHNvLCB0aGUgbW9kdWxlIHdpbGwKKwkgIGJlIGNhbGxlZCBsdGM0MjQ1LgorCiBjb25maWcgU0VOU09SU19NQVgxMTExCiAJdHJpc3RhdGUgIk1heGltIE1BWDExMTEgTXVsdGljaGFubmVsLCBTZXJpYWwgOC1iaXQgQURDIGNoaXAiCiAJZGVwZW5kcyBvbiBTUElfTUFTVEVSCkBAIC04MzgsNiArODcxLDggQEAKIGNvbmZpZyBTRU5TT1JTX0xJUzNMVjAyRAogCXRyaXN0YXRlICJTVE1pY3JvZWxldHJvbmljcyBMSVMzTFYwMkR4IHRocmVlLWF4aXMgZGlnaXRhbCBhY2NlbGVyb21ldGVyIgogCWRlcGVuZHMgb24gQUNQSSAmJiBJTlBVVAorCXNlbGVjdCBORVdfTEVEUworCXNlbGVjdCBMRURTX0NMQVNTCiAJZGVmYXVsdCBuCiAJaGVscAogCSAgVGhpcyBkcml2ZXIgcHJvdmlkZXMgc3VwcG9ydCBmb3IgdGhlIExJUzNMVjAyRHggYWNjZWxlcm9tZXRlci4gSW4KQEAgLTg0OSwxMCArODg0LDE2IEBACiAJICAvc3lzL2RldmljZXMvcGxhdGZvcm0vbGlzM2x2MDJkLgogCiAJICBUaGlzIGRyaXZlciBhbHNvIHByb3ZpZGVzIGFuIGFic29sdXRlIGlucHV0IGNsYXNzIGRldmljZSwgYWxsb3dpbmcKLQkgIHRoZSBsYXB0b3AgdG8gYWN0IGFzIGEgcGluYmFsbCBtYWNoaW5lLWVzcXVlIGpveXN0aWNrLgorCSAgdGhlIGxhcHRvcCB0byBhY3QgYXMgYSBwaW5iYWxsIG1hY2hpbmUtZXNxdWUgam95c3RpY2suIE9uIEhQIGxhcHRvcHMsCisJICBpZiB0aGUgbGVkIGluZnJhc3RydWN0dXJlIGlzIGFjdGl2YXRlZCwgc3VwcG9ydCBmb3IgYSBsZWQgaW5kaWNhdGluZworCSAgZGlzayBwcm90ZWN0aW9uIHdpbGwgYmUgcHJvdmlkZWQgYXMgaHA6cmVkOmhkZHByb3RlY3Rpb24uCiAKLQkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKLQkgIHdpbGwgYmUgY2FsbGVkIGxpczNsdjAyZC4KKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIG1vZHVsZXMuICBJZiBzbywgdGhlIGNvcmUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBsaXMzbHYwMmQgYW5kIGEgc3BlY2lmaWMgbW9kdWxlIGZvciBIUCBsYXB0b3BzIHdpbGwgYmUKKwkgIGNhbGxlZCBocF9hY2NlbC4KKworCSAgU2F5IFkgaGVyZSBpZiB5b3UgaGF2ZSBhbiBhcHBsaWNhYmxlIGxhcHRvcCBhbmQgd2FudCB0byBleHBlcmllbmNlCisJICB0aGUgYXdlc29tZSBwb3dlciBvZiBsaXMzbHYwMmQuCiAKIGNvbmZpZyBTRU5TT1JTX0FQUExFU01DCiAJdHJpc3RhdGUgIkFwcGxlIFNNQyAoTW90aW9uIHNlbnNvciwgbGlnaHQgc2Vuc29yLCBrZXlib2FyZCBiYWNrbGlnaHQpIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9NYWtlZmlsZSBiL2RyaXZlcnMvaHdtb24vTWFrZWZpbGUKaW5kZXggNThmYzViZS4uMmU4MGYzNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2h3bW9uL01ha2VmaWxlCkBAIC0yOCw2ICsyOCw4IEBACiBvYmotJChDT05GSUdfU0VOU09SU19BRFQ3NDYyKQkrPSBhZHQ3NDYyLm8KIG9iai0kKENPTkZJR19TRU5TT1JTX0FEVDc0NzApCSs9IGFkdDc0NzAubwogb2JqLSQoQ09ORklHX1NFTlNPUlNfQURUNzQ3MykJKz0gYWR0NzQ3My5vCitvYmotJChDT05GSUdfU0VOU09SU19BRFQ3NDc1KQkrPSBhZHQ3NDc1Lm8KKwogb2JqLSQoQ09ORklHX1NFTlNPUlNfQVBQTEVTTUMpCSs9IGFwcGxlc21jLm8KIG9iai0kKENPTkZJR19TRU5TT1JTX0FNUykJKz0gYW1zLwogb2JqLSQoQ09ORklHX1NFTlNPUlNfQVRYUDEpCSs9IGF0eHAxLm8KQEAgLTQ5LDcgKzUxLDcgQEAKIG9iai0kKENPTkZJR19TRU5TT1JTX0lCTVBFWCkJKz0gaWJtcGV4Lm8KIG9iai0kKENPTkZJR19TRU5TT1JTX0lUODcpCSs9IGl0ODcubwogb2JqLSQoQ09ORklHX1NFTlNPUlNfSzhURU1QKQkrPSBrOHRlbXAubwotb2JqLSQoQ09ORklHX1NFTlNPUlNfTElTM0xWMDJEKSArPSBsaXMzbHYwMmQubworb2JqLSQoQ09ORklHX1NFTlNPUlNfTElTM0xWMDJEKSArPSBsaXMzbHYwMmQubyBocF9hY2NlbC5vCiBvYmotJChDT05GSUdfU0VOU09SU19MTTYzKQkrPSBsbTYzLm8KIG9iai0kKENPTkZJR19TRU5TT1JTX0xNNzApCSs9IGxtNzAubwogb2JqLSQoQ09ORklHX1NFTlNPUlNfTE03NSkJKz0gbG03NS5vCkBAIC02Miw2ICs2NCw3IEBACiBvYmotJChDT05GSUdfU0VOU09SU19MTTkwKQkrPSBsbTkwLm8KIG9iai0kKENPTkZJR19TRU5TT1JTX0xNOTIpCSs9IGxtOTIubwogb2JqLSQoQ09ORklHX1NFTlNPUlNfTE05MykJKz0gbG05My5vCitvYmotJChDT05GSUdfU0VOU09SU19MVEM0MjQ1KQkrPSBsdGM0MjQ1Lm8KIG9iai0kKENPTkZJR19TRU5TT1JTX01BWDExMTEpCSs9IG1heDExMTEubwogb2JqLSQoQ09ORklHX1NFTlNPUlNfTUFYMTYxOSkJKz0gbWF4MTYxOS5vCiBvYmotJChDT05GSUdfU0VOU09SU19NQVg2NjUwKQkrPSBtYXg2NjUwLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vYWJpdHVndXJ1My5jIGIvZHJpdmVycy9od21vbi9hYml0dWd1cnUzLmMKaW5kZXggNzBiYjg1NC4uZTUyYjM4OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9hYml0dWd1cnUzLmMKKysrIGIvZHJpdmVycy9od21vbi9hYml0dWd1cnUzLmMKQEAgLTI3OSw3ICsyNzksNyBAQAogCQl7ICJPVEVTMSBGYW4iLAkJMzYsIDIsIDYwLCAxLCAwIH0sCiAJCXsgTlVMTCwgMCwgMCwgMCwgMCwgMCB9IH0KIAl9LAotCXsgMHgwMDExLCAiQVQ4IDMyWChBVEkgUkQ1ODAtVUxJIE0xNTc1KSIsIHsKKwl7IDB4MDAxMSwgIkFUOCAzMlgiLCB7CiAJCXsgIkNQVSBDb3JlIiwJCSAwLCAwLCAxMCwgMSwgMCB9LAogCQl7ICJERFIiLAkJIDEsIDAsIDIwLCAxLCAwIH0sCiAJCXsgIkREUiBWVFQiLAkJIDIsIDAsIDEwLCAxLCAwIH0sCkBAIC00MDIsNyArNDAyLDcgQEAKIAkJeyAiQVVYMyBGYW4iLAkJMzYsIDIsIDYwLCAxLCAwIH0sCiAJCXsgTlVMTCwgMCwgMCwgMCwgMCwgMCB9IH0KIAl9LAotCXsgMHgwMDE2LCAiQVc5RC1NQVggICAgICAgKEludGVsIGk5NzUtSUNINykiLCB7CisJeyAweDAwMTYsICJBVzlELU1BWCIsIHsKIAkJeyAiQ1BVIENvcmUiLAkJIDAsIDAsIDEwLCAxLCAwIH0sCiAJCXsgIkREUjIiLAkJIDEsIDAsIDIwLCAxLCAwIH0sCiAJCXsgIkREUjIgVlRUIiwJCSAyLCAwLCAxMCwgMSwgMCB9LApAQCAtNDgyLDcgKzQ4Miw3IEBACiAJCXsgIkFVWDMgRmFuIiwJCTM2LCAyLCA2MCwgMSwgMCB9LAogCQl7IE5VTEwsIDAsIDAsIDAsIDAsIDAgfSB9CiAJfSwKLQl7IDB4MDAxOSwgTlVMTCAvKiBVbmtub3duLCBuZWVkIERNSSBzdHJpbmcgKi8sIHsKKwl7IDB4MDAxOSwgIklOOSAzMlggTUFYIiwgewogCQl7ICJDUFUgQ29yZSIsCQkgNywgMCwgMTAsIDEsIDAgfSwKIAkJeyAiRERSMiIsCQkxMywgMCwgMjAsIDEsIDAgfSwKIAkJeyAiRERSMiBWVFQiLAkJMTQsIDAsIDEwLCAxLCAwIH0sCkBAIC01MDksNyArNTA5LDcgQEAKIAkJeyAiQVVYMyBGQU4iLAkJMzYsIDIsIDYwLCAxLCAwIH0sCiAJCXsgTlVMTCwgMCwgMCwgMCwgMCwgMCB9IH0KIAl9LAotCXsgMHgwMDFBLCAiSVAzNSBQcm8oSW50ZWwgUDM1LUlDSDlSKSIsIHsKKwl7IDB4MDAxQSwgIklQMzUgUHJvIiwgewogCQl7ICJDUFUgQ29yZSIsCQkgMCwgMCwgMTAsIDEsIDAgfSwKIAkJeyAiRERSMiIsCQkgMSwgMCwgMjAsIDEsIDAgfSwKIAkJeyAiRERSMiBWVFQiLAkJIDIsIDAsIDEwLCAxLCAwIH0sCkBAIC0xMTI4LDYgKzExMjgsNyBAQAogewogCWNvbnN0IGNoYXIgKmJvYXJkX3ZlbmRvciwgKmJvYXJkX25hbWU7CiAJaW50IGksIGVyciA9IChmb3JjZSkgPyAxIDogLUVOT0RFVjsKKwlzaXplX3Qgc3VibGVuOwogCiAJYm9hcmRfdmVuZG9yID0gZG1pX2dldF9zeXN0ZW1faW5mbyhETUlfQk9BUkRfVkVORE9SKTsKIAlpZiAoIWJvYXJkX3ZlbmRvciB8fCBzdHJjbXAoYm9hcmRfdmVuZG9yLCAiaHR0cDovL3d3dy5hYml0LmNvbS50dy8iKSkKQEAgLTExMzcsOSArMTEzOCwyMCBAQAogCWlmICghYm9hcmRfbmFtZSkKIAkJcmV0dXJuIGVycjsKIAorCS8qIEF0IHRoZSBtb21lbnQsIHdlIGRvbid0IGNhcmUgYWJvdXQgdGhlIHBhcnQgb2YgdGhlIHZlbmRvcgorCSAqIERNSSBzdHJpbmcgY29udGFpbmVkIGluIGJyYWNrZXRzLiBUcnVuY2F0ZSB0aGUgc3RyaW5nIGF0CisJICogdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgYSBicmFja2V0LiBUcmltIGFueSB0cmFpbGluZyBzcGFjZQorCSAqIGZyb20gdGhlIHN1YnN0cmluZy4KKwkgKi8KKwlzdWJsZW4gPSBzdHJjc3BuKGJvYXJkX25hbWUsICIoIik7CisJd2hpbGUgKHN1YmxlbiA+IDAgJiYgYm9hcmRfbmFtZVtzdWJsZW4gLSAxXSA9PSAnICcpCisJCXN1Ymxlbi0tOworCiAJZm9yIChpID0gMDsgYWJpdHVndXJ1M19tb3RoZXJib2FyZHNbaV0uaWQ7IGkrKykgewogCQljb25zdCBjaGFyICpkbWlfbmFtZSA9IGFiaXR1Z3VydTNfbW90aGVyYm9hcmRzW2ldLmRtaV9uYW1lOwotCQlpZiAoZG1pX25hbWUgJiYgIXN0cmNtcChkbWlfbmFtZSwgYm9hcmRfbmFtZSkpCisJCWlmICghZG1pX25hbWUgfHwgc3RybGVuKGRtaV9uYW1lKSAhPSBzdWJsZW4pCisJCQljb250aW51ZTsKKwkJaWYgKCFzdHJuY2FzZWNtcChib2FyZF9uYW1lLCBkbWlfbmFtZSwgc3VibGVuKSkKIAkJCWJyZWFrOwogCX0KIApAQCAtMTE1Myw3ICsxMTY1LDcgQEAKIAogc3RhdGljIGlubGluZSBpbnQgYWJpdHVndXJ1M19kbWlfZGV0ZWN0KHZvaWQpCiB7Ci0JcmV0dXJuIC1FTk9ERVY7CisJcmV0dXJuIDE7CiB9CiAKICNlbmRpZiAvKiBDT05GSUdfRE1JICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2FkdDc0NzUuYyBiL2RyaXZlcnMvaHdtb24vYWR0NzQ3NS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzOTg3N2EKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2h3bW9uL2FkdDc0NzUuYwpAQCAtMCwwICsxLDEyMjEgQEAKKy8qCisgKiBhZHQ3NDc1IC0gVGhlcm1hbCBzZW5zb3IgZHJpdmVyIGZvciB0aGUgQURUNzQ3NSBjaGlwIGFuZCBkZXJpdmF0aXZlcworICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDgsIEFkdmFuY2VkIE1pY3JvIERldmljZXMsIEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAwOCBKb3JkYW4gQ3JvdXNlIDxqb3JkYW5AY29zbWljcGVuZ3Vpbi5uZXQ+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDggSGFucyBkZSBHb2VkZSA8aGRlZ29lZGVAcmVkaGF0LmNvbT4KKworICogRGVyaXZlZCBmcm9tIHRoZSBsbTgzIGRyaXZlciBieSBKZWFuIERlbHZhcmUKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2h3bW9uLmg+CisjaW5jbHVkZSA8bGludXgvaHdtb24tc3lzZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKworLyogSW5kZXhlcyBmb3IgdGhlIHN5c2ZzIGhvb2tzICovCisKKyNkZWZpbmUgSU5QVVQJCTAKKyNkZWZpbmUgTUlOCQkxCisjZGVmaW5lIE1BWAkJMgorI2RlZmluZSBDT05UUk9MCQkzCisjZGVmaW5lIE9GRlNFVAkJMworI2RlZmluZSBBVVRPTUlOCQk0CisjZGVmaW5lIFRIRVJNCQk1CisjZGVmaW5lIEhZU1RFUlNJUwk2CisKKy8qIFRoZXNlIGFyZSB1bmlxdWUgaWRlbnRpZmllcnMgZm9yIHRoZSBzeXNmcyBmdW5jdGlvbnMgLSB1bmxpa2UgdGhlCisgICBudW1iZXJzIGFib3ZlLCB0aGVzZSBhcmUgbm90IGFsc28gaW5kZXhlcyBpbnRvIGFuIGFycmF5CisqLworCisjZGVmaW5lIEFMQVJNCQk5CisjZGVmaW5lIEZBVUxUCQkxMAorCisvKiA3NDc1IENvbW1vbiBSZWdpc3RlcnMgKi8KKworI2RlZmluZSBSRUdfVk9MVEFHRV9CQVNFCTB4MjEKKyNkZWZpbmUgUkVHX1RFTVBfQkFTRQkJMHgyNQorI2RlZmluZSBSRUdfVEFDSF9CQVNFCQkweDI4CisjZGVmaW5lIFJFR19QV01fQkFTRQkJMHgzMAorI2RlZmluZSBSRUdfUFdNX01BWF9CQVNFCTB4MzgKKworI2RlZmluZSBSRUdfREVWSUQJCTB4M0QKKyNkZWZpbmUgUkVHX1ZFTkRJRAkJMHgzRQorCisjZGVmaW5lIFJFR19TVEFUVVMxCQkweDQxCisjZGVmaW5lIFJFR19TVEFUVVMyCQkweDQyCisKKyNkZWZpbmUgUkVHX1ZPTFRBR0VfTUlOX0JBU0UJMHg0NgorI2RlZmluZSBSRUdfVk9MVEFHRV9NQVhfQkFTRQkweDQ3CisKKyNkZWZpbmUgUkVHX1RFTVBfTUlOX0JBU0UJMHg0RQorI2RlZmluZSBSRUdfVEVNUF9NQVhfQkFTRQkweDRGCisKKyNkZWZpbmUgUkVHX1RBQ0hfTUlOX0JBU0UJMHg1NAorCisjZGVmaW5lIFJFR19QV01fQ09ORklHX0JBU0UJMHg1QworCisjZGVmaW5lIFJFR19URU1QX1RSQU5HRV9CQVNFCTB4NUYKKworI2RlZmluZSBSRUdfUFdNX01JTl9CQVNFCTB4NjQKKworI2RlZmluZSBSRUdfVEVNUF9UTUlOX0JBU0UJMHg2NworI2RlZmluZSBSRUdfVEVNUF9USEVSTV9CQVNFCTB4NkEKKworI2RlZmluZSBSRUdfUkVNT1RFMV9IWVNURVJTSVMJMHg2RAorI2RlZmluZSBSRUdfUkVNT1RFMl9IWVNURVJTSVMJMHg2RQorCisjZGVmaW5lIFJFR19URU1QX09GRlNFVF9CQVNFCTB4NzAKKworI2RlZmluZSBSRUdfRVhURU5EMQkJMHg3NgorI2RlZmluZSBSRUdfRVhURU5EMgkJMHg3NworI2RlZmluZSBSRUdfQ09ORklHNQkJMHg3QworCisjZGVmaW5lIENPTkZJRzVfVFdPU0NPTVAJMHgwMQorI2RlZmluZSBDT05GSUc1X1RFTVBPRkZTRVQJMHgwMgorCisvKiBBRFQ3NDc1IFNldHRpbmdzICovCisKKyNkZWZpbmUgQURUNzQ3NV9WT0xUQUdFX0NPVU5UCTIKKyNkZWZpbmUgQURUNzQ3NV9URU1QX0NPVU5UCTMKKyNkZWZpbmUgQURUNzQ3NV9UQUNIX0NPVU5UCTQKKyNkZWZpbmUgQURUNzQ3NV9QV01fQ09VTlQJMworCisvKiBNYWNybyB0byByZWFkIHRoZSByZWdpc3RlcnMgKi8KKworI2RlZmluZSBhZHQ3NDc1X3JlYWQocmVnKSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCAocmVnKSkKKworLyogTWFjcm9zIHRvIGVhc2lseSBpbmRleCB0aGUgcmVnaXN0ZXJzICovCisKKyNkZWZpbmUgVEFDSF9SRUcoaWR4KSAoUkVHX1RBQ0hfQkFTRSArICgoaWR4KSAqIDIpKQorI2RlZmluZSBUQUNIX01JTl9SRUcoaWR4KSAoUkVHX1RBQ0hfTUlOX0JBU0UgKyAoKGlkeCkgKiAyKSkKKworI2RlZmluZSBQV01fUkVHKGlkeCkgKFJFR19QV01fQkFTRSArIChpZHgpKQorI2RlZmluZSBQV01fTUFYX1JFRyhpZHgpIChSRUdfUFdNX01BWF9CQVNFICsgKGlkeCkpCisjZGVmaW5lIFBXTV9NSU5fUkVHKGlkeCkgKFJFR19QV01fTUlOX0JBU0UgKyAoaWR4KSkKKyNkZWZpbmUgUFdNX0NPTkZJR19SRUcoaWR4KSAoUkVHX1BXTV9DT05GSUdfQkFTRSArIChpZHgpKQorCisjZGVmaW5lIFZPTFRBR0VfUkVHKGlkeCkgKFJFR19WT0xUQUdFX0JBU0UgKyAoaWR4KSkKKyNkZWZpbmUgVk9MVEFHRV9NSU5fUkVHKGlkeCkgKFJFR19WT0xUQUdFX01JTl9CQVNFICsgKChpZHgpICogMikpCisjZGVmaW5lIFZPTFRBR0VfTUFYX1JFRyhpZHgpIChSRUdfVk9MVEFHRV9NQVhfQkFTRSArICgoaWR4KSAqIDIpKQorCisjZGVmaW5lIFRFTVBfUkVHKGlkeCkgKFJFR19URU1QX0JBU0UgKyAoaWR4KSkKKyNkZWZpbmUgVEVNUF9NSU5fUkVHKGlkeCkgKFJFR19URU1QX01JTl9CQVNFICsgKChpZHgpICogMikpCisjZGVmaW5lIFRFTVBfTUFYX1JFRyhpZHgpIChSRUdfVEVNUF9NQVhfQkFTRSArICgoaWR4KSAqIDIpKQorI2RlZmluZSBURU1QX1RNSU5fUkVHKGlkeCkgKFJFR19URU1QX1RNSU5fQkFTRSArIChpZHgpKQorI2RlZmluZSBURU1QX1RIRVJNX1JFRyhpZHgpIChSRUdfVEVNUF9USEVSTV9CQVNFICsgKGlkeCkpCisjZGVmaW5lIFRFTVBfT0ZGU0VUX1JFRyhpZHgpIChSRUdfVEVNUF9PRkZTRVRfQkFTRSArIChpZHgpKQorI2RlZmluZSBURU1QX1RSQU5HRV9SRUcoaWR4KSAoUkVHX1RFTVBfVFJBTkdFX0JBU0UgKyAoaWR4KSkKKworc3RhdGljIHVuc2lnbmVkIHNob3J0IG5vcm1hbF9pMmNbXSA9IHsgMHgyZSwgSTJDX0NMSUVOVF9FTkQgfTsKKworSTJDX0NMSUVOVF9JTlNNT0RfMShhZHQ3NDc1KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIGFkdDc0NzVfaWRbXSA9IHsKKwl7ICJhZHQ3NDc1IiwgYWR0NzQ3NSB9LAorCXsgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCBhZHQ3NDc1X2lkKTsKKworc3RydWN0IGFkdDc0NzVfZGF0YSB7CisJc3RydWN0IGRldmljZSAqaHdtb25fZGV2OworCXN0cnVjdCBtdXRleCBsb2NrOworCisJdW5zaWduZWQgbG9uZyBtZWFzdXJlX3VwZGF0ZWQ7CisJdW5zaWduZWQgbG9uZyBsaW1pdHNfdXBkYXRlZDsKKwljaGFyIHZhbGlkOworCisJdTggY29uZmlnNTsKKwl1MTYgYWxhcm1zOworCXUxNiB2b2x0YWdlWzNdWzNdOworCXUxNiB0ZW1wWzddWzNdOworCXUxNiB0YWNoWzJdWzRdOworCXU4IHB3bVs0XVszXTsKKwl1OCByYW5nZVszXTsKKwl1OCBwd21jdGxbM107CisJdTggcHdtY2hhblszXTsKK307CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBhZHQ3NDc1X2RyaXZlcjsKK3N0YXRpYyBzdHJ1Y3QgYWR0NzQ3NV9kYXRhICphZHQ3NDc1X3VwZGF0ZV9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIGFkdDc0NzVfcmVhZF9oeXN0ZXJzaXMoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCk7CitzdGF0aWMgdm9pZCBhZHQ3NDc1X3JlYWRfcHdtKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIGludCBpbmRleCk7CisKKy8qIEdpdmVuIGEgdGVtcCB2YWx1ZSwgY29udmVydCBpdCB0byByZWdpc3RlciB2YWx1ZSAqLworCitzdGF0aWMgaW5saW5lIHUxNiB0ZW1wMnJlZyhzdHJ1Y3QgYWR0NzQ3NV9kYXRhICpkYXRhLCBsb25nIHZhbCkKK3sKKwl1MTYgcmV0OworCisJaWYgKCEoZGF0YS0+Y29uZmlnNSAmIENPTkZJRzVfVFdPU0NPTVApKSB7CisJCXZhbCA9IFNFTlNPUlNfTElNSVQodmFsLCAtNjQwMDAsIDE5MTAwMCk7CisJCXJldCA9ICh2YWwgKyA2NDUwMCkgLyAxMDAwOworCX0gZWxzZSB7CisJCXZhbCA9IFNFTlNPUlNfTElNSVQodmFsLCAtMTI4MDAwLCAxMjcwMDApOworCQlpZiAodmFsIDwgLTUwMCkKKwkJCXJldCA9ICgyNTY1MDAgKyB2YWwpIC8gMTAwMDsKKwkJZWxzZQorCQkJcmV0ID0gKHZhbCArIDUwMCkgLyAxMDAwOworCX0KKworCXJldHVybiByZXQgPDwgMjsKK30KKworLyogR2l2ZW4gYSByZWdpc3RlciB2YWx1ZSwgY29udmVydCBpdCB0byBhIHJlYWwgdGVtcCB2YWx1ZSAqLworCitzdGF0aWMgaW5saW5lIGludCByZWcydGVtcChzdHJ1Y3QgYWR0NzQ3NV9kYXRhICpkYXRhLCB1MTYgcmVnKQoreworCWlmIChkYXRhLT5jb25maWc1ICYgQ09ORklHNV9UV09TQ09NUCkgeworCQlpZiAocmVnID49IDUxMikKKwkJCXJldHVybiAocmVnIC0gMTAyNCkgKiAyNTA7CisJCWVsc2UKKwkJCXJldHVybiByZWcgKiAyNTA7CisJfSBlbHNlCisJCXJldHVybiAocmVnIC0gMjU2KSAqIDI1MDsKK30KKworc3RhdGljIGlubGluZSBpbnQgdGFjaDJycG0odTE2IHRhY2gpCit7CisJaWYgKHRhY2ggPT0gMCB8fCB0YWNoID09IDB4RkZGRikKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gKDkwMDAwICogNjApIC8gdGFjaDsKK30KKworc3RhdGljIGlubGluZSB1MTYgcnBtMnRhY2godW5zaWduZWQgbG9uZyBycG0pCit7CisJaWYgKHJwbSA9PSAwKQorCQlyZXR1cm4gMDsKKworCXJldHVybiBTRU5TT1JTX0xJTUlUKCg5MDAwMCAqIDYwKSAvIHJwbSwgMSwgMHhGRkZGKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgcmVnMnZjYyh1MTYgcmVnKQoreworCXJldHVybiAoNDI5NiAqIHJlZykgLyAxMDAwOworfQorCitzdGF0aWMgaW5saW5lIGludCByZWcydmNjcCh1MTYgcmVnKQoreworCXJldHVybiAoMjkyOSAqIHJlZykgLyAxMDAwOworfQorCitzdGF0aWMgaW5saW5lIHUxNiB2Y2MycmVnKGxvbmcgdmNjKQoreworCXZjYyA9IFNFTlNPUlNfTElNSVQodmNjLCAwLCA0Mzk2KTsKKwlyZXR1cm4gKHZjYyAqIDEwMDApIC8gNDI5NjsKK30KKworc3RhdGljIGlubGluZSB1MTYgdmNjcDJyZWcobG9uZyB2Y2MpCit7CisJdmNjID0gU0VOU09SU19MSU1JVCh2Y2MsIDAsIDI5OTgpOworCXJldHVybiAodmNjICogMTAwMCkgLyAyOTI5OworfQorCitzdGF0aWMgdTE2IGFkdDc0NzVfcmVhZF93b3JkKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIGludCByZWcpCit7CisJdTE2IHZhbDsKKworCXZhbCA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIHJlZyk7CisJdmFsIHw9IChpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCByZWcgKyAxKSA8PCA4KTsKKworCXJldHVybiB2YWw7Cit9CisKK3N0YXRpYyB2b2lkIGFkdDc0NzVfd3JpdGVfd29yZChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBpbnQgcmVnLCB1MTYgdmFsKQoreworCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCByZWcgKyAxLCB2YWwgPj4gOCk7CisJaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIHJlZywgdmFsICYgMHhGRik7Cit9CisKKy8qIEZpbmQgdGhlIG5lYXJlc3QgdmFsdWUgaW4gYSB0YWJsZSAtIHVzZWQgZm9yIHB3bSBmcmVxdWVuY3kgYW5kCisgICBhdXRvIHRlbXAgcmFuZ2UgKi8KK3N0YXRpYyBpbnQgZmluZF9uZWFyZXN0KGxvbmcgdmFsLCBjb25zdCBpbnQgKmFycmF5LCBpbnQgc2l6ZSkKK3sKKwlpbnQgaTsKKworCWlmICh2YWwgPCBhcnJheVswXSkKKwkJcmV0dXJuIDA7CisKKwlpZiAodmFsID4gYXJyYXlbc2l6ZSAtIDFdKQorCQlyZXR1cm4gc2l6ZSAtIDE7CisKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZSAtIDE7IGkrKykgeworCQlpbnQgYSwgYjsKKworCQlpZiAodmFsID4gYXJyYXlbaSArIDFdKQorCQkJY29udGludWU7CisKKwkJYSA9IHZhbCAtIGFycmF5W2ldOworCQliID0gYXJyYXlbaSArIDFdIC0gdmFsOworCisJCXJldHVybiAoYSA8PSBiKSA/IGkgOiBpICsgMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHNzaXplX3Qgc2hvd192b2x0YWdlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICAgY2hhciAqYnVmKQoreworCXN0cnVjdCBhZHQ3NDc1X2RhdGEgKmRhdGEgPSBhZHQ3NDc1X3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwlzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGVfMiAqc2F0dHIgPSB0b19zZW5zb3JfZGV2X2F0dHJfMihhdHRyKTsKKwl1bnNpZ25lZCBzaG9ydCB2YWw7CisKKwlzd2l0Y2ggKHNhdHRyLT5ucikgeworCWNhc2UgQUxBUk06CisJCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLAorCQkJICAgICAgIChkYXRhLT5hbGFybXMgPj4gKHNhdHRyLT5pbmRleCArIDEpKSAmIDEpOworCWRlZmF1bHQ6CisJCXZhbCA9IGRhdGEtPnZvbHRhZ2Vbc2F0dHItPm5yXVtzYXR0ci0+aW5kZXhdOworCQlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwKKwkJCSAgICAgICBzYXR0ci0+aW5kZXggPT0KKwkJCSAgICAgICAwID8gcmVnMnZjY3AodmFsKSA6IHJlZzJ2Y2ModmFsKSk7CisJfQorfQorCitzdGF0aWMgc3NpemVfdCBzZXRfdm9sdGFnZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisKKwlzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGVfMiAqc2F0dHIgPSB0b19zZW5zb3JfZGV2X2F0dHJfMihhdHRyKTsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCBhZHQ3NDc1X2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwl1bnNpZ25lZCBjaGFyIHJlZzsKKwlsb25nIHZhbDsKKworCWlmIChzdHJpY3Rfc3RydG9sKGJ1ZiwgMTAsICZ2YWwpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW11dGV4X2xvY2soJmRhdGEtPmxvY2spOworCisJZGF0YS0+dm9sdGFnZVtzYXR0ci0+bnJdW3NhdHRyLT5pbmRleF0gPQorCQlzYXR0ci0+aW5kZXggPyB2Y2MycmVnKHZhbCkgOiB2Y2NwMnJlZyh2YWwpOworCisJaWYgKHNhdHRyLT5uciA9PSBNSU4pCisJCXJlZyA9IFZPTFRBR0VfTUlOX1JFRyhzYXR0ci0+aW5kZXgpOworCWVsc2UKKwkJcmVnID0gVk9MVEFHRV9NQVhfUkVHKHNhdHRyLT5pbmRleCk7CisKKwlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgcmVnLAorCQkJCSAgZGF0YS0+dm9sdGFnZVtzYXR0ci0+bnJdW3NhdHRyLT5pbmRleF0gPj4gMik7CisJbXV0ZXhfdW5sb2NrKCZkYXRhLT5sb2NrKTsKKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHNzaXplX3Qgc2hvd190ZW1wKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgY2hhciAqYnVmKQoreworCXN0cnVjdCBhZHQ3NDc1X2RhdGEgKmRhdGEgPSBhZHQ3NDc1X3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwlzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGVfMiAqc2F0dHIgPSB0b19zZW5zb3JfZGV2X2F0dHJfMihhdHRyKTsKKwlpbnQgb3V0OworCisJc3dpdGNoIChzYXR0ci0+bnIpIHsKKwljYXNlIEhZU1RFUlNJUzoKKwkJbXV0ZXhfbG9jaygmZGF0YS0+bG9jayk7CisJCW91dCA9IGRhdGEtPnRlbXBbc2F0dHItPm5yXVtzYXR0ci0+aW5kZXhdOworCQlpZiAoc2F0dHItPmluZGV4ICE9IDEpCisJCQlvdXQgPSAob3V0ID4+IDQpICYgMHhGOworCQllbHNlCisJCQlvdXQgPSAob3V0ICYgMHhGKTsKKwkJLyogU2hvdyB0aGUgdmFsdWUgYXMgYW4gYWJzb2x1dGUgbnVtYmVyIHRpZWQgdG8KKwkJICogVEhFUk0gKi8KKwkJb3V0ID0gcmVnMnRlbXAoZGF0YSwgZGF0YS0+dGVtcFtUSEVSTV1bc2F0dHItPmluZGV4XSkgLQorCQkJb3V0ICogMTAwMDsKKwkJbXV0ZXhfdW5sb2NrKCZkYXRhLT5sb2NrKTsKKwkJYnJlYWs7CisKKwljYXNlIE9GRlNFVDoKKwkJLyogT2Zmc2V0IGlzIGFsd2F5cyAyJ3MgY29tcGxlbWVudCwgcmVnYXJkbGVzcyBvZiB0aGUKKwkJICogc2V0dGluZyBpbiBDT05GSUc1ICovCisJCW11dGV4X2xvY2soJmRhdGEtPmxvY2spOworCQlvdXQgPSAoczgpZGF0YS0+dGVtcFtzYXR0ci0+bnJdW3NhdHRyLT5pbmRleF07CisJCWlmIChkYXRhLT5jb25maWc1ICYgQ09ORklHNV9URU1QT0ZGU0VUKQorCQkJb3V0ICo9IDEwMDA7CisJCWVsc2UKKwkJCW91dCAqPSA1MDA7CisJCW11dGV4X3VubG9jaygmZGF0YS0+bG9jayk7CisJCWJyZWFrOworCisJY2FzZSBBTEFSTToKKwkJb3V0ID0gKGRhdGEtPmFsYXJtcyA+PiAoc2F0dHItPmluZGV4ICsgNCkpICYgMTsKKwkJYnJlYWs7CisKKwljYXNlIEZBVUxUOgorCQkvKiBOb3RlIC0gb25seSBmb3IgcmVtb3RlMSBhbmQgcmVtb3RlMiAqLworCQlvdXQgPSBkYXRhLT5hbGFybXMgJiAoc2F0dHItPmluZGV4ID8gMHg4MDAwIDogMHg0MDAwKTsKKwkJb3V0ID0gb3V0ID8gMCA6IDE7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJLyogQWxsIG90aGVyIHRlbXAgdmFsdWVzIGFyZSBpbiB0aGUgY29uZmlndXJlZCBmb3JtYXQgKi8KKwkJb3V0ID0gcmVnMnRlbXAoZGF0YSwgZGF0YS0+dGVtcFtzYXR0ci0+bnJdW3NhdHRyLT5pbmRleF0pOworCX0KKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBvdXQpOworfQorCitzdGF0aWMgc3NpemVfdCBzZXRfdGVtcChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlXzIgKnNhdHRyID0gdG9fc2Vuc29yX2Rldl9hdHRyXzIoYXR0cik7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgYWR0NzQ3NV9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJdW5zaWduZWQgY2hhciByZWcgPSAwOworCXU4IG91dDsKKwlpbnQgdGVtcDsKKwlsb25nIHZhbDsKKworCWlmIChzdHJpY3Rfc3RydG9sKGJ1ZiwgMTAsICZ2YWwpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW11dGV4X2xvY2soJmRhdGEtPmxvY2spOworCisJLyogV2UgbmVlZCB0aGUgY29uZmlnIHJlZ2lzdGVyIGluIGFsbCBjYXNlcyBmb3IgdGVtcCA8LT4gcmVnIGNvbnYuICovCisJZGF0YS0+Y29uZmlnNSA9IGFkdDc0NzVfcmVhZChSRUdfQ09ORklHNSk7CisKKwlzd2l0Y2ggKHNhdHRyLT5ucikgeworCWNhc2UgT0ZGU0VUOgorCQlpZiAoZGF0YS0+Y29uZmlnNSAmIENPTkZJRzVfVEVNUE9GRlNFVCkgeworCQkJdmFsID0gU0VOU09SU19MSU1JVCh2YWwsIC02MzAwMCwgMTI3MDAwKTsKKwkJCW91dCA9IGRhdGEtPnRlbXBbT0ZGU0VUXVtzYXR0ci0+aW5kZXhdID0gdmFsIC8gMTAwMDsKKwkJfSBlbHNlIHsKKwkJCXZhbCA9IFNFTlNPUlNfTElNSVQodmFsLCAtNjMwMDAsIDY0MDAwKTsKKwkJCW91dCA9IGRhdGEtPnRlbXBbT0ZGU0VUXVtzYXR0ci0+aW5kZXhdID0gdmFsIC8gNTAwOworCQl9CisJCWJyZWFrOworCisJY2FzZSBIWVNURVJTSVM6CisJCS8qIFRoZSB2YWx1ZSB3aWxsIGJlIGdpdmVuIGFzIGFuIGFic29sdXRlIHZhbHVlLCB0dXJuIGl0CisJCSAgIGludG8gYW4gb2Zmc2V0IGJhc2VkIG9uIFRIRVJNICovCisKKwkJLyogUmVhZCBmcmVzaCBUSEVSTSBhbmQgSFlTVEVSU0lTIHZhbHVlcyBmcm9tIHRoZSBjaGlwICovCisJCWRhdGEtPnRlbXBbVEhFUk1dW3NhdHRyLT5pbmRleF0gPQorCQkJYWR0NzQ3NV9yZWFkKFRFTVBfVEhFUk1fUkVHKHNhdHRyLT5pbmRleCkpIDw8IDI7CisJCWFkdDc0NzVfcmVhZF9oeXN0ZXJzaXMoY2xpZW50KTsKKworCQl0ZW1wID0gcmVnMnRlbXAoZGF0YSwgZGF0YS0+dGVtcFtUSEVSTV1bc2F0dHItPmluZGV4XSk7CisJCXZhbCA9IFNFTlNPUlNfTElNSVQodmFsLCB0ZW1wIC0gMTUwMDAsIHRlbXApOworCQl2YWwgPSAodGVtcCAtIHZhbCkgLyAxMDAwOworCisJCWlmIChzYXR0ci0+aW5kZXggIT0gMSkgeworCQkJZGF0YS0+dGVtcFtIWVNURVJTSVNdW3NhdHRyLT5pbmRleF0gJj0gMHhGMDsKKwkJCWRhdGEtPnRlbXBbSFlTVEVSU0lTXVtzYXR0ci0+aW5kZXhdIHw9ICh2YWwgJiAweEYpIDw8IDQ7CisJCX0gZWxzZSB7CisJCQlkYXRhLT50ZW1wW0hZU1RFUlNJU11bc2F0dHItPmluZGV4XSAmPSAweDBGOworCQkJZGF0YS0+dGVtcFtIWVNURVJTSVNdW3NhdHRyLT5pbmRleF0gfD0gKHZhbCAmIDB4Rik7CisJCX0KKworCQlvdXQgPSBkYXRhLT50ZW1wW0hZU1RFUlNJU11bc2F0dHItPmluZGV4XTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlkYXRhLT50ZW1wW3NhdHRyLT5ucl1bc2F0dHItPmluZGV4XSA9IHRlbXAycmVnKGRhdGEsIHZhbCk7CisKKwkJLyogV2UgbWFpbnRhaW4gYW4gZXh0cmEgMiBkaWdpdHMgb2YgcHJlY2lzaW9uIGZvciBzaW1wbGljaXR5CisJCSAqIC0gc2hpZnQgdGhvc2UgYmFjayBvZmYgYmVmb3JlIHdyaXRpbmcgdGhlIHZhbHVlICovCisJCW91dCA9ICh1OCkgKGRhdGEtPnRlbXBbc2F0dHItPm5yXVtzYXR0ci0+aW5kZXhdID4+IDIpOworCX0KKworCXN3aXRjaCAoc2F0dHItPm5yKSB7CisJY2FzZSBNSU46CisJCXJlZyA9IFRFTVBfTUlOX1JFRyhzYXR0ci0+aW5kZXgpOworCQlicmVhazsKKwljYXNlIE1BWDoKKwkJcmVnID0gVEVNUF9NQVhfUkVHKHNhdHRyLT5pbmRleCk7CisJCWJyZWFrOworCWNhc2UgT0ZGU0VUOgorCQlyZWcgPSBURU1QX09GRlNFVF9SRUcoc2F0dHItPmluZGV4KTsKKwkJYnJlYWs7CisJY2FzZSBBVVRPTUlOOgorCQlyZWcgPSBURU1QX1RNSU5fUkVHKHNhdHRyLT5pbmRleCk7CisJCWJyZWFrOworCWNhc2UgVEhFUk06CisJCXJlZyA9IFRFTVBfVEhFUk1fUkVHKHNhdHRyLT5pbmRleCk7CisJCWJyZWFrOworCWNhc2UgSFlTVEVSU0lTOgorCQlpZiAoc2F0dHItPmluZGV4ICE9IDIpCisJCQlyZWcgPSBSRUdfUkVNT1RFMV9IWVNURVJTSVM7CisJCWVsc2UKKwkJCXJlZyA9IFJFR19SRU1PVEUyX0hZU1RFUlNJUzsKKworCQlicmVhazsKKwl9CisKKwlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgcmVnLCBvdXQpOworCisJbXV0ZXhfdW5sb2NrKCZkYXRhLT5sb2NrKTsKKwlyZXR1cm4gY291bnQ7Cit9CisKKy8qIFRhYmxlIG9mIGF1dG9yYW5nZSB2YWx1ZXMgLSB0aGUgdXNlciB3aWxsIHdyaXRlIHRoZSB2YWx1ZSBpbiBtaWxsaWRlZ3JlZXMsCisgICBhbmQgd2UnbGwgY29udmVydCBpdCAqLworc3RhdGljIGNvbnN0IGludCBhdXRvcmFuZ2VfdGFibGVbXSA9IHsKKwkyMDAwLCAyNTAwLCAzMzMwLCA0MDAwLCA1MDAwLCA2NjcwLCA4MDAwLAorCTEwMDAwLCAxMzMzMCwgMTYwMDAsIDIwMDAwLCAyNjY3MCwgMzIwMDAsIDQwMDAwLAorCTUzMzMwLCA4MDAwMAorfTsKKworc3RhdGljIHNzaXplX3Qgc2hvd19wb2ludDIoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgYWR0NzQ3NV9kYXRhICpkYXRhID0gYWR0NzQ3NV91cGRhdGVfZGV2aWNlKGRldik7CisJc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlXzIgKnNhdHRyID0gdG9fc2Vuc29yX2Rldl9hdHRyXzIoYXR0cik7CisJaW50IG91dCwgdmFsOworCisJbXV0ZXhfbG9jaygmZGF0YS0+bG9jayk7CisJb3V0ID0gKGRhdGEtPnJhbmdlW3NhdHRyLT5pbmRleF0gPj4gNCkgJiAweDBGOworCXZhbCA9IHJlZzJ0ZW1wKGRhdGEsIGRhdGEtPnRlbXBbQVVUT01JTl1bc2F0dHItPmluZGV4XSk7CisJbXV0ZXhfdW5sb2NrKCZkYXRhLT5sb2NrKTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCB2YWwgKyBhdXRvcmFuZ2VfdGFibGVbb3V0XSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNldF9wb2ludDIoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgYWR0NzQ3NV9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlXzIgKnNhdHRyID0gdG9fc2Vuc29yX2Rldl9hdHRyXzIoYXR0cik7CisJaW50IHRlbXA7CisJbG9uZyB2YWw7CisKKwlpZiAoc3RyaWN0X3N0cnRvbChidWYsIDEwLCAmdmFsKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltdXRleF9sb2NrKCZkYXRhLT5sb2NrKTsKKworCS8qIEdldCBhIGZyZXNoIGNvcHkgb2YgdGhlIG5lZWRlZCByZWdpc3RlcnMgKi8KKwlkYXRhLT5jb25maWc1ID0gYWR0NzQ3NV9yZWFkKFJFR19DT05GSUc1KTsKKwlkYXRhLT50ZW1wW0FVVE9NSU5dW3NhdHRyLT5pbmRleF0gPQorCQlhZHQ3NDc1X3JlYWQoVEVNUF9UTUlOX1JFRyhzYXR0ci0+aW5kZXgpKSA8PCAyOworCWRhdGEtPnJhbmdlW3NhdHRyLT5pbmRleF0gPQorCQlhZHQ3NDc1X3JlYWQoVEVNUF9UUkFOR0VfUkVHKHNhdHRyLT5pbmRleCkpOworCisJLyogVGhlIHVzZXIgd2lsbCB3cml0ZSBhbiBhYnNvbHV0ZSB2YWx1ZSwgc28gc3VidHJhY3QgdGhlIHN0YXJ0IHBvaW50CisJICAgdG8gZmlndXJlIHRoZSByYW5nZSAqLworCXRlbXAgPSByZWcydGVtcChkYXRhLCBkYXRhLT50ZW1wW0FVVE9NSU5dW3NhdHRyLT5pbmRleF0pOworCXZhbCA9IFNFTlNPUlNfTElNSVQodmFsLCB0ZW1wICsgYXV0b3JhbmdlX3RhYmxlWzBdLAorCQl0ZW1wICsgYXV0b3JhbmdlX3RhYmxlW0FSUkFZX1NJWkUoYXV0b3JhbmdlX3RhYmxlKSAtIDFdKTsKKwl2YWwgLT0gdGVtcDsKKworCS8qIEZpbmQgdGhlIG5lYXJlc3QgdGFibGUgZW50cnkgdG8gd2hhdCB0aGUgdXNlciB3cm90ZSAqLworCXZhbCA9IGZpbmRfbmVhcmVzdCh2YWwsIGF1dG9yYW5nZV90YWJsZSwgQVJSQVlfU0laRShhdXRvcmFuZ2VfdGFibGUpKTsKKworCWRhdGEtPnJhbmdlW3NhdHRyLT5pbmRleF0gJj0gfjB4RjA7CisJZGF0YS0+cmFuZ2Vbc2F0dHItPmluZGV4XSB8PSB2YWwgPDwgNDsKKworCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBURU1QX1RSQU5HRV9SRUcoc2F0dHItPmluZGV4KSwKKwkJCQkgIGRhdGEtPnJhbmdlW3NhdHRyLT5pbmRleF0pOworCisJbXV0ZXhfdW5sb2NrKCZkYXRhLT5sb2NrKTsKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfdGFjaChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgYWR0NzQ3NV9kYXRhICpkYXRhID0gYWR0NzQ3NV91cGRhdGVfZGV2aWNlKGRldik7CisJc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlXzIgKnNhdHRyID0gdG9fc2Vuc29yX2Rldl9hdHRyXzIoYXR0cik7CisJaW50IG91dDsKKworCWlmIChzYXR0ci0+bnIgPT0gQUxBUk0pCisJCW91dCA9IChkYXRhLT5hbGFybXMgPj4gKHNhdHRyLT5pbmRleCArIDEwKSkgJiAxOworCWVsc2UKKwkJb3V0ID0gdGFjaDJycG0oZGF0YS0+dGFjaFtzYXR0ci0+bnJdW3NhdHRyLT5pbmRleF0pOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIG91dCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNldF90YWNoKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKworCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZV8yICpzYXR0ciA9IHRvX3NlbnNvcl9kZXZfYXR0cl8yKGF0dHIpOworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IGFkdDc0NzVfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXVuc2lnbmVkIGxvbmcgdmFsOworCisJaWYgKHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMTAsICZ2YWwpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW11dGV4X2xvY2soJmRhdGEtPmxvY2spOworCisJZGF0YS0+dGFjaFtNSU5dW3NhdHRyLT5pbmRleF0gPSBycG0ydGFjaCh2YWwpOworCisJYWR0NzQ3NV93cml0ZV93b3JkKGNsaWVudCwgVEFDSF9NSU5fUkVHKHNhdHRyLT5pbmRleCksCisJCQkgICBkYXRhLT50YWNoW01JTl1bc2F0dHItPmluZGV4XSk7CisKKwltdXRleF91bmxvY2soJmRhdGEtPmxvY2spOworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHNzaXplX3Qgc2hvd19wd20oc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgYWR0NzQ3NV9kYXRhICpkYXRhID0gYWR0NzQ3NV91cGRhdGVfZGV2aWNlKGRldik7CisJc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlXzIgKnNhdHRyID0gdG9fc2Vuc29yX2Rldl9hdHRyXzIoYXR0cik7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgZGF0YS0+cHdtW3NhdHRyLT5ucl1bc2F0dHItPmluZGV4XSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfcHdtY2hhbihzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJICAgIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgYWR0NzQ3NV9kYXRhICpkYXRhID0gYWR0NzQ3NV91cGRhdGVfZGV2aWNlKGRldik7CisJc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlXzIgKnNhdHRyID0gdG9fc2Vuc29yX2Rldl9hdHRyXzIoYXR0cik7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgZGF0YS0+cHdtY2hhbltzYXR0ci0+aW5kZXhdKTsKK30KKworc3RhdGljIHNzaXplX3Qgc2hvd19wd21jdHJsKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICAgY2hhciAqYnVmKQoreworCXN0cnVjdCBhZHQ3NDc1X2RhdGEgKmRhdGEgPSBhZHQ3NDc1X3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwlzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGVfMiAqc2F0dHIgPSB0b19zZW5zb3JfZGV2X2F0dHJfMihhdHRyKTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBkYXRhLT5wd21jdGxbc2F0dHItPmluZGV4XSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNldF9wd20oc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJICAgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCisJc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlXzIgKnNhdHRyID0gdG9fc2Vuc29yX2Rldl9hdHRyXzIoYXR0cik7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgYWR0NzQ3NV9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJdW5zaWduZWQgY2hhciByZWcgPSAwOworCWxvbmcgdmFsOworCisJaWYgKHN0cmljdF9zdHJ0b2woYnVmLCAxMCwgJnZhbCkpCisJCXJldHVybiAtRUlOVkFMOworCisJbXV0ZXhfbG9jaygmZGF0YS0+bG9jayk7CisKKwlzd2l0Y2ggKHNhdHRyLT5ucikgeworCWNhc2UgSU5QVVQ6CisJCS8qIEdldCBhIGZyZXNoIHZhbHVlIGZvciBDT05UUk9MICovCisJCWRhdGEtPnB3bVtDT05UUk9MXVtzYXR0ci0+aW5kZXhdID0KKwkJCWFkdDc0NzVfcmVhZChQV01fQ09ORklHX1JFRyhzYXR0ci0+aW5kZXgpKTsKKworCQkvKiBJZiB3ZSBhcmUgbm90IGluIG1hbnVhbCBtb2RlLCB0aGVuIHdlIHNob3VsZG4ndCBhbGxvdworCQkgKiB0aGUgdXNlciB0byBzZXQgdGhlIHB3bSBzcGVlZCAqLworCQlpZiAoKChkYXRhLT5wd21bQ09OVFJPTF1bc2F0dHItPmluZGV4XSA+PiA1KSAmIDcpICE9IDcpIHsKKwkJCW11dGV4X3VubG9jaygmZGF0YS0+bG9jayk7CisJCQlyZXR1cm4gY291bnQ7CisJCX0KKworCQlyZWcgPSBQV01fUkVHKHNhdHRyLT5pbmRleCk7CisJCWJyZWFrOworCisJY2FzZSBNSU46CisJCXJlZyA9IFBXTV9NSU5fUkVHKHNhdHRyLT5pbmRleCk7CisJCWJyZWFrOworCisJY2FzZSBNQVg6CisJCXJlZyA9IFBXTV9NQVhfUkVHKHNhdHRyLT5pbmRleCk7CisJCWJyZWFrOworCX0KKworCWRhdGEtPnB3bVtzYXR0ci0+bnJdW3NhdHRyLT5pbmRleF0gPSBTRU5TT1JTX0xJTUlUKHZhbCwgMCwgMHhGRik7CisJaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIHJlZywKKwkJCQkgIGRhdGEtPnB3bVtzYXR0ci0+bnJdW3NhdHRyLT5pbmRleF0pOworCisJbXV0ZXhfdW5sb2NrKCZkYXRhLT5sb2NrKTsKKworCXJldHVybiBjb3VudDsKK30KKworLyogQ2FsbGVkIGJ5IHNldF9wd21jdHJsIGFuZCBzZXRfcHdtY2hhbiAqLworCitzdGF0aWMgaW50IGh3X3NldF9wd20oc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgaW50IGluZGV4LAorCQkgICAgICB1bnNpZ25lZCBpbnQgcHdtY3RsLCB1bnNpZ25lZCBpbnQgcHdtY2hhbikKK3sKKwlzdHJ1Y3QgYWR0NzQ3NV9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJbG9uZyB2YWwgPSAwOworCisJc3dpdGNoIChwd21jdGwpIHsKKwljYXNlIDA6CisJCXZhbCA9IDB4MDM7CS8qIFJ1biBhdCBmdWxsIHNwZWVkICovCisJCWJyZWFrOworCWNhc2UgMToKKwkJdmFsID0gMHgwNzsJLyogTWFudWFsIG1vZGUgKi8KKwkJYnJlYWs7CisJY2FzZSAyOgorCQlzd2l0Y2ggKHB3bWNoYW4pIHsKKwkJY2FzZSAxOgorCQkJLyogUmVtb3RlMSBjb250cm9scyBQV00gKi8KKwkJCXZhbCA9IDB4MDA7CisJCQlicmVhazsKKwkJY2FzZSAyOgorCQkJLyogbG9jYWwgY29udHJvbHMgUFdNICovCisJCQl2YWwgPSAweDAxOworCQkJYnJlYWs7CisJCWNhc2UgNDoKKwkJCS8qIHJlbW90ZTIgY29udHJvbHMgUFdNICovCisJCQl2YWwgPSAweDAyOworCQkJYnJlYWs7CisJCWNhc2UgNjoKKwkJCS8qIGxvY2FsL3JlbW90ZTIgY29udHJvbCBQV00gKi8KKwkJCXZhbCA9IDB4MDU7CisJCQlicmVhazsKKwkJY2FzZSA3OgorCQkJLyogQWxsIHRocmVlIGNvbnRyb2wgUFdNICovCisJCQl2YWwgPSAweDA2OworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlkYXRhLT5wd21jdGxbaW5kZXhdID0gcHdtY3RsOworCWRhdGEtPnB3bWNoYW5baW5kZXhdID0gcHdtY2hhbjsKKworCWRhdGEtPnB3bVtDT05UUk9MXVtpbmRleF0gJj0gfjB4RTA7CisJZGF0YS0+cHdtW0NPTlRST0xdW2luZGV4XSB8PSAodmFsICYgNykgPDwgNTsKKworCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBQV01fQ09ORklHX1JFRyhpbmRleCksCisJCQkJICBkYXRhLT5wd21bQ09OVFJPTF1baW5kZXhdKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3NpemVfdCBzZXRfcHdtY2hhbihzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlXzIgKnNhdHRyID0gdG9fc2Vuc29yX2Rldl9hdHRyXzIoYXR0cik7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgYWR0NzQ3NV9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJaW50IHI7CisJbG9uZyB2YWw7CisKKwlpZiAoc3RyaWN0X3N0cnRvbChidWYsIDEwLCAmdmFsKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltdXRleF9sb2NrKCZkYXRhLT5sb2NrKTsKKwkvKiBSZWFkIE1vZGlmeSBXcml0ZSBQV00gdmFsdWVzICovCisJYWR0NzQ3NV9yZWFkX3B3bShjbGllbnQsIHNhdHRyLT5pbmRleCk7CisJciA9IGh3X3NldF9wd20oY2xpZW50LCBzYXR0ci0+aW5kZXgsIGRhdGEtPnB3bWN0bFtzYXR0ci0+aW5kZXhdLCB2YWwpOworCWlmIChyKQorCQljb3VudCA9IHI7CisJbXV0ZXhfdW5sb2NrKCZkYXRhLT5sb2NrKTsKKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHNzaXplX3Qgc2V0X3B3bWN0cmwoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZV8yICpzYXR0ciA9IHRvX3NlbnNvcl9kZXZfYXR0cl8yKGF0dHIpOworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IGFkdDc0NzVfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCWludCByOworCWxvbmcgdmFsOworCisJaWYgKHN0cmljdF9zdHJ0b2woYnVmLCAxMCwgJnZhbCkpCisJCXJldHVybiAtRUlOVkFMOworCisJbXV0ZXhfbG9jaygmZGF0YS0+bG9jayk7CisJLyogUmVhZCBNb2RpZnkgV3JpdGUgUFdNIHZhbHVlcyAqLworCWFkdDc0NzVfcmVhZF9wd20oY2xpZW50LCBzYXR0ci0+aW5kZXgpOworCXIgPSBod19zZXRfcHdtKGNsaWVudCwgc2F0dHItPmluZGV4LCB2YWwsIGRhdGEtPnB3bWNoYW5bc2F0dHItPmluZGV4XSk7CisJaWYgKHIpCisJCWNvdW50ID0gcjsKKwltdXRleF91bmxvY2soJmRhdGEtPmxvY2spOworCisJcmV0dXJuIGNvdW50OworfQorCisvKiBMaXN0IG9mIGZyZXF1ZW5jaWVzIGZvciB0aGUgUFdNICovCitzdGF0aWMgY29uc3QgaW50IHB3bWZyZXFfdGFibGVbXSA9IHsKKwkxMSwgMTQsIDIyLCAyOSwgMzUsIDQ0LCA1OCwgODgKK307CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfcHdtZnJlcShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJICAgIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgYWR0NzQ3NV9kYXRhICpkYXRhID0gYWR0NzQ3NV91cGRhdGVfZGV2aWNlKGRldik7CisJc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlXzIgKnNhdHRyID0gdG9fc2Vuc29yX2Rldl9hdHRyXzIoYXR0cik7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwKKwkJICAgICAgIHB3bWZyZXFfdGFibGVbZGF0YS0+cmFuZ2Vbc2F0dHItPmluZGV4XSAmIDddKTsKK30KKworc3RhdGljIHNzaXplX3Qgc2V0X3B3bWZyZXEoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZV8yICpzYXR0ciA9IHRvX3NlbnNvcl9kZXZfYXR0cl8yKGF0dHIpOworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IGFkdDc0NzVfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCWludCBvdXQ7CisJbG9uZyB2YWw7CisKKwlpZiAoc3RyaWN0X3N0cnRvbChidWYsIDEwLCAmdmFsKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlvdXQgPSBmaW5kX25lYXJlc3QodmFsLCBwd21mcmVxX3RhYmxlLCBBUlJBWV9TSVpFKHB3bWZyZXFfdGFibGUpKTsKKworCW11dGV4X2xvY2soJmRhdGEtPmxvY2spOworCisJZGF0YS0+cmFuZ2Vbc2F0dHItPmluZGV4XSA9CisJCWFkdDc0NzVfcmVhZChURU1QX1RSQU5HRV9SRUcoc2F0dHItPmluZGV4KSk7CisJZGF0YS0+cmFuZ2Vbc2F0dHItPmluZGV4XSAmPSB+NzsKKwlkYXRhLT5yYW5nZVtzYXR0ci0+aW5kZXhdIHw9IG91dDsKKworCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBURU1QX1RSQU5HRV9SRUcoc2F0dHItPmluZGV4KSwKKwkJCQkgIGRhdGEtPnJhbmdlW3NhdHRyLT5pbmRleF0pOworCisJbXV0ZXhfdW5sb2NrKCZkYXRhLT5sb2NrKTsKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFJfMihpbjFfaW5wdXQsIFNfSVJVR08sIHNob3dfdm9sdGFnZSwgTlVMTCwgSU5QVVQsIDApOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUl8yKGluMV9tYXgsIFNfSVJVR08gfCBTX0lXVVNSLCBzaG93X3ZvbHRhZ2UsCisJCQkgICAgc2V0X3ZvbHRhZ2UsIE1BWCwgMCk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSXzIoaW4xX21pbiwgU19JUlVHTyB8IFNfSVdVU1IsIHNob3dfdm9sdGFnZSwKKwkJCSAgICBzZXRfdm9sdGFnZSwgTUlOLCAwKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFJfMihpbjFfYWxhcm0sIFNfSVJVR08sIHNob3dfdm9sdGFnZSwgTlVMTCwgQUxBUk0sIDApOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUl8yKGluMl9pbnB1dCwgU19JUlVHTywgc2hvd192b2x0YWdlLCBOVUxMLCBJTlBVVCwgMSk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSXzIoaW4yX21heCwgU19JUlVHTyB8IFNfSVdVU1IsIHNob3dfdm9sdGFnZSwKKwkJCSAgICBzZXRfdm9sdGFnZSwgTUFYLCAxKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFJfMihpbjJfbWluLCBTX0lSVUdPIHwgU19JV1VTUiwgc2hvd192b2x0YWdlLAorCQkJICAgIHNldF92b2x0YWdlLCBNSU4sIDEpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUl8yKGluMl9hbGFybSwgU19JUlVHTywgc2hvd192b2x0YWdlLCBOVUxMLCBBTEFSTSwgMSk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSXzIodGVtcDFfaW5wdXQsIFNfSVJVR08sIHNob3dfdGVtcCwgTlVMTCwgSU5QVVQsIDApOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUl8yKHRlbXAxX2FsYXJtLCBTX0lSVUdPLCBzaG93X3RlbXAsIE5VTEwsIEFMQVJNLCAwKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFJfMih0ZW1wMV9mYXVsdCwgU19JUlVHTywgc2hvd190ZW1wLCBOVUxMLCBGQVVMVCwgMCk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSXzIodGVtcDFfbWF4LCBTX0lSVUdPIHwgU19JV1VTUiwgc2hvd190ZW1wLCBzZXRfdGVtcCwKKwkJCSAgICBNQVgsIDApOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUl8yKHRlbXAxX21pbiwgU19JUlVHTyB8IFNfSVdVU1IsIHNob3dfdGVtcCwgc2V0X3RlbXAsCisJCQkgICAgTUlOLCAwKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFJfMih0ZW1wMV9vZmZzZXQsIFNfSVJVR08gfCBTX0lXVVNSLCBzaG93X3RlbXAsCisJCQkgICAgc2V0X3RlbXAsIE9GRlNFVCwgMCk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSXzIodGVtcDFfYXV0b19wb2ludDFfdGVtcCwgU19JUlVHTyB8IFNfSVdVU1IsCisJCQkgICAgc2hvd190ZW1wLCBzZXRfdGVtcCwgQVVUT01JTiwgMCk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSXzIodGVtcDFfYXV0b19wb2ludDJfdGVtcCwgU19JUlVHTyB8IFNfSVdVU1IsCisJCQkgICAgc2hvd19wb2ludDIsIHNldF9wb2ludDIsIDAsIDApOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUl8yKHRlbXAxX2NyaXQsIFNfSVJVR08gfCBTX0lXVVNSLCBzaG93X3RlbXAsIHNldF90ZW1wLAorCQkJICAgIFRIRVJNLCAwKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFJfMih0ZW1wMV9jcml0X2h5c3QsIFNfSVJVR08gfCBTX0lXVVNSLCBzaG93X3RlbXAsCisJCQkgICAgc2V0X3RlbXAsIEhZU1RFUlNJUywgMCk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSXzIodGVtcDJfaW5wdXQsIFNfSVJVR08sIHNob3dfdGVtcCwgTlVMTCwgSU5QVVQsIDEpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUl8yKHRlbXAyX2FsYXJtLCBTX0lSVUdPLCBzaG93X3RlbXAsIE5VTEwsIEFMQVJNLCAxKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFJfMih0ZW1wMl9tYXgsIFNfSVJVR08gfCBTX0lXVVNSLCBzaG93X3RlbXAsIHNldF90ZW1wLAorCQkJICAgIE1BWCwgMSk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSXzIodGVtcDJfbWluLCBTX0lSVUdPIHwgU19JV1VTUiwgc2hvd190ZW1wLCBzZXRfdGVtcCwKKwkJCSAgICBNSU4sIDEpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUl8yKHRlbXAyX29mZnNldCwgU19JUlVHTyB8IFNfSVdVU1IsIHNob3dfdGVtcCwKKwkJCSAgICBzZXRfdGVtcCwgT0ZGU0VULCAxKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFJfMih0ZW1wMl9hdXRvX3BvaW50MV90ZW1wLCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJCSAgICBzaG93X3RlbXAsIHNldF90ZW1wLCBBVVRPTUlOLCAxKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFJfMih0ZW1wMl9hdXRvX3BvaW50Ml90ZW1wLCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJCSAgICBzaG93X3BvaW50Miwgc2V0X3BvaW50MiwgMCwgMSk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSXzIodGVtcDJfY3JpdCwgU19JUlVHTyB8IFNfSVdVU1IsIHNob3dfdGVtcCwgc2V0X3RlbXAsCisJCQkgICAgVEhFUk0sIDEpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUl8yKHRlbXAyX2NyaXRfaHlzdCwgU19JUlVHTyB8IFNfSVdVU1IsIHNob3dfdGVtcCwKKwkJCSAgICBzZXRfdGVtcCwgSFlTVEVSU0lTLCAxKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFJfMih0ZW1wM19pbnB1dCwgU19JUlVHTywgc2hvd190ZW1wLCBOVUxMLCBJTlBVVCwgMik7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSXzIodGVtcDNfYWxhcm0sIFNfSVJVR08sIHNob3dfdGVtcCwgTlVMTCwgQUxBUk0sIDIpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUl8yKHRlbXAzX2ZhdWx0LCBTX0lSVUdPLCBzaG93X3RlbXAsIE5VTEwsIEZBVUxULCAyKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFJfMih0ZW1wM19tYXgsIFNfSVJVR08gfCBTX0lXVVNSLCBzaG93X3RlbXAsIHNldF90ZW1wLAorCQkJICAgIE1BWCwgMik7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSXzIodGVtcDNfbWluLCBTX0lSVUdPIHwgU19JV1VTUiwgc2hvd190ZW1wLCBzZXRfdGVtcCwKKwkJCSAgICBNSU4sIDIpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUl8yKHRlbXAzX29mZnNldCwgU19JUlVHTyB8IFNfSVdVU1IsIHNob3dfdGVtcCwKKwkJCSAgICBzZXRfdGVtcCwgT0ZGU0VULCAyKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFJfMih0ZW1wM19hdXRvX3BvaW50MV90ZW1wLCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJCSAgICBzaG93X3RlbXAsIHNldF90ZW1wLCBBVVRPTUlOLCAyKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFJfMih0ZW1wM19hdXRvX3BvaW50Ml90ZW1wLCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJCSAgICBzaG93X3BvaW50Miwgc2V0X3BvaW50MiwgMCwgMik7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSXzIodGVtcDNfY3JpdCwgU19JUlVHTyB8IFNfSVdVU1IsIHNob3dfdGVtcCwgc2V0X3RlbXAsCisJCQkgICAgVEhFUk0sIDIpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUl8yKHRlbXAzX2NyaXRfaHlzdCwgU19JUlVHTyB8IFNfSVdVU1IsIHNob3dfdGVtcCwKKwkJCSAgICBzZXRfdGVtcCwgSFlTVEVSU0lTLCAyKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFJfMihmYW4xX2lucHV0LCBTX0lSVUdPLCBzaG93X3RhY2gsIE5VTEwsIElOUFVULCAwKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFJfMihmYW4xX21pbiwgU19JUlVHTyB8IFNfSVdVU1IsIHNob3dfdGFjaCwgc2V0X3RhY2gsCisJCQkgICAgTUlOLCAwKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFJfMihmYW4xX2FsYXJtLCBTX0lSVUdPLCBzaG93X3RhY2gsIE5VTEwsIEFMQVJNLCAwKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFJfMihmYW4yX2lucHV0LCBTX0lSVUdPLCBzaG93X3RhY2gsIE5VTEwsIElOUFVULCAxKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFJfMihmYW4yX21pbiwgU19JUlVHTyB8IFNfSVdVU1IsIHNob3dfdGFjaCwgc2V0X3RhY2gsCisJCQkgICAgTUlOLCAxKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFJfMihmYW4yX2FsYXJtLCBTX0lSVUdPLCBzaG93X3RhY2gsIE5VTEwsIEFMQVJNLCAxKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFJfMihmYW4zX2lucHV0LCBTX0lSVUdPLCBzaG93X3RhY2gsIE5VTEwsIElOUFVULCAyKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFJfMihmYW4zX21pbiwgU19JUlVHTyB8IFNfSVdVU1IsIHNob3dfdGFjaCwgc2V0X3RhY2gsCisJCQkgICAgTUlOLCAyKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFJfMihmYW4zX2FsYXJtLCBTX0lSVUdPLCBzaG93X3RhY2gsIE5VTEwsIEFMQVJNLCAyKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFJfMihmYW40X2lucHV0LCBTX0lSVUdPLCBzaG93X3RhY2gsIE5VTEwsIElOUFVULCAzKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFJfMihmYW40X21pbiwgU19JUlVHTyB8IFNfSVdVU1IsIHNob3dfdGFjaCwgc2V0X3RhY2gsCisJCQkgICAgTUlOLCAzKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFJfMihmYW40X2FsYXJtLCBTX0lSVUdPLCBzaG93X3RhY2gsIE5VTEwsIEFMQVJNLCAzKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFJfMihwd20xLCBTX0lSVUdPIHwgU19JV1VTUiwgc2hvd19wd20sIHNldF9wd20sIElOUFVULAorCQkJICAgIDApOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUl8yKHB3bTFfZnJlcSwgU19JUlVHTyB8IFNfSVdVU1IsIHNob3dfcHdtZnJlcSwKKwkJCSAgICBzZXRfcHdtZnJlcSwgSU5QVVQsIDApOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUl8yKHB3bTFfZW5hYmxlLCBTX0lSVUdPIHwgU19JV1VTUiwgc2hvd19wd21jdHJsLAorCQkJICAgIHNldF9wd21jdHJsLCBJTlBVVCwgMCk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSXzIocHdtMV9hdXRvX2NoYW5uZWxfdGVtcCwgU19JUlVHTyB8IFNfSVdVU1IsCisJCQkgICAgc2hvd19wd21jaGFuLCBzZXRfcHdtY2hhbiwgSU5QVVQsIDApOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUl8yKHB3bTFfYXV0b19wb2ludDFfcHdtLCBTX0lSVUdPIHwgU19JV1VTUiwgc2hvd19wd20sCisJCQkgICAgc2V0X3B3bSwgTUlOLCAwKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFJfMihwd20xX2F1dG9fcG9pbnQyX3B3bSwgU19JUlVHTyB8IFNfSVdVU1IsIHNob3dfcHdtLAorCQkJICAgIHNldF9wd20sIE1BWCwgMCk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSXzIocHdtMiwgU19JUlVHTyB8IFNfSVdVU1IsIHNob3dfcHdtLCBzZXRfcHdtLCBJTlBVVCwKKwkJCSAgICAxKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFJfMihwd20yX2ZyZXEsIFNfSVJVR08gfCBTX0lXVVNSLCBzaG93X3B3bWZyZXEsCisJCQkgICAgc2V0X3B3bWZyZXEsIElOUFVULCAxKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFJfMihwd20yX2VuYWJsZSwgU19JUlVHTyB8IFNfSVdVU1IsIHNob3dfcHdtY3RybCwKKwkJCSAgICBzZXRfcHdtY3RybCwgSU5QVVQsIDEpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUl8yKHB3bTJfYXV0b19jaGFubmVsX3RlbXAsIFNfSVJVR08gfCBTX0lXVVNSLAorCQkJICAgIHNob3dfcHdtY2hhbiwgc2V0X3B3bWNoYW4sIElOUFVULCAxKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFJfMihwd20yX2F1dG9fcG9pbnQxX3B3bSwgU19JUlVHTyB8IFNfSVdVU1IsIHNob3dfcHdtLAorCQkJICAgIHNldF9wd20sIE1JTiwgMSk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSXzIocHdtMl9hdXRvX3BvaW50Ml9wd20sIFNfSVJVR08gfCBTX0lXVVNSLCBzaG93X3B3bSwKKwkJCSAgICBzZXRfcHdtLCBNQVgsIDEpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUl8yKHB3bTMsIFNfSVJVR08gfCBTX0lXVVNSLCBzaG93X3B3bSwgc2V0X3B3bSwgSU5QVVQsCisJCQkgICAgMik7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSXzIocHdtM19mcmVxLCBTX0lSVUdPIHwgU19JV1VTUiwgc2hvd19wd21mcmVxLAorCQkJICAgIHNldF9wd21mcmVxLCBJTlBVVCwgMik7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSXzIocHdtM19lbmFibGUsIFNfSVJVR08gfCBTX0lXVVNSLCBzaG93X3B3bWN0cmwsCisJCQkgICAgc2V0X3B3bWN0cmwsIElOUFVULCAyKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFJfMihwd20zX2F1dG9fY2hhbm5lbF90ZW1wLCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJCSAgICBzaG93X3B3bWNoYW4sIHNldF9wd21jaGFuLCBJTlBVVCwgMik7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSXzIocHdtM19hdXRvX3BvaW50MV9wd20sIFNfSVJVR08gfCBTX0lXVVNSLCBzaG93X3B3bSwKKwkJCSAgICBzZXRfcHdtLCBNSU4sIDIpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUl8yKHB3bTNfYXV0b19wb2ludDJfcHdtLCBTX0lSVUdPIHwgU19JV1VTUiwgc2hvd19wd20sCisJCQkgICAgc2V0X3B3bSwgTUFYLCAyKTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmFkdDc0NzVfYXR0cnNbXSA9IHsKKwkmc2Vuc29yX2Rldl9hdHRyX2luMV9pbnB1dC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfaW4xX21heC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfaW4xX21pbi5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfaW4xX2FsYXJtLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9pbjJfaW5wdXQuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luMl9tYXguZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luMl9taW4uZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luMl9hbGFybS5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDFfaW5wdXQuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX3RlbXAxX2FsYXJtLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl90ZW1wMV9mYXVsdC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDFfbWF4LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl90ZW1wMV9taW4uZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX3RlbXAxX29mZnNldC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDFfYXV0b19wb2ludDFfdGVtcC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDFfYXV0b19wb2ludDJfdGVtcC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDFfY3JpdC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDFfY3JpdF9oeXN0LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl90ZW1wMl9pbnB1dC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDJfYWxhcm0uZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX3RlbXAyX21heC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDJfbWluLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl90ZW1wMl9vZmZzZXQuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX3RlbXAyX2F1dG9fcG9pbnQxX3RlbXAuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX3RlbXAyX2F1dG9fcG9pbnQyX3RlbXAuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX3RlbXAyX2NyaXQuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX3RlbXAyX2NyaXRfaHlzdC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDNfaW5wdXQuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX3RlbXAzX2ZhdWx0LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl90ZW1wM19hbGFybS5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDNfbWF4LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl90ZW1wM19taW4uZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX3RlbXAzX29mZnNldC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDNfYXV0b19wb2ludDFfdGVtcC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDNfYXV0b19wb2ludDJfdGVtcC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDNfY3JpdC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDNfY3JpdF9oeXN0LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9mYW4xX2lucHV0LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9mYW4xX21pbi5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfZmFuMV9hbGFybS5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfZmFuMl9pbnB1dC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfZmFuMl9taW4uZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2ZhbjJfYWxhcm0uZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2ZhbjNfaW5wdXQuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2ZhbjNfbWluLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9mYW4zX2FsYXJtLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9mYW40X2lucHV0LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9mYW40X21pbi5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfZmFuNF9hbGFybS5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfcHdtMS5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfcHdtMV9mcmVxLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9wd20xX2VuYWJsZS5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfcHdtMV9hdXRvX2NoYW5uZWxfdGVtcC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfcHdtMV9hdXRvX3BvaW50MV9wd20uZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX3B3bTFfYXV0b19wb2ludDJfcHdtLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9wd20yLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9wd20yX2ZyZXEuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX3B3bTJfZW5hYmxlLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9wd20yX2F1dG9fY2hhbm5lbF90ZW1wLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9wd20yX2F1dG9fcG9pbnQxX3B3bS5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfcHdtMl9hdXRvX3BvaW50Ml9wd20uZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX3B3bTMuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX3B3bTNfZnJlcS5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfcHdtM19lbmFibGUuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX3B3bTNfYXV0b19jaGFubmVsX3RlbXAuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX3B3bTNfYXV0b19wb2ludDFfcHdtLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9wd20zX2F1dG9fcG9pbnQyX3B3bS5kZXZfYXR0ci5hdHRyLAorCU5VTEwsCit9OworCitzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGFkdDc0NzVfYXR0cl9ncm91cCA9IHsgLmF0dHJzID0gYWR0NzQ3NV9hdHRycyB9OworCitzdGF0aWMgaW50IGFkdDc0NzVfZGV0ZWN0KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIGludCBraW5kLAorCQkJICBzdHJ1Y3QgaTJjX2JvYXJkX2luZm8gKmluZm8pCit7CisJc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyID0gY2xpZW50LT5hZGFwdGVyOworCisJaWYgKCFpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eShhZGFwdGVyLCBJMkNfRlVOQ19TTUJVU19CWVRFX0RBVEEpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWlmIChraW5kIDw9IDApIHsKKwkJaWYgKGFkdDc0NzVfcmVhZChSRUdfVkVORElEKSAhPSAweDQxIHx8CisJCSAgICBhZHQ3NDc1X3JlYWQoUkVHX0RFVklEKSAhPSAweDc1KSB7CisJCQlkZXZfZXJyKCZhZGFwdGVyLT5kZXYsCisJCQkJIkNvdWxkbid0IGRldGVjdCBhIGFkdDc0NzUgcGFydCBhdCAweCUwMnhcbiIsCisJCQkJKHVuc2lnbmVkIGludCljbGllbnQtPmFkZHIpOworCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0KKwl9CisKKwlzdHJsY3B5KGluZm8tPnR5cGUsIGFkdDc0NzVfaWRbMF0ubmFtZSwgSTJDX05BTUVfU0laRSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhZHQ3NDc1X3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJCQkgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQoreworCXN0cnVjdCBhZHQ3NDc1X2RhdGEgKmRhdGE7CisJaW50IGksIHJldCA9IDA7CisKKwlkYXRhID0ga3phbGxvYyhzaXplb2YoKmRhdGEpLCBHRlBfS0VSTkVMKTsKKwlpZiAoZGF0YSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCW11dGV4X2luaXQoJmRhdGEtPmxvY2spOworCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIGRhdGEpOworCisJLyogQ2FsbCBhZHQ3NDc1X3JlYWRfcHdtIGZvciBhbGwgcHdtJ3MgYXMgdGhpcyB3aWxsIHJlcHJvZ3JhbSBhbnkKKwkgICBwd20ncyB3aGljaCBhcmUgZGlzYWJsZWQgdG8gbWFudWFsIG1vZGUgd2l0aCAwJSBkdXR5IGN5Y2xlICovCisJZm9yIChpID0gMDsgaSA8IEFEVDc0NzVfUFdNX0NPVU5UOyBpKyspCisJCWFkdDc0NzVfcmVhZF9wd20oY2xpZW50LCBpKTsKKworCXJldCA9IHN5c2ZzX2NyZWF0ZV9ncm91cCgmY2xpZW50LT5kZXYua29iaiwgJmFkdDc0NzVfYXR0cl9ncm91cCk7CisJaWYgKHJldCkKKwkJZ290byBlZnJlZTsKKworCWRhdGEtPmh3bW9uX2RldiA9IGh3bW9uX2RldmljZV9yZWdpc3RlcigmY2xpZW50LT5kZXYpOworCWlmIChJU19FUlIoZGF0YS0+aHdtb25fZGV2KSkgeworCQlyZXQgPSBQVFJfRVJSKGRhdGEtPmh3bW9uX2Rldik7CisJCWdvdG8gZXJlbW92ZTsKKwl9CisKKwlyZXR1cm4gMDsKKworZXJlbW92ZToKKwlzeXNmc19yZW1vdmVfZ3JvdXAoJmNsaWVudC0+ZGV2LmtvYmosICZhZHQ3NDc1X2F0dHJfZ3JvdXApOworZWZyZWU6CisJa2ZyZWUoZGF0YSk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhZHQ3NDc1X3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXN0cnVjdCBhZHQ3NDc1X2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKworCWh3bW9uX2RldmljZV91bnJlZ2lzdGVyKGRhdGEtPmh3bW9uX2Rldik7CisJc3lzZnNfcmVtb3ZlX2dyb3VwKCZjbGllbnQtPmRldi5rb2JqLCAmYWR0NzQ3NV9hdHRyX2dyb3VwKTsKKwlrZnJlZShkYXRhKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgYWR0NzQ3NV9kcml2ZXIgPSB7CisJLmNsYXNzCQk9IEkyQ19DTEFTU19IV01PTiwKKwkuZHJpdmVyID0geworCQkubmFtZQk9ICJhZHQ3NDc1IiwKKwl9LAorCS5wcm9iZQkJPSBhZHQ3NDc1X3Byb2JlLAorCS5yZW1vdmUJCT0gYWR0NzQ3NV9yZW1vdmUsCisJLmlkX3RhYmxlCT0gYWR0NzQ3NV9pZCwKKwkuZGV0ZWN0CQk9IGFkdDc0NzVfZGV0ZWN0LAorCS5hZGRyZXNzX2RhdGEJPSAmYWRkcl9kYXRhLAorfTsKKworc3RhdGljIHZvaWQgYWR0NzQ3NV9yZWFkX2h5c3RlcnNpcyhzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXN0cnVjdCBhZHQ3NDc1X2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKworCWRhdGEtPnRlbXBbSFlTVEVSU0lTXVswXSA9ICh1MTYpIGFkdDc0NzVfcmVhZChSRUdfUkVNT1RFMV9IWVNURVJTSVMpOworCWRhdGEtPnRlbXBbSFlTVEVSU0lTXVsxXSA9IGRhdGEtPnRlbXBbSFlTVEVSU0lTXVswXTsKKwlkYXRhLT50ZW1wW0hZU1RFUlNJU11bMl0gPSAodTE2KSBhZHQ3NDc1X3JlYWQoUkVHX1JFTU9URTJfSFlTVEVSU0lTKTsKK30KKworc3RhdGljIHZvaWQgYWR0NzQ3NV9yZWFkX3B3bShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBpbnQgaW5kZXgpCit7CisJc3RydWN0IGFkdDc0NzVfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXVuc2lnbmVkIGludCB2OworCisJZGF0YS0+cHdtW0NPTlRST0xdW2luZGV4XSA9IGFkdDc0NzVfcmVhZChQV01fQ09ORklHX1JFRyhpbmRleCkpOworCisJLyogRmlndXJlIG91dCB0aGUgaW50ZXJuYWwgdmFsdWUgZm9yIHB3bWN0cmwgYW5kIHB3bWNoYW4KKwkgICBiYXNlZCBvbiB0aGUgY3VycmVudCBzZXR0aW5ncyAqLworCXYgPSAoZGF0YS0+cHdtW0NPTlRST0xdW2luZGV4XSA+PiA1KSAmIDc7CisKKwlpZiAodiA9PSAzKQorCQlkYXRhLT5wd21jdGxbaW5kZXhdID0gMDsKKwllbHNlIGlmICh2ID09IDcpCisJCWRhdGEtPnB3bWN0bFtpbmRleF0gPSAxOworCWVsc2UgaWYgKHYgPT0gNCkgeworCQkvKiBUaGUgZmFuIGlzIGRpc2FibGVkIC0gd2UgZG9uJ3Qgd2FudCB0bworCQkgICBzdXBwb3J0IHRoYXQsIHNvIGNoYW5nZSB0byBtYW51YWwgbW9kZSBhbmQKKwkJICAgc2V0IHRoZSBkdXR5IGN5Y2xlIHRvIDAgaW5zdGVhZAorCQkqLworCQlkYXRhLT5wd21bSU5QVVRdW2luZGV4XSA9IDA7CisJCWRhdGEtPnB3bVtDT05UUk9MXVtpbmRleF0gJj0gfjB4RTA7CisJCWRhdGEtPnB3bVtDT05UUk9MXVtpbmRleF0gfD0gKDcgPDwgNSk7CisKKwkJaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIFBXTV9DT05GSUdfUkVHKGluZGV4KSwKKwkJCQkJICBkYXRhLT5wd21bSU5QVVRdW2luZGV4XSk7CisKKwkJaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIFBXTV9DT05GSUdfUkVHKGluZGV4KSwKKwkJCQkJICBkYXRhLT5wd21bQ09OVFJPTF1baW5kZXhdKTsKKworCQlkYXRhLT5wd21jdGxbaW5kZXhdID0gMTsKKwl9IGVsc2UgeworCQlkYXRhLT5wd21jdGxbaW5kZXhdID0gMjsKKworCQlzd2l0Y2ggKHYpIHsKKwkJY2FzZSAwOgorCQkJZGF0YS0+cHdtY2hhbltpbmRleF0gPSAxOworCQkJYnJlYWs7CisJCWNhc2UgMToKKwkJCWRhdGEtPnB3bWNoYW5baW5kZXhdID0gMjsKKwkJCWJyZWFrOworCQljYXNlIDI6CisJCQlkYXRhLT5wd21jaGFuW2luZGV4XSA9IDQ7CisJCQlicmVhazsKKwkJY2FzZSA1OgorCQkJZGF0YS0+cHdtY2hhbltpbmRleF0gPSA2OworCQkJYnJlYWs7CisJCWNhc2UgNjoKKwkJCWRhdGEtPnB3bWNoYW5baW5kZXhdID0gNzsKKwkJCWJyZWFrOworCQl9CisJfQorfQorCitzdGF0aWMgc3RydWN0IGFkdDc0NzVfZGF0YSAqYWR0NzQ3NV91cGRhdGVfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCBhZHQ3NDc1X2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwl1OCBleHQ7CisJaW50IGk7CisKKwltdXRleF9sb2NrKCZkYXRhLT5sb2NrKTsKKworCS8qIE1lYXN1cmVtZW50IHZhbHVlcyB1cGRhdGUgZXZlcnkgMiBzZWNvbmRzICovCisJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgZGF0YS0+bWVhc3VyZV91cGRhdGVkICsgSFogKiAyKSB8fAorCSAgICAhZGF0YS0+dmFsaWQpIHsKKwkJZGF0YS0+YWxhcm1zID0gYWR0NzQ3NV9yZWFkKFJFR19TVEFUVVMyKSA8PCA4OworCQlkYXRhLT5hbGFybXMgfD0gYWR0NzQ3NV9yZWFkKFJFR19TVEFUVVMxKTsKKworCQlleHQgPSBhZHQ3NDc1X3JlYWQoUkVHX0VYVEVORDEpOworCQlmb3IgKGkgPSAwOyBpIDwgQURUNzQ3NV9WT0xUQUdFX0NPVU5UOyBpKyspCisJCQlkYXRhLT52b2x0YWdlW0lOUFVUXVtpXSA9CisJCQkJKGFkdDc0NzVfcmVhZChWT0xUQUdFX1JFRyhpKSkgPDwgMikgfAorCQkJCSgoZXh0ID4+ICgoaSArIDEpICogMikpICYgMyk7CisKKwkJZXh0ID0gYWR0NzQ3NV9yZWFkKFJFR19FWFRFTkQyKTsKKwkJZm9yIChpID0gMDsgaSA8IEFEVDc0NzVfVEVNUF9DT1VOVDsgaSsrKQorCQkJZGF0YS0+dGVtcFtJTlBVVF1baV0gPQorCQkJCShhZHQ3NDc1X3JlYWQoVEVNUF9SRUcoaSkpIDw8IDIpIHwKKwkJCQkoKGV4dCA+PiAoKGkgKyAxKSAqIDIpKSAmIDMpOworCisJCWZvciAoaSA9IDA7IGkgPCBBRFQ3NDc1X1RBQ0hfQ09VTlQ7IGkrKykKKwkJCWRhdGEtPnRhY2hbSU5QVVRdW2ldID0KKwkJCQlhZHQ3NDc1X3JlYWRfd29yZChjbGllbnQsIFRBQ0hfUkVHKGkpKTsKKworCQkvKiBVcGRhdGVkIGJ5IGh3IHdoZW4gaW4gYXV0byBtb2RlICovCisJCWZvciAoaSA9IDA7IGkgPCBBRFQ3NDc1X1BXTV9DT1VOVDsgaSsrKQorCQkJZGF0YS0+cHdtW0lOUFVUXVtpXSA9IGFkdDc0NzVfcmVhZChQV01fUkVHKGkpKTsKKworCQlkYXRhLT5tZWFzdXJlX3VwZGF0ZWQgPSBqaWZmaWVzOworCX0KKworCS8qIExpbWl0cyBhbmQgc2V0dGluZ3MsIHNob3VsZCBuZXZlciBjaGFuZ2UgdXBkYXRlIGV2ZXJ5IDYwIHNlY29uZHMgKi8KKwlpZiAodGltZV9hZnRlcihqaWZmaWVzLCBkYXRhLT5saW1pdHNfdXBkYXRlZCArIEhaICogMikgfHwKKwkgICAgIWRhdGEtPnZhbGlkKSB7CisJCWRhdGEtPmNvbmZpZzUgPSBhZHQ3NDc1X3JlYWQoUkVHX0NPTkZJRzUpOworCisJCWZvciAoaSA9IDA7IGkgPCBBRFQ3NDc1X1ZPTFRBR0VfQ09VTlQ7IGkrKykgeworCQkJLyogQWRqdXN0IHZhbHVlcyBzbyB0aGV5IG1hdGNoIHRoZSBpbnB1dCBwcmVjaXNpb24gKi8KKwkJCWRhdGEtPnZvbHRhZ2VbTUlOXVtpXSA9CisJCQkJYWR0NzQ3NV9yZWFkKFZPTFRBR0VfTUlOX1JFRyhpKSkgPDwgMjsKKwkJCWRhdGEtPnZvbHRhZ2VbTUFYXVtpXSA9CisJCQkJYWR0NzQ3NV9yZWFkKFZPTFRBR0VfTUFYX1JFRyhpKSkgPDwgMjsKKwkJfQorCisJCWZvciAoaSA9IDA7IGkgPCBBRFQ3NDc1X1RFTVBfQ09VTlQ7IGkrKykgeworCQkJLyogQWRqdXN0IHZhbHVlcyBzbyB0aGV5IG1hdGNoIHRoZSBpbnB1dCBwcmVjaXNpb24gKi8KKwkJCWRhdGEtPnRlbXBbTUlOXVtpXSA9CisJCQkJYWR0NzQ3NV9yZWFkKFRFTVBfTUlOX1JFRyhpKSkgPDwgMjsKKwkJCWRhdGEtPnRlbXBbTUFYXVtpXSA9CisJCQkJYWR0NzQ3NV9yZWFkKFRFTVBfTUFYX1JFRyhpKSkgPDwgMjsKKwkJCWRhdGEtPnRlbXBbQVVUT01JTl1baV0gPQorCQkJCWFkdDc0NzVfcmVhZChURU1QX1RNSU5fUkVHKGkpKSA8PCAyOworCQkJZGF0YS0+dGVtcFtUSEVSTV1baV0gPQorCQkJCWFkdDc0NzVfcmVhZChURU1QX1RIRVJNX1JFRyhpKSkgPDwgMjsKKwkJCWRhdGEtPnRlbXBbT0ZGU0VUXVtpXSA9CisJCQkJYWR0NzQ3NV9yZWFkKFRFTVBfT0ZGU0VUX1JFRyhpKSk7CisJCX0KKwkJYWR0NzQ3NV9yZWFkX2h5c3RlcnNpcyhjbGllbnQpOworCisJCWZvciAoaSA9IDA7IGkgPCBBRFQ3NDc1X1RBQ0hfQ09VTlQ7IGkrKykKKwkJCWRhdGEtPnRhY2hbTUlOXVtpXSA9CisJCQkJYWR0NzQ3NV9yZWFkX3dvcmQoY2xpZW50LCBUQUNIX01JTl9SRUcoaSkpOworCisJCWZvciAoaSA9IDA7IGkgPCBBRFQ3NDc1X1BXTV9DT1VOVDsgaSsrKSB7CisJCQlkYXRhLT5wd21bTUFYXVtpXSA9IGFkdDc0NzVfcmVhZChQV01fTUFYX1JFRyhpKSk7CisJCQlkYXRhLT5wd21bTUlOXVtpXSA9IGFkdDc0NzVfcmVhZChQV01fTUlOX1JFRyhpKSk7CisJCQkvKiBTZXQgdGhlIGNoYW5uZWwgYW5kIGNvbnRyb2wgaW5mb3JtYXRpb24gKi8KKwkJCWFkdDc0NzVfcmVhZF9wd20oY2xpZW50LCBpKTsKKwkJfQorCisJCWRhdGEtPnJhbmdlWzBdID0gYWR0NzQ3NV9yZWFkKFRFTVBfVFJBTkdFX1JFRygwKSk7CisJCWRhdGEtPnJhbmdlWzFdID0gYWR0NzQ3NV9yZWFkKFRFTVBfVFJBTkdFX1JFRygxKSk7CisJCWRhdGEtPnJhbmdlWzJdID0gYWR0NzQ3NV9yZWFkKFRFTVBfVFJBTkdFX1JFRygyKSk7CisKKwkJZGF0YS0+bGltaXRzX3VwZGF0ZWQgPSBqaWZmaWVzOworCQlkYXRhLT52YWxpZCA9IDE7CisJfQorCisJbXV0ZXhfdW5sb2NrKCZkYXRhLT5sb2NrKTsKKworCXJldHVybiBkYXRhOworfQorCitzdGF0aWMgaW50IF9faW5pdCBzZW5zb3JzX2FkdDc0NzVfaW5pdCh2b2lkKQoreworCXJldHVybiBpMmNfYWRkX2RyaXZlcigmYWR0NzQ3NV9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgc2Vuc29yc19hZHQ3NDc1X2V4aXQodm9pZCkKK3sKKwlpMmNfZGVsX2RyaXZlcigmYWR0NzQ3NV9kcml2ZXIpOworfQorCitNT0RVTEVfQVVUSE9SKCJBZHZhbmNlZCBNaWNybyBEZXZpY2VzLCBJbmMiKTsKK01PRFVMRV9ERVNDUklQVElPTigiYWR0NzQ3NSBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworbW9kdWxlX2luaXQoc2Vuc29yc19hZHQ3NDc1X2luaXQpOworbW9kdWxlX2V4aXQoc2Vuc29yc19hZHQ3NDc1X2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9hcHBsZXNtYy5jIGIvZHJpdmVycy9od21vbi9hcHBsZXNtYy5jCmluZGV4IGRjYTQ3YTUuLmUzMDE4NjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vYXBwbGVzbWMuYworKysgYi9kcml2ZXJzL2h3bW9uL2FwcGxlc21jLmMKQEAgLTU5MCw2ICs1OTAsMTEgQEAKIAl9CiAKIAlyZXQgPSBhcHBsZXNtY19yZWFkX2tleShMSUdIVF9TRU5TT1JfTEVGVF9LRVksIGJ1ZmZlciwgZGF0YV9sZW5ndGgpOworCS8qIG5ld2VyIG1hY2Jvb2tzIHJlcG9ydCBhIHNpbmdsZSAxMC1iaXQgYmlnZW5kaWFuIHZhbHVlICovCisJaWYgKGRhdGFfbGVuZ3RoID09IDEwKSB7CisJCWxlZnQgPSBiZTE2X3RvX2NwdSgqKF9fYmUxNiAqKShidWZmZXIgKyA2KSkgPj4gMjsKKwkJZ290byBvdXQ7CisJfQogCWxlZnQgPSBidWZmZXJbMl07CiAJaWYgKHJldCkKIAkJZ290byBvdXQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2FzYjEwMC5jIGIvZHJpdmVycy9od21vbi9hc2IxMDAuYwppbmRleCA4YTQ1YTJlLi44YWNmODI5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL2FzYjEwMC5jCisrKyBiL2RyaXZlcnMvaHdtb24vYXNiMTAwLmMKQEAgLTUzLDcgKzUzLDEwIEBACiAKIC8qIEluc21vZCBwYXJhbWV0ZXJzICovCiBJMkNfQ0xJRU5UX0lOU01PRF8xKGFzYjEwMCk7Ci1JMkNfQ0xJRU5UX01PRFVMRV9QQVJNKGZvcmNlX3N1YmNsaWVudHMsICJMaXN0IG9mIHN1YmNsaWVudCBhZGRyZXNzZXM6ICIKKworc3RhdGljIHVuc2lnbmVkIHNob3J0IGZvcmNlX3N1YmNsaWVudHNbNF07Cittb2R1bGVfcGFyYW1fYXJyYXkoZm9yY2Vfc3ViY2xpZW50cywgc2hvcnQsIE5VTEwsIDApOworTU9EVUxFX1BBUk1fREVTQyhmb3JjZV9zdWJjbGllbnRzLCAiTGlzdCBvZiBzdWJjbGllbnQgYWRkcmVzc2VzOiAiCiAJIntidXMsIGNsaWVudGFkZHIsIHN1YmNsaWVudGFkZHIxLCBzdWJjbGllbnRhZGRyMn0iKTsKIAogLyogVm9sdGFnZSBJTiByZWdpc3RlcnMgMC02ICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2RtZTE3MzcuYyBiL2RyaXZlcnMvaHdtb24vZG1lMTczNy5jCmluZGV4IDI3YTVkMzkuLjNkZjIwMmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vZG1lMTczNy5jCisrKyBiL2RyaXZlcnMvaHdtb24vZG1lMTczNy5jCkBAIC0zNCw2ICszNCw3IEBACiAjaW5jbHVkZSA8bGludXgvaHdtb24tdmlkLmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9hY3BpLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAKIC8qIElTQSBkZXZpY2UsIGlmIGZvdW5kICovCkBAIC0yMzYxLDYgKzIzNjIsMTAgQEAKIAl9OwogCWludCBlcnI7CiAKKwllcnIgPSBhY3BpX2NoZWNrX3Jlc291cmNlX2NvbmZsaWN0KCZyZXMpOworCWlmIChlcnIpCisJCWdvdG8gZXhpdDsKKwogCWlmICghKHBkZXYgPSBwbGF0Zm9ybV9kZXZpY2VfYWxsb2MoImRtZTE3MzciLCBhZGRyKSkpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJkbWUxNzM3OiBGYWlsZWQgdG8gYWxsb2NhdGUgZGV2aWNlLlxuIik7CiAJCWVyciA9IC1FTk9NRU07CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2Y3MTgwNWYuYyBiL2RyaXZlcnMvaHdtb24vZjcxODA1Zi5jCmluZGV4IDdhMTRhMmQuLjg5OTg3NjU3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL2Y3MTgwNWYuYworKysgYi9kcml2ZXJzL2h3bW9uL2Y3MTgwNWYuYwpAQCAtMzksNiArMzksNyBAQAogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9hY3BpLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAKIHN0YXRpYyB1bnNpZ25lZCBzaG9ydCBmb3JjZV9pZDsKQEAgLTE0NTUsNiArMTQ1NiwxMCBAQAogCX0KIAogCXJlcy5uYW1lID0gcGRldi0+bmFtZTsKKwllcnIgPSBhY3BpX2NoZWNrX3Jlc291cmNlX2NvbmZsaWN0KCZyZXMpOworCWlmIChlcnIpCisJCWdvdG8gZXhpdF9kZXZpY2VfcHV0OworCiAJZXJyID0gcGxhdGZvcm1fZGV2aWNlX2FkZF9yZXNvdXJjZXMocGRldiwgJnJlcywgMSk7CiAJaWYgKGVycikgewogCQlwcmludGsoS0VSTl9FUlIgRFJWTkFNRSAiOiBEZXZpY2UgcmVzb3VyY2UgYWRkaXRpb24gZmFpbGVkICIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vZjcxODgyZmcuYyBiL2RyaXZlcnMvaHdtb24vZjcxODgyZmcuYwppbmRleCA2NzA2N2U5Li42MDljYWZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL2Y3MTg4MmZnLmMKKysrIGIvZHJpdmVycy9od21vbi9mNzE4ODJmZy5jCkBAIC0xLDYgKzEsNiBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICBDb3B5cmlnaHQgKEMpIDIwMDYgYnkgSGFucyBFZGdpbmd0b24gPGhhbnNAZWRnaW5ndG9uLm5sPiAgICAgICAgICAgICAgKgotICogICBDb3B5cmlnaHQgKEMpIDIwMDcgYnkgSGFucyBkZSBHb2VkZSAgPGoudy5yLmRlZ29lZGVAaGhzLm5sPiAgICAgICAgICAgKgorICogICBDb3B5cmlnaHQgKEMpIDIwMDcsMjAwOCBieSBIYW5zIGRlIEdvZWRlIDxoZGVnb2VkZUByZWRoYXQuY29tPiAgICAgICAgKgogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgogICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgogICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgpAQCAtMjcsMTEgKzI3LDEyIEBACiAjaW5jbHVkZSA8bGludXgvaHdtb24tc3lzZnMuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvYWNwaS5oPgogCiAjZGVmaW5lIERSVk5BTUUgImY3MTg4MmZnIgogCi0jZGVmaW5lIFNJT19GNzE4ODJGR19MRF9IV00JMHgwNAkvKiBIYXJkd2FyZSBtb25pdG9yIGxvZ2ljYWwgZGV2aWNlKi8KKyNkZWZpbmUgU0lPX0Y3MTg4MkZHX0xEX0hXTQkweDA0CS8qIEhhcmR3YXJlIG1vbml0b3IgbG9naWNhbCBkZXZpY2UgKi8KICNkZWZpbmUgU0lPX1VOTE9DS19LRVkJCTB4ODcJLyogS2V5IHRvIGVuYWJsZSBTdXBlci1JL08gKi8KICNkZWZpbmUgU0lPX0xPQ0tfS0VZCQkweEFBCS8qIEtleSB0byBkaWFzYmxlIFN1cGVyLUkvTyAqLwogCkBAIC00Myw3ICs0NCw5IEBACiAjZGVmaW5lIFNJT19SRUdfQUREUgkJMHg2MAkvKiBMb2dpY2FsIGRldmljZSBhZGRyZXNzICgyIGJ5dGVzKSAqLwogCiAjZGVmaW5lIFNJT19GSU5URUtfSUQJCTB4MTkzNAkvKiBNYW51ZmFjdHVyZXJzIElEICovCisjZGVmaW5lIFNJT19GNzE4NjJfSUQJCTB4MDYwMQkvKiBDaGlwc2V0IElEICovCiAjZGVmaW5lIFNJT19GNzE4ODJfSUQJCTB4MDU0MQkvKiBDaGlwc2V0IElEICovCisjZGVmaW5lIFNJT19GODAwMF9JRAkJMHgwNTgxCS8qIENoaXBzZXQgSUQgKi8KIAogI2RlZmluZSBSRUdJT05fTEVOR1RICQk4CiAjZGVmaW5lIEFERFJfUkVHX09GRlNFVAkJNQpAQCAtNTEsMjUgKzU0LDM2IEBACiAKICNkZWZpbmUgRjcxODgyRkdfUkVHX1BFQ0kJCTB4MEEKIAotI2RlZmluZSBGNzE4ODJGR19SRUdfSU5fU1RBVFVTCQkweDEyCi0jZGVmaW5lIEY3MTg4MkZHX1JFR19JTl9CRUVQCQkweDEzCisjZGVmaW5lIEY3MTg4MkZHX1JFR19JTl9TVEFUVVMJCTB4MTIgLyogZjcxODgyZmcgb25seSAqLworI2RlZmluZSBGNzE4ODJGR19SRUdfSU5fQkVFUAkJMHgxMyAvKiBmNzE4ODJmZyBvbmx5ICovCiAjZGVmaW5lIEY3MTg4MkZHX1JFR19JTihucikJCSgweDIwICArIChucikpCi0jZGVmaW5lIEY3MTg4MkZHX1JFR19JTjFfSElHSAkJMHgzMgorI2RlZmluZSBGNzE4ODJGR19SRUdfSU4xX0hJR0gJCTB4MzIgLyogZjcxODgyZmcgb25seSAqLwogCiAjZGVmaW5lIEY3MTg4MkZHX1JFR19GQU4obnIpCQkoMHhBMCArICgxNiAqIChucikpKQorI2RlZmluZSBGNzE4ODJGR19SRUdfRkFOX1RBUkdFVChucikJKDB4QTIgKyAoMTYgKiAobnIpKSkKKyNkZWZpbmUgRjcxODgyRkdfUkVHX0ZBTl9GVUxMX1NQRUVEKG5yKQkoMHhBNCArICgxNiAqIChucikpKQogI2RlZmluZSBGNzE4ODJGR19SRUdfRkFOX1NUQVRVUwkJMHg5MgogI2RlZmluZSBGNzE4ODJGR19SRUdfRkFOX0JFRVAJCTB4OTMKIAotI2RlZmluZSBGNzE4ODJGR19SRUdfVEVNUChucikJCSgweDcyICsgMiAqIChucikpCi0jZGVmaW5lIEY3MTg4MkZHX1JFR19URU1QX09WVChucikJKDB4ODIgKyAyICogKG5yKSkKLSNkZWZpbmUgRjcxODgyRkdfUkVHX1RFTVBfSElHSChucikJKDB4ODMgKyAyICogKG5yKSkKKyNkZWZpbmUgRjcxODgyRkdfUkVHX1RFTVAobnIpCQkoMHg3MCArIDIgKiAobnIpKQorI2RlZmluZSBGNzE4ODJGR19SRUdfVEVNUF9PVlQobnIpCSgweDgwICsgMiAqIChucikpCisjZGVmaW5lIEY3MTg4MkZHX1JFR19URU1QX0hJR0gobnIpCSgweDgxICsgMiAqIChucikpCiAjZGVmaW5lIEY3MTg4MkZHX1JFR19URU1QX1NUQVRVUwkweDYyCiAjZGVmaW5lIEY3MTg4MkZHX1JFR19URU1QX0JFRVAJCTB4NjMKLSNkZWZpbmUgRjcxODgyRkdfUkVHX1RFTVBfSFlTVDEJCTB4NkMKLSNkZWZpbmUgRjcxODgyRkdfUkVHX1RFTVBfSFlTVDIzCTB4NkQKKyNkZWZpbmUgRjcxODgyRkdfUkVHX1RFTVBfSFlTVChucikJKDB4NkMgKyAobnIpKQogI2RlZmluZSBGNzE4ODJGR19SRUdfVEVNUF9UWVBFCQkweDZCCiAjZGVmaW5lIEY3MTg4MkZHX1JFR19URU1QX0RJT0RFX09QRU4JMHg2RgogCisjZGVmaW5lIEY3MTg4MkZHX1JFR19QV00obnIpCQkoMHhBMyArICgxNiAqIChucikpKQorI2RlZmluZSBGNzE4ODJGR19SRUdfUFdNX1RZUEUJCTB4OTQKKyNkZWZpbmUgRjcxODgyRkdfUkVHX1BXTV9FTkFCTEUJCTB4OTYKKworI2RlZmluZSBGNzE4ODJGR19SRUdfRkFOX0hZU1QobnIpCSgweDk4ICsgKG5yKSkKKworI2RlZmluZSBGNzE4ODJGR19SRUdfUE9JTlRfUFdNKHB3bSwgcG9pbnQpCSgweEFBICsgKHBvaW50KSArICgxNiAqIChwd20pKSkKKyNkZWZpbmUgRjcxODgyRkdfUkVHX1BPSU5UX1RFTVAocHdtLCBwb2ludCkJKDB4QTYgKyAocG9pbnQpICsgKDE2ICogKHB3bSkpKQorI2RlZmluZSBGNzE4ODJGR19SRUdfUE9JTlRfTUFQUElORyhucikJCSgweEFGICsgMTYgKiAobnIpKQorCiAjZGVmaW5lCUY3MTg4MkZHX1JFR19TVEFSVAkJMHgwMQogCiAjZGVmaW5lIEZBTl9NSU5fREVURUNUCQkJMzY2IC8qIExvd2VzdCBkZXRlY3RhYmxlIGZhbnNwZWVkICovCkBAIC03OCw3ICs5MiwxNSBAQAogbW9kdWxlX3BhcmFtKGZvcmNlX2lkLCB1c2hvcnQsIDApOwogTU9EVUxFX1BBUk1fREVTQyhmb3JjZV9pZCwgIk92ZXJyaWRlIHRoZSBkZXRlY3RlZCBkZXZpY2UgSUQiKTsKIAotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmY3MTg4MmZnX3BkZXYgPSBOVUxMOworZW51bSBjaGlwcyB7IGY3MTg2MmZnLCBmNzE4ODJmZywgZjgwMDAgfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmY3MTg4MmZnX25hbWVzW10gPSB7CisJImY3MTg2MmZnIiwKKwkiZjcxODgyZmciLAorCSJmODAwMCIsCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZjcxODgyZmdfcGRldjsKIAogLyogU3VwZXItSS9PIEZ1bmN0aW9uIHByb3RvdHlwZXMgKi8KIHN0YXRpYyBpbmxpbmUgaW50IHN1cGVyaW9faW5iKGludCBiYXNlLCBpbnQgcmVnKTsKQEAgLTg3LDggKzEwOSwxMyBAQAogc3RhdGljIGlubGluZSB2b2lkIHN1cGVyaW9fc2VsZWN0KGludCBiYXNlLCBpbnQgbGQpOwogc3RhdGljIGlubGluZSB2b2lkIHN1cGVyaW9fZXhpdChpbnQgYmFzZSk7CiAKK3N0cnVjdCBmNzE4ODJmZ19zaW9fZGF0YSB7CisJZW51bSBjaGlwcyB0eXBlOworfTsKKwogc3RydWN0IGY3MTg4MmZnX2RhdGEgewogCXVuc2lnbmVkIHNob3J0IGFkZHI7CisJZW51bSBjaGlwcyB0eXBlOwogCXN0cnVjdCBkZXZpY2UgKmh3bW9uX2RldjsKIAogCXN0cnVjdCBtdXRleCB1cGRhdGVfbG9jazsKQEAgLTEwMiwxOSArMTI5LDMwIEBACiAJdTgJaW5fc3RhdHVzOwogCXU4CWluX2JlZXA7CiAJdTE2CWZhbls0XTsKKwl1MTYJZmFuX3RhcmdldFs0XTsKKwl1MTYJZmFuX2Z1bGxfc3BlZWRbNF07CiAJdTgJZmFuX3N0YXR1czsKIAl1OAlmYW5fYmVlcDsKLQl1OAl0ZW1wWzNdOwotCXU4CXRlbXBfb3Z0WzNdOwotCXU4CXRlbXBfaGlnaFszXTsKLQl1OAl0ZW1wX2h5c3RbM107Ci0JdTgJdGVtcF90eXBlWzNdOworCS8qIE5vdGU6IGFsbCBtb2RlbHMgaGF2ZSBvbmx5IDMgdGVtcGVyYXR1cmUgY2hhbm5lbHMsIGJ1dCBvbiBzb21lCisJICAgdGhleSBhcmUgYWRkcmVzc2VkIGFzIDAtMiBhbmQgb24gb3RoZXJzIGFzIDEtMywgc28gZm9yIGNvZGluZworCSAgIGNvbnZlbmllbmNlIHdlIHJlc2VydmUgc3BhY2UgZm9yIDQgY2hhbm5lbHMgKi8KKwl1OAl0ZW1wWzRdOworCXU4CXRlbXBfb3Z0WzRdOworCXU4CXRlbXBfaGlnaFs0XTsKKwl1OAl0ZW1wX2h5c3RbMl07IC8qIDIgaHlzdHMgc3RvcmVkIHBlciByZWcgKi8KKwl1OAl0ZW1wX3R5cGVbNF07CiAJdTgJdGVtcF9zdGF0dXM7CiAJdTgJdGVtcF9iZWVwOwogCXU4CXRlbXBfZGlvZGVfb3BlbjsKKwl1OAlwd21bNF07CisJdTgJcHdtX2VuYWJsZTsKKwl1OAlwd21fYXV0b19wb2ludF9oeXN0WzJdOworCXU4CXB3bV9hdXRvX3BvaW50X21hcHBpbmdbNF07CisJdTgJcHdtX2F1dG9fcG9pbnRfcHdtWzRdWzVdOworCXU4CXB3bV9hdXRvX3BvaW50X3RlbXBbNF1bNF07CiB9OwogCi0vKiBTeXNmcyBpbiovCisvKiBTeXNmcyBpbiAqLwogc3RhdGljIHNzaXplX3Qgc2hvd19pbihzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZhdHRyLAogCWNoYXIgKmJ1Zik7CiBzdGF0aWMgc3NpemVfdCBzaG93X2luX21heChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlCkBAIC0xMzAsNiArMTY4LDEwIEBACiAvKiBTeXNmcyBGYW4gKi8KIHN0YXRpYyBzc2l6ZV90IHNob3dfZmFuKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0dHIsCiAJY2hhciAqYnVmKTsKK3N0YXRpYyBzc2l6ZV90IHNob3dfZmFuX2Z1bGxfc3BlZWQoc3RydWN0IGRldmljZSAqZGV2LAorCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZhdHRyLCBjaGFyICpidWYpOworc3RhdGljIHNzaXplX3Qgc3RvcmVfZmFuX2Z1bGxfc3BlZWQoc3RydWN0IGRldmljZSAqZGV2LAorCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZhdHRyLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCk7CiBzdGF0aWMgc3NpemVfdCBzaG93X2Zhbl9iZWVwKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUKIAkqZGV2YXR0ciwgY2hhciAqYnVmKTsKIHN0YXRpYyBzc2l6ZV90IHN0b3JlX2Zhbl9iZWVwKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUKQEAgLTE2MywxNiArMjA1LDQxIEBACiAJKmRldmF0dHIsIGNoYXIgKmJ1Zik7CiBzdGF0aWMgc3NpemVfdCBzaG93X3RlbXBfZmF1bHQoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZQogCSpkZXZhdHRyLCBjaGFyICpidWYpOworLyogUFdNIGFuZCBBdXRvIHBvaW50IGNvbnRyb2wgKi8KK3N0YXRpYyBzc2l6ZV90IHNob3dfcHdtKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0dHIsCisJY2hhciAqYnVmKTsKK3N0YXRpYyBzc2l6ZV90IHN0b3JlX3B3bShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZhdHRyLAorCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KTsKK3N0YXRpYyBzc2l6ZV90IHNob3dfcHdtX2VuYWJsZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0dHIsIGNoYXIgKmJ1Zik7CitzdGF0aWMgc3NpemVfdCBzdG9yZV9wd21fZW5hYmxlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZQkqZGV2YXR0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpOworc3RhdGljIHNzaXplX3Qgc2hvd19wd21faW50ZXJwb2xhdGUoc3RydWN0IGRldmljZSAqZGV2LAorCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZhdHRyLCBjaGFyICpidWYpOworc3RhdGljIHNzaXplX3Qgc3RvcmVfcHdtX2ludGVycG9sYXRlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2YXR0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpOworc3RhdGljIHNzaXplX3Qgc2hvd19wd21fYXV0b19wb2ludF9jaGFubmVsKHN0cnVjdCBkZXZpY2UgKmRldiwKKwlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2YXR0ciwgY2hhciAqYnVmKTsKK3N0YXRpYyBzc2l6ZV90IHN0b3JlX3B3bV9hdXRvX3BvaW50X2NoYW5uZWwoc3RydWN0IGRldmljZSAqZGV2LAorCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZhdHRyLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCk7CitzdGF0aWMgc3NpemVfdCBzaG93X3B3bV9hdXRvX3BvaW50X3RlbXBfaHlzdChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0dHIsIGNoYXIgKmJ1Zik7CitzdGF0aWMgc3NpemVfdCBzdG9yZV9wd21fYXV0b19wb2ludF90ZW1wX2h5c3Qoc3RydWN0IGRldmljZSAqZGV2LAorCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZhdHRyLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCk7CitzdGF0aWMgc3NpemVfdCBzaG93X3B3bV9hdXRvX3BvaW50X3B3bShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0dHIsIGNoYXIgKmJ1Zik7CitzdGF0aWMgc3NpemVfdCBzdG9yZV9wd21fYXV0b19wb2ludF9wd20oc3RydWN0IGRldmljZSAqZGV2LAorCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZhdHRyLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCk7CitzdGF0aWMgc3NpemVfdCBzaG93X3B3bV9hdXRvX3BvaW50X3RlbXAoc3RydWN0IGRldmljZSAqZGV2LAorCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZhdHRyLCBjaGFyICpidWYpOworc3RhdGljIHNzaXplX3Qgc3RvcmVfcHdtX2F1dG9fcG9pbnRfdGVtcChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0dHIsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KTsKIC8qIFN5c2ZzIG1pc2MgKi8KIHN0YXRpYyBzc2l6ZV90IHNob3dfbmFtZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZhdHRyLAogCWNoYXIgKmJ1Zik7CiAKIHN0YXRpYyBpbnQgX19kZXZpbml0IGY3MTg4MmZnX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKiBwZGV2KTsKLXN0YXRpYyBpbnQgX19kZXZleGl0IGY3MTg4MmZnX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KTsKLXN0YXRpYyBpbnQgX19pbml0IGY3MTg4MmZnX2luaXQodm9pZCk7Ci1zdGF0aWMgaW50IF9faW5pdCBmNzE4ODJmZ19maW5kKGludCBzaW9hZGRyLCB1bnNpZ25lZCBzaG9ydCAqYWRkcmVzcyk7Ci1zdGF0aWMgaW50IF9faW5pdCBmNzE4ODJmZ19kZXZpY2VfYWRkKHVuc2lnbmVkIHNob3J0IGFkZHJlc3MpOwotc3RhdGljIHZvaWQgX19leGl0IGY3MTg4MmZnX2V4aXQodm9pZCk7CitzdGF0aWMgaW50IGY3MTg4MmZnX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KTsKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgZjcxODgyZmdfZHJpdmVyID0gewogCS5kcml2ZXIgPSB7CkBAIC0xODMsODYgKzI1MCw1MzEgQEAKIAkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKGY3MTg4MmZnX3JlbW92ZSksCiB9OwogCi1zdGF0aWMgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgZjcxODgyZmdfZGV2X2F0dHJbXSA9Ci17Ci0JX19BVFRSKCBuYW1lLCBTX0lSVUdPLCBzaG93X25hbWUsIE5VTEwgKSwKK3N0YXRpYyBERVZJQ0VfQVRUUihuYW1lLCBTX0lSVUdPLCBzaG93X25hbWUsIE5VTEwpOworCisvKiBUZW1wIGFuZCBpbiBhdHRyIGNvbW1vbiB0byBib3RoIHRoZSBmNzE4NjJmZyBhbmQgZjcxODgyZmcgKi8KK3N0YXRpYyBzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGVfMiBmNzE4eDJmZ19pbl90ZW1wX2F0dHJbXSA9IHsKKwlTRU5TT1JfQVRUUl8yKGluMF9pbnB1dCwgU19JUlVHTywgc2hvd19pbiwgTlVMTCwgMCwgMCksCisJU0VOU09SX0FUVFJfMihpbjFfaW5wdXQsIFNfSVJVR08sIHNob3dfaW4sIE5VTEwsIDAsIDEpLAorCVNFTlNPUl9BVFRSXzIoaW4yX2lucHV0LCBTX0lSVUdPLCBzaG93X2luLCBOVUxMLCAwLCAyKSwKKwlTRU5TT1JfQVRUUl8yKGluM19pbnB1dCwgU19JUlVHTywgc2hvd19pbiwgTlVMTCwgMCwgMyksCisJU0VOU09SX0FUVFJfMihpbjRfaW5wdXQsIFNfSVJVR08sIHNob3dfaW4sIE5VTEwsIDAsIDQpLAorCVNFTlNPUl9BVFRSXzIoaW41X2lucHV0LCBTX0lSVUdPLCBzaG93X2luLCBOVUxMLCAwLCA1KSwKKwlTRU5TT1JfQVRUUl8yKGluNl9pbnB1dCwgU19JUlVHTywgc2hvd19pbiwgTlVMTCwgMCwgNiksCisJU0VOU09SX0FUVFJfMihpbjdfaW5wdXQsIFNfSVJVR08sIHNob3dfaW4sIE5VTEwsIDAsIDcpLAorCVNFTlNPUl9BVFRSXzIoaW44X2lucHV0LCBTX0lSVUdPLCBzaG93X2luLCBOVUxMLCAwLCA4KSwKKwlTRU5TT1JfQVRUUl8yKHRlbXAxX2lucHV0LCBTX0lSVUdPLCBzaG93X3RlbXAsIE5VTEwsIDAsIDEpLAorCVNFTlNPUl9BVFRSXzIodGVtcDFfbWF4LCBTX0lSVUdPfFNfSVdVU1IsIHNob3dfdGVtcF9tYXgsCisJCXN0b3JlX3RlbXBfbWF4LCAwLCAxKSwKKwlTRU5TT1JfQVRUUl8yKHRlbXAxX21heF9oeXN0LCBTX0lSVUdPfFNfSVdVU1IsIHNob3dfdGVtcF9tYXhfaHlzdCwKKwkJc3RvcmVfdGVtcF9tYXhfaHlzdCwgMCwgMSksCisJLyogU2hvdWxkIHJlYWxseSBiZSB0ZW1wMV9tYXhfYWxhcm0sIGJ1dCBvbGRlciB2ZXJzaW9ucyBkaWQgbm90IGhhbmRsZQorCSAgIHRoZSBtYXggYW5kIGNyaXQgYWxhcm1zIHNlcGFyYXRlbHkgYW5kIGxtX3NlbnNvcnMgdjIgZGVwZW5kcyBvbiB0aGUKKwkgICBwcmVzZW5jZSBvZiB0ZW1wI19hbGFybSBmaWxlcy4gVGhlIHNhbWUgZ29lcyBmb3IgdGVtcDIvMyBfYWxhcm0uICovCisJU0VOU09SX0FUVFJfMih0ZW1wMV9hbGFybSwgU19JUlVHTywgc2hvd190ZW1wX2FsYXJtLCBOVUxMLCAwLCAxKSwKKwlTRU5TT1JfQVRUUl8yKHRlbXAxX21heF9iZWVwLCBTX0lSVUdPfFNfSVdVU1IsIHNob3dfdGVtcF9iZWVwLAorCQlzdG9yZV90ZW1wX2JlZXAsIDAsIDEpLAorCVNFTlNPUl9BVFRSXzIodGVtcDFfY3JpdCwgU19JUlVHT3xTX0lXVVNSLCBzaG93X3RlbXBfY3JpdCwKKwkJc3RvcmVfdGVtcF9jcml0LCAwLCAxKSwKKwlTRU5TT1JfQVRUUl8yKHRlbXAxX2NyaXRfaHlzdCwgU19JUlVHTywgc2hvd190ZW1wX2NyaXRfaHlzdCwgTlVMTCwKKwkJMCwgMSksCisJU0VOU09SX0FUVFJfMih0ZW1wMV9jcml0X2FsYXJtLCBTX0lSVUdPLCBzaG93X3RlbXBfYWxhcm0sIE5VTEwsIDAsIDUpLAorCVNFTlNPUl9BVFRSXzIodGVtcDFfY3JpdF9iZWVwLCBTX0lSVUdPfFNfSVdVU1IsIHNob3dfdGVtcF9iZWVwLAorCQlzdG9yZV90ZW1wX2JlZXAsIDAsIDUpLAorCVNFTlNPUl9BVFRSXzIodGVtcDFfdHlwZSwgU19JUlVHTywgc2hvd190ZW1wX3R5cGUsIE5VTEwsIDAsIDEpLAorCVNFTlNPUl9BVFRSXzIodGVtcDFfZmF1bHQsIFNfSVJVR08sIHNob3dfdGVtcF9mYXVsdCwgTlVMTCwgMCwgMSksCisJU0VOU09SX0FUVFJfMih0ZW1wMl9pbnB1dCwgU19JUlVHTywgc2hvd190ZW1wLCBOVUxMLCAwLCAyKSwKKwlTRU5TT1JfQVRUUl8yKHRlbXAyX21heCwgU19JUlVHT3xTX0lXVVNSLCBzaG93X3RlbXBfbWF4LAorCQlzdG9yZV90ZW1wX21heCwgMCwgMiksCisJU0VOU09SX0FUVFJfMih0ZW1wMl9tYXhfaHlzdCwgU19JUlVHT3xTX0lXVVNSLCBzaG93X3RlbXBfbWF4X2h5c3QsCisJCXN0b3JlX3RlbXBfbWF4X2h5c3QsIDAsIDIpLAorCS8qIFNob3VsZCBiZSB0ZW1wMl9tYXhfYWxhcm0sIHNlZSB0ZW1wMV9hbGFybSBub3RlICovCisJU0VOU09SX0FUVFJfMih0ZW1wMl9hbGFybSwgU19JUlVHTywgc2hvd190ZW1wX2FsYXJtLCBOVUxMLCAwLCAyKSwKKwlTRU5TT1JfQVRUUl8yKHRlbXAyX21heF9iZWVwLCBTX0lSVUdPfFNfSVdVU1IsIHNob3dfdGVtcF9iZWVwLAorCQlzdG9yZV90ZW1wX2JlZXAsIDAsIDIpLAorCVNFTlNPUl9BVFRSXzIodGVtcDJfY3JpdCwgU19JUlVHT3xTX0lXVVNSLCBzaG93X3RlbXBfY3JpdCwKKwkJc3RvcmVfdGVtcF9jcml0LCAwLCAyKSwKKwlTRU5TT1JfQVRUUl8yKHRlbXAyX2NyaXRfaHlzdCwgU19JUlVHTywgc2hvd190ZW1wX2NyaXRfaHlzdCwgTlVMTCwKKwkJMCwgMiksCisJU0VOU09SX0FUVFJfMih0ZW1wMl9jcml0X2FsYXJtLCBTX0lSVUdPLCBzaG93X3RlbXBfYWxhcm0sIE5VTEwsIDAsIDYpLAorCVNFTlNPUl9BVFRSXzIodGVtcDJfY3JpdF9iZWVwLCBTX0lSVUdPfFNfSVdVU1IsIHNob3dfdGVtcF9iZWVwLAorCQlzdG9yZV90ZW1wX2JlZXAsIDAsIDYpLAorCVNFTlNPUl9BVFRSXzIodGVtcDJfdHlwZSwgU19JUlVHTywgc2hvd190ZW1wX3R5cGUsIE5VTEwsIDAsIDIpLAorCVNFTlNPUl9BVFRSXzIodGVtcDJfZmF1bHQsIFNfSVJVR08sIHNob3dfdGVtcF9mYXVsdCwgTlVMTCwgMCwgMiksCisJU0VOU09SX0FUVFJfMih0ZW1wM19pbnB1dCwgU19JUlVHTywgc2hvd190ZW1wLCBOVUxMLCAwLCAzKSwKKwlTRU5TT1JfQVRUUl8yKHRlbXAzX21heCwgU19JUlVHT3xTX0lXVVNSLCBzaG93X3RlbXBfbWF4LAorCQlzdG9yZV90ZW1wX21heCwgMCwgMyksCisJU0VOU09SX0FUVFJfMih0ZW1wM19tYXhfaHlzdCwgU19JUlVHT3xTX0lXVVNSLCBzaG93X3RlbXBfbWF4X2h5c3QsCisJCXN0b3JlX3RlbXBfbWF4X2h5c3QsIDAsIDMpLAorCS8qIFNob3VsZCBiZSB0ZW1wM19tYXhfYWxhcm0sIHNlZSB0ZW1wMV9hbGFybSBub3RlICovCisJU0VOU09SX0FUVFJfMih0ZW1wM19hbGFybSwgU19JUlVHTywgc2hvd190ZW1wX2FsYXJtLCBOVUxMLCAwLCAzKSwKKwlTRU5TT1JfQVRUUl8yKHRlbXAzX21heF9iZWVwLCBTX0lSVUdPfFNfSVdVU1IsIHNob3dfdGVtcF9iZWVwLAorCQlzdG9yZV90ZW1wX2JlZXAsIDAsIDMpLAorCVNFTlNPUl9BVFRSXzIodGVtcDNfY3JpdCwgU19JUlVHT3xTX0lXVVNSLCBzaG93X3RlbXBfY3JpdCwKKwkJc3RvcmVfdGVtcF9jcml0LCAwLCAzKSwKKwlTRU5TT1JfQVRUUl8yKHRlbXAzX2NyaXRfaHlzdCwgU19JUlVHTywgc2hvd190ZW1wX2NyaXRfaHlzdCwgTlVMTCwKKwkJMCwgMyksCisJU0VOU09SX0FUVFJfMih0ZW1wM19jcml0X2FsYXJtLCBTX0lSVUdPLCBzaG93X3RlbXBfYWxhcm0sIE5VTEwsIDAsIDcpLAorCVNFTlNPUl9BVFRSXzIodGVtcDNfY3JpdF9iZWVwLCBTX0lSVUdPfFNfSVdVU1IsIHNob3dfdGVtcF9iZWVwLAorCQlzdG9yZV90ZW1wX2JlZXAsIDAsIDcpLAorCVNFTlNPUl9BVFRSXzIodGVtcDNfdHlwZSwgU19JUlVHTywgc2hvd190ZW1wX3R5cGUsIE5VTEwsIDAsIDMpLAorCVNFTlNPUl9BVFRSXzIodGVtcDNfZmF1bHQsIFNfSVJVR08sIHNob3dfdGVtcF9mYXVsdCwgTlVMTCwgMCwgMyksCiB9OwogCi1zdGF0aWMgc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlIGY3MTg4MmZnX2luX3RlbXBfYXR0cltdID0KLXsKLQlTRU5TT1JfQVRUUihpbjBfaW5wdXQsIFNfSVJVR08sIHNob3dfaW4sIE5VTEwsIDApLAotCVNFTlNPUl9BVFRSKGluMV9pbnB1dCwgU19JUlVHTywgc2hvd19pbiwgTlVMTCwgMSksCi0JU0VOU09SX0FUVFIoaW4xX21heCwgU19JUlVHT3xTX0lXVVNSLCBzaG93X2luX21heCwgc3RvcmVfaW5fbWF4LCAxKSwKLQlTRU5TT1JfQVRUUihpbjFfYmVlcCwgU19JUlVHT3xTX0lXVVNSLCBzaG93X2luX2JlZXAsIHN0b3JlX2luX2JlZXAsIDEpLAotCVNFTlNPUl9BVFRSKGluMV9hbGFybSwgU19JUlVHTywgc2hvd19pbl9hbGFybSwgTlVMTCwgMSksCi0JU0VOU09SX0FUVFIoaW4yX2lucHV0LCBTX0lSVUdPLCBzaG93X2luLCBOVUxMLCAyKSwKLQlTRU5TT1JfQVRUUihpbjNfaW5wdXQsIFNfSVJVR08sIHNob3dfaW4sIE5VTEwsIDMpLAotCVNFTlNPUl9BVFRSKGluNF9pbnB1dCwgU19JUlVHTywgc2hvd19pbiwgTlVMTCwgNCksCi0JU0VOU09SX0FUVFIoaW41X2lucHV0LCBTX0lSVUdPLCBzaG93X2luLCBOVUxMLCA1KSwKLQlTRU5TT1JfQVRUUihpbjZfaW5wdXQsIFNfSVJVR08sIHNob3dfaW4sIE5VTEwsIDYpLAotCVNFTlNPUl9BVFRSKGluN19pbnB1dCwgU19JUlVHTywgc2hvd19pbiwgTlVMTCwgNyksCi0JU0VOU09SX0FUVFIoaW44X2lucHV0LCBTX0lSVUdPLCBzaG93X2luLCBOVUxMLCA4KSwKLQlTRU5TT1JfQVRUUih0ZW1wMV9pbnB1dCwgU19JUlVHTywgc2hvd190ZW1wLCBOVUxMLCAwKSwKLQlTRU5TT1JfQVRUUih0ZW1wMV9tYXgsIFNfSVJVR098U19JV1VTUiwgc2hvd190ZW1wX21heCwKLQkJc3RvcmVfdGVtcF9tYXgsIDApLAotCVNFTlNPUl9BVFRSKHRlbXAxX21heF9oeXN0LCBTX0lSVUdPfFNfSVdVU1IsIHNob3dfdGVtcF9tYXhfaHlzdCwKLQkJc3RvcmVfdGVtcF9tYXhfaHlzdCwgMCksCi0JU0VOU09SX0FUVFIodGVtcDFfY3JpdCwgU19JUlVHT3xTX0lXVVNSLCBzaG93X3RlbXBfY3JpdCwKLQkJc3RvcmVfdGVtcF9jcml0LCAwKSwKLQlTRU5TT1JfQVRUUih0ZW1wMV9jcml0X2h5c3QsIFNfSVJVR08sIHNob3dfdGVtcF9jcml0X2h5c3QsIE5VTEwsIDApLAotCVNFTlNPUl9BVFRSKHRlbXAxX3R5cGUsIFNfSVJVR08sIHNob3dfdGVtcF90eXBlLCBOVUxMLCAwKSwKLQlTRU5TT1JfQVRUUih0ZW1wMV9iZWVwLCBTX0lSVUdPfFNfSVdVU1IsIHNob3dfdGVtcF9iZWVwLAotCQlzdG9yZV90ZW1wX2JlZXAsIDApLAotCVNFTlNPUl9BVFRSKHRlbXAxX2FsYXJtLCBTX0lSVUdPLCBzaG93X3RlbXBfYWxhcm0sIE5VTEwsIDApLAotCVNFTlNPUl9BVFRSKHRlbXAxX2ZhdWx0LCBTX0lSVUdPLCBzaG93X3RlbXBfZmF1bHQsIE5VTEwsIDApLAotCVNFTlNPUl9BVFRSKHRlbXAyX2lucHV0LCBTX0lSVUdPLCBzaG93X3RlbXAsIE5VTEwsIDEpLAotCVNFTlNPUl9BVFRSKHRlbXAyX21heCwgU19JUlVHT3xTX0lXVVNSLCBzaG93X3RlbXBfbWF4LAotCQlzdG9yZV90ZW1wX21heCwgMSksCi0JU0VOU09SX0FUVFIodGVtcDJfbWF4X2h5c3QsIFNfSVJVR098U19JV1VTUiwgc2hvd190ZW1wX21heF9oeXN0LAotCQlzdG9yZV90ZW1wX21heF9oeXN0LCAxKSwKLQlTRU5TT1JfQVRUUih0ZW1wMl9jcml0LCBTX0lSVUdPfFNfSVdVU1IsIHNob3dfdGVtcF9jcml0LAotCQlzdG9yZV90ZW1wX2NyaXQsIDEpLAotCVNFTlNPUl9BVFRSKHRlbXAyX2NyaXRfaHlzdCwgU19JUlVHTywgc2hvd190ZW1wX2NyaXRfaHlzdCwgTlVMTCwgMSksCi0JU0VOU09SX0FUVFIodGVtcDJfdHlwZSwgU19JUlVHTywgc2hvd190ZW1wX3R5cGUsIE5VTEwsIDEpLAotCVNFTlNPUl9BVFRSKHRlbXAyX2JlZXAsIFNfSVJVR098U19JV1VTUiwgc2hvd190ZW1wX2JlZXAsCi0JCXN0b3JlX3RlbXBfYmVlcCwgMSksCi0JU0VOU09SX0FUVFIodGVtcDJfYWxhcm0sIFNfSVJVR08sIHNob3dfdGVtcF9hbGFybSwgTlVMTCwgMSksCi0JU0VOU09SX0FUVFIodGVtcDJfZmF1bHQsIFNfSVJVR08sIHNob3dfdGVtcF9mYXVsdCwgTlVMTCwgMSksCi0JU0VOU09SX0FUVFIodGVtcDNfaW5wdXQsIFNfSVJVR08sIHNob3dfdGVtcCwgTlVMTCwgMiksCi0JU0VOU09SX0FUVFIodGVtcDNfbWF4LCBTX0lSVUdPfFNfSVdVU1IsIHNob3dfdGVtcF9tYXgsCi0JCXN0b3JlX3RlbXBfbWF4LCAyKSwKLQlTRU5TT1JfQVRUUih0ZW1wM19tYXhfaHlzdCwgU19JUlVHT3xTX0lXVVNSLCBzaG93X3RlbXBfbWF4X2h5c3QsCi0JCXN0b3JlX3RlbXBfbWF4X2h5c3QsIDIpLAotCVNFTlNPUl9BVFRSKHRlbXAzX2NyaXQsIFNfSVJVR098U19JV1VTUiwgc2hvd190ZW1wX2NyaXQsCi0JCXN0b3JlX3RlbXBfY3JpdCwgMiksCi0JU0VOU09SX0FUVFIodGVtcDNfY3JpdF9oeXN0LCBTX0lSVUdPLCBzaG93X3RlbXBfY3JpdF9oeXN0LCBOVUxMLCAyKSwKLQlTRU5TT1JfQVRUUih0ZW1wM190eXBlLCBTX0lSVUdPLCBzaG93X3RlbXBfdHlwZSwgTlVMTCwgMiksCi0JU0VOU09SX0FUVFIodGVtcDNfYmVlcCwgU19JUlVHT3xTX0lXVVNSLCBzaG93X3RlbXBfYmVlcCwKLQkJc3RvcmVfdGVtcF9iZWVwLCAyKSwKLQlTRU5TT1JfQVRUUih0ZW1wM19hbGFybSwgU19JUlVHTywgc2hvd190ZW1wX2FsYXJtLCBOVUxMLCAyKSwKLQlTRU5TT1JfQVRUUih0ZW1wM19mYXVsdCwgU19JUlVHTywgc2hvd190ZW1wX2ZhdWx0LCBOVUxMLCAyKQorLyogVGVtcCBhbmQgaW4gYXR0ciBmb3VuZCBvbmx5IG9uIHRoZSBmNzE4ODJmZyAqLworc3RhdGljIHN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZV8yIGY3MTg4MmZnX2luX3RlbXBfYXR0cltdID0geworCVNFTlNPUl9BVFRSXzIoaW4xX21heCwgU19JUlVHT3xTX0lXVVNSLCBzaG93X2luX21heCwgc3RvcmVfaW5fbWF4LAorCQkwLCAxKSwKKwlTRU5TT1JfQVRUUl8yKGluMV9iZWVwLCBTX0lSVUdPfFNfSVdVU1IsIHNob3dfaW5fYmVlcCwgc3RvcmVfaW5fYmVlcCwKKwkJMCwgMSksCisJU0VOU09SX0FUVFJfMihpbjFfYWxhcm0sIFNfSVJVR08sIHNob3dfaW5fYWxhcm0sIE5VTEwsIDAsIDEpLAogfTsKIAotc3RhdGljIHN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSBmNzE4ODJmZ19mYW5fYXR0cltdID0KLXsKLQlTRU5TT1JfQVRUUihmYW4xX2lucHV0LCBTX0lSVUdPLCBzaG93X2ZhbiwgTlVMTCwgMCksCi0JU0VOU09SX0FUVFIoZmFuMV9iZWVwLCBTX0lSVUdPfFNfSVdVU1IsIHNob3dfZmFuX2JlZXAsCi0JCXN0b3JlX2Zhbl9iZWVwLCAwKSwKLQlTRU5TT1JfQVRUUihmYW4xX2FsYXJtLCBTX0lSVUdPLCBzaG93X2Zhbl9hbGFybSwgTlVMTCwgMCksCi0JU0VOU09SX0FUVFIoZmFuMl9pbnB1dCwgU19JUlVHTywgc2hvd19mYW4sIE5VTEwsIDEpLAotCVNFTlNPUl9BVFRSKGZhbjJfYmVlcCwgU19JUlVHT3xTX0lXVVNSLCBzaG93X2Zhbl9iZWVwLAotCQlzdG9yZV9mYW5fYmVlcCwgMSksCi0JU0VOU09SX0FUVFIoZmFuMl9hbGFybSwgU19JUlVHTywgc2hvd19mYW5fYWxhcm0sIE5VTEwsIDEpLAotCVNFTlNPUl9BVFRSKGZhbjNfaW5wdXQsIFNfSVJVR08sIHNob3dfZmFuLCBOVUxMLCAyKSwKLQlTRU5TT1JfQVRUUihmYW4zX2JlZXAsIFNfSVJVR098U19JV1VTUiwgc2hvd19mYW5fYmVlcCwKLQkJc3RvcmVfZmFuX2JlZXAsIDIpLAotCVNFTlNPUl9BVFRSKGZhbjNfYWxhcm0sIFNfSVJVR08sIHNob3dfZmFuX2FsYXJtLCBOVUxMLCAyKSwKLQlTRU5TT1JfQVRUUihmYW40X2lucHV0LCBTX0lSVUdPLCBzaG93X2ZhbiwgTlVMTCwgMyksCi0JU0VOU09SX0FUVFIoZmFuNF9iZWVwLCBTX0lSVUdPfFNfSVdVU1IsIHNob3dfZmFuX2JlZXAsCi0JCXN0b3JlX2Zhbl9iZWVwLCAzKSwKLQlTRU5TT1JfQVRUUihmYW40X2FsYXJtLCBTX0lSVUdPLCBzaG93X2Zhbl9hbGFybSwgTlVMTCwgMykKKy8qIFRlbXAgYW5kIGluIGF0dHIgZm9yIHRoZSBmODAwMAorICAgTm90ZSBvbiB0aGUgZjgwMDAgdGVtcF9vdnQgKGNyaXQpIGlzIHVzZWQgYXMgbWF4LCBhbmQgdGVtcF9oaWdoIChtYXgpCisgICBpcyB1c2VkIGFzIGh5c3RlcmVzaXMgdmFsdWUgdG8gY2xlYXIgYWxhcm1zCisgKi8KK3N0YXRpYyBzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGVfMiBmODAwMF9pbl90ZW1wX2F0dHJbXSA9IHsKKwlTRU5TT1JfQVRUUl8yKGluMF9pbnB1dCwgU19JUlVHTywgc2hvd19pbiwgTlVMTCwgMCwgMCksCisJU0VOU09SX0FUVFJfMihpbjFfaW5wdXQsIFNfSVJVR08sIHNob3dfaW4sIE5VTEwsIDAsIDEpLAorCVNFTlNPUl9BVFRSXzIoaW4yX2lucHV0LCBTX0lSVUdPLCBzaG93X2luLCBOVUxMLCAwLCAyKSwKKwlTRU5TT1JfQVRUUl8yKHRlbXAxX2lucHV0LCBTX0lSVUdPLCBzaG93X3RlbXAsIE5VTEwsIDAsIDApLAorCVNFTlNPUl9BVFRSXzIodGVtcDFfbWF4LCBTX0lSVUdPfFNfSVdVU1IsIHNob3dfdGVtcF9jcml0LAorCQlzdG9yZV90ZW1wX2NyaXQsIDAsIDApLAorCVNFTlNPUl9BVFRSXzIodGVtcDFfbWF4X2h5c3QsIFNfSVJVR098U19JV1VTUiwgc2hvd190ZW1wX21heCwKKwkJc3RvcmVfdGVtcF9tYXgsIDAsIDApLAorCVNFTlNPUl9BVFRSXzIodGVtcDFfYWxhcm0sIFNfSVJVR08sIHNob3dfdGVtcF9hbGFybSwgTlVMTCwgMCwgNCksCisJU0VOU09SX0FUVFJfMih0ZW1wMl9pbnB1dCwgU19JUlVHTywgc2hvd190ZW1wLCBOVUxMLCAwLCAxKSwKKwlTRU5TT1JfQVRUUl8yKHRlbXAyX21heCwgU19JUlVHT3xTX0lXVVNSLCBzaG93X3RlbXBfY3JpdCwKKwkJc3RvcmVfdGVtcF9jcml0LCAwLCAxKSwKKwlTRU5TT1JfQVRUUl8yKHRlbXAyX21heF9oeXN0LCBTX0lSVUdPfFNfSVdVU1IsIHNob3dfdGVtcF9tYXgsCisJCXN0b3JlX3RlbXBfbWF4LCAwLCAxKSwKKwlTRU5TT1JfQVRUUl8yKHRlbXAyX2FsYXJtLCBTX0lSVUdPLCBzaG93X3RlbXBfYWxhcm0sIE5VTEwsIDAsIDUpLAorCVNFTlNPUl9BVFRSXzIodGVtcDJfdHlwZSwgU19JUlVHTywgc2hvd190ZW1wX3R5cGUsIE5VTEwsIDAsIDEpLAorCVNFTlNPUl9BVFRSXzIodGVtcDNfaW5wdXQsIFNfSVJVR08sIHNob3dfdGVtcCwgTlVMTCwgMCwgMiksCisJU0VOU09SX0FUVFJfMih0ZW1wM19tYXgsIFNfSVJVR098U19JV1VTUiwgc2hvd190ZW1wX2NyaXQsCisJCXN0b3JlX3RlbXBfY3JpdCwgMCwgMiksCisJU0VOU09SX0FUVFJfMih0ZW1wM19tYXhfaHlzdCwgU19JUlVHT3xTX0lXVVNSLCBzaG93X3RlbXBfbWF4LAorCQlzdG9yZV90ZW1wX21heCwgMCwgMiksCisJU0VOU09SX0FUVFJfMih0ZW1wM19hbGFybSwgU19JUlVHTywgc2hvd190ZW1wX2FsYXJtLCBOVUxMLCAwLCA2KSwKIH07CiAKKy8qIEZhbiAvIFBXTSBhdHRyIGNvbW1vbiB0byBhbGwgbW9kZWxzICovCitzdGF0aWMgc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlXzIgZnh4eHhfZmFuX2F0dHJbXSA9IHsKKwlTRU5TT1JfQVRUUl8yKGZhbjFfaW5wdXQsIFNfSVJVR08sIHNob3dfZmFuLCBOVUxMLCAwLCAwKSwKKwlTRU5TT1JfQVRUUl8yKGZhbjFfZnVsbF9zcGVlZCwgU19JUlVHT3xTX0lXVVNSLAorCQkgICAgICBzaG93X2Zhbl9mdWxsX3NwZWVkLAorCQkgICAgICBzdG9yZV9mYW5fZnVsbF9zcGVlZCwgMCwgMCksCisJU0VOU09SX0FUVFJfMihmYW4xX2FsYXJtLCBTX0lSVUdPLCBzaG93X2Zhbl9hbGFybSwgTlVMTCwgMCwgMCksCisJU0VOU09SX0FUVFJfMihmYW4yX2lucHV0LCBTX0lSVUdPLCBzaG93X2ZhbiwgTlVMTCwgMCwgMSksCisJU0VOU09SX0FUVFJfMihmYW4yX2Z1bGxfc3BlZWQsIFNfSVJVR098U19JV1VTUiwKKwkJICAgICAgc2hvd19mYW5fZnVsbF9zcGVlZCwKKwkJICAgICAgc3RvcmVfZmFuX2Z1bGxfc3BlZWQsIDAsIDEpLAorCVNFTlNPUl9BVFRSXzIoZmFuMl9hbGFybSwgU19JUlVHTywgc2hvd19mYW5fYWxhcm0sIE5VTEwsIDAsIDEpLAorCVNFTlNPUl9BVFRSXzIoZmFuM19pbnB1dCwgU19JUlVHTywgc2hvd19mYW4sIE5VTEwsIDAsIDIpLAorCVNFTlNPUl9BVFRSXzIoZmFuM19mdWxsX3NwZWVkLCBTX0lSVUdPfFNfSVdVU1IsCisJCSAgICAgIHNob3dfZmFuX2Z1bGxfc3BlZWQsCisJCSAgICAgIHN0b3JlX2Zhbl9mdWxsX3NwZWVkLCAwLCAyKSwKKwlTRU5TT1JfQVRUUl8yKGZhbjNfYWxhcm0sIFNfSVJVR08sIHNob3dfZmFuX2FsYXJtLCBOVUxMLCAwLCAyKSwKKworCVNFTlNPUl9BVFRSXzIocHdtMSwgU19JUlVHT3xTX0lXVVNSLCBzaG93X3B3bSwgc3RvcmVfcHdtLCAwLCAwKSwKKwlTRU5TT1JfQVRUUl8yKHB3bTFfZW5hYmxlLCBTX0lSVUdPfFNfSVdVU1IsIHNob3dfcHdtX2VuYWJsZSwKKwkJICAgICAgc3RvcmVfcHdtX2VuYWJsZSwgMCwgMCksCisJU0VOU09SX0FUVFJfMihwd20xX2ludGVycG9sYXRlLCBTX0lSVUdPfFNfSVdVU1IsCisJCSAgICAgIHNob3dfcHdtX2ludGVycG9sYXRlLCBzdG9yZV9wd21faW50ZXJwb2xhdGUsIDAsIDApLAorCVNFTlNPUl9BVFRSXzIocHdtMV9hdXRvX2NoYW5uZWxzX3RlbXAsIFNfSVJVR098U19JV1VTUiwKKwkJICAgICAgc2hvd19wd21fYXV0b19wb2ludF9jaGFubmVsLAorCQkgICAgICBzdG9yZV9wd21fYXV0b19wb2ludF9jaGFubmVsLCAwLCAwKSwKKworCVNFTlNPUl9BVFRSXzIocHdtMiwgU19JUlVHT3xTX0lXVVNSLCBzaG93X3B3bSwgc3RvcmVfcHdtLCAwLCAxKSwKKwlTRU5TT1JfQVRUUl8yKHB3bTJfZW5hYmxlLCBTX0lSVUdPfFNfSVdVU1IsIHNob3dfcHdtX2VuYWJsZSwKKwkJICAgICAgc3RvcmVfcHdtX2VuYWJsZSwgMCwgMSksCisJU0VOU09SX0FUVFJfMihwd20yX2ludGVycG9sYXRlLCBTX0lSVUdPfFNfSVdVU1IsCisJCSAgICAgIHNob3dfcHdtX2ludGVycG9sYXRlLCBzdG9yZV9wd21faW50ZXJwb2xhdGUsIDAsIDEpLAorCVNFTlNPUl9BVFRSXzIocHdtMl9hdXRvX2NoYW5uZWxzX3RlbXAsIFNfSVJVR098U19JV1VTUiwKKwkJICAgICAgc2hvd19wd21fYXV0b19wb2ludF9jaGFubmVsLAorCQkgICAgICBzdG9yZV9wd21fYXV0b19wb2ludF9jaGFubmVsLCAwLCAxKSwKKworCVNFTlNPUl9BVFRSXzIocHdtM19pbnRlcnBvbGF0ZSwgU19JUlVHT3xTX0lXVVNSLAorCQkgICAgICBzaG93X3B3bV9pbnRlcnBvbGF0ZSwgc3RvcmVfcHdtX2ludGVycG9sYXRlLCAwLCAyKSwKKwlTRU5TT1JfQVRUUl8yKHB3bTNfYXV0b19jaGFubmVsc190ZW1wLCBTX0lSVUdPfFNfSVdVU1IsCisJCSAgICAgIHNob3dfcHdtX2F1dG9fcG9pbnRfY2hhbm5lbCwKKwkJICAgICAgc3RvcmVfcHdtX2F1dG9fcG9pbnRfY2hhbm5lbCwgMCwgMiksCit9OworCisvKiBGYW4gLyBQV00gYXR0ciBmb3IgdGhlIGY3MTg2MmZnLCBsZXNzIHB3bXMgYW5kIGxlc3Mgem9uZXMgcGVyIHB3bSB0aGFuIHRoZQorICAgZjcxODgyZmcgKi8KK3N0YXRpYyBzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGVfMiBmNzE4NjJmZ19mYW5fYXR0cltdID0geworCVNFTlNPUl9BVFRSXzIoZmFuMV9iZWVwLCBTX0lSVUdPfFNfSVdVU1IsIHNob3dfZmFuX2JlZXAsCisJCXN0b3JlX2Zhbl9iZWVwLCAwLCAwKSwKKwlTRU5TT1JfQVRUUl8yKGZhbjJfYmVlcCwgU19JUlVHT3xTX0lXVVNSLCBzaG93X2Zhbl9iZWVwLAorCQlzdG9yZV9mYW5fYmVlcCwgMCwgMSksCisJU0VOU09SX0FUVFJfMihmYW4zX2JlZXAsIFNfSVJVR098U19JV1VTUiwgc2hvd19mYW5fYmVlcCwKKwkJc3RvcmVfZmFuX2JlZXAsIDAsIDIpLAorCisJU0VOU09SX0FUVFJfMihwd20xX2F1dG9fcG9pbnQxX3B3bSwgU19JUlVHT3xTX0lXVVNSLAorCQkgICAgICBzaG93X3B3bV9hdXRvX3BvaW50X3B3bSwgc3RvcmVfcHdtX2F1dG9fcG9pbnRfcHdtLAorCQkgICAgICAxLCAwKSwKKwlTRU5TT1JfQVRUUl8yKHB3bTFfYXV0b19wb2ludDJfcHdtLCBTX0lSVUdPfFNfSVdVU1IsCisJCSAgICAgIHNob3dfcHdtX2F1dG9fcG9pbnRfcHdtLCBzdG9yZV9wd21fYXV0b19wb2ludF9wd20sCisJCSAgICAgIDQsIDApLAorCVNFTlNPUl9BVFRSXzIocHdtMV9hdXRvX3BvaW50MV90ZW1wLCBTX0lSVUdPfFNfSVdVU1IsCisJCSAgICAgIHNob3dfcHdtX2F1dG9fcG9pbnRfdGVtcCwgc3RvcmVfcHdtX2F1dG9fcG9pbnRfdGVtcCwKKwkJICAgICAgMCwgMCksCisJU0VOU09SX0FUVFJfMihwd20xX2F1dG9fcG9pbnQyX3RlbXAsIFNfSVJVR098U19JV1VTUiwKKwkJICAgICAgc2hvd19wd21fYXV0b19wb2ludF90ZW1wLCBzdG9yZV9wd21fYXV0b19wb2ludF90ZW1wLAorCQkgICAgICAzLCAwKSwKKwlTRU5TT1JfQVRUUl8yKHB3bTFfYXV0b19wb2ludDFfdGVtcF9oeXN0LCBTX0lSVUdPfFNfSVdVU1IsCisJCSAgICAgIHNob3dfcHdtX2F1dG9fcG9pbnRfdGVtcF9oeXN0LAorCQkgICAgICBzdG9yZV9wd21fYXV0b19wb2ludF90ZW1wX2h5c3QsCisJCSAgICAgIDAsIDApLAorCVNFTlNPUl9BVFRSXzIocHdtMV9hdXRvX3BvaW50Ml90ZW1wX2h5c3QsIFNfSVJVR08sCisJCSAgICAgIHNob3dfcHdtX2F1dG9fcG9pbnRfdGVtcF9oeXN0LCBOVUxMLCAzLCAwKSwKKworCVNFTlNPUl9BVFRSXzIocHdtMl9hdXRvX3BvaW50MV9wd20sIFNfSVJVR098U19JV1VTUiwKKwkJICAgICAgc2hvd19wd21fYXV0b19wb2ludF9wd20sIHN0b3JlX3B3bV9hdXRvX3BvaW50X3B3bSwKKwkJICAgICAgMSwgMSksCisJU0VOU09SX0FUVFJfMihwd20yX2F1dG9fcG9pbnQyX3B3bSwgU19JUlVHT3xTX0lXVVNSLAorCQkgICAgICBzaG93X3B3bV9hdXRvX3BvaW50X3B3bSwgc3RvcmVfcHdtX2F1dG9fcG9pbnRfcHdtLAorCQkgICAgICA0LCAxKSwKKwlTRU5TT1JfQVRUUl8yKHB3bTJfYXV0b19wb2ludDFfdGVtcCwgU19JUlVHT3xTX0lXVVNSLAorCQkgICAgICBzaG93X3B3bV9hdXRvX3BvaW50X3RlbXAsIHN0b3JlX3B3bV9hdXRvX3BvaW50X3RlbXAsCisJCSAgICAgIDAsIDEpLAorCVNFTlNPUl9BVFRSXzIocHdtMl9hdXRvX3BvaW50Ml90ZW1wLCBTX0lSVUdPfFNfSVdVU1IsCisJCSAgICAgIHNob3dfcHdtX2F1dG9fcG9pbnRfdGVtcCwgc3RvcmVfcHdtX2F1dG9fcG9pbnRfdGVtcCwKKwkJICAgICAgMywgMSksCisJU0VOU09SX0FUVFJfMihwd20yX2F1dG9fcG9pbnQxX3RlbXBfaHlzdCwgU19JUlVHT3xTX0lXVVNSLAorCQkgICAgICBzaG93X3B3bV9hdXRvX3BvaW50X3RlbXBfaHlzdCwKKwkJICAgICAgc3RvcmVfcHdtX2F1dG9fcG9pbnRfdGVtcF9oeXN0LAorCQkgICAgICAwLCAxKSwKKwlTRU5TT1JfQVRUUl8yKHB3bTJfYXV0b19wb2ludDJfdGVtcF9oeXN0LCBTX0lSVUdPLAorCQkgICAgICBzaG93X3B3bV9hdXRvX3BvaW50X3RlbXBfaHlzdCwgTlVMTCwgMywgMSksCisKKwlTRU5TT1JfQVRUUl8yKHB3bTMsIFNfSVJVR098U19JV1VTUiwgc2hvd19wd20sIHN0b3JlX3B3bSwgMCwgMiksCisJU0VOU09SX0FUVFJfMihwd20zX2VuYWJsZSwgU19JUlVHT3xTX0lXVVNSLCBzaG93X3B3bV9lbmFibGUsCisJCSAgICAgIHN0b3JlX3B3bV9lbmFibGUsIDAsIDIpLAorCVNFTlNPUl9BVFRSXzIocHdtM19hdXRvX3BvaW50MV9wd20sIFNfSVJVR098U19JV1VTUiwKKwkJICAgICAgc2hvd19wd21fYXV0b19wb2ludF9wd20sIHN0b3JlX3B3bV9hdXRvX3BvaW50X3B3bSwKKwkJICAgICAgMSwgMiksCisJU0VOU09SX0FUVFJfMihwd20zX2F1dG9fcG9pbnQyX3B3bSwgU19JUlVHT3xTX0lXVVNSLAorCQkgICAgICBzaG93X3B3bV9hdXRvX3BvaW50X3B3bSwgc3RvcmVfcHdtX2F1dG9fcG9pbnRfcHdtLAorCQkgICAgICA0LCAyKSwKKwlTRU5TT1JfQVRUUl8yKHB3bTNfYXV0b19wb2ludDFfdGVtcCwgU19JUlVHT3xTX0lXVVNSLAorCQkgICAgICBzaG93X3B3bV9hdXRvX3BvaW50X3RlbXAsIHN0b3JlX3B3bV9hdXRvX3BvaW50X3RlbXAsCisJCSAgICAgIDAsIDIpLAorCVNFTlNPUl9BVFRSXzIocHdtM19hdXRvX3BvaW50Ml90ZW1wLCBTX0lSVUdPfFNfSVdVU1IsCisJCSAgICAgIHNob3dfcHdtX2F1dG9fcG9pbnRfdGVtcCwgc3RvcmVfcHdtX2F1dG9fcG9pbnRfdGVtcCwKKwkJICAgICAgMywgMiksCisJU0VOU09SX0FUVFJfMihwd20zX2F1dG9fcG9pbnQxX3RlbXBfaHlzdCwgU19JUlVHT3xTX0lXVVNSLAorCQkgICAgICBzaG93X3B3bV9hdXRvX3BvaW50X3RlbXBfaHlzdCwKKwkJICAgICAgc3RvcmVfcHdtX2F1dG9fcG9pbnRfdGVtcF9oeXN0LAorCQkgICAgICAwLCAyKSwKKwlTRU5TT1JfQVRUUl8yKHB3bTNfYXV0b19wb2ludDJfdGVtcF9oeXN0LCBTX0lSVUdPLAorCQkgICAgICBzaG93X3B3bV9hdXRvX3BvaW50X3RlbXBfaHlzdCwgTlVMTCwgMywgMiksCit9OworCisvKiBGYW4gLyBQV00gYXR0ciBmb3IgdGhlIGY3MTg4MmZnICovCitzdGF0aWMgc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlXzIgZjcxODgyZmdfZmFuX2F0dHJbXSA9IHsKKwlTRU5TT1JfQVRUUl8yKGZhbjFfYmVlcCwgU19JUlVHT3xTX0lXVVNSLCBzaG93X2Zhbl9iZWVwLAorCQlzdG9yZV9mYW5fYmVlcCwgMCwgMCksCisJU0VOU09SX0FUVFJfMihmYW4yX2JlZXAsIFNfSVJVR098U19JV1VTUiwgc2hvd19mYW5fYmVlcCwKKwkJc3RvcmVfZmFuX2JlZXAsIDAsIDEpLAorCVNFTlNPUl9BVFRSXzIoZmFuM19iZWVwLCBTX0lSVUdPfFNfSVdVU1IsIHNob3dfZmFuX2JlZXAsCisJCXN0b3JlX2Zhbl9iZWVwLCAwLCAyKSwKKwlTRU5TT1JfQVRUUl8yKGZhbjRfaW5wdXQsIFNfSVJVR08sIHNob3dfZmFuLCBOVUxMLCAwLCAzKSwKKwlTRU5TT1JfQVRUUl8yKGZhbjRfZnVsbF9zcGVlZCwgU19JUlVHT3xTX0lXVVNSLAorCQkgICAgICBzaG93X2Zhbl9mdWxsX3NwZWVkLAorCQkgICAgICBzdG9yZV9mYW5fZnVsbF9zcGVlZCwgMCwgMyksCisJU0VOU09SX0FUVFJfMihmYW40X2JlZXAsIFNfSVJVR098U19JV1VTUiwgc2hvd19mYW5fYmVlcCwKKwkJc3RvcmVfZmFuX2JlZXAsIDAsIDMpLAorCVNFTlNPUl9BVFRSXzIoZmFuNF9hbGFybSwgU19JUlVHTywgc2hvd19mYW5fYWxhcm0sIE5VTEwsIDAsIDMpLAorCisJU0VOU09SX0FUVFJfMihwd20xX2F1dG9fcG9pbnQxX3B3bSwgU19JUlVHT3xTX0lXVVNSLAorCQkgICAgICBzaG93X3B3bV9hdXRvX3BvaW50X3B3bSwgc3RvcmVfcHdtX2F1dG9fcG9pbnRfcHdtLAorCQkgICAgICAwLCAwKSwKKwlTRU5TT1JfQVRUUl8yKHB3bTFfYXV0b19wb2ludDJfcHdtLCBTX0lSVUdPfFNfSVdVU1IsCisJCSAgICAgIHNob3dfcHdtX2F1dG9fcG9pbnRfcHdtLCBzdG9yZV9wd21fYXV0b19wb2ludF9wd20sCisJCSAgICAgIDEsIDApLAorCVNFTlNPUl9BVFRSXzIocHdtMV9hdXRvX3BvaW50M19wd20sIFNfSVJVR098U19JV1VTUiwKKwkJICAgICAgc2hvd19wd21fYXV0b19wb2ludF9wd20sIHN0b3JlX3B3bV9hdXRvX3BvaW50X3B3bSwKKwkJICAgICAgMiwgMCksCisJU0VOU09SX0FUVFJfMihwd20xX2F1dG9fcG9pbnQ0X3B3bSwgU19JUlVHT3xTX0lXVVNSLAorCQkgICAgICBzaG93X3B3bV9hdXRvX3BvaW50X3B3bSwgc3RvcmVfcHdtX2F1dG9fcG9pbnRfcHdtLAorCQkgICAgICAzLCAwKSwKKwlTRU5TT1JfQVRUUl8yKHB3bTFfYXV0b19wb2ludDVfcHdtLCBTX0lSVUdPfFNfSVdVU1IsCisJCSAgICAgIHNob3dfcHdtX2F1dG9fcG9pbnRfcHdtLCBzdG9yZV9wd21fYXV0b19wb2ludF9wd20sCisJCSAgICAgIDQsIDApLAorCVNFTlNPUl9BVFRSXzIocHdtMV9hdXRvX3BvaW50MV90ZW1wLCBTX0lSVUdPfFNfSVdVU1IsCisJCSAgICAgIHNob3dfcHdtX2F1dG9fcG9pbnRfdGVtcCwgc3RvcmVfcHdtX2F1dG9fcG9pbnRfdGVtcCwKKwkJICAgICAgMCwgMCksCisJU0VOU09SX0FUVFJfMihwd20xX2F1dG9fcG9pbnQyX3RlbXAsIFNfSVJVR098U19JV1VTUiwKKwkJICAgICAgc2hvd19wd21fYXV0b19wb2ludF90ZW1wLCBzdG9yZV9wd21fYXV0b19wb2ludF90ZW1wLAorCQkgICAgICAxLCAwKSwKKwlTRU5TT1JfQVRUUl8yKHB3bTFfYXV0b19wb2ludDNfdGVtcCwgU19JUlVHT3xTX0lXVVNSLAorCQkgICAgICBzaG93X3B3bV9hdXRvX3BvaW50X3RlbXAsIHN0b3JlX3B3bV9hdXRvX3BvaW50X3RlbXAsCisJCSAgICAgIDIsIDApLAorCVNFTlNPUl9BVFRSXzIocHdtMV9hdXRvX3BvaW50NF90ZW1wLCBTX0lSVUdPfFNfSVdVU1IsCisJCSAgICAgIHNob3dfcHdtX2F1dG9fcG9pbnRfdGVtcCwgc3RvcmVfcHdtX2F1dG9fcG9pbnRfdGVtcCwKKwkJICAgICAgMywgMCksCisJU0VOU09SX0FUVFJfMihwd20xX2F1dG9fcG9pbnQxX3RlbXBfaHlzdCwgU19JUlVHT3xTX0lXVVNSLAorCQkgICAgICBzaG93X3B3bV9hdXRvX3BvaW50X3RlbXBfaHlzdCwKKwkJICAgICAgc3RvcmVfcHdtX2F1dG9fcG9pbnRfdGVtcF9oeXN0LAorCQkgICAgICAwLCAwKSwKKwlTRU5TT1JfQVRUUl8yKHB3bTFfYXV0b19wb2ludDJfdGVtcF9oeXN0LCBTX0lSVUdPLAorCQkgICAgICBzaG93X3B3bV9hdXRvX3BvaW50X3RlbXBfaHlzdCwgTlVMTCwgMSwgMCksCisJU0VOU09SX0FUVFJfMihwd20xX2F1dG9fcG9pbnQzX3RlbXBfaHlzdCwgU19JUlVHTywKKwkJICAgICAgc2hvd19wd21fYXV0b19wb2ludF90ZW1wX2h5c3QsIE5VTEwsIDIsIDApLAorCVNFTlNPUl9BVFRSXzIocHdtMV9hdXRvX3BvaW50NF90ZW1wX2h5c3QsIFNfSVJVR08sCisJCSAgICAgIHNob3dfcHdtX2F1dG9fcG9pbnRfdGVtcF9oeXN0LCBOVUxMLCAzLCAwKSwKKworCVNFTlNPUl9BVFRSXzIocHdtMl9hdXRvX3BvaW50MV9wd20sIFNfSVJVR098U19JV1VTUiwKKwkJICAgICAgc2hvd19wd21fYXV0b19wb2ludF9wd20sIHN0b3JlX3B3bV9hdXRvX3BvaW50X3B3bSwKKwkJICAgICAgMCwgMSksCisJU0VOU09SX0FUVFJfMihwd20yX2F1dG9fcG9pbnQyX3B3bSwgU19JUlVHT3xTX0lXVVNSLAorCQkgICAgICBzaG93X3B3bV9hdXRvX3BvaW50X3B3bSwgc3RvcmVfcHdtX2F1dG9fcG9pbnRfcHdtLAorCQkgICAgICAxLCAxKSwKKwlTRU5TT1JfQVRUUl8yKHB3bTJfYXV0b19wb2ludDNfcHdtLCBTX0lSVUdPfFNfSVdVU1IsCisJCSAgICAgIHNob3dfcHdtX2F1dG9fcG9pbnRfcHdtLCBzdG9yZV9wd21fYXV0b19wb2ludF9wd20sCisJCSAgICAgIDIsIDEpLAorCVNFTlNPUl9BVFRSXzIocHdtMl9hdXRvX3BvaW50NF9wd20sIFNfSVJVR098U19JV1VTUiwKKwkJICAgICAgc2hvd19wd21fYXV0b19wb2ludF9wd20sIHN0b3JlX3B3bV9hdXRvX3BvaW50X3B3bSwKKwkJICAgICAgMywgMSksCisJU0VOU09SX0FUVFJfMihwd20yX2F1dG9fcG9pbnQ1X3B3bSwgU19JUlVHT3xTX0lXVVNSLAorCQkgICAgICBzaG93X3B3bV9hdXRvX3BvaW50X3B3bSwgc3RvcmVfcHdtX2F1dG9fcG9pbnRfcHdtLAorCQkgICAgICA0LCAxKSwKKwlTRU5TT1JfQVRUUl8yKHB3bTJfYXV0b19wb2ludDFfdGVtcCwgU19JUlVHT3xTX0lXVVNSLAorCQkgICAgICBzaG93X3B3bV9hdXRvX3BvaW50X3RlbXAsIHN0b3JlX3B3bV9hdXRvX3BvaW50X3RlbXAsCisJCSAgICAgIDAsIDEpLAorCVNFTlNPUl9BVFRSXzIocHdtMl9hdXRvX3BvaW50Ml90ZW1wLCBTX0lSVUdPfFNfSVdVU1IsCisJCSAgICAgIHNob3dfcHdtX2F1dG9fcG9pbnRfdGVtcCwgc3RvcmVfcHdtX2F1dG9fcG9pbnRfdGVtcCwKKwkJICAgICAgMSwgMSksCisJU0VOU09SX0FUVFJfMihwd20yX2F1dG9fcG9pbnQzX3RlbXAsIFNfSVJVR098U19JV1VTUiwKKwkJICAgICAgc2hvd19wd21fYXV0b19wb2ludF90ZW1wLCBzdG9yZV9wd21fYXV0b19wb2ludF90ZW1wLAorCQkgICAgICAyLCAxKSwKKwlTRU5TT1JfQVRUUl8yKHB3bTJfYXV0b19wb2ludDRfdGVtcCwgU19JUlVHT3xTX0lXVVNSLAorCQkgICAgICBzaG93X3B3bV9hdXRvX3BvaW50X3RlbXAsIHN0b3JlX3B3bV9hdXRvX3BvaW50X3RlbXAsCisJCSAgICAgIDMsIDEpLAorCVNFTlNPUl9BVFRSXzIocHdtMl9hdXRvX3BvaW50MV90ZW1wX2h5c3QsIFNfSVJVR098U19JV1VTUiwKKwkJICAgICAgc2hvd19wd21fYXV0b19wb2ludF90ZW1wX2h5c3QsCisJCSAgICAgIHN0b3JlX3B3bV9hdXRvX3BvaW50X3RlbXBfaHlzdCwKKwkJICAgICAgMCwgMSksCisJU0VOU09SX0FUVFJfMihwd20yX2F1dG9fcG9pbnQyX3RlbXBfaHlzdCwgU19JUlVHTywKKwkJICAgICAgc2hvd19wd21fYXV0b19wb2ludF90ZW1wX2h5c3QsIE5VTEwsIDEsIDEpLAorCVNFTlNPUl9BVFRSXzIocHdtMl9hdXRvX3BvaW50M190ZW1wX2h5c3QsIFNfSVJVR08sCisJCSAgICAgIHNob3dfcHdtX2F1dG9fcG9pbnRfdGVtcF9oeXN0LCBOVUxMLCAyLCAxKSwKKwlTRU5TT1JfQVRUUl8yKHB3bTJfYXV0b19wb2ludDRfdGVtcF9oeXN0LCBTX0lSVUdPLAorCQkgICAgICBzaG93X3B3bV9hdXRvX3BvaW50X3RlbXBfaHlzdCwgTlVMTCwgMywgMSksCisKKwlTRU5TT1JfQVRUUl8yKHB3bTMsIFNfSVJVR098U19JV1VTUiwgc2hvd19wd20sIHN0b3JlX3B3bSwgMCwgMiksCisJU0VOU09SX0FUVFJfMihwd20zX2VuYWJsZSwgU19JUlVHT3xTX0lXVVNSLCBzaG93X3B3bV9lbmFibGUsCisJCSAgICAgIHN0b3JlX3B3bV9lbmFibGUsIDAsIDIpLAorCVNFTlNPUl9BVFRSXzIocHdtM19hdXRvX3BvaW50MV9wd20sIFNfSVJVR098U19JV1VTUiwKKwkJICAgICAgc2hvd19wd21fYXV0b19wb2ludF9wd20sIHN0b3JlX3B3bV9hdXRvX3BvaW50X3B3bSwKKwkJICAgICAgMCwgMiksCisJU0VOU09SX0FUVFJfMihwd20zX2F1dG9fcG9pbnQyX3B3bSwgU19JUlVHT3xTX0lXVVNSLAorCQkgICAgICBzaG93X3B3bV9hdXRvX3BvaW50X3B3bSwgc3RvcmVfcHdtX2F1dG9fcG9pbnRfcHdtLAorCQkgICAgICAxLCAyKSwKKwlTRU5TT1JfQVRUUl8yKHB3bTNfYXV0b19wb2ludDNfcHdtLCBTX0lSVUdPfFNfSVdVU1IsCisJCSAgICAgIHNob3dfcHdtX2F1dG9fcG9pbnRfcHdtLCBzdG9yZV9wd21fYXV0b19wb2ludF9wd20sCisJCSAgICAgIDIsIDIpLAorCVNFTlNPUl9BVFRSXzIocHdtM19hdXRvX3BvaW50NF9wd20sIFNfSVJVR098U19JV1VTUiwKKwkJICAgICAgc2hvd19wd21fYXV0b19wb2ludF9wd20sIHN0b3JlX3B3bV9hdXRvX3BvaW50X3B3bSwKKwkJICAgICAgMywgMiksCisJU0VOU09SX0FUVFJfMihwd20zX2F1dG9fcG9pbnQ1X3B3bSwgU19JUlVHT3xTX0lXVVNSLAorCQkgICAgICBzaG93X3B3bV9hdXRvX3BvaW50X3B3bSwgc3RvcmVfcHdtX2F1dG9fcG9pbnRfcHdtLAorCQkgICAgICA0LCAyKSwKKwlTRU5TT1JfQVRUUl8yKHB3bTNfYXV0b19wb2ludDFfdGVtcCwgU19JUlVHT3xTX0lXVVNSLAorCQkgICAgICBzaG93X3B3bV9hdXRvX3BvaW50X3RlbXAsIHN0b3JlX3B3bV9hdXRvX3BvaW50X3RlbXAsCisJCSAgICAgIDAsIDIpLAorCVNFTlNPUl9BVFRSXzIocHdtM19hdXRvX3BvaW50Ml90ZW1wLCBTX0lSVUdPfFNfSVdVU1IsCisJCSAgICAgIHNob3dfcHdtX2F1dG9fcG9pbnRfdGVtcCwgc3RvcmVfcHdtX2F1dG9fcG9pbnRfdGVtcCwKKwkJICAgICAgMSwgMiksCisJU0VOU09SX0FUVFJfMihwd20zX2F1dG9fcG9pbnQzX3RlbXAsIFNfSVJVR098U19JV1VTUiwKKwkJICAgICAgc2hvd19wd21fYXV0b19wb2ludF90ZW1wLCBzdG9yZV9wd21fYXV0b19wb2ludF90ZW1wLAorCQkgICAgICAyLCAyKSwKKwlTRU5TT1JfQVRUUl8yKHB3bTNfYXV0b19wb2ludDRfdGVtcCwgU19JUlVHT3xTX0lXVVNSLAorCQkgICAgICBzaG93X3B3bV9hdXRvX3BvaW50X3RlbXAsIHN0b3JlX3B3bV9hdXRvX3BvaW50X3RlbXAsCisJCSAgICAgIDMsIDIpLAorCVNFTlNPUl9BVFRSXzIocHdtM19hdXRvX3BvaW50MV90ZW1wX2h5c3QsIFNfSVJVR098U19JV1VTUiwKKwkJICAgICAgc2hvd19wd21fYXV0b19wb2ludF90ZW1wX2h5c3QsCisJCSAgICAgIHN0b3JlX3B3bV9hdXRvX3BvaW50X3RlbXBfaHlzdCwKKwkJICAgICAgMCwgMiksCisJU0VOU09SX0FUVFJfMihwd20zX2F1dG9fcG9pbnQyX3RlbXBfaHlzdCwgU19JUlVHTywKKwkJICAgICAgc2hvd19wd21fYXV0b19wb2ludF90ZW1wX2h5c3QsIE5VTEwsIDEsIDIpLAorCVNFTlNPUl9BVFRSXzIocHdtM19hdXRvX3BvaW50M190ZW1wX2h5c3QsIFNfSVJVR08sCisJCSAgICAgIHNob3dfcHdtX2F1dG9fcG9pbnRfdGVtcF9oeXN0LCBOVUxMLCAyLCAyKSwKKwlTRU5TT1JfQVRUUl8yKHB3bTNfYXV0b19wb2ludDRfdGVtcF9oeXN0LCBTX0lSVUdPLAorCQkgICAgICBzaG93X3B3bV9hdXRvX3BvaW50X3RlbXBfaHlzdCwgTlVMTCwgMywgMiksCisKKwlTRU5TT1JfQVRUUl8yKHB3bTQsIFNfSVJVR098U19JV1VTUiwgc2hvd19wd20sIHN0b3JlX3B3bSwgMCwgMyksCisJU0VOU09SX0FUVFJfMihwd200X2VuYWJsZSwgU19JUlVHT3xTX0lXVVNSLCBzaG93X3B3bV9lbmFibGUsCisJCSAgICAgIHN0b3JlX3B3bV9lbmFibGUsIDAsIDMpLAorCVNFTlNPUl9BVFRSXzIocHdtNF9pbnRlcnBvbGF0ZSwgU19JUlVHT3xTX0lXVVNSLAorCQkgICAgICBzaG93X3B3bV9pbnRlcnBvbGF0ZSwgc3RvcmVfcHdtX2ludGVycG9sYXRlLCAwLCAzKSwKKwlTRU5TT1JfQVRUUl8yKHB3bTRfYXV0b19jaGFubmVsc190ZW1wLCBTX0lSVUdPfFNfSVdVU1IsCisJCSAgICAgIHNob3dfcHdtX2F1dG9fcG9pbnRfY2hhbm5lbCwKKwkJICAgICAgc3RvcmVfcHdtX2F1dG9fcG9pbnRfY2hhbm5lbCwgMCwgMyksCisJU0VOU09SX0FUVFJfMihwd200X2F1dG9fcG9pbnQxX3B3bSwgU19JUlVHT3xTX0lXVVNSLAorCQkgICAgICBzaG93X3B3bV9hdXRvX3BvaW50X3B3bSwgc3RvcmVfcHdtX2F1dG9fcG9pbnRfcHdtLAorCQkgICAgICAwLCAzKSwKKwlTRU5TT1JfQVRUUl8yKHB3bTRfYXV0b19wb2ludDJfcHdtLCBTX0lSVUdPfFNfSVdVU1IsCisJCSAgICAgIHNob3dfcHdtX2F1dG9fcG9pbnRfcHdtLCBzdG9yZV9wd21fYXV0b19wb2ludF9wd20sCisJCSAgICAgIDEsIDMpLAorCVNFTlNPUl9BVFRSXzIocHdtNF9hdXRvX3BvaW50M19wd20sIFNfSVJVR098U19JV1VTUiwKKwkJICAgICAgc2hvd19wd21fYXV0b19wb2ludF9wd20sIHN0b3JlX3B3bV9hdXRvX3BvaW50X3B3bSwKKwkJICAgICAgMiwgMyksCisJU0VOU09SX0FUVFJfMihwd200X2F1dG9fcG9pbnQ0X3B3bSwgU19JUlVHT3xTX0lXVVNSLAorCQkgICAgICBzaG93X3B3bV9hdXRvX3BvaW50X3B3bSwgc3RvcmVfcHdtX2F1dG9fcG9pbnRfcHdtLAorCQkgICAgICAzLCAzKSwKKwlTRU5TT1JfQVRUUl8yKHB3bTRfYXV0b19wb2ludDVfcHdtLCBTX0lSVUdPfFNfSVdVU1IsCisJCSAgICAgIHNob3dfcHdtX2F1dG9fcG9pbnRfcHdtLCBzdG9yZV9wd21fYXV0b19wb2ludF9wd20sCisJCSAgICAgIDQsIDMpLAorCVNFTlNPUl9BVFRSXzIocHdtNF9hdXRvX3BvaW50MV90ZW1wLCBTX0lSVUdPfFNfSVdVU1IsCisJCSAgICAgIHNob3dfcHdtX2F1dG9fcG9pbnRfdGVtcCwgc3RvcmVfcHdtX2F1dG9fcG9pbnRfdGVtcCwKKwkJICAgICAgMCwgMyksCisJU0VOU09SX0FUVFJfMihwd200X2F1dG9fcG9pbnQyX3RlbXAsIFNfSVJVR098U19JV1VTUiwKKwkJICAgICAgc2hvd19wd21fYXV0b19wb2ludF90ZW1wLCBzdG9yZV9wd21fYXV0b19wb2ludF90ZW1wLAorCQkgICAgICAxLCAzKSwKKwlTRU5TT1JfQVRUUl8yKHB3bTRfYXV0b19wb2ludDNfdGVtcCwgU19JUlVHT3xTX0lXVVNSLAorCQkgICAgICBzaG93X3B3bV9hdXRvX3BvaW50X3RlbXAsIHN0b3JlX3B3bV9hdXRvX3BvaW50X3RlbXAsCisJCSAgICAgIDIsIDMpLAorCVNFTlNPUl9BVFRSXzIocHdtNF9hdXRvX3BvaW50NF90ZW1wLCBTX0lSVUdPfFNfSVdVU1IsCisJCSAgICAgIHNob3dfcHdtX2F1dG9fcG9pbnRfdGVtcCwgc3RvcmVfcHdtX2F1dG9fcG9pbnRfdGVtcCwKKwkJICAgICAgMywgMyksCisJU0VOU09SX0FUVFJfMihwd200X2F1dG9fcG9pbnQxX3RlbXBfaHlzdCwgU19JUlVHT3xTX0lXVVNSLAorCQkgICAgICBzaG93X3B3bV9hdXRvX3BvaW50X3RlbXBfaHlzdCwKKwkJICAgICAgc3RvcmVfcHdtX2F1dG9fcG9pbnRfdGVtcF9oeXN0LAorCQkgICAgICAwLCAzKSwKKwlTRU5TT1JfQVRUUl8yKHB3bTRfYXV0b19wb2ludDJfdGVtcF9oeXN0LCBTX0lSVUdPLAorCQkgICAgICBzaG93X3B3bV9hdXRvX3BvaW50X3RlbXBfaHlzdCwgTlVMTCwgMSwgMyksCisJU0VOU09SX0FUVFJfMihwd200X2F1dG9fcG9pbnQzX3RlbXBfaHlzdCwgU19JUlVHTywKKwkJICAgICAgc2hvd19wd21fYXV0b19wb2ludF90ZW1wX2h5c3QsIE5VTEwsIDIsIDMpLAorCVNFTlNPUl9BVFRSXzIocHdtNF9hdXRvX3BvaW50NF90ZW1wX2h5c3QsIFNfSVJVR08sCisJCSAgICAgIHNob3dfcHdtX2F1dG9fcG9pbnRfdGVtcF9oeXN0LCBOVUxMLCAzLCAzKSwKK307CisKKy8qIEZhbiAvIFBXTSBhdHRyIGZvciB0aGUgZjgwMDAsIHpvbmVzIG1hcHBlZCB0byB0ZW1wIGluc3RlYWQgb2YgdG8gcHdtIQorICAgQWxzbyB0aGUgcmVnaXN0ZXIgYmxvY2sgYXQgb2Zmc2V0IEEwIG1hcHMgdG8gVEVNUDEgKHNvIG91ciB0ZW1wMiwgYXMgdGhlCisgICBGODAwMCBzdGFydHMgY291bnRpbmcgdGVtcHMgYXQgMCksIEIwIG1hcHMgdGhlIFRFTVAyIGFuZCBDMCBtYXBzIHRvIFRFTVAwICovCitzdGF0aWMgc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlXzIgZjgwMDBfZmFuX2F0dHJbXSA9IHsKKwlTRU5TT1JfQVRUUl8yKGZhbjRfaW5wdXQsIFNfSVJVR08sIHNob3dfZmFuLCBOVUxMLCAwLCAzKSwKKworCVNFTlNPUl9BVFRSXzIocHdtMywgU19JUlVHTywgc2hvd19wd20sIE5VTEwsIDAsIDIpLAorCisJU0VOU09SX0FUVFJfMih0ZW1wMV9hdXRvX3BvaW50MV9wd20sIFNfSVJVR098U19JV1VTUiwKKwkJICAgICAgc2hvd19wd21fYXV0b19wb2ludF9wd20sIHN0b3JlX3B3bV9hdXRvX3BvaW50X3B3bSwKKwkJICAgICAgMCwgMiksCisJU0VOU09SX0FUVFJfMih0ZW1wMV9hdXRvX3BvaW50Ml9wd20sIFNfSVJVR098U19JV1VTUiwKKwkJICAgICAgc2hvd19wd21fYXV0b19wb2ludF9wd20sIHN0b3JlX3B3bV9hdXRvX3BvaW50X3B3bSwKKwkJICAgICAgMSwgMiksCisJU0VOU09SX0FUVFJfMih0ZW1wMV9hdXRvX3BvaW50M19wd20sIFNfSVJVR098U19JV1VTUiwKKwkJICAgICAgc2hvd19wd21fYXV0b19wb2ludF9wd20sIHN0b3JlX3B3bV9hdXRvX3BvaW50X3B3bSwKKwkJICAgICAgMiwgMiksCisJU0VOU09SX0FUVFJfMih0ZW1wMV9hdXRvX3BvaW50NF9wd20sIFNfSVJVR098U19JV1VTUiwKKwkJICAgICAgc2hvd19wd21fYXV0b19wb2ludF9wd20sIHN0b3JlX3B3bV9hdXRvX3BvaW50X3B3bSwKKwkJICAgICAgMywgMiksCisJU0VOU09SX0FUVFJfMih0ZW1wMV9hdXRvX3BvaW50NV9wd20sIFNfSVJVR098U19JV1VTUiwKKwkJICAgICAgc2hvd19wd21fYXV0b19wb2ludF9wd20sIHN0b3JlX3B3bV9hdXRvX3BvaW50X3B3bSwKKwkJICAgICAgNCwgMiksCisJU0VOU09SX0FUVFJfMih0ZW1wMV9hdXRvX3BvaW50MV90ZW1wLCBTX0lSVUdPfFNfSVdVU1IsCisJCSAgICAgIHNob3dfcHdtX2F1dG9fcG9pbnRfdGVtcCwgc3RvcmVfcHdtX2F1dG9fcG9pbnRfdGVtcCwKKwkJICAgICAgMCwgMiksCisJU0VOU09SX0FUVFJfMih0ZW1wMV9hdXRvX3BvaW50Ml90ZW1wLCBTX0lSVUdPfFNfSVdVU1IsCisJCSAgICAgIHNob3dfcHdtX2F1dG9fcG9pbnRfdGVtcCwgc3RvcmVfcHdtX2F1dG9fcG9pbnRfdGVtcCwKKwkJICAgICAgMSwgMiksCisJU0VOU09SX0FUVFJfMih0ZW1wMV9hdXRvX3BvaW50M190ZW1wLCBTX0lSVUdPfFNfSVdVU1IsCisJCSAgICAgIHNob3dfcHdtX2F1dG9fcG9pbnRfdGVtcCwgc3RvcmVfcHdtX2F1dG9fcG9pbnRfdGVtcCwKKwkJICAgICAgMiwgMiksCisJU0VOU09SX0FUVFJfMih0ZW1wMV9hdXRvX3BvaW50NF90ZW1wLCBTX0lSVUdPfFNfSVdVU1IsCisJCSAgICAgIHNob3dfcHdtX2F1dG9fcG9pbnRfdGVtcCwgc3RvcmVfcHdtX2F1dG9fcG9pbnRfdGVtcCwKKwkJICAgICAgMywgMiksCisJU0VOU09SX0FUVFJfMih0ZW1wMV9hdXRvX3BvaW50MV90ZW1wX2h5c3QsIFNfSVJVR098U19JV1VTUiwKKwkJICAgICAgc2hvd19wd21fYXV0b19wb2ludF90ZW1wX2h5c3QsCisJCSAgICAgIHN0b3JlX3B3bV9hdXRvX3BvaW50X3RlbXBfaHlzdCwKKwkJICAgICAgMCwgMiksCisJU0VOU09SX0FUVFJfMih0ZW1wMV9hdXRvX3BvaW50Ml90ZW1wX2h5c3QsIFNfSVJVR08sCisJCSAgICAgIHNob3dfcHdtX2F1dG9fcG9pbnRfdGVtcF9oeXN0LCBOVUxMLCAxLCAyKSwKKwlTRU5TT1JfQVRUUl8yKHRlbXAxX2F1dG9fcG9pbnQzX3RlbXBfaHlzdCwgU19JUlVHTywKKwkJICAgICAgc2hvd19wd21fYXV0b19wb2ludF90ZW1wX2h5c3QsIE5VTEwsIDIsIDIpLAorCVNFTlNPUl9BVFRSXzIodGVtcDFfYXV0b19wb2ludDRfdGVtcF9oeXN0LCBTX0lSVUdPLAorCQkgICAgICBzaG93X3B3bV9hdXRvX3BvaW50X3RlbXBfaHlzdCwgTlVMTCwgMywgMiksCisKKwlTRU5TT1JfQVRUUl8yKHRlbXAyX2F1dG9fcG9pbnQxX3B3bSwgU19JUlVHT3xTX0lXVVNSLAorCQkgICAgICBzaG93X3B3bV9hdXRvX3BvaW50X3B3bSwgc3RvcmVfcHdtX2F1dG9fcG9pbnRfcHdtLAorCQkgICAgICAwLCAwKSwKKwlTRU5TT1JfQVRUUl8yKHRlbXAyX2F1dG9fcG9pbnQyX3B3bSwgU19JUlVHT3xTX0lXVVNSLAorCQkgICAgICBzaG93X3B3bV9hdXRvX3BvaW50X3B3bSwgc3RvcmVfcHdtX2F1dG9fcG9pbnRfcHdtLAorCQkgICAgICAxLCAwKSwKKwlTRU5TT1JfQVRUUl8yKHRlbXAyX2F1dG9fcG9pbnQzX3B3bSwgU19JUlVHT3xTX0lXVVNSLAorCQkgICAgICBzaG93X3B3bV9hdXRvX3BvaW50X3B3bSwgc3RvcmVfcHdtX2F1dG9fcG9pbnRfcHdtLAorCQkgICAgICAyLCAwKSwKKwlTRU5TT1JfQVRUUl8yKHRlbXAyX2F1dG9fcG9pbnQ0X3B3bSwgU19JUlVHT3xTX0lXVVNSLAorCQkgICAgICBzaG93X3B3bV9hdXRvX3BvaW50X3B3bSwgc3RvcmVfcHdtX2F1dG9fcG9pbnRfcHdtLAorCQkgICAgICAzLCAwKSwKKwlTRU5TT1JfQVRUUl8yKHRlbXAyX2F1dG9fcG9pbnQ1X3B3bSwgU19JUlVHT3xTX0lXVVNSLAorCQkgICAgICBzaG93X3B3bV9hdXRvX3BvaW50X3B3bSwgc3RvcmVfcHdtX2F1dG9fcG9pbnRfcHdtLAorCQkgICAgICA0LCAwKSwKKwlTRU5TT1JfQVRUUl8yKHRlbXAyX2F1dG9fcG9pbnQxX3RlbXAsIFNfSVJVR098U19JV1VTUiwKKwkJICAgICAgc2hvd19wd21fYXV0b19wb2ludF90ZW1wLCBzdG9yZV9wd21fYXV0b19wb2ludF90ZW1wLAorCQkgICAgICAwLCAwKSwKKwlTRU5TT1JfQVRUUl8yKHRlbXAyX2F1dG9fcG9pbnQyX3RlbXAsIFNfSVJVR098U19JV1VTUiwKKwkJICAgICAgc2hvd19wd21fYXV0b19wb2ludF90ZW1wLCBzdG9yZV9wd21fYXV0b19wb2ludF90ZW1wLAorCQkgICAgICAxLCAwKSwKKwlTRU5TT1JfQVRUUl8yKHRlbXAyX2F1dG9fcG9pbnQzX3RlbXAsIFNfSVJVR098U19JV1VTUiwKKwkJICAgICAgc2hvd19wd21fYXV0b19wb2ludF90ZW1wLCBzdG9yZV9wd21fYXV0b19wb2ludF90ZW1wLAorCQkgICAgICAyLCAwKSwKKwlTRU5TT1JfQVRUUl8yKHRlbXAyX2F1dG9fcG9pbnQ0X3RlbXAsIFNfSVJVR098U19JV1VTUiwKKwkJICAgICAgc2hvd19wd21fYXV0b19wb2ludF90ZW1wLCBzdG9yZV9wd21fYXV0b19wb2ludF90ZW1wLAorCQkgICAgICAzLCAwKSwKKwlTRU5TT1JfQVRUUl8yKHRlbXAyX2F1dG9fcG9pbnQxX3RlbXBfaHlzdCwgU19JUlVHT3xTX0lXVVNSLAorCQkgICAgICBzaG93X3B3bV9hdXRvX3BvaW50X3RlbXBfaHlzdCwKKwkJICAgICAgc3RvcmVfcHdtX2F1dG9fcG9pbnRfdGVtcF9oeXN0LAorCQkgICAgICAwLCAwKSwKKwlTRU5TT1JfQVRUUl8yKHRlbXAyX2F1dG9fcG9pbnQyX3RlbXBfaHlzdCwgU19JUlVHTywKKwkJICAgICAgc2hvd19wd21fYXV0b19wb2ludF90ZW1wX2h5c3QsIE5VTEwsIDEsIDApLAorCVNFTlNPUl9BVFRSXzIodGVtcDJfYXV0b19wb2ludDNfdGVtcF9oeXN0LCBTX0lSVUdPLAorCQkgICAgICBzaG93X3B3bV9hdXRvX3BvaW50X3RlbXBfaHlzdCwgTlVMTCwgMiwgMCksCisJU0VOU09SX0FUVFJfMih0ZW1wMl9hdXRvX3BvaW50NF90ZW1wX2h5c3QsIFNfSVJVR08sCisJCSAgICAgIHNob3dfcHdtX2F1dG9fcG9pbnRfdGVtcF9oeXN0LCBOVUxMLCAzLCAwKSwKKworCVNFTlNPUl9BVFRSXzIodGVtcDNfYXV0b19wb2ludDFfcHdtLCBTX0lSVUdPfFNfSVdVU1IsCisJCSAgICAgIHNob3dfcHdtX2F1dG9fcG9pbnRfcHdtLCBzdG9yZV9wd21fYXV0b19wb2ludF9wd20sCisJCSAgICAgIDAsIDEpLAorCVNFTlNPUl9BVFRSXzIodGVtcDNfYXV0b19wb2ludDJfcHdtLCBTX0lSVUdPfFNfSVdVU1IsCisJCSAgICAgIHNob3dfcHdtX2F1dG9fcG9pbnRfcHdtLCBzdG9yZV9wd21fYXV0b19wb2ludF9wd20sCisJCSAgICAgIDEsIDEpLAorCVNFTlNPUl9BVFRSXzIodGVtcDNfYXV0b19wb2ludDNfcHdtLCBTX0lSVUdPfFNfSVdVU1IsCisJCSAgICAgIHNob3dfcHdtX2F1dG9fcG9pbnRfcHdtLCBzdG9yZV9wd21fYXV0b19wb2ludF9wd20sCisJCSAgICAgIDIsIDEpLAorCVNFTlNPUl9BVFRSXzIodGVtcDNfYXV0b19wb2ludDRfcHdtLCBTX0lSVUdPfFNfSVdVU1IsCisJCSAgICAgIHNob3dfcHdtX2F1dG9fcG9pbnRfcHdtLCBzdG9yZV9wd21fYXV0b19wb2ludF9wd20sCisJCSAgICAgIDMsIDEpLAorCVNFTlNPUl9BVFRSXzIodGVtcDNfYXV0b19wb2ludDVfcHdtLCBTX0lSVUdPfFNfSVdVU1IsCisJCSAgICAgIHNob3dfcHdtX2F1dG9fcG9pbnRfcHdtLCBzdG9yZV9wd21fYXV0b19wb2ludF9wd20sCisJCSAgICAgIDQsIDEpLAorCVNFTlNPUl9BVFRSXzIodGVtcDNfYXV0b19wb2ludDFfdGVtcCwgU19JUlVHT3xTX0lXVVNSLAorCQkgICAgICBzaG93X3B3bV9hdXRvX3BvaW50X3RlbXAsIHN0b3JlX3B3bV9hdXRvX3BvaW50X3RlbXAsCisJCSAgICAgIDAsIDEpLAorCVNFTlNPUl9BVFRSXzIodGVtcDNfYXV0b19wb2ludDJfdGVtcCwgU19JUlVHT3xTX0lXVVNSLAorCQkgICAgICBzaG93X3B3bV9hdXRvX3BvaW50X3RlbXAsIHN0b3JlX3B3bV9hdXRvX3BvaW50X3RlbXAsCisJCSAgICAgIDEsIDEpLAorCVNFTlNPUl9BVFRSXzIodGVtcDNfYXV0b19wb2ludDNfdGVtcCwgU19JUlVHT3xTX0lXVVNSLAorCQkgICAgICBzaG93X3B3bV9hdXRvX3BvaW50X3RlbXAsIHN0b3JlX3B3bV9hdXRvX3BvaW50X3RlbXAsCisJCSAgICAgIDIsIDEpLAorCVNFTlNPUl9BVFRSXzIodGVtcDNfYXV0b19wb2ludDRfdGVtcCwgU19JUlVHT3xTX0lXVVNSLAorCQkgICAgICBzaG93X3B3bV9hdXRvX3BvaW50X3RlbXAsIHN0b3JlX3B3bV9hdXRvX3BvaW50X3RlbXAsCisJCSAgICAgIDMsIDEpLAorCVNFTlNPUl9BVFRSXzIodGVtcDNfYXV0b19wb2ludDFfdGVtcF9oeXN0LCBTX0lSVUdPfFNfSVdVU1IsCisJCSAgICAgIHNob3dfcHdtX2F1dG9fcG9pbnRfdGVtcF9oeXN0LAorCQkgICAgICBzdG9yZV9wd21fYXV0b19wb2ludF90ZW1wX2h5c3QsCisJCSAgICAgIDAsIDEpLAorCVNFTlNPUl9BVFRSXzIodGVtcDNfYXV0b19wb2ludDJfdGVtcF9oeXN0LCBTX0lSVUdPLAorCQkgICAgICBzaG93X3B3bV9hdXRvX3BvaW50X3RlbXBfaHlzdCwgTlVMTCwgMSwgMSksCisJU0VOU09SX0FUVFJfMih0ZW1wM19hdXRvX3BvaW50M190ZW1wX2h5c3QsIFNfSVJVR08sCisJCSAgICAgIHNob3dfcHdtX2F1dG9fcG9pbnRfdGVtcF9oeXN0LCBOVUxMLCAyLCAxKSwKKwlTRU5TT1JfQVRUUl8yKHRlbXAzX2F1dG9fcG9pbnQ0X3RlbXBfaHlzdCwgU19JUlVHTywKKwkJICAgICAgc2hvd19wd21fYXV0b19wb2ludF90ZW1wX2h5c3QsIE5VTEwsIDMsIDEpLAorfTsKIAogLyogU3VwZXIgSS9PIGZ1bmN0aW9ucyAqLwogc3RhdGljIGlubGluZSBpbnQgc3VwZXJpb19pbmIoaW50IGJhc2UsIGludCByZWcpCkBAIC0yOTksMTEgKzgxMSwxNiBAQAogCW91dGIoU0lPX0xPQ0tfS0VZLCBiYXNlKTsKIH0KIAotc3RhdGljIGlubGluZSB1MTYgZmFuX2Zyb21fcmVnKHUxNiByZWcpCitzdGF0aWMgaW5saW5lIGludCBmYW5fZnJvbV9yZWcodTE2IHJlZykKIHsKIAlyZXR1cm4gcmVnID8gKDE1MDAwMDAgLyByZWcpIDogMDsKIH0KIAorc3RhdGljIGlubGluZSB1MTYgZmFuX3RvX3JlZyhpbnQgZmFuKQoreworCXJldHVybiBmYW4gPyAoMTUwMDAwMCAvIGZhbikgOiAwOworfQorCiBzdGF0aWMgdTggZjcxODgyZmdfcmVhZDgoc3RydWN0IGY3MTg4MmZnX2RhdGEgKmRhdGEsIHU4IHJlZykKIHsKIAl1OCB2YWw7CkBAIC0zMzIsNTIgKzg0OSwxMTEgQEAKIAlvdXRiKHZhbCwgZGF0YS0+YWRkciArIERBVEFfUkVHX09GRlNFVCk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgZjcxODgyZmdfZGF0YSAqZjcxODgyZmdfdXBkYXRlX2RldmljZShzdHJ1Y3QgZGV2aWNlICogZGV2KQorc3RhdGljIHZvaWQgZjcxODgyZmdfd3JpdGUxNihzdHJ1Y3QgZjcxODgyZmdfZGF0YSAqZGF0YSwgdTggcmVnLCB1MTYgdmFsKQoreworCW91dGIocmVnKyssIGRhdGEtPmFkZHIgKyBBRERSX1JFR19PRkZTRVQpOworCW91dGIodmFsID4+IDgsIGRhdGEtPmFkZHIgKyBEQVRBX1JFR19PRkZTRVQpOworCW91dGIocmVnLCBkYXRhLT5hZGRyICsgQUREUl9SRUdfT0ZGU0VUKTsKKwlvdXRiKHZhbCAmIDI1NSwgZGF0YS0+YWRkciArIERBVEFfUkVHX09GRlNFVCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZjcxODgyZmdfZGF0YSAqZjcxODgyZmdfdXBkYXRlX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGY3MTg4MmZnX2RhdGEgKmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQlpbnQgbnIsIHJlZywgcmVnMjsKKwlpbnQgbnIsIHJlZyA9IDAsIHJlZzI7CisJaW50IG5yX2ZhbnMgPSAoZGF0YS0+dHlwZSA9PSBmNzE4ODJmZykgPyA0IDogMzsKKwlpbnQgbnJfaW5zID0gKGRhdGEtPnR5cGUgPT0gZjgwMDApID8gMyA6IDk7CisJaW50IHRlbXBfc3RhcnQgPSAoZGF0YS0+dHlwZSA9PSBmODAwMCkgPyAwIDogMTsKIAogCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKIAogCS8qIFVwZGF0ZSBvbmNlIGV2ZXJ5IDYwIHNlY29uZHMgKi8KIAlpZiAoIHRpbWVfYWZ0ZXIoamlmZmllcywgZGF0YS0+bGFzdF9saW1pdHMgKyA2MCAqIEhaICkgfHwKIAkJCSFkYXRhLT52YWxpZCkgewotCQlkYXRhLT5pbjFfbWF4ID0gZjcxODgyZmdfcmVhZDgoZGF0YSwgRjcxODgyRkdfUkVHX0lOMV9ISUdIKTsKLQkJZGF0YS0+aW5fYmVlcCA9IGY3MTg4MmZnX3JlYWQ4KGRhdGEsIEY3MTg4MkZHX1JFR19JTl9CRUVQKTsKKwkJaWYgKGRhdGEtPnR5cGUgPT0gZjcxODgyZmcpIHsKKwkJCWRhdGEtPmluMV9tYXggPQorCQkJCWY3MTg4MmZnX3JlYWQ4KGRhdGEsIEY3MTg4MkZHX1JFR19JTjFfSElHSCk7CisJCQlkYXRhLT5pbl9iZWVwID0KKwkJCQlmNzE4ODJmZ19yZWFkOChkYXRhLCBGNzE4ODJGR19SRUdfSU5fQkVFUCk7CisJCX0KIAogCQkvKiBHZXQgSGlnaCAmIGJvdW5kYXJ5IHRlbXBzKi8KLQkJZm9yIChuciA9IDA7IG5yIDwgMzsgbnIrKykgeworCQlmb3IgKG5yID0gdGVtcF9zdGFydDsgbnIgPCAzICsgdGVtcF9zdGFydDsgbnIrKykgewogCQkJZGF0YS0+dGVtcF9vdnRbbnJdID0gZjcxODgyZmdfcmVhZDgoZGF0YSwKIAkJCQkJCUY3MTg4MkZHX1JFR19URU1QX09WVChucikpOwogCQkJZGF0YS0+dGVtcF9oaWdoW25yXSA9IGY3MTg4MmZnX3JlYWQ4KGRhdGEsCiAJCQkJCQlGNzE4ODJGR19SRUdfVEVNUF9ISUdIKG5yKSk7CiAJCX0KIAotCQkvKiBIYXZlIHRvIGhhcmRjb2RlIGh5c3QqLwotCQlkYXRhLT50ZW1wX2h5c3RbMF0gPSBmNzE4ODJmZ19yZWFkOChkYXRhLAotCQkJCQkJRjcxODgyRkdfUkVHX1RFTVBfSFlTVDEpID4+IDQ7Ci0JCS8qIEh5c3QgdGVtcHMgMiAmIDMgc3RvcmVkIGluIHNhbWUgcmVnaXN0ZXIgKi8KLQkJcmVnID0gZjcxODgyZmdfcmVhZDgoZGF0YSwgRjcxODgyRkdfUkVHX1RFTVBfSFlTVDIzKTsKLQkJZGF0YS0+dGVtcF9oeXN0WzFdID0gcmVnICYgMHgwRjsKLQkJZGF0YS0+dGVtcF9oeXN0WzJdID0gcmVnID4+IDQ7Ci0KLQkJLyogSGF2ZSB0byBoYXJkY29kZSB0eXBlLCBiZWNhdXNlIHRlbXAxIGlzIHNwZWNpYWwgKi8KLQkJcmVnICA9IGY3MTg4MmZnX3JlYWQ4KGRhdGEsIEY3MTg4MkZHX1JFR19URU1QX1RZUEUpOworCQlpZiAoZGF0YS0+dHlwZSAhPSBmODAwMCkgeworCQkJZGF0YS0+ZmFuX2JlZXAgPSBmNzE4ODJmZ19yZWFkOChkYXRhLAorCQkJCQkJRjcxODgyRkdfUkVHX0ZBTl9CRUVQKTsKKwkJCWRhdGEtPnRlbXBfYmVlcCA9IGY3MTg4MmZnX3JlYWQ4KGRhdGEsCisJCQkJCQlGNzE4ODJGR19SRUdfVEVNUF9CRUVQKTsKKwkJCWRhdGEtPnRlbXBfaHlzdFswXSA9IGY3MTg4MmZnX3JlYWQ4KGRhdGEsCisJCQkJCQlGNzE4ODJGR19SRUdfVEVNUF9IWVNUKDApKTsKKwkJCWRhdGEtPnRlbXBfaHlzdFsxXSA9IGY3MTg4MmZnX3JlYWQ4KGRhdGEsCisJCQkJCQlGNzE4ODJGR19SRUdfVEVNUF9IWVNUKDEpKTsKKwkJCS8qIEhhdmUgdG8gaGFyZGNvZGUgdHlwZSwgYmVjYXVzZSB0ZW1wMSBpcyBzcGVjaWFsICovCisJCQlyZWcgID0gZjcxODgyZmdfcmVhZDgoZGF0YSwgRjcxODgyRkdfUkVHX1RFTVBfVFlQRSk7CisJCQlkYXRhLT50ZW1wX3R5cGVbMl0gPSAocmVnICYgMHgwNCkgPyAyIDogNDsKKwkJCWRhdGEtPnRlbXBfdHlwZVszXSA9IChyZWcgJiAweDA4KSA/IDIgOiA0OworCQl9CiAJCXJlZzIgPSBmNzE4ODJmZ19yZWFkOChkYXRhLCBGNzE4ODJGR19SRUdfUEVDSSk7CiAJCWlmICgocmVnMiAmIDB4MDMpID09IDB4MDEpCi0JCQlkYXRhLT50ZW1wX3R5cGVbMF0gPSA2IC8qIFBFQ0kgKi87CisJCQlkYXRhLT50ZW1wX3R5cGVbMV0gPSA2IC8qIFBFQ0kgKi87CiAJCWVsc2UgaWYgKChyZWcyICYgMHgwMykgPT0gMHgwMikKLQkJCWRhdGEtPnRlbXBfdHlwZVswXSA9IDUgLyogQU1EU0kgKi87CisJCQlkYXRhLT50ZW1wX3R5cGVbMV0gPSA1IC8qIEFNRFNJICovOworCQllbHNlIGlmIChkYXRhLT50eXBlICE9IGY4MDAwKQorCQkJZGF0YS0+dGVtcF90eXBlWzFdID0gKHJlZyAmIDB4MDIpID8gMiA6IDQ7CiAJCWVsc2UKLQkJCWRhdGEtPnRlbXBfdHlwZVswXSA9IChyZWcgJiAweDAyKSA/IDIgOiA0OworCQkJZGF0YS0+dGVtcF90eXBlWzFdID0gMjsgLyogRjgwMDAgb25seSBzdXBwb3J0cyBCSlQgKi8KIAotCQlkYXRhLT50ZW1wX3R5cGVbMV0gPSAocmVnICYgMHgwNCkgPyAyIDogNDsKLQkJZGF0YS0+dGVtcF90eXBlWzJdID0gKHJlZyAmIDB4MDgpID8gMiA6IDQ7CisJCWRhdGEtPnB3bV9lbmFibGUgPSBmNzE4ODJmZ19yZWFkOChkYXRhLAorCQkJCQkJICBGNzE4ODJGR19SRUdfUFdNX0VOQUJMRSk7CisJCWRhdGEtPnB3bV9hdXRvX3BvaW50X2h5c3RbMF0gPQorCQkJZjcxODgyZmdfcmVhZDgoZGF0YSwgRjcxODgyRkdfUkVHX0ZBTl9IWVNUKDApKTsKKwkJZGF0YS0+cHdtX2F1dG9fcG9pbnRfaHlzdFsxXSA9CisJCQlmNzE4ODJmZ19yZWFkOChkYXRhLCBGNzE4ODJGR19SRUdfRkFOX0hZU1QoMSkpOwogCi0JCWRhdGEtPnRlbXBfYmVlcCA9IGY3MTg4MmZnX3JlYWQ4KGRhdGEsIEY3MTg4MkZHX1JFR19URU1QX0JFRVApOworCQlmb3IgKG5yID0gMDsgbnIgPCBucl9mYW5zOyBucisrKSB7CisJCQlkYXRhLT5wd21fYXV0b19wb2ludF9tYXBwaW5nW25yXSA9CisJCQkgICAgZjcxODgyZmdfcmVhZDgoZGF0YSwKKwkJCQkJICAgRjcxODgyRkdfUkVHX1BPSU5UX01BUFBJTkcobnIpKTsKIAotCQlkYXRhLT5mYW5fYmVlcCA9IGY3MTg4MmZnX3JlYWQ4KGRhdGEsIEY3MTg4MkZHX1JFR19GQU5fQkVFUCk7Ci0KKwkJCWlmIChkYXRhLT50eXBlICE9IGY3MTg2MmZnKSB7CisJCQkJaW50IHBvaW50OworCQkJCWZvciAocG9pbnQgPSAwOyBwb2ludCA8IDU7IHBvaW50KyspIHsKKwkJCQkJZGF0YS0+cHdtX2F1dG9fcG9pbnRfcHdtW25yXVtwb2ludF0gPQorCQkJCQkJZjcxODgyZmdfcmVhZDgoZGF0YSwKKwkJCQkJCQlGNzE4ODJGR19SRUdfUE9JTlRfUFdNCisJCQkJCQkJKG5yLCBwb2ludCkpOworCQkJCX0KKwkJCQlmb3IgKHBvaW50ID0gMDsgcG9pbnQgPCA0OyBwb2ludCsrKSB7CisJCQkJCWRhdGEtPnB3bV9hdXRvX3BvaW50X3RlbXBbbnJdW3BvaW50XSA9CisJCQkJCQlmNzE4ODJmZ19yZWFkOChkYXRhLAorCQkJCQkJCUY3MTg4MkZHX1JFR19QT0lOVF9URU1QCisJCQkJCQkJKG5yLCBwb2ludCkpOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJZGF0YS0+cHdtX2F1dG9fcG9pbnRfcHdtW25yXVsxXSA9CisJCQkJCWY3MTg4MmZnX3JlYWQ4KGRhdGEsCisJCQkJCQlGNzE4ODJGR19SRUdfUE9JTlRfUFdNCisJCQkJCQkobnIsIDEpKTsKKwkJCQlkYXRhLT5wd21fYXV0b19wb2ludF9wd21bbnJdWzRdID0KKwkJCQkJZjcxODgyZmdfcmVhZDgoZGF0YSwKKwkJCQkJCUY3MTg4MkZHX1JFR19QT0lOVF9QV00KKwkJCQkJCShuciwgNCkpOworCQkJCWRhdGEtPnB3bV9hdXRvX3BvaW50X3RlbXBbbnJdWzBdID0KKwkJCQkJZjcxODgyZmdfcmVhZDgoZGF0YSwKKwkJCQkJCUY3MTg4MkZHX1JFR19QT0lOVF9URU1QCisJCQkJCQkobnIsIDApKTsKKwkJCQlkYXRhLT5wd21fYXV0b19wb2ludF90ZW1wW25yXVszXSA9CisJCQkJCWY3MTg4MmZnX3JlYWQ4KGRhdGEsCisJCQkJCQlGNzE4ODJGR19SRUdfUE9JTlRfVEVNUAorCQkJCQkJKG5yLCAzKSk7CisJCQl9CisJCX0KIAkJZGF0YS0+bGFzdF9saW1pdHMgPSBqaWZmaWVzOwogCX0KIApAQCAtMzg3LDE5ICs5NjMsMzIgQEAKIAkJCQkJCUY3MTg4MkZHX1JFR19URU1QX1NUQVRVUyk7CiAJCWRhdGEtPnRlbXBfZGlvZGVfb3BlbiA9IGY3MTg4MmZnX3JlYWQ4KGRhdGEsCiAJCQkJCQlGNzE4ODJGR19SRUdfVEVNUF9ESU9ERV9PUEVOKTsKLQkJZm9yIChuciA9IDA7IG5yIDwgMzsgbnIrKykKKwkJZm9yIChuciA9IHRlbXBfc3RhcnQ7IG5yIDwgMyArIHRlbXBfc3RhcnQ7IG5yKyspCiAJCQlkYXRhLT50ZW1wW25yXSA9IGY3MTg4MmZnX3JlYWQ4KGRhdGEsCiAJCQkJCQlGNzE4ODJGR19SRUdfVEVNUChucikpOwogCiAJCWRhdGEtPmZhbl9zdGF0dXMgPSBmNzE4ODJmZ19yZWFkOChkYXRhLAogCQkJCQkJRjcxODgyRkdfUkVHX0ZBTl9TVEFUVVMpOwotCQlmb3IgKG5yID0gMDsgbnIgPCA0OyBucisrKQorCQlmb3IgKG5yID0gMDsgbnIgPCBucl9mYW5zOyBucisrKSB7CiAJCQlkYXRhLT5mYW5bbnJdID0gZjcxODgyZmdfcmVhZDE2KGRhdGEsCiAJCQkJCQlGNzE4ODJGR19SRUdfRkFOKG5yKSk7CisJCQlkYXRhLT5mYW5fdGFyZ2V0W25yXSA9CisJCQkgICAgZjcxODgyZmdfcmVhZDE2KGRhdGEsIEY3MTg4MkZHX1JFR19GQU5fVEFSR0VUKG5yKSk7CisJCQlkYXRhLT5mYW5fZnVsbF9zcGVlZFtucl0gPQorCQkJICAgIGY3MTg4MmZnX3JlYWQxNihkYXRhLAorCQkJCQkgICAgRjcxODgyRkdfUkVHX0ZBTl9GVUxMX1NQRUVEKG5yKSk7CisJCQlkYXRhLT5wd21bbnJdID0KKwkJCSAgICBmNzE4ODJmZ19yZWFkOChkYXRhLCBGNzE4ODJGR19SRUdfUFdNKG5yKSk7CisJCX0KIAotCQlkYXRhLT5pbl9zdGF0dXMgPSBmNzE4ODJmZ19yZWFkOChkYXRhLAorCQkvKiBUaGUgZjgwMDAgY2FuIG1vbml0b3IgMSBtb3JlIGZhbiwgYnV0IGhhcyBubyBwd20gZm9yIGl0ICovCisJCWlmIChkYXRhLT50eXBlID09IGY4MDAwKQorCQkJZGF0YS0+ZmFuWzNdID0gZjcxODgyZmdfcmVhZDE2KGRhdGEsCisJCQkJCQlGNzE4ODJGR19SRUdfRkFOKDMpKTsKKwkJaWYgKGRhdGEtPnR5cGUgPT0gZjcxODgyZmcpCisJCQlkYXRhLT5pbl9zdGF0dXMgPSBmNzE4ODJmZ19yZWFkOChkYXRhLAogCQkJCQkJRjcxODgyRkdfUkVHX0lOX1NUQVRVUyk7Ci0JCWZvciAobnIgPSAwOyBuciA8IDk7IG5yKyspCisJCWZvciAobnIgPSAwOyBuciA8IG5yX2luczsgbnIrKykKIAkJCWRhdGEtPmluW25yXSA9IGY3MTg4MmZnX3JlYWQ4KGRhdGEsCiAJCQkJCQlGNzE4ODJGR19SRUdfSU4obnIpKTsKIApAQCAtNDE3LDcgKzEwMDYsNyBAQAogCWNoYXIgKmJ1ZikKIHsKIAlzdHJ1Y3QgZjcxODgyZmdfZGF0YSAqZGF0YSA9IGY3MTg4MmZnX3VwZGF0ZV9kZXZpY2UoZGV2KTsKLQlpbnQgbnIgPSB0b19zZW5zb3JfZGV2X2F0dHIoZGV2YXR0ciktPmluZGV4OworCWludCBuciA9IHRvX3NlbnNvcl9kZXZfYXR0cl8yKGRldmF0dHIpLT5pbmRleDsKIAlpbnQgc3BlZWQgPSBmYW5fZnJvbV9yZWcoZGF0YS0+ZmFuW25yXSk7CiAKIAlpZiAoc3BlZWQgPT0gRkFOX01JTl9ERVRFQ1QpCkBAIC00MjYsMTEgKzEwMTUsMzkgQEAKIAlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgc3BlZWQpOwogfQogCitzdGF0aWMgc3NpemVfdCBzaG93X2Zhbl9mdWxsX3NwZWVkKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2YXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBmNzE4ODJmZ19kYXRhICpkYXRhID0gZjcxODgyZmdfdXBkYXRlX2RldmljZShkZXYpOworCWludCBuciA9IHRvX3NlbnNvcl9kZXZfYXR0cl8yKGRldmF0dHIpLT5pbmRleDsKKwlpbnQgc3BlZWQgPSBmYW5fZnJvbV9yZWcoZGF0YS0+ZmFuX2Z1bGxfc3BlZWRbbnJdKTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgc3BlZWQpOworfQorCitzdGF0aWMgc3NpemVfdCBzdG9yZV9mYW5fZnVsbF9zcGVlZChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZhdHRyLAorCQkJCSAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgZjcxODgyZmdfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCWludCBuciA9IHRvX3NlbnNvcl9kZXZfYXR0cl8yKGRldmF0dHIpLT5pbmRleDsKKwlsb25nIHZhbCA9IHNpbXBsZV9zdHJ0b2woYnVmLCBOVUxMLCAxMCk7CisKKwl2YWwgPSBTRU5TT1JTX0xJTUlUKHZhbCwgMjMsIDE1MDAwMDApOworCXZhbCA9IGZhbl90b19yZWcodmFsKTsKKworCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlmNzE4ODJmZ193cml0ZTE2KGRhdGEsIEY3MTg4MkZHX1JFR19GQU5fRlVMTF9TUEVFRChuciksIHZhbCk7CisJZGF0YS0+ZmFuX2Z1bGxfc3BlZWRbbnJdID0gdmFsOworCW11dGV4X3VubG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOworCisJcmV0dXJuIGNvdW50OworfQorCiBzdGF0aWMgc3NpemVfdCBzaG93X2Zhbl9iZWVwKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUKIAkqZGV2YXR0ciwgY2hhciAqYnVmKQogewogCXN0cnVjdCBmNzE4ODJmZ19kYXRhICpkYXRhID0gZjcxODgyZmdfdXBkYXRlX2RldmljZShkZXYpOwotCWludCBuciA9IHRvX3NlbnNvcl9kZXZfYXR0cihkZXZhdHRyKS0+aW5kZXg7CisJaW50IG5yID0gdG9fc2Vuc29yX2Rldl9hdHRyXzIoZGV2YXR0ciktPmluZGV4OwogCiAJaWYgKGRhdGEtPmZhbl9iZWVwICYgKDEgPDwgbnIpKQogCQlyZXR1cm4gc3ByaW50ZihidWYsICIxXG4iKTsKQEAgLTQ0MiwxMCArMTA1OSwxMSBAQAogCSpkZXZhdHRyLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKIHsKIAlzdHJ1Y3QgZjcxODgyZmdfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCWludCBuciA9IHRvX3NlbnNvcl9kZXZfYXR0cihkZXZhdHRyKS0+aW5kZXg7Ci0JaW50IHZhbCA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApOworCWludCBuciA9IHRvX3NlbnNvcl9kZXZfYXR0cl8yKGRldmF0dHIpLT5pbmRleDsKKwl1bnNpZ25lZCBsb25nIHZhbCA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApOwogCiAJbXV0ZXhfbG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOworCWRhdGEtPmZhbl9iZWVwID0gZjcxODgyZmdfcmVhZDgoZGF0YSwgRjcxODgyRkdfUkVHX0ZBTl9CRUVQKTsKIAlpZiAodmFsKQogCQlkYXRhLT5mYW5fYmVlcCB8PSAxIDw8IG5yOwogCWVsc2UKQEAgLTQ2MSw3ICsxMDc5LDcgQEAKIAkqZGV2YXR0ciwgY2hhciAqYnVmKQogewogCXN0cnVjdCBmNzE4ODJmZ19kYXRhICpkYXRhID0gZjcxODgyZmdfdXBkYXRlX2RldmljZShkZXYpOwotCWludCBuciA9IHRvX3NlbnNvcl9kZXZfYXR0cihkZXZhdHRyKS0+aW5kZXg7CisJaW50IG5yID0gdG9fc2Vuc29yX2Rldl9hdHRyXzIoZGV2YXR0ciktPmluZGV4OwogCiAJaWYgKGRhdGEtPmZhbl9zdGF0dXMgJiAoMSA8PCBucikpCiAJCXJldHVybiBzcHJpbnRmKGJ1ZiwgIjFcbiIpOwpAQCAtNDczLDcgKzEwOTEsNyBAQAogCWNoYXIgKmJ1ZikKIHsKIAlzdHJ1Y3QgZjcxODgyZmdfZGF0YSAqZGF0YSA9IGY3MTg4MmZnX3VwZGF0ZV9kZXZpY2UoZGV2KTsKLQlpbnQgbnIgPSB0b19zZW5zb3JfZGV2X2F0dHIoZGV2YXR0ciktPmluZGV4OworCWludCBuciA9IHRvX3NlbnNvcl9kZXZfYXR0cl8yKGRldmF0dHIpLT5pbmRleDsKIAogCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBkYXRhLT5pbltucl0gKiA4KTsKIH0KQEAgLTQ5MCwxMCArMTEwOCw4IEBACiAJKmRldmF0dHIsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQogewogCXN0cnVjdCBmNzE4ODJmZ19kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0JaW50IHZhbCA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApIC8gODsKLQotCWlmICh2YWwgPiAyNTUpCi0JCXZhbCA9IDI1NTsKKwlsb25nIHZhbCA9IHNpbXBsZV9zdHJ0b2woYnVmLCBOVUxMLCAxMCkgLyA4OworCXZhbCA9IFNFTlNPUlNfTElNSVQodmFsLCAwLCAyNTUpOwogCiAJbXV0ZXhfbG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOwogCWY3MTg4MmZnX3dyaXRlOChkYXRhLCBGNzE4ODJGR19SRUdfSU4xX0hJR0gsIHZhbCk7CkBAIC01MDcsNyArMTEyMyw3IEBACiAJKmRldmF0dHIsIGNoYXIgKmJ1ZikKIHsKIAlzdHJ1Y3QgZjcxODgyZmdfZGF0YSAqZGF0YSA9IGY3MTg4MmZnX3VwZGF0ZV9kZXZpY2UoZGV2KTsKLQlpbnQgbnIgPSB0b19zZW5zb3JfZGV2X2F0dHIoZGV2YXR0ciktPmluZGV4OworCWludCBuciA9IHRvX3NlbnNvcl9kZXZfYXR0cl8yKGRldmF0dHIpLT5pbmRleDsKIAogCWlmIChkYXRhLT5pbl9iZWVwICYgKDEgPDwgbnIpKQogCQlyZXR1cm4gc3ByaW50ZihidWYsICIxXG4iKTsKQEAgLTUxOSwxMCArMTEzNSwxMSBAQAogCSpkZXZhdHRyLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKIHsKIAlzdHJ1Y3QgZjcxODgyZmdfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCWludCBuciA9IHRvX3NlbnNvcl9kZXZfYXR0cihkZXZhdHRyKS0+aW5kZXg7Ci0JaW50IHZhbCA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApOworCWludCBuciA9IHRvX3NlbnNvcl9kZXZfYXR0cl8yKGRldmF0dHIpLT5pbmRleDsKKwl1bnNpZ25lZCBsb25nIHZhbCA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApOwogCiAJbXV0ZXhfbG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOworCWRhdGEtPmluX2JlZXAgPSBmNzE4ODJmZ19yZWFkOChkYXRhLCBGNzE4ODJGR19SRUdfSU5fQkVFUCk7CiAJaWYgKHZhbCkKIAkJZGF0YS0+aW5fYmVlcCB8PSAxIDw8IG5yOwogCWVsc2UKQEAgLTUzOCw3ICsxMTU1LDcgQEAKIAkqZGV2YXR0ciwgY2hhciAqYnVmKQogewogCXN0cnVjdCBmNzE4ODJmZ19kYXRhICpkYXRhID0gZjcxODgyZmdfdXBkYXRlX2RldmljZShkZXYpOwotCWludCBuciA9IHRvX3NlbnNvcl9kZXZfYXR0cihkZXZhdHRyKS0+aW5kZXg7CisJaW50IG5yID0gdG9fc2Vuc29yX2Rldl9hdHRyXzIoZGV2YXR0ciktPmluZGV4OwogCiAJaWYgKGRhdGEtPmluX3N0YXR1cyAmICgxIDw8IG5yKSkKIAkJcmV0dXJuIHNwcmludGYoYnVmLCAiMVxuIik7CkBAIC01NTAsNyArMTE2Nyw3IEBACiAJY2hhciAqYnVmKQogewogCXN0cnVjdCBmNzE4ODJmZ19kYXRhICpkYXRhID0gZjcxODgyZmdfdXBkYXRlX2RldmljZShkZXYpOwotCWludCBuciA9IHRvX3NlbnNvcl9kZXZfYXR0cihkZXZhdHRyKS0+aW5kZXg7CisJaW50IG5yID0gdG9fc2Vuc29yX2Rldl9hdHRyXzIoZGV2YXR0ciktPmluZGV4OwogCiAJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIGRhdGEtPnRlbXBbbnJdICogMTAwMCk7CiB9CkBAIC01NTksNyArMTE3Niw3IEBACiAJKmRldmF0dHIsIGNoYXIgKmJ1ZikKIHsKIAlzdHJ1Y3QgZjcxODgyZmdfZGF0YSAqZGF0YSA9IGY3MTg4MmZnX3VwZGF0ZV9kZXZpY2UoZGV2KTsKLQlpbnQgbnIgPSB0b19zZW5zb3JfZGV2X2F0dHIoZGV2YXR0ciktPmluZGV4OworCWludCBuciA9IHRvX3NlbnNvcl9kZXZfYXR0cl8yKGRldmF0dHIpLT5pbmRleDsKIAogCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBkYXRhLT50ZW1wX2hpZ2hbbnJdICogMTAwMCk7CiB9CkBAIC01NjgsMTEgKzExODUsOSBAQAogCSpkZXZhdHRyLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKIHsKIAlzdHJ1Y3QgZjcxODgyZmdfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCWludCBuciA9IHRvX3NlbnNvcl9kZXZfYXR0cihkZXZhdHRyKS0+aW5kZXg7Ci0JaW50IHZhbCA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApIC8gMTAwMDsKLQotCWlmICh2YWwgPiAyNTUpCi0JCXZhbCA9IDI1NTsKKwlpbnQgbnIgPSB0b19zZW5zb3JfZGV2X2F0dHJfMihkZXZhdHRyKS0+aW5kZXg7CisJbG9uZyB2YWwgPSBzaW1wbGVfc3RydG9sKGJ1ZiwgTlVMTCwgMTApIC8gMTAwMDsKKwl2YWwgPSBTRU5TT1JTX0xJTUlUKHZhbCwgMCwgMjU1KTsKIAogCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKIAlmNzE4ODJmZ193cml0ZTgoZGF0YSwgRjcxODgyRkdfUkVHX1RFTVBfSElHSChuciksIHZhbCk7CkBAIC01ODYsNDggKzEyMDEsNDYgQEAKIAkqZGV2YXR0ciwgY2hhciAqYnVmKQogewogCXN0cnVjdCBmNzE4ODJmZ19kYXRhICpkYXRhID0gZjcxODgyZmdfdXBkYXRlX2RldmljZShkZXYpOwotCWludCBuciA9IHRvX3NlbnNvcl9kZXZfYXR0cihkZXZhdHRyKS0+aW5kZXg7CisJaW50IG5yID0gdG9fc2Vuc29yX2Rldl9hdHRyXzIoZGV2YXR0ciktPmluZGV4OworCWludCB0ZW1wX21heF9oeXN0OwogCi0JcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsCi0JCShkYXRhLT50ZW1wX2hpZ2hbbnJdIC0gZGF0YS0+dGVtcF9oeXN0W25yXSkgKiAxMDAwKTsKKwltdXRleF9sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CisJaWYgKG5yICYgMSkKKwkJdGVtcF9tYXhfaHlzdCA9IGRhdGEtPnRlbXBfaHlzdFtuciAvIDJdID4+IDQ7CisJZWxzZQorCQl0ZW1wX21heF9oeXN0ID0gZGF0YS0+dGVtcF9oeXN0W25yIC8gMl0gJiAweDBmOworCXRlbXBfbWF4X2h5c3QgPSAoZGF0YS0+dGVtcF9oaWdoW25yXSAtIHRlbXBfbWF4X2h5c3QpICogMTAwMDsKKwltdXRleF91bmxvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCB0ZW1wX21heF9oeXN0KTsKIH0KIAogc3RhdGljIHNzaXplX3Qgc3RvcmVfdGVtcF9tYXhfaHlzdChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlCiAJKmRldmF0dHIsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQogewogCXN0cnVjdCBmNzE4ODJmZ19kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0JaW50IG5yID0gdG9fc2Vuc29yX2Rldl9hdHRyKGRldmF0dHIpLT5pbmRleDsKLQlpbnQgdmFsID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCkgLyAxMDAwOworCWludCBuciA9IHRvX3NlbnNvcl9kZXZfYXR0cl8yKGRldmF0dHIpLT5pbmRleDsKKwlsb25nIHZhbCA9IHNpbXBsZV9zdHJ0b2woYnVmLCBOVUxMLCAxMCkgLyAxMDAwOwogCXNzaXplX3QgcmV0ID0gY291bnQ7CisJdTggcmVnOwogCiAJbXV0ZXhfbG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOwogCiAJLyogY29udmVydCBhYnMgdG8gcmVsYXRpdmUgYW5kIGNoZWNrICovCisJZGF0YS0+dGVtcF9oaWdoW25yXSA9IGY3MTg4MmZnX3JlYWQ4KGRhdGEsIEY3MTg4MkZHX1JFR19URU1QX0hJR0gobnIpKTsKKwl2YWwgPSBTRU5TT1JTX0xJTUlUKHZhbCwgZGF0YS0+dGVtcF9oaWdoW25yXSAtIDE1LAorCQkJICAgIGRhdGEtPnRlbXBfaGlnaFtucl0pOwogCXZhbCA9IGRhdGEtPnRlbXBfaGlnaFtucl0gLSB2YWw7Ci0JaWYgKHZhbCA8IDAgfHwgdmFsID4gMTUpIHsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBzdG9yZV90ZW1wX21heF9oeXN0X2V4aXQ7Ci0JfQotCi0JZGF0YS0+dGVtcF9oeXN0W25yXSA9IHZhbDsKIAogCS8qIGNvbnZlcnQgdmFsdWUgdG8gcmVnaXN0ZXIgY29udGVudHMgKi8KLQlzd2l0Y2ggKG5yKSB7Ci0JCWNhc2UgMDoKLQkJCXZhbCA9IHZhbCA8PCA0OwotCQkJYnJlYWs7Ci0JCWNhc2UgMToKLQkJCXZhbCA9IHZhbCB8IChkYXRhLT50ZW1wX2h5c3RbMl0gPDwgNCk7Ci0JCQlicmVhazsKLQkJY2FzZSAyOgotCQkJdmFsID0gZGF0YS0+dGVtcF9oeXN0WzFdIHwgKHZhbCA8PCA0KTsKLQkJCWJyZWFrOwotCX0KKwlyZWcgPSBmNzE4ODJmZ19yZWFkOChkYXRhLCBGNzE4ODJGR19SRUdfVEVNUF9IWVNUKG5yIC8gMikpOworCWlmIChuciAmIDEpCisJCXJlZyA9IChyZWcgJiAweDBmKSB8ICh2YWwgPDwgNCk7CisJZWxzZQorCQlyZWcgPSAocmVnICYgMHhmMCkgfCB2YWw7CisJZjcxODgyZmdfd3JpdGU4KGRhdGEsIEY3MTg4MkZHX1JFR19URU1QX0hZU1QobnIgLyAyKSwgcmVnKTsKKwlkYXRhLT50ZW1wX2h5c3RbbnIgLyAyXSA9IHJlZzsKIAotCWY3MTg4MmZnX3dyaXRlOChkYXRhLCBuciA/IEY3MTg4MkZHX1JFR19URU1QX0hZU1QyMyA6Ci0JCUY3MTg4MkZHX1JFR19URU1QX0hZU1QxLCB2YWwpOwotCi1zdG9yZV90ZW1wX21heF9oeXN0X2V4aXQ6CiAJbXV0ZXhfdW5sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CiAJcmV0dXJuIHJldDsKIH0KQEAgLTYzNiw3ICsxMjQ5LDcgQEAKIAkqZGV2YXR0ciwgY2hhciAqYnVmKQogewogCXN0cnVjdCBmNzE4ODJmZ19kYXRhICpkYXRhID0gZjcxODgyZmdfdXBkYXRlX2RldmljZShkZXYpOwotCWludCBuciA9IHRvX3NlbnNvcl9kZXZfYXR0cihkZXZhdHRyKS0+aW5kZXg7CisJaW50IG5yID0gdG9fc2Vuc29yX2Rldl9hdHRyXzIoZGV2YXR0ciktPmluZGV4OwogCiAJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIGRhdGEtPnRlbXBfb3Z0W25yXSAqIDEwMDApOwogfQpAQCAtNjQ1LDExICsxMjU4LDkgQEAKIAkqZGV2YXR0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7CiAJc3RydWN0IGY3MTg4MmZnX2RhdGEgKmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQlpbnQgbnIgPSB0b19zZW5zb3JfZGV2X2F0dHIoZGV2YXR0ciktPmluZGV4OwotCWludCB2YWwgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKSAvIDEwMDA7Ci0KLQlpZiAodmFsID4gMjU1KQotCQl2YWwgPSAyNTU7CisJaW50IG5yID0gdG9fc2Vuc29yX2Rldl9hdHRyXzIoZGV2YXR0ciktPmluZGV4OworCWxvbmcgdmFsID0gc2ltcGxlX3N0cnRvbChidWYsIE5VTEwsIDEwKSAvIDEwMDA7CisJdmFsID0gU0VOU09SU19MSU1JVCh2YWwsIDAsIDI1NSk7CiAKIAltdXRleF9sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CiAJZjcxODgyZmdfd3JpdGU4KGRhdGEsIEY3MTg4MkZHX1JFR19URU1QX09WVChuciksIHZhbCk7CkBAIC02NjMsMTcgKzEyNzQsMjUgQEAKIAkqZGV2YXR0ciwgY2hhciAqYnVmKQogewogCXN0cnVjdCBmNzE4ODJmZ19kYXRhICpkYXRhID0gZjcxODgyZmdfdXBkYXRlX2RldmljZShkZXYpOwotCWludCBuciA9IHRvX3NlbnNvcl9kZXZfYXR0cihkZXZhdHRyKS0+aW5kZXg7CisJaW50IG5yID0gdG9fc2Vuc29yX2Rldl9hdHRyXzIoZGV2YXR0ciktPmluZGV4OworCWludCB0ZW1wX2NyaXRfaHlzdDsKIAotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLAotCQkoZGF0YS0+dGVtcF9vdnRbbnJdIC0gZGF0YS0+dGVtcF9oeXN0W25yXSkgKiAxMDAwKTsKKwltdXRleF9sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CisJaWYgKG5yICYgMSkKKwkJdGVtcF9jcml0X2h5c3QgPSBkYXRhLT50ZW1wX2h5c3RbbnIgLyAyXSA+PiA0OworCWVsc2UKKwkJdGVtcF9jcml0X2h5c3QgPSBkYXRhLT50ZW1wX2h5c3RbbnIgLyAyXSAmIDB4MGY7CisJdGVtcF9jcml0X2h5c3QgPSAoZGF0YS0+dGVtcF9vdnRbbnJdIC0gdGVtcF9jcml0X2h5c3QpICogMTAwMDsKKwltdXRleF91bmxvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCB0ZW1wX2NyaXRfaHlzdCk7CiB9CiAKIHN0YXRpYyBzc2l6ZV90IHNob3dfdGVtcF90eXBlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUKIAkqZGV2YXR0ciwgY2hhciAqYnVmKQogewogCXN0cnVjdCBmNzE4ODJmZ19kYXRhICpkYXRhID0gZjcxODgyZmdfdXBkYXRlX2RldmljZShkZXYpOwotCWludCBuciA9IHRvX3NlbnNvcl9kZXZfYXR0cihkZXZhdHRyKS0+aW5kZXg7CisJaW50IG5yID0gdG9fc2Vuc29yX2Rldl9hdHRyXzIoZGV2YXR0ciktPmluZGV4OwogCiAJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIGRhdGEtPnRlbXBfdHlwZVtucl0pOwogfQpAQCAtNjgyLDkgKzEzMDEsOSBAQAogCSpkZXZhdHRyLCBjaGFyICpidWYpCiB7CiAJc3RydWN0IGY3MTg4MmZnX2RhdGEgKmRhdGEgPSBmNzE4ODJmZ191cGRhdGVfZGV2aWNlKGRldik7Ci0JaW50IG5yID0gdG9fc2Vuc29yX2Rldl9hdHRyKGRldmF0dHIpLT5pbmRleDsKKwlpbnQgbnIgPSB0b19zZW5zb3JfZGV2X2F0dHJfMihkZXZhdHRyKS0+aW5kZXg7CiAKLQlpZiAoZGF0YS0+dGVtcF9iZWVwICYgKDEgPDwgKG5yICsgMSkpKQorCWlmIChkYXRhLT50ZW1wX2JlZXAgJiAoMSA8PCBucikpCiAJCXJldHVybiBzcHJpbnRmKGJ1ZiwgIjFcbiIpOwogCWVsc2UKIAkJcmV0dXJuIHNwcmludGYoYnVmLCAiMFxuIik7CkBAIC02OTQsMTQgKzEzMTMsMTUgQEAKIAkqZGV2YXR0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7CiAJc3RydWN0IGY3MTg4MmZnX2RhdGEgKmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQlpbnQgbnIgPSB0b19zZW5zb3JfZGV2X2F0dHIoZGV2YXR0ciktPmluZGV4OwotCWludCB2YWwgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKTsKKwlpbnQgbnIgPSB0b19zZW5zb3JfZGV2X2F0dHJfMihkZXZhdHRyKS0+aW5kZXg7CisJdW5zaWduZWQgbG9uZyB2YWwgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKTsKIAogCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlkYXRhLT50ZW1wX2JlZXAgPSBmNzE4ODJmZ19yZWFkOChkYXRhLCBGNzE4ODJGR19SRUdfVEVNUF9CRUVQKTsKIAlpZiAodmFsKQotCQlkYXRhLT50ZW1wX2JlZXAgfD0gMSA8PCAobnIgKyAxKTsKKwkJZGF0YS0+dGVtcF9iZWVwIHw9IDEgPDwgbnI7CiAJZWxzZQotCQlkYXRhLT50ZW1wX2JlZXAgJj0gfigxIDw8IChuciArIDEpKTsKKwkJZGF0YS0+dGVtcF9iZWVwICY9IH4oMSA8PCBucik7CiAKIAlmNzE4ODJmZ193cml0ZTgoZGF0YSwgRjcxODgyRkdfUkVHX1RFTVBfQkVFUCwgZGF0YS0+dGVtcF9iZWVwKTsKIAltdXRleF91bmxvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKQEAgLTcxMyw5ICsxMzMzLDkgQEAKIAkqZGV2YXR0ciwgY2hhciAqYnVmKQogewogCXN0cnVjdCBmNzE4ODJmZ19kYXRhICpkYXRhID0gZjcxODgyZmdfdXBkYXRlX2RldmljZShkZXYpOwotCWludCBuciA9IHRvX3NlbnNvcl9kZXZfYXR0cihkZXZhdHRyKS0+aW5kZXg7CisJaW50IG5yID0gdG9fc2Vuc29yX2Rldl9hdHRyXzIoZGV2YXR0ciktPmluZGV4OwogCi0JaWYgKGRhdGEtPnRlbXBfc3RhdHVzICYgKDEgPDwgKG5yICsgMSkpKQorCWlmIChkYXRhLT50ZW1wX3N0YXR1cyAmICgxIDw8IG5yKSkKIAkJcmV0dXJuIHNwcmludGYoYnVmLCAiMVxuIik7CiAJZWxzZQogCQlyZXR1cm4gc3ByaW50ZihidWYsICIwXG4iKTsKQEAgLTcyNSwxMTMgKzEzNDUsNTI4IEBACiAJKmRldmF0dHIsIGNoYXIgKmJ1ZikKIHsKIAlzdHJ1Y3QgZjcxODgyZmdfZGF0YSAqZGF0YSA9IGY3MTg4MmZnX3VwZGF0ZV9kZXZpY2UoZGV2KTsKLQlpbnQgbnIgPSB0b19zZW5zb3JfZGV2X2F0dHIoZGV2YXR0ciktPmluZGV4OworCWludCBuciA9IHRvX3NlbnNvcl9kZXZfYXR0cl8yKGRldmF0dHIpLT5pbmRleDsKIAotCWlmIChkYXRhLT50ZW1wX2Rpb2RlX29wZW4gJiAoMSA8PCAobnIgKyAxKSkpCisJaWYgKGRhdGEtPnRlbXBfZGlvZGVfb3BlbiAmICgxIDw8IG5yKSkKIAkJcmV0dXJuIHNwcmludGYoYnVmLCAiMVxuIik7CiAJZWxzZQogCQlyZXR1cm4gc3ByaW50ZihidWYsICIwXG4iKTsKIH0KIAorc3RhdGljIHNzaXplX3Qgc2hvd19wd20oc3RydWN0IGRldmljZSAqZGV2LAorCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgZjcxODgyZmdfZGF0YSAqZGF0YSA9IGY3MTg4MmZnX3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwlpbnQgdmFsLCBuciA9IHRvX3NlbnNvcl9kZXZfYXR0cl8yKGRldmF0dHIpLT5pbmRleDsKKwltdXRleF9sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CisJaWYgKGRhdGEtPnB3bV9lbmFibGUgJiAoMSA8PCAoMiAqIG5yKSkpCisJCS8qIFBXTSBtb2RlICovCisJCXZhbCA9IGRhdGEtPnB3bVtucl07CisJZWxzZSB7CisJCS8qIFJQTSBtb2RlICovCisJCXZhbCA9IDI1NSAqIGZhbl9mcm9tX3JlZyhkYXRhLT5mYW5fdGFyZ2V0W25yXSkKKwkJCS8gZmFuX2Zyb21fcmVnKGRhdGEtPmZhbl9mdWxsX3NwZWVkW25yXSk7CisJfQorCW11dGV4X3VubG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCB2YWwpOworfQorCitzdGF0aWMgc3NpemVfdCBzdG9yZV9wd20oc3RydWN0IGRldmljZSAqZGV2LAorCQkJIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZhdHRyLCBjb25zdCBjaGFyICpidWYsCisJCQkgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBmNzE4ODJmZ19kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJaW50IG5yID0gdG9fc2Vuc29yX2Rldl9hdHRyXzIoZGV2YXR0ciktPmluZGV4OworCWxvbmcgdmFsID0gc2ltcGxlX3N0cnRvbChidWYsIE5VTEwsIDEwKTsKKwl2YWwgPSBTRU5TT1JTX0xJTUlUKHZhbCwgMCwgMjU1KTsKKworCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlkYXRhLT5wd21fZW5hYmxlID0gZjcxODgyZmdfcmVhZDgoZGF0YSwgRjcxODgyRkdfUkVHX1BXTV9FTkFCTEUpOworCWlmICgoZGF0YS0+dHlwZSA9PSBmODAwMCAmJiAoKGRhdGEtPnB3bV9lbmFibGUgPj4gMiAqIG5yKSAmIDMpICE9IDIpIHx8CisJICAgIChkYXRhLT50eXBlICE9IGY4MDAwICYmICEoKGRhdGEtPnB3bV9lbmFibGUgPj4gMiAqIG5yKSAmIDIpKSkgeworCQljb3VudCA9IC1FUk9GUzsKKwkJZ290byBsZWF2ZTsKKwl9CisJaWYgKGRhdGEtPnB3bV9lbmFibGUgJiAoMSA8PCAoMiAqIG5yKSkpIHsKKwkJLyogUFdNIG1vZGUgKi8KKwkJZjcxODgyZmdfd3JpdGU4KGRhdGEsIEY3MTg4MkZHX1JFR19QV00obnIpLCB2YWwpOworCQlkYXRhLT5wd21bbnJdID0gdmFsOworCX0gZWxzZSB7CisJCS8qIFJQTSBtb2RlICovCisJCWludCB0YXJnZXQsIGZ1bGxfc3BlZWQ7CisJCWZ1bGxfc3BlZWQgPSBmNzE4ODJmZ19yZWFkMTYoZGF0YSwKKwkJCQkJICAgICBGNzE4ODJGR19SRUdfRkFOX0ZVTExfU1BFRUQobnIpKTsKKwkJdGFyZ2V0ID0gZmFuX3RvX3JlZyh2YWwgKiBmYW5fZnJvbV9yZWcoZnVsbF9zcGVlZCkgLyAyNTUpOworCQlmNzE4ODJmZ193cml0ZTE2KGRhdGEsIEY3MTg4MkZHX1JFR19GQU5fVEFSR0VUKG5yKSwgdGFyZ2V0KTsKKwkJZGF0YS0+ZmFuX3RhcmdldFtucl0gPSB0YXJnZXQ7CisJCWRhdGEtPmZhbl9mdWxsX3NwZWVkW25yXSA9IGZ1bGxfc3BlZWQ7CisJfQorbGVhdmU6CisJbXV0ZXhfdW5sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfcHdtX2VuYWJsZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlpbnQgcmVzdWx0ID0gMDsKKwlzdHJ1Y3QgZjcxODgyZmdfZGF0YSAqZGF0YSA9IGY3MTg4MmZnX3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwlpbnQgbnIgPSB0b19zZW5zb3JfZGV2X2F0dHJfMihkZXZhdHRyKS0+aW5kZXg7CisKKwlzd2l0Y2ggKChkYXRhLT5wd21fZW5hYmxlID4+IDIgKiBucikgJiAzKSB7CisJY2FzZSAwOgorCWNhc2UgMToKKwkJcmVzdWx0ID0gMjsgLyogTm9ybWFsIGF1dG8gbW9kZSAqLworCQlicmVhazsKKwljYXNlIDI6CisJCXJlc3VsdCA9IDE7IC8qIE1hbnVhbCBtb2RlICovCisJCWJyZWFrOworCWNhc2UgMzoKKwkJaWYgKGRhdGEtPnR5cGUgPT0gZjgwMDApCisJCQlyZXN1bHQgPSAzOyAvKiBUaGVybW9zdGF0IG1vZGUgKi8KKwkJZWxzZQorCQkJcmVzdWx0ID0gMTsgLyogTWFudWFsIG1vZGUgKi8KKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHJlc3VsdCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHN0b3JlX3B3bV9lbmFibGUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZQorCQkJCSpkZXZhdHRyLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgZjcxODgyZmdfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCWludCBuciA9IHRvX3NlbnNvcl9kZXZfYXR0cl8yKGRldmF0dHIpLT5pbmRleDsKKwlsb25nIHZhbCA9IHNpbXBsZV9zdHJ0b2woYnVmLCBOVUxMLCAxMCk7CisKKwltdXRleF9sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CisJZGF0YS0+cHdtX2VuYWJsZSA9IGY3MTg4MmZnX3JlYWQ4KGRhdGEsIEY3MTg4MkZHX1JFR19QV01fRU5BQkxFKTsKKwkvKiBTcGVjaWFsIGNhc2UgZm9yIEY4MDAwIGF1dG8gUFdNIG1vZGUgLyBUaGVybW9zdGF0IG1vZGUgKi8KKwlpZiAoZGF0YS0+dHlwZSA9PSBmODAwMCAmJiAoKGRhdGEtPnB3bV9lbmFibGUgPj4gMiAqIG5yKSAmIDEpKSB7CisJCXN3aXRjaCAodmFsKSB7CisJCWNhc2UgMjoKKwkJCWRhdGEtPnB3bV9lbmFibGUgJj0gfigyIDw8ICgyICogbnIpKTsKKwkJCWJyZWFrOwkJLyogTm9ybWFsIGF1dG8gbW9kZSAqLworCQljYXNlIDM6CisJCQlkYXRhLT5wd21fZW5hYmxlIHw9IDIgPDwgKDIgKiBucik7CisJCQlicmVhazsJCS8qIFRoZXJtb3N0YXQgbW9kZSAqLworCQlkZWZhdWx0OgorCQkJY291bnQgPSAtRUlOVkFMOworCQkJZ290byBsZWF2ZTsKKwkJfQorCX0gZWxzZSB7CisJCXN3aXRjaCAodmFsKSB7CisJCWNhc2UgMToKKwkJCWRhdGEtPnB3bV9lbmFibGUgfD0gMiA8PCAoMiAqIG5yKTsKKwkJCWJyZWFrOwkJLyogTWFudWFsICovCisJCWNhc2UgMjoKKwkJCWRhdGEtPnB3bV9lbmFibGUgJj0gfigyIDw8ICgyICogbnIpKTsKKwkJCWJyZWFrOwkJLyogTm9ybWFsIGF1dG8gbW9kZSAqLworCQlkZWZhdWx0OgorCQkJY291bnQgPSAtRUlOVkFMOworCQkJZ290byBsZWF2ZTsKKwkJfQorCX0KKwlmNzE4ODJmZ193cml0ZTgoZGF0YSwgRjcxODgyRkdfUkVHX1BXTV9FTkFCTEUsIGRhdGEtPnB3bV9lbmFibGUpOworbGVhdmU6CisJbXV0ZXhfdW5sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfcHdtX2F1dG9fcG9pbnRfcHdtKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0dHIsCisJCQkJICAgICAgIGNoYXIgKmJ1ZikKK3sKKwlpbnQgcmVzdWx0OworCXN0cnVjdCBmNzE4ODJmZ19kYXRhICpkYXRhID0gZjcxODgyZmdfdXBkYXRlX2RldmljZShkZXYpOworCWludCBwd20gPSB0b19zZW5zb3JfZGV2X2F0dHJfMihkZXZhdHRyKS0+aW5kZXg7CisJaW50IHBvaW50ID0gdG9fc2Vuc29yX2Rldl9hdHRyXzIoZGV2YXR0ciktPm5yOworCisJbXV0ZXhfbG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOworCWlmIChkYXRhLT5wd21fZW5hYmxlICYgKDEgPDwgKDIgKiBwd20pKSkgeworCQkvKiBQV00gbW9kZSAqLworCQlyZXN1bHQgPSBkYXRhLT5wd21fYXV0b19wb2ludF9wd21bcHdtXVtwb2ludF07CisJfSBlbHNlIHsKKwkJLyogUlBNIG1vZGUgKi8KKwkJcmVzdWx0ID0gMzIgKiAyNTUgLyAoMzIgKyBkYXRhLT5wd21fYXV0b19wb2ludF9wd21bcHdtXVtwb2ludF0pOworCX0KKwltdXRleF91bmxvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCByZXN1bHQpOworfQorCitzdGF0aWMgc3NpemVfdCBzdG9yZV9wd21fYXV0b19wb2ludF9wd20oc3RydWN0IGRldmljZSAqZGV2LAorCQkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2YXR0ciwKKwkJCQkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IGY3MTg4MmZnX2RhdGEgKmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlpbnQgcHdtID0gdG9fc2Vuc29yX2Rldl9hdHRyXzIoZGV2YXR0ciktPmluZGV4OworCWludCBwb2ludCA9IHRvX3NlbnNvcl9kZXZfYXR0cl8yKGRldmF0dHIpLT5ucjsKKwlsb25nIHZhbCA9IHNpbXBsZV9zdHJ0b2woYnVmLCBOVUxMLCAxMCk7CisJdmFsID0gU0VOU09SU19MSU1JVCh2YWwsIDAsIDI1NSk7CisKKwltdXRleF9sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CisJZGF0YS0+cHdtX2VuYWJsZSA9IGY3MTg4MmZnX3JlYWQ4KGRhdGEsIEY3MTg4MkZHX1JFR19QV01fRU5BQkxFKTsKKwlpZiAoZGF0YS0+cHdtX2VuYWJsZSAmICgxIDw8ICgyICogcHdtKSkpIHsKKwkJLyogUFdNIG1vZGUgKi8KKwl9IGVsc2UgeworCQkvKiBSUE0gbW9kZSAqLworCQlpZiAodmFsIDwgMjkpCS8qIFByZXZlbnQgbmVnYXRpdmUgbnVtYmVycyAqLworCQkJdmFsID0gMjU1OworCQllbHNlCisJCQl2YWwgPSAoMjU1IC0gdmFsKSAqIDMyIC8gdmFsOworCX0KKwlmNzE4ODJmZ193cml0ZTgoZGF0YSwgRjcxODgyRkdfUkVHX1BPSU5UX1BXTShwd20sIHBvaW50KSwgdmFsKTsKKwlkYXRhLT5wd21fYXV0b19wb2ludF9wd21bcHdtXVtwb2ludF0gPSB2YWw7CisJbXV0ZXhfdW5sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfcHdtX2F1dG9fcG9pbnRfdGVtcF9oeXN0KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkJICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2YXR0ciwKKwkJCQkJICAgICBjaGFyICpidWYpCit7CisJaW50IHJlc3VsdCA9IDA7CisJc3RydWN0IGY3MTg4MmZnX2RhdGEgKmRhdGEgPSBmNzE4ODJmZ191cGRhdGVfZGV2aWNlKGRldik7CisJaW50IG5yID0gdG9fc2Vuc29yX2Rldl9hdHRyXzIoZGV2YXR0ciktPmluZGV4OworCWludCBwb2ludCA9IHRvX3NlbnNvcl9kZXZfYXR0cl8yKGRldmF0dHIpLT5ucjsKKworCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlpZiAobnIgJiAxKQorCQlyZXN1bHQgPSBkYXRhLT5wd21fYXV0b19wb2ludF9oeXN0W25yIC8gMl0gPj4gNDsKKwllbHNlCisJCXJlc3VsdCA9IGRhdGEtPnB3bV9hdXRvX3BvaW50X2h5c3RbbnIgLyAyXSAmIDB4MGY7CisJcmVzdWx0ID0gMTAwMCAqIChkYXRhLT5wd21fYXV0b19wb2ludF90ZW1wW25yXVtwb2ludF0gLSByZXN1bHQpOworCW11dGV4X3VubG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHJlc3VsdCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHN0b3JlX3B3bV9hdXRvX3BvaW50X3RlbXBfaHlzdChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJCSAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZhdHRyLAorCQkJCQkgICAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgZjcxODgyZmdfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCWludCBuciA9IHRvX3NlbnNvcl9kZXZfYXR0cl8yKGRldmF0dHIpLT5pbmRleDsKKwlpbnQgcG9pbnQgPSB0b19zZW5zb3JfZGV2X2F0dHJfMihkZXZhdHRyKS0+bnI7CisJbG9uZyB2YWwgPSBzaW1wbGVfc3RydG9sKGJ1ZiwgTlVMTCwgMTApIC8gMTAwMDsKKwl1OCByZWc7CisKKwltdXRleF9sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CisJZGF0YS0+cHdtX2F1dG9fcG9pbnRfdGVtcFtucl1bcG9pbnRdID0KKwkJZjcxODgyZmdfcmVhZDgoZGF0YSwgRjcxODgyRkdfUkVHX1BPSU5UX1RFTVAobnIsIHBvaW50KSk7CisJdmFsID0gU0VOU09SU19MSU1JVCh2YWwsIGRhdGEtPnB3bV9hdXRvX3BvaW50X3RlbXBbbnJdW3BvaW50XSAtIDE1LAorCQkJCWRhdGEtPnB3bV9hdXRvX3BvaW50X3RlbXBbbnJdW3BvaW50XSk7CisJdmFsID0gZGF0YS0+cHdtX2F1dG9fcG9pbnRfdGVtcFtucl1bcG9pbnRdIC0gdmFsOworCisJcmVnID0gZjcxODgyZmdfcmVhZDgoZGF0YSwgRjcxODgyRkdfUkVHX0ZBTl9IWVNUKG5yIC8gMikpOworCWlmIChuciAmIDEpCisJCXJlZyA9IChyZWcgJiAweDBmKSB8ICh2YWwgPDwgNCk7CisJZWxzZQorCQlyZWcgPSAocmVnICYgMHhmMCkgfCB2YWw7CisKKwlmNzE4ODJmZ193cml0ZTgoZGF0YSwgRjcxODgyRkdfUkVHX0ZBTl9IWVNUKG5yIC8gMiksIHJlZyk7CisJZGF0YS0+cHdtX2F1dG9fcG9pbnRfaHlzdFtuciAvIDJdID0gcmVnOworCW11dGV4X3VubG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOworCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3NpemVfdCBzaG93X3B3bV9pbnRlcnBvbGF0ZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZhdHRyLCBjaGFyICpidWYpCit7CisJaW50IHJlc3VsdDsKKwlzdHJ1Y3QgZjcxODgyZmdfZGF0YSAqZGF0YSA9IGY3MTg4MmZnX3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwlpbnQgbnIgPSB0b19zZW5zb3JfZGV2X2F0dHJfMihkZXZhdHRyKS0+aW5kZXg7CisKKwlyZXN1bHQgPSAoZGF0YS0+cHdtX2F1dG9fcG9pbnRfbWFwcGluZ1tucl0gPj4gNCkgJiAxOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHJlc3VsdCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHN0b3JlX3B3bV9pbnRlcnBvbGF0ZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2YXR0ciwKKwkJCQkgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBmNzE4ODJmZ19kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJaW50IG5yID0gdG9fc2Vuc29yX2Rldl9hdHRyXzIoZGV2YXR0ciktPmluZGV4OworCXVuc2lnbmVkIGxvbmcgdmFsID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCk7CisKKwltdXRleF9sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CisJZGF0YS0+cHdtX2F1dG9fcG9pbnRfbWFwcGluZ1tucl0gPQorCQlmNzE4ODJmZ19yZWFkOChkYXRhLCBGNzE4ODJGR19SRUdfUE9JTlRfTUFQUElORyhucikpOworCWlmICh2YWwpCisJCXZhbCA9IGRhdGEtPnB3bV9hdXRvX3BvaW50X21hcHBpbmdbbnJdIHwgKDEgPDwgNCk7CisJZWxzZQorCQl2YWwgPSBkYXRhLT5wd21fYXV0b19wb2ludF9tYXBwaW5nW25yXSAmICh+KDEgPDwgNCkpOworCWY3MTg4MmZnX3dyaXRlOChkYXRhLCBGNzE4ODJGR19SRUdfUE9JTlRfTUFQUElORyhuciksIHZhbCk7CisJZGF0YS0+cHdtX2F1dG9fcG9pbnRfbWFwcGluZ1tucl0gPSB2YWw7CisJbXV0ZXhfdW5sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfcHdtX2F1dG9fcG9pbnRfY2hhbm5lbChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJCSAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZhdHRyLAorCQkJCQkgICBjaGFyICpidWYpCit7CisJaW50IHJlc3VsdDsKKwlzdHJ1Y3QgZjcxODgyZmdfZGF0YSAqZGF0YSA9IGY3MTg4MmZnX3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwlpbnQgbnIgPSB0b19zZW5zb3JfZGV2X2F0dHJfMihkZXZhdHRyKS0+aW5kZXg7CisJaW50IHRlbXBfc3RhcnQgPSAoZGF0YS0+dHlwZSA9PSBmODAwMCkgPyAwIDogMTsKKworCXJlc3VsdCA9IDEgPDwgKChkYXRhLT5wd21fYXV0b19wb2ludF9tYXBwaW5nW25yXSAmIDMpIC0gdGVtcF9zdGFydCk7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgcmVzdWx0KTsKK30KKworc3RhdGljIHNzaXplX3Qgc3RvcmVfcHdtX2F1dG9fcG9pbnRfY2hhbm5lbChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJCSAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2YXR0ciwKKwkJCQkJICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBmNzE4ODJmZ19kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJaW50IG5yID0gdG9fc2Vuc29yX2Rldl9hdHRyXzIoZGV2YXR0ciktPmluZGV4OworCWludCB0ZW1wX3N0YXJ0ID0gKGRhdGEtPnR5cGUgPT0gZjgwMDApID8gMCA6IDE7CisJbG9uZyB2YWwgPSBzaW1wbGVfc3RydG9sKGJ1ZiwgTlVMTCwgMTApOworCisJc3dpdGNoICh2YWwpIHsKKwljYXNlIDE6CisJCXZhbCA9IDA7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJdmFsID0gMTsKKwkJYnJlYWs7CisJY2FzZSA0OgorCQl2YWwgPSAyOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJdmFsICs9IHRlbXBfc3RhcnQ7CisJbXV0ZXhfbG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOworCWRhdGEtPnB3bV9hdXRvX3BvaW50X21hcHBpbmdbbnJdID0KKwkJZjcxODgyZmdfcmVhZDgoZGF0YSwgRjcxODgyRkdfUkVHX1BPSU5UX01BUFBJTkcobnIpKTsKKwl2YWwgPSAoZGF0YS0+cHdtX2F1dG9fcG9pbnRfbWFwcGluZ1tucl0gJiAweGZjKSB8IHZhbDsKKwlmNzE4ODJmZ193cml0ZTgoZGF0YSwgRjcxODgyRkdfUkVHX1BPSU5UX01BUFBJTkcobnIpLCB2YWwpOworCWRhdGEtPnB3bV9hdXRvX3BvaW50X21hcHBpbmdbbnJdID0gdmFsOworCW11dGV4X3VubG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOworCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3NpemVfdCBzaG93X3B3bV9hdXRvX3BvaW50X3RlbXAoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2YXR0ciwKKwkJCQkJY2hhciAqYnVmKQoreworCWludCByZXN1bHQ7CisJc3RydWN0IGY3MTg4MmZnX2RhdGEgKmRhdGEgPSBmNzE4ODJmZ191cGRhdGVfZGV2aWNlKGRldik7CisJaW50IHB3bSA9IHRvX3NlbnNvcl9kZXZfYXR0cl8yKGRldmF0dHIpLT5pbmRleDsKKwlpbnQgcG9pbnQgPSB0b19zZW5zb3JfZGV2X2F0dHJfMihkZXZhdHRyKS0+bnI7CisKKwlyZXN1bHQgPSBkYXRhLT5wd21fYXV0b19wb2ludF90ZW1wW3B3bV1bcG9pbnRdOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCAxMDAwICogcmVzdWx0KTsKK30KKworc3RhdGljIHNzaXplX3Qgc3RvcmVfcHdtX2F1dG9fcG9pbnRfdGVtcChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJCSBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2YXR0ciwKKwkJCQkJIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBmNzE4ODJmZ19kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJaW50IHB3bSA9IHRvX3NlbnNvcl9kZXZfYXR0cl8yKGRldmF0dHIpLT5pbmRleDsKKwlpbnQgcG9pbnQgPSB0b19zZW5zb3JfZGV2X2F0dHJfMihkZXZhdHRyKS0+bnI7CisJbG9uZyB2YWwgPSBzaW1wbGVfc3RydG9sKGJ1ZiwgTlVMTCwgMTApIC8gMTAwMDsKKwl2YWwgPSBTRU5TT1JTX0xJTUlUKHZhbCwgMCwgMjU1KTsKKworCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlmNzE4ODJmZ193cml0ZTgoZGF0YSwgRjcxODgyRkdfUkVHX1BPSU5UX1RFTVAocHdtLCBwb2ludCksIHZhbCk7CisJZGF0YS0+cHdtX2F1dG9fcG9pbnRfdGVtcFtwd21dW3BvaW50XSA9IHZhbDsKKwltdXRleF91bmxvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKworCXJldHVybiBjb3VudDsKK30KKwogc3RhdGljIHNzaXplX3Qgc2hvd19uYW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0dHIsCiAJY2hhciAqYnVmKQogewotCXJldHVybiBzcHJpbnRmKGJ1ZiwgRFJWTkFNRSAiXG4iKTsKKwlzdHJ1Y3QgZjcxODgyZmdfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVzXG4iLCBmNzE4ODJmZ19uYW1lc1tkYXRhLT50eXBlXSk7CiB9CiAKK3N0YXRpYyBpbnQgX19kZXZpbml0IGY3MTg4MmZnX2NyZWF0ZV9zeXNmc19maWxlcyhzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LAorCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZV8yICphdHRyLCBpbnQgY291bnQpCit7CisJaW50IGVyciwgaTsKIAotc3RhdGljIGludCBfX2RldmluaXQgZjcxODgyZmdfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqIHBkZXYpCisJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKwkJZXJyID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZwZGV2LT5kZXYsICZhdHRyW2ldLmRldl9hdHRyKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBmNzE4ODJmZ19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCXN0cnVjdCBmNzE4ODJmZ19kYXRhICpkYXRhOwotCWludCBlcnIsIGk7CisJc3RydWN0IGY3MTg4MmZnX3Npb19kYXRhICpzaW9fZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCWludCBlcnIsIGksIG5yX2ZhbnMgPSAoc2lvX2RhdGEtPnR5cGUgPT0gZjcxODgyZmcpID8gNCA6IDM7CiAJdTggc3RhcnRfcmVnOwogCi0JaWYgKCEoZGF0YSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBmNzE4ODJmZ19kYXRhKSwgR0ZQX0tFUk5FTCkpKQorCWRhdGEgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZjcxODgyZmdfZGF0YSksIEdGUF9LRVJORUwpOworCWlmICghZGF0YSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAlkYXRhLT5hZGRyID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfSU8sIDApLT5zdGFydDsKKwlkYXRhLT50eXBlID0gc2lvX2RhdGEtPnR5cGU7CiAJbXV0ZXhfaW5pdCgmZGF0YS0+dXBkYXRlX2xvY2spOwogCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGRhdGEpOwogCisJc3RhcnRfcmVnID0gZjcxODgyZmdfcmVhZDgoZGF0YSwgRjcxODgyRkdfUkVHX1NUQVJUKTsKKwlpZiAoc3RhcnRfcmVnICYgMHgwNCkgeworCQlkZXZfd2FybigmcGRldi0+ZGV2LCAiSGFyZHdhcmUgbW9uaXRvciBpcyBwb3dlcmVkIGRvd25cbiIpOworCQllcnIgPSAtRU5PREVWOworCQlnb3RvIGV4aXRfZnJlZTsKKwl9CisJaWYgKCEoc3RhcnRfcmVnICYgMHgwMykpIHsKKwkJZGV2X3dhcm4oJnBkZXYtPmRldiwgIkhhcmR3YXJlIG1vbml0b3Jpbmcgbm90IGFjdGl2YXRlZFxuIik7CisJCWVyciA9IC1FTk9ERVY7CisJCWdvdG8gZXhpdF9mcmVlOworCX0KKworCWRhdGEtPnB3bV9lbmFibGUgPSBmNzE4ODJmZ19yZWFkOChkYXRhLCBGNzE4ODJGR19SRUdfUFdNX0VOQUJMRSk7CisJLyogSWYgaXQgaXMgYSA3MTg2MiBhbmQgdGhlIGZhbiAvIHB3bSBwYXJ0IGlzIGVuYWJsZWQgc2FuaXR5IGNoZWNrCisJICAgdGhlIHB3bSBzZXR0aW5ncyAqLworCWlmIChkYXRhLT50eXBlID09IGY3MTg2MmZnICYmIChzdGFydF9yZWcgJiAweDAyKSkgeworCQlpZiAoKGRhdGEtPnB3bV9lbmFibGUgJiAweDE1KSAhPSAweDE1KSB7CisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsCisJCQkJIkludmFsaWQgKHJlc2VydmVkKSBwd20gc2V0dGluZ3M6IDB4JTAyeFxuIiwKKwkJCQkodW5zaWduZWQgaW50KWRhdGEtPnB3bV9lbmFibGUpOworCQkJZXJyID0gLUVOT0RFVjsKKwkJCWdvdG8gZXhpdF9mcmVlOworCQl9CisJfQorCiAJLyogUmVnaXN0ZXIgc3lzZnMgaW50ZXJmYWNlIGZpbGVzICovCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZjcxODgyZmdfZGV2X2F0dHIpOyBpKyspIHsKLQkJZXJyID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZwZGV2LT5kZXYsICZmNzE4ODJmZ19kZXZfYXR0cltpXSk7CisJZXJyID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZwZGV2LT5kZXYsICZkZXZfYXR0cl9uYW1lKTsKKwlpZiAoZXJyKQorCQlnb3RvIGV4aXRfdW5yZWdpc3Rlcl9zeXNmczsKKworCWlmIChzdGFydF9yZWcgJiAweDAxKSB7CisJCXN3aXRjaCAoZGF0YS0+dHlwZSkgeworCQljYXNlIGY3MTg4MmZnOgorCQkJZXJyID0gZjcxODgyZmdfY3JlYXRlX3N5c2ZzX2ZpbGVzKHBkZXYsCisJCQkJCWY3MTg4MmZnX2luX3RlbXBfYXR0ciwKKwkJCQkJQVJSQVlfU0laRShmNzE4ODJmZ19pbl90ZW1wX2F0dHIpKTsKKwkJCWlmIChlcnIpCisJCQkJZ290byBleGl0X3VucmVnaXN0ZXJfc3lzZnM7CisJCQkvKiBmYWxsIHRocm91Z2ghICovCisJCWNhc2UgZjcxODYyZmc6CisJCQllcnIgPSBmNzE4ODJmZ19jcmVhdGVfc3lzZnNfZmlsZXMocGRldiwKKwkJCQkJZjcxOHgyZmdfaW5fdGVtcF9hdHRyLAorCQkJCQlBUlJBWV9TSVpFKGY3MTh4MmZnX2luX3RlbXBfYXR0cikpOworCQkJYnJlYWs7CisJCWNhc2UgZjgwMDA6CisJCQllcnIgPSBmNzE4ODJmZ19jcmVhdGVfc3lzZnNfZmlsZXMocGRldiwKKwkJCQkJZjgwMDBfaW5fdGVtcF9hdHRyLAorCQkJCQlBUlJBWV9TSVpFKGY4MDAwX2luX3RlbXBfYXR0cikpOworCQkJYnJlYWs7CisJCX0KIAkJaWYgKGVycikKIAkJCWdvdG8gZXhpdF91bnJlZ2lzdGVyX3N5c2ZzOwogCX0KIAotCXN0YXJ0X3JlZyA9IGY3MTg4MmZnX3JlYWQ4KGRhdGEsIEY3MTg4MkZHX1JFR19TVEFSVCk7Ci0JaWYgKHN0YXJ0X3JlZyAmIDB4MDEpIHsKLQkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZjcxODgyZmdfaW5fdGVtcF9hdHRyKTsgaSsrKSB7Ci0JCQllcnIgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJnBkZXYtPmRldiwKLQkJCQkJJmY3MTg4MmZnX2luX3RlbXBfYXR0cltpXS5kZXZfYXR0cik7Ci0JCQlpZiAoZXJyKQotCQkJCWdvdG8gZXhpdF91bnJlZ2lzdGVyX3N5c2ZzOwotCQl9Ci0JfQotCiAJaWYgKHN0YXJ0X3JlZyAmIDB4MDIpIHsKLQkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZjcxODgyZmdfZmFuX2F0dHIpOyBpKyspIHsKLQkJCWVyciA9IGRldmljZV9jcmVhdGVfZmlsZSgmcGRldi0+ZGV2LAotCQkJCQkmZjcxODgyZmdfZmFuX2F0dHJbaV0uZGV2X2F0dHIpOwotCQkJaWYgKGVycikKLQkJCQlnb3RvIGV4aXRfdW5yZWdpc3Rlcl9zeXNmczsKKwkJZXJyID0gZjcxODgyZmdfY3JlYXRlX3N5c2ZzX2ZpbGVzKHBkZXYsIGZ4eHh4X2Zhbl9hdHRyLAorCQkJCQlBUlJBWV9TSVpFKGZ4eHh4X2Zhbl9hdHRyKSk7CisJCWlmIChlcnIpCisJCQlnb3RvIGV4aXRfdW5yZWdpc3Rlcl9zeXNmczsKKworCQlzd2l0Y2ggKGRhdGEtPnR5cGUpIHsKKwkJY2FzZSBmNzE4NjJmZzoKKwkJCWVyciA9IGY3MTg4MmZnX2NyZWF0ZV9zeXNmc19maWxlcyhwZGV2LAorCQkJCQlmNzE4NjJmZ19mYW5fYXR0ciwKKwkJCQkJQVJSQVlfU0laRShmNzE4NjJmZ19mYW5fYXR0cikpOworCQkJYnJlYWs7CisJCWNhc2UgZjcxODgyZmc6CisJCQllcnIgPSBmNzE4ODJmZ19jcmVhdGVfc3lzZnNfZmlsZXMocGRldiwKKwkJCQkJZjcxODgyZmdfZmFuX2F0dHIsCisJCQkJCUFSUkFZX1NJWkUoZjcxODgyZmdfZmFuX2F0dHIpKTsKKwkJCWJyZWFrOworCQljYXNlIGY4MDAwOgorCQkJZXJyID0gZjcxODgyZmdfY3JlYXRlX3N5c2ZzX2ZpbGVzKHBkZXYsCisJCQkJCWY4MDAwX2Zhbl9hdHRyLAorCQkJCQlBUlJBWV9TSVpFKGY4MDAwX2Zhbl9hdHRyKSk7CisJCQlicmVhazsKIAkJfQorCQlpZiAoZXJyKQorCQkJZ290byBleGl0X3VucmVnaXN0ZXJfc3lzZnM7CisKKwkJZm9yIChpID0gMDsgaSA8IG5yX2ZhbnM7IGkrKykKKwkJCWRldl9pbmZvKCZwZGV2LT5kZXYsICJGYW46ICVkIGlzIGluICVzIG1vZGVcbiIsIGkgKyAxLAorCQkJCSAoZGF0YS0+cHdtX2VuYWJsZSAmICgxIDw8IDIgKiBpKSkgPworCQkJCSAiZHV0eS1jeWNsZSIgOiAiUlBNIik7CiAJfQogCiAJZGF0YS0+aHdtb25fZGV2ID0gaHdtb25fZGV2aWNlX3JlZ2lzdGVyKCZwZGV2LT5kZXYpOwogCWlmIChJU19FUlIoZGF0YS0+aHdtb25fZGV2KSkgewogCQllcnIgPSBQVFJfRVJSKGRhdGEtPmh3bW9uX2Rldik7CisJCWRhdGEtPmh3bW9uX2RldiA9IE5VTEw7CiAJCWdvdG8gZXhpdF91bnJlZ2lzdGVyX3N5c2ZzOwogCX0KIAogCXJldHVybiAwOwogCiBleGl0X3VucmVnaXN0ZXJfc3lzZnM6Ci0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZjcxODgyZmdfZGV2X2F0dHIpOyBpKyspCi0JCWRldmljZV9yZW1vdmVfZmlsZSgmcGRldi0+ZGV2LCAmZjcxODgyZmdfZGV2X2F0dHJbaV0pOwotCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZjcxODgyZmdfaW5fdGVtcF9hdHRyKTsgaSsrKQotCQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJnBkZXYtPmRldiwKLQkJCQkJJmY3MTg4MmZnX2luX3RlbXBfYXR0cltpXS5kZXZfYXR0cik7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShmNzE4ODJmZ19mYW5fYXR0cik7IGkrKykKLQkJZGV2aWNlX3JlbW92ZV9maWxlKCZwZGV2LT5kZXYsICZmNzE4ODJmZ19mYW5fYXR0cltpXS5kZXZfYXR0cik7Ci0KKwlmNzE4ODJmZ19yZW1vdmUocGRldik7IC8qIFdpbGwgdW5yZWdpc3RlciB0aGUgc3lzZnMgZmlsZXMgZm9yIHVzICovCisJcmV0dXJuIGVycjsgLyogZjcxODgyZmdfcmVtb3ZlKCkgYWxzbyBmcmVlcyBvdXIgZGF0YSAqLworZXhpdF9mcmVlOgogCWtmcmVlKGRhdGEpOwotCiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIGludCBfX2RldmV4aXQgZjcxODgyZmdfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCitzdGF0aWMgaW50IGY3MTg4MmZnX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCWludCBpOwogCXN0cnVjdCBmNzE4ODJmZ19kYXRhICpkYXRhID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CiAKIAlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKLQlod21vbl9kZXZpY2VfdW5yZWdpc3RlcihkYXRhLT5od21vbl9kZXYpOworCWlmIChkYXRhLT5od21vbl9kZXYpCisJCWh3bW9uX2RldmljZV91bnJlZ2lzdGVyKGRhdGEtPmh3bW9uX2Rldik7CiAKLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShmNzE4ODJmZ19kZXZfYXR0cik7IGkrKykKLQkJZGV2aWNlX3JlbW92ZV9maWxlKCZwZGV2LT5kZXYsICZmNzE4ODJmZ19kZXZfYXR0cltpXSk7CisJLyogTm90ZSB3ZSBhcmUgbm90IGxvb3Bpbmcgb3ZlciBhbGwgYXR0ciBhcnJheXMgd2UgaGF2ZSBhcyB0aGUgb25lcworCSAgIGJlbG93IGFyZSBzdXBlcnNldHMgb2YgdGhlIG9uZXMgc2tpcHBlZC4gKi8KKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoJnBkZXYtPmRldiwgJmRldl9hdHRyX25hbWUpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZjcxOHgyZmdfaW5fdGVtcF9hdHRyKTsgaSsrKQorCQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJnBkZXYtPmRldiwKKwkJCQkJJmY3MTh4MmZnX2luX3RlbXBfYXR0cltpXS5kZXZfYXR0cik7CiAKIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShmNzE4ODJmZ19pbl90ZW1wX2F0dHIpOyBpKyspCiAJCWRldmljZV9yZW1vdmVfZmlsZSgmcGRldi0+ZGV2LAogCQkJCQkmZjcxODgyZmdfaW5fdGVtcF9hdHRyW2ldLmRldl9hdHRyKTsKIAorCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGZ4eHh4X2Zhbl9hdHRyKTsgaSsrKQorCQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJnBkZXYtPmRldiwgJmZ4eHh4X2Zhbl9hdHRyW2ldLmRldl9hdHRyKTsKKwogCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGY3MTg4MmZnX2Zhbl9hdHRyKTsgaSsrKQogCQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJnBkZXYtPmRldiwgJmY3MTg4MmZnX2Zhbl9hdHRyW2ldLmRldl9hdHRyKTsKIAorCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGY4MDAwX2Zhbl9hdHRyKTsgaSsrKQorCQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJnBkZXYtPmRldiwgJmY4MDAwX2Zhbl9hdHRyW2ldLmRldl9hdHRyKTsKKwogCWtmcmVlKGRhdGEpOwogCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgX19pbml0IGY3MTg4MmZnX2ZpbmQoaW50IHNpb2FkZHIsIHVuc2lnbmVkIHNob3J0ICphZGRyZXNzKQorc3RhdGljIGludCBfX2luaXQgZjcxODgyZmdfZmluZChpbnQgc2lvYWRkciwgdW5zaWduZWQgc2hvcnQgKmFkZHJlc3MsCisJc3RydWN0IGY3MTg4MmZnX3Npb19kYXRhICpzaW9fZGF0YSkKIHsKIAlpbnQgZXJyID0gLUVOT0RFVjsKIAl1MTYgZGV2aWQ7Ci0JdTggc3RhcnRfcmVnOwotCXN0cnVjdCBmNzE4ODJmZ19kYXRhIGRhdGE7CiAKIAlzdXBlcmlvX2VudGVyKHNpb2FkZHIpOwogCkBAIC04NDIsNyArMTg3NywxNyBAQAogCX0KIAogCWRldmlkID0gZm9yY2VfaWQgPyBmb3JjZV9pZCA6IHN1cGVyaW9faW53KHNpb2FkZHIsIFNJT19SRUdfREVWSUQpOwotCWlmIChkZXZpZCAhPSBTSU9fRjcxODgyX0lEKSB7CisJc3dpdGNoIChkZXZpZCkgeworCWNhc2UgU0lPX0Y3MTg2Ml9JRDoKKwkJc2lvX2RhdGEtPnR5cGUgPSBmNzE4NjJmZzsKKwkJYnJlYWs7CisJY2FzZSBTSU9fRjcxODgyX0lEOgorCQlzaW9fZGF0YS0+dHlwZSA9IGY3MTg4MmZnOworCQlicmVhazsKKwljYXNlIFNJT19GODAwMF9JRDoKKwkJc2lvX2RhdGEtPnR5cGUgPSBmODAwMDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKIAkJcHJpbnRrKEtFUk5fSU5GTyBEUlZOQU1FICI6IFVuc3VwcG9ydGVkIEZpbnRlayBkZXZpY2VcbiIpOwogCQlnb3RvIGV4aXQ7CiAJfQpAQCAtODYxLDI0ICsxOTA2LDE3IEBACiAJfQogCSphZGRyZXNzICY9IH4oUkVHSU9OX0xFTkdUSCAtIDEpOwkvKiBJZ25vcmUgMyBMU0IgKi8KIAotCWRhdGEuYWRkciA9ICphZGRyZXNzOwotCXN0YXJ0X3JlZyA9IGY3MTg4MmZnX3JlYWQ4KCZkYXRhLCBGNzE4ODJGR19SRUdfU1RBUlQpOwotCWlmICghKHN0YXJ0X3JlZyAmIDB4MDMpKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgRFJWTkFNRQotCQkJIjogSGFyZHdhcmUgbW9uaXRvcmluZyBub3QgYWN0aXZhdGVkXG4iKTsKLQkJZ290byBleGl0OwotCX0KLQogCWVyciA9IDA7Ci0JcHJpbnRrKEtFUk5fSU5GTyBEUlZOQU1FICI6IEZvdW5kIEY3MTg4MkZHIGNoaXAgYXQgJSN4LCByZXZpc2lvbiAlZFxuIiwKLQkJKHVuc2lnbmVkIGludCkqYWRkcmVzcywKKwlwcmludGsoS0VSTl9JTkZPIERSVk5BTUUgIjogRm91bmQgJXMgY2hpcCBhdCAlI3gsIHJldmlzaW9uICVkXG4iLAorCQlmNzE4ODJmZ19uYW1lc1tzaW9fZGF0YS0+dHlwZV0sCSh1bnNpZ25lZCBpbnQpKmFkZHJlc3MsCiAJCShpbnQpc3VwZXJpb19pbmIoc2lvYWRkciwgU0lPX1JFR19ERVZSRVYpKTsKIGV4aXQ6CiAJc3VwZXJpb19leGl0KHNpb2FkZHIpOwogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyBpbnQgX19pbml0IGY3MTg4MmZnX2RldmljZV9hZGQodW5zaWduZWQgc2hvcnQgYWRkcmVzcykKK3N0YXRpYyBpbnQgX19pbml0IGY3MTg4MmZnX2RldmljZV9hZGQodW5zaWduZWQgc2hvcnQgYWRkcmVzcywKKwljb25zdCBzdHJ1Y3QgZjcxODgyZmdfc2lvX2RhdGEgKnNpb19kYXRhKQogewogCXN0cnVjdCByZXNvdXJjZSByZXMgPSB7CiAJCS5zdGFydAk9IGFkZHJlc3MsCkBAIC04OTIsMTIgKzE5MzAsMjMgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAlyZXMubmFtZSA9IGY3MTg4MmZnX3BkZXYtPm5hbWU7CisJZXJyID0gYWNwaV9jaGVja19yZXNvdXJjZV9jb25mbGljdCgmcmVzKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCiAJZXJyID0gcGxhdGZvcm1fZGV2aWNlX2FkZF9yZXNvdXJjZXMoZjcxODgyZmdfcGRldiwgJnJlcywgMSk7CiAJaWYgKGVycikgewogCQlwcmludGsoS0VSTl9FUlIgRFJWTkFNRSAiOiBEZXZpY2UgcmVzb3VyY2UgYWRkaXRpb24gZmFpbGVkXG4iKTsKIAkJZ290byBleGl0X2RldmljZV9wdXQ7CiAJfQogCisJZXJyID0gcGxhdGZvcm1fZGV2aWNlX2FkZF9kYXRhKGY3MTg4MmZnX3BkZXYsIHNpb19kYXRhLAorCQkJCSAgICAgICBzaXplb2Yoc3RydWN0IGY3MTg4MmZnX3Npb19kYXRhKSk7CisJaWYgKGVycikgeworCQlwcmludGsoS0VSTl9FUlIgRFJWTkFNRSAiOiBQbGF0Zm9ybSBkYXRhIGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKKwkJZ290byBleGl0X2RldmljZV9wdXQ7CisJfQorCiAJZXJyID0gcGxhdGZvcm1fZGV2aWNlX2FkZChmNzE4ODJmZ19wZGV2KTsKIAlpZiAoZXJyKSB7CiAJCXByaW50ayhLRVJOX0VSUiBEUlZOQU1FICI6IERldmljZSBhZGRpdGlvbiBmYWlsZWRcbiIpOwpAQCAtOTE2LDE0ICsxOTY1LDIwIEBACiB7CiAJaW50IGVyciA9IC1FTk9ERVY7CiAJdW5zaWduZWQgc2hvcnQgYWRkcmVzczsKKwlzdHJ1Y3QgZjcxODgyZmdfc2lvX2RhdGEgc2lvX2RhdGE7CiAKLQlpZiAoZjcxODgyZmdfZmluZCgweDJlLCAmYWRkcmVzcykgJiYgZjcxODgyZmdfZmluZCgweDRlLCAmYWRkcmVzcykpCisJbWVtc2V0KCZzaW9fZGF0YSwgMCwgc2l6ZW9mKHNpb19kYXRhKSk7CisKKwlpZiAoZjcxODgyZmdfZmluZCgweDJlLCAmYWRkcmVzcywgJnNpb19kYXRhKSAmJgorCSAgICBmNzE4ODJmZ19maW5kKDB4NGUsICZhZGRyZXNzLCAmc2lvX2RhdGEpKQogCQlnb3RvIGV4aXQ7CiAKLQlpZiAoKGVyciA9IHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmZjcxODgyZmdfZHJpdmVyKSkpCisJZXJyID0gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZmNzE4ODJmZ19kcml2ZXIpOworCWlmIChlcnIpCiAJCWdvdG8gZXhpdDsKIAotCWlmICgoZXJyID0gZjcxODgyZmdfZGV2aWNlX2FkZChhZGRyZXNzKSkpCisJZXJyID0gZjcxODgyZmdfZGV2aWNlX2FkZChhZGRyZXNzLCAmc2lvX2RhdGEpOworCWlmIChlcnIpCiAJCWdvdG8gZXhpdF9kcml2ZXI7CiAKIAlyZXR1cm4gMDsKQEAgLTk0MSw3ICsxOTk2LDcgQEAKIH0KIAogTU9EVUxFX0RFU0NSSVBUSU9OKCJGNzE4ODJGRyBIYXJkd2FyZSBNb25pdG9yaW5nIERyaXZlciIpOwotTU9EVUxFX0FVVEhPUigiSGFucyBFZGdpbmd0b24gKGhhbnNAZWRnaW5ndG9uLm5sKSIpOworTU9EVUxFX0FVVEhPUigiSGFucyBFZGdpbmd0b24sIEhhbnMgZGUgR29lZGUgKGhkZWdvZWRlQHJlZGhhdC5jb20pIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiAKIG1vZHVsZV9pbml0KGY3MTg4MmZnX2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9mc2NobWQuYyBiL2RyaXZlcnMvaHdtb24vZnNjaG1kLmMKaW5kZXggOTY3MTcwMy4uZDA3ZjRlZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9mc2NobWQuYworKysgYi9kcml2ZXJzL2h3bW9uL2ZzY2htZC5jCkBAIC0xLDYgKzEsNiBAQAogLyogZnNjaG1kLmMKICAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgSGFucyBkZSBHb2VkZSA8ai53LnIuZGVnb2VkZUBoaHMubmw+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDcsMjAwOCBIYW5zIGRlIEdvZWRlIDxoZGVnb2VkZUByZWRoYXQuY29tPgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQpAQCAtNDIsMTEgKzQyLDIwIEBACiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxsaW51eC9zeXNmcy5oPgogI2luY2x1ZGUgPGxpbnV4L2RtaS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvd2F0Y2hkb2cuaD4KKyNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L2tyZWYuaD4KIAogLyogQWRkcmVzc2VzIHRvIHNjYW4gKi8KIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBub3JtYWxfaTJjW10gPSB7IDB4NzMsIEkyQ19DTElFTlRfRU5EIH07CiAKIC8qIEluc21vZCBwYXJhbWV0ZXJzICovCitzdGF0aWMgaW50IG5vd2F5b3V0ID0gV0FUQ0hET0dfTk9XQVlPVVQ7Cittb2R1bGVfcGFyYW0obm93YXlvdXQsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKG5vd2F5b3V0LCAiV2F0Y2hkb2cgY2Fubm90IGJlIHN0b3BwZWQgb25jZSBzdGFydGVkIChkZWZhdWx0PSIKKwlfX01PRFVMRV9TVFJJTkcoV0FUQ0hET0dfTk9XQVlPVVQpICIpIik7CiBJMkNfQ0xJRU5UX0lOU01PRF81KGZzY3BvcywgZnNjaGVyLCBmc2NzY3ksIGZzY2hyYywgZnNjaG1kKTsKIAogLyoKQEAgLTYzLDE5ICs3MiwyNiBAQAogI2RlZmluZSBGU0NITURfUkVHX0VWRU5UX1NUQVRFCQkweDA0CiAjZGVmaW5lIEZTQ0hNRF9SRUdfQ09OVFJPTAkJMHgwNQogCi0jZGVmaW5lIEZTQ0hNRF9DT05UUk9MX0FMRVJUX0xFRF9NQVNLCTB4MDEKKyNkZWZpbmUgRlNDSE1EX0NPTlRST0xfQUxFUlRfTEVECTB4MDEKIAotLyogd2F0Y2hkb2cgKHN1cHBvcnQgdG8gYmUgaW1wbGVtZW50ZWQpICovCisvKiB3YXRjaGRvZyAqLwogI2RlZmluZSBGU0NITURfUkVHX1dET0dfUFJFU0VUCQkweDI4CiAjZGVmaW5lIEZTQ0hNRF9SRUdfV0RPR19TVEFURQkJMHgyMwogI2RlZmluZSBGU0NITURfUkVHX1dET0dfQ09OVFJPTAkJMHgyMQogCisjZGVmaW5lIEZTQ0hNRF9XRE9HX0NPTlRST0xfVFJJR0dFUgkweDEwCisjZGVmaW5lIEZTQ0hNRF9XRE9HX0NPTlRST0xfU1RBUlRFRAkweDEwIC8qIHRoZSBzYW1lIGFzIHRyaWdnZXIgKi8KKyNkZWZpbmUgRlNDSE1EX1dET0dfQ09OVFJPTF9TVE9QCTB4MjAKKyNkZWZpbmUgRlNDSE1EX1dET0dfQ09OVFJPTF9SRVNPTFVUSU9OCTB4NDAKKworI2RlZmluZSBGU0NITURfV0RPR19TVEFURV9DQVJEUkVTRVQJMHgwMgorCiAvKiB2b2x0YWdlcywgd2VpcmQgb3JkZXIgaXMgdG8ga2VlcCB0aGUgc2FtZSBvcmRlciBhcyB0aGUgb2xkIGRyaXZlcnMgKi8KIHN0YXRpYyBjb25zdCB1OCBGU0NITURfUkVHX1ZPTFRbM10gPSB7IDB4NDUsIDB4NDIsIDB4NDggfTsKIAogLyogbWluaW11bSBwd20gYXQgd2hpY2ggdGhlIGZhbiBpcyBkcml2ZW4gKHB3bSBjYW4gYnkgaW5jcmVhc2VkIGRlcGVuZGluZyBvbgogICAgdGhlIHRlbXAuIE5vdGljZSB0aGF0IGZvciB0aGUgc2N5IHNvbWUgZmFucyBzaGFyZSB0aGVyZSBtaW5pbXVtIHNwZWVkLgotICAgQWxzbyBub3RpY2UgdGhhdCB3aXRoIHRoZSBzY3kgdGhlIHNlbnNvciBvcmRlciBpcyBkaWZmZXJlbnQgdGhlbiB3aXRoIHRoZQorICAgQWxzbyBub3RpY2UgdGhhdCB3aXRoIHRoZSBzY3kgdGhlIHNlbnNvciBvcmRlciBpcyBkaWZmZXJlbnQgdGhhbiB3aXRoIHRoZQogICAgb3RoZXIgY2hpcHMsIHRoaXMgb3JkZXIgd2FzIGluIHRoZSAyLjQgZHJpdmVyIGFuZCBrZXB0IGZvciBjb25zaXN0ZW5jeS4gKi8KIHN0YXRpYyBjb25zdCB1OCBGU0NITURfUkVHX0ZBTl9NSU5bNV1bNl0gPSB7CiAJeyAweDU1LCAweDY1IH0sCQkJCQkvKiBwb3MgKi8KQEAgLTExNSw4ICsxMzEsOCBAQAogc3RhdGljIGNvbnN0IGludCBGU0NITURfTk9fRkFOX1NFTlNPUlNbNV0gPSB7IDMsIDMsIDYsIDQsIDUgfTsKIAogLyogRmFuIHN0YXR1cyByZWdpc3RlciBiaXRtYXNrcyAqLwotI2RlZmluZSBGU0NITURfRkFOX0FMQVJNX01BU0sJCTB4MDQgLyogY2FsbGVkIGZhdWx0IGJ5IEZTQyEgKi8KLSNkZWZpbmUgRlNDSE1EX0ZBTl9OT1RfUFJFU0VOVF9NQVNLCTB4MDggLyogbm90IGRvY3VtZW50ZWQgKi8KKyNkZWZpbmUgRlNDSE1EX0ZBTl9BTEFSTQkweDA0IC8qIGNhbGxlZCBmYXVsdCBieSBGU0MhICovCisjZGVmaW5lIEZTQ0hNRF9GQU5fTk9UX1BSRVNFTlQJMHgwOCAvKiBub3QgZG9jdW1lbnRlZCAqLwogCiAKIC8qIGFjdHVhbCB0ZW1wZXJhdHVyZSByZWdpc3RlcnMgKi8KQEAgLTE1OCwxNCArMTc0LDExIEBACiBzdGF0aWMgY29uc3QgaW50IEZTQ0hNRF9OT19URU1QX1NFTlNPUlNbNV0gPSB7IDMsIDMsIDQsIDMsIDUgfTsKIAogLyogdGVtcCBzdGF0dXMgcmVnaXN0ZXIgYml0bWFza3MgKi8KLSNkZWZpbmUgRlNDSE1EX1RFTVBfV09SS0lOR19NQVNLCTB4MDEKLSNkZWZpbmUgRlNDSE1EX1RFTVBfQUxFUlRfTUFTSwkJMHgwMgorI2RlZmluZSBGU0NITURfVEVNUF9XT1JLSU5HCTB4MDEKKyNkZWZpbmUgRlNDSE1EX1RFTVBfQUxFUlQJMHgwMgogLyogdGhlcmUgb25seSByZWFsbHkgaXMgYW4gYWxhcm0gaWYgdGhlIHNlbnNvciBpcyB3b3JraW5nIGFuZCBhbGVydCA9PSAxICovCiAjZGVmaW5lIEZTQ0hNRF9URU1QX0FMQVJNX01BU0sgXAotCShGU0NITURfVEVNUF9XT1JLSU5HX01BU0sgfCBGU0NITURfVEVNUF9BTEVSVF9NQVNLKQotCi0vKiBvdXIgZHJpdmVyIG5hbWUgKi8KLSNkZWZpbmUgRlNDSE1EX05BTUUgImZzY2htZCIKKwkoRlNDSE1EX1RFTVBfV09SS0lORyB8IEZTQ0hNRF9URU1QX0FMRVJUKQogCiAvKgogICogRnVuY3Rpb25zIGRlY2xhcmF0aW9ucwpAQCAtMTk1LDcgKzIwOCw3IEBACiBzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgZnNjaG1kX2RyaXZlciA9IHsKIAkuY2xhc3MJCT0gSTJDX0NMQVNTX0hXTU9OLAogCS5kcml2ZXIgPSB7Ci0JCS5uYW1lCT0gRlNDSE1EX05BTUUsCisJCS5uYW1lCT0gImZzY2htZCIsCiAJfSwKIAkucHJvYmUJCT0gZnNjaG1kX3Byb2JlLAogCS5yZW1vdmUJCT0gZnNjaG1kX3JlbW92ZSwKQEAgLTIwOSwxNCArMjIyLDI2IEBACiAgKi8KIAogc3RydWN0IGZzY2htZF9kYXRhIHsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50OwogCXN0cnVjdCBkZXZpY2UgKmh3bW9uX2RldjsKIAlzdHJ1Y3QgbXV0ZXggdXBkYXRlX2xvY2s7CisJc3RydWN0IG11dGV4IHdhdGNoZG9nX2xvY2s7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OyAvKiBtZW1iZXIgb2YgdGhlIHdhdGNoZG9nX2RhdGFfbGlzdCAqLworCXN0cnVjdCBrcmVmIGtyZWY7CisJc3RydWN0IG1pc2NkZXZpY2Ugd2F0Y2hkb2dfbWlzY2RldjsKIAlpbnQga2luZDsKKwl1bnNpZ25lZCBsb25nIHdhdGNoZG9nX2lzX29wZW47CisJY2hhciB3YXRjaGRvZ19leHBlY3RfY2xvc2U7CisJY2hhciB3YXRjaGRvZ19uYW1lWzEwXTsgLyogbXVzdCBiZSB1bmlxdWUgdG8gYXZvaWQgc3lzZnMgY29uZmxpY3QgKi8KIAljaGFyIHZhbGlkOyAvKiB6ZXJvIHVudGlsIGZvbGxvd2luZyBmaWVsZHMgYXJlIHZhbGlkICovCiAJdW5zaWduZWQgbG9uZyBsYXN0X3VwZGF0ZWQ7IC8qIGluIGppZmZpZXMgKi8KIAogCS8qIHJlZ2lzdGVyIHZhbHVlcyAqLworCXU4IHJldmlzaW9uOyAgICAgICAgICAgIC8qIGNoaXAgcmV2aXNpb24gKi8KIAl1OCBnbG9iYWxfY29udHJvbDsJLyogZ2xvYmFsIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKwl1OCB3YXRjaGRvZ19jb250cm9sOyAgICAvKiB3YXRjaGRvZyBjb250cm9sIHJlZ2lzdGVyICovCisJdTggd2F0Y2hkb2dfc3RhdGU7ICAgICAgLyogd2F0Y2hkb2cgc3RhdHVzIHJlZ2lzdGVyICovCisJdTggd2F0Y2hkb2dfcHJlc2V0OyAgICAgLyogd2F0Y2hkb2cgY291bnRlciBwcmVzZXQgb24gdHJpZ2dlciB2YWwgKi8KIAl1OCB2b2x0WzNdOwkJLyogMTIsIDUsIGJhdHRlcnkgdm9sdGFnZSAqLwogCXU4IHRlbXBfYWN0WzVdOwkJLyogdGVtcGVyYXR1cmUgKi8KIAl1OCB0ZW1wX3N0YXR1c1s1XTsJLyogc3RhdHVzIG9mIHNlbnNvciAqLwpAQCAtMjI4LDExICsyNTMsMjggQEAKIH07CiAKIC8qIEdsb2JhbCB2YXJpYWJsZXMgdG8gaG9sZCBpbmZvcm1hdGlvbiByZWFkIGZyb20gc3BlY2lhbCBETUkgdGFibGVzLCB3aGljaCBhcmUKLSAgIGF2YWlsYWJsZSBvbiBGU0MgbWFjaGluZXMgd2l0aCBhbiBmc2NoZXIgb3IgbGF0ZXIgY2hpcC4gKi8KKyAgIGF2YWlsYWJsZSBvbiBGU0MgbWFjaGluZXMgd2l0aCBhbiBmc2NoZXIgb3IgbGF0ZXIgY2hpcC4gVGhlcmUgaXMgbm8gbmVlZCB0bworICAgcHJvdGVjdCB0aGVzZSB3aXRoIGEgbG9jayBhcyB0aGV5IGFyZSBvbmx5IG1vZGlmaWVkIGZyb20gb3VyIGF0dGFjaCBmdW5jdGlvbgorICAgd2hpY2ggYWx3YXlzIGdldHMgY2FsbGVkIHdpdGggdGhlIGkyYy1jb3JlIGxvY2sgaGVsZCBhbmQgbmV2ZXIgYWNjZXNzZWQKKyAgIGJlZm9yZSB0aGUgYXR0YWNoIGZ1bmN0aW9uIGlzIGRvbmUgd2l0aCB0aGVtLiAqLwogc3RhdGljIGludCBkbWlfbXVsdFszXSA9IHsgNDkwLCAyMDAsIDEwMCB9Owogc3RhdGljIGludCBkbWlfb2Zmc2V0WzNdID0geyAwLCAwLCAwIH07CiBzdGF0aWMgaW50IGRtaV92cmVmID0gLTE7CiAKKy8qIFNvbWV3aGF0IHVnbHkgOiggZ2xvYmFsIGRhdGEgcG9pbnRlciBsaXN0IHdpdGggYWxsIGZzY2htZCBkZXZpY2VzLCBzbyB0aGF0CisgICB3ZSBjYW4gZmluZCBvdXIgZGV2aWNlIGRhdGEgYXMgd2hlbiB1c2luZyBtaXNjX3JlZ2lzdGVyIHRoZXJlIGlzIG5vIG90aGVyCisgICBtZXRob2QgdG8gZ2V0IHRvIG9uZXMgZGV2aWNlIGRhdGEgZnJvbSB0aGUgb3BlbiBmb3AuICovCitzdGF0aWMgTElTVF9IRUFEKHdhdGNoZG9nX2RhdGFfbGlzdCk7CisvKiBOb3RlIHRoaXMgbG9jayBub3Qgb25seSBwcm90ZWN0IGxpc3QgYWNjZXNzLCBidXQgYWxzbyBkYXRhLmtyZWYgYWNjZXNzICovCitzdGF0aWMgREVGSU5FX01VVEVYKHdhdGNoZG9nX2RhdGFfbXV0ZXgpOworCisvKiBSZWxlYXNlIG91ciBkYXRhIHN0cnVjdCB3aGVuIHdlJ3JlIGRldGFjaGVkIGZyb20gdGhlIGkyYyBjbGllbnQgKmFuZCogYWxsCisgICByZWZlcmVuY2VzIHRvIG91ciB3YXRjaGRvZyBkZXZpY2UgYXJlIHJlbGVhc2VkICovCitzdGF0aWMgdm9pZCBmc2NobWRfcmVsZWFzZV9yZXNvdXJjZXMoc3RydWN0IGtyZWYgKnJlZikKK3sKKwlzdHJ1Y3QgZnNjaG1kX2RhdGEgKmRhdGEgPSBjb250YWluZXJfb2YocmVmLCBzdHJ1Y3QgZnNjaG1kX2RhdGEsIGtyZWYpOworCWtmcmVlKGRhdGEpOworfQogCiAvKgogICogU3lzZnMgYXR0ciBzaG93IC8gc3RvcmUgZnVuY3Rpb25zCkBAIC0zMDAsNyArMzQyLDcgQEAKIAlzdHJ1Y3QgZnNjaG1kX2RhdGEgKmRhdGEgPSBmc2NobWRfdXBkYXRlX2RldmljZShkZXYpOwogCiAJLyogYml0IDAgc2V0IG1lYW5zIHNlbnNvciB3b3JraW5nIG9rLCBzbyBubyBmYXVsdCEgKi8KLQlpZiAoZGF0YS0+dGVtcF9zdGF0dXNbaW5kZXhdICYgRlNDSE1EX1RFTVBfV09SS0lOR19NQVNLKQorCWlmIChkYXRhLT50ZW1wX3N0YXR1c1tpbmRleF0gJiBGU0NITURfVEVNUF9XT1JLSU5HKQogCQlyZXR1cm4gc3ByaW50ZihidWYsICIwXG4iKTsKIAllbHNlCiAJCXJldHVybiBzcHJpbnRmKGJ1ZiwgIjFcbiIpOwpAQCAtMzg1LDcgKzQyNyw3IEBACiAJaW50IGluZGV4ID0gdG9fc2Vuc29yX2Rldl9hdHRyKGRldmF0dHIpLT5pbmRleDsKIAlzdHJ1Y3QgZnNjaG1kX2RhdGEgKmRhdGEgPSBmc2NobWRfdXBkYXRlX2RldmljZShkZXYpOwogCi0JaWYgKGRhdGEtPmZhbl9zdGF0dXNbaW5kZXhdICYgRlNDSE1EX0ZBTl9BTEFSTV9NQVNLKQorCWlmIChkYXRhLT5mYW5fc3RhdHVzW2luZGV4XSAmIEZTQ0hNRF9GQU5fQUxBUk0pCiAJCXJldHVybiBzcHJpbnRmKGJ1ZiwgIjFcbiIpOwogCWVsc2UKIAkJcmV0dXJuIHNwcmludGYoYnVmLCAiMFxuIik7CkBAIC0zOTcsNyArNDM5LDcgQEAKIAlpbnQgaW5kZXggPSB0b19zZW5zb3JfZGV2X2F0dHIoZGV2YXR0ciktPmluZGV4OwogCXN0cnVjdCBmc2NobWRfZGF0YSAqZGF0YSA9IGZzY2htZF91cGRhdGVfZGV2aWNlKGRldik7CiAKLQlpZiAoZGF0YS0+ZmFuX3N0YXR1c1tpbmRleF0gJiBGU0NITURfRkFOX05PVF9QUkVTRU5UX01BU0spCisJaWYgKGRhdGEtPmZhbl9zdGF0dXNbaW5kZXhdICYgRlNDSE1EX0ZBTl9OT1RfUFJFU0VOVCkKIAkJcmV0dXJuIHNwcmludGYoYnVmLCAiMVxuIik7CiAJZWxzZQogCQlyZXR1cm4gc3ByaW50ZihidWYsICIwXG4iKTsKQEAgLTQ0OSw3ICs0OTEsNyBAQAogewogCXN0cnVjdCBmc2NobWRfZGF0YSAqZGF0YSA9IGZzY2htZF91cGRhdGVfZGV2aWNlKGRldik7CiAKLQlpZiAoZGF0YS0+Z2xvYmFsX2NvbnRyb2wgJiBGU0NITURfQ09OVFJPTF9BTEVSVF9MRURfTUFTSykKKwlpZiAoZGF0YS0+Z2xvYmFsX2NvbnRyb2wgJiBGU0NITURfQ09OVFJPTF9BTEVSVF9MRUQpCiAJCXJldHVybiBzcHJpbnRmKGJ1ZiwgIjFcbiIpOwogCWVsc2UKIAkJcmV0dXJuIHNwcmludGYoYnVmLCAiMFxuIik7CkBAIC00NjcsOSArNTA5LDkgQEAKIAlyZWcgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEodG9faTJjX2NsaWVudChkZXYpLCBGU0NITURfUkVHX0NPTlRST0wpOwogCiAJaWYgKHYpCi0JCXJlZyB8PSBGU0NITURfQ09OVFJPTF9BTEVSVF9MRURfTUFTSzsKKwkJcmVnIHw9IEZTQ0hNRF9DT05UUk9MX0FMRVJUX0xFRDsKIAllbHNlCi0JCXJlZyAmPSB+RlNDSE1EX0NPTlRST0xfQUxFUlRfTEVEX01BU0s7CisJCXJlZyAmPSB+RlNDSE1EX0NPTlRST0xfQUxFUlRfTEVEOwogCiAJaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YSh0b19pMmNfY2xpZW50KGRldiksIEZTQ0hNRF9SRUdfQ09OVFJPTCwgcmVnKTsKIApAQCAtNTUxLDcgKzU5MywyNjUgQEAKIAogCiAvKgotICogUmVhbCBjb2RlCisgKiBXYXRjaGRvZyByb3V0aW5lcworICovCisKK3N0YXRpYyBpbnQgd2F0Y2hkb2dfc2V0X3RpbWVvdXQoc3RydWN0IGZzY2htZF9kYXRhICpkYXRhLCBpbnQgdGltZW91dCkKK3sKKwlpbnQgcmV0LCByZXNvbHV0aW9uOworCWludCBraW5kID0gZGF0YS0+a2luZCArIDE7IC8qIDAteCBhcnJheSBpbmRleCAtPiAxLXggbW9kdWxlIHBhcmFtICovCisKKwkvKiAyIHNlY29uZCBvciA2MCBzZWNvbmQgcmVzb2x1dGlvbj8gKi8KKwlpZiAodGltZW91dCA8PSA1MTAgfHwga2luZCA9PSBmc2Nwb3MgfHwga2luZCA9PSBmc2NzY3kpCisJCXJlc29sdXRpb24gPSAyOworCWVsc2UKKwkJcmVzb2x1dGlvbiA9IDYwOworCisJaWYgKHRpbWVvdXQgPCByZXNvbHV0aW9uIHx8IHRpbWVvdXQgPiAocmVzb2x1dGlvbiAqIDI1NSkpCisJCXJldHVybiAtRUlOVkFMOworCisJbXV0ZXhfbG9jaygmZGF0YS0+d2F0Y2hkb2dfbG9jayk7CisJaWYgKCFkYXRhLT5jbGllbnQpIHsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBsZWF2ZTsKKwl9CisKKwlpZiAocmVzb2x1dGlvbiA9PSAyKQorCQlkYXRhLT53YXRjaGRvZ19jb250cm9sICY9IH5GU0NITURfV0RPR19DT05UUk9MX1JFU09MVVRJT047CisJZWxzZQorCQlkYXRhLT53YXRjaGRvZ19jb250cm9sIHw9IEZTQ0hNRF9XRE9HX0NPTlRST0xfUkVTT0xVVElPTjsKKworCWRhdGEtPndhdGNoZG9nX3ByZXNldCA9IERJVl9ST1VORF9VUCh0aW1lb3V0LCByZXNvbHV0aW9uKTsKKworCS8qIFdyaXRlIG5ldyB0aW1lb3V0IHZhbHVlICovCisJaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShkYXRhLT5jbGllbnQsIEZTQ0hNRF9SRUdfV0RPR19QUkVTRVQsCisJCWRhdGEtPndhdGNoZG9nX3ByZXNldCk7CisJLyogV3JpdGUgbmV3IGNvbnRyb2wgcmVnaXN0ZXIsIGRvIG5vdCB0cmlnZ2VyISAqLworCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoZGF0YS0+Y2xpZW50LCBGU0NITURfUkVHX1dET0dfQ09OVFJPTCwKKwkJZGF0YS0+d2F0Y2hkb2dfY29udHJvbCAmIH5GU0NITURfV0RPR19DT05UUk9MX1RSSUdHRVIpOworCisJcmV0ID0gZGF0YS0+d2F0Y2hkb2dfcHJlc2V0ICogcmVzb2x1dGlvbjsKKworbGVhdmU6CisJbXV0ZXhfdW5sb2NrKCZkYXRhLT53YXRjaGRvZ19sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHdhdGNoZG9nX2dldF90aW1lb3V0KHN0cnVjdCBmc2NobWRfZGF0YSAqZGF0YSkKK3sKKwlpbnQgdGltZW91dDsKKworCW11dGV4X2xvY2soJmRhdGEtPndhdGNoZG9nX2xvY2spOworCWlmIChkYXRhLT53YXRjaGRvZ19jb250cm9sICYgRlNDSE1EX1dET0dfQ09OVFJPTF9SRVNPTFVUSU9OKQorCQl0aW1lb3V0ID0gZGF0YS0+d2F0Y2hkb2dfcHJlc2V0ICogNjA7CisJZWxzZQorCQl0aW1lb3V0ID0gZGF0YS0+d2F0Y2hkb2dfcHJlc2V0ICogMjsKKwltdXRleF91bmxvY2soJmRhdGEtPndhdGNoZG9nX2xvY2spOworCisJcmV0dXJuIHRpbWVvdXQ7Cit9CisKK3N0YXRpYyBpbnQgd2F0Y2hkb2dfdHJpZ2dlcihzdHJ1Y3QgZnNjaG1kX2RhdGEgKmRhdGEpCit7CisJaW50IHJldCA9IDA7CisKKwltdXRleF9sb2NrKCZkYXRhLT53YXRjaGRvZ19sb2NrKTsKKwlpZiAoIWRhdGEtPmNsaWVudCkgeworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIGxlYXZlOworCX0KKworCWRhdGEtPndhdGNoZG9nX2NvbnRyb2wgfD0gRlNDSE1EX1dET0dfQ09OVFJPTF9UUklHR0VSOworCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoZGF0YS0+Y2xpZW50LCBGU0NITURfUkVHX1dET0dfQ09OVFJPTCwKKwkJCQkJZGF0YS0+d2F0Y2hkb2dfY29udHJvbCk7CitsZWF2ZToKKwltdXRleF91bmxvY2soJmRhdGEtPndhdGNoZG9nX2xvY2spOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgd2F0Y2hkb2dfc3RvcChzdHJ1Y3QgZnNjaG1kX2RhdGEgKmRhdGEpCit7CisJaW50IHJldCA9IDA7CisKKwltdXRleF9sb2NrKCZkYXRhLT53YXRjaGRvZ19sb2NrKTsKKwlpZiAoIWRhdGEtPmNsaWVudCkgeworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIGxlYXZlOworCX0KKworCWRhdGEtPndhdGNoZG9nX2NvbnRyb2wgJj0gfkZTQ0hNRF9XRE9HX0NPTlRST0xfU1RBUlRFRDsKKwkvKiBEb24ndCBzdG9yZSB0aGUgc3RvcCBmbGFnIGluIG91ciB3YXRjaGRvZyBjb250cm9sIHJlZ2lzdGVyIGNvcHksIGFzCisJICAgaXRzIGEgd3JpdGUgb25seSBiaXQgKHJlYWQgYWx3YXlzIHJldHVybnMgMCkgKi8KKwlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGRhdGEtPmNsaWVudCwgRlNDSE1EX1JFR19XRE9HX0NPTlRST0wsCisJCWRhdGEtPndhdGNoZG9nX2NvbnRyb2wgfCBGU0NITURfV0RPR19DT05UUk9MX1NUT1ApOworbGVhdmU6CisJbXV0ZXhfdW5sb2NrKCZkYXRhLT53YXRjaGRvZ19sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHdhdGNoZG9nX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApCit7CisJc3RydWN0IGZzY2htZF9kYXRhICpwb3MsICpkYXRhID0gTlVMTDsKKworCS8qIFdlIGdldCBjYWxsZWQgZnJvbSBkcml2ZXJzL2NoYXIvbWlzYy5jIHdpdGggbWlzY19tdHggaG9sZCwgYW5kIHdlCisJICAgY2FsbCBtaXNjX3JlZ2lzdGVyKCkgZnJvbSBmc2NobWRfcHJvYmUoKSB3aXRoIHdhdGNoZG9nX2RhdGFfbXV0ZXgKKwkgICBob2xkLCBhcyBtaXNjX3JlZ2lzdGVyKCkgdGFrZXMgdGhlIG1pc2NfbXR4IGxvY2ssIHRoaXMgaXMgYSBwb3NzaWJsZQorCSAgIGRlYWRsb2NrLCBzbyB3ZSB1c2UgbXV0ZXhfdHJ5bG9jayBoZXJlLiAqLworCWlmICghbXV0ZXhfdHJ5bG9jaygmd2F0Y2hkb2dfZGF0YV9tdXRleCkpCisJCXJldHVybiAtRVJFU1RBUlRTWVM7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShwb3MsICZ3YXRjaGRvZ19kYXRhX2xpc3QsIGxpc3QpIHsKKwkJaWYgKHBvcy0+d2F0Y2hkb2dfbWlzY2Rldi5taW5vciA9PSBpbWlub3IoaW5vZGUpKSB7CisJCQlkYXRhID0gcG9zOworCQkJYnJlYWs7CisJCX0KKwl9CisJLyogTm90ZSB3ZSBjYW4gbmV2ZXIgbm90IGhhdmUgZm91bmQgZGF0YSwgc28gd2UgZG9uJ3QgY2hlY2sgZm9yIHRoaXMgKi8KKwlrcmVmX2dldCgmZGF0YS0+a3JlZik7CisJbXV0ZXhfdW5sb2NrKCZ3YXRjaGRvZ19kYXRhX211dGV4KTsKKworCWlmICh0ZXN0X2FuZF9zZXRfYml0KDAsICZkYXRhLT53YXRjaGRvZ19pc19vcGVuKSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCS8qIFN0YXJ0IHRoZSB3YXRjaGRvZyAqLworCXdhdGNoZG9nX3RyaWdnZXIoZGF0YSk7CisJZmlscC0+cHJpdmF0ZV9kYXRhID0gZGF0YTsKKworCXJldHVybiBub25zZWVrYWJsZV9vcGVuKGlub2RlLCBmaWxwKTsKK30KKworc3RhdGljIGludCB3YXRjaGRvZ19yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKQoreworCXN0cnVjdCBmc2NobWRfZGF0YSAqZGF0YSA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKworCWlmIChkYXRhLT53YXRjaGRvZ19leHBlY3RfY2xvc2UpIHsKKwkJd2F0Y2hkb2dfc3RvcChkYXRhKTsKKwkJZGF0YS0+d2F0Y2hkb2dfZXhwZWN0X2Nsb3NlID0gMDsKKwl9IGVsc2UgeworCQl3YXRjaGRvZ190cmlnZ2VyKGRhdGEpOworCQlkZXZfY3JpdCgmZGF0YS0+Y2xpZW50LT5kZXYsCisJCQkidW5leHBlY3RlZCBjbG9zZSwgbm90IHN0b3BwaW5nIHdhdGNoZG9nIVxuIik7CisJfQorCisJY2xlYXJfYml0KDAsICZkYXRhLT53YXRjaGRvZ19pc19vcGVuKTsKKworCW11dGV4X2xvY2soJndhdGNoZG9nX2RhdGFfbXV0ZXgpOworCWtyZWZfcHV0KCZkYXRhLT5rcmVmLCBmc2NobWRfcmVsZWFzZV9yZXNvdXJjZXMpOworCW11dGV4X3VubG9jaygmd2F0Y2hkb2dfZGF0YV9tdXRleCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHNzaXplX3Qgd2F0Y2hkb2dfd3JpdGUoc3RydWN0IGZpbGUgKmZpbHAsIGNvbnN0IGNoYXIgX191c2VyICpidWYsCisJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKm9mZnNldCkKK3sKKwlzaXplX3QgcmV0OworCXN0cnVjdCBmc2NobWRfZGF0YSAqZGF0YSA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKworCWlmIChjb3VudCkgeworCQlpZiAoIW5vd2F5b3V0KSB7CisJCQlzaXplX3QgaTsKKworCQkJLyogQ2xlYXIgaXQgaW4gY2FzZSBpdCB3YXMgc2V0IHdpdGggYSBwcmV2aW91cyB3cml0ZSAqLworCQkJZGF0YS0+d2F0Y2hkb2dfZXhwZWN0X2Nsb3NlID0gMDsKKworCQkJZm9yIChpID0gMDsgaSAhPSBjb3VudDsgaSsrKSB7CisJCQkJY2hhciBjOworCQkJCWlmIChnZXRfdXNlcihjLCBidWYgKyBpKSkKKwkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJaWYgKGMgPT0gJ1YnKQorCQkJCQlkYXRhLT53YXRjaGRvZ19leHBlY3RfY2xvc2UgPSAxOworCQkJfQorCQl9CisJCXJldCA9IHdhdGNoZG9nX3RyaWdnZXIoZGF0YSk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKwl9CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgaW50IHdhdGNoZG9nX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAorCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0YXRpYyBzdHJ1Y3Qgd2F0Y2hkb2dfaW5mbyBpZGVudCA9IHsKKwkJLm9wdGlvbnMgPSBXRElPRl9LRUVQQUxJVkVQSU5HIHwgV0RJT0ZfU0VUVElNRU9VVCB8CisJCQkJV0RJT0ZfQ0FSRFJFU0VULAorCQkuaWRlbnRpdHkgPSAiRlNDIHdhdGNoZG9nIgorCX07CisJaW50IGksIHJldCA9IDA7CisJc3RydWN0IGZzY2htZF9kYXRhICpkYXRhID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFdESU9DX0dFVFNVUFBPUlQ6CisJCWlkZW50LmZpcm13YXJlX3ZlcnNpb24gPSBkYXRhLT5yZXZpc2lvbjsKKwkJaWYgKCFub3dheW91dCkKKwkJCWlkZW50Lm9wdGlvbnMgfD0gV0RJT0ZfTUFHSUNDTE9TRTsKKwkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsICZpZGVudCwgc2l6ZW9mKGlkZW50KSkpCisJCQlyZXQgPSAtRUZBVUxUOworCQlicmVhazsKKworCWNhc2UgV0RJT0NfR0VUU1RBVFVTOgorCQlyZXQgPSBwdXRfdXNlcigwLCAoaW50IF9fdXNlciAqKWFyZyk7CisJCWJyZWFrOworCisJY2FzZSBXRElPQ19HRVRCT09UU1RBVFVTOgorCQlpZiAoZGF0YS0+d2F0Y2hkb2dfc3RhdGUgJiBGU0NITURfV0RPR19TVEFURV9DQVJEUkVTRVQpCisJCQlyZXQgPSBwdXRfdXNlcihXRElPRl9DQVJEUkVTRVQsIChpbnQgX191c2VyICopYXJnKTsKKwkJZWxzZQorCQkJcmV0ID0gcHV0X3VzZXIoMCwgKGludCBfX3VzZXIgKilhcmcpOworCQlicmVhazsKKworCWNhc2UgV0RJT0NfS0VFUEFMSVZFOgorCQlyZXQgPSB3YXRjaGRvZ190cmlnZ2VyKGRhdGEpOworCQlicmVhazsKKworCWNhc2UgV0RJT0NfR0VUVElNRU9VVDoKKwkJaSA9IHdhdGNoZG9nX2dldF90aW1lb3V0KGRhdGEpOworCQlyZXQgPSBwdXRfdXNlcihpLCAoaW50IF9fdXNlciAqKWFyZyk7CisJCWJyZWFrOworCisJY2FzZSBXRElPQ19TRVRUSU1FT1VUOgorCQlpZiAoZ2V0X3VzZXIoaSwgKGludCBfX3VzZXIgKilhcmcpKSB7CisJCQlyZXQgPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KKwkJcmV0ID0gd2F0Y2hkb2dfc2V0X3RpbWVvdXQoZGF0YSwgaSk7CisJCWlmIChyZXQgPiAwKQorCQkJcmV0ID0gcHV0X3VzZXIocmV0LCAoaW50IF9fdXNlciAqKWFyZyk7CisJCWJyZWFrOworCisJY2FzZSBXRElPQ19TRVRPUFRJT05TOgorCQlpZiAoZ2V0X3VzZXIoaSwgKGludCBfX3VzZXIgKilhcmcpKSB7CisJCQlyZXQgPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoaSAmIFdESU9TX0RJU0FCTEVDQVJEKQorCQkJcmV0ID0gd2F0Y2hkb2dfc3RvcChkYXRhKTsKKwkJZWxzZSBpZiAoaSAmIFdESU9TX0VOQUJMRUNBUkQpCisJCQlyZXQgPSB3YXRjaGRvZ190cmlnZ2VyKGRhdGEpOworCQllbHNlCisJCQlyZXQgPSAtRUlOVkFMOworCisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldCA9IC1FTk9UVFk7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgd2F0Y2hkb2dfZm9wcyA9IHsKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkubGxzZWVrID0gbm9fbGxzZWVrLAorCS5vcGVuID0gd2F0Y2hkb2dfb3BlbiwKKwkucmVsZWFzZSA9IHdhdGNoZG9nX3JlbGVhc2UsCisJLndyaXRlID0gd2F0Y2hkb2dfd3JpdGUsCisJLmlvY3RsID0gd2F0Y2hkb2dfaW9jdGwsCit9OworCisKKy8qCisgKiBEZXRlY3QsIHJlZ2lzdGVyLCB1bnJlZ2lzdGVyIGFuZCB1cGRhdGUgZGV2aWNlIGZ1bmN0aW9ucwogICovCiAKIC8qIERNSSBkZWNvZGUgcm91dGluZSB0byByZWFkIHZvbHRhZ2Ugc2NhbGluZyBmYWN0b3JzIGZyb20gc3BlY2lhbCBETUkgdGFibGVzLApAQCAtNjYxLDkgKzk2MSw5IEBACiAJCQljb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCiB7CiAJc3RydWN0IGZzY2htZF9kYXRhICpkYXRhOwotCXU4IHJldmlzaW9uOwogCWNvbnN0IGNoYXIgKiBjb25zdCBuYW1lc1s1XSA9IHsgIlBvc2VpZG9uIiwgIkhlcm1lcyIsICJTY3lsbGEiLAogCQkJCQkiSGVyYWNsZXMiLCAiSGVpbWRhbGwiIH07CisJY29uc3QgaW50IHdhdGNoZG9nX21pbm9yc1tdID0geyBXQVRDSERPR19NSU5PUiwgMjEyLCAyMTMsIDIxNCwgMjE1IH07CiAJaW50IGksIGVycjsKIAllbnVtIGNoaXBzIGtpbmQgPSBpZC0+ZHJpdmVyX2RhdGE7CiAKQEAgLTY3Myw2ICs5NzMsMTMgQEAKIAogCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIGRhdGEpOwogCW11dGV4X2luaXQoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwltdXRleF9pbml0KCZkYXRhLT53YXRjaGRvZ19sb2NrKTsKKwlJTklUX0xJU1RfSEVBRCgmZGF0YS0+bGlzdCk7CisJa3JlZl9pbml0KCZkYXRhLT5rcmVmKTsKKwkvKiBTdG9yZSBjbGllbnQgcG9pbnRlciBpbiBvdXIgZGF0YSBzdHJ1Y3QgZm9yIHdhdGNoZG9nIHVzYWdlCisJICAgKHdoZXJlIHRoZSBjbGllbnQgaXMgZm91bmQgdGhyb3VnaCBhIGRhdGEgcHRyIGluc3RlYWQgb2YgdGhlCisJICAgb3RoZXJ3YXkgYXJvdW5kKSAqLworCWRhdGEtPmNsaWVudCA9IGNsaWVudDsKIAogCWlmIChraW5kID09IGZzY3BvcykgewogCQkvKiBUaGUgUG9zZWlkb24gaGFzIGhhcmR3aXJlZCB0ZW1wIGxpbWl0cywgZmlsbCB0aGVzZQpAQCAtNjgzLDE2ICs5OTAsMjcgQEAKIAl9CiAKIAkvKiBSZWFkIHRoZSBzcGVjaWFsIERNSSB0YWJsZSBmb3IgZnNjaGVyIGFuZCBuZXdlciBjaGlwcyAqLwotCWlmIChraW5kID09IGZzY2hlciB8fCBraW5kID49IGZzY2hyYykgeworCWlmICgoa2luZCA9PSBmc2NoZXIgfHwga2luZCA+PSBmc2NocmMpICYmIGRtaV92cmVmID09IC0xKSB7CiAJCWRtaV93YWxrKGZzY2htZF9kbWlfZGVjb2RlKTsKIAkJaWYgKGRtaV92cmVmID09IC0xKSB7Ci0JCQlwcmludGsoS0VSTl9XQVJOSU5HIEZTQ0hNRF9OQU1FCi0JCQkJIjogQ291bGRuJ3QgZ2V0IHZvbHRhZ2Ugc2NhbGluZyBmYWN0b3JzIGZyb20gIgorCQkJZGV2X3dhcm4oJmNsaWVudC0+ZGV2LAorCQkJCSJDb3VsZG4ndCBnZXQgdm9sdGFnZSBzY2FsaW5nIGZhY3RvcnMgZnJvbSAiCiAJCQkJIkJJT1MgRE1JIHRhYmxlLCB1c2luZyBidWlsdGluIGRlZmF1bHRzXG4iKTsKIAkJCWRtaV92cmVmID0gMzM7CiAJCX0KIAl9CiAKKwkvKiBSZWFkIGluIHNvbWUgbmV2ZXIgY2hhbmdpbmcgcmVnaXN0ZXJzICovCisJZGF0YS0+cmV2aXNpb24gPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBGU0NITURfUkVHX1JFVklTSU9OKTsKKwlkYXRhLT5nbG9iYWxfY29udHJvbCA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsCisJCQkJCUZTQ0hNRF9SRUdfQ09OVFJPTCk7CisJZGF0YS0+d2F0Y2hkb2dfY29udHJvbCA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsCisJCQkJCUZTQ0hNRF9SRUdfV0RPR19DT05UUk9MKTsKKwlkYXRhLT53YXRjaGRvZ19zdGF0ZSA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsCisJCQkJCUZTQ0hNRF9SRUdfV0RPR19TVEFURSk7CisJZGF0YS0+d2F0Y2hkb2dfcHJlc2V0ID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwKKwkJCQkJRlNDSE1EX1JFR19XRE9HX1BSRVNFVCk7CisKIAkvKiBpMmMga2luZCBnb2VzIGZyb20gMS01LCB3ZSB3YW50IGZyb20gMC00IHRvIGFkZHJlc3MgYXJyYXlzICovCiAJZGF0YS0+a2luZCA9IGtpbmQgLSAxOwogCkBAIC03MzUsOSArMTA1Myw0MyBAQAogCQlnb3RvIGV4aXRfZGV0YWNoOwogCX0KIAotCXJldmlzaW9uID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgRlNDSE1EX1JFR19SRVZJU0lPTik7Ci0JcHJpbnRrKEtFUk5fSU5GTyBGU0NITURfTkFNRSAiOiBEZXRlY3RlZCBGU0MgJXMgY2hpcCwgcmV2aXNpb246ICVkXG4iLAotCQluYW1lc1tkYXRhLT5raW5kXSwgKGludCkgcmV2aXNpb24pOworCS8qIFdlIHRha2UgdGhlIGRhdGFfbXV0ZXggbG9jayBlYXJseSBzbyB0aGF0IHdhdGNoZG9nX29wZW4oKSBjYW5ub3QKKwkgICBydW4gd2hlbiBtaXNjX3JlZ2lzdGVyKCkgaGFzIGNvbXBsZXRlZCwgYnV0IHdlJ3ZlIG5vdCB5ZXQgYWRkZWQKKwkgICBvdXIgZGF0YSB0byB0aGUgd2F0Y2hkb2dfZGF0YV9saXN0IChhbmQgc2V0IHRoZSBkZWZhdWx0IHRpbWVvdXQpICovCisJbXV0ZXhfbG9jaygmd2F0Y2hkb2dfZGF0YV9tdXRleCk7CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUod2F0Y2hkb2dfbWlub3JzKTsgaSsrKSB7CisJCS8qIFJlZ2lzdGVyIG91ciB3YXRjaGRvZyBwYXJ0ICovCisJCXNucHJpbnRmKGRhdGEtPndhdGNoZG9nX25hbWUsIHNpemVvZihkYXRhLT53YXRjaGRvZ19uYW1lKSwKKwkJCSJ3YXRjaGRvZyVjIiwgKGkgPT0gMCkgPyAnXDAnIDogKCcwJyArIGkpKTsKKwkJZGF0YS0+d2F0Y2hkb2dfbWlzY2Rldi5uYW1lID0gZGF0YS0+d2F0Y2hkb2dfbmFtZTsKKwkJZGF0YS0+d2F0Y2hkb2dfbWlzY2Rldi5mb3BzID0gJndhdGNoZG9nX2ZvcHM7CisJCWRhdGEtPndhdGNoZG9nX21pc2NkZXYubWlub3IgPSB3YXRjaGRvZ19taW5vcnNbaV07CisJCWVyciA9IG1pc2NfcmVnaXN0ZXIoJmRhdGEtPndhdGNoZG9nX21pc2NkZXYpOworCQlpZiAoZXJyID09IC1FQlVTWSkKKwkJCWNvbnRpbnVlOworCQlpZiAoZXJyKSB7CisJCQlkYXRhLT53YXRjaGRvZ19taXNjZGV2Lm1pbm9yID0gMDsKKwkJCWRldl9lcnIoJmNsaWVudC0+ZGV2LAorCQkJCSJSZWdpc3RlcmluZyB3YXRjaGRvZyBjaGFyZGV2OiAlZFxuIiwgZXJyKTsKKwkJCWJyZWFrOworCQl9CisKKwkJbGlzdF9hZGQoJmRhdGEtPmxpc3QsICZ3YXRjaGRvZ19kYXRhX2xpc3QpOworCQl3YXRjaGRvZ19zZXRfdGltZW91dChkYXRhLCA2MCk7CisJCWRldl9pbmZvKCZjbGllbnQtPmRldiwKKwkJCSJSZWdpc3RlcmVkIHdhdGNoZG9nIGNoYXJkZXYgbWFqb3IgMTAsIG1pbm9yOiAlZFxuIiwKKwkJCXdhdGNoZG9nX21pbm9yc1tpXSk7CisJCWJyZWFrOworCX0KKwlpZiAoaSA9PSBBUlJBWV9TSVpFKHdhdGNoZG9nX21pbm9ycykpIHsKKwkJZGF0YS0+d2F0Y2hkb2dfbWlzY2Rldi5taW5vciA9IDA7CisJCWRldl93YXJuKCZjbGllbnQtPmRldiwgIkNvdWxkbid0IHJlZ2lzdGVyIHdhdGNoZG9nIGNoYXJkZXYgIgorCQkJIihkdWUgdG8gbm8gZnJlZSBtaW5vcilcbiIpOworCX0KKwltdXRleF91bmxvY2soJndhdGNoZG9nX2RhdGFfbXV0ZXgpOworCisJZGV2X2luZm8oJmNsaWVudC0+ZGV2LCAiRGV0ZWN0ZWQgRlNDICVzIGNoaXAsIHJldmlzaW9uOiAlZFxuIiwKKwkJbmFtZXNbZGF0YS0+a2luZF0sIChpbnQpIGRhdGEtPnJldmlzaW9uKTsKIAogCXJldHVybiAwOwogCkBAIC03NTEsNiArMTEwMywyNCBAQAogCXN0cnVjdCBmc2NobWRfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwogCWludCBpOwogCisJLyogVW5yZWdpc3RlciB0aGUgd2F0Y2hkb2cgKGlmIHJlZ2lzdGVyZWQpICovCisJaWYgKGRhdGEtPndhdGNoZG9nX21pc2NkZXYubWlub3IpIHsKKwkJbWlzY19kZXJlZ2lzdGVyKCZkYXRhLT53YXRjaGRvZ19taXNjZGV2KTsKKwkJaWYgKGRhdGEtPndhdGNoZG9nX2lzX29wZW4pIHsKKwkJCWRldl93YXJuKCZjbGllbnQtPmRldiwKKwkJCQkiaTJjIGNsaWVudCBkZXRhY2hlZCB3aXRoIHdhdGNoZG9nIG9wZW4hICIKKwkJCQkiU3RvcHBpbmcgd2F0Y2hkb2cuXG4iKTsKKwkJCXdhdGNoZG9nX3N0b3AoZGF0YSk7CisJCX0KKwkJbXV0ZXhfbG9jaygmd2F0Y2hkb2dfZGF0YV9tdXRleCk7CisJCWxpc3RfZGVsKCZkYXRhLT5saXN0KTsKKwkJbXV0ZXhfdW5sb2NrKCZ3YXRjaGRvZ19kYXRhX211dGV4KTsKKwkJLyogVGVsbCB0aGUgd2F0Y2hkb2cgY29kZSB0aGUgY2xpZW50IGlzIGdvbmUgKi8KKwkJbXV0ZXhfbG9jaygmZGF0YS0+d2F0Y2hkb2dfbG9jayk7CisJCWRhdGEtPmNsaWVudCA9IE5VTEw7CisJCW11dGV4X3VubG9jaygmZGF0YS0+d2F0Y2hkb2dfbG9jayk7CisJfQorCiAJLyogQ2hlY2sgaWYgcmVnaXN0ZXJlZCBpbiBjYXNlIHdlJ3JlIGNhbGxlZCBmcm9tIGZzY2htZF9kZXRlY3QKIAkgICB0byBjbGVhbnVwIGFmdGVyIGFuIGVycm9yICovCiAJaWYgKGRhdGEtPmh3bW9uX2RldikKQEAgLTc2NSw3ICsxMTM1LDEwIEBACiAJCWRldmljZV9yZW1vdmVfZmlsZSgmY2xpZW50LT5kZXYsCiAJCQkJCSZmc2NobWRfZmFuX2F0dHJbaV0uZGV2X2F0dHIpOwogCi0Ja2ZyZWUoZGF0YSk7CisJbXV0ZXhfbG9jaygmd2F0Y2hkb2dfZGF0YV9tdXRleCk7CisJa3JlZl9wdXQoJmRhdGEtPmtyZWYsIGZzY2htZF9yZWxlYXNlX3Jlc291cmNlcyk7CisJbXV0ZXhfdW5sb2NrKCZ3YXRjaGRvZ19kYXRhX211dGV4KTsKKwogCXJldHVybiAwOwogfQogCkBAIC03OTgsNyArMTE3MSw3IEBACiAJCQkJCWRhdGEtPnRlbXBfYWN0W2ldIDwgZGF0YS0+dGVtcF9tYXhbaV0pCiAJCQkJaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsCiAJCQkJCUZTQ0hNRF9SRUdfVEVNUF9TVEFURVtkYXRhLT5raW5kXVtpXSwKLQkJCQkJRlNDSE1EX1RFTVBfQUxFUlRfTUFTSyk7CisJCQkJCUZTQ0hNRF9URU1QX0FMRVJUKTsKIAkJfQogCiAJCWZvciAoaSA9IDA7IGkgPCBGU0NITURfTk9fRkFOX1NFTlNPUlNbZGF0YS0+a2luZF07IGkrKykgewpAQCAtODE2LDI4ICsxMTg5LDE3IEBACiAJCQkJCUZTQ0hNRF9SRUdfRkFOX01JTltkYXRhLT5raW5kXVtpXSk7CiAKIAkJCS8qIHJlc2V0IGZhbiBzdGF0dXMgaWYgc3BlZWQgaXMgYmFjayB0byA+IDAgKi8KLQkJCWlmICgoZGF0YS0+ZmFuX3N0YXR1c1tpXSAmIEZTQ0hNRF9GQU5fQUxBUk1fTUFTSykgJiYKKwkJCWlmICgoZGF0YS0+ZmFuX3N0YXR1c1tpXSAmIEZTQ0hNRF9GQU5fQUxBUk0pICYmCiAJCQkJCWRhdGEtPmZhbl9hY3RbaV0pCiAJCQkJaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsCiAJCQkJCUZTQ0hNRF9SRUdfRkFOX1NUQVRFW2RhdGEtPmtpbmRdW2ldLAotCQkJCQlGU0NITURfRkFOX0FMQVJNX01BU0spOworCQkJCQlGU0NITURfRkFOX0FMQVJNKTsKIAkJfQogCiAJCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspCiAJCQlkYXRhLT52b2x0W2ldID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwKIAkJCQkJCUZTQ0hNRF9SRUdfVk9MVFtpXSk7CiAKLQkJZGF0YS0+Z2xvYmFsX2NvbnRyb2wgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LAotCQkJCQkJRlNDSE1EX1JFR19DT05UUk9MKTsKLQotCQkvKiBUbyBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgZnV0dXJlCi0JCWRhdGEtPndhdGNoZG9nWzBdID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwKLQkJCQkJCUZTQ0hNRF9SRUdfV0RPR19QUkVTRVQpOwotCQlkYXRhLT53YXRjaGRvZ1sxXSA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsCi0JCQkJCQlGU0NITURfUkVHX1dET0dfU1RBVEUpOwotCQlkYXRhLT53YXRjaGRvZ1syXSA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsCi0JCQkJCQlGU0NITURfUkVHX1dET0dfQ09OVFJPTCk7ICovCi0KIAkJZGF0YS0+bGFzdF91cGRhdGVkID0gamlmZmllczsKIAkJZGF0YS0+dmFsaWQgPSAxOwogCX0KQEAgLTg1Nyw3ICsxMjE5LDcgQEAKIAlpMmNfZGVsX2RyaXZlcigmZnNjaG1kX2RyaXZlcik7CiB9CiAKLU1PRFVMRV9BVVRIT1IoIkhhbnMgZGUgR29lZGUgPGoudy5yLmRlZ29lZGVAaGhzLm5sPiIpOworTU9EVUxFX0FVVEhPUigiSGFucyBkZSBHb2VkZSA8aGRlZ29lZGVAcmVkaGF0LmNvbT4iKTsKIE1PRFVMRV9ERVNDUklQVElPTigiRlNDIFBvc2VpZG9uLCBIZXJtZXMsIFNjeWxsYSwgSGVyYWNsZXMgYW5kICIKIAkJCSJIZWltZGFsbCBkcml2ZXIiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vaHBfYWNjZWwuYyBiL2RyaXZlcnMvaHdtb24vaHBfYWNjZWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzcwNTI0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9od21vbi9ocF9hY2NlbC5jCkBAIC0wLDAgKzEsMzM0IEBACisvKgorICogIGhwX2FjY2VsLmMgLSBJbnRlcmZhY2UgYmV0d2VlbiBMSVMzTFYwMkRMIGRyaXZlciBhbmQgSFAgQUNQSSBCSU9TCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IFlhbiBCdXJtYW4KKyAqICBDb3B5cmlnaHQgKEMpIDIwMDggRXJpYyBQaWVsCisgKiAgQ29weXJpZ2h0IChDKSAyMDA4LTIwMDkgUGF2ZWwgTWFjaGVrCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWkuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CisjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NlbWFwaG9yZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvd2FpdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9mcmVlemVyLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9sZWRzLmg+CisjaW5jbHVkZSA8YWNwaS9hY3BpX2RyaXZlcnMuaD4KKyNpbmNsdWRlIDxhc20vYXRvbWljLmg+CisjaW5jbHVkZSAibGlzM2x2MDJkLmgiCisKKyNkZWZpbmUgRFJJVkVSX05BTUUgICAgICJsaXMzbHYwMmQiCisjZGVmaW5lIEFDUElfTURQU19DTEFTUyAiYWNjZWxlcm9tZXRlciIKKworLyogRGVsYXllZCBMRURzIGluZnJhc3RydWN0dXJlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiBTcGVjaWFsIExFRCBjbGFzcyB0aGF0IGNhbiBkZWZlciB3b3JrICovCitzdHJ1Y3QgZGVsYXllZF9sZWRfY2xhc3NkZXYgeworCXN0cnVjdCBsZWRfY2xhc3NkZXYgbGVkX2NsYXNzZGV2OworCXN0cnVjdCB3b3JrX3N0cnVjdCB3b3JrOworCWVudW0gbGVkX2JyaWdodG5lc3MgbmV3X2JyaWdodG5lc3M7CisKKwl1bnNpZ25lZCBpbnQgbGVkOwkJLyogRm9yIGRyaXZlciAqLworCXZvaWQgKCpzZXRfYnJpZ2h0bmVzcykoc3RydWN0IGRlbGF5ZWRfbGVkX2NsYXNzZGV2ICpkYXRhLCBlbnVtIGxlZF9icmlnaHRuZXNzIHZhbHVlKTsKK307CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkZWxheWVkX3NldF9zdGF0dXNfd29ya2VyKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgZGVsYXllZF9sZWRfY2xhc3NkZXYgKmRhdGEgPQorCQkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBkZWxheWVkX2xlZF9jbGFzc2Rldiwgd29yayk7CisKKwlkYXRhLT5zZXRfYnJpZ2h0bmVzcyhkYXRhLCBkYXRhLT5uZXdfYnJpZ2h0bmVzcyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkZWxheWVkX3N5c2ZzX3NldChzdHJ1Y3QgbGVkX2NsYXNzZGV2ICpsZWRfY2RldiwKKwkJCSAgICAgIGVudW0gbGVkX2JyaWdodG5lc3MgYnJpZ2h0bmVzcykKK3sKKwlzdHJ1Y3QgZGVsYXllZF9sZWRfY2xhc3NkZXYgKmRhdGEgPSBjb250YWluZXJfb2YobGVkX2NkZXYsCisJCQkgICAgIHN0cnVjdCBkZWxheWVkX2xlZF9jbGFzc2RldiwgbGVkX2NsYXNzZGV2KTsKKwlkYXRhLT5uZXdfYnJpZ2h0bmVzcyA9IGJyaWdodG5lc3M7CisJc2NoZWR1bGVfd29yaygmZGF0YS0+d29yayk7Cit9CisKKy8qIEhQLXNwZWNpZmljIGFjY2VsZXJvbWV0ZXIgZHJpdmVyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiBGb3IgYXV0b21hdGljIGluc2VydGlvbiBvZiB0aGUgbW9kdWxlICovCitzdGF0aWMgc3RydWN0IGFjcGlfZGV2aWNlX2lkIGxpczNsdjAyZF9kZXZpY2VfaWRzW10gPSB7CisJeyJIUFEwMDA0IiwgMH0sIC8qIEhQIE1vYmlsZSBEYXRhIFByb3RlY3Rpb24gU3lzdGVtIFBOUCAqLworCXsiIiwgMH0sCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShhY3BpLCBsaXMzbHYwMmRfZGV2aWNlX2lkcyk7CisKKworLyoqCisgKiBsaXMzbHYwMmRfYWNwaV9pbml0IC0gQUNQSSBfSU5JIG1ldGhvZDogaW5pdGlhbGl6ZSB0aGUgZGV2aWNlLgorICogQGhhbmRsZTogdGhlIGhhbmRsZSBvZiB0aGUgZGV2aWNlCisgKgorICogUmV0dXJucyBBRV9PSyBvbiBzdWNjZXNzLgorICovCithY3BpX3N0YXR1cyBsaXMzbHYwMmRfYWNwaV9pbml0KGFjcGlfaGFuZGxlIGhhbmRsZSkKK3sKKwlyZXR1cm4gYWNwaV9ldmFsdWF0ZV9vYmplY3QoaGFuZGxlLCBNRVRIT0RfTkFNRV9fSU5JLCBOVUxMLCBOVUxMKTsKK30KKworLyoqCisgKiBsaXMzbHYwMmRfYWNwaV9yZWFkIC0gQUNQSSBBTFJEIG1ldGhvZDogcmVhZCBhIHJlZ2lzdGVyCisgKiBAaGFuZGxlOiB0aGUgaGFuZGxlIG9mIHRoZSBkZXZpY2UKKyAqIEByZWc6ICAgIHRoZSByZWdpc3RlciB0byByZWFkCisgKiBAcmV0OiAgICByZXN1bHQgb2YgdGhlIG9wZXJhdGlvbgorICoKKyAqIFJldHVybnMgQUVfT0sgb24gc3VjY2Vzcy4KKyAqLworYWNwaV9zdGF0dXMgbGlzM2x2MDJkX2FjcGlfcmVhZChhY3BpX2hhbmRsZSBoYW5kbGUsIGludCByZWcsIHU4ICpyZXQpCit7CisJdW5pb24gYWNwaV9vYmplY3QgYXJnMCA9IHsgQUNQSV9UWVBFX0lOVEVHRVIgfTsKKwlzdHJ1Y3QgYWNwaV9vYmplY3RfbGlzdCBhcmdzID0geyAxLCAmYXJnMCB9OworCXVuc2lnbmVkIGxvbmcgbG9uZyBscmV0OworCWFjcGlfc3RhdHVzIHN0YXR1czsKKworCWFyZzAuaW50ZWdlci52YWx1ZSA9IHJlZzsKKworCXN0YXR1cyA9IGFjcGlfZXZhbHVhdGVfaW50ZWdlcihoYW5kbGUsICJBTFJEIiwgJmFyZ3MsICZscmV0KTsKKwkqcmV0ID0gbHJldDsKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAqIGxpczNsdjAyZF9hY3BpX3dyaXRlIC0gQUNQSSBBTFdSIG1ldGhvZDogd3JpdGUgdG8gYSByZWdpc3RlcgorICogQGhhbmRsZTogdGhlIGhhbmRsZSBvZiB0aGUgZGV2aWNlCisgKiBAcmVnOiAgICB0aGUgcmVnaXN0ZXIgdG8gd3JpdGUgdG8KKyAqIEB2YWw6ICAgIHRoZSB2YWx1ZSB0byB3cml0ZQorICoKKyAqIFJldHVybnMgQUVfT0sgb24gc3VjY2Vzcy4KKyAqLworYWNwaV9zdGF0dXMgbGlzM2x2MDJkX2FjcGlfd3JpdGUoYWNwaV9oYW5kbGUgaGFuZGxlLCBpbnQgcmVnLCB1OCB2YWwpCit7CisJdW5zaWduZWQgbG9uZyBsb25nIHJldDsgLyogTm90IHVzZWQgd2hlbiB3cml0dGluZyAqLworCXVuaW9uIGFjcGlfb2JqZWN0IGluX29ialsyXTsKKwlzdHJ1Y3QgYWNwaV9vYmplY3RfbGlzdCBhcmdzID0geyAyLCBpbl9vYmogfTsKKworCWluX29ialswXS50eXBlICAgICAgICAgID0gQUNQSV9UWVBFX0lOVEVHRVI7CisJaW5fb2JqWzBdLmludGVnZXIudmFsdWUgPSByZWc7CisJaW5fb2JqWzFdLnR5cGUgICAgICAgICAgPSBBQ1BJX1RZUEVfSU5URUdFUjsKKwlpbl9vYmpbMV0uaW50ZWdlci52YWx1ZSA9IHZhbDsKKworCXJldHVybiBhY3BpX2V2YWx1YXRlX2ludGVnZXIoaGFuZGxlLCAiQUxXUiIsICZhcmdzLCAmcmV0KTsKK30KKworc3RhdGljIGludCBsaXMzbHYwMmRfZG1pX21hdGNoZWQoY29uc3Qgc3RydWN0IGRtaV9zeXN0ZW1faWQgKmRtaSkKK3sKKwlhZGV2LmFjID0gKigoc3RydWN0IGF4aXNfY29udmVyc2lvbiAqKWRtaS0+ZHJpdmVyX2RhdGEpOworCXByaW50ayhLRVJOX0lORk8gRFJJVkVSX05BTUUgIjogaGFyZHdhcmUgdHlwZSAlcyBmb3VuZC5cbiIsIGRtaS0+aWRlbnQpOworCisJcmV0dXJuIDE7Cit9CisKKy8qIFJlcHJlc2VudHMsIGZvciBlYWNoIGF4aXMgc2VlbiBieSB1c2Vyc3BhY2UsIHRoZSBjb3JyZXNwb25kaW5nIGh3IGF4aXMgKCsxKS4KKyAqIElmIHRoZSB2YWx1ZSBpcyBuZWdhdGl2ZSwgdGhlIG9wcG9zaXRlIG9mIHRoZSBodyB2YWx1ZSBpcyB1c2VkLiAqLworc3RhdGljIHN0cnVjdCBheGlzX2NvbnZlcnNpb24gbGlzM2x2MDJkX2F4aXNfbm9ybWFsID0gezEsIDIsIDN9Oworc3RhdGljIHN0cnVjdCBheGlzX2NvbnZlcnNpb24gbGlzM2x2MDJkX2F4aXNfeV9pbnZlcnRlZCA9IHsxLCAtMiwgM307CitzdGF0aWMgc3RydWN0IGF4aXNfY29udmVyc2lvbiBsaXMzbHYwMmRfYXhpc194X2ludmVydGVkID0gey0xLCAyLCAzfTsKK3N0YXRpYyBzdHJ1Y3QgYXhpc19jb252ZXJzaW9uIGxpczNsdjAyZF9heGlzX3pfaW52ZXJ0ZWQgPSB7MSwgMiwgLTN9Oworc3RhdGljIHN0cnVjdCBheGlzX2NvbnZlcnNpb24gbGlzM2x2MDJkX2F4aXNfeHlfcm90YXRlZF9sZWZ0ID0gey0yLCAxLCAzfTsKK3N0YXRpYyBzdHJ1Y3QgYXhpc19jb252ZXJzaW9uIGxpczNsdjAyZF9heGlzX3h5X3N3YXBfaW52ZXJ0ZWQgPSB7LTIsIC0xLCAzfTsKKworI2RlZmluZSBBWElTX0RNSV9NQVRDSChfaWRlbnQsIF9uYW1lLCBfYXhpcykgewkJXAorCS5pZGVudCA9IF9pZGVudCwJCQkJXAorCS5jYWxsYmFjayA9IGxpczNsdjAyZF9kbWlfbWF0Y2hlZCwJCVwKKwkubWF0Y2hlcyA9IHsJCQkJCVwKKwkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsIF9uYW1lKQlcCisJfSwJCQkJCQlcCisJLmRyaXZlcl9kYXRhID0gJmxpczNsdjAyZF9heGlzXyMjX2F4aXMJCVwKK30KK3N0YXRpYyBzdHJ1Y3QgZG1pX3N5c3RlbV9pZCBsaXMzbHYwMmRfZG1pX2lkc1tdID0geworCS8qIHByb2R1Y3QgbmFtZXMgYXJlIHRydW5jYXRlZCB0byBtYXRjaCBhbGwga2luZHMgb2YgYSBzYW1lIG1vZGVsICovCisJQVhJU19ETUlfTUFUQ0goIk5DNjR4MCIsICJIUCBDb21wYXEgbmM2NCIsIHhfaW52ZXJ0ZWQpLAorCUFYSVNfRE1JX01BVENIKCJOQzg0eDAiLCAiSFAgQ29tcGFxIG5jODQiLCB6X2ludmVydGVkKSwKKwlBWElTX0RNSV9NQVRDSCgiTlg5NDIwIiwgIkhQIENvbXBhcSBueDk0MjAiLCB4X2ludmVydGVkKSwKKwlBWElTX0RNSV9NQVRDSCgiTlc5NDQwIiwgIkhQIENvbXBhcSBudzk0NDAiLCB4X2ludmVydGVkKSwKKwlBWElTX0RNSV9NQVRDSCgiTkMyNTEwIiwgIkhQIENvbXBhcSAyNTEwIiwgeV9pbnZlcnRlZCksCisJQVhJU19ETUlfTUFUQ0goIk5DODUxMCIsICJIUCBDb21wYXEgODUxMCIsIHh5X3N3YXBfaW52ZXJ0ZWQpLAorCUFYSVNfRE1JX01BVENIKCJIUDIxMzMiLCAiSFAgMjEzMyIsIHh5X3JvdGF0ZWRfbGVmdCksCisJeyBOVUxMLCB9CisvKiBMYXB0b3AgbW9kZWxzIHdpdGhvdXQgYXhpcyBpbmZvICh5ZXQpOgorICogIk5DNjUxeHgiICJIUCBDb21wYXEgNjUxIgorICogIk5DNjcxeHgiICJIUCBDb21wYXEgNjcxIgorICogIk5DNjkxMCIgIkhQIENvbXBhcSA2OTEwIgorICogSFAgQ29tcGFxIDg3MTB4IE5vdGVib29rIFBDIC8gTW9iaWxlIFdvcmtzdGF0aW9uCisgKiAiTkMyNDAwIiAiSFAgQ29tcGFxIG5jMjQwMCIKKyAqICJOWDc0eDAiICJIUCBDb21wYXEgbng3NCIKKyAqICJOWDYzMjUiICJIUCBDb21wYXEgbng2MzI1IgorICogIk5DNDQwMCIgIkhQIENvbXBhcSBuYzQ0MDAiCisgKi8KK307CisKK3N0YXRpYyB2b2lkIGhwbGVkX3NldChzdHJ1Y3QgZGVsYXllZF9sZWRfY2xhc3NkZXYgKmxlZF9jZGV2LCBlbnVtIGxlZF9icmlnaHRuZXNzIHZhbHVlKQoreworCWFjcGlfaGFuZGxlIGhhbmRsZSA9IGFkZXYuZGV2aWNlLT5oYW5kbGU7CisJdW5zaWduZWQgbG9uZyBsb25nIHJldDsgLyogTm90IHVzZWQgd2hlbiB3cml0aW5nICovCisJdW5pb24gYWNwaV9vYmplY3QgaW5fb2JqWzFdOworCXN0cnVjdCBhY3BpX29iamVjdF9saXN0IGFyZ3MgPSB7IDEsIGluX29iaiB9OworCisJaW5fb2JqWzBdLnR5cGUgICAgICAgICAgPSBBQ1BJX1RZUEVfSU5URUdFUjsKKwlpbl9vYmpbMF0uaW50ZWdlci52YWx1ZSA9ICEhdmFsdWU7CisKKwlhY3BpX2V2YWx1YXRlX2ludGVnZXIoaGFuZGxlLCAiQUxFRCIsICZhcmdzLCAmcmV0KTsKK30KKworc3RhdGljIHN0cnVjdCBkZWxheWVkX2xlZF9jbGFzc2RldiBocGxlZF9sZWQgPSB7CisJLmxlZF9jbGFzc2RldiA9IHsKKwkJLm5hbWUJCQk9ICJocDo6aGRkcHJvdGVjdCIsCisJCS5kZWZhdWx0X3RyaWdnZXIJPSAibm9uZSIsCisJCS5icmlnaHRuZXNzX3NldAkJPSBkZWxheWVkX3N5c2ZzX3NldCwKKwkJLmZsYWdzICAgICAgICAgICAgICAgICAgPSBMRURfQ09SRV9TVVNQRU5EUkVTVU1FLAorCX0sCisJLnNldF9icmlnaHRuZXNzID0gaHBsZWRfc2V0LAorfTsKKworc3RhdGljIGludCBsaXMzbHYwMmRfYWRkKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKQoreworCXU4IHZhbDsKKwlpbnQgcmV0OworCisJaWYgKCFkZXZpY2UpCisJCXJldHVybiAtRUlOVkFMOworCisJYWRldi5kZXZpY2UgPSBkZXZpY2U7CisJYWRldi5pbml0ID0gbGlzM2x2MDJkX2FjcGlfaW5pdDsKKwlhZGV2LnJlYWQgPSBsaXMzbHYwMmRfYWNwaV9yZWFkOworCWFkZXYud3JpdGUgPSBsaXMzbHYwMmRfYWNwaV93cml0ZTsKKwlzdHJjcHkoYWNwaV9kZXZpY2VfbmFtZShkZXZpY2UpLCBEUklWRVJfTkFNRSk7CisJc3RyY3B5KGFjcGlfZGV2aWNlX2NsYXNzKGRldmljZSksIEFDUElfTURQU19DTEFTUyk7CisJZGV2aWNlLT5kcml2ZXJfZGF0YSA9ICZhZGV2OworCisJbGlzM2x2MDJkX2FjcGlfcmVhZChkZXZpY2UtPmhhbmRsZSwgV0hPX0FNX0ksICZ2YWwpOworCWlmICgodmFsICE9IExJUzNMVjAyRExfSUQpICYmICh2YWwgIT0gTElTMzAyRExfSUQpKSB7CisJCXByaW50ayhLRVJOX0VSUiBEUklWRVJfTkFNRQorCQkJCSI6IEFjY2VsZXJvbWV0ZXIgY2hpcCBub3QgTElTM0xWMDJEe0wsUX1cbiIpOworCX0KKworCS8qIElmIHBvc3NpYmxlIHVzZSBhICJzdGFuZGFyZCIgYXhlcyBvcmRlciAqLworCWlmIChkbWlfY2hlY2tfc3lzdGVtKGxpczNsdjAyZF9kbWlfaWRzKSA9PSAwKSB7CisJCXByaW50ayhLRVJOX0lORk8gRFJJVkVSX05BTUUgIjogbGFwdG9wIG1vZGVsIHVua25vd24sICIKKwkJCQkgInVzaW5nIGRlZmF1bHQgYXhlcyBjb25maWd1cmF0aW9uXG4iKTsKKwkJYWRldi5hYyA9IGxpczNsdjAyZF9heGlzX25vcm1hbDsKKwl9CisKKwlJTklUX1dPUksoJmhwbGVkX2xlZC53b3JrLCBkZWxheWVkX3NldF9zdGF0dXNfd29ya2VyKTsKKwlyZXQgPSBsZWRfY2xhc3NkZXZfcmVnaXN0ZXIoTlVMTCwgJmhwbGVkX2xlZC5sZWRfY2xhc3NkZXYpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBsaXMzbHYwMmRfaW5pdF9kZXZpY2UoJmFkZXYpOworCWlmIChyZXQpIHsKKwkJZmx1c2hfd29yaygmaHBsZWRfbGVkLndvcmspOworCQlsZWRfY2xhc3NkZXZfdW5yZWdpc3RlcigmaHBsZWRfbGVkLmxlZF9jbGFzc2Rldik7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBsaXMzbHYwMmRfcmVtb3ZlKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlLCBpbnQgdHlwZSkKK3sKKwlpZiAoIWRldmljZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlsaXMzbHYwMmRfam95c3RpY2tfZGlzYWJsZSgpOworCWxpczNsdjAyZF9wb3dlcm9mZihkZXZpY2UtPmhhbmRsZSk7CisKKwlmbHVzaF93b3JrKCZocGxlZF9sZWQud29yayk7CisJbGVkX2NsYXNzZGV2X3VucmVnaXN0ZXIoJmhwbGVkX2xlZC5sZWRfY2xhc3NkZXYpOworCisJcmV0dXJuIGxpczNsdjAyZF9yZW1vdmVfZnMoKTsKK30KKworCisjaWZkZWYgQ09ORklHX1BNCitzdGF0aWMgaW50IGxpczNsdjAyZF9zdXNwZW5kKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlLCBwbV9tZXNzYWdlX3Qgc3RhdGUpCit7CisJLyogbWFrZSBzdXJlIHRoZSBkZXZpY2UgaXMgb2ZmIHdoZW4gd2Ugc3VzcGVuZCAqLworCWxpczNsdjAyZF9wb3dlcm9mZihkZXZpY2UtPmhhbmRsZSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbGlzM2x2MDJkX3Jlc3VtZShzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSkKK3sKKwkvKiBwdXQgYmFjayB0aGUgZGV2aWNlIGluIHRoZSByaWdodCBzdGF0ZSAoQUNQSSBtaWdodCB0dXJuIGl0IG9uKSAqLworCW11dGV4X2xvY2soJmFkZXYubG9jayk7CisJaWYgKGFkZXYudXNhZ2UgPiAwKQorCQlsaXMzbHYwMmRfcG93ZXJvbihkZXZpY2UtPmhhbmRsZSk7CisJZWxzZQorCQlsaXMzbHYwMmRfcG93ZXJvZmYoZGV2aWNlLT5oYW5kbGUpOworCW11dGV4X3VubG9jaygmYWRldi5sb2NrKTsKKwlyZXR1cm4gMDsKK30KKyNlbHNlCisjZGVmaW5lIGxpczNsdjAyZF9zdXNwZW5kIE5VTEwKKyNkZWZpbmUgbGlzM2x2MDJkX3Jlc3VtZSBOVUxMCisjZW5kaWYKKworLyogRm9yIHRoZSBIUCBNRFBTIGFrYSAzRCBEcml2ZWd1YXJkICovCitzdGF0aWMgc3RydWN0IGFjcGlfZHJpdmVyIGxpczNsdjAyZF9kcml2ZXIgPSB7CisJLm5hbWUgID0gRFJJVkVSX05BTUUsCisJLmNsYXNzID0gQUNQSV9NRFBTX0NMQVNTLAorCS5pZHMgICA9IGxpczNsdjAyZF9kZXZpY2VfaWRzLAorCS5vcHMgPSB7CisJCS5hZGQgICAgID0gbGlzM2x2MDJkX2FkZCwKKwkJLnJlbW92ZSAgPSBsaXMzbHYwMmRfcmVtb3ZlLAorCQkuc3VzcGVuZCA9IGxpczNsdjAyZF9zdXNwZW5kLAorCQkucmVzdW1lICA9IGxpczNsdjAyZF9yZXN1bWUsCisJfQorfTsKKworc3RhdGljIGludCBfX2luaXQgbGlzM2x2MDJkX2luaXRfbW9kdWxlKHZvaWQpCit7CisJaW50IHJldDsKKworCWlmIChhY3BpX2Rpc2FibGVkKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXJldCA9IGFjcGlfYnVzX3JlZ2lzdGVyX2RyaXZlcigmbGlzM2x2MDJkX2RyaXZlcik7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlwcmludGsoS0VSTl9JTkZPIERSSVZFUl9OQU1FICIgZHJpdmVyIGxvYWRlZC5cbiIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBsaXMzbHYwMmRfZXhpdF9tb2R1bGUodm9pZCkKK3sKKwlhY3BpX2J1c191bnJlZ2lzdGVyX2RyaXZlcigmbGlzM2x2MDJkX2RyaXZlcik7Cit9CisKK01PRFVMRV9ERVNDUklQVElPTigiR2x1ZSBiZXR3ZWVuIExJUzNMVjAyRHggYW5kIEhQIEFDUEkgQklPUyBhbmQgc3VwcG9ydCBmb3IgZGlzayBwcm90ZWN0aW9uIExFRC4iKTsKK01PRFVMRV9BVVRIT1IoIllhbiBCdXJtYW4sIEVyaWMgUGllbCwgUGF2ZWwgTWFjaGVrIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK21vZHVsZV9pbml0KGxpczNsdjAyZF9pbml0X21vZHVsZSk7Cittb2R1bGVfZXhpdChsaXMzbHYwMmRfZXhpdF9tb2R1bGUpOworCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2k1a19hbWIuYyBiL2RyaXZlcnMvaHdtb24vaTVrX2FtYi5jCmluZGV4IDJlZGU5MzguLjI3ZDdmNzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vaTVrX2FtYi5jCisrKyBiL2RyaXZlcnMvaHdtb24vaTVrX2FtYi5jCkBAIC00OTAsNiArNDkwLDEzIEBACiAJMAogfTsKIAorc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIGk1a19hbWJfaWRzW10gX19kZXZpbml0ZGF0YSA9IHsKKwl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9JTlRFTCwgUENJX0RFVklDRV9JRF9JTlRFTF81MDAwX0VSUikgfSwKKwl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9JTlRFTCwgUENJX0RFVklDRV9JRF9JTlRFTF81NDAwX0VSUikgfSwKKwl7IDAsIH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgaTVrX2FtYl9pZHMpOworCiBzdGF0aWMgaW50IF9fZGV2aW5pdCBpNWtfYW1iX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJc3RydWN0IGk1a19hbWJfZGF0YSAqZGF0YTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vaXQ4Ny5jIGIvZHJpdmVycy9od21vbi9pdDg3LmMKaW5kZXggYjc0Yzk1Ny4uOTVhOTljNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9pdDg3LmMKKysrIGIvZHJpdmVycy9od21vbi9pdDg3LmMKQEAgLTE0LDYgKzE0LDcgQEAKICAgICAgICAgICAgICAgSVQ4NzEyRiAgU3VwZXIgSS9PIGNoaXAgdy9MUEMgaW50ZXJmYWNlCiAgICAgICAgICAgICAgIElUODcxNkYgIFN1cGVyIEkvTyBjaGlwIHcvTFBDIGludGVyZmFjZQogICAgICAgICAgICAgICBJVDg3MThGICBTdXBlciBJL08gY2hpcCB3L0xQQyBpbnRlcmZhY2UKKyAgICAgICAgICAgICAgSVQ4NzIwRiAgU3VwZXIgSS9PIGNoaXAgdy9MUEMgaW50ZXJmYWNlCiAgICAgICAgICAgICAgIElUODcyNkYgIFN1cGVyIEkvTyBjaGlwIHcvTFBDIGludGVyZmFjZQogICAgICAgICAgICAgICBTaXM5NTAgICBBIGNsb25lIG9mIHRoZSBJVDg3MDVGCiAKQEAgLTQ4LDExICs0OSwxMiBAQAogI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvZG1pLmg+CisjaW5jbHVkZSA8bGludXgvYWNwaS5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogCiAjZGVmaW5lIERSVk5BTUUgIml0ODciCiAKLWVudW0gY2hpcHMgeyBpdDg3LCBpdDg3MTIsIGl0ODcxNiwgaXQ4NzE4IH07CitlbnVtIGNoaXBzIHsgaXQ4NywgaXQ4NzEyLCBpdDg3MTYsIGl0ODcxOCwgaXQ4NzIwIH07CiAKIHN0YXRpYyB1bnNpZ25lZCBzaG9ydCBmb3JjZV9pZDsKIG1vZHVsZV9wYXJhbShmb3JjZV9pZCwgdXNob3J0LCAwKTsKQEAgLTY0LDcgKzY2LDEwIEBACiAjZGVmaW5lCURFVgkweDA3CS8qIFJlZ2lzdGVyOiBMb2dpY2FsIGRldmljZSBzZWxlY3QgKi8KICNkZWZpbmUJVkFMCTB4MmYJLyogVGhlIHZhbHVlIHRvIHJlYWQvd3JpdGUgKi8KICNkZWZpbmUgUE1FCTB4MDQJLyogVGhlIGRldmljZSB3aXRoIHRoZSBmYW4gcmVnaXN0ZXJzIGluIGl0ICovCi0jZGVmaW5lIEdQSU8JMHgwNwkvKiBUaGUgZGV2aWNlIHdpdGggdGhlIElUODcxOEYgVklEIHZhbHVlIGluIGl0ICovCisKKy8qIFRoZSBkZXZpY2Ugd2l0aCB0aGUgSVQ4NzE4Ri9JVDg3MjBGIFZJRCB2YWx1ZSBpbiBpdCAqLworI2RlZmluZSBHUElPCTB4MDcKKwogI2RlZmluZQlERVZJRAkweDIwCS8qIFJlZ2lzdGVyOiBEZXZpY2UgSUQgKi8KICNkZWZpbmUJREVWUkVWCTB4MjIJLyogUmVnaXN0ZXI6IERldmljZSBSZXZpc2lvbiAqLwogCkBAIC0xMTMsNiArMTE4LDcgQEAKICNkZWZpbmUgSVQ4NzA1Rl9ERVZJRCAweDg3MDUKICNkZWZpbmUgSVQ4NzE2Rl9ERVZJRCAweDg3MTYKICNkZWZpbmUgSVQ4NzE4Rl9ERVZJRCAweDg3MTgKKyNkZWZpbmUgSVQ4NzIwRl9ERVZJRCAweDg3MjAKICNkZWZpbmUgSVQ4NzI2Rl9ERVZJRCAweDg3MjYKICNkZWZpbmUgSVQ4N19BQ1RfUkVHICAweDMwCiAjZGVmaW5lIElUODdfQkFTRV9SRUcgMHg2MApAQCAtMTUwLDggKzE1Niw4IEBACiAjZGVmaW5lIElUODdfUkVHX0FMQVJNMiAgICAgICAgMHgwMgogI2RlZmluZSBJVDg3X1JFR19BTEFSTTMgICAgICAgIDB4MDMKIAotLyogVGhlIElUODcxOEYgaGFzIHRoZSBWSUQgdmFsdWUgaW4gYSBkaWZmZXJlbnQgcmVnaXN0ZXIsIGluIFN1cGVyLUkvTwotICAgY29uZmlndXJhdGlvbiBzcGFjZS4gKi8KKy8qIFRoZSBJVDg3MThGIGFuZCBJVDg3MjBGIGhhdmUgdGhlIFZJRCB2YWx1ZSBpbiBhIGRpZmZlcmVudCByZWdpc3RlciwgaW4KKyAgIFN1cGVyLUkvTyBjb25maWd1cmF0aW9uIHNwYWNlLiAqLwogI2RlZmluZSBJVDg3X1JFR19WSUQgICAgICAgICAgIDB4MGEKIC8qIFRoZSBJVDg3MDVGIGFuZCBJVDg3MTJGIGVhcmxpZXIgdGhhbiByZXZpc2lvbiAweDA4IHVzZSByZWdpc3RlciAweDBiCiAgICBmb3IgZmFuIGRpdmlzb3JzLiBMYXRlciBJVDg3MTJGIHJldmlzaW9ucyBtdXN0IHVzZSAxNi1iaXQgdGFjaG9tZXRlcgpAQCAtMjgyLDcgKzI4OCw4IEBACiAJcmV0dXJuIChkYXRhLT50eXBlID09IGl0ODcgJiYgZGF0YS0+cmV2aXNpb24gPj0gMHgwMykKIAkgICAgfHwgKGRhdGEtPnR5cGUgPT0gaXQ4NzEyICYmIGRhdGEtPnJldmlzaW9uID49IDB4MDgpCiAJICAgIHx8IGRhdGEtPnR5cGUgPT0gaXQ4NzE2Ci0JICAgIHx8IGRhdGEtPnR5cGUgPT0gaXQ4NzE4OworCSAgICB8fCBkYXRhLT50eXBlID09IGl0ODcxOAorCSAgICB8fCBkYXRhLT50eXBlID09IGl0ODcyMDsKIH0KIAogc3RhdGljIGludCBpdDg3X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpOwpAQCAtOTkyLDYgKzk5OSw5IEBACiAJY2FzZSBJVDg3MThGX0RFVklEOgogCQlzaW9fZGF0YS0+dHlwZSA9IGl0ODcxODsKIAkJYnJlYWs7CisJY2FzZSBJVDg3MjBGX0RFVklEOgorCQlzaW9fZGF0YS0+dHlwZSA9IGl0ODcyMDsKKwkJYnJlYWs7CiAJY2FzZSAweGZmZmY6CS8qIE5vIGRldmljZSBhdCBhbGwgKi8KIAkJZ290byBleGl0OwogCWRlZmF1bHQ6CkBAIC0xMDIyLDcgKzEwMzIsOCBAQAogCQlpbnQgcmVnOwogCiAJCXN1cGVyaW9fc2VsZWN0KEdQSU8pOwotCQlpZiAoY2hpcF90eXBlID09IGl0ODcxOCkKKwkJaWYgKChjaGlwX3R5cGUgPT0gaXQ4NzE4KSB8fAorCQkgICAgKGNoaXBfdHlwZSA9PSBpdDg3MjApKQogCQkJc2lvX2RhdGEtPnZpZF92YWx1ZSA9IHN1cGVyaW9faW5iKElUODdfU0lPX1ZJRF9SRUcpOwogCiAJCXJlZyA9IHN1cGVyaW9faW5iKElUODdfU0lPX1BJTlgyX1JFRyk7CkBAIC0xMDY4LDYgKzEwNzksNyBAQAogCQkiaXQ4NzEyIiwKIAkJIml0ODcxNiIsCiAJCSJpdDg3MTgiLAorCQkiaXQ4NzIwIiwKIAl9OwogCiAJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfSU8sIDApOwpAQCAtMTIyNiw3ICsxMjM4LDcgQEAKIAl9CiAKIAlpZiAoZGF0YS0+dHlwZSA9PSBpdDg3MTIgfHwgZGF0YS0+dHlwZSA9PSBpdDg3MTYKLQkgfHwgZGF0YS0+dHlwZSA9PSBpdDg3MTgpIHsKKwkgfHwgZGF0YS0+dHlwZSA9PSBpdDg3MTggfHwgZGF0YS0+dHlwZSA9PSBpdDg3MjApIHsKIAkJZGF0YS0+dnJtID0gdmlkX3doaWNoX3ZybSgpOwogCQkvKiBWSUQgcmVhZGluZyBmcm9tIFN1cGVyLUkvTyBjb25maWcgc3BhY2UgaWYgYXZhaWxhYmxlICovCiAJCWRhdGEtPnZpZCA9IHNpb19kYXRhLT52aWRfdmFsdWU7CkBAIC0xMzc0LDcgKzEzODYsNyBAQAogCQkJaXQ4N193cml0ZV92YWx1ZShkYXRhLCBJVDg3X1JFR19URU1QX0hJR0goaSksIDEyNyk7CiAJfQogCi0JLyogQ2hlY2sgaWYgdGVtcGVyYXR1cmUgY2hhbm5uZWxzIGFyZSByZXNldCBtYW51YWxseSBvciBieSBzb21lIHJlYXNvbiAqLworCS8qIENoZWNrIGlmIHRlbXBlcmF0dXJlIGNoYW5uZWxzIGFyZSByZXNldCBtYW51YWxseSBvciBieSBzb21lIHJlYXNvbiAqLwogCXRtcCA9IGl0ODdfcmVhZF92YWx1ZShkYXRhLCBJVDg3X1JFR19URU1QX0VOQUJMRSk7CiAJaWYgKCh0bXAgJiAweDNmKSA9PSAwKSB7CiAJCS8qIFRlbXAxLFRlbXAzPXRoZXJtaXN0b3I7IFRlbXAyPXRoZXJtYWwgZGlvZGUgKi8KQEAgLTE1MTMsNyArMTUyNSw4IEBACiAKIAkJZGF0YS0+c2Vuc29yID0gaXQ4N19yZWFkX3ZhbHVlKGRhdGEsIElUODdfUkVHX1RFTVBfRU5BQkxFKTsKIAkJLyogVGhlIDg3MDUgZG9lcyBub3QgaGF2ZSBWSUQgY2FwYWJpbGl0eS4KLQkJICAgVGhlIDg3MTggZG9lcyBub3QgdXNlIElUODdfUkVHX1ZJRCBmb3IgdGhlIHNhbWUgcHVycG9zZS4gKi8KKwkJICAgVGhlIDg3MTggYW5kIHRoZSA4NzIwIGRvbid0IHVzZSBJVDg3X1JFR19WSUQgZm9yIHRoZQorCQkgICBzYW1lIHB1cnBvc2UuICovCiAJCWlmIChkYXRhLT50eXBlID09IGl0ODcxMiB8fCBkYXRhLT50eXBlID09IGl0ODcxNikgewogCQkJZGF0YS0+dmlkID0gaXQ4N19yZWFkX3ZhbHVlKGRhdGEsIElUODdfUkVHX1ZJRCk7CiAJCQkvKiBUaGUgb2xkZXIgSVQ4NzEyRiByZXZpc2lvbnMgaGFkIG9ubHkgNSBWSUQgcGlucywKQEAgLTE1NDAsNiArMTU1MywxMCBAQAogCX07CiAJaW50IGVycjsKIAorCWVyciA9IGFjcGlfY2hlY2tfcmVzb3VyY2VfY29uZmxpY3QoJnJlcyk7CisJaWYgKGVycikKKwkJZ290byBleGl0OworCiAJcGRldiA9IHBsYXRmb3JtX2RldmljZV9hbGxvYyhEUlZOQU1FLCBhZGRyZXNzKTsKIAlpZiAoIXBkZXYpIHsKIAkJZXJyID0gLUVOT01FTTsKQEAgLTE2MDgsNyArMTYyNSw3IEBACiAKIE1PRFVMRV9BVVRIT1IoIkNocmlzIEdhdXRocm9uLCAiCiAJICAgICAgIkplYW4gRGVsdmFyZSA8a2hhbGlAbGludXgtZnIub3JnPiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJJVDg3MDVGLzg3MTJGLzg3MTZGLzg3MThGLzg3MjZGLCBTaVM5NTAgZHJpdmVyIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIklUODcwNUYvODcxMkYvODcxNkYvODcxOEYvODcyMEYvODcyNkYsIFNpUzk1MCBkcml2ZXIiKTsKIG1vZHVsZV9wYXJhbSh1cGRhdGVfdmJhdCwgYm9vbCwgMCk7CiBNT0RVTEVfUEFSTV9ERVNDKHVwZGF0ZV92YmF0LCAiVXBkYXRlIHZiYXQgaWYgc2V0IGVsc2UgcmV0dXJuIHBvd2VydXAgdmFsdWUiKTsKIG1vZHVsZV9wYXJhbShmaXhfcHdtX3BvbGFyaXR5LCBib29sLCAwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vazh0ZW1wLmMgYi9kcml2ZXJzL2h3bW9uL2s4dGVtcC5jCmluZGV4IGJkMmJkZTAuLjFmZTk5NTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vazh0ZW1wLmMKKysrIGIvZHJpdmVycy9od21vbi9rOHRlbXAuYwpAQCAtMzEsNiArMzEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2h3bW9uLXN5c2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CiAKICNkZWZpbmUgVEVNUF9GUk9NX1JFRyh2YWwpCSgoKCgodmFsKSA+PiAxNikgJiAweGZmKSAtIDQ5KSAqIDEwMDApCiAjZGVmaW5lIFJFR19URU1QCTB4ZTQKQEAgLTQ3LDYgKzQ4LDggQEAKIAkvKiByZWdpc3RlcnMgdmFsdWVzICovCiAJdTggc2Vuc29yc3A7CQkvKiBzZW5zb3IgcHJlc2VuY2UgYml0cyAtIFNFTF9DT1JFICYgU0VMX1BMQUNFICovCiAJdTMyIHRlbXBbMl1bMl07CQkvKiBjb3JlLCBwbGFjZSAqLworCXU4IHN3YXBfY29yZV9zZWxlY3Q7ICAgIC8qIG1lYW5pbmcgb2YgU0VMX0NPUkUgaXMgaW52ZXJ0ZWQgKi8KKwl1MzIgdGVtcF9vZmZzZXQ7CiB9OwogCiBzdGF0aWMgc3RydWN0IGs4dGVtcF9kYXRhICprOHRlbXBfdXBkYXRlX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYpCkBAIC0xMTQsMTAgKzExNywxNSBAQAogCSAgICB0b19zZW5zb3JfZGV2X2F0dHJfMihkZXZhdHRyKTsKIAlpbnQgY29yZSA9IGF0dHItPm5yOwogCWludCBwbGFjZSA9IGF0dHItPmluZGV4OworCWludCB0ZW1wOwogCXN0cnVjdCBrOHRlbXBfZGF0YSAqZGF0YSA9IGs4dGVtcF91cGRhdGVfZGV2aWNlKGRldik7CiAKLQlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwKLQkJICAgICAgIFRFTVBfRlJPTV9SRUcoZGF0YS0+dGVtcFtjb3JlXVtwbGFjZV0pKTsKKwlpZiAoZGF0YS0+c3dhcF9jb3JlX3NlbGVjdCkKKwkJY29yZSA9IGNvcmUgPyAwIDogMTsKKworCXRlbXAgPSBURU1QX0ZST01fUkVHKGRhdGEtPnRlbXBbY29yZV1bcGxhY2VdKSArIGRhdGEtPnRlbXBfb2Zmc2V0OworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHRlbXApOwogfQogCiAvKiBjb3JlLCBwbGFjZSAqLwpAQCAtMTQxLDIwICsxNDksNDkgQEAKIAlpbnQgZXJyOwogCXU4IHNjZmc7CiAJdTMyIHRlbXA7CisJdTggbW9kZWwsIHN0ZXBwaW5nOwogCXN0cnVjdCBrOHRlbXBfZGF0YSAqZGF0YTsKLQl1MzIgY3B1aWQgPSBjcHVpZF9lYXgoMSk7Ci0KLQkvKiB0aGlzIGZlYXR1cmUgc2hvdWxkIGJlIGF2YWlsYWJsZSBzaW5jZSBTSC1DMCBjb3JlICovCi0JaWYgKChjcHVpZCA9PSAweGY0MCkgfHwgKGNwdWlkID09IDB4ZjUwKSB8fCAoY3B1aWQgPT0gMHhmNTEpKSB7Ci0JCWVyciA9IC1FTk9ERVY7Ci0JCWdvdG8gZXhpdDsKLQl9CiAKIAlpZiAoIShkYXRhID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGs4dGVtcF9kYXRhKSwgR0ZQX0tFUk5FTCkpKSB7CiAJCWVyciA9IC1FTk9NRU07CiAJCWdvdG8gZXhpdDsKIAl9CiAKKwltb2RlbCA9IGJvb3RfY3B1X2RhdGEueDg2X21vZGVsOworCXN0ZXBwaW5nID0gYm9vdF9jcHVfZGF0YS54ODZfbWFzazsKKworCXN3aXRjaCAoYm9vdF9jcHVfZGF0YS54ODYpIHsKKwljYXNlIDB4ZjoKKwkJLyogZmVhdHVyZSBhdmFpbGFibGUgc2luY2UgU0gtQzAsIGV4Y2x1ZGUgb2xkZXIgcmV2aXNpb25zICovCisJCWlmICgoKG1vZGVsID09IDQpICYmIChzdGVwcGluZyA9PSAwKSkgfHwKKwkJICAgICgobW9kZWwgPT0gNSkgJiYgKHN0ZXBwaW5nIDw9IDEpKSkgeworCQkJZXJyID0gLUVOT0RFVjsKKwkJCWdvdG8gZXhpdF9mcmVlOworCQl9CisKKwkJLyoKKwkJICogQU1EIE5QVCBmYW1pbHkgMGZoLCBpLmUuIFJldkYgYW5kIFJldkc6CisJCSAqIG1lYW5pbmcgb2YgU0VMX0NPUkUgYml0IGlzIGludmVydGVkCisJCSAqLworCQlpZiAobW9kZWwgPj0gMHg0MCkgeworCQkJZGF0YS0+c3dhcF9jb3JlX3NlbGVjdCA9IDE7CisJCQlkZXZfd2FybigmcGRldi0+ZGV2LCAiVGVtcGVyYXR1cmUgcmVhZG91dHMgbWlnaHQgYmUgIgorCQkJCSAid3JvbmcgLSBjaGVjayBlcnJhdHVtICMxNDFcbiIpOworCQl9CisKKwkJaWYgKChtb2RlbCA+PSAweDY5KSAmJgorCQkgICAgIShtb2RlbCA9PSAweGMxIHx8IG1vZGVsID09IDB4NmMgfHwgbW9kZWwgPT0gMHg3YykpIHsKKwkJCS8qCisJCQkgKiBSZXZHIGRlc2t0b3AgQ1BVcyAoaS5lLiBubyBzb2NrZXQgUzFHMSBwYXJ0cykKKwkJCSAqIG5lZWQgYWRkaXRpb25hbCBvZmZzZXQsIG90aGVyd2lzZSByZXBvcnRlZAorCQkJICogdGVtcGVyYXR1cmUgaXMgYmVsb3cgYW1iaWVudCB0ZW1wZXJhdHVyZQorCQkJICovCisJCQlkYXRhLT50ZW1wX29mZnNldCA9IDIxMDAwOworCQl9CisKKwkJYnJlYWs7CisJfQorCiAJcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgUkVHX1RFTVAsICZzY2ZnKTsKIAlzY2ZnICY9IH4oU0VMX1BMQUNFIHwgU0VMX0NPUkUpOwkJLyogU2VsZWN0IHNlbnNvciAwLCBjb3JlMCAqLwogCXBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCBSRUdfVEVNUCwgc2NmZyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2xpczNsdjAyZC5jIGIvZHJpdmVycy9od21vbi9saXMzbHYwMmQuYwppbmRleCBjMDAyMTQ0Li4yMTlkMmQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL2xpczNsdjAyZC5jCisrKyBiL2RyaXZlcnMvaHdtb24vbGlzM2x2MDJkLmMKQEAgLTMsNiArMyw3IEBACiAgKgogICogIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IFlhbiBCdXJtYW4KICAqICBDb3B5cmlnaHQgKEMpIDIwMDggRXJpYyBQaWVsCisgKiAgQ29weXJpZ2h0IChDKSAyMDA4IFBhdmVsIE1hY2hlawogICoKICAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CkBAIC0zOSw3ICs0MCw2IEBACiAjaW5jbHVkZSAibGlzM2x2MDJkLmgiCiAKICNkZWZpbmUgRFJJVkVSX05BTUUgICAgICJsaXMzbHYwMmQiCi0jZGVmaW5lIEFDUElfTURQU19DTEFTUyAiYWNjZWxlcm9tZXRlciIKIAogLyogam95c3RpY2sgZGV2aWNlIHBvbGwgaW50ZXJ2YWwgaW4gbWlsbGlzZWNvbmRzICovCiAjZGVmaW5lIE1EUFNfUE9MTF9JTlRFUlZBTCA1MApAQCAtNTUsMTAwICs1NSwxNyBAQAogLyogTWF4aW11bSB2YWx1ZSBvdXIgYXhpcyBtYXkgZ2V0IGZvciB0aGUgaW5wdXQgZGV2aWNlIChzaWduZWQgMTIgYml0cykgKi8KICNkZWZpbmUgTURQU19NQVhfVkFMIDIwNDgKIAotc3RydWN0IGF4aXNfY29udmVyc2lvbiB7Ci0JczgJeDsKLQlzOAl5OwotCXM4CXo7Ci19Oworc3RydWN0IGFjcGlfbGlzM2x2MDJkIGFkZXY7CitFWFBPUlRfU1lNQk9MX0dQTChhZGV2KTsKIAotc3RydWN0IGFjcGlfbGlzM2x2MDJkIHsKLQlzdHJ1Y3QgYWNwaV9kZXZpY2UJKmRldmljZTsgICAvKiBUaGUgQUNQSSBkZXZpY2UgKi8KLQlzdHJ1Y3QgaW5wdXRfZGV2CSppZGV2OyAgICAgLyogaW5wdXQgZGV2aWNlICovCi0Jc3RydWN0IHRhc2tfc3RydWN0CSprdGhyZWFkOyAgLyoga3RocmVhZCBmb3IgaW5wdXQgKi8KLQlzdHJ1Y3QgbXV0ZXggICAgICAgICAgICBsb2NrOwotCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UJKnBkZXY7ICAgICAvKiBwbGF0Zm9ybSBkZXZpY2UgKi8KLQlhdG9taWNfdAkJY291bnQ7ICAgICAvKiBpbnRlcnJ1cHQgY291bnQgYWZ0ZXIgbGFzdCByZWFkICovCi0JaW50CQkJeGNhbGliOyAgICAvKiBjYWxpYnJhdGVkIG51bGwgdmFsdWUgZm9yIHggKi8KLQlpbnQJCQl5Y2FsaWI7ICAgIC8qIGNhbGlicmF0ZWQgbnVsbCB2YWx1ZSBmb3IgeSAqLwotCWludAkJCXpjYWxpYjsgICAgLyogY2FsaWJyYXRlZCBudWxsIHZhbHVlIGZvciB6ICovCi0JdW5zaWduZWQgY2hhcgkJaXNfb247ICAgICAvKiB3aGV0aGVyIHRoZSBkZXZpY2UgaXMgb24gb3Igb2ZmICovCi0JdW5zaWduZWQgY2hhcgkJdXNhZ2U7ICAgICAvKiB1c2FnZSBjb3VudGVyICovCi0Jc3RydWN0IGF4aXNfY29udmVyc2lvbglhYzsgICAgICAgIC8qIGh3IC0+IGxvZ2ljYWwgYXhpcyAqLwotfTsKLQotc3RhdGljIHN0cnVjdCBhY3BpX2xpczNsdjAyZCBhZGV2OwotCi1zdGF0aWMgaW50IGxpczNsdjAyZF9yZW1vdmVfZnModm9pZCk7CiBzdGF0aWMgaW50IGxpczNsdjAyZF9hZGRfZnMoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpOwogCi0vKiBGb3IgYXV0b21hdGljIGluc2VydGlvbiBvZiB0aGUgbW9kdWxlICovCi1zdGF0aWMgc3RydWN0IGFjcGlfZGV2aWNlX2lkIGxpczNsdjAyZF9kZXZpY2VfaWRzW10gPSB7Ci0JeyJIUFEwMDA0IiwgMH0sIC8qIEhQIE1vYmlsZSBEYXRhIFByb3RlY3Rpb24gU3lzdGVtIFBOUCAqLwotCXsiIiwgMH0sCi19OwotTU9EVUxFX0RFVklDRV9UQUJMRShhY3BpLCBsaXMzbHYwMmRfZGV2aWNlX2lkcyk7Ci0KLS8qKgotICogbGlzM2x2MDJkX2FjcGlfaW5pdCAtIEFDUEkgX0lOSSBtZXRob2Q6IGluaXRpYWxpemUgdGhlIGRldmljZS4KLSAqIEBoYW5kbGU6IHRoZSBoYW5kbGUgb2YgdGhlIGRldmljZQotICoKLSAqIFJldHVybnMgQUVfT0sgb24gc3VjY2Vzcy4KLSAqLwotc3RhdGljIGlubGluZSBhY3BpX3N0YXR1cyBsaXMzbHYwMmRfYWNwaV9pbml0KGFjcGlfaGFuZGxlIGhhbmRsZSkKLXsKLQlyZXR1cm4gYWNwaV9ldmFsdWF0ZV9vYmplY3QoaGFuZGxlLCBNRVRIT0RfTkFNRV9fSU5JLCBOVUxMLCBOVUxMKTsKLX0KLQotLyoqCi0gKiBsaXMzbHYwMmRfYWNwaV9yZWFkIC0gQUNQSSBBTFJEIG1ldGhvZDogcmVhZCBhIHJlZ2lzdGVyCi0gKiBAaGFuZGxlOiB0aGUgaGFuZGxlIG9mIHRoZSBkZXZpY2UKLSAqIEByZWc6ICAgIHRoZSByZWdpc3RlciB0byByZWFkCi0gKiBAcmV0OiAgICByZXN1bHQgb2YgdGhlIG9wZXJhdGlvbgotICoKLSAqIFJldHVybnMgQUVfT0sgb24gc3VjY2Vzcy4KLSAqLwotc3RhdGljIGFjcGlfc3RhdHVzIGxpczNsdjAyZF9hY3BpX3JlYWQoYWNwaV9oYW5kbGUgaGFuZGxlLCBpbnQgcmVnLCB1OCAqcmV0KQotewotCXVuaW9uIGFjcGlfb2JqZWN0IGFyZzAgPSB7IEFDUElfVFlQRV9JTlRFR0VSIH07Ci0Jc3RydWN0IGFjcGlfb2JqZWN0X2xpc3QgYXJncyA9IHsgMSwgJmFyZzAgfTsKLQl1bnNpZ25lZCBsb25nIGxvbmcgbHJldDsKLQlhY3BpX3N0YXR1cyBzdGF0dXM7Ci0KLQlhcmcwLmludGVnZXIudmFsdWUgPSByZWc7Ci0KLQlzdGF0dXMgPSBhY3BpX2V2YWx1YXRlX2ludGVnZXIoaGFuZGxlLCAiQUxSRCIsICZhcmdzLCAmbHJldCk7Ci0JKnJldCA9IGxyZXQ7Ci0JcmV0dXJuIHN0YXR1czsKLX0KLQotLyoqCi0gKiBsaXMzbHYwMmRfYWNwaV93cml0ZSAtIEFDUEkgQUxXUiBtZXRob2Q6IHdyaXRlIHRvIGEgcmVnaXN0ZXIKLSAqIEBoYW5kbGU6IHRoZSBoYW5kbGUgb2YgdGhlIGRldmljZQotICogQHJlZzogICAgdGhlIHJlZ2lzdGVyIHRvIHdyaXRlIHRvCi0gKiBAdmFsOiAgICB0aGUgdmFsdWUgdG8gd3JpdGUKLSAqCi0gKiBSZXR1cm5zIEFFX09LIG9uIHN1Y2Nlc3MuCi0gKi8KLXN0YXRpYyBhY3BpX3N0YXR1cyBsaXMzbHYwMmRfYWNwaV93cml0ZShhY3BpX2hhbmRsZSBoYW5kbGUsIGludCByZWcsIHU4IHZhbCkKLXsKLQl1bnNpZ25lZCBsb25nIGxvbmcgcmV0OyAvKiBOb3QgdXNlZCB3aGVuIHdyaXR0aW5nICovCi0JdW5pb24gYWNwaV9vYmplY3QgaW5fb2JqWzJdOwotCXN0cnVjdCBhY3BpX29iamVjdF9saXN0IGFyZ3MgPSB7IDIsIGluX29iaiB9OwotCi0JaW5fb2JqWzBdLnR5cGUgICAgICAgICAgPSBBQ1BJX1RZUEVfSU5URUdFUjsKLQlpbl9vYmpbMF0uaW50ZWdlci52YWx1ZSA9IHJlZzsKLQlpbl9vYmpbMV0udHlwZSAgICAgICAgICA9IEFDUElfVFlQRV9JTlRFR0VSOwotCWluX29ialsxXS5pbnRlZ2VyLnZhbHVlID0gdmFsOwotCi0JcmV0dXJuIGFjcGlfZXZhbHVhdGVfaW50ZWdlcihoYW5kbGUsICJBTFdSIiwgJmFyZ3MsICZyZXQpOwotfQotCiBzdGF0aWMgczE2IGxpczNsdjAyZF9yZWFkXzE2KGFjcGlfaGFuZGxlIGhhbmRsZSwgaW50IHJlZykKIHsKIAl1OCBsbywgaGk7CiAKLQlsaXMzbHYwMmRfYWNwaV9yZWFkKGhhbmRsZSwgcmVnLCAmbG8pOwotCWxpczNsdjAyZF9hY3BpX3JlYWQoaGFuZGxlLCByZWcgKyAxLCAmaGkpOworCWFkZXYucmVhZChoYW5kbGUsIHJlZywgJmxvKTsKKwlhZGV2LnJlYWQoaGFuZGxlLCByZWcgKyAxLCAmaGkpOwogCS8qIEluICIxMiBiaXQgcmlnaHQganVzdGlmaWVkIiBtb2RlLCBiaXQgNiwgYml0IDcsIGJpdCA4ID0gYml0IDUgKi8KIAlyZXR1cm4gKHMxNikoKGhpIDw8IDgpIHwgbG8pOwogfQpAQCAtMTkwLDU0ICsxMDcsMzEgQEAKIAkqeiA9IGxpczNsdjAyZF9nZXRfYXhpcyhhZGV2LmFjLnosIHBvc2l0aW9uKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGxpczNsdjAyZF9wb3dlcm9mZihhY3BpX2hhbmRsZSBoYW5kbGUpCit2b2lkIGxpczNsdjAyZF9wb3dlcm9mZihhY3BpX2hhbmRsZSBoYW5kbGUpCiB7CiAJYWRldi5pc19vbiA9IDA7CiAJLyogZGlzYWJsZSBYLFksWiBheGlzIGFuZCBwb3dlciBkb3duICovCi0JbGlzM2x2MDJkX2FjcGlfd3JpdGUoaGFuZGxlLCBDVFJMX1JFRzEsIDB4MDApOworCWFkZXYud3JpdGUoaGFuZGxlLCBDVFJMX1JFRzEsIDB4MDApOwogfQorRVhQT1JUX1NZTUJPTF9HUEwobGlzM2x2MDJkX3Bvd2Vyb2ZmKTsKIAotc3RhdGljIHZvaWQgbGlzM2x2MDJkX3Bvd2Vyb24oYWNwaV9oYW5kbGUgaGFuZGxlKQordm9pZCBsaXMzbHYwMmRfcG93ZXJvbihhY3BpX2hhbmRsZSBoYW5kbGUpCiB7CiAJdTggdmFsOwogCiAJYWRldi5pc19vbiA9IDE7Ci0JbGlzM2x2MDJkX2FjcGlfaW5pdChoYW5kbGUpOwotCWxpczNsdjAyZF9hY3BpX3dyaXRlKGhhbmRsZSwgRkZfV1VfQ0ZHLCAwKTsKKwlhZGV2LmluaXQoaGFuZGxlKTsKKwlhZGV2LndyaXRlKGhhbmRsZSwgRkZfV1VfQ0ZHLCAwKTsKIAkvKgogCSAqIEJEVTogTFNCIGFuZCBNU0IgdmFsdWVzIGFyZSBub3QgdXBkYXRlZCB1bnRpbCBib3RoIGhhdmUgYmVlbiByZWFkLgogCSAqICAgICAgU28gdGhlIHZhbHVlIHJlYWQgd2lsbCBhbHdheXMgYmUgY29ycmVjdC4KIAkgKiBJRU46IEludGVycnVwdCBmb3IgZnJlZS1mYWxsIGFuZCBERCwgbm90IGZvciBkYXRhLXJlYWR5LgogCSAqLwotCWxpczNsdjAyZF9hY3BpX3JlYWQoaGFuZGxlLCBDVFJMX1JFRzIsICZ2YWwpOworCWFkZXYucmVhZChoYW5kbGUsIENUUkxfUkVHMiwgJnZhbCk7CiAJdmFsIHw9IENUUkwyX0JEVSB8IENUUkwyX0lFTjsKLQlsaXMzbHYwMmRfYWNwaV93cml0ZShoYW5kbGUsIENUUkxfUkVHMiwgdmFsKTsKKwlhZGV2LndyaXRlKGhhbmRsZSwgQ1RSTF9SRUcyLCB2YWwpOwogfQotCi0jaWZkZWYgQ09ORklHX1BNCi1zdGF0aWMgaW50IGxpczNsdjAyZF9zdXNwZW5kKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlLCBwbV9tZXNzYWdlX3Qgc3RhdGUpCi17Ci0JLyogbWFrZSBzdXJlIHRoZSBkZXZpY2UgaXMgb2ZmIHdoZW4gd2Ugc3VzcGVuZCAqLwotCWxpczNsdjAyZF9wb3dlcm9mZihkZXZpY2UtPmhhbmRsZSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbGlzM2x2MDJkX3Jlc3VtZShzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSkKLXsKLQkvKiBwdXQgYmFjayB0aGUgZGV2aWNlIGluIHRoZSByaWdodCBzdGF0ZSAoQUNQSSBtaWdodCB0dXJuIGl0IG9uKSAqLwotCW11dGV4X2xvY2soJmFkZXYubG9jayk7Ci0JaWYgKGFkZXYudXNhZ2UgPiAwKQotCQlsaXMzbHYwMmRfcG93ZXJvbihkZXZpY2UtPmhhbmRsZSk7Ci0JZWxzZQotCQlsaXMzbHYwMmRfcG93ZXJvZmYoZGV2aWNlLT5oYW5kbGUpOwotCW11dGV4X3VubG9jaygmYWRldi5sb2NrKTsKLQlyZXR1cm4gMDsKLX0KLSNlbHNlCi0jZGVmaW5lIGxpczNsdjAyZF9zdXNwZW5kIE5VTEwKLSNkZWZpbmUgbGlzM2x2MDJkX3Jlc3VtZSBOVUxMCi0jZW5kaWYKLQorRVhQT1JUX1NZTUJPTF9HUEwobGlzM2x2MDJkX3Bvd2Vyb24pOwogCiAvKgogICogVG8gYmUgY2FsbGVkIGJlZm9yZSBzdGFydGluZyB0byB1c2UgdGhlIGRldmljZS4gSXQgbWFrZXMgc3VyZSB0aGF0IHRoZQpAQCAtMzE1LDcgKzIwOSw3IEBACiAJbGlzM2x2MDJkX2dldF94eXooYWRldi5kZXZpY2UtPmhhbmRsZSwgJmFkZXYueGNhbGliLCAmYWRldi55Y2FsaWIsICZhZGV2LnpjYWxpYik7CiB9CiAKLXN0YXRpYyBpbnQgbGlzM2x2MDJkX2pveXN0aWNrX2VuYWJsZSh2b2lkKQoraW50IGxpczNsdjAyZF9qb3lzdGlja19lbmFibGUodm9pZCkKIHsKIAlpbnQgZXJyOwogCkBAIC0zNDksOCArMjQzLDkgQEAKIAogCXJldHVybiBlcnI7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChsaXMzbHYwMmRfam95c3RpY2tfZW5hYmxlKTsKIAotc3RhdGljIHZvaWQgbGlzM2x2MDJkX2pveXN0aWNrX2Rpc2FibGUodm9pZCkKK3ZvaWQgbGlzM2x2MDJkX2pveXN0aWNrX2Rpc2FibGUodm9pZCkKIHsKIAlpZiAoIWFkZXYuaWRldikKIAkJcmV0dXJuOwpAQCAtMzU4LDEzICsyNTMsMTMgQEAKIAlpbnB1dF91bnJlZ2lzdGVyX2RldmljZShhZGV2LmlkZXYpOwogCWFkZXYuaWRldiA9IE5VTEw7CiB9Ci0KK0VYUE9SVF9TWU1CT0xfR1BMKGxpczNsdjAyZF9qb3lzdGlja19kaXNhYmxlKTsKIAogLyoKICAqIEluaXRpYWxpc2UgdGhlIGFjY2VsZXJvbWV0ZXIgYW5kIHRoZSB2YXJpb3VzIHN1YnN5c3RlbXMuCiAgKiBTaG91bGQgYmUgcmF0aGVyIGluZGVwZW5kYW50IG9mIHRoZSBidXMgc3lzdGVtLgogICovCi1zdGF0aWMgaW50IGxpczNsdjAyZF9pbml0X2RldmljZShzdHJ1Y3QgYWNwaV9saXMzbHYwMmQgKmRldikKK2ludCBsaXMzbHYwMmRfaW5pdF9kZXZpY2Uoc3RydWN0IGFjcGlfbGlzM2x2MDJkICpkZXYpCiB7CiAJbXV0ZXhfaW5pdCgmZGV2LT5sb2NrKTsKIAlsaXMzbHYwMmRfYWRkX2ZzKGRldi0+ZGV2aWNlKTsKQEAgLTM3Niw5MyArMjcxLDcgQEAKIAlsaXMzbHYwMmRfZGVjcmVhc2VfdXNlKGRldik7CiAJcmV0dXJuIDA7CiB9Ci0KLXN0YXRpYyBpbnQgbGlzM2x2MDJkX2RtaV9tYXRjaGVkKGNvbnN0IHN0cnVjdCBkbWlfc3lzdGVtX2lkICpkbWkpCi17Ci0JYWRldi5hYyA9ICooKHN0cnVjdCBheGlzX2NvbnZlcnNpb24gKilkbWktPmRyaXZlcl9kYXRhKTsKLQlwcmludGsoS0VSTl9JTkZPIERSSVZFUl9OQU1FICI6IGhhcmR3YXJlIHR5cGUgJXMgZm91bmQuXG4iLCBkbWktPmlkZW50KTsKLQotCXJldHVybiAxOwotfQotCi0vKiBSZXByZXNlbnRzLCBmb3IgZWFjaCBheGlzIHNlZW4gYnkgdXNlcnNwYWNlLCB0aGUgY29ycmVzcG9uZGluZyBodyBheGlzICgrMSkuCi0gKiBJZiB0aGUgdmFsdWUgaXMgbmVnYXRpdmUsIHRoZSBvcHBvc2l0ZSBvZiB0aGUgaHcgdmFsdWUgaXMgdXNlZC4gKi8KLXN0YXRpYyBzdHJ1Y3QgYXhpc19jb252ZXJzaW9uIGxpczNsdjAyZF9heGlzX25vcm1hbCA9IHsxLCAyLCAzfTsKLXN0YXRpYyBzdHJ1Y3QgYXhpc19jb252ZXJzaW9uIGxpczNsdjAyZF9heGlzX3lfaW52ZXJ0ZWQgPSB7MSwgLTIsIDN9Owotc3RhdGljIHN0cnVjdCBheGlzX2NvbnZlcnNpb24gbGlzM2x2MDJkX2F4aXNfeF9pbnZlcnRlZCA9IHstMSwgMiwgM307Ci1zdGF0aWMgc3RydWN0IGF4aXNfY29udmVyc2lvbiBsaXMzbHYwMmRfYXhpc196X2ludmVydGVkID0gezEsIDIsIC0zfTsKLXN0YXRpYyBzdHJ1Y3QgYXhpc19jb252ZXJzaW9uIGxpczNsdjAyZF9heGlzX3h5X3JvdGF0ZWRfbGVmdCA9IHstMiwgMSwgM307Ci1zdGF0aWMgc3RydWN0IGF4aXNfY29udmVyc2lvbiBsaXMzbHYwMmRfYXhpc194eV9zd2FwX2ludmVydGVkID0gey0yLCAtMSwgM307Ci0KLSNkZWZpbmUgQVhJU19ETUlfTUFUQ0goX2lkZW50LCBfbmFtZSwgX2F4aXMpIHsJCVwKLQkuaWRlbnQgPSBfaWRlbnQsCQkJCVwKLQkuY2FsbGJhY2sgPSBsaXMzbHYwMmRfZG1pX21hdGNoZWQsCQlcCi0JLm1hdGNoZXMgPSB7CQkJCQlcCi0JCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCBfbmFtZSkJXAotCX0sCQkJCQkJXAotCS5kcml2ZXJfZGF0YSA9ICZsaXMzbHYwMmRfYXhpc18jI19heGlzCQlcCi19Ci1zdGF0aWMgc3RydWN0IGRtaV9zeXN0ZW1faWQgbGlzM2x2MDJkX2RtaV9pZHNbXSA9IHsKLQkvKiBwcm9kdWN0IG5hbWVzIGFyZSB0cnVuY2F0ZWQgdG8gbWF0Y2ggYWxsIGtpbmRzIG9mIGEgc2FtZSBtb2RlbCAqLwotCUFYSVNfRE1JX01BVENIKCJOQzY0eDAiLCAiSFAgQ29tcGFxIG5jNjQiLCB4X2ludmVydGVkKSwKLQlBWElTX0RNSV9NQVRDSCgiTkM4NHgwIiwgIkhQIENvbXBhcSBuYzg0Iiwgel9pbnZlcnRlZCksCi0JQVhJU19ETUlfTUFUQ0goIk5YOTQyMCIsICJIUCBDb21wYXEgbng5NDIwIiwgeF9pbnZlcnRlZCksCi0JQVhJU19ETUlfTUFUQ0goIk5XOTQ0MCIsICJIUCBDb21wYXEgbnc5NDQwIiwgeF9pbnZlcnRlZCksCi0JQVhJU19ETUlfTUFUQ0goIk5DMjUxMCIsICJIUCBDb21wYXEgMjUxMCIsIHlfaW52ZXJ0ZWQpLAotCUFYSVNfRE1JX01BVENIKCJOQzg1MTAiLCAiSFAgQ29tcGFxIDg1MTAiLCB4eV9zd2FwX2ludmVydGVkKSwKLQlBWElTX0RNSV9NQVRDSCgiSFAyMTMzIiwgIkhQIDIxMzMiLCB4eV9yb3RhdGVkX2xlZnQpLAotCXsgTlVMTCwgfQotLyogTGFwdG9wIG1vZGVscyB3aXRob3V0IGF4aXMgaW5mbyAoeWV0KToKLSAqICJOQzY1MXh4IiAiSFAgQ29tcGFxIDY1MSIKLSAqICJOQzY3MXh4IiAiSFAgQ29tcGFxIDY3MSIKLSAqICJOQzY5MTAiICJIUCBDb21wYXEgNjkxMCIKLSAqIEhQIENvbXBhcSA4NzEweCBOb3RlYm9vayBQQyAvIE1vYmlsZSBXb3Jrc3RhdGlvbgotICogIk5DMjQwMCIgIkhQIENvbXBhcSBuYzI0MDAiCi0gKiAiTlg3NHgwIiAiSFAgQ29tcGFxIG54NzQiCi0gKiAiTlg2MzI1IiAiSFAgQ29tcGFxIG54NjMyNSIKLSAqICJOQzQ0MDAiICJIUCBDb21wYXEgbmM0NDAwIgotICovCi19OwotCi1zdGF0aWMgaW50IGxpczNsdjAyZF9hZGQoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpCi17Ci0JdTggdmFsOwotCi0JaWYgKCFkZXZpY2UpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JYWRldi5kZXZpY2UgPSBkZXZpY2U7Ci0Jc3RyY3B5KGFjcGlfZGV2aWNlX25hbWUoZGV2aWNlKSwgRFJJVkVSX05BTUUpOwotCXN0cmNweShhY3BpX2RldmljZV9jbGFzcyhkZXZpY2UpLCBBQ1BJX01EUFNfQ0xBU1MpOwotCWRldmljZS0+ZHJpdmVyX2RhdGEgPSAmYWRldjsKLQotCWxpczNsdjAyZF9hY3BpX3JlYWQoZGV2aWNlLT5oYW5kbGUsIFdIT19BTV9JLCAmdmFsKTsKLQlpZiAoKHZhbCAhPSBMSVMzTFYwMkRMX0lEKSAmJiAodmFsICE9IExJUzMwMkRMX0lEKSkgewotCQlwcmludGsoS0VSTl9FUlIgRFJJVkVSX05BTUUKLQkJCQkiOiBBY2NlbGVyb21ldGVyIGNoaXAgbm90IExJUzNMVjAyRHtMLFF9XG4iKTsKLQl9Ci0KLQkvKiBJZiBwb3NzaWJsZSB1c2UgYSAic3RhbmRhcmQiIGF4ZXMgb3JkZXIgKi8KLQlpZiAoZG1pX2NoZWNrX3N5c3RlbShsaXMzbHYwMmRfZG1pX2lkcykgPT0gMCkgewotCQlwcmludGsoS0VSTl9JTkZPIERSSVZFUl9OQU1FICI6IGxhcHRvcCBtb2RlbCB1bmtub3duLCAiCi0JCQkJICJ1c2luZyBkZWZhdWx0IGF4ZXMgY29uZmlndXJhdGlvblxuIik7Ci0JCWFkZXYuYWMgPSBsaXMzbHYwMmRfYXhpc19ub3JtYWw7Ci0JfQotCi0JcmV0dXJuIGxpczNsdjAyZF9pbml0X2RldmljZSgmYWRldik7Ci19Ci0KLXN0YXRpYyBpbnQgbGlzM2x2MDJkX3JlbW92ZShzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSwgaW50IHR5cGUpCi17Ci0JaWYgKCFkZXZpY2UpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JbGlzM2x2MDJkX2pveXN0aWNrX2Rpc2FibGUoKTsKLQlsaXMzbHYwMmRfcG93ZXJvZmYoZGV2aWNlLT5oYW5kbGUpOwotCi0JcmV0dXJuIGxpczNsdjAyZF9yZW1vdmVfZnMoKTsKLX0KLQorRVhQT1JUX1NZTUJPTF9HUEwobGlzM2x2MDJkX2luaXRfZGV2aWNlKTsKIAogLyogU3lzZnMgc3R1ZmYgKi8KIHN0YXRpYyBzc2l6ZV90IGxpczNsdjAyZF9wb3NpdGlvbl9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKQEAgLTUwMSw3ICszMTAsNyBAQAogCWludCB2YWw7CiAKIAlsaXMzbHYwMmRfaW5jcmVhc2VfdXNlKCZhZGV2KTsKLQlsaXMzbHYwMmRfYWNwaV9yZWFkKGFkZXYuZGV2aWNlLT5oYW5kbGUsIENUUkxfUkVHMSwgJmN0cmwpOworCWFkZXYucmVhZChhZGV2LmRldmljZS0+aGFuZGxlLCBDVFJMX1JFRzEsICZjdHJsKTsKIAlsaXMzbHYwMmRfZGVjcmVhc2VfdXNlKCZhZGV2KTsKIAl2YWwgPSAoY3RybCAmIChDVFJMMV9ERjAgfCBDVFJMMV9ERjEpKSA+PiA0OwogCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBsaXMzbHYwMmRsX2RmX3ZhbFt2YWxdKTsKQEAgLTUyMyw2ICszMzIsNyBAQAogCS5hdHRycyA9IGxpczNsdjAyZF9hdHRyaWJ1dGVzCiB9OwogCisKIHN0YXRpYyBpbnQgbGlzM2x2MDJkX2FkZF9mcyhzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSkKIHsKIAlhZGV2LnBkZXYgPSBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXJfc2ltcGxlKERSSVZFUl9OQU1FLCAtMSwgTlVMTCwgMCk7CkBAIC01MzIsNTAgKzM0MiwxNSBAQAogCXJldHVybiBzeXNmc19jcmVhdGVfZ3JvdXAoJmFkZXYucGRldi0+ZGV2LmtvYmosICZsaXMzbHYwMmRfYXR0cmlidXRlX2dyb3VwKTsKIH0KIAotc3RhdGljIGludCBsaXMzbHYwMmRfcmVtb3ZlX2ZzKHZvaWQpCitpbnQgbGlzM2x2MDJkX3JlbW92ZV9mcyh2b2lkKQogewogCXN5c2ZzX3JlbW92ZV9ncm91cCgmYWRldi5wZGV2LT5kZXYua29iaiwgJmxpczNsdjAyZF9hdHRyaWJ1dGVfZ3JvdXApOwogCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKGFkZXYucGRldik7CiAJcmV0dXJuIDA7CiB9Ci0KLS8qIEZvciB0aGUgSFAgTURQUyBha2EgM0QgRHJpdmVndWFyZCAqLwotc3RhdGljIHN0cnVjdCBhY3BpX2RyaXZlciBsaXMzbHYwMmRfZHJpdmVyID0gewotCS5uYW1lICA9IERSSVZFUl9OQU1FLAotCS5jbGFzcyA9IEFDUElfTURQU19DTEFTUywKLQkuaWRzICAgPSBsaXMzbHYwMmRfZGV2aWNlX2lkcywKLQkub3BzID0gewotCQkuYWRkICAgICA9IGxpczNsdjAyZF9hZGQsCi0JCS5yZW1vdmUgID0gbGlzM2x2MDJkX3JlbW92ZSwKLQkJLnN1c3BlbmQgPSBsaXMzbHYwMmRfc3VzcGVuZCwKLQkJLnJlc3VtZSAgPSBsaXMzbHYwMmRfcmVzdW1lLAotCX0KLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IGxpczNsdjAyZF9pbml0X21vZHVsZSh2b2lkKQotewotCWludCByZXQ7Ci0KLQlpZiAoYWNwaV9kaXNhYmxlZCkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQlyZXQgPSBhY3BpX2J1c19yZWdpc3Rlcl9kcml2ZXIoJmxpczNsdjAyZF9kcml2ZXIpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCi0JcHJpbnRrKEtFUk5fSU5GTyBEUklWRVJfTkFNRSAiIGRyaXZlciBsb2FkZWQuXG4iKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgbGlzM2x2MDJkX2V4aXRfbW9kdWxlKHZvaWQpCi17Ci0JYWNwaV9idXNfdW5yZWdpc3Rlcl9kcml2ZXIoJmxpczNsdjAyZF9kcml2ZXIpOwotfQorRVhQT1JUX1NZTUJPTF9HUEwobGlzM2x2MDJkX3JlbW92ZV9mcyk7CiAKIE1PRFVMRV9ERVNDUklQVElPTigiU1QgTElTM0xWMDJEeCB0aHJlZS1heGlzIGRpZ2l0YWwgYWNjZWxlcm9tZXRlciBkcml2ZXIiKTsKIE1PRFVMRV9BVVRIT1IoIllhbiBCdXJtYW4gYW5kIEVyaWMgUGllbCIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogCi1tb2R1bGVfaW5pdChsaXMzbHYwMmRfaW5pdF9tb2R1bGUpOwotbW9kdWxlX2V4aXQobGlzM2x2MDJkX2V4aXRfbW9kdWxlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vbGlzM2x2MDJkLmggYi9kcml2ZXJzL2h3bW9uL2xpczNsdjAyZC5oCmluZGV4IDMzMGNmYzYuLjIyM2YxYzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vbGlzM2x2MDJkLmgKKysrIGIvZHJpdmVycy9od21vbi9saXMzbHYwMmQuaApAQCAtMjMsNyArMjMsNyBAQAogICogVGhlIGFjdHVhbCBjaGlwIGlzIFNUTWljcm9lbGVjdHJvbmljcyBMSVMzTFYwMkRMIG9yIExJUzNMVjAyRFEgdGhhdCBzZWVtcyB0bwogICogYmUgY29ubmVjdGVkIHZpYSBTUEkuIFRoZXJlIGV4aXN0cyBhbHNvIHNldmVyYWwgc2ltaWxhciBjaGlwcyAoc3VjaCBhcyBMSVMzMDJETCBvcgogICogTElTM0wwMkRRKSBidXQgbm90IGluIHRoZSBIUCBsYXB0b3BzIGFuZCB0aGV5IGhhdmUgc2xpZ2h0bHkgZGlmZmVyZW50IHJlZ2lzdGVycy4KLSAqIFRoZXkgY2FuIGFsc28gYmUgY29ubmVjdGVkIHZpYSBJw4LLm0MuCisgKiBUaGV5IGNhbiBhbHNvIGJlIGNvbm5lY3RlZCB2aWEgScKyQy4KICAqLwogCiAjZGVmaW5lIExJUzNMVjAyRExfSUQJMHgzQSAvKiBBbHNvIHRoZSBMSVMzTFYwMkRRICovCkBAIC0xNDcsMyArMTQ3LDM2IEBACiAJRERfU1JDX0lBCT0gMHg0MCwKIH07CiAKK3N0cnVjdCBheGlzX2NvbnZlcnNpb24geworCXM4CXg7CisJczgJeTsKKwlzOAl6OworfTsKKworc3RydWN0IGFjcGlfbGlzM2x2MDJkIHsKKwlzdHJ1Y3QgYWNwaV9kZXZpY2UJKmRldmljZTsgICAvKiBUaGUgQUNQSSBkZXZpY2UgKi8KKwlhY3BpX3N0YXR1cyAoKmluaXQpIChhY3BpX2hhbmRsZSBoYW5kbGUpOworCWFjcGlfc3RhdHVzICgqd3JpdGUpIChhY3BpX2hhbmRsZSBoYW5kbGUsIGludCByZWcsIHU4IHZhbCk7CisJYWNwaV9zdGF0dXMgKCpyZWFkKSAoYWNwaV9oYW5kbGUgaGFuZGxlLCBpbnQgcmVnLCB1OCAqcmV0KTsKKworCXN0cnVjdCBpbnB1dF9kZXYJKmlkZXY7ICAgICAvKiBpbnB1dCBkZXZpY2UgKi8KKwlzdHJ1Y3QgdGFza19zdHJ1Y3QJKmt0aHJlYWQ7ICAvKiBrdGhyZWFkIGZvciBpbnB1dCAqLworCXN0cnVjdCBtdXRleCAgICAgICAgICAgIGxvY2s7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZQkqcGRldjsgICAgIC8qIHBsYXRmb3JtIGRldmljZSAqLworCWF0b21pY190CQljb3VudDsgICAgIC8qIGludGVycnVwdCBjb3VudCBhZnRlciBsYXN0IHJlYWQgKi8KKwlpbnQJCQl4Y2FsaWI7ICAgIC8qIGNhbGlicmF0ZWQgbnVsbCB2YWx1ZSBmb3IgeCAqLworCWludAkJCXljYWxpYjsgICAgLyogY2FsaWJyYXRlZCBudWxsIHZhbHVlIGZvciB5ICovCisJaW50CQkJemNhbGliOyAgICAvKiBjYWxpYnJhdGVkIG51bGwgdmFsdWUgZm9yIHogKi8KKwl1bnNpZ25lZCBjaGFyCQlpc19vbjsgICAgIC8qIHdoZXRoZXIgdGhlIGRldmljZSBpcyBvbiBvciBvZmYgKi8KKwl1bnNpZ25lZCBjaGFyCQl1c2FnZTsgICAgIC8qIHVzYWdlIGNvdW50ZXIgKi8KKwlzdHJ1Y3QgYXhpc19jb252ZXJzaW9uCWFjOyAgICAgICAgLyogaHcgLT4gbG9naWNhbCBheGlzICovCit9OworCitpbnQgbGlzM2x2MDJkX2luaXRfZGV2aWNlKHN0cnVjdCBhY3BpX2xpczNsdjAyZCAqZGV2KTsKK2ludCBsaXMzbHYwMmRfam95c3RpY2tfZW5hYmxlKHZvaWQpOwordm9pZCBsaXMzbHYwMmRfam95c3RpY2tfZGlzYWJsZSh2b2lkKTsKK3ZvaWQgbGlzM2x2MDJkX3Bvd2Vyb2ZmKGFjcGlfaGFuZGxlIGhhbmRsZSk7Cit2b2lkIGxpczNsdjAyZF9wb3dlcm9uKGFjcGlfaGFuZGxlIGhhbmRsZSk7CitpbnQgbGlzM2x2MDJkX3JlbW92ZV9mcyh2b2lkKTsKKworZXh0ZXJuIHN0cnVjdCBhY3BpX2xpczNsdjAyZCBhZGV2OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9sbTcwLmMgYi9kcml2ZXJzL2h3bW9uL2xtNzAuYwppbmRleCBkNDM1ZjAwLi5hZTYyMDRmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL2xtNzAuYworKysgYi9kcml2ZXJzL2h3bW9uL2xtNzAuYwpAQCAtMzcsOSArMzcsMTMgQEAKIAogI2RlZmluZSBEUlZOQU1FCQkibG03MCIKIAorI2RlZmluZSBMTTcwX0NISVBfTE03MAkJMAkvKiBvcmlnaW5hbCBOUyBMTTcwICovCisjZGVmaW5lIExNNzBfQ0hJUF9UTVAxMjEJMQkvKiBUSSBUTVAxMjEvVE1QMTIzICovCisKIHN0cnVjdCBsbTcwIHsKIAlzdHJ1Y3QgZGV2aWNlICpod21vbl9kZXY7CiAJc3RydWN0IG11dGV4IGxvY2s7CisJdW5zaWduZWQgaW50IGNoaXA7CiB9OwogCiAvKiBzeXNmcyBob29rIGZ1bmN0aW9uICovCkBAIC00Nyw3ICs1MSw3IEBACiAJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCiB7CiAJc3RydWN0IHNwaV9kZXZpY2UgKnNwaSA9IHRvX3NwaV9kZXZpY2UoZGV2KTsKLQlpbnQgc3RhdHVzLCB2YWw7CisJaW50IHN0YXR1cywgdmFsID0gMDsKIAl1OCByeGJ1ZlsyXTsKIAlzMTYgcmF3PTA7CiAJc3RydWN0IGxtNzAgKnBfbG03MCA9IGRldl9nZXRfZHJ2ZGF0YSgmc3BpLT5kZXYpOwpAQCAtNjUsMTIgKzY5LDEyIEBACiAJCSJzcGlfd3JpdGVfdGhlbl9yZWFkIGZhaWxlZCB3aXRoIHN0YXR1cyAlZFxuIiwgc3RhdHVzKTsKIAkJZ290byBvdXQ7CiAJfQotCWRldl9kYmcoZGV2LCAicnhidWZbMV0gOiAweCV4IHJ4YnVmWzBdIDogMHgleFxuIiwgcnhidWZbMV0sIHJ4YnVmWzBdKTsKLQotCXJhdyA9IChyeGJ1ZlsxXSA8PCA4KSArIHJ4YnVmWzBdOwotCWRldl9kYmcoZGV2LCAicmF3PTB4JXhcbiIsIHJhdyk7CisJcmF3ID0gKHJ4YnVmWzBdIDw8IDgpICsgcnhidWZbMV07CisJZGV2X2RiZyhkZXYsICJyeGJ1ZlswXSA6IDB4JTAyeCByeGJ1ZlsxXSA6IDB4JTAyeCByYXc9MHglMDR4XG4iLAorCQlyeGJ1ZlswXSwgcnhidWZbMV0sIHJhdyk7CiAKIAkvKgorCSAqIExNNzA6CiAJICogVGhlICJyYXciIHRlbXBlcmF0dXJlIHJlYWQgaW50byByeGJ1ZltdIGlzIGEgMTYtYml0IHNpZ25lZCAyJ3MKIAkgKiBjb21wbGVtZW50IHZhbHVlLiBPbmx5IHRoZSBNU0IgMTEgYml0cyAoMSBzaWduICsgMTAgdGVtcGVyYXR1cmUKIAkgKiBiaXRzKSBhcmUgbWVhbmluZ2Z1bDsgdGhlIExTQiA1IGJpdHMgYXJlIHRvIGJlIGRpc2NhcmRlZC4KQEAgLTgwLDggKzg0LDIxIEBACiAJICogYnkgMC4yNS4gQWxzbyBtdWx0aXBseSBieSAxMDAwIHRvIHJlcHJlc2VudCBpbiBtaWxsaWRlZ3JlZXMKIAkgKiBDZWxzaXVzLgogCSAqIFNvIGl0J3MgZXF1aXZhbGVudCB0byBtdWx0aXBseWluZyBieSAwLjI1ICogMTAwMCA9IDI1MC4KKwkgKgorCSAqIFRNUDEyMS9UTVAxMjM6CisJICogMTMgYml0cyBvZiAyJ3MgY29tcGxlbWVudCBkYXRhLCBkaXNjYXJkIExTQiAzIGJpdHMsCisJICogcmVzb2x1dGlvbiAwLjA2MjUgZGVncmVlcyBjZWxzaXVzLgogCSAqLwotCXZhbCA9ICgoaW50KXJhdy8zMikgKiAyNTA7CisJc3dpdGNoIChwX2xtNzAtPmNoaXApIHsKKwljYXNlIExNNzBfQ0hJUF9MTTcwOgorCQl2YWwgPSAoKGludClyYXcgLyAzMikgKiAyNTA7CisJCWJyZWFrOworCisJY2FzZSBMTTcwX0NISVBfVE1QMTIxOgorCQl2YWwgPSAoKGludClyYXcgLyA4KSAqIDYyNSAvIDEwOworCQlicmVhazsKKwl9CisKIAlzdGF0dXMgPSBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCB2YWwpOyAvKiBtaWxsaWRlZ3JlZXMgQ2Vsc2l1cyAqLwogb3V0OgogCW11dGV4X3VubG9jaygmcF9sbTcwLT5sb2NrKTsKQEAgLTkzLDI3ICsxMTAsMzkgQEAKIHN0YXRpYyBzc2l6ZV90IGxtNzBfc2hvd19uYW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUKIAkJCSAgICAgICpkZXZhdHRyLCBjaGFyICpidWYpCiB7Ci0JcmV0dXJuIHNwcmludGYoYnVmLCAibG03MFxuIik7CisJc3RydWN0IGxtNzAgKnBfbG03MCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCWludCByZXQ7CisKKwlzd2l0Y2ggKHBfbG03MC0+Y2hpcCkgeworCWNhc2UgTE03MF9DSElQX0xNNzA6CisJCXJldCA9IHNwcmludGYoYnVmLCAibG03MFxuIik7CisJCWJyZWFrOworCWNhc2UgTE03MF9DSElQX1RNUDEyMToKKwkJcmV0ID0gc3ByaW50ZihidWYsICJ0bXAxMjFcbiIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXQgPSAtRUlOVkFMOworCX0KKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgREVWSUNFX0FUVFIobmFtZSwgU19JUlVHTywgbG03MF9zaG93X25hbWUsIE5VTEwpOwogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCi1zdGF0aWMgaW50IF9fZGV2aW5pdCBsbTcwX3Byb2JlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCitzdGF0aWMgaW50IF9fZGV2aW5pdCBjb21tb25fcHJvYmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgaW50IGNoaXApCiB7CiAJc3RydWN0IGxtNzAgKnBfbG03MDsKIAlpbnQgc3RhdHVzOwogCi0JLyogc2lnbmFsaW5nIGlzIFNQSV9NT0RFXzAgb24gYSAzLXdpcmUgbGluayAoc2hhcmVkIFNJL1NPKSAqLwotCWlmICgoc3BpLT5tb2RlICYgKFNQSV9DUE9MfFNQSV9DUEhBKSkgfHwgIShzcGktPm1vZGUgJiBTUElfM1dJUkUpKQotCQlyZXR1cm4gLUVJTlZBTDsKKwkvKiBOT1RFOiAgd2UgYXNzdW1lIDgtYml0IHdvcmRzLCBhbmQgY29udmVydCB0byAxNiBiaXRzIG1hbnVhbGx5ICovCiAKIAlwX2xtNzAgPSBremFsbG9jKHNpemVvZiAqcF9sbTcwLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXBfbG03MCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAltdXRleF9pbml0KCZwX2xtNzAtPmxvY2spOworCXBfbG03MC0+Y2hpcCA9IGNoaXA7CiAKIAkvKiBzeXNmcyBob29rICovCiAJcF9sbTcwLT5od21vbl9kZXYgPSBod21vbl9kZXZpY2VfcmVnaXN0ZXIoJnNwaS0+ZGV2KTsKQEAgLTE0MSw2ICsxNzAsMjQgQEAKIAlyZXR1cm4gc3RhdHVzOwogfQogCitzdGF0aWMgaW50IF9fZGV2aW5pdCBsbTcwX3Byb2JlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJLyogc2lnbmFsaW5nIGlzIFNQSV9NT0RFXzAgb24gYSAzLXdpcmUgbGluayAoc2hhcmVkIFNJL1NPKSAqLworCWlmICgoc3BpLT5tb2RlICYgKFNQSV9DUE9MIHwgU1BJX0NQSEEpKSB8fCAhKHNwaS0+bW9kZSAmIFNQSV8zV0lSRSkpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIGNvbW1vbl9wcm9iZShzcGksIExNNzBfQ0hJUF9MTTcwKTsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgdG1wMTIxX3Byb2JlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJLyogc2lnbmFsaW5nIGlzIFNQSV9NT0RFXzAgd2l0aCBvbmx5IE1JU08gY29ubmVjdGVkICovCisJaWYgKHNwaS0+bW9kZSAmIChTUElfQ1BPTCB8IFNQSV9DUEhBKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gY29tbW9uX3Byb2JlKHNwaSwgTE03MF9DSElQX1RNUDEyMSk7Cit9CisKIHN0YXRpYyBpbnQgX19kZXZleGl0IGxtNzBfcmVtb3ZlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCiB7CiAJc3RydWN0IGxtNzAgKnBfbG03MCA9IGRldl9nZXRfZHJ2ZGF0YSgmc3BpLT5kZXYpOwpAQCAtMTU0LDYgKzIwMSwxNSBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgc3RydWN0IHNwaV9kcml2ZXIgdG1wMTIxX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZQk9ICJ0bXAxMjEiLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwl9LAorCS5wcm9iZQk9IHRtcDEyMV9wcm9iZSwKKwkucmVtb3ZlCT0gX19kZXZleGl0X3AobG03MF9yZW1vdmUpLAorfTsKKwogc3RhdGljIHN0cnVjdCBzcGlfZHJpdmVyIGxtNzBfZHJpdmVyID0gewogCS5kcml2ZXIgPSB7CiAJCS5uYW1lCT0gImxtNzAiLApAQCAtMTY1LDE3ICsyMjEsMjYgQEAKIAogc3RhdGljIGludCBfX2luaXQgaW5pdF9sbTcwKHZvaWQpCiB7Ci0JcmV0dXJuIHNwaV9yZWdpc3Rlcl9kcml2ZXIoJmxtNzBfZHJpdmVyKTsKKwlpbnQgcmV0ID0gc3BpX3JlZ2lzdGVyX2RyaXZlcigmbG03MF9kcml2ZXIpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBzcGlfcmVnaXN0ZXJfZHJpdmVyKCZ0bXAxMjFfZHJpdmVyKTsKKwlpZiAocmV0KQorCQlzcGlfdW5yZWdpc3Rlcl9kcml2ZXIoJmxtNzBfZHJpdmVyKTsKKworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBjbGVhbnVwX2xtNzAodm9pZCkKIHsKIAlzcGlfdW5yZWdpc3Rlcl9kcml2ZXIoJmxtNzBfZHJpdmVyKTsKKwlzcGlfdW5yZWdpc3Rlcl9kcml2ZXIoJnRtcDEyMV9kcml2ZXIpOwogfQogCiBtb2R1bGVfaW5pdChpbml0X2xtNzApOwogbW9kdWxlX2V4aXQoY2xlYW51cF9sbTcwKTsKIAogTU9EVUxFX0FVVEhPUigiS2Fpd2FuIE4gQmlsbGltb3JpYSIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJOYXRpb25hbCBTZW1pY29uZHVjdG9yIExNNzAgTGludXggZHJpdmVyIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIk5TIExNNzAgLyBUSSBUTVAxMjEvVE1QMTIzIExpbnV4IGRyaXZlciIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9sdGM0MjQ1LmMgYi9kcml2ZXJzL2h3bW9uL2x0YzQyNDUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzRiMmM1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9od21vbi9sdGM0MjQ1LmMKQEAgLTAsMCArMSw1NjcgQEAKKy8qCisgKiBEcml2ZXIgZm9yIExpbmVhciBUZWNobm9sb2d5IExUQzQyNDUgSTJDIE11bHRpcGxlIFN1cHBseSBIb3QgU3dhcCBDb250cm9sbGVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA4IElyYSBXLiBTbnlkZXIgPGl3c0BvdnJvLmNhbHRlY2guZWR1PgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLgorICoKKyAqIFRoaXMgZHJpdmVyIGlzIGJhc2VkIG9uIHRoZSBkczE2MjEgYW5kIGluYTIwOSBkcml2ZXJzLgorICoKKyAqIERhdGFzaGVldDoKKyAqIGh0dHA6Ly93d3cubGluZWFyLmNvbS9wYy9kb3dubG9hZERvY3VtZW50LmRvP25hdklkPUgwLEMxLEMxMDAzLEMxMDA2LEMxMTQwLFAxOTM5MixEMTM1MTcKKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9od21vbi5oPgorI2luY2x1ZGUgPGxpbnV4L2h3bW9uLXN5c2ZzLmg+CisKKy8qIFZhbGlkIGFkZHJlc3NlcyBhcmUgMHgyMCAtIDB4M2YKKyAqCisgKiBGb3Igbm93LCB3ZSBkbyBub3QgcHJvYmUsIHNpbmNlIHNvbWUgb2YgdGhlc2UgYWRkcmVzc2VzCisgKiBhcmUga25vd24gdG8gYmUgdW5mcmllbmRseSB0byBwcm9iaW5nICovCitzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgbm9ybWFsX2kyY1tdID0geyBJMkNfQ0xJRU5UX0VORCB9OworCisvKiBJbnNtb2QgcGFyYW1ldGVycyAqLworSTJDX0NMSUVOVF9JTlNNT0RfMShsdGM0MjQ1KTsKKworLyogSGVyZSBhcmUgbmFtZXMgb2YgdGhlIGNoaXAncyByZWdpc3RlcnMgKGEuay5hLiBjb21tYW5kcykgKi8KK2VudW0gbHRjNDI0NV9jbWQgeworCUxUQzQyNDVfU1RBVFVTCQkJPSAweDAwLCAvKiByZWFkb25seSAqLworCUxUQzQyNDVfQUxFUlQJCQk9IDB4MDEsCisJTFRDNDI0NV9DT05UUk9MCQkJPSAweDAyLAorCUxUQzQyNDVfT04JCQk9IDB4MDMsCisJTFRDNDI0NV9GQVVMVDEJCQk9IDB4MDQsCisJTFRDNDI0NV9GQVVMVDIJCQk9IDB4MDUsCisJTFRDNDI0NV9HUElPCQkJPSAweDA2LAorCUxUQzQyNDVfQURDQURSCQkJPSAweDA3LAorCisJTFRDNDI0NV8xMlZJTgkJCT0gMHgxMCwKKwlMVEM0MjQ1XzEyVlNFTlNFCQk9IDB4MTEsCisJTFRDNDI0NV8xMlZPVVQJCQk9IDB4MTIsCisJTFRDNDI0NV81VklOCQkJPSAweDEzLAorCUxUQzQyNDVfNVZTRU5TRQkJCT0gMHgxNCwKKwlMVEM0MjQ1XzVWT1VUCQkJPSAweDE1LAorCUxUQzQyNDVfM1ZJTgkJCT0gMHgxNiwKKwlMVEM0MjQ1XzNWU0VOU0UJCQk9IDB4MTcsCisJTFRDNDI0NV8zVk9VVAkJCT0gMHgxOCwKKwlMVEM0MjQ1X1ZFRUlOCQkJPSAweDE5LAorCUxUQzQyNDVfVkVFU0VOU0UJCT0gMHgxYSwKKwlMVEM0MjQ1X1ZFRU9VVAkJCT0gMHgxYiwKKwlMVEM0MjQ1X0dQSU9BREMxCQk9IDB4MWMsCisJTFRDNDI0NV9HUElPQURDMgkJPSAweDFkLAorCUxUQzQyNDVfR1BJT0FEQzMJCT0gMHgxZSwKK307CisKK3N0cnVjdCBsdGM0MjQ1X2RhdGEgeworCXN0cnVjdCBkZXZpY2UgKmh3bW9uX2RldjsKKworCXN0cnVjdCBtdXRleCB1cGRhdGVfbG9jazsKKwlib29sIHZhbGlkOworCXVuc2lnbmVkIGxvbmcgbGFzdF91cGRhdGVkOyAvKiBpbiBqaWZmaWVzICovCisKKwkvKiBDb250cm9sIHJlZ2lzdGVycyAqLworCXU4IGNyZWdzWzB4MDhdOworCisJLyogVm9sdGFnZSByZWdpc3RlcnMgKi8KKwl1OCB2cmVnc1sweDBmXTsKK307CisKK3N0YXRpYyBzdHJ1Y3QgbHRjNDI0NV9kYXRhICpsdGM0MjQ1X3VwZGF0ZV9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IGx0YzQyNDVfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXMzMiB2YWw7CisJaW50IGk7CisKKwltdXRleF9sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CisKKwlpZiAodGltZV9hZnRlcihqaWZmaWVzLCBkYXRhLT5sYXN0X3VwZGF0ZWQgKyBIWikgfHwgIWRhdGEtPnZhbGlkKSB7CisKKwkJZGV2X2RiZygmY2xpZW50LT5kZXYsICJTdGFydGluZyBsdGM0MjQ1IHVwZGF0ZVxuIik7CisKKwkJLyogUmVhZCBjb250cm9sIHJlZ2lzdGVycyAtLSAweDAwIHRvIDB4MDcgKi8KKwkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZGF0YS0+Y3JlZ3MpOyBpKyspIHsKKwkJCXZhbCA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIGkpOworCQkJaWYgKHVubGlrZWx5KHZhbCA8IDApKQorCQkJCWRhdGEtPmNyZWdzW2ldID0gMDsKKwkJCWVsc2UKKwkJCQlkYXRhLT5jcmVnc1tpXSA9IHZhbDsKKwkJfQorCisJCS8qIFJlYWQgdm9sdGFnZSByZWdpc3RlcnMgLS0gMHgxMCB0byAweDFmICovCisJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGRhdGEtPnZyZWdzKTsgaSsrKSB7CisJCQl2YWwgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBpKzB4MTApOworCQkJaWYgKHVubGlrZWx5KHZhbCA8IDApKQorCQkJCWRhdGEtPnZyZWdzW2ldID0gMDsKKwkJCWVsc2UKKwkJCQlkYXRhLT52cmVnc1tpXSA9IHZhbDsKKwkJfQorCisJCWRhdGEtPmxhc3RfdXBkYXRlZCA9IGppZmZpZXM7CisJCWRhdGEtPnZhbGlkID0gMTsKKwl9CisKKwltdXRleF91bmxvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKworCXJldHVybiBkYXRhOworfQorCisvKiBSZXR1cm4gdGhlIHZvbHRhZ2UgZnJvbSB0aGUgZ2l2ZW4gcmVnaXN0ZXIgaW4gbWlsbGl2b2x0cyAqLworc3RhdGljIGludCBsdGM0MjQ1X2dldF92b2x0YWdlKHN0cnVjdCBkZXZpY2UgKmRldiwgdTggcmVnKQoreworCXN0cnVjdCBsdGM0MjQ1X2RhdGEgKmRhdGEgPSBsdGM0MjQ1X3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwljb25zdCB1OCByZWd2YWwgPSBkYXRhLT52cmVnc1tyZWcgLSAweDEwXTsKKwl1MzIgdm9sdGFnZSA9IDA7CisKKwlzd2l0Y2ggKHJlZykgeworCWNhc2UgTFRDNDI0NV8xMlZJTjoKKwljYXNlIExUQzQyNDVfMTJWT1VUOgorCQl2b2x0YWdlID0gcmVndmFsICogNTU7CisJCWJyZWFrOworCWNhc2UgTFRDNDI0NV81VklOOgorCWNhc2UgTFRDNDI0NV81Vk9VVDoKKwkJdm9sdGFnZSA9IHJlZ3ZhbCAqIDIyOworCQlicmVhazsKKwljYXNlIExUQzQyNDVfM1ZJTjoKKwljYXNlIExUQzQyNDVfM1ZPVVQ6CisJCXZvbHRhZ2UgPSByZWd2YWwgKiAxNTsKKwkJYnJlYWs7CisJY2FzZSBMVEM0MjQ1X1ZFRUlOOgorCWNhc2UgTFRDNDI0NV9WRUVPVVQ6CisJCXZvbHRhZ2UgPSByZWd2YWwgKiAtNTU7CisJCWJyZWFrOworCWNhc2UgTFRDNDI0NV9HUElPQURDMToKKwljYXNlIExUQzQyNDVfR1BJT0FEQzI6CisJY2FzZSBMVEM0MjQ1X0dQSU9BREMzOgorCQl2b2x0YWdlID0gcmVndmFsICogMTA7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCS8qIElmIHdlIGdldCBoZXJlLCB0aGUgZGV2ZWxvcGVyIG1lc3NlZCB1cCAqLworCQlXQVJOX09OX09OQ0UoMSk7CisJCWJyZWFrOworCX0KKworCXJldHVybiB2b2x0YWdlOworfQorCisvKiBSZXR1cm4gdGhlIGN1cnJlbnQgaW4gdGhlIGdpdmVuIHNlbnNlIHJlZ2lzdGVyIGluIG1pbGxpQW1wZXJlcyAqLworc3RhdGljIHVuc2lnbmVkIGludCBsdGM0MjQ1X2dldF9jdXJyZW50KHN0cnVjdCBkZXZpY2UgKmRldiwgdTggcmVnKQoreworCXN0cnVjdCBsdGM0MjQ1X2RhdGEgKmRhdGEgPSBsdGM0MjQ1X3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwljb25zdCB1OCByZWd2YWwgPSBkYXRhLT52cmVnc1tyZWcgLSAweDEwXTsKKwl1bnNpZ25lZCBpbnQgdm9sdGFnZTsKKwl1bnNpZ25lZCBpbnQgY3VycjsKKworCS8qIFRoZSBzdHJhbmdlIGxvb2tpbmcgY29udmVyc2lvbnMgdGhhdCBmb2xsb3cgYXJlIGZpeGVkLXBvaW50CisJICogbWF0aCwgc2luY2Ugd2UgY2Fubm90IGRvIGZsb2F0aW5nIHBvaW50IGluIHRoZSBrZXJuZWwuCisJICoKKwkgKiBTdGVwIDE6IGNvbnZlcnQgc2Vuc2UgcmVnaXN0ZXIgdG8gbWljcm9Wb2x0cworCSAqIFN0ZXAgMjogY29udmVydCB2b2x0YWdlIHRvIG1pbGxpQW1wZXJlcworCSAqCisJICogSWYgeW91IHBsYXkgYXJvdW5kIHdpdGggdGhlIFY9SVIgZXF1YXRpb24sIHlvdSBjb21lIHVwIHdpdGgKKwkgKiB0aGUgZm9sbG93aW5nOiBYIHVWIC8gWSBtT2htID09IFogbUEKKwkgKgorCSAqIFdpdGggdGhlIHJlc2lzdG9ycyB0aGF0IGFyZSBmcmFjdGlvbnMgb2YgYSBtaWxsaU9obSwgd2UgbXVsdGlwbHkKKwkgKiB0aGUgdm9sdGFnZSBhbmQgcmVzaXN0YW5jZSBieSAxMCwgdG8gc2hpZnQgdGhlIGRlY2ltYWwgcG9pbnQuCisJICogTm93IHdlIGNhbiB1c2UgdGhlIG5vcm1hbCBkaXZpc2lvbiBvcGVyYXRvciBhZ2Fpbi4KKwkgKi8KKworCXN3aXRjaCAocmVnKSB7CisJY2FzZSBMVEM0MjQ1XzEyVlNFTlNFOgorCQl2b2x0YWdlID0gcmVndmFsICogMjUwOyAvKiB2b2x0YWdlIGluIHVWICovCisJCWN1cnIgPSB2b2x0YWdlIC8gNTA7IC8qIHNlbnNlIHJlc2lzdG9yIDUwIG1PaG0gKi8KKwkJYnJlYWs7CisJY2FzZSBMVEM0MjQ1XzVWU0VOU0U6CisJCXZvbHRhZ2UgPSByZWd2YWwgKiAxMjU7IC8qIHZvbHRhZ2UgaW4gdVYgKi8KKwkJY3VyciA9ICh2b2x0YWdlICogMTApIC8gMzU7IC8qIHNlbnNlIHJlc2lzdG9yIDMuNSBtT2htICovCisJCWJyZWFrOworCWNhc2UgTFRDNDI0NV8zVlNFTlNFOgorCQl2b2x0YWdlID0gcmVndmFsICogMTI1OyAvKiB2b2x0YWdlIGluIHVWICovCisJCWN1cnIgPSAodm9sdGFnZSAqIDEwKSAvIDI1OyAvKiBzZW5zZSByZXNpc3RvciAyLjUgbU9obSAqLworCQlicmVhazsKKwljYXNlIExUQzQyNDVfVkVFU0VOU0U6CisJCXZvbHRhZ2UgPSByZWd2YWwgKiAyNTA7IC8qIHZvbHRhZ2UgaW4gdVYgKi8KKwkJY3VyciA9IHZvbHRhZ2UgLyAxMDA7IC8qIHNlbnNlIHJlc2lzdG9yIDEwMCBtT2htICovCisJCWJyZWFrOworCWRlZmF1bHQ6CisJCS8qIElmIHdlIGdldCBoZXJlLCB0aGUgZGV2ZWxvcGVyIG1lc3NlZCB1cCAqLworCQlXQVJOX09OX09OQ0UoMSk7CisJCWN1cnIgPSAwOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gY3VycjsKK30KKworc3RhdGljIHNzaXplX3QgbHRjNDI0NV9zaG93X3ZvbHRhZ2Uoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGEsCisJCQkJICAgIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGUgKmF0dHIgPSB0b19zZW5zb3JfZGV2X2F0dHIoZGEpOworCWNvbnN0IGludCB2b2x0YWdlID0gbHRjNDI0NV9nZXRfdm9sdGFnZShkZXYsIGF0dHItPmluZGV4KTsKKworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkXG4iLCB2b2x0YWdlKTsKK30KKworc3RhdGljIHNzaXplX3QgbHRjNDI0NV9zaG93X2N1cnJlbnQoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGEsCisJCQkJICAgIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGUgKmF0dHIgPSB0b19zZW5zb3JfZGV2X2F0dHIoZGEpOworCWNvbnN0IHVuc2lnbmVkIGludCBjdXJyID0gbHRjNDI0NV9nZXRfY3VycmVudChkZXYsIGF0dHItPmluZGV4KTsKKworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiV1XG4iLCBjdXJyKTsKK30KKworc3RhdGljIHNzaXplX3QgbHRjNDI0NV9zaG93X3Bvd2VyKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkYSwKKwkJCQkgIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGUgKmF0dHIgPSB0b19zZW5zb3JfZGV2X2F0dHIoZGEpOworCWNvbnN0IHVuc2lnbmVkIGludCBjdXJyID0gbHRjNDI0NV9nZXRfY3VycmVudChkZXYsIGF0dHItPmluZGV4KTsKKwljb25zdCBpbnQgb3V0cHV0X3ZvbHRhZ2UgPSBsdGM0MjQ1X2dldF92b2x0YWdlKGRldiwgYXR0ci0+aW5kZXgrMSk7CisKKwkvKiBjdXJyZW50IGluIG1BICogdm9sdGFnZSBpbiBtViA9PSBwb3dlciBpbiB1VyAqLworCWNvbnN0IHVuc2lnbmVkIGludCBwb3dlciA9IGFicyhvdXRwdXRfdm9sdGFnZSAqIGN1cnIpOworCisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJXVcbiIsIHBvd2VyKTsKK30KKworc3RhdGljIHNzaXplX3QgbHRjNDI0NV9zaG93X2FsYXJtKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkJICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGEsCisJCQkJCSAgY2hhciAqYnVmKQoreworCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZV8yICphdHRyID0gdG9fc2Vuc29yX2Rldl9hdHRyXzIoZGEpOworCXN0cnVjdCBsdGM0MjQ1X2RhdGEgKmRhdGEgPSBsdGM0MjQ1X3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwljb25zdCB1OCByZWcgPSBkYXRhLT5jcmVnc1thdHRyLT5pbmRleF07CisJY29uc3QgdTMyIG1hc2sgPSBhdHRyLT5ucjsKKworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiV1XG4iLCAocmVnICYgbWFzaykgPyAxIDogMCk7Cit9CisKKy8qIFRoZXNlIG1hY3JvcyBhcmUgdXNlZCBiZWxvdyBpbiBjb25zdHJ1Y3RpbmcgZGV2aWNlIGF0dHJpYnV0ZSBvYmplY3RzCisgKiBmb3IgdXNlIHdpdGggc3lzZnNfY3JlYXRlX2dyb3VwKCkgdG8gbWFrZSBhIHN5c2ZzIGRldmljZSBmaWxlCisgKiBmb3IgZWFjaCByZWdpc3Rlci4KKyAqLworCisjZGVmaW5lIExUQzQyNDVfVk9MVEFHRShuYW1lLCBsdGM0MjQ1X2NtZF9pZHgpIFwKKwlzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKG5hbWUsIFNfSVJVR08sIFwKKwlsdGM0MjQ1X3Nob3dfdm9sdGFnZSwgTlVMTCwgbHRjNDI0NV9jbWRfaWR4KQorCisjZGVmaW5lIExUQzQyNDVfQ1VSUkVOVChuYW1lLCBsdGM0MjQ1X2NtZF9pZHgpIFwKKwlzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKG5hbWUsIFNfSVJVR08sIFwKKwlsdGM0MjQ1X3Nob3dfY3VycmVudCwgTlVMTCwgbHRjNDI0NV9jbWRfaWR4KQorCisjZGVmaW5lIExUQzQyNDVfUE9XRVIobmFtZSwgbHRjNDI0NV9jbWRfaWR4KSBcCisJc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihuYW1lLCBTX0lSVUdPLCBcCisJbHRjNDI0NV9zaG93X3Bvd2VyLCBOVUxMLCBsdGM0MjQ1X2NtZF9pZHgpCisKKyNkZWZpbmUgTFRDNDI0NV9BTEFSTShuYW1lLCBtYXNrLCByZWcpIFwKKwlzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSXzIobmFtZSwgU19JUlVHTywgXAorCWx0YzQyNDVfc2hvd19hbGFybSwgTlVMTCwgKG1hc2spLCByZWcpCisKKy8qIENvbnN0cnVjdCBhIHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlIHN0cnVjdHVyZSBmb3IgZWFjaCByZWdpc3RlciAqLworCisvKiBJbnB1dCB2b2x0YWdlcyAqLworTFRDNDI0NV9WT0xUQUdFKGluMV9pbnB1dCwJCQlMVEM0MjQ1XzEyVklOKTsKK0xUQzQyNDVfVk9MVEFHRShpbjJfaW5wdXQsCQkJTFRDNDI0NV81VklOKTsKK0xUQzQyNDVfVk9MVEFHRShpbjNfaW5wdXQsCQkJTFRDNDI0NV8zVklOKTsKK0xUQzQyNDVfVk9MVEFHRShpbjRfaW5wdXQsCQkJTFRDNDI0NV9WRUVJTik7CisKKy8qIElucHV0IHVuZGVydm9sdGFnZSBhbGFybXMgKi8KK0xUQzQyNDVfQUxBUk0oaW4xX21pbl9hbGFybSwJKDEgPDwgMCksCUxUQzQyNDVfRkFVTFQxKTsKK0xUQzQyNDVfQUxBUk0oaW4yX21pbl9hbGFybSwJKDEgPDwgMSksCUxUQzQyNDVfRkFVTFQxKTsKK0xUQzQyNDVfQUxBUk0oaW4zX21pbl9hbGFybSwJKDEgPDwgMiksCUxUQzQyNDVfRkFVTFQxKTsKK0xUQzQyNDVfQUxBUk0oaW40X21pbl9hbGFybSwJKDEgPDwgMyksCUxUQzQyNDVfRkFVTFQxKTsKKworLyogQ3VycmVudHMgKHZpYSBzZW5zZSByZXNpc3RvcikgKi8KK0xUQzQyNDVfQ1VSUkVOVChjdXJyMV9pbnB1dCwJCQlMVEM0MjQ1XzEyVlNFTlNFKTsKK0xUQzQyNDVfQ1VSUkVOVChjdXJyMl9pbnB1dCwJCQlMVEM0MjQ1XzVWU0VOU0UpOworTFRDNDI0NV9DVVJSRU5UKGN1cnIzX2lucHV0LAkJCUxUQzQyNDVfM1ZTRU5TRSk7CitMVEM0MjQ1X0NVUlJFTlQoY3VycjRfaW5wdXQsCQkJTFRDNDI0NV9WRUVTRU5TRSk7CisKKy8qIE92ZXJjdXJyZW50IGFsYXJtcyAqLworTFRDNDI0NV9BTEFSTShjdXJyMV9tYXhfYWxhcm0sCSgxIDw8IDQpLAlMVEM0MjQ1X0ZBVUxUMSk7CitMVEM0MjQ1X0FMQVJNKGN1cnIyX21heF9hbGFybSwJKDEgPDwgNSksCUxUQzQyNDVfRkFVTFQxKTsKK0xUQzQyNDVfQUxBUk0oY3VycjNfbWF4X2FsYXJtLAkoMSA8PCA2KSwJTFRDNDI0NV9GQVVMVDEpOworTFRDNDI0NV9BTEFSTShjdXJyNF9tYXhfYWxhcm0sCSgxIDw8IDcpLAlMVEM0MjQ1X0ZBVUxUMSk7CisKKy8qIE91dHB1dCB2b2x0YWdlcyAqLworTFRDNDI0NV9WT0xUQUdFKGluNV9pbnB1dCwJCQlMVEM0MjQ1XzEyVk9VVCk7CitMVEM0MjQ1X1ZPTFRBR0UoaW42X2lucHV0LAkJCUxUQzQyNDVfNVZPVVQpOworTFRDNDI0NV9WT0xUQUdFKGluN19pbnB1dCwJCQlMVEM0MjQ1XzNWT1VUKTsKK0xUQzQyNDVfVk9MVEFHRShpbjhfaW5wdXQsCQkJTFRDNDI0NV9WRUVPVVQpOworCisvKiBQb3dlciBCYWQgYWxhcm1zICovCitMVEM0MjQ1X0FMQVJNKGluNV9taW5fYWxhcm0sCSgxIDw8IDApLAlMVEM0MjQ1X0ZBVUxUMik7CitMVEM0MjQ1X0FMQVJNKGluNl9taW5fYWxhcm0sCSgxIDw8IDEpLAlMVEM0MjQ1X0ZBVUxUMik7CitMVEM0MjQ1X0FMQVJNKGluN19taW5fYWxhcm0sCSgxIDw8IDIpLAlMVEM0MjQ1X0ZBVUxUMik7CitMVEM0MjQ1X0FMQVJNKGluOF9taW5fYWxhcm0sCSgxIDw8IDMpLAlMVEM0MjQ1X0ZBVUxUMik7CisKKy8qIEdQSU8gdm9sdGFnZXMgKi8KK0xUQzQyNDVfVk9MVEFHRShpbjlfaW5wdXQsCQkJTFRDNDI0NV9HUElPQURDMSk7CitMVEM0MjQ1X1ZPTFRBR0UoaW4xMF9pbnB1dCwJCQlMVEM0MjQ1X0dQSU9BREMyKTsKK0xUQzQyNDVfVk9MVEFHRShpbjExX2lucHV0LAkJCUxUQzQyNDVfR1BJT0FEQzMpOworCisvKiBQb3dlciBDb25zdW1wdGlvbiAodmlydHVhbCkgKi8KK0xUQzQyNDVfUE9XRVIocG93ZXIxX2lucHV0LAkJCUxUQzQyNDVfMTJWU0VOU0UpOworTFRDNDI0NV9QT1dFUihwb3dlcjJfaW5wdXQsCQkJTFRDNDI0NV81VlNFTlNFKTsKK0xUQzQyNDVfUE9XRVIocG93ZXIzX2lucHV0LAkJCUxUQzQyNDVfM1ZTRU5TRSk7CitMVEM0MjQ1X1BPV0VSKHBvd2VyNF9pbnB1dCwJCQlMVEM0MjQ1X1ZFRVNFTlNFKTsKKworLyogRmluYWxseSwgY29uc3RydWN0IGFuIGFycmF5IG9mIHBvaW50ZXJzIHRvIG1lbWJlcnMgb2YgdGhlIGFib3ZlIG9iamVjdHMsCisgKiBhcyByZXF1aXJlZCBmb3Igc3lzZnNfY3JlYXRlX2dyb3VwKCkKKyAqLworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmx0YzQyNDVfYXR0cmlidXRlc1tdID0geworCSZzZW5zb3JfZGV2X2F0dHJfaW4xX2lucHV0LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9pbjJfaW5wdXQuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luM19pbnB1dC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfaW40X2lucHV0LmRldl9hdHRyLmF0dHIsCisKKwkmc2Vuc29yX2Rldl9hdHRyX2luMV9taW5fYWxhcm0uZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luMl9taW5fYWxhcm0uZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luM19taW5fYWxhcm0uZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luNF9taW5fYWxhcm0uZGV2X2F0dHIuYXR0ciwKKworCSZzZW5zb3JfZGV2X2F0dHJfY3VycjFfaW5wdXQuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2N1cnIyX2lucHV0LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9jdXJyM19pbnB1dC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfY3VycjRfaW5wdXQuZGV2X2F0dHIuYXR0ciwKKworCSZzZW5zb3JfZGV2X2F0dHJfY3VycjFfbWF4X2FsYXJtLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9jdXJyMl9tYXhfYWxhcm0uZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2N1cnIzX21heF9hbGFybS5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfY3VycjRfbWF4X2FsYXJtLmRldl9hdHRyLmF0dHIsCisKKwkmc2Vuc29yX2Rldl9hdHRyX2luNV9pbnB1dC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfaW42X2lucHV0LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9pbjdfaW5wdXQuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luOF9pbnB1dC5kZXZfYXR0ci5hdHRyLAorCisJJnNlbnNvcl9kZXZfYXR0cl9pbjVfbWluX2FsYXJtLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9pbjZfbWluX2FsYXJtLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9pbjdfbWluX2FsYXJtLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9pbjhfbWluX2FsYXJtLmRldl9hdHRyLmF0dHIsCisKKwkmc2Vuc29yX2Rldl9hdHRyX2luOV9pbnB1dC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfaW4xMF9pbnB1dC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfaW4xMV9pbnB1dC5kZXZfYXR0ci5hdHRyLAorCisJJnNlbnNvcl9kZXZfYXR0cl9wb3dlcjFfaW5wdXQuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX3Bvd2VyMl9pbnB1dC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfcG93ZXIzX2lucHV0LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9wb3dlcjRfaW5wdXQuZGV2X2F0dHIuYXR0ciwKKworCU5VTEwsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBsdGM0MjQ1X2dyb3VwID0geworCS5hdHRycyA9IGx0YzQyNDVfYXR0cmlidXRlcywKK307CisKK3N0YXRpYyBpbnQgbHRjNDI0NV9wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAorCQkJIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKK3sKKwlzdHJ1Y3QgbHRjNDI0NV9kYXRhICpkYXRhOworCWludCByZXQ7CisKKwlkYXRhID0ga3phbGxvYyhzaXplb2YoKmRhdGEpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRhdGEpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBvdXRfa3phbGxvYzsKKwl9CisKKwlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCBkYXRhKTsKKwltdXRleF9pbml0KCZkYXRhLT51cGRhdGVfbG9jayk7CisKKwkvKiBJbml0aWFsaXplIHRoZSBMVEM0MjQ1IGNoaXAgKi8KKwkvKiBUT0RPICovCisKKwkvKiBSZWdpc3RlciBzeXNmcyBob29rcyAqLworCXJldCA9IHN5c2ZzX2NyZWF0ZV9ncm91cCgmY2xpZW50LT5kZXYua29iaiwgJmx0YzQyNDVfZ3JvdXApOworCWlmIChyZXQpCisJCWdvdG8gb3V0X3N5c2ZzX2NyZWF0ZV9ncm91cDsKKworCWRhdGEtPmh3bW9uX2RldiA9IGh3bW9uX2RldmljZV9yZWdpc3RlcigmY2xpZW50LT5kZXYpOworCWlmIChJU19FUlIoZGF0YS0+aHdtb25fZGV2KSkgeworCQlyZXQgPSBQVFJfRVJSKGRhdGEtPmh3bW9uX2Rldik7CisJCWdvdG8gb3V0X2h3bW9uX2RldmljZV9yZWdpc3RlcjsKKwl9CisKKwlyZXR1cm4gMDsKKworb3V0X2h3bW9uX2RldmljZV9yZWdpc3RlcjoKKwlzeXNmc19yZW1vdmVfZ3JvdXAoJmNsaWVudC0+ZGV2LmtvYmosICZsdGM0MjQ1X2dyb3VwKTsKK291dF9zeXNmc19jcmVhdGVfZ3JvdXA6CisJa2ZyZWUoZGF0YSk7CitvdXRfa3phbGxvYzoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGx0YzQyNDVfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJc3RydWN0IGx0YzQyNDVfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCisJaHdtb25fZGV2aWNlX3VucmVnaXN0ZXIoZGF0YS0+aHdtb25fZGV2KTsKKwlzeXNmc19yZW1vdmVfZ3JvdXAoJmNsaWVudC0+ZGV2LmtvYmosICZsdGM0MjQ1X2dyb3VwKTsKKworCWtmcmVlKGRhdGEpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIENoZWNrIHRoYXQgc29tZSBiaXRzIGluIGEgY29udHJvbCByZWdpc3RlciBhcHBlYXIgYXQgYWxsIHBvc3NpYmxlCisgKiBsb2NhdGlvbnMgd2l0aG91dCBjaGFuZ2luZyB2YWx1ZQorICoKKyAqIEBjbGllbnQ6IHRoZSBpMmMgY2xpZW50IHRvIHVzZQorICogQHJlZzogdGhlIHJlZ2lzdGVyIHRvIHJlYWQKKyAqIEBiaXRzOiB0aGUgYml0cyB0byBjaGVjayAoMHhmZiBjaGVja3MgYWxsIGJpdHMsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDMgY2hlY2tzIG9ubHkgdGhlIGxhc3QgdHdvIGJpdHMpCisgKgorICogcmV0dXJuIC1FUlJOTyBpZiB0aGUgcmVnaXN0ZXIgcmVhZCBmYWlsZWQKKyAqIHJldHVybiAtRU5PREVWIGlmIHRoZSByZWdpc3RlciB2YWx1ZSBkb2Vzbid0IHN0YXkgY29uc3RhbnQgYXQgYWxsCisgKiBwb3NzaWJsZSBhZGRyZXNzZXMKKyAqCisgKiByZXR1cm4gMCBmb3Igc3VjY2VzcworICovCitzdGF0aWMgaW50IGx0YzQyNDVfY2hlY2tfY29udHJvbF9yZWcoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggcmVnLCB1OCBiaXRzKQoreworCWludCBpOworCXMzMiB2LCB2b2ZmMSwgdm9mZjI7CisKKwkvKiBSZWFkIHJlZ2lzdGVyIGFuZCBjaGVjayBmb3IgZXJyb3IgKi8KKwl2ID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgcmVnKTsKKwlpZiAodiA8IDApCisJCXJldHVybiB2OworCisJdiAmPSBiaXRzOworCisJZm9yIChpID0gMHgwMDsgaSA8IDB4ZmY7IGkgKz0gMHgyMCkgeworCisJCXZvZmYxID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgcmVnICsgaSk7CisJCWlmICh2b2ZmMSA8IDApCisJCQlyZXR1cm4gdm9mZjE7CisKKwkJdm9mZjIgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCByZWcgKyBpICsgMHgwOCk7CisJCWlmICh2b2ZmMiA8IDApCisJCQlyZXR1cm4gdm9mZjI7CisKKwkJdm9mZjEgJj0gYml0czsKKwkJdm9mZjIgJj0gYml0czsKKworCQlpZiAodiAhPSB2b2ZmMSB8fCB2ICE9IHZvZmYyKQorCQkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbHRjNDI0NV9kZXRlY3Qoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKKwkJCSAgaW50IGtpbmQsCisJCQkgIHN0cnVjdCBpMmNfYm9hcmRfaW5mbyAqaW5mbykKK3sKKwlzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIgPSBjbGllbnQtPmFkYXB0ZXI7CisKKwlpZiAoIWkyY19jaGVja19mdW5jdGlvbmFsaXR5KGFkYXB0ZXIsIEkyQ19GVU5DX1NNQlVTX0JZVEVfREFUQSkpCisJCXJldHVybiAtRU5PREVWOworCisJaWYgKGtpbmQgPCAwKSB7CQkvKiBwcm9iZWQgZGV0ZWN0aW9uIC0gY2hlY2sgdGhlIGNoaXAgdHlwZSAqLworCQlzMzIgdjsJCS8qIDggYml0cyBmcm9tIHRoZSBjaGlwLCBvciAtRVJSTk8gKi8KKworCQkvKiBDaGlwIHJlZ2lzdGVycyAweDAwLTB4MDcgYXJlIGNvbnRyb2wgcmVnaXN0ZXJzCisJCSAqIENoaXAgcmVnaXN0ZXJzIDB4MTAtMHgxZiBhcmUgZGF0YSByZWdpc3RlcnMKKwkJICoKKwkJICogQWRkcmVzcyBiaXRzIGI3LWI1IGFyZSBpZ25vcmVkLiBUaGlzIG1ha2VzIHRoZSBjaGlwICJyZXBlYXQiCisJCSAqIGluIHN0ZXBzIG9mIDB4MjAuIEFueSBjb250cm9sIHJlZ2lzdGVycyBzaG91bGQgYXBwZWFyIHdpdGgKKwkJICogdGhlIHNhbWUgdmFsdWVzIGFjcm9zcyBhbGwgZHVwbGljYXRlZCBhZGRyZXNzZXMuCisJCSAqCisJCSAqIFJlZ2lzdGVyIDB4MDIgYml0IGIyIGlzIHJlc2VydmVkLCBleHBlY3QgMAorCQkgKiBSZWdpc3RlciAweDA3IGJpdHMgYjcgdG8gYjQgYXJlIHJlc2VydmVkLCBleHBlY3QgMAorCQkgKgorCQkgKiBSZWdpc3RlcnMgMHgwMSwgMHgwMiBhcmUgY29udHJvbCByZWdpc3RlcnMgYW5kIHNob3VsZCBub3QKKwkJICogY2hhbmdlIG9uIHRoZWlyIG93bi4KKwkJICoKKwkJICogUmVnaXN0ZXIgMHgwNiBiaXRzIGI2IGFuZCBiNyBhcmUgY29udHJvbCBiaXRzLCBhbmQgc2hvdWxkCisJCSAqIG5vdCBjaGFuZ2Ugb24gdGhlaXIgb3duLgorCQkgKgorCQkgKiBSZWdpc3RlciAweDA3IGJpdHMgYjMgdG8gYjAgYXJlIGNvbnRyb2wgYml0cywgYW5kIHNob3VsZAorCQkgKiBub3QgY2hhbmdlIG9uIHRoZWlyIG93bi4KKwkJICovCisKKwkJLyogcmVhZCByZWdpc3RlciAweDAyIHJlc2VydmVkIGJpdCwgZXhwZWN0IDAgKi8KKwkJdiA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIExUQzQyNDVfQ09OVFJPTCk7CisJCWlmICh2IDwgMCB8fCAodiAmIDB4MDQpICE9IDApCisJCQlyZXR1cm4gLUVOT0RFVjsKKworCQkvKiByZWFkIHJlZ2lzdGVyIDB4MDcgcmVzZXJ2ZWQgYml0cywgZXhwZWN0IDAgKi8KKwkJdiA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIExUQzQyNDVfQURDQURSKTsKKwkJaWYgKHYgPCAwIHx8ICh2ICYgMHhmMCkgIT0gMCkKKwkJCXJldHVybiAtRU5PREVWOworCisJCS8qIGNoZWNrIHRoYXQgdGhlIGFsZXJ0IHJlZ2lzdGVyIGFwcGVhcnMgYXQgYWxsIGxvY2F0aW9ucyAqLworCQlpZiAobHRjNDI0NV9jaGVja19jb250cm9sX3JlZyhjbGllbnQsIExUQzQyNDVfQUxFUlQsIDB4ZmYpKQorCQkJcmV0dXJuIC1FTk9ERVY7CisKKwkJLyogY2hlY2sgdGhhdCB0aGUgY29udHJvbCByZWdpc3RlciBhcHBlYXJzIGF0IGFsbCBsb2NhdGlvbnMgKi8KKwkJaWYgKGx0YzQyNDVfY2hlY2tfY29udHJvbF9yZWcoY2xpZW50LCBMVEM0MjQ1X0NPTlRST0wsIDB4ZmYpKQorCQkJcmV0dXJuIC1FTk9ERVY7CisKKwkJLyogY2hlY2sgdGhhdCByZWdpc3RlciAweDA2IGJpdHMgYjYgYW5kIGI3IHN0YXkgY29uc3RhbnQgKi8KKwkJaWYgKGx0YzQyNDVfY2hlY2tfY29udHJvbF9yZWcoY2xpZW50LCBMVEM0MjQ1X0dQSU8sIDB4YzApKQorCQkJcmV0dXJuIC1FTk9ERVY7CisKKwkJLyogY2hlY2sgdGhhdCByZWdpc3RlciAweDA3IGJpdHMgYjMtYjAgc3RheSBjb25zdGFudCAqLworCQlpZiAobHRjNDI0NV9jaGVja19jb250cm9sX3JlZyhjbGllbnQsIExUQzQyNDVfQURDQURSLCAweDBmKSkKKwkJCXJldHVybiAtRU5PREVWOworCX0KKworCXN0cmxjcHkoaW5mby0+dHlwZSwgImx0YzQyNDUiLCBJMkNfTkFNRV9TSVpFKTsKKwlkZXZfaW5mbygmYWRhcHRlci0+ZGV2LCAibHRjNDI0NSAlcyBhdCBhZGRyZXNzIDB4JTAyeFxuIiwKKwkJCWtpbmQgPCAwID8gInByb2JlZCIgOiAiZm9yY2VkIiwKKwkJCWNsaWVudC0+YWRkcik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIGx0YzQyNDVfaWRbXSA9IHsKKwl7ICJsdGM0MjQ1IiwgbHRjNDI0NSB9LAorCXsgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCBsdGM0MjQ1X2lkKTsKKworLyogVGhpcyBpcyB0aGUgZHJpdmVyIHRoYXQgd2lsbCBiZSBpbnNlcnRlZCAqLworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGx0YzQyNDVfZHJpdmVyID0geworCS5jbGFzcwkJPSBJMkNfQ0xBU1NfSFdNT04sCisJLmRyaXZlciA9IHsKKwkJLm5hbWUJPSAibHRjNDI0NSIsCisJfSwKKwkucHJvYmUJCT0gbHRjNDI0NV9wcm9iZSwKKwkucmVtb3ZlCQk9IGx0YzQyNDVfcmVtb3ZlLAorCS5pZF90YWJsZQk9IGx0YzQyNDVfaWQsCisJLmRldGVjdAkJPSBsdGM0MjQ1X2RldGVjdCwKKwkuYWRkcmVzc19kYXRhCT0gJmFkZHJfZGF0YSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGx0YzQyNDVfaW5pdCh2b2lkKQoreworCXJldHVybiBpMmNfYWRkX2RyaXZlcigmbHRjNDI0NV9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgbHRjNDI0NV9leGl0KHZvaWQpCit7CisJaTJjX2RlbF9kcml2ZXIoJmx0YzQyNDVfZHJpdmVyKTsKK30KKworTU9EVUxFX0FVVEhPUigiSXJhIFcuIFNueWRlciA8aXdzQG92cm8uY2FsdGVjaC5lZHU+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkxUQzQyNDUgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK21vZHVsZV9pbml0KGx0YzQyNDVfaW5pdCk7Cittb2R1bGVfZXhpdChsdGM0MjQ1X2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9wYzg3MzYwLmMgYi9kcml2ZXJzL2h3bW9uL3BjODczNjAuYwppbmRleCA1ZmJmYTM0Li5mYjA1MmZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL3BjODczNjAuYworKysgYi9kcml2ZXJzL2h3bW9uL3BjODczNjAuYwpAQCAtNDMsNiArNDMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2h3bW9uLXZpZC5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvYWNwaS5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogCiBzdGF0aWMgdTggZGV2aWQ7CkBAIC0xNjI3LDYgKzE2MjgsMTEgQEAKIAkJCWNvbnRpbnVlOwogCQlyZXMuc3RhcnQgPSBleHRyYV9pc2FbaV07CiAJCXJlcy5lbmQgPSBleHRyYV9pc2FbaV0gKyBQQzg3MzYwX0VYVEVOVCAtIDE7CisKKwkJZXJyID0gYWNwaV9jaGVja19yZXNvdXJjZV9jb25mbGljdCgmcmVzKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gZXhpdF9kZXZpY2VfcHV0OworCiAJCWVyciA9IHBsYXRmb3JtX2RldmljZV9hZGRfcmVzb3VyY2VzKHBkZXYsICZyZXMsIDEpOwogCQlpZiAoZXJyKSB7CiAJCQlwcmludGsoS0VSTl9FUlIgInBjODczNjA6IERldmljZSByZXNvdXJjZVslZF0gIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9wYzg3NDI3LmMgYi9kcml2ZXJzL2h3bW9uL3BjODc0MjcuYwppbmRleCA3MjY1ZjIyLi4zYThhMGY3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL3BjODc0MjcuYworKysgYi9kcml2ZXJzL2h3bW9uL3BjODc0MjcuYwpAQCAtMzIsNiArMzIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9hY3BpLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAKIHN0YXRpYyB1bnNpZ25lZCBzaG9ydCBmb3JjZV9pZDsKQEAgLTUyNCw2ICs1MjUsMTAgQEAKIAl9OwogCWludCBlcnI7CiAKKwllcnIgPSBhY3BpX2NoZWNrX3Jlc291cmNlX2NvbmZsaWN0KCZyZXMpOworCWlmIChlcnIpCisJCWdvdG8gZXhpdDsKKwogCXBkZXYgPSBwbGF0Zm9ybV9kZXZpY2VfYWxsb2MoRFJWTkFNRSwgYWRkcmVzcyk7CiAJaWYgKCFwZGV2KSB7CiAJCWVyciA9IC1FTk9NRU07CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL3NpczU1OTUuYyBiL2RyaXZlcnMvaHdtb24vc2lzNTU5NS5jCmluZGV4IGEyNzY4MDYuLmFhMmU4MzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vc2lzNTU5NS5jCisrKyBiL2RyaXZlcnMvaHdtb24vc2lzNTU5NS5jCkBAIC02Miw2ICs2Miw3IEBACiAjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9hY3BpLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAKIApAQCAtNzI3LDYgKzcyOCwxMCBAQAogCX07CiAJaW50IGVycjsKIAorCWVyciA9IGFjcGlfY2hlY2tfcmVzb3VyY2VfY29uZmxpY3QoJnJlcyk7CisJaWYgKGVycikKKwkJZ290byBleGl0OworCiAJcGRldiA9IHBsYXRmb3JtX2RldmljZV9hbGxvYygic2lzNTU5NSIsIGFkZHJlc3MpOwogCWlmICghcGRldikgewogCQllcnIgPSAtRU5PTUVNOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9zbXNjNDdiMzk3LmMgYi9kcml2ZXJzL2h3bW9uL3Ntc2M0N2IzOTcuYwppbmRleCBlYjAzNTQ0Li42ZjZkNTJiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL3Ntc2M0N2IzOTcuYworKysgYi9kcml2ZXJzL2h3bW9uL3Ntc2M0N2IzOTcuYwpAQCAtMzYsNiArMzYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KIAogc3RhdGljIHVuc2lnbmVkIHNob3J0IGZvcmNlX2lkOwpAQCAtMzAzLDYgKzMwNCwxMCBAQAogCX07CiAJaW50IGVycjsKIAorCWVyciA9IGFjcGlfY2hlY2tfcmVzb3VyY2VfY29uZmxpY3QoJnJlcyk7CisJaWYgKGVycikKKwkJZ290byBleGl0OworCiAJcGRldiA9IHBsYXRmb3JtX2RldmljZV9hbGxvYyhEUlZOQU1FLCBhZGRyZXNzKTsKIAlpZiAoIXBkZXYpIHsKIAkJZXJyID0gLUVOT01FTTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vc21zYzQ3bTEuYyBiL2RyaXZlcnMvaHdtb24vc21zYzQ3bTEuYwppbmRleCBkMWI0OTg1Li5hOTJkYmI5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL3Ntc2M0N20xLmMKKysrIGIvZHJpdmVycy9od21vbi9zbXNjNDdtMS5jCkBAIC0zNyw2ICszNyw3IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9hY3BpLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAKIHN0YXRpYyB1bnNpZ25lZCBzaG9ydCBmb3JjZV9pZDsKQEAgLTcwNSw2ICs3MDYsMTAgQEAKIAl9OwogCWludCBlcnI7CiAKKwllcnIgPSBhY3BpX2NoZWNrX3Jlc291cmNlX2NvbmZsaWN0KCZyZXMpOworCWlmIChlcnIpCisJCWdvdG8gZXhpdDsKKwogCXBkZXYgPSBwbGF0Zm9ybV9kZXZpY2VfYWxsb2MoRFJWTkFNRSwgYWRkcmVzcyk7CiAJaWYgKCFwZGV2KSB7CiAJCWVyciA9IC1FTk9NRU07CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL3ZpYTY4NmEuYyBiL2RyaXZlcnMvaHdtb24vdmlhNjg2YS5jCmluZGV4IGYxZWU1ZTcuLmEwMjJhZWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vdmlhNjg2YS5jCisrKyBiL2RyaXZlcnMvaHdtb24vdmlhNjg2YS5jCkBAIC00MSw2ICs0MSw3IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9hY3BpLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAKIApAQCAtNzgzLDYgKzc4NCwxMCBAQAogCX07CiAJaW50IGVycjsKIAorCWVyciA9IGFjcGlfY2hlY2tfcmVzb3VyY2VfY29uZmxpY3QoJnJlcyk7CisJaWYgKGVycikKKwkJZ290byBleGl0OworCiAJcGRldiA9IHBsYXRmb3JtX2RldmljZV9hbGxvYygidmlhNjg2YSIsIGFkZHJlc3MpOwogCWlmICghcGRldikgewogCQllcnIgPSAtRU5PTUVNOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi92dDEyMTEuYyBiL2RyaXZlcnMvaHdtb24vdnQxMjExLmMKaW5kZXggMTJiNDM1OS4uYjBjZTM3OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi92dDEyMTEuYworKysgYi9kcml2ZXJzL2h3bW9uL3Z0MTIxMS5jCkBAIC0zMiw2ICszMiw3IEBACiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9hY3BpLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAKIHN0YXRpYyBpbnQgdWNoX2NvbmZpZyA9IC0xOwpAQCAtMTI1OSw2ICsxMjYwLDEwIEBACiAJfQogCiAJcmVzLm5hbWUgPSBwZGV2LT5uYW1lOworCWVyciA9IGFjcGlfY2hlY2tfcmVzb3VyY2VfY29uZmxpY3QoJnJlcyk7CisJaWYgKGVycikKKwkJZ290byBFWElUOworCiAJZXJyID0gcGxhdGZvcm1fZGV2aWNlX2FkZF9yZXNvdXJjZXMocGRldiwgJnJlcywgMSk7CiAJaWYgKGVycikgewogCQlwcmludGsoS0VSTl9FUlIgRFJWTkFNRSAiOiBEZXZpY2UgcmVzb3VyY2UgYWRkaXRpb24gZmFpbGVkICIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vdnQ4MjMxLmMgYi9kcml2ZXJzL2h3bW9uL3Z0ODIzMS5jCmluZGV4IDViYzU3MjcuLjk5ODJiNDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vdnQ4MjMxLmMKKysrIGIvZHJpdmVycy9od21vbi92dDgyMzEuYwpAQCAtMzUsNiArMzUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2h3bW9uLXZpZC5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvYWNwaS5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogCiBzdGF0aWMgaW50IGZvcmNlX2FkZHI7CkBAIC04OTQsNiArODk1LDEwIEBACiAJfTsKIAlpbnQgZXJyOwogCisJZXJyID0gYWNwaV9jaGVja19yZXNvdXJjZV9jb25mbGljdCgmcmVzKTsKKwlpZiAoZXJyKQorCQlnb3RvIGV4aXQ7CisKIAlwZGV2ID0gcGxhdGZvcm1fZGV2aWNlX2FsbG9jKCJ2dDgyMzEiLCBhZGRyZXNzKTsKIAlpZiAoIXBkZXYpIHsKIAkJZXJyID0gLUVOT01FTTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vdzgzNjI3ZWhmLmMgYi9kcml2ZXJzL2h3bW9uL3c4MzYyN2VoZi5jCmluZGV4IDA3NTE2NGQuLmNiODA4ZDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vdzgzNjI3ZWhmLmMKKysrIGIvZHJpdmVycy9od21vbi93ODM2MjdlaGYuYwpAQCAtNDgsNiArNDgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2h3bW9uLXZpZC5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvYWNwaS5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgImxtNzUuaCIKIApAQCAtNTAyLDcgKzUwMyw3IEBACiAJCX0KIAogCQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7Ci0JCQkvKiBwd21jZmcsIHRvbGFyYW5jZSBtYXBwZWQgZm9yIGk9MCwgaT0xIHRvIHNhbWUgcmVnICovCisJCQkvKiBwd21jZmcsIHRvbGVyYW5jZSBtYXBwZWQgZm9yIGk9MCwgaT0xIHRvIHNhbWUgcmVnICovCiAJCQlpZiAoaSAhPSAxKSB7CiAJCQkJcHdtY2ZnID0gdzgzNjI3ZWhmX3JlYWRfdmFsdWUoZGF0YSwKIAkJCQkJCVc4MzYyN0VIRl9SRUdfUFdNX0VOQUJMRVtpXSk7CkBAIC0xNTQ0LDYgKzE1NDUsMTEgQEAKIAlyZXMuc3RhcnQgPSBhZGRyZXNzICsgSU9SRUdJT05fT0ZGU0VUOwogCXJlcy5lbmQgPSBhZGRyZXNzICsgSU9SRUdJT05fT0ZGU0VUICsgSU9SRUdJT05fTEVOR1RIIC0gMTsKIAlyZXMuZmxhZ3MgPSBJT1JFU09VUkNFX0lPOworCisJZXJyID0gYWNwaV9jaGVja19yZXNvdXJjZV9jb25mbGljdCgmcmVzKTsKKwlpZiAoZXJyKQorCQlnb3RvIGV4aXQ7CisKIAllcnIgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkX3Jlc291cmNlcyhwZGV2LCAmcmVzLCAxKTsKIAlpZiAoZXJyKSB7CiAJCXByaW50ayhLRVJOX0VSUiBEUlZOQU1FICI6IERldmljZSByZXNvdXJjZSBhZGRpdGlvbiBmYWlsZWQgIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi93ODM2MjdoZi5jIGIvZHJpdmVycy9od21vbi93ODM2MjdoZi5jCmluZGV4IGIzMGU1NzkuLjM4OTE1MGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vdzgzNjI3aGYuYworKysgYi9kcml2ZXJzL2h3bW9uL3c4MzYyN2hmLmMKQEAgLTUwLDYgKzUwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlICJsbTc1LmgiCiAKQEAgLTE3OTMsNiArMTc5NCwxMCBAQAogCX07CiAJaW50IGVycjsKIAorCWVyciA9IGFjcGlfY2hlY2tfcmVzb3VyY2VfY29uZmxpY3QoJnJlcyk7CisJaWYgKGVycikKKwkJZ290byBleGl0OworCiAJcGRldiA9IHBsYXRmb3JtX2RldmljZV9hbGxvYyhEUlZOQU1FLCBhZGRyZXNzKTsKIAlpZiAoIXBkZXYpIHsKIAkJZXJyID0gLUVOT01FTTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vdzgzNzgxZC5jIGIvZHJpdmVycy9od21vbi93ODM3ODFkLmMKaW5kZXggZmMxMmJkNC4uZGJmYjMwYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi93ODM3ODFkLmMKKysrIGIvZHJpdmVycy9od21vbi93ODM3ODFkLmMKQEAgLTU4LDcgKzU4LDEwIEBACiAJCQkJCQkweDJlLCAweDJmLCBJMkNfQ0xJRU5UX0VORCB9OwogLyogSW5zbW9kIHBhcmFtZXRlcnMgKi8KIEkyQ19DTElFTlRfSU5TTU9EXzQodzgzNzgxZCwgdzgzNzgyZCwgdzgzNzgzcywgYXM5OTEyN2YpOwotSTJDX0NMSUVOVF9NT0RVTEVfUEFSTShmb3JjZV9zdWJjbGllbnRzLCAiTGlzdCBvZiBzdWJjbGllbnQgYWRkcmVzc2VzOiAiCisKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBmb3JjZV9zdWJjbGllbnRzWzRdOworbW9kdWxlX3BhcmFtX2FycmF5KGZvcmNlX3N1YmNsaWVudHMsIHNob3J0LCBOVUxMLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoZm9yY2Vfc3ViY2xpZW50cywgIkxpc3Qgb2Ygc3ViY2xpZW50IGFkZHJlc3NlczogIgogCQkgICAgIntidXMsIGNsaWVudGFkZHIsIHN1YmNsaWVudGFkZHIxLCBzdWJjbGllbnRhZGRyMn0iKTsKIAogc3RhdGljIGludCByZXNldDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vdzgzNzkxZC5jIGIvZHJpdmVycy9od21vbi93ODM3OTFkLmMKaW5kZXggNTc2OGRlZi4uOTc4NTFjNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi93ODM3OTFkLmMKKysrIGIvZHJpdmVycy9od21vbi93ODM3OTFkLmMKQEAgLTUzLDcgKzUzLDEwIEBACiAKIC8qIEluc21vZCBwYXJhbWV0ZXJzICovCiBJMkNfQ0xJRU5UX0lOU01PRF8xKHc4Mzc5MWQpOwotSTJDX0NMSUVOVF9NT0RVTEVfUEFSTShmb3JjZV9zdWJjbGllbnRzLCAiTGlzdCBvZiBzdWJjbGllbnQgYWRkcmVzc2VzOiAiCisKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBmb3JjZV9zdWJjbGllbnRzWzRdOworbW9kdWxlX3BhcmFtX2FycmF5KGZvcmNlX3N1YmNsaWVudHMsIHNob3J0LCBOVUxMLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoZm9yY2Vfc3ViY2xpZW50cywgIkxpc3Qgb2Ygc3ViY2xpZW50IGFkZHJlc3NlczogIgogCQkJIntidXMsIGNsaWVudGFkZHIsIHN1YmNsaWVudGFkZHIxLCBzdWJjbGllbnRhZGRyMn0iKTsKIAogc3RhdGljIGludCByZXNldDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vdzgzNzkyZC5jIGIvZHJpdmVycy9od21vbi93ODM3OTJkLmMKaW5kZXggY2Y5NGM1Yi4uMmJlMTYxOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi93ODM3OTJkLmMKKysrIGIvZHJpdmVycy9od21vbi93ODM3OTJkLmMKQEAgLTUxLDcgKzUxLDEwIEBACiAKIC8qIEluc21vZCBwYXJhbWV0ZXJzICovCiBJMkNfQ0xJRU5UX0lOU01PRF8xKHc4Mzc5MmQpOwotSTJDX0NMSUVOVF9NT0RVTEVfUEFSTShmb3JjZV9zdWJjbGllbnRzLCAiTGlzdCBvZiBzdWJjbGllbnQgYWRkcmVzc2VzOiAiCisKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBmb3JjZV9zdWJjbGllbnRzWzRdOworbW9kdWxlX3BhcmFtX2FycmF5KGZvcmNlX3N1YmNsaWVudHMsIHNob3J0LCBOVUxMLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoZm9yY2Vfc3ViY2xpZW50cywgIkxpc3Qgb2Ygc3ViY2xpZW50IGFkZHJlc3NlczogIgogCQkJIntidXMsIGNsaWVudGFkZHIsIHN1YmNsaWVudGFkZHIxLCBzdWJjbGllbnRhZGRyMn0iKTsKIAogc3RhdGljIGludCBpbml0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi93ODM3OTMuYyBiL2RyaXZlcnMvaHdtb24vdzgzNzkzLmMKaW5kZXggMGE3MzlmMS4uNDdkZDM5OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi93ODM3OTMuYworKysgYi9kcml2ZXJzL2h3bW9uL3c4Mzc5My5jCkBAIC00Miw3ICs0MiwxMCBAQAogCiAvKiBJbnNtb2QgcGFyYW1ldGVycyAqLwogSTJDX0NMSUVOVF9JTlNNT0RfMSh3ODM3OTMpOwotSTJDX0NMSUVOVF9NT0RVTEVfUEFSTShmb3JjZV9zdWJjbGllbnRzLCAiTGlzdCBvZiBzdWJjbGllbnQgYWRkcmVzc2VzOiAiCisKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBmb3JjZV9zdWJjbGllbnRzWzRdOworbW9kdWxlX3BhcmFtX2FycmF5KGZvcmNlX3N1YmNsaWVudHMsIHNob3J0LCBOVUxMLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoZm9yY2Vfc3ViY2xpZW50cywgIkxpc3Qgb2Ygc3ViY2xpZW50IGFkZHJlc3NlczogIgogCQkgICAgICAgIntidXMsIGNsaWVudGFkZHIsIHN1YmNsaWVudGFkZHIxLCBzdWJjbGllbnRhZGRyMn0iKTsKIAogc3RhdGljIGludCByZXNldDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtYWxpMTU2My5jIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1hbGkxNTYzLmMKaW5kZXggZmMzZTViMC4uZGQ5ZTc5NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1hbGkxNTYzLmMKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1hbGkxNTYzLmMKQEAgLTM5OSw4ICszOTksOCBAQAogCWlmICgoZXJyb3IgPSBhbGkxNTYzX3NldHVwKGRldikpKQogCQlnb3RvIGV4aXQ7CiAJYWxpMTU2M19hZGFwdGVyLmRldi5wYXJlbnQgPSAmZGV2LT5kZXY7Ci0Jc3ByaW50ZihhbGkxNTYzX2FkYXB0ZXIubmFtZSwiU01CdXMgQUxpIDE1NjMgQWRhcHRlciBAICUwNHgiLAotCQlhbGkxNTYzX3NtYmEpOworCXNucHJpbnRmKGFsaTE1NjNfYWRhcHRlci5uYW1lLCBzaXplb2YoYWxpMTU2M19hZGFwdGVyLm5hbWUpLAorCQkgIlNNQnVzIEFMaSAxNTYzIEFkYXB0ZXIgQCAlMDR4IiwgYWxpMTU2M19zbWJhKTsKIAlpZiAoKGVycm9yID0gaTJjX2FkZF9hZGFwdGVyKCZhbGkxNTYzX2FkYXB0ZXIpKSkKIAkJZ290byBleGl0X3NodXRkb3duOwogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1hbWQ3NTYtczQ4ODIuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtYW1kNzU2LXM0ODgyLmMKaW5kZXggOGJhMmJjZi4uMzc4ZmNiNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1hbWQ3NTYtczQ4ODIuYworKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWFtZDc1Ni1zNDg4Mi5jCkBAIC0xOTcsOCArMTk3LDggQEAKIAlmb3IgKGkgPSAxOyBpIDwgNTsgaSsrKSB7CiAJCXM0ODgyX2FsZ29baV0gPSAqKGFtZDc1Nl9zbWJ1cy5hbGdvKTsKIAkJczQ4ODJfYWRhcHRlcltpXSA9IGFtZDc1Nl9zbWJ1czsKLQkJc3ByaW50ZihzNDg4Ml9hZGFwdGVyW2ldLm5hbWUsCi0JCQkiU01CdXMgODExMSBhZGFwdGVyIChDUFUlZCkiLCBpLTEpOworCQlzbnByaW50ZihzNDg4Ml9hZGFwdGVyW2ldLm5hbWUsIHNpemVvZihzNDg4Ml9hZGFwdGVyW2ldLm5hbWUpLAorCQkJICJTTUJ1cyA4MTExIGFkYXB0ZXIgKENQVSVkKSIsIGktMSk7CiAJCXM0ODgyX2FkYXB0ZXJbaV0uYWxnbyA9IHM0ODgyX2FsZ28raTsKIAkJczQ4ODJfYWRhcHRlcltpXS5kZXYucGFyZW50ID0gYW1kNzU2X3NtYnVzLmRldi5wYXJlbnQ7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1hbWQ3NTYuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtYW1kNzU2LmMKaW5kZXggNDI0ZGFkNi4uMzZiZWU1YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1hbWQ3NTYuYworKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWFtZDc1Ni5jCkBAIC0zODAsOCArMzgwLDkgQEAKIAkvKiBzZXQgdXAgdGhlIHN5c2ZzIGxpbmthZ2UgdG8gb3VyIHBhcmVudCBkZXZpY2UgKi8KIAlhbWQ3NTZfc21idXMuZGV2LnBhcmVudCA9ICZwZGV2LT5kZXY7CiAKLQlzcHJpbnRmKGFtZDc1Nl9zbWJ1cy5uYW1lLCAiU01CdXMgJXMgYWRhcHRlciBhdCAlMDR4IiwKLQkJY2hpcG5hbWVbaWQtPmRyaXZlcl9kYXRhXSwgYW1kNzU2X2lvcG9ydCk7CisJc25wcmludGYoYW1kNzU2X3NtYnVzLm5hbWUsIHNpemVvZihhbWQ3NTZfc21idXMubmFtZSksCisJCSAiU01CdXMgJXMgYWRhcHRlciBhdCAlMDR4IiwgY2hpcG5hbWVbaWQtPmRyaXZlcl9kYXRhXSwKKwkJIGFtZDc1Nl9pb3BvcnQpOwogCiAJZXJyb3IgPSBpMmNfYWRkX2FkYXB0ZXIoJmFtZDc1Nl9zbWJ1cyk7CiAJaWYgKGVycm9yKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWF0OTEuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtYXQ5MS5jCmluZGV4IDllZmIwMjEuLjY3ZDlkYzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtYXQ5MS5jCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtYXQ5MS5jCkBAIC0yMjIsNyArMjIyLDcgQEAKIAkJcmMgPSAtRU5PTUVNOwogCQlnb3RvIGZhaWwyOwogCX0KLQlzcHJpbnRmKGFkYXB0ZXItPm5hbWUsICJBVDkxIik7CisJc25wcmludGYoYWRhcHRlci0+bmFtZSwgc2l6ZW9mKGFkYXB0ZXItPm5hbWUpLCAiQVQ5MSIpOwogCWFkYXB0ZXItPmFsZ28gPSAmYXQ5MV9hbGdvcml0aG07CiAJYWRhcHRlci0+Y2xhc3MgPSBJMkNfQ0xBU1NfSFdNT047CiAJYWRhcHRlci0+ZGV2LnBhcmVudCA9ICZwZGV2LT5kZXY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWJmaW4tdHdpLmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWJmaW4tdHdpLmMKaW5kZXggM2M4NTVmZi4uM2ZkMmM0MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1iZmluLXR3aS5jCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtYmZpbi10d2kuYwpAQCAtNjU2LDcgKzY1Niw3IEBACiAJc3RybGNweShwX2FkYXAtPm5hbWUsIHBkZXYtPm5hbWUsIHNpemVvZihwX2FkYXAtPm5hbWUpKTsKIAlwX2FkYXAtPmFsZ28gPSAmYmZpbl90d2lfYWxnb3JpdGhtOwogCXBfYWRhcC0+YWxnb19kYXRhID0gaWZhY2U7Ci0JcF9hZGFwLT5jbGFzcyA9IEkyQ19DTEFTU19BTEw7CisJcF9hZGFwLT5jbGFzcyA9IEkyQ19DTEFTU19IV01PTiB8IEkyQ19DTEFTU19TUEQ7CiAJcF9hZGFwLT5kZXYucGFyZW50ID0gJnBkZXYtPmRldjsKIAogCXJjID0gcGVyaXBoZXJhbF9yZXF1ZXN0X2xpc3QocGluX3JlcVtwZGV2LT5pZF0sICJpMmMtYmZpbi10d2kiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtaTgwMS5jIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1pODAxLmMKaW5kZXggNTEyM2ViNi4uNTI2NjI1ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1pODAxLmMKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1pODAxLmMKQEAgLTY0LDcgKzY0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CiAjaW5jbHVkZSA8bGludXgvYWNwaS5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAKIC8qIEk4MDEgU01CdXMgYWRkcmVzcyBvZmZzZXRzICovCiAjZGVmaW5lIFNNQkhTVFNUUwkoMCArIGk4MDFfc21iYSkKQEAgLTU4Myw2ICs1ODMsNDAgQEAKIAogTU9EVUxFX0RFVklDRV9UQUJMRSAocGNpLCBpODAxX2lkcyk7CiAKKyNpZiBkZWZpbmVkIENPTkZJR19JTlBVVF9BUEFORUwgfHwgZGVmaW5lZCBDT05GSUdfSU5QVVRfQVBBTkVMX01PRFVMRQorc3RhdGljIHVuc2lnbmVkIGNoYXIgYXBhbmVsX2FkZHI7CisKKy8qIFNjYW4gdGhlIHN5c3RlbSBST00gZm9yIHRoZSBzaWduYXR1cmUgIkZKS0VZSU5GIiAqLworc3RhdGljIF9faW5pdCBjb25zdCB2b2lkIF9faW9tZW0gKmJpb3Nfc2lnbmF0dXJlKGNvbnN0IHZvaWQgX19pb21lbSAqYmlvcykKK3sKKwlzc2l6ZV90IG9mZnNldDsKKwljb25zdCB1bnNpZ25lZCBjaGFyIHNpZ25hdHVyZVtdID0gIkZKS0VZSU5GIjsKKworCWZvciAob2Zmc2V0ID0gMDsgb2Zmc2V0IDwgMHgxMDAwMDsgb2Zmc2V0ICs9IDB4MTApIHsKKwkJaWYgKGNoZWNrX3NpZ25hdHVyZShiaW9zICsgb2Zmc2V0LCBzaWduYXR1cmUsCisJCQkJICAgIHNpemVvZihzaWduYXR1cmUpLTEpKQorCQkJcmV0dXJuIGJpb3MgKyBvZmZzZXQ7CisJfQorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgaW5wdXRfYXBhbmVsX2luaXQodm9pZCkKK3sKKwl2b2lkIF9faW9tZW0gKmJpb3M7CisJY29uc3Qgdm9pZCBfX2lvbWVtICpwOworCisJYmlvcyA9IGlvcmVtYXAoMHhGMDAwMCwgMHgxMDAwMCk7IC8qIENhbid0IGZhaWwgKi8KKwlwID0gYmlvc19zaWduYXR1cmUoYmlvcyk7CisJaWYgKHApIHsKKwkJLyoganVzdCB1c2UgdGhlIGZpcnN0IGFkZHJlc3MgKi8KKwkJYXBhbmVsX2FkZHIgPSByZWFkYihwICsgOCArIDMpID4+IDE7CisJfQorCWlvdW5tYXAoYmlvcyk7Cit9CisjZWxzZQorc3RhdGljIHZvaWQgX19pbml0IGlucHV0X2FwYW5lbF9pbml0KHZvaWQpIHt9CisjZW5kaWYKKwogc3RhdGljIGludCBfX2RldmluaXQgaTgwMV9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpCiB7CiAJdW5zaWduZWQgY2hhciB0ZW1wOwpAQCAtNjY3LDYgKzcwMSwxOSBAQAogCQlkZXZfZXJyKCZkZXYtPmRldiwgIkZhaWxlZCB0byBhZGQgU01CdXMgYWRhcHRlclxuIik7CiAJCWdvdG8gZXhpdF9yZWxlYXNlOwogCX0KKworCS8qIFJlZ2lzdGVyIG9wdGlvbmFsIHNsYXZlcyAqLworI2lmIGRlZmluZWQgQ09ORklHX0lOUFVUX0FQQU5FTCB8fCBkZWZpbmVkIENPTkZJR19JTlBVVF9BUEFORUxfTU9EVUxFCisJaWYgKGFwYW5lbF9hZGRyKSB7CisJCXN0cnVjdCBpMmNfYm9hcmRfaW5mbyBpbmZvOworCisJCW1lbXNldCgmaW5mbywgMCwgc2l6ZW9mKHN0cnVjdCBpMmNfYm9hcmRfaW5mbykpOworCQlpbmZvLmFkZHIgPSBhcGFuZWxfYWRkcjsKKwkJc3RybGNweShpbmZvLnR5cGUsICJmdWppdHN1X2FwYW5lbCIsIEkyQ19OQU1FX1NJWkUpOworCQlpMmNfbmV3X2RldmljZSgmaTgwMV9hZGFwdGVyLCAmaW5mbyk7CisJfQorI2VuZGlmCisKIAlyZXR1cm4gMDsKIAogZXhpdF9yZWxlYXNlOgpAQCAtNzE3LDYgKzc2NCw3IEBACiAKIHN0YXRpYyBpbnQgX19pbml0IGkyY19pODAxX2luaXQodm9pZCkKIHsKKwlpbnB1dF9hcGFuZWxfaW5pdCgpOwogCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZpODAxX2RyaXZlcik7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtcHhhLmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXB4YS5jCmluZGV4IDU4N2Y1YjIuLjZhZjY4MTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtcHhhLmMKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1weGEuYwpAQCAtMTA3NiwxMCArMTA3NiwxMCBAQAogCiAjaWZkZWYgQ09ORklHX0kyQ19QWEFfU0xBVkUKIAlwcmludGsoS0VSTl9JTkZPICJJMkM6ICVzOiBQWEEgSTJDIGFkYXB0ZXIsIHNsYXZlIGFkZHJlc3MgJWRcbiIsCi0JICAgICAgIGkyYy0+YWRhcC5kZXYuYnVzX2lkLCBpMmMtPnNsYXZlX2FkZHIpOworCSAgICAgICBkZXZfbmFtZSgmaTJjLT5hZGFwLmRldiksIGkyYy0+c2xhdmVfYWRkcik7CiAjZWxzZQogCXByaW50ayhLRVJOX0lORk8gIkkyQzogJXM6IFBYQSBJMkMgYWRhcHRlclxuIiwKLQkgICAgICAgaTJjLT5hZGFwLmRldi5idXNfaWQpOworCSAgICAgICBkZXZfbmFtZSgmaTJjLT5hZGFwLmRldikpOwogI2VuZGlmCiAJcmV0dXJuIDA7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtczNjMjQxMC5jIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1zM2MyNDEwLmMKaW5kZXggZjY5ZjkxZi4uNWI3Zjk1NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1zM2MyNDEwLmMKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1zM2MyNDEwLmMKQEAgLTkwNiw3ICs5MDYsNyBAQAogCiAJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgaTJjKTsKIAotCWRldl9pbmZvKCZwZGV2LT5kZXYsICIlczogUzNDIEkyQyBhZGFwdGVyXG4iLCBpMmMtPmFkYXAuZGV2LmJ1c19pZCk7CisJZGV2X2luZm8oJnBkZXYtPmRldiwgIiVzOiBTM0MgSTJDIGFkYXB0ZXJcbiIsIGRldl9uYW1lKCZpMmMtPmFkYXAuZGV2KSk7CiAJcmV0dXJuIDA7CiAKICBlcnJfY3B1ZnJlcToKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtc2g3NzYwLmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXNoNzc2MC5jCmluZGV4IDVlMGUyNTQuLmJhYTI4YjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtc2g3NzYwLmMKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1zaDc3NjAuYwpAQCAtNDc1LDcgKzQ3NSw3IEBACiAKIAlpZC0+YWRhcC5uciA9IHBkZXYtPmlkOwogCWlkLT5hZGFwLmFsZ28gPSAmc2g3NzYwX2kyY19hbGdvOwotCWlkLT5hZGFwLmNsYXNzID0gSTJDX0NMQVNTX0FMTDsKKwlpZC0+YWRhcC5jbGFzcyA9IEkyQ19DTEFTU19IV01PTiB8IEkyQ19DTEFTU19TUEQ7CiAJaWQtPmFkYXAucmV0cmllcyA9IDM7CiAJaWQtPmFkYXAuYWxnb19kYXRhID0gaWQ7CiAJaWQtPmFkYXAuZGV2LnBhcmVudCA9ICZwZGV2LT5kZXY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXNoX21vYmlsZS5jIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1zaF9tb2JpbGUuYwppbmRleCA2YzNkNjBiLi4xYzAxMDgzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXNoX21vYmlsZS5jCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtc2hfbW9iaWxlLmMKQEAgLTUwMCw3ICs1MDAsNyBAQAogCXdoaWxlICgocmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKGRldiwgSU9SRVNPVVJDRV9JUlEsIGspKSkgewogCQlmb3IgKG4gPSByZXMtPnN0YXJ0OyBob29rICYmIG4gPD0gcmVzLT5lbmQ7IG4rKykgewogCQkJaWYgKHJlcXVlc3RfaXJxKG4sIHNoX21vYmlsZV9pMmNfaXNyLCBJUlFGX0RJU0FCTEVELAotCQkJCQlkZXYtPmRldi5idXNfaWQsIGRldikpCisJCQkJCWRldl9uYW1lKCZkZXYtPmRldiksIGRldikpCiAJCQkJZ290byByb2xsYmFjazsKIAkJfQogCQlrKys7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXNpczU1OTUuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtc2lzNTU5NS5jCmluZGV4IGRmYzJkNWUuLjhjZTJkYWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtc2lzNTU5NS5jCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtc2lzNTU5NS5jCkBAIC0zODksOCArMzg5LDggQEAKIAkvKiBzZXQgdXAgdGhlIHN5c2ZzIGxpbmthZ2UgdG8gb3VyIHBhcmVudCBkZXZpY2UgKi8KIAlzaXM1NTk1X2FkYXB0ZXIuZGV2LnBhcmVudCA9ICZkZXYtPmRldjsKIAotCXNwcmludGYoc2lzNTU5NV9hZGFwdGVyLm5hbWUsICJTTUJ1cyBTSVM1NTk1IGFkYXB0ZXIgYXQgJTA0eCIsCi0JCXNpczU1OTVfYmFzZSArIFNNQl9JTkRFWCk7CisJc25wcmludGYoc2lzNTU5NV9hZGFwdGVyLm5hbWUsIHNpemVvZihzaXM1NTk1X2FkYXB0ZXIubmFtZSksCisJCSAiU01CdXMgU0lTNTU5NSBhZGFwdGVyIGF0ICUwNHgiLCBzaXM1NTk1X2Jhc2UgKyBTTUJfSU5ERVgpOwogCWVyciA9IGkyY19hZGRfYWRhcHRlcigmc2lzNTU5NV9hZGFwdGVyKTsKIAlpZiAoZXJyKSB7CiAJCXJlbGVhc2VfcmVnaW9uKHNpczU1OTVfYmFzZSArIFNNQl9JTkRFWCwgMik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXNpczYzMC5jIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1zaXM2MzAuYwppbmRleCBlN2M0Yjc5Li45YzljMDE2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXNpczYzMC5jCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtc2lzNjMwLmMKQEAgLTQ4Nyw4ICs0ODcsOCBAQAogCS8qIHNldCB1cCB0aGUgc3lzZnMgbGlua2FnZSB0byBvdXIgcGFyZW50IGRldmljZSAqLwogCXNpczYzMF9hZGFwdGVyLmRldi5wYXJlbnQgPSAmZGV2LT5kZXY7CiAKLQlzcHJpbnRmKHNpczYzMF9hZGFwdGVyLm5hbWUsICJTTUJ1cyBTSVM2MzAgYWRhcHRlciBhdCAlMDR4IiwKLQkJYWNwaV9iYXNlICsgU01CX1NUUyk7CisJc25wcmludGYoc2lzNjMwX2FkYXB0ZXIubmFtZSwgc2l6ZW9mKHNpczYzMF9hZGFwdGVyLm5hbWUpLAorCQkgIlNNQnVzIFNJUzYzMCBhZGFwdGVyIGF0ICUwNHgiLCBhY3BpX2Jhc2UgKyBTTUJfU1RTKTsKIAogCXJldHVybiBpMmNfYWRkX2FkYXB0ZXIoJnNpczYzMF9hZGFwdGVyKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2NoaXBzL0tjb25maWcgYi9kcml2ZXJzL2kyYy9jaGlwcy9LY29uZmlnCmluZGV4IDg2NGFjNTYuLmI5YmVmMDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2NoaXBzL0tjb25maWcKKysrIGIvZHJpdmVycy9pMmMvY2hpcHMvS2NvbmZpZwpAQCAtMTE0LDE4ICsxMTQsNiBAQAogCSAgVGhlc2UgZGV2aWNlcyBhcmUgaGFyZCB0byBkZXRlY3QgYW5kIHJhcmVseSBmb3VuZCBvbiBtYWluc3RyZWFtCiAJICBoYXJkd2FyZS4gIElmIHVuc3VyZSwgc2F5IE4uCiAKLWNvbmZpZyBJU1AxMzAxX09NQVAKLQl0cmlzdGF0ZSAiUGhpbGlwcyBJU1AxMzAxIHdpdGggT01BUCBPVEciCi0JZGVwZW5kcyBvbiBBUkNIX09NQVBfT1RHCi0JaGVscAotCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIHRoZSBQaGlsaXBzIElTUDEzMDEKLQkgIFVTQi1Pbi1UaGUtR28gdHJhbnNjZWl2ZXIgd29ya2luZyB3aXRoIHRoZSBPTUFQIE9URyBjb250cm9sbGVyLgotCSAgVGhlIElTUDEzMDEgaXMgdXNlZCBpbiBwcm9kdWN0cyBpbmNsdWRpbmcgSDIgYW5kIEgzIGRldmVsb3BtZW50Ci0JICBib2FyZHMgZm9yIFRleGFzIEluc3RydW1lbnRzIE9NQVAgcHJvY2Vzc29ycy4KLQkgIAotCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQotCSAgd2lsbCBiZSBjYWxsZWQgaXNwMTMwMV9vbWFwLgotCiBjb25maWcgU0VOU09SU19NQVg2ODc1CiAJdHJpc3RhdGUgIk1heGltIE1BWDY4NzUgUG93ZXIgc3VwcGx5IHN1cGVydmlzb3IiCiAJZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwKQEAgLTE1MSwxNSArMTM5LDQgQEAKIAkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKIAkgIHdpbGwgYmUgY2FsbGVkIHRzbDI1NTAuCiAKLWNvbmZpZyBNQ1VfTVBDODM0OUVNSVRYCi0JdHJpc3RhdGUgIk1QQzgzNDlFLW1JVFggTUNVIGRyaXZlciIKLQlkZXBlbmRzIG9uIEkyQyAmJiBQUENfODN4eAotCXNlbGVjdCBHRU5FUklDX0dQSU8KLQlzZWxlY3QgQVJDSF9SRVFVSVJFX0dQSU9MSUIKLQloZWxwCi0JICBTYXkgWSBoZXJlIHRvIGVuYWJsZSBzb2Z0IHBvd2VyLW9mZiBmdW5jdGlvbmFsaXR5IG9uIHRoZSBGcmVlc2NhbGUKLQkgIGJvYXJkcyB3aXRoIHRoZSBNUEM4MzQ5RS1tSVRYLWNvbXBhdGlibGUgTUNVIGNoaXBzLiBUaGlzIGRyaXZlciB3aWxsCi0JICBhbHNvIHJlZ2lzdGVyIE1DVSBHUElPcyB3aXRoIHRoZSBnZW5lcmljIEdQSU8gQVBJLCBzbyB5b3UnbGwgYWJsZQotCSAgdG8gdXNlIE1DVSBwaW5zIGFzIEdQSU9zLgotCiBlbmRtZW51CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9jaGlwcy9NYWtlZmlsZSBiL2RyaXZlcnMvaTJjL2NoaXBzL01ha2VmaWxlCmluZGV4IDhiOTVmNDEuLjAwZmNiNTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2NoaXBzL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvaTJjL2NoaXBzL01ha2VmaWxlCkBAIC0xOCw5ICsxOCw3IEBACiBvYmotJChDT05GSUdfU0VOU09SU19QQ0Y4NTc0KQkrPSBwY2Y4NTc0Lm8KIG9iai0kKENPTkZJR19QQ0Y4NTc1KQkJKz0gcGNmODU3NS5vCiBvYmotJChDT05GSUdfU0VOU09SU19QQ0Y4NTkxKQkrPSBwY2Y4NTkxLm8KLW9iai0kKENPTkZJR19JU1AxMzAxX09NQVApCSs9IGlzcDEzMDFfb21hcC5vCiBvYmotJChDT05GSUdfU0VOU09SU19UU0wyNTUwKQkrPSB0c2wyNTUwLm8KLW9iai0kKENPTkZJR19NQ1VfTVBDODM0OUVNSVRYKQkrPSBtY3VfbXBjODM0OWVtaXR4Lm8KIAogaWZlcSAoJChDT05GSUdfSTJDX0RFQlVHX0NISVApLHkpCiBFWFRSQV9DRkxBR1MgKz0gLURERUJVRwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvaTJjLWNvcmUuYyBiL2RyaXZlcnMvaTJjL2kyYy1jb3JlLmMKaW5kZXggYzZhNjNmNC4uYjFjOWFiZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvaTJjLWNvcmUuYworKysgYi9kcml2ZXJzL2kyYy9pMmMtY29yZS5jCkBAIC00NTksNyArNDU5LDcgQEAKIAkJcHJfZGVidWcoIkkyQyBhZGFwdGVyIGRyaXZlciBbJXNdIGZvcmdvdCB0byBzcGVjaWZ5ICIKIAkJCSAicGh5c2ljYWwgZGV2aWNlXG4iLCBhZGFwLT5uYW1lKTsKIAl9Ci0Jc3ByaW50ZihhZGFwLT5kZXYuYnVzX2lkLCAiaTJjLSVkIiwgYWRhcC0+bnIpOworCWRldl9zZXRfbmFtZSgmYWRhcC0+ZGV2LCAiaTJjLSVkIiwgYWRhcC0+bnIpOwogCWFkYXAtPmRldi5yZWxlYXNlID0gJmkyY19hZGFwdGVyX2Rldl9yZWxlYXNlOwogCWFkYXAtPmRldi5jbGFzcyA9ICZpMmNfYWRhcHRlcl9jbGFzczsKIAlyZXMgPSBkZXZpY2VfcmVnaXN0ZXIoJmFkYXAtPmRldik7CkBAIC04NDUsOCArODQ1LDggQEAKIAl9IGVsc2UKIAkJY2xpZW50LT5kZXYucmVsZWFzZSA9IGkyY19jbGllbnRfZGV2X3JlbGVhc2U7CiAKLQlzbnByaW50ZigmY2xpZW50LT5kZXYuYnVzX2lkWzBdLCBzaXplb2YoY2xpZW50LT5kZXYuYnVzX2lkKSwKLQkJIiVkLSUwNHgiLCBpMmNfYWRhcHRlcl9pZChhZGFwdGVyKSwgY2xpZW50LT5hZGRyKTsKKwlkZXZfc2V0X25hbWUoJmNsaWVudC0+ZGV2LCAiJWQtJTA0eCIsIGkyY19hZGFwdGVyX2lkKGFkYXB0ZXIpLAorCQkgICAgIGNsaWVudC0+YWRkcik7CiAJcmVzID0gZGV2aWNlX3JlZ2lzdGVyKCZjbGllbnQtPmRldik7CiAJaWYgKHJlcykKIAkJZ290byBvdXRfZXJyOwpAQCAtODU2LDcgKzg1Niw3IEBACiAJbXV0ZXhfdW5sb2NrKCZhZGFwdGVyLT5jbGlzdF9sb2NrKTsKIAogCWRldl9kYmcoJmFkYXB0ZXItPmRldiwgImNsaWVudCBbJXNdIHJlZ2lzdGVyZWQgd2l0aCBidXMgaWQgJXNcbiIsCi0JCWNsaWVudC0+bmFtZSwgY2xpZW50LT5kZXYuYnVzX2lkKTsKKwkJY2xpZW50LT5uYW1lLCBkZXZfbmFtZSgmY2xpZW50LT5kZXYpKTsKIAogCWlmIChhZGFwdGVyLT5jbGllbnRfcmVnaXN0ZXIpICB7CiAJCWlmIChhZGFwdGVyLT5jbGllbnRfcmVnaXN0ZXIoY2xpZW50KSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvS2NvbmZpZyBiL2RyaXZlcnMvaWRlL0tjb25maWcKaW5kZXggM2Y5NTAzOC4uYjFjNmY2OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvS2NvbmZpZworKysgYi9kcml2ZXJzL2lkZS9LY29uZmlnCkBAIC03MDEsMTEgKzcwMSw2IEBACiAgICAgICAgZGVwZW5kcyBvbiBTT0NfQVUxMjAwICYmIEJMS19ERVZfSURFX0FVMVhYWAogZW5kY2hvaWNlCiAKLWNvbmZpZyBCTEtfREVWX0lERV9BVTFYWFhfU0VRVFNfUEVSX1JRCi0gICAgICAgaW50ICJNYXhpbXVtIHRyYW5zZmVyIHNpemUgKEtCKSBwZXIgcmVxdWVzdCAodXAgdG8gMTI4KSIKLSAgICAgICBkZWZhdWx0ICIxMjgiCi0gICAgICAgZGVwZW5kcyBvbiBCTEtfREVWX0lERV9BVTFYWFgKLQogY29uZmlnIEJMS19ERVZfSURFX1RYNDkzOAogCXRyaXN0YXRlICJUWDQ5MzggaW50ZXJuYWwgSURFIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBTT0NfVFg0OTM4CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9pZGUtYWNwaS5jIGIvZHJpdmVycy9pZGUvaWRlLWFjcGkuYwppbmRleCAyZjllOTQxLi5kOGYyOTViIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9pZGUtYWNwaS5jCisrKyBiL2RyaXZlcnMvaWRlL2lkZS1hY3BpLmMKQEAgLTE4LDEyICsxOCw2IEBACiAjaW5jbHVkZSA8bGludXgvZG1pLmg+CiAKICNpbmNsdWRlIDxhY3BpL2FjcGlfYnVzLmg+Ci0jaW5jbHVkZSA8YWNwaS9hY25hbWVzLmg+Ci0jaW5jbHVkZSA8YWNwaS9hY25hbWVzcC5oPgotI2luY2x1ZGUgPGFjcGkvYWNwYXJzZXIuaD4KLSNpbmNsdWRlIDxhY3BpL2FjZXhjZXAuaD4KLSNpbmNsdWRlIDxhY3BpL2FjbWFjcm9zLmg+Ci0jaW5jbHVkZSA8YWNwaS9hY3R5cGVzLmg+CiAKICNkZWZpbmUgUkVHU19QRVJfR1RGCQk3CiBzdHJ1Y3QgdGFza2ZpbGVfYXJyYXkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvaWRlLWRpc2suYyBiL2RyaXZlcnMvaWRlL2lkZS1kaXNrLmMKaW5kZXggNDA4OGE2Mi4uODA2NzYwZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvaWRlLWRpc2suYworKysgYi9kcml2ZXJzL2lkZS9pZGUtZGlzay5jCkBAIC02MzMsNyArNjMzLDcgQEAKIAlwcmludGsoS0VSTl9JTkZPICIlczogbWF4IHJlcXVlc3Qgc2l6ZTogJWRLaUJcbiIsIGRyaXZlLT5uYW1lLAogCQlxLT5tYXhfc2VjdG9ycyAvIDIpOwogCi0JaWYgKGF0YV9pZF9pc19zc2QoaWQpIHx8IGF0YV9pZF9pc19jZmEoaWQpKQorCWlmIChhdGFfaWRfaXNfc3NkKGlkKSkKIAkJcXVldWVfZmxhZ19zZXRfdW5sb2NrZWQoUVVFVUVfRkxBR19OT05ST1QsIHEpOwogCiAJLyogY2FsY3VsYXRlIGRyaXZlIGNhcGFjaXR5LCBhbmQgc2VsZWN0IExCQSBpZiBwb3NzaWJsZSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvaWRlLWlvcHMuYyBiL2RyaXZlcnMvaWRlL2lkZS1pb3BzLmMKaW5kZXggZTcyOGNmZS4uNzUzYjkyZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvaWRlLWlvcHMuYworKysgYi9kcml2ZXJzL2lkZS9pZGUtaW9wcy5jCkBAIC00OTMsNyArNDkzLDcgQEAKIAlzdGF0ID0gdHBfb3BzLT5yZWFkX3N0YXR1cyhod2lmKTsKIAogCWlmIChzdGF0ICYgQVRBX0JVU1kpIHsKLQkJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCQlsb2NhbF9zYXZlX2ZsYWdzKGZsYWdzKTsKIAkJbG9jYWxfaXJxX2VuYWJsZV9pbl9oYXJkaXJxKCk7CiAJCXRpbWVvdXQgKz0gamlmZmllczsKIAkJd2hpbGUgKChzdGF0ID0gdHBfb3BzLT5yZWFkX3N0YXR1cyhod2lmKSkgJiBBVEFfQlVTWSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvaWRlLXBtLmMgYi9kcml2ZXJzL2lkZS9pZGUtcG0uYwppbmRleCA0YjNiZjZhLi42MDUzOGQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9pZGUtcG0uYworKysgYi9kcml2ZXJzL2lkZS9pZGUtcG0uYwpAQCAtMTg2LDEyICsxODYsMTAgQEAKIAkgICAgICAgYmxrX3BtX3N1c3BlbmRfcmVxdWVzdChycSkgPyAic3VzcGVuZCIgOiAicmVzdW1lIik7CiAjZW5kaWYKIAlzcGluX2xvY2tfaXJxc2F2ZShxLT5xdWV1ZV9sb2NrLCBmbGFncyk7Ci0JaWYgKGJsa19wbV9zdXNwZW5kX3JlcXVlc3QocnEpKSB7CisJaWYgKGJsa19wbV9zdXNwZW5kX3JlcXVlc3QocnEpKQogCQlibGtfc3RvcF9xdWV1ZShxKTsKLQl9IGVsc2UgeworCWVsc2UKIAkJZHJpdmUtPmRldl9mbGFncyAmPSB+SURFX0RGTEFHX0JMT0NLRUQ7Ci0JCWJsa19zdGFydF9xdWV1ZShxKTsKLQl9CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShxLT5xdWV1ZV9sb2NrLCBmbGFncyk7CiAKIAlkcml2ZS0+aHdpZi0+cnEgPSBOVUxMOwpAQCAtMjE5LDYgKzIxNyw4IEBACiAJCSAqIHBvaW50LgogCQkgKi8KIAkJaWRlX2h3aWZfdCAqaHdpZiA9IGRyaXZlLT5od2lmOworCQlzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSA9IGRyaXZlLT5xdWV1ZTsKKwkJdW5zaWduZWQgbG9uZyBmbGFnczsKIAkJaW50IHJjOwogI2lmZGVmIERFQlVHX1BNCiAJCXByaW50aygiJXM6IFdha2V1cCByZXF1ZXN0IGluaXRlZCwgd2FpdGluZyBmb3IgIUJTWS4uLlxuIiwgZHJpdmUtPm5hbWUpOwpAQCAtMjMxLDUgKzIzMSw5IEBACiAJCXJjID0gaWRlX3dhaXRfbm90X2J1c3koaHdpZiwgMTAwMDAwKTsKIAkJaWYgKHJjKQogCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGRyaXZlIG5vdCByZWFkeSBvbiB3YWtldXBcbiIsIGRyaXZlLT5uYW1lKTsKKworCQlzcGluX2xvY2tfaXJxc2F2ZShxLT5xdWV1ZV9sb2NrLCBmbGFncyk7CisJCWJsa19zdGFydF9xdWV1ZShxKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShxLT5xdWV1ZV9sb2NrLCBmbGFncyk7CiAJfQogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvaWRlLXByb2JlLmMgYi9kcml2ZXJzL2lkZS9pZGUtcHJvYmUuYwppbmRleCAwY2NiYjQ0Li4zMTIxMjdlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9pZGUtcHJvYmUuYworKysgYi9kcml2ZXJzL2lkZS9pZGUtcHJvYmUuYwpAQCAtNzk2LDcgKzc5Niw3IEBACiAJaWYgKGlycWQpCiAJCWRpc2FibGVfaXJxKGh3aWYtPmlycSk7CiAKLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJbG9jYWxfc2F2ZV9mbGFncyhmbGFncyk7CiAJbG9jYWxfaXJxX2VuYWJsZV9pbl9oYXJkaXJxKCk7CiAKIAlpZiAoaWRlX3BvcnRfd2FpdF9yZWFkeShod2lmKSA9PSAtRUJVU1kpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9pdDgyMXguYyBiL2RyaXZlcnMvaWRlL2l0ODIxeC5jCmluZGV4IDBiZTI3YWMuLmUxYzRmNTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL2l0ODIxeC5jCisrKyBiL2RyaXZlcnMvaWRlL2l0ODIxeC5jCkBAIC02OCw2ICs2OCw4IEBACiAKICNkZWZpbmUgRFJWX05BTUUgIml0ODIxeCIKIAorI2RlZmluZSBRVUlSS19WT1JURVg4NiAxCisKIHN0cnVjdCBpdDgyMXhfZGV2CiB7CiAJdW5zaWduZWQgaW50IHNtYXJ0OjEsCQkvKiBBcmUgd2UgaW4gc21hcnQgcmFpZCBtb2RlICovCkBAIC03OSw2ICs4MSw3IEBACiAJdTE2CXBpb1syXTsJCQkvKiBDYWNoZWQgUElPIHZhbHVlcyAqLwogCXUxNgltd2RtYVsyXTsJCS8qIENhY2hlZCBNV0RNQSB2YWx1ZXMgKi8KIAl1MTYJdWRtYVsyXTsJCS8qIENhY2hlZCBVRE1BIHZhbHVlcyAocGVyIGRyaXZlKSAqLworCXUxNglxdWlya3M7CiB9OwogCiAjZGVmaW5lIEFUQV82NgkJMApAQCAtNTU3LDggKzU2MCw3IEBACiAJICoJdGhpcyBpcyBuZWNlc3NhcnkuCiAJICovCiAKLQlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIDB4MDgsICZjb25mKTsKLQlpZiAoY29uZiA9PSAweDEwKSB7CisJaWYgKGRldi0+cmV2aXNpb24gPT0gMHgxMCkgewogCQlpZGV2LT50aW1pbmcxMCA9IDE7CiAJCWh3aWYtPmhvc3RfZmxhZ3MgfD0gSURFX0hGTEFHX05PX0FUQVBJX0RNQTsKIAkJaWYgKGlkZXYtPnNtYXJ0ID09IDApCkBAIC01NzcsNiArNTc5LDEyIEBACiAKIAlod2lmLT51bHRyYV9tYXNrID0gQVRBX1VETUE2OwogCWh3aWYtPm13ZG1hX21hc2sgPSBBVEFfTVdETUEyOworCisJLyogVm9ydGV4ODZTWCBxdWlyazogcHJldmVudCBVbHRyYS1ETUEgbW9kZSB0byBmaXggQmFkQ1JDIGlzc3VlICovCisJaWYgKGlkZXYtPnF1aXJrcyAmIFFVSVJLX1ZPUlRFWDg2KSB7CisJCWlmIChkZXYtPnJldmlzaW9uID09IDB4MTEpCisJCQlod2lmLT51bHRyYV9tYXNrID0gMDsKKwl9CiB9CiAKIHN0YXRpYyB2b2lkIGl0ODIxMl9kaXNhYmxlX3JhaWQoc3RydWN0IHBjaV9kZXYgKmRldikKQEAgLTY0OSw2ICs2NTcsOCBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKKwlpdGRldnMtPnF1aXJrcyA9IGlkLT5kcml2ZXJfZGF0YTsKKwogCXJjID0gaWRlX3BjaV9pbml0X29uZShkZXYsICZpdDgyMXhfY2hpcHNldCwgaXRkZXZzKTsKIAlpZiAocmMpCiAJCWtmcmVlKGl0ZGV2cyk7CkBAIC02NjgsNiArNjc4LDcgQEAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCBpdDgyMXhfcGNpX3RibFtdID0gewogCXsgUENJX1ZERVZJQ0UoSVRFLCBQQ0lfREVWSUNFX0lEX0lURV84MjExKSwgMCB9LAogCXsgUENJX1ZERVZJQ0UoSVRFLCBQQ0lfREVWSUNFX0lEX0lURV84MjEyKSwgMCB9LAorCXsgUENJX1ZERVZJQ0UoUkRDLCBQQ0lfREVWSUNFX0lEX1JEQ19EMTAxMCksIFFVSVJLX1ZPUlRFWDg2IH0sCiAJeyAwLCB9LAogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvc2w4MmMxMDUuYyBiL2RyaXZlcnMvaWRlL3NsODJjMTA1LmMKaW5kZXggNDhjYzc0OC4uNjI5Nzk1NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvc2w4MmMxMDUuYworKysgYi9kcml2ZXJzL2lkZS9zbDgyYzEwNS5jCkBAIC0zMTAsMTAgKzMxMCw2IEBACiAJLmRtYV9vcHMJPSAmc2w4MmMxMDVfZG1hX29wcywKIAkuaG9zdF9mbGFncwk9IElERV9IRkxBR19JT18zMkJJVCB8CiAJCQkgIElERV9IRkxBR19VTk1BU0tfSVJRUyB8Ci0vKiBGSVhNRTogY2hlY2sgZm9yIENvbXBhdGliaWxpdHkgbW9kZSBpbiBnZW5lcmljIElERSBQQ0kgY29kZSAqLwotI2lmIGRlZmluZWQoQ09ORklHX0xPUEVDKSB8fCBkZWZpbmVkKENPTkZJR19TQU5EUE9JTlQpCi0JCQkgIElERV9IRkxBR19GT1JDRV9MRUdBQ1lfSVJRUyB8Ci0jZW5kaWYKIAkJCSAgSURFX0hGTEFHX1NFUklBTElaRV9ETUEgfAogCQkJICBJREVfSEZMQUdfTk9fQVVUT0RNQSwKIAkucGlvX21hc2sJPSBBVEFfUElPNSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL3R4NDkzOGlkZS5jIGIvZHJpdmVycy9pZGUvdHg0OTM4aWRlLmMKaW5kZXggYjRlZjIxOC4uZDkwOTUzNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvdHg0OTM4aWRlLmMKKysrIGIvZHJpdmVycy9pZGUvdHg0OTM4aWRlLmMKQEAgLTIwMiw3ICsyMDIsNiBAQAogCS5leGVjX2NvbW1hbmQJCT0gaWRlX2V4ZWNfY29tbWFuZCwKIAkucmVhZF9zdGF0dXMJCT0gaWRlX3JlYWRfc3RhdHVzLAogCS5yZWFkX2FsdHN0YXR1cwkJPSBpZGVfcmVhZF9hbHRzdGF0dXMsCi0JLnJlYWRfc2ZmX2RtYV9zdGF0dXMJPSBpZGVfcmVhZF9zZmZfZG1hX3N0YXR1cywKIAogCS5zZXRfaXJxCQk9IGlkZV9zZXRfaXJxLAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS92aWE4MmN4eHguYyBiL2RyaXZlcnMvaWRlL3ZpYTgyY3h4eC5jCmluZGV4IGZlY2MwZTAuLjcwM2MzZWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL3ZpYTgyY3h4eC5jCisrKyBiL2RyaXZlcnMvaWRlL3ZpYTgyY3h4eC5jCkBAIC00MzIsOCArNDMyLDYgQEAKIAlpZiAodmlhX2Nsb2NrIDwgMjAwMDAgfHwgdmlhX2Nsb2NrID4gNTAwMDApIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyBEUlZfTkFNRSAiOiBVc2VyIGdpdmVuIFBDSSBjbG9jayBzcGVlZCAiCiAJCQkiaW1wb3NzaWJsZSAoJWQpLCB1c2luZyAzMyBNSHogaW5zdGVhZC5cbiIsIHZpYV9jbG9jayk7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgRFJWX05BTUUgIjogVXNlIGlkZTA9YXRhNjYgaWYgeW91IHdhbnQgIgotCQkJInRvIGFzc3VtZSA4MC13aXJlIGNhYmxlLlxuIik7CiAJCXZpYV9jbG9jayA9IDMzMzMzOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZWVlMTM5NC9jc3IuYyBiL2RyaXZlcnMvaWVlZTEzOTQvY3NyLmMKaW5kZXggYzkwYmU0MC4uMzE0MDBjOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZWVlMTM5NC9jc3IuYworKysgYi9kcml2ZXJzL2llZWUxMzk0L2Nzci5jCkBAIC02OCwyMiArNjgsMjIgQEAKIAkuaG9zdF9yZXNldCA9CWhvc3RfcmVzZXQsCiB9OwogCi1zdGF0aWMgc3RydWN0IGhwc2JfYWRkcmVzc19vcHMgbWFwX29wcyA9IHsKK2NvbnN0IHN0YXRpYyBzdHJ1Y3QgaHBzYl9hZGRyZXNzX29wcyBtYXBfb3BzID0gewogCS5yZWFkID0gcmVhZF9tYXBzLAogfTsKIAotc3RhdGljIHN0cnVjdCBocHNiX2FkZHJlc3Nfb3BzIGZjcF9vcHMgPSB7Citjb25zdCBzdGF0aWMgc3RydWN0IGhwc2JfYWRkcmVzc19vcHMgZmNwX29wcyA9IHsKIAkud3JpdGUgPSB3cml0ZV9mY3AsCiB9OwogCi1zdGF0aWMgc3RydWN0IGhwc2JfYWRkcmVzc19vcHMgcmVnX29wcyA9IHsKK2NvbnN0IHN0YXRpYyBzdHJ1Y3QgaHBzYl9hZGRyZXNzX29wcyByZWdfb3BzID0gewogCS5yZWFkID0gcmVhZF9yZWdzLAogCS53cml0ZSA9IHdyaXRlX3JlZ3MsCiAJLmxvY2sgPSBsb2NrX3JlZ3MsCiAJLmxvY2s2NCA9IGxvY2s2NF9yZWdzLAogfTsKIAotc3RhdGljIHN0cnVjdCBocHNiX2FkZHJlc3Nfb3BzIGNvbmZpZ19yb21fb3BzID0geworY29uc3Qgc3RhdGljIHN0cnVjdCBocHNiX2FkZHJlc3Nfb3BzIGNvbmZpZ19yb21fb3BzID0gewogCS5yZWFkID0gcmVhZF9jb25maWdfcm9tLAogfTsKIApAQCAtMjE3LDcgKzIxNyw3IEBACiAKIAlob3N0LT5jc3IuZ2VuZXJhdGlvbiA9IDI7CiAKLQlidXNfaW5mb1sxXSA9IF9fY29uc3RhbnRfY3B1X3RvX2JlMzIoMHgzMTMzMzkzNCk7CisJYnVzX2luZm9bMV0gPSBJRUVFMTM5NF9CVVNJRF9NQUdJQzsKIAlidXNfaW5mb1syXSA9IGNwdV90b19iZTMyKChocHNiX2Rpc2FibGVfaXJtID8gMCA6IDEgPDwgQ1NSX0lSTUNfU0hJRlQpIHwKIAkJCQkgICgxIDw8IENTUl9DTUNfU0hJRlQpIHwKIAkJCQkgICgxIDw8IENTUl9JU0NfU0hJRlQpIHwKQEAgLTI1MCw3ICsyNTAsNyBAQAogewogCXF1YWRsZXRfdCBidXNfaW5mb1tDU1JfQlVTX0lORk9fU0laRV07CiAKLQlidXNfaW5mb1sxXSA9IF9fY29uc3RhbnRfY3B1X3RvX2JlMzIoMHgzMTMzMzkzNCk7CisJYnVzX2luZm9bMV0gPSBJRUVFMTM5NF9CVVNJRF9NQUdJQzsKIAlidXNfaW5mb1syXSA9IGNwdV90b19iZTMyKCgwIDw8IENTUl9JUk1DX1NISUZUKSB8CiAJCQkJICAoMCA8PCBDU1JfQ01DX1NISUZUKSB8CiAJCQkJICAoMCA8PCBDU1JfSVNDX1NISUZUKSB8CmRpZmYgLS1naXQgYS9kcml2ZXJzL2llZWUxMzk0L2Nzci5oIGIvZHJpdmVycy9pZWVlMTM5NC9jc3IuaAppbmRleCBmMTE1NDY1Li45MGZiM2YyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2llZWUxMzk0L2Nzci5oCisrKyBiL2RyaXZlcnMvaWVlZTEzOTQvY3NyLmgKQEAgLTUwLDExICs1MCwxMSBAQAogI2RlZmluZSBDU1JfTUFYX1JPTV9TSElGVAkJOAogI2RlZmluZSBDU1JfR0VORVJBVElPTl9TSElGVAkJNAogCi0jZGVmaW5lIENTUl9TRVRfQlVTX0lORk9fR0VORVJBVElPTihjc3IsIGdlbikJCQkJXAotCSgoY3NyKS0+YnVzX2luZm9fZGF0YVsyXSA9CQkJCQlcCi0JCWNwdV90b19iZTMyKChiZTMyX3RvX2NwdSgoY3NyKS0+YnVzX2luZm9fZGF0YVsyXSkgJglcCi0JCQkgICAgIH4oMHhmIDw8IENTUl9HRU5FUkFUSU9OX1NISUZUKSkgfAkJXAotCQkJICAgIChnZW4pIDw8IENTUl9HRU5FUkFUSU9OX1NISUZUKSkKK3N0YXRpYyBpbmxpbmUgdm9pZCBjc3Jfc2V0X2J1c19pbmZvX2dlbmVyYXRpb24oc3RydWN0IGNzcjEyMTJfY3NyICpjc3IsIHU4IGdlbikKK3sKKwljc3ItPmJ1c19pbmZvX2RhdGFbMl0gJj0gfmNwdV90b19iZTMyKDB4ZiA8PCBDU1JfR0VORVJBVElPTl9TSElGVCk7CisJY3NyLT5idXNfaW5mb19kYXRhWzJdIHw9IGNwdV90b19iZTMyKCh1MzIpZ2VuIDw8IENTUl9HRU5FUkFUSU9OX1NISUZUKTsKK30KIAogc3RydWN0IGNzcl9jb250cm9sIHsKIAlzcGlubG9ja190IGxvY2s7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2llZWUxMzk0L2NzcjEyMTIuYyBiL2RyaXZlcnMvaWVlZTEzOTQvY3NyMTIxMi5jCmluZGV4IDVlMzhhNjguLmE2ZGZlYjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWVlZTEzOTQvY3NyMTIxMi5jCisrKyBiL2RyaXZlcnMvaWVlZTEzOTQvY3NyMTIxMi5jCkBAIC0xMDc3LDE1ICsxMDc3LDEwIEBACiAJaW50IGk7CiAJaW50IHJldDsKIAotCS8qIElFRUUgMTIxMiBzYXlzIHRoYXQgdGhlIGVudGlyZSBidXMgaW5mbyBibG9jayBzaG91bGQgYmUgcmVhZGFibGUgaW4KLQkgKiBhIHNpbmdsZSB0cmFuc2FjdGlvbiByZWdhcmRsZXNzIG9mIHRoZSBtYXhfcm9tIHZhbHVlLgotCSAqIFVuZm9ydHVuYXRlbHksIG1hbnkgSUVFRSAxMzk0IGRldmljZXMgZG8gbm90IGFiaWRlIGJ5IHRoYXQsIHNvIHRoZQotCSAqIGJ1cyBpbmZvIGJsb2NrIHdpbGwgYmUgcmVhZCAxIHF1YWRsZXQgYXQgYSB0aW1lLiAgVGhlIHJlc3Qgb2YgdGhlCi0JICogQ29uZmlnUk9NIHdpbGwgYmUgcmVhZCBhY2NvcmRpbmcgdG8gdGhlIG1heF9yb20gZmllbGQuICovCiAJZm9yIChpID0gMDsgaSA8IGNzci0+YnVzX2luZm9fbGVuOyBpICs9IHNpemVvZih1MzIpKSB7CiAJCXJldCA9IGNzci0+b3BzLT5idXNfcmVhZChjc3IsIENTUjEyMTJfQ09ORklHX1JPTV9TUEFDRV9CQVNFICsgaSwKLQkJCXNpemVvZih1MzIpLCAmY3NyLT5jYWNoZV9oZWFkLT5kYXRhW2J5dGVzX3RvX3F1YWRzKGkpXSwKLQkJCWNzci0+cHJpdmF0ZSk7CisJCQkJJmNzci0+Y2FjaGVfaGVhZC0+ZGF0YVtieXRlc190b19xdWFkcyhpKV0sCisJCQkJY3NyLT5wcml2YXRlKTsKIAkJaWYgKHJldCAhPSBDU1IxMjEyX1NVQ0NFU1MpCiAJCQlyZXR1cm4gcmV0OwogCkBAIC0xMTA0LDggKzEwOTksOCBAQAogCSAqIGEgdGltZS4gKi8KIAlmb3IgKGkgPSBjc3ItPmJ1c19pbmZvX2xlbjsgaSA8PSBjc3ItPmNyY19sZW47IGkgKz0gc2l6ZW9mKHUzMikpIHsKIAkJcmV0ID0gY3NyLT5vcHMtPmJ1c19yZWFkKGNzciwgQ1NSMTIxMl9DT05GSUdfUk9NX1NQQUNFX0JBU0UgKyBpLAotCQkJc2l6ZW9mKHUzMiksICZjc3ItPmNhY2hlX2hlYWQtPmRhdGFbYnl0ZXNfdG9fcXVhZHMoaSldLAotCQkJY3NyLT5wcml2YXRlKTsKKwkJCQkmY3NyLT5jYWNoZV9oZWFkLT5kYXRhW2J5dGVzX3RvX3F1YWRzKGkpXSwKKwkJCQljc3ItPnByaXZhdGUpOwogCQlpZiAocmV0ICE9IENTUjEyMTJfU1VDQ0VTUykKIAkJCXJldHVybiByZXQ7CiAJfQpAQCAtMTI4OSw3ICsxMjg0LDcgQEAKIAogCQlpZiAoY3NyLT5vcHMtPmJ1c19yZWFkKGNzciwKIAkJCQkgICAgICAgQ1NSMTIxMl9SRUdJU1RFUl9TUEFDRV9CQVNFICsga3YtPm9mZnNldCwKLQkJCQkgICAgICAgc2l6ZW9mKHUzMiksICZxLCBjc3ItPnByaXZhdGUpKQorCQkJCSAgICAgICAmcSwgY3NyLT5wcml2YXRlKSkKIAkJCXJldHVybiAtRUlPOwogCiAJCWt2LT52YWx1ZS5sZWFmLmxlbiA9IGJlMzJfdG9fY3B1KHEpID4+IDE2OwpAQCAtMTM3MiwxNyArMTM2Nyw4IEBACiAJCWFkZHIgPSAoQ1NSMTIxMl9DU1JfQVJDSF9SRUdfU1BBQ0VfQkFTRSArIGNhY2hlLT5vZmZzZXQgKwogCQkJY3ItPm9mZnNldF9lbmQpICYgfihjc3ItPm1heF9yb20gLSAxKTsKIAotCQlpZiAoY3NyLT5vcHMtPmJ1c19yZWFkKGNzciwgYWRkciwgY3NyLT5tYXhfcm9tLCBjYWNoZV9wdHIsCi0JCQkJICAgICAgIGNzci0+cHJpdmF0ZSkpIHsKLQkJCWlmIChjc3ItPm1heF9yb20gPT0gNCkKLQkJCQkvKiBXZSd2ZSBnb3QgcHJvYmxlbXMhICovCi0JCQkJcmV0dXJuIC1FSU87Ci0KLQkJCS8qIEFwcGVyZW50bHkgdGhlIG1heF9yb20gdmFsdWUgd2FzIGEgbGllLCBzZXQgaXQgdG8KLQkJCSAqIGRvIHF1YWRsZXQgcmVhZHMgYW5kIHRyeSBhZ2Fpbi4gKi8KLQkJCWNzci0+bWF4X3JvbSA9IDQ7Ci0JCQljb250aW51ZTsKLQkJfQorCQlpZiAoY3NyLT5vcHMtPmJ1c19yZWFkKGNzciwgYWRkciwgY2FjaGVfcHRyLCBjc3ItPnByaXZhdGUpKQorCQkJcmV0dXJuIC1FSU87CiAKIAkJY3ItPm9mZnNldF9lbmQgKz0gY3NyLT5tYXhfcm9tIC0gKGNyLT5vZmZzZXRfZW5kICYKIAkJCQkJCSAgKGNzci0+bWF4X3JvbSAtIDEpKTsKQEAgLTE0MzMsNyArMTQxOSw2IEBACiAKIGludCBjc3IxMjEyX3BhcnNlX2NzcihzdHJ1Y3QgY3NyMTIxMl9jc3IgKmNzcikKIHsKLQlzdGF0aWMgY29uc3QgaW50IG1yX21hcFtdID0geyA0LCA2NCwgMTAyNCwgMCB9OwogCXN0cnVjdCBjc3IxMjEyX2RlbnRyeSAqZGVudHJ5OwogCWludCByZXQ7CiAKQEAgLTE0NDMsMTUgKzE0MjgsMTMgQEAKIAlpZiAocmV0ICE9IENTUjEyMTJfU1VDQ0VTUykKIAkJcmV0dXJuIHJldDsKIAotCWlmICghY3NyLT5vcHMtPmdldF9tYXhfcm9tKSB7Ci0JCWNzci0+bWF4X3JvbSA9IG1yX21hcFswXTsJLyogZGVmYXVsdCB2YWx1ZSAqLwotCX0gZWxzZSB7Ci0JCWludCBpID0gY3NyLT5vcHMtPmdldF9tYXhfcm9tKGNzci0+YnVzX2luZm9fZGF0YSwKLQkJCQkJICAgICAgY3NyLT5wcml2YXRlKTsKLQkJaWYgKGkgJiB+MHgzKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCWNzci0+bWF4X3JvbSA9IG1yX21hcFtpXTsKLQl9CisJLyoKKwkgKiBUaGVyZSBoYXMgYmVlbiBhIGJ1Z2d5IGZpcm13YXJlIHdpdGggYnVzX2luZm9fYmxvY2subWF4X3JvbSA+IDAKKwkgKiBzcG90dGVkIHdoaWNoIGFjdHVhbGx5IG9ubHkgc3VwcG9ydGVkIHF1YWRsZXQgcmVhZCByZXF1ZXN0cyB0byB0aGUKKwkgKiBjb25maWcgUk9NLiAgVGhlcmVmb3JlIHJlYWQgZXZlcnl0aGluZyBxdWFkbGV0IGJ5IHF1YWRsZXQgcmVnYXJkbGVzcworCSAqIG9mIHdoYXQgdGhlIGJ1cyBpbmZvIGJsb2NrIHNheXMuCisJICovCisJY3NyLT5tYXhfcm9tID0gNDsKIAogCWNzci0+Y2FjaGVfaGVhZC0+bGF5b3V0X2hlYWQgPSBjc3ItPnJvb3Rfa3Y7CiAJY3NyLT5jYWNoZV9oZWFkLT5sYXlvdXRfdGFpbCA9IGNzci0+cm9vdF9rdjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWVlZTEzOTQvY3NyMTIxMi5oIGIvZHJpdmVycy9pZWVlMTM5NC9jc3IxMjEyLmgKaW5kZXggMDQzMDM5Zi4uYTg5MmQ5MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZWVlMTM5NC9jc3IxMjEyLmgKKysrIGIvZHJpdmVycy9pZWVlMTM5NC9jc3IxMjEyLmgKQEAgLTE4MSw3ICsxODEsNyBAQAogc3RydWN0IGNzcjEyMTJfY3NyIHsKIAlzaXplX3QgYnVzX2luZm9fbGVuOwkvKiBidXMgaW5mbyBibG9jayBsZW5ndGggaW4gYnl0ZXMgKi8KIAlzaXplX3QgY3JjX2xlbjsJCS8qIGNyYyBsZW5ndGggaW4gYnl0ZXMgKi8KLQl1MzIgKmJ1c19pbmZvX2RhdGE7CS8qIGJ1cyBpbmZvIGRhdGEgaW5jbCBidXMgbmFtZSBhbmQgRVVJICovCisJX19iZTMyICpidXNfaW5mb19kYXRhOwkvKiBidXMgaW5mbyBkYXRhIGluY2wgYnVzIG5hbWUgYW5kIEVVSSAqLwogCiAJdm9pZCAqcHJpdmF0ZTsJCS8qIHByaXZhdGUsIGJ1cyBzcGVjaWZpYyBkYXRhICovCiAJc3RydWN0IGNzcjEyMTJfYnVzX29wcyAqb3BzOwpAQCAtMjAwLDcgKzIwMCw3IEBACiAJICogZW50cmllcyBsb2NhdGVkIGluIHRoZSBVbml0cyBTcGFjZS4gIE11c3QgcmV0dXJuIDAgb24gc3VjY2VzcwogCSAqIGFueXRoaW5nIGVsc2UgaW5kaWNhdGVzIGFuIGVycm9yLiAqLwogCWludCAoKmJ1c19yZWFkKSAoc3RydWN0IGNzcjEyMTJfY3NyICpjc3IsIHU2NCBhZGRyLAotCQkJIHUxNiBsZW5ndGgsIHZvaWQgKmJ1ZmZlciwgdm9pZCAqcHJpdmF0ZSk7CisJCQkgdm9pZCAqYnVmZmVyLCB2b2lkICpwcml2YXRlKTsKIAogCS8qIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBieSBjc3IxMjEyIHRvIGFsbG9jYXRlIGEgcmVnaW9uIGluIHVuaXRzIHNwYWNlCiAJICogaW4gdGhlIGV2ZW50IHRoYXQgQ29uZmlnIFJPTSBlbnRyaWVzIGRvbid0IGFsbCBmaXQgaW4gdGhlIHByZWRlZmluZWQKQEAgLTIxMSwxMSArMjExLDYgQEAKIAkvKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgYnkgY3NyMTIxMiB0byByZWxlYXNlIGEgcmVnaW9uIGluIHVuaXRzIHNwYWNlCiAJICogdGhhdCBpcyBubyBsb25nZXIgbmVlZGVkLiAqLwogCXZvaWQgKCpyZWxlYXNlX2FkZHIpICh1NjQgYWRkciwgdm9pZCAqcHJpdmF0ZSk7Ci0KLQkvKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgYnkgY3NyMTIxMiB0byBkZXRlcm1pbmUgdGhlIG1heCByZWFkIHJlcXVlc3QKLQkgKiBzdXBwb3J0ZWQgYnkgYSByZW1vdGUgbm9kZSB3aGVuIHJlYWRpbmcgdGhlIENvbmZpZ1JPTSBzcGFjZS4gIE11c3QKLQkgKiByZXR1cm4gMCwgMSwgb3IgMiBwZXIgSUVFRSAxMjEyLiAgKi8KLQlpbnQgKCpnZXRfbWF4X3JvbSkgKHUzMiAqYnVzX2luZm8sIHZvaWQgKnByaXZhdGUpOwogfTsKIAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2llZWUxMzk0L2R2MTM5NC1wcml2YXRlLmggYi9kcml2ZXJzL2llZWUxMzk0L2R2MTM5NC1wcml2YXRlLmgKaW5kZXggN2QxZDI4NC4uMThiOTJjYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZWVlMTM5NC9kdjEzOTQtcHJpdmF0ZS5oCisrKyBiL2RyaXZlcnMvaWVlZTEzOTQvZHYxMzk0LXByaXZhdGUuaApAQCAtNzcsMTEgKzc3LDExIEBACiAgICBTZWUgdGhlIFRleGFzIEluc3RydW1lbnRzIE9IQ0kgMTM5NCBjaGlwc2V0IGRvY3VtZW50YXRpb24uCiAqLwogCi1zdHJ1Y3Qgb3V0cHV0X21vcmVfaW1tZWRpYXRlIHsgdTMyIHFbOF07IH07Ci1zdHJ1Y3Qgb3V0cHV0X21vcmUgeyB1MzIgcVs0XTsgfTsKLXN0cnVjdCBvdXRwdXRfbGFzdCB7IHUzMiBxWzRdOyB9Owotc3RydWN0IGlucHV0X21vcmUgeyB1MzIgcVs0XTsgfTsKLXN0cnVjdCBpbnB1dF9sYXN0IHsgdTMyIHFbNF07IH07CitzdHJ1Y3Qgb3V0cHV0X21vcmVfaW1tZWRpYXRlIHsgX19sZTMyIHFbOF07IH07CitzdHJ1Y3Qgb3V0cHV0X21vcmUgeyBfX2xlMzIgcVs0XTsgfTsKK3N0cnVjdCBvdXRwdXRfbGFzdCB7IF9fbGUzMiBxWzRdOyB9Oworc3RydWN0IGlucHV0X21vcmUgeyBfX2xlMzIgcVs0XTsgfTsKK3N0cnVjdCBpbnB1dF9sYXN0IHsgX19sZTMyIHFbNF07IH07CiAKIC8qIG91dHB1dHMgKi8KIApAQCAtOTIsOSArOTIsOSBAQAogCQkJCQkgICAgICB1bnNpZ25lZCBpbnQgIHBheWxvYWRfc2l6ZSkKIHsKIAlvbWktPnFbMF0gPSBjcHVfdG9fbGUzMigweDAyMDAwMDAwIHwgOCk7IC8qIE9VVFBVVF9NT1JFX0lNTUVESUFURTsgOCBpcyB0aGUgc2l6ZSBvZiB0aGUgSVQgaGVhZGVyICovCi0Jb21pLT5xWzFdID0gMDsKLQlvbWktPnFbMl0gPSAwOwotCW9taS0+cVszXSA9IDA7CisJb21pLT5xWzFdID0gY3B1X3RvX2xlMzIoMCk7CisJb21pLT5xWzJdID0gY3B1X3RvX2xlMzIoMCk7CisJb21pLT5xWzNdID0gY3B1X3RvX2xlMzIoMCk7CiAKIAkvKiBJVCBwYWNrZXQgaGVhZGVyICovCiAJb21pLT5xWzRdID0gY3B1X3RvX2xlMzIoICAoMHgwIDw8IDE2KSAgLyogSUVFRTEzOTRfU1BFRURfMTAwICovCkBAIC0xMDYsOCArMTA2LDggQEAKIAkvKiByZXNlcnZlZCBmaWVsZDsgbWltaWMgYmVoYXZpb3Igb2YgbXkgU29ueSBEU1ItNDAgKi8KIAlvbWktPnFbNV0gPSBjcHVfdG9fbGUzMigocGF5bG9hZF9zaXplIDw8IDE2KSB8ICgweDdGIDw8IDgpIHwgMHhBMCk7CiAKLQlvbWktPnFbNl0gPSAwOwotCW9taS0+cVs3XSA9IDA7CisJb21pLT5xWzZdID0gY3B1X3RvX2xlMzIoMCk7CisJb21pLT5xWzddID0gY3B1X3RvX2xlMzIoMCk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBmaWxsX291dHB1dF9tb3JlKHN0cnVjdCBvdXRwdXRfbW9yZSAqb20sCkBAIC0xMTYsOCArMTE2LDggQEAKIHsKIAlvbS0+cVswXSA9IGNwdV90b19sZTMyKGRhdGFfc2l6ZSk7CiAJb20tPnFbMV0gPSBjcHVfdG9fbGUzMihkYXRhX3BoeXNfYWRkcik7Ci0Jb20tPnFbMl0gPSAwOwotCW9tLT5xWzNdID0gMDsKKwlvbS0+cVsyXSA9IGNwdV90b19sZTMyKDApOworCW9tLT5xWzNdID0gY3B1X3RvX2xlMzIoMCk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBmaWxsX291dHB1dF9sYXN0KHN0cnVjdCBvdXRwdXRfbGFzdCAqb2wsCkBAIC0xNDAsOCArMTQwLDggQEAKIAogCW9sLT5xWzBdID0gY3B1X3RvX2xlMzIodGVtcCk7CiAJb2wtPnFbMV0gPSBjcHVfdG9fbGUzMihkYXRhX3BoeXNfYWRkcik7Ci0Jb2wtPnFbMl0gPSAwOwotCW9sLT5xWzNdID0gMDsKKwlvbC0+cVsyXSA9IGNwdV90b19sZTMyKDApOworCW9sLT5xWzNdID0gY3B1X3RvX2xlMzIoMCk7CiB9CiAKIC8qIGlucHV0cyAqLwpAQCAtMTYxLDggKzE2MSw4IEBACiAKIAlpbS0+cVswXSA9IGNwdV90b19sZTMyKHRlbXApOwogCWltLT5xWzFdID0gY3B1X3RvX2xlMzIoZGF0YV9waHlzX2FkZHIpOwotCWltLT5xWzJdID0gMDsgLyogYnJhbmNoQWRkcmVzcyBhbmQgWiBub3QgdXNlIGluIHBhY2tldC1wZXItYnVmZmVyIG1vZGUgKi8KLQlpbS0+cVszXSA9IDA7IC8qIHhmZXJTdGF0dXMgJiByZXNDb3VudCwgcmVzQ291bnQgbXVzdCBiZSBpbml0aWFsaXplIHRvIGRhdGFfc2l6ZSAqLworCWltLT5xWzJdID0gY3B1X3RvX2xlMzIoMCk7IC8qIGJyYW5jaEFkZHJlc3MgYW5kIFogbm90IHVzZSBpbiBwYWNrZXQtcGVyLWJ1ZmZlciBtb2RlICovCisJaW0tPnFbM10gPSBjcHVfdG9fbGUzMigwKTsgLyogeGZlclN0YXR1cyAmIHJlc0NvdW50LCByZXNDb3VudCBtdXN0IGJlIGluaXRpYWxpemUgdG8gZGF0YV9zaXplICovCiB9CiAgCiBzdGF0aWMgaW5saW5lIHZvaWQgZmlsbF9pbnB1dF9sYXN0KHN0cnVjdCBpbnB1dF9sYXN0ICppbCwKQEAgLTMzMSw3ICszMzEsNyBAQAogCiAJLyogcG9pbnRzIHRvIHN0YXR1cy90aW1lc3RhbXAgZmllbGQgb2YgZmlyc3QgRE1BIHBhY2tldCAqLwogCS8qICh3ZSdsbCBjaGVjayBpdCBsYXRlciB0byBtb25pdG9yIHRpbWVzdGFtcCBhY2N1cmFjeSkgKi8KLQl1MzIgKmZyYW1lX2JlZ2luX3RpbWVzdGFtcDsKKwlfX2xlMzIgKmZyYW1lX2JlZ2luX3RpbWVzdGFtcDsKIAogCS8qIHRoZSB0aW1lc3RhbXAgd2UgYXNzaWduZWQgdG8gdGhlIGZpcnN0IHBhY2tldCBpbiB0aGUgZnJhbWUgKi8KIAl1MzIgYXNzaWduZWRfdGltZXN0YW1wOwpAQCAtMzQ4LDE1ICszNDgsMTUgQEAKIAkgICB0aGF0IGNhbiBjYXVzZSBpbnRlcnJ1cHRzLiBXZSdsbCBjaGVjayB0aGVzZSBmcm9tIHRoZQogCSAgIGludGVycnVwdCBoYW5kbGVyLgogCSovCi0JdTMyICptaWRfZnJhbWVfdGltZXN0YW1wOwotCXUzMiAqZnJhbWVfZW5kX3RpbWVzdGFtcDsKKwlfX2xlMzIgKm1pZF9mcmFtZV90aW1lc3RhbXA7CisJX19sZTMyICpmcmFtZV9lbmRfdGltZXN0YW1wOwogCiAJLyogYnJhbmNoIGFkZHJlc3MgZmllbGQgb2YgZmluYWwgcGFja2V0LiBUaGlzIGlzIGVmZmVjdGl2ZWx5CiAJICAgdGhlICJ0YWlsIiBpbiB0aGUgY2hhaW4gb2YgRE1BIGRlc2NyaXB0b3IgYmxvY2tzLgogCSAgIFdlIHdpbGwgZmlsbCBpdCB3aXRoIHRoZSBhZGRyZXNzIG9mIHRoZSBmaXJzdCBETUEgZGVzY3JpcHRvcgogCSAgIGJsb2NrIGluIHRoZSBzdWJzZXF1ZW50IGZyYW1lLCBvbmNlIGl0IGlzIHJlYWR5LgogCSovCi0JdTMyICpmcmFtZV9lbmRfYnJhbmNoOworCV9fbGUzMiAqZnJhbWVfZW5kX2JyYW5jaDsKIAogCS8qIHRoZSBudW1iZXIgb2YgZGVzY3JpcHRvcnMgaW4gdGhlIGZpcnN0IGRlc2NyaXB0b3IgYmxvY2sKIAkgICBvZiB0aGUgZnJhbWUuIE5lZWRlZCB0byBzdGFydCBETUEgKi8KQEAgLTM2NSwxMCArMzY1LDEwIEBACiAKIAogc3RydWN0IHBhY2tldCB7Ci0JdTE2CXRpbWVzdGFtcDsKKwlfX2xlMTYJdGltZXN0YW1wOwogCXUxNglpbnZhbGlkOwogCXUxNglpc29faGVhZGVyOwotCXUxNglkYXRhX2xlbmd0aDsKKwlfX2xlMTYJZGF0YV9sZW5ndGg7CiAJdTMyCWNpcF9oMTsKIAl1MzIJY2lwX2gyOwogCXVuc2lnbmVkIGNoYXIgZGF0YVs0ODBdOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZWVlMTM5NC9kdjEzOTQuYyBiL2RyaXZlcnMvaWVlZTEzOTQvZHYxMzk0LmMKaW5kZXggYzE5ZjIzMi4uYTMyOWU2YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZWVlMTM5NC9kdjEzOTQuYworKysgYi9kcml2ZXJzL2llZWUxMzk0L2R2MTM5NC5jCkBAIC0yNjUsNyArMjY1LDcgQEAKIAkvKiB0aGVzZSBmbGFncyBkZW5vdGUgcGFja2V0cyB0aGF0IG5lZWQgc3BlY2lhbCBhdHRlbnRpb24gKi8KIAlpbnQgZW1wdHlfcGFja2V0LCBmaXJzdF9wYWNrZXQsIGxhc3RfcGFja2V0LCBtaWRfcGFja2V0OwogCi0JdTMyICpicmFuY2hfYWRkcmVzcywgKmxhc3RfYnJhbmNoX2FkZHJlc3MgPSBOVUxMOworCV9fbGUzMiAqYnJhbmNoX2FkZHJlc3MsICpsYXN0X2JyYW5jaF9hZGRyZXNzID0gTlVMTDsKIAl1bnNpZ25lZCBsb25nIGRhdGFfcDsKIAlpbnQgZmlyc3RfcGFja2V0X2VtcHR5ID0gMDsKIAl1MzIgY3ljbGVUaW1lciwgY3Rfc2VjLCBjdF9jeWMsIGN0X29mZjsKQEAgLTg0OCw3ICs4NDgsNyBAQAogCWRtYV9hZGRyX3QgYmxvY2tfZG1hID0gMDsKIAlzdHJ1Y3QgcGFja2V0ICpkYXRhID0gTlVMTDsKIAlkbWFfYWRkcl90IGRhdGFfZG1hID0gMDsKLQl1MzIgKmxhc3RfYnJhbmNoX2FkZHJlc3MgPSBOVUxMOworCV9fbGUzMiAqbGFzdF9icmFuY2hfYWRkcmVzcyA9IE5VTEw7CiAJdW5zaWduZWQgbG9uZyBpcnFfZmxhZ3M7CiAJaW50IHdhbnRfaW50ZXJydXB0ID0gMDsKIAlzdHJ1Y3QgZnJhbWUgKmYgPSBOVUxMOwpAQCAtMjExMCwxNyArMjExMCwxNyBAQAogCQkJZiA9IHZpZGVvLT5mcmFtZXNbbmV4dF9pIC8gTUFYX1BBQ0tFVFNdOwogCQkJbmV4dCA9ICYoZi0+ZGVzY3JpcHRvcl9wb29sW25leHRfaSAlIE1BWF9QQUNLRVRTXSk7CiAJCQluZXh0X2RtYSA9ICgodW5zaWduZWQgbG9uZykgYmxvY2sgLSAodW5zaWduZWQgbG9uZykgZi0+ZGVzY3JpcHRvcl9wb29sKSArIGYtPmRlc2NyaXB0b3JfcG9vbF9kbWE7Ci0JCQluZXh0LT51LmluLmlsLnFbMF0gfD0gMyA8PCAyMDsgLyogZW5hYmxlIGludGVycnVwdCAqLwotCQkJbmV4dC0+dS5pbi5pbC5xWzJdID0gMDsgLyogZGlzYWJsZSBicmFuY2ggKi8KKwkJCW5leHQtPnUuaW4uaWwucVswXSB8PSBjcHVfdG9fbGUzMigzIDw8IDIwKTsgLyogZW5hYmxlIGludGVycnVwdCAqLworCQkJbmV4dC0+dS5pbi5pbC5xWzJdID0gY3B1X3RvX2xlMzIoMCk7IC8qIGRpc2FibGUgYnJhbmNoICovCiAKIAkJCS8qIGxpbmsgcHJldmlvdXMgdG8gbmV4dCAqLwogCQkJcHJldl9pID0gKG5leHRfaSA9PSAwKSA/IChNQVhfUEFDS0VUUyAqIHZpZGVvLT5uX2ZyYW1lcyAtIDEpIDogKG5leHRfaSAtIDEpOwogCQkJZiA9IHZpZGVvLT5mcmFtZXNbcHJldl9pIC8gTUFYX1BBQ0tFVFNdOwogCQkJcHJldiA9ICYoZi0+ZGVzY3JpcHRvcl9wb29sW3ByZXZfaSAlIE1BWF9QQUNLRVRTXSk7CiAJCQlpZiAocHJldl9pICUgKE1BWF9QQUNLRVRTLzIpKSB7Ci0JCQkJcHJldi0+dS5pbi5pbC5xWzBdICY9IH4oMyA8PCAyMCk7IC8qIG5vIGludGVycnVwdCAqLworCQkJCXByZXYtPnUuaW4uaWwucVswXSAmPSB+Y3B1X3RvX2xlMzIoMyA8PCAyMCk7IC8qIG5vIGludGVycnVwdCAqLwogCQkJfSBlbHNlIHsKLQkJCQlwcmV2LT51LmluLmlsLnFbMF0gfD0gMyA8PCAyMDsgLyogZW5hYmxlIGludGVycnVwdCAqLworCQkJCXByZXYtPnUuaW4uaWwucVswXSB8PSBjcHVfdG9fbGUzMigzIDw8IDIwKTsgLyogZW5hYmxlIGludGVycnVwdCAqLwogCQkJfQogCQkJcHJldi0+dS5pbi5pbC5xWzJdID0gY3B1X3RvX2xlMzIobmV4dF9kbWEgfCAxKTsgLyogc2V0IFo9MSAqLwogCQkJd21iKCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2llZWUxMzk0L2V0aDEzOTQuYyBiL2RyaXZlcnMvaWVlZTEzOTQvZXRoMTM5NC5jCmluZGV4IDIwMTI4NjkuLjFhOTE5ZGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWVlZTEzOTQvZXRoMTM5NC5jCisrKyBiL2RyaXZlcnMvaWVlZTEzOTQvZXRoMTM5NC5jCkBAIC05Miw3ICs5Miw3IEBACiAJc3RydWN0IGxpc3RfaGVhZCBsaXN0OwogCXUxNiBkZ2w7CiAJdTE2IGRnX3NpemU7Ci0JdTE2IGV0aGVyX3R5cGU7CisJX19iZTE2IGV0aGVyX3R5cGU7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAljaGFyICpwYnVmOwogCXN0cnVjdCBsaXN0X2hlYWQgZnJhZ19pbmZvOwpAQCAtMTgxLDcgKzE4MSw3IEBACiBzdGF0aWMgdm9pZCBldGhlcjEzOTRfaG9zdF9yZXNldChzdHJ1Y3QgaHBzYl9ob3N0ICpob3N0KTsKIAogLyogRnVuY3Rpb24gZm9yIGluY29taW5nIDEzOTQgcGFja2V0cyAqLwotc3RhdGljIHN0cnVjdCBocHNiX2FkZHJlc3Nfb3BzIGFkZHJfb3BzID0geworY29uc3Qgc3RhdGljIHN0cnVjdCBocHNiX2FkZHJlc3Nfb3BzIGFkZHJfb3BzID0gewogCS53cml0ZSA9CWV0aGVyMTM5NF93cml0ZSwKIH07CiAKQEAgLTI0NSwxMiArMjQ1LDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotLyogUmV0dXJuIHN0YXRpc3RpY3MgdG8gdGhlIGNhbGxlciAqLwotc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpldGhlcjEzOTRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKLXsKLQlyZXR1cm4gJigoKHN0cnVjdCBldGgxMzk0X3ByaXYgKiluZXRkZXZfcHJpdihkZXYpKS0+c3RhdHMpOwotfQotCiAvKiBGSVhNRTogV2hhdCB0byBkbyBpZiB3ZSB0aW1lb3V0PyBJIHRoaW5rIGEgaG9zdCByZXNldCBpcyBwcm9iYWJseSBpbiBvcmRlciwKICAqIHNvIHRoYXQncyB3aGF0IHdlIGRvLiBTaG91bGQgd2UgaW5jcmVtZW50IHRoZSBzdGF0IGNvdW50ZXJzIHRvbz8gICovCiBzdGF0aWMgdm9pZCBldGhlcjEzOTRfdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQpAQCAtNTE2LDE2ICs1MTAsMTkgQEAKIAkucGFyc2UJCT0gZXRoZXIxMzk0X2hlYWRlcl9wYXJzZSwKIH07CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgZXRoZXIxMzk0X25ldGRldl9vcHMgPSB7CisJLm5kb19vcGVuCT0gZXRoZXIxMzk0X29wZW4sCisJLm5kb19zdG9wCT0gZXRoZXIxMzk0X3N0b3AsCisJLm5kb19zdGFydF94bWl0CT0gZXRoZXIxMzk0X3R4LAorCS5uZG9fdHhfdGltZW91dAk9IGV0aGVyMTM5NF90eF90aW1lb3V0LAorCS5uZG9fY2hhbmdlX210dQk9IGV0aGVyMTM5NF9jaGFuZ2VfbXR1LAorfTsKKwogc3RhdGljIHZvaWQgZXRoZXIxMzk0X2luaXRfZGV2KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7Ci0JZGV2LT5vcGVuCQk9IGV0aGVyMTM5NF9vcGVuOwotCWRldi0+c3RvcAkJPSBldGhlcjEzOTRfc3RvcDsKLQlkZXYtPmhhcmRfc3RhcnRfeG1pdAk9IGV0aGVyMTM5NF90eDsKLQlkZXYtPmdldF9zdGF0cwkJPSBldGhlcjEzOTRfc3RhdHM7Ci0JZGV2LT50eF90aW1lb3V0CQk9IGV0aGVyMTM5NF90eF90aW1lb3V0OwotCWRldi0+Y2hhbmdlX210dQkJPSBldGhlcjEzOTRfY2hhbmdlX210dTsKIAogCWRldi0+aGVhZGVyX29wcwkJPSAmZXRoZXIxMzk0X2hlYWRlcl9vcHM7CisJZGV2LT5uZXRkZXZfb3BzCQk9ICZldGhlcjEzOTRfbmV0ZGV2X29wczsKIAogCVNFVF9FVEhUT09MX09QUyhkZXYsICZldGh0b29sX29wcyk7CiAKQEAgLTc2Nyw3ICs3NjQsNyBAQAogc3RhdGljIGludCBldGhlcjEzOTRfaGVhZGVyX2NhY2hlKGNvbnN0IHN0cnVjdCBuZWlnaGJvdXIgKm5laWdoLAogCQkJCSAgc3RydWN0IGhoX2NhY2hlICpoaCkKIHsKLQl1bnNpZ25lZCBzaG9ydCB0eXBlID0gaGgtPmhoX3R5cGU7CisJX19iZTE2IHR5cGUgPSBoaC0+aGhfdHlwZTsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbmVpZ2gtPmRldjsKIAlzdHJ1Y3QgZXRoMTM5NGhkciAqZXRoID0KIAkJKHN0cnVjdCBldGgxMzk0aGRyICopKCh1OCAqKWhoLT5oaF9kYXRhICsgMTYgLSBFVEgxMzk0X0hMRU4pOwpAQCAtNzk1LDcgKzc5Miw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKiBDb3BpZWQgZnJvbSBuZXQvZXRoZXJuZXQvZXRoLmMgKi8KLXN0YXRpYyB1MTYgZXRoZXIxMzk0X3R5cGVfdHJhbnMoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3N0YXRpYyBfX2JlMTYgZXRoZXIxMzk0X3R5cGVfdHJhbnMoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgZXRoMTM5NGhkciAqZXRoOwogCXVuc2lnbmVkIGNoYXIgKnJhd3A7CkBAIC04MjksMTcgKzgyNiwxNyBAQAogCiAvKiBQYXJzZSBhbiBlbmNhcHN1bGF0ZWQgSVAxMzk0IGhlYWRlciBpbnRvIGFuIGV0aGVybmV0IGZyYW1lIHBhY2tldC4KICAqIFdlIGFsc28gcGVyZm9ybSBBUlAgdHJhbnNsYXRpb24gaGVyZSwgaWYgbmVlZCBiZS4gICovCi1zdGF0aWMgdTE2IGV0aGVyMTM5NF9wYXJzZV9lbmNhcChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorc3RhdGljIF9fYmUxNiBldGhlcjEzOTRfcGFyc2VfZW5jYXAoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKIAkJCQkgbm9kZWlkX3Qgc3JjaWQsIG5vZGVpZF90IGRlc3RpZCwKLQkJCQkgdTE2IGV0aGVyX3R5cGUpCisJCQkJIF9fYmUxNiBldGhlcl90eXBlKQogewogCXN0cnVjdCBldGgxMzk0X3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOwotCXU2NCBkZXN0X2h3OwotCXVuc2lnbmVkIHNob3J0IHJldCA9IDA7CisJX19iZTY0IGRlc3RfaHc7CisJX19iZTE2IHJldCA9IDA7CiAKIAkvKiBTZXR1cCBvdXIgaHcgYWRkcmVzc2VzLiBXZSB1c2UgdGhlc2UgdG8gYnVpbGQgdGhlIGV0aGVybmV0IGhlYWRlci4gKi8KIAlpZiAoZGVzdGlkID09IChMT0NBTF9CVVMgfCBBTExfTk9ERVMpKQotCQlkZXN0X2h3ID0gfjBVTEw7ICAvKiBicm9hZGNhc3QgKi8KKwkJZGVzdF9odyA9IH5jcHVfdG9fYmU2NCgwKTsgIC8qIGJyb2FkY2FzdCAqLwogCWVsc2UKIAkJZGVzdF9odyA9IGNwdV90b19iZTY0KCh1NjQpcHJpdi0+aG9zdC0+Y3NyLmd1aWRfaGkgPDwgMzIgfAogCQkJCSAgICAgIHByaXYtPmhvc3QtPmNzci5ndWlkX2xvKTsKQEAgLTg3Myw3ICs4NzAsNyBAQAogCQlub2RlID0gZXRoMTM5NF9maW5kX25vZGVfZ3VpZCgmcHJpdi0+aXBfbm9kZV9saXN0LAogCQkJCQkgICAgICBiZTY0X3RvX2NwdShndWlkKSk7CiAJCWlmICghbm9kZSkKLQkJCXJldHVybiAwOworCQkJcmV0dXJuIGNwdV90b19iZTE2KDApOwogCiAJCW5vZGVfaW5mbyA9CiAJCSAgICAoc3RydWN0IGV0aDEzOTRfbm9kZV9pbmZvICopbm9kZS0+dWQtPmRldmljZS5kcml2ZXJfZGF0YTsKQEAgLTEwNjMsNyArMTA2MCw3IEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzdHJ1Y3QgZXRoMTM5NF9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAl1bmlvbiBldGgxMzk0X2hkciAqaGRyID0gKHVuaW9uIGV0aDEzOTRfaGRyICopYnVmOwotCXUxNiBldGhlcl90eXBlID0gMDsgIC8qIGluaXRpYWxpemVkIHRvIGNsZWFyIHdhcm5pbmcgKi8KKwlfX2JlMTYgZXRoZXJfdHlwZSA9IGNwdV90b19iZTE2KDApOyAgLyogaW5pdGlhbGl6ZWQgdG8gY2xlYXIgd2FybmluZyAqLwogCWludCBoZHJfbGVuOwogCXN0cnVjdCB1bml0X2RpcmVjdG9yeSAqdWQgPSBwcml2LT51ZF9saXN0W05PREVJRF9UT19OT0RFKHNyY2lkKV07CiAJc3RydWN0IGV0aDEzOTRfbm9kZV9pbmZvICpub2RlX2luZm87CkBAIC0xMDc1LDcgKzEwNzIsNyBAQAogCQkJSFBTQl9QUklOVChLRVJOX0VSUiwgImV0aGVyMTM5NCByeDogc2VuZGVyIG5vZGVpZCAiCiAJCQkJICAgImxvb2t1cCBmYWlsdXJlOiAiIE5PREVfQlVTX0ZNVCwKIAkJCQkgICBOT0RFX0JVU19BUkdTKHByaXYtPmhvc3QsIHNyY2lkKSk7Ci0JCQlwcml2LT5zdGF0cy5yeF9kcm9wcGVkKys7CisJCQlkZXYtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKIAkJCXJldHVybiAtMTsKIAkJfQogCQl1ZCA9IG5vZGUtPnVkOwpAQCAtMTA5OCw3ICsxMDk1LDcgQEAKIAkJc2tiID0gZGV2X2FsbG9jX3NrYihsZW4gKyBkZXYtPmhhcmRfaGVhZGVyX2xlbiArIDE1KTsKIAkJaWYgKHVubGlrZWx5KCFza2IpKSB7CiAJCQlFVEgxMzk0X1BSSU5UX0coS0VSTl9FUlIsICJPdXQgb2YgbWVtb3J5XG4iKTsKLQkJCXByaXYtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKKwkJCWRldi0+c3RhdHMucnhfZHJvcHBlZCsrOwogCQkJcmV0dXJuIC0xOwogCQl9CiAJCXNrYl9yZXNlcnZlKHNrYiwgKGRldi0+aGFyZF9oZWFkZXJfbGVuICsgMTUpICYgfjE1KTsKQEAgLTEyMTcsMTUgKzEyMTQsMTUgQEAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwogCiAJaWYgKCFza2ItPnByb3RvY29sKSB7Ci0JCXByaXYtPnN0YXRzLnJ4X2Vycm9ycysrOwotCQlwcml2LT5zdGF0cy5yeF9kcm9wcGVkKys7CisJCWRldi0+c3RhdHMucnhfZXJyb3JzKys7CisJCWRldi0+c3RhdHMucnhfZHJvcHBlZCsrOwogCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOwogCX0gZWxzZSBpZiAobmV0aWZfcngoc2tiKSA9PSBORVRfUlhfRFJPUCkgewotCQlwcml2LT5zdGF0cy5yeF9lcnJvcnMrKzsKLQkJcHJpdi0+c3RhdHMucnhfZHJvcHBlZCsrOworCQlkZXYtPnN0YXRzLnJ4X2Vycm9ycysrOworCQlkZXYtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKIAl9IGVsc2UgewotCQlwcml2LT5zdGF0cy5yeF9wYWNrZXRzKys7Ci0JCXByaXYtPnN0YXRzLnJ4X2J5dGVzICs9IHNrYi0+bGVuOworCQlkZXYtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKwkJZGV2LT5zdGF0cy5yeF9ieXRlcyArPSBza2ItPmxlbjsKIAl9CiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7CkBAIC0xMjM0LDggKzEyMzEsNiBAQAogCWlmIChuZXRpZl9xdWV1ZV9zdG9wcGVkKGRldikpCiAJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKIAotCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7Ci0KIAlyZXR1cm4gMDsKIH0KIApAQCAtMTI1OSw3ICsxMjU0LDcgQEAKIAogc3RhdGljIHZvaWQgZXRoZXIxMzk0X2lzbyhzdHJ1Y3QgaHBzYl9pc28gKmlzbykKIHsKLQlxdWFkbGV0X3QgKmRhdGE7CisJX19iZTMyICpkYXRhOwogCWNoYXIgKmJ1ZjsKIAlzdHJ1Y3QgZXRoMTM5NF9ob3N0X2luZm8gKmhpOwogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CkBAIC0xMjgzLDcgKzEyNzgsNyBAQAogCWZvciAoaSA9IDA7IGkgPCBucmVhZHk7IGkrKykgewogCQlzdHJ1Y3QgaHBzYl9pc29fcGFja2V0X2luZm8gKmluZm8gPQogCQkJJmlzby0+aW5mb3NbKGlzby0+Zmlyc3RfcGFja2V0ICsgaSkgJSBpc28tPmJ1Zl9wYWNrZXRzXTsKLQkJZGF0YSA9IChxdWFkbGV0X3QgKikoaXNvLT5kYXRhX2J1Zi5rdmlydCArIGluZm8tPm9mZnNldCk7CisJCWRhdGEgPSAoX19iZTMyICopKGlzby0+ZGF0YV9idWYua3ZpcnQgKyBpbmZvLT5vZmZzZXQpOwogCiAJCS8qIHNraXAgb3ZlciBHQVNQIGhlYWRlciAqLwogCQlidWYgPSAoY2hhciAqKWRhdGEgKyA4OwpAQCAtMTUwOSwxNyArMTUwNCwxOCBAQAogc3RhdGljIHZvaWQgZXRoZXIxMzk0X2RnX2NvbXBsZXRlKHN0cnVjdCBwYWNrZXRfdGFzayAqcHRhc2ssIGludCBmYWlsKQogewogCXN0cnVjdCBza19idWZmICpza2IgPSBwdGFzay0+c2tiOwotCXN0cnVjdCBldGgxMzk0X3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihza2ItPmRldik7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHNrYi0+ZGV2OworCXN0cnVjdCBldGgxMzk0X3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAkvKiBTdGF0aXN0aWNzICovCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKIAlpZiAoZmFpbCkgewotCQlwcml2LT5zdGF0cy50eF9kcm9wcGVkKys7Ci0JCXByaXYtPnN0YXRzLnR4X2Vycm9ycysrOworCQlkZXYtPnN0YXRzLnR4X2Ryb3BwZWQrKzsKKwkJZGV2LT5zdGF0cy50eF9lcnJvcnMrKzsKIAl9IGVsc2UgewotCQlwcml2LT5zdGF0cy50eF9ieXRlcyArPSBza2ItPmxlbjsKLQkJcHJpdi0+c3RhdHMudHhfcGFja2V0cysrOworCQlkZXYtPnN0YXRzLnR4X2J5dGVzICs9IHNrYi0+bGVuOworCQlkZXYtPnN0YXRzLnR4X3BhY2tldHMrKzsKIAl9CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwogCkBAIC0xNjE0LDcgKzE2MTAsNyBAQAogCQlpZiAobWF4X3BheWxvYWQgPCBkZ19zaXplICsgaGRyX3R5cGVfbGVuW0VUSDEzOTRfSERSX0xGX1VGXSkKIAkJCXByaXYtPmJjX2RnbCsrOwogCX0gZWxzZSB7Ci0JCV9fYmU2NCBndWlkID0gZ2V0X3VuYWxpZ25lZCgodTY0ICopaGRyX2J1Zi5oX2Rlc3QpOworCQlfX2JlNjQgZ3VpZCA9IGdldF91bmFsaWduZWQoKF9fYmU2NCAqKWhkcl9idWYuaF9kZXN0KTsKIAogCQlub2RlID0gZXRoMTM5NF9maW5kX25vZGVfZ3VpZCgmcHJpdi0+aXBfbm9kZV9saXN0LAogCQkJCQkgICAgICBiZTY0X3RvX2NwdShndWlkKSk7CkBAIC0xNjk2LDggKzE2OTIsOCBAQAogCQlkZXZfa2ZyZWVfc2tiKHNrYik7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwotCXByaXYtPnN0YXRzLnR4X2Ryb3BwZWQrKzsKLQlwcml2LT5zdGF0cy50eF9lcnJvcnMrKzsKKwlkZXYtPnN0YXRzLnR4X2Ryb3BwZWQrKzsKKwlkZXYtPnN0YXRzLnR4X2Vycm9ycysrOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKIAogCS8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL2llZWUxMzk0L2V0aDEzOTQuaCBiL2RyaXZlcnMvaWVlZTEzOTQvZXRoMTM5NC5oCmluZGV4IDRmM2UyZGQuLmQ1M2JhYzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWVlZTEzOTQvZXRoMTM5NC5oCisrKyBiL2RyaXZlcnMvaWVlZTEzOTQvZXRoMTM5NC5oCkBAIC01NCw3ICs1NCw2IEBACiAKIC8qIFByaXZhdGUgc3RydWN0dXJlIGZvciBvdXIgZXRoZXJuZXQgZHJpdmVyICovCiBzdHJ1Y3QgZXRoMTM5NF9wcml2IHsKLQlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsJLyogRGV2aWNlIHN0YXRzCQkJICovCiAJc3RydWN0IGhwc2JfaG9zdCAqaG9zdDsJCS8qIFRoZSBjYXJkIGZvciB0aGlzIGRldgkgKi8KIAl1MTYgYmNfbWF4cGF5bG9hZDsJCS8qIE1heCBicm9hZGNhc3QgcGF5bG9hZAkgKi8KIAl1OCBiY19zc3BkOwkJCS8qIE1heCBicm9hZGNhc3Qgc3BlZWQJCSAqLwpAQCAtODIsNyArODEsNyBAQAogCiBzdHJ1Y3QgZXRoMTM5NGhkciB7CiAJdW5zaWduZWQgY2hhcgloX2Rlc3RbRVRIMTM5NF9BTEVOXTsJLyogZGVzdGluYXRpb24gZXRoMTM5NCBhZGRyCSovCi0JdW5zaWduZWQgc2hvcnQJaF9wcm90bzsJCS8qIHBhY2tldCB0eXBlIElEIGZpZWxkCSovCisJX19iZTE2CQloX3Byb3RvOwkJLyogcGFja2V0IHR5cGUgSUQgZmllbGQJKi8KIH0gIF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBldGgxMzk0aGRyICpldGgxMzk0X2hkcihjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQpAQCAtOTksMTMgKzk4LDEzIEBACiBzdHJ1Y3QgZXRoMTM5NF91Zl9oZHIgewogCXUxNiBsZjoyOwogCXUxNiByZXM6MTQ7Ci0JdTE2IGV0aGVyX3R5cGU7CQkvKiBFdGhlcm5ldCBwYWNrZXQgdHlwZSAqLworCV9fYmUxNiBldGhlcl90eXBlOwkJLyogRXRoZXJuZXQgcGFja2V0IHR5cGUgKi8KIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CiAjZWxpZiBkZWZpbmVkIF9fTElUVExFX0VORElBTl9CSVRGSUVMRAogc3RydWN0IGV0aDEzOTRfdWZfaGRyIHsKIAl1MTYgcmVzOjE0OwogCXUxNiBsZjoyOwotCXUxNiBldGhlcl90eXBlOworCV9fYmUxNiBldGhlcl90eXBlOwogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKICNlbHNlCiAjZXJyb3IgVW5rbm93biBiaXQgZmllbGQgdHlwZQpAQCAtMTE3LDcgKzExNiw3IEBACiAJdTE2IGxmOjI7CiAJdTE2IHJlczE6MjsKIAl1MTYgZGdfc2l6ZToxMjsJCS8qIERhdGFncmFtIHNpemUgKi8KLQl1MTYgZXRoZXJfdHlwZTsJCS8qIEV0aGVybmV0IHBhY2tldCB0eXBlICovCisJX19iZTE2IGV0aGVyX3R5cGU7CQkvKiBFdGhlcm5ldCBwYWNrZXQgdHlwZSAqLwogCXUxNiBkZ2w7CQkvKiBEYXRhZ3JhbSBsYWJlbCAqLwogCXUxNiByZXMyOwogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKQEAgLTEyNiw3ICsxMjUsNyBAQAogCXUxNiBkZ19zaXplOjEyOwogCXUxNiByZXMxOjI7CiAJdTE2IGxmOjI7Ci0JdTE2IGV0aGVyX3R5cGU7CisJX19iZTE2IGV0aGVyX3R5cGU7CiAJdTE2IGRnbDsKIAl1MTYgcmVzMjsKIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CkBAIC0yMDcsMTEgKzIwNiwxMSBAQAogCXUxNiBvcGNvZGU7CQkvKiBBUlAgT3Bjb2RlCSovCiAJLyogQWJvdmUgaXMgZXhhY3RseSB0aGUgc2FtZSBmb3JtYXQgYXMgc3RydWN0IGFycGhkciAqLwogCi0JdTY0IHNfdW5pcV9pZDsJCS8qIFNlbmRlcidzIDY0Yml0IEVVSQkJCSovCisJX19iZTY0IHNfdW5pcV9pZDsJLyogU2VuZGVyJ3MgNjRiaXQgRVVJCQkqLwogCXU4IG1heF9yZWM7CQkvKiBTZW5kZXIncyBtYXggcGFja2V0IHNpemUJCSovCiAJdTggc3NwZDsJCS8qIFNlbmRlcidzIG1heCBzcGVlZAkJCSovCi0JdTE2IGZpZm9faGk7CQkvKiBoaSAxNmJpdHMgb2Ygc2VuZGVyJ3MgRklGTyBhZGRyCSovCi0JdTMyIGZpZm9fbG87CQkvKiBsbyAzMmJpdHMgb2Ygc2VuZGVyJ3MgRklGTyBhZGRyCSovCisJX19iZTE2IGZpZm9faGk7CQkvKiBoaSAxNmJpdHMgb2Ygc2VuZGVyJ3MgRklGTyBhZGRyCSovCisJX19iZTMyIGZpZm9fbG87CQkvKiBsbyAzMmJpdHMgb2Ygc2VuZGVyJ3MgRklGTyBhZGRyCSovCiAJdTMyIHNpcDsJCS8qIFNlbmRlcidzIElQIEFkZHJlc3MJCQkqLwogCXUzMiB0aXA7CQkvKiBJUCBBZGRyZXNzIG9mIHJlcXVlc3RlZCBodyBhZGRyCSovCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZWVlMTM5NC9oaWdobGV2ZWwuYyBiL2RyaXZlcnMvaWVlZTEzOTQvaGlnaGxldmVsLmMKaW5kZXggMjcyNTQzYS4uNjAwZTM5MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZWVlMTM5NC9oaWdobGV2ZWwuYworKysgYi9kcml2ZXJzL2llZWUxMzk0L2hpZ2hsZXZlbC5jCkBAIC0zMjAsNyArMzIwLDcgQEAKICAqLwogdTY0IGhwc2JfYWxsb2NhdGVfYW5kX3JlZ2lzdGVyX2FkZHJzcGFjZShzdHJ1Y3QgaHBzYl9oaWdobGV2ZWwgKmhsLAogCQkJCQkgc3RydWN0IGhwc2JfaG9zdCAqaG9zdCwKLQkJCQkJIHN0cnVjdCBocHNiX2FkZHJlc3Nfb3BzICpvcHMsCisJCQkJCSBjb25zdCBzdHJ1Y3QgaHBzYl9hZGRyZXNzX29wcyAqb3BzLAogCQkJCQkgdTY0IHNpemUsIHU2NCBhbGlnbm1lbnQsCiAJCQkJCSB1NjQgc3RhcnQsIHU2NCBlbmQpCiB7CkBAIC00MDcsNyArNDA3LDggQEAKICAqIGFyZSBhdXRvbWF0aWNhbGx5IGRlYWxsb2NhdGVkIHRvZ2V0aGVyIHdpdGggdGhlIGhwc2JfaGlnaGxldmVsIEBobC4KICAqLwogaW50IGhwc2JfcmVnaXN0ZXJfYWRkcnNwYWNlKHN0cnVjdCBocHNiX2hpZ2hsZXZlbCAqaGwsIHN0cnVjdCBocHNiX2hvc3QgKmhvc3QsCi0JCQkgICAgc3RydWN0IGhwc2JfYWRkcmVzc19vcHMgKm9wcywgdTY0IHN0YXJ0LCB1NjQgZW5kKQorCQkJICAgIGNvbnN0IHN0cnVjdCBocHNiX2FkZHJlc3Nfb3BzICpvcHMsCisJCQkgICAgdTY0IHN0YXJ0LCB1NjQgZW5kKQogewogCXN0cnVjdCBocHNiX2FkZHJlc3Nfc2VydmUgKmFzOwogCXN0cnVjdCBsaXN0X2hlYWQgKmxoOwpAQCAtNDIwLDcgKzQyMSw3IEBACiAJCXJldHVybiAwOwogCX0KIAotCWFzID0ga21hbGxvYyhzaXplb2YoKmFzKSwgR0ZQX0FUT01JQyk7CisJYXMgPSBrbWFsbG9jKHNpemVvZigqYXMpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWFzKQogCQlyZXR1cm4gMDsKIApAQCAtNDc3LDcgKzQ3OCw3IEBACiAJcmV0dXJuIHJldHZhbDsKIH0KIAotc3RhdGljIHN0cnVjdCBocHNiX2FkZHJlc3Nfb3BzIGR1bW15X29wczsKK2NvbnN0IHN0YXRpYyBzdHJ1Y3QgaHBzYl9hZGRyZXNzX29wcyBkdW1teV9vcHM7CiAKIC8qIGR1bW15IGFkZHJlc3Mgc3BhY2VzIGFzIGxvd2VyIGFuZCB1cHBlciBib3VuZHMgb2YgdGhlIGhvc3QncyBhLnMuIGxpc3QgKi8KIHN0YXRpYyB2b2lkIGluaXRfaHBzYl9oaWdobGV2ZWwoc3RydWN0IGhwc2JfaG9zdCAqaG9zdCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWVlZTEzOTQvaGlnaGxldmVsLmggYi9kcml2ZXJzL2llZWUxMzk0L2hpZ2hsZXZlbC5oCmluZGV4IGJjNWQwODUuLjlkYmE4OWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWVlZTEzOTQvaGlnaGxldmVsLmgKKysrIGIvZHJpdmVycy9pZWVlMTM5NC9oaWdobGV2ZWwuaApAQCAtMTUsNyArMTUsNyBAQAogc3RydWN0IGhwc2JfYWRkcmVzc19zZXJ2ZSB7CiAJc3RydWN0IGxpc3RfaGVhZCBob3N0X2xpc3Q7CS8qIHBlciBob3N0IGxpc3QgKi8KIAlzdHJ1Y3QgbGlzdF9oZWFkIGhsX2xpc3Q7CS8qIGhwc2JfaGlnaGxldmVsIGxpc3QgKi8KLQlzdHJ1Y3QgaHBzYl9hZGRyZXNzX29wcyAqb3A7CisJY29uc3Qgc3RydWN0IGhwc2JfYWRkcmVzc19vcHMgKm9wOwogCXN0cnVjdCBocHNiX2hvc3QgKmhvc3Q7CiAJdTY0IHN0YXJ0OwkvKiBmaXJzdCBhZGRyZXNzIGhhbmRsZWQsIHF1YWRsZXQgYWxpZ25lZCAqLwogCXU2NCBlbmQ7CS8qIGZpcnN0IGFkZHJlc3MgYmVoaW5kLCBxdWFkbGV0IGFsaWduZWQgKi8KQEAgLTExOSwxMSArMTE5LDEyIEBACiAKIHU2NCBocHNiX2FsbG9jYXRlX2FuZF9yZWdpc3Rlcl9hZGRyc3BhY2Uoc3RydWN0IGhwc2JfaGlnaGxldmVsICpobCwKIAkJCQkJIHN0cnVjdCBocHNiX2hvc3QgKmhvc3QsCi0JCQkJCSBzdHJ1Y3QgaHBzYl9hZGRyZXNzX29wcyAqb3BzLAorCQkJCQkgY29uc3Qgc3RydWN0IGhwc2JfYWRkcmVzc19vcHMgKm9wcywKIAkJCQkJIHU2NCBzaXplLCB1NjQgYWxpZ25tZW50LAogCQkJCQkgdTY0IHN0YXJ0LCB1NjQgZW5kKTsKIGludCBocHNiX3JlZ2lzdGVyX2FkZHJzcGFjZShzdHJ1Y3QgaHBzYl9oaWdobGV2ZWwgKmhsLCBzdHJ1Y3QgaHBzYl9ob3N0ICpob3N0LAotCQkJICAgIHN0cnVjdCBocHNiX2FkZHJlc3Nfb3BzICpvcHMsIHU2NCBzdGFydCwgdTY0IGVuZCk7CisJCQkgICAgY29uc3Qgc3RydWN0IGhwc2JfYWRkcmVzc19vcHMgKm9wcywKKwkJCSAgICB1NjQgc3RhcnQsIHU2NCBlbmQpOwogaW50IGhwc2JfdW5yZWdpc3Rlcl9hZGRyc3BhY2Uoc3RydWN0IGhwc2JfaGlnaGxldmVsICpobCwgc3RydWN0IGhwc2JfaG9zdCAqaG9zdCwKIAkJCSAgICAgIHU2NCBzdGFydCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWVlZTEzOTQvaG9zdHMuYyBiL2RyaXZlcnMvaWVlZTEzOTQvaG9zdHMuYwppbmRleCAyMzdkMGM5Li5lOTQ3ZDhmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2llZWUxMzk0L2hvc3RzLmMKKysrIGIvZHJpdmVycy9pZWVlMTM5NC9ob3N0cy5jCkBAIC0zNCwxOCArMzQsMTggQEAKIHsKIAlzdHJ1Y3QgaHBzYl9ob3N0ICpob3N0ID0KIAkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBocHNiX2hvc3QsIGRlbGF5ZWRfcmVzZXQud29yayk7Ci0JaW50IGdlbmVyYXRpb24gPSBob3N0LT5jc3IuZ2VuZXJhdGlvbiArIDE7CisJdTggZ2VuZXJhdGlvbiA9IGhvc3QtPmNzci5nZW5lcmF0aW9uICsgMTsKIAogCS8qIFRoZSBnZW5lcmF0aW9uIGZpZWxkIHJvbGxzIG92ZXIgdG8gMiByYXRoZXIgdGhhbiAwIHBlciBJRUVFCiAJICogMTM5NGEtMjAwMC4gKi8KIAlpZiAoZ2VuZXJhdGlvbiA+IDB4ZiB8fCBnZW5lcmF0aW9uIDwgMikKIAkJZ2VuZXJhdGlvbiA9IDI7CiAKLQlDU1JfU0VUX0JVU19JTkZPX0dFTkVSQVRJT04oaG9zdC0+Y3NyLnJvbSwgZ2VuZXJhdGlvbik7CisJY3NyX3NldF9idXNfaW5mb19nZW5lcmF0aW9uKGhvc3QtPmNzci5yb20sIGdlbmVyYXRpb24pOwogCWlmIChjc3IxMjEyX2dlbmVyYXRlX2Nzcl9pbWFnZShob3N0LT5jc3Iucm9tKSAhPSBDU1IxMjEyX1NVQ0NFU1MpIHsKIAkJLyogQ1NSIGltYWdlIGNyZWF0aW9uIGZhaWxlZC4KIAkJICogUmVzZXQgZ2VuZXJhdGlvbiBmaWVsZCBhbmQgZG8gbm90IGlzc3VlIGEgYnVzIHJlc2V0LiAqLwotCQlDU1JfU0VUX0JVU19JTkZPX0dFTkVSQVRJT04oaG9zdC0+Y3NyLnJvbSwKKwkJY3NyX3NldF9idXNfaW5mb19nZW5lcmF0aW9uKGhvc3QtPmNzci5yb20sCiAJCQkJCSAgICBob3N0LT5jc3IuZ2VuZXJhdGlvbik7CiAJCXJldHVybjsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2llZWUxMzk0L2hvc3RzLmggYi9kcml2ZXJzL2llZWUxMzk0L2hvc3RzLmgKaW5kZXggZGQyMjk5NS4uNDljMzU5MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZWVlMTM5NC9ob3N0cy5oCisrKyBiL2RyaXZlcnMvaWVlZTEzOTQvaG9zdHMuaApAQCAtMTU0LDcgKzE1NCw3IEBACiAJICogdG8gc2V0IHRoZSBoYXJkd2FyZSBDb25maWdST00gaWYgdGhlIGhhcmR3YXJlIHN1cHBvcnRzIGhhbmRsaW5nCiAJICogcmVhZHMgdG8gdGhlIENvbmZpZ1JPTSBvbiBpdHMgb3duLiAqLwogCXZvaWQgKCpzZXRfaHdfY29uZmlnX3JvbSkoc3RydWN0IGhwc2JfaG9zdCAqaG9zdCwKLQkJCQkgIHF1YWRsZXRfdCAqY29uZmlnX3JvbSk7CisJCQkJICBfX2JlMzIgKmNvbmZpZ19yb20pOwogCiAJLyogVGhpcyBmdW5jdGlvbiBzaGFsbCBpbXBsZW1lbnQgcGFja2V0IHRyYW5zbWlzc2lvbiBiYXNlZCBvbgogCSAqIHBhY2tldC0+dHlwZS4gIEl0IHNoYWxsIENSQyBib3RoIHBhcnRzIG9mIHRoZSBwYWNrZXQgKHVubGVzcwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZWVlMTM5NC9pZWVlMTM5NC5oIGIvZHJpdmVycy9pZWVlMTM5NC9pZWVlMTM5NC5oCmluZGV4IDQwNDkyMDcuLmUwYWUwZDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWVlZTEzOTQvaWVlZTEzOTQuaAorKysgYi9kcml2ZXJzL2llZWUxMzk0L2llZWUxMzk0LmgKQEAgLTEyMSw2ICsxMjEsOSBAQAogCiAjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgogCisvKiAnMScgJzMnICc5JyAnNCcgaW4gQVNDSUkgKi8KKyNkZWZpbmUgSUVFRTEzOTRfQlVTSURfTUFHSUMJY3B1X3RvX2JlMzIoMHgzMTMzMzkzNCkKKwogI2lmZGVmIF9fQklHX0VORElBTl9CSVRGSUVMRAogCiBzdHJ1Y3Qgc2VsZmlkIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWVlZTEzOTQvbm9kZW1nci5jIGIvZHJpdmVycy9pZWVlMTM5NC9ub2RlbWdyLmMKaW5kZXggNzllZjVmZC4uOTA2YzVhOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZWVlMTM5NC9ub2RlbWdyLmMKKysrIGIvZHJpdmVycy9pZWVlMTM5NC9ub2RlbWdyLmMKQEAgLTY3LDcgKzY3LDcgQEAKIAlmb3IgKGkgPSBJRUVFMTM5NF9TUEVFRF8xMDA7IGkgPD0gb2xkX3NwZWVkOyBpKyspIHsKIAkJKnNwZWVkID0gaTsKIAkJZXJyb3IgPSBocHNiX3JlYWQoY2ktPmhvc3QsIGNpLT5ub2RlaWQsIGNpLT5nZW5lcmF0aW9uLCBhZGRyLAotCQkJCSAgJnEsIHNpemVvZihxdWFkbGV0X3QpKTsKKwkJCQkgICZxLCA0KTsKIAkJaWYgKGVycm9yKQogCQkJYnJlYWs7CiAJCSpidWZmZXIgPSBxOwpAQCAtODUsNyArODUsNyBAQAogCXJldHVybiBlcnJvcjsKIH0KIAotc3RhdGljIGludCBub2RlbWdyX2J1c19yZWFkKHN0cnVjdCBjc3IxMjEyX2NzciAqY3NyLCB1NjQgYWRkciwgdTE2IGxlbmd0aCwKK3N0YXRpYyBpbnQgbm9kZW1ncl9idXNfcmVhZChzdHJ1Y3QgY3NyMTIxMl9jc3IgKmNzciwgdTY0IGFkZHIsCiAJCQkgICAgdm9pZCAqYnVmZmVyLCB2b2lkICpfX2NpKQogewogCXN0cnVjdCBub2RlbWdyX2Nzcl9pbmZvICpjaSA9IChzdHJ1Y3Qgbm9kZW1ncl9jc3JfaW5mbyopX19jaTsKQEAgLTkzLDcgKzkzLDcgQEAKIAogCWZvciAoaSA9IDE7IDsgaSsrKSB7CiAJCWVycm9yID0gaHBzYl9yZWFkKGNpLT5ob3N0LCBjaS0+bm9kZWlkLCBjaS0+Z2VuZXJhdGlvbiwgYWRkciwKLQkJCQkgIGJ1ZmZlciwgbGVuZ3RoKTsKKwkJCQkgIGJ1ZmZlciwgNCk7CiAJCWlmICghZXJyb3IpIHsKIAkJCWNpLT5zcGVlZF91bnZlcmlmaWVkID0gMDsKIAkJCWJyZWFrOwpAQCAtMTA0LDcgKzEwNCw3IEBACiAKIAkJLyogVGhlIGllZWUxMzk0X2NvcmUgZ3Vlc3NlZCB0aGUgbm9kZSdzIHNwZWVkIGNhcGFiaWxpdHkgZnJvbQogCQkgKiB0aGUgc2VsZiBJRC4gIENoZWNrIHdoZXRoZXIgYSBsb3dlciBzcGVlZCB3b3Jrcy4gKi8KLQkJaWYgKGNpLT5zcGVlZF91bnZlcmlmaWVkICYmIGxlbmd0aCA9PSBzaXplb2YocXVhZGxldF90KSkgeworCQlpZiAoY2ktPnNwZWVkX3VudmVyaWZpZWQpIHsKIAkJCWVycm9yID0gbm9kZW1ncl9jaGVja19zcGVlZChjaSwgYWRkciwgYnVmZmVyKTsKIAkJCWlmICghZXJyb3IpCiAJCQkJYnJlYWs7CkBAIC0xMTUsMjAgKzExNSw4IEBACiAJcmV0dXJuIGVycm9yOwogfQogCi0jZGVmaW5lIE9VSV9GUkVFQ09NX1RFQ0hOT0xPR0lFU19HTUJIIDB4MDAwMWRiCi0KLXN0YXRpYyBpbnQgbm9kZW1ncl9nZXRfbWF4X3JvbShxdWFkbGV0X3QgKmJ1c19pbmZvX2RhdGEsIHZvaWQgKl9fY2kpCi17Ci0JLyogRnJlZWNvbSBGaXJlV2lyZSBIYXJkIERyaXZlIGZpcm13YXJlIGJ1ZyAqLwotCWlmIChiZTMyX3RvX2NwdShidXNfaW5mb19kYXRhWzNdKSA+PiA4ID09IE9VSV9GUkVFQ09NX1RFQ0hOT0xPR0lFU19HTUJIKQotCQlyZXR1cm4gMDsKLQotCXJldHVybiAoYmUzMl90b19jcHUoYnVzX2luZm9fZGF0YVsyXSkgPj4gOCkgJiAweDM7Ci19Ci0KIHN0YXRpYyBzdHJ1Y3QgY3NyMTIxMl9idXNfb3BzIG5vZGVtZ3JfY3NyX29wcyA9IHsKIAkuYnVzX3JlYWQgPQlub2RlbWdyX2J1c19yZWFkLAotCS5nZXRfbWF4X3JvbSA9CW5vZGVtZ3JfZ2V0X21heF9yb20KIH07CiAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZWVlMTM5NC9ub2RlbWdyLmggYi9kcml2ZXJzL2llZWUxMzk0L25vZGVtZ3IuaAppbmRleCA0ZjI4N2EzLi4xNWVhMDk3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2llZWUxMzk0L25vZGVtZ3IuaAorKysgYi9kcml2ZXJzL2llZWUxMzk0L25vZGVtZ3IuaApAQCAtMzEsOSArMzEsNiBAQAogc3RydWN0IGhwc2JfaG9zdDsKIHN0cnVjdCBpZWVlMTM5NF9kZXZpY2VfaWQ7CiAKLS8qICcxJyAnMycgJzknICc0JyBpbiBBU0NJSSAqLwotI2RlZmluZSBJRUVFMTM5NF9CVVNJRF9NQUdJQwlfX2NvbnN0YW50X2NwdV90b19iZTMyKDB4MzEzMzM5MzQpCi0KIC8qIFRoaXMgaXMgdGhlIHN0YXJ0IG9mIGEgTm9kZSBlbnRyeSBzdHJ1Y3R1cmUuIEl0IHNob3VsZCBiZSBhIHN0YWJsZSBBUEkKICAqIGZvciB3aGljaCB0byBnYXRoZXIgaW5mbyBmcm9tIHRoZSBOb2RlIE1hbmFnZXIgYWJvdXQgZGV2aWNlcyBhdHRhY2hlZAogICogdG8gdGhlIGJ1cy4gICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2llZWUxMzk0L29oY2kxMzk0LmMgYi9kcml2ZXJzL2llZWUxMzk0L29oY2kxMzk0LmMKaW5kZXggZTUwOWUxMy4uNjVjMTQyOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZWVlMTM5NC9vaGNpMTM5NC5jCisrKyBiL2RyaXZlcnMvaWVlZTEzOTQvb2hjaTEzOTQuYwpAQCAtMjk3Myw3ICsyOTczLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgb2hjaV9zZXRfaHdfY29uZmlnX3JvbShzdHJ1Y3QgaHBzYl9ob3N0ICpob3N0LCBxdWFkbGV0X3QgKmNvbmZpZ19yb20pCitzdGF0aWMgdm9pZCBvaGNpX3NldF9od19jb25maWdfcm9tKHN0cnVjdCBocHNiX2hvc3QgKmhvc3QsIF9fYmUzMiAqY29uZmlnX3JvbSkKIHsKIAlzdHJ1Y3QgdGlfb2hjaSAqb2hjaSA9IGhvc3QtPmhvc3RkYXRhOwogCkBAIC0zMTk5LDE1ICszMTk5LDE2IEBACiAJLyogTm93IGVuYWJsZSBMUFMsIHdoaWNoIHdlIG5lZWQgaW4gb3JkZXIgdG8gc3RhcnQgYWNjZXNzaW5nCiAJICogbW9zdCBvZiB0aGUgcmVnaXN0ZXJzLiAgSW4gZmFjdCwgb24gc29tZSBjYXJkcyAoQUxJIE01MjUxKSwKIAkgKiBhY2Nlc3NpbmcgcmVnaXN0ZXJzIGluIHRoZSBTQ2xrIGRvbWFpbiB3aXRob3V0IExQUyBlbmFibGVkCi0JICogd2lsbCBsb2NrIHVwIHRoZSBtYWNoaW5lLiAgV2FpdCA1MG1zZWMgdG8gbWFrZSBzdXJlIHdlIGhhdmUKLQkgKiBmdWxsIGxpbmsgZW5hYmxlZC4gICovCisJICogd2lsbCBsb2NrIHVwIHRoZSBtYWNoaW5lLiAqLwogCXJlZ193cml0ZShvaGNpLCBPSENJMTM5NF9IQ0NvbnRyb2xTZXQsIE9IQ0kxMzk0X0hDQ29udHJvbF9MUFMpOwogCiAJLyogRGlzYWJsZSBhbmQgY2xlYXIgaW50ZXJydXB0cyAqLwogCXJlZ193cml0ZShvaGNpLCBPSENJMTM5NF9JbnRFdmVudENsZWFyLCAweGZmZmZmZmZmKTsKIAlyZWdfd3JpdGUob2hjaSwgT0hDSTEzOTRfSW50TWFza0NsZWFyLCAweGZmZmZmZmZmKTsKIAotCW1kZWxheSg1MCk7CisJLyogRmx1c2ggTU1JTyB3cml0ZXMgYW5kIHdhaXQgdG8gbWFrZSBzdXJlIHdlIGhhdmUgZnVsbCBsaW5rIGVuYWJsZWQuICovCisJcmVnX3JlYWQob2hjaSwgT0hDSTEzOTRfVmVyc2lvbik7CisJbXNsZWVwKDUwKTsKIAogCS8qIERldGVybWluZSB0aGUgbnVtYmVyIG9mIGF2YWlsYWJsZSBJUiBhbmQgSVQgY29udGV4dHMuICovCiAJb2hjaS0+bmJfaXNvX3Jjdl9jdHggPQpAQCAtMzIzMyw4ICszMjM0LDkgQEAKIAkgKiB3ZSBuZWVkIHRvIGdldCB0byB0aGF0ICJubyBldmVudCIsIHNvIGVub3VnaCBzaG91bGQgYmUgaW5pdGlhbGl6ZWQKIAkgKiBieSB0aGF0IHBvaW50LgogCSAqLwotCWlmIChyZXF1ZXN0X2lycShkZXYtPmlycSwgb2hjaV9pcnFfaGFuZGxlciwgSVJRRl9TSEFSRUQsCi0JCQkgT0hDSTEzOTRfRFJJVkVSX05BTUUsIG9oY2kpKSB7CisJZXJyID0gcmVxdWVzdF9pcnEoZGV2LT5pcnEsIG9oY2lfaXJxX2hhbmRsZXIsIElSUUZfU0hBUkVELAorCQkJICBPSENJMTM5NF9EUklWRVJfTkFNRSwgb2hjaSk7CisJaWYgKGVycikgewogCQlQUklOVF9HKEtFUk5fRVJSLCAiRmFpbGVkIHRvIGFsbG9jYXRlIGludGVycnVwdCAlZCIsIGRldi0+aXJxKTsKIAkJZ290byBlcnI7CiAJfQpAQCAtMzM4MSw2ICszMzgzLDcgQEAKIAlvaGNpX2RldmN0bChvaGNpLT5ob3N0LCBSRVNFVF9CVVMsIExPTkdfUkVTRVRfTk9fRk9SQ0VfUk9PVCk7CiAJb2hjaV9zb2Z0X3Jlc2V0KG9oY2kpOwogCisJZnJlZV9pcnEoZGV2LT5pcnEsIG9oY2kpOwogCWVyciA9IHBjaV9zYXZlX3N0YXRlKGRldik7CiAJaWYgKGVycikgewogCQlQUklOVChLRVJOX0VSUiwgInBjaV9zYXZlX3N0YXRlIGZhaWxlZCB3aXRoICVkIiwgZXJyKTsKQEAgLTM0MjAsNyArMzQyMywxNiBAQAogCXJlZ193cml0ZShvaGNpLCBPSENJMTM5NF9IQ0NvbnRyb2xTZXQsIE9IQ0kxMzk0X0hDQ29udHJvbF9MUFMpOwogCXJlZ193cml0ZShvaGNpLCBPSENJMTM5NF9JbnRFdmVudENsZWFyLCAweGZmZmZmZmZmKTsKIAlyZWdfd3JpdGUob2hjaSwgT0hDSTEzOTRfSW50TWFza0NsZWFyLCAweGZmZmZmZmZmKTsKLQltZGVsYXkoNTApOworCXJlZ19yZWFkKG9oY2ksIE9IQ0kxMzk0X1ZlcnNpb24pOworCW1zbGVlcCg1MCk7CisKKwllcnIgPSByZXF1ZXN0X2lycShkZXYtPmlycSwgb2hjaV9pcnFfaGFuZGxlciwgSVJRRl9TSEFSRUQsCisJCQkgIE9IQ0kxMzk0X0RSSVZFUl9OQU1FLCBvaGNpKTsKKwlpZiAoZXJyKSB7CisJCVBSSU5UX0coS0VSTl9FUlIsICJGYWlsZWQgdG8gYWxsb2NhdGUgaW50ZXJydXB0ICVkIiwgZGV2LT5pcnEpOworCQlyZXR1cm4gZXJyOworCX0KKwogCW9oY2lfaW5pdGlhbGl6ZShvaGNpKTsKIAogCWhwc2JfcmVzdW1lX2hvc3Qob2hjaS0+aG9zdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2llZWUxMzk0L3BjaWx5bnguYyBiL2RyaXZlcnMvaWVlZTEzOTQvcGNpbHlueC5jCmluZGV4IDdhZWUxYWMuLmRjMTVjYWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWVlZTEzOTQvcGNpbHlueC5jCisrKyBiL2RyaXZlcnMvaWVlZTEzOTQvcGNpbHlueC5jCkBAIC0xNDYzLDcgKzE0NjMsNyBAQAogCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGluZm9fbGVuZ3RoLCBjcmNfbGVuZ3RoIGFuZCAxMzk0IG1hZ2ljIG51bWJlciB0byBjaGVjaywgaWYgaXQgaXMgcmVhbGx5IGEgYnVzIGluZm8gYmxvY2sgKi8KIAkJCQlpZiAoKChiZTMyX3RvX2NwdShseW54LT5idXNfaW5mb19ibG9ja1swXSkgJiAweGZmZmYwMDAwKSA9PSAweDA0MDQwMDAwKSAmJgotCQkJCSAgICAobHlueC0+YnVzX2luZm9fYmxvY2tbMV0gPT0gX19jb25zdGFudF9jcHVfdG9fYmUzMigweDMxMzMzOTM0KSkpCisJCQkJICAgIChseW54LT5idXNfaW5mb19ibG9ja1sxXSA9PSBJRUVFMTM5NF9CVVNJRF9NQUdJQykpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUklOVChLRVJOX0RFQlVHLCBseW54LT5pZCwgInJlYWQgYSB2YWxpZCBidXMgaW5mbyBibG9jayBmcm9tIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2llZWUxMzk0L3BjaWx5bnguaCBiL2RyaXZlcnMvaWVlZTEzOTQvcGNpbHlueC5oCmluZGV4IGVjMjczMjEuLjY5M2ExNjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWVlZTEzOTQvcGNpbHlueC5oCisrKyBiL2RyaXZlcnMvaWVlZTEzOTQvcGNpbHlueC5oCkBAIC01Miw3ICs1Miw3IEBACiAgICAgICAgIHZvaWQgX19pb21lbSAqbG9jYWxfcm9tOwogICAgICAgICB2b2lkIF9faW9tZW0gKmxvY2FsX3JhbTsKICAgICAgICAgdm9pZCBfX2lvbWVtICphdXhfcG9ydDsKLQlxdWFkbGV0X3QgYnVzX2luZm9fYmxvY2tbNV07CisJX19iZTMyIGJ1c19pbmZvX2Jsb2NrWzVdOwogCiAgICAgICAgIC8qCiAgICAgICAgICAqIHVzZSBsb2NhbCBSQU0gb2YgTE9DQUxSQU1fU0laRSBieXRlcyBmb3IgUENMcywgd2hpY2ggYWxsb3dzIGZvcgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZWVlMTM5NC9yYXcxMzk0LmMgYi9kcml2ZXJzL2llZWUxMzk0L3JhdzEzOTQuYwppbmRleCBiZjdlNzYxLi5iYWQ2NmM2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2llZWUxMzk0L3JhdzEzOTQuYworKysgYi9kcml2ZXJzL2llZWUxMzk0L3JhdzEzOTQuYwpAQCAtOTAsNyArOTAsNyBAQAogc3RhdGljIGludCBhcm1fbG9jazY0KHN0cnVjdCBocHNiX2hvc3QgKmhvc3QsIGludCBub2RlaWQsIG9jdGxldF90ICogc3RvcmUsCiAJCSAgICAgIHU2NCBhZGRyLCBvY3RsZXRfdCBkYXRhLCBvY3RsZXRfdCBhcmcsIGludCBleHRfdGNvZGUsCiAJCSAgICAgIHUxNiBmbGFncyk7Ci1zdGF0aWMgc3RydWN0IGhwc2JfYWRkcmVzc19vcHMgYXJtX29wcyA9IHsKK2NvbnN0IHN0YXRpYyBzdHJ1Y3QgaHBzYl9hZGRyZXNzX29wcyBhcm1fb3BzID0gewogCS5yZWFkID0gYXJtX3JlYWQsCiAJLndyaXRlID0gYXJtX3dyaXRlLAogCS5sb2NrID0gYXJtX2xvY2ssCmRpZmYgLS1naXQgYS9kcml2ZXJzL2llZWUxMzk0L3NicDIuYyBiL2RyaXZlcnMvaWVlZTEzOTQvc2JwMi5jCmluZGV4IGEzNzNjMTguLmFiMTAzNGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWVlZTEzOTQvc2JwMi5jCisrKyBiL2RyaXZlcnMvaWVlZTEzOTQvc2JwMi5jCkBAIC0yNjUsNyArMjY1LDcgQEAKIAkuaG9zdF9yZXNldAk9IHNicDJfaG9zdF9yZXNldCwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgaHBzYl9hZGRyZXNzX29wcyBzYnAyX29wcyA9IHsKK2NvbnN0IHN0YXRpYyBzdHJ1Y3QgaHBzYl9hZGRyZXNzX29wcyBzYnAyX29wcyA9IHsKIAkud3JpdGUJCT0gc2JwMl9oYW5kbGVfc3RhdHVzX3dyaXRlCiB9OwogCkBAIC0yNzUsNyArMjc1LDcgQEAKIHN0YXRpYyBpbnQgc2JwMl9oYW5kbGVfcGh5c2RtYV9yZWFkKHN0cnVjdCBocHNiX2hvc3QgKiwgaW50LCBxdWFkbGV0X3QgKiwgdTY0LAogCQkJCSAgICBzaXplX3QsIHUxNik7CiAKLXN0YXRpYyBzdHJ1Y3QgaHBzYl9hZGRyZXNzX29wcyBzYnAyX3BoeXNkbWFfb3BzID0geworY29uc3Qgc3RhdGljIHN0cnVjdCBocHNiX2FkZHJlc3Nfb3BzIHNicDJfcGh5c2RtYV9vcHMgPSB7CiAJLnJlYWQJCT0gc2JwMl9oYW5kbGVfcGh5c2RtYV9yZWFkLAogCS53cml0ZQkJPSBzYnAyX2hhbmRsZV9waHlzZG1hX3dyaXRlLAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9laGNhL2VoY2FfY3EuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9laGNhL2VoY2FfY3EuYwppbmRleCAyZjRjMjhhLi45N2U0YjIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvZWhjYS9laGNhX2NxLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2VoY2EvZWhjYV9jcS5jCkBAIC0xOTYsNyArMTk2LDcgQEAKIAogCWlmIChoX3JldCAhPSBIX1NVQ0NFU1MpIHsKIAkJZWhjYV9lcnIoZGV2aWNlLCAiaGlwel9oX2FsbG9jX3Jlc291cmNlX2NxKCkgZmFpbGVkICIKLQkJCSAiaF9yZXQ9JWxpIGRldmljZT0lcCIsIGhfcmV0LCBkZXZpY2UpOworCQkJICJoX3JldD0lbGxpIGRldmljZT0lcCIsIGhfcmV0LCBkZXZpY2UpOwogCQljcSA9IEVSUl9QVFIoZWhjYTJpYl9yZXR1cm5fY29kZShoX3JldCkpOwogCQlnb3RvIGNyZWF0ZV9jcV9leGl0MjsKIAl9CkBAIC0yMzIsNyArMjMyLDcgQEAKIAogCQlpZiAoaF9yZXQgPCBIX1NVQ0NFU1MpIHsKIAkJCWVoY2FfZXJyKGRldmljZSwgImhpcHpfaF9yZWdpc3Rlcl9ycGFnZV9jcSgpIGZhaWxlZCAiCi0JCQkJICJlaGNhX2NxPSVwIGNxX251bT0leCBoX3JldD0lbGkgY291bnRlcj0laSAiCisJCQkJICJlaGNhX2NxPSVwIGNxX251bT0leCBoX3JldD0lbGxpIGNvdW50ZXI9JWkgIgogCQkJCSAiYWN0X3BhZ2VzPSVpIiwgbXlfY3EsIG15X2NxLT5jcV9udW1iZXIsCiAJCQkJIGhfcmV0LCBjb3VudGVyLCBwYXJhbS5hY3RfcGFnZXMpOwogCQkJY3EgPSBFUlJfUFRSKC1FSU5WQUwpOwpAQCAtMjQ0LDcgKzI0NCw3IEBACiAJCQlpZiAoKGhfcmV0ICE9IEhfU1VDQ0VTUykgfHwgdnBhZ2UpIHsKIAkJCQllaGNhX2VycihkZXZpY2UsICJSZWdpc3RyYXRpb24gb2YgcGFnZXMgbm90ICIKIAkJCQkJICJjb21wbGV0ZSBlaGNhX2NxPSVwIGNxX251bT0leCAiCi0JCQkJCSAiaF9yZXQ9JWxpIiwgbXlfY3EsIG15X2NxLT5jcV9udW1iZXIsCisJCQkJCSAiaF9yZXQ9JWxsaSIsIG15X2NxLCBteV9jcS0+Y3FfbnVtYmVyLAogCQkJCQkgaF9yZXQpOwogCQkJCWNxID0gRVJSX1BUUigtRUFHQUlOKTsKIAkJCQlnb3RvIGNyZWF0ZV9jcV9leGl0NDsKQEAgLTI1Miw3ICsyNTIsNyBAQAogCQl9IGVsc2UgewogCQkJaWYgKGhfcmV0ICE9IEhfUEFHRV9SRUdJU1RFUkVEKSB7CiAJCQkJZWhjYV9lcnIoZGV2aWNlLCAiUmVnaXN0cmF0aW9uIG9mIHBhZ2UgZmFpbGVkICIKLQkJCQkJICJlaGNhX2NxPSVwIGNxX251bT0leCBoX3JldD0lbGkgIgorCQkJCQkgImVoY2FfY3E9JXAgY3FfbnVtPSV4IGhfcmV0PSVsbGkgIgogCQkJCQkgImNvdW50ZXI9JWkgYWN0X3BhZ2VzPSVpIiwKIAkJCQkJIG15X2NxLCBteV9jcS0+Y3FfbnVtYmVyLAogCQkJCQkgaF9yZXQsIGNvdW50ZXIsIHBhcmFtLmFjdF9wYWdlcyk7CkBAIC0yNjYsNyArMjY2LDcgQEAKIAogCWdhbCA9IG15X2NxLT5nYWxwYXMua2VybmVsOwogCWNxeF9mZWMgPSBoaXB6X2dhbHBhX2xvYWQoZ2FsLCBDUVRFTU1fT0ZGU0VUKGNxeF9mZWMpKTsKLQllaGNhX2RiZyhkZXZpY2UsICJlaGNhX2NxPSVwIGNxX251bT0leCBDUVhfRkVDPSVseCIsCisJZWhjYV9kYmcoZGV2aWNlLCAiZWhjYV9jcT0lcCBjcV9udW09JXggQ1FYX0ZFQz0lbGx4IiwKIAkJIG15X2NxLCBteV9jcS0+Y3FfbnVtYmVyLCBjcXhfZmVjKTsKIAogCW15X2NxLT5pYl9jcS5jcWUgPSBteV9jcS0+bnJfb2ZfZW50cmllcyA9CkBAIC0zMDcsNyArMzA3LDcgQEAKIAloX3JldCA9IGhpcHpfaF9kZXN0cm95X2NxKGFkYXB0ZXJfaGFuZGxlLCBteV9jcSwgMSk7CiAJaWYgKGhfcmV0ICE9IEhfU1VDQ0VTUykKIAkJZWhjYV9lcnIoZGV2aWNlLCAiaGlwel9oX2Rlc3Ryb3lfY3EoKSBmYWlsZWQgZWhjYV9jcT0lcCAiCi0JCQkgImNxX251bT0leCBoX3JldD0lbGkiLCBteV9jcSwgbXlfY3EtPmNxX251bWJlciwgaF9yZXQpOworCQkJICJjcV9udW09JXggaF9yZXQ9JWxsaSIsIG15X2NxLCBteV9jcS0+Y3FfbnVtYmVyLCBoX3JldCk7CiAKIGNyZWF0ZV9jcV9leGl0MjoKIAl3cml0ZV9sb2NrX2lycXNhdmUoJmVoY2FfY3FfaWRyX2xvY2ssIGZsYWdzKTsKQEAgLTM1NSw3ICszNTUsNyBAQAogCWhfcmV0ID0gaGlwel9oX2Rlc3Ryb3lfY3EoYWRhcHRlcl9oYW5kbGUsIG15X2NxLCAwKTsKIAlpZiAoaF9yZXQgPT0gSF9SX1NUQVRFKSB7CiAJCS8qIGNxIGluIGVycjogcmVhZCBlcnIgZGF0YSBhbmQgZGVzdHJveSBpdCBmb3JjaWJseSAqLwotCQllaGNhX2RiZyhkZXZpY2UsICJlaGNhX2NxPSVwIGNxX251bT0leCByZXNzb3VyY2U9JWx4IGluIGVyciAiCisJCWVoY2FfZGJnKGRldmljZSwgImVoY2FfY3E9JXAgY3FfbnVtPSV4IHJlc291cmNlPSVsbHggaW4gZXJyICIKIAkJCSAic3RhdGUuIFRyeSB0byBkZWxldGUgaXQgZm9yY2libHkuIiwKIAkJCSBteV9jcSwgY3FfbnVtLCBteV9jcS0+aXB6X2NxX2hhbmRsZS5oYW5kbGUpOwogCQllaGNhX2Vycm9yX2RhdGEoc2hjYSwgbXlfY3EsIG15X2NxLT5pcHpfY3FfaGFuZGxlLmhhbmRsZSk7CkBAIC0zNjUsNyArMzY1LDcgQEAKIAkJCQkgY3FfbnVtKTsKIAl9CiAJaWYgKGhfcmV0ICE9IEhfU1VDQ0VTUykgewotCQllaGNhX2VycihkZXZpY2UsICJoaXB6X2hfZGVzdHJveV9jcSgpIGZhaWxlZCBoX3JldD0lbGkgIgorCQllaGNhX2VycihkZXZpY2UsICJoaXB6X2hfZGVzdHJveV9jcSgpIGZhaWxlZCBoX3JldD0lbGxpICIKIAkJCSAiZWhjYV9jcT0lcCBjcV9udW09JXgiLCBoX3JldCwgbXlfY3EsIGNxX251bSk7CiAJCXJldHVybiBlaGNhMmliX3JldHVybl9jb2RlKGhfcmV0KTsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvZWhjYS9laGNhX2hjYS5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2VoY2EvZWhjYV9oY2EuYwppbmRleCA0NjI4ODIyLi45MjA5YzUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvZWhjYS9laGNhX2hjYS5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9laGNhL2VoY2FfaGNhLmMKQEAgLTM5Myw3ICszOTMsNyBAQAogCWhyZXQgPSBoaXB6X2hfbW9kaWZ5X3BvcnQoc2hjYS0+aXB6X2hjYV9oYW5kbGUsIHBvcnQsCiAJCQkJICBjYXAsIHByb3BzLT5pbml0X3R5cGUsIHBvcnRfbW9kaWZ5X21hc2spOwogCWlmIChocmV0ICE9IEhfU1VDQ0VTUykgewotCQllaGNhX2Vycigmc2hjYS0+aWJfZGV2aWNlLCAiTW9kaWZ5IHBvcnQgZmFpbGVkICBoX3JldD0lbGkiLAorCQllaGNhX2Vycigmc2hjYS0+aWJfZGV2aWNlLCAiTW9kaWZ5IHBvcnQgZmFpbGVkICBoX3JldD0lbGxpIiwKIAkJCSBocmV0KTsKIAkJcmV0ID0gLUVJTlZBTDsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvZWhjYS9laGNhX2lycS5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2VoY2EvZWhjYV9pcnEuYwppbmRleCAzMTI4YTUwLi45OWJjYmQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvZWhjYS9laGNhX2lycS5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9laGNhL2VoY2FfaXJxLmMKQEAgLTk5LDcgKzk5LDcgQEAKIAkJCXJldHVybjsKIAogCQllaGNhX2Vycigmc2hjYS0+aWJfZGV2aWNlLAotCQkJICJRUCAweCV4IChyZXNvdXJjZT0lbHgpIGhhcyBlcnJvcnMuIiwKKwkJCSAiUVAgMHgleCAocmVzb3VyY2U9JWxseCkgaGFzIGVycm9ycy4iLAogCQkJIHFwLT5pYl9xcC5xcF9udW0sIHJlc291cmNlKTsKIAkJYnJlYWs7CiAJfQpAQCAtMTA4LDIxICsxMDgsMjEgQEAKIAkJc3RydWN0IGVoY2FfY3EgKmNxID0gKHN0cnVjdCBlaGNhX2NxICopZGF0YTsKIAogCQllaGNhX2Vycigmc2hjYS0+aWJfZGV2aWNlLAotCQkJICJDUSAweCV4IChyZXNvdXJjZT0lbHgpIGhhcyBlcnJvcnMuIiwKKwkJCSAiQ1EgMHgleCAocmVzb3VyY2U9JWxseCkgaGFzIGVycm9ycy4iLAogCQkJIGNxLT5jcV9udW1iZXIsIHJlc291cmNlKTsKIAkJYnJlYWs7CiAJfQogCWRlZmF1bHQ6CiAJCWVoY2FfZXJyKCZzaGNhLT5pYl9kZXZpY2UsCi0JCQkgIlVua25vd24gZXJyb3IgdHlwZTogJWx4IG9uICVzLiIsCisJCQkgIlVua25vd24gZXJyb3IgdHlwZTogJWxseCBvbiAlcy4iLAogCQkJIHR5cGUsIHNoY2EtPmliX2RldmljZS5uYW1lKTsKIAkJYnJlYWs7CiAJfQogCi0JZWhjYV9lcnIoJnNoY2EtPmliX2RldmljZSwgIkVycm9yIGRhdGEgaXMgYXZhaWxhYmxlOiAlbHguIiwgcmVzb3VyY2UpOworCWVoY2FfZXJyKCZzaGNhLT5pYl9kZXZpY2UsICJFcnJvciBkYXRhIGlzIGF2YWlsYWJsZTogJWxseC4iLCByZXNvdXJjZSk7CiAJZWhjYV9lcnIoJnNoY2EtPmliX2RldmljZSwgIkVIQ0EgLS0tLS0gZXJyb3IgZGF0YSBiZWdpbiAiCiAJCSAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7Ci0JZWhjYV9kbXAocmJsb2NrLCBsZW5ndGgsICJyZXNvdXJjZT0lbHgiLCByZXNvdXJjZSk7CisJZWhjYV9kbXAocmJsb2NrLCBsZW5ndGgsICJyZXNvdXJjZT0lbGx4IiwgcmVzb3VyY2UpOwogCWVoY2FfZXJyKCZzaGNhLT5pYl9kZXZpY2UsICJFSENBIC0tLS0tIGVycm9yIGRhdGEgZW5kICIKIAkJICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7CiAKQEAgLTE1Miw3ICsxNTIsNyBAQAogCiAJaWYgKHJldCA9PSBIX1JfU1RBVEUpCiAJCWVoY2FfZXJyKCZzaGNhLT5pYl9kZXZpY2UsCi0JCQkgIk5vIGVycm9yIGRhdGEgaXMgYXZhaWxhYmxlOiAlbHguIiwgcmVzb3VyY2UpOworCQkJICJObyBlcnJvciBkYXRhIGlzIGF2YWlsYWJsZTogJWxseC4iLCByZXNvdXJjZSk7CiAJZWxzZSBpZiAocmV0ID09IEhfU1VDQ0VTUykgewogCQlpbnQgbGVuZ3RoOwogCkBAIC0xNjQsNyArMTY0LDcgQEAKIAkJcHJpbnRfZXJyb3JfZGF0YShzaGNhLCBkYXRhLCByYmxvY2ssIGxlbmd0aCk7CiAJfSBlbHNlCiAJCWVoY2FfZXJyKCZzaGNhLT5pYl9kZXZpY2UsCi0JCQkgIkVycm9yIGRhdGEgY291bGQgbm90IGJlIGZldGNoZWQ6ICVseCIsIHJlc291cmNlKTsKKwkJCSAiRXJyb3IgZGF0YSBjb3VsZCBub3QgYmUgZmV0Y2hlZDogJWxseCIsIHJlc291cmNlKTsKIAogCWVoY2FfZnJlZV9md19jdHJsYmxvY2socmJsb2NrKTsKIApAQCAtNTE0LDcgKzUxNCw3IEBACiAJc3RydWN0IGVoY2FfY3EgKmNxOwogCiAJZXFlX3ZhbHVlID0gZXFlLT5lbnRyeTsKLQllaGNhX2RiZygmc2hjYS0+aWJfZGV2aWNlLCAiZXFlX3ZhbHVlPSVseCIsIGVxZV92YWx1ZSk7CisJZWhjYV9kYmcoJnNoY2EtPmliX2RldmljZSwgImVxZV92YWx1ZT0lbGx4IiwgZXFlX3ZhbHVlKTsKIAlpZiAoRUhDQV9CTUFTS19HRVQoRVFFX0NPTVBMRVRJT05fRVZFTlQsIGVxZV92YWx1ZSkpIHsKIAkJZWhjYV9kYmcoJnNoY2EtPmliX2RldmljZSwgIkdvdCBjb21wbGV0aW9uIGV2ZW50Iik7CiAJCXRva2VuID0gRUhDQV9CTUFTS19HRVQoRVFFX0NRX1RPS0VOLCBlcWVfdmFsdWUpOwpAQCAtNjAzLDcgKzYwMyw3IEBACiAJCXJldCA9IGhpcHpfaF9lb2koZXEtPmlzdCk7CiAJCWlmIChyZXQgIT0gSF9TVUNDRVNTKQogCQkJZWhjYV9lcnIoJnNoY2EtPmliX2RldmljZSwKLQkJCQkgImJhZCByZXR1cm4gY29kZSBFT0kgLXJjID0gJWxkXG4iLCByZXQpOworCQkJCSAiYmFkIHJldHVybiBjb2RlIEVPSSAtcmMgPSAlbGxkXG4iLCByZXQpOwogCQllaGNhX2RiZygmc2hjYS0+aWJfZGV2aWNlLCAiZGVhZG1hbiBmb3VuZCAleCBlcWUiLCBlcWVfY250KTsKIAl9CiAJaWYgKHVubGlrZWx5KGVxZV9jbnQgPT0gRUhDQV9FUUVfQ0FDSEVfU0laRSkpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvZWhjYS9laGNhX21haW4uYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9laGNhL2VoY2FfbWFpbi5jCmluZGV4IDNiNzdiNjcuLjM2ODMxMWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9laGNhL2VoY2FfbWFpbi5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9laGNhL2VoY2FfbWFpbi5jCkBAIC0zMDQsNyArMzA0LDcgQEAKIAogCWhfcmV0ID0gaGlwel9oX3F1ZXJ5X2hjYShzaGNhLT5pcHpfaGNhX2hhbmRsZSwgcmJsb2NrKTsKIAlpZiAoaF9yZXQgIT0gSF9TVUNDRVNTKSB7Ci0JCWVoY2FfZ2VuX2VycigiQ2Fubm90IHF1ZXJ5IGRldmljZSBwcm9wZXJ0aWVzLiBoX3JldD0lbGkiLAorCQllaGNhX2dlbl9lcnIoIkNhbm5vdCBxdWVyeSBkZXZpY2UgcHJvcGVydGllcy4gaF9yZXQ9JWxsaSIsCiAJCQkgICAgIGhfcmV0KTsKIAkJcmV0ID0gLUVQRVJNOwogCQlnb3RvIHNlbnNlX2F0dHJpYnV0ZXMxOwpAQCAtMzkxLDcgKzM5MSw3IEBACiAJcG9ydCA9IChzdHJ1Y3QgaGlwel9xdWVyeV9wb3J0ICopcmJsb2NrOwogCWhfcmV0ID0gaGlwel9oX3F1ZXJ5X3BvcnQoc2hjYS0+aXB6X2hjYV9oYW5kbGUsIDEsIHBvcnQpOwogCWlmIChoX3JldCAhPSBIX1NVQ0NFU1MpIHsKLQkJZWhjYV9nZW5fZXJyKCJDYW5ub3QgcXVlcnkgcG9ydCBwcm9wZXJ0aWVzLiBoX3JldD0lbGkiLAorCQllaGNhX2dlbl9lcnIoIkNhbm5vdCBxdWVyeSBwb3J0IHByb3BlcnRpZXMuIGhfcmV0PSVsbGkiLAogCQkJICAgICBoX3JldCk7CiAJCXJldCA9IC1FUEVSTTsKIAkJZ290byBzZW5zZV9hdHRyaWJ1dGVzMTsKQEAgLTY4Miw3ICs2ODIsNyBAQAogewogCXN0cnVjdCBlaGNhX3NoY2EgKnNoY2EgPSBkZXYtPmRyaXZlcl9kYXRhOwogCi0JcmV0dXJuIHNwcmludGYoYnVmLCAiJWx4XG4iLCBzaGNhLT5pcHpfaGNhX2hhbmRsZS5oYW5kbGUpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVsbHhcbiIsIHNoY2EtPmlwel9oY2FfaGFuZGxlLmhhbmRsZSk7CiAKIH0KIHN0YXRpYyBERVZJQ0VfQVRUUihhZGFwdGVyX2hhbmRsZSwgU19JUlVHTywgZWhjYV9zaG93X2FkYXB0ZXJfaGFuZGxlLCBOVUxMKTsKQEAgLTk1NSw3ICs5NTUsNyBAQAogCQkJc3RydWN0IGVoY2FfZXEgKmVxID0gJnNoY2EtPmVxOwogCQkJaW50IG1heCA9IDM7CiAJCQl2b2xhdGlsZSB1NjQgcV9vZnMsIHFfb2ZzMjsKLQkJCXU2NCBmbGFnczsKKwkJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJCQlzcGluX2xvY2tfaXJxc2F2ZSgmZXEtPnNwaW5sb2NrLCBmbGFncyk7CiAJCQlxX29mcyA9IGVxLT5pcHpfcXVldWUuY3VycmVudF9xX29mZnNldDsKIAkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVxLT5zcGlubG9jaywgZmxhZ3MpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2VoY2EvZWhjYV9tY2FzdC5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2VoY2EvZWhjYV9tY2FzdC5jCmluZGV4IGUzZWYwMjYuLjEyMGFlZGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9laGNhL2VoY2FfbWNhc3QuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvZWhjYS9laGNhX21jYXN0LmMKQEAgLTg4LDcgKzg4LDcgQEAKIAlpZiAoaF9yZXQgIT0gSF9TVUNDRVNTKQogCQllaGNhX2VycihpYnFwLT5kZXZpY2UsCiAJCQkgImVoY2FfcXA9JXAgcXBfbnVtPSV4IGhpcHpfaF9hdHRhY2hfbWNxcCgpIGZhaWxlZCAiCi0JCQkgImhfcmV0PSVsaSIsIG15X3FwLCBpYnFwLT5xcF9udW0sIGhfcmV0KTsKKwkJCSAiaF9yZXQ9JWxsaSIsIG15X3FwLCBpYnFwLT5xcF9udW0sIGhfcmV0KTsKIAogCXJldHVybiBlaGNhMmliX3JldHVybl9jb2RlKGhfcmV0KTsKIH0KQEAgLTEyNSw3ICsxMjUsNyBAQAogCWlmIChoX3JldCAhPSBIX1NVQ0NFU1MpCiAJCWVoY2FfZXJyKGlicXAtPmRldmljZSwKIAkJCSAiZWhjYV9xcD0lcCBxcF9udW09JXggaGlwel9oX2RldGFjaF9tY3FwKCkgZmFpbGVkICIKLQkJCSAiaF9yZXQ9JWxpIiwgbXlfcXAsIGlicXAtPnFwX251bSwgaF9yZXQpOworCQkJICJoX3JldD0lbGxpIiwgbXlfcXAsIGlicXAtPnFwX251bSwgaF9yZXQpOwogCiAJcmV0dXJuIGVoY2EyaWJfcmV0dXJuX2NvZGUoaF9yZXQpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2VoY2EvZWhjYV9tcm13LmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvZWhjYS9laGNhX21ybXcuYwppbmRleCBmOTc0MzY3Li43MmY4M2Y3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvZWhjYS9laGNhX21ybXcuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvZWhjYS9laGNhX21ybXcuYwpAQCAtMjA0LDcgKzIwNCw3IEBACiAJfQogCWlmICgoc2l6ZSA9PSAwKSB8fAogCSAgICAoKCh1NjQpaW92YV9zdGFydCArIHNpemUpIDwgKHU2NClpb3ZhX3N0YXJ0KSkgewotCQllaGNhX2VycihwZC0+ZGV2aWNlLCAiYmFkIGlucHV0IHZhbHVlczogc2l6ZT0lbHggaW92YV9zdGFydD0lcCIsCisJCWVoY2FfZXJyKHBkLT5kZXZpY2UsICJiYWQgaW5wdXQgdmFsdWVzOiBzaXplPSVsbHggaW92YV9zdGFydD0lcCIsCiAJCQkgc2l6ZSwgaW92YV9zdGFydCk7CiAJCWliX21yID0gRVJSX1BUUigtRUlOVkFMKTsKIAkJZ290byByZWdfcGh5c19tcl9leGl0MDsKQEAgLTMwOSw4ICszMDksOCBAQAogCX0KIAogCWlmIChsZW5ndGggPT0gMCB8fCB2aXJ0ICsgbGVuZ3RoIDwgdmlydCkgewotCQllaGNhX2VycihwZC0+ZGV2aWNlLCAiYmFkIGlucHV0IHZhbHVlczogbGVuZ3RoPSVseCAiCi0JCQkgInZpcnRfYmFzZT0lbHgiLCBsZW5ndGgsIHZpcnQpOworCQllaGNhX2VycihwZC0+ZGV2aWNlLCAiYmFkIGlucHV0IHZhbHVlczogbGVuZ3RoPSVsbHggIgorCQkJICJ2aXJ0X2Jhc2U9JWxseCIsIGxlbmd0aCwgdmlydCk7CiAJCWliX21yID0gRVJSX1BUUigtRUlOVkFMKTsKIAkJZ290byByZWdfdXNlcl9tcl9leGl0MDsKIAl9CkBAIC0zNzMsNyArMzczLDcgQEAKIAkJCSAgJmVfbXItPmliLmliX21yLnJrZXkpOwogCWlmIChyZXQgPT0gLUVJTlZBTCAmJiBwZ2luZm8uaHdwYWdlX3NpemUgPiBQQUdFX1NJWkUpIHsKIAkJZWhjYV93YXJuKHBkLT5kZXZpY2UsICJmYWlsZWQgdG8gcmVnaXN0ZXIgbXIgIgotCQkJICAid2l0aCBod3BhZ2Vfc2l6ZT0lbHgiLCBod3BhZ2Vfc2l6ZSk7CisJCQkgICJ3aXRoIGh3cGFnZV9zaXplPSVsbHgiLCBod3BhZ2Vfc2l6ZSk7CiAJCWVoY2FfaW5mbyhwZC0+ZGV2aWNlLCAidHJ5IHRvIHJlZ2lzdGVyIG1yIHdpdGggIgogCQkJICAia3BhZ2Vfc2l6ZT0lbHgiLCBQQUdFX1NJWkUpOwogCQkvKgpAQCAtNTA5LDcgKzUwOSw3IEBACiAJCQlnb3RvIHJlcmVnX3BoeXNfbXJfZXhpdDE7CiAJCWlmICgobmV3X3NpemUgPT0gMCkgfHwKIAkJICAgICgoKHU2NClpb3ZhX3N0YXJ0ICsgbmV3X3NpemUpIDwgKHU2NClpb3ZhX3N0YXJ0KSkgewotCQkJZWhjYV9lcnIobXItPmRldmljZSwgImJhZCBpbnB1dCB2YWx1ZXM6IG5ld19zaXplPSVseCAiCisJCQllaGNhX2Vycihtci0+ZGV2aWNlLCAiYmFkIGlucHV0IHZhbHVlczogbmV3X3NpemU9JWxseCAiCiAJCQkJICJpb3ZhX3N0YXJ0PSVwIiwgbmV3X3NpemUsIGlvdmFfc3RhcnQpOwogCQkJcmV0ID0gLUVJTlZBTDsKIAkJCWdvdG8gcmVyZWdfcGh5c19tcl9leGl0MTsKQEAgLTU4MCw4ICs1ODAsOCBAQAogCiAJaF9yZXQgPSBoaXB6X2hfcXVlcnlfbXIoc2hjYS0+aXB6X2hjYV9oYW5kbGUsIGVfbXIsICZoaXB6b3V0KTsKIAlpZiAoaF9yZXQgIT0gSF9TVUNDRVNTKSB7Ci0JCWVoY2FfZXJyKG1yLT5kZXZpY2UsICJoaXB6X21yX3F1ZXJ5IGZhaWxlZCwgaF9yZXQ9JWxpIG1yPSVwICIKLQkJCSAiaGNhX2huZGw9JWx4IG1yX2huZGw9JWx4IGxrZXk9JXgiLAorCQllaGNhX2Vycihtci0+ZGV2aWNlLCAiaGlwel9tcl9xdWVyeSBmYWlsZWQsIGhfcmV0PSVsbGkgbXI9JXAgIgorCQkJICJoY2FfaG5kbD0lbGx4IG1yX2huZGw9JWxseCBsa2V5PSV4IiwKIAkJCSBoX3JldCwgbXIsIHNoY2EtPmlwel9oY2FfaGFuZGxlLmhhbmRsZSwKIAkJCSBlX21yLT5pcHpfbXJfaGFuZGxlLmhhbmRsZSwgbXItPmxrZXkpOwogCQlyZXQgPSBlaGNhMmliX3JldHVybl9jb2RlKGhfcmV0KTsKQEAgLTYzMCw4ICs2MzAsOCBAQAogCS8qIFRPRE86IEJVU1k6IE1SIHN0aWxsIGhhcyBib3VuZCB3aW5kb3cocykgKi8KIAloX3JldCA9IGhpcHpfaF9mcmVlX3Jlc291cmNlX21yKHNoY2EtPmlwel9oY2FfaGFuZGxlLCBlX21yKTsKIAlpZiAoaF9yZXQgIT0gSF9TVUNDRVNTKSB7Ci0JCWVoY2FfZXJyKG1yLT5kZXZpY2UsICJoaXB6X2ZyZWVfbXIgZmFpbGVkLCBoX3JldD0lbGkgc2hjYT0lcCAiCi0JCQkgImVfbXI9JXAgaGNhX2huZGw9JWx4IG1yX2huZGw9JWx4IG1yLT5sa2V5PSV4IiwKKwkJZWhjYV9lcnIobXItPmRldmljZSwgImhpcHpfZnJlZV9tciBmYWlsZWQsIGhfcmV0PSVsbGkgc2hjYT0lcCAiCisJCQkgImVfbXI9JXAgaGNhX2huZGw9JWxseCBtcl9obmRsPSVsbHggbXItPmxrZXk9JXgiLAogCQkJIGhfcmV0LCBzaGNhLCBlX21yLCBzaGNhLT5pcHpfaGNhX2hhbmRsZS5oYW5kbGUsCiAJCQkgZV9tci0+aXB6X21yX2hhbmRsZS5oYW5kbGUsIG1yLT5sa2V5KTsKIAkJcmV0ID0gZWhjYTJpYl9yZXR1cm5fY29kZShoX3JldCk7CkBAIC02NzEsOCArNjcxLDggQEAKIAloX3JldCA9IGhpcHpfaF9hbGxvY19yZXNvdXJjZV9tdyhzaGNhLT5pcHpfaGNhX2hhbmRsZSwgZV9tdywKIAkJCQkJIGVfcGQtPmZ3X3BkLCAmaGlwem91dCk7CiAJaWYgKGhfcmV0ICE9IEhfU1VDQ0VTUykgewotCQllaGNhX2VycihwZC0+ZGV2aWNlLCAiaGlwel9td19hbGxvY2F0ZSBmYWlsZWQsIGhfcmV0PSVsaSAiCi0JCQkgInNoY2E9JXAgaGNhX2huZGw9JWx4IG13PSVwIiwKKwkJZWhjYV9lcnIocGQtPmRldmljZSwgImhpcHpfbXdfYWxsb2NhdGUgZmFpbGVkLCBoX3JldD0lbGxpICIKKwkJCSAic2hjYT0lcCBoY2FfaG5kbD0lbGx4IG13PSVwIiwKIAkJCSBoX3JldCwgc2hjYSwgc2hjYS0+aXB6X2hjYV9oYW5kbGUuaGFuZGxlLCBlX213KTsKIAkJaWJfbXcgPSBFUlJfUFRSKGVoY2EyaWJfcmV0dXJuX2NvZGUoaF9yZXQpKTsKIAkJZ290byBhbGxvY19td19leGl0MTsKQEAgLTcxMyw4ICs3MTMsOCBAQAogCiAJaF9yZXQgPSBoaXB6X2hfZnJlZV9yZXNvdXJjZV9tdyhzaGNhLT5pcHpfaGNhX2hhbmRsZSwgZV9tdyk7CiAJaWYgKGhfcmV0ICE9IEhfU1VDQ0VTUykgewotCQllaGNhX2Vycihtdy0+ZGV2aWNlLCAiaGlwel9mcmVlX213IGZhaWxlZCwgaF9yZXQ9JWxpIHNoY2E9JXAgIgotCQkJICJtdz0lcCBya2V5PSV4IGhjYV9obmRsPSVseCBtd19obmRsPSVseCIsCisJCWVoY2FfZXJyKG13LT5kZXZpY2UsICJoaXB6X2ZyZWVfbXcgZmFpbGVkLCBoX3JldD0lbGxpIHNoY2E9JXAgIgorCQkJICJtdz0lcCBya2V5PSV4IGhjYV9obmRsPSVsbHggbXdfaG5kbD0lbGx4IiwKIAkJCSBoX3JldCwgc2hjYSwgbXcsIG13LT5ya2V5LCBzaGNhLT5pcHpfaGNhX2hhbmRsZS5oYW5kbGUsCiAJCQkgZV9tdy0+aXB6X213X2hhbmRsZS5oYW5kbGUpOwogCQlyZXR1cm4gZWhjYTJpYl9yZXR1cm5fY29kZShoX3JldCk7CkBAIC04NDAsNyArODQwLDcgQEAKIAkJZ290byBtYXBfcGh5c19mbXJfZXhpdDA7CiAJaWYgKGlvdmEgJSBlX2Ztci0+Zm1yX3BhZ2Vfc2l6ZSkgewogCQkvKiBvbmx5IHdob2xlLW51bWJlcmVkIHBhZ2VzICovCi0JCWVoY2FfZXJyKGZtci0+ZGV2aWNlLCAiYmFkIGlvdmEsIGlvdmE9JWx4IGZtcl9wYWdlX3NpemU9JXgiLAorCQllaGNhX2VycihmbXItPmRldmljZSwgImJhZCBpb3ZhLCBpb3ZhPSVsbHggZm1yX3BhZ2Vfc2l6ZT0leCIsCiAJCQkgaW92YSwgZV9mbXItPmZtcl9wYWdlX3NpemUpOwogCQlyZXQgPSAtRUlOVkFMOwogCQlnb3RvIG1hcF9waHlzX2Ztcl9leGl0MDsKQEAgLTg3OCw3ICs4NzgsNyBAQAogbWFwX3BoeXNfZm1yX2V4aXQwOgogCWlmIChyZXQpCiAJCWVoY2FfZXJyKGZtci0+ZGV2aWNlLCAicmV0PSVpIGZtcj0lcCBwYWdlX2xpc3Q9JXAgbGlzdF9sZW49JXggIgotCQkJICJpb3ZhPSVseCIsIHJldCwgZm1yLCBwYWdlX2xpc3QsIGxpc3RfbGVuLCBpb3ZhKTsKKwkJCSAiaW92YT0lbGx4IiwgcmV0LCBmbXIsIHBhZ2VfbGlzdCwgbGlzdF9sZW4sIGlvdmEpOwogCXJldHVybiByZXQ7CiB9IC8qIGVuZCBlaGNhX21hcF9waHlzX2ZtcigpICovCiAKQEAgLTk2NCw4ICs5NjQsOCBAQAogCiAJaF9yZXQgPSBoaXB6X2hfZnJlZV9yZXNvdXJjZV9tcihzaGNhLT5pcHpfaGNhX2hhbmRsZSwgZV9mbXIpOwogCWlmIChoX3JldCAhPSBIX1NVQ0NFU1MpIHsKLQkJZWhjYV9lcnIoZm1yLT5kZXZpY2UsICJoaXB6X2ZyZWVfbXIgZmFpbGVkLCBoX3JldD0lbGkgZV9mbXI9JXAgIgotCQkJICJoY2FfaG5kbD0lbHggZm1yX2huZGw9JWx4IGZtci0+bGtleT0leCIsCisJCWVoY2FfZXJyKGZtci0+ZGV2aWNlLCAiaGlwel9mcmVlX21yIGZhaWxlZCwgaF9yZXQ9JWxsaSBlX2Ztcj0lcCAiCisJCQkgImhjYV9obmRsPSVsbHggZm1yX2huZGw9JWxseCBmbXItPmxrZXk9JXgiLAogCQkJIGhfcmV0LCBlX2Ztciwgc2hjYS0+aXB6X2hjYV9oYW5kbGUuaGFuZGxlLAogCQkJIGVfZm1yLT5pcHpfbXJfaGFuZGxlLmhhbmRsZSwgZm1yLT5sa2V5KTsKIAkJcmV0ID0gZWhjYTJpYl9yZXR1cm5fY29kZShoX3JldCk7CkBAIC0xMDA3LDggKzEwMDcsOCBAQAogCQkJCQkgKHU2NClpb3ZhX3N0YXJ0LCBzaXplLCBoaXB6X2FjbCwKIAkJCQkJIGVfcGQtPmZ3X3BkLCAmaGlwem91dCk7CiAJaWYgKGhfcmV0ICE9IEhfU1VDQ0VTUykgewotCQllaGNhX2Vycigmc2hjYS0+aWJfZGV2aWNlLCAiaGlwel9hbGxvY19tciBmYWlsZWQsIGhfcmV0PSVsaSAiCi0JCQkgImhjYV9obmRsPSVseCIsIGhfcmV0LCBzaGNhLT5pcHpfaGNhX2hhbmRsZS5oYW5kbGUpOworCQllaGNhX2Vycigmc2hjYS0+aWJfZGV2aWNlLCAiaGlwel9hbGxvY19tciBmYWlsZWQsIGhfcmV0PSVsbGkgIgorCQkJICJoY2FfaG5kbD0lbGx4IiwgaF9yZXQsIHNoY2EtPmlwel9oY2FfaGFuZGxlLmhhbmRsZSk7CiAJCXJldCA9IGVoY2EyaWJfcmV0dXJuX2NvZGUoaF9yZXQpOwogCQlnb3RvIGVoY2FfcmVnX21yX2V4aXQwOwogCX0KQEAgLTEwMzMsOSArMTAzMyw5IEBACiBlaGNhX3JlZ19tcl9leGl0MToKIAloX3JldCA9IGhpcHpfaF9mcmVlX3Jlc291cmNlX21yKHNoY2EtPmlwel9oY2FfaGFuZGxlLCBlX21yKTsKIAlpZiAoaF9yZXQgIT0gSF9TVUNDRVNTKSB7Ci0JCWVoY2FfZXJyKCZzaGNhLT5pYl9kZXZpY2UsICJoX3JldD0lbGkgc2hjYT0lcCBlX21yPSVwICIKLQkJCSAiaW92YV9zdGFydD0lcCBzaXplPSVseCBhY2w9JXggZV9wZD0lcCBsa2V5PSV4ICIKLQkJCSAicGdpbmZvPSVwIG51bV9rcGFnZXM9JWx4IG51bV9od3BhZ2VzPSVseCByZXQ9JWkiLAorCQllaGNhX2Vycigmc2hjYS0+aWJfZGV2aWNlLCAiaF9yZXQ9JWxsaSBzaGNhPSVwIGVfbXI9JXAgIgorCQkJICJpb3ZhX3N0YXJ0PSVwIHNpemU9JWxseCBhY2w9JXggZV9wZD0lcCBsa2V5PSV4ICIKKwkJCSAicGdpbmZvPSVwIG51bV9rcGFnZXM9JWxseCBudW1faHdwYWdlcz0lbGx4IHJldD0laSIsCiAJCQkgaF9yZXQsIHNoY2EsIGVfbXIsIGlvdmFfc3RhcnQsIHNpemUsIGFjbCwgZV9wZCwKIAkJCSBoaXB6b3V0LmxrZXksIHBnaW5mbywgcGdpbmZvLT5udW1fa3BhZ2VzLAogCQkJIHBnaW5mby0+bnVtX2h3cGFnZXMsIHJldCk7CkBAIC0xMDQ1LDggKzEwNDUsOCBAQAogZWhjYV9yZWdfbXJfZXhpdDA6CiAJaWYgKHJldCkKIAkJZWhjYV9lcnIoJnNoY2EtPmliX2RldmljZSwgInJldD0laSBzaGNhPSVwIGVfbXI9JXAgIgotCQkJICJpb3ZhX3N0YXJ0PSVwIHNpemU9JWx4IGFjbD0leCBlX3BkPSVwIHBnaW5mbz0lcCAiCi0JCQkgIm51bV9rcGFnZXM9JWx4IG51bV9od3BhZ2VzPSVseCIsCisJCQkgImlvdmFfc3RhcnQ9JXAgc2l6ZT0lbGx4IGFjbD0leCBlX3BkPSVwIHBnaW5mbz0lcCAiCisJCQkgIm51bV9rcGFnZXM9JWxseCBudW1faHdwYWdlcz0lbGx4IiwKIAkJCSByZXQsIHNoY2EsIGVfbXIsIGlvdmFfc3RhcnQsIHNpemUsIGFjbCwgZV9wZCwgcGdpbmZvLAogCQkJIHBnaW5mby0+bnVtX2twYWdlcywgcGdpbmZvLT5udW1faHdwYWdlcyk7CiAJcmV0dXJuIHJldDsKQEAgLTExMTYsOCArMTExNiw4IEBACiAJCQkgKi8KIAkJCWlmIChoX3JldCAhPSBIX1NVQ0NFU1MpIHsKIAkJCQllaGNhX2Vycigmc2hjYS0+aWJfZGV2aWNlLCAibGFzdCAiCi0JCQkJCSAiaGlwel9yZWdfcnBhZ2VfbXIgZmFpbGVkLCBoX3JldD0lbGkgIgotCQkJCQkgImVfbXI9JXAgaT0leCBoY2FfaG5kbD0lbHggbXJfaG5kbD0lbHgiCisJCQkJCSAiaGlwel9yZWdfcnBhZ2VfbXIgZmFpbGVkLCBoX3JldD0lbGxpICIKKwkJCQkJICJlX21yPSVwIGk9JXggaGNhX2huZGw9JWxseCBtcl9obmRsPSVsbHgiCiAJCQkJCSAiIGxrZXk9JXgiLCBoX3JldCwgZV9tciwgaSwKIAkJCQkJIHNoY2EtPmlwel9oY2FfaGFuZGxlLmhhbmRsZSwKIAkJCQkJIGVfbXItPmlwel9tcl9oYW5kbGUuaGFuZGxlLApAQCAtMTEyOCw4ICsxMTI4LDggQEAKIAkJCQlyZXQgPSAwOwogCQl9IGVsc2UgaWYgKGhfcmV0ICE9IEhfUEFHRV9SRUdJU1RFUkVEKSB7CiAJCQllaGNhX2Vycigmc2hjYS0+aWJfZGV2aWNlLCAiaGlwel9yZWdfcnBhZ2VfbXIgZmFpbGVkLCAiCi0JCQkJICJoX3JldD0lbGkgZV9tcj0lcCBpPSV4IGxrZXk9JXggaGNhX2huZGw9JWx4ICIKLQkJCQkgIm1yX2huZGw9JWx4IiwgaF9yZXQsIGVfbXIsIGksCisJCQkJICJoX3JldD0lbGxpIGVfbXI9JXAgaT0leCBsa2V5PSV4IGhjYV9obmRsPSVsbHggIgorCQkJCSAibXJfaG5kbD0lbGx4IiwgaF9yZXQsIGVfbXIsIGksCiAJCQkJIGVfbXItPmliLmliX21yLmxrZXksCiAJCQkJIHNoY2EtPmlwel9oY2FfaGFuZGxlLmhhbmRsZSwKIAkJCQkgZV9tci0+aXB6X21yX2hhbmRsZS5oYW5kbGUpOwpAQCAtMTE0NSw3ICsxMTQ1LDcgQEAKIGVoY2FfcmVnX21yX3JwYWdlc19leGl0MDoKIAlpZiAocmV0KQogCQllaGNhX2Vycigmc2hjYS0+aWJfZGV2aWNlLCAicmV0PSVpIHNoY2E9JXAgZV9tcj0lcCBwZ2luZm89JXAgIgotCQkJICJudW1fa3BhZ2VzPSVseCBudW1faHdwYWdlcz0lbHgiLCByZXQsIHNoY2EsIGVfbXIsCisJCQkgIm51bV9rcGFnZXM9JWxseCBudW1faHdwYWdlcz0lbGx4IiwgcmV0LCBzaGNhLCBlX21yLAogCQkJIHBnaW5mbywgcGdpbmZvLT5udW1fa3BhZ2VzLCBwZ2luZm8tPm51bV9od3BhZ2VzKTsKIAlyZXR1cm4gcmV0OwogfSAvKiBlbmQgZWhjYV9yZWdfbXJfcnBhZ2VzKCkgKi8KQEAgLTExODQsNyArMTE4NCw3IEBACiAJcmV0ID0gZWhjYV9zZXRfcGFnZWJ1ZihwZ2luZm8sIHBnaW5mby0+bnVtX2h3cGFnZXMsIGtwYWdlKTsKIAlpZiAocmV0KSB7CiAJCWVoY2FfZXJyKCZzaGNhLT5pYl9kZXZpY2UsICJzZXQgcGFnZWJ1ZiBmYWlsZWQsIGVfbXI9JXAgIgotCQkJICJwZ2luZm89JXAgdHlwZT0leCBudW1fa3BhZ2VzPSVseCBudW1faHdwYWdlcz0lbHggIgorCQkJICJwZ2luZm89JXAgdHlwZT0leCBudW1fa3BhZ2VzPSVsbHggbnVtX2h3cGFnZXM9JWxseCAiCiAJCQkgImtwYWdlPSVwIiwgZV9tciwgcGdpbmZvLCBwZ2luZm8tPnR5cGUsCiAJCQkgcGdpbmZvLT5udW1fa3BhZ2VzLCBwZ2luZm8tPm51bV9od3BhZ2VzLCBrcGFnZSk7CiAJCWdvdG8gZWhjYV9yZXJlZ19tcl9yZXJlZzFfZXhpdDE7CkBAIC0xMjA1LDEzICsxMjA1LDEzIEBACiAJCSAqIChNVyBib3VuZCBvciBNUiBpcyBzaGFyZWQpCiAJCSAqLwogCQllaGNhX3dhcm4oJnNoY2EtPmliX2RldmljZSwgImhpcHpfaF9yZXJlZ2lzdGVyX3BtciBmYWlsZWQgIgotCQkJICAiKFJlcmVnMSksIGhfcmV0PSVsaSBlX21yPSVwIiwgaF9yZXQsIGVfbXIpOworCQkJICAiKFJlcmVnMSksIGhfcmV0PSVsbGkgZV9tcj0lcCIsIGhfcmV0LCBlX21yKTsKIAkJKnBnaW5mbyA9IHBnaW5mb19zYXZlOwogCQlyZXQgPSAtRUFHQUlOOwogCX0gZWxzZSBpZiAoKHU2NCAqKWhpcHpvdXQudmFkZHIgIT0gaW92YV9zdGFydCkgewogCQllaGNhX2Vycigmc2hjYS0+aWJfZGV2aWNlLCAiUEhZUCBjaGFuZ2VkIGlvdmFfc3RhcnQgaW4gIgotCQkJICJyZXJlZ19wbXIsIGlvdmFfc3RhcnQ9JXAgaW92YV9zdGFydF9vdXQ9JWx4IGVfbXI9JXAgIgotCQkJICJtcl9oYW5kbGU9JWx4IGxrZXk9JXggbGtleV9vdXQ9JXgiLCBpb3ZhX3N0YXJ0LAorCQkJICJyZXJlZ19wbXIsIGlvdmFfc3RhcnQ9JXAgaW92YV9zdGFydF9vdXQ9JWxseCBlX21yPSVwICIKKwkJCSAibXJfaGFuZGxlPSVsbHggbGtleT0leCBsa2V5X291dD0leCIsIGlvdmFfc3RhcnQsCiAJCQkgaGlwem91dC52YWRkciwgZV9tciwgZV9tci0+aXB6X21yX2hhbmRsZS5oYW5kbGUsCiAJCQkgZV9tci0+aWIuaWJfbXIubGtleSwgaGlwem91dC5sa2V5KTsKIAkJcmV0ID0gLUVGQVVMVDsKQEAgLTEyMzUsNyArMTIzNSw3IEBACiBlaGNhX3JlcmVnX21yX3JlcmVnMV9leGl0MDoKIAlpZiAoIHJldCAmJiAocmV0ICE9IC1FQUdBSU4pICkKIAkJZWhjYV9lcnIoJnNoY2EtPmliX2RldmljZSwgInJldD0laSBsa2V5PSV4IHJrZXk9JXggIgotCQkJICJwZ2luZm89JXAgbnVtX2twYWdlcz0lbHggbnVtX2h3cGFnZXM9JWx4IiwKKwkJCSAicGdpbmZvPSVwIG51bV9rcGFnZXM9JWxseCBudW1faHdwYWdlcz0lbGx4IiwKIAkJCSByZXQsICpsa2V5LCAqcmtleSwgcGdpbmZvLCBwZ2luZm8tPm51bV9rcGFnZXMsCiAJCQkgcGdpbmZvLT5udW1faHdwYWdlcyk7CiAJcmV0dXJuIHJldDsKQEAgLTEyNjMsNyArMTI2Myw3IEBACiAJICAgIChlX21yLT5udW1faHdwYWdlcyA+IE1BWF9SUEFHRVMpIHx8CiAJICAgIChwZ2luZm8tPm51bV9od3BhZ2VzID4gZV9tci0+bnVtX2h3cGFnZXMpKSB7CiAJCWVoY2FfZGJnKCZzaGNhLT5pYl9kZXZpY2UsICJSZXJlZzMgY2FzZSwgIgotCQkJICJwZ2luZm8tPm51bV9od3BhZ2VzPSVseCBlX21yLT5udW1faHdwYWdlcz0leCIsCisJCQkgInBnaW5mby0+bnVtX2h3cGFnZXM9JWxseCBlX21yLT5udW1faHdwYWdlcz0leCIsCiAJCQkgcGdpbmZvLT5udW1faHdwYWdlcywgZV9tci0+bnVtX2h3cGFnZXMpOwogCQlyZXJlZ18xX2hjYWxsID0gMDsKIAkJcmVyZWdfM19oY2FsbCA9IDE7CkBAIC0xMjk1LDcgKzEyOTUsNyBAQAogCQloX3JldCA9IGhpcHpfaF9mcmVlX3Jlc291cmNlX21yKHNoY2EtPmlwel9oY2FfaGFuZGxlLCBlX21yKTsKIAkJaWYgKGhfcmV0ICE9IEhfU1VDQ0VTUykgewogCQkJZWhjYV9lcnIoJnNoY2EtPmliX2RldmljZSwgImhpcHpfZnJlZV9tciBmYWlsZWQsICIKLQkJCQkgImhfcmV0PSVsaSBlX21yPSVwIGhjYV9obmRsPSVseCBtcl9obmRsPSVseCAiCisJCQkJICJoX3JldD0lbGxpIGVfbXI9JXAgaGNhX2huZGw9JWxseCBtcl9obmRsPSVsbHggIgogCQkJCSAibXItPmxrZXk9JXgiLAogCQkJCSBoX3JldCwgZV9tciwgc2hjYS0+aXB6X2hjYV9oYW5kbGUuaGFuZGxlLAogCQkJCSBlX21yLT5pcHpfbXJfaGFuZGxlLmhhbmRsZSwKQEAgLTEzMjgsOCArMTMyOCw4IEBACiBlaGNhX3JlcmVnX21yX2V4aXQwOgogCWlmIChyZXQpCiAJCWVoY2FfZXJyKCZzaGNhLT5pYl9kZXZpY2UsICJyZXQ9JWkgc2hjYT0lcCBlX21yPSVwICIKLQkJCSAiaW92YV9zdGFydD0lcCBzaXplPSVseCBhY2w9JXggZV9wZD0lcCBwZ2luZm89JXAgIgotCQkJICJudW1fa3BhZ2VzPSVseCBsa2V5PSV4IHJrZXk9JXggcmVyZWdfMV9oY2FsbD0leCAiCisJCQkgImlvdmFfc3RhcnQ9JXAgc2l6ZT0lbGx4IGFjbD0leCBlX3BkPSVwIHBnaW5mbz0lcCAiCisJCQkgIm51bV9rcGFnZXM9JWxseCBsa2V5PSV4IHJrZXk9JXggcmVyZWdfMV9oY2FsbD0leCAiCiAJCQkgInJlcmVnXzNfaGNhbGw9JXgiLCByZXQsIHNoY2EsIGVfbXIsIGlvdmFfc3RhcnQsIHNpemUsCiAJCQkgYWNsLCBlX3BkLCBwZ2luZm8sIHBnaW5mby0+bnVtX2twYWdlcywgKmxrZXksICpya2V5LAogCQkJIHJlcmVnXzFfaGNhbGwsIHJlcmVnXzNfaGNhbGwpOwpAQCAtMTM3MSw4ICsxMzcxLDggQEAKIAkJICogRk1ScyBhcmUgbm90IHNoYXJlZCBhbmQgbm8gTVcgYm91bmQgdG8gRk1ScwogCQkgKi8KIAkJZWhjYV9lcnIoJnNoY2EtPmliX2RldmljZSwgImhpcHpfcmVyZWdpc3Rlcl9wbXIgZmFpbGVkICIKLQkJCSAiKFJlcmVnMSksIGhfcmV0PSVsaSBlX2Ztcj0lcCBoY2FfaG5kbD0lbHggIgotCQkJICJtcl9obmRsPSVseCBsa2V5PSV4IGxrZXlfb3V0PSV4IiwKKwkJCSAiKFJlcmVnMSksIGhfcmV0PSVsbGkgZV9mbXI9JXAgaGNhX2huZGw9JWxseCAiCisJCQkgIm1yX2huZGw9JWxseCBsa2V5PSV4IGxrZXlfb3V0PSV4IiwKIAkJCSBoX3JldCwgZV9mbXIsIHNoY2EtPmlwel9oY2FfaGFuZGxlLmhhbmRsZSwKIAkJCSBlX2Ztci0+aXB6X21yX2hhbmRsZS5oYW5kbGUsCiAJCQkgZV9mbXItPmliLmliX2Ztci5sa2V5LCBoaXB6b3V0LmxrZXkpOwpAQCAtMTM4Myw3ICsxMzgzLDcgQEAKIAloX3JldCA9IGhpcHpfaF9mcmVlX3Jlc291cmNlX21yKHNoY2EtPmlwel9oY2FfaGFuZGxlLCBlX2Ztcik7CiAJaWYgKGhfcmV0ICE9IEhfU1VDQ0VTUykgewogCQllaGNhX2Vycigmc2hjYS0+aWJfZGV2aWNlLCAiaGlwel9mcmVlX21yIGZhaWxlZCwgIgotCQkJICJoX3JldD0lbGkgZV9mbXI9JXAgaGNhX2huZGw9JWx4IG1yX2huZGw9JWx4ICIKKwkJCSAiaF9yZXQ9JWxsaSBlX2Ztcj0lcCBoY2FfaG5kbD0lbGx4IG1yX2huZGw9JWxseCAiCiAJCQkgImxrZXk9JXgiLAogCQkJIGhfcmV0LCBlX2Ztciwgc2hjYS0+aXB6X2hjYV9oYW5kbGUuaGFuZGxlLAogCQkJIGVfZm1yLT5pcHpfbXJfaGFuZGxlLmhhbmRsZSwKQEAgLTE0NDcsOSArMTQ0Nyw5IEBACiAJCQkJICAgICh1NjQpaW92YV9zdGFydCwgaGlwel9hY2wsIGVfcGQtPmZ3X3BkLAogCQkJCSAgICAmaGlwem91dCk7CiAJaWYgKGhfcmV0ICE9IEhfU1VDQ0VTUykgewotCQllaGNhX2Vycigmc2hjYS0+aWJfZGV2aWNlLCAiaGlwel9yZWdfc21yIGZhaWxlZCwgaF9yZXQ9JWxpICIKKwkJZWhjYV9lcnIoJnNoY2EtPmliX2RldmljZSwgImhpcHpfcmVnX3NtciBmYWlsZWQsIGhfcmV0PSVsbGkgIgogCQkJICJzaGNhPSVwIGVfb3JpZ21yPSVwIGVfbmV3bXI9JXAgaW92YV9zdGFydD0lcCBhY2w9JXggIgotCQkJICJlX3BkPSVwIGhjYV9obmRsPSVseCBtcl9obmRsPSVseCBsa2V5PSV4IiwKKwkJCSAiZV9wZD0lcCBoY2FfaG5kbD0lbGx4IG1yX2huZGw9JWxseCBsa2V5PSV4IiwKIAkJCSBoX3JldCwgc2hjYSwgZV9vcmlnbXIsIGVfbmV3bXIsIGlvdmFfc3RhcnQsIGFjbCwgZV9wZCwKIAkJCSBzaGNhLT5pcHpfaGNhX2hhbmRsZS5oYW5kbGUsCiAJCQkgZV9vcmlnbXItPmlwel9tcl9oYW5kbGUuaGFuZGxlLApAQCAtMTUyNyw3ICsxNTI3LDcgQEAKIAkJCSAgJmVfbXItPmliLmliX21yLnJrZXkpOwogCWlmIChyZXQpIHsKIAkJZWhjYV9lcnIoJnNoY2EtPmliX2RldmljZSwgInJlZyBvZiBpbnRlcm5hbCBtYXggTVIgZmFpbGVkLCAiCi0JCQkgImVfbXI9JXAgaW92YV9zdGFydD0lcCBzaXplX21heG1yPSVseCBudW1fa3BhZ2VzPSV4ICIKKwkJCSAiZV9tcj0lcCBpb3ZhX3N0YXJ0PSVwIHNpemVfbWF4bXI9JWxseCBudW1fa3BhZ2VzPSV4ICIKIAkJCSAibnVtX2h3cGFnZXM9JXgiLCBlX21yLCBpb3ZhX3N0YXJ0LCBzaXplX21heG1yLAogCQkJIG51bV9rcGFnZXMsIG51bV9od3BhZ2VzKTsKIAkJZ290byBlaGNhX3JlZ19pbnRlcm5hbF9tYXhtcl9leGl0MTsKQEAgLTE1NzMsOCArMTU3Myw4IEBACiAJCQkJICAgICh1NjQpaW92YV9zdGFydCwgaGlwel9hY2wsIGVfcGQtPmZ3X3BkLAogCQkJCSAgICAmaGlwem91dCk7CiAJaWYgKGhfcmV0ICE9IEhfU1VDQ0VTUykgewotCQllaGNhX2Vycigmc2hjYS0+aWJfZGV2aWNlLCAiaGlwel9yZWdfc21yIGZhaWxlZCwgaF9yZXQ9JWxpICIKLQkJCSAiZV9vcmlnbXI9JXAgaGNhX2huZGw9JWx4IG1yX2huZGw9JWx4IGxrZXk9JXgiLAorCQllaGNhX2Vycigmc2hjYS0+aWJfZGV2aWNlLCAiaGlwel9yZWdfc21yIGZhaWxlZCwgaF9yZXQ9JWxsaSAiCisJCQkgImVfb3JpZ21yPSVwIGhjYV9obmRsPSVsbHggbXJfaG5kbD0lbGx4IGxrZXk9JXgiLAogCQkJIGhfcmV0LCBlX29yaWdtciwgc2hjYS0+aXB6X2hjYV9oYW5kbGUuaGFuZGxlLAogCQkJIGVfb3JpZ21yLT5pcHpfbXJfaGFuZGxlLmhhbmRsZSwKIAkJCSBlX29yaWdtci0+aWIuaWJfbXIubGtleSk7CkBAIC0xNjUxLDI4ICsxNjUxLDI4IEBACiAJLyogY2hlY2sgZmlyc3QgYnVmZmVyICovCiAJaWYgKCgodTY0KWlvdmFfc3RhcnQgJiB+UEFHRV9NQVNLKSAhPSAocGJ1Zi0+YWRkciAmIH5QQUdFX01BU0spKSB7CiAJCWVoY2FfZ2VuX2VycigiaW92YV9zdGFydC9hZGRyIG1pc21hdGNoLCBpb3ZhX3N0YXJ0PSVwICIKLQkJCSAgICAgInBidWYtPmFkZHI9JWx4IHBidWYtPnNpemU9JWx4IiwKKwkJCSAgICAgInBidWYtPmFkZHI9JWxseCBwYnVmLT5zaXplPSVsbHgiLAogCQkJICAgICBpb3ZhX3N0YXJ0LCBwYnVmLT5hZGRyLCBwYnVmLT5zaXplKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCWlmICgoKHBidWYtPmFkZHIgKyBwYnVmLT5zaXplKSAlIFBBR0VfU0laRSkgJiYKIAkgICAgKG51bV9waHlzX2J1ZiA+IDEpKSB7Ci0JCWVoY2FfZ2VuX2VycigiYWRkci9zaXplIG1pc21hdGNoIGluIDFzdCBidWYsIHBidWYtPmFkZHI9JWx4ICIKLQkJCSAgICAgInBidWYtPnNpemU9JWx4IiwgcGJ1Zi0+YWRkciwgcGJ1Zi0+c2l6ZSk7CisJCWVoY2FfZ2VuX2VycigiYWRkci9zaXplIG1pc21hdGNoIGluIDFzdCBidWYsIHBidWYtPmFkZHI9JWxseCAiCisJCQkgICAgICJwYnVmLT5zaXplPSVsbHgiLCBwYnVmLT5hZGRyLCBwYnVmLT5zaXplKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJZm9yIChpID0gMDsgaSA8IG51bV9waHlzX2J1ZjsgaSsrKSB7CiAJCWlmICgoaSA+IDApICYmIChwYnVmLT5hZGRyICUgUEFHRV9TSVpFKSkgewotCQkJZWhjYV9nZW5fZXJyKCJiYWQgYWRkcmVzcywgaT0leCBwYnVmLT5hZGRyPSVseCAiCi0JCQkJICAgICAicGJ1Zi0+c2l6ZT0lbHgiLAorCQkJZWhjYV9nZW5fZXJyKCJiYWQgYWRkcmVzcywgaT0leCBwYnVmLT5hZGRyPSVsbHggIgorCQkJCSAgICAgInBidWYtPnNpemU9JWxseCIsCiAJCQkJICAgICBpLCBwYnVmLT5hZGRyLCBwYnVmLT5zaXplKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAJCWlmICgoKGkgPiAwKSAmJgkvKiBub3QgMXN0ICovCiAJCSAgICAgKGkgPCAobnVtX3BoeXNfYnVmIC0gMSkpICYmCS8qIG5vdCBsYXN0ICovCiAJCSAgICAgKHBidWYtPnNpemUgJSBQQUdFX1NJWkUpKSB8fCAocGJ1Zi0+c2l6ZSA9PSAwKSkgewotCQkJZWhjYV9nZW5fZXJyKCJiYWQgc2l6ZSwgaT0leCBwYnVmLT5zaXplPSVseCIsCisJCQllaGNhX2dlbl9lcnIoImJhZCBzaXplLCBpPSV4IHBidWYtPnNpemU9JWxseCIsCiAJCQkJICAgICBpLCBwYnVmLT5zaXplKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CkBAIC0xNzA1LDcgKzE3MDUsNyBAQAogCXBhZ2UgPSBwYWdlX2xpc3Q7CiAJZm9yIChpID0gMDsgaSA8IGxpc3RfbGVuOyBpKyspIHsKIAkJaWYgKCpwYWdlICUgZV9mbXItPmZtcl9wYWdlX3NpemUpIHsKLQkJCWVoY2FfZ2VuX2VycigiYmFkIHBhZ2UsIGk9JXggKnBhZ2U9JWx4IHBhZ2U9JXAgZm1yPSVwICIKKwkJCWVoY2FfZ2VuX2VycigiYmFkIHBhZ2UsIGk9JXggKnBhZ2U9JWxseCBwYWdlPSVwIGZtcj0lcCAiCiAJCQkJICAgICAiZm1yX3BhZ2Vfc2l6ZT0leCIsIGksICpwYWdlLCBwYWdlLCBlX2ZtciwKIAkJCQkgICAgIGVfZm1yLT5mbXJfcGFnZV9zaXplKTsKIAkJCXJldHVybiAtRUlOVkFMOwpAQCAtMTc0Myw5ICsxNzQzLDkgQEAKIAkJCQkJICAgICAocGdpbmZvLT5uZXh0X2h3cGFnZSAqCiAJCQkJCSAgICAgIHBnaW5mby0+aHdwYWdlX3NpemUpKTsKIAkJCWlmICggISgqa3BhZ2UpICkgewotCQkJCWVoY2FfZ2VuX2VycigicGdhZGRyPSVseCAiCi0JCQkJCSAgICAgImNodW5rLT5wYWdlX2xpc3RbaV09JWx4ICIKLQkJCQkJICAgICAiaT0leCBuZXh0X2h3cGFnZT0lbHgiLAorCQkJCWVoY2FfZ2VuX2VycigicGdhZGRyPSVsbHggIgorCQkJCQkgICAgICJjaHVuay0+cGFnZV9saXN0W2ldPSVsbHggIgorCQkJCQkgICAgICJpPSV4IG5leHRfaHdwYWdlPSVsbHgiLAogCQkJCQkgICAgIHBnYWRkciwgKHU2NClzZ19kbWFfYWRkcmVzcygKIAkJCQkJCSAgICAgJmNodW5rLT5wYWdlX2xpc3RbaV0pLAogCQkJCQkgICAgIGksIHBnaW5mby0+bmV4dF9od3BhZ2UpOwpAQCAtMTc5NSwxMSArMTc5NSwxMSBAQAogCWZvciAodCA9IHN0YXJ0X2lkeDsgdCA8PSBlbmRfaWR4OyB0KyspIHsKIAkJdTY0IHBnYWRkciA9IHBhZ2VfdG9fcGZuKHNnX3BhZ2UoJnBhZ2VfbGlzdFt0XSkpIDw8IFBBR0VfU0hJRlQ7CiAJCWlmIChlaGNhX2RlYnVnX2xldmVsID49IDMpCi0JCQllaGNhX2dlbl9kYmcoImNodW5rX3BhZ2U9JWx4IHZhbHVlPSUwMTZseCIsIHBnYWRkciwKKwkJCWVoY2FfZ2VuX2RiZygiY2h1bmtfcGFnZT0lbGx4IHZhbHVlPSUwMTZsbHgiLCBwZ2FkZHIsCiAJCQkJICAgICAqKHU2NCAqKWFic190b192aXJ0KHBoeXNfdG9fYWJzKHBnYWRkcikpKTsKIAkJaWYgKHBnYWRkciAtIFBBR0VfU0laRSAhPSAqcHJldl9wZ2FkZHIpIHsKLQkJCWVoY2FfZ2VuX2VycigidW5jb250aWd1b3VzIHBhZ2UgZm91bmQgcGdhZGRyPSVseCAiCi0JCQkJICAgICAicHJldl9wZ2FkZHI9JWx4IHBhZ2VfbGlzdF9pPSV4IiwKKwkJCWVoY2FfZ2VuX2VycigidW5jb250aWd1b3VzIHBhZ2UgZm91bmQgcGdhZGRyPSVsbHggIgorCQkJCSAgICAgInByZXZfcGdhZGRyPSVsbHggcGFnZV9saXN0X2k9JXgiLAogCQkJCSAgICAgcGdhZGRyLCAqcHJldl9wZ2FkZHIsIHQpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KQEAgLTE4MzMsNyArMTgzMyw3IEBACiAJCQkJCSAgIDw8IFBBR0VfU0hJRlQgKTsKIAkJCQkqa3BhZ2UgPSBwaHlzX3RvX2FicyhwZ2FkZHIpOwogCQkJCWlmICggISgqa3BhZ2UpICkgewotCQkJCQllaGNhX2dlbl9lcnIoInBnYWRkcj0lbHggaT0leCIsCisJCQkJCWVoY2FfZ2VuX2VycigicGdhZGRyPSVsbHggaT0leCIsCiAJCQkJCQkgICAgIHBnYWRkciwgaSk7CiAJCQkJCXJldCA9IC1FRkFVTFQ7CiAJCQkJCXJldHVybiByZXQ7CkBAIC0xODQ2LDggKzE4NDYsOCBAQAogCQkJCQlpZiAocGdpbmZvLT5od3BhZ2VfY250KSB7CiAJCQkJCQllaGNhX2dlbl9lcnIoCiAJCQkJCQkJImludmFsaWQgYWxpZ25tZW50ICIKLQkJCQkJCQkicGdhZGRyPSVseCBpPSV4ICIKLQkJCQkJCQkibXJfcGdzaXplPSVseCIsCisJCQkJCQkJInBnYWRkcj0lbGx4IGk9JXggIgorCQkJCQkJCSJtcl9wZ3NpemU9JWxseCIsCiAJCQkJCQkJcGdhZGRyLCBpLAogCQkJCQkJCXBnaW5mby0+aHdwYWdlX3NpemUpOwogCQkJCQkJcmV0ID0gLUVGQVVMVDsKQEAgLTE4NjYsOCArMTg2Niw4IEBACiAJCQkJaWYgKGVoY2FfZGVidWdfbGV2ZWwgPj0gMykgewogCQkJCQl1NjQgdmFsID0gKih1NjQgKilhYnNfdG9fdmlydCgKIAkJCQkJCXBoeXNfdG9fYWJzKHBnYWRkcikpOwotCQkJCQllaGNhX2dlbl9kYmcoImtwYWdlPSVseCBjaHVua19wYWdlPSVseCAiCi0JCQkJCQkgICAgICJ2YWx1ZT0lMDE2bHgiLAorCQkJCQllaGNhX2dlbl9kYmcoImtwYWdlPSVsbHggY2h1bmtfcGFnZT0lbGx4ICIKKwkJCQkJCSAgICAgInZhbHVlPSUwMTZsbHgiLAogCQkJCQkJICAgICAqa3BhZ2UsIHBnYWRkciwgdmFsKTsKIAkJCQl9CiAJCQkJcHJldl9wZ2FkZHIgPSBwZ2FkZHI7CkBAIC0xOTQ0LDkgKzE5NDQsOSBAQAogCQkJaWYgKChwZ2luZm8tPmtwYWdlX2NudCA+PSBwZ2luZm8tPm51bV9rcGFnZXMpIHx8CiAJCQkgICAgKHBnaW5mby0+aHdwYWdlX2NudCA+PSBwZ2luZm8tPm51bV9od3BhZ2VzKSkgewogCQkJCWVoY2FfZ2VuX2Vycigia3BhZ2VfY250ID49IG51bV9rcGFnZXMsICIKLQkJCQkJICAgICAia3BhZ2VfY250PSVseCBudW1fa3BhZ2VzPSVseCAiCi0JCQkJCSAgICAgImh3cGFnZV9jbnQ9JWx4ICIKLQkJCQkJICAgICAibnVtX2h3cGFnZXM9JWx4IGk9JXgiLAorCQkJCQkgICAgICJrcGFnZV9jbnQ9JWxseCBudW1fa3BhZ2VzPSVsbHggIgorCQkJCQkgICAgICJod3BhZ2VfY250PSVsbHggIgorCQkJCQkgICAgICJudW1faHdwYWdlcz0lbGx4IGk9JXgiLAogCQkJCQkgICAgIHBnaW5mby0+a3BhZ2VfY250LAogCQkJCQkgICAgIHBnaW5mby0+bnVtX2twYWdlcywKIAkJCQkJICAgICBwZ2luZm8tPmh3cGFnZV9jbnQsCkBAIC0xOTU3LDggKzE5NTcsOCBAQAogCQkJCShwYnVmLT5hZGRyICYgfihwZ2luZm8tPmh3cGFnZV9zaXplIC0gMSkpICsKIAkJCQkocGdpbmZvLT5uZXh0X2h3cGFnZSAqIHBnaW5mby0+aHdwYWdlX3NpemUpKTsKIAkJCWlmICggISgqa3BhZ2UpICYmIHBidWYtPmFkZHIgKSB7Ci0JCQkJZWhjYV9nZW5fZXJyKCJwYnVmLT5hZGRyPSVseCBwYnVmLT5zaXplPSVseCAiCi0JCQkJCSAgICAgIm5leHRfaHdwYWdlPSVseCIsIHBidWYtPmFkZHIsCisJCQkJZWhjYV9nZW5fZXJyKCJwYnVmLT5hZGRyPSVsbHggcGJ1Zi0+c2l6ZT0lbGx4ICIKKwkJCQkJICAgICAibmV4dF9od3BhZ2U9JWxseCIsIHBidWYtPmFkZHIsCiAJCQkJCSAgICAgcGJ1Zi0+c2l6ZSwgcGdpbmZvLT5uZXh0X2h3cGFnZSk7CiAJCQkJcmV0dXJuIC1FRkFVTFQ7CiAJCQl9CkBAIC0xOTk2LDggKzE5OTYsOCBAQAogCQkqa3BhZ2UgPSBwaHlzX3RvX2FicygoKmZtcmxpc3QgJiB+KHBnaW5mby0+aHdwYWdlX3NpemUgLSAxKSkgKwogCQkJCSAgICAgcGdpbmZvLT5uZXh0X2h3cGFnZSAqIHBnaW5mby0+aHdwYWdlX3NpemUpOwogCQlpZiAoICEoKmtwYWdlKSApIHsKLQkJCWVoY2FfZ2VuX2VycigiKmZtcmxpc3Q9JWx4IGZtcmxpc3Q9JXAgIgotCQkJCSAgICAgIm5leHRfbGlzdGVsZW09JWx4IG5leHRfaHdwYWdlPSVseCIsCisJCQllaGNhX2dlbl9lcnIoIipmbXJsaXN0PSVsbHggZm1ybGlzdD0lcCAiCisJCQkJICAgICAibmV4dF9saXN0ZWxlbT0lbGx4IG5leHRfaHdwYWdlPSVsbHgiLAogCQkJCSAgICAgKmZtcmxpc3QsIGZtcmxpc3QsCiAJCQkJICAgICBwZ2luZm8tPnUuZm1yLm5leHRfbGlzdGVsZW0sCiAJCQkJICAgICBwZ2luZm8tPm5leHRfaHdwYWdlKTsKQEAgLTIwMjUsNyArMjAyNSw3IEBACiAJCQkJCQkgICAgfihwZ2luZm8tPmh3cGFnZV9zaXplIC0gMSkpOwogCQkJCWlmIChwcmV2ICsgcGdpbmZvLT51LmZtci5mbXJfcGdzaXplICE9IHApIHsKIAkJCQkJZWhjYV9nZW5fZXJyKCJ1bmNvbnRpZ3VvdXMgZm1yIHBhZ2VzICIKLQkJCQkJCSAgICAgImZvdW5kIHByZXY9JWx4IHA9JWx4ICIKKwkJCQkJCSAgICAgImZvdW5kIHByZXY9JWxseCBwPSVsbHggIgogCQkJCQkJICAgICAiaWR4PSV4IiwgcHJldiwgcCwgaSArIGopOwogCQkJCQlyZXR1cm4gLUVJTlZBTDsKIAkJCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvZWhjYS9laGNhX3FwLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvZWhjYS9laGNhX3FwLmMKaW5kZXggZjE2MWNmMS4uMDBjMTA4MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2VoY2EvZWhjYV9xcC5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9laGNhL2VoY2FfcXAuYwpAQCAtMzMxLDcgKzMzMSw3IEBACiAJCWlmIChjbnQgPT0gKG5yX3FfcGFnZXMgLSAxKSkgewkvKiBsYXN0IHBhZ2UhICovCiAJCQlpZiAoaF9yZXQgIT0gZXhwZWN0ZWRfaHJldCkgewogCQkJCWVoY2FfZXJyKGliX2RldiwgImhpcHpfcXBfcmVnaXN0ZXJfcnBhZ2UoKSAiCi0JCQkJCSAiaF9yZXQ9JWxpIiwgaF9yZXQpOworCQkJCQkgImhfcmV0PSVsbGkiLCBoX3JldCk7CiAJCQkJcmV0ID0gZWhjYTJpYl9yZXR1cm5fY29kZShoX3JldCk7CiAJCQkJZ290byBpbml0X3FwX3F1ZXVlMTsKIAkJCX0KQEAgLTM0NSw3ICszNDUsNyBAQAogCQl9IGVsc2UgewogCQkJaWYgKGhfcmV0ICE9IEhfUEFHRV9SRUdJU1RFUkVEKSB7CiAJCQkJZWhjYV9lcnIoaWJfZGV2LCAiaGlwel9xcF9yZWdpc3Rlcl9ycGFnZSgpICIKLQkJCQkJICJoX3JldD0lbGkiLCBoX3JldCk7CisJCQkJCSAiaF9yZXQ9JWxsaSIsIGhfcmV0KTsKIAkJCQlyZXQgPSBlaGNhMmliX3JldHVybl9jb2RlKGhfcmV0KTsKIAkJCQlnb3RvIGluaXRfcXBfcXVldWUxOwogCQkJfQpAQCAtNzA5LDcgKzcwOSw3IEBACiAKIAloX3JldCA9IGhpcHpfaF9hbGxvY19yZXNvdXJjZV9xcChzaGNhLT5pcHpfaGNhX2hhbmRsZSwgJnBhcm1zKTsKIAlpZiAoaF9yZXQgIT0gSF9TVUNDRVNTKSB7Ci0JCWVoY2FfZXJyKHBkLT5kZXZpY2UsICJoX2FsbG9jX3Jlc291cmNlX3FwKCkgZmFpbGVkIGhfcmV0PSVsaSIsCisJCWVoY2FfZXJyKHBkLT5kZXZpY2UsICJoX2FsbG9jX3Jlc291cmNlX3FwKCkgZmFpbGVkIGhfcmV0PSVsbGkiLAogCQkJIGhfcmV0KTsKIAkJcmV0ID0gZWhjYTJpYl9yZXR1cm5fY29kZShoX3JldCk7CiAJCWdvdG8gY3JlYXRlX3FwX2V4aXQxOwpAQCAtMTAxMCw3ICsxMDEwLDcgQEAKIAkJCQltcXBjYiwgbXlfcXAtPmdhbHBhcy5rZXJuZWwpOwogCWlmIChocmV0ICE9IEhfU1VDQ0VTUykgewogCQllaGNhX2VycihwZC0+ZGV2aWNlLCAiQ291bGQgbm90IG1vZGlmeSBTUlEgdG8gSU5JVCAiCi0JCQkgImVoY2FfcXA9JXAgcXBfbnVtPSV4IGhfcmV0PSVsaSIsCisJCQkgImVoY2FfcXA9JXAgcXBfbnVtPSV4IGhfcmV0PSVsbGkiLAogCQkJIG15X3FwLCBteV9xcC0+cmVhbF9xcF9udW0sIGhyZXQpOwogCQlnb3RvIGNyZWF0ZV9zcnEyOwogCX0KQEAgLTEwMjQsNyArMTAyNCw3IEBACiAJCQkJbXFwY2IsIG15X3FwLT5nYWxwYXMua2VybmVsKTsKIAlpZiAoaHJldCAhPSBIX1NVQ0NFU1MpIHsKIAkJZWhjYV9lcnIocGQtPmRldmljZSwgIkNvdWxkIG5vdCBlbmFibGUgU1JRICIKLQkJCSAiZWhjYV9xcD0lcCBxcF9udW09JXggaF9yZXQ9JWxpIiwKKwkJCSAiZWhjYV9xcD0lcCBxcF9udW09JXggaF9yZXQ9JWxsaSIsCiAJCQkgbXlfcXAsIG15X3FwLT5yZWFsX3FwX251bSwgaHJldCk7CiAJCWdvdG8gY3JlYXRlX3NycTI7CiAJfQpAQCAtMTAzOCw3ICsxMDM4LDcgQEAKIAkJCQltcXBjYiwgbXlfcXAtPmdhbHBhcy5rZXJuZWwpOwogCWlmIChocmV0ICE9IEhfU1VDQ0VTUykgewogCQllaGNhX2VycihwZC0+ZGV2aWNlLCAiQ291bGQgbm90IG1vZGlmeSBTUlEgdG8gUlRSICIKLQkJCSAiZWhjYV9xcD0lcCBxcF9udW09JXggaF9yZXQ9JWxpIiwKKwkJCSAiZWhjYV9xcD0lcCBxcF9udW09JXggaF9yZXQ9JWxsaSIsCiAJCQkgbXlfcXAsIG15X3FwLT5yZWFsX3FwX251bSwgaHJldCk7CiAJCWdvdG8gY3JlYXRlX3NycTI7CiAJfQpAQCAtMTA3OCw3ICsxMDc4LDcgQEAKIAkJCQkJICAgJmJhZF9zZW5kX3dxZV9wLCBOVUxMLCAyKTsKIAlpZiAoaF9yZXQgIT0gSF9TVUNDRVNTKSB7CiAJCWVoY2FfZXJyKCZzaGNhLT5pYl9kZXZpY2UsICJoaXB6X2hfZGlzYWJsZV9hbmRfZ2V0X3dxZSgpIGZhaWxlZCIKLQkJCSAiIGVoY2FfcXA9JXAgcXBfbnVtPSV4IGhfcmV0PSVsaSIsCisJCQkgIiBlaGNhX3FwPSVwIHFwX251bT0leCBoX3JldD0lbGxpIiwKIAkJCSBteV9xcCwgcXBfbnVtLCBoX3JldCk7CiAJCXJldHVybiBlaGNhMmliX3JldHVybl9jb2RlKGhfcmV0KTsKIAl9CkBAIC0xMTM0LDcgKzExMzQsNyBAQAogCiAJaWYgKGlwel9xdWV1ZV9hYnNfdG9fb2Zmc2V0KGlwel9xdWV1ZSwgd3FlX3AsICZxX29mcykpIHsKIAkJZWhjYV9nZW5fZXJyKCJJbnZhbGlkIG9mZnNldCBmb3IgY2FsY3VsYXRpbmcgbGVmdCBjcWVzICIKLQkJCQkid3FlX3A9JSNseCB3cWVfdj0lcFxuIiwgd3FlX3AsIHdxZV92KTsKKwkJCQkid3FlX3A9JSNsbHggd3FlX3Y9JXBcbiIsIHdxZV9wLCB3cWVfdik7CiAJCXJldHVybiAtRUZBVUxUOwogCX0KIApAQCAtMTE2OCw3ICsxMTY4LDcgQEAKIAkJCQkmc2VuZF93cWVfcCwgJnJlY3Zfd3FlX3AsIDQpOwogCQlpZiAoaF9yZXQgIT0gSF9TVUNDRVNTKSB7CiAJCQllaGNhX2Vycigmc2hjYS0+aWJfZGV2aWNlLCAiZGlzYWJsZV9hbmRfZ2V0X3dxZSgpICIKLQkJCQkgImZhaWxlZCBlaGNhX3FwPSVwIHFwX251bT0leCBoX3JldD0lbGkiLAorCQkJCSAiZmFpbGVkIGVoY2FfcXA9JXAgcXBfbnVtPSV4IGhfcmV0PSVsbGkiLAogCQkJCSBteV9xcCwgcXBfbnVtLCBoX3JldCk7CiAJCQlyZXR1cm4gZWhjYTJpYl9yZXR1cm5fY29kZShoX3JldCk7CiAJCX0KQEAgLTEyNjEsNyArMTI2MSw3IEBACiAJCQkJbXFwY2IsIG15X3FwLT5nYWxwYXMua2VybmVsKTsKIAlpZiAoaF9yZXQgIT0gSF9TVUNDRVNTKSB7CiAJCWVoY2FfZXJyKGlicXAtPmRldmljZSwgImhpcHpfaF9xdWVyeV9xcCgpIGZhaWxlZCAiCi0JCQkgImVoY2FfcXA9JXAgcXBfbnVtPSV4IGhfcmV0PSVsaSIsCisJCQkgImVoY2FfcXA9JXAgcXBfbnVtPSV4IGhfcmV0PSVsbGkiLAogCQkJIG15X3FwLCBpYnFwLT5xcF9udW0sIGhfcmV0KTsKIAkJcmV0ID0gZWhjYTJpYl9yZXR1cm5fY29kZShoX3JldCk7CiAJCWdvdG8gbW9kaWZ5X3FwX2V4aXQxOwpAQCAtMTY5MCw3ICsxNjkwLDcgQEAKIAogCWlmIChoX3JldCAhPSBIX1NVQ0NFU1MpIHsKIAkJcmV0ID0gZWhjYTJpYl9yZXR1cm5fY29kZShoX3JldCk7Ci0JCWVoY2FfZXJyKGlicXAtPmRldmljZSwgImhpcHpfaF9tb2RpZnlfcXAoKSBmYWlsZWQgaF9yZXQ9JWxpICIKKwkJZWhjYV9lcnIoaWJxcC0+ZGV2aWNlLCAiaGlwel9oX21vZGlmeV9xcCgpIGZhaWxlZCBoX3JldD0lbGxpICIKIAkJCSAiZWhjYV9xcD0lcCBxcF9udW09JXgiLCBoX3JldCwgbXlfcXAsIGlicXAtPnFwX251bSk7CiAJCWdvdG8gbW9kaWZ5X3FwX2V4aXQyOwogCX0KQEAgLTE3MjMsNyArMTcyMyw3IEBACiAJCQlyZXQgPSBlaGNhMmliX3JldHVybl9jb2RlKGhfcmV0KTsKIAkJCWVoY2FfZXJyKGlicXAtPmRldmljZSwgIkVOQUJMRSBpbiBjb250ZXh0IG9mICIKIAkJCQkgIlJFU0VUXzJfSU5JVCBmYWlsZWQhIE1heWJlIHlvdSBkaWRuJ3QgZ2V0ICIKLQkJCQkgImEgTElEIGhfcmV0PSVsaSBlaGNhX3FwPSVwIHFwX251bT0leCIsCisJCQkJICJhIExJRCBoX3JldD0lbGxpIGVoY2FfcXA9JXAgcXBfbnVtPSV4IiwKIAkJCQkgaF9yZXQsIG15X3FwLCBpYnFwLT5xcF9udW0pOwogCQkJZ290byBtb2RpZnlfcXBfZXhpdDI7CiAJCX0KQEAgLTE5MDksNyArMTkwOSw3IEBACiAJaWYgKGhfcmV0ICE9IEhfU1VDQ0VTUykgewogCQlyZXQgPSBlaGNhMmliX3JldHVybl9jb2RlKGhfcmV0KTsKIAkJZWhjYV9lcnIocXAtPmRldmljZSwgImhpcHpfaF9xdWVyeV9xcCgpIGZhaWxlZCAiCi0JCQkgImVoY2FfcXA9JXAgcXBfbnVtPSV4IGhfcmV0PSVsaSIsCisJCQkgImVoY2FfcXA9JXAgcXBfbnVtPSV4IGhfcmV0PSVsbGkiLAogCQkJIG15X3FwLCBxcC0+cXBfbnVtLCBoX3JldCk7CiAJCWdvdG8gcXVlcnlfcXBfZXhpdDE7CiAJfQpAQCAtMjA3NCw3ICsyMDc0LDcgQEAKIAogCWlmIChoX3JldCAhPSBIX1NVQ0NFU1MpIHsKIAkJcmV0ID0gZWhjYTJpYl9yZXR1cm5fY29kZShoX3JldCk7Ci0JCWVoY2FfZXJyKGlic3JxLT5kZXZpY2UsICJoaXB6X2hfbW9kaWZ5X3FwKCkgZmFpbGVkIGhfcmV0PSVsaSAiCisJCWVoY2FfZXJyKGlic3JxLT5kZXZpY2UsICJoaXB6X2hfbW9kaWZ5X3FwKCkgZmFpbGVkIGhfcmV0PSVsbGkgIgogCQkJICJlaGNhX3FwPSVwIHFwX251bT0leCIsCiAJCQkgaF9yZXQsIG15X3FwLCBteV9xcC0+cmVhbF9xcF9udW0pOwogCX0KQEAgLTIxMDgsNyArMjEwOCw3IEBACiAJaWYgKGhfcmV0ICE9IEhfU1VDQ0VTUykgewogCQlyZXQgPSBlaGNhMmliX3JldHVybl9jb2RlKGhfcmV0KTsKIAkJZWhjYV9lcnIoc3JxLT5kZXZpY2UsICJoaXB6X2hfcXVlcnlfcXAoKSBmYWlsZWQgIgotCQkJICJlaGNhX3FwPSVwIHFwX251bT0leCBoX3JldD0lbGkiLAorCQkJICJlaGNhX3FwPSVwIHFwX251bT0leCBoX3JldD0lbGxpIiwKIAkJCSBteV9xcCwgbXlfcXAtPnJlYWxfcXBfbnVtLCBoX3JldCk7CiAJCWdvdG8gcXVlcnlfc3JxX2V4aXQxOwogCX0KQEAgLTIxNzksNyArMjE3OSw3IEBACiAKIAloX3JldCA9IGhpcHpfaF9kZXN0cm95X3FwKHNoY2EtPmlwel9oY2FfaGFuZGxlLCBteV9xcCk7CiAJaWYgKGhfcmV0ICE9IEhfU1VDQ0VTUykgewotCQllaGNhX2VycihkZXYsICJoaXB6X2hfZGVzdHJveV9xcCgpIGZhaWxlZCBoX3JldD0lbGkgIgorCQllaGNhX2VycihkZXYsICJoaXB6X2hfZGVzdHJveV9xcCgpIGZhaWxlZCBoX3JldD0lbGxpICIKIAkJCSAiZWhjYV9xcD0lcCBxcF9udW09JXgiLCBoX3JldCwgbXlfcXAsIHFwX251bSk7CiAJCXJldHVybiBlaGNhMmliX3JldHVybl9jb2RlKGhfcmV0KTsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvZWhjYS9laGNhX3JlcXMuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9laGNhL2VoY2FfcmVxcy5jCmluZGV4IGM3MTEyNjguLjVhM2Q5NmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9laGNhL2VoY2FfcmVxcy5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9laGNhL2VoY2FfcmVxcy5jCkBAIC04MjIsNyArODIyLDcgQEAKIAkJb2Zmc2V0ID0gcW1hcC0+bmV4dF93cWVfaWR4ICogaXB6X3F1ZXVlLT5xZV9zaXplOwogCQl3cWUgPSAoc3RydWN0IGVoY2Ffd3FlICopaXB6X3FlaXRfY2FsYyhpcHpfcXVldWUsIG9mZnNldCk7CiAJCWlmICghd3FlKSB7Ci0JCQllaGNhX2VycihjcS0+ZGV2aWNlLCAiSW52YWxpZCB3cWUgb2Zmc2V0PSUjbHggb24gIgorCQkJZWhjYV9lcnIoY3EtPmRldmljZSwgIkludmFsaWQgd3FlIG9mZnNldD0lI2xseCBvbiAiCiAJCQkJICJxcF9udW09JSN4Iiwgb2Zmc2V0LCBteV9xcC0+cmVhbF9xcF9udW0pOwogCQkJcmV0dXJuIG5yOwogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvZWhjYS9laGNhX3NxcC5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2VoY2EvZWhjYV9zcXAuYwppbmRleCA3MDZkOTdhLi40NDQ0N2FhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvZWhjYS9laGNhX3NxcC5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9laGNhL2VoY2Ffc3FwLmMKQEAgLTg1LDcgKzg1LDcgQEAKIAogCQlpZiAocmV0ICE9IEhfU1VDQ0VTUykgewogCQkJZWhjYV9lcnIoJnNoY2EtPmliX2RldmljZSwKLQkJCQkgIkNhbid0IGRlZmluZSBBUVAxIGZvciBwb3J0ICV4LiBoX3JldD0lbGkiLAorCQkJCSAiQ2FuJ3QgZGVmaW5lIEFRUDEgZm9yIHBvcnQgJXguIGhfcmV0PSVsbGkiLAogCQkJCSBwb3J0LCByZXQpOwogCQkJcmV0dXJuIHJldDsKIAkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2VoY2EvZWhjYV90b29scy5oIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2VoY2EvZWhjYV90b29scy5oCmluZGV4IDIxZjdkMDYuLmYwOTkxNGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9laGNhL2VoY2FfdG9vbHMuaAorKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvZWhjYS9laGNhX3Rvb2xzLmgKQEAgLTExNiw3ICsxMTYsNyBAQAogCQl1bnNpZ25lZCBjaGFyICpkZWIgPSAodW5zaWduZWQgY2hhciAqKShhZHIpOyBcCiAJCWZvciAoeCA9IDA7IHggPCBsOyB4ICs9IDE2KSB7IFwKIAkJCXByaW50ayhLRVJOX0lORk8gIkVIQ0FfRE1QOiVzICIgZm9ybWF0IFwKLQkJCSAgICAgICAiIGFkcj0lcCBvZnM9JTA0eCAlMDE2bHggJTAxNmx4XG4iLCBcCisJCQkgICAgICAgIiBhZHI9JXAgb2ZzPSUwNHggJTAxNmxseCAlMDE2bGx4XG4iLCBcCiAJCQkgICAgICAgX19mdW5jX18sICMjYXJncywgZGViLCB4LCBcCiAJCQkgICAgICAgKigodTY0ICopJmRlYlswXSksICooKHU2NCAqKSZkZWJbOF0pKTsgXAogCQkJZGViICs9IDE2OyBcCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvZWhjYS9laGNhX3V2ZXJicy5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2VoY2EvZWhjYV91dmVyYnMuYwppbmRleCBlNDNlZDhmLi4zY2I2ODhkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvZWhjYS9laGNhX3V2ZXJicy5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9laGNhL2VoY2FfdXZlcmJzLmMKQEAgLTExNCw3ICsxMTQsNyBAQAogCiAJcGh5c2ljYWwgPSBnYWxwYXMtPnVzZXIuZndfaGFuZGxlOwogCXZtYS0+dm1fcGFnZV9wcm90ID0gcGdwcm90X25vbmNhY2hlZCh2bWEtPnZtX3BhZ2VfcHJvdCk7Ci0JZWhjYV9nZW5fZGJnKCJ2c2l6ZT0lbHggcGh5c2ljYWw9JWx4IiwgdnNpemUsIHBoeXNpY2FsKTsKKwllaGNhX2dlbl9kYmcoInZzaXplPSVsbHggcGh5c2ljYWw9JWxseCIsIHZzaXplLCBwaHlzaWNhbCk7CiAJLyogVk1fSU8gfCBWTV9SRVNFUlZFRCBhcmUgc2V0IGJ5IHJlbWFwX3Bmbl9yYW5nZSgpICovCiAJcmV0ID0gcmVtYXBfNGtfcGZuKHZtYSwgdm1hLT52bV9zdGFydCwgcGh5c2ljYWwgPj4gRUhDQV9QQUdFU0hJRlQsCiAJCQkgICB2bWEtPnZtX3BhZ2VfcHJvdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvZWhjYS9oY3BfaWYuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9laGNhL2hjcF9pZi5jCmluZGV4IDQxNWQzYTQuLmQwYWIwYzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9laGNhL2hjcF9pZi5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9laGNhL2hjcF9pZi5jCkBAIC0yMjYsNyArMjI2LDcgQEAKIAkJCSAgICAgdTMyICplcV9pc3QpCiB7CiAJdTY0IHJldDsKLQl1NjQgb3V0c1tQTFBBUl9IQ0FMTDlfQlVGU0laRV07CisJdW5zaWduZWQgbG9uZyBvdXRzW1BMUEFSX0hDQUxMOV9CVUZTSVpFXTsKIAl1NjQgYWxsb2NhdGVfY29udHJvbHM7CiAKIAkvKiByZXNvdXJjZSB0eXBlICovCkBAIC0yNDksNyArMjQ5LDcgQEAKIAkqZXFfaXN0ID0gKHUzMilvdXRzWzVdOwogCiAJaWYgKHJldCA9PSBIX05PVF9FTk9VR0hfUkVTT1VSQ0VTKQotCQllaGNhX2dlbl9lcnIoIk5vdCBlbm91Z2ggcmVzb3VyY2UgLSByZXQ9JWxpICIsIHJldCk7CisJCWVoY2FfZ2VuX2VycigiTm90IGVub3VnaCByZXNvdXJjZSAtIHJldD0lbGxpICIsIHJldCk7CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtMjcwLDcgKzI3MCw3IEBACiAJCQkgICAgIHN0cnVjdCBlaGNhX2FsbG9jX2NxX3Bhcm1zICpwYXJhbSkKIHsKIAl1NjQgcmV0OwotCXU2NCBvdXRzW1BMUEFSX0hDQUxMOV9CVUZTSVpFXTsKKwl1bnNpZ25lZCBsb25nIG91dHNbUExQQVJfSENBTEw5X0JVRlNJWkVdOwogCiAJcmV0ID0gZWhjYV9wbHBhcl9oY2FsbDkoSF9BTExPQ19SRVNPVVJDRSwgb3V0cywKIAkJCQlhZGFwdGVyX2hhbmRsZS5oYW5kbGUsICAgLyogcjQgICovCkBAIC0yODcsNyArMjg3LDcgQEAKIAkJaGNwX2dhbHBhc19jdG9yKCZjcS0+Z2FscGFzLCBvdXRzWzVdLCBvdXRzWzZdKTsKIAogCWlmIChyZXQgPT0gSF9OT1RfRU5PVUdIX1JFU09VUkNFUykKLQkJZWhjYV9nZW5fZXJyKCJOb3QgZW5vdWdoIHJlc291cmNlcy4gcmV0PSVsaSIsIHJldCk7CisJCWVoY2FfZ2VuX2VycigiTm90IGVub3VnaCByZXNvdXJjZXMuIHJldD0lbGxpIiwgcmV0KTsKIAogCXJldHVybiByZXQ7CiB9CkBAIC0yOTcsNyArMjk3LDcgQEAKIHsKIAl1NjQgcmV0OwogCXU2NCBhbGxvY2F0ZV9jb250cm9scywgbWF4X3IxMF9yZWcsIHIxMSwgcjEyOwotCXU2NCBvdXRzW1BMUEFSX0hDQUxMOV9CVUZTSVpFXTsKKwl1bnNpZ25lZCBsb25nIG91dHNbUExQQVJfSENBTEw5X0JVRlNJWkVdOwogCiAJYWxsb2NhdGVfY29udHJvbHMgPQogCQlFSENBX0JNQVNLX1NFVChIX0FMTF9SRVNfUVBfRU5IQU5DRURfT1BTLCBwYXJtcy0+ZXh0X3R5cGUpCkBAIC0zNjIsNyArMzYyLDcgQEAKIAkJaGNwX2dhbHBhc19jdG9yKCZwYXJtcy0+Z2FscGFzLCBvdXRzWzZdLCBvdXRzWzZdKTsKIAogCWlmIChyZXQgPT0gSF9OT1RfRU5PVUdIX1JFU09VUkNFUykKLQkJZWhjYV9nZW5fZXJyKCJOb3QgZW5vdWdoIHJlc291cmNlcy4gcmV0PSVsaSIsIHJldCk7CisJCWVoY2FfZ2VuX2VycigiTm90IGVub3VnaCByZXNvdXJjZXMuIHJldD0lbGxpIiwgcmV0KTsKIAogCXJldHVybiByZXQ7CiB9CkBAIC00NTQsNyArNDU0LDcgQEAKIAkJCSAgICAgY29uc3QgdTY0IGNvdW50KQogewogCWlmIChjb3VudCAhPSAxKSB7Ci0JCWVoY2FfZ2VuX2VycigiUHBhZ2UgY291bnRlcj0lbHgiLCBjb3VudCk7CisJCWVoY2FfZ2VuX2VycigiUHBhZ2UgY291bnRlcj0lbGx4IiwgY291bnQpOwogCQlyZXR1cm4gSF9QQVJBTUVURVI7CiAJfQogCXJldHVybiBoaXB6X2hfcmVnaXN0ZXJfcnBhZ2UoYWRhcHRlcl9oYW5kbGUsCkBAIC00ODksNyArNDg5LDcgQEAKIAkJCSAgICAgY29uc3Qgc3RydWN0IGhfZ2FscGEgZ2FsKQogewogCWlmIChjb3VudCAhPSAxKSB7Ci0JCWVoY2FfZ2VuX2VycigiUGFnZSBjb3VudGVyPSVseCIsIGNvdW50KTsKKwkJZWhjYV9nZW5fZXJyKCJQYWdlIGNvdW50ZXI9JWxseCIsIGNvdW50KTsKIAkJcmV0dXJuIEhfUEFSQU1FVEVSOwogCX0KIApAQCAtNTA4LDcgKzUwOCw3IEBACiAJCQkgICAgIGNvbnN0IHN0cnVjdCBoX2dhbHBhIGdhbHBhKQogewogCWlmIChjb3VudCA+IDEpIHsKLQkJZWhjYV9nZW5fZXJyKCJQYWdlIGNvdW50ZXI9JWx4IiwgY291bnQpOworCQllaGNhX2dlbl9lcnIoIlBhZ2UgY291bnRlcj0lbGx4IiwgY291bnQpOwogCQlyZXR1cm4gSF9QQVJBTUVURVI7CiAJfQogCkBAIC01MjUsNyArNTI1LDcgQEAKIAkJCSAgICAgICBpbnQgZGlzX2FuZF9nZXRfZnVuY3Rpb25fY29kZSkKIHsKIAl1NjQgcmV0OwotCXU2NCBvdXRzW1BMUEFSX0hDQUxMOV9CVUZTSVpFXTsKKwl1bnNpZ25lZCBsb25nIG91dHNbUExQQVJfSENBTEw5X0JVRlNJWkVdOwogCiAJcmV0ID0gZWhjYV9wbHBhcl9oY2FsbDkoSF9ESVNBQkxFX0FORF9HRVRDLCBvdXRzLAogCQkJCWFkYXB0ZXJfaGFuZGxlLmhhbmRsZSwgICAgIC8qIHI0ICovCkBAIC01NDgsNyArNTQ4LDcgQEAKIAkJICAgICBzdHJ1Y3QgaF9nYWxwYSBnYWwpCiB7CiAJdTY0IHJldDsKLQl1NjQgb3V0c1tQTFBBUl9IQ0FMTDlfQlVGU0laRV07CisJdW5zaWduZWQgbG9uZyBvdXRzW1BMUEFSX0hDQUxMOV9CVUZTSVpFXTsKIAlyZXQgPSBlaGNhX3BscGFyX2hjYWxsOShIX01PRElGWV9RUCwgb3V0cywKIAkJCQlhZGFwdGVyX2hhbmRsZS5oYW5kbGUsIC8qIHI0ICovCiAJCQkJcXBfaGFuZGxlLmhhbmRsZSwgICAgICAvKiByNSAqLwpAQCAtNTU3LDcgKzU1Nyw3IEBACiAJCQkJMCwgMCwgMCwgMCwgMCk7CiAKIAlpZiAocmV0ID09IEhfTk9UX0VOT1VHSF9SRVNPVVJDRVMpCi0JCWVoY2FfZ2VuX2VycigiSW5zdWZmaWNpZW50IHJlc291cmNlcyByZXQ9JWxpIiwgcmV0KTsKKwkJZWhjYV9nZW5fZXJyKCJJbnN1ZmZpY2llbnQgcmVzb3VyY2VzIHJldD0lbGxpIiwgcmV0KTsKIAogCXJldHVybiByZXQ7CiB9CkBAIC01NzksNyArNTc5LDcgQEAKIAkJICAgICAgc3RydWN0IGVoY2FfcXAgKnFwKQogewogCXU2NCByZXQ7Ci0JdTY0IG91dHNbUExQQVJfSENBTEw5X0JVRlNJWkVdOworCXVuc2lnbmVkIGxvbmcgb3V0c1tQTFBBUl9IQ0FMTDlfQlVGU0laRV07CiAKIAlyZXQgPSBoY3BfZ2FscGFzX2R0b3IoJnFwLT5nYWxwYXMpOwogCWlmIChyZXQpIHsKQEAgLTU5Myw3ICs1OTMsNyBAQAogCQkJCXFwLT5pcHpfcXBfaGFuZGxlLmhhbmRsZSwgIC8qIHI2ICovCiAJCQkJMCwgMCwgMCwgMCwgMCwgMCk7CiAJaWYgKHJldCA9PSBIX0hBUkRXQVJFKQotCQllaGNhX2dlbl9lcnIoIkhDQSBub3Qgb3BlcmF0aW9uYWwuIHJldD0lbGkiLCByZXQpOworCQllaGNhX2dlbl9lcnIoIkhDQSBub3Qgb3BlcmF0aW9uYWwuIHJldD0lbGxpIiwgcmV0KTsKIAogCXJldCA9IGVoY2FfcGxwYXJfaGNhbGxfbm9yZXRzKEhfRlJFRV9SRVNPVVJDRSwKIAkJCQkgICAgICBhZGFwdGVyX2hhbmRsZS5oYW5kbGUsICAgICAvKiByNCAqLwpAQCAtNjAxLDcgKzYwMSw3IEBACiAJCQkJICAgICAgMCwgMCwgMCwgMCwgMCk7CiAKIAlpZiAocmV0ID09IEhfUkVTT1VSQ0UpCi0JCWVoY2FfZ2VuX2VycigiUmVzb3VyY2Ugc3RpbGwgaW4gdXNlLiByZXQ9JWxpIiwgcmV0KTsKKwkJZWhjYV9nZW5fZXJyKCJSZXNvdXJjZSBzdGlsbCBpbiB1c2UuIHJldD0lbGxpIiwgcmV0KTsKIAogCXJldHVybiByZXQ7CiB9CkBAIC02MjUsNyArNjI1LDcgQEAKIAkJICAgICAgIHUzMiAqIGJtYV9xcF9ucikKIHsKIAl1NjQgcmV0OwotCXU2NCBvdXRzW1BMUEFSX0hDQUxMOV9CVUZTSVpFXTsKKwl1bnNpZ25lZCBsb25nIG91dHNbUExQQVJfSENBTEw5X0JVRlNJWkVdOwogCiAJcmV0ID0gZWhjYV9wbHBhcl9oY2FsbDkoSF9ERUZJTkVfQVFQMSwgb3V0cywKIAkJCQlhZGFwdGVyX2hhbmRsZS5oYW5kbGUsIC8qIHI0ICovCkBAIC02MzYsNyArNjM2LDcgQEAKIAkqYm1hX3FwX25yID0gKHUzMilvdXRzWzFdOwogCiAJaWYgKHJldCA9PSBIX0FMSUFTX0VYSVNUKQotCQllaGNhX2dlbl9lcnIoIkFRUDEgYWxyZWFkeSBleGlzdHMuIHJldD0lbGkiLCByZXQpOworCQllaGNhX2dlbl9lcnIoIkFRUDEgYWxyZWFkeSBleGlzdHMuIHJldD0lbGxpIiwgcmV0KTsKIAogCXJldHVybiByZXQ7CiB9CkBAIC02NTgsNyArNjU4LDcgQEAKIAkJCQkgICAgICAwLCAwKTsKIAogCWlmIChyZXQgPT0gSF9OT1RfRU5PVUdIX1JFU09VUkNFUykKLQkJZWhjYV9nZW5fZXJyKCJOb3QgZW5vdWdoIHJlc291cmNlcy4gcmV0PSVsaSIsIHJldCk7CisJCWVoY2FfZ2VuX2VycigiTm90IGVub3VnaCByZXNvdXJjZXMuIHJldD0lbGxpIiwgcmV0KTsKIAogCXJldHVybiByZXQ7CiB9CkBAIC02OTcsNyArNjk3LDcgQEAKIAkJCQkgICAgICAwLCAwLCAwLCAwKTsKIAogCWlmIChyZXQgPT0gSF9SRVNPVVJDRSkKLQkJZWhjYV9nZW5fZXJyKCJIX0ZSRUVfUkVTT1VSQ0UgZmFpbGVkIHJldD0lbGkgIiwgcmV0KTsKKwkJZWhjYV9nZW5fZXJyKCJIX0ZSRUVfUkVTT1VSQ0UgZmFpbGVkIHJldD0lbGxpICIsIHJldCk7CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtNzE5LDcgKzcxOSw3IEBACiAJCQkJICAgICAgMCwgMCwgMCwgMCwgMCk7CiAKIAlpZiAocmV0ID09IEhfUkVTT1VSQ0UpCi0JCWVoY2FfZ2VuX2VycigiUmVzb3VyY2UgaW4gdXNlLiByZXQ9JWxpICIsIHJldCk7CisJCWVoY2FfZ2VuX2VycigiUmVzb3VyY2UgaW4gdXNlLiByZXQ9JWxsaSAiLCByZXQpOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTczMyw3ICs3MzMsNyBAQAogCQkJICAgICBzdHJ1Y3QgZWhjYV9tcl9oaXB6b3V0X3Bhcm1zICpvdXRwYXJtcykKIHsKIAl1NjQgcmV0OwotCXU2NCBvdXRzW1BMUEFSX0hDQUxMOV9CVUZTSVpFXTsKKwl1bnNpZ25lZCBsb25nIG91dHNbUExQQVJfSENBTEw5X0JVRlNJWkVdOwogCiAJcmV0ID0gZWhjYV9wbHBhcl9oY2FsbDkoSF9BTExPQ19SRVNPVVJDRSwgb3V0cywKIAkJCQlhZGFwdGVyX2hhbmRsZS5oYW5kbGUsICAgICAgICAgICAgLyogcjQgKi8KQEAgLTc3NCw5ICs3NzQsOSBAQAogCiAJaWYgKChjb3VudCA+IDEpICYmIChsb2dpY2FsX2FkZHJlc3Nfb2ZfcGFnZSAmIChFSENBX1BBR0VTSVpFLTEpKSkgewogCQllaGNhX2dlbl9lcnIoImxvZ2ljYWxfYWRkcmVzc19vZl9wYWdlIG5vdCBvbiBhIDRrIGJvdW5kYXJ5ICIKLQkJCSAgICAgImFkYXB0ZXJfaGFuZGxlPSVseCBtcj0lcCBtcl9oYW5kbGU9JWx4ICIKKwkJCSAgICAgImFkYXB0ZXJfaGFuZGxlPSVsbHggbXI9JXAgbXJfaGFuZGxlPSVsbHggIgogCQkJICAgICAicGFnZXNpemU9JXggcXVldWVfdHlwZT0leCAiCi0JCQkgICAgICJsb2dpY2FsX2FkZHJlc3Nfb2ZfcGFnZT0lbHggY291bnQ9JWx4IiwKKwkJCSAgICAgImxvZ2ljYWxfYWRkcmVzc19vZl9wYWdlPSVsbHggY291bnQ9JWxseCIsCiAJCQkgICAgIGFkYXB0ZXJfaGFuZGxlLmhhbmRsZSwgbXIsCiAJCQkgICAgIG1yLT5pcHpfbXJfaGFuZGxlLmhhbmRsZSwgcGFnZXNpemUsIHF1ZXVlX3R5cGUsCiAJCQkgICAgIGxvZ2ljYWxfYWRkcmVzc19vZl9wYWdlLCBjb3VudCk7CkBAIC03OTQsNyArNzk0LDcgQEAKIAkJICAgIHN0cnVjdCBlaGNhX21yX2hpcHpvdXRfcGFybXMgKm91dHBhcm1zKQogewogCXU2NCByZXQ7Ci0JdTY0IG91dHNbUExQQVJfSENBTEw5X0JVRlNJWkVdOworCXVuc2lnbmVkIGxvbmcgb3V0c1tQTFBBUl9IQ0FMTDlfQlVGU0laRV07CiAKIAlyZXQgPSBlaGNhX3BscGFyX2hjYWxsOShIX1FVRVJZX01SLCBvdXRzLAogCQkJCWFkYXB0ZXJfaGFuZGxlLmhhbmRsZSwgICAgIC8qIHI0ICovCkBAIC04MjgsNyArODI4LDcgQEAKIAkJCSAgc3RydWN0IGVoY2FfbXJfaGlwem91dF9wYXJtcyAqb3V0cGFybXMpCiB7CiAJdTY0IHJldDsKLQl1NjQgb3V0c1tQTFBBUl9IQ0FMTDlfQlVGU0laRV07CisJdW5zaWduZWQgbG9uZyBvdXRzW1BMUEFSX0hDQUxMOV9CVUZTSVpFXTsKIAogCXJldCA9IGVoY2FfcGxwYXJfaGNhbGw5KEhfUkVSRUdJU1RFUl9QTVIsIG91dHMsCiAJCQkJYWRhcHRlcl9oYW5kbGUuaGFuZGxlLCAgICAvKiByNCAqLwpAQCAtODU1LDcgKzg1NSw3IEBACiAJCQlzdHJ1Y3QgZWhjYV9tcl9oaXB6b3V0X3Bhcm1zICpvdXRwYXJtcykKIHsKIAl1NjQgcmV0OwotCXU2NCBvdXRzW1BMUEFSX0hDQUxMOV9CVUZTSVpFXTsKKwl1bnNpZ25lZCBsb25nIG91dHNbUExQQVJfSENBTEw5X0JVRlNJWkVdOwogCiAJcmV0ID0gZWhjYV9wbHBhcl9oY2FsbDkoSF9SRUdJU1RFUl9TTVIsIG91dHMsCiAJCQkJYWRhcHRlcl9oYW5kbGUuaGFuZGxlLCAgICAgICAgICAgIC8qIHI0ICovCkBAIC04NzcsNyArODc3LDcgQEAKIAkJCSAgICAgc3RydWN0IGVoY2FfbXdfaGlwem91dF9wYXJtcyAqb3V0cGFybXMpCiB7CiAJdTY0IHJldDsKLQl1NjQgb3V0c1tQTFBBUl9IQ0FMTDlfQlVGU0laRV07CisJdW5zaWduZWQgbG9uZyBvdXRzW1BMUEFSX0hDQUxMOV9CVUZTSVpFXTsKIAogCXJldCA9IGVoY2FfcGxwYXJfaGNhbGw5KEhfQUxMT0NfUkVTT1VSQ0UsIG91dHMsCiAJCQkJYWRhcHRlcl9oYW5kbGUuaGFuZGxlLCAgICAgIC8qIHI0ICovCkBAIC04OTUsNyArODk1LDcgQEAKIAkJICAgIHN0cnVjdCBlaGNhX213X2hpcHpvdXRfcGFybXMgKm91dHBhcm1zKQogewogCXU2NCByZXQ7Ci0JdTY0IG91dHNbUExQQVJfSENBTEw5X0JVRlNJWkVdOworCXVuc2lnbmVkIGxvbmcgb3V0c1tQTFBBUl9IQ0FMTDlfQlVGU0laRV07CiAKIAlyZXQgPSBlaGNhX3BscGFyX2hjYWxsOShIX1FVRVJZX01XLCBvdXRzLAogCQkJCWFkYXB0ZXJfaGFuZGxlLmhhbmRsZSwgICAgLyogcjQgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tbHg0L2NxLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbWx4NC9jcS5jCmluZGV4IGEzYzVhZjFkLi5kZTUyNjNiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbWx4NC9jcS5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tbHg0L2NxLmMKQEAgLTM2Nyw3ICszNjcsNyBAQAogCQlpZiAoZXJyKQogCQkJZ290byBvdXQ7CiAJfSBlbHNlIHsKLQkJLyogQ2FuJ3QgYmUgc21hbGxlciB0aGVuIHRoZSBudW1iZXIgb2Ygb3V0c3RhbmRpbmcgQ1FFcyAqLworCQkvKiBDYW4ndCBiZSBzbWFsbGVyIHRoYW4gdGhlIG51bWJlciBvZiBvdXRzdGFuZGluZyBDUUVzICovCiAJCW91dHN0X2NxZSA9IG1seDRfaWJfZ2V0X291dHN0YW5kaW5nX2NxZXMoY3EpOwogCQlpZiAoZW50cmllcyA8IG91dHN0X2NxZSArIDEpIHsKIAkJCWVyciA9IDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbWx4NC9tYWluLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbWx4NC9tYWluLmMKaW5kZXggZGNlZmUxZi4uNjE1ODhiZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L21seDQvbWFpbi5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tbHg0L21haW4uYwpAQCAtNTQzLDE0ICs1NDMsMjEgQEAKIHsKIAlzdGF0aWMgaW50IG1seDRfaWJfdmVyc2lvbl9wcmludGVkOwogCXN0cnVjdCBtbHg0X2liX2RldiAqaWJkZXY7CisJaW50IG51bV9wb3J0cyA9IDA7CiAJaW50IGk7CiAKLQogCWlmICghbWx4NF9pYl92ZXJzaW9uX3ByaW50ZWQpIHsKIAkJcHJpbnRrKEtFUk5fSU5GTyAiJXMiLCBtbHg0X2liX3ZlcnNpb24pOwogCQkrK21seDRfaWJfdmVyc2lvbl9wcmludGVkOwogCX0KIAorCW1seDRfZm9yZWFjaF9wb3J0KGksIGRldiwgTUxYNF9QT1JUX1RZUEVfSUIpCisJCW51bV9wb3J0cysrOworCisJLyogTm8gcG9pbnQgaW4gcmVnaXN0ZXJpbmcgYSBkZXZpY2Ugd2l0aCBubyBwb3J0cy4uLiAqLworCWlmIChudW1fcG9ydHMgPT0gMCkKKwkJcmV0dXJuIE5VTEw7CisKIAlpYmRldiA9IChzdHJ1Y3QgbWx4NF9pYl9kZXYgKikgaWJfYWxsb2NfZGV2aWNlKHNpemVvZiAqaWJkZXYpOwogCWlmICghaWJkZXYpIHsKIAkJZGV2X2VycigmZGV2LT5wZGV2LT5kZXYsICJEZXZpY2Ugc3RydWN0IGFsbG9jIGZhaWxlZFxuIik7CkBAIC01NzQsOSArNTgxLDcgQEAKIAlpYmRldi0+aWJfZGV2Lm93bmVyCQk9IFRISVNfTU9EVUxFOwogCWliZGV2LT5pYl9kZXYubm9kZV90eXBlCQk9IFJETUFfTk9ERV9JQl9DQTsKIAlpYmRldi0+aWJfZGV2LmxvY2FsX2RtYV9sa2V5CT0gZGV2LT5jYXBzLnJlc2VydmVkX2xrZXk7Ci0JaWJkZXYtPm51bV9wb3J0cyA9IDA7Ci0JbWx4NF9mb3JlYWNoX3BvcnQoaSwgZGV2LCBNTFg0X1BPUlRfVFlQRV9JQikKLQkJaWJkZXYtPm51bV9wb3J0cysrOworCWliZGV2LT5udW1fcG9ydHMJCT0gbnVtX3BvcnRzOwogCWliZGV2LT5pYl9kZXYucGh5c19wb3J0X2NudCAgICAgPSBpYmRldi0+bnVtX3BvcnRzOwogCWliZGV2LT5pYl9kZXYubnVtX2NvbXBfdmVjdG9ycwk9IGRldi0+Y2Fwcy5udW1fY29tcF92ZWN0b3JzOwogCWliZGV2LT5pYl9kZXYuZG1hX2RldmljZQk9ICZkZXYtPnBkZXYtPmRldjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tbHg0L3FwLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbWx4NC9xcC5jCmluZGV4IDM5MTY3YTcuLmE5MWNiNGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tbHg0L3FwLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L21seDQvcXAuYwpAQCAtMTQ2Miw3ICsxNDYyLDggQEAKIH0KIAogc3RhdGljIGludCBidWlsZF9sc29fc2VnKHN0cnVjdCBtbHg0X3dxZV9sc29fc2VnICp3cWUsIHN0cnVjdCBpYl9zZW5kX3dyICp3ciwKLQkJCSBzdHJ1Y3QgbWx4NF9pYl9xcCAqcXAsIHVuc2lnbmVkICpsc29fc2VnX2xlbikKKwkJCSBzdHJ1Y3QgbWx4NF9pYl9xcCAqcXAsIHVuc2lnbmVkICpsc29fc2VnX2xlbiwKKwkJCSBfX2JlMzIgKmxzb19oZHJfc3opCiB7CiAJdW5zaWduZWQgaGFsaWduID0gQUxJR04oc2l6ZW9mICp3cWUgKyB3ci0+d3IudWQuaGxlbiwgMTYpOwogCkBAIC0xNDc5LDEyICsxNDgwLDggQEAKIAogCW1lbWNweSh3cWUtPmhlYWRlciwgd3ItPndyLnVkLmhlYWRlciwgd3ItPndyLnVkLmhsZW4pOwogCi0JLyogbWFrZSBzdXJlIExTTyBoZWFkZXIgaXMgd3JpdHRlbiBiZWZvcmUgb3ZlcndyaXRpbmcgc3RhbXBpbmcgKi8KLQl3bWIoKTsKLQotCXdxZS0+bXNzX2hkcl9zaXplID0gY3B1X3RvX2JlMzIoKHdyLT53ci51ZC5tc3MgLSB3ci0+d3IudWQuaGxlbikgPDwgMTYgfAotCQkJCQl3ci0+d3IudWQuaGxlbik7Ci0KKwkqbHNvX2hkcl9zeiAgPSBjcHVfdG9fYmUzMigod3ItPndyLnVkLm1zcyAtIHdyLT53ci51ZC5obGVuKSA8PCAxNiB8CisJCQkJICAgd3ItPndyLnVkLmhsZW4pOwogCSpsc29fc2VnX2xlbiA9IGhhbGlnbjsKIAlyZXR1cm4gMDsKIH0KQEAgLTE1MTgsNiArMTUxNSw5IEBACiAJaW50IHVuaW5pdGlhbGl6ZWRfdmFyKHN0YW1wKTsKIAlpbnQgdW5pbml0aWFsaXplZF92YXIoc2l6ZSk7CiAJdW5zaWduZWQgdW5pbml0aWFsaXplZF92YXIoc2VnbGVuKTsKKwlfX2JlMzIgZHVtbXk7CisJX19iZTMyICpsc29fd3FlOworCV9fYmUzMiB1bmluaXRpYWxpemVkX3Zhcihsc29faGRyX3N6KTsKIAlpbnQgaTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZxcC0+c3EubG9jaywgZmxhZ3MpOwpAQCAtMTUyNSw2ICsxNTI1LDggQEAKIAlpbmQgPSBxcC0+c3FfbmV4dF93cWU7CiAKIAlmb3IgKG5yZXEgPSAwOyB3cjsgKytucmVxLCB3ciA9IHdyLT5uZXh0KSB7CisJCWxzb193cWUgPSAmZHVtbXk7CisKIAkJaWYgKG1seDRfd3Ffb3ZlcmZsb3coJnFwLT5zcSwgbnJlcSwgcXAtPmlicXAuc2VuZF9jcSkpIHsKIAkJCWVyciA9IC1FTk9NRU07CiAJCQkqYmFkX3dyID0gd3I7CkBAIC0xNjA2LDExICsxNjA4LDEyIEBACiAJCQlzaXplICs9IHNpemVvZiAoc3RydWN0IG1seDRfd3FlX2RhdGFncmFtX3NlZykgLyAxNjsKIAogCQkJaWYgKHdyLT5vcGNvZGUgPT0gSUJfV1JfTFNPKSB7Ci0JCQkJZXJyID0gYnVpbGRfbHNvX3NlZyh3cWUsIHdyLCBxcCwgJnNlZ2xlbik7CisJCQkJZXJyID0gYnVpbGRfbHNvX3NlZyh3cWUsIHdyLCBxcCwgJnNlZ2xlbiwgJmxzb19oZHJfc3opOwogCQkJCWlmICh1bmxpa2VseShlcnIpKSB7CiAJCQkJCSpiYWRfd3IgPSB3cjsKIAkJCQkJZ290byBvdXQ7CiAJCQkJfQorCQkJCWxzb193cWUgPSAoX19iZTMyICopIHdxZTsKIAkJCQl3cWUgICs9IHNlZ2xlbjsKIAkJCQlzaXplICs9IHNlZ2xlbiAvIDE2OwogCQkJfQpAQCAtMTY1Miw2ICsxNjU1LDE0IEBACiAJCWZvciAoaSA9IHdyLT5udW1fc2dlIC0gMTsgaSA+PSAwOyAtLWksIC0tZHNlZykKIAkJCXNldF9kYXRhX3NlZyhkc2VnLCB3ci0+c2dfbGlzdCArIGkpOwogCisJCS8qCisJCSAqIFBvc3NpYmx5IG92ZXJ3cml0ZSBzdGFtcGluZyBpbiBjYWNoZWxpbmUgd2l0aCBMU08KKwkJICogc2VnbWVudCBvbmx5IGFmdGVyIG1ha2luZyBzdXJlIGFsbCBkYXRhIHNlZ21lbnRzCisJCSAqIGFyZSB3cml0dGVuLgorCQkgKi8KKwkJd21iKCk7CisJCSpsc29fd3FlID0gbHNvX2hkcl9zejsKKwogCQljdHJsLT5mZW5jZV9zaXplID0gKHdyLT5zZW5kX2ZsYWdzICYgSUJfU0VORF9GRU5DRSA/CiAJCQkJICAgIE1MWDRfV1FFX0NUUkxfRkVOQ0UgOiAwKSB8IHNpemU7CiAKQEAgLTE2ODYsNyArMTY5Nyw2IEBACiAJCQlzdGFtcF9zZW5kX3dxZShxcCwgc3RhbXAsIHNpemUgKiAxNik7CiAJCQlpbmQgPSBwYWRfd3JhcGFyb3VuZChxcCwgaW5kKTsKIAkJfQotCiAJfQogCiBvdXQ6CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbmVzL25lc19jbS5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L25lcy9uZXNfY20uYwppbmRleCBhODEyZGIyLi5hMDFiNDQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbmVzL25lc19jbS5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9uZXMvbmVzX2NtLmMKQEAgLTc3OCwxMiArNzc4LDEzIEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzdHJ1Y3QgbGlzdF9oZWFkICpodGU7CiAJc3RydWN0IG5lc19jbV9ub2RlICpjbV9ub2RlOworCV9fYmUzMiB0bXBfYWRkciA9IGNwdV90b19iZTMyKGxvY19hZGRyKTsKIAogCS8qIGdldCBhIGhhbmRsZSBvbiB0aGUgaHRlICovCiAJaHRlID0gJmNtX2NvcmUtPmNvbm5lY3RlZF9ub2RlczsKIAogCW5lc19kZWJ1ZyhORVNfREJHX0NNLCAiU2VhcmNoaW5nIGZvciBhbiBvd25lciBub2RlOiAlcEk0OiV4IGZyb20gY29yZSAlcC0+JXBcbiIsCi0JCSAgJmxvY19hZGRyLCBsb2NfcG9ydCwgY21fY29yZSwgaHRlKTsKKwkJICAmdG1wX2FkZHIsIGxvY19wb3J0LCBjbV9jb3JlLCBodGUpOwogCiAJLyogd2FsayBsaXN0IGFuZCBmaW5kIGNtX25vZGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgc2Vzc2lvbiBJRCAqLwogCXNwaW5fbG9ja19pcnFzYXZlKCZjbV9jb3JlLT5odF9sb2NrLCBmbGFncyk7CkBAIC04MTYsNiArODE3LDcgQEAKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXN0cnVjdCBuZXNfY21fbGlzdGVuZXIgKmxpc3Rlbl9ub2RlOworCV9fYmUzMiB0bXBfYWRkciA9IGNwdV90b19iZTMyKGRzdF9hZGRyKTsKIAogCS8qIHdhbGsgbGlzdCBhbmQgZmluZCBjbV9ub2RlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHNlc3Npb24gSUQgKi8KIAlzcGluX2xvY2tfaXJxc2F2ZSgmY21fY29yZS0+bGlzdGVuX2xpc3RfbG9jaywgZmxhZ3MpOwpAQCAtODMzLDcgKzgzNSw3IEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY21fY29yZS0+bGlzdGVuX2xpc3RfbG9jaywgZmxhZ3MpOwogCiAJbmVzX2RlYnVnKE5FU19EQkdfQ00sICJVbmFibGUgdG8gZmluZCBsaXN0ZW5lciBmb3IgJXBJNDoleFxuIiwKLQkJICAmZHN0X2FkZHIsIGRzdF9wb3J0KTsKKwkJICAmdG1wX2FkZHIsIGRzdF9wb3J0KTsKIAogCS8qIG5vIGxpc3RlbmVyICovCiAJcmV0dXJuIE5VTEw7CkBAIC0yMDU5LDYgKzIwNjEsNyBAQAogCXN0cnVjdCB0Y3BoZHIgKnRjcGg7CiAJc3RydWN0IG5lc19jbV9pbmZvIG5mbzsKIAlpbnQgc2tiX2hhbmRsZWQgPSAxOworCV9fYmUzMiB0bXBfZGFkZHIsIHRtcF9zYWRkcjsKIAogCWlmICghc2tiKQogCQlyZXR1cm4gMDsKQEAgLTIwNzQsOCArMjA3NywxMSBAQAogCW5mby5yZW1fYWRkciA9IG50b2hsKGlwaC0+c2FkZHIpOwogCW5mby5yZW1fcG9ydCA9IG50b2hzKHRjcGgtPnNvdXJjZSk7CiAKKwl0bXBfZGFkZHIgPSBjcHVfdG9fYmUzMihpcGgtPmRhZGRyKTsKKwl0bXBfc2FkZHIgPSBjcHVfdG9fYmUzMihpcGgtPnNhZGRyKTsKKwogCW5lc19kZWJ1ZyhORVNfREJHX0NNLCAiUmVjZWl2ZWQgcGFja2V0OiBkZXN0PSVwSTQ6MHglMDRYIHNyYz0lcEk0OjB4JTA0WFxuIiwKLQkJICAmaXBoLT5kYWRkciwgdGNwaC0+ZGVzdCwgJmlwaC0+c2FkZHIsIHRjcGgtPnNvdXJjZSk7CisJCSAgJnRtcF9kYWRkciwgdGNwaC0+ZGVzdCwgJnRtcF9zYWRkciwgdGNwaC0+c291cmNlKTsKIAogCWRvIHsKIAkJY21fbm9kZSA9IGZpbmRfbm9kZShjbV9jb3JlLApAQCAtMjcwNSw3ICsyNzExLDcgQEAKIAkJCXNpemVvZihzdHJ1Y3QgaWV0Zl9tcGFfZnJhbWUpKTsKIAogCi0JLyogbm90aWZ5IE9GIGxheWVyIHRoYXQgYWNjZXB0IGV2ZW50IHdhcyBzdWNjZXNzZnVsbCAqLworCS8qIG5vdGlmeSBPRiBsYXllciB0aGF0IGFjY2VwdCBldmVudCB3YXMgc3VjY2Vzc2Z1bCAqLwogCWNtX2lkLT5hZGRfcmVmKGNtX2lkKTsKIAogCWNtX2V2ZW50LmV2ZW50ID0gSVdfQ01fRVZFTlRfRVNUQUJMSVNIRUQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbmVzL25lc191dGlscy5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L25lcy9uZXNfdXRpbHMuYwppbmRleCBhYTliNzM0Li42ZjNiYzFiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbmVzL25lc191dGlscy5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9uZXMvbmVzX3V0aWxzLmMKQEAgLTY1NSw2ICs2NTUsNyBAQAogCXN0cnVjdCBuZXNfYWRhcHRlciAqbmVzYWRhcHRlciA9IG5lc2Rldi0+bmVzYWRhcHRlcjsKIAlpbnQgYXJwX2luZGV4OwogCWludCBlcnIgPSAwOworCV9fYmUzMiB0bXBfYWRkcjsKIAogCWZvciAoYXJwX2luZGV4ID0gMDsgKHUzMikgYXJwX2luZGV4IDwgbmVzYWRhcHRlci0+YXJwX3RhYmxlX3NpemU7IGFycF9pbmRleCsrKSB7CiAJCWlmIChuZXNhZGFwdGVyLT5hcnBfdGFibGVbYXJwX2luZGV4XS5pcF9hZGRyID09IGlwX2FkZHIpCkBAIC02ODIsOCArNjgzLDkgQEAKIAogCS8qIERFTEVURSBvciBSRVNPTFZFICovCiAJaWYgKGFycF9pbmRleCA9PSBuZXNhZGFwdGVyLT5hcnBfdGFibGVfc2l6ZSkgeworCQl0bXBfYWRkciA9IGNwdV90b19iZTMyKGlwX2FkZHIpOwogCQluZXNfZGVidWcoTkVTX0RCR19ORVRERVYsICJNQUMgZm9yICVwSTQgbm90IGluIEFSUCB0YWJsZSAtIGNhbm5vdCAlc1xuIiwKLQkJCSAgJmlwX2FkZHIsIGFjdGlvbiA9PSBORVNfQVJQX1JFU09MVkUgPyAicmVzb2x2ZSIgOiAiZGVsZXRlIik7CisJCQkgICZ0bXBfYWRkciwgYWN0aW9uID09IE5FU19BUlBfUkVTT0xWRSA/ICJyZXNvbHZlIiA6ICJkZWxldGUiKTsKIAkJcmV0dXJuIC0xOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pcG9pYi9pcG9pYl9tYWluLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lwb2liL2lwb2liX21haW4uYwppbmRleCAxOWUwNmJjLi4wYmQyYTRmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lwb2liL2lwb2liX21haW4uYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lwb2liL2lwb2liX21haW4uYwpAQCAtMTA2LDIzICsxMDYsMTcgQEAKIAogCWlwb2liX2RiZyhwcml2LCAiYnJpbmdpbmcgdXAgaW50ZXJmYWNlXG4iKTsKIAotCXNldF9iaXQoSVBPSUJfRkxBR19BRE1JTl9VUCwgJnByaXYtPmZsYWdzKTsKKwlpZiAoIXRlc3RfYW5kX3NldF9iaXQoSVBPSUJfRkxBR19BRE1JTl9VUCwgJnByaXYtPmZsYWdzKSkKKwkJbmFwaV9lbmFibGUoJnByaXYtPm5hcGkpOwogCiAJaWYgKGlwb2liX3BrZXlfZGV2X2RlbGF5X29wZW4oZGV2KSkKIAkJcmV0dXJuIDA7CiAKLQluYXBpX2VuYWJsZSgmcHJpdi0+bmFwaSk7CisJaWYgKGlwb2liX2liX2Rldl9vcGVuKGRldikpCisJCWdvdG8gZXJyX2Rpc2FibGU7CiAKLQlpZiAoaXBvaWJfaWJfZGV2X29wZW4oZGV2KSkgewotCQluYXBpX2Rpc2FibGUoJnByaXYtPm5hcGkpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlpZiAoaXBvaWJfaWJfZGV2X3VwKGRldikpIHsKLQkJaXBvaWJfaWJfZGV2X3N0b3AoZGV2LCAxKTsKLQkJbmFwaV9kaXNhYmxlKCZwcml2LT5uYXBpKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQorCWlmIChpcG9pYl9pYl9kZXZfdXAoZGV2KSkKKwkJZ290byBlcnJfc3RvcDsKIAogCWlmICghdGVzdF9iaXQoSVBPSUJfRkxBR19TVUJJTlRFUkZBQ0UsICZwcml2LT5mbGFncykpIHsKIAkJc3RydWN0IGlwb2liX2Rldl9wcml2ICpjcHJpdjsKQEAgLTE0NCw2ICsxMzgsMTUgQEAKIAluZXRpZl9zdGFydF9xdWV1ZShkZXYpOwogCiAJcmV0dXJuIDA7CisKK2Vycl9zdG9wOgorCWlwb2liX2liX2Rldl9zdG9wKGRldiwgMSk7CisKK2Vycl9kaXNhYmxlOgorCW5hcGlfZGlzYWJsZSgmcHJpdi0+bmFwaSk7CisJY2xlYXJfYml0KElQT0lCX0ZMQUdfQURNSU5fVVAsICZwcml2LT5mbGFncyk7CisKKwlyZXR1cm4gLUVJTlZBTDsKIH0KIAogc3RhdGljIGludCBpcG9pYl9zdG9wKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCkBAIC03MTEsMjYgKzcxNCwyNiBAQAogCiAJCW5laWdoID0gKnRvX2lwb2liX25laWdoKHNrYi0+ZHN0LT5uZWlnaGJvdXIpOwogCi0JCWlmIChuZWlnaC0+YWgpCi0JCQlpZiAodW5saWtlbHkoKG1lbWNtcCgmbmVpZ2gtPmRnaWQucmF3LAotCQkJCQkgICAgc2tiLT5kc3QtPm5laWdoYm91ci0+aGEgKyA0LAotCQkJCQkgICAgc2l6ZW9mKHVuaW9uIGliX2dpZCkpKSB8fAotCQkJCQkgKG5laWdoLT5kZXYgIT0gZGV2KSkpIHsKLQkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwotCQkJCS8qCi0JCQkJICogSXQncyBzYWZlIHRvIGNhbGwgaXBvaWJfcHV0X2FoKCkgaW5zaWRlCi0JCQkJICogcHJpdi0+bG9jayBoZXJlLCBiZWNhdXNlIHdlIGtub3cgdGhhdAotCQkJCSAqIHBhdGgtPmFoIHdpbGwgYWx3YXlzIGhvbGQgb25lIG1vcmUgcmVmZXJlbmNlLAotCQkJCSAqIHNvIGlwb2liX3B1dF9haCgpIHdpbGwgbmV2ZXIgZG8gbW9yZSB0aGFuCi0JCQkJICogZGVjcmVtZW50IHRoZSByZWYgY291bnQuCi0JCQkJICovCisJCWlmICh1bmxpa2VseSgobWVtY21wKCZuZWlnaC0+ZGdpZC5yYXcsCisJCQkJICAgICBza2ItPmRzdC0+bmVpZ2hib3VyLT5oYSArIDQsCisJCQkJICAgICBzaXplb2YodW5pb24gaWJfZ2lkKSkpIHx8CisJCQkgICAgIChuZWlnaC0+ZGV2ICE9IGRldikpKSB7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCQkJLyoKKwkJCSAqIEl0J3Mgc2FmZSB0byBjYWxsIGlwb2liX3B1dF9haCgpIGluc2lkZQorCQkJICogcHJpdi0+bG9jayBoZXJlLCBiZWNhdXNlIHdlIGtub3cgdGhhdAorCQkJICogcGF0aC0+YWggd2lsbCBhbHdheXMgaG9sZCBvbmUgbW9yZSByZWZlcmVuY2UsCisJCQkgKiBzbyBpcG9pYl9wdXRfYWgoKSB3aWxsIG5ldmVyIGRvIG1vcmUgdGhhbgorCQkJICogZGVjcmVtZW50IHRoZSByZWYgY291bnQuCisJCQkgKi8KKwkJCWlmIChuZWlnaC0+YWgpCiAJCQkJaXBvaWJfcHV0X2FoKG5laWdoLT5haCk7Ci0JCQkJbGlzdF9kZWwoJm5laWdoLT5saXN0KTsKLQkJCQlpcG9pYl9uZWlnaF9mcmVlKGRldiwgbmVpZ2gpOwotCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKLQkJCQlpcG9pYl9wYXRoX2xvb2t1cChza2IsIGRldik7Ci0JCQkJcmV0dXJuIE5FVERFVl9UWF9PSzsKLQkJCX0KKwkJCWxpc3RfZGVsKCZuZWlnaC0+bGlzdCk7CisJCQlpcG9pYl9uZWlnaF9mcmVlKGRldiwgbmVpZ2gpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCQkJaXBvaWJfcGF0aF9sb29rdXAoc2tiLCBkZXYpOworCQkJcmV0dXJuIE5FVERFVl9UWF9PSzsKKwkJfQogCiAJCWlmIChpcG9pYl9jbV9nZXQobmVpZ2gpKSB7CiAJCQlpZiAoaXBvaWJfY21fdXAobmVpZ2gpKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lwb2liL2lwb2liX211bHRpY2FzdC5jIGIvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pcG9pYi9pcG9pYl9tdWx0aWNhc3QuYwppbmRleCBhMmViM2I5Li40MjVlMzExIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lwb2liL2lwb2liX211bHRpY2FzdC5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXBvaWIvaXBvaWJfbXVsdGljYXN0LmMKQEAgLTQwOSw3ICs0MDksNyBAQAogCX0KIAogCWlmIChtY2FzdC0+bG9nY291bnQrKyA8IDIwKSB7Ci0JCWlmIChzdGF0dXMgPT0gLUVUSU1FRE9VVCkgeworCQlpZiAoc3RhdHVzID09IC1FVElNRURPVVQgfHwgc3RhdHVzID09IC1FQUdBSU4pIHsKIAkJCWlwb2liX2RiZ19tY2FzdChwcml2LCAibXVsdGljYXN0IGpvaW4gZmFpbGVkIGZvciAlcEk2LCBzdGF0dXMgJWRcbiIsCiAJCQkJCW1jYXN0LT5tY21lbWJlci5tZ2lkLnJhdywgc3RhdHVzKTsKIAkJfSBlbHNlIHsKQEAgLTUyOSw2ICs1MjksOSBAQAogCWlmICghcHJpdi0+YnJvYWRjYXN0KSB7CiAJCXN0cnVjdCBpcG9pYl9tY2FzdCAqYnJvYWRjYXN0OwogCisJCWlmICghdGVzdF9iaXQoSVBPSUJfRkxBR19BRE1JTl9VUCwgJnByaXYtPmZsYWdzKSkKKwkJCXJldHVybjsKKwogCQlicm9hZGNhc3QgPSBpcG9pYl9tY2FzdF9hbGxvYyhkZXYsIDEpOwogCQlpZiAoIWJyb2FkY2FzdCkgewogCQkJaXBvaWJfd2Fybihwcml2LCAiZmFpbGVkIHRvIGFsbG9jYXRlIGJyb2FkY2FzdCBncm91cFxuIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lwb2liL2lwb2liX3ZsYW4uYyBiL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXBvaWIvaXBvaWJfdmxhbi5jCmluZGV4IDJjZjFhNDAuLjVhNzZhNTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXBvaWIvaXBvaWJfdmxhbi5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXBvaWIvaXBvaWJfdmxhbi5jCkBAIC02MSw2ICs2MSw3IEBACiAKIAlwcHJpdiA9IG5ldGRldl9wcml2KHBkZXYpOwogCisJcnRubF9sb2NrKCk7CiAJbXV0ZXhfbG9jaygmcHByaXYtPnZsYW5fbXV0ZXgpOwogCiAJLyoKQEAgLTExMSw3ICsxMTIsNyBAQAogCQlnb3RvIGRldmljZV9pbml0X2ZhaWxlZDsKIAl9CiAKLQlyZXN1bHQgPSByZWdpc3Rlcl9uZXRkZXYocHJpdi0+ZGV2KTsKKwlyZXN1bHQgPSByZWdpc3Rlcl9uZXRkZXZpY2UocHJpdi0+ZGV2KTsKIAlpZiAocmVzdWx0KSB7CiAJCWlwb2liX3dhcm4ocHJpdiwgImZhaWxlZCB0byBpbml0aWFsaXplOyBlcnJvciAlaSIsIHJlc3VsdCk7CiAJCWdvdG8gcmVnaXN0ZXJfZmFpbGVkOwpAQCAtMTM0LDEyICsxMzUsMTMgQEAKIAlsaXN0X2FkZF90YWlsKCZwcml2LT5saXN0LCAmcHByaXYtPmNoaWxkX2ludGZzKTsKIAogCW11dGV4X3VubG9jaygmcHByaXYtPnZsYW5fbXV0ZXgpOworCXJ0bmxfdW5sb2NrKCk7CiAKIAlyZXR1cm4gMDsKIAogc3lzZnNfZmFpbGVkOgogCWlwb2liX2RlbGV0ZV9kZWJ1Z19maWxlcyhwcml2LT5kZXYpOwotCXVucmVnaXN0ZXJfbmV0ZGV2KHByaXYtPmRldik7CisJdW5yZWdpc3Rlcl9uZXRkZXZpY2UocHJpdi0+ZGV2KTsKIAogcmVnaXN0ZXJfZmFpbGVkOgogCWlwb2liX2Rldl9jbGVhbnVwKHByaXYtPmRldik7CkBAIC0xNDksNiArMTUxLDcgQEAKIAogZXJyOgogCW11dGV4X3VubG9jaygmcHByaXYtPnZsYW5fbXV0ZXgpOworCXJ0bmxfdW5sb2NrKCk7CiAJcmV0dXJuIHJlc3VsdDsKIH0KIApAQCAtMTYyLDEwICsxNjUsMTEgQEAKIAogCXBwcml2ID0gbmV0ZGV2X3ByaXYocGRldik7CiAKKwlydG5sX2xvY2soKTsKIAltdXRleF9sb2NrKCZwcHJpdi0+dmxhbl9tdXRleCk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHByaXYsIHRwcml2LCAmcHByaXYtPmNoaWxkX2ludGZzLCBsaXN0KSB7CiAJCWlmIChwcml2LT5wa2V5ID09IHBrZXkpIHsKLQkJCXVucmVnaXN0ZXJfbmV0ZGV2KHByaXYtPmRldik7CisJCQl1bnJlZ2lzdGVyX25ldGRldmljZShwcml2LT5kZXYpOwogCQkJaXBvaWJfZGV2X2NsZWFudXAocHJpdi0+ZGV2KTsKIAkJCWxpc3RfZGVsKCZwcml2LT5saXN0KTsKIAkJCWZyZWVfbmV0ZGV2KHByaXYtPmRldik7CkBAIC0xNzUsNiArMTc5LDcgQEAKIAkJfQogCX0KIAltdXRleF91bmxvY2soJnBwcml2LT52bGFuX211dGV4KTsKKwlydG5sX3VubG9jaygpOwogCiAJcmV0dXJuIHJldDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXNlci9LY29uZmlnIGIvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pc2VyL0tjb25maWcKaW5kZXggNzdkZWRiYS4uYjQxMWM1MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pc2VyL0tjb25maWcKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pc2VyL0tjb25maWcKQEAgLTEsNiArMSw2IEBACiBjb25maWcgSU5GSU5JQkFORF9JU0VSCiAJdHJpc3RhdGUgImlTQ1NJIEV4dGVuc2lvbnMgZm9yIFJETUEgKGlTRVIpIgotCWRlcGVuZHMgb24gU0NTSSAmJiBJTkVUCisJZGVwZW5kcyBvbiBTQ1NJICYmIElORVQgJiYgSU5GSU5JQkFORF9BRERSX1RSQU5TCiAJc2VsZWN0IFNDU0lfSVNDU0lfQVRUUlMKIAktLS1oZWxwLS0tCiAJICBTdXBwb3J0IGZvciB0aGUgaVNDU0kgRXh0ZW5zaW9ucyBmb3IgUkRNQSAoaVNFUikgUHJvdG9jb2wKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvYXRrYmQuYyBiL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvYXRrYmQuYwppbmRleCBmNmU5ZjM5Li5jM2M4YjliIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L2tleWJvYXJkL2F0a2JkLmMKKysrIGIvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9hdGtiZC5jCkBAIC02NSw3ICs2NSw3IEBACiAKIC8qCiAgKiBTY2FuY29kZSB0byBrZXljb2RlIHRhYmxlcy4gVGhlc2UgYXJlIGp1c3QgdGhlIGRlZmF1bHQgc2V0dGluZywgYW5kCi0gKiBhcmUgbG9hZGFibGUgdmlhIGFuIHVzZXJsYW5kIHV0aWxpdHkuCisgKiBhcmUgbG9hZGFibGUgdmlhIGEgdXNlcmxhbmQgdXRpbGl0eS4KICAqLwogCiBzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgYXRrYmRfc2V0Ml9rZXljb2RlWzUxMl0gPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L21pc2MvS2NvbmZpZyBiL2RyaXZlcnMvaW5wdXQvbWlzYy9LY29uZmlnCmluZGV4IDE5OTA1NWQuLjY3ZTU1NTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvbWlzYy9LY29uZmlnCisrKyBiL2RyaXZlcnMvaW5wdXQvbWlzYy9LY29uZmlnCkBAIC0yMjAsNCArMjIwLDExIEBACiAJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIHN1cHBvcnQgdGhlIGJ1aWx0LWluIHJlYWwgdGltZSBjbG9jawogCSAgb2YgdGhlIEhQIFNEQyBjb250cm9sbGVyLgogCitjb25maWcgSU5QVVRfUENGNTA2MzNfUE1VCisJdHJpc3RhdGUgIlBDRjUwNjMzIFBNVSBldmVudHMiCisJZGVwZW5kcyBvbiBNRkRfUENGNTA2MzMKKwloZWxwCisJIFNheSBZIHRvIGluY2x1ZGUgc3VwcG9ydCBmb3IgZGVsaXZlcmluZyAgUE1VIGV2ZW50cyB2aWEgIGlucHV0CisJIGxheWVyIG9uIE5YUCBQQ0Y1MDYzMy4KKwogZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvbWlzYy9NYWtlZmlsZSBiL2RyaXZlcnMvaW5wdXQvbWlzYy9NYWtlZmlsZQppbmRleCBkN2RiMmFlLi5iYjYyZTZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L21pc2MvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9pbnB1dC9taXNjL01ha2VmaWxlCkBAIC0yMSwzICsyMSw0IEBACiBvYmotJChDT05GSUdfSU5QVVRfVUlOUFVUKQkJKz0gdWlucHV0Lm8KIG9iai0kKENPTkZJR19JTlBVVF9BUEFORUwpCQkrPSBhcGFuZWwubwogb2JqLSQoQ09ORklHX0lOUFVUX1NHSV9CVE5TKQkJKz0gc2dpX2J0bnMubworb2JqLSQoQ09ORklHX0lOUFVUX1BDRjUwNjMzX1BNVSkJKz0gcGNmNTA2MzMtaW5wdXQubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9taXNjL2FwYW5lbC5jIGIvZHJpdmVycy9pbnB1dC9taXNjL2FwYW5lbC5jCmluZGV4IGQ4MmY3ZjcuLjcxYjgyNDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvbWlzYy9hcGFuZWwuYworKysgYi9kcml2ZXJzL2lucHV0L21pc2MvYXBhbmVsLmMKQEAgLTU3LDcgKzU3LDcgQEAKIAogc3RydWN0IGFwYW5lbCB7CiAJc3RydWN0IGlucHV0X3BvbGxlZF9kZXYgKmlwZGV2OwotCXN0cnVjdCBpMmNfY2xpZW50IGNsaWVudDsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50OwogCXVuc2lnbmVkIHNob3J0IGtleW1hcFtNQVhfUEFORUxfS0VZU107CiAJdTE2ICAgIG5rZXlzOwogCXUxNiAgICBsZWRfYml0czsKQEAgLTY2LDE2ICs2Niw3IEBACiB9OwogCiAKLXN0YXRpYyBpbnQgYXBhbmVsX3Byb2JlKHN0cnVjdCBpMmNfYWRhcHRlciAqLCBpbnQsIGludCk7Ci0KLS8qIGZvciBub3csIHdlIG9ubHkgc3VwcG9ydCBvbmUgYWRkcmVzcyAqLwotc3RhdGljIHVuc2lnbmVkIHNob3J0IG5vcm1hbF9pMmNbXSA9IHswLCBJMkNfQ0xJRU5UX0VORH07Ci1zdGF0aWMgdW5zaWduZWQgc2hvcnQgaWdub3JlID0gSTJDX0NMSUVOVF9FTkQ7Ci1zdGF0aWMgc3RydWN0IGkyY19jbGllbnRfYWRkcmVzc19kYXRhIGFkZHJfZGF0YSA9IHsKLQkubm9ybWFsX2kyYwk9IG5vcm1hbF9pMmMsCi0JLnByb2JlCQk9ICZpZ25vcmUsCi0JLmlnbm9yZQkJPSAmaWdub3JlLAotfTsKK3N0YXRpYyBpbnQgYXBhbmVsX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICosIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICopOwogCiBzdGF0aWMgdm9pZCByZXBvcnRfa2V5KHN0cnVjdCBpbnB1dF9kZXYgKmlucHV0LCB1bnNpZ25lZCBrZXljb2RlKQogewpAQCAtMTAzLDEyICs5NCwxMiBAQAogCXMzMiBkYXRhOwogCWludCBpOwogCi0JZGF0YSA9IGkyY19zbWJ1c19yZWFkX3dvcmRfZGF0YSgmYXAtPmNsaWVudCwgY21kKTsKKwlkYXRhID0gaTJjX3NtYnVzX3JlYWRfd29yZF9kYXRhKGFwLT5jbGllbnQsIGNtZCk7CiAJaWYgKGRhdGEgPCAwKQogCQlyZXR1cm47CS8qIGlnbm9yZSBlcnJvcnMgKGR1ZSB0byBBQ1BJPz8pICovCiAKIAkvKiB3cml0ZSBiYWNrIHRvIGNsZWFyIGxhdGNoICovCi0JaTJjX3NtYnVzX3dyaXRlX3dvcmRfZGF0YSgmYXAtPmNsaWVudCwgY21kLCAwKTsKKwlpMmNfc21idXNfd3JpdGVfd29yZF9kYXRhKGFwLT5jbGllbnQsIGNtZCwgMCk7CiAKIAlpZiAoIWRhdGEpCiAJCXJldHVybjsKQEAgLTEyNCw3ICsxMTUsNyBAQAogewogCXN0cnVjdCBhcGFuZWwgKmFwID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBhcGFuZWwsIGxlZF93b3JrKTsKIAotCWkyY19zbWJ1c193cml0ZV93b3JkX2RhdGEoJmFwLT5jbGllbnQsIDB4MTAsIGFwLT5sZWRfYml0cyk7CisJaTJjX3NtYnVzX3dyaXRlX3dvcmRfZGF0YShhcC0+Y2xpZW50LCAweDEwLCBhcC0+bGVkX2JpdHMpOwogfQogCiBzdGF0aWMgdm9pZCBtYWlsX2xlZF9zZXQoc3RydWN0IGxlZF9jbGFzc2RldiAqbGVkLApAQCAtMTQwLDcgKzEzMSw3IEBACiAJc2NoZWR1bGVfd29yaygmYXAtPmxlZF93b3JrKTsKIH0KIAotc3RhdGljIGludCBhcGFuZWxfZGV0YWNoX2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQorc3RhdGljIGludCBhcGFuZWxfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCiB7CiAJc3RydWN0IGFwYW5lbCAqYXAgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKIApAQCAtMTQ4LDQzICsxMzksMzMgQEAKIAkJbGVkX2NsYXNzZGV2X3VucmVnaXN0ZXIoJmFwLT5tYWlsX2xlZCk7CiAKIAlpbnB1dF91bnJlZ2lzdGVyX3BvbGxlZF9kZXZpY2UoYXAtPmlwZGV2KTsKLQlpMmNfZGV0YWNoX2NsaWVudCgmYXAtPmNsaWVudCk7CiAJaW5wdXRfZnJlZV9wb2xsZWRfZGV2aWNlKGFwLT5pcGRldik7CiAKIAlyZXR1cm4gMDsKIH0KIAotLyogRnVuY3Rpb24gaXMgaW52b2tlZCBmb3IgZXZlcnkgaTJjIGFkYXB0ZXIuICovCi1zdGF0aWMgaW50IGFwYW5lbF9hdHRhY2hfYWRhcHRlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXApCi17Ci0JZGV2X2RiZygmYWRhcC0+ZGV2LCBBUEFORUwgIjogYXR0YWNoIGFkYXB0ZXIgaWQ9JWRcbiIsIGFkYXAtPmlkKTsKLQotCS8qIE91ciBkZXZpY2UgaXMgY29ubmVjdGVkIG9ubHkgdG8gaTgwMSBvbiBsYXB0b3AgKi8KLQlpZiAoYWRhcC0+aWQgIT0gSTJDX0hXX1NNQlVTX0k4MDEpCi0JCXJldHVybiAtRU5PREVWOwotCi0JcmV0dXJuIGkyY19wcm9iZShhZGFwLCAmYWRkcl9kYXRhLCBhcGFuZWxfcHJvYmUpOwotfQotCiBzdGF0aWMgdm9pZCBhcGFuZWxfc2h1dGRvd24oc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKIHsKLQlhcGFuZWxfZGV0YWNoX2NsaWVudChjbGllbnQpOworCWFwYW5lbF9yZW1vdmUoY2xpZW50KTsKIH0KIAorc3RhdGljIHN0cnVjdCBpMmNfZGV2aWNlX2lkIGFwYW5lbF9pZFtdID0geworCXsgImZ1aml0c3VfYXBhbmVsIiwgMCB9LAorCXsgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCBhcGFuZWxfaWQpOworCiBzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgYXBhbmVsX2RyaXZlciA9IHsKIAkuZHJpdmVyID0gewogCQkubmFtZSA9IEFQQU5FTCwKIAl9LAotCS5hdHRhY2hfYWRhcHRlciA9ICZhcGFuZWxfYXR0YWNoX2FkYXB0ZXIsCi0JLmRldGFjaF9jbGllbnQgID0gJmFwYW5lbF9kZXRhY2hfY2xpZW50LAorCS5wcm9iZQkJPSAmYXBhbmVsX3Byb2JlLAorCS5yZW1vdmUJCT0gJmFwYW5lbF9yZW1vdmUsCiAJLnNodXRkb3duCT0gJmFwYW5lbF9zaHV0ZG93biwKKwkuaWRfdGFibGUJPSBhcGFuZWxfaWQsCiB9OwogCiBzdGF0aWMgc3RydWN0IGFwYW5lbCBhcGFuZWwgPSB7Ci0JLmNsaWVudCA9IHsKLQkJLmRyaXZlciA9ICZhcGFuZWxfZHJpdmVyLAotCQkubmFtZSAgID0gQVBBTkVMLAotCX0sCiAJLmtleW1hcCA9IHsKIAkJWzBdID0gS0VZX01BSUwsCiAJCVsxXSA9IEtFWV9XV1csCkBAIC0yMDQsNyArMTg1LDggQEAKIH07CiAKIC8qIE5COiBPbmx5IG9uZSBwYW5lbCBvbiB0aGUgaTJjLiAqLwotc3RhdGljIGludCBhcGFuZWxfcHJvYmUoc3RydWN0IGkyY19hZGFwdGVyICpidXMsIGludCBhZGRyZXNzLCBpbnQga2luZCkKK3N0YXRpYyBpbnQgYXBhbmVsX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJCQljb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCiB7CiAJc3RydWN0IGFwYW5lbCAqYXA7CiAJc3RydWN0IGlucHV0X3BvbGxlZF9kZXYgKmlwZGV2OwpAQCAtMjEyLDkgKzE5NCw2IEBACiAJdTggY21kID0gZGV2aWNlX2NoaXBbQVBBTkVMX0RFVl9BUFBCVE5dID09IENISVBfT1o5OTJDID8gMCA6IDg7CiAJaW50IGksIGVyciA9IC1FTk9NRU07CiAKLQlkZXZfZGJnKCZidXMtPmRldiwgQVBBTkVMICI6IHByb2JlIGFkYXB0ZXIgJXAgYWRkciAlZCBraW5kICVkXG4iLAotCQlidXMsIGFkZHJlc3MsIGtpbmQpOwotCiAJYXAgPSAmYXBhbmVsOwogCiAJaXBkZXYgPSBpbnB1dF9hbGxvY2F0ZV9wb2xsZWRfZGV2aWNlKCk7CkBAIC0yMjIsMTggKzIwMSwxMyBAQAogCQlnb3RvIG91dDE7CiAKIAlhcC0+aXBkZXYgPSBpcGRldjsKLQlhcC0+Y2xpZW50LmFkYXB0ZXIgPSBidXM7Ci0JYXAtPmNsaWVudC5hZGRyID0gYWRkcmVzczsKKwlhcC0+Y2xpZW50ID0gY2xpZW50OwogCi0JaTJjX3NldF9jbGllbnRkYXRhKCZhcC0+Y2xpZW50LCBhcCk7CisJaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgYXApOwogCi0JZXJyID0gaTJjX2F0dGFjaF9jbGllbnQoJmFwLT5jbGllbnQpOwotCWlmIChlcnIpCi0JCWdvdG8gb3V0MjsKLQotCWVyciA9IGkyY19zbWJ1c193cml0ZV93b3JkX2RhdGEoJmFwLT5jbGllbnQsIGNtZCwgMCk7CisJZXJyID0gaTJjX3NtYnVzX3dyaXRlX3dvcmRfZGF0YShjbGllbnQsIGNtZCwgMCk7CiAJaWYgKGVycikgewotCQlkZXZfd2FybigmYXAtPmNsaWVudC5kZXYsIEFQQU5FTCAiOiBzbWJ1cyB3cml0ZSBlcnJvciAlZFxuIiwKKwkJZGV2X3dhcm4oJmNsaWVudC0+ZGV2LCBBUEFORUwgIjogc21idXMgd3JpdGUgZXJyb3IgJWRcbiIsCiAJCQkgZXJyKTsKIAkJZ290byBvdXQzOwogCX0KQEAgLTI0Niw3ICsyMjAsNyBAQAogCWlkZXYtPm5hbWUgPSBBUEFORUxfTkFNRSAiIGJ1dHRvbnMiOwogCWlkZXYtPnBoeXMgPSAiYXBhbmVsL2lucHV0MCI7CiAJaWRldi0+aWQuYnVzdHlwZSA9IEJVU19IT1NUOwotCWlkZXYtPmRldi5wYXJlbnQgPSAmYXAtPmNsaWVudC5kZXY7CisJaWRldi0+ZGV2LnBhcmVudCA9ICZjbGllbnQtPmRldjsKIAogCXNldF9iaXQoRVZfS0VZLCBpZGV2LT5ldmJpdCk7CiAKQEAgLTI2NCw3ICsyMzgsNyBAQAogCiAJSU5JVF9XT1JLKCZhcC0+bGVkX3dvcmssIGxlZF91cGRhdGUpOwogCWlmIChkZXZpY2VfY2hpcFtBUEFORUxfREVWX0xFRF0gIT0gQ0hJUF9OT05FKSB7Ci0JCWVyciA9IGxlZF9jbGFzc2Rldl9yZWdpc3RlcigmYXAtPmNsaWVudC5kZXYsICZhcC0+bWFpbF9sZWQpOworCQllcnIgPSBsZWRfY2xhc3NkZXZfcmVnaXN0ZXIoJmNsaWVudC0+ZGV2LCAmYXAtPm1haWxfbGVkKTsKIAkJaWYgKGVycikKIAkJCWdvdG8gb3V0NDsKIAl9CkBAIC0yNzMsOCArMjQ3LDYgQEAKIG91dDQ6CiAJaW5wdXRfdW5yZWdpc3Rlcl9wb2xsZWRfZGV2aWNlKGlwZGV2KTsKIG91dDM6Ci0JaTJjX2RldGFjaF9jbGllbnQoJmFwLT5jbGllbnQpOwotb3V0MjoKIAlpbnB1dF9mcmVlX3BvbGxlZF9kZXZpY2UoaXBkZXYpOwogb3V0MToKIAlyZXR1cm4gZXJyOwpAQCAtMzAxLDYgKzI3Myw3IEBACiAJdm9pZCBfX2lvbWVtICpiaW9zOwogCWNvbnN0IHZvaWQgX19pb21lbSAqcDsKIAl1OCBkZXZubzsKKwl1bnNpZ25lZCBjaGFyIGkyY19hZGRyOwogCWludCBmb3VuZCA9IDA7CiAKIAliaW9zID0gaW9yZW1hcCgweEYwMDAwLCAweDEwMDAwKTsgLyogQ2FuJ3QgZmFpbCAqLwpAQCAtMzEzLDcgKzI4Niw3IEBACiAKIAkvKiBqdXN0IHVzZSB0aGUgZmlyc3QgYWRkcmVzcyAqLwogCXAgKz0gODsKLQlub3JtYWxfaTJjWzBdID0gcmVhZGIocCszKSA+PiAxOworCWkyY19hZGRyID0gcmVhZGIocCArIDMpID4+IDE7CiAKIAlmb3IgKCA7IChkZXZubyA9IHJlYWRiKHApKSAmIDB4N2Y7IHAgKz0gNCkgewogCQl1bnNpZ25lZCBjaGFyIG1ldGhvZCwgc2xhdmUsIGNoaXA7CkBAIC0zMjIsNyArMjk1LDcgQEAKIAkJY2hpcCA9IHJlYWRiKHAgKyAyKTsKIAkJc2xhdmUgPSByZWFkYihwICsgMykgPj4gMTsKIAotCQlpZiAoc2xhdmUgIT0gbm9ybWFsX2kyY1swXSkgeworCQlpZiAoc2xhdmUgIT0gaTJjX2FkZHIpIHsKIAkJCXByX25vdGljZShBUEFORUwgIjogb25seSBvbmUgU01CdXMgc2xhdmUgIgogCQkJCSAgImFkZHJlc3Mgc3VwcG9ydGVkLCBza2lwaW5nIGRldmljZS4uLlxuIik7CiAJCQljb250aW51ZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvbWlzYy9wY2Y1MDYzMy1pbnB1dC5jIGIvZHJpdmVycy9pbnB1dC9taXNjL3BjZjUwNjMzLWlucHV0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDM5ZGNiMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaW5wdXQvbWlzYy9wY2Y1MDYzMy1pbnB1dC5jCkBAIC0wLDAgKzEsMTMyIEBACisvKiBOWFAgUENGNTA2MzMgSW5wdXQgRHJpdmVyCisgKgorICogKEMpIDIwMDYtMjAwOCBieSBPcGVubW9rbywgSW5jLgorICogQXV0aG9yOiBCYWxhamkgUmFvIDxiYWxhamlycmFvQG9wZW5tb2tvLm9yZz4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogQnJva2VuIGRvd24gZnJvbSBtb25zdHJvdXMgUENGNTA2MzMgZHJpdmVyIG1haW5seSBieQorICogSGFyYWxkIFdlbHRlLCBBbmR5IEdyZWVuIGFuZCBXZXJuZXIgQWxtZXNiZXJnZXIKKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgorCisjaW5jbHVkZSA8bGludXgvbWZkL3BjZjUwNjMzL2NvcmUuaD4KKworI2RlZmluZSBQQ0Y1MDYzM19PT0NTVEFUX09OS0VZCTB4MDEKKyNkZWZpbmUgUENGNTA2MzNfUkVHX09PQ1NUQVQJMHgxMgorI2RlZmluZSBQQ0Y1MDYzM19SRUdfT09DTU9ERQkweDEwCisKK3N0cnVjdCBwY2Y1MDYzM19pbnB1dCB7CisJc3RydWN0IHBjZjUwNjMzICpwY2Y7CisJc3RydWN0IGlucHV0X2RldiAqaW5wdXRfZGV2OworfTsKKworc3RhdGljIHZvaWQKK3BjZjUwNjMzX2lucHV0X2lycShpbnQgaXJxLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBwY2Y1MDYzM19pbnB1dCAqaW5wdXQ7CisJaW50IG9ua2V5X3JlbGVhc2VkOworCisJaW5wdXQgPSBkYXRhOworCisJLyogV2UgcmVwb3J0IG9ubHkgb25lIGV2ZW50IGRlcGVuZGluZyBvbiB0aGUga2V5IHByZXNzIHN0YXR1cyAqLworCW9ua2V5X3JlbGVhc2VkID0gcGNmNTA2MzNfcmVnX3JlYWQoaW5wdXQtPnBjZiwgUENGNTA2MzNfUkVHX09PQ1NUQVQpCisJCQkJCQkmIFBDRjUwNjMzX09PQ1NUQVRfT05LRVk7CisKKwlpZiAoaXJxID09IFBDRjUwNjMzX0lSUV9PTktFWUYgJiYgIW9ua2V5X3JlbGVhc2VkKQorCQlpbnB1dF9yZXBvcnRfa2V5KGlucHV0LT5pbnB1dF9kZXYsIEtFWV9QT1dFUiwgMSk7CisJZWxzZSBpZiAoaXJxID09IFBDRjUwNjMzX0lSUV9PTktFWVIgJiYgb25rZXlfcmVsZWFzZWQpCisJCWlucHV0X3JlcG9ydF9rZXkoaW5wdXQtPmlucHV0X2RldiwgS0VZX1BPV0VSLCAwKTsKKworCWlucHV0X3N5bmMoaW5wdXQtPmlucHV0X2Rldik7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHBjZjUwNjMzX2lucHV0X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHBjZjUwNjMzX2lucHV0ICppbnB1dDsKKwlzdHJ1Y3QgcGNmNTA2MzNfc3ViZGV2X3BkYXRhICpwZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCXN0cnVjdCBpbnB1dF9kZXYgKmlucHV0X2RldjsKKwlpbnQgcmV0OworCisKKwlpbnB1dCA9IGt6YWxsb2Moc2l6ZW9mKCppbnB1dCksIEdGUF9LRVJORUwpOworCWlmICghaW5wdXQpCisJCXJldHVybiAtRU5PTUVNOworCisJaW5wdXRfZGV2ID0gaW5wdXRfYWxsb2NhdGVfZGV2aWNlKCk7CisJaWYgKCFpbnB1dF9kZXYpIHsKKwkJa2ZyZWUoaW5wdXQpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBpbnB1dCk7CisJaW5wdXQtPnBjZiA9IHBkYXRhLT5wY2Y7CisJaW5wdXQtPmlucHV0X2RldiA9IGlucHV0X2RldjsKKworCWlucHV0X2Rldi0+bmFtZSA9ICJQQ0Y1MDYzMyBQTVUgZXZlbnRzIjsKKwlpbnB1dF9kZXYtPmlkLmJ1c3R5cGUgPSBCVVNfSTJDOworCWlucHV0X2Rldi0+ZXZiaXRbMF0gPSBCSVQoRVZfS0VZKSB8IEJJVChFVl9QV1IpOworCXNldF9iaXQoS0VZX1BPV0VSLCBpbnB1dF9kZXYtPmtleWJpdCk7CisKKwlyZXQgPSBpbnB1dF9yZWdpc3Rlcl9kZXZpY2UoaW5wdXRfZGV2KTsKKwlpZiAocmV0KSB7CisJCWlucHV0X2ZyZWVfZGV2aWNlKGlucHV0X2Rldik7CisJCWtmcmVlKGlucHV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisJcGNmNTA2MzNfcmVnaXN0ZXJfaXJxKHBkYXRhLT5wY2YsIFBDRjUwNjMzX0lSUV9PTktFWVIsCisJCQkJcGNmNTA2MzNfaW5wdXRfaXJxLCBpbnB1dCk7CisJcGNmNTA2MzNfcmVnaXN0ZXJfaXJxKHBkYXRhLT5wY2YsIFBDRjUwNjMzX0lSUV9PTktFWUYsCisJCQkJcGNmNTA2MzNfaW5wdXRfaXJxLCBpbnB1dCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgcGNmNTA2MzNfaW5wdXRfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHBjZjUwNjMzX2lucHV0ICppbnB1dCAgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCXBjZjUwNjMzX2ZyZWVfaXJxKGlucHV0LT5wY2YsIFBDRjUwNjMzX0lSUV9PTktFWVIpOworCXBjZjUwNjMzX2ZyZWVfaXJxKGlucHV0LT5wY2YsIFBDRjUwNjMzX0lSUV9PTktFWUYpOworCisJaW5wdXRfdW5yZWdpc3Rlcl9kZXZpY2UoaW5wdXQtPmlucHV0X2Rldik7CisJa2ZyZWUoaW5wdXQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHBjZjUwNjMzX2lucHV0X2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJwY2Y1MDYzMy1pbnB1dCIsCisJfSwKKwkucHJvYmUgPSBwY2Y1MDYzM19pbnB1dF9wcm9iZSwKKwkucmVtb3ZlID0gX19kZXZleGl0X3AocGNmNTA2MzNfaW5wdXRfcmVtb3ZlKSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHBjZjUwNjMzX2lucHV0X2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZwY2Y1MDYzM19pbnB1dF9kcml2ZXIpOworfQorbW9kdWxlX2luaXQocGNmNTA2MzNfaW5wdXRfaW5pdCk7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBwY2Y1MDYzM19pbnB1dF9leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnBjZjUwNjMzX2lucHV0X2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdChwY2Y1MDYzM19pbnB1dF9leGl0KTsKKworTU9EVUxFX0FVVEhPUigiQmFsYWppIFJhbyA8YmFsYWppcnJhb0BvcGVubW9rby5vcmc+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlBDRjUwNjMzIGlucHV0IGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTpwY2Y1MDYzMy1pbnB1dCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9tb3VzZS9weGE5MzBfdHJrYmFsbC5jIGIvZHJpdmVycy9pbnB1dC9tb3VzZS9weGE5MzBfdHJrYmFsbC5jCmluZGV4IGEwZjQ1YzQuLmQyOTdhY2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvbW91c2UvcHhhOTMwX3Rya2JhbGwuYworKysgYi9kcml2ZXJzL2lucHV0L21vdXNlL3B4YTkzMF90cmtiYWxsLmMKQEAgLTE4Niw3ICsxODYsNyBAQAogCWVycm9yID0gcmVxdWVzdF9pcnEoaXJxLCBweGE5MzBfdHJrYmFsbF9pbnRlcnJ1cHQsIElSUUZfRElTQUJMRUQsCiAJCQkgICAgcGRldi0+bmFtZSwgdHJrYmFsbCk7CiAJaWYgKGVycm9yKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byByZXF1ZXN0IGlycTogJWRcbiIsIHJldCk7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byByZXF1ZXN0IGlycTogJWRcbiIsIGVycm9yKTsKIAkJZ290byBmYWlsZWRfZnJlZV9pbzsKIAl9CiAKQEAgLTIyNyw3ICsyMjcsNyBAQAogCWlvdW5tYXAodHJrYmFsbC0+bW1pb19iYXNlKTsKIGZhaWxlZDoKIAlrZnJlZSh0cmtiYWxsKTsKLQlyZXR1cm4gcmV0OworCXJldHVybiBlcnJvcjsKIH0KIAogc3RhdGljIGludCBfX2RldmV4aXQgcHhhOTMwX3Rya2JhbGxfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL2RhOTAzNC10cy5jIGIvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9kYTkwMzQtdHMuYwppbmRleCA0MzQyZTc3Li5mYTY3ZDc4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL2RhOTAzNC10cy5jCisrKyBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vZGE5MDM0LXRzLmMKQEAgLTE2LDYgKzE2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CiAjaW5jbHVkZSA8bGludXgvbWZkL2RhOTAzeC5oPgogCiAjZGVmaW5lIERBOTAzNF9NQU5VQUxfQ1RSTAkweDUwCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvZWljb24vZGVidWdsaWIuaCBiL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9laWNvbi9kZWJ1Z2xpYi5oCmluZGV4IDAxNjQxMGMuLjhlYTU4NzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9laWNvbi9kZWJ1Z2xpYi5oCisrKyBiL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9laWNvbi9kZWJ1Z2xpYi5oCkBAIC0yMzUsNyArMjM1LDcgQEAKIHR5cGVkZWYgdm9pZCAoICogRGJnRXYpICAodW5zaWduZWQgc2hvcnQsIHVuc2lnbmVkIGxvbmcsIHZhX2xpc3QpIDsKIHR5cGVkZWYgdm9pZCAoICogRGJnSXJxKSAodW5zaWduZWQgc2hvcnQsIGludCwgY2hhciAqLCB2YV9saXN0KSA7CiB0eXBlZGVmIHN0cnVjdCBfRGJnSGFuZGxlXwoteyBjaGFyICAgIFJlZ2lzdGVyZWQgOyAvKiBkcml2ZXIgc3VjY2Vzc2Z1bGwgcmVnaXN0ZXJlZCAqLworeyBjaGFyICAgIFJlZ2lzdGVyZWQgOyAvKiBkcml2ZXIgc3VjY2Vzc2Z1bGx5IHJlZ2lzdGVyZWQgKi8KICNkZWZpbmUgREJHX0hBTkRMRV9SRUdfTkVXIDB4MDEgIC8qIHRoaXMgKG5ldykgc3RydWN0dXJlICAgICovCiAjZGVmaW5lIERCR19IQU5ETEVfUkVHX09MRCAweDdmICAvKiBvbGQgc3RydWN0dXJlIChzZWUgYmVsb3cpICAqLwogIGNoYXIgICAgVmVyc2lvbjsgIC8qIHZlcnNpb24gb2YgdGhpcyBzdHJ1Y3R1cmUgICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvZWljb24vb3NfNGJyaS5jIGIvZHJpdmVycy9pc2RuL2hhcmR3YXJlL2VpY29uL29zXzRicmkuYwppbmRleCA3YjRlYzNmLi5jOTY0YjhkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvZWljb24vb3NfNGJyaS5jCisrKyBiL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9laWNvbi9vc180YnJpLmMKQEAgLTk5Nyw3ICs5OTcsNyBAQAogCWRpdmFfeGRpX2Rpc3BsYXlfYWRhcHRlcl9mZWF0dXJlcyhJb0FkYXB0ZXItPkFOdW0pOwogCiAJZm9yIChpID0gMDsgaSA8IElvQWRhcHRlci0+dGFza3M7IGkrKykgewotCQlEQkdfTE9HKCgiQSglZCkgJXMgYWRhcHRlciBzdWNjZXNzZnVsbCBzdGFydGVkIiwKKwkJREJHX0xPRygoIkEoJWQpICVzIGFkYXB0ZXIgc3VjY2Vzc2Z1bGx5IHN0YXJ0ZWQiLAogCQkJIElvQWRhcHRlci0+UXVhZHJvTGlzdC0+UXVhZHJvQWRhcHRlcltpXS0+QU51bSwKIAkJCSAoSW9BZGFwdGVyLT50YXNrcyA9PSAxKSA/ICJCUkkgMi4wIiA6ICI0QlJJIikpCiAJCWRpdmFfeGRpX2RpZGRfcmVnaXN0ZXJfYWRhcHRlcihJb0FkYXB0ZXItPlF1YWRyb0xpc3QtPlF1YWRyb0FkYXB0ZXJbaV0tPkFOdW0pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2hhcmR3YXJlL2VpY29uL29zX2JyaS5jIGIvZHJpdmVycy9pc2RuL2hhcmR3YXJlL2VpY29uL29zX2JyaS5jCmluZGV4IGYzMWJiYTUuLjA4ZjAxOTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9laWNvbi9vc19icmkuYworKysgYi9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvZWljb24vb3NfYnJpLmMKQEAgLTczNiw3ICs3MzYsNyBAQAogCiAJSW9BZGFwdGVyLT5Qcm9wZXJ0aWVzLkZlYXR1cmVzID0gKHdvcmQpIGZlYXR1cmVzOwogCWRpdmFfeGRpX2Rpc3BsYXlfYWRhcHRlcl9mZWF0dXJlcyhJb0FkYXB0ZXItPkFOdW0pOwotCURCR19MT0coKCJBKCVkKSBCUkkgYWRhcHRlciBzdWNjZXNzZnVsbCBzdGFydGVkIiwgSW9BZGFwdGVyLT5BTnVtKSkKKwlEQkdfTE9HKCgiQSglZCkgQlJJIGFkYXB0ZXIgc3VjY2Vzc2Z1bGx5IHN0YXJ0ZWQiLCBJb0FkYXB0ZXItPkFOdW0pKQogCSAgICAvKgogCSAgICAgICBSZWdpc3RlciB3aXRoIERJREQKIAkgICAgICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvZWljb24vb3NfcHJpLmMgYi9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvZWljb24vb3NfcHJpLmMKaW5kZXggOTAzMzU2NS4uNWQ2NTQwNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2hhcmR3YXJlL2VpY29uL29zX3ByaS5jCisrKyBiL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9laWNvbi9vc19wcmkuYwpAQCAtNTEzLDcgKzUxMyw3IEBACiAKIAlkaXZhX3hkaV9kaXNwbGF5X2FkYXB0ZXJfZmVhdHVyZXMoSW9BZGFwdGVyLT5BTnVtKTsKIAotCURCR19MT0coKCJBKCVkKSBQUkkgYWRhcHRlciBzdWNjZXNzZnVsbCBzdGFydGVkIiwgSW9BZGFwdGVyLT5BTnVtKSkKKwlEQkdfTE9HKCgiQSglZCkgUFJJIGFkYXB0ZXIgc3VjY2Vzc2Z1bGx5IHN0YXJ0ZWQiLCBJb0FkYXB0ZXItPkFOdW0pKQogCS8qCiAJICAgUmVnaXN0ZXIgd2l0aCBESURECiAJICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvbUlTRE4vS2NvbmZpZyBiL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9tSVNETi9LY29uZmlnCmluZGV4IDE0NzkzNDguLmZkMTEyYWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9tSVNETi9LY29uZmlnCisrKyBiL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9tSVNETi9LY29uZmlnCkBAIC0yMywzICsyMywxMCBAQAogCSAgICogSEZDLThTICg4IFMvVCBpbnRlcmZhY2VzIG9uIG9uZSBjaGlwKQogCSAgICogSEZDLUUxIChFMSBpbnRlcmZhY2UgZm9yIDJNYml0IElTRE4pCiAKK2NvbmZpZyBNSVNETl9IRkNVU0IKKwl0cmlzdGF0ZSAiU3VwcG9ydCBmb3IgSEZDLVMgVVNCIGJhc2VkIFRBcyIKKwlkZXBlbmRzIG9uIFVTQgorCWhlbHAKKwkgIEVuYWJsZSBzdXBwb3J0IGZvciBVU0IgSVNETiBUQXMgd2l0aCBDb2xvZ25lIENoaXAgQUcncworCSAgSEZDLVMgVVNCIElTRE4gQ29udHJvbGxlcgorCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvbUlTRE4vTWFrZWZpbGUgYi9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvbUlTRE4vTWFrZWZpbGUKaW5kZXggMWU3Y2E1My4uYjA0MDM1MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2hhcmR3YXJlL21JU0ROL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9tSVNETi9NYWtlZmlsZQpAQCAtNSwzICs1LDQgQEAKIAogb2JqLSQoQ09ORklHX01JU0ROX0hGQ1BDSSkgKz0gaGZjcGNpLm8KIG9iai0kKENPTkZJR19NSVNETl9IRkNNVUxUSSkgKz0gaGZjbXVsdGkubworb2JqLSQoQ09ORklHX01JU0ROX0hGQ1VTQikgKz0gaGZjc3VzYi5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvbUlTRE4vaGZjX211bHRpLmggYi9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvbUlTRE4vaGZjX211bHRpLmgKaW5kZXggN2JiZjczMC4uNjYzYjc3ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2hhcmR3YXJlL21JU0ROL2hmY19tdWx0aS5oCisrKyBiL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9tSVNETi9oZmNfbXVsdGkuaApAQCAtMiwxMCArMiw2IEBACiAgKiBzZWUgbm90aWNlIGluIGhmY19tdWx0aS5jCiAgKi8KIAotZXh0ZXJuIHZvaWQgenRkdW1teV9leHRlcm5faW50ZXJydXB0KHZvaWQpOwotZXh0ZXJuIHZvaWQgenRkdW1teV9yZWdpc3Rlcl9pbnRlcnJ1cHQodm9pZCk7Ci1leHRlcm4gaW50IHp0ZHVtbXlfdW5yZWdpc3Rlcl9pbnRlcnJ1cHQodm9pZCk7Ci0KICNkZWZpbmUgREVCVUdfSEZDTVVMVElfRklGTwkweDAwMDEwMDAwCiAjZGVmaW5lCURFQlVHX0hGQ01VTFRJX0NSQwkweDAwMDIwMDAwCiAjZGVmaW5lCURFQlVHX0hGQ01VTFRJX0lOSVQJMHgwMDA0MDAwMApAQCAtMTMsNiArOSw3IEBACiAjZGVmaW5lCURFQlVHX0hGQ01VTFRJX01PREUJMHgwMDEwMDAwMAogI2RlZmluZQlERUJVR19IRkNNVUxUSV9NU0cJMHgwMDIwMDAwMAogI2RlZmluZQlERUJVR19IRkNNVUxUSV9TVEFURQkweDAwNDAwMDAwCisjZGVmaW5lCURFQlVHX0hGQ01VTFRJX0ZJTEwJMHgwMDgwMDAwMAogI2RlZmluZQlERUJVR19IRkNNVUxUSV9TWU5DCTB4MDEwMDAwMDAKICNkZWZpbmUJREVCVUdfSEZDTVVMVElfRFRNRgkweDAyMDAwMDAwCiAjZGVmaW5lCURFQlVHX0hGQ01VTFRJX0xPQ0sJMHg4MDAwMDAwMApAQCAtMTcwLDYgKzE2Nyw4IEBACiAKIAl1X2xvbmcJCWNoaXA7CS8qIGNoaXAgY29uZmlndXJhdGlvbiAqLwogCWludAkJbWFzdGVyY2xrOyAvKiBwb3J0IHRoYXQgcHJvdmlkZXMgbWFzdGVyIGNsb2NrIC0xPW9mZiAqLworCXVuc2lnbmVkIGNoYXIJc2lsZW5jZTsvKiBzaWxlbmNlIGJ5dGUgKi8KKwl1bnNpZ25lZCBjaGFyCXNpbGVuY2VfZGF0YVsxMjhdOy8qIHNpbGVuY2UgYmxvY2sgKi8KIAlpbnQJCWR0bWY7CS8qIGZsYWcgdGhhdCBkdG1mIGlzIGN1cnJlbnRseSBpbiBwcm9jZXNzICovCiAJaW50CQlGbGVuOwkvKiBGLWJ1ZmZlciBzaXplICovCiAJaW50CQlabGVuOwkvKiBaLWJ1ZmZlciBzaXplIChtdXN0IGJlIGludCBmb3IgY2FsY3VsYXRpb24pKi8KQEAgLTE5OCw2ICsxOTcsOSBAQAogCiAJc3BpbmxvY2tfdAlsb2NrOwkvKiB0aGUgbG9jayAqLwogCisJc3RydWN0IG1JU0ROY2xvY2sgKmljbG9jazsgLyogaXNkbiBjbG9jayBzdXBwb3J0ICovCisJaW50CQlpY2xvY2tfb247CisKIAkvKgogCSAqIHRoZSBjaGFubmVsIGluZGV4IGlzIGNvdW50ZWQgZnJvbSAwLCByZWdhcmRsZXNzIHdoZXJlIHRoZSBjaGFubmVsCiAJICogaXMgbG9jYXRlZCBvbiB0aGUgaGZjLWNoYW5uZWwuCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvbUlTRE4vaGZjX3BjaS5oIGIvZHJpdmVycy9pc2RuL2hhcmR3YXJlL21JU0ROL2hmY19wY2kuaAppbmRleCA1NzgzZDIyLi4zMTMyZGRjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvbUlTRE4vaGZjX3BjaS5oCisrKyBiL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9tSVNETi9oZmNfcGNpLmgKQEAgLTI2LDcgKzI2LDcgQEAKICAqIGNoYW5nZSBtYXNrIGFuZCB0aHJlc2hvbGQgc2ltdWx0YW5lb3VzbHkKICAqLwogI2RlZmluZSBIRkNQQ0lfQlRSQU5TX1RIUkVTSE9MRCAxMjgKLSNkZWZpbmUgSEZDUENJX0JUUkFOU19NQVgJMjU2CisjZGVmaW5lIEhGQ1BDSV9GSUxMRU1QVFkJNjQKICNkZWZpbmUgSEZDUENJX0JUUkFOU19USFJFU01BU0sgMHgwMAogCiAvKiBkZWZpbmVzIGZvciBQQ0kgY29uZmlnICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvbUlTRE4vaGZjbXVsdGkuYyBiL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9tSVNETi9oZmNtdWx0aS5jCmluZGV4IGM2M2UyZjQuLjU5NWJhOGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9tSVNETi9oZmNtdWx0aS5jCisrKyBiL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9tSVNETi9oZmNtdWx0aS5jCkBAIC0xMzMsNiArMTMzLDEyIEBACiAgKglHaXZlIHRoZSB2YWx1ZSBvZiB0aGUgY2xvY2sgY29udHJvbCByZWdpc3RlciAoQV9TVF9DTEtfRExZKQogICoJb2YgdGhlIFMvVCBpbnRlcmZhY2VzIGluIFRFIG1vZGUuCiAgKglUaGlzIHJlZ2lzdGVyIGlzIG5lZWRlZCBmb3IgdGhlIFRCUjMgY2VydGlmaWNhdGlvbiwgc28gZG9uJ3QgY2hhbmdlIGl0LgorICoKKyAqIGNsb2NrOgorICoJTk9URTogb25seSBvbmUgY2xvY2sgdmFsdWUgbXVzdCBiZSBnaXZlbiBvbmNlCisgKglTZWxlY3RzIGludGVyZmFjZSB3aXRoIGNsb2NrIHNvdXJjZSBmb3IgbUlTRE4gYW5kIGFwcGxpY2F0aW9ucy4KKyAqCVNldCB0byBjYXJkIG51bWJlciBzdGFydGluZyB3aXRoIDEuIFNldCB0byAtMSB0byBkaXNhYmxlLgorICoJQnkgZGVmYXVsdCwgdGhlIGZpcnN0IGNhcmQgaXMgdXNlZCBhcyBjbG9jayBzb3VyY2UuCiAgKi8KIAogLyoKQEAgLTE0MCw3ICsxNDYsNyBAQAogICogI2RlZmluZSBIRkNfUkVHSVNURVJfREVCVUcKICAqLwogCi1zdGF0aWMgY29uc3QgY2hhciAqaGZjbXVsdGlfcmV2aXNpb24gPSAiMi4wMiI7CisjZGVmaW5lIEhGQ19NVUxUSV9WRVJTSU9OCSIyLjAzIgogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CkBAIC0xNjUsMTAgKzE3MSw2IEBACiBzdGF0aWMgc3BpbmxvY2tfdCBIRkNsb2NrOyAvKiBnbG9iYWwgaGZjIGxpc3QgbG9jayAqLwogCiBzdGF0aWMgdm9pZCBwaF9zdGF0ZV9jaGFuZ2Uoc3RydWN0IGRjaGFubmVsICopOwotc3RhdGljIHZvaWQgKCpoZmNfaW50ZXJydXB0KSh2b2lkKTsKLXN0YXRpYyB2b2lkICgqcmVnaXN0ZXJfaW50ZXJydXB0KSh2b2lkKTsKLXN0YXRpYyBpbnQgKCp1bnJlZ2lzdGVyX2ludGVycnVwdCkodm9pZCk7Ci1zdGF0aWMgaW50IGludGVycnVwdF9yZWdpc3RlcmVkOwogCiBzdGF0aWMgc3RydWN0IGhmY19tdWx0aSAqc3luY21hc3RlcjsKIHN0YXRpYyBpbnQgcGx4c2RfbWFzdGVyOyAvKiBpZiB3ZSBoYXZlIGEgbWFzdGVyIGNhcmQgKHlldCkgKi8KQEAgLTE4NCw3ICsxODYsNiBAQAogI2RlZmluZQlDTEtERUxfVEUJMHgwZgkvKiBDTEtERUwgaW4gVEUgbW9kZSAqLwogI2RlZmluZQlDTEtERUxfTlQJMHg2YwkvKiBDTEtERUwgaW4gTlQgbW9kZQogCQkJCSAgICgweDYwIE1VU1QgYmUgaW5jbHVkZWQhKSAqLwotc3RhdGljIHVfY2hhciBzaWxlbmNlID0JMHhmZjsJLyogc2lsZW5jZSBieSBMQVcgKi8KIAogI2RlZmluZQlESVBfNFMJMHgxCQkvKiBESVAgU3dpdGNoZXMgZm9yIEJlcm9uZXQgMVMvMlMvNFMgY2FyZHMgKi8KICNkZWZpbmUJRElQXzhTCTB4MgkJLyogRElQIFN3aXRjaGVzIGZvciBCZXJvbmV0IDhTKyBjYXJkcyAqLwpAQCAtMTk1LDEyICsxOTYsMTMgQEAKICAqLwogCiBzdGF0aWMgdWludAl0eXBlW01BWF9DQVJEU107Ci1zdGF0aWMgdWludAlwY21bTUFYX0NBUkRTXTsKLXN0YXRpYyB1aW50CWRzbG90W01BWF9DQVJEU107CitzdGF0aWMgaW50CXBjbVtNQVhfQ0FSRFNdOworc3RhdGljIGludAlkc2xvdFtNQVhfQ0FSRFNdOwogc3RhdGljIHVpbnQJaW9tb2RlW01BWF9DQVJEU107CiBzdGF0aWMgdWludAlwb3J0W01BWF9QT1JUU107CiBzdGF0aWMgdWludAlkZWJ1ZzsKIHN0YXRpYyB1aW50CXBvbGw7CitzdGF0aWMgaW50CWNsb2NrOwogc3RhdGljIHVpbnQJdGltZXI7CiBzdGF0aWMgdWludAljbG9ja2RlbGF5X3RlID0gQ0xLREVMX1RFOwogc3RhdGljIHVpbnQJY2xvY2tkZWxheV9udCA9IENMS0RFTF9OVDsKQEAgLTIwOSwxNCArMjExLDE2IEBACiAKIE1PRFVMRV9BVVRIT1IoIkFuZHJlYXMgRXZlcnNiZXJnIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfVkVSU0lPTihIRkNfTVVMVElfVkVSU0lPTik7CiBtb2R1bGVfcGFyYW0oZGVidWcsIHVpbnQsIFNfSVJVR08gfCBTX0lXVVNSKTsKIG1vZHVsZV9wYXJhbShwb2xsLCB1aW50LCBTX0lSVUdPIHwgU19JV1VTUik7Cittb2R1bGVfcGFyYW0oY2xvY2ssIGludCwgU19JUlVHTyB8IFNfSVdVU1IpOwogbW9kdWxlX3BhcmFtKHRpbWVyLCB1aW50LCBTX0lSVUdPIHwgU19JV1VTUik7CiBtb2R1bGVfcGFyYW0oY2xvY2tkZWxheV90ZSwgdWludCwgU19JUlVHTyB8IFNfSVdVU1IpOwogbW9kdWxlX3BhcmFtKGNsb2NrZGVsYXlfbnQsIHVpbnQsIFNfSVJVR08gfCBTX0lXVVNSKTsKIG1vZHVsZV9wYXJhbV9hcnJheSh0eXBlLCB1aW50LCBOVUxMLCBTX0lSVUdPIHwgU19JV1VTUik7Ci1tb2R1bGVfcGFyYW1fYXJyYXkocGNtLCB1aW50LCBOVUxMLCBTX0lSVUdPIHwgU19JV1VTUik7Ci1tb2R1bGVfcGFyYW1fYXJyYXkoZHNsb3QsIHVpbnQsIE5VTEwsIFNfSVJVR08gfCBTX0lXVVNSKTsKK21vZHVsZV9wYXJhbV9hcnJheShwY20sIGludCwgTlVMTCwgU19JUlVHTyB8IFNfSVdVU1IpOworbW9kdWxlX3BhcmFtX2FycmF5KGRzbG90LCBpbnQsIE5VTEwsIFNfSVJVR08gfCBTX0lXVVNSKTsKIG1vZHVsZV9wYXJhbV9hcnJheShpb21vZGUsIHVpbnQsIE5VTEwsIFNfSVJVR08gfCBTX0lXVVNSKTsKIG1vZHVsZV9wYXJhbV9hcnJheShwb3J0LCB1aW50LCBOVUxMLCBTX0lSVUdPIHwgU19JV1VTUik7CiAKQEAgLTE0MTksMTkgKzE0MjMsNiBAQAogCUhGQ19vdXRiKGhjLCBSX1RJX1dELCBwb2xsX3RpbWVyKTsKIAloYy0+aHcucl9pcnFtc2tfbWlzYyB8PSBWX1RJX0lSUU1TSzsKIAotCS8qCi0JICogc2V0IHVwIDEyNXVzIGludGVycnVwdCwgb25seSBpZiBmdW5jdGlvbiBwb2ludGVyIGlzIGF2YWlsYWJsZQotCSAqIGFuZCBtb2R1bGUgcGFyYW1ldGVyIHRpbWVyIGlzIHNldAotCSAqLwotCWlmICh0aW1lciAmJiBoZmNfaW50ZXJydXB0ICYmIHJlZ2lzdGVyX2ludGVycnVwdCkgewotCQkvKiBvbmx5IG9uZSBjaGlwIHNob3VsZCB1c2UgdGhpcyBpbnRlcnJ1cHQgKi8KLQkJdGltZXIgPSAwOwotCQlpbnRlcnJ1cHRfcmVnaXN0ZXJlZCA9IDE7Ci0JCWhjLT5ody5yX2lycW1za19taXNjIHw9IFZfUFJPQ19JUlFNU0s7Ci0JCS8qIGRlYWN0aXZhdGUgb3RoZXIgaW50ZXJydXB0cyBpbiB6dGR1bW15ICovCi0JCXJlZ2lzdGVyX2ludGVycnVwdCgpOwotCX0KLQogCS8qIHNldCBFMSBzdGF0ZSBtYWNoaW5lIElSUSAqLwogCWlmIChoYy0+dHlwZSA9PSAxKQogCQloYy0+aHcucl9pcnFtc2tfbWlzYyB8PSBWX1NUQV9JUlFNU0s7CkBAIC0xOTkxLDYgKzE5ODIsMTcgQEAKIAkJcmV0dXJuOyAvKiBubyBkYXRhICovCiAJfQogCisJLyogImZpbGwgZmlmbyBpZiBlbXB0eSIgZmVhdHVyZSAqLworCWlmIChiY2ggJiYgdGVzdF9iaXQoRkxHX0ZJTExFTVBUWSwgJmJjaC0+RmxhZ3MpCisJCSYmICF0ZXN0X2JpdChGTEdfSERMQywgJmJjaC0+RmxhZ3MpICYmIHoyID09IHoxKSB7CisJCWlmIChkZWJ1ZyAmIERFQlVHX0hGQ01VTFRJX0ZJTEwpCisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGJ1ZmZlciBlbXB0eSwgc28gd2UgaGF2ZSAiCisJCQkJInVuZGVycnVuXG4iLCBfX2Z1bmNfXyk7CisJCS8qIGZpbGwgYnVmZmVyLCB0byBwcmV2ZW50IGZ1dHVyZSB1bmRlcnJ1biAqLworCQloYy0+d3JpdGVfZmlmbyhoYywgaGMtPnNpbGVuY2VfZGF0YSwgcG9sbCA+PiAxKTsKKwkJWnNwYWNlIC09IChwb2xsID4+IDEpOworCX0KKwogCS8qIGlmIGF1ZGlvIGRhdGEgYW5kIGNvbm5lY3RlZCBzbG90ICovCiAJaWYgKGJjaCAmJiAoIXRlc3RfYml0KEZMR19IRExDLCAmYmNoLT5GbGFncykpICYmICghKnR4cGVuZGluZykKIAkJJiYgc2xvdF90eCA+PSAwKSB7CkBAIC0yMDI3LDcgKzIwMjksNiBAQAogCQkJX19mdW5jX18sIGhjLT5pZCArIDEsIGNoLCBac3BhY2UsIHoxLCB6MiwgaWktaSwgbGVuLWksCiAJCQl0ZW1wID8gIkhETEMiOiJUUkFOUyIpOwogCi0KIAkvKiBIYXZlIHRvIHByZXAgdGhlIGF1ZGlvIGRhdGEgKi8KIAloYy0+d3JpdGVfZmlmbyhoYywgZCwgaWkgLSBpKTsKIAkqaWR4cCA9IGlpOwpAQCAtMjA2Niw3ICsyMDY3LDcgQEAKIAkgKiBubyBtb3JlIGRhdGEgYXQgYWxsLiB0aGlzIHByZXZlbnRzIHNlbmRpbmcgYW4gdW5kZWZpbmVkIHZhbHVlLgogCSAqLwogCWlmIChiY2ggJiYgdGVzdF9iaXQoRkxHX1RSQU5TUEFSRU5ULCAmYmNoLT5GbGFncykpCi0JCUhGQ19vdXRiX25vZGVidWcoaGMsIEFfRklGT19EQVRBMF9OT0lOQywgc2lsZW5jZSk7CisJCUhGQ19vdXRiX25vZGVidWcoaGMsIEFfRklGT19EQVRBMF9OT0lOQywgaGMtPnNpbGVuY2UpOwogfQogCiAKQEAgLTI1ODMsNyArMjU4NCw2IEBACiAJc3RhdGljIGludCBpcTEgPSAwLCBpcTIgPSAwLCBpcTMgPSAwLCBpcTQgPSAwLAogCSAgICBpcTUgPSAwLCBpcTYgPSAwLCBpcWNudCA9IDA7CiAjZW5kaWYKLQlzdGF0aWMgaW50CQljb3VudDsKIAlzdHJ1Y3QgaGZjX211bHRpCSpoYyA9IGRldl9pZDsKIAlzdHJ1Y3QgZGNoYW5uZWwJCSpkY2g7CiAJdV9jaGFyCQkJcl9pcnFfc3RhdGVjaCwgc3RhdHVzLCByX2lycV9taXNjLCByX2lycV9vdmlldzsKQEAgLTI2MzcsNiArMjYzNyw3IEBACiAJCWlxY250ID0gMDsKIAl9CiAjZW5kaWYKKwogCWlmICghcl9pcnFfc3RhdGVjaCAmJgogCSAgICAhKHN0YXR1cyAmIChWX0RUTUZfU1RBIHwgVl9MT1NUX1NUQSB8IFZfRVhUX0lSUVNUQSB8CiAJICAgIFZfTUlTQ19JUlFTVEEgfCBWX0ZSX0lSUVNUQSkpKSB7CkBAIC0yNjU3LDYgKzI2NTgsNyBAQAogCWlmIChzdGF0dXMgJiBWX01JU0NfSVJRU1RBKSB7CiAJCS8qIG1pc2MgSVJRICovCiAJCXJfaXJxX21pc2MgPSBIRkNfaW5iX25vZGVidWcoaGMsIFJfSVJRX01JU0MpOworCQlyX2lycV9taXNjICY9IGhjLT5ody5yX2lycW1za19taXNjOyAvKiBpZ25vcmUgZGlzYWJsZWQgaXJxcyAqLwogCQlpZiAocl9pcnFfbWlzYyAmIFZfU1RBX0lSUSkgewogCQkJaWYgKGhjLT50eXBlID09IDEpIHsKIAkJCQkvKiBzdGF0ZSBtYWNoaW5lICovCkBAIC0yNjkxLDIzICsyNjkzLDIwIEBACiAJCQkJCXBseHNkX2NoZWNrc3luYyhoYywgMCk7CiAJCQl9CiAJCX0KLQkJaWYgKHJfaXJxX21pc2MgJiBWX1RJX0lSUSkKKwkJaWYgKHJfaXJxX21pc2MgJiBWX1RJX0lSUSkgeworCQkJaWYgKGhjLT5pY2xvY2tfb24pCisJCQkJbUlTRE5fY2xvY2tfdXBkYXRlKGhjLT5pY2xvY2ssIHBvbGwsIE5VTEwpOwogCQkJaGFuZGxlX3RpbWVyX2lycShoYyk7CisJCX0KIAogCQlpZiAocl9pcnFfbWlzYyAmIFZfRFRNRl9JUlEpIHsKLQkJCS8qIC0+IERUTUYgSVJRICovCiAJCQloZmNtdWx0aV9kdG1mKGhjKTsKIAkJfQotCQkvKiBUT0RPOiBSRVBMQUNFICEhISEgMTI1IHVzIEludGVycnVwdHMgYXJlIG5vdCBhY2NlcHRhYmxlICAqLwogCQlpZiAocl9pcnFfbWlzYyAmIFZfSVJRX1BST0MpIHsKLQkJCS8qIElSUSBldmVyeSAxMjV1cyAqLwotCQkJY291bnQrKzsKLQkJCS8qIGdlbmVyYXRlIDFrSHogc2lnbmFsICovCi0JCQlpZiAoY291bnQgPT0gOCkgewotCQkJCWlmIChoZmNfaW50ZXJydXB0KQotCQkJCQloZmNfaW50ZXJydXB0KCk7Ci0JCQkJY291bnQgPSAwOwotCQkJfQorCQkJc3RhdGljIGludCBpcnFfcHJvY19jbnQ7CisJCQlpZiAoIWlycV9wcm9jX2NudCsrKQorCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBnb3QgVl9JUlFfUFJPQyAtIgorCQkJCSAgICAiIHRoaXMgc2hvdWxkIG5vdCBoYXBwZW5cbiIsIF9fZnVuY19fKTsKIAkJfQogCiAJfQpAQCAtMjk1NCw3ICsyOTUzLDcgQEAKIAkJCUhGQ19vdXRiKGhjLCBSX0lOQ19SRVNfRklGTywgVl9SRVNfRik7CiAJCQlIRkNfd2FpdChoYyk7CiAJCQkvKiB0eCBzaWxlbmNlICovCi0JCQlIRkNfb3V0Yl9ub2RlYnVnKGhjLCBBX0ZJRk9fREFUQTBfTk9JTkMsIHNpbGVuY2UpOworCQkJSEZDX291dGJfbm9kZWJ1ZyhoYywgQV9GSUZPX0RBVEEwX05PSU5DLCBoYy0+c2lsZW5jZSk7CiAJCQlIRkNfb3V0YihoYywgUl9TTE9ULCAoKChjaCAvIDQpICogOCkgKwogCQkJICAgICgoY2ggJSA0KSAqIDQpKSA8PCAxKTsKIAkJCUhGQ19vdXRiKGhjLCBBX1NMX0NGRywgMHg4MCB8IDB4MjAgfCAoY2ggPDwgMSkpOwpAQCAtMjk2OSw3ICsyOTY4LDcgQEAKIAkJCUhGQ19vdXRiKGhjLCBSX0lOQ19SRVNfRklGTywgVl9SRVNfRik7CiAJCQlIRkNfd2FpdChoYyk7CiAJCQkvKiB0eCBzaWxlbmNlICovCi0JCQlIRkNfb3V0Yl9ub2RlYnVnKGhjLCBBX0ZJRk9fREFUQTBfTk9JTkMsIHNpbGVuY2UpOworCQkJSEZDX291dGJfbm9kZWJ1ZyhoYywgQV9GSUZPX0RBVEEwX05PSU5DLCBoYy0+c2lsZW5jZSk7CiAJCQkvKiBlbmFibGUgUlggZmlmbyAqLwogCQkJSEZDX291dGIoaGMsIFJfRklGTywgKGNoPDwxKXwxKTsKIAkJCUhGQ193YWl0KGhjKTsKQEAgLTM0NjEsNyArMzQ2MCw3IEBACiAJc3dpdGNoIChjcS0+b3ApIHsKIAljYXNlIE1JU0ROX0NUUkxfR0VUT1A6CiAJCWNxLT5vcCA9IE1JU0ROX0NUUkxfSEZDX09QIHwgTUlTRE5fQ1RSTF9IV19GRUFUVVJFU19PUAotCQkJfCBNSVNETl9DVFJMX1JYX09GRjsKKwkJCXwgTUlTRE5fQ1RSTF9SWF9PRkYgfCBNSVNETl9DVFJMX0ZJTExfRU1QVFk7CiAJCWJyZWFrOwogCWNhc2UgTUlTRE5fQ1RSTF9SWF9PRkY6IC8qIHR1cm4gb2ZmIC8gb24gcnggc3RyZWFtICovCiAJCWhjLT5jaGFuW2JjaC0+c2xvdF0ucnhfb2ZmID0gISFjcS0+cDE7CkBAIC0zNDc2LDYgKzM0NzUsMTIgQEAKIAkJCXByaW50ayhLRVJOX0RFQlVHICIlczogUlhfT0ZGIHJlcXVlc3QgKG5yPSVkIG9mZj0lZClcbiIsCiAJCQkgICAgX19mdW5jX18sIGJjaC0+bnIsIGhjLT5jaGFuW2JjaC0+c2xvdF0ucnhfb2ZmKTsKIAkJYnJlYWs7CisJY2FzZSBNSVNETl9DVFJMX0ZJTExfRU1QVFk6IC8qIGZpbGwgZmlmbywgaWYgZW1wdHkgKi8KKwkJdGVzdF9hbmRfc2V0X2JpdChGTEdfRklMTEVNUFRZLCAmYmNoLT5GbGFncyk7CisJCWlmIChkZWJ1ZyAmIERFQlVHX0hGQ01VTFRJX01TRykKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlczogRklMTF9FTVBUWSByZXF1ZXN0IChucj0lZCAiCisJCQkJIm9mZj0lZClcbiIsIF9fZnVuY19fLCBiY2gtPm5yLCAhIWNxLT5wMSk7CisJCWJyZWFrOwogCWNhc2UgTUlTRE5fQ1RSTF9IV19GRUFUVVJFUzogLyogZmlsbCBmZWF0dXJlcyBzdHJ1Y3R1cmUgKi8KIAkJaWYgKGRlYnVnICYgREVCVUdfSEZDTVVMVElfTVNHKQogCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBIV19GRUFUVVJFIHJlcXVlc3RcbiIsCkBAIC0zNjEwLDcgKzM2MTUsNyBAQAogc3RhdGljIHZvaWQKIHBoX3N0YXRlX2NoYW5nZShzdHJ1Y3QgZGNoYW5uZWwgKmRjaCkKIHsKLQlzdHJ1Y3QgaGZjX211bHRpICpoYyA9IGRjaC0+aHc7CisJc3RydWN0IGhmY19tdWx0aSAqaGM7CiAJaW50IGNoLCBpOwogCiAJaWYgKCFkY2gpIHsKQEAgLTM2MTgsNiArMzYyMyw3IEBACiAJCSAgICBfX2Z1bmNfXyk7CiAJCXJldHVybjsKIAl9CisJaGMgPSBkY2gtPmh3OwogCWNoID0gZGNoLT5zbG90OwogCiAJaWYgKGhjLT50eXBlID09IDEpIHsKQEAgLTM5OTIsNiArMzk5OCw3IEBACiAJfQogCWlmICh0ZXN0X2FuZF9zZXRfYml0KEZMR19PUEVOLCAmYmNoLT5GbGFncykpCiAJCXJldHVybiAtRUJVU1k7IC8qIGItY2hhbm5lbCBjYW4gYmUgb25seSBvcGVuIG9uY2UgKi8KKwl0ZXN0X2FuZF9jbGVhcl9iaXQoRkxHX0ZJTExFTVBUWSwgJmJjaC0+RmxhZ3MpOwogCWJjaC0+Y2gucHJvdG9jb2wgPSBycS0+cHJvdG9jb2w7CiAJaGMtPmNoYW5bY2hdLnJ4X29mZiA9IDA7CiAJcnEtPmNoID0gJmJjaC0+Y2g7CkBAIC00MDgxLDYgKzQwODgsMTUgQEAKIAlyZXR1cm4gZXJyOwogfQogCitzdGF0aWMgaW50CitjbG9ja2N0bCh2b2lkICpwcml2LCBpbnQgZW5hYmxlKQoreworCXN0cnVjdCBoZmNfbXVsdGkgKmhjID0gcHJpdjsKKworCWhjLT5pY2xvY2tfb24gPSBlbmFibGU7CisJcmV0dXJuIDA7Cit9CisKIC8qCiAgKiBpbml0aWFsaXplIHRoZSBjYXJkCiAgKi8KQEAgLTQ0OTUsMTAgKzQ1MTEsMTQgQEAKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHJlbGVhc2UgY2FyZCAoJWQpIGVudGVyZWRcbiIsCiAJCSAgICBfX2Z1bmNfXywgaGMtPmlkKTsKIAorCS8qIHVucmVnaXN0ZXIgY2xvY2sgc291cmNlICovCisJaWYgKGhjLT5pY2xvY2spCisJCW1JU0ROX3VucmVnaXN0ZXJfY2xvY2soaGMtPmljbG9jayk7CisKKwkvKiBkaXNhYmxlIGlycSAqLwogCXNwaW5fbG9ja19pcnFzYXZlKCZoYy0+bG9jaywgZmxhZ3MpOwogCWRpc2FibGVfaHdpcnEoaGMpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhjLT5sb2NrLCBmbGFncyk7Ci0KIAl1ZGVsYXkoMTAwMCk7CiAKIAkvKiBkaW1tIGxlZHMgKi8KQEAgLTQ2OTksNyArNDcxOSw3IEBACiAJfSBlbHNlCiAJCWhjLT5jaGFuW2hjLT5kc2xvdF0uaml0dGVyID0gMjsgLyogZGVmYXVsdCAqLwogCXNucHJpbnRmKG5hbWUsIE1JU0ROX01BWF9JRExFTiAtIDEsICJoZmMtZTEuJWQiLCBIRkNfY250ICsgMSk7Ci0JcmV0ID0gbUlTRE5fcmVnaXN0ZXJfZGV2aWNlKCZkY2gtPmRldiwgbmFtZSk7CisJcmV0ID0gbUlTRE5fcmVnaXN0ZXJfZGV2aWNlKCZkY2gtPmRldiwgJmhjLT5wY2lfZGV2LT5kZXYsIG5hbWUpOwogCWlmIChyZXQpCiAJCWdvdG8gZnJlZV9jaGFuOwogCWhjLT5jcmVhdGVkWzBdID0gMTsKQEAgLTQ4MDcsOSArNDgyNyw5IEBACiAJCXRlc3RfYW5kX3NldF9iaXQoSEZDX0NGR19ESVNfRUNIQU5ORUwsCiAJCSAgICAmaGMtPmNoYW5baSArIDJdLmNmZyk7CiAJfQotCXNucHJpbnRmKG5hbWUsIE1JU0ROX01BWF9JRExFTiAtIDEsICJoZmMtJWRzLiVkLyVkIiwKKwlzbnByaW50ZihuYW1lLCBNSVNETl9NQVhfSURMRU4gLSAxLCAiaGZjLSVkcy4lZC0lZCIsCiAJCWhjLT50eXBlLCBIRkNfY250ICsgMSwgcHQgKyAxKTsKLQlyZXQgPSBtSVNETl9yZWdpc3Rlcl9kZXZpY2UoJmRjaC0+ZGV2LCBuYW1lKTsKKwlyZXQgPSBtSVNETl9yZWdpc3Rlcl9kZXZpY2UoJmRjaC0+ZGV2LCAmaGMtPnBjaV9kZXYtPmRldiwgbmFtZSk7CiAJaWYgKHJldCkKIAkJZ290byBmcmVlX2NoYW47CiAJaGMtPmNyZWF0ZWRbcHRdID0gMTsKQEAgLTQ4MjgsNiArNDg0OCw3IEBACiAJc3RydWN0IGhmY19tdWx0aQkqaGM7CiAJdV9sb25nCQlmbGFnczsKIAl1X2NoYXIJCWRpcHMgPSAwLCBwbWogPSAwOyAvKiBkaXAgc2V0dGluZ3MsIHBvcnQgbW9kZSBKdW1wZXJzICovCisJaW50CQlpOwogCiAJaWYgKEhGQ19jbnQgPj0gTUFYX0NBUkRTKSB7CiAJCXByaW50ayhLRVJOX0VSUiAidG9vIG1hbnkgY2FyZHMgKG1heD0lZCkuXG4iLApAQCAtNDg2MSwxMSArNDg4MiwxMSBAQAogCWhjLT5pZCA9IEhGQ19jbnQ7CiAJaGMtPnBjbSA9IHBjbVtIRkNfY250XTsKIAloYy0+aW9fbW9kZSA9IGlvbW9kZVtIRkNfY250XTsKLQlpZiAoZHNsb3RbSEZDX2NudF0gPCAwKSB7CisJaWYgKGRzbG90W0hGQ19jbnRdIDwgMCAmJiBoYy0+dHlwZSA9PSAxKSB7CiAJCWhjLT5kc2xvdCA9IDA7CiAJCXByaW50ayhLRVJOX0lORk8gIkhGQy1FMSBjYXJkIGhhcyBkaXNhYmxlZCBELWNoYW5uZWwsIGJ1dCAiCiAJCQkiMzEgQi1jaGFubmVsc1xuIik7Ci0JfSBpZiAoZHNsb3RbSEZDX2NudF0gPiAwICYmIGRzbG90W0hGQ19jbnRdIDwgMzIpIHsKKwl9IGlmIChkc2xvdFtIRkNfY250XSA+IDAgJiYgZHNsb3RbSEZDX2NudF0gPCAzMiAmJiBoYy0+dHlwZSA9PSAxKSB7CiAJCWhjLT5kc2xvdCA9IGRzbG90W0hGQ19jbnRdOwogCQlwcmludGsoS0VSTl9JTkZPICJIRkMtRTEgY2FyZCBoYXMgYWx0ZXJuYXRpbmcgRC1jaGFubmVsIG9uICIKIAkJCSJ0aW1lIHNsb3QgJWRcbiIsIGRzbG90W0hGQ19jbnRdKTsKQEAgLTQ4NzYsOSArNDg5NywxNyBAQAogCWhjLT5tYXN0ZXJjbGsgPSAtMTsKIAlpZiAodHlwZVtIRkNfY250XSAmIDB4MTAwKSB7CiAJCXRlc3RfYW5kX3NldF9iaXQoSEZDX0NISVBfVUxBVywgJmhjLT5jaGlwKTsKLQkJc2lsZW5jZSA9IDB4ZmY7IC8qIHVsYXcgc2lsZW5jZSAqLworCQloYy0+c2lsZW5jZSA9IDB4ZmY7IC8qIHVsYXcgc2lsZW5jZSAqLwogCX0gZWxzZQotCQlzaWxlbmNlID0gMHgyYTsgLyogYWxhdyBzaWxlbmNlICovCisJCWhjLT5zaWxlbmNlID0gMHgyYTsgLyogYWxhdyBzaWxlbmNlICovCisJaWYgKChwb2xsID4+IDEpID4gc2l6ZW9mKGhjLT5zaWxlbmNlX2RhdGEpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiSEZDTVVMVEkgZXJyb3I6IHNpbGVuY2VfZGF0YSB0b28gc21hbGwsICIKKwkJCSJwbGVhc2UgZml4XG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWZvciAoaSA9IDA7IGkgPCAocG9sbCA+PiAxKTsgaSsrKQorCQloYy0+c2lsZW5jZV9kYXRhW2ldID0gaGMtPnNpbGVuY2U7CisKIAlpZiAoISh0eXBlW0hGQ19jbnRdICYgMHgyMDApKQogCQl0ZXN0X2FuZF9zZXRfYml0KEhGQ19DSElQX0RUTUYsICZoYy0+Y2hpcCk7CiAKQEAgLTQ5NDUsOSArNDk3NCw3IEBACiAJc3dpdGNoIChtLT5kaXBfdHlwZSkgewogCWNhc2UgRElQXzRTOgogCQkvKgotCQkgKiBnZXQgRElQIFNldHRpbmcgZm9yIGJlcm9OZXQgMVMvMlMvNFMgY2FyZHMKLQkJICogIGNoZWNrIGlmIFBvcnQgSnVtcGVyIGNvbmZpZyBtYXRjaGVzCi0JCSAqIG1vZHVsZSBwYXJhbSAncHJvdG9jb2wnCisJCSAqIEdldCBESVAgc2V0dGluZyBmb3IgYmVyb05ldCAxUy8yUy80UyBjYXJkcwogCQkgKiBESVAgU2V0dGluZzogKGNvbGxlY3QgR1BJTyAxMy8xNC8xNSAoUl9HUElPX0lOMSkgKwogCQkgKiBHUEkgMTkvMjMgKFJfR1BJX0lOMikpCiAJCSAqLwpAQCAtNDk2Niw5ICs0OTkzLDggQEAKIAkJYnJlYWs7CiAJY2FzZSBESVBfOFM6CiAJCS8qCi0JCSAqIGdldCBESVAgU2V0dGluZyBmb3IgYmVyb05ldCA4UzArIGNhcmRzCi0JCSAqCi0JCSAqIGVuYWJsZSBQQ0kgYXV4YnJpZGdlIGZ1bmN0aW9uCisJCSAqIEdldCBESVAgU2V0dGluZyBmb3IgYmVyb05ldCA4UzArIGNhcmRzCisJCSAqIEVuYWJsZSBQQ0kgYXV4YnJpZGdlIGZ1bmN0aW9uCiAJCSAqLwogCQlIRkNfb3V0YihoYywgUl9CUkdfUENNX0NGRywgMSB8IFZfUENNX0NMSyk7CiAJCS8qIHByZXBhcmUgYWNjZXNzIHRvIGF1eHBvcnQgKi8KQEAgLTUwMDMsNiArNTAyOSwxMCBAQAogCWxpc3RfYWRkX3RhaWwoJmhjLT5saXN0LCAmSEZDbGlzdCk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmSEZDbG9jaywgZmxhZ3MpOwogCisJLyogdXNlIGFzIGNsb2NrIHNvdXJjZSAqLworCWlmIChjbG9jayA9PSBIRkNfY250ICsgMSkKKwkJaGMtPmljbG9jayA9IG1JU0ROX3JlZ2lzdGVyX2Nsb2NrKCJIRkNNdWx0aSIsIDAsIGNsb2NrY3RsLCBoYyk7CisKIAkvKiBpbml0aWFsaXplIGhhcmR3YXJlICovCiAJcmV0X2VyciA9IGluaXRfY2FyZChoYyk7CiAJaWYgKHJldF9lcnIpIHsKQEAgLTUxMzcsOCArNTE2Nyw3IEBACiAJeyBQQ0lfVkVORE9SX0lEX0NDRCwgUENJX0RFVklDRV9JRF9DQ0RfSEZDOFMsIFBDSV9WRU5ET1JfSURfQ0NELAogCVBDSV9ERVZJQ0VfSURfQ0NEX0hGQzhTLCAwLCAwLCBIKDE0KX0sIC8qIG9sZCBFdmFsICovCiAJeyBQQ0lfVkVORE9SX0lEX0NDRCwgUENJX0RFVklDRV9JRF9DQ0RfSEZDOFMsIFBDSV9WRU5ET1JfSURfQ0NELAotCVBDSV9TVUJERVZJQ0VfSURfQ0NEX0lPQjhTVFIsIDAsIDAsIEgoMTUpfSwKLQkgICAgLyogSU9COFNUIFJlY29yZGluZyAqLworCVBDSV9TVUJERVZJQ0VfSURfQ0NEX0lPQjhTVFIsIDAsIDAsIEgoMTUpfSwgLyogSU9COFNUIFJlY29yZGluZyAqLwogCXsgUENJX1ZFTkRPUl9JRF9DQ0QsIFBDSV9ERVZJQ0VfSURfQ0NEX0hGQzhTLCBQQ0lfVkVORE9SX0lEX0NDRCwKIAkJUENJX1NVQkRFVklDRV9JRF9DQ0RfSU9COFNULCAwLCAwLCBIKDE2KX0sIC8qIElPQjhTVCAgKi8KIAl7IFBDSV9WRU5ET1JfSURfQ0NELCBQQ0lfREVWSUNFX0lEX0NDRF9IRkM4UywgUENJX1ZFTkRPUl9JRF9DQ0QsCkBAIC01MTg4LDE4ICs1MjE3LDE2IEBACiAJc3RydWN0IGhtX21hcAkqbSA9IChzdHJ1Y3QgaG1fbWFwICopZW50LT5kcml2ZXJfZGF0YTsKIAlpbnQJCXJldDsKIAotCWlmIChtID09IE5VTEwpIHsKLQkJaWYgKGVudC0+dmVuZG9yID09IFBDSV9WRU5ET1JfSURfQ0NEKQotCQkJaWYgKGVudC0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfQ0NEX0hGQzRTIHx8Ci0JCQkgICAgZW50LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9DQ0RfSEZDOFMgfHwKLQkJCSAgICBlbnQtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0NDRF9IRkNFMSkKLQkJCQlwcmludGsoS0VSTl9FUlIKLQkJCQkgICAgInVua25vd24gSEZDIG11bHRpcG9ydCBjb250cm9sbGVyICIKLQkJCQkgICAgIih2ZW5kb3I6JXggZGV2aWNlOiV4IHN1YnZlbmRvcjoleCAiCi0JCQkJICAgICJzdWJkZXZpY2U6JXgpIFBsZWFzZSBjb250YWN0IHRoZSAiCi0JCQkJICAgICJkcml2ZXIgbWFpbnRhaW5lciBmb3Igc3VwcG9ydC5cbiIsCi0JCQkJICAgIGVudC0+dmVuZG9yLCBlbnQtPmRldmljZSwKLQkJCQkgICAgZW50LT5zdWJ2ZW5kb3IsIGVudC0+c3ViZGV2aWNlKTsKKwlpZiAobSA9PSBOVUxMICYmIGVudC0+dmVuZG9yID09IFBDSV9WRU5ET1JfSURfQ0NEICYmICgKKwkgICAgZW50LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9DQ0RfSEZDNFMgfHwKKwkgICAgZW50LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9DQ0RfSEZDOFMgfHwKKwkgICAgZW50LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9DQ0RfSEZDRTEpKSB7CisJCXByaW50ayhLRVJOX0VSUgorCQkgICAgIlVua25vd24gSEZDIG11bHRpcG9ydCBjb250cm9sbGVyICh2ZW5kb3I6JXggZGV2aWNlOiV4ICIKKwkJICAgICJzdWJ2ZW5kb3I6JXggc3ViZGV2aWNlOiV4KVxuIiwgZW50LT52ZW5kb3IsIGVudC0+ZGV2aWNlLAorCQkgICAgZW50LT5zdWJ2ZW5kb3IsIGVudC0+c3ViZGV2aWNlKTsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCSAgICAiUGxlYXNlIGNvbnRhY3QgdGhlIGRyaXZlciBtYWludGFpbmVyIGZvciBzdXBwb3J0LlxuIik7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIAlyZXQgPSBoZmNtdWx0aV9pbml0KHBkZXYsIGVudCk7CkBAIC01MjIyLDIyICs1MjQ5LDkgQEAKIHsKIAlzdHJ1Y3QgaGZjX211bHRpICpjYXJkLCAqbmV4dDsKIAotCS8qIHVubG9hZCBpbnRlcnJ1cHQgZnVuY3Rpb24gc3ltYm9sICovCi0JaWYgKGhmY19pbnRlcnJ1cHQpCi0JCXN5bWJvbF9wdXQoenRkdW1teV9leHRlcm5faW50ZXJydXB0KTsKLQlpZiAocmVnaXN0ZXJfaW50ZXJydXB0KQotCQlzeW1ib2xfcHV0KHp0ZHVtbXlfcmVnaXN0ZXJfaW50ZXJydXB0KTsKLQlpZiAodW5yZWdpc3Rlcl9pbnRlcnJ1cHQpIHsKLQkJaWYgKGludGVycnVwdF9yZWdpc3RlcmVkKSB7Ci0JCQlpbnRlcnJ1cHRfcmVnaXN0ZXJlZCA9IDA7Ci0JCQl1bnJlZ2lzdGVyX2ludGVycnVwdCgpOwotCQl9Ci0JCXN5bWJvbF9wdXQoenRkdW1teV91bnJlZ2lzdGVyX2ludGVycnVwdCk7Ci0JfQotCisJLyogZ2V0IHJpZCBvZiBhbGwgZGV2aWNlcyBvZiB0aGlzIGRyaXZlciAqLwogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShjYXJkLCBuZXh0LCAmSEZDbGlzdCwgbGlzdCkKIAkJcmVsZWFzZV9jYXJkKGNhcmQpOwotCS8qIGdldCByaWQgb2YgYWxsIGRldmljZXMgb2YgdGhpcyBkcml2ZXIgKi8KIAlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmhmY211bHRpcGNpX2RyaXZlcik7CiB9CiAKQEAgLTUyNDYsOCArNTI2MCwxMCBAQAogewogCWludCBlcnI7CiAKKwlwcmludGsoS0VSTl9JTkZPICJtSVNETjogSEZDLW11bHRpIGRyaXZlciAlc1xuIiwgSEZDX01VTFRJX1ZFUlNJT04pOworCiAjaWZkZWYgSVJRX0RFQlVHCi0JcHJpbnRrKEtFUk5fRVJSICIlczogSVJRX0RFQlVHIElTIEVOQUJMRUQhXG4iLCBfX2Z1bmNfXyk7CisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBJUlFfREVCVUcgSVMgRU5BQkxFRCFcbiIsIF9fZnVuY19fKTsKICNlbmRpZgogCiAJc3Bpbl9sb2NrX2luaXQoJkhGQ2xvY2spOwpAQCAtNTI1NiwyMiArNTI3MiwxMSBAQAogCWlmIChkZWJ1ZyAmIERFQlVHX0hGQ01VTFRJX0lOSVQpCiAJCXByaW50ayhLRVJOX0RFQlVHICIlczogaW5pdCBlbnRlcmVkXG4iLCBfX2Z1bmNfXyk7CiAKLQloZmNfaW50ZXJydXB0ID0gc3ltYm9sX2dldCh6dGR1bW15X2V4dGVybl9pbnRlcnJ1cHQpOwotCXJlZ2lzdGVyX2ludGVycnVwdCA9IHN5bWJvbF9nZXQoenRkdW1teV9yZWdpc3Rlcl9pbnRlcnJ1cHQpOwotCXVucmVnaXN0ZXJfaW50ZXJydXB0ID0gc3ltYm9sX2dldCh6dGR1bW15X3VucmVnaXN0ZXJfaW50ZXJydXB0KTsKLQlwcmludGsoS0VSTl9JTkZPICJtSVNETjogSEZDLW11bHRpIGRyaXZlciAlc1xuIiwKLQkgICAgaGZjbXVsdGlfcmV2aXNpb24pOwotCiAJc3dpdGNoIChwb2xsKSB7CiAJY2FzZSAwOgogCQlwb2xsX3RpbWVyID0gNjsKIAkJcG9sbCA9IDEyODsKIAkJYnJlYWs7Ci0JCS8qCi0JCSAqIHdlbm4gZGllc2VzIGJyZWFrIG5vY2htYWwgdmVyc2Nod2luZGV0LAotCQkgKiBnaWJ0IGVzIGhlaXNzZSBvaHJlbiA6LSkKLQkJICogIndpdGhvdXQgdGhlIGJyZWFrIHlvdSB3aWxsIGdldCBob3QgZWFycyA/Pz8iCi0JCSAqLwogCWNhc2UgODoKIAkJcG9sbF90aW1lciA9IDI7CiAJCWJyZWFrOwpAQCAtNTI5OCwyMCArNTMwMywxMiBAQAogCiAJfQogCisJaWYgKCFjbG9jaykKKwkJY2xvY2sgPSAxOworCiAJZXJyID0gcGNpX3JlZ2lzdGVyX2RyaXZlcigmaGZjbXVsdGlwY2lfZHJpdmVyKTsKIAlpZiAoZXJyIDwgMCkgewogCQlwcmludGsoS0VSTl9FUlIgImVycm9yIHJlZ2lzdGVyaW5nIHBjaSBkcml2ZXI6ICV4XG4iLCBlcnIpOwotCQlpZiAoaGZjX2ludGVycnVwdCkKLQkJCXN5bWJvbF9wdXQoenRkdW1teV9leHRlcm5faW50ZXJydXB0KTsKLQkJaWYgKHJlZ2lzdGVyX2ludGVycnVwdCkKLQkJCXN5bWJvbF9wdXQoenRkdW1teV9yZWdpc3Rlcl9pbnRlcnJ1cHQpOwotCQlpZiAodW5yZWdpc3Rlcl9pbnRlcnJ1cHQpIHsKLQkJCWlmIChpbnRlcnJ1cHRfcmVnaXN0ZXJlZCkgewotCQkJCWludGVycnVwdF9yZWdpc3RlcmVkID0gMDsKLQkJCQl1bnJlZ2lzdGVyX2ludGVycnVwdCgpOwotCQkJfQotCQkJc3ltYm9sX3B1dCh6dGR1bW15X3VucmVnaXN0ZXJfaW50ZXJydXB0KTsKLQkJfQogCQlyZXR1cm4gZXJyOwogCX0KIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9tSVNETi9oZmNwY2kuYyBiL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9tSVNETi9oZmNwY2kuYwppbmRleCBjZDgzMDJhLi5mMGUxNGRmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvbUlTRE4vaGZjcGNpLmMKKysrIGIvZHJpdmVycy9pc2RuL2hhcmR3YXJlL21JU0ROL2hmY3BjaS5jCkBAIC0yMyw2ICsyMywyNSBAQAogICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgogICoKKyAqIE1vZHVsZSBvcHRpb25zOgorICoKKyAqIGRlYnVnOgorICoJTk9URTogb25seSBvbmUgcG9sbCB2YWx1ZSBtdXN0IGJlIGdpdmVuIGZvciBhbGwgY2FyZHMKKyAqCVNlZSBoZmNfcGNpLmggZm9yIGRlYnVnIGZsYWdzLgorICoKKyAqIHBvbGw6CisgKglOT1RFOiBvbmx5IG9uZSBwb2xsIHZhbHVlIG11c3QgYmUgZ2l2ZW4gZm9yIGFsbCBjYXJkcworICoJR2l2ZSB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgZm9yIGVhY2ggZmlmbyBwcm9jZXNzLgorICoJQnkgZGVmYXVsdCAxMjggaXMgdXNlZC4gRGVjcmVhc2UgdG8gcmVkdWNlIGRlbGF5LCBpbmNyZWFzZSB0bworICoJcmVkdWNlIGNwdSBsb2FkLiBJZiB1bnN1cmUsIGRvbid0IG1lc3Mgd2l0aCBpdCEKKyAqCUEgdmFsdWUgb2YgMTI4IHdpbGwgdXNlIGNvbnRyb2xsZXIncyBpbnRlcnJ1cHQuIE90aGVyIHZhbHVlcyB3aWxsCisgKgl1c2Uga2VybmVsIHRpbWVyLCBiZWNhdXNlIHRoZSBjb250cm9sbGVyIHdpbGwgbm90IGFsbG93IGxvd2VyIHZhbHVlcworICoJdGhhbiAxMjguCisgKglBbHNvIG5vdGUgdGhhdCB0aGUgdmFsdWUgZGVwZW5kcyBvbiB0aGUga2VybmVsIHRpbWVyIGZyZXF1ZW5jeS4KKyAqCUlmIGtlcm5lbCB1c2VzIGEgZnJlcXVlbmN5IG9mIDEwMDAgSHosIHN0ZXBzIG9mIDggc2FtcGxlcyBhcmUgcG9zc2libGUuCisgKglJZiB0aGUga2VybmVsIHVzZXMgMTAwIEh6LCBzdGVwcyBvZiA4MCBzYW1wbGVzIGFyZSBwb3NzaWJsZS4KKyAqCUlmIHRoZSBrZXJuZWwgdXNlcyAzMDAgSHosIHN0ZXBzIG9mIGFib3V0IDI2IHNhbXBsZXMgYXJlIHBvc3NpYmxlLgorICoKICAqLwogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CkBAIC0zNCwxNiArNTMsMTYgQEAKIAogc3RhdGljIGNvbnN0IGNoYXIgKmhmY3BjaV9yZXZpc2lvbiA9ICIyLjAiOwogCi0jZGVmaW5lIE1BWF9DQVJEUwk4CiBzdGF0aWMgaW50IEhGQ19jbnQ7CiBzdGF0aWMgdWludCBkZWJ1ZzsKK3N0YXRpYyB1aW50IHBvbGwsIHRpY3M7CitzdHJ1Y3QgdGltZXJfbGlzdCBoZmNfdGw7Cit1MzIJaGZjX2ppZmZpZXM7CiAKIE1PRFVMRV9BVVRIT1IoIkthcnN0ZW4gS2VpbCIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotbW9kdWxlX3BhcmFtKGRlYnVnLCB1aW50LCAwKTsKLQotc3RhdGljIExJU1RfSEVBRChIRkNsaXN0KTsKLXN0YXRpYyBERUZJTkVfUldMT0NLKEhGQ2xvY2spOworbW9kdWxlX3BhcmFtKGRlYnVnLCB1aW50LCBTX0lSVUdPIHwgU19JV1VTUik7Cittb2R1bGVfcGFyYW0ocG9sbCwgdWludCwgU19JUlVHTyB8IFNfSVdVU1IpOwogCiBlbnVtIHsKIAlIRkNfQ0NEXzJCRDAsCkBAIC0xMTQsNyArMTMzLDYgQEAKIAogCiBzdHJ1Y3QgaGZjX3BjaSB7Ci0Jc3RydWN0IGxpc3RfaGVhZAlsaXN0OwogCXVfY2hhcgkJCXN1YnR5cGU7CiAJdV9jaGFyCQkJY2hhbmxpbWl0OwogCXVfY2hhcgkJCWluaXRkb25lOwpAQCAtNTIwLDkgKzUzOCw5IEBACiB9CiAKIC8qCi0gKiBjaGVjayBmb3IgdHJhbnNwYXJlbnQgcmVjZWl2ZSBkYXRhIGFuZCByZWFkIG1heCBvbmUgdGhyZXNob2xkIHNpemUgaWYgYXZhaWwKKyAqIGNoZWNrIGZvciB0cmFuc3BhcmVudCByZWNlaXZlIGRhdGEgYW5kIHJlYWQgbWF4IG9uZSAncG9sbCcgc2l6ZSBpZiBhdmFpbAogICovCi1zdGF0aWMgaW50CitzdGF0aWMgdm9pZAogaGZjcGNpX2VtcHR5X2ZpZm9fdHJhbnMoc3RydWN0IGJjaGFubmVsICpiY2gsIHN0cnVjdCBiemZpZm8gKmJ6LCB1X2NoYXIgKmJkYXRhKQogewogCSBfX2xlMTYgKnoxciwgKnoycjsKQEAgLTUzNCwxNyArNTUyLDE5IEBACiAKIAlmY250ID0gbGUxNl90b19jcHUoKnoxcikgLSBsZTE2X3RvX2NwdSgqejJyKTsKIAlpZiAoIWZjbnQpCi0JCXJldHVybiAwOwkvKiBubyBkYXRhIGF2YWlsICovCisJCXJldHVybjsJLyogbm8gZGF0YSBhdmFpbCAqLwogCiAJaWYgKGZjbnQgPD0gMCkKIAkJZmNudCArPSBCX0ZJRk9fU0laRTsJLyogYnl0ZXMgYWN0dWFsbHkgYnVmZmVyZWQgKi8KLQlpZiAoZmNudCA+IEhGQ1BDSV9CVFJBTlNfVEhSRVNIT0xEKQotCQlmY250ID0gSEZDUENJX0JUUkFOU19USFJFU0hPTEQ7CQkvKiBsaW1pdCBzaXplICovCi0KIAluZXdfejIgPSBsZTE2X3RvX2NwdSgqejJyKSArIGZjbnQ7CS8qIG5ldyBwb3NpdGlvbiBpbiBmaWZvICovCiAJaWYgKG5ld196MiA+PSAoQl9GSUZPX1NJWkUgKyBCX1NVQl9WQUwpKQogCQluZXdfejIgLT0gQl9GSUZPX1NJWkU7CS8qIGJ1ZmZlciB3cmFwICovCiAKKwlpZiAoZmNudCA+IE1BWF9EQVRBX1NJWkUpIHsJLyogZmx1c2gsIGlmIG92ZXJzaXplZCAqLworCQkqejJyID0gY3B1X3RvX2xlMTYobmV3X3oyKTsJCS8qIG5ldyBwb3NpdGlvbiAqLworCQlyZXR1cm47CisJfQorCiAJYmNoLT5yeF9za2IgPSBtSV9hbGxvY19za2IoZmNudCwgR0ZQX0FUT01JQyk7CiAJaWYgKGJjaC0+cnhfc2tiKSB7CiAJCXB0ciA9IHNrYl9wdXQoYmNoLT5yeF9za2IsIGZjbnQpOwpAQCAtNTY5LDcgKzU4OSw2IEBACiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIkhGQ1BDSTogcmVjZWl2ZSBvdXQgb2YgbWVtb3J5XG4iKTsKIAogCSp6MnIgPSBjcHVfdG9fbGUxNihuZXdfejIpOwkJLyogbmV3IHBvc2l0aW9uICovCi0JcmV0dXJuIDE7CiB9CiAKIC8qCkBAIC01ODAsMTIgKzU5OSwxMSBAQAogewogCXN0cnVjdCBoZmNfcGNpCSpoYyA9IGJjaC0+aHc7CiAJaW50CQlyY250LCByZWFsX2ZpZm87Ci0JaW50CQlyZWNlaXZlLCBjb3VudCA9IDU7CisJaW50CQlyZWNlaXZlID0gMCwgY291bnQgPSA1OwogCXN0cnVjdCBiemZpZm8JKmJ6OwogCXVfY2hhcgkJKmJkYXRhOwogCXN0cnVjdCB6dAkqenA7CiAKLQogCWlmICgoYmNoLT5uciAmIDIpICYmICghaGMtPmh3LmJzd2FwcGVkKSkgewogCQlieiA9ICYoKHVuaW9uIGZpZm9fYXJlYSAqKShoYy0+aHcuZmlmb3MpKS0+Yl9jaGFucy5yeGJ6X2IyOwogCQliZGF0YSA9ICgodW5pb24gZmlmb19hcmVhICopKGhjLT5ody5maWZvcykpLT5iX2NoYW5zLnJ4ZGF0X2IyOwpAQCAtNjI1LDkgKzY0MywxMCBAQAogCQkJcmVjZWl2ZSA9IDE7CiAJCWVsc2UKIAkJCXJlY2VpdmUgPSAwOwotCX0gZWxzZSBpZiAodGVzdF9iaXQoRkxHX1RSQU5TUEFSRU5ULCAmYmNoLT5GbGFncykpCi0JCXJlY2VpdmUgPSBoZmNwY2lfZW1wdHlfZmlmb190cmFucyhiY2gsIGJ6LCBiZGF0YSk7Ci0JZWxzZQorCX0gZWxzZSBpZiAodGVzdF9iaXQoRkxHX1RSQU5TUEFSRU5ULCAmYmNoLT5GbGFncykpIHsKKwkJaGZjcGNpX2VtcHR5X2ZpZm9fdHJhbnMoYmNoLCBieiwgYmRhdGEpOworCQlyZXR1cm47CisJfSBlbHNlCiAJCXJlY2VpdmUgPSAwOwogCWlmIChjb3VudCAmJiByZWNlaXZlKQogCQlnb3RvIEJlZ2luOwpAQCAtNzUxLDExICs3NzAsNDEgQEAKIAkJCSAgICAvKiBmY250IGNvbnRhaW5zIGF2YWlsYWJsZSBieXRlcyBpbiBmaWZvICovCiAJCWZjbnQgPSBCX0ZJRk9fU0laRSAtIGZjbnQ7CiAJCSAgICAvKiByZW1haW5pbmcgYnl0ZXMgdG8gc2VuZCAoYnl0ZXMgaW4gZmlmbykgKi8KKworCQkvKiAiZmlsbCBmaWZvIGlmIGVtcHR5IiBmZWF0dXJlICovCisJCWlmICh0ZXN0X2JpdChGTEdfRklMTEVNUFRZLCAmYmNoLT5GbGFncykgJiYgIWZjbnQpIHsKKwkJCS8qIHByaW50ayhLRVJOX0RFQlVHICIlczogYnVmZmVyIGVtcHR5LCBzbyB3ZSBoYXZlICIKKwkJCQkidW5kZXJydW5cbiIsIF9fZnVuY19fKTsgKi8KKwkJCS8qIGZpbGwgYnVmZmVyLCB0byBwcmV2ZW50IGZ1dHVyZSB1bmRlcnJ1biAqLworCQkJY291bnQgPSBIRkNQQ0lfRklMTEVNUFRZOworCQkJbmV3X3oxID0gbGUxNl90b19jcHUoKnoxdCkgKyBjb3VudDsKKwkJCSAgIC8qIG5ldyBidWZmZXIgUG9zaXRpb24gKi8KKwkJCWlmIChuZXdfejEgPj0gKEJfRklGT19TSVpFICsgQl9TVUJfVkFMKSkKKwkJCQluZXdfejEgLT0gQl9GSUZPX1NJWkU7CS8qIGJ1ZmZlciB3cmFwICovCisJCQlkc3QgPSBiZGF0YSArIChsZTE2X3RvX2NwdSgqejF0KSAtIEJfU1VCX1ZBTCk7CisJCQltYXhsZW4gPSAoQl9GSUZPX1NJWkUgKyBCX1NVQl9WQUwpIC0gbGUxNl90b19jcHUoKnoxdCk7CisJCQkgICAgLyogZW5kIG9mIGZpZm8gKi8KKwkJCWlmIChiY2gtPmRlYnVnICYgREVCVUdfSFdfQkZJRk8pCisJCQkJcHJpbnRrKEtFUk5fREVCVUcgImhmY3BjaV9GRnQgZmlsbGVtcHR5ICIKKwkJCQkgICAgImZjbnQoJWQpIG1heGwoJWQpIG56MSgleCkgZHN0KCVwKVxuIiwKKwkJCQkgICAgZmNudCwgbWF4bGVuLCBuZXdfejEsIGRzdCk7CisJCQlmY250ICs9IGNvdW50OworCQkJaWYgKG1heGxlbiA+IGNvdW50KQorCQkJCW1heGxlbiA9IGNvdW50OyAJLyogbGltaXQgc2l6ZSAqLworCQkJbWVtc2V0KGRzdCwgMHgyYSwgbWF4bGVuKTsJLyogZmlyc3QgY29weSAqLworCQkJY291bnQgLT0gbWF4bGVuOwkJLyogcmVtYWluaW5nIGJ5dGVzICovCisJCQlpZiAoY291bnQpIHsKKwkJCQlkc3QgPSBiZGF0YTsJCS8qIHN0YXJ0IG9mIGJ1ZmZlciAqLworCQkJCW1lbXNldChkc3QsIDB4MmEsIGNvdW50KTsKKwkJCX0KKwkJCSp6MXQgPSBjcHVfdG9fbGUxNihuZXdfejEpOwkvKiBub3cgc2VuZCBkYXRhICovCisJCX0KKwogbmV4dF90X2ZyYW1lOgogCQljb3VudCA9IGJjaC0+dHhfc2tiLT5sZW4gLSBiY2gtPnR4X2lkeDsKLQkJLyogbWF4aW11bSBmaWxsIHNoYWxsIGJlIEhGQ1BDSV9CVFJBTlNfTUFYICovCi0JCWlmIChjb3VudCA+IEhGQ1BDSV9CVFJBTlNfTUFYIC0gZmNudCkKLQkJCWNvdW50ID0gSEZDUENJX0JUUkFOU19NQVggLSBmY250OworCQkvKiBtYXhpbXVtIGZpbGwgc2hhbGwgYmUgcG9sbCoyICovCisJCWlmIChjb3VudCA+IChwb2xsIDw8IDEpIC0gZmNudCkKKwkJCWNvdW50ID0gKHBvbGwgPDwgMSkgLSBmY250OwogCQlpZiAoY291bnQgPD0gMCkKIAkJCXJldHVybjsKIAkJLyogZGF0YSBpcyBzdWl0YWJsZSBmb3IgZmlmbyAqLwpAQCAtMTEzNSwzNyArMTE4NCwzNyBAQAogCQl2YWwgJj0gfjB4ODA7CiAJCVdyaXRlX2hmYyhoYywgSEZDUENJX0NUTVQsIGhjLT5ody5jdG10IHwgSEZDUENJX0NMVElNRVIpOwogCX0KLQlpZiAodmFsICYgMHgwOCkgeworCWlmICh2YWwgJiAweDA4KSB7IAkvKiBCMSByeCAqLwogCQliY2ggPSBTZWxfQkNTKGhjLCBoYy0+aHcuYnN3YXBwZWQgPyAyIDogMSk7CiAJCWlmIChiY2gpCiAJCQltYWluX3JlY19oZmNwY2koYmNoKTsKIAkJZWxzZSBpZiAoaGMtPmRjaC5kZWJ1ZykKIAkJCXByaW50ayhLRVJOX0RFQlVHICJoZmNwY2kgc3B1cmlvdXMgMHgwOCBJUlFcbiIpOwogCX0KLQlpZiAodmFsICYgMHgxMCkgeworCWlmICh2YWwgJiAweDEwKSB7CS8qIEIyIHJ4ICovCiAJCWJjaCA9IFNlbF9CQ1MoaGMsIDIpOwogCQlpZiAoYmNoKQogCQkJbWFpbl9yZWNfaGZjcGNpKGJjaCk7CiAJCWVsc2UgaWYgKGhjLT5kY2guZGVidWcpCiAJCQlwcmludGsoS0VSTl9ERUJVRyAiaGZjcGNpIHNwdXJpb3VzIDB4MTAgSVJRXG4iKTsKIAl9Ci0JaWYgKHZhbCAmIDB4MDEpIHsKKwlpZiAodmFsICYgMHgwMSkgewkvKiBCMSB0eCAqLwogCQliY2ggPSBTZWxfQkNTKGhjLCBoYy0+aHcuYnN3YXBwZWQgPyAyIDogMSk7CiAJCWlmIChiY2gpCiAJCQl0eF9iaXJxKGJjaCk7CiAJCWVsc2UgaWYgKGhjLT5kY2guZGVidWcpCiAJCQlwcmludGsoS0VSTl9ERUJVRyAiaGZjcGNpIHNwdXJpb3VzIDB4MDEgSVJRXG4iKTsKIAl9Ci0JaWYgKHZhbCAmIDB4MDIpIHsKKwlpZiAodmFsICYgMHgwMikgewkvKiBCMiB0eCAqLwogCQliY2ggPSBTZWxfQkNTKGhjLCAyKTsKIAkJaWYgKGJjaCkKIAkJCXR4X2JpcnEoYmNoKTsKIAkJZWxzZSBpZiAoaGMtPmRjaC5kZWJ1ZykKIAkJCXByaW50ayhLRVJOX0RFQlVHICJoZmNwY2kgc3B1cmlvdXMgMHgwMiBJUlFcbiIpOwogCX0KLQlpZiAodmFsICYgMHgyMCkKKwlpZiAodmFsICYgMHgyMCkJCS8qIEQgcnggKi8KIAkJcmVjZWl2ZV9kbXNnKGhjKTsKLQlpZiAodmFsICYgMHgwNCkgewkvKiBkZnJhbWUgdHJhbnNtaXR0ZWQgKi8KKwlpZiAodmFsICYgMHgwNCkgewkvKiBEIHR4ICovCiAJCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoRkxHX0JVU1lfVElNRVIsICZoYy0+ZGNoLkZsYWdzKSkKIAkJCWRlbF90aW1lcigmaGMtPmRjaC50aW1lcik7CiAJCXR4X2RpcnEoJmhjLT5kY2gpOwpAQCAtMTI4MywxNCArMTMzMiwxNiBAQAogCQl9CiAJCWlmIChmaWZvMiAmIDIpIHsKIAkJCWhjLT5ody5maWZvX2VuIHw9IEhGQ1BDSV9GSUZPRU5fQjI7Ci0JCQloYy0+aHcuaW50X20xIHw9IChIRkNQQ0lfSU5UU19CMlRSQU5TICsKLQkJCSAgICBIRkNQQ0lfSU5UU19CMlJFQyk7CisJCQlpZiAoIXRpY3MpCisJCQkJaGMtPmh3LmludF9tMSB8PSAoSEZDUENJX0lOVFNfQjJUUkFOUyArCisJCQkJICAgIEhGQ1BDSV9JTlRTX0IyUkVDKTsKIAkJCWhjLT5ody5jdG10IHw9IDI7CiAJCQloYy0+aHcuY29ubiAmPSB+MHgxODsKIAkJfSBlbHNlIHsKIAkJCWhjLT5ody5maWZvX2VuIHw9IEhGQ1BDSV9GSUZPRU5fQjE7Ci0JCQloYy0+aHcuaW50X20xIHw9IChIRkNQQ0lfSU5UU19CMVRSQU5TICsKLQkJCSAgICBIRkNQQ0lfSU5UU19CMVJFQyk7CisJCQlpZiAoIXRpY3MpCisJCQkJaGMtPmh3LmludF9tMSB8PSAoSEZDUENJX0lOVFNfQjFUUkFOUyArCisJCQkJICAgIEhGQ1BDSV9JTlRTX0IxUkVDKTsKIAkJCWhjLT5ody5jdG10IHw9IDE7CiAJCQloYy0+aHcuY29ubiAmPSB+MHgwMzsKIAkJfQpAQCAtMTM5OCw3ICsxNDQ5LDggQEAKIAkJaWYgKGNoYW4gJiAyKSB7CiAJCQloYy0+aHcuc2N0cmxfciB8PSBTQ1RSTF9CMl9FTkE7CiAJCQloYy0+aHcuZmlmb19lbiB8PSBIRkNQQ0lfRklGT0VOX0IyUlg7Ci0JCQloYy0+aHcuaW50X20xIHw9IEhGQ1BDSV9JTlRTX0IyUkVDOworCQkJaWYgKCF0aWNzKQorCQkJCWhjLT5ody5pbnRfbTEgfD0gSEZDUENJX0lOVFNfQjJSRUM7CiAJCQloYy0+aHcuY3RtdCB8PSAyOwogCQkJaGMtPmh3LmNvbm4gJj0gfjB4MTg7CiAjaWZkZWYgUkVWRVJTRV9CSVRPUkRFUgpAQCAtMTQwNyw3ICsxNDU5LDggQEAKIAkJfSBlbHNlIHsKIAkJCWhjLT5ody5zY3RybF9yIHw9IFNDVFJMX0IxX0VOQTsKIAkJCWhjLT5ody5maWZvX2VuIHw9IEhGQ1BDSV9GSUZPRU5fQjFSWDsKLQkJCWhjLT5ody5pbnRfbTEgfD0gSEZDUENJX0lOVFNfQjFSRUM7CisJCQlpZiAoIXRpY3MpCisJCQkJaGMtPmh3LmludF9tMSB8PSBIRkNQQ0lfSU5UU19CMVJFQzsKIAkJCWhjLT5ody5jdG10IHw9IDE7CiAJCQloYy0+aHcuY29ubiAmPSB+MHgwMzsKICNpZmRlZiBSRVZFUlNFX0JJVE9SREVSCkBAIC0xNDgxLDExICsxNTM0LDE3IEBACiBzdGF0aWMgaW50CiBjaGFubmVsX2JjdHJsKHN0cnVjdCBiY2hhbm5lbCAqYmNoLCBzdHJ1Y3QgbUlTRE5fY3RybF9yZXEgKmNxKQogewotCWludAkJCXJldCA9IDA7CisJaW50CXJldCA9IDA7CiAKIAlzd2l0Y2ggKGNxLT5vcCkgewogCWNhc2UgTUlTRE5fQ1RSTF9HRVRPUDoKLQkJY3EtPm9wID0gMDsKKwkJY3EtPm9wID0gTUlTRE5fQ1RSTF9GSUxMX0VNUFRZOworCQlicmVhazsKKwljYXNlIE1JU0ROX0NUUkxfRklMTF9FTVBUWTogLyogZmlsbCBmaWZvLCBpZiBlbXB0eSAqLworCQl0ZXN0X2FuZF9zZXRfYml0KEZMR19GSUxMRU1QVFksICZiY2gtPkZsYWdzKTsKKwkJaWYgKGRlYnVnICYgREVCVUdfSFdfT1BFTikKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlczogRklMTF9FTVBUWSByZXF1ZXN0IChucj0lZCAiCisJCQkJIm9mZj0lZClcbiIsIF9fZnVuY19fLCBiY2gtPm5yLCAhIWNxLT5wMSk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiB1bmtub3duIE9wICV4XG4iLCBfX2Z1bmNfXywgY3EtPm9wKTsKQEAgLTE4NTksNiArMTkxOCwxMCBAQAogCQkgICAgaGMtPmRjaC5kZXYuaWQsIF9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcygwKSk7CiAJaWYgKHJxLT5wcm90b2NvbCA9PSBJU0ROX1BfTk9ORSkKIAkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKHJxLT5hZHIuY2hhbm5lbCA9PSAxKSB7CisJCS8qIFRPRE86IEUtQ2hhbm5lbCAqLworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CiAJaWYgKCFoYy0+aW5pdGRvbmUpIHsKIAkJaWYgKHJxLT5wcm90b2NvbCA9PSBJU0ROX1BfVEVfUzApIHsKIAkJCWVyciA9IGNyZWF0ZV9sMSgmaGMtPmRjaCwgaGZjX2wxY2FsbGJhY2spOwpAQCAtMTg3NCw2ICsxOTM3LDExIEBACiAJCWlmIChycS0+cHJvdG9jb2wgIT0gY2gtPnByb3RvY29sKSB7CiAJCQlpZiAoaGMtPmh3LnByb3RvY29sID09IElTRE5fUF9URV9TMCkKIAkJCQlsMV9ldmVudChoYy0+ZGNoLmwxLCBDTE9TRV9DSEFOTkVMKTsKKwkJCWlmIChycS0+cHJvdG9jb2wgPT0gSVNETl9QX1RFX1MwKSB7CisJCQkJZXJyID0gY3JlYXRlX2wxKCZoYy0+ZGNoLCBoZmNfbDFjYWxsYmFjayk7CisJCQkJaWYgKGVycikKKwkJCQkJcmV0dXJuIGVycjsKKwkJCX0KIAkJCWhjLT5ody5wcm90b2NvbCA9IHJxLT5wcm90b2NvbDsKIAkJCWNoLT5wcm90b2NvbCA9IHJxLT5wcm90b2NvbDsKIAkJCWhmY3BjaV9zZXRtb2RlKGhjKTsKQEAgLTE5MDMsNiArMTk3MSw3IEBACiAJYmNoID0gJmhjLT5iY2hbcnEtPmFkci5jaGFubmVsIC0gMV07CiAJaWYgKHRlc3RfYW5kX3NldF9iaXQoRkxHX09QRU4sICZiY2gtPkZsYWdzKSkKIAkJcmV0dXJuIC1FQlVTWTsgLyogYi1jaGFubmVsIGNhbiBiZSBvbmx5IG9wZW4gb25jZSAqLworCXRlc3RfYW5kX2NsZWFyX2JpdChGTEdfRklMTEVNUFRZLCAmYmNoLT5GbGFncyk7CiAJYmNoLT5jaC5wcm90b2NvbCA9IHJxLT5wcm90b2NvbDsKIAlycS0+Y2ggPSAmYmNoLT5jaDsgLyogVE9ETzogRS1jaGFubmVsICovCiAJaWYgKCF0cnlfbW9kdWxlX2dldChUSElTX01PRFVMRSkpCkBAIC0xOTI4LDcgKzE5OTcsOCBAQAogCXN3aXRjaCAoY21kKSB7CiAJY2FzZSBPUEVOX0NIQU5ORUw6CiAJCXJxID0gYXJnOwotCQlpZiAocnEtPmFkci5jaGFubmVsID09IDApCisJCWlmICgocnEtPnByb3RvY29sID09IElTRE5fUF9URV9TMCkgfHwKKwkJICAgIChycS0+cHJvdG9jb2wgPT0gSVNETl9QX05UX1MwKSkKIAkJCWVyciA9IG9wZW5fZGNoYW5uZWwoaGMsIGNoLCBycSk7CiAJCWVsc2UKIAkJCWVyciA9IG9wZW5fYmNoYW5uZWwoaGMsIHJxKTsKQEAgLTIwMjcsNyArMjA5Nyw2IEBACiAJbUlTRE5fZnJlZWJjaGFubmVsKCZoYy0+YmNoWzFdKTsKIAltSVNETl9mcmVlYmNoYW5uZWwoJmhjLT5iY2hbMF0pOwogCW1JU0ROX2ZyZWVkY2hhbm5lbCgmaGMtPmRjaCk7Ci0JbGlzdF9kZWwoJmhjLT5saXN0KTsKIAlwY2lfc2V0X2RydmRhdGEoaGMtPnBkZXYsIE5VTEwpOwogCWtmcmVlKGhjKTsKIH0KQEAgLTIwMzcsMTIgKzIxMDYsOCBAQAogewogCWludAkJZXJyID0gLUVJTlZBTDsKIAl1X2ludAkJaTsKLQl1X2xvbmcJCWZsYWdzOwogCWNoYXIJCW5hbWVbTUlTRE5fTUFYX0lETEVOXTsKIAotCWlmIChIRkNfY250ID49IE1BWF9DQVJEUykKLQkJcmV0dXJuIC1FSU5WQUw7IC8qIG1heWJlIGJldHRlciB2YWx1ZSAqLwotCiAJY2FyZC0+ZGNoLmRlYnVnID0gZGVidWc7CiAJc3Bpbl9sb2NrX2luaXQoJmNhcmQtPmxvY2spOwogCW1JU0ROX2luaXRkY2hhbm5lbCgmY2FyZC0+ZGNoLCBNQVhfREZSQU1FX0xFTl9MMSwgcGhfc3RhdGUpOwpAQCAtMjA2OCwxMyArMjEzMywxMCBAQAogCWlmIChlcnIpCiAJCWdvdG8gZXJyb3I7CiAJc25wcmludGYobmFtZSwgTUlTRE5fTUFYX0lETEVOIC0gMSwgImhmYy1wY2kuJWQiLCBIRkNfY250ICsgMSk7Ci0JZXJyID0gbUlTRE5fcmVnaXN0ZXJfZGV2aWNlKCZjYXJkLT5kY2guZGV2LCBuYW1lKTsKKwllcnIgPSBtSVNETl9yZWdpc3Rlcl9kZXZpY2UoJmNhcmQtPmRjaC5kZXYsICZjYXJkLT5wZGV2LT5kZXYsIG5hbWUpOwogCWlmIChlcnIpCiAJCWdvdG8gZXJyb3I7CiAJSEZDX2NudCsrOwotCXdyaXRlX2xvY2tfaXJxc2F2ZSgmSEZDbG9jaywgZmxhZ3MpOwotCWxpc3RfYWRkX3RhaWwoJmNhcmQtPmxpc3QsICZIRkNsaXN0KTsKLQl3cml0ZV91bmxvY2tfaXJxcmVzdG9yZSgmSEZDbG9jaywgZmxhZ3MpOwogCXByaW50ayhLRVJOX0lORk8gIkhGQyAlZCBjYXJkcyBpbnN0YWxsZWRcbiIsIEhGQ19jbnQpOwogCXJldHVybiAwOwogZXJyb3I6CkBAIC0yMjEwLDE1ICsyMjcyLDEyIEBACiBoZmNfcmVtb3ZlX3BjaShzdHJ1Y3QgcGNpX2RldiAqcGRldikKIHsKIAlzdHJ1Y3QgaGZjX3BjaQkqY2FyZCA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQl1X2xvbmcJCWZsYWdzOwogCi0JaWYgKGNhcmQpIHsKLQkJd3JpdGVfbG9ja19pcnFzYXZlKCZIRkNsb2NrLCBmbGFncyk7CisJaWYgKGNhcmQpCiAJCXJlbGVhc2VfY2FyZChjYXJkKTsKLQkJd3JpdGVfdW5sb2NrX2lycXJlc3RvcmUoJkhGQ2xvY2ssIGZsYWdzKTsKLQl9IGVsc2UKKwllbHNlCiAJCWlmIChkZWJ1ZykKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBkcnZkYXRhIGFsbHJlYWR5IHJlbW92ZWRcbiIsCisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogZHJ2ZGF0YSBhbHJlYWR5IHJlbW92ZWRcbiIsCiAJCQkgICAgX19mdW5jX18pOwogfQogCkBAIC0yMjMwLDI1ICsyMjg5LDk3IEBACiAJLmlkX3RhYmxlID0gaGZjX2lkcywKIH07CiAKK3N0YXRpYyBpbnQKK19oZmNwY2lfc29mdGlycShzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgaGZjX3BjaSAgKmhjID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGJjaGFubmVsICpiY2g7CisJaWYgKGhjID09IE5VTEwpCisJCXJldHVybiAwOworCisJaWYgKGhjLT5ody5pbnRfbTIgJiBIRkNQQ0lfSVJRX0VOQUJMRSkgeworCQlzcGluX2xvY2soJmhjLT5sb2NrKTsKKwkJYmNoID0gU2VsX0JDUyhoYywgaGMtPmh3LmJzd2FwcGVkID8gMiA6IDEpOworCQlpZiAoYmNoICYmIGJjaC0+c3RhdGUgPT0gSVNETl9QX0JfUkFXKSB7IC8qIEIxIHJ4JnR4ICovCisJCQltYWluX3JlY19oZmNwY2koYmNoKTsKKwkJCXR4X2JpcnEoYmNoKTsKKwkJfQorCQliY2ggPSBTZWxfQkNTKGhjLCBoYy0+aHcuYnN3YXBwZWQgPyAxIDogMik7CisJCWlmIChiY2ggJiYgYmNoLT5zdGF0ZSA9PSBJU0ROX1BfQl9SQVcpIHsgLyogQjIgcngmdHggKi8KKwkJCW1haW5fcmVjX2hmY3BjaShiY2gpOworCQkJdHhfYmlycShiY2gpOworCQl9CisJCXNwaW5fdW5sb2NrKCZoYy0+bG9jayk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAoraGZjcGNpX3NvZnRpcnEodm9pZCAqYXJnKQoreworCSh2b2lkKSBkcml2ZXJfZm9yX2VhY2hfZGV2aWNlKCZoZmNfZHJpdmVyLmRyaXZlciwgTlVMTCwgYXJnLAorCQkJCQlfaGZjcGNpX3NvZnRpcnEpOworCisJLyogaWYgbmV4dCBldmVudCB3b3VsZCBiZSBpbiB0aGUgcGFzdCAuLi4gKi8KKwlpZiAoKHMzMikoaGZjX2ppZmZpZXMgKyB0aWNzIC0gamlmZmllcykgPD0gMCkKKwkJaGZjX2ppZmZpZXMgPSBqaWZmaWVzICsgMTsKKwllbHNlCisJCWhmY19qaWZmaWVzICs9IHRpY3M7CisJaGZjX3RsLmV4cGlyZXMgPSBoZmNfamlmZmllczsKKwlhZGRfdGltZXIoJmhmY190bCk7Cit9CisKIHN0YXRpYyBpbnQgX19pbml0CiBIRkNfaW5pdCh2b2lkKQogewogCWludAkJZXJyOwogCisJaWYgKCFwb2xsKQorCQlwb2xsID0gSEZDUENJX0JUUkFOU19USFJFU0hPTEQ7CisKKwlpZiAocG9sbCAhPSBIRkNQQ0lfQlRSQU5TX1RIUkVTSE9MRCkgeworCQl0aWNzID0gKHBvbGwgKiBIWikgLyA4MDAwOworCQlpZiAodGljcyA8IDEpCisJCQl0aWNzID0gMTsKKwkJcG9sbCA9ICh0aWNzICogODAwMCkgLyBIWjsKKwkJaWYgKHBvbGwgPiAyNTYgfHwgcG9sbCA8IDgpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IFdyb25nIHBvbGwgdmFsdWUgJWQgbm90IGluIHJhbmdlICIKKwkJCQkib2YgOC4uMjU2LlxuIiwgX19mdW5jX18sIHBvbGwpOworCQkJZXJyID0gLUVJTlZBTDsKKwkJCXJldHVybiBlcnI7CisJCX0KKwl9CisJaWYgKHBvbGwgIT0gSEZDUENJX0JUUkFOU19USFJFU0hPTEQpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFVzaW5nIGFsdGVybmF0aXZlIHBvbGwgdmFsdWUgb2YgJWRcbiIsCisJCQlfX2Z1bmNfXywgcG9sbCk7CisJCWhmY190bC5mdW5jdGlvbiA9ICh2b2lkICopaGZjcGNpX3NvZnRpcnE7CisJCWhmY190bC5kYXRhID0gMDsKKwkJaW5pdF90aW1lcigmaGZjX3RsKTsKKwkJaGZjX3RsLmV4cGlyZXMgPSBqaWZmaWVzICsgdGljczsKKwkJaGZjX2ppZmZpZXMgPSBoZmNfdGwuZXhwaXJlczsKKwkJYWRkX3RpbWVyKCZoZmNfdGwpOworCX0gZWxzZQorCQl0aWNzID0gMDsgLyogaW5kaWNhdGUgdGhlIHVzZSBvZiBjb250cm9sbGVyJ3MgdGltZXIgKi8KKwogCWVyciA9IHBjaV9yZWdpc3Rlcl9kcml2ZXIoJmhmY19kcml2ZXIpOworCWlmIChlcnIpIHsKKwkJaWYgKHRpbWVyX3BlbmRpbmcoJmhmY190bCkpCisJCQlkZWxfdGltZXIoJmhmY190bCk7CisJfQorCiAJcmV0dXJuIGVycjsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0CiBIRkNfY2xlYW51cCh2b2lkKQogewotCXN0cnVjdCBoZmNfcGNpCSpjYXJkLCAqbmV4dDsKKwlpZiAodGltZXJfcGVuZGluZygmaGZjX3RsKSkKKwkJZGVsX3RpbWVyKCZoZmNfdGwpOwogCi0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGNhcmQsIG5leHQsICZIRkNsaXN0LCBsaXN0KSB7Ci0JCXJlbGVhc2VfY2FyZChjYXJkKTsKLQl9CiAJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZoZmNfZHJpdmVyKTsKIH0KIAogbW9kdWxlX2luaXQoSEZDX2luaXQpOwogbW9kdWxlX2V4aXQoSEZDX2NsZWFudXApOworCitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgaGZjX2lkcyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvbUlTRE4vaGZjc3VzYi5jIGIvZHJpdmVycy9pc2RuL2hhcmR3YXJlL21JU0ROL2hmY3N1c2IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTY5MjVmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pc2RuL2hhcmR3YXJlL21JU0ROL2hmY3N1c2IuYwpAQCAtMCwwICsxLDIxOTYgQEAKKy8qIGhmY3N1c2IuYworICogbUlTRE4gZHJpdmVyIGZvciBDb2xvZ25lY2hpcCBIRkMtUyBVU0IgY2hpcAorICoKKyAqIENvcHlyaWdodCAyMDAxIGJ5IFBldGVyIFNwcmVuZ2VyIChzcHJlbmdlckBtb3ZpbmctYnl0ZXMuZGUpCisgKiBDb3B5cmlnaHQgMjAwOCBieSBNYXJ0aW4gQmFjaGVtIChpbmZvQGJhY2hlbS1pdC5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKgorICoKKyAqIG1vZHVsZSBwYXJhbXMKKyAqICAgZGVidWc9PG4+LCBkZWZhdWx0PTAsIHdpdGggbj0weEhISEhHR0dHCisgKiAgICAgIEggLSBsMSBkcml2ZXIgZmxhZ3MgZGVzY3JpYmVkIGluIGhmY3N1c2IuaAorICogICAgICBHIC0gY29tbW9uIG1JU0ROIGRlYnVnIGZsYWdzIGRlc2NyaWJlZCBhdCBtSVNETmh3LmgKKyAqCisgKiAgIHBvbGw9PG4+LCBkZWZhdWx0IDEyOAorICogICAgIG4gOiBidXJzdCBzaXplIG9mIFBIX0RBVEFfSU5EIGF0IHRyYW5zcGFyZW50IHJ4IGRhdGEKKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvdXNiLmg+CisjaW5jbHVkZSA8bGludXgvbUlTRE5ody5oPgorI2luY2x1ZGUgImhmY3N1c2IuaCIKKworY29uc3QgY2hhciAqaGZjc3VzYl9yZXYgPSAiUmV2aXNpb246IDAuMy4zIChzb2NrZXQpLCAyMDA4LTExLTA1IjsKKworc3RhdGljIHVuc2lnbmVkIGludCBkZWJ1ZzsKK3N0YXRpYyBpbnQgcG9sbCA9IERFRkFVTFRfVFJBTlNQX0JVUlNUX1NaOworCitzdGF0aWMgTElTVF9IRUFEKEhGQ2xpc3QpOworc3RhdGljIERFRklORV9SV0xPQ0soSEZDbG9jayk7CisKKworTU9EVUxFX0FVVEhPUigiTWFydGluIEJhY2hlbSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworbW9kdWxlX3BhcmFtKGRlYnVnLCB1aW50LCBTX0lSVUdPIHwgU19JV1VTUik7Cittb2R1bGVfcGFyYW0ocG9sbCwgaW50LCAwKTsKKworc3RhdGljIGludCBoZmNzdXNiX2NudDsKKworLyogc29tZSBmdW5jdGlvbiBwcm90b3R5cGVzICovCitzdGF0aWMgdm9pZCBoZmNzdXNiX3BoX2NvbW1hbmQoc3RydWN0IGhmY3N1c2IgKmh3LCB1X2NoYXIgY29tbWFuZCk7CitzdGF0aWMgdm9pZCByZWxlYXNlX2h3KHN0cnVjdCBoZmNzdXNiICpodyk7CitzdGF0aWMgdm9pZCByZXNldF9oZmNzdXNiKHN0cnVjdCBoZmNzdXNiICpodyk7CitzdGF0aWMgdm9pZCBzZXRQb3J0TW9kZShzdHJ1Y3QgaGZjc3VzYiAqaHcpOworc3RhdGljIHZvaWQgaGZjc3VzYl9zdGFydF9lbmRwb2ludChzdHJ1Y3QgaGZjc3VzYiAqaHcsIGludCBjaGFubmVsKTsKK3N0YXRpYyB2b2lkIGhmY3N1c2Jfc3RvcF9lbmRwb2ludChzdHJ1Y3QgaGZjc3VzYiAqaHcsIGludCBjaGFubmVsKTsKK3N0YXRpYyBpbnQgIGhmY3N1c2Jfc2V0dXBfYmNoKHN0cnVjdCBiY2hhbm5lbCAqYmNoLCBpbnQgcHJvdG9jb2wpOworc3RhdGljIHZvaWQgZGVhY3RpdmF0ZV9iY2hhbm5lbChzdHJ1Y3QgYmNoYW5uZWwgKmJjaCk7CitzdGF0aWMgdm9pZCBoZmNzdXNiX3BoX2luZm8oc3RydWN0IGhmY3N1c2IgKmh3KTsKKworLyogc3RhcnQgbmV4dCBiYWNrZ3JvdW5kIHRyYW5zZmVyIGZvciBjb250cm9sIGNoYW5uZWwgKi8KK3N0YXRpYyB2b2lkCitjdHJsX3N0YXJ0X3RyYW5zZmVyKHN0cnVjdCBoZmNzdXNiICpodykKK3sKKwlpZiAoZGVidWcgJiBEQkdfSEZDX0NBTExfVFJBQ0UpCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogJXNcbiIsIGh3LT5uYW1lLCBfX2Z1bmNfXyk7CisKKwlpZiAoaHctPmN0cmxfY250KSB7CisJCWh3LT5jdHJsX3VyYi0+cGlwZSA9IGh3LT5jdHJsX291dF9waXBlOworCQlody0+Y3RybF91cmItPnNldHVwX3BhY2tldCA9ICh1X2NoYXIgKikmaHctPmN0cmxfd3JpdGU7CisJCWh3LT5jdHJsX3VyYi0+dHJhbnNmZXJfYnVmZmVyID0gTlVMTDsKKwkJaHctPmN0cmxfdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoID0gMDsKKwkJaHctPmN0cmxfd3JpdGUud0luZGV4ID0KKwkJICAgIGNwdV90b19sZTE2KGh3LT5jdHJsX2J1ZmZbaHctPmN0cmxfb3V0X2lkeF0uaGZjc19yZWcpOworCQlody0+Y3RybF93cml0ZS53VmFsdWUgPQorCQkgICAgY3B1X3RvX2xlMTYoaHctPmN0cmxfYnVmZltody0+Y3RybF9vdXRfaWR4XS5yZWdfdmFsKTsKKworCQl1c2Jfc3VibWl0X3VyYihody0+Y3RybF91cmIsIEdGUF9BVE9NSUMpOworCX0KK30KKworLyoKKyAqIHF1ZXVlIGEgY29udHJvbCB0cmFuc2ZlciByZXF1ZXN0IHRvIHdyaXRlIEhGQy1TIFVTQgorICogY2hpcCByZWdpc3RlciB1c2luZyBDVFJMIHJlc3Vlc3QgcXVldWUKKyAqLworc3RhdGljIGludCB3cml0ZV9yZWcoc3RydWN0IGhmY3N1c2IgKmh3LCBfX3U4IHJlZywgX191OCB2YWwpCit7CisJc3RydWN0IGN0cmxfYnVmICpidWY7CisKKwlpZiAoZGVidWcgJiBEQkdfSEZDX0NBTExfVFJBQ0UpCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogJXMgcmVnKDB4JTAyeCkgdmFsKDB4JTAyeClcbiIsCisJCQlody0+bmFtZSwgX19mdW5jX18sIHJlZywgdmFsKTsKKworCXNwaW5fbG9jaygmaHctPmN0cmxfbG9jayk7CisJaWYgKGh3LT5jdHJsX2NudCA+PSBIRkNfQ1RSTF9CVUZTSVpFKQorCQlyZXR1cm4gMTsKKwlidWYgPSAmaHctPmN0cmxfYnVmZltody0+Y3RybF9pbl9pZHhdOworCWJ1Zi0+aGZjc19yZWcgPSByZWc7CisJYnVmLT5yZWdfdmFsID0gdmFsOworCWlmICgrK2h3LT5jdHJsX2luX2lkeCA+PSBIRkNfQ1RSTF9CVUZTSVpFKQorCQlody0+Y3RybF9pbl9pZHggPSAwOworCWlmICgrK2h3LT5jdHJsX2NudCA9PSAxKQorCQljdHJsX3N0YXJ0X3RyYW5zZmVyKGh3KTsKKwlzcGluX3VubG9jaygmaHctPmN0cmxfbG9jayk7CisKKwlyZXR1cm4gMDsKK30KKworLyogY29udHJvbCBjb21wbGV0aW9uIHJvdXRpbmUgaGFuZGxpbmcgYmFja2dyb3VuZCBjb250cm9sIGNtZHMgKi8KK3N0YXRpYyB2b2lkCitjdHJsX2NvbXBsZXRlKHN0cnVjdCB1cmIgKnVyYikKK3sKKwlzdHJ1Y3QgaGZjc3VzYiAqaHcgPSAoc3RydWN0IGhmY3N1c2IgKikgdXJiLT5jb250ZXh0OworCXN0cnVjdCBjdHJsX2J1ZiAqYnVmOworCisJaWYgKGRlYnVnICYgREJHX0hGQ19DQUxMX1RSQUNFKQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6ICVzXG4iLCBody0+bmFtZSwgX19mdW5jX18pOworCisJdXJiLT5kZXYgPSBody0+ZGV2OworCWlmIChody0+Y3RybF9jbnQpIHsKKwkJYnVmID0gJmh3LT5jdHJsX2J1ZmZbaHctPmN0cmxfb3V0X2lkeF07CisJCWh3LT5jdHJsX2NudC0tOwkvKiBkZWNyZW1lbnQgYWN0dWFsIGNvdW50ICovCisJCWlmICgrK2h3LT5jdHJsX291dF9pZHggPj0gSEZDX0NUUkxfQlVGU0laRSkKKwkJCWh3LT5jdHJsX291dF9pZHggPSAwOwkvKiBwb2ludGVyIHdyYXAgKi8KKworCQljdHJsX3N0YXJ0X3RyYW5zZmVyKGh3KTsgLyogc3RhcnQgbmV4dCB0cmFuc2ZlciAqLworCX0KK30KKworLyogaGFuZGxlIExFRCBiaXRzICAgKi8KK3N0YXRpYyB2b2lkCitzZXRfbGVkX2JpdChzdHJ1Y3QgaGZjc3VzYiAqaHcsIHNpZ25lZCBzaG9ydCBsZWRfYml0cywgaW50IHNldF9vbikKK3sKKwlpZiAoc2V0X29uKSB7CisJCWlmIChsZWRfYml0cyA8IDApCisJCQlody0+bGVkX3N0YXRlICY9IH5hYnMobGVkX2JpdHMpOworCQllbHNlCisJCQlody0+bGVkX3N0YXRlIHw9IGxlZF9iaXRzOworCX0gZWxzZSB7CisJCWlmIChsZWRfYml0cyA8IDApCisJCQlody0+bGVkX3N0YXRlIHw9IGFicyhsZWRfYml0cyk7CisJCWVsc2UKKwkJCWh3LT5sZWRfc3RhdGUgJj0gfmxlZF9iaXRzOworCX0KK30KKworLyogaGFuZGxlIExFRCByZXF1ZXN0cyAgKi8KK3N0YXRpYyB2b2lkCitoYW5kbGVfbGVkKHN0cnVjdCBoZmNzdXNiICpodywgaW50IGV2ZW50KQoreworCXN0cnVjdCBoZmNzdXNiX3ZkYXRhICpkcml2ZXJfaW5mbyA9IChzdHJ1Y3QgaGZjc3VzYl92ZGF0YSAqKQorCQloZmNzdXNiX2lkdGFiW2h3LT52ZW5kX2lkeF0uZHJpdmVyX2luZm87CisJX191OCB0bXBsZWQ7CisKKwlpZiAoZHJpdmVyX2luZm8tPmxlZF9zY2hlbWUgPT0gTEVEX09GRikKKwkJcmV0dXJuOworCXRtcGxlZCA9IGh3LT5sZWRfc3RhdGU7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBMRURfUE9XRVJfT046CisJCXNldF9sZWRfYml0KGh3LCBkcml2ZXJfaW5mby0+bGVkX2JpdHNbMF0sIDEpOworCQlzZXRfbGVkX2JpdChodywgZHJpdmVyX2luZm8tPmxlZF9iaXRzWzFdLCAwKTsKKwkJc2V0X2xlZF9iaXQoaHcsIGRyaXZlcl9pbmZvLT5sZWRfYml0c1syXSwgMCk7CisJCXNldF9sZWRfYml0KGh3LCBkcml2ZXJfaW5mby0+bGVkX2JpdHNbM10sIDApOworCQlicmVhazsKKwljYXNlIExFRF9QT1dFUl9PRkY6CisJCXNldF9sZWRfYml0KGh3LCBkcml2ZXJfaW5mby0+bGVkX2JpdHNbMF0sIDApOworCQlzZXRfbGVkX2JpdChodywgZHJpdmVyX2luZm8tPmxlZF9iaXRzWzFdLCAwKTsKKwkJc2V0X2xlZF9iaXQoaHcsIGRyaXZlcl9pbmZvLT5sZWRfYml0c1syXSwgMCk7CisJCXNldF9sZWRfYml0KGh3LCBkcml2ZXJfaW5mby0+bGVkX2JpdHNbM10sIDApOworCQlicmVhazsKKwljYXNlIExFRF9TMF9PTjoKKwkJc2V0X2xlZF9iaXQoaHcsIGRyaXZlcl9pbmZvLT5sZWRfYml0c1sxXSwgMSk7CisJCWJyZWFrOworCWNhc2UgTEVEX1MwX09GRjoKKwkJc2V0X2xlZF9iaXQoaHcsIGRyaXZlcl9pbmZvLT5sZWRfYml0c1sxXSwgMCk7CisJCWJyZWFrOworCWNhc2UgTEVEX0IxX09OOgorCQlzZXRfbGVkX2JpdChodywgZHJpdmVyX2luZm8tPmxlZF9iaXRzWzJdLCAxKTsKKwkJYnJlYWs7CisJY2FzZSBMRURfQjFfT0ZGOgorCQlzZXRfbGVkX2JpdChodywgZHJpdmVyX2luZm8tPmxlZF9iaXRzWzJdLCAwKTsKKwkJYnJlYWs7CisJY2FzZSBMRURfQjJfT046CisJCXNldF9sZWRfYml0KGh3LCBkcml2ZXJfaW5mby0+bGVkX2JpdHNbM10sIDEpOworCQlicmVhazsKKwljYXNlIExFRF9CMl9PRkY6CisJCXNldF9sZWRfYml0KGh3LCBkcml2ZXJfaW5mby0+bGVkX2JpdHNbM10sIDApOworCQlicmVhazsKKwl9CisKKwlpZiAoaHctPmxlZF9zdGF0ZSAhPSB0bXBsZWQpIHsKKwkJaWYgKGRlYnVnICYgREJHX0hGQ19DQUxMX1RSQUNFKQorCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAlcyByZWcoMHglMDJ4KSB2YWwoeCUwMngpXG4iLAorCQkJICAgIGh3LT5uYW1lLCBfX2Z1bmNfXywKKwkJCSAgICBIRkNVU0JfUF9EQVRBLCBody0+bGVkX3N0YXRlKTsKKworCQl3cml0ZV9yZWcoaHcsIEhGQ1VTQl9QX0RBVEEsIGh3LT5sZWRfc3RhdGUpOworCX0KK30KKworLyoKKyAqIExheWVyMiAtPiBMYXllciAxIEJjaGFubmVsIGRhdGEKKyAqLworc3RhdGljIGludAoraGZjdXNiX2wybDFCKHN0cnVjdCBtSVNETmNoYW5uZWwgKmNoLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBiY2hhbm5lbAkJKmJjaCA9IGNvbnRhaW5lcl9vZihjaCwgc3RydWN0IGJjaGFubmVsLCBjaCk7CisJc3RydWN0IGhmY3N1c2IJCSpodyA9IGJjaC0+aHc7CisJaW50CQkJcmV0ID0gLUVJTlZBTDsKKwlzdHJ1Y3QgbUlTRE5oZWFkCSpoaCA9IG1JU0ROX0hFQURfUChza2IpOworCXVfbG9uZwkJCWZsYWdzOworCisJaWYgKGRlYnVnICYgREJHX0hGQ19DQUxMX1RSQUNFKQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6ICVzXG4iLCBody0+bmFtZSwgX19mdW5jX18pOworCisJc3dpdGNoIChoaC0+cHJpbSkgeworCWNhc2UgUEhfREFUQV9SRVE6CisJCXNwaW5fbG9ja19pcnFzYXZlKCZody0+bG9jaywgZmxhZ3MpOworCQlyZXQgPSBiY2hhbm5lbF9zZW5kZGF0YShiY2gsIHNrYik7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmh3LT5sb2NrLCBmbGFncyk7CisJCWlmIChkZWJ1ZyAmIERCR19IRkNfQ0FMTF9UUkFDRSkKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlczogJXMgUEhfREFUQV9SRVEgcmV0KCVpKVxuIiwKKwkJCQlody0+bmFtZSwgX19mdW5jX18sIHJldCk7CisJCWlmIChyZXQgPiAwKSB7CisJCQkvKgorCQkJICogb3RoZXIgbDEgZHJpdmVycyBkb24ndCBzZW5kIGVhcmx5IGNvbmZpcm1zIG9uCisJCQkgKiB0cmFuc3AgZGF0YSwgYnV0IGhmY3N1c2IgZG9lcyBiZWNhdXNlIHR4X25leHQKKwkJCSAqIHNrYiBpcyBuZWVkZWQgaW4gdHhfaXNvX2NvbXBsZXRlKCkKKwkJCSAqLworCQkJcXVldWVfY2hfZnJhbWUoY2gsIFBIX0RBVEFfQ05GLCBoaC0+aWQsIE5VTEwpOworCQkJcmV0ID0gMDsKKwkJfQorCQlyZXR1cm4gcmV0OworCWNhc2UgUEhfQUNUSVZBVEVfUkVROgorCQlpZiAoIXRlc3RfYW5kX3NldF9iaXQoRkxHX0FDVElWRSwgJmJjaC0+RmxhZ3MpKSB7CisJCQloZmNzdXNiX3N0YXJ0X2VuZHBvaW50KGh3LCBiY2gtPm5yKTsKKwkJCXJldCA9IGhmY3N1c2Jfc2V0dXBfYmNoKGJjaCwgY2gtPnByb3RvY29sKTsKKwkJfSBlbHNlCisJCQlyZXQgPSAwOworCQlpZiAoIXJldCkKKwkJCV9xdWV1ZV9kYXRhKGNoLCBQSF9BQ1RJVkFURV9JTkQsIE1JU0ROX0lEX0FOWSwKKwkJCQkwLCBOVUxMLCBHRlBfS0VSTkVMKTsKKwkJYnJlYWs7CisJY2FzZSBQSF9ERUFDVElWQVRFX1JFUToKKwkJZGVhY3RpdmF0ZV9iY2hhbm5lbChiY2gpOworCQlfcXVldWVfZGF0YShjaCwgUEhfREVBQ1RJVkFURV9JTkQsIE1JU0ROX0lEX0FOWSwKKwkJCTAsIE5VTEwsIEdGUF9LRVJORUwpOworCQlyZXQgPSAwOworCQlicmVhazsKKwl9CisJaWYgKCFyZXQpCisJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogc2VuZCBmdWxsIEQvQiBjaGFubmVsIHN0YXR1cyBpbmZvcm1hdGlvbgorICogYXMgTVBIX0lORk9STUFUSU9OX0lORAorICovCitzdGF0aWMgdm9pZAoraGZjc3VzYl9waF9pbmZvKHN0cnVjdCBoZmNzdXNiICpodykKK3sKKwlzdHJ1Y3QgcGhfaW5mbyAqcGhpOworCXN0cnVjdCBkY2hhbm5lbCAqZGNoID0gJmh3LT5kY2g7CisJaW50IGk7CisKKwlwaGkgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcGhfaW5mbykgKworCQlkY2gtPmRldi5ucmJjaGFuICogc2l6ZW9mKHN0cnVjdCBwaF9pbmZvX2NoKSwgR0ZQX0FUT01JQyk7CisJcGhpLT5kY2guY2gucHJvdG9jb2wgPSBody0+cHJvdG9jb2w7CisJcGhpLT5kY2guY2guRmxhZ3MgPSBkY2gtPkZsYWdzOworCXBoaS0+ZGNoLnN0YXRlID0gZGNoLT5zdGF0ZTsKKwlwaGktPmRjaC5udW1fYmNoID0gZGNoLT5kZXYubnJiY2hhbjsKKwlmb3IgKGkgPSAwOyBpIDwgZGNoLT5kZXYubnJiY2hhbjsgaSsrKSB7CisJCXBoaS0+YmNoW2ldLnByb3RvY29sID0gaHctPmJjaFtpXS5jaC5wcm90b2NvbDsKKwkJcGhpLT5iY2hbaV0uRmxhZ3MgPSBody0+YmNoW2ldLkZsYWdzOworCX0KKwlfcXVldWVfZGF0YSgmZGNoLT5kZXYuRCwgTVBIX0lORk9STUFUSU9OX0lORCwgTUlTRE5fSURfQU5ZLAorCQlzaXplb2Yoc3RydWN0IHBoX2luZm9fZGNoKSArIGRjaC0+ZGV2Lm5yYmNoYW4gKgorCQlzaXplb2Yoc3RydWN0IHBoX2luZm9fY2gpLCBwaGksIEdGUF9BVE9NSUMpOworfQorCisvKgorICogTGF5ZXIyIC0+IExheWVyIDEgRGNoYW5uZWwgZGF0YQorICovCitzdGF0aWMgaW50CitoZmN1c2JfbDJsMUQoc3RydWN0IG1JU0ROY2hhbm5lbCAqY2gsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IG1JU0ROZGV2aWNlCSpkZXYgPSBjb250YWluZXJfb2YoY2gsIHN0cnVjdCBtSVNETmRldmljZSwgRCk7CisJc3RydWN0IGRjaGFubmVsCQkqZGNoID0gY29udGFpbmVyX29mKGRldiwgc3RydWN0IGRjaGFubmVsLCBkZXYpOworCXN0cnVjdCBtSVNETmhlYWQJKmhoID0gbUlTRE5fSEVBRF9QKHNrYik7CisJc3RydWN0IGhmY3N1c2IJCSpodyA9IGRjaC0+aHc7CisJaW50CQkJcmV0ID0gLUVJTlZBTDsKKwl1X2xvbmcJCQlmbGFnczsKKworCXN3aXRjaCAoaGgtPnByaW0pIHsKKwljYXNlIFBIX0RBVEFfUkVROgorCQlpZiAoZGVidWcgJiBEQkdfSEZDX0NBTExfVFJBQ0UpCisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6ICVzOiBQSF9EQVRBX1JFUVxuIiwKKwkJCQlody0+bmFtZSwgX19mdW5jX18pOworCisJCXNwaW5fbG9ja19pcnFzYXZlKCZody0+bG9jaywgZmxhZ3MpOworCQlyZXQgPSBkY2hhbm5lbF9zZW5kZGF0YShkY2gsIHNrYik7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmh3LT5sb2NrLCBmbGFncyk7CisJCWlmIChyZXQgPiAwKSB7CisJCQlyZXQgPSAwOworCQkJcXVldWVfY2hfZnJhbWUoY2gsIFBIX0RBVEFfQ05GLCBoaC0+aWQsIE5VTEwpOworCQl9CisJCWJyZWFrOworCisJY2FzZSBQSF9BQ1RJVkFURV9SRVE6CisJCWlmIChkZWJ1ZyAmIERCR19IRkNfQ0FMTF9UUkFDRSkKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlczogJXM6IFBIX0FDVElWQVRFX1JFUSAlc1xuIiwKKwkJCQlody0+bmFtZSwgX19mdW5jX18sCisJCQkJKGh3LT5wcm90b2NvbCA9PSBJU0ROX1BfTlRfUzApID8gIk5UIiA6ICJURSIpOworCisJCWlmIChody0+cHJvdG9jb2wgPT0gSVNETl9QX05UX1MwKSB7CisJCQlyZXQgPSAwOworCQkJaWYgKHRlc3RfYml0KEZMR19BQ1RJVkUsICZkY2gtPkZsYWdzKSkgeworCQkJCV9xdWV1ZV9kYXRhKCZkY2gtPmRldi5ELAorCQkJCQlQSF9BQ1RJVkFURV9JTkQsIE1JU0ROX0lEX0FOWSwgMCwKKwkJCQkJTlVMTCwgR0ZQX0FUT01JQyk7CisJCQl9IGVsc2UgeworCQkJCWhmY3N1c2JfcGhfY29tbWFuZChodywKKwkJCQkJSEZDX0wxX0FDVElWQVRFX05UKTsKKwkJCQl0ZXN0X2FuZF9zZXRfYml0KEZMR19MMl9BQ1RJVkFURUQsCisJCQkJCSZkY2gtPkZsYWdzKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWhmY3N1c2JfcGhfY29tbWFuZChodywgSEZDX0wxX0FDVElWQVRFX1RFKTsKKwkJCXJldCA9IGwxX2V2ZW50KGRjaC0+bDEsIGhoLT5wcmltKTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgUEhfREVBQ1RJVkFURV9SRVE6CisJCWlmIChkZWJ1ZyAmIERCR19IRkNfQ0FMTF9UUkFDRSkKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlczogJXM6IFBIX0RFQUNUSVZBVEVfUkVRXG4iLAorCQkJCWh3LT5uYW1lLCBfX2Z1bmNfXyk7CisJCXRlc3RfYW5kX2NsZWFyX2JpdChGTEdfTDJfQUNUSVZBVEVELCAmZGNoLT5GbGFncyk7CisKKwkJaWYgKGh3LT5wcm90b2NvbCA9PSBJU0ROX1BfTlRfUzApIHsKKwkJCWhmY3N1c2JfcGhfY29tbWFuZChodywgSEZDX0wxX0RFQUNUSVZBVEVfTlQpOworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmh3LT5sb2NrLCBmbGFncyk7CisJCQlza2JfcXVldWVfcHVyZ2UoJmRjaC0+c3F1ZXVlKTsKKwkJCWlmIChkY2gtPnR4X3NrYikgeworCQkJCWRldl9rZnJlZV9za2IoZGNoLT50eF9za2IpOworCQkJCWRjaC0+dHhfc2tiID0gTlVMTDsKKwkJCX0KKwkJCWRjaC0+dHhfaWR4ID0gMDsKKwkJCWlmIChkY2gtPnJ4X3NrYikgeworCQkJCWRldl9rZnJlZV9za2IoZGNoLT5yeF9za2IpOworCQkJCWRjaC0+cnhfc2tiID0gTlVMTDsKKwkJCX0KKwkJCXRlc3RfYW5kX2NsZWFyX2JpdChGTEdfVFhfQlVTWSwgJmRjaC0+RmxhZ3MpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHctPmxvY2ssIGZsYWdzKTsKKyNpZmRlZiBGSVhNRQorCQkJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChGTEdfTDFfQlVTWSwgJmRjaC0+RmxhZ3MpKQorCQkJCWRjaGFubmVsX3NjaGVkX2V2ZW50KCZoYy0+ZGNoLCBEX0NMRUFSQlVTWSk7CisjZW5kaWYKKwkJCXJldCA9IDA7CisJCX0gZWxzZQorCQkJcmV0ID0gbDFfZXZlbnQoZGNoLT5sMSwgaGgtPnByaW0pOworCQlicmVhazsKKwljYXNlIE1QSF9JTkZPUk1BVElPTl9SRVE6CisJCWhmY3N1c2JfcGhfaW5mbyhodyk7CisJCXJldCA9IDA7CisJCWJyZWFrOworCX0KKworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBMYXllciAxIGNhbGxiYWNrIGZ1bmN0aW9uCisgKi8KK3N0YXRpYyBpbnQKK2hmY19sMWNhbGxiYWNrKHN0cnVjdCBkY2hhbm5lbCAqZGNoLCB1X2ludCBjbWQpCit7CisJc3RydWN0IGhmY3N1c2IgKmh3ID0gZGNoLT5odzsKKworCWlmIChkZWJ1ZyAmIERCR19IRkNfQ0FMTF9UUkFDRSkKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAlcyBjbWQgMHgleFxuIiwKKwkJCWh3LT5uYW1lLCBfX2Z1bmNfXywgY21kKTsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBJTkZPM19QODoKKwljYXNlIElORk8zX1AxMDoKKwljYXNlIEhXX1JFU0VUX1JFUToKKwljYXNlIEhXX1BPV0VSVVBfUkVROgorCQlicmVhazsKKworCWNhc2UgSFdfREVBQ1RfUkVROgorCQlza2JfcXVldWVfcHVyZ2UoJmRjaC0+c3F1ZXVlKTsKKwkJaWYgKGRjaC0+dHhfc2tiKSB7CisJCQlkZXZfa2ZyZWVfc2tiKGRjaC0+dHhfc2tiKTsKKwkJCWRjaC0+dHhfc2tiID0gTlVMTDsKKwkJfQorCQlkY2gtPnR4X2lkeCA9IDA7CisJCWlmIChkY2gtPnJ4X3NrYikgeworCQkJZGV2X2tmcmVlX3NrYihkY2gtPnJ4X3NrYik7CisJCQlkY2gtPnJ4X3NrYiA9IE5VTEw7CisJCX0KKwkJdGVzdF9hbmRfY2xlYXJfYml0KEZMR19UWF9CVVNZLCAmZGNoLT5GbGFncyk7CisJCWJyZWFrOworCWNhc2UgUEhfQUNUSVZBVEVfSU5EOgorCQl0ZXN0X2FuZF9zZXRfYml0KEZMR19BQ1RJVkUsICZkY2gtPkZsYWdzKTsKKwkJX3F1ZXVlX2RhdGEoJmRjaC0+ZGV2LkQsIGNtZCwgTUlTRE5fSURfQU5ZLCAwLCBOVUxMLAorCQkJR0ZQX0FUT01JQyk7CisJCWJyZWFrOworCWNhc2UgUEhfREVBQ1RJVkFURV9JTkQ6CisJCXRlc3RfYW5kX2NsZWFyX2JpdChGTEdfQUNUSVZFLCAmZGNoLT5GbGFncyk7CisJCV9xdWV1ZV9kYXRhKCZkY2gtPmRldi5ELCBjbWQsIE1JU0ROX0lEX0FOWSwgMCwgTlVMTCwKKwkJCUdGUF9BVE9NSUMpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlpZiAoZGNoLT5kZWJ1ZyAmIERFQlVHX0hXKQorCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAlczogdW5rbm93biBjbWQgJXhcbiIsCisJCQlody0+bmFtZSwgX19mdW5jX18sIGNtZCk7CisJCXJldHVybiAtMTsKKwl9CisJaGZjc3VzYl9waF9pbmZvKGh3KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorb3Blbl9kY2hhbm5lbChzdHJ1Y3QgaGZjc3VzYiAqaHcsIHN0cnVjdCBtSVNETmNoYW5uZWwgKmNoLAorICAgIHN0cnVjdCBjaGFubmVsX3JlcSAqcnEpCit7CisJaW50IGVyciA9IDA7CisKKwlpZiAoZGVidWcgJiBERUJVR19IV19PUEVOKQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6ICVzOiBkZXYoJWQpIG9wZW4gYWRkciglaSkgZnJvbSAlcFxuIiwKKwkJICAgIGh3LT5uYW1lLCBfX2Z1bmNfXywgaHctPmRjaC5kZXYuaWQsIHJxLT5hZHIuY2hhbm5lbCwKKwkJICAgIF9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcygwKSk7CisJaWYgKHJxLT5wcm90b2NvbCA9PSBJU0ROX1BfTk9ORSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl0ZXN0X2FuZF9jbGVhcl9iaXQoRkxHX0FDVElWRSwgJmh3LT5kY2guRmxhZ3MpOworCXRlc3RfYW5kX2NsZWFyX2JpdChGTEdfQUNUSVZFLCAmaHctPmVjaC5GbGFncyk7CisJaGZjc3VzYl9zdGFydF9lbmRwb2ludChodywgSEZDX0NIQU5fRCk7CisKKwkvKiBFLUNoYW5uZWwgbG9nZ2luZyAqLworCWlmIChycS0+YWRyLmNoYW5uZWwgPT0gMSkgeworCQlpZiAoaHctPmZpZm9zW0hGQ1VTQl9QQ01fUlhdLnBpcGUpIHsKKwkJCWhmY3N1c2Jfc3RhcnRfZW5kcG9pbnQoaHcsIEhGQ19DSEFOX0UpOworCQkJc2V0X2JpdChGTEdfQUNUSVZFLCAmaHctPmVjaC5GbGFncyk7CisJCQlfcXVldWVfZGF0YSgmaHctPmVjaC5kZXYuRCwgUEhfQUNUSVZBVEVfSU5ELAorCQkJCSAgICAgTUlTRE5fSURfQU5ZLCAwLCBOVUxMLCBHRlBfQVRPTUlDKTsKKwkJfSBlbHNlCisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoIWh3LT5pbml0ZG9uZSkgeworCQlody0+cHJvdG9jb2wgPSBycS0+cHJvdG9jb2w7CisJCWlmIChycS0+cHJvdG9jb2wgPT0gSVNETl9QX1RFX1MwKSB7CisJCQllcnIgPSBjcmVhdGVfbDEoJmh3LT5kY2gsIGhmY19sMWNhbGxiYWNrKTsKKwkJCWlmIChlcnIpCisJCQkJcmV0dXJuIGVycjsKKwkJfQorCQlzZXRQb3J0TW9kZShodyk7CisJCWNoLT5wcm90b2NvbCA9IHJxLT5wcm90b2NvbDsKKwkJaHctPmluaXRkb25lID0gMTsKKwl9IGVsc2UgeworCQlpZiAocnEtPnByb3RvY29sICE9IGNoLT5wcm90b2NvbCkKKwkJCXJldHVybiAtRVBST1RPTk9TVVBQT1JUOworCX0KKworCWlmICgoKGNoLT5wcm90b2NvbCA9PSBJU0ROX1BfTlRfUzApICYmIChody0+ZGNoLnN0YXRlID09IDMpKSB8fAorCSAgICAoKGNoLT5wcm90b2NvbCA9PSBJU0ROX1BfVEVfUzApICYmIChody0+ZGNoLnN0YXRlID09IDcpKSkKKwkJX3F1ZXVlX2RhdGEoY2gsIFBIX0FDVElWQVRFX0lORCwgTUlTRE5fSURfQU5ZLAorCQkgICAgMCwgTlVMTCwgR0ZQX0tFUk5FTCk7CisJcnEtPmNoID0gY2g7CisJaWYgKCF0cnlfbW9kdWxlX2dldChUSElTX01PRFVMRSkpCisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiAlczogY2Fubm90IGdldCBtb2R1bGVcbiIsCisJCSAgICBody0+bmFtZSwgX19mdW5jX18pOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitvcGVuX2JjaGFubmVsKHN0cnVjdCBoZmNzdXNiICpodywgc3RydWN0IGNoYW5uZWxfcmVxICpycSkKK3sKKwlzdHJ1Y3QgYmNoYW5uZWwJCSpiY2g7CisKKwlpZiAocnEtPmFkci5jaGFubmVsID4gMikKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKHJxLT5wcm90b2NvbCA9PSBJU0ROX1BfTk9ORSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoZGVidWcgJiBEQkdfSEZDX0NBTExfVFJBQ0UpCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogJXMgQiVpXG4iLAorCQkJaHctPm5hbWUsIF9fZnVuY19fLCBycS0+YWRyLmNoYW5uZWwpOworCisJYmNoID0gJmh3LT5iY2hbcnEtPmFkci5jaGFubmVsIC0gMV07CisJaWYgKHRlc3RfYW5kX3NldF9iaXQoRkxHX09QRU4sICZiY2gtPkZsYWdzKSkKKwkJcmV0dXJuIC1FQlVTWTsgLyogYi1jaGFubmVsIGNhbiBiZSBvbmx5IG9wZW4gb25jZSAqLworCXRlc3RfYW5kX2NsZWFyX2JpdChGTEdfRklMTEVNUFRZLCAmYmNoLT5GbGFncyk7CisJYmNoLT5jaC5wcm90b2NvbCA9IHJxLT5wcm90b2NvbDsKKwlycS0+Y2ggPSAmYmNoLT5jaDsKKworCS8qIHN0YXJ0IFVTQiBlbmRwb2ludCBmb3IgYmNoYW5uZWwgKi8KKwlpZiAocnEtPmFkci5jaGFubmVsICA9PSAxKQorCQloZmNzdXNiX3N0YXJ0X2VuZHBvaW50KGh3LCBIRkNfQ0hBTl9CMSk7CisJZWxzZQorCQloZmNzdXNiX3N0YXJ0X2VuZHBvaW50KGh3LCBIRkNfQ0hBTl9CMik7CisKKwlpZiAoIXRyeV9tb2R1bGVfZ2V0KFRISVNfTU9EVUxFKSkKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6ICVzOmNhbm5vdCBnZXQgbW9kdWxlXG4iLAorCQkgICAgaHctPm5hbWUsIF9fZnVuY19fKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorY2hhbm5lbF9jdHJsKHN0cnVjdCBoZmNzdXNiICpodywgc3RydWN0IG1JU0ROX2N0cmxfcmVxICpjcSkKK3sKKwlpbnQgcmV0ID0gMDsKKworCWlmIChkZWJ1ZyAmIERCR19IRkNfQ0FMTF9UUkFDRSkKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAlcyBvcCgweCV4KSBjaGFubmVsKDB4JXgpXG4iLAorCQkgICAgaHctPm5hbWUsIF9fZnVuY19fLCAoY3EtPm9wKSwgKGNxLT5jaGFubmVsKSk7CisKKwlzd2l0Y2ggKGNxLT5vcCkgeworCWNhc2UgTUlTRE5fQ1RSTF9HRVRPUDoKKwkJY3EtPm9wID0gTUlTRE5fQ1RSTF9MT09QIHwgTUlTRE5fQ1RSTF9DT05ORUNUIHwKKwkJCSBNSVNETl9DVFJMX0RJU0NPTk5FQ1Q7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiAlczogdW5rbm93biBPcCAleFxuIiwKKwkJCWh3LT5uYW1lLCBfX2Z1bmNfXywgY3EtPm9wKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJYnJlYWs7CisJfQorCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBkZXZpY2UgY29udHJvbCBmdW5jdGlvbgorICovCitzdGF0aWMgaW50CitoZmNfZGN0cmwoc3RydWN0IG1JU0ROY2hhbm5lbCAqY2gsIHVfaW50IGNtZCwgdm9pZCAqYXJnKQoreworCXN0cnVjdCBtSVNETmRldmljZQkqZGV2ID0gY29udGFpbmVyX29mKGNoLCBzdHJ1Y3QgbUlTRE5kZXZpY2UsIEQpOworCXN0cnVjdCBkY2hhbm5lbAkJKmRjaCA9IGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCBkY2hhbm5lbCwgZGV2KTsKKwlzdHJ1Y3QgaGZjc3VzYgkJKmh3ID0gZGNoLT5odzsKKwlzdHJ1Y3QgY2hhbm5lbF9yZXEJKnJxOworCWludAkJCWVyciA9IDA7CisKKwlpZiAoZGNoLT5kZWJ1ZyAmIERFQlVHX0hXKQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6ICVzOiBjbWQ6JXggJXBcbiIsCisJCSAgICBody0+bmFtZSwgX19mdW5jX18sIGNtZCwgYXJnKTsKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgT1BFTl9DSEFOTkVMOgorCQlycSA9IGFyZzsKKwkJaWYgKChycS0+cHJvdG9jb2wgPT0gSVNETl9QX1RFX1MwKSB8fAorCQkgICAgKHJxLT5wcm90b2NvbCA9PSBJU0ROX1BfTlRfUzApKQorCQkJZXJyID0gb3Blbl9kY2hhbm5lbChodywgY2gsIHJxKTsKKwkJZWxzZQorCQkJZXJyID0gb3Blbl9iY2hhbm5lbChodywgcnEpOworCQlpZiAoIWVycikKKwkJCWh3LT5vcGVuKys7CisJCWJyZWFrOworCWNhc2UgQ0xPU0VfQ0hBTk5FTDoKKwkJaHctPm9wZW4tLTsKKwkJaWYgKGRlYnVnICYgREVCVUdfSFdfT1BFTikKKwkJCXByaW50ayhLRVJOX0RFQlVHCisJCQkJIiVzOiAlczogZGV2KCVkKSBjbG9zZSBmcm9tICVwIChvcGVuICVkKVxuIiwKKwkJCQlody0+bmFtZSwgX19mdW5jX18sIGh3LT5kY2guZGV2LmlkLAorCQkJCV9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcygwKSwgaHctPm9wZW4pOworCQlpZiAoIWh3LT5vcGVuKSB7CisJCQloZmNzdXNiX3N0b3BfZW5kcG9pbnQoaHcsIEhGQ19DSEFOX0QpOworCQkJaWYgKGh3LT5maWZvc1tIRkNVU0JfUENNX1JYXS5waXBlKQorCQkJCWhmY3N1c2Jfc3RvcF9lbmRwb2ludChodywgSEZDX0NIQU5fRSk7CisJCQloYW5kbGVfbGVkKGh3LCBMRURfUE9XRVJfT04pOworCQl9CisJCW1vZHVsZV9wdXQoVEhJU19NT0RVTEUpOworCQlicmVhazsKKwljYXNlIENPTlRST0xfQ0hBTk5FTDoKKwkJZXJyID0gY2hhbm5lbF9jdHJsKGh3LCBhcmcpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlpZiAoZGNoLT5kZWJ1ZyAmIERFQlVHX0hXKQorCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAlczogdW5rbm93biBjb21tYW5kICV4XG4iLAorCQkJCWh3LT5uYW1lLCBfX2Z1bmNfXywgY21kKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldHVybiBlcnI7Cit9CisKKy8qCisgKiBTMCBURSBzdGF0ZSBjaGFuZ2UgZXZlbnQgaGFuZGxlcgorICovCitzdGF0aWMgdm9pZAorcGhfc3RhdGVfdGUoc3RydWN0IGRjaGFubmVsICpkY2gpCit7CisJc3RydWN0IGhmY3N1c2IgKmh3ID0gZGNoLT5odzsKKworCWlmIChkZWJ1ZyAmIERFQlVHX0hXKSB7CisJCWlmIChkY2gtPnN0YXRlIDw9IEhGQ19NQVhfVEVfTEFZRVIxX1NUQVRFKQorCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAlczogJXNcbiIsIGh3LT5uYW1lLCBfX2Z1bmNfXywKKwkJCSAgICBIRkNfVEVfTEFZRVIxX1NUQVRFU1tkY2gtPnN0YXRlXSk7CisJCWVsc2UKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlczogJXM6IFRFIEYlZFxuIiwKKwkJCSAgICBody0+bmFtZSwgX19mdW5jX18sIGRjaC0+c3RhdGUpOworCX0KKworCXN3aXRjaCAoZGNoLT5zdGF0ZSkgeworCWNhc2UgMDoKKwkJbDFfZXZlbnQoZGNoLT5sMSwgSFdfUkVTRVRfSU5EKTsKKwkJYnJlYWs7CisJY2FzZSAzOgorCQlsMV9ldmVudChkY2gtPmwxLCBIV19ERUFDVF9JTkQpOworCQlicmVhazsKKwljYXNlIDU6CisJY2FzZSA4OgorCQlsMV9ldmVudChkY2gtPmwxLCBBTllTSUdOQUwpOworCQlicmVhazsKKwljYXNlIDY6CisJCWwxX2V2ZW50KGRjaC0+bDEsIElORk8yKTsKKwkJYnJlYWs7CisJY2FzZSA3OgorCQlsMV9ldmVudChkY2gtPmwxLCBJTkZPNF9QOCk7CisJCWJyZWFrOworCX0KKwlpZiAoZGNoLT5zdGF0ZSA9PSA3KQorCQloYW5kbGVfbGVkKGh3LCBMRURfUzBfT04pOworCWVsc2UKKwkJaGFuZGxlX2xlZChodywgTEVEX1MwX09GRik7Cit9CisKKy8qCisgKiBTMCBOVCBzdGF0ZSBjaGFuZ2UgZXZlbnQgaGFuZGxlcgorICovCitzdGF0aWMgdm9pZAorcGhfc3RhdGVfbnQoc3RydWN0IGRjaGFubmVsICpkY2gpCit7CisJc3RydWN0IGhmY3N1c2IgKmh3ID0gZGNoLT5odzsKKworCWlmIChkZWJ1ZyAmIERFQlVHX0hXKSB7CisJCWlmIChkY2gtPnN0YXRlIDw9IEhGQ19NQVhfTlRfTEFZRVIxX1NUQVRFKQorCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAlczogJXNcbiIsCisJCQkgICAgaHctPm5hbWUsIF9fZnVuY19fLAorCQkJICAgIEhGQ19OVF9MQVlFUjFfU1RBVEVTW2RjaC0+c3RhdGVdKTsKKworCQllbHNlCisJCQlwcmludGsoS0VSTl9JTkZPIERSSVZFUl9OQU1FICIlczogJXM6IE5UIEclZFxuIiwKKwkJCSAgICBody0+bmFtZSwgX19mdW5jX18sIGRjaC0+c3RhdGUpOworCX0KKworCXN3aXRjaCAoZGNoLT5zdGF0ZSkgeworCWNhc2UgKDEpOgorCQl0ZXN0X2FuZF9jbGVhcl9iaXQoRkxHX0FDVElWRSwgJmRjaC0+RmxhZ3MpOworCQl0ZXN0X2FuZF9jbGVhcl9iaXQoRkxHX0wyX0FDVElWQVRFRCwgJmRjaC0+RmxhZ3MpOworCQlody0+bnRfdGltZXIgPSAwOworCQlody0+dGltZXJzICY9IH5OVF9BQ1RJVkFUSU9OX1RJTUVSOworCQloYW5kbGVfbGVkKGh3LCBMRURfUzBfT0ZGKTsKKwkJYnJlYWs7CisKKwljYXNlICgyKToKKwkJaWYgKGh3LT5udF90aW1lciA8IDApIHsKKwkJCWh3LT5udF90aW1lciA9IDA7CisJCQlody0+dGltZXJzICY9IH5OVF9BQ1RJVkFUSU9OX1RJTUVSOworCQkJaGZjc3VzYl9waF9jb21tYW5kKGRjaC0+aHcsIEhGQ19MMV9ERUFDVElWQVRFX05UKTsKKwkJfSBlbHNlIHsKKwkJCWh3LT50aW1lcnMgfD0gTlRfQUNUSVZBVElPTl9USU1FUjsKKwkJCWh3LT5udF90aW1lciA9IE5UX1QxX0NPVU5UOworCQkJLyogYWxsb3cgRzIgLT4gRzMgdHJhbnNpdGlvbiAqLworCQkJd3JpdGVfcmVnKGh3LCBIRkNVU0JfU1RBVEVTLCAyIHwgSEZDVVNCX05UX0cyX0czKTsKKwkJfQorCQlicmVhazsKKwljYXNlICgzKToKKwkJaHctPm50X3RpbWVyID0gMDsKKwkJaHctPnRpbWVycyAmPSB+TlRfQUNUSVZBVElPTl9USU1FUjsKKwkJdGVzdF9hbmRfc2V0X2JpdChGTEdfQUNUSVZFLCAmZGNoLT5GbGFncyk7CisJCV9xdWV1ZV9kYXRhKCZkY2gtPmRldi5ELCBQSF9BQ1RJVkFURV9JTkQsCisJCQlNSVNETl9JRF9BTlksIDAsIE5VTEwsIEdGUF9BVE9NSUMpOworCQloYW5kbGVfbGVkKGh3LCBMRURfUzBfT04pOworCQlicmVhazsKKwljYXNlICg0KToKKwkJaHctPm50X3RpbWVyID0gMDsKKwkJaHctPnRpbWVycyAmPSB+TlRfQUNUSVZBVElPTl9USU1FUjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCWhmY3N1c2JfcGhfaW5mbyhodyk7Cit9CisKK3N0YXRpYyB2b2lkCitwaF9zdGF0ZShzdHJ1Y3QgZGNoYW5uZWwgKmRjaCkKK3sKKwlzdHJ1Y3QgaGZjc3VzYiAqaHcgPSBkY2gtPmh3OworCisJaWYgKGh3LT5wcm90b2NvbCA9PSBJU0ROX1BfTlRfUzApCisJCXBoX3N0YXRlX250KGRjaCk7CisJZWxzZSBpZiAoaHctPnByb3RvY29sID09IElTRE5fUF9URV9TMCkKKwkJcGhfc3RhdGVfdGUoZGNoKTsKK30KKworLyoKKyAqIGRpc2FibGUvZW5hYmxlIEJDaGFubmVsIGZvciBkZXNpcmVkIHByb3RvY29sbAorICovCitzdGF0aWMgaW50CitoZmNzdXNiX3NldHVwX2JjaChzdHJ1Y3QgYmNoYW5uZWwgKmJjaCwgaW50IHByb3RvY29sKQoreworCXN0cnVjdCBoZmNzdXNiICpodyA9IGJjaC0+aHc7CisJX191OCBjb25oZGxjLCBzY3RybCwgc2N0cmxfcjsKKworCWlmIChkZWJ1ZyAmIERFQlVHX0hXKQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6ICVzOiBwcm90b2NvbCAleC0tPiV4IEIlZFxuIiwKKwkJICAgIGh3LT5uYW1lLCBfX2Z1bmNfXywgYmNoLT5zdGF0ZSwgcHJvdG9jb2wsCisJCSAgICBiY2gtPm5yKTsKKworCS8qIHNldHVwIHZhbCBmb3IgQ09OX0hETEMgKi8KKwljb25oZGxjID0gMDsKKwlpZiAocHJvdG9jb2wgPiBJU0ROX1BfTk9ORSkKKwkJY29uaGRsYyA9IDg7CS8qIGVuYWJsZSBGSUZPICovCisKKwlzd2l0Y2ggKHByb3RvY29sKSB7CisJY2FzZSAoLTEpOgkvKiB1c2VkIGZvciBpbml0ICovCisJCWJjaC0+c3RhdGUgPSAtMTsKKwkJLyogZmFsbCB0cm91Z2ggKi8KKwljYXNlIChJU0ROX1BfTk9ORSk6CisJCWlmIChiY2gtPnN0YXRlID09IElTRE5fUF9OT05FKQorCQkJcmV0dXJuIDA7IC8qIGFscmVhZHkgaW4gaWRsZSBzdGF0ZSAqLworCQliY2gtPnN0YXRlID0gSVNETl9QX05PTkU7CisJCWNsZWFyX2JpdChGTEdfSERMQywgJmJjaC0+RmxhZ3MpOworCQljbGVhcl9iaXQoRkxHX1RSQU5TUEFSRU5ULCAmYmNoLT5GbGFncyk7CisJCWJyZWFrOworCWNhc2UgKElTRE5fUF9CX1JBVyk6CisJCWNvbmhkbGMgfD0gMjsKKwkJYmNoLT5zdGF0ZSA9IHByb3RvY29sOworCQlzZXRfYml0KEZMR19UUkFOU1BBUkVOVCwgJmJjaC0+RmxhZ3MpOworCQlicmVhazsKKwljYXNlIChJU0ROX1BfQl9IRExDKToKKwkJYmNoLT5zdGF0ZSA9IHByb3RvY29sOworCQlzZXRfYml0KEZMR19IRExDLCAmYmNoLT5GbGFncyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWlmIChkZWJ1ZyAmIERFQlVHX0hXKQorCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAlczogcHJvdCBub3Qga25vd24gJXhcbiIsCisJCQkJaHctPm5hbWUsIF9fZnVuY19fLCBwcm90b2NvbCk7CisJCXJldHVybiAtRU5PUFJPVE9PUFQ7CisJfQorCisJaWYgKHByb3RvY29sID49IElTRE5fUF9OT05FKSB7CisJCXdyaXRlX3JlZyhodywgSEZDVVNCX0ZJRk8sIChiY2gtPm5yID09IDEpID8gMCA6IDIpOworCQl3cml0ZV9yZWcoaHcsIEhGQ1VTQl9DT05fSERMQywgY29uaGRsYyk7CisJCXdyaXRlX3JlZyhodywgSEZDVVNCX0lOQ19SRVNfRiwgMik7CisJCXdyaXRlX3JlZyhodywgSEZDVVNCX0ZJRk8sIChiY2gtPm5yID09IDEpID8gMSA6IDMpOworCQl3cml0ZV9yZWcoaHcsIEhGQ1VTQl9DT05fSERMQywgY29uaGRsYyk7CisJCXdyaXRlX3JlZyhodywgSEZDVVNCX0lOQ19SRVNfRiwgMik7CisKKwkJc2N0cmwgPSAweDQwICsgKChody0+cHJvdG9jb2wgPT0gSVNETl9QX1RFX1MwKSA/IDB4MDAgOiAweDA0KTsKKwkJc2N0cmxfciA9IDB4MDsKKwkJaWYgKHRlc3RfYml0KEZMR19BQ1RJVkUsICZody0+YmNoWzBdLkZsYWdzKSkgeworCQkJc2N0cmwgfD0gMTsKKwkJCXNjdHJsX3IgfD0gMTsKKwkJfQorCQlpZiAodGVzdF9iaXQoRkxHX0FDVElWRSwgJmh3LT5iY2hbMV0uRmxhZ3MpKSB7CisJCQlzY3RybCB8PSAyOworCQkJc2N0cmxfciB8PSAyOworCQl9CisJCXdyaXRlX3JlZyhodywgSEZDVVNCX1NDVFJMLCBzY3RybCk7CisJCXdyaXRlX3JlZyhodywgSEZDVVNCX1NDVFJMX1IsIHNjdHJsX3IpOworCisJCWlmIChwcm90b2NvbCA+IElTRE5fUF9OT05FKQorCQkJaGFuZGxlX2xlZChodywgKGJjaC0+bnIgPT0gMSkgPyBMRURfQjFfT04gOiBMRURfQjJfT04pOworCQllbHNlCisJCQloYW5kbGVfbGVkKGh3LCAoYmNoLT5uciA9PSAxKSA/IExFRF9CMV9PRkYgOgorCQkJCUxFRF9CMl9PRkYpOworCX0KKwloZmNzdXNiX3BoX2luZm8oaHcpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAoraGZjc3VzYl9waF9jb21tYW5kKHN0cnVjdCBoZmNzdXNiICpodywgdV9jaGFyIGNvbW1hbmQpCit7CisJaWYgKGRlYnVnICYgREVCVUdfSFcpCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogJXM6ICV4XG4iLAorCQkgICBody0+bmFtZSwgX19mdW5jX18sIGNvbW1hbmQpOworCisJc3dpdGNoIChjb21tYW5kKSB7CisJY2FzZSBIRkNfTDFfQUNUSVZBVEVfVEU6CisJCS8qIGZvcmNlIHNlbmRpbmcgc2VuZGluZyBJTkZPMSAqLworCQl3cml0ZV9yZWcoaHcsIEhGQ1VTQl9TVEFURVMsIDB4MTQpOworCQkvKiBzdGFydCBsMSBhY3RpdmF0aW9uICovCisJCXdyaXRlX3JlZyhodywgSEZDVVNCX1NUQVRFUywgMHgwNCk7CisJCWJyZWFrOworCisJY2FzZSBIRkNfTDFfRk9SQ0VfREVBQ1RJVkFURV9URToKKwkJd3JpdGVfcmVnKGh3LCBIRkNVU0JfU1RBVEVTLCAweDEwKTsKKwkJd3JpdGVfcmVnKGh3LCBIRkNVU0JfU1RBVEVTLCAweDAzKTsKKwkJYnJlYWs7CisKKwljYXNlIEhGQ19MMV9BQ1RJVkFURV9OVDoKKwkJaWYgKGh3LT5kY2guc3RhdGUgPT0gMykKKwkJCV9xdWV1ZV9kYXRhKCZody0+ZGNoLmRldi5ELCBQSF9BQ1RJVkFURV9JTkQsCisJCQkJTUlTRE5fSURfQU5ZLCAwLCBOVUxMLCBHRlBfQVRPTUlDKTsKKwkJZWxzZQorCQkJd3JpdGVfcmVnKGh3LCBIRkNVU0JfU1RBVEVTLCBIRkNVU0JfQUNUSVZBVEUgfAorCQkJCUhGQ1VTQl9ET19BQ1RJT04gfCBIRkNVU0JfTlRfRzJfRzMpOworCQlicmVhazsKKworCWNhc2UgSEZDX0wxX0RFQUNUSVZBVEVfTlQ6CisJCXdyaXRlX3JlZyhodywgSEZDVVNCX1NUQVRFUywKKwkJCUhGQ1VTQl9ET19BQ1RJT04pOworCQlicmVhazsKKwl9Cit9CisKKy8qCisgKiBMYXllciAxIEItY2hhbm5lbCBoYXJkd2FyZSBhY2Nlc3MKKyAqLworc3RhdGljIGludAorY2hhbm5lbF9iY3RybChzdHJ1Y3QgYmNoYW5uZWwgKmJjaCwgc3RydWN0IG1JU0ROX2N0cmxfcmVxICpjcSkKK3sKKwlpbnQJcmV0ID0gMDsKKworCXN3aXRjaCAoY3EtPm9wKSB7CisJY2FzZSBNSVNETl9DVFJMX0dFVE9QOgorCQljcS0+b3AgPSBNSVNETl9DVFJMX0ZJTExfRU1QVFk7CisJCWJyZWFrOworCWNhc2UgTUlTRE5fQ1RSTF9GSUxMX0VNUFRZOiAvKiBmaWxsIGZpZm8sIGlmIGVtcHR5ICovCisJCXRlc3RfYW5kX3NldF9iaXQoRkxHX0ZJTExFTVBUWSwgJmJjaC0+RmxhZ3MpOworCQlpZiAoZGVidWcgJiBERUJVR19IV19PUEVOKQorCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBGSUxMX0VNUFRZIHJlcXVlc3QgKG5yPSVkICIKKwkJCQkib2ZmPSVkKVxuIiwgX19mdW5jX18sIGJjaC0+bnIsICEhY3EtPnAxKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHVua25vd24gT3AgJXhcbiIsIF9fZnVuY19fLCBjcS0+b3ApOworCQlyZXQgPSAtRUlOVkFMOworCQlicmVhazsKKwl9CisJcmV0dXJuIHJldDsKK30KKworLyogY29sbGVjdCBkYXRhIGZyb20gaW5jb21pbmcgaW50ZXJydXB0IG9yIGlzb2Nocm9uIFVTQiBkYXRhICovCitzdGF0aWMgdm9pZAoraGZjc3VzYl9yeF9mcmFtZShzdHJ1Y3QgdXNiX2ZpZm8gKmZpZm8sIF9fdTggKmRhdGEsIHVuc2lnbmVkIGludCBsZW4sCisJaW50IGZpbmlzaCkKK3sKKwlzdHJ1Y3QgaGZjc3VzYgkqaHcgPSBmaWZvLT5odzsKKwlzdHJ1Y3Qgc2tfYnVmZgkqcnhfc2tiID0gTlVMTDsKKwlpbnQJCW1heGxlbiA9IDA7CisJaW50CQlmaWZvbiA9IGZpZm8tPmZpZm9udW07CisJaW50CQlpOworCWludAkJaGRsYyA9IDA7CisKKwlpZiAoZGVidWcgJiBEQkdfSEZDX0NBTExfVFJBQ0UpCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogJXM6IGZpZm8oJWkpIGxlbiglaSkgIgorCQkgICAgImRjaCglcCkgYmNoKCVwKSBlY2goJXApXG4iLAorCQkgICAgaHctPm5hbWUsIF9fZnVuY19fLCBmaWZvbiwgbGVuLAorCQkgICAgZmlmby0+ZGNoLCBmaWZvLT5iY2gsIGZpZm8tPmVjaCk7CisKKwlpZiAoIWxlbikKKwkJcmV0dXJuOworCisJaWYgKCghIWZpZm8tPmRjaCArICEhZmlmby0+YmNoICsgISFmaWZvLT5lY2gpICE9IDEpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAlczogdW5kZWZpbmVkIGNoYW5uZWxcbiIsCisJCSAgICAgICBody0+bmFtZSwgX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCisJc3Bpbl9sb2NrKCZody0+bG9jayk7CisJaWYgKGZpZm8tPmRjaCkgeworCQlyeF9za2IgPSBmaWZvLT5kY2gtPnJ4X3NrYjsKKwkJbWF4bGVuID0gZmlmby0+ZGNoLT5tYXhsZW47CisJCWhkbGMgPSAxOworCX0KKwlpZiAoZmlmby0+YmNoKSB7CisJCXJ4X3NrYiA9IGZpZm8tPmJjaC0+cnhfc2tiOworCQltYXhsZW4gPSBmaWZvLT5iY2gtPm1heGxlbjsKKwkJaGRsYyA9IHRlc3RfYml0KEZMR19IRExDLCAmZmlmby0+YmNoLT5GbGFncyk7CisJfQorCWlmIChmaWZvLT5lY2gpIHsKKwkJcnhfc2tiID0gZmlmby0+ZWNoLT5yeF9za2I7CisJCW1heGxlbiA9IGZpZm8tPmVjaC0+bWF4bGVuOworCQloZGxjID0gMTsKKwl9CisKKwlpZiAoIXJ4X3NrYikgeworCQlyeF9za2IgPSBtSV9hbGxvY19za2IobWF4bGVuLCBHRlBfQVRPTUlDKTsKKwkJaWYgKHJ4X3NrYikgeworCQkJaWYgKGZpZm8tPmRjaCkKKwkJCQlmaWZvLT5kY2gtPnJ4X3NrYiA9IHJ4X3NrYjsKKwkJCWlmIChmaWZvLT5iY2gpCisJCQkJZmlmby0+YmNoLT5yeF9za2IgPSByeF9za2I7CisJCQlpZiAoZmlmby0+ZWNoKQorCQkJCWZpZm8tPmVjaC0+cnhfc2tiID0gcnhfc2tiOworCQkJc2tiX3RyaW0ocnhfc2tiLCAwKTsKKwkJfSBlbHNlIHsKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlczogJXM6IE5vIG1lbSBmb3Igcnhfc2tiXG4iLAorCQkJICAgIGh3LT5uYW1lLCBfX2Z1bmNfXyk7CisJCQlzcGluX3VubG9jaygmaHctPmxvY2spOworCQkJcmV0dXJuOworCQl9CisJfQorCisJaWYgKGZpZm8tPmRjaCB8fCBmaWZvLT5lY2gpIHsKKwkJLyogRC9FLUNoYW5uZWwgU0tCIHJhbmdlIGNoZWNrICovCisJCWlmICgocnhfc2tiLT5sZW4gKyBsZW4pID49IE1BWF9ERlJBTUVfTEVOX0wxKSB7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6ICVzOiBzYmsgbWVtIGV4Y2VlZGVkICIKKwkJCSAgICAiZm9yIGZpZm8oJWQpIEhGQ1VTQl9EX1JYXG4iLAorCQkJICAgIGh3LT5uYW1lLCBfX2Z1bmNfXywgZmlmb24pOworCQkJc2tiX3RyaW0ocnhfc2tiLCAwKTsKKwkJCXNwaW5fdW5sb2NrKCZody0+bG9jayk7CisJCQlyZXR1cm47CisJCX0KKwl9IGVsc2UgaWYgKGZpZm8tPmJjaCkgeworCQkvKiBCLUNoYW5uZWwgU0tCIHJhbmdlIGNoZWNrICovCisJCWlmICgocnhfc2tiLT5sZW4gKyBsZW4pID49IChNQVhfQkNIX1NJWkUgKyAzKSkgeworCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAlczogc2JrIG1lbSBleGNlZWRlZCAiCisJCQkgICAgImZvciBmaWZvKCVkKSBIRkNVU0JfQl9SWFxuIiwKKwkJCSAgICBody0+bmFtZSwgX19mdW5jX18sIGZpZm9uKTsKKwkJCXNrYl90cmltKHJ4X3NrYiwgMCk7CisJCQlzcGluX3VubG9jaygmaHctPmxvY2spOworCQkJcmV0dXJuOworCQl9CisJfQorCisJbWVtY3B5KHNrYl9wdXQocnhfc2tiLCBsZW4pLCBkYXRhLCBsZW4pOworCisJaWYgKGhkbGMpIHsKKwkJLyogd2UgaGF2ZSBhIGNvbXBsZXRlIGhkbGMgcGFja2V0ICovCisJCWlmIChmaW5pc2gpIHsKKwkJCWlmICgocnhfc2tiLT5sZW4gPiAzKSAmJgorCQkJICAgKCEocnhfc2tiLT5kYXRhW3J4X3NrYi0+bGVuIC0gMV0pKSkgeworCQkJCWlmIChkZWJ1ZyAmIERCR19IRkNfRklGT19WRVJCT1NFKSB7CisJCQkJCXByaW50ayhLRVJOX0RFQlVHICIlczogJXM6IGZpZm9uKCVpKSIKKwkJCQkJICAgICIgbmV3IFJYIGxlbiglaSk6ICIsCisJCQkJCSAgICBody0+bmFtZSwgX19mdW5jX18sIGZpZm9uLAorCQkJCQkgICAgcnhfc2tiLT5sZW4pOworCQkJCQlpID0gMDsKKwkJCQkJd2hpbGUgKGkgPCByeF9za2ItPmxlbikKKwkJCQkJCXByaW50aygiJTAyeCAiLAorCQkJCQkJICAgIHJ4X3NrYi0+ZGF0YVtpKytdKTsKKwkJCQkJcHJpbnRrKCJcbiIpOworCQkJCX0KKworCQkJCS8qIHJlbW92ZSBDUkMgJiBzdGF0dXMgKi8KKwkJCQlza2JfdHJpbShyeF9za2IsIHJ4X3NrYi0+bGVuIC0gMyk7CisKKwkJCQlpZiAoZmlmby0+ZGNoKQorCQkJCQlyZWN2X0RjaGFubmVsKGZpZm8tPmRjaCk7CisJCQkJaWYgKGZpZm8tPmJjaCkKKwkJCQkJcmVjdl9CY2hhbm5lbChmaWZvLT5iY2gpOworCQkJCWlmIChmaWZvLT5lY2gpCisJCQkJCXJlY3ZfRWNoYW5uZWwoZmlmby0+ZWNoLAorCQkJCQkJICAgICAmaHctPmRjaCk7CisJCQl9IGVsc2UgeworCQkJCWlmIChkZWJ1ZyAmIERCR19IRkNfRklGT19WRVJCT1NFKSB7CisJCQkJCXByaW50ayhLRVJOX0RFQlVHCisJCQkJCSAgICAiJXM6IENSQyBvciBtaW5sZW4gRVJST1IgZmlmb24oJWkpICIKKwkJCQkJICAgICJSWCBsZW4oJWkpOiAiLAorCQkJCQkgICAgaHctPm5hbWUsIGZpZm9uLCByeF9za2ItPmxlbik7CisJCQkJCWkgPSAwOworCQkJCQl3aGlsZSAoaSA8IHJ4X3NrYi0+bGVuKQorCQkJCQkJcHJpbnRrKCIlMDJ4ICIsCisJCQkJCQkgICAgcnhfc2tiLT5kYXRhW2krK10pOworCQkJCQlwcmludGsoIlxuIik7CisJCQkJfQorCQkJCXNrYl90cmltKHJ4X3NrYiwgMCk7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQkvKiBkZWxpdmVyIHRyYW5zcGFyZW50IGRhdGEgdG8gbGF5ZXIyICovCisJCWlmIChyeF9za2ItPmxlbiA+PSBwb2xsKQorCQkJcmVjdl9CY2hhbm5lbChmaWZvLT5iY2gpOworCX0KKwlzcGluX3VubG9jaygmaHctPmxvY2spOworfQorCit2b2lkCitmaWxsX2lzb2NfdXJiKHN0cnVjdCB1cmIgKnVyYiwgc3RydWN0IHVzYl9kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IHBpcGUsCisJICAgICAgdm9pZCAqYnVmLCBpbnQgbnVtX3BhY2tldHMsIGludCBwYWNrZXRfc2l6ZSwgaW50IGludGVydmFsLAorCSAgICAgIHVzYl9jb21wbGV0ZV90IGNvbXBsZXRlLCB2b2lkICpjb250ZXh0KQoreworCWludCBrOworCisJdXNiX2ZpbGxfYnVsa191cmIodXJiLCBkZXYsIHBpcGUsIGJ1ZiwgcGFja2V0X3NpemUgKiBudW1fcGFja2V0cywKKwkgICAgY29tcGxldGUsIGNvbnRleHQpOworCisJdXJiLT5udW1iZXJfb2ZfcGFja2V0cyA9IG51bV9wYWNrZXRzOworCXVyYi0+dHJhbnNmZXJfZmxhZ3MgPSBVUkJfSVNPX0FTQVA7CisJdXJiLT5hY3R1YWxfbGVuZ3RoID0gMDsKKwl1cmItPmludGVydmFsID0gaW50ZXJ2YWw7CisKKwlmb3IgKGsgPSAwOyBrIDwgbnVtX3BhY2tldHM7IGsrKykgeworCQl1cmItPmlzb19mcmFtZV9kZXNjW2tdLm9mZnNldCA9IHBhY2tldF9zaXplICogazsKKwkJdXJiLT5pc29fZnJhbWVfZGVzY1trXS5sZW5ndGggPSBwYWNrZXRfc2l6ZTsKKwkJdXJiLT5pc29fZnJhbWVfZGVzY1trXS5hY3R1YWxfbGVuZ3RoID0gMDsKKwl9Cit9CisKKy8qIHJlY2VpdmUgY29tcGxldGlvbiByb3V0aW5lIGZvciBhbGwgSVNPIHR4IGZpZm9zICAgKi8KK3N0YXRpYyB2b2lkCityeF9pc29fY29tcGxldGUoc3RydWN0IHVyYiAqdXJiKQoreworCXN0cnVjdCBpc29fdXJiICpjb250ZXh0X2lzb191cmIgPSAoc3RydWN0IGlzb191cmIgKikgdXJiLT5jb250ZXh0OworCXN0cnVjdCB1c2JfZmlmbyAqZmlmbyA9IGNvbnRleHRfaXNvX3VyYi0+b3duZXJfZmlmbzsKKwlzdHJ1Y3QgaGZjc3VzYiAqaHcgPSBmaWZvLT5odzsKKwlpbnQgaywgbGVuLCBlcnJjb2RlLCBvZmZzZXQsIG51bV9pc29jX3BhY2tldHMsIGZpZm9uLCBtYXhsZW4sCisJICAgIHN0YXR1cywgaXNvX3N0YXR1cywgaTsKKwlfX3U4ICpidWY7CisJc3RhdGljIF9fdTggZW9mWzhdOworCV9fdTggczBfc3RhdGU7CisKKwlmaWZvbiA9IGZpZm8tPmZpZm9udW07CisJc3RhdHVzID0gdXJiLT5zdGF0dXM7CisKKwlzcGluX2xvY2soJmh3LT5sb2NrKTsKKwlpZiAoZmlmby0+c3RvcF9ncmFjZWZ1bGwpIHsKKwkJZmlmby0+c3RvcF9ncmFjZWZ1bGwgPSAwOworCQlmaWZvLT5hY3RpdmUgPSAwOworCQlzcGluX3VubG9jaygmaHctPmxvY2spOworCQlyZXR1cm47CisJfQorCXNwaW5fdW5sb2NrKCZody0+bG9jayk7CisKKwkvKgorCSAqIElTTyB0cmFuc2ZlciBvbmx5IHBhcnRpYWxseSBjb21wbGV0ZWQsCisJICogbG9vayBhdCBpbmRpdmlkdWFsIGZyYW1lIHN0YXR1cyBmb3IgZGV0YWlscworCSAqLworCWlmIChzdGF0dXMgPT0gLUVYREVWKSB7CisJCWlmIChkZWJ1ZyAmIERFQlVHX0hXKQorCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAlczogd2l0aCAtRVhERVYgIgorCQkJICAgICJ1cmItPnN0YXR1cyAlZCwgZmlmb251bSAlZFxuIiwKKwkJCSAgICBody0+bmFtZSwgX19mdW5jX18sICBzdGF0dXMsIGZpZm9uKTsKKworCQkvKiBjbGVhciBzdGF0dXMsIHNvIGdvIG9uIHdpdGggSVNPIHRyYW5zZmVycyAqLworCQlzdGF0dXMgPSAwOworCX0KKworCXMwX3N0YXRlID0gMDsKKwlpZiAoZmlmby0+YWN0aXZlICYmICFzdGF0dXMpIHsKKwkJbnVtX2lzb2NfcGFja2V0cyA9IGlzb19wYWNrZXRzW2ZpZm9uXTsKKwkJbWF4bGVuID0gZmlmby0+dXNiX3BhY2tldF9tYXhsZW47CisKKwkJZm9yIChrID0gMDsgayA8IG51bV9pc29jX3BhY2tldHM7ICsraykgeworCQkJbGVuID0gdXJiLT5pc29fZnJhbWVfZGVzY1trXS5hY3R1YWxfbGVuZ3RoOworCQkJb2Zmc2V0ID0gdXJiLT5pc29fZnJhbWVfZGVzY1trXS5vZmZzZXQ7CisJCQlidWYgPSBjb250ZXh0X2lzb191cmItPmJ1ZmZlciArIG9mZnNldDsKKwkJCWlzb19zdGF0dXMgPSB1cmItPmlzb19mcmFtZV9kZXNjW2tdLnN0YXR1czsKKworCQkJaWYgKGlzb19zdGF0dXMgJiYgKGRlYnVnICYgREJHX0hGQ19GSUZPX1ZFUkJPU0UpKSB7CisJCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAlczogIgorCQkJCSAgICAiSVNPIHBhY2tldCAlaSwgc3RhdHVzOiAlaVxuIiwKKwkJCQkgICAgaHctPm5hbWUsIF9fZnVuY19fLCBrLCBpc29fc3RhdHVzKTsKKwkJCX0KKworCQkJLyogVVNCIGRhdGEgbG9nIGZvciBldmVyeSBEIElTTyBpbiAqLworCQkJaWYgKChmaWZvbiA9PSBIRkNVU0JfRF9SWCkgJiYKKwkJCSAgICAoZGVidWcgJiBEQkdfSEZDX1VTQl9WRVJCT1NFKSkgeworCQkJCXByaW50ayhLRVJOX0RFQlVHCisJCQkJICAgICIlczogJXM6ICVkICglZC8lZCkgbGVuKCVkKSAiLAorCQkJCSAgICBody0+bmFtZSwgX19mdW5jX18sIHVyYi0+c3RhcnRfZnJhbWUsCisJCQkJICAgIGssIG51bV9pc29jX3BhY2tldHMtMSwKKwkJCQkgICAgbGVuKTsKKwkJCQlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCisJCQkJCXByaW50aygiJXggIiwgYnVmW2ldKTsKKwkJCQlwcmludGsoIlxuIik7CisJCQl9CisKKwkJCWlmICghaXNvX3N0YXR1cykgeworCQkJCWlmIChmaWZvLT5sYXN0X3VyYmxlbiAhPSBtYXhsZW4pIHsKKwkJCQkJLyoKKwkJCQkJICogc2F2ZSBmaWZvIGZpbGwtbGV2ZWwgdGhyZXNob2xkIGJpdHMKKwkJCQkJICogdG8gdXNlIHRoZW0gbGF0ZXIgaW4gVFggSVNPIFVSQgorCQkJCQkgKiBjb21wbGV0aW9ucworCQkJCQkgKi8KKwkJCQkJaHctPnRocmVzaG9sZF9tYXNrID0gYnVmWzFdOworCisJCQkJCWlmIChmaWZvbiA9PSBIRkNVU0JfRF9SWCkKKwkJCQkJCXMwX3N0YXRlID0gKGJ1ZlswXSA+PiA0KTsKKworCQkJCQllb2ZbZmlmb25dID0gYnVmWzBdICYgMTsKKwkJCQkJaWYgKGxlbiA+IDIpCisJCQkJCQloZmNzdXNiX3J4X2ZyYW1lKGZpZm8sIGJ1ZiArIDIsCisJCQkJCQkJbGVuIC0gMiwgKGxlbiA8IG1heGxlbikKKwkJCQkJCQk/IGVvZltmaWZvbl0gOiAwKTsKKwkJCQl9IGVsc2UKKwkJCQkJaGZjc3VzYl9yeF9mcmFtZShmaWZvLCBidWYsIGxlbiwKKwkJCQkJCShsZW4gPCBtYXhsZW4pID8KKwkJCQkJCWVvZltmaWZvbl0gOiAwKTsKKwkJCQlmaWZvLT5sYXN0X3VyYmxlbiA9IGxlbjsKKwkJCX0KKwkJfQorCisJCS8qIHNpZ25hbCBTMCBsYXllcjEgc3RhdGUgY2hhbmdlICovCisJCWlmICgoczBfc3RhdGUpICYmIChody0+aW5pdGRvbmUpICYmCisJCSAgICAoczBfc3RhdGUgIT0gaHctPmRjaC5zdGF0ZSkpIHsKKwkJCWh3LT5kY2guc3RhdGUgPSBzMF9zdGF0ZTsKKwkJCXNjaGVkdWxlX2V2ZW50KCZody0+ZGNoLCBGTEdfUEhDSEFOR0UpOworCQl9CisKKwkJZmlsbF9pc29jX3VyYih1cmIsIGZpZm8tPmh3LT5kZXYsIGZpZm8tPnBpcGUsCisJCQkgICAgICBjb250ZXh0X2lzb191cmItPmJ1ZmZlciwgbnVtX2lzb2NfcGFja2V0cywKKwkJCSAgICAgIGZpZm8tPnVzYl9wYWNrZXRfbWF4bGVuLCBmaWZvLT5pbnRlcnZhbGwsCisJCQkgICAgICAodXNiX2NvbXBsZXRlX3QpcnhfaXNvX2NvbXBsZXRlLCB1cmItPmNvbnRleHQpOworCQllcnJjb2RlID0gdXNiX3N1Ym1pdF91cmIodXJiLCBHRlBfQVRPTUlDKTsKKwkJaWYgKGVycmNvZGUgPCAwKSB7CisJCQlpZiAoZGVidWcgJiBERUJVR19IVykKKwkJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6ICVzOiBlcnJvciBzdWJtaXR0aW5nICIKKwkJCQkgICAgIklTTyBVUkI6ICVkXG4iLAorCQkJCSAgICBody0+bmFtZSwgX19mdW5jX18sIGVycmNvZGUpOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKHN0YXR1cyAmJiAoZGVidWcgJiBEQkdfSEZDX1VSQl9JTkZPKSkKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlczogJXM6IHJ4X2lzb19jb21wbGV0ZSA6ICIKKwkJCSAgICAidXJiLT5zdGF0dXMgJWQsIGZpZm9udW0gJWRcbiIsCisJCQkgICAgaHctPm5hbWUsIF9fZnVuY19fLCBzdGF0dXMsIGZpZm9uKTsKKwl9Cit9CisKKy8qIHJlY2VpdmUgY29tcGxldGlvbiByb3V0aW5lIGZvciBhbGwgaW50ZXJydXB0IHJ4IGZpZm9zICovCitzdGF0aWMgdm9pZAorcnhfaW50X2NvbXBsZXRlKHN0cnVjdCB1cmIgKnVyYikKK3sKKwlpbnQgbGVuLCBzdGF0dXMsIGk7CisJX191OCAqYnVmLCBtYXhsZW4sIGZpZm9uOworCXN0cnVjdCB1c2JfZmlmbyAqZmlmbyA9IChzdHJ1Y3QgdXNiX2ZpZm8gKikgdXJiLT5jb250ZXh0OworCXN0cnVjdCBoZmNzdXNiICpodyA9IGZpZm8tPmh3OworCXN0YXRpYyBfX3U4IGVvZls4XTsKKworCXNwaW5fbG9jaygmaHctPmxvY2spOworCWlmIChmaWZvLT5zdG9wX2dyYWNlZnVsbCkgeworCQlmaWZvLT5zdG9wX2dyYWNlZnVsbCA9IDA7CisJCWZpZm8tPmFjdGl2ZSA9IDA7CisJCXNwaW5fdW5sb2NrKCZody0+bG9jayk7CisJCXJldHVybjsKKwl9CisJc3Bpbl91bmxvY2soJmh3LT5sb2NrKTsKKworCWZpZm9uID0gZmlmby0+Zmlmb251bTsKKwlpZiAoKCFmaWZvLT5hY3RpdmUpIHx8ICh1cmItPnN0YXR1cykpIHsKKwkJaWYgKGRlYnVnICYgREJHX0hGQ19VUkJfRVJST1IpCisJCQlwcmludGsoS0VSTl9ERUJVRworCQkJICAgICIlczogJXM6IFJYLUZpZm8gJWkgaXMgZ29pbmcgZG93biAoJWkpXG4iLAorCQkJICAgIGh3LT5uYW1lLCBfX2Z1bmNfXywgZmlmb24sIHVyYi0+c3RhdHVzKTsKKworCQlmaWZvLT51cmItPmludGVydmFsID0gMDsgLyogY2FuY2VsIGF1dG9tYXRpYyByZXNjaGVkdWxpbmcgKi8KKwkJcmV0dXJuOworCX0KKwlsZW4gPSB1cmItPmFjdHVhbF9sZW5ndGg7CisJYnVmID0gZmlmby0+YnVmZmVyOworCW1heGxlbiA9IGZpZm8tPnVzYl9wYWNrZXRfbWF4bGVuOworCisJLyogVVNCIGRhdGEgbG9nIGZvciBldmVyeSBEIElOVCBpbiAqLworCWlmICgoZmlmb24gPT0gSEZDVVNCX0RfUlgpICYmIChkZWJ1ZyAmIERCR19IRkNfVVNCX1ZFUkJPU0UpKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICIlczogJXM6IEQgUlggSU5UIGxlbiglZCkgIiwKKwkJICAgIGh3LT5uYW1lLCBfX2Z1bmNfXywgbGVuKTsKKwkJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQorCQkJcHJpbnRrKCIlMDJ4ICIsIGJ1ZltpXSk7CisJCXByaW50aygiXG4iKTsKKwl9CisKKwlpZiAoZmlmby0+bGFzdF91cmJsZW4gIT0gZmlmby0+dXNiX3BhY2tldF9tYXhsZW4pIHsKKwkJLyogdGhlIHRocmVzaG9sZCBtYXNrIGlzIGluIHRoZSAybmQgc3RhdHVzIGJ5dGUgKi8KKwkJaHctPnRocmVzaG9sZF9tYXNrID0gYnVmWzFdOworCisJCS8qIHNpZ25hbCBTMCBsYXllcjEgc3RhdGUgY2hhbmdlICovCisJCWlmIChody0+aW5pdGRvbmUgJiYgKChidWZbMF0gPj4gNCkgIT0gaHctPmRjaC5zdGF0ZSkpIHsKKwkJCWh3LT5kY2guc3RhdGUgPSAoYnVmWzBdID4+IDQpOworCQkJc2NoZWR1bGVfZXZlbnQoJmh3LT5kY2gsIEZMR19QSENIQU5HRSk7CisJCX0KKworCQllb2ZbZmlmb25dID0gYnVmWzBdICYgMTsKKwkJLyogaWYgd2UgaGF2ZSBtb3JlIHRoYW4gdGhlIDIgc3RhdHVzIGJ5dGVzIC0+IGNvbGxlY3QgZGF0YSAqLworCQlpZiAobGVuID4gMikKKwkJCWhmY3N1c2JfcnhfZnJhbWUoZmlmbywgYnVmICsgMiwKKwkJCSAgIHVyYi0+YWN0dWFsX2xlbmd0aCAtIDIsCisJCQkgICAobGVuIDwgbWF4bGVuKSA/IGVvZltmaWZvbl0gOiAwKTsKKwl9IGVsc2UgeworCQloZmNzdXNiX3J4X2ZyYW1lKGZpZm8sIGJ1ZiwgdXJiLT5hY3R1YWxfbGVuZ3RoLAorCQkJCSAobGVuIDwgbWF4bGVuKSA/IGVvZltmaWZvbl0gOiAwKTsKKwl9CisJZmlmby0+bGFzdF91cmJsZW4gPSB1cmItPmFjdHVhbF9sZW5ndGg7CisKKwlzdGF0dXMgPSB1c2Jfc3VibWl0X3VyYih1cmIsIEdGUF9BVE9NSUMpOworCWlmIChzdGF0dXMpIHsKKwkJaWYgKGRlYnVnICYgREVCVUdfSFcpCisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6ICVzOiBlcnJvciByZXN1Ym1pdHRpbmcgVVNCXG4iLAorCQkJICAgIGh3LT5uYW1lLCBfX2Z1bmNfXyk7CisJfQorfQorCisvKiB0cmFuc21pdCBjb21wbGV0aW9uIHJvdXRpbmUgZm9yIGFsbCBJU08gdHggZmlmb3MgKi8KK3N0YXRpYyB2b2lkCit0eF9pc29fY29tcGxldGUoc3RydWN0IHVyYiAqdXJiKQoreworCXN0cnVjdCBpc29fdXJiICpjb250ZXh0X2lzb191cmIgPSAoc3RydWN0IGlzb191cmIgKikgdXJiLT5jb250ZXh0OworCXN0cnVjdCB1c2JfZmlmbyAqZmlmbyA9IGNvbnRleHRfaXNvX3VyYi0+b3duZXJfZmlmbzsKKwlzdHJ1Y3QgaGZjc3VzYiAqaHcgPSBmaWZvLT5odzsKKwlzdHJ1Y3Qgc2tfYnVmZiAqdHhfc2tiOworCWludCBrLCB0eF9vZmZzZXQsIG51bV9pc29jX3BhY2tldHMsIHNpbmssIHJlbWFpbiwgY3VycmVudF9sZW4sCisJICAgIGVycmNvZGUsIGhkbGMsIGk7CisJaW50ICp0eF9pZHg7CisJaW50IGZyYW1lX2NvbXBsZXRlLCBmaWZvbiwgc3RhdHVzOworCV9fdTggdGhyZXNoYml0OworCisJc3Bpbl9sb2NrKCZody0+bG9jayk7CisJaWYgKGZpZm8tPnN0b3BfZ3JhY2VmdWxsKSB7CisJCWZpZm8tPnN0b3BfZ3JhY2VmdWxsID0gMDsKKwkJZmlmby0+YWN0aXZlID0gMDsKKwkJc3Bpbl91bmxvY2soJmh3LT5sb2NrKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChmaWZvLT5kY2gpIHsKKwkJdHhfc2tiID0gZmlmby0+ZGNoLT50eF9za2I7CisJCXR4X2lkeCA9ICZmaWZvLT5kY2gtPnR4X2lkeDsKKwkJaGRsYyA9IDE7CisJfSBlbHNlIGlmIChmaWZvLT5iY2gpIHsKKwkJdHhfc2tiID0gZmlmby0+YmNoLT50eF9za2I7CisJCXR4X2lkeCA9ICZmaWZvLT5iY2gtPnR4X2lkeDsKKwkJaGRsYyA9IHRlc3RfYml0KEZMR19IRExDLCAmZmlmby0+YmNoLT5GbGFncyk7CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAlczogbmVpdGhlciBCQ0ggbm9yIERDSFxuIiwKKwkJICAgIGh3LT5uYW1lLCBfX2Z1bmNfXyk7CisJCXNwaW5fdW5sb2NrKCZody0+bG9jayk7CisJCXJldHVybjsKKwl9CisKKwlmaWZvbiA9IGZpZm8tPmZpZm9udW07CisJc3RhdHVzID0gdXJiLT5zdGF0dXM7CisKKwl0eF9vZmZzZXQgPSAwOworCisJLyoKKwkgKiBJU08gdHJhbnNmZXIgb25seSBwYXJ0aWFsbHkgY29tcGxldGVkLAorCSAqIGxvb2sgYXQgaW5kaXZpZHVhbCBmcmFtZSBzdGF0dXMgZm9yIGRldGFpbHMKKwkgKi8KKwlpZiAoc3RhdHVzID09IC1FWERFVikgeworCQlpZiAoZGVidWcgJiBEQkdfSEZDX1VSQl9FUlJPUikKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlczogJXM6ICIKKwkJCSAgICAiLUVYREVWICglaSkgZmlmb24gKCVkKVxuIiwKKwkJCSAgICBody0+bmFtZSwgX19mdW5jX18sIHN0YXR1cywgZmlmb24pOworCisJCS8qIGNsZWFyIHN0YXR1cywgc28gZ28gb24gd2l0aCBJU08gdHJhbnNmZXJzICovCisJCXN0YXR1cyA9IDA7CisJfQorCisJaWYgKGZpZm8tPmFjdGl2ZSAmJiAhc3RhdHVzKSB7CisJCS8qIGlzIEZpZm9GdWxsLXRocmVzaG9sZCBzZXQgZm9yIG91ciBjaGFubmVsPyAqLworCQl0aHJlc2hiaXQgPSAoaHctPnRocmVzaG9sZF9tYXNrICYgKDEgPDwgZmlmb24pKTsKKwkJbnVtX2lzb2NfcGFja2V0cyA9IGlzb19wYWNrZXRzW2ZpZm9uXTsKKworCQkvKiBwcmVkaWN0IGRhdGFmbG93IHRvIGF2b2lkIGZpZm8gb3ZlcmZsb3cgKi8KKwkJaWYgKGZpZm9uID49IEhGQ1VTQl9EX1RYKQorCQkJc2luayA9ICh0aHJlc2hiaXQpID8gU0lOS19ETUlOIDogU0lOS19ETUFYOworCQllbHNlCisJCQlzaW5rID0gKHRocmVzaGJpdCkgPyBTSU5LX01JTiA6IFNJTktfTUFYOworCQlmaWxsX2lzb2NfdXJiKHVyYiwgZmlmby0+aHctPmRldiwgZmlmby0+cGlwZSwKKwkJCSAgICAgIGNvbnRleHRfaXNvX3VyYi0+YnVmZmVyLCBudW1faXNvY19wYWNrZXRzLAorCQkJICAgICAgZmlmby0+dXNiX3BhY2tldF9tYXhsZW4sIGZpZm8tPmludGVydmFsbCwKKwkJCSAgICAgICh1c2JfY29tcGxldGVfdCl0eF9pc29fY29tcGxldGUsIHVyYi0+Y29udGV4dCk7CisJCW1lbXNldChjb250ZXh0X2lzb191cmItPmJ1ZmZlciwgMCwKKwkJICAgICAgIHNpemVvZihjb250ZXh0X2lzb191cmItPmJ1ZmZlcikpOworCQlmcmFtZV9jb21wbGV0ZSA9IDA7CisKKwkJZm9yIChrID0gMDsgayA8IG51bV9pc29jX3BhY2tldHM7ICsraykgeworCQkJLyogYW5hbHl6ZSB0eCBzdWNjZXNzIG9mIHByZXZpb3VzIElTTyBwYWNrZXRzICovCisJCQlpZiAoZGVidWcgJiBEQkdfSEZDX1VSQl9FUlJPUikgeworCQkJCWVycmNvZGUgPSB1cmItPmlzb19mcmFtZV9kZXNjW2tdLnN0YXR1czsKKwkJCQlpZiAoZXJyY29kZSkgeworCQkJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6ICVzOiAiCisJCQkJCSAgICAiSVNPIHBhY2tldCAlaSwgc3RhdHVzOiAlaVxuIiwKKwkJCQkJICAgICBody0+bmFtZSwgX19mdW5jX18sIGssIGVycmNvZGUpOworCQkJCX0KKwkJCX0KKworCQkJLyogR2VuZXJhdGUgbmV4dCBJU08gUGFja2V0cyAqLworCQkJaWYgKHR4X3NrYikKKwkJCQlyZW1haW4gPSB0eF9za2ItPmxlbiAtICp0eF9pZHg7CisJCQllbHNlCisJCQkJcmVtYWluID0gMDsKKworCQkJaWYgKHJlbWFpbiA+IDApIHsKKwkJCQlmaWZvLT5iaXRfbGluZSAtPSBzaW5rOworCQkJCWN1cnJlbnRfbGVuID0gKDAgLSBmaWZvLT5iaXRfbGluZSkgLyA4OworCQkJCWlmIChjdXJyZW50X2xlbiA+IDE0KQorCQkJCQljdXJyZW50X2xlbiA9IDE0OworCQkJCWlmIChjdXJyZW50X2xlbiA8IDApCisJCQkJCWN1cnJlbnRfbGVuID0gMDsKKwkJCQlpZiAocmVtYWluIDwgY3VycmVudF9sZW4pCisJCQkJCWN1cnJlbnRfbGVuID0gcmVtYWluOworCisJCQkJLyogaG93IG11Y2ggYml0IGRvIHdlIHB1dCBvbiB0aGUgbGluZT8gKi8KKwkJCQlmaWZvLT5iaXRfbGluZSArPSBjdXJyZW50X2xlbiAqIDg7CisKKwkJCQljb250ZXh0X2lzb191cmItPmJ1ZmZlclt0eF9vZmZzZXRdID0gMDsKKwkJCQlpZiAoY3VycmVudF9sZW4gPT0gcmVtYWluKSB7CisJCQkJCWlmIChoZGxjKSB7CisJCQkJCQkvKiBzaWduYWwgZnJhbWUgY29tcGxldGlvbiAqLworCQkJCQkJY29udGV4dF9pc29fdXJiLT4KKwkJCQkJCSAgICBidWZmZXJbdHhfb2Zmc2V0XSA9IDE7CisJCQkJCQkvKiBhZGQgMiBieXRlIGZsYWdzIGFuZCAxNmJpdAorCQkJCQkJICogQ1JDIGF0IGVuZCBvZiBJU0ROIGZyYW1lICovCisJCQkJCQlmaWZvLT5iaXRfbGluZSArPSAzMjsKKwkJCQkJfQorCQkJCQlmcmFtZV9jb21wbGV0ZSA9IDE7CisJCQkJfQorCisJCQkJLyogY29weSB0eCBkYXRhIHRvIGlzby11cmIgYnVmZmVyICovCisJCQkJbWVtY3B5KGNvbnRleHRfaXNvX3VyYi0+YnVmZmVyICsgdHhfb2Zmc2V0ICsgMSwKKwkJCQkgICAgICAgKHR4X3NrYi0+ZGF0YSArICp0eF9pZHgpLCBjdXJyZW50X2xlbik7CisJCQkJKnR4X2lkeCArPSBjdXJyZW50X2xlbjsKKworCQkJCXVyYi0+aXNvX2ZyYW1lX2Rlc2Nba10ub2Zmc2V0ID0gdHhfb2Zmc2V0OworCQkJCXVyYi0+aXNvX2ZyYW1lX2Rlc2Nba10ubGVuZ3RoID0gY3VycmVudF9sZW4gKyAxOworCisJCQkJLyogVVNCIGRhdGEgbG9nIGZvciBldmVyeSBEIElTTyBvdXQgKi8KKwkJCQlpZiAoKGZpZm9uID09IEhGQ1VTQl9EX1JYKSAmJgorCQkJCSAgICAoZGVidWcgJiBEQkdfSEZDX1VTQl9WRVJCT1NFKSkgeworCQkJCQlwcmludGsoS0VSTl9ERUJVRworCQkJCQkgICAgIiVzOiAlcyAoJWQvJWQpIG9mZnMoJWQpIGxlbiglZCkgIiwKKwkJCQkJICAgIGh3LT5uYW1lLCBfX2Z1bmNfXywKKwkJCQkJICAgIGssIG51bV9pc29jX3BhY2tldHMtMSwKKwkJCQkJICAgIHVyYi0+aXNvX2ZyYW1lX2Rlc2Nba10ub2Zmc2V0LAorCQkJCQkgICAgdXJiLT5pc29fZnJhbWVfZGVzY1trXS5sZW5ndGgpOworCisJCQkJCWZvciAoaSA9IHVyYi0+aXNvX2ZyYW1lX2Rlc2Nba10ub2Zmc2V0OworCQkJCQkgICAgIGkgPCAodXJiLT5pc29fZnJhbWVfZGVzY1trXS5vZmZzZXQKKwkJCQkJICAgICArIHVyYi0+aXNvX2ZyYW1lX2Rlc2Nba10ubGVuZ3RoKTsKKwkJCQkJICAgICBpKyspCisJCQkJCQlwcmludGsoIiV4ICIsCisJCQkJCQkgICAgY29udGV4dF9pc29fdXJiLT5idWZmZXJbaV0pOworCisJCQkJCXByaW50aygiIHNrYi0+bGVuKCVpKSB0eC1pZHgoJWQpXG4iLAorCQkJCQkgICAgdHhfc2tiLT5sZW4sICp0eF9pZHgpOworCQkJCX0KKworCQkJCXR4X29mZnNldCArPSAoY3VycmVudF9sZW4gKyAxKTsKKwkJCX0gZWxzZSB7CisJCQkJdXJiLT5pc29fZnJhbWVfZGVzY1trXS5vZmZzZXQgPSB0eF9vZmZzZXQrKzsKKwkJCQl1cmItPmlzb19mcmFtZV9kZXNjW2tdLmxlbmd0aCA9IDE7CisJCQkJLyogd2UgbG93ZXIgZGF0YSBtYXJnaW4gZXZlcnkgbXNlYyAqLworCQkJCWZpZm8tPmJpdF9saW5lIC09IHNpbms7CisJCQkJaWYgKGZpZm8tPmJpdF9saW5lIDwgQklUTElORV9JTkYpCisJCQkJCWZpZm8tPmJpdF9saW5lID0gQklUTElORV9JTkY7CisJCQl9CisKKwkJCWlmIChmcmFtZV9jb21wbGV0ZSkgeworCQkJCWZyYW1lX2NvbXBsZXRlID0gMDsKKworCQkJCWlmIChkZWJ1ZyAmIERCR19IRkNfRklGT19WRVJCT1NFKSB7CisJCQkJCXByaW50ayhLRVJOX0RFQlVHICAiJXM6ICVzOiAiCisJCQkJCSAgICAiZmlmb24oJWkpIG5ldyBUWCBsZW4oJWkpOiAiLAorCQkJCQkgICAgaHctPm5hbWUsIF9fZnVuY19fLAorCQkJCQkgICAgZmlmb24sIHR4X3NrYi0+bGVuKTsKKwkJCQkJaSA9IDA7CisJCQkJCXdoaWxlIChpIDwgdHhfc2tiLT5sZW4pCisJCQkJCQlwcmludGsoIiUwMnggIiwKKwkJCQkJCSAgICB0eF9za2ItPmRhdGFbaSsrXSk7CisJCQkJCXByaW50aygiXG4iKTsKKwkJCQl9CisKKwkJCQlkZXZfa2ZyZWVfc2tiKHR4X3NrYik7CisJCQkJdHhfc2tiID0gTlVMTDsKKwkJCQlpZiAoZmlmby0+ZGNoICYmIGdldF9uZXh0X2RmcmFtZShmaWZvLT5kY2gpKQorCQkJCQl0eF9za2IgPSBmaWZvLT5kY2gtPnR4X3NrYjsKKwkJCQllbHNlIGlmIChmaWZvLT5iY2ggJiYKKwkJCQkgICAgZ2V0X25leHRfYmZyYW1lKGZpZm8tPmJjaCkpIHsKKwkJCQkJaWYgKHRlc3RfYml0KEZMR19UUkFOU1BBUkVOVCwKKwkJCQkJICAgICZmaWZvLT5iY2gtPkZsYWdzKSkKKwkJCQkJCWNvbmZpcm1fQnNlbmQoZmlmby0+YmNoKTsKKwkJCQkJdHhfc2tiID0gZmlmby0+YmNoLT50eF9za2I7CisJCQkJfQorCQkJfQorCQl9CisJCWVycmNvZGUgPSB1c2Jfc3VibWl0X3VyYih1cmIsIEdGUF9BVE9NSUMpOworCQlpZiAoZXJyY29kZSA8IDApIHsKKwkJCWlmIChkZWJ1ZyAmIERFQlVHX0hXKQorCQkJCXByaW50ayhLRVJOX0RFQlVHCisJCQkJICAgICIlczogJXM6IGVycm9yIHN1Ym1pdHRpbmcgSVNPIFVSQjogJWQgXG4iLAorCQkJCSAgICBody0+bmFtZSwgX19mdW5jX18sIGVycmNvZGUpOworCQl9CisKKwkJLyoKKwkJICogYWJ1c2UgRENoYW5uZWwgdHggaXNvIGNvbXBsZXRpb24gdG8gdHJpZ2dlciBOVCBtb2RlIHN0YXRlCisJCSAqIGNoYW5nZXMgdHhfaXNvX2NvbXBsZXRlIGlzIGFzc3VtZWQgdG8gYmUgY2FsbGVkIGV2ZXJ5CisJCSAqIGZpZm8tPmludGVydmFsbCAobXMpCisJCSAqLworCQlpZiAoKGZpZm9uID09IEhGQ1VTQl9EX1RYKSAmJiAoaHctPnByb3RvY29sID09IElTRE5fUF9OVF9TMCkKKwkJICAgICYmIChody0+dGltZXJzICYgTlRfQUNUSVZBVElPTl9USU1FUikpIHsKKwkJCWlmICgoLS1ody0+bnRfdGltZXIpIDwgMCkKKwkJCQlzY2hlZHVsZV9ldmVudCgmaHctPmRjaCwgRkxHX1BIQ0hBTkdFKTsKKwkJfQorCisJfSBlbHNlIHsKKwkJaWYgKHN0YXR1cyAmJiAoZGVidWcgJiBEQkdfSEZDX1VSQl9FUlJPUikpCisJCQlwcmludGsoS0VSTl9ERUJVRyAgIiVzOiAlczogdXJiLT5zdGF0dXMgJXMgKCVpKSIKKwkJCSAgICAiZmlmb251bT0lZFxuIiwKKwkJCSAgICBody0+bmFtZSwgX19mdW5jX18sCisJCQkgICAgc3ltYm9saWModXJiX2Vycmxpc3QsIHN0YXR1cyksIHN0YXR1cywgZmlmb24pOworCX0KKwlzcGluX3VubG9jaygmaHctPmxvY2spOworfQorCisvKgorICogYWxsb2NzIHVyYnMgYW5kIHN0YXJ0IGlzb2MgdHJhbnNmZXIgd2l0aCB0d28gcGVuZGluZyB1cmJzIHRvIGF2b2lkCisgKiBnYXBzIGluIHRoZSB0cmFuc2ZlciBjaGFpbgorICovCitzdGF0aWMgaW50CitzdGFydF9pc29jX2NoYWluKHN0cnVjdCB1c2JfZmlmbyAqZmlmbywgaW50IG51bV9wYWNrZXRzX3Blcl91cmIsCisJCSB1c2JfY29tcGxldGVfdCBjb21wbGV0ZSwgaW50IHBhY2tldF9zaXplKQoreworCXN0cnVjdCBoZmNzdXNiICpodyA9IGZpZm8tPmh3OworCWludCBpLCBrLCBlcnJjb2RlOworCisJaWYgKGRlYnVnKQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6ICVzOiBmaWZvICVpXG4iLAorCQkgICAgaHctPm5hbWUsIF9fZnVuY19fLCBmaWZvLT5maWZvbnVtKTsKKworCS8qIGFsbG9jYXRlIE1lbW9yeSBmb3IgSXNvIG91dCBVcmJzICovCisJZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworCQlpZiAoIShmaWZvLT5pc29baV0udXJiKSkgeworCQkJZmlmby0+aXNvW2ldLnVyYiA9CisJCQkgICAgdXNiX2FsbG9jX3VyYihudW1fcGFja2V0c19wZXJfdXJiLCBHRlBfS0VSTkVMKTsKKwkJCWlmICghKGZpZm8tPmlzb1tpXS51cmIpKSB7CisJCQkJcHJpbnRrKEtFUk5fREVCVUcKKwkJCQkgICAgIiVzOiAlczogYWxsb2MgdXJiIGZvciBmaWZvICVpIGZhaWxlZCIsCisJCQkJICAgIGh3LT5uYW1lLCBfX2Z1bmNfXywgZmlmby0+Zmlmb251bSk7CisJCQl9CisJCQlmaWZvLT5pc29baV0ub3duZXJfZmlmbyA9IChzdHJ1Y3QgdXNiX2ZpZm8gKikgZmlmbzsKKwkJCWZpZm8tPmlzb1tpXS5pbmR4ID0gaTsKKworCQkJLyogSW5pdCB0aGUgZmlyc3QgaXNvICovCisJCQlpZiAoSVNPX0JVRkZFUl9TSVpFID49CisJCQkgICAgKGZpZm8tPnVzYl9wYWNrZXRfbWF4bGVuICoKKwkJCSAgICAgbnVtX3BhY2tldHNfcGVyX3VyYikpIHsKKwkJCQlmaWxsX2lzb2NfdXJiKGZpZm8tPmlzb1tpXS51cmIsCisJCQkJICAgIGZpZm8tPmh3LT5kZXYsIGZpZm8tPnBpcGUsCisJCQkJICAgIGZpZm8tPmlzb1tpXS5idWZmZXIsCisJCQkJICAgIG51bV9wYWNrZXRzX3Blcl91cmIsCisJCQkJICAgIGZpZm8tPnVzYl9wYWNrZXRfbWF4bGVuLAorCQkJCSAgICBmaWZvLT5pbnRlcnZhbGwsIGNvbXBsZXRlLAorCQkJCSAgICAmZmlmby0+aXNvW2ldKTsKKwkJCQltZW1zZXQoZmlmby0+aXNvW2ldLmJ1ZmZlciwgMCwKKwkJCQkgICAgICAgc2l6ZW9mKGZpZm8tPmlzb1tpXS5idWZmZXIpKTsKKworCQkJCWZvciAoayA9IDA7IGsgPCBudW1fcGFja2V0c19wZXJfdXJiOyBrKyspIHsKKwkJCQkJZmlmby0+aXNvW2ldLnVyYi0+CisJCQkJCSAgICBpc29fZnJhbWVfZGVzY1trXS5vZmZzZXQgPQorCQkJCQkgICAgayAqIHBhY2tldF9zaXplOworCQkJCQlmaWZvLT5pc29baV0udXJiLT4KKwkJCQkJICAgIGlzb19mcmFtZV9kZXNjW2tdLmxlbmd0aCA9CisJCQkJCSAgICBwYWNrZXRfc2l6ZTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCXByaW50ayhLRVJOX0RFQlVHCisJCQkJICAgICIlczogJXM6IElTTyBCdWZmZXIgc2l6ZSB0byBzbWFsbCFcbiIsCisJCQkJICAgIGh3LT5uYW1lLCBfX2Z1bmNfXyk7CisJCQl9CisJCX0KKwkJZmlmby0+Yml0X2xpbmUgPSBCSVRMSU5FX0lORjsKKworCQllcnJjb2RlID0gdXNiX3N1Ym1pdF91cmIoZmlmby0+aXNvW2ldLnVyYiwgR0ZQX0tFUk5FTCk7CisJCWZpZm8tPmFjdGl2ZSA9IChlcnJjb2RlID49IDApID8gMSA6IDA7CisJCWZpZm8tPnN0b3BfZ3JhY2VmdWxsID0gMDsKKwkJaWYgKGVycmNvZGUgPCAwKSB7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6ICVzOiAlcyBVUkIgbnI6JWRcbiIsCisJCQkgICAgaHctPm5hbWUsIF9fZnVuY19fLAorCQkJICAgIHN5bWJvbGljKHVyYl9lcnJsaXN0LCBlcnJjb2RlKSwgaSk7CisJCX0KKwl9CisJcmV0dXJuIGZpZm8tPmFjdGl2ZTsKK30KKworc3RhdGljIHZvaWQKK3N0b3BfaXNvX2dyYWNlZnVsbChzdHJ1Y3QgdXNiX2ZpZm8gKmZpZm8pCit7CisJc3RydWN0IGhmY3N1c2IgKmh3ID0gZmlmby0+aHc7CisJaW50IGksIHRpbWVvdXQ7CisJdV9sb25nIGZsYWdzOworCisJZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaHctPmxvY2ssIGZsYWdzKTsKKwkJaWYgKGRlYnVnKQorCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAlcyBmb3IgZmlmbyAlaS4laVxuIiwKKwkJCSAgICAgICBody0+bmFtZSwgX19mdW5jX18sIGZpZm8tPmZpZm9udW0sIGkpOworCQlmaWZvLT5zdG9wX2dyYWNlZnVsbCA9IDE7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmh3LT5sb2NrLCBmbGFncyk7CisJfQorCisJZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworCQl0aW1lb3V0ID0gMzsKKwkJd2hpbGUgKGZpZm8tPnN0b3BfZ3JhY2VmdWxsICYmIHRpbWVvdXQtLSkKKwkJCXNjaGVkdWxlX3RpbWVvdXRfaW50ZXJydXB0aWJsZSgoSFovMTAwMCkqMTYpOworCQlpZiAoZGVidWcgJiYgZmlmby0+c3RvcF9ncmFjZWZ1bGwpCisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IEVSUk9SICVzIGZvciBmaWZvICVpLiVpXG4iLAorCQkJCWh3LT5uYW1lLCBfX2Z1bmNfXywgZmlmby0+Zmlmb251bSwgaSk7CisJfQorfQorCitzdGF0aWMgdm9pZAorc3RvcF9pbnRfZ3JhY2VmdWxsKHN0cnVjdCB1c2JfZmlmbyAqZmlmbykKK3sKKwlzdHJ1Y3QgaGZjc3VzYiAqaHcgPSBmaWZvLT5odzsKKwlpbnQgdGltZW91dDsKKwl1X2xvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaHctPmxvY2ssIGZsYWdzKTsKKwlpZiAoZGVidWcpCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogJXMgZm9yIGZpZm8gJWlcbiIsCisJCSAgICAgICBody0+bmFtZSwgX19mdW5jX18sIGZpZm8tPmZpZm9udW0pOworCWZpZm8tPnN0b3BfZ3JhY2VmdWxsID0gMTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZody0+bG9jaywgZmxhZ3MpOworCisJdGltZW91dCA9IDM7CisJd2hpbGUgKGZpZm8tPnN0b3BfZ3JhY2VmdWxsICYmIHRpbWVvdXQtLSkKKwkJc2NoZWR1bGVfdGltZW91dF9pbnRlcnJ1cHRpYmxlKChIWi8xMDAwKSozKTsKKwlpZiAoZGVidWcgJiYgZmlmby0+c3RvcF9ncmFjZWZ1bGwpCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogRVJST1IgJXMgZm9yIGZpZm8gJWlcbiIsCisJCSAgICAgICBody0+bmFtZSwgX19mdW5jX18sIGZpZm8tPmZpZm9udW0pOworfQorCisvKiBzdGFydCB0aGUgaW50ZXJydXB0IHRyYW5zZmVyIGZvciB0aGUgZ2l2ZW4gZmlmbyAqLworc3RhdGljIHZvaWQKK3N0YXJ0X2ludF9maWZvKHN0cnVjdCB1c2JfZmlmbyAqZmlmbykKK3sKKwlzdHJ1Y3QgaGZjc3VzYiAqaHcgPSBmaWZvLT5odzsKKwlpbnQgZXJyY29kZTsKKworCWlmIChkZWJ1ZykKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAlczogSU5UIElOIGZpZm86JWRcbiIsCisJCSAgICBody0+bmFtZSwgX19mdW5jX18sIGZpZm8tPmZpZm9udW0pOworCisJaWYgKCFmaWZvLT51cmIpIHsKKwkJZmlmby0+dXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFmaWZvLT51cmIpCisJCQlyZXR1cm47CisJfQorCXVzYl9maWxsX2ludF91cmIoZmlmby0+dXJiLCBmaWZvLT5ody0+ZGV2LCBmaWZvLT5waXBlLAorCSAgICBmaWZvLT5idWZmZXIsIGZpZm8tPnVzYl9wYWNrZXRfbWF4bGVuLAorCSAgICAodXNiX2NvbXBsZXRlX3QpcnhfaW50X2NvbXBsZXRlLCBmaWZvLCBmaWZvLT5pbnRlcnZhbGwpOworCWZpZm8tPmFjdGl2ZSA9IDE7CisJZmlmby0+c3RvcF9ncmFjZWZ1bGwgPSAwOworCWVycmNvZGUgPSB1c2Jfc3VibWl0X3VyYihmaWZvLT51cmIsIEdGUF9LRVJORUwpOworCWlmIChlcnJjb2RlKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICIlczogJXM6IHN1Ym1pdCBVUkI6IHN0YXR1czolaVxuIiwKKwkJICAgIGh3LT5uYW1lLCBfX2Z1bmNfXywgZXJyY29kZSk7CisJCWZpZm8tPmFjdGl2ZSA9IDA7CisJfQorfQorCitzdGF0aWMgdm9pZAorc2V0UG9ydE1vZGUoc3RydWN0IGhmY3N1c2IgKmh3KQoreworCWlmIChkZWJ1ZyAmIERFQlVHX0hXKQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6ICVzICVzXG4iLCBody0+bmFtZSwgX19mdW5jX18sCisJCSAgIChody0+cHJvdG9jb2wgPT0gSVNETl9QX1RFX1MwKSA/ICJURSIgOiAiTlQiKTsKKworCWlmIChody0+cHJvdG9jb2wgPT0gSVNETl9QX1RFX1MwKSB7CisJCXdyaXRlX3JlZyhodywgSEZDVVNCX1NDVFJMLCAweDQwKTsKKwkJd3JpdGVfcmVnKGh3LCBIRkNVU0JfU0NUUkxfRSwgMHgwMCk7CisJCXdyaXRlX3JlZyhodywgSEZDVVNCX0NMS0RFTCwgQ0xLREVMX1RFKTsKKwkJd3JpdGVfcmVnKGh3LCBIRkNVU0JfU1RBVEVTLCAzIHwgMHgxMCk7CisJCXdyaXRlX3JlZyhodywgSEZDVVNCX1NUQVRFUywgMyk7CisJfSBlbHNlIHsKKwkJd3JpdGVfcmVnKGh3LCBIRkNVU0JfU0NUUkwsIDB4NDQpOworCQl3cml0ZV9yZWcoaHcsIEhGQ1VTQl9TQ1RSTF9FLCAweDA5KTsKKwkJd3JpdGVfcmVnKGh3LCBIRkNVU0JfQ0xLREVMLCBDTEtERUxfTlQpOworCQl3cml0ZV9yZWcoaHcsIEhGQ1VTQl9TVEFURVMsIDEgfCAweDEwKTsKKwkJd3JpdGVfcmVnKGh3LCBIRkNVU0JfU1RBVEVTLCAxKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCityZXNldF9oZmNzdXNiKHN0cnVjdCBoZmNzdXNiICpodykKK3sKKwlzdHJ1Y3QgdXNiX2ZpZm8gKmZpZm87CisJaW50IGk7CisKKwlpZiAoZGVidWcgJiBERUJVR19IVykKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAlc1xuIiwgaHctPm5hbWUsIF9fZnVuY19fKTsKKworCS8qIGRvIENoaXAgcmVzZXQgKi8KKwl3cml0ZV9yZWcoaHcsIEhGQ1VTQl9DSVJNLCA4KTsKKworCS8qIGF1eCA9IG91dHB1dCwgcmVzZXQgb2ZmICovCisJd3JpdGVfcmVnKGh3LCBIRkNVU0JfQ0lSTSwgMHgxMCk7CisKKwkvKiBzZXQgVVNCX1NJWkUgdG8gbWF0Y2ggdGhlIHdNYXhQYWNrZXRTaXplIGZvciBJTlQgb3IgQlVMSyB0cmFuc2ZlcnMgKi8KKwl3cml0ZV9yZWcoaHcsIEhGQ1VTQl9VU0JfU0laRSwgKGh3LT5wYWNrZXRfc2l6ZSAvIDgpIHwKKwkgICAgKChody0+cGFja2V0X3NpemUgLyA4KSA8PCA0KSk7CisKKwkvKiBzZXQgVVNCX1NJWkVfSSB0byBtYXRjaCB0aGUgdGhlIHdNYXhQYWNrZXRTaXplIGZvciBJU08gdHJhbnNmZXJzICovCisJd3JpdGVfcmVnKGh3LCBIRkNVU0JfVVNCX1NJWkVfSSwgaHctPmlzb19wYWNrZXRfc2l6ZSk7CisKKwkvKiBlbmFibGUgUENNL0dDSSBtYXN0ZXIgbW9kZSAqLworCXdyaXRlX3JlZyhodywgSEZDVVNCX01TVF9NT0RFMSwgMCk7CS8qIHNldCBkZWZhdWx0IHZhbHVlcyAqLworCXdyaXRlX3JlZyhodywgSEZDVVNCX01TVF9NT0RFMCwgMSk7CS8qIGVuYWJsZSBtYXN0ZXIgbW9kZSAqLworCisJLyogaW5pdCB0aGUgZmlmb3MgKi8KKwl3cml0ZV9yZWcoaHcsIEhGQ1VTQl9GX1RIUkVTLAorCSAgICAoSEZDVVNCX1RYX1RIUkVTSE9MRCAvIDgpIHwgKChIRkNVU0JfUlhfVEhSRVNIT0xEIC8gOCkgPDwgNCkpOworCisJZmlmbyA9IGh3LT5maWZvczsKKwlmb3IgKGkgPSAwOyBpIDwgSEZDVVNCX05VTV9GSUZPUzsgaSsrKSB7CisJCXdyaXRlX3JlZyhodywgSEZDVVNCX0ZJRk8sIGkpOwkvKiBzZWxlY3QgdGhlIGRlc2lyZWQgZmlmbyAqLworCQlmaWZvW2ldLm1heF9zaXplID0KKwkJICAgIChpIDw9IEhGQ1VTQl9CMl9SWCkgPyBNQVhfQkNIX1NJWkUgOiBNQVhfREZSQU1FX0xFTjsKKwkJZmlmb1tpXS5sYXN0X3VyYmxlbiA9IDA7CisKKwkJLyogc2V0IDIgYml0IGZvciBELSAmIEUtY2hhbm5lbCAqLworCQl3cml0ZV9yZWcoaHcsIEhGQ1VTQl9IRExDX1BBUiwgKChpIDw9IEhGQ1VTQl9CMl9SWCkgPyAwIDogMikpOworCisJCS8qIGVuYWJsZSBhbGwgZmlmb3MgKi8KKwkJaWYgKGkgPT0gSEZDVVNCX0RfVFgpCisJCQl3cml0ZV9yZWcoaHcsIEhGQ1VTQl9DT05fSERMQywKKwkJCSAgICAoaHctPnByb3RvY29sID09IElTRE5fUF9OVF9TMCkgPyAweDA4IDogMHgwOSk7CisJCWVsc2UKKwkJCXdyaXRlX3JlZyhodywgSEZDVVNCX0NPTl9IRExDLCAweDA4KTsKKwkJd3JpdGVfcmVnKGh3LCBIRkNVU0JfSU5DX1JFU19GLCAyKTsgLyogcmVzZXQgdGhlIGZpZm8gKi8KKwl9CisKKwl3cml0ZV9yZWcoaHcsIEhGQ1VTQl9TQ1RSTF9SLCAwKTsgLyogZGlzYWJsZSBib3RoIEIgcmVjZWl2ZXJzICovCisJaGFuZGxlX2xlZChodywgTEVEX1BPV0VSX09OKTsKK30KKworLyogc3RhcnQgVVNCIGRhdGEgcGlwZXMgZGVwZW5kYW5kIG9uIGRldmljZSdzIGVuZHBvaW50IGNvbmZpZ3VyYXRpb24gKi8KK3N0YXRpYyB2b2lkCitoZmNzdXNiX3N0YXJ0X2VuZHBvaW50KHN0cnVjdCBoZmNzdXNiICpodywgaW50IGNoYW5uZWwpCit7CisJLyogcXVpY2sgY2hlY2sgaWYgZW5kcG9pbnQgYWxyZWFkeSBydW5uaW5nICovCisJaWYgKChjaGFubmVsID09IEhGQ19DSEFOX0QpICYmIChody0+Zmlmb3NbSEZDVVNCX0RfUlhdLmFjdGl2ZSkpCisJCXJldHVybjsKKwlpZiAoKGNoYW5uZWwgPT0gSEZDX0NIQU5fQjEpICYmIChody0+Zmlmb3NbSEZDVVNCX0IxX1JYXS5hY3RpdmUpKQorCQlyZXR1cm47CisJaWYgKChjaGFubmVsID09IEhGQ19DSEFOX0IyKSAmJiAoaHctPmZpZm9zW0hGQ1VTQl9CMl9SWF0uYWN0aXZlKSkKKwkJcmV0dXJuOworCWlmICgoY2hhbm5lbCA9PSBIRkNfQ0hBTl9FKSAmJiAoaHctPmZpZm9zW0hGQ1VTQl9QQ01fUlhdLmFjdGl2ZSkpCisJCXJldHVybjsKKworCS8qIHN0YXJ0IHJ4IGVuZHBvaW50cyB1c2luZyBVU0IgSU5UIElOIG1ldGhvZCAqLworCWlmIChody0+Y2ZnX3VzZWQgPT0gQ05GXzNJTlQzSVNPIHx8IGh3LT5jZmdfdXNlZCA9PSBDTkZfNElOVDNJU08pCisJCXN0YXJ0X2ludF9maWZvKGh3LT5maWZvcyArIGNoYW5uZWwqMiArIDEpOworCisJLyogc3RhcnQgcnggZW5kcG9pbnRzIHVzaW5nIFVTQiBJU08gSU4gbWV0aG9kICovCisJaWYgKGh3LT5jZmdfdXNlZCA9PSBDTkZfM0lTTzNJU08gfHwgaHctPmNmZ191c2VkID09IENORl80SVNPM0lTTykgeworCQlzd2l0Y2ggKGNoYW5uZWwpIHsKKwkJY2FzZSBIRkNfQ0hBTl9EOgorCQkJc3RhcnRfaXNvY19jaGFpbihody0+Zmlmb3MgKyBIRkNVU0JfRF9SWCwKKwkJCQlJU09DX1BBQ0tFVFNfRCwKKwkJCQkodXNiX2NvbXBsZXRlX3QpcnhfaXNvX2NvbXBsZXRlLAorCQkJCTE2KTsKKwkJCWJyZWFrOworCQljYXNlIEhGQ19DSEFOX0U6CisJCQlzdGFydF9pc29jX2NoYWluKGh3LT5maWZvcyArIEhGQ1VTQl9QQ01fUlgsCisJCQkJSVNPQ19QQUNLRVRTX0QsCisJCQkJKHVzYl9jb21wbGV0ZV90KXJ4X2lzb19jb21wbGV0ZSwKKwkJCQkxNik7CisJCQlicmVhazsKKwkJY2FzZSBIRkNfQ0hBTl9CMToKKwkJCXN0YXJ0X2lzb2NfY2hhaW4oaHctPmZpZm9zICsgSEZDVVNCX0IxX1JYLAorCQkJCUlTT0NfUEFDS0VUU19CLAorCQkJCSh1c2JfY29tcGxldGVfdClyeF9pc29fY29tcGxldGUsCisJCQkJMTYpOworCQkJYnJlYWs7CisJCWNhc2UgSEZDX0NIQU5fQjI6CisJCQlzdGFydF9pc29jX2NoYWluKGh3LT5maWZvcyArIEhGQ1VTQl9CMl9SWCwKKwkJCQlJU09DX1BBQ0tFVFNfQiwKKwkJCQkodXNiX2NvbXBsZXRlX3QpcnhfaXNvX2NvbXBsZXRlLAorCQkJCTE2KTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJLyogc3RhcnQgdHggZW5kcG9pbnRzIHVzaW5nIFVTQiBJU08gT1VUIG1ldGhvZCAqLworCXN3aXRjaCAoY2hhbm5lbCkgeworCWNhc2UgSEZDX0NIQU5fRDoKKwkJc3RhcnRfaXNvY19jaGFpbihody0+Zmlmb3MgKyBIRkNVU0JfRF9UWCwKKwkJCUlTT0NfUEFDS0VUU19CLAorCQkJKHVzYl9jb21wbGV0ZV90KXR4X2lzb19jb21wbGV0ZSwgMSk7CisJCWJyZWFrOworCWNhc2UgSEZDX0NIQU5fQjE6CisJCXN0YXJ0X2lzb2NfY2hhaW4oaHctPmZpZm9zICsgSEZDVVNCX0IxX1RYLAorCQkJSVNPQ19QQUNLRVRTX0QsCisJCQkodXNiX2NvbXBsZXRlX3QpdHhfaXNvX2NvbXBsZXRlLCAxKTsKKwkJYnJlYWs7CisJY2FzZSBIRkNfQ0hBTl9CMjoKKwkJc3RhcnRfaXNvY19jaGFpbihody0+Zmlmb3MgKyBIRkNVU0JfQjJfVFgsCisJCQlJU09DX1BBQ0tFVFNfQiwKKwkJCSh1c2JfY29tcGxldGVfdCl0eF9pc29fY29tcGxldGUsIDEpOworCQlicmVhazsKKwl9Cit9CisKKy8qIHN0b3AgVVNCIGRhdGEgcGlwZXMgZGVwZW5kYW5kIG9uIGRldmljZSdzIGVuZHBvaW50IGNvbmZpZ3VyYXRpb24gKi8KK3N0YXRpYyB2b2lkCitoZmNzdXNiX3N0b3BfZW5kcG9pbnQoc3RydWN0IGhmY3N1c2IgKmh3LCBpbnQgY2hhbm5lbCkKK3sKKwkvKiBxdWljayBjaGVjayBpZiBlbmRwb2ludCBjdXJyZW50bHkgcnVubmluZyAqLworCWlmICgoY2hhbm5lbCA9PSBIRkNfQ0hBTl9EKSAmJiAoIWh3LT5maWZvc1tIRkNVU0JfRF9SWF0uYWN0aXZlKSkKKwkJcmV0dXJuOworCWlmICgoY2hhbm5lbCA9PSBIRkNfQ0hBTl9CMSkgJiYgKCFody0+Zmlmb3NbSEZDVVNCX0IxX1JYXS5hY3RpdmUpKQorCQlyZXR1cm47CisJaWYgKChjaGFubmVsID09IEhGQ19DSEFOX0IyKSAmJiAoIWh3LT5maWZvc1tIRkNVU0JfQjJfUlhdLmFjdGl2ZSkpCisJCXJldHVybjsKKwlpZiAoKGNoYW5uZWwgPT0gSEZDX0NIQU5fRSkgJiYgKCFody0+Zmlmb3NbSEZDVVNCX1BDTV9SWF0uYWN0aXZlKSkKKwkJcmV0dXJuOworCisJLyogcnggZW5kcG9pbnRzIHVzaW5nIFVTQiBJTlQgSU4gbWV0aG9kICovCisJaWYgKGh3LT5jZmdfdXNlZCA9PSBDTkZfM0lOVDNJU08gfHwgaHctPmNmZ191c2VkID09IENORl80SU5UM0lTTykKKwkJc3RvcF9pbnRfZ3JhY2VmdWxsKGh3LT5maWZvcyArIGNoYW5uZWwqMiArIDEpOworCisJLyogcnggZW5kcG9pbnRzIHVzaW5nIFVTQiBJU08gSU4gbWV0aG9kICovCisJaWYgKGh3LT5jZmdfdXNlZCA9PSBDTkZfM0lTTzNJU08gfHwgaHctPmNmZ191c2VkID09IENORl80SVNPM0lTTykKKwkJc3RvcF9pc29fZ3JhY2VmdWxsKGh3LT5maWZvcyArIGNoYW5uZWwqMiArIDEpOworCisJLyogdHggZW5kcG9pbnRzIHVzaW5nIFVTQiBJU08gT1VUIG1ldGhvZCAqLworCWlmIChjaGFubmVsICE9IEhGQ19DSEFOX0UpCisJCXN0b3BfaXNvX2dyYWNlZnVsbChody0+Zmlmb3MgKyBjaGFubmVsKjIpOworfQorCisKKy8qIEhhcmR3YXJlIEluaXRpYWxpemF0aW9uICovCitpbnQKK3NldHVwX2hmY3N1c2Ioc3RydWN0IGhmY3N1c2IgKmh3KQoreworCWludCBlcnI7CisJdV9jaGFyIGI7CisKKwlpZiAoZGVidWcgJiBEQkdfSEZDX0NBTExfVFJBQ0UpCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogJXNcbiIsIGh3LT5uYW1lLCBfX2Z1bmNfXyk7CisKKwkvKiBjaGVjayB0aGUgY2hpcCBpZCAqLworCWlmIChyZWFkX3JlZ19hdG9taWMoaHcsIEhGQ1VTQl9DSElQX0lELCAmYikgIT0gMSkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6ICVzOiBjYW5ub3QgcmVhZCBjaGlwIGlkXG4iLAorCQkgICAgaHctPm5hbWUsIF9fZnVuY19fKTsKKwkJcmV0dXJuIDE7CisJfQorCWlmIChiICE9IEhGQ1VTQl9DSElQSUQpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAlczogSW52YWxpZCBjaGlwIGlkIDB4JTAyeFxuIiwKKwkJICAgIGh3LT5uYW1lLCBfX2Z1bmNfXywgYik7CisJCXJldHVybiAxOworCX0KKworCS8qIGZpcnN0IHNldCB0aGUgbmVlZGVkIGNvbmZpZywgaW50ZXJmYWNlIGFuZCBhbHRlcm5hdGUgKi8KKwllcnIgPSB1c2Jfc2V0X2ludGVyZmFjZShody0+ZGV2LCBody0+aWZfdXNlZCwgaHctPmFsdF91c2VkKTsKKworCWh3LT5sZWRfc3RhdGUgPSAwOworCisJLyogaW5pdCB0aGUgYmFja2dyb3VuZCBtYWNoaW5lcnkgZm9yIGNvbnRyb2wgcmVxdWVzdHMgKi8KKwlody0+Y3RybF9yZWFkLmJSZXF1ZXN0VHlwZSA9IDB4YzA7CisJaHctPmN0cmxfcmVhZC5iUmVxdWVzdCA9IDE7CisJaHctPmN0cmxfcmVhZC53TGVuZ3RoID0gY3B1X3RvX2xlMTYoMSk7CisJaHctPmN0cmxfd3JpdGUuYlJlcXVlc3RUeXBlID0gMHg0MDsKKwlody0+Y3RybF93cml0ZS5iUmVxdWVzdCA9IDA7CisJaHctPmN0cmxfd3JpdGUud0xlbmd0aCA9IDA7CisJdXNiX2ZpbGxfY29udHJvbF91cmIoaHctPmN0cmxfdXJiLCBody0+ZGV2LCBody0+Y3RybF9vdXRfcGlwZSwKKwkgICAgKHVfY2hhciAqKSZody0+Y3RybF93cml0ZSwgTlVMTCwgMCwKKwkgICAgKHVzYl9jb21wbGV0ZV90KWN0cmxfY29tcGxldGUsIGh3KTsKKworCXJlc2V0X2hmY3N1c2IoaHcpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAorcmVsZWFzZV9odyhzdHJ1Y3QgaGZjc3VzYiAqaHcpCit7CisJaWYgKGRlYnVnICYgREJHX0hGQ19DQUxMX1RSQUNFKQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6ICVzXG4iLCBody0+bmFtZSwgX19mdW5jX18pOworCisJLyoKKwkgKiBzdG9wIGFsbCBlbmRwb2ludHMgZ3JhY2VmdWxseQorCSAqIFRPRE86IG1JU0ROX2NvcmUgc2hvdWxkIGdlbmVyYXRlIENMT1NFX0NIQU5ORUwKKwkgKiAgICAgICBzaWduYWxzIGFmdGVyIGNhbGxpbmcgbUlTRE5fdW5yZWdpc3Rlcl9kZXZpY2UoKQorCSAqLworCWhmY3N1c2Jfc3RvcF9lbmRwb2ludChodywgSEZDX0NIQU5fRCk7CisJaGZjc3VzYl9zdG9wX2VuZHBvaW50KGh3LCBIRkNfQ0hBTl9CMSk7CisJaGZjc3VzYl9zdG9wX2VuZHBvaW50KGh3LCBIRkNfQ0hBTl9CMik7CisJaWYgKGh3LT5maWZvc1tIRkNVU0JfUENNX1JYXS5waXBlKQorCQloZmNzdXNiX3N0b3BfZW5kcG9pbnQoaHcsIEhGQ19DSEFOX0UpOworCWlmIChody0+cHJvdG9jb2wgPT0gSVNETl9QX1RFX1MwKQorCQlsMV9ldmVudChody0+ZGNoLmwxLCBDTE9TRV9DSEFOTkVMKTsKKworCW1JU0ROX3VucmVnaXN0ZXJfZGV2aWNlKCZody0+ZGNoLmRldik7CisJbUlTRE5fZnJlZWJjaGFubmVsKCZody0+YmNoWzFdKTsKKwltSVNETl9mcmVlYmNoYW5uZWwoJmh3LT5iY2hbMF0pOworCW1JU0ROX2ZyZWVkY2hhbm5lbCgmaHctPmRjaCk7CisKKwlpZiAoaHctPmN0cmxfdXJiKSB7CisJCXVzYl9raWxsX3VyYihody0+Y3RybF91cmIpOworCQl1c2JfZnJlZV91cmIoaHctPmN0cmxfdXJiKTsKKwkJaHctPmN0cmxfdXJiID0gTlVMTDsKKwl9CisKKwlpZiAoaHctPmludGYpCisJCXVzYl9zZXRfaW50ZmRhdGEoaHctPmludGYsIE5VTEwpOworCWxpc3RfZGVsKCZody0+bGlzdCk7CisJa2ZyZWUoaHcpOworCWh3ID0gTlVMTDsKK30KKworc3RhdGljIHZvaWQKK2RlYWN0aXZhdGVfYmNoYW5uZWwoc3RydWN0IGJjaGFubmVsICpiY2gpCit7CisJc3RydWN0IGhmY3N1c2IgKmh3ID0gYmNoLT5odzsKKwl1X2xvbmcgZmxhZ3M7CisKKwlpZiAoYmNoLT5kZWJ1ZyAmIERFQlVHX0hXKQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6ICVzOiBiY2gtPm5yKCVpKVxuIiwKKwkJICAgIGh3LT5uYW1lLCBfX2Z1bmNfXywgYmNoLT5ucik7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaHctPmxvY2ssIGZsYWdzKTsKKwlpZiAodGVzdF9hbmRfY2xlYXJfYml0KEZMR19UWF9ORVhULCAmYmNoLT5GbGFncykpIHsKKwkJZGV2X2tmcmVlX3NrYihiY2gtPm5leHRfc2tiKTsKKwkJYmNoLT5uZXh0X3NrYiA9IE5VTEw7CisJfQorCWlmIChiY2gtPnR4X3NrYikgeworCQlkZXZfa2ZyZWVfc2tiKGJjaC0+dHhfc2tiKTsKKwkJYmNoLT50eF9za2IgPSBOVUxMOworCX0KKwliY2gtPnR4X2lkeCA9IDA7CisJaWYgKGJjaC0+cnhfc2tiKSB7CisJCWRldl9rZnJlZV9za2IoYmNoLT5yeF9za2IpOworCQliY2gtPnJ4X3NrYiA9IE5VTEw7CisJfQorCWNsZWFyX2JpdChGTEdfQUNUSVZFLCAmYmNoLT5GbGFncyk7CisJY2xlYXJfYml0KEZMR19UWF9CVVNZLCAmYmNoLT5GbGFncyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHctPmxvY2ssIGZsYWdzKTsKKwloZmNzdXNiX3NldHVwX2JjaChiY2gsIElTRE5fUF9OT05FKTsKKwloZmNzdXNiX3N0b3BfZW5kcG9pbnQoaHcsIGJjaC0+bnIpOworfQorCisvKgorICogTGF5ZXIgMSBCLWNoYW5uZWwgaGFyZHdhcmUgYWNjZXNzCisgKi8KK3N0YXRpYyBpbnQKK2hmY19iY3RybChzdHJ1Y3QgbUlTRE5jaGFubmVsICpjaCwgdV9pbnQgY21kLCB2b2lkICphcmcpCit7CisJc3RydWN0IGJjaGFubmVsCSpiY2ggPSBjb250YWluZXJfb2YoY2gsIHN0cnVjdCBiY2hhbm5lbCwgY2gpOworCWludAkJcmV0ID0gLUVJTlZBTDsKKworCWlmIChiY2gtPmRlYnVnICYgREVCVUdfSFcpCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogY21kOiV4ICVwXG4iLCBfX2Z1bmNfXywgY21kLCBhcmcpOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIEhXX1RFU1RSWF9SQVc6CisJY2FzZSBIV19URVNUUlhfSERMQzoKKwljYXNlIEhXX1RFU1RSWF9PRkY6CisJCXJldCA9IC1FSU5WQUw7CisJCWJyZWFrOworCisJY2FzZSBDTE9TRV9DSEFOTkVMOgorCQl0ZXN0X2FuZF9jbGVhcl9iaXQoRkxHX09QRU4sICZiY2gtPkZsYWdzKTsKKwkJaWYgKHRlc3RfYml0KEZMR19BQ1RJVkUsICZiY2gtPkZsYWdzKSkKKwkJCWRlYWN0aXZhdGVfYmNoYW5uZWwoYmNoKTsKKwkJY2gtPnByb3RvY29sID0gSVNETl9QX05PTkU7CisJCWNoLT5wZWVyID0gTlVMTDsKKwkJbW9kdWxlX3B1dChUSElTX01PRFVMRSk7CisJCXJldCA9IDA7CisJCWJyZWFrOworCWNhc2UgQ09OVFJPTF9DSEFOTkVMOgorCQlyZXQgPSBjaGFubmVsX2JjdHJsKGJjaCwgYXJnKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHVua25vd24gcHJpbSgleClcbiIsCisJCQlfX2Z1bmNfXywgY21kKTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludAorc2V0dXBfaW5zdGFuY2Uoc3RydWN0IGhmY3N1c2IgKmh3LCBzdHJ1Y3QgZGV2aWNlICpwYXJlbnQpCit7CisJdV9sb25nCWZsYWdzOworCWludAllcnIsIGk7CisKKwlpZiAoZGVidWcgJiBEQkdfSEZDX0NBTExfVFJBQ0UpCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogJXNcbiIsIGh3LT5uYW1lLCBfX2Z1bmNfXyk7CisKKwlzcGluX2xvY2tfaW5pdCgmaHctPmN0cmxfbG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJmh3LT5sb2NrKTsKKworCW1JU0ROX2luaXRkY2hhbm5lbCgmaHctPmRjaCwgTUFYX0RGUkFNRV9MRU5fTDEsIHBoX3N0YXRlKTsKKwlody0+ZGNoLmRlYnVnID0gZGVidWcgJiAweEZGRkY7CisJaHctPmRjaC5odyA9IGh3OworCWh3LT5kY2guZGV2LkRwcm90b2NvbHMgPSAoMSA8PCBJU0ROX1BfVEVfUzApIHwgKDEgPDwgSVNETl9QX05UX1MwKTsKKwlody0+ZGNoLmRldi5ELnNlbmQgPSBoZmN1c2JfbDJsMUQ7CisJaHctPmRjaC5kZXYuRC5jdHJsID0gaGZjX2RjdHJsOworCisJLyogZW5hYmxlIEUtQ2hhbm5lbCBsb2dnaW5nICovCisJaWYgKGh3LT5maWZvc1tIRkNVU0JfUENNX1JYXS5waXBlKQorCQltSVNETl9pbml0ZGNoYW5uZWwoJmh3LT5lY2gsIE1BWF9ERlJBTUVfTEVOX0wxLCBOVUxMKTsKKworCWh3LT5kY2guZGV2LkJwcm90b2NvbHMgPSAoMSA8PCAoSVNETl9QX0JfUkFXICYgSVNETl9QX0JfTUFTSykpIHwKKwkgICAgKDEgPDwgKElTRE5fUF9CX0hETEMgJiBJU0ROX1BfQl9NQVNLKSk7CisJaHctPmRjaC5kZXYubnJiY2hhbiA9IDI7CisJZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworCQlody0+YmNoW2ldLm5yID0gaSArIDE7CisJCXNldF9jaGFubmVsbWFwKGkgKyAxLCBody0+ZGNoLmRldi5jaGFubmVsbWFwKTsKKwkJaHctPmJjaFtpXS5kZWJ1ZyA9IGRlYnVnOworCQltSVNETl9pbml0YmNoYW5uZWwoJmh3LT5iY2hbaV0sIE1BWF9EQVRBX01FTSk7CisJCWh3LT5iY2hbaV0uaHcgPSBodzsKKwkJaHctPmJjaFtpXS5jaC5zZW5kID0gaGZjdXNiX2wybDFCOworCQlody0+YmNoW2ldLmNoLmN0cmwgPSBoZmNfYmN0cmw7CisJCWh3LT5iY2hbaV0uY2gubnIgPSBpICsgMTsKKwkJbGlzdF9hZGQoJmh3LT5iY2hbaV0uY2gubGlzdCwgJmh3LT5kY2guZGV2LmJjaGFubmVscyk7CisJfQorCisJaHctPmZpZm9zW0hGQ1VTQl9CMV9UWF0uYmNoID0gJmh3LT5iY2hbMF07CisJaHctPmZpZm9zW0hGQ1VTQl9CMV9SWF0uYmNoID0gJmh3LT5iY2hbMF07CisJaHctPmZpZm9zW0hGQ1VTQl9CMl9UWF0uYmNoID0gJmh3LT5iY2hbMV07CisJaHctPmZpZm9zW0hGQ1VTQl9CMl9SWF0uYmNoID0gJmh3LT5iY2hbMV07CisJaHctPmZpZm9zW0hGQ1VTQl9EX1RYXS5kY2ggPSAmaHctPmRjaDsKKwlody0+Zmlmb3NbSEZDVVNCX0RfUlhdLmRjaCA9ICZody0+ZGNoOworCWh3LT5maWZvc1tIRkNVU0JfUENNX1JYXS5lY2ggPSAmaHctPmVjaDsKKwlody0+Zmlmb3NbSEZDVVNCX1BDTV9UWF0uZWNoID0gJmh3LT5lY2g7CisKKwllcnIgPSBzZXR1cF9oZmNzdXNiKGh3KTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKworCXNucHJpbnRmKGh3LT5uYW1lLCBNSVNETl9NQVhfSURMRU4gLSAxLCAiJXMuJWQiLCBEUklWRVJfTkFNRSwKKwkgICAgaGZjc3VzYl9jbnQgKyAxKTsKKwlwcmludGsoS0VSTl9JTkZPICIlczogcmVnaXN0ZXJlZCBhcyAnJXMnXG4iLAorCSAgICBEUklWRVJfTkFNRSwgaHctPm5hbWUpOworCisJZXJyID0gbUlTRE5fcmVnaXN0ZXJfZGV2aWNlKCZody0+ZGNoLmRldiwgcGFyZW50LCBody0+bmFtZSk7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisKKwloZmNzdXNiX2NudCsrOworCXdyaXRlX2xvY2tfaXJxc2F2ZSgmSEZDbG9jaywgZmxhZ3MpOworCWxpc3RfYWRkX3RhaWwoJmh3LT5saXN0LCAmSEZDbGlzdCk7CisJd3JpdGVfdW5sb2NrX2lycXJlc3RvcmUoJkhGQ2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gMDsKKworb3V0OgorCW1JU0ROX2ZyZWViY2hhbm5lbCgmaHctPmJjaFsxXSk7CisJbUlTRE5fZnJlZWJjaGFubmVsKCZody0+YmNoWzBdKTsKKwltSVNETl9mcmVlZGNoYW5uZWwoJmh3LT5kY2gpOworCWtmcmVlKGh3KTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50CitoZmNzdXNiX3Byb2JlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLCBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IGhmY3N1c2IJCQkqaHc7CisJc3RydWN0IHVzYl9kZXZpY2UJCSpkZXYgPSBpbnRlcmZhY2VfdG9fdXNiZGV2KGludGYpOworCXN0cnVjdCB1c2JfaG9zdF9pbnRlcmZhY2UJKmlmYWNlID0gaW50Zi0+Y3VyX2FsdHNldHRpbmc7CisJc3RydWN0IHVzYl9ob3N0X2ludGVyZmFjZQkqaWZhY2VfdXNlZCA9IE5VTEw7CisJc3RydWN0IHVzYl9ob3N0X2VuZHBvaW50CSplcDsKKwlzdHJ1Y3QgaGZjc3VzYl92ZGF0YQkJKmRyaXZlcl9pbmZvOworCWludCBpZm51bSA9IGlmYWNlLT5kZXNjLmJJbnRlcmZhY2VOdW1iZXIsIGksIGlkeCwgYWx0X2lkeCwKKwkgICAgcHJvYmVfYWx0X3NldHRpbmcsIHZlbmRfaWR4LCBjZmdfdXNlZCwgKnZjZiwgYXR0ciwgY2ZnX2ZvdW5kLAorCSAgICBlcF9hZGRyLCBjbXB0YmxbMTZdLCBzbWFsbF9tYXRjaCwgaXNvX3BhY2tldF9zaXplLCBwYWNrZXRfc2l6ZSwKKwkgICAgYWx0X3VzZWQgPSAwOworCisJdmVuZF9pZHggPSAweGZmZmY7CisJZm9yIChpID0gMDsgaGZjc3VzYl9pZHRhYltpXS5pZFZlbmRvcjsgaSsrKSB7CisJCWlmICgobGUxNl90b19jcHUoZGV2LT5kZXNjcmlwdG9yLmlkVmVuZG9yKQorCQkgICAgICAgPT0gaGZjc3VzYl9pZHRhYltpXS5pZFZlbmRvcikgJiYKKwkJICAgIChsZTE2X3RvX2NwdShkZXYtPmRlc2NyaXB0b3IuaWRQcm9kdWN0KQorCQkgICAgICAgPT0gaGZjc3VzYl9pZHRhYltpXS5pZFByb2R1Y3QpKSB7CisJCQl2ZW5kX2lkeCA9IGk7CisJCQljb250aW51ZTsKKwkJfQorCX0KKworCXByaW50ayhLRVJOX0RFQlVHCisJICAgICIlczogaW50ZXJmYWNlKCVkKSBhY3RhbHQoJWQpIG1pbm9yKCVkKSB2ZW5kX2lkeCglZClcbiIsCisJICAgIF9fZnVuY19fLCBpZm51bSwgaWZhY2UtPmRlc2MuYkFsdGVybmF0ZVNldHRpbmcsCisJICAgIGludGYtPm1pbm9yLCB2ZW5kX2lkeCk7CisKKwlpZiAodmVuZF9pZHggPT0gMHhmZmZmKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJICAgICIlczogbm8gdmFsaWQgdmVuZG9yIGZvdW5kIGluIFVTQiBkZXNjcmlwdG9yXG4iLAorCQkgICAgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTzsKKwl9CisJLyogaWYgdmVuZG9yIGFuZCBwcm9kdWN0IElEIGlzIE9LLCBzdGFydCBwcm9iaW5nIGFsdGVybmF0ZSBzZXR0aW5ncyAqLworCWFsdF9pZHggPSAwOworCXNtYWxsX21hdGNoID0gLTE7CisKKwkvKiBkZWZhdWx0IHNldHRpbmdzICovCisJaXNvX3BhY2tldF9zaXplID0gMTY7CisJcGFja2V0X3NpemUgPSA2NDsKKworCXdoaWxlIChhbHRfaWR4IDwgaW50Zi0+bnVtX2FsdHNldHRpbmcpIHsKKwkJaWZhY2UgPSBpbnRmLT5hbHRzZXR0aW5nICsgYWx0X2lkeDsKKwkJcHJvYmVfYWx0X3NldHRpbmcgPSBpZmFjZS0+ZGVzYy5iQWx0ZXJuYXRlU2V0dGluZzsKKwkJY2ZnX3VzZWQgPSAwOworCisJCXdoaWxlICh2YWxpZGNvbmZbY2ZnX3VzZWRdWzBdKSB7CisJCQljZmdfZm91bmQgPSAxOworCQkJdmNmID0gdmFsaWRjb25mW2NmZ191c2VkXTsKKwkJCWVwID0gaWZhY2UtPmVuZHBvaW50OworCQkJbWVtY3B5KGNtcHRibCwgdmNmLCAxNiAqIHNpemVvZihpbnQpKTsKKworCQkJLyogY2hlY2sgZm9yIGFsbCBlbmRwb2ludHMgaW4gdGhpcyBhbHRlcm5hdGUgc2V0dGluZyAqLworCQkJZm9yIChpID0gMDsgaSA8IGlmYWNlLT5kZXNjLmJOdW1FbmRwb2ludHM7IGkrKykgeworCQkJCWVwX2FkZHIgPSBlcC0+ZGVzYy5iRW5kcG9pbnRBZGRyZXNzOworCisJCQkJLyogZ2V0IGVuZHBvaW50IGJhc2UgKi8KKwkJCQlpZHggPSAoKGVwX2FkZHIgJiAweDdmKSAtIDEpICogMjsKKwkJCQlpZiAoZXBfYWRkciAmIDB4ODApCisJCQkJCWlkeCsrOworCQkJCWF0dHIgPSBlcC0+ZGVzYy5ibUF0dHJpYnV0ZXM7CisKKwkJCQlpZiAoY21wdGJsW2lkeF0gIT0gRVBfTk9QKSB7CisJCQkJCWlmIChjbXB0YmxbaWR4XSA9PSBFUF9OVUwpCisJCQkJCQljZmdfZm91bmQgPSAwOworCQkJCQlpZiAoYXR0ciA9PSBVU0JfRU5EUE9JTlRfWEZFUl9JTlQKKwkJCQkJCSYmIGNtcHRibFtpZHhdID09IEVQX0lOVCkKKwkJCQkJCWNtcHRibFtpZHhdID0gRVBfTlVMOworCQkJCQlpZiAoYXR0ciA9PSBVU0JfRU5EUE9JTlRfWEZFUl9CVUxLCisJCQkJCQkmJiBjbXB0YmxbaWR4XSA9PSBFUF9CTEspCisJCQkJCQljbXB0YmxbaWR4XSA9IEVQX05VTDsKKwkJCQkJaWYgKGF0dHIgPT0gVVNCX0VORFBPSU5UX1hGRVJfSVNPQworCQkJCQkJJiYgY21wdGJsW2lkeF0gPT0gRVBfSVNPKQorCQkJCQkJY21wdGJsW2lkeF0gPSBFUF9OVUw7CisKKwkJCQkJaWYgKGF0dHIgPT0gVVNCX0VORFBPSU5UX1hGRVJfSU5UICYmCisJCQkJCQllcC0+ZGVzYy5iSW50ZXJ2YWwgPCB2Y2ZbMTddKSB7CisJCQkJCQljZmdfZm91bmQgPSAwOworCQkJCQl9CisJCQkJfQorCQkJCWVwKys7CisJCQl9CisKKwkJCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQorCQkJCWlmIChjbXB0YmxbaV0gIT0gRVBfTk9QICYmIGNtcHRibFtpXSAhPSBFUF9OVUwpCisJCQkJCWNmZ19mb3VuZCA9IDA7CisKKwkJCWlmIChjZmdfZm91bmQpIHsKKwkJCQlpZiAoc21hbGxfbWF0Y2ggPCBjZmdfdXNlZCkgeworCQkJCQlzbWFsbF9tYXRjaCA9IGNmZ191c2VkOworCQkJCQlhbHRfdXNlZCA9IHByb2JlX2FsdF9zZXR0aW5nOworCQkJCQlpZmFjZV91c2VkID0gaWZhY2U7CisJCQkJfQorCQkJfQorCQkJY2ZnX3VzZWQrKzsKKwkJfQorCQlhbHRfaWR4Kys7CisJfQkvKiAoYWx0X2lkeCA8IGludGYtPm51bV9hbHRzZXR0aW5nKSAqLworCisJLyogbm90IGZvdW5kIGEgdmFsaWQgVVNCIFRhIEVuZHBvaW50IGNvbmZpZyAqLworCWlmIChzbWFsbF9tYXRjaCA9PSAtMSkKKwkJcmV0dXJuIC1FSU87CisKKwlpZmFjZSA9IGlmYWNlX3VzZWQ7CisJaHcgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgaGZjc3VzYiksIEdGUF9LRVJORUwpOworCWlmICghaHcpCisJCXJldHVybiAtRU5PTUVNOwkvKiBnb3Qgbm8gbWVtICovCisJc25wcmludGYoaHctPm5hbWUsIE1JU0ROX01BWF9JRExFTiAtIDEsICIlcyIsIERSSVZFUl9OQU1FKTsKKworCWVwID0gaWZhY2UtPmVuZHBvaW50OworCXZjZiA9IHZhbGlkY29uZltzbWFsbF9tYXRjaF07CisKKwlmb3IgKGkgPSAwOyBpIDwgaWZhY2UtPmRlc2MuYk51bUVuZHBvaW50czsgaSsrKSB7CisJCXN0cnVjdCB1c2JfZmlmbyAqZjsKKworCQllcF9hZGRyID0gZXAtPmRlc2MuYkVuZHBvaW50QWRkcmVzczsKKwkJLyogZ2V0IGVuZHBvaW50IGJhc2UgKi8KKwkJaWR4ID0gKChlcF9hZGRyICYgMHg3ZikgLSAxKSAqIDI7CisJCWlmIChlcF9hZGRyICYgMHg4MCkKKwkJCWlkeCsrOworCQlmID0gJmh3LT5maWZvc1tpZHggJiA3XTsKKworCQkvKiBpbml0IEVuZHBvaW50cyAqLworCQlpZiAodmNmW2lkeF0gPT0gRVBfTk9QIHx8IHZjZltpZHhdID09IEVQX05VTCkgeworCQkJZXArKzsKKwkJCWNvbnRpbnVlOworCQl9CisJCXN3aXRjaCAoZXAtPmRlc2MuYm1BdHRyaWJ1dGVzKSB7CisJCWNhc2UgVVNCX0VORFBPSU5UX1hGRVJfSU5UOgorCQkJZi0+cGlwZSA9IHVzYl9yY3ZpbnRwaXBlKGRldiwKKwkJCQllcC0+ZGVzYy5iRW5kcG9pbnRBZGRyZXNzKTsKKwkJCWYtPnVzYl90cmFuc2Zlcl9tb2RlID0gVVNCX0lOVDsKKwkJCXBhY2tldF9zaXplID0gbGUxNl90b19jcHUoZXAtPmRlc2Mud01heFBhY2tldFNpemUpOworCQkJYnJlYWs7CisJCWNhc2UgVVNCX0VORFBPSU5UX1hGRVJfQlVMSzoKKwkJCWlmIChlcF9hZGRyICYgMHg4MCkKKwkJCQlmLT5waXBlID0gdXNiX3JjdmJ1bGtwaXBlKGRldiwKKwkJCQkJZXAtPmRlc2MuYkVuZHBvaW50QWRkcmVzcyk7CisJCQllbHNlCisJCQkJZi0+cGlwZSA9IHVzYl9zbmRidWxrcGlwZShkZXYsCisJCQkJCWVwLT5kZXNjLmJFbmRwb2ludEFkZHJlc3MpOworCQkJZi0+dXNiX3RyYW5zZmVyX21vZGUgPSBVU0JfQlVMSzsKKwkJCXBhY2tldF9zaXplID0gbGUxNl90b19jcHUoZXAtPmRlc2Mud01heFBhY2tldFNpemUpOworCQkJYnJlYWs7CisJCWNhc2UgVVNCX0VORFBPSU5UX1hGRVJfSVNPQzoKKwkJCWlmIChlcF9hZGRyICYgMHg4MCkKKwkJCQlmLT5waXBlID0gdXNiX3Jjdmlzb2NwaXBlKGRldiwKKwkJCQkJZXAtPmRlc2MuYkVuZHBvaW50QWRkcmVzcyk7CisJCQllbHNlCisJCQkJZi0+cGlwZSA9IHVzYl9zbmRpc29jcGlwZShkZXYsCisJCQkJCWVwLT5kZXNjLmJFbmRwb2ludEFkZHJlc3MpOworCQkJZi0+dXNiX3RyYW5zZmVyX21vZGUgPSBVU0JfSVNPQzsKKwkJCWlzb19wYWNrZXRfc2l6ZSA9IGxlMTZfdG9fY3B1KGVwLT5kZXNjLndNYXhQYWNrZXRTaXplKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZi0+cGlwZSA9IDA7CisJCX0KKworCQlpZiAoZi0+cGlwZSkgeworCQkJZi0+Zmlmb251bSA9IGlkeCAmIDc7CisJCQlmLT5odyA9IGh3OworCQkJZi0+dXNiX3BhY2tldF9tYXhsZW4gPQorCQkJICAgIGxlMTZfdG9fY3B1KGVwLT5kZXNjLndNYXhQYWNrZXRTaXplKTsKKwkJCWYtPmludGVydmFsbCA9IGVwLT5kZXNjLmJJbnRlcnZhbDsKKwkJfQorCQllcCsrOworCX0KKwlody0+ZGV2ID0gZGV2OyAvKiBzYXZlIGRldmljZSAqLworCWh3LT5pZl91c2VkID0gaWZudW07IC8qIHNhdmUgdXNlZCBpbnRlcmZhY2UgKi8KKwlody0+YWx0X3VzZWQgPSBhbHRfdXNlZDsgLyogYW5kIGFsdGVybmF0ZSBjb25maWcgKi8KKwlody0+Y3RybF9wYWtzaXplID0gZGV2LT5kZXNjcmlwdG9yLmJNYXhQYWNrZXRTaXplMDsgLyogY29udHJvbCBzaXplICovCisJaHctPmNmZ191c2VkID0gdmNmWzE2XTsJLyogc3RvcmUgdXNlZCBjb25maWcgKi8KKwlody0+dmVuZF9pZHggPSB2ZW5kX2lkeDsgLyogc3RvcmUgZm91bmQgdmVuZG9yICovCisJaHctPnBhY2tldF9zaXplID0gcGFja2V0X3NpemU7CisJaHctPmlzb19wYWNrZXRfc2l6ZSA9IGlzb19wYWNrZXRfc2l6ZTsKKworCS8qIGNyZWF0ZSB0aGUgY29udHJvbCBwaXBlcyBuZWVkZWQgZm9yIHJlZ2lzdGVyIGFjY2VzcyAqLworCWh3LT5jdHJsX2luX3BpcGUgPSB1c2JfcmN2Y3RybHBpcGUoaHctPmRldiwgMCk7CisJaHctPmN0cmxfb3V0X3BpcGUgPSB1c2Jfc25kY3RybHBpcGUoaHctPmRldiwgMCk7CisJaHctPmN0cmxfdXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKKworCWRyaXZlcl9pbmZvID0KKwkJKHN0cnVjdCBoZmNzdXNiX3ZkYXRhICopaGZjc3VzYl9pZHRhYlt2ZW5kX2lkeF0uZHJpdmVyX2luZm87CisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAlczogZGV0ZWN0ZWQgXCIlc1wiICglcywgaWY9JWQgYWx0PSVkKVxuIiwKKwkgICAgaHctPm5hbWUsIF9fZnVuY19fLCBkcml2ZXJfaW5mby0+dmVuZF9uYW1lLAorCSAgICBjb25mX3N0cltzbWFsbF9tYXRjaF0sIGlmbnVtLCBhbHRfdXNlZCk7CisKKwlpZiAoc2V0dXBfaW5zdGFuY2UoaHcsIGRldi0+ZGV2LnBhcmVudCkpCisJCXJldHVybiAtRUlPOworCisJaHctPmludGYgPSBpbnRmOworCXVzYl9zZXRfaW50ZmRhdGEoaHctPmludGYsIGh3KTsKKwlyZXR1cm4gMDsKK30KKworLyogZnVuY3Rpb24gY2FsbGVkIHdoZW4gYW4gYWN0aXZlIGRldmljZSBpcyByZW1vdmVkICovCitzdGF0aWMgdm9pZAoraGZjc3VzYl9kaXNjb25uZWN0KHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQoreworCXN0cnVjdCBoZmNzdXNiICpodyA9IHVzYl9nZXRfaW50ZmRhdGEoaW50Zik7CisJc3RydWN0IGhmY3N1c2IgKm5leHQ7CisJaW50IGNudCA9IDA7CisKKwlwcmludGsoS0VSTl9JTkZPICIlczogZGV2aWNlIGRpc2Nvbm5lY3RlZFxuIiwgaHctPm5hbWUpOworCisJaGFuZGxlX2xlZChodywgTEVEX1BPV0VSX09GRik7CisJcmVsZWFzZV9odyhodyk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoaHcsIG5leHQsICZIRkNsaXN0LCBsaXN0KQorCQljbnQrKzsKKwlpZiAoIWNudCkKKwkJaGZjc3VzYl9jbnQgPSAwOworCisJdXNiX3NldF9pbnRmZGF0YShpbnRmLCBOVUxMKTsKK30KKworc3RhdGljIHN0cnVjdCB1c2JfZHJpdmVyIGhmY3N1c2JfZHJ2ID0geworCS5uYW1lID0gRFJJVkVSX05BTUUsCisJLmlkX3RhYmxlID0gaGZjc3VzYl9pZHRhYiwKKwkucHJvYmUgPSBoZmNzdXNiX3Byb2JlLAorCS5kaXNjb25uZWN0ID0gaGZjc3VzYl9kaXNjb25uZWN0LAorfTsKKworc3RhdGljIGludCBfX2luaXQKK2hmY3N1c2JfaW5pdCh2b2lkKQoreworCXByaW50ayhLRVJOX0lORk8gRFJJVkVSX05BTUUgIiBkcml2ZXIgUmV2LiAlcyBkZWJ1ZygweCV4KSBwb2xsKCVpKVxuIiwKKwkgICAgaGZjc3VzYl9yZXYsIGRlYnVnLCBwb2xsKTsKKworCWlmICh1c2JfcmVnaXN0ZXIoJmhmY3N1c2JfZHJ2KSkgeworCQlwcmludGsoS0VSTl9JTkZPIERSSVZFUl9OQU1FCisJCSAgICAiOiBVbmFibGUgdG8gcmVnaXN0ZXIgaGZjc3VzYiBtb2R1bGUgYXQgdXNiIHN0YWNrXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdAoraGZjc3VzYl9jbGVhbnVwKHZvaWQpCit7CisJaWYgKGRlYnVnICYgREJHX0hGQ19DQUxMX1RSQUNFKQorCQlwcmludGsoS0VSTl9JTkZPIERSSVZFUl9OQU1FICI6ICVzXG4iLCBfX2Z1bmNfXyk7CisKKwkvKiB1bnJlZ2lzdGVyIEhhcmR3YXJlICovCisJdXNiX2RlcmVnaXN0ZXIoJmhmY3N1c2JfZHJ2KTsJLyogcmVsZWFzZSBvdXIgZHJpdmVyICovCit9CisKK21vZHVsZV9pbml0KGhmY3N1c2JfaW5pdCk7Cittb2R1bGVfZXhpdChoZmNzdXNiX2NsZWFudXApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2hhcmR3YXJlL21JU0ROL2hmY3N1c2IuaCBiL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9tSVNETi9oZmNzdXNiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDk4NDg2YgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9tSVNETi9oZmNzdXNiLmgKQEAgLTAsMCArMSw0MTggQEAKKy8qCisgKiBoZmNzdXNiLmgsIEhGQy1TIFVTQiBtSVNETiBkcml2ZXIKKyAqLworCisjaWZuZGVmIF9fSEZDU1VTQl9IX18KKyNkZWZpbmUgX19IRkNTVVNCX0hfXworCisKKyNkZWZpbmUgRFJJVkVSX05BTUUgIkhGQy1TX1VTQiIKKworI2RlZmluZSBEQkdfSEZDX0NBTExfVFJBQ0UJMHgwMDAxMDAwMAorI2RlZmluZSBEQkdfSEZDX0ZJRk9fVkVSQk9TRQkweDAwMDIwMDAwCisjZGVmaW5lIERCR19IRkNfVVNCX1ZFUkJPU0UJMHgwMDEwMDAwMAorI2RlZmluZSBEQkdfSEZDX1VSQl9JTkZPCTB4MDAyMDAwMDAKKyNkZWZpbmUgREJHX0hGQ19VUkJfRVJST1IJMHgwMDQwMDAwMAorCisjZGVmaW5lIERFRkFVTFRfVFJBTlNQX0JVUlNUX1NaIDEyOAorCisjZGVmaW5lIEhGQ19DVFJMX1RJTUVPVVQJMjAJLyogNW1zIHRpbWVvdXQgd3JpdGluZy9yZWFkaW5nIHJlZ3MgKi8KKyNkZWZpbmUgQ0xLREVMX1RFCQkweDBmCS8qIENMS0RFTCBpbiBURSBtb2RlICovCisjZGVmaW5lIENMS0RFTF9OVAkJMHg2YwkvKiBDTEtERUwgaW4gTlQgbW9kZSAqLworCisvKiBoZmNzdXNiIExheWVyMSBjb21tYW5kcyAqLworI2RlZmluZSBIRkNfTDFfQUNUSVZBVEVfVEUJCTEKKyNkZWZpbmUgSEZDX0wxX0FDVElWQVRFX05UCQkyCisjZGVmaW5lIEhGQ19MMV9ERUFDVElWQVRFX05UCQkzCisjZGVmaW5lIEhGQ19MMV9GT1JDRV9ERUFDVElWQVRFX1RFCTQKKworLyogY21kIEZMQUdTIGluIEhGQ1VTQl9TVEFURVMgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgSEZDVVNCX0xPQURfU1RBVEUJMHgxMAorI2RlZmluZSBIRkNVU0JfQUNUSVZBVEUJCTB4MjAKKyNkZWZpbmUgSEZDVVNCX0RPX0FDVElPTgkweDQwCisjZGVmaW5lIEhGQ1VTQl9OVF9HMl9HMwkJMHg4MAorCisvKiB0aW1lcnMgKi8KKyNkZWZpbmUgTlRfQUNUSVZBVElPTl9USU1FUgkweDAxCS8qIGVuYWJsZXMgTlQgbW9kZSBhY3RpdmF0aW9uIFRpbWVyICovCisjZGVmaW5lIE5UX1QxX0NPVU5UCQkxMAorCisjZGVmaW5lIE1BWF9CQ0hfU0laRSAJCTIwNDgJLyogYWxsb3dlZCBCLWNoYW5uZWwgcGFja2V0IHNpemUgKi8KKworI2RlZmluZSBIRkNVU0JfUlhfVEhSRVNIT0xEIAk2NAkvKiB0aHJlc2hvbGQgZm9yIGZpZm8gcmVwb3J0IGJpdCByeCAqLworI2RlZmluZSBIRkNVU0JfVFhfVEhSRVNIT0xEIAk5NgkvKiB0aHJlc2hvbGQgZm9yIGZpZm8gcmVwb3J0IGJpdCB0eCAqLworCisjZGVmaW5lIEhGQ1VTQl9DSElQX0lECQkweDE2CS8qIENoaXAgSUQgcmVnaXN0ZXIgaW5kZXggKi8KKyNkZWZpbmUgSEZDVVNCX0NJUk0JCTB4MDAJLyogY2lybSByZWdpc3RlciBpbmRleCAqLworI2RlZmluZSBIRkNVU0JfVVNCX1NJWkUJCTB4MDcJLyogaW50IGxlbmd0aCByZWdpc3RlciAqLworI2RlZmluZSBIRkNVU0JfVVNCX1NJWkVfSQkweDA2CS8qIGlzbyBsZW5ndGggcmVnaXN0ZXIgKi8KKyNkZWZpbmUgSEZDVVNCX0ZfQ1JPU1MJCTB4MGIJLyogYml0IG9yZGVyIHJlZ2lzdGVyICovCisjZGVmaW5lIEhGQ1VTQl9DTEtERUwJCTB4MzcJLyogYml0IGRlbGF5IHJlZ2lzdGVyICovCisjZGVmaW5lIEhGQ1VTQl9DT05fSERMQwkJMHhmYQkvKiBjaGFubmVsIGNvbm5lY3QgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgSEZDVVNCX0hETENfUEFSCQkweGZiCisjZGVmaW5lIEhGQ1VTQl9TQ1RSTAkJMHgzMQkvKiBTLWJ1cyBjb250cm9sIHJlZ2lzdGVyICh0eCkgKi8KKyNkZWZpbmUgSEZDVVNCX1NDVFJMX0UJCTB4MzIJLyogc2FtZSBmb3IgRSBhbmQgc3BlY2lhbCBmdW5jcyAqLworI2RlZmluZSBIRkNVU0JfU0NUUkxfUgkJMHgzMwkvKiBTLWJ1cyBjb250cm9sIHJlZ2lzdGVyIChyeCkgKi8KKyNkZWZpbmUgSEZDVVNCX0ZfVEhSRVMJCTB4MGMJLyogdGhyZXNob2xkIHJlZ2lzdGVyICovCisjZGVmaW5lIEhGQ1VTQl9GSUZPCQkweDBmCS8qIGZpZm8gc2VsZWN0IHJlZ2lzdGVyICovCisjZGVmaW5lIEhGQ1VTQl9GX1VTQUdFCQkweDFhCS8qIGZpZm8gdXNhZ2UgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgSEZDVVNCX01TVF9NT0RFMAkweDE0CisjZGVmaW5lIEhGQ1VTQl9NU1RfTU9ERTEJMHgxNQorI2RlZmluZSBIRkNVU0JfUF9EQVRBCQkweDFmCisjZGVmaW5lIEhGQ1VTQl9JTkNfUkVTX0YJMHgwZQorI2RlZmluZSBIRkNVU0JfQjFfU1NMCQkweDIwCisjZGVmaW5lIEhGQ1VTQl9CMl9TU0wJCTB4MjEKKyNkZWZpbmUgSEZDVVNCX0IxX1JTTAkJMHgyNAorI2RlZmluZSBIRkNVU0JfQjJfUlNMCQkweDI1CisjZGVmaW5lIEhGQ1VTQl9TVEFURVMJCTB4MzAKKworCisjZGVmaW5lIEhGQ1VTQl9DSElQSUQJCTB4NDAJLyogSUQgdmFsdWUgb2YgSEZDLVMgVVNCICovCisKKy8qIGZpZm8gcmVnaXN0ZXJzICovCisjZGVmaW5lIEhGQ1VTQl9OVU1fRklGT1MJOAkvKiBtYXhpbXVtIG51bWJlciBvZiBmaWZvcyAqLworI2RlZmluZSBIRkNVU0JfQjFfVFgJCTAJLyogaW5kZXggZm9yIEIxIHRyYW5zbWl0IGJ1bGsvaW50ICovCisjZGVmaW5lIEhGQ1VTQl9CMV9SWAkJMQkvKiBpbmRleCBmb3IgQjEgcmVjZWl2ZSBidWxrL2ludCAqLworI2RlZmluZSBIRkNVU0JfQjJfVFgJCTIKKyNkZWZpbmUgSEZDVVNCX0IyX1JYCQkzCisjZGVmaW5lIEhGQ1VTQl9EX1RYCQk0CisjZGVmaW5lIEhGQ1VTQl9EX1JYCQk1CisjZGVmaW5lIEhGQ1VTQl9QQ01fVFgJCTYKKyNkZWZpbmUgSEZDVVNCX1BDTV9SWAkJNworCisKKyNkZWZpbmUgVVNCX0lOVAkJMAorI2RlZmluZSBVU0JfQlVMSwkxCisjZGVmaW5lIFVTQl9JU09DCTIKKworI2RlZmluZSBJU09DX1BBQ0tFVFNfRAk4CisjZGVmaW5lIElTT0NfUEFDS0VUU19CCTgKKyNkZWZpbmUgSVNPX0JVRkZFUl9TSVpFCTEyOAorCisvKiBkZWZpbmVzIGhvdyBtdWNoIElTTyBwYWNrZXRzIGFyZSBoYW5kbGVkIGluIG9uZSBVUkIgKi8KK3N0YXRpYyBpbnQgaXNvX3BhY2tldHNbOF0gPQorICAgIHsgSVNPQ19QQUNLRVRTX0IsIElTT0NfUEFDS0VUU19CLCBJU09DX1BBQ0tFVFNfQiwgSVNPQ19QQUNLRVRTX0IsCisJSVNPQ19QQUNLRVRTX0QsIElTT0NfUEFDS0VUU19ELCBJU09DX1BBQ0tFVFNfRCwgSVNPQ19QQUNLRVRTX0QKK307CisKKworLyogRmlmbyBmbG93IENvbnRyb2wgZm9yIFRYIElTTyAqLworI2RlZmluZSBTSU5LX01BWAk2OAorI2RlZmluZSBTSU5LX01JTgk0OAorI2RlZmluZSBTSU5LX0RNSU4JMTIKKyNkZWZpbmUgU0lOS19ETUFYCTE4CisjZGVmaW5lIEJJVExJTkVfSU5GCSgtOTYqOCkKKworLyogSEZDLVMgVVNCIHJlZ2lzdGVyIGFjY2VzcyBieSBDb250cm9sLVVSU3MgKi8KKyNkZWZpbmUgd3JpdGVfcmVnX2F0b21pYyhhLCBiLCBjKSBcCisJdXNiX2NvbnRyb2xfbXNnKChhKS0+ZGV2LCAoYSktPmN0cmxfb3V0X3BpcGUsIDAsIDB4NDAsIChjKSwgKGIpLCBcCisJCTAsIDAsIEhGQ19DVFJMX1RJTUVPVVQpCisjZGVmaW5lIHJlYWRfcmVnX2F0b21pYyhhLCBiLCBjKSBcCisJdXNiX2NvbnRyb2xfbXNnKChhKS0+ZGV2LCAoYSktPmN0cmxfaW5fcGlwZSwgMSwgMHhDMCwgMCwgKGIpLCAoYyksIFwKKwkJMSwgSEZDX0NUUkxfVElNRU9VVCkKKyNkZWZpbmUgSEZDX0NUUkxfQlVGU0laRSA2NAorCitzdHJ1Y3QgY3RybF9idWYgeworCV9fdTggaGZjc19yZWc7CQkvKiByZWdpc3RlciBudW1iZXIgKi8KKwlfX3U4IHJlZ192YWw7CQkvKiB2YWx1ZSB0byBiZSB3cml0dGVuIChvciByZWFkKSAqLworfTsKKworLyoKKyAqIFVSQiBlcnJvciBjb2RlcworICogVXNlZCB0byByZXByZXNlbnQgYSBsaXN0IG9mIHZhbHVlcyBhbmQgdGhlaXIgcmVzcGVjdGl2ZSBzeW1ib2xpYyBuYW1lcworICovCitzdHJ1Y3QgaGZjdXNiX3N5bWJvbGljX2xpc3QgeworCWNvbnN0IGludCBudW07CisJY29uc3QgY2hhciAqbmFtZTsKK307CisKK3N0YXRpYyBzdHJ1Y3QgaGZjdXNiX3N5bWJvbGljX2xpc3QgdXJiX2Vycmxpc3RbXSA9IHsKKwl7LUVOT01FTSwgIk5vIG1lbW9yeSBmb3IgYWxsb2NhdGlvbiBvZiBpbnRlcm5hbCBzdHJ1Y3R1cmVzIn0sCisJey1FTk9TUEMsICJUaGUgaG9zdCBjb250cm9sbGVyJ3MgYmFuZHdpZHRoIGlzIGFscmVhZHkgY29uc3VtZWQifSwKKwl7LUVOT0VOVCwgIlVSQiB3YXMgY2FuY2VsZWQgYnkgdW5saW5rX3VyYiJ9LAorCXstRVhERVYsICJJU08gdHJhbnNmZXIgb25seSBwYXJ0aWFsbHkgY29tcGxldGVkIn0sCisJey1FQUdBSU4sICJUb28gbWF0Y2ggc2NoZWR1bGVkIGZvciB0aGUgZnV0dXJlIn0sCisJey1FTlhJTywgIlVSQiBhbHJlYWR5IHF1ZXVlZCJ9LAorCXstRUZCSUcsICJUb28gbXVjaCBJU08gZnJhbWVzIHJlcXVlc3RlZCJ9LAorCXstRU5PU1IsICJCdWZmZXIgZXJyb3IgKG92ZXJydW4pIn0sCisJey1FUElQRSwgIlNwZWNpZmllZCBlbmRwb2ludCBpcyBzdGFsbGVkIChkZXZpY2Ugbm90IHJlc3BvbmRpbmcpIn0sCisJey1FT1ZFUkZMT1csICJCYWJibGUgKGJhZCBjYWJsZT8pIn0sCisJey1FUFJPVE8sICJCaXQtc3R1ZmYgZXJyb3IgKGJhZCBjYWJsZT8pIn0sCisJey1FSUxTRVEsICJDUkMvVGltZW91dCJ9LAorCXstRVRJTUVET1VULCAiTkFLIChkZXZpY2UgZG9lcyBub3QgcmVzcG9uZCkifSwKKwl7LUVTSFVURE9XTiwgIkRldmljZSB1bnBsdWdnZWQifSwKKwl7LTEsIE5VTEx9Cit9OworCitzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIgKgorc3ltYm9saWMoc3RydWN0IGhmY3VzYl9zeW1ib2xpY19saXN0IGxpc3RbXSwgY29uc3QgaW50IG51bSkKK3sKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBsaXN0W2ldLm5hbWUgIT0gTlVMTDsgaSsrKQorCQlpZiAobGlzdFtpXS5udW0gPT0gbnVtKQorCQkJcmV0dXJuIGxpc3RbaV0ubmFtZTsKKwlyZXR1cm4gIjx1bmtvd24gVVNCIEVycm9yPiI7Cit9CisKKy8qIFVTQiBkZXNjcmlwdG9yIG5lZWQgdG8gY29udGFpbiBvbmUgb2YgdGhlIGZvbGxvd2luZyBFbmRQb2ludCBjb21iaW5hdGlvbjogKi8KKyNkZWZpbmUgQ05GXzRJTlQzSVNPCTEJLyogNCBJTlQgSU4sIDMgSVNPIE9VVCAqLworI2RlZmluZSBDTkZfM0lOVDNJU08JMgkvKiAzIElOVCBJTiwgMyBJU08gT1VUICovCisjZGVmaW5lIENORl80SVNPM0lTTwkzCS8qIDQgSVNPIElOLCAzIElTTyBPVVQgKi8KKyNkZWZpbmUgQ05GXzNJU08zSVNPCTQJLyogMyBJU08gSU4sIDMgSVNPIE9VVCAqLworCisjZGVmaW5lIEVQX05VTCAxCS8qIEVuZHBvaW50IGF0IHRoaXMgcG9zaXRpb24gbm90IGFsbG93ZWQgKi8KKyNkZWZpbmUgRVBfTk9QIDIJLyogYWxsIHR5cGUgb2YgZW5kcG9pbnRzIGFsbG93ZWQgYXQgdGhpcyBwb3NpdGlvbiAqLworI2RlZmluZSBFUF9JU08gMwkvKiBJc29jaHJvbiBlbmRwb2ludCBtYW5kYXRvcnkgYXQgdGhpcyBwb3NpdGlvbiAqLworI2RlZmluZSBFUF9CTEsgNAkvKiBCdWxrIGVuZHBvaW50IG1hbmRhdG9yeSBhdCB0aGlzIHBvc2l0aW9uICovCisjZGVmaW5lIEVQX0lOVCA1CS8qIEludGVycnVwdCBlbmRwb2ludCBtYW5kYXRvcnkgYXQgdGhpcyBwb3NpdGlvbiAqLworCisjZGVmaW5lIEhGQ19DSEFOX0IxCTAKKyNkZWZpbmUgSEZDX0NIQU5fQjIJMQorI2RlZmluZSBIRkNfQ0hBTl9ECTIKKyNkZWZpbmUgSEZDX0NIQU5fRQkzCisKKworLyoKKyAqIExpc3Qgb2YgYWxsIHN1cHBvcnRlZCBlbnBvaW50cyBjb25maWdpcmF0aW9uIHNldHMsIHVzZWQgdG8gZmluZCB0aGUKKyAqIGJlc3QgbWF0Y2hpbmcgZW5kcG9pbnQgY29uZmlndXJhdGlvbiB3aXRoaW4gYSBkZXZpY2VzJyBVU0IgZGVzY3JpcHRvci4KKyAqIFdlIG5lZWQgYXQgbGVhc3QgMyBSWCBlbmRwb2ludHMsIGFuZCAzIFRYIGVuZHBvaW50cywgZWl0aGVyCisgKiBJTlQtaW4gYW5kIElTTy1vdXQsIG9yIElTTy1pbiBhbmQgSVNPLW91dCkKKyAqIHdpdGggNCBSWCBlbmRwb2ludHMgZXZlbiBFLUNoYW5uZWwgbG9nZ2luZyBpcyBwb3NzaWJsZQorICovCitzdGF0aWMgaW50Cit2YWxpZGNvbmZbXVsxOV0gPSB7CisJLyogSU5UIGluLCBJU08gb3V0IGNvbmZpZyAqLworCXtFUF9OVUwsIEVQX0lOVCwgRVBfTlVMLCBFUF9JTlQsIEVQX05VTCwgRVBfSU5ULCBFUF9OT1AsIEVQX0lOVCwKKwkgRVBfSVNPLCBFUF9OVUwsIEVQX0lTTywgRVBfTlVMLCBFUF9JU08sIEVQX05VTCwgRVBfTlVMLCBFUF9OVUwsCisJIENORl80SU5UM0lTTywgMiwgMX0sCisJe0VQX05VTCwgRVBfSU5ULCBFUF9OVUwsIEVQX0lOVCwgRVBfTlVMLCBFUF9JTlQsIEVQX05VTCwgRVBfTlVMLAorCSBFUF9JU08sIEVQX05VTCwgRVBfSVNPLCBFUF9OVUwsIEVQX0lTTywgRVBfTlVMLCBFUF9OVUwsIEVQX05VTCwKKwkgQ05GXzNJTlQzSVNPLCAyLCAwfSwKKwkvKiBJU08gaW4sIElTTyBvdXQgY29uZmlnICovCisJe0VQX05PUCwgRVBfTk9QLCBFUF9OT1AsIEVQX05PUCwgRVBfTk9QLCBFUF9OT1AsIEVQX05PUCwgRVBfTk9QLAorCSBFUF9JU08sIEVQX0lTTywgRVBfSVNPLCBFUF9JU08sIEVQX0lTTywgRVBfSVNPLCBFUF9OT1AsIEVQX0lTTywKKwkgQ05GXzRJU08zSVNPLCAyLCAxfSwKKwl7RVBfTlVMLCBFUF9OVUwsIEVQX05VTCwgRVBfTlVMLCBFUF9OVUwsIEVQX05VTCwgRVBfTlVMLCBFUF9OVUwsCisJIEVQX0lTTywgRVBfSVNPLCBFUF9JU08sIEVQX0lTTywgRVBfSVNPLCBFUF9JU08sIEVQX05VTCwgRVBfTlVMLAorCSBDTkZfM0lTTzNJU08sIDIsIDB9LAorCXswLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwfSAvKiBFT0wgZWxlbWVudCAqLworfTsKKworLyogc3RyaW5nIGRlc2NyaXB0aW9uIG9mIGNob3NlbiBjb25maWcgKi8KK2NoYXIgKmNvbmZfc3RyW10gPSB7CisJIjQgSW50ZXJydXB0IElOICsgMyBJc29jaHJvbiBPVVQiLAorCSIzIEludGVycnVwdCBJTiArIDMgSXNvY2hyb24gT1VUIiwKKwkiNCBJc29jaHJvbiBJTiArIDMgSXNvY2hyb24gT1VUIiwKKwkiMyBJc29jaHJvbiBJTiArIDMgSXNvY2hyb24gT1VUIgorfTsKKworCisjZGVmaW5lIExFRF9PRkYJCTAJLyogbm8gTEVEIHN1cHBvcnQgKi8KKyNkZWZpbmUgTEVEX1NDSEVNRTEJMQkvKiBMRUQgc3RhbmRhcmQgc2NoZW1lICovCisjZGVmaW5lIExFRF9TQ0hFTUUyCTIJLyogbm90IHVzZWQgeWV0Li4uICovCisKKyNkZWZpbmUgTEVEX1BPV0VSX09OCTEKKyNkZWZpbmUgTEVEX1BPV0VSX09GRgkyCisjZGVmaW5lIExFRF9TMF9PTgkzCisjZGVmaW5lIExFRF9TMF9PRkYJNAorI2RlZmluZSBMRURfQjFfT04JNQorI2RlZmluZSBMRURfQjFfT0ZGCTYKKyNkZWZpbmUgTEVEX0IxX0RBVEEJNworI2RlZmluZSBMRURfQjJfT04JOAorI2RlZmluZSBMRURfQjJfT0ZGCTkKKyNkZWZpbmUgTEVEX0IyX0RBVEEJMTAKKworI2RlZmluZSBMRURfTk9STUFMCTAJLyogTEVEcyBhcmUgbm9ybWFsICovCisjZGVmaW5lIExFRF9JTlZFUlRFRCAJMQkvKiBMRURzIGFyZSBpbnZlcnRlZCAqLworCisvKiB0aW1lIGluIG1zIHRvIHBlcmZvcm0gYSBGbGFzaGluZyBMRUQgd2hlbiBCLUNoYW5uZWwgaGFzIHRyYWZmaWMgKi8KKyNkZWZpbmUgTEVEX1RJTUUgICAgICAyNTAKKworCisKK3N0cnVjdCBoZmNzdXNiOworc3RydWN0IHVzYl9maWZvOworCisvKiBzdHJ1Y3R1cmUgZGVmaW5pbmcgaW5wdXQrb3V0cHV0IGZpZm9zIChpbnRlcnJ1cHQvYnVsayBtb2RlKSAqLworc3RydWN0IGlzb191cmIgeworCXN0cnVjdCB1cmIgKnVyYjsKKwlfX3U4IGJ1ZmZlcltJU09fQlVGRkVSX1NJWkVdOwkvKiBidWZmZXIgcngvdHggVVNCIFVSQiBkYXRhICovCisJc3RydWN0IHVzYl9maWZvICpvd25lcl9maWZvOwkvKiBwb2ludGVyIHRvIG93bmVyIGZpZm8gKi8KKwlfX3U4IGluZHg7IC8qIEZpZm9zJ3MgSVNPIGRvdWJsZSBidWZmZXIgMCBvciAxID8gKi8KKyNpZmRlZiBJU09fRlJBTUVfU1RBUlRfREVCVUcKKwlpbnQgc3RhcnRfZnJhbWVzW0lTT19GUkFNRV9TVEFSVF9SSU5HX0NPVU5UXTsKKwlfX3U4IGlzb19mcm1fc3RydF9wb3M7IC8qIGluZGV4IGluIHN0YXJ0X2ZyYW1lW10gKi8KKyNlbmRpZgorfTsKKworc3RydWN0IHVzYl9maWZvIHsKKwlpbnQgZmlmb251bTsJCS8qIGZpZm8gaW5kZXggYXR0YWNoZWQgdG8gdGhpcyBzdHJ1Y3R1cmUgKi8KKwlpbnQgYWN0aXZlOwkJLyogZmlmbyBpcyBjdXJyZW50bHkgYWN0aXZlICovCisJc3RydWN0IGhmY3N1c2IgKmh3OwkvKiBwb2ludGVyIHRvIG1haW4gc3RydWN0dXJlICovCisJaW50IHBpcGU7CQkvKiBhZGRyZXNzIG9mIGVuZHBvaW50ICovCisJX191OCB1c2JfcGFja2V0X21heGxlbjsJLyogbWF4aW11bSBsZW5ndGggZm9yIHVzYiB0cmFuc2ZlciAqLworCXVuc2lnbmVkIGludCBtYXhfc2l6ZTsJLyogbWF4aW11bSBzaXplIG9mIHJlY2VpdmUvc2VuZCBwYWNrZXQgKi8KKwlfX3U4IGludGVydmFsbDsJCS8qIGludGVycnVwdCBpbnRlcnZhbCAqLworCXN0cnVjdCB1cmIgKnVyYjsJLyogdHJhbnNmZXIgc3RydWN0dXJlIGZvciB1c2Igcm91dGluZXMgKi8KKwlfX3U4IGJ1ZmZlclsxMjhdOwkvKiBidWZmZXIgVVNCIElOVCBPVVQgVVJCIGRhdGEgKi8KKwlpbnQgYml0X2xpbmU7CQkvKiBob3cgbXVjaCBiaXRzIGFyZSBpbiB0aGUgZmlmbz8gKi8KKworCV9fdTggdXNiX3RyYW5zZmVyX21vZGU7IC8qIHN3aXRjaGVkIGJldHdlZW4gSVNPIGFuZCBJTlQgKi8KKwlzdHJ1Y3QgaXNvX3VyYglpc29bMl07IC8qIHR3byB1cmJzIHRvIGhhdmUgb25lIGFsd2F5cworCQkJCQkgb25lIHBlbmRpbmcgKi8KKworCXN0cnVjdCBkY2hhbm5lbCAqZGNoOwkvKiBsaW5rIHRvIGhmY3N1c2JfdC0+ZGNoICovCisJc3RydWN0IGJjaGFubmVsICpiY2g7CS8qIGxpbmsgdG8gaGZjc3VzYl90LT5iY2ggKi8KKwlzdHJ1Y3QgZGNoYW5uZWwgKmVjaDsJLyogbGluayB0byBoZmNzdXNiX3QtPmVjaCwgVE9ETzogRS1DSEFOTkVMICovCisJaW50IGxhc3RfdXJibGVuOwkvKiByZW1lbWJlciBsZW5ndGggb2YgbGFzdCBwYWNrZXQgKi8KKwlfX3U4IHN0b3BfZ3JhY2VmdWxsOwkvKiBzdG9wcyBVUkIgcmV0cmFuc21pc3Npb24gKi8KK307CisKK3N0cnVjdCBoZmNzdXNiIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkCWxpc3Q7CisJc3RydWN0IGRjaGFubmVsCQlkY2g7CisJc3RydWN0IGJjaGFubmVsCQliY2hbMl07CisJc3RydWN0IGRjaGFubmVsCQllY2g7IC8qIFRPRE8gOiB3YWl0IGZvciBzdHJ1Y3QgZWNoYW5uZWwgOykgKi8KKworCXN0cnVjdCB1c2JfZGV2aWNlCSpkZXY7CQkvKiBvdXIgZGV2aWNlICovCisJc3RydWN0IHVzYl9pbnRlcmZhY2UJKmludGY7CQkvKiB1c2VkIGludGVyZmFjZSAqLworCWludAkJCWlmX3VzZWQ7CS8qIHVzZWQgaW50ZXJmYWNlIG51bWJlciAqLworCWludAkJCWFsdF91c2VkOwkvKiB1c2VkIGFsdGVybmF0ZSBjb25maWcgKi8KKwlpbnQJCQljZmdfdXNlZDsJLyogY29uZmlndXJhdGlvbiBpbmRleCB1c2VkICovCisJaW50CQkJdmVuZF9pZHg7CS8qIGluZGV4IGluIGhmY3N1c2JfaWR0YWIgKi8KKwlpbnQJCQlwYWNrZXRfc2l6ZTsKKwlpbnQJCQlpc29fcGFja2V0X3NpemU7CisJc3RydWN0IHVzYl9maWZvCQlmaWZvc1tIRkNVU0JfTlVNX0ZJRk9TXTsKKworCS8qIGNvbnRyb2wgcGlwZSBiYWNrZ3JvdW5kIGhhbmRsaW5nICovCisJc3RydWN0IGN0cmxfYnVmCQljdHJsX2J1ZmZbSEZDX0NUUkxfQlVGU0laRV07CisJaW50CQkJY3RybF9pbl9pZHgsIGN0cmxfb3V0X2lkeCwgY3RybF9jbnQ7CisJc3RydWN0IHVyYgkJKmN0cmxfdXJiOworCXN0cnVjdCB1c2JfY3RybHJlcXVlc3QJY3RybF93cml0ZTsKKwlzdHJ1Y3QgdXNiX2N0cmxyZXF1ZXN0CWN0cmxfcmVhZDsKKwlpbnQJCQljdHJsX3Bha3NpemU7CisJaW50CQkJY3RybF9pbl9waXBlLCBjdHJsX291dF9waXBlOworCXNwaW5sb2NrX3QJCWN0cmxfbG9jazsgLyogbG9jayBmb3IgY3RybCAqLworCXNwaW5sb2NrX3QgICAgICAgICAgICAgIGxvY2s7CisKKwlfX3U4CQkJdGhyZXNob2xkX21hc2s7CisJX191OAkJCWxlZF9zdGF0ZTsKKworCV9fdTgJCQlwcm90b2NvbDsKKwlpbnQJCQludF90aW1lcjsKKwlpbnQJCQlvcGVuOworCV9fdTgJCQl0aW1lcnM7CisJX191OAkJCWluaXRkb25lOworCWNoYXIJCQluYW1lW01JU0ROX01BWF9JRExFTl07Cit9OworCisvKiBwcml2YXRlIHZlbmRvciBzcGVjaWZpYyBkYXRhICovCitzdHJ1Y3QgaGZjc3VzYl92ZGF0YSB7CisJX191OAkJbGVkX3NjaGVtZTsgIC8qIGxlZCBkaXNwbGF5IHNjaGVtZSAqLworCXNpZ25lZCBzaG9ydAlsZWRfYml0c1s4XTsgLyogYXJyYXkgb2YgOCBwb3NzaWJsZSBMRUQgYml0bWFzayAqLworCWNoYXIJCSp2ZW5kX25hbWU7ICAvKiBkZXZpY2UgbmFtZSAqLworfTsKKworCisjZGVmaW5lIEhGQ19NQVhfVEVfTEFZRVIxX1NUQVRFIDgKKyNkZWZpbmUgSEZDX01BWF9OVF9MQVlFUjFfU1RBVEUgNAorCitjb25zdCBjaGFyICpIRkNfVEVfTEFZRVIxX1NUQVRFU1tIRkNfTUFYX1RFX0xBWUVSMV9TVEFURSArIDFdID0geworCSJURSBGMCAtIFJlc2V0IiwKKwkiVEUgRjEgLSBSZXNldCIsCisJIlRFIEYyIC0gU2Vuc2luZyIsCisJIlRFIEYzIC0gRGVhY3RpdmF0ZWQiLAorCSJURSBGNCAtIEF3YWl0aW5nIHNpZ25hbCIsCisJIlRFIEY1IC0gSWRlbnRpZnlpbmcgaW5wdXQiLAorCSJURSBGNiAtIFN5bmNocm9uaXplZCIsCisJIlRFIEY3IC0gQWN0aXZhdGVkIiwKKwkiVEUgRjggLSBMb3N0IGZyYW1pbmciLAorfTsKKworY29uc3QgY2hhciAqSEZDX05UX0xBWUVSMV9TVEFURVNbSEZDX01BWF9OVF9MQVlFUjFfU1RBVEUgKyAxXSA9IHsKKwkiTlQgRzAgLSBSZXNldCIsCisJIk5UIEcxIC0gRGVhY3RpdmUiLAorCSJOVCBHMiAtIFBlbmRpbmcgYWN0aXZhdGlvbiIsCisJIk5UIEczIC0gQWN0aXZlIiwKKwkiTlQgRzQgLSBQZW5kaW5nIGRlYWN0aXZhdGlvbiIsCit9OworCisvKiBzdXBwb3J0ZWQgZGV2aWNlcyAqLworc3RhdGljIHN0cnVjdCB1c2JfZGV2aWNlX2lkIGhmY3N1c2JfaWR0YWJbXSA9IHsKKwl7CisJIFVTQl9ERVZJQ0UoMHgwOTU5LCAweDJiZDApLAorCSAuZHJpdmVyX2luZm8gPSAodW5zaWduZWQgbG9uZykgJigoc3RydWN0IGhmY3N1c2JfdmRhdGEpCisJCQkgIHtMRURfT0ZGLCB7NCwgMCwgMiwgMX0sCisJCQkgICAiSVNETiBVU0IgVEEgKENvbG9nbmUgQ2hpcCBIRkMtUyBVU0IgYmFzZWQpIn0pLAorCX0sCisJeworCSBVU0JfREVWSUNFKDB4MDY3NSwgMHgxNjg4KSwKKwkgLmRyaXZlcl9pbmZvID0gKHVuc2lnbmVkIGxvbmcpICYoKHN0cnVjdCBoZmNzdXNiX3ZkYXRhKQorCQkJICB7TEVEX1NDSEVNRTEsIHsxLCAyLCAwLCAwfSwKKwkJCSAgICJEcmF5VGVrIG1pbmlWaWdvciAxMjggVVNCIElTRE4gVEEifSksCisJfSwKKwl7CisJIFVTQl9ERVZJQ0UoMHgwN2IwLCAweDAwMDcpLAorCSAuZHJpdmVyX2luZm8gPSAodW5zaWduZWQgbG9uZykgJigoc3RydWN0IGhmY3N1c2JfdmRhdGEpCisJCQkgIHtMRURfU0NIRU1FMSwgezB4ODAsIC02NCwgLTMyLCAtMTZ9LAorCQkJICAgIkJpbGxpb24gdGlueSBVU0IgSVNETiBUQSAxMjgifSksCisJfSwKKwl7CisJIFVTQl9ERVZJQ0UoMHgwNzQyLCAweDIwMDgpLAorCSAuZHJpdmVyX2luZm8gPSAodW5zaWduZWQgbG9uZykgJigoc3RydWN0IGhmY3N1c2JfdmRhdGEpCisJCQkgIHtMRURfU0NIRU1FMSwgezQsIDAsIDIsIDF9LAorCQkJICAgIlN0b2xsbWFubiBVU0IgVEEifSksCisJfSwKKwl7CisJIFVTQl9ERVZJQ0UoMHgwNzQyLCAweDIwMDkpLAorCSAuZHJpdmVyX2luZm8gPSAodW5zaWduZWQgbG9uZykgJigoc3RydWN0IGhmY3N1c2JfdmRhdGEpCisJCQkgIHtMRURfU0NIRU1FMSwgezQsIDAsIDIsIDF9LAorCQkJICAgIkFjZWV4IFVTQiBJU0ROIFRBIn0pLAorCX0sCisJeworCSBVU0JfREVWSUNFKDB4MDc0MiwgMHgyMDBBKSwKKwkgLmRyaXZlcl9pbmZvID0gKHVuc2lnbmVkIGxvbmcpICYoKHN0cnVjdCBoZmNzdXNiX3ZkYXRhKQorCQkJICB7TEVEX1NDSEVNRTEsIHs0LCAwLCAyLCAxfSwKKwkJCSAgICJPRU0gVVNCIElTRE4gVEEifSksCisJfSwKKwl7CisJIFVTQl9ERVZJQ0UoMHgwOGUzLCAweDAzMDEpLAorCSAuZHJpdmVyX2luZm8gPSAodW5zaWduZWQgbG9uZykgJigoc3RydWN0IGhmY3N1c2JfdmRhdGEpCisJCQkgIHtMRURfU0NIRU1FMSwgezIsIDAsIDEsIDR9LAorCQkJICAgIk9saXRlYyBVU0IgUk5JUyJ9KSwKKwl9LAorCXsKKwkgVVNCX0RFVklDRSgweDA3ZmEsIDB4MDg0NiksCisJIC5kcml2ZXJfaW5mbyA9ICh1bnNpZ25lZCBsb25nKSAmKChzdHJ1Y3QgaGZjc3VzYl92ZGF0YSkKKwkJCSAge0xFRF9TQ0hFTUUxLCB7MHg4MCwgLTY0LCAtMzIsIC0xNn0sCisJCQkgICAiQmV3YW4gTW9kZW0gUk5JUyBVU0IifSksCisJfSwKKwl7CisJIFVTQl9ERVZJQ0UoMHgwN2ZhLCAweDA4NDcpLAorCSAuZHJpdmVyX2luZm8gPSAodW5zaWduZWQgbG9uZykgJigoc3RydWN0IGhmY3N1c2JfdmRhdGEpCisJCQkgIHtMRURfU0NIRU1FMSwgezB4ODAsIC02NCwgLTMyLCAtMTZ9LAorCQkJICAgIkRqaW5uIE51bWVyaXMgVVNCIn0pLAorCX0sCisJeworCSBVU0JfREVWSUNFKDB4MDdiMCwgMHgwMDA2KSwKKwkgLmRyaXZlcl9pbmZvID0gKHVuc2lnbmVkIGxvbmcpICYoKHN0cnVjdCBoZmNzdXNiX3ZkYXRhKQorCQkJICB7TEVEX1NDSEVNRTEsIHsweDgwLCAtNjQsIC0zMiwgLTE2fSwKKwkJCSAgICJUd2lzdGVyIElTRE4gVEEifSksCisJfSwKKwl7CisJIFVTQl9ERVZJQ0UoMHgwNzFkLCAweDEwMDUpLAorCSAuZHJpdmVyX2luZm8gPSAodW5zaWduZWQgbG9uZykgJigoc3RydWN0IGhmY3N1c2JfdmRhdGEpCisJCQkgIHtMRURfU0NIRU1FMSwgezB4MDIsIDAsIDB4MDEsIDB4MDR9LAorCQkJICAgIkVpY29uIERJVkEgVVNCIDQuMCJ9KSwKKwl9LAorCXsKKwkgVVNCX0RFVklDRSgweDA1ODYsIDB4MDEwMiksCisJIC5kcml2ZXJfaW5mbyA9ICh1bnNpZ25lZCBsb25nKSAmKChzdHJ1Y3QgaGZjc3VzYl92ZGF0YSkKKwkJCSAge0xFRF9TQ0hFTUUxLCB7MHg4OCwgLTY0LCAtMzIsIC0xNn0sCisJCQkgICAiWnlYRUwgT01OSS5ORVQgVVNCIElJIn0pLAorCX0sCisJeyB9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKHVzYiwgaGZjc3VzYl9pZHRhYik7CisKKyNlbmRpZgkvKiBfX0hGQ1NVU0JfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vaHlzZG4vaHlzZG5fbmV0LmMgYi9kcml2ZXJzL2lzZG4vaHlzZG4vaHlzZG5fbmV0LmMKaW5kZXggN2VlNWJkOS4uNTc5OTc0YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2h5c2RuL2h5c2RuX25ldC5jCisrKyBiL2RyaXZlcnMvaXNkbi9oeXNkbi9oeXNkbl9uZXQuYwpAQCAtMzgsMTYgKzM4LDEyIEBACiAvKiBpbnNpZGUgdGhlIGRlZmluaXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogc3RydWN0IG5ldF9sb2NhbCB7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgbmV0ZGV2OwkvKiB0aGUgbmV0d29yayBkZXZpY2UgKi8KLQlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsKLQkvKiBhZGRpdGlvbmFsIHZhcnMgbWF5IGJlIGFkZGVkIGhlcmUgKi8KLQljaGFyIGRldl9uYW1lWzldOwkvKiBvdXIgb3duIGRldmljZSBuYW1lICovCi0KIAkvKiBUeCBjb250cm9sIGxvY2suICBUaGlzIHByb3RlY3RzIHRoZSB0cmFuc21pdCBidWZmZXIgcmluZwogCSAqIHN0YXRlIGFsb25nIHdpdGggdGhlICJ0eCBmdWxsIiBzdGF0ZSBvZiB0aGUgZHJpdmVyLiAgVGhpcwogCSAqIG1lYW5zIGFsbCBuZXRpZl9xdWV1ZSBmbG93IGNvbnRyb2wgYWN0aW9ucyBhcmUgcHJvdGVjdGVkCiAJICogYnkgdGhpcyBsb2NrIGFzIHdlbGwuCiAJICovCisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKIAlzcGlubG9ja190IGxvY2s7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYnNbTUFYX1NLQl9CVUZGRVJTXTsJLyogcG9pbnRlcnMgdG8gdHgtc2ticyAqLwogCWludCBpbl9pZHgsIG91dF9pZHg7CS8qIGluZGV4ZXMgdG8gYnVmZmVyIHJpbmcgKi8KQEAgLTU1LDE1ICs1MSw2IEBACiB9OwkJCQkvKiBuZXRfbG9jYWwgKi8KIAogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBHZXQgdGhlIGN1cnJlbnQgc3RhdGlzdGljcyBmb3IgdGhpcyBjYXJkLiAgICAgICAgICovCi0vKiBUaGlzIG1heSBiZSBjYWxsZWQgd2l0aCB0aGUgY2FyZCBvcGVuIG9yIGNsb3NlZCAhICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKgotbmV0X2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQotewotCXJldHVybiAoJigoc3RydWN0IG5ldF9sb2NhbCAqKSBkZXYpLT5zdGF0cyk7Ci19CQkJCS8qIG5ldF9kZXZpY2Vfc3RhdHMgKi8KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIE9wZW4vaW5pdGlhbGl6ZSB0aGUgYm9hcmQuIFRoaXMgaXMgY2FsbGVkIChpbiB0aGUgY3VycmVudCBrZXJuZWwpICovCkBAIC0xODIsOCArMTY5LDggQEAKIAlpZiAoIWxwLT5za19jb3VudCkKIAkJcmV0dXJuOwkJLyogZXJyb3IgY29uZGl0aW9uICovCiAKLQlscC0+c3RhdHMudHhfcGFja2V0cysrOwotCWxwLT5zdGF0cy50eF9ieXRlcyArPSBscC0+c2tic1tscC0+b3V0X2lkeF0tPmxlbjsKKwlscC0+ZGV2LT5zdGF0cy50eF9wYWNrZXRzKys7CisJbHAtPmRldi0+c3RhdHMudHhfYnl0ZXMgKz0gbHAtPnNrYnNbbHAtPm91dF9pZHhdLT5sZW47CiAKIAlkZXZfa2ZyZWVfc2tiKGxwLT5za2JzW2xwLT5vdXRfaWR4KytdKTsJCS8qIGZyZWUgc2tiICovCiAJaWYgKGxwLT5vdXRfaWR4ID49IE1BWF9TS0JfQlVGRkVSUykKQEAgLTIwMCwyOSArMTg3LDMwIEBACiBoeXNkbl9yeF9uZXRwa3QoaHlzZG5fY2FyZCAqIGNhcmQsIHVuc2lnbmVkIGNoYXIgKmJ1ZiwgdW5zaWduZWQgc2hvcnQgbGVuKQogewogCXN0cnVjdCBuZXRfbG9jYWwgKmxwID0gY2FyZC0+bmV0aWY7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGxwLT5kZXY7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAogCWlmICghbHApCiAJCXJldHVybjsJCS8qIG5vbiBleGlzdGluZyBkZXZpY2UgKi8KIAotCWxwLT5zdGF0cy5yeF9ieXRlcyArPSBsZW47CisJZGV2LT5zdGF0cy5yeF9ieXRlcyArPSBsZW47CiAKIAlza2IgPSBkZXZfYWxsb2Nfc2tiKGxlbik7CiAJaWYgKHNrYiA9PSBOVUxMKSB7CiAJCXByaW50ayhLRVJOX05PVElDRSAiJXM6IE1lbW9yeSBzcXVlZXplLCBkcm9wcGluZyBwYWNrZXQuXG4iLAotCQkgICAgICAgbHAtPm5ldGRldi5uYW1lKTsKLQkJbHAtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKKwkJICAgICAgIGRldi0+bmFtZSk7CisJCWRldi0+c3RhdHMucnhfZHJvcHBlZCsrOwogCQlyZXR1cm47CiAJfQogCS8qIGNvcHkgdGhlIGRhdGEgKi8KIAltZW1jcHkoc2tiX3B1dChza2IsIGxlbiksIGJ1ZiwgbGVuKTsKIAogCS8qIGRldGVybWluZSB0aGUgdXNlZCBwcm90b2NvbCAqLwotCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsICZscC0+bmV0ZGV2KTsKKwlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBkZXYpOworCisJZGV2LT5zdGF0cy5yeF9wYWNrZXRzKys7CS8qIGFkanVzdCBwYWNrZXQgY291bnQgKi8KIAogCW5ldGlmX3J4KHNrYik7Ci0JbHAtPnN0YXRzLnJ4X3BhY2tldHMrKzsJLyogYWRqdXN0IHBhY2tldCBjb3VudCAqLwotCiB9CQkJCS8qIGh5c2RuX3J4X25ldHBrdCAqLwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0yNDIsMjQgKzIzMCwxNSBAQAogCXJldHVybiAobHAtPnNrYnNbbHAtPm91dF9pZHhdKTsJCS8qIG5leHQgcGFja2V0IHRvIHNlbmQgKi8KIH0JCQkJLyogaHlzZG5fdHhfbmV0Z2V0ICovCiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgaHlzZG5fbmV0ZGV2X29wcyA9IHsKKwkubmRvX29wZW4gCQk9IG5ldF9vcGVuLAorCS5uZG9fc3RvcAkJPSBuZXRfY2xvc2UsCisJLm5kb19zdGFydF94bWl0CQk9IG5ldF9zZW5kX3BhY2tldCwKKwkubmRvX2NoYW5nZV9tdHUJCT0gZXRoX2NoYW5nZV9tdHUsCisJLm5kb19zZXRfbWFjX2FkZHJlc3MgCT0gZXRoX21hY19hZGRyLAorCS5uZG9fdmFsaWRhdGVfYWRkcgk9IGV0aF92YWxpZGF0ZV9hZGRyLAorfTsKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBpbml0IGZ1bmN0aW9uIGNhbGxlZCBieSByZWdpc3RlciBkZXZpY2UgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGludAotbmV0X2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKLXsKLQkvKiBzZXR1cCB0aGUgZnVuY3Rpb24gdGFibGUgKi8KLQlkZXYtPm9wZW4gPSBuZXRfb3BlbjsKLQlkZXYtPnN0b3AgPSBuZXRfY2xvc2U7Ci0JZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSBuZXRfc2VuZF9wYWNrZXQ7Ci0JZGV2LT5nZXRfc3RhdHMgPSBuZXRfZ2V0X3N0YXRzOwotCi0JLyogRmlsbCBpbiB0aGUgZmllbGRzIG9mIHRoZSBkZXZpY2Ugc3RydWN0dXJlIHdpdGggZXRoZXJuZXQgdmFsdWVzLiAqLwotCWV0aGVyX3NldHVwKGRldik7Ci0KLQlyZXR1cm4gKDApOwkJLyogc3VjY2VzcyAqLwotfQkJCQkvKiBuZXRfaW5pdCAqLwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiBoeXNkbl9uZXRfY3JlYXRlIGNyZWF0ZXMgYSBuZXcgbmV0IGRldmljZSBmb3IgdGhlIGdpdmVuIGNhcmQuIElmIGEgZGV2aWNlICovCkBAIC0yNzEsMjggKzI1MCwzNCBAQAogewogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CiAJaW50IGk7CisJc3RydWN0IG5ldF9sb2NhbCAqbHA7CisKIAlpZighY2FyZCkgewogCQlwcmludGsoS0VSTl9XQVJOSU5HICJObyBjYXJkLXB0IGluIGh5c2RuX25ldF9jcmVhdGUhXG4iKTsKIAkJcmV0dXJuICgtRU5PTUVNKTsKIAl9CiAJaHlzZG5fbmV0X3JlbGVhc2UoY2FyZCk7CS8qIHJlbGVhc2UgYW4gZXhpc3RpbmcgbmV0IGRldmljZSAqLwotCWlmICgoZGV2ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG5ldF9sb2NhbCksIEdGUF9LRVJORUwpKSA9PSBOVUxMKSB7CisKKwlkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2Yoc3RydWN0IG5ldF9sb2NhbCkpOworCWlmICghZGV2KSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIkhZU0ROOiB1bmFibGUgdG8gYWxsb2NhdGUgbWVtXG4iKTsKIAkJcmV0dXJuICgtRU5PTUVNKTsKIAl9CiAKKwlscCA9IG5ldGRldl9wcml2KGRldik7CisJbHAtPmRldiA9IGRldjsKKworCWRldi0+bmV0ZGV2X29wcyA9ICZoeXNkbl9uZXRkZXZfb3BzOwogCXNwaW5fbG9ja19pbml0KCYoKHN0cnVjdCBuZXRfbG9jYWwgKikgZGV2KS0+bG9jayk7CiAKIAkvKiBpbml0aWFsaXNlIG5lY2Vzc2FyeSBvciBpbmZvcm1pbmcgZmllbGRzICovCiAJZGV2LT5iYXNlX2FkZHIgPSBjYXJkLT5pb2Jhc2U7CS8qIElPIGFkZHJlc3MgKi8KIAlkZXYtPmlycSA9IGNhcmQtPmlycTsJLyogaXJxICovCi0JZGV2LT5pbml0ID0gbmV0X2luaXQ7CS8qIHRoZSBpbml0IGZ1bmN0aW9uIG9mIHRoZSBkZXZpY2UgKi8KLQlpZihkZXYtPm5hbWUpIHsKLQkJc3RyY3B5KGRldi0+bmFtZSwgKChzdHJ1Y3QgbmV0X2xvY2FsICopIGRldiktPmRldl9uYW1lKTsKLQl9IAorCisJZGV2LT5uZXRkZXZfb3BzID0gJmh5c2RuX25ldGRldl9vcHM7CiAJaWYgKChpID0gcmVnaXN0ZXJfbmV0ZGV2KGRldikpKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIkhZU0ROOiB1bmFibGUgdG8gY3JlYXRlIG5ldHdvcmsgZGV2aWNlXG4iKTsKLQkJa2ZyZWUoZGV2KTsKKwkJZnJlZV9uZXRkZXYoZGV2KTsKIAkJcmV0dXJuIChpKTsKIAl9CiAJZGV2LT5tbF9wcml2ID0gY2FyZDsJLyogcmVtZW1iZXIgcG9pbnRlciB0byBvd24gZGF0YSBzdHJ1Y3R1cmUgKi8KQEAgLTMxNiw3ICszMDEsNyBAQAogCQlyZXR1cm4gKDApOwkvKiBub24gZXhpc3RpbmcgKi8KIAogCWNhcmQtPm5ldGlmID0gTlVMTDsJLyogY2xlYXIgb3V0IHBvaW50ZXIgKi8KLQlkZXYtPnN0b3AoZGV2KTsJCS8qIGNsb3NlIHRoZSBkZXZpY2UgKi8KKwluZXRfY2xvc2UoZGV2KTsKIAogCWZsdXNoX3R4X2J1ZmZlcnMoKHN0cnVjdCBuZXRfbG9jYWwgKikgZGV2KTsJLyogZW1wdHkgYnVmZmVycyAqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vaTRsL2lzZG5fbmV0LmMgYi9kcml2ZXJzL2lzZG4vaTRsL2lzZG5fbmV0LmMKaW5kZXggMDIzZWExMS4uY2I4OTQzZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2k0bC9pc2RuX25ldC5jCisrKyBiL2RyaXZlcnMvaXNkbi9pNGwvaXNkbl9uZXQuYwpAQCAtMjkyLDcgKzI5Miw5IEBACiAJbHAtPmRpYWxzdGF0ZSA9IDA7CiAJZGV2LT5yeF9uZXRkZXZbaXNkbl9kYzJtaW5vcihscC0+aXNkbl9kZXZpY2UsIGxwLT5pc2RuX2NoYW5uZWwpXSA9IE5VTEw7CiAJZGV2LT5zdF9uZXRkZXZbaXNkbl9kYzJtaW5vcihscC0+aXNkbl9kZXZpY2UsIGxwLT5pc2RuX2NoYW5uZWwpXSA9IE5VTEw7Ci0JaXNkbl9mcmVlX2NoYW5uZWwobHAtPmlzZG5fZGV2aWNlLCBscC0+aXNkbl9jaGFubmVsLCBJU0ROX1VTQUdFX05FVCk7CisJaWYgKGxwLT5pc2RuX2RldmljZSAhPSAtMSAmJiBscC0+aXNkbl9jaGFubmVsICE9IC0xKQorCQlpc2RuX2ZyZWVfY2hhbm5lbChscC0+aXNkbl9kZXZpY2UsIGxwLT5pc2RuX2NoYW5uZWwsCisJCQkJICBJU0ROX1VTQUdFX05FVCk7CiAJbHAtPmZsYWdzICY9IH5JU0ROX05FVF9DT05ORUNURUQ7CiAJbHAtPmlzZG5fZGV2aWNlID0gLTE7CiAJbHAtPmlzZG5fY2hhbm5lbCA9IC0xOwpAQCAtMTQ4NSw2ICsxNDg3LDI0IEBACiAJcmV0dXJuIChyYyk7CiB9CiAKKworc3RhdGljIGludCBpc2RuX25ldF9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICBzdHJ1Y3QgaWZyZXEgKmlmciwgaW50IGNtZCkKK3sKKwlpc2RuX25ldF9sb2NhbCAqbHAgPSAoaXNkbl9uZXRfbG9jYWwgKikgbmV0ZGV2X3ByaXYoZGV2KTsKKworCXN3aXRjaCAobHAtPnBfZW5jYXApIHsKKyNpZmRlZiBDT05GSUdfSVNETl9QUFAKKwljYXNlIElTRE5fTkVUX0VOQ0FQX1NZTkNQUFA6CisJCXJldHVybiBpc2RuX3BwcF9kZXZfaW9jdGwoZGV2LCBpZnIsIGNtZCk7CisjZW5kaWYKKwljYXNlIElTRE5fTkVUX0VOQ0FQX0NJU0NPSERMQ0s6CisJCXJldHVybiBpc2RuX2Npc2NvaGRsY2tfZGV2X2lvY3RsKGRldiwgaWZyLCBjbWQpOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KK30KKwogLyogY2FsbGVkIHZpYSBjaXNjb190aW1lci5mdW5jdGlvbiAqLwogc3RhdGljIHZvaWQKIGlzZG5fbmV0X2Npc2NvaGRsY2tfc2xhcnBfc2VuZF9rZWVwYWxpdmUodW5zaWduZWQgbG9uZyBkYXRhKQpAQCAtMTk5OCwyMyArMjAxOCw2IEBACiAJdXNob3J0IG1heF9obGhkcl9sZW4gPSAwOwogCWludCBkcnZpZHg7CiAKLQlldGhlcl9zZXR1cChuZGV2KTsKLQluZGV2LT5oZWFkZXJfb3BzID0gTlVMTDsKLQotCS8qIFNldHVwIHRoZSBnZW5lcmljIHByb3BlcnRpZXMgKi8KLQluZGV2LT5tdHUgPSAxNTAwOwotCW5kZXYtPmZsYWdzID0gSUZGX05PQVJQfElGRl9QT0lOVE9QT0lOVDsKLQluZGV2LT50eXBlID0gQVJQSFJEX0VUSEVSOwotCW5kZXYtPmFkZHJfbGVuID0gRVRIX0FMRU47Ci0JbmRldi0+dmFsaWRhdGVfYWRkciA9IE5VTEw7Ci0KLQkvKiBmb3IgY2xpZW50cyB3aXRoIE1QUFAgbWF5YmUgaGlnaGVyIHZhbHVlcyBiZXR0ZXIgKi8KLQluZGV2LT50eF9xdWV1ZV9sZW4gPSAzMDsKLQotCS8qIFRoZSBJU0ROLXNwZWNpZmljIGVudHJpZXMgaW4gdGhlIGRldmljZSBzdHJ1Y3R1cmUuICovCi0JbmRldi0+b3BlbiA9ICZpc2RuX25ldF9vcGVuOwotCW5kZXYtPmhhcmRfc3RhcnRfeG1pdCA9ICZpc2RuX25ldF9zdGFydF94bWl0OwotCiAJLyoKIAkgKiAgdXAgdGlsbCBiaW5kaW5nIHdlIGFzayB0aGUgcHJvdG9jb2wgbGF5ZXIgdG8gcmVzZXJ2ZSBhcyBtdWNoCiAJICogIGFzIHdlIG1pZ2h0IG5lZWQgZm9yIEhMIGxheWVyCkBAIC0yMDI2LDkgKzIwMjksNiBAQAogCQkJCW1heF9obGhkcl9sZW4gPSBkZXYtPmRydltkcnZpZHhdLT5pbnRlcmZhY2UtPmhsX2hkcmxlbjsKIAogCW5kZXYtPmhhcmRfaGVhZGVyX2xlbiA9IEVUSF9ITEVOICsgbWF4X2hsaGRyX2xlbjsKLQluZGV2LT5zdG9wID0gJmlzZG5fbmV0X2Nsb3NlOwotCW5kZXYtPmdldF9zdGF0cyA9ICZpc2RuX25ldF9nZXRfc3RhdHM7Ci0JbmRldi0+ZG9faW9jdGwgPSBOVUxMOwogCXJldHVybiAwOwogfQogCkBAIC0yNTA4LDYgKzI1MDgsMTggQEAKIAlyZXR1cm4gKGlzZG5fbmV0X2ZvcmNlX2RpYWxfbHAocC0+bG9jYWwpKTsKIH0KIAorLyogVGhlIElTRE4tc3BlY2lmaWMgZW50cmllcyBpbiB0aGUgZGV2aWNlIHN0cnVjdHVyZS4gKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgaXNkbl9uZXRkZXZfb3BzID0geworCS5uZG9faW5pdAkgICAgICA9IGlzZG5fbmV0X2luaXQsCisJLm5kb19vcGVuCSAgICAgID0gaXNkbl9uZXRfb3BlbiwKKwkubmRvX3N0b3AJICAgICAgPSBpc2RuX25ldF9jbG9zZSwKKwkubmRvX2RvX2lvY3RsCSAgICAgID0gaXNkbl9uZXRfaW9jdGwsCisKKwkubmRvX3N0YXJ0X3htaXQJICAgICAgPSBpc2RuX25ldF9zdGFydF94bWl0LAorCS5uZG9fZ2V0X3N0YXRzCSAgICAgID0gaXNkbl9uZXRfZ2V0X3N0YXRzLAorCS5uZG9fdHhfdGltZW91dAkgICAgICA9IGlzZG5fbmV0X3R4X3RpbWVvdXQsCit9OworCiAvKgogICogSGVscGVyIGZvciBhbGxvY19uZXRkZXYoKQogICovCkBAIC0yNTE1LDcgKzI1MjcsMTYgQEAKIHsKIAlpc2RuX25ldF9sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOwogCi0JZGV2LT5mbGFncyA9IElGRl9OT0FSUCB8IElGRl9QT0lOVE9QT0lOVDsKKwlldGhlcl9zZXR1cChkZXYpOworCisJLyogU2V0dXAgdGhlIGdlbmVyaWMgcHJvcGVydGllcyAqLworCWRldi0+ZmxhZ3MgPSBJRkZfTk9BUlB8SUZGX1BPSU5UT1BPSU5UOworCWRldi0+aGVhZGVyX29wcyA9IE5VTEw7CisJZGV2LT5uZXRkZXZfb3BzID0gJmlzZG5fbmV0ZGV2X29wczsKKworCS8qIGZvciBjbGllbnRzIHdpdGggTVBQUCBtYXliZSBoaWdoZXIgdmFsdWVzIGJldHRlciAqLworCWRldi0+dHhfcXVldWVfbGVuID0gMzA7CisKIAlscC0+cF9lbmNhcCA9IElTRE5fTkVUX0VOQ0FQX1JBV0lQOwogCWxwLT5tYWdpYyA9IElTRE5fTkVUX01BR0lDOwogCWxwLT5sYXN0ID0gbHA7CkBAIC0yNTcwLDcgKzI1OTEsNyBAQAogCQlyZXR1cm4gTlVMTDsKIAl9CiAJbmV0ZGV2LT5sb2NhbCA9IG5ldGRldl9wcml2KG5ldGRldi0+ZGV2KTsKLQluZXRkZXYtPmRldi0+aW5pdCA9IGlzZG5fbmV0X2luaXQ7CisKIAlpZiAobWFzdGVyKSB7CiAJCS8qIERldmljZSBzaGFsbCBiZSBhIHNsYXZlICovCiAJCXN0cnVjdCBuZXRfZGV2aWNlICpwID0gTUFTVEVSX1RPX1NMQVZFKG1hc3Rlcik7CkBAIC0yNTg4LDcgKzI2MDksNiBAQAogCQkvKgogCQkgKiBXYXRjaGRvZyB0aW1lciAoY3VycmVudGx5KSBmb3IgbWFzdGVyIG9ubHkuCiAJCSAqLwotCQluZXRkZXYtPmRldi0+dHhfdGltZW91dCA9IGlzZG5fbmV0X3R4X3RpbWVvdXQ7CiAJCW5ldGRldi0+ZGV2LT53YXRjaGRvZ190aW1lbyA9IElTRE5fTkVUX1RYX1RJTUVPVVQ7CiAJCWlmIChyZWdpc3Rlcl9uZXRkZXYobmV0ZGV2LT5kZXYpICE9IDApIHsKIAkJCXByaW50ayhLRVJOX1dBUk5JTkcgImlzZG5fbmV0OiBDb3VsZCBub3QgcmVnaXN0ZXIgbmV0LWRldmljZVxuIik7CkBAIC0yNzA0LDcgKzI3MjQsNiBAQAogI2Vsc2UKIAkJCXAtPmRldi0+dHlwZSA9IEFSUEhSRF9QUFA7CS8qIGNoYW5nZSBBUlAgdHlwZSAqLwogCQkJcC0+ZGV2LT5hZGRyX2xlbiA9IDA7Ci0JCQlwLT5kZXYtPmRvX2lvY3RsID0gaXNkbl9wcHBfZGV2X2lvY3RsOwogI2VuZGlmCiAJCQlicmVhazsKIAkJY2FzZSBJU0ROX05FVF9FTkNBUF9YMjVJRkFDRToKQEAgLTI3MTgsNyArMjczNyw2IEBACiAjZW5kaWYKIAkJCWJyZWFrOwogCQljYXNlIElTRE5fTkVUX0VOQ0FQX0NJU0NPSERMQ0s6Ci0JCQlwLT5kZXYtPmRvX2lvY3RsID0gaXNkbl9jaXNjb2hkbGNrX2Rldl9pb2N0bDsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJaWYoIGNmZy0+cF9lbmNhcCA+PSAwICYmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vbUlTRE4vTWFrZWZpbGUgYi9kcml2ZXJzL2lzZG4vbUlTRE4vTWFrZWZpbGUKaW5kZXggMWNiNWU2My4uMGE2YmQyYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL21JU0ROL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvaXNkbi9tSVNETi9NYWtlZmlsZQpAQCAtOCw2ICs4LDYgQEAKIAogIyBtdWx0aSBvYmplY3RzCiAKLW1JU0ROX2NvcmUtb2JqcyA6PSBjb3JlLm8gZnNtLm8gc29ja2V0Lm8gaHdjaGFubmVsLm8gc3RhY2subyBsYXllcjEubyBsYXllcjIubyB0ZWkubyB0aW1lcmRldi5vCittSVNETl9jb3JlLW9ianMgOj0gY29yZS5vIGZzbS5vIHNvY2tldC5vIGNsb2NrLm8gaHdjaGFubmVsLm8gc3RhY2subyBsYXllcjEubyBsYXllcjIubyB0ZWkubyB0aW1lcmRldi5vCiBtSVNETl9kc3Atb2JqcyA6PSBkc3BfY29yZS5vIGRzcF9jbXgubyBkc3BfdG9uZXMubyBkc3BfZHRtZi5vIGRzcF9hdWRpby5vIGRzcF9ibG93ZmlzaC5vIGRzcF9waXBlbGluZS5vIGRzcF9od2VjLm8KIGwxb2lwLW9ianMgOj0gbDFvaXBfY29yZS5vIGwxb2lwX2NvZGVjLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9tSVNETi9jbG9jay5jIGIvZHJpdmVycy9pc2RuL21JU0ROL2Nsb2NrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDRkOWMzZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaXNkbi9tSVNETi9jbG9jay5jCkBAIC0wLDAgKzEsMjE2IEBACisvKgorICogQ29weXJpZ2h0IDIwMDggIGJ5IEFuZHJlYXMgRXZlcnNiZXJnIDxhbmRyZWFzQGV2ZXJzYmVyZy5ldT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogUXVpY2sgQVBJIGRlc2NyaXB0aW9uOgorICoKKyAqIEEgY2xvY2sgc291cmNlIHJlZ2lzdGVycyB1c2luZyBtSVNETl9yZWdpc3Rlcl9jbG9jazoKKyAqIAluYW1lID0gdGV4dCBzdHJpbmcgdG8gbmFtZSBjbG9jayBzb3VyY2UKKyAqCXByaW9yaXR5ID0gdmFsdWUgdG8gcHJpb3JpemUgY2xvY2sgc291cmNlcyAoMCA9IGRlZmF1bHQpCisgKgljdGwgPSBjYWxsYmFjayBmdW5jdGlvbiB0byBlbmFibGUvZGlzYWJsZSBjbG9jayBzb3VyY2UKKyAqCXByaXYgPSBwcml2YXRlIHBvaW50ZXIgb2YgY2xvY2sgc291cmNlCisgKiAJcmV0dXJuID0gcG9pbnRlciB0byBjbG9jayBzb3VyY2Ugc3RydWN0dXJlOworICoKKyAqIE5vdGU6IENhbGxiYWNrICdjdGwnIGNhbiBiZSBjYWxsZWQgYmVmb3JlIG1JU0ROX3JlZ2lzdGVyX2Nsb2NrIHJldHVybnMhCisgKiAgICAgICBBbHNvIGl0IGNhbiBiZSBjYWxsZWQgZHVyaW5nIG1JU0ROX3VucmVnaXN0ZXJfY2xvY2suCisgKgorICogQSBjbG9jayBzb3VyY2UgY2FsbHMgbUlTRE5fY2xvY2tfdXBkYXRlIHdpdGggZ2l2ZW4gc2FtcGxlcyBlbGFwc2VkLCBpZgorICogZW5hYmxlZC4gSWYgZnVuY3Rpb24gY2FsbCBpcyBkZWxheWVkLCB0diBtdXN0IGJlIHNldCB3aXRoIHRoZSB0aW1lc3RhbXAKKyAqIG9mIHRoZSBhY3R1YWwgZXZlbnQuCisgKgorICogQSBjbG9jayBzb3VyY2UgdW5yZWdpc3RlcnMgdXNpbmcgbUlTRE5fdW5yZWdpc3Rlcl9jbG9jay4KKyAqCisgKiBUbyBnZXQgY3VycmVudCBjbG9jaywgY2FsbCBtSVNETl9jbG9ja19nZXQuIFRoZSBzaWduZWQgc2hvcnQgdmFsdWUKKyAqIGNvdW50cyB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgc2luY2UuIFRpbWUgc2luY2UgbGFzdCBjbG9jayBldmVudCBpcyBhZGRlZC4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9tSVNETmlmLmg+CisjaW5jbHVkZSAiY29yZS5oIgorCitzdGF0aWMgdV9pbnQgKmRlYnVnOworc3RhdGljIExJU1RfSEVBRChpY2xvY2tfbGlzdCk7CitERUZJTkVfUldMT0NLKGljbG9ja19sb2NrKTsKK3UxNglpY2xvY2tfY291bnQ7CQkvKiBjb3VudGVyIG9mIGxhc3QgY2xvY2sgKi8KK3N0cnVjdAl0aW1ldmFsIGljbG9ja190djsJLyogdGltZSBzdGFtcCBvZiBsYXN0IGNsb2NrICovCitpbnQJaWNsb2NrX3R2X3ZhbGlkOwkvKiBhbHJlYWR5IHJlY2VpdmVkIG9uZSB0aW1lc3RhbXAgKi8KK3N0cnVjdAltSVNETmNsb2NrICppY2xvY2tfY3VycmVudDsKKwordm9pZAorbUlTRE5faW5pdF9jbG9jayh1X2ludCAqZHApCit7CisJZGVidWcgPSBkcDsKKwlkb19nZXR0aW1lb2ZkYXkoJmljbG9ja190dik7Cit9CisKK3N0YXRpYyB2b2lkCitzZWxlY3RfaWNsb2NrKHZvaWQpCit7CisJc3RydWN0IG1JU0ROY2xvY2sgKmljbG9jaywgKmJlc3RjbG9jayA9IE5VTEwsICpsYXN0Y2xvY2sgPSBOVUxMOworCWludCBwcmkgPSAtMTI4OworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShpY2xvY2ssICZpY2xvY2tfbGlzdCwgbGlzdCkgeworCQlpZiAoaWNsb2NrLT5wcmkgPiBwcmkpIHsKKwkJCXByaSA9IGljbG9jay0+cHJpOworCQkJYmVzdGNsb2NrID0gaWNsb2NrOworCQl9CisJCWlmIChpY2xvY2tfY3VycmVudCA9PSBpY2xvY2spCisJCQlsYXN0Y2xvY2sgPSBpY2xvY2s7CisJfQorCWlmIChsYXN0Y2xvY2sgJiYgYmVzdGNsb2NrICE9IGxhc3RjbG9jaykgeworCQkvKiBsYXN0IHVzZWQgY2xvY2sgc291cmNlIHN0aWxsIGV4aXN0cyBidXQgY2hhbmdlcywgZGlzYWJsZSAqLworCQlpZiAoKmRlYnVnICYgREVCVUdfQ0xPQ0spCisJCQlwcmludGsoS0VSTl9ERUJVRyAiT2xkIGNsb2NrIHNvdXJjZSAnJXMnIGRpc2FibGUuXG4iLAorCQkJCWxhc3RjbG9jay0+bmFtZSk7CisJCWxhc3RjbG9jay0+Y3RsKGxhc3RjbG9jay0+cHJpdiwgMCk7CisJfQorCWlmIChiZXN0Y2xvY2sgJiYgYmVzdGNsb2NrICE9IGljbG9ja19jdXJyZW50KSB7CisJCS8qIG5ldyBjbG9jayBzb3VyY2Ugc2VsZWN0ZWQsIGVuYWJsZSAqLworCQlpZiAoKmRlYnVnICYgREVCVUdfQ0xPQ0spCisJCQlwcmludGsoS0VSTl9ERUJVRyAiTmV3IGNsb2NrIHNvdXJjZSAnJXMnIGVuYWJsZS5cbiIsCisJCQkJYmVzdGNsb2NrLT5uYW1lKTsKKwkJYmVzdGNsb2NrLT5jdGwoYmVzdGNsb2NrLT5wcml2LCAxKTsKKwl9CisJaWYgKGJlc3RjbG9jayAhPSBpY2xvY2tfY3VycmVudCkgeworCQkvKiBubyBjbG9jayByZWNlaXZlZCB5ZXQgKi8KKwkJaWNsb2NrX3R2X3ZhbGlkID0gMDsKKwl9CisJaWNsb2NrX2N1cnJlbnQgPSBiZXN0Y2xvY2s7Cit9CisKK3N0cnVjdCBtSVNETmNsb2NrCisqbUlTRE5fcmVnaXN0ZXJfY2xvY2soY2hhciAqbmFtZSwgaW50IHByaSwgY2xvY2tjdGxfZnVuY190ICpjdGwsIHZvaWQgKnByaXYpCit7CisJdV9sb25nCQkJZmxhZ3M7CisJc3RydWN0IG1JU0ROY2xvY2sJKmljbG9jazsKKworCWlmICgqZGVidWcgJiAoREVCVUdfQ09SRSB8IERFQlVHX0NMT0NLKSkKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAlcyAlZFxuIiwgX19mdW5jX18sIG5hbWUsIHByaSk7CisJaWNsb2NrID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG1JU0ROY2xvY2spLCBHRlBfQVRPTUlDKTsKKwlpZiAoIWljbG9jaykgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBObyBtZW1vcnkgZm9yIGNsb2NrIGVudHJ5LlxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gTlVMTDsKKwl9CisJc3RybmNweShpY2xvY2stPm5hbWUsIG5hbWUsIHNpemVvZihpY2xvY2stPm5hbWUpLTEpOworCWljbG9jay0+cHJpID0gcHJpOworCWljbG9jay0+cHJpdiA9IHByaXY7CisJaWNsb2NrLT5jdGwgPSBjdGw7CisJd3JpdGVfbG9ja19pcnFzYXZlKCZpY2xvY2tfbG9jaywgZmxhZ3MpOworCWxpc3RfYWRkX3RhaWwoJmljbG9jay0+bGlzdCwgJmljbG9ja19saXN0KTsKKwlzZWxlY3RfaWNsb2NrKCk7CisJd3JpdGVfdW5sb2NrX2lycXJlc3RvcmUoJmljbG9ja19sb2NrLCBmbGFncyk7CisJcmV0dXJuIGljbG9jazsKK30KK0VYUE9SVF9TWU1CT0wobUlTRE5fcmVnaXN0ZXJfY2xvY2spOworCit2b2lkCittSVNETl91bnJlZ2lzdGVyX2Nsb2NrKHN0cnVjdCBtSVNETmNsb2NrICppY2xvY2spCit7CisJdV9sb25nCWZsYWdzOworCisJaWYgKCpkZWJ1ZyAmIChERUJVR19DT1JFIHwgREVCVUdfQ0xPQ0spKQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6ICVzICVkXG4iLCBfX2Z1bmNfXywgaWNsb2NrLT5uYW1lLAorCQkJaWNsb2NrLT5wcmkpOworCXdyaXRlX2xvY2tfaXJxc2F2ZSgmaWNsb2NrX2xvY2ssIGZsYWdzKTsKKwlpZiAoaWNsb2NrX2N1cnJlbnQgPT0gaWNsb2NrKSB7CisJCWlmICgqZGVidWcgJiBERUJVR19DTE9DSykKKwkJCXByaW50ayhLRVJOX0RFQlVHCisJCQkJIkN1cnJlbnQgY2xvY2sgc291cmNlICclcycgdW5yZWdpc3RlcnMuXG4iLAorCQkJCWljbG9jay0+bmFtZSk7CisJCWljbG9jay0+Y3RsKGljbG9jay0+cHJpdiwgMCk7CisJfQorCWxpc3RfZGVsKCZpY2xvY2stPmxpc3QpOworCXNlbGVjdF9pY2xvY2soKTsKKwl3cml0ZV91bmxvY2tfaXJxcmVzdG9yZSgmaWNsb2NrX2xvY2ssIGZsYWdzKTsKK30KK0VYUE9SVF9TWU1CT0wobUlTRE5fdW5yZWdpc3Rlcl9jbG9jayk7CisKK3ZvaWQKK21JU0ROX2Nsb2NrX3VwZGF0ZShzdHJ1Y3QgbUlTRE5jbG9jayAqaWNsb2NrLCBpbnQgc2FtcGxlcywgc3RydWN0IHRpbWV2YWwgKnR2KQoreworCXVfbG9uZwkJZmxhZ3M7CisJc3RydWN0IHRpbWV2YWwJdHZfbm93OworCXRpbWVfdAkJZWxhcHNlZF9zZWM7CisJaW50CQllbGFwc2VkXzgwMDB0aDsKKworCXdyaXRlX2xvY2tfaXJxc2F2ZSgmaWNsb2NrX2xvY2ssIGZsYWdzKTsKKwlpZiAoaWNsb2NrX2N1cnJlbnQgIT0gaWNsb2NrKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6ICclcycgc2VuZHMgdXMgY2xvY2sgdXBkYXRlcywgYnV0IHdlIGRvICIKKwkJCSJsaXN0ZW4gdG8gJyVzJy4gVGhpcyBpcyBhIGJ1ZyFcbiIsIF9fZnVuY19fLAorCQkJaWNsb2NrLT5uYW1lLAorCQkJaWNsb2NrX2N1cnJlbnQgPyBpY2xvY2tfY3VycmVudC0+bmFtZSA6ICJub3RoaW5nIik7CisJCWljbG9jay0+Y3RsKGljbG9jay0+cHJpdiwgMCk7CisJCXdyaXRlX3VubG9ja19pcnFyZXN0b3JlKCZpY2xvY2tfbG9jaywgZmxhZ3MpOworCQlyZXR1cm47CisJfQorCWlmIChpY2xvY2tfdHZfdmFsaWQpIHsKKwkJLyogaW5jcmVtZW50IHNhbXBsZSBjb3VudGVyIGJ5IGdpdmVuIHNhbXBsZXMgKi8KKwkJaWNsb2NrX2NvdW50ICs9IHNhbXBsZXM7CisJCWlmICh0dikgeyAvKiB0diBtdXN0IGJlIHNldCwgaWYgZnVuY3Rpb24gY2FsbCBpcyBkZWxheWVkICovCisJCQlpY2xvY2tfdHYudHZfc2VjID0gdHYtPnR2X3NlYzsKKwkJCWljbG9ja190di50dl91c2VjID0gdHYtPnR2X3VzZWM7CisJCX0gZWxzZQorCQkJZG9fZ2V0dGltZW9mZGF5KCZpY2xvY2tfdHYpOworCX0gZWxzZSB7CisJCS8qIGNhbGMgZWxhcHNlZCB0aW1lIGJ5IHN5c3RlbSBjbG9jayAqLworCQlpZiAodHYpIHsgLyogdHYgbXVzdCBiZSBzZXQsIGlmIGZ1bmN0aW9uIGNhbGwgaXMgZGVsYXllZCAqLworCQkJdHZfbm93LnR2X3NlYyA9IHR2LT50dl9zZWM7CisJCQl0dl9ub3cudHZfdXNlYyA9IHR2LT50dl91c2VjOworCQl9IGVsc2UKKwkJCWRvX2dldHRpbWVvZmRheSgmdHZfbm93KTsKKwkJZWxhcHNlZF9zZWMgPSB0dl9ub3cudHZfc2VjIC0gaWNsb2NrX3R2LnR2X3NlYzsKKwkJZWxhcHNlZF84MDAwdGggPSAodHZfbm93LnR2X3VzZWMgLyAxMjUpCisJCQktIChpY2xvY2tfdHYudHZfdXNlYyAvIDEyNSk7CisJCWlmIChlbGFwc2VkXzgwMDB0aCA8IDApIHsKKwkJCWVsYXBzZWRfc2VjIC09IDE7CisJCQllbGFwc2VkXzgwMDB0aCArPSA4MDAwOworCQl9CisJCS8qIGFkZCBlbGFwc2VkIHRpbWUgdG8gY291bnRlciBhbmQgc2V0IG5ldyB0aW1lc3RhbXAgKi8KKwkJaWNsb2NrX2NvdW50ICs9IGVsYXBzZWRfc2VjICogODAwMCArIGVsYXBzZWRfODAwMHRoOworCQlpY2xvY2tfdHYudHZfc2VjID0gdHZfbm93LnR2X3NlYzsKKwkJaWNsb2NrX3R2LnR2X3VzZWMgPSB0dl9ub3cudHZfdXNlYzsKKwkJaWNsb2NrX3R2X3ZhbGlkID0gMTsKKwkJaWYgKCpkZWJ1ZyAmIERFQlVHX0NMT0NLKQorCQkJcHJpbnRrKCJSZWNlaXZlZCBmaXJzdCBjbG9jayBmcm9tIHNvdXJjZSAnJXMnLlxuIiwKKwkJCSAgICBpY2xvY2tfY3VycmVudCA/IGljbG9ja19jdXJyZW50LT5uYW1lIDogIm5vdGhpbmciKTsKKwl9CisJd3JpdGVfdW5sb2NrX2lycXJlc3RvcmUoJmljbG9ja19sb2NrLCBmbGFncyk7Cit9CitFWFBPUlRfU1lNQk9MKG1JU0ROX2Nsb2NrX3VwZGF0ZSk7CisKK3Vuc2lnbmVkIHNob3J0CittSVNETl9jbG9ja19nZXQodm9pZCkKK3sKKwl1X2xvbmcJCWZsYWdzOworCXN0cnVjdCB0aW1ldmFsCXR2X25vdzsKKwl0aW1lX3QJCWVsYXBzZWRfc2VjOworCWludAkJZWxhcHNlZF84MDAwdGg7CisJdTE2CQljb3VudDsKKworCXJlYWRfbG9ja19pcnFzYXZlKCZpY2xvY2tfbG9jaywgZmxhZ3MpOworCS8qIGNhbGMgZWxhcHNlZCB0aW1lIGJ5IHN5c3RlbSBjbG9jayAqLworCWRvX2dldHRpbWVvZmRheSgmdHZfbm93KTsKKwllbGFwc2VkX3NlYyA9IHR2X25vdy50dl9zZWMgLSBpY2xvY2tfdHYudHZfc2VjOworCWVsYXBzZWRfODAwMHRoID0gKHR2X25vdy50dl91c2VjIC8gMTI1KSAtIChpY2xvY2tfdHYudHZfdXNlYyAvIDEyNSk7CisJaWYgKGVsYXBzZWRfODAwMHRoIDwgMCkgeworCQllbGFwc2VkX3NlYyAtPSAxOworCQllbGFwc2VkXzgwMDB0aCArPSA4MDAwOworCX0KKwkvKiBhZGQgZWxhcHNlZCB0aW1lIHRvIGNvdW50ZXIgKi8KKwljb3VudCA9CWljbG9ja19jb3VudCArIGVsYXBzZWRfc2VjICogODAwMCArIGVsYXBzZWRfODAwMHRoOworCXJlYWRfdW5sb2NrX2lycXJlc3RvcmUoJmljbG9ja19sb2NrLCBmbGFncyk7CisJcmV0dXJuIGNvdW50OworfQorRVhQT1JUX1NZTUJPTChtSVNETl9jbG9ja19nZXQpOworCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vbUlTRE4vY29yZS5jIGIvZHJpdmVycy9pc2RuL21JU0ROL2NvcmUuYwppbmRleCA3NTE2NjVjLi45NDI2Yzk4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vbUlTRE4vY29yZS5jCisrKyBiL2RyaXZlcnMvaXNkbi9tSVNETi9jb3JlLmMKQEAgLTI1LDM5ICsyNSwxODMgQEAKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIG1vZHVsZV9wYXJhbShkZWJ1ZywgdWludCwgU19JUlVHTyB8IFNfSVdVU1IpOwogCi1zdGF0aWMgTElTVF9IRUFEKGRldmljZXMpOwotc3RhdGljIERFRklORV9SV0xPQ0soZGV2aWNlX2xvY2spOwogc3RhdGljIHU2NAkJZGV2aWNlX2lkczsKICNkZWZpbmUgTUFYX0RFVklDRV9JRAk2MwogCiBzdGF0aWMgTElTVF9IRUFEKEJwcm90b2NvbHMpOwogc3RhdGljIERFRklORV9SV0xPQ0soYnBfbG9jayk7CiAKK3N0YXRpYyB2b2lkIG1JU0ROX2Rldl9yZWxlYXNlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwkvKiBub3RoaW5nIHRvIGRvOiB0aGUgZGV2aWNlIGlzIHBhcnQgb2YgaXRzIHBhcmVudCdzIGRhdGEgc3RydWN0dXJlICovCit9CisKK3N0YXRpYyBzc2l6ZV90IF9zaG93X2lkKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBtSVNETmRldmljZSAqbWRldiA9IGRldl90b19tSVNETihkZXYpOworCisJaWYgKCFtZGV2KQorCQlyZXR1cm4gLUVOT0RFVjsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgbWRldi0+aWQpOworfQorCitzdGF0aWMgc3NpemVfdCBfc2hvd19ucmJjaGFuKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBtSVNETmRldmljZSAqbWRldiA9IGRldl90b19tSVNETihkZXYpOworCisJaWYgKCFtZGV2KQorCQlyZXR1cm4gLUVOT0RFVjsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgbWRldi0+bnJiY2hhbik7Cit9CisKK3N0YXRpYyBzc2l6ZV90IF9zaG93X2RfcHJvdG9jb2xzKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBtSVNETmRldmljZSAqbWRldiA9IGRldl90b19tSVNETihkZXYpOworCisJaWYgKCFtZGV2KQorCQlyZXR1cm4gLUVOT0RFVjsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgbWRldi0+RHByb3RvY29scyk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IF9zaG93X2JfcHJvdG9jb2xzKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBtSVNETmRldmljZSAqbWRldiA9IGRldl90b19tSVNETihkZXYpOworCisJaWYgKCFtZGV2KQorCQlyZXR1cm4gLUVOT0RFVjsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgbWRldi0+QnByb3RvY29scyB8IGdldF9hbGxfQnByb3RvY29scygpKTsKK30KKworc3RhdGljIHNzaXplX3QgX3Nob3dfcHJvdG9jb2woc3RydWN0IGRldmljZSAqZGV2LAorCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IG1JU0ROZGV2aWNlICptZGV2ID0gZGV2X3RvX21JU0ROKGRldik7CisKKwlpZiAoIW1kZXYpCisJCXJldHVybiAtRU5PREVWOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBtZGV2LT5ELnByb3RvY29sKTsKK30KKworc3RhdGljIHNzaXplX3QgX3Nob3dfbmFtZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJjcHkoYnVmLCBkZXZfbmFtZShkZXYpKTsKKwlyZXR1cm4gc3RybGVuKGJ1Zik7Cit9CisKKyNpZiAwIC8qIGhhbmdzICovCitzdGF0aWMgc3NpemVfdCBfc2V0X25hbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlpbnQgZXJyID0gMDsKKwljaGFyICpvdXQgPSBrbWFsbG9jKGNvdW50ICsgMSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIW91dCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwltZW1jcHkob3V0LCBidWYsIGNvdW50KTsKKwlpZiAoY291bnQgJiYgb3V0W2NvdW50IC0gMV0gPT0gJ1xuJykKKwkJb3V0Wy0tY291bnRdID0gMDsKKwlpZiAoY291bnQpCisJCWVyciA9IGRldmljZV9yZW5hbWUoZGV2LCBvdXQpOworCWtmcmVlKG91dCk7CisKKwlyZXR1cm4gKGVyciA8IDApID8gZXJyIDogY291bnQ7Cit9CisjZW5kaWYKKworc3RhdGljIHNzaXplX3QgX3Nob3dfY2hhbm5lbG1hcChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgbUlTRE5kZXZpY2UgKm1kZXYgPSBkZXZfdG9fbUlTRE4oZGV2KTsKKwljaGFyICpicCA9IGJ1ZjsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPD0gbWRldi0+bnJiY2hhbjsgaSsrKQorCQkqYnArKyA9IHRlc3RfY2hhbm5lbG1hcChpLCBtZGV2LT5jaGFubmVsbWFwKSA/ICcxJyA6ICcwJzsKKworCXJldHVybiBicCAtIGJ1ZjsKK30KKworc3RhdGljIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlIG1JU0ROX2Rldl9hdHRyc1tdID0geworCV9fQVRUUihpZCwgICAgICAgICAgU19JUlVHTywgICAgICAgICBfc2hvd19pZCwgICAgICAgICAgTlVMTCksCisJX19BVFRSKGRfcHJvdG9jb2xzLCBTX0lSVUdPLCAgICAgICAgIF9zaG93X2RfcHJvdG9jb2xzLCBOVUxMKSwKKwlfX0FUVFIoYl9wcm90b2NvbHMsIFNfSVJVR08sICAgICAgICAgX3Nob3dfYl9wcm90b2NvbHMsIE5VTEwpLAorCV9fQVRUUihwcm90b2NvbCwgICAgU19JUlVHTywgICAgICAgICBfc2hvd19wcm90b2NvbCwgICAgTlVMTCksCisJX19BVFRSKGNoYW5uZWxtYXAsICBTX0lSVUdPLCAgICAgICAgIF9zaG93X2NoYW5uZWxtYXAsICBOVUxMKSwKKwlfX0FUVFIobnJiY2hhbiwgICAgIFNfSVJVR08sICAgICAgICAgX3Nob3dfbnJiY2hhbiwgICAgIE5VTEwpLAorCV9fQVRUUihuYW1lLCAgICAgICAgU19JUlVHTywgICAgICAgICBfc2hvd19uYW1lLCAgICAgICAgTlVMTCksCisvKglfX0FUVFIobmFtZSwgICAgICAgIFNfSVJVR098U19JV1VTUiwgX3Nob3dfbmFtZSwgICAgICAgX3NldF9uYW1lKSwgKi8KKwl7fQorfTsKKworI2lmZGVmIENPTkZJR19IT1RQTFVHCitzdGF0aWMgaW50IG1JU0ROX3VldmVudChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBrb2JqX3VldmVudF9lbnYgKmVudikKK3sKKwlzdHJ1Y3QgbUlTRE5kZXZpY2UgKm1kZXYgPSBkZXZfdG9fbUlTRE4oZGV2KTsKKworCWlmICghbWRldikKKwkJcmV0dXJuIDA7CisKKwlpZiAoYWRkX3VldmVudF92YXIoZW52LCAibmNoYW5zPSVkIiwgbWRldi0+bnJiY2hhbikpCisJCXJldHVybiAtRU5PTUVNOworCisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQgbUlTRE5fY2xhc3NfcmVsZWFzZShzdHJ1Y3QgY2xhc3MgKmNscykKK3sKKwkvKiBkbyBub3RoaW5nLCBpdCdzIHN0YXRpYyAqLworfQorCitzdGF0aWMgc3RydWN0IGNsYXNzIG1JU0ROX2NsYXNzID0geworCS5uYW1lID0gIm1JU0ROIiwKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKyNpZmRlZiBDT05GSUdfSE9UUExVRworCS5kZXZfdWV2ZW50ID0gbUlTRE5fdWV2ZW50LAorI2VuZGlmCisJLmRldl9hdHRycyA9IG1JU0ROX2Rldl9hdHRycywKKwkuZGV2X3JlbGVhc2UgPSBtSVNETl9kZXZfcmVsZWFzZSwKKwkuY2xhc3NfcmVsZWFzZSA9IG1JU0ROX2NsYXNzX3JlbGVhc2UsCit9OworCitzdGF0aWMgaW50CitfZ2V0X21kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICppZCkKK3sKKwlzdHJ1Y3QgbUlTRE5kZXZpY2UgKm1kZXYgPSBkZXZfdG9fbUlTRE4oZGV2KTsKKworCWlmICghbWRldikKKwkJcmV0dXJuIDA7CisJaWYgKG1kZXYtPmlkICE9ICoodV9pbnQgKilpZCkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIDE7Cit9CisKIHN0cnVjdCBtSVNETmRldmljZQogKmdldF9tZGV2aWNlKHVfaW50IGlkKQogewotCXN0cnVjdCBtSVNETmRldmljZQkqZGV2OworCXJldHVybiBkZXZfdG9fbUlTRE4oY2xhc3NfZmluZF9kZXZpY2UoJm1JU0ROX2NsYXNzLCBOVUxMLCAmaWQsCisJCV9nZXRfbWRldmljZSkpOworfQogCi0JcmVhZF9sb2NrKCZkZXZpY2VfbG9jayk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeShkZXYsICZkZXZpY2VzLCBELmxpc3QpCi0JCWlmIChkZXYtPmlkID09IGlkKSB7Ci0JCQlyZWFkX3VubG9jaygmZGV2aWNlX2xvY2spOwotCQkJcmV0dXJuIGRldjsKLQkJfQotCXJlYWRfdW5sb2NrKCZkZXZpY2VfbG9jayk7Ci0JcmV0dXJuIE5VTEw7CitzdGF0aWMgaW50CitfZ2V0X21kZXZpY2VfY291bnQoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpjbnQpCit7CisJKihpbnQgKiljbnQgKz0gMTsKKwlyZXR1cm4gMDsKIH0KIAogaW50CiBnZXRfbWRldmljZV9jb3VudCh2b2lkKQogewotCXN0cnVjdCBtSVNETmRldmljZQkqZGV2OwotCWludAkJCWNudCA9IDA7CisJaW50IGNudCA9IDA7CiAKLQlyZWFkX2xvY2soJmRldmljZV9sb2NrKTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRldiwgJmRldmljZXMsIEQubGlzdCkKLQkJY250Kys7Ci0JcmVhZF91bmxvY2soJmRldmljZV9sb2NrKTsKKwljbGFzc19mb3JfZWFjaF9kZXZpY2UoJm1JU0ROX2NsYXNzLCBOVUxMLCAmY250LCBfZ2V0X21kZXZpY2VfY291bnQpOwogCXJldHVybiBjbnQ7CiB9CiAKQEAgLTY4LDQ4ICsyMTIsNjYgQEAKIAogCWZvciAoaSA9IDA7IGkgPD0gTUFYX0RFVklDRV9JRDsgaSsrKQogCQlpZiAoIXRlc3RfYW5kX3NldF9iaXQoaSwgKHVfbG9uZyAqKSZkZXZpY2VfaWRzKSkKLQkJCXJldHVybiBpOwotCXJldHVybiAtMTsKKwkJCWJyZWFrOworCWlmIChpID4gTUFYX0RFVklDRV9JRCkKKwkJcmV0dXJuIC0xOworCXJldHVybiBpOwogfQogCiBpbnQKLW1JU0ROX3JlZ2lzdGVyX2RldmljZShzdHJ1Y3QgbUlTRE5kZXZpY2UgKmRldiwgY2hhciAqbmFtZSkKK21JU0ROX3JlZ2lzdGVyX2RldmljZShzdHJ1Y3QgbUlTRE5kZXZpY2UgKmRldiwKKwkJCXN0cnVjdCBkZXZpY2UgKnBhcmVudCwgY2hhciAqbmFtZSkKIHsKLQl1X2xvbmcJZmxhZ3M7CiAJaW50CWVycjsKIAogCWRldi0+aWQgPSBnZXRfZnJlZV9kZXZpZCgpOworCWVyciA9IC1FQlVTWTsKIAlpZiAoZGV2LT5pZCA8IDApCi0JCXJldHVybiAtRUJVU1k7CisJCWdvdG8gZXJyb3IxOworCisJZGV2aWNlX2luaXRpYWxpemUoJmRldi0+ZGV2KTsKIAlpZiAobmFtZSAmJiBuYW1lWzBdKQotCQlzdHJjcHkoZGV2LT5uYW1lLCBuYW1lKTsKKwkJZGV2X3NldF9uYW1lKCZkZXYtPmRldiwgIiVzIiwgbmFtZSk7CiAJZWxzZQotCQlzcHJpbnRmKGRldi0+bmFtZSwgIm1JU0ROJWQiLCBkZXYtPmlkKTsKKwkJZGV2X3NldF9uYW1lKCZkZXYtPmRldiwgIm1JU0ROJWQiLCBkZXYtPmlkKTsKIAlpZiAoZGVidWcgJiBERUJVR19DT1JFKQogCQlwcmludGsoS0VSTl9ERUJVRyAibUlTRE5fcmVnaXN0ZXIgJXMgJWRcbiIsCi0JCQlkZXYtPm5hbWUsIGRldi0+aWQpOworCQkJZGV2X25hbWUoJmRldi0+ZGV2KSwgZGV2LT5pZCk7CiAJZXJyID0gY3JlYXRlX3N0YWNrKGRldik7CiAJaWYgKGVycikKLQkJcmV0dXJuIGVycjsKLQl3cml0ZV9sb2NrX2lycXNhdmUoJmRldmljZV9sb2NrLCBmbGFncyk7Ci0JbGlzdF9hZGRfdGFpbCgmZGV2LT5ELmxpc3QsICZkZXZpY2VzKTsKLQl3cml0ZV91bmxvY2tfaXJxcmVzdG9yZSgmZGV2aWNlX2xvY2ssIGZsYWdzKTsKKwkJZ290byBlcnJvcjE7CisKKwlkZXYtPmRldi5jbGFzcyA9ICZtSVNETl9jbGFzczsKKwlkZXYtPmRldi5wbGF0Zm9ybV9kYXRhID0gZGV2OworCWRldi0+ZGV2LnBhcmVudCA9IHBhcmVudDsKKwlkZXZfc2V0X2RydmRhdGEoJmRldi0+ZGV2LCBkZXYpOworCisJZXJyID0gZGV2aWNlX2FkZCgmZGV2LT5kZXYpOworCWlmIChlcnIpCisJCWdvdG8gZXJyb3IzOwogCXJldHVybiAwOworCitlcnJvcjM6CisJZGVsZXRlX3N0YWNrKGRldik7CisJcmV0dXJuIGVycjsKK2Vycm9yMToKKwlyZXR1cm4gZXJyOworCiB9CiBFWFBPUlRfU1lNQk9MKG1JU0ROX3JlZ2lzdGVyX2RldmljZSk7CiAKIHZvaWQKIG1JU0ROX3VucmVnaXN0ZXJfZGV2aWNlKHN0cnVjdCBtSVNETmRldmljZSAqZGV2KSB7Ci0JdV9sb25nCWZsYWdzOwotCiAJaWYgKGRlYnVnICYgREVCVUdfQ09SRSkKIAkJcHJpbnRrKEtFUk5fREVCVUcgIm1JU0ROX3VucmVnaXN0ZXIgJXMgJWRcbiIsCi0JCQlkZXYtPm5hbWUsIGRldi0+aWQpOwotCXdyaXRlX2xvY2tfaXJxc2F2ZSgmZGV2aWNlX2xvY2ssIGZsYWdzKTsKLQlsaXN0X2RlbCgmZGV2LT5ELmxpc3QpOwotCXdyaXRlX3VubG9ja19pcnFyZXN0b3JlKCZkZXZpY2VfbG9jaywgZmxhZ3MpOworCQkJZGV2X25hbWUoJmRldi0+ZGV2KSwgZGV2LT5pZCk7CisJLyogc3lzZnNfcmVtb3ZlX2xpbmsoJmRldi0+ZGV2LmtvYmosICJkZXZpY2UiKTsgKi8KKwlkZXZpY2VfZGVsKCZkZXYtPmRldik7CisJZGV2X3NldF9kcnZkYXRhKCZkZXYtPmRldiwgTlVMTCk7CisKIAl0ZXN0X2FuZF9jbGVhcl9iaXQoZGV2LT5pZCwgKHVfbG9uZyAqKSZkZXZpY2VfaWRzKTsKIAlkZWxldGVfc3RhY2soZGV2KTsKKwlwdXRfZGV2aWNlKCZkZXYtPmRldik7CiB9CiBFWFBPUlRfU1lNQk9MKG1JU0ROX3VucmVnaXN0ZXJfZGV2aWNlKTsKIApAQCAtMTk5LDQzICszNjEsNDUgQEAKIAogCXByaW50ayhLRVJOX0lORk8gIk1vZHVsYXIgSVNETiBjb3JlIHZlcnNpb24gJWQuJWQuJWRcbiIsCiAJCU1JU0ROX01BSk9SX1ZFUlNJT04sIE1JU0ROX01JTk9SX1ZFUlNJT04sIE1JU0ROX1JFTEVBU0UpOworCW1JU0ROX2luaXRfY2xvY2soJmRlYnVnKTsKIAltSVNETl9pbml0c3RhY2soJmRlYnVnKTsKKwllcnIgPSBjbGFzc19yZWdpc3RlcigmbUlTRE5fY2xhc3MpOworCWlmIChlcnIpCisJCWdvdG8gZXJyb3IxOwogCWVyciA9IG1JU0ROX2luaXR0aW1lcigmZGVidWcpOwogCWlmIChlcnIpCi0JCWdvdG8gZXJyb3I7CisJCWdvdG8gZXJyb3IyOwogCWVyciA9IGwxX2luaXQoJmRlYnVnKTsKLQlpZiAoZXJyKSB7Ci0JCW1JU0ROX3RpbWVyX2NsZWFudXAoKTsKLQkJZ290byBlcnJvcjsKLQl9CisJaWYgKGVycikKKwkJZ290byBlcnJvcjM7CiAJZXJyID0gSXNkbmwyX0luaXQoJmRlYnVnKTsKLQlpZiAoZXJyKSB7Ci0JCW1JU0ROX3RpbWVyX2NsZWFudXAoKTsKLQkJbDFfY2xlYW51cCgpOwotCQlnb3RvIGVycm9yOwotCX0KKwlpZiAoZXJyKQorCQlnb3RvIGVycm9yNDsKIAllcnIgPSBtaXNkbl9zb2NrX2luaXQoJmRlYnVnKTsKLQlpZiAoZXJyKSB7Ci0JCW1JU0ROX3RpbWVyX2NsZWFudXAoKTsKLQkJbDFfY2xlYW51cCgpOwotCQlJc2RubDJfY2xlYW51cCgpOwotCX0KLWVycm9yOgorCWlmIChlcnIpCisJCWdvdG8gZXJyb3I1OworCXJldHVybiAwOworCitlcnJvcjU6CisJSXNkbmwyX2NsZWFudXAoKTsKK2Vycm9yNDoKKwlsMV9jbGVhbnVwKCk7CitlcnJvcjM6CisJbUlTRE5fdGltZXJfY2xlYW51cCgpOworZXJyb3IyOgorCWNsYXNzX3VucmVnaXN0ZXIoJm1JU0ROX2NsYXNzKTsKK2Vycm9yMToKIAlyZXR1cm4gZXJyOwogfQogCiBzdGF0aWMgdm9pZCBtSVNETl9jbGVhbnVwKHZvaWQpCiB7CiAJbWlzZG5fc29ja19jbGVhbnVwKCk7Ci0JbUlTRE5fdGltZXJfY2xlYW51cCgpOwotCWwxX2NsZWFudXAoKTsKIAlJc2RubDJfY2xlYW51cCgpOworCWwxX2NsZWFudXAoKTsKKwltSVNETl90aW1lcl9jbGVhbnVwKCk7CisJY2xhc3NfdW5yZWdpc3RlcigmbUlTRE5fY2xhc3MpOwogCi0JaWYgKCFsaXN0X2VtcHR5KCZkZXZpY2VzKSkKLQkJcHJpbnRrKEtFUk5fRVJSICIlcyBkZXZpY2VzIHN0aWxsIHJlZ2lzdGVyZWRcbiIsIF9fZnVuY19fKTsKLQotCWlmICghbGlzdF9lbXB0eSgmQnByb3RvY29scykpCi0JCXByaW50ayhLRVJOX0VSUiAiJXMgQnByb3RvY29scyBzdGlsbCByZWdpc3RlcmVkXG4iLCBfX2Z1bmNfXyk7CiAJcHJpbnRrKEtFUk5fREVCVUcgIm1JU0ROY29yZSB1bmxvYWRlZFxuIik7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9tSVNETi9jb3JlLmggYi9kcml2ZXJzL2lzZG4vbUlTRE4vY29yZS5oCmluZGV4IDdkYTcyMzMuLjdhYzJmODEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9tSVNETi9jb3JlLmgKKysrIGIvZHJpdmVycy9pc2RuL21JU0ROL2NvcmUuaApAQCAtNzQsNCArNzQsNiBAQAogZXh0ZXJuIGludCAJSXNkbmwyX0luaXQodV9pbnQgKik7CiBleHRlcm4gdm9pZAlJc2RubDJfY2xlYW51cCh2b2lkKTsKIAorZXh0ZXJuIHZvaWQJbUlTRE5faW5pdF9jbG9jayh1X2ludCAqKTsKKwogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vbUlTRE4vZHNwLmggYi9kcml2ZXJzL2lzZG4vbUlTRE4vZHNwLmgKaW5kZXggNmMzZmVkNi4uOThhMzNjNThmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vbUlTRE4vZHNwLmgKKysrIGIvZHJpdmVycy9pc2RuL21JU0ROL2RzcC5oCkBAIC0xNSw2ICsxNSw3IEBACiAjZGVmaW5lIERFQlVHX0RTUF9UT05FCQkweDAwMjAKICNkZWZpbmUgREVCVUdfRFNQX0JMT1dGSVNICTB4MDA0MAogI2RlZmluZSBERUJVR19EU1BfREVMQVkJCTB4MDEwMAorI2RlZmluZSBERUJVR19EU1BfQ0xPQ0sJCTB4MDIwMAogI2RlZmluZSBERUJVR19EU1BfRFRNRkNPRUZGCTB4ODAwMCAvKiBoZWF2eSBvdXRwdXQgKi8KIAogLyogb3B0aW9ucyBtYXkgYmU6CkBAIC0xOTgsNiArMTk5LDcgQEAKIAkvKiBoYXJkd2FyZSBzdHVmZiAqLwogCXN0cnVjdCBkc3BfZmVhdHVyZXMgZmVhdHVyZXM7CiAJaW50CQlmZWF0dXJlc19yeF9vZmY7IC8qIHNldCBpZiByeF9vZmYgaXMgZmVhdHVyZWQgKi8KKwlpbnQJCWZlYXR1cmVzX2ZpbGxfZW1wdHk7IC8qIHNldCBpZiBmaWxsX2VtcHR5IGlzIGZlYXR1cmVkICovCiAJaW50CQlwY21fc2xvdF9yeDsgLyogY3VycmVudCBQQ00gc2xvdCAob3IgLTEpICovCiAJaW50CQlwY21fYmFua19yeDsKIAlpbnQJCXBjbV9zbG90X3R4OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL21JU0ROL2RzcF9jbXguYyBiL2RyaXZlcnMvaXNkbi9tSVNETi9kc3BfY214LmMKaW5kZXggYzg4NDUxMS4uNThjNDNlNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL21JU0ROL2RzcF9jbXguYworKysgYi9kcml2ZXJzL2lzZG4vbUlTRE4vZHNwX2NteC5jCkBAIC0xMzcsNiArMTM3LDcgQEAKIC8qICNkZWZpbmUgQ01YX0NPTkZfREVCVUcgKi8KIAogLyojZGVmaW5lIENNWF9ERUJVRyAqIG1hc3NpdmUgcmVhZC93cml0ZSBwb2ludGVyIG91dHB1dCAqLworLyojZGVmaW5lIENNWF9ERUxBWV9ERUJVRyAqIGdpdmVzIHJ4LWJ1ZmZlciBkZWxheSBvdmVydmlldyAqLwogLyojZGVmaW5lIENNWF9UWF9ERUJVRyAqIG1hc3NpdmUgcmVhZC93cml0ZSBvbiB0eC1idWZmZXIgd2l0aCBjb250ZW50ICovCiAKIHN0YXRpYyBpbmxpbmUgaW50CkBAIC03NDQsMTEgKzc0NSwxMSBAQAogCQkJCQlpZiAoZHNwLT5wY21fc2xvdF9yeCA+PSAwICYmCiAJCQkJCSAgICBkc3AtPnBjbV9zbG90X3J4IDwKIAkJCQkJICAgIHNpemVvZihmcmVlc2xvdHMpKQotCQkJCQkJZnJlZXNsb3RzW2RzcC0+cGNtX3Nsb3RfdHhdID0gMDsKKwkJCQkJCWZyZWVzbG90c1tkc3AtPnBjbV9zbG90X3J4XSA9IDA7CiAJCQkJCWlmIChkc3AtPnBjbV9zbG90X3R4ID49IDAgJiYKIAkJCQkJICAgIGRzcC0+cGNtX3Nsb3RfdHggPAogCQkJCQkgICAgc2l6ZW9mKGZyZWVzbG90cykpCi0JCQkJCQlmcmVlc2xvdHNbZHNwLT5wY21fc2xvdF9yeF0gPSAwOworCQkJCQkJZnJlZXNsb3RzW2RzcC0+cGNtX3Nsb3RfdHhdID0gMDsKIAkJCQl9CiAJCQl9CiAJCQlpID0gMDsKQEAgLTgzNiwxMSArODM3LDExIEBACiAJCQkJCWlmIChkc3AtPnBjbV9zbG90X3J4ID49IDAgJiYKIAkJCQkJICAgIGRzcC0+cGNtX3Nsb3RfcnggPAogCQkJCQkgICAgc2l6ZW9mKGZyZWVzbG90cykpCi0JCQkJCQlmcmVlc2xvdHNbZHNwLT5wY21fc2xvdF90eF0gPSAwOworCQkJCQkJZnJlZXNsb3RzW2RzcC0+cGNtX3Nsb3RfcnhdID0gMDsKIAkJCQkJaWYgKGRzcC0+cGNtX3Nsb3RfdHggPj0gMCAmJgogCQkJCQkgICAgZHNwLT5wY21fc2xvdF90eCA8CiAJCQkJCSAgICBzaXplb2YoZnJlZXNsb3RzKSkKLQkJCQkJCWZyZWVzbG90c1tkc3AtPnBjbV9zbG90X3J4XSA9IDA7CisJCQkJCQlmcmVlc2xvdHNbZHNwLT5wY21fc2xvdF90eF0gPSAwOwogCQkJCX0KIAkJCX0KIAkJCWkxID0gMDsKQEAgLTkyNiwxMCArOTI3LDYgQEAKIAogCS8qIGZvciBtb3JlIHRoYW4gdHdvIG1lbWJlcnMuLiAqLwogCi0JLyogaW4gY2FzZSBvZiBoZGxjLCB3ZSBjaGFuZ2UgdG8gc29mdHdhcmUgKi8KLQlpZiAoZHNwLT5oZGxjKQotCQlnb3RvIGNvbmZfc29mdHdhcmU7Ci0KIAkvKiBpZiBhbGwgbWVtYmVycyBhbHJlYWR5IGhhdmUgdGhlIHNhbWUgY29uZmVyZW5jZSAqLwogCWlmIChhbGxfY29uZikKIAkJcmV0dXJuOwpAQCAtOTQwLDYgKzkzNyw5IEBACiAJaWYgKGN1cnJlbnRfY29uZiA+PSAwKSB7CiBqb2luX21lbWJlcnM6CiAJCWxpc3RfZm9yX2VhY2hfZW50cnkobWVtYmVyLCAmY29uZi0+bWxpc3QsIGxpc3QpIHsKKwkJCS8qIGluIGNhc2Ugb2YgaGRsYywgY2hhbmdlIHRvIHNvZnR3YXJlICovCisJCQlpZiAobWVtYmVyLT5kc3AtPmhkbGMpCisJCQkJZ290byBjb25mX3NvZnR3YXJlOwogCQkJLyogam9pbiB0byBjdXJyZW50IGNvbmZlcmVuY2UgKi8KIAkJCWlmIChtZW1iZXItPmRzcC0+aGZjX2NvbmYgPT0gY3VycmVudF9jb25mKQogCQkJCWNvbnRpbnVlOwpAQCAtMTEzNSw2ICsxMTM1LDI1IEBACiAJcmV0dXJuIDA7CiB9CiAKKyNpZmRlZiBDTVhfREVMQVlfREVCVUcKK2ludCBkZWxheWNvdW50Oworc3RhdGljIHZvaWQKK3Nob3dkZWxheShzdHJ1Y3QgZHNwICpkc3AsIGludCBzYW1wbGVzLCBpbnQgZGVsYXkpCit7CisJY2hhciBiYXJbXSA9ICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwiOworCWludCBzZGVsYXk7CisKKwlkZWxheWNvdW50ICs9IHNhbXBsZXM7CisJaWYgKGRlbGF5Y291bnQgPCA4MDAwKQorCQlyZXR1cm47CisJZGVsYXljb3VudCA9IDA7CisKKwlzZGVsYXkgPSBkZWxheSAqIDUwIC8gKGRzcF9wb2xsIDw8IDIpOworCisJcHJpbnRrKEtFUk5fREVCVUcgIkRFTEFZICglcykgJTNkID4lc1xuIiwgZHNwLT5uYW1lLCBkZWxheSwKKwkJc2RlbGF5ID4gNTAgPyAiLi4uIiA6IGJhciArIDUwIC0gc2RlbGF5KTsKK30KKyNlbmRpZgogCiAvKgogICogYXVkaW8gZGF0YSBpcyByZWNlaXZlZCBmcm9tIGNhcmQKQEAgLTExNjgsMTEgKzExODcsMTggQEAKIAkJZHNwLT5yeF9pbml0ID0gMDsKIAkJaWYgKGRzcC0+ZmVhdHVyZXMudW5vcmRlcmVkKSB7CiAJCQlkc3AtPnJ4X1IgPSAoaGgtPmlkICYgQ01YX0JVRkZfTUFTSyk7Ci0JCQlkc3AtPnJ4X1cgPSAoZHNwLT5yeF9SICsgZHNwLT5jbXhfZGVsYXkpCi0JCQkJJiBDTVhfQlVGRl9NQVNLOworCQkJaWYgKGRzcC0+Y214X2RlbGF5KQorCQkJCWRzcC0+cnhfVyA9IChkc3AtPnJ4X1IgKyBkc3AtPmNteF9kZWxheSkKKwkJCQkJJiBDTVhfQlVGRl9NQVNLOworCQkJZWxzZQorCQkJCWRzcC0+cnhfVyA9IChkc3AtPnJ4X1IgKyAoZHNwX3BvbGwgPj4gMSkpCisJCQkJCSYgQ01YX0JVRkZfTUFTSzsKIAkJfSBlbHNlIHsKIAkJCWRzcC0+cnhfUiA9IDA7Ci0JCQlkc3AtPnJ4X1cgPSBkc3AtPmNteF9kZWxheTsKKwkJCWlmIChkc3AtPmNteF9kZWxheSkKKwkJCQlkc3AtPnJ4X1cgPSBkc3AtPmNteF9kZWxheTsKKwkJCWVsc2UKKwkJCQlkc3AtPnJ4X1cgPSBkc3BfcG9sbCA+PiAxOwogCQl9CiAJfQogCS8qIGlmIGZyYW1lIGNvbnRhaW5zIHRpbWUgY29kZSwgd3JpdGUgZGlyZWN0bHkgKi8KQEAgLTExODUsMTkgKzEyMTEsMjUgQEAKIAkgKiB3ZSBzZXQgb3VyIG5ldyByZWFkIHBvaW50ZXIsIGFuZCB3cml0ZSBzaWxlbmNlIHRvIGJ1ZmZlcgogCSAqLwogCWlmICgoKGRzcC0+cnhfVy1kc3AtPnJ4X1IpICYgQ01YX0JVRkZfTUFTSykgPj0gQ01YX0JVRkZfSEFMRikgewotCQlpZiAoZHNwX2RlYnVnICYgREVCVUdfRFNQX0NNWCkKKwkJaWYgKGRzcF9kZWJ1ZyAmIERFQlVHX0RTUF9DTE9DSykKIAkJCXByaW50ayhLRVJOX0RFQlVHCiAJCQkgICAgImNteF9yZWNlaXZlKGRzcD0lbHgpOiBVTkRFUlJVTiAob3Igb3ZlcnJ1biB0aGUgIgogCQkJICAgICJtYXhpbXVtIGRlbGF5KSwgYWRqdXN0aW5nIHJlYWQgcG9pbnRlciEgIgogCQkJICAgICIoaW5zdCAlcylcbiIsICh1X2xvbmcpZHNwLCBkc3AtPm5hbWUpOwotCQkvKiBmbHVzaCBidWZmZXIgKi8KKwkJLyogZmx1c2ggcnggYnVmZmVyIGFuZCBzZXQgZGVsYXkgdG8gZHNwX3BvbGwgLyAyICovCiAJCWlmIChkc3AtPmZlYXR1cmVzLnVub3JkZXJlZCkgewogCQkJZHNwLT5yeF9SID0gKGhoLT5pZCAmIENNWF9CVUZGX01BU0spOwotCQkJZHNwLT5yeF9XID0gKGRzcC0+cnhfUiArIGRzcC0+Y214X2RlbGF5KQotCQkJCSYgQ01YX0JVRkZfTUFTSzsKKwkJCWlmIChkc3AtPmNteF9kZWxheSkKKwkJCQlkc3AtPnJ4X1cgPSAoZHNwLT5yeF9SICsgZHNwLT5jbXhfZGVsYXkpCisJCQkJCSYgQ01YX0JVRkZfTUFTSzsKKwkJCQlkc3AtPnJ4X1cgPSAoZHNwLT5yeF9SICsgKGRzcF9wb2xsID4+IDEpKQorCQkJCQkmIENNWF9CVUZGX01BU0s7CiAJCX0gZWxzZSB7CiAJCQlkc3AtPnJ4X1IgPSAwOwotCQkJZHNwLT5yeF9XID0gZHNwLT5jbXhfZGVsYXk7CisJCQlpZiAoZHNwLT5jbXhfZGVsYXkpCisJCQkJZHNwLT5yeF9XID0gZHNwLT5jbXhfZGVsYXk7CisJCQllbHNlCisJCQkJZHNwLT5yeF9XID0gZHNwX3BvbGwgPj4gMTsKIAkJfQogCQltZW1zZXQoZHNwLT5yeF9idWZmLCBkc3Bfc2lsZW5jZSwgc2l6ZW9mKGRzcC0+cnhfYnVmZikpOwogCX0KQEAgLTEyMDUsNyArMTIzNyw3IEBACiAJaWYgKGRzcC0+Y214X2RlbGF5KQogCQlpZiAoKChkc3AtPnJ4X1cgLSBkc3AtPnJ4X1IpICYgQ01YX0JVRkZfTUFTSykgPj0KIAkJICAgIChkc3AtPmNteF9kZWxheSA8PCAxKSkgewotCQkJaWYgKGRzcF9kZWJ1ZyAmIERFQlVHX0RTUF9DTVgpCisJCQlpZiAoZHNwX2RlYnVnICYgREVCVUdfRFNQX0NMT0NLKQogCQkJCXByaW50ayhLRVJOX0RFQlVHCiAJCQkJICAgICJjbXhfcmVjZWl2ZShkc3A9JWx4KTogT1ZFUlJVTiAoYmVjYXVzZSAiCiAJCQkJICAgICJ0d2ljZSB0aGUgZGVsYXkgaXMgcmVhY2hlZCksIGFkanVzdGluZyAiCkBAIC0xMjQzLDYgKzEyNzUsOSBAQAogCiAJLyogaW5jcmVhc2Ugd3JpdGUtcG9pbnRlciAqLwogCWRzcC0+cnhfVyA9ICgoZHNwLT5yeF9XK2xlbikgJiBDTVhfQlVGRl9NQVNLKTsKKyNpZmRlZiBDTVhfREVMQVlfREVCVUcKKwlzaG93ZGVsYXkoZHNwLCBsZW4sIChkc3AtPnJ4X1ctZHNwLT5yeF9SKSAmIENNWF9CVUZGX01BU0spOworI2VuZGlmCiB9CiAKIApAQCAtMTM2MCw4ICsxMzk1LDEyIEBACiAJCQkJdCA9ICh0KzEpICYgQ01YX0JVRkZfTUFTSzsKIAkJCQlyID0gKHIrMSkgJiBDTVhfQlVGRl9NQVNLOwogCQkJfQotCQkJaWYgKHIgIT0gcnIpCisJCQlpZiAociAhPSBycikgeworCQkJCWlmIChkc3BfZGVidWcgJiBERUJVR19EU1BfQ0xPQ0spCisJCQkJCXByaW50ayhLRVJOX0RFQlVHICIlczogUlggZW1wdHlcbiIsCisJCQkJCQlfX2Z1bmNfXyk7CiAJCQkJbWVtc2V0KGQsIGRzcF9zaWxlbmNlLCAocnItcikmQ01YX0JVRkZfTUFTSyk7CisJCQl9CiAJCS8qIC0+IGlmIGVjaG8gaXMgZW5hYmxlZCAqLwogCQl9IGVsc2UgewogCQkJLyoKQEAgLTE1NDAsMTMgKzE1NzksMTEgQEAKIAlzY2hlZHVsZV93b3JrKCZkc3AtPndvcmtxKTsKIH0KIAotc3RhdGljIHUzMglzYW1wbGVjb3VudDsKK3N0YXRpYyB1MzIJaml0dGVyY291bnQ7IC8qIGNvdW50ZXIgZm9yIGppdHRlciBjaGVjayAqLwogc3RydWN0IHRpbWVyX2xpc3QgZHNwX3NwbF90bDsKIHUzMglkc3Bfc3BsX2ppZmZpZXM7IC8qIGNhbGN1bGF0ZSB0aGUgbmV4dCB0aW1lIHRvIGZpcmUgKi8KLSNpZmRlZiBVTlVTRUQKLXN0YXRpYyB1MzIJZHNwX3N0YXJ0X2ppZmZpZXM7IC8qIGppZmZpZXMgYXQgdGhlIHRpbWUsIHRoZSBjYWxjdWxhdGlvbiBiZWdpbnMgKi8KLSNlbmRpZiAvKiBVTlVTRUQgKi8KLXN0YXRpYyBzdHJ1Y3QgdGltZXZhbCBkc3Bfc3RhcnRfdHY7IC8qIHRpbWUgYXQgc3RhcnQgb2YgY2FsY3VsYXRpb24gKi8KK3N0YXRpYyB1MTYJZHNwX2NvdW50OyAvKiBsYXN0IHNhbXBsZSBjb3VudCAqLworc3RhdGljIGludAlkc3BfY291bnRfdmFsaWQgOyAvKiBpZiB3ZSBoYXZlIGxhc3Qgc2FtcGxlIGNvdW50ICovCiAKIHZvaWQKIGRzcF9jbXhfc2VuZCh2b2lkICphcmcpCkBAIC0xNTYwLDM4ICsxNTk3LDMyIEBACiAJaW50IHIsIHJyOwogCWludCBqaXR0ZXJjaGVjayA9IDAsIGRlbGF5LCBpOwogCXVfbG9uZyBmbGFnczsKLQlzdHJ1Y3QgdGltZXZhbCB0djsKLQl1MzIgZWxhcHNlZDsKLQlzMTYgbGVuZ3RoOworCXUxNiBsZW5ndGgsIGNvdW50OwogCiAJLyogbG9jayAqLwogCXNwaW5fbG9ja19pcnFzYXZlKCZkc3BfbG9jaywgZmxhZ3MpOwogCi0JaWYgKCFkc3Bfc3RhcnRfdHYudHZfc2VjKSB7Ci0JCWRvX2dldHRpbWVvZmRheSgmZHNwX3N0YXJ0X3R2KTsKKwlpZiAoIWRzcF9jb3VudF92YWxpZCkgeworCQlkc3BfY291bnQgPSBtSVNETl9jbG9ja19nZXQoKTsKIAkJbGVuZ3RoID0gZHNwX3BvbGw7CisJCWRzcF9jb3VudF92YWxpZCA9IDE7CiAJfSBlbHNlIHsKLQkJZG9fZ2V0dGltZW9mZGF5KCZ0dik7Ci0JCWVsYXBzZWQgPSAoKHR2LnR2X3NlYyAtIGRzcF9zdGFydF90di50dl9zZWMpICogODAwMCkKLQkJICAgICsgKChzMzIpKHR2LnR2X3VzZWMgLyAxMjUpIC0gKGRzcF9zdGFydF90di50dl91c2VjIC8gMTI1KSk7Ci0JCWRzcF9zdGFydF90di50dl9zZWMgPSB0di50dl9zZWM7Ci0JCWRzcF9zdGFydF90di50dl91c2VjID0gdHYudHZfdXNlYzsKLQkJbGVuZ3RoID0gZWxhcHNlZDsKKwkJY291bnQgPSBtSVNETl9jbG9ja19nZXQoKTsKKwkJbGVuZ3RoID0gY291bnQgLSBkc3BfY291bnQ7CisJCWRzcF9jb3VudCA9IGNvdW50OwogCX0KIAlpZiAobGVuZ3RoID4gTUFYX1BPTEwgKyAxMDApCiAJCWxlbmd0aCA9IE1BWF9QT0xMICsgMTAwOwotLyogcHJpbnRrKEtFUk5fREVCVUcgImxlbj0lZCBkc3BfY291bnQ9MHgleC4lMDR4IGRzcF9wb2xsX2RpZmY9MHgleC4lMDR4XG4iLAotIGxlbmd0aCwgZHNwX2NvdW50ID4+IDE2LCBkc3BfY291bnQgJiAweGZmZmYsIGRzcF9wb2xsX2RpZmYgPj4gMTYsCi0gZHNwX3BvbGxfZGlmZiAmIDB4ZmZmZik7Ci0gKi8KKwkvKiBwcmludGsoS0VSTl9ERUJVRyAibGVuPSVkIGRzcF9jb3VudD0weCV4XG4iLCBsZW5ndGgsIGRzcF9jb3VudCk7ICovCiAKIAkvKgotCSAqIGNoZWNrIGlmIGppdHRlciBuZWVkcyB0byBiZSBjaGVja2VkCi0JICogKHRoaXMgaXMgYWJvdXQgZXZlcnkgc2Vjb25kID0gODE5MiBzYW1wbGVzKQorCSAqIGNoZWNrIGlmIGppdHRlciBuZWVkcyB0byBiZSBjaGVja2VkICh0aGlzIGlzIGV2ZXJ5IHNlY29uZCkKIAkgKi8KLQlzYW1wbGVjb3VudCArPSBsZW5ndGg7Ci0JaWYgKChzYW1wbGVjb3VudCAmIDgxOTEpIDwgbGVuZ3RoKQorCWppdHRlcmNvdW50ICs9IGxlbmd0aDsKKwlpZiAoaml0dGVyY291bnQgPj0gODAwMCkgeworCQlqaXR0ZXJjb3VudCAtPSA4MDAwOwogCQlqaXR0ZXJjaGVjayA9IDE7CisJfQogCiAJLyogbG9vcCBhbGwgbWVtYmVycyB0aGF0IGRvIG5vdCByZXF1aXJlIGNvbmZlcmVuY2UgbWl4aW5nICovCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShkc3AsICZkc3BfaWxpc3QsIGxpc3QpIHsKQEAgLTE3MDQsMTcgKzE3MzUsMTkgQEAKIAkJCX0KIAkJCS8qCiAJCQkgKiByZW1vdmUgcnhfZGVsYXkgb25seSBpZiB3ZSBoYXZlIGRlbGF5IEFORCB3ZQotCQkJICogaGF2ZSBub3QgcHJlc2V0IGNteF9kZWxheQorCQkJICogaGF2ZSBub3QgcHJlc2V0IGNteF9kZWxheSBBTkQKKwkJCSAqIHRoZSBkZWxheSBpcyBncmVhdGVyIGRzcF9wb2xsCiAJCQkgKi8KLQkJCWlmIChkZWxheSAmJiAhZHNwLT5jbXhfZGVsYXkpIHsKLQkJCQlpZiAoZHNwX2RlYnVnICYgREVCVUdfRFNQX0NNWCkKKwkJCWlmIChkZWxheSA+IGRzcF9wb2xsICYmICFkc3AtPmNteF9kZWxheSkgeworCQkJCWlmIChkc3BfZGVidWcgJiBERUJVR19EU1BfQ0xPQ0spCiAJCQkJCXByaW50ayhLRVJOX0RFQlVHCiAJCQkJCSAgICAiJXMgbG93ZXN0IHJ4X2RlbGF5IG9mICVkIGJ5dGVzIGZvciIKIAkJCQkJICAgICIgZHNwICVzIGFyZSBub3cgcmVtb3ZlZC5cbiIsCiAJCQkJCSAgICBfX2Z1bmNfXywgZGVsYXksCiAJCQkJCSAgICBkc3AtPm5hbWUpOwogCQkJCXIgPSBkc3AtPnJ4X1I7Ci0JCQkJcnIgPSAociArIGRlbGF5KSAmIENNWF9CVUZGX01BU0s7CisJCQkJcnIgPSAociArIGRlbGF5IC0gKGRzcF9wb2xsID4+IDEpKQorCQkJCQkmIENNWF9CVUZGX01BU0s7CiAJCQkJLyogZGVsZXRlIHJ4LWRhdGEgKi8KIAkJCQl3aGlsZSAociAhPSBycikgewogCQkJCQlwW3JdID0gZHNwX3NpbGVuY2U7CkBAIC0xNzM2LDE1ICsxNzY5LDE2IEBACiAJCQkgKiByZW1vdmUgZGVsYXkgb25seSBpZiB3ZSBoYXZlIGRlbGF5IEFORCB3ZQogCQkJICogaGF2ZSBlbmFibGVkIHR4X2Rlaml0dGVyCiAJCQkgKi8KLQkJCWlmIChkZWxheSAmJiBkc3AtPnR4X2Rlaml0dGVyKSB7Ci0JCQkJaWYgKGRzcF9kZWJ1ZyAmIERFQlVHX0RTUF9DTVgpCisJCQlpZiAoZGVsYXkgPiBkc3BfcG9sbCAmJiBkc3AtPnR4X2Rlaml0dGVyKSB7CisJCQkJaWYgKGRzcF9kZWJ1ZyAmIERFQlVHX0RTUF9DTE9DSykKIAkJCQkJcHJpbnRrKEtFUk5fREVCVUcKIAkJCQkJICAgICIlcyBsb3dlc3QgdHhfZGVsYXkgb2YgJWQgYnl0ZXMgZm9yIgogCQkJCQkgICAgIiBkc3AgJXMgYXJlIG5vdyByZW1vdmVkLlxuIiwKIAkJCQkJICAgIF9fZnVuY19fLCBkZWxheSwKIAkJCQkJICAgIGRzcC0+bmFtZSk7CiAJCQkJciA9IGRzcC0+dHhfUjsKLQkJCQlyciA9IChyICsgZGVsYXkpICYgQ01YX0JVRkZfTUFTSzsKKwkJCQlyciA9IChyICsgZGVsYXkgLSAoZHNwX3BvbGwgPj4gMSkpCisJCQkJCSYgQ01YX0JVRkZfTUFTSzsKIAkJCQkvKiBkZWxldGUgdHgtZGF0YSAqLwogCQkJCXdoaWxlIChyICE9IHJyKSB7CiAJCQkJCXFbcl0gPSBkc3Bfc2lsZW5jZTsKQEAgLTE3OTcsMTQgKzE4MzEsMTYgQEAKIAl3dyA9IGRzcC0+dHhfUjsKIAlwID0gZHNwLT50eF9idWZmOwogCWQgPSBza2ItPmRhdGE7Ci0Jc3BhY2UgPSB3dy13OwotCWlmIChzcGFjZSA8PSAwKQotCQlzcGFjZSArPSBDTVhfQlVGRl9TSVpFOworCXNwYWNlID0gKHd3IC0gdyAtIDEpICYgQ01YX0JVRkZfTUFTSzsKIAkvKiB3cml0ZS1wb2ludGVyIHNob3VsZCBub3Qgb3ZlcnJ1biBub3IgcmVhY2ggcmVhZCBwb2ludGVyICovCi0JaWYgKHNwYWNlLTEgPCBza2ItPmxlbikKKwlpZiAoc3BhY2UgPCBza2ItPmxlbikgewogCQkvKiB3cml0ZSB0byB0aGUgc3BhY2Ugd2UgaGF2ZSBsZWZ0ICovCi0JCXd3ID0gKHd3IC0gMSkgJiBDTVhfQlVGRl9NQVNLOwotCWVsc2UKKwkJd3cgPSAod3cgLSAxKSAmIENNWF9CVUZGX01BU0s7IC8qIGVuZCBvbmUgYnl0ZSBwcmlvciB0eF9SICovCisJCWlmIChkc3BfZGVidWcgJiBERUJVR19EU1BfQ0xPQ0spCisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IFRYIG92ZXJmbG93IHNwYWNlPSVkIHNrYi0+bGVuPSIKKwkJCSAgICAiJWQsIHc9MHglMDR4LCB3dz0weCUwNHhcbiIsIF9fZnVuY19fLCBzcGFjZSwKKwkJCSAgICBza2ItPmxlbiwgdywgd3cpOworCX0gZWxzZQogCQkvKiB3cml0ZSB1bnRpbCBhbGwgYnl0ZSBhcmUgY29waWVkICovCiAJCXd3ID0gKHcgKyBza2ItPmxlbikgJiBDTVhfQlVGRl9NQVNLOwogCWRzcC0+dHhfVyA9IHd3OwpAQCAtMTg1Nyw3ICsxODkzLDcgQEAKIAkJLyogaW4gY2FzZSBvZiBoYXJkd2FyZSAoZWNobykgKi8KIAkJaWYgKGRzcC0+cGNtX3Nsb3RfdHggPj0gMCkKIAkJCXJldHVybjsKLQkJaWYgKGRzcC0+ZWNobykKKwkJaWYgKGRzcC0+ZWNobykgewogCQkJbnNrYiA9IHNrYl9jbG9uZShza2IsIEdGUF9BVE9NSUMpOwogCQkJaWYgKG5za2IpIHsKIAkJCQloaCA9IG1JU0ROX0hFQURfUChuc2tiKTsKQEAgLTE4NjYsNiArMTkwMiw3IEBACiAJCQkJc2tiX3F1ZXVlX3RhaWwoJmRzcC0+c2VuZHEsIG5za2IpOwogCQkJCXNjaGVkdWxlX3dvcmsoJmRzcC0+d29ya3EpOwogCQkJfQorCQl9CiAJCXJldHVybjsKIAl9CiAJLyogaW4gY2FzZSBvZiBoYXJkd2FyZSBjb25mZXJlbmNlICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vbUlTRE4vZHNwX2NvcmUuYyBiL2RyaXZlcnMvaXNkbi9tSVNETi9kc3BfY29yZS5jCmluZGV4IDFkYzIxZDguLjMwODMzMzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9tSVNETi9kc3BfY29yZS5jCisrKyBiL2RyaXZlcnMvaXNkbi9tSVNETi9kc3BfY29yZS5jCkBAIC0xOTEsNiArMTkxLDggQEAKIAlzdHJ1Y3QgbUlTRE5fY3RybF9yZXEJY3E7CiAJaW50IHJ4X29mZiA9IDE7CiAKKwltZW1zZXQoJmNxLCAwLCBzaXplb2YoY3EpKTsKKwogCWlmICghZHNwLT5mZWF0dXJlc19yeF9vZmYpCiAJCXJldHVybjsKIApAQCAtMjQ5LDYgKzI1MSwzMiBAQAogCX0KIH0KIAorLyogZW5hYmxlICJmaWxsIGVtcHR5IiBmZWF0dXJlICovCitzdGF0aWMgdm9pZAorZHNwX2ZpbGxfZW1wdHkoc3RydWN0IGRzcCAqZHNwKQoreworCXN0cnVjdCBtSVNETl9jdHJsX3JlcQljcTsKKworCW1lbXNldCgmY3EsIDAsIHNpemVvZihjcSkpOworCisJaWYgKCFkc3AtPmNoLnBlZXIpIHsKKwkJaWYgKGRzcF9kZWJ1ZyAmIERFQlVHX0RTUF9DT1JFKQorCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBubyBwZWVyLCBubyBmaWxsX2VtcHR5XG4iLAorCQkJCV9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKwljcS5vcCA9IE1JU0ROX0NUUkxfRklMTF9FTVBUWTsKKwljcS5wMSA9IDE7CisJaWYgKGRzcC0+Y2gucGVlci0+Y3RybChkc3AtPmNoLnBlZXIsIENPTlRST0xfQ0hBTk5FTCwgJmNxKSkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IENPTlRST0xfQ0hBTk5FTCBmYWlsZWRcbiIsCisJCQlfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisJaWYgKGRzcF9kZWJ1ZyAmIERFQlVHX0RTUF9DT1JFKQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6ICVzIHNldCBmaWxsX2VtcHR5ID0gMVxuIiwKKwkJCV9fZnVuY19fLCBkc3AtPm5hbWUpOworfQorCiBzdGF0aWMgaW50CiBkc3BfY29udHJvbF9yZXEoc3RydWN0IGRzcCAqZHNwLCBzdHJ1Y3QgbUlTRE5oZWFkICpoaCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKQEAgLTI3Myw4ICszMDEsOSBAQAogCQlpZiAoZHNwX2RlYnVnICYgREVCVUdfRFNQX0NPUkUpCiAJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHN0YXJ0IGR0bWZcbiIsIF9fZnVuY19fKTsKIAkJaWYgKGxlbiA9PSBzaXplb2YoaW50KSkgewotCQkJcHJpbnRrKEtFUk5fTk9USUNFICJjaGFuZ2luZyBEVE1GIFRocmVzaG9sZCAiCi0JCQkJInRvICVkXG4iLCAqKChpbnQgKilkYXRhKSk7CisJCQlpZiAoZHNwX2RlYnVnICYgREVCVUdfRFNQX0NPUkUpCisJCQkJcHJpbnRrKEtFUk5fTk9USUNFICJjaGFuZ2luZyBEVE1GIFRocmVzaG9sZCAiCisJCQkJCSJ0byAlZFxuIiwgKigoaW50ICopZGF0YSkpOwogCQkJZHNwLT5kdG1mLnRyZXNob2xkID0gKCooaW50ICopZGF0YSkgKiAxMDAwMDsKIAkJfQogCQkvKiBpbml0IGdvZXJ0emVsICovCkBAIC01OTMsOCArNjIyLDYgQEAKIAlzdHJ1Y3QgZHNwCQkqZHNwID0gY29udGFpbmVyX29mKGNoLCBzdHJ1Y3QgZHNwLCBjaCk7CiAJc3RydWN0IG1JU0ROX2N0cmxfcmVxCWNxOwogCi0JaWYgKGRzcF9vcHRpb25zICYgRFNQX09QVF9OT0hBUkRXQVJFKQotCQlyZXR1cm47CiAJaWYgKCFjaC0+cGVlcikgewogCQlpZiAoZHNwX2RlYnVnICYgREVCVUdfRFNQX0NPUkUpCiAJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IG5vIHBlZXIsIG5vIGZlYXR1cmVzXG4iLApAQCAtNjEwLDYgKzYzNywxMCBAQAogCX0KIAlpZiAoY3Eub3AgJiBNSVNETl9DVFJMX1JYX09GRikKIAkJZHNwLT5mZWF0dXJlc19yeF9vZmYgPSAxOworCWlmIChjcS5vcCAmIE1JU0ROX0NUUkxfRklMTF9FTVBUWSkKKwkJZHNwLT5mZWF0dXJlc19maWxsX2VtcHR5ID0gMTsKKwlpZiAoZHNwX29wdGlvbnMgJiBEU1BfT1BUX05PSEFSRFdBUkUpCisJCXJldHVybjsKIAlpZiAoKGNxLm9wICYgTUlTRE5fQ1RSTF9IV19GRUFUVVJFU19PUCkpIHsKIAkJY3Eub3AgPSBNSVNETl9DVFJMX0hXX0ZFQVRVUkVTOwogCQkqKCh1X2xvbmcgKikmY3EucDEpID0gKHVfbG9uZykmZHNwLT5mZWF0dXJlczsKQEAgLTgzNywxMSArODY4LDE0IEBACiAJCX0KIAkJaWYgKGRzcC0+aGRsYykgewogCQkJLyogaGRsYyAqLwotCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmRzcF9sb2NrLCBmbGFncyk7Ci0JCQlpZiAoZHNwLT5iX2FjdGl2ZSkgewotCQkJCXNrYl9xdWV1ZV90YWlsKCZkc3AtPnNlbmRxLCBza2IpOwotCQkJCXNjaGVkdWxlX3dvcmsoJmRzcC0+d29ya3EpOworCQkJaWYgKCFkc3AtPmJfYWN0aXZlKSB7CisJCQkJcmV0ID0gLUVJTzsKKwkJCQlicmVhazsKIAkJCX0KKwkJCWhoLT5wcmltID0gUEhfREFUQV9SRVE7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmZHNwX2xvY2ssIGZsYWdzKTsKKwkJCXNrYl9xdWV1ZV90YWlsKCZkc3AtPnNlbmRxLCBza2IpOworCQkJc2NoZWR1bGVfd29yaygmZHNwLT53b3JrcSk7CiAJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkc3BfbG9jaywgZmxhZ3MpOwogCQkJcmV0dXJuIDA7CiAJCX0KQEAgLTg2NSw2ICs4OTksOSBAQAogCQlpZiAoZHNwLT5kdG1mLmhhcmR3YXJlIHx8IGRzcC0+ZHRtZi5zb2Z0d2FyZSkKIAkJCWRzcF9kdG1mX2dvZXJ0emVsX2luaXQoZHNwKTsKIAkJZ2V0X2ZlYXR1cmVzKGNoKTsKKwkJLyogZW5hYmxlIGZpbGxfZW1wdHkgZmVhdHVyZSAqLworCQlpZiAoZHNwLT5mZWF0dXJlc19maWxsX2VtcHR5KQorCQkJZHNwX2ZpbGxfZW1wdHkoZHNwKTsKIAkJLyogc2VuZCBwaF9hY3RpdmF0ZSAqLwogCQloaC0+cHJpbSA9IFBIX0FDVElWQVRFX1JFUTsKIAkJaWYgKGNoLT5wZWVyKQpAQCAtMTEwNSw3ICsxMTQyLDcgQEAKIAl9IGVsc2UgewogCQlwb2xsID0gODsKIAkJd2hpbGUgKHBvbGwgPD0gTUFYX1BPTEwpIHsKLQkJCXRpY3MgPSBwb2xsICogSFogLyA4MDAwOworCQkJdGljcyA9IChwb2xsICogSFopIC8gODAwMDsKIAkJCWlmICh0aWNzICogODAwMCA9PSBwb2xsICogSFopIHsKIAkJCQlkc3BfdGljcyA9IHRpY3M7CiAJCQkJZHNwX3BvbGwgPSBwb2xsOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL21JU0ROL2RzcF9waXBlbGluZS5jIGIvZHJpdmVycy9pc2RuL21JU0ROL2RzcF9waXBlbGluZS5jCmluZGV4IDgzNjM5YmUuLjE4Y2Y4N2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9tSVNETi9kc3BfcGlwZWxpbmUuYworKysgYi9kcml2ZXJzL2lzZG4vbUlTRE4vZHNwX3BpcGVsaW5lLmMKQEAgLTc1LDYgKzc1LDE1IEBACiAJX19BVFRSKGFyZ3MsIDA0NDQsIGF0dHJfc2hvd19hcmdzLCBOVUxMKSwKIH07CiAKK3N0YXRpYyB2b2lkCittSVNETl9kc3BfZGV2X3JlbGVhc2Uoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBkc3BfZWxlbWVudF9lbnRyeSAqZW50cnkgPQorCQljb250YWluZXJfb2YoZGV2LCBzdHJ1Y3QgZHNwX2VsZW1lbnRfZW50cnksIGRldik7CisJbGlzdF9kZWwoJmVudHJ5LT5saXN0KTsKKwlrZnJlZShlbnRyeSk7Cit9CisKIGludCBtSVNETl9kc3BfZWxlbWVudF9yZWdpc3RlcihzdHJ1Y3QgbUlTRE5fZHNwX2VsZW1lbnQgKmVsZW0pCiB7CiAJc3RydWN0IGRzcF9lbGVtZW50X2VudHJ5ICplbnRyeTsKQEAgLTgzLDEzICs5MiwxNCBAQAogCWlmICghZWxlbSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQllbnRyeSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBkc3BfZWxlbWVudF9lbnRyeSksIEdGUF9LRVJORUwpOworCWVudHJ5ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGRzcF9lbGVtZW50X2VudHJ5KSwgR0ZQX0FUT01JQyk7CiAJaWYgKCFlbnRyeSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAllbnRyeS0+ZWxlbSA9IGVsZW07CiAKIAllbnRyeS0+ZGV2LmNsYXNzID0gZWxlbWVudHNfY2xhc3M7CisJZW50cnktPmRldi5yZWxlYXNlID0gbUlTRE5fZHNwX2Rldl9yZWxlYXNlOwogCWRldl9zZXRfZHJ2ZGF0YSgmZW50cnktPmRldiwgZWxlbSk7CiAJZGV2X3NldF9uYW1lKCZlbnRyeS0+ZGV2LCBlbGVtLT5uYW1lKTsKIAlyZXQgPSBkZXZpY2VfcmVnaXN0ZXIoJmVudHJ5LT5kZXYpOwpAQCAtOTgsOSArMTA4LDkgQEAKIAkJCV9fZnVuY19fLCBlbGVtLT5uYW1lKTsKIAkJZ290byBlcnIxOwogCX0KKwlsaXN0X2FkZF90YWlsKCZlbnRyeS0+bGlzdCwgJmRzcF9lbGVtZW50cyk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgKHNpemVvZihlbGVtZW50X2F0dHJpYnV0ZXMpCi0JCS8gc2l6ZW9mKHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlKSk7ICsraSkKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShlbGVtZW50X2F0dHJpYnV0ZXMpOyArK2kpIHsKIAkJcmV0ID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZlbnRyeS0+ZGV2LAogCQkJCSZlbGVtZW50X2F0dHJpYnV0ZXNbaV0pOwogCQlpZiAocmV0KSB7CkBAIC0xMDgsMTUgKzExOCwxNyBAQAogCQkJCV9fZnVuY19fKTsKIAkJCWdvdG8gZXJyMjsKIAkJfQorCX0KIAotCWxpc3RfYWRkX3RhaWwoJmVudHJ5LT5saXN0LCAmZHNwX2VsZW1lbnRzKTsKLQorI2lmZGVmIFBJUEVMSU5FX0RFQlVHCiAJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAlcyByZWdpc3RlcmVkXG4iLCBfX2Z1bmNfXywgZWxlbS0+bmFtZSk7CisjZW5kaWYKIAogCXJldHVybiAwOwogCiBlcnIyOgogCWRldmljZV91bnJlZ2lzdGVyKCZlbnRyeS0+ZGV2KTsKKwlyZXR1cm4gcmV0OwogZXJyMToKIAlrZnJlZShlbnRyeSk7CiAJcmV0dXJuIHJldDsKQEAgLTEzMiwxMSArMTQ0LDExIEBACiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZW50cnksIG4sICZkc3BfZWxlbWVudHMsIGxpc3QpCiAJCWlmIChlbnRyeS0+ZWxlbSA9PSBlbGVtKSB7Ci0JCQlsaXN0X2RlbCgmZW50cnktPmxpc3QpOwogCQkJZGV2aWNlX3VucmVnaXN0ZXIoJmVudHJ5LT5kZXYpOwotCQkJa2ZyZWUoZW50cnkpOworI2lmZGVmIFBJUEVMSU5FX0RFQlVHCiAJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6ICVzIHVucmVnaXN0ZXJlZFxuIiwKIAkJCQlfX2Z1bmNfXywgZWxlbS0+bmFtZSk7CisjZW5kaWYKIAkJCXJldHVybjsKIAkJfQogCXByaW50ayhLRVJOX0VSUiAiJXM6IGVsZW1lbnQgJXMgbm90IGluIGxpc3QuXG4iLCBfX2Z1bmNfXywgZWxlbS0+bmFtZSk7CkBAIC0xNzMsNyArMTg1LDkgQEAKIAkJa2ZyZWUoZW50cnkpOwogCX0KIAorI2lmZGVmIFBJUEVMSU5FX0RFQlVHCiAJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBkc3AgcGlwZWxpbmUgbW9kdWxlIGV4aXRlZFxuIiwgX19mdW5jX18pOworI2VuZGlmCiB9CiAKIGludCBkc3BfcGlwZWxpbmVfaW5pdChzdHJ1Y3QgZHNwX3BpcGVsaW5lICpwaXBlbGluZSkKQEAgLTIzOSw3ICsyNTMsNyBAQAogCWlmICghbGVuKQogCQlyZXR1cm4gMDsKIAotCWR1cCA9IGttYWxsb2MobGVuICsgMSwgR0ZQX0tFUk5FTCk7CisJZHVwID0ga21hbGxvYyhsZW4gKyAxLCBHRlBfQVRPTUlDKTsKIAlpZiAoIWR1cCkKIAkJcmV0dXJuIDA7CiAJc3RyY3B5KGR1cCwgY2ZnKTsKQEAgLTI1Niw5ICsyNzAsOSBAQAogCQkJCWVsZW0gPSBlbnRyeS0+ZWxlbTsKIAogCQkJCXBpcGVsaW5lX2VudHJ5ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0Ci0JCQkJCWRzcF9waXBlbGluZV9lbnRyeSksIEdGUF9LRVJORUwpOworCQkJCQlkc3BfcGlwZWxpbmVfZW50cnkpLCBHRlBfQVRPTUlDKTsKIAkJCQlpZiAoIXBpcGVsaW5lX2VudHJ5KSB7Ci0JCQkJCXByaW50ayhLRVJOX0RFQlVHICIlczogZmFpbGVkIHRvIGFkZCAiCisJCQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IGZhaWxlZCB0byBhZGQgIgogCQkJCQkgICAgImVudHJ5IHRvIHBpcGVsaW5lOiAlcyAob3V0IG9mICIKIAkJCQkJICAgICJtZW1vcnkpXG4iLCBfX2Z1bmNfXywgZWxlbS0+bmFtZSk7CiAJCQkJCWluY29tcGxldGUgPSAxOwpAQCAtMjg2LDcgKzMwMCw3IEBACiAJCQkJCQkgICAgYXJncyA6ICIiKTsKICNlbmRpZgogCQkJCQl9IGVsc2UgewotCQkJCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBmYWlsZWQgIgorCQkJCQkJcHJpbnRrKEtFUk5fRVJSICIlczogZmFpbGVkICIKIAkJCQkJCSAgInRvIGFkZCBlbnRyeSB0byBwaXBlbGluZTogIgogCQkJCQkJICAiJXMgKG5ldygpIHJldHVybmVkIE5VTEwpXG4iLAogCQkJCQkJICBfX2Z1bmNfXywgZWxlbS0+bmFtZSk7CkBAIC0zMDEsNyArMzE1LDcgQEAKIAkJaWYgKGZvdW5kKQogCQkJZm91bmQgPSAwOwogCQllbHNlIHsKLQkJCXByaW50ayhLRVJOX0RFQlVHICIlczogZWxlbWVudCBub3QgZm91bmQsIHNraXBwaW5nOiAiCisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBlbGVtZW50IG5vdCBmb3VuZCwgc2tpcHBpbmc6ICIKIAkJCQkiJXNcbiIsIF9fZnVuY19fLCBuYW1lKTsKIAkJCWluY29tcGxldGUgPSAxOwogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vbUlTRE4vaHdjaGFubmVsLmMgYi9kcml2ZXJzL2lzZG4vbUlTRE4vaHdjaGFubmVsLmMKaW5kZXggMjU5NmZiYS4uYWIxMTY4YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL21JU0ROL2h3Y2hhbm5lbC5jCisrKyBiL2RyaXZlcnMvaXNkbi9tSVNETi9od2NoYW5uZWwuYwpAQCAtNTAsOSArNTAsNiBAQAogCiAJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChGTEdfUkVDVlFVRVVFLCAmYmNoLT5GbGFncykpIHsKIAkJd2hpbGUgKChza2IgPSBza2JfZGVxdWV1ZSgmYmNoLT5ycXVldWUpKSkgewotCQkJaWYgKGJjaC0+cmNvdW50ID49IDY0KQotCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIkItY2hhbm5lbCAlcCByZWNlaXZlICIKLQkJCQkJInF1ZXVlIGlmIGZ1bGwsIGJ1dCBlbXB0aWVzLi4uXG4iLCBiY2gpOwogCQkJYmNoLT5yY291bnQtLTsKIAkJCWlmIChsaWtlbHkoYmNoLT5jaC5wZWVyKSkgewogCQkJCWVyciA9IGJjaC0+Y2gucmVjdihiY2gtPmNoLnBlZXIsIHNrYik7CkBAIC0xNjksNiArMTY2LDI1IEBACiBFWFBPUlRfU1lNQk9MKHJlY3ZfRGNoYW5uZWwpOwogCiB2b2lkCityZWN2X0VjaGFubmVsKHN0cnVjdCBkY2hhbm5lbCAqZWNoLCBzdHJ1Y3QgZGNoYW5uZWwgKmRjaCkKK3sKKwlzdHJ1Y3QgbUlTRE5oZWFkICpoaDsKKworCWlmIChlY2gtPnJ4X3NrYi0+bGVuIDwgMikgeyAvKiBhdCBsZWFzdCAyIGZvciBzYXBpIC8gdGVpICovCisJCWRldl9rZnJlZV9za2IoZWNoLT5yeF9za2IpOworCQllY2gtPnJ4X3NrYiA9IE5VTEw7CisJCXJldHVybjsKKwl9CisJaGggPSBtSVNETl9IRUFEX1AoZWNoLT5yeF9za2IpOworCWhoLT5wcmltID0gUEhfREFUQV9FX0lORDsKKwloaC0+aWQgPSBnZXRfc2FwaV90ZWkoZWNoLT5yeF9za2ItPmRhdGEpOworCXNrYl9xdWV1ZV90YWlsKCZkY2gtPnJxdWV1ZSwgZWNoLT5yeF9za2IpOworCWVjaC0+cnhfc2tiID0gTlVMTDsKKwlzY2hlZHVsZV9ldmVudChkY2gsIEZMR19SRUNWUVVFVUUpOworfQorRVhQT1JUX1NZTUJPTChyZWN2X0VjaGFubmVsKTsKKwordm9pZAogcmVjdl9CY2hhbm5lbChzdHJ1Y3QgYmNoYW5uZWwgKmJjaCkKIHsKIAlzdHJ1Y3QgbUlTRE5oZWFkICpoaDsKQEAgLTE3Nyw4ICsxOTMsMTAgQEAKIAloaC0+cHJpbSA9IFBIX0RBVEFfSU5EOwogCWhoLT5pZCA9IE1JU0ROX0lEX0FOWTsKIAlpZiAoYmNoLT5yY291bnQgPj0gNjQpIHsKLQkJZGV2X2tmcmVlX3NrYihiY2gtPnJ4X3NrYik7Ci0JCWJjaC0+cnhfc2tiID0gTlVMTDsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiQi1jaGFubmVsICVwIHJlY2VpdmUgcXVldWUgb3ZlcmZsb3csICIKKwkJCSJmdXNoaW5nIVxuIiwgYmNoKTsKKwkJc2tiX3F1ZXVlX3B1cmdlKCZiY2gtPnJxdWV1ZSk7CisJCWJjaC0+cmNvdW50ID0gMDsKIAkJcmV0dXJuOwogCX0KIAliY2gtPnJjb3VudCsrOwpAQCAtMjAwLDggKzIxOCwxMCBAQAogcmVjdl9CY2hhbm5lbF9za2Ioc3RydWN0IGJjaGFubmVsICpiY2gsIHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJaWYgKGJjaC0+cmNvdW50ID49IDY0KSB7Ci0JCWRldl9rZnJlZV9za2Ioc2tiKTsKLQkJcmV0dXJuOworCQlwcmludGsoS0VSTl9XQVJOSU5HICJCLWNoYW5uZWwgJXAgcmVjZWl2ZSBxdWV1ZSBvdmVyZmxvdywgIgorCQkJImZ1c2hpbmchXG4iLCBiY2gpOworCQlza2JfcXVldWVfcHVyZ2UoJmJjaC0+cnF1ZXVlKTsKKwkJYmNoLT5yY291bnQgPSAwOwogCX0KIAliY2gtPnJjb3VudCsrOwogCXNrYl9xdWV1ZV90YWlsKCZiY2gtPnJxdWV1ZSwgc2tiKTsKQEAgLTI0NSw4ICsyNjUsMTIgQEAKIHsKIAlzdHJ1Y3Qgc2tfYnVmZgkqc2tiOwogCi0JaWYgKGJjaC0+cmNvdW50ID49IDY0KQotCQlyZXR1cm47CisJaWYgKGJjaC0+cmNvdW50ID49IDY0KSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIkItY2hhbm5lbCAlcCByZWNlaXZlIHF1ZXVlIG92ZXJmbG93LCAiCisJCQkiZnVzaGluZyFcbiIsIGJjaCk7CisJCXNrYl9xdWV1ZV9wdXJnZSgmYmNoLT5ycXVldWUpOworCQliY2gtPnJjb3VudCA9IDA7CisJfQogCXNrYiA9IF9hbGxvY19tSVNETl9za2IoUEhfREFUQV9DTkYsIG1JU0ROX0hFQURfSUQoYmNoLT50eF9za2IpLAogCSAgICAwLCBOVUxMLCBHRlBfQVRPTUlDKTsKIAlpZiAoIXNrYikgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL21JU0ROL2wxb2lwX2NvcmUuYyBiL2RyaXZlcnMvaXNkbi9tSVNETi9sMW9pcF9jb3JlLmMKaW5kZXggMDg4NGRkNi4uYWJlNTc0OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL21JU0ROL2wxb2lwX2NvcmUuYworKysgYi9kcml2ZXJzL2lzZG4vbUlTRE4vbDFvaXBfY29yZS5jCkBAIC03NzcsNiArNzc3LDggQEAKIHN0YXRpYyB2b2lkCiBsMW9pcF9zb2NrZXRfY2xvc2Uoc3RydWN0IGwxb2lwICpoYykKIHsKKwlzdHJ1Y3QgZGNoYW5uZWwgKmRjaCA9IGhjLT5jaGFuW2hjLT5kX2lkeF0uZGNoOworCiAJLyoga2lsbCB0aHJlYWQgKi8KIAlpZiAoaGMtPnNvY2tldF90aHJlYWQpIHsKIAkJaWYgKGRlYnVnICYgREVCVUdfTDFPSVBfU09DS0VUKQpAQCAtNzg1LDYgKzc4NywxNiBAQAogCQlzZW5kX3NpZyhTSUdURVJNLCBoYy0+c29ja2V0X3RocmVhZCwgMCk7CiAJCXdhaXRfZm9yX2NvbXBsZXRpb24oJmhjLT5zb2NrZXRfY29tcGxldGUpOwogCX0KKworCS8qIGlmIGFjdGl2ZSwgd2Ugc2VuZCB1cCBhIFBIX0RFQUNUSVZBVEUgYW5kIGRlYWN0aXZhdGUgKi8KKwlpZiAodGVzdF9iaXQoRkxHX0FDVElWRSwgJmRjaC0+RmxhZ3MpKSB7CisJCWlmIChkZWJ1ZyAmIChERUJVR19MMU9JUF9NU0d8REVCVUdfTDFPSVBfU09DS0VUKSkKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlczogaW50ZXJmYWNlIGJlY29tZSBkZWFjdGl2YXRlZCAiCisJCQkJImR1ZSB0byB0aW1lb3V0XG4iLCBfX2Z1bmNfXyk7CisJCXRlc3RfYW5kX2NsZWFyX2JpdChGTEdfQUNUSVZFLCAmZGNoLT5GbGFncyk7CisJCV9xdWV1ZV9kYXRhKCZkY2gtPmRldi5ELCBQSF9ERUFDVElWQVRFX0lORCwgTUlTRE5fSURfQU5ZLCAwLAorCQkJTlVMTCwgR0ZQX0FUT01JQyk7CisJfQogfQogCiBzdGF0aWMgaW50CkBAIC05NDQsNyArOTU2LDggQEAKIAogCXN3aXRjaCAoY3EtPm9wKSB7CiAJY2FzZSBNSVNETl9DVFJMX0dFVE9QOgotCQljcS0+b3AgPSBNSVNETl9DVFJMX1NFVFBFRVIgfCBNSVNETl9DVFJMX1VOU0VUUEVFUjsKKwkJY3EtPm9wID0gTUlTRE5fQ1RSTF9TRVRQRUVSIHwgTUlTRE5fQ1RSTF9VTlNFVFBFRVIKKwkJCXwgTUlTRE5fQ1RSTF9HRVRQRUVSOwogCQlicmVhazsKIAljYXNlIE1JU0ROX0NUUkxfU0VUUEVFUjoKIAkJaGMtPnJlbW90ZWlwID0gKHUzMiljcS0+cDE7CkBAIC05NjQsNiArOTc3LDEzIEBACiAJCWhjLT5yZW1vdGVpcCA9IDA7CiAJCWwxb2lwX3NvY2tldF9vcGVuKGhjKTsKIAkJYnJlYWs7CisJY2FzZSBNSVNETl9DVFJMX0dFVFBFRVI6CisJCWlmIChkZWJ1ZyAmIERFQlVHX0wxT0lQX1NPQ0tFVCkKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlczogZ2V0dGluZyBpcCBhZGRyZXNzLlxuIiwKKwkJCQlfX2Z1bmNfXyk7CisJCWNxLT5wMSA9IGhjLT5yZW1vdGVpcDsKKwkJY3EtPnAyID0gaGMtPnJlbW90ZXBvcnQgfCAoaGMtPmxvY2FscG9ydCA8PCAxNik7CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiB1bmtub3duIE9wICV4XG4iLAogCQkgICAgX19mdW5jX18sIGNxLT5vcCk7CkBAIC0xNDEzLDcgKzE0MzMsOCBAQAogCQloYy0+Y2hhbltpICsgY2hdLmJjaCA9IGJjaDsKIAkJc2V0X2NoYW5uZWxtYXAoYmNoLT5uciwgZGNoLT5kZXYuY2hhbm5lbG1hcCk7CiAJfQotCXJldCA9IG1JU0ROX3JlZ2lzdGVyX2RldmljZSgmZGNoLT5kZXYsIGhjLT5uYW1lKTsKKwkvKiBUT0RPOiBjcmVhdGUgYSBwYXJlbnQgZGV2aWNlIGZvciB0aGlzIGRyaXZlciAqLworCXJldCA9IG1JU0ROX3JlZ2lzdGVyX2RldmljZSgmZGNoLT5kZXYsIE5VTEwsIGhjLT5uYW1lKTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCWhjLT5yZWdpc3RlcmVkID0gMTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9tSVNETi9sYXllcjEuYyBiL2RyaXZlcnMvaXNkbi9tSVNETi9sYXllcjEuYwppbmRleCBiNzNlOTUyLi5lODI2ZWViIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vbUlTRE4vbGF5ZXIxLmMKKysrIGIvZHJpdmVycy9pc2RuL21JU0ROL2xheWVyMS5jCkBAIC0xMDEsNyArMTAxLDcgQEAKIAl2YV9saXN0IHZhOwogCiAJdmFfc3RhcnQodmEsIGZtdCk7Ci0JcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAiLCBsMS0+ZGNoLT5kZXYubmFtZSk7CisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAiLCBkZXZfbmFtZSgmbDEtPmRjaC0+ZGV2LmRldikpOwogCXZwcmludGsoZm10LCB2YSk7CiAJcHJpbnRrKCJcbiIpOwogCXZhX2VuZCh2YSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vbUlTRE4vc29ja2V0LmMgYi9kcml2ZXJzL2lzZG4vbUlTRE4vc29ja2V0LmMKaW5kZXggMzdhMmRlMS4uNTA4OTQ1ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL21JU0ROL3NvY2tldC5jCisrKyBiL2RyaXZlcnMvaXNkbi9tSVNETi9zb2NrZXQuYwpAQCAtMzgxLDcgKzM4MSw3IEBACiAJCQltZW1jcHkoZGkuY2hhbm5lbG1hcCwgZGV2LT5jaGFubmVsbWFwLAogCQkJCXNpemVvZihkaS5jaGFubmVsbWFwKSk7CiAJCQlkaS5ucmJjaGFuID0gZGV2LT5ucmJjaGFuOwotCQkJc3RyY3B5KGRpLm5hbWUsIGRldi0+bmFtZSk7CisJCQlzdHJjcHkoZGkubmFtZSwgZGV2X25hbWUoJmRldi0+ZGV2KSk7CiAJCQlpZiAoY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKWFyZywgJmRpLCBzaXplb2YoZGkpKSkKIAkJCQllcnIgPSAtRUZBVUxUOwogCQl9IGVsc2UKQEAgLTQ2MCw2ICs0NjAsOCBAQAogewogCXN0cnVjdCBzb2NrYWRkcl9tSVNETiAqbWFkZHIgPSAoc3RydWN0IHNvY2thZGRyX21JU0ROICopIGFkZHI7CiAJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CisJc3RydWN0IGhsaXN0X25vZGUgKm5vZGU7CisJc3RydWN0IHNvY2sgKmNzazsKIAlpbnQgZXJyID0gMDsKIAogCWlmICgqZGVidWcgJiBERUJVR19TT0NLRVQpCkBAIC00ODAsNiArNDgyLDI2IEBACiAJCWVyciA9IC1FTk9ERVY7CiAJCWdvdG8gZG9uZTsKIAl9CisKKwlpZiAoc2stPnNrX3Byb3RvY29sIDwgSVNETl9QX0JfU1RBUlQpIHsKKwkJcmVhZF9sb2NrX2JoKCZkYXRhX3NvY2tldHMubG9jayk7CisJCXNrX2Zvcl9lYWNoKGNzaywgbm9kZSwgJmRhdGFfc29ja2V0cy5oZWFkKSB7CisJCQlpZiAoc2sgPT0gY3NrKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKF9wbXMoY3NrKS0+ZGV2ICE9IF9wbXMoc2spLT5kZXYpCisJCQkJY29udGludWU7CisJCQlpZiAoY3NrLT5za19wcm90b2NvbCA+PSBJU0ROX1BfQl9TVEFSVCkKKwkJCQljb250aW51ZTsKKwkJCWlmIChJU19JU0ROX1BfVEUoY3NrLT5za19wcm90b2NvbCkKKwkJCQkJPT0gSVNfSVNETl9QX1RFKHNrLT5za19wcm90b2NvbCkpCisJCQkJY29udGludWU7CisJCQlyZWFkX3VubG9ja19iaCgmZGF0YV9zb2NrZXRzLmxvY2spOworCQkJZXJyID0gLUVCVVNZOworCQkJZ290byBkb25lOworCQl9CisJCXJlYWRfdW5sb2NrX2JoKCZkYXRhX3NvY2tldHMubG9jayk7CisJfQorCiAJX3BtcyhzayktPmNoLnNlbmQgPSBtSVNETl9zZW5kOwogCV9wbXMoc2spLT5jaC5jdHJsID0gbUlTRE5fY3RybDsKIApAQCAtNjM5LDEyICs2NjEsMjcgQEAKIAkJCW1lbWNweShkaS5jaGFubmVsbWFwLCBkZXYtPmNoYW5uZWxtYXAsCiAJCQkJc2l6ZW9mKGRpLmNoYW5uZWxtYXApKTsKIAkJCWRpLm5yYmNoYW4gPSBkZXYtPm5yYmNoYW47Ci0JCQlzdHJjcHkoZGkubmFtZSwgZGV2LT5uYW1lKTsKKwkJCXN0cmNweShkaS5uYW1lLCBkZXZfbmFtZSgmZGV2LT5kZXYpKTsKIAkJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLCAmZGksIHNpemVvZihkaSkpKQogCQkJCWVyciA9IC1FRkFVTFQ7CiAJCX0gZWxzZQogCQkJZXJyID0gLUVOT0RFVjsKIAkJYnJlYWs7CisJY2FzZSBJTVNFVERFVk5BTUU6CisJCXsKKwkJCXN0cnVjdCBtSVNETl9kZXZyZW5hbWUgZG47CisJCQlpZiAoY29weV9mcm9tX3VzZXIoJmRuLCAodm9pZCBfX3VzZXIgKilhcmcsCisJCQkgICAgc2l6ZW9mKGRuKSkpIHsKKwkJCQllcnIgPSAtRUZBVUxUOworCQkJCWJyZWFrOworCQkJfQorCQkJZGV2ID0gZ2V0X21kZXZpY2UoZG4uaWQpOworCQkJaWYgKGRldikKKwkJCQllcnIgPSBkZXZpY2VfcmVuYW1lKCZkZXYtPmRldiwgZG4ubmFtZSk7CisJCQllbHNlCisJCQkJZXJyID0gLUVOT0RFVjsKKwkJfQorCQlicmVhazsKIAlkZWZhdWx0OgogCQllcnIgPSAtRUlOVkFMOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9tSVNETi9zdGFjay5jIGIvZHJpdmVycy9pc2RuL21JU0ROL3N0YWNrLmMKaW5kZXggZDU1YjE0YS4uZTJmNDUwMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL21JU0ROL3N0YWNrLmMKKysrIGIvZHJpdmVycy9pc2RuL21JU0ROL3N0YWNrLmMKQEAgLTE3Miw3ICsxNzIsOCBAQAogCQllbHNlCiAJCQlwcmludGsoS0VSTl9XQVJOSU5HCiAJCQkgICAgIiVzOiBkZXYoJXMpIHByaW0oJXgpIGlkKCV4KSBubyBjaGFubmVsXG4iLAotCQkJICAgIF9fZnVuY19fLCBzdC0+ZGV2LT5uYW1lLCBoaC0+cHJpbSwgaGgtPmlkKTsKKwkJCSAgICBfX2Z1bmNfXywgZGV2X25hbWUoJnN0LT5kZXYtPmRldiksIGhoLT5wcmltLAorCQkJICAgIGhoLT5pZCk7CiAJfSBlbHNlIGlmIChsbSA9PSAweDgpIHsKIAkJV0FSTl9PTihsbSA9PSAweDgpOwogCQljaCA9IGdldF9jaGFubmVsNGlkKHN0LCBoaC0+aWQpOwpAQCAtMTgxLDExICsxODIsMTIgQEAKIAkJZWxzZQogCQkJcHJpbnRrKEtFUk5fV0FSTklORwogCQkJICAgICIlczogZGV2KCVzKSBwcmltKCV4KSBpZCgleCkgbm8gY2hhbm5lbFxuIiwKLQkJCSAgICBfX2Z1bmNfXywgc3QtPmRldi0+bmFtZSwgaGgtPnByaW0sIGhoLT5pZCk7CisJCQkgICAgX19mdW5jX18sIGRldl9uYW1lKCZzdC0+ZGV2LT5kZXYpLCBoaC0+cHJpbSwKKwkJCSAgICBoaC0+aWQpOwogCX0gZWxzZSB7CiAJCS8qIGJyb2FkY2FzdCBub3QgaGFuZGxlZCB5ZXQgKi8KIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGRldiglcykgcHJpbSAleCBub3QgZGVsaXZlcmVkXG4iLAotCQkgICAgX19mdW5jX18sIHN0LT5kZXYtPm5hbWUsIGhoLT5wcmltKTsKKwkJICAgIF9fZnVuY19fLCBkZXZfbmFtZSgmc3QtPmRldi0+ZGV2KSwgaGgtPnByaW0pOwogCX0KIAlyZXR1cm4gLUVTUkNIOwogfQpAQCAtMjA5LDcgKzIxMSw4IEBACiAJdW5sb2NrX2tlcm5lbCgpOwogI2VuZGlmCiAJaWYgKCpkZWJ1ZyAmIERFQlVHX01TR19USFJFQUQpCi0JCXByaW50ayhLRVJOX0RFQlVHICJtSVNETlN0YWNrZCAlcyBzdGFydGVkXG4iLCBzdC0+ZGV2LT5uYW1lKTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIm1JU0ROU3RhY2tkICVzIHN0YXJ0ZWRcbiIsCisJCSAgICBkZXZfbmFtZSgmc3QtPmRldi0+ZGV2KSk7CiAKIAlpZiAoc3QtPm5vdGlmeSAhPSBOVUxMKSB7CiAJCWNvbXBsZXRlKHN0LT5ub3RpZnkpOwpAQCAtMjQ1LDcgKzI0OCw3IEBACiAJCQkJCXByaW50ayhLRVJOX0RFQlVHCiAJCQkJCSAgICAiJXM6ICVzIHByaW0oJXgpIGlkKCV4KSAiCiAJCQkJCSAgICAic2VuZCBjYWxsKCVkKVxuIiwKLQkJCQkJICAgIF9fZnVuY19fLCBzdC0+ZGV2LT5uYW1lLAorCQkJCQkgICAgX19mdW5jX18sIGRldl9uYW1lKCZzdC0+ZGV2LT5kZXYpLAogCQkJCQkgICAgbUlTRE5fSEVBRF9QUklNKHNrYiksCiAJCQkJCSAgICBtSVNETl9IRUFEX0lEKHNrYiksIGVycik7CiAJCQkJZGV2X2tmcmVlX3NrYihza2IpOwpAQCAtMjg4LDcgKzI5MSw3IEBACiAJCSAgICBtSVNETl9TVEFDS19BQ1RJT05fTUFTSykpOwogCQlpZiAoKmRlYnVnICYgREVCVUdfTVNHX1RIUkVBRCkKIAkJCXByaW50ayhLRVJOX0RFQlVHICIlczogJXMgd2FrZSBzdGF0dXMgJTA4bHhcbiIsCi0JCQkgICAgX19mdW5jX18sIHN0LT5kZXYtPm5hbWUsIHN0LT5zdGF0dXMpOworCQkJICAgIF9fZnVuY19fLCBkZXZfbmFtZSgmc3QtPmRldi0+ZGV2KSwgc3QtPnN0YXR1cyk7CiAJCXRlc3RfYW5kX3NldF9iaXQobUlTRE5fU1RBQ0tfQUNUSVZFLCAmc3QtPnN0YXR1cyk7CiAKIAkJdGVzdF9hbmRfY2xlYXJfYml0KG1JU0ROX1NUQUNLX1dBS0VVUCwgJnN0LT5zdGF0dXMpOwpAQCAtMzAzLDE1ICszMDYsMTYgQEAKICNpZmRlZiBNSVNETl9NU0dfU1RBVFMKIAlwcmludGsoS0VSTl9ERUJVRyAibUlTRE5TdGFja2QgZGFlbW9uIGZvciAlcyBwcm9jZWVkICVkICIKIAkgICAgIm1zZyAlZCBzbGVlcCAlZCBzdG9wcGVkXG4iLAotCSAgICBzdC0+ZGV2LT5uYW1lLCBzdC0+bXNnX2NudCwgc3QtPnNsZWVwX2NudCwgc3QtPnN0b3BwZWRfY250KTsKKwkgICAgZGV2X25hbWUoJnN0LT5kZXYtPmRldiksIHN0LT5tc2dfY250LCBzdC0+c2xlZXBfY250LAorCSAgICBzdC0+c3RvcHBlZF9jbnQpOwogCXByaW50ayhLRVJOX0RFQlVHCiAJICAgICJtSVNETlN0YWNrZCBkYWVtb24gZm9yICVzIHV0aW1lKCVsZCkgc3RpbWUoJWxkKVxuIiwKLQkgICAgc3QtPmRldi0+bmFtZSwgc3QtPnRocmVhZC0+dXRpbWUsIHN0LT50aHJlYWQtPnN0aW1lKTsKKwkgICAgZGV2X25hbWUoJnN0LT5kZXYtPmRldiksIHN0LT50aHJlYWQtPnV0aW1lLCBzdC0+dGhyZWFkLT5zdGltZSk7CiAJcHJpbnRrKEtFUk5fREVCVUcKIAkgICAgIm1JU0ROU3RhY2tkIGRhZW1vbiBmb3IgJXMgbnZjc3coJWxkKSBuaXZjc3coJWxkKVxuIiwKLQkgICAgc3QtPmRldi0+bmFtZSwgc3QtPnRocmVhZC0+bnZjc3csIHN0LT50aHJlYWQtPm5pdmNzdyk7CisJICAgIGRldl9uYW1lKCZzdC0+ZGV2LT5kZXYpLCBzdC0+dGhyZWFkLT5udmNzdywgc3QtPnRocmVhZC0+bml2Y3N3KTsKIAlwcmludGsoS0VSTl9ERUJVRyAibUlTRE5TdGFja2QgZGFlbW9uIGZvciAlcyBraWxsZWQgbm93XG4iLAotCSAgICBzdC0+ZGV2LT5uYW1lKTsKKwkgICAgZGV2X25hbWUoJnN0LT5kZXYtPmRldikpOwogI2VuZGlmCiAJdGVzdF9hbmRfc2V0X2JpdChtSVNETl9TVEFDS19LSUxMRUQsICZzdC0+c3RhdHVzKTsKIAl0ZXN0X2FuZF9jbGVhcl9iaXQobUlTRE5fU1RBQ0tfUlVOTklORywgJnN0LT5zdGF0dXMpOwpAQCAtNDAxLDE1ICs0MDUsMTYgQEAKIAluZXdzdC0+b3duLnNlbmQgPSBtSVNETl9xdWV1ZV9tZXNzYWdlOwogCW5ld3N0LT5vd24ucmVjdiA9IG1JU0ROX3F1ZXVlX21lc3NhZ2U7CiAJaWYgKCpkZWJ1ZyAmIERFQlVHX0NPUkVfRlVOQykKLQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBzdCglcylcbiIsIF9fZnVuY19fLCBuZXdzdC0+ZGV2LT5uYW1lKTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBzdCglcylcbiIsIF9fZnVuY19fLAorCQkgICAgZGV2X25hbWUoJm5ld3N0LT5kZXYtPmRldikpOwogCW5ld3N0LT5ub3RpZnkgPSAmZG9uZTsKIAluZXdzdC0+dGhyZWFkID0ga3RocmVhZF9ydW4obUlTRE5TdGFja2QsICh2b2lkICopbmV3c3QsICJtSVNETl8lcyIsCi0JCW5ld3N0LT5kZXYtPm5hbWUpOworCQlkZXZfbmFtZSgmbmV3c3QtPmRldi0+ZGV2KSk7CiAJaWYgKElTX0VSUihuZXdzdC0+dGhyZWFkKSkgewogCQllcnIgPSBQVFJfRVJSKG5ld3N0LT50aHJlYWQpOwogCQlwcmludGsoS0VSTl9FUlIKIAkJCSJtSVNETjpjYW5ub3QgY3JlYXRlIGtlcm5lbCB0aHJlYWQgZm9yICVzICglZClcbiIsCi0JCQluZXdzdC0+ZGV2LT5uYW1lLCBlcnIpOworCQkJZGV2X25hbWUoJm5ld3N0LT5kZXYtPmRldiksIGVycik7CiAJCWRlbGV0ZV90ZWltYW5hZ2VyKGRldi0+dGVpbWdyKTsKIAkJa2ZyZWUobmV3c3QpOwogCX0gZWxzZQpAQCAtNDI4LDI5ICs0MzMsMjEgQEAKIAogCWlmICgqZGVidWcgJiAgREVCVUdfQ09SRV9GVU5DKQogCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6ICVzIHByb3RvKCV4KSBhZHIoJWQgJWQgJWQgJWQpXG4iLAotCQkJX19mdW5jX18sIGRldi0+bmFtZSwgcHJvdG9jb2wsIGFkci0+ZGV2LCBhZHItPmNoYW5uZWwsCi0JCQkgYWRyLT5zYXBpLCBhZHItPnRlaSk7CisJCQlfX2Z1bmNfXywgZGV2X25hbWUoJmRldi0+ZGV2KSwgcHJvdG9jb2wsIGFkci0+ZGV2LAorCQkJYWRyLT5jaGFubmVsLCBhZHItPnNhcGksIGFkci0+dGVpKTsKIAlzd2l0Y2ggKHByb3RvY29sKSB7CiAJY2FzZSBJU0ROX1BfTlRfUzA6CiAJY2FzZSBJU0ROX1BfTlRfRTE6CiAJY2FzZSBJU0ROX1BfVEVfUzA6CiAJY2FzZSBJU0ROX1BfVEVfRTE6Ci0jaWZkZWYgUFJPVE9DT0xfQ0hFQ0sKLQkJLyogdGhpcyBzaG91bGQgYmUgZW5oYW5jZWQgKi8KLQkJaWYgKCFsaXN0X2VtcHR5KCZkZXYtPkQuc3QtPmxheWVyMikKLQkJCSYmIGRldi0+RC5wcm90b2NvbCAhPSBwcm90b2NvbCkKLQkJCXJldHVybiAtRUJVU1k7Ci0JCWlmICghaGxpc3RfZW1wdHkoJmRldi0+RC5zdC0+bDFzb2NrLmhlYWQpCi0JCQkmJiBkZXYtPkQucHJvdG9jb2wgIT0gcHJvdG9jb2wpCi0JCQlyZXR1cm4gLUVCVVNZOwotI2VuZGlmCiAJCWNoLT5yZWN2ID0gbUlTRE5fcXVldWVfbWVzc2FnZTsKIAkJY2gtPnBlZXIgPSAmZGV2LT5ELnN0LT5vd247CiAJCWNoLT5zdCA9IGRldi0+RC5zdDsKIAkJcnEucHJvdG9jb2wgPSBwcm90b2NvbDsKLQkJcnEuYWRyLmNoYW5uZWwgPSAwOworCQlycS5hZHIuY2hhbm5lbCA9IGFkci0+Y2hhbm5lbDsKIAkJZXJyID0gZGV2LT5ELmN0cmwoJmRldi0+RCwgT1BFTl9DSEFOTkVMLCAmcnEpOwotCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHJldCAxICVkXG4iLCBfX2Z1bmNfXywgZXJyKTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiByZXQgJWQgKGRldiAlZClcbiIsIF9fZnVuY19fLCBlcnIsCisJCQlkZXYtPmlkKTsKIAkJaWYgKGVycikKIAkJCXJldHVybiBlcnI7CiAJCXdyaXRlX2xvY2tfYmgoJmRldi0+RC5zdC0+bDFzb2NrLmxvY2spOwpAQCAtNDczLDcgKzQ3MCw3IEBACiAKIAlpZiAoKmRlYnVnICYgIERFQlVHX0NPUkVfRlVOQykKIAkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAlcyBwcm90bygleCkgYWRyKCVkICVkICVkICVkKVxuIiwKLQkJCV9fZnVuY19fLCBkZXYtPm5hbWUsIHByb3RvY29sLAorCQkJX19mdW5jX18sIGRldl9uYW1lKCZkZXYtPmRldiksIHByb3RvY29sLAogCQkJYWRyLT5kZXYsIGFkci0+Y2hhbm5lbCwgYWRyLT5zYXBpLAogCQkJYWRyLT50ZWkpOwogCWNoLT5zdCA9IGRldi0+RC5zdDsKQEAgLTUyOSw3ICs1MjYsNyBAQAogCiAJaWYgKCpkZWJ1ZyAmICBERUJVR19DT1JFX0ZVTkMpCiAJCXByaW50ayhLRVJOX0RFQlVHICIlczogJXMgcHJvdG8oJXgpIGFkciglZCAlZCAlZCAlZClcbiIsCi0JCQlfX2Z1bmNfXywgZGV2LT5uYW1lLCBwcm90b2NvbCwKKwkJCV9fZnVuY19fLCBkZXZfbmFtZSgmZGV2LT5kZXYpLCBwcm90b2NvbCwKIAkJCWFkci0+ZGV2LCBhZHItPmNoYW5uZWwsIGFkci0+c2FwaSwKIAkJCWFkci0+dGVpKTsKIAlycS5wcm90b2NvbCA9IElTRE5fUF9URV9TMDsKQEAgLTU0MSwxNSArNTM4LDYgQEAKIAkJaWYgKGRldi0+RHByb3RvY29scyAmICgxIDw8IElTRE5fUF9OVF9FMSkpCiAJCQlycS5wcm90b2NvbCA9IElTRE5fUF9OVF9FMTsKIAljYXNlIElTRE5fUF9MQVBEX1RFOgotI2lmZGVmIFBST1RPQ09MX0NIRUNLCi0JCS8qIHRoaXMgc2hvdWxkIGJlIGVuaGFuY2VkICovCi0JCWlmICghbGlzdF9lbXB0eSgmZGV2LT5ELnN0LT5sYXllcjIpCi0JCQkmJiBkZXYtPkQucHJvdG9jb2wgIT0gcHJvdG9jb2wpCi0JCQlyZXR1cm4gLUVCVVNZOwotCQlpZiAoIWhsaXN0X2VtcHR5KCZkZXYtPkQuc3QtPmwxc29jay5oZWFkKQotCQkJJiYgZGV2LT5ELnByb3RvY29sICE9IHByb3RvY29sKQotCQkJcmV0dXJuIC1FQlVTWTsKLSNlbmRpZgogCQljaC0+cmVjdiA9IG1JU0ROX3F1ZXVlX21lc3NhZ2U7CiAJCWNoLT5wZWVyID0gJmRldi0+RC5zdC0+b3duOwogCQljaC0+c3QgPSBkZXYtPkQuc3Q7CkBAIC01OTAsNyArNTc4LDcgQEAKIAl9CiAJaWYgKCpkZWJ1ZyAmIERFQlVHX0NPUkVfRlVOQykKIAkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBzdCglcykgcHJvdG9jb2woJXgpXG4iLCBfX2Z1bmNfXywKLQkJICAgIGNoLT5zdC0+ZGV2LT5uYW1lLCBjaC0+cHJvdG9jb2wpOworCQkgICAgZGV2X25hbWUoJmNoLT5zdC0+ZGV2LT5kZXYpLCBjaC0+cHJvdG9jb2wpOwogCWlmIChjaC0+cHJvdG9jb2wgPj0gSVNETl9QX0JfU1RBUlQpIHsKIAkJaWYgKGNoLT5wZWVyKSB7CiAJCQljaC0+cGVlci0+Y3RybChjaC0+cGVlciwgQ0xPU0VfQ0hBTk5FTCwgTlVMTCk7CkBAIC02NDMsNyArNjMxLDcgQEAKIAogCWlmICgqZGVidWcgJiBERUJVR19DT1JFX0ZVTkMpCiAJCXByaW50ayhLRVJOX0RFQlVHICIlczogc3QoJXMpXG4iLCBfX2Z1bmNfXywKLQkJICAgIHN0LT5kZXYtPm5hbWUpOworCQkgICAgZGV2X25hbWUoJnN0LT5kZXYtPmRldikpOwogCWlmIChkZXYtPnRlaW1ncikKIAkJZGVsZXRlX3RlaW1hbmFnZXIoZGV2LT50ZWltZ3IpOwogCWlmIChzdC0+dGhyZWFkKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vbUlTRE4vdGVpLmMgYi9kcml2ZXJzL2lzZG4vbUlTRE4vdGVpLmMKaW5kZXggNWM0M2QxOS4uYjQ1MmRlYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL21JU0ROL3RlaS5jCisrKyBiL2RyaXZlcnMvaXNkbi9tSVNETi90ZWkuYwpAQCAtOTY4LDkgKzk2OCw5IEBACiAKIAlpZiAoKmRlYnVnICYgREVCVUdfTDJfVEVJKQogCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6ICVzIHByb3RvKCV4KSBhZHIoJWQgJWQgJWQgJWQpXG4iLAotCQkJX19mdW5jX18sIG1nci0+Y2guc3QtPmRldi0+bmFtZSwgY3JxLT5wcm90b2NvbCwKLQkJCWNycS0+YWRyLmRldiwgY3JxLT5hZHIuY2hhbm5lbCwgY3JxLT5hZHIuc2FwaSwKLQkJCWNycS0+YWRyLnRlaSk7CisJCQlfX2Z1bmNfXywgZGV2X25hbWUoJm1nci0+Y2guc3QtPmRldi0+ZGV2KSwKKwkJCWNycS0+cHJvdG9jb2wsIGNycS0+YWRyLmRldiwgY3JxLT5hZHIuY2hhbm5lbCwKKwkJCWNycS0+YWRyLnNhcGksIGNycS0+YWRyLnRlaSk7CiAJaWYgKGNycS0+YWRyLnNhcGkgIT0gMCkgLyogbm90IHN1cHBvcnRlZCB5ZXQgKi8KIAkJcmV0dXJuIC1FSU5WQUw7CiAJaWYgKGNycS0+YWRyLnRlaSA+IEdST1VQX1RFSSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbGVkcy9LY29uZmlnIGIvZHJpdmVycy9sZWRzL0tjb25maWcKaW5kZXggZTdmYjdkMi4uNzQyNzEzNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9sZWRzL0tjb25maWcKKysrIGIvZHJpdmVycy9sZWRzL0tjb25maWcKQEAgLTYzLDYgKzYzLDEyIEBACiAJaGVscAogCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBzdXBwb3J0IGZvciB0aGUgUENFbmdpbmVzIFdSQVAgcHJvZ3JhbW1hYmxlIExFRHMuCiAKK2NvbmZpZyBMRURTX0FMSVgyCisJdHJpc3RhdGUgIkxFRCBTdXBwb3J0IGZvciBBTElYLjIgYW5kIEFMSVguMyBzZXJpZXMiCisJZGVwZW5kcyBvbiBMRURTX0NMQVNTICYmIFg4NiAmJiBFWFBFUklNRU5UQUwKKwloZWxwCisJICBUaGlzIG9wdGlvbiBlbmFibGVzIHN1cHBvcnQgZm9yIHRoZSBQQ0VuZ2luZXMgQUxJWC4yIGFuZCBBTElYLjMgTEVEcy4KKwogY29uZmlnIExFRFNfSDE5NDAKIAl0cmlzdGF0ZSAiTEVEIFN1cHBvcnQgZm9yIGlQQVEgSDE5NDAgZGV2aWNlIgogCWRlcGVuZHMgb24gTEVEU19DTEFTUyAmJiBBUkNIX0gxOTQwCkBAIC03Nyw3ICs4Myw3IEBACiAKIGNvbmZpZyBMRURTX0NPQkFMVF9SQVEKIAlib29sICJMRUQgU3VwcG9ydCBmb3IgdGhlIENvYmFsdCBSYXEgc2VyaWVzIgotCWRlcGVuZHMgb24gTEVEU19DTEFTUyAmJiBNSVBTX0NPQkFMVAorCWRlcGVuZHMgb24gTEVEU19DTEFTUz15ICYmIE1JUFNfQ09CQUxUCiAJc2VsZWN0IExFRFNfVFJJR0dFUlMKIAloZWxwCiAJICBUaGlzIG9wdGlvbiBlbmFibGVzIHN1cHBvcnQgZm9yIHRoZSBDb2JhbHQgUmFxIHNlcmllcyBMRURzLgpAQCAtMTEzLDEzICsxMTksNiBAQAogCSAgb3V0cHV0cy4gVG8gYmUgdXNlZnVsIHRoZSBwYXJ0aWN1bGFyIGJvYXJkIG11c3QgaGF2ZSBMRURzCiAJICBhbmQgdGhleSBtdXN0IGJlIGNvbm5lY3RlZCB0byB0aGUgR1BJTyBsaW5lcy4KIAotY29uZmlnIExFRFNfSFBfRElTSwotCXRyaXN0YXRlICJMRUQgU3VwcG9ydCBmb3IgZGlzayBwcm90ZWN0aW9uIExFRCBvbiBIUCBub3RlYm9va3MiCi0JZGVwZW5kcyBvbiBMRURTX0NMQVNTICYmIEFDUEkKLQloZWxwCi0JICBUaGlzIG9wdGlvbiBlbmFibGUgc3VwcG9ydCBmb3IgZGlzayBwcm90ZWN0aW9uIExFRCwgZm91bmQgb24KLQkgIG5ld2VyIEhQIG5vdGVib29rcy4KLQogY29uZmlnIExFRFNfQ0xFVk9fTUFJTAogCXRyaXN0YXRlICJNYWlsIExFRCBvbiBDbGV2byBub3RlYm9vayAoRVhQRVJJTUVOVEFMKSIKIAlkZXBlbmRzIG9uIExFRFNfQ0xBU1MgJiYgWDg2ICYmIFNFUklPX0k4MDQyICYmIERNSSAmJiBFWFBFUklNRU5UQUwKQEAgLTE1OCw2ICsxNTcsMTMgQEAKIAkgIExFRCBkcml2ZXIgY2hpcHMgYWNjZXNzZWQgdmlhIHRoZSBJMkMgYnVzLiAgU3VwcG9ydGVkCiAJICBkZXZpY2VzIGluY2x1ZGUgUENBOTU1MCwgUENBOTU1MSwgUENBOTU1MiwgYW5kIFBDQTk1NTMuCiAKK2NvbmZpZyBMRURTX1dNODM1MAorCXRyaXN0YXRlICJMRUQgU3VwcG9ydCBmb3IgV004MzUwIEF1ZGlvUGx1cyBQTUlDIgorCWRlcGVuZHMgb24gTEVEU19DTEFTUyAmJiBNRkRfV004MzUwCisJaGVscAorCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBzdXBwb3J0IGZvciBMRURzIGRyaXZlbiBieSB0aGUgV29sZnNvbgorCSAgTWljcm9lbGVjdHJvbmljcyBXTTgzNTAgQXVkaW9QbHVzIFBNSUMuCisKIGNvbmZpZyBMRURTX0RBOTAzWAogCXRyaXN0YXRlICJMRUQgU3VwcG9ydCBmb3IgREE5MDMwL0RBOTAzNCBQTUlDIgogCWRlcGVuZHMgb24gTEVEU19DTEFTUyAmJiBQTUlDX0RBOTAzWApkaWZmIC0tZ2l0IGEvZHJpdmVycy9sZWRzL01ha2VmaWxlIGIvZHJpdmVycy9sZWRzL01ha2VmaWxlCmluZGV4IGUxOTY3YTIuLjlkNzZmMGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbGVkcy9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2xlZHMvTWFrZWZpbGUKQEAgLTExLDYgKzExLDcgQEAKIG9iai0kKENPTkZJR19MRURTX0FNU19ERUxUQSkJCSs9IGxlZHMtYW1zLWRlbHRhLm8KIG9iai0kKENPTkZJR19MRURTX05FVDQ4WFgpCQkrPSBsZWRzLW5ldDQ4eHgubwogb2JqLSQoQ09ORklHX0xFRFNfV1JBUCkJCQkrPSBsZWRzLXdyYXAubworb2JqLSQoQ09ORklHX0xFRFNfQUxJWDIpCQkrPSBsZWRzLWFsaXgyLm8KIG9iai0kKENPTkZJR19MRURTX0gxOTQwKQkJKz0gbGVkcy1oMTk0MC5vCiBvYmotJChDT05GSUdfTEVEU19DT0JBTFRfUVVCRSkJCSs9IGxlZHMtY29iYWx0LXF1YmUubwogb2JqLSQoQ09ORklHX0xFRFNfQ09CQUxUX1JBUSkJCSs9IGxlZHMtY29iYWx0LXJhcS5vCkBAIC0yMiw3ICsyMyw3IEBACiBvYmotJChDT05GSUdfTEVEU19GU0cpCQkJKz0gbGVkcy1mc2cubwogb2JqLSQoQ09ORklHX0xFRFNfUENBOTU1WCkJCSs9IGxlZHMtcGNhOTU1eC5vCiBvYmotJChDT05GSUdfTEVEU19EQTkwM1gpCQkrPSBsZWRzLWRhOTAzeC5vCi1vYmotJChDT05GSUdfTEVEU19IUF9ESVNLKQkJKz0gbGVkcy1ocC1kaXNrLm8KK29iai0kKENPTkZJR19MRURTX1dNODM1MCkJCSs9IGxlZHMtd204MzUwLm8KIAogIyBMRUQgVHJpZ2dlcnMKIG9iai0kKENPTkZJR19MRURTX1RSSUdHRVJfVElNRVIpCSs9IGxlZHRyaWctdGltZXIubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9sZWRzL2xlZC1jbGFzcy5jIGIvZHJpdmVycy9sZWRzL2xlZC1jbGFzcy5jCmluZGV4IDZjNGEzMjYuLjUyZjgyZTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbGVkcy9sZWQtY2xhc3MuYworKysgYi9kcml2ZXJzL2xlZHMvbGVkLWNsYXNzLmMKQEAgLTkxLDkgKzkxLDI5IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChsZWRfY2xhc3NkZXZfcmVzdW1lKTsKIAorc3RhdGljIGludCBsZWRfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3sKKwlzdHJ1Y3QgbGVkX2NsYXNzZGV2ICpsZWRfY2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCisJaWYgKGxlZF9jZGV2LT5mbGFncyAmIExFRF9DT1JFX1NVU1BFTkRSRVNVTUUpCisJCWxlZF9jbGFzc2Rldl9zdXNwZW5kKGxlZF9jZGV2KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGxlZF9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBsZWRfY2xhc3NkZXYgKmxlZF9jZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisKKwlpZiAobGVkX2NkZXYtPmZsYWdzICYgTEVEX0NPUkVfU1VTUEVORFJFU1VNRSkKKwkJbGVkX2NsYXNzZGV2X3Jlc3VtZShsZWRfY2Rldik7CisKKwlyZXR1cm4gMDsKK30KKwogLyoqCiAgKiBsZWRfY2xhc3NkZXZfcmVnaXN0ZXIgLSByZWdpc3RlciBhIG5ldyBvYmplY3Qgb2YgbGVkX2NsYXNzZGV2IGNsYXNzLgotICogQGRldjogVGhlIGRldmljZSB0byByZWdpc3Rlci4KKyAqIEBwYXJlbnQ6IFRoZSBkZXZpY2UgdG8gcmVnaXN0ZXIuCiAgKiBAbGVkX2NkZXY6IHRoZSBsZWRfY2xhc3NkZXYgc3RydWN0dXJlIGZvciB0aGlzIGRldmljZS4KICAqLwogaW50IGxlZF9jbGFzc2Rldl9yZWdpc3RlcihzdHJ1Y3QgZGV2aWNlICpwYXJlbnQsIHN0cnVjdCBsZWRfY2xhc3NkZXYgKmxlZF9jZGV2KQpAQCAtMTc0LDYgKzE5NCw4IEBACiAJbGVkc19jbGFzcyA9IGNsYXNzX2NyZWF0ZShUSElTX01PRFVMRSwgImxlZHMiKTsKIAlpZiAoSVNfRVJSKGxlZHNfY2xhc3MpKQogCQlyZXR1cm4gUFRSX0VSUihsZWRzX2NsYXNzKTsKKwlsZWRzX2NsYXNzLT5zdXNwZW5kID0gbGVkX3N1c3BlbmQ7CisJbGVkc19jbGFzcy0+cmVzdW1lID0gbGVkX3Jlc3VtZTsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9sZWRzL2xlZHMtYWxpeDIuYyBiL2RyaXZlcnMvbGVkcy9sZWRzLWFsaXgyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGRiZDc3MwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbGVkcy9sZWRzLWFsaXgyLmMKQEAgLTAsMCArMSwxODEgQEAKKy8qCisgKiBMRURzIGRyaXZlciBmb3IgUENFbmdpbmVzIEFMSVguMiBhbmQgQUxJWC4zCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA4IENvbnN0YW50aW4gQmFyYW5vdiA8Y29uc3RAbWltYXMucnU+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbGVkcy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorCitzdGF0aWMgaW50IGZvcmNlID0gMDsKK21vZHVsZV9wYXJhbShmb3JjZSwgYm9vbCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGZvcmNlLCAiQXNzdW1lIHN5c3RlbSBoYXMgQUxJWC4yIHN0eWxlIExFRHMiKTsKKworc3RydWN0IGFsaXhfbGVkIHsKKwlzdHJ1Y3QgbGVkX2NsYXNzZGV2IGNkZXY7CisJdW5zaWduZWQgc2hvcnQgcG9ydDsKKwl1bnNpZ25lZCBpbnQgb25fdmFsdWU7CisJdW5zaWduZWQgaW50IG9mZl92YWx1ZTsKK307CisKK3N0YXRpYyB2b2lkIGFsaXhfbGVkX3NldChzdHJ1Y3QgbGVkX2NsYXNzZGV2ICpsZWRfY2RldiwKKwkJCSBlbnVtIGxlZF9icmlnaHRuZXNzIGJyaWdodG5lc3MpCit7CisJc3RydWN0IGFsaXhfbGVkICpsZWRfZGV2ID0KKwkJY29udGFpbmVyX29mKGxlZF9jZGV2LCBzdHJ1Y3QgYWxpeF9sZWQsIGNkZXYpOworCisJaWYgKGJyaWdodG5lc3MpCisJCW91dGwobGVkX2Rldi0+b25fdmFsdWUsIGxlZF9kZXYtPnBvcnQpOworCWVsc2UKKwkJb3V0bChsZWRfZGV2LT5vZmZfdmFsdWUsIGxlZF9kZXYtPnBvcnQpOworfQorCitzdGF0aWMgc3RydWN0IGFsaXhfbGVkIGFsaXhfbGVkc1tdID0geworCXsKKwkJLmNkZXYgPSB7CisJCQkubmFtZSA9ICJhbGl4OjEiLAorCQkJLmJyaWdodG5lc3Nfc2V0ID0gYWxpeF9sZWRfc2V0LAorCQl9LAorCQkucG9ydCA9IDB4NjEwMCwKKwkJLm9uX3ZhbHVlID0gMSA8PCAyMiwKKwkJLm9mZl92YWx1ZSA9IDEgPDwgNiwKKwl9LAorCXsKKwkJLmNkZXYgPSB7CisJCQkubmFtZSA9ICJhbGl4OjIiLAorCQkJLmJyaWdodG5lc3Nfc2V0ID0gYWxpeF9sZWRfc2V0LAorCQl9LAorCQkucG9ydCA9IDB4NjE4MCwKKwkJLm9uX3ZhbHVlID0gMSA8PCAyNSwKKwkJLm9mZl92YWx1ZSA9IDEgPDwgOSwKKwl9LAorCXsKKwkJLmNkZXYgPSB7CisJCQkubmFtZSA9ICJhbGl4OjMiLAorCQkJLmJyaWdodG5lc3Nfc2V0ID0gYWxpeF9sZWRfc2V0LAorCQl9LAorCQkucG9ydCA9IDB4NjE4MCwKKwkJLm9uX3ZhbHVlID0gMSA8PCAyNywKKwkJLm9mZl92YWx1ZSA9IDEgPDwgMTEsCisJfSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGFsaXhfbGVkX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJaW50IGk7CisJaW50IHJldDsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGFsaXhfbGVkcyk7IGkrKykgeworCQlhbGl4X2xlZHNbaV0uY2Rldi5mbGFncyB8PSBMRURfQ09SRV9TVVNQRU5EUkVTVU1FOworCQlyZXQgPSBsZWRfY2xhc3NkZXZfcmVnaXN0ZXIoJnBkZXYtPmRldiwgJmFsaXhfbGVkc1tpXS5jZGV2KTsKKwkJaWYgKHJldCA8IDApCisJCQlnb3RvIGZhaWw7CisJfQorCXJldHVybiAwOworCitmYWlsOgorCXdoaWxlICgtLWkgPj0gMCkKKwkJbGVkX2NsYXNzZGV2X3VucmVnaXN0ZXIoJmFsaXhfbGVkc1tpXS5jZGV2KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGFsaXhfbGVkX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoYWxpeF9sZWRzKTsgaSsrKQorCQlsZWRfY2xhc3NkZXZfdW5yZWdpc3RlcigmYWxpeF9sZWRzW2ldLmNkZXYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBhbGl4X2xlZF9kcml2ZXIgPSB7CisJLnJlbW92ZSA9IGFsaXhfbGVkX3JlbW92ZSwKKwkuZHJpdmVyID0geworCQkubmFtZSA9IEtCVUlMRF9NT0ROQU1FLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwl9LAorfTsKKworc3RhdGljIGludCBfX2luaXQgYWxpeF9wcmVzZW50KHZvaWQpCit7CisJY29uc3QgdW5zaWduZWQgbG9uZyBiaW9zX3BoeXMgPSAweDAwMGYwMDAwOworCWNvbnN0IHNpemVfdCBiaW9zX2xlbiA9IDB4MDAwMTAwMDA7CisJY29uc3QgY2hhciBhbGl4X3NpZ1tdID0gIlBDIEVuZ2luZXMgQUxJWC4iOworCWNvbnN0IHNpemVfdCBhbGl4X3NpZ19sZW4gPSBzaXplb2YoYWxpeF9zaWcpIC0gMTsKKworCWNvbnN0IGNoYXIgKmJpb3NfdmlydDsKKwljb25zdCBjaGFyICpzY2FuX2VuZDsKKwljb25zdCBjaGFyICpwOworCWludCByZXQgPSAwOworCisJaWYgKGZvcmNlKSB7CisJCXByaW50ayhLRVJOX05PVElDRSAiJXM6IGZvcmNlZCB0byBza2lwIEJJT1MgdGVzdCwgIgorCQkgICAgICAgImFzc3VtZSBzeXN0ZW0gaGFzIEFMSVguMiBzdHlsZSBMRURzXG4iLAorCQkgICAgICAgS0JVSUxEX01PRE5BTUUpOworCQlyZXQgPSAxOworCQlnb3RvIG91dDsKKwl9CisKKwliaW9zX3ZpcnQgPSBwaHlzX3RvX3ZpcnQoYmlvc19waHlzKTsKKwlzY2FuX2VuZCA9IGJpb3NfdmlydCArIGJpb3NfbGVuIC0gKGFsaXhfc2lnX2xlbiArIDIpOworCWZvciAocCA9IGJpb3NfdmlydDsgcCA8IHNjYW5fZW5kOyBwKyspIHsKKwkJY29uc3QgY2hhciAqdGFpbDsKKworCQlpZiAobWVtY21wKHAsIGFsaXhfc2lnLCBhbGl4X3NpZ19sZW4pICE9IDApIHsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJdGFpbCA9IHAgKyBhbGl4X3NpZ19sZW47CisJCWlmICgodGFpbFswXSA9PSAnMicgfHwgdGFpbFswXSA9PSAnMycpICYmIHRhaWxbMV0gPT0gJ1wwJykgeworCQkJcHJpbnRrKEtFUk5fSU5GTworCQkJICAgICAgICIlczogc3lzdGVtIGlzIHJlY29nbml6ZWQgYXMgXCIlc1wiXG4iLAorCQkJICAgICAgIEtCVUlMRF9NT0ROQU1FLCBwKTsKKwkJCXJldCA9IDE7CisJCQlicmVhazsKKwkJfQorCX0KKworb3V0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2OworCitzdGF0aWMgaW50IF9faW5pdCBhbGl4X2xlZF9pbml0KHZvaWQpCit7CisJaW50IHJldDsKKworCWlmICghYWxpeF9wcmVzZW50KCkpIHsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBvdXQ7CisJfQorCisJcGRldiA9IHBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcl9zaW1wbGUoS0JVSUxEX01PRE5BTUUsIC0xLCBOVUxMLCAwKTsKKwlpZiAoIUlTX0VSUihwZGV2KSkgeworCQlyZXQgPSBwbGF0Zm9ybV9kcml2ZXJfcHJvYmUoJmFsaXhfbGVkX2RyaXZlciwgYWxpeF9sZWRfcHJvYmUpOworCQlpZiAocmV0KQorCQkJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIocGRldik7CisJfSBlbHNlCisJCXJldCA9IFBUUl9FUlIocGRldik7CisKK291dDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgYWxpeF9sZWRfZXhpdCh2b2lkKQoreworCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKHBkZXYpOworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZhbGl4X2xlZF9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChhbGl4X2xlZF9pbml0KTsKK21vZHVsZV9leGl0KGFsaXhfbGVkX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJDb25zdGFudGluIEJhcmFub3YgPGNvbnN0QG1pbWFzLnJ1PiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJQQ0VuZ2luZXMgQUxJWC4yIGFuZCBBTElYLjMgTEVEIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9sZWRzL2xlZHMtYW1zLWRlbHRhLmMgYi9kcml2ZXJzL2xlZHMvbGVkcy1hbXMtZGVsdGEuYwppbmRleCAxYmQ1OTBiLi40NDYwNTA3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2xlZHMvbGVkcy1hbXMtZGVsdGEuYworKysgYi9kcml2ZXJzL2xlZHMvbGVkcy1hbXMtZGVsdGEuYwpAQCAtNzksMzcgKzc5LDEyIEBACiAJfSwKIH07CiAKLSNpZmRlZiBDT05GSUdfUE0KLXN0YXRpYyBpbnQgYW1zX2RlbHRhX2xlZF9zdXNwZW5kKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldiwKLQkJcG1fbWVzc2FnZV90IHN0YXRlKQotewotCWludCBpOwotCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoYW1zX2RlbHRhX2xlZHMpOyBpKyspCi0JCWxlZF9jbGFzc2Rldl9zdXNwZW5kKCZhbXNfZGVsdGFfbGVkc1tpXS5jZGV2KTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGFtc19kZWx0YV9sZWRfcmVzdW1lKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKLXsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGFtc19kZWx0YV9sZWRzKTsgaSsrKQotCQlsZWRfY2xhc3NkZXZfcmVzdW1lKCZhbXNfZGVsdGFfbGVkc1tpXS5jZGV2KTsKLQotCXJldHVybiAwOwotfQotI2Vsc2UKLSNkZWZpbmUgYW1zX2RlbHRhX2xlZF9zdXNwZW5kIE5VTEwKLSNkZWZpbmUgYW1zX2RlbHRhX2xlZF9yZXN1bWUgTlVMTAotI2VuZGlmCi0KIHN0YXRpYyBpbnQgYW1zX2RlbHRhX2xlZF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCWludCBpLCByZXQ7CiAKIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShhbXNfZGVsdGFfbGVkcyk7IGkrKykgeworCQlhbXNfZGVsdGFfbGVkc1tpXS5jZGV2LmZsYWdzIHw9IExFRF9DT1JFX1NVU1BFTkRSRVNVTUU7CiAJCXJldCA9IGxlZF9jbGFzc2Rldl9yZWdpc3RlcigmcGRldi0+ZGV2LAogCQkJCSZhbXNfZGVsdGFfbGVkc1tpXS5jZGV2KTsKIAkJaWYgKHJldCA8IDApCkBAIC0xMjcsNyArMTAyLDcgQEAKIHsKIAlpbnQgaTsKIAotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGFtc19kZWx0YV9sZWRzKTsgaS0tKQorCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGFtc19kZWx0YV9sZWRzKTsgaSsrKQogCQlsZWRfY2xhc3NkZXZfdW5yZWdpc3RlcigmYW1zX2RlbHRhX2xlZHNbaV0uY2Rldik7CiAKIAlyZXR1cm4gMDsKQEAgLTEzNiw4ICsxMTEsNiBAQAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgYW1zX2RlbHRhX2xlZF9kcml2ZXIgPSB7CiAJLnByb2JlCQk9IGFtc19kZWx0YV9sZWRfcHJvYmUsCiAJLnJlbW92ZQkJPSBhbXNfZGVsdGFfbGVkX3JlbW92ZSwKLQkuc3VzcGVuZAk9IGFtc19kZWx0YV9sZWRfc3VzcGVuZCwKLQkucmVzdW1lCQk9IGFtc19kZWx0YV9sZWRfcmVzdW1lLAogCS5kcml2ZXIJCT0gewogCQkubmFtZSA9ICJhbXMtZGVsdGEtbGVkIiwKIAkJLm93bmVyID0gVEhJU19NT0RVTEUsCkBAIC0xNTEsNyArMTI0LDcgQEAKIAogc3RhdGljIHZvaWQgX19leGl0IGFtc19kZWx0YV9sZWRfZXhpdCh2b2lkKQogewotCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmYW1zX2RlbHRhX2xlZF9kcml2ZXIpOworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZhbXNfZGVsdGFfbGVkX2RyaXZlcik7CiB9CiAKIG1vZHVsZV9pbml0KGFtc19kZWx0YV9sZWRfaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2xlZHMvbGVkcy1jbGV2by1tYWlsLmMgYi9kcml2ZXJzL2xlZHMvbGVkcy1jbGV2by1tYWlsLmMKaW5kZXggZWIzNDE1ZS4uMTgxM2M4NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9sZWRzL2xlZHMtY2xldm8tbWFpbC5jCisrKyBiL2RyaXZlcnMvbGVkcy9sZWRzLWNsZXZvLW1haWwuYwpAQCAtMTQyLDYgKzE0Miw3IEBACiAJLm5hbWUJCQk9ICJjbGV2bzo6bWFpbCIsCiAJLmJyaWdodG5lc3Nfc2V0CQk9IGNsZXZvX21haWxfbGVkX3NldCwKIAkuYmxpbmtfc2V0CQk9IGNsZXZvX21haWxfbGVkX2JsaW5rLAorCS5mbGFncwkJCT0gTEVEX0NPUkVfU1VTUEVORFJFU1VNRSwKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IGNsZXZvX21haWxfbGVkX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCkBAIC0xNTUsMjkgKzE1Niw5IEBACiAJcmV0dXJuIDA7CiB9CiAKLSNpZmRlZiBDT05GSUdfUE0KLXN0YXRpYyBpbnQgY2xldm9fbWFpbF9sZWRfc3VzcGVuZChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYsCi0JCQkJICBwbV9tZXNzYWdlX3Qgc3RhdGUpCi17Ci0JbGVkX2NsYXNzZGV2X3N1c3BlbmQoJmNsZXZvX21haWxfbGVkKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBjbGV2b19tYWlsX2xlZF9yZXN1bWUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQotewotCWxlZF9jbGFzc2Rldl9yZXN1bWUoJmNsZXZvX21haWxfbGVkKTsKLQlyZXR1cm4gMDsKLX0KLSNlbHNlCi0jZGVmaW5lIGNsZXZvX21haWxfbGVkX3N1c3BlbmQgICAgTlVMTAotI2RlZmluZSBjbGV2b19tYWlsX2xlZF9yZXN1bWUgICAgIE5VTEwKLSNlbmRpZgotCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBjbGV2b19tYWlsX2xlZF9kcml2ZXIgPSB7CiAJLnByb2JlCQk9IGNsZXZvX21haWxfbGVkX3Byb2JlLAogCS5yZW1vdmUJCT0gY2xldm9fbWFpbF9sZWRfcmVtb3ZlLAotCS5zdXNwZW5kCT0gY2xldm9fbWFpbF9sZWRfc3VzcGVuZCwKLQkucmVzdW1lCQk9IGNsZXZvX21haWxfbGVkX3Jlc3VtZSwKIAkuZHJpdmVyCQk9IHsKIAkJLm5hbWUJCT0gS0JVSUxEX01PRE5BTUUsCiAJCS5vd25lcgkJPSBUSElTX01PRFVMRSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbGVkcy9sZWRzLWZzZy5jIGIvZHJpdmVycy9sZWRzL2xlZHMtZnNnLmMKaW5kZXggMzQ5MzUxNS4uNWY3YzljNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9sZWRzL2xlZHMtZnNnLmMKKysrIGIvZHJpdmVycy9sZWRzL2xlZHMtZnNnLmMKQEAgLTk5LDY0ICs5OSw0MyBAQAogfQogCiAKLQogc3RhdGljIHN0cnVjdCBsZWRfY2xhc3NkZXYgZnNnX3dsYW5fbGVkID0gewogCS5uYW1lCQkJPSAiZnNnOmJsdWU6d2xhbiIsCiAJLmJyaWdodG5lc3Nfc2V0CQk9IGZzZ19sZWRfd2xhbl9zZXQsCisJLmZsYWdzCQkJPSBMRURfQ09SRV9TVVNQRU5EUkVTVU1FLAogfTsKIAogc3RhdGljIHN0cnVjdCBsZWRfY2xhc3NkZXYgZnNnX3dhbl9sZWQgPSB7CiAJLm5hbWUJCQk9ICJmc2c6Ymx1ZTp3YW4iLAogCS5icmlnaHRuZXNzX3NldAkJPSBmc2dfbGVkX3dhbl9zZXQsCisJLmZsYWdzCQkJPSBMRURfQ09SRV9TVVNQRU5EUkVTVU1FLAogfTsKIAogc3RhdGljIHN0cnVjdCBsZWRfY2xhc3NkZXYgZnNnX3NhdGFfbGVkID0gewogCS5uYW1lCQkJPSAiZnNnOmJsdWU6c2F0YSIsCiAJLmJyaWdodG5lc3Nfc2V0CQk9IGZzZ19sZWRfc2F0YV9zZXQsCisJLmZsYWdzCQkJPSBMRURfQ09SRV9TVVNQRU5EUkVTVU1FLAogfTsKIAogc3RhdGljIHN0cnVjdCBsZWRfY2xhc3NkZXYgZnNnX3VzYl9sZWQgPSB7CiAJLm5hbWUJCQk9ICJmc2c6Ymx1ZTp1c2IiLAogCS5icmlnaHRuZXNzX3NldAkJPSBmc2dfbGVkX3VzYl9zZXQsCisJLmZsYWdzCQkJPSBMRURfQ09SRV9TVVNQRU5EUkVTVU1FLAogfTsKIAogc3RhdGljIHN0cnVjdCBsZWRfY2xhc3NkZXYgZnNnX3N5bmNfbGVkID0gewogCS5uYW1lCQkJPSAiZnNnOmJsdWU6c3luYyIsCiAJLmJyaWdodG5lc3Nfc2V0CQk9IGZzZ19sZWRfc3luY19zZXQsCisJLmZsYWdzCQkJPSBMRURfQ09SRV9TVVNQRU5EUkVTVU1FLAogfTsKIAogc3RhdGljIHN0cnVjdCBsZWRfY2xhc3NkZXYgZnNnX3JpbmdfbGVkID0gewogCS5uYW1lCQkJPSAiZnNnOmJsdWU6cmluZyIsCiAJLmJyaWdodG5lc3Nfc2V0CQk9IGZzZ19sZWRfcmluZ19zZXQsCisJLmZsYWdzCQkJPSBMRURfQ09SRV9TVVNQRU5EUkVTVU1FLAogfTsKIAogCi0KLSNpZmRlZiBDT05GSUdfUE0KLXN0YXRpYyBpbnQgZnNnX2xlZF9zdXNwZW5kKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQotewotCWxlZF9jbGFzc2Rldl9zdXNwZW5kKCZmc2dfd2xhbl9sZWQpOwotCWxlZF9jbGFzc2Rldl9zdXNwZW5kKCZmc2dfd2FuX2xlZCk7Ci0JbGVkX2NsYXNzZGV2X3N1c3BlbmQoJmZzZ19zYXRhX2xlZCk7Ci0JbGVkX2NsYXNzZGV2X3N1c3BlbmQoJmZzZ191c2JfbGVkKTsKLQlsZWRfY2xhc3NkZXZfc3VzcGVuZCgmZnNnX3N5bmNfbGVkKTsKLQlsZWRfY2xhc3NkZXZfc3VzcGVuZCgmZnNnX3JpbmdfbGVkKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBmc2dfbGVkX3Jlc3VtZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCi17Ci0JbGVkX2NsYXNzZGV2X3Jlc3VtZSgmZnNnX3dsYW5fbGVkKTsKLQlsZWRfY2xhc3NkZXZfcmVzdW1lKCZmc2dfd2FuX2xlZCk7Ci0JbGVkX2NsYXNzZGV2X3Jlc3VtZSgmZnNnX3NhdGFfbGVkKTsKLQlsZWRfY2xhc3NkZXZfcmVzdW1lKCZmc2dfdXNiX2xlZCk7Ci0JbGVkX2NsYXNzZGV2X3Jlc3VtZSgmZnNnX3N5bmNfbGVkKTsKLQlsZWRfY2xhc3NkZXZfcmVzdW1lKCZmc2dfcmluZ19sZWQpOwotCXJldHVybiAwOwotfQotI2VuZGlmCi0KLQogc3RhdGljIGludCBmc2dfbGVkX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJaW50IHJldDsKQEAgLTIzMiwxMCArMjExLDYgQEAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGZzZ19sZWRfZHJpdmVyID0gewogCS5wcm9iZQkJPSBmc2dfbGVkX3Byb2JlLAogCS5yZW1vdmUJCT0gZnNnX2xlZF9yZW1vdmUsCi0jaWZkZWYgQ09ORklHX1BNCi0JLnN1c3BlbmQJPSBmc2dfbGVkX3N1c3BlbmQsCi0JLnJlc3VtZQkJPSBmc2dfbGVkX3Jlc3VtZSwKLSNlbmRpZgogCS5kcml2ZXIJCT0gewogCQkubmFtZQkJPSAiZnNnLWxlZCIsCiAJfSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbGVkcy9sZWRzLWdwaW8uYyBiL2RyaXZlcnMvbGVkcy9sZWRzLWdwaW8uYwppbmRleCBiMTNiZDI5Li4yZTNkZjA4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2xlZHMvbGVkcy1ncGlvLmMKKysrIGIvZHJpdmVycy9sZWRzL2xlZHMtZ3Bpby5jCkBAIC0xMDUsNiArMTA1LDcgQEAKIAkJfQogCQlsZWRfZGF0LT5jZGV2LmJyaWdodG5lc3Nfc2V0ID0gZ3Bpb19sZWRfc2V0OwogCQlsZWRfZGF0LT5jZGV2LmJyaWdodG5lc3MgPSBMRURfT0ZGOworCQlsZWRfZGF0LT5jZGV2LmZsYWdzIHw9IExFRF9DT1JFX1NVU1BFTkRSRVNVTUU7CiAKIAkJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KGxlZF9kYXQtPmdwaW8sIGxlZF9kYXQtPmFjdGl2ZV9sb3cpOwogCkBAIC0xNTQsNDQgKzE1NSw5IEBACiAJcmV0dXJuIDA7CiB9CiAKLSNpZmRlZiBDT05GSUdfUE0KLXN0YXRpYyBpbnQgZ3Bpb19sZWRfc3VzcGVuZChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCi17Ci0Jc3RydWN0IGdwaW9fbGVkX3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7Ci0Jc3RydWN0IGdwaW9fbGVkX2RhdGEgKmxlZHNfZGF0YTsKLQlpbnQgaTsKLQotCWxlZHNfZGF0YSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwotCi0JZm9yIChpID0gMDsgaSA8IHBkYXRhLT5udW1fbGVkczsgaSsrKQotCQlsZWRfY2xhc3NkZXZfc3VzcGVuZCgmbGVkc19kYXRhW2ldLmNkZXYpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgZ3Bpb19sZWRfcmVzdW1lKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0Jc3RydWN0IGdwaW9fbGVkX3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7Ci0Jc3RydWN0IGdwaW9fbGVkX2RhdGEgKmxlZHNfZGF0YTsKLQlpbnQgaTsKLQotCWxlZHNfZGF0YSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwotCi0JZm9yIChpID0gMDsgaSA8IHBkYXRhLT5udW1fbGVkczsgaSsrKQotCQlsZWRfY2xhc3NkZXZfcmVzdW1lKCZsZWRzX2RhdGFbaV0uY2Rldik7Ci0KLQlyZXR1cm4gMDsKLX0KLSNlbHNlCi0jZGVmaW5lIGdwaW9fbGVkX3N1c3BlbmQgTlVMTAotI2RlZmluZSBncGlvX2xlZF9yZXN1bWUgTlVMTAotI2VuZGlmCi0KIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGdwaW9fbGVkX2RyaXZlciA9IHsKIAkucHJvYmUJCT0gZ3Bpb19sZWRfcHJvYmUsCiAJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChncGlvX2xlZF9yZW1vdmUpLAotCS5zdXNwZW5kCT0gZ3Bpb19sZWRfc3VzcGVuZCwKLQkucmVzdW1lCQk9IGdwaW9fbGVkX3Jlc3VtZSwKIAkuZHJpdmVyCQk9IHsKIAkJLm5hbWUJPSAibGVkcy1ncGlvIiwKIAkJLm93bmVyCT0gVEhJU19NT0RVTEUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2xlZHMvbGVkcy1ocC1kaXNrLmMgYi9kcml2ZXJzL2xlZHMvbGVkcy1ocC1kaXNrLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0ZmE3NTcuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9sZWRzL2xlZHMtaHAtZGlzay5jCisrKyAvZGV2L251bGwKQEAgLTEsMTU1ICswLDAgQEAKLS8qCi0gKiAgbGVkcy1ocC1kaXNrLmMgLSBkcml2ZXIgZm9yIEhQICJoYXJkIGRpc2sgcHJvdGVjdGlvbiIgTEVECi0gKgotICogIENvcHlyaWdodCAoQykgMjAwOCBQYXZlbCBNYWNoZWsKLSAqCi0gKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKLSAqLwotCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L2RtaS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KLSNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+Ci0jaW5jbHVkZSA8bGludXgvbGVkcy5oPgotI2luY2x1ZGUgPGFjcGkvYWNwaV9kcml2ZXJzLmg+Ci0KLSNkZWZpbmUgRFJJVkVSX05BTUUgICAgICJsZWRzLWhwLWRpc2siCi0jZGVmaW5lIEFDUElfTURQU19DTEFTUyAibGVkIgotCi0vKiBGb3IgYXV0b21hdGljIGluc2VydGlvbiBvZiB0aGUgbW9kdWxlICovCi1zdGF0aWMgc3RydWN0IGFjcGlfZGV2aWNlX2lkIGhwbGVkX2RldmljZV9pZHNbXSA9IHsKLQl7IkhQUTAwMDQiLCAwfSwgLyogSFAgTW9iaWxlIERhdGEgUHJvdGVjdGlvbiBTeXN0ZW0gUE5QICovCi0JeyIiLCAwfSwKLX07Ci1NT0RVTEVfREVWSUNFX1RBQkxFKGFjcGksIGhwbGVkX2RldmljZV9pZHMpOwotCi1zdHJ1Y3QgYWNwaV9ocGxlZCB7Ci0Jc3RydWN0IGFjcGlfZGV2aWNlCSpkZXZpY2U7ICAgLyogVGhlIEFDUEkgZGV2aWNlICovCi19OwotCi1zdGF0aWMgc3RydWN0IGFjcGlfaHBsZWQgYWRldjsKLQotc3RhdGljIGFjcGlfc3RhdHVzIGhwbGVkX2FjcGlfd3JpdGUoYWNwaV9oYW5kbGUgaGFuZGxlLCBpbnQgcmVnKQotewotCXVuc2lnbmVkIGxvbmcgbG9uZyByZXQ7IC8qIE5vdCB1c2VkIHdoZW4gd3JpdGluZyAqLwotCXVuaW9uIGFjcGlfb2JqZWN0IGluX29ialsxXTsKLQlzdHJ1Y3QgYWNwaV9vYmplY3RfbGlzdCBhcmdzID0geyAxLCBpbl9vYmogfTsKLQotCWluX29ialswXS50eXBlICAgICAgICAgID0gQUNQSV9UWVBFX0lOVEVHRVI7Ci0JaW5fb2JqWzBdLmludGVnZXIudmFsdWUgPSByZWc7Ci0KLQlyZXR1cm4gYWNwaV9ldmFsdWF0ZV9pbnRlZ2VyKGhhbmRsZSwgIkFMRUQiLCAmYXJncywgJnJldCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGhwbGVkX3NldChzdHJ1Y3QgbGVkX2NsYXNzZGV2ICpsZWRfY2RldiwKLQkJCSAgICAgICBlbnVtIGxlZF9icmlnaHRuZXNzIHZhbHVlKQotewotCWhwbGVkX2FjcGlfd3JpdGUoYWRldi5kZXZpY2UtPmhhbmRsZSwgISF2YWx1ZSk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgbGVkX2NsYXNzZGV2IGhwbGVkX2xlZCA9IHsKLQkubmFtZQkJCT0gImhwOnJlZDpoZGRwcm90ZWN0aW9uIiwKLQkuZGVmYXVsdF90cmlnZ2VyCT0gImhlYXJ0YmVhdCIsCi0JLmJyaWdodG5lc3Nfc2V0CQk9IGhwbGVkX3NldCwKLX07Ci0KLSNpZmRlZiBDT05GSUdfUE0KLXN0YXRpYyBpbnQgaHBsZWRfc3VzcGVuZChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQotewotCWxlZF9jbGFzc2Rldl9zdXNwZW5kKCZocGxlZF9sZWQpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGhwbGVkX3Jlc3VtZShzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldikKLXsKLQlsZWRfY2xhc3NkZXZfcmVzdW1lKCZocGxlZF9sZWQpOwotCXJldHVybiAwOwotfQotI2Vsc2UKLSNkZWZpbmUgaHBsZWRfc3VzcGVuZCBOVUxMCi0jZGVmaW5lIGhwbGVkX3Jlc3VtZSBOVUxMCi0jZW5kaWYKLQotc3RhdGljIGludCBocGxlZF9hZGQoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpCi17Ci0JaW50IHJldDsKLQotCWlmICghZGV2aWNlKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWFkZXYuZGV2aWNlID0gZGV2aWNlOwotCXN0cmNweShhY3BpX2RldmljZV9uYW1lKGRldmljZSksIERSSVZFUl9OQU1FKTsKLQlzdHJjcHkoYWNwaV9kZXZpY2VfY2xhc3MoZGV2aWNlKSwgQUNQSV9NRFBTX0NMQVNTKTsKLQlkZXZpY2UtPmRyaXZlcl9kYXRhID0gJmFkZXY7Ci0KLQlyZXQgPSBsZWRfY2xhc3NkZXZfcmVnaXN0ZXIoTlVMTCwgJmhwbGVkX2xlZCk7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBocGxlZF9yZW1vdmUoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UsIGludCB0eXBlKQotewotCWlmICghZGV2aWNlKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWxlZF9jbGFzc2Rldl91bnJlZ2lzdGVyKCZocGxlZF9sZWQpOwotCXJldHVybiAwOwotfQotCi0KLQotc3RhdGljIHN0cnVjdCBhY3BpX2RyaXZlciBsZWRzX2hwX2RyaXZlciA9IHsKLQkubmFtZSAgPSBEUklWRVJfTkFNRSwKLQkuY2xhc3MgPSBBQ1BJX01EUFNfQ0xBU1MsCi0JLmlkcyAgID0gaHBsZWRfZGV2aWNlX2lkcywKLQkub3BzID0gewotCQkuYWRkICAgICA9IGhwbGVkX2FkZCwKLQkJLnJlbW92ZSAgPSBocGxlZF9yZW1vdmUsCi0JCS5zdXNwZW5kID0gaHBsZWRfc3VzcGVuZCwKLQkJLnJlc3VtZSAgPSBocGxlZF9yZXN1bWUsCi0JfQotfTsKLQotc3RhdGljIGludCBfX2luaXQgaHBsZWRfaW5pdF9tb2R1bGUodm9pZCkKLXsKLQlpbnQgcmV0OwotCi0JaWYgKGFjcGlfZGlzYWJsZWQpCi0JCXJldHVybiAtRU5PREVWOwotCi0JcmV0ID0gYWNwaV9idXNfcmVnaXN0ZXJfZHJpdmVyKCZsZWRzX2hwX2RyaXZlcik7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0KLQlwcmludGsoS0VSTl9JTkZPIERSSVZFUl9OQU1FICIgZHJpdmVyIGxvYWRlZC5cbiIpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBocGxlZF9leGl0X21vZHVsZSh2b2lkKQotewotCWFjcGlfYnVzX3VucmVnaXN0ZXJfZHJpdmVyKCZsZWRzX2hwX2RyaXZlcik7Ci19Ci0KLU1PRFVMRV9ERVNDUklQVElPTigiRHJpdmVyIGZvciBIUCBkaXNrIHByb3RlY3Rpb24gTEVEIik7Ci1NT0RVTEVfQVVUSE9SKCJQYXZlbCBNYWNoZWsgPHBhdmVsQHN1c2UuY3o+Iik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7Ci0KLW1vZHVsZV9pbml0KGhwbGVkX2luaXRfbW9kdWxlKTsKLW1vZHVsZV9leGl0KGhwbGVkX2V4aXRfbW9kdWxlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbGVkcy9sZWRzLWhwNnh4LmMgYi9kcml2ZXJzL2xlZHMvbGVkcy1ocDZ4eC5jCmluZGV4IGU4ZmIxYmEuLmU0Y2UxZmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbGVkcy9sZWRzLWhwNnh4LmMKKysrIGIvZHJpdmVycy9sZWRzL2xlZHMtaHA2eHguYwpAQCAtNDUsMzAgKzQ1LDE2IEBACiAJLm5hbWUJCQk9ICJocDZ4eDpyZWQiLAogCS5kZWZhdWx0X3RyaWdnZXIJPSAiaHA2eHgtY2hhcmdlIiwKIAkuYnJpZ2h0bmVzc19zZXQJCT0gaHA2eHhsZWRfcmVkX3NldCwKKwkuZmxhZ3MJCQk9IExFRF9DT1JFX1NVU1BFTkRSRVNVTUUsCiB9OwogCiBzdGF0aWMgc3RydWN0IGxlZF9jbGFzc2RldiBocDZ4eF9ncmVlbl9sZWQgPSB7CiAJLm5hbWUJCQk9ICJocDZ4eDpncmVlbiIsCiAJLmRlZmF1bHRfdHJpZ2dlcgk9ICJpZGUtZGlzayIsCiAJLmJyaWdodG5lc3Nfc2V0CQk9IGhwNnh4bGVkX2dyZWVuX3NldCwKKwkuZmxhZ3MJCQk9IExFRF9DT1JFX1NVU1BFTkRSRVNVTUUsCiB9OwogCi0jaWZkZWYgQ09ORklHX1BNCi1zdGF0aWMgaW50IGhwNnh4bGVkX3N1c3BlbmQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCi17Ci0JbGVkX2NsYXNzZGV2X3N1c3BlbmQoJmhwNnh4X3JlZF9sZWQpOwotCWxlZF9jbGFzc2Rldl9zdXNwZW5kKCZocDZ4eF9ncmVlbl9sZWQpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGhwNnh4bGVkX3Jlc3VtZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCi17Ci0JbGVkX2NsYXNzZGV2X3Jlc3VtZSgmaHA2eHhfcmVkX2xlZCk7Ci0JbGVkX2NsYXNzZGV2X3Jlc3VtZSgmaHA2eHhfZ3JlZW5fbGVkKTsKLQlyZXR1cm4gMDsKLX0KLSNlbmRpZgotCiBzdGF0aWMgaW50IGhwNnh4bGVkX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJaW50IHJldDsKQEAgLTk4LDEwICs4NCw2IEBACiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBocDZ4eGxlZF9kcml2ZXIgPSB7CiAJLnByb2JlCQk9IGhwNnh4bGVkX3Byb2JlLAogCS5yZW1vdmUJCT0gaHA2eHhsZWRfcmVtb3ZlLAotI2lmZGVmIENPTkZJR19QTQotCS5zdXNwZW5kCT0gaHA2eHhsZWRfc3VzcGVuZCwKLQkucmVzdW1lCQk9IGhwNnh4bGVkX3Jlc3VtZSwKLSNlbmRpZgogCS5kcml2ZXIJCT0gewogCQkubmFtZQkJPSAiaHA2eHgtbGVkIiwKIAkJLm93bmVyCQk9IFRISVNfTU9EVUxFLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9sZWRzL2xlZHMtbmV0NDh4eC5jIGIvZHJpdmVycy9sZWRzL2xlZHMtbmV0NDh4eC5jCmluZGV4IDA1NDM2MDQuLjkzOTg3YTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbGVkcy9sZWRzLW5ldDQ4eHguYworKysgYi9kcml2ZXJzL2xlZHMvbGVkcy1uZXQ0OHh4LmMKQEAgLTMzLDI2ICszMyw5IEBACiBzdGF0aWMgc3RydWN0IGxlZF9jbGFzc2RldiBuZXQ0OHh4X2Vycm9yX2xlZCA9IHsKIAkubmFtZQkJPSAibmV0NDh4eDo6ZXJyb3IiLAogCS5icmlnaHRuZXNzX3NldAk9IG5ldDQ4eHhfZXJyb3JfbGVkX3NldCwKKwkuZmxhZ3MJCT0gTEVEX0NPUkVfU1VTUEVORFJFU1VNRSwKIH07CiAKLSNpZmRlZiBDT05GSUdfUE0KLXN0YXRpYyBpbnQgbmV0NDh4eF9sZWRfc3VzcGVuZChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYsCi0JCXBtX21lc3NhZ2VfdCBzdGF0ZSkKLXsKLQlsZWRfY2xhc3NkZXZfc3VzcGVuZCgmbmV0NDh4eF9lcnJvcl9sZWQpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG5ldDQ4eHhfbGVkX3Jlc3VtZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCi17Ci0JbGVkX2NsYXNzZGV2X3Jlc3VtZSgmbmV0NDh4eF9lcnJvcl9sZWQpOwotCXJldHVybiAwOwotfQotI2Vsc2UKLSNkZWZpbmUgbmV0NDh4eF9sZWRfc3VzcGVuZCBOVUxMCi0jZGVmaW5lIG5ldDQ4eHhfbGVkX3Jlc3VtZSBOVUxMCi0jZW5kaWYKLQogc3RhdGljIGludCBuZXQ0OHh4X2xlZF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCXJldHVybiBsZWRfY2xhc3NkZXZfcmVnaXN0ZXIoJnBkZXYtPmRldiwgJm5ldDQ4eHhfZXJyb3JfbGVkKTsKQEAgLTY3LDggKzUwLDYgQEAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIG5ldDQ4eHhfbGVkX2RyaXZlciA9IHsKIAkucHJvYmUJCT0gbmV0NDh4eF9sZWRfcHJvYmUsCiAJLnJlbW92ZQkJPSBuZXQ0OHh4X2xlZF9yZW1vdmUsCi0JLnN1c3BlbmQJPSBuZXQ0OHh4X2xlZF9zdXNwZW5kLAotCS5yZXN1bWUJCT0gbmV0NDh4eF9sZWRfcmVzdW1lLAogCS5kcml2ZXIJCT0gewogCQkubmFtZQkJPSBEUlZOQU1FLAogCQkub3duZXIJCT0gVEhJU19NT0RVTEUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2xlZHMvbGVkcy1wY2E5NTMyLmMgYi9kcml2ZXJzL2xlZHMvbGVkcy1wY2E5NTMyLmMKaW5kZXggNDA2NGQ0Zi4uNzZlYzc0OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9sZWRzL2xlZHMtcGNhOTUzMi5jCisrKyBiL2RyaXZlcnMvbGVkcy9sZWRzLXBjYTk1MzIuYwpAQCAtMTYsNiArMTYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2xlZHMuaD4KICNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CiAjaW5jbHVkZSA8bGludXgvbGVkcy1wY2E5NTMyLmg+CiAKIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBub3JtYWxfaTJjW10gPSB7IC8qMHg2MCwqLyBJMkNfQ0xJRU5UX0VORH07CkBAIC0zNCw2ICszNSw3IEBACiAJc3RydWN0IHBjYTk1MzJfbGVkIGxlZHNbMTZdOwogCXN0cnVjdCBtdXRleCB1cGRhdGVfbG9jazsKIAlzdHJ1Y3QgaW5wdXRfZGV2ICAgICppZGV2OworICAgICAgIHN0cnVjdCB3b3JrX3N0cnVjdCB3b3JrOwogCXU4IHB3bVsyXTsKIAl1OCBwc2NbMl07CiB9OwpAQCAtNjMsNyArNjUsNyBAQAogICogYXMgYSBjb21wcm9taXNlIHdlIGF2ZXJhZ2Ugb25lIHB3bSB0byB0aGUgdmFsdWVzIHJlcXVlc3RlZCBieSBhbGwKICAqIGxlZHMgdGhhdCBhcmUgbm90IE9OL09GRi4KICAqICovCi1zdGF0aWMgaW50IHBjYTk1MzJfc2V0cHdtKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIGludCBwd20sIGludCBibGluaywKK3N0YXRpYyBpbnQgcGNhOTUzMl9jYWxjcHdtKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIGludCBwd20sIGludCBibGluaywKIAllbnVtIGxlZF9icmlnaHRuZXNzIHZhbHVlKQogewogCWludCBhID0gMCwgYiA9IDAsIGkgPSAwOwpAQCAtODQsMTEgKzg2LDE3IEBACiAJYiA9IGIvYTsKIAlpZiAoYiA+IDB4RkYpCiAJCXJldHVybiAtRUlOVkFMOwotCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKIAlkYXRhLT5wd21bcHdtXSA9IGI7CisgICAgICAgZGF0YS0+cHNjW3B3bV0gPSBibGluazsKKyAgICAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwY2E5NTMyX3NldHB3bShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBpbnQgcHdtKQoreworICAgICAgIHN0cnVjdCBwY2E5NTMyX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKyAgICAgICBtdXRleF9sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CiAJaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIFBDQTk1MzJfUkVHX1BXTShwd20pLAogCQlkYXRhLT5wd21bcHdtXSk7Ci0JZGF0YS0+cHNjW3B3bV0gPSBibGluazsKIAlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgUENBOTUzMl9SRUdfUFNDKHB3bSksCiAJCWRhdGEtPnBzY1twd21dKTsKIAltdXRleF91bmxvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKQEAgLTEyNCwxMSArMTMyLDExIEBACiAJCWxlZC0+c3RhdGUgPSBQQ0E5NTMyX09OOwogCWVsc2UgewogCQlsZWQtPnN0YXRlID0gUENBOTUzMl9QV00wOyAvKiBUaGVjdXM6IGhhcmRjb2RlIG9uZSBwd20gKi8KLQkJZXJyID0gcGNhOTUzMl9zZXRwd20obGVkLT5jbGllbnQsIDAsIDAsIHZhbHVlKTsKKyAgICAgICAgICAgICAgIGVyciA9IHBjYTk1MzJfY2FsY3B3bShsZWQtPmNsaWVudCwgMCwgMCwgdmFsdWUpOwogCQlpZiAoZXJyKQogCQkJcmV0dXJuOyAvKiBYWFg6IGxlZCBhcGkgZG9lc24ndCBhbGxvdyBlcnJvciBjb2RlPyAqLwogCX0KLQlwY2E5NTMyX3NldGxlZChsZWQpOworICAgICAgIHNjaGVkdWxlX3dvcmsoJmxlZC0+d29yayk7CiB9CiAKIHN0YXRpYyBpbnQgcGNhOTUzMl9zZXRfYmxpbmsoc3RydWN0IGxlZF9jbGFzc2RldiAqbGVkX2NkZXYsCkBAIC0xMzcsNiArMTQ1LDcgQEAKIAlzdHJ1Y3QgcGNhOTUzMl9sZWQgKmxlZCA9IGxkZXZfdG9fbGVkKGxlZF9jZGV2KTsKIAlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gbGVkLT5jbGllbnQ7CiAJaW50IHBzYzsKKyAgICAgICBpbnQgZXJyID0gMDsKIAogCWlmICgqZGVsYXlfb24gPT0gMCAmJiAqZGVsYXlfb2ZmID09IDApIHsKIAkvKiBsZWQgc3Vic3lzdGVtIGFzayB1cyBmb3IgYSBibGluayByYXRlICovCkBAIC0xNDgsMTEgKzE1NywxNSBAQAogCiAJLyogVGhlY3VzIHNwZWNpZmljOiBvbmx5IHVzZSBQU0MvUFdNIDAgKi8KIAlwc2MgPSAoKmRlbGF5X29uICogMTUyLTEpLzEwMDA7Ci0JcmV0dXJuIHBjYTk1MzJfc2V0cHdtKGNsaWVudCwgMCwgcHNjLCBsZWRfY2Rldi0+YnJpZ2h0bmVzcyk7CisgICAgICAgZXJyID0gcGNhOTUzMl9jYWxjcHdtKGNsaWVudCwgMCwgcHNjLCBsZWRfY2Rldi0+YnJpZ2h0bmVzcyk7CisgICAgICAgaWYgKGVycikKKyAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgc2NoZWR1bGVfd29yaygmbGVkLT53b3JrKTsKKyAgICAgICByZXR1cm4gMDsKIH0KIAotaW50IHBjYTk1MzJfZXZlbnQoc3RydWN0IGlucHV0X2RldiAqZGV2LCB1bnNpZ25lZCBpbnQgdHlwZSwgdW5zaWduZWQgaW50IGNvZGUsCi0JaW50IHZhbHVlKQorc3RhdGljIGludCBwY2E5NTMyX2V2ZW50KHN0cnVjdCBpbnB1dF9kZXYgKmRldiwgdW5zaWduZWQgaW50IHR5cGUsCisJdW5zaWduZWQgaW50IGNvZGUsIGludCB2YWx1ZSkKIHsKIAlzdHJ1Y3QgcGNhOTUzMl9kYXRhICpkYXRhID0gaW5wdXRfZ2V0X2RydmRhdGEoZGV2KTsKIApAQCAtMTY1LDEzICsxNzgsMjggQEAKIAllbHNlCiAJCWRhdGEtPnB3bVsxXSA9IDA7CiAKLQlkZXZfaW5mbygmZGV2LT5kZXYsICJzZXR0aW5nIGJlZXAgdG8gJWQgXG4iLCBkYXRhLT5wd21bMV0pOworICAgICAgIHNjaGVkdWxlX3dvcmsoJmRhdGEtPndvcmspOworCisgICAgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHBjYTk1MzJfaW5wdXRfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisgICAgICAgc3RydWN0IHBjYTk1MzJfZGF0YSAqZGF0YTsKKyAgICAgICBkYXRhID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBwY2E5NTMyX2RhdGEsIHdvcmspOwogCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKIAlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGRhdGEtPmNsaWVudCwgUENBOTUzMl9SRUdfUFdNKDEpLAogCQlkYXRhLT5wd21bMV0pOwogCW11dGV4X3VubG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOworfQogCi0JcmV0dXJuIDA7CitzdGF0aWMgdm9pZCBwY2E5NTMyX2xlZF93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKyAgICAgICBzdHJ1Y3QgcGNhOTUzMl9sZWQgKmxlZDsKKyAgICAgICBsZWQgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IHBjYTk1MzJfbGVkLCB3b3JrKTsKKyAgICAgICBpZiAobGVkLT5zdGF0ZSA9PSBQQ0E5NTMyX1BXTTApCisgICAgICAgICAgICAgICBwY2E5NTMyX3NldHB3bShsZWQtPmNsaWVudCwgMCk7CisgICAgICAgcGNhOTUzMl9zZXRsZWQobGVkKTsKIH0KIAogc3RhdGljIGludCBwY2E5NTMyX2NvbmZpZ3VyZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LApAQCAtMjA0LDggKzIzMiw5IEBACiAJCQlsZWQtPmxkZXYuYnJpZ2h0bmVzcyA9IExFRF9PRkY7CiAJCQlsZWQtPmxkZXYuYnJpZ2h0bmVzc19zZXQgPSBwY2E5NTMyX3NldF9icmlnaHRuZXNzOwogCQkJbGVkLT5sZGV2LmJsaW5rX3NldCA9IHBjYTk1MzJfc2V0X2JsaW5rOwotCQkJaWYgKGxlZF9jbGFzc2Rldl9yZWdpc3RlcigmY2xpZW50LT5kZXYsCi0JCQkJJmxlZC0+bGRldikgPCAwKQl7CisgICAgICAgICAgICAgICAgICAgICAgIElOSVRfV09SSygmbGVkLT53b3JrLCBwY2E5NTMyX2xlZF93b3JrKTsKKwkJCWVyciA9IGxlZF9jbGFzc2Rldl9yZWdpc3RlcigmY2xpZW50LT5kZXYsICZsZWQtPmxkZXYpOworCQkJaWYgKGVyciA8IDApIHsKIAkJCQlkZXZfZXJyKCZjbGllbnQtPmRldiwKIAkJCQkJImNvdWxkbid0IHJlZ2lzdGVyIExFRCAlc1xuIiwKIAkJCQkJbGVkLT5uYW1lKTsKQEAgLTIzMyw5ICsyNjIsMTEgQEAKIAkJCQkJCUJJVF9NQVNLKFNORF9UT05FKTsKIAkJCWRhdGEtPmlkZXYtPmV2ZW50ID0gcGNhOTUzMl9ldmVudDsKIAkJCWlucHV0X3NldF9kcnZkYXRhKGRhdGEtPmlkZXYsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICBJTklUX1dPUksoJmRhdGEtPndvcmssIHBjYTk1MzJfaW5wdXRfd29yayk7CiAJCQllcnIgPSBpbnB1dF9yZWdpc3Rlcl9kZXZpY2UoZGF0YS0+aWRldik7CiAJCQlpZiAoZXJyKSB7CiAJCQkJaW5wdXRfZnJlZV9kZXZpY2UoZGF0YS0+aWRldik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuY2VsX3dvcmtfc3luYygmZGF0YS0+d29yayk7CiAJCQkJZGF0YS0+aWRldiA9IE5VTEw7CiAJCQkJZ290byBleGl0OwogCQkJfQpAQCAtMjUyLDE4ICsyODMsMTkgQEAKIAkJCQlicmVhazsKIAkJCWNhc2UgUENBOTUzMl9UWVBFX0xFRDoKIAkJCQlsZWRfY2xhc3NkZXZfdW5yZWdpc3RlcigmZGF0YS0+bGVkc1tpXS5sZGV2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW5jZWxfd29ya19zeW5jKCZkYXRhLT5sZWRzW2ldLndvcmspOwogCQkJCWJyZWFrOwogCQkJY2FzZSBQQ0E5NTMyX1RZUEVfTjIxMDBfQkVFUDoKIAkJCQlpZiAoZGF0YS0+aWRldiAhPSBOVUxMKSB7CiAJCQkJCWlucHV0X3VucmVnaXN0ZXJfZGV2aWNlKGRhdGEtPmlkZXYpOwogCQkJCQlpbnB1dF9mcmVlX2RldmljZShkYXRhLT5pZGV2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbmNlbF93b3JrX3N5bmMoJmRhdGEtPndvcmspOwogCQkJCQlkYXRhLT5pZGV2ID0gTlVMTDsKIAkJCQl9CiAJCQkJYnJlYWs7CiAJCQl9CiAKIAlyZXR1cm4gZXJyOwotCiB9CiAKIHN0YXRpYyBpbnQgcGNhOTUzMl9wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LApAQCAtMjcxLDEyICszMDMsMTYgQEAKIHsKIAlzdHJ1Y3QgcGNhOTUzMl9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CiAJc3RydWN0IHBjYTk1MzJfcGxhdGZvcm1fZGF0YSAqcGNhOTUzMl9wZGF0YSA9IGNsaWVudC0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJaW50IGVycjsKKworCWlmICghcGNhOTUzMl9wZGF0YSkKKwkJcmV0dXJuIC1FSU87CiAKIAlpZiAoIWkyY19jaGVja19mdW5jdGlvbmFsaXR5KGNsaWVudC0+YWRhcHRlciwKIAkJSTJDX0ZVTkNfU01CVVNfQllURV9EQVRBKSkKIAkJcmV0dXJuIC1FSU87CiAKLQlkYXRhID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHBjYTk1MzJfZGF0YSksIEdGUF9LRVJORUwpOworCWRhdGEgPSBremFsbG9jKHNpemVvZigqZGF0YSksIEdGUF9LRVJORUwpOwogCWlmICghZGF0YSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKQEAgLTI4NSwxMiArMzIxLDEzIEBACiAJZGF0YS0+Y2xpZW50ID0gY2xpZW50OwogCW11dGV4X2luaXQoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKIAotCWlmIChwY2E5NTMyX3BkYXRhID09IE5VTEwpCi0JCXJldHVybiAtRUlPOworCWVyciA9IHBjYTk1MzJfY29uZmlndXJlKGNsaWVudCwgZGF0YSwgcGNhOTUzMl9wZGF0YSk7CisJaWYgKGVycikgeworCQlrZnJlZShkYXRhKTsKKwkJaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgTlVMTCk7CisJfQogCi0JcGNhOTUzMl9jb25maWd1cmUoY2xpZW50LCBkYXRhLCBwY2E5NTMyX3BkYXRhKTsKLQlyZXR1cm4gMDsKLQorCXJldHVybiBlcnI7CiB9CiAKIHN0YXRpYyBpbnQgcGNhOTUzMl9yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKQEAgLTMwMywxMSArMzQwLDEzIEBACiAJCQlicmVhazsKIAkJY2FzZSBQQ0E5NTMyX1RZUEVfTEVEOgogCQkJbGVkX2NsYXNzZGV2X3VucmVnaXN0ZXIoJmRhdGEtPmxlZHNbaV0ubGRldik7CisgICAgICAgICAgICAgICAgICAgICAgIGNhbmNlbF93b3JrX3N5bmMoJmRhdGEtPmxlZHNbaV0ud29yayk7CiAJCQlicmVhazsKIAkJY2FzZSBQQ0E5NTMyX1RZUEVfTjIxMDBfQkVFUDoKIAkJCWlmIChkYXRhLT5pZGV2ICE9IE5VTEwpIHsKIAkJCQlpbnB1dF91bnJlZ2lzdGVyX2RldmljZShkYXRhLT5pZGV2KTsKIAkJCQlpbnB1dF9mcmVlX2RldmljZShkYXRhLT5pZGV2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW5jZWxfd29ya19zeW5jKCZkYXRhLT53b3JrKTsKIAkJCQlkYXRhLT5pZGV2ID0gTlVMTDsKIAkJCX0KIAkJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9sZWRzL2xlZHMtczNjMjR4eC5jIGIvZHJpdmVycy9sZWRzL2xlZHMtczNjMjR4eC5jCmluZGV4IDI1YTA3ZjIuLjRkODExMzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbGVkcy9sZWRzLXMzYzI0eHguYworKysgYi9kcml2ZXJzL2xlZHMvbGVkcy1zM2MyNHh4LmMKQEAgLTgyLDYgKzgyLDcgQEAKIAlsZWQtPmNkZXYuYnJpZ2h0bmVzc19zZXQgPSBzM2MyNHh4X2xlZF9zZXQ7CiAJbGVkLT5jZGV2LmRlZmF1bHRfdHJpZ2dlciA9IHBkYXRhLT5kZWZfdHJpZ2dlcjsKIAlsZWQtPmNkZXYubmFtZSA9IHBkYXRhLT5uYW1lOworCWxlZC0+Y2Rldi5mbGFncyB8PSBMRURfQ09SRV9TVVNQRU5EUkVTVU1FOwogCiAJbGVkLT5wZGF0YSA9IHBkYXRhOwogCkBAIC0xMTEsMzMgKzExMiw5IEBACiAJcmV0dXJuIHJldDsKIH0KIAotCi0jaWZkZWYgQ09ORklHX1BNCi1zdGF0aWMgaW50IHMzYzI0eHhfbGVkX3N1c3BlbmQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCi17Ci0Jc3RydWN0IHMzYzI0eHhfZ3Bpb19sZWQgKmxlZCA9IHBkZXZfdG9fZ3BpbyhkZXYpOwotCi0JbGVkX2NsYXNzZGV2X3N1c3BlbmQoJmxlZC0+Y2Rldik7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgczNjMjR4eF9sZWRfcmVzdW1lKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgczNjMjR4eF9ncGlvX2xlZCAqbGVkID0gcGRldl90b19ncGlvKGRldik7Ci0KLQlsZWRfY2xhc3NkZXZfcmVzdW1lKCZsZWQtPmNkZXYpOwotCXJldHVybiAwOwotfQotI2Vsc2UKLSNkZWZpbmUgczNjMjR4eF9sZWRfc3VzcGVuZCBOVUxMCi0jZGVmaW5lIHMzYzI0eHhfbGVkX3Jlc3VtZSBOVUxMCi0jZW5kaWYKLQogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgczNjMjR4eF9sZWRfZHJpdmVyID0gewogCS5wcm9iZQkJPSBzM2MyNHh4X2xlZF9wcm9iZSwKIAkucmVtb3ZlCQk9IHMzYzI0eHhfbGVkX3JlbW92ZSwKLQkuc3VzcGVuZAk9IHMzYzI0eHhfbGVkX3N1c3BlbmQsCi0JLnJlc3VtZQkJPSBzM2MyNHh4X2xlZF9yZXN1bWUsCiAJLmRyaXZlcgkJPSB7CiAJCS5uYW1lCQk9ICJzM2MyNHh4X2xlZCIsCiAJCS5vd25lcgkJPSBUSElTX01PRFVMRSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbGVkcy9sZWRzLXdtODM1MC5jIGIvZHJpdmVycy9sZWRzL2xlZHMtd204MzUwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzhjNmJjYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbGVkcy9sZWRzLXdtODM1MC5jCkBAIC0wLDAgKzEsMzExIEBACisvKgorICogTEVEIGRyaXZlciBmb3IgV004MzUwIGRyaXZlbiBMRURTLgorICoKKyAqIENvcHlyaWdodChDKSAyMDA3LCAyMDA4IFdvbGZzb24gTWljcm9lbGVjdHJvbmljcyBQTEMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9sZWRzLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvbWZkL3dtODM1MC9wbWljLmg+CisjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL2NvbnN1bWVyLmg+CisKKy8qIE1pY3JvYW1wcyAqLworc3RhdGljIGNvbnN0IGludCBpc2lua19jdXJbXSA9IHsKKwk0LAorCTUsCisJNiwKKwk3LAorCTgsCisJMTAsCisJMTEsCisJMTQsCisJMTYsCisJMTksCisJMjMsCisJMjcsCisJMzIsCisJMzksCisJNDYsCisJNTQsCisJNjUsCisJNzcsCisJOTIsCisJMTA5LAorCTEzMCwKKwkxNTQsCisJMTgzLAorCTIxOCwKKwkyNTksCisJMzA4LAorCTM2NywKKwk0MzYsCisJNTE4LAorCTYxNiwKKwk3MzMsCisJODcyLAorCTEwMzcsCisJMTIzMywKKwkxNDY2LAorCTE3NDQsCisJMjA3MywKKwkyNDY2LAorCTI5MzMsCisJMzQ4NywKKwk0MTQ3LAorCTQ5MzIsCisJNTg2NSwKKwk2OTc1LAorCTgyOTQsCisJOTg2NCwKKwkxMTczMCwKKwkxMzk0OSwKKwkxNjU4OSwKKwkxOTcyOCwKKwkyMzQ2MCwKKwkyNzg5OSwKKwkzMzE3OCwKKwkzOTQ1NSwKKwk0NjkyMCwKKwk1NTc5OCwKKwk2NjM1NSwKKwk3ODkxMCwKKwk5Mzg0MCwKKwkxMTE1OTYsCisJMTMyNzEwLAorCTE1NzgyMCwKKwkxODc2ODEsCisJMjIzMTkxCit9OworCisjZGVmaW5lIHRvX3dtODM1MF9sZWQobGVkX2NkZXYpIFwKKwljb250YWluZXJfb2YobGVkX2NkZXYsIHN0cnVjdCB3bTgzNTBfbGVkLCBjZGV2KQorCitzdGF0aWMgdm9pZCB3bTgzNTBfbGVkX2VuYWJsZShzdHJ1Y3Qgd204MzUwX2xlZCAqbGVkKQoreworCWludCByZXQ7CisKKwlpZiAobGVkLT5lbmFibGVkKQorCQlyZXR1cm47CisKKwlyZXQgPSByZWd1bGF0b3JfZW5hYmxlKGxlZC0+aXNpbmspOworCWlmIChyZXQgIT0gMCkgeworCQlkZXZfZXJyKGxlZC0+Y2Rldi5kZXYsICJGYWlsZWQgdG8gZW5hYmxlIElTSU5LOiAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuOworCX0KKworCXJldCA9IHJlZ3VsYXRvcl9lbmFibGUobGVkLT5kY2RjKTsKKwlpZiAocmV0ICE9IDApIHsKKwkJZGV2X2VycihsZWQtPmNkZXYuZGV2LCAiRmFpbGVkIHRvIGVuYWJsZSBEQ0RDOiAlZFxuIiwgcmV0KTsKKwkJcmVndWxhdG9yX2Rpc2FibGUobGVkLT5pc2luayk7CisJCXJldHVybjsKKwl9CisKKwlsZWQtPmVuYWJsZWQgPSAxOworfQorCitzdGF0aWMgdm9pZCB3bTgzNTBfbGVkX2Rpc2FibGUoc3RydWN0IHdtODM1MF9sZWQgKmxlZCkKK3sKKwlpbnQgcmV0OworCisJaWYgKCFsZWQtPmVuYWJsZWQpCisJCXJldHVybjsKKworCXJldCA9IHJlZ3VsYXRvcl9kaXNhYmxlKGxlZC0+ZGNkYyk7CisJaWYgKHJldCAhPSAwKSB7CisJCWRldl9lcnIobGVkLT5jZGV2LmRldiwgIkZhaWxlZCB0byBkaXNhYmxlIERDREM6ICVkXG4iLCByZXQpOworCQlyZXR1cm47CisJfQorCisJcmV0ID0gcmVndWxhdG9yX2Rpc2FibGUobGVkLT5pc2luayk7CisJaWYgKHJldCAhPSAwKSB7CisJCWRldl9lcnIobGVkLT5jZGV2LmRldiwgIkZhaWxlZCB0byBkaXNhYmxlIElTSU5LOiAlZFxuIiwgcmV0KTsKKwkJcmVndWxhdG9yX2VuYWJsZShsZWQtPmRjZGMpOworCQlyZXR1cm47CisJfQorCisJbGVkLT5lbmFibGVkID0gMDsKK30KKworc3RhdGljIHZvaWQgbGVkX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCB3bTgzNTBfbGVkICpsZWQgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IHdtODM1MF9sZWQsIHdvcmspOworCWludCByZXQ7CisJaW50IHVBOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwltdXRleF9sb2NrKCZsZWQtPm11dGV4KTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZsZWQtPnZhbHVlX2xvY2ssIGZsYWdzKTsKKworCWlmIChsZWQtPnZhbHVlID09IExFRF9PRkYpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbGVkLT52YWx1ZV9sb2NrLCBmbGFncyk7CisJCXdtODM1MF9sZWRfZGlzYWJsZShsZWQpOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBUaGlzIHNjYWxlcyBsaW5lYXJseSBpbnRvIHRoZSBpbmRleCBvZiB2YWxpZCBjdXJyZW50CisJICogc2V0dGluZ3Mgd2hpY2ggcmVzdWx0cyBpbiBhIGxpbmVhciBzY2FsaW5nIG9mIHBlcmNlaXZlZAorCSAqIGJyaWdodG5lc3MgZHVlIHRvIHRoZSBub24tbGluZWFyIGN1cnJlbnQgc2V0dGluZ3MgcHJvdmlkZWQKKwkgKiBieSB0aGUgaGFyZHdhcmUuCisJICovCisJdUEgPSAobGVkLT5tYXhfdUFfaW5kZXggKiBsZWQtPnZhbHVlKSAvIExFRF9GVUxMOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxlZC0+dmFsdWVfbG9jaywgZmxhZ3MpOworCUJVR19PTih1QSA+PSBBUlJBWV9TSVpFKGlzaW5rX2N1cikpOworCisJcmV0ID0gcmVndWxhdG9yX3NldF9jdXJyZW50X2xpbWl0KGxlZC0+aXNpbmssIGlzaW5rX2N1clt1QV0sCisJCQkJCSAgaXNpbmtfY3VyW3VBXSk7CisJaWYgKHJldCAhPSAwKQorCQlkZXZfZXJyKGxlZC0+Y2Rldi5kZXYsICJGYWlsZWQgdG8gc2V0ICVkdUE6ICVkXG4iLAorCQkJaXNpbmtfY3VyW3VBXSwgcmV0KTsKKworCXdtODM1MF9sZWRfZW5hYmxlKGxlZCk7CisKK291dDoKKwltdXRleF91bmxvY2soJmxlZC0+bXV0ZXgpOworfQorCitzdGF0aWMgdm9pZCB3bTgzNTBfbGVkX3NldChzdHJ1Y3QgbGVkX2NsYXNzZGV2ICpsZWRfY2RldiwKKwkJCSAgIGVudW0gbGVkX2JyaWdodG5lc3MgdmFsdWUpCit7CisJc3RydWN0IHdtODM1MF9sZWQgKmxlZCA9IHRvX3dtODM1MF9sZWQobGVkX2NkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbGVkLT52YWx1ZV9sb2NrLCBmbGFncyk7CisJbGVkLT52YWx1ZSA9IHZhbHVlOworCXNjaGVkdWxlX3dvcmsoJmxlZC0+d29yayk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbGVkLT52YWx1ZV9sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIHdtODM1MF9sZWRfc2h1dGRvd24oc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3Qgd204MzUwX2xlZCAqbGVkID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwltdXRleF9sb2NrKCZsZWQtPm11dGV4KTsKKwlsZWQtPnZhbHVlID0gTEVEX09GRjsKKwl3bTgzNTBfbGVkX2Rpc2FibGUobGVkKTsKKwltdXRleF91bmxvY2soJmxlZC0+bXV0ZXgpOworfQorCitzdGF0aWMgaW50IHdtODM1MF9sZWRfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgcmVndWxhdG9yICppc2luaywgKmRjZGM7CisJc3RydWN0IHdtODM1MF9sZWQgKmxlZDsKKwlzdHJ1Y3Qgd204MzUwX2xlZF9wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCWludCByZXQsIGk7CisKKwlpZiAocGRhdGEgPT0gTlVMTCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJubyBwbGF0Zm9ybSBkYXRhXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJaWYgKHBkYXRhLT5tYXhfdUEgPCBpc2lua19jdXJbMF0pIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiSW52YWxpZCBtYXhpbXVtIGN1cnJlbnQgJWR1QVxuIiwKKwkJCXBkYXRhLT5tYXhfdUEpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpc2luayA9IHJlZ3VsYXRvcl9nZXQoJnBkZXYtPmRldiwgImxlZF9pc2luayIpOworCWlmIChJU19FUlIoaXNpbmspKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IGNhbnQgZ2V0IElTSU5LXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiBQVFJfRVJSKGlzaW5rKTsKKwl9CisKKwlkY2RjID0gcmVndWxhdG9yX2dldCgmcGRldi0+ZGV2LCAibGVkX3ZjYyIpOworCWlmIChJU19FUlIoZGNkYykpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogY2FudCBnZXQgRENEQ1xuIiwgX19mdW5jX18pOworCQlyZXQgPSBQVFJfRVJSKGRjZGMpOworCQlnb3RvIGVycl9pc2luazsKKwl9CisKKwlsZWQgPSBremFsbG9jKHNpemVvZigqbGVkKSwgR0ZQX0tFUk5FTCk7CisJaWYgKGxlZCA9PSBOVUxMKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyX2RjZGM7CisJfQorCisJbGVkLT5jZGV2LmJyaWdodG5lc3Nfc2V0ID0gd204MzUwX2xlZF9zZXQ7CisJbGVkLT5jZGV2LmRlZmF1bHRfdHJpZ2dlciA9IHBkYXRhLT5kZWZhdWx0X3RyaWdnZXI7CisJbGVkLT5jZGV2Lm5hbWUgPSBwZGF0YS0+bmFtZTsKKwlsZWQtPmNkZXYuZmxhZ3MgfD0gTEVEX0NPUkVfU1VTUEVORFJFU1VNRTsKKwlsZWQtPmVuYWJsZWQgPSByZWd1bGF0b3JfaXNfZW5hYmxlZChpc2luayk7CisJbGVkLT5pc2luayA9IGlzaW5rOworCWxlZC0+ZGNkYyA9IGRjZGM7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShpc2lua19jdXIpIC0gMTsgaSsrKQorCQlpZiAoaXNpbmtfY3VyW2ldID49IHBkYXRhLT5tYXhfdUEpCisJCQlicmVhazsKKwlsZWQtPm1heF91QV9pbmRleCA9IGk7CisJaWYgKHBkYXRhLT5tYXhfdUEgIT0gaXNpbmtfY3VyW2ldKQorCQlkZXZfd2FybigmcGRldi0+ZGV2LAorCQkJICJNYXhpbXVtIGN1cnJlbnQgJWR1QSBpcyBub3QgZGlyZWN0bHkgc3VwcG9ydGVkLCIKKwkJCSAiIGNoZWNrIHBsYXRmb3JtIGRhdGFcbiIsCisJCQkgcGRhdGEtPm1heF91QSk7CisKKwlzcGluX2xvY2tfaW5pdCgmbGVkLT52YWx1ZV9sb2NrKTsKKwltdXRleF9pbml0KCZsZWQtPm11dGV4KTsKKwlJTklUX1dPUksoJmxlZC0+d29yaywgbGVkX3dvcmspOworCWxlZC0+dmFsdWUgPSBMRURfT0ZGOworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGxlZCk7CisKKwlyZXQgPSBsZWRfY2xhc3NkZXZfcmVnaXN0ZXIoJnBkZXYtPmRldiwgJmxlZC0+Y2Rldik7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyX2xlZDsKKworCXJldHVybiAwOworCisgZXJyX2xlZDoKKwlrZnJlZShsZWQpOworIGVycl9kY2RjOgorCXJlZ3VsYXRvcl9wdXQoZGNkYyk7CisgZXJyX2lzaW5rOgorCXJlZ3VsYXRvcl9wdXQoaXNpbmspOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgd204MzUwX2xlZF9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3Qgd204MzUwX2xlZCAqbGVkID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwlsZWRfY2xhc3NkZXZfdW5yZWdpc3RlcigmbGVkLT5jZGV2KTsKKwlmbHVzaF9zY2hlZHVsZWRfd29yaygpOworCXdtODM1MF9sZWRfZGlzYWJsZShsZWQpOworCXJlZ3VsYXRvcl9wdXQobGVkLT5kY2RjKTsKKwlyZWd1bGF0b3JfcHV0KGxlZC0+aXNpbmspOworCWtmcmVlKGxlZCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHdtODM1MF9sZWRfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCSAgIC5uYW1lID0gIndtODM1MC1sZWQiLAorCQkgICAub3duZXIgPSBUSElTX01PRFVMRSwKKwkJICAgfSwKKwkucHJvYmUgPSB3bTgzNTBfbGVkX3Byb2JlLAorCS5yZW1vdmUgPSB3bTgzNTBfbGVkX3JlbW92ZSwKKwkuc2h1dGRvd24gPSB3bTgzNTBfbGVkX3NodXRkb3duLAorfTsKKworc3RhdGljIGludCBfX2RldmluaXQgd204MzUwX2xlZF9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3Rlcigmd204MzUwX2xlZF9kcml2ZXIpOworfQorbW9kdWxlX2luaXQod204MzUwX2xlZF9pbml0KTsKKworc3RhdGljIHZvaWQgd204MzUwX2xlZF9leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJndtODM1MF9sZWRfZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KHdtODM1MF9sZWRfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIk1hcmsgQnJvd24iKTsKK01PRFVMRV9ERVNDUklQVElPTigiV004MzUwIExFRCBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BTElBUygicGxhdGZvcm06d204MzUwLWxlZCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9sZWRzL2xlZHMtd3JhcC5jIGIvZHJpdmVycy9sZWRzL2xlZHMtd3JhcC5jCmluZGV4IDJmM2FhODdmLi4yOTgyYzg2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2xlZHMvbGVkcy13cmFwLmMKKysrIGIvZHJpdmVycy9sZWRzL2xlZHMtd3JhcC5jCkBAIC01Niw0MCArNTYsMjEgQEAKIAkubmFtZQkJCT0gIndyYXA6OnBvd2VyIiwKIAkuYnJpZ2h0bmVzc19zZXQJCT0gd3JhcF9wb3dlcl9sZWRfc2V0LAogCS5kZWZhdWx0X3RyaWdnZXIJPSAiZGVmYXVsdC1vbiIsCisJLmZsYWdzCQkJPSBMRURfQ09SRV9TVVNQRU5EUkVTVU1FLAogfTsKIAogc3RhdGljIHN0cnVjdCBsZWRfY2xhc3NkZXYgd3JhcF9lcnJvcl9sZWQgPSB7CiAJLm5hbWUJCT0gIndyYXA6OmVycm9yIiwKIAkuYnJpZ2h0bmVzc19zZXQJPSB3cmFwX2Vycm9yX2xlZF9zZXQsCisJLmZsYWdzCQkJPSBMRURfQ09SRV9TVVNQRU5EUkVTVU1FLAogfTsKIAogc3RhdGljIHN0cnVjdCBsZWRfY2xhc3NkZXYgd3JhcF9leHRyYV9sZWQgPSB7CiAJLm5hbWUgICAgICAgICAgID0gIndyYXA6OmV4dHJhIiwKIAkuYnJpZ2h0bmVzc19zZXQgPSB3cmFwX2V4dHJhX2xlZF9zZXQsCisJLmZsYWdzCQkJPSBMRURfQ09SRV9TVVNQRU5EUkVTVU1FLAogfTsKIAotI2lmZGVmIENPTkZJR19QTQotc3RhdGljIGludCB3cmFwX2xlZF9zdXNwZW5kKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldiwKLQkJcG1fbWVzc2FnZV90IHN0YXRlKQotewotCWxlZF9jbGFzc2Rldl9zdXNwZW5kKCZ3cmFwX3Bvd2VyX2xlZCk7Ci0JbGVkX2NsYXNzZGV2X3N1c3BlbmQoJndyYXBfZXJyb3JfbGVkKTsKLQlsZWRfY2xhc3NkZXZfc3VzcGVuZCgmd3JhcF9leHRyYV9sZWQpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHdyYXBfbGVkX3Jlc3VtZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCi17Ci0JbGVkX2NsYXNzZGV2X3Jlc3VtZSgmd3JhcF9wb3dlcl9sZWQpOwotCWxlZF9jbGFzc2Rldl9yZXN1bWUoJndyYXBfZXJyb3JfbGVkKTsKLQlsZWRfY2xhc3NkZXZfcmVzdW1lKCZ3cmFwX2V4dHJhX2xlZCk7Ci0JcmV0dXJuIDA7Ci19Ci0jZWxzZQotI2RlZmluZSB3cmFwX2xlZF9zdXNwZW5kIE5VTEwKLSNkZWZpbmUgd3JhcF9sZWRfcmVzdW1lIE5VTEwKLSNlbmRpZgotCiBzdGF0aWMgaW50IHdyYXBfbGVkX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJaW50IHJldDsKQEAgLTEyNyw4ICsxMDgsNiBAQAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgd3JhcF9sZWRfZHJpdmVyID0gewogCS5wcm9iZQkJPSB3cmFwX2xlZF9wcm9iZSwKIAkucmVtb3ZlCQk9IHdyYXBfbGVkX3JlbW92ZSwKLQkuc3VzcGVuZAk9IHdyYXBfbGVkX3N1c3BlbmQsCi0JLnJlc3VtZQkJPSB3cmFwX2xlZF9yZXN1bWUsCiAJLmRyaXZlcgkJPSB7CiAJCS5uYW1lCQk9IERSVk5BTUUsCiAJCS5vd25lcgkJPSBUSElTX01PRFVMRSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbGVkcy9sZWR0cmlnLXRpbWVyLmMgYi9kcml2ZXJzL2xlZHMvbGVkdHJpZy10aW1lci5jCmluZGV4IGRiNjgxOTYuLjNkNjUzMTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbGVkcy9sZWR0cmlnLXRpbWVyLmMKKysrIGIvZHJpdmVycy9sZWRzL2xlZHRyaWctdGltZXIuYwpAQCAtMTk5LDYgKzE5OSw3IEBACiBzdGF0aWMgdm9pZCB0aW1lcl90cmlnX2RlYWN0aXZhdGUoc3RydWN0IGxlZF9jbGFzc2RldiAqbGVkX2NkZXYpCiB7CiAJc3RydWN0IHRpbWVyX3RyaWdfZGF0YSAqdGltZXJfZGF0YSA9IGxlZF9jZGV2LT50cmlnZ2VyX2RhdGE7CisJdW5zaWduZWQgbG9uZyBvbiA9IDAsIG9mZiA9IDA7CiAKIAlpZiAodGltZXJfZGF0YSkgewogCQlkZXZpY2VfcmVtb3ZlX2ZpbGUobGVkX2NkZXYtPmRldiwgJmRldl9hdHRyX2RlbGF5X29uKTsKQEAgLTIwNiw2ICsyMDcsMTAgQEAKIAkJZGVsX3RpbWVyX3N5bmMoJnRpbWVyX2RhdGEtPnRpbWVyKTsKIAkJa2ZyZWUodGltZXJfZGF0YSk7CiAJfQorCisJLyogSWYgdGhlcmUgaXMgaGFyZHdhcmUgc3VwcG9ydCBmb3IgYmxpbmtpbmcsIHN0b3AgaXQgKi8KKwlpZiAobGVkX2NkZXYtPmJsaW5rX3NldCkKKwkJbGVkX2NkZXYtPmJsaW5rX3NldChsZWRfY2RldiwgJm9uLCAmb2ZmKTsKIH0KIAogc3RhdGljIHN0cnVjdCBsZWRfdHJpZ2dlciB0aW1lcl9sZWRfdHJpZ2dlciA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWFjaW50b3NoL0tjb25maWcgYi9kcml2ZXJzL21hY2ludG9zaC9LY29uZmlnCmluZGV4IGI1MjY1OTYuLjE3M2NmNTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWFjaW50b3NoL0tjb25maWcKKysrIGIvZHJpdmVycy9tYWNpbnRvc2gvS2NvbmZpZwpAQCAtMTM4LDcgKzEzOCw3IEBACiAJICBTYXkgWSBoZXJlIHRvIGVuYWJsZSBNYWNpbnRvc2ggc3BlY2lmaWMgZXh0ZW5zaW9ucyBvZiB0aGUgZ2VuZXJpYwogCSAgYmFja2xpZ2h0IGNvZGUuIFdpdGggdGhpcyBlbmFibGVkLCB0aGUgYnJpZ2h0bmVzcyBrZXlzIG9uIG9sZGVyCiAJICBQb3dlckJvb2tzIHdpbGwgYmUgZW5hYmxlZCBzbyB5b3UgY2FuIGNoYW5nZSB0aGUgc2NyZWVuIGJyaWdodG5lc3MuCi0JICBOZXdlciBtb2RlbHMgc2hvdWxkIHVzZSBhbiB1c2Vyc3BhY2UgZGFlbW9uIGxpa2UgcGJidXR0b25zZC4KKwkgIE5ld2VyIG1vZGVscyBzaG91bGQgdXNlIGEgdXNlcnNwYWNlIGRhZW1vbiBsaWtlIHBiYnV0dG9uc2QuCiAKIGNvbmZpZyBQTUFDX0JBQ0tMSUdIVF9MRUdBQ1kKIAlib29sICJQcm92aWRlIGxlZ2FjeSBpb2N0bCdzIG9uIC9kZXYvcG11IGZvciB0aGUgYmFja2xpZ2h0IgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9iaXRtYXAuYyBiL2RyaXZlcnMvbWQvYml0bWFwLmMKaW5kZXggYWI3YzhlNC4uNzE5OTQzNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9iaXRtYXAuYworKysgYi9kcml2ZXJzL21kL2JpdG1hcC5jCkBAIC0yMTUsNyArMjE1LDYgQEAKIAkvKiBjaG9vc2UgYSBnb29kIHJkZXYgYW5kIHJlYWQgdGhlIHBhZ2UgZnJvbSB0aGVyZSAqLwogCiAJbWRrX3JkZXZfdCAqcmRldjsKLQlzdHJ1Y3QgbGlzdF9oZWFkICp0bXA7CiAJc2VjdG9yX3QgdGFyZ2V0OwogCiAJaWYgKCFwYWdlKQpAQCAtMjIzLDcgKzIyMiw3IEBACiAJaWYgKCFwYWdlKQogCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKIAotCXJkZXZfZm9yX2VhY2gocmRldiwgdG1wLCBtZGRldikgeworCWxpc3RfZm9yX2VhY2hfZW50cnkocmRldiwgJm1kZGV2LT5kaXNrcywgc2FtZV9zZXQpIHsKIAkJaWYgKCEgdGVzdF9iaXQoSW5fc3luYywgJnJkZXYtPmZsYWdzKQogCQkgICAgfHwgdGVzdF9iaXQoRmF1bHR5LCAmcmRldi0+ZmxhZ3MpKQogCQkJY29udGludWU7CkBAIC05NjQsOSArOTYzLDExIEBACiAJCQkJICovCiAJCQkJcGFnZSA9IGJpdG1hcC0+c2JfcGFnZTsKIAkJCQlvZmZzZXQgPSBzaXplb2YoYml0bWFwX3N1cGVyX3QpOwotCQkJCXJlYWRfc2JfcGFnZShiaXRtYXAtPm1kZGV2LCBiaXRtYXAtPm9mZnNldCwKLQkJCQkJICAgICBwYWdlLAotCQkJCQkgICAgIGluZGV4LCBjb3VudCk7CisJCQkJaWYgKCFmaWxlKQorCQkJCQlyZWFkX3NiX3BhZ2UoYml0bWFwLT5tZGRldiwKKwkJCQkJCSAgICAgYml0bWFwLT5vZmZzZXQsCisJCQkJCQkgICAgIHBhZ2UsCisJCQkJCQkgICAgIGluZGV4LCBjb3VudCk7CiAJCQl9IGVsc2UgaWYgKGZpbGUpIHsKIAkJCQlwYWdlID0gcmVhZF9wYWdlKGZpbGUsIGluZGV4LCBiaXRtYXAsIGNvdW50KTsKIAkJCQlvZmZzZXQgPSAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9mYXVsdHkuYyBiL2RyaXZlcnMvbWQvZmF1bHR5LmMKaW5kZXggZjI2YzFmOS4uODZkOWFkZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9mYXVsdHkuYworKysgYi9kcml2ZXJzL21kL2ZhdWx0eS5jCkBAIC0yODMsNyArMjgzLDYgQEAKIHN0YXRpYyBpbnQgcnVuKG1kZGV2X3QgKm1kZGV2KQogewogCW1ka19yZGV2X3QgKnJkZXY7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqdG1wOwogCWludCBpOwogCiAJY29uZl90ICpjb25mID0ga21hbGxvYyhzaXplb2YoKmNvbmYpLCBHRlBfS0VSTkVMKTsKQEAgLTI5Niw3ICsyOTUsNyBAQAogCX0KIAljb25mLT5uZmF1bHRzID0gMDsKIAotCXJkZXZfZm9yX2VhY2gocmRldiwgdG1wLCBtZGRldikKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJkZXYsICZtZGRldi0+ZGlza3MsIHNhbWVfc2V0KQogCQljb25mLT5yZGV2ID0gcmRldjsKIAogCW1kZGV2LT5hcnJheV9zZWN0b3JzID0gbWRkZXYtPnNpemUgKiAyOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9saW5lYXIuYyBiL2RyaXZlcnMvbWQvbGluZWFyLmMKaW5kZXggM2I5MGM1Yy4uMWUzYWVhOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9saW5lYXIuYworKysgYi9kcml2ZXJzL21kL2xpbmVhci5jCkBAIC0xMDUsNyArMTA1LDYgQEAKIAlpbnQgaSwgbmJfem9uZSwgY250OwogCXNlY3Rvcl90IG1pbl9zZWN0b3JzOwogCXNlY3Rvcl90IGN1cnJfc2VjdG9yOwotCXN0cnVjdCBsaXN0X2hlYWQgKnRtcDsKIAogCWNvbmYgPSBremFsbG9jIChzaXplb2YgKCpjb25mKSArIHJhaWRfZGlza3Mqc2l6ZW9mKGRldl9pbmZvX3QpLAogCQkJR0ZQX0tFUk5FTCk7CkBAIC0xMTUsNyArMTE0LDcgQEAKIAljbnQgPSAwOwogCWNvbmYtPmFycmF5X3NlY3RvcnMgPSAwOwogCi0JcmRldl9mb3JfZWFjaChyZGV2LCB0bXAsIG1kZGV2KSB7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShyZGV2LCAmbWRkZXYtPmRpc2tzLCBzYW1lX3NldCkgewogCQlpbnQgaiA9IHJkZXYtPnJhaWRfZGlzazsKIAkJZGV2X2luZm9fdCAqZGlzayA9IGNvbmYtPmRpc2tzICsgajsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9tZC5jIGIvZHJpdmVycy9tZC9tZC5jCmluZGV4IDFiMWQzMjYuLjQxZTI1MDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvbWQuYworKysgYi9kcml2ZXJzL21kL21kLmMKQEAgLTIxNCwyMCArMjE0LDMzIEBACiAJcmV0dXJuIG1kZGV2OwogfQogCitzdGF0aWMgdm9pZCBtZGRldl9kZWxheWVkX2RlbGV0ZShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndzKQoreworCW1kZGV2X3QgKm1kZGV2ID0gY29udGFpbmVyX29mKHdzLCBtZGRldl90LCBkZWxfd29yayk7CisJa29iamVjdF9kZWwoJm1kZGV2LT5rb2JqKTsKKwlrb2JqZWN0X3B1dCgmbWRkZXYtPmtvYmopOworfQorCiBzdGF0aWMgdm9pZCBtZGRldl9wdXQobWRkZXZfdCAqbWRkZXYpCiB7CiAJaWYgKCFhdG9taWNfZGVjX2FuZF9sb2NrKCZtZGRldi0+YWN0aXZlLCAmYWxsX21kZGV2c19sb2NrKSkKIAkJcmV0dXJuOwotCWlmICghbWRkZXYtPnJhaWRfZGlza3MgJiYgbGlzdF9lbXB0eSgmbWRkZXYtPmRpc2tzKSkgeworCWlmICghbWRkZXYtPnJhaWRfZGlza3MgJiYgbGlzdF9lbXB0eSgmbWRkZXYtPmRpc2tzKSAmJgorCSAgICAhbWRkZXYtPmhvbGRfYWN0aXZlKSB7CiAJCWxpc3RfZGVsKCZtZGRldi0+YWxsX21kZGV2cyk7Ci0JCXNwaW5fdW5sb2NrKCZhbGxfbWRkZXZzX2xvY2spOwotCQlibGtfY2xlYW51cF9xdWV1ZShtZGRldi0+cXVldWUpOwotCQlpZiAobWRkZXYtPnN5c2ZzX3N0YXRlKQotCQkJc3lzZnNfcHV0KG1kZGV2LT5zeXNmc19zdGF0ZSk7Ci0JCW1kZGV2LT5zeXNmc19zdGF0ZSA9IE5VTEw7Ci0JCWtvYmplY3RfcHV0KCZtZGRldi0+a29iaik7Ci0JfSBlbHNlCi0JCXNwaW5fdW5sb2NrKCZhbGxfbWRkZXZzX2xvY2spOworCQlpZiAobWRkZXYtPmdlbmRpc2spIHsKKwkJCS8qIHdlIGRpZCBhIHByb2JlIHNvIG5lZWQgdG8gY2xlYW4gdXAuCisJCQkgKiBDYWxsIHNjaGVkdWxlX3dvcmsgaW5zaWRlIHRoZSBzcGlubG9jaworCQkJICogc28gdGhhdCBmbHVzaF9zY2hlZHVsZWRfd29yaygpIGFmdGVyCisJCQkgKiBtZGRldl9maW5kIHdpbGwgc3VjY2VlZCBpbiB3YWl0aW5nIGZvciB0aGUKKwkJCSAqIHdvcmsgdG8gYmUgZG9uZS4KKwkJCSAqLworCQkJSU5JVF9XT1JLKCZtZGRldi0+ZGVsX3dvcmssIG1kZGV2X2RlbGF5ZWRfZGVsZXRlKTsKKwkJCXNjaGVkdWxlX3dvcmsoJm1kZGV2LT5kZWxfd29yayk7CisJCX0gZWxzZQorCQkJa2ZyZWUobWRkZXYpOworCX0KKwlzcGluX3VubG9jaygmYWxsX21kZGV2c19sb2NrKTsKIH0KIAogc3RhdGljIG1kZGV2X3QgKiBtZGRldl9maW5kKGRldl90IHVuaXQpCkBAIC0yMzYsMTUgKzI0OSw1MCBAQAogCiAgcmV0cnk6CiAJc3Bpbl9sb2NrKCZhbGxfbWRkZXZzX2xvY2spOwotCWxpc3RfZm9yX2VhY2hfZW50cnkobWRkZXYsICZhbGxfbWRkZXZzLCBhbGxfbWRkZXZzKQotCQlpZiAobWRkZXYtPnVuaXQgPT0gdW5pdCkgewotCQkJbWRkZXZfZ2V0KG1kZGV2KTsKLQkJCXNwaW5fdW5sb2NrKCZhbGxfbWRkZXZzX2xvY2spOwotCQkJa2ZyZWUobmV3KTsKLQkJCXJldHVybiBtZGRldjsKLQkJfQogCi0JaWYgKG5ldykgeworCWlmICh1bml0KSB7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkobWRkZXYsICZhbGxfbWRkZXZzLCBhbGxfbWRkZXZzKQorCQkJaWYgKG1kZGV2LT51bml0ID09IHVuaXQpIHsKKwkJCQltZGRldl9nZXQobWRkZXYpOworCQkJCXNwaW5fdW5sb2NrKCZhbGxfbWRkZXZzX2xvY2spOworCQkJCWtmcmVlKG5ldyk7CisJCQkJcmV0dXJuIG1kZGV2OworCQkJfQorCisJCWlmIChuZXcpIHsKKwkJCWxpc3RfYWRkKCZuZXctPmFsbF9tZGRldnMsICZhbGxfbWRkZXZzKTsKKwkJCXNwaW5fdW5sb2NrKCZhbGxfbWRkZXZzX2xvY2spOworCQkJbmV3LT5ob2xkX2FjdGl2ZSA9IFVOVElMX0lPQ1RMOworCQkJcmV0dXJuIG5ldzsKKwkJfQorCX0gZWxzZSBpZiAobmV3KSB7CisJCS8qIGZpbmQgYW4gdW51c2VkIHVuaXQgbnVtYmVyICovCisJCXN0YXRpYyBpbnQgbmV4dF9taW5vciA9IDUxMjsKKwkJaW50IHN0YXJ0ID0gbmV4dF9taW5vcjsKKwkJaW50IGlzX2ZyZWUgPSAwOworCQlpbnQgZGV2ID0gMDsKKwkJd2hpbGUgKCFpc19mcmVlKSB7CisJCQlkZXYgPSBNS0RFVihNRF9NQUpPUiwgbmV4dF9taW5vcik7CisJCQluZXh0X21pbm9yKys7CisJCQlpZiAobmV4dF9taW5vciA+IE1JTk9STUFTSykKKwkJCQluZXh0X21pbm9yID0gMDsKKwkJCWlmIChuZXh0X21pbm9yID09IHN0YXJ0KSB7CisJCQkJLyogT2ggZGVhciwgYWxsIGluIHVzZS4gKi8KKwkJCQlzcGluX3VubG9jaygmYWxsX21kZGV2c19sb2NrKTsKKwkJCQlrZnJlZShuZXcpOworCQkJCXJldHVybiBOVUxMOworCQkJfQorCQkJCQorCQkJaXNfZnJlZSA9IDE7CisJCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KG1kZGV2LCAmYWxsX21kZGV2cywgYWxsX21kZGV2cykKKwkJCQlpZiAobWRkZXYtPnVuaXQgPT0gZGV2KSB7CisJCQkJCWlzX2ZyZWUgPSAwOworCQkJCQlicmVhazsKKwkJCQl9CisJCX0KKwkJbmV3LT51bml0ID0gZGV2OworCQluZXctPm1kX21pbm9yID0gTUlOT1IoZGV2KTsKKwkJbmV3LT5ob2xkX2FjdGl2ZSA9IFVOVElMX1NUT1A7CiAJCWxpc3RfYWRkKCZuZXctPmFsbF9tZGRldnMsICZhbGxfbWRkZXZzKTsKIAkJc3Bpbl91bmxvY2soJmFsbF9tZGRldnNfbG9jayk7CiAJCXJldHVybiBuZXc7CkBAIC0yNzUsMTYgKzMyMyw2IEBACiAJbmV3LT5yZXN5bmNfbWF4ID0gTWF4U2VjdG9yOwogCW5ldy0+bGV2ZWwgPSBMRVZFTF9OT05FOwogCi0JbmV3LT5xdWV1ZSA9IGJsa19hbGxvY19xdWV1ZShHRlBfS0VSTkVMKTsKLQlpZiAoIW5ldy0+cXVldWUpIHsKLQkJa2ZyZWUobmV3KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCS8qIENhbiBiZSB1bmxvY2tlZCBiZWNhdXNlIHRoZSBxdWV1ZSBpcyBuZXc6IG5vIGNvbmN1cnJlbmN5ICovCi0JcXVldWVfZmxhZ19zZXRfdW5sb2NrZWQoUVVFVUVfRkxBR19DTFVTVEVSLCBuZXctPnF1ZXVlKTsKLQotCWJsa19xdWV1ZV9tYWtlX3JlcXVlc3QobmV3LT5xdWV1ZSwgbWRfZmFpbF9yZXF1ZXN0KTsKLQogCWdvdG8gcmV0cnk7CiB9CiAKQEAgLTMwNywyNSArMzQ1LDIzIEBACiAKIHN0YXRpYyBtZGtfcmRldl90ICogZmluZF9yZGV2X25yKG1kZGV2X3QgKm1kZGV2LCBpbnQgbnIpCiB7Ci0JbWRrX3JkZXZfdCAqIHJkZXY7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqdG1wOworCW1ka19yZGV2X3QgKnJkZXY7CiAKLQlyZGV2X2Zvcl9lYWNoKHJkZXYsIHRtcCwgbWRkZXYpIHsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJkZXYsICZtZGRldi0+ZGlza3MsIHNhbWVfc2V0KQogCQlpZiAocmRldi0+ZGVzY19uciA9PSBucikKIAkJCXJldHVybiByZGV2OwotCX0KKwogCXJldHVybiBOVUxMOwogfQogCiBzdGF0aWMgbWRrX3JkZXZfdCAqIGZpbmRfcmRldihtZGRldl90ICogbWRkZXYsIGRldl90IGRldikKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICp0bXA7CiAJbWRrX3JkZXZfdCAqcmRldjsKIAotCXJkZXZfZm9yX2VhY2gocmRldiwgdG1wLCBtZGRldikgeworCWxpc3RfZm9yX2VhY2hfZW50cnkocmRldiwgJm1kZGV2LT5kaXNrcywgc2FtZV9zZXQpCiAJCWlmIChyZGV2LT5iZGV2LT5iZF9kZXYgPT0gZGV2KQogCQkJcmV0dXJuIHJkZXY7Ci0JfQorCiAJcmV0dXJuIE5VTEw7CiB9CiAKQEAgLTg2MSw3ICs4OTcsNiBAQAogc3RhdGljIHZvaWQgc3VwZXJfOTBfc3luYyhtZGRldl90ICptZGRldiwgbWRrX3JkZXZfdCAqcmRldikKIHsKIAltZHBfc3VwZXJfdCAqc2I7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqdG1wOwogCW1ka19yZGV2X3QgKnJkZXYyOwogCWludCBuZXh0X3NwYXJlID0gbWRkZXYtPnJhaWRfZGlza3M7CiAKQEAgLTkzMyw3ICs5NjgsNyBAQAogCQlzYi0+c3RhdGUgfD0gKDE8PE1EX1NCX0JJVE1BUF9QUkVTRU5UKTsKIAogCXNiLT5kaXNrc1swXS5zdGF0ZSA9ICgxPDxNRF9ESVNLX1JFTU9WRUQpOwotCXJkZXZfZm9yX2VhY2gocmRldjIsIHRtcCwgbWRkZXYpIHsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJkZXYyLCAmbWRkZXYtPmRpc2tzLCBzYW1lX3NldCkgewogCQltZHBfZGlza190ICpkOwogCQlpbnQgZGVzY19ucjsKIAkJaWYgKHJkZXYyLT5yYWlkX2Rpc2sgPj0gMCAmJiB0ZXN0X2JpdChJbl9zeW5jLCAmcmRldjItPmZsYWdzKQpAQCAtMTI1OSw3ICsxMjk0LDYgQEAKIHN0YXRpYyB2b2lkIHN1cGVyXzFfc3luYyhtZGRldl90ICptZGRldiwgbWRrX3JkZXZfdCAqcmRldikKIHsKIAlzdHJ1Y3QgbWRwX3N1cGVyYmxvY2tfMSAqc2I7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqdG1wOwogCW1ka19yZGV2X3QgKnJkZXYyOwogCWludCBtYXhfZGV2LCBpOwogCS8qIG1ha2UgcmRldi0+c2IgbWF0Y2ggbWRkZXYgYW5kIHJkZXYgZGF0YS4gKi8KQEAgLTEzMDcsNyArMTM0MSw3IEBACiAJfQogCiAJbWF4X2RldiA9IDA7Ci0JcmRldl9mb3JfZWFjaChyZGV2MiwgdG1wLCBtZGRldikKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJkZXYyLCAmbWRkZXYtPmRpc2tzLCBzYW1lX3NldCkKIAkJaWYgKHJkZXYyLT5kZXNjX25yKzEgPiBtYXhfZGV2KQogCQkJbWF4X2RldiA9IHJkZXYyLT5kZXNjX25yKzE7CiAKQEAgLTEzMTYsNyArMTM1MCw3IEBACiAJZm9yIChpPTA7IGk8bWF4X2RldjtpKyspCiAJCXNiLT5kZXZfcm9sZXNbaV0gPSBjcHVfdG9fbGUxNigweGZmZmUpOwogCQotCXJkZXZfZm9yX2VhY2gocmRldjIsIHRtcCwgbWRkZXYpIHsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJkZXYyLCAmbWRkZXYtPmRpc2tzLCBzYW1lX3NldCkgewogCQlpID0gcmRldjItPmRlc2NfbnI7CiAJCWlmICh0ZXN0X2JpdChGYXVsdHksICZyZGV2Mi0+ZmxhZ3MpKQogCQkJc2ItPmRldl9yb2xlc1tpXSA9IGNwdV90b19sZTE2KDB4ZmZmZSk7CkBAIC0xNDY2LDYgKzE1MDAsOSBAQAogCiAJbGlzdF9hZGRfcmN1KCZyZGV2LT5zYW1lX3NldCwgJm1kZGV2LT5kaXNrcyk7CiAJYmRfY2xhaW1fYnlfZGlzayhyZGV2LT5iZGV2LCByZGV2LT5iZGV2LT5iZF9ob2xkZXIsIG1kZGV2LT5nZW5kaXNrKTsKKworCS8qIE1heSBhcyB3ZWxsIGFsbG93IHJlY292ZXJ5IHRvIGJlIHJldHJpZWQgb25jZSAqLworCW1kZGV2LT5yZWNvdmVyeV9kaXNhYmxlZCA9IDA7CiAJcmV0dXJuIDA7CiAKICBmYWlsOgpAQCAtMTU3MSw4ICsxNjA4LDcgQEAKIAogc3RhdGljIHZvaWQgZXhwb3J0X2FycmF5KG1kZGV2X3QgKm1kZGV2KQogewotCXN0cnVjdCBsaXN0X2hlYWQgKnRtcDsKLQltZGtfcmRldl90ICpyZGV2OworCW1ka19yZGV2X3QgKnJkZXYsICp0bXA7CiAKIAlyZGV2X2Zvcl9lYWNoKHJkZXYsIHRtcCwgbWRkZXYpIHsKIAkJaWYgKCFyZGV2LT5tZGRldikgewpAQCAtMTU5Myw3ICsxNjI5LDcgQEAKIAkJZGVzYy0+bWFqb3IsZGVzYy0+bWlub3IsZGVzYy0+cmFpZF9kaXNrLGRlc2MtPnN0YXRlKTsKIH0KIAotc3RhdGljIHZvaWQgcHJpbnRfc2IobWRwX3N1cGVyX3QgKnNiKQorc3RhdGljIHZvaWQgcHJpbnRfc2JfOTAobWRwX3N1cGVyX3QgKnNiKQogewogCWludCBpOwogCkBAIC0xNjI0LDEwICsxNjYwLDU3IEBACiAJfQogCXByaW50ayhLRVJOX0lORk8gIm1kOiAgICAgVEhJUzogIik7CiAJcHJpbnRfZGVzYygmc2ItPnRoaXNfZGlzayk7Ci0KIH0KIAotc3RhdGljIHZvaWQgcHJpbnRfcmRldihtZGtfcmRldl90ICpyZGV2KQorc3RhdGljIHZvaWQgcHJpbnRfc2JfMShzdHJ1Y3QgbWRwX3N1cGVyYmxvY2tfMSAqc2IpCit7CisJX191OCAqdXVpZDsKKworCXV1aWQgPSBzYi0+c2V0X3V1aWQ7CisJcHJpbnRrKEtFUk5fSU5GTyAibWQ6ICBTQjogKFY6JXUpIChGOjB4JTA4eCkgQXJyYXktSUQ6PCUwMnglMDJ4JTAyeCUwMngiCisJCQkiOiUwMnglMDJ4OiUwMnglMDJ4OiUwMnglMDJ4OiUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeD5cbiIKKwkgICAgICAgS0VSTl9JTkZPICJtZDogICAgTmFtZTogXCIlc1wiIENUOiVsbHVcbiIsCisJCWxlMzJfdG9fY3B1KHNiLT5tYWpvcl92ZXJzaW9uKSwKKwkJbGUzMl90b19jcHUoc2ItPmZlYXR1cmVfbWFwKSwKKwkJdXVpZFswXSwgdXVpZFsxXSwgdXVpZFsyXSwgdXVpZFszXSwKKwkJdXVpZFs0XSwgdXVpZFs1XSwgdXVpZFs2XSwgdXVpZFs3XSwKKwkJdXVpZFs4XSwgdXVpZFs5XSwgdXVpZFsxMF0sIHV1aWRbMTFdLAorCQl1dWlkWzEyXSwgdXVpZFsxM10sIHV1aWRbMTRdLCB1dWlkWzE1XSwKKwkJc2ItPnNldF9uYW1lLAorCQkodW5zaWduZWQgbG9uZyBsb25nKWxlNjRfdG9fY3B1KHNiLT5jdGltZSkKKwkJICAgICAgICYgTURfU1VQRVJCTE9DS18xX1RJTUVfU0VDX01BU0spOworCisJdXVpZCA9IHNiLT5kZXZpY2VfdXVpZDsKKwlwcmludGsoS0VSTl9JTkZPICJtZDogICAgICAgTCV1IFNaJWxsdSBSRDoldSBMTzoldSBDUzoldSBETzolbGx1IERTOiVsbHUgU086JWxsdSIKKwkJCSIgUk86JWxsdVxuIgorCSAgICAgICBLRVJOX0lORk8gIm1kOiAgICAgRGV2OiUwOHggVVVJRDogJTAyeCUwMnglMDJ4JTAyeDolMDJ4JTAyeDolMDJ4JTAyeDolMDJ4JTAyeCIKKwkJCSI6JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4XG4iCisJICAgICAgIEtFUk5fSU5GTyAibWQ6ICAgICAgIChGOjB4JTA4eCkgVVQ6JWxsdSBFdmVudHM6JWxsdSBSZXN5bmNPZmZzZXQ6JWxsdSBDU1VNOjB4JTA4eFxuIgorCSAgICAgICBLRVJOX0lORk8gIm1kOiAgICAgICAgIChNYXhEZXY6JXUpIFxuIiwKKwkJbGUzMl90b19jcHUoc2ItPmxldmVsKSwKKwkJKHVuc2lnbmVkIGxvbmcgbG9uZylsZTY0X3RvX2NwdShzYi0+c2l6ZSksCisJCWxlMzJfdG9fY3B1KHNiLT5yYWlkX2Rpc2tzKSwKKwkJbGUzMl90b19jcHUoc2ItPmxheW91dCksCisJCWxlMzJfdG9fY3B1KHNiLT5jaHVua3NpemUpLAorCQkodW5zaWduZWQgbG9uZyBsb25nKWxlNjRfdG9fY3B1KHNiLT5kYXRhX29mZnNldCksCisJCSh1bnNpZ25lZCBsb25nIGxvbmcpbGU2NF90b19jcHUoc2ItPmRhdGFfc2l6ZSksCisJCSh1bnNpZ25lZCBsb25nIGxvbmcpbGU2NF90b19jcHUoc2ItPnN1cGVyX29mZnNldCksCisJCSh1bnNpZ25lZCBsb25nIGxvbmcpbGU2NF90b19jcHUoc2ItPnJlY292ZXJ5X29mZnNldCksCisJCWxlMzJfdG9fY3B1KHNiLT5kZXZfbnVtYmVyKSwKKwkJdXVpZFswXSwgdXVpZFsxXSwgdXVpZFsyXSwgdXVpZFszXSwKKwkJdXVpZFs0XSwgdXVpZFs1XSwgdXVpZFs2XSwgdXVpZFs3XSwKKwkJdXVpZFs4XSwgdXVpZFs5XSwgdXVpZFsxMF0sIHV1aWRbMTFdLAorCQl1dWlkWzEyXSwgdXVpZFsxM10sIHV1aWRbMTRdLCB1dWlkWzE1XSwKKwkJc2ItPmRldmZsYWdzLAorCQkodW5zaWduZWQgbG9uZyBsb25nKWxlNjRfdG9fY3B1KHNiLT51dGltZSkgJiBNRF9TVVBFUkJMT0NLXzFfVElNRV9TRUNfTUFTSywKKwkJKHVuc2lnbmVkIGxvbmcgbG9uZylsZTY0X3RvX2NwdShzYi0+ZXZlbnRzKSwKKwkJKHVuc2lnbmVkIGxvbmcgbG9uZylsZTY0X3RvX2NwdShzYi0+cmVzeW5jX29mZnNldCksCisJCWxlMzJfdG9fY3B1KHNiLT5zYl9jc3VtKSwKKwkJbGUzMl90b19jcHUoc2ItPm1heF9kZXYpCisJCSk7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X3JkZXYobWRrX3JkZXZfdCAqcmRldiwgaW50IG1ham9yX3ZlcnNpb24pCiB7CiAJY2hhciBiW0JERVZOQU1FX1NJWkVdOwogCXByaW50ayhLRVJOX0lORk8gIm1kOiByZGV2ICVzLCBTWjolMDhsbHUgRjolZCBTOiVkIEROOiV1XG4iLApAQCAtMTYzNSwxNSArMTcxOCwyMiBAQAogCSAgICAgICAgdGVzdF9iaXQoRmF1bHR5LCAmcmRldi0+ZmxhZ3MpLCB0ZXN0X2JpdChJbl9zeW5jLCAmcmRldi0+ZmxhZ3MpLAogCSAgICAgICAgcmRldi0+ZGVzY19ucik7CiAJaWYgKHJkZXYtPnNiX2xvYWRlZCkgewotCQlwcmludGsoS0VSTl9JTkZPICJtZDogcmRldiBzdXBlcmJsb2NrOlxuIik7Ci0JCXByaW50X3NiKChtZHBfc3VwZXJfdCopcGFnZV9hZGRyZXNzKHJkZXYtPnNiX3BhZ2UpKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAibWQ6IHJkZXYgc3VwZXJibG9jayAoTUo6JWQpOlxuIiwgbWFqb3JfdmVyc2lvbik7CisJCXN3aXRjaCAobWFqb3JfdmVyc2lvbikgeworCQljYXNlIDA6CisJCQlwcmludF9zYl85MCgobWRwX3N1cGVyX3QqKXBhZ2VfYWRkcmVzcyhyZGV2LT5zYl9wYWdlKSk7CisJCQlicmVhazsKKwkJY2FzZSAxOgorCQkJcHJpbnRfc2JfMSgoc3RydWN0IG1kcF9zdXBlcmJsb2NrXzEgKilwYWdlX2FkZHJlc3MocmRldi0+c2JfcGFnZSkpOworCQkJYnJlYWs7CisJCX0KIAl9IGVsc2UKIAkJcHJpbnRrKEtFUk5fSU5GTyAibWQ6IG5vIHJkZXYgc3VwZXJibG9jayFcbiIpOwogfQogCiBzdGF0aWMgdm9pZCBtZF9wcmludF9kZXZpY2VzKHZvaWQpCiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqdG1wLCAqdG1wMjsKKwlzdHJ1Y3QgbGlzdF9oZWFkICp0bXA7CiAJbWRrX3JkZXZfdCAqcmRldjsKIAltZGRldl90ICptZGRldjsKIAljaGFyIGJbQkRFVk5BTUVfU0laRV07CkBAIC0xNjU4LDEyICsxNzQ4LDEyIEBACiAJCQliaXRtYXBfcHJpbnRfc2IobWRkZXYtPmJpdG1hcCk7CiAJCWVsc2UKIAkJCXByaW50aygiJXM6ICIsIG1kbmFtZShtZGRldikpOwotCQlyZGV2X2Zvcl9lYWNoKHJkZXYsIHRtcDIsIG1kZGV2KQorCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJkZXYsICZtZGRldi0+ZGlza3MsIHNhbWVfc2V0KQogCQkJcHJpbnRrKCI8JXM+IiwgYmRldm5hbWUocmRldi0+YmRldixiKSk7CiAJCXByaW50aygiXG4iKTsKIAotCQlyZGV2X2Zvcl9lYWNoKHJkZXYsIHRtcDIsIG1kZGV2KQotCQkJcHJpbnRfcmRldihyZGV2KTsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShyZGV2LCAmbWRkZXYtPmRpc2tzLCBzYW1lX3NldCkKKwkJCXByaW50X3JkZXYocmRldiwgbWRkZXYtPm1ham9yX3ZlcnNpb24pOwogCX0KIAlwcmludGsoIm1kOgkqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4iKTsKIAlwcmludGsoIlxuIik7CkBAIC0xNjc5LDkgKzE3NjksOCBAQAogCSAqIHdpdGggdGhlIHJlc3Qgb2YgdGhlIGFycmF5KQogCSAqLwogCW1ka19yZGV2X3QgKnJkZXY7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqdG1wOwogCi0JcmRldl9mb3JfZWFjaChyZGV2LCB0bXAsIG1kZGV2KSB7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShyZGV2LCAmbWRkZXYtPmRpc2tzLCBzYW1lX3NldCkgewogCQlpZiAocmRldi0+c2JfZXZlbnRzID09IG1kZGV2LT5ldmVudHMgfHwKIAkJICAgIChub3NwYXJlcyAmJgogCQkgICAgIHJkZXYtPnJhaWRfZGlzayA8IDAgJiYKQEAgLTE2OTksNyArMTc4OCw2IEBACiAKIHN0YXRpYyB2b2lkIG1kX3VwZGF0ZV9zYihtZGRldl90ICogbWRkZXYsIGludCBmb3JjZV9jaGFuZ2UpCiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqdG1wOwogCW1ka19yZGV2X3QgKnJkZXY7CiAJaW50IHN5bmNfcmVxOwogCWludCBub3NwYXJlcyA9IDA7CkBAIC0xNzkwLDcgKzE4NzgsNyBAQAogCQltZG5hbWUobWRkZXYpLG1kZGV2LT5pbl9zeW5jKTsKIAogCWJpdG1hcF91cGRhdGVfc2IobWRkZXYtPmJpdG1hcCk7Ci0JcmRldl9mb3JfZWFjaChyZGV2LCB0bXAsIG1kZGV2KSB7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShyZGV2LCAmbWRkZXYtPmRpc2tzLCBzYW1lX3NldCkgewogCQljaGFyIGJbQkRFVk5BTUVfU0laRV07CiAJCWRwcmludGsoS0VSTl9JTkZPICJtZDogIik7CiAJCWlmIChyZGV2LT5zYl9sb2FkZWQgIT0gMSkKQEAgLTE5OTksNyArMjA4Nyw2IEBACiAJCW1kX3dha2V1cF90aHJlYWQocmRldi0+bWRkZXYtPnRocmVhZCk7CiAJfSBlbHNlIGlmIChyZGV2LT5tZGRldi0+cGVycykgewogCQltZGtfcmRldl90ICpyZGV2MjsKLQkJc3RydWN0IGxpc3RfaGVhZCAqdG1wOwogCQkvKiBBY3RpdmF0aW5nIGEgc3BhcmUgLi4gb3IgcG9zc2libHkgcmVhY3RpdmF0aW5nCiAJCSAqIGlmIHdlIGV2ZXJ5IGdldCBiaXRtYXBzIHdvcmtpbmcgaGVyZS4KIAkJICovCkBAIC0yMDEwLDcgKzIwOTcsNyBAQAogCQlpZiAocmRldi0+bWRkZXYtPnBlcnMtPmhvdF9hZGRfZGlzayA9PSBOVUxMKQogCQkJcmV0dXJuIC1FSU5WQUw7CiAKLQkJcmRldl9mb3JfZWFjaChyZGV2MiwgdG1wLCByZGV2LT5tZGRldikKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShyZGV2MiwgJnJkZXYtPm1kZGV2LT5kaXNrcywgc2FtZV9zZXQpCiAJCQlpZiAocmRldjItPnJhaWRfZGlzayA9PSBzbG90KQogCQkJCXJldHVybiAtRUVYSVNUOwogCkBAIC0yMTI1LDE0ICsyMjEyLDE0IEBACiAJCSAqLwogCQltZGRldl90ICptZGRldjsKIAkJaW50IG92ZXJsYXAgPSAwOwotCQlzdHJ1Y3QgbGlzdF9oZWFkICp0bXAsICp0bXAyOworCQlzdHJ1Y3QgbGlzdF9oZWFkICp0bXA7CiAKIAkJbWRkZXZfdW5sb2NrKG15X21kZGV2KTsKIAkJZm9yX2VhY2hfbWRkZXYobWRkZXYsIHRtcCkgewogCQkJbWRrX3JkZXZfdCAqcmRldjI7CiAKIAkJCW1kZGV2X2xvY2sobWRkZXYpOwotCQkJcmRldl9mb3JfZWFjaChyZGV2MiwgdG1wMiwgbWRkZXYpCisJCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJkZXYyLCAmbWRkZXYtPmRpc2tzLCBzYW1lX3NldCkKIAkJCQlpZiAodGVzdF9iaXQoQWxsUmVzZXJ2ZWQsICZyZGV2Mi0+ZmxhZ3MpIHx8CiAJCQkJICAgIChyZGV2LT5iZGV2ID09IHJkZXYyLT5iZGV2ICYmCiAJCQkJICAgICByZGV2ICE9IHJkZXYyICYmCkBAIC0yMzI4LDggKzI0MTUsNyBAQAogc3RhdGljIHZvaWQgYW5hbHl6ZV9zYnMobWRkZXZfdCAqIG1kZGV2KQogewogCWludCBpOwotCXN0cnVjdCBsaXN0X2hlYWQgKnRtcDsKLQltZGtfcmRldl90ICpyZGV2LCAqZnJlc2hlc3Q7CisJbWRrX3JkZXZfdCAqcmRldiwgKmZyZXNoZXN0LCAqdG1wOwogCWNoYXIgYltCREVWTkFNRV9TSVpFXTsKIAogCWZyZXNoZXN0ID0gTlVMTDsKQEAgLTMwNDYsNyArMzEzMiw3IEBACiAJfQogCXNldF9iaXQoTURfUkVDT1ZFUllfTkVFREVELCAmbWRkZXYtPnJlY292ZXJ5KTsKIAltZF93YWtldXBfdGhyZWFkKG1kZGV2LT50aHJlYWQpOwotCXN5c2ZzX25vdGlmeSgmbWRkZXYtPmtvYmosIE5VTEwsICJzeW5jX2FjdGlvbiIpOworCXN5c2ZzX25vdGlmeV9kaXJlbnQobWRkZXYtPnN5c2ZzX2FjdGlvbik7CiAJcmV0dXJuIGxlbjsKIH0KIApAQCAtMzQwNCw2ICszNDkwLDggQEAKIAlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCiAJCXJldHVybiAtRUFDQ0VTOwogCXJ2ID0gbWRkZXZfbG9jayhtZGRldik7CisJaWYgKG1kZGV2LT5ob2xkX2FjdGl2ZSA9PSBVTlRJTF9JT0NUTCkKKwkJbWRkZXYtPmhvbGRfYWN0aXZlID0gMDsKIAlpZiAoIXJ2KSB7CiAJCXJ2ID0gZW50cnktPnN0b3JlKG1kZGV2LCBwYWdlLCBsZW5ndGgpOwogCQltZGRldl91bmxvY2sobWRkZXYpOwpAQCAtMzQxNCw2ICszNTAyLDE3IEBACiBzdGF0aWMgdm9pZCBtZF9mcmVlKHN0cnVjdCBrb2JqZWN0ICprbykKIHsKIAltZGRldl90ICptZGRldiA9IGNvbnRhaW5lcl9vZihrbywgbWRkZXZfdCwga29iaik7CisKKwlpZiAobWRkZXYtPnN5c2ZzX3N0YXRlKQorCQlzeXNmc19wdXQobWRkZXYtPnN5c2ZzX3N0YXRlKTsKKworCWlmIChtZGRldi0+Z2VuZGlzaykgeworCQlkZWxfZ2VuZGlzayhtZGRldi0+Z2VuZGlzayk7CisJCXB1dF9kaXNrKG1kZGV2LT5nZW5kaXNrKTsKKwl9CisJaWYgKG1kZGV2LT5xdWV1ZSkKKwkJYmxrX2NsZWFudXBfcXVldWUobWRkZXYtPnF1ZXVlKTsKKwogCWtmcmVlKG1kZGV2KTsKIH0KIApAQCAtMzQyOSwzNCArMzUyOCw3NCBAQAogCiBpbnQgbWRwX21ham9yID0gMDsKIAotc3RhdGljIHN0cnVjdCBrb2JqZWN0ICptZF9wcm9iZShkZXZfdCBkZXYsIGludCAqcGFydCwgdm9pZCAqZGF0YSkKK3N0YXRpYyBpbnQgbWRfYWxsb2MoZGV2X3QgZGV2LCBjaGFyICpuYW1lKQogewogCXN0YXRpYyBERUZJTkVfTVVURVgoZGlza3NfbXV0ZXgpOwogCW1kZGV2X3QgKm1kZGV2ID0gbWRkZXZfZmluZChkZXYpOwogCXN0cnVjdCBnZW5kaXNrICpkaXNrOwotCWludCBwYXJ0aXRpb25lZCA9IChNQUpPUihkZXYpICE9IE1EX01BSk9SKTsKLQlpbnQgc2hpZnQgPSBwYXJ0aXRpb25lZCA/IE1kcE1pbm9yU2hpZnQgOiAwOwotCWludCB1bml0ID0gTUlOT1IoZGV2KSA+PiBzaGlmdDsKKwlpbnQgcGFydGl0aW9uZWQ7CisJaW50IHNoaWZ0OworCWludCB1bml0OwogCWludCBlcnJvcjsKIAogCWlmICghbWRkZXYpCi0JCXJldHVybiBOVUxMOworCQlyZXR1cm4gLUVOT0RFVjsKKworCXBhcnRpdGlvbmVkID0gKE1BSk9SKG1kZGV2LT51bml0KSAhPSBNRF9NQUpPUik7CisJc2hpZnQgPSBwYXJ0aXRpb25lZCA/IE1kcE1pbm9yU2hpZnQgOiAwOworCXVuaXQgPSBNSU5PUihtZGRldi0+dW5pdCkgPj4gc2hpZnQ7CisKKwkvKiB3YWl0IGZvciBhbnkgcHJldmlvdXMgaW5zdGFuY2UgaWYgdGhpcyBkZXZpY2UKKwkgKiB0byBiZSBjb21wbGV0ZWQgcmVtb3ZlZCAobWRkZXZfZGVsYXllZF9kZWxldGUpLgorCSAqLworCWZsdXNoX3NjaGVkdWxlZF93b3JrKCk7CiAKIAltdXRleF9sb2NrKCZkaXNrc19tdXRleCk7CiAJaWYgKG1kZGV2LT5nZW5kaXNrKSB7CiAJCW11dGV4X3VubG9jaygmZGlza3NfbXV0ZXgpOwogCQltZGRldl9wdXQobWRkZXYpOwotCQlyZXR1cm4gTlVMTDsKKwkJcmV0dXJuIC1FRVhJU1Q7CiAJfQorCisJaWYgKG5hbWUpIHsKKwkJLyogTmVlZCB0byBlbnN1cmUgdGhhdCAnbmFtZScgaXMgbm90IGEgZHVwbGljYXRlLgorCQkgKi8KKwkJbWRkZXZfdCAqbWRkZXYyOworCQlzcGluX2xvY2soJmFsbF9tZGRldnNfbG9jayk7CisKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShtZGRldjIsICZhbGxfbWRkZXZzLCBhbGxfbWRkZXZzKQorCQkJaWYgKG1kZGV2Mi0+Z2VuZGlzayAmJgorCQkJICAgIHN0cmNtcChtZGRldjItPmdlbmRpc2stPmRpc2tfbmFtZSwgbmFtZSkgPT0gMCkgeworCQkJCXNwaW5fdW5sb2NrKCZhbGxfbWRkZXZzX2xvY2spOworCQkJCXJldHVybiAtRUVYSVNUOworCQkJfQorCQlzcGluX3VubG9jaygmYWxsX21kZGV2c19sb2NrKTsKKwl9CisKKwltZGRldi0+cXVldWUgPSBibGtfYWxsb2NfcXVldWUoR0ZQX0tFUk5FTCk7CisJaWYgKCFtZGRldi0+cXVldWUpIHsKKwkJbXV0ZXhfdW5sb2NrKCZkaXNrc19tdXRleCk7CisJCW1kZGV2X3B1dChtZGRldik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwkvKiBDYW4gYmUgdW5sb2NrZWQgYmVjYXVzZSB0aGUgcXVldWUgaXMgbmV3OiBubyBjb25jdXJyZW5jeSAqLworCXF1ZXVlX2ZsYWdfc2V0X3VubG9ja2VkKFFVRVVFX0ZMQUdfQ0xVU1RFUiwgbWRkZXYtPnF1ZXVlKTsKKworCWJsa19xdWV1ZV9tYWtlX3JlcXVlc3QobWRkZXYtPnF1ZXVlLCBtZF9mYWlsX3JlcXVlc3QpOworCiAJZGlzayA9IGFsbG9jX2Rpc2soMSA8PCBzaGlmdCk7CiAJaWYgKCFkaXNrKSB7CiAJCW11dGV4X3VubG9jaygmZGlza3NfbXV0ZXgpOworCQlibGtfY2xlYW51cF9xdWV1ZShtZGRldi0+cXVldWUpOworCQltZGRldi0+cXVldWUgPSBOVUxMOwogCQltZGRldl9wdXQobWRkZXYpOwotCQlyZXR1cm4gTlVMTDsKKwkJcmV0dXJuIC1FTk9NRU07CiAJfQotCWRpc2stPm1ham9yID0gTUFKT1IoZGV2KTsKKwlkaXNrLT5tYWpvciA9IE1BSk9SKG1kZGV2LT51bml0KTsKIAlkaXNrLT5maXJzdF9taW5vciA9IHVuaXQgPDwgc2hpZnQ7Ci0JaWYgKHBhcnRpdGlvbmVkKQorCWlmIChuYW1lKQorCQlzdHJjcHkoZGlzay0+ZGlza19uYW1lLCBuYW1lKTsKKwllbHNlIGlmIChwYXJ0aXRpb25lZCkKIAkJc3ByaW50ZihkaXNrLT5kaXNrX25hbWUsICJtZF9kJWQiLCB1bml0KTsKIAllbHNlCiAJCXNwcmludGYoZGlzay0+ZGlza19uYW1lLCAibWQlZCIsIHVuaXQpOwpAQCAtMzQ2NCw3ICszNjAzLDcgQEAKIAlkaXNrLT5wcml2YXRlX2RhdGEgPSBtZGRldjsKIAlkaXNrLT5xdWV1ZSA9IG1kZGV2LT5xdWV1ZTsKIAkvKiBBbGxvdyBleHRlbmRlZCBwYXJ0aXRpb25zLiAgVGhpcyBtYWtlcyB0aGUKLQkgKiAnbWRwJyBkZXZpY2UgcmVkdW5kYW50LCBidXQgd2UgY2FuIHJlYWxseQorCSAqICdtZHAnIGRldmljZSByZWR1bmRhbnQsIGJ1dCB3ZSBjYW4ndCByZWFsbHkKIAkgKiByZW1vdmUgaXQgbm93LgogCSAqLwogCWRpc2stPmZsYWdzIHw9IEdFTkhEX0ZMX0VYVF9ERVZUOwpAQCAtMzQ4MCw5ICszNjE5LDM1IEBACiAJCWtvYmplY3RfdWV2ZW50KCZtZGRldi0+a29iaiwgS09CSl9BREQpOwogCQltZGRldi0+c3lzZnNfc3RhdGUgPSBzeXNmc19nZXRfZGlyZW50KG1kZGV2LT5rb2JqLnNkLCAiYXJyYXlfc3RhdGUiKTsKIAl9CisJbWRkZXZfcHV0KG1kZGV2KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBrb2JqZWN0ICptZF9wcm9iZShkZXZfdCBkZXYsIGludCAqcGFydCwgdm9pZCAqZGF0YSkKK3sKKwltZF9hbGxvYyhkZXYsIE5VTEwpOwogCXJldHVybiBOVUxMOwogfQogCitzdGF0aWMgaW50IGFkZF9uYW1lZF9hcnJheShjb25zdCBjaGFyICp2YWwsIHN0cnVjdCBrZXJuZWxfcGFyYW0gKmtwKQoreworCS8qIHZhbCBtdXN0IGJlICJtZF8qIiB3aGVyZSAqIGlzIG5vdCBhbGwgZGlnaXRzLgorCSAqIFdlIGFsbG9jYXRlIGFuIGFycmF5IHdpdGggYSBsYXJnZSBmcmVlIG1pbm9yIG51bWJlciwgYW5kCisJICogc2V0IHRoZSBuYW1lIHRvIHZhbC4gIHZhbCBtdXN0IG5vdCBhbHJlYWR5IGJlIGFuIGFjdGl2ZSBuYW1lLgorCSAqLworCWludCBsZW4gPSBzdHJsZW4odmFsKTsKKwljaGFyIGJ1ZltESVNLX05BTUVfTEVOXTsKKworCXdoaWxlIChsZW4gJiYgdmFsW2xlbi0xXSA9PSAnXG4nKQorCQlsZW4tLTsKKwlpZiAobGVuID49IERJU0tfTkFNRV9MRU4pCisJCXJldHVybiAtRTJCSUc7CisJc3RybGNweShidWYsIHZhbCwgbGVuKzEpOworCWlmIChzdHJuY21wKGJ1ZiwgIm1kXyIsIDMpICE9IDApCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiBtZF9hbGxvYygwLCBidWYpOworfQorCiBzdGF0aWMgdm9pZCBtZF9zYWZlbW9kZV90aW1lb3V0KHVuc2lnbmVkIGxvbmcgZGF0YSkKIHsKIAltZGRldl90ICptZGRldiA9IChtZGRldl90ICopIGRhdGE7CkBAIC0zNTAxLDcgKzM2NjYsNiBAQAogewogCWludCBlcnI7CiAJaW50IGNodW5rX3NpemU7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqdG1wOwogCW1ka19yZGV2X3QgKnJkZXY7CiAJc3RydWN0IGdlbmRpc2sgKmRpc2s7CiAJc3RydWN0IG1ka19wZXJzb25hbGl0eSAqcGVyczsKQEAgLTM1NDAsNyArMzcwNCw3IEBACiAJCX0KIAogCQkvKiBkZXZpY2VzIG11c3QgaGF2ZSBtaW5pbXVtIHNpemUgb2Ygb25lIGNodW5rICovCi0JCXJkZXZfZm9yX2VhY2gocmRldiwgdG1wLCBtZGRldikgeworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJkZXYsICZtZGRldi0+ZGlza3MsIHNhbWVfc2V0KSB7CiAJCQlpZiAodGVzdF9iaXQoRmF1bHR5LCAmcmRldi0+ZmxhZ3MpKQogCQkJCWNvbnRpbnVlOwogCQkJaWYgKHJkZXYtPnNpemUgPCBjaHVua19zaXplIC8gMTAyNCkgewpAQCAtMzU2NSw3ICszNzI5LDcgQEAKIAkgKiB0aGUgb25seSB2YWxpZCBleHRlcm5hbCBpbnRlcmZhY2UgaXMgdGhyb3VnaCB0aGUgbWQKIAkgKiBkZXZpY2UuCiAJICovCi0JcmRldl9mb3JfZWFjaChyZGV2LCB0bXAsIG1kZGV2KSB7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShyZGV2LCAmbWRkZXYtPmRpc2tzLCBzYW1lX3NldCkgewogCQlpZiAodGVzdF9iaXQoRmF1bHR5LCAmcmRldi0+ZmxhZ3MpKQogCQkJY29udGludWU7CiAJCXN5bmNfYmxvY2tkZXYocmRldi0+YmRldik7CkBAIC0zNjMwLDEwICszNzk0LDEwIEBACiAJCSAqLwogCQljaGFyIGJbQkRFVk5BTUVfU0laRV0sIGIyW0JERVZOQU1FX1NJWkVdOwogCQltZGtfcmRldl90ICpyZGV2MjsKLQkJc3RydWN0IGxpc3RfaGVhZCAqdG1wMjsKIAkJaW50IHdhcm5lZCA9IDA7Ci0JCXJkZXZfZm9yX2VhY2gocmRldiwgdG1wLCBtZGRldikgewotCQkJcmRldl9mb3JfZWFjaChyZGV2MiwgdG1wMiwgbWRkZXYpIHsKKworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJkZXYsICZtZGRldi0+ZGlza3MsIHNhbWVfc2V0KQorCQkJbGlzdF9mb3JfZWFjaF9lbnRyeShyZGV2MiwgJm1kZGV2LT5kaXNrcywgc2FtZV9zZXQpIHsKIAkJCQlpZiAocmRldiA8IHJkZXYyICYmCiAJCQkJICAgIHJkZXYtPmJkZXYtPmJkX2NvbnRhaW5zID09CiAJCQkJICAgIHJkZXYyLT5iZGV2LT5iZF9jb250YWlucykgewpAQCAtMzY0Nyw3ICszODExLDcgQEAKIAkJCQkJd2FybmVkID0gMTsKIAkJCQl9CiAJCQl9Ci0JCX0KKwogCQlpZiAod2FybmVkKQogCQkJcHJpbnRrKEtFUk5fV0FSTklORwogCQkJICAgICAgICJUcnVlIHByb3RlY3Rpb24gYWdhaW5zdCBzaW5nbGUtZGlzayIKQEAgLTM2ODQsNiArMzg0OCw3IEBACiAJCQlwcmludGsoS0VSTl9XQVJOSU5HCiAJCQkgICAgICAgIm1kOiBjYW5ub3QgcmVnaXN0ZXIgZXh0cmEgYXR0cmlidXRlcyBmb3IgJXNcbiIsCiAJCQkgICAgICAgbWRuYW1lKG1kZGV2KSk7CisJCW1kZGV2LT5zeXNmc19hY3Rpb24gPSBzeXNmc19nZXRfZGlyZW50KG1kZGV2LT5rb2JqLnNkLCAic3luY19hY3Rpb24iKTsKIAl9IGVsc2UgaWYgKG1kZGV2LT5ybyA9PSAyKSAvKiBhdXRvLXJlYWRvbmx5IG5vdCBtZWFuaW5nZnVsICovCiAJCW1kZGV2LT5ybyA9IDA7CiAKQEAgLTM2OTQsNyArMzg1OSw3IEBACiAJbWRkZXYtPnNhZmVtb2RlX2RlbGF5ID0gKDIwMCAqIEhaKS8xMDAwICsxOyAvKiAyMDAgbXNlYyBkZWxheSAqLwogCW1kZGV2LT5pbl9zeW5jID0gMTsKIAotCXJkZXZfZm9yX2VhY2gocmRldiwgdG1wLCBtZGRldikKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJkZXYsICZtZGRldi0+ZGlza3MsIHNhbWVfc2V0KQogCQlpZiAocmRldi0+cmFpZF9kaXNrID49IDApIHsKIAkJCWNoYXIgbm1bMjBdOwogCQkJc3ByaW50ZihubSwgInJkJWQiLCByZGV2LT5yYWlkX2Rpc2spOwpAQCAtMzcyNSw5ICszODkwLDggQEAKIAkgKiBpdCB3aWxsIHJlbW92ZSB0aGUgZHJpdmVzIGFuZCBub3QgZG8gdGhlIHJpZ2h0IHRoaW5nCiAJICovCiAJaWYgKG1kZGV2LT5kZWdyYWRlZCAmJiAhbWRkZXYtPnN5bmNfdGhyZWFkKSB7Ci0JCXN0cnVjdCBsaXN0X2hlYWQgKnJ0bXA7CiAJCWludCBzcGFyZXMgPSAwOwotCQlyZGV2X2Zvcl9lYWNoKHJkZXYsIHJ0bXAsIG1kZGV2KQorCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJkZXYsICZtZGRldi0+ZGlza3MsIHNhbWVfc2V0KQogCQkJaWYgKHJkZXYtPnJhaWRfZGlzayA+PSAwICYmCiAJCQkgICAgIXRlc3RfYml0KEluX3N5bmMsICZyZGV2LT5mbGFncykgJiYKIAkJCSAgICAhdGVzdF9iaXQoRmF1bHR5LCAmcmRldi0+ZmxhZ3MpKQpAQCAtMzc1NCw3ICszOTE4LDggQEAKIAltZGRldi0+Y2hhbmdlZCA9IDE7CiAJbWRfbmV3X2V2ZW50KG1kZGV2KTsKIAlzeXNmc19ub3RpZnlfZGlyZW50KG1kZGV2LT5zeXNmc19zdGF0ZSk7Ci0Jc3lzZnNfbm90aWZ5KCZtZGRldi0+a29iaiwgTlVMTCwgInN5bmNfYWN0aW9uIik7CisJaWYgKG1kZGV2LT5zeXNmc19hY3Rpb24pCisJCXN5c2ZzX25vdGlmeV9kaXJlbnQobWRkZXYtPnN5c2ZzX2FjdGlvbik7CiAJc3lzZnNfbm90aWZ5KCZtZGRldi0+a29iaiwgTlVMTCwgImRlZ3JhZGVkIik7CiAJa29iamVjdF91ZXZlbnQoJmRpc2tfdG9fZGV2KG1kZGV2LT5nZW5kaXNrKS0+a29iaiwgS09CSl9DSEFOR0UpOwogCXJldHVybiAwOwpAQCAtMzg1NCw5ICs0MDE5LDEyIEBACiAJCQltZGRldi0+cXVldWUtPm1lcmdlX2J2ZWNfZm4gPSBOVUxMOwogCQkJbWRkZXYtPnF1ZXVlLT51bnBsdWdfZm4gPSBOVUxMOwogCQkJbWRkZXYtPnF1ZXVlLT5iYWNraW5nX2Rldl9pbmZvLmNvbmdlc3RlZF9mbiA9IE5VTEw7Ci0JCQlpZiAobWRkZXYtPnBlcnMtPnN5bmNfcmVxdWVzdCkKKwkJCWlmIChtZGRldi0+cGVycy0+c3luY19yZXF1ZXN0KSB7CiAJCQkJc3lzZnNfcmVtb3ZlX2dyb3VwKCZtZGRldi0+a29iaiwgJm1kX3JlZHVuZGFuY3lfZ3JvdXApOwotCisJCQkJaWYgKG1kZGV2LT5zeXNmc19hY3Rpb24pCisJCQkJCXN5c2ZzX3B1dChtZGRldi0+c3lzZnNfYWN0aW9uKTsKKwkJCQltZGRldi0+c3lzZnNfYWN0aW9uID0gTlVMTDsKKwkJCX0KIAkJCW1vZHVsZV9wdXQobWRkZXYtPnBlcnMtPm93bmVyKTsKIAkJCW1kZGV2LT5wZXJzID0gTlVMTDsKIAkJCS8qIHRlbGwgdXNlcnNwYWNlIHRvIGhhbmRsZSAnaW5hY3RpdmUnICovCkBAIC0zODgzLDcgKzQwNTEsNiBAQAogCSAqLwogCWlmIChtb2RlID09IDApIHsKIAkJbWRrX3JkZXZfdCAqcmRldjsKLQkJc3RydWN0IGxpc3RfaGVhZCAqdG1wOwogCiAJCXByaW50ayhLRVJOX0lORk8gIm1kOiAlcyBzdG9wcGVkLlxuIiwgbWRuYW1lKG1kZGV2KSk7CiAKQEAgLTM4OTUsNyArNDA2Miw3IEBACiAJCX0KIAkJbWRkZXYtPmJpdG1hcF9vZmZzZXQgPSAwOwogCi0JCXJkZXZfZm9yX2VhY2gocmRldiwgdG1wLCBtZGRldikKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShyZGV2LCAmbWRkZXYtPmRpc2tzLCBzYW1lX3NldCkKIAkJCWlmIChyZGV2LT5yYWlkX2Rpc2sgPj0gMCkgewogCQkJCWNoYXIgbm1bMjBdOwogCQkJCXNwcmludGYobm0sICJyZCVkIiwgcmRldi0+cmFpZF9kaXNrKTsKQEAgLTM5NDEsNiArNDEwOCw4IEBACiAJCW1kZGV2LT5iYXJyaWVyc193b3JrID0gMDsKIAkJbWRkZXYtPnNhZmVtb2RlID0gMDsKIAkJa29iamVjdF91ZXZlbnQoJmRpc2tfdG9fZGV2KG1kZGV2LT5nZW5kaXNrKS0+a29iaiwgS09CSl9DSEFOR0UpOworCQlpZiAobWRkZXYtPmhvbGRfYWN0aXZlID09IFVOVElMX1NUT1ApCisJCQltZGRldi0+aG9sZF9hY3RpdmUgPSAwOwogCiAJfSBlbHNlIGlmIChtZGRldi0+cGVycykKIAkJcHJpbnRrKEtFUk5fSU5GTyAibWQ6ICVzIHN3aXRjaGVkIHRvIHJlYWQtb25seSBtb2RlLlxuIiwKQEAgLTM5NTYsNyArNDEyNSw2IEBACiBzdGF0aWMgdm9pZCBhdXRvcnVuX2FycmF5KG1kZGV2X3QgKm1kZGV2KQogewogCW1ka19yZGV2X3QgKnJkZXY7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqdG1wOwogCWludCBlcnI7CiAKIAlpZiAobGlzdF9lbXB0eSgmbWRkZXYtPmRpc2tzKSkKQEAgLTM5NjQsNyArNDEzMiw3IEBACiAKIAlwcmludGsoS0VSTl9JTkZPICJtZDogcnVubmluZzogIik7CiAKLQlyZGV2X2Zvcl9lYWNoKHJkZXYsIHRtcCwgbWRkZXYpIHsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJkZXYsICZtZGRldi0+ZGlza3MsIHNhbWVfc2V0KSB7CiAJCWNoYXIgYltCREVWTkFNRV9TSVpFXTsKIAkJcHJpbnRrKCI8JXM+IiwgYmRldm5hbWUocmRldi0+YmRldixiKSk7CiAJfQpAQCAtMzk5MSw4ICs0MTU5LDcgQEAKICAqLwogc3RhdGljIHZvaWQgYXV0b3J1bl9kZXZpY2VzKGludCBwYXJ0KQogewotCXN0cnVjdCBsaXN0X2hlYWQgKnRtcDsKLQltZGtfcmRldl90ICpyZGV2MCwgKnJkZXY7CisJbWRrX3JkZXZfdCAqcmRldjAsICpyZGV2LCAqdG1wOwogCW1kZGV2X3QgKm1kZGV2OwogCWNoYXIgYltCREVWTkFNRV9TSVpFXTsKIApAQCAtNDAwNyw3ICs0MTc0LDcgQEAKIAkJcHJpbnRrKEtFUk5fSU5GTyAibWQ6IGNvbnNpZGVyaW5nICVzIC4uLlxuIiwKIAkJCWJkZXZuYW1lKHJkZXYwLT5iZGV2LGIpKTsKIAkJSU5JVF9MSVNUX0hFQUQoJmNhbmRpZGF0ZXMpOwotCQlyZGV2X2Zvcl9lYWNoX2xpc3QocmRldiwgdG1wLCBwZW5kaW5nX3JhaWRfZGlza3MpCisJCXJkZXZfZm9yX2VhY2hfbGlzdChyZGV2LCB0bXAsICZwZW5kaW5nX3JhaWRfZGlza3MpCiAJCQlpZiAoc3VwZXJfOTBfbG9hZChyZGV2LCByZGV2MCwgMCkgPj0gMCkgewogCQkJCXByaW50ayhLRVJOX0lORk8gIm1kOiAgYWRkaW5nICVzIC4uLlxuIiwKIAkJCQkJYmRldm5hbWUocmRldi0+YmRldixiKSk7CkBAIC00MDUzLDcgKzQyMjAsNyBAQAogCQl9IGVsc2UgewogCQkJcHJpbnRrKEtFUk5fSU5GTyAibWQ6IGNyZWF0ZWQgJXNcbiIsIG1kbmFtZShtZGRldikpOwogCQkJbWRkZXYtPnBlcnNpc3RlbnQgPSAxOwotCQkJcmRldl9mb3JfZWFjaF9saXN0KHJkZXYsIHRtcCwgY2FuZGlkYXRlcykgeworCQkJcmRldl9mb3JfZWFjaF9saXN0KHJkZXYsIHRtcCwgJmNhbmRpZGF0ZXMpIHsKIAkJCQlsaXN0X2RlbF9pbml0KCZyZGV2LT5zYW1lX3NldCk7CiAJCQkJaWYgKGJpbmRfcmRldl90b19hcnJheShyZGV2LCBtZGRldikpCiAJCQkJCWV4cG9ydF9yZGV2KHJkZXYpOwpAQCAtNDA2NCw3ICs0MjMxLDcgQEAKIAkJLyogb24gc3VjY2VzcywgY2FuZGlkYXRlcyB3aWxsIGJlIGVtcHR5LCBvbiBlcnJvcgogCQkgKiBpdCB3b24ndC4uLgogCQkgKi8KLQkJcmRldl9mb3JfZWFjaF9saXN0KHJkZXYsIHRtcCwgY2FuZGlkYXRlcykgeworCQlyZGV2X2Zvcl9lYWNoX2xpc3QocmRldiwgdG1wLCAmY2FuZGlkYXRlcykgewogCQkJbGlzdF9kZWxfaW5pdCgmcmRldi0+c2FtZV9zZXQpOwogCQkJZXhwb3J0X3JkZXYocmRldik7CiAJCX0KQEAgLTQwOTMsMTAgKzQyNjAsOSBAQAogCW1kdV9hcnJheV9pbmZvX3QgaW5mbzsKIAlpbnQgbnIsd29ya2luZyxhY3RpdmUsZmFpbGVkLHNwYXJlOwogCW1ka19yZGV2X3QgKnJkZXY7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqdG1wOwogCiAJbnI9d29ya2luZz1hY3RpdmU9ZmFpbGVkPXNwYXJlPTA7Ci0JcmRldl9mb3JfZWFjaChyZGV2LCB0bXAsIG1kZGV2KSB7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShyZGV2LCAmbWRkZXYtPmRpc2tzLCBzYW1lX3NldCkgewogCQlucisrOwogCQlpZiAodGVzdF9iaXQoRmF1bHR5LCAmcmRldi0+ZmxhZ3MpKQogCQkJZmFpbGVkKys7CkBAIC00NjE0LDkgKzQ3ODAsOCBAQAogCiBzdGF0aWMgaW50IHVwZGF0ZV9zaXplKG1kZGV2X3QgKm1kZGV2LCBzZWN0b3JfdCBudW1fc2VjdG9ycykKIHsKLQltZGtfcmRldl90ICogcmRldjsKKwltZGtfcmRldl90ICpyZGV2OwogCWludCBydjsKLQlzdHJ1Y3QgbGlzdF9oZWFkICp0bXA7CiAJaW50IGZpdCA9IChudW1fc2VjdG9ycyA9PSAwKTsKIAogCWlmIChtZGRldi0+cGVycy0+cmVzaXplID09IE5VTEwpCkBAIC00NjM4LDcgKzQ4MDMsNyBAQAogCQkgKiBncm93LCBhbmQgcmUtYWRkLgogCQkgKi8KIAkJcmV0dXJuIC1FQlVTWTsKLQlyZGV2X2Zvcl9lYWNoKHJkZXYsIHRtcCwgbWRkZXYpIHsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJkZXYsICZtZGRldi0+ZGlza3MsIHNhbWVfc2V0KSB7CiAJCXNlY3Rvcl90IGF2YWlsOwogCQlhdmFpbCA9IHJkZXYtPnNpemUgKiAyOwogCkBAIC01MDAwLDYgKzUxNjUsOSBAQAogCiBkb25lX3VubG9jazoKIGFib3J0X3VubG9jazoKKwlpZiAobWRkZXYtPmhvbGRfYWN0aXZlID09IFVOVElMX0lPQ1RMICYmCisJICAgIGVyciAhPSAtRUlOVkFMKQorCQltZGRldi0+aG9sZF9hY3RpdmUgPSAwOwogCW1kZGV2X3VubG9jayhtZGRldik7CiAKIAlyZXR1cm4gZXJyOwpAQCAtNTAxNiwxNCArNTE4NCwyNSBAQAogCSAqIFN1Y2NlZWQgaWYgd2UgY2FuIGxvY2sgdGhlIG1kZGV2LCB3aGljaCBjb25maXJtcyB0aGF0CiAJICogaXQgaXNuJ3QgYmVpbmcgc3RvcHBlZCByaWdodCBub3cuCiAJICovCi0JbWRkZXZfdCAqbWRkZXYgPSBiZGV2LT5iZF9kaXNrLT5wcml2YXRlX2RhdGE7CisJbWRkZXZfdCAqbWRkZXYgPSBtZGRldl9maW5kKGJkZXYtPmJkX2Rldik7CiAJaW50IGVycjsKIAorCWlmIChtZGRldi0+Z2VuZGlzayAhPSBiZGV2LT5iZF9kaXNrKSB7CisJCS8qIHdlIGFyZSByYWNpbmcgd2l0aCBtZGRldl9wdXQgd2hpY2ggaXMgZGlzY2FyZGluZyB0aGlzCisJCSAqIGJkX2Rpc2suCisJCSAqLworCQltZGRldl9wdXQobWRkZXYpOworCQkvKiBXYWl0IHVudGlsIGJkZXYtPmJkX2Rpc2sgaXMgZGVmaW5pdGVseSBnb25lICovCisJCWZsdXNoX3NjaGVkdWxlZF93b3JrKCk7CisJCS8qIFRoZW4gcmV0cnkgdGhlIG9wZW4gZnJvbSB0aGUgdG9wICovCisJCXJldHVybiAtRVJFU1RBUlRTWVM7CisJfQorCUJVR19PTihtZGRldiAhPSBiZGV2LT5iZF9kaXNrLT5wcml2YXRlX2RhdGEpOworCiAJaWYgKChlcnIgPSBtdXRleF9sb2NrX2ludGVycnVwdGlibGVfbmVzdGVkKCZtZGRldi0+cmVjb25maWdfbXV0ZXgsIDEpKSkKIAkJZ290byBvdXQ7CiAKIAllcnIgPSAwOwotCW1kZGV2X2dldChtZGRldik7CiAJYXRvbWljX2luYygmbWRkZXYtPm9wZW5lcnMpOwogCW1kZGV2X3VubG9jayhtZGRldik7CiAKQEAgLTUxODcsMTEgKzUzNjYsMTAgQEAKIHsKIAlpbnQgaSA9IDA7CiAJbWRrX3JkZXZfdCAqcmRldjsKLQlzdHJ1Y3QgbGlzdF9oZWFkICp0bXA7CiAKIAlzZXFfcHJpbnRmKHNlcSwgInVudXNlZCBkZXZpY2VzOiAiKTsKIAotCXJkZXZfZm9yX2VhY2hfbGlzdChyZGV2LCB0bXAsIHBlbmRpbmdfcmFpZF9kaXNrcykgeworCWxpc3RfZm9yX2VhY2hfZW50cnkocmRldiwgJnBlbmRpbmdfcmFpZF9kaXNrcywgc2FtZV9zZXQpIHsKIAkJY2hhciBiW0JERVZOQU1FX1NJWkVdOwogCQlpKys7CiAJCXNlcV9wcmludGYoc2VxLCAiJXMgIiwKQEAgLTUzNTAsNyArNTUyOCw2IEBACiB7CiAJbWRkZXZfdCAqbWRkZXYgPSB2OwogCXNlY3Rvcl90IHNpemU7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqdG1wMjsKIAltZGtfcmRldl90ICpyZGV2OwogCXN0cnVjdCBtZHN0YXRfaW5mbyAqbWkgPSBzZXEtPnByaXZhdGU7CiAJc3RydWN0IGJpdG1hcCAqYml0bWFwOwpAQCAtNTM4Nyw3ICs1NTY0LDcgQEAKIAkJfQogCiAJCXNpemUgPSAwOwotCQlyZGV2X2Zvcl9lYWNoKHJkZXYsIHRtcDIsIG1kZGV2KSB7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkocmRldiwgJm1kZGV2LT5kaXNrcywgc2FtZV9zZXQpIHsKIAkJCWNoYXIgYltCREVWTkFNRV9TSVpFXTsKIAkJCXNlcV9wcmludGYoc2VxLCAiICVzWyVkXSIsCiAJCQkJYmRldm5hbWUocmRldi0+YmRldixiKSwgcmRldi0+ZGVzY19ucik7CkBAIC01Njk0LDcgKzU4NzEsNiBAQAogCXN0cnVjdCBsaXN0X2hlYWQgKnRtcDsKIAlzZWN0b3JfdCBsYXN0X2NoZWNrOwogCWludCBza2lwcGVkID0gMDsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpydG1wOwogCW1ka19yZGV2X3QgKnJkZXY7CiAJY2hhciAqZGVzYzsKIApAQCAtNTc5OSw3ICs1OTc1LDcgQEAKIAkJLyogcmVjb3ZlcnkgZm9sbG93cyB0aGUgcGh5c2ljYWwgc2l6ZSBvZiBkZXZpY2VzICovCiAJCW1heF9zZWN0b3JzID0gbWRkZXYtPnNpemUgPDwgMTsKIAkJaiA9IE1heFNlY3RvcjsKLQkJcmRldl9mb3JfZWFjaChyZGV2LCBydG1wLCBtZGRldikKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShyZGV2LCAmbWRkZXYtPmRpc2tzLCBzYW1lX3NldCkKIAkJCWlmIChyZGV2LT5yYWlkX2Rpc2sgPj0gMCAmJgogCQkJICAgICF0ZXN0X2JpdChGYXVsdHksICZyZGV2LT5mbGFncykgJiYKIAkJCSAgICAhdGVzdF9iaXQoSW5fc3luYywgJnJkZXYtPmZsYWdzKSAmJgpAQCAtNTk0OSw3ICs2MTI1LDcgQEAKIAkJfSBlbHNlIHsKIAkJCWlmICghdGVzdF9iaXQoTURfUkVDT1ZFUllfSU5UUiwgJm1kZGV2LT5yZWNvdmVyeSkpCiAJCQkJbWRkZXYtPmN1cnJfcmVzeW5jID0gTWF4U2VjdG9yOwotCQkJcmRldl9mb3JfZWFjaChyZGV2LCBydG1wLCBtZGRldikKKwkJCWxpc3RfZm9yX2VhY2hfZW50cnkocmRldiwgJm1kZGV2LT5kaXNrcywgc2FtZV9zZXQpCiAJCQkJaWYgKHJkZXYtPnJhaWRfZGlzayA+PSAwICYmCiAJCQkJICAgICF0ZXN0X2JpdChGYXVsdHksICZyZGV2LT5mbGFncykgJiYKIAkJCQkgICAgIXRlc3RfYml0KEluX3N5bmMsICZyZGV2LT5mbGFncykgJiYKQEAgLTU5ODUsMTAgKzYxNjEsOSBAQAogc3RhdGljIGludCByZW1vdmVfYW5kX2FkZF9zcGFyZXMobWRkZXZfdCAqbWRkZXYpCiB7CiAJbWRrX3JkZXZfdCAqcmRldjsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpydG1wOwogCWludCBzcGFyZXMgPSAwOwogCi0JcmRldl9mb3JfZWFjaChyZGV2LCBydG1wLCBtZGRldikKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJkZXYsICZtZGRldi0+ZGlza3MsIHNhbWVfc2V0KQogCQlpZiAocmRldi0+cmFpZF9kaXNrID49IDAgJiYKIAkJICAgICF0ZXN0X2JpdChCbG9ja2VkLCAmcmRldi0+ZmxhZ3MpICYmCiAJCSAgICAodGVzdF9iaXQoRmF1bHR5LCAmcmRldi0+ZmxhZ3MpIHx8CkBAIC02MDAzLDggKzYxNzgsOCBAQAogCQkJfQogCQl9CiAKLQlpZiAobWRkZXYtPmRlZ3JhZGVkICYmICEgbWRkZXYtPnJvKSB7Ci0JCXJkZXZfZm9yX2VhY2gocmRldiwgcnRtcCwgbWRkZXYpIHsKKwlpZiAobWRkZXYtPmRlZ3JhZGVkICYmICEgbWRkZXYtPnJvICYmICFtZGRldi0+cmVjb3ZlcnlfZGlzYWJsZWQpIHsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShyZGV2LCAmbWRkZXYtPmRpc2tzLCBzYW1lX3NldCkgewogCQkJaWYgKHJkZXYtPnJhaWRfZGlzayA+PSAwICYmCiAJCQkgICAgIXRlc3RfYml0KEluX3N5bmMsICZyZGV2LT5mbGFncykgJiYKIAkJCSAgICAhdGVzdF9iaXQoQmxvY2tlZCwgJnJkZXYtPmZsYWdzKSkKQEAgLTYwNTYsNyArNjIzMSw2IEBACiB2b2lkIG1kX2NoZWNrX3JlY292ZXJ5KG1kZGV2X3QgKm1kZGV2KQogewogCW1ka19yZGV2X3QgKnJkZXY7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcnRtcDsKIAogCiAJaWYgKG1kZGV2LT5iaXRtYXApCkBAIC02MTIwLDcgKzYyOTQsNyBAQAogCQlpZiAobWRkZXYtPmZsYWdzKQogCQkJbWRfdXBkYXRlX3NiKG1kZGV2LCAwKTsKIAotCQlyZGV2X2Zvcl9lYWNoKHJkZXYsIHJ0bXAsIG1kZGV2KQorCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJkZXYsICZtZGRldi0+ZGlza3MsIHNhbWVfc2V0KQogCQkJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChTdGF0ZUNoYW5nZWQsICZyZGV2LT5mbGFncykpCiAJCQkJc3lzZnNfbm90aWZ5X2RpcmVudChyZGV2LT5zeXNmc19zdGF0ZSk7CiAKQEAgLTYxNDksMTMgKzYzMjMsMTMgQEAKIAkJCSAqIGluZm9ybWF0aW9uIG11c3QgYmUgc2NyYXBwZWQKIAkJCSAqLwogCQkJaWYgKCFtZGRldi0+ZGVncmFkZWQpCi0JCQkJcmRldl9mb3JfZWFjaChyZGV2LCBydG1wLCBtZGRldikKKwkJCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJkZXYsICZtZGRldi0+ZGlza3MsIHNhbWVfc2V0KQogCQkJCQlyZGV2LT5zYXZlZF9yYWlkX2Rpc2sgPSAtMTsKIAogCQkJbWRkZXYtPnJlY292ZXJ5ID0gMDsKIAkJCS8qIGZsYWcgcmVjb3ZlcnkgbmVlZGVkIGp1c3QgdG8gZG91YmxlIGNoZWNrICovCiAJCQlzZXRfYml0KE1EX1JFQ09WRVJZX05FRURFRCwgJm1kZGV2LT5yZWNvdmVyeSk7Ci0JCQlzeXNmc19ub3RpZnkoJm1kZGV2LT5rb2JqLCBOVUxMLCAic3luY19hY3Rpb24iKTsKKwkJCXN5c2ZzX25vdGlmeV9kaXJlbnQobWRkZXYtPnN5c2ZzX2FjdGlvbik7CiAJCQltZF9uZXdfZXZlbnQobWRkZXYpOwogCQkJZ290byB1bmxvY2s7CiAJCX0KQEAgLTYyMTYsNyArNjM5MCw3IEBACiAJCQkJbWRkZXYtPnJlY292ZXJ5ID0gMDsKIAkJCX0gZWxzZQogCQkJCW1kX3dha2V1cF90aHJlYWQobWRkZXYtPnN5bmNfdGhyZWFkKTsKLQkJCXN5c2ZzX25vdGlmeSgmbWRkZXYtPmtvYmosIE5VTEwsICJzeW5jX2FjdGlvbiIpOworCQkJc3lzZnNfbm90aWZ5X2RpcmVudChtZGRldi0+c3lzZnNfYWN0aW9uKTsKIAkJCW1kX25ld19ldmVudChtZGRldik7CiAJCX0KIAl1bmxvY2s6CkBAIC02MjI0LDcgKzYzOTgsOCBAQAogCQkJY2xlYXJfYml0KE1EX1JFQ09WRVJZX1JVTk5JTkcsICZtZGRldi0+cmVjb3ZlcnkpOwogCQkJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChNRF9SRUNPVkVSWV9SRUNPVkVSLAogCQkJCQkgICAgICAgJm1kZGV2LT5yZWNvdmVyeSkpCi0JCQkJc3lzZnNfbm90aWZ5KCZtZGRldi0+a29iaiwgTlVMTCwgInN5bmNfYWN0aW9uIik7CisJCQkJaWYgKG1kZGV2LT5zeXNmc19hY3Rpb24pCisJCQkJCXN5c2ZzX25vdGlmeV9kaXJlbnQobWRkZXYtPnN5c2ZzX2FjdGlvbik7CiAJCX0KIAkJbWRkZXZfdW5sb2NrKG1kZGV2KTsKIAl9CkBAIC02Mzg2LDE0ICs2NTYxLDggQEAKIAl1bnJlZ2lzdGVyX3N5c2N0bF90YWJsZShyYWlkX3RhYmxlX2hlYWRlcik7CiAJcmVtb3ZlX3Byb2NfZW50cnkoIm1kc3RhdCIsIE5VTEwpOwogCWZvcl9lYWNoX21kZGV2KG1kZGV2LCB0bXApIHsKLQkJc3RydWN0IGdlbmRpc2sgKmRpc2sgPSBtZGRldi0+Z2VuZGlzazsKLQkJaWYgKCFkaXNrKQotCQkJY29udGludWU7CiAJCWV4cG9ydF9hcnJheShtZGRldik7Ci0JCWRlbF9nZW5kaXNrKGRpc2spOwotCQlwdXRfZGlzayhkaXNrKTsKLQkJbWRkZXYtPmdlbmRpc2sgPSBOVUxMOwotCQltZGRldl9wdXQobWRkZXYpOworCQltZGRldi0+aG9sZF9hY3RpdmUgPSAwOwogCX0KIH0KIApAQCAtNjQxOCw2ICs2NTg3LDcgQEAKIG1vZHVsZV9wYXJhbV9jYWxsKHN0YXJ0X3JvLCBzZXRfcm8sIGdldF9ybywgTlVMTCwgU19JUlVTUnxTX0lXVVNSKTsKIG1vZHVsZV9wYXJhbShzdGFydF9kaXJ0eV9kZWdyYWRlZCwgaW50LCBTX0lSVUdPfFNfSVdVU1IpOwogCittb2R1bGVfcGFyYW1fY2FsbChuZXdfYXJyYXksIGFkZF9uYW1lZF9hcnJheSwgTlVMTCwgTlVMTCwgU19JV1VTUik7CiAKIEVYUE9SVF9TWU1CT0wocmVnaXN0ZXJfbWRfcGVyc29uYWxpdHkpOwogRVhQT1JUX1NZTUJPTCh1bnJlZ2lzdGVyX21kX3BlcnNvbmFsaXR5KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvbXVsdGlwYXRoLmMgYi9kcml2ZXJzL21kL211bHRpcGF0aC5jCmluZGV4IGQ0YWM0N2QuLmY2ZDA4ZjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvbXVsdGlwYXRoLmMKKysrIGIvZHJpdmVycy9tZC9tdWx0aXBhdGguYwpAQCAtNDA4LDcgKzQwOCw2IEBACiAJaW50IGRpc2tfaWR4OwogCXN0cnVjdCBtdWx0aXBhdGhfaW5mbyAqZGlzazsKIAltZGtfcmRldl90ICpyZGV2OwotCXN0cnVjdCBsaXN0X2hlYWQgKnRtcDsKIAogCWlmIChtZGRldi0+bGV2ZWwgIT0gTEVWRUxfTVVMVElQQVRIKSB7CiAJCXByaW50aygibXVsdGlwYXRoOiAlczogcmFpZCBsZXZlbCBub3Qgc2V0IHRvIG11bHRpcGF0aCBJTyAoJWQpXG4iLApAQCAtNDQxLDcgKzQ0MCw3IEBACiAJfQogCiAJY29uZi0+d29ya2luZ19kaXNrcyA9IDA7Ci0JcmRldl9mb3JfZWFjaChyZGV2LCB0bXAsIG1kZGV2KSB7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShyZGV2LCAmbWRkZXYtPmRpc2tzLCBzYW1lX3NldCkgewogCQlkaXNrX2lkeCA9IHJkZXYtPnJhaWRfZGlzazsKIAkJaWYgKGRpc2tfaWR4IDwgMCB8fAogCQkgICAgZGlza19pZHggPj0gbWRkZXYtPnJhaWRfZGlza3MpCmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL3JhaWQwLmMgYi9kcml2ZXJzL21kL3JhaWQwLmMKaW5kZXggOGFjNjQ4OC4uYzYwNWJhOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9yYWlkMC5jCisrKyBiL2RyaXZlcnMvbWQvcmFpZDAuYwpAQCAtNTMsMTEgKzUzLDEwIEBACiBzdGF0aWMgaW50IGNyZWF0ZV9zdHJpcF96b25lcyAobWRkZXZfdCAqbWRkZXYpCiB7CiAJaW50IGksIGMsIGo7Ci0Jc2VjdG9yX3QgY3VycmVudF9vZmZzZXQsIGN1cnJfem9uZV9vZmZzZXQ7CisJc2VjdG9yX3QgY3VycmVudF9zdGFydCwgY3Vycl96b25lX3N0YXJ0OwogCXNlY3Rvcl90IG1pbl9zcGFjaW5nOwogCXJhaWQwX2NvbmZfdCAqY29uZiA9IG1kZGV2X3RvX2NvbmYobWRkZXYpOwogCW1ka19yZGV2X3QgKnNtYWxsZXN0LCAqcmRldjEsICpyZGV2MiwgKnJkZXY7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqdG1wMSwgKnRtcDI7CiAJc3RydWN0IHN0cmlwX3pvbmUgKnpvbmU7CiAJaW50IGNudDsKIAljaGFyIGJbQkRFVk5BTUVfU0laRV07CkBAIC02NywxOSArNjYsMTkgQEAKIAkgKi8KIAljb25mLT5ucl9zdHJpcF96b25lcyA9IDA7CiAgCi0JcmRldl9mb3JfZWFjaChyZGV2MSwgdG1wMSwgbWRkZXYpIHsKLQkJcHJpbnRrKCJyYWlkMDogbG9va2luZyBhdCAlc1xuIiwKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJkZXYxLCAmbWRkZXYtPmRpc2tzLCBzYW1lX3NldCkgeworCQlwcmludGsoS0VSTl9JTkZPICJyYWlkMDogbG9va2luZyBhdCAlc1xuIiwKIAkJCWJkZXZuYW1lKHJkZXYxLT5iZGV2LGIpKTsKIAkJYyA9IDA7Ci0JCXJkZXZfZm9yX2VhY2gocmRldjIsIHRtcDIsIG1kZGV2KSB7Ci0JCQlwcmludGsoInJhaWQwOiAgIGNvbXBhcmluZyAlcyglbGx1KSIsCisJCWxpc3RfZm9yX2VhY2hfZW50cnkocmRldjIsICZtZGRldi0+ZGlza3MsIHNhbWVfc2V0KSB7CisJCQlwcmludGsoS0VSTl9JTkZPICJyYWlkMDogICBjb21wYXJpbmcgJXMoJWxsdSkiLAogCQkJICAgICAgIGJkZXZuYW1lKHJkZXYxLT5iZGV2LGIpLAogCQkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpcmRldjEtPnNpemUpOwotCQkJcHJpbnRrKCIgd2l0aCAlcyglbGx1KVxuIiwKKwkJCXByaW50ayhLRVJOX0lORk8gIiB3aXRoICVzKCVsbHUpXG4iLAogCQkJICAgICAgIGJkZXZuYW1lKHJkZXYyLT5iZGV2LGIpLAogCQkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpcmRldjItPnNpemUpOwogCQkJaWYgKHJkZXYyID09IHJkZXYxKSB7Ci0JCQkJcHJpbnRrKCJyYWlkMDogICBFTkRcbiIpOworCQkJCXByaW50ayhLRVJOX0lORk8gInJhaWQwOiAgIEVORFxuIik7CiAJCQkJYnJlYWs7CiAJCQl9CiAJCQlpZiAocmRldjItPnNpemUgPT0gcmRldjEtPnNpemUpCkBAIC04OCwxOSArODcsMjAgQEAKIAkJCQkgKiBOb3QgdW5pcXVlLCBkb24ndCBjb3VudCBpdCBhcyBhIG5ldwogCQkJCSAqIGdyb3VwCiAJCQkJICovCi0JCQkJcHJpbnRrKCJyYWlkMDogICBFUVVBTFxuIik7CisJCQkJcHJpbnRrKEtFUk5fSU5GTyAicmFpZDA6ICAgRVFVQUxcbiIpOwogCQkJCWMgPSAxOwogCQkJCWJyZWFrOwogCQkJfQotCQkJcHJpbnRrKCJyYWlkMDogICBOT1QgRVFVQUxcbiIpOworCQkJcHJpbnRrKEtFUk5fSU5GTyAicmFpZDA6ICAgTk9UIEVRVUFMXG4iKTsKIAkJfQogCQlpZiAoIWMpIHsKLQkJCXByaW50aygicmFpZDA6ICAgPT0+IFVOSVFVRVxuIik7CisJCQlwcmludGsoS0VSTl9JTkZPICJyYWlkMDogICA9PT4gVU5JUVVFXG4iKTsKIAkJCWNvbmYtPm5yX3N0cmlwX3pvbmVzKys7Ci0JCQlwcmludGsoInJhaWQwOiAlZCB6b25lc1xuIiwgY29uZi0+bnJfc3RyaXBfem9uZXMpOworCQkJcHJpbnRrKEtFUk5fSU5GTyAicmFpZDA6ICVkIHpvbmVzXG4iLAorCQkJCWNvbmYtPm5yX3N0cmlwX3pvbmVzKTsKIAkJfQogCX0KLQlwcmludGsoInJhaWQwOiBGSU5BTCAlZCB6b25lc1xuIiwgY29uZi0+bnJfc3RyaXBfem9uZXMpOworCXByaW50ayhLRVJOX0lORk8gInJhaWQwOiBGSU5BTCAlZCB6b25lc1xuIiwgY29uZi0+bnJfc3RyaXBfem9uZXMpOwogCiAJY29uZi0+c3RyaXBfem9uZSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBzdHJpcF96b25lKSoKIAkJCQljb25mLT5ucl9zdHJpcF96b25lcywgR0ZQX0tFUk5FTCk7CkBAIC0xMTksMTYgKzExOSwxNyBAQAogCWNudCA9IDA7CiAJc21hbGxlc3QgPSBOVUxMOwogCXpvbmUtPmRldiA9IGNvbmYtPmRldmxpc3Q7Ci0JcmRldl9mb3JfZWFjaChyZGV2MSwgdG1wMSwgbWRkZXYpIHsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJkZXYxLCAmbWRkZXYtPmRpc2tzLCBzYW1lX3NldCkgewogCQlpbnQgaiA9IHJkZXYxLT5yYWlkX2Rpc2s7CiAKIAkJaWYgKGogPCAwIHx8IGogPj0gbWRkZXYtPnJhaWRfZGlza3MpIHsKLQkJCXByaW50aygicmFpZDA6IGJhZCBkaXNrIG51bWJlciAlZCAtIGFib3J0aW5nIVxuIiwgaik7CisJCQlwcmludGsoS0VSTl9FUlIgInJhaWQwOiBiYWQgZGlzayBudW1iZXIgJWQgLSAiCisJCQkJImFib3J0aW5nIVxuIiwgaik7CiAJCQlnb3RvIGFib3J0OwogCQl9CiAJCWlmICh6b25lLT5kZXZbal0pIHsKLQkJCXByaW50aygicmFpZDA6IG11bHRpcGxlIGRldmljZXMgZm9yICVkIC0gYWJvcnRpbmchXG4iLAotCQkJCWopOworCQkJcHJpbnRrKEtFUk5fRVJSICJyYWlkMDogbXVsdGlwbGUgZGV2aWNlcyBmb3IgJWQgLSAiCisJCQkJImFib3J0aW5nIVxuIiwgaik7CiAJCQlnb3RvIGFib3J0OwogCQl9CiAJCXpvbmUtPmRldltqXSA9IHJkZXYxOwpAQCAtMTQ5LDE2ICsxNTAsMTYgQEAKIAkJY250Kys7CiAJfQogCWlmIChjbnQgIT0gbWRkZXYtPnJhaWRfZGlza3MpIHsKLQkJcHJpbnRrKCJyYWlkMDogdG9vIGZldyBkaXNrcyAoJWQgb2YgJWQpIC0gYWJvcnRpbmchXG4iLAotCQkJY250LCBtZGRldi0+cmFpZF9kaXNrcyk7CisJCXByaW50ayhLRVJOX0VSUiAicmFpZDA6IHRvbyBmZXcgZGlza3MgKCVkIG9mICVkKSAtICIKKwkJCSJhYm9ydGluZyFcbiIsIGNudCwgbWRkZXYtPnJhaWRfZGlza3MpOwogCQlnb3RvIGFib3J0OwogCX0KIAl6b25lLT5uYl9kZXYgPSBjbnQ7Ci0Jem9uZS0+c2l6ZSA9IHNtYWxsZXN0LT5zaXplICogY250OwotCXpvbmUtPnpvbmVfb2Zmc2V0ID0gMDsKKwl6b25lLT5zZWN0b3JzID0gc21hbGxlc3QtPnNpemUgKiBjbnQgKiAyOworCXpvbmUtPnpvbmVfc3RhcnQgPSAwOwogCi0JY3VycmVudF9vZmZzZXQgPSBzbWFsbGVzdC0+c2l6ZTsKLQljdXJyX3pvbmVfb2Zmc2V0ID0gem9uZS0+c2l6ZTsKKwljdXJyZW50X3N0YXJ0ID0gc21hbGxlc3QtPnNpemUgKiAyOworCWN1cnJfem9uZV9zdGFydCA9IHpvbmUtPnNlY3RvcnM7CiAKIAkvKiBub3cgZG8gdGhlIG90aGVyIHpvbmVzICovCiAJZm9yIChpID0gMTsgaSA8IGNvbmYtPm5yX3N0cmlwX3pvbmVzOyBpKyspCkBAIC0xNjYsNDAgKzE2Nyw0MSBAQAogCQl6b25lID0gY29uZi0+c3RyaXBfem9uZSArIGk7CiAJCXpvbmUtPmRldiA9IGNvbmYtPnN0cmlwX3pvbmVbaS0xXS5kZXYgKyBtZGRldi0+cmFpZF9kaXNrczsKIAotCQlwcmludGsoInJhaWQwOiB6b25lICVkXG4iLCBpKTsKLQkJem9uZS0+ZGV2X29mZnNldCA9IGN1cnJlbnRfb2Zmc2V0OworCQlwcmludGsoS0VSTl9JTkZPICJyYWlkMDogem9uZSAlZFxuIiwgaSk7CisJCXpvbmUtPmRldl9zdGFydCA9IGN1cnJlbnRfc3RhcnQ7CiAJCXNtYWxsZXN0ID0gTlVMTDsKIAkJYyA9IDA7CiAKIAkJZm9yIChqPTA7IGo8Y250OyBqKyspIHsKIAkJCWNoYXIgYltCREVWTkFNRV9TSVpFXTsKIAkJCXJkZXYgPSBjb25mLT5zdHJpcF96b25lWzBdLmRldltqXTsKLQkJCXByaW50aygicmFpZDA6IGNoZWNraW5nICVzIC4uLiIsIGJkZXZuYW1lKHJkZXYtPmJkZXYsYikpOwotCQkJaWYgKHJkZXYtPnNpemUgPiBjdXJyZW50X29mZnNldCkKLQkJCXsKLQkJCQlwcmludGsoIiBjb250YWluZWQgYXMgZGV2aWNlICVkXG4iLCBjKTsKKwkJCXByaW50ayhLRVJOX0lORk8gInJhaWQwOiBjaGVja2luZyAlcyAuLi4iLAorCQkJCWJkZXZuYW1lKHJkZXYtPmJkZXYsIGIpKTsKKwkJCWlmIChyZGV2LT5zaXplID4gY3VycmVudF9zdGFydCAvIDIpIHsKKwkJCQlwcmludGsoS0VSTl9JTkZPICIgY29udGFpbmVkIGFzIGRldmljZSAlZFxuIiwKKwkJCQkJYyk7CiAJCQkJem9uZS0+ZGV2W2NdID0gcmRldjsKIAkJCQljKys7CiAJCQkJaWYgKCFzbWFsbGVzdCB8fCAocmRldi0+c2l6ZSA8c21hbGxlc3QtPnNpemUpKSB7CiAJCQkJCXNtYWxsZXN0ID0gcmRldjsKLQkJCQkJcHJpbnRrKCIgICglbGx1KSBpcyBzbWFsbGVzdCEuXG4iLCAKKwkJCQkJcHJpbnRrKEtFUk5fSU5GTyAiICAoJWxsdSkgaXMgc21hbGxlc3QhLlxuIiwKIAkJCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpcmRldi0+c2l6ZSk7CiAJCQkJfQogCQkJfSBlbHNlCi0JCQkJcHJpbnRrKCIgbm9wZS5cbiIpOworCQkJCXByaW50ayhLRVJOX0lORk8gIiBub3BlLlxuIik7CiAJCX0KIAogCQl6b25lLT5uYl9kZXYgPSBjOwotCQl6b25lLT5zaXplID0gKHNtYWxsZXN0LT5zaXplIC0gY3VycmVudF9vZmZzZXQpICogYzsKLQkJcHJpbnRrKCJyYWlkMDogem9uZS0+bmJfZGV2OiAlZCwgc2l6ZTogJWxsdVxuIiwKLQkJCXpvbmUtPm5iX2RldiwgKHVuc2lnbmVkIGxvbmcgbG9uZyl6b25lLT5zaXplKTsKKwkJem9uZS0+c2VjdG9ycyA9IChzbWFsbGVzdC0+c2l6ZSAqIDIgLSBjdXJyZW50X3N0YXJ0KSAqIGM7CisJCXByaW50ayhLRVJOX0lORk8gInJhaWQwOiB6b25lLT5uYl9kZXY6ICVkLCBzZWN0b3JzOiAlbGx1XG4iLAorCQkJem9uZS0+bmJfZGV2LCAodW5zaWduZWQgbG9uZyBsb25nKXpvbmUtPnNlY3RvcnMpOwogCi0JCXpvbmUtPnpvbmVfb2Zmc2V0ID0gY3Vycl96b25lX29mZnNldDsKLQkJY3Vycl96b25lX29mZnNldCArPSB6b25lLT5zaXplOworCQl6b25lLT56b25lX3N0YXJ0ID0gY3Vycl96b25lX3N0YXJ0OworCQljdXJyX3pvbmVfc3RhcnQgKz0gem9uZS0+c2VjdG9yczsKIAotCQljdXJyZW50X29mZnNldCA9IHNtYWxsZXN0LT5zaXplOwotCQlwcmludGsoInJhaWQwOiBjdXJyZW50IHpvbmUgb2Zmc2V0OiAlbGx1XG4iLAotCQkJKHVuc2lnbmVkIGxvbmcgbG9uZyljdXJyZW50X29mZnNldCk7CisJCWN1cnJlbnRfc3RhcnQgPSBzbWFsbGVzdC0+c2l6ZSAqIDI7CisJCXByaW50ayhLRVJOX0lORk8gInJhaWQwOiBjdXJyZW50IHpvbmUgc3RhcnQ6ICVsbHVcbiIsCisJCQkodW5zaWduZWQgbG9uZyBsb25nKWN1cnJlbnRfc3RhcnQpOwogCX0KIAogCS8qIE5vdyBmaW5kIGFwcHJvcHJpYXRlIGhhc2ggc3BhY2luZy4KQEAgLTIxMCwxNiArMjEyLDE2IEBACiAJICogc3RyaXAgdGhvdWdoIGFzIGl0J3Mgc2l6ZSBoYXMgbm8gYmVhcmluZyBvbiB0aGUgZWZmaWNhY3kgb2YgdGhlIGhhc2gKIAkgKiB0YWJsZS4KIAkgKi8KLQljb25mLT5oYXNoX3NwYWNpbmcgPSBjdXJyX3pvbmVfb2Zmc2V0OwotCW1pbl9zcGFjaW5nID0gY3Vycl96b25lX29mZnNldDsKKwljb25mLT5zcGFjaW5nID0gY3Vycl96b25lX3N0YXJ0OworCW1pbl9zcGFjaW5nID0gY3Vycl96b25lX3N0YXJ0OwogCXNlY3Rvcl9kaXYobWluX3NwYWNpbmcsIFBBR0VfU0laRS9zaXplb2Yoc3RydWN0IHN0cmlwX3pvbmUqKSk7CiAJZm9yIChpPTA7IGkgPCBjb25mLT5ucl9zdHJpcF96b25lcy0xOyBpKyspIHsKLQkJc2VjdG9yX3Qgc3ogPSAwOwotCQlmb3IgKGo9aTsgajxjb25mLT5ucl9zdHJpcF96b25lcy0xICYmCi0JCQkgICAgIHN6IDwgbWluX3NwYWNpbmcgOyBqKyspCi0JCQlzeiArPSBjb25mLT5zdHJpcF96b25lW2pdLnNpemU7Ci0JCWlmIChzeiA+PSBtaW5fc3BhY2luZyAmJiBzeiA8IGNvbmYtPmhhc2hfc3BhY2luZykKLQkJCWNvbmYtPmhhc2hfc3BhY2luZyA9IHN6OworCQlzZWN0b3JfdCBzID0gMDsKKwkJZm9yIChqID0gaTsgaiA8IGNvbmYtPm5yX3N0cmlwX3pvbmVzIC0gMSAmJgorCQkJCXMgPCBtaW5fc3BhY2luZzsgaisrKQorCQkJcyArPSBjb25mLT5zdHJpcF96b25lW2pdLnNlY3RvcnM7CisJCWlmIChzID49IG1pbl9zcGFjaW5nICYmIHMgPCBjb25mLT5zcGFjaW5nKQorCQkJY29uZi0+c3BhY2luZyA9IHM7CiAJfQogCiAJbWRkZXYtPnF1ZXVlLT51bnBsdWdfZm4gPSByYWlkMF91bnBsdWc7CkBAIC0yMjcsNyArMjI5LDcgQEAKIAltZGRldi0+cXVldWUtPmJhY2tpbmdfZGV2X2luZm8uY29uZ2VzdGVkX2ZuID0gcmFpZDBfY29uZ2VzdGVkOwogCW1kZGV2LT5xdWV1ZS0+YmFja2luZ19kZXZfaW5mby5jb25nZXN0ZWRfZGF0YSA9IG1kZGV2OwogCi0JcHJpbnRrKCJyYWlkMDogZG9uZS5cbiIpOworCXByaW50ayhLRVJOX0lORk8gInJhaWQwOiBkb25lLlxuIik7CiAJcmV0dXJuIDA7CiAgYWJvcnQ6CiAJcmV0dXJuIDE7CkBAIC0yNjIsMTAgKzI2NCw5IEBACiBzdGF0aWMgaW50IHJhaWQwX3J1biAobWRkZXZfdCAqbWRkZXYpCiB7CiAJdW5zaWduZWQgIGN1cj0wLCBpPTAsIG5iX3pvbmU7Ci0JczY0IHNpemU7CisJczY0IHNlY3RvcnM7CiAJcmFpZDBfY29uZl90ICpjb25mOwogCW1ka19yZGV2X3QgKnJkZXY7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqdG1wOwogCiAJaWYgKG1kZGV2LT5jaHVua19zaXplID09IDApIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJtZC9yYWlkMDogbm9uLXplcm8gY2h1bmsgc2l6ZSByZXF1aXJlZC5cbiIpOwpAQCAtMjkxLDU0ICsyOTIsNTQgQEAKIAogCS8qIGNhbGN1bGF0ZSBhcnJheSBkZXZpY2Ugc2l6ZSAqLwogCW1kZGV2LT5hcnJheV9zZWN0b3JzID0gMDsKLQlyZGV2X2Zvcl9lYWNoKHJkZXYsIHRtcCwgbWRkZXYpCisJbGlzdF9mb3JfZWFjaF9lbnRyeShyZGV2LCAmbWRkZXYtPmRpc2tzLCBzYW1lX3NldCkKIAkJbWRkZXYtPmFycmF5X3NlY3RvcnMgKz0gcmRldi0+c2l6ZSAqIDI7CiAKLQlwcmludGsoInJhaWQwIDogbWRfc2l6ZSBpcyAlbGx1IGJsb2Nrcy5cbiIsIAotCQkodW5zaWduZWQgbG9uZyBsb25nKW1kZGV2LT5hcnJheV9zZWN0b3JzIC8gMik7Ci0JcHJpbnRrKCJyYWlkMCA6IGNvbmYtPmhhc2hfc3BhY2luZyBpcyAlbGx1IGJsb2Nrcy5cbiIsCi0JCSh1bnNpZ25lZCBsb25nIGxvbmcpY29uZi0+aGFzaF9zcGFjaW5nKTsKKwlwcmludGsoS0VSTl9JTkZPICJyYWlkMCA6IG1kX3NpemUgaXMgJWxsdSBzZWN0b3JzLlxuIiwKKwkJKHVuc2lnbmVkIGxvbmcgbG9uZyltZGRldi0+YXJyYXlfc2VjdG9ycyk7CisJcHJpbnRrKEtFUk5fSU5GTyAicmFpZDAgOiBjb25mLT5zcGFjaW5nIGlzICVsbHUgc2VjdG9ycy5cbiIsCisJCSh1bnNpZ25lZCBsb25nIGxvbmcpY29uZi0+c3BhY2luZyk7CiAJewotCQlzZWN0b3JfdCBzID0gbWRkZXYtPmFycmF5X3NlY3RvcnMgLyAyOwotCQlzZWN0b3JfdCBzcGFjZSA9IGNvbmYtPmhhc2hfc3BhY2luZzsKKwkJc2VjdG9yX3QgcyA9IG1kZGV2LT5hcnJheV9zZWN0b3JzOworCQlzZWN0b3JfdCBzcGFjZSA9IGNvbmYtPnNwYWNpbmc7CiAJCWludCByb3VuZDsKLQkJY29uZi0+cHJlc2hpZnQgPSAwOworCQljb25mLT5zZWN0b3Jfc2hpZnQgPSAwOwogCQlpZiAoc2l6ZW9mKHNlY3Rvcl90KSA+IHNpemVvZih1MzIpKSB7CiAJCQkvKnNoaWZ0IGRvd24gc3BhY2UgYW5kIHMgc28gdGhhdCBzZWN0b3JfZGl2IHdpbGwgd29yayAqLwogCQkJd2hpbGUgKHNwYWNlID4gKHNlY3Rvcl90KSAofih1MzIpMCkpIHsKIAkJCQlzID4+PSAxOwogCQkJCXNwYWNlID4+PSAxOwogCQkJCXMgKz0gMTsgLyogZm9yY2Ugcm91bmQtdXAgKi8KLQkJCQljb25mLT5wcmVzaGlmdCsrOworCQkJCWNvbmYtPnNlY3Rvcl9zaGlmdCsrOwogCQkJfQogCQl9CiAJCXJvdW5kID0gc2VjdG9yX2RpdihzLCAodTMyKXNwYWNlKSA/IDEgOiAwOwogCQluYl96b25lID0gcyArIHJvdW5kOwogCX0KLQlwcmludGsoInJhaWQwIDogbmJfem9uZSBpcyAlZC5cbiIsIG5iX3pvbmUpOworCXByaW50ayhLRVJOX0lORk8gInJhaWQwIDogbmJfem9uZSBpcyAlZC5cbiIsIG5iX3pvbmUpOwogCi0JcHJpbnRrKCJyYWlkMCA6IEFsbG9jYXRpbmcgJVpkIGJ5dGVzIGZvciBoYXNoLlxuIiwKKwlwcmludGsoS0VSTl9JTkZPICJyYWlkMCA6IEFsbG9jYXRpbmcgJXp1IGJ5dGVzIGZvciBoYXNoLlxuIiwKIAkJCQluYl96b25lKnNpemVvZihzdHJ1Y3Qgc3RyaXBfem9uZSopKTsKIAljb25mLT5oYXNoX3RhYmxlID0ga21hbGxvYyAoc2l6ZW9mIChzdHJ1Y3Qgc3RyaXBfem9uZSAqKSpuYl96b25lLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWNvbmYtPmhhc2hfdGFibGUpCiAJCWdvdG8gb3V0X2ZyZWVfY29uZjsKLQlzaXplID0gY29uZi0+c3RyaXBfem9uZVtjdXJdLnNpemU7CisJc2VjdG9ycyA9IGNvbmYtPnN0cmlwX3pvbmVbY3VyXS5zZWN0b3JzOwogCiAJY29uZi0+aGFzaF90YWJsZVswXSA9IGNvbmYtPnN0cmlwX3pvbmUgKyBjdXI7CiAJZm9yIChpPTE7IGk8IG5iX3pvbmU7IGkrKykgewotCQl3aGlsZSAoc2l6ZSA8PSBjb25mLT5oYXNoX3NwYWNpbmcpIHsKKwkJd2hpbGUgKHNlY3RvcnMgPD0gY29uZi0+c3BhY2luZykgewogCQkJY3VyKys7Ci0JCQlzaXplICs9IGNvbmYtPnN0cmlwX3pvbmVbY3VyXS5zaXplOworCQkJc2VjdG9ycyArPSBjb25mLT5zdHJpcF96b25lW2N1cl0uc2VjdG9yczsKIAkJfQotCQlzaXplIC09IGNvbmYtPmhhc2hfc3BhY2luZzsKKwkJc2VjdG9ycyAtPSBjb25mLT5zcGFjaW5nOwogCQljb25mLT5oYXNoX3RhYmxlW2ldID0gY29uZi0+c3RyaXBfem9uZSArIGN1cjsKIAl9Ci0JaWYgKGNvbmYtPnByZXNoaWZ0KSB7Ci0JCWNvbmYtPmhhc2hfc3BhY2luZyA+Pj0gY29uZi0+cHJlc2hpZnQ7Ci0JCS8qIHJvdW5kIGhhc2hfc3BhY2luZyB1cCBzbyB3aGVuIHdlIGRpdmlkZSBieSBpdCwgd2UKKwlpZiAoY29uZi0+c2VjdG9yX3NoaWZ0KSB7CisJCWNvbmYtPnNwYWNpbmcgPj49IGNvbmYtPnNlY3Rvcl9zaGlmdDsKKwkJLyogcm91bmQgc3BhY2luZyB1cCBzbyB3aGVuIHdlIGRpdmlkZSBieSBpdCwgd2UKIAkJICogZXJyIG9uIHRoZSBzaWRlIG9mIHRvby1sb3csIHdoaWNoIGlzIHNhZmVzdAogCQkgKi8KLQkJY29uZi0+aGFzaF9zcGFjaW5nKys7CisJCWNvbmYtPnNwYWNpbmcrKzsKIAl9CiAKIAkvKiBjYWxjdWxhdGUgdGhlIG1heCByZWFkLWFoZWFkIHNpemUuCkBAIC0zODcsMTIgKzM4OCwxMiBAQAogc3RhdGljIGludCByYWlkMF9tYWtlX3JlcXVlc3QgKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBzdHJ1Y3QgYmlvICpiaW8pCiB7CiAJbWRkZXZfdCAqbWRkZXYgPSBxLT5xdWV1ZWRhdGE7Ci0JdW5zaWduZWQgaW50IHNlY3RfaW5fY2h1bmssIGNodW5rc2l6ZV9iaXRzLCAgY2h1bmtfc2l6ZSwgY2h1bmtfc2VjdHM7CisJdW5zaWduZWQgaW50IHNlY3RfaW5fY2h1bmssIGNodW5rc2VjdF9iaXRzLCBjaHVua19zZWN0czsKIAlyYWlkMF9jb25mX3QgKmNvbmYgPSBtZGRldl90b19jb25mKG1kZGV2KTsKIAlzdHJ1Y3Qgc3RyaXBfem9uZSAqem9uZTsKIAltZGtfcmRldl90ICp0bXBfZGV2OwogCXNlY3Rvcl90IGNodW5rOwotCXNlY3Rvcl90IGJsb2NrLCByc2VjdDsKKwlzZWN0b3JfdCBzZWN0b3IsIHJzZWN0OwogCWNvbnN0IGludCBydyA9IGJpb19kYXRhX2RpcihiaW8pOwogCWludCBjcHU7CiAKQEAgLTQwNywxMSArNDA4LDkgQEAKIAkJICAgICAgYmlvX3NlY3RvcnMoYmlvKSk7CiAJcGFydF9zdGF0X3VubG9jaygpOwogCi0JY2h1bmtfc2l6ZSA9IG1kZGV2LT5jaHVua19zaXplID4+IDEwOwogCWNodW5rX3NlY3RzID0gbWRkZXYtPmNodW5rX3NpemUgPj4gOTsKLQljaHVua3NpemVfYml0cyA9IGZmeih+Y2h1bmtfc2l6ZSk7Ci0JYmxvY2sgPSBiaW8tPmJpX3NlY3RvciA+PiAxOwotCQorCWNodW5rc2VjdF9iaXRzID0gZmZ6KH5jaHVua19zZWN0cyk7CisJc2VjdG9yID0gYmlvLT5iaV9zZWN0b3I7CiAKIAlpZiAodW5saWtlbHkoY2h1bmtfc2VjdHMgPCAoYmlvLT5iaV9zZWN0b3IgJiAoY2h1bmtfc2VjdHMgLSAxKSkgKyAoYmlvLT5iaV9zaXplID4+IDkpKSkgewogCQlzdHJ1Y3QgYmlvX3BhaXIgKmJwOwpAQCAtNDM0LDI4ICs0MzMsMjcgQEAKICAKIAogCXsKLQkJc2VjdG9yX3QgeCA9IGJsb2NrID4+IGNvbmYtPnByZXNoaWZ0OwotCQlzZWN0b3JfZGl2KHgsICh1MzIpY29uZi0+aGFzaF9zcGFjaW5nKTsKKwkJc2VjdG9yX3QgeCA9IHNlY3RvciA+PiBjb25mLT5zZWN0b3Jfc2hpZnQ7CisJCXNlY3Rvcl9kaXYoeCwgKHUzMiljb25mLT5zcGFjaW5nKTsKIAkJem9uZSA9IGNvbmYtPmhhc2hfdGFibGVbeF07CiAJfQotIAotCXdoaWxlIChibG9jayA+PSAoem9uZS0+em9uZV9vZmZzZXQgKyB6b25lLT5zaXplKSkgCisKKwl3aGlsZSAoc2VjdG9yID49IHpvbmUtPnpvbmVfc3RhcnQgKyB6b25lLT5zZWN0b3JzKQogCQl6b25lKys7Ci0gICAgCi0Jc2VjdF9pbl9jaHVuayA9IGJpby0+Ymlfc2VjdG9yICYgKChjaHVua19zaXplPDwxKSAtMSk7CisKKwlzZWN0X2luX2NodW5rID0gYmlvLT5iaV9zZWN0b3IgJiAoY2h1bmtfc2VjdHMgLSAxKTsKIAogCiAJewotCQlzZWN0b3JfdCB4ID0gIChibG9jayAtIHpvbmUtPnpvbmVfb2Zmc2V0KSA+PiBjaHVua3NpemVfYml0czsKKwkJc2VjdG9yX3QgeCA9IChzZWN0b3IgLSB6b25lLT56b25lX3N0YXJ0KSA+PiBjaHVua3NlY3RfYml0czsKIAogCQlzZWN0b3JfZGl2KHgsIHpvbmUtPm5iX2Rldik7CiAJCWNodW5rID0geDsKIAotCQl4ID0gYmxvY2sgPj4gY2h1bmtzaXplX2JpdHM7CisJCXggPSBzZWN0b3IgPj4gY2h1bmtzZWN0X2JpdHM7CiAJCXRtcF9kZXYgPSB6b25lLT5kZXZbc2VjdG9yX2Rpdih4LCB6b25lLT5uYl9kZXYpXTsKIAl9Ci0JcnNlY3QgPSAoKChjaHVuayA8PCBjaHVua3NpemVfYml0cykgKyB6b25lLT5kZXZfb2Zmc2V0KTw8MSkKLQkJKyBzZWN0X2luX2NodW5rOworCXJzZWN0ID0gKGNodW5rIDw8IGNodW5rc2VjdF9iaXRzKSArIHpvbmUtPmRldl9zdGFydCArIHNlY3RfaW5fY2h1bms7CiAgCiAJYmlvLT5iaV9iZGV2ID0gdG1wX2Rldi0+YmRldjsKIAliaW8tPmJpX3NlY3RvciA9IHJzZWN0ICsgdG1wX2Rldi0+ZGF0YV9vZmZzZXQ7CkBAIC00NjcsNyArNDY1LDcgQEAKIAogYmFkX21hcDoKIAlwcmludGsoInJhaWQwX21ha2VfcmVxdWVzdCBidWc6IGNhbid0IGNvbnZlcnQgYmxvY2sgYWNyb3NzIGNodW5rcyIKLQkJIiBvciBiaWdnZXIgdGhhbiAlZGsgJWxsdSAlZFxuIiwgY2h1bmtfc2l6ZSwgCisJCSIgb3IgYmlnZ2VyIHRoYW4gJWRrICVsbHUgJWRcbiIsIGNodW5rX3NlY3RzIC8gMiwKIAkJKHVuc2lnbmVkIGxvbmcgbG9uZyliaW8tPmJpX3NlY3RvciwgYmlvLT5iaV9zaXplID4+IDEwKTsKIAogCWJpb19pb19lcnJvcihiaW8pOwpAQCAtNDkyLDEwICs0OTAsMTAgQEAKIAkJCXNlcV9wcmludGYoc2VxLCAiJXMvIiwgYmRldm5hbWUoCiAJCQkJY29uZi0+c3RyaXBfem9uZVtqXS5kZXZba10tPmJkZXYsYikpOwogCi0JCXNlcV9wcmludGYoc2VxLCAiXSB6bz0lZCBkbz0lZCBzPSVkXG4iLAotCQkJCWNvbmYtPnN0cmlwX3pvbmVbal0uem9uZV9vZmZzZXQsCi0JCQkJY29uZi0+c3RyaXBfem9uZVtqXS5kZXZfb2Zmc2V0LAotCQkJCWNvbmYtPnN0cmlwX3pvbmVbal0uc2l6ZSk7CisJCXNlcV9wcmludGYoc2VxLCAiXSB6cz0lZCBkcz0lZCBzPSVkXG4iLAorCQkJCWNvbmYtPnN0cmlwX3pvbmVbal0uem9uZV9zdGFydCwKKwkJCQljb25mLT5zdHJpcF96b25lW2pdLmRldl9zdGFydCwKKwkJCQljb25mLT5zdHJpcF96b25lW2pdLnNlY3RvcnMpOwogCX0KICNlbmRpZgogCXNlcV9wcmludGYoc2VxLCAiICVkayBjaHVua3MiLCBtZGRldi0+Y2h1bmtfc2l6ZS8xMDI0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvcmFpZDEuYyBiL2RyaXZlcnMvbWQvcmFpZDEuYwppbmRleCA5Yzc4OGUyLi43YjRmNWY3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL3JhaWQxLmMKKysrIGIvZHJpdmVycy9tZC9yYWlkMS5jCkBAIC0xMDE2LDEyICsxMDE2LDE2IEBACiAJICogZWxzZSBtYXJrIHRoZSBkcml2ZSBhcyBmYWlsZWQKIAkgKi8KIAlpZiAodGVzdF9iaXQoSW5fc3luYywgJnJkZXYtPmZsYWdzKQotCSAgICAmJiAoY29uZi0+cmFpZF9kaXNrcyAtIG1kZGV2LT5kZWdyYWRlZCkgPT0gMSkKKwkgICAgJiYgKGNvbmYtPnJhaWRfZGlza3MgLSBtZGRldi0+ZGVncmFkZWQpID09IDEpIHsKIAkJLyoKIAkJICogRG9uJ3QgZmFpbCB0aGUgZHJpdmUsIGFjdCBhcyB0aG91Z2ggd2Ugd2VyZSBqdXN0IGEKLQkJICogbm9ybWFsIHNpbmdsZSBkcml2ZQorCQkgKiBub3JtYWwgc2luZ2xlIGRyaXZlLgorCQkgKiBIb3dldmVyIGRvbid0IHRyeSBhIHJlY292ZXJ5IGZyb20gdGhpcyBkcml2ZSBhcworCQkgKiBpdCBpcyB2ZXJ5IGxpa2VseSB0byBmYWlsLgogCQkgKi8KKwkJbWRkZXYtPnJlY292ZXJ5X2Rpc2FibGVkID0gMTsKIAkJcmV0dXJuOworCX0KIAlpZiAodGVzdF9hbmRfY2xlYXJfYml0KEluX3N5bmMsICZyZGV2LT5mbGFncykpIHsKIAkJdW5zaWduZWQgbG9uZyBmbGFnczsKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJmNvbmYtPmRldmljZV9sb2NrLCBmbGFncyk7CkBAIC0xOTE5LDcgKzE5MjMsNiBAQAogCWludCBpLCBqLCBkaXNrX2lkeDsKIAltaXJyb3JfaW5mb190ICpkaXNrOwogCW1ka19yZGV2X3QgKnJkZXY7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqdG1wOwogCiAJaWYgKG1kZGV2LT5sZXZlbCAhPSAxKSB7CiAJCXByaW50aygicmFpZDE6ICVzOiByYWlkIGxldmVsIG5vdCBzZXQgdG8gbWlycm9yaW5nICglZClcbiIsCkBAIC0xOTY0LDcgKzE5NjcsNyBAQAogCXNwaW5fbG9ja19pbml0KCZjb25mLT5kZXZpY2VfbG9jayk7CiAJbWRkZXYtPnF1ZXVlLT5xdWV1ZV9sb2NrID0gJmNvbmYtPmRldmljZV9sb2NrOwogCi0JcmRldl9mb3JfZWFjaChyZGV2LCB0bXAsIG1kZGV2KSB7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShyZGV2LCAmbWRkZXYtPmRpc2tzLCBzYW1lX3NldCkgewogCQlkaXNrX2lkeCA9IHJkZXYtPnJhaWRfZGlzazsKIAkJaWYgKGRpc2tfaWR4ID49IG1kZGV2LT5yYWlkX2Rpc2tzCiAJCSAgICB8fCBkaXNrX2lkeCA8IDApCmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL3JhaWQxMC5jIGIvZHJpdmVycy9tZC9yYWlkMTAuYwppbmRleCA5NzBhOTZlLi42NzM2ZDZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL3JhaWQxMC5jCisrKyBiL2RyaXZlcnMvbWQvcmFpZDEwLmMKQEAgLTIwMjUsNyArMjAyNSw2IEBACiAJaW50IGksIGRpc2tfaWR4OwogCW1pcnJvcl9pbmZvX3QgKmRpc2s7CiAJbWRrX3JkZXZfdCAqcmRldjsKLQlzdHJ1Y3QgbGlzdF9oZWFkICp0bXA7CiAJaW50IG5jLCBmYywgZm87CiAJc2VjdG9yX3Qgc3RyaWRlLCBzaXplOwogCkBAIC0yMTA4LDcgKzIxMDcsNyBAQAogCXNwaW5fbG9ja19pbml0KCZjb25mLT5kZXZpY2VfbG9jayk7CiAJbWRkZXYtPnF1ZXVlLT5xdWV1ZV9sb2NrID0gJmNvbmYtPmRldmljZV9sb2NrOwogCi0JcmRldl9mb3JfZWFjaChyZGV2LCB0bXAsIG1kZGV2KSB7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShyZGV2LCAmbWRkZXYtPmRpc2tzLCBzYW1lX3NldCkgewogCQlkaXNrX2lkeCA9IHJkZXYtPnJhaWRfZGlzazsKIAkJaWYgKGRpc2tfaWR4ID49IG1kZGV2LT5yYWlkX2Rpc2tzCiAJCSAgICB8fCBkaXNrX2lkeCA8IDApCmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL3JhaWQ1LmMgYi9kcml2ZXJzL21kL3JhaWQ1LmMKaW5kZXggYTM2YTc0My4uYTViYTA4MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9yYWlkNS5jCisrKyBiL2RyaXZlcnMvbWQvcmFpZDUuYwpAQCAtMzk5OCw3ICszOTk4LDYgQEAKIAlpbnQgcmFpZF9kaXNrLCBtZW1vcnk7CiAJbWRrX3JkZXZfdCAqcmRldjsKIAlzdHJ1Y3QgZGlza19pbmZvICpkaXNrOwotCXN0cnVjdCBsaXN0X2hlYWQgKnRtcDsKIAlpbnQgd29ya2luZ19kaXNrcyA9IDA7CiAKIAlpZiAobWRkZXYtPmxldmVsICE9IDUgJiYgbWRkZXYtPmxldmVsICE9IDQgJiYgbWRkZXYtPmxldmVsICE9IDYpIHsKQEAgLTQxMDgsNyArNDEwNyw3IEBACiAKIAlwcl9kZWJ1ZygicmFpZDU6IHJ1biglcykgY2FsbGVkLlxuIiwgbWRuYW1lKG1kZGV2KSk7CiAKLQlyZGV2X2Zvcl9lYWNoKHJkZXYsIHRtcCwgbWRkZXYpIHsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJkZXYsICZtZGRldi0+ZGlza3MsIHNhbWVfc2V0KSB7CiAJCXJhaWRfZGlzayA9IHJkZXYtPnJhaWRfZGlzazsKIAkJaWYgKHJhaWRfZGlzayA+PSBjb25mLT5yYWlkX2Rpc2tzCiAJCSAgICB8fCByYWlkX2Rpc2sgPCAwKQpAQCAtNDUzMyw3ICs0NTMyLDYgQEAKIHsKIAlyYWlkNV9jb25mX3QgKmNvbmYgPSBtZGRldl90b19jb25mKG1kZGV2KTsKIAltZGtfcmRldl90ICpyZGV2OwotCXN0cnVjdCBsaXN0X2hlYWQgKnJ0bXA7CiAJaW50IHNwYXJlcyA9IDA7CiAJaW50IGFkZGVkX2RldmljZXMgPSAwOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CkBAIC00NTQxLDcgKzQ1MzksNyBAQAogCWlmICh0ZXN0X2JpdChNRF9SRUNPVkVSWV9SVU5OSU5HLCAmbWRkZXYtPnJlY292ZXJ5KSkKIAkJcmV0dXJuIC1FQlVTWTsKIAotCXJkZXZfZm9yX2VhY2gocmRldiwgcnRtcCwgbWRkZXYpCisJbGlzdF9mb3JfZWFjaF9lbnRyeShyZGV2LCAmbWRkZXYtPmRpc2tzLCBzYW1lX3NldCkKIAkJaWYgKHJkZXYtPnJhaWRfZGlzayA8IDAgJiYKIAkJICAgICF0ZXN0X2JpdChGYXVsdHksICZyZGV2LT5mbGFncykpCiAJCQlzcGFyZXMrKzsKQEAgLTQ1NjMsNyArNDU2MSw3IEBACiAJLyogQWRkIHNvbWUgbmV3IGRyaXZlcywgYXMgbWFueSBhcyB3aWxsIGZpdC4KIAkgKiBXZSBrbm93IHRoZXJlIGFyZSBlbm91Z2ggdG8gbWFrZSB0aGUgbmV3bHkgc2l6ZWQgYXJyYXkgd29yay4KIAkgKi8KLQlyZGV2X2Zvcl9lYWNoKHJkZXYsIHJ0bXAsIG1kZGV2KQorCWxpc3RfZm9yX2VhY2hfZW50cnkocmRldiwgJm1kZGV2LT5kaXNrcywgc2FtZV9zZXQpCiAJCWlmIChyZGV2LT5yYWlkX2Rpc2sgPCAwICYmCiAJCSAgICAhdGVzdF9iaXQoRmF1bHR5LCAmcmRldi0+ZmxhZ3MpKSB7CiAJCQlpZiAocmFpZDVfYWRkX2Rpc2sobWRkZXYsIHJkZXYpID09IDApIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvY29tbW9uL3R1bmVycy90ZGE4MjkwLmMgYi9kcml2ZXJzL21lZGlhL2NvbW1vbi90dW5lcnMvdGRhODI5MC5jCmluZGV4IDBlZTc5ZmQuLjRiODY2MmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvY29tbW9uL3R1bmVycy90ZGE4MjkwLmMKKysrIGIvZHJpdmVycy9tZWRpYS9jb21tb24vdHVuZXJzL3RkYTgyOTAuYwpAQCAtMTUwLDcgKzE1MCw3IEBACiAJfQogfQogCi1zdHJ1Y3Qgeworc3RhdGljIHN0cnVjdCB7CiAJdW5zaWduZWQgY2hhciBzZXFbMl07CiB9IGZtX21vZGVbXSA9IHsKIAl7IHsgMHgwMSwgMHg4MX0gfSwJLyogUHV0IGRldmljZSBpbnRvIGV4cGVydCBtb2RlICovCkBAIC0yMDcsNyArMjA3LDYgQEAKIAltc2xlZXAoMSk7CiAKIAlpZiAocGFyYW1zLT5tb2RlID09IFY0TDJfVFVORVJfUkFESU8pIHsKLQkJaW50IGk7CiAJCXVuc2lnbmVkIGNoYXIgZGVlbXBoYXNpc1tdICA9IHsgMHgxMywgMSB9OwogCiAJCS8qIEZJWE1FOiBhbGxvdyB1c2luZyBhIGRpZmZlcmVudCBkZWVtcGhhc2lzICovCkBAIC03NjcsNyArNzY2LDggQEAKIAlmZS0+b3BzLmFuYWxvZ19vcHMuaW5mby5uYW1lID0gbmFtZTsKIAogCWlmIChwcml2LT52ZXIgJiBUREE4MjkwKSB7Ci0JCXRkYTgyOTBfaW5pdF90dW5lcihmZSk7CisJCWlmIChwcml2LT52ZXIgJiAoVERBODI3NSB8IFREQTgyNzVBKSkKKwkJCXRkYTgyOTBfaW5pdF90dW5lcihmZSk7CiAJCXRkYTgyOTBfaW5pdF9pZihmZSk7CiAJfSBlbHNlIGlmIChwcml2LT52ZXIgJiBUREE4Mjk1KQogCQl0ZGE4Mjk1X2luaXRfaWYoZmUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZG0xMTA1L0tjb25maWcgYi9kcml2ZXJzL21lZGlhL2R2Yi9kbTExMDUvS2NvbmZpZwppbmRleCAxMzMyMzAxLi40M2Y0ZDQ0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kbTExMDUvS2NvbmZpZworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kbTExMDUvS2NvbmZpZwpAQCAtMSw2ICsxLDcgQEAKIGNvbmZpZyBEVkJfRE0xMTA1CiAJdHJpc3RhdGUgIlNETUMgRE0xMTA1IGJhc2VkIFBDSSBjYXJkcyIKIAlkZXBlbmRzIG9uIERWQl9DT1JFICYmIFBDSSAmJiBJMkMKKwlkZXBlbmRzIG9uIElOUFVUCiAJc2VsZWN0IERWQl9QTEwgaWYgIURWQl9GRV9DVVNUT01JU0UKIAlzZWxlY3QgRFZCX1NUVjAyOTkgaWYgIURWQl9GRV9DVVNUT01JU0UKIAlzZWxlY3QgRFZCX1NUVjAyODggaWYgIURWQl9GRV9DVVNUT01JU0UKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2R2Yl9mcm9udGVuZC5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZHZiX2Zyb250ZW5kLmMKaW5kZXggMTcxZjljYS4uODQzNDA3NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZHZiX2Zyb250ZW5kLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZHZiX2Zyb250ZW5kLmMKQEAgLTgyNCw3ICs4MjQsNyBAQAogCXJldHVybiAwOwogfQogCi1zdHJ1Y3QgZHR2X2NtZHNfaCBkdHZfY21kc1tdID0geworc3RhdGljIHN0cnVjdCBkdHZfY21kc19oIGR0dl9jbWRzW10gPSB7CiAJW0RUVl9UVU5FXSA9IHsKIAkJLm5hbWUJPSAiRFRWX1RVTkUiLAogCQkuY21kCT0gRFRWX1RVTkUsCkBAIC05NjIsNyArOTYyLDcgQEAKIAl9LAogfTsKIAotdm9pZCBkdHZfcHJvcGVydHlfZHVtcChzdHJ1Y3QgZHR2X3Byb3BlcnR5ICp0dnApCitzdGF0aWMgdm9pZCBkdHZfcHJvcGVydHlfZHVtcChzdHJ1Y3QgZHR2X3Byb3BlcnR5ICp0dnApCiB7CiAJaW50IGk7CiAKQEAgLTk5Myw3ICs5OTMsNyBAQAogCQlkcHJpbnRrKCIlcygpIHR2cC51LmRhdGEgPSAweCUwOHhcbiIsIF9fZnVuY19fLCB0dnAtPnUuZGF0YSk7CiB9CiAKLWludCBpc19sZWdhY3lfZGVsaXZlcnlfc3lzdGVtKGZlX2RlbGl2ZXJ5X3N5c3RlbV90IHMpCitzdGF0aWMgaW50IGlzX2xlZ2FjeV9kZWxpdmVyeV9zeXN0ZW0oZmVfZGVsaXZlcnlfc3lzdGVtX3QgcykKIHsKIAlpZigocyA9PSBTWVNfVU5ERUZJTkVEKSB8fCAocyA9PSBTWVNfRFZCQ19BTk5FWF9BQykgfHwKIAkgICAocyA9PSBTWVNfRFZCQ19BTk5FWF9CKSB8fCAocyA9PSBTWVNfRFZCVCkgfHwgKHMgPT0gU1lTX0RWQlMpIHx8CkBAIC0xMDA3LDcgKzEwMDcsOCBAQAogICogZHJpdmVycyBjYW4gdXNlIGEgc2luZ2xlIHNldF9mcm9udGVuZCB0dW5pbmcgZnVuY3Rpb24sIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlcgogICogaXQncyBiZWluZyB1c2VkIGZvciB0aGUgbGVnYWN5IG9yIG5ldyBBUEksIHJlZHVjaW5nIGNvZGUgYW5kIGNvbXBsZXhpdHkuCiAgKi8KLXZvaWQgZHR2X3Byb3BlcnR5X2NhY2hlX3N5bmMoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyAqcCkKK3N0YXRpYyB2b2lkIGR0dl9wcm9wZXJ0eV9jYWNoZV9zeW5jKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLAorCQkJCSAgICBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKnApCiB7CiAJc3RydWN0IGR0dl9mcm9udGVuZF9wcm9wZXJ0aWVzICpjID0gJmZlLT5kdHZfcHJvcGVydHlfY2FjaGU7CiAKQEAgLTEwNTksNyArMTA2MCw3IEBACiAvKiBFbnN1cmUgdGhlIGNhY2hlZCB2YWx1ZXMgYXJlIHNldCBjb3JyZWN0bHkgaW4gdGhlIGZyb250ZW5kCiAgKiBsZWdhY3kgdHVuaW5nIHN0cnVjdHVyZXMsIGZvciB0aGUgYWR2YW5jZWQgdHVuaW5nIEFQSS4KICAqLwotdm9pZCBkdHZfcHJvcGVydHlfbGVnYWN5X3BhcmFtc19zeW5jKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKQorc3RhdGljIHZvaWQgZHR2X3Byb3BlcnR5X2xlZ2FjeV9wYXJhbXNfc3luYyhzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSkKIHsKIAlzdHJ1Y3QgZHR2X2Zyb250ZW5kX3Byb3BlcnRpZXMgKmMgPSAmZmUtPmR0dl9wcm9wZXJ0eV9jYWNoZTsKIAlzdHJ1Y3QgZHZiX2Zyb250ZW5kX3ByaXZhdGUgKmZlcHJpdiA9IGZlLT5mcm9udGVuZF9wcml2OwpAQCAtMTExNCw3ICsxMTE1LDcgQEAKIC8qIEVuc3VyZSB0aGUgY2FjaGVkIHZhbHVlcyBhcmUgc2V0IGNvcnJlY3RseSBpbiB0aGUgZnJvbnRlbmQKICAqIGxlZ2FjeSB0dW5pbmcgc3RydWN0dXJlcywgZm9yIHRoZSBsZWdhY3kgdHVuaW5nIEFQSS4KICAqLwotdm9pZCBkdHZfcHJvcGVydHlfYWR2X3BhcmFtc19zeW5jKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKQorc3RhdGljIHZvaWQgZHR2X3Byb3BlcnR5X2Fkdl9wYXJhbXNfc3luYyhzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSkKIHsKIAlzdHJ1Y3QgZHR2X2Zyb250ZW5kX3Byb3BlcnRpZXMgKmMgPSAmZmUtPmR0dl9wcm9wZXJ0eV9jYWNoZTsKIAlzdHJ1Y3QgZHZiX2Zyb250ZW5kX3ByaXZhdGUgKmZlcHJpdiA9IGZlLT5mcm9udGVuZF9wcml2OwpAQCAtMTE0OSw3ICsxMTUwLDcgQEAKIAl9CiB9CiAKLXZvaWQgZHR2X3Byb3BlcnR5X2NhY2hlX3N1Ym1pdChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSkKK3N0YXRpYyB2b2lkIGR0dl9wcm9wZXJ0eV9jYWNoZV9zdWJtaXQoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUpCiB7CiAJc3RydWN0IGR0dl9mcm9udGVuZF9wcm9wZXJ0aWVzICpjID0gJmZlLT5kdHZfcHJvcGVydHlfY2FjaGU7CiAKQEAgLTExODAsOCArMTE4MSw5IEBACiBzdGF0aWMgaW50IGR2Yl9mcm9udGVuZF9pb2N0bF9wcm9wZXJ0aWVzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAogCQkJdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqcGFyZyk7CiAKLWludCBkdHZfcHJvcGVydHlfcHJvY2Vzc19nZXQoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHN0cnVjdCBkdHZfcHJvcGVydHkgKnR2cCwKLQlzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3N0YXRpYyBpbnQgZHR2X3Byb3BlcnR5X3Byb2Nlc3NfZ2V0KHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLAorCQkJCSAgICBzdHJ1Y3QgZHR2X3Byb3BlcnR5ICp0dnAsCisJCQkJICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQogewogCWludCByID0gMDsKIApAQCAtMTI1Myw4ICsxMjU1LDEwIEBACiAJcmV0dXJuIHI7CiB9CiAKLWludCBkdHZfcHJvcGVydHlfcHJvY2Vzc19zZXQoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHN0cnVjdCBkdHZfcHJvcGVydHkgKnR2cCwKLQlzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3N0YXRpYyBpbnQgZHR2X3Byb3BlcnR5X3Byb2Nlc3Nfc2V0KHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLAorCQkJCSAgICBzdHJ1Y3QgZHR2X3Byb3BlcnR5ICp0dnAsCisJCQkJICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJICAgIHN0cnVjdCBmaWxlICpmaWxlKQogewogCWludCByID0gMDsKIAlzdHJ1Y3QgZHZiX2Zyb250ZW5kX3ByaXZhdGUgKmZlcHJpdiA9IGZlLT5mcm9udGVuZF9wcml2OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZHZiX25ldC5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZHZiX25ldC5jCmluZGV4IDAzZmQ5ZGQuLmY2YmE4NDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2R2Yl9uZXQuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS9kdmJfbmV0LmMKQEAgLTEyNSw3ICsxMjUsNiBAQAogCiBzdHJ1Y3QgZHZiX25ldF9wcml2IHsKIAlpbnQgaW5fdXNlOwotCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOwogCXUxNiBwaWQ7CiAJc3RydWN0IG5ldF9kZXZpY2UgKm5ldDsKIAlzdHJ1Y3QgZHZiX25ldCAqaG9zdDsKQEAgLTM4NCw4ICszODMsOCBAQAogCQkJCWlmIChwcml2LT51bGVfc2tiKSB7CiAJCQkJCWRldl9rZnJlZV9za2IoIHByaXYtPnVsZV9za2IgKTsKIAkJCQkJLyogUHJlcGFyZSBmb3IgbmV4dCBTTkRVLiAqLwotCQkJCQlwcml2LT5zdGF0cy5yeF9lcnJvcnMrKzsKLQkJCQkJcHJpdi0+c3RhdHMucnhfZnJhbWVfZXJyb3JzKys7CisJCQkJCWRldi0+c3RhdHMucnhfZXJyb3JzKys7CisJCQkJCWRldi0+c3RhdHMucnhfZnJhbWVfZXJyb3JzKys7CiAJCQkJfQogCQkJCXJlc2V0X3VsZShwcml2KTsKIAkJCQlwcml2LT5uZWVkX3B1c2kgPSAxOwpAQCAtNDM4LDggKzQzNyw4IEBACiAJCQkJCWRldl9rZnJlZV9za2IoIHByaXYtPnVsZV9za2IgKTsKIAkJCQkJLyogUHJlcGFyZSBmb3IgbmV4dCBTTkRVLiAqLwogCQkJCQkvLyByZXNldF91bGUocHJpdik7ICBtb3ZlZCB0byBiZWxvdy4KLQkJCQkJcHJpdi0+c3RhdHMucnhfZXJyb3JzKys7Ci0JCQkJCXByaXYtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycysrOworCQkJCQlkZXYtPnN0YXRzLnJ4X2Vycm9ycysrOworCQkJCQlkZXYtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycysrOwogCQkJCX0KIAkJCQlyZXNldF91bGUocHJpdik7CiAJCQkJLyogc2tpcCB0byBuZXh0IFBVU0kuICovCkBAIC00NjAsOCArNDU5LDggQEAKIAkJCQkJCS8qIERyb3AgcGFydGx5IGRlY29kZWQgU05EVSwgcmVzZXQgc3RhdGUsIHJlc3luYyBvbiBQVVNJLiAqLwogCQkJCQkJaWYgKHByaXYtPnVsZV9za2IpIHsKIAkJCQkJCQlkZXZfa2ZyZWVfc2tiKCBwcml2LT51bGVfc2tiICk7Ci0JCQkJCQkJcHJpdi0+c3RhdHMucnhfZXJyb3JzKys7Ci0JCQkJCQkJcHJpdi0+c3RhdHMucnhfZnJhbWVfZXJyb3JzKys7CisJCQkJCQkJZGV2LT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkJCQkJCQlkZXYtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycysrOwogCQkJCQkJfQogCQkJCQkJcmVzZXRfdWxlKHByaXYpOwogCQkJCQkJcHJpdi0+bmVlZF9wdXNpID0gMTsKQEAgLTQ3Nyw4ICs0NzYsOCBAQAogCQkJCWlmIChwcml2LT51bGVfc25kdV9yZW1haW4gPiAxODMpIHsKIAkJCQkJLyogQ3VycmVudCBTTkRVIGxhY2tzIG1vcmUgZGF0YSB0aGFuIHRoZXJlIGNvdWxkIGJlIGF2YWlsYWJsZSBpbiB0aGUKIAkJCQkJICogY3VycmVudCBUUyBjZWxsLiAqLwotCQkJCQlwcml2LT5zdGF0cy5yeF9lcnJvcnMrKzsKLQkJCQkJcHJpdi0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOworCQkJCQlkZXYtPnN0YXRzLnJ4X2Vycm9ycysrOworCQkJCQlkZXYtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMrKzsKIAkJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJWx1OiBFeHBlY3RlZCAlZCBtb3JlIFNORFUgYnl0ZXMsIGJ1dCAiCiAJCQkJCSAgICAgICAiZ290IFBVU0kgKHBmICVkLCB0c19yZW1haW4gJWQpLiAgRmx1c2hpbmcgaW5jb21wbGV0ZSBwYXlsb2FkLlxuIiwKIAkJCQkJICAgICAgIHByaXYtPnRzX2NvdW50LCBwcml2LT51bGVfc25kdV9yZW1haW4sIHRzWzRdLCB0c19yZW1haW4pOwpAQCAtNTIwLDggKzUxOSw4IEBACiAJCQkJaWYgKHByaXYtPnVsZV9zbmR1X2xlbiA8IDUpIHsKIAkJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJWx1OiBJbnZhbGlkIFVMRSBTTkRVIGxlbmd0aCAldS4gIgogCQkJCQkgICAgICAgIlJlc3luY2luZy5cbiIsIHByaXYtPnRzX2NvdW50LCBwcml2LT51bGVfc25kdV9sZW4pOwotCQkJCQlwcml2LT5zdGF0cy5yeF9lcnJvcnMrKzsKLQkJCQkJcHJpdi0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOworCQkJCQlkZXYtPnN0YXRzLnJ4X2Vycm9ycysrOworCQkJCQlkZXYtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMrKzsKIAkJCQkJcHJpdi0+dWxlX3NuZHVfbGVuID0gMDsKIAkJCQkJcHJpdi0+bmVlZF9wdXNpID0gMTsKIAkJCQkJbmV3X3RzID0gMTsKQEAgLTU3Myw3ICs1NzIsNyBAQAogCQkJaWYgKHByaXYtPnVsZV9za2IgPT0gTlVMTCkgewogCQkJCXByaW50ayhLRVJOX05PVElDRSAiJXM6IE1lbW9yeSBzcXVlZXplLCBkcm9wcGluZyBwYWNrZXQuXG4iLAogCQkJCSAgICAgICBkZXYtPm5hbWUpOwotCQkJCXByaXYtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKKwkJCQlkZXYtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKIAkJCQlyZXR1cm47CiAJCQl9CiAKQEAgLTYzNyw4ICs2MzYsOCBAQAogCQkJCXVsZV9kdW1wID0gMTsKICNlbmRpZgogCi0JCQkJcHJpdi0+c3RhdHMucnhfZXJyb3JzKys7Ci0JCQkJcHJpdi0+c3RhdHMucnhfY3JjX2Vycm9ycysrOworCQkJCWRldi0+c3RhdHMucnhfZXJyb3JzKys7CisJCQkJZGV2LT5zdGF0cy5yeF9jcmNfZXJyb3JzKys7CiAJCQkJZGV2X2tmcmVlX3NrYihwcml2LT51bGVfc2tiKTsKIAkJCX0gZWxzZSB7CiAJCQkJLyogQ1JDMzIgdmVyaWZpZWQgT0suICovCkBAIC03NDQsOCArNzQzLDggQEAKIAkJCQkgKiByZWNlaXZlIHRoZSBwYWNrZXQgYW55aG93LiAqLwogCQkJCS8qIGlmIChwcml2LT51bGVfZGJpdCAmJiBza2ItPnBrdF90eXBlID09IFBBQ0tFVF9PVEhFUkhPU1QpCiAJCQkJCXByaXYtPnVsZV9za2ItPnBrdF90eXBlID0gUEFDS0VUX0hPU1Q7ICovCi0JCQkJcHJpdi0+c3RhdHMucnhfcGFja2V0cysrOwotCQkJCXByaXYtPnN0YXRzLnJ4X2J5dGVzICs9IHByaXYtPnVsZV9za2ItPmxlbjsKKwkJCQlkZXYtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKwkJCQlkZXYtPnN0YXRzLnJ4X2J5dGVzICs9IHByaXYtPnVsZV9za2ItPmxlbjsKIAkJCQluZXRpZl9yeChwcml2LT51bGVfc2tiKTsKIAkJCX0KIAkJCXNuZHVfZG9uZToKQEAgLTgwMCw4ICs3OTksNyBAQAogewogCXU4ICpldGg7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKLQlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHMgPQotCQkmKChzdHJ1Y3QgZHZiX25ldF9wcml2ICopIG5ldGRldl9wcml2KGRldikpLT5zdGF0czsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHMgPSAmZGV2LT5zdGF0czsKIAlpbnQgc25hcCA9IDA7CiAKIAkvKiBub3RlOiBwa3RfbGVuIGluY2x1ZGVzIGEgMzJiaXQgY2hlY2tzdW0gKi8KQEAgLTEyMTYsMjggKzEyMTQsMjkgQEAKIAlyZXR1cm4gZHZiX25ldF9mZWVkX3N0b3AoZGV2KTsKIH0KIAotc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICogZHZiX25ldF9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKLXsKLQlyZXR1cm4gJigoc3RydWN0IGR2Yl9uZXRfcHJpdiAqKSBuZXRkZXZfcHJpdihkZXYpKS0+c3RhdHM7Ci19Ci0KIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaGVhZGVyX29wcyBkdmJfaGVhZGVyX29wcyA9IHsKIAkuY3JlYXRlCQk9IGV0aF9oZWFkZXIsCiAJLnBhcnNlCQk9IGV0aF9oZWFkZXJfcGFyc2UsCiAJLnJlYnVpbGQJPSBldGhfcmVidWlsZF9oZWFkZXIsCiB9OwogCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgZHZiX25ldGRldl9vcHMgPSB7CisJLm5kb19vcGVuCQk9IGR2Yl9uZXRfb3BlbiwKKwkubmRvX3N0b3AJCT0gZHZiX25ldF9zdG9wLAorCS5uZG9fc3RhcnRfeG1pdAkJPSBkdmJfbmV0X3R4LAorCS5uZG9fc2V0X211bHRpY2FzdF9saXN0ID0gZHZiX25ldF9zZXRfbXVsdGljYXN0X2xpc3QsCisJLm5kb19zZXRfbWFjX2FkZHJlc3MgICAgPSBkdmJfbmV0X3NldF9tYWMsCisJLm5kb19jaGFuZ2VfbXR1CQk9IGV0aF9jaGFuZ2VfbXR1LAorCS5uZG9fdmFsaWRhdGVfYWRkcgk9IGV0aF92YWxpZGF0ZV9hZGRyLAorfTsKKwogc3RhdGljIHZvaWQgZHZiX25ldF9zZXR1cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCWV0aGVyX3NldHVwKGRldik7CiAKIAlkZXYtPmhlYWRlcl9vcHMJCT0gJmR2Yl9oZWFkZXJfb3BzOwotCWRldi0+b3BlbgkJPSBkdmJfbmV0X29wZW47Ci0JZGV2LT5zdG9wCQk9IGR2Yl9uZXRfc3RvcDsKLQlkZXYtPmhhcmRfc3RhcnRfeG1pdAk9IGR2Yl9uZXRfdHg7Ci0JZGV2LT5nZXRfc3RhdHMJCT0gZHZiX25ldF9nZXRfc3RhdHM7Ci0JZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSBkdmJfbmV0X3NldF9tdWx0aWNhc3RfbGlzdDsKLQlkZXYtPnNldF9tYWNfYWRkcmVzcyAgICA9IGR2Yl9uZXRfc2V0X21hYzsKKwlkZXYtPm5ldGRldl9vcHMJCT0gJmR2Yl9uZXRkZXZfb3BzOwogCWRldi0+bXR1CQk9IDQwOTY7CiAJZGV2LT5tY19jb3VudCAgICAgICAgICAgPSAwOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2FueXNlZS5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9hbnlzZWUuYwppbmRleCA1MDE3ZjA4Li5jNmU3YjQyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2FueXNlZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvYW55c2VlLmMKQEAgLTQxLDcgKzQxLDcgQEAKIHN0YXRpYyBpbnQgZHZiX3VzYl9hbnlzZWVfZGVidWc7CiBtb2R1bGVfcGFyYW1fbmFtZWQoZGVidWcsIGR2Yl91c2JfYW55c2VlX2RlYnVnLCBpbnQsIDA2NDQpOwogTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgInNldCBkZWJ1Z2dpbmcgbGV2ZWwiIERWQl9VU0JfREVCVUdfU1RBVFVTKTsKLWludCBkdmJfdXNiX2FueXNlZV9kZWxzeXM7CitzdGF0aWMgaW50IGR2Yl91c2JfYW55c2VlX2RlbHN5czsKIG1vZHVsZV9wYXJhbV9uYW1lZChkZWxzeXMsIGR2Yl91c2JfYW55c2VlX2RlbHN5cywgaW50LCAwNjQ0KTsKIE1PRFVMRV9QQVJNX0RFU0MoZGVsc3lzLCAic2VsZWN0IGRlbGl2ZXJ5IG1vZGUgKDA9RFZCLUMsIDE9RFZCLVQpIik7CiBEVkJfREVGSU5FX01PRF9PUFRfQURBUFRFUl9OUihhZGFwdGVyX25yKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9jeDI0MTE2LmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvY3gyNDExNi5jCmluZGV4IDRmNTE0ZDMuLjI4YWQ2MDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9jeDI0MTE2LmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2N4MjQxMTYuYwpAQCAtMzY5LDcgKzM2OSw3IEBACiAgKiBOb3QgYWxsIFMyIG1tb2R1bGF0aW9uIHNjaGVtZXMgYXJlIHN1cHBvcnQgYW5kIG5vdCBhbGwgcmF0ZXMgd2l0aAogICogYSBzY2hlbWUgYXJlIHN1cHBvcnQuIEVzcGVjaWFsbHksIG5vIGF1dG8gZGV0ZWN0IHdoZW4gaW4gUzIgbW9kZS4KICAqLwotc3RydWN0IGN4MjQxMTZfbW9kZmVjIHsKK3N0YXRpYyBzdHJ1Y3QgY3gyNDExNl9tb2RmZWMgewogCWZlX2RlbGl2ZXJ5X3N5c3RlbV90IGRlbGl2ZXJ5X3N5c3RlbTsKIAlmZV9tb2R1bGF0aW9uX3QgbW9kdWxhdGlvbjsKIAlmZV9jb2RlX3JhdGVfdCBmZWM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvbGdkdDMzMDQuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9sZ2R0MzMwNC5jCmluZGV4IDQ2OWFjZTUuLjNiYjBjNDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9sZ2R0MzMwNC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9sZ2R0MzMwNC5jCkBAIC00Miw3ICs0Miw3IEBACiAKIAlmb3IgKGk9MDsgaTxsZW4tMTsgaSs9Myl7CiAJCWlmKChlcnIgPSBpMmNfdHJhbnNmZXIoc3RhdGUtPmkyYywgJmkyY21zZ3MsIDEpKTwwKSB7Ci0JCQlwcmludGsoIiVzIGkyY190cmFuc2ZlciBlcnJvciAlZFxuIiwgX19GVU5DVElPTl9fLCBlcnIpOworCQkJcHJpbnRrKCIlcyBpMmNfdHJhbnNmZXIgZXJyb3IgJWRcbiIsIF9fZnVuY19fLCBlcnIpOwogCQkJaWYgKGVyciA8IDApCiAJCQkJcmV0dXJuIGVycjsKIAkJCWVsc2UKQEAgLTczLDcgKzczLDcgQEAKIAlpMmNtc2dzWzFdLmJ1ZiA9ICZidWY7CiAKIAlpZigocmV0ID0gaTJjX3RyYW5zZmVyKHN0YXRlLT5pMmMsIGkyY21zZ3MsIDIpKTwwKSB7Ci0JCXByaW50aygiJXMgaTJjX3RyYW5zZmVyIGVycm9yICVkXG4iLCBfX0ZVTkNUSU9OX18sIHJldCk7CisJCXByaW50aygiJXMgaTJjX3RyYW5zZmVyIGVycm9yICVkXG4iLCBfX2Z1bmNfXywgcmV0KTsKIAkJcmV0dXJuIHJldDsKIAl9CiAKQEAgLTk0LDcgKzk0LDcgQEAKIAl9OwogCXJldCA9IGkyY190cmFuc2ZlcihzdGF0ZS0+aTJjLCAmaTJjbXNncywgMSk7CiAJaWYgKHJldCAhPSAxKSB7Ci0JCXByaW50aygiJXMgaTJjX3RyYW5zZmVyIGVycm9yICVkXG4iLCBfX0ZVTkNUSU9OX18sIHJldCk7CisJCXByaW50aygiJXMgaTJjX3RyYW5zZmVyIGVycm9yICVkXG4iLCBfX2Z1bmNfXywgcmV0KTsKIAkJcmV0dXJuIHJldDsKIAl9CiAKQEAgLTIzOCw3ICsyMzgsNyBAQAogCQl9CiAKIAkJaWYgKGVycikgewotCQkJcHJpbnRrKCIlcyBlcnJvciBzZXR0aW5nIG1vZHVsYXRpb25cbiIsIF9fRlVOQ1RJT05fXyk7CisJCQlwcmludGsoIiVzIGVycm9yIHNldHRpbmcgbW9kdWxhdGlvblxuIiwgX19mdW5jX18pOwogCQl9IGVsc2UgewogCQkJc3RhdGUtPmN1cnJlbnRfbW9kdWxhdGlvbiA9IHBhcmFtLT51LnZzYi5tb2R1bGF0aW9uOwogCQl9CkBAIC0zMDUsNyArMzA1LDcgQEAKIAkJfQogCQlicmVhazsKIAlkZWZhdWx0OgotCQlwcmludGsoIiVzIHVuaGFuZGxlZCBtb2R1bGF0aW9uXG4iLCBfX0ZVTkNUSU9OX18pOworCQlwcmludGsoIiVzIHVuaGFuZGxlZCBtb2R1bGF0aW9uXG4iLCBfX2Z1bmNfXyk7CiAJfQogCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9zOTIxX21vZHVsZS5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3M5MjFfbW9kdWxlLmMKaW5kZXggM2NiYjljYi4uODkyYWY4YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3M5MjFfbW9kdWxlLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3M5MjFfbW9kdWxlLmMKQEAgLTEzNiw3ICsxMzYsNyBAQAogCX07CiAKIAlpZigoZXJyID0gaTJjX3RyYW5zZmVyKHN0YXRlLT5pMmMsICZpMmNtc2dzLCAxKSk8MCkgewotCQlwcmludGsoIiVzIGkyY190cmFuc2ZlciBlcnJvciAlZFxuIiwgX19GVU5DVElPTl9fLCBlcnIpOworCQlwcmludGsoIiVzIGkyY190cmFuc2ZlciBlcnJvciAlZFxuIiwgX19mdW5jX18sIGVycik7CiAJCWlmIChlcnIgPCAwKQogCQkJcmV0dXJuIGVycjsKIAkJZWxzZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3N0YjA4OTlfYWxnby5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3N0YjA4OTlfYWxnby5jCmluZGV4IGNlZDliN2EuLjgzZGM3ZTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9zdGIwODk5X2FsZ28uYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvc3RiMDg5OV9hbGdvLmMKQEAgLTU0LDcgKzU0LDcgQEAKICAqIHN0YjA4OTlfZ2V0X3NyYXRlCiAgKiBHZXQgdGhlIGN1cnJlbnQgc3ltYm9sIHJhdGUKICAqLwotdTMyIHN0YjA4OTlfZ2V0X3NyYXRlKHN0cnVjdCBzdGIwODk5X3N0YXRlICpzdGF0ZSkKK3N0YXRpYyB1MzIgc3RiMDg5OV9nZXRfc3JhdGUoc3RydWN0IHN0YjA4OTlfc3RhdGUgKnN0YXRlKQogewogCXN0cnVjdCBzdGIwODk5X2ludGVybmFsICppbnRlcm5hbCA9ICZzdGF0ZS0+aW50ZXJuYWw7CiAJdTggc2ZyWzNdOwpAQCAtNzYzLDcgKzc2Myw3IEBACiAJc3RiMDg5OV93cml0ZV9zMnJlZyhzdGF0ZSwgU1RCMDg5OV9TMkRFTU9ELCBTVEIwODk5X0JBU0VfQ1NNX0NOVFJMMSwgU1RCMDg5OV9PRkYwX0NTTV9DTlRSTDEsIHJlZyk7CiB9CiAKLWxvbmcgTG9nMkludChpbnQgbnVtYmVyKQorc3RhdGljIGxvbmcgTG9nMkludChpbnQgbnVtYmVyKQogewogCWludCBpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvc3RiMDg5OV9kcnYuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9zdGIwODk5X2Rydi5jCmluZGV4IGJlZTI4ZjcuLjEwNjEzYWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9zdGIwODk5X2Rydi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9zdGIwODk5X2Rydi5jCkBAIC0xMzQsNyArMTM0LDcgQEAKIH07CiAKIC8qIERWQi1TMiBFcy9OMCBxdWFudCBpbiBkQi8xMDAgdnMgcmVhZCB2YWx1ZSAqIDEwMCovCi1zdHJ1Y3Qgc3RiMDg5OV90YWIgc3RiMDg5OV9xdWFudF90YWJbXSA9IHsKK3N0YXRpYyBzdHJ1Y3Qgc3RiMDg5OV90YWIgc3RiMDg5OV9xdWFudF90YWJbXSA9IHsKIAl7ICAgIDAsCSAgICAwIH0sCiAJeyAgICAwLAkgIDEwMCB9LAogCXsgIDYwMCwJICAyMDAgfSwKQEAgLTE3Nyw3ICsxNzcsNyBAQAogfTsKIAogLyogRFZCLVMyIEVzL04wIGVzdGltYXRlIGluIGRCLzEwMCB2cyByZWFkIHZhbHVlICovCi1zdHJ1Y3Qgc3RiMDg5OV90YWIgc3RiMDg5OV9lc3RfdGFiW10gPSB7CitzdGF0aWMgc3RydWN0IHN0YjA4OTlfdGFiIHN0YjA4OTlfZXN0X3RhYltdID0gewogCXsgICAgMCwJICAgICAwIH0sCiAJeyAgICAwLAkgICAgIDEgfSwKIAl7ICAzMDEsCSAgICAgMiB9LApAQCAtMjE3LDcgKzIxNyw3IEBACiAJeyA1NzIxLAk1MjYwMTcgfSwKIH07CiAKLWludCBfc3RiMDg5OV9yZWFkX3JlZyhzdHJ1Y3Qgc3RiMDg5OV9zdGF0ZSAqc3RhdGUsIHVuc2lnbmVkIGludCByZWcpCitzdGF0aWMgaW50IF9zdGIwODk5X3JlYWRfcmVnKHN0cnVjdCBzdGIwODk5X3N0YXRlICpzdGF0ZSwgdW5zaWduZWQgaW50IHJlZykKIHsKIAlpbnQgcmV0OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9idWRnZXQtY2kuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2J1ZGdldC1jaS5jCmluZGV4IDM1MDc0NjMuLmJjYmM1ZDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2J1ZGdldC1jaS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2J1ZGdldC1jaS5jCkBAIC0xMzM3LDcgKzEzMzcsNyBAQAogCS50dW5lcl9zZXRfcmZzaWdnYWluCT0gTlVMTAogfTsKIAotc3RydWN0IHN0YjYxMDBfY29uZmlnIHR0MzIwMF9zdGI2MTAwX2NvbmZpZyA9IHsKK3N0YXRpYyBzdHJ1Y3Qgc3RiNjEwMF9jb25maWcgdHQzMjAwX3N0YjYxMDBfY29uZmlnID0gewogCS50dW5lcl9hZGRyZXNzCT0gMHg2MCwKIAkucmVmY2xvY2sJPSAyNzAwMDAwMCwKIH07CkBAIC0xNDUwLDcgKzE0NTAsNyBAQAogCQlpZiAoYnVkZ2V0X2NpLT5idWRnZXQuZHZiX2Zyb250ZW5kKSB7CiAJCQlpZiAoZHZiX2F0dGFjaChzdGI2MTAwX2F0dGFjaCwgYnVkZ2V0X2NpLT5idWRnZXQuZHZiX2Zyb250ZW5kLCAmdHQzMjAwX3N0YjYxMDBfY29uZmlnLCAmYnVkZ2V0X2NpLT5idWRnZXQuaTJjX2FkYXApKSB7CiAJCQkJaWYgKCFkdmJfYXR0YWNoKGxuYnAyMV9hdHRhY2gsIGJ1ZGdldF9jaS0+YnVkZ2V0LmR2Yl9mcm9udGVuZCwgJmJ1ZGdldF9jaS0+YnVkZ2V0LmkyY19hZGFwLCAwLCAwKSkgewotCQkJCQlwcmludGsoIiVzOiBObyBMTkJQMjEgZm91bmQhXG4iLCBfX0ZVTkNUSU9OX18pOworCQkJCQlwcmludGsoIiVzOiBObyBMTkJQMjEgZm91bmQhXG4iLCBfX2Z1bmNfXyk7CiAJCQkJCWR2Yl9mcm9udGVuZF9kZXRhY2goYnVkZ2V0X2NpLT5idWRnZXQuZHZiX2Zyb250ZW5kKTsKIAkJCQkJYnVkZ2V0X2NpLT5idWRnZXQuZHZiX2Zyb250ZW5kID0gTlVMTDsKIAkJCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2NhZmVfY2NpYy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jYWZlX2NjaWMuYwppbmRleCAzNGEzOWQyLi40NmZkNTczIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2NhZmVfY2NpYy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY2FmZV9jY2ljLmMKQEAgLTU2OSw3ICs1NjksNiBAQAogCiAJY2FmZV9zbWJ1c19lbmFibGVfaXJxKGNhbSk7CiAJYWRhcC0+aWQgPSBJMkNfSFdfU01CVVNfQ0FGRTsKLQlhZGFwLT5jbGFzcyA9IEkyQ19DTEFTU19DQU1fRElHSVRBTDsKIAlhZGFwLT5vd25lciA9IFRISVNfTU9EVUxFOwogCWFkYXAtPmNsaWVudF9yZWdpc3RlciA9IGNhZmVfc21idXNfYXR0YWNoOwogCWFkYXAtPmNsaWVudF91bnJlZ2lzdGVyID0gY2FmZV9zbWJ1c19kZXRhY2g7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvS2NvbmZpZyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9LY29uZmlnCmluZGV4IGIwZjgzNzUuLjJkMjUwYTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9LY29uZmlnCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9LY29uZmlnCkBAIC02OSw2ICs2OSwxMSBAQAogCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCiAJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgY3g4OC1kdmIuCiAKK2NvbmZpZyBWSURFT19DWDg4X01QRUcKKwl0cmlzdGF0ZQorCWRlcGVuZHMgb24gVklERU9fQ1g4OF9EVkIgfHwgVklERU9fQ1g4OF9CTEFDS0JJUkQKKwlkZWZhdWx0IHkKKwogY29uZmlnIFZJREVPX0NYODhfVlAzMDU0CiAJdHJpc3RhdGUgIlZQLTMwNTQgU2Vjb25kYXJ5IEkyQyBCdXMgU3VwcG9ydCIKIAlkZWZhdWx0IG0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9NYWtlZmlsZSBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9NYWtlZmlsZQppbmRleCA2ZWMzMGYyLi5iMDZiMTI3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L01ha2VmaWxlCkBAIC0zLDcgKzMsOCBAQAogY3g4ODAwLW9ianMJOj0gY3g4OC12aWRlby5vIGN4ODgtdmJpLm8KIGN4ODgwMi1vYmpzCTo9IGN4ODgtbXBlZy5vCiAKLW9iai0kKENPTkZJR19WSURFT19DWDg4KSArPSBjeDg4eHgubyBjeDg4MDAubyBjeDg4MDIubworb2JqLSQoQ09ORklHX1ZJREVPX0NYODgpICs9IGN4ODh4eC5vIGN4ODgwMC5vCitvYmotJChDT05GSUdfVklERU9fQ1g4OF9NUEVHKSArPSBjeDg4MDIubwogb2JqLSQoQ09ORklHX1ZJREVPX0NYODhfQUxTQSkgKz0gY3g4OC1hbHNhLm8KIG9iai0kKENPTkZJR19WSURFT19DWDg4X0JMQUNLQklSRCkgKz0gY3g4OC1ibGFja2JpcmQubwogb2JqLSQoQ09ORklHX1ZJREVPX0NYODhfRFZCKSArPSBjeDg4LWR2Yi5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1kdmIuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LWR2Yi5jCmluZGV4IGRhNGRkNDkuLjYxM2RmZWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LWR2Yi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LWR2Yi5jCkBAIC0xMzgsNiArMTM4LDI4IEBACiAJcmV0dXJuIHJldDsKIH0KIAorc3RhdGljIHZvaWQgY3g4OF9kdmJfZ2F0ZV9jdHJsKHN0cnVjdCBjeDg4X2NvcmUgICpjb3JlLCBpbnQgb3BlbikKK3sKKwlzdHJ1Y3QgdmlkZW9idWZfZHZiX2Zyb250ZW5kcyAqZjsKKwlzdHJ1Y3QgdmlkZW9idWZfZHZiX2Zyb250ZW5kICpmZTsKKworCWlmICghY29yZS0+ZHZiZGV2KQorCQlyZXR1cm47CisKKwlmID0gJmNvcmUtPmR2YmRldi0+ZnJvbnRlbmRzOworCisJaWYgKCFmKQorCQlyZXR1cm47CisKKwlpZiAoZi0+Z2F0ZSA8PSAxKSAvKiB1bmRlZmluZWQgb3IgZmUwICovCisJCWZlID0gdmlkZW9idWZfZHZiX2dldF9mcm9udGVuZChmLCAxKTsKKwllbHNlCisJCWZlID0gdmlkZW9idWZfZHZiX2dldF9mcm9udGVuZChmLCBmLT5nYXRlKTsKKworCWlmIChmZSAmJiBmZS0+ZHZiLmZyb250ZW5kICYmIGZlLT5kdmIuZnJvbnRlbmQtPm9wcy5pMmNfZ2F0ZV9jdHJsKQorCQlmZS0+ZHZiLmZyb250ZW5kLT5vcHMuaTJjX2dhdGVfY3RybChmZS0+ZHZiLmZyb250ZW5kLCBvcGVuKTsKK30KKwogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKIHN0YXRpYyBpbnQgZHZpY29fZnVzaW9uaGR0dl9kZW1vZF9pbml0KHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlKQpAQCAtNTk3LDEyICs2MTksMzAgQEAKIAlzdHJ1Y3QgY3g4OF9jb3JlICpjb3JlID0gZGV2LT5jb3JlOwogCXN0cnVjdCB2aWRlb2J1Zl9kdmJfZnJvbnRlbmQgKmZlMCwgKmZlMSA9IE5VTEw7CiAJaW50IG1mZV9zaGFyZWQgPSAwOyAvKiBidXMgbm90IHNoYXJlZCBieSBkZWZhdWx0ICovCisJaW50IGk7CiAKIAlpZiAoMCAhPSBjb3JlLT5pMmNfcmMpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICIlcy8yOiBubyBpMmMtYnVzIGF2YWlsYWJsZSwgY2Fubm90IGF0dGFjaCBkdmIgZHJpdmVyc1xuIiwgY29yZS0+bmFtZSk7CiAJCWdvdG8gZnJvbnRlbmRfZGV0YWNoOwogCX0KIAorCWlmICghY29yZS0+Ym9hcmQubnVtX2Zyb250ZW5kcykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltdXRleF9pbml0KCZkZXYtPmZyb250ZW5kcy5sb2NrKTsKKwlJTklUX0xJU1RfSEVBRCgmZGV2LT5mcm9udGVuZHMuZmVsaXN0KTsKKworCXByaW50ayhLRVJOX0lORk8gIiVzKCkgYWxsb2NhdGluZyAlZCBmcm9udGVuZChzKVxuIiwgX19mdW5jX18sCisJCQkgY29yZS0+Ym9hcmQubnVtX2Zyb250ZW5kcyk7CisJZm9yIChpID0gMTsgaSA8PSBjb3JlLT5ib2FyZC5udW1fZnJvbnRlbmRzOyBpKyspIHsKKwkJZmUwID0gdmlkZW9idWZfZHZiX2FsbG9jX2Zyb250ZW5kKCZkZXYtPmZyb250ZW5kcywgaSk7CisJCWlmICghZmUwKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzKCkgZmFpbGVkIHRvIGFsbG9jXG4iLCBfX2Z1bmNfXyk7CisJCQl2aWRlb2J1Zl9kdmJfZGVhbGxvY19mcm9udGVuZHMoJmRldi0+ZnJvbnRlbmRzKTsKKwkJCWdvdG8gZnJvbnRlbmRfZGV0YWNoOworCQl9CisJfQorCiAJLyogR2V0IHRoZSBmaXJzdCBmcm9udGVuZCAqLwogCWZlMCA9IHZpZGVvYnVmX2R2Yl9nZXRfZnJvbnRlbmQoJmRldi0+ZnJvbnRlbmRzLCAxKTsKIAlpZiAoIWZlMCkKQEAgLTYxMSw2ICs2NTEsOSBAQAogCS8qIG11bHRpLWZyb250ZW5kIGdhdGUgY29udHJvbCBpcyB1bmRlZmluZWQgb3IgZGVmYXVsdHMgdG8gZmUwICovCiAJZGV2LT5mcm9udGVuZHMuZ2F0ZSA9IDA7CiAKKwkvKiBTZXRzIHRoZSBnYXRlIGNvbnRyb2wgY2FsbGJhY2sgdG8gYmUgdXNlZCBieSBpMmMgY29tbWFuZCBjYWxscyAqLworCWNvcmUtPmdhdGVfY3RybCA9IGN4ODhfZHZiX2dhdGVfY3RybDsKKwogCS8qIGluaXQgZnJvbnRlbmQocykgKi8KIAlzd2l0Y2ggKGNvcmUtPmJvYXJkbnIpIHsKIAljYXNlIENYODhfQk9BUkRfSEFVUFBBVUdFX0RWQl9UMToKQEAgLTExMDksNiArMTE1Miw3IEBACiAJCSZkZXYtPnBjaS0+ZGV2LCBhZGFwdGVyX25yLCBtZmVfc2hhcmVkKTsKIAogZnJvbnRlbmRfZGV0YWNoOgorCWNvcmUtPmdhdGVfY3RybCA9IE5VTEw7CiAJdmlkZW9idWZfZHZiX2RlYWxsb2NfZnJvbnRlbmRzKCZkZXYtPmZyb250ZW5kcyk7CiAJcmV0dXJuIC1FSU5WQUw7CiB9CkBAIC0xMjcwLDYgKzEzMTQsOCBAQAogCiAJdnAzMDU0X2kyY19yZW1vdmUoZGV2KTsKIAorCWNvcmUtPmdhdGVfY3RybCA9IE5VTEw7CisKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtaTJjLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1pMmMuYwppbmRleCAxYWI2OTFkLi5jMGZmMjMwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1pMmMuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1pMmMuYwpAQCAtMTE2LDMwICsxMTYsMTYgQEAKIAogdm9pZCBjeDg4X2NhbGxfaTJjX2NsaWVudHMoc3RydWN0IGN4ODhfY29yZSAqY29yZSwgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKQogewotI2lmIGRlZmluZWQoQ09ORklHX1ZJREVPX0NYODhfRFZCKSB8fCBkZWZpbmVkKENPTkZJR19WSURFT19DWDg4X0RWQl9NT0RVTEUpCi0Jc3RydWN0IHZpZGVvYnVmX2R2Yl9mcm9udGVuZHMgKmYgPSAmY29yZS0+ZHZiZGV2LT5mcm9udGVuZHM7Ci0Jc3RydWN0IHZpZGVvYnVmX2R2Yl9mcm9udGVuZCAqZmUgPSBOVUxMOwotI2VuZGlmCiAJaWYgKDAgIT0gY29yZS0+aTJjX3JjKQogCQlyZXR1cm47CiAKLSNpZiBkZWZpbmVkKENPTkZJR19WSURFT19DWDg4X0RWQikgfHwgZGVmaW5lZChDT05GSUdfVklERU9fQ1g4OF9EVkJfTU9EVUxFKQotCWlmIChjb3JlLT5kdmJkZXYgJiYgZikgewotCQlpZihmLT5nYXRlIDw9IDEpIC8qIHVuZGVmaW5lZCBvciBmZTAgKi8KLQkJCWZlID0gdmlkZW9idWZfZHZiX2dldF9mcm9udGVuZChmLCAxKTsKLQkJZWxzZQotCQkJZmUgPSB2aWRlb2J1Zl9kdmJfZ2V0X2Zyb250ZW5kKGYsIGYtPmdhdGUpOworCWlmIChjb3JlLT5nYXRlX2N0cmwpCisJCWNvcmUtPmdhdGVfY3RybChjb3JlLCAxKTsKIAotCQlpZiAoZmUgJiYgZmUtPmR2Yi5mcm9udGVuZCAmJiBmZS0+ZHZiLmZyb250ZW5kLT5vcHMuaTJjX2dhdGVfY3RybCkKLQkJCWZlLT5kdmIuZnJvbnRlbmQtPm9wcy5pMmNfZ2F0ZV9jdHJsKGZlLT5kdmIuZnJvbnRlbmQsIDEpOworCWkyY19jbGllbnRzX2NvbW1hbmQoJmNvcmUtPmkyY19hZGFwLCBjbWQsIGFyZyk7CiAKLQkJaTJjX2NsaWVudHNfY29tbWFuZCgmY29yZS0+aTJjX2FkYXAsIGNtZCwgYXJnKTsKLQotCQlpZiAoZmUgJiYgZmUtPmR2Yi5mcm9udGVuZCAmJiBmZS0+ZHZiLmZyb250ZW5kLT5vcHMuaTJjX2dhdGVfY3RybCkKLQkJCWZlLT5kdmIuZnJvbnRlbmQtPm9wcy5pMmNfZ2F0ZV9jdHJsKGZlLT5kdmIuZnJvbnRlbmQsIDApOwotCX0gZWxzZQotI2VuZGlmCi0JCWkyY19jbGllbnRzX2NvbW1hbmQoJmNvcmUtPmkyY19hZGFwLCBjbWQsIGFyZyk7CisJaWYgKGNvcmUtPmdhdGVfY3RybCkKKwkJY29yZS0+Z2F0ZV9jdHJsKGNvcmUsIDApOwogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19hbGdvX2JpdF9kYXRhIGN4ODgwMF9pMmNfYWxnb190ZW1wbGF0ZSA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LW1wZWcuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LW1wZWcuYwppbmRleCA1OTE2NGZjLi5iMjk1Yjc2IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1tcGVnLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtbXBlZy5jCkBAIC03ODcsNiArNzg3LDkgQEAKIAlkZXYtPnBjaSA9IHBjaV9kZXY7CiAJZGV2LT5jb3JlID0gY29yZTsKIAorCS8qIE1haW50YWluIGEgcmVmZXJlbmNlIHNvIGN4ODgtdmlkZW8gY2FuIHF1ZXJ5IHRoZSA4ODAyIGRldmljZS4gKi8KKwljb3JlLT5kdmJkZXYgPSBkZXY7CisKIAllcnIgPSBjeDg4MDJfaW5pdF9jb21tb24oZGV2KTsKIAlpZiAoZXJyICE9IDApCiAJCWdvdG8gZmFpbF9mcmVlOwpAQCAtNzk0LDMyICs3OTcsNiBAQAogCUlOSVRfTElTVF9IRUFEKCZkZXYtPmRydmxpc3QpOwogCWxpc3RfYWRkX3RhaWwoJmRldi0+ZGV2bGlzdCwmY3g4ODAyX2Rldmxpc3QpOwogCi0jaWYgZGVmaW5lZChDT05GSUdfVklERU9fQ1g4OF9EVkIpIHx8IGRlZmluZWQoQ09ORklHX1ZJREVPX0NYODhfRFZCX01PRFVMRSkKLQltdXRleF9pbml0KCZkZXYtPmZyb250ZW5kcy5sb2NrKTsKLQlJTklUX0xJU1RfSEVBRCgmZGV2LT5mcm9udGVuZHMuZmVsaXN0KTsKLQotCWlmIChjb3JlLT5ib2FyZC5udW1fZnJvbnRlbmRzKSB7Ci0JCXN0cnVjdCB2aWRlb2J1Zl9kdmJfZnJvbnRlbmQgKmZlOwotCQlpbnQgaTsKLQotCQlwcmludGsoS0VSTl9JTkZPICIlcygpIGFsbG9jYXRpbmcgJWQgZnJvbnRlbmQocylcbiIsIF9fZnVuY19fLAotCQkJY29yZS0+Ym9hcmQubnVtX2Zyb250ZW5kcyk7Ci0JCWZvciAoaSA9IDE7IGkgPD0gY29yZS0+Ym9hcmQubnVtX2Zyb250ZW5kczsgaSsrKSB7Ci0JCQlmZSA9IHZpZGVvYnVmX2R2Yl9hbGxvY19mcm9udGVuZCgmZGV2LT5mcm9udGVuZHMsIGkpOwotCQkJaWYoZmUgPT0gTlVMTCkgewotCQkJCXByaW50ayhLRVJOX0VSUiAiJXMoKSBmYWlsZWQgdG8gYWxsb2NcbiIsCi0JCQkJCV9fZnVuY19fKTsKLQkJCQl2aWRlb2J1Zl9kdmJfZGVhbGxvY19mcm9udGVuZHMoJmRldi0+ZnJvbnRlbmRzKTsKLQkJCQllcnIgPSAtRU5PTUVNOwotCQkJCWdvdG8gZmFpbF9mcmVlOwotCQkJfQotCQl9Ci0JfQotI2VuZGlmCi0KLQkvKiBNYWludGFpbiBhIHJlZmVyZW5jZSBzbyBjeDg4LXZpZGVvIGNhbiBxdWVyeSB0aGUgODgwMiBkZXZpY2UuICovCi0JY29yZS0+ZHZiZGV2ID0gZGV2OwotCiAJLyogbm93IGF1dG9sb2FkIGN4ODgtZHZiIG9yIGN4ODgtYmxhY2tiaXJkICovCiAJcmVxdWVzdF9tb2R1bGVzKGRldik7CiAJcmV0dXJuIDA7CkBAIC04MjcsNiArODA0LDcgQEAKICBmYWlsX2ZyZWU6CiAJa2ZyZWUoZGV2KTsKICBmYWlsX2NvcmU6CisJY29yZS0+ZHZiZGV2ID0gTlVMTDsKIAljeDg4X2NvcmVfcHV0KGNvcmUscGNpX2Rldik7CiAJcmV0dXJuIGVycjsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC5oCmluZGV4IGViOWNlMzAuLjYwYThiMzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LmgKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODguaApAQCAtMzAyLDYgKzMwMiw3IEBACiAJc3RydWN0IGJ0Y3hfcmlzY21lbSAgICBzdG9wcGVyOwogCXUzMiAgICAgICAgICAgICAgICAgICAgY291bnQ7CiB9Oworc3RydWN0IGN4ODhfY29yZTsKIAogc3RydWN0IGN4ODhfY29yZSB7CiAJc3RydWN0IGxpc3RfaGVhZCAgICAgICAgICAgZGV2bGlzdDsKQEAgLTMzNCw3ICszMzUsOCBAQAogCiAJLyogY29uZmlnIGluZm8gLS0gZHZiICovCiAjaWYgZGVmaW5lZChDT05GSUdfVklERU9fQ1g4OF9EVkIpIHx8IGRlZmluZWQoQ09ORklHX1ZJREVPX0NYODhfRFZCX01PRFVMRSkKLQlpbnQgCQkJICAgKCpwcmV2X3NldF92b2x0YWdlKShzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgZmVfc2VjX3ZvbHRhZ2VfdCB2b2x0YWdlKTsKKwlpbnQgCQkJICAgKCpwcmV2X3NldF92b2x0YWdlKShzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgZmVfc2VjX3ZvbHRhZ2VfdCB2b2x0YWdlKTsKKwl2b2lkCQkJICAgKCpnYXRlX2N0cmwpKHN0cnVjdCBjeDg4X2NvcmUgICpjb3JlLCBpbnQgb3Blbik7CiAjZW5kaWYKIAogCS8qIHN0YXRlIGluZm8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZW0yOHh4L2VtMjh4eC1jYXJkcy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9lbTI4eHgvZW0yOHh4LWNhcmRzLmMKaW5kZXggZTc3NjY5OS4uZWY5YmYwMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9lbTI4eHgvZW0yOHh4LWNhcmRzLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9lbTI4eHgvZW0yOHh4LWNhcmRzLmMKQEAgLTE4NDIsNyArMTg0Miw3IEBACiAgKiBlbTI4eHhfaW5pdF9kZXYoKQogICogYWxsb2NhdGVzIGFuZCBpbml0cyB0aGUgZGV2aWNlIHN0cnVjdHMsIHJlZ2lzdGVycyBpMmMgYnVzIGFuZCB2NGwgZGV2aWNlCiAgKi8KLWludCBlbTI4eHhfaW5pdF9kZXYoc3RydWN0IGVtMjh4eCAqKmRldmhhbmRsZSwgc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYsCitzdGF0aWMgaW50IGVtMjh4eF9pbml0X2RldihzdHJ1Y3QgZW0yOHh4ICoqZGV2aGFuZGxlLCBzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiwKIAkJCSAgIGludCBtaW5vcikKIHsKIAlzdHJ1Y3QgZW0yOHh4ICpkZXYgPSAqZGV2aGFuZGxlOwpAQCAtMTk5MCw4ICsxOTkwLDcgQEAKIAkJaW50IGNoZWNrX2ludGVyZmFjZSA9IDE7CiAJCWlzb2NfcGlwZSA9IDE7CiAJCWVuZHBvaW50ID0gJmludGVyZmFjZS0+Y3VyX2FsdHNldHRpbmctPmVuZHBvaW50WzFdLmRlc2M7Ci0JCWlmICh1c2JfZW5kcG9pbnRfdHlwZShlbmRwb2ludCkgIT0KLQkJICAgIFVTQl9FTkRQT0lOVF9YRkVSX0lTT0MpCisJCWlmICghdXNiX2VuZHBvaW50X3hmZXJfaXNvYyhlbmRwb2ludCkpCiAJCQljaGVja19pbnRlcmZhY2UgPSAwOwogCiAJCWlmICh1c2JfZW5kcG9pbnRfZGlyX291dChlbmRwb2ludCkpCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2VtMjh4eC9lbTI4eHgtY29yZS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9lbTI4eHgvZW0yOHh4LWNvcmUuYwppbmRleCA4MTljY2VhLi5lYjVmYjA1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2VtMjh4eC9lbTI4eHgtY29yZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZW0yOHh4L2VtMjh4eC1jb3JlLmMKQEAgLTM5Myw3ICszOTMsNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0cnVjdCBlbTI4eHhfdm9sX3RhYmxlIG91dHB1dHNbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZW0yOHh4X3ZvbF90YWJsZSBvdXRwdXRzW10gPSB7CiAJeyBFTTI4WFhfQU9VVF9NQVNURVIsIEFDOTdfTUFTVEVSX1ZPTCAgICAgIH0sCiAJeyBFTTI4WFhfQU9VVF9MSU5FLCAgIEFDOTdfTElORV9MRVZFTF9WT0wgIH0sCiAJeyBFTTI4WFhfQU9VVF9NT05PLCAgIEFDOTdfTUFTVEVSX01PTk9fVk9MIH0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2VtMjh4eC9lbTI4eHgtaW5wdXQuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZW0yOHh4L2VtMjh4eC1pbnB1dC5jCmluZGV4IDQyYmJhZjYuLjA0NDNhZmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZW0yOHh4L2VtMjh4eC1pbnB1dC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZW0yOHh4L2VtMjh4eC1pbnB1dC5jCkBAIC0zMDcsNyArMzA3LDcgQEAKIAltb2RfdGltZXIoJmlyLT50aW1lciwgamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoaXItPnBvbGxpbmcpKTsKIH0KIAotdm9pZCBlbTI4eHhfaXJfc3RhcnQoc3RydWN0IGVtMjh4eF9JUiAqaXIpCitzdGF0aWMgdm9pZCBlbTI4eHhfaXJfc3RhcnQoc3RydWN0IGVtMjh4eF9JUiAqaXIpCiB7CiAJc2V0dXBfdGltZXIoJmlyLT50aW1lciwgaXJfdGltZXIsICh1bnNpZ25lZCBsb25nKWlyKTsKIAlJTklUX1dPUksoJmlyLT53b3JrLCBlbTI4eHhfaXJfd29yayk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL201NjAyL201NjAyX3M1azgzYS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9tNTYwMi9tNTYwMl9zNWs4M2EuYwppbmRleCBhZjNmMmRjLi5jY2VhNGE3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL201NjAyL201NjAyX3M1azgzYS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvbTU2MDIvbTU2MDJfczVrODNhLmMKQEAgLTExMyw3ICsxMTMsNyBAQAogCXJldHVybiAwOwogfQogCi12b2lkIHM1azgzYV9kdW1wX3JlZ2lzdGVycyhzdHJ1Y3Qgc2QgKnNkKQorc3RhdGljIHZvaWQgczVrODNhX2R1bXBfcmVnaXN0ZXJzKHN0cnVjdCBzZCAqc2QpCiB7CiAJaW50IGFkZHJlc3M7CiAJdTggcGFnZSwgb2xkX3BhZ2U7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL292NzY3MC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9vdjc2NzAuYwppbmRleCBjYTI2YjBjLi4wNWMxNGEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL292NzY3MC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vb3Y3NjcwLmMKQEAgLTEzNDcsNyArMTM0Nyw2IEBACiAJCS5uYW1lID0gIm92NzY3MCIsCiAJfSwKIAkuaWQgCQk9IEkyQ19EUklWRVJJRF9PVjc2NzAsCi0JLmNsYXNzIAkJPSBJMkNfQ0xBU1NfQ0FNX0RJR0lUQUwsCiAJLmF0dGFjaF9hZGFwdGVyID0gb3Y3NjcwX2F0dGFjaCwKIAkuZGV0YWNoX2NsaWVudAk9IG92NzY3MF9kZXRhY2gsCiAJLmNvbW1hbmQJPSBvdjc2NzBfY29tbWFuZCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vb3ZjYW1jaGlwL292Y2FtY2hpcF9jb3JlLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL292Y2FtY2hpcC9vdmNhbWNoaXBfY29yZS5jCmluZGV4IDJjNGFjYmYuLmM4NDFmNGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vb3ZjYW1jaGlwL292Y2FtY2hpcF9jb3JlLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9vdmNhbWNoaXAvb3ZjYW1jaGlwX2NvcmUuYwpAQCAtNDA1LDcgKzQwNSw2IEBACiAJCS5uYW1lID0JCSJvdmNhbWNoaXAiLAogCX0sCiAJLmlkID0JCQlJMkNfRFJJVkVSSURfT1ZDQU1DSElQLAotCS5jbGFzcyA9CQlJMkNfQ0xBU1NfQ0FNX0RJR0lUQUwsCiAJLmF0dGFjaF9hZGFwdGVyID0Jb3ZjYW1jaGlwX2F0dGFjaCwKIAkuZGV0YWNoX2NsaWVudCA9CW92Y2FtY2hpcF9kZXRhY2gsCiAJLmNvbW1hbmQgPQkJb3ZjYW1jaGlwX2NvbW1hbmQsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3B2cnVzYjIvcHZydXNiMi1oZHcuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHZydXNiMi9wdnJ1c2IyLWhkdy5jCmluZGV4IDhmYjkyYWMuLmZhMzA0ZTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHZydXNiMi9wdnJ1c2IyLWhkdy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHZydXNiMi9wdnJ1c2IyLWhkdy5jCkBAIC0zNjU1LDcgKzM2NTUsNyBAQAogCWludCByZXQ7CiAJcHZyMl90cmFjZShQVlIyX1RSQUNFX0lOSVQsIlBlcmZvcm1pbmcgYSBkZXZpY2UgcmVzZXQuLi4iKTsKIAlyZXQgPSB1c2JfbG9ja19kZXZpY2VfZm9yX3Jlc2V0KGhkdy0+dXNiX2RldixOVUxMKTsKLQlpZiAocmV0ID09IDEpIHsKKwlpZiAocmV0ID09IDApIHsKIAkJcmV0ID0gdXNiX3Jlc2V0X2RldmljZShoZHctPnVzYl9kZXYpOwogCQl1c2JfdW5sb2NrX2RldmljZShoZHctPnVzYl9kZXYpOwogCX0gZWxzZSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3B4YV9jYW1lcmEuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHhhX2NhbWVyYS5jCmluZGV4IDlkMzNkZTIuLmExZDYwMDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHhhX2NhbWVyYS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHhhX2NhbWVyYS5jCkBAIC0zNCwxMiArMzQsMTAgQEAKIAogI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Mi5oPgogCi0jaW5jbHVkZSA8YXNtL2RtYS5oPgorI2luY2x1ZGUgPG1hY2gvZG1hLmg+CiAjaW5jbHVkZSA8bWFjaC9weGEtcmVncy5oPgogI2luY2x1ZGUgPG1hY2gvY2FtZXJhLmg+CiAKLSNpbmNsdWRlICJweGFfY2FtZXJhLmgiCi0KICNkZWZpbmUgUFhBX0NBTV9WRVJTSU9OX0NPREUgS0VSTkVMX1ZFUlNJT04oMCwgMCwgNSkKICNkZWZpbmUgUFhBX0NBTV9EUlZfTkFNRSAicHhhMjd4LWNhbWVyYSIKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9weGFfY2FtZXJhLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3B4YV9jYW1lcmEuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODljYmZjOS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3B4YV9jYW1lcmEuaAorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8qIENhbWVyYSBJbnRlcmZhY2UgKi8KLSNkZWZpbmUgQ0lDUjAJCV9fUkVHKDB4NTAwMDAwMDApCi0jZGVmaW5lIENJQ1IxCQlfX1JFRygweDUwMDAwMDA0KQotI2RlZmluZSBDSUNSMgkJX19SRUcoMHg1MDAwMDAwOCkKLSNkZWZpbmUgQ0lDUjMJCV9fUkVHKDB4NTAwMDAwMEMpCi0jZGVmaW5lIENJQ1I0CQlfX1JFRygweDUwMDAwMDEwKQotI2RlZmluZSBDSVNSCQlfX1JFRygweDUwMDAwMDE0KQotI2RlZmluZSBDSUZSCQlfX1JFRygweDUwMDAwMDE4KQotI2RlZmluZSBDSVRPUgkJX19SRUcoMHg1MDAwMDAxQykKLSNkZWZpbmUgQ0lCUjAJCV9fUkVHKDB4NTAwMDAwMjgpCi0jZGVmaW5lIENJQlIxCQlfX1JFRygweDUwMDAwMDMwKQotI2RlZmluZSBDSUJSMgkJX19SRUcoMHg1MDAwMDAzOCkKLQotI2RlZmluZSBDSUNSMF9ETUFFTgkoMSA8PCAzMSkJLyogRE1BIHJlcXVlc3QgZW5hYmxlICovCi0jZGVmaW5lIENJQ1IwX1BBUl9FTgkoMSA8PCAzMCkJLyogUGFyaXR5IGVuYWJsZSAqLwotI2RlZmluZSBDSUNSMF9TTF9DQVBfRU4JKDEgPDwgMjkpCS8qIENhcHR1cmUgZW5hYmxlIGZvciBzbGF2ZSBtb2RlICovCi0jZGVmaW5lIENJQ1IwX0VOQgkoMSA8PCAyOCkJLyogQ2FtZXJhIGludGVyZmFjZSBlbmFibGUgKi8KLSNkZWZpbmUgQ0lDUjBfRElTCSgxIDw8IDI3KQkvKiBDYW1lcmEgaW50ZXJmYWNlIGRpc2FibGUgKi8KLSNkZWZpbmUgQ0lDUjBfU0lNCSgweDcgPDwgMjQpCS8qIFNlbnNvciBpbnRlcmZhY2UgbW9kZSBtYXNrICovCi0jZGVmaW5lIENJQ1IwX1RPTQkoMSA8PCA5KQkvKiBUaW1lLW91dCBtYXNrICovCi0jZGVmaW5lIENJQ1IwX1JEQVZNCSgxIDw8IDgpCS8qIFJlY2VpdmUtZGF0YS1hdmFpbGFibGUgbWFzayAqLwotI2RlZmluZSBDSUNSMF9GRU0JKDEgPDwgNykJLyogRklGTy1lbXB0eSBtYXNrICovCi0jZGVmaW5lIENJQ1IwX0VPTE0JKDEgPDwgNikJLyogRW5kLW9mLWxpbmUgbWFzayAqLwotI2RlZmluZSBDSUNSMF9QRVJSTQkoMSA8PCA1KQkvKiBQYXJpdHktZXJyb3IgbWFzayAqLwotI2RlZmluZSBDSUNSMF9RRE0JKDEgPDwgNCkJLyogUXVpY2stZGlzYWJsZSBtYXNrICovCi0jZGVmaW5lIENJQ1IwX0NETQkoMSA8PCAzKQkvKiBEaXNhYmxlLWRvbmUgbWFzayAqLwotI2RlZmluZSBDSUNSMF9TT0ZNCSgxIDw8IDIpCS8qIFN0YXJ0LW9mLWZyYW1lIG1hc2sgKi8KLSNkZWZpbmUgQ0lDUjBfRU9GTQkoMSA8PCAxKQkvKiBFbmQtb2YtZnJhbWUgbWFzayAqLwotI2RlZmluZSBDSUNSMF9GT00JKDEgPDwgMCkJLyogRklGTy1vdmVycnVuIG1hc2sgKi8KLQotI2RlZmluZSBDSUNSMV9UQklUCSgxIDw8IDMxKQkvKiBUcmFuc3BhcmVuY3kgYml0ICovCi0jZGVmaW5lIENJQ1IxX1JHQlRfQ09OVgkoMHgzIDw8IDI5KQkvKiBSR0JUIGNvbnZlcnNpb24gbWFzayAqLwotI2RlZmluZSBDSUNSMV9QUEwJKDB4N2ZmIDw8IDE1KQkvKiBQaXhlbHMgcGVyIGxpbmUgbWFzayAqLwotI2RlZmluZSBDSUNSMV9SR0JfQ09OVgkoMHg3IDw8IDEyKQkvKiBSR0IgY29udmVyc2lvbiBtYXNrICovCi0jZGVmaW5lIENJQ1IxX1JHQl9GCSgxIDw8IDExKQkvKiBSR0IgZm9ybWF0ICovCi0jZGVmaW5lIENJQ1IxX1lDQkNSX0YJKDEgPDwgMTApCS8qIFlDYkNyIGZvcm1hdCAqLwotI2RlZmluZSBDSUNSMV9SR0JfQlBQCSgweDcgPDwgNykJLyogUkdCIGJpcyBwZXIgcGl4ZWwgbWFzayAqLwotI2RlZmluZSBDSUNSMV9SQVdfQlBQCSgweDMgPDwgNSkJLyogUmF3IGJpcyBwZXIgcGl4ZWwgbWFzayAqLwotI2RlZmluZSBDSUNSMV9DT0xPUl9TUAkoMHgzIDw8IDMpCS8qIENvbG9yIHNwYWNlIG1hc2sgKi8KLSNkZWZpbmUgQ0lDUjFfRFcJKDB4NyA8PCAwKQkvKiBEYXRhIHdpZHRoIG1hc2sgKi8KLQotI2RlZmluZSBDSUNSMl9CTFcJKDB4ZmYgPDwgMjQpCS8qIEJlZ2lubmluZy1vZi1saW5lIHBpeGVsIGNsb2NrCi0JCQkJCSAgIHdhaXQgY291bnQgbWFzayAqLwotI2RlZmluZSBDSUNSMl9FTFcJKDB4ZmYgPDwgMTYpCS8qIEVuZC1vZi1saW5lIHBpeGVsIGNsb2NrCi0JCQkJCSAgIHdhaXQgY291bnQgbWFzayAqLwotI2RlZmluZSBDSUNSMl9IU1cJKDB4M2YgPDwgMTApCS8qIEhvcml6b250YWwgc3luYyBwdWxzZSB3aWR0aCBtYXNrICovCi0jZGVmaW5lIENJQ1IyX0JGUFcJKDB4M2YgPDwgMykJLyogQmVnaW5uaW5nLW9mLWZyYW1lIHBpeGVsIGNsb2NrCi0JCQkJCSAgIHdhaXQgY291bnQgbWFzayAqLwotI2RlZmluZSBDSUNSMl9GU1cJKDB4NyA8PCAwKQkvKiBGcmFtZSBzdGFiaWxpemF0aW9uCi0JCQkJCSAgIHdhaXQgY291bnQgbWFzayAqLwotCi0jZGVmaW5lIENJQ1IzX0JGVwkoMHhmZiA8PCAyNCkJLyogQmVnaW5uaW5nLW9mLWZyYW1lIGxpbmUgY2xvY2sKLQkJCQkJICAgd2FpdCBjb3VudCBtYXNrICovCi0jZGVmaW5lIENJQ1IzX0VGVwkoMHhmZiA8PCAxNikJLyogRW5kLW9mLWZyYW1lIGxpbmUgY2xvY2sKLQkJCQkJICAgd2FpdCBjb3VudCBtYXNrICovCi0jZGVmaW5lIENJQ1IzX1ZTVwkoMHgzZiA8PCAxMCkJLyogVmVydGljYWwgc3luYyBwdWxzZSB3aWR0aCBtYXNrICovCi0jZGVmaW5lIENJQ1IzX0JGUFcJKDB4M2YgPDwgMykJLyogQmVnaW5uaW5nLW9mLWZyYW1lIHBpeGVsIGNsb2NrCi0JCQkJCSAgIHdhaXQgY291bnQgbWFzayAqLwotI2RlZmluZSBDSUNSM19MUEYJKDB4N2ZmIDw8IDApCS8qIExpbmVzIHBlciBmcmFtZSBtYXNrICovCi0KLSNkZWZpbmUgQ0lDUjRfTUNMS19ETFkJKDB4MyA8PCAyNCkJLyogTUNMSyBEYXRhIENhcHR1cmUgRGVsYXkgbWFzayAqLwotI2RlZmluZSBDSUNSNF9QQ0xLX0VOCSgxIDw8IDIzKQkvKiBQaXhlbCBjbG9jayBlbmFibGUgKi8KLSNkZWZpbmUgQ0lDUjRfUENQCSgxIDw8IDIyKQkvKiBQaXhlbCBjbG9jayBwb2xhcml0eSAqLwotI2RlZmluZSBDSUNSNF9IU1AJKDEgPDwgMjEpCS8qIEhvcml6b250YWwgc3luYyBwb2xhcml0eSAqLwotI2RlZmluZSBDSUNSNF9WU1AJKDEgPDwgMjApCS8qIFZlcnRpY2FsIHN5bmMgcG9sYXJpdHkgKi8KLSNkZWZpbmUgQ0lDUjRfTUNMS19FTgkoMSA8PCAxOSkJLyogTUNMSyBlbmFibGUgKi8KLSNkZWZpbmUgQ0lDUjRfRlJfUkFURQkoMHg3IDw8IDgpCS8qIEZyYW1lIHJhdGUgbWFzayAqLwotI2RlZmluZSBDSUNSNF9ESVYJKDB4ZmYgPDwgMCkJLyogQ2xvY2sgZGl2aXNvciBtYXNrICovCi0KLSNkZWZpbmUgQ0lTUl9GVE8JKDEgPDwgMTUpCS8qIEZJRk8gdGltZS1vdXQgKi8KLSNkZWZpbmUgQ0lTUl9SREFWXzIJKDEgPDwgMTQpCS8qIENoYW5uZWwgMiByZWNlaXZlIGRhdGEgYXZhaWxhYmxlICovCi0jZGVmaW5lIENJU1JfUkRBVl8xCSgxIDw8IDEzKQkvKiBDaGFubmVsIDEgcmVjZWl2ZSBkYXRhIGF2YWlsYWJsZSAqLwotI2RlZmluZSBDSVNSX1JEQVZfMAkoMSA8PCAxMikJLyogQ2hhbm5lbCAwIHJlY2VpdmUgZGF0YSBhdmFpbGFibGUgKi8KLSNkZWZpbmUgQ0lTUl9GRU1QVFlfMgkoMSA8PCAxMSkJLyogQ2hhbm5lbCAyIEZJRk8gZW1wdHkgKi8KLSNkZWZpbmUgQ0lTUl9GRU1QVFlfMQkoMSA8PCAxMCkJLyogQ2hhbm5lbCAxIEZJRk8gZW1wdHkgKi8KLSNkZWZpbmUgQ0lTUl9GRU1QVFlfMAkoMSA8PCA5KQkvKiBDaGFubmVsIDAgRklGTyBlbXB0eSAqLwotI2RlZmluZSBDSVNSX0VPTAkoMSA8PCA4KQkvKiBFbmQgb2YgbGluZSAqLwotI2RlZmluZSBDSVNSX1BBUl9FUlIJKDEgPDwgNykJLyogUGFyaXR5IGVycm9yICovCi0jZGVmaW5lIENJU1JfQ1FECSgxIDw8IDYpCS8qIENhbWVyYSBpbnRlcmZhY2UgcXVpY2sgZGlzYWJsZSAqLwotI2RlZmluZSBDSVNSX0NERAkoMSA8PCA1KQkvKiBDYW1lcmEgaW50ZXJmYWNlIGRpc2FibGUgZG9uZSAqLwotI2RlZmluZSBDSVNSX1NPRgkoMSA8PCA0KQkvKiBTdGFydCBvZiBmcmFtZSAqLwotI2RlZmluZSBDSVNSX0VPRgkoMSA8PCAzKQkvKiBFbmQgb2YgZnJhbWUgKi8KLSNkZWZpbmUgQ0lTUl9JRk9fMgkoMSA8PCAyKQkvKiBGSUZPIG92ZXJydW4gZm9yIENoYW5uZWwgMiAqLwotI2RlZmluZSBDSVNSX0lGT18xCSgxIDw8IDEpCS8qIEZJRk8gb3ZlcnJ1biBmb3IgQ2hhbm5lbCAxICovCi0jZGVmaW5lIENJU1JfSUZPXzAJKDEgPDwgMCkJLyogRklGTyBvdmVycnVuIGZvciBDaGFubmVsIDAgKi8KLQotI2RlZmluZSBDSUZSX0ZMVkwyCSgweDdmIDw8IDIzKQkvKiBGSUZPIDIgbGV2ZWwgbWFzayAqLwotI2RlZmluZSBDSUZSX0ZMVkwxCSgweDdmIDw8IDE2KQkvKiBGSUZPIDEgbGV2ZWwgbWFzayAqLwotI2RlZmluZSBDSUZSX0ZMVkwwCSgweGZmIDw8IDgpCS8qIEZJRk8gMCBsZXZlbCBtYXNrICovCi0jZGVmaW5lIENJRlJfVEhMXzAJKDB4MyA8PCA0KQkvKiBUaHJlc2hvbGQgTGV2ZWwgZm9yIENoYW5uZWwgMCBGSUZPICovCi0jZGVmaW5lIENJRlJfUkVTRVRfRgkoMSA8PCAzKQkvKiBSZXNldCBpbnB1dCBGSUZPcyAqLwotI2RlZmluZSBDSUZSX0ZFTjIJKDEgPDwgMikJLyogRklGTyBlbmFibGUgZm9yIGNoYW5uZWwgMiAqLwotI2RlZmluZSBDSUZSX0ZFTjEJKDEgPDwgMSkJLyogRklGTyBlbmFibGUgZm9yIGNoYW5uZWwgMSAqLwotI2RlZmluZSBDSUZSX0ZFTjAJKDEgPDwgMCkJLyogRklGTyBlbmFibGUgZm9yIGNoYW5uZWwgMCAqLwotCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3VzYnZpZGVvL2libWNhbS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby91c2J2aWRlby9pYm1jYW0uYwppbmRleCBmOGQ4NWRkLi5iMDg1NDk2IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3VzYnZpZGVvL2libWNhbS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXNidmlkZW8vaWJtY2FtLmMKQEAgLTM3NzksNyArMzc3OSw3IEBACiAJCQllcnIoIkFsdGVybmF0ZSBzZXR0aW5ncyBoYXZlIGRpZmZlcmVudCBlbmRwb2ludCBhZGRyZXNzZXMhIik7CiAJCQlyZXR1cm4gLUVOT0RFVjsKIAkJfQotCQlpZiAodXNiX2VuZHBvaW50X3R5cGUoZW5kcG9pbnQpICE9IFVTQl9FTkRQT0lOVF9YRkVSX0lTT0MpIHsKKwkJaWYgKCF1c2JfZW5kcG9pbnRfeGZlcl9pc29jKGVuZHBvaW50KSkgewogCQkJZXJyKCJJbnRlcmZhY2UgJWQuIGhhcyBub24tSVNPIGVuZHBvaW50ISIsIGlmbnVtKTsKIAkJCXJldHVybiAtRU5PREVWOwogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3VzYnZpZGVvL2tvbmljYXdjLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3VzYnZpZGVvL2tvbmljYXdjLmMKaW5kZXggOTBmMGNlNi4uOTAwZWMyMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby91c2J2aWRlby9rb25pY2F3Yy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXNidmlkZW8va29uaWNhd2MuYwpAQCAtODIzLDcgKzgyMyw3IEBACiAJCQllcnIoIkFsdGVybmF0ZSBzZXR0aW5ncyBoYXZlIGRpZmZlcmVudCBlbmRwb2ludCBhZGRyZXNzZXMhIik7CiAJCQlyZXR1cm4gLUVOT0RFVjsKIAkJfQotCQlpZiAodXNiX2VuZHBvaW50X3R5cGUoZW5kcG9pbnQpICE9IFVTQl9FTkRQT0lOVF9YRkVSX0lTT0MpIHsKKwkJaWYgKCF1c2JfZW5kcG9pbnRfeGZlcl9pc29jKGVuZHBvaW50KSkgewogCQkJZXJyKCJJbnRlcmZhY2UgJWQuIGhhcyBub24tSVNPIGVuZHBvaW50ISIsCiAJCQkgICAgaW50ZXJmYWNlLT5kZXNjLmJJbnRlcmZhY2VOdW1iZXIpOwogCQkJcmV0dXJuIC1FTk9ERVY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3VzYnZpZGVvL3VsdHJhY2FtLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3VzYnZpZGVvL3VsdHJhY2FtLmMKaW5kZXggODM5YTA4Mi4uZmJkMWI2MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby91c2J2aWRlby91bHRyYWNhbS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXNidmlkZW8vdWx0cmFjYW0uYwpAQCAtNTU2LDcgKzU1Niw3IEBACiAJCQllcnIoIkFsdGVybmF0ZSBzZXR0aW5ncyBoYXZlIGRpZmZlcmVudCBlbmRwb2ludCBhZGRyZXNzZXMhIik7CiAJCQlyZXR1cm4gLUVOT0RFVjsKIAkJfQotCQlpZiAodXNiX2VuZHBvaW50X3R5cGUoZW5kcG9pbnQpICE9IFVTQl9FTkRQT0lOVF9YRkVSX0lTT0MpIHsKKwkJaWYgKCF1c2JfZW5kcG9pbnRfeGZlcl9pc29jKGVuZHBvaW50KSkgewogCQkJZXJyKCJJbnRlcmZhY2UgJWQuIGhhcyBub24tSVNPIGVuZHBvaW50ISIsCiAJCQkgICAgaW50ZXJmYWNlLT5kZXNjLmJJbnRlcmZhY2VOdW1iZXIpOwogCQkJcmV0dXJuIC1FTk9ERVY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3VzYnZpc2lvbi91c2J2aXNpb24tdmlkZW8uYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXNidmlzaW9uL3VzYnZpc2lvbi12aWRlby5jCmluZGV4IDJiZTVlNDcuLjI2MjJkZTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXNidmlzaW9uL3VzYnZpc2lvbi12aWRlby5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXNidmlzaW9uL3VzYnZpc2lvbi12aWRlby5jCkBAIC0xNjc0LDggKzE2NzQsNyBAQAogCQlpbnRlcmZhY2UgPSAmZGV2LT5hY3Rjb25maWctPmludGVyZmFjZVtpZm51bV0tPmFsdHNldHRpbmdbMF07CiAJfQogCWVuZHBvaW50ID0gJmludGVyZmFjZS0+ZW5kcG9pbnRbMV0uZGVzYzsKLQlpZiAodXNiX2VuZHBvaW50X3R5cGUoZW5kcG9pbnQpICE9Ci0JICAgIFVTQl9FTkRQT0lOVF9YRkVSX0lTT0MpIHsKKwlpZiAoIXVzYl9lbmRwb2ludF94ZmVyX2lzb2MoZW5kcG9pbnQpKSB7CiAJCWVycigiJXM6IGludGVyZmFjZSAlZC4gaGFzIG5vbi1JU08gZW5kcG9pbnQhIiwKIAkJICAgIF9fZnVuY19fLCBpZm51bSk7CiAJCWVycigiJXM6IEVuZHBvaW50IGF0dHJpYnV0ZXMgJWQiLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby92NGwyLWRldmljZS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby92NGwyLWRldmljZS5jCmluZGV4IDllZWZkZTAuLmNmOWQ0YzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdjRsMi1kZXZpY2UuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3Y0bDItZGV2aWNlLmMKQEAgLTI5LDcgKzI5LDcgQEAKIAlpZiAoZGV2ID09IE5VTEwgfHwgdjRsMl9kZXYgPT0gTlVMTCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAJLyogV2FybiBpZiB3ZSBhcHBhcmVudGx5IHJlLXJlZ2lzdGVyIGEgZGV2aWNlICovCi0JV0FSTl9PTihkZXZfZ2V0X2RydmRhdGEoZGV2KSk7CisJV0FSTl9PTihkZXZfZ2V0X2RydmRhdGEoZGV2KSAhPSBOVUxMKTsKIAlJTklUX0xJU1RfSEVBRCgmdjRsMl9kZXYtPnN1YmRldnMpOwogCXNwaW5fbG9ja19pbml0KCZ2NGwyX2Rldi0+bG9jayk7CiAJdjRsMl9kZXYtPmRldiA9IGRldjsKQEAgLTYxLDcgKzYxLDcgQEAKIAlpZiAoZGV2ID09IE5VTEwgfHwgc2QgPT0gTlVMTCB8fCAhc2QtPm5hbWVbMF0pCiAJCXJldHVybiAtRUlOVkFMOwogCS8qIFdhcm4gaWYgd2UgYXBwYXJlbnRseSByZS1yZWdpc3RlciBhIHN1YmRldiAqLwotCVdBUk5fT04oc2QtPmRldik7CisJV0FSTl9PTihzZC0+ZGV2ICE9IE5VTEwpOwogCWlmICghdHJ5X21vZHVsZV9nZXQoc2QtPm93bmVyKSkKIAkJcmV0dXJuIC1FTk9ERVY7CiAJc2QtPmRldiA9IGRldjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdmlkZW9idWYtZG1hLXNnLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3ZpZGVvYnVmLWRtYS1zZy5jCmluZGV4IGJjNmQ1YWIuLmRhMTc5MGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdmlkZW9idWYtZG1hLXNnLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby92aWRlb2J1Zi1kbWEtc2cuYwpAQCAtMzg4LDggKzM4OCw3IEBACiAJcGFnZSA9IGFsbG9jX3BhZ2UoR0ZQX1VTRVIgfCBfX0dGUF9ETUEzMik7CiAJaWYgKCFwYWdlKQogCQlyZXR1cm4gVk1fRkFVTFRfT09NOwotCWNsZWFyX3VzZXJfcGFnZShwYWdlX2FkZHJlc3MocGFnZSksICh1bnNpZ25lZCBsb25nKXZtZi0+dmlydHVhbF9hZGRyZXNzLAotCQkJcGFnZSk7CisJY2xlYXJfdXNlcl9oaWdocGFnZShwYWdlLCAodW5zaWduZWQgbG9uZyl2bWYtPnZpcnR1YWxfYWRkcmVzcyk7CiAJdm1mLT5wYWdlID0gcGFnZTsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdzk5NjhjZi5jIGIvZHJpdmVycy9tZWRpYS92aWRlby93OTk2OGNmLmMKaW5kZXggYTM5OTdiNy4uMTA1YTgzMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby93OTk2OGNmLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby93OTk2OGNmLmMKQEAgLTE1NTMsNyArMTU1Myw2IEBACiAKIAlzdGF0aWMgc3RydWN0IGkyY19hZGFwdGVyIGFkYXAgPSB7CiAJCS5pZCA9ICAgICAgICAgICAgICAgIEkyQ19IV19TTUJVU19XOTk2OENGLAotCQkuY2xhc3MgPSAgICAgICAgICAgICBJMkNfQ0xBU1NfQ0FNX0RJR0lUQUwsCiAJCS5vd25lciA9ICAgICAgICAgICAgIFRISVNfTU9EVUxFLAogCQkuY2xpZW50X3JlZ2lzdGVyID0gICB3OTk2OGNmX2kyY19hdHRhY2hfaW5mb3JtLAogCQkuY2xpZW50X3VucmVnaXN0ZXIgPSB3OTk2OGNmX2kyY19kZXRhY2hfaW5mb3JtLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZW1zdGljay9jb3JlL21zcHJvX2Jsb2NrLmMgYi9kcml2ZXJzL21lbXN0aWNrL2NvcmUvbXNwcm9fYmxvY2suYwppbmRleCAxZjFlMzk4Li5kZTE0M2RlIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lbXN0aWNrL2NvcmUvbXNwcm9fYmxvY2suYworKysgYi9kcml2ZXJzL21lbXN0aWNrL2NvcmUvbXNwcm9fYmxvY2suYwpAQCAtNTIsMTQgKzUyLDE0IEBACiB9OwogCiBzdHJ1Y3QgbXNwcm9fYXR0cl9lbnRyeSB7Ci0JdW5zaWduZWQgaW50ICBhZGRyZXNzOwotCXVuc2lnbmVkIGludCAgc2l6ZTsKKwlfX2JlMzIgYWRkcmVzczsKKwlfX2JlMzIgc2l6ZTsKIAl1bnNpZ25lZCBjaGFyIGlkOwogCXVuc2lnbmVkIGNoYXIgcmVzZXJ2ZWRbM107CiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCiBzdHJ1Y3QgbXNwcm9fYXR0cmlidXRlIHsKLQl1bnNpZ25lZCBzaG9ydCAgICAgICAgICBzaWduYXR1cmU7CisJX19iZTE2IHNpZ25hdHVyZTsKIAl1bnNpZ25lZCBzaG9ydCAgICAgICAgICB2ZXJzaW9uOwogCXVuc2lnbmVkIGNoYXIgICAgICAgICAgIGNvdW50OwogCXVuc2lnbmVkIGNoYXIgICAgICAgICAgIHJlc2VydmVkWzExXTsKQEAgLTY5LDI4ICs2OSwyOCBAQAogc3RydWN0IG1zcHJvX3N5c19pbmZvIHsKIAl1bnNpZ25lZCBjaGFyICBjbGFzczsKIAl1bnNpZ25lZCBjaGFyICByZXNlcnZlZDA7Ci0JdW5zaWduZWQgc2hvcnQgYmxvY2tfc2l6ZTsKLQl1bnNpZ25lZCBzaG9ydCBibG9ja19jb3VudDsKLQl1bnNpZ25lZCBzaG9ydCB1c2VyX2Jsb2NrX2NvdW50OwotCXVuc2lnbmVkIHNob3J0IHBhZ2Vfc2l6ZTsKKwlfX2JlMTYgYmxvY2tfc2l6ZTsKKwlfX2JlMTYgYmxvY2tfY291bnQ7CisJX19iZTE2IHVzZXJfYmxvY2tfY291bnQ7CisJX19iZTE2IHBhZ2Vfc2l6ZTsKIAl1bnNpZ25lZCBjaGFyICByZXNlcnZlZDFbMl07CiAJdW5zaWduZWQgY2hhciAgYXNzZW1ibHlfZGF0ZVs4XTsKLQl1bnNpZ25lZCBpbnQgICBzZXJpYWxfbnVtYmVyOworCV9fYmUzMiBzZXJpYWxfbnVtYmVyOwogCXVuc2lnbmVkIGNoYXIgIGFzc2VtYmx5X21ha2VyX2NvZGU7CiAJdW5zaWduZWQgY2hhciAgYXNzZW1ibHlfbW9kZWxfY29kZVszXTsKLQl1bnNpZ25lZCBzaG9ydCBtZW1vcnlfbWFrZXJfY29kZTsKLQl1bnNpZ25lZCBzaG9ydCBtZW1vcnlfbW9kZWxfY29kZTsKKwlfX2JlMTYgbWVtb3J5X21ha2VyX2NvZGU7CisJX19iZTE2IG1lbW9yeV9tb2RlbF9jb2RlOwogCXVuc2lnbmVkIGNoYXIgIHJlc2VydmVkMls0XTsKIAl1bnNpZ25lZCBjaGFyICB2Y2M7CiAJdW5zaWduZWQgY2hhciAgdnBwOwotCXVuc2lnbmVkIHNob3J0IGNvbnRyb2xsZXJfbnVtYmVyOwotCXVuc2lnbmVkIHNob3J0IGNvbnRyb2xsZXJfZnVuY3Rpb247Ci0JdW5zaWduZWQgc2hvcnQgc3RhcnRfc2VjdG9yOwotCXVuc2lnbmVkIHNob3J0IHVuaXRfc2l6ZTsKKwlfX2JlMTYgY29udHJvbGxlcl9udW1iZXI7CisJX19iZTE2IGNvbnRyb2xsZXJfZnVuY3Rpb247CisJX19iZTE2IHN0YXJ0X3NlY3RvcjsKKwlfX2JlMTYgdW5pdF9zaXplOwogCXVuc2lnbmVkIGNoYXIgIG1zX3N1Yl9jbGFzczsKIAl1bnNpZ25lZCBjaGFyICByZXNlcnZlZDNbNF07CiAJdW5zaWduZWQgY2hhciAgaW50ZXJmYWNlX3R5cGU7Ci0JdW5zaWduZWQgc2hvcnQgY29udHJvbGxlcl9jb2RlOworCV9fYmUxNiBjb250cm9sbGVyX2NvZGU7CiAJdW5zaWduZWQgY2hhciAgZm9ybWF0X3R5cGU7CiAJdW5zaWduZWQgY2hhciAgcmVzZXJ2ZWQ0OwogCXVuc2lnbmVkIGNoYXIgIGRldmljZV90eXBlOwpAQCAtMTI0LDExICsxMjQsMTEgQEAKIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CiAKIHN0cnVjdCBtc3Byb19kZXZpbmZvIHsKLQl1bnNpZ25lZCBzaG9ydCBjeWxpbmRlcnM7Ci0JdW5zaWduZWQgc2hvcnQgaGVhZHM7Ci0JdW5zaWduZWQgc2hvcnQgYnl0ZXNfcGVyX3RyYWNrOwotCXVuc2lnbmVkIHNob3J0IGJ5dGVzX3Blcl9zZWN0b3I7Ci0JdW5zaWduZWQgc2hvcnQgc2VjdG9yc19wZXJfdHJhY2s7CisJX19iZTE2IGN5bGluZGVyczsKKwlfX2JlMTYgaGVhZHM7CisJX19iZTE2IGJ5dGVzX3Blcl90cmFjazsKKwlfX2JlMTYgYnl0ZXNfcGVyX3NlY3RvcjsKKwlfX2JlMTYgc2VjdG9yc19wZXJfdHJhY2s7CiAJdW5zaWduZWQgY2hhciAgcmVzZXJ2ZWRbNl07CiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCkBAIC0zMzgsOCArMzM4LDcgQEAKIAlyYyArPSBzY25wcmludGYoYnVmZmVyICsgcmMsIFBBR0VfU0laRSAtIHJjLCAiYXNzZW1ibHkgZGF0ZTogIgogCQkJIkdNVCUrZDolZCAlMDR1LSUwMnUtJTAydSAlMDJ1OiUwMnU6JTAydVxuIiwKIAkJCWRhdGVfdHosIGRhdGVfdHpfZiwKLQkJCWJlMTZfdG9fY3B1KCoodW5zaWduZWQgc2hvcnQgKikKLQkJCQkgICAgJnhfc3lzLT5hc3NlbWJseV9kYXRlWzFdKSwKKwkJCWJlMTZfdG9fY3B1cCgoX19iZTE2ICopJnhfc3lzLT5hc3NlbWJseV9kYXRlWzFdKSwKIAkJCXhfc3lzLT5hc3NlbWJseV9kYXRlWzNdLCB4X3N5cy0+YXNzZW1ibHlfZGF0ZVs0XSwKIAkJCXhfc3lzLT5hc3NlbWJseV9kYXRlWzVdLCB4X3N5cy0+YXNzZW1ibHlfZGF0ZVs2XSwKIAkJCXhfc3lzLT5hc3NlbWJseV9kYXRlWzddKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbHNpL21waS5oIGIvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9sc2kvbXBpLmgKaW5kZXggMTBiNmVmNy4uMTFjMGY0NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9sc2kvbXBpLmgKKysrIGIvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9sc2kvbXBpLmgKQEAgLTYsNyArNiw3IEBACiAgKiAgICAgICAgICBUaXRsZTogIE1QSSBNZXNzYWdlIGluZGVwZW5kZW50IHN0cnVjdHVyZXMgYW5kIGRlZmluaXRpb25zCiAgKiAgQ3JlYXRpb24gRGF0ZTogIEp1bHkgMjcsIDIwMDAKICAqCi0gKiAgICBtcGkuaCBWZXJzaW9uOiAgMDEuMDUuMTMKKyAqICAgIG1waS5oIFZlcnNpb246ICAwMS4wNS4xNgogICoKICAqICBWZXJzaW9uIEhpc3RvcnkKICAqICAtLS0tLS0tLS0tLS0tLS0KQEAgLTc5LDYgKzc5LDkgQEAKICAqICAwMy0yNy0wNiAgMDEuMDUuMTEgIEJ1bXBlZCBNUElfSEVBREVSX1ZFUlNJT05fVU5JVC4KICAqICAxMC0xMS0wNiAgMDEuMDUuMTIgIEJ1bXBlZCBNUElfSEVBREVSX1ZFUlNJT05fVU5JVC4KICAqICAwNS0yNC0wNyAgMDEuMDUuMTMgIEJ1bXBlZCBNUElfSEVBREVSX1ZFUlNJT05fVU5JVC4KKyAqICAwOC0wNy0wNyAgMDEuMDUuMTQgIEJ1bXBlZCBNUElfSEVBREVSX1ZFUlNJT05fVU5JVC4KKyAqICAwMS0xNS0wOCAgMDEuMDUuMTUgIEJ1bXBlZCBNUElfSEVBREVSX1ZFUlNJT05fVU5JVC4KKyAqICAwMy0yOC0wOCAgMDEuMDUuMTYgIEJ1bXBlZCBNUElfSEVBREVSX1ZFUlNJT05fVU5JVC4KICAqICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICovCiAKQEAgLTEwOSw3ICsxMTIsNyBAQAogLyogTm90ZTogVGhlIG1ham9yIHZlcnNpb25zIG9mIDB4ZTAgdGhyb3VnaCAweGZmIGFyZSByZXNlcnZlZCAqLwogCiAvKiB2ZXJzaW9uaW5nIGZvciB0aGlzIE1QSSBoZWFkZXIgc2V0ICovCi0jZGVmaW5lIE1QSV9IRUFERVJfVkVSU0lPTl9VTklUICAgICAgICAgICAgICgweDEwKQorI2RlZmluZSBNUElfSEVBREVSX1ZFUlNJT05fVU5JVCAgICAgICAgICAgICAoMHgxMykKICNkZWZpbmUgTVBJX0hFQURFUl9WRVJTSU9OX0RFViAgICAgICAgICAgICAgKDB4MDApCiAjZGVmaW5lIE1QSV9IRUFERVJfVkVSU0lPTl9VTklUX01BU0sgICAgICAgICgweEZGMDApCiAjZGVmaW5lIE1QSV9IRUFERVJfVkVSU0lPTl9VTklUX1NISUZUICAgICAgICg4KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9sc2kvbXBpX2NuZmcuaCBiL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbHNpL21waV9jbmZnLmgKaW5kZXggYjJkYjMzMy4uMDEzYzdkOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9sc2kvbXBpX2NuZmcuaAorKysgYi9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL2xzaS9tcGlfY25mZy5oCkBAIC02LDcgKzYsNyBAQAogICogICAgICAgICAgVGl0bGU6ICBNUEkgQ29uZmlnIG1lc3NhZ2UsIHN0cnVjdHVyZXMsIGFuZCBQYWdlcwogICogIENyZWF0aW9uIERhdGU6ICBKdWx5IDI3LCAyMDAwCiAgKgotICogICAgbXBpX2NuZmcuaCBWZXJzaW9uOiAgMDEuMDUuMTUKKyAqICAgIG1waV9jbmZnLmggVmVyc2lvbjogIDAxLjA1LjE4CiAgKgogICogIFZlcnNpb24gSGlzdG9yeQogICogIC0tLS0tLS0tLS0tLS0tLQpAQCAtMzA4LDYgKzMwOCwyMCBAQAogICogICAgICAgICAgICAgICAgICAgICAgRXhwYW5kZXIgUGFnZSAwIEZsYWdzIGZpZWxkLgogICogICAgICAgICAgICAgICAgICAgICAgRml4ZWQgZGVmaW5lIGZvcgogICogICAgICAgICAgICAgICAgICAgICAgTVBJX1NBU19FWFBBTkRFUjFfRElTQ0lORk9fQkFEX1BIWV9ESVNBQkxFRC4KKyAqICAwOC0wNy0wNyAgMDEuMDUuMTYgIEFkZGVkIE1QSV9JT0NQQUdFNl9DQVBfRkxBR1NfTVVMVElQT1JUX0RSSVZFX1NVUFBPUlQKKyAqICAgICAgICAgICAgICAgICAgICAgIGRlZmluZS4KKyAqICAgICAgICAgICAgICAgICAgICAgIEFkZGVkIEJJT1MgUGFnZSA0IHN0cnVjdHVyZS4KKyAqICAgICAgICAgICAgICAgICAgICAgIEFkZGVkIE1QSV9SQUlEX1BIWVNfRElTSzFfUEFUSF9NQVggZGVmaW5lIGZvciBSQUlECisgKiAgICAgICAgICAgICAgICAgICAgICBQaHlzY2lhbCBEaXNrIFBhZ2UgMS4KKyAqICAwMS0xNS0wNyAgMDEuMDUuMTcgIEFkZGVkIGFkZGl0aW9uYWwgYml0IGRlZmluZXMgZm9yIEV4dEZsYWdzIGZpZWxkIG9mCisgKiAgICAgICAgICAgICAgICAgICAgICBNYW51ZmFjdHVyaW5nIFBhZ2UgNC4KKyAqICAgICAgICAgICAgICAgICAgICAgIEFkZGVkIFNvbGlkIFN0YXRlIERyaXZlcyBTdXBwb3J0ZWQgYml0IHRvIElPQyBQYWdlIDYKKyAqICAgICAgICAgICAgICAgICAgICAgIENhcGFiaWxpdGllcyBGbGFncy4KKyAqICAgICAgICAgICAgICAgICAgICAgIEFkZGVkIG5ldyB2YWx1ZSBmb3IgQWNjZXNzU3RhdHVzIGZpZWxkIG9mIFNBUyBEZXZpY2UKKyAqICAgICAgICAgICAgICAgICAgICAgIFBhZ2UgMCAoX1NBVEFfTkVFRFNfSU5JVElBTElaQVRJT04pLgorICogIDAzLTI4LTA4ICAwMS4wNS4xOCAgRGVmaW5lZCBuZXcgYml0cyBpbiBNYW51ZmFjdHVyaW5nIFBhZ2UgNCBFeHRGbGFncyBmaWVsZAorICogICAgICAgICAgICAgICAgICAgICAgdG8gY29udHJvbCBjb2VyY2lvbiBzaXplIGFuZCB0aGUgbWl4aW5nIG9mIFNBUyBhbmQgU0FUQQorICogICAgICAgICAgICAgICAgICAgICAgU1NEIGRyaXZlcy4KICAqICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICovCiAKQEAgLTY4Niw2ICs3MDAsMTQgQEAKICNkZWZpbmUgTVBJX01BTlBBR0U0X0lSX05PX01JWF9TQVNfU0FUQSAgICAgICAgICAgICAgICAgKDB4MDEpCiAKIC8qIGRlZmluZXMgZm9yIHRoZSBFeHRGbGFncyBmaWVsZCAqLworI2RlZmluZSBNUElfTUFOUEFHRTRfRVhURkxBR1NfTUFTS19DT0VSQ0lPTl9TSVpFICAgICAgICAoMHgwMTgwKQorI2RlZmluZSBNUElfTUFOUEFHRTRfRVhURkxBR1NfU0hJRlRfQ09FUkNJT05fU0laRSAgICAgICAoNykKKyNkZWZpbmUgTVBJX01BTlBBR0U0X0VYVEZMQUdTXzFHQl9DT0VSQ0lPTl9TSVpFICAgICAgICAgKDApCisjZGVmaW5lIE1QSV9NQU5QQUdFNF9FWFRGTEFHU18xMjhNQl9DT0VSQ0lPTl9TSVpFICAgICAgICgxKQorCisjZGVmaW5lIE1QSV9NQU5QQUdFNF9FWFRGTEFHU19OT19NSVhfU1NEX1NBU19TQVRBICAgICAgICgweDAwNDApCisjZGVmaW5lIE1QSV9NQU5QQUdFNF9FWFRGTEFHU19NSVhfU1NEX0FORF9OT05fU1NEICAgICAgICgweDAwMjApCisjZGVmaW5lIE1QSV9NQU5QQUdFNF9FWFRGTEFHU19EVUFMX1BPUlRfU1VQUE9SVCAgICAgICAgICgweDAwMTApCiAjZGVmaW5lIE1QSV9NQU5QQUdFNF9FWFRGTEFHU19ISURFX05PTl9JUl9NRVRBREFUQSAgICAgICgweDAwMDgpCiAjZGVmaW5lIE1QSV9NQU5QQUdFNF9FWFRGTEFHU19TQVNfQ0FDSEVfRElTQUJMRSAgICAgICAgICgweDAwMDQpCiAjZGVmaW5lIE1QSV9NQU5QQUdFNF9FWFRGTEFHU19TQVRBX0NBQ0hFX0RJU0FCTEUgICAgICAgICgweDAwMDIpCkBAIC0xMTU5LDYgKzExODEsOCBAQAogCiAvKiBJT0MgUGFnZSA2IENhcGFiaWxpdGllcyBGbGFncyAqLwogCisjZGVmaW5lIE1QSV9JT0NQQUdFNl9DQVBfRkxBR1NfU1NEX1NVUFBPUlQgICAgICAgICAgICAgICgweDAwMDAwMDIwKQorI2RlZmluZSBNUElfSU9DUEFHRTZfQ0FQX0ZMQUdTX01VTFRJUE9SVF9EUklWRV9TVVBQT1JUICAoMHgwMDAwMDAxMCkKICNkZWZpbmUgTVBJX0lPQ1BBR0U2X0NBUF9GTEFHU19ESVNBQkxFX1NNQVJUX1BPTExJTkcgICAgKDB4MDAwMDAwMDgpCiAKICNkZWZpbmUgTVBJX0lPQ1BBR0U2X0NBUF9GTEFHU19NQVNLX01FVEFEQVRBX1NJWkUgICAgICAgKDB4MDAwMDAwMDYpCkBAIC0xNDI4LDYgKzE0NTIsMTUgQEAKICNkZWZpbmUgTVBJX0JJT1NQQUdFMl9GT1JNX1NBU19XV04gICAgICAgICAgICAgICAgICAgICAgKDB4MDUpCiAjZGVmaW5lIE1QSV9CSU9TUEFHRTJfRk9STV9FTkNMT1NVUkVfU0xPVCAgICAgICAgICAgICAgICgweDA2KQogCit0eXBlZGVmIHN0cnVjdCBfQ09ORklHX1BBR0VfQklPU180Cit7CisgICAgQ09ORklHX1BBR0VfSEVBREVSICAgICAgSGVhZGVyOyAgICAgICAgICAgICAgICAgICAgIC8qIDAwaCAqLworICAgIFU2NCAgICAgICAgICAgICAgICAgICAgIFJlYXNzaWdubWVudEJhc2VXV0lEOyAgICAgICAvKiAwNGggKi8KK30gQ09ORklHX1BBR0VfQklPU180LCBNUElfUE9JTlRFUiBQVFJfQ09ORklHX1BBR0VfQklPU180LAorICBCSU9TUGFnZTRfdCwgTVBJX1BPSU5URVIgcEJJT1NQYWdlNF90OworCisjZGVmaW5lIE1QSV9CSU9TUEFHRTRfUEFHRVZFUlNJT04gICAgICAgICAgICAgICAgICAgICAgICgweDAwKQorCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgU0NTSSBQb3J0IENvbmZpZyBQYWdlcwpAQCAtMjQxOSw2ICsyNDUyLDE1IEBACiAjZGVmaW5lIE1QSV9SQUlEX1BIWVNESVNLMV9GTEFHX0JST0tFTiAgICAgICAgICAoMHgwMDAyKQogI2RlZmluZSBNUElfUkFJRF9QSFlTRElTSzFfRkxBR19JTlZBTElEICAgICAgICAgKDB4MDAwMSkKIAorCisvKgorICogSG9zdCBjb2RlIChkcml2ZXJzLCBCSU9TLCB1dGlsaXRpZXMsIGV0Yy4pIHNob3VsZCBsZWF2ZSB0aGlzIGRlZmluZSBzZXQgdG8KKyAqIG9uZSBhbmQgY2hlY2sgSGVhZGVyLlBhZ2VMZW5ndGggb3IgTnVtUGh5c0Rpc2tQYXRocyBhdCBydW50aW1lLgorICovCisjaWZuZGVmIE1QSV9SQUlEX1BIWVNfRElTSzFfUEFUSF9NQVgKKyNkZWZpbmUgTVBJX1JBSURfUEhZU19ESVNLMV9QQVRIX01BWCAgICAoMSkKKyNlbmRpZgorCiB0eXBlZGVmIHN0cnVjdCBfQ09ORklHX1BBR0VfUkFJRF9QSFlTX0RJU0tfMQogewogICAgIENPTkZJR19QQUdFX0hFQURFUiAgICAgICAgICAgICAgSGVhZGVyOyAgICAgICAgICAgICAvKiAwMGggKi8KQEAgLTI0MjYsNyArMjQ2OCw3IEBACiAgICAgVTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQaHlzRGlza051bTsgICAgICAgIC8qIDA1aCAqLwogICAgIFUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQyOyAgICAgICAgICAvKiAwNmggKi8KICAgICBVMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMTsgICAgICAgICAgLyogMDhoICovCi0gICAgUkFJRF9QSFlTX0RJU0sxX1BBVEggICAgICAgICAgICBQYXRoWzFdOyAgICAgICAgICAgIC8qIDBDaCAqLworICAgIFJBSURfUEhZU19ESVNLMV9QQVRIICAgICAgICAgICAgUGF0aFtNUElfUkFJRF9QSFlTX0RJU0sxX1BBVEhfTUFYXTsvKiAwQ2ggKi8KIH0gQ09ORklHX1BBR0VfUkFJRF9QSFlTX0RJU0tfMSwgTVBJX1BPSU5URVIgUFRSX0NPTkZJR19QQUdFX1JBSURfUEhZU19ESVNLXzEsCiAgIFJhaWRQaHlzRGlza1BhZ2UxX3QsIE1QSV9QT0lOVEVSIHBSYWlkUGh5c0Rpc2tQYWdlMV90OwogCkBAIC0yODQ0LDYgKzI4ODYsNyBAQAogI2RlZmluZSBNUElfU0FTX0RFVklDRTBfQVNUQVRVU19TQVRBX0lOSVRfRkFJTEVEICAgICAgICAgICAgKDB4MDEpCiAjZGVmaW5lIE1QSV9TQVNfREVWSUNFMF9BU1RBVFVTX1NBVEFfQ0FQQUJJTElUWV9GQUlMRUQgICAgICAoMHgwMikKICNkZWZpbmUgTVBJX1NBU19ERVZJQ0UwX0FTVEFUVVNfU0FUQV9BRkZJTElBVElPTl9DT05GTElDVCAgICgweDAzKQorI2RlZmluZSBNUElfU0FTX0RFVklDRTBfQVNUQVRVU19TQVRBX05FRURTX0lOSVRJQUxJWkFUSU9OICAgKDB4MDQpCiAvKiBzcGVjaWZpYyB2YWx1ZXMgZm9yIFNBVEEgSW5pdCBmYWlsdXJlcyAqLwogI2RlZmluZSBNUElfU0FTX0RFVklDRTBfQVNUQVRVU19TSUZfVU5LTk9XTiAgICAgICAgICAgICAgICAgKDB4MTApCiAjZGVmaW5lIE1QSV9TQVNfREVWSUNFMF9BU1RBVFVTX1NJRl9BRkZJTElBVElPTl9DT05GTElDVCAgICAoMHgxMSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbHNpL21waV9mYy5oIGIvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9sc2kvbXBpX2ZjLmgKaW5kZXggNjI3YWNmYi4uN2Q2NjNjZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9sc2kvbXBpX2ZjLmgKKysrIGIvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9sc2kvbXBpX2ZjLmgKQEAgLTEsNSArMSw1IEBACiAvKgotICogIENvcHlyaWdodCAoYykgMjAwMC0yMDA0IExTSSBDb3Jwb3JhdGlvbi4KKyAqICBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwOCBMU0kgQ29ycG9yYXRpb24uCiAgKgogICoKICAqICAgICAgICAgICBOYW1lOiAgbXBpX2ZjLmgKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbHNpL21waV9oaXN0b3J5LnR4dCBiL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbHNpL21waV9oaXN0b3J5LnR4dAppbmRleCAzZjE1ZmNmLi42OTNlNGI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL2xzaS9tcGlfaGlzdG9yeS50eHQKKysrIGIvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9sc2kvbXBpX2hpc3RvcnkudHh0CkBAIC0zLDI4ICszLDI4IEBACiAgTVBJIEhlYWRlciBGaWxlIENoYW5nZSBIaXN0b3J5CiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKLSBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNyBMU0kgQ29ycG9yYXRpb24uCisgQ29weXJpZ2h0IChjKSAyMDAwLTIwMDggTFNJIENvcnBvcmF0aW9uLgogCiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gSGVhZGVyIFNldCBSZWxlYXNlIFZlcnNpb246ICAgIDAxLjA1LjE2Ci0gSGVhZGVyIFNldCBSZWxlYXNlIERhdGU6ICAgICAgIDA1LTI0LTA3CisgSGVhZGVyIFNldCBSZWxlYXNlIFZlcnNpb246ICAgIDAxLjA1LjE5CisgSGVhZGVyIFNldCBSZWxlYXNlIERhdGU6ICAgICAgIDAzLTI4LTA4CiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKICBGaWxlbmFtZSAgICAgICAgICAgICAgIEN1cnJlbnQgdmVyc2lvbiAgICAgUHJpb3IgdmVyc2lvbgogIC0tLS0tLS0tLS0gICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tICAgICAtLS0tLS0tLS0tLS0tCi0gbXBpLmggICAgICAgICAgICAgICAgICAwMS4wNS4xMyAgICAgICAgICAgIDAxLjA1LjEyCi0gbXBpX2lvYy5oICAgICAgICAgICAgICAwMS4wNS4xNCAgICAgICAgICAgIDAxLjA1LjEzCi0gbXBpX2NuZmcuaCAgICAgICAgICAgICAwMS4wNS4xNSAgICAgICAgICAgIDAxLjA1LjE0CisgbXBpLmggICAgICAgICAgICAgICAgICAwMS4wNS4xNiAgICAgICAgICAgIDAxLjA1LjE1CisgbXBpX2lvYy5oICAgICAgICAgICAgICAwMS4wNS4xNiAgICAgICAgICAgIDAxLjA1LjE1CisgbXBpX2NuZmcuaCAgICAgICAgICAgICAwMS4wNS4xOCAgICAgICAgICAgIDAxLjA1LjE3CiAgbXBpX2luaXQuaCAgICAgICAgICAgICAwMS4wNS4wOSAgICAgICAgICAgIDAxLjA1LjA5CiAgbXBpX3RhcmcuaCAgICAgICAgICAgICAwMS4wNS4wNiAgICAgICAgICAgIDAxLjA1LjA2CiAgbXBpX2ZjLmggICAgICAgICAgICAgICAwMS4wNS4wMSAgICAgICAgICAgIDAxLjA1LjAxCiAgbXBpX2xhbi5oICAgICAgICAgICAgICAwMS4wNS4wMSAgICAgICAgICAgIDAxLjA1LjAxCi0gbXBpX3JhaWQuaCAgICAgICAgICAgICAwMS4wNS4wMyAgICAgICAgICAgIDAxLjA1LjAzCisgbXBpX3JhaWQuaCAgICAgICAgICAgICAwMS4wNS4wNSAgICAgICAgICAgIDAxLjA1LjA1CiAgbXBpX3Rvb2wuaCAgICAgICAgICAgICAwMS4wNS4wMyAgICAgICAgICAgIDAxLjA1LjAzCiAgbXBpX2luYi5oICAgICAgICAgICAgICAwMS4wNS4wMSAgICAgICAgICAgIDAxLjA1LjAxCi0gbXBpX3Nhcy5oICAgICAgICAgICAgICAwMS4wNS4wNCAgICAgICAgICAgIDAxLjA1LjA0CisgbXBpX3Nhcy5oICAgICAgICAgICAgICAwMS4wNS4wNSAgICAgICAgICAgIDAxLjA1LjA1CiAgbXBpX3R5cGUuaCAgICAgICAgICAgICAwMS4wNS4wMiAgICAgICAgICAgIDAxLjA1LjAyCi0gbXBpX2hpc3RvcnkudHh0ICAgICAgICAwMS4wNS4xNCAgICAgICAgICAgIDAxLjA1LjE0CisgbXBpX2hpc3RvcnkudHh0ICAgICAgICAwMS4wNS4xOSAgICAgICAgICAgIDAxLjA1LjE4CiAKIAogICogIERhdGUgICAgICBWZXJzaW9uICAgRGVzY3JpcHRpb24KQEAgLTk2LDYgKzk2LDkgQEAKICAqICAwMy0yNy0wNiAgMDEuMDUuMTEgIEJ1bXBlZCBNUElfSEVBREVSX1ZFUlNJT05fVU5JVC4KICAqICAxMC0xMS0wNiAgMDEuMDUuMTIgIEJ1bXBlZCBNUElfSEVBREVSX1ZFUlNJT05fVU5JVC4KICAqICAwNS0yNC0wNyAgMDEuMDUuMTMgIEJ1bXBlZCBNUElfSEVBREVSX1ZFUlNJT05fVU5JVC4KKyAqICAwOC0wNy0wNyAgMDEuMDUuMTQgIEJ1bXBlZCBNUElfSEVBREVSX1ZFUlNJT05fVU5JVC4KKyAqICAwMS0xNS0wOCAgMDEuMDUuMTUgIEJ1bXBlZCBNUElfSEVBREVSX1ZFUlNJT05fVU5JVC4KKyAqICAwMy0yOC0wOCAgMDEuMDUuMTYgIEJ1bXBlZCBNUElfSEVBREVSX1ZFUlNJT05fVU5JVC4KICAqICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBtcGlfaW9jLmgKQEAgLTEyNyw3ICsxMzAsNyBAQAogICogIDA4LTA4LTAxICAwMS4wMi4wMSAgT3JpZ2luYWwgcmVsZWFzZSBmb3IgdjEuMiB3b3JrLgogICogICAgICAgICAgICAgICAgICAgICAgTmV3IGZvcm1hdCBmb3IgRldWZXJzaW9uIGFuZCBQcm9kdWN0SWQgaW4KICAqICAgICAgICAgICAgICAgICAgICAgIE1TR19JT0NfRkFDVFNfUkVQTFkgYW5kIE1QSV9GV19IRUFERVIuCi0gKiAgMDgtMzEtMDEgIDAxLjAyLjAyICBBZGRlZCBldmVudCBNUElfRVZFTlRfU0NTSV9ERVZJQ0VfU1RBVFVTX0NIQU5HRSBhbmQKKyAqICAwOC0zMS0wMSAgMDEuMDIuMDIgIEFkZGRlZCBldmVudCBNUElfRVZFTlRfU0NTSV9ERVZJQ0VfU1RBVFVTX0NIQU5HRSBhbmQKICAqICAgICAgICAgICAgICAgICAgICAgIHJlbGF0ZWQgc3RydWN0dXJlIGFuZCBkZWZpbmVzLgogICogICAgICAgICAgICAgICAgICAgICAgQWRkZWQgZXZlbnQgTVBJX0VWRU5UX09OX0JVU19USU1FUl9FWFBJUkVELgogICogICAgICAgICAgICAgICAgICAgICAgQWRkZWQgTVBJX0lPQ0lOSVRfRkxBR1NfRElTQ0FSRF9GV19JTUFHRS4KQEAgLTE4Nyw3ICsxOTAsNyBAQAogICogIDEwLTExLTA2ICAwMS4wNS4xMiAgQWRkZWQgTVBJX0lPQ0ZBQ1RTX0VYQ0VQVF9NRVRBREFUQV9VTlNVUFBPUlRFRC4KICAqICAgICAgICAgICAgICAgICAgICAgIEFkZGVkIE1heEluaXRpYXRvcnMgZmllbGQgdG8gUG9ydEZhY3RzIHJlcGx5LgogICogICAgICAgICAgICAgICAgICAgICAgQWRkZWQgU0FTIERldmljZSBTdGF0dXMgQ2hhbmdlIFJlYXNvbkNvZGUgZm9yCi0gKiAgICAgICAgICAgICAgICAgICAgICBhc3luY2hyb25vdXMgbm90aWZpY2F0aW9uLgorICogICAgICAgICAgICAgICAgICAgICAgYXN5bmNocm9ub3VzIG5vdGlmaWNhaXRvbi4KICAqICAgICAgICAgICAgICAgICAgICAgIEFkZGVkIE1QSV9FVkVOVF9TQVNfRVhQQU5ERVJfU1RBVFVTX0NIQU5HRSBhbmQgZXZlbnQKICAqICAgICAgICAgICAgICAgICAgICAgIGRhdGEgc3RydWN0dXJlLgogICogICAgICAgICAgICAgICAgICAgICAgQWRkZWQgbmV3IEltYWdlVHlwZSB2YWx1ZXMgZm9yIEZXRG93bmxvYWQgYW5kIEZXVXBsb2FkCkBAIC0xOTksNiArMjAyLDE2IEBACiAgKiAgICAgICAgICAgICAgICAgICAgICBhZGRlZCBfTVVMVElfUE9SVF9ET01BSU4uCiAgKiAgMDUtMjQtMDcgIDAxLjA1LjE0ICBBZGRlZCBDb21tb24gQm9vdCBCbG9jayB0eXBlIHRvIEZXRG93bmxvYWQgUmVxdWVzdC4KICAqICAgICAgICAgICAgICAgICAgICAgIEFkZGVkIENvbW1vbiBCb290IEJsb2NrIHR5cGUgdG8gRldVcGxvYWQgUmVxdWVzdC4KKyAqICAwOC0wNy0wNyAgMDEuMDUuMTUgIEFkZGVkIE1QSV9FVkVOVF9TQVNfSU5JVF9SQ19SRU1PVkVEIGRlZmluZS4KKyAqICAgICAgICAgICAgICAgICAgICAgIEFkZGVkIE1QSV9FVkVOVF9JUjJfUkNfRFVBTF9QT1JUX0FEREVEIGFuZAorICogICAgICAgICAgICAgICAgICAgICAgTVBJX0VWRU5UX0lSMl9SQ19EVUFMX1BPUlRfUkVNT1ZFRCBmb3IgSVIyIGV2ZW50IGRhdGEuCisgKiAgICAgICAgICAgICAgICAgICAgICBBZGRlZCBTQVNBZGRyZXNzIGZpZWxkIHRvIFNBUyBJbml0aWF0b3IgRGV2aWNlIFRhYmxlCisgKiAgICAgICAgICAgICAgICAgICAgICBPdmVyZmxvdyBldmVudCBkYXRhIHN0cnVjdHVyZS4KKyAqICAwMy0yOC0wOCAgMDEuMDUuMTYgIEFkZGVkIHR3byBuZXcgUmVhc29uQ29kZSB2YWx1ZXMgdG8gU0FTIERldmljZSBTdGF0dXMKKyAqICAgICAgICAgICAgICAgICAgICAgIENoYW5nZSBFdmVudCBkYXRhIHRvIGluZGljYXRlIGNvbXBsZXRpb24gb2YgaW50ZXJuYWxseQorICogICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVkIHRhc2sgbWFuYWdlbWVudC4KKyAqICAgICAgICAgICAgICAgICAgICAgIEFkZGVkIE1QSV9FVkVOVF9EU0NWUllfRVJSX0RTX1NBVEFfSU5JVF9GQUlMVVJFIGRlZmluZS4KKyAqICAgICAgICAgICAgICAgICAgICAgIEFkZGVkIE1QSV9FVkVOVF9TQVNfSU5JVF9SQ19JTkFDQ0VTU0lCTEUgZGVmaW5lLgogICogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIG1waV9jbmZnLmgKQEAgLTIxMyw3ICsyMjYsNyBAQAogICogICAgICAgICAgICAgICAgICAgICAgQWRkZWQgX1JFU1BPTlNFX0lEX01BU0sgZGVmaW5pdGlvbiB0byBTQ1NJX1BPUlRfMQogICogICAgICAgICAgICAgICAgICAgICAgcGFnZSBhbmQgdXBkYXRlZCB0aGUgcGFnZSB2ZXJzaW9uLgogICogICAgICAgICAgICAgICAgICAgICAgQWRkZWQgSW5mb3JtYXRpb24gZmllbGQgYW5kIF9JTkZPX1BBUkFNU19ORUdPVElBVEVECi0gKiAgICAgICAgICAgICAgICAgICAgICBkZWZpbml0aW9uIHRvIFNDU0lfREVWSUNFXzAgcGFnZS4KKyAqICAgICAgICAgICAgICAgICAgICAgIGRlZmluaXRpb250byBTQ1NJX0RFVklDRV8wIHBhZ2UuCiAgKiAgMDYtMjItMDAgIDAxLjAwLjAzICBSZW1vdmVkIGJhdGNoIGNvbnRyb2xzIGZyb20gTEFOXzAgcGFnZSBhbmQgdXBkYXRlZCB0aGUKICAqICAgICAgICAgICAgICAgICAgICAgIHBhZ2UgdmVyc2lvbi4KICAqICAgICAgICAgICAgICAgICAgICAgIEFkZGVkIEJ1Y2tldHNSZW1haW5pbmcgdG8gTEFOXzEgcGFnZSwgcmVkZWZpbmVkIHRoZQpAQCAtNDk2LDYgKzUwOSwyMCBAQAogICogICAgICAgICAgICAgICAgICAgICAgRXhwYW5kZXIgUGFnZSAwIEZsYWdzIGZpZWxkLgogICogICAgICAgICAgICAgICAgICAgICAgRml4ZWQgZGVmaW5lIGZvcgogICogICAgICAgICAgICAgICAgICAgICAgTVBJX1NBU19FWFBBTkRFUjFfRElTQ0lORk9fQkFEX1BIWV9ESVNBQkxFRC4KKyAqICAwOC0wNy0wNyAgMDEuMDUuMTYgIEFkZGVkIE1QSV9JT0NQQUdFNl9DQVBfRkxBR1NfTVVMVElQT1JUX0RSSVZFX1NVUFBPUlQKKyAqICAgICAgICAgICAgICAgICAgICAgIGRlZmluZS4KKyAqICAgICAgICAgICAgICAgICAgICAgIEFkZGVkIEJJT1MgUGFnZSA0IHN0cnVjdHVyZS4KKyAqICAgICAgICAgICAgICAgICAgICAgIEFkZGVkIE1QSV9SQUlEX1BIWVNfRElTSzFfUEFUSF9NQVggZGVmaW5lIGZvciBSQUlECisgKiAgICAgICAgICAgICAgICAgICAgICBQaHlzY2lhbCBEaXNrIFBhZ2UgMS4KKyAqICAwMS0xNS0wNyAgMDEuMDUuMTcgIEFkZGVkIGFkZGl0aW9uYWwgYml0IGRlZmluZXMgZm9yIEV4dEZsYWdzIGZpZWxkIG9mCisgKiAgICAgICAgICAgICAgICAgICAgICBNYW51ZmFjdHVyaW5nIFBhZ2UgNC4KKyAqICAgICAgICAgICAgICAgICAgICAgIEFkZGVkIFNvbGlkIFN0YXRlIERyaXZlcyBTdXBwb3J0ZWQgYml0IHRvIElPQyBQYWdlIDYKKyAqICAgICAgICAgICAgICAgICAgICAgIENhcGFiaWxpdGllcyBGbGFncy4KKyAqICAgICAgICAgICAgICAgICAgICAgIEFkZGVkIG5ldyB2YWx1ZSBmb3IgQWNjZXNzU3RhdHVzIGZpZWxkIG9mIFNBUyBEZXZpY2UKKyAqICAgICAgICAgICAgICAgICAgICAgIFBhZ2UgMCAoX1NBVEFfTkVFRFNfSU5JVElBTElaQVRJT04pLgorICogIDAzLTI4LTA4ICAwMS4wNS4xOCAgRGVmaW5lZCBuZXcgYml0cyBpbiBNYW51ZmFjdHVyaW5nIFBhZ2UgNCBFeHRGbGFncyBmaWVsZAorICogICAgICAgICAgICAgICAgICAgICAgdG8gY29udHJvbCBjb2VyY2lvbiBzaXplIGFuZCB0aGUgbWl4aW5nIG9mIFNBUyBhbmQgU0FUQQorICogICAgICAgICAgICAgICAgICAgICAgU1NEIGRyaXZlcy4KICAqICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBtcGlfaW5pdC5oCkBAIC02NjEsNiArNjg4LDkgQEAKICAqICAgICAgICAgICAgICAgICAgICAgIF9TRVRfUkVTWU5DX1JBVEUgYW5kIF9TRVRfREFUQV9TQ1JVQl9SQVRFLgogICogIDAyLTI4LTA3ICAwMS4wNS4wMyAgQWRkZWQgbmV3IFJBSUQgQWN0aW9uLCBEZXZpY2UgRlcgVXBkYXRlIE1vZGUsIGFuZAogICogICAgICAgICAgICAgICAgICAgICAgYXNzb2NpYXRlZCBkZWZpbmVzLgorICogIDA4LTA3LTA3ICAwMS4wNS4wNCAgQWRkZWQgRGlzYWJsZSBGdWxsIFJlYnVpbGQgYml0IHRvIHRoZSBBY3Rpb25EYXRhV29yZAorICogICAgICAgICAgICAgICAgICAgICAgZm9yIHRoZSBSQUlEIEFjdGlvbiBNUElfUkFJRF9BQ1RJT05fRElTQUJMRV9WT0xVTUUuCisgKiAgMDEtMTUtMDggIDAxLjA1LjA1ICBBZGRlZCBkZWZpbmUgZm9yIE1QSV9SQUlEX0FDVElPTl9TRVRfVk9MVU1FX05BTUUuCiAgKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogbXBpX3Rvb2wuaApAQCAtNjk0LDYgKzcyNCwxMCBAQAogICogICAgICAgICAgICAgICAgICAgICAgcmVwbHkuCiAgKiAgMTAtMTEtMDYgIDAxLjA1LjA0ICBGaXhlZCB0aGUgbmFtZSBvZiBhIGRlZmluZSBmb3IgT3BlcmF0aW9uIGZpZWxkIG9mIFNBUyBJTwogICogICAgICAgICAgICAgICAgICAgICAgVW5pdCBDb250cm9sIHJlcXVlc3QuCisgKiAgMDEtMTUtMDggIDAxLjA1LjA1ICBBZGRlZCBzdXBwb3J0IGZvciBNUElfU0FTX09QX1NFVF9JT0NfUEFSQU1FVEVSLAorICogICAgICAgICAgICAgICAgICAgICAgaW5jbHVkaW5nIGFkZGluZyBJT0NQYXJhbWV0ZXIgYW5kIElPQ1BhcmFtZXRlciB2YWx1ZQorICogICAgICAgICAgICAgICAgICAgICAgZmllbGRzIHRvIFNBUyBJTyBVbml0IENvbnRyb2wgUmVxdWVzdC4KKyAqICAgICAgICAgICAgICAgICAgICAgIEFkZGVkIE1QSV9TQVNfREVWSUNFX0lORk9fUFJPRFVDVF9TUEVDSUZJQyBkZWZpbmUuCiAgKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogbXBpX3R5cGUuaApAQCAtNzA5LDIwICs3NDMsMjAgQEAKIAogbXBpX2hpc3RvcnkudHh0ICAgICAgICAgUGFydHMgbGlzdCBoaXN0b3J5CiAKLUZpbGVuYW1lICAgIDAxLjA1LjE1ICAgMDEuMDUuMTUKLS0tLS0tLS0tLS0gIC0tLS0tLS0tICAgLS0tLS0tLS0KLW1waS5oICAgICAgIDAxLjA1LjEyICAgMDEuMDUuMTMKLW1waV9pb2MuaCAgIDAxLjA1LjEzICAgMDEuMDUuMTQKLW1waV9jbmZnLmggIDAxLjA1LjE0ICAgMDEuMDUuMTUKLW1waV9pbml0LmggIDAxLjA1LjA5ICAgMDEuMDUuMDkKLW1waV90YXJnLmggIDAxLjA1LjA2ICAgMDEuMDUuMDYKLW1waV9mYy5oICAgIDAxLjA1LjAxICAgMDEuMDUuMDEKLW1waV9sYW4uaCAgIDAxLjA1LjAxICAgMDEuMDUuMDEKLW1waV9yYWlkLmggIDAxLjA1LjAzICAgMDEuMDUuMDMKLW1waV90b29sLmggIDAxLjA1LjAzICAgMDEuMDUuMDMKLW1waV9pbmIuaCAgIDAxLjA1LjAxICAgMDEuMDUuMDEKLW1waV9zYXMuaCAgIDAxLjA1LjA0ICAgMDEuMDUuMDQKLW1waV90eXBlLmggIDAxLjA1LjAyICAgMDEuMDUuMDIKK0ZpbGVuYW1lICAgIDAxLjA1LjE5ICAgMDEuMDUuMTggICAwMS4wNS4xNyAgIDAxLjA1LjE2ICAgMDEuMDUuMTUKKy0tLS0tLS0tLS0gIC0tLS0tLS0tICAgLS0tLS0tLS0gICAtLS0tLS0tLSAgIC0tLS0tLS0tICAgLS0tLS0tLS0KK21waS5oICAgICAgIDAxLjA1LjE2ICAgMDEuMDUuMTUgICAwMS4wNS4xNCAgIDAxLjA1LjEzICAgMDEuMDUuMTIKK21waV9pb2MuaCAgIDAxLjA1LjE2ICAgMDEuMDUuMTUgICAwMS4wNS4xNSAgIDAxLjA1LjE0ICAgMDEuMDUuMTMKK21waV9jbmZnLmggIDAxLjA1LjE4ICAgMDEuMDUuMTcgICAwMS4wNS4xNiAgIDAxLjA1LjE1ICAgMDEuMDUuMTQKK21waV9pbml0LmggIDAxLjA1LjA5ICAgMDEuMDUuMDkgICAwMS4wNS4wOSAgIDAxLjA1LjA5ICAgMDEuMDUuMDkKK21waV90YXJnLmggIDAxLjA1LjA2ICAgMDEuMDUuMDYgICAwMS4wNS4wNiAgIDAxLjA1LjA2ICAgMDEuMDUuMDYKK21waV9mYy5oICAgIDAxLjA1LjAxICAgMDEuMDUuMDEgICAwMS4wNS4wMSAgIDAxLjA1LjAxICAgMDEuMDUuMDEKK21waV9sYW4uaCAgIDAxLjA1LjAxICAgMDEuMDUuMDEgICAwMS4wNS4wMSAgIDAxLjA1LjAxICAgMDEuMDUuMDEKK21waV9yYWlkLmggIDAxLjA1LjA1ICAgMDEuMDUuMDUgICAwMS4wNS4wNCAgIDAxLjA1LjAzICAgMDEuMDUuMDMKK21waV90b29sLmggIDAxLjA1LjAzICAgMDEuMDUuMDMgICAwMS4wNS4wMyAgIDAxLjA1LjAzICAgMDEuMDUuMDMKK21waV9pbmIuaCAgIDAxLjA1LjAxICAgMDEuMDUuMDEgICAwMS4wNS4wMSAgIDAxLjA1LjAxICAgMDEuMDUuMDEKK21waV9zYXMuaCAgIDAxLjA1LjA1ICAgMDEuMDUuMDUgICAwMS4wNS4wNCAgIDAxLjA1LjA0ICAgMDEuMDUuMDQKK21waV90eXBlLmggIDAxLjA1LjAyICAgMDEuMDUuMDIgICAwMS4wNS4wMiAgIDAxLjA1LjAyICAgMDEuMDUuMDIKIAogRmlsZW5hbWUgICAgMDEuMDUuMTQgICAwMS4wNS4xMyAgIDAxLjA1LjEyICAgMDEuMDUuMTEgICAwMS4wNS4xMCAgIDAxLjA1LjA5CiAtLS0tLS0tLS0tICAtLS0tLS0tLSAgIC0tLS0tLS0tICAgLS0tLS0tLS0gICAtLS0tLS0tLSAgIC0tLS0tLS0tICAgLS0tLS0tLS0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbHNpL21waV9pbml0LmggYi9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL2xzaS9tcGlfaW5pdC5oCmluZGV4IGE5ZTM2OTMuLjQyOTVkMDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbHNpL21waV9pbml0LmgKKysrIGIvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9sc2kvbXBpX2luaXQuaApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiAgQ29weXJpZ2h0IChjKSAyMDAwLTIwMDcgTFNJIENvcnBvcmF0aW9uLgorICogIENvcHlyaWdodCAoYykgMjAwMC0yMDA4IExTSSBDb3Jwb3JhdGlvbi4KICAqCiAgKgogICogICAgICAgICAgIE5hbWU6ICBtcGlfaW5pdC5oCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL2xzaS9tcGlfaW9jLmggYi9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL2xzaS9tcGlfaW9jLmgKaW5kZXggNWNiYjZiZC4uOGZhYTRmYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9sc2kvbXBpX2lvYy5oCisrKyBiL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbHNpL21waV9pb2MuaApAQCAtMSwxMiArMSwxMiBAQAogLyoKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNyBMU0kgQ29ycG9yYXRpb24uCisgKiAgQ29weXJpZ2h0IChjKSAyMDAwLTIwMDggTFNJIENvcnBvcmF0aW9uLgogICoKICAqCiAgKiAgICAgICAgICAgTmFtZTogIG1waV9pb2MuaAogICogICAgICAgICAgVGl0bGU6ICBNUEkgSU9DLCBQb3J0LCBFdmVudCwgRlcgRG93bmxvYWQsIGFuZCBGVyBVcGxvYWQgbWVzc2FnZXMKICAqICBDcmVhdGlvbiBEYXRlOiAgQXVndXN0IDExLCAyMDAwCiAgKgotICogICAgbXBpX2lvYy5oIFZlcnNpb246ICAwMS4wNS4xNAorICogICAgbXBpX2lvYy5oIFZlcnNpb246ICAwMS4wNS4xNgogICoKICAqICBWZXJzaW9uIEhpc3RvcnkKICAqICAtLS0tLS0tLS0tLS0tLS0KQEAgLTExMyw2ICsxMTMsMTYgQEAKICAqICAgICAgICAgICAgICAgICAgICAgIGFkZGVkIF9NVUxUSV9QT1JUX0RPTUFJTi4KICAqICAwNS0yNC0wNyAgMDEuMDUuMTQgIEFkZGVkIENvbW1vbiBCb290IEJsb2NrIHR5cGUgdG8gRldEb3dubG9hZCBSZXF1ZXN0LgogICogICAgICAgICAgICAgICAgICAgICAgQWRkZWQgQ29tbW9uIEJvb3QgQmxvY2sgdHlwZSB0byBGV1VwbG9hZCBSZXF1ZXN0LgorICogIDA4LTA3LTA3ICAwMS4wNS4xNSAgQWRkZWQgTVBJX0VWRU5UX1NBU19JTklUX1JDX1JFTU9WRUQgZGVmaW5lLgorICogICAgICAgICAgICAgICAgICAgICAgQWRkZWQgTVBJX0VWRU5UX0lSMl9SQ19EVUFMX1BPUlRfQURERUQgYW5kCisgKiAgICAgICAgICAgICAgICAgICAgICBNUElfRVZFTlRfSVIyX1JDX0RVQUxfUE9SVF9SRU1PVkVEIGZvciBJUjIgZXZlbnQgZGF0YS4KKyAqICAgICAgICAgICAgICAgICAgICAgIEFkZGVkIFNBU0FkZHJlc3MgZmllbGQgdG8gU0FTIEluaXRpYXRvciBEZXZpY2UgVGFibGUKKyAqICAgICAgICAgICAgICAgICAgICAgIE92ZXJmbG93IGV2ZW50IGRhdGEgc3RydWN0dXJlLgorICogIDAzLTI4LTA4ICAwMS4wNS4xNiAgQWRkZWQgdHdvIG5ldyBSZWFzb25Db2RlIHZhbHVlcyB0byBTQVMgRGV2aWNlIFN0YXR1cworICogICAgICAgICAgICAgICAgICAgICAgQ2hhbmdlIEV2ZW50IGRhdGEgdG8gaW5kaWNhdGUgY29tcGxldGlvbiBvZiBpbnRlcm5hbGx5CisgKiAgICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZWQgdGFzayBtYW5hZ2VtZW50LgorICogICAgICAgICAgICAgICAgICAgICAgQWRkZWQgTVBJX0VWRU5UX0RTQ1ZSWV9FUlJfRFNfU0FUQV9JTklUX0ZBSUxVUkUgZGVmaW5lLgorICogICAgICAgICAgICAgICAgICAgICAgQWRkZWQgTVBJX0VWRU5UX1NBU19JTklUX1JDX0lOQUNDRVNTSUJMRSBkZWZpbmUuCiAgKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqLwogCkBAIC02MTIsNiArNjIyLDggQEAKICNkZWZpbmUgTVBJX0VWRU5UX1NBU19ERVZfU1RBVF9SQ19DTEVBUl9UQVNLX1NFVF9JTlRFUk5BTCAgICgweDBCKQogI2RlZmluZSBNUElfRVZFTlRfU0FTX0RFVl9TVEFUX1JDX1FVRVJZX1RBU0tfSU5URVJOQUwgICAgICAgKDB4MEMpCiAjZGVmaW5lIE1QSV9FVkVOVF9TQVNfREVWX1NUQVRfUkNfQVNZTkNfTk9USUZJQ0FUSU9OICAgICAgICAoMHgwRCkKKyNkZWZpbmUgTVBJX0VWRU5UX1NBU19ERVZfU1RBVF9SQ19DTVBMX0lOVEVSTkFMX0RFVl9SRVNFVCAgICgweDBFKQorI2RlZmluZSBNUElfRVZFTlRfU0FTX0RFVl9TVEFUX1JDX0NNUExfVEFTS19BQk9SVF9JTlRFUk5BTCAgKDB4MEYpCiAKIAogLyogU0NTSSBFdmVudCBkYXRhIGZvciBRdWV1ZSBGdWxsIGV2ZW50ICovCkBAIC03MDgsNiArNzIwLDggQEAKICNkZWZpbmUgTVBJX0VWRU5UX0lSMl9SQ19QRF9SRU1PVkVEICAgICAgICAgICAgICAgICAoMHgwNSkKICNkZWZpbmUgTVBJX0VWRU5UX0lSMl9SQ19GT1JFSUdOX0NGR19ERVRFQ1RFRCAgICAgICAoMHgwNikKICNkZWZpbmUgTVBJX0VWRU5UX0lSMl9SQ19SRUJVSUxEX01FRElVTV9FUlJPUiAgICAgICAoMHgwNykKKyNkZWZpbmUgTVBJX0VWRU5UX0lSMl9SQ19EVUFMX1BPUlRfQURERUQgICAgICAgICAgICAoMHgwOCkKKyNkZWZpbmUgTVBJX0VWRU5UX0lSMl9SQ19EVUFMX1BPUlRfUkVNT1ZFRCAgICAgICAgICAoMHgwOSkKIAogLyogZGVmaW5lcyBmb3IgbG9naWNhbCBkaXNrIHN0YXRlcyAqLwogI2RlZmluZSBNUElfTERfU1RBVEVfT1BUSU1BTCAgICAgICAgICAgICAgICAgICAgICAgICgweDAwKQpAQCAtODY3LDYgKzg4MSw3IEBACiAjZGVmaW5lIE1QSV9FVkVOVF9EU0NWUllfRVJSX0RTX1VOU1VQUE9SVEVEX0RFVklDRSAgICAgICAgICAoMHgwMDAwMDgwMCkKICNkZWZpbmUgTVBJX0VWRU5UX0RTQ1ZSWV9FUlJfRFNfTUFYX1NBVEFfVEFSR0VUUyAgICAgICAgICAgICgweDAwMDAxMDAwKQogI2RlZmluZSBNUElfRVZFTlRfRFNDVlJZX0VSUl9EU19NVUxUSV9QT1JUX0RPTUFJTiAgICAgICAgICAgKDB4MDAwMDIwMDApCisjZGVmaW5lIE1QSV9FVkVOVF9EU0NWUllfRVJSX0RTX1NBVEFfSU5JVF9GQUlMVVJFICAgICAgICAgICAoMHgwMDAwNDAwMCkKIAogLyogU0FTIFNNUCBFcnJvciBFdmVudCBkYXRhICovCiAKQEAgLTkwMiw2ICs5MTcsOCBAQAogCiAvKiBkZWZpbmVzIGZvciB0aGUgUmVhc29uQ29kZSBmaWVsZCBvZiB0aGUgU0FTIEluaXRpYXRvciBEZXZpY2UgU3RhdHVzIENoYW5nZSBldmVudCAqLwogI2RlZmluZSBNUElfRVZFTlRfU0FTX0lOSVRfUkNfQURERUQgICAgICAgICAgICAgICAgICgweDAxKQorI2RlZmluZSBNUElfRVZFTlRfU0FTX0lOSVRfUkNfUkVNT1ZFRCAgICAgICAgICAgICAgICgweDAyKQorI2RlZmluZSBNUElfRVZFTlRfU0FTX0lOSVRfUkNfSU5BQ0NFU1NJQkxFICAgICAgICAgICgweDAzKQogCiAvKiBTQVMgSW5pdGlhdG9yIERldmljZSBUYWJsZSBPdmVyZmxvdyBFdmVudCBkYXRhICovCiAKQEAgLTkxMCw2ICs5MjcsNyBAQAogICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIE1heEluaXQ7ICAgICAgICAgICAgICAgICAgICAvKiAwMGggKi8KICAgICBVOCAgICAgICAgICAgICAgICAgICAgICBDdXJyZW50SW5pdDsgICAgICAgICAgICAgICAgLyogMDFoICovCiAgICAgVTE2ICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQxOyAgICAgICAgICAgICAgICAgIC8qIDAyaCAqLworICAgIFU2NCAgICAgICAgICAgICAgICAgICAgIFNBU0FkZHJlc3M7ICAgICAgICAgICAgICAgICAvKiAwNGggKi8KIH0gRVZFTlRfREFUQV9TQVNfSU5JVF9UQUJMRV9PVkVSRkxPVywKICAgTVBJX1BPSU5URVIgUFRSX0VWRU5UX0RBVEFfU0FTX0lOSVRfVEFCTEVfT1ZFUkZMT1csCiAgIE1waUV2ZW50RGF0YVNhc0luaXRUYWJsZU92ZXJmbG93X3QsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL2xzaS9tcGlfbGFuLmggYi9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL2xzaS9tcGlfbGFuLmgKaW5kZXggMDMyNTNiNS4uZjQxZmNiNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9sc2kvbXBpX2xhbi5oCisrKyBiL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbHNpL21waV9sYW4uaApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiAgQ29weXJpZ2h0IChjKSAyMDAwLTIwMDQgTFNJIENvcnBvcmF0aW9uLgorICogIENvcHlyaWdodCAoYykgMjAwMC0yMDA4IExTSSBDb3Jwb3JhdGlvbi4KICAqCiAgKgogICogICAgICAgICAgIE5hbWU6ICBtcGlfbGFuLmgKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbHNpL21waV9sb2dfZmMuaCBiL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbHNpL21waV9sb2dfZmMuaAppbmRleCBlNGRhZmNlLi5mYWNlNmU3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL2xzaS9tcGlfbG9nX2ZjLmgKKysrIGIvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9sc2kvbXBpX2xvZ19mYy5oCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMSBMU0kgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiAgQ29weXJpZ2h0IChjKSAyMDAwLTIwMDggTFNJIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqICBOQU1FOiAgICAgICAgICAgZmNfbG9nLmgKICAqICBTVU1NQVJZOiAgICAgICAgTVBJIElvY0xvZ0luZm8gZGVmaW5pdGlvbnMgZm9yIHRoZSBTWU1GQzl4eCBjaGlwcwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9sc2kvbXBpX2xvZ19zYXMuaCBiL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbHNpL21waV9sb2dfc2FzLmgKaW5kZXggYWY5ZGEwMy4uNjkxNjIwZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9sc2kvbXBpX2xvZ19zYXMuaAorKysgYi9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL2xzaS9tcGlfbG9nX3Nhcy5oCkBAIC0xLDYgKzEsNiBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogIENvcHlyaWdodCAyMDAzIExTSSBDb3Jwb3JhdGlvbi4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgICAgICAgICAgKgorICogIENvcHlyaWdodCAoYykgMjAwMC0yMDA4IExTSSBDb3Jwb3JhdGlvbi4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgICAgICAgKgogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgogICogRGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgogICogLS0tLS0tLS0tLS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgpAQCAtNzMsNiArNzMsOCBAQAogI2RlZmluZSBJT1BfTE9HSU5GT19DT0RFX1RBUkdFVF9NT0RFX0FCT1JUX0VYQUNUX0lPICAgICAgICAgICgweDAwMDcwMDA0KQogI2RlZmluZSBJT1BfTE9HSU5GT19DT0RFX1RBUkdFVF9NT0RFX0FCT1JUX0VYQUNUX0lPX1JFUSAgICAgICgweDAwMDcwMDA1KQogCisjZGVmaW5lIElPUF9MT0dJTkZPX0NPREVfTE9HX1RJTUVTVEFNUF9FVkVOVCAgICAgICAgICAgICAgICAgKDB4MDAwODAwMDApCisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogUEwgTE9HSU5GT19DT0RFIGRlZmluZXMsIHZhbGlkIGlmIElPQ19MT0dJTkZPX09SSUdJTkFUT1IgPSBQTCAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTkyLDcgKzk0LDcgQEAKICNkZWZpbmUgUExfTE9HSU5GT19TVUJfQ09ERV9PUEVOX0ZBSUxfT1BFTl9USU1FT1VUX0VYUCAgICAgICAoMHgwMDAwMDAwQykKICNkZWZpbmUgUExfTE9HSU5GT19TVUJfQ09ERV9PUEVOX0ZBSUxfVU5VU0VEXzBEICAgICAgICAgICAgICAoMHgwMDAwMDAwRCkKICNkZWZpbmUgUExfTE9HSU5GT19TVUJfQ09ERV9PUEVOX0ZBSUxfRFZUQkxFX0FDQ1NTX0ZBSUwgICAgICAoMHgwMDAwMDAwRSkKLSNkZWZpbmUgUExfTE9HSU5GT19TVUIgQ09ERV9PUEVOX0ZBSUxfQkFEX0RFU1QgICAgICAgICAgICAgICAoMHgwMDAwMDAxMSkKKyNkZWZpbmUgUExfTE9HSU5GT19TVUJfQ09ERV9PUEVOX0ZBSUxfQkFEX0RFU1QgICAgICAgICAgICAgICAoMHgwMDAwMDAxMSkKICNkZWZpbmUgUExfTE9HSU5GT19TVUJfQ09ERV9PUEVOX0ZBSUxfUkFURV9OT1RfU1VQUCAgICAgICAgICAoMHgwMDAwMDAxMikKICNkZWZpbmUgUExfTE9HSU5GT19TVUJfQ09ERV9PUEVOX0ZBSUxfUFJPVF9OT1RfU1VQUCAgICAgICAgICAoMHgwMDAwMDAxMykKICNkZWZpbmUgUExfTE9HSU5GT19TVUJfQ09ERV9PUEVOX0ZBSUxfUkVTRVJWRURfQUJBTkRPTjAgICAgICAoMHgwMDAwMDAxNCkKQEAgLTE1OSwxMCArMTYxLDExIEBACiAKICNkZWZpbmUgUExfTE9HSU5GT19TVUJfQ09ERV9JTlZBTElEX1NHTCAgICAgICAgICAgICAgICAgICAgICAoMHgwMDAwMDIwMCkKICNkZWZpbmUgUExfTE9HSU5GT19TVUJfQ09ERV9XUk9OR19SRUxfT0ZGX09SX0ZSQU1FX0xFTkdUSCAgICAoMHgwMDAwMDMwMCkKLSNkZWZpbmUgUExfTE9HSU5GT19TVUJfQ09ERV9GUkFNRV9YRkVSX0VSUk9SICAgICAgICAgICAgICAgICAoMHgwMDAwMDQwMCkgLyogQml0cyAwLTMgZW5jb2RlIFRyYW5zcG9ydCBTdGF0dXMgUmVnaXN0ZXIgKG9mZnNldCAweDA4KSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBCaXQgMCBpcyBTdGF0dXMgQml0IDA6IEZyYW1lWGZlckVyciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBCaXQgMSAmIDIgYXJlIFN0YXR1cyBCaXRzIDE2IGFuZCAxNzogRnJhbWVYbWl0RXJyU3RhdHVzICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEJpdCAzIGlzIFN0YXR1cyBCaXQgMTggV3JpdGVEYXRhTGVuZ3RoR1REYXRhTGVuZ3RoRXJyICovCisjZGVmaW5lIFBMX0xPR0lORk9fU1VCX0NPREVfRlJBTUVfWEZFUl9FUlJPUiAgICAgICAgICAgICAgICAgKDB4MDAwMDA0MDApCisvKiBCaXRzIDAtMyBlbmNvZGUgVHJhbnNwb3J0IFN0YXR1cyBSZWdpc3RlciAob2Zmc2V0IDB4MDgpICovCisvKiBCaXQgMCBpcyBTdGF0dXMgQml0IDA6IEZyYW1lWGZlckVyciAqLworLyogQml0IDEgJiAyIGFyZSBTdGF0dXMgQml0cyAxNiBhbmQgMTc6IEZyYW1lWG1pdEVyclN0YXR1cyAqLworLyogQml0IDMgaXMgU3RhdHVzIEJpdCAxOCBXcml0ZURhdGFMZW5naHRHVERhdGFMZW5ndGhFcnIgKi8KIAogI2RlZmluZSBQTF9MT0dJTkZPX1NVQl9DT0RFX1RYX0ZNX0NPTk5FQ1RFRF9MT1cgICAgICAgICAgICAgICgweDAwMDAwNTAwKQogI2RlZmluZSBQTF9MT0dJTkZPX1NVQl9DT0RFX1NBVEFfTk9OX05DUV9SV19FUlJfQklUX1NFVCAgICAgICgweDAwMDAwNjAwKQpAQCAtMTc3LDYgKzE4MCwxMSBAQAogI2RlZmluZSBQTF9MT0dJTkZPX1NVQl9DT0RFX0RJU0NPVkVSWV9SRU1PVEVfU0VQX1JFU0VUICAgICAgICgweDAwMDAwRTAxKQogI2RlZmluZSBQTF9MT0dJTkZPX1NVQl9DT0RFX1NFQ09ORF9PUEVOICAgICAgICAgICAgICAgICAgICAgICgweDAwMDAwRjAwKQogI2RlZmluZSBQTF9MT0dJTkZPX1NVQl9DT0RFX0RTQ1ZSWV9TQVRBX0lOSVRfVElNRU9VVCAgICAgICAgICgweDAwMDAxMDAwKQorI2RlZmluZSBQTF9MT0dJTkZPX1NVQl9DT0RFX0JSRUFLX09OX1NBVEFfQ09OTkVDVElPTiAgICAgICAgICgweDAwMDAyMDAwKQorLyogbm90IGN1cnJlbnRseSB1c2VkIGluIG1haW5saW5lICovCisjZGVmaW5lIFBMX0xPR0lORk9fU1VCX0NPREVfQlJFQUtfT05fU1RVQ0tfTElOSyAgICAgICAgICAgICAgKDB4MDAwMDMwMDApCisjZGVmaW5lIFBMX0xPR0lORk9fU1VCX0NPREVfQlJFQUtfT05fU1RVQ0tfTElOS19BSVAgICAgICAgICAgKDB4MDAwMDQwMDApCisjZGVmaW5lIFBMX0xPR0lORk9fU1VCX0NPREVfQlJFQUtfT05fSU5DT01QTEVURV9CUkVBS19SQ1ZEICAgKDB4MDAwMDUwMDApCiAKICNkZWZpbmUgUExfTE9HSU5GT19DT0RFX0VOQ0xfTUdNVF9TTVBfRlJBTUVfRkFJTFVSRSAgICAgICAgICAoMHgwMDIwMDAwMCkgLyogQ2FuJ3QgZ2V0IFNNUCBGcmFtZSAqLwogI2RlZmluZSBQTF9MT0dJTkZPX0NPREVfRU5DTF9NR01UX1NNUF9SRUFEX0VSUk9SICAgICAgICAgICAgICgweDAwMjAwMDEwKSAvKiBFcnJvciBvY2N1cmVkIG9uIFNNUCBSZWFkICovCkBAIC0yNDMsNiArMjUxLDggQEAKICNkZWZpbmUgSVJfTE9HSU5GT19WT0xVTUVfQUNUSVZBVEVfVk9MVU1FX0ZBSUxFRCAgICAgICAgICAgICAgICgweDAwMDEwMDE0KQogLyogQWN0aXZhdGlvbiBmYWlsZWQgdHJ5aW5nIHRvIGltcG9ydCB0aGUgdm9sdW1lICovCiAjZGVmaW5lIElSX0xPR0lORk9fVk9MVU1FX0FDVElWQVRJTkdfSU1QT1JUX1ZPTFVNRV9GQUlMRUQgICAgICAoMHgwMDAxMDAxNSkKKy8qIEFjdGl2YXRpb24gZmFpbGVkIHRyeWluZyB0byBpbXBvcnQgdGhlIHZvbHVtZSAqLworI2RlZmluZSBJUl9MT0dJTkZPX1ZPTFVNRV9BQ1RJVkFUSU5HX1RPT19NQU5ZX1BIWVNfRElTS1MgICAgICAgKDB4MDAwMTAwMTYpCiAKIC8qIFBoeXMgRGlzayBmYWlsZWQsIHRvbyBtYW55IHBoeXMgZGlza3MgKi8KICNkZWZpbmUgSVJfTE9HSU5GT19QSFlTRElTS19DUkVBVEVfVE9PX01BTllfRElTS1MgICAgICAgICAgICAgICgweDAwMDEwMDIwKQpAQCAtMjg1LDYgKzI5NSwyMSBAQAogLyogQ29tcGF0aWJpbGl0eSBFcnJvciA6IElNRSBzaXplIGxpbWl0ZWQgdG8gPCAyVEIgKi8KICNkZWZpbmUgSVJfTE9HSU5GT19DT01QQVRfRVJST1JfSU1FX1ZPTF9OT1RfQ1VSUkVOVExZX1NVUFBPUlRFRCAoMHgwMDAxMDAzRCkKIAorLyogRGV2aWNlIEZpcm13YXJlIFVwZGF0ZTogREZVIGNhbiBvbmx5IGJlIHN0YXJ0ZWQgb25jZSAqLworI2RlZmluZSBJUl9MT0dJTkZPX0RFVl9GV19VUERBVEVfRVJSX0RGVV9JTl9QUk9HUkVTUyAgICAgICAgICAgICgweDAwMDEwMDUwKQorLyogRGV2aWNlIEZpcm13YXJlIFVwZGF0ZTogVm9sdW1lIG11c3QgYmUgT3B0aW1hbC9BY3RpdmUvbm9uLVF1aWVzY2VkICovCisjZGVmaW5lIElSX0xPR0lORk9fREVWX0ZXX1VQREFURV9FUlJfREVWSUNFX0lOX0lOVkFMSURfU1RBVEUgICAgKDB4MDAwMTAwNTEpCisvKiBEZXZpY2UgRmlybXdhcmUgVXBkYXRlOiBERlUgVGltZW91dCBjYW5ub3QgYmUgemVybyAqLworI2RlZmluZSBJUl9MT0dJTkZPX0RFVl9GV19VUERBVEVfRVJSX0lOVkFMSURfVElNRU9VVCAgICAgICAgICAgICgweDAwMDEwMDUyKQorLyogRGV2aWNlIEZpcm13YXJlIFVwZGF0ZTogQ1JFQVRFIFRJTUVSIEZBSUxFRCAqLworI2RlZmluZSBJUl9MT0dJTkZPX0RFVl9GV19VUERBVEVfRVJSX05PX1RJTUVSUyAgICAgICAgICAgICAgICAgICgweDAwMDEwMDUzKQorLyogRGV2aWNlIEZpcm13YXJlIFVwZGF0ZTogRmFpbGVkIHRvIHJlYWQgU0FTX0lPX1VOSVRfUEdfMSAqLworI2RlZmluZSBJUl9MT0dJTkZPX0RFVl9GV19VUERBVEVfRVJSX1JFQURJTkdfQ0ZHX1BBR0UgICAgICAgICAgICgweDAwMDEwMDU0KQorLyogRGV2aWNlIEZpcm13YXJlIFVwZGF0ZTogSW52YWxpZCBTQVNfSU9fVU5JVF9QR18xIHZhbHVlKHMpICovCisjZGVmaW5lIElSX0xPR0lORk9fREVWX0ZXX1VQREFURV9FUlJfUE9SVF9JT19USU1FT1VUU19SRVFVSVJFRCAgKDB4MDAwMTAwNTUpCisvKiBEZXZpY2UgRmlybXdhcmUgVXBkYXRlOiBVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBwYWdlICovCisjZGVmaW5lIElSX0xPR0lORk9fREVWX0ZXX1VQREFURV9FUlJfQUxMT0NfQ0ZHX1BBR0UgICAgICAgICAgICAgKDB4MDAwMTAwNTYpCisKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiBEZWZpbmVzIGZvciBjb252ZW5pZW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbHNpL21waV9yYWlkLmggYi9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL2xzaS9tcGlfcmFpZC5oCmluZGV4IDI4NTYxMDguLmFkZDYwY2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbHNpL21waV9yYWlkLmgKKysrIGIvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9sc2kvbXBpX3JhaWQuaApAQCAtMSwxMiArMSwxMiBAQAogLyoKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwNyBMU0kgQ29ycG9yYXRpb24uCisgKiAgQ29weXJpZ2h0IChjKSAyMDAxLTIwMDggTFNJIENvcnBvcmF0aW9uLgogICoKICAqCiAgKiAgICAgICAgICAgTmFtZTogIG1waV9yYWlkLmgKICAqICAgICAgICAgIFRpdGxlOiAgTVBJIFJBSUQgbWVzc2FnZSBhbmQgc3RydWN0dXJlcwogICogIENyZWF0aW9uIERhdGU6ICBGZWJydWFyeSAyNywgMjAwMQogICoKLSAqICAgIG1waV9yYWlkLmggVmVyc2lvbjogIDAxLjA1LjAzCisgKiAgICBtcGlfcmFpZC5oIFZlcnNpb246ICAwMS4wNS4wNQogICoKICAqICBWZXJzaW9uIEhpc3RvcnkKICAqICAtLS0tLS0tLS0tLS0tLS0KQEAgLTM0LDYgKzM0LDkgQEAKICAqICAgICAgICAgICAgICAgICAgICAgIF9TRVRfUkVTWU5DX1JBVEUgYW5kIF9TRVRfREFUQV9TQ1JVQl9SQVRFLgogICogIDAyLTI4LTA3ICAwMS4wNS4wMyAgQWRkZWQgbmV3IFJBSUQgQWN0aW9uLCBEZXZpY2UgRlcgVXBkYXRlIE1vZGUsIGFuZAogICogICAgICAgICAgICAgICAgICAgICAgYXNzb2NpYXRlZCBkZWZpbmVzLgorICogIDA4LTA3LTA3ICAwMS4wNS4wNCAgQWRkZWQgRGlzYWJsZSBGdWxsIFJlYnVpbGQgYml0IHRvIHRoZSBBY3Rpb25EYXRhV29yZAorICogICAgICAgICAgICAgICAgICAgICAgZm9yIHRoZSBSQUlEIEFjdGlvbiBNUElfUkFJRF9BQ1RJT05fRElTQUJMRV9WT0xVTUUuCisgKiAgMDEtMTUtMDggIDAxLjA1LjA1ICBBZGRlZCBkZWZpbmUgZm9yIE1QSV9SQUlEX0FDVElPTl9TRVRfVk9MVU1FX05BTUUuCiAgKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqLwogCkBAIC05Myw2ICs5Niw3IEBACiAjZGVmaW5lIE1QSV9SQUlEX0FDVElPTl9TRVRfUkVTWU5DX1JBVEUgICAgICAgICAgICAgKDB4MTMpCiAjZGVmaW5lIE1QSV9SQUlEX0FDVElPTl9TRVRfREFUQV9TQ1JVQl9SQVRFICAgICAgICAgKDB4MTQpCiAjZGVmaW5lIE1QSV9SQUlEX0FDVElPTl9ERVZJQ0VfRldfVVBEQVRFX01PREUgICAgICAgKDB4MTUpCisjZGVmaW5lIE1QSV9SQUlEX0FDVElPTl9TRVRfVk9MVU1FX05BTUUgICAgICAgICAgICAgKDB4MTYpCiAKIC8qIEFjdGlvbkRhdGFXb3JkIGRlZmluZXMgZm9yIHVzZSB3aXRoIE1QSV9SQUlEX0FDVElPTl9DUkVBVEVfVk9MVU1FIGFjdGlvbiAqLwogI2RlZmluZSBNUElfUkFJRF9BQ1RJT05fQURBVEFfRE9fTk9UX1NZTkMgICAgICAgICAgICgweDAwMDAwMDAxKQpAQCAtMTA1LDYgKzEwOSw5IEBACiAjZGVmaW5lIE1QSV9SQUlEX0FDVElPTl9BREFUQV9LRUVQX0xCQTAgICAgICAgICAgICAgKDB4MDAwMDAwMDApCiAjZGVmaW5lIE1QSV9SQUlEX0FDVElPTl9BREFUQV9aRVJPX0xCQTAgICAgICAgICAgICAgKDB4MDAwMDAwMDIpCiAKKy8qIEFjdGlvbkRhdGFXb3JkIGRlZmluZXMgZm9yIHVzZSB3aXRoIE1QSV9SQUlEX0FDVElPTl9ESVNBQkxFX1ZPTFVNRSBhY3Rpb24gKi8KKyNkZWZpbmUgTVBJX1JBSURfQUNUSU9OX0FEQVRBX0RJU0FCTEVfRlVMTF9SRUJVSUxEICAoMHgwMDAwMDAwMSkKKwogLyogQWN0aW9uRGF0YVdvcmQgZGVmaW5lcyBmb3IgdXNlIHdpdGggTVBJX1JBSURfQUNUSU9OX0FDVElWQVRFX1ZPTFVNRSBhY3Rpb24gKi8KICNkZWZpbmUgTVBJX1JBSURfQUNUSU9OX0FEQVRBX0lOQUNUSVZBVEVfQUxMICAgICAgICAoMHgwMDAwMDAwMSkKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9sc2kvbXBpX3Nhcy5oIGIvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9sc2kvbXBpX3Nhcy5oCmluZGV4IDMzZmNhODMuLmFiNDEwMDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbHNpL21waV9zYXMuaAorKysgYi9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL2xzaS9tcGlfc2FzLmgKQEAgLTEsMTIgKzEsMTIgQEAKIC8qCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYgTFNJIENvcnBvcmF0aW9uLgorICogIENvcHlyaWdodCAoYykgMjAwNC0yMDA4IExTSSBDb3Jwb3JhdGlvbi4KICAqCiAgKgogICogICAgICAgICAgIE5hbWU6ICBtcGlfc2FzLmgKICAqICAgICAgICAgIFRpdGxlOiAgTVBJIFNlcmlhbCBBdHRhY2hlZCBTQ1NJIHN0cnVjdHVyZXMgYW5kIGRlZmluaXRpb25zCiAgKiAgQ3JlYXRpb24gRGF0ZTogIEF1Z3VzdCAxOSwgMjAwNAogICoKLSAqICAgIG1waV9zYXMuaCBWZXJzaW9uOiAgMDEuMDUuMDQKKyAqICAgIG1waV9zYXMuaCBWZXJzaW9uOiAgMDEuMDUuMDUKICAqCiAgKiAgVmVyc2lvbiBIaXN0b3J5CiAgKiAgLS0tLS0tLS0tLS0tLS0tCkBAIC0yMyw2ICsyMywxMCBAQAogICogICAgICAgICAgICAgICAgICAgICAgcmVwbHkuCiAgKiAgMTAtMTEtMDYgIDAxLjA1LjA0ICBGaXhlZCB0aGUgbmFtZSBvZiBhIGRlZmluZSBmb3IgT3BlcmF0aW9uIGZpZWxkIG9mIFNBUyBJTwogICogICAgICAgICAgICAgICAgICAgICAgVW5pdCBDb250cm9sIHJlcXVlc3QuCisgKiAgMDEtMTUtMDggIDAxLjA1LjA1ICBBZGRlZCBzdXBwb3J0IGZvciBNUElfU0FTX09QX1NFVF9JT0NfUEFSQU1FVEVSLAorICogICAgICAgICAgICAgICAgICAgICAgaW5jbHVkaW5nIGFkZGluZyBJT0NQYXJhbWV0ZXIgYW5kIElPQ1BhcmFtZXRlciB2YWx1ZQorICogICAgICAgICAgICAgICAgICAgICAgZmllbGRzIHRvIFNBUyBJTyBVbml0IENvbnRyb2wgUmVxdWVzdC4KKyAqICAgICAgICAgICAgICAgICAgICAgIEFkZGVkIE1QSV9TQVNfREVWSUNFX0lORk9fUFJPRFVDVF9TUEVDSUZJQyBkZWZpbmUuCiAgKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqLwogCkBAIC02MCw2ICs2NCw4IEBACiAgKiBWYWx1ZXMgZm9yIHRoZSBTQVMgRGV2aWNlSW5mbyBmaWVsZCB1c2VkIGluIFNBUyBEZXZpY2UgU3RhdHVzIENoYW5nZSBFdmVudAogICogZGF0YSBhbmQgU0FTIElPIFVuaXQgQ29uZmlndXJhdGlvbiBwYWdlcy4KICAqLworI2RlZmluZSBNUElfU0FTX0RFVklDRV9JTkZPX1BST0RVQ1RfU1BFQ0lGSUMgICAgKDB4RjAwMDAwMDApCisKICNkZWZpbmUgTVBJX1NBU19ERVZJQ0VfSU5GT19TRVAgICAgICAgICAgICAgICAgICgweDAwMDA0MDAwKQogI2RlZmluZSBNUElfU0FTX0RFVklDRV9JTkZPX0FUQVBJX0RFVklDRSAgICAgICAgKDB4MDAwMDIwMDApCiAjZGVmaW5lIE1QSV9TQVNfREVWSUNFX0lORk9fTFNJX0RFVklDRSAgICAgICAgICAoMHgwMDAwMTAwMCkKQEAgLTIxNiw3ICsyMjIsNyBAQAogICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIENoYWluT2Zmc2V0OyAgICAgICAgLyogMDJoICovCiAgICAgVTggICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb247ICAgICAgICAgICAvKiAwM2ggKi8KICAgICBVMTYgICAgICAgICAgICAgICAgICAgICBEZXZIYW5kbGU7ICAgICAgICAgIC8qIDA0aCAqLwotICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkMzsgICAgICAgICAgLyogMDZoICovCisgICAgVTggICAgICAgICAgICAgICAgICAgICAgSU9DUGFyYW1ldGVyOyAgICAgICAvKiAwNmggKi8KICAgICBVOCAgICAgICAgICAgICAgICAgICAgICBNc2dGbGFnczsgICAgICAgICAgIC8qIDA3aCAqLwogICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIE1zZ0NvbnRleHQ7ICAgICAgICAgLyogMDhoICovCiAgICAgVTggICAgICAgICAgICAgICAgICAgICAgVGFyZ2V0SUQ7ICAgICAgICAgICAvKiAwQ2ggKi8KQEAgLTIyNSw3ICsyMzEsNyBAQAogICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIFByaW1GbGFnczsgICAgICAgICAgLyogMEZoICovCiAgICAgVTMyICAgICAgICAgICAgICAgICAgICAgUHJpbWl0aXZlOyAgICAgICAgICAvKiAxMGggKi8KICAgICBVNjQgICAgICAgICAgICAgICAgICAgICBTQVNBZGRyZXNzOyAgICAgICAgIC8qIDE0aCAqLwotICAgIFUzMiAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkNDsgICAgICAgICAgLyogMUNoICovCisgICAgVTMyICAgICAgICAgICAgICAgICAgICAgSU9DUGFyYW1ldGVyVmFsdWU7ICAvKiAxQ2ggKi8KIH0gTVNHX1NBU19JT1VOSVRfQ09OVFJPTF9SRVFVRVNULCBNUElfUE9JTlRFUiBQVFJfTVNHX1NBU19JT1VOSVRfQ09OVFJPTF9SRVFVRVNULAogICBTYXNJb1VuaXRDb250cm9sUmVxdWVzdF90LCBNUElfUE9JTlRFUiBwU2FzSW9Vbml0Q29udHJvbFJlcXVlc3RfdDsKIApAQCAtMjQxLDYgKzI0Nyw4IEBACiAjZGVmaW5lIE1QSV9TQVNfT1BfVFJBTlNNSVRfUE9SVF9TRUxFQ1RfU0lHTkFMICAoMHgwQykKICNkZWZpbmUgTVBJX1NBU19PUF9UUkFOU01JVF9SRU1PVkVfREVWSUNFICAgICAgICgweDBEKSAgLyogb2Jzb2xldGUgbmFtZSAqLwogI2RlZmluZSBNUElfU0FTX09QX1JFTU9WRV9ERVZJQ0UgICAgICAgICAgICAgICAgKDB4MEQpCisjZGVmaW5lIE1QSV9TQVNfT1BfU0VUX0lPQ19QQVJBTUVURVIgICAgICAgICAgICAoMHgwRSkKKyNkZWZpbmUgTVBJX1NBU19PUF9QUk9EVUNUX1NQRUNJRklDX01JTiAgICAgICAgICgweDgwKQogCiAvKiB2YWx1ZXMgZm9yIHRoZSBQcmltRmxhZ3MgZmllbGQgKi8KICNkZWZpbmUgTVBJX1NBU19QUklNRkxBR1NfU0lOR0xFICAgICAgICAgICAgICAgICgweDA4KQpAQCAtMjU2LDcgKzI2NCw3IEBACiAgICAgVTggICAgICAgICAgICAgICAgICAgICAgTXNnTGVuZ3RoOyAgICAgICAgICAvKiAwMmggKi8KICAgICBVOCAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbjsgICAgICAgICAgIC8qIDAzaCAqLwogICAgIFUxNiAgICAgICAgICAgICAgICAgICAgIERldkhhbmRsZTsgICAgICAgICAgLyogMDRoICovCi0gICAgVTggICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQzOyAgICAgICAgICAvKiAwNmggKi8KKyAgICBVOCAgICAgICAgICAgICAgICAgICAgICBJT0NQYXJhbWV0ZXI7ICAgICAgIC8qIDA2aCAqLwogICAgIFU4ICAgICAgICAgICAgICAgICAgICAgIE1zZ0ZsYWdzOyAgICAgICAgICAgLyogMDdoICovCiAgICAgVTMyICAgICAgICAgICAgICAgICAgICAgTXNnQ29udGV4dDsgICAgICAgICAvKiAwOGggKi8KICAgICBVMTYgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDQ7ICAgICAgICAgIC8qIDBDaCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9sc2kvbXBpX3RhcmcuaCBiL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbHNpL21waV90YXJnLmgKaW5kZXggZmY4YzM3ZC4uYzNkZWE3ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9sc2kvbXBpX3RhcmcuaAorKysgYi9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL2xzaS9tcGlfdGFyZy5oCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNCBMU0kgQ29ycG9yYXRpb24uCisgKiAgQ29weXJpZ2h0IChjKSAyMDAwLTIwMDggTFNJIENvcnBvcmF0aW9uLgogICoKICAqCiAgKiAgICAgICAgICAgTmFtZTogIG1waV90YXJnLmgKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbHNpL21waV90b29sLmggYi9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL2xzaS9tcGlfdG9vbC5oCmluZGV4IDg4MzRhZTYuLjUzY2Q3MTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbHNpL21waV90b29sLmgKKysrIGIvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9sc2kvbXBpX3Rvb2wuaApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiAgQ29weXJpZ2h0IChjKSAyMDAxLTIwMDUgTFNJIENvcnBvcmF0aW9uLgorICogIENvcHlyaWdodCAoYykgMjAwMS0yMDA4IExTSSBDb3Jwb3JhdGlvbi4KICAqCiAgKgogICogICAgICAgICAgIE5hbWU6ICBtcGlfdG9vbC5oCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL2xzaS9tcGlfdHlwZS5oIGIvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9sc2kvbXBpX3R5cGUuaAppbmRleCAwOGRhZDljLi44ODhiMjZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL2xzaS9tcGlfdHlwZS5oCisrKyBiL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbHNpL21waV90eXBlLmgKQEAgLTEsMTIgKzEsMTIgQEAKIC8qCi0gKiAgQ29weXJpZ2h0IChjKSAyMDAwLTIwMDQgTFNJIENvcnBvcmF0aW9uLgorICogIENvcHlyaWdodCAoYykgMjAwMC0yMDA4IExTSSBDb3Jwb3JhdGlvbi4KICAqCiAgKgogICogICAgICAgICAgIE5hbWU6ICBtcGlfdHlwZS5oCiAgKiAgICAgICAgICBUaXRsZTogIE1QSSBCYXNpYyB0eXBlIGRlZmluaXRpb25zCiAgKiAgQ3JlYXRpb24gRGF0ZTogIEp1bmUgNiwgMjAwMAogICoKLSAqICAgIG1waV90eXBlLmggVmVyc2lvbjogIDAxLjA1LjAxCisgKiAgICBtcGlfdHlwZS5oIFZlcnNpb246ICAwMS4wNS4wMgogICoKICAqICBWZXJzaW9uIEhpc3RvcnkKICAqICAtLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0YmFzZS5jIGIvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9tcHRiYXNlLmMKaW5kZXggYzRlOGI5YS4uOTZhYzg4MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9tcHRiYXNlLmMKKysrIGIvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9tcHRiYXNlLmMKQEAgLTc5LDkgKzc5LDIyIEBACiAvKgogICogIGNtZCBsaW5lIHBhcmFtZXRlcnMKICAqLwotc3RhdGljIGludCBtcHRfbXNpX2VuYWJsZSA9IC0xOwotbW9kdWxlX3BhcmFtKG1wdF9tc2lfZW5hYmxlLCBpbnQsIDApOwotTU9EVUxFX1BBUk1fREVTQyhtcHRfbXNpX2VuYWJsZSwgIiBNU0kgU3VwcG9ydCBFbmFibGUgKGRlZmF1bHQ9MCkiKTsKKworc3RhdGljIGludCBtcHRfbXNpX2VuYWJsZV9zcGk7Cittb2R1bGVfcGFyYW0obXB0X21zaV9lbmFibGVfc3BpLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhtcHRfbXNpX2VuYWJsZV9zcGksICIgRW5hYmxlIE1TSSBTdXBwb3J0IGZvciBTUEkgXAorCQljb250cm9sbGVycyAoZGVmYXVsdD0wKSIpOworCitzdGF0aWMgaW50IG1wdF9tc2lfZW5hYmxlX2ZjOworbW9kdWxlX3BhcmFtKG1wdF9tc2lfZW5hYmxlX2ZjLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhtcHRfbXNpX2VuYWJsZV9mYywgIiBFbmFibGUgTVNJIFN1cHBvcnQgZm9yIEZDIFwKKwkJY29udHJvbGxlcnMgKGRlZmF1bHQ9MCkiKTsKKworc3RhdGljIGludCBtcHRfbXNpX2VuYWJsZV9zYXM7Cittb2R1bGVfcGFyYW0obXB0X21zaV9lbmFibGVfc2FzLCBpbnQsIDEpOworTU9EVUxFX1BBUk1fREVTQyhtcHRfbXNpX2VuYWJsZV9zYXMsICIgRW5hYmxlIE1TSSBTdXBwb3J0IGZvciBTQVMgXAorCQljb250cm9sbGVycyAoZGVmYXVsdD0xKSIpOworCiAKIHN0YXRpYyBpbnQgbXB0X2NoYW5uZWxfbWFwcGluZzsKIG1vZHVsZV9wYXJhbShtcHRfY2hhbm5lbF9tYXBwaW5nLCBpbnQsIDApOwpAQCAtOTEsNyArMTA0LDE3IEBACiBzdGF0aWMgaW50IG1wdF9zZXRfZGVidWdfbGV2ZWwoY29uc3QgY2hhciAqdmFsLCBzdHJ1Y3Qga2VybmVsX3BhcmFtICprcCk7CiBtb2R1bGVfcGFyYW1fY2FsbChtcHRfZGVidWdfbGV2ZWwsIG1wdF9zZXRfZGVidWdfbGV2ZWwsIHBhcmFtX2dldF9pbnQsCiAJCSAgJm1wdF9kZWJ1Z19sZXZlbCwgMDYwMCk7Ci1NT0RVTEVfUEFSTV9ERVNDKG1wdF9kZWJ1Z19sZXZlbCwgIiBkZWJ1ZyBsZXZlbCAtIHJlZmVyIHRvIG1wdGRlYnVnLmggLSAoZGVmYXVsdD0wKSIpOworTU9EVUxFX1BBUk1fREVTQyhtcHRfZGVidWdfbGV2ZWwsICIgZGVidWcgbGV2ZWwgLSByZWZlciB0byBtcHRkZWJ1Zy5oIFwKKwktIChkZWZhdWx0PTApIik7CisKK2ludCBtcHRfZndmYXVsdF9kZWJ1ZzsKK0VYUE9SVF9TWU1CT0wobXB0X2Z3ZmF1bHRfZGVidWcpOworbW9kdWxlX3BhcmFtX2NhbGwobXB0X2Z3ZmF1bHRfZGVidWcsIHBhcmFtX3NldF9pbnQsIHBhcmFtX2dldF9pbnQsCisJICAmbXB0X2Z3ZmF1bHRfZGVidWcsIDA2MDApOworTU9EVUxFX1BBUk1fREVTQyhtcHRfZndmYXVsdF9kZWJ1ZywgIkVuYWJsZSBkZXRlY3Rpb24gb2YgRmlybXdhcmUgZmF1bHQiCisJIiBhbmQgaGFsdCBGaXJtd2FyZSBvbiBmYXVsdCAtIChkZWZhdWx0PTApIik7CisKKwogCiAjaWZkZWYgTUZDTlQKIHN0YXRpYyBpbnQgbWZjb3VudGVyID0gMDsKQEAgLTE3NTEsMTYgKzE3NzQsMjUgQEAKIAkJaW9jLT5idXNfdHlwZSA9IFNBUzsKIAl9CiAKLQlpZiAobXB0X21zaV9lbmFibGUgPT0gLTEpIHsKLQkJLyogRW5hYmxlIG9uIFNBUywgZGlzYWJsZSBvbiBGQyBhbmQgU1BJICovCi0JCWlmIChpb2MtPmJ1c190eXBlID09IFNBUykKLQkJCWlvYy0+bXNpX2VuYWJsZSA9IDE7Ci0JCWVsc2UKLQkJCWlvYy0+bXNpX2VuYWJsZSA9IDA7Ci0JfSBlbHNlCi0JCS8qIGZvbGxvdyBmbGFnOiAwIC0gZGlzYWJsZTsgMSAtIGVuYWJsZSAqLwotCQlpb2MtPm1zaV9lbmFibGUgPSBtcHRfbXNpX2VuYWJsZTsKIAorCXN3aXRjaCAoaW9jLT5idXNfdHlwZSkgeworCisJY2FzZSBTQVM6CisJCWlvYy0+bXNpX2VuYWJsZSA9IG1wdF9tc2lfZW5hYmxlX3NhczsKKwkJYnJlYWs7CisKKwljYXNlIFNQSToKKwkJaW9jLT5tc2lfZW5hYmxlID0gbXB0X21zaV9lbmFibGVfc3BpOworCQlicmVhazsKKworCWNhc2UgRkM6CisJCWlvYy0+bXNpX2VuYWJsZSA9IG1wdF9tc2lfZW5hYmxlX2ZjOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWlvYy0+bXNpX2VuYWJsZSA9IDA7CisJCWJyZWFrOworCX0KIAlpZiAoaW9jLT5lcnJhdGFfZmxhZ18xMDY0KQogCQlwY2lfZGlzYWJsZV9pb19hY2Nlc3MocGRldik7CiAKQEAgLTYzMTMsNiArNjM0NSwzMyBAQAogCSpzaXplID0geTsKIH0KIAorCisvKioKKyAqCW1wdF9oYWx0X2Zpcm13YXJlIC0gSGFsdHMgdGhlIGZpcm13YXJlIGlmIGl0IGlzIG9wZXJhdGlvbmFsIGFuZCBwYW5pYworICoJdGhlIGtlcm5lbAorICoJQGlvYzogUG9pbnRlciB0byBNUFRfQURBUFRFUiBzdHJ1Y3R1cmUKKyAqCisgKiovCit2b2lkCittcHRfaGFsdF9maXJtd2FyZShNUFRfQURBUFRFUiAqaW9jKQoreworCXUzMgkgaW9jX3Jhd19zdGF0ZTsKKworCWlvY19yYXdfc3RhdGUgPSBtcHRfR2V0SW9jU3RhdGUoaW9jLCAwKTsKKworCWlmICgoaW9jX3Jhd19zdGF0ZSAmIE1QSV9JT0NfU1RBVEVfTUFTSykgPT0gTVBJX0lPQ19TVEFURV9GQVVMVCkgeworCQlwcmludGsoTVlJT0Nfc19FUlJfRk1UICJJT0MgaXMgaW4gRkFVTFQgc3RhdGUgKCUwNHhoKSEhIVxuIiwKKwkJCWlvYy0+bmFtZSwgaW9jX3Jhd19zdGF0ZSAmIE1QSV9ET09SQkVMTF9EQVRBX01BU0spOworCQlwYW5pYygiJXM6IElPQyBGYXVsdCAoJTA0eGgpISEhXG4iLCBpb2MtPm5hbWUsCisJCQlpb2NfcmF3X3N0YXRlICYgTVBJX0RPT1JCRUxMX0RBVEFfTUFTSyk7CisJfSBlbHNlIHsKKwkJQ0hJUFJFR19XUklURTMyKCZpb2MtPmNoaXAtPkRvb3JiZWxsLCAweEMwRkZFRTAwKTsKKwkJcGFuaWMoIiVzOiBGaXJtd2FyZSBpcyBoYWx0ZWQgZHVlIHRvIGNvbW1hbmQgdGltZW91dFxuIiwKKwkJCWlvYy0+bmFtZSk7CisJfQorfQorRVhQT1JUX1NZTUJPTChtcHRfaGFsdF9maXJtd2FyZSk7CisKIC8qPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09Ki8KIC8qCiAgKglSZXNldCBIYW5kbGluZwpAQCAtNjM0NSw2ICs2NDA0LDggQEAKIAlwcmludGsoTVlJT0Nfc19JTkZPX0ZNVCAiSGFyZFJlc2V0SGFuZGxlciBFbnRlcmVkIVxuIiwgaW9jLT5uYW1lKTsKIAlwcmludGsoIk1GIGNvdW50IDB4JXggIVxuIiwgaW9jLT5tZmNudCk7CiAjZW5kaWYKKwlpZiAobXB0X2Z3ZmF1bHRfZGVidWcpCisJCW1wdF9oYWx0X2Zpcm13YXJlKGlvYyk7CiAKIAkvKiBSZXNldCB0aGUgYWRhcHRlci4gUHJldmVudCBtb3JlIHRoYW4gMSBjYWxsIHRvCiAJICogbXB0X2RvX2lvY19yZWNvdmVyeSBhdCBhbnkgaW5zdGFudCBpbiB0aW1lLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9tcHRiYXNlLmggYi9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdGJhc2UuaAppbmRleCBkZmYwNDhjLi5iM2U5ODFkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdGJhc2UuaAorKysgYi9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdGJhc2UuaApAQCAtOTIyLDExICs5MjIsMTQgQEAKIGV4dGVybiBpbnQJIG1wdF9maW5kSW1Wb2x1bWVzKE1QVF9BREFQVEVSICppb2MpOwogZXh0ZXJuIGludAkgbXB0YmFzZV9zYXNfcGVyc2lzdF9vcGVyYXRpb24oTVBUX0FEQVBURVIgKmlvYywgdTggcGVyc2lzdF9vcGNvZGUpOwogZXh0ZXJuIGludAkgbXB0X3JhaWRfcGh5c19kaXNrX3BnMChNUFRfQURBUFRFUiAqaW9jLCB1OCBwaHlzX2Rpc2tfbnVtLCBwUmFpZFBoeXNEaXNrUGFnZTBfdCBwaHlzX2Rpc2spOworZXh0ZXJuIHZvaWQgICAgIG1wdF9oYWx0X2Zpcm13YXJlKE1QVF9BREFQVEVSICppb2MpOworCiAKIC8qCiAgKiAgUHVibGljIGRhdGEgZGVjbCdzLi4uCiAgKi8KIGV4dGVybiBzdHJ1Y3QgbGlzdF9oZWFkCSAgaW9jX2xpc3Q7CitleHRlcm4gaW50IG1wdF9md2ZhdWx0X2RlYnVnOwogCiAvKj0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPSovCiAjZW5kaWYJCS8qIH0gX19LRVJORUxfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9tcHRjdGwuYyBiL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0Y3RsLmMKaW5kZXggYjg5ZjQ3Ni4uYzYzODE3MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9tcHRjdGwuYworKysgYi9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdGN0bC5jCkBAIC0zMDgsMTAgKzMwOCwxMSBAQAogewogCWludCByYyA9IDE7CiAKLQlkY3RscHJpbnRrKGlvY3RsLT5pb2MsIHByaW50ayhNWUlPQ19zX0RFQlVHX0ZNVCAiOiBUaW1lb3V0IEV4cGlyZWQhIEhvc3QgJWRcbiIsCi0JCQkJaW9jdGwtPmlvYy0+bmFtZSwgaW9jdGwtPmlvYy0+aWQpKTsKIAlpZiAoaW9jdGwgPT0gTlVMTCkKIAkJcmV0dXJuOworCWRjdGxwcmludGsoaW9jdGwtPmlvYywKKwkJICAgcHJpbnRrKE1ZSU9DX3NfREVCVUdfRk1UICI6IFRpbWVvdXQgRXhwaXJlZCEgSG9zdCAlZFxuIiwKKwkJICAgaW9jdGwtPmlvYy0+bmFtZSwgaW9jdGwtPmlvYy0+aWQpKTsKIAogCWlvY3RsLT53YWl0X2RvbmUgPSAwOwogCWlmIChpb2N0bC0+cmVzZXQgJiBNUFRDVExfUkVTRVRfT0spCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdGxhbi5jIGIvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9tcHRsYW4uYwppbmRleCBhMTNmNmVlLi5jMjgwNGYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdGxhbi5jCisrKyBiL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0bGFuLmMKQEAgLTEwNiw3ICsxMDYsNiBAQAogCiAJdTMyIHRvdGFsX3Bvc3RlZDsKIAl1MzIgdG90YWxfcmVjZWl2ZWQ7Ci0Jc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CS8qIFBlciBkZXZpY2Ugc3RhdGlzdGljcyAqLwogCiAJc3RydWN0IGRlbGF5ZWRfd29yayBwb3N0X2J1Y2tldHNfdGFzazsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OwpAQCAtNTQ4LDE1ICs1NDcsNiBAQAogfQogCiAvKj0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPSovCi1zdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKgotbXB0X2xhbl9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgbXB0X2xhbl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQotCXJldHVybiAoc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKikgJnByaXYtPnN0YXRzOwotfQotCi0vKj0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPSovCiBzdGF0aWMgaW50CiBtcHRfbGFuX2NoYW5nZV9tdHUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG5ld19tdHUpCiB7CkBAIC01OTQsOCArNTg0LDggQEAKIAljdHggPSBHRVRfTEFOX0JVRkZFUl9DT05URVhUKHRtc2cpOwogCXNlbnQgPSBwcml2LT5TZW5kQ3RsW2N0eF0uc2tiOwogCi0JcHJpdi0+c3RhdHMudHhfcGFja2V0cysrOwotCXByaXYtPnN0YXRzLnR4X2J5dGVzICs9IHNlbnQtPmxlbjsKKwlkZXYtPnN0YXRzLnR4X3BhY2tldHMrKzsKKwlkZXYtPnN0YXRzLnR4X2J5dGVzICs9IHNlbnQtPmxlbjsKIAogCWRpb3ByaW50aygoS0VSTl9JTkZPIE1ZTkFNICI6ICVzLyVzOiBAJXMsIHNrYiAlcCBzZW50LlxuIiwKIAkJCUlPQ19BTkRfTkVUREVWX05BTUVTX3NfcyhkZXYpLApAQCAtNjM2LDcgKzYyNiw3IEBACiAKIAlzd2l0Y2ggKGxlMTZfdG9fY3B1KHBTZW5kUmVwLT5JT0NTdGF0dXMpICYgTVBJX0lPQ1NUQVRVU19NQVNLKSB7CiAJY2FzZSBNUElfSU9DU1RBVFVTX1NVQ0NFU1M6Ci0JCXByaXYtPnN0YXRzLnR4X3BhY2tldHMgKz0gY291bnQ7CisJCWRldi0+c3RhdHMudHhfcGFja2V0cyArPSBjb3VudDsKIAkJYnJlYWs7CiAKIAljYXNlIE1QSV9JT0NTVEFUVVNfTEFOX0NBTkNFTEVEOgpAQCAtNjQ0LDEzICs2MzQsMTMgQEAKIAkJYnJlYWs7CiAKIAljYXNlIE1QSV9JT0NTVEFUVVNfSU5WQUxJRF9TR0w6Ci0JCXByaXYtPnN0YXRzLnR4X2Vycm9ycyArPSBjb3VudDsKKwkJZGV2LT5zdGF0cy50eF9lcnJvcnMgKz0gY291bnQ7CiAJCXByaW50ayAoS0VSTl9FUlIgTVlOQU0gIjogJXMvJXM6IEVSUk9SIC0gSW52YWxpZCBTR0wgc2VudCB0byBJT0MhXG4iLAogCQkJCUlPQ19BTkRfTkVUREVWX05BTUVTX3NfcyhkZXYpKTsKIAkJZ290byBvdXQ7CiAKIAlkZWZhdWx0OgotCQlwcml2LT5zdGF0cy50eF9lcnJvcnMgKz0gY291bnQ7CisJCWRldi0+c3RhdHMudHhfZXJyb3JzICs9IGNvdW50OwogCQlicmVhazsKIAl9CiAKQEAgLTY2MSw3ICs2NTEsNyBAQAogCQljdHggPSBHRVRfTEFOX0JVRkZFUl9DT05URVhUKGxlMzJfdG9fY3B1KCpwQ29udGV4dCkpOwogCiAJCXNlbnQgPSBwcml2LT5TZW5kQ3RsW2N0eF0uc2tiOwotCQlwcml2LT5zdGF0cy50eF9ieXRlcyArPSBzZW50LT5sZW47CisJCWRldi0+c3RhdHMudHhfYnl0ZXMgKz0gc2VudC0+bGVuOwogCiAJCWRpb3ByaW50aygoS0VSTl9JTkZPIE1ZTkFNICI6ICVzLyVzOiBAJXMsIHNrYiAlcCBzZW50LlxuIiwKIAkJCQlJT0NfQU5EX05FVERFVl9OQU1FU19zX3MoZGV2KSwKQEAgLTg0Miw4ICs4MzIsOCBAQAogCQkgImRlbGl2ZXJlZCB0byB1cHBlciBsZXZlbC5cbiIsCiAJCQlJT0NfQU5EX05FVERFVl9OQU1FU19zX3MoZGV2KSwgc2tiLT5sZW4pKTsKIAotCXByaXYtPnN0YXRzLnJ4X2J5dGVzICs9IHNrYi0+bGVuOwotCXByaXYtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKwlkZXYtPnN0YXRzLnJ4X2J5dGVzICs9IHNrYi0+bGVuOworCWRldi0+c3RhdHMucnhfcGFja2V0cysrOwogCiAJc2tiLT5kZXYgPSBkZXY7CiAJbmV0aWZfcngoc2tiKTsKQEAgLTEzMDgsNiArMTI5OCwxNCBAQAogCQkJCQkJICBwb3N0X2J1Y2tldHNfdGFzay53b3JrKSk7CiB9CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgbXB0X25ldGRldl9vcHMgPSB7CisJLm5kb19vcGVuICAgICAgID0gbXB0X2xhbl9vcGVuLAorCS5uZG9fc3RvcCAgICAgICA9IG1wdF9sYW5fY2xvc2UsCisJLm5kb19zdGFydF94bWl0ID0gbXB0X2xhbl9zZHVfc2VuZCwKKwkubmRvX2NoYW5nZV9tdHUgPSBtcHRfbGFuX2NoYW5nZV9tdHUsCisJLm5kb190eF90aW1lb3V0ID0gbXB0X2xhbl90eF90aW1lb3V0LAorfTsKKwogLyo9LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0qLwogc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlICoKIG1wdF9yZWdpc3Rlcl9sYW5fZGV2aWNlIChNUFRfQURBUFRFUiAqbXB0X2RldiwgaW50IHBudW0pCkBAIC0xMzcyLDE1ICsxMzcwLDcgQEAKIAlwcml2LT50eF9tYXhfb3V0ID0gKHR4X21heF9vdXRfcCA8PSBNUFRfVFhfTUFYX09VVF9MSU0pID8KIAkJCSAgICB0eF9tYXhfb3V0X3AgOiBNUFRfVFhfTUFYX09VVF9MSU07CiAKLQlkZXYtPm9wZW4gPSBtcHRfbGFuX29wZW47Ci0JZGV2LT5zdG9wID0gbXB0X2xhbl9jbG9zZTsKLQlkZXYtPmdldF9zdGF0cyA9IG1wdF9sYW5fZ2V0X3N0YXRzOwotCWRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gTlVMTDsKLQlkZXYtPmNoYW5nZV9tdHUgPSBtcHRfbGFuX2NoYW5nZV9tdHU7Ci0JZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSBtcHRfbGFuX3NkdV9zZW5kOwotCi0vKiBOb3QgaW4gMi4zLjQyLiBOZWVkIDIuMy40NSsgKi8KLQlkZXYtPnR4X3RpbWVvdXQgPSBtcHRfbGFuX3R4X3RpbWVvdXQ7CisJZGV2LT5uZXRkZXZfb3BzID0gJm1wdF9uZXRkZXZfb3BzOwogCWRldi0+d2F0Y2hkb2dfdGltZW8gPSBNUFRfTEFOX1RYX1RJTUVPVVQ7CiAKIAlkbHByaW50aygoS0VSTl9JTkZPIE1ZTkFNICI6IEZpbmlzaGVkIHJlZ2lzdGVyaW5nIGRldiAiCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdHNjc2loLmMgYi9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdHNjc2loLmMKaW5kZXggZWUwOTA0MS4uZTYyYzZiYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9tcHRzY3NpaC5jCisrKyBiL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0c2NzaWguYwpAQCAtMTg0Niw2ICsxODQ2LDkgQEAKIAlpZiAoaGQtPnRpbWVvdXRzIDwgLTEpCiAJCWhkLT50aW1lb3V0cysrOwogCisJaWYgKG1wdF9md2ZhdWx0X2RlYnVnKQorCQltcHRfaGFsdF9maXJtd2FyZShpb2MpOworCiAJLyogTW9zdCBpbXBvcnRhbnQhICBTZXQgVGFza01zZ0NvbnRleHQgdG8gU0NwbnQncyBNc2dDb250ZXh0IQogCSAqICh0aGUgSU8gdG8gYmUgQUJPUlQnZCkKIAkgKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZXNzYWdlL2kyby9pMm9fc2NzaS5jIGIvZHJpdmVycy9tZXNzYWdlL2kyby9pMm9fc2NzaS5jCmluZGV4IDFiY2RiYmIuLjNkNDU4MTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVzc2FnZS9pMm8vaTJvX3Njc2kuYworKysgYi9kcml2ZXJzL21lc3NhZ2UvaTJvL2kyb19zY3NpLmMKQEAgLTM5MCw3ICszOTAsNyBAQAogICoJQGkyb19kZXY6IHRoZSBJMk8gZGV2aWNlIHdoaWNoIHdhcyBhZGRlZAogICoKICAqCUlmIGEgSTJPIGRldmljZSBpcyBhZGRlZCB3ZSBjYXRjaCB0aGUgbm90aWZpY2F0aW9uLCBiZWNhdXNlIEkyTyBjbGFzc2VzCi0gKglvdGhlciB0aGVuIFNDU0kgcGVyaXBoZXJhbCB3aWxsIG5vdCBiZSByZWNlaXZlZCB0aHJvdWdoCisgKglvdGhlciB0aGFuIFNDU0kgcGVyaXBoZXJhbCB3aWxsIG5vdCBiZSByZWNlaXZlZCB0aHJvdWdoCiAgKglpMm9fc2NzaV9wcm9iZSgpLgogICovCiBzdGF0aWMgdm9pZCBpMm9fc2NzaV9ub3RpZnlfZGV2aWNlX2FkZChzdHJ1Y3QgaTJvX2RldmljZSAqaTJvX2RldikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL0tjb25maWcgYi9kcml2ZXJzL21mZC9LY29uZmlnCmluZGV4IDQxNmY5ZTcuLjA2YTJiMGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWZkL0tjb25maWcKKysrIGIvZHJpdmVycy9tZmQvS2NvbmZpZwpAQCAtMjE3LDYgKzIxNywyOSBAQAogCSAgSTJDIGFzIHRoZSBjb250cm9sIGludGVyZmFjZS4gIEFkZGl0aW9uYWwgb3B0aW9ucyBtdXN0IGJlCiAJICBzZWxlY3RlZCB0byBlbmFibGUgc3VwcG9ydCBmb3IgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgdGhlIGNoaXAuCiAKK2NvbmZpZyBNRkRfUENGNTA2MzMKKwl0cmlzdGF0ZSAiU3VwcG9ydCBmb3IgTlhQIFBDRjUwNjMzIgorCWRlcGVuZHMgb24gSTJDCisJaGVscAorCSAgU2F5IHllcyBoZXJlIGlmIHlvdSBoYXZlIE5YUCBQQ0Y1MDYzMyBjaGlwIG9uIHlvdXIgYm9hcmQuCisJICBUaGlzIGNvcmUgZHJpdmVyIHByb3ZpZGVzIHJlZ2lzdGVyIGFjY2VzcyBhbmQgSVJRIGhhbmRsaW5nCisJICBmYWNpbGl0aWVzLCBhbmQgcmVnaXN0ZXJzIGRldmljZXMgZm9yIHRoZSB2YXJpb3VzIGZ1bmN0aW9ucworCSAgc28gdGhhdCBmdW5jdGlvbi1zcGVjaWZpYyBkcml2ZXJzIGNhbiBiaW5kIHRvIHRoZW0uCisKK2NvbmZpZyBQQ0Y1MDYzM19BREMKKwl0cmlzdGF0ZSAiU3VwcG9ydCBmb3IgTlhQIFBDRjUwNjMzIEFEQyIKKwlkZXBlbmRzIG9uIE1GRF9QQ0Y1MDYzMworCWhlbHAKKwkgU2F5IHllcyBoZXJlIGlmIHlvdSB3YW50IHRvIGluY2x1ZGUgc3VwcG9ydCBmb3IgQURDIGluIHRoZQorCSBOWFAgUENGNTA2MzMgY2hpcC4KKworY29uZmlnIFBDRjUwNjMzX0dQSU8KKwl0cmlzdGF0ZSAiU3VwcG9ydCBmb3IgTlhQIFBDRjUwNjMzIEdQSU8iCisJZGVwZW5kcyBvbiBNRkRfUENGNTA2MzMKKwloZWxwCisJIFNheSB5ZXMgaGVyZSBpZiB5b3Ugd2FudCB0byBpbmNsdWRlIHN1cHBvcnQgR1BJTyBmb3IgcGlucyBvbgorCSB0aGUgUENGNTA2MzMgY2hpcC4KKwogZW5kbWVudQogCiBtZW51ICJNdWx0aW1lZGlhIENhcGFiaWxpdGllcyBQb3J0IGRyaXZlcnMiCmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC9NYWtlZmlsZSBiL2RyaXZlcnMvbWZkL01ha2VmaWxlCmluZGV4IDBjOTQxOGIuLjNhZmI1MTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWZkL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbWZkL01ha2VmaWxlCkBAIC0zNywzICszNyw3IEBACiBvYmotJChDT05GSUdfVUNCMTQwMF9DT1JFKQkrPSB1Y2IxNDAwX2NvcmUubwogCiBvYmotJChDT05GSUdfUE1JQ19EQTkwM1gpCSs9IGRhOTAzeC5vCisKK29iai0kKENPTkZJR19NRkRfUENGNTA2MzMpCSs9IHBjZjUwNjMzLWNvcmUubworb2JqLSQoQ09ORklHX1BDRjUwNjMzX0FEQykJKz0gcGNmNTA2MzMtYWRjLm8KK29iai0kKENPTkZJR19QQ0Y1MDYzM19HUElPKQkrPSBwY2Y1MDYzMy1ncGlvLm8KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC9kbTM1NWV2bV9tc3AuYyBiL2RyaXZlcnMvbWZkL2RtMzU1ZXZtX21zcC5jCmluZGV4IDQyMTRiM2YuLjdhYzEyY2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWZkL2RtMzU1ZXZtX21zcC5jCisrKyBiL2RyaXZlcnMvbWZkL2RtMzU1ZXZtX21zcC5jCkBAIC0xMDcsNiArMTA3LDkgQEAKIAlNU1BfR1BJTygwLCBTV0lUQ0gxKSwgTVNQX0dQSU8oMSwgU1dJVENIMSksCiAJTVNQX0dQSU8oMiwgU1dJVENIMSksIE1TUF9HUElPKDMsIFNXSVRDSDEpLAogCU1TUF9HUElPKDQsIFNXSVRDSDEpLAorCS8qIHN3aXRjaGVzIG9uIE1NQy9TRCBzb2NrZXRzICovCisJTVNQX0dQSU8oMSwgU0RNTUMpLCBNU1BfR1BJTygyLCBTRE1NQyksCS8qIG1tYzAgV1AsIG5DRCAqLworCU1TUF9HUElPKDMsIFNETU1DKSwgTVNQX0dQSU8oNCwgU0RNTUMpLAkvKiBtbWMxIFdQLCBuQ0QgKi8KIH07CiAKICNkZWZpbmUgTVNQX0dQSU9fUkVHKG9mZnNldCkJKG1zcF9ncGlvc1sob2Zmc2V0KV0gPj4gMykKQEAgLTMwNCw2ICszMDcsMTMgQEAKIAkJZ3Bpb19leHBvcnQoZ3BpbywgZmFsc2UpOwogCX0KIAorCS8qIE1NQy9TRCBpbnB1dHMgLS0gcmlnaHQgYWZ0ZXIgdGhlIGxhc3QgY29uZmlnIGlucHV0ICovCisJaWYgKGNsaWVudC0+ZGV2LnBsYXRmb3JtX2RhdGEpIHsKKwkJdm9pZCAoKm1tY3NkX3NldHVwKSh1bnNpZ25lZCkgPSBjbGllbnQtPmRldi5wbGF0Zm9ybV9kYXRhOworCisJCW1tY3NkX3NldHVwKGRtMzU1ZXZtX21zcF9ncGlvLmJhc2UgKyA4ICsgNSk7CisJfQorCiAJLyogUlRDIGlzIGEgMzIgYml0IGNvdW50ZXIsIG5vIGFsYXJtICovCiAJaWYgKG1zcF9oYXNfcnRjKCkpIHsKIAkJY2hpbGQgPSBhZGRfY2hpbGQoY2xpZW50LCAicnRjLWRtMzU1ZXZtIiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL3BjZjUwNjMzLWFkYy5jIGIvZHJpdmVycy9tZmQvcGNmNTA2MzMtYWRjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzJkMDViZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWZkL3BjZjUwNjMzLWFkYy5jCkBAIC0wLDAgKzEsMjc3IEBACisvKiBOWFAgUENGNTA2MzMgQURDIERyaXZlcgorICoKKyAqIChDKSAyMDA2LTIwMDggYnkgT3Blbm1va28sIEluYy4KKyAqIEF1dGhvcjogQmFsYWppIFJhbyA8YmFsYWppcnJhb0BvcGVubW9rby5vcmc+CisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIEJyb2tlbiBkb3duIGZyb20gbW9uc3Ryb3VzIFBDRjUwNjMzIGRyaXZlciBtYWlubHkgYnkKKyAqIEhhcmFsZCBXZWx0ZSwgQW5keSBHcmVlbiBhbmQgV2VybmVyIEFsbWVzYmVyZ2VyCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAorICogIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgorICogIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIE5PVEU6IFRoaXMgZHJpdmVyIGRvZXMgbm90IHlldCBzdXBwb3J0IHN1YnRyYWN0aXZlIEFEQyBtb2RlLCB3aGljaCBtZWFucworICogIHlvdSBjYW4gZG8gb25seSBvbmUgbWVhc3VyZW1lbnQgcGVyIHJlYWQgcmVxdWVzdC4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KKworI2luY2x1ZGUgPGxpbnV4L21mZC9wY2Y1MDYzMy9jb3JlLmg+CisjaW5jbHVkZSA8bGludXgvbWZkL3BjZjUwNjMzL2FkYy5oPgorCitzdHJ1Y3QgcGNmNTA2MzNfYWRjX3JlcXVlc3QgeworCWludCBtdXg7CisJaW50IGF2ZzsKKwlpbnQgcmVzdWx0OworCXZvaWQgKCpjYWxsYmFjaykoc3RydWN0IHBjZjUwNjMzICosIHZvaWQgKiwgaW50KTsKKwl2b2lkICpjYWxsYmFja19wYXJhbTsKKworCS8qIFVzZWQgaW4gY2FzZSBvZiBzeW5jIHJlcXVlc3RzICovCisJc3RydWN0IGNvbXBsZXRpb24gY29tcGxldGlvbjsKKworfTsKKworI2RlZmluZSBQQ0Y1MDYzM19NQVhfQURDX0ZJRk9fREVQVEggOAorCitzdHJ1Y3QgcGNmNTA2MzNfYWRjIHsKKwlzdHJ1Y3QgcGNmNTA2MzMgKnBjZjsKKworCS8qIFByaXZhdGUgc3R1ZmYgKi8KKwlzdHJ1Y3QgcGNmNTA2MzNfYWRjX3JlcXVlc3QgKnF1ZXVlW1BDRjUwNjMzX01BWF9BRENfRklGT19ERVBUSF07CisJaW50IHF1ZXVlX2hlYWQ7CisJaW50IHF1ZXVlX3RhaWw7CisJc3RydWN0IG11dGV4IHF1ZXVlX211dGV4OworfTsKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgcGNmNTA2MzNfYWRjICpfX3RvX2FkYyhzdHJ1Y3QgcGNmNTA2MzMgKnBjZikKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGNmLT5hZGNfcGRldik7Cit9CisKK3N0YXRpYyB2b2lkIGFkY19zZXR1cChzdHJ1Y3QgcGNmNTA2MzMgKnBjZiwgaW50IGNoYW5uZWwsIGludCBhdmcpCit7CisJY2hhbm5lbCAmPSBQQ0Y1MDYzM19BRENDMV9BRENNVVhfTUFTSzsKKworCS8qIGtpbGwgcmF0aW9tZXRyaWMsIGJ1dCBlbmFibGUgQUNDU1cgYmlhc2luZyAqLworCXBjZjUwNjMzX3JlZ193cml0ZShwY2YsIFBDRjUwNjMzX1JFR19BRENDMiwgMHgwMCk7CisJcGNmNTA2MzNfcmVnX3dyaXRlKHBjZiwgUENGNTA2MzNfUkVHX0FEQ0MzLCAweDAxKTsKKworCS8qIHN0YXJ0IEFEQyBjb252ZXJzaW9uIG9uIHNlbGVjdGVkIGNoYW5uZWwgKi8KKwlwY2Y1MDYzM19yZWdfd3JpdGUocGNmLCBQQ0Y1MDYzM19SRUdfQURDQzEsIGNoYW5uZWwgfCBhdmcgfAorCQkgICAgUENGNTA2MzNfQURDQzFfQURDU1RBUlQgfCBQQ0Y1MDYzM19BRENDMV9SRVNfMTBCSVQpOworfQorCitzdGF0aWMgdm9pZCB0cmlnZ2VyX25leHRfYWRjX2pvYl9pZl9hbnkoc3RydWN0IHBjZjUwNjMzICpwY2YpCit7CisJc3RydWN0IHBjZjUwNjMzX2FkYyAqYWRjID0gX190b19hZGMocGNmKTsKKwlpbnQgaGVhZDsKKworCW11dGV4X2xvY2soJmFkYy0+cXVldWVfbXV0ZXgpOworCisJaGVhZCA9IGFkYy0+cXVldWVfaGVhZDsKKworCWlmICghYWRjLT5xdWV1ZVtoZWFkXSkgeworCQltdXRleF91bmxvY2soJmFkYy0+cXVldWVfbXV0ZXgpOworCQlyZXR1cm47CisJfQorCW11dGV4X3VubG9jaygmYWRjLT5xdWV1ZV9tdXRleCk7CisKKwlhZGNfc2V0dXAocGNmLCBhZGMtPnF1ZXVlW2hlYWRdLT5tdXgsIGFkYy0+cXVldWVbaGVhZF0tPmF2Zyk7Cit9CisKK3N0YXRpYyBpbnQKK2FkY19lbnF1ZXVlX3JlcXVlc3Qoc3RydWN0IHBjZjUwNjMzICpwY2YsIHN0cnVjdCBwY2Y1MDYzM19hZGNfcmVxdWVzdCAqcmVxKQoreworCXN0cnVjdCBwY2Y1MDYzM19hZGMgKmFkYyA9IF9fdG9fYWRjKHBjZik7CisJaW50IGhlYWQsIHRhaWw7CisKKwltdXRleF9sb2NrKCZhZGMtPnF1ZXVlX211dGV4KTsKKworCWhlYWQgPSBhZGMtPnF1ZXVlX2hlYWQ7CisJdGFpbCA9IGFkYy0+cXVldWVfdGFpbDsKKworCWlmIChhZGMtPnF1ZXVlW3RhaWxdKSB7CisJCW11dGV4X3VubG9jaygmYWRjLT5xdWV1ZV9tdXRleCk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJYWRjLT5xdWV1ZVt0YWlsXSA9IHJlcTsKKwlhZGMtPnF1ZXVlX3RhaWwgPSAodGFpbCArIDEpICYgKFBDRjUwNjMzX01BWF9BRENfRklGT19ERVBUSCAtIDEpOworCisJbXV0ZXhfdW5sb2NrKCZhZGMtPnF1ZXVlX211dGV4KTsKKworCXRyaWdnZXJfbmV4dF9hZGNfam9iX2lmX2FueShwY2YpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCitwY2Y1MDYzM19hZGNfc3luY19yZWFkX2NhbGxiYWNrKHN0cnVjdCBwY2Y1MDYzMyAqcGNmLCB2b2lkICpwYXJhbSwgaW50IHJlc3VsdCkKK3sKKwlzdHJ1Y3QgcGNmNTA2MzNfYWRjX3JlcXVlc3QgKnJlcSA9IHBhcmFtOworCisJcmVxLT5yZXN1bHQgPSByZXN1bHQ7CisJY29tcGxldGUoJnJlcS0+Y29tcGxldGlvbik7Cit9CisKK2ludCBwY2Y1MDYzM19hZGNfc3luY19yZWFkKHN0cnVjdCBwY2Y1MDYzMyAqcGNmLCBpbnQgbXV4LCBpbnQgYXZnKQoreworCXN0cnVjdCBwY2Y1MDYzM19hZGNfcmVxdWVzdCAqcmVxOworCisJLyogcmVxIGlzIGZyZWVkIHdoZW4gdGhlIHJlc3VsdCBpcyByZWFkeSwgaW4gaW50ZXJydXB0IGhhbmRsZXIgKi8KKwlyZXEgPSBremFsbG9jKHNpemVvZigqcmVxKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFyZXEpCisJCXJldHVybiAtRU5PTUVNOworCisJcmVxLT5tdXggPSBtdXg7CisJcmVxLT5hdmcgPSBhdmc7CisJcmVxLT5jYWxsYmFjayA9ICBwY2Y1MDYzM19hZGNfc3luY19yZWFkX2NhbGxiYWNrOworCXJlcS0+Y2FsbGJhY2tfcGFyYW0gPSByZXE7CisKKwlpbml0X2NvbXBsZXRpb24oJnJlcS0+Y29tcGxldGlvbik7CisJYWRjX2VucXVldWVfcmVxdWVzdChwY2YsIHJlcSk7CisJd2FpdF9mb3JfY29tcGxldGlvbigmcmVxLT5jb21wbGV0aW9uKTsKKworCXJldHVybiByZXEtPnJlc3VsdDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHBjZjUwNjMzX2FkY19zeW5jX3JlYWQpOworCitpbnQgcGNmNTA2MzNfYWRjX2FzeW5jX3JlYWQoc3RydWN0IHBjZjUwNjMzICpwY2YsIGludCBtdXgsIGludCBhdmcsCisJCQkgICAgIHZvaWQgKCpjYWxsYmFjaykoc3RydWN0IHBjZjUwNjMzICosIHZvaWQgKiwgaW50KSwKKwkJCSAgICAgdm9pZCAqY2FsbGJhY2tfcGFyYW0pCit7CisJc3RydWN0IHBjZjUwNjMzX2FkY19yZXF1ZXN0ICpyZXE7CisKKwkvKiByZXEgaXMgZnJlZWQgd2hlbiB0aGUgcmVzdWx0IGlzIHJlYWR5LCBpbiBpbnRlcnJ1cHQgaGFuZGxlciAqLworCXJlcSA9IGttYWxsb2Moc2l6ZW9mKCpyZXEpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXJlcSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyZXEtPm11eCA9IG11eDsKKwlyZXEtPmF2ZyA9IGF2ZzsKKwlyZXEtPmNhbGxiYWNrID0gY2FsbGJhY2s7CisJcmVxLT5jYWxsYmFja19wYXJhbSA9IGNhbGxiYWNrX3BhcmFtOworCisJYWRjX2VucXVldWVfcmVxdWVzdChwY2YsIHJlcSk7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHBjZjUwNjMzX2FkY19hc3luY19yZWFkKTsKKworc3RhdGljIGludCBhZGNfcmVzdWx0KHN0cnVjdCBwY2Y1MDYzMyAqcGNmKQoreworCXU4IGFkY3MxLCBhZGNzMzsKKwl1MTYgcmVzdWx0OworCisJYWRjczEgPSBwY2Y1MDYzM19yZWdfcmVhZChwY2YsIFBDRjUwNjMzX1JFR19BRENTMSk7CisJYWRjczMgPSBwY2Y1MDYzM19yZWdfcmVhZChwY2YsIFBDRjUwNjMzX1JFR19BRENTMyk7CisJcmVzdWx0ID0gKGFkY3MxIDw8IDIpIHwgKGFkY3MzICYgUENGNTA2MzNfQURDUzNfQURDREFUMUxfTUFTSyk7CisKKwlkZXZfZGJnKHBjZi0+ZGV2LCAiYWRjIHJlc3VsdCA9ICVkXG4iLCByZXN1bHQpOworCisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIHZvaWQgcGNmNTA2MzNfYWRjX2lycShpbnQgaXJxLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBwY2Y1MDYzM19hZGMgKmFkYyA9IGRhdGE7CisJc3RydWN0IHBjZjUwNjMzICpwY2YgPSBhZGMtPnBjZjsKKwlzdHJ1Y3QgcGNmNTA2MzNfYWRjX3JlcXVlc3QgKnJlcTsKKwlpbnQgaGVhZDsKKworCW11dGV4X2xvY2soJmFkYy0+cXVldWVfbXV0ZXgpOworCWhlYWQgPSBhZGMtPnF1ZXVlX2hlYWQ7CisKKwlyZXEgPSBhZGMtPnF1ZXVlW2hlYWRdOworCWlmIChXQVJOX09OKCFyZXEpKSB7CisJCWRldl9lcnIocGNmLT5kZXYsICJwY2Y1MDYzMy1hZGMgaXJxOiBBREMgcXVldWUgZW1wdHkhXG4iKTsKKwkJbXV0ZXhfdW5sb2NrKCZhZGMtPnF1ZXVlX211dGV4KTsKKwkJcmV0dXJuOworCX0KKwlhZGMtPnF1ZXVlW2hlYWRdID0gTlVMTDsKKwlhZGMtPnF1ZXVlX2hlYWQgPSAoaGVhZCArIDEpICYKKwkJCQkgICAgICAoUENGNTA2MzNfTUFYX0FEQ19GSUZPX0RFUFRIIC0gMSk7CisKKwltdXRleF91bmxvY2soJmFkYy0+cXVldWVfbXV0ZXgpOworCisJcmVxLT5jYWxsYmFjayhwY2YsIHJlcS0+Y2FsbGJhY2tfcGFyYW0sIGFkY19yZXN1bHQocGNmKSk7CisJa2ZyZWUocmVxKTsKKworCXRyaWdnZXJfbmV4dF9hZGNfam9iX2lmX2FueShwY2YpOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBwY2Y1MDYzM19hZGNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgcGNmNTA2MzNfc3ViZGV2X3BkYXRhICpwZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCXN0cnVjdCBwY2Y1MDYzM19hZGMgKmFkYzsKKworCWFkYyA9IGt6YWxsb2Moc2l6ZW9mKCphZGMpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWFkYykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlhZGMtPnBjZiA9IHBkYXRhLT5wY2Y7CisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgYWRjKTsKKworCXBjZjUwNjMzX3JlZ2lzdGVyX2lycShwZGF0YS0+cGNmLCBQQ0Y1MDYzM19JUlFfQURDUkRZLAorCQkJCQlwY2Y1MDYzM19hZGNfaXJxLCBhZGMpOworCisJbXV0ZXhfaW5pdCgmYWRjLT5xdWV1ZV9tdXRleCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgcGNmNTA2MzNfYWRjX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBwY2Y1MDYzM19hZGMgKmFkYyA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCWludCBpLCBoZWFkOworCisJcGNmNTA2MzNfZnJlZV9pcnEoYWRjLT5wY2YsIFBDRjUwNjMzX0lSUV9BRENSRFkpOworCisJbXV0ZXhfbG9jaygmYWRjLT5xdWV1ZV9tdXRleCk7CisJaGVhZCA9IGFkYy0+cXVldWVfaGVhZDsKKworCWlmIChXQVJOX09OKGFkYy0+cXVldWVbaGVhZF0pKQorCQlkZXZfZXJyKGFkYy0+cGNmLT5kZXYsCisJCQkiYWRjIGRyaXZlciByZW1vdmVkIHdpdGggcmVxdWVzdCBwZW5kaW5nXG4iKTsKKworCWZvciAoaSA9IDA7IGkgPCBQQ0Y1MDYzM19NQVhfQURDX0ZJRk9fREVQVEg7IGkrKykKKwkJa2ZyZWUoYWRjLT5xdWV1ZVtpXSk7CisKKwltdXRleF91bmxvY2soJmFkYy0+cXVldWVfbXV0ZXgpOworCWtmcmVlKGFkYyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgcGNmNTA2MzNfYWRjX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJwY2Y1MDYzMy1hZGMiLAorCX0sCisJLnByb2JlID0gcGNmNTA2MzNfYWRjX3Byb2JlLAorCS5yZW1vdmUgPSBfX2RldmV4aXRfcChwY2Y1MDYzM19hZGNfcmVtb3ZlKSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHBjZjUwNjMzX2FkY19pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmcGNmNTA2MzNfYWRjX2RyaXZlcik7Cit9Cittb2R1bGVfaW5pdChwY2Y1MDYzM19hZGNfaW5pdCk7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBwY2Y1MDYzM19hZGNfZXhpdCh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZwY2Y1MDYzM19hZGNfZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KHBjZjUwNjMzX2FkY19leGl0KTsKKworTU9EVUxFX0FVVEhPUigiQmFsYWppIFJhbyA8YmFsYWppcnJhb0BvcGVubW9rby5vcmc+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlBDRjUwNjMzIGFkYyBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BTElBUygicGxhdGZvcm06cGNmNTA2MzMtYWRjIik7CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL3BjZjUwNjMzLWNvcmUuYyBiL2RyaXZlcnMvbWZkL3BjZjUwNjMzLWNvcmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDUwOGUyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZmQvcGNmNTA2MzMtY29yZS5jCkBAIC0wLDAgKzEsNzEwIEBACisvKiBOWFAgUENGNTA2MzMgUG93ZXIgTWFuYWdlbWVudCBVbml0IChQTVUpIGRyaXZlcgorICoKKyAqIChDKSAyMDA2LTIwMDggYnkgT3Blbm1va28sIEluYy4KKyAqIEF1dGhvcjogSGFyYWxkIFdlbHRlIDxsYWZvcmdlQG9wZW5tb2tvLm9yZz4KKyAqIAkgICBCYWxhamkgUmFvIDxiYWxhamlycmFvQG9wZW5tb2tvLm9yZz4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAorICogIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgorICogIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNmcy5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisKKyNpbmNsdWRlIDxsaW51eC9tZmQvcGNmNTA2MzMvY29yZS5oPgorCisvKiBUd28gTUJDUyByZWdpc3RlcnMgdXNlZCBkdXJpbmcgY29sZCBzdGFydCAqLworI2RlZmluZSBQQ0Y1MDYzM19SRUdfTUJDUzEJCTB4NGIKKyNkZWZpbmUgUENGNTA2MzNfUkVHX01CQ1MyCQkweDRjCisjZGVmaW5lIFBDRjUwNjMzX01CQ1MxX1VTQlBSRVMgCQkweDAxCisjZGVmaW5lIFBDRjUwNjMzX01CQ1MxX0FEQVBUUFJFUwkweDAxCisKK3N0YXRpYyBpbnQgX19wY2Y1MDYzM19yZWFkKHN0cnVjdCBwY2Y1MDYzMyAqcGNmLCB1OCByZWcsIGludCBudW0sIHU4ICpkYXRhKQoreworCWludCByZXQ7CisKKwlyZXQgPSBpMmNfc21idXNfcmVhZF9pMmNfYmxvY2tfZGF0YShwY2YtPmkyY19jbGllbnQsIHJlZywKKwkJCQludW0sIGRhdGEpOworCWlmIChyZXQgPCAwKQorCQlkZXZfZXJyKHBjZi0+ZGV2LCAiRXJyb3IgcmVhZGluZyAlZCByZWdzIGF0ICVkXG4iLCBudW0sIHJlZyk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9fcGNmNTA2MzNfd3JpdGUoc3RydWN0IHBjZjUwNjMzICpwY2YsIHU4IHJlZywgaW50IG51bSwgdTggKmRhdGEpCit7CisJaW50IHJldDsKKworCXJldCA9IGkyY19zbWJ1c193cml0ZV9pMmNfYmxvY2tfZGF0YShwY2YtPmkyY19jbGllbnQsIHJlZywKKwkJCQludW0sIGRhdGEpOworCWlmIChyZXQgPCAwKQorCQlkZXZfZXJyKHBjZi0+ZGV2LCAiRXJyb3Igd3JpdGluZyAlZCByZWdzIGF0ICVkXG4iLCBudW0sIHJlZyk7CisKKwlyZXR1cm4gcmV0OworCit9CisKKy8qIFJlYWQgYSBibG9jayBvZiB1cHRvIDMyIHJlZ3MgICovCitpbnQgcGNmNTA2MzNfcmVhZF9ibG9jayhzdHJ1Y3QgcGNmNTA2MzMgKnBjZiwgdTggcmVnLAorCQkJCQlpbnQgbnJfcmVncywgdTggKmRhdGEpCit7CisJaW50IHJldDsKKworCW11dGV4X2xvY2soJnBjZi0+bG9jayk7CisJcmV0ID0gX19wY2Y1MDYzM19yZWFkKHBjZiwgcmVnLCBucl9yZWdzLCBkYXRhKTsKKwltdXRleF91bmxvY2soJnBjZi0+bG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTF9HUEwocGNmNTA2MzNfcmVhZF9ibG9jayk7CisKKy8qIFdyaXRlIGEgYmxvY2sgb2YgdXB0byAzMiByZWdzICAqLworaW50IHBjZjUwNjMzX3dyaXRlX2Jsb2NrKHN0cnVjdCBwY2Y1MDYzMyAqcGNmICwgdTggcmVnLAorCQkJCQlpbnQgbnJfcmVncywgdTggKmRhdGEpCit7CisJaW50IHJldDsKKworCW11dGV4X2xvY2soJnBjZi0+bG9jayk7CisJcmV0ID0gX19wY2Y1MDYzM193cml0ZShwY2YsIHJlZywgbnJfcmVncywgZGF0YSk7CisJbXV0ZXhfdW5sb2NrKCZwY2YtPmxvY2spOworCisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHBjZjUwNjMzX3dyaXRlX2Jsb2NrKTsKKwordTggcGNmNTA2MzNfcmVnX3JlYWQoc3RydWN0IHBjZjUwNjMzICpwY2YsIHU4IHJlZykKK3sKKwl1OCB2YWw7CisKKwltdXRleF9sb2NrKCZwY2YtPmxvY2spOworCV9fcGNmNTA2MzNfcmVhZChwY2YsIHJlZywgMSwgJnZhbCk7CisJbXV0ZXhfdW5sb2NrKCZwY2YtPmxvY2spOworCisJcmV0dXJuIHZhbDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHBjZjUwNjMzX3JlZ19yZWFkKTsKKworaW50IHBjZjUwNjMzX3JlZ193cml0ZShzdHJ1Y3QgcGNmNTA2MzMgKnBjZiwgdTggcmVnLCB1OCB2YWwpCit7CisJaW50IHJldDsKKworCW11dGV4X2xvY2soJnBjZi0+bG9jayk7CisJcmV0ID0gX19wY2Y1MDYzM193cml0ZShwY2YsIHJlZywgMSwgJnZhbCk7CisJbXV0ZXhfdW5sb2NrKCZwY2YtPmxvY2spOworCisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHBjZjUwNjMzX3JlZ193cml0ZSk7CisKK2ludCBwY2Y1MDYzM19yZWdfc2V0X2JpdF9tYXNrKHN0cnVjdCBwY2Y1MDYzMyAqcGNmLCB1OCByZWcsIHU4IG1hc2ssIHU4IHZhbCkKK3sKKwlpbnQgcmV0OworCXU4IHRtcDsKKworCXZhbCAmPSBtYXNrOworCisJbXV0ZXhfbG9jaygmcGNmLT5sb2NrKTsKKwlyZXQgPSBfX3BjZjUwNjMzX3JlYWQocGNmLCByZWcsIDEsICZ0bXApOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dDsKKworCXRtcCAmPSB+bWFzazsKKwl0bXAgfD0gdmFsOworCXJldCA9IF9fcGNmNTA2MzNfd3JpdGUocGNmLCByZWcsIDEsICZ0bXApOworCitvdXQ6CisJbXV0ZXhfdW5sb2NrKCZwY2YtPmxvY2spOworCisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHBjZjUwNjMzX3JlZ19zZXRfYml0X21hc2spOworCitpbnQgcGNmNTA2MzNfcmVnX2NsZWFyX2JpdHMoc3RydWN0IHBjZjUwNjMzICpwY2YsIHU4IHJlZywgdTggdmFsKQoreworCWludCByZXQ7CisJdTggdG1wOworCisJbXV0ZXhfbG9jaygmcGNmLT5sb2NrKTsKKwlyZXQgPSBfX3BjZjUwNjMzX3JlYWQocGNmLCByZWcsIDEsICZ0bXApOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dDsKKworCXRtcCAmPSB+dmFsOworCXJldCA9IF9fcGNmNTA2MzNfd3JpdGUocGNmLCByZWcsIDEsICZ0bXApOworCitvdXQ6CisJbXV0ZXhfdW5sb2NrKCZwY2YtPmxvY2spOworCisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHBjZjUwNjMzX3JlZ19jbGVhcl9iaXRzKTsKKworLyogc3lzZnMgYXR0cmlidXRlcyAqLworc3RhdGljIHNzaXplX3Qgc2hvd19kdW1wX3JlZ3Moc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgICBjaGFyICpidWYpCit7CisJc3RydWN0IHBjZjUwNjMzICpwY2YgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwl1OCBkdW1wWzE2XTsKKwlpbnQgbiwgbjEsIGlkeCA9IDA7CisJY2hhciAqYnVmMSA9IGJ1ZjsKKwlzdGF0aWMgdTggYWRkcmVzc19ub19yZWFkW10gPSB7IC8qIG11c3QgYmUgYXNjZW5kaW5nICovCisJCVBDRjUwNjMzX1JFR19JTlQxLAorCQlQQ0Y1MDYzM19SRUdfSU5UMiwKKwkJUENGNTA2MzNfUkVHX0lOVDMsCisJCVBDRjUwNjMzX1JFR19JTlQ0LAorCQlQQ0Y1MDYzM19SRUdfSU5UNSwKKwkJMCAvKiB0ZXJtaW5hdG9yICovCisJfTsKKworCWZvciAobiA9IDA7IG4gPCAyNTY7IG4gKz0gc2l6ZW9mKGR1bXApKSB7CisJCWZvciAobjEgPSAwOyBuMSA8IHNpemVvZihkdW1wKTsgbjErKykKKwkJCWlmIChuID09IGFkZHJlc3Nfbm9fcmVhZFtpZHhdKSB7CisJCQkJaWR4Kys7CisJCQkJZHVtcFtuMV0gPSAweDAwOworCQkJfSBlbHNlCisJCQkJZHVtcFtuMV0gPSBwY2Y1MDYzM19yZWdfcmVhZChwY2YsIG4gKyBuMSk7CisKKwkJaGV4X2R1bXBfdG9fYnVmZmVyKGR1bXAsIHNpemVvZihkdW1wKSwgMTYsIDEsIGJ1ZjEsIDEyOCwgMCk7CisJCWJ1ZjEgKz0gc3RybGVuKGJ1ZjEpOworCQkqYnVmMSsrID0gJ1xuJzsKKwkJKmJ1ZjEgPSAnXDAnOworCX0KKworCXJldHVybiBidWYxIC0gYnVmOworfQorc3RhdGljIERFVklDRV9BVFRSKGR1bXBfcmVncywgMDQwMCwgc2hvd19kdW1wX3JlZ3MsIE5VTEwpOworCitzdGF0aWMgc3NpemVfdCBzaG93X3Jlc3VtZV9yZWFzb24oc3RydWN0IGRldmljZSAqZGV2LAorCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IHBjZjUwNjMzICpwY2YgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlpbnQgbjsKKworCW4gPSBzcHJpbnRmKGJ1ZiwgIiUwMnglMDJ4JTAyeCUwMnglMDJ4XG4iLAorCQkJCXBjZi0+cmVzdW1lX3JlYXNvblswXSwKKwkJCQlwY2YtPnJlc3VtZV9yZWFzb25bMV0sCisJCQkJcGNmLT5yZXN1bWVfcmVhc29uWzJdLAorCQkJCXBjZi0+cmVzdW1lX3JlYXNvblszXSwKKwkJCQlwY2YtPnJlc3VtZV9yZWFzb25bNF0pOworCisJcmV0dXJuIG47Cit9CitzdGF0aWMgREVWSUNFX0FUVFIocmVzdW1lX3JlYXNvbiwgMDQwMCwgc2hvd19yZXN1bWVfcmVhc29uLCBOVUxMKTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKnBjZl9zeXNmc19lbnRyaWVzW10gPSB7CisJJmRldl9hdHRyX2R1bXBfcmVncy5hdHRyLAorCSZkZXZfYXR0cl9yZXN1bWVfcmVhc29uLmF0dHIsCisJTlVMTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIHBjZl9hdHRyX2dyb3VwID0geworCS5uYW1lCT0gTlVMTCwJCQkvKiBwdXQgaW4gZGV2aWNlIGRpcmVjdG9yeSAqLworCS5hdHRycwk9IHBjZl9zeXNmc19lbnRyaWVzLAorfTsKKworaW50IHBjZjUwNjMzX3JlZ2lzdGVyX2lycShzdHJ1Y3QgcGNmNTA2MzMgKnBjZiwgaW50IGlycSwKKwkJCXZvaWQgKCpoYW5kbGVyKSAoaW50LCB2b2lkICopLCB2b2lkICpkYXRhKQoreworCWlmIChpcnEgPCAwIHx8IGlycSA+IFBDRjUwNjMzX05VTV9JUlEgfHwgIWhhbmRsZXIpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKFdBUk5fT04ocGNmLT5pcnFfaGFuZGxlcltpcnFdLmhhbmRsZXIpKQorCQlyZXR1cm4gLUVCVVNZOworCisJbXV0ZXhfbG9jaygmcGNmLT5sb2NrKTsKKwlwY2YtPmlycV9oYW5kbGVyW2lycV0uaGFuZGxlciA9IGhhbmRsZXI7CisJcGNmLT5pcnFfaGFuZGxlcltpcnFdLmRhdGEgPSBkYXRhOworCW11dGV4X3VubG9jaygmcGNmLT5sb2NrKTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwocGNmNTA2MzNfcmVnaXN0ZXJfaXJxKTsKKworaW50IHBjZjUwNjMzX2ZyZWVfaXJxKHN0cnVjdCBwY2Y1MDYzMyAqcGNmLCBpbnQgaXJxKQoreworCWlmIChpcnEgPCAwIHx8IGlycSA+IFBDRjUwNjMzX05VTV9JUlEpCisJCXJldHVybiAtRUlOVkFMOworCisJbXV0ZXhfbG9jaygmcGNmLT5sb2NrKTsKKwlwY2YtPmlycV9oYW5kbGVyW2lycV0uaGFuZGxlciA9IE5VTEw7CisJbXV0ZXhfdW5sb2NrKCZwY2YtPmxvY2spOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChwY2Y1MDYzM19mcmVlX2lycSk7CisKK3N0YXRpYyBpbnQgX19wY2Y1MDYzM19pcnFfbWFza19zZXQoc3RydWN0IHBjZjUwNjMzICpwY2YsIGludCBpcnEsIHU4IG1hc2spCit7CisJdTggcmVnLCBiaXRzLCB0bXA7CisJaW50IHJldCA9IDAsIGlkeDsKKworCWlkeCA9IGlycSA+PiAzOworCXJlZyA9ICBQQ0Y1MDYzM19SRUdfSU5UMU0gKyBpZHg7CisJYml0cyA9IDEgPDwgKGlycSAmIDB4MDcpOworCisJbXV0ZXhfbG9jaygmcGNmLT5sb2NrKTsKKworCWlmIChtYXNrKSB7CisJCXJldCA9IF9fcGNmNTA2MzNfcmVhZChwY2YsIHJlZywgMSwgJnRtcCk7CisJCWlmIChyZXQgPCAwKQorCQkJZ290byBvdXQ7CisKKwkJdG1wIHw9IGJpdHM7CisKKwkJcmV0ID0gX19wY2Y1MDYzM193cml0ZShwY2YsIHJlZywgMSwgJnRtcCk7CisJCWlmIChyZXQgPCAwKQorCQkJZ290byBvdXQ7CisKKwkJcGNmLT5tYXNrX3JlZ3NbaWR4XSAmPSB+Yml0czsKKwkJcGNmLT5tYXNrX3JlZ3NbaWR4XSB8PSBiaXRzOworCX0gZWxzZSB7CisJCXJldCA9IF9fcGNmNTA2MzNfcmVhZChwY2YsIHJlZywgMSwgJnRtcCk7CisJCWlmIChyZXQgPCAwKQorCQkJZ290byBvdXQ7CisKKwkJdG1wICY9IH5iaXRzOworCisJCXJldCA9IF9fcGNmNTA2MzNfd3JpdGUocGNmLCByZWcsIDEsICZ0bXApOworCQlpZiAocmV0IDwgMCkKKwkJCWdvdG8gb3V0OworCisJCXBjZi0+bWFza19yZWdzW2lkeF0gJj0gfmJpdHM7CisJfQorb3V0OgorCW11dGV4X3VubG9jaygmcGNmLT5sb2NrKTsKKworCXJldHVybiByZXQ7Cit9CisKK2ludCBwY2Y1MDYzM19pcnFfbWFzayhzdHJ1Y3QgcGNmNTA2MzMgKnBjZiwgaW50IGlycSkKK3sKKwlkZXZfaW5mbyhwY2YtPmRldiwgIk1hc2tpbmcgSVJRICVkXG4iLCBpcnEpOworCisJcmV0dXJuIF9fcGNmNTA2MzNfaXJxX21hc2tfc2V0KHBjZiwgaXJxLCAxKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHBjZjUwNjMzX2lycV9tYXNrKTsKKworaW50IHBjZjUwNjMzX2lycV91bm1hc2soc3RydWN0IHBjZjUwNjMzICpwY2YsIGludCBpcnEpCit7CisJZGV2X2luZm8ocGNmLT5kZXYsICJVbm1hc2tpbmcgSVJRICVkXG4iLCBpcnEpOworCisJcmV0dXJuIF9fcGNmNTA2MzNfaXJxX21hc2tfc2V0KHBjZiwgaXJxLCAwKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHBjZjUwNjMzX2lycV91bm1hc2spOworCitpbnQgcGNmNTA2MzNfaXJxX21hc2tfZ2V0KHN0cnVjdCBwY2Y1MDYzMyAqcGNmLCBpbnQgaXJxKQoreworCXU4IHJlZywgYml0czsKKworCXJlZyA9ICBpcnEgPj4gMzsKKwliaXRzID0gMSA8PCAoaXJxICYgMHgwNyk7CisKKwlyZXR1cm4gcGNmLT5tYXNrX3JlZ3NbcmVnXSAmIGJpdHM7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChwY2Y1MDYzM19pcnFfbWFza19nZXQpOworCitzdGF0aWMgdm9pZCBwY2Y1MDYzM19pcnFfY2FsbF9oYW5kbGVyKHN0cnVjdCBwY2Y1MDYzMyAqcGNmLCBpbnQgaXJxKQoreworCWlmIChwY2YtPmlycV9oYW5kbGVyW2lycV0uaGFuZGxlcikKKwkJcGNmLT5pcnFfaGFuZGxlcltpcnFdLmhhbmRsZXIoaXJxLCBwY2YtPmlycV9oYW5kbGVyW2lycV0uZGF0YSk7Cit9CisKKy8qIE1heGltdW0gYW1vdW50IG9mIHRpbWUgT05LRVkgaXMgaGVsZCBiZWZvcmUgZW1lcmdlbmN5IGFjdGlvbiBpcyB0YWtlbiAqLworI2RlZmluZSBQQ0Y1MDYzM19PTktFWTFTX1RJTUVPVVQgOAorCitzdGF0aWMgdm9pZCBwY2Y1MDYzM19pcnFfd29ya2VyKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgcGNmNTA2MzMgKnBjZjsKKwlpbnQgcmV0LCBpLCBqOworCXU4IHBjZl9pbnRbNV0sIGNoZ3N0YXQ7CisKKwlwY2YgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IHBjZjUwNjMzLCBpcnFfd29yayk7CisKKwkvKiBSZWFkIHRoZSA1IElOVCByZWdzIGluIG9uZSB0cmFuc2FjdGlvbiAqLworCXJldCA9IHBjZjUwNjMzX3JlYWRfYmxvY2socGNmLCBQQ0Y1MDYzM19SRUdfSU5UMSwKKwkJCQkJCUFSUkFZX1NJWkUocGNmX2ludCksIHBjZl9pbnQpOworCWlmIChyZXQgIT0gQVJSQVlfU0laRShwY2ZfaW50KSkgeworCQlkZXZfZXJyKHBjZi0+ZGV2LCAiRXJyb3IgcmVhZGluZyBJTlQgcmVnaXN0ZXJzXG4iKTsKKworCQkvKgorCQkgKiBJZiB0aGlzIGRvZXNuJ3QgQUNLIHRoZSBpbnRlcnJ1cHQgdG8gdGhlIGNoaXAsIHdlJ2xsIGJlCisJCSAqIGNhbGxlZCBvbmNlIGFnYWluIGFzIHdlJ3JlIGxldmVsIHRyaWdnZXJlZC4KKwkJICovCisJCWdvdG8gb3V0OworCX0KKworCS8qIFdlIGltbWVkaWF0ZWx5IHJlYWQgdGhlIHVzYiBhbmQgYWRhcHRlciBzdGF0dXMuIFdlIHRodXMgbWFrZSBzdXJlCisJICogb25seSBvZiBVU0JJTlMvVVNCUkVNIElSUSBoYW5kbGVycyBhcmUgY2FsbGVkICovCisJaWYgKHBjZl9pbnRbMF0gJiAoUENGNTA2MzNfSU5UMV9VU0JJTlMgfCBQQ0Y1MDYzM19JTlQxX1VTQlJFTSkpIHsKKwkJY2hnc3RhdCA9IHBjZjUwNjMzX3JlZ19yZWFkKHBjZiwgUENGNTA2MzNfUkVHX01CQ1MyKTsKKwkJaWYgKGNoZ3N0YXQgJiAoMHgzIDw8IDQpKQorCQkJcGNmX2ludFswXSAmPSB+KDEgPDwgUENGNTA2MzNfSU5UMV9VU0JSRU0pOworCQllbHNlCisJCQlwY2ZfaW50WzBdICY9IH4oMSA8PCBQQ0Y1MDYzM19JTlQxX1VTQklOUyk7CisJfQorCisJLyogTWFrZSBzdXJlIG9ubHkgb25lIG9mIEFEUElOUyBvciBBRFBSRU0gaXMgc2V0ICovCisJaWYgKHBjZl9pbnRbMF0gJiAoUENGNTA2MzNfSU5UMV9BRFBJTlMgfCBQQ0Y1MDYzM19JTlQxX0FEUFJFTSkpIHsKKwkJY2hnc3RhdCA9IHBjZjUwNjMzX3JlZ19yZWFkKHBjZiwgUENGNTA2MzNfUkVHX01CQ1MyKTsKKwkJaWYgKGNoZ3N0YXQgJiAoMHgzIDw8IDQpKQorCQkJcGNmX2ludFswXSAmPSB+KDEgPDwgUENGNTA2MzNfSU5UMV9BRFBSRU0pOworCQllbHNlCisJCQlwY2ZfaW50WzBdICY9IH4oMSA8PCBQQ0Y1MDYzM19JTlQxX0FEUElOUyk7CisJfQorCisJZGV2X2RiZyhwY2YtPmRldiwgIklOVDE9MHglMDJ4IElOVDI9MHglMDJ4IElOVDM9MHglMDJ4ICIKKwkJCSJJTlQ0PTB4JTAyeCBJTlQ1PTB4JTAyeFxuIiwgcGNmX2ludFswXSwKKwkJCXBjZl9pbnRbMV0sIHBjZl9pbnRbMl0sIHBjZl9pbnRbM10sIHBjZl9pbnRbNF0pOworCisJLyogU29tZSByZXZpc2lvbnMgb2YgdGhlIGNoaXAgZG9uJ3QgaGF2ZSBhIDhzIHN0YW5kYnkgbW9kZSBvbgorCSAqIE9OS0VZMVMgcHJlc3MuIFdlIHRyeSB0byBtYW51YWxseSBkbyBpdCBpbiBzdWNoIGNhc2VzLiAqLworCWlmICgocGNmX2ludFswXSAmIFBDRjUwNjMzX0lOVDFfU0VDT05EKSAmJiBwY2YtPm9ua2V5MXNfaGVsZCkgeworCQlkZXZfaW5mbyhwY2YtPmRldiwgIk9OS0VZMVMgaGVsZCBmb3IgJWQgc2Vjc1xuIiwKKwkJCQkJCQlwY2YtPm9ua2V5MXNfaGVsZCk7CisJCWlmIChwY2YtPm9ua2V5MXNfaGVsZCsrID09IFBDRjUwNjMzX09OS0VZMVNfVElNRU9VVCkKKwkJCWlmIChwY2YtPnBkYXRhLT5mb3JjZV9zaHV0ZG93bikKKwkJCQlwY2YtPnBkYXRhLT5mb3JjZV9zaHV0ZG93bihwY2YpOworCX0KKworCWlmIChwY2ZfaW50WzJdICYgUENGNTA2MzNfSU5UM19PTktFWTFTKSB7CisJCWRldl9pbmZvKHBjZi0+ZGV2LCAiT05LRVkxUyBoZWxkXG4iKTsKKwkJcGNmLT5vbmtleTFzX2hlbGQgPSAxIDsKKworCQkvKiBVbm1hc2sgSVJRX1NFQ09ORCAqLworCQlwY2Y1MDYzM19yZWdfY2xlYXJfYml0cyhwY2YsIFBDRjUwNjMzX1JFR19JTlQxTSwKKwkJCQkJCVBDRjUwNjMzX0lOVDFfU0VDT05EKTsKKworCQkvKiBVbm1hc2sgSVJRX09OS0VZUiAqLworCQlwY2Y1MDYzM19yZWdfY2xlYXJfYml0cyhwY2YsIFBDRjUwNjMzX1JFR19JTlQyTSwKKwkJCQkJCVBDRjUwNjMzX0lOVDJfT05LRVlSKTsKKwl9CisKKwlpZiAoKHBjZl9pbnRbMV0gJiBQQ0Y1MDYzM19JTlQyX09OS0VZUikgJiYgcGNmLT5vbmtleTFzX2hlbGQpIHsKKwkJcGNmLT5vbmtleTFzX2hlbGQgPSAwOworCisJCS8qIE1hc2sgU0VDT05EIGFuZCBPTktFWVIgaW50ZXJydXB0cyAqLworCQlpZiAocGNmLT5tYXNrX3JlZ3NbMF0gJiBQQ0Y1MDYzM19JTlQxX1NFQ09ORCkKKwkJCXBjZjUwNjMzX3JlZ19zZXRfYml0X21hc2socGNmLAorCQkJCQlQQ0Y1MDYzM19SRUdfSU5UMU0sCisJCQkJCVBDRjUwNjMzX0lOVDFfU0VDT05ELAorCQkJCQlQQ0Y1MDYzM19JTlQxX1NFQ09ORCk7CisKKwkJaWYgKHBjZi0+bWFza19yZWdzWzFdICYgUENGNTA2MzNfSU5UMl9PTktFWVIpCisJCQlwY2Y1MDYzM19yZWdfc2V0X2JpdF9tYXNrKHBjZiwKKwkJCQkJUENGNTA2MzNfUkVHX0lOVDJNLAorCQkJCQlQQ0Y1MDYzM19JTlQyX09OS0VZUiwKKwkJCQkJUENGNTA2MzNfSU5UMl9PTktFWVIpOworCX0KKworCS8qIEhhdmUgd2UganVzdCByZXN1bWVkID8gKi8KKwlpZiAocGNmLT5pc19zdXNwZW5kZWQpIHsKKwkJcGNmLT5pc19zdXNwZW5kZWQgPSAwOworCisJCS8qIFNldCB0aGUgcmVzdW1lIHJlYXNvbiBmaWx0ZXJpbmcgb3V0IG5vbiByZXN1bWVycyAqLworCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShwY2ZfaW50KTsgaSsrKQorCQkJcGNmLT5yZXN1bWVfcmVhc29uW2ldID0gcGNmX2ludFtpXSAmCisJCQkJCQlwY2YtPnBkYXRhLT5yZXN1bWVyc1tpXTsKKworCQkvKiBNYWtlIHN1cmUgd2UgZG9uJ3QgcGFzcyBvbiBhbnkgT05LRVkgZXZlbnRzIHRvCisJCSAqIHVzZXJzcGFjZSBub3cgKi8KKwkJcGNmX2ludFsxXSAmPSB+KFBDRjUwNjMzX0lOVDJfT05LRVlSIHwgUENGNTA2MzNfSU5UMl9PTktFWUYpOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHBjZl9pbnQpOyBpKyspIHsKKwkJLyogVW5zZXQgbWFza2VkIGludGVycnVwdHMgKi8KKwkJcGNmX2ludFtpXSAmPSB+cGNmLT5tYXNrX3JlZ3NbaV07CisKKwkJZm9yIChqID0gMDsgaiA8IDggOyBqKyspCisJCQlpZiAocGNmX2ludFtpXSAmICgxIDw8IGopKQorCQkJCXBjZjUwNjMzX2lycV9jYWxsX2hhbmRsZXIocGNmLCAoaSAqIDgpICsgaik7CisJfQorCitvdXQ6CisJcHV0X2RldmljZShwY2YtPmRldik7CisJZW5hYmxlX2lycShwY2YtPmlycSk7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBwY2Y1MDYzM19pcnEoaW50IGlycSwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgcGNmNTA2MzMgKnBjZiA9IGRhdGE7CisKKwlkZXZfZGJnKHBjZi0+ZGV2LCAicGNmNTA2MzNfaXJxXG4iKTsKKworCWdldF9kZXZpY2UocGNmLT5kZXYpOworCWRpc2FibGVfaXJxKHBjZi0+aXJxKTsKKwlzY2hlZHVsZV93b3JrKCZwY2YtPmlycV93b3JrKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIHZvaWQKK3BjZjUwNjMzX2NsaWVudF9kZXZfcmVnaXN0ZXIoc3RydWN0IHBjZjUwNjMzICpwY2YsIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkJCQlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICoqcGRldikKK3sKKwlzdHJ1Y3QgcGNmNTA2MzNfc3ViZGV2X3BkYXRhICpzdWJkZXZfcGRhdGE7CisJaW50IHJldDsKKworCSpwZGV2ID0gcGxhdGZvcm1fZGV2aWNlX2FsbG9jKG5hbWUsIC0xKTsKKwlpZiAoISpwZGV2KSB7CisJCWRldl9lcnIocGNmLT5kZXYsICJGYWxpZWQgdG8gYWxsb2NhdGUgJXNcbiIsIG5hbWUpOworCQlyZXR1cm47CisJfQorCisJc3ViZGV2X3BkYXRhID0ga21hbGxvYyhzaXplb2YoKnN1YmRldl9wZGF0YSksIEdGUF9LRVJORUwpOworCWlmICghc3ViZGV2X3BkYXRhKSB7CisJCWRldl9lcnIocGNmLT5kZXYsICJFcnJvciBhbGxvY2F0aW5nIHN1YmRldiBwZGF0YVxuIik7CisJCXBsYXRmb3JtX2RldmljZV9wdXQoKnBkZXYpOworCX0KKworCXN1YmRldl9wZGF0YS0+cGNmID0gcGNmOworCXBsYXRmb3JtX2RldmljZV9hZGRfZGF0YSgqcGRldiwgc3ViZGV2X3BkYXRhLCBzaXplb2YoKnN1YmRldl9wZGF0YSkpOworCisJKCpwZGV2KS0+ZGV2LnBhcmVudCA9IHBjZi0+ZGV2OworCisJcmV0ID0gcGxhdGZvcm1fZGV2aWNlX2FkZCgqcGRldik7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKHBjZi0+ZGV2LCAiRmFpbGVkIHRvIHJlZ2lzdGVyICVzOiAlZFxuIiwgbmFtZSwgcmV0KTsKKwkJcGxhdGZvcm1fZGV2aWNlX3B1dCgqcGRldik7CisJCSpwZGV2ID0gTlVMTDsKKwl9Cit9CisKKyNpZmRlZiBDT05GSUdfUE0KK3N0YXRpYyBpbnQgcGNmNTA2MzNfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3sKKwlzdHJ1Y3QgcGNmNTA2MzMgKnBjZjsKKwlpbnQgcmV0ID0gMCwgaTsKKwl1OCByZXNbNV07CisKKwlwY2YgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKworCS8qIE1ha2Ugc3VyZSBvdXIgaW50ZXJydXB0IGhhbmRsZXJzIGFyZSBub3QgY2FsbGVkCisJICogaGVuY2Vmb3J0aCAqLworCWRpc2FibGVfaXJxKHBjZi0+aXJxKTsKKworCS8qIE1ha2Ugc3VyZSB0aGF0IGFueSBydW5uaW5nIElSUSB3b3JrZXIgaGFzIHF1aXQgKi8KKwljYW5jZWxfd29ya19zeW5jKCZwY2YtPmlycV93b3JrKTsKKworCS8qIFNhdmUgdGhlIG1hc2tzICovCisJcmV0ID0gcGNmNTA2MzNfcmVhZF9ibG9jayhwY2YsIFBDRjUwNjMzX1JFR19JTlQxTSwKKwkJCQlBUlJBWV9TSVpFKHBjZi0+c3VzcGVuZF9pcnFfbWFza3MpLAorCQkJCQlwY2YtPnN1c3BlbmRfaXJxX21hc2tzKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKHBjZi0+ZGV2LCAiZXJyb3Igc2F2aW5nIGlycSBtYXNrc1xuIik7CisJCWdvdG8gb3V0OworCX0KKworCS8qIFdyaXRlIHdha2V1cCBpcnEgbWFza3MgKi8KKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShyZXMpOyBpKyspCisJCXJlc1tpXSA9IH5wY2YtPnBkYXRhLT5yZXN1bWVyc1tpXTsKKworCXJldCA9IHBjZjUwNjMzX3dyaXRlX2Jsb2NrKHBjZiwgUENGNTA2MzNfUkVHX0lOVDFNLAorCQkJCQlBUlJBWV9TSVpFKHJlcyksICZyZXNbMF0pOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIocGNmLT5kZXYsICJlcnJvciB3cml0aW5nIHdha2V1cCBpcnEgbWFza3NcbiIpOworCQlnb3RvIG91dDsKKwl9CisKKwlwY2YtPmlzX3N1c3BlbmRlZCA9IDE7CisKK291dDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHBjZjUwNjMzX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHBjZjUwNjMzICpwY2Y7CisJaW50IHJldDsKKworCXBjZiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCisJLyogV3JpdGUgdGhlIHNhdmVkIG1hc2sgcmVnaXN0ZXJzICovCisJcmV0ID0gcGNmNTA2MzNfd3JpdGVfYmxvY2socGNmLCBQQ0Y1MDYzM19SRUdfSU5UMU0sCisJCQkJQVJSQVlfU0laRShwY2YtPnN1c3BlbmRfaXJxX21hc2tzKSwKKwkJCQkJcGNmLT5zdXNwZW5kX2lycV9tYXNrcyk7CisJaWYgKHJldCA8IDApCisJCWRldl9lcnIocGNmLT5kZXYsICJFcnJvciByZXN0b3Jpbmcgc2F2ZWQgc3VzcGVuZCBtYXNrc1xuIik7CisKKwkvKiBSZXN0b3JlIHJlZ3VsYXRvcnMnIHN0YXRlICovCisKKworCWdldF9kZXZpY2UocGNmLT5kZXYpOworCisJLyoKKwkgKiBDbGVhciBhbnkgcGVuZGluZyBpbnRlcnJ1cHRzIGFuZCBzZXQgcmVzdW1lIHJlYXNvbiBpZiBhbnkuCisJICogVGhpcyB3aWxsIGxlYXZlIHdpdGggZW5hYmxlX2lycSgpCisJICovCisJcGNmNTA2MzNfaXJxX3dvcmtlcigmcGNmLT5pcnFfd29yayk7CisKKwlyZXR1cm4gMDsKK30KKyNlbHNlCisjZGVmaW5lIHBjZjUwNjMzX3N1c3BlbmQgTlVMTAorI2RlZmluZSBwY2Y1MDYzM19yZXN1bWUgTlVMTAorI2VuZGlmCisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHBjZjUwNjMzX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJCQkJY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkcykKK3sKKwlzdHJ1Y3QgcGNmNTA2MzMgKnBjZjsKKwlzdHJ1Y3QgcGNmNTA2MzNfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBjbGllbnQtPmRldi5wbGF0Zm9ybV9kYXRhOworCWludCBpLCByZXQgPSAwOworCWludCB2ZXJzaW9uLCB2YXJpYW50OworCisJcGNmID0ga3phbGxvYyhzaXplb2YoKnBjZiksIEdGUF9LRVJORUwpOworCWlmICghcGNmKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXBjZi0+cGRhdGEgPSBwZGF0YTsKKworCW11dGV4X2luaXQoJnBjZi0+bG9jayk7CisKKwlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCBwY2YpOworCXBjZi0+ZGV2ID0gJmNsaWVudC0+ZGV2OworCXBjZi0+aTJjX2NsaWVudCA9IGNsaWVudDsKKwlwY2YtPmlycSA9IGNsaWVudC0+aXJxOworCisJSU5JVF9XT1JLKCZwY2YtPmlycV93b3JrLCBwY2Y1MDYzM19pcnFfd29ya2VyKTsKKworCXZlcnNpb24gPSBwY2Y1MDYzM19yZWdfcmVhZChwY2YsIDApOworCXZhcmlhbnQgPSBwY2Y1MDYzM19yZWdfcmVhZChwY2YsIDEpOworCWlmICh2ZXJzaW9uIDwgMCB8fCB2YXJpYW50IDwgMCkgeworCQlkZXZfZXJyKHBjZi0+ZGV2LCAiVW5hYmxlIHRvIHByb2JlIHBjZjUwNjMzXG4iKTsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBlcnI7CisJfQorCisJZGV2X2luZm8ocGNmLT5kZXYsICJQcm9iZWQgZGV2aWNlIHZlcnNpb24gJWQgdmFyaWFudCAlZFxuIiwKKwkJCQkJCQl2ZXJzaW9uLCB2YXJpYW50KTsKKworCS8qIEVuYWJsZSBhbGwgaW50ZXJydXB0cyBleGNlcHQgUlRDIFNFQ09ORCAqLworCXBjZi0+bWFza19yZWdzWzBdID0gMHg4MDsKKwlwY2Y1MDYzM19yZWdfd3JpdGUocGNmLCBQQ0Y1MDYzM19SRUdfSU5UMU0sIHBjZi0+bWFza19yZWdzWzBdKTsKKwlwY2Y1MDYzM19yZWdfd3JpdGUocGNmLCBQQ0Y1MDYzM19SRUdfSU5UMk0sIDB4MDApOworCXBjZjUwNjMzX3JlZ193cml0ZShwY2YsIFBDRjUwNjMzX1JFR19JTlQzTSwgMHgwMCk7CisJcGNmNTA2MzNfcmVnX3dyaXRlKHBjZiwgUENGNTA2MzNfUkVHX0lOVDRNLCAweDAwKTsKKwlwY2Y1MDYzM19yZWdfd3JpdGUocGNmLCBQQ0Y1MDYzM19SRUdfSU5UNU0sIDB4MDApOworCisJLyogQ3JlYXRlIHN1YiBkZXZpY2VzICovCisJcGNmNTA2MzNfY2xpZW50X2Rldl9yZWdpc3RlcihwY2YsICJwY2Y1MDYzMy1pbnB1dCIsCisJCQkJCQkmcGNmLT5pbnB1dF9wZGV2KTsKKwlwY2Y1MDYzM19jbGllbnRfZGV2X3JlZ2lzdGVyKHBjZiwgInBjZjUwNjMzLXJ0YyIsCisJCQkJCQkmcGNmLT5ydGNfcGRldik7CisJcGNmNTA2MzNfY2xpZW50X2Rldl9yZWdpc3RlcihwY2YsICJwY2Y1MDYzMy1tYmMiLAorCQkJCQkJJnBjZi0+bWJjX3BkZXYpOworCXBjZjUwNjMzX2NsaWVudF9kZXZfcmVnaXN0ZXIocGNmLCAicGNmNTA2MzMtYWRjIiwKKwkJCQkJCSZwY2YtPmFkY19wZGV2KTsKKworCWZvciAoaSA9IDA7IGkgPCBQQ0Y1MDYzM19OVU1fUkVHVUxBVE9SUzsgaSsrKSB7CisJCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXY7CisKKwkJcGRldiA9IHBsYXRmb3JtX2RldmljZV9hbGxvYygicGNmNTA2MzMtcmVnbHRyIiwgaSk7CisJCWlmICghcGRldikgeworCQkJZGV2X2VycihwY2YtPmRldiwgIkNhbm5vdCBjcmVhdGUgcmVndWxhdG9yXG4iKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJcGRldi0+ZGV2LnBhcmVudCA9IHBjZi0+ZGV2OworCQlwZGV2LT5kZXYucGxhdGZvcm1fZGF0YSA9ICZwZGF0YS0+cmVnX2luaXRfZGF0YVtpXTsKKwkJcGRldi0+ZGV2LmRyaXZlcl9kYXRhID0gcGNmOworCQlwY2YtPnJlZ3VsYXRvcl9wZGV2W2ldID0gcGRldjsKKworCQlwbGF0Zm9ybV9kZXZpY2VfYWRkKHBkZXYpOworCX0KKworCWlmIChjbGllbnQtPmlycSkgeworCQlzZXRfaXJxX2hhbmRsZXIoY2xpZW50LT5pcnEsIGhhbmRsZV9sZXZlbF9pcnEpOworCQlyZXQgPSByZXF1ZXN0X2lycShjbGllbnQtPmlycSwgcGNmNTA2MzNfaXJxLAorCQkJCUlSUUZfVFJJR0dFUl9MT1csICJwY2Y1MDYzMyIsIHBjZik7CisKKwkJaWYgKHJldCkgeworCQkJZGV2X2VycihwY2YtPmRldiwgIkZhaWxlZCB0byByZXF1ZXN0IElSUSAlZFxuIiwgcmV0KTsKKwkJCWdvdG8gZXJyOworCQl9CisJfSBlbHNlIHsKKwkJZGV2X2VycihwY2YtPmRldiwgIk5vIElSUSBjb25maWd1cmVkXG4iKTsKKwkJZ290byBlcnI7CisJfQorCisJaWYgKGVuYWJsZV9pcnFfd2FrZShjbGllbnQtPmlycSkgPCAwKQorCQlkZXZfZXJyKHBjZi0+ZGV2LCAiSVJRICV1IGNhbm5vdCBiZSBlbmFibGVkIGFzIHdha2UtdXAgc291cmNlIgorCQkJImluIHRoaXMgaGFyZHdhcmUgcmV2aXNpb24iLCBjbGllbnQtPmlycSk7CisKKwlyZXQgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJmNsaWVudC0+ZGV2LmtvYmosICZwY2ZfYXR0cl9ncm91cCk7CisJaWYgKHJldCkKKwkJZGV2X2VycihwY2YtPmRldiwgImVycm9yIGNyZWF0aW5nIHN5c2ZzIGVudHJpZXNcbiIpOworCisJaWYgKHBkYXRhLT5wcm9iZV9kb25lKQorCQlwZGF0YS0+cHJvYmVfZG9uZShwY2YpOworCisJcmV0dXJuIDA7CisKK2VycjoKKwlrZnJlZShwY2YpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IHBjZjUwNjMzX3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXN0cnVjdCBwY2Y1MDYzMyAqcGNmID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJaW50IGk7CisKKwlmcmVlX2lycShwY2YtPmlycSwgcGNmKTsKKworCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKHBjZi0+aW5wdXRfcGRldik7CisJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIocGNmLT5ydGNfcGRldik7CisJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIocGNmLT5tYmNfcGRldik7CisJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIocGNmLT5hZGNfcGRldik7CisKKwlmb3IgKGkgPSAwOyBpIDwgUENGNTA2MzNfTlVNX1JFR1VMQVRPUlM7IGkrKykKKwkJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIocGNmLT5yZWd1bGF0b3JfcGRldltpXSk7CisKKwlrZnJlZShwY2YpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RldmljZV9pZCBwY2Y1MDYzM19pZF90YWJsZVtdID0geworCXsicGNmNTA2MzMiLCAweDczfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBwY2Y1MDYzM19kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUJPSAicGNmNTA2MzMiLAorCQkuc3VzcGVuZCA9IHBjZjUwNjMzX3N1c3BlbmQsCisJCS5yZXN1bWUJPSBwY2Y1MDYzM19yZXN1bWUsCisJfSwKKwkuaWRfdGFibGUgPSBwY2Y1MDYzM19pZF90YWJsZSwKKwkucHJvYmUgPSBwY2Y1MDYzM19wcm9iZSwKKwkucmVtb3ZlID0gX19kZXZleGl0X3AocGNmNTA2MzNfcmVtb3ZlKSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHBjZjUwNjMzX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gaTJjX2FkZF9kcml2ZXIoJnBjZjUwNjMzX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBwY2Y1MDYzM19leGl0KHZvaWQpCit7CisJaTJjX2RlbF9kcml2ZXIoJnBjZjUwNjMzX2RyaXZlcik7Cit9CisKK01PRFVMRV9ERVNDUklQVElPTigiSTJDIGNoaXAgZHJpdmVyIGZvciBOWFAgUENGNTA2MzMgUE1VIik7CitNT0RVTEVfQVVUSE9SKCJIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAb3Blbm1va28ub3JnPiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCittb2R1bGVfaW5pdChwY2Y1MDYzM19pbml0KTsKK21vZHVsZV9leGl0KHBjZjUwNjMzX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvcGNmNTA2MzMtZ3Bpby5jIGIvZHJpdmVycy9tZmQvcGNmNTA2MzMtZ3Bpby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmYTJlY2EKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21mZC9wY2Y1MDYzMy1ncGlvLmMKQEAgLTAsMCArMSwxMTggQEAKKy8qIE5YUCBQQ0Y1MDYzMyBHUElPIERyaXZlcgorICoKKyAqIChDKSAyMDA2LTIwMDggYnkgT3Blbm1va28sIEluYy4KKyAqIEF1dGhvcjogQmFsYWppIFJhbyA8YmFsYWppcnJhb0BvcGVubW9rby5vcmc+CisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIEJyb2tlbiBkb3duIGZyb20gbW9uc3Ryb3VzIFBDRjUwNjMzIGRyaXZlciBtYWlubHkgYnkKKyAqIEhhcmFsZCBXZWx0ZSwgQW5keSBHcmVlbiBhbmQgV2VybmVyIEFsbWVzYmVyZ2VyCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAorICogIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgorICogIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKworI2luY2x1ZGUgPGxpbnV4L21mZC9wY2Y1MDYzMy9jb3JlLmg+CisjaW5jbHVkZSA8bGludXgvbWZkL3BjZjUwNjMzL2dwaW8uaD4KKworZW51bSBwY2Y1MDYzM19yZWd1bGF0b3JfaWQgeworCVBDRjUwNjMzX1JFR1VMQVRPUl9BVVRPLAorCVBDRjUwNjMzX1JFR1VMQVRPUl9ET1dOMSwKKwlQQ0Y1MDYzM19SRUdVTEFUT1JfRE9XTjIsCisJUENGNTA2MzNfUkVHVUxBVE9SX0xETzEsCisJUENGNTA2MzNfUkVHVUxBVE9SX0xETzIsCisJUENGNTA2MzNfUkVHVUxBVE9SX0xETzMsCisJUENGNTA2MzNfUkVHVUxBVE9SX0xETzQsCisJUENGNTA2MzNfUkVHVUxBVE9SX0xETzUsCisJUENGNTA2MzNfUkVHVUxBVE9SX0xETzYsCisJUENGNTA2MzNfUkVHVUxBVE9SX0hDTERPLAorCVBDRjUwNjMzX1JFR1VMQVRPUl9NRU1MRE8sCit9OworCisjZGVmaW5lIFBDRjUwNjMzX1JFR19BVVRPT1VUCTB4MWEKKyNkZWZpbmUgUENGNTA2MzNfUkVHX0RPV04xT1VUCTB4MWUKKyNkZWZpbmUgUENGNTA2MzNfUkVHX0RPV04yT1VUCTB4MjIKKyNkZWZpbmUgUENGNTA2MzNfUkVHX01FTUxET09VVAkweDI2CisjZGVmaW5lIFBDRjUwNjMzX1JFR19MRE8xT1VUCTB4MmQKKyNkZWZpbmUgUENGNTA2MzNfUkVHX0xETzJPVVQJMHgyZgorI2RlZmluZSBQQ0Y1MDYzM19SRUdfTERPM09VVAkweDMxCisjZGVmaW5lIFBDRjUwNjMzX1JFR19MRE80T1VUCTB4MzMKKyNkZWZpbmUgUENGNTA2MzNfUkVHX0xETzVPVVQJMHgzNQorI2RlZmluZSBQQ0Y1MDYzM19SRUdfTERPNk9VVAkweDM3CisjZGVmaW5lIFBDRjUwNjMzX1JFR19IQ0xET09VVAkweDM5CisKK3N0YXRpYyBjb25zdCB1OCBwY2Y1MDYzM19yZWd1bGF0b3JfcmVnaXN0ZXJzW1BDRjUwNjMzX05VTV9SRUdVTEFUT1JTXSA9IHsKKwlbUENGNTA2MzNfUkVHVUxBVE9SX0FVVE9dCT0gUENGNTA2MzNfUkVHX0FVVE9PVVQsCisJW1BDRjUwNjMzX1JFR1VMQVRPUl9ET1dOMV0JPSBQQ0Y1MDYzM19SRUdfRE9XTjFPVVQsCisJW1BDRjUwNjMzX1JFR1VMQVRPUl9ET1dOMl0JPSBQQ0Y1MDYzM19SRUdfRE9XTjJPVVQsCisJW1BDRjUwNjMzX1JFR1VMQVRPUl9NRU1MRE9dCT0gUENGNTA2MzNfUkVHX01FTUxET09VVCwKKwlbUENGNTA2MzNfUkVHVUxBVE9SX0xETzFdCT0gUENGNTA2MzNfUkVHX0xETzFPVVQsCisJW1BDRjUwNjMzX1JFR1VMQVRPUl9MRE8yXQk9IFBDRjUwNjMzX1JFR19MRE8yT1VULAorCVtQQ0Y1MDYzM19SRUdVTEFUT1JfTERPM10JPSBQQ0Y1MDYzM19SRUdfTERPM09VVCwKKwlbUENGNTA2MzNfUkVHVUxBVE9SX0xETzRdCT0gUENGNTA2MzNfUkVHX0xETzRPVVQsCisJW1BDRjUwNjMzX1JFR1VMQVRPUl9MRE81XQk9IFBDRjUwNjMzX1JFR19MRE81T1VULAorCVtQQ0Y1MDYzM19SRUdVTEFUT1JfTERPNl0JPSBQQ0Y1MDYzM19SRUdfTERPNk9VVCwKKwlbUENGNTA2MzNfUkVHVUxBVE9SX0hDTERPXQk9IFBDRjUwNjMzX1JFR19IQ0xET09VVCwKK307CisKK2ludCBwY2Y1MDYzM19ncGlvX3NldChzdHJ1Y3QgcGNmNTA2MzMgKnBjZiwgaW50IGdwaW8sIHU4IHZhbCkKK3sKKwl1OCByZWc7CisKKwlyZWcgPSBncGlvIC0gUENGNTA2MzNfR1BJTzEgKyBQQ0Y1MDYzM19SRUdfR1BJTzFDRkc7CisKKwlyZXR1cm4gcGNmNTA2MzNfcmVnX3NldF9iaXRfbWFzayhwY2YsIHJlZywgMHgwNywgdmFsKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHBjZjUwNjMzX2dwaW9fc2V0KTsKKwordTggcGNmNTA2MzNfZ3Bpb19nZXQoc3RydWN0IHBjZjUwNjMzICpwY2YsIGludCBncGlvKQoreworCXU4IHJlZywgdmFsOworCisJcmVnID0gZ3BpbyAtIFBDRjUwNjMzX0dQSU8xICsgUENGNTA2MzNfUkVHX0dQSU8xQ0ZHOworCXZhbCA9IHBjZjUwNjMzX3JlZ19yZWFkKHBjZiwgcmVnKSAmIDB4MDc7CisKKwlyZXR1cm4gdmFsOworfQorRVhQT1JUX1NZTUJPTF9HUEwocGNmNTA2MzNfZ3Bpb19nZXQpOworCitpbnQgcGNmNTA2MzNfZ3Bpb19pbnZlcnRfc2V0KHN0cnVjdCBwY2Y1MDYzMyAqcGNmLCBpbnQgZ3BpbywgaW50IGludmVydCkKK3sKKwl1OCB2YWwsIHJlZzsKKworCXJlZyA9IGdwaW8gLSBQQ0Y1MDYzM19HUElPMSArIFBDRjUwNjMzX1JFR19HUElPMUNGRzsKKwl2YWwgPSAhIWludmVydCA8PCAzOworCisJcmV0dXJuIHBjZjUwNjMzX3JlZ19zZXRfYml0X21hc2socGNmLCByZWcsIDEgPDwgMywgdmFsKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHBjZjUwNjMzX2dwaW9faW52ZXJ0X3NldCk7CisKK2ludCBwY2Y1MDYzM19ncGlvX2ludmVydF9nZXQoc3RydWN0IHBjZjUwNjMzICpwY2YsIGludCBncGlvKQoreworCXU4IHJlZywgdmFsOworCisJcmVnID0gZ3BpbyAtIFBDRjUwNjMzX0dQSU8xICsgUENGNTA2MzNfUkVHX0dQSU8xQ0ZHOworCXZhbCA9IHBjZjUwNjMzX3JlZ19yZWFkKHBjZiwgcmVnKTsKKworCXJldHVybiB2YWwgJiAoMSA8PCAzKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHBjZjUwNjMzX2dwaW9faW52ZXJ0X2dldCk7CisKK2ludCBwY2Y1MDYzM19ncGlvX3Bvd2VyX3N1cHBseV9zZXQoc3RydWN0IHBjZjUwNjMzICpwY2YsCisJCQkJCWludCBncGlvLCBpbnQgcmVndWxhdG9yLCBpbnQgb24pCit7CisJdTggcmVnLCB2YWwsIG1hc2s7CisKKwkvKiB0aGUgKkVOQSByZWdpc3RlciBpcyBhbHdheXMgb25lIGFmdGVyIHRoZSAqT1VUIHJlZ2lzdGVyICovCisJcmVnID0gcGNmNTA2MzNfcmVndWxhdG9yX3JlZ2lzdGVyc1tyZWd1bGF0b3JdICsgMTsKKworCXZhbCA9ICEhb24gPDwgKGdwaW8gLSBQQ0Y1MDYzM19HUElPMSk7CisJbWFzayA9IDEgPDwgKGdwaW8gLSBQQ0Y1MDYzM19HUElPMSk7CisKKwlyZXR1cm4gcGNmNTA2MzNfcmVnX3NldF9iaXRfbWFzayhwY2YsIHJlZywgbWFzaywgdmFsKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHBjZjUwNjMzX2dwaW9fcG93ZXJfc3VwcGx5X3NldCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC9zbTUwMS5jIGIvZHJpdmVycy9tZmQvc201MDEuYwppbmRleCAxNzBmOWQ0Li4wZTU3NjFmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21mZC9zbTUwMS5jCisrKyBiL2RyaXZlcnMvbWZkL3NtNTAxLmMKQEAgLTQxLDYgKzQxLDcgQEAKIAlzdHJ1Y3QgZ3Bpb19jaGlwCWdwaW87CiAJc3RydWN0IHNtNTAxX2dwaW8JKm91cmdwaW87CS8qIHRvIGdldCBiYWNrIHRvIHBhcmVudC4gKi8KIAl2b2lkIF9faW9tZW0JCSpyZWdiYXNlOworCXZvaWQgX19pb21lbQkJKmNvbnRyb2w7CS8qIGFkZHJlc3Mgb2YgY29udHJvbCByZWcuICovCiB9OwogCiBzdHJ1Y3Qgc201MDFfZ3BpbyB7CkBAIC05MDgsNiArOTA5LDI1IEBACiAJcmV0dXJuIHJlc3VsdCAmIDFVTDsKIH0KIAorc3RhdGljIHZvaWQgc201MDFfZ3Bpb19lbnN1cmVfZ3BpbyhzdHJ1Y3Qgc201MDFfZ3Bpb19jaGlwICpzbWNoaXAsCisJCQkJICAgdW5zaWduZWQgbG9uZyBiaXQpCit7CisJdW5zaWduZWQgbG9uZyBjdHJsOworCisJLyogY2hlY2sgYW5kIG1vZGlmeSBpZiB0aGlzIHBpbiBpcyBub3Qgc2V0IGFzIGdwaW8uICovCisKKwlpZiAocmVhZGwoc21jaGlwLT5jb250cm9sKSAmIGJpdCkgeworCQlkZXZfaW5mbyhzbTUwMV9ncGlvX3RvX2RldihzbWNoaXAtPm91cmdwaW8pLT5kZXYsCisJCQkgImNoYW5naW5nIG1vZGUgb2YgZ3BpbywgYml0ICUwOGx4XG4iLCBiaXQpOworCisJCWN0cmwgPSByZWFkbChzbWNoaXAtPmNvbnRyb2wpOworCQljdHJsICY9IH5iaXQ7CisJCXdyaXRlbChjdHJsLCBzbWNoaXAtPmNvbnRyb2wpOworCisJCXNtNTAxX3N5bmNfcmVncyhzbTUwMV9ncGlvX3RvX2RldihzbWNoaXAtPm91cmdwaW8pKTsKKwl9Cit9CisKIHN0YXRpYyB2b2lkIHNtNTAxX2dwaW9fc2V0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCwgaW50IHZhbHVlKQogCiB7CkBAIC05MjksNiArOTQ5LDggQEAKIAl3cml0ZWwodmFsLCByZWdzKTsKIAogCXNtNTAxX3N5bmNfcmVncyhzbTUwMV9ncGlvX3RvX2RldihzbWdwaW8pKTsKKwlzbTUwMV9ncGlvX2Vuc3VyZV9ncGlvKHNtY2hpcCwgYml0KTsKKwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNtZ3Bpby0+bG9jaywgc2F2ZSk7CiB9CiAKQEAgLTk0MSw4ICs5NjMsOCBAQAogCXVuc2lnbmVkIGxvbmcgc2F2ZTsKIAl1bnNpZ25lZCBsb25nIGRkcjsKIAotCWRldl9pbmZvKHNtNTAxX2dwaW9fdG9fZGV2KHNtZ3BpbyktPmRldiwgIiVzKCVwLCVkKVxuIiwKLQkJIF9fZnVuY19fLCBjaGlwLCBvZmZzZXQpOworCWRldl9kYmcoc201MDFfZ3Bpb190b19kZXYoc21ncGlvKS0+ZGV2LCAiJXMoJXAsJWQpXG4iLAorCQlfX2Z1bmNfXywgY2hpcCwgb2Zmc2V0KTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZzbWdwaW8tPmxvY2ssIHNhdmUpOwogCkBAIC05NTAsNiArOTcyLDggQEAKIAl3cml0ZWwoZGRyICYgfmJpdCwgcmVncyArIFNNNTAxX0dQSU9fRERSX0xPVyk7CiAKIAlzbTUwMV9zeW5jX3JlZ3Moc201MDFfZ3Bpb190b19kZXYoc21ncGlvKSk7CisJc201MDFfZ3Bpb19lbnN1cmVfZ3BpbyhzbWNoaXAsIGJpdCk7CisKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzbWdwaW8tPmxvY2ssIHNhdmUpOwogCiAJcmV0dXJuIDA7CkBAIC0xMDEyLDkgKzEwMzYsMTEgQEAKIAkJaWYgKGJhc2UgPiAwKQogCQkJYmFzZSArPSAzMjsKIAkJY2hpcC0+cmVnYmFzZSA9IGdwaW8tPnJlZ3MgKyBTTTUwMV9HUElPX0RBVEFfSElHSDsKKwkJY2hpcC0+Y29udHJvbCA9IHNtLT5yZWdzICsgU001MDFfR1BJTzYzXzMyX0NPTlRST0w7CiAJCWdjaGlwLT5sYWJlbCAgPSAiU001MDEtSElHSCI7CiAJfSBlbHNlIHsKIAkJY2hpcC0+cmVnYmFzZSA9IGdwaW8tPnJlZ3MgKyBTTTUwMV9HUElPX0RBVEFfTE9XOworCQljaGlwLT5jb250cm9sID0gc20tPnJlZ3MgKyBTTTUwMV9HUElPMzFfMF9DT05UUk9MOwogCQlnY2hpcC0+bGFiZWwgID0gIlNNNTAxLUxPVyI7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC90d2w0MDMwLWNvcmUuYyBiL2RyaXZlcnMvbWZkL3R3bDQwMzAtY29yZS5jCmluZGV4IGI1OWMzODUuLmU3YWIwMDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWZkL3R3bDQwMzAtY29yZS5jCisrKyBiL2RyaXZlcnMvbWZkL3R3bDQwMzAtY29yZS5jCkBAIC0zOCw2ICszOCw5IEBACiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjL3R3bDQwMzAuaD4KIAorI2lmZGVmIENPTkZJR19BUk0KKyNpbmNsdWRlIDxtYWNoL2NwdS5oPgorI2VuZGlmCiAKIC8qCiAgKiBUaGUgVFdMNDAzMCAiVHJpdG9uIDIiIGlzIG9uZSBvZiBhIGZhbWlseSBvZiBhIG11bHRpLWZ1bmN0aW9uICJQb3dlcgpAQCAtNjQ2LDcgKzY0OSw3IEBACiAJcmV0dXJuIGU7CiB9CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBjbG9ja3NfaW5pdCh2b2lkKQorc3RhdGljIHZvaWQgX19pbml0IGNsb2Nrc19pbml0KHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlpbnQgZSA9IDA7CiAJc3RydWN0IGNsayAqb3NjOwpAQCAtNjU1LDkgKzY1OCw5IEBACiAKICNpZiBkZWZpbmVkKENPTkZJR19BUkNIX09NQVAyKSB8fCBkZWZpbmVkKENPTkZJR19BUkNIX09NQVAzKQogCWlmIChjcHVfaXNfb21hcDI0MzAoKSkKLQkJb3NjID0gY2xrX2dldChOVUxMLCAib3NjX2NrIik7CisJCW9zYyA9IGNsa19nZXQoZGV2LCAib3NjX2NrIik7CiAJZWxzZQotCQlvc2MgPSBjbGtfZ2V0KE5VTEwsICJvc2Nfc3lzX2NrIik7CisJCW9zYyA9IGNsa19nZXQoZGV2LCAib3NjX3N5c19jayIpOwogCiAJaWYgKElTX0VSUihvc2MpKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIlNraXBwaW5nIHR3bDQwMzAgaW50ZXJuYWwgY2xvY2sgaW5pdCBhbmQgIgpAQCAtNzczLDcgKzc3Niw3IEBACiAJaW51c2UgPSB0cnVlOwogCiAJLyogc2V0dXAgY2xvY2sgZnJhbWV3b3JrICovCi0JY2xvY2tzX2luaXQoKTsKKwljbG9ja3NfaW5pdCgmY2xpZW50LT5kZXYpOwogCiAJLyogTWF5YmUgaW5pdCB0aGUgVDIgSW50ZXJydXB0IHN1YnN5c3RlbSAqLwogCWlmIChjbGllbnQtPmlycQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvd204MzUwLWNvcmUuYyBiL2RyaXZlcnMvbWZkL3dtODM1MC1jb3JlLmMKaW5kZXggM2EyNzNjYy4uZjkyNTk1YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZmQvd204MzUwLWNvcmUuYworKysgYi9kcml2ZXJzL21mZC93bTgzNTAtY29yZS5jCkBAIC0xNDUzLDYgKzE0NTMsOSBAQAogewogCWludCBpOwogCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUod204MzUwLT5wbWljLmxlZCk7IGkrKykKKwkJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIod204MzUwLT5wbWljLmxlZFtpXS5wZGV2KTsKKwogCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHdtODM1MC0+cG1pYy5wZGV2KTsgaSsrKQogCQlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3Rlcih3bTgzNTAtPnBtaWMucGRldltpXSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9LY29uZmlnIGIvZHJpdmVycy9taXNjL0tjb25maWcKaW5kZXggZmVlNzMwNC4uNDE5YzM3OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL0tjb25maWcKKysrIGIvZHJpdmVycy9taXNjL0tjb25maWcKQEAgLTEyMCw3ICsxMjAsNyBAQAogCSAgY2FyZHMgYXJlIHN1cHBvcnRlZCB2aWEgJ01NQy9TRCBDYXJkIHN1cHBvcnQ6IFRJIEZsYXNoIE1lZGlhIE1NQy9TRAogCSAgSW50ZXJmYWNlIHN1cHBvcnQgKE1NQ19USUZNX1NEKScuCiAKLSAgICAgICAgICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlIHdpbGwKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUgd2lsbAogCSAgYmUgY2FsbGVkIHRpZm1fY29yZS4KIAogY29uZmlnIFRJRk1fN1hYMQpAQCAtMTMzLDEwMCArMTMzLDkgQEAKIAkgIFRvIG1ha2UgYWN0dWFsIHVzZSBvZiB0aGUgZGV2aWNlLCB5b3Ugd2lsbCBoYXZlIHRvIHNlbGVjdCBzb21lCiAJICBmbGFzaCBjYXJkIGZvcm1hdCBkcml2ZXJzLCBhcyBvdXRsaW5lZCBpbiB0aGUgVElGTV9DT1JFIEhlbHAuCiAKLSAgICAgICAgICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlIHdpbGwKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUgd2lsbAogCSAgYmUgY2FsbGVkIHRpZm1fN3h4MS4KIAotY29uZmlnIEFDRVJfV01JCi0gICAgICAgIHRyaXN0YXRlICJBY2VyIFdNSSBMYXB0b3AgRXh0cmFzIChFWFBFUklNRU5UQUwpIgotCWRlcGVuZHMgb24gWDg2Ci0JZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwKLQlkZXBlbmRzIG9uIEFDUEkKLQlkZXBlbmRzIG9uIExFRFNfQ0xBU1MKLQlkZXBlbmRzIG9uIE5FV19MRURTCi0JZGVwZW5kcyBvbiBCQUNLTElHSFRfQ0xBU1NfREVWSUNFCi0JZGVwZW5kcyBvbiBTRVJJT19JODA0MgotCWRlcGVuZHMgb24gUkZLSUxMCi0Jc2VsZWN0IEFDUElfV01JCi0JLS0taGVscC0tLQotCSAgVGhpcyBpcyBhIGRyaXZlciBmb3IgbmV3ZXIgQWNlciAoYW5kIFdpc3Ryb24pIGxhcHRvcHMuIEl0IGFkZHMKLQkgIHdpcmVsZXNzIHJhZGlvIGFuZCBibHVldG9vdGggY29udHJvbCwgYW5kIG9uIHNvbWUgbGFwdG9wcywKLQkgIGV4cG9zZXMgdGhlIG1haWwgTEVEIGFuZCBMQ0QgYmFja2xpZ2h0LgotCi0JICBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGRyaXZlciBzZWUKLQkgIDxmaWxlOkRvY3VtZW50YXRpb24vbGFwdG9wcy9hY2VyLXdtaS50eHQ+Ci0KLQkgIElmIHlvdSBoYXZlIGFuIEFDUEktV01JIGNvbXBhdGlibGUgQWNlci8gV2lzdHJvbiBsYXB0b3AsIHNheSBZIG9yIE0KLQkgIGhlcmUuCi0KLWNvbmZpZyBBU1VTX0xBUFRPUAotICAgICAgICB0cmlzdGF0ZSAiQXN1cyBMYXB0b3AgRXh0cmFzIChFWFBFUklNRU5UQUwpIgotICAgICAgICBkZXBlbmRzIG9uIFg4NgotICAgICAgICBkZXBlbmRzIG9uIEFDUEkKLQlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTCAmJiAhQUNQSV9BU1VTCi0JZGVwZW5kcyBvbiBMRURTX0NMQVNTCi0JZGVwZW5kcyBvbiBORVdfTEVEUwotCWRlcGVuZHMgb24gQkFDS0xJR0hUX0NMQVNTX0RFVklDRQotICAgICAgICAtLS1oZWxwLS0tCi0JICBUaGlzIGlzIHRoZSBuZXcgTGludXggZHJpdmVyIGZvciBBc3VzIGxhcHRvcHMuIEl0IG1heSBhbHNvIHN1cHBvcnQgc29tZQotCSAgTUVESU9OLCBKVkMgb3IgVklDVE9SIGxhcHRvcHMuIEl0IG1ha2VzIGFsbCB0aGUgZXh0cmEgYnV0dG9ucyBnZW5lcmF0ZQotCSAgc3RhbmRhcmQgQUNQSSBldmVudHMgdGhhdCBnbyB0aHJvdWdoIC9wcm9jL2FjcGkvZXZlbnRzLiBJdCBhbHNvIGFkZHMKLQkgIHN1cHBvcnQgZm9yIHZpZGVvIG91dHB1dCBzd2l0Y2hpbmcsIExDRCBiYWNrbGlnaHQgY29udHJvbCwgQmx1ZXRvb3RoIGFuZAotCSAgV2xhbiBjb250cm9sLCBhbmQgbW9zdCBpbXBvcnRhbnRseSwgYWxsb3dzIHlvdSB0byBibGluayB0aG9zZSBmYW5jeSBMRURzLgotCi0JICBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhbmQgYSB1c2Vyc3BhY2UgZGFlbW9uIGZvciBoYW5kbGluZyB0aGUgZXh0cmEKLQkgIGJ1dHRvbnMgc2VlIDxodHRwOi8vYWNwaTRhc3VzLnNmLm5ldC8+LgotCi0JICBJZiB5b3UgaGF2ZSBhbiBBQ1BJLWNvbXBhdGlibGUgQVNVUyBsYXB0b3AsIHNheSBZIG9yIE0gaGVyZS4KLQotY29uZmlnIEZVSklUU1VfTEFQVE9QCi0gICAgICAgIHRyaXN0YXRlICJGdWppdHN1IExhcHRvcCBFeHRyYXMiCi0gICAgICAgIGRlcGVuZHMgb24gWDg2Ci0gICAgICAgIGRlcGVuZHMgb24gQUNQSQotCWRlcGVuZHMgb24gSU5QVVQKLSAgICAgICAgZGVwZW5kcyBvbiBCQUNLTElHSFRfQ0xBU1NfREVWSUNFCi0gICAgICAgIC0tLWhlbHAtLS0KLQkgIFRoaXMgaXMgYSBkcml2ZXIgZm9yIGxhcHRvcHMgYnVpbHQgYnkgRnVqaXRzdToKLQotCSAgICAqIFAyeHh4L1A1eHh4L1M2eHh4L1M3eHh4IHNlcmllcyBMaWZlYm9va3MKLQkgICAgKiBQb3NzaWJseSBvdGhlciBGdWppdHN1IGxhcHRvcCBtb2RlbHMKLQkgICAgKiBUZXN0ZWQgd2l0aCBTNjQxMCBhbmQgUzcwMjAKLQotCSAgSXQgYWRkcyBzdXBwb3J0IGZvciBMQ0QgYnJpZ2h0bmVzcyBjb250cm9sIGFuZCBzb21lIGhvdGtleXMuCi0KLQkgIElmIHlvdSBoYXZlIGEgRnVqaXRzdSBsYXB0b3AsIHNheSBZIG9yIE0gaGVyZS4KLQotY29uZmlnIEZVSklUU1VfTEFQVE9QX0RFQlVHCi0JYm9vbCAiVmVyYm9zZSBkZWJ1ZyBtb2RlIGZvciBGdWppdHN1IExhcHRvcCBFeHRyYXMiCi0JZGVwZW5kcyBvbiBGVUpJVFNVX0xBUFRPUAotCWRlZmF1bHQgbgotCS0tLWhlbHAtLS0KLQkgIEVuYWJsZXMgZXh0cmEgZGVidWcgb3V0cHV0IGZyb20gdGhlIGZ1aml0c3UgZXh0cmFzIGRyaXZlciwgYXQgdGhlCi0JICBleHBlbnNlIG9mIGEgc2xpZ2h0IGluY3JlYXNlIGluIGRyaXZlciBzaXplLgotCi0JICBJZiB5b3UgYXJlIG5vdCBzdXJlLCBzYXkgTiBoZXJlLgotCi1jb25maWcgVEMxMTAwX1dNSQotCXRyaXN0YXRlICJIUCBDb21wYXEgVEMxMTAwIFRhYmxldCBXTUkgRXh0cmFzIChFWFBFUklNRU5UQUwpIgotCWRlcGVuZHMgb24gWDg2ICYmICFYODZfNjQKLQlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTAotCWRlcGVuZHMgb24gQUNQSQotCXNlbGVjdCBBQ1BJX1dNSQotCS0tLWhlbHAtLS0KLQkgIFRoaXMgaXMgYSBkcml2ZXIgZm9yIHRoZSBXTUkgZXh0ZW5zaW9ucyAod2lyZWxlc3MgYW5kIGJsdWV0b290aCBwb3dlcgotCSAgY29udHJvbCkgb2YgdGhlIEhQIENvbXBhcSBUQzExMDAgdGFibGV0LgotCi1jb25maWcgSFBfV01JCi0gICAgICAgdHJpc3RhdGUgIkhQIFdNSSBleHRyYXMiCi0gICAgICAgZGVwZW5kcyBvbiBBQ1BJX1dNSQotICAgICAgIGRlcGVuZHMgb24gSU5QVVQKLSAgICAgICBkZXBlbmRzIG9uIFJGS0lMTAotICAgICAgIGhlbHAKLSAgICAgICAgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gc3VwcG9ydCBXTUktYmFzZWQgaG90a2V5cyBvbiBIUCBsYXB0b3BzIGFuZAotCSB0byByZWFkIGRhdGEgZnJvbSBXTUkgc3VjaCBhcyBkb2NraW5nIG9yIGFtYmllbnQgbGlnaHQgc2Vuc29yIHN0YXRlLgotCi0gICAgICAgICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlIHdpbGwKLSAgICAgICAgIGJlIGNhbGxlZCBocC13bWkuCi0KIGNvbmZpZyBJQ1M5MzJTNDAxCiAJdHJpc3RhdGUgIkludGVncmF0ZWQgQ2lyY3VpdHMgSUNTOTMyUzQwMSIKIAlkZXBlbmRzIG9uIEkyQyAmJiBFWFBFUklNRU5UQUwKQEAgLTIzNywxNzAgKzE0Niw2IEBACiAJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gSWYgc28sIHRoZSBtb2R1bGUKIAkgIHdpbGwgYmUgY2FsbGVkIGljczkzMnM0MDEuCiAKLWNvbmZpZyBNU0lfTEFQVE9QCi0gICAgICAgIHRyaXN0YXRlICJNU0kgTGFwdG9wIEV4dHJhcyIKLSAgICAgICAgZGVwZW5kcyBvbiBYODYKLSAgICAgICAgZGVwZW5kcyBvbiBBQ1BJCi0gICAgICAgIGRlcGVuZHMgb24gQkFDS0xJR0hUX0NMQVNTX0RFVklDRQotICAgICAgICAtLS1oZWxwLS0tCi0JICBUaGlzIGlzIGEgZHJpdmVyIGZvciBsYXB0b3BzIGJ1aWx0IGJ5IE1TSSAoTUlDUk8tU1RBUgotCSAgSU5URVJOQVRJT05BTCk6Ci0KLQkgIE1TSSBNZWdhQm9vayBTMjcwIChNUy0xMDEzKQotCSAgQ3l0cm9uL1RDTS9NZWRpb24vVGNoaWJvIE1EOTYxMDAvU0FNMjAwMAotCi0JICBJdCBhZGRzIHN1cHBvcnQgZm9yIEJsdWV0b290aCwgV0xBTiBhbmQgTENEIGJyaWdodG5lc3MgY29udHJvbC4KLQotCSAgTW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGRyaXZlciBpcyBhdmFpbGFibGUgYXQKLQkgIDxodHRwOi8vMHBvaW50ZXIuZGUvbGVubmFydC90Y2hpYm8uaHRtbD4uCi0KLQkgIElmIHlvdSBoYXZlIGFuIE1TSSBTMjcwIGxhcHRvcCwgc2F5IFkgb3IgTSBoZXJlLgotCi1jb25maWcgUEFOQVNPTklDX0xBUFRPUAotCXRyaXN0YXRlICJQYW5hc29uaWMgTGFwdG9wIEV4dHJhcyIKLQlkZXBlbmRzIG9uIFg4NiAmJiBJTlBVVCAmJiBBQ1BJCi0gICAgICAgIGRlcGVuZHMgb24gQkFDS0xJR0hUX0NMQVNTX0RFVklDRQotCS0tLWhlbHAtLS0KLQkgIFRoaXMgZHJpdmVyIGFkZHMgc3VwcG9ydCBmb3IgYWNjZXNzIHRvIGJhY2tsaWdodCBjb250cm9sIGFuZCBob3RrZXlzCi0JICBvbiBQYW5hc29uaWMgTGV0J3MgTm90ZSBsYXB0b3BzLgotCi0JICBJZiB5b3UgaGF2ZSBhIFBhbmFzb25pYyBMZXQncyBub3RlIGxhcHRvcCAoc3VjaCBhcyB0aGUgUjEoTiB2YXJpYW50KSwKLQkgIFIyLCBSMywgUjUsIFQyLCBXMiBhbmQgWTIgc2VyaWVzKSwgc2F5IFkuCi0KLWNvbmZpZyBDT01QQUxfTEFQVE9QCi0JdHJpc3RhdGUgIkNvbXBhbCBMYXB0b3AgRXh0cmFzIgotCWRlcGVuZHMgb24gWDg2Ci0JZGVwZW5kcyBvbiBBQ1BJCi0JZGVwZW5kcyBvbiBCQUNLTElHSFRfQ0xBU1NfREVWSUNFCi0JLS0taGVscC0tLQotCSAgVGhpcyBpcyBhIGRyaXZlciBmb3IgbGFwdG9wcyBidWlsdCBieSBDb21wYWw6Ci0KLQkgIENvbXBhbCBGTDkwL0lGTDkwCi0JICBDb21wYWwgRkw5MS9JRkw5MQotCSAgQ29tcGFsIEZMOTIvSkZMOTIKLQkgIENvbXBhbCBGVDAwL0lGVDAwCi0KLQkgIEl0IGFkZHMgc3VwcG9ydCBmb3IgQmx1ZXRvb3RoLCBXTEFOIGFuZCBMQ0QgYnJpZ2h0bmVzcyBjb250cm9sLgotCi0JICBJZiB5b3UgaGF2ZSBhbiBDb21wYWwgRkw5eC9JRkw5eC9GVDAwIGxhcHRvcCwgc2F5IFkgb3IgTSBoZXJlLgotCi1jb25maWcgU09OWV9MQVBUT1AKLQl0cmlzdGF0ZSAiU29ueSBMYXB0b3AgRXh0cmFzIgotCWRlcGVuZHMgb24gWDg2ICYmIEFDUEkKLQlzZWxlY3QgQkFDS0xJR0hUX0NMQVNTX0RFVklDRQotCWRlcGVuZHMgb24gSU5QVVQKLQkgIC0tLWhlbHAtLS0KLQkgIFRoaXMgbWluaS1kcml2ZXIgZHJpdmVzIHRoZSBTTkMgYW5kIFNQSUMgZGV2aWNlcyBwcmVzZW50IGluIHRoZSBBQ1BJCi0JICBCSU9TIG9mIHRoZSBTb255IFZhaW8gbGFwdG9wcy4KLQotCSAgSXQgZ2l2ZXMgYWNjZXNzIHRvIHNvbWUgZXh0cmEgbGFwdG9wIGZ1bmN0aW9uYWxpdGllcyBsaWtlIEJsdWV0b290aCwKLQkgIHNjcmVlbiBicmlnaHRuZXNzIGNvbnRyb2wsIEZuIGtleXMgYW5kIGFsbG93cyBwb3dlcmluZyBvbi9vZmYgc29tZQotCSAgZGV2aWNlcy4KLQotCSAgUmVhZCA8ZmlsZTpEb2N1bWVudGF0aW9uL2xhcHRvcHMvc29ueS1sYXB0b3AudHh0PiBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLQotY29uZmlnIFNPTllQSV9DT01QQVQKLQlib29sICJTb255cGkgY29tcGF0aWJpbGl0eSIKLQlkZXBlbmRzIG9uIFNPTllfTEFQVE9QCi0JICAtLS1oZWxwLS0tCi0JICBCdWlsZCB0aGUgc29ueXBpIGRyaXZlciBjb21wYXRpYmlsaXR5IGNvZGUgaW50byB0aGUgc29ueS1sYXB0b3AgZHJpdmVyLgotCi1jb25maWcgVEhJTktQQURfQUNQSQotCXRyaXN0YXRlICJUaGlua1BhZCBBQ1BJIExhcHRvcCBFeHRyYXMiCi0JZGVwZW5kcyBvbiBYODYgJiYgQUNQSQotCXNlbGVjdCBCQUNLTElHSFRfTENEX1NVUFBPUlQKLQlzZWxlY3QgQkFDS0xJR0hUX0NMQVNTX0RFVklDRQotCXNlbGVjdCBIV01PTgotCXNlbGVjdCBOVlJBTQotCXNlbGVjdCBJTlBVVAotCXNlbGVjdCBORVdfTEVEUwotCXNlbGVjdCBMRURTX0NMQVNTCi0Jc2VsZWN0IE5FVAotCXNlbGVjdCBSRktJTEwKLQktLS1oZWxwLS0tCi0JICBUaGlzIGlzIGEgZHJpdmVyIGZvciB0aGUgSUJNIGFuZCBMZW5vdm8gVGhpbmtQYWQgbGFwdG9wcy4gSXQgYWRkcwotCSAgc3VwcG9ydCBmb3IgRm4tRngga2V5IGNvbWJpbmF0aW9ucywgQmx1ZXRvb3RoIGNvbnRyb2wsIHZpZGVvCi0JICBvdXRwdXQgc3dpdGNoaW5nLCBUaGlua0xpZ2h0IGNvbnRyb2wsIFVsdHJhQmF5IGVqZWN0IGFuZCBtb3JlLgotCSAgRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBkcml2ZXIgc2VlCi0JICA8ZmlsZTpEb2N1bWVudGF0aW9uL2xhcHRvcHMvdGhpbmtwYWQtYWNwaS50eHQ+IGFuZAotCSAgPGh0dHA6Ly9pYm0tYWNwaS5zZi5uZXQvPiAuCi0KLQkgIFRoaXMgZHJpdmVyIHdhcyBmb3JtZXJseSBrbm93biBhcyBpYm0tYWNwaS4KLQotCSAgSWYgeW91IGhhdmUgYW4gSUJNIG9yIExlbm92byBUaGlua1BhZCBsYXB0b3AsIHNheSBZIG9yIE0gaGVyZS4KLQotY29uZmlnIFRISU5LUEFEX0FDUElfREVCVUcKLQlib29sICJWZXJib3NlIGRlYnVnIG1vZGUiCi0JZGVwZW5kcyBvbiBUSElOS1BBRF9BQ1BJCi0JZGVmYXVsdCBuCi0JLS0taGVscC0tLQotCSAgRW5hYmxlcyBleHRyYSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24sIGF0IHRoZSBleHBlbnNlIG9mIGEgc2xpZ2h0bHkKLQkgIGluY3JlYXNlIGluIGRyaXZlciBzaXplLgotCi0JICBJZiB5b3UgYXJlIG5vdCBzdXJlLCBzYXkgTiBoZXJlLgotCi1jb25maWcgVEhJTktQQURfQUNQSV9ET0NLCi0JYm9vbCAiTGVnYWN5IERvY2tpbmcgU3RhdGlvbiBTdXBwb3J0IgotCWRlcGVuZHMgb24gVEhJTktQQURfQUNQSQotCWRlcGVuZHMgb24gQUNQSV9ET0NLPW4KLQlkZWZhdWx0IG4KLQktLS1oZWxwLS0tCi0JICBBbGxvd3MgdGhlIHRoaW5rcGFkX2FjcGkgZHJpdmVyIHRvIGhhbmRsZSBkb2NraW5nIHN0YXRpb24gZXZlbnRzLgotCSAgVGhpcyBzdXBwb3J0IHdhcyBtYWRlIG9ic29sZXRlIGJ5IHRoZSBnZW5lcmljIEFDUEkgZG9ja2luZyBzdGF0aW9uCi0JICBzdXBwb3J0IChDT05GSUdfQUNQSV9ET0NLKS4gIEl0IHdpbGwgYWxsb3cgbG9ja2luZyBhbmQgcmVtb3ZpbmcgdGhlCi0JICBsYXB0b3AgZnJvbSB0aGUgZG9ja2luZyBzdGF0aW9uLCBidXQgd2lsbCBub3QgcHJvcGVybHkgY29ubmVjdCBQQ0kKLQkgIGRldmljZXMuCi0KLQkgIElmIHlvdSBhcmUgbm90IHN1cmUsIHNheSBOIGhlcmUuCi0KLWNvbmZpZyBUSElOS1BBRF9BQ1BJX0JBWQotCWJvb2wgIkxlZ2FjeSBSZW1vdmFibGUgQmF5IFN1cHBvcnQiCi0JZGVwZW5kcyBvbiBUSElOS1BBRF9BQ1BJCi0JZGVmYXVsdCB5Ci0JLS0taGVscC0tLQotCSAgQWxsb3dzIHRoZSB0aGlua3BhZF9hY3BpIGRyaXZlciB0byBoYW5kbGUgcmVtb3ZhYmxlIGJheXMuICBJdCB3aWxsCi0JICBlbGVjdHJpY2FsbHkgZGlzYWJsZSB0aGUgZGV2aWNlIGluIHRoZSBiYXksIGFuZCBhbHNvIGdlbmVyYXRlCi0JICBub3RpZmljYXRpb25zIHdoZW4gdGhlIGJheSBsZXZlciBpcyBlamVjdGVkIG9yIGluc2VydGVkLgotCi0JICBJZiB5b3UgYXJlIG5vdCBzdXJlLCBzYXkgWSBoZXJlLgotCi1jb25maWcgVEhJTktQQURfQUNQSV9WSURFTwotCWJvb2wgIlZpZGVvIG91dHB1dCBjb250cm9sIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBUSElOS1BBRF9BQ1BJCi0JZGVmYXVsdCB5Ci0JLS0taGVscC0tLQotCSAgQWxsb3dzIHRoZSB0aGlua3BhZF9hY3BpIGRyaXZlciB0byBwcm92aWRlIGFuIGludGVyZmFjZSB0byBjb250cm9sCi0JICB0aGUgdmFyaW91cyB2aWRlbyBvdXRwdXQgcG9ydHMuCi0KLQkgIFRoaXMgZmVhdHVyZSBvZnRlbiB3b24ndCB3b3JrIHdlbGwsIGRlcGVuZGluZyBvbiBUaGlua1BhZCBtb2RlbCwKLQkgIGRpc3BsYXkgc3RhdGUsIHZpZGVvIG91dHB1dCBkZXZpY2VzIGluIHVzZSwgd2hldGhlciB0aGVyZSBpcyBhIFgKLQkgIHNlcnZlciBydW5uaW5nLCBwaGFzZSBvZiB0aGUgbW9vbiwgYW5kIHRoZSBjdXJyZW50IG1vb2Qgb2YKLQkgIFNjaHJvZWRpbmdlcidzIGNhdC4gIElmIHlvdSBjYW4gdXNlIFgub3JnJ3MgUmFuZFIgdG8gY29udHJvbAotCSAgeW91ciBUaGlua1BhZCdzIHZpZGVvIG91dHB1dCBwb3J0cyBpbnN0ZWFkIG9mIHRoaXMgZmVhdHVyZSwKLQkgIGRvbid0IHRoaW5rIHR3aWNlOiBkbyBpdCBhbmQgc2F5IE4gaGVyZSB0byBzYXZlIHNvbWUgbWVtb3J5LgotCi0JICBJZiB5b3UgYXJlIG5vdCBzdXJlLCBzYXkgWSBoZXJlLgotCi1jb25maWcgVEhJTktQQURfQUNQSV9IT1RLRVlfUE9MTAotCWJvb2wgIlN1cHBvcnQgTlZSQU0gcG9sbGluZyBmb3IgaG90IGtleXMiCi0JZGVwZW5kcyBvbiBUSElOS1BBRF9BQ1BJCi0JZGVmYXVsdCB5Ci0JLS0taGVscC0tLQotCSAgU29tZSB0aGlua3BhZCBtb2RlbHMgYmVuZWZpdCBmcm9tIE5WUkFNIHBvbGxpbmcgdG8gZGV0ZWN0IGEgZmV3IG9mCi0JICB0aGUgaG90IGtleSBwcmVzcyBldmVudHMuICBJZiB5b3Uga25vdyB5b3VyIFRoaW5rUGFkIG1vZGVsIGRvZXMgbm90Ci0JICBuZWVkIHRvIGRvIE5WUkFNIHBvbGxpbmcgdG8gc3VwcG9ydCBhbnkgb2YgdGhlIGhvdCBrZXlzIHlvdSB1c2UsCi0JICB1bnNlbGVjdGluZyB0aGlzIG9wdGlvbiB3aWxsIHNhdmUgYWJvdXQgMWtCIG9mIG1lbW9yeS4KLQotCSAgVGhpbmtQYWRzIFQ0MCBhbmQgbmV3ZXIsIFI1MiBhbmQgbmV3ZXIsIGFuZCBYMzEgYW5kIG5ld2VyIGFyZQotCSAgdW5saWtlbHkgdG8gbmVlZCBOVlJBTSBwb2xsaW5nIGluIHRoZWlyIGxhdGVzdCBCSU9TIHZlcnNpb25zLgotCi0JICBOVlJBTSBwb2xsaW5nIGNhbiBkZXRlY3QgYXQgbW9zdCB0aGUgZm9sbG93aW5nIGtleXM6IFRoaW5rUGFkL0FjY2VzcwotCSAgSUJNLCBab29tLCBTd2l0Y2ggRGlzcGxheSAoZm4rRjcpLCBUaGlua0xpZ2h0LCBWb2x1bWUgdXAvZG93bi9tdXRlLAotCSAgQnJpZ2h0bmVzcyB1cC9kb3duLCBEaXNwbGF5IEV4cGFuZCAoZm4rRjgpLCBIaWJlcm5hdGUgKGZuK0YxMikuCi0KLQkgIElmIHlvdSBhcmUgbm90IHN1cmUsIHNheSBZIGhlcmUuICBUaGUgZHJpdmVyIGVuYWJsZXMgcG9sbGluZyBvbmx5IGlmCi0JICBpdCBpcyBzdHJpY3RseSBuZWNlc3NhcnkgdG8gZG8gc28uCi0KIGNvbmZpZyBBVE1FTF9TU0MKIAl0cmlzdGF0ZSAiRGV2aWNlIGRyaXZlciBmb3IgQXRtZWwgU1NDIHBlcmlwaGVyYWwiCiAJZGVwZW5kcyBvbiBBVlIzMiB8fCBBUkNIX0FUOTEKQEAgLTQxMywzMSArMTU4LDYgQEAKIAogCSAgSWYgdW5zdXJlLCBzYXkgTi4KIAotY29uZmlnIElOVEVMX01FTkxPVwotCXRyaXN0YXRlICJUaGVybWFsIE1hbmFnZW1lbnQgZHJpdmVyIGZvciBJbnRlbCBtZW5sb3cgcGxhdGZvcm0iCi0JZGVwZW5kcyBvbiBBQ1BJX1RIRVJNQUwKLQlzZWxlY3QgVEhFUk1BTAotCWRlcGVuZHMgb24gWDg2Ci0JLS0taGVscC0tLQotCSAgQUNQSSB0aGVybWFsIG1hbmFnZW1lbnQgZW5oYW5jZW1lbnQgZHJpdmVyIG9uCi0JICBJbnRlbCBNZW5sb3cgcGxhdGZvcm0uCi0KLQkgIElmIHVuc3VyZSwgc2F5IE4uCi0KLWNvbmZpZyBFRUVQQ19MQVBUT1AKLQl0cmlzdGF0ZSAiRWVlIFBDIEhvdGtleSBEcml2ZXIgKEVYUEVSSU1FTlRBTCkiCi0JZGVwZW5kcyBvbiBYODYKLQlkZXBlbmRzIG9uIEFDUEkKLQlkZXBlbmRzIG9uIEJBQ0tMSUdIVF9DTEFTU19ERVZJQ0UKLQlkZXBlbmRzIG9uIEhXTU9OCi0JZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwKLQlkZXBlbmRzIG9uIFJGS0lMTAotCS0tLWhlbHAtLS0KLQkgIFRoaXMgZHJpdmVyIHN1cHBvcnRzIHRoZSBGbi1GeCBrZXlzIG9uIEVlZSBQQyBsYXB0b3BzLgotCSAgSXQgYWxzbyBhZGRzIHRoZSBhYmlsaXR5IHRvIHN3aXRjaCBjYW1lcmEvd2xhbiBvbi9vZmYuCi0KLQkgIElmIHlvdSBoYXZlIGFuIEVlZSBQQyBsYXB0b3AsIHNheSBZIG9yIE0gaGVyZS4KLQogY29uZmlnIEVOQ0xPU1VSRV9TRVJWSUNFUwogCXRyaXN0YXRlICJFbmNsb3N1cmUgU2VydmljZXMiCiAJZGVmYXVsdCBuCkBAIC00OTgsNiArMjE4LDE4IEBACiAJVGhpcyBvcHRpb24gZW5hYmxlcyBhZGRpdGlvbiBkZWJ1Z2dpbmcgY29kZSBmb3IgdGhlIFNHSSBHUlUgZHJpdmVyLiBJZgogCXlvdSBhcmUgdW5zdXJlLCBzYXkgTi4KIAorY29uZmlnIERFTExfTEFQVE9QCisJdHJpc3RhdGUgIkRlbGwgTGFwdG9wIEV4dHJhcyAoRVhQRVJJTUVOVEFMKSIKKwlkZXBlbmRzIG9uIFg4NgorCWRlcGVuZHMgb24gRENEQkFTCisJZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwKKwlkZXBlbmRzIG9uIEJBQ0tMSUdIVF9DTEFTU19ERVZJQ0UKKwlkZXBlbmRzIG9uIFJGS0lMTAorCWRlZmF1bHQgbgorCS0tLWhlbHAtLS0KKwlUaGlzIGRyaXZlciBhZGRzIHN1cHBvcnQgZm9yIHJma2lsbCBhbmQgYmFja2xpZ2h0IGNvbnRyb2wgdG8gRGVsbAorCWxhcHRvcHMuCisKIHNvdXJjZSAiZHJpdmVycy9taXNjL2MycG9ydC9LY29uZmlnIgogCiBlbmRpZiAjIE1JU0NfREVWSUNFUwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL01ha2VmaWxlIGIvZHJpdmVycy9taXNjL01ha2VmaWxlCmluZGV4IDgxN2Y3ZjUuLmQ1NzQ5YTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9NYWtlZmlsZQorKysgYi9kcml2ZXJzL21pc2MvTWFrZWZpbGUKQEAgLTEsMzIgKzEsMTkgQEAKICMKICMgTWFrZWZpbGUgZm9yIG1pc2MgZGV2aWNlcyB0aGF0IHJlYWxseSBkb24ndCBmaXQgYW55d2hlcmUgZWxzZS4KICMKLW9iai0gOj0gbWlzYy5vCSMgRHVtbXkgcnVsZSB0byBmb3JjZSBidWlsdC1pbi5vIHRvIGJlIG1hZGUKIAogb2JqLSQoQ09ORklHX0lCTV9BU00pCQkrPSBpYm1hc20vCiBvYmotJChDT05GSUdfSERQVV9GRUFUVVJFUykJKz0gaGRwdWZ0cnMvCi1vYmotJChDT05GSUdfQVNVU19MQVBUT1ApCSs9IGFzdXMtbGFwdG9wLm8KLW9iai0kKENPTkZJR19FRUVQQ19MQVBUT1ApCSs9IGVlZXBjLWxhcHRvcC5vCi1vYmotJChDT05GSUdfTVNJX0xBUFRPUCkJKz0gbXNpLWxhcHRvcC5vCi1vYmotJChDT05GSUdfQ09NUEFMX0xBUFRPUCkJKz0gY29tcGFsLWxhcHRvcC5vCi1vYmotJChDT05GSUdfQUNFUl9XTUkpCQkrPSBhY2VyLXdtaS5vCiBvYmotJChDT05GSUdfQVRNRUxfUFdNKQkJKz0gYXRtZWxfcHdtLm8KIG9iai0kKENPTkZJR19BVE1FTF9TU0MpCQkrPSBhdG1lbC1zc2Mubwogb2JqLSQoQ09ORklHX0FUTUVMX1RDTElCKQkrPSBhdG1lbF90Y2xpYi5vCi1vYmotJChDT05GSUdfSFBfV01JKQkJKz0gaHAtd21pLm8KIG9iai0kKENPTkZJR19JQ1M5MzJTNDAxKQkrPSBpY3M5MzJzNDAxLm8KLW9iai0kKENPTkZJR19UQzExMDBfV01JKQkrPSB0YzExMDAtd21pLm8KIG9iai0kKENPTkZJR19MS0RUTSkJCSs9IGxrZHRtLm8KIG9iai0kKENPTkZJR19USUZNX0NPUkUpICAgICAgIAkrPSB0aWZtX2NvcmUubwogb2JqLSQoQ09ORklHX1RJRk1fN1hYMSkgICAgICAgCSs9IHRpZm1fN3h4MS5vCiBvYmotJChDT05GSUdfUEhBTlRPTSkJCSs9IHBoYW50b20ubwogb2JqLSQoQ09ORklHX1NHSV9JT0M0KQkJKz0gaW9jNC5vCi1vYmotJChDT05GSUdfU09OWV9MQVBUT1ApCSs9IHNvbnktbGFwdG9wLm8KLW9iai0kKENPTkZJR19USElOS1BBRF9BQ1BJKQkrPSB0aGlua3BhZF9hY3BpLm8KLW9iai0kKENPTkZJR19GVUpJVFNVX0xBUFRPUCkJKz0gZnVqaXRzdS1sYXB0b3Aubwotb2JqLSQoQ09ORklHX1BBTkFTT05JQ19MQVBUT1ApCSs9IHBhbmFzb25pYy1sYXB0b3Aubwogb2JqLSQoQ09ORklHX0VFUFJPTV85M0NYNikJKz0gZWVwcm9tXzkzY3g2Lm8KLW9iai0kKENPTkZJR19JTlRFTF9NRU5MT1cpCSs9IGludGVsX21lbmxvdy5vCiBvYmotJChDT05GSUdfRU5DTE9TVVJFX1NFUlZJQ0VTKSArPSBlbmNsb3N1cmUubwogb2JqLSQoQ09ORklHX0tHREJfVEVTVFMpCSs9IGtnZGJ0cy5vCiBvYmotJChDT05GSUdfU0dJX1hQKQkJKz0gc2dpLXhwLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL2VlZXBjLWxhcHRvcC5jIGIvZHJpdmVycy9taXNjL2VlZXBjLWxhcHRvcC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMmZlMmI4Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbWlzYy9lZWVwYy1sYXB0b3AuYworKysgL2Rldi9udWxsCkBAIC0xLDg3MiArMCwwIEBACi0vKgotICogIGVlcGMtbGFwdG9wLmMgLSBBc3VzIEVlZSBQQyBleHRyYXMKLSAqCi0gKiAgQmFzZWQgb24gYXN1c19hY3BpLmMgYXMgcGF0Y2hlZCBmb3IgdGhlIEVlZSBQQyBieSBBc3VzOgotICogIGZ0cDovL2Z0cC5hc3VzLmNvbS9wdWIvQVNVUy9FZWVQQy83MDEvQVNVU19BQ1BJXzA3MTEyNi5yYXIKLSAqICBCYXNlZCBvbiBlZWUuYyBmcm9tIGVlZXBjLWxpbnV4Ci0gKgotICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2JhY2tsaWdodC5oPgotI2luY2x1ZGUgPGxpbnV4L2ZiLmg+Ci0jaW5jbHVkZSA8bGludXgvaHdtb24uaD4KLSNpbmNsdWRlIDxsaW51eC9od21vbi1zeXNmcy5oPgotI2luY2x1ZGUgPGFjcGkvYWNwaV9kcml2ZXJzLmg+Ci0jaW5jbHVkZSA8YWNwaS9hY3BpX2J1cy5oPgotI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KLSNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgotI2luY2x1ZGUgPGxpbnV4L3Jma2lsbC5oPgotCi0jZGVmaW5lIEVFRVBDX0xBUFRPUF9WRVJTSU9OCSIwLjEiCi0KLSNkZWZpbmUgRUVFUENfSE9US19OQU1FCQkiRWVlIFBDIEhvdGtleSBEcml2ZXIiCi0jZGVmaW5lIEVFRVBDX0hPVEtfRklMRQkJImVlZXBjIgotI2RlZmluZSBFRUVQQ19IT1RLX0NMQVNTCSJob3RrZXkiCi0jZGVmaW5lIEVFRVBDX0hPVEtfREVWSUNFX05BTUUJIkhvdGtleSIKLSNkZWZpbmUgRUVFUENfSE9US19ISUQJCSJBU1VTMDEwIgotCi0jZGVmaW5lIEVFRVBDX0xPRwlFRUVQQ19IT1RLX0ZJTEUgIjogIgotI2RlZmluZSBFRUVQQ19FUlIJS0VSTl9FUlIJRUVFUENfTE9HCi0jZGVmaW5lIEVFRVBDX1dBUk5JTkcJS0VSTl9XQVJOSU5HCUVFRVBDX0xPRwotI2RlZmluZSBFRUVQQ19OT1RJQ0UJS0VSTl9OT1RJQ0UJRUVFUENfTE9HCi0jZGVmaW5lIEVFRVBDX0lORk8JS0VSTl9JTkZPCUVFRVBDX0xPRwotCi0vKgotICogRGVmaW5pdGlvbnMgZm9yIEFzdXMgRWVlUEMKLSAqLwotI2RlZmluZQlOT1RJRllfV0xBTl9PTgkweDEwCi0jZGVmaW5lIE5PVElGWV9CUk5fTUlOCTB4MjAKLSNkZWZpbmUgTk9USUZZX0JSTl9NQVgJMHgyZgotCi1lbnVtIHsKLQlESVNBQkxFX0FTTF9XTEFOID0gMHgwMDAxLAotCURJU0FCTEVfQVNMX0JMVUVUT09USCA9IDB4MDAwMiwKLQlESVNBQkxFX0FTTF9JUkRBID0gMHgwMDA0LAotCURJU0FCTEVfQVNMX0NBTUVSQSA9IDB4MDAwOCwKLQlESVNBQkxFX0FTTF9UViA9IDB4MDAxMCwKLQlESVNBQkxFX0FTTF9HUFMgPSAweDAwMjAsCi0JRElTQUJMRV9BU0xfRElTUExBWVNXSVRDSCA9IDB4MDA0MCwKLQlESVNBQkxFX0FTTF9NT0RFTSA9IDB4MDA4MCwKLQlESVNBQkxFX0FTTF9DQVJEUkVBREVSID0gMHgwMTAwCi19OwotCi1lbnVtIHsKLQlDTV9BU0xfV0xBTiA9IDAsCi0JQ01fQVNMX0JMVUVUT09USCwKLQlDTV9BU0xfSVJEQSwKLQlDTV9BU0xfMTM5NCwKLQlDTV9BU0xfQ0FNRVJBLAotCUNNX0FTTF9UViwKLQlDTV9BU0xfR1BTLAotCUNNX0FTTF9EVkRST00sCi0JQ01fQVNMX0RJU1BMQVlTV0lUQ0gsCi0JQ01fQVNMX1BBTkVMQlJJR0hULAotCUNNX0FTTF9CSU9TRkxBU0gsCi0JQ01fQVNMX0FDUElGTEFTSCwKLQlDTV9BU0xfQ1BVRlYsCi0JQ01fQVNMX0NQVVRFTVBFUkFUVVJFLAotCUNNX0FTTF9GQU5DUFUsCi0JQ01fQVNMX0ZBTkNIQVNTSVMsCi0JQ01fQVNMX1VTQlBPUlQxLAotCUNNX0FTTF9VU0JQT1JUMiwKLQlDTV9BU0xfVVNCUE9SVDMsCi0JQ01fQVNMX01PREVNLAotCUNNX0FTTF9DQVJEUkVBREVSLAotCUNNX0FTTF9MSUQKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpjbV9nZXR2W10gPSB7Ci0JIldMREciLCBOVUxMLCBOVUxMLCBOVUxMLAotCSJDQU1HIiwgTlVMTCwgTlVMTCwgTlVMTCwKLQlOVUxMLCAiUEJMRyIsIE5VTEwsIE5VTEwsCi0JIkNGVkciLCBOVUxMLCBOVUxMLCBOVUxMLAotCSJVU0JHIiwgTlVMTCwgTlVMTCwgIk1PREciLAotCSJDUkRHIiwgIkxJREciCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqY21fc2V0dltdID0gewotCSJXTERTIiwgTlVMTCwgTlVMTCwgTlVMTCwKLQkiQ0FNUyIsIE5VTEwsIE5VTEwsIE5VTEwsCi0JIlNEU1AiLCAiUEJMUyIsICJIRFBTIiwgTlVMTCwKLQkiQ0ZWUyIsIE5VTEwsIE5VTEwsIE5VTEwsCi0JIlVTQkciLCBOVUxMLCBOVUxMLCAiTU9EUyIsCi0JIkNSRFMiLCBOVUxMCi19OwotCi0jZGVmaW5lIEVFRVBDX0VDCSJcXF9TQi5QQ0kwLlNCUkcuRUMwLiIKLQotI2RlZmluZSBFRUVQQ19FQ19GQU5fUFdNCUVFRVBDX0VDICJTQzAyIiAvKiBGYW4gUFdNIGR1dHkgY3ljbGUgKCUpICovCi0jZGVmaW5lIEVFRVBDX0VDX1NDMDIJCTB4NjMKLSNkZWZpbmUgRUVFUENfRUNfRkFOX0hSUE0JRUVFUENfRUMgIlNDMDUiIC8qIEhpZ2ggYnl0ZSwgZmFuIHNwZWVkIChSUE0pICovCi0jZGVmaW5lIEVFRVBDX0VDX0ZBTl9MUlBNCUVFRVBDX0VDICJTQzA2IiAvKiBMb3cgYnl0ZSwgZmFuIHNwZWVkIChSUE0pICovCi0jZGVmaW5lIEVFRVBDX0VDX0ZBTl9DVFJMCUVFRVBDX0VDICJTRkIzIiAvKiBCeXRlIGNvbnRhaW5pbmcgU0YyNSAgKi8KLSNkZWZpbmUgRUVFUENfRUNfU0ZCMwkJMHhEMwotCi0vKgotICogVGhpcyBpcyB0aGUgbWFpbiBzdHJ1Y3R1cmUsIHdlIGNhbiB1c2UgaXQgdG8gc3RvcmUgdXNlZnVsIGluZm9ybWF0aW9uCi0gKiBhYm91dCB0aGUgaG90ayBkZXZpY2UKLSAqLwotc3RydWN0IGVlZXBjX2hvdGsgewotCXN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlOwkvKiB0aGUgZGV2aWNlIHdlIGFyZSBpbiAqLwotCWFjcGlfaGFuZGxlIGhhbmRsZTsJCS8qIHRoZSBoYW5kbGUgb2YgdGhlIGhvdGsgZGV2aWNlICovCi0JdTMyIGNtX3N1cHBvcnRlZDsJCS8qIHRoZSBjb250cm9sIG1ldGhvZHMgc3VwcG9ydGVkCi0JCQkJCSAgIGJ5IHRoaXMgQklPUyAqLwotCXVpbnQgaW5pdF9mbGFnOwkJCS8qIEluaXQgZmxhZ3MgKi8KLQl1MTYgZXZlbnRfY291bnRbMTI4XTsJCS8qIGNvdW50IGZvciBlYWNoIGV2ZW50ICovCi0Jc3RydWN0IGlucHV0X2RldiAqaW5wdXRkZXY7Ci0JdTE2ICprZXljb2RlX21hcDsKLQlzdHJ1Y3QgcmZraWxsICplZWVwY193bGFuX3Jma2lsbDsKLQlzdHJ1Y3QgcmZraWxsICplZWVwY19ibHVldG9vdGhfcmZraWxsOwotfTsKLQotLyogVGhlIGFjdHVhbCBkZXZpY2UgdGhlIGRyaXZlciBiaW5kcyB0byAqLwotc3RhdGljIHN0cnVjdCBlZWVwY19ob3RrICplaG90azsKLQotLyogUGxhdGZvcm0gZGV2aWNlL2RyaXZlciAqLwotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgcGxhdGZvcm1fZHJpdmVyID0gewotCS5kcml2ZXIgPSB7Ci0JCS5uYW1lID0gRUVFUENfSE9US19GSUxFLAotCQkub3duZXIgPSBUSElTX01PRFVMRSwKLQl9Ci19OwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGxhdGZvcm1fZGV2aWNlOwotCi1zdHJ1Y3Qga2V5X2VudHJ5IHsKLQljaGFyIHR5cGU7Ci0JdTggY29kZTsKLQl1MTYga2V5Y29kZTsKLX07Ci0KLWVudW0geyBLRV9LRVksIEtFX0VORCB9OwotCi1zdGF0aWMgc3RydWN0IGtleV9lbnRyeSBlZWVwY19rZXltYXBbXSA9IHsKLQkvKiBTbGVlcCBhbHJlYWR5IGhhbmRsZWQgdmlhIGdlbmVyaWMgQUNQSSBjb2RlICovCi0Je0tFX0tFWSwgMHgxMCwgS0VZX1dMQU4gfSwKLQl7S0VfS0VZLCAweDEyLCBLRVlfUFJPRzEgfSwKLQl7S0VfS0VZLCAweDEzLCBLRVlfTVVURSB9LAotCXtLRV9LRVksIDB4MTQsIEtFWV9WT0xVTUVET1dOIH0sCi0Je0tFX0tFWSwgMHgxNSwgS0VZX1ZPTFVNRVVQIH0sCi0Je0tFX0tFWSwgMHgzMCwgS0VZX1NXSVRDSFZJREVPTU9ERSB9LAotCXtLRV9LRVksIDB4MzEsIEtFWV9TV0lUQ0hWSURFT01PREUgfSwKLQl7S0VfS0VZLCAweDMyLCBLRVlfU1dJVENIVklERU9NT0RFIH0sCi0Je0tFX0VORCwgMH0sCi19OwotCi0vKgotICogVGhlIGhvdGtleSBkcml2ZXIgZGVjbGFyYXRpb24KLSAqLwotc3RhdGljIGludCBlZWVwY19ob3RrX2FkZChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSk7Ci1zdGF0aWMgaW50IGVlZXBjX2hvdGtfcmVtb3ZlKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlLCBpbnQgdHlwZSk7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYWNwaV9kZXZpY2VfaWQgZWVlcGNfZGV2aWNlX2lkc1tdID0gewotCXtFRUVQQ19IT1RLX0hJRCwgMH0sCi0JeyIiLCAwfSwKLX07Ci1NT0RVTEVfREVWSUNFX1RBQkxFKGFjcGksIGVlZXBjX2RldmljZV9pZHMpOwotCi1zdGF0aWMgc3RydWN0IGFjcGlfZHJpdmVyIGVlZXBjX2hvdGtfZHJpdmVyID0gewotCS5uYW1lID0gRUVFUENfSE9US19OQU1FLAotCS5jbGFzcyA9IEVFRVBDX0hPVEtfQ0xBU1MsCi0JLmlkcyA9IGVlZXBjX2RldmljZV9pZHMsCi0JLm9wcyA9IHsKLQkJLmFkZCA9IGVlZXBjX2hvdGtfYWRkLAotCQkucmVtb3ZlID0gZWVlcGNfaG90a19yZW1vdmUsCi0JfSwKLX07Ci0KLS8qIFRoZSBiYWNrbGlnaHQgZGV2aWNlIC9zeXMvY2xhc3MvYmFja2xpZ2h0ICovCi1zdGF0aWMgc3RydWN0IGJhY2tsaWdodF9kZXZpY2UgKmVlZXBjX2JhY2tsaWdodF9kZXZpY2U7Ci0KLS8qIFRoZSBod21vbiBkZXZpY2UgKi8KLXN0YXRpYyBzdHJ1Y3QgZGV2aWNlICplZWVwY19od21vbl9kZXZpY2U7Ci0KLS8qCi0gKiBUaGUgYmFja2xpZ2h0IGNsYXNzIGRlY2xhcmF0aW9uCi0gKi8KLXN0YXRpYyBpbnQgcmVhZF9icmlnaHRuZXNzKHN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICpiZCk7Ci1zdGF0aWMgaW50IHVwZGF0ZV9ibF9zdGF0dXMoc3RydWN0IGJhY2tsaWdodF9kZXZpY2UgKmJkKTsKLXN0YXRpYyBzdHJ1Y3QgYmFja2xpZ2h0X29wcyBlZWVwY2JsX29wcyA9IHsKLQkuZ2V0X2JyaWdodG5lc3MgPSByZWFkX2JyaWdodG5lc3MsCi0JLnVwZGF0ZV9zdGF0dXMgPSB1cGRhdGVfYmxfc3RhdHVzLAotfTsKLQotTU9EVUxFX0FVVEhPUigiQ29yZW50aW4gQ2hhcnksIEVyaWMgQ29vcGVyIik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oRUVFUENfSE9US19OQU1FKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLQotLyoKLSAqIEFDUEkgSGVscGVycwotICovCi1zdGF0aWMgaW50IHdyaXRlX2FjcGlfaW50KGFjcGlfaGFuZGxlIGhhbmRsZSwgY29uc3QgY2hhciAqbWV0aG9kLCBpbnQgdmFsLAotCQkJICBzdHJ1Y3QgYWNwaV9idWZmZXIgKm91dHB1dCkKLXsKLQlzdHJ1Y3QgYWNwaV9vYmplY3RfbGlzdCBwYXJhbXM7Ci0JdW5pb24gYWNwaV9vYmplY3QgaW5fb2JqOwotCWFjcGlfc3RhdHVzIHN0YXR1czsKLQotCXBhcmFtcy5jb3VudCA9IDE7Ci0JcGFyYW1zLnBvaW50ZXIgPSAmaW5fb2JqOwotCWluX29iai50eXBlID0gQUNQSV9UWVBFX0lOVEVHRVI7Ci0JaW5fb2JqLmludGVnZXIudmFsdWUgPSB2YWw7Ci0KLQlzdGF0dXMgPSBhY3BpX2V2YWx1YXRlX29iamVjdChoYW5kbGUsIChjaGFyICopbWV0aG9kLCAmcGFyYW1zLCBvdXRwdXQpOwotCXJldHVybiAoc3RhdHVzID09IEFFX09LID8gMCA6IC0xKTsKLX0KLQotc3RhdGljIGludCByZWFkX2FjcGlfaW50KGFjcGlfaGFuZGxlIGhhbmRsZSwgY29uc3QgY2hhciAqbWV0aG9kLCBpbnQgKnZhbCkKLXsKLQlhY3BpX3N0YXR1cyBzdGF0dXM7Ci0JdW5zaWduZWQgbG9uZyBsb25nIHJlc3VsdDsKLQotCXN0YXR1cyA9IGFjcGlfZXZhbHVhdGVfaW50ZWdlcihoYW5kbGUsIChjaGFyICopbWV0aG9kLCBOVUxMLCAmcmVzdWx0KTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJKnZhbCA9IC0xOwotCQlyZXR1cm4gLTE7Ci0JfSBlbHNlIHsKLQkJKnZhbCA9IHJlc3VsdDsKLQkJcmV0dXJuIDA7Ci0JfQotfQotCi1zdGF0aWMgaW50IHNldF9hY3BpKGludCBjbSwgaW50IHZhbHVlKQotewotCWlmIChlaG90ay0+Y21fc3VwcG9ydGVkICYgKDB4MSA8PCBjbSkpIHsKLQkJY29uc3QgY2hhciAqbWV0aG9kID0gY21fc2V0dltjbV07Ci0JCWlmIChtZXRob2QgPT0gTlVMTCkKLQkJCXJldHVybiAtRU5PREVWOwotCQlpZiAod3JpdGVfYWNwaV9pbnQoZWhvdGstPmhhbmRsZSwgbWV0aG9kLCB2YWx1ZSwgTlVMTCkpCi0JCQlwcmludGsoRUVFUENfV0FSTklORyAiRXJyb3Igd3JpdGluZyAlc1xuIiwgbWV0aG9kKTsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgZ2V0X2FjcGkoaW50IGNtKQotewotCWludCB2YWx1ZSA9IC0xOwotCWlmICgoZWhvdGstPmNtX3N1cHBvcnRlZCAmICgweDEgPDwgY20pKSkgewotCQljb25zdCBjaGFyICptZXRob2QgPSBjbV9nZXR2W2NtXTsKLQkJaWYgKG1ldGhvZCA9PSBOVUxMKQotCQkJcmV0dXJuIC1FTk9ERVY7Ci0JCWlmIChyZWFkX2FjcGlfaW50KGVob3RrLT5oYW5kbGUsIG1ldGhvZCwgJnZhbHVlKSkKLQkJCXByaW50ayhFRUVQQ19XQVJOSU5HICJFcnJvciByZWFkaW5nICVzXG4iLCBtZXRob2QpOwotCX0KLQlyZXR1cm4gdmFsdWU7Ci19Ci0KLS8qCi0gKiBCYWNrbGlnaHQKLSAqLwotc3RhdGljIGludCByZWFkX2JyaWdodG5lc3Moc3RydWN0IGJhY2tsaWdodF9kZXZpY2UgKmJkKQotewotCXJldHVybiBnZXRfYWNwaShDTV9BU0xfUEFORUxCUklHSFQpOwotfQotCi1zdGF0aWMgaW50IHNldF9icmlnaHRuZXNzKHN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICpiZCwgaW50IHZhbHVlKQotewotCXZhbHVlID0gbWF4KDAsIG1pbigxNSwgdmFsdWUpKTsKLQlyZXR1cm4gc2V0X2FjcGkoQ01fQVNMX1BBTkVMQlJJR0hULCB2YWx1ZSk7Ci19Ci0KLXN0YXRpYyBpbnQgdXBkYXRlX2JsX3N0YXR1cyhzdHJ1Y3QgYmFja2xpZ2h0X2RldmljZSAqYmQpCi17Ci0JcmV0dXJuIHNldF9icmlnaHRuZXNzKGJkLCBiZC0+cHJvcHMuYnJpZ2h0bmVzcyk7Ci19Ci0KLS8qCi0gKiBSZmtpbGwgaGVscGVycwotICovCi0KLXN0YXRpYyBpbnQgZWVlcGNfd2xhbl9yZmtpbGxfc2V0KHZvaWQgKmRhdGEsIGVudW0gcmZraWxsX3N0YXRlIHN0YXRlKQotewotCWlmIChzdGF0ZSA9PSBSRktJTExfU1RBVEVfU09GVF9CTE9DS0VEKQotCQlyZXR1cm4gc2V0X2FjcGkoQ01fQVNMX1dMQU4sIDApOwotCWVsc2UKLQkJcmV0dXJuIHNldF9hY3BpKENNX0FTTF9XTEFOLCAxKTsKLX0KLQotc3RhdGljIGludCBlZWVwY193bGFuX3Jma2lsbF9zdGF0ZSh2b2lkICpkYXRhLCBlbnVtIHJma2lsbF9zdGF0ZSAqc3RhdGUpCi17Ci0JaWYgKGdldF9hY3BpKENNX0FTTF9XTEFOKSA9PSAxKQotCQkqc3RhdGUgPSBSRktJTExfU1RBVEVfVU5CTE9DS0VEOwotCWVsc2UKLQkJKnN0YXRlID0gUkZLSUxMX1NUQVRFX1NPRlRfQkxPQ0tFRDsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBlZWVwY19ibHVldG9vdGhfcmZraWxsX3NldCh2b2lkICpkYXRhLCBlbnVtIHJma2lsbF9zdGF0ZSBzdGF0ZSkKLXsKLQlpZiAoc3RhdGUgPT0gUkZLSUxMX1NUQVRFX1NPRlRfQkxPQ0tFRCkKLQkJcmV0dXJuIHNldF9hY3BpKENNX0FTTF9CTFVFVE9PVEgsIDApOwotCWVsc2UKLQkJcmV0dXJuIHNldF9hY3BpKENNX0FTTF9CTFVFVE9PVEgsIDEpOwotfQotCi1zdGF0aWMgaW50IGVlZXBjX2JsdWV0b290aF9yZmtpbGxfc3RhdGUodm9pZCAqZGF0YSwgZW51bSByZmtpbGxfc3RhdGUgKnN0YXRlKQotewotCWlmIChnZXRfYWNwaShDTV9BU0xfQkxVRVRPT1RIKSA9PSAxKQotCQkqc3RhdGUgPSBSRktJTExfU1RBVEVfVU5CTE9DS0VEOwotCWVsc2UKLQkJKnN0YXRlID0gUkZLSUxMX1NUQVRFX1NPRlRfQkxPQ0tFRDsKLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIFN5cyBoZWxwZXJzCi0gKi8KLXN0YXRpYyBpbnQgcGFyc2VfYXJnKGNvbnN0IGNoYXIgKmJ1ZiwgdW5zaWduZWQgbG9uZyBjb3VudCwgaW50ICp2YWwpCi17Ci0JaWYgKCFjb3VudCkKLQkJcmV0dXJuIDA7Ci0JaWYgKHNzY2FuZihidWYsICIlaSIsIHZhbCkgIT0gMSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JcmV0dXJuIGNvdW50OwotfQotCi1zdGF0aWMgc3NpemVfdCBzdG9yZV9zeXNfYWNwaShpbnQgY20sIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQotewotCWludCBydiwgdmFsdWU7Ci0KLQlydiA9IHBhcnNlX2FyZyhidWYsIGNvdW50LCAmdmFsdWUpOwotCWlmIChydiA+IDApCi0JCXNldF9hY3BpKGNtLCB2YWx1ZSk7Ci0JcmV0dXJuIHJ2OwotfQotCi1zdGF0aWMgc3NpemVfdCBzaG93X3N5c19hY3BpKGludCBjbSwgY2hhciAqYnVmKQotewotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBnZXRfYWNwaShjbSkpOwotfQotCi0jZGVmaW5lIEVFRVBDX0NSRUFURV9ERVZJQ0VfQVRUUihfbmFtZSwgX2NtKQkJCQlcCi0Jc3RhdGljIHNzaXplX3Qgc2hvd18jI19uYW1lKHN0cnVjdCBkZXZpY2UgKmRldiwJCQlcCi0JCQkJICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAlcCi0JCQkJICAgIGNoYXIgKmJ1ZikJCQkJXAotCXsJCQkJCQkJCVwKLQkJcmV0dXJuIHNob3dfc3lzX2FjcGkoX2NtLCBidWYpOwkJCQlcCi0JfQkJCQkJCQkJXAotCXN0YXRpYyBzc2l6ZV90IHN0b3JlXyMjX25hbWUoc3RydWN0IGRldmljZSAqZGV2LAkJXAotCQkJCSAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCVwKLQkJCQkgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQlcCi0JewkJCQkJCQkJXAotCQlyZXR1cm4gc3RvcmVfc3lzX2FjcGkoX2NtLCBidWYsIGNvdW50KTsJCQlcCi0JfQkJCQkJCQkJXAotCXN0YXRpYyBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSBkZXZfYXR0cl8jI19uYW1lID0gewkJXAotCQkuYXR0ciA9IHsJCQkJCQlcCi0JCQkubmFtZSA9IF9fc3RyaW5naWZ5KF9uYW1lKSwJCQlcCi0JCQkubW9kZSA9IDA2NDQgfSwJCQkJCVwKLQkJLnNob3cgICA9IHNob3dfIyNfbmFtZSwJCQkJCVwKLQkJLnN0b3JlICA9IHN0b3JlXyMjX25hbWUsCQkJCVwKLQl9Ci0KLUVFRVBDX0NSRUFURV9ERVZJQ0VfQVRUUihjYW1lcmEsIENNX0FTTF9DQU1FUkEpOwotRUVFUENfQ1JFQVRFX0RFVklDRV9BVFRSKGNhcmRyLCBDTV9BU0xfQ0FSRFJFQURFUik7Ci1FRUVQQ19DUkVBVEVfREVWSUNFX0FUVFIoZGlzcCwgQ01fQVNMX0RJU1BMQVlTV0lUQ0gpOwotCi1zdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqcGxhdGZvcm1fYXR0cmlidXRlc1tdID0gewotCSZkZXZfYXR0cl9jYW1lcmEuYXR0ciwKLQkmZGV2X2F0dHJfY2FyZHIuYXR0ciwKLQkmZGV2X2F0dHJfZGlzcC5hdHRyLAotCU5VTEwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIHBsYXRmb3JtX2F0dHJpYnV0ZV9ncm91cCA9IHsKLQkuYXR0cnMgPSBwbGF0Zm9ybV9hdHRyaWJ1dGVzCi19OwotCi0vKgotICogSG90a2V5IGZ1bmN0aW9ucwotICovCi1zdGF0aWMgc3RydWN0IGtleV9lbnRyeSAqZWVwY19nZXRfZW50cnlfYnlfc2NhbmNvZGUoaW50IGNvZGUpCi17Ci0Jc3RydWN0IGtleV9lbnRyeSAqa2V5OwotCi0JZm9yIChrZXkgPSBlZWVwY19rZXltYXA7IGtleS0+dHlwZSAhPSBLRV9FTkQ7IGtleSsrKQotCQlpZiAoY29kZSA9PSBrZXktPmNvZGUpCi0JCQlyZXR1cm4ga2V5OwotCi0JcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qga2V5X2VudHJ5ICplZXBjX2dldF9lbnRyeV9ieV9rZXljb2RlKGludCBjb2RlKQotewotCXN0cnVjdCBrZXlfZW50cnkgKmtleTsKLQotCWZvciAoa2V5ID0gZWVlcGNfa2V5bWFwOyBrZXktPnR5cGUgIT0gS0VfRU5EOyBrZXkrKykKLQkJaWYgKGNvZGUgPT0ga2V5LT5rZXljb2RlICYmIGtleS0+dHlwZSA9PSBLRV9LRVkpCi0JCQlyZXR1cm4ga2V5OwotCi0JcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBpbnQgZWVlcGNfZ2V0a2V5Y29kZShzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYsIGludCBzY2FuY29kZSwgaW50ICprZXljb2RlKQotewotCXN0cnVjdCBrZXlfZW50cnkgKmtleSA9IGVlcGNfZ2V0X2VudHJ5X2J5X3NjYW5jb2RlKHNjYW5jb2RlKTsKLQotCWlmIChrZXkgJiYga2V5LT50eXBlID09IEtFX0tFWSkgewotCQkqa2V5Y29kZSA9IGtleS0+a2V5Y29kZTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JcmV0dXJuIC1FSU5WQUw7Ci19Ci0KLXN0YXRpYyBpbnQgZWVlcGNfc2V0a2V5Y29kZShzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYsIGludCBzY2FuY29kZSwgaW50IGtleWNvZGUpCi17Ci0Jc3RydWN0IGtleV9lbnRyeSAqa2V5OwotCWludCBvbGRfa2V5Y29kZTsKLQotCWlmIChrZXljb2RlIDwgMCB8fCBrZXljb2RlID4gS0VZX01BWCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlrZXkgPSBlZXBjX2dldF9lbnRyeV9ieV9zY2FuY29kZShzY2FuY29kZSk7Ci0JaWYgKGtleSAmJiBrZXktPnR5cGUgPT0gS0VfS0VZKSB7Ci0JCW9sZF9rZXljb2RlID0ga2V5LT5rZXljb2RlOwotCQlrZXktPmtleWNvZGUgPSBrZXljb2RlOwotCQlzZXRfYml0KGtleWNvZGUsIGRldi0+a2V5Yml0KTsKLQkJaWYgKCFlZXBjX2dldF9lbnRyeV9ieV9rZXljb2RlKG9sZF9rZXljb2RlKSkKLQkJCWNsZWFyX2JpdChvbGRfa2V5Y29kZSwgZGV2LT5rZXliaXQpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlyZXR1cm4gLUVJTlZBTDsKLX0KLQotc3RhdGljIGludCBlZWVwY19ob3RrX2NoZWNrKHZvaWQpCi17Ci0JY29uc3Qgc3RydWN0IGtleV9lbnRyeSAqa2V5OwotCXN0cnVjdCBhY3BpX2J1ZmZlciBidWZmZXIgPSB7IEFDUElfQUxMT0NBVEVfQlVGRkVSLCBOVUxMIH07Ci0JaW50IHJlc3VsdDsKLQotCXJlc3VsdCA9IGFjcGlfYnVzX2dldF9zdGF0dXMoZWhvdGstPmRldmljZSk7Ci0JaWYgKHJlc3VsdCkKLQkJcmV0dXJuIHJlc3VsdDsKLQlpZiAoZWhvdGstPmRldmljZS0+c3RhdHVzLnByZXNlbnQpIHsKLQkJaWYgKHdyaXRlX2FjcGlfaW50KGVob3RrLT5oYW5kbGUsICJJTklUIiwgZWhvdGstPmluaXRfZmxhZywKLQkJCQkgICAgJmJ1ZmZlcikpIHsKLQkJCXByaW50ayhFRUVQQ19FUlIgIkhvdGtleSBpbml0aWFsaXphdGlvbiBmYWlsZWRcbiIpOwotCQkJcmV0dXJuIC1FTk9ERVY7Ci0JCX0gZWxzZSB7Ci0JCQlwcmludGsoRUVFUENfTk9USUNFICJIb3RrZXkgaW5pdCBmbGFncyAweCV4XG4iLAotCQkJICAgICAgIGVob3RrLT5pbml0X2ZsYWcpOwotCQl9Ci0JCS8qIGdldCBjb250cm9sIG1ldGhvZHMgc3VwcG9ydGVkICovCi0JCWlmIChyZWFkX2FjcGlfaW50KGVob3RrLT5oYW5kbGUsICJDTVNHIgotCQkJCSAgICwgJmVob3RrLT5jbV9zdXBwb3J0ZWQpKSB7Ci0JCQlwcmludGsoRUVFUENfRVJSCi0JCQkgICAgICAgIkdldCBjb250cm9sIG1ldGhvZHMgc3VwcG9ydGVkIGZhaWxlZFxuIik7Ci0JCQlyZXR1cm4gLUVOT0RFVjsKLQkJfSBlbHNlIHsKLQkJCXByaW50ayhFRUVQQ19JTkZPCi0JCQkgICAgICAgIkdldCBjb250cm9sIG1ldGhvZHMgc3VwcG9ydGVkOiAweCV4XG4iLAotCQkJICAgICAgIGVob3RrLT5jbV9zdXBwb3J0ZWQpOwotCQl9Ci0JCWVob3RrLT5pbnB1dGRldiA9IGlucHV0X2FsbG9jYXRlX2RldmljZSgpOwotCQlpZiAoIWVob3RrLT5pbnB1dGRldikgewotCQkJcHJpbnRrKEVFRVBDX0lORk8gIlVuYWJsZSB0byBhbGxvY2F0ZSBpbnB1dCBkZXZpY2VcbiIpOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJZWhvdGstPmlucHV0ZGV2LT5uYW1lID0gIkFzdXMgRWVlUEMgZXh0cmEgYnV0dG9ucyI7Ci0JCWVob3RrLT5pbnB1dGRldi0+cGh5cyA9IEVFRVBDX0hPVEtfRklMRSAiL2lucHV0MCI7Ci0JCWVob3RrLT5pbnB1dGRldi0+aWQuYnVzdHlwZSA9IEJVU19IT1NUOwotCQllaG90ay0+aW5wdXRkZXYtPmdldGtleWNvZGUgPSBlZWVwY19nZXRrZXljb2RlOwotCQllaG90ay0+aW5wdXRkZXYtPnNldGtleWNvZGUgPSBlZWVwY19zZXRrZXljb2RlOwotCi0JCWZvciAoa2V5ID0gZWVlcGNfa2V5bWFwOyBrZXktPnR5cGUgIT0gS0VfRU5EOyBrZXkrKykgewotCQkJc3dpdGNoIChrZXktPnR5cGUpIHsKLQkJCWNhc2UgS0VfS0VZOgotCQkJCXNldF9iaXQoRVZfS0VZLCBlaG90ay0+aW5wdXRkZXYtPmV2Yml0KTsKLQkJCQlzZXRfYml0KGtleS0+a2V5Y29kZSwgZWhvdGstPmlucHV0ZGV2LT5rZXliaXQpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJlc3VsdCA9IGlucHV0X3JlZ2lzdGVyX2RldmljZShlaG90ay0+aW5wdXRkZXYpOwotCQlpZiAocmVzdWx0KSB7Ci0JCQlwcmludGsoRUVFUENfSU5GTyAiVW5hYmxlIHRvIHJlZ2lzdGVyIGlucHV0IGRldmljZVxuIik7Ci0JCQlpbnB1dF9mcmVlX2RldmljZShlaG90ay0+aW5wdXRkZXYpOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQl9IGVsc2UgewotCQlwcmludGsoRUVFUENfRVJSICJIb3RrZXkgZGV2aWNlIG5vdCBwcmVzZW50LCBhYm9ydGluZ1xuIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgbm90aWZ5X2Jybih2b2lkKQotewotCXN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICpiZCA9IGVlZXBjX2JhY2tsaWdodF9kZXZpY2U7Ci0JYmQtPnByb3BzLmJyaWdodG5lc3MgPSByZWFkX2JyaWdodG5lc3MoYmQpOwotfQotCi1zdGF0aWMgdm9pZCBlZWVwY19ob3RrX25vdGlmeShhY3BpX2hhbmRsZSBoYW5kbGUsIHUzMiBldmVudCwgdm9pZCAqZGF0YSkKLXsKLQlzdGF0aWMgc3RydWN0IGtleV9lbnRyeSAqa2V5OwotCWlmICghZWhvdGspCi0JCXJldHVybjsKLQlpZiAoZXZlbnQgPj0gTk9USUZZX0JSTl9NSU4gJiYgZXZlbnQgPD0gTk9USUZZX0JSTl9NQVgpCi0JCW5vdGlmeV9icm4oKTsKLQlhY3BpX2J1c19nZW5lcmF0ZV9wcm9jX2V2ZW50KGVob3RrLT5kZXZpY2UsIGV2ZW50LAotCQkJCSAgICAgZWhvdGstPmV2ZW50X2NvdW50W2V2ZW50ICUgMTI4XSsrKTsKLQlpZiAoZWhvdGstPmlucHV0ZGV2KSB7Ci0JCWtleSA9IGVlcGNfZ2V0X2VudHJ5X2J5X3NjYW5jb2RlKGV2ZW50KTsKLQkJaWYgKGtleSkgewotCQkJc3dpdGNoIChrZXktPnR5cGUpIHsKLQkJCWNhc2UgS0VfS0VZOgotCQkJCWlucHV0X3JlcG9ydF9rZXkoZWhvdGstPmlucHV0ZGV2LCBrZXktPmtleWNvZGUsCi0JCQkJCQkgMSk7Ci0JCQkJaW5wdXRfc3luYyhlaG90ay0+aW5wdXRkZXYpOwotCQkJCWlucHV0X3JlcG9ydF9rZXkoZWhvdGstPmlucHV0ZGV2LCBrZXktPmtleWNvZGUsCi0JCQkJCQkgMCk7Ci0JCQkJaW5wdXRfc3luYyhlaG90ay0+aW5wdXRkZXYpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQotfQotCi1zdGF0aWMgaW50IGVlZXBjX2hvdGtfYWRkKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKQotewotCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOwotCWludCByZXN1bHQ7Ci0KLQlpZiAoIWRldmljZSkKLQkJIHJldHVybiAtRUlOVkFMOwotCXByaW50ayhFRUVQQ19OT1RJQ0UgRUVFUENfSE9US19OQU1FICJcbiIpOwotCWVob3RrID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGVlZXBjX2hvdGspLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWVob3RrKQotCQlyZXR1cm4gLUVOT01FTTsKLQllaG90ay0+aW5pdF9mbGFnID0gRElTQUJMRV9BU0xfV0xBTiB8IERJU0FCTEVfQVNMX0RJU1BMQVlTV0lUQ0g7Ci0JZWhvdGstPmhhbmRsZSA9IGRldmljZS0+aGFuZGxlOwotCXN0cmNweShhY3BpX2RldmljZV9uYW1lKGRldmljZSksIEVFRVBDX0hPVEtfREVWSUNFX05BTUUpOwotCXN0cmNweShhY3BpX2RldmljZV9jbGFzcyhkZXZpY2UpLCBFRUVQQ19IT1RLX0NMQVNTKTsKLQlkZXZpY2UtPmRyaXZlcl9kYXRhID0gZWhvdGs7Ci0JZWhvdGstPmRldmljZSA9IGRldmljZTsKLQlyZXN1bHQgPSBlZWVwY19ob3RrX2NoZWNrKCk7Ci0JaWYgKHJlc3VsdCkKLQkJZ290byBlbmQ7Ci0Jc3RhdHVzID0gYWNwaV9pbnN0YWxsX25vdGlmeV9oYW5kbGVyKGVob3RrLT5oYW5kbGUsIEFDUElfU1lTVEVNX05PVElGWSwKLQkJCQkJICAgICBlZWVwY19ob3RrX25vdGlmeSwgZWhvdGspOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkKLQkJcHJpbnRrKEVFRVBDX0VSUiAiRXJyb3IgaW5zdGFsbGluZyBub3RpZnkgaGFuZGxlclxuIik7Ci0KLQlpZiAoZ2V0X2FjcGkoQ01fQVNMX1dMQU4pICE9IC0xKSB7Ci0JCWVob3RrLT5lZWVwY193bGFuX3Jma2lsbCA9IHJma2lsbF9hbGxvY2F0ZSgmZGV2aWNlLT5kZXYsCi0JCQkJCQkJICAgUkZLSUxMX1RZUEVfV0xBTik7Ci0KLQkJaWYgKCFlaG90ay0+ZWVlcGNfd2xhbl9yZmtpbGwpCi0JCQlnb3RvIGVuZDsKLQotCQllaG90ay0+ZWVlcGNfd2xhbl9yZmtpbGwtPm5hbWUgPSAiZWVlcGMtd2xhbiI7Ci0JCWVob3RrLT5lZWVwY193bGFuX3Jma2lsbC0+dG9nZ2xlX3JhZGlvID0gZWVlcGNfd2xhbl9yZmtpbGxfc2V0OwotCQllaG90ay0+ZWVlcGNfd2xhbl9yZmtpbGwtPmdldF9zdGF0ZSA9IGVlZXBjX3dsYW5fcmZraWxsX3N0YXRlOwotCQlpZiAoZ2V0X2FjcGkoQ01fQVNMX1dMQU4pID09IDEpCi0JCQllaG90ay0+ZWVlcGNfd2xhbl9yZmtpbGwtPnN0YXRlID0KLQkJCQlSRktJTExfU1RBVEVfVU5CTE9DS0VEOwotCQllbHNlCi0JCQllaG90ay0+ZWVlcGNfd2xhbl9yZmtpbGwtPnN0YXRlID0KLQkJCQlSRktJTExfU1RBVEVfU09GVF9CTE9DS0VEOwotCQlyZmtpbGxfcmVnaXN0ZXIoZWhvdGstPmVlZXBjX3dsYW5fcmZraWxsKTsKLQl9Ci0KLQlpZiAoZ2V0X2FjcGkoQ01fQVNMX0JMVUVUT09USCkgIT0gLTEpIHsKLQkJZWhvdGstPmVlZXBjX2JsdWV0b290aF9yZmtpbGwgPQotCQkJcmZraWxsX2FsbG9jYXRlKCZkZXZpY2UtPmRldiwgUkZLSUxMX1RZUEVfQkxVRVRPT1RIKTsKLQotCQlpZiAoIWVob3RrLT5lZWVwY19ibHVldG9vdGhfcmZraWxsKQotCQkJZ290byBlbmQ7Ci0KLQkJZWhvdGstPmVlZXBjX2JsdWV0b290aF9yZmtpbGwtPm5hbWUgPSAiZWVlcGMtYmx1ZXRvb3RoIjsKLQkJZWhvdGstPmVlZXBjX2JsdWV0b290aF9yZmtpbGwtPnRvZ2dsZV9yYWRpbyA9Ci0JCQllZWVwY19ibHVldG9vdGhfcmZraWxsX3NldDsKLQkJZWhvdGstPmVlZXBjX2JsdWV0b290aF9yZmtpbGwtPmdldF9zdGF0ZSA9Ci0JCQllZWVwY19ibHVldG9vdGhfcmZraWxsX3N0YXRlOwotCQlpZiAoZ2V0X2FjcGkoQ01fQVNMX0JMVUVUT09USCkgPT0gMSkKLQkJCWVob3RrLT5lZWVwY19ibHVldG9vdGhfcmZraWxsLT5zdGF0ZSA9Ci0JCQkJUkZLSUxMX1NUQVRFX1VOQkxPQ0tFRDsKLQkJZWxzZQotCQkJZWhvdGstPmVlZXBjX2JsdWV0b290aF9yZmtpbGwtPnN0YXRlID0KLQkJCQlSRktJTExfU1RBVEVfU09GVF9CTE9DS0VEOwotCQlyZmtpbGxfcmVnaXN0ZXIoZWhvdGstPmVlZXBjX2JsdWV0b290aF9yZmtpbGwpOwotCX0KLQotIGVuZDoKLQlpZiAocmVzdWx0KSB7Ci0JCWtmcmVlKGVob3RrKTsKLQkJZWhvdGsgPSBOVUxMOwotCX0KLQlyZXR1cm4gcmVzdWx0OwotfQotCi1zdGF0aWMgaW50IGVlZXBjX2hvdGtfcmVtb3ZlKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlLCBpbnQgdHlwZSkKLXsKLQlhY3BpX3N0YXR1cyBzdGF0dXMgPSAwOwotCi0JaWYgKCFkZXZpY2UgfHwgIWFjcGlfZHJpdmVyX2RhdGEoZGV2aWNlKSkKLQkJIHJldHVybiAtRUlOVkFMOwotCXN0YXR1cyA9IGFjcGlfcmVtb3ZlX25vdGlmeV9oYW5kbGVyKGVob3RrLT5oYW5kbGUsIEFDUElfU1lTVEVNX05PVElGWSwKLQkJCQkJICAgIGVlZXBjX2hvdGtfbm90aWZ5KTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpCi0JCXByaW50ayhFRUVQQ19FUlIgIkVycm9yIHJlbW92aW5nIG5vdGlmeSBoYW5kbGVyXG4iKTsKLQlrZnJlZShlaG90ayk7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBId21vbgotICovCi1zdGF0aWMgaW50IGVlZXBjX2dldF9mYW5fcHdtKHZvaWQpCi17Ci0JaW50IHZhbHVlID0gMDsKLQotCXJlYWRfYWNwaV9pbnQoTlVMTCwgRUVFUENfRUNfRkFOX1BXTSwgJnZhbHVlKTsKLQl2YWx1ZSA9IHZhbHVlICogMjU1IC8gMTAwOwotCXJldHVybiAodmFsdWUpOwotfQotCi1zdGF0aWMgdm9pZCBlZWVwY19zZXRfZmFuX3B3bShpbnQgdmFsdWUpCi17Ci0JdmFsdWUgPSBTRU5TT1JTX0xJTUlUKHZhbHVlLCAwLCAyNTUpOwotCXZhbHVlID0gdmFsdWUgKiAxMDAgLyAyNTU7Ci0JZWNfd3JpdGUoRUVFUENfRUNfU0MwMiwgdmFsdWUpOwotfQotCi1zdGF0aWMgaW50IGVlZXBjX2dldF9mYW5fcnBtKHZvaWQpCi17Ci0JaW50IGhpZ2ggPSAwOwotCWludCBsb3cgPSAwOwotCi0JcmVhZF9hY3BpX2ludChOVUxMLCBFRUVQQ19FQ19GQU5fSFJQTSwgJmhpZ2gpOwotCXJlYWRfYWNwaV9pbnQoTlVMTCwgRUVFUENfRUNfRkFOX0xSUE0sICZsb3cpOwotCXJldHVybiAoaGlnaCA8PCA4IHwgbG93KTsKLX0KLQotc3RhdGljIGludCBlZWVwY19nZXRfZmFuX2N0cmwodm9pZCkKLXsKLQlpbnQgdmFsdWUgPSAwOwotCi0JcmVhZF9hY3BpX2ludChOVUxMLCBFRUVQQ19FQ19GQU5fQ1RSTCwgJnZhbHVlKTsKLQlyZXR1cm4gKCh2YWx1ZSAmIDB4MDIgPyAxIDogMCkpOwotfQotCi1zdGF0aWMgdm9pZCBlZWVwY19zZXRfZmFuX2N0cmwoaW50IG1hbnVhbCkKLXsKLQlpbnQgdmFsdWUgPSAwOwotCi0JcmVhZF9hY3BpX2ludChOVUxMLCBFRUVQQ19FQ19GQU5fQ1RSTCwgJnZhbHVlKTsKLQlpZiAobWFudWFsKQotCQl2YWx1ZSB8PSAweDAyOwotCWVsc2UKLQkJdmFsdWUgJj0gfjB4MDI7Ci0JZWNfd3JpdGUoRUVFUENfRUNfU0ZCMywgdmFsdWUpOwotfQotCi1zdGF0aWMgc3NpemVfdCBzdG9yZV9zeXNfaHdtb24odm9pZCAoKnNldCkoaW50KSwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCi17Ci0JaW50IHJ2LCB2YWx1ZTsKLQotCXJ2ID0gcGFyc2VfYXJnKGJ1ZiwgY291bnQsICZ2YWx1ZSk7Ci0JaWYgKHJ2ID4gMCkKLQkJc2V0KHZhbHVlKTsKLQlyZXR1cm4gcnY7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IHNob3dfc3lzX2h3bW9uKGludCAoKmdldCkodm9pZCksIGNoYXIgKmJ1ZikKLXsKLQlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgZ2V0KCkpOwotfQotCi0jZGVmaW5lIEVFRVBDX0NSRUFURV9TRU5TT1JfQVRUUihfbmFtZSwgX21vZGUsIF9zZXQsIF9nZXQpCQlcCi0Jc3RhdGljIHNzaXplX3Qgc2hvd18jI19uYW1lKHN0cnVjdCBkZXZpY2UgKmRldiwJCQlcCi0JCQkJICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAlcCi0JCQkJICAgIGNoYXIgKmJ1ZikJCQkJXAotCXsJCQkJCQkJCVwKLQkJcmV0dXJuIHNob3dfc3lzX2h3bW9uKF9zZXQsIGJ1Zik7CQkJXAotCX0JCQkJCQkJCVwKLQlzdGF0aWMgc3NpemVfdCBzdG9yZV8jI19uYW1lKHN0cnVjdCBkZXZpY2UgKmRldiwJCVwKLQkJCQkgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAlcCi0JCQkJICAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkJXAotCXsJCQkJCQkJCVwKLQkJcmV0dXJuIHN0b3JlX3N5c19od21vbihfZ2V0LCBidWYsIGNvdW50KTsJCVwKLQl9CQkJCQkJCQlcCi0Jc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihfbmFtZSwgX21vZGUsIHNob3dfIyNfbmFtZSwgc3RvcmVfIyNfbmFtZSwgMCk7Ci0KLUVFRVBDX0NSRUFURV9TRU5TT1JfQVRUUihmYW4xX2lucHV0LCBTX0lSVUdPLCBlZWVwY19nZXRfZmFuX3JwbSwgTlVMTCk7Ci1FRUVQQ19DUkVBVEVfU0VOU09SX0FUVFIocHdtMSwgU19JUlVHTyB8IFNfSVdVU1IsCi0JCQkgZWVlcGNfZ2V0X2Zhbl9wd20sIGVlZXBjX3NldF9mYW5fcHdtKTsKLUVFRVBDX0NSRUFURV9TRU5TT1JfQVRUUihwd20xX2VuYWJsZSwgU19JUlVHTyB8IFNfSVdVU1IsCi0JCQkgZWVlcGNfZ2V0X2Zhbl9jdHJsLCBlZWVwY19zZXRfZmFuX2N0cmwpOwotCi1zdGF0aWMgc3NpemVfdAotc2hvd19uYW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKLXsKLQlyZXR1cm4gc3ByaW50ZihidWYsICJlZWVwY1xuIik7Ci19Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKG5hbWUsIFNfSVJVR08sIHNob3dfbmFtZSwgTlVMTCwgMCk7Ci0KLXN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpod21vbl9hdHRyaWJ1dGVzW10gPSB7Ci0JJnNlbnNvcl9kZXZfYXR0cl9wd20xLmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl9mYW4xX2lucHV0LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl9wd20xX2VuYWJsZS5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfbmFtZS5kZXZfYXR0ci5hdHRyLAotCU5VTEwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGh3bW9uX2F0dHJpYnV0ZV9ncm91cCA9IHsKLQkuYXR0cnMgPSBod21vbl9hdHRyaWJ1dGVzCi19OwotCi0vKgotICogZXhpdC9pbml0Ci0gKi8KLXN0YXRpYyB2b2lkIGVlZXBjX2JhY2tsaWdodF9leGl0KHZvaWQpCi17Ci0JaWYgKGVlZXBjX2JhY2tsaWdodF9kZXZpY2UpCi0JCWJhY2tsaWdodF9kZXZpY2VfdW5yZWdpc3RlcihlZWVwY19iYWNrbGlnaHRfZGV2aWNlKTsKLQlpZiAoZWhvdGstPmlucHV0ZGV2KQotCQlpbnB1dF91bnJlZ2lzdGVyX2RldmljZShlaG90ay0+aW5wdXRkZXYpOwotCWlmIChlaG90ay0+ZWVlcGNfd2xhbl9yZmtpbGwpCi0JCXJma2lsbF91bnJlZ2lzdGVyKGVob3RrLT5lZWVwY193bGFuX3Jma2lsbCk7Ci0JaWYgKGVob3RrLT5lZWVwY19ibHVldG9vdGhfcmZraWxsKQotCQlyZmtpbGxfdW5yZWdpc3RlcihlaG90ay0+ZWVlcGNfYmx1ZXRvb3RoX3Jma2lsbCk7Ci0JZWVlcGNfYmFja2xpZ2h0X2RldmljZSA9IE5VTEw7Ci19Ci0KLXN0YXRpYyB2b2lkIGVlZXBjX2h3bW9uX2V4aXQodm9pZCkKLXsKLQlzdHJ1Y3QgZGV2aWNlICpod21vbjsKLQotCWh3bW9uID0gZWVlcGNfaHdtb25fZGV2aWNlOwotCWlmICghaHdtb24pCi0JCXJldHVybiA7Ci0Jc3lzZnNfcmVtb3ZlX2dyb3VwKCZod21vbi0+a29iaiwKLQkJCSAgICZod21vbl9hdHRyaWJ1dGVfZ3JvdXApOwotCWh3bW9uX2RldmljZV91bnJlZ2lzdGVyKGh3bW9uKTsKLQllZWVwY19od21vbl9kZXZpY2UgPSBOVUxMOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgZWVlcGNfbGFwdG9wX2V4aXQodm9pZCkKLXsKLQllZWVwY19iYWNrbGlnaHRfZXhpdCgpOwotCWVlZXBjX2h3bW9uX2V4aXQoKTsKLQlhY3BpX2J1c191bnJlZ2lzdGVyX2RyaXZlcigmZWVlcGNfaG90a19kcml2ZXIpOwotCXN5c2ZzX3JlbW92ZV9ncm91cCgmcGxhdGZvcm1fZGV2aWNlLT5kZXYua29iaiwKLQkJCSAgICZwbGF0Zm9ybV9hdHRyaWJ1dGVfZ3JvdXApOwotCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKHBsYXRmb3JtX2RldmljZSk7Ci0JcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnBsYXRmb3JtX2RyaXZlcik7Ci19Ci0KLXN0YXRpYyBpbnQgZWVlcGNfYmFja2xpZ2h0X2luaXQoc3RydWN0IGRldmljZSAqZGV2KQotewotCXN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICpiZDsKLQotCWJkID0gYmFja2xpZ2h0X2RldmljZV9yZWdpc3RlcihFRUVQQ19IT1RLX0ZJTEUsIGRldiwKLQkJCQkgICAgICAgTlVMTCwgJmVlZXBjYmxfb3BzKTsKLQlpZiAoSVNfRVJSKGJkKSkgewotCQlwcmludGsoRUVFUENfRVJSCi0JCSAgICAgICAiQ291bGQgbm90IHJlZ2lzdGVyIGVlZXBjIGJhY2tsaWdodCBkZXZpY2VcbiIpOwotCQllZWVwY19iYWNrbGlnaHRfZGV2aWNlID0gTlVMTDsKLQkJcmV0dXJuIFBUUl9FUlIoYmQpOwotCX0KLQllZWVwY19iYWNrbGlnaHRfZGV2aWNlID0gYmQ7Ci0JYmQtPnByb3BzLm1heF9icmlnaHRuZXNzID0gMTU7Ci0JYmQtPnByb3BzLmJyaWdodG5lc3MgPSByZWFkX2JyaWdodG5lc3MoTlVMTCk7Ci0JYmQtPnByb3BzLnBvd2VyID0gRkJfQkxBTktfVU5CTEFOSzsKLQliYWNrbGlnaHRfdXBkYXRlX3N0YXR1cyhiZCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgZWVlcGNfaHdtb25faW5pdChzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IGRldmljZSAqaHdtb247Ci0JaW50IHJlc3VsdDsKLQotCWh3bW9uID0gaHdtb25fZGV2aWNlX3JlZ2lzdGVyKGRldik7Ci0JaWYgKElTX0VSUihod21vbikpIHsKLQkJcHJpbnRrKEVFRVBDX0VSUgotCQkgICAgICAgIkNvdWxkIG5vdCByZWdpc3RlciBlZWVwYyBod21vbiBkZXZpY2VcbiIpOwotCQllZWVwY19od21vbl9kZXZpY2UgPSBOVUxMOwotCQlyZXR1cm4gUFRSX0VSUihod21vbik7Ci0JfQotCWVlZXBjX2h3bW9uX2RldmljZSA9IGh3bW9uOwotCXJlc3VsdCA9IHN5c2ZzX2NyZWF0ZV9ncm91cCgmaHdtb24tPmtvYmosCi0JCQkJICAgICZod21vbl9hdHRyaWJ1dGVfZ3JvdXApOwotCWlmIChyZXN1bHQpCi0JCWVlZXBjX2h3bW9uX2V4aXQoKTsKLQlyZXR1cm4gcmVzdWx0OwotfQotCi1zdGF0aWMgaW50IF9faW5pdCBlZWVwY19sYXB0b3BfaW5pdCh2b2lkKQotewotCXN0cnVjdCBkZXZpY2UgKmRldjsKLQlpbnQgcmVzdWx0OwotCi0JaWYgKGFjcGlfZGlzYWJsZWQpCi0JCXJldHVybiAtRU5PREVWOwotCXJlc3VsdCA9IGFjcGlfYnVzX3JlZ2lzdGVyX2RyaXZlcigmZWVlcGNfaG90a19kcml2ZXIpOwotCWlmIChyZXN1bHQgPCAwKQotCQlyZXR1cm4gcmVzdWx0OwotCWlmICghZWhvdGspIHsKLQkJYWNwaV9idXNfdW5yZWdpc3Rlcl9kcml2ZXIoJmVlZXBjX2hvdGtfZHJpdmVyKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCWRldiA9IGFjcGlfZ2V0X3BoeXNpY2FsX2RldmljZShlaG90ay0+ZGV2aWNlLT5oYW5kbGUpOwotCi0JaWYgKCFhY3BpX3ZpZGVvX2JhY2tsaWdodF9zdXBwb3J0KCkpIHsKLQkJcmVzdWx0ID0gZWVlcGNfYmFja2xpZ2h0X2luaXQoZGV2KTsKLQkJaWYgKHJlc3VsdCkKLQkJCWdvdG8gZmFpbF9iYWNrbGlnaHQ7Ci0JfSBlbHNlCi0JCXByaW50ayhFRUVQQ19JTkZPICJCYWNrbGlnaHQgY29udHJvbGxlZCBieSBBQ1BJIHZpZGVvICIKLQkJICAgICAgICJkcml2ZXJcbiIpOwotCi0JcmVzdWx0ID0gZWVlcGNfaHdtb25faW5pdChkZXYpOwotCWlmIChyZXN1bHQpCi0JCWdvdG8gZmFpbF9od21vbjsKLQkvKiBSZWdpc3RlciBwbGF0Zm9ybSBzdHVmZiAqLwotCXJlc3VsdCA9IHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmcGxhdGZvcm1fZHJpdmVyKTsKLQlpZiAocmVzdWx0KQotCQlnb3RvIGZhaWxfcGxhdGZvcm1fZHJpdmVyOwotCXBsYXRmb3JtX2RldmljZSA9IHBsYXRmb3JtX2RldmljZV9hbGxvYyhFRUVQQ19IT1RLX0ZJTEUsIC0xKTsKLQlpZiAoIXBsYXRmb3JtX2RldmljZSkgewotCQlyZXN1bHQgPSAtRU5PTUVNOwotCQlnb3RvIGZhaWxfcGxhdGZvcm1fZGV2aWNlMTsKLQl9Ci0JcmVzdWx0ID0gcGxhdGZvcm1fZGV2aWNlX2FkZChwbGF0Zm9ybV9kZXZpY2UpOwotCWlmIChyZXN1bHQpCi0JCWdvdG8gZmFpbF9wbGF0Zm9ybV9kZXZpY2UyOwotCXJlc3VsdCA9IHN5c2ZzX2NyZWF0ZV9ncm91cCgmcGxhdGZvcm1fZGV2aWNlLT5kZXYua29iaiwKLQkJCQkgICAgJnBsYXRmb3JtX2F0dHJpYnV0ZV9ncm91cCk7Ci0JaWYgKHJlc3VsdCkKLQkJZ290byBmYWlsX3N5c2ZzOwotCXJldHVybiAwOwotZmFpbF9zeXNmczoKLQlwbGF0Zm9ybV9kZXZpY2VfZGVsKHBsYXRmb3JtX2RldmljZSk7Ci1mYWlsX3BsYXRmb3JtX2RldmljZTI6Ci0JcGxhdGZvcm1fZGV2aWNlX3B1dChwbGF0Zm9ybV9kZXZpY2UpOwotZmFpbF9wbGF0Zm9ybV9kZXZpY2UxOgotCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZwbGF0Zm9ybV9kcml2ZXIpOwotZmFpbF9wbGF0Zm9ybV9kcml2ZXI6Ci0JZWVlcGNfaHdtb25fZXhpdCgpOwotZmFpbF9od21vbjoKLQllZWVwY19iYWNrbGlnaHRfZXhpdCgpOwotZmFpbF9iYWNrbGlnaHQ6Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQotbW9kdWxlX2luaXQoZWVlcGNfbGFwdG9wX2luaXQpOwotbW9kdWxlX2V4aXQoZWVlcGNfbGFwdG9wX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL2VuY2xvc3VyZS5jIGIvZHJpdmVycy9taXNjL2VuY2xvc3VyZS5jCmluZGV4IDA3MzZjZmYuLjNjZjYxZWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9lbmNsb3N1cmUuYworKysgYi9kcml2ZXJzL21pc2MvZW5jbG9zdXJlLmMKQEAgLTExOSw3ICsxMTksNyBAQAogCWVkZXYtPmVkZXYuY2xhc3MgPSAmZW5jbG9zdXJlX2NsYXNzOwogCWVkZXYtPmVkZXYucGFyZW50ID0gZ2V0X2RldmljZShkZXYpOwogCWVkZXYtPmNiID0gY2I7Ci0Jc25wcmludGYoZWRldi0+ZWRldi5idXNfaWQsIEJVU19JRF9TSVpFLCAiJXMiLCBuYW1lKTsKKwlkZXZfc2V0X25hbWUoJmVkZXYtPmVkZXYsIG5hbWUpOwogCWVyciA9IGRldmljZV9yZWdpc3RlcigmZWRldi0+ZWRldik7CiAJaWYgKGVycikKIAkJZ290byBlcnI7CkBAIC0xNzAsNyArMTcwLDcgQEAKIHN0YXRpYyB2b2lkIGVuY2xvc3VyZV9saW5rX25hbWUoc3RydWN0IGVuY2xvc3VyZV9jb21wb25lbnQgKmNkZXYsIGNoYXIgKm5hbWUpCiB7CiAJc3RyY3B5KG5hbWUsICJlbmNsb3N1cmVfZGV2aWNlOiIpOwotCXN0cmNhdChuYW1lLCBjZGV2LT5jZGV2LmJ1c19pZCk7CisJc3RyY2F0KG5hbWUsIGRldl9uYW1lKCZjZGV2LT5jZGV2KSk7CiB9CiAKIHN0YXRpYyB2b2lkIGVuY2xvc3VyZV9yZW1vdmVfbGlua3Moc3RydWN0IGVuY2xvc3VyZV9jb21wb25lbnQgKmNkZXYpCkBAIC0yNTYsOSArMjU2LDkgQEAKIAljZGV2ID0gJmVjb21wLT5jZGV2OwogCWNkZXYtPnBhcmVudCA9IGdldF9kZXZpY2UoJmVkZXYtPmVkZXYpOwogCWlmIChuYW1lKQotCQlzbnByaW50ZihjZGV2LT5idXNfaWQsIEJVU19JRF9TSVpFLCAiJXMiLCBuYW1lKTsKKwkJZGV2X3NldF9uYW1lKGNkZXYsIG5hbWUpOwogCWVsc2UKLQkJc25wcmludGYoY2Rldi0+YnVzX2lkLCBCVVNfSURfU0laRSwgIiV1IiwgbnVtYmVyKTsKKwkJZGV2X3NldF9uYW1lKGNkZXYsICIldSIsIG51bWJlcik7CiAKIAljZGV2LT5yZWxlYXNlID0gZW5jbG9zdXJlX2NvbXBvbmVudF9yZWxlYXNlOwogCWNkZXYtPmdyb3VwcyA9IGVuY2xvc3VyZV9ncm91cHM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvZnVqaXRzdS1sYXB0b3AuYyBiL2RyaXZlcnMvbWlzYy9mdWppdHN1LWxhcHRvcC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhN2RkM2U5Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbWlzYy9mdWppdHN1LWxhcHRvcC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTEyNiArMCwwIEBACi0vKi0qLWxpbnV4LWMtKi0qLwotCi0vKgotICBDb3B5cmlnaHQgKEMpIDIwMDcsMjAwOCBKb25hdGhhbiBXb2l0aGUgPGp3b2l0aGVAcGh5c2ljcy5hZGVsYWlkZS5lZHUuYXU+Ci0gIENvcHlyaWdodCAoQykgMjAwOCBQZXRlciBHcnViZXIgPG5va29zQGdteC5uZXQ+Ci0gIEJhc2VkIG9uIGVhcmxpZXIgd29yazoKLSAgICBDb3B5cmlnaHQgKEMpIDIwMDMgU2hhbmUgU3BlbmNlciA8c2hhbmVAYm9nb21pcC5jb20+Ci0gICAgQWRyaWFuIFllZSA8YnJld3QtZnVqaXRzdUBicmV3dC5vcmc+Ci0KLSAgVGVtcGxhdGVkIGZyb20gbXNpLWxhcHRvcC5jIGFuZCB0aGlua3BhZF9hY3BpLmMgd2hpY2ggaXMgY29weXJpZ2h0Ci0gIGJ5IGl0cyByZXNwZWN0aXZlIGF1dGhvcnMuCi0KLSAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKLSAgMDIxMTAtMTMwMSwgVVNBLgotICovCi0KLS8qCi0gKiBmdWppdHN1LWxhcHRvcC5jIC0gRnVqaXRzdSBsYXB0b3Agc3VwcG9ydCwgcHJvdmlkaW5nIGFjY2VzcyB0byBhZGRpdGlvbmFsCi0gKiBmZWF0dXJlcyBtYWRlIGF2YWlsYWJsZSBvbiBhIHJhbmdlIG9mIEZ1aml0c3UgbGFwdG9wcyBpbmNsdWRpbmcgdGhlCi0gKiBQMnh4eC9QNXh4eC9TNnh4eC9TN3h4eCBzZXJpZXMuCi0gKgotICogVGhpcyBkcml2ZXIgZXhwb3J0cyBhIGZldyBmaWxlcyBpbiAvc3lzL2RldmljZXMvcGxhdGZvcm0vZnVqaXRzdS1sYXB0b3AvOwotICogb3RoZXJzIG1heSBiZSBhZGRlZCBhdCBhIGxhdGVyIGRhdGUuCi0gKgotICogICBsY2RfbGV2ZWwgLSBTY3JlZW4gYnJpZ2h0bmVzczogY29udGFpbnMgYSBzaW5nbGUgaW50ZWdlciBpbiB0aGUKLSAqICAgcmFuZ2UgMC4uNy4gKHJ3KQotICoKLSAqIEluIGFkZGl0aW9uIHRvIHRoZXNlIHBsYXRmb3JtIGRldmljZSBhdHRyaWJ1dGVzIHRoZSBkcml2ZXIKLSAqIHJlZ2lzdGVycyBpdHNlbGYgaW4gdGhlIExpbnV4IGJhY2tsaWdodCBjb250cm9sIHN1YnN5c3RlbSBhbmQgaXMKLSAqIGF2YWlsYWJsZSB0byB1c2Vyc3BhY2UgdW5kZXIgL3N5cy9jbGFzcy9iYWNrbGlnaHQvZnVqaXRzdS1sYXB0b3AvLgotICoKLSAqIEhvdGtleXMgcHJlc2VudCBvbiBjZXJ0YWluIEZ1aml0c3UgbGFwdG9wcyAoZWc6IHRoZSBTNnh4eCBzZXJpZXMpIGFyZQotICogYWxzbyBzdXBwb3J0ZWQgYnkgdGhpcyBkcml2ZXIuCi0gKgotICogVGhpcyBkcml2ZXIgaGFzIGJlZW4gdGVzdGVkIG9uIGEgRnVqaXRzdSBMaWZlYm9vayBTNjQxMCwgUzcwMjAgYW5kCi0gKiBQODAxMC4gIEl0IHNob3VsZCB3b3JrIG9uIG1vc3QgUC1zZXJpZXMgYW5kIFMtc2VyaWVzIExpZmVib29rcywgYnV0Ci0gKiBZTU1WLgotICoKLSAqIFRoZSBtb2R1bGUgcGFyYW1ldGVyIHVzZV9hbHRfbGNkX2xldmVscyBzd2l0Y2hlcyBiZXR3ZWVuIGRpZmZlcmVudCBBQ1BJCi0gKiBicmlnaHRuZXNzIGNvbnRyb2xzIHdoaWNoIGFyZSB1c2VkIGJ5IGRpZmZlcmVudCBGdWppdHN1IGxhcHRvcHMuICBJbiBtb3N0Ci0gKiBjYXNlcyB0aGUgY29ycmVjdCBtZXRob2QgaXMgYXV0b21hdGljYWxseSBkZXRlY3RlZC4gInVzZV9hbHRfbGNkX2xldmVscz0xIgotICogaXMgYXBwbGljYWJsZSBmb3IgYSBGdWppdHN1IExpZmVib29rIFM2NDEwIGlmIGF1dG9kZXRlY3Rpb24gZmFpbHMuCi0gKgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvYWNwaS5oPgotI2luY2x1ZGUgPGxpbnV4L2RtaS5oPgotI2luY2x1ZGUgPGxpbnV4L2JhY2tsaWdodC5oPgotI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+Ci0jaW5jbHVkZSA8bGludXgva2ZpZm8uaD4KLSNpbmNsdWRlIDxsaW51eC92aWRlb19vdXRwdXQuaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLQotI2RlZmluZSBGVUpJVFNVX0RSSVZFUl9WRVJTSU9OICIwLjQuMyIKLQotI2RlZmluZSBGVUpJVFNVX0xDRF9OX0xFVkVMUyA4Ci0KLSNkZWZpbmUgQUNQSV9GVUpJVFNVX0NMQVNTICAgICAgICAgICAgICAiZnVqaXRzdSIKLSNkZWZpbmUgQUNQSV9GVUpJVFNVX0hJRCAgICAgICAgICAgICAgICAiRlVKMDJCMSIKLSNkZWZpbmUgQUNQSV9GVUpJVFNVX0RSSVZFUl9OQU1FCSJGdWppdHN1IGxhcHRvcCBGVUowMkIxIEFDUEkgYnJpZ2h0bmVzcyBkcml2ZXIiCi0jZGVmaW5lIEFDUElfRlVKSVRTVV9ERVZJQ0VfTkFNRSAgICAgICAgIkZ1aml0c3UgRlVKMDJCMSIKLSNkZWZpbmUgQUNQSV9GVUpJVFNVX0hPVEtFWV9ISUQgCSJGVUowMkUzIgotI2RlZmluZSBBQ1BJX0ZVSklUU1VfSE9US0VZX0RSSVZFUl9OQU1FICJGdWppdHN1IGxhcHRvcCBGVUowMkUzIEFDUEkgaG90a2V5cyBkcml2ZXIiCi0jZGVmaW5lIEFDUElfRlVKSVRTVV9IT1RLRVlfREVWSUNFX05BTUUgIkZ1aml0c3UgRlVKMDJFMyIKLQotI2RlZmluZSBBQ1BJX0ZVSklUU1VfTk9USUZZX0NPREUxICAgICAweDgwCi0KLSNkZWZpbmUgQUNQSV9WSURFT19OT1RJRllfSU5DX0JSSUdIVE5FU1MgICAgIDB4ODYKLSNkZWZpbmUgQUNQSV9WSURFT19OT1RJRllfREVDX0JSSUdIVE5FU1MgICAgIDB4ODcKLQotLyogSG90a2V5IGRldGFpbHMgKi8KLSNkZWZpbmUgS0VZMV9DT0RFCTB4NDEwCS8qIGNvZGVzIGZvciB0aGUga2V5cyBpbiB0aGUgR0lSQiByZWdpc3RlciAqLwotI2RlZmluZSBLRVkyX0NPREUJMHg0MTEKLSNkZWZpbmUgS0VZM19DT0RFCTB4NDEyCi0jZGVmaW5lIEtFWTRfQ09ERQkweDQxMwotCi0jZGVmaW5lIE1BWF9IT1RLRVlfUklOR0JVRkZFUl9TSVpFIDEwMAotI2RlZmluZSBSSU5HQlVGRkVSU0laRSA0MAotCi0vKiBEZWJ1Z2dpbmcgKi8KLSNkZWZpbmUgRlVKTEFQVE9QX0xPRwkgICBBQ1BJX0ZVSklUU1VfSElEICI6ICIKLSNkZWZpbmUgRlVKTEFQVE9QX0VSUgkgICBLRVJOX0VSUiBGVUpMQVBUT1BfTE9HCi0jZGVmaW5lIEZVSkxBUFRPUF9OT1RJQ0UgICBLRVJOX05PVElDRSBGVUpMQVBUT1BfTE9HCi0jZGVmaW5lIEZVSkxBUFRPUF9JTkZPCSAgIEtFUk5fSU5GTyBGVUpMQVBUT1BfTE9HCi0jZGVmaW5lIEZVSkxBUFRPUF9ERUJVRyAgICBLRVJOX0RFQlVHIEZVSkxBUFRPUF9MT0cKLQotI2RlZmluZSBGVUpMQVBUT1BfREJHX0FMTAkgIDB4ZmZmZgotI2RlZmluZSBGVUpMQVBUT1BfREJHX0VSUk9SCSAgMHgwMDAxCi0jZGVmaW5lIEZVSkxBUFRPUF9EQkdfV0FSTgkgIDB4MDAwMgotI2RlZmluZSBGVUpMQVBUT1BfREJHX0lORk8JICAweDAwMDQKLSNkZWZpbmUgRlVKTEFQVE9QX0RCR19UUkFDRQkgIDB4MDAwOAotCi0jZGVmaW5lIGRiZ19wcmludGsoYV9kYmdfbGV2ZWwsIGZvcm1hdCwgYXJnLi4uKSBcCi0JZG8geyBpZiAoZGJnX2xldmVsICYgYV9kYmdfbGV2ZWwpIFwKLQkJcHJpbnRrKEZVSkxBUFRPUF9ERUJVRyAiJXM6ICIgZm9ybWF0LCBfX2Z1bmNfXyAsICMjIGFyZyk7IFwKLQl9IHdoaWxlICgwKQotI2lmZGVmIENPTkZJR19GVUpJVFNVX0xBUFRPUF9ERUJVRwotI2RlZmluZSB2ZGJnX3ByaW50ayhhX2RiZ19sZXZlbCwgZm9ybWF0LCBhcmcuLi4pIFwKLQlkYmdfcHJpbnRrKGFfZGJnX2xldmVsLCBmb3JtYXQsICMjIGFyZykKLSNlbHNlCi0jZGVmaW5lIHZkYmdfcHJpbnRrKGFfZGJnX2xldmVsLCBmb3JtYXQsIGFyZy4uLikKLSNlbmRpZgotCi0vKiBEZXZpY2UgY29udHJvbGxpbmcgdGhlIGJhY2tsaWdodCBhbmQgYXNzb2NpYXRlZCBrZXlzICovCi1zdHJ1Y3QgZnVqaXRzdV90IHsKLQlhY3BpX2hhbmRsZSBhY3BpX2hhbmRsZTsKLQlzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldjsKLQlzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dDsKLQljaGFyIHBoeXNbMzJdOwotCXN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICpibF9kZXZpY2U7Ci0Jc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGZfZGV2aWNlOwotCWludCBrZXljb2RlMSwga2V5Y29kZTIsIGtleWNvZGUzLCBrZXljb2RlNDsKLQotCXVuc2lnbmVkIGludCBtYXhfYnJpZ2h0bmVzczsKLQl1bnNpZ25lZCBpbnQgYnJpZ2h0bmVzc19jaGFuZ2VkOwotCXVuc2lnbmVkIGludCBicmlnaHRuZXNzX2xldmVsOwotfTsKLQotc3RhdGljIHN0cnVjdCBmdWppdHN1X3QgKmZ1aml0c3U7Ci1zdGF0aWMgaW50IHVzZV9hbHRfbGNkX2xldmVscyA9IC0xOwotc3RhdGljIGludCBkaXNhYmxlX2JyaWdodG5lc3Nfa2V5cyA9IC0xOwotc3RhdGljIGludCBkaXNhYmxlX2JyaWdodG5lc3NfYWRqdXN0ID0gLTE7Ci0KLS8qIERldmljZSB1c2VkIHRvIGFjY2VzcyBvdGhlciBob3RrZXlzIG9uIHRoZSBsYXB0b3AgKi8KLXN0cnVjdCBmdWppdHN1X2hvdGtleV90IHsKLQlhY3BpX2hhbmRsZSBhY3BpX2hhbmRsZTsKLQlzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldjsKLQlzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dDsKLQljaGFyIHBoeXNbMzJdOwotCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBmX2RldmljZTsKLQlzdHJ1Y3Qga2ZpZm8gKmZpZm87Ci0Jc3BpbmxvY2tfdCBmaWZvX2xvY2s7Ci0KLQl1bnNpZ25lZCBpbnQgaXJiOwkvKiBpbmZvIGFib3V0IHRoZSBwcmVzc2VkIGJ1dHRvbnMgKi8KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgZnVqaXRzdV9ob3RrZXlfdCAqZnVqaXRzdV9ob3RrZXk7Ci0KLXN0YXRpYyB2b2lkIGFjcGlfZnVqaXRzdV9ob3RrZXlfbm90aWZ5KGFjcGlfaGFuZGxlIGhhbmRsZSwgdTMyIGV2ZW50LAotCQkJCSAgICAgICB2b2lkICpkYXRhKTsKLQotI2lmZGVmIENPTkZJR19GVUpJVFNVX0xBUFRPUF9ERUJVRwotc3RhdGljIHUzMiBkYmdfbGV2ZWwgPSAweDAzOwotI2VuZGlmCi0KLXN0YXRpYyB2b2lkIGFjcGlfZnVqaXRzdV9ub3RpZnkoYWNwaV9oYW5kbGUgaGFuZGxlLCB1MzIgZXZlbnQsIHZvaWQgKmRhdGEpOwotCi0vKiBIYXJkd2FyZSBhY2Nlc3MgZm9yIExDRCBicmlnaHRuZXNzIGNvbnRyb2wgKi8KLQotc3RhdGljIGludCBzZXRfbGNkX2xldmVsKGludCBsZXZlbCkKLXsKLQlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKLQl1bmlvbiBhY3BpX29iamVjdCBhcmcwID0geyBBQ1BJX1RZUEVfSU5URUdFUiB9OwotCXN0cnVjdCBhY3BpX29iamVjdF9saXN0IGFyZ19saXN0ID0geyAxLCAmYXJnMCB9OwotCWFjcGlfaGFuZGxlIGhhbmRsZSA9IE5VTEw7Ci0KLQl2ZGJnX3ByaW50ayhGVUpMQVBUT1BfREJHX1RSQUNFLCAic2V0IGxjZCBsZXZlbCB2aWEgU0JMTCBbJWRdXG4iLAotCQkgICAgbGV2ZWwpOwotCi0JaWYgKGxldmVsIDwgMCB8fCBsZXZlbCA+PSBmdWppdHN1LT5tYXhfYnJpZ2h0bmVzcykKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlpZiAoIWZ1aml0c3UpCi0JCXJldHVybiAtRUlOVkFMOwotCi0Jc3RhdHVzID0gYWNwaV9nZXRfaGFuZGxlKGZ1aml0c3UtPmFjcGlfaGFuZGxlLCAiU0JMTCIsICZoYW5kbGUpOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQl2ZGJnX3ByaW50ayhGVUpMQVBUT1BfREJHX0VSUk9SLCAiU0JMTCBub3QgcHJlc2VudFxuIik7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQotCWFyZzAuaW50ZWdlci52YWx1ZSA9IGxldmVsOwotCi0Jc3RhdHVzID0gYWNwaV9ldmFsdWF0ZV9vYmplY3QoaGFuZGxlLCBOVUxMLCAmYXJnX2xpc3QsIE5VTEwpOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBzZXRfbGNkX2xldmVsX2FsdChpbnQgbGV2ZWwpCi17Ci0JYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7Ci0JdW5pb24gYWNwaV9vYmplY3QgYXJnMCA9IHsgQUNQSV9UWVBFX0lOVEVHRVIgfTsKLQlzdHJ1Y3QgYWNwaV9vYmplY3RfbGlzdCBhcmdfbGlzdCA9IHsgMSwgJmFyZzAgfTsKLQlhY3BpX2hhbmRsZSBoYW5kbGUgPSBOVUxMOwotCi0JdmRiZ19wcmludGsoRlVKTEFQVE9QX0RCR19UUkFDRSwgInNldCBsY2QgbGV2ZWwgdmlhIFNCTDIgWyVkXVxuIiwKLQkJICAgIGxldmVsKTsKLQotCWlmIChsZXZlbCA8IDAgfHwgbGV2ZWwgPj0gZnVqaXRzdS0+bWF4X2JyaWdodG5lc3MpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKCFmdWppdHN1KQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXN0YXR1cyA9IGFjcGlfZ2V0X2hhbmRsZShmdWppdHN1LT5hY3BpX2hhbmRsZSwgIlNCTDIiLCAmaGFuZGxlKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJdmRiZ19wcmludGsoRlVKTEFQVE9QX0RCR19FUlJPUiwgIlNCTDIgbm90IHByZXNlbnRcbiIpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0KLQlhcmcwLmludGVnZXIudmFsdWUgPSBsZXZlbDsKLQotCXN0YXR1cyA9IGFjcGlfZXZhbHVhdGVfb2JqZWN0KGhhbmRsZSwgTlVMTCwgJmFyZ19saXN0LCBOVUxMKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpCi0JCXJldHVybiAtRU5PREVWOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgZ2V0X2xjZF9sZXZlbCh2b2lkKQotewotCXVuc2lnbmVkIGxvbmcgbG9uZyBzdGF0ZSA9IDA7Ci0JYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7Ci0KLQl2ZGJnX3ByaW50ayhGVUpMQVBUT1BfREJHX1RSQUNFLCAiZ2V0IGxjZCBsZXZlbCB2aWEgR0JMTFxuIik7Ci0KLQlzdGF0dXMgPQotCSAgICBhY3BpX2V2YWx1YXRlX2ludGVnZXIoZnVqaXRzdS0+YWNwaV9oYW5kbGUsICJHQkxMIiwgTlVMTCwgJnN0YXRlKTsKLQlpZiAoc3RhdHVzIDwgMCkKLQkJcmV0dXJuIHN0YXR1czsKLQotCWZ1aml0c3UtPmJyaWdodG5lc3NfbGV2ZWwgPSBzdGF0ZSAmIDB4MGZmZmZmZmY7Ci0KLQlpZiAoc3RhdGUgJiAweDgwMDAwMDAwKQotCQlmdWppdHN1LT5icmlnaHRuZXNzX2NoYW5nZWQgPSAxOwotCWVsc2UKLQkJZnVqaXRzdS0+YnJpZ2h0bmVzc19jaGFuZ2VkID0gMDsKLQotCXJldHVybiBmdWppdHN1LT5icmlnaHRuZXNzX2xldmVsOwotfQotCi1zdGF0aWMgaW50IGdldF9tYXhfYnJpZ2h0bmVzcyh2b2lkKQotewotCXVuc2lnbmVkIGxvbmcgbG9uZyBzdGF0ZSA9IDA7Ci0JYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7Ci0KLQl2ZGJnX3ByaW50ayhGVUpMQVBUT1BfREJHX1RSQUNFLCAiZ2V0IG1heCBsY2QgbGV2ZWwgdmlhIFJCTExcbiIpOwotCi0Jc3RhdHVzID0KLQkgICAgYWNwaV9ldmFsdWF0ZV9pbnRlZ2VyKGZ1aml0c3UtPmFjcGlfaGFuZGxlLCAiUkJMTCIsIE5VTEwsICZzdGF0ZSk7Ci0JaWYgKHN0YXR1cyA8IDApCi0JCXJldHVybiBzdGF0dXM7Ci0KLQlmdWppdHN1LT5tYXhfYnJpZ2h0bmVzcyA9IHN0YXRlOwotCi0JcmV0dXJuIGZ1aml0c3UtPm1heF9icmlnaHRuZXNzOwotfQotCi1zdGF0aWMgaW50IGdldF9sY2RfbGV2ZWxfYWx0KHZvaWQpCi17Ci0JdW5zaWduZWQgbG9uZyBsb25nIHN0YXRlID0gMDsKLQlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKLQotCXZkYmdfcHJpbnRrKEZVSkxBUFRPUF9EQkdfVFJBQ0UsICJnZXQgbGNkIGxldmVsIHZpYSBHQkxTXG4iKTsKLQotCXN0YXR1cyA9Ci0JICAgIGFjcGlfZXZhbHVhdGVfaW50ZWdlcihmdWppdHN1LT5hY3BpX2hhbmRsZSwgIkdCTFMiLCBOVUxMLCAmc3RhdGUpOwotCWlmIChzdGF0dXMgPCAwKQotCQlyZXR1cm4gc3RhdHVzOwotCi0JZnVqaXRzdS0+YnJpZ2h0bmVzc19sZXZlbCA9IHN0YXRlICYgMHgwZmZmZmZmZjsKLQotCWlmIChzdGF0ZSAmIDB4ODAwMDAwMDApCi0JCWZ1aml0c3UtPmJyaWdodG5lc3NfY2hhbmdlZCA9IDE7Ci0JZWxzZQotCQlmdWppdHN1LT5icmlnaHRuZXNzX2NoYW5nZWQgPSAwOwotCi0JcmV0dXJuIGZ1aml0c3UtPmJyaWdodG5lc3NfbGV2ZWw7Ci19Ci0KLS8qIEJhY2tsaWdodCBkZXZpY2Ugc3R1ZmYgKi8KLQotc3RhdGljIGludCBibF9nZXRfYnJpZ2h0bmVzcyhzdHJ1Y3QgYmFja2xpZ2h0X2RldmljZSAqYikKLXsKLQlpZiAodXNlX2FsdF9sY2RfbGV2ZWxzKQotCQlyZXR1cm4gZ2V0X2xjZF9sZXZlbF9hbHQoKTsKLQllbHNlCi0JCXJldHVybiBnZXRfbGNkX2xldmVsKCk7Ci19Ci0KLXN0YXRpYyBpbnQgYmxfdXBkYXRlX3N0YXR1cyhzdHJ1Y3QgYmFja2xpZ2h0X2RldmljZSAqYikKLXsKLQlpZiAodXNlX2FsdF9sY2RfbGV2ZWxzKQotCQlyZXR1cm4gc2V0X2xjZF9sZXZlbF9hbHQoYi0+cHJvcHMuYnJpZ2h0bmVzcyk7Ci0JZWxzZQotCQlyZXR1cm4gc2V0X2xjZF9sZXZlbChiLT5wcm9wcy5icmlnaHRuZXNzKTsKLX0KLQotc3RhdGljIHN0cnVjdCBiYWNrbGlnaHRfb3BzIGZ1aml0c3VibF9vcHMgPSB7Ci0JLmdldF9icmlnaHRuZXNzID0gYmxfZ2V0X2JyaWdodG5lc3MsCi0JLnVwZGF0ZV9zdGF0dXMgPSBibF91cGRhdGVfc3RhdHVzLAotfTsKLQotLyogUGxhdGZvcm0gTENEIGJyaWdodG5lc3MgZGV2aWNlICovCi0KLXN0YXRpYyBzc2l6ZV90Ci1zaG93X21heF9icmlnaHRuZXNzKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCi17Ci0KLQlpbnQgcmV0OwotCi0JcmV0ID0gZ2V0X21heF9icmlnaHRuZXNzKCk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0KLQlyZXR1cm4gc3ByaW50ZihidWYsICIlaVxuIiwgcmV0KTsKLX0KLQotc3RhdGljIHNzaXplX3QKLXNob3dfYnJpZ2h0bmVzc19jaGFuZ2VkKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCi17Ci0KLQlpbnQgcmV0OwotCi0JcmV0ID0gZnVqaXRzdS0+YnJpZ2h0bmVzc19jaGFuZ2VkOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCi0JcmV0dXJuIHNwcmludGYoYnVmLCAiJWlcbiIsIHJldCk7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IHNob3dfbGNkX2xldmVsKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCSAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCi17Ci0KLQlpbnQgcmV0OwotCi0JaWYgKHVzZV9hbHRfbGNkX2xldmVscykKLQkJcmV0ID0gZ2V0X2xjZF9sZXZlbF9hbHQoKTsKLQllbHNlCi0JCXJldCA9IGdldF9sY2RfbGV2ZWwoKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVpXG4iLCByZXQpOwotfQotCi1zdGF0aWMgc3NpemVfdCBzdG9yZV9sY2RfbGV2ZWwoc3RydWN0IGRldmljZSAqZGV2LAotCQkJICAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsCi0JCQkgICAgICAgc2l6ZV90IGNvdW50KQotewotCi0JaW50IGxldmVsLCByZXQ7Ci0KLQlpZiAoc3NjYW5mKGJ1ZiwgIiVpIiwgJmxldmVsKSAhPSAxCi0JICAgIHx8IChsZXZlbCA8IDAgfHwgbGV2ZWwgPj0gZnVqaXRzdS0+bWF4X2JyaWdodG5lc3MpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmICh1c2VfYWx0X2xjZF9sZXZlbHMpCi0JCXJldCA9IHNldF9sY2RfbGV2ZWxfYWx0KGxldmVsKTsKLQllbHNlCi0JCXJldCA9IHNldF9sY2RfbGV2ZWwobGV2ZWwpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCi0JaWYgKHVzZV9hbHRfbGNkX2xldmVscykKLQkJcmV0ID0gZ2V0X2xjZF9sZXZlbF9hbHQoKTsKLQllbHNlCi0JCXJldCA9IGdldF9sY2RfbGV2ZWwoKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQotCXJldHVybiBjb3VudDsKLX0KLQotLyogSGFyZHdhcmUgYWNjZXNzIGZvciBob3RrZXkgZGV2aWNlICovCi0KLXN0YXRpYyBpbnQgZ2V0X2lyYih2b2lkKQotewotCXVuc2lnbmVkIGxvbmcgbG9uZyBzdGF0ZSA9IDA7Ci0JYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7Ci0KLQl2ZGJnX3ByaW50ayhGVUpMQVBUT1BfREJHX1RSQUNFLCAiR2V0IGlyYlxuIik7Ci0KLQlzdGF0dXMgPQotCSAgICBhY3BpX2V2YWx1YXRlX2ludGVnZXIoZnVqaXRzdV9ob3RrZXktPmFjcGlfaGFuZGxlLCAiR0lSQiIsIE5VTEwsCi0JCQkJICAmc3RhdGUpOwotCWlmIChzdGF0dXMgPCAwKQotCQlyZXR1cm4gc3RhdHVzOwotCi0JZnVqaXRzdV9ob3RrZXktPmlyYiA9IHN0YXRlOwotCi0JcmV0dXJuIGZ1aml0c3VfaG90a2V5LT5pcmI7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90Ci1pZ25vcmVfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAotCSAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQotewotCXJldHVybiBjb3VudDsKLX0KLQotc3RhdGljIERFVklDRV9BVFRSKG1heF9icmlnaHRuZXNzLCAwNDQ0LCBzaG93X21heF9icmlnaHRuZXNzLCBpZ25vcmVfc3RvcmUpOwotc3RhdGljIERFVklDRV9BVFRSKGJyaWdodG5lc3NfY2hhbmdlZCwgMDQ0NCwgc2hvd19icmlnaHRuZXNzX2NoYW5nZWQsCi0JCSAgIGlnbm9yZV9zdG9yZSk7Ci1zdGF0aWMgREVWSUNFX0FUVFIobGNkX2xldmVsLCAwNjQ0LCBzaG93X2xjZF9sZXZlbCwgc3RvcmVfbGNkX2xldmVsKTsKLQotc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmZ1aml0c3VwZl9hdHRyaWJ1dGVzW10gPSB7Ci0JJmRldl9hdHRyX2JyaWdodG5lc3NfY2hhbmdlZC5hdHRyLAotCSZkZXZfYXR0cl9tYXhfYnJpZ2h0bmVzcy5hdHRyLAotCSZkZXZfYXR0cl9sY2RfbGV2ZWwuYXR0ciwKLQlOVUxMCi19OwotCi1zdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBmdWppdHN1cGZfYXR0cmlidXRlX2dyb3VwID0gewotCS5hdHRycyA9IGZ1aml0c3VwZl9hdHRyaWJ1dGVzCi19OwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBmdWppdHN1cGZfZHJpdmVyID0gewotCS5kcml2ZXIgPSB7Ci0JCSAgIC5uYW1lID0gImZ1aml0c3UtbGFwdG9wIiwKLQkJICAgLm93bmVyID0gVEhJU19NT0RVTEUsCi0JCSAgIH0KLX07Ci0KLXN0YXRpYyB2b2lkIGRtaV9jaGVja19jYl9jb21tb24oY29uc3Qgc3RydWN0IGRtaV9zeXN0ZW1faWQgKmlkKQotewotCWFjcGlfaGFuZGxlIGhhbmRsZTsKLQlpbnQgaGF2ZV9ibG5mOwotCXByaW50ayhLRVJOX0lORk8gImZ1aml0c3UtbGFwdG9wOiBJZGVudGlmaWVkIGxhcHRvcCBtb2RlbCAnJXMnLlxuIiwKLQkgICAgICAgaWQtPmlkZW50KTsKLQloYXZlX2JsbmYgPSBBQ1BJX1NVQ0NFU1MKLQkgICAgKGFjcGlfZ2V0X2hhbmRsZShOVUxMLCAiXFxfU0IuUENJMC5HRlgwLkxDRC5CTE5GIiwgJmhhbmRsZSkpOwotCWlmICh1c2VfYWx0X2xjZF9sZXZlbHMgPT0gLTEpIHsKLQkJdmRiZ19wcmludGsoRlVKTEFQVE9QX0RCR19UUkFDRSwgImF1dG8tZGV0ZWN0aW5nIHVzZWFsdFxuIik7Ci0JCXVzZV9hbHRfbGNkX2xldmVscyA9IDE7Ci0JfQotCWlmIChkaXNhYmxlX2JyaWdodG5lc3Nfa2V5cyA9PSAtMSkgewotCQl2ZGJnX3ByaW50ayhGVUpMQVBUT1BfREJHX1RSQUNFLAotCQkJICAgICJhdXRvLWRldGVjdGluZyBkaXNhYmxlX2tleXNcbiIpOwotCQlkaXNhYmxlX2JyaWdodG5lc3Nfa2V5cyA9IGhhdmVfYmxuZiA/IDEgOiAwOwotCX0KLQlpZiAoZGlzYWJsZV9icmlnaHRuZXNzX2FkanVzdCA9PSAtMSkgewotCQl2ZGJnX3ByaW50ayhGVUpMQVBUT1BfREJHX1RSQUNFLAotCQkJICAgICJhdXRvLWRldGVjdGluZyBkaXNhYmxlX2FkanVzdFxuIik7Ci0JCWRpc2FibGVfYnJpZ2h0bmVzc19hZGp1c3QgPSBoYXZlX2JsbmYgPyAwIDogMTsKLQl9Ci19Ci0KLXN0YXRpYyBpbnQgZG1pX2NoZWNrX2NiX3M2NDEwKGNvbnN0IHN0cnVjdCBkbWlfc3lzdGVtX2lkICppZCkKLXsKLQlkbWlfY2hlY2tfY2JfY29tbW9uKGlkKTsKLQlmdWppdHN1LT5rZXljb2RlMSA9IEtFWV9TQ1JFRU5MT0NLOwkvKiAiTG9jayIgKi8KLQlmdWppdHN1LT5rZXljb2RlMiA9IEtFWV9IRUxQOwkvKiAiTW9iaWxpdHkgQ2VudGVyIiAqLwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGRtaV9jaGVja19jYl9zNjQyMChjb25zdCBzdHJ1Y3QgZG1pX3N5c3RlbV9pZCAqaWQpCi17Ci0JZG1pX2NoZWNrX2NiX2NvbW1vbihpZCk7Ci0JZnVqaXRzdS0+a2V5Y29kZTEgPSBLRVlfU0NSRUVOTE9DSzsJLyogIkxvY2siICovCi0JZnVqaXRzdS0+a2V5Y29kZTIgPSBLRVlfSEVMUDsJLyogIk1vYmlsaXR5IENlbnRlciIgKi8KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBkbWlfY2hlY2tfY2JfcDgwMTAoY29uc3Qgc3RydWN0IGRtaV9zeXN0ZW1faWQgKmlkKQotewotCWRtaV9jaGVja19jYl9jb21tb24oaWQpOwotCWZ1aml0c3UtPmtleWNvZGUxID0gS0VZX0hFTFA7CS8qICJTdXBwb3J0IiAqLwotCWZ1aml0c3UtPmtleWNvZGUzID0gS0VZX1NXSVRDSFZJREVPTU9ERTsJLyogIlByZXNlbnRhdGlvbiIgKi8KLQlmdWppdHN1LT5rZXljb2RlNCA9IEtFWV9XV1c7CS8qICJJbnRlcm5ldCIgKi8KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHN0cnVjdCBkbWlfc3lzdGVtX2lkIGZ1aml0c3VfZG1pX3RhYmxlW10gPSB7Ci0JewotCSAuaWRlbnQgPSAiRnVqaXRzdSBTaWVtZW5zIFM2NDEwIiwKLQkgLm1hdGNoZXMgPSB7Ci0JCSAgICAgRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiRlVKSVRTVSBTSUVNRU5TIiksCi0JCSAgICAgRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJMSUZFQk9PSyBTNjQxMCIpLAotCQkgICAgIH0sCi0JIC5jYWxsYmFjayA9IGRtaV9jaGVja19jYl9zNjQxMH0sCi0JewotCSAuaWRlbnQgPSAiRnVqaXRzdSBTaWVtZW5zIFM2NDIwIiwKLQkgLm1hdGNoZXMgPSB7Ci0JCSAgICAgRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiRlVKSVRTVSBTSUVNRU5TIiksCi0JCSAgICAgRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJMSUZFQk9PSyBTNjQyMCIpLAotCQkgICAgIH0sCi0JIC5jYWxsYmFjayA9IGRtaV9jaGVja19jYl9zNjQyMH0sCi0JewotCSAuaWRlbnQgPSAiRnVqaXRzdSBMaWZlQm9vayBQODAxMCIsCi0JIC5tYXRjaGVzID0gewotCQkgICAgIERNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkZVSklUU1UiKSwKLQkJICAgICBETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIkxpZmVCb29rIFA4MDEwIiksCi0JCSAgICAgfSwKLQkgLmNhbGxiYWNrID0gZG1pX2NoZWNrX2NiX3A4MDEwfSwKLQl7fQotfTsKLQotLyogQUNQSSBkZXZpY2UgZm9yIExDRCBicmlnaHRuZXNzIGNvbnRyb2wgKi8KLQotc3RhdGljIGludCBhY3BpX2Z1aml0c3VfYWRkKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKQotewotCWFjcGlfc3RhdHVzIHN0YXR1czsKLQlhY3BpX2hhbmRsZSBoYW5kbGU7Ci0JaW50IHJlc3VsdCA9IDA7Ci0JaW50IHN0YXRlID0gMDsKLQlzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dDsKLQlpbnQgZXJyb3I7Ci0KLQlpZiAoIWRldmljZSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlmdWppdHN1LT5hY3BpX2hhbmRsZSA9IGRldmljZS0+aGFuZGxlOwotCXNwcmludGYoYWNwaV9kZXZpY2VfbmFtZShkZXZpY2UpLCAiJXMiLCBBQ1BJX0ZVSklUU1VfREVWSUNFX05BTUUpOwotCXNwcmludGYoYWNwaV9kZXZpY2VfY2xhc3MoZGV2aWNlKSwgIiVzIiwgQUNQSV9GVUpJVFNVX0NMQVNTKTsKLQlkZXZpY2UtPmRyaXZlcl9kYXRhID0gZnVqaXRzdTsKLQotCXN0YXR1cyA9IGFjcGlfaW5zdGFsbF9ub3RpZnlfaGFuZGxlcihkZXZpY2UtPmhhbmRsZSwKLQkJCQkJICAgICBBQ1BJX0RFVklDRV9OT1RJRlksCi0JCQkJCSAgICAgYWNwaV9mdWppdHN1X25vdGlmeSwgZnVqaXRzdSk7Ci0KLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJFcnJvciBpbnN0YWxsaW5nIG5vdGlmeSBoYW5kbGVyXG4iKTsKLQkJZXJyb3IgPSAtRU5PREVWOwotCQlnb3RvIGVycl9zdG9wOwotCX0KLQotCWZ1aml0c3UtPmlucHV0ID0gaW5wdXQgPSBpbnB1dF9hbGxvY2F0ZV9kZXZpY2UoKTsKLQlpZiAoIWlucHV0KSB7Ci0JCWVycm9yID0gLUVOT01FTTsKLQkJZ290byBlcnJfdW5pbnN0YWxsX25vdGlmeTsKLQl9Ci0KLQlzbnByaW50ZihmdWppdHN1LT5waHlzLCBzaXplb2YoZnVqaXRzdS0+cGh5cyksCi0JCSAiJXMvdmlkZW8vaW5wdXQwIiwgYWNwaV9kZXZpY2VfaGlkKGRldmljZSkpOwotCi0JaW5wdXQtPm5hbWUgPSBhY3BpX2RldmljZV9uYW1lKGRldmljZSk7Ci0JaW5wdXQtPnBoeXMgPSBmdWppdHN1LT5waHlzOwotCWlucHV0LT5pZC5idXN0eXBlID0gQlVTX0hPU1Q7Ci0JaW5wdXQtPmlkLnByb2R1Y3QgPSAweDA2OwotCWlucHV0LT5kZXYucGFyZW50ID0gJmRldmljZS0+ZGV2OwotCWlucHV0LT5ldmJpdFswXSA9IEJJVChFVl9LRVkpOwotCXNldF9iaXQoS0VZX0JSSUdIVE5FU1NVUCwgaW5wdXQtPmtleWJpdCk7Ci0Jc2V0X2JpdChLRVlfQlJJR0hUTkVTU0RPV04sIGlucHV0LT5rZXliaXQpOwotCXNldF9iaXQoS0VZX1VOS05PV04sIGlucHV0LT5rZXliaXQpOwotCi0JZXJyb3IgPSBpbnB1dF9yZWdpc3Rlcl9kZXZpY2UoaW5wdXQpOwotCWlmIChlcnJvcikKLQkJZ290byBlcnJfZnJlZV9pbnB1dF9kZXY7Ci0KLQlyZXN1bHQgPSBhY3BpX2J1c19nZXRfcG93ZXIoZnVqaXRzdS0+YWNwaV9oYW5kbGUsICZzdGF0ZSk7Ci0JaWYgKHJlc3VsdCkgewotCQlwcmludGsoS0VSTl9FUlIgIkVycm9yIHJlYWRpbmcgcG93ZXIgc3RhdGVcbiIpOwotCQlnb3RvIGVuZDsKLQl9Ci0KLQlwcmludGsoS0VSTl9JTkZPIFBSRUZJWCAiJXMgWyVzXSAoJXMpXG4iLAotCSAgICAgICBhY3BpX2RldmljZV9uYW1lKGRldmljZSksIGFjcGlfZGV2aWNlX2JpZChkZXZpY2UpLAotCSAgICAgICAhZGV2aWNlLT5wb3dlci5zdGF0ZSA/ICJvbiIgOiAib2ZmIik7Ci0KLQlmdWppdHN1LT5kZXYgPSBkZXZpY2U7Ci0KLQlpZiAoQUNQSV9TVUNDRVNTCi0JICAgIChhY3BpX2dldF9oYW5kbGUoZGV2aWNlLT5oYW5kbGUsIE1FVEhPRF9OQU1FX19JTkksICZoYW5kbGUpKSkgewotCQl2ZGJnX3ByaW50ayhGVUpMQVBUT1BfREJHX0lORk8sICJJbnZva2luZyBfSU5JXG4iKTsKLQkJaWYgKEFDUElfRkFJTFVSRQotCQkgICAgKGFjcGlfZXZhbHVhdGVfb2JqZWN0Ci0JCSAgICAgKGRldmljZS0+aGFuZGxlLCBNRVRIT0RfTkFNRV9fSU5JLCBOVUxMLCBOVUxMKSkpCi0JCQlwcmludGsoS0VSTl9FUlIgIl9JTkkgTWV0aG9kIGZhaWxlZFxuIik7Ci0JfQotCi0JLyogZG8gY29uZmlnIChkZXRlY3QgZGVmYXVsdHMpICovCi0JdXNlX2FsdF9sY2RfbGV2ZWxzID0gdXNlX2FsdF9sY2RfbGV2ZWxzID09IDEgPyAxIDogMDsKLQlkaXNhYmxlX2JyaWdodG5lc3Nfa2V5cyA9IGRpc2FibGVfYnJpZ2h0bmVzc19rZXlzID09IDEgPyAxIDogMDsKLQlkaXNhYmxlX2JyaWdodG5lc3NfYWRqdXN0ID0gZGlzYWJsZV9icmlnaHRuZXNzX2FkanVzdCA9PSAxID8gMSA6IDA7Ci0JdmRiZ19wcmludGsoRlVKTEFQVE9QX0RCR19JTkZPLAotCQkgICAgImNvbmZpZzogW2FsdCBpbnRlcmZhY2U6ICVkXSwgW2tleSBkaXNhYmxlOiAlZF0sIFthZGp1c3QgZGlzYWJsZTogJWRdXG4iLAotCQkgICAgdXNlX2FsdF9sY2RfbGV2ZWxzLCBkaXNhYmxlX2JyaWdodG5lc3Nfa2V5cywKLQkJICAgIGRpc2FibGVfYnJpZ2h0bmVzc19hZGp1c3QpOwotCi0JaWYgKGdldF9tYXhfYnJpZ2h0bmVzcygpIDw9IDApCi0JCWZ1aml0c3UtPm1heF9icmlnaHRuZXNzID0gRlVKSVRTVV9MQ0RfTl9MRVZFTFM7Ci0JaWYgKHVzZV9hbHRfbGNkX2xldmVscykKLQkJZ2V0X2xjZF9sZXZlbF9hbHQoKTsKLQllbHNlCi0JCWdldF9sY2RfbGV2ZWwoKTsKLQotCXJldHVybiByZXN1bHQ7Ci0KLWVuZDoKLWVycl9mcmVlX2lucHV0X2RldjoKLQlpbnB1dF9mcmVlX2RldmljZShpbnB1dCk7Ci1lcnJfdW5pbnN0YWxsX25vdGlmeToKLQlhY3BpX3JlbW92ZV9ub3RpZnlfaGFuZGxlcihkZXZpY2UtPmhhbmRsZSwgQUNQSV9ERVZJQ0VfTk9USUZZLAotCQkJCSAgIGFjcGlfZnVqaXRzdV9ub3RpZnkpOwotZXJyX3N0b3A6Ci0KLQlyZXR1cm4gcmVzdWx0OwotfQotCi1zdGF0aWMgaW50IGFjcGlfZnVqaXRzdV9yZW1vdmUoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UsIGludCB0eXBlKQotewotCWFjcGlfc3RhdHVzIHN0YXR1czsKLQlzdHJ1Y3QgZnVqaXRzdV90ICpmdWppdHN1ID0gTlVMTDsKLQotCWlmICghZGV2aWNlIHx8ICFhY3BpX2RyaXZlcl9kYXRhKGRldmljZSkpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JZnVqaXRzdSA9IGFjcGlfZHJpdmVyX2RhdGEoZGV2aWNlKTsKLQotCXN0YXR1cyA9IGFjcGlfcmVtb3ZlX25vdGlmeV9oYW5kbGVyKGZ1aml0c3UtPmFjcGlfaGFuZGxlLAotCQkJCQkgICAgQUNQSV9ERVZJQ0VfTk9USUZZLAotCQkJCQkgICAgYWNwaV9mdWppdHN1X25vdGlmeSk7Ci0KLQlpZiAoIWRldmljZSB8fCAhYWNwaV9kcml2ZXJfZGF0YShkZXZpY2UpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWZ1aml0c3UtPmFjcGlfaGFuZGxlID0gTlVMTDsKLQotCXJldHVybiAwOwotfQotCi0vKiBCcmlnaHRuZXNzIG5vdGlmeSAqLwotCi1zdGF0aWMgdm9pZCBhY3BpX2Z1aml0c3Vfbm90aWZ5KGFjcGlfaGFuZGxlIGhhbmRsZSwgdTMyIGV2ZW50LCB2b2lkICpkYXRhKQotewotCXN0cnVjdCBpbnB1dF9kZXYgKmlucHV0OwotCWludCBrZXljb2RlOwotCWludCBvbGRiLCBuZXdiOwotCi0JaW5wdXQgPSBmdWppdHN1LT5pbnB1dDsKLQotCXN3aXRjaCAoZXZlbnQpIHsKLQljYXNlIEFDUElfRlVKSVRTVV9OT1RJRllfQ09ERTE6Ci0JCWtleWNvZGUgPSAwOwotCQlvbGRiID0gZnVqaXRzdS0+YnJpZ2h0bmVzc19sZXZlbDsKLQkJZ2V0X2xjZF9sZXZlbCgpOyAgLyogdGhlIGFsdCB2ZXJzaW9uIGFsd2F5cyB5aWVsZHMgY2hhbmdlZCAqLwotCQluZXdiID0gZnVqaXRzdS0+YnJpZ2h0bmVzc19sZXZlbDsKLQotCQl2ZGJnX3ByaW50ayhGVUpMQVBUT1BfREJHX1RSQUNFLAotCQkJICAgICJicmlnaHRuZXNzIGJ1dHRvbiBldmVudCBbJWkgLT4gJWkgKCVpKV1cbiIsCi0JCQkgICAgb2xkYiwgbmV3YiwgZnVqaXRzdS0+YnJpZ2h0bmVzc19jaGFuZ2VkKTsKLQotCQlpZiAob2xkYiA9PSBuZXdiICYmIGZ1aml0c3UtPmJyaWdodG5lc3NfY2hhbmdlZCkgewotCQkJa2V5Y29kZSA9IDA7Ci0JCQlpZiAoZGlzYWJsZV9icmlnaHRuZXNzX2tleXMgIT0gMSkgewotCQkJCWlmIChvbGRiID09IDApIHsKLQkJCQkJYWNwaV9idXNfZ2VuZXJhdGVfcHJvY19ldmVudAotCQkJCQkgICAgKGZ1aml0c3UtPmRldiwKLQkJCQkJICAgICBBQ1BJX1ZJREVPX05PVElGWV9ERUNfQlJJR0hUTkVTUywKLQkJCQkJICAgICAwKTsKLQkJCQkJa2V5Y29kZSA9IEtFWV9CUklHSFRORVNTRE9XTjsKLQkJCQl9IGVsc2UgaWYgKG9sZGIgPT0KLQkJCQkJICAgKGZ1aml0c3UtPm1heF9icmlnaHRuZXNzKSAtIDEpIHsKLQkJCQkJYWNwaV9idXNfZ2VuZXJhdGVfcHJvY19ldmVudAotCQkJCQkgICAgKGZ1aml0c3UtPmRldiwKLQkJCQkJICAgICBBQ1BJX1ZJREVPX05PVElGWV9JTkNfQlJJR0hUTkVTUywKLQkJCQkJICAgICAwKTsKLQkJCQkJa2V5Y29kZSA9IEtFWV9CUklHSFRORVNTVVA7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgaWYgKG9sZGIgPCBuZXdiKSB7Ci0JCQlpZiAoZGlzYWJsZV9icmlnaHRuZXNzX2FkanVzdCAhPSAxKSB7Ci0JCQkJaWYgKHVzZV9hbHRfbGNkX2xldmVscykKLQkJCQkJc2V0X2xjZF9sZXZlbF9hbHQobmV3Yik7Ci0JCQkJZWxzZQotCQkJCQlzZXRfbGNkX2xldmVsKG5ld2IpOwotCQkJfQotCQkJaWYgKGRpc2FibGVfYnJpZ2h0bmVzc19rZXlzICE9IDEpIHsKLQkJCQlhY3BpX2J1c19nZW5lcmF0ZV9wcm9jX2V2ZW50KGZ1aml0c3UtPmRldiwKLQkJCQkJQUNQSV9WSURFT19OT1RJRllfSU5DX0JSSUdIVE5FU1MsIDApOwotCQkJCWtleWNvZGUgPSBLRVlfQlJJR0hUTkVTU1VQOwotCQkJfQotCQl9IGVsc2UgaWYgKG9sZGIgPiBuZXdiKSB7Ci0JCQlpZiAoZGlzYWJsZV9icmlnaHRuZXNzX2FkanVzdCAhPSAxKSB7Ci0JCQkJaWYgKHVzZV9hbHRfbGNkX2xldmVscykKLQkJCQkJc2V0X2xjZF9sZXZlbF9hbHQobmV3Yik7Ci0JCQkJZWxzZQotCQkJCQlzZXRfbGNkX2xldmVsKG5ld2IpOwotCQkJfQotCQkJaWYgKGRpc2FibGVfYnJpZ2h0bmVzc19rZXlzICE9IDEpIHsKLQkJCQlhY3BpX2J1c19nZW5lcmF0ZV9wcm9jX2V2ZW50KGZ1aml0c3UtPmRldiwKLQkJCQkJQUNQSV9WSURFT19OT1RJRllfREVDX0JSSUdIVE5FU1MsIDApOwotCQkJCWtleWNvZGUgPSBLRVlfQlJJR0hUTkVTU0RPV047Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlrZXljb2RlID0gS0VZX1VOS05PV047Ci0JCX0KLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJa2V5Y29kZSA9IEtFWV9VTktOT1dOOwotCQl2ZGJnX3ByaW50ayhGVUpMQVBUT1BfREJHX1dBUk4sCi0JCQkgICAgInVuc3VwcG9ydGVkIGV2ZW50IFsweCV4XVxuIiwgZXZlbnQpOwotCQlicmVhazsKLQl9Ci0KLQlpZiAoa2V5Y29kZSAhPSAwKSB7Ci0JCWlucHV0X3JlcG9ydF9rZXkoaW5wdXQsIGtleWNvZGUsIDEpOwotCQlpbnB1dF9zeW5jKGlucHV0KTsKLQkJaW5wdXRfcmVwb3J0X2tleShpbnB1dCwga2V5Y29kZSwgMCk7Ci0JCWlucHV0X3N5bmMoaW5wdXQpOwotCX0KLQotCXJldHVybjsKLX0KLQotLyogQUNQSSBkZXZpY2UgZm9yIGhvdGtleSBoYW5kbGluZyAqLwotCi1zdGF0aWMgaW50IGFjcGlfZnVqaXRzdV9ob3RrZXlfYWRkKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKQotewotCWFjcGlfc3RhdHVzIHN0YXR1czsKLQlhY3BpX2hhbmRsZSBoYW5kbGU7Ci0JaW50IHJlc3VsdCA9IDA7Ci0JaW50IHN0YXRlID0gMDsKLQlzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dDsKLQlpbnQgZXJyb3I7Ci0JaW50IGk7Ci0KLQlpZiAoIWRldmljZSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlmdWppdHN1X2hvdGtleS0+YWNwaV9oYW5kbGUgPSBkZXZpY2UtPmhhbmRsZTsKLQlzcHJpbnRmKGFjcGlfZGV2aWNlX25hbWUoZGV2aWNlKSwgIiVzIiwKLQkJQUNQSV9GVUpJVFNVX0hPVEtFWV9ERVZJQ0VfTkFNRSk7Ci0Jc3ByaW50ZihhY3BpX2RldmljZV9jbGFzcyhkZXZpY2UpLCAiJXMiLCBBQ1BJX0ZVSklUU1VfQ0xBU1MpOwotCWRldmljZS0+ZHJpdmVyX2RhdGEgPSBmdWppdHN1X2hvdGtleTsKLQotCXN0YXR1cyA9IGFjcGlfaW5zdGFsbF9ub3RpZnlfaGFuZGxlcihkZXZpY2UtPmhhbmRsZSwKLQkJCQkJICAgICBBQ1BJX0RFVklDRV9OT1RJRlksCi0JCQkJCSAgICAgYWNwaV9mdWppdHN1X2hvdGtleV9ub3RpZnksCi0JCQkJCSAgICAgZnVqaXRzdV9ob3RrZXkpOwotCi0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiRXJyb3IgaW5zdGFsbGluZyBub3RpZnkgaGFuZGxlclxuIik7Ci0JCWVycm9yID0gLUVOT0RFVjsKLQkJZ290byBlcnJfc3RvcDsKLQl9Ci0KLQkvKiBrZmlmbyAqLwotCXNwaW5fbG9ja19pbml0KCZmdWppdHN1X2hvdGtleS0+Zmlmb19sb2NrKTsKLQlmdWppdHN1X2hvdGtleS0+ZmlmbyA9Ci0JICAgIGtmaWZvX2FsbG9jKFJJTkdCVUZGRVJTSVpFICogc2l6ZW9mKGludCksIEdGUF9LRVJORUwsCi0JCQkmZnVqaXRzdV9ob3RrZXktPmZpZm9fbG9jayk7Ci0JaWYgKElTX0VSUihmdWppdHN1X2hvdGtleS0+ZmlmbykpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJrZmlmb19hbGxvYyBmYWlsZWRcbiIpOwotCQllcnJvciA9IFBUUl9FUlIoZnVqaXRzdV9ob3RrZXktPmZpZm8pOwotCQlnb3RvIGVycl9zdG9wOwotCX0KLQotCWZ1aml0c3VfaG90a2V5LT5pbnB1dCA9IGlucHV0ID0gaW5wdXRfYWxsb2NhdGVfZGV2aWNlKCk7Ci0JaWYgKCFpbnB1dCkgewotCQllcnJvciA9IC1FTk9NRU07Ci0JCWdvdG8gZXJyX3VuaW5zdGFsbF9ub3RpZnk7Ci0JfQotCi0Jc25wcmludGYoZnVqaXRzdV9ob3RrZXktPnBoeXMsIHNpemVvZihmdWppdHN1X2hvdGtleS0+cGh5cyksCi0JCSAiJXMvdmlkZW8vaW5wdXQwIiwgYWNwaV9kZXZpY2VfaGlkKGRldmljZSkpOwotCi0JaW5wdXQtPm5hbWUgPSBhY3BpX2RldmljZV9uYW1lKGRldmljZSk7Ci0JaW5wdXQtPnBoeXMgPSBmdWppdHN1X2hvdGtleS0+cGh5czsKLQlpbnB1dC0+aWQuYnVzdHlwZSA9IEJVU19IT1NUOwotCWlucHV0LT5pZC5wcm9kdWN0ID0gMHgwNjsKLQlpbnB1dC0+ZGV2LnBhcmVudCA9ICZkZXZpY2UtPmRldjsKLQlpbnB1dC0+ZXZiaXRbMF0gPSBCSVQoRVZfS0VZKTsKLQlzZXRfYml0KGZ1aml0c3UtPmtleWNvZGUxLCBpbnB1dC0+a2V5Yml0KTsKLQlzZXRfYml0KGZ1aml0c3UtPmtleWNvZGUyLCBpbnB1dC0+a2V5Yml0KTsKLQlzZXRfYml0KGZ1aml0c3UtPmtleWNvZGUzLCBpbnB1dC0+a2V5Yml0KTsKLQlzZXRfYml0KGZ1aml0c3UtPmtleWNvZGU0LCBpbnB1dC0+a2V5Yml0KTsKLQlzZXRfYml0KEtFWV9VTktOT1dOLCBpbnB1dC0+a2V5Yml0KTsKLQotCWVycm9yID0gaW5wdXRfcmVnaXN0ZXJfZGV2aWNlKGlucHV0KTsKLQlpZiAoZXJyb3IpCi0JCWdvdG8gZXJyX2ZyZWVfaW5wdXRfZGV2OwotCi0JcmVzdWx0ID0gYWNwaV9idXNfZ2V0X3Bvd2VyKGZ1aml0c3VfaG90a2V5LT5hY3BpX2hhbmRsZSwgJnN0YXRlKTsKLQlpZiAocmVzdWx0KSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiRXJyb3IgcmVhZGluZyBwb3dlciBzdGF0ZVxuIik7Ci0JCWdvdG8gZW5kOwotCX0KLQotCXByaW50ayhLRVJOX0lORk8gUFJFRklYICIlcyBbJXNdICglcylcbiIsCi0JICAgICAgIGFjcGlfZGV2aWNlX25hbWUoZGV2aWNlKSwgYWNwaV9kZXZpY2VfYmlkKGRldmljZSksCi0JICAgICAgICFkZXZpY2UtPnBvd2VyLnN0YXRlID8gIm9uIiA6ICJvZmYiKTsKLQotCWZ1aml0c3VfaG90a2V5LT5kZXYgPSBkZXZpY2U7Ci0KLQlpZiAoQUNQSV9TVUNDRVNTCi0JICAgIChhY3BpX2dldF9oYW5kbGUoZGV2aWNlLT5oYW5kbGUsIE1FVEhPRF9OQU1FX19JTkksICZoYW5kbGUpKSkgewotCQl2ZGJnX3ByaW50ayhGVUpMQVBUT1BfREJHX0lORk8sICJJbnZva2luZyBfSU5JXG4iKTsKLQkJaWYgKEFDUElfRkFJTFVSRQotCQkgICAgKGFjcGlfZXZhbHVhdGVfb2JqZWN0Ci0JCSAgICAgKGRldmljZS0+aGFuZGxlLCBNRVRIT0RfTkFNRV9fSU5JLCBOVUxMLCBOVUxMKSkpCi0JCQlwcmludGsoS0VSTl9FUlIgIl9JTkkgTWV0aG9kIGZhaWxlZFxuIik7Ci0JfQotCi0JaSA9IDA7CQkJLyogRGlzY2FyZCBob3RrZXkgcmluZ2J1ZmZlciAqLwotCXdoaWxlIChnZXRfaXJiKCkgIT0gMCAmJiAoaSsrKSA8IE1BWF9IT1RLRVlfUklOR0JVRkZFUl9TSVpFKSA7Ci0JdmRiZ19wcmludGsoRlVKTEFQVE9QX0RCR19JTkZPLCAiRGlzY2FyZGVkICVpIHJpbmdidWZmZXIgZW50cmllc1xuIiwgaSk7Ci0KLQlyZXR1cm4gcmVzdWx0OwotCi1lbmQ6Ci1lcnJfZnJlZV9pbnB1dF9kZXY6Ci0JaW5wdXRfZnJlZV9kZXZpY2UoaW5wdXQpOwotZXJyX3VuaW5zdGFsbF9ub3RpZnk6Ci0JYWNwaV9yZW1vdmVfbm90aWZ5X2hhbmRsZXIoZGV2aWNlLT5oYW5kbGUsIEFDUElfREVWSUNFX05PVElGWSwKLQkJCQkgICBhY3BpX2Z1aml0c3VfaG90a2V5X25vdGlmeSk7Ci0Ja2ZpZm9fZnJlZShmdWppdHN1X2hvdGtleS0+Zmlmbyk7Ci1lcnJfc3RvcDoKLQotCXJldHVybiByZXN1bHQ7Ci19Ci0KLXN0YXRpYyBpbnQgYWNwaV9mdWppdHN1X2hvdGtleV9yZW1vdmUoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UsIGludCB0eXBlKQotewotCWFjcGlfc3RhdHVzIHN0YXR1czsKLQlzdHJ1Y3QgZnVqaXRzdV9ob3RrZXlfdCAqZnVqaXRzdV9ob3RrZXkgPSBOVUxMOwotCi0JaWYgKCFkZXZpY2UgfHwgIWFjcGlfZHJpdmVyX2RhdGEoZGV2aWNlKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlmdWppdHN1X2hvdGtleSA9IGFjcGlfZHJpdmVyX2RhdGEoZGV2aWNlKTsKLQotCXN0YXR1cyA9IGFjcGlfcmVtb3ZlX25vdGlmeV9oYW5kbGVyKGZ1aml0c3VfaG90a2V5LT5hY3BpX2hhbmRsZSwKLQkJCQkJICAgIEFDUElfREVWSUNFX05PVElGWSwKLQkJCQkJICAgIGFjcGlfZnVqaXRzdV9ob3RrZXlfbm90aWZ5KTsKLQotCWZ1aml0c3VfaG90a2V5LT5hY3BpX2hhbmRsZSA9IE5VTEw7Ci0KLQlrZmlmb19mcmVlKGZ1aml0c3VfaG90a2V5LT5maWZvKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBhY3BpX2Z1aml0c3VfaG90a2V5X25vdGlmeShhY3BpX2hhbmRsZSBoYW5kbGUsIHUzMiBldmVudCwKLQkJCQkgICAgICAgdm9pZCAqZGF0YSkKLXsKLQlzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dDsKLQlpbnQga2V5Y29kZSwga2V5Y29kZV9yOwotCXVuc2lnbmVkIGludCBpcmIgPSAxOwotCWludCBpLCBzdGF0dXM7Ci0KLQlpbnB1dCA9IGZ1aml0c3VfaG90a2V5LT5pbnB1dDsKLQotCXZkYmdfcHJpbnRrKEZVSkxBUFRPUF9EQkdfVFJBQ0UsICJIb3RrZXkgZXZlbnRcbiIpOwotCi0Jc3dpdGNoIChldmVudCkgewotCWNhc2UgQUNQSV9GVUpJVFNVX05PVElGWV9DT0RFMToKLQkJaSA9IDA7Ci0JCXdoaWxlICgoaXJiID0gZ2V0X2lyYigpKSAhPSAwCi0JCSAgICAgICAmJiAoaSsrKSA8IE1BWF9IT1RLRVlfUklOR0JVRkZFUl9TSVpFKSB7Ci0JCQl2ZGJnX3ByaW50ayhGVUpMQVBUT1BfREJHX1RSQUNFLCAiR0lSQiByZXN1bHQgWyV4XVxuIiwKLQkJCQkgICAgaXJiKTsKLQotCQkJc3dpdGNoIChpcmIgJiAweDRmZikgewotCQkJY2FzZSBLRVkxX0NPREU6Ci0JCQkJa2V5Y29kZSA9IGZ1aml0c3UtPmtleWNvZGUxOwotCQkJCWJyZWFrOwotCQkJY2FzZSBLRVkyX0NPREU6Ci0JCQkJa2V5Y29kZSA9IGZ1aml0c3UtPmtleWNvZGUyOwotCQkJCWJyZWFrOwotCQkJY2FzZSBLRVkzX0NPREU6Ci0JCQkJa2V5Y29kZSA9IGZ1aml0c3UtPmtleWNvZGUzOwotCQkJCWJyZWFrOwotCQkJY2FzZSBLRVk0X0NPREU6Ci0JCQkJa2V5Y29kZSA9IGZ1aml0c3UtPmtleWNvZGU0OwotCQkJCWJyZWFrOwotCQkJY2FzZSAwOgotCQkJCWtleWNvZGUgPSAwOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQl2ZGJnX3ByaW50ayhGVUpMQVBUT1BfREJHX1dBUk4sCi0JCQkJCSAgICAiVW5rbm93biBHSVJCIHJlc3VsdCBbJXhdXG4iLCBpcmIpOwotCQkJCWtleWNvZGUgPSAtMTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWlmIChrZXljb2RlID4gMCkgewotCQkJCXZkYmdfcHJpbnRrKEZVSkxBUFRPUF9EQkdfVFJBQ0UsCi0JCQkJCSJQdXNoIGtleWNvZGUgaW50byByaW5nYnVmZmVyIFslZF1cbiIsCi0JCQkJCWtleWNvZGUpOwotCQkJCXN0YXR1cyA9IGtmaWZvX3B1dChmdWppdHN1X2hvdGtleS0+ZmlmbywKLQkJCQkJCSAgICh1bnNpZ25lZCBjaGFyICopJmtleWNvZGUsCi0JCQkJCQkgICBzaXplb2Yoa2V5Y29kZSkpOwotCQkJCWlmIChzdGF0dXMgIT0gc2l6ZW9mKGtleWNvZGUpKSB7Ci0JCQkJCXZkYmdfcHJpbnRrKEZVSkxBUFRPUF9EQkdfV0FSTiwKLQkJCQkJICAgICJDb3VsZCBub3QgcHVzaCBrZXljb2RlIFsweCV4XVxuIiwKLQkJCQkJICAgIGtleWNvZGUpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWlucHV0X3JlcG9ydF9rZXkoaW5wdXQsIGtleWNvZGUsIDEpOwotCQkJCQlpbnB1dF9zeW5jKGlucHV0KTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKGtleWNvZGUgPT0gMCkgewotCQkJCXdoaWxlICgoc3RhdHVzID0KLQkJCQkJa2ZpZm9fZ2V0Ci0JCQkJCShmdWppdHN1X2hvdGtleS0+ZmlmbywgKHVuc2lnbmVkIGNoYXIgKikKLQkJCQkJICZrZXljb2RlX3IsCi0JCQkJCSBzaXplb2YKLQkJCQkJIChrZXljb2RlX3IpKSkgPT0gc2l6ZW9mKGtleWNvZGVfcikpIHsKLQkJCQkJaW5wdXRfcmVwb3J0X2tleShpbnB1dCwga2V5Y29kZV9yLCAwKTsKLQkJCQkJaW5wdXRfc3luYyhpbnB1dCk7Ci0JCQkJCXZkYmdfcHJpbnRrKEZVSkxBUFRPUF9EQkdfVFJBQ0UsCi0JCQkJCSAgIlBvcCBrZXljb2RlIGZyb20gcmluZ2J1ZmZlciBbJWRdXG4iLAotCQkJCQkgIGtleWNvZGVfcik7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJa2V5Y29kZSA9IEtFWV9VTktOT1dOOwotCQl2ZGJnX3ByaW50ayhGVUpMQVBUT1BfREJHX1dBUk4sCi0JCQkgICAgIlVuc3VwcG9ydGVkIGV2ZW50IFsweCV4XVxuIiwgZXZlbnQpOwotCQlpbnB1dF9yZXBvcnRfa2V5KGlucHV0LCBrZXljb2RlLCAxKTsKLQkJaW5wdXRfc3luYyhpbnB1dCk7Ci0JCWlucHV0X3JlcG9ydF9rZXkoaW5wdXQsIGtleWNvZGUsIDApOwotCQlpbnB1dF9zeW5jKGlucHV0KTsKLQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuOwotfQotCi0vKiBJbml0aWFsaXphdGlvbiAqLwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGFjcGlfZGV2aWNlX2lkIGZ1aml0c3VfZGV2aWNlX2lkc1tdID0gewotCXtBQ1BJX0ZVSklUU1VfSElELCAwfSwKLQl7IiIsIDB9LAotfTsKLQotc3RhdGljIHN0cnVjdCBhY3BpX2RyaXZlciBhY3BpX2Z1aml0c3VfZHJpdmVyID0gewotCS5uYW1lID0gQUNQSV9GVUpJVFNVX0RSSVZFUl9OQU1FLAotCS5jbGFzcyA9IEFDUElfRlVKSVRTVV9DTEFTUywKLQkuaWRzID0gZnVqaXRzdV9kZXZpY2VfaWRzLAotCS5vcHMgPSB7Ci0JCS5hZGQgPSBhY3BpX2Z1aml0c3VfYWRkLAotCQkucmVtb3ZlID0gYWNwaV9mdWppdHN1X3JlbW92ZSwKLQkJfSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYWNwaV9kZXZpY2VfaWQgZnVqaXRzdV9ob3RrZXlfZGV2aWNlX2lkc1tdID0gewotCXtBQ1BJX0ZVSklUU1VfSE9US0VZX0hJRCwgMH0sCi0JeyIiLCAwfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYWNwaV9kcml2ZXIgYWNwaV9mdWppdHN1X2hvdGtleV9kcml2ZXIgPSB7Ci0JLm5hbWUgPSBBQ1BJX0ZVSklUU1VfSE9US0VZX0RSSVZFUl9OQU1FLAotCS5jbGFzcyA9IEFDUElfRlVKSVRTVV9DTEFTUywKLQkuaWRzID0gZnVqaXRzdV9ob3RrZXlfZGV2aWNlX2lkcywKLQkub3BzID0gewotCQkuYWRkID0gYWNwaV9mdWppdHN1X2hvdGtleV9hZGQsCi0JCS5yZW1vdmUgPSBhY3BpX2Z1aml0c3VfaG90a2V5X3JlbW92ZSwKLQkJfSwKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IGZ1aml0c3VfaW5pdCh2b2lkKQotewotCWludCByZXQsIHJlc3VsdCwgbWF4X2JyaWdodG5lc3M7Ci0KLQlpZiAoYWNwaV9kaXNhYmxlZCkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQlmdWppdHN1ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGZ1aml0c3VfdCksIEdGUF9LRVJORUwpOwotCWlmICghZnVqaXRzdSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0JbWVtc2V0KGZ1aml0c3UsIDAsIHNpemVvZihzdHJ1Y3QgZnVqaXRzdV90KSk7Ci0JZnVqaXRzdS0+a2V5Y29kZTEgPSBLRVlfUFJPRzE7Ci0JZnVqaXRzdS0+a2V5Y29kZTIgPSBLRVlfUFJPRzI7Ci0JZnVqaXRzdS0+a2V5Y29kZTMgPSBLRVlfUFJPRzM7Ci0JZnVqaXRzdS0+a2V5Y29kZTQgPSBLRVlfUFJPRzQ7Ci0JZG1pX2NoZWNrX3N5c3RlbShmdWppdHN1X2RtaV90YWJsZSk7Ci0KLQlyZXN1bHQgPSBhY3BpX2J1c19yZWdpc3Rlcl9kcml2ZXIoJmFjcGlfZnVqaXRzdV9kcml2ZXIpOwotCWlmIChyZXN1bHQgPCAwKSB7Ci0JCXJldCA9IC1FTk9ERVY7Ci0JCWdvdG8gZmFpbF9hY3BpOwotCX0KLQotCS8qIFJlZ2lzdGVyIHBsYXRmb3JtIHN0dWZmICovCi0KLQlmdWppdHN1LT5wZl9kZXZpY2UgPSBwbGF0Zm9ybV9kZXZpY2VfYWxsb2MoImZ1aml0c3UtbGFwdG9wIiwgLTEpOwotCWlmICghZnVqaXRzdS0+cGZfZGV2aWNlKSB7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gZmFpbF9wbGF0Zm9ybV9kcml2ZXI7Ci0JfQotCi0JcmV0ID0gcGxhdGZvcm1fZGV2aWNlX2FkZChmdWppdHN1LT5wZl9kZXZpY2UpOwotCWlmIChyZXQpCi0JCWdvdG8gZmFpbF9wbGF0Zm9ybV9kZXZpY2UxOwotCi0JcmV0ID0KLQkgICAgc3lzZnNfY3JlYXRlX2dyb3VwKCZmdWppdHN1LT5wZl9kZXZpY2UtPmRldi5rb2JqLAotCQkJICAgICAgICZmdWppdHN1cGZfYXR0cmlidXRlX2dyb3VwKTsKLQlpZiAocmV0KQotCQlnb3RvIGZhaWxfcGxhdGZvcm1fZGV2aWNlMjsKLQotCS8qIFJlZ2lzdGVyIGJhY2tsaWdodCBzdHVmZiAqLwotCi0JaWYgKCFhY3BpX3ZpZGVvX2JhY2tsaWdodF9zdXBwb3J0KCkpIHsKLQkJZnVqaXRzdS0+YmxfZGV2aWNlID0KLQkJCWJhY2tsaWdodF9kZXZpY2VfcmVnaXN0ZXIoImZ1aml0c3UtbGFwdG9wIiwgTlVMTCwgTlVMTCwKLQkJCQkJCSAgJmZ1aml0c3VibF9vcHMpOwotCQlpZiAoSVNfRVJSKGZ1aml0c3UtPmJsX2RldmljZSkpCi0JCQlyZXR1cm4gUFRSX0VSUihmdWppdHN1LT5ibF9kZXZpY2UpOwotCQltYXhfYnJpZ2h0bmVzcyA9IGZ1aml0c3UtPm1heF9icmlnaHRuZXNzOwotCQlmdWppdHN1LT5ibF9kZXZpY2UtPnByb3BzLm1heF9icmlnaHRuZXNzID0gbWF4X2JyaWdodG5lc3MgLSAxOwotCQlmdWppdHN1LT5ibF9kZXZpY2UtPnByb3BzLmJyaWdodG5lc3MgPSBmdWppdHN1LT5icmlnaHRuZXNzX2xldmVsOwotCX0KLQotCXJldCA9IHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmZnVqaXRzdXBmX2RyaXZlcik7Ci0JaWYgKHJldCkKLQkJZ290byBmYWlsX2JhY2tsaWdodDsKLQotCS8qIFJlZ2lzdGVyIGhvdGtleSBkcml2ZXIgKi8KLQotCWZ1aml0c3VfaG90a2V5ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGZ1aml0c3VfaG90a2V5X3QpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWZ1aml0c3VfaG90a2V5KSB7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gZmFpbF9ob3RrZXk7Ci0JfQotCW1lbXNldChmdWppdHN1X2hvdGtleSwgMCwgc2l6ZW9mKHN0cnVjdCBmdWppdHN1X2hvdGtleV90KSk7Ci0KLQlyZXN1bHQgPSBhY3BpX2J1c19yZWdpc3Rlcl9kcml2ZXIoJmFjcGlfZnVqaXRzdV9ob3RrZXlfZHJpdmVyKTsKLQlpZiAocmVzdWx0IDwgMCkgewotCQlyZXQgPSAtRU5PREVWOwotCQlnb3RvIGZhaWxfaG90a2V5MTsKLQl9Ci0KLQlwcmludGsoS0VSTl9JTkZPICJmdWppdHN1LWxhcHRvcDogZHJpdmVyICIgRlVKSVRTVV9EUklWRVJfVkVSU0lPTgotCSAgICAgICAiIHN1Y2Nlc3NmdWxseSBsb2FkZWQuXG4iKTsKLQotCXJldHVybiAwOwotCi1mYWlsX2hvdGtleTE6Ci0KLQlrZnJlZShmdWppdHN1X2hvdGtleSk7Ci0KLWZhaWxfaG90a2V5OgotCi0JcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmZ1aml0c3VwZl9kcml2ZXIpOwotCi1mYWlsX2JhY2tsaWdodDoKLQotCWlmIChmdWppdHN1LT5ibF9kZXZpY2UpCi0JCWJhY2tsaWdodF9kZXZpY2VfdW5yZWdpc3RlcihmdWppdHN1LT5ibF9kZXZpY2UpOwotCi1mYWlsX3BsYXRmb3JtX2RldmljZTI6Ci0KLQlwbGF0Zm9ybV9kZXZpY2VfZGVsKGZ1aml0c3UtPnBmX2RldmljZSk7Ci0KLWZhaWxfcGxhdGZvcm1fZGV2aWNlMToKLQotCXBsYXRmb3JtX2RldmljZV9wdXQoZnVqaXRzdS0+cGZfZGV2aWNlKTsKLQotZmFpbF9wbGF0Zm9ybV9kcml2ZXI6Ci0KLQlhY3BpX2J1c191bnJlZ2lzdGVyX2RyaXZlcigmYWNwaV9mdWppdHN1X2RyaXZlcik7Ci0KLWZhaWxfYWNwaToKLQotCWtmcmVlKGZ1aml0c3UpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IGZ1aml0c3VfY2xlYW51cCh2b2lkKQotewotCXN5c2ZzX3JlbW92ZV9ncm91cCgmZnVqaXRzdS0+cGZfZGV2aWNlLT5kZXYua29iaiwKLQkJCSAgICZmdWppdHN1cGZfYXR0cmlidXRlX2dyb3VwKTsKLQlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlcihmdWppdHN1LT5wZl9kZXZpY2UpOwotCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZmdWppdHN1cGZfZHJpdmVyKTsKLQlpZiAoZnVqaXRzdS0+YmxfZGV2aWNlKQotCQliYWNrbGlnaHRfZGV2aWNlX3VucmVnaXN0ZXIoZnVqaXRzdS0+YmxfZGV2aWNlKTsKLQotCWFjcGlfYnVzX3VucmVnaXN0ZXJfZHJpdmVyKCZhY3BpX2Z1aml0c3VfZHJpdmVyKTsKLQotCWtmcmVlKGZ1aml0c3UpOwotCi0JYWNwaV9idXNfdW5yZWdpc3Rlcl9kcml2ZXIoJmFjcGlfZnVqaXRzdV9ob3RrZXlfZHJpdmVyKTsKLQotCWtmcmVlKGZ1aml0c3VfaG90a2V5KTsKLQotCXByaW50ayhLRVJOX0lORk8gImZ1aml0c3UtbGFwdG9wOiBkcml2ZXIgdW5sb2FkZWQuXG4iKTsKLX0KLQotbW9kdWxlX2luaXQoZnVqaXRzdV9pbml0KTsKLW1vZHVsZV9leGl0KGZ1aml0c3VfY2xlYW51cCk7Ci0KLW1vZHVsZV9wYXJhbSh1c2VfYWx0X2xjZF9sZXZlbHMsIHVpbnQsIDA2NDQpOwotTU9EVUxFX1BBUk1fREVTQyh1c2VfYWx0X2xjZF9sZXZlbHMsCi0JCSAiVXNlIGFsdGVybmF0aXZlIGludGVyZmFjZSBmb3IgbGNkX2xldmVscyAobmVlZGVkIGZvciBMaWZlYm9vayBzNjQxMCkuIik7Ci1tb2R1bGVfcGFyYW0oZGlzYWJsZV9icmlnaHRuZXNzX2tleXMsIHVpbnQsIDA2NDQpOwotTU9EVUxFX1BBUk1fREVTQyhkaXNhYmxlX2JyaWdodG5lc3Nfa2V5cywKLQkJICJEaXNhYmxlIGJyaWdodG5lc3Mga2V5cyAoZWcuIGlmIHRoZXkgYXJlIGFscmVhZHkgaGFuZGxlZCBieSB0aGUgZ2VuZXJpYyBBQ1BJX1ZJREVPIGRldmljZSkuIik7Ci1tb2R1bGVfcGFyYW0oZGlzYWJsZV9icmlnaHRuZXNzX2FkanVzdCwgdWludCwgMDY0NCk7Ci1NT0RVTEVfUEFSTV9ERVNDKGRpc2FibGVfYnJpZ2h0bmVzc19hZGp1c3QsICJEaXNhYmxlIGJyaWdodG5lc3MgYWRqdXN0bWVudCAuIik7Ci0jaWZkZWYgQ09ORklHX0ZVSklUU1VfTEFQVE9QX0RFQlVHCi1tb2R1bGVfcGFyYW1fbmFtZWQoZGVidWcsIGRiZ19sZXZlbCwgdWludCwgMDY0NCk7Ci1NT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAiU2V0cyBkZWJ1ZyBsZXZlbCBiaXQtbWFzayIpOwotI2VuZGlmCi0KLU1PRFVMRV9BVVRIT1IoIkpvbmF0aGFuIFdvaXRoZSwgUGV0ZXIgR3J1YmVyIik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIkZ1aml0c3UgbGFwdG9wIGV4dHJhcyBzdXBwb3J0Iik7Ci1NT0RVTEVfVkVSU0lPTihGVUpJVFNVX0RSSVZFUl9WRVJTSU9OKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLQotTU9EVUxFX0FMSUFTKCJkbWk6Kjpzdm5GVUpJVFNVU0lFTUVOUzoqOnB2cjpydm5GVUpJVFNVOnJuRkpOQjFEMzoqOmN2clM2NDEwOioiKTsKLU1PRFVMRV9BTElBUygiZG1pOio6c3ZuRlVKSVRTVToqOnB2cjpydm5GVUpJVFNVOnJuRkpOQjE5QzoqOmN2clM3MDIwOioiKTsKLQotc3RhdGljIHN0cnVjdCBwbnBfZGV2aWNlX2lkIHBucF9pZHNbXSA9IHsKLQl7LmlkID0gIkZVSjAyYmYifSwKLQl7LmlkID0gIkZVSjAyQjEifSwKLQl7LmlkID0gIkZVSjAyRTMifSwKLQl7LmlkID0gIiJ9Ci19OwotCi1NT0RVTEVfREVWSUNFX1RBQkxFKHBucCwgcG5wX2lkcyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvaHAtd21pLmMgYi9kcml2ZXJzL21pc2MvaHAtd21pLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiN2MyNGMuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9taXNjL2hwLXdtaS5jCisrKyAvZGV2L251bGwKQEAgLTEsNTEyICswLDAgQEAKLS8qCi0gKiBIUCBXTUkgaG90a2V5cwotICoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBSZWQgSGF0IDxtamdAcmVkaGF0LmNvbT4KLSAqCi0gKiBQb3J0aW9ucyBiYXNlZCBvbiB3aXN0cm9uX2J0bnMuYzoKLSAqIENvcHlyaWdodCAoQykgMjAwNSBNaWxvc2xhdiBUcm1hYyA8bWl0ckB2b2xueS5jej4KLSAqIENvcHlyaWdodCAoQykgMjAwNSBCZXJuaGFyZCBSb3NlbmtyYWVuemVyIDxiZXJvQGFya2xpbnV4Lm9yZz4KLSAqIENvcHlyaWdodCAoQykgMjAwNSBEbWl0cnkgVG9yb2tob3YgPGR0b3JAbWFpbC5ydT4KLSAqCi0gKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKLSAqLwotCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KLSNpbmNsdWRlIDxhY3BpL2FjcGlfZHJpdmVycy5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KLSNpbmNsdWRlIDxsaW51eC9yZmtpbGwuaD4KLSNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KLQotTU9EVUxFX0FVVEhPUigiTWF0dGhldyBHYXJyZXR0IDxtamc1OUBzcmNmLnVjYW0ub3JnPiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJIUCBsYXB0b3AgV01JIGhvdGtleXMgZHJpdmVyIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7Ci0KLU1PRFVMRV9BTElBUygid21pOjk1RjI0Mjc5LTREN0ItNDMzNC05Mzg3LUFDQ0RDNjdFRjYxQyIpOwotTU9EVUxFX0FMSUFTKCJ3bWk6NUZCN0YwMzQtMkM2My00NWU5LUJFOTEtM0Q0NEUyQzcwN0U0Iik7Ci0KLSNkZWZpbmUgSFBXTUlfRVZFTlRfR1VJRCAiOTVGMjQyNzktNEQ3Qi00MzM0LTkzODctQUNDREM2N0VGNjFDIgotI2RlZmluZSBIUFdNSV9CSU9TX0dVSUQgIjVGQjdGMDM0LTJDNjMtNDVlOS1CRTkxLTNENDRFMkM3MDdFNCIKLQotI2RlZmluZSBIUFdNSV9ESVNQTEFZX1FVRVJZIDB4MQotI2RlZmluZSBIUFdNSV9IRERURU1QX1FVRVJZIDB4MgotI2RlZmluZSBIUFdNSV9BTFNfUVVFUlkgMHgzCi0jZGVmaW5lIEhQV01JX0RPQ0tfUVVFUlkgMHg0Ci0jZGVmaW5lIEhQV01JX1dJUkVMRVNTX1FVRVJZIDB4NQotI2RlZmluZSBIUFdNSV9IT1RLRVlfUVVFUlkgMHhjCi0KLXN0YXRpYyBpbnQgX19pbml0IGhwX3dtaV9iaW9zX3NldHVwKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldmljZSk7Ci1zdGF0aWMgaW50IF9fZXhpdCBocF93bWlfYmlvc19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2aWNlKTsKLQotc3RydWN0IGJpb3NfYXJncyB7Ci0JdTMyIHNpZ25hdHVyZTsKLQl1MzIgY29tbWFuZDsKLQl1MzIgY29tbWFuZHR5cGU7Ci0JdTMyIGRhdGFzaXplOwotCXUzMiBkYXRhOwotfTsKLQotc3RydWN0IGJpb3NfcmV0dXJuIHsKLQl1MzIgc2lncGFzczsKLQl1MzIgcmV0dXJuX2NvZGU7Ci0JdTMyIHZhbHVlOwotfTsKLQotc3RydWN0IGtleV9lbnRyeSB7Ci0JY2hhciB0eXBlOwkJLyogU2VlIEtFXyogYmVsb3cgKi8KLQl1MTYgY29kZTsKLQl1MTYga2V5Y29kZTsKLX07Ci0KLWVudW0geyBLRV9LRVksIEtFX1NXLCBLRV9FTkQgfTsKLQotc3RhdGljIHN0cnVjdCBrZXlfZW50cnkgaHBfd21pX2tleW1hcFtdID0gewotCXtLRV9TVywgMHgwMSwgU1dfRE9DS30sCi0Je0tFX0tFWSwgMHgwMiwgS0VZX0JSSUdIVE5FU1NVUH0sCi0Je0tFX0tFWSwgMHgwMywgS0VZX0JSSUdIVE5FU1NET1dOfSwKLQl7S0VfS0VZLCAweDIwZTYsIEtFWV9QUk9HMX0sCi0Je0tFX0tFWSwgMHgyMTQyLCBLRVlfTUVESUF9LAotCXtLRV9LRVksIDB4MjEzYiwgS0VZX0lORk99LAotCXtLRV9LRVksIDB4MjMxYiwgS0VZX0hFTFB9LAotCXtLRV9FTkQsIDB9Ci19OwotCi1zdGF0aWMgc3RydWN0IGlucHV0X2RldiAqaHBfd21pX2lucHV0X2RldjsKLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpocF93bWlfcGxhdGZvcm1fZGV2OwotCi1zdGF0aWMgc3RydWN0IHJma2lsbCAqd2lmaV9yZmtpbGw7Ci1zdGF0aWMgc3RydWN0IHJma2lsbCAqYmx1ZXRvb3RoX3Jma2lsbDsKLXN0YXRpYyBzdHJ1Y3QgcmZraWxsICp3d2FuX3Jma2lsbDsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgaHBfd21pX2RyaXZlciA9IHsKLQkuZHJpdmVyID0gewotCQkgICAubmFtZSA9ICJocC13bWkiLAotCQkgICAub3duZXIgPSBUSElTX01PRFVMRSwKLQl9LAotCS5wcm9iZSA9IGhwX3dtaV9iaW9zX3NldHVwLAotCS5yZW1vdmUgPSBocF93bWlfYmlvc19yZW1vdmUsCi19OwotCi1zdGF0aWMgaW50IGhwX3dtaV9wZXJmb3JtX3F1ZXJ5KGludCBxdWVyeSwgaW50IHdyaXRlLCBpbnQgdmFsdWUpCi17Ci0Jc3RydWN0IGJpb3NfcmV0dXJuIGJpb3NfcmV0dXJuOwotCWFjcGlfc3RhdHVzIHN0YXR1czsKLQl1bmlvbiBhY3BpX29iamVjdCAqb2JqOwotCXN0cnVjdCBiaW9zX2FyZ3MgYXJncyA9IHsKLQkJLnNpZ25hdHVyZSA9IDB4NTU0MzQ1NTMsCi0JCS5jb21tYW5kID0gd3JpdGUgPyAweDIgOiAweDEsCi0JCS5jb21tYW5kdHlwZSA9IHF1ZXJ5LAotCQkuZGF0YXNpemUgPSB3cml0ZSA/IDB4NCA6IDAsCi0JCS5kYXRhID0gdmFsdWUsCi0JfTsKLQlzdHJ1Y3QgYWNwaV9idWZmZXIgaW5wdXQgPSB7IHNpemVvZihzdHJ1Y3QgYmlvc19hcmdzKSwgJmFyZ3MgfTsKLQlzdHJ1Y3QgYWNwaV9idWZmZXIgb3V0cHV0ID0geyBBQ1BJX0FMTE9DQVRFX0JVRkZFUiwgTlVMTCB9OwotCi0Jc3RhdHVzID0gd21pX2V2YWx1YXRlX21ldGhvZChIUFdNSV9CSU9TX0dVSUQsIDAsIDB4MywgJmlucHV0LCAmb3V0cHV0KTsKLQotCW9iaiA9IG91dHB1dC5wb2ludGVyOwotCi0JaWYgKCFvYmogfHwgb2JqLT50eXBlICE9IEFDUElfVFlQRV9CVUZGRVIpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JYmlvc19yZXR1cm4gPSAqKChzdHJ1Y3QgYmlvc19yZXR1cm4gKilvYmotPmJ1ZmZlci5wb2ludGVyKTsKLQlpZiAoYmlvc19yZXR1cm4ucmV0dXJuX2NvZGUgPiAwKQotCQlyZXR1cm4gYmlvc19yZXR1cm4ucmV0dXJuX2NvZGUgKiAtMTsKLQllbHNlCi0JCXJldHVybiBiaW9zX3JldHVybi52YWx1ZTsKLX0KLQotc3RhdGljIGludCBocF93bWlfZGlzcGxheV9zdGF0ZSh2b2lkKQotewotCXJldHVybiBocF93bWlfcGVyZm9ybV9xdWVyeShIUFdNSV9ESVNQTEFZX1FVRVJZLCAwLCAwKTsKLX0KLQotc3RhdGljIGludCBocF93bWlfaGRkdGVtcF9zdGF0ZSh2b2lkKQotewotCXJldHVybiBocF93bWlfcGVyZm9ybV9xdWVyeShIUFdNSV9IRERURU1QX1FVRVJZLCAwLCAwKTsKLX0KLQotc3RhdGljIGludCBocF93bWlfYWxzX3N0YXRlKHZvaWQpCi17Ci0JcmV0dXJuIGhwX3dtaV9wZXJmb3JtX3F1ZXJ5KEhQV01JX0FMU19RVUVSWSwgMCwgMCk7Ci19Ci0KLXN0YXRpYyBpbnQgaHBfd21pX2RvY2tfc3RhdGUodm9pZCkKLXsKLQlyZXR1cm4gaHBfd21pX3BlcmZvcm1fcXVlcnkoSFBXTUlfRE9DS19RVUVSWSwgMCwgMCk7Ci19Ci0KLXN0YXRpYyBpbnQgaHBfd21pX3dpZmlfc2V0KHZvaWQgKmRhdGEsIGVudW0gcmZraWxsX3N0YXRlIHN0YXRlKQotewotCWlmIChzdGF0ZSkKLQkJcmV0dXJuIGhwX3dtaV9wZXJmb3JtX3F1ZXJ5KEhQV01JX1dJUkVMRVNTX1FVRVJZLCAxLCAweDEwMSk7Ci0JZWxzZQotCQlyZXR1cm4gaHBfd21pX3BlcmZvcm1fcXVlcnkoSFBXTUlfV0lSRUxFU1NfUVVFUlksIDEsIDB4MTAwKTsKLX0KLQotc3RhdGljIGludCBocF93bWlfYmx1ZXRvb3RoX3NldCh2b2lkICpkYXRhLCBlbnVtIHJma2lsbF9zdGF0ZSBzdGF0ZSkKLXsKLQlpZiAoc3RhdGUpCi0JCXJldHVybiBocF93bWlfcGVyZm9ybV9xdWVyeShIUFdNSV9XSVJFTEVTU19RVUVSWSwgMSwgMHgyMDIpOwotCWVsc2UKLQkJcmV0dXJuIGhwX3dtaV9wZXJmb3JtX3F1ZXJ5KEhQV01JX1dJUkVMRVNTX1FVRVJZLCAxLCAweDIwMCk7Ci19Ci0KLXN0YXRpYyBpbnQgaHBfd21pX3d3YW5fc2V0KHZvaWQgKmRhdGEsIGVudW0gcmZraWxsX3N0YXRlIHN0YXRlKQotewotCWlmIChzdGF0ZSkKLQkJcmV0dXJuIGhwX3dtaV9wZXJmb3JtX3F1ZXJ5KEhQV01JX1dJUkVMRVNTX1FVRVJZLCAxLCAweDQwNCk7Ci0JZWxzZQotCQlyZXR1cm4gaHBfd21pX3BlcmZvcm1fcXVlcnkoSFBXTUlfV0lSRUxFU1NfUVVFUlksIDEsIDB4NDAwKTsKLX0KLQotc3RhdGljIGludCBocF93bWlfd2lmaV9zdGF0ZSh2b2lkKQotewotCWludCB3aXJlbGVzcyA9IGhwX3dtaV9wZXJmb3JtX3F1ZXJ5KEhQV01JX1dJUkVMRVNTX1FVRVJZLCAwLCAwKTsKLQotCWlmICh3aXJlbGVzcyAmIDB4MTAwKQotCQlyZXR1cm4gUkZLSUxMX1NUQVRFX1VOQkxPQ0tFRDsKLQllbHNlCi0JCXJldHVybiBSRktJTExfU1RBVEVfU09GVF9CTE9DS0VEOwotfQotCi1zdGF0aWMgaW50IGhwX3dtaV9ibHVldG9vdGhfc3RhdGUodm9pZCkKLXsKLQlpbnQgd2lyZWxlc3MgPSBocF93bWlfcGVyZm9ybV9xdWVyeShIUFdNSV9XSVJFTEVTU19RVUVSWSwgMCwgMCk7Ci0KLQlpZiAod2lyZWxlc3MgJiAweDEwMDAwKQotCQlyZXR1cm4gUkZLSUxMX1NUQVRFX1VOQkxPQ0tFRDsKLQllbHNlCi0JCXJldHVybiBSRktJTExfU1RBVEVfU09GVF9CTE9DS0VEOwotfQotCi1zdGF0aWMgaW50IGhwX3dtaV93d2FuX3N0YXRlKHZvaWQpCi17Ci0JaW50IHdpcmVsZXNzID0gaHBfd21pX3BlcmZvcm1fcXVlcnkoSFBXTUlfV0lSRUxFU1NfUVVFUlksIDAsIDApOwotCi0JaWYgKHdpcmVsZXNzICYgMHgxMDAwMDAwKQotCQlyZXR1cm4gUkZLSUxMX1NUQVRFX1VOQkxPQ0tFRDsKLQllbHNlCi0JCXJldHVybiBSRktJTExfU1RBVEVfU09GVF9CTE9DS0VEOwotfQotCi1zdGF0aWMgc3NpemVfdCBzaG93X2Rpc3BsYXkoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCSAgICBjaGFyICpidWYpCi17Ci0JaW50IHZhbHVlID0gaHBfd21pX2Rpc3BsYXlfc3RhdGUoKTsKLQlpZiAodmFsdWUgPCAwKQotCQlyZXR1cm4gLUVJTlZBTDsKLQlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgdmFsdWUpOwotfQotCi1zdGF0aWMgc3NpemVfdCBzaG93X2hkZHRlbXAoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCSAgICBjaGFyICpidWYpCi17Ci0JaW50IHZhbHVlID0gaHBfd21pX2hkZHRlbXBfc3RhdGUoKTsKLQlpZiAodmFsdWUgPCAwKQotCQlyZXR1cm4gLUVJTlZBTDsKLQlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgdmFsdWUpOwotfQotCi1zdGF0aWMgc3NpemVfdCBzaG93X2FscyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQkJY2hhciAqYnVmKQotewotCWludCB2YWx1ZSA9IGhwX3dtaV9hbHNfc3RhdGUoKTsKLQlpZiAodmFsdWUgPCAwKQotCQlyZXR1cm4gLUVJTlZBTDsKLQlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgdmFsdWUpOwotfQotCi1zdGF0aWMgc3NpemVfdCBzaG93X2RvY2soc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCSBjaGFyICpidWYpCi17Ci0JaW50IHZhbHVlID0gaHBfd21pX2RvY2tfc3RhdGUoKTsKLQlpZiAodmFsdWUgPCAwKQotCQlyZXR1cm4gLUVJTlZBTDsKLQlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgdmFsdWUpOwotfQotCi1zdGF0aWMgc3NpemVfdCBzZXRfYWxzKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCSAgICAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKLXsKLQl1MzIgdG1wID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCk7Ci0JaHBfd21pX3BlcmZvcm1fcXVlcnkoSFBXTUlfQUxTX1FVRVJZLCAxLCB0bXApOwotCXJldHVybiBjb3VudDsKLX0KLQotc3RhdGljIERFVklDRV9BVFRSKGRpc3BsYXksIFNfSVJVR08sIHNob3dfZGlzcGxheSwgTlVMTCk7Ci1zdGF0aWMgREVWSUNFX0FUVFIoaGRkdGVtcCwgU19JUlVHTywgc2hvd19oZGR0ZW1wLCBOVUxMKTsKLXN0YXRpYyBERVZJQ0VfQVRUUihhbHMsIFNfSVJVR08gfCBTX0lXVVNSLCBzaG93X2Fscywgc2V0X2Fscyk7Ci1zdGF0aWMgREVWSUNFX0FUVFIoZG9jaywgU19JUlVHTywgc2hvd19kb2NrLCBOVUxMKTsKLQotc3RhdGljIHN0cnVjdCBrZXlfZW50cnkgKmhwX3dtaV9nZXRfZW50cnlfYnlfc2NhbmNvZGUoaW50IGNvZGUpCi17Ci0Jc3RydWN0IGtleV9lbnRyeSAqa2V5OwotCi0JZm9yIChrZXkgPSBocF93bWlfa2V5bWFwOyBrZXktPnR5cGUgIT0gS0VfRU5EOyBrZXkrKykKLQkJaWYgKGNvZGUgPT0ga2V5LT5jb2RlKQotCQkJcmV0dXJuIGtleTsKLQotCXJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgc3RydWN0IGtleV9lbnRyeSAqaHBfd21pX2dldF9lbnRyeV9ieV9rZXljb2RlKGludCBrZXljb2RlKQotewotCXN0cnVjdCBrZXlfZW50cnkgKmtleTsKLQotCWZvciAoa2V5ID0gaHBfd21pX2tleW1hcDsga2V5LT50eXBlICE9IEtFX0VORDsga2V5KyspCi0JCWlmIChrZXktPnR5cGUgPT0gS0VfS0VZICYmIGtleWNvZGUgPT0ga2V5LT5rZXljb2RlKQotCQkJcmV0dXJuIGtleTsKLQotCXJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgaW50IGhwX3dtaV9nZXRrZXljb2RlKHN0cnVjdCBpbnB1dF9kZXYgKmRldiwgaW50IHNjYW5jb2RlLCBpbnQgKmtleWNvZGUpCi17Ci0Jc3RydWN0IGtleV9lbnRyeSAqa2V5ID0gaHBfd21pX2dldF9lbnRyeV9ieV9zY2FuY29kZShzY2FuY29kZSk7Ci0KLQlpZiAoa2V5ICYmIGtleS0+dHlwZSA9PSBLRV9LRVkpIHsKLQkJKmtleWNvZGUgPSBrZXktPmtleWNvZGU7Ci0JCXJldHVybiAwOwotCX0KLQotCXJldHVybiAtRUlOVkFMOwotfQotCi1zdGF0aWMgaW50IGhwX3dtaV9zZXRrZXljb2RlKHN0cnVjdCBpbnB1dF9kZXYgKmRldiwgaW50IHNjYW5jb2RlLCBpbnQga2V5Y29kZSkKLXsKLQlzdHJ1Y3Qga2V5X2VudHJ5ICprZXk7Ci0JaW50IG9sZF9rZXljb2RlOwotCi0JaWYgKGtleWNvZGUgPCAwIHx8IGtleWNvZGUgPiBLRVlfTUFYKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWtleSA9IGhwX3dtaV9nZXRfZW50cnlfYnlfc2NhbmNvZGUoc2NhbmNvZGUpOwotCWlmIChrZXkgJiYga2V5LT50eXBlID09IEtFX0tFWSkgewotCQlvbGRfa2V5Y29kZSA9IGtleS0+a2V5Y29kZTsKLQkJa2V5LT5rZXljb2RlID0ga2V5Y29kZTsKLQkJc2V0X2JpdChrZXljb2RlLCBkZXYtPmtleWJpdCk7Ci0JCWlmICghaHBfd21pX2dldF9lbnRyeV9ieV9rZXljb2RlKG9sZF9rZXljb2RlKSkKLQkJCWNsZWFyX2JpdChvbGRfa2V5Y29kZSwgZGV2LT5rZXliaXQpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlyZXR1cm4gLUVJTlZBTDsKLX0KLQotc3RhdGljIHZvaWQgaHBfd21pX25vdGlmeSh1MzIgdmFsdWUsIHZvaWQgKmNvbnRleHQpCi17Ci0Jc3RydWN0IGFjcGlfYnVmZmVyIHJlc3BvbnNlID0geyBBQ1BJX0FMTE9DQVRFX0JVRkZFUiwgTlVMTCB9OwotCXN0YXRpYyBzdHJ1Y3Qga2V5X2VudHJ5ICprZXk7Ci0JdW5pb24gYWNwaV9vYmplY3QgKm9iajsKLQotCXdtaV9nZXRfZXZlbnRfZGF0YSh2YWx1ZSwgJnJlc3BvbnNlKTsKLQotCW9iaiA9ICh1bmlvbiBhY3BpX29iamVjdCAqKXJlc3BvbnNlLnBvaW50ZXI7Ci0KLQlpZiAob2JqICYmIG9iai0+dHlwZSA9PSBBQ1BJX1RZUEVfQlVGRkVSICYmIG9iai0+YnVmZmVyLmxlbmd0aCA9PSA4KSB7Ci0JCWludCBldmVudGNvZGUgPSAqKCh1OCAqKSBvYmotPmJ1ZmZlci5wb2ludGVyKTsKLQkJaWYgKGV2ZW50Y29kZSA9PSAweDQpCi0JCQlldmVudGNvZGUgPSBocF93bWlfcGVyZm9ybV9xdWVyeShIUFdNSV9IT1RLRVlfUVVFUlksIDAsCi0JCQkJCQkJIDApOwotCQlrZXkgPSBocF93bWlfZ2V0X2VudHJ5X2J5X3NjYW5jb2RlKGV2ZW50Y29kZSk7Ci0JCWlmIChrZXkpIHsKLQkJCXN3aXRjaCAoa2V5LT50eXBlKSB7Ci0JCQljYXNlIEtFX0tFWToKLQkJCQlpbnB1dF9yZXBvcnRfa2V5KGhwX3dtaV9pbnB1dF9kZXYsCi0JCQkJCQkga2V5LT5rZXljb2RlLCAxKTsKLQkJCQlpbnB1dF9zeW5jKGhwX3dtaV9pbnB1dF9kZXYpOwotCQkJCWlucHV0X3JlcG9ydF9rZXkoaHBfd21pX2lucHV0X2RldiwKLQkJCQkJCSBrZXktPmtleWNvZGUsIDApOwotCQkJCWlucHV0X3N5bmMoaHBfd21pX2lucHV0X2Rldik7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEtFX1NXOgotCQkJCWlucHV0X3JlcG9ydF9zd2l0Y2goaHBfd21pX2lucHV0X2RldiwKLQkJCQkJCSAgICBrZXktPmtleWNvZGUsCi0JCQkJCQkgICAgaHBfd21pX2RvY2tfc3RhdGUoKSk7Ci0JCQkJaW5wdXRfc3luYyhocF93bWlfaW5wdXRfZGV2KTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfSBlbHNlIGlmIChldmVudGNvZGUgPT0gMHg1KSB7Ci0JCQlpZiAod2lmaV9yZmtpbGwpCi0JCQkJcmZraWxsX2ZvcmNlX3N0YXRlKHdpZmlfcmZraWxsLAotCQkJCQkJICAgaHBfd21pX3dpZmlfc3RhdGUoKSk7Ci0JCQlpZiAoYmx1ZXRvb3RoX3Jma2lsbCkKLQkJCQlyZmtpbGxfZm9yY2Vfc3RhdGUoYmx1ZXRvb3RoX3Jma2lsbCwKLQkJCQkJCSAgIGhwX3dtaV9ibHVldG9vdGhfc3RhdGUoKSk7Ci0JCQlpZiAod3dhbl9yZmtpbGwpCi0JCQkJcmZraWxsX2ZvcmNlX3N0YXRlKHd3YW5fcmZraWxsLAotCQkJCQkJICAgaHBfd21pX3d3YW5fc3RhdGUoKSk7Ci0JCX0gZWxzZQotCQkJcHJpbnRrKEtFUk5fSU5GTyAiSFAgV01JOiBVbmtub3duIGtleSBwcmVzc2VkIC0gJXhcbiIsCi0JCQkgICAgICAgZXZlbnRjb2RlKTsKLQl9IGVsc2UKLQkJcHJpbnRrKEtFUk5fSU5GTyAiSFAgV01JOiBVbmtub3duIHJlc3BvbnNlIHJlY2VpdmVkXG4iKTsKLX0KLQotc3RhdGljIGludCBfX2luaXQgaHBfd21pX2lucHV0X3NldHVwKHZvaWQpCi17Ci0Jc3RydWN0IGtleV9lbnRyeSAqa2V5OwotCWludCBlcnI7Ci0KLQlocF93bWlfaW5wdXRfZGV2ID0gaW5wdXRfYWxsb2NhdGVfZGV2aWNlKCk7Ci0KLQlocF93bWlfaW5wdXRfZGV2LT5uYW1lID0gIkhQIFdNSSBob3RrZXlzIjsKLQlocF93bWlfaW5wdXRfZGV2LT5waHlzID0gIndtaS9pbnB1dDAiOwotCWhwX3dtaV9pbnB1dF9kZXYtPmlkLmJ1c3R5cGUgPSBCVVNfSE9TVDsKLQlocF93bWlfaW5wdXRfZGV2LT5nZXRrZXljb2RlID0gaHBfd21pX2dldGtleWNvZGU7Ci0JaHBfd21pX2lucHV0X2Rldi0+c2V0a2V5Y29kZSA9IGhwX3dtaV9zZXRrZXljb2RlOwotCi0JZm9yIChrZXkgPSBocF93bWlfa2V5bWFwOyBrZXktPnR5cGUgIT0gS0VfRU5EOyBrZXkrKykgewotCQlzd2l0Y2ggKGtleS0+dHlwZSkgewotCQljYXNlIEtFX0tFWToKLQkJCXNldF9iaXQoRVZfS0VZLCBocF93bWlfaW5wdXRfZGV2LT5ldmJpdCk7Ci0JCQlzZXRfYml0KGtleS0+a2V5Y29kZSwgaHBfd21pX2lucHV0X2Rldi0+a2V5Yml0KTsKLQkJCWJyZWFrOwotCQljYXNlIEtFX1NXOgotCQkJc2V0X2JpdChFVl9TVywgaHBfd21pX2lucHV0X2Rldi0+ZXZiaXQpOwotCQkJc2V0X2JpdChrZXktPmtleWNvZGUsIGhwX3dtaV9pbnB1dF9kZXYtPnN3Yml0KTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JZXJyID0gaW5wdXRfcmVnaXN0ZXJfZGV2aWNlKGhwX3dtaV9pbnB1dF9kZXYpOwotCi0JaWYgKGVycikgewotCQlpbnB1dF9mcmVlX2RldmljZShocF93bWlfaW5wdXRfZGV2KTsKLQkJcmV0dXJuIGVycjsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgY2xlYW51cF9zeXNmcyhzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXZpY2UpCi17Ci0JZGV2aWNlX3JlbW92ZV9maWxlKCZkZXZpY2UtPmRldiwgJmRldl9hdHRyX2Rpc3BsYXkpOwotCWRldmljZV9yZW1vdmVfZmlsZSgmZGV2aWNlLT5kZXYsICZkZXZfYXR0cl9oZGR0ZW1wKTsKLQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJmRldmljZS0+ZGV2LCAmZGV2X2F0dHJfYWxzKTsKLQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJmRldmljZS0+ZGV2LCAmZGV2X2F0dHJfZG9jayk7Ci19Ci0KLXN0YXRpYyBpbnQgX19pbml0IGhwX3dtaV9iaW9zX3NldHVwKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldmljZSkKLXsKLQlpbnQgZXJyOwotCWludCB3aXJlbGVzcyA9IGhwX3dtaV9wZXJmb3JtX3F1ZXJ5KEhQV01JX1dJUkVMRVNTX1FVRVJZLCAwLCAwKTsKLQotCWVyciA9IGRldmljZV9jcmVhdGVfZmlsZSgmZGV2aWNlLT5kZXYsICZkZXZfYXR0cl9kaXNwbGF5KTsKLQlpZiAoZXJyKQotCQlnb3RvIGFkZF9zeXNmc19lcnJvcjsKLQllcnIgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJmRldmljZS0+ZGV2LCAmZGV2X2F0dHJfaGRkdGVtcCk7Ci0JaWYgKGVycikKLQkJZ290byBhZGRfc3lzZnNfZXJyb3I7Ci0JZXJyID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZkZXZpY2UtPmRldiwgJmRldl9hdHRyX2Fscyk7Ci0JaWYgKGVycikKLQkJZ290byBhZGRfc3lzZnNfZXJyb3I7Ci0JZXJyID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZkZXZpY2UtPmRldiwgJmRldl9hdHRyX2RvY2spOwotCWlmIChlcnIpCi0JCWdvdG8gYWRkX3N5c2ZzX2Vycm9yOwotCi0JaWYgKHdpcmVsZXNzICYgMHgxKSB7Ci0JCXdpZmlfcmZraWxsID0gcmZraWxsX2FsbG9jYXRlKCZkZXZpY2UtPmRldiwgUkZLSUxMX1RZUEVfV0xBTik7Ci0JCXdpZmlfcmZraWxsLT5uYW1lID0gImhwLXdpZmkiOwotCQl3aWZpX3Jma2lsbC0+c3RhdGUgPSBocF93bWlfd2lmaV9zdGF0ZSgpOwotCQl3aWZpX3Jma2lsbC0+dG9nZ2xlX3JhZGlvID0gaHBfd21pX3dpZmlfc2V0OwotCQl3aWZpX3Jma2lsbC0+dXNlcl9jbGFpbV91bnN1cHBvcnRlZCA9IDE7Ci0JCXJma2lsbF9yZWdpc3Rlcih3aWZpX3Jma2lsbCk7Ci0JfQotCi0JaWYgKHdpcmVsZXNzICYgMHgyKSB7Ci0JCWJsdWV0b290aF9yZmtpbGwgPSByZmtpbGxfYWxsb2NhdGUoJmRldmljZS0+ZGV2LAotCQkJCQkJICAgUkZLSUxMX1RZUEVfQkxVRVRPT1RIKTsKLQkJYmx1ZXRvb3RoX3Jma2lsbC0+bmFtZSA9ICJocC1ibHVldG9vdGgiOwotCQlibHVldG9vdGhfcmZraWxsLT5zdGF0ZSA9IGhwX3dtaV9ibHVldG9vdGhfc3RhdGUoKTsKLQkJYmx1ZXRvb3RoX3Jma2lsbC0+dG9nZ2xlX3JhZGlvID0gaHBfd21pX2JsdWV0b290aF9zZXQ7Ci0JCWJsdWV0b290aF9yZmtpbGwtPnVzZXJfY2xhaW1fdW5zdXBwb3J0ZWQgPSAxOwotCQlyZmtpbGxfcmVnaXN0ZXIoYmx1ZXRvb3RoX3Jma2lsbCk7Ci0JfQotCi0JaWYgKHdpcmVsZXNzICYgMHg0KSB7Ci0JCXd3YW5fcmZraWxsID0gcmZraWxsX2FsbG9jYXRlKCZkZXZpY2UtPmRldiwgUkZLSUxMX1RZUEVfV1dBTik7Ci0JCXd3YW5fcmZraWxsLT5uYW1lID0gImhwLXd3YW4iOwotCQl3d2FuX3Jma2lsbC0+c3RhdGUgPSBocF93bWlfd3dhbl9zdGF0ZSgpOwotCQl3d2FuX3Jma2lsbC0+dG9nZ2xlX3JhZGlvID0gaHBfd21pX3d3YW5fc2V0OwotCQl3d2FuX3Jma2lsbC0+dXNlcl9jbGFpbV91bnN1cHBvcnRlZCA9IDE7Ci0JCXJma2lsbF9yZWdpc3Rlcih3d2FuX3Jma2lsbCk7Ci0JfQotCi0JcmV0dXJuIDA7Ci1hZGRfc3lzZnNfZXJyb3I6Ci0JY2xlYW51cF9zeXNmcyhkZXZpY2UpOwotCXJldHVybiBlcnI7Ci19Ci0KLXN0YXRpYyBpbnQgX19leGl0IGhwX3dtaV9iaW9zX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXZpY2UpCi17Ci0JY2xlYW51cF9zeXNmcyhkZXZpY2UpOwotCi0JaWYgKHdpZmlfcmZraWxsKQotCQlyZmtpbGxfdW5yZWdpc3Rlcih3aWZpX3Jma2lsbCk7Ci0JaWYgKGJsdWV0b290aF9yZmtpbGwpCi0JCXJma2lsbF91bnJlZ2lzdGVyKGJsdWV0b290aF9yZmtpbGwpOwotCWlmICh3d2FuX3Jma2lsbCkKLQkJcmZraWxsX3VucmVnaXN0ZXIod3dhbl9yZmtpbGwpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgX19pbml0IGhwX3dtaV9pbml0KHZvaWQpCi17Ci0JaW50IGVycjsKLQotCWlmICh3bWlfaGFzX2d1aWQoSFBXTUlfRVZFTlRfR1VJRCkpIHsKLQkJZXJyID0gd21pX2luc3RhbGxfbm90aWZ5X2hhbmRsZXIoSFBXTUlfRVZFTlRfR1VJRCwKLQkJCQkJCSBocF93bWlfbm90aWZ5LCBOVUxMKTsKLQkJaWYgKCFlcnIpCi0JCQlocF93bWlfaW5wdXRfc2V0dXAoKTsKLQl9Ci0KLQlpZiAod21pX2hhc19ndWlkKEhQV01JX0JJT1NfR1VJRCkpIHsKLQkJZXJyID0gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZocF93bWlfZHJpdmVyKTsKLQkJaWYgKGVycikKLQkJCXJldHVybiAwOwotCQlocF93bWlfcGxhdGZvcm1fZGV2ID0gcGxhdGZvcm1fZGV2aWNlX2FsbG9jKCJocC13bWkiLCAtMSk7Ci0JCWlmICghaHBfd21pX3BsYXRmb3JtX2RldikgewotCQkJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmhwX3dtaV9kcml2ZXIpOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJcGxhdGZvcm1fZGV2aWNlX2FkZChocF93bWlfcGxhdGZvcm1fZGV2KTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IGhwX3dtaV9leGl0KHZvaWQpCi17Ci0JaWYgKHdtaV9oYXNfZ3VpZChIUFdNSV9FVkVOVF9HVUlEKSkgewotCQl3bWlfcmVtb3ZlX25vdGlmeV9oYW5kbGVyKEhQV01JX0VWRU5UX0dVSUQpOwotCQlpbnB1dF91bnJlZ2lzdGVyX2RldmljZShocF93bWlfaW5wdXRfZGV2KTsKLQl9Ci0JaWYgKGhwX3dtaV9wbGF0Zm9ybV9kZXYpIHsKLQkJcGxhdGZvcm1fZGV2aWNlX2RlbChocF93bWlfcGxhdGZvcm1fZGV2KTsKLQkJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmhwX3dtaV9kcml2ZXIpOwotCX0KLX0KLQotbW9kdWxlX2luaXQoaHBfd21pX2luaXQpOwotbW9kdWxlX2V4aXQoaHBfd21pX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL2libWFzbS9ldmVudC5jIGIvZHJpdmVycy9taXNjL2libWFzbS9ldmVudC5jCmluZGV4IGZkYTZhNGQuLjY4YTBhNWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9pYm1hc20vZXZlbnQuYworKysgYi9kcml2ZXJzL21pc2MvaWJtYXNtL2V2ZW50LmMKQEAgLTUwLDcgKzUwLDcgQEAKICAqIFN0b3JlIHRoZSBldmVudCBpbiB0aGUgY2lyY3VsYXIgZXZlbnQgYnVmZmVyLCB3YWtlIHVwIGFueSBzbGVlcGluZwogICogZXZlbnQgcmVhZGVycy4KICAqIFRoZXJlIGlzIG5vIHJlYWRlciBtYXJrZXIgaW4gdGhlIGJ1ZmZlciwgdGhlcmVmb3JlIHJlYWRlcnMgYXJlCi0gKiByZXNwb25zaWJsZSBmb3Iga2VlcGluZyB1cCB3aXRoIHRoZSB3cml0ZXIsIG9yIHRoZXkgd2lsbCBsb29zZSBldmVudHMuCisgKiByZXNwb25zaWJsZSBmb3Iga2VlcGluZyB1cCB3aXRoIHRoZSB3cml0ZXIsIG9yIHRoZXkgd2lsbCBsb3NlIGV2ZW50cy4KICAqLwogdm9pZCBpYm1hc21fcmVjZWl2ZV9ldmVudChzdHJ1Y3Qgc2VydmljZV9wcm9jZXNzb3IgKnNwLCB2b2lkICpkYXRhLCB1bnNpZ25lZCBpbnQgZGF0YV9zaXplKQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL3BhbmFzb25pYy1sYXB0b3AuYyBiL2RyaXZlcnMvbWlzYy9wYW5hc29uaWMtbGFwdG9wLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhMWJjNjQ0Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbWlzYy9wYW5hc29uaWMtbGFwdG9wLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3NjYgKzAsMCBAQAotLyoKLSAqICBQYW5hc29uaWMgSG90S2V5IGFuZCBMQ0QgYnJpZ2h0bmVzcyBjb250cm9sIGRyaXZlcgotICogIChDKSAyMDA0IEhpcm9zaGkgTWl1cmEgPG1pdXJhQGRhLWNoYS5vcmc+Ci0gKiAgKEMpIDIwMDQgTlRUIERBVEEgSW50ZWxsaWxpbmsgQ28uIGh0dHA6Ly93d3cuaW50ZWxsaWxpbmsuY28uanAvCi0gKiAgKEMpIFlPS09UQSBIaXJvc2hpIDx5b2tvdGEgKGF0KSBuZXRsYWIuIGlzLiB0c3VrdWJhLiBhYy4ganA+Ci0gKiAgKEMpIDIwMDQgRGF2aWQgQnJvbmF1Z2ggPGRicm9uYXVnaD4KLSAqICAoQykgMjAwNi0yMDA4IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+Ci0gKgotICogIGRlcml2ZWQgZnJvbSB0b3NoaWJhX2FjcGkuYywgQ29weXJpZ2h0IChDKSAyMDAyLTIwMDQgSm9obiBCZWxtb250ZQotICoKLSAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiAgcHVibGljc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyAgVVNBCi0gKgotICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqCi0gKiBDaGFuZ2VMb2c6Ci0gKglTZXAuMjMsIDIwMDgJSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KLSAqCQktdjAuOTUJcmVuYW1lIGRyaXZlciBmcm9tIGRyaXZlcnMvYWNwaS9wY2NfYWNwaS5jIHRvCi0gKgkJCWRyaXZlcnMvbWlzYy9wYW5hc29uaWMtbGFwdG9wLmMKLSAqCi0gKiAJSnVsLjA0LCAyMDA4CUhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+Ci0gKiAJCS12MC45NAlyZXBsYWNlIC9wcm9jIGludGVyZmFjZSB3aXRoIGRldmljZSBhdHRyaWJ1dGVzCi0gKiAJCQlzdXBwb3J0IHtzZXQsZ2V0fWtleWNvZGUgb24gdGggaW5wdXQgZGV2aWNlCi0gKgotICogICAgICBKdW4uMjcsIDIwMDgJSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KLSAqICAgICAgCS12MC45MgltZXJnZSB3aXRoIDIuNi4yNi1yYzYgaW5wdXQgQVBJIGNoYW5nZXMKLSAqICAgICAgCQlyZW1vdmUgYnJva2VuIDw9IDIuNi4xNSBrZXJuZWwgc3VwcG9ydAotICogICAgICAJCXJlc29sdmUgYWxsIGNvbXBpbGVyIHdhcm5pbmdzCi0gKiAgICAgIAkJdmFyaW91cyBjb2Rpbmcgc3R5bGUgZml4ZXMgKGNoZWNrcGF0Y2gucGwpCi0gKiAgICAgIAkJYWRkIHN1cHBvcnQgZm9yIGJhY2tsaWdodCBhcGkKLSAqICAgICAgCQltYWpvciBjb2RlIHJlc3RydWN0dXJpbmcKLSAqCi0gKiAJRGFjLjI4LCAyMDA3CUhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+Ci0gKiAJCS12MC45MQltZXJnZSB3aXRoIDIuNi4yNC1yYzYgQUNQSSBjaGFuZ2VzCi0gKgotICogCU5vdi4wNCwgMjAwNglIaXJvc2hpIE1pdXJhIDxtaXVyYUBkYS1jaGEub3JnPgotICogCQktdjAuOQlyZW1vdmUgd2FybmluZyBhYm91dCBzZWN0aW9uIHJlZmVyZW5jZS4KLSAqIAkJCXJlbW92ZSBhY3BpX29zX2ZyZWUKLSAqIAkJCWFkZCAvcHJvYy9hY3BpL3BjYy9icmlnaHRuZXNzIGludGVyZmFjZSBmb3IgSEFMIGFjY2VzcwotICogCQkJbWVyZ2UgZGJyb25hdWdoJ3MgZW5oYW5jZW1lbnQKLSAqIAkJCUF1Zy4xNywgMjAwNCBEYXZpZCBCcm9uYXVnaCAoZGJyb25hdWdoKQotICogIAkJCQktIEFkZGVkIHNjcmVlbiBicmlnaHRuZXNzIHNldHRpbmcgaW50ZXJmYWNlCi0gKgkJCQkgIFRoYW5rcyB0byBGcmVlQlNEIGNyZXcgKGFjcGlfcGFuYXNvbmljLmMpCi0gKiAJCQkJICBmb3IgdGhlIGlkZWFzIEkgbmVlZGVkIHRvIGFjY29tcGxpc2ggaXQKLSAqCi0gKglNYXkuMjksIDIwMDYJSGlyb3NoaSBNaXVyYSA8bWl1cmFAZGEtY2hhLm9yZz4KLSAqCQktdjAuOC40IGZvbGxvdyB0byBjaGFuZ2Uga2V5aW5wdXQgc3RydWN0dXJlCi0gKgkJCXRoYW5rcyBGYWJpYW4gWWFtYWd1Y2hpIDxmYWJzQGNzLnR1LWJlcmxpbi5kZT4sCi0gKgkJCUphY29iIEJvd2VyIDxqYWNvYi5ib3dlckBpYy5hYy51az4gYW5kCi0gKgkJCUhpcm9zaGkgWW9rb3RhIGZvciBwcm92aWRpbmcgc29sdXRpb25zLgotICoKLSAqCU9jdC4wMiwgMjAwNAlIaXJvc2hpIE1pdXJhIDxtaXVyYUBkYS1jaGEub3JnPgotICoJCS12MC44LjIJbWVyZ2UgY29kZSBvZiBZT0tPVEEgSGlyb3NoaQotICoJCQkJCTx5b2tvdGFAbmV0bGFiLmlzLnRzdWt1YmEuYWMuanA+LgotICoJCQlBZGQgc3RpY2t5IGtleSBtb2RlIGludGVyZmFjZS4KLSAqCQkJUmVmYWN0b3JpbmcgYWNwaV9wY2NfZ2VuZXJhdGVfa2V5aW5wdXQoKS4KLSAqCi0gKglTZXAuMTUsIDIwMDQJSGlyb3NoaSBNaXVyYSA8bWl1cmFAZGEtY2hhLm9yZz4KLSAqCQktdjAuOAlHZW5lcmF0ZSBrZXkgaW5wdXQgZXZlbnQgb24gaW5wdXQgc3Vic3lzdGVtLgotICoJCQlUaGlzIGlzIGJhc2VkIG9uIHlldCBhbm90aGVyIGRyaXZlciB3cml0dGVuIGJ5Ci0gKgkJCQkJCQlSeXV0YSBOYWthbmlzaGkuCi0gKgotICoJU2VwLjEwLCAyMDA0CUhpcm9zaGkgTWl1cmEgPG1pdXJhQGRhLWNoYS5vcmc+Ci0gKgkJLXYwLjcJQ2hhbmdlIHByb2MgaW50ZXJmYWNlIGZ1bmN0aW9ucyB1c2luZyBzZXFfZmlsZQotICoJCQlmYWNpbGl0eSBhcyBzYW1lIGFzIG90aGVyIEFDUEkgZHJpdmVycy4KLSAqCi0gKglBdWcuMjgsIDIwMDQJSGlyb3NoaSBNaXVyYSA8bWl1cmFAZGEtY2hhLm9yZz4KLSAqCQktdjAuNi40IEZpeCBhIHNpbGx5IGVycm9yIHdpdGggc3RhdHVzIGNoZWNraW5nCi0gKgotICoJQXVnLjI1LCAyMDA0CUhpcm9zaGkgTWl1cmEgPG1pdXJhQGRhLWNoYS5vcmc+Ci0gKgkJLXYwLjYuMyByZXBsYWNlIHJlYWRfYWNwaV9pbnQgYnkgc3RhbmRhcmQgZnVuY3Rpb24KLSAqCQkJCQkJCWFjcGlfZXZhbHVhdGVfaW50ZWdlcgotICoJCQlzb21lIGNsZWFuIHVwIGFuZCBtYWtlIHNtYXJ0IGNvcHlyaWdodCBub3RpY2UuCi0gKgkJCWZpeCByZXR1cm4gdmFsdWUgb2YgcGNjX2FjcGlfZ2V0X2tleSgpCi0gKgkJCWZpeCBjaGVja2luZyByZXR1cm4gdmFsdWUgb2YgYWNwaV9idXNfcmVnaXN0ZXJfZHJpdmVyKCkKLSAqCi0gKiAgICAgIEF1Zy4yMiwgMjAwNCAgICBEYXZpZCBCcm9uYXVnaCA8ZGJyb25hdWdoQGxpbnV4Ym94ZW4ub3JnPgotICogICAgICAgICAgICAgIC12MC42LjIgQWRkIGNoZWNrIG9uIEFDUEkgZGF0YSAobnVtX3NpZnIpCi0gKiAgICAgICAgICAgICAgICAgICAgICBDb2Rpbmcgc3R5bGUgY2xlYW51cHMsIGJldHRlciBlcnJvciBtZXNzYWdlcy9oYW5kbGluZwotICoJCQlGaXhlZCBhbiBvZmYtYnktb25lIGVycm9yIGluIG1lbW9yeSBhbGxvY2F0aW9uCi0gKgotICogICAgICBBdWcuMjEsIDIwMDQgICAgRGF2aWQgQnJvbmF1Z2ggPGRicm9uYXVnaEBsaW51eGJveGVuLm9yZz4KLSAqICAgICAgICAgICAgICAtdjAuNi4xIEZpeCBhIHNpbGx5IGVycm9yIHdpdGggc3RhdHVzIGNoZWNraW5nCi0gKgotICogICAgICBBdWcuMjAsIDIwMDQgICAgRGF2aWQgQnJvbmF1Z2ggPGRicm9uYXVnaEBsaW51eGJveGVuLm9yZz4KLSAqICAgICAgICAgICAgICAtIHYwLjYgIENvcnJlY3QgYnJpZ2h0bmVzcyBjb250cm9scyB0byByZWZsZWN0IHJlYWxpdHkKLSAqICAgICAgICAgICAgICAgICAgICAgIGJhc2VkIG9uIGluZm9ybWF0aW9uIGdsZWFuZWQgYnkgSGlyb3NoaSBNaXVyYQotICogICAgICAgICAgICAgICAgICAgICAgYW5kIGRpc2N1c3Npb25zIHdpdGggSGlyb3NoaSBNaXVyYQotICoKLSAqCUF1Zy4xMCwgMjAwNAlIaXJvc2hpIE1pdXJhIDxtaXVyYUBkYS1jaGEub3JnPgotICoJCS0gdjAuNSAgc3VwcG9ydCBMQ0QgYnJpZ2h0bmVzcyBjb250cm9sCi0gKgkJCWJhc2VkIG9uIHRoZSBkaXNjbG9zZWQgaW5mb3JtYXRpb24gYnkgTUVJLgotICoKLSAqCUp1bC4yNSwgMjAwNAlIaXJvc2hpIE1pdXJhIDxtaXVyYUBkYS1jaGEub3JnPgotICoJCS0gdjAuNCAgZmlyc3QgcG9zdCB2ZXJzaW9uCi0gKgkJICAgICAgICBhZGQgZnVuY3Rpb24gdG8gcmV0cml2ZSBTSUZSCi0gKgotICoJSnVsLjI0LCAyMDA0CUhpcm9zaGkgTWl1cmEgPG1pdXJhQGRhLWNoYS5vcmc+Ci0gKgkJLSB2MC4zICBnZXQgcHJvcGVyIHN0YXR1cyBvZiBob3RrZXkKLSAqCi0gKiAgICAgIEp1bC4yMiwgMjAwNAlIaXJvc2hpIE1pdXJhIDxtaXVyYUBkYS1jaGEub3JnPgotICoJCS0gdjAuMiAgYWRkIEhvdEtleSBoYW5kbGVyCi0gKgotICogICAgICBKdWwuMTcsIDIwMDQJSGlyb3NoaSBNaXVyYSA8bWl1cmFAZGEtY2hhLm9yZz4KLSAqCQktIHYwLjEgIHN0YXJ0IGZyb20gdG9zaGliYV9hY3BpIGRyaXZlciB3cml0dGVuIGJ5IEpvaG4gQmVsbW9udGUKLSAqCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L2JhY2tsaWdodC5oPgotI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+Ci0jaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KLSNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+Ci0jaW5jbHVkZSA8YWNwaS9hY3BpX2J1cy5oPgotI2luY2x1ZGUgPGFjcGkvYWNwaV9kcml2ZXJzLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KLQotCi0jaWZuZGVmIEFDUElfSE9US0VZX0NPTVBPTkVOVAotI2RlZmluZSBBQ1BJX0hPVEtFWV9DT01QT05FTlQJMHgxMDAwMDAwMAotI2VuZGlmCi0KLSNkZWZpbmUgX0NPTVBPTkVOVAkJQUNQSV9IT1RLRVlfQ09NUE9ORU5UCi0KLU1PRFVMRV9BVVRIT1IoIkhpcm9zaGkgTWl1cmEsIERhdmlkIEJyb25hdWdoIGFuZCBIYXJhbGQgV2VsdGUiKTsKLU1PRFVMRV9ERVNDUklQVElPTigiQUNQSSBIb3RLZXkgZHJpdmVyIGZvciBQYW5hc29uaWMgTGV0J3MgTm90ZSBsYXB0b3BzIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7Ci0KLSNkZWZpbmUgTE9HUFJFRklYICJwY2NfYWNwaTogIgotCi0vKiBEZWZpbmUgQUNQSSBQQVRIcyAqLwotLyogTGV0cyBub3RlIGhvdGtleXMgKi8KLSNkZWZpbmUgTUVUSE9EX0hLRVlfUVVFUlkJIkhJTkYiCi0jZGVmaW5lIE1FVEhPRF9IS0VZX1NRVFkJIlNRVFkiCi0jZGVmaW5lIE1FVEhPRF9IS0VZX1NJTkYJIlNJTkYiCi0jZGVmaW5lIE1FVEhPRF9IS0VZX1NTRVQJIlNTRVQiCi0jZGVmaW5lIEhLRVlfTk9USUZZCQkgMHg4MAotCi0jZGVmaW5lIEFDUElfUENDX0RSSVZFUl9OQU1FCSJQYW5hc29uaWMgTGFwdG9wIFN1cHBvcnQiCi0jZGVmaW5lIEFDUElfUENDX0RFVklDRV9OQU1FCSJIb3RrZXkiCi0jZGVmaW5lIEFDUElfUENDX0NMQVNTCQkicGNjIgotCi0jZGVmaW5lIEFDUElfUENDX0lOUFVUX1BIWVMJInBhbmFzb25pYy9oa2V5MCIKLQotLyogTENEX1RZUEVzOiAwID0gTm9ybWFsLCAxID0gU2VtaS10cmFuc3BhcmVudAotICAgRU5WX1NUQVRFczogTm9ybWFsIHRlbXA9MHgwMSwgSGlnaCB0ZW1wPTB4ODEsIE4vQT0weDAwCi0qLwotZW51bSBTSU5GX0JJVFMgeyBTSU5GX05VTV9CQVRURVJJRVMgPSAwLAotCQkgU0lORl9MQ0RfVFlQRSwKLQkJIFNJTkZfQUNfTUFYX0JSSUdIVCwKLQkJIFNJTkZfQUNfTUlOX0JSSUdIVCwKLQkJIFNJTkZfQUNfQ1VSX0JSSUdIVCwKLQkJIFNJTkZfRENfTUFYX0JSSUdIVCwKLQkJIFNJTkZfRENfTUlOX0JSSUdIVCwKLQkJIFNJTkZfRENfQ1VSX0JSSUdIVCwKLQkJIFNJTkZfTVVURSwKLQkJIFNJTkZfUkVTRVJWRUQsCi0JCSBTSU5GX0VOVl9TVEFURSwKLQkJIFNJTkZfU1RJQ0tZX0tFWSA9IDB4ODAsCi0JfTsKLS8qIFIxIGhhbmRsZXMgU0lORl9BQ19DVVJfQlJJR0hUIGFzIFNJTkZfQ1VSX0JSSUdIVCwgZG9lc24ndCBrbm93IEFDIHN0YXRlICovCi0KLXN0YXRpYyBpbnQgYWNwaV9wY2NfaG90a2V5X2FkZChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSk7Ci1zdGF0aWMgaW50IGFjcGlfcGNjX2hvdGtleV9yZW1vdmUoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UsIGludCB0eXBlKTsKLXN0YXRpYyBpbnQgYWNwaV9wY2NfaG90a2V5X3Jlc3VtZShzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSk7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYWNwaV9kZXZpY2VfaWQgcGNjX2RldmljZV9pZHNbXSA9IHsKLQl7ICJNQVQwMDEyIiwgMH0sCi0JeyAiTUFUMDAxMyIsIDB9LAotCXsgIk1BVDAwMTgiLCAwfSwKLQl7ICJNQVQwMDE5IiwgMH0sCi0JeyAiIiwgMH0sCi19OwotCi1zdGF0aWMgc3RydWN0IGFjcGlfZHJpdmVyIGFjcGlfcGNjX2RyaXZlciA9IHsKLQkubmFtZSA9CQlBQ1BJX1BDQ19EUklWRVJfTkFNRSwKLQkuY2xhc3MgPQlBQ1BJX1BDQ19DTEFTUywKLQkuaWRzID0JCXBjY19kZXZpY2VfaWRzLAotCS5vcHMgPQkJewotCQkJCS5hZGQgPQkJYWNwaV9wY2NfaG90a2V5X2FkZCwKLQkJCQkucmVtb3ZlID0JYWNwaV9wY2NfaG90a2V5X3JlbW92ZSwKLQkJCQkucmVzdW1lID0gICAgICAgYWNwaV9wY2NfaG90a2V5X3Jlc3VtZSwKLQkJCX0sCi19OwotCi0jZGVmaW5lIEtFWU1BUF9TSVpFCQkxMQotc3RhdGljIGNvbnN0IGludCBpbml0aWFsX2tleW1hcFtLRVlNQVBfU0laRV0gPSB7Ci0JLyogIDAgKi8gS0VZX1JFU0VSVkVELAotCS8qICAxICovIEtFWV9CUklHSFRORVNTRE9XTiwKLQkvKiAgMiAqLyBLRVlfQlJJR0hUTkVTU1VQLAotCS8qICAzICovIEtFWV9ESVNQTEFZVE9HR0xFLAotCS8qICA0ICovIEtFWV9NVVRFLAotCS8qICA1ICovIEtFWV9WT0xVTUVET1dOLAotCS8qICA2ICovIEtFWV9WT0xVTUVVUCwKLQkvKiAgNyAqLyBLRVlfU0xFRVAsCi0JLyogIDggKi8gS0VZX1BST0cxLCAvKiBDaGFuZ2UgQ1BVIGJvb3N0ICovCi0JLyogIDkgKi8gS0VZX0JBVFRFUlksCi0JLyogMTAgKi8gS0VZX1NVU1BFTkQsCi19OwotCi1zdHJ1Y3QgcGNjX2FjcGkgewotCWFjcGlfaGFuZGxlCQloYW5kbGU7Ci0JdW5zaWduZWQgbG9uZwkJbnVtX3NpZnI7Ci0JaW50CQkJc3RpY2t5X21vZGU7Ci0JdTMyIAkJCSpzaW5mOwotCXN0cnVjdCBhY3BpX2RldmljZQkqZGV2aWNlOwotCXN0cnVjdCBpbnB1dF9kZXYJKmlucHV0X2RldjsKLQlzdHJ1Y3QgYmFja2xpZ2h0X2RldmljZQkqYmFja2xpZ2h0OwotCWludAkJCWtleW1hcFtLRVlNQVBfU0laRV07Ci19OwotCi1zdHJ1Y3QgcGNjX2tleWlucHV0IHsKLQlzdHJ1Y3QgYWNwaV9ob3RrZXkgICAgICAqaG90a2V5OwotfTsKLQotLyogbWV0aG9kIGFjY2VzcyBmdW5jdGlvbnMgKi8KLXN0YXRpYyBpbnQgYWNwaV9wY2Nfd3JpdGVfc3NldChzdHJ1Y3QgcGNjX2FjcGkgKnBjYywgaW50IGZ1bmMsIGludCB2YWwpCi17Ci0JdW5pb24gYWNwaV9vYmplY3QgaW5fb2Jqc1tdID0gewotCQl7IC5pbnRlZ2VyLnR5cGUgID0gQUNQSV9UWVBFX0lOVEVHRVIsCi0JCSAgLmludGVnZXIudmFsdWUgPSBmdW5jLCB9LAotCQl7IC5pbnRlZ2VyLnR5cGUgID0gQUNQSV9UWVBFX0lOVEVHRVIsCi0JCSAgLmludGVnZXIudmFsdWUgPSB2YWwsIH0sCi0JfTsKLQlzdHJ1Y3QgYWNwaV9vYmplY3RfbGlzdCBwYXJhbXMgPSB7Ci0JCS5jb3VudCAgID0gQVJSQVlfU0laRShpbl9vYmpzKSwKLQkJLnBvaW50ZXIgPSBpbl9vYmpzLAotCX07Ci0JYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX3BjY193cml0ZV9zc2V0Iik7Ci0KLQlzdGF0dXMgPSBhY3BpX2V2YWx1YXRlX29iamVjdChwY2MtPmhhbmRsZSwgTUVUSE9EX0hLRVlfU1NFVCwKLQkJCQkgICAgICAmcGFyYW1zLCBOVUxMKTsKLQotCXJldHVybiBzdGF0dXMgPT0gQUVfT0s7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGFjcGlfcGNjX2dldF9zcXR5KHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKQotewotCXVuc2lnbmVkIGxvbmcgbG9uZyBzOwotCWFjcGlfc3RhdHVzIHN0YXR1czsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfcGNjX2dldF9zcXR5Iik7Ci0KLQlzdGF0dXMgPSBhY3BpX2V2YWx1YXRlX2ludGVnZXIoZGV2aWNlLT5oYW5kbGUsIE1FVEhPRF9IS0VZX1NRVFksCi0JCQkJICAgICAgIE5VTEwsICZzKTsKLQlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpCi0JCXJldHVybiBzOwotCWVsc2UgewotCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAotCQkJCSAgImV2YWx1YXRpb24gZXJyb3IgSEtFWS5TUVRZXG4iKSk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLX0KLQotc3RhdGljIGludCBhY3BpX3BjY19yZXRyaWV2ZV9iaW9zZGF0YShzdHJ1Y3QgcGNjX2FjcGkgKnBjYywgdTMyICpzaW5mKQotewotCWFjcGlfc3RhdHVzIHN0YXR1czsKLQlzdHJ1Y3QgYWNwaV9idWZmZXIgYnVmZmVyID0ge0FDUElfQUxMT0NBVEVfQlVGRkVSLCBOVUxMfTsKLQl1bmlvbiBhY3BpX29iamVjdCAqaGtleSA9IE5VTEw7Ci0JaW50IGk7Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX3BjY19yZXRyaWV2ZV9iaW9zZGF0YSIpOwotCi0Jc3RhdHVzID0gYWNwaV9ldmFsdWF0ZV9vYmplY3QocGNjLT5oYW5kbGUsIE1FVEhPRF9IS0VZX1NJTkYsIDAsCi0JCQkJICAgICAgJmJ1ZmZlcik7Ci0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCi0JCQkJICAiZXZhbHVhdGlvbiBlcnJvciBIS0VZLlNJTkZcbiIpKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JaGtleSA9IGJ1ZmZlci5wb2ludGVyOwotCWlmICghaGtleSB8fCAoaGtleS0+dHlwZSAhPSBBQ1BJX1RZUEVfUEFDS0FHRSkpIHsKLQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwgIkludmFsaWQgSEtFWS5TSU5GXG4iKSk7Ci0JCWdvdG8gZW5kOwotCX0KLQotCWlmIChwY2MtPm51bV9zaWZyIDwgaGtleS0+cGFja2FnZS5jb3VudCkgewotCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAotCQkJCSAiU1FUWSByZXBvcnRzIGJhZCBTSU5GIGxlbmd0aFxuIikpOwotCQlzdGF0dXMgPSBBRV9FUlJPUjsKLQkJZ290byBlbmQ7Ci0JfQotCi0JZm9yIChpID0gMDsgaSA8IGhrZXktPnBhY2thZ2UuY291bnQ7IGkrKykgewotCQl1bmlvbiBhY3BpX29iamVjdCAqZWxlbWVudCA9ICYoaGtleS0+cGFja2FnZS5lbGVtZW50c1tpXSk7Ci0JCWlmIChsaWtlbHkoZWxlbWVudC0+dHlwZSA9PSBBQ1BJX1RZUEVfSU5URUdFUikpIHsKLQkJCXNpbmZbaV0gPSBlbGVtZW50LT5pbnRlZ2VyLnZhbHVlOwotCQl9IGVsc2UKLQkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCi0JCQkJCSAiSW52YWxpZCBIS0VZLlNJTkYgZGF0YVxuIikpOwotCX0KLQlzaW5mW2hrZXktPnBhY2thZ2UuY291bnRdID0gLTE7Ci0KLWVuZDoKLQlrZnJlZShidWZmZXIucG9pbnRlcik7Ci0JcmV0dXJuIHN0YXR1cyA9PSBBRV9PSzsKLX0KLQotLyogYmFja2xpZ2h0IEFQSSBpbnRlcmZhY2UgZnVuY3Rpb25zICovCi0KLS8qIFRoaXMgZHJpdmVyIGN1cnJlbnRseSB0cmVhdHMgQUMgYW5kIERDIGJyaWdodG5lc3MgaWRlbnRpY2FsLAotICogc2luY2Ugd2UgZG9uJ3QgbmVlZCB0byBpbnZlbnQgYW4gaW50ZXJmYWNlIHRvIHRoZSBjb3JlIEFDUEkKLSAqIGxvZ2ljIHRvIHJlY2VpdmUgZXZlbnRzIGluIGNhc2UgYSBwb3dlciBzdXBwbHkgaXMgcGx1Z2dlZCBpbgotICogb3IgcmVtb3ZlZCAqLwotCi1zdGF0aWMgaW50IGJsX2dldChzdHJ1Y3QgYmFja2xpZ2h0X2RldmljZSAqYmQpCi17Ci0Jc3RydWN0IHBjY19hY3BpICpwY2MgPSBibF9nZXRfZGF0YShiZCk7Ci0KLQlpZiAoIWFjcGlfcGNjX3JldHJpZXZlX2Jpb3NkYXRhKHBjYywgcGNjLT5zaW5mKSkKLQkJcmV0dXJuIC1FSU87Ci0KLQlyZXR1cm4gcGNjLT5zaW5mW1NJTkZfQUNfQ1VSX0JSSUdIVF07Ci19Ci0KLXN0YXRpYyBpbnQgYmxfc2V0X3N0YXR1cyhzdHJ1Y3QgYmFja2xpZ2h0X2RldmljZSAqYmQpCi17Ci0Jc3RydWN0IHBjY19hY3BpICpwY2MgPSBibF9nZXRfZGF0YShiZCk7Ci0JaW50IGJyaWdodCA9IGJkLT5wcm9wcy5icmlnaHRuZXNzOwotCWludCByYzsKLQotCWlmICghYWNwaV9wY2NfcmV0cmlldmVfYmlvc2RhdGEocGNjLCBwY2MtPnNpbmYpKQotCQlyZXR1cm4gLUVJTzsKLQotCWlmIChicmlnaHQgPCBwY2MtPnNpbmZbU0lORl9BQ19NSU5fQlJJR0hUXSkKLQkJYnJpZ2h0ID0gcGNjLT5zaW5mW1NJTkZfQUNfTUlOX0JSSUdIVF07Ci0KLQlpZiAoYnJpZ2h0IDwgcGNjLT5zaW5mW1NJTkZfRENfTUlOX0JSSUdIVF0pCi0JCWJyaWdodCA9IHBjYy0+c2luZltTSU5GX0RDX01JTl9CUklHSFRdOwotCi0JaWYgKGJyaWdodCA8IHBjYy0+c2luZltTSU5GX0FDX01JTl9CUklHSFRdIHx8Ci0JICAgIGJyaWdodCA+IHBjYy0+c2luZltTSU5GX0FDX01BWF9CUklHSFRdKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXJjID0gYWNwaV9wY2Nfd3JpdGVfc3NldChwY2MsIFNJTkZfQUNfQ1VSX0JSSUdIVCwgYnJpZ2h0KTsKLQlpZiAocmMgPCAwKQotCQlyZXR1cm4gcmM7Ci0KLQlyZXR1cm4gYWNwaV9wY2Nfd3JpdGVfc3NldChwY2MsIFNJTkZfRENfQ1VSX0JSSUdIVCwgYnJpZ2h0KTsKLX0KLQotc3RhdGljIHN0cnVjdCBiYWNrbGlnaHRfb3BzIHBjY19iYWNrbGlnaHRfb3BzID0gewotCS5nZXRfYnJpZ2h0bmVzcwk9IGJsX2dldCwKLQkudXBkYXRlX3N0YXR1cwk9IGJsX3NldF9zdGF0dXMsCi19OwotCi0KLS8qIHN5c2ZzIHVzZXIgaW50ZXJmYWNlIGZ1bmN0aW9ucyAqLwotCi1zdGF0aWMgc3NpemVfdCBzaG93X251bWJhdHQoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCSAgICBjaGFyICpidWYpCi17Ci0Jc3RydWN0IGFjcGlfZGV2aWNlICphY3BpID0gdG9fYWNwaV9kZXZpY2UoZGV2KTsKLQlzdHJ1Y3QgcGNjX2FjcGkgKnBjYyA9IGFjcGlfZHJpdmVyX2RhdGEoYWNwaSk7Ci0KLQlpZiAoIWFjcGlfcGNjX3JldHJpZXZlX2Jpb3NkYXRhKHBjYywgcGNjLT5zaW5mKSkKLQkJcmV0dXJuIC1FSU87Ci0KLQlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgcGNjLT5zaW5mW1NJTkZfTlVNX0JBVFRFUklFU10pOwotfQotCi1zdGF0aWMgc3NpemVfdCBzaG93X2xjZHR5cGUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCSAgICBjaGFyICpidWYpCi17Ci0Jc3RydWN0IGFjcGlfZGV2aWNlICphY3BpID0gdG9fYWNwaV9kZXZpY2UoZGV2KTsKLQlzdHJ1Y3QgcGNjX2FjcGkgKnBjYyA9IGFjcGlfZHJpdmVyX2RhdGEoYWNwaSk7Ci0KLQlpZiAoIWFjcGlfcGNjX3JldHJpZXZlX2Jpb3NkYXRhKHBjYywgcGNjLT5zaW5mKSkKLQkJcmV0dXJuIC1FSU87Ci0KLQlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgcGNjLT5zaW5mW1NJTkZfTENEX1RZUEVdKTsKLX0KLQotc3RhdGljIHNzaXplX3Qgc2hvd19tdXRlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCQkgY2hhciAqYnVmKQotewotCXN0cnVjdCBhY3BpX2RldmljZSAqYWNwaSA9IHRvX2FjcGlfZGV2aWNlKGRldik7Ci0Jc3RydWN0IHBjY19hY3BpICpwY2MgPSBhY3BpX2RyaXZlcl9kYXRhKGFjcGkpOwotCi0JaWYgKCFhY3BpX3BjY19yZXRyaWV2ZV9iaW9zZGF0YShwY2MsIHBjYy0+c2luZikpCi0JCXJldHVybiAtRUlPOwotCi0JcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIHBjYy0+c2luZltTSU5GX01VVEVdKTsKLX0KLQotc3RhdGljIHNzaXplX3Qgc2hvd19zdGlja3koc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCSAgIGNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3QgYWNwaV9kZXZpY2UgKmFjcGkgPSB0b19hY3BpX2RldmljZShkZXYpOwotCXN0cnVjdCBwY2NfYWNwaSAqcGNjID0gYWNwaV9kcml2ZXJfZGF0YShhY3BpKTsKLQotCWlmICghYWNwaV9wY2NfcmV0cmlldmVfYmlvc2RhdGEocGNjLCBwY2MtPnNpbmYpKQotCQlyZXR1cm4gLUVJTzsKLQotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCBwY2MtPnNpbmZbU0lORl9TVElDS1lfS0VZXSk7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IHNldF9zdGlja3koc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCSAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCi17Ci0Jc3RydWN0IGFjcGlfZGV2aWNlICphY3BpID0gdG9fYWNwaV9kZXZpY2UoZGV2KTsKLQlzdHJ1Y3QgcGNjX2FjcGkgKnBjYyA9IGFjcGlfZHJpdmVyX2RhdGEoYWNwaSk7Ci0JaW50IHZhbDsKLQotCWlmIChjb3VudCAmJiBzc2NhbmYoYnVmLCAiJWkiLCAmdmFsKSA9PSAxICYmCi0JICAgICh2YWwgPT0gMCB8fCB2YWwgPT0gMSkpIHsKLQkJYWNwaV9wY2Nfd3JpdGVfc3NldChwY2MsIFNJTkZfU1RJQ0tZX0tFWSwgdmFsKTsKLQkJcGNjLT5zdGlja3lfbW9kZSA9IHZhbDsKLQl9Ci0KLQlyZXR1cm4gY291bnQ7Ci19Ci0KLXN0YXRpYyBERVZJQ0VfQVRUUihudW1iYXR0LCBTX0lSVUdPLCBzaG93X251bWJhdHQsIE5VTEwpOwotc3RhdGljIERFVklDRV9BVFRSKGxjZHR5cGUsIFNfSVJVR08sIHNob3dfbGNkdHlwZSwgTlVMTCk7Ci1zdGF0aWMgREVWSUNFX0FUVFIobXV0ZSwgU19JUlVHTywgc2hvd19tdXRlLCBOVUxMKTsKLXN0YXRpYyBERVZJQ0VfQVRUUihzdGlja3lfa2V5LCBTX0lSVUdPIHwgU19JV1VTUiwgc2hvd19zdGlja3ksIHNldF9zdGlja3kpOwotCi1zdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqcGNjX3N5c2ZzX2VudHJpZXNbXSA9IHsKLQkmZGV2X2F0dHJfbnVtYmF0dC5hdHRyLAotCSZkZXZfYXR0cl9sY2R0eXBlLmF0dHIsCi0JJmRldl9hdHRyX211dGUuYXR0ciwKLQkmZGV2X2F0dHJfc3RpY2t5X2tleS5hdHRyLAotCU5VTEwsCi19OwotCi1zdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBwY2NfYXR0cl9ncm91cCA9IHsKLQkubmFtZQk9IE5VTEwsCQkvKiBwdXQgaW4gZGV2aWNlIGRpcmVjdG9yeSAqLwotCS5hdHRycwk9IHBjY19zeXNmc19lbnRyaWVzLAotfTsKLQotCi0vKiBob3RrZXkgaW5wdXQgZGV2aWNlIGRyaXZlciAqLwotCi1zdGF0aWMgaW50IHBjY19nZXRrZXljb2RlKHN0cnVjdCBpbnB1dF9kZXYgKmRldiwgaW50IHNjYW5jb2RlLCBpbnQgKmtleWNvZGUpCi17Ci0Jc3RydWN0IHBjY19hY3BpICpwY2MgPSBpbnB1dF9nZXRfZHJ2ZGF0YShkZXYpOwotCi0JaWYgKHNjYW5jb2RlID49IEFSUkFZX1NJWkUocGNjLT5rZXltYXApKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCSprZXljb2RlID0gcGNjLT5rZXltYXBbc2NhbmNvZGVdOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQga2V5bWFwX2dldF9ieV9rZXljb2RlKHN0cnVjdCBwY2NfYWNwaSAqcGNjLCBpbnQga2V5Y29kZSkKLXsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHBjYy0+a2V5bWFwKTsgaSsrKSB7Ci0JCWlmIChwY2MtPmtleW1hcFtpXSA9PSBrZXljb2RlKQotCQkJcmV0dXJuIGkrMTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBwY2Nfc2V0a2V5Y29kZShzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYsIGludCBzY2FuY29kZSwgaW50IGtleWNvZGUpCi17Ci0Jc3RydWN0IHBjY19hY3BpICpwY2MgPSBpbnB1dF9nZXRfZHJ2ZGF0YShkZXYpOwotCWludCBvbGRrZXljb2RlOwotCi0JaWYgKHNjYW5jb2RlID49IEFSUkFZX1NJWkUocGNjLT5rZXltYXApKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmIChrZXljb2RlIDwgMCB8fCBrZXljb2RlID4gS0VZX01BWCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlvbGRrZXljb2RlID0gcGNjLT5rZXltYXBbc2NhbmNvZGVdOwotCXBjYy0+a2V5bWFwW3NjYW5jb2RlXSA9IGtleWNvZGU7Ci0KLQlzZXRfYml0KGtleWNvZGUsIGRldi0+a2V5Yml0KTsKLQotCWlmICgha2V5bWFwX2dldF9ieV9rZXljb2RlKHBjYywgb2xka2V5Y29kZSkpCi0JCWNsZWFyX2JpdChvbGRrZXljb2RlLCBkZXYtPmtleWJpdCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgYWNwaV9wY2NfZ2VuZXJhdGVfa2V5aW5wdXQoc3RydWN0IHBjY19hY3BpICpwY2MpCi17Ci0Jc3RydWN0IGlucHV0X2RldiAqaG90a19pbnB1dF9kZXYgPSBwY2MtPmlucHV0X2RldjsKLQlpbnQgcmM7Ci0JaW50IGtleV9jb2RlLCBoa2V5X251bTsKLQl1bnNpZ25lZCBsb25nIGxvbmcgcmVzdWx0OwotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9wY2NfZ2VuZXJhdGVfa2V5aW5wdXQiKTsKLQotCXJjID0gYWNwaV9ldmFsdWF0ZV9pbnRlZ2VyKHBjYy0+aGFuZGxlLCBNRVRIT0RfSEtFWV9RVUVSWSwKLQkJCQkgICBOVUxMLCAmcmVzdWx0KTsKLQlpZiAoIUFDUElfU1VDQ0VTUyhyYykpIHsKLQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKLQkJCQkgImVycm9yIGdldHRpbmcgaG90a2V5IHN0YXR1c1xuIikpOwotCQlyZXR1cm47Ci0JfQotCi0JYWNwaV9idXNfZ2VuZXJhdGVfcHJvY19ldmVudChwY2MtPmRldmljZSwgSEtFWV9OT1RJRlksIHJlc3VsdCk7Ci0KLQloa2V5X251bSA9IHJlc3VsdCAmIDB4ZjsKLQotCWlmIChoa2V5X251bSA8IDAgfHwgaGtleV9udW0gPiBBUlJBWV9TSVpFKHBjYy0+a2V5bWFwKSkgewotCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAotCQkJCSAgImhvdGtleSBudW1iZXIgb3V0IG9mIHJhbmdlOiAlZFxuIiwKLQkJCQkgIGhrZXlfbnVtKSk7Ci0JCXJldHVybjsKLQl9Ci0KLQlrZXlfY29kZSA9IHBjYy0+a2V5bWFwW2hrZXlfbnVtXTsKLQotCWlmIChrZXlfY29kZSAhPSBLRVlfUkVTRVJWRUQpIHsKLQkJaW50IHB1c2hlZCA9IChyZXN1bHQgJiAweDgwKSA/IFRSVUUgOiBGQUxTRTsKLQotCQlpbnB1dF9yZXBvcnRfa2V5KGhvdGtfaW5wdXRfZGV2LCBrZXlfY29kZSwgcHVzaGVkKTsKLQkJaW5wdXRfc3luYyhob3RrX2lucHV0X2Rldik7Ci0JfQotCi0JcmV0dXJuOwotfQotCi1zdGF0aWMgdm9pZCBhY3BpX3BjY19ob3RrZXlfbm90aWZ5KGFjcGlfaGFuZGxlIGhhbmRsZSwgdTMyIGV2ZW50LCB2b2lkICpkYXRhKQotewotCXN0cnVjdCBwY2NfYWNwaSAqcGNjID0gKHN0cnVjdCBwY2NfYWNwaSAqKSBkYXRhOwotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9wY2NfaG90a2V5X25vdGlmeSIpOwotCi0Jc3dpdGNoIChldmVudCkgewotCWNhc2UgSEtFWV9OT1RJRlk6Ci0JCWFjcGlfcGNjX2dlbmVyYXRlX2tleWlucHV0KHBjYyk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCS8qIG5vdGhpbmcgdG8gZG8gKi8KLQkJYnJlYWs7Ci0JfQotfQotCi1zdGF0aWMgaW50IGFjcGlfcGNjX2luaXRfaW5wdXQoc3RydWN0IHBjY19hY3BpICpwY2MpCi17Ci0JaW50IGksIHJjOwotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9wY2NfaW5pdF9pbnB1dCIpOwotCi0JcGNjLT5pbnB1dF9kZXYgPSBpbnB1dF9hbGxvY2F0ZV9kZXZpY2UoKTsKLQlpZiAoIXBjYy0+aW5wdXRfZGV2KSB7Ci0JCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCi0JCQkJICAiQ291bGRuJ3QgYWxsb2NhdGUgaW5wdXQgZGV2aWNlIGZvciBob3RrZXkiKSk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCXBjYy0+aW5wdXRfZGV2LT5ldmJpdFswXSA9IEJJVChFVl9LRVkpOwotCi0JcGNjLT5pbnB1dF9kZXYtPm5hbWUgPSBBQ1BJX1BDQ19EUklWRVJfTkFNRTsKLQlwY2MtPmlucHV0X2Rldi0+cGh5cyA9IEFDUElfUENDX0lOUFVUX1BIWVM7Ci0JcGNjLT5pbnB1dF9kZXYtPmlkLmJ1c3R5cGUgPSBCVVNfSE9TVDsKLQlwY2MtPmlucHV0X2Rldi0+aWQudmVuZG9yID0gMHgwMDAxOwotCXBjYy0+aW5wdXRfZGV2LT5pZC5wcm9kdWN0ID0gMHgwMDAxOwotCXBjYy0+aW5wdXRfZGV2LT5pZC52ZXJzaW9uID0gMHgwMTAwOwotCXBjYy0+aW5wdXRfZGV2LT5nZXRrZXljb2RlID0gcGNjX2dldGtleWNvZGU7Ci0JcGNjLT5pbnB1dF9kZXYtPnNldGtleWNvZGUgPSBwY2Nfc2V0a2V5Y29kZTsKLQotCS8qIGxvYWQgaW5pdGlhbCBrZXltYXAgKi8KLQltZW1jcHkocGNjLT5rZXltYXAsIGluaXRpYWxfa2V5bWFwLCBzaXplb2YocGNjLT5rZXltYXApKTsKLQotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHBjYy0+a2V5bWFwKTsgaSsrKQotCQlfX3NldF9iaXQocGNjLT5rZXltYXBbaV0sIHBjYy0+aW5wdXRfZGV2LT5rZXliaXQpOwotCV9fY2xlYXJfYml0KEtFWV9SRVNFUlZFRCwgcGNjLT5pbnB1dF9kZXYtPmtleWJpdCk7Ci0KLQlpbnB1dF9zZXRfZHJ2ZGF0YShwY2MtPmlucHV0X2RldiwgcGNjKTsKLQotCXJjID0gaW5wdXRfcmVnaXN0ZXJfZGV2aWNlKHBjYy0+aW5wdXRfZGV2KTsKLQlpZiAocmMgPCAwKQotCQlpbnB1dF9mcmVlX2RldmljZShwY2MtPmlucHV0X2Rldik7Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLS8qIGtlcm5lbCBtb2R1bGUgaW50ZXJmYWNlICovCi0KLXN0YXRpYyBpbnQgYWNwaV9wY2NfaG90a2V5X3Jlc3VtZShzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSkKLXsKLQlzdHJ1Y3QgcGNjX2FjcGkgKnBjYyA9IGFjcGlfZHJpdmVyX2RhdGEoZGV2aWNlKTsKLQlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfcGNjX2hvdGtleV9yZXN1bWUiKTsKLQotCWlmIChkZXZpY2UgPT0gTlVMTCB8fCBwY2MgPT0gTlVMTCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLCAiU3RpY2t5IG1vZGUgcmVzdG9yZTogJWRcbiIsCi0JCQkgIHBjYy0+c3RpY2t5X21vZGUpKTsKLQotCXN0YXR1cyA9IGFjcGlfcGNjX3dyaXRlX3NzZXQocGNjLCBTSU5GX1NUSUNLWV9LRVksIHBjYy0+c3RpY2t5X21vZGUpOwotCi0JcmV0dXJuIHN0YXR1cyA9PSBBRV9PSyA/IDAgOiAtRUlOVkFMOwotfQotCi1zdGF0aWMgaW50IGFjcGlfcGNjX2hvdGtleV9hZGQoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpCi17Ci0JYWNwaV9zdGF0dXMgc3RhdHVzOwotCXN0cnVjdCBwY2NfYWNwaSAqcGNjOwotCWludCBudW1fc2lmciwgcmVzdWx0OwotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9wY2NfaG90a2V5X2FkZCIpOwotCi0JaWYgKCFkZXZpY2UpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JbnVtX3NpZnIgPSBhY3BpX3BjY19nZXRfc3F0eShkZXZpY2UpOwotCi0JaWYgKG51bV9zaWZyID4gMjU1KSB7Ci0JCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsICJudW1fc2lmciB0b28gbGFyZ2UiKSk7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQotCXBjYyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBwY2NfYWNwaSksIEdGUF9LRVJORUwpOwotCWlmICghcGNjKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCi0JCQkJICAiQ291bGRuJ3QgYWxsb2NhdGUgbWVtIGZvciBwY2MiKSk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCXBjYy0+c2luZiA9IGt6YWxsb2Moc2l6ZW9mKHUzMikgKiAobnVtX3NpZnIgKyAxKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwY2MtPnNpbmYpIHsKLQkJcmVzdWx0ID0gLUVOT01FTTsKLQkJZ290byBvdXRfaG90a2V5OwotCX0KLQotCXBjYy0+ZGV2aWNlID0gZGV2aWNlOwotCXBjYy0+aGFuZGxlID0gZGV2aWNlLT5oYW5kbGU7Ci0JcGNjLT5udW1fc2lmciA9IG51bV9zaWZyOwotCWRldmljZS0+ZHJpdmVyX2RhdGEgPSBwY2M7Ci0Jc3RyY3B5KGFjcGlfZGV2aWNlX25hbWUoZGV2aWNlKSwgQUNQSV9QQ0NfREVWSUNFX05BTUUpOwotCXN0cmNweShhY3BpX2RldmljZV9jbGFzcyhkZXZpY2UpLCBBQ1BJX1BDQ19DTEFTUyk7Ci0KLQlyZXN1bHQgPSBhY3BpX3BjY19pbml0X2lucHV0KHBjYyk7Ci0JaWYgKHJlc3VsdCkgewotCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAotCQkJCSAgIkVycm9yIGluc3RhbGxpbmcga2V5aW5wdXQgaGFuZGxlclxuIikpOwotCQlnb3RvIG91dF9zaW5mOwotCX0KLQotCS8qIGluaXRpYWxpemUgaG90a2V5IGlucHV0IGRldmljZSAqLwotCXN0YXR1cyA9IGFjcGlfaW5zdGFsbF9ub3RpZnlfaGFuZGxlcihwY2MtPmhhbmRsZSwgQUNQSV9ERVZJQ0VfTk9USUZZLAotCQkJCQkgICAgIGFjcGlfcGNjX2hvdGtleV9ub3RpZnksIHBjYyk7Ci0KLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKLQkJCQkgICJFcnJvciBpbnN0YWxsaW5nIG5vdGlmeSBoYW5kbGVyXG4iKSk7Ci0JCXJlc3VsdCA9IC1FTk9ERVY7Ci0JCWdvdG8gb3V0X2lucHV0OwotCX0KLQotCS8qIGluaXRpYWxpemUgYmFja2xpZ2h0ICovCi0JcGNjLT5iYWNrbGlnaHQgPSBiYWNrbGlnaHRfZGV2aWNlX3JlZ2lzdGVyKCJwYW5hc29uaWMiLCBOVUxMLCBwY2MsCi0JCQkJCQkgICAmcGNjX2JhY2tsaWdodF9vcHMpOwotCWlmIChJU19FUlIocGNjLT5iYWNrbGlnaHQpKQotCQlnb3RvIG91dF9ub3RpZnk7Ci0KLQlpZiAoIWFjcGlfcGNjX3JldHJpZXZlX2Jpb3NkYXRhKHBjYywgcGNjLT5zaW5mKSkgewotCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAotCQkJCSAiQ291bGRuJ3QgcmV0cmlldmUgQklPUyBkYXRhXG4iKSk7Ci0JCWdvdG8gb3V0X2JhY2tsaWdodDsKLQl9Ci0KLQkvKiByZWFkIHRoZSBpbml0aWFsIGJyaWdodG5lc3Mgc2V0dGluZyBmcm9tIHRoZSBoYXJkd2FyZSAqLwotCXBjYy0+YmFja2xpZ2h0LT5wcm9wcy5tYXhfYnJpZ2h0bmVzcyA9Ci0JCQkJCXBjYy0+c2luZltTSU5GX0FDX01BWF9CUklHSFRdOwotCXBjYy0+YmFja2xpZ2h0LT5wcm9wcy5icmlnaHRuZXNzID0gcGNjLT5zaW5mW1NJTkZfQUNfQ1VSX0JSSUdIVF07Ci0KLQkvKiByZWFkIHRoZSBpbml0aWFsIHN0aWNreSBrZXkgbW9kZSBmcm9tIHRoZSBoYXJkd2FyZSAqLwotCXBjYy0+c3RpY2t5X21vZGUgPSBwY2MtPnNpbmZbU0lORl9TVElDS1lfS0VZXTsKLQotCS8qIGFkZCBzeXNmcyBhdHRyaWJ1dGVzICovCi0JcmVzdWx0ID0gc3lzZnNfY3JlYXRlX2dyb3VwKCZkZXZpY2UtPmRldi5rb2JqLCAmcGNjX2F0dHJfZ3JvdXApOwotCWlmIChyZXN1bHQpCi0JCWdvdG8gb3V0X2JhY2tsaWdodDsKLQotCXJldHVybiAwOwotCi1vdXRfYmFja2xpZ2h0OgotCWJhY2tsaWdodF9kZXZpY2VfdW5yZWdpc3RlcihwY2MtPmJhY2tsaWdodCk7Ci1vdXRfbm90aWZ5OgotCWFjcGlfcmVtb3ZlX25vdGlmeV9oYW5kbGVyKHBjYy0+aGFuZGxlLCBBQ1BJX0RFVklDRV9OT1RJRlksCi0JCQkJICAgYWNwaV9wY2NfaG90a2V5X25vdGlmeSk7Ci1vdXRfaW5wdXQ6Ci0JaW5wdXRfdW5yZWdpc3Rlcl9kZXZpY2UocGNjLT5pbnB1dF9kZXYpOwotCS8qIG5vIG5lZWQgdG8gaW5wdXRfZnJlZV9kZXZpY2UoKSBzaW5jZSBjb3JlIGlucHV0IEFQSSByZWZjb3VudCBhbmQKLQkgKiBmcmVlKClzIHRoZSBkZXZpY2UgKi8KLW91dF9zaW5mOgotCWtmcmVlKHBjYy0+c2luZik7Ci1vdXRfaG90a2V5OgotCWtmcmVlKHBjYyk7Ci0KLQlyZXR1cm4gcmVzdWx0OwotfQotCi1zdGF0aWMgaW50IF9faW5pdCBhY3BpX3BjY19pbml0KHZvaWQpCi17Ci0JaW50IHJlc3VsdCA9IDA7Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX3BjY19pbml0Iik7Ci0KLQlpZiAoYWNwaV9kaXNhYmxlZCkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQlyZXN1bHQgPSBhY3BpX2J1c19yZWdpc3Rlcl9kcml2ZXIoJmFjcGlfcGNjX2RyaXZlcik7Ci0JaWYgKHJlc3VsdCA8IDApIHsKLQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKLQkJCQkgICJFcnJvciByZWdpc3RlcmluZyBob3RrZXkgZHJpdmVyXG4iKSk7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGFjcGlfcGNjX2hvdGtleV9yZW1vdmUoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UsIGludCB0eXBlKQotewotCXN0cnVjdCBwY2NfYWNwaSAqcGNjID0gYWNwaV9kcml2ZXJfZGF0YShkZXZpY2UpOwotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9wY2NfaG90a2V5X3JlbW92ZSIpOwotCi0JaWYgKCFkZXZpY2UgfHwgIXBjYykKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlzeXNmc19yZW1vdmVfZ3JvdXAoJmRldmljZS0+ZGV2LmtvYmosICZwY2NfYXR0cl9ncm91cCk7Ci0KLQliYWNrbGlnaHRfZGV2aWNlX3VucmVnaXN0ZXIocGNjLT5iYWNrbGlnaHQpOwotCi0JYWNwaV9yZW1vdmVfbm90aWZ5X2hhbmRsZXIocGNjLT5oYW5kbGUsIEFDUElfREVWSUNFX05PVElGWSwKLQkJCQkgICBhY3BpX3BjY19ob3RrZXlfbm90aWZ5KTsKLQotCWlucHV0X3VucmVnaXN0ZXJfZGV2aWNlKHBjYy0+aW5wdXRfZGV2KTsKLQkvKiBubyBuZWVkIHRvIGlucHV0X2ZyZWVfZGV2aWNlKCkgc2luY2UgY29yZSBpbnB1dCBBUEkgcmVmY291bnQgYW5kCi0JICogZnJlZSgpcyB0aGUgZGV2aWNlICovCi0KLQlrZnJlZShwY2MtPnNpbmYpOwotCWtmcmVlKHBjYyk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IGFjcGlfcGNjX2V4aXQodm9pZCkKLXsKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX3BjY19leGl0Iik7Ci0KLQlhY3BpX2J1c191bnJlZ2lzdGVyX2RyaXZlcigmYWNwaV9wY2NfZHJpdmVyKTsKLX0KLQotbW9kdWxlX2luaXQoYWNwaV9wY2NfaW5pdCk7Ci1tb2R1bGVfZXhpdChhY3BpX3BjY19leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9waGFudG9tLmMgYi9kcml2ZXJzL21pc2MvcGhhbnRvbS5jCmluZGV4IGFiZGViZTMuLmZhNTdiNjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9waGFudG9tLmMKKysrIGIvZHJpdmVycy9taXNjL3BoYW50b20uYwpAQCAtNiw3ICs2LDcgQEAKICAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgogICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAgKgotICogIFlvdSBuZWVkIGFuIHVzZXJzcGFjZSBsaWJyYXJ5IHRvIGNvb3BlcmF0ZSB3aXRoIHRoaXMgZHJpdmVyLiBJdCAoYW5kIG90aGVyCisgKiAgWW91IG5lZWQgYSB1c2Vyc3BhY2UgbGlicmFyeSB0byBjb29wZXJhdGUgd2l0aCB0aGlzIGRyaXZlci4gSXQgKGFuZCBvdGhlcgogICogIGluZm8pIG1heSBiZSBvYnRhaW5lZCBoZXJlOgogICogIGh0dHA6Ly93d3cuZmkubXVuaS5jei9+eHNsYWJ5L3BoYW50b20uaHRtbAogICogIG9yIGFsdGVybmF0aXZlbHksIHlvdSBtaWdodCB1c2UgT3BlbkhhcHRpY3MgcHJvdmlkZWQgYnkgU2Vuc2FibGUuCmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2Mvc2dpLXhwL3hwY19zbjIuYyBiL2RyaXZlcnMvbWlzYy9zZ2kteHAveHBjX3NuMi5jCmluZGV4IDczYjdmYjguLjgyZmI5OTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9zZ2kteHAveHBjX3NuMi5jCisrKyBiL2RyaXZlcnMvbWlzYy9zZ2kteHAveHBjX3NuMi5jCkBAIC04OTksNyArODk5LDcgQEAKIAlkZXZfZGJnKHhwY19wYXJ0LCAiICByZW1vdGVfdmFyc19wYSA9IDB4JTAxNmx4XG4iLAogCQlwYXJ0X3NuMi0+cmVtb3RlX3ZhcnNfcGEpOwogCi0JcGFydC0+bGFzdF9oZWFydGJlYXQgPSByZW1vdGVfdmFycy0+aGVhcnRiZWF0OworCXBhcnQtPmxhc3RfaGVhcnRiZWF0ID0gcmVtb3RlX3ZhcnMtPmhlYXJ0YmVhdCAtIDE7CiAJZGV2X2RiZyh4cGNfcGFydCwgIiAgbGFzdF9oZWFydGJlYXQgPSAweCUwMTZseFxuIiwKIAkJcGFydC0+bGFzdF9oZWFydGJlYXQpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2Mvc2dpLXhwL3hwbmV0LmMgYi9kcml2ZXJzL21pc2Mvc2dpLXhwL3hwbmV0LmMKaW5kZXggODExNTJiMy4uNzk1N2Y1MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL3NnaS14cC94cG5ldC5jCisrKyBiL2RyaXZlcnMvbWlzYy9zZ2kteHAveHBuZXQuYwpAQCAtOTUsMTEgKzk1LDYgQEAKIAlhdG9taWNfdCB1c2VfY291bnQ7CiB9OwogCi0vKiBkcml2ZXIgc3BlY2lmaWMgc3RydWN0dXJlIHBvaW50ZWQgdG8gYnkgdGhlIGRldmljZSBzdHJ1Y3R1cmUgKi8KLXN0cnVjdCB4cG5ldF9kZXZfcHJpdmF0ZSB7Ci0Jc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7Ci19OwotCiBzdHJ1Y3QgbmV0X2RldmljZSAqeHBuZXRfZGV2aWNlOwogCiAvKgpAQCAtMTUzLDcgKzE0OCw2IEBACiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAl2b2lkICpkc3Q7CiAJZW51bSB4cF9yZXR2YWwgcmV0OwotCXN0cnVjdCB4cG5ldF9kZXZfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KHhwbmV0X2RldmljZSk7CiAKIAlpZiAoIVhQTkVUX1ZBTElEX01TRyhtc2cpKSB7CiAJCS8qCkBAIC0xNjEsNyArMTU1LDcgQEAKIAkJICovCiAJCXhwY19yZWNlaXZlZChwYXJ0aWQsIGNoYW5uZWwsICh2b2lkICopbXNnKTsKIAotCQlwcml2LT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkJeHBuZXRfZGV2aWNlLT5zdGF0cy5yeF9lcnJvcnMrKzsKIAogCQlyZXR1cm47CiAJfQpAQCAtMTc2LDcgKzE3MCw3IEBACiAKIAkJeHBjX3JlY2VpdmVkKHBhcnRpZCwgY2hhbm5lbCwgKHZvaWQgKiltc2cpOwogCi0JCXByaXYtPnN0YXRzLnJ4X2Vycm9ycysrOworCQl4cG5ldF9kZXZpY2UtPnN0YXRzLnJ4X2Vycm9ycysrOwogCiAJCXJldHVybjsKIAl9CkBAIC0yMjYsNyArMjIwLDcgQEAKIAogCQkJeHBjX3JlY2VpdmVkKHBhcnRpZCwgY2hhbm5lbCwgKHZvaWQgKiltc2cpOwogCi0JCQlwcml2LT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkJCXhwbmV0X2RldmljZS0+c3RhdHMucnhfZXJyb3JzKys7CiAKIAkJCXJldHVybjsKIAkJfQpAQCAtMjQ3LDggKzI0MSw4IEBACiAJCXNrYl9lbmRfcG9pbnRlcihza2IpLCBza2ItPmxlbik7CiAKIAl4cG5ldF9kZXZpY2UtPmxhc3RfcnggPSBqaWZmaWVzOwotCXByaXYtPnN0YXRzLnJ4X3BhY2tldHMrKzsKLQlwcml2LT5zdGF0cy5yeF9ieXRlcyArPSBza2ItPmxlbiArIEVUSF9ITEVOOworCXhwbmV0X2RldmljZS0+c3RhdHMucnhfcGFja2V0cysrOworCXhwbmV0X2RldmljZS0+c3RhdHMucnhfYnl0ZXMgKz0gc2tiLT5sZW4gKyBFVEhfSExFTjsKIAogCW5ldGlmX3J4X25pKHNrYik7CiAJeHBjX3JlY2VpdmVkKHBhcnRpZCwgY2hhbm5lbCwgKHZvaWQgKiltc2cpOwpAQCAtMzUzLDI2ICszNDcsNiBAQAogfQogCiAvKgotICogUmVxdWlyZWQgZm9yIHRoZSBuZXRfZGV2aWNlIHN0cnVjdHVyZS4KLSAqLwotc3RhdGljIGludAoteHBuZXRfZGV2X3NldF9jb25maWcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmbWFwICpuZXdfbWFwKQotewotCXJldHVybiAwOwotfQotCi0vKgotICogUmV0dXJuIHN0YXRpc3RpY3MgdG8gdGhlIGNhbGxlci4KLSAqLwotc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICoKLXhwbmV0X2Rldl9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgeHBuZXRfZGV2X3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOwotCi0JcmV0dXJuICZwcml2LT5zdGF0czsKLX0KLQotLyoKICAqIE5vdGlmaWNhdGlvbiB0aGF0IHRoZSBvdGhlciBlbmQgaGFzIHJlY2VpdmVkIHRoZSBtZXNzYWdlIGFuZAogICogRE1BJ2QgdGhlIHNrYiBpbmZvcm1hdGlvbi4gIEF0IHRoaXMgcG9pbnQsIHRoZXkgYXJlIGRvbmUgd2l0aAogICogb3VyIHNpZGUuICBXaGVuIGFsbCByZWNpcGllbnRzIGFyZSBkb25lIHByb2Nlc3NpbmcsIHdlCkBAIC00NTMsNyArNDI3LDYgQEAKIAlzdHJ1Y3QgeHBuZXRfcGVuZGluZ19tc2cgKnF1ZXVlZF9tc2c7CiAJdTY0IHN0YXJ0X2FkZHIsIGVuZF9hZGRyOwogCXNob3J0IGRlc3RfcGFydGlkOwotCXN0cnVjdCB4cG5ldF9kZXZfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CiAJdTE2IGVtYmVkZGVkX2J5dGVzID0gMDsKIAogCWRldl9kYmcoeHBuZXQsICI+c2tiLT5oZWFkPTB4JXAgc2tiLT5kYXRhPTB4JXAgc2tiLT50YWlsPTB4JXAgIgpAQCAtNDc2LDcgKzQ0OSw3IEBACiAJCWRldl93YXJuKHhwbmV0LCAiZmFpbGVkIHRvIGttYWxsb2MgJWxkIGJ5dGVzOyBkcm9wcGluZyAiCiAJCQkgInBhY2tldFxuIiwgc2l6ZW9mKHN0cnVjdCB4cG5ldF9wZW5kaW5nX21zZykpOwogCi0JCXByaXYtPnN0YXRzLnR4X2Vycm9ycysrOworCQlkZXYtPnN0YXRzLnR4X2Vycm9ycysrOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKQEAgLTUyNiw4ICs0OTksOCBAQAogCQlrZnJlZShxdWV1ZWRfbXNnKTsKIAl9CiAKLQlwcml2LT5zdGF0cy50eF9wYWNrZXRzKys7Ci0JcHJpdi0+c3RhdHMudHhfYnl0ZXMgKz0gc2tiLT5sZW47CisJZGV2LT5zdGF0cy50eF9wYWNrZXRzKys7CisJZGV2LT5zdGF0cy50eF9ieXRlcyArPSBza2ItPmxlbjsKIAogCXJldHVybiAwOwogfQpAQCAtNTM4LDEyICs1MTEsMTkgQEAKIHN0YXRpYyB2b2lkCiB4cG5ldF9kZXZfdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewotCXN0cnVjdCB4cG5ldF9kZXZfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7Ci0KLQlwcml2LT5zdGF0cy50eF9lcnJvcnMrKzsKLQlyZXR1cm47CisJZGV2LT5zdGF0cy50eF9lcnJvcnMrKzsKIH0KIAorc3RhdGljIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyB4cG5ldF9uZXRkZXZfb3BzID0geworCS5uZG9fb3BlbgkJPSB4cG5ldF9kZXZfb3BlbiwKKwkubmRvX3N0b3AJCT0geHBuZXRfZGV2X3N0b3AsCisJLm5kb19zdGFydF94bWl0CQk9IHhwbmV0X2Rldl9oYXJkX3N0YXJ0X3htaXQsCisJLm5kb19jaGFuZ2VfbXR1CQk9IHhwbmV0X2Rldl9jaGFuZ2VfbXR1LAorCS5uZG9fdHhfdGltZW91dAkJPSB4cG5ldF9kZXZfdHhfdGltZW91dCwKKwkubmRvX3NldF9tYWNfYWRkcmVzcyAJPSBldGhfbWFjX2FkZHIsCisJLm5kb192YWxpZGF0ZV9hZGRyCT0gZXRoX3ZhbGlkYXRlX2FkZHIsCit9OworCiBzdGF0aWMgaW50IF9faW5pdAogeHBuZXRfaW5pdCh2b2lkKQogewpAQCAtNTYzLDggKzU0Myw3IEBACiAJICogdXNlIGV0aGVyX3NldHVwKCkgdG8gaW5pdCB0aGUgbWFqb3JpdHkgb2Ygb3VyIGRldmljZQogCSAqIHN0cnVjdHVyZSBhbmQgdGhlbiBvdmVycmlkZSB0aGUgbmVjZXNzYXJ5IHBpZWNlcy4KIAkgKi8KLQl4cG5ldF9kZXZpY2UgPSBhbGxvY19uZXRkZXYoc2l6ZW9mKHN0cnVjdCB4cG5ldF9kZXZfcHJpdmF0ZSksCi0JCQkJICAgIFhQTkVUX0RFVklDRV9OQU1FLCBldGhlcl9zZXR1cCk7CisJeHBuZXRfZGV2aWNlID0gYWxsb2NfbmV0ZGV2KDAsIFhQTkVUX0RFVklDRV9OQU1FLCBldGhlcl9zZXR1cCk7CiAJaWYgKHhwbmV0X2RldmljZSA9PSBOVUxMKSB7CiAJCWtmcmVlKHhwbmV0X2Jyb2FkY2FzdF9wYXJ0aXRpb25zKTsKIAkJcmV0dXJuIC1FTk9NRU07CkBAIC01NzMsMTMgKzU1Miw2IEBACiAJbmV0aWZfY2Fycmllcl9vZmYoeHBuZXRfZGV2aWNlKTsKIAogCXhwbmV0X2RldmljZS0+bXR1ID0gWFBORVRfREVGX01UVTsKLQl4cG5ldF9kZXZpY2UtPmNoYW5nZV9tdHUgPSB4cG5ldF9kZXZfY2hhbmdlX210dTsKLQl4cG5ldF9kZXZpY2UtPm9wZW4gPSB4cG5ldF9kZXZfb3BlbjsKLQl4cG5ldF9kZXZpY2UtPmdldF9zdGF0cyA9IHhwbmV0X2Rldl9nZXRfc3RhdHM7Ci0JeHBuZXRfZGV2aWNlLT5zdG9wID0geHBuZXRfZGV2X3N0b3A7Ci0JeHBuZXRfZGV2aWNlLT5oYXJkX3N0YXJ0X3htaXQgPSB4cG5ldF9kZXZfaGFyZF9zdGFydF94bWl0OwotCXhwbmV0X2RldmljZS0+dHhfdGltZW91dCA9IHhwbmV0X2Rldl90eF90aW1lb3V0OwotCXhwbmV0X2RldmljZS0+c2V0X2NvbmZpZyA9IHhwbmV0X2Rldl9zZXRfY29uZmlnOwogCiAJLyoKIAkgKiBNdWx0aWNhc3QgYXNzdW1lcyB0aGUgTFNCIG9mIHRoZSBmaXJzdCBvY3RldCBpcyBzZXQgZm9yIG11bHRpY2FzdApkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL3NvbnktbGFwdG9wLmMgYi9kcml2ZXJzL21pc2Mvc29ueS1sYXB0b3AuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTcxYjIxMS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL21pc2Mvc29ueS1sYXB0b3AuYworKysgL2Rldi9udWxsCkBAIC0xLDI3ODEgKzAsMCBAQAotLyoKLSAqIEFDUEkgU29ueSBOb3RlYm9vayBDb250cm9sIERyaXZlciAoU05DIGFuZCBTUElDKQotICoKLSAqIENvcHlyaWdodCAoQykgMjAwNC0yMDA1IFN0ZWxpYW4gUG9wIDxzdGVsaWFuQHBvcGllcy5uZXQ+Ci0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWF0dGlhIERvbmdpbGkgPG1hbGF0dGlhQGxpbnV4Lml0PgotICoKLSAqIFBhcnRzIG9mIHRoaXMgZHJpdmVyIGluc3BpcmVkIGZyb20gYXN1c19hY3BpLmMgYW5kIGlibV9hY3BpLmMKLSAqIHdoaWNoIGFyZSBjb3B5cmlnaHRlZCBieSB0aGVpciByZXNwZWN0aXZlIGF1dGhvcnMuCi0gKgotICogVGhlIFNOWTYwMDEgZHJpdmVyIHBhcnQgaXMgYmFzZWQgb24gdGhlIHNvbnlwaSBkcml2ZXIgd2hpY2ggaW5jbHVkZXMKLSAqIG1hdGVyaWFsIGZyb206Ci0gKgotICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDUgU3RlbGlhbiBQb3AgPHN0ZWxpYW5AcG9waWVzLm5ldD4KLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDUgTmFyYXlhbmFuIFIgUyA8bmFyc0BrYWRhbWJhLm9yZz4KLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwMiBBbGPDtHZlIDx3d3cuYWxjb3ZlLmNvbT4KLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDEgTWljaGFlbCBBc2hsZXkgPG0uYXNobGV5QHVuc3cuZWR1LmF1PgotICoKLSAqIENvcHlyaWdodCAoQykgMjAwMSBKdW5pY2hpIE1vcml0YSA8anVuMW1AbWFycy5kdGkubmUuanA+Ci0gKgotICogQ29weXJpZ2h0IChDKSAyMDAwIFRha2F5YSBLaW5qbyA8dC1raW5qb0B0YzQuc28tbmV0Lm5lLmpwPgotICoKLSAqIENvcHlyaWdodCAoQykgMjAwMCBBbmRyZXcgVHJpZGdlbGwgPHRyaWRnZUB2YWxpbnV4LmNvbT4KLSAqCi0gKiBFYXJsaWVyIHdvcmsgYnkgV2VybmVyIEFsbWVzYmVyZ2VyLCBQYXVsIGBSdXN0eScgUnVzc2VsbCBhbmQgUGF1bCBNYWNrZXJyYXMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCi0gKgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvYmFja2xpZ2h0Lmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvZXJyLmg+Ci0jaW5jbHVkZSA8bGludXgvZG1pLmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgotI2luY2x1ZGUgPGxpbnV4L2tmaWZvLmg+Ci0jaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+Ci0jaW5jbHVkZSA8bGludXgvYWNwaS5oPgotI2luY2x1ZGUgPGFjcGkvYWNwaV9kcml2ZXJzLmg+Ci0jaW5jbHVkZSA8YWNwaS9hY3BpX2J1cy5oPgotI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+Ci0jaW5jbHVkZSA8bGludXgvc29ueXBpLmg+Ci0jaW5jbHVkZSA8bGludXgvc29ueS1sYXB0b3AuaD4KLSNpZmRlZiBDT05GSUdfU09OWVBJX0NPTVBBVAotI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KLSNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+Ci0jZW5kaWYKLQotI2RlZmluZSBEUlZfUEZYCQkJInNvbnktbGFwdG9wOiAiCi0jZGVmaW5lIGRwcmludGsobXNnLi4uKQkJZG8gewkJCVwKLQlpZiAoZGVidWcpIHByaW50ayhLRVJOX1dBUk5JTkcgRFJWX1BGWCAgbXNnKTsJXAotfSB3aGlsZSAoMCkKLQotI2RlZmluZSBTT05ZX0xBUFRPUF9EUklWRVJfVkVSU0lPTgkiMC42IgotCi0jZGVmaW5lIFNPTllfTkNfQ0xBU1MJCSJzb255LW5jIgotI2RlZmluZSBTT05ZX05DX0hJRAkJIlNOWTUwMDEiCi0jZGVmaW5lIFNPTllfTkNfRFJJVkVSX05BTUUJIlNvbnkgTm90ZWJvb2sgQ29udHJvbCBEcml2ZXIiCi0KLSNkZWZpbmUgU09OWV9QSUNfQ0xBU1MJCSJzb255LXBpYyIKLSNkZWZpbmUgU09OWV9QSUNfSElECQkiU05ZNjAwMSIKLSNkZWZpbmUgU09OWV9QSUNfRFJJVkVSX05BTUUJIlNvbnkgUHJvZ3JhbW1hYmxlIElPIENvbnRyb2wgRHJpdmVyIgotCi1NT0RVTEVfQVVUSE9SKCJTdGVsaWFuIFBvcCwgTWF0dGlhIERvbmdpbGkiKTsKLU1PRFVMRV9ERVNDUklQVElPTigiU29ueSBsYXB0b3AgZXh0cmFzIGRyaXZlciAoU1BJQyBhbmQgU05DIEFDUEkgZGV2aWNlKSIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotTU9EVUxFX1ZFUlNJT04oU09OWV9MQVBUT1BfRFJJVkVSX1ZFUlNJT04pOwotCi1zdGF0aWMgaW50IGRlYnVnOwotbW9kdWxlX3BhcmFtKGRlYnVnLCBpbnQsIDApOwotTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgInNldCB0aGlzIHRvIDEgKGFuZCBSVEZNKSBpZiB5b3Ugd2FudCB0byBoZWxwICIKLQkJICJ0aGUgZGV2ZWxvcG1lbnQgb2YgdGhpcyBkcml2ZXIiKTsKLQotc3RhdGljIGludCBub19zcGljOwkJLyogPSAwICovCi1tb2R1bGVfcGFyYW0obm9fc3BpYywgaW50LCAwNDQ0KTsKLU1PRFVMRV9QQVJNX0RFU0Mobm9fc3BpYywKLQkJICJzZXQgdGhpcyBpZiB5b3UgZG9uJ3Qgd2FudCB0byBlbmFibGUgdGhlIFNQSUMgZGV2aWNlIik7Ci0KLXN0YXRpYyBpbnQgY29tcGF0OwkJLyogPSAwICovCi1tb2R1bGVfcGFyYW0oY29tcGF0LCBpbnQsIDA0NDQpOwotTU9EVUxFX1BBUk1fREVTQyhjb21wYXQsCi0JCSAic2V0IHRoaXMgaWYgeW91IHdhbnQgdG8gZW5hYmxlIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgbW9kZSIpOwotCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBtYXNrID0gMHhmZmZmZmZmZjsKLW1vZHVsZV9wYXJhbShtYXNrLCB1bG9uZywgMDY0NCk7Ci1NT0RVTEVfUEFSTV9ERVNDKG1hc2ssCi0JCSAic2V0IHRoaXMgdG8gdGhlIG1hc2sgb2YgZXZlbnQgeW91IHdhbnQgdG8gZW5hYmxlIChzZWUgZG9jKSIpOwotCi1zdGF0aWMgaW50IGNhbWVyYTsJCS8qID0gMCAqLwotbW9kdWxlX3BhcmFtKGNhbWVyYSwgaW50LCAwNDQ0KTsKLU1PRFVMRV9QQVJNX0RFU0MoY2FtZXJhLAotCQkgInNldCB0aGlzIHRvIDEgdG8gZW5hYmxlIE1vdGlvbiBFeWUgY2FtZXJhIGNvbnRyb2xzICIKLQkJICIob25seSB1c2UgaXQgaWYgeW91IGhhdmUgYSBDMVZFIG9yIEMxVk4gbW9kZWwpIik7Ci0KLSNpZmRlZiBDT05GSUdfU09OWVBJX0NPTVBBVAotc3RhdGljIGludCBtaW5vciA9IC0xOwotbW9kdWxlX3BhcmFtKG1pbm9yLCBpbnQsIDApOwotTU9EVUxFX1BBUk1fREVTQyhtaW5vciwKLQkJICJtaW5vciBudW1iZXIgb2YgdGhlIG1pc2MgZGV2aWNlIGZvciB0aGUgU1BJQyBjb21wYXRpYmlsaXR5IGNvZGUsICIKLQkJICJkZWZhdWx0IGlzIC0xIChhdXRvbWF0aWMpIik7Ci0jZW5kaWYKLQotLyoqKioqKioqKioqIElucHV0IERldmljZXMgKioqKioqKioqKiovCi0KLSNkZWZpbmUgU09OWV9MQVBUT1BfQlVGX1NJWkUJMTI4Ci1zdHJ1Y3Qgc29ueV9sYXB0b3BfaW5wdXRfcyB7Ci0JYXRvbWljX3QJCXVzZXJzOwotCXN0cnVjdCBpbnB1dF9kZXYJKmpvZ19kZXY7Ci0Jc3RydWN0IGlucHV0X2Rldgkqa2V5X2RldjsKLQlzdHJ1Y3Qga2ZpZm8JCSpmaWZvOwotCXNwaW5sb2NrX3QJCWZpZm9fbG9jazsKLQlzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdAkqd3E7Ci19Owotc3RhdGljIHN0cnVjdCBzb255X2xhcHRvcF9pbnB1dF9zIHNvbnlfbGFwdG9wX2lucHV0ID0gewotCS51c2VycyA9IEFUT01JQ19JTklUKDApLAotfTsKLQotc3RydWN0IHNvbnlfbGFwdG9wX2tleXByZXNzIHsKLQlzdHJ1Y3QgaW5wdXRfZGV2ICpkZXY7Ci0JaW50IGtleTsKLX07Ci0KLS8qIENvcnJlc3BvbmRhbmNlIHRhYmxlIGJldHdlZW4gc29ueXBpIGV2ZW50cwotICogYW5kIGlucHV0IGxheWVyIGluZGV4ZXMgaW4gdGhlIGtleW1hcAotICovCi1zdGF0aWMgaW50IHNvbnlfbGFwdG9wX2lucHV0X2luZGV4W10gPSB7Ci0JLTEsCS8qICAwIG5vIGV2ZW50ICovCi0JLTEsCS8qICAxIFNPTllQSV9FVkVOVF9KT0dESUFMX0RPV04gKi8KLQktMSwJLyogIDIgU09OWVBJX0VWRU5UX0pPR0RJQUxfVVAgKi8KLQktMSwJLyogIDMgU09OWVBJX0VWRU5UX0pPR0RJQUxfRE9XTl9QUkVTU0VEICovCi0JLTEsCS8qICA0IFNPTllQSV9FVkVOVF9KT0dESUFMX1VQX1BSRVNTRUQgKi8KLQktMSwJLyogIDUgU09OWVBJX0VWRU5UX0pPR0RJQUxfUFJFU1NFRCAqLwotCS0xLAkvKiAgNiBTT05ZUElfRVZFTlRfSk9HRElBTF9SRUxFQVNFRCAqLwotCSAwLAkvKiAgNyBTT05ZUElfRVZFTlRfQ0FQVFVSRV9QUkVTU0VEICovCi0JIDEsCS8qICA4IFNPTllQSV9FVkVOVF9DQVBUVVJFX1JFTEVBU0VEICovCi0JIDIsCS8qICA5IFNPTllQSV9FVkVOVF9DQVBUVVJFX1BBUlRJQUxQUkVTU0VEICovCi0JIDMsCS8qIDEwIFNPTllQSV9FVkVOVF9DQVBUVVJFX1BBUlRJQUxSRUxFQVNFRCAqLwotCSA0LAkvKiAxMSBTT05ZUElfRVZFTlRfRk5LRVlfRVNDICovCi0JIDUsCS8qIDEyIFNPTllQSV9FVkVOVF9GTktFWV9GMSAqLwotCSA2LAkvKiAxMyBTT05ZUElfRVZFTlRfRk5LRVlfRjIgKi8KLQkgNywJLyogMTQgU09OWVBJX0VWRU5UX0ZOS0VZX0YzICovCi0JIDgsCS8qIDE1IFNPTllQSV9FVkVOVF9GTktFWV9GNCAqLwotCSA5LAkvKiAxNiBTT05ZUElfRVZFTlRfRk5LRVlfRjUgKi8KLQkxMCwJLyogMTcgU09OWVBJX0VWRU5UX0ZOS0VZX0Y2ICovCi0JMTEsCS8qIDE4IFNPTllQSV9FVkVOVF9GTktFWV9GNyAqLwotCTEyLAkvKiAxOSBTT05ZUElfRVZFTlRfRk5LRVlfRjggKi8KLQkxMywJLyogMjAgU09OWVBJX0VWRU5UX0ZOS0VZX0Y5ICovCi0JMTQsCS8qIDIxIFNPTllQSV9FVkVOVF9GTktFWV9GMTAgKi8KLQkxNSwJLyogMjIgU09OWVBJX0VWRU5UX0ZOS0VZX0YxMSAqLwotCTE2LAkvKiAyMyBTT05ZUElfRVZFTlRfRk5LRVlfRjEyICovCi0JMTcsCS8qIDI0IFNPTllQSV9FVkVOVF9GTktFWV8xICovCi0JMTgsCS8qIDI1IFNPTllQSV9FVkVOVF9GTktFWV8yICovCi0JMTksCS8qIDI2IFNPTllQSV9FVkVOVF9GTktFWV9EICovCi0JMjAsCS8qIDI3IFNPTllQSV9FVkVOVF9GTktFWV9FICovCi0JMjEsCS8qIDI4IFNPTllQSV9FVkVOVF9GTktFWV9GICovCi0JMjIsCS8qIDI5IFNPTllQSV9FVkVOVF9GTktFWV9TICovCi0JMjMsCS8qIDMwIFNPTllQSV9FVkVOVF9GTktFWV9CICovCi0JMjQsCS8qIDMxIFNPTllQSV9FVkVOVF9CTFVFVE9PVEhfUFJFU1NFRCAqLwotCTI1LAkvKiAzMiBTT05ZUElfRVZFTlRfUEtFWV9QMSAqLwotCTI2LAkvKiAzMyBTT05ZUElfRVZFTlRfUEtFWV9QMiAqLwotCTI3LAkvKiAzNCBTT05ZUElfRVZFTlRfUEtFWV9QMyAqLwotCTI4LAkvKiAzNSBTT05ZUElfRVZFTlRfQkFDS19QUkVTU0VEICovCi0JLTEsCS8qIDM2IFNPTllQSV9FVkVOVF9MSURfQ0xPU0VEICovCi0JLTEsCS8qIDM3IFNPTllQSV9FVkVOVF9MSURfT1BFTkVEICovCi0JMjksCS8qIDM4IFNPTllQSV9FVkVOVF9CTFVFVE9PVEhfT04gKi8KLQkzMCwJLyogMzkgU09OWVBJX0VWRU5UX0JMVUVUT09USF9PRkYgKi8KLQkzMSwJLyogNDAgU09OWVBJX0VWRU5UX0hFTFBfUFJFU1NFRCAqLwotCTMyLAkvKiA0MSBTT05ZUElfRVZFTlRfRk5LRVlfT05MWSAqLwotCTMzLAkvKiA0MiBTT05ZUElfRVZFTlRfSk9HRElBTF9GQVNUX0RPV04gKi8KLQkzNCwJLyogNDMgU09OWVBJX0VWRU5UX0pPR0RJQUxfRkFTVF9VUCAqLwotCTM1LAkvKiA0NCBTT05ZUElfRVZFTlRfSk9HRElBTF9GQVNUX0RPV05fUFJFU1NFRCAqLwotCTM2LAkvKiA0NSBTT05ZUElfRVZFTlRfSk9HRElBTF9GQVNUX1VQX1BSRVNTRUQgKi8KLQkzNywJLyogNDYgU09OWVBJX0VWRU5UX0pPR0RJQUxfVkZBU1RfRE9XTiAqLwotCTM4LAkvKiA0NyBTT05ZUElfRVZFTlRfSk9HRElBTF9WRkFTVF9VUCAqLwotCTM5LAkvKiA0OCBTT05ZUElfRVZFTlRfSk9HRElBTF9WRkFTVF9ET1dOX1BSRVNTRUQgKi8KLQk0MCwJLyogNDkgU09OWVBJX0VWRU5UX0pPR0RJQUxfVkZBU1RfVVBfUFJFU1NFRCAqLwotCTQxLAkvKiA1MCBTT05ZUElfRVZFTlRfWk9PTV9QUkVTU0VEICovCi0JNDIsCS8qIDUxIFNPTllQSV9FVkVOVF9USFVNQlBIUkFTRV9QUkVTU0VEICovCi0JNDMsCS8qIDUyIFNPTllQSV9FVkVOVF9NRVlFX0ZBQ0UgKi8KLQk0NCwJLyogNTMgU09OWVBJX0VWRU5UX01FWUVfT1BQT1NJVEUgKi8KLQk0NSwJLyogNTQgU09OWVBJX0VWRU5UX01FTU9SWVNUSUNLX0lOU0VSVCAqLwotCTQ2LAkvKiA1NSBTT05ZUElfRVZFTlRfTUVNT1JZU1RJQ0tfRUpFQ1QgKi8KLQktMSwJLyogNTYgU09OWVBJX0VWRU5UX0FOWUJVVFRPTl9SRUxFQVNFRCAqLwotCS0xLAkvKiA1NyBTT05ZUElfRVZFTlRfQkFUVEVSWV9JTlNFUlQgKi8KLQktMSwJLyogNTggU09OWVBJX0VWRU5UX0JBVFRFUllfUkVNT1ZFICovCi0JLTEsCS8qIDU5IFNPTllQSV9FVkVOVF9GTktFWV9SRUxFQVNFRCAqLwotCTQ3LAkvKiA2MCBTT05ZUElfRVZFTlRfV0lSRUxFU1NfT04gKi8KLQk0OCwJLyogNjEgU09OWVBJX0VWRU5UX1dJUkVMRVNTX09GRiAqLwotCTQ5LAkvKiA2MiBTT05ZUElfRVZFTlRfWk9PTV9JTl9QUkVTU0VEICovCi0JNTAsCS8qIDYzIFNPTllQSV9FVkVOVF9aT09NX09VVF9QUkVTU0VEICovCi19OwotCi1zdGF0aWMgaW50IHNvbnlfbGFwdG9wX2lucHV0X2tleWNvZGVfbWFwW10gPSB7Ci0JS0VZX0NBTUVSQSwJLyogIDAgU09OWVBJX0VWRU5UX0NBUFRVUkVfUFJFU1NFRCAqLwotCUtFWV9SRVNFUlZFRCwJLyogIDEgU09OWVBJX0VWRU5UX0NBUFRVUkVfUkVMRUFTRUQgKi8KLQlLRVlfUkVTRVJWRUQsCS8qICAyIFNPTllQSV9FVkVOVF9DQVBUVVJFX1BBUlRJQUxQUkVTU0VEICovCi0JS0VZX1JFU0VSVkVELAkvKiAgMyBTT05ZUElfRVZFTlRfQ0FQVFVSRV9QQVJUSUFMUkVMRUFTRUQgKi8KLQlLRVlfRk5fRVNDLAkvKiAgNCBTT05ZUElfRVZFTlRfRk5LRVlfRVNDICovCi0JS0VZX0ZOX0YxLAkvKiAgNSBTT05ZUElfRVZFTlRfRk5LRVlfRjEgKi8KLQlLRVlfRk5fRjIsCS8qICA2IFNPTllQSV9FVkVOVF9GTktFWV9GMiAqLwotCUtFWV9GTl9GMywJLyogIDcgU09OWVBJX0VWRU5UX0ZOS0VZX0YzICovCi0JS0VZX0ZOX0Y0LAkvKiAgOCBTT05ZUElfRVZFTlRfRk5LRVlfRjQgKi8KLQlLRVlfRk5fRjUsCS8qICA5IFNPTllQSV9FVkVOVF9GTktFWV9GNSAqLwotCUtFWV9GTl9GNiwJLyogMTAgU09OWVBJX0VWRU5UX0ZOS0VZX0Y2ICovCi0JS0VZX0ZOX0Y3LAkvKiAxMSBTT05ZUElfRVZFTlRfRk5LRVlfRjcgKi8KLQlLRVlfRk5fRjgsCS8qIDEyIFNPTllQSV9FVkVOVF9GTktFWV9GOCAqLwotCUtFWV9GTl9GOSwJLyogMTMgU09OWVBJX0VWRU5UX0ZOS0VZX0Y5ICovCi0JS0VZX0ZOX0YxMCwJLyogMTQgU09OWVBJX0VWRU5UX0ZOS0VZX0YxMCAqLwotCUtFWV9GTl9GMTEsCS8qIDE1IFNPTllQSV9FVkVOVF9GTktFWV9GMTEgKi8KLQlLRVlfRk5fRjEyLAkvKiAxNiBTT05ZUElfRVZFTlRfRk5LRVlfRjEyICovCi0JS0VZX0ZOX0YxLAkvKiAxNyBTT05ZUElfRVZFTlRfRk5LRVlfMSAqLwotCUtFWV9GTl9GMiwJLyogMTggU09OWVBJX0VWRU5UX0ZOS0VZXzIgKi8KLQlLRVlfRk5fRCwJLyogMTkgU09OWVBJX0VWRU5UX0ZOS0VZX0QgKi8KLQlLRVlfRk5fRSwJLyogMjAgU09OWVBJX0VWRU5UX0ZOS0VZX0UgKi8KLQlLRVlfRk5fRiwJLyogMjEgU09OWVBJX0VWRU5UX0ZOS0VZX0YgKi8KLQlLRVlfRk5fUywJLyogMjIgU09OWVBJX0VWRU5UX0ZOS0VZX1MgKi8KLQlLRVlfRk5fQiwJLyogMjMgU09OWVBJX0VWRU5UX0ZOS0VZX0IgKi8KLQlLRVlfQkxVRVRPT1RILAkvKiAyNCBTT05ZUElfRVZFTlRfQkxVRVRPT1RIX1BSRVNTRUQgKi8KLQlLRVlfUFJPRzEsCS8qIDI1IFNPTllQSV9FVkVOVF9QS0VZX1AxICovCi0JS0VZX1BST0cyLAkvKiAyNiBTT05ZUElfRVZFTlRfUEtFWV9QMiAqLwotCUtFWV9QUk9HMywJLyogMjcgU09OWVBJX0VWRU5UX1BLRVlfUDMgKi8KLQlLRVlfQkFDSywJLyogMjggU09OWVBJX0VWRU5UX0JBQ0tfUFJFU1NFRCAqLwotCUtFWV9CTFVFVE9PVEgsCS8qIDI5IFNPTllQSV9FVkVOVF9CTFVFVE9PVEhfT04gKi8KLQlLRVlfQkxVRVRPT1RILAkvKiAzMCBTT05ZUElfRVZFTlRfQkxVRVRPT1RIX09GRiAqLwotCUtFWV9IRUxQLAkvKiAzMSBTT05ZUElfRVZFTlRfSEVMUF9QUkVTU0VEICovCi0JS0VZX0ZOLAkJLyogMzIgU09OWVBJX0VWRU5UX0ZOS0VZX09OTFkgKi8KLQlLRVlfUkVTRVJWRUQsCS8qIDMzIFNPTllQSV9FVkVOVF9KT0dESUFMX0ZBU1RfRE9XTiAqLwotCUtFWV9SRVNFUlZFRCwJLyogMzQgU09OWVBJX0VWRU5UX0pPR0RJQUxfRkFTVF9VUCAqLwotCUtFWV9SRVNFUlZFRCwJLyogMzUgU09OWVBJX0VWRU5UX0pPR0RJQUxfRkFTVF9ET1dOX1BSRVNTRUQgKi8KLQlLRVlfUkVTRVJWRUQsCS8qIDM2IFNPTllQSV9FVkVOVF9KT0dESUFMX0ZBU1RfVVBfUFJFU1NFRCAqLwotCUtFWV9SRVNFUlZFRCwJLyogMzcgU09OWVBJX0VWRU5UX0pPR0RJQUxfVkZBU1RfRE9XTiAqLwotCUtFWV9SRVNFUlZFRCwJLyogMzggU09OWVBJX0VWRU5UX0pPR0RJQUxfVkZBU1RfVVAgKi8KLQlLRVlfUkVTRVJWRUQsCS8qIDM5IFNPTllQSV9FVkVOVF9KT0dESUFMX1ZGQVNUX0RPV05fUFJFU1NFRCAqLwotCUtFWV9SRVNFUlZFRCwJLyogNDAgU09OWVBJX0VWRU5UX0pPR0RJQUxfVkZBU1RfVVBfUFJFU1NFRCAqLwotCUtFWV9aT09NLAkvKiA0MSBTT05ZUElfRVZFTlRfWk9PTV9QUkVTU0VEICovCi0JQlROX1RIVU1CLAkvKiA0MiBTT05ZUElfRVZFTlRfVEhVTUJQSFJBU0VfUFJFU1NFRCAqLwotCUtFWV9SRVNFUlZFRCwJLyogNDMgU09OWVBJX0VWRU5UX01FWUVfRkFDRSAqLwotCUtFWV9SRVNFUlZFRCwJLyogNDQgU09OWVBJX0VWRU5UX01FWUVfT1BQT1NJVEUgKi8KLQlLRVlfUkVTRVJWRUQsCS8qIDQ1IFNPTllQSV9FVkVOVF9NRU1PUllTVElDS19JTlNFUlQgKi8KLQlLRVlfUkVTRVJWRUQsCS8qIDQ2IFNPTllQSV9FVkVOVF9NRU1PUllTVElDS19FSkVDVCAqLwotCUtFWV9XTEFOLAkvKiA0NyBTT05ZUElfRVZFTlRfV0lSRUxFU1NfT04gKi8KLQlLRVlfV0xBTiwJLyogNDggU09OWVBJX0VWRU5UX1dJUkVMRVNTX09GRiAqLwotCUtFWV9aT09NSU4sCS8qIDQ5IFNPTllQSV9FVkVOVF9aT09NX0lOX1BSRVNTRUQgKi8KLQlLRVlfWk9PTU9VVAkvKiA1MCBTT05ZUElfRVZFTlRfWk9PTV9PVVRfUFJFU1NFRCAqLwotfTsKLQotLyogcmVsZWFzZSBidXR0b25zIGFmdGVyIGEgc2hvcnQgZGVsYXkgaWYgcHJlc3NlZCAqLwotc3RhdGljIHZvaWQgZG9fc29ueV9sYXB0b3BfcmVsZWFzZV9rZXkoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQotewotCXN0cnVjdCBzb255X2xhcHRvcF9rZXlwcmVzcyBrcDsKLQotCXdoaWxlIChrZmlmb19nZXQoc29ueV9sYXB0b3BfaW5wdXQuZmlmbywgKHVuc2lnbmVkIGNoYXIgKikma3AsCi0JCQkgc2l6ZW9mKGtwKSkgPT0gc2l6ZW9mKGtwKSkgewotCQltc2xlZXAoMTApOwotCQlpbnB1dF9yZXBvcnRfa2V5KGtwLmRldiwga3Aua2V5LCAwKTsKLQkJaW5wdXRfc3luYyhrcC5kZXYpOwotCX0KLX0KLXN0YXRpYyBERUNMQVJFX1dPUksoc29ueV9sYXB0b3BfcmVsZWFzZV9rZXlfd29yaywKLQkJZG9fc29ueV9sYXB0b3BfcmVsZWFzZV9rZXkpOwotCi0vKiBmb3J3YXJkIGV2ZW50IHRvIHRoZSBpbnB1dCBzdWJzeXN0ZW0gKi8KLXN0YXRpYyB2b2lkIHNvbnlfbGFwdG9wX3JlcG9ydF9pbnB1dF9ldmVudCh1OCBldmVudCkKLXsKLQlzdHJ1Y3QgaW5wdXRfZGV2ICpqb2dfZGV2ID0gc29ueV9sYXB0b3BfaW5wdXQuam9nX2RldjsKLQlzdHJ1Y3QgaW5wdXRfZGV2ICprZXlfZGV2ID0gc29ueV9sYXB0b3BfaW5wdXQua2V5X2RldjsKLQlzdHJ1Y3Qgc29ueV9sYXB0b3Bfa2V5cHJlc3Mga3AgPSB7IE5VTEwgfTsKLQotCWlmIChldmVudCA9PSBTT05ZUElfRVZFTlRfRk5LRVlfUkVMRUFTRUQpIHsKLQkJLyogTm90aGluZywgbm90IGFsbCBWQUlPcyBnZW5lcmF0ZSB0aGlzIGV2ZW50ICovCi0JCXJldHVybjsKLQl9Ci0KLQkvKiByZXBvcnQgZXZlbnRzICovCi0Jc3dpdGNoIChldmVudCkgewotCS8qIGpvZ19kZXYgZXZlbnRzICovCi0JY2FzZSBTT05ZUElfRVZFTlRfSk9HRElBTF9VUDoKLQljYXNlIFNPTllQSV9FVkVOVF9KT0dESUFMX1VQX1BSRVNTRUQ6Ci0JCWlucHV0X3JlcG9ydF9yZWwoam9nX2RldiwgUkVMX1dIRUVMLCAxKTsKLQkJaW5wdXRfc3luYyhqb2dfZGV2KTsKLQkJcmV0dXJuOwotCi0JY2FzZSBTT05ZUElfRVZFTlRfSk9HRElBTF9ET1dOOgotCWNhc2UgU09OWVBJX0VWRU5UX0pPR0RJQUxfRE9XTl9QUkVTU0VEOgotCQlpbnB1dF9yZXBvcnRfcmVsKGpvZ19kZXYsIFJFTF9XSEVFTCwgLTEpOwotCQlpbnB1dF9zeW5jKGpvZ19kZXYpOwotCQlyZXR1cm47Ci0KLQkvKiBrZXlfZGV2IGV2ZW50cyAqLwotCWNhc2UgU09OWVBJX0VWRU5UX0pPR0RJQUxfUFJFU1NFRDoKLQkJa3Aua2V5ID0gQlROX01JRERMRTsKLQkJa3AuZGV2ID0gam9nX2RldjsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlpZiAoZXZlbnQgPj0gQVJSQVlfU0laRShzb255X2xhcHRvcF9pbnB1dF9pbmRleCkpIHsKLQkJCWRwcmludGsoInNvbnlfbGFwdG9wX3JlcG9ydF9pbnB1dF9ldmVudCwgZXZlbnQgbm90IGtub3duOiAlZFxuIiwgZXZlbnQpOwotCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKHNvbnlfbGFwdG9wX2lucHV0X2luZGV4W2V2ZW50XSAhPSAtMSkgewotCQkJa3Aua2V5ID0gc29ueV9sYXB0b3BfaW5wdXRfa2V5Y29kZV9tYXBbc29ueV9sYXB0b3BfaW5wdXRfaW5kZXhbZXZlbnRdXTsKLQkJCWlmIChrcC5rZXkgIT0gS0VZX1VOS05PV04pCi0JCQkJa3AuZGV2ID0ga2V5X2RldjsKLQkJfQotCQlicmVhazsKLQl9Ci0KLQlpZiAoa3AuZGV2KSB7Ci0JCWlucHV0X3JlcG9ydF9rZXkoa3AuZGV2LCBrcC5rZXksIDEpOwotCQkvKiB3ZSBlbWl0IHRoZSBzY2FuY29kZSBzbyB3ZSBjYW4gYWx3YXlzIHJlbWFwIHRoZSBrZXkgKi8KLQkJaW5wdXRfZXZlbnQoa3AuZGV2LCBFVl9NU0MsIE1TQ19TQ0FOLCBldmVudCk7Ci0JCWlucHV0X3N5bmMoa3AuZGV2KTsKLQkJa2ZpZm9fcHV0KHNvbnlfbGFwdG9wX2lucHV0LmZpZm8sCi0JCQkgICh1bnNpZ25lZCBjaGFyICopJmtwLCBzaXplb2Yoa3ApKTsKLQotCQlpZiAoIXdvcmtfcGVuZGluZygmc29ueV9sYXB0b3BfcmVsZWFzZV9rZXlfd29yaykpCi0JCQlxdWV1ZV93b3JrKHNvbnlfbGFwdG9wX2lucHV0LndxLAotCQkJCQkmc29ueV9sYXB0b3BfcmVsZWFzZV9rZXlfd29yayk7Ci0JfSBlbHNlCi0JCWRwcmludGsoInVua25vd24gaW5wdXQgZXZlbnQgJS4yeFxuIiwgZXZlbnQpOwotfQotCi1zdGF0aWMgaW50IHNvbnlfbGFwdG9wX3NldHVwX2lucHV0KHN0cnVjdCBhY3BpX2RldmljZSAqYWNwaV9kZXZpY2UpCi17Ci0Jc3RydWN0IGlucHV0X2RldiAqam9nX2RldjsKLQlzdHJ1Y3QgaW5wdXRfZGV2ICprZXlfZGV2OwotCWludCBpOwotCWludCBlcnJvcjsKLQotCS8qIGRvbid0IHJ1biBhZ2FpbiBpZiBhbHJlYWR5IGluaXRpYWxpemVkICovCi0JaWYgKGF0b21pY19hZGRfcmV0dXJuKDEsICZzb255X2xhcHRvcF9pbnB1dC51c2VycykgPiAxKQotCQlyZXR1cm4gMDsKLQotCS8qIGtmaWZvICovCi0Jc3Bpbl9sb2NrX2luaXQoJnNvbnlfbGFwdG9wX2lucHV0LmZpZm9fbG9jayk7Ci0Jc29ueV9sYXB0b3BfaW5wdXQuZmlmbyA9Ci0JCWtmaWZvX2FsbG9jKFNPTllfTEFQVE9QX0JVRl9TSVpFLCBHRlBfS0VSTkVMLAotCQkJICAgICZzb255X2xhcHRvcF9pbnB1dC5maWZvX2xvY2spOwotCWlmIChJU19FUlIoc29ueV9sYXB0b3BfaW5wdXQuZmlmbykpIHsKLQkJcHJpbnRrKEtFUk5fRVJSIERSVl9QRlggImtmaWZvX2FsbG9jIGZhaWxlZFxuIik7Ci0JCWVycm9yID0gUFRSX0VSUihzb255X2xhcHRvcF9pbnB1dC5maWZvKTsKLQkJZ290byBlcnJfZGVjX3VzZXJzOwotCX0KLQotCS8qIGluaXQgd29ya3F1ZXVlICovCi0Jc29ueV9sYXB0b3BfaW5wdXQud3EgPSBjcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZSgic29ueS1sYXB0b3AiKTsKLQlpZiAoIXNvbnlfbGFwdG9wX2lucHV0LndxKSB7Ci0JCXByaW50ayhLRVJOX0VSUiBEUlZfUEZYCi0JCQkJIlVuYWJlIHRvIGNyZWF0ZSB3b3JrcXVldWUuXG4iKTsKLQkJZXJyb3IgPSAtRU5YSU87Ci0JCWdvdG8gZXJyX2ZyZWVfa2ZpZm87Ci0JfQotCi0JLyogaW5wdXQga2V5cyAqLwotCWtleV9kZXYgPSBpbnB1dF9hbGxvY2F0ZV9kZXZpY2UoKTsKLQlpZiAoIWtleV9kZXYpIHsKLQkJZXJyb3IgPSAtRU5PTUVNOwotCQlnb3RvIGVycl9kZXN0cm95X3dxOwotCX0KLQotCWtleV9kZXYtPm5hbWUgPSAiU29ueSBWYWlvIEtleXMiOwotCWtleV9kZXYtPmlkLmJ1c3R5cGUgPSBCVVNfSVNBOwotCWtleV9kZXYtPmlkLnZlbmRvciA9IFBDSV9WRU5ET1JfSURfU09OWTsKLQlrZXlfZGV2LT5kZXYucGFyZW50ID0gJmFjcGlfZGV2aWNlLT5kZXY7Ci0KLQkvKiBJbml0aWFsaXplIHRoZSBJbnB1dCBEcml2ZXJzOiBzcGVjaWFsIGtleXMgKi8KLQlzZXRfYml0KEVWX0tFWSwga2V5X2Rldi0+ZXZiaXQpOwotCXNldF9iaXQoRVZfTVNDLCBrZXlfZGV2LT5ldmJpdCk7Ci0Jc2V0X2JpdChNU0NfU0NBTiwga2V5X2Rldi0+bXNjYml0KTsKLQlrZXlfZGV2LT5rZXljb2Rlc2l6ZSA9IHNpemVvZihzb255X2xhcHRvcF9pbnB1dF9rZXljb2RlX21hcFswXSk7Ci0Ja2V5X2Rldi0+a2V5Y29kZW1heCA9IEFSUkFZX1NJWkUoc29ueV9sYXB0b3BfaW5wdXRfa2V5Y29kZV9tYXApOwotCWtleV9kZXYtPmtleWNvZGUgPSAmc29ueV9sYXB0b3BfaW5wdXRfa2V5Y29kZV9tYXA7Ci0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoc29ueV9sYXB0b3BfaW5wdXRfa2V5Y29kZV9tYXApOyBpKyspIHsKLQkJaWYgKHNvbnlfbGFwdG9wX2lucHV0X2tleWNvZGVfbWFwW2ldICE9IEtFWV9SRVNFUlZFRCkgewotCQkJc2V0X2JpdChzb255X2xhcHRvcF9pbnB1dF9rZXljb2RlX21hcFtpXSwKLQkJCQlrZXlfZGV2LT5rZXliaXQpOwotCQl9Ci0JfQotCi0JZXJyb3IgPSBpbnB1dF9yZWdpc3Rlcl9kZXZpY2Uoa2V5X2Rldik7Ci0JaWYgKGVycm9yKQotCQlnb3RvIGVycl9mcmVlX2tleWRldjsKLQotCXNvbnlfbGFwdG9wX2lucHV0LmtleV9kZXYgPSBrZXlfZGV2OwotCi0JLyogam9nZGlhbCAqLwotCWpvZ19kZXYgPSBpbnB1dF9hbGxvY2F0ZV9kZXZpY2UoKTsKLQlpZiAoIWpvZ19kZXYpIHsKLQkJZXJyb3IgPSAtRU5PTUVNOwotCQlnb3RvIGVycl91bnJlZ2lzdGVyX2tleWRldjsKLQl9Ci0KLQlqb2dfZGV2LT5uYW1lID0gIlNvbnkgVmFpbyBKb2dkaWFsIjsKLQlqb2dfZGV2LT5pZC5idXN0eXBlID0gQlVTX0lTQTsKLQlqb2dfZGV2LT5pZC52ZW5kb3IgPSBQQ0lfVkVORE9SX0lEX1NPTlk7Ci0Ja2V5X2Rldi0+ZGV2LnBhcmVudCA9ICZhY3BpX2RldmljZS0+ZGV2OwotCi0Jam9nX2Rldi0+ZXZiaXRbMF0gPSBCSVRfTUFTSyhFVl9LRVkpIHwgQklUX01BU0soRVZfUkVMKTsKLQlqb2dfZGV2LT5rZXliaXRbQklUX1dPUkQoQlROX01PVVNFKV0gPSBCSVRfTUFTSyhCVE5fTUlERExFKTsKLQlqb2dfZGV2LT5yZWxiaXRbMF0gPSBCSVRfTUFTSyhSRUxfV0hFRUwpOwotCi0JZXJyb3IgPSBpbnB1dF9yZWdpc3Rlcl9kZXZpY2Uoam9nX2Rldik7Ci0JaWYgKGVycm9yKQotCQlnb3RvIGVycl9mcmVlX2pvZ2RldjsKLQotCXNvbnlfbGFwdG9wX2lucHV0LmpvZ19kZXYgPSBqb2dfZGV2OwotCi0JcmV0dXJuIDA7Ci0KLWVycl9mcmVlX2pvZ2RldjoKLQlpbnB1dF9mcmVlX2RldmljZShqb2dfZGV2KTsKLQotZXJyX3VucmVnaXN0ZXJfa2V5ZGV2OgotCWlucHV0X3VucmVnaXN0ZXJfZGV2aWNlKGtleV9kZXYpOwotCS8qIHRvIGF2b2lkIGtyZWYgdW5kZXJmbG93IGJlbG93IGF0IGlucHV0X2ZyZWVfZGV2aWNlICovCi0Ja2V5X2RldiA9IE5VTEw7Ci0KLWVycl9mcmVlX2tleWRldjoKLQlpbnB1dF9mcmVlX2RldmljZShrZXlfZGV2KTsKLQotZXJyX2Rlc3Ryb3lfd3E6Ci0JZGVzdHJveV93b3JrcXVldWUoc29ueV9sYXB0b3BfaW5wdXQud3EpOwotCi1lcnJfZnJlZV9rZmlmbzoKLQlrZmlmb19mcmVlKHNvbnlfbGFwdG9wX2lucHV0LmZpZm8pOwotCi1lcnJfZGVjX3VzZXJzOgotCWF0b21pY19kZWMoJnNvbnlfbGFwdG9wX2lucHV0LnVzZXJzKTsKLQlyZXR1cm4gZXJyb3I7Ci19Ci0KLXN0YXRpYyB2b2lkIHNvbnlfbGFwdG9wX3JlbW92ZV9pbnB1dCh2b2lkKQotewotCS8qIGNsZWFudXAgb25seSBhZnRlciB0aGUgbGFzdCB1c2VyIGhhcyBnb25lICovCi0JaWYgKCFhdG9taWNfZGVjX2FuZF90ZXN0KCZzb255X2xhcHRvcF9pbnB1dC51c2VycykpCi0JCXJldHVybjsKLQotCS8qIGZsdXNoIHdvcmtxdWV1ZSBmaXJzdCAqLwotCWZsdXNoX3dvcmtxdWV1ZShzb255X2xhcHRvcF9pbnB1dC53cSk7Ci0KLQkvKiBkZXN0cm95IGlucHV0IGRldnMgKi8KLQlpbnB1dF91bnJlZ2lzdGVyX2RldmljZShzb255X2xhcHRvcF9pbnB1dC5rZXlfZGV2KTsKLQlzb255X2xhcHRvcF9pbnB1dC5rZXlfZGV2ID0gTlVMTDsKLQotCWlmIChzb255X2xhcHRvcF9pbnB1dC5qb2dfZGV2KSB7Ci0JCWlucHV0X3VucmVnaXN0ZXJfZGV2aWNlKHNvbnlfbGFwdG9wX2lucHV0LmpvZ19kZXYpOwotCQlzb255X2xhcHRvcF9pbnB1dC5qb2dfZGV2ID0gTlVMTDsKLQl9Ci0KLQlkZXN0cm95X3dvcmtxdWV1ZShzb255X2xhcHRvcF9pbnB1dC53cSk7Ci0Ja2ZpZm9fZnJlZShzb255X2xhcHRvcF9pbnB1dC5maWZvKTsKLX0KLQotLyoqKioqKioqKioqIFBsYXRmb3JtIERldmljZSAqKioqKioqKioqKi8KLQotc3RhdGljIGF0b21pY190IHNvbnlfcGZfdXNlcnMgPSBBVE9NSUNfSU5JVCgwKTsKLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHNvbnlfcGZfZHJpdmVyID0gewotCS5kcml2ZXIgPSB7Ci0JCSAgIC5uYW1lID0gInNvbnktbGFwdG9wIiwKLQkJICAgLm93bmVyID0gVEhJU19NT0RVTEUsCi0JCSAgIH0KLX07Ci1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqc29ueV9wZl9kZXZpY2U7Ci0KLXN0YXRpYyBpbnQgc29ueV9wZl9hZGQodm9pZCkKLXsKLQlpbnQgcmV0ID0gMDsKLQotCS8qIGRvbid0IHJ1biBhZ2FpbiBpZiBhbHJlYWR5IGluaXRpYWxpemVkICovCi0JaWYgKGF0b21pY19hZGRfcmV0dXJuKDEsICZzb255X3BmX3VzZXJzKSA+IDEpCi0JCXJldHVybiAwOwotCi0JcmV0ID0gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZzb255X3BmX2RyaXZlcik7Ci0JaWYgKHJldCkKLQkJZ290byBvdXQ7Ci0KLQlzb255X3BmX2RldmljZSA9IHBsYXRmb3JtX2RldmljZV9hbGxvYygic29ueS1sYXB0b3AiLCAtMSk7Ci0JaWYgKCFzb255X3BmX2RldmljZSkgewotCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIG91dF9wbGF0Zm9ybV9yZWdpc3RlcmVkOwotCX0KLQotCXJldCA9IHBsYXRmb3JtX2RldmljZV9hZGQoc29ueV9wZl9kZXZpY2UpOwotCWlmIChyZXQpCi0JCWdvdG8gb3V0X3BsYXRmb3JtX2FsbG9jZWQ7Ci0KLQlyZXR1cm4gMDsKLQotICAgICAgb3V0X3BsYXRmb3JtX2FsbG9jZWQ6Ci0JcGxhdGZvcm1fZGV2aWNlX3B1dChzb255X3BmX2RldmljZSk7Ci0Jc29ueV9wZl9kZXZpY2UgPSBOVUxMOwotICAgICAgb3V0X3BsYXRmb3JtX3JlZ2lzdGVyZWQ6Ci0JcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnNvbnlfcGZfZHJpdmVyKTsKLSAgICAgIG91dDoKLQlhdG9taWNfZGVjKCZzb255X3BmX3VzZXJzKTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdm9pZCBzb255X3BmX3JlbW92ZSh2b2lkKQotewotCS8qIGRlcmVnaXN0ZXIgb25seSBhZnRlciB0aGUgbGFzdCB1c2VyIGhhcyBnb25lICovCi0JaWYgKCFhdG9taWNfZGVjX2FuZF90ZXN0KCZzb255X3BmX3VzZXJzKSkKLQkJcmV0dXJuOwotCi0JcGxhdGZvcm1fZGV2aWNlX2RlbChzb255X3BmX2RldmljZSk7Ci0JcGxhdGZvcm1fZGV2aWNlX3B1dChzb255X3BmX2RldmljZSk7Ci0JcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnNvbnlfcGZfZHJpdmVyKTsKLX0KLQotLyoqKioqKioqKioqIFNOQyAoU05ZNTAwMSkgRGV2aWNlICoqKioqKioqKioqLwotCi0vKiB0aGUgZGV2aWNlIHVzZXMgMS1iYXNlZCB2YWx1ZXMsIHdoaWxlIHRoZSBiYWNrbGlnaHQgc3Vic3lzdGVtIHVzZXMKLSAgIDAtYmFzZWQgdmFsdWVzICovCi0jZGVmaW5lIFNPTllfTUFYX0JSSUdIVE5FU1MJOAotCi0jZGVmaW5lIFNOQ19WQUxJREFURV9JTgkJMAotI2RlZmluZSBTTkNfVkFMSURBVEVfT1VUCTEKLQotc3RhdGljIHNzaXplX3Qgc29ueV9uY19zeXNmc19zaG93KHN0cnVjdCBkZXZpY2UgKiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKiwKLQkJCSAgICAgIGNoYXIgKik7Ci1zdGF0aWMgc3NpemVfdCBzb255X25jX3N5c2ZzX3N0b3JlKHN0cnVjdCBkZXZpY2UgKiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKiwKLQkJCSAgICAgICBjb25zdCBjaGFyICosIHNpemVfdCk7Ci1zdGF0aWMgaW50IGJvb2xlYW5fdmFsaWRhdGUoY29uc3QgaW50LCBjb25zdCBpbnQpOwotc3RhdGljIGludCBicmlnaHRuZXNzX2RlZmF1bHRfdmFsaWRhdGUoY29uc3QgaW50LCBjb25zdCBpbnQpOwotCi1zdHJ1Y3Qgc29ueV9uY192YWx1ZSB7Ci0JY2hhciAqbmFtZTsJCS8qIG5hbWUgb2YgdGhlIGVudHJ5ICovCi0JY2hhciAqKmFjcGlnZXQ7CQkvKiBuYW1lcyBvZiB0aGUgQUNQSSBnZXQgZnVuY3Rpb24gKi8KLQljaGFyICoqYWNwaXNldDsJCS8qIG5hbWVzIG9mIHRoZSBBQ1BJIHNldCBmdW5jdGlvbiAqLwotCWludCAoKnZhbGlkYXRlKShjb25zdCBpbnQsIGNvbnN0IGludCk7CS8qIGlucHV0L291dHB1dCB2YWxpZGF0aW9uICovCi0JaW50IHZhbHVlOwkJLyogY3VycmVudCBzZXR0aW5nICovCi0JaW50IHZhbGlkOwkJLyogSGFzIGV2ZXIgYmVlbiBzZXQgKi8KLQlpbnQgZGVidWc7CQkvKiBhY3RpdmUgb25seSBpbiBkZWJ1ZyBtb2RlID8gKi8KLQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSBkZXZhdHRyOwkvKiBzeXNmcyBhdHJpYnV0ZSAqLwotfTsKLQotI2RlZmluZSBTTkNfSEFORExFX05BTUVTKF9uYW1lLCBfdmFsdWVzLi4uKSBcCi0Jc3RhdGljIGNoYXIgKnNuY18jI19uYW1lW10gPSB7IF92YWx1ZXMsIE5VTEwgfQotCi0jZGVmaW5lIFNOQ19IQU5ETEUoX25hbWUsIF9nZXR0ZXJzLCBfc2V0dGVycywgX3ZhbGlkYXRlLCBfZGVidWcpIFwKLQl7IFwKLQkJLm5hbWUJCT0gX19zdHJpbmdpZnkoX25hbWUpLCBcCi0JCS5hY3BpZ2V0CT0gX2dldHRlcnMsIFwKLQkJLmFjcGlzZXQJPSBfc2V0dGVycywgXAotCQkudmFsaWRhdGUJPSBfdmFsaWRhdGUsIFwKLQkJLmRlYnVnCQk9IF9kZWJ1ZywgXAotCQkuZGV2YXR0cgk9IF9fQVRUUihfbmFtZSwgMCwgc29ueV9uY19zeXNmc19zaG93LCBzb255X25jX3N5c2ZzX3N0b3JlKSwgXAotCX0KLQotI2RlZmluZSBTTkNfSEFORExFX05VTEwJeyAubmFtZSA9IE5VTEwgfQotCi1TTkNfSEFORExFX05BTUVTKGZua2V5X2dldCwgIkdIS0UiKTsKLQotU05DX0hBTkRMRV9OQU1FUyhicmlnaHRuZXNzX2RlZl9nZXQsICJHUEJSIik7Ci1TTkNfSEFORExFX05BTUVTKGJyaWdodG5lc3NfZGVmX3NldCwgIlNQQlIiKTsKLQotU05DX0hBTkRMRV9OQU1FUyhjZHBvd2VyX2dldCwgIkdDRFAiKTsKLVNOQ19IQU5ETEVfTkFNRVMoY2Rwb3dlcl9zZXQsICJTQ0RQIiwgIkNEUFciKTsKLQotU05DX0hBTkRMRV9OQU1FUyhhdWRpb3Bvd2VyX2dldCwgIkdBWlAiKTsKLVNOQ19IQU5ETEVfTkFNRVMoYXVkaW9wb3dlcl9zZXQsICJBWlBXIik7Ci0KLVNOQ19IQU5ETEVfTkFNRVMobGFucG93ZXJfZ2V0LCAiR0xOUCIpOwotU05DX0hBTkRMRV9OQU1FUyhsYW5wb3dlcl9zZXQsICJMTlBXIik7Ci0KLVNOQ19IQU5ETEVfTkFNRVMobGlkc3RhdGVfZ2V0LCAiR0xJRCIpOwotCi1TTkNfSEFORExFX05BTUVTKGluZGljYXRvcmxhbXBfZ2V0LCAiR0lMUyIpOwotU05DX0hBTkRMRV9OQU1FUyhpbmRpY2F0b3JsYW1wX3NldCwgIlNJTFMiKTsKLQotU05DX0hBTkRMRV9OQU1FUyhnYWluYmFzc19nZXQsICJHTUdCIik7Ci1TTkNfSEFORExFX05BTUVTKGdhaW5iYXNzX3NldCwgIkNNR0IiKTsKLQotU05DX0hBTkRMRV9OQU1FUyhQSURfZ2V0LCAiR1BJRCIpOwotCi1TTkNfSEFORExFX05BTUVTKENUUl9nZXQsICJHQ1RSIik7Ci1TTkNfSEFORExFX05BTUVTKENUUl9zZXQsICJTQ1RSIik7Ci0KLVNOQ19IQU5ETEVfTkFNRVMoUENSX2dldCwgIkdQQ1IiKTsKLVNOQ19IQU5ETEVfTkFNRVMoUENSX3NldCwgIlNQQ1IiKTsKLQotU05DX0hBTkRMRV9OQU1FUyhDTUlfZ2V0LCAiR0NNSSIpOwotU05DX0hBTkRMRV9OQU1FUyhDTUlfc2V0LCAiU0NNSSIpOwotCi1zdGF0aWMgc3RydWN0IHNvbnlfbmNfdmFsdWUgc29ueV9uY192YWx1ZXNbXSA9IHsKLQlTTkNfSEFORExFKGJyaWdodG5lc3NfZGVmYXVsdCwgc25jX2JyaWdodG5lc3NfZGVmX2dldCwKLQkJCXNuY19icmlnaHRuZXNzX2RlZl9zZXQsIGJyaWdodG5lc3NfZGVmYXVsdF92YWxpZGF0ZSwgMCksCi0JU05DX0hBTkRMRShmbmtleSwgc25jX2Zua2V5X2dldCwgTlVMTCwgTlVMTCwgMCksCi0JU05DX0hBTkRMRShjZHBvd2VyLCBzbmNfY2Rwb3dlcl9nZXQsIHNuY19jZHBvd2VyX3NldCwgYm9vbGVhbl92YWxpZGF0ZSwgMCksCi0JU05DX0hBTkRMRShhdWRpb3Bvd2VyLCBzbmNfYXVkaW9wb3dlcl9nZXQsIHNuY19hdWRpb3Bvd2VyX3NldCwKLQkJCWJvb2xlYW5fdmFsaWRhdGUsIDApLAotCVNOQ19IQU5ETEUobGFucG93ZXIsIHNuY19sYW5wb3dlcl9nZXQsIHNuY19sYW5wb3dlcl9zZXQsCi0JCQlib29sZWFuX3ZhbGlkYXRlLCAxKSwKLQlTTkNfSEFORExFKGxpZHN0YXRlLCBzbmNfbGlkc3RhdGVfZ2V0LCBOVUxMLAotCQkJYm9vbGVhbl92YWxpZGF0ZSwgMCksCi0JU05DX0hBTkRMRShpbmRpY2F0b3JsYW1wLCBzbmNfaW5kaWNhdG9ybGFtcF9nZXQsIHNuY19pbmRpY2F0b3JsYW1wX3NldCwKLQkJCWJvb2xlYW5fdmFsaWRhdGUsIDApLAotCVNOQ19IQU5ETEUoZ2FpbmJhc3MsIHNuY19nYWluYmFzc19nZXQsIHNuY19nYWluYmFzc19zZXQsCi0JCQlib29sZWFuX3ZhbGlkYXRlLCAwKSwKLQkvKiB1bmtub3duIG1ldGhvZHMgKi8KLQlTTkNfSEFORExFKFBJRCwgc25jX1BJRF9nZXQsIE5VTEwsIE5VTEwsIDEpLAotCVNOQ19IQU5ETEUoQ1RSLCBzbmNfQ1RSX2dldCwgc25jX0NUUl9zZXQsIE5VTEwsIDEpLAotCVNOQ19IQU5ETEUoUENSLCBzbmNfUENSX2dldCwgc25jX1BDUl9zZXQsIE5VTEwsIDEpLAotCVNOQ19IQU5ETEUoQ01JLCBzbmNfQ01JX2dldCwgc25jX0NNSV9zZXQsIE5VTEwsIDEpLAotCVNOQ19IQU5ETEVfTlVMTAotfTsKLQotc3RhdGljIGFjcGlfaGFuZGxlIHNvbnlfbmNfYWNwaV9oYW5kbGU7Ci1zdGF0aWMgc3RydWN0IGFjcGlfZGV2aWNlICpzb255X25jX2FjcGlfZGV2aWNlID0gTlVMTDsKLQotLyoKLSAqIGFjcGlfZXZhbHVhdGVfb2JqZWN0IHdyYXBwZXJzCi0gKi8KLXN0YXRpYyBpbnQgYWNwaV9jYWxsZ2V0ZnVuYyhhY3BpX2hhbmRsZSBoYW5kbGUsIGNoYXIgKm5hbWUsIGludCAqcmVzdWx0KQotewotCXN0cnVjdCBhY3BpX2J1ZmZlciBvdXRwdXQ7Ci0JdW5pb24gYWNwaV9vYmplY3Qgb3V0X29iajsKLQlhY3BpX3N0YXR1cyBzdGF0dXM7Ci0KLQlvdXRwdXQubGVuZ3RoID0gc2l6ZW9mKG91dF9vYmopOwotCW91dHB1dC5wb2ludGVyID0gJm91dF9vYmo7Ci0KLQlzdGF0dXMgPSBhY3BpX2V2YWx1YXRlX29iamVjdChoYW5kbGUsIG5hbWUsIE5VTEwsICZvdXRwdXQpOwotCWlmICgoc3RhdHVzID09IEFFX09LKSAmJiAob3V0X29iai50eXBlID09IEFDUElfVFlQRV9JTlRFR0VSKSkgewotCQkqcmVzdWx0ID0gb3V0X29iai5pbnRlZ2VyLnZhbHVlOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlwcmludGsoS0VSTl9XQVJOSU5HIERSVl9QRlggImFjcGlfY2FsbHJlYWRmdW5jIGZhaWxlZFxuIik7Ci0KLQlyZXR1cm4gLTE7Ci19Ci0KLXN0YXRpYyBpbnQgYWNwaV9jYWxsc2V0ZnVuYyhhY3BpX2hhbmRsZSBoYW5kbGUsIGNoYXIgKm5hbWUsIGludCB2YWx1ZSwKLQkJCSAgICBpbnQgKnJlc3VsdCkKLXsKLQlzdHJ1Y3QgYWNwaV9vYmplY3RfbGlzdCBwYXJhbXM7Ci0JdW5pb24gYWNwaV9vYmplY3QgaW5fb2JqOwotCXN0cnVjdCBhY3BpX2J1ZmZlciBvdXRwdXQ7Ci0JdW5pb24gYWNwaV9vYmplY3Qgb3V0X29iajsKLQlhY3BpX3N0YXR1cyBzdGF0dXM7Ci0KLQlwYXJhbXMuY291bnQgPSAxOwotCXBhcmFtcy5wb2ludGVyID0gJmluX29iajsKLQlpbl9vYmoudHlwZSA9IEFDUElfVFlQRV9JTlRFR0VSOwotCWluX29iai5pbnRlZ2VyLnZhbHVlID0gdmFsdWU7Ci0KLQlvdXRwdXQubGVuZ3RoID0gc2l6ZW9mKG91dF9vYmopOwotCW91dHB1dC5wb2ludGVyID0gJm91dF9vYmo7Ci0KLQlzdGF0dXMgPSBhY3BpX2V2YWx1YXRlX29iamVjdChoYW5kbGUsIG5hbWUsICZwYXJhbXMsICZvdXRwdXQpOwotCWlmIChzdGF0dXMgPT0gQUVfT0spIHsKLQkJaWYgKHJlc3VsdCAhPSBOVUxMKSB7Ci0JCQlpZiAob3V0X29iai50eXBlICE9IEFDUElfVFlQRV9JTlRFR0VSKSB7Ci0JCQkJcHJpbnRrKEtFUk5fV0FSTklORyBEUlZfUEZYICJhY3BpX2V2YWx1YXRlX29iamVjdCBiYWQgIgotCQkJCSAgICAgICAicmV0dXJuIHR5cGVcbiIpOwotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJCSpyZXN1bHQgPSBvdXRfb2JqLmludGVnZXIudmFsdWU7Ci0JCX0KLQkJcmV0dXJuIDA7Ci0JfQotCi0JcHJpbnRrKEtFUk5fV0FSTklORyBEUlZfUEZYICJhY3BpX2V2YWx1YXRlX29iamVjdCBmYWlsZWRcbiIpOwotCi0JcmV0dXJuIC0xOwotfQotCi0vKgotICogc29ueV9uY192YWx1ZXMgaW5wdXQvb3V0cHV0IHZhbGlkYXRlIGZ1bmN0aW9ucwotICovCi0KLS8qIGJyaWdodG5lc3NfZGVmYXVsdF92YWxpZGF0ZToKLSAqCi0gKiBtYW5pcHVsYXRlIGlucHV0IG91dHB1dCB2YWx1ZXMgdG8ga2VlcCBjb25zaXN0ZW5jeSB3aXRoIHRoZQotICogYmFja2xpZ2h0IGZyYW1ld29yayBmb3Igd2hpY2ggYnJpZ2h0bmVzcyB2YWx1ZXMgYXJlIDAtYmFzZWQuCi0gKi8KLXN0YXRpYyBpbnQgYnJpZ2h0bmVzc19kZWZhdWx0X3ZhbGlkYXRlKGNvbnN0IGludCBkaXJlY3Rpb24sIGNvbnN0IGludCB2YWx1ZSkKLXsKLQlzd2l0Y2ggKGRpcmVjdGlvbikgewotCQljYXNlIFNOQ19WQUxJREFURV9PVVQ6Ci0JCQlyZXR1cm4gdmFsdWUgLSAxOwotCQljYXNlIFNOQ19WQUxJREFURV9JTjoKLQkJCWlmICh2YWx1ZSA+PSAwICYmIHZhbHVlIDwgU09OWV9NQVhfQlJJR0hUTkVTUykKLQkJCQlyZXR1cm4gdmFsdWUgKyAxOwotCX0KLQlyZXR1cm4gLUVJTlZBTDsKLX0KLQotLyogYm9vbGVhbl92YWxpZGF0ZToKLSAqCi0gKiBvbiBpbnB1dCB2YWxpZGF0ZSBib29sZWFuIHZhbHVlcyAwLzEsIG9uIG91dHB1dCBqdXN0IHBhc3MgdGhlCi0gKiByZWNlaXZlZCB2YWx1ZS4KLSAqLwotc3RhdGljIGludCBib29sZWFuX3ZhbGlkYXRlKGNvbnN0IGludCBkaXJlY3Rpb24sIGNvbnN0IGludCB2YWx1ZSkKLXsKLQlpZiAoZGlyZWN0aW9uID09IFNOQ19WQUxJREFURV9JTikgewotCQlpZiAodmFsdWUgIT0gMCAmJiB2YWx1ZSAhPSAxKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCXJldHVybiB2YWx1ZTsKLX0KLQotLyoKLSAqIFN5c2ZzIHNob3cvc3RvcmUgY29tbW9uIHRvIGFsbCBzb255X25jX3ZhbHVlcwotICovCi1zdGF0aWMgc3NpemVfdCBzb255X25jX3N5c2ZzX3Nob3coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCSAgICAgIGNoYXIgKmJ1ZmZlcikKLXsKLQlpbnQgdmFsdWU7Ci0Jc3RydWN0IHNvbnlfbmNfdmFsdWUgKml0ZW0gPQotCSAgICBjb250YWluZXJfb2YoYXR0ciwgc3RydWN0IHNvbnlfbmNfdmFsdWUsIGRldmF0dHIpOwotCi0JaWYgKCEqaXRlbS0+YWNwaWdldCkKLQkJcmV0dXJuIC1FSU87Ci0KLQlpZiAoYWNwaV9jYWxsZ2V0ZnVuYyhzb255X25jX2FjcGlfaGFuZGxlLCAqaXRlbS0+YWNwaWdldCwgJnZhbHVlKSA8IDApCi0JCXJldHVybiAtRUlPOwotCi0JaWYgKGl0ZW0tPnZhbGlkYXRlKQotCQl2YWx1ZSA9IGl0ZW0tPnZhbGlkYXRlKFNOQ19WQUxJREFURV9PVVQsIHZhbHVlKTsKLQotCXJldHVybiBzbnByaW50ZihidWZmZXIsIFBBR0VfU0laRSwgIiVkXG4iLCB2YWx1ZSk7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IHNvbnlfbmNfc3lzZnNfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAotCQkJICAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQkJICAgICAgIGNvbnN0IGNoYXIgKmJ1ZmZlciwgc2l6ZV90IGNvdW50KQotewotCWludCB2YWx1ZTsKLQlzdHJ1Y3Qgc29ueV9uY192YWx1ZSAqaXRlbSA9Ci0JICAgIGNvbnRhaW5lcl9vZihhdHRyLCBzdHJ1Y3Qgc29ueV9uY192YWx1ZSwgZGV2YXR0cik7Ci0KLQlpZiAoIWl0ZW0tPmFjcGlzZXQpCi0JCXJldHVybiAtRUlPOwotCi0JaWYgKGNvdW50ID4gMzEpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JdmFsdWUgPSBzaW1wbGVfc3RydG91bChidWZmZXIsIE5VTEwsIDEwKTsKLQotCWlmIChpdGVtLT52YWxpZGF0ZSkKLQkJdmFsdWUgPSBpdGVtLT52YWxpZGF0ZShTTkNfVkFMSURBVEVfSU4sIHZhbHVlKTsKLQotCWlmICh2YWx1ZSA8IDApCi0JCXJldHVybiB2YWx1ZTsKLQotCWlmIChhY3BpX2NhbGxzZXRmdW5jKHNvbnlfbmNfYWNwaV9oYW5kbGUsICppdGVtLT5hY3Bpc2V0LCB2YWx1ZSwgTlVMTCkgPCAwKQotCQlyZXR1cm4gLUVJTzsKLQlpdGVtLT52YWx1ZSA9IHZhbHVlOwotCWl0ZW0tPnZhbGlkID0gMTsKLQlyZXR1cm4gY291bnQ7Ci19Ci0KLQotLyoKLSAqIEJhY2tsaWdodCBkZXZpY2UKLSAqLwotc3RhdGljIGludCBzb255X2JhY2tsaWdodF91cGRhdGVfc3RhdHVzKHN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICpiZCkKLXsKLQlyZXR1cm4gYWNwaV9jYWxsc2V0ZnVuYyhzb255X25jX2FjcGlfaGFuZGxlLCAiU0JSVCIsCi0JCQkJYmQtPnByb3BzLmJyaWdodG5lc3MgKyAxLCBOVUxMKTsKLX0KLQotc3RhdGljIGludCBzb255X2JhY2tsaWdodF9nZXRfYnJpZ2h0bmVzcyhzdHJ1Y3QgYmFja2xpZ2h0X2RldmljZSAqYmQpCi17Ci0JaW50IHZhbHVlOwotCi0JaWYgKGFjcGlfY2FsbGdldGZ1bmMoc29ueV9uY19hY3BpX2hhbmRsZSwgIkdCUlQiLCAmdmFsdWUpKQotCQlyZXR1cm4gMDsKLQkvKiBicmlnaHRuZXNzIGxldmVscyBhcmUgMS1iYXNlZCwgd2hpbGUgYmFja2xpZ2h0IG9uZXMgYXJlIDAtYmFzZWQgKi8KLQlyZXR1cm4gdmFsdWUgLSAxOwotfQotCi1zdGF0aWMgc3RydWN0IGJhY2tsaWdodF9kZXZpY2UgKnNvbnlfYmFja2xpZ2h0X2RldmljZTsKLXN0YXRpYyBzdHJ1Y3QgYmFja2xpZ2h0X29wcyBzb255X2JhY2tsaWdodF9vcHMgPSB7Ci0JLnVwZGF0ZV9zdGF0dXMgPSBzb255X2JhY2tsaWdodF91cGRhdGVfc3RhdHVzLAotCS5nZXRfYnJpZ2h0bmVzcyA9IHNvbnlfYmFja2xpZ2h0X2dldF9icmlnaHRuZXNzLAotfTsKLQotLyoKLSAqIE5ldyBTTkMtb25seSBWYWlvcyBldmVudCBtYXBwaW5nIHRvIGRyaXZlciBrbm93biBrZXlzCi0gKi8KLXN0cnVjdCBzb255X25jX2V2ZW50IHsKLQl1OAlkYXRhOwotCXU4CWV2ZW50OwotfTsKLQotc3RhdGljIHN0cnVjdCBzb255X25jX2V2ZW50ICpzb255X25jX2V2ZW50czsKLQotLyogVmFpbyBDKiAtLW1heWJlIGFsc28gRkUqLCBOKiBhbmQgQVIqID8tLSBzcGVjaWFsIGluaXQgc2VxdWVuY2UKLSAqIGZvciBGbiBrZXlzCi0gKi8KLXN0YXRpYyBpbnQgc29ueV9uY19DX2VuYWJsZShjb25zdCBzdHJ1Y3QgZG1pX3N5c3RlbV9pZCAqaWQpCi17Ci0JaW50IHJlc3VsdCA9IDA7Ci0KLQlwcmludGsoS0VSTl9OT1RJQ0UgRFJWX1BGWCAiZGV0ZWN0ZWQgJXNcbiIsIGlkLT5pZGVudCk7Ci0KLQlzb255X25jX2V2ZW50cyA9IGlkLT5kcml2ZXJfZGF0YTsKLQotCWlmIChhY3BpX2NhbGxzZXRmdW5jKHNvbnlfbmNfYWNwaV9oYW5kbGUsICJTTjAyIiwgMHg0LCAmcmVzdWx0KSA8IDAKLQkJCXx8IGFjcGlfY2FsbHNldGZ1bmMoc29ueV9uY19hY3BpX2hhbmRsZSwgIlNOMDciLCAweDIsICZyZXN1bHQpIDwgMAotCQkJfHwgYWNwaV9jYWxsc2V0ZnVuYyhzb255X25jX2FjcGlfaGFuZGxlLCAiU04wMiIsIDB4MTAsICZyZXN1bHQpIDwgMAotCQkJfHwgYWNwaV9jYWxsc2V0ZnVuYyhzb255X25jX2FjcGlfaGFuZGxlLCAiU04wNyIsIDB4MCwgJnJlc3VsdCkgPCAwCi0JCQl8fCBhY3BpX2NhbGxzZXRmdW5jKHNvbnlfbmNfYWNwaV9oYW5kbGUsICJTTjAzIiwgMHgyLCAmcmVzdWx0KSA8IDAKLQkJCXx8IGFjcGlfY2FsbHNldGZ1bmMoc29ueV9uY19hY3BpX2hhbmRsZSwgIlNOMDciLCAweDEwMSwgJnJlc3VsdCkgPCAwKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgRFJWX1BGWCAiZmFpbGVkIHRvIGluaXRpYWxpemUgU05DLCBzb21lICIKLQkJCQkiZnVuY3Rpb25hbGl0aWVzIG1heSBiZSBtaXNzaW5nXG4iKTsKLQkJcmV0dXJuIDE7Ci0JfQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3RydWN0IHNvbnlfbmNfZXZlbnQgc29ueV9DX2V2ZW50c1tdID0gewotCXsgMHg4MSwgU09OWVBJX0VWRU5UX0ZOS0VZX0YxIH0sCi0JeyAweDAxLCBTT05ZUElfRVZFTlRfRk5LRVlfUkVMRUFTRUQgfSwKLQl7IDB4ODUsIFNPTllQSV9FVkVOVF9GTktFWV9GNSB9LAotCXsgMHgwNSwgU09OWVBJX0VWRU5UX0ZOS0VZX1JFTEVBU0VEIH0sCi0JeyAweDg2LCBTT05ZUElfRVZFTlRfRk5LRVlfRjYgfSwKLQl7IDB4MDYsIFNPTllQSV9FVkVOVF9GTktFWV9SRUxFQVNFRCB9LAotCXsgMHg4NywgU09OWVBJX0VWRU5UX0ZOS0VZX0Y3IH0sCi0JeyAweDA3LCBTT05ZUElfRVZFTlRfRk5LRVlfUkVMRUFTRUQgfSwKLQl7IDB4OEEsIFNPTllQSV9FVkVOVF9GTktFWV9GMTAgfSwKLQl7IDB4MEEsIFNPTllQSV9FVkVOVF9GTktFWV9SRUxFQVNFRCB9LAotCXsgMHg4QywgU09OWVBJX0VWRU5UX0ZOS0VZX0YxMiB9LAotCXsgMHgwQywgU09OWVBJX0VWRU5UX0ZOS0VZX1JFTEVBU0VEIH0sCi0JeyAwLCAwIH0sCi19OwotCi0vKiBTTkMtb25seSBtb2RlbCBtYXAgKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZG1pX3N5c3RlbV9pZCBzb255X25jX2lkc1tdID0gewotCQl7Ci0JCQkuaWRlbnQgPSAiU29ueSBWYWlvIEZFIFNlcmllcyIsCi0JCQkuY2FsbGJhY2sgPSBzb255X25jX0NfZW5hYmxlLAotCQkJLmRyaXZlcl9kYXRhID0gc29ueV9DX2V2ZW50cywKLQkJCS5tYXRjaGVzID0gewotCQkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIlNvbnkgQ29ycG9yYXRpb24iKSwKLQkJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIlZHTi1GRSIpLAotCQkJfSwKLQkJfSwKLQkJewotCQkJLmlkZW50ID0gIlNvbnkgVmFpbyBGWiBTZXJpZXMiLAotCQkJLmNhbGxiYWNrID0gc29ueV9uY19DX2VuYWJsZSwKLQkJCS5kcml2ZXJfZGF0YSA9IHNvbnlfQ19ldmVudHMsCi0JCQkubWF0Y2hlcyA9IHsKLQkJCQlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJTb255IENvcnBvcmF0aW9uIiksCi0JCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJWR04tRloiKSwKLQkJCX0sCi0JCX0sCi0JCXsKLQkJCS5pZGVudCA9ICJTb255IFZhaW8gQyBTZXJpZXMiLAotCQkJLmNhbGxiYWNrID0gc29ueV9uY19DX2VuYWJsZSwKLQkJCS5kcml2ZXJfZGF0YSA9IHNvbnlfQ19ldmVudHMsCi0JCQkubWF0Y2hlcyA9IHsKLQkJCQlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJTb255IENvcnBvcmF0aW9uIiksCi0JCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJWR04tQyIpLAotCQkJfSwKLQkJfSwKLQkJewotCQkJLmlkZW50ID0gIlNvbnkgVmFpbyBOIFNlcmllcyIsCi0JCQkuY2FsbGJhY2sgPSBzb255X25jX0NfZW5hYmxlLAotCQkJLmRyaXZlcl9kYXRhID0gc29ueV9DX2V2ZW50cywKLQkJCS5tYXRjaGVzID0gewotCQkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIlNvbnkgQ29ycG9yYXRpb24iKSwKLQkJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIlZHTi1OIiksCi0JCQl9LAotCQl9LAotCQl7IH0KLX07Ci0KLS8qCi0gKiBBQ1BJIGNhbGxiYWNrcwotICovCi1zdGF0aWMgdm9pZCBzb255X2FjcGlfbm90aWZ5KGFjcGlfaGFuZGxlIGhhbmRsZSwgdTMyIGV2ZW50LCB2b2lkICpkYXRhKQotewotCXN0cnVjdCBzb255X25jX2V2ZW50ICpldm1hcDsKLQl1MzIgZXYgPSBldmVudDsKLQlpbnQgcmVzdWx0OwotCi0JaWYgKGV2ID09IDB4OTIpIHsKLQkJLyogcmVhZCB0aGUga2V5IHByZXNzZWQgZnJvbSBFQy5HRUNSCi0JCSAqIEEgY2FsbCB0byBTTjA3IHdpdGggMHgwMjAyIHdpbGwgZG8gaXQgYXMgd2VsbCByZXNwZWN0aW5nCi0JCSAqIHRoZSBjdXJyZW50IHByb3RvY29sIG9uIGRpZmZlcmVudCBPU2VzCi0JCSAqCi0JCSAqIE5vdGU6IHRoZSBwYXRoIGZvciBHRUNSIG1heSBiZQotCQkgKiAgIFxfU0IuUENJMC5MUENCLkVDIChDLCBGRSwgQVIsIE4gYW5kIGZyaWVuZHMpCi0JCSAqICAgXF9TQi5QQ0kwLlBJQi5FQzAgKFZHTi1GUiBub3RpZmljYXRpb25zIGFyZSBzZW50IGRpcmVjdGx5LCBubyBHRUNSKQotCQkgKgotCQkgKiBUT0RPOiB3ZSBtYXkgd2FudCB0byBkbyB0aGUgc2FtZSBmb3IgdGhlIG9sZGVyIEdIS0UgLW5lZWQKLQkJICogICAgICAgZG1pIGxpc3QtIHNvIHRoaXMgc25pcHBldCBtYXkgYmVjb21lIG9uZSBtb3JlIGNhbGxiYWNrLgotCQkgKi8KLQkJaWYgKGFjcGlfY2FsbHNldGZ1bmMoaGFuZGxlLCAiU04wNyIsIDB4MDIwMiwgJnJlc3VsdCkgPCAwKQotCQkJZHByaW50aygic29ueV9hY3BpX25vdGlmeSwgdW5hYmxlIHRvIGRlY29kZSBldmVudCAweCUuMnhcbiIsIGV2KTsKLQkJZWxzZQotCQkJZXYgPSByZXN1bHQgJiAweEZGOwotCX0KLQotCWlmIChzb255X25jX2V2ZW50cykKLQkJZm9yIChldm1hcCA9IHNvbnlfbmNfZXZlbnRzOyBldm1hcC0+ZXZlbnQ7IGV2bWFwKyspIHsKLQkJCWlmIChldm1hcC0+ZGF0YSA9PSBldikgewotCQkJCWV2ID0gZXZtYXAtPmV2ZW50OwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQlkcHJpbnRrKCJzb255X2FjcGlfbm90aWZ5LCBldmVudDogMHglLjJ4XG4iLCBldik7Ci0Jc29ueV9sYXB0b3BfcmVwb3J0X2lucHV0X2V2ZW50KGV2KTsKLQlhY3BpX2J1c19nZW5lcmF0ZV9wcm9jX2V2ZW50KHNvbnlfbmNfYWNwaV9kZXZpY2UsIDEsIGV2KTsKLX0KLQotc3RhdGljIGFjcGlfc3RhdHVzIHNvbnlfd2Fsa19jYWxsYmFjayhhY3BpX2hhbmRsZSBoYW5kbGUsIHUzMiBsZXZlbCwKLQkJCQkgICAgICB2b2lkICpjb250ZXh0LCB2b2lkICoqcmV0dXJuX3ZhbHVlKQotewotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlOwotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9wZXJhbmQ7Ci0KLQlub2RlID0gKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICopaGFuZGxlOwotCW9wZXJhbmQgPSAodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKW5vZGUtPm9iamVjdDsKLQotCXByaW50ayhLRVJOX1dBUk5JTkcgRFJWX1BGWCAibWV0aG9kOiBuYW1lOiAlNC40cywgYXJncyAlWFxuIiwgbm9kZS0+bmFtZS5hc2NpaSwKLQkgICAgICAgKHUzMikgb3BlcmFuZC0+bWV0aG9kLnBhcmFtX2NvdW50KTsKLQotCXJldHVybiBBRV9PSzsKLX0KLQotLyoKLSAqIEFDUEkgZGV2aWNlCi0gKi8KLXN0YXRpYyBpbnQgc29ueV9uY19yZXN1bWUoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpCi17Ci0Jc3RydWN0IHNvbnlfbmNfdmFsdWUgKml0ZW07Ci0KLQlmb3IgKGl0ZW0gPSBzb255X25jX3ZhbHVlczsgaXRlbS0+bmFtZTsgaXRlbSsrKSB7Ci0JCWludCByZXQ7Ci0KLQkJaWYgKCFpdGVtLT52YWxpZCkKLQkJCWNvbnRpbnVlOwotCQlyZXQgPSBhY3BpX2NhbGxzZXRmdW5jKHNvbnlfbmNfYWNwaV9oYW5kbGUsICppdGVtLT5hY3Bpc2V0LAotCQkJCSAgICAgICBpdGVtLT52YWx1ZSwgTlVMTCk7Ci0JCWlmIChyZXQgPCAwKSB7Ci0JCQlwcmludGsoIiVzOiAlZFxuIiwgX19mdW5jX18sIHJldCk7Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCS8qIHNldCB0aGUgbGFzdCByZXF1ZXN0ZWQgYnJpZ2h0bmVzcyBsZXZlbCAqLwotCWlmIChzb255X2JhY2tsaWdodF9kZXZpY2UgJiYKLQkJCSFzb255X2JhY2tsaWdodF91cGRhdGVfc3RhdHVzKHNvbnlfYmFja2xpZ2h0X2RldmljZSkpCi0JCXByaW50ayhLRVJOX1dBUk5JTkcgRFJWX1BGWCAidW5hYmxlIHRvIHJlc3RvcmUgYnJpZ2h0bmVzcyBsZXZlbFxuIik7Ci0KLQkvKiByZS1pbml0aWFsaXplIG1vZGVscyB3aXRoIHNwZWNpZmljIHJlcXVpcmVtZW50cyAqLwotCWRtaV9jaGVja19zeXN0ZW0oc29ueV9uY19pZHMpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgc29ueV9uY19hZGQoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpCi17Ci0JYWNwaV9zdGF0dXMgc3RhdHVzOwotCWludCByZXN1bHQgPSAwOwotCWFjcGlfaGFuZGxlIGhhbmRsZTsKLQlzdHJ1Y3Qgc29ueV9uY192YWx1ZSAqaXRlbTsKLQotCXByaW50ayhLRVJOX0lORk8gRFJWX1BGWCAiJXMgdiVzLlxuIiwKLQkJU09OWV9OQ19EUklWRVJfTkFNRSwgU09OWV9MQVBUT1BfRFJJVkVSX1ZFUlNJT04pOwotCi0Jc29ueV9uY19hY3BpX2RldmljZSA9IGRldmljZTsKLQlzdHJjcHkoYWNwaV9kZXZpY2VfY2xhc3MoZGV2aWNlKSwgInNvbnkvaG90a2V5Iik7Ci0KLQlzb255X25jX2FjcGlfaGFuZGxlID0gZGV2aWNlLT5oYW5kbGU7Ci0KLQkvKiByZWFkIGRldmljZSBzdGF0dXMgKi8KLQlyZXN1bHQgPSBhY3BpX2J1c19nZXRfc3RhdHVzKGRldmljZSk7Ci0JLyogYmFpbCBJRkYgdGhlIGFib3ZlIGNhbGwgd2FzIHN1Y2Nlc3NmdWwgYW5kIHRoZSBkZXZpY2UgaXMgbm90IHByZXNlbnQgKi8KLQlpZiAoIXJlc3VsdCAmJiAhZGV2aWNlLT5zdGF0dXMucHJlc2VudCkgewotCQlkcHJpbnRrKCJEZXZpY2Ugbm90IHByZXNlbnRcbiIpOwotCQlyZXN1bHQgPSAtRU5PREVWOwotCQlnb3RvIG91dHdhbGs7Ci0JfQotCi0JaWYgKGRlYnVnKSB7Ci0JCXN0YXR1cyA9IGFjcGlfd2Fsa19uYW1lc3BhY2UoQUNQSV9UWVBFX01FVEhPRCwgc29ueV9uY19hY3BpX2hhbmRsZSwKLQkJCQkJICAgICAxLCBzb255X3dhbGtfY2FsbGJhY2ssIE5VTEwsIE5VTEwpOwotCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgRFJWX1BGWCAidW5hYmxlIHRvIHdhbGsgYWNwaSByZXNvdXJjZXNcbiIpOwotCQkJcmVzdWx0ID0gLUVOT0RFVjsKLQkJCWdvdG8gb3V0d2FsazsKLQkJfQotCX0KLQotCS8qIHRyeSB0byBfSU5JIHRoZSBkZXZpY2UgaWYgc3VjaCBtZXRob2QgZXhpc3RzIChBQ1BJIHNwZWMgMy4wLTYuNS4xCi0JICogc2hvdWxkIGJlIHJlc3BlY3RlZCBhcyB3ZSBhbHJlYWR5IGNoZWNrZWQgZm9yIHRoZSBkZXZpY2UgcHJlc2VuY2UgYWJvdmUgKi8KLQlpZiAoQUNQSV9TVUNDRVNTKGFjcGlfZ2V0X2hhbmRsZShzb255X25jX2FjcGlfaGFuZGxlLCBNRVRIT0RfTkFNRV9fSU5JLCAmaGFuZGxlKSkpIHsKLQkJZHByaW50aygiSW52b2tpbmcgX0lOSVxuIik7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUoYWNwaV9ldmFsdWF0ZV9vYmplY3Qoc29ueV9uY19hY3BpX2hhbmRsZSwgTUVUSE9EX05BTUVfX0lOSSwKLQkJCQkJCU5VTEwsIE5VTEwpKSkKLQkJCWRwcmludGsoIl9JTkkgTWV0aG9kIGZhaWxlZFxuIik7Ci0JfQotCi0JLyogc2V0dXAgaW5wdXQgZGV2aWNlcyBhbmQgaGVscGVyIGZpZm8gKi8KLQlyZXN1bHQgPSBzb255X2xhcHRvcF9zZXR1cF9pbnB1dChkZXZpY2UpOwotCWlmIChyZXN1bHQpIHsKLQkJcHJpbnRrKEtFUk5fRVJSIERSVl9QRlgKLQkJCQkiVW5hYmUgdG8gY3JlYXRlIGlucHV0IGRldmljZXMuXG4iKTsKLQkJZ290byBvdXR3YWxrOwotCX0KLQotCXN0YXR1cyA9IGFjcGlfaW5zdGFsbF9ub3RpZnlfaGFuZGxlcihzb255X25jX2FjcGlfaGFuZGxlLAotCQkJCQkgICAgIEFDUElfREVWSUNFX05PVElGWSwKLQkJCQkJICAgICBzb255X2FjcGlfbm90aWZ5LCBOVUxMKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyBEUlZfUEZYICJ1bmFibGUgdG8gaW5zdGFsbCBub3RpZnkgaGFuZGxlciAoJXUpXG4iLCBzdGF0dXMpOwotCQlyZXN1bHQgPSAtRU5PREVWOwotCQlnb3RvIG91dGlucHV0OwotCX0KLQotCWlmIChhY3BpX3ZpZGVvX2JhY2tsaWdodF9zdXBwb3J0KCkpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyBEUlZfUEZYICJicmlnaHRuZXNzIGlnbm9yZWQsIG11c3QgYmUgIgotCQkgICAgICAgImNvbnRyb2xsZWQgYnkgQUNQSSB2aWRlbyBkcml2ZXJcbiIpOwotCX0gZWxzZSBpZiAoQUNQSV9TVUNDRVNTKGFjcGlfZ2V0X2hhbmRsZShzb255X25jX2FjcGlfaGFuZGxlLCAiR0JSVCIsCi0JCQkJCQkmaGFuZGxlKSkpIHsKLQkJc29ueV9iYWNrbGlnaHRfZGV2aWNlID0gYmFja2xpZ2h0X2RldmljZV9yZWdpc3Rlcigic29ueSIsIE5VTEwsCi0JCQkJCQkJCSAgTlVMTCwKLQkJCQkJCQkJICAmc29ueV9iYWNrbGlnaHRfb3BzKTsKLQotCQlpZiAoSVNfRVJSKHNvbnlfYmFja2xpZ2h0X2RldmljZSkpIHsKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgRFJWX1BGWCAidW5hYmxlIHRvIHJlZ2lzdGVyIGJhY2tsaWdodCBkZXZpY2VcbiIpOwotCQkJc29ueV9iYWNrbGlnaHRfZGV2aWNlID0gTlVMTDsKLQkJfSBlbHNlIHsKLQkJCXNvbnlfYmFja2xpZ2h0X2RldmljZS0+cHJvcHMuYnJpZ2h0bmVzcyA9Ci0JCQkgICAgc29ueV9iYWNrbGlnaHRfZ2V0X2JyaWdodG5lc3MKLQkJCSAgICAoc29ueV9iYWNrbGlnaHRfZGV2aWNlKTsKLQkJCXNvbnlfYmFja2xpZ2h0X2RldmljZS0+cHJvcHMubWF4X2JyaWdodG5lc3MgPQotCQkJICAgIFNPTllfTUFYX0JSSUdIVE5FU1MgLSAxOwotCQl9Ci0KLQl9Ci0KLQkvKiBpbml0aWFsaXplIG1vZGVscyB3aXRoIHNwZWNpZmljIHJlcXVpcmVtZW50cyAqLwotCWRtaV9jaGVja19zeXN0ZW0oc29ueV9uY19pZHMpOwotCi0JcmVzdWx0ID0gc29ueV9wZl9hZGQoKTsKLQlpZiAocmVzdWx0KQotCQlnb3RvIG91dGJhY2tsaWdodDsKLQotCS8qIGNyZWF0ZSBzb255X3BmIHN5c2ZzIGF0dHJpYnV0ZXMgcmVsYXRlZCB0byB0aGUgU05DIGRldmljZSAqLwotCWZvciAoaXRlbSA9IHNvbnlfbmNfdmFsdWVzOyBpdGVtLT5uYW1lOyArK2l0ZW0pIHsKLQotCQlpZiAoIWRlYnVnICYmIGl0ZW0tPmRlYnVnKQotCQkJY29udGludWU7Ci0KLQkJLyogZmluZCB0aGUgYXZhaWxhYmxlIGFjcGlnZXQgYXMgZGVzY3JpYmVkIGluIHRoZSBEU0RUICovCi0JCWZvciAoOyBpdGVtLT5hY3BpZ2V0ICYmICppdGVtLT5hY3BpZ2V0OyArK2l0ZW0tPmFjcGlnZXQpIHsKLQkJCWlmIChBQ1BJX1NVQ0NFU1MoYWNwaV9nZXRfaGFuZGxlKHNvbnlfbmNfYWNwaV9oYW5kbGUsCi0JCQkJCQkJICppdGVtLT5hY3BpZ2V0LAotCQkJCQkJCSAmaGFuZGxlKSkpIHsKLQkJCQlkcHJpbnRrKCJGb3VuZCAlcyBnZXR0ZXI6ICVzXG4iLAotCQkJCQkJaXRlbS0+bmFtZSwgKml0ZW0tPmFjcGlnZXQpOwotCQkJCWl0ZW0tPmRldmF0dHIuYXR0ci5tb2RlIHw9IFNfSVJVR087Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCQkvKiBmaW5kIHRoZSBhdmFpbGFibGUgYWNwaXNldCBhcyBkZXNjcmliZWQgaW4gdGhlIERTRFQgKi8KLQkJZm9yICg7IGl0ZW0tPmFjcGlzZXQgJiYgKml0ZW0tPmFjcGlzZXQ7ICsraXRlbS0+YWNwaXNldCkgewotCQkJaWYgKEFDUElfU1VDQ0VTUyhhY3BpX2dldF9oYW5kbGUoc29ueV9uY19hY3BpX2hhbmRsZSwKLQkJCQkJCQkgKml0ZW0tPmFjcGlzZXQsCi0JCQkJCQkJICZoYW5kbGUpKSkgewotCQkJCWRwcmludGsoIkZvdW5kICVzIHNldHRlcjogJXNcbiIsCi0JCQkJCQlpdGVtLT5uYW1lLCAqaXRlbS0+YWNwaXNldCk7Ci0JCQkJaXRlbS0+ZGV2YXR0ci5hdHRyLm1vZGUgfD0gU19JV1VTUjsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCWlmIChpdGVtLT5kZXZhdHRyLmF0dHIubW9kZSAhPSAwKSB7Ci0JCQlyZXN1bHQgPQotCQkJICAgIGRldmljZV9jcmVhdGVfZmlsZSgmc29ueV9wZl9kZXZpY2UtPmRldiwKLQkJCQkJICAgICAgICZpdGVtLT5kZXZhdHRyKTsKLQkJCWlmIChyZXN1bHQpCi0JCQkJZ290byBvdXRfc3lzZnM7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gMDsKLQotICAgICAgb3V0X3N5c2ZzOgotCWZvciAoaXRlbSA9IHNvbnlfbmNfdmFsdWVzOyBpdGVtLT5uYW1lOyArK2l0ZW0pIHsKLQkJZGV2aWNlX3JlbW92ZV9maWxlKCZzb255X3BmX2RldmljZS0+ZGV2LCAmaXRlbS0+ZGV2YXR0cik7Ci0JfQotCXNvbnlfcGZfcmVtb3ZlKCk7Ci0KLSAgICAgIG91dGJhY2tsaWdodDoKLQlpZiAoc29ueV9iYWNrbGlnaHRfZGV2aWNlKQotCQliYWNrbGlnaHRfZGV2aWNlX3VucmVnaXN0ZXIoc29ueV9iYWNrbGlnaHRfZGV2aWNlKTsKLQotCXN0YXR1cyA9IGFjcGlfcmVtb3ZlX25vdGlmeV9oYW5kbGVyKHNvbnlfbmNfYWNwaV9oYW5kbGUsCi0JCQkJCSAgICBBQ1BJX0RFVklDRV9OT1RJRlksCi0JCQkJCSAgICBzb255X2FjcGlfbm90aWZ5KTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpCi0JCXByaW50ayhLRVJOX1dBUk5JTkcgRFJWX1BGWCAidW5hYmxlIHRvIHJlbW92ZSBub3RpZnkgaGFuZGxlclxuIik7Ci0KLSAgICAgIG91dGlucHV0OgotCXNvbnlfbGFwdG9wX3JlbW92ZV9pbnB1dCgpOwotCi0gICAgICBvdXR3YWxrOgotCXJldHVybiByZXN1bHQ7Ci19Ci0KLXN0YXRpYyBpbnQgc29ueV9uY19yZW1vdmUoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UsIGludCB0eXBlKQotewotCWFjcGlfc3RhdHVzIHN0YXR1czsKLQlzdHJ1Y3Qgc29ueV9uY192YWx1ZSAqaXRlbTsKLQotCWlmIChzb255X2JhY2tsaWdodF9kZXZpY2UpCi0JCWJhY2tsaWdodF9kZXZpY2VfdW5yZWdpc3Rlcihzb255X2JhY2tsaWdodF9kZXZpY2UpOwotCi0Jc29ueV9uY19hY3BpX2RldmljZSA9IE5VTEw7Ci0KLQlzdGF0dXMgPSBhY3BpX3JlbW92ZV9ub3RpZnlfaGFuZGxlcihzb255X25jX2FjcGlfaGFuZGxlLAotCQkJCQkgICAgQUNQSV9ERVZJQ0VfTk9USUZZLAotCQkJCQkgICAgc29ueV9hY3BpX25vdGlmeSk7Ci0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKQotCQlwcmludGsoS0VSTl9XQVJOSU5HIERSVl9QRlggInVuYWJsZSB0byByZW1vdmUgbm90aWZ5IGhhbmRsZXJcbiIpOwotCi0JZm9yIChpdGVtID0gc29ueV9uY192YWx1ZXM7IGl0ZW0tPm5hbWU7ICsraXRlbSkgewotCQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJnNvbnlfcGZfZGV2aWNlLT5kZXYsICZpdGVtLT5kZXZhdHRyKTsKLQl9Ci0KLQlzb255X3BmX3JlbW92ZSgpOwotCXNvbnlfbGFwdG9wX3JlbW92ZV9pbnB1dCgpOwotCWRwcmludGsoU09OWV9OQ19EUklWRVJfTkFNRSAiIHJlbW92ZWQuXG4iKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGFjcGlfZGV2aWNlX2lkIHNvbnlfZGV2aWNlX2lkc1tdID0gewotCXtTT05ZX05DX0hJRCwgMH0sCi0Je1NPTllfUElDX0hJRCwgMH0sCi0JeyIiLCAwfSwKLX07Ci1NT0RVTEVfREVWSUNFX1RBQkxFKGFjcGksIHNvbnlfZGV2aWNlX2lkcyk7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYWNwaV9kZXZpY2VfaWQgc29ueV9uY19kZXZpY2VfaWRzW10gPSB7Ci0Je1NPTllfTkNfSElELCAwfSwKLQl7IiIsIDB9LAotfTsKLQotc3RhdGljIHN0cnVjdCBhY3BpX2RyaXZlciBzb255X25jX2RyaXZlciA9IHsKLQkubmFtZSA9IFNPTllfTkNfRFJJVkVSX05BTUUsCi0JLmNsYXNzID0gU09OWV9OQ19DTEFTUywKLQkuaWRzID0gc29ueV9uY19kZXZpY2VfaWRzLAotCS5vd25lciA9IFRISVNfTU9EVUxFLAotCS5vcHMgPSB7Ci0JCS5hZGQgPSBzb255X25jX2FkZCwKLQkJLnJlbW92ZSA9IHNvbnlfbmNfcmVtb3ZlLAotCQkucmVzdW1lID0gc29ueV9uY19yZXN1bWUsCi0JCX0sCi19OwotCi0vKioqKioqKioqKiogU1BJQyAoU05ZNjAwMSkgRGV2aWNlICoqKioqKioqKioqLwotCi0jZGVmaW5lIFNPTllQSV9ERVZJQ0VfVFlQRTEJMHgwMDAwMDAwMQotI2RlZmluZSBTT05ZUElfREVWSUNFX1RZUEUyCTB4MDAwMDAwMDIKLSNkZWZpbmUgU09OWVBJX0RFVklDRV9UWVBFMwkweDAwMDAwMDA0Ci0jZGVmaW5lIFNPTllQSV9ERVZJQ0VfVFlQRTQJMHgwMDAwMDAwOAotCi0jZGVmaW5lIFNPTllQSV9UWVBFMV9PRkZTRVQJMHgwNAotI2RlZmluZSBTT05ZUElfVFlQRTJfT0ZGU0VUCTB4MTIKLSNkZWZpbmUgU09OWVBJX1RZUEUzX09GRlNFVAkweDEyCi0jZGVmaW5lIFNPTllQSV9UWVBFNF9PRkZTRVQJMHgxMgotCi1zdHJ1Y3Qgc29ueV9waWNfaW9wb3J0IHsKLQlzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9pbwlpbzE7Ci0Jc3RydWN0IGFjcGlfcmVzb3VyY2VfaW8JaW8yOwotCXN0cnVjdCBsaXN0X2hlYWQJbGlzdDsKLX07Ci0KLXN0cnVjdCBzb255X3BpY19pcnEgewotCXN0cnVjdCBhY3BpX3Jlc291cmNlX2lycQlpcnE7Ci0Jc3RydWN0IGxpc3RfaGVhZAkJbGlzdDsKLX07Ci0KLXN0cnVjdCBzb255cGlfZXZlbnR0eXBlcyB7Ci0JdTgJCQlkYXRhOwotCXVuc2lnbmVkIGxvbmcJCW1hc2s7Ci0Jc3RydWN0IHNvbnlwaV9ldmVudAkqZXZlbnRzOwotfTsKLQotc3RydWN0IGRldmljZV9jdHJsIHsKLQlpbnQJCQkJbW9kZWw7Ci0JaW50CQkJCSgqaGFuZGxlX2lycSkoY29uc3QgdTgsIGNvbnN0IHU4KTsKLQl1MTYJCQkJZXZwb3J0X29mZnNldDsKLQl1OAkJCQloYXNfY2FtZXJhOwotCXU4CQkJCWhhc19ibHVldG9vdGg7Ci0JdTgJCQkJaGFzX3d3YW47Ci0Jc3RydWN0IHNvbnlwaV9ldmVudHR5cGVzCSpldmVudF90eXBlczsKLX07Ci0KLXN0cnVjdCBzb255X3BpY19kZXYgewotCXN0cnVjdCBkZXZpY2VfY3RybAkqY29udHJvbDsKLQlzdHJ1Y3QgYWNwaV9kZXZpY2UJKmFjcGlfZGV2OwotCXN0cnVjdCBzb255X3BpY19pcnEJKmN1cl9pcnE7Ci0Jc3RydWN0IHNvbnlfcGljX2lvcG9ydAkqY3VyX2lvcG9ydDsKLQlzdHJ1Y3QgbGlzdF9oZWFkCWludGVycnVwdHM7Ci0Jc3RydWN0IGxpc3RfaGVhZAlpb3BvcnRzOwotCXN0cnVjdCBtdXRleAkJbG9jazsKLQl1OAkJCWNhbWVyYV9wb3dlcjsKLQl1OAkJCWJsdWV0b290aF9wb3dlcjsKLQl1OAkJCXd3YW5fcG93ZXI7Ci19OwotCi1zdGF0aWMgc3RydWN0IHNvbnlfcGljX2RldiBzcGljX2RldiA9IHsKLQkuaW50ZXJydXB0cwk9IExJU1RfSEVBRF9JTklUKHNwaWNfZGV2LmludGVycnVwdHMpLAotCS5pb3BvcnRzCT0gTElTVF9IRUFEX0lOSVQoc3BpY19kZXYuaW9wb3J0cyksCi19OwotCi0vKiBFdmVudCBtYXNrcyAqLwotI2RlZmluZSBTT05ZUElfSk9HR0VSX01BU0sJCQkweDAwMDAwMDAxCi0jZGVmaW5lIFNPTllQSV9DQVBUVVJFX01BU0sJCQkweDAwMDAwMDAyCi0jZGVmaW5lIFNPTllQSV9GTktFWV9NQVNLCQkJMHgwMDAwMDAwNAotI2RlZmluZSBTT05ZUElfQkxVRVRPT1RIX01BU0sJCQkweDAwMDAwMDA4Ci0jZGVmaW5lIFNPTllQSV9QS0VZX01BU0sJCQkweDAwMDAwMDEwCi0jZGVmaW5lIFNPTllQSV9CQUNLX01BU0sJCQkweDAwMDAwMDIwCi0jZGVmaW5lIFNPTllQSV9IRUxQX01BU0sJCQkweDAwMDAwMDQwCi0jZGVmaW5lIFNPTllQSV9MSURfTUFTSwkJCQkweDAwMDAwMDgwCi0jZGVmaW5lIFNPTllQSV9aT09NX01BU0sJCQkweDAwMDAwMTAwCi0jZGVmaW5lIFNPTllQSV9USFVNQlBIUkFTRV9NQVNLCQkJMHgwMDAwMDIwMAotI2RlZmluZSBTT05ZUElfTUVZRV9NQVNLCQkJMHgwMDAwMDQwMAotI2RlZmluZSBTT05ZUElfTUVNT1JZU1RJQ0tfTUFTSwkJCTB4MDAwMDA4MDAKLSNkZWZpbmUgU09OWVBJX0JBVFRFUllfTUFTSwkJCTB4MDAwMDEwMDAKLSNkZWZpbmUgU09OWVBJX1dJUkVMRVNTX01BU0sJCQkweDAwMDAyMDAwCi0KLXN0cnVjdCBzb255cGlfZXZlbnQgewotCXU4CWRhdGE7Ci0JdTgJZXZlbnQ7Ci19OwotCi0vKiBUaGUgc2V0IG9mIHBvc3NpYmxlIGJ1dHRvbiByZWxlYXNlIGV2ZW50cyAqLwotc3RhdGljIHN0cnVjdCBzb255cGlfZXZlbnQgc29ueXBpX3JlbGVhc2VldltdID0gewotCXsgMHgwMCwgU09OWVBJX0VWRU5UX0FOWUJVVFRPTl9SRUxFQVNFRCB9LAotCXsgMCwgMCB9Ci19OwotCi0vKiBUaGUgc2V0IG9mIHBvc3NpYmxlIGpvZ2dlciBldmVudHMgICovCi1zdGF0aWMgc3RydWN0IHNvbnlwaV9ldmVudCBzb255cGlfam9nZ2VyZXZbXSA9IHsKLQl7IDB4MWYsIFNPTllQSV9FVkVOVF9KT0dESUFMX1VQIH0sCi0JeyAweDAxLCBTT05ZUElfRVZFTlRfSk9HRElBTF9ET1dOIH0sCi0JeyAweDVmLCBTT05ZUElfRVZFTlRfSk9HRElBTF9VUF9QUkVTU0VEIH0sCi0JeyAweDQxLCBTT05ZUElfRVZFTlRfSk9HRElBTF9ET1dOX1BSRVNTRUQgfSwKLQl7IDB4MWUsIFNPTllQSV9FVkVOVF9KT0dESUFMX0ZBU1RfVVAgfSwKLQl7IDB4MDIsIFNPTllQSV9FVkVOVF9KT0dESUFMX0ZBU1RfRE9XTiB9LAotCXsgMHg1ZSwgU09OWVBJX0VWRU5UX0pPR0RJQUxfRkFTVF9VUF9QUkVTU0VEIH0sCi0JeyAweDQyLCBTT05ZUElfRVZFTlRfSk9HRElBTF9GQVNUX0RPV05fUFJFU1NFRCB9LAotCXsgMHgxZCwgU09OWVBJX0VWRU5UX0pPR0RJQUxfVkZBU1RfVVAgfSwKLQl7IDB4MDMsIFNPTllQSV9FVkVOVF9KT0dESUFMX1ZGQVNUX0RPV04gfSwKLQl7IDB4NWQsIFNPTllQSV9FVkVOVF9KT0dESUFMX1ZGQVNUX1VQX1BSRVNTRUQgfSwKLQl7IDB4NDMsIFNPTllQSV9FVkVOVF9KT0dESUFMX1ZGQVNUX0RPV05fUFJFU1NFRCB9LAotCXsgMHg0MCwgU09OWVBJX0VWRU5UX0pPR0RJQUxfUFJFU1NFRCB9LAotCXsgMCwgMCB9Ci19OwotCi0vKiBUaGUgc2V0IG9mIHBvc3NpYmxlIGNhcHR1cmUgYnV0dG9uIGV2ZW50cyAqLwotc3RhdGljIHN0cnVjdCBzb255cGlfZXZlbnQgc29ueXBpX2NhcHR1cmVldltdID0gewotCXsgMHgwNSwgU09OWVBJX0VWRU5UX0NBUFRVUkVfUEFSVElBTFBSRVNTRUQgfSwKLQl7IDB4MDcsIFNPTllQSV9FVkVOVF9DQVBUVVJFX1BSRVNTRUQgfSwKLQl7IDB4NDAsIFNPTllQSV9FVkVOVF9DQVBUVVJFX1BSRVNTRUQgfSwKLQl7IDB4MDEsIFNPTllQSV9FVkVOVF9DQVBUVVJFX1BBUlRJQUxSRUxFQVNFRCB9LAotCXsgMCwgMCB9Ci19OwotCi0vKiBUaGUgc2V0IG9mIHBvc3NpYmxlIGZua2V5cyBldmVudHMgKi8KLXN0YXRpYyBzdHJ1Y3Qgc29ueXBpX2V2ZW50IHNvbnlwaV9mbmtleWV2W10gPSB7Ci0JeyAweDEwLCBTT05ZUElfRVZFTlRfRk5LRVlfRVNDIH0sCi0JeyAweDExLCBTT05ZUElfRVZFTlRfRk5LRVlfRjEgfSwKLQl7IDB4MTIsIFNPTllQSV9FVkVOVF9GTktFWV9GMiB9LAotCXsgMHgxMywgU09OWVBJX0VWRU5UX0ZOS0VZX0YzIH0sCi0JeyAweDE0LCBTT05ZUElfRVZFTlRfRk5LRVlfRjQgfSwKLQl7IDB4MTUsIFNPTllQSV9FVkVOVF9GTktFWV9GNSB9LAotCXsgMHgxNiwgU09OWVBJX0VWRU5UX0ZOS0VZX0Y2IH0sCi0JeyAweDE3LCBTT05ZUElfRVZFTlRfRk5LRVlfRjcgfSwKLQl7IDB4MTgsIFNPTllQSV9FVkVOVF9GTktFWV9GOCB9LAotCXsgMHgxOSwgU09OWVBJX0VWRU5UX0ZOS0VZX0Y5IH0sCi0JeyAweDFhLCBTT05ZUElfRVZFTlRfRk5LRVlfRjEwIH0sCi0JeyAweDFiLCBTT05ZUElfRVZFTlRfRk5LRVlfRjExIH0sCi0JeyAweDFjLCBTT05ZUElfRVZFTlRfRk5LRVlfRjEyIH0sCi0JeyAweDFmLCBTT05ZUElfRVZFTlRfRk5LRVlfUkVMRUFTRUQgfSwKLQl7IDB4MjEsIFNPTllQSV9FVkVOVF9GTktFWV8xIH0sCi0JeyAweDIyLCBTT05ZUElfRVZFTlRfRk5LRVlfMiB9LAotCXsgMHgzMSwgU09OWVBJX0VWRU5UX0ZOS0VZX0QgfSwKLQl7IDB4MzIsIFNPTllQSV9FVkVOVF9GTktFWV9FIH0sCi0JeyAweDMzLCBTT05ZUElfRVZFTlRfRk5LRVlfRiB9LAotCXsgMHgzNCwgU09OWVBJX0VWRU5UX0ZOS0VZX1MgfSwKLQl7IDB4MzUsIFNPTllQSV9FVkVOVF9GTktFWV9CIH0sCi0JeyAweDM2LCBTT05ZUElfRVZFTlRfRk5LRVlfT05MWSB9LAotCXsgMCwgMCB9Ci19OwotCi0vKiBUaGUgc2V0IG9mIHBvc3NpYmxlIHByb2dyYW0ga2V5IGV2ZW50cyAqLwotc3RhdGljIHN0cnVjdCBzb255cGlfZXZlbnQgc29ueXBpX3BrZXlldltdID0gewotCXsgMHgwMSwgU09OWVBJX0VWRU5UX1BLRVlfUDEgfSwKLQl7IDB4MDIsIFNPTllQSV9FVkVOVF9QS0VZX1AyIH0sCi0JeyAweDA0LCBTT05ZUElfRVZFTlRfUEtFWV9QMyB9LAotCXsgMCwgMCB9Ci19OwotCi0vKiBUaGUgc2V0IG9mIHBvc3NpYmxlIGJsdWV0b290aCBldmVudHMgKi8KLXN0YXRpYyBzdHJ1Y3Qgc29ueXBpX2V2ZW50IHNvbnlwaV9ibHVlZXZbXSA9IHsKLQl7IDB4NTUsIFNPTllQSV9FVkVOVF9CTFVFVE9PVEhfUFJFU1NFRCB9LAotCXsgMHg1OSwgU09OWVBJX0VWRU5UX0JMVUVUT09USF9PTiB9LAotCXsgMHg1YSwgU09OWVBJX0VWRU5UX0JMVUVUT09USF9PRkYgfSwKLQl7IDAsIDAgfQotfTsKLQotLyogVGhlIHNldCBvZiBwb3NzaWJsZSB3aXJlbGVzcyBldmVudHMgKi8KLXN0YXRpYyBzdHJ1Y3Qgc29ueXBpX2V2ZW50IHNvbnlwaV93bGVzc2V2W10gPSB7Ci0JeyAweDU5LCBTT05ZUElfRVZFTlRfV0lSRUxFU1NfT04gfSwKLQl7IDB4NWEsIFNPTllQSV9FVkVOVF9XSVJFTEVTU19PRkYgfSwKLQl7IDAsIDAgfQotfTsKLQotLyogVGhlIHNldCBvZiBwb3NzaWJsZSBiYWNrIGJ1dHRvbiBldmVudHMgKi8KLXN0YXRpYyBzdHJ1Y3Qgc29ueXBpX2V2ZW50IHNvbnlwaV9iYWNrZXZbXSA9IHsKLQl7IDB4MjAsIFNPTllQSV9FVkVOVF9CQUNLX1BSRVNTRUQgfSwKLQl7IDAsIDAgfQotfTsKLQotLyogVGhlIHNldCBvZiBwb3NzaWJsZSBoZWxwIGJ1dHRvbiBldmVudHMgKi8KLXN0YXRpYyBzdHJ1Y3Qgc29ueXBpX2V2ZW50IHNvbnlwaV9oZWxwZXZbXSA9IHsKLQl7IDB4M2IsIFNPTllQSV9FVkVOVF9IRUxQX1BSRVNTRUQgfSwKLQl7IDAsIDAgfQotfTsKLQotCi0vKiBUaGUgc2V0IG9mIHBvc3NpYmxlIGxpZCBldmVudHMgKi8KLXN0YXRpYyBzdHJ1Y3Qgc29ueXBpX2V2ZW50IHNvbnlwaV9saWRldltdID0gewotCXsgMHg1MSwgU09OWVBJX0VWRU5UX0xJRF9DTE9TRUQgfSwKLQl7IDB4NTAsIFNPTllQSV9FVkVOVF9MSURfT1BFTkVEIH0sCi0JeyAwLCAwIH0KLX07Ci0KLS8qIFRoZSBzZXQgb2YgcG9zc2libGUgem9vbSBldmVudHMgKi8KLXN0YXRpYyBzdHJ1Y3Qgc29ueXBpX2V2ZW50IHNvbnlwaV96b29tZXZbXSA9IHsKLQl7IDB4MzksIFNPTllQSV9FVkVOVF9aT09NX1BSRVNTRUQgfSwKLQl7IDB4MTAsIFNPTllQSV9FVkVOVF9aT09NX0lOX1BSRVNTRUQgfSwKLQl7IDB4MjAsIFNPTllQSV9FVkVOVF9aT09NX09VVF9QUkVTU0VEIH0sCi0JeyAwLCAwIH0KLX07Ci0KLS8qIFRoZSBzZXQgb2YgcG9zc2libGUgdGh1bWJwaHJhc2UgZXZlbnRzICovCi1zdGF0aWMgc3RydWN0IHNvbnlwaV9ldmVudCBzb255cGlfdGh1bWJwaHJhc2VldltdID0gewotCXsgMHgzYSwgU09OWVBJX0VWRU5UX1RIVU1CUEhSQVNFX1BSRVNTRUQgfSwKLQl7IDAsIDAgfQotfTsKLQotLyogVGhlIHNldCBvZiBwb3NzaWJsZSBtb3Rpb25leWUgY2FtZXJhIGV2ZW50cyAqLwotc3RhdGljIHN0cnVjdCBzb255cGlfZXZlbnQgc29ueXBpX21leWVldltdID0gewotCXsgMHgwMCwgU09OWVBJX0VWRU5UX01FWUVfRkFDRSB9LAotCXsgMHgwMSwgU09OWVBJX0VWRU5UX01FWUVfT1BQT1NJVEUgfSwKLQl7IDAsIDAgfQotfTsKLQotLyogVGhlIHNldCBvZiBwb3NzaWJsZSBtZW1vcnlzdGljayBldmVudHMgKi8KLXN0YXRpYyBzdHJ1Y3Qgc29ueXBpX2V2ZW50IHNvbnlwaV9tZW1vcnlzdGlja2V2W10gPSB7Ci0JeyAweDUzLCBTT05ZUElfRVZFTlRfTUVNT1JZU1RJQ0tfSU5TRVJUIH0sCi0JeyAweDU0LCBTT05ZUElfRVZFTlRfTUVNT1JZU1RJQ0tfRUpFQ1QgfSwKLQl7IDAsIDAgfQotfTsKLQotLyogVGhlIHNldCBvZiBwb3NzaWJsZSBiYXR0ZXJ5IGV2ZW50cyAqLwotc3RhdGljIHN0cnVjdCBzb255cGlfZXZlbnQgc29ueXBpX2JhdHRlcnlldltdID0gewotCXsgMHgyMCwgU09OWVBJX0VWRU5UX0JBVFRFUllfSU5TRVJUIH0sCi0JeyAweDMwLCBTT05ZUElfRVZFTlRfQkFUVEVSWV9SRU1PVkUgfSwKLQl7IDAsIDAgfQotfTsKLQotc3RhdGljIHN0cnVjdCBzb255cGlfZXZlbnR0eXBlcyB0eXBlMV9ldmVudHNbXSA9IHsKLQl7IDAsIDB4ZmZmZmZmZmYsIHNvbnlwaV9yZWxlYXNlZXYgfSwKLQl7IDB4NzAsIFNPTllQSV9NRVlFX01BU0ssIHNvbnlwaV9tZXllZXYgfSwKLQl7IDB4MzAsIFNPTllQSV9MSURfTUFTSywgc29ueXBpX2xpZGV2IH0sCi0JeyAweDYwLCBTT05ZUElfQ0FQVFVSRV9NQVNLLCBzb255cGlfY2FwdHVyZWV2IH0sCi0JeyAweDEwLCBTT05ZUElfSk9HR0VSX01BU0ssIHNvbnlwaV9qb2dnZXJldiB9LAotCXsgMHgyMCwgU09OWVBJX0ZOS0VZX01BU0ssIHNvbnlwaV9mbmtleWV2IH0sCi0JeyAweDMwLCBTT05ZUElfQkxVRVRPT1RIX01BU0ssIHNvbnlwaV9ibHVlZXYgfSwKLQl7IDB4NDAsIFNPTllQSV9QS0VZX01BU0ssIHNvbnlwaV9wa2V5ZXYgfSwKLQl7IDB4MzAsIFNPTllQSV9NRU1PUllTVElDS19NQVNLLCBzb255cGlfbWVtb3J5c3RpY2tldiB9LAotCXsgMHg0MCwgU09OWVBJX0JBVFRFUllfTUFTSywgc29ueXBpX2JhdHRlcnlldiB9LAotCXsgMCB9LAotfTsKLXN0YXRpYyBzdHJ1Y3Qgc29ueXBpX2V2ZW50dHlwZXMgdHlwZTJfZXZlbnRzW10gPSB7Ci0JeyAwLCAweGZmZmZmZmZmLCBzb255cGlfcmVsZWFzZWV2IH0sCi0JeyAweDM4LCBTT05ZUElfTElEX01BU0ssIHNvbnlwaV9saWRldiB9LAotCXsgMHgxMSwgU09OWVBJX0pPR0dFUl9NQVNLLCBzb255cGlfam9nZ2VyZXYgfSwKLQl7IDB4NjEsIFNPTllQSV9DQVBUVVJFX01BU0ssIHNvbnlwaV9jYXB0dXJlZXYgfSwKLQl7IDB4MjEsIFNPTllQSV9GTktFWV9NQVNLLCBzb255cGlfZm5rZXlldiB9LAotCXsgMHgzMSwgU09OWVBJX0JMVUVUT09USF9NQVNLLCBzb255cGlfYmx1ZWV2IH0sCi0JeyAweDA4LCBTT05ZUElfUEtFWV9NQVNLLCBzb255cGlfcGtleWV2IH0sCi0JeyAweDExLCBTT05ZUElfQkFDS19NQVNLLCBzb255cGlfYmFja2V2IH0sCi0JeyAweDIxLCBTT05ZUElfSEVMUF9NQVNLLCBzb255cGlfaGVscGV2IH0sCi0JeyAweDIxLCBTT05ZUElfWk9PTV9NQVNLLCBzb255cGlfem9vbWV2IH0sCi0JeyAweDIwLCBTT05ZUElfVEhVTUJQSFJBU0VfTUFTSywgc29ueXBpX3RodW1icGhyYXNlZXYgfSwKLQl7IDB4MzEsIFNPTllQSV9NRU1PUllTVElDS19NQVNLLCBzb255cGlfbWVtb3J5c3RpY2tldiB9LAotCXsgMHg0MSwgU09OWVBJX0JBVFRFUllfTUFTSywgc29ueXBpX2JhdHRlcnlldiB9LAotCXsgMHgzMSwgU09OWVBJX1BLRVlfTUFTSywgc29ueXBpX3BrZXlldiB9LAotCXsgMCB9LAotfTsKLXN0YXRpYyBzdHJ1Y3Qgc29ueXBpX2V2ZW50dHlwZXMgdHlwZTNfZXZlbnRzW10gPSB7Ci0JeyAwLCAweGZmZmZmZmZmLCBzb255cGlfcmVsZWFzZWV2IH0sCi0JeyAweDIxLCBTT05ZUElfRk5LRVlfTUFTSywgc29ueXBpX2Zua2V5ZXYgfSwKLQl7IDB4MzEsIFNPTllQSV9XSVJFTEVTU19NQVNLLCBzb255cGlfd2xlc3NldiB9LAotCXsgMHgzMSwgU09OWVBJX01FTU9SWVNUSUNLX01BU0ssIHNvbnlwaV9tZW1vcnlzdGlja2V2IH0sCi0JeyAweDQxLCBTT05ZUElfQkFUVEVSWV9NQVNLLCBzb255cGlfYmF0dGVyeWV2IH0sCi0JeyAweDMxLCBTT05ZUElfUEtFWV9NQVNLLCBzb255cGlfcGtleWV2IH0sCi0JeyAwIH0sCi19Owotc3RhdGljIHN0cnVjdCBzb255cGlfZXZlbnR0eXBlcyB0eXBlNF9ldmVudHNbXSA9IHsKLQl7IDAsIDB4ZmZmZmZmZmYsIHNvbnlwaV9yZWxlYXNlZXYgfSwKLQl7IDB4MjEsIFNPTllQSV9GTktFWV9NQVNLLCBzb255cGlfZm5rZXlldiB9LAotCXsgMHgzMSwgU09OWVBJX1dJUkVMRVNTX01BU0ssIHNvbnlwaV93bGVzc2V2IH0sCi0JeyAweDMxLCBTT05ZUElfTUVNT1JZU1RJQ0tfTUFTSywgc29ueXBpX21lbW9yeXN0aWNrZXYgfSwKLQl7IDB4NDEsIFNPTllQSV9CQVRURVJZX01BU0ssIHNvbnlwaV9iYXR0ZXJ5ZXYgfSwKLQl7IDB4MDUsIFNPTllQSV9QS0VZX01BU0ssIHNvbnlwaV9wa2V5ZXYgfSwKLQl7IDB4MDUsIFNPTllQSV9aT09NX01BU0ssIHNvbnlwaV96b29tZXYgfSwKLQl7IDB4MDUsIFNPTllQSV9DQVBUVVJFX01BU0ssIHNvbnlwaV9jYXB0dXJlZXYgfSwKLQl7IDAgfSwKLX07Ci0KLS8qIGxvdyBsZXZlbCBzcGljIGNhbGxzICovCi0jZGVmaW5lIElURVJBVElPTlNfTE9ORwkJMTAwMDAKLSNkZWZpbmUgSVRFUkFUSU9OU19TSE9SVAkxMAotI2RlZmluZSB3YWl0X29uX2NvbW1hbmQoY29tbWFuZCwgaXRlcmF0aW9ucykgewkJCQlcCi0JdW5zaWduZWQgaW50IG4gPSBpdGVyYXRpb25zOwkJCQkJXAotCXdoaWxlICgtLW4gJiYgKGNvbW1hbmQpKQkJCQkJXAotCQl1ZGVsYXkoMSk7CQkJCQkJXAotCWlmICghbikJCQkJCQkJCVwKLQkJZHByaW50aygiY29tbWFuZCBmYWlsZWQgYXQgJXMgOiAlcyAobGluZSAlZClcbiIsCVwKLQkJCQlfX0ZJTEVfXywgX19mdW5jX18sIF9fTElORV9fKTsJXAotfQotCi1zdGF0aWMgdTggc29ueV9waWNfY2FsbDEodTggZGV2KQotewotCXU4IHYxLCB2MjsKLQotCXdhaXRfb25fY29tbWFuZChpbmJfcChzcGljX2Rldi5jdXJfaW9wb3J0LT5pbzEubWluaW11bSArIDQpICYgMiwKLQkJCUlURVJBVElPTlNfTE9ORyk7Ci0Jb3V0YihkZXYsIHNwaWNfZGV2LmN1cl9pb3BvcnQtPmlvMS5taW5pbXVtICsgNCk7Ci0JdjEgPSBpbmJfcChzcGljX2Rldi5jdXJfaW9wb3J0LT5pbzEubWluaW11bSArIDQpOwotCXYyID0gaW5iX3Aoc3BpY19kZXYuY3VyX2lvcG9ydC0+aW8xLm1pbmltdW0pOwotCWRwcmludGsoInNvbnlfcGljX2NhbGwxKDB4JS4yeCk6IDB4JS40eFxuIiwgZGV2LCAodjIgPDwgOCkgfCB2MSk7Ci0JcmV0dXJuIHYyOwotfQotCi1zdGF0aWMgdTggc29ueV9waWNfY2FsbDIodTggZGV2LCB1OCBmbikKLXsKLQl1OCB2MTsKLQotCXdhaXRfb25fY29tbWFuZChpbmJfcChzcGljX2Rldi5jdXJfaW9wb3J0LT5pbzEubWluaW11bSArIDQpICYgMiwKLQkJCUlURVJBVElPTlNfTE9ORyk7Ci0Jb3V0YihkZXYsIHNwaWNfZGV2LmN1cl9pb3BvcnQtPmlvMS5taW5pbXVtICsgNCk7Ci0Jd2FpdF9vbl9jb21tYW5kKGluYl9wKHNwaWNfZGV2LmN1cl9pb3BvcnQtPmlvMS5taW5pbXVtICsgNCkgJiAyLAotCQkJSVRFUkFUSU9OU19MT05HKTsKLQlvdXRiKGZuLCBzcGljX2Rldi5jdXJfaW9wb3J0LT5pbzEubWluaW11bSk7Ci0JdjEgPSBpbmJfcChzcGljX2Rldi5jdXJfaW9wb3J0LT5pbzEubWluaW11bSk7Ci0JZHByaW50aygic29ueV9waWNfY2FsbDIoMHglLjJ4IC0gMHglLjJ4KTogMHglLjR4XG4iLCBkZXYsIGZuLCB2MSk7Ci0JcmV0dXJuIHYxOwotfQotCi1zdGF0aWMgdTggc29ueV9waWNfY2FsbDModTggZGV2LCB1OCBmbiwgdTggdikKLXsKLQl1OCB2MTsKLQotCXdhaXRfb25fY29tbWFuZChpbmJfcChzcGljX2Rldi5jdXJfaW9wb3J0LT5pbzEubWluaW11bSArIDQpICYgMiwgSVRFUkFUSU9OU19MT05HKTsKLQlvdXRiKGRldiwgc3BpY19kZXYuY3VyX2lvcG9ydC0+aW8xLm1pbmltdW0gKyA0KTsKLQl3YWl0X29uX2NvbW1hbmQoaW5iX3Aoc3BpY19kZXYuY3VyX2lvcG9ydC0+aW8xLm1pbmltdW0gKyA0KSAmIDIsIElURVJBVElPTlNfTE9ORyk7Ci0Jb3V0Yihmbiwgc3BpY19kZXYuY3VyX2lvcG9ydC0+aW8xLm1pbmltdW0pOwotCXdhaXRfb25fY29tbWFuZChpbmJfcChzcGljX2Rldi5jdXJfaW9wb3J0LT5pbzEubWluaW11bSArIDQpICYgMiwgSVRFUkFUSU9OU19MT05HKTsKLQlvdXRiKHYsIHNwaWNfZGV2LmN1cl9pb3BvcnQtPmlvMS5taW5pbXVtKTsKLQl2MSA9IGluYl9wKHNwaWNfZGV2LmN1cl9pb3BvcnQtPmlvMS5taW5pbXVtKTsKLQlkcHJpbnRrKCJzb255X3BpY19jYWxsMygweCUuMnggLSAweCUuMnggLSAweCUuMngpOiAweCUuNHhcbiIsCi0JCQlkZXYsIGZuLCB2LCB2MSk7Ci0JcmV0dXJuIHYxOwotfQotCi0vKgotICogbWluaWRyaXZlcnMgZm9yIFNQSUMgbW9kZWxzCi0gKi8KLXN0YXRpYyBpbnQgdHlwZTRfaGFuZGxlX2lycShjb25zdCB1OCBkYXRhX21hc2ssIGNvbnN0IHU4IGV2KQotewotCS8qCi0JICogMHgzMSBjb3VsZCBtZWFuIHdlIGhhdmUgdG8gdGFrZSBzb21lIGV4dHJhIGFjdGlvbiBhbmQgd2FpdCBmb3IKLQkgKiB0aGUgbmV4dCBpcnEgZm9yIHNvbWUgVHlwZTQgbW9kZWxzLCBpdCB3aWxsIGdlbmVyYXRlIGEgbmV3Ci0JICogaXJxIGFuZCB3ZSBjYW4gcmVhZCBuZXcgZGF0YSBmcm9tIHRoZSBkZXZpY2U6Ci0JICogIC0gMHg1YyBhbmQgMHg1ZiByZXF1aXJlcyAweEEwCi0JICogIC0gMHg2MSByZXF1aXJlcyAweEIzCi0JICovCi0JaWYgKGRhdGFfbWFzayA9PSAweDMxKSB7Ci0JCWlmIChldiA9PSAweDVjIHx8IGV2ID09IDB4NWYpCi0JCQlzb255X3BpY19jYWxsMSgweEEwKTsKLQkJZWxzZSBpZiAoZXYgPT0gMHg2MSkKLQkJCXNvbnlfcGljX2NhbGwxKDB4QjMpOwotCQlyZXR1cm4gMDsKLQl9Ci0JcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgZGV2aWNlX2N0cmwgc3BpY190eXBlc1tdID0gewotCXsKLQkJLm1vZGVsID0gU09OWVBJX0RFVklDRV9UWVBFMSwKLQkJLmhhbmRsZV9pcnEgPSBOVUxMLAotCQkuZXZwb3J0X29mZnNldCA9IFNPTllQSV9UWVBFMV9PRkZTRVQsCi0JCS5ldmVudF90eXBlcyA9IHR5cGUxX2V2ZW50cywKLQl9LAotCXsKLQkJLm1vZGVsID0gU09OWVBJX0RFVklDRV9UWVBFMiwKLQkJLmhhbmRsZV9pcnEgPSBOVUxMLAotCQkuZXZwb3J0X29mZnNldCA9IFNPTllQSV9UWVBFMl9PRkZTRVQsCi0JCS5ldmVudF90eXBlcyA9IHR5cGUyX2V2ZW50cywKLQl9LAotCXsKLQkJLm1vZGVsID0gU09OWVBJX0RFVklDRV9UWVBFMywKLQkJLmhhbmRsZV9pcnEgPSBOVUxMLAotCQkuZXZwb3J0X29mZnNldCA9IFNPTllQSV9UWVBFM19PRkZTRVQsCi0JCS5ldmVudF90eXBlcyA9IHR5cGUzX2V2ZW50cywKLQl9LAotCXsKLQkJLm1vZGVsID0gU09OWVBJX0RFVklDRV9UWVBFNCwKLQkJLmhhbmRsZV9pcnEgPSB0eXBlNF9oYW5kbGVfaXJxLAotCQkuZXZwb3J0X29mZnNldCA9IFNPTllQSV9UWVBFNF9PRkZTRVQsCi0JCS5ldmVudF90eXBlcyA9IHR5cGU0X2V2ZW50cywKLQl9LAotfTsKLQotc3RhdGljIHZvaWQgc29ueV9waWNfZGV0ZWN0X2RldmljZV90eXBlKHN0cnVjdCBzb255X3BpY19kZXYgKmRldikKLXsKLQlzdHJ1Y3QgcGNpX2RldiAqcGNpZGV2OwotCi0JcGNpZGV2ID0gcGNpX2dldF9kZXZpY2UoUENJX1ZFTkRPUl9JRF9JTlRFTCwKLQkJCVBDSV9ERVZJQ0VfSURfSU5URUxfODIzNzFBQl8zLCBOVUxMKTsKLQlpZiAocGNpZGV2KSB7Ci0JCWRldi0+Y29udHJvbCA9ICZzcGljX3R5cGVzWzBdOwotCQlnb3RvIG91dDsKLQl9Ci0KLQlwY2lkZXYgPSBwY2lfZ2V0X2RldmljZShQQ0lfVkVORE9SX0lEX0lOVEVMLAotCQkJUENJX0RFVklDRV9JRF9JTlRFTF9JQ0g2XzEsIE5VTEwpOwotCWlmIChwY2lkZXYpIHsKLQkJZGV2LT5jb250cm9sID0gJnNwaWNfdHlwZXNbMl07Ci0JCWdvdG8gb3V0OwotCX0KLQotCXBjaWRldiA9IHBjaV9nZXRfZGV2aWNlKFBDSV9WRU5ET1JfSURfSU5URUwsCi0JCQlQQ0lfREVWSUNFX0lEX0lOVEVMX0lDSDdfMSwgTlVMTCk7Ci0JaWYgKHBjaWRldikgewotCQlkZXYtPmNvbnRyb2wgPSAmc3BpY190eXBlc1szXTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JcGNpZGV2ID0gcGNpX2dldF9kZXZpY2UoUENJX1ZFTkRPUl9JRF9JTlRFTCwKLQkJCVBDSV9ERVZJQ0VfSURfSU5URUxfSUNIOF80LCBOVUxMKTsKLQlpZiAocGNpZGV2KSB7Ci0JCWRldi0+Y29udHJvbCA9ICZzcGljX3R5cGVzWzNdOwotCQlnb3RvIG91dDsKLQl9Ci0KLQkvKiBkZWZhdWx0ICovCi0JZGV2LT5jb250cm9sID0gJnNwaWNfdHlwZXNbMV07Ci0KLW91dDoKLQlpZiAocGNpZGV2KQotCQlwY2lfZGV2X3B1dChwY2lkZXYpOwotCi0JcHJpbnRrKEtFUk5fSU5GTyBEUlZfUEZYICJkZXRlY3RlZCBUeXBlJWQgbW9kZWxcbiIsCi0JCQlkZXYtPmNvbnRyb2wtPm1vZGVsID09IFNPTllQSV9ERVZJQ0VfVFlQRTEgPyAxIDoKLQkJCWRldi0+Y29udHJvbC0+bW9kZWwgPT0gU09OWVBJX0RFVklDRV9UWVBFMiA/IDIgOgotCQkJZGV2LT5jb250cm9sLT5tb2RlbCA9PSBTT05ZUElfREVWSUNFX1RZUEUzID8gMyA6IDQpOwotfQotCi0vKiBjYW1lcmEgdGVzdHMgYW5kIHBvd2Vyb24vcG93ZXJvZmYgKi8KLSNkZWZpbmUgU09OWVBJX0NBTUVSQV9QSUNUVVJFCQk1Ci0jZGVmaW5lIFNPTllQSV9DQU1FUkFfQ09OVFJPTAkJMHgxMAotCi0jZGVmaW5lIFNPTllQSV9DQU1FUkFfQlJJR0hUTkVTUwkJMAotI2RlZmluZSBTT05ZUElfQ0FNRVJBX0NPTlRSQVNUCQkJMQotI2RlZmluZSBTT05ZUElfQ0FNRVJBX0hVRQkJCTIKLSNkZWZpbmUgU09OWVBJX0NBTUVSQV9DT0xPUgkJCTMKLSNkZWZpbmUgU09OWVBJX0NBTUVSQV9TSEFSUE5FU1MJCQk0Ci0KLSNkZWZpbmUgU09OWVBJX0NBTUVSQV9FWFBPU1VSRV9NQVNLCQkweEMKLSNkZWZpbmUgU09OWVBJX0NBTUVSQV9XSElURV9CQUxBTkNFX01BU0sJMHgzCi0jZGVmaW5lIFNPTllQSV9DQU1FUkFfUElDVFVSRV9NT0RFX01BU0sJCTB4MzAKLSNkZWZpbmUgU09OWVBJX0NBTUVSQV9NVVRFX01BU0sJCQkweDQwCi0KLS8qIHRoZSByZXN0IGRvbid0IG5lZWQgYSBsb29wIHVudGlsIG5vdCAweGZmICovCi0jZGVmaW5lIFNPTllQSV9DQU1FUkFfQUdDCQkJNgotI2RlZmluZSBTT05ZUElfQ0FNRVJBX0FHQ19NQVNLCQkJMHgzMAotI2RlZmluZSBTT05ZUElfQ0FNRVJBX1NIVVRURVJfTUFTSyAJCTB4NwotCi0jZGVmaW5lIFNPTllQSV9DQU1FUkFfU0hVVERPV05fUkVRVUVTVAkJNwotI2RlZmluZSBTT05ZUElfQ0FNRVJBX0NPTlRST0wJCQkweDEwCi0KLSNkZWZpbmUgU09OWVBJX0NBTUVSQV9TVEFUVVMgCQkJNwotI2RlZmluZSBTT05ZUElfQ0FNRVJBX1NUQVRVU19SRUFEWSAJCTB4MgotI2RlZmluZSBTT05ZUElfQ0FNRVJBX1NUQVRVU19QT1NJVElPTgkJMHg0Ci0KLSNkZWZpbmUgU09OWVBJX0RJUkVDVElPTl9CQUNLV0FSRFMgCQkweDQKLQotI2RlZmluZSBTT05ZUElfQ0FNRVJBX1JFVklTSU9OIAkJCTgKLSNkZWZpbmUgU09OWVBJX0NBTUVSQV9ST01WRVJTSU9OIAkJOQotCi1zdGF0aWMgaW50IF9fc29ueV9waWNfY2FtZXJhX3JlYWR5KHZvaWQpCi17Ci0JdTggdjsKLQotCXYgPSBzb255X3BpY19jYWxsMigweDhmLCBTT05ZUElfQ0FNRVJBX1NUQVRVUyk7Ci0JcmV0dXJuICh2ICE9IDB4ZmYgJiYgKHYgJiBTT05ZUElfQ0FNRVJBX1NUQVRVU19SRUFEWSkpOwotfQotCi1zdGF0aWMgaW50IF9fc29ueV9waWNfY2FtZXJhX29mZih2b2lkKQotewotCWlmICghY2FtZXJhKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgRFJWX1BGWCAiY2FtZXJhIGNvbnRyb2wgbm90IGVuYWJsZWRcbiIpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0KLQl3YWl0X29uX2NvbW1hbmQoc29ueV9waWNfY2FsbDMoMHg5MCwgU09OWVBJX0NBTUVSQV9QSUNUVVJFLAotCQkJCVNPTllQSV9DQU1FUkFfTVVURV9NQVNLKSwKLQkJCUlURVJBVElPTlNfU0hPUlQpOwotCi0JaWYgKHNwaWNfZGV2LmNhbWVyYV9wb3dlcikgewotCQlzb255X3BpY19jYWxsMigweDkxLCAwKTsKLQkJc3BpY19kZXYuY2FtZXJhX3Bvd2VyID0gMDsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgX19zb255X3BpY19jYW1lcmFfb24odm9pZCkKLXsKLQlpbnQgaSwgaiwgeDsKLQotCWlmICghY2FtZXJhKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgRFJWX1BGWCAiY2FtZXJhIGNvbnRyb2wgbm90IGVuYWJsZWRcbiIpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0KLQlpZiAoc3BpY19kZXYuY2FtZXJhX3Bvd2VyKQotCQlyZXR1cm4gMDsKLQotCWZvciAoaiA9IDU7IGogPiAwOyBqLS0pIHsKLQotCQlmb3IgKHggPSAwOyB4IDwgMTAwICYmIHNvbnlfcGljX2NhbGwyKDB4OTEsIDB4MSk7IHgrKykKLQkJCW1zbGVlcCgxMCk7Ci0JCXNvbnlfcGljX2NhbGwxKDB4OTMpOwotCi0JCWZvciAoaSA9IDQwMDsgaSA+IDA7IGktLSkgewotCQkJaWYgKF9fc29ueV9waWNfY2FtZXJhX3JlYWR5KCkpCi0JCQkJYnJlYWs7Ci0JCQltc2xlZXAoMTApOwotCQl9Ci0JCWlmIChpKQotCQkJYnJlYWs7Ci0JfQotCi0JaWYgKGogPT0gMCkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HIERSVl9QRlggImZhaWxlZCB0byBwb3dlciBvbiBjYW1lcmFcbiIpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0KLQl3YWl0X29uX2NvbW1hbmQoc29ueV9waWNfY2FsbDMoMHg5MCwgU09OWVBJX0NBTUVSQV9DT05UUk9MLAotCQkJCTB4NWEpLAotCQkJSVRFUkFUSU9OU19TSE9SVCk7Ci0KLQlzcGljX2Rldi5jYW1lcmFfcG93ZXIgPSAxOwotCXJldHVybiAwOwotfQotCi0vKiBFeHRlcm5hbCBjYW1lcmEgY29tbWFuZCAoZXhwb3J0ZWQgdG8gdGhlIG1vdGlvbiBleWUgdjRsIGRyaXZlcikgKi8KLWludCBzb255X3BpY19jYW1lcmFfY29tbWFuZChpbnQgY29tbWFuZCwgdTggdmFsdWUpCi17Ci0JaWYgKCFjYW1lcmEpCi0JCXJldHVybiAtRUlPOwotCi0JbXV0ZXhfbG9jaygmc3BpY19kZXYubG9jayk7Ci0KLQlzd2l0Y2ggKGNvbW1hbmQpIHsKLQljYXNlIFNPTllfUElDX0NPTU1BTkRfU0VUQ0FNRVJBOgotCQlpZiAodmFsdWUpCi0JCQlfX3NvbnlfcGljX2NhbWVyYV9vbigpOwotCQllbHNlCi0JCQlfX3NvbnlfcGljX2NhbWVyYV9vZmYoKTsKLQkJYnJlYWs7Ci0JY2FzZSBTT05ZX1BJQ19DT01NQU5EX1NFVENBTUVSQUJSSUdIVE5FU1M6Ci0JCXdhaXRfb25fY29tbWFuZChzb255X3BpY19jYWxsMygweDkwLCBTT05ZUElfQ0FNRVJBX0JSSUdIVE5FU1MsIHZhbHVlKSwKLQkJCQlJVEVSQVRJT05TX1NIT1JUKTsKLQkJYnJlYWs7Ci0JY2FzZSBTT05ZX1BJQ19DT01NQU5EX1NFVENBTUVSQUNPTlRSQVNUOgotCQl3YWl0X29uX2NvbW1hbmQoc29ueV9waWNfY2FsbDMoMHg5MCwgU09OWVBJX0NBTUVSQV9DT05UUkFTVCwgdmFsdWUpLAotCQkJCUlURVJBVElPTlNfU0hPUlQpOwotCQlicmVhazsKLQljYXNlIFNPTllfUElDX0NPTU1BTkRfU0VUQ0FNRVJBSFVFOgotCQl3YWl0X29uX2NvbW1hbmQoc29ueV9waWNfY2FsbDMoMHg5MCwgU09OWVBJX0NBTUVSQV9IVUUsIHZhbHVlKSwKLQkJCQlJVEVSQVRJT05TX1NIT1JUKTsKLQkJYnJlYWs7Ci0JY2FzZSBTT05ZX1BJQ19DT01NQU5EX1NFVENBTUVSQUNPTE9SOgotCQl3YWl0X29uX2NvbW1hbmQoc29ueV9waWNfY2FsbDMoMHg5MCwgU09OWVBJX0NBTUVSQV9DT0xPUiwgdmFsdWUpLAotCQkJCUlURVJBVElPTlNfU0hPUlQpOwotCQlicmVhazsKLQljYXNlIFNPTllfUElDX0NPTU1BTkRfU0VUQ0FNRVJBU0hBUlBORVNTOgotCQl3YWl0X29uX2NvbW1hbmQoc29ueV9waWNfY2FsbDMoMHg5MCwgU09OWVBJX0NBTUVSQV9TSEFSUE5FU1MsIHZhbHVlKSwKLQkJCQlJVEVSQVRJT05TX1NIT1JUKTsKLQkJYnJlYWs7Ci0JY2FzZSBTT05ZX1BJQ19DT01NQU5EX1NFVENBTUVSQVBJQ1RVUkU6Ci0JCXdhaXRfb25fY29tbWFuZChzb255X3BpY19jYWxsMygweDkwLCBTT05ZUElfQ0FNRVJBX1BJQ1RVUkUsIHZhbHVlKSwKLQkJCQlJVEVSQVRJT05TX1NIT1JUKTsKLQkJYnJlYWs7Ci0JY2FzZSBTT05ZX1BJQ19DT01NQU5EX1NFVENBTUVSQUFHQzoKLQkJd2FpdF9vbl9jb21tYW5kKHNvbnlfcGljX2NhbGwzKDB4OTAsIFNPTllQSV9DQU1FUkFfQUdDLCB2YWx1ZSksCi0JCQkJSVRFUkFUSU9OU19TSE9SVCk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXByaW50ayhLRVJOX0VSUiBEUlZfUEZYICJzb255X3BpY19jYW1lcmFfY29tbWFuZCBpbnZhbGlkOiAlZFxuIiwKLQkJICAgICAgIGNvbW1hbmQpOwotCQlicmVhazsKLQl9Ci0JbXV0ZXhfdW5sb2NrKCZzcGljX2Rldi5sb2NrKTsKLQlyZXR1cm4gMDsKLX0KLUVYUE9SVF9TWU1CT0woc29ueV9waWNfY2FtZXJhX2NvbW1hbmQpOwotCi0vKiBncHJzL2VkZ2UgbW9kZW0gKFNaNDYwTiBhbmQgU1oyMTBQKSwgdGhhbmtzIHRvIEpvc2h1YSBXaXNlICovCi1zdGF0aWMgdm9pZCBzb255X3BpY19zZXRfd3dhbnBvd2VyKHU4IHN0YXRlKQotewotCXN0YXRlID0gISFzdGF0ZTsKLQltdXRleF9sb2NrKCZzcGljX2Rldi5sb2NrKTsKLQlpZiAoc3BpY19kZXYud3dhbl9wb3dlciA9PSBzdGF0ZSkgewotCQltdXRleF91bmxvY2soJnNwaWNfZGV2LmxvY2spOwotCQlyZXR1cm47Ci0JfQotCXNvbnlfcGljX2NhbGwyKDB4QjAsIHN0YXRlKTsKLQlzcGljX2Rldi53d2FuX3Bvd2VyID0gc3RhdGU7Ci0JbXV0ZXhfdW5sb2NrKCZzcGljX2Rldi5sb2NrKTsKLX0KLQotc3RhdGljIHNzaXplX3Qgc29ueV9waWNfd3dhbnBvd2VyX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCWNvbnN0IGNoYXIgKmJ1ZmZlciwgc2l6ZV90IGNvdW50KQotewotCXVuc2lnbmVkIGxvbmcgdmFsdWU7Ci0JaWYgKGNvdW50ID4gMzEpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JdmFsdWUgPSBzaW1wbGVfc3RydG91bChidWZmZXIsIE5VTEwsIDEwKTsKLQlzb255X3BpY19zZXRfd3dhbnBvd2VyKHZhbHVlKTsKLQotCXJldHVybiBjb3VudDsKLX0KLQotc3RhdGljIHNzaXplX3Qgc29ueV9waWNfd3dhbnBvd2VyX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAotCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmZmVyKQotewotCXNzaXplX3QgY291bnQ7Ci0JbXV0ZXhfbG9jaygmc3BpY19kZXYubG9jayk7Ci0JY291bnQgPSBzbnByaW50ZihidWZmZXIsIFBBR0VfU0laRSwgIiVkXG4iLCBzcGljX2Rldi53d2FuX3Bvd2VyKTsKLQltdXRleF91bmxvY2soJnNwaWNfZGV2LmxvY2spOwotCXJldHVybiBjb3VudDsKLX0KLQotLyogYmx1ZXRvb3RoIHN1YnN5c3RlbSBwb3dlciBzdGF0ZSAqLwotc3RhdGljIHZvaWQgX19zb255X3BpY19zZXRfYmx1ZXRvb3RocG93ZXIodTggc3RhdGUpCi17Ci0Jc3RhdGUgPSAhIXN0YXRlOwotCWlmIChzcGljX2Rldi5ibHVldG9vdGhfcG93ZXIgPT0gc3RhdGUpCi0JCXJldHVybjsKLQlzb255X3BpY19jYWxsMigweDk2LCBzdGF0ZSk7Ci0Jc29ueV9waWNfY2FsbDEoMHg4Mik7Ci0Jc3BpY19kZXYuYmx1ZXRvb3RoX3Bvd2VyID0gc3RhdGU7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IHNvbnlfcGljX2JsdWV0b290aHBvd2VyX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCWNvbnN0IGNoYXIgKmJ1ZmZlciwgc2l6ZV90IGNvdW50KQotewotCXVuc2lnbmVkIGxvbmcgdmFsdWU7Ci0JaWYgKGNvdW50ID4gMzEpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JdmFsdWUgPSBzaW1wbGVfc3RydG91bChidWZmZXIsIE5VTEwsIDEwKTsKLQltdXRleF9sb2NrKCZzcGljX2Rldi5sb2NrKTsKLQlfX3NvbnlfcGljX3NldF9ibHVldG9vdGhwb3dlcih2YWx1ZSk7Ci0JbXV0ZXhfdW5sb2NrKCZzcGljX2Rldi5sb2NrKTsKLQotCXJldHVybiBjb3VudDsKLX0KLQotc3RhdGljIHNzaXplX3Qgc29ueV9waWNfYmx1ZXRvb3RocG93ZXJfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWZmZXIpCi17Ci0Jc3NpemVfdCBjb3VudCA9IDA7Ci0JbXV0ZXhfbG9jaygmc3BpY19kZXYubG9jayk7Ci0JY291bnQgPSBzbnByaW50ZihidWZmZXIsIFBBR0VfU0laRSwgIiVkXG4iLCBzcGljX2Rldi5ibHVldG9vdGhfcG93ZXIpOwotCW11dGV4X3VubG9jaygmc3BpY19kZXYubG9jayk7Ci0JcmV0dXJuIGNvdW50OwotfQotCi0vKiBmYW4gc3BlZWQgKi8KLS8qIEZBTjAgaW5mb3JtYXRpb24gKHJldmVyc2UgZW5naW5lZXJlZCBmcm9tIEFDUEkgdGFibGVzKSAqLwotI2RlZmluZSBTT05ZX1BJQ19GQU4wX1NUQVRVUwkweDkzCi1zdGF0aWMgaW50IHNvbnlfcGljX3NldF9mYW5zcGVlZCh1bnNpZ25lZCBsb25nIHZhbHVlKQotewotCXJldHVybiBlY193cml0ZShTT05ZX1BJQ19GQU4wX1NUQVRVUywgdmFsdWUpOwotfQotCi1zdGF0aWMgaW50IHNvbnlfcGljX2dldF9mYW5zcGVlZCh1OCAqdmFsdWUpCi17Ci0JcmV0dXJuIGVjX3JlYWQoU09OWV9QSUNfRkFOMF9TVEFUVVMsIHZhbHVlKTsKLX0KLQotc3RhdGljIHNzaXplX3Qgc29ueV9waWNfZmFuc3BlZWRfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAotCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJY29uc3QgY2hhciAqYnVmZmVyLCBzaXplX3QgY291bnQpCi17Ci0JdW5zaWduZWQgbG9uZyB2YWx1ZTsKLQlpZiAoY291bnQgPiAzMSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQl2YWx1ZSA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZmZlciwgTlVMTCwgMTApOwotCWlmIChzb255X3BpY19zZXRfZmFuc3BlZWQodmFsdWUpKQotCQlyZXR1cm4gLUVJTzsKLQotCXJldHVybiBjb3VudDsKLX0KLQotc3RhdGljIHNzaXplX3Qgc29ueV9waWNfZmFuc3BlZWRfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWZmZXIpCi17Ci0JdTggdmFsdWUgPSAwOwotCWlmIChzb255X3BpY19nZXRfZmFuc3BlZWQoJnZhbHVlKSkKLQkJcmV0dXJuIC1FSU87Ci0KLQlyZXR1cm4gc25wcmludGYoYnVmZmVyLCBQQUdFX1NJWkUsICIlZFxuIiwgdmFsdWUpOwotfQotCi0jZGVmaW5lIFNQSUNfQVRUUihfbmFtZSwgX21vZGUpCQkJCQlcCi1zdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSBzcGljX2F0dHJfIyNfbmFtZSA9IF9fQVRUUihfbmFtZSwJXAotCQlfbW9kZSwgc29ueV9waWNfIyMgX25hbWUgIyNfc2hvdywJCVwKLQkJc29ueV9waWNfIyMgX25hbWUgIyNfc3RvcmUpCi0KLXN0YXRpYyBTUElDX0FUVFIoYmx1ZXRvb3RocG93ZXIsIDA2NDQpOwotc3RhdGljIFNQSUNfQVRUUih3d2FucG93ZXIsIDA2NDQpOwotc3RhdGljIFNQSUNfQVRUUihmYW5zcGVlZCwgMDY0NCk7Ci0KLXN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpzcGljX2F0dHJpYnV0ZXNbXSA9IHsKLQkmc3BpY19hdHRyX2JsdWV0b290aHBvd2VyLmF0dHIsCi0JJnNwaWNfYXR0cl93d2FucG93ZXIuYXR0ciwKLQkmc3BpY19hdHRyX2ZhbnNwZWVkLmF0dHIsCi0JTlVMTAotfTsKLQotc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgc3BpY19hdHRyaWJ1dGVfZ3JvdXAgPSB7Ci0JLmF0dHJzID0gc3BpY19hdHRyaWJ1dGVzCi19OwotCi0vKioqKioqKiogU09OWVBJIGNvbXBhdGliaWxpdHkgKioqKioqKioqKi8KLSNpZmRlZiBDT05GSUdfU09OWVBJX0NPTVBBVAotCi0vKiBiYXR0ZXJ5IC8gYnJpZ2h0bmVzcyAvIHRlbXBlcmF0dXJlICBhZGRyZXNzZXMgKi8KLSNkZWZpbmUgU09OWVBJX0JBVF9GTEFHUwkweDgxCi0jZGVmaW5lIFNPTllQSV9MQ0RfTElHSFQJMHg5NgotI2RlZmluZSBTT05ZUElfQkFUMV9QQ1RSTQkweGEwCi0jZGVmaW5lIFNPTllQSV9CQVQxX0xFRlQJMHhhMgotI2RlZmluZSBTT05ZUElfQkFUMV9NQVhSVAkweGE0Ci0jZGVmaW5lIFNPTllQSV9CQVQyX1BDVFJNCTB4YTgKLSNkZWZpbmUgU09OWVBJX0JBVDJfTEVGVAkweGFhCi0jZGVmaW5lIFNPTllQSV9CQVQyX01BWFJUCTB4YWMKLSNkZWZpbmUgU09OWVBJX0JBVDFfTUFYVEsJMHhiMAotI2RlZmluZSBTT05ZUElfQkFUMV9GVUxMCTB4YjIKLSNkZWZpbmUgU09OWVBJX0JBVDJfTUFYVEsJMHhiOAotI2RlZmluZSBTT05ZUElfQkFUMl9GVUxMCTB4YmEKLSNkZWZpbmUgU09OWVBJX1RFTVBfU1RBVFVTCTB4QzEKLQotc3RydWN0IHNvbnlwaV9jb21wYXRfcyB7Ci0Jc3RydWN0IGZhc3luY19zdHJ1Y3QJKmZpZm9fYXN5bmM7Ci0Jc3RydWN0IGtmaWZvCQkqZmlmbzsKLQlzcGlubG9ja190CQlmaWZvX2xvY2s7Ci0Jd2FpdF9xdWV1ZV9oZWFkX3QJZmlmb19wcm9jX2xpc3Q7Ci0JYXRvbWljX3QJCW9wZW5fY291bnQ7Ci19Owotc3RhdGljIHN0cnVjdCBzb255cGlfY29tcGF0X3Mgc29ueXBpX2NvbXBhdCA9IHsKLQkub3Blbl9jb3VudCA9IEFUT01JQ19JTklUKDApLAotfTsKLQotc3RhdGljIGludCBzb255cGlfbWlzY19mYXN5bmMoaW50IGZkLCBzdHJ1Y3QgZmlsZSAqZmlscCwgaW50IG9uKQotewotCWludCByZXR2YWw7Ci0KLQlyZXR2YWwgPSBmYXN5bmNfaGVscGVyKGZkLCBmaWxwLCBvbiwgJnNvbnlwaV9jb21wYXQuZmlmb19hc3luYyk7Ci0JaWYgKHJldHZhbCA8IDApCi0JCXJldHVybiByZXR2YWw7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgc29ueXBpX21pc2NfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlhdG9taWNfZGVjKCZzb255cGlfY29tcGF0Lm9wZW5fY291bnQpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHNvbnlwaV9taXNjX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0JLyogRmx1c2ggaW5wdXQgcXVldWUgb24gZmlyc3Qgb3BlbiAqLwotCWxvY2tfa2VybmVsKCk7Ci0JaWYgKGF0b21pY19pbmNfcmV0dXJuKCZzb255cGlfY29tcGF0Lm9wZW5fY291bnQpID09IDEpCi0JCWtmaWZvX3Jlc2V0KHNvbnlwaV9jb21wYXQuZmlmbyk7Ci0JdW5sb2NrX2tlcm5lbCgpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3NpemVfdCBzb255cGlfbWlzY19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLAotCQkJCXNpemVfdCBjb3VudCwgbG9mZl90ICpwb3MpCi17Ci0Jc3NpemVfdCByZXQ7Ci0JdW5zaWduZWQgY2hhciBjOwotCi0JaWYgKChrZmlmb19sZW4oc29ueXBpX2NvbXBhdC5maWZvKSA9PSAwKSAmJgotCSAgICAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spKQotCQlyZXR1cm4gLUVBR0FJTjsKLQotCXJldCA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShzb255cGlfY29tcGF0LmZpZm9fcHJvY19saXN0LAotCQkJCSAgICAgICBrZmlmb19sZW4oc29ueXBpX2NvbXBhdC5maWZvKSAhPSAwKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCi0Jd2hpbGUgKHJldCA8IGNvdW50ICYmCi0JICAgICAgIChrZmlmb19nZXQoc29ueXBpX2NvbXBhdC5maWZvLCAmYywgc2l6ZW9mKGMpKSA9PSBzaXplb2YoYykpKSB7Ci0JCWlmIChwdXRfdXNlcihjLCBidWYrKykpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJcmV0Kys7Ci0JfQotCi0JaWYgKHJldCA+IDApIHsKLQkJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGU7Ci0JCWlub2RlLT5pX2F0aW1lID0gY3VycmVudF9mc190aW1lKGlub2RlLT5pX3NiKTsKLQl9Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdW5zaWduZWQgaW50IHNvbnlwaV9taXNjX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHBvbGxfdGFibGUgKndhaXQpCi17Ci0JcG9sbF93YWl0KGZpbGUsICZzb255cGlfY29tcGF0LmZpZm9fcHJvY19saXN0LCB3YWl0KTsKLQlpZiAoa2ZpZm9fbGVuKHNvbnlwaV9jb21wYXQuZmlmbykpCi0JCXJldHVybiBQT0xMSU4gfCBQT0xMUkROT1JNOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGVjX3JlYWQxNih1OCBhZGRyLCB1MTYgKnZhbHVlKQotewotCXU4IHZhbF9sYiwgdmFsX2hiOwotCWlmIChlY19yZWFkKGFkZHIsICZ2YWxfbGIpKQotCQlyZXR1cm4gLTE7Ci0JaWYgKGVjX3JlYWQoYWRkciArIDEsICZ2YWxfaGIpKQotCQlyZXR1cm4gLTE7Ci0JKnZhbHVlID0gdmFsX2xiIHwgKHZhbF9oYiA8PCA4KTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBzb255cGlfbWlzY19pb2N0bChzdHJ1Y3QgaW5vZGUgKmlwLCBzdHJ1Y3QgZmlsZSAqZnAsCi0JCQkgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQotewotCWludCByZXQgPSAwOwotCXZvaWQgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOwotCXU4IHZhbDg7Ci0JdTE2IHZhbDE2OwotCWludCB2YWx1ZTsKLQotCW11dGV4X2xvY2soJnNwaWNfZGV2LmxvY2spOwotCXN3aXRjaCAoY21kKSB7Ci0JY2FzZSBTT05ZUElfSU9DR0JSVDoKLQkJaWYgKHNvbnlfYmFja2xpZ2h0X2RldmljZSA9PSBOVUxMKSB7Ci0JCQlyZXQgPSAtRUlPOwotCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKGFjcGlfY2FsbGdldGZ1bmMoc29ueV9uY19hY3BpX2hhbmRsZSwgIkdCUlQiLCAmdmFsdWUpKSB7Ci0JCQlyZXQgPSAtRUlPOwotCQkJYnJlYWs7Ci0JCX0KLQkJdmFsOCA9ICgodmFsdWUgJiAweGZmKSAtIDEpIDw8IDU7Ci0JCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJnZhbDgsIHNpemVvZih2YWw4KSkpCi0JCQkJcmV0ID0gLUVGQVVMVDsKLQkJYnJlYWs7Ci0JY2FzZSBTT05ZUElfSU9DU0JSVDoKLQkJaWYgKHNvbnlfYmFja2xpZ2h0X2RldmljZSA9PSBOVUxMKSB7Ci0JCQlyZXQgPSAtRUlPOwotCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZ2YWw4LCBhcmdwLCBzaXplb2YodmFsOCkpKSB7Ci0JCQlyZXQgPSAtRUZBVUxUOwotCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKGFjcGlfY2FsbHNldGZ1bmMoc29ueV9uY19hY3BpX2hhbmRsZSwgIlNCUlQiLAotCQkJCSh2YWw4ID4+IDUpICsgMSwgTlVMTCkpIHsKLQkJCXJldCA9IC1FSU87Ci0JCQlicmVhazsKLQkJfQotCQkvKiBzeW5jIHRoZSBiYWNrbGlnaHQgZGV2aWNlIHN0YXR1cyAqLwotCQlzb255X2JhY2tsaWdodF9kZXZpY2UtPnByb3BzLmJyaWdodG5lc3MgPQotCQkgICAgc29ueV9iYWNrbGlnaHRfZ2V0X2JyaWdodG5lc3Moc29ueV9iYWNrbGlnaHRfZGV2aWNlKTsKLQkJYnJlYWs7Ci0JY2FzZSBTT05ZUElfSU9DR0JBVDFDQVA6Ci0JCWlmIChlY19yZWFkMTYoU09OWVBJX0JBVDFfRlVMTCwgJnZhbDE2KSkgewotCQkJcmV0ID0gLUVJTzsKLQkJCWJyZWFrOwotCQl9Ci0JCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJnZhbDE2LCBzaXplb2YodmFsMTYpKSkKLQkJCXJldCA9IC1FRkFVTFQ7Ci0JCWJyZWFrOwotCWNhc2UgU09OWVBJX0lPQ0dCQVQxUkVNOgotCQlpZiAoZWNfcmVhZDE2KFNPTllQSV9CQVQxX0xFRlQsICZ2YWwxNikpIHsKLQkJCXJldCA9IC1FSU87Ci0JCQlicmVhazsKLQkJfQotCQlpZiAoY29weV90b191c2VyKGFyZ3AsICZ2YWwxNiwgc2l6ZW9mKHZhbDE2KSkpCi0JCQlyZXQgPSAtRUZBVUxUOwotCQlicmVhazsKLQljYXNlIFNPTllQSV9JT0NHQkFUMkNBUDoKLQkJaWYgKGVjX3JlYWQxNihTT05ZUElfQkFUMl9GVUxMLCAmdmFsMTYpKSB7Ci0JCQlyZXQgPSAtRUlPOwotCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmdmFsMTYsIHNpemVvZih2YWwxNikpKQotCQkJcmV0ID0gLUVGQVVMVDsKLQkJYnJlYWs7Ci0JY2FzZSBTT05ZUElfSU9DR0JBVDJSRU06Ci0JCWlmIChlY19yZWFkMTYoU09OWVBJX0JBVDJfTEVGVCwgJnZhbDE2KSkgewotCQkJcmV0ID0gLUVJTzsKLQkJCWJyZWFrOwotCQl9Ci0JCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJnZhbDE2LCBzaXplb2YodmFsMTYpKSkKLQkJCXJldCA9IC1FRkFVTFQ7Ci0JCWJyZWFrOwotCWNhc2UgU09OWVBJX0lPQ0dCQVRGTEFHUzoKLQkJaWYgKGVjX3JlYWQoU09OWVBJX0JBVF9GTEFHUywgJnZhbDgpKSB7Ci0JCQlyZXQgPSAtRUlPOwotCQkJYnJlYWs7Ci0JCX0KLQkJdmFsOCAmPSAweDA3OwotCQlpZiAoY29weV90b191c2VyKGFyZ3AsICZ2YWw4LCBzaXplb2YodmFsOCkpKQotCQkJcmV0ID0gLUVGQVVMVDsKLQkJYnJlYWs7Ci0JY2FzZSBTT05ZUElfSU9DR0JMVUU6Ci0JCXZhbDggPSBzcGljX2Rldi5ibHVldG9vdGhfcG93ZXI7Ci0JCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJnZhbDgsIHNpemVvZih2YWw4KSkpCi0JCQlyZXQgPSAtRUZBVUxUOwotCQlicmVhazsKLQljYXNlIFNPTllQSV9JT0NTQkxVRToKLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZ2YWw4LCBhcmdwLCBzaXplb2YodmFsOCkpKSB7Ci0JCQlyZXQgPSAtRUZBVUxUOwotCQkJYnJlYWs7Ci0JCX0KLQkJX19zb255X3BpY19zZXRfYmx1ZXRvb3RocG93ZXIodmFsOCk7Ci0JCWJyZWFrOwotCS8qIEZBTiBDb250cm9scyAqLwotCWNhc2UgU09OWVBJX0lPQ0dGQU46Ci0JCWlmIChzb255X3BpY19nZXRfZmFuc3BlZWQoJnZhbDgpKSB7Ci0JCQlyZXQgPSAtRUlPOwotCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmdmFsOCwgc2l6ZW9mKHZhbDgpKSkKLQkJCXJldCA9IC1FRkFVTFQ7Ci0JCWJyZWFrOwotCWNhc2UgU09OWVBJX0lPQ1NGQU46Ci0JCWlmIChjb3B5X2Zyb21fdXNlcigmdmFsOCwgYXJncCwgc2l6ZW9mKHZhbDgpKSkgewotCQkJcmV0ID0gLUVGQVVMVDsKLQkJCWJyZWFrOwotCQl9Ci0JCWlmIChzb255X3BpY19zZXRfZmFuc3BlZWQodmFsOCkpCi0JCQlyZXQgPSAtRUlPOwotCQlicmVhazsKLQkvKiBHRVQgVGVtcGVyYXR1cmUgKHVzZWZ1bCB1bmRlciBBUE0pICovCi0JY2FzZSBTT05ZUElfSU9DR1RFTVA6Ci0JCWlmIChlY19yZWFkKFNPTllQSV9URU1QX1NUQVRVUywgJnZhbDgpKSB7Ci0JCQlyZXQgPSAtRUlPOwotCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmdmFsOCwgc2l6ZW9mKHZhbDgpKSkKLQkJCXJldCA9IC1FRkFVTFQ7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJldCA9IC1FSU5WQUw7Ci0JfQotCW11dGV4X3VubG9jaygmc3BpY19kZXYubG9jayk7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgc29ueXBpX21pc2NfZm9wcyA9IHsKLQkub3duZXIJCT0gVEhJU19NT0RVTEUsCi0JLnJlYWQJCT0gc29ueXBpX21pc2NfcmVhZCwKLQkucG9sbAkJPSBzb255cGlfbWlzY19wb2xsLAotCS5vcGVuCQk9IHNvbnlwaV9taXNjX29wZW4sCi0JLnJlbGVhc2UJPSBzb255cGlfbWlzY19yZWxlYXNlLAotCS5mYXN5bmMJCT0gc29ueXBpX21pc2NfZmFzeW5jLAotCS5pb2N0bAkJPSBzb255cGlfbWlzY19pb2N0bCwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSBzb255cGlfbWlzY19kZXZpY2UgPSB7Ci0JLm1pbm9yCQk9IE1JU0NfRFlOQU1JQ19NSU5PUiwKLQkubmFtZQkJPSAic29ueXBpIiwKLQkuZm9wcwkJPSAmc29ueXBpX21pc2NfZm9wcywKLX07Ci0KLXN0YXRpYyB2b2lkIHNvbnlwaV9jb21wYXRfcmVwb3J0X2V2ZW50KHU4IGV2ZW50KQotewotCWtmaWZvX3B1dChzb255cGlfY29tcGF0LmZpZm8sICh1bnNpZ25lZCBjaGFyICopJmV2ZW50LCBzaXplb2YoZXZlbnQpKTsKLQlraWxsX2Zhc3luYygmc29ueXBpX2NvbXBhdC5maWZvX2FzeW5jLCBTSUdJTywgUE9MTF9JTik7Ci0Jd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZzb255cGlfY29tcGF0LmZpZm9fcHJvY19saXN0KTsKLX0KLQotc3RhdGljIGludCBzb255cGlfY29tcGF0X2luaXQodm9pZCkKLXsKLQlpbnQgZXJyb3I7Ci0KLQlzcGluX2xvY2tfaW5pdCgmc29ueXBpX2NvbXBhdC5maWZvX2xvY2spOwotCXNvbnlwaV9jb21wYXQuZmlmbyA9IGtmaWZvX2FsbG9jKFNPTllfTEFQVE9QX0JVRl9TSVpFLCBHRlBfS0VSTkVMLAotCQkJCQkgJnNvbnlwaV9jb21wYXQuZmlmb19sb2NrKTsKLQlpZiAoSVNfRVJSKHNvbnlwaV9jb21wYXQuZmlmbykpIHsKLQkJcHJpbnRrKEtFUk5fRVJSIERSVl9QRlggImtmaWZvX2FsbG9jIGZhaWxlZFxuIik7Ci0JCXJldHVybiBQVFJfRVJSKHNvbnlwaV9jb21wYXQuZmlmbyk7Ci0JfQotCi0JaW5pdF93YWl0cXVldWVfaGVhZCgmc29ueXBpX2NvbXBhdC5maWZvX3Byb2NfbGlzdCk7Ci0KLQlpZiAobWlub3IgIT0gLTEpCi0JCXNvbnlwaV9taXNjX2RldmljZS5taW5vciA9IG1pbm9yOwotCWVycm9yID0gbWlzY19yZWdpc3Rlcigmc29ueXBpX21pc2NfZGV2aWNlKTsKLQlpZiAoZXJyb3IpIHsKLQkJcHJpbnRrKEtFUk5fRVJSIERSVl9QRlggIm1pc2NfcmVnaXN0ZXIgZmFpbGVkXG4iKTsKLQkJZ290byBlcnJfZnJlZV9rZmlmbzsKLQl9Ci0JaWYgKG1pbm9yID09IC0xKQotCQlwcmludGsoS0VSTl9JTkZPIERSVl9QRlggImRldmljZSBhbGxvY2F0ZWQgbWlub3IgaXMgJWRcbiIsCi0JCSAgICAgICBzb255cGlfbWlzY19kZXZpY2UubWlub3IpOwotCi0JcmV0dXJuIDA7Ci0KLWVycl9mcmVlX2tmaWZvOgotCWtmaWZvX2ZyZWUoc29ueXBpX2NvbXBhdC5maWZvKTsKLQlyZXR1cm4gZXJyb3I7Ci19Ci0KLXN0YXRpYyB2b2lkIHNvbnlwaV9jb21wYXRfZXhpdCh2b2lkKQotewotCW1pc2NfZGVyZWdpc3Rlcigmc29ueXBpX21pc2NfZGV2aWNlKTsKLQlrZmlmb19mcmVlKHNvbnlwaV9jb21wYXQuZmlmbyk7Ci19Ci0jZWxzZQotc3RhdGljIGludCBzb255cGlfY29tcGF0X2luaXQodm9pZCkgeyByZXR1cm4gMDsgfQotc3RhdGljIHZvaWQgc29ueXBpX2NvbXBhdF9leGl0KHZvaWQpIHsgfQotc3RhdGljIHZvaWQgc29ueXBpX2NvbXBhdF9yZXBvcnRfZXZlbnQodTggZXZlbnQpIHsgfQotI2VuZGlmIC8qIENPTkZJR19TT05ZUElfQ09NUEFUICovCi0KLS8qCi0gKiBBQ1BJIGNhbGxiYWNrcwotICovCi1zdGF0aWMgYWNwaV9zdGF0dXMKLXNvbnlfcGljX3JlYWRfcG9zc2libGVfcmVzb3VyY2Uoc3RydWN0IGFjcGlfcmVzb3VyY2UgKnJlc291cmNlLCB2b2lkICpjb250ZXh0KQotewotCXUzMiBpOwotCXN0cnVjdCBzb255X3BpY19kZXYgKmRldiA9IChzdHJ1Y3Qgc29ueV9waWNfZGV2ICopY29udGV4dDsKLQotCXN3aXRjaCAocmVzb3VyY2UtPnR5cGUpIHsKLQljYXNlIEFDUElfUkVTT1VSQ0VfVFlQRV9TVEFSVF9ERVBFTkRFTlQ6Ci0JCXsKLQkJCS8qIHN0YXJ0IElPIGVudW1lcmF0aW9uICovCi0JCQlzdHJ1Y3Qgc29ueV9waWNfaW9wb3J0ICppb3BvcnQgPSBremFsbG9jKHNpemVvZigqaW9wb3J0KSwgR0ZQX0tFUk5FTCk7Ci0JCQlpZiAoIWlvcG9ydCkKLQkJCQlyZXR1cm4gQUVfRVJST1I7Ci0KLQkJCWxpc3RfYWRkKCZpb3BvcnQtPmxpc3QsICZkZXYtPmlvcG9ydHMpOwotCQkJcmV0dXJuIEFFX09LOwotCQl9Ci0KLQljYXNlIEFDUElfUkVTT1VSQ0VfVFlQRV9FTkRfREVQRU5ERU5UOgotCQkvKiBlbmQgSU8gZW51bWVyYXRpb24gKi8KLQkJcmV0dXJuIEFFX09LOwotCi0JY2FzZSBBQ1BJX1JFU09VUkNFX1RZUEVfSVJROgotCQl7Ci0JCQlzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9pcnEgKnAgPSAmcmVzb3VyY2UtPmRhdGEuaXJxOwotCQkJc3RydWN0IHNvbnlfcGljX2lycSAqaW50ZXJydXB0ID0gTlVMTDsKLQkJCWlmICghcCB8fCAhcC0+aW50ZXJydXB0X2NvdW50KSB7Ci0JCQkJLyoKLQkJCQkgKiBJUlEgZGVzY3JpcHRvcnMgbWF5IGhhdmUgbm8gSVJRIyBiaXRzIHNldCwKLQkJCQkgKiBwYXJ0aWN1bGFybHkgdGhvc2UgdGhvc2Ugdy8gX1NUQSBkaXNhYmxlZAotCQkJCSAqLwotCQkJCWRwcmludGsoIkJsYW5rIElSUSByZXNvdXJjZVxuIik7Ci0JCQkJcmV0dXJuIEFFX09LOwotCQkJfQotCQkJZm9yIChpID0gMDsgaSA8IHAtPmludGVycnVwdF9jb3VudDsgaSsrKSB7Ci0JCQkJaWYgKCFwLT5pbnRlcnJ1cHRzW2ldKSB7Ci0JCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgRFJWX1BGWAotCQkJCQkJCSJJbnZhbGlkIElSUSAlZFxuIiwKLQkJCQkJCQlwLT5pbnRlcnJ1cHRzW2ldKTsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCWludGVycnVwdCA9IGt6YWxsb2Moc2l6ZW9mKCppbnRlcnJ1cHQpLAotCQkJCQkJR0ZQX0tFUk5FTCk7Ci0JCQkJaWYgKCFpbnRlcnJ1cHQpCi0JCQkJCXJldHVybiBBRV9FUlJPUjsKLQotCQkJCWxpc3RfYWRkKCZpbnRlcnJ1cHQtPmxpc3QsICZkZXYtPmludGVycnVwdHMpOwotCQkJCWludGVycnVwdC0+aXJxLnRyaWdnZXJpbmcgPSBwLT50cmlnZ2VyaW5nOwotCQkJCWludGVycnVwdC0+aXJxLnBvbGFyaXR5ID0gcC0+cG9sYXJpdHk7Ci0JCQkJaW50ZXJydXB0LT5pcnEuc2hhcmFibGUgPSBwLT5zaGFyYWJsZTsKLQkJCQlpbnRlcnJ1cHQtPmlycS5pbnRlcnJ1cHRfY291bnQgPSAxOwotCQkJCWludGVycnVwdC0+aXJxLmludGVycnVwdHNbMF0gPSBwLT5pbnRlcnJ1cHRzW2ldOwotCQkJfQotCQkJcmV0dXJuIEFFX09LOwotCQl9Ci0JY2FzZSBBQ1BJX1JFU09VUkNFX1RZUEVfSU86Ci0JCXsKLQkJCXN0cnVjdCBhY3BpX3Jlc291cmNlX2lvICppbyA9ICZyZXNvdXJjZS0+ZGF0YS5pbzsKLQkJCXN0cnVjdCBzb255X3BpY19pb3BvcnQgKmlvcG9ydCA9Ci0JCQkJbGlzdF9maXJzdF9lbnRyeSgmZGV2LT5pb3BvcnRzLCBzdHJ1Y3Qgc29ueV9waWNfaW9wb3J0LCBsaXN0KTsKLQkJCWlmICghaW8pIHsKLQkJCQlkcHJpbnRrKCJCbGFuayBJTyByZXNvdXJjZVxuIik7Ci0JCQkJcmV0dXJuIEFFX09LOwotCQkJfQotCi0JCQlpZiAoIWlvcG9ydC0+aW8xLm1pbmltdW0pIHsKLQkJCQltZW1jcHkoJmlvcG9ydC0+aW8xLCBpbywgc2l6ZW9mKCppbykpOwotCQkJCWRwcmludGsoIklPMSBhdCAweCUuNHggKDB4JS4yeClcbiIsIGlvcG9ydC0+aW8xLm1pbmltdW0sCi0JCQkJCQlpb3BvcnQtPmlvMS5hZGRyZXNzX2xlbmd0aCk7Ci0JCQl9Ci0JCQllbHNlIGlmICghaW9wb3J0LT5pbzIubWluaW11bSkgewotCQkJCW1lbWNweSgmaW9wb3J0LT5pbzIsIGlvLCBzaXplb2YoKmlvKSk7Ci0JCQkJZHByaW50aygiSU8yIGF0IDB4JS40eCAoMHglLjJ4KVxuIiwgaW9wb3J0LT5pbzIubWluaW11bSwKLQkJCQkJCWlvcG9ydC0+aW8yLmFkZHJlc3NfbGVuZ3RoKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXByaW50ayhLRVJOX0VSUiBEUlZfUEZYICJVbmtub3duIFNQSUMgVHlwZSwgbW9yZSB0aGFuIDIgSU8gUG9ydHNcbiIpOwotCQkJCXJldHVybiBBRV9FUlJPUjsKLQkJCX0KLQkJCXJldHVybiBBRV9PSzsKLQkJfQotCWRlZmF1bHQ6Ci0JCWRwcmludGsoIlJlc291cmNlICVkIGlzbid0IGFuIElSUSBub3IgYW4gSU8gcG9ydFxuIiwKLQkJCQlyZXNvdXJjZS0+dHlwZSk7Ci0KLQljYXNlIEFDUElfUkVTT1VSQ0VfVFlQRV9FTkRfVEFHOgotCQlyZXR1cm4gQUVfT0s7Ci0JfQotCXJldHVybiBBRV9DVFJMX1RFUk1JTkFURTsKLX0KLQotc3RhdGljIGludCBzb255X3BpY19wb3NzaWJsZV9yZXNvdXJjZXMoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpCi17Ci0JaW50IHJlc3VsdCA9IDA7Ci0JYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7Ci0KLQlpZiAoIWRldmljZSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkvKiBnZXQgZGV2aWNlIHN0YXR1cyAqLwotCS8qIHNlZSBhY3BpX3BjaV9saW5rX2dldF9jdXJyZW50IGFjcGlfcGNpX2xpbmtfZ2V0X3Bvc3NpYmxlICovCi0JZHByaW50aygiRXZhbHVhdGluZyBfU1RBXG4iKTsKLQlyZXN1bHQgPSBhY3BpX2J1c19nZXRfc3RhdHVzKGRldmljZSk7Ci0JaWYgKHJlc3VsdCkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HIERSVl9QRlggIlVuYWJsZSB0byByZWFkIHN0YXR1c1xuIik7Ci0JCWdvdG8gZW5kOwotCX0KLQotCWlmICghZGV2aWNlLT5zdGF0dXMuZW5hYmxlZCkKLQkJZHByaW50aygiRGV2aWNlIGRpc2FibGVkXG4iKTsKLQllbHNlCi0JCWRwcmludGsoIkRldmljZSBlbmFibGVkXG4iKTsKLQotCS8qCi0JICogUXVlcnkgYW5kIHBhcnNlICdtZXRob2QnCi0JICovCi0JZHByaW50aygiRXZhbHVhdGluZyAlc1xuIiwgTUVUSE9EX05BTUVfX1BSUyk7Ci0Jc3RhdHVzID0gYWNwaV93YWxrX3Jlc291cmNlcyhkZXZpY2UtPmhhbmRsZSwgTUVUSE9EX05BTUVfX1BSUywKLQkJCXNvbnlfcGljX3JlYWRfcG9zc2libGVfcmVzb3VyY2UsICZzcGljX2Rldik7Ci0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgRFJWX1BGWAotCQkJCSJGYWlsdXJlIGV2YWx1YXRpbmcgJXNcbiIsCi0JCQkJTUVUSE9EX05BTUVfX1BSUyk7Ci0JCXJlc3VsdCA9IC1FTk9ERVY7Ci0JfQotZW5kOgotCXJldHVybiByZXN1bHQ7Ci19Ci0KLS8qCi0gKiAgRGlzYWJsZSB0aGUgc3BpYyBkZXZpY2UgYnkgY2FsbGluZyBpdHMgX0RJUyBtZXRob2QKLSAqLwotc3RhdGljIGludCBzb255X3BpY19kaXNhYmxlKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKQotewotCWFjcGlfc3RhdHVzIHJldCA9IGFjcGlfZXZhbHVhdGVfb2JqZWN0KGRldmljZS0+aGFuZGxlLCAiX0RJUyIsIE5VTEwsCi0JCQkJCSAgICAgICBOVUxMKTsKLQotCWlmIChBQ1BJX0ZBSUxVUkUocmV0KSAmJiByZXQgIT0gQUVfTk9UX0ZPVU5EKQotCQlyZXR1cm4gLUVOWElPOwotCi0JZHByaW50aygiRGV2aWNlIGRpc2FibGVkXG4iKTsKLQlyZXR1cm4gMDsKLX0KLQotCi0vKgotICogIEJhc2VkIG9uIGRyaXZlcnMvYWNwaS9wY2lfbGluay5jOmFjcGlfcGNpX2xpbmtfc2V0Ci0gKgotICogIENhbGwgX1NSUyB0byBzZXQgY3VycmVudCByZXNvdXJjZXMKLSAqLwotc3RhdGljIGludCBzb255X3BpY19lbmFibGUoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UsCi0JCXN0cnVjdCBzb255X3BpY19pb3BvcnQgKmlvcG9ydCwgc3RydWN0IHNvbnlfcGljX2lycSAqaXJxKQotewotCWFjcGlfc3RhdHVzIHN0YXR1czsKLQlpbnQgcmVzdWx0ID0gMDsKLQkvKiBUeXBlIDEgcmVzb3VyY2UgbGF5b3V0IGlzOgotCSAqICAgIElPCi0JICogICAgSU8KLQkgKiAgICBJUlFOb0ZsYWdzCi0JICogICAgRW5kCi0JICoKLQkgKiBUeXBlIDIgYW5kIDMgcmVzb3VyY2UgbGF5b3V0IGlzOgotCSAqICAgIElPCi0JICogICAgSVJRTm9GbGFncwotCSAqICAgIEVuZAotCSAqLwotCXN0cnVjdCB7Ci0JCXN0cnVjdCBhY3BpX3Jlc291cmNlIHJlczE7Ci0JCXN0cnVjdCBhY3BpX3Jlc291cmNlIHJlczI7Ci0JCXN0cnVjdCBhY3BpX3Jlc291cmNlIHJlczM7Ci0JCXN0cnVjdCBhY3BpX3Jlc291cmNlIHJlczQ7Ci0JfSAqcmVzb3VyY2U7Ci0Jc3RydWN0IGFjcGlfYnVmZmVyIGJ1ZmZlciA9IHsgMCwgTlVMTCB9OwotCi0JaWYgKCFpb3BvcnQgfHwgIWlycSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkvKiBpbml0IGFjcGlfYnVmZmVyICovCi0JcmVzb3VyY2UgPSBremFsbG9jKHNpemVvZigqcmVzb3VyY2UpICsgMSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFyZXNvdXJjZSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlidWZmZXIubGVuZ3RoID0gc2l6ZW9mKCpyZXNvdXJjZSkgKyAxOwotCWJ1ZmZlci5wb2ludGVyID0gcmVzb3VyY2U7Ci0KLQkvKiBzZXR1cCBUeXBlIDEgcmVzb3VyY2VzICovCi0JaWYgKHNwaWNfZGV2LmNvbnRyb2wtPm1vZGVsID09IFNPTllQSV9ERVZJQ0VfVFlQRTEpIHsKLQotCQkvKiBzZXR1cCBpbyByZXNvdXJjZXMgKi8KLQkJcmVzb3VyY2UtPnJlczEudHlwZSA9IEFDUElfUkVTT1VSQ0VfVFlQRV9JTzsKLQkJcmVzb3VyY2UtPnJlczEubGVuZ3RoID0gc2l6ZW9mKHN0cnVjdCBhY3BpX3Jlc291cmNlKTsKLQkJbWVtY3B5KCZyZXNvdXJjZS0+cmVzMS5kYXRhLmlvLCAmaW9wb3J0LT5pbzEsCi0JCQkJc2l6ZW9mKHN0cnVjdCBhY3BpX3Jlc291cmNlX2lvKSk7Ci0KLQkJcmVzb3VyY2UtPnJlczIudHlwZSA9IEFDUElfUkVTT1VSQ0VfVFlQRV9JTzsKLQkJcmVzb3VyY2UtPnJlczIubGVuZ3RoID0gc2l6ZW9mKHN0cnVjdCBhY3BpX3Jlc291cmNlKTsKLQkJbWVtY3B5KCZyZXNvdXJjZS0+cmVzMi5kYXRhLmlvLCAmaW9wb3J0LT5pbzIsCi0JCQkJc2l6ZW9mKHN0cnVjdCBhY3BpX3Jlc291cmNlX2lvKSk7Ci0KLQkJLyogc2V0dXAgaXJxIHJlc291cmNlICovCi0JCXJlc291cmNlLT5yZXMzLnR5cGUgPSBBQ1BJX1JFU09VUkNFX1RZUEVfSVJROwotCQlyZXNvdXJjZS0+cmVzMy5sZW5ndGggPSBzaXplb2Yoc3RydWN0IGFjcGlfcmVzb3VyY2UpOwotCQltZW1jcHkoJnJlc291cmNlLT5yZXMzLmRhdGEuaXJxLCAmaXJxLT5pcnEsCi0JCQkJc2l6ZW9mKHN0cnVjdCBhY3BpX3Jlc291cmNlX2lycSkpOwotCQkvKiB3ZSByZXF1ZXN0ZWQgYSBzaGFyZWQgaXJxICovCi0JCXJlc291cmNlLT5yZXMzLmRhdGEuaXJxLnNoYXJhYmxlID0gQUNQSV9TSEFSRUQ7Ci0KLQkJcmVzb3VyY2UtPnJlczQudHlwZSA9IEFDUElfUkVTT1VSQ0VfVFlQRV9FTkRfVEFHOwotCi0JfQotCS8qIHNldHVwIFR5cGUgMi8zIHJlc291cmNlcyAqLwotCWVsc2UgewotCQkvKiBzZXR1cCBpbyByZXNvdXJjZSAqLwotCQlyZXNvdXJjZS0+cmVzMS50eXBlID0gQUNQSV9SRVNPVVJDRV9UWVBFX0lPOwotCQlyZXNvdXJjZS0+cmVzMS5sZW5ndGggPSBzaXplb2Yoc3RydWN0IGFjcGlfcmVzb3VyY2UpOwotCQltZW1jcHkoJnJlc291cmNlLT5yZXMxLmRhdGEuaW8sICZpb3BvcnQtPmlvMSwKLQkJCQlzaXplb2Yoc3RydWN0IGFjcGlfcmVzb3VyY2VfaW8pKTsKLQotCQkvKiBzZXR1cCBpcnEgcmVzb3VyY2UgKi8KLQkJcmVzb3VyY2UtPnJlczIudHlwZSA9IEFDUElfUkVTT1VSQ0VfVFlQRV9JUlE7Ci0JCXJlc291cmNlLT5yZXMyLmxlbmd0aCA9IHNpemVvZihzdHJ1Y3QgYWNwaV9yZXNvdXJjZSk7Ci0JCW1lbWNweSgmcmVzb3VyY2UtPnJlczIuZGF0YS5pcnEsICZpcnEtPmlycSwKLQkJCQlzaXplb2Yoc3RydWN0IGFjcGlfcmVzb3VyY2VfaXJxKSk7Ci0JCS8qIHdlIHJlcXVlc3RlZCBhIHNoYXJlZCBpcnEgKi8KLQkJcmVzb3VyY2UtPnJlczIuZGF0YS5pcnEuc2hhcmFibGUgPSBBQ1BJX1NIQVJFRDsKLQotCQlyZXNvdXJjZS0+cmVzMy50eXBlID0gQUNQSV9SRVNPVVJDRV9UWVBFX0VORF9UQUc7Ci0JfQotCi0JLyogQXR0ZW1wdCB0byBzZXQgdGhlIHJlc291cmNlICovCi0JZHByaW50aygiRXZhbHVhdGluZyBfU1JTXG4iKTsKLQlzdGF0dXMgPSBhY3BpX3NldF9jdXJyZW50X3Jlc291cmNlcyhkZXZpY2UtPmhhbmRsZSwgJmJ1ZmZlcik7Ci0KLQkvKiBjaGVjayBmb3IgdG90YWwgZmFpbHVyZSAqLwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlwcmludGsoS0VSTl9FUlIgRFJWX1BGWCAiRXJyb3IgZXZhbHVhdGluZyBfU1JTXG4iKTsKLQkJcmVzdWx0ID0gLUVOT0RFVjsKLQkJZ290byBlbmQ7Ci0JfQotCi0JLyogTmVjZXNzYXJ5IGRldmljZSBpbml0aWFsaXphdGlvbnMgY2FsbHMgKGZyb20gc29ueXBpKSAqLwotCXNvbnlfcGljX2NhbGwxKDB4ODIpOwotCXNvbnlfcGljX2NhbGwyKDB4ODEsIDB4ZmYpOwotCXNvbnlfcGljX2NhbGwxKGNvbXBhdCA/IDB4OTIgOiAweDgyKTsKLQotZW5kOgotCWtmcmVlKHJlc291cmNlKTsKLQlyZXR1cm4gcmVzdWx0OwotfQotCi0vKioqKioqKioqKioqKioqKioKLSAqCi0gKiBJU1I6IHNvbWUgZXZlbnQgaXMgYXZhaWxhYmxlCi0gKgotICoqKioqKioqKioqKioqKioqLwotc3RhdGljIGlycXJldHVybl90IHNvbnlfcGljX2lycShpbnQgaXJxLCB2b2lkICpkZXZfaWQpCi17Ci0JaW50IGksIGo7Ci0JdTggZXYgPSAwOwotCXU4IGRhdGFfbWFzayA9IDA7Ci0JdTggZGV2aWNlX2V2ZW50ID0gMDsKLQotCXN0cnVjdCBzb255X3BpY19kZXYgKmRldiA9IChzdHJ1Y3Qgc29ueV9waWNfZGV2ICopIGRldl9pZDsKLQotCWV2ID0gaW5iX3AoZGV2LT5jdXJfaW9wb3J0LT5pbzEubWluaW11bSk7Ci0JaWYgKGRldi0+Y3VyX2lvcG9ydC0+aW8yLm1pbmltdW0pCi0JCWRhdGFfbWFzayA9IGluYl9wKGRldi0+Y3VyX2lvcG9ydC0+aW8yLm1pbmltdW0pOwotCWVsc2UKLQkJZGF0YV9tYXNrID0gaW5iX3AoZGV2LT5jdXJfaW9wb3J0LT5pbzEubWluaW11bSArCi0JCQkJZGV2LT5jb250cm9sLT5ldnBvcnRfb2Zmc2V0KTsKLQotCWRwcmludGsoImV2ZW50IChbJS4yeF0gWyUuMnhdKSBhdCBwb3J0IDB4JS40eCgrMHglLjJ4KVxuIiwKLQkJCWV2LCBkYXRhX21hc2ssIGRldi0+Y3VyX2lvcG9ydC0+aW8xLm1pbmltdW0sCi0JCQlkZXYtPmNvbnRyb2wtPmV2cG9ydF9vZmZzZXQpOwotCi0JaWYgKGV2ID09IDB4MDAgfHwgZXYgPT0gMHhmZikKLQkJcmV0dXJuIElSUV9IQU5ETEVEOwotCi0JZm9yIChpID0gMDsgZGV2LT5jb250cm9sLT5ldmVudF90eXBlc1tpXS5tYXNrOyBpKyspIHsKLQotCQlpZiAoKGRhdGFfbWFzayAmIGRldi0+Y29udHJvbC0+ZXZlbnRfdHlwZXNbaV0uZGF0YSkgIT0KLQkJICAgIGRldi0+Y29udHJvbC0+ZXZlbnRfdHlwZXNbaV0uZGF0YSkKLQkJCWNvbnRpbnVlOwotCi0JCWlmICghKG1hc2sgJiBkZXYtPmNvbnRyb2wtPmV2ZW50X3R5cGVzW2ldLm1hc2spKQotCQkJY29udGludWU7Ci0KLQkJZm9yIChqID0gMDsgZGV2LT5jb250cm9sLT5ldmVudF90eXBlc1tpXS5ldmVudHNbal0uZXZlbnQ7IGorKykgewotCQkJaWYgKGV2ID09IGRldi0+Y29udHJvbC0+ZXZlbnRfdHlwZXNbaV0uZXZlbnRzW2pdLmRhdGEpIHsKLQkJCQlkZXZpY2VfZXZlbnQgPQotCQkJCQlkZXYtPmNvbnRyb2wtPgotCQkJCQkJZXZlbnRfdHlwZXNbaV0uZXZlbnRzW2pdLmV2ZW50OwotCQkJCWdvdG8gZm91bmQ7Ci0JCQl9Ci0JCX0KLQl9Ci0JLyogU3RpbGwgbm90IGFibGUgdG8gZGVjb2RlIHRoZSBldmVudCB0cnkgdG8gcGFzcwotCSAqIGl0IG92ZXIgdG8gdGhlIG1pbmlkcml2ZXIKLQkgKi8KLQlpZiAoZGV2LT5jb250cm9sLT5oYW5kbGVfaXJxICYmCi0JCQlkZXYtPmNvbnRyb2wtPmhhbmRsZV9pcnEoZGF0YV9tYXNrLCBldikgPT0gMCkKLQkJcmV0dXJuIElSUV9IQU5ETEVEOwotCi0JZHByaW50aygidW5rbm93biBldmVudCAoWyUuMnhdIFslLjJ4XSkgYXQgcG9ydCAweCUuNHgoKzB4JS4yeClcbiIsCi0JCQlldiwgZGF0YV9tYXNrLCBkZXYtPmN1cl9pb3BvcnQtPmlvMS5taW5pbXVtLAotCQkJZGV2LT5jb250cm9sLT5ldnBvcnRfb2Zmc2V0KTsKLQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci0KLWZvdW5kOgotCXNvbnlfbGFwdG9wX3JlcG9ydF9pbnB1dF9ldmVudChkZXZpY2VfZXZlbnQpOwotCWFjcGlfYnVzX2dlbmVyYXRlX3Byb2NfZXZlbnQoZGV2LT5hY3BpX2RldiwgMSwgZGV2aWNlX2V2ZW50KTsKLQlzb255cGlfY29tcGF0X3JlcG9ydF9ldmVudChkZXZpY2VfZXZlbnQpOwotCi0JcmV0dXJuIElSUV9IQU5ETEVEOwotfQotCi0vKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgQUNQSSBkcml2ZXIKLSAqCi0gKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgaW50IHNvbnlfcGljX3JlbW92ZShzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSwgaW50IHR5cGUpCi17Ci0Jc3RydWN0IHNvbnlfcGljX2lvcG9ydCAqaW8sICp0bXBfaW87Ci0Jc3RydWN0IHNvbnlfcGljX2lycSAqaXJxLCAqdG1wX2lycTsKLQotCWlmIChzb255X3BpY19kaXNhYmxlKGRldmljZSkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSIERSVl9QRlggIkNvdWxkbid0IGRpc2FibGUgZGV2aWNlLlxuIik7Ci0JCXJldHVybiAtRU5YSU87Ci0JfQotCi0JZnJlZV9pcnEoc3BpY19kZXYuY3VyX2lycS0+aXJxLmludGVycnVwdHNbMF0sICZzcGljX2Rldik7Ci0JcmVsZWFzZV9yZWdpb24oc3BpY19kZXYuY3VyX2lvcG9ydC0+aW8xLm1pbmltdW0sCi0JCQlzcGljX2Rldi5jdXJfaW9wb3J0LT5pbzEuYWRkcmVzc19sZW5ndGgpOwotCWlmIChzcGljX2Rldi5jdXJfaW9wb3J0LT5pbzIubWluaW11bSkKLQkJcmVsZWFzZV9yZWdpb24oc3BpY19kZXYuY3VyX2lvcG9ydC0+aW8yLm1pbmltdW0sCi0JCQkJc3BpY19kZXYuY3VyX2lvcG9ydC0+aW8yLmFkZHJlc3NfbGVuZ3RoKTsKLQotCXNvbnlwaV9jb21wYXRfZXhpdCgpOwotCi0Jc29ueV9sYXB0b3BfcmVtb3ZlX2lucHV0KCk7Ci0KLQkvKiBwZiBhdHRycyAqLwotCXN5c2ZzX3JlbW92ZV9ncm91cCgmc29ueV9wZl9kZXZpY2UtPmRldi5rb2JqLCAmc3BpY19hdHRyaWJ1dGVfZ3JvdXApOwotCXNvbnlfcGZfcmVtb3ZlKCk7Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoaW8sIHRtcF9pbywgJnNwaWNfZGV2LmlvcG9ydHMsIGxpc3QpIHsKLQkJbGlzdF9kZWwoJmlvLT5saXN0KTsKLQkJa2ZyZWUoaW8pOwotCX0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoaXJxLCB0bXBfaXJxLCAmc3BpY19kZXYuaW50ZXJydXB0cywgbGlzdCkgewotCQlsaXN0X2RlbCgmaXJxLT5saXN0KTsKLQkJa2ZyZWUoaXJxKTsKLQl9Ci0Jc3BpY19kZXYuY3VyX2lvcG9ydCA9IE5VTEw7Ci0Jc3BpY19kZXYuY3VyX2lycSA9IE5VTEw7Ci0KLQlkcHJpbnRrKFNPTllfUElDX0RSSVZFUl9OQU1FICIgcmVtb3ZlZC5cbiIpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHNvbnlfcGljX2FkZChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSkKLXsKLQlpbnQgcmVzdWx0OwotCXN0cnVjdCBzb255X3BpY19pb3BvcnQgKmlvLCAqdG1wX2lvOwotCXN0cnVjdCBzb255X3BpY19pcnEgKmlycSwgKnRtcF9pcnE7Ci0KLQlwcmludGsoS0VSTl9JTkZPIERSVl9QRlggIiVzIHYlcy5cbiIsCi0JCVNPTllfUElDX0RSSVZFUl9OQU1FLCBTT05ZX0xBUFRPUF9EUklWRVJfVkVSU0lPTik7Ci0KLQlzcGljX2Rldi5hY3BpX2RldiA9IGRldmljZTsKLQlzdHJjcHkoYWNwaV9kZXZpY2VfY2xhc3MoZGV2aWNlKSwgInNvbnkvaG90a2V5Iik7Ci0Jc29ueV9waWNfZGV0ZWN0X2RldmljZV90eXBlKCZzcGljX2Rldik7Ci0JbXV0ZXhfaW5pdCgmc3BpY19kZXYubG9jayk7Ci0KLQkvKiByZWFkIF9QUlMgcmVzb3VyY2VzICovCi0JcmVzdWx0ID0gc29ueV9waWNfcG9zc2libGVfcmVzb3VyY2VzKGRldmljZSk7Ci0JaWYgKHJlc3VsdCkgewotCQlwcmludGsoS0VSTl9FUlIgRFJWX1BGWAotCQkJCSJVbmFiZSB0byByZWFkIHBvc3NpYmxlIHJlc291cmNlcy5cbiIpOwotCQlnb3RvIGVycl9mcmVlX3Jlc291cmNlczsKLQl9Ci0KLQkvKiBzZXR1cCBpbnB1dCBkZXZpY2VzIGFuZCBoZWxwZXIgZmlmbyAqLwotCXJlc3VsdCA9IHNvbnlfbGFwdG9wX3NldHVwX2lucHV0KGRldmljZSk7Ci0JaWYgKHJlc3VsdCkgewotCQlwcmludGsoS0VSTl9FUlIgRFJWX1BGWAotCQkJCSJVbmFiZSB0byBjcmVhdGUgaW5wdXQgZGV2aWNlcy5cbiIpOwotCQlnb3RvIGVycl9mcmVlX3Jlc291cmNlczsKLQl9Ci0KLQlpZiAoc29ueXBpX2NvbXBhdF9pbml0KCkpCi0JCWdvdG8gZXJyX3JlbW92ZV9pbnB1dDsKLQotCS8qIHJlcXVlc3QgaW8gcG9ydCAqLwotCWxpc3RfZm9yX2VhY2hfZW50cnlfcmV2ZXJzZShpbywgJnNwaWNfZGV2LmlvcG9ydHMsIGxpc3QpIHsKLQkJaWYgKHJlcXVlc3RfcmVnaW9uKGlvLT5pbzEubWluaW11bSwgaW8tPmlvMS5hZGRyZXNzX2xlbmd0aCwKLQkJCQkJIlNvbnkgUHJvZ3JhbWFibGUgSS9PIERldmljZSIpKSB7Ci0JCQlkcHJpbnRrKCJJL08gcG9ydDE6IDB4JS40eCAoMHglLjR4KSArIDB4JS4yeFxuIiwKLQkJCQkJaW8tPmlvMS5taW5pbXVtLCBpby0+aW8xLm1heGltdW0sCi0JCQkJCWlvLT5pbzEuYWRkcmVzc19sZW5ndGgpOwotCQkJLyogVHlwZSAxIGhhdmUgMiBpb3BvcnRzICovCi0JCQlpZiAoaW8tPmlvMi5taW5pbXVtKSB7Ci0JCQkJaWYgKHJlcXVlc3RfcmVnaW9uKGlvLT5pbzIubWluaW11bSwKLQkJCQkJCWlvLT5pbzIuYWRkcmVzc19sZW5ndGgsCi0JCQkJCQkiU29ueSBQcm9ncmFtYWJsZSBJL08gRGV2aWNlIikpIHsKLQkJCQkJZHByaW50aygiSS9PIHBvcnQyOiAweCUuNHggKDB4JS40eCkgKyAweCUuMnhcbiIsCi0JCQkJCQkJaW8tPmlvMi5taW5pbXVtLCBpby0+aW8yLm1heGltdW0sCi0JCQkJCQkJaW8tPmlvMi5hZGRyZXNzX2xlbmd0aCk7Ci0JCQkJCXNwaWNfZGV2LmN1cl9pb3BvcnQgPSBpbzsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlkcHJpbnRrKCJVbmFibGUgdG8gZ2V0IEkvTyBwb3J0MjogIgotCQkJCQkJCSIweCUuNHggKDB4JS40eCkgKyAweCUuMnhcbiIsCi0JCQkJCQkJaW8tPmlvMi5taW5pbXVtLCBpby0+aW8yLm1heGltdW0sCi0JCQkJCQkJaW8tPmlvMi5hZGRyZXNzX2xlbmd0aCk7Ci0JCQkJCXJlbGVhc2VfcmVnaW9uKGlvLT5pbzEubWluaW11bSwKLQkJCQkJCQlpby0+aW8xLmFkZHJlc3NfbGVuZ3RoKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlzcGljX2Rldi5jdXJfaW9wb3J0ID0gaW87Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci0JaWYgKCFzcGljX2Rldi5jdXJfaW9wb3J0KSB7Ci0JCXByaW50ayhLRVJOX0VSUiBEUlZfUEZYICJGYWlsZWQgdG8gcmVxdWVzdF9yZWdpb24uXG4iKTsKLQkJcmVzdWx0ID0gLUVOT0RFVjsKLQkJZ290byBlcnJfcmVtb3ZlX2NvbXBhdDsKLQl9Ci0KLQkvKiByZXF1ZXN0IElSUSAqLwotCWxpc3RfZm9yX2VhY2hfZW50cnlfcmV2ZXJzZShpcnEsICZzcGljX2Rldi5pbnRlcnJ1cHRzLCBsaXN0KSB7Ci0JCWlmICghcmVxdWVzdF9pcnEoaXJxLT5pcnEuaW50ZXJydXB0c1swXSwgc29ueV9waWNfaXJxLAotCQkJCQlJUlFGX1NIQVJFRCwgInNvbnktbGFwdG9wIiwgJnNwaWNfZGV2KSkgewotCQkJZHByaW50aygiSVJROiAlZCAtIHRyaWdnZXJpbmc6ICVkIC0gIgotCQkJCQkicG9sYXJpdHk6ICVkIC0gc2hyOiAlZFxuIiwKLQkJCQkJaXJxLT5pcnEuaW50ZXJydXB0c1swXSwKLQkJCQkJaXJxLT5pcnEudHJpZ2dlcmluZywKLQkJCQkJaXJxLT5pcnEucG9sYXJpdHksCi0JCQkJCWlycS0+aXJxLnNoYXJhYmxlKTsKLQkJCXNwaWNfZGV2LmN1cl9pcnEgPSBpcnE7Ci0JCQlicmVhazsKLQkJfQotCX0KLQlpZiAoIXNwaWNfZGV2LmN1cl9pcnEpIHsKLQkJcHJpbnRrKEtFUk5fRVJSIERSVl9QRlggIkZhaWxlZCB0byByZXF1ZXN0X2lycS5cbiIpOwotCQlyZXN1bHQgPSAtRU5PREVWOwotCQlnb3RvIGVycl9yZWxlYXNlX3JlZ2lvbjsKLQl9Ci0KLQkvKiBzZXQgcmVzb3VyY2Ugc3RhdHVzIF9TUlMgKi8KLQlyZXN1bHQgPSBzb255X3BpY19lbmFibGUoZGV2aWNlLCBzcGljX2Rldi5jdXJfaW9wb3J0LCBzcGljX2Rldi5jdXJfaXJxKTsKLQlpZiAocmVzdWx0KSB7Ci0JCXByaW50ayhLRVJOX0VSUiBEUlZfUEZYICJDb3VsZG4ndCBlbmFibGUgZGV2aWNlLlxuIik7Ci0JCWdvdG8gZXJyX2ZyZWVfaXJxOwotCX0KLQotCXNwaWNfZGV2LmJsdWV0b290aF9wb3dlciA9IC0xOwotCS8qIGNyZWF0ZSBkZXZpY2UgYXR0cmlidXRlcyAqLwotCXJlc3VsdCA9IHNvbnlfcGZfYWRkKCk7Ci0JaWYgKHJlc3VsdCkKLQkJZ290byBlcnJfZGlzYWJsZV9kZXZpY2U7Ci0KLQlyZXN1bHQgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJnNvbnlfcGZfZGV2aWNlLT5kZXYua29iaiwgJnNwaWNfYXR0cmlidXRlX2dyb3VwKTsKLQlpZiAocmVzdWx0KQotCQlnb3RvIGVycl9yZW1vdmVfcGY7Ci0KLQlyZXR1cm4gMDsKLQotZXJyX3JlbW92ZV9wZjoKLQlzb255X3BmX3JlbW92ZSgpOwotCi1lcnJfZGlzYWJsZV9kZXZpY2U6Ci0Jc29ueV9waWNfZGlzYWJsZShkZXZpY2UpOwotCi1lcnJfZnJlZV9pcnE6Ci0JZnJlZV9pcnEoc3BpY19kZXYuY3VyX2lycS0+aXJxLmludGVycnVwdHNbMF0sICZzcGljX2Rldik7Ci0KLWVycl9yZWxlYXNlX3JlZ2lvbjoKLQlyZWxlYXNlX3JlZ2lvbihzcGljX2Rldi5jdXJfaW9wb3J0LT5pbzEubWluaW11bSwKLQkJCXNwaWNfZGV2LmN1cl9pb3BvcnQtPmlvMS5hZGRyZXNzX2xlbmd0aCk7Ci0JaWYgKHNwaWNfZGV2LmN1cl9pb3BvcnQtPmlvMi5taW5pbXVtKQotCQlyZWxlYXNlX3JlZ2lvbihzcGljX2Rldi5jdXJfaW9wb3J0LT5pbzIubWluaW11bSwKLQkJCQlzcGljX2Rldi5jdXJfaW9wb3J0LT5pbzIuYWRkcmVzc19sZW5ndGgpOwotCi1lcnJfcmVtb3ZlX2NvbXBhdDoKLQlzb255cGlfY29tcGF0X2V4aXQoKTsKLQotZXJyX3JlbW92ZV9pbnB1dDoKLQlzb255X2xhcHRvcF9yZW1vdmVfaW5wdXQoKTsKLQotZXJyX2ZyZWVfcmVzb3VyY2VzOgotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShpbywgdG1wX2lvLCAmc3BpY19kZXYuaW9wb3J0cywgbGlzdCkgewotCQlsaXN0X2RlbCgmaW8tPmxpc3QpOwotCQlrZnJlZShpbyk7Ci0JfQotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShpcnEsIHRtcF9pcnEsICZzcGljX2Rldi5pbnRlcnJ1cHRzLCBsaXN0KSB7Ci0JCWxpc3RfZGVsKCZpcnEtPmxpc3QpOwotCQlrZnJlZShpcnEpOwotCX0KLQlzcGljX2Rldi5jdXJfaW9wb3J0ID0gTlVMTDsKLQlzcGljX2Rldi5jdXJfaXJxID0gTlVMTDsKLQotCXJldHVybiByZXN1bHQ7Ci19Ci0KLXN0YXRpYyBpbnQgc29ueV9waWNfc3VzcGVuZChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSwgcG1fbWVzc2FnZV90IHN0YXRlKQotewotCWlmIChzb255X3BpY19kaXNhYmxlKGRldmljZSkpCi0JCXJldHVybiAtRU5YSU87Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgc29ueV9waWNfcmVzdW1lKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKQotewotCXNvbnlfcGljX2VuYWJsZShkZXZpY2UsIHNwaWNfZGV2LmN1cl9pb3BvcnQsIHNwaWNfZGV2LmN1cl9pcnEpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGFjcGlfZGV2aWNlX2lkIHNvbnlfcGljX2RldmljZV9pZHNbXSA9IHsKLQl7U09OWV9QSUNfSElELCAwfSwKLQl7IiIsIDB9LAotfTsKLQotc3RhdGljIHN0cnVjdCBhY3BpX2RyaXZlciBzb255X3BpY19kcml2ZXIgPSB7Ci0JLm5hbWUgPSBTT05ZX1BJQ19EUklWRVJfTkFNRSwKLQkuY2xhc3MgPSBTT05ZX1BJQ19DTEFTUywKLQkuaWRzID0gc29ueV9waWNfZGV2aWNlX2lkcywKLQkub3duZXIgPSBUSElTX01PRFVMRSwKLQkub3BzID0gewotCQkuYWRkID0gc29ueV9waWNfYWRkLAotCQkucmVtb3ZlID0gc29ueV9waWNfcmVtb3ZlLAotCQkuc3VzcGVuZCA9IHNvbnlfcGljX3N1c3BlbmQsCi0JCS5yZXN1bWUgPSBzb255X3BpY19yZXN1bWUsCi0JCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IGRtaV9zeXN0ZW1faWQgX19pbml0ZGF0YSBzb255cGlfZG1pX3RhYmxlW10gPSB7Ci0JewotCQkuaWRlbnQgPSAiU29ueSBWYWlvIiwKLQkJLm1hdGNoZXMgPSB7Ci0JCQlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJTb255IENvcnBvcmF0aW9uIiksCi0JCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIlBDRy0iKSwKLQkJfSwKLQl9LAotCXsKLQkJLmlkZW50ID0gIlNvbnkgVmFpbyIsCi0JCS5tYXRjaGVzID0gewotCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiU29ueSBDb3Jwb3JhdGlvbiIpLAotCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJWR04tIiksCi0JCX0sCi0JfSwKLQl7IH0KLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IHNvbnlfbGFwdG9wX2luaXQodm9pZCkKLXsKLQlpbnQgcmVzdWx0OwotCi0JaWYgKCFub19zcGljICYmIGRtaV9jaGVja19zeXN0ZW0oc29ueXBpX2RtaV90YWJsZSkpIHsKLQkJcmVzdWx0ID0gYWNwaV9idXNfcmVnaXN0ZXJfZHJpdmVyKCZzb255X3BpY19kcml2ZXIpOwotCQlpZiAocmVzdWx0KSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgRFJWX1BGWAotCQkJCQkiVW5hYmxlIHRvIHJlZ2lzdGVyIFNQSUMgZHJpdmVyLiIpOwotCQkJZ290byBvdXQ7Ci0JCX0KLQl9Ci0KLQlyZXN1bHQgPSBhY3BpX2J1c19yZWdpc3Rlcl9kcml2ZXIoJnNvbnlfbmNfZHJpdmVyKTsKLQlpZiAocmVzdWx0KSB7Ci0JCXByaW50ayhLRVJOX0VSUiBEUlZfUEZYICJVbmFibGUgdG8gcmVnaXN0ZXIgU05DIGRyaXZlci4iKTsKLQkJZ290byBvdXRfdW5yZWdpc3Rlcl9waWM7Ci0JfQotCi0JcmV0dXJuIDA7Ci0KLW91dF91bnJlZ2lzdGVyX3BpYzoKLQlpZiAoIW5vX3NwaWMpCi0JCWFjcGlfYnVzX3VucmVnaXN0ZXJfZHJpdmVyKCZzb255X3BpY19kcml2ZXIpOwotb3V0OgotCXJldHVybiByZXN1bHQ7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBzb255X2xhcHRvcF9leGl0KHZvaWQpCi17Ci0JYWNwaV9idXNfdW5yZWdpc3Rlcl9kcml2ZXIoJnNvbnlfbmNfZHJpdmVyKTsKLQlpZiAoIW5vX3NwaWMpCi0JCWFjcGlfYnVzX3VucmVnaXN0ZXJfZHJpdmVyKCZzb255X3BpY19kcml2ZXIpOwotfQotCi1tb2R1bGVfaW5pdChzb255X2xhcHRvcF9pbml0KTsKLW1vZHVsZV9leGl0KHNvbnlfbGFwdG9wX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL3RjMTEwMC13bWkuYyBiL2RyaXZlcnMvbWlzYy90YzExMDAtd21pLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyNWU0YzkuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9taXNjL3RjMTEwMC13bWkuYworKysgL2Rldi9udWxsCkBAIC0xLDI5MCArMCwwIEBACi0vKgotICogIEhQIENvbXBhcSBUQzExMDAgVGFibGV0IFdNSSBFeHRyYXMgRHJpdmVyCi0gKgotICogIENvcHlyaWdodCAoQykgMjAwNyBDYXJsb3MgQ29yYmFjaG8gPGNhcmxvc0BzdHJhbmdld29ybGRzLmNvLnVrPgotICogIENvcHlyaWdodCAoQykgMjAwNCBKYW1leSBIaWNrcyA8amFtZXkuaGlja3NAaHAuY29tPgotICogIENvcHlyaWdodCAoQykgMjAwMSwgMjAwMiBBbmR5IEdyb3ZlciA8YW5kcmV3Lmdyb3ZlckBpbnRlbC5jb20+Ci0gKiAgQ29weXJpZ2h0IChDKSAyMDAxLCAyMDAyIFBhdWwgRGllZmVuYmF1Z2ggPHBhdWwucy5kaWVmZW5iYXVnaEBpbnRlbC5jb20+Ci0gKgotICogfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLSAqCi0gKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICogIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICogIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICogIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLSAqICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICogIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBLgotICoKLSAqIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgotI2luY2x1ZGUgPGFjcGkvYWN0eXBlcy5oPgotI2luY2x1ZGUgPGFjcGkvYWNwaV9idXMuaD4KLSNpbmNsdWRlIDxhY3BpL2FjcGlfZHJpdmVycy5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotCi0jZGVmaW5lIEdVSUQgIkMzNjRBQzcxLTM2REItNDk1QS04NDk0LUI0MzlENDcyQTUwNSIKLQotI2RlZmluZSBUQzExMDBfSU5TVEFOQ0VfV0lSRUxFU1MJCTEKLSNkZWZpbmUgVEMxMTAwX0lOU1RBTkNFX0pPR0RJQUwJCTIKLQotI2RlZmluZSBUQzExMDBfTE9HUFJFRklYICJ0YzExMDAtd21pOiAiCi0jZGVmaW5lIFRDMTEwMF9JTkZPIEtFUk5fSU5GTyBUQzExMDBfTE9HUFJFRklYCi0KLU1PRFVMRV9BVVRIT1IoIkphbWV5IEhpY2tzLCBDYXJsb3MgQ29yYmFjaG8iKTsKLU1PRFVMRV9ERVNDUklQVElPTigiSFAgQ29tcGFxIFRDMTEwMCBUYWJsZXQgV01JIEV4dHJhcyIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotTU9EVUxFX0FMSUFTKCJ3bWk6QzM2NEFDNzEtMzZEQi00OTVBLTg0OTQtQjQzOUQ0NzJBNTA1Iik7Ci0KLXN0YXRpYyBpbnQgdGMxMTAwX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldmljZSk7Ci1zdGF0aWMgaW50IHRjMTEwMF9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2aWNlKTsKLXN0YXRpYyBpbnQgdGMxMTAwX3N1c3BlbmQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2aWNlLCBwbV9tZXNzYWdlX3Qgc3RhdGUpOwotc3RhdGljIGludCB0YzExMDBfcmVzdW1lKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldmljZSk7Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHRjMTEwMF9kcml2ZXIgPSB7Ci0JLmRyaXZlciA9IHsKLQkJLm5hbWUgPSAidGMxMTAwLXdtaSIsCi0JCS5vd25lciA9IFRISVNfTU9EVUxFLAotCX0sCi0JLnByb2JlID0gdGMxMTAwX3Byb2JlLAotCS5yZW1vdmUgPSB0YzExMDBfcmVtb3ZlLAotCS5zdXNwZW5kID0gdGMxMTAwX3N1c3BlbmQsCi0JLnJlc3VtZSA9IHRjMTEwMF9yZXN1bWUsCi19OwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqdGMxMTAwX2RldmljZTsKLQotc3RydWN0IHRjMTEwMF9kYXRhIHsKLQl1MzIgd2lyZWxlc3M7Ci0JdTMyIGpvZ2RpYWw7Ci19OwotCi1zdGF0aWMgc3RydWN0IHRjMTEwMF9kYXRhIHN1c3BlbmRfZGF0YTsKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkJCQlEZXZpY2UgTWFuYWdlbWVudAotICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotc3RhdGljIGludCBnZXRfc3RhdGUodTMyICpvdXQsIHU4IGluc3RhbmNlKQotewotCXUzMiB0bXA7Ci0JYWNwaV9zdGF0dXMgc3RhdHVzOwotCXN0cnVjdCBhY3BpX2J1ZmZlciByZXN1bHQgPSB7IEFDUElfQUxMT0NBVEVfQlVGRkVSLCBOVUxMIH07Ci0JdW5pb24gYWNwaV9vYmplY3QgKm9iajsKLQotCWlmICghb3V0KQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmIChpbnN0YW5jZSA+IDIpCi0JCXJldHVybiAtRU5PREVWOwotCi0Jc3RhdHVzID0gd21pX3F1ZXJ5X2Jsb2NrKEdVSUQsIGluc3RhbmNlLCAmcmVzdWx0KTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpCi0JCXJldHVybiAtRU5PREVWOwotCi0Jb2JqID0gKHVuaW9uIGFjcGlfb2JqZWN0ICopIHJlc3VsdC5wb2ludGVyOwotCWlmIChvYmogJiYgb2JqLT50eXBlID09IEFDUElfVFlQRV9CVUZGRVIgJiYKLQkJb2JqLT5idWZmZXIubGVuZ3RoID09IHNpemVvZih1MzIpKSB7Ci0JCXRtcCA9ICooKHUzMiAqKSBvYmotPmJ1ZmZlci5wb2ludGVyKTsKLQl9IGVsc2UgewotCQl0bXAgPSAwOwotCX0KLQotCWlmIChyZXN1bHQubGVuZ3RoID4gMCAmJiByZXN1bHQucG9pbnRlcikKLQkJa2ZyZWUocmVzdWx0LnBvaW50ZXIpOwotCi0Jc3dpdGNoIChpbnN0YW5jZSkgewotCWNhc2UgVEMxMTAwX0lOU1RBTkNFX1dJUkVMRVNTOgotCQkqb3V0ID0gKHRtcCA9PSAzKSA/IDEgOiAwOwotCQlyZXR1cm4gMDsKLQljYXNlIFRDMTEwMF9JTlNUQU5DRV9KT0dESUFMOgotCQkqb3V0ID0gKHRtcCA9PSAxKSA/IDEgOiAwOwotCQlyZXR1cm4gMDsKLQlkZWZhdWx0OgotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci19Ci0KLXN0YXRpYyBpbnQgc2V0X3N0YXRlKHUzMiAqaW4sIHU4IGluc3RhbmNlKQotewotCXUzMiB2YWx1ZTsKLQlhY3BpX3N0YXR1cyBzdGF0dXM7Ci0Jc3RydWN0IGFjcGlfYnVmZmVyIGlucHV0OwotCi0JaWYgKCFpbikKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlpZiAoaW5zdGFuY2UgPiAyKQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCXN3aXRjaCAoaW5zdGFuY2UpIHsKLQljYXNlIFRDMTEwMF9JTlNUQU5DRV9XSVJFTEVTUzoKLQkJdmFsdWUgPSAoKmluKSA/IDEgOiAyOwotCQlicmVhazsKLQljYXNlIFRDMTEwMF9JTlNUQU5DRV9KT0dESUFMOgotCQl2YWx1ZSA9ICgqaW4pID8gMCA6IDE7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQotCWlucHV0Lmxlbmd0aCA9IHNpemVvZih1MzIpOwotCWlucHV0LnBvaW50ZXIgPSAmdmFsdWU7Ci0KLQlzdGF0dXMgPSB3bWlfc2V0X2Jsb2NrKEdVSUQsIGluc3RhbmNlLCAmaW5wdXQpOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkJCQlGUyBJbnRlcmZhY2UgKC9zeXMpCi0gICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0vKgotICogUmVhZC8gd3JpdGUgYm9vbCBzeXNmcyBtYWNybwotICovCi0jZGVmaW5lIHNob3dfc2V0X2Jvb2wodmFsdWUsIGluc3RhbmNlKSBcCi1zdGF0aWMgc3NpemVfdCBcCi1zaG93X2Jvb2xfIyN2YWx1ZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBcCi0JY2hhciAqYnVmKSBcCi17IFwKLQl1MzIgcmVzdWx0OyBcCi0JYWNwaV9zdGF0dXMgc3RhdHVzID0gZ2V0X3N0YXRlKCZyZXN1bHQsIGluc3RhbmNlKTsgXAotCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkgXAotCQlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgcmVzdWx0KTsgXAotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIlJlYWQgZXJyb3JcbiIpOyBcCi19IFwKLVwKLXN0YXRpYyBzc2l6ZV90IFwKLXNldF9ib29sXyMjdmFsdWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgXAotCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KSBcCi17IFwKLQl1MzIgdG1wID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCk7IFwKLQlhY3BpX3N0YXR1cyBzdGF0dXMgPSBzZXRfc3RhdGUoJnRtcCwgaW5zdGFuY2UpOyBcCi0JCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgXAotCQkJcmV0dXJuIC1FSU5WQUw7IFwKLQlyZXR1cm4gY291bnQ7IFwKLX0gXAotc3RhdGljIERFVklDRV9BVFRSKHZhbHVlLCBTX0lXVUdPIHwgU19JUlVHTyB8IFNfSVdVU1IsIFwKLQlzaG93X2Jvb2xfIyN2YWx1ZSwgc2V0X2Jvb2xfIyN2YWx1ZSk7Ci0KLXNob3dfc2V0X2Jvb2wod2lyZWxlc3MsIFRDMTEwMF9JTlNUQU5DRV9XSVJFTEVTUyk7Ci1zaG93X3NldF9ib29sKGpvZ2RpYWwsIFRDMTEwMF9JTlNUQU5DRV9KT0dESUFMKTsKLQotc3RhdGljIHZvaWQgcmVtb3ZlX2ZzKHZvaWQpCi17Ci0JZGV2aWNlX3JlbW92ZV9maWxlKCZ0YzExMDBfZGV2aWNlLT5kZXYsICZkZXZfYXR0cl93aXJlbGVzcyk7Ci0JZGV2aWNlX3JlbW92ZV9maWxlKCZ0YzExMDBfZGV2aWNlLT5kZXYsICZkZXZfYXR0cl9qb2dkaWFsKTsKLX0KLQotc3RhdGljIGludCBhZGRfZnModm9pZCkKLXsKLQlpbnQgcmV0OwotCi0JcmV0ID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZ0YzExMDBfZGV2aWNlLT5kZXYsICZkZXZfYXR0cl93aXJlbGVzcyk7Ci0JaWYgKHJldCkKLQkJZ290byBhZGRfc3lzZnNfZXJyb3I7Ci0KLQlyZXQgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJnRjMTEwMF9kZXZpY2UtPmRldiwgJmRldl9hdHRyX2pvZ2RpYWwpOwotCWlmIChyZXQpCi0JCWdvdG8gYWRkX3N5c2ZzX2Vycm9yOwotCi0JcmV0dXJuIHJldDsKLQotYWRkX3N5c2ZzX2Vycm9yOgotCXJlbW92ZV9mcygpOwotCXJldHVybiByZXQ7Ci19Ci0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JCQkJRHJpdmVyIE1vZGVsCi0gICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi1zdGF0aWMgaW50IHRjMTEwMF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXZpY2UpCi17Ci0JaW50IHJlc3VsdCA9IDA7Ci0KLQlyZXN1bHQgPSBhZGRfZnMoKTsKLQlyZXR1cm4gcmVzdWx0OwotfQotCi0KLXN0YXRpYyBpbnQgdGMxMTAwX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXZpY2UpCi17Ci0JcmVtb3ZlX2ZzKCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdGMxMTAwX3N1c3BlbmQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCi17Ci0JaW50IHJldDsKLQotCXJldCA9IGdldF9zdGF0ZSgmc3VzcGVuZF9kYXRhLndpcmVsZXNzLCBUQzExMDBfSU5TVEFOQ0VfV0lSRUxFU1MpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQlyZXQgPSBnZXRfc3RhdGUoJnN1c3BlbmRfZGF0YS5qb2dkaWFsLCBUQzExMDBfSU5TVEFOQ0VfSk9HRElBTCk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgdGMxMTAwX3Jlc3VtZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCi17Ci0JaW50IHJldDsKLQotCXJldCA9IHNldF9zdGF0ZSgmc3VzcGVuZF9kYXRhLndpcmVsZXNzLCBUQzExMDBfSU5TVEFOQ0VfV0lSRUxFU1MpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQlyZXQgPSBzZXRfc3RhdGUoJnN1c3BlbmRfZGF0YS5qb2dkaWFsLCBUQzExMDBfSU5TVEFOQ0VfSk9HRElBTCk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgX19pbml0IHRjMTEwMF9pbml0KHZvaWQpCi17Ci0JaW50IHJlc3VsdCA9IDA7Ci0KLQlpZiAoIXdtaV9oYXNfZ3VpZChHVUlEKSkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQlyZXN1bHQgPSBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnRjMTEwMF9kcml2ZXIpOwotCWlmIChyZXN1bHQpCi0JCXJldHVybiByZXN1bHQ7Ci0KLQl0YzExMDBfZGV2aWNlID0gcGxhdGZvcm1fZGV2aWNlX2FsbG9jKCJ0YzExMDAtd21pIiwgLTEpOwotCXBsYXRmb3JtX2RldmljZV9hZGQodGMxMTAwX2RldmljZSk7Ci0KLQlwcmludGsoVEMxMTAwX0lORk8gIkhQIENvbXBhcSBUQzExMDAgVGFibGV0IFdNSSBFeHRyYXMgbG9hZGVkXG4iKTsKLQotCXJldHVybiByZXN1bHQ7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCB0YzExMDBfZXhpdCh2b2lkKQotewotCXBsYXRmb3JtX2RldmljZV9kZWwodGMxMTAwX2RldmljZSk7Ci0JcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnRjMTEwMF9kcml2ZXIpOwotCi0JcHJpbnRrKFRDMTEwMF9JTkZPICJIUCBDb21wYXEgVEMxMTAwIFRhYmxldCBXTUkgRXh0cmFzIHVubG9hZGVkXG4iKTsKLX0KLQotbW9kdWxlX2luaXQodGMxMTAwX2luaXQpOwotbW9kdWxlX2V4aXQodGMxMTAwX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL3RoaW5rcGFkX2FjcGkuYyBiL2RyaXZlcnMvbWlzYy90aGlua3BhZF9hY3BpLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5OTc2NmUuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9taXNjL3RoaW5rcGFkX2FjcGkuYworKysgL2Rldi9udWxsCkBAIC0xLDY5NDkgKzAsMCBAQAotLyoKLSAqICB0aGlua3BhZF9hY3BpLmMgLSBUaGlua1BhZCBBQ1BJIEV4dHJhcwotICoKLSAqCi0gKiAgQ29weXJpZ2h0IChDKSAyMDA0LTIwMDUgQm9yaXNsYXYgRGVpYW5vdiA8Ym9yaXNsYXZAdXNlcnMuc2YubmV0PgotICogIENvcHlyaWdodCAoQykgMjAwNi0yMDA4IEhlbnJpcXVlIGRlIE1vcmFlcyBIb2xzY2h1aCA8aG1oQGhtaC5lbmcuYnI+Ci0gKgotICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCi0gKiAgMDIxMTAtMTMwMSwgVVNBLgotICovCi0KLSNkZWZpbmUgVFBBQ1BJX1ZFUlNJT04gIjAuMjEiCi0jZGVmaW5lIFRQQUNQSV9TWVNGU19WRVJTSU9OIDB4MDIwMjAwCi0KLS8qCi0gKiAgQ2hhbmdlbG9nOgotICogIDIwMDctMTAtMjAJCWNoYW5nZWxvZyB0cmltbWVkIGRvd24KLSAqCi0gKiAgMjAwNy0wMy0yNyAgMC4xNAlyZW5hbWVkIHRvIHRoaW5rcGFkX2FjcGkgYW5kIG1vdmVkIHRvCi0gKiAgCQkJZHJpdmVycy9taXNjLgotICoKLSAqICAyMDA2LTExLTIyCTAuMTMJbmV3IG1haW50YWluZXIKLSAqICAJCQljaGFuZ2Vsb2cgbm93IGxpdmVzIGluIGdpdCBjb21taXQgaGlzdG9yeSwgYW5kIHdpbGwKLSAqICAJCQlub3QgYmUgdXBkYXRlZCBmdXJ0aGVyIGluLWZpbGUuCi0gKgotICogIDIwMDUtMDMtMTcJMC4xMQlzdXBwb3J0IGZvciA2MDBlLCA3NzB4Ci0gKgkJCSAgICB0aGFua3MgdG8gSmFtaWUgTGVudGluIDxsZW50aW5qQGRpYWwucGlwZXguY29tPgotICoKLSAqICAyMDA1LTAxLTE2CTAuOQl1c2UgTU9EVUxFX1ZFUlNJT04KLSAqCQkJICAgIHRoYW5rcyB0byBIZW5yaWsgQnJpeCBBbmRlcnNlbiA8YnJpeEBnZW50b28ub3JnPgotICoJCQlmaXggcGFyYW1ldGVyIHBhc3Npbmcgb24gbW9kdWxlIGxvYWRpbmcKLSAqCQkJICAgIHRoYW5rcyB0byBSdXN0eSBSdXNzZWxsIDxydXN0eUBydXN0Y29ycC5jb20uYXU+Ci0gKgkJCSAgICB0aGFua3MgdG8gSmltIFJhZGZvcmQgPHJhZGZvcmRAYmxhY2tiZWFuLm9yZz4KLSAqICAyMDA0LTExLTA4CTAuOAlmaXggaW5pdCBlcnJvciBjYXNlLCBkb24ndCByZXR1cm4gZnJvbSBhIG1hY3JvCi0gKgkJCSAgICB0aGFua3MgdG8gQ2hyaXMgV3JpZ2h0IDxjaHJpc3dAb3NkbC5vcmc+Ci0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgotI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KLSNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgotI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KLSNpbmNsdWRlIDxsaW51eC9mcmVlemVyLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLQotI2luY2x1ZGUgPGxpbnV4L252cmFtLmg+Ci0jaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgotI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvYmFja2xpZ2h0Lmg+Ci0jaW5jbHVkZSA8bGludXgvZmIuaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9od21vbi5oPgotI2luY2x1ZGUgPGxpbnV4L2h3bW9uLXN5c2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KLSNpbmNsdWRlIDxsaW51eC9sZWRzLmg+Ci0jaW5jbHVkZSA8bGludXgvcmZraWxsLmg+Ci0jaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KLQotI2luY2x1ZGUgPGxpbnV4L2RtaS5oPgotI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KLSNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KLQotI2luY2x1ZGUgPGFjcGkvYWNwaV9kcml2ZXJzLmg+Ci0jaW5jbHVkZSA8YWNwaS9hY25hbWVzcC5oPgotCi0jaW5jbHVkZSA8bGludXgvcGNpX2lkcy5oPgotCi0KLS8qIFRoaW5rUGFkIENNT1MgY29tbWFuZHMgKi8KLSNkZWZpbmUgVFBfQ01PU19WT0xVTUVfRE9XTgkwCi0jZGVmaW5lIFRQX0NNT1NfVk9MVU1FX1VQCTEKLSNkZWZpbmUgVFBfQ01PU19WT0xVTUVfTVVURQkyCi0jZGVmaW5lIFRQX0NNT1NfQlJJR0hUTkVTU19VUAk0Ci0jZGVmaW5lIFRQX0NNT1NfQlJJR0hUTkVTU19ET1dOCTUKLSNkZWZpbmUgVFBfQ01PU19USElOS0xJR0hUX09OCTEyCi0jZGVmaW5lIFRQX0NNT1NfVEhJTktMSUdIVF9PRkYJMTMKLQotLyogTlZSQU0gQWRkcmVzc2VzICovCi1lbnVtIHRwX252cmFtX2FkZHIgewotCVRQX05WUkFNX0FERFJfSEsyCQk9IDB4NTcsCi0JVFBfTlZSQU1fQUREUl9USElOS0xJR0hUCT0gMHg1OCwKLQlUUF9OVlJBTV9BRERSX1ZJREVPCQk9IDB4NTksCi0JVFBfTlZSQU1fQUREUl9CUklHSFRORVNTCT0gMHg1ZSwKLQlUUF9OVlJBTV9BRERSX01JWEVSCQk9IDB4NjAsCi19OwotCi0vKiBOVlJBTSBiaXQgbWFza3MgKi8KLWVudW0gewotCVRQX05WUkFNX01BU0tfSEtUX1RISU5LUEFECT0gMHgwOCwKLQlUUF9OVlJBTV9NQVNLX0hLVF9aT09NCQk9IDB4MjAsCi0JVFBfTlZSQU1fTUFTS19IS1RfRElTUExBWQk9IDB4NDAsCi0JVFBfTlZSQU1fTUFTS19IS1RfSElCRVJOQVRFCT0gMHg4MCwKLQlUUF9OVlJBTV9NQVNLX1RISU5LTElHSFQJPSAweDEwLAotCVRQX05WUkFNX01BU0tfSEtUX0RJU1BFWFBORAk9IDB4MzAsCi0JVFBfTlZSQU1fTUFTS19IS1RfQlJJR0hUTkVTUwk9IDB4MjAsCi0JVFBfTlZSQU1fTUFTS19MRVZFTF9CUklHSFRORVNTCT0gMHgwZiwKLQlUUF9OVlJBTV9QT1NfTEVWRUxfQlJJR0hUTkVTUwk9IDAsCi0JVFBfTlZSQU1fTUFTS19NVVRFCQk9IDB4NDAsCi0JVFBfTlZSQU1fTUFTS19IS1RfVk9MVU1FCT0gMHg4MCwKLQlUUF9OVlJBTV9NQVNLX0xFVkVMX1ZPTFVNRQk9IDB4MGYsCi0JVFBfTlZSQU1fUE9TX0xFVkVMX1ZPTFVNRQk9IDAsCi19OwotCi0vKiBBQ1BJIEhJRHMgKi8KLSNkZWZpbmUgVFBBQ1BJX0FDUElfSEtFWV9ISUQJCSJJQk0wMDY4IgotCi0vKiBJbnB1dCBJRHMgKi8KLSNkZWZpbmUgVFBBQ1BJX0hLRVlfSU5QVVRfUFJPRFVDVAkweDUwNTQgLyogIlRQIiAqLwotI2RlZmluZSBUUEFDUElfSEtFWV9JTlBVVF9WRVJTSU9OCTB4NDEwMQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNYWluIGRyaXZlcgotICovCi0KLSNkZWZpbmUgVFBBQ1BJX05BTUUgInRoaW5rcGFkIgotI2RlZmluZSBUUEFDUElfREVTQyAiVGhpbmtQYWQgQUNQSSBFeHRyYXMiCi0jZGVmaW5lIFRQQUNQSV9GSUxFIFRQQUNQSV9OQU1FICJfYWNwaSIKLSNkZWZpbmUgVFBBQ1BJX1VSTCAiaHR0cDovL2libS1hY3BpLnNmLm5ldC8iCi0jZGVmaW5lIFRQQUNQSV9NQUlMICJpYm0tYWNwaS1kZXZlbEBsaXN0cy5zb3VyY2Vmb3JnZS5uZXQiCi0KLSNkZWZpbmUgVFBBQ1BJX1BST0NfRElSICJpYm0iCi0jZGVmaW5lIFRQQUNQSV9BQ1BJX0VWRU5UX1BSRUZJWCAiaWJtIgotI2RlZmluZSBUUEFDUElfRFJWUl9OQU1FIFRQQUNQSV9GSUxFCi0jZGVmaW5lIFRQQUNQSV9EUlZSX1NIT1JUTkFNRSAidHBhY3BpIgotI2RlZmluZSBUUEFDUElfSFdNT05fRFJWUl9OQU1FIFRQQUNQSV9OQU1FICJfaHdtb24iCi0KLSNkZWZpbmUgVFBBQ1BJX05WUkFNX0tUSFJFQURfTkFNRSAia3RwYWNwaV9udnJhbWQiCi0jZGVmaW5lIFRQQUNQSV9XT1JLUVVFVUVfTkFNRSAia3RwYWNwaWQiCi0KLSNkZWZpbmUgVFBBQ1BJX01BWF9BQ1BJX0FSR1MgMwotCi0vKiByZmtpbGwgc3dpdGNoZXMgKi8KLWVudW0gewotCVRQQUNQSV9SRktfQkxVRVRPT1RIX1NXX0lEID0gMCwKLQlUUEFDUElfUkZLX1dXQU5fU1dfSUQsCi19OwotCi0vKiBEZWJ1Z2dpbmcgKi8KLSNkZWZpbmUgVFBBQ1BJX0xPRyBUUEFDUElfRklMRSAiOiAiCi0jZGVmaW5lIFRQQUNQSV9FUlIJICAgS0VSTl9FUlIgICAgVFBBQ1BJX0xPRwotI2RlZmluZSBUUEFDUElfTk9USUNFIEtFUk5fTk9USUNFIFRQQUNQSV9MT0cKLSNkZWZpbmUgVFBBQ1BJX0lORk8gICBLRVJOX0lORk8gICBUUEFDUElfTE9HCi0jZGVmaW5lIFRQQUNQSV9ERUJVRyAgS0VSTl9ERUJVRyAgVFBBQ1BJX0xPRwotCi0jZGVmaW5lIFRQQUNQSV9EQkdfQUxMCQkweGZmZmYKLSNkZWZpbmUgVFBBQ1BJX0RCR19JTklUCQkweDAwMDEKLSNkZWZpbmUgVFBBQ1BJX0RCR19FWElUCQkweDAwMDIKLSNkZWZpbmUgZGJnX3ByaW50ayhhX2RiZ19sZXZlbCwgZm9ybWF0LCBhcmcuLi4pIFwKLQlkbyB7IGlmIChkYmdfbGV2ZWwgJiBhX2RiZ19sZXZlbCkgXAotCQlwcmludGsoVFBBQ1BJX0RFQlVHICIlczogIiBmb3JtYXQsIF9fZnVuY19fICwgIyMgYXJnKTsgXAotCX0gd2hpbGUgKDApCi0jaWZkZWYgQ09ORklHX1RISU5LUEFEX0FDUElfREVCVUcKLSNkZWZpbmUgdmRiZ19wcmludGsoYV9kYmdfbGV2ZWwsIGZvcm1hdCwgYXJnLi4uKSBcCi0JZGJnX3ByaW50ayhhX2RiZ19sZXZlbCwgZm9ybWF0LCAjIyBhcmcpCi1zdGF0aWMgY29uc3QgY2hhciAqc3RyX3N1cHBvcnRlZChpbnQgaXNfc3VwcG9ydGVkKTsKLSNlbHNlCi0jZGVmaW5lIHZkYmdfcHJpbnRrKGFfZGJnX2xldmVsLCBmb3JtYXQsIGFyZy4uLikKLSNlbmRpZgotCi0jZGVmaW5lIG9ub2ZmKHN0YXR1cywgYml0KSAoKHN0YXR1cykgJiAoMSA8PCAoYml0KSkgPyAib24iIDogIm9mZiIpCi0jZGVmaW5lIGVuYWJsZWQoc3RhdHVzLCBiaXQpICgoc3RhdHVzKSAmICgxIDw8IChiaXQpKSA/ICJlbmFibGVkIiA6ICJkaXNhYmxlZCIpCi0jZGVmaW5lIHN0cmxlbmNtcChhLCBiKSAoc3RybmNtcCgoYSksIChiKSwgc3RybGVuKGIpKSkKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogRHJpdmVyLXdpZGUgc3RydWN0cyBhbmQgbWlzYy4gdmFyaWFibGVzCi0gKi8KLQotc3RydWN0IGlibV9zdHJ1Y3Q7Ci0KLXN0cnVjdCB0cF9hY3BpX2Rydl9zdHJ1Y3QgewotCWNvbnN0IHN0cnVjdCBhY3BpX2RldmljZV9pZCAqaGlkOwotCXN0cnVjdCBhY3BpX2RyaXZlciAqZHJpdmVyOwotCi0Jdm9pZCAoKm5vdGlmeSkgKHN0cnVjdCBpYm1fc3RydWN0ICosIHUzMik7Ci0JYWNwaV9oYW5kbGUgKmhhbmRsZTsKLQl1MzIgdHlwZTsKLQlzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZTsKLX07Ci0KLXN0cnVjdCBpYm1fc3RydWN0IHsKLQljaGFyICpuYW1lOwotCi0JaW50ICgqcmVhZCkgKGNoYXIgKik7Ci0JaW50ICgqd3JpdGUpIChjaGFyICopOwotCXZvaWQgKCpleGl0KSAodm9pZCk7Ci0Jdm9pZCAoKnJlc3VtZSkgKHZvaWQpOwotCXZvaWQgKCpzdXNwZW5kKSAocG1fbWVzc2FnZV90IHN0YXRlKTsKLQotCXN0cnVjdCBsaXN0X2hlYWQgYWxsX2RyaXZlcnM7Ci0KLQlzdHJ1Y3QgdHBfYWNwaV9kcnZfc3RydWN0ICphY3BpOwotCi0Jc3RydWN0IHsKLQkJdTggYWNwaV9kcml2ZXJfcmVnaXN0ZXJlZDoxOwotCQl1OCBhY3BpX25vdGlmeV9pbnN0YWxsZWQ6MTsKLQkJdTggcHJvY19jcmVhdGVkOjE7Ci0JCXU4IGluaXRfY2FsbGVkOjE7Ci0JCXU4IGV4cGVyaW1lbnRhbDoxOwotCX0gZmxhZ3M7Ci19OwotCi1zdHJ1Y3QgaWJtX2luaXRfc3RydWN0IHsKLQljaGFyIHBhcmFtWzMyXTsKLQotCWludCAoKmluaXQpIChzdHJ1Y3QgaWJtX2luaXRfc3RydWN0ICopOwotCXN0cnVjdCBpYm1fc3RydWN0ICpkYXRhOwotfTsKLQotc3RhdGljIHN0cnVjdCB7Ci0jaWZkZWYgQ09ORklHX1RISU5LUEFEX0FDUElfQkFZCi0JdTMyIGJheV9zdGF0dXM6MTsKLQl1MzIgYmF5X2VqZWN0OjE7Ci0JdTMyIGJheV9zdGF0dXMyOjE7Ci0JdTMyIGJheV9lamVjdDI6MTsKLSNlbmRpZgotCXUzMiBibHVldG9vdGg6MTsKLQl1MzIgaG90a2V5OjE7Ci0JdTMyIGhvdGtleV9tYXNrOjE7Ci0JdTMyIGhvdGtleV93bHN3OjE7Ci0JdTMyIGhvdGtleV90YWJsZXQ6MTsKLQl1MzIgbGlnaHQ6MTsKLQl1MzIgbGlnaHRfc3RhdHVzOjE7Ci0JdTMyIGJyaWdodF8xNmxldmVsczoxOwotCXUzMiBicmlnaHRfYWNwaW1vZGU6MTsKLQl1MzIgd2FuOjE7Ci0JdTMyIGZhbl9jdHJsX3N0YXR1c191bmRlZjoxOwotCXUzMiBpbnB1dF9kZXZpY2VfcmVnaXN0ZXJlZDoxOwotCXUzMiBwbGF0Zm9ybV9kcnZfcmVnaXN0ZXJlZDoxOwotCXUzMiBwbGF0Zm9ybV9kcnZfYXR0cnNfcmVnaXN0ZXJlZDoxOwotCXUzMiBzZW5zb3JzX3BkcnZfcmVnaXN0ZXJlZDoxOwotCXUzMiBzZW5zb3JzX3BkcnZfYXR0cnNfcmVnaXN0ZXJlZDoxOwotCXUzMiBzZW5zb3JzX3BkZXZfYXR0cnNfcmVnaXN0ZXJlZDoxOwotCXUzMiBob3RrZXlfcG9sbF9hY3RpdmU6MTsKLX0gdHBfZmVhdHVyZXM7Ci0KLXN0YXRpYyBzdHJ1Y3QgewotCXUxNiBob3RrZXlfbWFza19mZjoxOwotCXUxNiBicmlnaHRfY21vc19lY191bnN5bmM6MTsKLX0gdHBfd2FybmVkOwotCi1zdHJ1Y3QgdGhpbmtwYWRfaWRfZGF0YSB7Ci0JdW5zaWduZWQgaW50IHZlbmRvcjsJLyogVGhpbmtQYWQgdmVuZG9yOgotCQkJCSAqIFBDSV9WRU5ET1JfSURfSUJNL1BDSV9WRU5ET1JfSURfTEVOT1ZPICovCi0KLQljaGFyICpiaW9zX3ZlcnNpb25fc3RyOwkvKiBTb21ldGhpbmcgbGlrZSAxWkVUNTFXVyAoMS4wM3opICovCi0JY2hhciAqZWNfdmVyc2lvbl9zdHI7CS8qIFNvbWV0aGluZyBsaWtlIDFaSFQ1MVdXLTEuMDRhICovCi0KLQl1MTYgYmlvc19tb2RlbDsJCS8qIEJpZyBFbmRpYW4sIFRQLTFZID0gMHg1OTMxLCAwID0gdW5rbm93biAqLwotCXUxNiBlY19tb2RlbDsKLQotCWNoYXIgKm1vZGVsX3N0cjsJLyogVGhpbmtQYWQgVDQzICovCi0JY2hhciAqbnVtbW9kZWxfc3RyOwkvKiA5Mzg0QTlDIGZvciBhIDkzODQtQTlDIG1vZGVsICovCi19Owotc3RhdGljIHN0cnVjdCB0aGlua3BhZF9pZF9kYXRhIHRoaW5rcGFkX2lkOwotCi1zdGF0aWMgZW51bSB7Ci0JVFBBQ1BJX0xJRkVfSU5JVCA9IDAsCi0JVFBBQ1BJX0xJRkVfUlVOTklORywKLQlUUEFDUElfTElGRV9FWElUSU5HLAotfSB0cGFjcGlfbGlmZWN5Y2xlOwotCi1zdGF0aWMgaW50IGV4cGVyaW1lbnRhbDsKLXN0YXRpYyB1MzIgZGJnX2xldmVsOwotCi1zdGF0aWMgc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKnRwYWNwaV93cTsKLQotLyogU3BlY2lhbCBMRUQgY2xhc3MgdGhhdCBjYW4gZGVmZXIgd29yayAqLwotc3RydWN0IHRwYWNwaV9sZWRfY2xhc3NkZXYgewotCXN0cnVjdCBsZWRfY2xhc3NkZXYgbGVkX2NsYXNzZGV2OwotCXN0cnVjdCB3b3JrX3N0cnVjdCB3b3JrOwotCWVudW0gbGVkX2JyaWdodG5lc3MgbmV3X2JyaWdodG5lc3M7Ci0JdW5zaWduZWQgaW50IGxlZDsKLX07Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEFDUEkgSGVscGVycyBhbmQgZGV2aWNlIG1vZGVsCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQUNQSSBiYXNpYyBoYW5kbGVzCi0gKi8KLQotc3RhdGljIGFjcGlfaGFuZGxlIHJvb3RfaGFuZGxlOwotCi0jZGVmaW5lIFRQQUNQSV9IQU5ETEUob2JqZWN0LCBwYXJlbnQsIHBhdGhzLi4uKQkJCVwKLQlzdGF0aWMgYWNwaV9oYW5kbGUgIG9iamVjdCMjX2hhbmRsZTsJCQlcCi0Jc3RhdGljIGFjcGlfaGFuZGxlICpvYmplY3QjI19wYXJlbnQgPSAmcGFyZW50IyNfaGFuZGxlOwlcCi0Jc3RhdGljIGNoYXIgICAgICAgICpvYmplY3QjI19wYXRoOwkJCVwKLQlzdGF0aWMgY2hhciAgICAgICAgKm9iamVjdCMjX3BhdGhzW10gPSB7IHBhdGhzIH0KLQotVFBBQ1BJX0hBTkRMRShlYywgcm9vdCwgIlxcX1NCLlBDSTAuSVNBLkVDMCIsCS8qIDI0MCwgMjQweCAqLwotCSAgICJcXF9TQi5QQ0kuSVNBLkVDIiwJLyogNTcwICovCi0JICAgIlxcX1NCLlBDSTAuSVNBMC5FQzAiLAkvKiA2MDBlL3gsIDc3MGUsIDc3MHggKi8KLQkgICAiXFxfU0IuUENJMC5JU0EuRUMiLAkvKiBBMjFlLCBBMnhtL3AsIFQyMC0yMiwgWDIwLTIxICovCi0JICAgIlxcX1NCLlBDSTAuQUQ0Uy5FQzAiLAkvKiBpMTQwMCwgUjMwICovCi0JICAgIlxcX1NCLlBDSTAuSUNIMy5FQzAiLAkvKiBSMzEgKi8KLQkgICAiXFxfU0IuUENJMC5MUEMuRUMiLAkvKiBhbGwgb3RoZXJzICovCi0JICAgKTsKLQotVFBBQ1BJX0hBTkRMRShlY3JkLCBlYywgIkVDUkQiKTsJLyogNTcwICovCi1UUEFDUElfSEFORExFKGVjd3IsIGVjLCAiRUNXUiIpOwkvKiA1NzAgKi8KLQotVFBBQ1BJX0hBTkRMRShjbW9zLCByb290LCAiXFxVQ01TIiwJLyogUjUwLCBSNTBlLCBSNTBwLCBSNTEsICovCi0JCQkJCS8qIFQ0eCwgWDMxLCBYNDAgKi8KLQkgICAiXFxDTU9TIiwJCS8qIEEzeCwgRzR4LCBSMzIsIFQyMywgVDMwLCBYMjItMjQsIFgzMCAqLwotCSAgICJcXENNUyIsCQkvKiBSNDAsIFI0MGUgKi8KLQkgICApOwkJCS8qIGFsbCBvdGhlcnMgKi8KLQotVFBBQ1BJX0hBTkRMRShoa2V5LCBlYywgIlxcX1NCLkhLRVkiLAkvKiA2MDBlL3gsIDc3MGUsIDc3MHggKi8KLQkgICAiXkhLRVkiLAkJLyogUjMwLCBSMzEgKi8KLQkgICAiSEtFWSIsCQkvKiBhbGwgb3RoZXJzICovCi0JICAgKTsJCQkvKiA1NzAgKi8KLQotVFBBQ1BJX0hBTkRMRSh2aWQsIHJvb3QsICJcXF9TQi5QQ0kuQUdQLlZHQSIsCS8qIDU3MCAqLwotCSAgICJcXF9TQi5QQ0kwLkFHUDAuVklEMCIsCS8qIDYwMGUveCwgNzcweCAqLwotCSAgICJcXF9TQi5QQ0kwLlZJRDAiLAkvKiA3NzBlICovCi0JICAgIlxcX1NCLlBDSTAuVklEIiwJLyogQTIxZSwgRzR4LCBSNTBlLCBYMzAsIFg0MCAqLwotCSAgICJcXF9TQi5QQ0kwLkFHUC5WSUQiLAkvKiBhbGwgb3RoZXJzICovCi0JICAgKTsJCQkJLyogUjMwLCBSMzEgKi8KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQUNQSSBoZWxwZXJzCi0gKi8KLQotc3RhdGljIGludCBhY3BpX2V2YWxmKGFjcGlfaGFuZGxlIGhhbmRsZSwKLQkJICAgICAgdm9pZCAqcmVzLCBjaGFyICptZXRob2QsIGNoYXIgKmZtdCwgLi4uKQotewotCWNoYXIgKmZtdDAgPSBmbXQ7Ci0Jc3RydWN0IGFjcGlfb2JqZWN0X2xpc3QgcGFyYW1zOwotCXVuaW9uIGFjcGlfb2JqZWN0IGluX29ianNbVFBBQ1BJX01BWF9BQ1BJX0FSR1NdOwotCXN0cnVjdCBhY3BpX2J1ZmZlciByZXN1bHQsICpyZXN1bHRwOwotCXVuaW9uIGFjcGlfb2JqZWN0IG91dF9vYmo7Ci0JYWNwaV9zdGF0dXMgc3RhdHVzOwotCXZhX2xpc3QgYXA7Ci0JY2hhciByZXNfdHlwZTsKLQlpbnQgc3VjY2VzczsKLQlpbnQgcXVpZXQ7Ci0KLQlpZiAoISpmbXQpIHsKLQkJcHJpbnRrKFRQQUNQSV9FUlIgImFjcGlfZXZhbGYoKSBjYWxsZWQgd2l0aCBlbXB0eSBmb3JtYXRcbiIpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlpZiAoKmZtdCA9PSAncScpIHsKLQkJcXVpZXQgPSAxOwotCQlmbXQrKzsKLQl9IGVsc2UKLQkJcXVpZXQgPSAwOwotCi0JcmVzX3R5cGUgPSAqKGZtdCsrKTsKLQotCXBhcmFtcy5jb3VudCA9IDA7Ci0JcGFyYW1zLnBvaW50ZXIgPSAmaW5fb2Jqc1swXTsKLQotCXZhX3N0YXJ0KGFwLCBmbXQpOwotCXdoaWxlICgqZm10KSB7Ci0JCWNoYXIgYyA9ICooZm10KyspOwotCQlzd2l0Y2ggKGMpIHsKLQkJY2FzZSAnZCc6CS8qIGludCAqLwotCQkJaW5fb2Jqc1twYXJhbXMuY291bnRdLmludGVnZXIudmFsdWUgPSB2YV9hcmcoYXAsIGludCk7Ci0JCQlpbl9vYmpzW3BhcmFtcy5jb3VudCsrXS50eXBlID0gQUNQSV9UWVBFX0lOVEVHRVI7Ci0JCQlicmVhazsKLQkJCS8qIGFkZCBtb3JlIHR5cGVzIGFzIG5lZWRlZCAqLwotCQlkZWZhdWx0OgotCQkJcHJpbnRrKFRQQUNQSV9FUlIgImFjcGlfZXZhbGYoKSBjYWxsZWQgIgotCQkJICAgICAgICJ3aXRoIGludmFsaWQgZm9ybWF0IGNoYXJhY3RlciAnJWMnXG4iLCBjKTsKLQkJCXJldHVybiAwOwotCQl9Ci0JfQotCXZhX2VuZChhcCk7Ci0KLQlpZiAocmVzX3R5cGUgIT0gJ3YnKSB7Ci0JCXJlc3VsdC5sZW5ndGggPSBzaXplb2Yob3V0X29iaik7Ci0JCXJlc3VsdC5wb2ludGVyID0gJm91dF9vYmo7Ci0JCXJlc3VsdHAgPSAmcmVzdWx0OwotCX0gZWxzZQotCQlyZXN1bHRwID0gTlVMTDsKLQotCXN0YXR1cyA9IGFjcGlfZXZhbHVhdGVfb2JqZWN0KGhhbmRsZSwgbWV0aG9kLCAmcGFyYW1zLCByZXN1bHRwKTsKLQotCXN3aXRjaCAocmVzX3R5cGUpIHsKLQljYXNlICdkJzoJCS8qIGludCAqLwotCQlpZiAocmVzKQotCQkJKihpbnQgKilyZXMgPSBvdXRfb2JqLmludGVnZXIudmFsdWU7Ci0JCXN1Y2Nlc3MgPSBzdGF0dXMgPT0gQUVfT0sgJiYgb3V0X29iai50eXBlID09IEFDUElfVFlQRV9JTlRFR0VSOwotCQlicmVhazsKLQljYXNlICd2JzoJCS8qIHZvaWQgKi8KLQkJc3VjY2VzcyA9IHN0YXR1cyA9PSBBRV9PSzsKLQkJYnJlYWs7Ci0JCS8qIGFkZCBtb3JlIHR5cGVzIGFzIG5lZWRlZCAqLwotCWRlZmF1bHQ6Ci0JCXByaW50ayhUUEFDUElfRVJSICJhY3BpX2V2YWxmKCkgY2FsbGVkICIKLQkJICAgICAgICJ3aXRoIGludmFsaWQgZm9ybWF0IGNoYXJhY3RlciAnJWMnXG4iLCByZXNfdHlwZSk7Ci0JCXJldHVybiAwOwotCX0KLQotCWlmICghc3VjY2VzcyAmJiAhcXVpZXQpCi0JCXByaW50ayhUUEFDUElfRVJSICJhY3BpX2V2YWxmKCVzLCAlcywgLi4uKSBmYWlsZWQ6ICVkXG4iLAotCQkgICAgICAgbWV0aG9kLCBmbXQwLCBzdGF0dXMpOwotCi0JcmV0dXJuIHN1Y2Nlc3M7Ci19Ci0KLXN0YXRpYyBpbnQgYWNwaV9lY19yZWFkKGludCBpLCB1OCAqcCkKLXsKLQlpbnQgdjsKLQotCWlmIChlY3JkX2hhbmRsZSkgewotCQlpZiAoIWFjcGlfZXZhbGYoZWNyZF9oYW5kbGUsICZ2LCBOVUxMLCAiZGQiLCBpKSkKLQkJCXJldHVybiAwOwotCQkqcCA9IHY7Ci0JfSBlbHNlIHsKLQkJaWYgKGVjX3JlYWQoaSwgcCkgPCAwKQotCQkJcmV0dXJuIDA7Ci0JfQotCi0JcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbnQgYWNwaV9lY193cml0ZShpbnQgaSwgdTggdikKLXsKLQlpZiAoZWN3cl9oYW5kbGUpIHsKLQkJaWYgKCFhY3BpX2V2YWxmKGVjd3JfaGFuZGxlLCBOVUxMLCBOVUxMLCAidmRkIiwgaSwgdikpCi0JCQlyZXR1cm4gMDsKLQl9IGVsc2UgewotCQlpZiAoZWNfd3JpdGUoaSwgdikgPCAwKQotCQkJcmV0dXJuIDA7Ci0JfQotCi0JcmV0dXJuIDE7Ci19Ci0KLSNpZiBkZWZpbmVkKENPTkZJR19USElOS1BBRF9BQ1BJX0RPQ0spIHx8IGRlZmluZWQoQ09ORklHX1RISU5LUEFEX0FDUElfQkFZKQotc3RhdGljIGludCBfc3RhKGFjcGlfaGFuZGxlIGhhbmRsZSkKLXsKLQlpbnQgc3RhdHVzOwotCi0JaWYgKCFoYW5kbGUgfHwgIWFjcGlfZXZhbGYoaGFuZGxlLCAmc3RhdHVzLCAiX1NUQSIsICJkIikpCi0JCXN0YXR1cyA9IDA7Ci0KLQlyZXR1cm4gc3RhdHVzOwotfQotI2VuZGlmCi0KLXN0YXRpYyBpbnQgaXNzdWVfdGhpbmtwYWRfY21vc19jb21tYW5kKGludCBjbW9zX2NtZCkKLXsKLQlpZiAoIWNtb3NfaGFuZGxlKQotCQlyZXR1cm4gLUVOWElPOwotCi0JaWYgKCFhY3BpX2V2YWxmKGNtb3NfaGFuZGxlLCBOVUxMLCBOVUxMLCAidmQiLCBjbW9zX2NtZCkpCi0JCXJldHVybiAtRUlPOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBBQ1BJIGRldmljZSBtb2RlbAotICovCi0KLSNkZWZpbmUgVFBBQ1BJX0FDUElIQU5ETEVfSU5JVChvYmplY3QpIFwKLQlkcnZfYWNwaV9oYW5kbGVfaW5pdCgjb2JqZWN0LCAmb2JqZWN0IyNfaGFuZGxlLCAqb2JqZWN0IyNfcGFyZW50LCBcCi0JCW9iamVjdCMjX3BhdGhzLCBBUlJBWV9TSVpFKG9iamVjdCMjX3BhdGhzKSwgJm9iamVjdCMjX3BhdGgpCi0KLXN0YXRpYyB2b2lkIGRydl9hY3BpX2hhbmRsZV9pbml0KGNoYXIgKm5hbWUsCi0JCQkgICBhY3BpX2hhbmRsZSAqaGFuZGxlLCBhY3BpX2hhbmRsZSBwYXJlbnQsCi0JCQkgICBjaGFyICoqcGF0aHMsIGludCBudW1fcGF0aHMsIGNoYXIgKipwYXRoKQotewotCWludCBpOwotCWFjcGlfc3RhdHVzIHN0YXR1czsKLQotCXZkYmdfcHJpbnRrKFRQQUNQSV9EQkdfSU5JVCwgInRyeWluZyB0byBsb2NhdGUgQUNQSSBoYW5kbGUgZm9yICVzXG4iLAotCQluYW1lKTsKLQotCWZvciAoaSA9IDA7IGkgPCBudW1fcGF0aHM7IGkrKykgewotCQlzdGF0dXMgPSBhY3BpX2dldF9oYW5kbGUocGFyZW50LCBwYXRoc1tpXSwgaGFuZGxlKTsKLQkJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKSB7Ci0JCQkqcGF0aCA9IHBhdGhzW2ldOwotCQkJZGJnX3ByaW50ayhUUEFDUElfREJHX0lOSVQsCi0JCQkJICAgIkZvdW5kIEFDUEkgaGFuZGxlICVzIGZvciAlc1xuIiwKLQkJCQkgICAqcGF0aCwgbmFtZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0KLQl2ZGJnX3ByaW50ayhUUEFDUElfREJHX0lOSVQsICJBQ1BJIGhhbmRsZSBmb3IgJXMgbm90IGZvdW5kXG4iLAotCQkgICAgbmFtZSk7Ci0JKmhhbmRsZSA9IE5VTEw7Ci19Ci0KLXN0YXRpYyB2b2lkIGRpc3BhdGNoX2FjcGlfbm90aWZ5KGFjcGlfaGFuZGxlIGhhbmRsZSwgdTMyIGV2ZW50LCB2b2lkICpkYXRhKQotewotCXN0cnVjdCBpYm1fc3RydWN0ICppYm0gPSBkYXRhOwotCi0JaWYgKHRwYWNwaV9saWZlY3ljbGUgIT0gVFBBQ1BJX0xJRkVfUlVOTklORykKLQkJcmV0dXJuOwotCi0JaWYgKCFpYm0gfHwgIWlibS0+YWNwaSB8fCAhaWJtLT5hY3BpLT5ub3RpZnkpCi0JCXJldHVybjsKLQotCWlibS0+YWNwaS0+bm90aWZ5KGlibSwgZXZlbnQpOwotfQotCi1zdGF0aWMgaW50IF9faW5pdCBzZXR1cF9hY3BpX25vdGlmeShzdHJ1Y3QgaWJtX3N0cnVjdCAqaWJtKQotewotCWFjcGlfc3RhdHVzIHN0YXR1czsKLQlpbnQgcmM7Ci0KLQlCVUdfT04oIWlibS0+YWNwaSk7Ci0KLQlpZiAoISppYm0tPmFjcGktPmhhbmRsZSkKLQkJcmV0dXJuIDA7Ci0KLQl2ZGJnX3ByaW50ayhUUEFDUElfREJHX0lOSVQsCi0JCSJzZXR0aW5nIHVwIEFDUEkgbm90aWZ5IGZvciAlc1xuIiwgaWJtLT5uYW1lKTsKLQotCXJjID0gYWNwaV9idXNfZ2V0X2RldmljZSgqaWJtLT5hY3BpLT5oYW5kbGUsICZpYm0tPmFjcGktPmRldmljZSk7Ci0JaWYgKHJjIDwgMCkgewotCQlwcmludGsoVFBBQ1BJX0VSUiAiYWNwaV9idXNfZ2V0X2RldmljZSglcykgZmFpbGVkOiAlZFxuIiwKLQkJCWlibS0+bmFtZSwgcmMpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0KLQlpYm0tPmFjcGktPmRldmljZS0+ZHJpdmVyX2RhdGEgPSBpYm07Ci0Jc3ByaW50ZihhY3BpX2RldmljZV9jbGFzcyhpYm0tPmFjcGktPmRldmljZSksICIlcy8lcyIsCi0JCVRQQUNQSV9BQ1BJX0VWRU5UX1BSRUZJWCwKLQkJaWJtLT5uYW1lKTsKLQotCXN0YXR1cyA9IGFjcGlfaW5zdGFsbF9ub3RpZnlfaGFuZGxlcigqaWJtLT5hY3BpLT5oYW5kbGUsCi0JCQlpYm0tPmFjcGktPnR5cGUsIGRpc3BhdGNoX2FjcGlfbm90aWZ5LCBpYm0pOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlpZiAoc3RhdHVzID09IEFFX0FMUkVBRFlfRVhJU1RTKSB7Ci0JCQlwcmludGsoVFBBQ1BJX05PVElDRQotCQkJICAgICAgICJhbm90aGVyIGRldmljZSBkcml2ZXIgaXMgYWxyZWFkeSAiCi0JCQkgICAgICAgImhhbmRsaW5nICVzIGV2ZW50c1xuIiwgaWJtLT5uYW1lKTsKLQkJfSBlbHNlIHsKLQkJCXByaW50ayhUUEFDUElfRVJSCi0JCQkgICAgICAgImFjcGlfaW5zdGFsbF9ub3RpZnlfaGFuZGxlciglcykgZmFpbGVkOiAlZFxuIiwKLQkJCSAgICAgICBpYm0tPm5hbWUsIHN0YXR1cyk7Ci0JCX0KLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCWlibS0+ZmxhZ3MuYWNwaV9ub3RpZnlfaW5zdGFsbGVkID0gMTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBfX2luaXQgdHBhY3BpX2RldmljZV9hZGQoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgX19pbml0IHJlZ2lzdGVyX3RwYWNwaV9zdWJkcml2ZXIoc3RydWN0IGlibV9zdHJ1Y3QgKmlibSkKLXsKLQlpbnQgcmM7Ci0KLQlkYmdfcHJpbnRrKFRQQUNQSV9EQkdfSU5JVCwKLQkJInJlZ2lzdGVyaW5nICVzIGFzIGFuIEFDUEkgZHJpdmVyXG4iLCBpYm0tPm5hbWUpOwotCi0JQlVHX09OKCFpYm0tPmFjcGkpOwotCi0JaWJtLT5hY3BpLT5kcml2ZXIgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYWNwaV9kcml2ZXIpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWlibS0+YWNwaS0+ZHJpdmVyKSB7Ci0JCXByaW50ayhUUEFDUElfRVJSCi0JCSAgICAgICAiZmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgaWJtLT5hY3BpLT5kcml2ZXJcbiIpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQlzcHJpbnRmKGlibS0+YWNwaS0+ZHJpdmVyLT5uYW1lLCAiJXNfJXMiLCBUUEFDUElfTkFNRSwgaWJtLT5uYW1lKTsKLQlpYm0tPmFjcGktPmRyaXZlci0+aWRzID0gaWJtLT5hY3BpLT5oaWQ7Ci0KLQlpYm0tPmFjcGktPmRyaXZlci0+b3BzLmFkZCA9ICZ0cGFjcGlfZGV2aWNlX2FkZDsKLQotCXJjID0gYWNwaV9idXNfcmVnaXN0ZXJfZHJpdmVyKGlibS0+YWNwaS0+ZHJpdmVyKTsKLQlpZiAocmMgPCAwKSB7Ci0JCXByaW50ayhUUEFDUElfRVJSICJhY3BpX2J1c19yZWdpc3Rlcl9kcml2ZXIoJXMpIGZhaWxlZDogJWRcbiIsCi0JCSAgICAgICBpYm0tPm5hbWUsIHJjKTsKLQkJa2ZyZWUoaWJtLT5hY3BpLT5kcml2ZXIpOwotCQlpYm0tPmFjcGktPmRyaXZlciA9IE5VTEw7Ci0JfSBlbHNlIGlmICghcmMpCi0JCWlibS0+ZmxhZ3MuYWNwaV9kcml2ZXJfcmVnaXN0ZXJlZCA9IDE7Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogUHJvY2ZzIEhlbHBlcnMKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyBpbnQgZGlzcGF0Y2hfcHJvY2ZzX3JlYWQoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmYsCi0JCQlpbnQgY291bnQsIGludCAqZW9mLCB2b2lkICpkYXRhKQotewotCXN0cnVjdCBpYm1fc3RydWN0ICppYm0gPSBkYXRhOwotCWludCBsZW47Ci0KLQlpZiAoIWlibSB8fCAhaWJtLT5yZWFkKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWxlbiA9IGlibS0+cmVhZChwYWdlKTsKLQlpZiAobGVuIDwgMCkKLQkJcmV0dXJuIGxlbjsKLQotCWlmIChsZW4gPD0gb2ZmICsgY291bnQpCi0JCSplb2YgPSAxOwotCSpzdGFydCA9IHBhZ2UgKyBvZmY7Ci0JbGVuIC09IG9mZjsKLQlpZiAobGVuID4gY291bnQpCi0JCWxlbiA9IGNvdW50OwotCWlmIChsZW4gPCAwKQotCQlsZW4gPSAwOwotCi0JcmV0dXJuIGxlbjsKLX0KLQotc3RhdGljIGludCBkaXNwYXRjaF9wcm9jZnNfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsCi0JCQljb25zdCBjaGFyIF9fdXNlciAqdXNlcmJ1ZiwKLQkJCXVuc2lnbmVkIGxvbmcgY291bnQsIHZvaWQgKmRhdGEpCi17Ci0Jc3RydWN0IGlibV9zdHJ1Y3QgKmlibSA9IGRhdGE7Ci0JY2hhciAqa2VybmJ1ZjsKLQlpbnQgcmV0OwotCi0JaWYgKCFpYm0gfHwgIWlibS0+d3JpdGUpCi0JCXJldHVybiAtRUlOVkFMOwotCi0Ja2VybmJ1ZiA9IGttYWxsb2MoY291bnQgKyAyLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWtlcm5idWYpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JaWYgKGNvcHlfZnJvbV91c2VyKGtlcm5idWYsIHVzZXJidWYsIGNvdW50KSkgewotCQlrZnJlZShrZXJuYnVmKTsKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JfQotCi0Ja2VybmJ1Zltjb3VudF0gPSAwOwotCXN0cmNhdChrZXJuYnVmLCAiLCIpOwotCXJldCA9IGlibS0+d3JpdGUoa2VybmJ1Zik7Ci0JaWYgKHJldCA9PSAwKQotCQlyZXQgPSBjb3VudDsKLQotCWtmcmVlKGtlcm5idWYpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGNoYXIgKm5leHRfY21kKGNoYXIgKipjbWRzKQotewotCWNoYXIgKnN0YXJ0ID0gKmNtZHM7Ci0JY2hhciAqZW5kOwotCi0Jd2hpbGUgKChlbmQgPSBzdHJjaHIoc3RhcnQsICcsJykpICYmIGVuZCA9PSBzdGFydCkKLQkJc3RhcnQgPSBlbmQgKyAxOwotCi0JaWYgKCFlbmQpCi0JCXJldHVybiBOVUxMOwotCi0JKmVuZCA9IDA7Ci0JKmNtZHMgPSBlbmQgKyAxOwotCXJldHVybiBzdGFydDsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBEZXZpY2UgbW9kZWw6IGlucHV0LCBod21vbiBhbmQgcGxhdGZvcm0KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICp0cGFjcGlfcGRldjsKLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICp0cGFjcGlfc2Vuc29yc19wZGV2Owotc3RhdGljIHN0cnVjdCBkZXZpY2UgKnRwYWNwaV9od21vbjsKLXN0YXRpYyBzdHJ1Y3QgaW5wdXRfZGV2ICp0cGFjcGlfaW5wdXRkZXY7Ci1zdGF0aWMgc3RydWN0IG11dGV4IHRwYWNwaV9pbnB1dGRldl9zZW5kX211dGV4Owotc3RhdGljIExJU1RfSEVBRCh0cGFjcGlfYWxsX2RyaXZlcnMpOwotCi1zdGF0aWMgaW50IHRwYWNwaV9zdXNwZW5kX2hhbmRsZXIoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKLQkJCQkgIHBtX21lc3NhZ2VfdCBzdGF0ZSkKLXsKLQlzdHJ1Y3QgaWJtX3N0cnVjdCAqaWJtLCAqaXRtcDsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShpYm0sIGl0bXAsCi0JCQkJICZ0cGFjcGlfYWxsX2RyaXZlcnMsCi0JCQkJIGFsbF9kcml2ZXJzKSB7Ci0JCWlmIChpYm0tPnN1c3BlbmQpCi0JCQkoaWJtLT5zdXNwZW5kKShzdGF0ZSk7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdHBhY3BpX3Jlc3VtZV9oYW5kbGVyKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0Jc3RydWN0IGlibV9zdHJ1Y3QgKmlibSwgKml0bXA7Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoaWJtLCBpdG1wLAotCQkJCSAmdHBhY3BpX2FsbF9kcml2ZXJzLAotCQkJCSBhbGxfZHJpdmVycykgewotCQlpZiAoaWJtLT5yZXN1bWUpCi0JCQkoaWJtLT5yZXN1bWUpKCk7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHRwYWNwaV9wZHJpdmVyID0gewotCS5kcml2ZXIgPSB7Ci0JCS5uYW1lID0gVFBBQ1BJX0RSVlJfTkFNRSwKLQkJLm93bmVyID0gVEhJU19NT0RVTEUsCi0JfSwKLQkuc3VzcGVuZCA9IHRwYWNwaV9zdXNwZW5kX2hhbmRsZXIsCi0JLnJlc3VtZSA9IHRwYWNwaV9yZXN1bWVfaGFuZGxlciwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHRwYWNwaV9od21vbl9wZHJpdmVyID0gewotCS5kcml2ZXIgPSB7Ci0JCS5uYW1lID0gVFBBQ1BJX0hXTU9OX0RSVlJfTkFNRSwKLQkJLm93bmVyID0gVEhJU19NT0RVTEUsCi0JfSwKLX07Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzeXNmcyBzdXBwb3J0IGhlbHBlcnMKLSAqLwotCi1zdHJ1Y3QgYXR0cmlidXRlX3NldCB7Ci0JdW5zaWduZWQgaW50IG1lbWJlcnMsIG1heF9tZW1iZXJzOwotCXN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgZ3JvdXA7Ci19OwotCi1zdHJ1Y3QgYXR0cmlidXRlX3NldF9vYmogewotCXN0cnVjdCBhdHRyaWJ1dGVfc2V0IHM7Ci0Jc3RydWN0IGF0dHJpYnV0ZSAqYTsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0KLXN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX3NldCAqY3JlYXRlX2F0dHJfc2V0KHVuc2lnbmVkIGludCBtYXhfbWVtYmVycywKLQkJCQkJCWNvbnN0IGNoYXIgKm5hbWUpCi17Ci0Jc3RydWN0IGF0dHJpYnV0ZV9zZXRfb2JqICpzb2JqOwotCi0JaWYgKG1heF9tZW1iZXJzID09IDApCi0JCXJldHVybiBOVUxMOwotCi0JLyogQWxsb2NhdGVzIHNwYWNlIGZvciBpbXBsaWNpdCBOVUxMIGF0IHRoZSBlbmQgdG9vICovCi0Jc29iaiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBhdHRyaWJ1dGVfc2V0X29iaikgKwotCQkgICAgbWF4X21lbWJlcnMgKiBzaXplb2Yoc3RydWN0IGF0dHJpYnV0ZSAqKSwKLQkJICAgIEdGUF9LRVJORUwpOwotCWlmICghc29iaikKLQkJcmV0dXJuIE5VTEw7Ci0Jc29iai0+cy5tYXhfbWVtYmVycyA9IG1heF9tZW1iZXJzOwotCXNvYmotPnMuZ3JvdXAuYXR0cnMgPSAmc29iai0+YTsKLQlzb2JqLT5zLmdyb3VwLm5hbWUgPSBuYW1lOwotCi0JcmV0dXJuICZzb2JqLT5zOwotfQotCi0jZGVmaW5lIGRlc3Ryb3lfYXR0cl9zZXQoX3NldCkgXAotCWtmcmVlKF9zZXQpOwotCi0vKiBub3QgbXVsdGktdGhyZWFkZWQgc2FmZSwgdXNlIGl0IGluIGEgc2luZ2xlIHRocmVhZCBwZXIgc2V0ICovCi1zdGF0aWMgaW50IGFkZF90b19hdHRyX3NldChzdHJ1Y3QgYXR0cmlidXRlX3NldCAqcywgc3RydWN0IGF0dHJpYnV0ZSAqYXR0cikKLXsKLQlpZiAoIXMgfHwgIWF0dHIpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKHMtPm1lbWJlcnMgPj0gcy0+bWF4X21lbWJlcnMpCi0JCXJldHVybiAtRU5PTUVNOwotCi0Jcy0+Z3JvdXAuYXR0cnNbcy0+bWVtYmVyc10gPSBhdHRyOwotCXMtPm1lbWJlcnMrKzsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGFkZF9tYW55X3RvX2F0dHJfc2V0KHN0cnVjdCBhdHRyaWJ1dGVfc2V0ICpzLAotCQkJc3RydWN0IGF0dHJpYnV0ZSAqKmF0dHIsCi0JCQl1bnNpZ25lZCBpbnQgY291bnQpCi17Ci0JaW50IGksIHJlczsKLQotCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0JCXJlcyA9IGFkZF90b19hdHRyX3NldChzLCBhdHRyW2ldKTsKLQkJaWYgKHJlcykKLQkJCXJldHVybiByZXM7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGRlbGV0ZV9hdHRyX3NldChzdHJ1Y3QgYXR0cmlidXRlX3NldCAqcywgc3RydWN0IGtvYmplY3QgKmtvYmopCi17Ci0Jc3lzZnNfcmVtb3ZlX2dyb3VwKGtvYmosICZzLT5ncm91cCk7Ci0JZGVzdHJveV9hdHRyX3NldChzKTsKLX0KLQotI2RlZmluZSByZWdpc3Rlcl9hdHRyX3NldF93aXRoX3N5c2ZzKF9hdHRyX3NldCwgX2tvYmopIFwKLQlzeXNmc19jcmVhdGVfZ3JvdXAoX2tvYmosICZfYXR0cl9zZXQtPmdyb3VwKQotCi1zdGF0aWMgaW50IHBhcnNlX3N0cnRvdWwoY29uc3QgY2hhciAqYnVmLAotCQl1bnNpZ25lZCBsb25nIG1heCwgdW5zaWduZWQgbG9uZyAqdmFsdWUpCi17Ci0JY2hhciAqZW5kcDsKLQotCXdoaWxlICgqYnVmICYmIGlzc3BhY2UoKmJ1ZikpCi0JCWJ1ZisrOwotCSp2YWx1ZSA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgJmVuZHAsIDApOwotCXdoaWxlICgqZW5kcCAmJiBpc3NwYWNlKCplbmRwKSkKLQkJZW5kcCsrOwotCWlmICgqZW5kcCB8fCAqdmFsdWUgPiBtYXgpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIHRwYWNwaV9kaXNhYmxlX2JyaWdodG5lc3NfZGVsYXkodm9pZCkKLXsKLQlpZiAoYWNwaV9ldmFsZihoa2V5X2hhbmRsZSwgTlVMTCwgIlBXTVMiLCAicXZkIiwgMCkpCi0JCXByaW50ayhUUEFDUElfTk9USUNFCi0JCQkiQUNQSSBiYWNrbGlnaHQgY29udHJvbCBkZWxheSBkaXNhYmxlZFxuIik7Ci19Ci0KLXN0YXRpYyBpbnQgX19pbml0IHRwYWNwaV9xdWVyeV9iY2xfbGV2ZWxzKGFjcGlfaGFuZGxlIGhhbmRsZSkKLXsKLQlzdHJ1Y3QgYWNwaV9idWZmZXIgYnVmZmVyID0geyBBQ1BJX0FMTE9DQVRFX0JVRkZFUiwgTlVMTCB9OwotCXVuaW9uIGFjcGlfb2JqZWN0ICpvYmo7Ci0JaW50IHJjOwotCi0JaWYgKEFDUElfU1VDQ0VTUyhhY3BpX2V2YWx1YXRlX29iamVjdChoYW5kbGUsIE5VTEwsIE5VTEwsICZidWZmZXIpKSkgewotCQlvYmogPSAodW5pb24gYWNwaV9vYmplY3QgKilidWZmZXIucG9pbnRlcjsKLQkJaWYgKCFvYmogfHwgKG9iai0+dHlwZSAhPSBBQ1BJX1RZUEVfUEFDS0FHRSkpIHsKLQkJCXByaW50ayhUUEFDUElfRVJSICJVbmtub3duIF9CQ0wgZGF0YSwgIgotCQkJICAgICAgICJwbGVhc2UgcmVwb3J0IHRoaXMgdG8gJXNcbiIsIFRQQUNQSV9NQUlMKTsKLQkJCXJjID0gMDsKLQkJfSBlbHNlIHsKLQkJCXJjID0gb2JqLT5wYWNrYWdlLmNvdW50OwotCQl9Ci0JfSBlbHNlIHsKLQkJcmV0dXJuIDA7Ci0JfQotCi0Ja2ZyZWUoYnVmZmVyLnBvaW50ZXIpOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGFjcGlfc3RhdHVzIF9faW5pdCB0cGFjcGlfYWNwaV93YWxrX2ZpbmRfYmNsKGFjcGlfaGFuZGxlIGhhbmRsZSwKLQkJCQkJdTMyIGx2bCwgdm9pZCAqY29udGV4dCwgdm9pZCAqKnJ2KQotewotCWNoYXIgbmFtZVtBQ1BJX1BBVEhfU0VHTUVOVF9MRU5HVEhdOwotCXN0cnVjdCBhY3BpX2J1ZmZlciBidWZmZXIgPSB7IHNpemVvZihuYW1lKSwgJm5hbWUgfTsKLQotCWlmIChBQ1BJX1NVQ0NFU1MoYWNwaV9nZXRfbmFtZShoYW5kbGUsIEFDUElfU0lOR0xFX05BTUUsICZidWZmZXIpKSAmJgotCSAgICAhc3RybmNtcCgiX0JDTCIsIG5hbWUsIHNpemVvZihuYW1lKSAtIDEpKSB7Ci0JCUJVR19PTighcnYgfHwgISpydik7Ci0JCSoqKGludCAqKilydiA9IHRwYWNwaV9xdWVyeV9iY2xfbGV2ZWxzKGhhbmRsZSk7Ci0JCXJldHVybiBBRV9DVFJMX1RFUk1JTkFURTsKLQl9IGVsc2UgewotCQlyZXR1cm4gQUVfT0s7Ci0JfQotfQotCi0vKgotICogUmV0dXJucyAwIChubyBBQ1BJIF9CQ0wgb3IgX0JDTCBpbnZhbGlkKSwgb3Igc2l6ZSBvZiBicmlnaHRuZXNzIG1hcAotICovCi1zdGF0aWMgaW50IF9faW5pdCB0cGFjcGlfY2hlY2tfc3RkX2FjcGlfYnJpZ2h0bmVzc19zdXBwb3J0KHZvaWQpCi17Ci0JaW50IHN0YXR1czsKLQlpbnQgYmNsX2xldmVscyA9IDA7Ci0Jdm9pZCAqYmNsX3B0ciA9ICZiY2xfbGV2ZWxzOwotCi0JaWYgKCF2aWRfaGFuZGxlKSB7Ci0JCVRQQUNQSV9BQ1BJSEFORExFX0lOSVQodmlkKTsKLQl9Ci0JaWYgKCF2aWRfaGFuZGxlKQotCQlyZXR1cm4gMDsKLQotCS8qCi0JICogU2VhcmNoIGZvciBhIF9CQ0wgbWV0aG9kLCBhbmQgZXhlY3V0ZSBpdC4gIFRoaXMgaXMgc2FmZSBvbiBhbGwKLQkgKiBUaGlua1BhZHMsIGFuZCBhcyBhIHNpZGUtZWZmZWN0LCBfQkNMIHdpbGwgcGxhY2UgYSBMZW5vdm8gVmlzdGEKLQkgKiBCSU9TIGluIEFDUEkgYmFja2xpZ2h0IGNvbnRyb2wgbW9kZS4gIFdlIGRvIE5PVCBoYXZlIHRvIGNhcmUKLQkgKiBhYm91dCBjYWxsaW5nIHRoZSBfQkNMIG1ldGhvZCBpbiBhbiBlbmFibGVkIHZpZGVvIGRldmljZSwgYW55Ci0JICogd2lsbCBkbyBmb3Igb3VyIHB1cnBvc2VzLgotCSAqLwotCi0Jc3RhdHVzID0gYWNwaV93YWxrX25hbWVzcGFjZShBQ1BJX1RZUEVfTUVUSE9ELCB2aWRfaGFuZGxlLCAzLAotCQkJCSAgICAgdHBhY3BpX2FjcGlfd2Fsa19maW5kX2JjbCwgTlVMTCwKLQkJCQkgICAgICZiY2xfcHRyKTsKLQotCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSAmJiBiY2xfbGV2ZWxzID4gMikgewotCQl0cF9mZWF0dXJlcy5icmlnaHRfYWNwaW1vZGUgPSAxOwotCQlyZXR1cm4gKGJjbF9sZXZlbHMgLSAyKTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBfX2luaXQgdHBhY3BpX25ld19yZmtpbGwoY29uc3QgdW5zaWduZWQgaW50IGlkLAotCQkJc3RydWN0IHJma2lsbCAqKnJmaywKLQkJCWNvbnN0IGVudW0gcmZraWxsX3R5cGUgcmZrdHlwZSwKLQkJCWNvbnN0IGNoYXIgKm5hbWUsCi0JCQlpbnQgKCp0b2dnbGVfcmFkaW8pKHZvaWQgKiwgZW51bSByZmtpbGxfc3RhdGUpLAotCQkJaW50ICgqZ2V0X3N0YXRlKSh2b2lkICosIGVudW0gcmZraWxsX3N0YXRlICopKQotewotCWludCByZXM7Ci0JZW51bSByZmtpbGxfc3RhdGUgaW5pdGlhbF9zdGF0ZTsKLQotCSpyZmsgPSByZmtpbGxfYWxsb2NhdGUoJnRwYWNwaV9wZGV2LT5kZXYsIHJma3R5cGUpOwotCWlmICghKnJmaykgewotCQlwcmludGsoVFBBQ1BJX0VSUgotCQkJImZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIHJma2lsbCBjbGFzc1xuIik7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCSgqcmZrKS0+bmFtZSA9IG5hbWU7Ci0JKCpyZmspLT5nZXRfc3RhdGUgPSBnZXRfc3RhdGU7Ci0JKCpyZmspLT50b2dnbGVfcmFkaW8gPSB0b2dnbGVfcmFkaW87Ci0KLQlpZiAoIWdldF9zdGF0ZShOVUxMLCAmaW5pdGlhbF9zdGF0ZSkpCi0JCSgqcmZrKS0+c3RhdGUgPSBpbml0aWFsX3N0YXRlOwotCi0JcmVzID0gcmZraWxsX3JlZ2lzdGVyKCpyZmspOwotCWlmIChyZXMgPCAwKSB7Ci0JCXByaW50ayhUUEFDUElfRVJSCi0JCQkiZmFpbGVkIHRvIHJlZ2lzdGVyICVzIHJma2lsbCBzd2l0Y2g6ICVkXG4iLAotCQkJbmFtZSwgcmVzKTsKLQkJcmZraWxsX2ZyZWUoKnJmayk7Ci0JCSpyZmsgPSBOVUxMOwotCQlyZXR1cm4gcmVzOwotCX0KLQotCXJldHVybiAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogdGhpbmtwYWQtYWNwaSBkcml2ZXIgYXR0cmlidXRlcwotICovCi0KLS8qIGludGVyZmFjZV92ZXJzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotc3RhdGljIHNzaXplX3QgdHBhY3BpX2RyaXZlcl9pbnRlcmZhY2VfdmVyc2lvbl9zaG93KAotCQkJCXN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcnYsCi0JCQkJY2hhciAqYnVmKQotewotCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIjB4JTA4eFxuIiwgVFBBQ1BJX1NZU0ZTX1ZFUlNJT04pOwotfQotCi1zdGF0aWMgRFJJVkVSX0FUVFIoaW50ZXJmYWNlX3ZlcnNpb24sIFNfSVJVR08sCi0JCXRwYWNwaV9kcml2ZXJfaW50ZXJmYWNlX3ZlcnNpb25fc2hvdywgTlVMTCk7Ci0KLS8qIGRlYnVnX2xldmVsIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotc3RhdGljIHNzaXplX3QgdHBhY3BpX2RyaXZlcl9kZWJ1Z19zaG93KHN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcnYsCi0JCQkJCQljaGFyICpidWYpCi17Ci0JcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiMHglMDR4XG4iLCBkYmdfbGV2ZWwpOwotfQotCi1zdGF0aWMgc3NpemVfdCB0cGFjcGlfZHJpdmVyX2RlYnVnX3N0b3JlKHN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcnYsCi0JCQkJCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKLXsKLQl1bnNpZ25lZCBsb25nIHQ7Ci0KLQlpZiAocGFyc2Vfc3RydG91bChidWYsIDB4ZmZmZiwgJnQpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWRiZ19sZXZlbCA9IHQ7Ci0KLQlyZXR1cm4gY291bnQ7Ci19Ci0KLXN0YXRpYyBEUklWRVJfQVRUUihkZWJ1Z19sZXZlbCwgU19JV1VTUiB8IFNfSVJVR08sCi0JCXRwYWNwaV9kcml2ZXJfZGVidWdfc2hvdywgdHBhY3BpX2RyaXZlcl9kZWJ1Z19zdG9yZSk7Ci0KLS8qIHZlcnNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotc3RhdGljIHNzaXplX3QgdHBhY3BpX2RyaXZlcl92ZXJzaW9uX3Nob3coc3RydWN0IGRldmljZV9kcml2ZXIgKmRydiwKLQkJCQkJCWNoYXIgKmJ1ZikKLXsKLQlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlcyB2JXNcbiIsCi0JCQlUUEFDUElfREVTQywgVFBBQ1BJX1ZFUlNJT04pOwotfQotCi1zdGF0aWMgRFJJVkVSX0FUVFIodmVyc2lvbiwgU19JUlVHTywKLQkJdHBhY3BpX2RyaXZlcl92ZXJzaW9uX3Nob3csIE5VTEwpOwotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotc3RhdGljIHN0cnVjdCBkcml2ZXJfYXR0cmlidXRlICp0cGFjcGlfZHJpdmVyX2F0dHJpYnV0ZXNbXSA9IHsKLQkmZHJpdmVyX2F0dHJfZGVidWdfbGV2ZWwsICZkcml2ZXJfYXR0cl92ZXJzaW9uLAotCSZkcml2ZXJfYXR0cl9pbnRlcmZhY2VfdmVyc2lvbiwKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IHRwYWNwaV9jcmVhdGVfZHJpdmVyX2F0dHJpYnV0ZXMoc3RydWN0IGRldmljZV9kcml2ZXIgKmRydikKLXsKLQlpbnQgaSwgcmVzOwotCi0JaSA9IDA7Ci0JcmVzID0gMDsKLQl3aGlsZSAoIXJlcyAmJiBpIDwgQVJSQVlfU0laRSh0cGFjcGlfZHJpdmVyX2F0dHJpYnV0ZXMpKSB7Ci0JCXJlcyA9IGRyaXZlcl9jcmVhdGVfZmlsZShkcnYsIHRwYWNwaV9kcml2ZXJfYXR0cmlidXRlc1tpXSk7Ci0JCWkrKzsKLQl9Ci0KLQlyZXR1cm4gcmVzOwotfQotCi1zdGF0aWMgdm9pZCB0cGFjcGlfcmVtb3ZlX2RyaXZlcl9hdHRyaWJ1dGVzKHN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcnYpCi17Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh0cGFjcGlfZHJpdmVyX2F0dHJpYnV0ZXMpOyBpKyspCi0JCWRyaXZlcl9yZW1vdmVfZmlsZShkcnYsIHRwYWNwaV9kcml2ZXJfYXR0cmlidXRlc1tpXSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIFN1YmRyaXZlcnMKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiB0aGlua3BhZC1hY3BpIGluaXQgc3ViZHJpdmVyCi0gKi8KLQotc3RhdGljIGludCBfX2luaXQgdGhpbmtwYWRfYWNwaV9kcml2ZXJfaW5pdChzdHJ1Y3QgaWJtX2luaXRfc3RydWN0ICppaWJtKQotewotCXByaW50ayhUUEFDUElfSU5GTyAiJXMgdiVzXG4iLCBUUEFDUElfREVTQywgVFBBQ1BJX1ZFUlNJT04pOwotCXByaW50ayhUUEFDUElfSU5GTyAiJXNcbiIsIFRQQUNQSV9VUkwpOwotCi0JcHJpbnRrKFRQQUNQSV9JTkZPICJUaGlua1BhZCBCSU9TICVzLCBFQyAlc1xuIiwKLQkJKHRoaW5rcGFkX2lkLmJpb3NfdmVyc2lvbl9zdHIpID8KLQkJCXRoaW5rcGFkX2lkLmJpb3NfdmVyc2lvbl9zdHIgOiAidW5rbm93biIsCi0JCSh0aGlua3BhZF9pZC5lY192ZXJzaW9uX3N0cikgPwotCQkJdGhpbmtwYWRfaWQuZWNfdmVyc2lvbl9zdHIgOiAidW5rbm93biIpOwotCi0JaWYgKHRoaW5rcGFkX2lkLnZlbmRvciAmJiB0aGlua3BhZF9pZC5tb2RlbF9zdHIpCi0JCXByaW50ayhUUEFDUElfSU5GTyAiJXMgJXMsIG1vZGVsICVzXG4iLAotCQkJKHRoaW5rcGFkX2lkLnZlbmRvciA9PSBQQ0lfVkVORE9SX0lEX0lCTSkgPwotCQkJCSJJQk0iIDogKCh0aGlua3BhZF9pZC52ZW5kb3IgPT0KLQkJCQkJCVBDSV9WRU5ET1JfSURfTEVOT1ZPKSA/Ci0JCQkJCSJMZW5vdm8iIDogIlVua25vd24gdmVuZG9yIiksCi0JCQl0aGlua3BhZF9pZC5tb2RlbF9zdHIsCi0JCQkodGhpbmtwYWRfaWQubnVtbW9kZWxfc3RyKSA/Ci0JCQkJdGhpbmtwYWRfaWQubnVtbW9kZWxfc3RyIDogInVua25vd24iKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHRoaW5rcGFkX2FjcGlfZHJpdmVyX3JlYWQoY2hhciAqcCkKLXsKLQlpbnQgbGVuID0gMDsKLQotCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICJkcml2ZXI6XHRcdCVzXG4iLCBUUEFDUElfREVTQyk7Ci0JbGVuICs9IHNwcmludGYocCArIGxlbiwgInZlcnNpb246XHQlc1xuIiwgVFBBQ1BJX1ZFUlNJT04pOwotCi0JcmV0dXJuIGxlbjsKLX0KLQotc3RhdGljIHN0cnVjdCBpYm1fc3RydWN0IHRoaW5rcGFkX2FjcGlfZHJpdmVyX2RhdGEgPSB7Ci0JLm5hbWUgPSAiZHJpdmVyIiwKLQkucmVhZCA9IHRoaW5rcGFkX2FjcGlfZHJpdmVyX3JlYWQsCi19OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogSG90a2V5IHN1YmRyaXZlcgotICovCi0KLWVudW0gewkvKiBob3Qga2V5IHNjYW4gY29kZXMgKGRlcml2ZWQgZnJvbSBBQ1BJIERTRFQpICovCi0JVFBfQUNQSV9IT1RLRVlTQ0FOX0ZORjEJCT0gMCwKLQlUUF9BQ1BJX0hPVEtFWVNDQU5fRk5GMiwKLQlUUF9BQ1BJX0hPVEtFWVNDQU5fRk5GMywKLQlUUF9BQ1BJX0hPVEtFWVNDQU5fRk5GNCwKLQlUUF9BQ1BJX0hPVEtFWVNDQU5fRk5GNSwKLQlUUF9BQ1BJX0hPVEtFWVNDQU5fRk5GNiwKLQlUUF9BQ1BJX0hPVEtFWVNDQU5fRk5GNywKLQlUUF9BQ1BJX0hPVEtFWVNDQU5fRk5GOCwKLQlUUF9BQ1BJX0hPVEtFWVNDQU5fRk5GOSwKLQlUUF9BQ1BJX0hPVEtFWVNDQU5fRk5GMTAsCi0JVFBfQUNQSV9IT1RLRVlTQ0FOX0ZORjExLAotCVRQX0FDUElfSE9US0VZU0NBTl9GTkYxMiwKLQlUUF9BQ1BJX0hPVEtFWVNDQU5fRk5CQUNLU1BBQ0UsCi0JVFBfQUNQSV9IT1RLRVlTQ0FOX0ZOSU5TRVJULAotCVRQX0FDUElfSE9US0VZU0NBTl9GTkRFTEVURSwKLQlUUF9BQ1BJX0hPVEtFWVNDQU5fRk5IT01FLAotCVRQX0FDUElfSE9US0VZU0NBTl9GTkVORCwKLQlUUF9BQ1BJX0hPVEtFWVNDQU5fRk5QQUdFVVAsCi0JVFBfQUNQSV9IT1RLRVlTQ0FOX0ZOUEFHRURPV04sCi0JVFBfQUNQSV9IT1RLRVlTQ0FOX0ZOU1BBQ0UsCi0JVFBfQUNQSV9IT1RLRVlTQ0FOX1ZPTFVNRVVQLAotCVRQX0FDUElfSE9US0VZU0NBTl9WT0xVTUVET1dOLAotCVRQX0FDUElfSE9US0VZU0NBTl9NVVRFLAotCVRQX0FDUElfSE9US0VZU0NBTl9USElOS1BBRCwKLX07Ci0KLWVudW0gewkvKiBLZXlzIGF2YWlsYWJsZSB0aHJvdWdoIE5WUkFNIHBvbGxpbmcgKi8KLQlUUEFDUElfSEtFWV9OVlJBTV9LTk9XTl9NQVNLID0gMHgwMGZiODhjMFUsCi0JVFBBQ1BJX0hLRVlfTlZSQU1fR09PRF9NQVNLICA9IDB4MDBmYjgwMDBVLAotfTsKLQotZW51bSB7CS8qIFBvc2l0aW9ucyBvZiBzb21lIG9mIHRoZSBrZXlzIGluIGhvdGtleSBtYXNrcyAqLwotCVRQX0FDUElfSEtFWV9ESVNQU1dUQ0hfTUFTSwk9IDEgPDwgVFBfQUNQSV9IT1RLRVlTQ0FOX0ZORjcsCi0JVFBfQUNQSV9IS0VZX0RJU1BYUEFORF9NQVNLCT0gMSA8PCBUUF9BQ1BJX0hPVEtFWVNDQU5fRk5GOCwKLQlUUF9BQ1BJX0hLRVlfSElCRVJOQVRFX01BU0sJPSAxIDw8IFRQX0FDUElfSE9US0VZU0NBTl9GTkYxMiwKLQlUUF9BQ1BJX0hLRVlfQlJHSFRVUF9NQVNLCT0gMSA8PCBUUF9BQ1BJX0hPVEtFWVNDQU5fRk5IT01FLAotCVRQX0FDUElfSEtFWV9CUkdIVERXTl9NQVNLCT0gMSA8PCBUUF9BQ1BJX0hPVEtFWVNDQU5fRk5FTkQsCi0JVFBfQUNQSV9IS0VZX1RITktMR0hUX01BU0sJPSAxIDw8IFRQX0FDUElfSE9US0VZU0NBTl9GTlBBR0VVUCwKLQlUUF9BQ1BJX0hLRVlfWk9PTV9NQVNLCQk9IDEgPDwgVFBfQUNQSV9IT1RLRVlTQ0FOX0ZOU1BBQ0UsCi0JVFBfQUNQSV9IS0VZX1ZPTFVQX01BU0sJCT0gMSA8PCBUUF9BQ1BJX0hPVEtFWVNDQU5fVk9MVU1FVVAsCi0JVFBfQUNQSV9IS0VZX1ZPTERXTl9NQVNLCT0gMSA8PCBUUF9BQ1BJX0hPVEtFWVNDQU5fVk9MVU1FRE9XTiwKLQlUUF9BQ1BJX0hLRVlfTVVURV9NQVNLCQk9IDEgPDwgVFBfQUNQSV9IT1RLRVlTQ0FOX01VVEUsCi0JVFBfQUNQSV9IS0VZX1RISU5LUEFEX01BU0sJPSAxIDw8IFRQX0FDUElfSE9US0VZU0NBTl9USElOS1BBRCwKLX07Ci0KLWVudW0gewkvKiBOVlJBTSB0byBBQ1BJIEhLRVkgZ3JvdXAgbWFwICovCi0JVFBfTlZSQU1fSEtFWV9HUk9VUF9ISzIJCT0gVFBfQUNQSV9IS0VZX1RISU5LUEFEX01BU0sgfAotCQkJCQkgIFRQX0FDUElfSEtFWV9aT09NX01BU0sgfAotCQkJCQkgIFRQX0FDUElfSEtFWV9ESVNQU1dUQ0hfTUFTSyB8Ci0JCQkJCSAgVFBfQUNQSV9IS0VZX0hJQkVSTkFURV9NQVNLLAotCVRQX05WUkFNX0hLRVlfR1JPVVBfQlJJR0hUTkVTUwk9IFRQX0FDUElfSEtFWV9CUkdIVFVQX01BU0sgfAotCQkJCQkgIFRQX0FDUElfSEtFWV9CUkdIVERXTl9NQVNLLAotCVRQX05WUkFNX0hLRVlfR1JPVVBfVk9MVU1FCT0gVFBfQUNQSV9IS0VZX1ZPTFVQX01BU0sgfAotCQkJCQkgIFRQX0FDUElfSEtFWV9WT0xEV05fTUFTSyB8Ci0JCQkJCSAgVFBfQUNQSV9IS0VZX01VVEVfTUFTSywKLX07Ci0KLSNpZmRlZiBDT05GSUdfVEhJTktQQURfQUNQSV9IT1RLRVlfUE9MTAotc3RydWN0IHRwX252cmFtX3N0YXRlIHsKLSAgICAgICB1MTYgdGhpbmtwYWRfdG9nZ2xlOjE7Ci0gICAgICAgdTE2IHpvb21fdG9nZ2xlOjE7Ci0gICAgICAgdTE2IGRpc3BsYXlfdG9nZ2xlOjE7Ci0gICAgICAgdTE2IHRoaW5rbGlnaHRfdG9nZ2xlOjE7Ci0gICAgICAgdTE2IGhpYmVybmF0ZV90b2dnbGU6MTsKLSAgICAgICB1MTYgZGlzcGxheWV4cF90b2dnbGU6MTsKLSAgICAgICB1MTYgZGlzcGxheV9zdGF0ZToxOwotICAgICAgIHUxNiBicmlnaHRuZXNzX3RvZ2dsZToxOwotICAgICAgIHUxNiB2b2x1bWVfdG9nZ2xlOjE7Ci0gICAgICAgdTE2IG11dGU6MTsKLQotICAgICAgIHU4IGJyaWdodG5lc3NfbGV2ZWw7Ci0gICAgICAgdTggdm9sdW1lX2xldmVsOwotfTsKLQotc3RhdGljIHN0cnVjdCB0YXNrX3N0cnVjdCAqdHBhY3BpX2hvdGtleV90YXNrOwotc3RhdGljIHUzMiBob3RrZXlfc291cmNlX21hc2s7CQkvKiBiaXQgbWFzayAwPUFDUEksMT1OVlJBTSAqLwotc3RhdGljIGludCBob3RrZXlfcG9sbF9mcmVxID0gMTA7CS8qIEh6ICovCi1zdGF0aWMgc3RydWN0IG11dGV4IGhvdGtleV90aHJlYWRfbXV0ZXg7Ci1zdGF0aWMgc3RydWN0IG11dGV4IGhvdGtleV90aHJlYWRfZGF0YV9tdXRleDsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgaG90a2V5X2NvbmZpZ19jaGFuZ2U7Ci0KLSNlbHNlIC8qIENPTkZJR19USElOS1BBRF9BQ1BJX0hPVEtFWV9QT0xMICovCi0KLSNkZWZpbmUgaG90a2V5X3NvdXJjZV9tYXNrIDBVCi0KLSNlbmRpZiAvKiBDT05GSUdfVEhJTktQQURfQUNQSV9IT1RLRVlfUE9MTCAqLwotCi1zdGF0aWMgc3RydWN0IG11dGV4IGhvdGtleV9tdXRleDsKLQotc3RhdGljIGVudW0gewkvKiBSZWFzb25zIGZvciB3YWtpbmcgdXAgKi8KLQlUUF9BQ1BJX1dBS0VVUF9OT05FID0gMCwJLyogTm9uZSBvciB1bmtub3duICovCi0JVFBfQUNQSV9XQUtFVVBfQkFZRUosCQkvKiBCYXkgZWplY3Rpb24gcmVxdWVzdCAqLwotCVRQX0FDUElfV0FLRVVQX1VORE9DSywJCS8qIFVuZG9jayByZXF1ZXN0ICovCi19IGhvdGtleV93YWtldXBfcmVhc29uOwotCi1zdGF0aWMgaW50IGhvdGtleV9hdXRvc2xlZXBfYWNrOwotCi1zdGF0aWMgaW50IGhvdGtleV9vcmlnX3N0YXR1czsKLXN0YXRpYyB1MzIgaG90a2V5X29yaWdfbWFzazsKLXN0YXRpYyB1MzIgaG90a2V5X2FsbF9tYXNrOwotc3RhdGljIHUzMiBob3RrZXlfcmVzZXJ2ZWRfbWFzazsKLXN0YXRpYyB1MzIgaG90a2V5X21hc2s7Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgaG90a2V5X3JlcG9ydF9tb2RlOwotCi1zdGF0aWMgdTE2ICpob3RrZXlfa2V5Y29kZV9tYXA7Ci0KLXN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX3NldCAqaG90a2V5X2Rldl9hdHRyaWJ1dGVzOwotCi0jaWZkZWYgQ09ORklHX1RISU5LUEFEX0FDUElfSE9US0VZX1BPTEwKLSNkZWZpbmUgSE9US0VZX0NPTkZJR19DUklUSUNBTF9TVEFSVCBcCi0JZG8geyBcCi0JCW11dGV4X2xvY2soJmhvdGtleV90aHJlYWRfZGF0YV9tdXRleCk7IFwKLQkJaG90a2V5X2NvbmZpZ19jaGFuZ2UrKzsgXAotCX0gd2hpbGUgKDApOwotI2RlZmluZSBIT1RLRVlfQ09ORklHX0NSSVRJQ0FMX0VORCBcCi0JbXV0ZXhfdW5sb2NrKCZob3RrZXlfdGhyZWFkX2RhdGFfbXV0ZXgpOwotI2Vsc2UKLSNkZWZpbmUgSE9US0VZX0NPTkZJR19DUklUSUNBTF9TVEFSVAotI2RlZmluZSBIT1RLRVlfQ09ORklHX0NSSVRJQ0FMX0VORAotI2VuZGlmIC8qIENPTkZJR19USElOS1BBRF9BQ1BJX0hPVEtFWV9QT0xMICovCi0KLS8qIEhLRVkuTUhLRygpIHJldHVybiBiaXRzICovCi0jZGVmaW5lIFRQX0hPVEtFWV9UQUJMRVRfTUFTSyAoMSA8PCAzKQotCi1zdGF0aWMgaW50IGhvdGtleV9nZXRfd2xzdyhpbnQgKnN0YXR1cykKLXsKLQlpZiAoIWFjcGlfZXZhbGYoaGtleV9oYW5kbGUsIHN0YXR1cywgIldMU1ciLCAiZCIpKQotCQlyZXR1cm4gLUVJTzsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBob3RrZXlfZ2V0X3RhYmxldF9tb2RlKGludCAqc3RhdHVzKQotewotCWludCBzOwotCi0JaWYgKCFhY3BpX2V2YWxmKGhrZXlfaGFuZGxlLCAmcywgIk1IS0ciLCAiZCIpKQotCQlyZXR1cm4gLUVJTzsKLQotCSpzdGF0dXMgPSAoKHMgJiBUUF9IT1RLRVlfVEFCTEVUX01BU0spICE9IDApOwotCXJldHVybiAwOwotfQotCi0vKgotICogQ2FsbCB3aXRoIGhvdGtleV9tdXRleCBoZWxkCi0gKi8KLXN0YXRpYyBpbnQgaG90a2V5X21hc2tfZ2V0KHZvaWQpCi17Ci0JdTMyIG0gPSAwOwotCi0JaWYgKHRwX2ZlYXR1cmVzLmhvdGtleV9tYXNrKSB7Ci0JCWlmICghYWNwaV9ldmFsZihoa2V5X2hhbmRsZSwgJm0sICJESEtOIiwgImQiKSkKLQkJCXJldHVybiAtRUlPOwotCX0KLQlob3RrZXlfbWFzayA9IG0gfCAoaG90a2V5X3NvdXJjZV9tYXNrICYgaG90a2V5X21hc2spOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBDYWxsIHdpdGggaG90a2V5X211dGV4IGhlbGQKLSAqLwotc3RhdGljIGludCBob3RrZXlfbWFza19zZXQodTMyIG1hc2spCi17Ci0JaW50IGk7Ci0JaW50IHJjID0gMDsKLQotCWlmICh0cF9mZWF0dXJlcy5ob3RrZXlfbWFzaykgewotCQlpZiAoIXRwX3dhcm5lZC5ob3RrZXlfbWFza19mZiAmJgotCQkgICAgKG1hc2sgPT0gMHhmZmZmIHx8IG1hc2sgPT0gMHhmZmZmZmYgfHwKLQkJICAgICBtYXNrID09IDB4ZmZmZmZmZmYpKSB7Ci0JCQl0cF93YXJuZWQuaG90a2V5X21hc2tfZmYgPSAxOwotCQkJcHJpbnRrKFRQQUNQSV9OT1RJQ0UKLQkJCSAgICAgICAic2V0dGluZyB0aGUgaG90a2V5IG1hc2sgdG8gMHglMDh4IGlzIGxpa2VseSAiCi0JCQkgICAgICAgIm5vdCB0aGUgYmVzdCB3YXkgdG8gZ28gYWJvdXQgaXRcbiIsIG1hc2spOwotCQkJcHJpbnRrKFRQQUNQSV9OT1RJQ0UKLQkJCSAgICAgICAicGxlYXNlIGNvbnNpZGVyIHVzaW5nIHRoZSBkcml2ZXIgZGVmYXVsdHMsICIKLQkJCSAgICAgICAiYW5kIHJlZmVyIHRvIHVwLXRvLWRhdGUgdGhpbmtwYWQtYWNwaSAiCi0JCQkgICAgICAgImRvY3VtZW50YXRpb25cbiIpOwotCQl9Ci0KLQkJSE9US0VZX0NPTkZJR19DUklUSUNBTF9TVEFSVAotCQlmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykgewotCQkJdTMyIG0gPSAxIDw8IGk7Ci0JCQkvKiBlbmFibGUgaW4gZmlybXdhcmUgbWFzayBvbmx5IGtleXMgbm90IGluIE5WUkFNCi0JCQkgKiBtb2RlLCBidXQgZW5hYmxlIHRoZSBrZXkgaW4gdGhlIGNhY2hlZCBob3RrZXlfbWFzawotCQkJICogcmVnYXJkbGVzcyBvZiBtb2RlLCBvciB0aGUga2V5IHdpbGwgZW5kIHVwCi0JCQkgKiBkaXNhYmxlZCBieSBob3RrZXlfbWFza19nZXQoKSAqLwotCQkJaWYgKCFhY3BpX2V2YWxmKGhrZXlfaGFuZGxlLAotCQkJCQlOVUxMLCAiTUhLTSIsICJ2ZGQiLCBpICsgMSwKLQkJCQkJISEoKG1hc2sgJiB+aG90a2V5X3NvdXJjZV9tYXNrKSAmIG0pKSkgewotCQkJCXJjID0gLUVJTzsKLQkJCQlicmVhazsKLQkJCX0gZWxzZSB7Ci0JCQkJaG90a2V5X21hc2sgPSAoaG90a2V5X21hc2sgJiB+bSkgfCAobWFzayAmIG0pOwotCQkJfQotCQl9Ci0JCUhPVEtFWV9DT05GSUdfQ1JJVElDQUxfRU5ECi0KLQkJLyogaG90a2V5X21hc2tfZ2V0IG11c3QgYmUgY2FsbGVkIHVuY29uZGl0aW9uYWxseSBiZWxvdyAqLwotCQlpZiAoIWhvdGtleV9tYXNrX2dldCgpICYmICFyYyAmJgotCQkgICAgKGhvdGtleV9tYXNrICYgfmhvdGtleV9zb3VyY2VfbWFzaykgIT0KLQkJICAgICAobWFzayAmIH5ob3RrZXlfc291cmNlX21hc2spKSB7Ci0JCQlwcmludGsoVFBBQ1BJX05PVElDRQotCQkJICAgICAgICJyZXF1ZXN0ZWQgaG90IGtleSBtYXNrIDB4JTA4eCwgYnV0ICIKLQkJCSAgICAgICAiZmlybXdhcmUgZm9yY2VkIGl0IHRvIDB4JTA4eFxuIiwKLQkJCSAgICAgICBtYXNrLCBob3RrZXlfbWFzayk7Ci0JCX0KLQl9IGVsc2UgewotI2lmZGVmIENPTkZJR19USElOS1BBRF9BQ1BJX0hPVEtFWV9QT0xMCi0JCUhPVEtFWV9DT05GSUdfQ1JJVElDQUxfU1RBUlQKLQkJaG90a2V5X21hc2sgPSBtYXNrICYgaG90a2V5X3NvdXJjZV9tYXNrOwotCQlIT1RLRVlfQ09ORklHX0NSSVRJQ0FMX0VORAotCQlob3RrZXlfbWFza19nZXQoKTsKLQkJaWYgKGhvdGtleV9tYXNrICE9IG1hc2spIHsKLQkJCXByaW50ayhUUEFDUElfTk9USUNFCi0JCQkgICAgICAgInJlcXVlc3RlZCBob3Qga2V5IG1hc2sgMHglMDh4LCAiCi0JCQkgICAgICAgImZvcmNlZCB0byAweCUwOHggKE5WUkFNIHBvbGwgbWFzayBpcyAiCi0JCQkgICAgICAgIjB4JTA4eCk6IG5vIGZpcm13YXJlIG1hc2sgc3VwcG9ydFxuIiwKLQkJCSAgICAgICBtYXNrLCBob3RrZXlfbWFzaywgaG90a2V5X3NvdXJjZV9tYXNrKTsKLQkJfQotI2Vsc2UKLQkJaG90a2V5X21hc2tfZ2V0KCk7Ci0JCXJjID0gLUVOWElPOwotI2VuZGlmIC8qIENPTkZJR19USElOS1BBRF9BQ1BJX0hPVEtFWV9QT0xMICovCi0JfQotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IGhvdGtleV9zdGF0dXNfZ2V0KGludCAqc3RhdHVzKQotewotCWlmICghYWNwaV9ldmFsZihoa2V5X2hhbmRsZSwgc3RhdHVzLCAiREhLQyIsICJkIikpCi0JCXJldHVybiAtRUlPOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgaG90a2V5X3N0YXR1c19zZXQoaW50IHN0YXR1cykKLXsKLQlpZiAoIWFjcGlfZXZhbGYoaGtleV9oYW5kbGUsIE5VTEwsICJNSEtDIiwgInZkIiwgc3RhdHVzKSkKLQkJcmV0dXJuIC1FSU87Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgdHBhY3BpX2lucHV0X3NlbmRfdGFibGV0c3codm9pZCkKLXsKLQlpbnQgc3RhdGU7Ci0KLQlpZiAodHBfZmVhdHVyZXMuaG90a2V5X3RhYmxldCAmJgotCSAgICAhaG90a2V5X2dldF90YWJsZXRfbW9kZSgmc3RhdGUpKSB7Ci0JCW11dGV4X2xvY2soJnRwYWNwaV9pbnB1dGRldl9zZW5kX211dGV4KTsKLQotCQlpbnB1dF9yZXBvcnRfc3dpdGNoKHRwYWNwaV9pbnB1dGRldiwKLQkJCQkgICAgU1dfVEFCTEVUX01PREUsICEhc3RhdGUpOwotCQlpbnB1dF9zeW5jKHRwYWNwaV9pbnB1dGRldik7Ci0KLQkJbXV0ZXhfdW5sb2NrKCZ0cGFjcGlfaW5wdXRkZXZfc2VuZF9tdXRleCk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCB0cGFjcGlfaW5wdXRfc2VuZF9rZXkodW5zaWduZWQgaW50IHNjYW5jb2RlKQotewotCXVuc2lnbmVkIGludCBrZXljb2RlOwotCi0Ja2V5Y29kZSA9IGhvdGtleV9rZXljb2RlX21hcFtzY2FuY29kZV07Ci0KLQlpZiAoa2V5Y29kZSAhPSBLRVlfUkVTRVJWRUQpIHsKLQkJbXV0ZXhfbG9jaygmdHBhY3BpX2lucHV0ZGV2X3NlbmRfbXV0ZXgpOwotCi0JCWlucHV0X3JlcG9ydF9rZXkodHBhY3BpX2lucHV0ZGV2LCBrZXljb2RlLCAxKTsKLQkJaWYgKGtleWNvZGUgPT0gS0VZX1VOS05PV04pCi0JCQlpbnB1dF9ldmVudCh0cGFjcGlfaW5wdXRkZXYsIEVWX01TQywgTVNDX1NDQU4sCi0JCQkJICAgIHNjYW5jb2RlKTsKLQkJaW5wdXRfc3luYyh0cGFjcGlfaW5wdXRkZXYpOwotCi0JCWlucHV0X3JlcG9ydF9rZXkodHBhY3BpX2lucHV0ZGV2LCBrZXljb2RlLCAwKTsKLQkJaWYgKGtleWNvZGUgPT0gS0VZX1VOS05PV04pCi0JCQlpbnB1dF9ldmVudCh0cGFjcGlfaW5wdXRkZXYsIEVWX01TQywgTVNDX1NDQU4sCi0JCQkJICAgIHNjYW5jb2RlKTsKLQkJaW5wdXRfc3luYyh0cGFjcGlfaW5wdXRkZXYpOwotCi0JCW11dGV4X3VubG9jaygmdHBhY3BpX2lucHV0ZGV2X3NlbmRfbXV0ZXgpOwotCX0KLX0KLQotI2lmZGVmIENPTkZJR19USElOS1BBRF9BQ1BJX0hPVEtFWV9QT0xMCi1zdGF0aWMgc3RydWN0IHRwX2FjcGlfZHJ2X3N0cnVjdCBpYm1faG90a2V5X2FjcGlkcml2ZXI7Ci0KLXN0YXRpYyB2b2lkIHRwYWNwaV9ob3RrZXlfc2VuZF9rZXkodW5zaWduZWQgaW50IHNjYW5jb2RlKQotewotCXRwYWNwaV9pbnB1dF9zZW5kX2tleShzY2FuY29kZSk7Ci0JaWYgKGhvdGtleV9yZXBvcnRfbW9kZSA8IDIpIHsKLQkJYWNwaV9idXNfZ2VuZXJhdGVfcHJvY19ldmVudChpYm1faG90a2V5X2FjcGlkcml2ZXIuZGV2aWNlLAotCQkJCQkJMHg4MCwgMHgxMDAxICsgc2NhbmNvZGUpOwotCX0KLX0KLQotc3RhdGljIHZvaWQgaG90a2V5X3JlYWRfbnZyYW0oc3RydWN0IHRwX252cmFtX3N0YXRlICpuLCB1MzIgbSkKLXsKLQl1OCBkOwotCi0JaWYgKG0gJiBUUF9OVlJBTV9IS0VZX0dST1VQX0hLMikgewotCQlkID0gbnZyYW1fcmVhZF9ieXRlKFRQX05WUkFNX0FERFJfSEsyKTsKLQkJbi0+dGhpbmtwYWRfdG9nZ2xlID0gISEoZCAmIFRQX05WUkFNX01BU0tfSEtUX1RISU5LUEFEKTsKLQkJbi0+em9vbV90b2dnbGUgPSAhIShkICYgVFBfTlZSQU1fTUFTS19IS1RfWk9PTSk7Ci0JCW4tPmRpc3BsYXlfdG9nZ2xlID0gISEoZCAmIFRQX05WUkFNX01BU0tfSEtUX0RJU1BMQVkpOwotCQluLT5oaWJlcm5hdGVfdG9nZ2xlID0gISEoZCAmIFRQX05WUkFNX01BU0tfSEtUX0hJQkVSTkFURSk7Ci0JfQotCWlmIChtICYgVFBfQUNQSV9IS0VZX1RITktMR0hUX01BU0spIHsKLQkJZCA9IG52cmFtX3JlYWRfYnl0ZShUUF9OVlJBTV9BRERSX1RISU5LTElHSFQpOwotCQluLT50aGlua2xpZ2h0X3RvZ2dsZSA9ICEhKGQgJiBUUF9OVlJBTV9NQVNLX1RISU5LTElHSFQpOwotCX0KLQlpZiAobSAmIFRQX0FDUElfSEtFWV9ESVNQWFBBTkRfTUFTSykgewotCQlkID0gbnZyYW1fcmVhZF9ieXRlKFRQX05WUkFNX0FERFJfVklERU8pOwotCQluLT5kaXNwbGF5ZXhwX3RvZ2dsZSA9Ci0JCQkJISEoZCAmIFRQX05WUkFNX01BU0tfSEtUX0RJU1BFWFBORCk7Ci0JfQotCWlmIChtICYgVFBfTlZSQU1fSEtFWV9HUk9VUF9CUklHSFRORVNTKSB7Ci0JCWQgPSBudnJhbV9yZWFkX2J5dGUoVFBfTlZSQU1fQUREUl9CUklHSFRORVNTKTsKLQkJbi0+YnJpZ2h0bmVzc19sZXZlbCA9IChkICYgVFBfTlZSQU1fTUFTS19MRVZFTF9CUklHSFRORVNTKQotCQkJCT4+IFRQX05WUkFNX1BPU19MRVZFTF9CUklHSFRORVNTOwotCQluLT5icmlnaHRuZXNzX3RvZ2dsZSA9Ci0JCQkJISEoZCAmIFRQX05WUkFNX01BU0tfSEtUX0JSSUdIVE5FU1MpOwotCX0KLQlpZiAobSAmIFRQX05WUkFNX0hLRVlfR1JPVVBfVk9MVU1FKSB7Ci0JCWQgPSBudnJhbV9yZWFkX2J5dGUoVFBfTlZSQU1fQUREUl9NSVhFUik7Ci0JCW4tPnZvbHVtZV9sZXZlbCA9IChkICYgVFBfTlZSQU1fTUFTS19MRVZFTF9WT0xVTUUpCi0JCQkJPj4gVFBfTlZSQU1fUE9TX0xFVkVMX1ZPTFVNRTsKLQkJbi0+bXV0ZSA9ICEhKGQgJiBUUF9OVlJBTV9NQVNLX01VVEUpOwotCQluLT52b2x1bWVfdG9nZ2xlID0gISEoZCAmIFRQX05WUkFNX01BU0tfSEtUX1ZPTFVNRSk7Ci0JfQotfQotCi0jZGVmaW5lIFRQQUNQSV9DT01QQVJFX0tFWShfX3NjYW5jb2RlLCBfX21lbWJlcikgXAotCWRvIHsgXAotCQlpZiAoKG1hc2sgJiAoMSA8PCBfX3NjYW5jb2RlKSkgJiYgXAotCQkgICAgb2xkbi0+X19tZW1iZXIgIT0gbmV3bi0+X19tZW1iZXIpIFwKLQkJdHBhY3BpX2hvdGtleV9zZW5kX2tleShfX3NjYW5jb2RlKTsgXAotCX0gd2hpbGUgKDApCi0KLSNkZWZpbmUgVFBBQ1BJX01BWV9TRU5EX0tFWShfX3NjYW5jb2RlKSBcCi0JZG8geyBpZiAobWFzayAmICgxIDw8IF9fc2NhbmNvZGUpKSBcCi0JCXRwYWNwaV9ob3RrZXlfc2VuZF9rZXkoX19zY2FuY29kZSk7IH0gd2hpbGUgKDApCi0KLXN0YXRpYyB2b2lkIGhvdGtleV9jb21wYXJlX2FuZF9pc3N1ZV9ldmVudChzdHJ1Y3QgdHBfbnZyYW1fc3RhdGUgKm9sZG4sCi0JCQkJCSAgIHN0cnVjdCB0cF9udnJhbV9zdGF0ZSAqbmV3biwKLQkJCQkJICAgdTMyIG1hc2spCi17Ci0JVFBBQ1BJX0NPTVBBUkVfS0VZKFRQX0FDUElfSE9US0VZU0NBTl9USElOS1BBRCwgdGhpbmtwYWRfdG9nZ2xlKTsKLQlUUEFDUElfQ09NUEFSRV9LRVkoVFBfQUNQSV9IT1RLRVlTQ0FOX0ZOU1BBQ0UsIHpvb21fdG9nZ2xlKTsKLQlUUEFDUElfQ09NUEFSRV9LRVkoVFBfQUNQSV9IT1RLRVlTQ0FOX0ZORjcsIGRpc3BsYXlfdG9nZ2xlKTsKLQlUUEFDUElfQ09NUEFSRV9LRVkoVFBfQUNQSV9IT1RLRVlTQ0FOX0ZORjEyLCBoaWJlcm5hdGVfdG9nZ2xlKTsKLQotCVRQQUNQSV9DT01QQVJFX0tFWShUUF9BQ1BJX0hPVEtFWVNDQU5fRk5QQUdFVVAsIHRoaW5rbGlnaHRfdG9nZ2xlKTsKLQotCVRQQUNQSV9DT01QQVJFX0tFWShUUF9BQ1BJX0hPVEtFWVNDQU5fRk5GOCwgZGlzcGxheWV4cF90b2dnbGUpOwotCi0JLyogaGFuZGxlIHZvbHVtZSAqLwotCWlmIChvbGRuLT52b2x1bWVfdG9nZ2xlICE9IG5ld24tPnZvbHVtZV90b2dnbGUpIHsKLQkJaWYgKG9sZG4tPm11dGUgIT0gbmV3bi0+bXV0ZSkgewotCQkJVFBBQ1BJX01BWV9TRU5EX0tFWShUUF9BQ1BJX0hPVEtFWVNDQU5fTVVURSk7Ci0JCX0KLQkJaWYgKG9sZG4tPnZvbHVtZV9sZXZlbCA+IG5ld24tPnZvbHVtZV9sZXZlbCkgewotCQkJVFBBQ1BJX01BWV9TRU5EX0tFWShUUF9BQ1BJX0hPVEtFWVNDQU5fVk9MVU1FRE9XTik7Ci0JCX0gZWxzZSBpZiAob2xkbi0+dm9sdW1lX2xldmVsIDwgbmV3bi0+dm9sdW1lX2xldmVsKSB7Ci0JCQlUUEFDUElfTUFZX1NFTkRfS0VZKFRQX0FDUElfSE9US0VZU0NBTl9WT0xVTUVVUCk7Ci0JCX0gZWxzZSBpZiAob2xkbi0+bXV0ZSA9PSBuZXduLT5tdXRlKSB7Ci0JCQkvKiByZXBlYXRlZCBrZXkgcHJlc3NlcyB0aGF0IGRpZG4ndCBjaGFuZ2Ugc3RhdGUgKi8KLQkJCWlmIChuZXduLT5tdXRlKSB7Ci0JCQkJVFBBQ1BJX01BWV9TRU5EX0tFWShUUF9BQ1BJX0hPVEtFWVNDQU5fTVVURSk7Ci0JCQl9IGVsc2UgaWYgKG5ld24tPnZvbHVtZV9sZXZlbCAhPSAwKSB7Ci0JCQkJVFBBQ1BJX01BWV9TRU5EX0tFWShUUF9BQ1BJX0hPVEtFWVNDQU5fVk9MVU1FVVApOwotCQkJfSBlbHNlIHsKLQkJCQlUUEFDUElfTUFZX1NFTkRfS0VZKFRQX0FDUElfSE9US0VZU0NBTl9WT0xVTUVET1dOKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qIGhhbmRsZSBicmlnaHRuZXNzICovCi0JaWYgKG9sZG4tPmJyaWdodG5lc3NfdG9nZ2xlICE9IG5ld24tPmJyaWdodG5lc3NfdG9nZ2xlKSB7Ci0JCWlmIChvbGRuLT5icmlnaHRuZXNzX2xldmVsIDwgbmV3bi0+YnJpZ2h0bmVzc19sZXZlbCkgewotCQkJVFBBQ1BJX01BWV9TRU5EX0tFWShUUF9BQ1BJX0hPVEtFWVNDQU5fRk5IT01FKTsKLQkJfSBlbHNlIGlmIChvbGRuLT5icmlnaHRuZXNzX2xldmVsID4gbmV3bi0+YnJpZ2h0bmVzc19sZXZlbCkgewotCQkJVFBBQ1BJX01BWV9TRU5EX0tFWShUUF9BQ1BJX0hPVEtFWVNDQU5fRk5FTkQpOwotCQl9IGVsc2UgewotCQkJLyogcmVwZWF0ZWQga2V5IHByZXNzZXMgdGhhdCBkaWRuJ3QgY2hhbmdlIHN0YXRlICovCi0JCQlpZiAobmV3bi0+YnJpZ2h0bmVzc19sZXZlbCAhPSAwKSB7Ci0JCQkJVFBBQ1BJX01BWV9TRU5EX0tFWShUUF9BQ1BJX0hPVEtFWVNDQU5fRk5IT01FKTsKLQkJCX0gZWxzZSB7Ci0JCQkJVFBBQ1BJX01BWV9TRU5EX0tFWShUUF9BQ1BJX0hPVEtFWVNDQU5fRk5FTkQpOwotCQkJfQotCQl9Ci0JfQotfQotCi0jdW5kZWYgVFBBQ1BJX0NPTVBBUkVfS0VZCi0jdW5kZWYgVFBBQ1BJX01BWV9TRU5EX0tFWQotCi1zdGF0aWMgaW50IGhvdGtleV9rdGhyZWFkKHZvaWQgKmRhdGEpCi17Ci0Jc3RydWN0IHRwX252cmFtX3N0YXRlIHNbMl07Ci0JdTMyIG1hc2s7Ci0JdW5zaWduZWQgaW50IHNpLCBzbzsKLQl1bnNpZ25lZCBsb25nIHQ7Ci0JdW5zaWduZWQgaW50IGNoYW5nZV9kZXRlY3RvciwgbXVzdF9yZXNldDsKLQotCW11dGV4X2xvY2soJmhvdGtleV90aHJlYWRfbXV0ZXgpOwotCi0JaWYgKHRwYWNwaV9saWZlY3ljbGUgPT0gVFBBQ1BJX0xJRkVfRVhJVElORykKLQkJZ290byBleGl0OwotCi0Jc2V0X2ZyZWV6YWJsZSgpOwotCi0Jc28gPSAwOwotCXNpID0gMTsKLQl0ID0gMDsKLQotCS8qIEluaXRpYWwgc3RhdGUgZm9yIGNvbXBhcmVzICovCi0JbXV0ZXhfbG9jaygmaG90a2V5X3RocmVhZF9kYXRhX211dGV4KTsKLQljaGFuZ2VfZGV0ZWN0b3IgPSBob3RrZXlfY29uZmlnX2NoYW5nZTsKLQltYXNrID0gaG90a2V5X3NvdXJjZV9tYXNrICYgaG90a2V5X21hc2s7Ci0JbXV0ZXhfdW5sb2NrKCZob3RrZXlfdGhyZWFkX2RhdGFfbXV0ZXgpOwotCWhvdGtleV9yZWFkX252cmFtKCZzW3NvXSwgbWFzayk7Ci0KLQl3aGlsZSAoIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSAmJiBob3RrZXlfcG9sbF9mcmVxKSB7Ci0JCWlmICh0ID09IDApCi0JCQl0ID0gMTAwMC9ob3RrZXlfcG9sbF9mcmVxOwotCQl0ID0gbXNsZWVwX2ludGVycnVwdGlibGUodCk7Ci0JCWlmICh1bmxpa2VseShrdGhyZWFkX3Nob3VsZF9zdG9wKCkpKQotCQkJYnJlYWs7Ci0JCW11c3RfcmVzZXQgPSB0cnlfdG9fZnJlZXplKCk7Ci0JCWlmICh0ID4gMCAmJiAhbXVzdF9yZXNldCkKLQkJCWNvbnRpbnVlOwotCi0JCW11dGV4X2xvY2soJmhvdGtleV90aHJlYWRfZGF0YV9tdXRleCk7Ci0JCWlmIChtdXN0X3Jlc2V0IHx8IGhvdGtleV9jb25maWdfY2hhbmdlICE9IGNoYW5nZV9kZXRlY3RvcikgewotCQkJLyogZm9yZ2V0IG9sZCBzdGF0ZSBvbiB0aGF3IG9yIGNvbmZpZyBjaGFuZ2UgKi8KLQkJCXNpID0gc287Ci0JCQl0ID0gMDsKLQkJCWNoYW5nZV9kZXRlY3RvciA9IGhvdGtleV9jb25maWdfY2hhbmdlOwotCQl9Ci0JCW1hc2sgPSBob3RrZXlfc291cmNlX21hc2sgJiBob3RrZXlfbWFzazsKLQkJbXV0ZXhfdW5sb2NrKCZob3RrZXlfdGhyZWFkX2RhdGFfbXV0ZXgpOwotCi0JCWlmIChsaWtlbHkobWFzaykpIHsKLQkJCWhvdGtleV9yZWFkX252cmFtKCZzW3NpXSwgbWFzayk7Ci0JCQlpZiAobGlrZWx5KHNpICE9IHNvKSkgewotCQkJCWhvdGtleV9jb21wYXJlX2FuZF9pc3N1ZV9ldmVudCgmc1tzb10sICZzW3NpXSwKLQkJCQkJCQkJbWFzayk7Ci0JCQl9Ci0JCX0KLQotCQlzbyA9IHNpOwotCQlzaSBePSAxOwotCX0KLQotZXhpdDoKLQltdXRleF91bmxvY2soJmhvdGtleV90aHJlYWRfbXV0ZXgpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBob3RrZXlfcG9sbF9zdG9wX3N5bmModm9pZCkKLXsKLQlpZiAodHBhY3BpX2hvdGtleV90YXNrKSB7Ci0JCWlmIChmcm96ZW4odHBhY3BpX2hvdGtleV90YXNrKSB8fAotCQkgICAgZnJlZXppbmcodHBhY3BpX2hvdGtleV90YXNrKSkKLQkJCXRoYXdfcHJvY2Vzcyh0cGFjcGlfaG90a2V5X3Rhc2spOwotCi0JCWt0aHJlYWRfc3RvcCh0cGFjcGlfaG90a2V5X3Rhc2spOwotCQl0cGFjcGlfaG90a2V5X3Rhc2sgPSBOVUxMOwotCQltdXRleF9sb2NrKCZob3RrZXlfdGhyZWFkX211dGV4KTsKLQkJLyogYXQgdGhpcyBwb2ludCwgdGhlIHRocmVhZCBkaWQgZXhpdCAqLwotCQltdXRleF91bmxvY2soJmhvdGtleV90aHJlYWRfbXV0ZXgpOwotCX0KLX0KLQotLyogY2FsbCB3aXRoIGhvdGtleV9tdXRleCBoZWxkICovCi1zdGF0aWMgdm9pZCBob3RrZXlfcG9sbF9zZXR1cChpbnQgbWF5X3dhcm4pCi17Ci0JaWYgKChob3RrZXlfc291cmNlX21hc2sgJiBob3RrZXlfbWFzaykgIT0gMCAmJgotCSAgICBob3RrZXlfcG9sbF9mcmVxID4gMCAmJgotCSAgICAodHBhY3BpX2lucHV0ZGV2LT51c2VycyA+IDAgfHwgaG90a2V5X3JlcG9ydF9tb2RlIDwgMikpIHsKLQkJaWYgKCF0cGFjcGlfaG90a2V5X3Rhc2spIHsKLQkJCXRwYWNwaV9ob3RrZXlfdGFzayA9IGt0aHJlYWRfcnVuKGhvdGtleV9rdGhyZWFkLAotCQkJCQlOVUxMLCBUUEFDUElfTlZSQU1fS1RIUkVBRF9OQU1FKTsKLQkJCWlmIChJU19FUlIodHBhY3BpX2hvdGtleV90YXNrKSkgewotCQkJCXRwYWNwaV9ob3RrZXlfdGFzayA9IE5VTEw7Ci0JCQkJcHJpbnRrKFRQQUNQSV9FUlIKLQkJCQkgICAgICAgImNvdWxkIG5vdCBjcmVhdGUga2VybmVsIHRocmVhZCAiCi0JCQkJICAgICAgICJmb3IgaG90a2V5IHBvbGxpbmdcbiIpOwotCQkJfQotCQl9Ci0JfSBlbHNlIHsKLQkJaG90a2V5X3BvbGxfc3RvcF9zeW5jKCk7Ci0JCWlmIChtYXlfd2FybiAmJgotCQkgICAgaG90a2V5X3NvdXJjZV9tYXNrICE9IDAgJiYgaG90a2V5X3BvbGxfZnJlcSA9PSAwKSB7Ci0JCQlwcmludGsoVFBBQ1BJX05PVElDRQotCQkJCSJob3Qga2V5cyAweCUwOHggcmVxdWlyZSBwb2xsaW5nLCAiCi0JCQkJIndoaWNoIGlzIGN1cnJlbnRseSBkaXNhYmxlZFxuIiwKLQkJCQlob3RrZXlfc291cmNlX21hc2spOwotCQl9Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBob3RrZXlfcG9sbF9zZXR1cF9zYWZlKGludCBtYXlfd2FybikKLXsKLQltdXRleF9sb2NrKCZob3RrZXlfbXV0ZXgpOwotCWhvdGtleV9wb2xsX3NldHVwKG1heV93YXJuKTsKLQltdXRleF91bmxvY2soJmhvdGtleV9tdXRleCk7Ci19Ci0KLSNlbHNlIC8qIENPTkZJR19USElOS1BBRF9BQ1BJX0hPVEtFWV9QT0xMICovCi0KLXN0YXRpYyB2b2lkIGhvdGtleV9wb2xsX3NldHVwX3NhZmUoaW50IF9fdW51c2VkKQotewotfQotCi0jZW5kaWYgLyogQ09ORklHX1RISU5LUEFEX0FDUElfSE9US0VZX1BPTEwgKi8KLQotc3RhdGljIGludCBob3RrZXlfaW5wdXRkZXZfb3BlbihzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYpCi17Ci0Jc3dpdGNoICh0cGFjcGlfbGlmZWN5Y2xlKSB7Ci0JY2FzZSBUUEFDUElfTElGRV9JTklUOgotCQkvKgotCQkgKiBob3RrZXlfaW5pdCB3aWxsIGNhbGwgaG90a2V5X3BvbGxfc2V0dXBfc2FmZQotCQkgKiBhdCB0aGUgYXBwcm9wcmlhdGUgbW9tZW50Ci0JCSAqLwotCQlyZXR1cm4gMDsKLQljYXNlIFRQQUNQSV9MSUZFX0VYSVRJTkc6Ci0JCXJldHVybiAtRUJVU1k7Ci0JY2FzZSBUUEFDUElfTElGRV9SVU5OSU5HOgotCQlob3RrZXlfcG9sbF9zZXR1cF9zYWZlKDApOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQkvKiBTaG91bGQgb25seSBoYXBwZW4gaWYgdHBhY3BpX2xpZmVjeWNsZSBpcyBjb3JydXB0ICovCi0JQlVHKCk7Ci0JcmV0dXJuIC1FQlVTWTsKLX0KLQotc3RhdGljIHZvaWQgaG90a2V5X2lucHV0ZGV2X2Nsb3NlKHN0cnVjdCBpbnB1dF9kZXYgKmRldikKLXsKLQkvKiBkaXNhYmxlIGhvdGtleSBwb2xsaW5nIHdoZW4gcG9zc2libGUgKi8KLQlpZiAodHBhY3BpX2xpZmVjeWNsZSA9PSBUUEFDUElfTElGRV9SVU5OSU5HKQotCQlob3RrZXlfcG9sbF9zZXR1cF9zYWZlKDApOwotfQotCi0vKiBzeXNmcyBob3RrZXkgZW5hYmxlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLXN0YXRpYyBzc2l6ZV90IGhvdGtleV9lbmFibGVfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCSAgIGNoYXIgKmJ1ZikKLXsKLQlpbnQgcmVzLCBzdGF0dXM7Ci0KLQlyZXMgPSBob3RrZXlfc3RhdHVzX2dldCgmc3RhdHVzKTsKLQlpZiAocmVzKQotCQlyZXR1cm4gcmVzOwotCi0JcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWRcbiIsIHN0YXR1cyk7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGhvdGtleV9lbmFibGVfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAotCQkJICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQkJICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQotewotCXVuc2lnbmVkIGxvbmcgdDsKLQlpbnQgcmVzOwotCi0JaWYgKHBhcnNlX3N0cnRvdWwoYnVmLCAxLCAmdCkpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JcmVzID0gaG90a2V5X3N0YXR1c19zZXQodCk7Ci0KLQlyZXR1cm4gKHJlcykgPyByZXMgOiBjb3VudDsKLX0KLQotc3RhdGljIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlIGRldl9hdHRyX2hvdGtleV9lbmFibGUgPQotCV9fQVRUUihob3RrZXlfZW5hYmxlLCBTX0lXVVNSIHwgU19JUlVHTywKLQkJaG90a2V5X2VuYWJsZV9zaG93LCBob3RrZXlfZW5hYmxlX3N0b3JlKTsKLQotLyogc3lzZnMgaG90a2V5IG1hc2sgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi1zdGF0aWMgc3NpemVfdCBob3RrZXlfbWFza19zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCSAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQkJICAgY2hhciAqYnVmKQotewotCWludCByZXM7Ci0KLQlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZob3RrZXlfbXV0ZXgpKQotCQlyZXR1cm4gLUVSRVNUQVJUU1lTOwotCXJlcyA9IGhvdGtleV9tYXNrX2dldCgpOwotCW11dGV4X3VubG9jaygmaG90a2V5X211dGV4KTsKLQotCXJldHVybiAocmVzKT8KLQkJcmVzIDogc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIweCUwOHhcbiIsIGhvdGtleV9tYXNrKTsKLX0KLQotc3RhdGljIHNzaXplX3QgaG90a2V5X21hc2tfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAotCQkJICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQkJICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQotewotCXVuc2lnbmVkIGxvbmcgdDsKLQlpbnQgcmVzOwotCi0JaWYgKHBhcnNlX3N0cnRvdWwoYnVmLCAweGZmZmZmZmZmVUwsICZ0KSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZob3RrZXlfbXV0ZXgpKQotCQlyZXR1cm4gLUVSRVNUQVJUU1lTOwotCi0JcmVzID0gaG90a2V5X21hc2tfc2V0KHQpOwotCi0jaWZkZWYgQ09ORklHX1RISU5LUEFEX0FDUElfSE9US0VZX1BPTEwKLQlob3RrZXlfcG9sbF9zZXR1cCgxKTsKLSNlbmRpZgotCi0JbXV0ZXhfdW5sb2NrKCZob3RrZXlfbXV0ZXgpOwotCi0JcmV0dXJuIChyZXMpID8gcmVzIDogY291bnQ7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSBkZXZfYXR0cl9ob3RrZXlfbWFzayA9Ci0JX19BVFRSKGhvdGtleV9tYXNrLCBTX0lXVVNSIHwgU19JUlVHTywKLQkJaG90a2V5X21hc2tfc2hvdywgaG90a2V5X21hc2tfc3RvcmUpOwotCi0vKiBzeXNmcyBob3RrZXkgYmlvc19lbmFibGVkIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLXN0YXRpYyBzc2l6ZV90IGhvdGtleV9iaW9zX2VuYWJsZWRfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCSAgIGNoYXIgKmJ1ZikKLXsKLQlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZFxuIiwgaG90a2V5X29yaWdfc3RhdHVzKTsKLX0KLQotc3RhdGljIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlIGRldl9hdHRyX2hvdGtleV9iaW9zX2VuYWJsZWQgPQotCV9fQVRUUihob3RrZXlfYmlvc19lbmFibGVkLCBTX0lSVUdPLCBob3RrZXlfYmlvc19lbmFibGVkX3Nob3csIE5VTEwpOwotCi0vKiBzeXNmcyBob3RrZXkgYmlvc19tYXNrIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLXN0YXRpYyBzc2l6ZV90IGhvdGtleV9iaW9zX21hc2tfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCSAgIGNoYXIgKmJ1ZikKLXsKLQlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIweCUwOHhcbiIsIGhvdGtleV9vcmlnX21hc2spOwotfQotCi1zdGF0aWMgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgZGV2X2F0dHJfaG90a2V5X2Jpb3NfbWFzayA9Ci0JX19BVFRSKGhvdGtleV9iaW9zX21hc2ssIFNfSVJVR08sIGhvdGtleV9iaW9zX21hc2tfc2hvdywgTlVMTCk7Ci0KLS8qIHN5c2ZzIGhvdGtleSBhbGxfbWFzayAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotc3RhdGljIHNzaXplX3QgaG90a2V5X2FsbF9tYXNrX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAotCQkJICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCQkgICBjaGFyICpidWYpCi17Ci0JcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiMHglMDh4XG4iLAotCQkJCWhvdGtleV9hbGxfbWFzayB8IGhvdGtleV9zb3VyY2VfbWFzayk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSBkZXZfYXR0cl9ob3RrZXlfYWxsX21hc2sgPQotCV9fQVRUUihob3RrZXlfYWxsX21hc2ssIFNfSVJVR08sIGhvdGtleV9hbGxfbWFza19zaG93LCBOVUxMKTsKLQotLyogc3lzZnMgaG90a2V5IHJlY29tbWVuZGVkX21hc2sgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi1zdGF0aWMgc3NpemVfdCBob3RrZXlfcmVjb21tZW5kZWRfbWFza19zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCQkJICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQkJCQkgICAgY2hhciAqYnVmKQotewotCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIjB4JTA4eFxuIiwKLQkJCShob3RrZXlfYWxsX21hc2sgfCBob3RrZXlfc291cmNlX21hc2spCi0JCQkmIH5ob3RrZXlfcmVzZXJ2ZWRfbWFzayk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSBkZXZfYXR0cl9ob3RrZXlfcmVjb21tZW5kZWRfbWFzayA9Ci0JX19BVFRSKGhvdGtleV9yZWNvbW1lbmRlZF9tYXNrLCBTX0lSVUdPLAotCQlob3RrZXlfcmVjb21tZW5kZWRfbWFza19zaG93LCBOVUxMKTsKLQotI2lmZGVmIENPTkZJR19USElOS1BBRF9BQ1BJX0hPVEtFWV9QT0xMCi0KLS8qIHN5c2ZzIGhvdGtleSBob3RrZXlfc291cmNlX21hc2sgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotc3RhdGljIHNzaXplX3QgaG90a2V5X3NvdXJjZV9tYXNrX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAotCQkJICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCQkgICBjaGFyICpidWYpCi17Ci0JcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiMHglMDh4XG4iLCBob3RrZXlfc291cmNlX21hc2spOwotfQotCi1zdGF0aWMgc3NpemVfdCBob3RrZXlfc291cmNlX21hc2tfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAotCQkJICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQkJICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQotewotCXVuc2lnbmVkIGxvbmcgdDsKLQotCWlmIChwYXJzZV9zdHJ0b3VsKGJ1ZiwgMHhmZmZmZmZmZlVMLCAmdCkgfHwKLQkJKCh0ICYgflRQQUNQSV9IS0VZX05WUkFNX0tOT1dOX01BU0spICE9IDApKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJmhvdGtleV9tdXRleCkpCi0JCXJldHVybiAtRVJFU1RBUlRTWVM7Ci0KLQlIT1RLRVlfQ09ORklHX0NSSVRJQ0FMX1NUQVJUCi0JaG90a2V5X3NvdXJjZV9tYXNrID0gdDsKLQlIT1RLRVlfQ09ORklHX0NSSVRJQ0FMX0VORAotCi0JaG90a2V5X3BvbGxfc2V0dXAoMSk7Ci0KLQltdXRleF91bmxvY2soJmhvdGtleV9tdXRleCk7Ci0KLQlyZXR1cm4gY291bnQ7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSBkZXZfYXR0cl9ob3RrZXlfc291cmNlX21hc2sgPQotCV9fQVRUUihob3RrZXlfc291cmNlX21hc2ssIFNfSVdVU1IgfCBTX0lSVUdPLAotCQlob3RrZXlfc291cmNlX21hc2tfc2hvdywgaG90a2V5X3NvdXJjZV9tYXNrX3N0b3JlKTsKLQotLyogc3lzZnMgaG90a2V5IGhvdGtleV9wb2xsX2ZyZXEgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi1zdGF0aWMgc3NpemVfdCBob3RrZXlfcG9sbF9mcmVxX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAotCQkJICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCQkgICBjaGFyICpidWYpCi17Ci0JcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWRcbiIsIGhvdGtleV9wb2xsX2ZyZXEpOwotfQotCi1zdGF0aWMgc3NpemVfdCBob3RrZXlfcG9sbF9mcmVxX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCSAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCSAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKLXsKLQl1bnNpZ25lZCBsb25nIHQ7Ci0KLQlpZiAocGFyc2Vfc3RydG91bChidWYsIDI1LCAmdCkpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmaG90a2V5X211dGV4KSkKLQkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKLQotCWhvdGtleV9wb2xsX2ZyZXEgPSB0OwotCi0JaG90a2V5X3BvbGxfc2V0dXAoMSk7Ci0JbXV0ZXhfdW5sb2NrKCZob3RrZXlfbXV0ZXgpOwotCi0JcmV0dXJuIGNvdW50OwotfQotCi1zdGF0aWMgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgZGV2X2F0dHJfaG90a2V5X3BvbGxfZnJlcSA9Ci0JX19BVFRSKGhvdGtleV9wb2xsX2ZyZXEsIFNfSVdVU1IgfCBTX0lSVUdPLAotCQlob3RrZXlfcG9sbF9mcmVxX3Nob3csIGhvdGtleV9wb2xsX2ZyZXFfc3RvcmUpOwotCi0jZW5kaWYgLyogQ09ORklHX1RISU5LUEFEX0FDUElfSE9US0VZX1BPTEwgKi8KLQotLyogc3lzZnMgaG90a2V5IHJhZGlvX3N3IChwb2xsYWJsZSkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi1zdGF0aWMgc3NpemVfdCBob3RrZXlfcmFkaW9fc3dfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCSAgIGNoYXIgKmJ1ZikKLXsKLQlpbnQgcmVzLCBzOwotCXJlcyA9IGhvdGtleV9nZXRfd2xzdygmcyk7Ci0JaWYgKHJlcyA8IDApCi0JCXJldHVybiByZXM7Ci0KLQlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZFxuIiwgISFzKTsKLX0KLQotc3RhdGljIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlIGRldl9hdHRyX2hvdGtleV9yYWRpb19zdyA9Ci0JX19BVFRSKGhvdGtleV9yYWRpb19zdywgU19JUlVHTywgaG90a2V5X3JhZGlvX3N3X3Nob3csIE5VTEwpOwotCi1zdGF0aWMgdm9pZCBob3RrZXlfcmFkaW9fc3dfbm90aWZ5X2NoYW5nZSh2b2lkKQotewotCWlmICh0cF9mZWF0dXJlcy5ob3RrZXlfd2xzdykKLQkJc3lzZnNfbm90aWZ5KCZ0cGFjcGlfcGRldi0+ZGV2LmtvYmosIE5VTEwsCi0JCQkgICAgICJob3RrZXlfcmFkaW9fc3ciKTsKLX0KLQotLyogc3lzZnMgaG90a2V5IHRhYmxldCBtb2RlIChwb2xsYWJsZSkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi1zdGF0aWMgc3NpemVfdCBob3RrZXlfdGFibGV0X21vZGVfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCSAgIGNoYXIgKmJ1ZikKLXsKLQlpbnQgcmVzLCBzOwotCXJlcyA9IGhvdGtleV9nZXRfdGFibGV0X21vZGUoJnMpOwotCWlmIChyZXMgPCAwKQotCQlyZXR1cm4gcmVzOwotCi0JcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWRcbiIsICEhcyk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSBkZXZfYXR0cl9ob3RrZXlfdGFibGV0X21vZGUgPQotCV9fQVRUUihob3RrZXlfdGFibGV0X21vZGUsIFNfSVJVR08sIGhvdGtleV90YWJsZXRfbW9kZV9zaG93LCBOVUxMKTsKLQotc3RhdGljIHZvaWQgaG90a2V5X3RhYmxldF9tb2RlX25vdGlmeV9jaGFuZ2Uodm9pZCkKLXsKLQlpZiAodHBfZmVhdHVyZXMuaG90a2V5X3RhYmxldCkKLQkJc3lzZnNfbm90aWZ5KCZ0cGFjcGlfcGRldi0+ZGV2LmtvYmosIE5VTEwsCi0JCQkgICAgICJob3RrZXlfdGFibGV0X21vZGUiKTsKLX0KLQotLyogc3lzZnMgaG90a2V5IHJlcG9ydF9tb2RlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi1zdGF0aWMgc3NpemVfdCBob3RrZXlfcmVwb3J0X21vZGVfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCSAgIGNoYXIgKmJ1ZikKLXsKLQlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZFxuIiwKLQkJKGhvdGtleV9yZXBvcnRfbW9kZSAhPSAwKSA/IGhvdGtleV9yZXBvcnRfbW9kZSA6IDEpOwotfQotCi1zdGF0aWMgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgZGV2X2F0dHJfaG90a2V5X3JlcG9ydF9tb2RlID0KLQlfX0FUVFIoaG90a2V5X3JlcG9ydF9tb2RlLCBTX0lSVUdPLCBob3RrZXlfcmVwb3J0X21vZGVfc2hvdywgTlVMTCk7Ci0KLS8qIHN5c2ZzIHdha2V1cCByZWFzb24gKHBvbGxhYmxlKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotc3RhdGljIHNzaXplX3QgaG90a2V5X3dha2V1cF9yZWFzb25fc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCSAgIGNoYXIgKmJ1ZikKLXsKLQlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZFxuIiwgaG90a2V5X3dha2V1cF9yZWFzb24pOwotfQotCi1zdGF0aWMgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgZGV2X2F0dHJfaG90a2V5X3dha2V1cF9yZWFzb24gPQotCV9fQVRUUih3YWtldXBfcmVhc29uLCBTX0lSVUdPLCBob3RrZXlfd2FrZXVwX3JlYXNvbl9zaG93LCBOVUxMKTsKLQotc3RhdGljIHZvaWQgaG90a2V5X3dha2V1cF9yZWFzb25fbm90aWZ5X2NoYW5nZSh2b2lkKQotewotCWlmICh0cF9mZWF0dXJlcy5ob3RrZXlfbWFzaykKLQkJc3lzZnNfbm90aWZ5KCZ0cGFjcGlfcGRldi0+ZGV2LmtvYmosIE5VTEwsCi0JCQkgICAgICJ3YWtldXBfcmVhc29uIik7Ci19Ci0KLS8qIHN5c2ZzIHdha2V1cCBob3R1bnBsdWdfY29tcGxldGUgKHBvbGxhYmxlKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotc3RhdGljIHNzaXplX3QgaG90a2V5X3dha2V1cF9ob3R1bnBsdWdfY29tcGxldGVfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCSAgIGNoYXIgKmJ1ZikKLXsKLQlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZFxuIiwgaG90a2V5X2F1dG9zbGVlcF9hY2spOwotfQotCi1zdGF0aWMgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgZGV2X2F0dHJfaG90a2V5X3dha2V1cF9ob3R1bnBsdWdfY29tcGxldGUgPQotCV9fQVRUUih3YWtldXBfaG90dW5wbHVnX2NvbXBsZXRlLCBTX0lSVUdPLAotCSAgICAgICBob3RrZXlfd2FrZXVwX2hvdHVucGx1Z19jb21wbGV0ZV9zaG93LCBOVUxMKTsKLQotc3RhdGljIHZvaWQgaG90a2V5X3dha2V1cF9ob3R1bnBsdWdfY29tcGxldGVfbm90aWZ5X2NoYW5nZSh2b2lkKQotewotCWlmICh0cF9mZWF0dXJlcy5ob3RrZXlfbWFzaykKLQkJc3lzZnNfbm90aWZ5KCZ0cGFjcGlfcGRldi0+ZGV2LmtvYmosIE5VTEwsCi0JCQkgICAgICJ3YWtldXBfaG90dW5wbHVnX2NvbXBsZXRlIik7Ci19Ci0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi1zdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqaG90a2V5X2F0dHJpYnV0ZXNbXSBfX2luaXRkYXRhID0gewotCSZkZXZfYXR0cl9ob3RrZXlfZW5hYmxlLmF0dHIsCi0JJmRldl9hdHRyX2hvdGtleV9iaW9zX2VuYWJsZWQuYXR0ciwKLQkmZGV2X2F0dHJfaG90a2V5X3JlcG9ydF9tb2RlLmF0dHIsCi0jaWZkZWYgQ09ORklHX1RISU5LUEFEX0FDUElfSE9US0VZX1BPTEwKLQkmZGV2X2F0dHJfaG90a2V5X21hc2suYXR0ciwKLQkmZGV2X2F0dHJfaG90a2V5X2FsbF9tYXNrLmF0dHIsCi0JJmRldl9hdHRyX2hvdGtleV9yZWNvbW1lbmRlZF9tYXNrLmF0dHIsCi0JJmRldl9hdHRyX2hvdGtleV9zb3VyY2VfbWFzay5hdHRyLAotCSZkZXZfYXR0cl9ob3RrZXlfcG9sbF9mcmVxLmF0dHIsCi0jZW5kaWYKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpob3RrZXlfbWFza19hdHRyaWJ1dGVzW10gX19pbml0ZGF0YSA9IHsKLQkmZGV2X2F0dHJfaG90a2V5X2Jpb3NfbWFzay5hdHRyLAotI2lmbmRlZiBDT05GSUdfVEhJTktQQURfQUNQSV9IT1RLRVlfUE9MTAotCSZkZXZfYXR0cl9ob3RrZXlfbWFzay5hdHRyLAotCSZkZXZfYXR0cl9ob3RrZXlfYWxsX21hc2suYXR0ciwKLQkmZGV2X2F0dHJfaG90a2V5X3JlY29tbWVuZGVkX21hc2suYXR0ciwKLSNlbmRpZgotCSZkZXZfYXR0cl9ob3RrZXlfd2FrZXVwX3JlYXNvbi5hdHRyLAotCSZkZXZfYXR0cl9ob3RrZXlfd2FrZXVwX2hvdHVucGx1Z19jb21wbGV0ZS5hdHRyLAotfTsKLQotc3RhdGljIHZvaWQgYmx1ZXRvb3RoX3VwZGF0ZV9yZmsodm9pZCk7Ci1zdGF0aWMgdm9pZCB3YW5fdXBkYXRlX3Jmayh2b2lkKTsKLXN0YXRpYyB2b2lkIHRwYWNwaV9zZW5kX3JhZGlvc3dfdXBkYXRlKHZvaWQpCi17Ci0JaW50IHdsc3c7Ci0KLQkvKiBTeW5jIHRoZXNlIEJFRk9SRSBzZW5kaW5nIGFueSByZmtpbGwgZXZlbnRzICovCi0JaWYgKHRwX2ZlYXR1cmVzLmJsdWV0b290aCkKLQkJYmx1ZXRvb3RoX3VwZGF0ZV9yZmsoKTsKLQlpZiAodHBfZmVhdHVyZXMud2FuKQotCQl3YW5fdXBkYXRlX3JmaygpOwotCi0JaWYgKHRwX2ZlYXR1cmVzLmhvdGtleV93bHN3ICYmICFob3RrZXlfZ2V0X3dsc3coJndsc3cpKSB7Ci0JCW11dGV4X2xvY2soJnRwYWNwaV9pbnB1dGRldl9zZW5kX211dGV4KTsKLQotCQlpbnB1dF9yZXBvcnRfc3dpdGNoKHRwYWNwaV9pbnB1dGRldiwKLQkJCQkgICAgU1dfUkZLSUxMX0FMTCwgISF3bHN3KTsKLQkJaW5wdXRfc3luYyh0cGFjcGlfaW5wdXRkZXYpOwotCi0JCW11dGV4X3VubG9jaygmdHBhY3BpX2lucHV0ZGV2X3NlbmRfbXV0ZXgpOwotCX0KLQlob3RrZXlfcmFkaW9fc3dfbm90aWZ5X2NoYW5nZSgpOwotfQotCi1zdGF0aWMgdm9pZCBob3RrZXlfZXhpdCh2b2lkKQotewotI2lmZGVmIENPTkZJR19USElOS1BBRF9BQ1BJX0hPVEtFWV9QT0xMCi0JaG90a2V5X3BvbGxfc3RvcF9zeW5jKCk7Ci0jZW5kaWYKLQotCWlmIChob3RrZXlfZGV2X2F0dHJpYnV0ZXMpCi0JCWRlbGV0ZV9hdHRyX3NldChob3RrZXlfZGV2X2F0dHJpYnV0ZXMsICZ0cGFjcGlfcGRldi0+ZGV2LmtvYmopOwotCi0Ja2ZyZWUoaG90a2V5X2tleWNvZGVfbWFwKTsKLQotCWlmICh0cF9mZWF0dXJlcy5ob3RrZXkpIHsKLQkJZGJnX3ByaW50ayhUUEFDUElfREJHX0VYSVQsCi0JCQkgICAicmVzdG9yaW5nIG9yaWdpbmFsIGhvdCBrZXkgbWFza1xuIik7Ci0JCS8qIG5vIHNob3J0LWNpcmN1aXQgYm9vbGVhbiBvcGVyYXRvciBiZWxvdyEgKi8KLQkJaWYgKChob3RrZXlfbWFza19zZXQoaG90a2V5X29yaWdfbWFzaykgfAotCQkgICAgIGhvdGtleV9zdGF0dXNfc2V0KGhvdGtleV9vcmlnX3N0YXR1cykpICE9IDApCi0JCQlwcmludGsoVFBBQ1BJX0VSUgotCQkJICAgICAgICJmYWlsZWQgdG8gcmVzdG9yZSBob3Qga2V5IG1hc2sgIgotCQkJICAgICAgICJ0byBCSU9TIGRlZmF1bHRzXG4iKTsKLQl9Ci19Ci0KLXN0YXRpYyBpbnQgX19pbml0IGhvdGtleV9pbml0KHN0cnVjdCBpYm1faW5pdF9zdHJ1Y3QgKmlpYm0pCi17Ci0JLyogUmVxdWlyZW1lbnRzIGZvciBjaGFuZ2luZyB0aGUgZGVmYXVsdCBrZXltYXBzOgotCSAqCi0JICogMS4gTWFueSBvZiB0aGUga2V5cyBhcmUgbWFwcGVkIHRvIEtFWV9SRVNFUlZFRCBmb3IgdmVyeQotCSAqICAgIGdvb2QgcmVhc29ucy4gIERvIG5vdCBjaGFuZ2UgdGhlbSB1bmxlc3MgeW91IGhhdmUgZGVlcAotCSAqICAgIGtub3dsZWRnZSBvbiB0aGUgSUJNIGFuZCBMZW5vdm8gVGhpbmtQYWQgZmlybXdhcmUgZm9yCi0JICogICAgdGhlIHZhcmlvdXMgVGhpbmtQYWQgbW9kZWxzLiAgVGhlIGRyaXZlciBiZWhhdmVzCi0JICogICAgZGlmZmVyZW50bHkgZm9yIEtFWV9SRVNFUlZFRDogc3VjaCBrZXlzIGhhdmUgdGhlaXIKLQkgKiAgICBob3Qga2V5IG1hc2sgKnVuc2V0KiBpbiBtYXNrX3JlY29tbWVuZGVkLCBhbmQgYWxzbwotCSAqICAgIGluIHRoZSBpbml0aWFsIGhvdCBrZXkgbWFzayBwcm9ncmFtbWVkIGludG8gdGhlCi0JICogICAgZmlybXdhcmUgYXQgZHJpdmVyIGxvYWQgdGltZSwgd2hpY2ggbWVhbnMgdGhlIGZpcm0tCi0JICogICAgd2FyZSBtYXkgcmVhY3QgdmVyeSBkaWZmZXJlbnRseSBpZiB5b3UgY2hhbmdlIHRoZW0gdG8KLQkgKiAgICBzb21ldGhpbmcgZWxzZTsKLQkgKgotCSAqIDIuIFlvdSBtdXN0IGJlIHN1YnNjcmliZWQgdG8gdGhlIGxpbnV4LXRoaW5rcGFkIGFuZAotCSAqICAgIGlibS1hY3BpLWRldmVsIG1haWxpbmcgbGlzdHMsIGFuZCB5b3Ugc2hvdWxkIHJlYWQgdGhlCi0JICogICAgbGlzdCBhcmNoaXZlcyBzaW5jZSAyMDA3IGlmIHlvdSB3YW50IHRvIGNoYW5nZSB0aGUKLQkgKiAgICBrZXltYXBzLiAgVGhpcyByZXF1aXJlbWVudCBleGlzdHMgc28gdGhhdCB5b3Ugd2lsbAotCSAqICAgIGtub3cgdGhlIHBhc3QgaGlzdG9yeSBvZiBwcm9ibGVtcyB3aXRoIHRoZSB0aGlua3BhZC0KLQkgKiAgICBhY3BpIGRyaXZlciBrZXltYXBzLCBhbmQgYWxzbyB0aGF0IHlvdSB3aWxsIGJlCi0JICogICAgbGlzdGVuaW5nIHRvIGFueSBidWcgcmVwb3J0czsKLQkgKgotCSAqIDMuIERvIG5vdCBzZW5kIHRoaW5rcGFkLWFjcGkgc3BlY2lmaWMgcGF0Y2hlcyBkaXJlY3RseSB0bwotCSAqICAgIGZvciBtZXJnaW5nLCAqZXZlciouICBTZW5kIHRoZW0gdG8gdGhlIGxpbnV4LWFjcGkKLQkgKiAgICBtYWlsaW5nbGlzdCBmb3IgY29tbWVudHMuICBNZXJnaW5nIGlzIHRvIGJlIGRvbmUgb25seQotCSAqICAgIHRocm91Z2ggYWNwaS10ZXN0IGFuZCB0aGUgQUNQSSBtYWludGFpbmVyLgotCSAqCi0JICogSWYgdGhlIGFib3ZlIGlzIHRvbyBtdWNoIHRvIGFzaywgZG9uJ3QgY2hhbmdlIHRoZSBrZXltYXAuCi0JICogQXNrIHRoZSB0aGlua3BhZC1hY3BpIG1haW50YWluZXIgdG8gZG8gaXQsIGluc3RlYWQuCi0JICovCi0Jc3RhdGljIHUxNiBpYm1fa2V5Y29kZV9tYXBbXSBfX2luaXRkYXRhID0gewotCQkvKiBTY2FuIENvZGVzIDB4MDAgdG8gMHgwQjogQUNQSSBIS0VZIEZOK0YxLi5GMTIgKi8KLQkJS0VZX0ZOX0YxLAlLRVlfRk5fRjIsCUtFWV9DT0ZGRUUsCUtFWV9TTEVFUCwKLQkJS0VZX1dMQU4sCUtFWV9GTl9GNiwgS0VZX1NXSVRDSFZJREVPTU9ERSwgS0VZX0ZOX0Y4LAotCQlLRVlfRk5fRjksCUtFWV9GTl9GMTAsCUtFWV9GTl9GMTEsCUtFWV9TVVNQRU5ELAotCi0JCS8qIFNjYW4gY29kZXMgMHgwQyB0byAweDFGOiBPdGhlciBBQ1BJIEhLRVkgaG90IGtleXMgKi8KLQkJS0VZX1VOS05PV04sCS8qIDB4MEM6IEZOK0JBQ0tTUEFDRSAqLwotCQlLRVlfVU5LTk9XTiwJLyogMHgwRDogRk4rSU5TRVJUICovCi0JCUtFWV9VTktOT1dOLAkvKiAweDBFOiBGTitERUxFVEUgKi8KLQotCQkvKiBicmlnaHRuZXNzOiBmaXJtd2FyZSBhbHdheXMgcmVhY3RzIHRvIHRoZW0sIHVubGVzcwotCQkgKiBYLm9yZyBkaWQgc29tZSB0cmlja3MgaW4gdGhlIHJhZGVvbiBCSU9TIHNjcmF0Y2gKLQkJICogcmVnaXN0ZXJzIG9mICpzb21lKiBtb2RlbHMgKi8KLQkJS0VZX1JFU0VSVkVELAkvKiAweDBGOiBGTitIT01FIChicmlnaHRuZXNzIHVwKSAqLwotCQlLRVlfUkVTRVJWRUQsCS8qIDB4MTA6IEZOK0VORCAoYnJpZ2h0bmVzcyBkb3duKSAqLwotCi0JCS8qIFRoaW5rbGlnaHQ6IGZpcm13YXJlIGFsd2F5cyByZWFjdCB0byBpdCAqLwotCQlLRVlfUkVTRVJWRUQsCS8qIDB4MTE6IEZOK1BHVVAgKHRoaW5rbGlnaHQgdG9nZ2xlKSAqLwotCi0JCUtFWV9VTktOT1dOLAkvKiAweDEyOiBGTitQR0RPV04gKi8KLQkJS0VZX1pPT00sCS8qIDB4MTM6IEZOK1NQQUNFICh6b29tKSAqLwotCi0JCS8qIFZvbHVtZTogZmlybXdhcmUgYWx3YXlzIHJlYWN0IHRvIGl0IGFuZCByZXByb2dyYW1zCi0JCSAqIHRoZSBidWlsdC1pbiAqZXh0cmEqIG1peGVyLiAgTmV2ZXIgbWFwIGl0IHRvIGNvbnRyb2wKLQkJICogYW5vdGhlciBtaXhlciBieSBkZWZhdWx0LiAqLwotCQlLRVlfUkVTRVJWRUQsCS8qIDB4MTQ6IFZPTFVNRSBVUCAqLwotCQlLRVlfUkVTRVJWRUQsCS8qIDB4MTU6IFZPTFVNRSBET1dOICovCi0JCUtFWV9SRVNFUlZFRCwJLyogMHgxNjogTVVURSAqLwotCi0JCUtFWV9WRU5ET1IsCS8qIDB4MTc6IFRoaW5rcGFkL0FjY2Vzc0lCTS9MZW5vdm8gKi8KLQotCQkvKiAoYXNzaWdubWVudHMgdW5rbm93biwgcGxlYXNlIHJlcG9ydCBpZiBmb3VuZCkgKi8KLQkJS0VZX1VOS05PV04sIEtFWV9VTktOT1dOLCBLRVlfVU5LTk9XTiwgS0VZX1VOS05PV04sCi0JCUtFWV9VTktOT1dOLCBLRVlfVU5LTk9XTiwgS0VZX1VOS05PV04sIEtFWV9VTktOT1dOLAotCX07Ci0Jc3RhdGljIHUxNiBsZW5vdm9fa2V5Y29kZV9tYXBbXSBfX2luaXRkYXRhID0gewotCQkvKiBTY2FuIENvZGVzIDB4MDAgdG8gMHgwQjogQUNQSSBIS0VZIEZOK0YxLi5GMTIgKi8KLQkJS0VZX0ZOX0YxLAlLRVlfQ09GRkVFLAlLRVlfQkFUVEVSWSwJS0VZX1NMRUVQLAotCQlLRVlfV0xBTiwJS0VZX0ZOX0Y2LCBLRVlfU1dJVENIVklERU9NT0RFLCBLRVlfRk5fRjgsCi0JCUtFWV9GTl9GOSwJS0VZX0ZOX0YxMCwJS0VZX0ZOX0YxMSwJS0VZX1NVU1BFTkQsCi0KLQkJLyogU2NhbiBjb2RlcyAweDBDIHRvIDB4MUY6IE90aGVyIEFDUEkgSEtFWSBob3Qga2V5cyAqLwotCQlLRVlfVU5LTk9XTiwJLyogMHgwQzogRk4rQkFDS1NQQUNFICovCi0JCUtFWV9VTktOT1dOLAkvKiAweDBEOiBGTitJTlNFUlQgKi8KLQkJS0VZX1VOS05PV04sCS8qIDB4MEU6IEZOK0RFTEVURSAqLwotCi0JCS8qIFRoZXNlIGVpdGhlciBoYXZlIHRvIGdvIHRocm91Z2ggQUNQSSB2aWRlbywgb3IKLQkJICogYWN0IGxpa2UgaW4gdGhlIElCTSBUaGlua1BhZHMsIHNvIGRvbid0IGV2ZXIKLQkJICogZW5hYmxlIHRoZW0gYnkgZGVmYXVsdCAqLwotCQlLRVlfUkVTRVJWRUQsCS8qIDB4MEY6IEZOK0hPTUUgKGJyaWdodG5lc3MgdXApICovCi0JCUtFWV9SRVNFUlZFRCwJLyogMHgxMDogRk4rRU5EIChicmlnaHRuZXNzIGRvd24pICovCi0KLQkJS0VZX1JFU0VSVkVELAkvKiAweDExOiBGTitQR1VQICh0aGlua2xpZ2h0IHRvZ2dsZSkgKi8KLQotCQlLRVlfVU5LTk9XTiwJLyogMHgxMjogRk4rUEdET1dOICovCi0JCUtFWV9aT09NLAkvKiAweDEzOiBGTitTUEFDRSAoem9vbSkgKi8KLQotCQkvKiBWb2x1bWU6IHo2MC96NjEsIFQ2MCAoQklPUyB2ZXJzaW9uPyk6IGZpcm13YXJlIGFsd2F5cwotCQkgKiByZWFjdCB0byBpdCBhbmQgcmVwcm9ncmFtcyB0aGUgYnVpbHQtaW4gKmV4dHJhKiBtaXhlci4KLQkJICogTmV2ZXIgbWFwIGl0IHRvIGNvbnRyb2wgYW5vdGhlciBtaXhlciBieSBkZWZhdWx0LgotCQkgKgotCQkgKiBUNjA/LCBUNjEsIFI2MD8sIFI2MTogZmlybXdhcmUgYW5kIEVDIHRyaWVzIHRvIHNlbmQKLQkJICogdGhlc2Ugb3ZlciB0aGUgcmVndWxhciBrZXlib2FyZCwgc28gdGhlc2UgYXJlIG5vLW9wcywKLQkJICogYnV0IHRoZXJlIGFyZSBzdGlsbCB3ZWlyZCBidWdzIHJlLiBNVVRFLCBzbyBkbyBub3QKLQkJICogY2hhbmdlIHVubGVzcyB5b3UgZ2V0IHRlc3QgcmVwb3J0cyBmcm9tIGFsbCBMZW5vdm8KLQkJICogbW9kZWxzLiAgTWF5IGNhdXNlIHRoZSBCSU9TIHRvIGludGVyZmVyZSB3aXRoIHRoZQotCQkgKiBIREEgbWl4ZXIuCi0JCSAqLwotCQlLRVlfUkVTRVJWRUQsCS8qIDB4MTQ6IFZPTFVNRSBVUCAqLwotCQlLRVlfUkVTRVJWRUQsCS8qIDB4MTU6IFZPTFVNRSBET1dOICovCi0JCUtFWV9SRVNFUlZFRCwJLyogMHgxNjogTVVURSAqLwotCi0JCUtFWV9WRU5ET1IsCS8qIDB4MTc6IFRoaW5rcGFkL0FjY2Vzc0lCTS9MZW5vdm8gKi8KLQotCQkvKiAoYXNzaWdubWVudHMgdW5rbm93biwgcGxlYXNlIHJlcG9ydCBpZiBmb3VuZCkgKi8KLQkJS0VZX1VOS05PV04sIEtFWV9VTktOT1dOLCBLRVlfVU5LTk9XTiwgS0VZX1VOS05PV04sCi0JCUtFWV9VTktOT1dOLCBLRVlfVU5LTk9XTiwgS0VZX1VOS05PV04sIEtFWV9VTktOT1dOLAotCX07Ci0KLSNkZWZpbmUgVFBBQ1BJX0hPVEtFWV9NQVBfTEVOCQlBUlJBWV9TSVpFKGlibV9rZXljb2RlX21hcCkKLSNkZWZpbmUgVFBBQ1BJX0hPVEtFWV9NQVBfU0laRQkJc2l6ZW9mKGlibV9rZXljb2RlX21hcCkKLSNkZWZpbmUgVFBBQ1BJX0hPVEtFWV9NQVBfVFlQRVNJWkUJc2l6ZW9mKGlibV9rZXljb2RlX21hcFswXSkKLQotCWludCByZXMsIGk7Ci0JaW50IHN0YXR1czsKLQlpbnQgaGtleXY7Ci0KLQl2ZGJnX3ByaW50ayhUUEFDUElfREJHX0lOSVQsICJpbml0aWFsaXppbmcgaG90a2V5IHN1YmRyaXZlclxuIik7Ci0KLQlCVUdfT04oIXRwYWNwaV9pbnB1dGRldik7Ci0JQlVHX09OKHRwYWNwaV9pbnB1dGRldi0+b3BlbiAhPSBOVUxMIHx8Ci0JICAgICAgIHRwYWNwaV9pbnB1dGRldi0+Y2xvc2UgIT0gTlVMTCk7Ci0KLQlUUEFDUElfQUNQSUhBTkRMRV9JTklUKGhrZXkpOwotCW11dGV4X2luaXQoJmhvdGtleV9tdXRleCk7Ci0KLSNpZmRlZiBDT05GSUdfVEhJTktQQURfQUNQSV9IT1RLRVlfUE9MTAotCW11dGV4X2luaXQoJmhvdGtleV90aHJlYWRfbXV0ZXgpOwotCW11dGV4X2luaXQoJmhvdGtleV90aHJlYWRfZGF0YV9tdXRleCk7Ci0jZW5kaWYKLQotCS8qIGhvdGtleSBub3Qgc3VwcG9ydGVkIG9uIDU3MCAqLwotCXRwX2ZlYXR1cmVzLmhvdGtleSA9IGhrZXlfaGFuZGxlICE9IE5VTEw7Ci0KLQl2ZGJnX3ByaW50ayhUUEFDUElfREJHX0lOSVQsICJob3RrZXlzIGFyZSAlc1xuIiwKLQkJc3RyX3N1cHBvcnRlZCh0cF9mZWF0dXJlcy5ob3RrZXkpKTsKLQotCWlmICghdHBfZmVhdHVyZXMuaG90a2V5KQotCQlyZXR1cm4gMTsKLQotCXRwYWNwaV9kaXNhYmxlX2JyaWdodG5lc3NfZGVsYXkoKTsKLQotCWhvdGtleV9kZXZfYXR0cmlidXRlcyA9IGNyZWF0ZV9hdHRyX3NldCgxMywgTlVMTCk7Ci0JaWYgKCFob3RrZXlfZGV2X2F0dHJpYnV0ZXMpCi0JCXJldHVybiAtRU5PTUVNOwotCXJlcyA9IGFkZF9tYW55X3RvX2F0dHJfc2V0KGhvdGtleV9kZXZfYXR0cmlidXRlcywKLQkJCWhvdGtleV9hdHRyaWJ1dGVzLAotCQkJQVJSQVlfU0laRShob3RrZXlfYXR0cmlidXRlcykpOwotCWlmIChyZXMpCi0JCWdvdG8gZXJyX2V4aXQ7Ci0KLQkvKiBtYXNrIG5vdCBzdXBwb3J0ZWQgb24gNTcwLCA2MDBlL3gsIDc3MGUsIDc3MHgsIEEyMWUsIEEyeG0vcCwKLQkgICBBMzAsIFIzMCwgUjMxLCBUMjAtMjIsIFgyMC0yMSwgWDIyLTI0LiAgRGV0ZWN0ZWQgYnkgY2hlY2tpbmcKLQkgICBmb3IgSEtFWSBpbnRlcmZhY2UgdmVyc2lvbiAweDEwMCAqLwotCWlmIChhY3BpX2V2YWxmKGhrZXlfaGFuZGxlLCAmaGtleXYsICJNSEtWIiwgInFkIikpIHsKLQkJaWYgKChoa2V5diA+PiA4KSAhPSAxKSB7Ci0JCQlwcmludGsoVFBBQ1BJX0VSUiAidW5rbm93biB2ZXJzaW9uIG9mIHRoZSAiCi0JCQkgICAgICAgIkhLRVkgaW50ZXJmYWNlOiAweCV4XG4iLCBoa2V5dik7Ci0JCQlwcmludGsoVFBBQ1BJX0VSUiAicGxlYXNlIHJlcG9ydCB0aGlzIHRvICVzXG4iLAotCQkJICAgICAgIFRQQUNQSV9NQUlMKTsKLQkJfSBlbHNlIHsKLQkJCS8qCi0JCQkgKiBNSEtWIDB4MTAwIGluIEEzMSwgUjQwLCBSNDBlLAotCQkJICogVDR4LCBYMzEsIGFuZCBsYXRlcgotCQkJICovCi0JCQl0cF9mZWF0dXJlcy5ob3RrZXlfbWFzayA9IDE7Ci0JCX0KLQl9Ci0KLQl2ZGJnX3ByaW50ayhUUEFDUElfREJHX0lOSVQsICJob3RrZXkgbWFza3MgYXJlICVzXG4iLAotCQlzdHJfc3VwcG9ydGVkKHRwX2ZlYXR1cmVzLmhvdGtleV9tYXNrKSk7Ci0KLQlpZiAodHBfZmVhdHVyZXMuaG90a2V5X21hc2spIHsKLQkJaWYgKCFhY3BpX2V2YWxmKGhrZXlfaGFuZGxlLCAmaG90a2V5X2FsbF9tYXNrLAotCQkJCSJNSEtBIiwgInFkIikpIHsKLQkJCXByaW50ayhUUEFDUElfRVJSCi0JCQkgICAgICAgIm1pc3NpbmcgTUhLQSBoYW5kbGVyLCAiCi0JCQkgICAgICAgInBsZWFzZSByZXBvcnQgdGhpcyB0byAlc1xuIiwKLQkJCSAgICAgICBUUEFDUElfTUFJTCk7Ci0JCQkvKiBGTitGMTIsIEZOK0Y0LCBGTitGMyAqLwotCQkJaG90a2V5X2FsbF9tYXNrID0gMHgwODBjVTsKLQkJfQotCX0KLQotCS8qIGhvdGtleV9zb3VyY2VfbWFzayAqbXVzdCogYmUgemVybyBmb3IKLQkgKiB0aGUgZmlyc3QgaG90a2V5X21hc2tfZ2V0ICovCi0JcmVzID0gaG90a2V5X3N0YXR1c19nZXQoJmhvdGtleV9vcmlnX3N0YXR1cyk7Ci0JaWYgKHJlcykKLQkJZ290byBlcnJfZXhpdDsKLQotCWlmICh0cF9mZWF0dXJlcy5ob3RrZXlfbWFzaykgewotCQlyZXMgPSBob3RrZXlfbWFza19nZXQoKTsKLQkJaWYgKHJlcykKLQkJCWdvdG8gZXJyX2V4aXQ7Ci0KLQkJaG90a2V5X29yaWdfbWFzayA9IGhvdGtleV9tYXNrOwotCQlyZXMgPSBhZGRfbWFueV90b19hdHRyX3NldCgKLQkJCQlob3RrZXlfZGV2X2F0dHJpYnV0ZXMsCi0JCQkJaG90a2V5X21hc2tfYXR0cmlidXRlcywKLQkJCQlBUlJBWV9TSVpFKGhvdGtleV9tYXNrX2F0dHJpYnV0ZXMpKTsKLQkJaWYgKHJlcykKLQkJCWdvdG8gZXJyX2V4aXQ7Ci0JfQotCi0jaWZkZWYgQ09ORklHX1RISU5LUEFEX0FDUElfSE9US0VZX1BPTEwKLQlpZiAodHBfZmVhdHVyZXMuaG90a2V5X21hc2spIHsKLQkJaG90a2V5X3NvdXJjZV9tYXNrID0gVFBBQ1BJX0hLRVlfTlZSQU1fR09PRF9NQVNLCi0JCQkJCSYgfmhvdGtleV9hbGxfbWFzazsKLQl9IGVsc2UgewotCQlob3RrZXlfc291cmNlX21hc2sgPSBUUEFDUElfSEtFWV9OVlJBTV9HT09EX01BU0s7Ci0JfQotCi0JdmRiZ19wcmludGsoVFBBQ1BJX0RCR19JTklULAotCQkgICAgImhvdGtleSBzb3VyY2UgbWFzayAweCUwOHgsIHBvbGxpbmcgZnJlcSAlZFxuIiwKLQkJICAgIGhvdGtleV9zb3VyY2VfbWFzaywgaG90a2V5X3BvbGxfZnJlcSk7Ci0jZW5kaWYKLQotCS8qIE5vdCBhbGwgdGhpbmtwYWRzIGhhdmUgYSBoYXJkd2FyZSByYWRpbyBzd2l0Y2ggKi8KLQlpZiAoYWNwaV9ldmFsZihoa2V5X2hhbmRsZSwgJnN0YXR1cywgIldMU1ciLCAicWQiKSkgewotCQl0cF9mZWF0dXJlcy5ob3RrZXlfd2xzdyA9IDE7Ci0JCXByaW50ayhUUEFDUElfSU5GTwotCQkJInJhZGlvIHN3aXRjaCBmb3VuZDsgcmFkaW9zIGFyZSAlc1xuIiwKLQkJCWVuYWJsZWQoc3RhdHVzLCAwKSk7Ci0JfQotCWlmICh0cF9mZWF0dXJlcy5ob3RrZXlfd2xzdykKLQkJcmVzID0gYWRkX3RvX2F0dHJfc2V0KGhvdGtleV9kZXZfYXR0cmlidXRlcywKLQkJCQkmZGV2X2F0dHJfaG90a2V5X3JhZGlvX3N3LmF0dHIpOwotCi0JLyogRm9yIFg0MXQsIFg2MHQsIFg2MXQgVGFibGV0cy4uLiAqLwotCWlmICghcmVzICYmIGFjcGlfZXZhbGYoaGtleV9oYW5kbGUsICZzdGF0dXMsICJNSEtHIiwgInFkIikpIHsKLQkJdHBfZmVhdHVyZXMuaG90a2V5X3RhYmxldCA9IDE7Ci0JCXByaW50ayhUUEFDUElfSU5GTwotCQkJInBvc3NpYmxlIHRhYmxldCBtb2RlIHN3aXRjaCBmb3VuZDsgIgotCQkJIlRoaW5rUGFkIGluICVzIG1vZGVcbiIsCi0JCQkoc3RhdHVzICYgVFBfSE9US0VZX1RBQkxFVF9NQVNLKT8KLQkJCQkidGFibGV0IiA6ICJsYXB0b3AiKTsKLQkJcmVzID0gYWRkX3RvX2F0dHJfc2V0KGhvdGtleV9kZXZfYXR0cmlidXRlcywKLQkJCQkmZGV2X2F0dHJfaG90a2V5X3RhYmxldF9tb2RlLmF0dHIpOwotCX0KLQotCWlmICghcmVzKQotCQlyZXMgPSByZWdpc3Rlcl9hdHRyX3NldF93aXRoX3N5c2ZzKAotCQkJCWhvdGtleV9kZXZfYXR0cmlidXRlcywKLQkJCQkmdHBhY3BpX3BkZXYtPmRldi5rb2JqKTsKLQlpZiAocmVzKQotCQlnb3RvIGVycl9leGl0OwotCi0JLyogU2V0IHVwIGtleSBtYXAgKi8KLQotCWhvdGtleV9rZXljb2RlX21hcCA9IGttYWxsb2MoVFBBQ1BJX0hPVEtFWV9NQVBfU0laRSwKLQkJCQkJR0ZQX0tFUk5FTCk7Ci0JaWYgKCFob3RrZXlfa2V5Y29kZV9tYXApIHsKLQkJcHJpbnRrKFRQQUNQSV9FUlIKLQkJCSJmYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBrZXkgbWFwXG4iKTsKLQkJcmVzID0gLUVOT01FTTsKLQkJZ290byBlcnJfZXhpdDsKLQl9Ci0KLQlpZiAodGhpbmtwYWRfaWQudmVuZG9yID09IFBDSV9WRU5ET1JfSURfTEVOT1ZPKSB7Ci0JCWRiZ19wcmludGsoVFBBQ1BJX0RCR19JTklULAotCQkJICAgInVzaW5nIExlbm92byBkZWZhdWx0IGhvdCBrZXkgbWFwXG4iKTsKLQkJbWVtY3B5KGhvdGtleV9rZXljb2RlX21hcCwgJmxlbm92b19rZXljb2RlX21hcCwKLQkJCVRQQUNQSV9IT1RLRVlfTUFQX1NJWkUpOwotCX0gZWxzZSB7Ci0JCWRiZ19wcmludGsoVFBBQ1BJX0RCR19JTklULAotCQkJICAgInVzaW5nIElCTSBkZWZhdWx0IGhvdCBrZXkgbWFwXG4iKTsKLQkJbWVtY3B5KGhvdGtleV9rZXljb2RlX21hcCwgJmlibV9rZXljb2RlX21hcCwKLQkJCVRQQUNQSV9IT1RLRVlfTUFQX1NJWkUpOwotCX0KLQotCXNldF9iaXQoRVZfS0VZLCB0cGFjcGlfaW5wdXRkZXYtPmV2Yml0KTsKLQlzZXRfYml0KEVWX01TQywgdHBhY3BpX2lucHV0ZGV2LT5ldmJpdCk7Ci0Jc2V0X2JpdChNU0NfU0NBTiwgdHBhY3BpX2lucHV0ZGV2LT5tc2NiaXQpOwotCXRwYWNwaV9pbnB1dGRldi0+a2V5Y29kZXNpemUgPSBUUEFDUElfSE9US0VZX01BUF9UWVBFU0laRTsKLQl0cGFjcGlfaW5wdXRkZXYtPmtleWNvZGVtYXggPSBUUEFDUElfSE9US0VZX01BUF9MRU47Ci0JdHBhY3BpX2lucHV0ZGV2LT5rZXljb2RlID0gaG90a2V5X2tleWNvZGVfbWFwOwotCWZvciAoaSA9IDA7IGkgPCBUUEFDUElfSE9US0VZX01BUF9MRU47IGkrKykgewotCQlpZiAoaG90a2V5X2tleWNvZGVfbWFwW2ldICE9IEtFWV9SRVNFUlZFRCkgewotCQkJc2V0X2JpdChob3RrZXlfa2V5Y29kZV9tYXBbaV0sCi0JCQkJdHBhY3BpX2lucHV0ZGV2LT5rZXliaXQpOwotCQl9IGVsc2UgewotCQkJaWYgKGkgPCBzaXplb2YoaG90a2V5X3Jlc2VydmVkX21hc2spKjgpCi0JCQkJaG90a2V5X3Jlc2VydmVkX21hc2sgfD0gMSA8PCBpOwotCQl9Ci0JfQotCi0JaWYgKHRwX2ZlYXR1cmVzLmhvdGtleV93bHN3KSB7Ci0JCXNldF9iaXQoRVZfU1csIHRwYWNwaV9pbnB1dGRldi0+ZXZiaXQpOwotCQlzZXRfYml0KFNXX1JGS0lMTF9BTEwsIHRwYWNwaV9pbnB1dGRldi0+c3diaXQpOwotCX0KLQlpZiAodHBfZmVhdHVyZXMuaG90a2V5X3RhYmxldCkgewotCQlzZXRfYml0KEVWX1NXLCB0cGFjcGlfaW5wdXRkZXYtPmV2Yml0KTsKLQkJc2V0X2JpdChTV19UQUJMRVRfTU9ERSwgdHBhY3BpX2lucHV0ZGV2LT5zd2JpdCk7Ci0JfQotCi0JLyogRG8gbm90IGlzc3VlIGR1cGxpY2F0ZSBicmlnaHRuZXNzIGNoYW5nZSBldmVudHMgdG8KLQkgKiB1c2Vyc3BhY2UgKi8KLQlpZiAoIXRwX2ZlYXR1cmVzLmJyaWdodF9hY3BpbW9kZSkKLQkJLyogdXBkYXRlIGJyaWdodF9hY3BpbW9kZS4uLiAqLwotCQl0cGFjcGlfY2hlY2tfc3RkX2FjcGlfYnJpZ2h0bmVzc19zdXBwb3J0KCk7Ci0KLQlpZiAodHBfZmVhdHVyZXMuYnJpZ2h0X2FjcGltb2RlKSB7Ci0JCXByaW50ayhUUEFDUElfSU5GTwotCQkgICAgICAgIlRoaXMgVGhpbmtQYWQgaGFzIHN0YW5kYXJkIEFDUEkgYmFja2xpZ2h0ICIKLQkJICAgICAgICJicmlnaHRuZXNzIGNvbnRyb2wsIHN1cHBvcnRlZCBieSB0aGUgQUNQSSAiCi0JCSAgICAgICAidmlkZW8gZHJpdmVyXG4iKTsKLQkJcHJpbnRrKFRQQUNQSV9OT1RJQ0UKLQkJICAgICAgICJEaXNhYmxpbmcgdGhpbmtwYWQtYWNwaSBicmlnaHRuZXNzIGV2ZW50cyAiCi0JCSAgICAgICAiYnkgZGVmYXVsdC4uLlxuIik7Ci0KLQkJLyogVGhlIGhvdGtleV9yZXNlcnZlZF9tYXNrIGNoYW5nZSBiZWxvdyBpcyBub3QKLQkJICogbmVjZXNzYXJ5IHdoaWxlIHRoZSBrZXlzIGFyZSBhdCBLRVlfUkVTRVJWRUQgaW4gdGhlCi0JCSAqIGRlZmF1bHQgbWFwLCBidXQgYmV0dGVyIHNhZmUgdGhhbiBzb3JyeSwgbGVhdmUgaXQKLQkJICogaGVyZSBhcyBhIG1hcmtlciBvZiB3aGF0IHdlIGhhdmUgdG8gZG8sIGVzcGVjaWFsbHkKLQkJICogd2hlbiB3ZSBmaW5hbGx5IGJlY29tZSBhYmxlIHRvIHNldCB0aGlzIGF0IHJ1bnRpbWUKLQkJICogb24gcmVzcG9uc2UgdG8gWC5vcmcgcmVxdWVzdHMgKi8KLQkJaG90a2V5X3Jlc2VydmVkX21hc2sgfD0KLQkJCSgxIDw8IFRQX0FDUElfSE9US0VZU0NBTl9GTkhPTUUpCi0JCQl8ICgxIDw8IFRQX0FDUElfSE9US0VZU0NBTl9GTkVORCk7Ci0JfQotCi0JZGJnX3ByaW50ayhUUEFDUElfREJHX0lOSVQsICJlbmFibGluZyBob3Qga2V5IGhhbmRsaW5nXG4iKTsKLQlyZXMgPSBob3RrZXlfc3RhdHVzX3NldCgxKTsKLQlpZiAocmVzKSB7Ci0JCWhvdGtleV9leGl0KCk7Ci0JCXJldHVybiByZXM7Ci0JfQotCXJlcyA9IGhvdGtleV9tYXNrX3NldCgoKGhvdGtleV9hbGxfbWFzayB8IGhvdGtleV9zb3VyY2VfbWFzaykKLQkJCQkmIH5ob3RrZXlfcmVzZXJ2ZWRfbWFzaykKLQkJCQl8IGhvdGtleV9vcmlnX21hc2spOwotCWlmIChyZXMgPCAwICYmIHJlcyAhPSAtRU5YSU8pIHsKLQkJaG90a2V5X2V4aXQoKTsKLQkJcmV0dXJuIHJlczsKLQl9Ci0KLQlkYmdfcHJpbnRrKFRQQUNQSV9EQkdfSU5JVCwKLQkJCSJsZWdhY3kgaG90IGtleSByZXBvcnRpbmcgb3ZlciBwcm9jZnMgJXNcbiIsCi0JCQkoaG90a2V5X3JlcG9ydF9tb2RlIDwgMikgPwotCQkJCSJlbmFibGVkIiA6ICJkaXNhYmxlZCIpOwotCi0JdHBhY3BpX2lucHV0ZGV2LT5vcGVuID0gJmhvdGtleV9pbnB1dGRldl9vcGVuOwotCXRwYWNwaV9pbnB1dGRldi0+Y2xvc2UgPSAmaG90a2V5X2lucHV0ZGV2X2Nsb3NlOwotCi0JaG90a2V5X3BvbGxfc2V0dXBfc2FmZSgxKTsKLQl0cGFjcGlfc2VuZF9yYWRpb3N3X3VwZGF0ZSgpOwotCXRwYWNwaV9pbnB1dF9zZW5kX3RhYmxldHN3KCk7Ci0KLQlyZXR1cm4gMDsKLQotZXJyX2V4aXQ6Ci0JZGVsZXRlX2F0dHJfc2V0KGhvdGtleV9kZXZfYXR0cmlidXRlcywgJnRwYWNwaV9wZGV2LT5kZXYua29iaik7Ci0JaG90a2V5X2Rldl9hdHRyaWJ1dGVzID0gTlVMTDsKLQotCXJldHVybiAocmVzIDwgMCk/IHJlcyA6IDE7Ci19Ci0KLXN0YXRpYyB2b2lkIGhvdGtleV9ub3RpZnkoc3RydWN0IGlibV9zdHJ1Y3QgKmlibSwgdTMyIGV2ZW50KQotewotCXUzMiBoa2V5OwotCXVuc2lnbmVkIGludCBzY2FuY29kZTsKLQlpbnQgc2VuZF9hY3BpX2V2OwotCWludCBpZ25vcmVfYWNwaV9ldjsKLQlpbnQgdW5rX2V2OwotCi0JaWYgKGV2ZW50ICE9IDB4ODApIHsKLQkJcHJpbnRrKFRQQUNQSV9FUlIKLQkJICAgICAgICJ1bmtub3duIEhLRVkgbm90aWZpY2F0aW9uIGV2ZW50ICVkXG4iLCBldmVudCk7Ci0JCS8qIGZvcndhcmQgaXQgdG8gdXNlcnNwYWNlLCBtYXliZSBpdCBrbm93cyBob3cgdG8gaGFuZGxlIGl0ICovCi0JCWFjcGlfYnVzX2dlbmVyYXRlX25ldGxpbmtfZXZlbnQoCi0JCQkJCWlibS0+YWNwaS0+ZGV2aWNlLT5wbnAuZGV2aWNlX2NsYXNzLAotCQkJCQlpYm0tPmFjcGktPmRldmljZS0+ZGV2LmJ1c19pZCwKLQkJCQkJZXZlbnQsIDApOwotCQlyZXR1cm47Ci0JfQotCi0Jd2hpbGUgKDEpIHsKLQkJaWYgKCFhY3BpX2V2YWxmKGhrZXlfaGFuZGxlLCAmaGtleSwgIk1IS1AiLCAiZCIpKSB7Ci0JCQlwcmludGsoVFBBQ1BJX0VSUiAiZmFpbGVkIHRvIHJldHJpZXZlIEhLRVkgZXZlbnRcbiIpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKGhrZXkgPT0gMCkgewotCQkJLyogcXVldWUgZW1wdHkgKi8KLQkJCXJldHVybjsKLQkJfQotCi0JCXNlbmRfYWNwaV9ldiA9IDE7Ci0JCWlnbm9yZV9hY3BpX2V2ID0gMDsKLQkJdW5rX2V2ID0gMDsKLQotCQlzd2l0Y2ggKGhrZXkgPj4gMTIpIHsKLQkJY2FzZSAxOgotCQkJLyogMHgxMDAwLTB4MUZGRjoga2V5IHByZXNzZXMgKi8KLQkJCXNjYW5jb2RlID0gaGtleSAmIDB4ZmZmOwotCQkJaWYgKHNjYW5jb2RlID4gMCAmJiBzY2FuY29kZSA8IDB4MjEpIHsKLQkJCQlzY2FuY29kZS0tOwotCQkJCWlmICghKGhvdGtleV9zb3VyY2VfbWFzayAmICgxIDw8IHNjYW5jb2RlKSkpIHsKLQkJCQkJdHBhY3BpX2lucHV0X3NlbmRfa2V5KHNjYW5jb2RlKTsKLQkJCQkJc2VuZF9hY3BpX2V2ID0gMDsKLQkJCQl9IGVsc2UgewotCQkJCQlpZ25vcmVfYWNwaV9ldiA9IDE7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQl1bmtfZXYgPSAxOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgMjoKLQkJCS8qIFdha2V1cCByZWFzb24gKi8KLQkJCXN3aXRjaCAoaGtleSkgewotCQkJY2FzZSAweDIzMDQ6IC8qIHN1c3BlbmQsIHVuZG9jayAqLwotCQkJY2FzZSAweDI0MDQ6IC8qIGhpYmVybmF0aW9uLCB1bmRvY2sgKi8KLQkJCQlob3RrZXlfd2FrZXVwX3JlYXNvbiA9IFRQX0FDUElfV0FLRVVQX1VORE9DSzsKLQkJCQlpZ25vcmVfYWNwaV9ldiA9IDE7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDB4MjMwNTogLyogc3VzcGVuZCwgYmF5IGVqZWN0ICovCi0JCQljYXNlIDB4MjQwNTogLyogaGliZXJuYXRpb24sIGJheSBlamVjdCAqLwotCQkJCWhvdGtleV93YWtldXBfcmVhc29uID0gVFBfQUNQSV9XQUtFVVBfQkFZRUo7Ci0JCQkJaWdub3JlX2FjcGlfZXYgPSAxOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQl1bmtfZXYgPSAxOwotCQkJfQotCQkJaWYgKGhvdGtleV93YWtldXBfcmVhc29uICE9IFRQX0FDUElfV0FLRVVQX05PTkUpIHsKLQkJCQlwcmludGsoVFBBQ1BJX0lORk8KLQkJCQkgICAgICAgIndva2UgdXAgZHVlIHRvIGEgaG90LXVucGx1ZyAiCi0JCQkJICAgICAgICJyZXF1ZXN0Li4uXG4iKTsKLQkJCQlob3RrZXlfd2FrZXVwX3JlYXNvbl9ub3RpZnlfY2hhbmdlKCk7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSAzOgotCQkJLyogYmF5LXJlbGF0ZWQgd2FrZXVwcyAqLwotCQkJaWYgKGhrZXkgPT0gMHgzMDAzKSB7Ci0JCQkJaG90a2V5X2F1dG9zbGVlcF9hY2sgPSAxOwotCQkJCXByaW50ayhUUEFDUElfSU5GTwotCQkJCSAgICAgICAiYmF5IGVqZWN0ZWRcbiIpOwotCQkJCWhvdGtleV93YWtldXBfaG90dW5wbHVnX2NvbXBsZXRlX25vdGlmeV9jaGFuZ2UoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJdW5rX2V2ID0gMTsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIDQ6Ci0JCQkvKiBkb2NrLXJlbGF0ZWQgd2FrZXVwcyAqLwotCQkJaWYgKGhrZXkgPT0gMHg0MDAzKSB7Ci0JCQkJaG90a2V5X2F1dG9zbGVlcF9hY2sgPSAxOwotCQkJCXByaW50ayhUUEFDUElfSU5GTwotCQkJCSAgICAgICAidW5kb2NrZWRcbiIpOwotCQkJCWhvdGtleV93YWtldXBfaG90dW5wbHVnX2NvbXBsZXRlX25vdGlmeV9jaGFuZ2UoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJdW5rX2V2ID0gMTsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIDU6Ci0JCQkvKiAweDUwMDAtMHg1RkZGOiBodW1hbiBpbnRlcmZhY2UgaGVscGVycyAqLwotCQkJc3dpdGNoIChoa2V5KSB7Ci0JCQljYXNlIDB4NTAxMDogLyogTGVub3ZvIG5ldyBCSU9TOiBicmlnaHRuZXNzIGNoYW5nZWQgKi8KLQkJCWNhc2UgMHg1MDBiOiAvKiBYNjF0OiB0YWJsZXQgcGVuIGluc2VydGVkIGludG8gYmF5ICovCi0JCQljYXNlIDB4NTAwYzogLyogWDYxdDogdGFibGV0IHBlbiByZW1vdmVkIGZyb20gYmF5ICovCi0JCQkJYnJlYWs7Ci0JCQljYXNlIDB4NTAwOTogLyogWDQxdC1YNjF0OiBzd2l2ZWwgdXAgKHRhYmxldCBtb2RlKSAqLwotCQkJY2FzZSAweDUwMGE6IC8qIFg0MXQtWDYxdDogc3dpdmVsIGRvd24gKG5vcm1hbCBtb2RlKSAqLwotCQkJCXRwYWNwaV9pbnB1dF9zZW5kX3RhYmxldHN3KCk7Ci0JCQkJaG90a2V5X3RhYmxldF9tb2RlX25vdGlmeV9jaGFuZ2UoKTsKLQkJCQlzZW5kX2FjcGlfZXYgPSAwOwotCQkJCWJyZWFrOwotCQkJY2FzZSAweDUwMDE6Ci0JCQljYXNlIDB4NTAwMjoKLQkJCQkvKiBMSUQgc3dpdGNoIGV2ZW50cy4gIERvIG5vdCBwcm9wYWdhdGUgKi8KLQkJCQlpZ25vcmVfYWNwaV9ldiA9IDE7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCXVua19ldiA9IDE7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSA3OgotCQkJLyogMHg3MDAwLTB4N0ZGRjogbWlzYyAqLwotCQkJaWYgKHRwX2ZlYXR1cmVzLmhvdGtleV93bHN3ICYmIGhrZXkgPT0gMHg3MDAwKSB7Ci0JCQkJdHBhY3BpX3NlbmRfcmFkaW9zd191cGRhdGUoKTsKLQkJCQlzZW5kX2FjcGlfZXYgPSAwOwotCQkJCWJyZWFrOwotCQkJfQotCQkJLyogZmFsbHRocm91Z2ggdG8gZGVmYXVsdCAqLwotCQlkZWZhdWx0OgotCQkJdW5rX2V2ID0gMTsKLQkJfQotCQlpZiAodW5rX2V2KSB7Ci0JCQlwcmludGsoVFBBQ1BJX05PVElDRQotCQkJICAgICAgICJ1bmhhbmRsZWQgSEtFWSBldmVudCAweCUwNHhcbiIsIGhrZXkpOwotCQl9Ci0KLQkJLyogTGVnYWN5IGV2ZW50cyAqLwotCQlpZiAoIWlnbm9yZV9hY3BpX2V2ICYmCi0JCSAgICAoc2VuZF9hY3BpX2V2IHx8IGhvdGtleV9yZXBvcnRfbW9kZSA8IDIpKSB7Ci0JCQlhY3BpX2J1c19nZW5lcmF0ZV9wcm9jX2V2ZW50KGlibS0+YWNwaS0+ZGV2aWNlLAotCQkJCQkJICAgICBldmVudCwgaGtleSk7Ci0JCX0KLQotCQkvKiBuZXRsaW5rIGV2ZW50cyAqLwotCQlpZiAoIWlnbm9yZV9hY3BpX2V2ICYmIHNlbmRfYWNwaV9ldikgewotCQkJYWNwaV9idXNfZ2VuZXJhdGVfbmV0bGlua19ldmVudCgKLQkJCQkJaWJtLT5hY3BpLT5kZXZpY2UtPnBucC5kZXZpY2VfY2xhc3MsCi0JCQkJCWlibS0+YWNwaS0+ZGV2aWNlLT5kZXYuYnVzX2lkLAotCQkJCQlldmVudCwgaGtleSk7Ci0JCX0KLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIGhvdGtleV9zdXNwZW5kKHBtX21lc3NhZ2VfdCBzdGF0ZSkKLXsKLQkvKiBEbyB0aGVzZSBvbiBzdXNwZW5kLCB3ZSBnZXQgdGhlIGV2ZW50cyBvbiBlYXJseSByZXN1bWUhICovCi0JaG90a2V5X3dha2V1cF9yZWFzb24gPSBUUF9BQ1BJX1dBS0VVUF9OT05FOwotCWhvdGtleV9hdXRvc2xlZXBfYWNrID0gMDsKLX0KLQotc3RhdGljIHZvaWQgaG90a2V5X3Jlc3VtZSh2b2lkKQotewotCXRwYWNwaV9kaXNhYmxlX2JyaWdodG5lc3NfZGVsYXkoKTsKLQotCWlmIChob3RrZXlfbWFza19nZXQoKSkKLQkJcHJpbnRrKFRQQUNQSV9FUlIKLQkJICAgICAgICJlcnJvciB3aGlsZSB0cnlpbmcgdG8gcmVhZCBob3Qga2V5IG1hc2sgIgotCQkgICAgICAgImZyb20gZmlybXdhcmVcbiIpOwotCXRwYWNwaV9zZW5kX3JhZGlvc3dfdXBkYXRlKCk7Ci0JaG90a2V5X3RhYmxldF9tb2RlX25vdGlmeV9jaGFuZ2UoKTsKLQlob3RrZXlfd2FrZXVwX3JlYXNvbl9ub3RpZnlfY2hhbmdlKCk7Ci0JaG90a2V5X3dha2V1cF9ob3R1bnBsdWdfY29tcGxldGVfbm90aWZ5X2NoYW5nZSgpOwotCWhvdGtleV9wb2xsX3NldHVwX3NhZmUoMCk7Ci19Ci0KLS8qIHByb2NmcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotc3RhdGljIGludCBob3RrZXlfcmVhZChjaGFyICpwKQotewotCWludCByZXMsIHN0YXR1czsKLQlpbnQgbGVuID0gMDsKLQotCWlmICghdHBfZmVhdHVyZXMuaG90a2V5KSB7Ci0JCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICJzdGF0dXM6XHRcdG5vdCBzdXBwb3J0ZWRcbiIpOwotCQlyZXR1cm4gbGVuOwotCX0KLQotCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJmhvdGtleV9tdXRleCkpCi0JCXJldHVybiAtRVJFU1RBUlRTWVM7Ci0JcmVzID0gaG90a2V5X3N0YXR1c19nZXQoJnN0YXR1cyk7Ci0JaWYgKCFyZXMpCi0JCXJlcyA9IGhvdGtleV9tYXNrX2dldCgpOwotCW11dGV4X3VubG9jaygmaG90a2V5X211dGV4KTsKLQlpZiAocmVzKQotCQlyZXR1cm4gcmVzOwotCi0JbGVuICs9IHNwcmludGYocCArIGxlbiwgInN0YXR1czpcdFx0JXNcbiIsIGVuYWJsZWQoc3RhdHVzLCAwKSk7Ci0JaWYgKHRwX2ZlYXR1cmVzLmhvdGtleV9tYXNrKSB7Ci0JCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICJtYXNrOlx0XHQweCUwOHhcbiIsIGhvdGtleV9tYXNrKTsKLQkJbGVuICs9IHNwcmludGYocCArIGxlbiwKLQkJCSAgICAgICAiY29tbWFuZHM6XHRlbmFibGUsIGRpc2FibGUsIHJlc2V0LCA8bWFzaz5cbiIpOwotCX0gZWxzZSB7Ci0JCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICJtYXNrOlx0XHRub3Qgc3VwcG9ydGVkXG4iKTsKLQkJbGVuICs9IHNwcmludGYocCArIGxlbiwgImNvbW1hbmRzOlx0ZW5hYmxlLCBkaXNhYmxlLCByZXNldFxuIik7Ci0JfQotCi0JcmV0dXJuIGxlbjsKLX0KLQotc3RhdGljIGludCBob3RrZXlfd3JpdGUoY2hhciAqYnVmKQotewotCWludCByZXMsIHN0YXR1czsKLQl1MzIgbWFzazsKLQljaGFyICpjbWQ7Ci0KLQlpZiAoIXRwX2ZlYXR1cmVzLmhvdGtleSkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZob3RrZXlfbXV0ZXgpKQotCQlyZXR1cm4gLUVSRVNUQVJUU1lTOwotCi0Jc3RhdHVzID0gLTE7Ci0JbWFzayA9IGhvdGtleV9tYXNrOwotCi0JcmVzID0gMDsKLQl3aGlsZSAoKGNtZCA9IG5leHRfY21kKCZidWYpKSkgewotCQlpZiAoc3RybGVuY21wKGNtZCwgImVuYWJsZSIpID09IDApIHsKLQkJCXN0YXR1cyA9IDE7Ci0JCX0gZWxzZSBpZiAoc3RybGVuY21wKGNtZCwgImRpc2FibGUiKSA9PSAwKSB7Ci0JCQlzdGF0dXMgPSAwOwotCQl9IGVsc2UgaWYgKHN0cmxlbmNtcChjbWQsICJyZXNldCIpID09IDApIHsKLQkJCXN0YXR1cyA9IGhvdGtleV9vcmlnX3N0YXR1czsKLQkJCW1hc2sgPSBob3RrZXlfb3JpZ19tYXNrOwotCQl9IGVsc2UgaWYgKHNzY2FuZihjbWQsICIweCV4IiwgJm1hc2spID09IDEpIHsKLQkJCS8qIG1hc2sgc2V0ICovCi0JCX0gZWxzZSBpZiAoc3NjYW5mKGNtZCwgIiV4IiwgJm1hc2spID09IDEpIHsKLQkJCS8qIG1hc2sgc2V0ICovCi0JCX0gZWxzZSB7Ci0JCQlyZXMgPSAtRUlOVkFMOwotCQkJZ290byBlcnJleGl0OwotCQl9Ci0JfQotCWlmIChzdGF0dXMgIT0gLTEpCi0JCXJlcyA9IGhvdGtleV9zdGF0dXNfc2V0KHN0YXR1cyk7Ci0KLQlpZiAoIXJlcyAmJiBtYXNrICE9IGhvdGtleV9tYXNrKQotCQlyZXMgPSBob3RrZXlfbWFza19zZXQobWFzayk7Ci0KLWVycmV4aXQ6Ci0JbXV0ZXhfdW5sb2NrKCZob3RrZXlfbXV0ZXgpOwotCXJldHVybiByZXM7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYWNwaV9kZXZpY2VfaWQgaWJtX2h0a19kZXZpY2VfaWRzW10gPSB7Ci0Je1RQQUNQSV9BQ1BJX0hLRVlfSElELCAwfSwKLQl7IiIsIDB9LAotfTsKLQotc3RhdGljIHN0cnVjdCB0cF9hY3BpX2Rydl9zdHJ1Y3QgaWJtX2hvdGtleV9hY3BpZHJpdmVyID0gewotCS5oaWQgPSBpYm1faHRrX2RldmljZV9pZHMsCi0JLm5vdGlmeSA9IGhvdGtleV9ub3RpZnksCi0JLmhhbmRsZSA9ICZoa2V5X2hhbmRsZSwKLQkudHlwZSA9IEFDUElfREVWSUNFX05PVElGWSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgaWJtX3N0cnVjdCBob3RrZXlfZHJpdmVyX2RhdGEgPSB7Ci0JLm5hbWUgPSAiaG90a2V5IiwKLQkucmVhZCA9IGhvdGtleV9yZWFkLAotCS53cml0ZSA9IGhvdGtleV93cml0ZSwKLQkuZXhpdCA9IGhvdGtleV9leGl0LAotCS5yZXN1bWUgPSBob3RrZXlfcmVzdW1lLAotCS5zdXNwZW5kID0gaG90a2V5X3N1c3BlbmQsCi0JLmFjcGkgPSAmaWJtX2hvdGtleV9hY3BpZHJpdmVyLAotfTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEJsdWV0b290aCBzdWJkcml2ZXIKLSAqLwotCi1lbnVtIHsKLQkvKiBBQ1BJIEdCREMvU0JEQyBiaXRzICovCi0JVFBfQUNQSV9CTFVFVE9PVEhfSFdQUkVTRU5UCT0gMHgwMSwJLyogQmx1ZXRvb3RoIGh3IGF2YWlsYWJsZSAqLwotCVRQX0FDUElfQkxVRVRPT1RIX1JBRElPU1NXCT0gMHgwMiwJLyogQmx1ZXRvb3RoIHJhZGlvIGVuYWJsZWQgKi8KLQlUUF9BQ1BJX0JMVUVUT09USF9VTksJCT0gMHgwNCwJLyogdW5rbm93biBmdW5jdGlvbiAqLwotfTsKLQotc3RhdGljIHN0cnVjdCByZmtpbGwgKnRwYWNwaV9ibHVldG9vdGhfcmZraWxsOwotCi1zdGF0aWMgaW50IGJsdWV0b290aF9nZXRfcmFkaW9zdyh2b2lkKQotewotCWludCBzdGF0dXM7Ci0KLQlpZiAoIXRwX2ZlYXR1cmVzLmJsdWV0b290aCkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQkvKiBXTFNXIG92ZXJyaWRlcyBibHVldG9vdGggaW4gZmlybXdhcmUvaGFyZHdhcmUsIHJlZmxlY3QgdGhhdCAqLwotCWlmICh0cF9mZWF0dXJlcy5ob3RrZXlfd2xzdyAmJiAhaG90a2V5X2dldF93bHN3KCZzdGF0dXMpICYmICFzdGF0dXMpCi0JCXJldHVybiBSRktJTExfU1RBVEVfSEFSRF9CTE9DS0VEOwotCi0JaWYgKCFhY3BpX2V2YWxmKGhrZXlfaGFuZGxlLCAmc3RhdHVzLCAiR0JEQyIsICJkIikpCi0JCXJldHVybiAtRUlPOwotCi0JcmV0dXJuICgoc3RhdHVzICYgVFBfQUNQSV9CTFVFVE9PVEhfUkFESU9TU1cpICE9IDApID8KLQkJUkZLSUxMX1NUQVRFX1VOQkxPQ0tFRCA6IFJGS0lMTF9TVEFURV9TT0ZUX0JMT0NLRUQ7Ci19Ci0KLXN0YXRpYyB2b2lkIGJsdWV0b290aF91cGRhdGVfcmZrKHZvaWQpCi17Ci0JaW50IHN0YXR1czsKLQotCWlmICghdHBhY3BpX2JsdWV0b290aF9yZmtpbGwpCi0JCXJldHVybjsKLQotCXN0YXR1cyA9IGJsdWV0b290aF9nZXRfcmFkaW9zdygpOwotCWlmIChzdGF0dXMgPCAwKQotCQlyZXR1cm47Ci0JcmZraWxsX2ZvcmNlX3N0YXRlKHRwYWNwaV9ibHVldG9vdGhfcmZraWxsLCBzdGF0dXMpOwotfQotCi1zdGF0aWMgaW50IGJsdWV0b290aF9zZXRfcmFkaW9zdyhpbnQgcmFkaW9fb24sIGludCB1cGRhdGVfcmZrKQotewotCWludCBzdGF0dXM7Ci0KLQlpZiAoIXRwX2ZlYXR1cmVzLmJsdWV0b290aCkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQkvKiBXTFNXIG92ZXJyaWRlcyBibHVldG9vdGggaW4gZmlybXdhcmUvaGFyZHdhcmUsIGJ1dCB0aGVyZSBpcyBubwotCSAqIHJlYXNvbiB0byByaXNrIHdlaXJkIGJlaGF2aW91ci4gKi8KLQlpZiAodHBfZmVhdHVyZXMuaG90a2V5X3dsc3cgJiYgIWhvdGtleV9nZXRfd2xzdygmc3RhdHVzKSAmJiAhc3RhdHVzCi0JICAgICYmIHJhZGlvX29uKQotCQlyZXR1cm4gLUVQRVJNOwotCi0JaWYgKCFhY3BpX2V2YWxmKGhrZXlfaGFuZGxlLCAmc3RhdHVzLCAiR0JEQyIsICJkIikpCi0JCXJldHVybiAtRUlPOwotCWlmIChyYWRpb19vbikKLQkJc3RhdHVzIHw9IFRQX0FDUElfQkxVRVRPT1RIX1JBRElPU1NXOwotCWVsc2UKLQkJc3RhdHVzICY9IH5UUF9BQ1BJX0JMVUVUT09USF9SQURJT1NTVzsKLQlpZiAoIWFjcGlfZXZhbGYoaGtleV9oYW5kbGUsIE5VTEwsICJTQkRDIiwgInZkIiwgc3RhdHVzKSkKLQkJcmV0dXJuIC1FSU87Ci0KLQlpZiAodXBkYXRlX3JmaykKLQkJYmx1ZXRvb3RoX3VwZGF0ZV9yZmsoKTsKLQotCXJldHVybiAwOwotfQotCi0vKiBzeXNmcyBibHVldG9vdGggZW5hYmxlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLXN0YXRpYyBzc2l6ZV90IGJsdWV0b290aF9lbmFibGVfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCSAgIGNoYXIgKmJ1ZikKLXsKLQlpbnQgc3RhdHVzOwotCi0Jc3RhdHVzID0gYmx1ZXRvb3RoX2dldF9yYWRpb3N3KCk7Ci0JaWYgKHN0YXR1cyA8IDApCi0JCXJldHVybiBzdGF0dXM7Ci0KLQlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZFxuIiwKLQkJCShzdGF0dXMgPT0gUkZLSUxMX1NUQVRFX1VOQkxPQ0tFRCkgPyAxIDogMCk7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGJsdWV0b290aF9lbmFibGVfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAotCQkJICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQkJICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQotewotCXVuc2lnbmVkIGxvbmcgdDsKLQlpbnQgcmVzOwotCi0JaWYgKHBhcnNlX3N0cnRvdWwoYnVmLCAxLCAmdCkpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JcmVzID0gYmx1ZXRvb3RoX3NldF9yYWRpb3N3KHQsIDEpOwotCi0JcmV0dXJuIChyZXMpID8gcmVzIDogY291bnQ7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSBkZXZfYXR0cl9ibHVldG9vdGhfZW5hYmxlID0KLQlfX0FUVFIoYmx1ZXRvb3RoX2VuYWJsZSwgU19JV1VTUiB8IFNfSVJVR08sCi0JCWJsdWV0b290aF9lbmFibGVfc2hvdywgYmx1ZXRvb3RoX2VuYWJsZV9zdG9yZSk7Ci0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi1zdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqYmx1ZXRvb3RoX2F0dHJpYnV0ZXNbXSA9IHsKLQkmZGV2X2F0dHJfYmx1ZXRvb3RoX2VuYWJsZS5hdHRyLAotCU5VTEwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGJsdWV0b290aF9hdHRyX2dyb3VwID0gewotCS5hdHRycyA9IGJsdWV0b290aF9hdHRyaWJ1dGVzLAotfTsKLQotc3RhdGljIGludCB0cGFjcGlfYmx1ZXRvb3RoX3Jma19nZXQodm9pZCAqZGF0YSwgZW51bSByZmtpbGxfc3RhdGUgKnN0YXRlKQotewotCWludCBidHMgPSBibHVldG9vdGhfZ2V0X3JhZGlvc3coKTsKLQotCWlmIChidHMgPCAwKQotCQlyZXR1cm4gYnRzOwotCi0JKnN0YXRlID0gYnRzOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHRwYWNwaV9ibHVldG9vdGhfcmZrX3NldCh2b2lkICpkYXRhLCBlbnVtIHJma2lsbF9zdGF0ZSBzdGF0ZSkKLXsKLQlyZXR1cm4gYmx1ZXRvb3RoX3NldF9yYWRpb3N3KChzdGF0ZSA9PSBSRktJTExfU1RBVEVfVU5CTE9DS0VEKSwgMCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGJsdWV0b290aF9leGl0KHZvaWQpCi17Ci0JaWYgKHRwYWNwaV9ibHVldG9vdGhfcmZraWxsKQotCQlyZmtpbGxfdW5yZWdpc3Rlcih0cGFjcGlfYmx1ZXRvb3RoX3Jma2lsbCk7Ci0KLQlzeXNmc19yZW1vdmVfZ3JvdXAoJnRwYWNwaV9wZGV2LT5kZXYua29iaiwKLQkJCSZibHVldG9vdGhfYXR0cl9ncm91cCk7Ci19Ci0KLXN0YXRpYyBpbnQgX19pbml0IGJsdWV0b290aF9pbml0KHN0cnVjdCBpYm1faW5pdF9zdHJ1Y3QgKmlpYm0pCi17Ci0JaW50IHJlczsKLQlpbnQgc3RhdHVzID0gMDsKLQotCXZkYmdfcHJpbnRrKFRQQUNQSV9EQkdfSU5JVCwgImluaXRpYWxpemluZyBibHVldG9vdGggc3ViZHJpdmVyXG4iKTsKLQotCVRQQUNQSV9BQ1BJSEFORExFX0lOSVQoaGtleSk7Ci0KLQkvKiBibHVldG9vdGggbm90IHN1cHBvcnRlZCBvbiA1NzAsIDYwMGUveCwgNzcwZSwgNzcweCwgQTIxZSwgQTJ4bS9wLAotCSAgIEc0eCwgUjMwLCBSMzEsIFI0MGUsIFI1MGUsIFQyMC0yMiwgWDIwLTIxICovCi0JdHBfZmVhdHVyZXMuYmx1ZXRvb3RoID0gaGtleV9oYW5kbGUgJiYKLQkgICAgYWNwaV9ldmFsZihoa2V5X2hhbmRsZSwgJnN0YXR1cywgIkdCREMiLCAicWQiKTsKLQotCXZkYmdfcHJpbnRrKFRQQUNQSV9EQkdfSU5JVCwgImJsdWV0b290aCBpcyAlcywgc3RhdHVzIDB4JTAyeFxuIiwKLQkJc3RyX3N1cHBvcnRlZCh0cF9mZWF0dXJlcy5ibHVldG9vdGgpLAotCQlzdGF0dXMpOwotCi0JaWYgKHRwX2ZlYXR1cmVzLmJsdWV0b290aCAmJgotCSAgICAhKHN0YXR1cyAmIFRQX0FDUElfQkxVRVRPT1RIX0hXUFJFU0VOVCkpIHsKLQkJLyogbm8gYmx1ZXRvb3RoIGhhcmR3YXJlIHByZXNlbnQgaW4gc3lzdGVtICovCi0JCXRwX2ZlYXR1cmVzLmJsdWV0b290aCA9IDA7Ci0JCWRiZ19wcmludGsoVFBBQ1BJX0RCR19JTklULAotCQkJICAgImJsdWV0b290aCBoYXJkd2FyZSBub3QgaW5zdGFsbGVkXG4iKTsKLQl9Ci0KLQlpZiAoIXRwX2ZlYXR1cmVzLmJsdWV0b290aCkKLQkJcmV0dXJuIDE7Ci0KLQlyZXMgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJnRwYWNwaV9wZGV2LT5kZXYua29iaiwKLQkJCQkmYmx1ZXRvb3RoX2F0dHJfZ3JvdXApOwotCWlmIChyZXMpCi0JCXJldHVybiByZXM7Ci0KLQlyZXMgPSB0cGFjcGlfbmV3X3Jma2lsbChUUEFDUElfUkZLX0JMVUVUT09USF9TV19JRCwKLQkJCQkmdHBhY3BpX2JsdWV0b290aF9yZmtpbGwsCi0JCQkJUkZLSUxMX1RZUEVfQkxVRVRPT1RILAotCQkJCSJ0cGFjcGlfYmx1ZXRvb3RoX3N3IiwKLQkJCQl0cGFjcGlfYmx1ZXRvb3RoX3Jma19zZXQsCi0JCQkJdHBhY3BpX2JsdWV0b290aF9yZmtfZ2V0KTsKLQlpZiAocmVzKSB7Ci0JCWJsdWV0b290aF9leGl0KCk7Ci0JCXJldHVybiByZXM7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qIHByb2NmcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotc3RhdGljIGludCBibHVldG9vdGhfcmVhZChjaGFyICpwKQotewotCWludCBsZW4gPSAwOwotCWludCBzdGF0dXMgPSBibHVldG9vdGhfZ2V0X3JhZGlvc3coKTsKLQotCWlmICghdHBfZmVhdHVyZXMuYmx1ZXRvb3RoKQotCQlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAic3RhdHVzOlx0XHRub3Qgc3VwcG9ydGVkXG4iKTsKLQllbHNlIHsKLQkJbGVuICs9IHNwcmludGYocCArIGxlbiwgInN0YXR1czpcdFx0JXNcbiIsCi0JCQkJKHN0YXR1cyA9PSBSRktJTExfU1RBVEVfVU5CTE9DS0VEKSA/Ci0JCQkJCSJlbmFibGVkIiA6ICJkaXNhYmxlZCIpOwotCQlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAiY29tbWFuZHM6XHRlbmFibGUsIGRpc2FibGVcbiIpOwotCX0KLQotCXJldHVybiBsZW47Ci19Ci0KLXN0YXRpYyBpbnQgYmx1ZXRvb3RoX3dyaXRlKGNoYXIgKmJ1ZikKLXsKLQljaGFyICpjbWQ7Ci0KLQlpZiAoIXRwX2ZlYXR1cmVzLmJsdWV0b290aCkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQl3aGlsZSAoKGNtZCA9IG5leHRfY21kKCZidWYpKSkgewotCQlpZiAoc3RybGVuY21wKGNtZCwgImVuYWJsZSIpID09IDApIHsKLQkJCWJsdWV0b290aF9zZXRfcmFkaW9zdygxLCAxKTsKLQkJfSBlbHNlIGlmIChzdHJsZW5jbXAoY21kLCAiZGlzYWJsZSIpID09IDApIHsKLQkJCWJsdWV0b290aF9zZXRfcmFkaW9zdygwLCAxKTsKLQkJfSBlbHNlCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHN0cnVjdCBpYm1fc3RydWN0IGJsdWV0b290aF9kcml2ZXJfZGF0YSA9IHsKLQkubmFtZSA9ICJibHVldG9vdGgiLAotCS5yZWFkID0gYmx1ZXRvb3RoX3JlYWQsCi0JLndyaXRlID0gYmx1ZXRvb3RoX3dyaXRlLAotCS5leGl0ID0gYmx1ZXRvb3RoX2V4aXQsCi19OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogV2FuIHN1YmRyaXZlcgotICovCi0KLWVudW0gewotCS8qIEFDUEkgR1dBTi9TV0FOIGJpdHMgKi8KLQlUUF9BQ1BJX1dBTkNBUkRfSFdQUkVTRU5UCT0gMHgwMSwJLyogV2FuIGh3IGF2YWlsYWJsZSAqLwotCVRQX0FDUElfV0FOQ0FSRF9SQURJT1NTVwk9IDB4MDIsCS8qIFdhbiByYWRpbyBlbmFibGVkICovCi0JVFBfQUNQSV9XQU5DQVJEX1VOSwkJPSAweDA0LAkvKiB1bmtub3duIGZ1bmN0aW9uICovCi19OwotCi1zdGF0aWMgc3RydWN0IHJma2lsbCAqdHBhY3BpX3dhbl9yZmtpbGw7Ci0KLXN0YXRpYyBpbnQgd2FuX2dldF9yYWRpb3N3KHZvaWQpCi17Ci0JaW50IHN0YXR1czsKLQotCWlmICghdHBfZmVhdHVyZXMud2FuKQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCS8qIFdMU1cgb3ZlcnJpZGVzIFdXQU4gaW4gZmlybXdhcmUvaGFyZHdhcmUsIHJlZmxlY3QgdGhhdCAqLwotCWlmICh0cF9mZWF0dXJlcy5ob3RrZXlfd2xzdyAmJiAhaG90a2V5X2dldF93bHN3KCZzdGF0dXMpICYmICFzdGF0dXMpCi0JCXJldHVybiBSRktJTExfU1RBVEVfSEFSRF9CTE9DS0VEOwotCi0JaWYgKCFhY3BpX2V2YWxmKGhrZXlfaGFuZGxlLCAmc3RhdHVzLCAiR1dBTiIsICJkIikpCi0JCXJldHVybiAtRUlPOwotCi0JcmV0dXJuICgoc3RhdHVzICYgVFBfQUNQSV9XQU5DQVJEX1JBRElPU1NXKSAhPSAwKSA/Ci0JCVJGS0lMTF9TVEFURV9VTkJMT0NLRUQgOiBSRktJTExfU1RBVEVfU09GVF9CTE9DS0VEOwotfQotCi1zdGF0aWMgdm9pZCB3YW5fdXBkYXRlX3Jmayh2b2lkKQotewotCWludCBzdGF0dXM7Ci0KLQlpZiAoIXRwYWNwaV93YW5fcmZraWxsKQotCQlyZXR1cm47Ci0KLQlzdGF0dXMgPSB3YW5fZ2V0X3JhZGlvc3coKTsKLQlpZiAoc3RhdHVzIDwgMCkKLQkJcmV0dXJuOwotCXJma2lsbF9mb3JjZV9zdGF0ZSh0cGFjcGlfd2FuX3Jma2lsbCwgc3RhdHVzKTsKLX0KLQotc3RhdGljIGludCB3YW5fc2V0X3JhZGlvc3coaW50IHJhZGlvX29uLCBpbnQgdXBkYXRlX3JmaykKLXsKLQlpbnQgc3RhdHVzOwotCi0JaWYgKCF0cF9mZWF0dXJlcy53YW4pCi0JCXJldHVybiAtRU5PREVWOwotCi0JLyogV0xTVyBvdmVycmlkZXMgYmx1ZXRvb3RoIGluIGZpcm13YXJlL2hhcmR3YXJlLCBidXQgdGhlcmUgaXMgbm8KLQkgKiByZWFzb24gdG8gcmlzayB3ZWlyZCBiZWhhdmlvdXIuICovCi0JaWYgKHRwX2ZlYXR1cmVzLmhvdGtleV93bHN3ICYmICFob3RrZXlfZ2V0X3dsc3coJnN0YXR1cykgJiYgIXN0YXR1cwotCSAgICAmJiByYWRpb19vbikKLQkJcmV0dXJuIC1FUEVSTTsKLQotCWlmICghYWNwaV9ldmFsZihoa2V5X2hhbmRsZSwgJnN0YXR1cywgIkdXQU4iLCAiZCIpKQotCQlyZXR1cm4gLUVJTzsKLQlpZiAocmFkaW9fb24pCi0JCXN0YXR1cyB8PSBUUF9BQ1BJX1dBTkNBUkRfUkFESU9TU1c7Ci0JZWxzZQotCQlzdGF0dXMgJj0gflRQX0FDUElfV0FOQ0FSRF9SQURJT1NTVzsKLQlpZiAoIWFjcGlfZXZhbGYoaGtleV9oYW5kbGUsIE5VTEwsICJTV0FOIiwgInZkIiwgc3RhdHVzKSkKLQkJcmV0dXJuIC1FSU87Ci0KLQlpZiAodXBkYXRlX3JmaykKLQkJd2FuX3VwZGF0ZV9yZmsoKTsKLQotCXJldHVybiAwOwotfQotCi0vKiBzeXNmcyB3YW4gZW5hYmxlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLXN0YXRpYyBzc2l6ZV90IHdhbl9lbmFibGVfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCSAgIGNoYXIgKmJ1ZikKLXsKLQlpbnQgc3RhdHVzOwotCi0Jc3RhdHVzID0gd2FuX2dldF9yYWRpb3N3KCk7Ci0JaWYgKHN0YXR1cyA8IDApCi0JCXJldHVybiBzdGF0dXM7Ci0KLQlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZFxuIiwKLQkJCShzdGF0dXMgPT0gUkZLSUxMX1NUQVRFX1VOQkxPQ0tFRCkgPyAxIDogMCk7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IHdhbl9lbmFibGVfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAotCQkJICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQkJICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQotewotCXVuc2lnbmVkIGxvbmcgdDsKLQlpbnQgcmVzOwotCi0JaWYgKHBhcnNlX3N0cnRvdWwoYnVmLCAxLCAmdCkpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JcmVzID0gd2FuX3NldF9yYWRpb3N3KHQsIDEpOwotCi0JcmV0dXJuIChyZXMpID8gcmVzIDogY291bnQ7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSBkZXZfYXR0cl93YW5fZW5hYmxlID0KLQlfX0FUVFIod3dhbl9lbmFibGUsIFNfSVdVU1IgfCBTX0lSVUdPLAotCQl3YW5fZW5hYmxlX3Nob3csIHdhbl9lbmFibGVfc3RvcmUpOwotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKndhbl9hdHRyaWJ1dGVzW10gPSB7Ci0JJmRldl9hdHRyX3dhbl9lbmFibGUuYXR0ciwKLQlOVUxMCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCB3YW5fYXR0cl9ncm91cCA9IHsKLQkuYXR0cnMgPSB3YW5fYXR0cmlidXRlcywKLX07Ci0KLXN0YXRpYyBpbnQgdHBhY3BpX3dhbl9yZmtfZ2V0KHZvaWQgKmRhdGEsIGVudW0gcmZraWxsX3N0YXRlICpzdGF0ZSkKLXsKLQlpbnQgd2FucyA9IHdhbl9nZXRfcmFkaW9zdygpOwotCi0JaWYgKHdhbnMgPCAwKQotCQlyZXR1cm4gd2FuczsKLQotCSpzdGF0ZSA9IHdhbnM7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdHBhY3BpX3dhbl9yZmtfc2V0KHZvaWQgKmRhdGEsIGVudW0gcmZraWxsX3N0YXRlIHN0YXRlKQotewotCXJldHVybiB3YW5fc2V0X3JhZGlvc3coKHN0YXRlID09IFJGS0lMTF9TVEFURV9VTkJMT0NLRUQpLCAwKTsKLX0KLQotc3RhdGljIHZvaWQgd2FuX2V4aXQodm9pZCkKLXsKLQlpZiAodHBhY3BpX3dhbl9yZmtpbGwpCi0JCXJma2lsbF91bnJlZ2lzdGVyKHRwYWNwaV93YW5fcmZraWxsKTsKLQotCXN5c2ZzX3JlbW92ZV9ncm91cCgmdHBhY3BpX3BkZXYtPmRldi5rb2JqLAotCQkmd2FuX2F0dHJfZ3JvdXApOwotfQotCi1zdGF0aWMgaW50IF9faW5pdCB3YW5faW5pdChzdHJ1Y3QgaWJtX2luaXRfc3RydWN0ICppaWJtKQotewotCWludCByZXM7Ci0JaW50IHN0YXR1cyA9IDA7Ci0KLQl2ZGJnX3ByaW50ayhUUEFDUElfREJHX0lOSVQsICJpbml0aWFsaXppbmcgd2FuIHN1YmRyaXZlclxuIik7Ci0KLQlUUEFDUElfQUNQSUhBTkRMRV9JTklUKGhrZXkpOwotCi0JdHBfZmVhdHVyZXMud2FuID0gaGtleV9oYW5kbGUgJiYKLQkgICAgYWNwaV9ldmFsZihoa2V5X2hhbmRsZSwgJnN0YXR1cywgIkdXQU4iLCAicWQiKTsKLQotCXZkYmdfcHJpbnRrKFRQQUNQSV9EQkdfSU5JVCwgIndhbiBpcyAlcywgc3RhdHVzIDB4JTAyeFxuIiwKLQkJc3RyX3N1cHBvcnRlZCh0cF9mZWF0dXJlcy53YW4pLAotCQlzdGF0dXMpOwotCi0JaWYgKHRwX2ZlYXR1cmVzLndhbiAmJgotCSAgICAhKHN0YXR1cyAmIFRQX0FDUElfV0FOQ0FSRF9IV1BSRVNFTlQpKSB7Ci0JCS8qIG5vIHdhbiBoYXJkd2FyZSBwcmVzZW50IGluIHN5c3RlbSAqLwotCQl0cF9mZWF0dXJlcy53YW4gPSAwOwotCQlkYmdfcHJpbnRrKFRQQUNQSV9EQkdfSU5JVCwKLQkJCSAgICJ3YW4gaGFyZHdhcmUgbm90IGluc3RhbGxlZFxuIik7Ci0JfQotCi0JaWYgKCF0cF9mZWF0dXJlcy53YW4pCi0JCXJldHVybiAxOwotCi0JcmVzID0gc3lzZnNfY3JlYXRlX2dyb3VwKCZ0cGFjcGlfcGRldi0+ZGV2LmtvYmosCi0JCQkJJndhbl9hdHRyX2dyb3VwKTsKLQlpZiAocmVzKQotCQlyZXR1cm4gcmVzOwotCi0JcmVzID0gdHBhY3BpX25ld19yZmtpbGwoVFBBQ1BJX1JGS19XV0FOX1NXX0lELAotCQkJCSZ0cGFjcGlfd2FuX3Jma2lsbCwKLQkJCQlSRktJTExfVFlQRV9XV0FOLAotCQkJCSJ0cGFjcGlfd3dhbl9zdyIsCi0JCQkJdHBhY3BpX3dhbl9yZmtfc2V0LAotCQkJCXRwYWNwaV93YW5fcmZrX2dldCk7Ci0JaWYgKHJlcykgewotCQl3YW5fZXhpdCgpOwotCQlyZXR1cm4gcmVzOwotCX0KLQotCXJldHVybiAwOwotfQotCi0vKiBwcm9jZnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLXN0YXRpYyBpbnQgd2FuX3JlYWQoY2hhciAqcCkKLXsKLQlpbnQgbGVuID0gMDsKLQlpbnQgc3RhdHVzID0gd2FuX2dldF9yYWRpb3N3KCk7Ci0KLQlpZiAoIXRwX2ZlYXR1cmVzLndhbikKLQkJbGVuICs9IHNwcmludGYocCArIGxlbiwgInN0YXR1czpcdFx0bm90IHN1cHBvcnRlZFxuIik7Ci0JZWxzZSB7Ci0JCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICJzdGF0dXM6XHRcdCVzXG4iLAotCQkJCShzdGF0dXMgPT0gUkZLSUxMX1NUQVRFX1VOQkxPQ0tFRCkgPwotCQkJCQkiZW5hYmxlZCIgOiAiZGlzYWJsZWQiKTsKLQkJbGVuICs9IHNwcmludGYocCArIGxlbiwgImNvbW1hbmRzOlx0ZW5hYmxlLCBkaXNhYmxlXG4iKTsKLQl9Ci0KLQlyZXR1cm4gbGVuOwotfQotCi1zdGF0aWMgaW50IHdhbl93cml0ZShjaGFyICpidWYpCi17Ci0JY2hhciAqY21kOwotCi0JaWYgKCF0cF9mZWF0dXJlcy53YW4pCi0JCXJldHVybiAtRU5PREVWOwotCi0Jd2hpbGUgKChjbWQgPSBuZXh0X2NtZCgmYnVmKSkpIHsKLQkJaWYgKHN0cmxlbmNtcChjbWQsICJlbmFibGUiKSA9PSAwKSB7Ci0JCQl3YW5fc2V0X3JhZGlvc3coMSwgMSk7Ci0JCX0gZWxzZSBpZiAoc3RybGVuY21wKGNtZCwgImRpc2FibGUiKSA9PSAwKSB7Ci0JCQl3YW5fc2V0X3JhZGlvc3coMCwgMSk7Ci0JCX0gZWxzZQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgaWJtX3N0cnVjdCB3YW5fZHJpdmVyX2RhdGEgPSB7Ci0JLm5hbWUgPSAid2FuIiwKLQkucmVhZCA9IHdhbl9yZWFkLAotCS53cml0ZSA9IHdhbl93cml0ZSwKLQkuZXhpdCA9IHdhbl9leGl0LAotfTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFZpZGVvIHN1YmRyaXZlcgotICovCi0KLSNpZmRlZiBDT05GSUdfVEhJTktQQURfQUNQSV9WSURFTwotCi1lbnVtIHZpZGVvX2FjY2Vzc19tb2RlIHsKLQlUUEFDUElfVklERU9fTk9ORSA9IDAsCi0JVFBBQ1BJX1ZJREVPXzU3MCwJLyogNTcwICovCi0JVFBBQ1BJX1ZJREVPXzc3MCwJLyogNjAwZS94LCA3NzBlLCA3NzB4ICovCi0JVFBBQ1BJX1ZJREVPX05FVywJLyogYWxsIG90aGVycyAqLwotfTsKLQotZW51bSB7CS8qIHZpZGVvIHN0YXR1cyBmbGFncywgYmFzZWQgb24gVklERU9fNTcwICovCi0JVFBfQUNQSV9WSURFT19TX0xDRCA9IDB4MDEsCS8qIExDRCBvdXRwdXQgZW5hYmxlZCAqLwotCVRQX0FDUElfVklERU9fU19DUlQgPSAweDAyLAkvKiBDUlQgb3V0cHV0IGVuYWJsZWQgKi8KLQlUUF9BQ1BJX1ZJREVPX1NfRFZJID0gMHgwOCwJLyogRFZJIG91dHB1dCBlbmFibGVkICovCi19OwotCi1lbnVtIHsgIC8qIFRQQUNQSV9WSURFT181NzAgY29uc3RhbnRzICovCi0JVFBfQUNQSV9WSURFT181NzBfUEhTQ01EID0gMHg4NywJLyogdW5rbm93biBtYWdpYyBjb25zdGFudCA6KCAqLwotCVRQX0FDUElfVklERU9fNTcwX1BIU01BU0sgPSAweDAzLAkvKiBQSFMgYml0cyB0aGF0IG1hcCB0bwotCQkJCQkJICogdmlkZW9fc3RhdHVzX2ZsYWdzICovCi0JVFBfQUNQSV9WSURFT181NzBfUEhTMkNNRCA9IDB4OGIsCS8qIHVua25vd24gbWFnaWMgY29uc3RhbnQgOiggKi8KLQlUUF9BQ1BJX1ZJREVPXzU3MF9QSFMyU0VUID0gMHg4MCwJLyogdW5rbm93biBtYWdpYyBjb25zdGFudCA6KCAqLwotfTsKLQotc3RhdGljIGVudW0gdmlkZW9fYWNjZXNzX21vZGUgdmlkZW9fc3VwcG9ydGVkOwotc3RhdGljIGludCB2aWRlb19vcmlnX2F1dG9zdzsKLQotc3RhdGljIGludCB2aWRlb19hdXRvc3dfZ2V0KHZvaWQpOwotc3RhdGljIGludCB2aWRlb19hdXRvc3dfc2V0KGludCBlbmFibGUpOwotCi1UUEFDUElfSEFORExFKHZpZDIsIHJvb3QsICJcXF9TQi5QQ0kwLkFHUEIuVklEIik7CS8qIEc0MSAqLwotCi1zdGF0aWMgaW50IF9faW5pdCB2aWRlb19pbml0KHN0cnVjdCBpYm1faW5pdF9zdHJ1Y3QgKmlpYm0pCi17Ci0JaW50IGl2Z2E7Ci0KLQl2ZGJnX3ByaW50ayhUUEFDUElfREJHX0lOSVQsICJpbml0aWFsaXppbmcgdmlkZW8gc3ViZHJpdmVyXG4iKTsKLQotCVRQQUNQSV9BQ1BJSEFORExFX0lOSVQodmlkKTsKLQlUUEFDUElfQUNQSUhBTkRMRV9JTklUKHZpZDIpOwotCi0JaWYgKHZpZDJfaGFuZGxlICYmIGFjcGlfZXZhbGYoTlVMTCwgJml2Z2EsICJcXElWR0EiLCAiZCIpICYmIGl2Z2EpCi0JCS8qIEc0MSwgYXNzdW1lIElWR0EgZG9lc24ndCBjaGFuZ2UgKi8KLQkJdmlkX2hhbmRsZSA9IHZpZDJfaGFuZGxlOwotCi0JaWYgKCF2aWRfaGFuZGxlKQotCQkvKiB2aWRlbyBzd2l0Y2hpbmcgbm90IHN1cHBvcnRlZCBvbiBSMzAsIFIzMSAqLwotCQl2aWRlb19zdXBwb3J0ZWQgPSBUUEFDUElfVklERU9fTk9ORTsKLQllbHNlIGlmIChhY3BpX2V2YWxmKHZpZF9oYW5kbGUsICZ2aWRlb19vcmlnX2F1dG9zdywgIlNXSVQiLCAicWQiKSkKLQkJLyogNTcwICovCi0JCXZpZGVvX3N1cHBvcnRlZCA9IFRQQUNQSV9WSURFT181NzA7Ci0JZWxzZSBpZiAoYWNwaV9ldmFsZih2aWRfaGFuZGxlLCAmdmlkZW9fb3JpZ19hdXRvc3csICJeVkFETCIsICJxZCIpKQotCQkvKiA2MDBlL3gsIDc3MGUsIDc3MHggKi8KLQkJdmlkZW9fc3VwcG9ydGVkID0gVFBBQ1BJX1ZJREVPXzc3MDsKLQllbHNlCi0JCS8qIGFsbCBvdGhlcnMgKi8KLQkJdmlkZW9fc3VwcG9ydGVkID0gVFBBQ1BJX1ZJREVPX05FVzsKLQotCXZkYmdfcHJpbnRrKFRQQUNQSV9EQkdfSU5JVCwgInZpZGVvIGlzICVzLCBtb2RlICVkXG4iLAotCQlzdHJfc3VwcG9ydGVkKHZpZGVvX3N1cHBvcnRlZCAhPSBUUEFDUElfVklERU9fTk9ORSksCi0JCXZpZGVvX3N1cHBvcnRlZCk7Ci0KLQlyZXR1cm4gKHZpZGVvX3N1cHBvcnRlZCAhPSBUUEFDUElfVklERU9fTk9ORSk/IDAgOiAxOwotfQotCi1zdGF0aWMgdm9pZCB2aWRlb19leGl0KHZvaWQpCi17Ci0JZGJnX3ByaW50ayhUUEFDUElfREJHX0VYSVQsCi0JCSAgICJyZXN0b3Jpbmcgb3JpZ2luYWwgdmlkZW8gYXV0b3N3aXRjaCBtb2RlXG4iKTsKLQlpZiAodmlkZW9fYXV0b3N3X3NldCh2aWRlb19vcmlnX2F1dG9zdykpCi0JCXByaW50ayhUUEFDUElfRVJSICJlcnJvciB3aGlsZSB0cnlpbmcgdG8gcmVzdG9yZSBvcmlnaW5hbCAiCi0JCQkidmlkZW8gYXV0b3N3aXRjaCBtb2RlXG4iKTsKLX0KLQotc3RhdGljIGludCB2aWRlb19vdXRwdXRzd19nZXQodm9pZCkKLXsKLQlpbnQgc3RhdHVzID0gMDsKLQlpbnQgaTsKLQotCXN3aXRjaCAodmlkZW9fc3VwcG9ydGVkKSB7Ci0JY2FzZSBUUEFDUElfVklERU9fNTcwOgotCQlpZiAoIWFjcGlfZXZhbGYoTlVMTCwgJmksICJcXF9TQi5QSFMiLCAiZGQiLAotCQkJCSBUUF9BQ1BJX1ZJREVPXzU3MF9QSFNDTUQpKQotCQkJcmV0dXJuIC1FSU87Ci0JCXN0YXR1cyA9IGkgJiBUUF9BQ1BJX1ZJREVPXzU3MF9QSFNNQVNLOwotCQlicmVhazsKLQljYXNlIFRQQUNQSV9WSURFT183NzA6Ci0JCWlmICghYWNwaV9ldmFsZihOVUxMLCAmaSwgIlxcVkNETCIsICJkIikpCi0JCQlyZXR1cm4gLUVJTzsKLQkJaWYgKGkpCi0JCQlzdGF0dXMgfD0gVFBfQUNQSV9WSURFT19TX0xDRDsKLQkJaWYgKCFhY3BpX2V2YWxmKE5VTEwsICZpLCAiXFxWQ0RDIiwgImQiKSkKLQkJCXJldHVybiAtRUlPOwotCQlpZiAoaSkKLQkJCXN0YXR1cyB8PSBUUF9BQ1BJX1ZJREVPX1NfQ1JUOwotCQlicmVhazsKLQljYXNlIFRQQUNQSV9WSURFT19ORVc6Ci0JCWlmICghYWNwaV9ldmFsZihOVUxMLCBOVUxMLCAiXFxWVVBTIiwgInZkIiwgMSkgfHwKLQkJICAgICFhY3BpX2V2YWxmKE5VTEwsICZpLCAiXFxWQ0RDIiwgImQiKSkKLQkJCXJldHVybiAtRUlPOwotCQlpZiAoaSkKLQkJCXN0YXR1cyB8PSBUUF9BQ1BJX1ZJREVPX1NfQ1JUOwotCi0JCWlmICghYWNwaV9ldmFsZihOVUxMLCBOVUxMLCAiXFxWVVBTIiwgInZkIiwgMCkgfHwKLQkJICAgICFhY3BpX2V2YWxmKE5VTEwsICZpLCAiXFxWQ0RMIiwgImQiKSkKLQkJCXJldHVybiAtRUlPOwotCQlpZiAoaSkKLQkJCXN0YXR1cyB8PSBUUF9BQ1BJX1ZJREVPX1NfTENEOwotCQlpZiAoIWFjcGlfZXZhbGYoTlVMTCwgJmksICJcXFZDREQiLCAiZCIpKQotCQkJcmV0dXJuIC1FSU87Ci0JCWlmIChpKQotCQkJc3RhdHVzIHw9IFRQX0FDUElfVklERU9fU19EVkk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJldHVybiAtRU5PU1lTOwotCX0KLQotCXJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXRpYyBpbnQgdmlkZW9fb3V0cHV0c3dfc2V0KGludCBzdGF0dXMpCi17Ci0JaW50IGF1dG9zdzsKLQlpbnQgcmVzID0gMDsKLQotCXN3aXRjaCAodmlkZW9fc3VwcG9ydGVkKSB7Ci0JY2FzZSBUUEFDUElfVklERU9fNTcwOgotCQlyZXMgPSBhY3BpX2V2YWxmKE5VTEwsIE5VTEwsCi0JCQkJICJcXF9TQi5QSFMyIiwgInZkZCIsCi0JCQkJIFRQX0FDUElfVklERU9fNTcwX1BIUzJDTUQsCi0JCQkJIHN0YXR1cyB8IFRQX0FDUElfVklERU9fNTcwX1BIUzJTRVQpOwotCQlicmVhazsKLQljYXNlIFRQQUNQSV9WSURFT183NzA6Ci0JCWF1dG9zdyA9IHZpZGVvX2F1dG9zd19nZXQoKTsKLQkJaWYgKGF1dG9zdyA8IDApCi0JCQlyZXR1cm4gYXV0b3N3OwotCi0JCXJlcyA9IHZpZGVvX2F1dG9zd19zZXQoMSk7Ci0JCWlmIChyZXMpCi0JCQlyZXR1cm4gcmVzOwotCQlyZXMgPSBhY3BpX2V2YWxmKHZpZF9oYW5kbGUsIE5VTEwsCi0JCQkJICJBU1dUIiwgInZkZCIsIHN0YXR1cyAqIDB4MTAwLCAwKTsKLQkJaWYgKCFhdXRvc3cgJiYgdmlkZW9fYXV0b3N3X3NldChhdXRvc3cpKSB7Ci0JCQlwcmludGsoVFBBQ1BJX0VSUgotCQkJICAgICAgICJ2aWRlbyBhdXRvLXN3aXRjaCBsZWZ0IGVuYWJsZWQgZHVlIHRvIGVycm9yXG4iKTsKLQkJCXJldHVybiAtRUlPOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgVFBBQ1BJX1ZJREVPX05FVzoKLQkJcmVzID0gYWNwaV9ldmFsZihOVUxMLCBOVUxMLCAiXFxWVVBTIiwgInZkIiwgMHg4MCkgJiYKLQkJICAgICAgYWNwaV9ldmFsZihOVUxMLCBOVUxMLCAiXFxWU0RTIiwgInZkZCIsIHN0YXR1cywgMSk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJldHVybiAtRU5PU1lTOwotCX0KLQotCXJldHVybiAocmVzKT8gMCA6IC1FSU87Ci19Ci0KLXN0YXRpYyBpbnQgdmlkZW9fYXV0b3N3X2dldCh2b2lkKQotewotCWludCBhdXRvc3cgPSAwOwotCi0Jc3dpdGNoICh2aWRlb19zdXBwb3J0ZWQpIHsKLQljYXNlIFRQQUNQSV9WSURFT181NzA6Ci0JCWlmICghYWNwaV9ldmFsZih2aWRfaGFuZGxlLCAmYXV0b3N3LCAiU1dJVCIsICJkIikpCi0JCQlyZXR1cm4gLUVJTzsKLQkJYnJlYWs7Ci0JY2FzZSBUUEFDUElfVklERU9fNzcwOgotCWNhc2UgVFBBQ1BJX1ZJREVPX05FVzoKLQkJaWYgKCFhY3BpX2V2YWxmKHZpZF9oYW5kbGUsICZhdXRvc3csICJeVkRFRSIsICJkIikpCi0JCQlyZXR1cm4gLUVJTzsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuIC1FTk9TWVM7Ci0JfQotCi0JcmV0dXJuIGF1dG9zdyAmIDE7Ci19Ci0KLXN0YXRpYyBpbnQgdmlkZW9fYXV0b3N3X3NldChpbnQgZW5hYmxlKQotewotCWlmICghYWNwaV9ldmFsZih2aWRfaGFuZGxlLCBOVUxMLCAiX0RPUyIsICJ2ZCIsIChlbmFibGUpPyAxIDogMCkpCi0JCXJldHVybiAtRUlPOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHZpZGVvX291dHB1dHN3X2N5Y2xlKHZvaWQpCi17Ci0JaW50IGF1dG9zdyA9IHZpZGVvX2F1dG9zd19nZXQoKTsKLQlpbnQgcmVzOwotCi0JaWYgKGF1dG9zdyA8IDApCi0JCXJldHVybiBhdXRvc3c7Ci0KLQlzd2l0Y2ggKHZpZGVvX3N1cHBvcnRlZCkgewotCWNhc2UgVFBBQ1BJX1ZJREVPXzU3MDoKLQkJcmVzID0gdmlkZW9fYXV0b3N3X3NldCgxKTsKLQkJaWYgKHJlcykKLQkJCXJldHVybiByZXM7Ci0JCXJlcyA9IGFjcGlfZXZhbGYoZWNfaGFuZGxlLCBOVUxMLCAiX1ExNiIsICJ2Iik7Ci0JCWJyZWFrOwotCWNhc2UgVFBBQ1BJX1ZJREVPXzc3MDoKLQljYXNlIFRQQUNQSV9WSURFT19ORVc6Ci0JCXJlcyA9IHZpZGVvX2F1dG9zd19zZXQoMSk7Ci0JCWlmIChyZXMpCi0JCQlyZXR1cm4gcmVzOwotCQlyZXMgPSBhY3BpX2V2YWxmKHZpZF9oYW5kbGUsIE5VTEwsICJWU1dUIiwgInYiKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuIC1FTk9TWVM7Ci0JfQotCWlmICghYXV0b3N3ICYmIHZpZGVvX2F1dG9zd19zZXQoYXV0b3N3KSkgewotCQlwcmludGsoVFBBQ1BJX0VSUgotCQkgICAgICAgInZpZGVvIGF1dG8tc3dpdGNoIGxlZnQgZW5hYmxlZCBkdWUgdG8gZXJyb3JcbiIpOwotCQlyZXR1cm4gLUVJTzsKLQl9Ci0KLQlyZXR1cm4gKHJlcyk/IDAgOiAtRUlPOwotfQotCi1zdGF0aWMgaW50IHZpZGVvX2V4cGFuZF90b2dnbGUodm9pZCkKLXsKLQlzd2l0Y2ggKHZpZGVvX3N1cHBvcnRlZCkgewotCWNhc2UgVFBBQ1BJX1ZJREVPXzU3MDoKLQkJcmV0dXJuIGFjcGlfZXZhbGYoZWNfaGFuZGxlLCBOVUxMLCAiX1ExNyIsICJ2Iik/Ci0JCQkwIDogLUVJTzsKLQljYXNlIFRQQUNQSV9WSURFT183NzA6Ci0JCXJldHVybiBhY3BpX2V2YWxmKHZpZF9oYW5kbGUsIE5VTEwsICJWRVhQIiwgInYiKT8KLQkJCTAgOiAtRUlPOwotCWNhc2UgVFBBQ1BJX1ZJREVPX05FVzoKLQkJcmV0dXJuIGFjcGlfZXZhbGYoTlVMTCwgTlVMTCwgIlxcVkVYUCIsICJ2Iik/Ci0JCQkwIDogLUVJTzsKLQlkZWZhdWx0OgotCQlyZXR1cm4gLUVOT1NZUzsKLQl9Ci0JLyogbm90IHJlYWNoZWQgKi8KLX0KLQotc3RhdGljIGludCB2aWRlb19yZWFkKGNoYXIgKnApCi17Ci0JaW50IHN0YXR1cywgYXV0b3N3OwotCWludCBsZW4gPSAwOwotCi0JaWYgKHZpZGVvX3N1cHBvcnRlZCA9PSBUUEFDUElfVklERU9fTk9ORSkgewotCQlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAic3RhdHVzOlx0XHRub3Qgc3VwcG9ydGVkXG4iKTsKLQkJcmV0dXJuIGxlbjsKLQl9Ci0KLQlzdGF0dXMgPSB2aWRlb19vdXRwdXRzd19nZXQoKTsKLQlpZiAoc3RhdHVzIDwgMCkKLQkJcmV0dXJuIHN0YXR1czsKLQotCWF1dG9zdyA9IHZpZGVvX2F1dG9zd19nZXQoKTsKLQlpZiAoYXV0b3N3IDwgMCkKLQkJcmV0dXJuIGF1dG9zdzsKLQotCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICJzdGF0dXM6XHRcdHN1cHBvcnRlZFxuIik7Ci0JbGVuICs9IHNwcmludGYocCArIGxlbiwgImxjZDpcdFx0JXNcbiIsIGVuYWJsZWQoc3RhdHVzLCAwKSk7Ci0JbGVuICs9IHNwcmludGYocCArIGxlbiwgImNydDpcdFx0JXNcbiIsIGVuYWJsZWQoc3RhdHVzLCAxKSk7Ci0JaWYgKHZpZGVvX3N1cHBvcnRlZCA9PSBUUEFDUElfVklERU9fTkVXKQotCQlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAiZHZpOlx0XHQlc1xuIiwgZW5hYmxlZChzdGF0dXMsIDMpKTsKLQlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAiYXV0bzpcdFx0JXNcbiIsIGVuYWJsZWQoYXV0b3N3LCAwKSk7Ci0JbGVuICs9IHNwcmludGYocCArIGxlbiwgImNvbW1hbmRzOlx0bGNkX2VuYWJsZSwgbGNkX2Rpc2FibGVcbiIpOwotCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICJjb21tYW5kczpcdGNydF9lbmFibGUsIGNydF9kaXNhYmxlXG4iKTsKLQlpZiAodmlkZW9fc3VwcG9ydGVkID09IFRQQUNQSV9WSURFT19ORVcpCi0JCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICJjb21tYW5kczpcdGR2aV9lbmFibGUsIGR2aV9kaXNhYmxlXG4iKTsKLQlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAiY29tbWFuZHM6XHRhdXRvX2VuYWJsZSwgYXV0b19kaXNhYmxlXG4iKTsKLQlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAiY29tbWFuZHM6XHR2aWRlb19zd2l0Y2gsIGV4cGFuZF90b2dnbGVcbiIpOwotCi0JcmV0dXJuIGxlbjsKLX0KLQotc3RhdGljIGludCB2aWRlb193cml0ZShjaGFyICpidWYpCi17Ci0JY2hhciAqY21kOwotCWludCBlbmFibGUsIGRpc2FibGUsIHN0YXR1czsKLQlpbnQgcmVzOwotCi0JaWYgKHZpZGVvX3N1cHBvcnRlZCA9PSBUUEFDUElfVklERU9fTk9ORSkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQllbmFibGUgPSAwOwotCWRpc2FibGUgPSAwOwotCi0Jd2hpbGUgKChjbWQgPSBuZXh0X2NtZCgmYnVmKSkpIHsKLQkJaWYgKHN0cmxlbmNtcChjbWQsICJsY2RfZW5hYmxlIikgPT0gMCkgewotCQkJZW5hYmxlIHw9IFRQX0FDUElfVklERU9fU19MQ0Q7Ci0JCX0gZWxzZSBpZiAoc3RybGVuY21wKGNtZCwgImxjZF9kaXNhYmxlIikgPT0gMCkgewotCQkJZGlzYWJsZSB8PSBUUF9BQ1BJX1ZJREVPX1NfTENEOwotCQl9IGVsc2UgaWYgKHN0cmxlbmNtcChjbWQsICJjcnRfZW5hYmxlIikgPT0gMCkgewotCQkJZW5hYmxlIHw9IFRQX0FDUElfVklERU9fU19DUlQ7Ci0JCX0gZWxzZSBpZiAoc3RybGVuY21wKGNtZCwgImNydF9kaXNhYmxlIikgPT0gMCkgewotCQkJZGlzYWJsZSB8PSBUUF9BQ1BJX1ZJREVPX1NfQ1JUOwotCQl9IGVsc2UgaWYgKHZpZGVvX3N1cHBvcnRlZCA9PSBUUEFDUElfVklERU9fTkVXICYmCi0JCQkgICBzdHJsZW5jbXAoY21kLCAiZHZpX2VuYWJsZSIpID09IDApIHsKLQkJCWVuYWJsZSB8PSBUUF9BQ1BJX1ZJREVPX1NfRFZJOwotCQl9IGVsc2UgaWYgKHZpZGVvX3N1cHBvcnRlZCA9PSBUUEFDUElfVklERU9fTkVXICYmCi0JCQkgICBzdHJsZW5jbXAoY21kLCAiZHZpX2Rpc2FibGUiKSA9PSAwKSB7Ci0JCQlkaXNhYmxlIHw9IFRQX0FDUElfVklERU9fU19EVkk7Ci0JCX0gZWxzZSBpZiAoc3RybGVuY21wKGNtZCwgImF1dG9fZW5hYmxlIikgPT0gMCkgewotCQkJcmVzID0gdmlkZW9fYXV0b3N3X3NldCgxKTsKLQkJCWlmIChyZXMpCi0JCQkJcmV0dXJuIHJlczsKLQkJfSBlbHNlIGlmIChzdHJsZW5jbXAoY21kLCAiYXV0b19kaXNhYmxlIikgPT0gMCkgewotCQkJcmVzID0gdmlkZW9fYXV0b3N3X3NldCgwKTsKLQkJCWlmIChyZXMpCi0JCQkJcmV0dXJuIHJlczsKLQkJfSBlbHNlIGlmIChzdHJsZW5jbXAoY21kLCAidmlkZW9fc3dpdGNoIikgPT0gMCkgewotCQkJcmVzID0gdmlkZW9fb3V0cHV0c3dfY3ljbGUoKTsKLQkJCWlmIChyZXMpCi0JCQkJcmV0dXJuIHJlczsKLQkJfSBlbHNlIGlmIChzdHJsZW5jbXAoY21kLCAiZXhwYW5kX3RvZ2dsZSIpID09IDApIHsKLQkJCXJlcyA9IHZpZGVvX2V4cGFuZF90b2dnbGUoKTsKLQkJCWlmIChyZXMpCi0JCQkJcmV0dXJuIHJlczsKLQkJfSBlbHNlCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlpZiAoZW5hYmxlIHx8IGRpc2FibGUpIHsKLQkJc3RhdHVzID0gdmlkZW9fb3V0cHV0c3dfZ2V0KCk7Ci0JCWlmIChzdGF0dXMgPCAwKQotCQkJcmV0dXJuIHN0YXR1czsKLQkJcmVzID0gdmlkZW9fb3V0cHV0c3dfc2V0KChzdGF0dXMgJiB+ZGlzYWJsZSkgfCBlbmFibGUpOwotCQlpZiAocmVzKQotCQkJcmV0dXJuIHJlczsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHN0cnVjdCBpYm1fc3RydWN0IHZpZGVvX2RyaXZlcl9kYXRhID0gewotCS5uYW1lID0gInZpZGVvIiwKLQkucmVhZCA9IHZpZGVvX3JlYWQsCi0JLndyaXRlID0gdmlkZW9fd3JpdGUsCi0JLmV4aXQgPSB2aWRlb19leGl0LAotfTsKLQotI2VuZGlmIC8qIENPTkZJR19USElOS1BBRF9BQ1BJX1ZJREVPICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBMaWdodCAodGhpbmtsaWdodCkgc3ViZHJpdmVyCi0gKi8KLQotVFBBQ1BJX0hBTkRMRShsZ2h0LCByb290LCAiXFxMR0hUIik7CS8qIEEyMWUsIEEyeG0vcCwgVDIwLTIyLCBYMjAtMjEgKi8KLVRQQUNQSV9IQU5ETEUobGVkYiwgZWMsICJMRURCIik7CQkvKiBHNHggKi8KLQotc3RhdGljIGludCBsaWdodF9nZXRfc3RhdHVzKHZvaWQpCi17Ci0JaW50IHN0YXR1cyA9IDA7Ci0KLQlpZiAodHBfZmVhdHVyZXMubGlnaHRfc3RhdHVzKSB7Ci0JCWlmICghYWNwaV9ldmFsZihlY19oYW5kbGUsICZzdGF0dXMsICJLQkxUIiwgImQiKSkKLQkJCXJldHVybiAtRUlPOwotCQlyZXR1cm4gKCEhc3RhdHVzKTsKLQl9Ci0KLQlyZXR1cm4gLUVOWElPOwotfQotCi1zdGF0aWMgaW50IGxpZ2h0X3NldF9zdGF0dXMoaW50IHN0YXR1cykKLXsKLQlpbnQgcmM7Ci0KLQlpZiAodHBfZmVhdHVyZXMubGlnaHQpIHsKLQkJaWYgKGNtb3NfaGFuZGxlKSB7Ci0JCQlyYyA9IGFjcGlfZXZhbGYoY21vc19oYW5kbGUsIE5VTEwsIE5VTEwsICJ2ZCIsCi0JCQkJCShzdGF0dXMpPwotCQkJCQkJVFBfQ01PU19USElOS0xJR0hUX09OIDoKLQkJCQkJCVRQX0NNT1NfVEhJTktMSUdIVF9PRkYpOwotCQl9IGVsc2UgewotCQkJcmMgPSBhY3BpX2V2YWxmKGxnaHRfaGFuZGxlLCBOVUxMLCBOVUxMLCAidmQiLAotCQkJCQkoc3RhdHVzKT8gMSA6IDApOwotCQl9Ci0JCXJldHVybiAocmMpPyAwIDogLUVJTzsKLQl9Ci0KLQlyZXR1cm4gLUVOWElPOwotfQotCi1zdGF0aWMgdm9pZCBsaWdodF9zZXRfc3RhdHVzX3dvcmtlcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCi17Ci0Jc3RydWN0IHRwYWNwaV9sZWRfY2xhc3NkZXYgKmRhdGEgPQotCQkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCB0cGFjcGlfbGVkX2NsYXNzZGV2LCB3b3JrKTsKLQotCWlmIChsaWtlbHkodHBhY3BpX2xpZmVjeWNsZSA9PSBUUEFDUElfTElGRV9SVU5OSU5HKSkKLQkJbGlnaHRfc2V0X3N0YXR1cygoZGF0YS0+bmV3X2JyaWdodG5lc3MgIT0gTEVEX09GRikpOwotfQotCi1zdGF0aWMgdm9pZCBsaWdodF9zeXNmc19zZXQoc3RydWN0IGxlZF9jbGFzc2RldiAqbGVkX2NkZXYsCi0JCQllbnVtIGxlZF9icmlnaHRuZXNzIGJyaWdodG5lc3MpCi17Ci0Jc3RydWN0IHRwYWNwaV9sZWRfY2xhc3NkZXYgKmRhdGEgPQotCQljb250YWluZXJfb2YobGVkX2NkZXYsCi0JCQkgICAgIHN0cnVjdCB0cGFjcGlfbGVkX2NsYXNzZGV2LAotCQkJICAgICBsZWRfY2xhc3NkZXYpOwotCWRhdGEtPm5ld19icmlnaHRuZXNzID0gYnJpZ2h0bmVzczsKLQlxdWV1ZV93b3JrKHRwYWNwaV93cSwgJmRhdGEtPndvcmspOwotfQotCi1zdGF0aWMgZW51bSBsZWRfYnJpZ2h0bmVzcyBsaWdodF9zeXNmc19nZXQoc3RydWN0IGxlZF9jbGFzc2RldiAqbGVkX2NkZXYpCi17Ci0JcmV0dXJuIChsaWdodF9nZXRfc3RhdHVzKCkgPT0gMSk/IExFRF9GVUxMIDogTEVEX09GRjsKLX0KLQotc3RhdGljIHN0cnVjdCB0cGFjcGlfbGVkX2NsYXNzZGV2IHRwYWNwaV9sZWRfdGhpbmtsaWdodCA9IHsKLQkubGVkX2NsYXNzZGV2ID0gewotCQkubmFtZQkJPSAidHBhY3BpOjp0aGlua2xpZ2h0IiwKLQkJLmJyaWdodG5lc3Nfc2V0CT0gJmxpZ2h0X3N5c2ZzX3NldCwKLQkJLmJyaWdodG5lc3NfZ2V0CT0gJmxpZ2h0X3N5c2ZzX2dldCwKLQl9Ci19OwotCi1zdGF0aWMgaW50IF9faW5pdCBsaWdodF9pbml0KHN0cnVjdCBpYm1faW5pdF9zdHJ1Y3QgKmlpYm0pCi17Ci0JaW50IHJjOwotCi0JdmRiZ19wcmludGsoVFBBQ1BJX0RCR19JTklULCAiaW5pdGlhbGl6aW5nIGxpZ2h0IHN1YmRyaXZlclxuIik7Ci0KLQlUUEFDUElfQUNQSUhBTkRMRV9JTklUKGxlZGIpOwotCVRQQUNQSV9BQ1BJSEFORExFX0lOSVQobGdodCk7Ci0JVFBBQ1BJX0FDUElIQU5ETEVfSU5JVChjbW9zKTsKLQlJTklUX1dPUksoJnRwYWNwaV9sZWRfdGhpbmtsaWdodC53b3JrLCBsaWdodF9zZXRfc3RhdHVzX3dvcmtlcik7Ci0KLQkvKiBsaWdodCBub3Qgc3VwcG9ydGVkIG9uIDU3MCwgNjAwZS94LCA3NzBlLCA3NzB4LCBHNHgsIFIzMCwgUjMxICovCi0JdHBfZmVhdHVyZXMubGlnaHQgPSAoY21vc19oYW5kbGUgfHwgbGdodF9oYW5kbGUpICYmICFsZWRiX2hhbmRsZTsKLQotCWlmICh0cF9mZWF0dXJlcy5saWdodCkKLQkJLyogbGlnaHQgc3RhdHVzIG5vdCBzdXBwb3J0ZWQgb24KLQkJICAgNTcwLCA2MDBlL3gsIDc3MGUsIDc3MHgsIEc0eCwgUjMwLCBSMzEsIFIzMiwgWDIwICovCi0JCXRwX2ZlYXR1cmVzLmxpZ2h0X3N0YXR1cyA9Ci0JCQlhY3BpX2V2YWxmKGVjX2hhbmRsZSwgTlVMTCwgIktCTFQiLCAicXYiKTsKLQotCXZkYmdfcHJpbnRrKFRQQUNQSV9EQkdfSU5JVCwgImxpZ2h0IGlzICVzLCBsaWdodCBzdGF0dXMgaXMgJXNcbiIsCi0JCXN0cl9zdXBwb3J0ZWQodHBfZmVhdHVyZXMubGlnaHQpLAotCQlzdHJfc3VwcG9ydGVkKHRwX2ZlYXR1cmVzLmxpZ2h0X3N0YXR1cykpOwotCi0JaWYgKCF0cF9mZWF0dXJlcy5saWdodCkKLQkJcmV0dXJuIDE7Ci0KLQlyYyA9IGxlZF9jbGFzc2Rldl9yZWdpc3RlcigmdHBhY3BpX3BkZXYtPmRldiwKLQkJCQkgICAmdHBhY3BpX2xlZF90aGlua2xpZ2h0LmxlZF9jbGFzc2Rldik7Ci0KLQlpZiAocmMgPCAwKSB7Ci0JCXRwX2ZlYXR1cmVzLmxpZ2h0ID0gMDsKLQkJdHBfZmVhdHVyZXMubGlnaHRfc3RhdHVzID0gMDsKLQl9IGVsc2UgIHsKLQkJcmMgPSAwOwotCX0KLQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIHZvaWQgbGlnaHRfZXhpdCh2b2lkKQotewotCWxlZF9jbGFzc2Rldl91bnJlZ2lzdGVyKCZ0cGFjcGlfbGVkX3RoaW5rbGlnaHQubGVkX2NsYXNzZGV2KTsKLQlpZiAod29ya19wZW5kaW5nKCZ0cGFjcGlfbGVkX3RoaW5rbGlnaHQud29yaykpCi0JCWZsdXNoX3dvcmtxdWV1ZSh0cGFjcGlfd3EpOwotfQotCi1zdGF0aWMgaW50IGxpZ2h0X3JlYWQoY2hhciAqcCkKLXsKLQlpbnQgbGVuID0gMDsKLQlpbnQgc3RhdHVzOwotCi0JaWYgKCF0cF9mZWF0dXJlcy5saWdodCkgewotCQlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAic3RhdHVzOlx0XHRub3Qgc3VwcG9ydGVkXG4iKTsKLQl9IGVsc2UgaWYgKCF0cF9mZWF0dXJlcy5saWdodF9zdGF0dXMpIHsKLQkJbGVuICs9IHNwcmludGYocCArIGxlbiwgInN0YXR1czpcdFx0dW5rbm93blxuIik7Ci0JCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICJjb21tYW5kczpcdG9uLCBvZmZcbiIpOwotCX0gZWxzZSB7Ci0JCXN0YXR1cyA9IGxpZ2h0X2dldF9zdGF0dXMoKTsKLQkJaWYgKHN0YXR1cyA8IDApCi0JCQlyZXR1cm4gc3RhdHVzOwotCQlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAic3RhdHVzOlx0XHQlc1xuIiwgb25vZmYoc3RhdHVzLCAwKSk7Ci0JCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICJjb21tYW5kczpcdG9uLCBvZmZcbiIpOwotCX0KLQotCXJldHVybiBsZW47Ci19Ci0KLXN0YXRpYyBpbnQgbGlnaHRfd3JpdGUoY2hhciAqYnVmKQotewotCWNoYXIgKmNtZDsKLQlpbnQgbmV3c3RhdHVzID0gMDsKLQotCWlmICghdHBfZmVhdHVyZXMubGlnaHQpCi0JCXJldHVybiAtRU5PREVWOwotCi0Jd2hpbGUgKChjbWQgPSBuZXh0X2NtZCgmYnVmKSkpIHsKLQkJaWYgKHN0cmxlbmNtcChjbWQsICJvbiIpID09IDApIHsKLQkJCW5ld3N0YXR1cyA9IDE7Ci0JCX0gZWxzZSBpZiAoc3RybGVuY21wKGNtZCwgIm9mZiIpID09IDApIHsKLQkJCW5ld3N0YXR1cyA9IDA7Ci0JCX0gZWxzZQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JcmV0dXJuIGxpZ2h0X3NldF9zdGF0dXMobmV3c3RhdHVzKTsKLX0KLQotc3RhdGljIHN0cnVjdCBpYm1fc3RydWN0IGxpZ2h0X2RyaXZlcl9kYXRhID0gewotCS5uYW1lID0gImxpZ2h0IiwKLQkucmVhZCA9IGxpZ2h0X3JlYWQsCi0JLndyaXRlID0gbGlnaHRfd3JpdGUsCi0JLmV4aXQgPSBsaWdodF9leGl0LAotfTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIERvY2sgc3ViZHJpdmVyCi0gKi8KLQotI2lmZGVmIENPTkZJR19USElOS1BBRF9BQ1BJX0RPQ0sKLQotc3RhdGljIHZvaWQgZG9ja19ub3RpZnkoc3RydWN0IGlibV9zdHJ1Y3QgKmlibSwgdTMyIGV2ZW50KTsKLXN0YXRpYyBpbnQgZG9ja19yZWFkKGNoYXIgKnApOwotc3RhdGljIGludCBkb2NrX3dyaXRlKGNoYXIgKmJ1Zik7Ci0KLVRQQUNQSV9IQU5ETEUoZG9jaywgcm9vdCwgIlxcX1NCLkdEQ0siLAkvKiBYMzAsIFgzMSwgWDQwICovCi0JICAgIlxcX1NCLlBDSTAuRE9DSyIsCS8qIDYwMGUveCw3NzBlLDc3MHgsQTJ4bS9wLFQyMC0yMixYMjAtMjEgKi8KLQkgICAiXFxfU0IuUENJMC5QQ0kxLkRPQ0siLAkvKiBhbGwgb3RoZXJzICovCi0JICAgIlxcX1NCLlBDSS5JU0EuU0xDRSIsCS8qIDU3MCAqLwotICAgICk7CQkJCS8qIEEyMWUsRzR4LFIzMCxSMzEsUjMyLFI0MCxSNDBlLFI1MGUgKi8KLQotLyogZG9uJ3QgbGlzdCBvdGhlciBhbHRlcm5hdGl2ZXMgYXMgd2UgaW5zdGFsbCBhIG5vdGlmeSBoYW5kbGVyIG9uIHRoZSA1NzAgKi8KLVRQQUNQSV9IQU5ETEUocGNpLCByb290LCAiXFxfU0IuUENJIik7CS8qIDU3MCAqLwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGFjcGlfZGV2aWNlX2lkIGlibV9wY2lfZGV2aWNlX2lkc1tdID0gewotCXtQQ0lfUk9PVF9ISURfU1RSSU5HLCAwfSwKLQl7IiIsIDB9LAotfTsKLQotc3RhdGljIHN0cnVjdCB0cF9hY3BpX2Rydl9zdHJ1Y3QgaWJtX2RvY2tfYWNwaWRyaXZlclsyXSA9IHsKLQl7Ci0JIC5ub3RpZnkgPSBkb2NrX25vdGlmeSwKLQkgLmhhbmRsZSA9ICZkb2NrX2hhbmRsZSwKLQkgLnR5cGUgPSBBQ1BJX1NZU1RFTV9OT1RJRlksCi0JfSwKLQl7Ci0JLyogVEhJUyBPTkUgTVVTVCBORVZFUiBCRSBVU0VEIEZPUiBEUklWRVIgQVVUT0xPQURJTkcuCi0JICogV2UganVzdCB1c2UgaXQgdG8gZ2V0IG5vdGlmaWNhdGlvbnMgb2YgZG9jayBob3RwbHVnCi0JICogaW4gdmVyeSBvbGQgdGhpbmtwYWRzICovCi0JIC5oaWQgPSBpYm1fcGNpX2RldmljZV9pZHMsCi0JIC5ub3RpZnkgPSBkb2NrX25vdGlmeSwKLQkgLmhhbmRsZSA9ICZwY2lfaGFuZGxlLAotCSAudHlwZSA9IEFDUElfU1lTVEVNX05PVElGWSwKLQl9LAotfTsKLQotc3RhdGljIHN0cnVjdCBpYm1fc3RydWN0IGRvY2tfZHJpdmVyX2RhdGFbMl0gPSB7Ci0JewotCSAubmFtZSA9ICJkb2NrIiwKLQkgLnJlYWQgPSBkb2NrX3JlYWQsCi0JIC53cml0ZSA9IGRvY2tfd3JpdGUsCi0JIC5hY3BpID0gJmlibV9kb2NrX2FjcGlkcml2ZXJbMF0sCi0JfSwKLQl7Ci0JIC5uYW1lID0gImRvY2siLAotCSAuYWNwaSA9ICZpYm1fZG9ja19hY3BpZHJpdmVyWzFdLAotCX0sCi19OwotCi0jZGVmaW5lIGRvY2tfZG9ja2VkKCkgKF9zdGEoZG9ja19oYW5kbGUpICYgMSkKLQotc3RhdGljIGludCBfX2luaXQgZG9ja19pbml0KHN0cnVjdCBpYm1faW5pdF9zdHJ1Y3QgKmlpYm0pCi17Ci0JdmRiZ19wcmludGsoVFBBQ1BJX0RCR19JTklULCAiaW5pdGlhbGl6aW5nIGRvY2sgc3ViZHJpdmVyXG4iKTsKLQotCVRQQUNQSV9BQ1BJSEFORExFX0lOSVQoZG9jayk7Ci0KLQl2ZGJnX3ByaW50ayhUUEFDUElfREJHX0lOSVQsICJkb2NrIGlzICVzXG4iLAotCQlzdHJfc3VwcG9ydGVkKGRvY2tfaGFuZGxlICE9IE5VTEwpKTsKLQotCXJldHVybiAoZG9ja19oYW5kbGUpPyAwIDogMTsKLX0KLQotc3RhdGljIGludCBfX2luaXQgZG9ja19pbml0MihzdHJ1Y3QgaWJtX2luaXRfc3RydWN0ICppaWJtKQotewotCWludCBkb2NrMl9uZWVkZWQ7Ci0KLQl2ZGJnX3ByaW50ayhUUEFDUElfREJHX0lOSVQsICJpbml0aWFsaXppbmcgZG9jayBzdWJkcml2ZXIgcGFydCAyXG4iKTsKLQotCWlmIChkb2NrX2RyaXZlcl9kYXRhWzBdLmZsYWdzLmFjcGlfZHJpdmVyX3JlZ2lzdGVyZWQgJiYKLQkgICAgZG9ja19kcml2ZXJfZGF0YVswXS5mbGFncy5hY3BpX25vdGlmeV9pbnN0YWxsZWQpIHsKLQkJVFBBQ1BJX0FDUElIQU5ETEVfSU5JVChwY2kpOwotCQlkb2NrMl9uZWVkZWQgPSAocGNpX2hhbmRsZSAhPSBOVUxMKTsKLQkJdmRiZ19wcmludGsoVFBBQ1BJX0RCR19JTklULAotCQkJICAgICJkb2NrIFBDSSBoYW5kbGVyIGZvciB0aGUgVFAgNTcwIGlzICVzXG4iLAotCQkJICAgIHN0cl9zdXBwb3J0ZWQoZG9jazJfbmVlZGVkKSk7Ci0JfSBlbHNlIHsKLQkJdmRiZ19wcmludGsoVFBBQ1BJX0RCR19JTklULAotCQkiZG9jayBzdWJkcml2ZXIgcGFydCAyIG5vdCByZXF1aXJlZFxuIik7Ci0JCWRvY2syX25lZWRlZCA9IDA7Ci0JfQotCi0JcmV0dXJuIChkb2NrMl9uZWVkZWQpPyAwIDogMTsKLX0KLQotc3RhdGljIHZvaWQgZG9ja19ub3RpZnkoc3RydWN0IGlibV9zdHJ1Y3QgKmlibSwgdTMyIGV2ZW50KQotewotCWludCBkb2NrZWQgPSBkb2NrX2RvY2tlZCgpOwotCWludCBwY2kgPSBpYm0tPmFjcGktPmhpZCAmJiBpYm0tPmFjcGktPmRldmljZSAmJgotCQlhY3BpX21hdGNoX2RldmljZV9pZHMoaWJtLT5hY3BpLT5kZXZpY2UsIGlibV9wY2lfZGV2aWNlX2lkcyk7Ci0JaW50IGRhdGE7Ci0KLQlpZiAoZXZlbnQgPT0gMSAmJiAhcGNpKQkvKiA1NzAgKi8KLQkJZGF0YSA9IDE7CS8qIGJ1dHRvbiAqLwotCWVsc2UgaWYgKGV2ZW50ID09IDEgJiYgcGNpKQkvKiA1NzAgKi8KLQkJZGF0YSA9IDM7CS8qIGRvY2sgKi8KLQllbHNlIGlmIChldmVudCA9PSAzICYmIGRvY2tlZCkKLQkJZGF0YSA9IDE7CS8qIGJ1dHRvbiAqLwotCWVsc2UgaWYgKGV2ZW50ID09IDMgJiYgIWRvY2tlZCkKLQkJZGF0YSA9IDI7CS8qIHVuZG9jayAqLwotCWVsc2UgaWYgKGV2ZW50ID09IDAgJiYgZG9ja2VkKQotCQlkYXRhID0gMzsJLyogZG9jayAqLwotCWVsc2UgewotCQlwcmludGsoVFBBQ1BJX0VSUiAidW5rbm93biBkb2NrIGV2ZW50ICVkLCBzdGF0dXMgJWRcbiIsCi0JCSAgICAgICBldmVudCwgX3N0YShkb2NrX2hhbmRsZSkpOwotCQlkYXRhID0gMDsJLyogdW5rbm93biAqLwotCX0KLQlhY3BpX2J1c19nZW5lcmF0ZV9wcm9jX2V2ZW50KGlibS0+YWNwaS0+ZGV2aWNlLCBldmVudCwgZGF0YSk7Ci0JYWNwaV9idXNfZ2VuZXJhdGVfbmV0bGlua19ldmVudChpYm0tPmFjcGktPmRldmljZS0+cG5wLmRldmljZV9jbGFzcywKLQkJCQkJICBpYm0tPmFjcGktPmRldmljZS0+ZGV2LmJ1c19pZCwKLQkJCQkJICBldmVudCwgZGF0YSk7Ci19Ci0KLXN0YXRpYyBpbnQgZG9ja19yZWFkKGNoYXIgKnApCi17Ci0JaW50IGxlbiA9IDA7Ci0JaW50IGRvY2tlZCA9IGRvY2tfZG9ja2VkKCk7Ci0KLQlpZiAoIWRvY2tfaGFuZGxlKQotCQlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAic3RhdHVzOlx0XHRub3Qgc3VwcG9ydGVkXG4iKTsKLQllbHNlIGlmICghZG9ja2VkKQotCQlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAic3RhdHVzOlx0XHR1bmRvY2tlZFxuIik7Ci0JZWxzZSB7Ci0JCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICJzdGF0dXM6XHRcdGRvY2tlZFxuIik7Ci0JCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICJjb21tYW5kczpcdGRvY2ssIHVuZG9ja1xuIik7Ci0JfQotCi0JcmV0dXJuIGxlbjsKLX0KLQotc3RhdGljIGludCBkb2NrX3dyaXRlKGNoYXIgKmJ1ZikKLXsKLQljaGFyICpjbWQ7Ci0KLQlpZiAoIWRvY2tfZG9ja2VkKCkpCi0JCXJldHVybiAtRU5PREVWOwotCi0Jd2hpbGUgKChjbWQgPSBuZXh0X2NtZCgmYnVmKSkpIHsKLQkJaWYgKHN0cmxlbmNtcChjbWQsICJ1bmRvY2siKSA9PSAwKSB7Ci0JCQlpZiAoIWFjcGlfZXZhbGYoZG9ja19oYW5kbGUsIE5VTEwsICJfRENLIiwgInZkIiwgMCkgfHwKLQkJCSAgICAhYWNwaV9ldmFsZihkb2NrX2hhbmRsZSwgTlVMTCwgIl9FSjAiLCAidmQiLCAxKSkKLQkJCQlyZXR1cm4gLUVJTzsKLQkJfSBlbHNlIGlmIChzdHJsZW5jbXAoY21kLCAiZG9jayIpID09IDApIHsKLQkJCWlmICghYWNwaV9ldmFsZihkb2NrX2hhbmRsZSwgTlVMTCwgIl9EQ0siLCAidmQiLCAxKSkKLQkJCQlyZXR1cm4gLUVJTzsKLQkJfSBlbHNlCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotI2VuZGlmIC8qIENPTkZJR19USElOS1BBRF9BQ1BJX0RPQ0sgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEJheSBzdWJkcml2ZXIKLSAqLwotCi0jaWZkZWYgQ09ORklHX1RISU5LUEFEX0FDUElfQkFZCi0KLVRQQUNQSV9IQU5ETEUoYmF5LCByb290LCAiXFxfU0IuUENJLklERS5TRUNOLk1BU1QiLAkvKiA1NzAgKi8KLQkgICAiXFxfU0IuUENJMC5JREUwLklERVMuSURTTSIsCS8qIDYwMGUveCwgNzcwZSwgNzcweCAqLwotCSAgICJcXF9TQi5QQ0kwLlNBVEEuU0NORC5NU1RSIiwJLyogVDYwLCBYNjAsIFo2MCAqLwotCSAgICJcXF9TQi5QQ0kwLklERTAuU0NORC5NU1RSIiwJLyogYWxsIG90aGVycyAqLwotCSAgICk7CQkJCS8qIEEyMWUsIFIzMCwgUjMxICovCi1UUEFDUElfSEFORExFKGJheV9laiwgYmF5LCAiX0VKMyIsCS8qIDYwMGUveCwgQTJ4bS9wLCBBM3ggKi8KLQkgICAiX0VKMCIsCQkvKiBhbGwgb3RoZXJzICovCi0JICAgKTsJCQkvKiA1NzAsQTIxZSxHNHgsUjMwLFIzMSxSMzIsUjQwZSxSNTBlICovCi1UUEFDUElfSEFORExFKGJheTIsIHJvb3QsICJcXF9TQi5QQ0kwLklERTAuUFJJTS5TTEFWIiwJLyogQTN4LCBSMzIgKi8KLQkgICAiXFxfU0IuUENJMC5JREUwLklERVAuSURQUyIsCS8qIDYwMGUveCwgNzcwZSwgNzcweCAqLwotCSAgICk7CQkJCS8qIGFsbCBvdGhlcnMgKi8KLVRQQUNQSV9IQU5ETEUoYmF5Ml9laiwgYmF5MiwgIl9FSjMiLAkvKiA2MDBlL3gsIDc3MGUsIEEzeCAqLwotCSAgICJfRUowIiwJCQkvKiA3NzB4ICovCi0JICAgKTsJCQkJLyogYWxsIG90aGVycyAqLwotCi1zdGF0aWMgaW50IF9faW5pdCBiYXlfaW5pdChzdHJ1Y3QgaWJtX2luaXRfc3RydWN0ICppaWJtKQotewotCXZkYmdfcHJpbnRrKFRQQUNQSV9EQkdfSU5JVCwgImluaXRpYWxpemluZyBiYXkgc3ViZHJpdmVyXG4iKTsKLQotCVRQQUNQSV9BQ1BJSEFORExFX0lOSVQoYmF5KTsKLQlpZiAoYmF5X2hhbmRsZSkKLQkJVFBBQ1BJX0FDUElIQU5ETEVfSU5JVChiYXlfZWopOwotCVRQQUNQSV9BQ1BJSEFORExFX0lOSVQoYmF5Mik7Ci0JaWYgKGJheTJfaGFuZGxlKQotCQlUUEFDUElfQUNQSUhBTkRMRV9JTklUKGJheTJfZWopOwotCi0JdHBfZmVhdHVyZXMuYmF5X3N0YXR1cyA9IGJheV9oYW5kbGUgJiYKLQkJYWNwaV9ldmFsZihiYXlfaGFuZGxlLCBOVUxMLCAiX1NUQSIsICJxdiIpOwotCXRwX2ZlYXR1cmVzLmJheV9zdGF0dXMyID0gYmF5Ml9oYW5kbGUgJiYKLQkJYWNwaV9ldmFsZihiYXkyX2hhbmRsZSwgTlVMTCwgIl9TVEEiLCAicXYiKTsKLQotCXRwX2ZlYXR1cmVzLmJheV9lamVjdCA9IGJheV9oYW5kbGUgJiYgYmF5X2VqX2hhbmRsZSAmJgotCQkoc3RybGVuY21wKGJheV9lal9wYXRoLCAiX0VKMCIpID09IDAgfHwgZXhwZXJpbWVudGFsKTsKLQl0cF9mZWF0dXJlcy5iYXlfZWplY3QyID0gYmF5Ml9oYW5kbGUgJiYgYmF5Ml9lal9oYW5kbGUgJiYKLQkJKHN0cmxlbmNtcChiYXkyX2VqX3BhdGgsICJfRUowIikgPT0gMCB8fCBleHBlcmltZW50YWwpOwotCi0JdmRiZ19wcmludGsoVFBBQ1BJX0RCR19JTklULAotCQkiYmF5IDE6IHN0YXR1cyAlcywgZWplY3QgJXM7IGJheSAyOiBzdGF0dXMgJXMsIGVqZWN0ICVzXG4iLAotCQlzdHJfc3VwcG9ydGVkKHRwX2ZlYXR1cmVzLmJheV9zdGF0dXMpLAotCQlzdHJfc3VwcG9ydGVkKHRwX2ZlYXR1cmVzLmJheV9lamVjdCksCi0JCXN0cl9zdXBwb3J0ZWQodHBfZmVhdHVyZXMuYmF5X3N0YXR1czIpLAotCQlzdHJfc3VwcG9ydGVkKHRwX2ZlYXR1cmVzLmJheV9lamVjdDIpKTsKLQotCXJldHVybiAodHBfZmVhdHVyZXMuYmF5X3N0YXR1cyB8fCB0cF9mZWF0dXJlcy5iYXlfZWplY3QgfHwKLQkJdHBfZmVhdHVyZXMuYmF5X3N0YXR1czIgfHwgdHBfZmVhdHVyZXMuYmF5X2VqZWN0Mik/IDAgOiAxOwotfQotCi1zdGF0aWMgdm9pZCBiYXlfbm90aWZ5KHN0cnVjdCBpYm1fc3RydWN0ICppYm0sIHUzMiBldmVudCkKLXsKLQlhY3BpX2J1c19nZW5lcmF0ZV9wcm9jX2V2ZW50KGlibS0+YWNwaS0+ZGV2aWNlLCBldmVudCwgMCk7Ci0JYWNwaV9idXNfZ2VuZXJhdGVfbmV0bGlua19ldmVudChpYm0tPmFjcGktPmRldmljZS0+cG5wLmRldmljZV9jbGFzcywKLQkJCQkJICBpYm0tPmFjcGktPmRldmljZS0+ZGV2LmJ1c19pZCwKLQkJCQkJICBldmVudCwgMCk7Ci19Ci0KLSNkZWZpbmUgYmF5X29jY3VwaWVkKGIpIChfc3RhKGIjI19oYW5kbGUpICYgMSkKLQotc3RhdGljIGludCBiYXlfcmVhZChjaGFyICpwKQotewotCWludCBsZW4gPSAwOwotCWludCBvY2N1cGllZCA9IGJheV9vY2N1cGllZChiYXkpOwotCWludCBvY2N1cGllZDIgPSBiYXlfb2NjdXBpZWQoYmF5Mik7Ci0JaW50IGVqZWN0LCBlamVjdDI7Ci0KLQlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAic3RhdHVzOlx0XHQlc1xuIiwKLQkJdHBfZmVhdHVyZXMuYmF5X3N0YXR1cyA/Ci0JCQkob2NjdXBpZWQgPyAib2NjdXBpZWQiIDogInVub2NjdXBpZWQiKSA6Ci0JCQkJIm5vdCBzdXBwb3J0ZWQiKTsKLQlpZiAodHBfZmVhdHVyZXMuYmF5X3N0YXR1czIpCi0JCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICJzdGF0dXMyOlx0JXNcbiIsIG9jY3VwaWVkMiA/Ci0JCQkgICAgICAgIm9jY3VwaWVkIiA6ICJ1bm9jY3VwaWVkIik7Ci0KLQllamVjdCA9IHRwX2ZlYXR1cmVzLmJheV9lamVjdCAmJiBvY2N1cGllZDsKLQllamVjdDIgPSB0cF9mZWF0dXJlcy5iYXlfZWplY3QyICYmIG9jY3VwaWVkMjsKLQotCWlmIChlamVjdCAmJiBlamVjdDIpCi0JCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICJjb21tYW5kczpcdGVqZWN0LCBlamVjdDJcbiIpOwotCWVsc2UgaWYgKGVqZWN0KQotCQlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAiY29tbWFuZHM6XHRlamVjdFxuIik7Ci0JZWxzZSBpZiAoZWplY3QyKQotCQlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAiY29tbWFuZHM6XHRlamVjdDJcbiIpOwotCi0JcmV0dXJuIGxlbjsKLX0KLQotc3RhdGljIGludCBiYXlfd3JpdGUoY2hhciAqYnVmKQotewotCWNoYXIgKmNtZDsKLQotCWlmICghdHBfZmVhdHVyZXMuYmF5X2VqZWN0ICYmICF0cF9mZWF0dXJlcy5iYXlfZWplY3QyKQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCXdoaWxlICgoY21kID0gbmV4dF9jbWQoJmJ1ZikpKSB7Ci0JCWlmICh0cF9mZWF0dXJlcy5iYXlfZWplY3QgJiYgc3RybGVuY21wKGNtZCwgImVqZWN0IikgPT0gMCkgewotCQkJaWYgKCFhY3BpX2V2YWxmKGJheV9lal9oYW5kbGUsIE5VTEwsIE5VTEwsICJ2ZCIsIDEpKQotCQkJCXJldHVybiAtRUlPOwotCQl9IGVsc2UgaWYgKHRwX2ZlYXR1cmVzLmJheV9lamVjdDIgJiYKLQkJCSAgIHN0cmxlbmNtcChjbWQsICJlamVjdDIiKSA9PSAwKSB7Ci0JCQlpZiAoIWFjcGlfZXZhbGYoYmF5Ml9lal9oYW5kbGUsIE5VTEwsIE5VTEwsICJ2ZCIsIDEpKQotCQkJCXJldHVybiAtRUlPOwotCQl9IGVsc2UKLQkJCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3RydWN0IHRwX2FjcGlfZHJ2X3N0cnVjdCBpYm1fYmF5X2FjcGlkcml2ZXIgPSB7Ci0JLm5vdGlmeSA9IGJheV9ub3RpZnksCi0JLmhhbmRsZSA9ICZiYXlfaGFuZGxlLAotCS50eXBlID0gQUNQSV9TWVNURU1fTk9USUZZLAotfTsKLQotc3RhdGljIHN0cnVjdCBpYm1fc3RydWN0IGJheV9kcml2ZXJfZGF0YSA9IHsKLQkubmFtZSA9ICJiYXkiLAotCS5yZWFkID0gYmF5X3JlYWQsCi0JLndyaXRlID0gYmF5X3dyaXRlLAotCS5hY3BpID0gJmlibV9iYXlfYWNwaWRyaXZlciwKLX07Ci0KLSNlbmRpZiAvKiBDT05GSUdfVEhJTktQQURfQUNQSV9CQVkgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENNT1Mgc3ViZHJpdmVyCi0gKi8KLQotLyogc3lzZnMgY21vc19jb21tYW5kIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi1zdGF0aWMgc3NpemVfdCBjbW9zX2NvbW1hbmRfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAotCQkJICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQkJICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQotewotCXVuc2lnbmVkIGxvbmcgY21vc19jbWQ7Ci0JaW50IHJlczsKLQotCWlmIChwYXJzZV9zdHJ0b3VsKGJ1ZiwgMjEsICZjbW9zX2NtZCkpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JcmVzID0gaXNzdWVfdGhpbmtwYWRfY21vc19jb21tYW5kKGNtb3NfY21kKTsKLQlyZXR1cm4gKHJlcyk/IHJlcyA6IGNvdW50OwotfQotCi1zdGF0aWMgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgZGV2X2F0dHJfY21vc19jb21tYW5kID0KLQlfX0FUVFIoY21vc19jb21tYW5kLCBTX0lXVVNSLCBOVUxMLCBjbW9zX2NvbW1hbmRfc3RvcmUpOwotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotc3RhdGljIGludCBfX2luaXQgY21vc19pbml0KHN0cnVjdCBpYm1faW5pdF9zdHJ1Y3QgKmlpYm0pCi17Ci0JaW50IHJlczsKLQotCXZkYmdfcHJpbnRrKFRQQUNQSV9EQkdfSU5JVCwKLQkJImluaXRpYWxpemluZyBjbW9zIGNvbW1hbmRzIHN1YmRyaXZlclxuIik7Ci0KLQlUUEFDUElfQUNQSUhBTkRMRV9JTklUKGNtb3MpOwotCi0JdmRiZ19wcmludGsoVFBBQ1BJX0RCR19JTklULCAiY21vcyBjb21tYW5kcyBhcmUgJXNcbiIsCi0JCXN0cl9zdXBwb3J0ZWQoY21vc19oYW5kbGUgIT0gTlVMTCkpOwotCi0JcmVzID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZ0cGFjcGlfcGRldi0+ZGV2LCAmZGV2X2F0dHJfY21vc19jb21tYW5kKTsKLQlpZiAocmVzKQotCQlyZXR1cm4gcmVzOwotCi0JcmV0dXJuIChjbW9zX2hhbmRsZSk/IDAgOiAxOwotfQotCi1zdGF0aWMgdm9pZCBjbW9zX2V4aXQodm9pZCkKLXsKLQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJnRwYWNwaV9wZGV2LT5kZXYsICZkZXZfYXR0cl9jbW9zX2NvbW1hbmQpOwotfQotCi1zdGF0aWMgaW50IGNtb3NfcmVhZChjaGFyICpwKQotewotCWludCBsZW4gPSAwOwotCi0JLyogY21vcyBub3Qgc3VwcG9ydGVkIG9uIDU3MCwgNjAwZS94LCA3NzBlLCA3NzB4LCBBMjFlLCBBMnhtL3AsCi0JICAgUjMwLCBSMzEsIFQyMC0yMiwgWDIwLTIxICovCi0JaWYgKCFjbW9zX2hhbmRsZSkKLQkJbGVuICs9IHNwcmludGYocCArIGxlbiwgInN0YXR1czpcdFx0bm90IHN1cHBvcnRlZFxuIik7Ci0JZWxzZSB7Ci0JCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICJzdGF0dXM6XHRcdHN1cHBvcnRlZFxuIik7Ci0JCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICJjb21tYW5kczpcdDxjbWQ+ICg8Y21kPiBpcyAwLTIxKVxuIik7Ci0JfQotCi0JcmV0dXJuIGxlbjsKLX0KLQotc3RhdGljIGludCBjbW9zX3dyaXRlKGNoYXIgKmJ1ZikKLXsKLQljaGFyICpjbWQ7Ci0JaW50IGNtb3NfY21kLCByZXM7Ci0KLQl3aGlsZSAoKGNtZCA9IG5leHRfY21kKCZidWYpKSkgewotCQlpZiAoc3NjYW5mKGNtZCwgIiV1IiwgJmNtb3NfY21kKSA9PSAxICYmCi0JCSAgICBjbW9zX2NtZCA+PSAwICYmIGNtb3NfY21kIDw9IDIxKSB7Ci0JCQkvKiBjbW9zX2NtZCBzZXQgKi8KLQkJfSBlbHNlCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQotCQlyZXMgPSBpc3N1ZV90aGlua3BhZF9jbW9zX2NvbW1hbmQoY21vc19jbWQpOwotCQlpZiAocmVzKQotCQkJcmV0dXJuIHJlczsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHN0cnVjdCBpYm1fc3RydWN0IGNtb3NfZHJpdmVyX2RhdGEgPSB7Ci0JLm5hbWUgPSAiY21vcyIsCi0JLnJlYWQgPSBjbW9zX3JlYWQsCi0JLndyaXRlID0gY21vc193cml0ZSwKLQkuZXhpdCA9IGNtb3NfZXhpdCwKLX07Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBMRUQgc3ViZHJpdmVyCi0gKi8KLQotZW51bSBsZWRfYWNjZXNzX21vZGUgewotCVRQQUNQSV9MRURfTk9ORSA9IDAsCi0JVFBBQ1BJX0xFRF81NzAsCS8qIDU3MCAqLwotCVRQQUNQSV9MRURfT0xELAkvKiA2MDBlL3gsIDc3MGUsIDc3MHgsIEEyMWUsIEEyeG0vcCwgVDIwLTIyLCBYMjAtMjEgKi8KLQlUUEFDUElfTEVEX05FVywJLyogYWxsIG90aGVycyAqLwotfTsKLQotZW51bSB7CS8qIEZvciBUUEFDUElfTEVEX09MRCAqLwotCVRQQUNQSV9MRURfRUNfSExDTCA9IDB4MGMsCS8qIEVDIHJlZyB0byBnZXQgbGVkIHRvIHBvd2VyIG9uICovCi0JVFBBQ1BJX0xFRF9FQ19ITEJMID0gMHgwZCwJLyogRUMgcmVnIHRvIGJsaW5rIGEgbGl0IGxlZCAqLwotCVRQQUNQSV9MRURfRUNfSExNUyA9IDB4MGUsCS8qIEVDIHJlZyB0byBzZWxlY3QgbGVkIHRvIGNvbW1hbmQgKi8KLX07Ci0KLWVudW0gbGVkX3N0YXR1c190IHsKLQlUUEFDUElfTEVEX09GRiA9IDAsCi0JVFBBQ1BJX0xFRF9PTiwKLQlUUEFDUElfTEVEX0JMSU5LLAotfTsKLQotc3RhdGljIGVudW0gbGVkX2FjY2Vzc19tb2RlIGxlZF9zdXBwb3J0ZWQ7Ci0KLVRQQUNQSV9IQU5ETEUobGVkLCBlYywgIlNMRUQiLAkvKiA1NzAgKi8KLQkgICAiU1lTTCIsCQkvKiA2MDBlL3gsIDc3MGUsIDc3MHgsIEEyMWUsIEEyeG0vcCwgKi8KLQkJCQkvKiBUMjAtMjIsIFgyMC0yMSAqLwotCSAgICJMRUQiLAkJLyogYWxsIG90aGVycyAqLwotCSAgICk7CQkJLyogUjMwLCBSMzEgKi8KLQotI2RlZmluZSBUUEFDUElfTEVEX05VTUxFRFMgOAotc3RhdGljIHN0cnVjdCB0cGFjcGlfbGVkX2NsYXNzZGV2ICp0cGFjcGlfbGVkczsKLXN0YXRpYyBlbnVtIGxlZF9zdGF0dXNfdCB0cGFjcGlfbGVkX3N0YXRlX2NhY2hlW1RQQUNQSV9MRURfTlVNTEVEU107Ci1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHRwYWNwaV9sZWRfbmFtZXNbVFBBQ1BJX0xFRF9OVU1MRURTXSA9IHsKLQkvKiB0aGVyZSdzIGEgbGltaXQgb2YgMTkgY2hhcnMgKyBOVUxMIGJlZm9yZSAyLjYuMjYgKi8KLQkidHBhY3BpOjpwb3dlciIsCi0JInRwYWNwaTpvcmFuZ2U6YmF0dCIsCi0JInRwYWNwaTpncmVlbjpiYXR0IiwKLQkidHBhY3BpOjpkb2NrX2FjdGl2ZSIsCi0JInRwYWNwaTo6YmF5X2FjdGl2ZSIsCi0JInRwYWNwaTo6ZG9ja19iYXR0IiwKLQkidHBhY3BpOjp1bmtub3duX2xlZCIsCi0JInRwYWNwaTo6c3RhbmRieSIsCi19OwotCi1zdGF0aWMgaW50IGxlZF9nZXRfc3RhdHVzKGNvbnN0IHVuc2lnbmVkIGludCBsZWQpCi17Ci0JaW50IHN0YXR1czsKLQllbnVtIGxlZF9zdGF0dXNfdCBsZWRfczsKLQotCXN3aXRjaCAobGVkX3N1cHBvcnRlZCkgewotCWNhc2UgVFBBQ1BJX0xFRF81NzA6Ci0JCWlmICghYWNwaV9ldmFsZihlY19oYW5kbGUsCi0JCQkJJnN0YXR1cywgIkdMRUQiLCAiZGQiLCAxIDw8IGxlZCkpCi0JCQlyZXR1cm4gLUVJTzsKLQkJbGVkX3MgPSAoc3RhdHVzID09IDApPwotCQkJCVRQQUNQSV9MRURfT0ZGIDoKLQkJCQkoKHN0YXR1cyA9PSAxKT8KLQkJCQkJVFBBQ1BJX0xFRF9PTiA6Ci0JCQkJCVRQQUNQSV9MRURfQkxJTkspOwotCQl0cGFjcGlfbGVkX3N0YXRlX2NhY2hlW2xlZF0gPSBsZWRfczsKLQkJcmV0dXJuIGxlZF9zOwotCWRlZmF1bHQ6Ci0JCXJldHVybiAtRU5YSU87Ci0JfQotCi0JLyogbm90IHJlYWNoZWQgKi8KLX0KLQotc3RhdGljIGludCBsZWRfc2V0X3N0YXR1cyhjb25zdCB1bnNpZ25lZCBpbnQgbGVkLAotCQkJICBjb25zdCBlbnVtIGxlZF9zdGF0dXNfdCBsZWRzdGF0dXMpCi17Ci0JLyogb2ZmLCBvbiwgYmxpbmsuIEluZGV4IGlzIGxlZF9zdGF0dXNfdCAqLwotCXN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbGVkX3NsZWRfYXJnMVtdID0geyAwLCAxLCAzIH07Ci0Jc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBsZWRfbGVkX2FyZzFbXSA9IHsgMCwgMHg4MCwgMHhjMCB9OwotCi0JaW50IHJjID0gMDsKLQotCXN3aXRjaCAobGVkX3N1cHBvcnRlZCkgewotCWNhc2UgVFBBQ1BJX0xFRF81NzA6Ci0JCS8qIDU3MCAqLwotCQlpZiAobGVkID4gNykKLQkJCXJldHVybiAtRUlOVkFMOwotCQlpZiAoIWFjcGlfZXZhbGYobGVkX2hhbmRsZSwgTlVMTCwgTlVMTCwgInZkZCIsCi0JCQkJKDEgPDwgbGVkKSwgbGVkX3NsZWRfYXJnMVtsZWRzdGF0dXNdKSkKLQkJCXJjID0gLUVJTzsKLQkJYnJlYWs7Ci0JY2FzZSBUUEFDUElfTEVEX09MRDoKLQkJLyogNjAwZS94LCA3NzBlLCA3NzB4LCBBMjFlLCBBMnhtL3AsIFQyMC0yMiwgWDIwICovCi0JCWlmIChsZWQgPiA3KQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCXJjID0gZWNfd3JpdGUoVFBBQ1BJX0xFRF9FQ19ITE1TLCAoMSA8PCBsZWQpKTsKLQkJaWYgKHJjID49IDApCi0JCQlyYyA9IGVjX3dyaXRlKFRQQUNQSV9MRURfRUNfSExCTCwKLQkJCQkgICAgICAobGVkc3RhdHVzID09IFRQQUNQSV9MRURfQkxJTkspIDw8IGxlZCk7Ci0JCWlmIChyYyA+PSAwKQotCQkJcmMgPSBlY193cml0ZShUUEFDUElfTEVEX0VDX0hMQ0wsCi0JCQkJICAgICAgKGxlZHN0YXR1cyAhPSBUUEFDUElfTEVEX09GRikgPDwgbGVkKTsKLQkJYnJlYWs7Ci0JY2FzZSBUUEFDUElfTEVEX05FVzoKLQkJLyogYWxsIG90aGVycyAqLwotCQlpZiAoIWFjcGlfZXZhbGYobGVkX2hhbmRsZSwgTlVMTCwgTlVMTCwgInZkZCIsCi0JCQkJbGVkLCBsZWRfbGVkX2FyZzFbbGVkc3RhdHVzXSkpCi0JCQlyYyA9IC1FSU87Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJjID0gLUVOWElPOwotCX0KLQotCWlmICghcmMpCi0JCXRwYWNwaV9sZWRfc3RhdGVfY2FjaGVbbGVkXSA9IGxlZHN0YXR1czsKLQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIHZvaWQgbGVkX3N5c2ZzX3NldF9zdGF0dXModW5zaWduZWQgaW50IGxlZCwKLQkJCQkgZW51bSBsZWRfYnJpZ2h0bmVzcyBicmlnaHRuZXNzKQotewotCWxlZF9zZXRfc3RhdHVzKGxlZCwKLQkJCShicmlnaHRuZXNzID09IExFRF9PRkYpID8KLQkJCVRQQUNQSV9MRURfT0ZGIDoKLQkJCSh0cGFjcGlfbGVkX3N0YXRlX2NhY2hlW2xlZF0gPT0gVFBBQ1BJX0xFRF9CTElOSykgPwotCQkJCVRQQUNQSV9MRURfQkxJTksgOiBUUEFDUElfTEVEX09OKTsKLX0KLQotc3RhdGljIHZvaWQgbGVkX3NldF9zdGF0dXNfd29ya2VyKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKLXsKLQlzdHJ1Y3QgdHBhY3BpX2xlZF9jbGFzc2RldiAqZGF0YSA9Ci0JCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgdHBhY3BpX2xlZF9jbGFzc2Rldiwgd29yayk7Ci0KLQlpZiAobGlrZWx5KHRwYWNwaV9saWZlY3ljbGUgPT0gVFBBQ1BJX0xJRkVfUlVOTklORykpCi0JCWxlZF9zeXNmc19zZXRfc3RhdHVzKGRhdGEtPmxlZCwgZGF0YS0+bmV3X2JyaWdodG5lc3MpOwotfQotCi1zdGF0aWMgdm9pZCBsZWRfc3lzZnNfc2V0KHN0cnVjdCBsZWRfY2xhc3NkZXYgKmxlZF9jZGV2LAotCQkJZW51bSBsZWRfYnJpZ2h0bmVzcyBicmlnaHRuZXNzKQotewotCXN0cnVjdCB0cGFjcGlfbGVkX2NsYXNzZGV2ICpkYXRhID0gY29udGFpbmVyX29mKGxlZF9jZGV2LAotCQkJICAgICBzdHJ1Y3QgdHBhY3BpX2xlZF9jbGFzc2RldiwgbGVkX2NsYXNzZGV2KTsKLQotCWRhdGEtPm5ld19icmlnaHRuZXNzID0gYnJpZ2h0bmVzczsKLQlxdWV1ZV93b3JrKHRwYWNwaV93cSwgJmRhdGEtPndvcmspOwotfQotCi1zdGF0aWMgaW50IGxlZF9zeXNmc19ibGlua19zZXQoc3RydWN0IGxlZF9jbGFzc2RldiAqbGVkX2NkZXYsCi0JCQl1bnNpZ25lZCBsb25nICpkZWxheV9vbiwgdW5zaWduZWQgbG9uZyAqZGVsYXlfb2ZmKQotewotCXN0cnVjdCB0cGFjcGlfbGVkX2NsYXNzZGV2ICpkYXRhID0gY29udGFpbmVyX29mKGxlZF9jZGV2LAotCQkJICAgICBzdHJ1Y3QgdHBhY3BpX2xlZF9jbGFzc2RldiwgbGVkX2NsYXNzZGV2KTsKLQotCS8qIENhbiB3ZSBjaG9vc2UgdGhlIGZsYXNoIHJhdGU/ICovCi0JaWYgKCpkZWxheV9vbiA9PSAwICYmICpkZWxheV9vZmYgPT0gMCkgewotCQkvKiB5ZXMuIHNldCB0aGVtIHRvIHRoZSBoYXJkd2FyZSBibGluayByYXRlICgxIEh6KSAqLwotCQkqZGVsYXlfb24gPSA1MDA7IC8qIG1zICovCi0JCSpkZWxheV9vZmYgPSA1MDA7IC8qIG1zICovCi0JfSBlbHNlIGlmICgoKmRlbGF5X29uICE9IDUwMCkgfHwgKCpkZWxheV9vZmYgIT0gNTAwKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlkYXRhLT5uZXdfYnJpZ2h0bmVzcyA9IFRQQUNQSV9MRURfQkxJTks7Ci0JcXVldWVfd29yayh0cGFjcGlfd3EsICZkYXRhLT53b3JrKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgZW51bSBsZWRfYnJpZ2h0bmVzcyBsZWRfc3lzZnNfZ2V0KHN0cnVjdCBsZWRfY2xhc3NkZXYgKmxlZF9jZGV2KQotewotCWludCByYzsKLQotCXN0cnVjdCB0cGFjcGlfbGVkX2NsYXNzZGV2ICpkYXRhID0gY29udGFpbmVyX29mKGxlZF9jZGV2LAotCQkJICAgICBzdHJ1Y3QgdHBhY3BpX2xlZF9jbGFzc2RldiwgbGVkX2NsYXNzZGV2KTsKLQotCXJjID0gbGVkX2dldF9zdGF0dXMoZGF0YS0+bGVkKTsKLQotCWlmIChyYyA9PSBUUEFDUElfTEVEX09GRiB8fCByYyA8IDApCi0JCXJjID0gTEVEX09GRjsJLyogbm8gZXJyb3IgaGFuZGxpbmcgaW4gbGVkIGNsYXNzIDooICovCi0JZWxzZQotCQlyYyA9IExFRF9GVUxMOwotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgdm9pZCBsZWRfZXhpdCh2b2lkKQotewotCXVuc2lnbmVkIGludCBpOwotCi0JZm9yIChpID0gMDsgaSA8IFRQQUNQSV9MRURfTlVNTEVEUzsgaSsrKSB7Ci0JCWlmICh0cGFjcGlfbGVkc1tpXS5sZWRfY2xhc3NkZXYubmFtZSkKLQkJCWxlZF9jbGFzc2Rldl91bnJlZ2lzdGVyKCZ0cGFjcGlfbGVkc1tpXS5sZWRfY2xhc3NkZXYpOwotCX0KLQotCWtmcmVlKHRwYWNwaV9sZWRzKTsKLX0KLQotc3RhdGljIGludCBfX2luaXQgbGVkX2luaXQoc3RydWN0IGlibV9pbml0X3N0cnVjdCAqaWlibSkKLXsKLQl1bnNpZ25lZCBpbnQgaTsKLQlpbnQgcmM7Ci0KLQl2ZGJnX3ByaW50ayhUUEFDUElfREJHX0lOSVQsICJpbml0aWFsaXppbmcgTEVEIHN1YmRyaXZlclxuIik7Ci0KLQlUUEFDUElfQUNQSUhBTkRMRV9JTklUKGxlZCk7Ci0KLQlpZiAoIWxlZF9oYW5kbGUpCi0JCS8qIGxlZCBub3Qgc3VwcG9ydGVkIG9uIFIzMCwgUjMxICovCi0JCWxlZF9zdXBwb3J0ZWQgPSBUUEFDUElfTEVEX05PTkU7Ci0JZWxzZSBpZiAoc3RybGVuY21wKGxlZF9wYXRoLCAiU0xFRCIpID09IDApCi0JCS8qIDU3MCAqLwotCQlsZWRfc3VwcG9ydGVkID0gVFBBQ1BJX0xFRF81NzA7Ci0JZWxzZSBpZiAoc3RybGVuY21wKGxlZF9wYXRoLCAiU1lTTCIpID09IDApCi0JCS8qIDYwMGUveCwgNzcwZSwgNzcweCwgQTIxZSwgQTJ4bS9wLCBUMjAtMjIsIFgyMC0yMSAqLwotCQlsZWRfc3VwcG9ydGVkID0gVFBBQ1BJX0xFRF9PTEQ7Ci0JZWxzZQotCQkvKiBhbGwgb3RoZXJzICovCi0JCWxlZF9zdXBwb3J0ZWQgPSBUUEFDUElfTEVEX05FVzsKLQotCXZkYmdfcHJpbnRrKFRQQUNQSV9EQkdfSU5JVCwgIkxFRCBjb21tYW5kcyBhcmUgJXMsIG1vZGUgJWRcbiIsCi0JCXN0cl9zdXBwb3J0ZWQobGVkX3N1cHBvcnRlZCksIGxlZF9zdXBwb3J0ZWQpOwotCi0JdHBhY3BpX2xlZHMgPSBremFsbG9jKHNpemVvZigqdHBhY3BpX2xlZHMpICogVFBBQ1BJX0xFRF9OVU1MRURTLAotCQkJICAgICAgR0ZQX0tFUk5FTCk7Ci0JaWYgKCF0cGFjcGlfbGVkcykgewotCQlwcmludGsoVFBBQ1BJX0VSUiAiT3V0IG9mIG1lbW9yeSBmb3IgTEVEIGRhdGFcbiIpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQlmb3IgKGkgPSAwOyBpIDwgVFBBQ1BJX0xFRF9OVU1MRURTOyBpKyspIHsKLQkJdHBhY3BpX2xlZHNbaV0ubGVkID0gaTsKLQotCQl0cGFjcGlfbGVkc1tpXS5sZWRfY2xhc3NkZXYuYnJpZ2h0bmVzc19zZXQgPSAmbGVkX3N5c2ZzX3NldDsKLQkJdHBhY3BpX2xlZHNbaV0ubGVkX2NsYXNzZGV2LmJsaW5rX3NldCA9ICZsZWRfc3lzZnNfYmxpbmtfc2V0OwotCQlpZiAobGVkX3N1cHBvcnRlZCA9PSBUUEFDUElfTEVEXzU3MCkKLQkJCXRwYWNwaV9sZWRzW2ldLmxlZF9jbGFzc2Rldi5icmlnaHRuZXNzX2dldCA9Ci0JCQkJCQkJJmxlZF9zeXNmc19nZXQ7Ci0KLQkJdHBhY3BpX2xlZHNbaV0ubGVkX2NsYXNzZGV2Lm5hbWUgPSB0cGFjcGlfbGVkX25hbWVzW2ldOwotCi0JCUlOSVRfV09SSygmdHBhY3BpX2xlZHNbaV0ud29yaywgbGVkX3NldF9zdGF0dXNfd29ya2VyKTsKLQotCQlyYyA9IGxlZF9jbGFzc2Rldl9yZWdpc3RlcigmdHBhY3BpX3BkZXYtPmRldiwKLQkJCQkJICAgJnRwYWNwaV9sZWRzW2ldLmxlZF9jbGFzc2Rldik7Ci0JCWlmIChyYyA8IDApIHsKLQkJCXRwYWNwaV9sZWRzW2ldLmxlZF9jbGFzc2Rldi5uYW1lID0gTlVMTDsKLQkJCWxlZF9leGl0KCk7Ci0JCQlyZXR1cm4gcmM7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gKGxlZF9zdXBwb3J0ZWQgIT0gVFBBQ1BJX0xFRF9OT05FKT8gMCA6IDE7Ci19Ci0KLSNkZWZpbmUgc3RyX2xlZF9zdGF0dXMocykgXAotCSgocykgPT0gVFBBQ1BJX0xFRF9PRkYgPyAib2ZmIiA6IFwKLQkJKChzKSA9PSBUUEFDUElfTEVEX09OID8gIm9uIiA6ICJibGlua2luZyIpKQotCi1zdGF0aWMgaW50IGxlZF9yZWFkKGNoYXIgKnApCi17Ci0JaW50IGxlbiA9IDA7Ci0KLQlpZiAoIWxlZF9zdXBwb3J0ZWQpIHsKLQkJbGVuICs9IHNwcmludGYocCArIGxlbiwgInN0YXR1czpcdFx0bm90IHN1cHBvcnRlZFxuIik7Ci0JCXJldHVybiBsZW47Ci0JfQotCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICJzdGF0dXM6XHRcdHN1cHBvcnRlZFxuIik7Ci0KLQlpZiAobGVkX3N1cHBvcnRlZCA9PSBUUEFDUElfTEVEXzU3MCkgewotCQkvKiA1NzAgKi8KLQkJaW50IGksIHN0YXR1czsKLQkJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgewotCQkJc3RhdHVzID0gbGVkX2dldF9zdGF0dXMoaSk7Ci0JCQlpZiAoc3RhdHVzIDwgMCkKLQkJCQlyZXR1cm4gLUVJTzsKLQkJCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICIlZDpcdFx0JXNcbiIsCi0JCQkJICAgICAgIGksIHN0cl9sZWRfc3RhdHVzKHN0YXR1cykpOwotCQl9Ci0JfQotCi0JbGVuICs9IHNwcmludGYocCArIGxlbiwgImNvbW1hbmRzOlx0IgotCQkgICAgICAgIjxsZWQ+IG9uLCA8bGVkPiBvZmYsIDxsZWQ+IGJsaW5rICg8bGVkPiBpcyAwLTcpXG4iKTsKLQotCXJldHVybiBsZW47Ci19Ci0KLXN0YXRpYyBpbnQgbGVkX3dyaXRlKGNoYXIgKmJ1ZikKLXsKLQljaGFyICpjbWQ7Ci0JaW50IGxlZCwgcmM7Ci0JZW51bSBsZWRfc3RhdHVzX3QgczsKLQotCWlmICghbGVkX3N1cHBvcnRlZCkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQl3aGlsZSAoKGNtZCA9IG5leHRfY21kKCZidWYpKSkgewotCQlpZiAoc3NjYW5mKGNtZCwgIiVkIiwgJmxlZCkgIT0gMSB8fCBsZWQgPCAwIHx8IGxlZCA+IDcpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQotCQlpZiAoc3Ryc3RyKGNtZCwgIm9mZiIpKSB7Ci0JCQlzID0gVFBBQ1BJX0xFRF9PRkY7Ci0JCX0gZWxzZSBpZiAoc3Ryc3RyKGNtZCwgIm9uIikpIHsKLQkJCXMgPSBUUEFDUElfTEVEX09OOwotCQl9IGVsc2UgaWYgKHN0cnN0cihjbWQsICJibGluayIpKSB7Ci0JCQlzID0gVFBBQ1BJX0xFRF9CTElOSzsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0KLQkJcmMgPSBsZWRfc2V0X3N0YXR1cyhsZWQsIHMpOwotCQlpZiAocmMgPCAwKQotCQkJcmV0dXJuIHJjOwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3RydWN0IGlibV9zdHJ1Y3QgbGVkX2RyaXZlcl9kYXRhID0gewotCS5uYW1lID0gImxlZCIsCi0JLnJlYWQgPSBsZWRfcmVhZCwKLQkud3JpdGUgPSBsZWRfd3JpdGUsCi0JLmV4aXQgPSBsZWRfZXhpdCwKLX07Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBCZWVwIHN1YmRyaXZlcgotICovCi0KLVRQQUNQSV9IQU5ETEUoYmVlcCwgZWMsICJCRUVQIik7CS8qIGFsbCBleGNlcHQgUjMwLCBSMzEgKi8KLQotc3RhdGljIGludCBfX2luaXQgYmVlcF9pbml0KHN0cnVjdCBpYm1faW5pdF9zdHJ1Y3QgKmlpYm0pCi17Ci0JdmRiZ19wcmludGsoVFBBQ1BJX0RCR19JTklULCAiaW5pdGlhbGl6aW5nIGJlZXAgc3ViZHJpdmVyXG4iKTsKLQotCVRQQUNQSV9BQ1BJSEFORExFX0lOSVQoYmVlcCk7Ci0KLQl2ZGJnX3ByaW50ayhUUEFDUElfREJHX0lOSVQsICJiZWVwIGlzICVzXG4iLAotCQlzdHJfc3VwcG9ydGVkKGJlZXBfaGFuZGxlICE9IE5VTEwpKTsKLQotCXJldHVybiAoYmVlcF9oYW5kbGUpPyAwIDogMTsKLX0KLQotc3RhdGljIGludCBiZWVwX3JlYWQoY2hhciAqcCkKLXsKLQlpbnQgbGVuID0gMDsKLQotCWlmICghYmVlcF9oYW5kbGUpCi0JCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICJzdGF0dXM6XHRcdG5vdCBzdXBwb3J0ZWRcbiIpOwotCWVsc2UgewotCQlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAic3RhdHVzOlx0XHRzdXBwb3J0ZWRcbiIpOwotCQlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAiY29tbWFuZHM6XHQ8Y21kPiAoPGNtZD4gaXMgMC0xNylcbiIpOwotCX0KLQotCXJldHVybiBsZW47Ci19Ci0KLXN0YXRpYyBpbnQgYmVlcF93cml0ZShjaGFyICpidWYpCi17Ci0JY2hhciAqY21kOwotCWludCBiZWVwX2NtZDsKLQotCWlmICghYmVlcF9oYW5kbGUpCi0JCXJldHVybiAtRU5PREVWOwotCi0Jd2hpbGUgKChjbWQgPSBuZXh0X2NtZCgmYnVmKSkpIHsKLQkJaWYgKHNzY2FuZihjbWQsICIldSIsICZiZWVwX2NtZCkgPT0gMSAmJgotCQkgICAgYmVlcF9jbWQgPj0gMCAmJiBiZWVwX2NtZCA8PSAxNykgewotCQkJLyogYmVlcF9jbWQgc2V0ICovCi0JCX0gZWxzZQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCWlmICghYWNwaV9ldmFsZihiZWVwX2hhbmRsZSwgTlVMTCwgTlVMTCwgInZkZCIsIGJlZXBfY21kLCAwKSkKLQkJCXJldHVybiAtRUlPOwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3RydWN0IGlibV9zdHJ1Y3QgYmVlcF9kcml2ZXJfZGF0YSA9IHsKLQkubmFtZSA9ICJiZWVwIiwKLQkucmVhZCA9IGJlZXBfcmVhZCwKLQkud3JpdGUgPSBiZWVwX3dyaXRlLAotfTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFRoZXJtYWwgc3ViZHJpdmVyCi0gKi8KLQotZW51bSB0aGVybWFsX2FjY2Vzc19tb2RlIHsKLQlUUEFDUElfVEhFUk1BTF9OT05FID0gMCwJLyogTm8gdGhlcm1hbCBzdXBwb3J0ICovCi0JVFBBQ1BJX1RIRVJNQUxfQUNQSV9UTVAwNywJLyogVXNlIEFDUEkgVE1QMC03ICovCi0JVFBBQ1BJX1RIRVJNQUxfQUNQSV9VUERULAkvKiBVc2UgQUNQSSBUTVAwLTcgd2l0aCBVUERUICovCi0JVFBBQ1BJX1RIRVJNQUxfVFBFQ184LAkJLyogVXNlIEFDUEkgRUMgcmVncywgOCBzZW5zb3JzICovCi0JVFBBQ1BJX1RIRVJNQUxfVFBFQ18xNiwJCS8qIFVzZSBBQ1BJIEVDIHJlZ3MsIDE2IHNlbnNvcnMgKi8KLX07Ci0KLWVudW0geyAvKiBUUEFDUElfVEhFUk1BTF9UUEVDXyogKi8KLQlUUF9FQ19USEVSTUFMX1RNUDAgPSAweDc4LAkvKiBBQ1BJIEVDIHJlZ3MgVE1QIDAuLjcgKi8KLQlUUF9FQ19USEVSTUFMX1RNUDggPSAweEMwLAkvKiBBQ1BJIEVDIHJlZ3MgVE1QIDguLjE1ICovCi0JVFBfRUNfVEhFUk1BTF9UTVBfTkEgPSAtMTI4LAkvKiBBQ1BJIEVDIHNlbnNvciBub3QgYXZhaWxhYmxlICovCi19OwotCi0jZGVmaW5lIFRQQUNQSV9NQVhfVEhFUk1BTF9TRU5TT1JTIDE2CS8qIE1heCB0aGVybWFsIHNlbnNvcnMgc3VwcG9ydGVkICovCi1zdHJ1Y3QgaWJtX3RoZXJtYWxfc2Vuc29yc19zdHJ1Y3QgewotCXMzMiB0ZW1wW1RQQUNQSV9NQVhfVEhFUk1BTF9TRU5TT1JTXTsKLX07Ci0KLXN0YXRpYyBlbnVtIHRoZXJtYWxfYWNjZXNzX21vZGUgdGhlcm1hbF9yZWFkX21vZGU7Ci0KLS8qIGlkeCBpcyB6ZXJvLWJhc2VkICovCi1zdGF0aWMgaW50IHRoZXJtYWxfZ2V0X3NlbnNvcihpbnQgaWR4LCBzMzIgKnZhbHVlKQotewotCWludCB0OwotCXM4IHRtcDsKLQljaGFyIHRtcGlbNV07Ci0KLQl0ID0gVFBfRUNfVEhFUk1BTF9UTVAwOwotCi0Jc3dpdGNoICh0aGVybWFsX3JlYWRfbW9kZSkgewotI2lmIFRQQUNQSV9NQVhfVEhFUk1BTF9TRU5TT1JTID49IDE2Ci0JY2FzZSBUUEFDUElfVEhFUk1BTF9UUEVDXzE2OgotCQlpZiAoaWR4ID49IDggJiYgaWR4IDw9IDE1KSB7Ci0JCQl0ID0gVFBfRUNfVEhFUk1BTF9UTVA4OwotCQkJaWR4IC09IDg7Ci0JCX0KLQkJLyogZmFsbHRocm91Z2ggKi8KLSNlbmRpZgotCWNhc2UgVFBBQ1BJX1RIRVJNQUxfVFBFQ184OgotCQlpZiAoaWR4IDw9IDcpIHsKLQkJCWlmICghYWNwaV9lY19yZWFkKHQgKyBpZHgsICZ0bXApKQotCQkJCXJldHVybiAtRUlPOwotCQkJKnZhbHVlID0gdG1wICogMTAwMDsKLQkJCXJldHVybiAwOwotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBUUEFDUElfVEhFUk1BTF9BQ1BJX1VQRFQ6Ci0JCWlmIChpZHggPD0gNykgewotCQkJc25wcmludGYodG1waSwgc2l6ZW9mKHRtcGkpLCAiVE1QJWMiLCAnMCcgKyBpZHgpOwotCQkJaWYgKCFhY3BpX2V2YWxmKGVjX2hhbmRsZSwgTlVMTCwgIlVQRFQiLCAidiIpKQotCQkJCXJldHVybiAtRUlPOwotCQkJaWYgKCFhY3BpX2V2YWxmKGVjX2hhbmRsZSwgJnQsIHRtcGksICJkIikpCi0JCQkJcmV0dXJuIC1FSU87Ci0JCQkqdmFsdWUgPSAodCAtIDI3MzIpICogMTAwOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIFRQQUNQSV9USEVSTUFMX0FDUElfVE1QMDc6Ci0JCWlmIChpZHggPD0gNykgewotCQkJc25wcmludGYodG1waSwgc2l6ZW9mKHRtcGkpLCAiVE1QJWMiLCAnMCcgKyBpZHgpOwotCQkJaWYgKCFhY3BpX2V2YWxmKGVjX2hhbmRsZSwgJnQsIHRtcGksICJkIikpCi0JCQkJcmV0dXJuIC1FSU87Ci0JCQlpZiAodCA+IDEyNyB8fCB0IDwgLTEyNykKLQkJCQl0ID0gVFBfRUNfVEhFUk1BTF9UTVBfTkE7Ci0JCQkqdmFsdWUgPSB0ICogMTAwMDsKLQkJCXJldHVybiAwOwotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBUUEFDUElfVEhFUk1BTF9OT05FOgotCWRlZmF1bHQ6Ci0JCXJldHVybiAtRU5PU1lTOwotCX0KLQotCXJldHVybiAtRUlOVkFMOwotfQotCi1zdGF0aWMgaW50IHRoZXJtYWxfZ2V0X3NlbnNvcnMoc3RydWN0IGlibV90aGVybWFsX3NlbnNvcnNfc3RydWN0ICpzKQotewotCWludCByZXMsIGk7Ci0JaW50IG47Ci0KLQluID0gODsKLQlpID0gMDsKLQotCWlmICghcykKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlpZiAodGhlcm1hbF9yZWFkX21vZGUgPT0gVFBBQ1BJX1RIRVJNQUxfVFBFQ18xNikKLQkJbiA9IDE2OwotCi0JZm9yIChpID0gMCA7IGkgPCBuOyBpKyspIHsKLQkJcmVzID0gdGhlcm1hbF9nZXRfc2Vuc29yKGksICZzLT50ZW1wW2ldKTsKLQkJaWYgKHJlcykKLQkJCXJldHVybiByZXM7Ci0JfQotCi0JcmV0dXJuIG47Ci19Ci0KLS8qIHN5c2ZzIHRlbXAjI19pbnB1dCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi1zdGF0aWMgc3NpemVfdCB0aGVybWFsX3RlbXBfaW5wdXRfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCSAgIGNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGUgKnNlbnNvcl9hdHRyID0KLQkJCQkJdG9fc2Vuc29yX2Rldl9hdHRyKGF0dHIpOwotCWludCBpZHggPSBzZW5zb3JfYXR0ci0+aW5kZXg7Ci0JczMyIHZhbHVlOwotCWludCByZXM7Ci0KLQlyZXMgPSB0aGVybWFsX2dldF9zZW5zb3IoaWR4LCAmdmFsdWUpOwotCWlmIChyZXMpCi0JCXJldHVybiByZXM7Ci0JaWYgKHZhbHVlID09IFRQX0VDX1RIRVJNQUxfVE1QX05BICogMTAwMCkKLQkJcmV0dXJuIC1FTlhJTzsKLQotCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkXG4iLCB2YWx1ZSk7Ci19Ci0KLSNkZWZpbmUgVEhFUk1BTF9TRU5TT1JfQVRUUl9URU1QKF9pZHhBLCBfaWR4QikgXAotCSBTRU5TT1JfQVRUUih0ZW1wIyNfaWR4QSMjX2lucHV0LCBTX0lSVUdPLCBcCi0JCSAgICAgdGhlcm1hbF90ZW1wX2lucHV0X3Nob3csIE5VTEwsIF9pZHhCKQotCi1zdGF0aWMgc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlIHNlbnNvcl9kZXZfYXR0cl90aGVybWFsX3RlbXBfaW5wdXRbXSA9IHsKLQlUSEVSTUFMX1NFTlNPUl9BVFRSX1RFTVAoMSwgMCksCi0JVEhFUk1BTF9TRU5TT1JfQVRUUl9URU1QKDIsIDEpLAotCVRIRVJNQUxfU0VOU09SX0FUVFJfVEVNUCgzLCAyKSwKLQlUSEVSTUFMX1NFTlNPUl9BVFRSX1RFTVAoNCwgMyksCi0JVEhFUk1BTF9TRU5TT1JfQVRUUl9URU1QKDUsIDQpLAotCVRIRVJNQUxfU0VOU09SX0FUVFJfVEVNUCg2LCA1KSwKLQlUSEVSTUFMX1NFTlNPUl9BVFRSX1RFTVAoNywgNiksCi0JVEhFUk1BTF9TRU5TT1JfQVRUUl9URU1QKDgsIDcpLAotCVRIRVJNQUxfU0VOU09SX0FUVFJfVEVNUCg5LCA4KSwKLQlUSEVSTUFMX1NFTlNPUl9BVFRSX1RFTVAoMTAsIDkpLAotCVRIRVJNQUxfU0VOU09SX0FUVFJfVEVNUCgxMSwgMTApLAotCVRIRVJNQUxfU0VOU09SX0FUVFJfVEVNUCgxMiwgMTEpLAotCVRIRVJNQUxfU0VOU09SX0FUVFJfVEVNUCgxMywgMTIpLAotCVRIRVJNQUxfU0VOU09SX0FUVFJfVEVNUCgxNCwgMTMpLAotCVRIRVJNQUxfU0VOU09SX0FUVFJfVEVNUCgxNSwgMTQpLAotCVRIRVJNQUxfU0VOU09SX0FUVFJfVEVNUCgxNiwgMTUpLAotfTsKLQotI2RlZmluZSBUSEVSTUFMX0FUVFJTKFgpIFwKLQkmc2Vuc29yX2Rldl9hdHRyX3RoZXJtYWxfdGVtcF9pbnB1dFtYXS5kZXZfYXR0ci5hdHRyCi0KLXN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICp0aGVybWFsX3RlbXBfaW5wdXRfYXR0cltdID0gewotCVRIRVJNQUxfQVRUUlMoOCksCi0JVEhFUk1BTF9BVFRSUyg5KSwKLQlUSEVSTUFMX0FUVFJTKDEwKSwKLQlUSEVSTUFMX0FUVFJTKDExKSwKLQlUSEVSTUFMX0FUVFJTKDEyKSwKLQlUSEVSTUFMX0FUVFJTKDEzKSwKLQlUSEVSTUFMX0FUVFJTKDE0KSwKLQlUSEVSTUFMX0FUVFJTKDE1KSwKLQlUSEVSTUFMX0FUVFJTKDApLAotCVRIRVJNQUxfQVRUUlMoMSksCi0JVEhFUk1BTF9BVFRSUygyKSwKLQlUSEVSTUFMX0FUVFJTKDMpLAotCVRIRVJNQUxfQVRUUlMoNCksCi0JVEhFUk1BTF9BVFRSUyg1KSwKLQlUSEVSTUFMX0FUVFJTKDYpLAotCVRIRVJNQUxfQVRUUlMoNyksCi0JTlVMTAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgdGhlcm1hbF90ZW1wX2lucHV0MTZfZ3JvdXAgPSB7Ci0JLmF0dHJzID0gdGhlcm1hbF90ZW1wX2lucHV0X2F0dHIKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIHRoZXJtYWxfdGVtcF9pbnB1dDhfZ3JvdXAgPSB7Ci0JLmF0dHJzID0gJnRoZXJtYWxfdGVtcF9pbnB1dF9hdHRyWzhdCi19OwotCi0jdW5kZWYgVEhFUk1BTF9TRU5TT1JfQVRUUl9URU1QCi0jdW5kZWYgVEhFUk1BTF9BVFRSUwotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotc3RhdGljIGludCBfX2luaXQgdGhlcm1hbF9pbml0KHN0cnVjdCBpYm1faW5pdF9zdHJ1Y3QgKmlpYm0pCi17Ci0JdTggdCwgdGExLCB0YTI7Ci0JaW50IGk7Ci0JaW50IGFjcGlfdG1wNzsKLQlpbnQgcmVzOwotCi0JdmRiZ19wcmludGsoVFBBQ1BJX0RCR19JTklULCAiaW5pdGlhbGl6aW5nIHRoZXJtYWwgc3ViZHJpdmVyXG4iKTsKLQotCWFjcGlfdG1wNyA9IGFjcGlfZXZhbGYoZWNfaGFuZGxlLCBOVUxMLCAiVE1QNyIsICJxdiIpOwotCi0JaWYgKHRoaW5rcGFkX2lkLmVjX21vZGVsKSB7Ci0JCS8qCi0JCSAqIERpcmVjdCBFQyBhY2Nlc3MgbW9kZTogc2Vuc29ycyBhdCByZWdpc3RlcnMKLQkJICogMHg3OC0weDdGLCAweEMwLTB4QzcuICBSZWdpc3RlcnMgcmV0dXJuIDB4MDAgZm9yCi0JCSAqIG5vbi1pbXBsZW1lbnRlZCwgdGhlcm1hbCBzZW5zb3JzIHJldHVybiAweDgwIHdoZW4KLQkJICogbm90IGF2YWlsYWJsZQotCQkgKi8KLQotCQl0YTEgPSB0YTIgPSAwOwotCQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7Ci0JCQlpZiAoYWNwaV9lY19yZWFkKFRQX0VDX1RIRVJNQUxfVE1QMCArIGksICZ0KSkgewotCQkJCXRhMSB8PSB0OwotCQkJfSBlbHNlIHsKLQkJCQl0YTEgPSAwOwotCQkJCWJyZWFrOwotCQkJfQotCQkJaWYgKGFjcGlfZWNfcmVhZChUUF9FQ19USEVSTUFMX1RNUDggKyBpLCAmdCkpIHsKLQkJCQl0YTIgfD0gdDsKLQkJCX0gZWxzZSB7Ci0JCQkJdGExID0gMDsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlpZiAodGExID09IDApIHsKLQkJCS8qIFRoaXMgaXMgc2hlZXIgcGFyYW5vaWEsIGJ1dCB3ZSBoYW5kbGUgaXQgYW55d2F5ICovCi0JCQlpZiAoYWNwaV90bXA3KSB7Ci0JCQkJcHJpbnRrKFRQQUNQSV9FUlIKLQkJCQkgICAgICAgIlRoaW5rUGFkIEFDUEkgRUMgYWNjZXNzIG1pc2JlaGF2aW5nLCAiCi0JCQkJICAgICAgICJmYWxsaW5nIGJhY2sgdG8gQUNQSSBUTVB4IGFjY2VzcyAiCi0JCQkJICAgICAgICJtb2RlXG4iKTsKLQkJCQl0aGVybWFsX3JlYWRfbW9kZSA9IFRQQUNQSV9USEVSTUFMX0FDUElfVE1QMDc7Ci0JCQl9IGVsc2UgewotCQkJCXByaW50ayhUUEFDUElfRVJSCi0JCQkJICAgICAgICJUaGlua1BhZCBBQ1BJIEVDIGFjY2VzcyBtaXNiZWhhdmluZywgIgotCQkJCSAgICAgICAiZGlzYWJsaW5nIHRoZXJtYWwgc2Vuc29ycyBhY2Nlc3NcbiIpOwotCQkJCXRoZXJtYWxfcmVhZF9tb2RlID0gVFBBQ1BJX1RIRVJNQUxfTk9ORTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXRoZXJtYWxfcmVhZF9tb2RlID0KLQkJCSAgICAodGEyICE9IDApID8KLQkJCSAgICBUUEFDUElfVEhFUk1BTF9UUEVDXzE2IDogVFBBQ1BJX1RIRVJNQUxfVFBFQ184OwotCQl9Ci0JfSBlbHNlIGlmIChhY3BpX3RtcDcpIHsKLQkJaWYgKGFjcGlfZXZhbGYoZWNfaGFuZGxlLCBOVUxMLCAiVVBEVCIsICJxdiIpKSB7Ci0JCQkvKiA2MDBlL3gsIDc3MGUsIDc3MHggKi8KLQkJCXRoZXJtYWxfcmVhZF9tb2RlID0gVFBBQ1BJX1RIRVJNQUxfQUNQSV9VUERUOwotCQl9IGVsc2UgewotCQkJLyogU3RhbmRhcmQgQUNQSSBUTVB4IGFjY2VzcywgbWF4IDggc2Vuc29ycyAqLwotCQkJdGhlcm1hbF9yZWFkX21vZGUgPSBUUEFDUElfVEhFUk1BTF9BQ1BJX1RNUDA3OwotCQl9Ci0JfSBlbHNlIHsKLQkJLyogdGVtcGVyYXR1cmVzIG5vdCBzdXBwb3J0ZWQgb24gNTcwLCBHNHgsIFIzMCwgUjMxLCBSMzIgKi8KLQkJdGhlcm1hbF9yZWFkX21vZGUgPSBUUEFDUElfVEhFUk1BTF9OT05FOwotCX0KLQotCXZkYmdfcHJpbnRrKFRQQUNQSV9EQkdfSU5JVCwgInRoZXJtYWwgaXMgJXMsIG1vZGUgJWRcbiIsCi0JCXN0cl9zdXBwb3J0ZWQodGhlcm1hbF9yZWFkX21vZGUgIT0gVFBBQ1BJX1RIRVJNQUxfTk9ORSksCi0JCXRoZXJtYWxfcmVhZF9tb2RlKTsKLQotCXN3aXRjaCAodGhlcm1hbF9yZWFkX21vZGUpIHsKLQljYXNlIFRQQUNQSV9USEVSTUFMX1RQRUNfMTY6Ci0JCXJlcyA9IHN5c2ZzX2NyZWF0ZV9ncm91cCgmdHBhY3BpX3NlbnNvcnNfcGRldi0+ZGV2LmtvYmosCi0JCQkJJnRoZXJtYWxfdGVtcF9pbnB1dDE2X2dyb3VwKTsKLQkJaWYgKHJlcykKLQkJCXJldHVybiByZXM7Ci0JCWJyZWFrOwotCWNhc2UgVFBBQ1BJX1RIRVJNQUxfVFBFQ184OgotCWNhc2UgVFBBQ1BJX1RIRVJNQUxfQUNQSV9UTVAwNzoKLQljYXNlIFRQQUNQSV9USEVSTUFMX0FDUElfVVBEVDoKLQkJcmVzID0gc3lzZnNfY3JlYXRlX2dyb3VwKCZ0cGFjcGlfc2Vuc29yc19wZGV2LT5kZXYua29iaiwKLQkJCQkmdGhlcm1hbF90ZW1wX2lucHV0OF9ncm91cCk7Ci0JCWlmIChyZXMpCi0JCQlyZXR1cm4gcmVzOwotCQlicmVhazsKLQljYXNlIFRQQUNQSV9USEVSTUFMX05PTkU6Ci0JZGVmYXVsdDoKLQkJcmV0dXJuIDE7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIHRoZXJtYWxfZXhpdCh2b2lkKQotewotCXN3aXRjaCAodGhlcm1hbF9yZWFkX21vZGUpIHsKLQljYXNlIFRQQUNQSV9USEVSTUFMX1RQRUNfMTY6Ci0JCXN5c2ZzX3JlbW92ZV9ncm91cCgmdHBhY3BpX3NlbnNvcnNfcGRldi0+ZGV2LmtvYmosCi0JCQkJICAgJnRoZXJtYWxfdGVtcF9pbnB1dDE2X2dyb3VwKTsKLQkJYnJlYWs7Ci0JY2FzZSBUUEFDUElfVEhFUk1BTF9UUEVDXzg6Ci0JY2FzZSBUUEFDUElfVEhFUk1BTF9BQ1BJX1RNUDA3OgotCWNhc2UgVFBBQ1BJX1RIRVJNQUxfQUNQSV9VUERUOgotCQlzeXNmc19yZW1vdmVfZ3JvdXAoJnRwYWNwaV9zZW5zb3JzX3BkZXYtPmRldi5rb2JqLAotCQkJCSAgICZ0aGVybWFsX3RlbXBfaW5wdXQxNl9ncm91cCk7Ci0JCWJyZWFrOwotCWNhc2UgVFBBQ1BJX1RIRVJNQUxfTk9ORToKLQlkZWZhdWx0OgotCQlicmVhazsKLQl9Ci19Ci0KLXN0YXRpYyBpbnQgdGhlcm1hbF9yZWFkKGNoYXIgKnApCi17Ci0JaW50IGxlbiA9IDA7Ci0JaW50IG4sIGk7Ci0Jc3RydWN0IGlibV90aGVybWFsX3NlbnNvcnNfc3RydWN0IHQ7Ci0KLQluID0gdGhlcm1hbF9nZXRfc2Vuc29ycygmdCk7Ci0JaWYgKHVubGlrZWx5KG4gPCAwKSkKLQkJcmV0dXJuIG47Ci0KLQlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAidGVtcGVyYXR1cmVzOlx0Iik7Ci0KLQlpZiAobiA+IDApIHsKLQkJZm9yIChpID0gMDsgaSA8IChuIC0gMSk7IGkrKykKLQkJCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICIlZCAiLCB0LnRlbXBbaV0gLyAxMDAwKTsKLQkJbGVuICs9IHNwcmludGYocCArIGxlbiwgIiVkXG4iLCB0LnRlbXBbaV0gLyAxMDAwKTsKLQl9IGVsc2UKLQkJbGVuICs9IHNwcmludGYocCArIGxlbiwgIm5vdCBzdXBwb3J0ZWRcbiIpOwotCi0JcmV0dXJuIGxlbjsKLX0KLQotc3RhdGljIHN0cnVjdCBpYm1fc3RydWN0IHRoZXJtYWxfZHJpdmVyX2RhdGEgPSB7Ci0JLm5hbWUgPSAidGhlcm1hbCIsCi0JLnJlYWQgPSB0aGVybWFsX3JlYWQsCi0JLmV4aXQgPSB0aGVybWFsX2V4aXQsCi19OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogRUMgRHVtcCBzdWJkcml2ZXIKLSAqLwotCi1zdGF0aWMgdTggZWNkdW1wX3JlZ3NbMjU2XTsKLQotc3RhdGljIGludCBlY2R1bXBfcmVhZChjaGFyICpwKQotewotCWludCBsZW4gPSAwOwotCWludCBpLCBqOwotCXU4IHY7Ci0KLQlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAiRUMgICAgICAiCi0JCSAgICAgICAiICswMCArMDEgKzAyICswMyArMDQgKzA1ICswNiArMDciCi0JCSAgICAgICAiICswOCArMDkgKzBhICswYiArMGMgKzBkICswZSArMGZcbiIpOwotCWZvciAoaSA9IDA7IGkgPCAyNTY7IGkgKz0gMTYpIHsKLQkJbGVuICs9IHNwcmludGYocCArIGxlbiwgIkVDIDB4JTAyeDoiLCBpKTsKLQkJZm9yIChqID0gMDsgaiA8IDE2OyBqKyspIHsKLQkJCWlmICghYWNwaV9lY19yZWFkKGkgKyBqLCAmdikpCi0JCQkJYnJlYWs7Ci0JCQlpZiAodiAhPSBlY2R1bXBfcmVnc1tpICsgal0pCi0JCQkJbGVuICs9IHNwcmludGYocCArIGxlbiwgIiAqJTAyeCIsIHYpOwotCQkJZWxzZQotCQkJCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICIgICUwMngiLCB2KTsKLQkJCWVjZHVtcF9yZWdzW2kgKyBqXSA9IHY7Ci0JCX0KLQkJbGVuICs9IHNwcmludGYocCArIGxlbiwgIlxuIik7Ci0JCWlmIChqICE9IDE2KQotCQkJYnJlYWs7Ci0JfQotCi0JLyogVGhlc2UgYXJlIHdheSB0b28gZGFuZ2Vyb3VzIHRvIGFkdmVydGlzZSBvcGVubHkuLi4gKi8KLSNpZiAwCi0JbGVuICs9IHNwcmludGYocCArIGxlbiwgImNvbW1hbmRzOlx0MHg8b2Zmc2V0PiAweDx2YWx1ZT4iCi0JCSAgICAgICAiICg8b2Zmc2V0PiBpcyAwMC1mZiwgPHZhbHVlPiBpcyAwMC1mZilcbiIpOwotCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICJjb21tYW5kczpcdDB4PG9mZnNldD4gPHZhbHVlPiAgIgotCQkgICAgICAgIiAoPG9mZnNldD4gaXMgMDAtZmYsIDx2YWx1ZT4gaXMgMC0yNTUpXG4iKTsKLSNlbmRpZgotCXJldHVybiBsZW47Ci19Ci0KLXN0YXRpYyBpbnQgZWNkdW1wX3dyaXRlKGNoYXIgKmJ1ZikKLXsKLQljaGFyICpjbWQ7Ci0JaW50IGksIHY7Ci0KLQl3aGlsZSAoKGNtZCA9IG5leHRfY21kKCZidWYpKSkgewotCQlpZiAoc3NjYW5mKGNtZCwgIjB4JXggMHgleCIsICZpLCAmdikgPT0gMikgewotCQkJLyogaSBhbmQgdiBzZXQgKi8KLQkJfSBlbHNlIGlmIChzc2NhbmYoY21kLCAiMHgleCAldSIsICZpLCAmdikgPT0gMikgewotCQkJLyogaSBhbmQgdiBzZXQgKi8KLQkJfSBlbHNlCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJaWYgKGkgPj0gMCAmJiBpIDwgMjU2ICYmIHYgPj0gMCAmJiB2IDwgMjU2KSB7Ci0JCQlpZiAoIWFjcGlfZWNfd3JpdGUoaSwgdikpCi0JCQkJcmV0dXJuIC1FSU87Ci0JCX0gZWxzZQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgaWJtX3N0cnVjdCBlY2R1bXBfZHJpdmVyX2RhdGEgPSB7Ci0JLm5hbWUgPSAiZWNkdW1wIiwKLQkucmVhZCA9IGVjZHVtcF9yZWFkLAotCS53cml0ZSA9IGVjZHVtcF93cml0ZSwKLQkuZmxhZ3MuZXhwZXJpbWVudGFsID0gMSwKLX07Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBCYWNrbGlnaHQvYnJpZ2h0bmVzcyBzdWJkcml2ZXIKLSAqLwotCi0jZGVmaW5lIFRQQUNQSV9CQUNLTElHSFRfREVWX05BTUUgInRoaW5rcGFkX3NjcmVlbiIKLQotZW51bSB7Ci0JVFBfRUNfQkFDS0xJR0hUID0gMHgzMSwKLQotCS8qIFRQX0VDX0JBQ0tMSUdIVCBiaXRtYXNrcyAqLwotCVRQX0VDX0JBQ0tMSUdIVF9MVkxNU0sgPSAweDFGLAotCVRQX0VDX0JBQ0tMSUdIVF9DTURNU0sgPSAweEUwLAotCVRQX0VDX0JBQ0tMSUdIVF9NQVBTVyA9IDB4MjAsCi19OwotCi1zdGF0aWMgc3RydWN0IGJhY2tsaWdodF9kZXZpY2UgKmlibV9iYWNrbGlnaHRfZGV2aWNlOwotc3RhdGljIGludCBicmlnaHRuZXNzX21vZGU7Ci1zdGF0aWMgdW5zaWduZWQgaW50IGJyaWdodG5lc3NfZW5hYmxlID0gMjsgLyogMiA9IGF1dG8sIDAgPSBubywgMSA9IHllcyAqLwotCi1zdGF0aWMgc3RydWN0IG11dGV4IGJyaWdodG5lc3NfbXV0ZXg7Ci0KLS8qCi0gKiBUaGlua1BhZHMgY2FuIHJlYWQgYnJpZ2h0bmVzcyBmcm9tIHR3byBwbGFjZXM6IEVDIDB4MzEsIG9yCi0gKiBDTU9TIE5WUkFNIGJ5dGUgMHg1RSwgYml0cyAwLTMuCi0gKgotICogRUMgMHgzMSBoYXMgdGhlIGZvbGxvd2luZyBsYXlvdXQKLSAqICAgQml0IDc6IHVua25vd24gZnVuY3Rpb24KLSAqICAgQml0IDY6IHVua25vd24gZnVuY3Rpb24KLSAqICAgQml0IDU6IFo6IGhvbm91ciBzY2FsZSBjaGFuZ2VzLCBOWjogaWdub3JlIHNjYWxlIGNoYW5nZXMKLSAqICAgQml0IDQ6IG11c3QgYmUgc2V0IHRvIHplcm8gdG8gYXZvaWQgcHJvYmxlbXMKLSAqICAgQml0IDMtMDogYmFja2xpZ2h0IGJyaWdodG5lc3MgbGV2ZWwKLSAqCi0gKiBicmlnaHRuZXNzX2dldF9yYXcgcmV0dXJucyBzdGF0dXMgZGF0YSBpbiB0aGUgRUMgMHgzMSBsYXlvdXQKLSAqLwotc3RhdGljIGludCBicmlnaHRuZXNzX2dldF9yYXcoaW50ICpzdGF0dXMpCi17Ci0JdTggbGVjID0gMCwgbGNtb3MgPSAwLCBsZXZlbCA9IDA7Ci0KLQlpZiAoYnJpZ2h0bmVzc19tb2RlICYgMSkgewotCQlpZiAoIWFjcGlfZWNfcmVhZChUUF9FQ19CQUNLTElHSFQsICZsZWMpKQotCQkJcmV0dXJuIC1FSU87Ci0JCWxldmVsID0gbGVjICYgVFBfRUNfQkFDS0xJR0hUX0xWTE1TSzsKLQl9OwotCWlmIChicmlnaHRuZXNzX21vZGUgJiAyKSB7Ci0JCWxjbW9zID0gKG52cmFtX3JlYWRfYnl0ZShUUF9OVlJBTV9BRERSX0JSSUdIVE5FU1MpCi0JCQkgJiBUUF9OVlJBTV9NQVNLX0xFVkVMX0JSSUdIVE5FU1MpCi0JCQk+PiBUUF9OVlJBTV9QT1NfTEVWRUxfQlJJR0hUTkVTUzsKLQkJbGNtb3MgJj0gKHRwX2ZlYXR1cmVzLmJyaWdodF8xNmxldmVscyk/IDB4MGYgOiAweDA3OwotCQlsZXZlbCA9IGxjbW9zOwotCX0KLQotCWlmIChicmlnaHRuZXNzX21vZGUgPT0gMykgewotCQkqc3RhdHVzID0gbGVjOwkvKiBQcmVmZXIgRUMsIENNT1MgaXMganVzdCBhIGJhY2tpbmcgc3RvcmUgKi8KLQkJbGVjICY9IFRQX0VDX0JBQ0tMSUdIVF9MVkxNU0s7Ci0JCWlmIChsZWMgPT0gbGNtb3MpCi0JCQl0cF93YXJuZWQuYnJpZ2h0X2Ntb3NfZWNfdW5zeW5jID0gMDsKLQkJZWxzZSB7Ci0JCQlpZiAoIXRwX3dhcm5lZC5icmlnaHRfY21vc19lY191bnN5bmMpIHsKLQkJCQlwcmludGsoVFBBQ1BJX0VSUgotCQkJCQkiQ01PUyBOVlJBTSAoJXUpIGFuZCBFQyAoJXUpIGRvIG5vdCAiCi0JCQkJCSJhZ3JlZSBvbiBkaXNwbGF5IGJyaWdodG5lc3MgbGV2ZWxcbiIsCi0JCQkJCSh1bnNpZ25lZCBpbnQpIGxjbW9zLAotCQkJCQkodW5zaWduZWQgaW50KSBsZWMpOwotCQkJCXRwX3dhcm5lZC5icmlnaHRfY21vc19lY191bnN5bmMgPSAxOwotCQkJfQotCQkJcmV0dXJuIC1FSU87Ci0JCX0KLQl9IGVsc2UgewotCQkqc3RhdHVzID0gbGV2ZWw7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qIE1heSByZXR1cm4gRUlOVFIgd2hpY2ggY2FuIGFsd2F5cyBiZSBtYXBwZWQgdG8gRVJFU1RBUlRTWVMgKi8KLXN0YXRpYyBpbnQgYnJpZ2h0bmVzc19zZXQoaW50IHZhbHVlKQotewotCWludCBjbW9zX2NtZCwgaW5jLCBpLCByZXM7Ci0JaW50IGN1cnJlbnRfdmFsdWU7Ci0JaW50IGNvbW1hbmRfYml0czsKLQotCWlmICh2YWx1ZSA+ICgodHBfZmVhdHVyZXMuYnJpZ2h0XzE2bGV2ZWxzKT8gMTUgOiA3KSB8fAotCSAgICB2YWx1ZSA8IDApCi0JCXJldHVybiAtRUlOVkFMOwotCi0JcmVzID0gbXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZicmlnaHRuZXNzX211dGV4KTsKLQlpZiAocmVzIDwgMCkKLQkJcmV0dXJuIHJlczsKLQotCXJlcyA9IGJyaWdodG5lc3NfZ2V0X3JhdygmY3VycmVudF92YWx1ZSk7Ci0JaWYgKHJlcyA8IDApCi0JCWdvdG8gZXJyb3V0OwotCi0JY29tbWFuZF9iaXRzID0gY3VycmVudF92YWx1ZSAmIFRQX0VDX0JBQ0tMSUdIVF9DTURNU0s7Ci0JY3VycmVudF92YWx1ZSAmPSBUUF9FQ19CQUNLTElHSFRfTFZMTVNLOwotCi0JY21vc19jbWQgPSB2YWx1ZSA+IGN1cnJlbnRfdmFsdWUgPwotCQkJVFBfQ01PU19CUklHSFRORVNTX1VQIDoKLQkJCVRQX0NNT1NfQlJJR0hUTkVTU19ET1dOOwotCWluYyA9ICh2YWx1ZSA+IGN1cnJlbnRfdmFsdWUpPyAxIDogLTE7Ci0KLQlyZXMgPSAwOwotCWZvciAoaSA9IGN1cnJlbnRfdmFsdWU7IGkgIT0gdmFsdWU7IGkgKz0gaW5jKSB7Ci0JCWlmICgoYnJpZ2h0bmVzc19tb2RlICYgMikgJiYKLQkJICAgIGlzc3VlX3RoaW5rcGFkX2Ntb3NfY29tbWFuZChjbW9zX2NtZCkpIHsKLQkJCXJlcyA9IC1FSU87Ci0JCQlnb3RvIGVycm91dDsKLQkJfQotCQlpZiAoKGJyaWdodG5lc3NfbW9kZSAmIDEpICYmCi0JCSAgICAhYWNwaV9lY193cml0ZShUUF9FQ19CQUNLTElHSFQsCi0JCQkJICAgKGkgKyBpbmMpIHwgY29tbWFuZF9iaXRzKSkgewotCQkJcmVzID0gLUVJTzsKLQkJCWdvdG8gZXJyb3V0OzsKLQkJfQotCX0KLQotZXJyb3V0OgotCW11dGV4X3VubG9jaygmYnJpZ2h0bmVzc19tdXRleCk7Ci0JcmV0dXJuIHJlczsKLX0KLQotLyogc3lzZnMgYmFja2xpZ2h0IGNsYXNzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLXN0YXRpYyBpbnQgYnJpZ2h0bmVzc191cGRhdGVfc3RhdHVzKHN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICpiZCkKLXsKLQkvKiBpdCBpcyB0aGUgYmFja2xpZ2h0IGNsYXNzJ3Mgam9iIChjYWxsZXIpIHRvIGhhbmRsZQotCSAqIEVJTlRSIGFuZCBvdGhlciBlcnJvcnMgcHJvcGVybHkgKi8KLQlyZXR1cm4gYnJpZ2h0bmVzc19zZXQoCi0JCShiZC0+cHJvcHMuZmJfYmxhbmsgPT0gRkJfQkxBTktfVU5CTEFOSyAmJgotCQkgYmQtPnByb3BzLnBvd2VyID09IEZCX0JMQU5LX1VOQkxBTkspID8KLQkJCQliZC0+cHJvcHMuYnJpZ2h0bmVzcyA6IDApOwotfQotCi1zdGF0aWMgaW50IGJyaWdodG5lc3NfZ2V0KHN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICpiZCkKLXsKLQlpbnQgc3RhdHVzLCByZXM7Ci0KLQlyZXMgPSBicmlnaHRuZXNzX2dldF9yYXcoJnN0YXR1cyk7Ci0JaWYgKHJlcyA8IDApCi0JCXJldHVybiAwOyAvKiBGSVhNRTogdGVhY2ggYmFja2xpZ2h0IGFib3V0IGVycm9yIGhhbmRsaW5nICovCi0KLQlyZXR1cm4gc3RhdHVzICYgVFBfRUNfQkFDS0xJR0hUX0xWTE1TSzsKLX0KLQotc3RhdGljIHN0cnVjdCBiYWNrbGlnaHRfb3BzIGlibV9iYWNrbGlnaHRfZGF0YSA9IHsKLQkuZ2V0X2JyaWdodG5lc3MgPSBicmlnaHRuZXNzX2dldCwKLQkudXBkYXRlX3N0YXR1cyAgPSBicmlnaHRuZXNzX3VwZGF0ZV9zdGF0dXMsCi19OwotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotc3RhdGljIGludCBfX2luaXQgYnJpZ2h0bmVzc19pbml0KHN0cnVjdCBpYm1faW5pdF9zdHJ1Y3QgKmlpYm0pCi17Ci0JaW50IGI7Ci0KLQl2ZGJnX3ByaW50ayhUUEFDUElfREJHX0lOSVQsICJpbml0aWFsaXppbmcgYnJpZ2h0bmVzcyBzdWJkcml2ZXJcbiIpOwotCi0JbXV0ZXhfaW5pdCgmYnJpZ2h0bmVzc19tdXRleCk7Ci0KLQkvKgotCSAqIFdlIGFsd2F5cyBhdHRlbXB0IHRvIGRldGVjdCBhY3BpIHN1cHBvcnQsIHNvIGFzIHRvIHN3aXRjaAotCSAqIExlbm92byBWaXN0YSBCSU9TIHRvIEFDUEkgYnJpZ2h0bmVzcyBtb2RlIGV2ZW4gaWYgd2UgYXJlIG5vdAotCSAqIGdvaW5nIHRvIHB1Ymxpc2ggYSBiYWNrbGlnaHQgaW50ZXJmYWNlCi0JICovCi0JYiA9IHRwYWNwaV9jaGVja19zdGRfYWNwaV9icmlnaHRuZXNzX3N1cHBvcnQoKTsKLQlpZiAoYiA+IDApIHsKLQotCQlpZiAoYWNwaV92aWRlb19iYWNrbGlnaHRfc3VwcG9ydCgpKSB7Ci0JCQlpZiAoYnJpZ2h0bmVzc19lbmFibGUgPiAxKSB7Ci0JCQkJcHJpbnRrKFRQQUNQSV9OT1RJQ0UKLQkJCQkgICAgICAgIlN0YW5kYXJkIEFDUEkgYmFja2xpZ2h0IGludGVyZmFjZSAiCi0JCQkJICAgICAgICJhdmFpbGFibGUsIG5vdCBsb2FkaW5nIG5hdGl2ZSBvbmUuXG4iKTsKLQkJCQlyZXR1cm4gMTsKLQkJCX0gZWxzZSBpZiAoYnJpZ2h0bmVzc19lbmFibGUgPT0gMSkgewotCQkJCXByaW50ayhUUEFDUElfTk9USUNFCi0JCQkJICAgICAgICJCYWNrbGlnaHQgY29udHJvbCBmb3JjZSBlbmFibGVkLCBldmVuIGlmIHN0YW5kYXJkICIKLQkJCQkgICAgICAgIkFDUEkgYmFja2xpZ2h0IGludGVyZmFjZSBpcyBhdmFpbGFibGVcbiIpOwotCQkJfQotCQl9IGVsc2UgewotCQkJaWYgKGJyaWdodG5lc3NfZW5hYmxlID4gMSkgewotCQkJCXByaW50ayhUUEFDUElfTk9USUNFCi0JCQkJICAgICAgICJTdGFuZGFyZCBBQ1BJIGJhY2tsaWdodCBpbnRlcmZhY2Ugbm90ICIKLQkJCQkgICAgICAgImF2YWlsYWJsZSwgdGhpbmtwYWRfYWNwaSBuYXRpdmUgIgotCQkJCSAgICAgICAiYnJpZ2h0bmVzcyBjb250cm9sIGVuYWJsZWRcbiIpOwotCQkJfQotCQl9Ci0JfQotCi0JaWYgKCFicmlnaHRuZXNzX2VuYWJsZSkgewotCQlkYmdfcHJpbnRrKFRQQUNQSV9EQkdfSU5JVCwKLQkJCSAgICJicmlnaHRuZXNzIHN1cHBvcnQgZGlzYWJsZWQgYnkgIgotCQkJICAgIm1vZHVsZSBwYXJhbWV0ZXJcbiIpOwotCQlyZXR1cm4gMTsKLQl9Ci0KLQlpZiAoYiA+IDE2KSB7Ci0JCXByaW50ayhUUEFDUElfRVJSCi0JCSAgICAgICAiVW5zdXBwb3J0ZWQgYnJpZ2h0bmVzcyBpbnRlcmZhY2UsICIKLQkJICAgICAgICJwbGVhc2UgY29udGFjdCAlc1xuIiwgVFBBQ1BJX01BSUwpOwotCQlyZXR1cm4gMTsKLQl9Ci0JaWYgKGIgPT0gMTYpCi0JCXRwX2ZlYXR1cmVzLmJyaWdodF8xNmxldmVscyA9IDE7Ci0KLQlpZiAoIWJyaWdodG5lc3NfbW9kZSkgewotCQlpZiAodGhpbmtwYWRfaWQudmVuZG9yID09IFBDSV9WRU5ET1JfSURfTEVOT1ZPKQotCQkJYnJpZ2h0bmVzc19tb2RlID0gMjsKLQkJZWxzZQotCQkJYnJpZ2h0bmVzc19tb2RlID0gMzsKLQotCQlkYmdfcHJpbnRrKFRQQUNQSV9EQkdfSU5JVCwgInNlbGVjdGVkIGJyaWdodG5lc3NfbW9kZT0lZFxuIiwKLQkJCWJyaWdodG5lc3NfbW9kZSk7Ci0JfQotCi0JaWYgKGJyaWdodG5lc3NfbW9kZSA+IDMpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKGJyaWdodG5lc3NfZ2V0X3JhdygmYikgPCAwKQotCQlyZXR1cm4gMTsKLQotCWlmICh0cF9mZWF0dXJlcy5icmlnaHRfMTZsZXZlbHMpCi0JCXByaW50ayhUUEFDUElfSU5GTwotCQkgICAgICAgImRldGVjdGVkIGEgMTYtbGV2ZWwgYnJpZ2h0bmVzcyBjYXBhYmxlIFRoaW5rUGFkXG4iKTsKLQotCWlibV9iYWNrbGlnaHRfZGV2aWNlID0gYmFja2xpZ2h0X2RldmljZV9yZWdpc3RlcigKLQkJCQkJVFBBQ1BJX0JBQ0tMSUdIVF9ERVZfTkFNRSwgTlVMTCwgTlVMTCwKLQkJCQkJJmlibV9iYWNrbGlnaHRfZGF0YSk7Ci0JaWYgKElTX0VSUihpYm1fYmFja2xpZ2h0X2RldmljZSkpIHsKLQkJcHJpbnRrKFRQQUNQSV9FUlIgIkNvdWxkIG5vdCByZWdpc3RlciBiYWNrbGlnaHQgZGV2aWNlXG4iKTsKLQkJcmV0dXJuIFBUUl9FUlIoaWJtX2JhY2tsaWdodF9kZXZpY2UpOwotCX0KLQl2ZGJnX3ByaW50ayhUUEFDUElfREJHX0lOSVQsICJicmlnaHRuZXNzIGlzIHN1cHBvcnRlZFxuIik7Ci0KLQlpYm1fYmFja2xpZ2h0X2RldmljZS0+cHJvcHMubWF4X2JyaWdodG5lc3MgPQotCQkJCSh0cF9mZWF0dXJlcy5icmlnaHRfMTZsZXZlbHMpPyAxNSA6IDc7Ci0JaWJtX2JhY2tsaWdodF9kZXZpY2UtPnByb3BzLmJyaWdodG5lc3MgPSBiICYgVFBfRUNfQkFDS0xJR0hUX0xWTE1TSzsKLQliYWNrbGlnaHRfdXBkYXRlX3N0YXR1cyhpYm1fYmFja2xpZ2h0X2RldmljZSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgYnJpZ2h0bmVzc19leGl0KHZvaWQpCi17Ci0JaWYgKGlibV9iYWNrbGlnaHRfZGV2aWNlKSB7Ci0JCXZkYmdfcHJpbnRrKFRQQUNQSV9EQkdfRVhJVCwKLQkJCSAgICAiY2FsbGluZyBiYWNrbGlnaHRfZGV2aWNlX3VucmVnaXN0ZXIoKVxuIik7Ci0JCWJhY2tsaWdodF9kZXZpY2VfdW5yZWdpc3RlcihpYm1fYmFja2xpZ2h0X2RldmljZSk7Ci0JfQotfQotCi1zdGF0aWMgaW50IGJyaWdodG5lc3NfcmVhZChjaGFyICpwKQotewotCWludCBsZW4gPSAwOwotCWludCBsZXZlbDsKLQotCWxldmVsID0gYnJpZ2h0bmVzc19nZXQoTlVMTCk7Ci0JaWYgKGxldmVsIDwgMCkgewotCQlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAibGV2ZWw6XHRcdHVucmVhZGFibGVcbiIpOwotCX0gZWxzZSB7Ci0JCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICJsZXZlbDpcdFx0JWRcbiIsIGxldmVsKTsKLQkJbGVuICs9IHNwcmludGYocCArIGxlbiwgImNvbW1hbmRzOlx0dXAsIGRvd25cbiIpOwotCQlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAiY29tbWFuZHM6XHRsZXZlbCA8bGV2ZWw+IgotCQkJICAgICAgICIgKDxsZXZlbD4gaXMgMC0lZClcbiIsCi0JCQkgICAgICAgKHRwX2ZlYXR1cmVzLmJyaWdodF8xNmxldmVscykgPyAxNSA6IDcpOwotCX0KLQotCXJldHVybiBsZW47Ci19Ci0KLXN0YXRpYyBpbnQgYnJpZ2h0bmVzc193cml0ZShjaGFyICpidWYpCi17Ci0JaW50IGxldmVsOwotCWludCByYzsKLQljaGFyICpjbWQ7Ci0JaW50IG1heF9sZXZlbCA9ICh0cF9mZWF0dXJlcy5icmlnaHRfMTZsZXZlbHMpID8gMTUgOiA3OwotCi0JbGV2ZWwgPSBicmlnaHRuZXNzX2dldChOVUxMKTsKLQlpZiAobGV2ZWwgPCAwKQotCQlyZXR1cm4gbGV2ZWw7Ci0KLQl3aGlsZSAoKGNtZCA9IG5leHRfY21kKCZidWYpKSkgewotCQlpZiAoc3RybGVuY21wKGNtZCwgInVwIikgPT0gMCkgewotCQkJaWYgKGxldmVsIDwgbWF4X2xldmVsKQotCQkJCWxldmVsKys7Ci0JCX0gZWxzZSBpZiAoc3RybGVuY21wKGNtZCwgImRvd24iKSA9PSAwKSB7Ci0JCQlpZiAobGV2ZWwgPiAwKQotCQkJCWxldmVsLS07Ci0JCX0gZWxzZSBpZiAoc3NjYW5mKGNtZCwgImxldmVsICVkIiwgJmxldmVsKSA9PSAxICYmCi0JCQkgICBsZXZlbCA+PSAwICYmIGxldmVsIDw9IG1heF9sZXZlbCkgewotCQkJLyogbmV3IGxldmVsIHNldCAqLwotCQl9IGVsc2UKLQkJCXJldHVybiAtRUlOVkFMOwotCX0KLQotCS8qCi0JICogTm93IHdlIGtub3cgd2hhdCB0aGUgZmluYWwgbGV2ZWwgc2hvdWxkIGJlLCBzbyB3ZSB0cnkgdG8gc2V0IGl0LgotCSAqIERvaW5nIGl0IHRoaXMgd2F5IG1ha2VzIHRoZSBzeXNjYWxsIHJlc3RhcnRhYmxlIGluIGNhc2Ugb2YgRUlOVFIKLQkgKi8KLQlyYyA9IGJyaWdodG5lc3Nfc2V0KGxldmVsKTsKLQlyZXR1cm4gKHJjID09IC1FSU5UUik/IEVSRVNUQVJUU1lTIDogcmM7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgaWJtX3N0cnVjdCBicmlnaHRuZXNzX2RyaXZlcl9kYXRhID0gewotCS5uYW1lID0gImJyaWdodG5lc3MiLAotCS5yZWFkID0gYnJpZ2h0bmVzc19yZWFkLAotCS53cml0ZSA9IGJyaWdodG5lc3Nfd3JpdGUsCi0JLmV4aXQgPSBicmlnaHRuZXNzX2V4aXQsCi19OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogVm9sdW1lIHN1YmRyaXZlcgotICovCi0KLXN0YXRpYyBpbnQgdm9sdW1lX29mZnNldCA9IDB4MzA7Ci0KLXN0YXRpYyBpbnQgdm9sdW1lX3JlYWQoY2hhciAqcCkKLXsKLQlpbnQgbGVuID0gMDsKLQl1OCBsZXZlbDsKLQotCWlmICghYWNwaV9lY19yZWFkKHZvbHVtZV9vZmZzZXQsICZsZXZlbCkpIHsKLQkJbGVuICs9IHNwcmludGYocCArIGxlbiwgImxldmVsOlx0XHR1bnJlYWRhYmxlXG4iKTsKLQl9IGVsc2UgewotCQlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAibGV2ZWw6XHRcdCVkXG4iLCBsZXZlbCAmIDB4Zik7Ci0JCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICJtdXRlOlx0XHQlc1xuIiwgb25vZmYobGV2ZWwsIDYpKTsKLQkJbGVuICs9IHNwcmludGYocCArIGxlbiwgImNvbW1hbmRzOlx0dXAsIGRvd24sIG11dGVcbiIpOwotCQlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAiY29tbWFuZHM6XHRsZXZlbCA8bGV2ZWw+IgotCQkJICAgICAgICIgKDxsZXZlbD4gaXMgMC0xNSlcbiIpOwotCX0KLQotCXJldHVybiBsZW47Ci19Ci0KLXN0YXRpYyBpbnQgdm9sdW1lX3dyaXRlKGNoYXIgKmJ1ZikKLXsKLQlpbnQgY21vc19jbWQsIGluYywgaTsKLQl1OCBsZXZlbCwgbXV0ZTsKLQlpbnQgbmV3X2xldmVsLCBuZXdfbXV0ZTsKLQljaGFyICpjbWQ7Ci0KLQl3aGlsZSAoKGNtZCA9IG5leHRfY21kKCZidWYpKSkgewotCQlpZiAoIWFjcGlfZWNfcmVhZCh2b2x1bWVfb2Zmc2V0LCAmbGV2ZWwpKQotCQkJcmV0dXJuIC1FSU87Ci0JCW5ld19tdXRlID0gbXV0ZSA9IGxldmVsICYgMHg0MDsKLQkJbmV3X2xldmVsID0gbGV2ZWwgPSBsZXZlbCAmIDB4ZjsKLQotCQlpZiAoc3RybGVuY21wKGNtZCwgInVwIikgPT0gMCkgewotCQkJaWYgKG11dGUpCi0JCQkJbmV3X211dGUgPSAwOwotCQkJZWxzZQotCQkJCW5ld19sZXZlbCA9IGxldmVsID09IDE1ID8gMTUgOiBsZXZlbCArIDE7Ci0JCX0gZWxzZSBpZiAoc3RybGVuY21wKGNtZCwgImRvd24iKSA9PSAwKSB7Ci0JCQlpZiAobXV0ZSkKLQkJCQluZXdfbXV0ZSA9IDA7Ci0JCQllbHNlCi0JCQkJbmV3X2xldmVsID0gbGV2ZWwgPT0gMCA/IDAgOiBsZXZlbCAtIDE7Ci0JCX0gZWxzZSBpZiAoc3NjYW5mKGNtZCwgImxldmVsICVkIiwgJm5ld19sZXZlbCkgPT0gMSAmJgotCQkJICAgbmV3X2xldmVsID49IDAgJiYgbmV3X2xldmVsIDw9IDE1KSB7Ci0JCQkvKiBuZXdfbGV2ZWwgc2V0ICovCi0JCX0gZWxzZSBpZiAoc3RybGVuY21wKGNtZCwgIm11dGUiKSA9PSAwKSB7Ci0JCQluZXdfbXV0ZSA9IDB4NDA7Ci0JCX0gZWxzZQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkJaWYgKG5ld19sZXZlbCAhPSBsZXZlbCkgewotCQkJLyogbXV0ZSBkb2Vzbid0IGNoYW5nZSAqLwotCi0JCQljbW9zX2NtZCA9IChuZXdfbGV2ZWwgPiBsZXZlbCkgPwotCQkJCQlUUF9DTU9TX1ZPTFVNRV9VUCA6IFRQX0NNT1NfVk9MVU1FX0RPV047Ci0JCQlpbmMgPSBuZXdfbGV2ZWwgPiBsZXZlbCA/IDEgOiAtMTsKLQotCQkJaWYgKG11dGUgJiYgKGlzc3VlX3RoaW5rcGFkX2Ntb3NfY29tbWFuZChjbW9zX2NtZCkgfHwKLQkJCQkgICAgICFhY3BpX2VjX3dyaXRlKHZvbHVtZV9vZmZzZXQsIGxldmVsKSkpCi0JCQkJcmV0dXJuIC1FSU87Ci0KLQkJCWZvciAoaSA9IGxldmVsOyBpICE9IG5ld19sZXZlbDsgaSArPSBpbmMpCi0JCQkJaWYgKGlzc3VlX3RoaW5rcGFkX2Ntb3NfY29tbWFuZChjbW9zX2NtZCkgfHwKLQkJCQkgICAgIWFjcGlfZWNfd3JpdGUodm9sdW1lX29mZnNldCwgaSArIGluYykpCi0JCQkJCXJldHVybiAtRUlPOwotCi0JCQlpZiAobXV0ZSAmJgotCQkJICAgIChpc3N1ZV90aGlua3BhZF9jbW9zX2NvbW1hbmQoVFBfQ01PU19WT0xVTUVfTVVURSkgfHwKLQkJCSAgICAgIWFjcGlfZWNfd3JpdGUodm9sdW1lX29mZnNldCwgbmV3X2xldmVsICsgbXV0ZSkpKSB7Ci0JCQkJcmV0dXJuIC1FSU87Ci0JCQl9Ci0JCX0KLQotCQlpZiAobmV3X211dGUgIT0gbXV0ZSkgewotCQkJLyogbGV2ZWwgZG9lc24ndCBjaGFuZ2UgKi8KLQotCQkJY21vc19jbWQgPSAobmV3X211dGUpID8KLQkJCQkgICBUUF9DTU9TX1ZPTFVNRV9NVVRFIDogVFBfQ01PU19WT0xVTUVfVVA7Ci0KLQkJCWlmIChpc3N1ZV90aGlua3BhZF9jbW9zX2NvbW1hbmQoY21vc19jbWQpIHx8Ci0JCQkgICAgIWFjcGlfZWNfd3JpdGUodm9sdW1lX29mZnNldCwgbGV2ZWwgKyBuZXdfbXV0ZSkpCi0JCQkJcmV0dXJuIC1FSU87Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHN0cnVjdCBpYm1fc3RydWN0IHZvbHVtZV9kcml2ZXJfZGF0YSA9IHsKLQkubmFtZSA9ICJ2b2x1bWUiLAotCS5yZWFkID0gdm9sdW1lX3JlYWQsCi0JLndyaXRlID0gdm9sdW1lX3dyaXRlLAotfTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEZhbiBzdWJkcml2ZXIKLSAqLwotCi0vKgotICogRkFOIEFDQ0VTUyBNT0RFUwotICoKLSAqIFRQQUNQSV9GQU5fUkRfQUNQSV9HRkFOOgotICogCUFDUEkgR0ZBTiBtZXRob2Q6IHJldHVybnMgZmFuIGxldmVsCi0gKgotICogCXNlZSBUUEFDUElfRkFOX1dSX0FDUElfU0ZBTgotICogCUVDIDB4MmYgKEhGU1ApIG5vdCBhdmFpbGFibGUgaWYgR0ZBTiBleGlzdHMKLSAqCi0gKiBUUEFDUElfRkFOX1dSX0FDUElfU0ZBTjoKLSAqIAlBQ1BJIFNGQU4gbWV0aG9kOiBzZXRzIGZhbiBsZXZlbCwgMCAoc3RvcCkgdG8gNyAobWF4KQotICoKLSAqIAlFQyAweDJmIChIRlNQKSBtaWdodCBiZSBhdmFpbGFibGUgKmZvciByZWFkaW5nKiwgYnV0IGRvIG5vdCB1c2UKLSAqIAlpdCBmb3Igd3JpdGluZy4KLSAqCi0gKiBUUEFDUElfRkFOX1dSX1RQRUM6Ci0gKiAJVGhpbmtQYWQgRUMgcmVnaXN0ZXIgMHgyZiAoSEZTUCk6IGZhbiBjb250cm9sIGxvb3AgbW9kZQotICogCVN1cHBvcnRlZCBvbiBhbG1vc3QgYWxsIFRoaW5rUGFkcwotICoKLSAqIAlGYW4gc3BlZWQgY2hhbmdlcyBvZiBhbnkgc29ydCAoaW5jbHVkaW5nIHRob3NlIGNhdXNlZCBieSB0aGUKLSAqIAlkaXNlbmdhZ2VkIG1vZGUpIGFyZSB1c3VhbGx5IGRvbmUgc2xvd2x5IGJ5IHRoZSBmaXJtd2FyZSBhcyB0aGUKLSAqIAltYXhpbXVtIGFtbW91bnQgb2YgZmFuIGR1dHkgY3ljbGUgY2hhbmdlIHBlciBzZWNvbmQgc2VlbXMgdG8gYmUKLSAqIAlsaW1pdGVkLgotICoKLSAqIAlSZWFkaW5nIGlzIG5vdCBhdmFpbGFibGUgaWYgR0ZBTiBleGlzdHMuCi0gKiAJV3JpdGluZyBpcyBub3QgYXZhaWxhYmxlIGlmIFNGQU4gZXhpc3RzLgotICoKLSAqIAlCaXRzCi0gKgkgNwlhdXRvbWF0aWMgbW9kZSBlbmdhZ2VkOwotICogIAkJKGRlZmF1bHQgb3BlcmF0aW9uIG1vZGUgb2YgdGhlIFRoaW5rUGFkKQotICogCQlmYW4gbGV2ZWwgaXMgaWdub3JlZCBpbiB0aGlzIG1vZGUuCi0gKgkgNglmdWxsIHNwZWVkIG1vZGUgKHRha2VzIHByZWNlZGVuY2Ugb3ZlciBiaXQgNyk7Ci0gKgkJbm90IGF2YWlsYWJsZSBvbiBhbGwgdGhpbmtwYWRzLiAgTWF5IGRpc2FibGUKLSAqCQl0aGUgdGFjaG9tZXRlciB3aGlsZSB0aGUgZmFuIGNvbnRyb2xsZXIgcmFtcHMgdXAKLSAqCQl0aGUgc3BlZWQgKHdoaWNoIGNhbiB0YWtlIHVwIHRvIGEgZmV3ICptaW51dGVzKikuCi0gKgkJU3BlZWRzIHVwIGZhbiB0byAxMDAlIGR1dHktY3ljbGUsIHdoaWNoIGlzIGZhciBhYm92ZQotICoJCXRoZSBzdGFuZGFyZCBSUE0gbGV2ZWxzLiAgSXQgaXMgbm90IGltcG9zc2libGUgdGhhdAotICoJCWl0IGNvdWxkIGNhdXNlIGhhcmR3YXJlIGRhbWFnZS4KLSAqCTUtMwl1bnVzZWQgaW4gc29tZSBtb2RlbHMuICBFeHRyYSBiaXRzIGZvciBmYW4gbGV2ZWwKLSAqCQlpbiBvdGhlcnMsIGJ1dCBzdGlsbCB1c2VsZXNzIGFzIGFsbCB2YWx1ZXMgYWJvdmUKLSAqCQk3IG1hcCB0byB0aGUgc2FtZSBzcGVlZCBhcyBsZXZlbCA3IGluIHRoZXNlIG1vZGVscy4KLSAqCTItMAlmYW4gbGV2ZWwgKDAuLjcgdXN1YWxseSkKLSAqCQkJMHgwMCA9IHN0b3AKLSAqIAkJCTB4MDcgPSBtYXggKHNldCB3aGVuIHRlbXBlcmF0dXJlcyBjcml0aWNhbCkKLSAqIAkJU29tZSBUaGlua1BhZHMgbWF5IGhhdmUgb3RoZXIgbGV2ZWxzLCBzZWUKLSAqIAkJVFBBQ1BJX0ZBTl9XUl9BQ1BJX0ZBTlMgKFgzMS9YNDAvWDQxKQotICoKLSAqCUZJUk1XQVJFIEJVRzogb24gc29tZSBtb2RlbHMsIEVDIDB4MmYgbWlnaHQgbm90IGJlIGluaXRpYWxpemVkIGF0Ci0gKglib290LiBBcHBhcmVudGx5IHRoZSBFQyBkb2VzIG5vdCBpbnRpYWxpemUgaXQsIHNvIHVubGVzcyBBQ1BJIERTRFQKLSAqCWRvZXMgc28sIGl0cyBpbml0aWFsIHZhbHVlIGlzIG1lYW5pbmdsZXNzICgweDA3KS4KLSAqCi0gKglGb3IgZmlybXdhcmUgYnVncywgcmVmZXIgdG86Ci0gKglodHRwOi8vdGhpbmt3aWtpLm9yZy93aWtpL0VtYmVkZGVkX0NvbnRyb2xsZXJfRmlybXdhcmUjRmlybXdhcmVfSXNzdWVzCi0gKgotICogCS0tLS0KLSAqCi0gKglUaGlua1BhZCBFQyByZWdpc3RlciAweDg0IChMU0IpLCAweDg1IChNU0IpOgotICoJTWFpbiBmYW4gdGFjaG9tZXRlciByZWFkaW5nIChpbiBSUE0pCi0gKgotICoJVGhpcyByZWdpc3RlciBpcyBwcmVzZW50IG9uIGFsbCBUaGlua1BhZHMgd2l0aCBhIG5ldy1zdHlsZSBFQywgYW5kCi0gKglpdCBpcyBrbm93biBub3QgdG8gYmUgcHJlc2VudCBvbiB0aGUgQTIxbS9lLCBhbmQgVDIyLCBhcyB0aGVyZSBpcwotICoJc29tZXRoaW5nIGVsc2UgaW4gb2Zmc2V0IDB4ODQgYWNjb3JkaW5nIHRvIHRoZSBBQ1BJIERTRFQuICBPdGhlcgotICoJVGhpbmtQYWRzIGZyb20gdGhpcyBzYW1lIHRpbWUgcGVyaW9kIChhbmQgZWFybGllcikgcHJvYmFibHkgbGFjayB0aGUKLSAqCXRhY2hvbWV0ZXIgYXMgd2VsbC4KLSAqCi0gKglVbmZvcnR1bmF0ZWx5IGEgbG90IG9mIFRoaW5rUGFkcyB3aXRoIG5ldy1zdHlsZSBFQ3MgYnV0IHdob3NlIGZpcndtYXJlCi0gKgl3YXMgbmV2ZXIgZml4ZWQgYnkgSUJNIHRvIHJlcG9ydCB0aGUgRUMgZmlybXdhcmUgdmVyc2lvbiBzdHJpbmcKLSAqCXByb2JhYmx5IHN1cHBvcnQgdGhlIHRhY2hvbWV0ZXIgKGxpa2UgdGhlIGVhcmx5IFggbW9kZWxzKSwgc28KLSAqCWRldGVjdGluZyBpdCBpcyBxdWl0ZSBoYXJkLiAgV2UgbmVlZCBtb3JlIGRhdGEgdG8ga25vdyBmb3Igc3VyZS4KLSAqCi0gKglGSVJNV0FSRSBCVUc6IGFsd2F5cyByZWFkIDB4ODQgZmlyc3QsIG90aGVyd2lzZSBpbmNvcnJlY3QgcmVhZGluZ3MKLSAqCW1pZ2h0IHJlc3VsdC4KLSAqCi0gKglGSVJNV0FSRSBCVUc6IG1heSBnbyBzdGFsZSB3aGlsZSB0aGUgRUMgaXMgc3dpdGNoaW5nIHRvIGZ1bGwgc3BlZWQKLSAqCW1vZGUuCi0gKgotICoJRm9yIGZpcm13YXJlIGJ1Z3MsIHJlZmVyIHRvOgotICoJaHR0cDovL3RoaW5rd2lraS5vcmcvd2lraS9FbWJlZGRlZF9Db250cm9sbGVyX0Zpcm13YXJlI0Zpcm13YXJlX0lzc3VlcwotICoKLSAqIFRQQUNQSV9GQU5fV1JfQUNQSV9GQU5TOgotICoJVGhpbmtQYWQgWDMxLCBYNDAsIFg0MS4gIE5vdCBhdmFpbGFibGUgaW4gdGhlIFg2MC4KLSAqCi0gKglGQU5TIEFDUEkgaGFuZGxlOiB0YWtlcyB0aHJlZSBhcmd1bWVudHM6IGxvdyBzcGVlZCwgbWVkaXVtIHNwZWVkLAotICoJaGlnaCBzcGVlZC4gIEFDUEkgRFNEVCBzZWVtcyB0byBtYXAgdGhlc2UgdGhyZWUgc3BlZWRzIHRvIGxldmVscwotICoJYXMgZm9sbG93czogU1RPUCBMT1cgTE9XIE1FRCBNRUQgSElHSCBISUdIIEhJR0ggSElHSAotICoJKHRoaXMgbWFwIGlzIHN0b3JlZCBvbiBGQU4wLi5GQU44IGFzICIwLDEsMSwyLDIsMywzLDMsMyIpCi0gKgotICogCVRoZSBzcGVlZHMgYXJlIHN0b3JlZCBvbiBoYW5kbGVzCi0gKiAJKEZBTkE6RkFOOSksIChGQU5DOkZBTkIpLCAoRkFORTpGQU5EKS4KLSAqCi0gKiAJVGhlcmUgYXJlIHRocmVlIGRlZmF1bHQgc3BlZWQgc2V0cywgYWNlc3NpYmxlIGFzIGhhbmRsZXM6Ci0gKiAJRlMxTCxGUzFNLEZTMUg7IEZTMkwsRlMyTSxGUzJIOyBGUzNMLEZTM00sRlMzSAotICoKLSAqIAlBQ1BJIERTRFQgc3dpdGNoZXMgd2hpY2ggc2V0IGlzIGluIHVzZSBkZXBlbmRpbmcgb24gdmFyaW91cwotICogCWZhY3RvcnMuCi0gKgotICogCVRQQUNQSV9GQU5fV1JfVFBFQyBpcyBhbHNvIGF2YWlsYWJsZSBhbmQgc2hvdWxkIGJlIHVzZWQgdG8KLSAqIAljb21tYW5kIHRoZSBmYW4uICBUaGUgWDMxL1g0MC9YNDEgc2VlbXMgdG8gaGF2ZSA4IGZhbiBsZXZlbHMsCi0gKiAJYnV0IHRoZSBBQ1BJIHRhYmxlcyBqdXN0IG1lbnRpb24gbGV2ZWwgNy4KLSAqLwotCi1lbnVtIHsJCQkJCS8qIEZhbiBjb250cm9sIGNvbnN0YW50cyAqLwotCWZhbl9zdGF0dXNfb2Zmc2V0ID0gMHgyZiwJLyogRUMgcmVnaXN0ZXIgMHgyZiAqLwotCWZhbl9ycG1fb2Zmc2V0ID0gMHg4NCwJCS8qIEVDIHJlZ2lzdGVyIDB4ODQ6IExTQiwgMHg4NSBNU0IgKFJQTSkKLQkJCQkJICogMHg4NCBtdXN0IGJlIHJlYWQgYmVmb3JlIDB4ODUgKi8KLQotCVRQX0VDX0ZBTl9GVUxMU1BFRUQgPSAweDQwLAkvKiBFQyBmYW4gbW9kZTogZnVsbCBzcGVlZCAqLwotCVRQX0VDX0ZBTl9BVVRPCSAgICA9IDB4ODAsCS8qIEVDIGZhbiBtb2RlOiBhdXRvIGZhbiBjb250cm9sICovCi0KLQlUUEFDUElfRkFOX0xBU1RfTEVWRUwgPSAweDEwMCwJLyogVXNlIGNhY2hlZCBsYXN0LXNlZW4gZmFuIGxldmVsICovCi19OwotCi1lbnVtIGZhbl9zdGF0dXNfYWNjZXNzX21vZGUgewotCVRQQUNQSV9GQU5fTk9ORSA9IDAsCQkvKiBObyBmYW4gc3RhdHVzIG9yIGNvbnRyb2wgKi8KLQlUUEFDUElfRkFOX1JEX0FDUElfR0ZBTiwJLyogVXNlIEFDUEkgR0ZBTiAqLwotCVRQQUNQSV9GQU5fUkRfVFBFQywJCS8qIFVzZSBBQ1BJIEVDIHJlZ3MgMHgyZiwgMHg4NC0weDg1ICovCi19OwotCi1lbnVtIGZhbl9jb250cm9sX2FjY2Vzc19tb2RlIHsKLQlUUEFDUElfRkFOX1dSX05PTkUgPSAwLAkJLyogTm8gZmFuIGNvbnRyb2wgKi8KLQlUUEFDUElfRkFOX1dSX0FDUElfU0ZBTiwJLyogVXNlIEFDUEkgU0ZBTiAqLwotCVRQQUNQSV9GQU5fV1JfVFBFQywJCS8qIFVzZSBBQ1BJIEVDIHJlZyAweDJmICovCi0JVFBBQ1BJX0ZBTl9XUl9BQ1BJX0ZBTlMsCS8qIFVzZSBBQ1BJIEZBTlMgYW5kIEVDIHJlZyAweDJmICovCi19OwotCi1lbnVtIGZhbl9jb250cm9sX2NvbW1hbmRzIHsKLQlUUEFDUElfRkFOX0NNRF9TUEVFRCAJPSAweDAwMDEsCS8qIHNwZWVkIGNvbW1hbmQgKi8KLQlUUEFDUElfRkFOX0NNRF9MRVZFTCAJPSAweDAwMDIsCS8qIGxldmVsIGNvbW1hbmQgICovCi0JVFBBQ1BJX0ZBTl9DTURfRU5BQkxFCT0gMHgwMDA0LAkvKiBlbmFibGUvZGlzYWJsZSBjbWQsCi0JCQkJCQkgKiBhbmQgYWxzbyB3YXRjaGRvZyBjbWQgKi8KLX07Ci0KLXN0YXRpYyBpbnQgZmFuX2NvbnRyb2xfYWxsb3dlZDsKLQotc3RhdGljIGVudW0gZmFuX3N0YXR1c19hY2Nlc3NfbW9kZSBmYW5fc3RhdHVzX2FjY2Vzc19tb2RlOwotc3RhdGljIGVudW0gZmFuX2NvbnRyb2xfYWNjZXNzX21vZGUgZmFuX2NvbnRyb2xfYWNjZXNzX21vZGU7Ci1zdGF0aWMgZW51bSBmYW5fY29udHJvbF9jb21tYW5kcyBmYW5fY29udHJvbF9jb21tYW5kczsKLQotc3RhdGljIHU4IGZhbl9jb250cm9sX2luaXRpYWxfc3RhdHVzOwotc3RhdGljIHU4IGZhbl9jb250cm9sX2Rlc2lyZWRfbGV2ZWw7Ci1zdGF0aWMgdTggZmFuX2NvbnRyb2xfcmVzdW1lX2xldmVsOwotc3RhdGljIGludCBmYW5fd2F0Y2hkb2dfbWF4aW50ZXJ2YWw7Ci0KLXN0YXRpYyBzdHJ1Y3QgbXV0ZXggZmFuX211dGV4OwotCi1zdGF0aWMgdm9pZCBmYW5fd2F0Y2hkb2dfZmlyZShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKmlnbm9yZWQpOwotc3RhdGljIERFQ0xBUkVfREVMQVlFRF9XT1JLKGZhbl93YXRjaGRvZ190YXNrLCBmYW5fd2F0Y2hkb2dfZmlyZSk7Ci0KLVRQQUNQSV9IQU5ETEUoZmFucywgZWMsICJGQU5TIik7CS8qIFgzMSwgWDQwLCBYNDEgKi8KLVRQQUNQSV9IQU5ETEUoZ2ZhbiwgZWMsICJHRkFOIiwJLyogNTcwICovCi0JICAgIlxcRlNQRCIsCQkvKiA2MDBlL3gsIDc3MGUsIDc3MHggKi8KLQkgICApOwkJCS8qIGFsbCBvdGhlcnMgKi8KLVRQQUNQSV9IQU5ETEUoc2ZhbiwgZWMsICJTRkFOIiwJLyogNTcwICovCi0JICAgIkpGTlMiLAkJLyogNzcweC1KTCAqLwotCSAgICk7CQkJLyogYWxsIG90aGVycyAqLwotCi0vKgotICogQ2FsbCB3aXRoIGZhbl9tdXRleCBoZWxkCi0gKi8KLXN0YXRpYyB2b2lkIGZhbl91cGRhdGVfZGVzaXJlZF9sZXZlbCh1OCBzdGF0dXMpCi17Ci0JaWYgKChzdGF0dXMgJgotCSAgICAgKFRQX0VDX0ZBTl9BVVRPIHwgVFBfRUNfRkFOX0ZVTExTUEVFRCkpID09IDApIHsKLQkJaWYgKHN0YXR1cyA+IDcpCi0JCQlmYW5fY29udHJvbF9kZXNpcmVkX2xldmVsID0gNzsKLQkJZWxzZQotCQkJZmFuX2NvbnRyb2xfZGVzaXJlZF9sZXZlbCA9IHN0YXR1czsKLQl9Ci19Ci0KLXN0YXRpYyBpbnQgZmFuX2dldF9zdGF0dXModTggKnN0YXR1cykKLXsKLQl1OCBzOwotCi0JLyogVE9ETzoKLQkgKiBBZGQgVFBBQ1BJX0ZBTl9SRF9BQ1BJX0ZBTlMgPyAqLwotCi0Jc3dpdGNoIChmYW5fc3RhdHVzX2FjY2Vzc19tb2RlKSB7Ci0JY2FzZSBUUEFDUElfRkFOX1JEX0FDUElfR0ZBTjoKLQkJLyogNTcwLCA2MDBlL3gsIDc3MGUsIDc3MHggKi8KLQotCQlpZiAodW5saWtlbHkoIWFjcGlfZXZhbGYoZ2Zhbl9oYW5kbGUsICZzLCBOVUxMLCAiZCIpKSkKLQkJCXJldHVybiAtRUlPOwotCi0JCWlmIChsaWtlbHkoc3RhdHVzKSkKLQkJCSpzdGF0dXMgPSBzICYgMHgwNzsKLQotCQlicmVhazsKLQotCWNhc2UgVFBBQ1BJX0ZBTl9SRF9UUEVDOgotCQkvKiBhbGwgZXhjZXB0IDU3MCwgNjAwZS94LCA3NzBlLCA3NzB4ICovCi0JCWlmICh1bmxpa2VseSghYWNwaV9lY19yZWFkKGZhbl9zdGF0dXNfb2Zmc2V0LCAmcykpKQotCQkJcmV0dXJuIC1FSU87Ci0KLQkJaWYgKGxpa2VseShzdGF0dXMpKQotCQkJKnN0YXR1cyA9IHM7Ci0KLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlyZXR1cm4gLUVOWElPOwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGZhbl9nZXRfc3RhdHVzX3NhZmUodTggKnN0YXR1cykKLXsKLQlpbnQgcmM7Ci0JdTggczsKLQotCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJmZhbl9tdXRleCkpCi0JCXJldHVybiAtRVJFU1RBUlRTWVM7Ci0JcmMgPSBmYW5fZ2V0X3N0YXR1cygmcyk7Ci0JaWYgKCFyYykKLQkJZmFuX3VwZGF0ZV9kZXNpcmVkX2xldmVsKHMpOwotCW11dGV4X3VubG9jaygmZmFuX211dGV4KTsKLQotCWlmIChzdGF0dXMpCi0JCSpzdGF0dXMgPSBzOwotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IGZhbl9nZXRfc3BlZWQodW5zaWduZWQgaW50ICpzcGVlZCkKLXsKLQl1OCBoaSwgbG87Ci0KLQlzd2l0Y2ggKGZhbl9zdGF0dXNfYWNjZXNzX21vZGUpIHsKLQljYXNlIFRQQUNQSV9GQU5fUkRfVFBFQzoKLQkJLyogYWxsIGV4Y2VwdCA1NzAsIDYwMGUveCwgNzcwZSwgNzcweCAqLwotCQlpZiAodW5saWtlbHkoIWFjcGlfZWNfcmVhZChmYW5fcnBtX29mZnNldCwgJmxvKSB8fAotCQkJICAgICAhYWNwaV9lY19yZWFkKGZhbl9ycG1fb2Zmc2V0ICsgMSwgJmhpKSkpCi0JCQlyZXR1cm4gLUVJTzsKLQotCQlpZiAobGlrZWx5KHNwZWVkKSkKLQkJCSpzcGVlZCA9IChoaSA8PCA4KSB8IGxvOwotCi0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJcmV0dXJuIC1FTlhJTzsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBmYW5fc2V0X2xldmVsKGludCBsZXZlbCkKLXsKLQlpZiAoIWZhbl9jb250cm9sX2FsbG93ZWQpCi0JCXJldHVybiAtRVBFUk07Ci0KLQlzd2l0Y2ggKGZhbl9jb250cm9sX2FjY2Vzc19tb2RlKSB7Ci0JY2FzZSBUUEFDUElfRkFOX1dSX0FDUElfU0ZBTjoKLQkJaWYgKGxldmVsID49IDAgJiYgbGV2ZWwgPD0gNykgewotCQkJaWYgKCFhY3BpX2V2YWxmKHNmYW5faGFuZGxlLCBOVUxMLCBOVUxMLCAidmQiLCBsZXZlbCkpCi0JCQkJcmV0dXJuIC1FSU87Ci0JCX0gZWxzZQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCWJyZWFrOwotCi0JY2FzZSBUUEFDUElfRkFOX1dSX0FDUElfRkFOUzoKLQljYXNlIFRQQUNQSV9GQU5fV1JfVFBFQzoKLQkJaWYgKCEobGV2ZWwgJiBUUF9FQ19GQU5fQVVUTykgJiYKLQkJICAgICEobGV2ZWwgJiBUUF9FQ19GQU5fRlVMTFNQRUVEKSAmJgotCQkgICAgKChsZXZlbCA8IDApIHx8IChsZXZlbCA+IDcpKSkKLQkJCXJldHVybiAtRUlOVkFMOwotCi0JCS8qIHNhZmV0eSBuZXQgc2hvdWxkIHRoZSBFQyBub3Qgc3VwcG9ydCBBVVRPCi0JCSAqIG9yIEZVTExTUEVFRCBtb2RlIGJpdHMgYW5kIGp1c3QgaWdub3JlIHRoZW0gKi8KLQkJaWYgKGxldmVsICYgVFBfRUNfRkFOX0ZVTExTUEVFRCkKLQkJCWxldmVsIHw9IDc7CS8qIHNhZmV0eSBtaW4gc3BlZWQgNyAqLwotCQllbHNlIGlmIChsZXZlbCAmIFRQX0VDX0ZBTl9BVVRPKQotCQkJbGV2ZWwgfD0gNDsJLyogc2FmZXR5IG1pbiBzcGVlZCA0ICovCi0KLQkJaWYgKCFhY3BpX2VjX3dyaXRlKGZhbl9zdGF0dXNfb2Zmc2V0LCBsZXZlbCkpCi0JCQlyZXR1cm4gLUVJTzsKLQkJZWxzZQotCQkJdHBfZmVhdHVyZXMuZmFuX2N0cmxfc3RhdHVzX3VuZGVmID0gMDsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlyZXR1cm4gLUVOWElPOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBmYW5fc2V0X2xldmVsX3NhZmUoaW50IGxldmVsKQotewotCWludCByYzsKLQotCWlmICghZmFuX2NvbnRyb2xfYWxsb3dlZCkKLQkJcmV0dXJuIC1FUEVSTTsKLQotCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJmZhbl9tdXRleCkpCi0JCXJldHVybiAtRVJFU1RBUlRTWVM7Ci0KLQlpZiAobGV2ZWwgPT0gVFBBQ1BJX0ZBTl9MQVNUX0xFVkVMKQotCQlsZXZlbCA9IGZhbl9jb250cm9sX2Rlc2lyZWRfbGV2ZWw7Ci0KLQlyYyA9IGZhbl9zZXRfbGV2ZWwobGV2ZWwpOwotCWlmICghcmMpCi0JCWZhbl91cGRhdGVfZGVzaXJlZF9sZXZlbChsZXZlbCk7Ci0KLQltdXRleF91bmxvY2soJmZhbl9tdXRleCk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IGZhbl9zZXRfZW5hYmxlKHZvaWQpCi17Ci0JdTggczsKLQlpbnQgcmM7Ci0KLQlpZiAoIWZhbl9jb250cm9sX2FsbG93ZWQpCi0JCXJldHVybiAtRVBFUk07Ci0KLQlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZmYW5fbXV0ZXgpKQotCQlyZXR1cm4gLUVSRVNUQVJUU1lTOwotCi0Jc3dpdGNoIChmYW5fY29udHJvbF9hY2Nlc3NfbW9kZSkgewotCWNhc2UgVFBBQ1BJX0ZBTl9XUl9BQ1BJX0ZBTlM6Ci0JY2FzZSBUUEFDUElfRkFOX1dSX1RQRUM6Ci0JCXJjID0gZmFuX2dldF9zdGF0dXMoJnMpOwotCQlpZiAocmMgPCAwKQotCQkJYnJlYWs7Ci0KLQkJLyogRG9uJ3QgZ28gb3V0IG9mIGVtZXJnZW5jeSBmYW4gbW9kZSAqLwotCQlpZiAocyAhPSA3KSB7Ci0JCQlzICY9IDB4MDc7Ci0JCQlzIHw9IFRQX0VDX0ZBTl9BVVRPIHwgNDsgLyogbWluIGZhbiBzcGVlZCA0ICovCi0JCX0KLQotCQlpZiAoIWFjcGlfZWNfd3JpdGUoZmFuX3N0YXR1c19vZmZzZXQsIHMpKQotCQkJcmMgPSAtRUlPOwotCQllbHNlIHsKLQkJCXRwX2ZlYXR1cmVzLmZhbl9jdHJsX3N0YXR1c191bmRlZiA9IDA7Ci0JCQlyYyA9IDA7Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIFRQQUNQSV9GQU5fV1JfQUNQSV9TRkFOOgotCQlyYyA9IGZhbl9nZXRfc3RhdHVzKCZzKTsKLQkJaWYgKHJjIDwgMCkKLQkJCWJyZWFrOwotCi0JCXMgJj0gMHgwNzsKLQotCQkvKiBTZXQgZmFuIHRvIGF0IGxlYXN0IGxldmVsIDQgKi8KLQkJcyB8PSA0OwotCi0JCWlmICghYWNwaV9ldmFsZihzZmFuX2hhbmRsZSwgTlVMTCwgTlVMTCwgInZkIiwgcykpCi0JCQlyYyA9IC1FSU87Ci0JCWVsc2UKLQkJCXJjID0gMDsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlyYyA9IC1FTlhJTzsKLQl9Ci0KLQltdXRleF91bmxvY2soJmZhbl9tdXRleCk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IGZhbl9zZXRfZGlzYWJsZSh2b2lkKQotewotCWludCByYzsKLQotCWlmICghZmFuX2NvbnRyb2xfYWxsb3dlZCkKLQkJcmV0dXJuIC1FUEVSTTsKLQotCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJmZhbl9tdXRleCkpCi0JCXJldHVybiAtRVJFU1RBUlRTWVM7Ci0KLQlyYyA9IDA7Ci0Jc3dpdGNoIChmYW5fY29udHJvbF9hY2Nlc3NfbW9kZSkgewotCWNhc2UgVFBBQ1BJX0ZBTl9XUl9BQ1BJX0ZBTlM6Ci0JY2FzZSBUUEFDUElfRkFOX1dSX1RQRUM6Ci0JCWlmICghYWNwaV9lY193cml0ZShmYW5fc3RhdHVzX29mZnNldCwgMHgwMCkpCi0JCQlyYyA9IC1FSU87Ci0JCWVsc2UgewotCQkJZmFuX2NvbnRyb2xfZGVzaXJlZF9sZXZlbCA9IDA7Ci0JCQl0cF9mZWF0dXJlcy5mYW5fY3RybF9zdGF0dXNfdW5kZWYgPSAwOwotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBUUEFDUElfRkFOX1dSX0FDUElfU0ZBTjoKLQkJaWYgKCFhY3BpX2V2YWxmKHNmYW5faGFuZGxlLCBOVUxMLCBOVUxMLCAidmQiLCAweDAwKSkKLQkJCXJjID0gLUVJTzsKLQkJZWxzZQotCQkJZmFuX2NvbnRyb2xfZGVzaXJlZF9sZXZlbCA9IDA7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJcmMgPSAtRU5YSU87Ci0JfQotCi0KLQltdXRleF91bmxvY2soJmZhbl9tdXRleCk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IGZhbl9zZXRfc3BlZWQoaW50IHNwZWVkKQotewotCWludCByYzsKLQotCWlmICghZmFuX2NvbnRyb2xfYWxsb3dlZCkKLQkJcmV0dXJuIC1FUEVSTTsKLQotCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJmZhbl9tdXRleCkpCi0JCXJldHVybiAtRVJFU1RBUlRTWVM7Ci0KLQlyYyA9IDA7Ci0Jc3dpdGNoIChmYW5fY29udHJvbF9hY2Nlc3NfbW9kZSkgewotCWNhc2UgVFBBQ1BJX0ZBTl9XUl9BQ1BJX0ZBTlM6Ci0JCWlmIChzcGVlZCA+PSAwICYmIHNwZWVkIDw9IDY1NTM1KSB7Ci0JCQlpZiAoIWFjcGlfZXZhbGYoZmFuc19oYW5kbGUsIE5VTEwsIE5VTEwsICJ2ZGRkIiwKLQkJCQkJc3BlZWQsIHNwZWVkLCBzcGVlZCkpCi0JCQkJcmMgPSAtRUlPOwotCQl9IGVsc2UKLQkJCXJjID0gLUVJTlZBTDsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlyYyA9IC1FTlhJTzsKLQl9Ci0KLQltdXRleF91bmxvY2soJmZhbl9tdXRleCk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgdm9pZCBmYW5fd2F0Y2hkb2dfcmVzZXQodm9pZCkKLXsKLQlzdGF0aWMgaW50IGZhbl93YXRjaGRvZ19hY3RpdmU7Ci0KLQlpZiAoZmFuX2NvbnRyb2xfYWNjZXNzX21vZGUgPT0gVFBBQ1BJX0ZBTl9XUl9OT05FKQotCQlyZXR1cm47Ci0KLQlpZiAoZmFuX3dhdGNoZG9nX2FjdGl2ZSkKLQkJY2FuY2VsX2RlbGF5ZWRfd29yaygmZmFuX3dhdGNoZG9nX3Rhc2spOwotCi0JaWYgKGZhbl93YXRjaGRvZ19tYXhpbnRlcnZhbCA+IDAgJiYKLQkgICAgdHBhY3BpX2xpZmVjeWNsZSAhPSBUUEFDUElfTElGRV9FWElUSU5HKSB7Ci0JCWZhbl93YXRjaGRvZ19hY3RpdmUgPSAxOwotCQlpZiAoIXF1ZXVlX2RlbGF5ZWRfd29yayh0cGFjcGlfd3EsICZmYW5fd2F0Y2hkb2dfdGFzaywKLQkJCQltc2Vjc190b19qaWZmaWVzKGZhbl93YXRjaGRvZ19tYXhpbnRlcnZhbAotCQkJCQkJICogMTAwMCkpKSB7Ci0JCQlwcmludGsoVFBBQ1BJX0VSUgotCQkJICAgICAgICJmYWlsZWQgdG8gcXVldWUgdGhlIGZhbiB3YXRjaGRvZywgIgotCQkJICAgICAgICJ3YXRjaGRvZyB3aWxsIG5vdCB0cmlnZ2VyXG4iKTsKLQkJfQotCX0gZWxzZQotCQlmYW5fd2F0Y2hkb2dfYWN0aXZlID0gMDsKLX0KLQotc3RhdGljIHZvaWQgZmFuX3dhdGNoZG9nX2ZpcmUoc3RydWN0IHdvcmtfc3RydWN0ICppZ25vcmVkKQotewotCWludCByYzsKLQotCWlmICh0cGFjcGlfbGlmZWN5Y2xlICE9IFRQQUNQSV9MSUZFX1JVTk5JTkcpCi0JCXJldHVybjsKLQotCXByaW50ayhUUEFDUElfTk9USUNFICJmYW4gd2F0Y2hkb2c6IGVuYWJsaW5nIGZhblxuIik7Ci0JcmMgPSBmYW5fc2V0X2VuYWJsZSgpOwotCWlmIChyYyA8IDApIHsKLQkJcHJpbnRrKFRQQUNQSV9FUlIgImZhbiB3YXRjaGRvZzogZXJyb3IgJWQgd2hpbGUgZW5hYmxpbmcgZmFuLCAiCi0JCQkid2lsbCB0cnkgYWdhaW4gbGF0ZXIuLi5cbiIsIC1yYyk7Ci0JCS8qIHJlc2NoZWR1bGUgZm9yIGxhdGVyICovCi0JCWZhbl93YXRjaGRvZ19yZXNldCgpOwotCX0KLX0KLQotLyoKLSAqIFNZU0ZTIGZhbiBsYXlvdXQ6IGh3bW9uIGNvbXBhdGlibGUgKGRldmljZSkKLSAqCi0gKiBwd20qX2VuYWJsZToKLSAqIAkwOiAiZGlzZW5nYWdlZCIgbW9kZQotICogCTE6IG1hbnVhbCBtb2RlCi0gKiAJMjogbmF0aXZlIEVDICJhdXRvIiBtb2RlIChyZWNvbW1lbmRlZCwgaGFyZHdhcmUgZGVmYXVsdCkKLSAqCi0gKiBwd20qOiBzZXQgc3BlZWQgaW4gbWFudWFsIG1vZGUsIGlnbm9yZWQgb3RoZXJ3aXNlLgotICogCTAgaXMgbGV2ZWwgMDsgMjU1IGlzIGxldmVsIDcuIEludGVybWVkaWF0ZSBwb2ludHMgZG9uZSB3aXRoIGxpbmVhcgotICogCWludGVycG9sYXRpb24uCi0gKgotICogZmFuKl9pbnB1dDogdGFjaG9tZXRlciByZWFkaW5nLCBSUE0KLSAqCi0gKgotICogU1lTRlMgZmFuIGxheW91dDogZXh0ZW5zaW9ucwotICoKLSAqIGZhbl93YXRjaGRvZyAoZHJpdmVyKToKLSAqIAlmYW4gd2F0Y2hkb2cgaW50ZXJ2YWwgaW4gc2Vjb25kcywgMCBkaXNhYmxlcyAoZGVmYXVsdCksIG1heCAxMjAKLSAqLwotCi0vKiBzeXNmcyBmYW4gcHdtMV9lbmFibGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLXN0YXRpYyBzc2l6ZV90IGZhbl9wd20xX2VuYWJsZV9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCQkgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCQkJICAgIGNoYXIgKmJ1ZikKLXsKLQlpbnQgcmVzLCBtb2RlOwotCXU4IHN0YXR1czsKLQotCXJlcyA9IGZhbl9nZXRfc3RhdHVzX3NhZmUoJnN0YXR1cyk7Ci0JaWYgKHJlcykKLQkJcmV0dXJuIHJlczsKLQotCWlmICh1bmxpa2VseSh0cF9mZWF0dXJlcy5mYW5fY3RybF9zdGF0dXNfdW5kZWYpKSB7Ci0JCWlmIChzdGF0dXMgIT0gZmFuX2NvbnRyb2xfaW5pdGlhbF9zdGF0dXMpIHsKLQkJCXRwX2ZlYXR1cmVzLmZhbl9jdHJsX3N0YXR1c191bmRlZiA9IDA7Ci0JCX0gZWxzZSB7Ci0JCQkvKiBSZXR1cm4gbW9zdCBsaWtlbHkgc3RhdHVzLiBJbiBmYWN0LCBpdAotCQkJICogbWlnaHQgYmUgdGhlIG9ubHkgcG9zc2libGUgc3RhdHVzICovCi0JCQlzdGF0dXMgPSBUUF9FQ19GQU5fQVVUTzsKLQkJfQotCX0KLQotCWlmIChzdGF0dXMgJiBUUF9FQ19GQU5fRlVMTFNQRUVEKSB7Ci0JCW1vZGUgPSAwOwotCX0gZWxzZSBpZiAoc3RhdHVzICYgVFBfRUNfRkFOX0FVVE8pIHsKLQkJbW9kZSA9IDI7Ci0JfSBlbHNlCi0JCW1vZGUgPSAxOwotCi0JcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWRcbiIsIG1vZGUpOwotfQotCi1zdGF0aWMgc3NpemVfdCBmYW5fcHdtMV9lbmFibGVfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAotCQkJCSAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCQkJICAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKLXsKLQl1bnNpZ25lZCBsb25nIHQ7Ci0JaW50IHJlcywgbGV2ZWw7Ci0KLQlpZiAocGFyc2Vfc3RydG91bChidWYsIDIsICZ0KSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlzd2l0Y2ggKHQpIHsKLQljYXNlIDA6Ci0JCWxldmVsID0gVFBfRUNfRkFOX0ZVTExTUEVFRDsKLQkJYnJlYWs7Ci0JY2FzZSAxOgotCQlsZXZlbCA9IFRQQUNQSV9GQU5fTEFTVF9MRVZFTDsKLQkJYnJlYWs7Ci0JY2FzZSAyOgotCQlsZXZlbCA9IFRQX0VDX0ZBTl9BVVRPOwotCQlicmVhazsKLQljYXNlIDM6Ci0JCS8qIHJlc2VydmVkIGZvciBzb2Z0d2FyZS1jb250cm9sbGVkIGF1dG8gbW9kZSAqLwotCQlyZXR1cm4gLUVOT1NZUzsKLQlkZWZhdWx0OgotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlyZXMgPSBmYW5fc2V0X2xldmVsX3NhZmUobGV2ZWwpOwotCWlmIChyZXMgPT0gLUVOWElPKQotCQlyZXR1cm4gLUVJTlZBTDsKLQllbHNlIGlmIChyZXMgPCAwKQotCQlyZXR1cm4gcmVzOwotCi0JZmFuX3dhdGNoZG9nX3Jlc2V0KCk7Ci0KLQlyZXR1cm4gY291bnQ7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSBkZXZfYXR0cl9mYW5fcHdtMV9lbmFibGUgPQotCV9fQVRUUihwd20xX2VuYWJsZSwgU19JV1VTUiB8IFNfSVJVR08sCi0JCWZhbl9wd20xX2VuYWJsZV9zaG93LCBmYW5fcHdtMV9lbmFibGVfc3RvcmUpOwotCi0vKiBzeXNmcyBmYW4gcHdtMSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLXN0YXRpYyBzc2l6ZV90IGZhbl9wd20xX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAotCQkJICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCSAgICAgY2hhciAqYnVmKQotewotCWludCByZXM7Ci0JdTggc3RhdHVzOwotCi0JcmVzID0gZmFuX2dldF9zdGF0dXNfc2FmZSgmc3RhdHVzKTsKLQlpZiAocmVzKQotCQlyZXR1cm4gcmVzOwotCi0JaWYgKHVubGlrZWx5KHRwX2ZlYXR1cmVzLmZhbl9jdHJsX3N0YXR1c191bmRlZikpIHsKLQkJaWYgKHN0YXR1cyAhPSBmYW5fY29udHJvbF9pbml0aWFsX3N0YXR1cykgewotCQkJdHBfZmVhdHVyZXMuZmFuX2N0cmxfc3RhdHVzX3VuZGVmID0gMDsKLQkJfSBlbHNlIHsKLQkJCXN0YXR1cyA9IFRQX0VDX0ZBTl9BVVRPOwotCQl9Ci0JfQotCi0JaWYgKChzdGF0dXMgJgotCSAgICAgKFRQX0VDX0ZBTl9BVVRPIHwgVFBfRUNfRkFOX0ZVTExTUEVFRCkpICE9IDApCi0JCXN0YXR1cyA9IGZhbl9jb250cm9sX2Rlc2lyZWRfbGV2ZWw7Ci0KLQlpZiAoc3RhdHVzID4gNykKLQkJc3RhdHVzID0gNzsKLQotCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiV1XG4iLCAoc3RhdHVzICogMjU1KSAvIDcpOwotfQotCi1zdGF0aWMgc3NpemVfdCBmYW5fcHdtMV9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCSAgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQotewotCXVuc2lnbmVkIGxvbmcgczsKLQlpbnQgcmM7Ci0JdTggc3RhdHVzLCBuZXdsZXZlbDsKLQotCWlmIChwYXJzZV9zdHJ0b3VsKGJ1ZiwgMjU1LCAmcykpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JLyogc2NhbGUgZG93biBmcm9tIDAtMjU1IHRvIDAtNyAqLwotCW5ld2xldmVsID0gKHMgPj4gNSkgJiAweDA3OwotCi0JaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmZmFuX211dGV4KSkKLQkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKLQotCXJjID0gZmFuX2dldF9zdGF0dXMoJnN0YXR1cyk7Ci0JaWYgKCFyYyAmJiAoc3RhdHVzICYKLQkJICAgIChUUF9FQ19GQU5fQVVUTyB8IFRQX0VDX0ZBTl9GVUxMU1BFRUQpKSA9PSAwKSB7Ci0JCXJjID0gZmFuX3NldF9sZXZlbChuZXdsZXZlbCk7Ci0JCWlmIChyYyA9PSAtRU5YSU8pCi0JCQlyYyA9IC1FSU5WQUw7Ci0JCWVsc2UgaWYgKCFyYykgewotCQkJZmFuX3VwZGF0ZV9kZXNpcmVkX2xldmVsKG5ld2xldmVsKTsKLQkJCWZhbl93YXRjaGRvZ19yZXNldCgpOwotCQl9Ci0JfQotCi0JbXV0ZXhfdW5sb2NrKCZmYW5fbXV0ZXgpOwotCXJldHVybiAocmMpPyByYyA6IGNvdW50OwotfQotCi1zdGF0aWMgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgZGV2X2F0dHJfZmFuX3B3bTEgPQotCV9fQVRUUihwd20xLCBTX0lXVVNSIHwgU19JUlVHTywKLQkJZmFuX3B3bTFfc2hvdywgZmFuX3B3bTFfc3RvcmUpOwotCi0vKiBzeXNmcyBmYW4gZmFuMV9pbnB1dCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLXN0YXRpYyBzc2l6ZV90IGZhbl9mYW4xX2lucHV0X3Nob3coc3RydWN0IGRldmljZSAqZGV2LAotCQkJICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCQkgICBjaGFyICpidWYpCi17Ci0JaW50IHJlczsKLQl1bnNpZ25lZCBpbnQgc3BlZWQ7Ci0KLQlyZXMgPSBmYW5fZ2V0X3NwZWVkKCZzcGVlZCk7Ci0JaWYgKHJlcyA8IDApCi0JCXJldHVybiByZXM7Ci0KLQlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIldVxuIiwgc3BlZWQpOwotfQotCi1zdGF0aWMgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgZGV2X2F0dHJfZmFuX2ZhbjFfaW5wdXQgPQotCV9fQVRUUihmYW4xX2lucHV0LCBTX0lSVUdPLAotCQlmYW5fZmFuMV9pbnB1dF9zaG93LCBOVUxMKTsKLQotLyogc3lzZnMgZmFuIGZhbl93YXRjaGRvZyAoaHdtb24gZHJpdmVyKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi1zdGF0aWMgc3NpemVfdCBmYW5fZmFuX3dhdGNoZG9nX3Nob3coc3RydWN0IGRldmljZV9kcml2ZXIgKmRydiwKLQkJCQkgICAgIGNoYXIgKmJ1ZikKLXsKLQlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIldVxuIiwgZmFuX3dhdGNoZG9nX21heGludGVydmFsKTsKLX0KLQotc3RhdGljIHNzaXplX3QgZmFuX2Zhbl93YXRjaGRvZ19zdG9yZShzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2LAotCQkJCSAgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQotewotCXVuc2lnbmVkIGxvbmcgdDsKLQotCWlmIChwYXJzZV9zdHJ0b3VsKGJ1ZiwgMTIwLCAmdCkpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKCFmYW5fY29udHJvbF9hbGxvd2VkKQotCQlyZXR1cm4gLUVQRVJNOwotCi0JZmFuX3dhdGNoZG9nX21heGludGVydmFsID0gdDsKLQlmYW5fd2F0Y2hkb2dfcmVzZXQoKTsKLQotCXJldHVybiBjb3VudDsKLX0KLQotc3RhdGljIERSSVZFUl9BVFRSKGZhbl93YXRjaGRvZywgU19JV1VTUiB8IFNfSVJVR08sCi0JCWZhbl9mYW5fd2F0Y2hkb2dfc2hvdywgZmFuX2Zhbl93YXRjaGRvZ19zdG9yZSk7Ci0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmZhbl9hdHRyaWJ1dGVzW10gPSB7Ci0JJmRldl9hdHRyX2Zhbl9wd20xX2VuYWJsZS5hdHRyLCAmZGV2X2F0dHJfZmFuX3B3bTEuYXR0ciwKLQkmZGV2X2F0dHJfZmFuX2ZhbjFfaW5wdXQuYXR0ciwKLQlOVUxMCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBmYW5fYXR0cl9ncm91cCA9IHsKLQkuYXR0cnMgPSBmYW5fYXR0cmlidXRlcywKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IGZhbl9pbml0KHN0cnVjdCBpYm1faW5pdF9zdHJ1Y3QgKmlpYm0pCi17Ci0JaW50IHJjOwotCi0JdmRiZ19wcmludGsoVFBBQ1BJX0RCR19JTklULCAiaW5pdGlhbGl6aW5nIGZhbiBzdWJkcml2ZXJcbiIpOwotCi0JbXV0ZXhfaW5pdCgmZmFuX211dGV4KTsKLQlmYW5fc3RhdHVzX2FjY2Vzc19tb2RlID0gVFBBQ1BJX0ZBTl9OT05FOwotCWZhbl9jb250cm9sX2FjY2Vzc19tb2RlID0gVFBBQ1BJX0ZBTl9XUl9OT05FOwotCWZhbl9jb250cm9sX2NvbW1hbmRzID0gMDsKLQlmYW5fd2F0Y2hkb2dfbWF4aW50ZXJ2YWwgPSAwOwotCXRwX2ZlYXR1cmVzLmZhbl9jdHJsX3N0YXR1c191bmRlZiA9IDA7Ci0JZmFuX2NvbnRyb2xfZGVzaXJlZF9sZXZlbCA9IDc7Ci0KLQlUUEFDUElfQUNQSUhBTkRMRV9JTklUKGZhbnMpOwotCVRQQUNQSV9BQ1BJSEFORExFX0lOSVQoZ2Zhbik7Ci0JVFBBQ1BJX0FDUElIQU5ETEVfSU5JVChzZmFuKTsKLQotCWlmIChnZmFuX2hhbmRsZSkgewotCQkvKiA1NzAsIDYwMGUveCwgNzcwZSwgNzcweCAqLwotCQlmYW5fc3RhdHVzX2FjY2Vzc19tb2RlID0gVFBBQ1BJX0ZBTl9SRF9BQ1BJX0dGQU47Ci0JfSBlbHNlIHsKLQkJLyogYWxsIG90aGVyIFRoaW5rUGFkczogbm90ZSB0aGF0IGV2ZW4gb2xkLXN0eWxlCi0JCSAqIFRoaW5rUGFkIEVDcyBzdXBwb3J0cyB0aGUgZmFuIGNvbnRyb2wgcmVnaXN0ZXIgKi8KLQkJaWYgKGxpa2VseShhY3BpX2VjX3JlYWQoZmFuX3N0YXR1c19vZmZzZXQsCi0JCQkJCSZmYW5fY29udHJvbF9pbml0aWFsX3N0YXR1cykpKSB7Ci0JCQlmYW5fc3RhdHVzX2FjY2Vzc19tb2RlID0gVFBBQ1BJX0ZBTl9SRF9UUEVDOwotCi0JCQkvKiBJbiBzb21lIFRoaW5rUGFkcywgbmVpdGhlciB0aGUgRUMgbm9yIHRoZSBBQ1BJCi0JCQkgKiBEU0RUIGluaXRpYWxpemUgdGhlIGZhbiBzdGF0dXMsIGFuZCBpdCBlbmRzIHVwCi0JCQkgKiBiZWluZyBzZXQgdG8gMHgwNyB3aGVuIGl0ICpjb3VsZCogYmUgZWl0aGVyCi0JCQkgKiAweDA3IG9yIDB4ODAuCi0JCQkgKgotCQkJICogRW5hYmxlIGZvciBUUC0xWSAoVDQzKSwgVFAtNzggKFI1MWUpLAotCQkJICogVFAtNzYgKFI1MiksIFRQLTcwIChUNDMsIFI1MiksIHdoaWNoIGFyZSBrbm93bgotCQkJICogdG8gYmUgYnVnZ3kuICovCi0JCQlpZiAoZmFuX2NvbnRyb2xfaW5pdGlhbF9zdGF0dXMgPT0gMHgwNykgewotCQkJCXN3aXRjaCAodGhpbmtwYWRfaWQuZWNfbW9kZWwpIHsKLQkJCQljYXNlIDB4NTkzMTogLyogVFAtMVkgKi8KLQkJCQljYXNlIDB4MzgzNzogLyogVFAtNzggKi8KLQkJCQljYXNlIDB4MzYzNzogLyogVFAtNzYgKi8KLQkJCQljYXNlIDB4MzAzNzogLyogVFAtNzAgKi8KLQkJCQkJcHJpbnRrKFRQQUNQSV9OT1RJQ0UKLQkJCQkJICAgICAgICJmYW5faW5pdDogaW5pdGlhbCBmYW4gc3RhdHVzICIKLQkJCQkJICAgICAgICJpcyB1bmtub3duLCBhc3N1bWluZyBpdCBpcyAiCi0JCQkJCSAgICAgICAiaW4gYXV0byBtb2RlXG4iKTsKLQkJCQkJdHBfZmVhdHVyZXMuZmFuX2N0cmxfc3RhdHVzX3VuZGVmID0gMTsKLQkJCQkJOzsKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlwcmludGsoVFBBQ1BJX0VSUgotCQkJICAgICAgICJUaGlua1BhZCBBQ1BJIEVDIGFjY2VzcyBtaXNiZWhhdmluZywgIgotCQkJICAgICAgICJmYW4gc3RhdHVzIGFuZCBjb250cm9sIHVuYXZhaWxhYmxlXG4iKTsKLQkJCXJldHVybiAxOwotCQl9Ci0JfQotCi0JaWYgKHNmYW5faGFuZGxlKSB7Ci0JCS8qIDU3MCwgNzcweC1KTCAqLwotCQlmYW5fY29udHJvbF9hY2Nlc3NfbW9kZSA9IFRQQUNQSV9GQU5fV1JfQUNQSV9TRkFOOwotCQlmYW5fY29udHJvbF9jb21tYW5kcyB8PQotCQkgICAgVFBBQ1BJX0ZBTl9DTURfTEVWRUwgfCBUUEFDUElfRkFOX0NNRF9FTkFCTEU7Ci0JfSBlbHNlIHsKLQkJaWYgKCFnZmFuX2hhbmRsZSkgewotCQkJLyogZ2ZhbiB3aXRob3V0IHNmYW4gbWVhbnMgbm8gZmFuIGNvbnRyb2wgKi8KLQkJCS8qIGFsbCBvdGhlciBtb2RlbHMgaW1wbGVtZW50IFRQIEVDIDB4MmYgY29udHJvbCAqLwotCi0JCQlpZiAoZmFuc19oYW5kbGUpIHsKLQkJCQkvKiBYMzEsIFg0MCwgWDQxICovCi0JCQkJZmFuX2NvbnRyb2xfYWNjZXNzX21vZGUgPQotCQkJCSAgICBUUEFDUElfRkFOX1dSX0FDUElfRkFOUzsKLQkJCQlmYW5fY29udHJvbF9jb21tYW5kcyB8PQotCQkJCSAgICBUUEFDUElfRkFOX0NNRF9TUEVFRCB8Ci0JCQkJICAgIFRQQUNQSV9GQU5fQ01EX0xFVkVMIHwKLQkJCQkgICAgVFBBQ1BJX0ZBTl9DTURfRU5BQkxFOwotCQkJfSBlbHNlIHsKLQkJCQlmYW5fY29udHJvbF9hY2Nlc3NfbW9kZSA9IFRQQUNQSV9GQU5fV1JfVFBFQzsKLQkJCQlmYW5fY29udHJvbF9jb21tYW5kcyB8PQotCQkJCSAgICBUUEFDUElfRkFOX0NNRF9MRVZFTCB8Ci0JCQkJICAgIFRQQUNQSV9GQU5fQ01EX0VOQUJMRTsKLQkJCX0KLQkJfQotCX0KLQotCXZkYmdfcHJpbnRrKFRQQUNQSV9EQkdfSU5JVCwgImZhbiBpcyAlcywgbW9kZXMgJWQsICVkXG4iLAotCQlzdHJfc3VwcG9ydGVkKGZhbl9zdGF0dXNfYWNjZXNzX21vZGUgIT0gVFBBQ1BJX0ZBTl9OT05FIHx8Ci0JCSAgZmFuX2NvbnRyb2xfYWNjZXNzX21vZGUgIT0gVFBBQ1BJX0ZBTl9XUl9OT05FKSwKLQkJZmFuX3N0YXR1c19hY2Nlc3NfbW9kZSwgZmFuX2NvbnRyb2xfYWNjZXNzX21vZGUpOwotCi0JLyogZmFuIGNvbnRyb2wgbWFzdGVyIHN3aXRjaCAqLwotCWlmICghZmFuX2NvbnRyb2xfYWxsb3dlZCkgewotCQlmYW5fY29udHJvbF9hY2Nlc3NfbW9kZSA9IFRQQUNQSV9GQU5fV1JfTk9ORTsKLQkJZmFuX2NvbnRyb2xfY29tbWFuZHMgPSAwOwotCQlkYmdfcHJpbnRrKFRQQUNQSV9EQkdfSU5JVCwKLQkJCSAgICJmYW4gY29udHJvbCBmZWF0dXJlcyBkaXNhYmxlZCBieSBwYXJhbWV0ZXJcbiIpOwotCX0KLQotCS8qIHVwZGF0ZSBmYW5fY29udHJvbF9kZXNpcmVkX2xldmVsICovCi0JaWYgKGZhbl9zdGF0dXNfYWNjZXNzX21vZGUgIT0gVFBBQ1BJX0ZBTl9OT05FKQotCQlmYW5fZ2V0X3N0YXR1c19zYWZlKE5VTEwpOwotCi0JaWYgKGZhbl9zdGF0dXNfYWNjZXNzX21vZGUgIT0gVFBBQ1BJX0ZBTl9OT05FIHx8Ci0JICAgIGZhbl9jb250cm9sX2FjY2Vzc19tb2RlICE9IFRQQUNQSV9GQU5fV1JfTk9ORSkgewotCQlyYyA9IHN5c2ZzX2NyZWF0ZV9ncm91cCgmdHBhY3BpX3NlbnNvcnNfcGRldi0+ZGV2LmtvYmosCi0JCQkJCSAmZmFuX2F0dHJfZ3JvdXApOwotCQlpZiAocmMgPCAwKQotCQkJcmV0dXJuIHJjOwotCi0JCXJjID0gZHJpdmVyX2NyZWF0ZV9maWxlKCZ0cGFjcGlfaHdtb25fcGRyaXZlci5kcml2ZXIsCi0JCQkJCSZkcml2ZXJfYXR0cl9mYW5fd2F0Y2hkb2cpOwotCQlpZiAocmMgPCAwKSB7Ci0JCQlzeXNmc19yZW1vdmVfZ3JvdXAoJnRwYWNwaV9zZW5zb3JzX3BkZXYtPmRldi5rb2JqLAotCQkJCQkmZmFuX2F0dHJfZ3JvdXApOwotCQkJcmV0dXJuIHJjOwotCQl9Ci0JCXJldHVybiAwOwotCX0gZWxzZQotCQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIHZvaWQgZmFuX2V4aXQodm9pZCkKLXsKLQl2ZGJnX3ByaW50ayhUUEFDUElfREJHX0VYSVQsCi0JCSAgICAiY2FuY2VsbGluZyBhbnkgcGVuZGluZyBmYW4gd2F0Y2hkb2cgdGFza3NcbiIpOwotCi0JLyogRklYTUU6IGNhbiB3ZSByZWFsbHkgZG8gdGhpcyB1bmNvbmRpdGlvbmFsbHk/ICovCi0Jc3lzZnNfcmVtb3ZlX2dyb3VwKCZ0cGFjcGlfc2Vuc29yc19wZGV2LT5kZXYua29iaiwgJmZhbl9hdHRyX2dyb3VwKTsKLQlkcml2ZXJfcmVtb3ZlX2ZpbGUoJnRwYWNwaV9od21vbl9wZHJpdmVyLmRyaXZlciwKLQkJCSAgICZkcml2ZXJfYXR0cl9mYW5fd2F0Y2hkb2cpOwotCi0JY2FuY2VsX2RlbGF5ZWRfd29yaygmZmFuX3dhdGNoZG9nX3Rhc2spOwotCWZsdXNoX3dvcmtxdWV1ZSh0cGFjcGlfd3EpOwotfQotCi1zdGF0aWMgdm9pZCBmYW5fc3VzcGVuZChwbV9tZXNzYWdlX3Qgc3RhdGUpCi17Ci0JaW50IHJjOwotCi0JaWYgKCFmYW5fY29udHJvbF9hbGxvd2VkKQotCQlyZXR1cm47Ci0KLQkvKiBTdG9yZSBmYW4gc3RhdHVzIGluIGNhY2hlICovCi0JZmFuX2NvbnRyb2xfcmVzdW1lX2xldmVsID0gMDsKLQlyYyA9IGZhbl9nZXRfc3RhdHVzX3NhZmUoJmZhbl9jb250cm9sX3Jlc3VtZV9sZXZlbCk7Ci0JaWYgKHJjIDwgMCkKLQkJcHJpbnRrKFRQQUNQSV9OT1RJQ0UKLQkJCSJmYWlsZWQgdG8gcmVhZCBmYW4gbGV2ZWwgZm9yIGxhdGVyICIKLQkJCSJyZXN0b3JlIGR1cmluZyByZXN1bWU6ICVkXG4iLCByYyk7Ci0KLQkvKiBpZiBpdCBpcyB1bmRlZmluZWQsIGRvbid0IGF0dGVtcHQgdG8gcmVzdG9yZSBpdC4KLQkgKiBLRUVQIFRISVMgTEFTVCAqLwotCWlmICh0cF9mZWF0dXJlcy5mYW5fY3RybF9zdGF0dXNfdW5kZWYpCi0JCWZhbl9jb250cm9sX3Jlc3VtZV9sZXZlbCA9IDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGZhbl9yZXN1bWUodm9pZCkKLXsKLQl1OCBjdXJyZW50X2xldmVsID0gNzsKLQlib29sIGRvX3NldCA9IGZhbHNlOwotCWludCByYzsKLQotCS8qIERTRFQgKmFsd2F5cyogdXBkYXRlcyBzdGF0dXMgb24gcmVzdW1lICovCi0JdHBfZmVhdHVyZXMuZmFuX2N0cmxfc3RhdHVzX3VuZGVmID0gMDsKLQotCWlmICghZmFuX2NvbnRyb2xfYWxsb3dlZCB8fAotCSAgICAhZmFuX2NvbnRyb2xfcmVzdW1lX2xldmVsIHx8Ci0JICAgIChmYW5fZ2V0X3N0YXR1c19zYWZlKCZjdXJyZW50X2xldmVsKSA8IDApKQotCQlyZXR1cm47Ci0KLQlzd2l0Y2ggKGZhbl9jb250cm9sX2FjY2Vzc19tb2RlKSB7Ci0JY2FzZSBUUEFDUElfRkFOX1dSX0FDUElfU0ZBTjoKLQkJLyogbmV2ZXIgZGVjcmVhc2UgZmFuIGxldmVsICovCi0JCWRvX3NldCA9IChmYW5fY29udHJvbF9yZXN1bWVfbGV2ZWwgPiBjdXJyZW50X2xldmVsKTsKLQkJYnJlYWs7Ci0JY2FzZSBUUEFDUElfRkFOX1dSX0FDUElfRkFOUzoKLQljYXNlIFRQQUNQSV9GQU5fV1JfVFBFQzoKLQkJLyogbmV2ZXIgZGVjcmVhc2UgZmFuIGxldmVsLCBzY2FsZSBpczoKLQkJICogVFBfRUNfRkFOX0ZVTExTUEVFRCA+IDcgPj0gVFBfRUNfRkFOX0FVVE8KLQkJICoKLQkJICogV2UgZXhwZWN0IHRoZSBmaXJtd2FyZSB0byBzZXQgZWl0aGVyIDcgb3IgQVVUTywgYnV0IHdlCi0JCSAqIGhhbmRsZSBGVUxMU1BFRUQgb3V0IG9mIHBhcmFub2lhLgotCQkgKgotCQkgKiBTbywgd2UgY2FuIHNhZmVseSBvbmx5IHJlc3RvcmUgRlVMTFNQRUVEIG9yIDcsIGFueXRoaW5nCi0JCSAqIGVsc2UgY291bGQgc2xvdyB0aGUgZmFuLiAgUmVzdG9yaW5nIEFVVE8gaXMgdXNlbGVzcywgYXQKLQkJICogYmVzdCB0aGF0J3MgZXhhY3RseSB3aGF0IHRoZSBEU0RUIGFscmVhZHkgc2V0IChpdCBpcyB0aGUKLQkJICogc2xvd2VyIGl0IHVzZXMpLgotCQkgKgotCQkgKiBBbHdheXMga2VlcCBpbiBtaW5kIHRoYXQgdGhlIERTRFQgKndpbGwqIGhhdmUgc2V0IHRoZQotCQkgKiBmYW5zIHRvIHdoYXQgdGhlIHZlbmRvciBzdXBwb3NlcyBpcyB0aGUgYmVzdCBsZXZlbC4gIFdlCi0JCSAqIG11Y2sgd2l0aCBpdCBvbmx5IHRvIHNwZWVkIHRoZSBmYW4gdXAuCi0JCSAqLwotCQlpZiAoZmFuX2NvbnRyb2xfcmVzdW1lX2xldmVsICE9IDcgJiYKLQkJICAgICEoZmFuX2NvbnRyb2xfcmVzdW1lX2xldmVsICYgVFBfRUNfRkFOX0ZVTExTUEVFRCkpCi0JCQlyZXR1cm47Ci0JCWVsc2UKLQkJCWRvX3NldCA9ICEoY3VycmVudF9sZXZlbCAmIFRQX0VDX0ZBTl9GVUxMU1BFRUQpICYmCi0JCQkJIChjdXJyZW50X2xldmVsICE9IGZhbl9jb250cm9sX3Jlc3VtZV9sZXZlbCk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJldHVybjsKLQl9Ci0JaWYgKGRvX3NldCkgewotCQlwcmludGsoVFBBQ1BJX05PVElDRQotCQkJInJlc3RvcmluZyBmYW4gbGV2ZWwgdG8gMHglMDJ4XG4iLAotCQkJZmFuX2NvbnRyb2xfcmVzdW1lX2xldmVsKTsKLQkJcmMgPSBmYW5fc2V0X2xldmVsX3NhZmUoZmFuX2NvbnRyb2xfcmVzdW1lX2xldmVsKTsKLQkJaWYgKHJjIDwgMCkKLQkJCXByaW50ayhUUEFDUElfTk9USUNFCi0JCQkJImZhaWxlZCB0byByZXN0b3JlIGZhbiBsZXZlbDogJWRcbiIsIHJjKTsKLQl9Ci19Ci0KLXN0YXRpYyBpbnQgZmFuX3JlYWQoY2hhciAqcCkKLXsKLQlpbnQgbGVuID0gMDsKLQlpbnQgcmM7Ci0JdTggc3RhdHVzOwotCXVuc2lnbmVkIGludCBzcGVlZCA9IDA7Ci0KLQlzd2l0Y2ggKGZhbl9zdGF0dXNfYWNjZXNzX21vZGUpIHsKLQljYXNlIFRQQUNQSV9GQU5fUkRfQUNQSV9HRkFOOgotCQkvKiA1NzAsIDYwMGUveCwgNzcwZSwgNzcweCAqLwotCQlyYyA9IGZhbl9nZXRfc3RhdHVzX3NhZmUoJnN0YXR1cyk7Ci0JCWlmIChyYyA8IDApCi0JCQlyZXR1cm4gcmM7Ci0KLQkJbGVuICs9IHNwcmludGYocCArIGxlbiwgInN0YXR1czpcdFx0JXNcbiIKLQkJCSAgICAgICAibGV2ZWw6XHRcdCVkXG4iLAotCQkJICAgICAgIChzdGF0dXMgIT0gMCkgPyAiZW5hYmxlZCIgOiAiZGlzYWJsZWQiLCBzdGF0dXMpOwotCQlicmVhazsKLQotCWNhc2UgVFBBQ1BJX0ZBTl9SRF9UUEVDOgotCQkvKiBhbGwgZXhjZXB0IDU3MCwgNjAwZS94LCA3NzBlLCA3NzB4ICovCi0JCXJjID0gZmFuX2dldF9zdGF0dXNfc2FmZSgmc3RhdHVzKTsKLQkJaWYgKHJjIDwgMCkKLQkJCXJldHVybiByYzsKLQotCQlpZiAodW5saWtlbHkodHBfZmVhdHVyZXMuZmFuX2N0cmxfc3RhdHVzX3VuZGVmKSkgewotCQkJaWYgKHN0YXR1cyAhPSBmYW5fY29udHJvbF9pbml0aWFsX3N0YXR1cykKLQkJCQl0cF9mZWF0dXJlcy5mYW5fY3RybF9zdGF0dXNfdW5kZWYgPSAwOwotCQkJZWxzZQotCQkJCS8qIFJldHVybiBtb3N0IGxpa2VseSBzdGF0dXMuIEluIGZhY3QsIGl0Ci0JCQkJICogbWlnaHQgYmUgdGhlIG9ubHkgcG9zc2libGUgc3RhdHVzICovCi0JCQkJc3RhdHVzID0gVFBfRUNfRkFOX0FVVE87Ci0JCX0KLQotCQlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAic3RhdHVzOlx0XHQlc1xuIiwKLQkJCSAgICAgICAoc3RhdHVzICE9IDApID8gImVuYWJsZWQiIDogImRpc2FibGVkIik7Ci0KLQkJcmMgPSBmYW5fZ2V0X3NwZWVkKCZzcGVlZCk7Ci0JCWlmIChyYyA8IDApCi0JCQlyZXR1cm4gcmM7Ci0KLQkJbGVuICs9IHNwcmludGYocCArIGxlbiwgInNwZWVkOlx0XHQlZFxuIiwgc3BlZWQpOwotCi0JCWlmIChzdGF0dXMgJiBUUF9FQ19GQU5fRlVMTFNQRUVEKQotCQkJLyogRGlzZW5nYWdlZCBtb2RlIHRha2VzIHByZWNlZGVuY2UgKi8KLQkJCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICJsZXZlbDpcdFx0ZGlzZW5nYWdlZFxuIik7Ci0JCWVsc2UgaWYgKHN0YXR1cyAmIFRQX0VDX0ZBTl9BVVRPKQotCQkJbGVuICs9IHNwcmludGYocCArIGxlbiwgImxldmVsOlx0XHRhdXRvXG4iKTsKLQkJZWxzZQotCQkJbGVuICs9IHNwcmludGYocCArIGxlbiwgImxldmVsOlx0XHQlZFxuIiwgc3RhdHVzKTsKLQkJYnJlYWs7Ci0KLQljYXNlIFRQQUNQSV9GQU5fTk9ORToKLQlkZWZhdWx0OgotCQlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAic3RhdHVzOlx0XHRub3Qgc3VwcG9ydGVkXG4iKTsKLQl9Ci0KLQlpZiAoZmFuX2NvbnRyb2xfY29tbWFuZHMgJiBUUEFDUElfRkFOX0NNRF9MRVZFTCkgewotCQlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAiY29tbWFuZHM6XHRsZXZlbCA8bGV2ZWw+Iik7Ci0KLQkJc3dpdGNoIChmYW5fY29udHJvbF9hY2Nlc3NfbW9kZSkgewotCQljYXNlIFRQQUNQSV9GQU5fV1JfQUNQSV9TRkFOOgotCQkJbGVuICs9IHNwcmludGYocCArIGxlbiwgIiAoPGxldmVsPiBpcyAwLTcpXG4iKTsKLQkJCWJyZWFrOwotCi0JCWRlZmF1bHQ6Ci0JCQlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAiICg8bGV2ZWw+IGlzIDAtNywgIgotCQkJCSAgICAgICAiYXV0bywgZGlzZW5nYWdlZCwgZnVsbC1zcGVlZClcbiIpOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQlpZiAoZmFuX2NvbnRyb2xfY29tbWFuZHMgJiBUUEFDUElfRkFOX0NNRF9FTkFCTEUpCi0JCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICJjb21tYW5kczpcdGVuYWJsZSwgZGlzYWJsZVxuIgotCQkJICAgICAgICJjb21tYW5kczpcdHdhdGNoZG9nIDx0aW1lb3V0PiAoPHRpbWVvdXQ+ICIKLQkJCSAgICAgICAiaXMgMCAob2ZmKSwgMS0xMjAgKHNlY29uZHMpKVxuIik7Ci0KLQlpZiAoZmFuX2NvbnRyb2xfY29tbWFuZHMgJiBUUEFDUElfRkFOX0NNRF9TUEVFRCkKLQkJbGVuICs9IHNwcmludGYocCArIGxlbiwgImNvbW1hbmRzOlx0c3BlZWQgPHNwZWVkPiIKLQkJCSAgICAgICAiICg8c3BlZWQ+IGlzIDAtNjU1MzUpXG4iKTsKLQotCXJldHVybiBsZW47Ci19Ci0KLXN0YXRpYyBpbnQgZmFuX3dyaXRlX2NtZF9sZXZlbChjb25zdCBjaGFyICpjbWQsIGludCAqcmMpCi17Ci0JaW50IGxldmVsOwotCi0JaWYgKHN0cmxlbmNtcChjbWQsICJsZXZlbCBhdXRvIikgPT0gMCkKLQkJbGV2ZWwgPSBUUF9FQ19GQU5fQVVUTzsKLQllbHNlIGlmICgoc3RybGVuY21wKGNtZCwgImxldmVsIGRpc2VuZ2FnZWQiKSA9PSAwKSB8Ci0JCQkoc3RybGVuY21wKGNtZCwgImxldmVsIGZ1bGwtc3BlZWQiKSA9PSAwKSkKLQkJbGV2ZWwgPSBUUF9FQ19GQU5fRlVMTFNQRUVEOwotCWVsc2UgaWYgKHNzY2FuZihjbWQsICJsZXZlbCAlZCIsICZsZXZlbCkgIT0gMSkKLQkJcmV0dXJuIDA7Ci0KLQkqcmMgPSBmYW5fc2V0X2xldmVsX3NhZmUobGV2ZWwpOwotCWlmICgqcmMgPT0gLUVOWElPKQotCQlwcmludGsoVFBBQ1BJX0VSUiAibGV2ZWwgY29tbWFuZCBhY2NlcHRlZCBmb3IgdW5zdXBwb3J0ZWQgIgotCQkgICAgICAgImFjY2VzcyBtb2RlICVkIiwgZmFuX2NvbnRyb2xfYWNjZXNzX21vZGUpOwotCi0JcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbnQgZmFuX3dyaXRlX2NtZF9lbmFibGUoY29uc3QgY2hhciAqY21kLCBpbnQgKnJjKQotewotCWlmIChzdHJsZW5jbXAoY21kLCAiZW5hYmxlIikgIT0gMCkKLQkJcmV0dXJuIDA7Ci0KLQkqcmMgPSBmYW5fc2V0X2VuYWJsZSgpOwotCWlmICgqcmMgPT0gLUVOWElPKQotCQlwcmludGsoVFBBQ1BJX0VSUiAiZW5hYmxlIGNvbW1hbmQgYWNjZXB0ZWQgZm9yIHVuc3VwcG9ydGVkICIKLQkJICAgICAgICJhY2Nlc3MgbW9kZSAlZCIsIGZhbl9jb250cm9sX2FjY2Vzc19tb2RlKTsKLQotCXJldHVybiAxOwotfQotCi1zdGF0aWMgaW50IGZhbl93cml0ZV9jbWRfZGlzYWJsZShjb25zdCBjaGFyICpjbWQsIGludCAqcmMpCi17Ci0JaWYgKHN0cmxlbmNtcChjbWQsICJkaXNhYmxlIikgIT0gMCkKLQkJcmV0dXJuIDA7Ci0KLQkqcmMgPSBmYW5fc2V0X2Rpc2FibGUoKTsKLQlpZiAoKnJjID09IC1FTlhJTykKLQkJcHJpbnRrKFRQQUNQSV9FUlIgImRpc2FibGUgY29tbWFuZCBhY2NlcHRlZCBmb3IgdW5zdXBwb3J0ZWQgIgotCQkgICAgICAgImFjY2VzcyBtb2RlICVkIiwgZmFuX2NvbnRyb2xfYWNjZXNzX21vZGUpOwotCi0JcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbnQgZmFuX3dyaXRlX2NtZF9zcGVlZChjb25zdCBjaGFyICpjbWQsIGludCAqcmMpCi17Ci0JaW50IHNwZWVkOwotCi0JLyogVE9ETzoKLQkgKiBTdXBwb3J0IHNwZWVkIDxsb3c+IDxtZWRpdW0+IDxoaWdoPiA/ICovCi0KLQlpZiAoc3NjYW5mKGNtZCwgInNwZWVkICVkIiwgJnNwZWVkKSAhPSAxKQotCQlyZXR1cm4gMDsKLQotCSpyYyA9IGZhbl9zZXRfc3BlZWQoc3BlZWQpOwotCWlmICgqcmMgPT0gLUVOWElPKQotCQlwcmludGsoVFBBQ1BJX0VSUiAic3BlZWQgY29tbWFuZCBhY2NlcHRlZCBmb3IgdW5zdXBwb3J0ZWQgIgotCQkgICAgICAgImFjY2VzcyBtb2RlICVkIiwgZmFuX2NvbnRyb2xfYWNjZXNzX21vZGUpOwotCi0JcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbnQgZmFuX3dyaXRlX2NtZF93YXRjaGRvZyhjb25zdCBjaGFyICpjbWQsIGludCAqcmMpCi17Ci0JaW50IGludGVydmFsOwotCi0JaWYgKHNzY2FuZihjbWQsICJ3YXRjaGRvZyAlZCIsICZpbnRlcnZhbCkgIT0gMSkKLQkJcmV0dXJuIDA7Ci0KLQlpZiAoaW50ZXJ2YWwgPCAwIHx8IGludGVydmFsID4gMTIwKQotCQkqcmMgPSAtRUlOVkFMOwotCWVsc2UKLQkJZmFuX3dhdGNoZG9nX21heGludGVydmFsID0gaW50ZXJ2YWw7Ci0KLQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIGludCBmYW5fd3JpdGUoY2hhciAqYnVmKQotewotCWNoYXIgKmNtZDsKLQlpbnQgcmMgPSAwOwotCi0Jd2hpbGUgKCFyYyAmJiAoY21kID0gbmV4dF9jbWQoJmJ1ZikpKSB7Ci0JCWlmICghKChmYW5fY29udHJvbF9jb21tYW5kcyAmIFRQQUNQSV9GQU5fQ01EX0xFVkVMKSAmJgotCQkgICAgICBmYW5fd3JpdGVfY21kX2xldmVsKGNtZCwgJnJjKSkgJiYKLQkJICAgICEoKGZhbl9jb250cm9sX2NvbW1hbmRzICYgVFBBQ1BJX0ZBTl9DTURfRU5BQkxFKSAmJgotCQkgICAgICAoZmFuX3dyaXRlX2NtZF9lbmFibGUoY21kLCAmcmMpIHx8Ci0JCSAgICAgICBmYW5fd3JpdGVfY21kX2Rpc2FibGUoY21kLCAmcmMpIHx8Ci0JCSAgICAgICBmYW5fd3JpdGVfY21kX3dhdGNoZG9nKGNtZCwgJnJjKSkpICYmCi0JCSAgICAhKChmYW5fY29udHJvbF9jb21tYW5kcyAmIFRQQUNQSV9GQU5fQ01EX1NQRUVEKSAmJgotCQkgICAgICBmYW5fd3JpdGVfY21kX3NwZWVkKGNtZCwgJnJjKSkKLQkJICAgICkKLQkJCXJjID0gLUVJTlZBTDsKLQkJZWxzZSBpZiAoIXJjKQotCQkJZmFuX3dhdGNoZG9nX3Jlc2V0KCk7Ci0JfQotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgc3RydWN0IGlibV9zdHJ1Y3QgZmFuX2RyaXZlcl9kYXRhID0gewotCS5uYW1lID0gImZhbiIsCi0JLnJlYWQgPSBmYW5fcmVhZCwKLQkud3JpdGUgPSBmYW5fd3JpdGUsCi0JLmV4aXQgPSBmYW5fZXhpdCwKLQkuc3VzcGVuZCA9IGZhbl9zdXNwZW5kLAotCS5yZXN1bWUgPSBmYW5fcmVzdW1lLAotfTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogSW5mcmFzdHJ1Y3R1cmUKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIHN5c2ZzIG5hbWUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotc3RhdGljIHNzaXplX3QgdGhpbmtwYWRfYWNwaV9wZGV2X25hbWVfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCSAgIGNoYXIgKmJ1ZikKLXsKLQlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlc1xuIiwgVFBBQ1BJX05BTUUpOwotfQotCi1zdGF0aWMgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgZGV2X2F0dHJfdGhpbmtwYWRfYWNwaV9wZGV2X25hbWUgPQotCV9fQVRUUihuYW1lLCBTX0lSVUdPLCB0aGlua3BhZF9hY3BpX3BkZXZfbmFtZV9zaG93LCBOVUxMKTsKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLS8qIC9wcm9jIHN1cHBvcnQgKi8KLXN0YXRpYyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnByb2NfZGlyOwotCi0vKgotICogTW9kdWxlIGFuZCBpbmZyYXN0cnVjdHVyZSBwcm9ibGUsIGluaXQgYW5kIGV4aXQgaGFuZGxpbmcKLSAqLwotCi1zdGF0aWMgaW50IGZvcmNlX2xvYWQ7Ci0KLSNpZmRlZiBDT05GSUdfVEhJTktQQURfQUNQSV9ERUJVRwotc3RhdGljIGNvbnN0IGNoYXIgKiBfX2luaXQgc3RyX3N1cHBvcnRlZChpbnQgaXNfc3VwcG9ydGVkKQotewotCXN0YXRpYyBjaGFyIHRleHRfdW5zdXBwb3J0ZWRbXSBfX2luaXRkYXRhID0gIm5vdCBzdXBwb3J0ZWQiOwotCi0JcmV0dXJuIChpc19zdXBwb3J0ZWQpPyAmdGV4dF91bnN1cHBvcnRlZFs0XSA6ICZ0ZXh0X3Vuc3VwcG9ydGVkWzBdOwotfQotI2VuZGlmIC8qIENPTkZJR19USElOS1BBRF9BQ1BJX0RFQlVHICovCi0KLXN0YXRpYyB2b2lkIGlibV9leGl0KHN0cnVjdCBpYm1fc3RydWN0ICppYm0pCi17Ci0JZGJnX3ByaW50ayhUUEFDUElfREJHX0VYSVQsICJyZW1vdmluZyAlc1xuIiwgaWJtLT5uYW1lKTsKLQotCWxpc3RfZGVsX2luaXQoJmlibS0+YWxsX2RyaXZlcnMpOwotCi0JaWYgKGlibS0+ZmxhZ3MuYWNwaV9ub3RpZnlfaW5zdGFsbGVkKSB7Ci0JCWRiZ19wcmludGsoVFBBQ1BJX0RCR19FWElULAotCQkJIiVzOiBhY3BpX3JlbW92ZV9ub3RpZnlfaGFuZGxlclxuIiwgaWJtLT5uYW1lKTsKLQkJQlVHX09OKCFpYm0tPmFjcGkpOwotCQlhY3BpX3JlbW92ZV9ub3RpZnlfaGFuZGxlcigqaWJtLT5hY3BpLT5oYW5kbGUsCi0JCQkJCSAgIGlibS0+YWNwaS0+dHlwZSwKLQkJCQkJICAgZGlzcGF0Y2hfYWNwaV9ub3RpZnkpOwotCQlpYm0tPmZsYWdzLmFjcGlfbm90aWZ5X2luc3RhbGxlZCA9IDA7Ci0JCWlibS0+ZmxhZ3MuYWNwaV9ub3RpZnlfaW5zdGFsbGVkID0gMDsKLQl9Ci0KLQlpZiAoaWJtLT5mbGFncy5wcm9jX2NyZWF0ZWQpIHsKLQkJZGJnX3ByaW50ayhUUEFDUElfREJHX0VYSVQsCi0JCQkiJXM6IHJlbW92ZV9wcm9jX2VudHJ5XG4iLCBpYm0tPm5hbWUpOwotCQlyZW1vdmVfcHJvY19lbnRyeShpYm0tPm5hbWUsIHByb2NfZGlyKTsKLQkJaWJtLT5mbGFncy5wcm9jX2NyZWF0ZWQgPSAwOwotCX0KLQotCWlmIChpYm0tPmZsYWdzLmFjcGlfZHJpdmVyX3JlZ2lzdGVyZWQpIHsKLQkJZGJnX3ByaW50ayhUUEFDUElfREJHX0VYSVQsCi0JCQkiJXM6IGFjcGlfYnVzX3VucmVnaXN0ZXJfZHJpdmVyXG4iLCBpYm0tPm5hbWUpOwotCQlCVUdfT04oIWlibS0+YWNwaSk7Ci0JCWFjcGlfYnVzX3VucmVnaXN0ZXJfZHJpdmVyKGlibS0+YWNwaS0+ZHJpdmVyKTsKLQkJa2ZyZWUoaWJtLT5hY3BpLT5kcml2ZXIpOwotCQlpYm0tPmFjcGktPmRyaXZlciA9IE5VTEw7Ci0JCWlibS0+ZmxhZ3MuYWNwaV9kcml2ZXJfcmVnaXN0ZXJlZCA9IDA7Ci0JfQotCi0JaWYgKGlibS0+ZmxhZ3MuaW5pdF9jYWxsZWQgJiYgaWJtLT5leGl0KSB7Ci0JCWlibS0+ZXhpdCgpOwotCQlpYm0tPmZsYWdzLmluaXRfY2FsbGVkID0gMDsKLQl9Ci0KLQlkYmdfcHJpbnRrKFRQQUNQSV9EQkdfSU5JVCwgImZpbmlzaGVkIHJlbW92aW5nICVzXG4iLCBpYm0tPm5hbWUpOwotfQotCi1zdGF0aWMgaW50IF9faW5pdCBpYm1faW5pdChzdHJ1Y3QgaWJtX2luaXRfc3RydWN0ICppaWJtKQotewotCWludCByZXQ7Ci0Jc3RydWN0IGlibV9zdHJ1Y3QgKmlibSA9IGlpYm0tPmRhdGE7Ci0Jc3RydWN0IHByb2NfZGlyX2VudHJ5ICplbnRyeTsKLQotCUJVR19PTihpYm0gPT0gTlVMTCk7Ci0KLQlJTklUX0xJU1RfSEVBRCgmaWJtLT5hbGxfZHJpdmVycyk7Ci0KLQlpZiAoaWJtLT5mbGFncy5leHBlcmltZW50YWwgJiYgIWV4cGVyaW1lbnRhbCkKLQkJcmV0dXJuIDA7Ci0KLQlkYmdfcHJpbnRrKFRQQUNQSV9EQkdfSU5JVCwKLQkJInByb2JpbmcgZm9yICVzXG4iLCBpYm0tPm5hbWUpOwotCi0JaWYgKGlpYm0tPmluaXQpIHsKLQkJcmV0ID0gaWlibS0+aW5pdChpaWJtKTsKLQkJaWYgKHJldCA+IDApCi0JCQlyZXR1cm4gMDsJLyogcHJvYmUgZmFpbGVkICovCi0JCWlmIChyZXQpCi0JCQlyZXR1cm4gcmV0OwotCi0JCWlibS0+ZmxhZ3MuaW5pdF9jYWxsZWQgPSAxOwotCX0KLQotCWlmIChpYm0tPmFjcGkpIHsKLQkJaWYgKGlibS0+YWNwaS0+aGlkKSB7Ci0JCQlyZXQgPSByZWdpc3Rlcl90cGFjcGlfc3ViZHJpdmVyKGlibSk7Ci0JCQlpZiAocmV0KQotCQkJCWdvdG8gZXJyX291dDsKLQkJfQotCi0JCWlmIChpYm0tPmFjcGktPm5vdGlmeSkgewotCQkJcmV0ID0gc2V0dXBfYWNwaV9ub3RpZnkoaWJtKTsKLQkJCWlmIChyZXQgPT0gLUVOT0RFVikgewotCQkJCXByaW50ayhUUEFDUElfTk9USUNFICJkaXNhYmxpbmcgc3ViZHJpdmVyICVzXG4iLAotCQkJCQlpYm0tPm5hbWUpOwotCQkJCXJldCA9IDA7Ci0JCQkJZ290byBlcnJfb3V0OwotCQkJfQotCQkJaWYgKHJldCA8IDApCi0JCQkJZ290byBlcnJfb3V0OwotCQl9Ci0JfQotCi0JZGJnX3ByaW50ayhUUEFDUElfREJHX0lOSVQsCi0JCSIlcyBpbnN0YWxsZWRcbiIsIGlibS0+bmFtZSk7Ci0KLQlpZiAoaWJtLT5yZWFkKSB7Ci0JCWVudHJ5ID0gY3JlYXRlX3Byb2NfZW50cnkoaWJtLT5uYW1lLAotCQkJCQkgIFNfSUZSRUcgfCBTX0lSVUdPIHwgU19JV1VTUiwKLQkJCQkJICBwcm9jX2Rpcik7Ci0JCWlmICghZW50cnkpIHsKLQkJCXByaW50ayhUUEFDUElfRVJSICJ1bmFibGUgdG8gY3JlYXRlIHByb2MgZW50cnkgJXNcbiIsCi0JCQkgICAgICAgaWJtLT5uYW1lKTsKLQkJCXJldCA9IC1FTk9ERVY7Ci0JCQlnb3RvIGVycl9vdXQ7Ci0JCX0KLQkJZW50cnktPm93bmVyID0gVEhJU19NT0RVTEU7Ci0JCWVudHJ5LT5kYXRhID0gaWJtOwotCQllbnRyeS0+cmVhZF9wcm9jID0gJmRpc3BhdGNoX3Byb2Nmc19yZWFkOwotCQlpZiAoaWJtLT53cml0ZSkKLQkJCWVudHJ5LT53cml0ZV9wcm9jID0gJmRpc3BhdGNoX3Byb2Nmc193cml0ZTsKLQkJaWJtLT5mbGFncy5wcm9jX2NyZWF0ZWQgPSAxOwotCX0KLQotCWxpc3RfYWRkX3RhaWwoJmlibS0+YWxsX2RyaXZlcnMsICZ0cGFjcGlfYWxsX2RyaXZlcnMpOwotCi0JcmV0dXJuIDA7Ci0KLWVycl9vdXQ6Ci0JZGJnX3ByaW50ayhUUEFDUElfREJHX0lOSVQsCi0JCSIlczogYXQgZXJyb3IgZXhpdCBwYXRoIHdpdGggcmVzdWx0ICVkXG4iLAotCQlpYm0tPm5hbWUsIHJldCk7Ci0KLQlpYm1fZXhpdChpYm0pOwotCXJldHVybiAocmV0IDwgMCk/IHJldCA6IDA7Ci19Ci0KLS8qIFByb2JpbmcgKi8KLQotLyogcmV0dXJucyAwIC0gcHJvYmUgb2ssIG9yIDwgMCAtIHByb2JlIGVycm9yLgotICogUHJvYmUgb2sgZG9lc24ndCBtZWFuIHRoaW5rcGFkIGZvdW5kLgotICogT24gZXJyb3IsIGtmcmVlKCkgY2xlYW51cCBvbiB0cC0+KiBpcyBub3QgcGVyZm9ybWVkLCBjYWxsZXIgbXVzdCBkbyBpdCAqLwotc3RhdGljIGludCBfX211c3RfY2hlY2sgX19pbml0IGdldF90aGlua3BhZF9tb2RlbF9kYXRhKAotCQkJCQkJc3RydWN0IHRoaW5rcGFkX2lkX2RhdGEgKnRwKQotewotCWNvbnN0IHN0cnVjdCBkbWlfZGV2aWNlICpkZXYgPSBOVUxMOwotCWNoYXIgZWNfZndfc3RyaW5nWzE4XTsKLQljaGFyIGNvbnN0ICpzOwotCi0JaWYgKCF0cCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQltZW1zZXQodHAsIDAsIHNpemVvZigqdHApKTsKLQotCWlmIChkbWlfbmFtZV9pbl92ZW5kb3JzKCJJQk0iKSkKLQkJdHAtPnZlbmRvciA9IFBDSV9WRU5ET1JfSURfSUJNOwotCWVsc2UgaWYgKGRtaV9uYW1lX2luX3ZlbmRvcnMoIkxFTk9WTyIpKQotCQl0cC0+dmVuZG9yID0gUENJX1ZFTkRPUl9JRF9MRU5PVk87Ci0JZWxzZQotCQlyZXR1cm4gMDsKLQotCXMgPSBkbWlfZ2V0X3N5c3RlbV9pbmZvKERNSV9CSU9TX1ZFUlNJT04pOwotCXRwLT5iaW9zX3ZlcnNpb25fc3RyID0ga3N0cmR1cChzLCBHRlBfS0VSTkVMKTsKLQlpZiAocyAmJiAhdHAtPmJpb3NfdmVyc2lvbl9zdHIpCi0JCXJldHVybiAtRU5PTUVNOwotCWlmICghdHAtPmJpb3NfdmVyc2lvbl9zdHIpCi0JCXJldHVybiAwOwotCXRwLT5iaW9zX21vZGVsID0gdHAtPmJpb3NfdmVyc2lvbl9zdHJbMF0KLQkJCSB8ICh0cC0+Ymlvc192ZXJzaW9uX3N0clsxXSA8PCA4KTsKLQotCS8qCi0JICogVGhpbmtQYWQgVDIzIG9yIG5ld2VyLCBBMzEgb3IgbmV3ZXIsIFI1MGUgb3IgbmV3ZXIsCi0JICogWDMyIG9yIG5ld2VyLCBhbGwgWiBzZXJpZXM7ICBTb21lIG1vZGVscyBtdXN0IGhhdmUgYW4KLQkgKiB1cC10by1kYXRlIEJJT1Mgb3IgdGhleSB3aWxsIG5vdCBiZSBkZXRlY3RlZC4KLQkgKgotCSAqIFNlZSBodHRwOi8vdGhpbmt3aWtpLm9yZy93aWtpL0xpc3Rfb2ZfRE1JX0lEcwotCSAqLwotCXdoaWxlICgoZGV2ID0gZG1pX2ZpbmRfZGV2aWNlKERNSV9ERVZfVFlQRV9PRU1fU1RSSU5HLCBOVUxMLCBkZXYpKSkgewotCQlpZiAoc3NjYW5mKGRldi0+bmFtZSwKLQkJCSAgICJJQk0gVGhpbmtQYWQgRW1iZWRkZWQgQ29udHJvbGxlciAtWyUxN2MiLAotCQkJICAgZWNfZndfc3RyaW5nKSA9PSAxKSB7Ci0JCQllY19md19zdHJpbmdbc2l6ZW9mKGVjX2Z3X3N0cmluZykgLSAxXSA9IDA7Ci0JCQllY19md19zdHJpbmdbc3RyY3NwbihlY19md19zdHJpbmcsICIgXSIpXSA9IDA7Ci0KLQkJCXRwLT5lY192ZXJzaW9uX3N0ciA9IGtzdHJkdXAoZWNfZndfc3RyaW5nLCBHRlBfS0VSTkVMKTsKLQkJCWlmICghdHAtPmVjX3ZlcnNpb25fc3RyKQotCQkJCXJldHVybiAtRU5PTUVNOwotCQkJdHAtPmVjX21vZGVsID0gZWNfZndfc3RyaW5nWzBdCi0JCQkJCXwgKGVjX2Z3X3N0cmluZ1sxXSA8PCA4KTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JcyA9IGRtaV9nZXRfc3lzdGVtX2luZm8oRE1JX1BST0RVQ1RfVkVSU0lPTik7Ci0JaWYgKHMgJiYgIXN0cm5pY21wKHMsICJUaGlua1BhZCIsIDgpKSB7Ci0JCXRwLT5tb2RlbF9zdHIgPSBrc3RyZHVwKHMsIEdGUF9LRVJORUwpOwotCQlpZiAoIXRwLT5tb2RlbF9zdHIpCi0JCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQlzID0gZG1pX2dldF9zeXN0ZW1faW5mbyhETUlfUFJPRFVDVF9OQU1FKTsKLQl0cC0+bnVtbW9kZWxfc3RyID0ga3N0cmR1cChzLCBHRlBfS0VSTkVMKTsKLQlpZiAocyAmJiAhdHAtPm51bW1vZGVsX3N0cikKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBfX2luaXQgcHJvYmVfZm9yX3RoaW5rcGFkKHZvaWQpCi17Ci0JaW50IGlzX3RoaW5rcGFkOwotCi0JaWYgKGFjcGlfZGlzYWJsZWQpCi0JCXJldHVybiAtRU5PREVWOwotCi0JLyoKLQkgKiBOb24tYW5jaWVudCBtb2RlbHMgaGF2ZSBiZXR0ZXIgRE1JIHRhZ2dpbmcsIGJ1dCB2ZXJ5IG9sZCBtb2RlbHMKLQkgKiBkb24ndC4KLQkgKi8KLQlpc190aGlua3BhZCA9ICh0aGlua3BhZF9pZC5tb2RlbF9zdHIgIT0gTlVMTCk7Ci0KLQkvKiBlYyBpcyByZXF1aXJlZCBiZWNhdXNlIG1hbnkgb3RoZXIgaGFuZGxlcyBhcmUgcmVsYXRpdmUgdG8gaXQgKi8KLQlUUEFDUElfQUNQSUhBTkRMRV9JTklUKGVjKTsKLQlpZiAoIWVjX2hhbmRsZSkgewotCQlpZiAoaXNfdGhpbmtwYWQpCi0JCQlwcmludGsoVFBBQ1BJX0VSUgotCQkJCSJOb3QgeWV0IHN1cHBvcnRlZCBUaGlua1BhZCBkZXRlY3RlZCFcbiIpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0KLQkvKgotCSAqIFJpc2tzIGEgcmVncmVzc2lvbiBvbiB2ZXJ5IG9sZCBtYWNoaW5lcywgYnV0IHJlZHVjZXMgcG90ZW50aWFsCi0JICogZmFsc2UgcG9zaXRpdmVzIGEgZGFtbiBncmVhdCBkZWFsCi0JICovCi0JaWYgKCFpc190aGlua3BhZCkKLQkJaXNfdGhpbmtwYWQgPSAodGhpbmtwYWRfaWQudmVuZG9yID09IFBDSV9WRU5ET1JfSURfSUJNKTsKLQotCWlmICghaXNfdGhpbmtwYWQgJiYgIWZvcmNlX2xvYWQpCi0JCXJldHVybiAtRU5PREVWOwotCi0JcmV0dXJuIDA7Ci19Ci0KLQotLyogTW9kdWxlIGluaXQsIGV4aXQsIHBhcmFtZXRlcnMgKi8KLQotc3RhdGljIHN0cnVjdCBpYm1faW5pdF9zdHJ1Y3QgaWJtc19pbml0W10gX19pbml0ZGF0YSA9IHsKLQl7Ci0JCS5pbml0ID0gdGhpbmtwYWRfYWNwaV9kcml2ZXJfaW5pdCwKLQkJLmRhdGEgPSAmdGhpbmtwYWRfYWNwaV9kcml2ZXJfZGF0YSwKLQl9LAotCXsKLQkJLmluaXQgPSBob3RrZXlfaW5pdCwKLQkJLmRhdGEgPSAmaG90a2V5X2RyaXZlcl9kYXRhLAotCX0sCi0JewotCQkuaW5pdCA9IGJsdWV0b290aF9pbml0LAotCQkuZGF0YSA9ICZibHVldG9vdGhfZHJpdmVyX2RhdGEsCi0JfSwKLQl7Ci0JCS5pbml0ID0gd2FuX2luaXQsCi0JCS5kYXRhID0gJndhbl9kcml2ZXJfZGF0YSwKLQl9LAotI2lmZGVmIENPTkZJR19USElOS1BBRF9BQ1BJX1ZJREVPCi0JewotCQkuaW5pdCA9IHZpZGVvX2luaXQsCi0JCS5kYXRhID0gJnZpZGVvX2RyaXZlcl9kYXRhLAotCX0sCi0jZW5kaWYKLQl7Ci0JCS5pbml0ID0gbGlnaHRfaW5pdCwKLQkJLmRhdGEgPSAmbGlnaHRfZHJpdmVyX2RhdGEsCi0JfSwKLSNpZmRlZiBDT05GSUdfVEhJTktQQURfQUNQSV9ET0NLCi0JewotCQkuaW5pdCA9IGRvY2tfaW5pdCwKLQkJLmRhdGEgPSAmZG9ja19kcml2ZXJfZGF0YVswXSwKLQl9LAotCXsKLQkJLmluaXQgPSBkb2NrX2luaXQyLAotCQkuZGF0YSA9ICZkb2NrX2RyaXZlcl9kYXRhWzFdLAotCX0sCi0jZW5kaWYKLSNpZmRlZiBDT05GSUdfVEhJTktQQURfQUNQSV9CQVkKLQl7Ci0JCS5pbml0ID0gYmF5X2luaXQsCi0JCS5kYXRhID0gJmJheV9kcml2ZXJfZGF0YSwKLQl9LAotI2VuZGlmCi0JewotCQkuaW5pdCA9IGNtb3NfaW5pdCwKLQkJLmRhdGEgPSAmY21vc19kcml2ZXJfZGF0YSwKLQl9LAotCXsKLQkJLmluaXQgPSBsZWRfaW5pdCwKLQkJLmRhdGEgPSAmbGVkX2RyaXZlcl9kYXRhLAotCX0sCi0JewotCQkuaW5pdCA9IGJlZXBfaW5pdCwKLQkJLmRhdGEgPSAmYmVlcF9kcml2ZXJfZGF0YSwKLQl9LAotCXsKLQkJLmluaXQgPSB0aGVybWFsX2luaXQsCi0JCS5kYXRhID0gJnRoZXJtYWxfZHJpdmVyX2RhdGEsCi0JfSwKLQl7Ci0JCS5kYXRhID0gJmVjZHVtcF9kcml2ZXJfZGF0YSwKLQl9LAotCXsKLQkJLmluaXQgPSBicmlnaHRuZXNzX2luaXQsCi0JCS5kYXRhID0gJmJyaWdodG5lc3NfZHJpdmVyX2RhdGEsCi0JfSwKLQl7Ci0JCS5kYXRhID0gJnZvbHVtZV9kcml2ZXJfZGF0YSwKLQl9LAotCXsKLQkJLmluaXQgPSBmYW5faW5pdCwKLQkJLmRhdGEgPSAmZmFuX2RyaXZlcl9kYXRhLAotCX0sCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBzZXRfaWJtX3BhcmFtKGNvbnN0IGNoYXIgKnZhbCwgc3RydWN0IGtlcm5lbF9wYXJhbSAqa3ApCi17Ci0JdW5zaWduZWQgaW50IGk7Ci0Jc3RydWN0IGlibV9zdHJ1Y3QgKmlibTsKLQotCWlmICgha3AgfHwgIWtwLT5uYW1lIHx8ICF2YWwpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoaWJtc19pbml0KTsgaSsrKSB7Ci0JCWlibSA9IGlibXNfaW5pdFtpXS5kYXRhOwotCQlXQVJOX09OKGlibSA9PSBOVUxMKTsKLQotCQlpZiAoIWlibSB8fCAhaWJtLT5uYW1lKQotCQkJY29udGludWU7Ci0KLQkJaWYgKHN0cmNtcChpYm0tPm5hbWUsIGtwLT5uYW1lKSA9PSAwICYmIGlibS0+d3JpdGUpIHsKLQkJCWlmIChzdHJsZW4odmFsKSA+IHNpemVvZihpYm1zX2luaXRbaV0ucGFyYW0pIC0gMikKLQkJCQlyZXR1cm4gLUVOT1NQQzsKLQkJCXN0cmNweShpYm1zX2luaXRbaV0ucGFyYW0sIHZhbCk7Ci0JCQlzdHJjYXQoaWJtc19pbml0W2ldLnBhcmFtLCAiLCIpOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gLUVJTlZBTDsKLX0KLQotbW9kdWxlX3BhcmFtKGV4cGVyaW1lbnRhbCwgaW50LCAwKTsKLU1PRFVMRV9QQVJNX0RFU0MoZXhwZXJpbWVudGFsLAotCQkgIkVuYWJsZXMgZXhwZXJpbWVudGFsIGZlYXR1cmVzIHdoZW4gbm9uLXplcm8iKTsKLQotbW9kdWxlX3BhcmFtX25hbWVkKGRlYnVnLCBkYmdfbGV2ZWwsIHVpbnQsIDApOwotTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgIlNldHMgZGVidWcgbGV2ZWwgYml0LW1hc2siKTsKLQotbW9kdWxlX3BhcmFtKGZvcmNlX2xvYWQsIGJvb2wsIDApOwotTU9EVUxFX1BBUk1fREVTQyhmb3JjZV9sb2FkLAotCQkgIkF0dGVtcHRzIHRvIGxvYWQgdGhlIGRyaXZlciBldmVuIG9uIGEgIgotCQkgIm1pcy1pZGVudGlmaWVkIFRoaW5rUGFkIHdoZW4gdHJ1ZSIpOwotCi1tb2R1bGVfcGFyYW1fbmFtZWQoZmFuX2NvbnRyb2wsIGZhbl9jb250cm9sX2FsbG93ZWQsIGJvb2wsIDApOwotTU9EVUxFX1BBUk1fREVTQyhmYW5fY29udHJvbCwKLQkJICJFbmFibGVzIHNldHRpbmcgZmFuIHBhcmFtZXRlcnMgZmVhdHVyZXMgd2hlbiB0cnVlIik7Ci0KLW1vZHVsZV9wYXJhbV9uYW1lZChicmlnaHRuZXNzX21vZGUsIGJyaWdodG5lc3NfbW9kZSwgaW50LCAwKTsKLU1PRFVMRV9QQVJNX0RFU0MoYnJpZ2h0bmVzc19tb2RlLAotCQkgIlNlbGVjdHMgYnJpZ2h0bmVzcyBjb250cm9sIHN0cmF0ZWd5OiAiCi0JCSAiMD1hdXRvLCAxPUVDLCAyPUNNT1MsIDM9Ym90aCIpOwotCi1tb2R1bGVfcGFyYW0oYnJpZ2h0bmVzc19lbmFibGUsIHVpbnQsIDApOwotTU9EVUxFX1BBUk1fREVTQyhicmlnaHRuZXNzX2VuYWJsZSwKLQkJICJFbmFibGVzIGJhY2tsaWdodCBjb250cm9sIHdoZW4gMSwgZGlzYWJsZXMgd2hlbiAwIik7Ci0KLW1vZHVsZV9wYXJhbShob3RrZXlfcmVwb3J0X21vZGUsIHVpbnQsIDApOwotTU9EVUxFX1BBUk1fREVTQyhob3RrZXlfcmVwb3J0X21vZGUsCi0JCSAidXNlZCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgd2l0aCB1c2Vyc3BhY2UsICIKLQkJICJzZWUgZG9jdW1lbnRhdGlvbiIpOwotCi0jZGVmaW5lIFRQQUNQSV9QQVJBTShmZWF0dXJlKSBcCi0JbW9kdWxlX3BhcmFtX2NhbGwoZmVhdHVyZSwgc2V0X2libV9wYXJhbSwgTlVMTCwgTlVMTCwgMCk7IFwKLQlNT0RVTEVfUEFSTV9ERVNDKGZlYXR1cmUsICJTaW11bGF0ZXMgdGhpbmtwYWQtYWNwaSBwcm9jZnMgY29tbWFuZCAiIFwKLQkJCSAiYXQgbW9kdWxlIGxvYWQsIHNlZSBkb2N1bWVudGF0aW9uIikKLQotVFBBQ1BJX1BBUkFNKGhvdGtleSk7Ci1UUEFDUElfUEFSQU0oYmx1ZXRvb3RoKTsKLVRQQUNQSV9QQVJBTSh2aWRlbyk7Ci1UUEFDUElfUEFSQU0obGlnaHQpOwotI2lmZGVmIENPTkZJR19USElOS1BBRF9BQ1BJX0RPQ0sKLVRQQUNQSV9QQVJBTShkb2NrKTsKLSNlbmRpZgotI2lmZGVmIENPTkZJR19USElOS1BBRF9BQ1BJX0JBWQotVFBBQ1BJX1BBUkFNKGJheSk7Ci0jZW5kaWYgLyogQ09ORklHX1RISU5LUEFEX0FDUElfQkFZICovCi1UUEFDUElfUEFSQU0oY21vcyk7Ci1UUEFDUElfUEFSQU0obGVkKTsKLVRQQUNQSV9QQVJBTShiZWVwKTsKLVRQQUNQSV9QQVJBTShlY2R1bXApOwotVFBBQ1BJX1BBUkFNKGJyaWdodG5lc3MpOwotVFBBQ1BJX1BBUkFNKHZvbHVtZSk7Ci1UUEFDUElfUEFSQU0oZmFuKTsKLQotc3RhdGljIHZvaWQgdGhpbmtwYWRfYWNwaV9tb2R1bGVfZXhpdCh2b2lkKQotewotCXN0cnVjdCBpYm1fc3RydWN0ICppYm0sICppdG1wOwotCi0JdHBhY3BpX2xpZmVjeWNsZSA9IFRQQUNQSV9MSUZFX0VYSVRJTkc7Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmVfcmV2ZXJzZShpYm0sIGl0bXAsCi0JCQkJCSAmdHBhY3BpX2FsbF9kcml2ZXJzLAotCQkJCQkgYWxsX2RyaXZlcnMpIHsKLQkJaWJtX2V4aXQoaWJtKTsKLQl9Ci0KLQlkYmdfcHJpbnRrKFRQQUNQSV9EQkdfSU5JVCwgImZpbmlzaGVkIHN1YmRyaXZlciBleGl0IHBhdGguLi5cbiIpOwotCi0JaWYgKHRwYWNwaV9pbnB1dGRldikgewotCQlpZiAodHBfZmVhdHVyZXMuaW5wdXRfZGV2aWNlX3JlZ2lzdGVyZWQpCi0JCQlpbnB1dF91bnJlZ2lzdGVyX2RldmljZSh0cGFjcGlfaW5wdXRkZXYpOwotCQllbHNlCi0JCQlpbnB1dF9mcmVlX2RldmljZSh0cGFjcGlfaW5wdXRkZXYpOwotCX0KLQotCWlmICh0cGFjcGlfaHdtb24pCi0JCWh3bW9uX2RldmljZV91bnJlZ2lzdGVyKHRwYWNwaV9od21vbik7Ci0KLQlpZiAodHBfZmVhdHVyZXMuc2Vuc29yc19wZGV2X2F0dHJzX3JlZ2lzdGVyZWQpCi0JCWRldmljZV9yZW1vdmVfZmlsZSgmdHBhY3BpX3NlbnNvcnNfcGRldi0+ZGV2LAotCQkJCSAgICZkZXZfYXR0cl90aGlua3BhZF9hY3BpX3BkZXZfbmFtZSk7Ci0JaWYgKHRwYWNwaV9zZW5zb3JzX3BkZXYpCi0JCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKHRwYWNwaV9zZW5zb3JzX3BkZXYpOwotCWlmICh0cGFjcGlfcGRldikKLQkJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIodHBhY3BpX3BkZXYpOwotCi0JaWYgKHRwX2ZlYXR1cmVzLnNlbnNvcnNfcGRydl9hdHRyc19yZWdpc3RlcmVkKQotCQl0cGFjcGlfcmVtb3ZlX2RyaXZlcl9hdHRyaWJ1dGVzKCZ0cGFjcGlfaHdtb25fcGRyaXZlci5kcml2ZXIpOwotCWlmICh0cF9mZWF0dXJlcy5wbGF0Zm9ybV9kcnZfYXR0cnNfcmVnaXN0ZXJlZCkKLQkJdHBhY3BpX3JlbW92ZV9kcml2ZXJfYXR0cmlidXRlcygmdHBhY3BpX3Bkcml2ZXIuZHJpdmVyKTsKLQotCWlmICh0cF9mZWF0dXJlcy5zZW5zb3JzX3BkcnZfcmVnaXN0ZXJlZCkKLQkJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnRwYWNwaV9od21vbl9wZHJpdmVyKTsKLQotCWlmICh0cF9mZWF0dXJlcy5wbGF0Zm9ybV9kcnZfcmVnaXN0ZXJlZCkKLQkJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnRwYWNwaV9wZHJpdmVyKTsKLQotCWlmIChwcm9jX2RpcikKLQkJcmVtb3ZlX3Byb2NfZW50cnkoVFBBQ1BJX1BST0NfRElSLCBhY3BpX3Jvb3RfZGlyKTsKLQotCWlmICh0cGFjcGlfd3EpCi0JCWRlc3Ryb3lfd29ya3F1ZXVlKHRwYWNwaV93cSk7Ci0KLQlrZnJlZSh0aGlua3BhZF9pZC5iaW9zX3ZlcnNpb25fc3RyKTsKLQlrZnJlZSh0aGlua3BhZF9pZC5lY192ZXJzaW9uX3N0cik7Ci0Ja2ZyZWUodGhpbmtwYWRfaWQubW9kZWxfc3RyKTsKLX0KLQotCi1zdGF0aWMgaW50IF9faW5pdCB0aGlua3BhZF9hY3BpX21vZHVsZV9pbml0KHZvaWQpCi17Ci0JaW50IHJldCwgaTsKLQotCXRwYWNwaV9saWZlY3ljbGUgPSBUUEFDUElfTElGRV9JTklUOwotCi0JLyogUGFyYW1ldGVyIGNoZWNraW5nICovCi0JaWYgKGhvdGtleV9yZXBvcnRfbW9kZSA+IDIpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JLyogRHJpdmVyLWxldmVsIHByb2JlICovCi0KLQlyZXQgPSBnZXRfdGhpbmtwYWRfbW9kZWxfZGF0YSgmdGhpbmtwYWRfaWQpOwotCWlmIChyZXQpIHsKLQkJcHJpbnRrKFRQQUNQSV9FUlIKLQkJCSJ1bmFibGUgdG8gZ2V0IERNSSBkYXRhOiAlZFxuIiwgcmV0KTsKLQkJdGhpbmtwYWRfYWNwaV9tb2R1bGVfZXhpdCgpOwotCQlyZXR1cm4gcmV0OwotCX0KLQlyZXQgPSBwcm9iZV9mb3JfdGhpbmtwYWQoKTsKLQlpZiAocmV0KSB7Ci0JCXRoaW5rcGFkX2FjcGlfbW9kdWxlX2V4aXQoKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQkvKiBEcml2ZXIgaW5pdGlhbGl6YXRpb24gKi8KLQotCVRQQUNQSV9BQ1BJSEFORExFX0lOSVQoZWNyZCk7Ci0JVFBBQ1BJX0FDUElIQU5ETEVfSU5JVChlY3dyKTsKLQotCXRwYWNwaV93cSA9IGNyZWF0ZV9zaW5nbGV0aHJlYWRfd29ya3F1ZXVlKFRQQUNQSV9XT1JLUVVFVUVfTkFNRSk7Ci0JaWYgKCF0cGFjcGlfd3EpIHsKLQkJdGhpbmtwYWRfYWNwaV9tb2R1bGVfZXhpdCgpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQlwcm9jX2RpciA9IHByb2NfbWtkaXIoVFBBQ1BJX1BST0NfRElSLCBhY3BpX3Jvb3RfZGlyKTsKLQlpZiAoIXByb2NfZGlyKSB7Ci0JCXByaW50ayhUUEFDUElfRVJSCi0JCSAgICAgICAidW5hYmxlIHRvIGNyZWF0ZSBwcm9jIGRpciAiIFRQQUNQSV9QUk9DX0RJUik7Ci0JCXRoaW5rcGFkX2FjcGlfbW9kdWxlX2V4aXQoKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCXByb2NfZGlyLT5vd25lciA9IFRISVNfTU9EVUxFOwotCi0JcmV0ID0gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZ0cGFjcGlfcGRyaXZlcik7Ci0JaWYgKHJldCkgewotCQlwcmludGsoVFBBQ1BJX0VSUgotCQkgICAgICAgInVuYWJsZSB0byByZWdpc3RlciBtYWluIHBsYXRmb3JtIGRyaXZlclxuIik7Ci0JCXRoaW5rcGFkX2FjcGlfbW9kdWxlX2V4aXQoKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0JdHBfZmVhdHVyZXMucGxhdGZvcm1fZHJ2X3JlZ2lzdGVyZWQgPSAxOwotCi0JcmV0ID0gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZ0cGFjcGlfaHdtb25fcGRyaXZlcik7Ci0JaWYgKHJldCkgewotCQlwcmludGsoVFBBQ1BJX0VSUgotCQkgICAgICAgInVuYWJsZSB0byByZWdpc3RlciBod21vbiBwbGF0Zm9ybSBkcml2ZXJcbiIpOwotCQl0aGlua3BhZF9hY3BpX21vZHVsZV9leGl0KCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCXRwX2ZlYXR1cmVzLnNlbnNvcnNfcGRydl9yZWdpc3RlcmVkID0gMTsKLQotCXJldCA9IHRwYWNwaV9jcmVhdGVfZHJpdmVyX2F0dHJpYnV0ZXMoJnRwYWNwaV9wZHJpdmVyLmRyaXZlcik7Ci0JaWYgKCFyZXQpIHsKLQkJdHBfZmVhdHVyZXMucGxhdGZvcm1fZHJ2X2F0dHJzX3JlZ2lzdGVyZWQgPSAxOwotCQlyZXQgPSB0cGFjcGlfY3JlYXRlX2RyaXZlcl9hdHRyaWJ1dGVzKAotCQkJCQkmdHBhY3BpX2h3bW9uX3Bkcml2ZXIuZHJpdmVyKTsKLQl9Ci0JaWYgKHJldCkgewotCQlwcmludGsoVFBBQ1BJX0VSUgotCQkgICAgICAgInVuYWJsZSB0byBjcmVhdGUgc3lzZnMgZHJpdmVyIGF0dHJpYnV0ZXNcbiIpOwotCQl0aGlua3BhZF9hY3BpX21vZHVsZV9leGl0KCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCXRwX2ZlYXR1cmVzLnNlbnNvcnNfcGRydl9hdHRyc19yZWdpc3RlcmVkID0gMTsKLQotCi0JLyogRGV2aWNlIGluaXRpYWxpemF0aW9uICovCi0JdHBhY3BpX3BkZXYgPSBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXJfc2ltcGxlKFRQQUNQSV9EUlZSX05BTUUsIC0xLAotCQkJCQkJCU5VTEwsIDApOwotCWlmIChJU19FUlIodHBhY3BpX3BkZXYpKSB7Ci0JCXJldCA9IFBUUl9FUlIodHBhY3BpX3BkZXYpOwotCQl0cGFjcGlfcGRldiA9IE5VTEw7Ci0JCXByaW50ayhUUEFDUElfRVJSICJ1bmFibGUgdG8gcmVnaXN0ZXIgcGxhdGZvcm0gZGV2aWNlXG4iKTsKLQkJdGhpbmtwYWRfYWNwaV9tb2R1bGVfZXhpdCgpOwotCQlyZXR1cm4gcmV0OwotCX0KLQl0cGFjcGlfc2Vuc29yc19wZGV2ID0gcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyX3NpbXBsZSgKLQkJCQkJCVRQQUNQSV9IV01PTl9EUlZSX05BTUUsCi0JCQkJCQktMSwgTlVMTCwgMCk7Ci0JaWYgKElTX0VSUih0cGFjcGlfc2Vuc29yc19wZGV2KSkgewotCQlyZXQgPSBQVFJfRVJSKHRwYWNwaV9zZW5zb3JzX3BkZXYpOwotCQl0cGFjcGlfc2Vuc29yc19wZGV2ID0gTlVMTDsKLQkJcHJpbnRrKFRQQUNQSV9FUlIKLQkJICAgICAgICJ1bmFibGUgdG8gcmVnaXN0ZXIgaHdtb24gcGxhdGZvcm0gZGV2aWNlXG4iKTsKLQkJdGhpbmtwYWRfYWNwaV9tb2R1bGVfZXhpdCgpOwotCQlyZXR1cm4gcmV0OwotCX0KLQlyZXQgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJnRwYWNwaV9zZW5zb3JzX3BkZXYtPmRldiwKLQkJCQkgJmRldl9hdHRyX3RoaW5rcGFkX2FjcGlfcGRldl9uYW1lKTsKLQlpZiAocmV0KSB7Ci0JCXByaW50ayhUUEFDUElfRVJSCi0JCSAgICAgICAidW5hYmxlIHRvIGNyZWF0ZSBzeXNmcyBod21vbiBkZXZpY2UgYXR0cmlidXRlc1xuIik7Ci0JCXRoaW5rcGFkX2FjcGlfbW9kdWxlX2V4aXQoKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0JdHBfZmVhdHVyZXMuc2Vuc29yc19wZGV2X2F0dHJzX3JlZ2lzdGVyZWQgPSAxOwotCXRwYWNwaV9od21vbiA9IGh3bW9uX2RldmljZV9yZWdpc3RlcigmdHBhY3BpX3NlbnNvcnNfcGRldi0+ZGV2KTsKLQlpZiAoSVNfRVJSKHRwYWNwaV9od21vbikpIHsKLQkJcmV0ID0gUFRSX0VSUih0cGFjcGlfaHdtb24pOwotCQl0cGFjcGlfaHdtb24gPSBOVUxMOwotCQlwcmludGsoVFBBQ1BJX0VSUiAidW5hYmxlIHRvIHJlZ2lzdGVyIGh3bW9uIGRldmljZVxuIik7Ci0JCXRoaW5rcGFkX2FjcGlfbW9kdWxlX2V4aXQoKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0JbXV0ZXhfaW5pdCgmdHBhY3BpX2lucHV0ZGV2X3NlbmRfbXV0ZXgpOwotCXRwYWNwaV9pbnB1dGRldiA9IGlucHV0X2FsbG9jYXRlX2RldmljZSgpOwotCWlmICghdHBhY3BpX2lucHV0ZGV2KSB7Ci0JCXByaW50ayhUUEFDUElfRVJSICJ1bmFibGUgdG8gYWxsb2NhdGUgaW5wdXQgZGV2aWNlXG4iKTsKLQkJdGhpbmtwYWRfYWNwaV9tb2R1bGVfZXhpdCgpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9IGVsc2UgewotCQkvKiBQcmVwYXJlIGlucHV0IGRldmljZSwgYnV0IGRvbid0IHJlZ2lzdGVyICovCi0JCXRwYWNwaV9pbnB1dGRldi0+bmFtZSA9ICJUaGlua1BhZCBFeHRyYSBCdXR0b25zIjsKLQkJdHBhY3BpX2lucHV0ZGV2LT5waHlzID0gVFBBQ1BJX0RSVlJfTkFNRSAiL2lucHV0MCI7Ci0JCXRwYWNwaV9pbnB1dGRldi0+aWQuYnVzdHlwZSA9IEJVU19IT1NUOwotCQl0cGFjcGlfaW5wdXRkZXYtPmlkLnZlbmRvciA9ICh0aGlua3BhZF9pZC52ZW5kb3IpID8KLQkJCQkJCXRoaW5rcGFkX2lkLnZlbmRvciA6Ci0JCQkJCQlQQ0lfVkVORE9SX0lEX0lCTTsKLQkJdHBhY3BpX2lucHV0ZGV2LT5pZC5wcm9kdWN0ID0gVFBBQ1BJX0hLRVlfSU5QVVRfUFJPRFVDVDsKLQkJdHBhY3BpX2lucHV0ZGV2LT5pZC52ZXJzaW9uID0gVFBBQ1BJX0hLRVlfSU5QVVRfVkVSU0lPTjsKLQl9Ci0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoaWJtc19pbml0KTsgaSsrKSB7Ci0JCXJldCA9IGlibV9pbml0KCZpYm1zX2luaXRbaV0pOwotCQlpZiAocmV0ID49IDAgJiYgKmlibXNfaW5pdFtpXS5wYXJhbSkKLQkJCXJldCA9IGlibXNfaW5pdFtpXS5kYXRhLT53cml0ZShpYm1zX2luaXRbaV0ucGFyYW0pOwotCQlpZiAocmV0IDwgMCkgewotCQkJdGhpbmtwYWRfYWNwaV9tb2R1bGVfZXhpdCgpOwotCQkJcmV0dXJuIHJldDsKLQkJfQotCX0KLQlyZXQgPSBpbnB1dF9yZWdpc3Rlcl9kZXZpY2UodHBhY3BpX2lucHV0ZGV2KTsKLQlpZiAocmV0IDwgMCkgewotCQlwcmludGsoVFBBQ1BJX0VSUiAidW5hYmxlIHRvIHJlZ2lzdGVyIGlucHV0IGRldmljZVxuIik7Ci0JCXRoaW5rcGFkX2FjcGlfbW9kdWxlX2V4aXQoKTsKLQkJcmV0dXJuIHJldDsKLQl9IGVsc2UgewotCQl0cF9mZWF0dXJlcy5pbnB1dF9kZXZpY2VfcmVnaXN0ZXJlZCA9IDE7Ci0JfQotCi0JdHBhY3BpX2xpZmVjeWNsZSA9IFRQQUNQSV9MSUZFX1JVTk5JTkc7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qIFBsZWFzZSByZW1vdmUgdGhpcyBpbiB5ZWFyIDIwMDkgKi8KLU1PRFVMRV9BTElBUygiaWJtX2FjcGkiKTsKLQotTU9EVUxFX0FMSUFTKFRQQUNQSV9EUlZSX1NIT1JUTkFNRSk7Ci0KLS8qCi0gKiBETUkgbWF0Y2hpbmcgZm9yIG1vZHVsZSBhdXRvbG9hZGluZwotICoKLSAqIFNlZSBodHRwOi8vdGhpbmt3aWtpLm9yZy93aWtpL0xpc3Rfb2ZfRE1JX0lEcwotICogU2VlIGh0dHA6Ly90aGlua3dpa2kub3JnL3dpa2kvQklPU19VcGdyYWRlX0Rvd25sb2FkcwotICoKLSAqIE9ubHkgbW9kZWxzIGxpc3RlZCBpbiB0aGlua3dpa2kgd2lsbCBiZSBzdXBwb3J0ZWQsIHNvIGFkZCB5b3VycwotICogaWYgaXQgaXMgbm90IHRoZXJlIHlldC4KLSAqLwotI2RlZmluZSBJQk1fQklPU19NT0RVTEVfQUxJQVMoX190eXBlKSBcCi0JTU9EVUxFX0FMSUFTKCJkbWk6YnZuSUJNOmJ2ciIgX190eXBlICJFVD8/V1ciKQotCi0vKiBOb24tYW5jaWVudCB0aGlua3BhZHMgKi8KLU1PRFVMRV9BTElBUygiZG1pOmJ2bklCTToqOnN2bklCTToqOnB2clRoaW5rUGFkKjpydm5JQk06KiIpOwotTU9EVUxFX0FMSUFTKCJkbWk6YnZuTEVOT1ZPOio6c3ZuTEVOT1ZPOio6cHZyVGhpbmtQYWQqOnJ2bkxFTk9WTzoqIik7Ci0KLS8qIEFuY2llbnQgdGhpbmtwYWQgQklPU2VzIGhhdmUgdG8gYmUgaWRlbnRpZmllZCBieQotICogQklPUyB0eXBlIG9yIG1vZGVsIG51bWJlciwgYW5kIHRoZXJlIGFyZSBmYXIgbGVzcwotICogQklPUyB0eXBlcyB0aGFuIG1vZGVsIG51bWJlcnMuLi4gKi8KLUlCTV9CSU9TX01PRFVMRV9BTElBUygiSVtCLEQsSCxJLE0sTixPLFQsVyxWLFksWl0iKTsKLUlCTV9CSU9TX01PRFVMRV9BTElBUygiMVswLDMsNiw4LEEtRyxJLEssTS1QLFMsVF0iKTsKLUlCTV9CSU9TX01PRFVMRV9BTElBUygiS1tVLFgtWl0iKTsKLQotTU9EVUxFX0FVVEhPUigiQm9yaXNsYXYgRGVpYW5vdiwgSGVucmlxdWUgZGUgTW9yYWVzIEhvbHNjaHVoIik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oVFBBQ1BJX0RFU0MpOwotTU9EVUxFX1ZFUlNJT04oVFBBQ1BJX1ZFUlNJT04pOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotCi1tb2R1bGVfaW5pdCh0aGlua3BhZF9hY3BpX21vZHVsZV9pbml0KTsKLW1vZHVsZV9leGl0KHRoaW5rcGFkX2FjcGlfbW9kdWxlX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvaG9zdC9hdG1lbC1tY2kuYyBiL2RyaXZlcnMvbW1jL2hvc3QvYXRtZWwtbWNpLmMKaW5kZXggN2EzZjI0My4uNzZiZmUxNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvaG9zdC9hdG1lbC1tY2kuYworKysgYi9kcml2ZXJzL21tYy9ob3N0L2F0bWVsLW1jaS5jCkBAIC0yNSw4ICsyNSw4IEBACiAjaW5jbHVkZSA8bGludXgvc3RhdC5oPgogCiAjaW5jbHVkZSA8bGludXgvbW1jL2hvc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9hdG1lbC1tY2kuaD4KIAotI2luY2x1ZGUgPGFzbS9hdG1lbC1tY2kuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vdW5hbGlnbmVkLmg+CiAKQEAgLTU1LDcgKzU1LDYgQEAKIAogc3RydWN0IGF0bWVsX21jaV9kbWEgewogI2lmZGVmIENPTkZJR19NTUNfQVRNRUxNQ0lfRE1BCi0Jc3RydWN0IGRtYV9jbGllbnQJCWNsaWVudDsKIAlzdHJ1Y3QgZG1hX2NoYW4JCQkqY2hhbjsKIAlzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IJKmRhdGFfZGVzYzsKICNlbmRpZgpAQCAtNTkzLDEwICs1OTIsOCBAQAogCiAJLyogSWYgd2UgZG9uJ3QgaGF2ZSBhIGNoYW5uZWwsIHdlIGNhbid0IGRvIERNQSAqLwogCWNoYW4gPSBob3N0LT5kbWEuY2hhbjsKLQlpZiAoY2hhbikgewotCQlkbWFfY2hhbl9nZXQoY2hhbik7CisJaWYgKGNoYW4pCiAJCWhvc3QtPmRhdGFfY2hhbiA9IGNoYW47Ci0JfQogCiAJaWYgKCFjaGFuKQogCQlyZXR1cm4gLUVOT0RFVjsKQEAgLTE0NDMsNjAgKzE0NDAsNiBAQAogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIAotI2lmZGVmIENPTkZJR19NTUNfQVRNRUxNQ0lfRE1BCi0KLXN0YXRpYyBpbmxpbmUgc3RydWN0IGF0bWVsX21jaSAqCi1kbWFfY2xpZW50X3RvX2F0bWVsX21jaShzdHJ1Y3QgZG1hX2NsaWVudCAqY2xpZW50KQotewotCXJldHVybiBjb250YWluZXJfb2YoY2xpZW50LCBzdHJ1Y3QgYXRtZWxfbWNpLCBkbWEuY2xpZW50KTsKLX0KLQotc3RhdGljIGVudW0gZG1hX3N0YXRlX2NsaWVudCBhdG1jaV9kbWFfZXZlbnQoc3RydWN0IGRtYV9jbGllbnQgKmNsaWVudCwKLQkJc3RydWN0IGRtYV9jaGFuICpjaGFuLCBlbnVtIGRtYV9zdGF0ZSBzdGF0ZSkKLXsKLQlzdHJ1Y3QgYXRtZWxfbWNpCSpob3N0OwotCWVudW0gZG1hX3N0YXRlX2NsaWVudAlyZXQgPSBETUFfTkFLOwotCi0JaG9zdCA9IGRtYV9jbGllbnRfdG9fYXRtZWxfbWNpKGNsaWVudCk7Ci0KLQlzd2l0Y2ggKHN0YXRlKSB7Ci0JY2FzZSBETUFfUkVTT1VSQ0VfQVZBSUxBQkxFOgotCQlzcGluX2xvY2tfYmgoJmhvc3QtPmxvY2spOwotCQlpZiAoIWhvc3QtPmRtYS5jaGFuKSB7Ci0JCQlob3N0LT5kbWEuY2hhbiA9IGNoYW47Ci0JCQlyZXQgPSBETUFfQUNLOwotCQl9Ci0JCXNwaW5fdW5sb2NrX2JoKCZob3N0LT5sb2NrKTsKLQotCQlpZiAocmV0ID09IERNQV9BQ0spCi0JCQlkZXZfaW5mbygmaG9zdC0+cGRldi0+ZGV2LAotCQkJCQkiVXNpbmcgJXMgZm9yIERNQSB0cmFuc2ZlcnNcbiIsCi0JCQkJCWNoYW4tPmRldi5idXNfaWQpOwotCQlicmVhazsKLQotCWNhc2UgRE1BX1JFU09VUkNFX1JFTU9WRUQ6Ci0JCXNwaW5fbG9ja19iaCgmaG9zdC0+bG9jayk7Ci0JCWlmIChob3N0LT5kbWEuY2hhbiA9PSBjaGFuKSB7Ci0JCQlob3N0LT5kbWEuY2hhbiA9IE5VTEw7Ci0JCQlyZXQgPSBETUFfQUNLOwotCQl9Ci0JCXNwaW5fdW5sb2NrX2JoKCZob3N0LT5sb2NrKTsKLQotCQlpZiAocmV0ID09IERNQV9BQ0spCi0JCQlkZXZfaW5mbygmaG9zdC0+cGRldi0+ZGV2LAotCQkJCQkiTG9zdCAlcywgZmFsbGluZyBiYWNrIHRvIFBJT1xuIiwKLQkJCQkJY2hhbi0+ZGV2LmJ1c19pZCk7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQotCi0KLQlyZXR1cm4gcmV0OwotfQotI2VuZGlmIC8qIENPTkZJR19NTUNfQVRNRUxNQ0lfRE1BICovCi0KIHN0YXRpYyBpbnQgX19pbml0IGF0bWNpX2luaXRfc2xvdChzdHJ1Y3QgYXRtZWxfbWNpICpob3N0LAogCQlzdHJ1Y3QgbWNpX3Nsb3RfcGRhdGEgKnNsb3RfZGF0YSwgdW5zaWduZWQgaW50IGlkLAogCQl1MzIgc2RjX3JlZykKQEAgLTE2MDAsNiArMTU0MywxOCBAQAogCW1tY19mcmVlX2hvc3Qoc2xvdC0+bW1jKTsKIH0KIAorI2lmZGVmIENPTkZJR19NTUNfQVRNRUxNQ0lfRE1BCitzdGF0aWMgYm9vbCBmaWx0ZXIoc3RydWN0IGRtYV9jaGFuICpjaGFuLCB2b2lkICpzbGF2ZSkKK3sKKwlzdHJ1Y3QgZHdfZG1hX3NsYXZlICpkd3MgPSBzbGF2ZTsKKworCWlmIChkd3MtPmRtYV9kZXYgPT0gY2hhbi0+ZGV2aWNlLT5kZXYpCisJCXJldHVybiB0cnVlOworCWVsc2UKKwkJcmV0dXJuIGZhbHNlOworfQorI2VuZGlmCisKIHN0YXRpYyBpbnQgX19pbml0IGF0bWNpX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJc3RydWN0IG1jaV9wbGF0Zm9ybV9kYXRhCSpwZGF0YTsKQEAgLTE2NTIsMjIgKzE2MDcsMjAgQEAKIAkJZ290byBlcnJfcmVxdWVzdF9pcnE7CiAKICNpZmRlZiBDT05GSUdfTU1DX0FUTUVMTUNJX0RNQQotCWlmIChwZGF0YS0+ZG1hX3NsYXZlKSB7Ci0JCXN0cnVjdCBkbWFfc2xhdmUgKnNsYXZlID0gcGRhdGEtPmRtYV9zbGF2ZTsKKwlpZiAocGRhdGEtPmRtYV9zbGF2ZS5kbWFfZGV2KSB7CisJCXN0cnVjdCBkd19kbWFfc2xhdmUgKmR3cyA9ICZwZGF0YS0+ZG1hX3NsYXZlOworCQlkbWFfY2FwX21hc2tfdCBtYXNrOwogCi0JCXNsYXZlLT50eF9yZWcgPSByZWdzLT5zdGFydCArIE1DSV9URFI7Ci0JCXNsYXZlLT5yeF9yZWcgPSByZWdzLT5zdGFydCArIE1DSV9SRFI7CisJCWR3cy0+dHhfcmVnID0gcmVncy0+c3RhcnQgKyBNQ0lfVERSOworCQlkd3MtPnJ4X3JlZyA9IHJlZ3MtPnN0YXJ0ICsgTUNJX1JEUjsKIAogCQkvKiBUcnkgdG8gZ3JhYiBhIERNQSBjaGFubmVsICovCi0JCWhvc3QtPmRtYS5jbGllbnQuZXZlbnRfY2FsbGJhY2sgPSBhdG1jaV9kbWFfZXZlbnQ7Ci0JCWRtYV9jYXBfc2V0KERNQV9TTEFWRSwgaG9zdC0+ZG1hLmNsaWVudC5jYXBfbWFzayk7Ci0JCWhvc3QtPmRtYS5jbGllbnQuc2xhdmUgPSBzbGF2ZTsKLQotCQlkbWFfYXN5bmNfY2xpZW50X3JlZ2lzdGVyKCZob3N0LT5kbWEuY2xpZW50KTsKLQkJZG1hX2FzeW5jX2NsaWVudF9jaGFuX3JlcXVlc3QoJmhvc3QtPmRtYS5jbGllbnQpOwotCX0gZWxzZSB7Ci0JCWRldl9ub3RpY2UoJnBkZXYtPmRldiwgIkRNQSBub3QgYXZhaWxhYmxlLCB1c2luZyBQSU9cbiIpOworCQlkbWFfY2FwX3plcm8obWFzayk7CisJCWRtYV9jYXBfc2V0KERNQV9TTEFWRSwgbWFzayk7CisJCWhvc3QtPmRtYS5jaGFuID0gZG1hX3JlcXVlc3RfY2hhbm5lbChtYXNrLCBmaWx0ZXIsIGR3cyk7CiAJfQorCWlmICghaG9zdC0+ZG1hLmNoYW4pCisJCWRldl9ub3RpY2UoJnBkZXYtPmRldiwgIkRNQSBub3QgYXZhaWxhYmxlLCB1c2luZyBQSU9cbiIpOwogI2VuZGlmIC8qIENPTkZJR19NTUNfQVRNRUxNQ0lfRE1BICovCiAKIAlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBob3N0KTsKQEAgLTE2OTksOCArMTY1Miw4IEBACiAKIGVycl9pbml0X3Nsb3Q6CiAjaWZkZWYgQ09ORklHX01NQ19BVE1FTE1DSV9ETUEKLQlpZiAocGRhdGEtPmRtYV9zbGF2ZSkKLQkJZG1hX2FzeW5jX2NsaWVudF91bnJlZ2lzdGVyKCZob3N0LT5kbWEuY2xpZW50KTsKKwlpZiAoaG9zdC0+ZG1hLmNoYW4pCisJCWRtYV9yZWxlYXNlX2NoYW5uZWwoaG9zdC0+ZG1hLmNoYW4pOwogI2VuZGlmCiAJZnJlZV9pcnEoaXJxLCBob3N0KTsKIGVycl9yZXF1ZXN0X2lycToKQEAgLTE3MzEsOCArMTY4NCw4IEBACiAJY2xrX2Rpc2FibGUoaG9zdC0+bWNrKTsKIAogI2lmZGVmIENPTkZJR19NTUNfQVRNRUxNQ0lfRE1BCi0JaWYgKGhvc3QtPmRtYS5jbGllbnQuc2xhdmUpCi0JCWRtYV9hc3luY19jbGllbnRfdW5yZWdpc3RlcigmaG9zdC0+ZG1hLmNsaWVudCk7CisJaWYgKGhvc3QtPmRtYS5jaGFuKQorCQlkbWFfcmVsZWFzZV9jaGFubmVsKGhvc3QtPmRtYS5jaGFuKTsKICNlbmRpZgogCiAJZnJlZV9pcnEocGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKSwgaG9zdCk7CkBAIC0xNzYxLDcgKzE3MTQsNyBAQAogCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZhdG1jaV9kcml2ZXIpOwogfQogCi1tb2R1bGVfaW5pdChhdG1jaV9pbml0KTsKK2xhdGVfaW5pdGNhbGwoYXRtY2lfaW5pdCk7IC8qIHRyeSB0byBsb2FkIGFmdGVyIGRtYSBkcml2ZXIgd2hlbiBidWlsdC1pbiAqLwogbW9kdWxlX2V4aXQoYXRtY2lfZXhpdCk7CiAKIE1PRFVMRV9ERVNDUklQVElPTigiQXRtZWwgTXVsdGltZWRpYSBDYXJkIEludGVyZmFjZSBkcml2ZXIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL0tjb25maWcgYi9kcml2ZXJzL210ZC9LY29uZmlnCmluZGV4IGE5MGQ1MGMuLjdkMDRmYjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL0tjb25maWcKKysrIGIvZHJpdmVycy9tdGQvS2NvbmZpZwpAQCAtNDUsNiArNDUsMTQgQEAKIAkgIGRldmljZXMuIFBhcnRpdGlvbmluZyBvbiBORlRMICdkZXZpY2VzJyBpcyBhIGRpZmZlcmVudCAtIHRoYXQncyB0aGUKIAkgICdub3JtYWwnIGZvcm0gb2YgcGFydGl0aW9uaW5nIHVzZWQgb24gYSBibG9jayBkZXZpY2UuCiAKK2NvbmZpZyBNVERfVEVTVFMKKwl0cmlzdGF0ZSAiTVREIHRlc3RzIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBtCisJaGVscAorCSAgVGhpcyBvcHRpb24gaW5jbHVkZXMgdmFyaW91cyBNVEQgdGVzdHMgaW50byBjb21waWxhdGlvbi4gVGhlIHRlc3RzCisJICBzaG91bGQgbm9ybWFsbHkgYmUgY29tcGlsZWQgYXMga2VybmVsIG1vZHVsZXMuIFRoZSBtb2R1bGVzIHBlcmZvcm0KKwkgIHZhcmlvdXMgY2hlY2tzIGFuZCB2ZXJpZmljYXRpb25zIHdoZW4gbG9hZGVkLgorCiBjb25maWcgTVREX1JFREJPT1RfUEFSVFMKIAl0cmlzdGF0ZSAiUmVkQm9vdCBwYXJ0aXRpb24gdGFibGUgcGFyc2luZyIKIAlkZXBlbmRzIG9uIE1URF9QQVJUSVRJT05TCkBAIC0zMTYsNiArMzI0LDggQEAKIAogc291cmNlICJkcml2ZXJzL210ZC9vbmVuYW5kL0tjb25maWciCiAKK3NvdXJjZSAiZHJpdmVycy9tdGQvbHBkZHIvS2NvbmZpZyIKKwogc291cmNlICJkcml2ZXJzL210ZC91YmkvS2NvbmZpZyIKIAogZW5kaWYgIyBNVEQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL01ha2VmaWxlIGIvZHJpdmVycy9tdGQvTWFrZWZpbGUKaW5kZXggNGI3NzMzNS4uNDUyMWIxZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9tdGQvTWFrZWZpbGUKQEAgLTI5LDYgKzI5LDYgQEAKIG5mdGwtb2JqcwkJOj0gbmZ0bGNvcmUubyBuZnRsbW91bnQubwogaW5mdGwtb2JqcwkJOj0gaW5mdGxjb3JlLm8gaW5mdGxtb3VudC5vCiAKLW9iai15CQkrPSBjaGlwcy8gbWFwcy8gZGV2aWNlcy8gbmFuZC8gb25lbmFuZC8KK29iai15CQkrPSBjaGlwcy8gbHBkZHIvIG1hcHMvIGRldmljZXMvIG5hbmQvIG9uZW5hbmQvIHRlc3RzLwogCiBvYmotJChDT05GSUdfTVREX1VCSSkJCSs9IHViaS8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL2NoaXBzL2NmaV9jbWRzZXRfMDAwMS5jIGIvZHJpdmVycy9tdGQvY2hpcHMvY2ZpX2NtZHNldF8wMDAxLmMKaW5kZXggYzkzYThiZS4uZjVhYjZmYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvY2hpcHMvY2ZpX2NtZHNldF8wMDAxLmMKKysrIGIvZHJpdmVycy9tdGQvY2hpcHMvY2ZpX2NtZHNldF8wMDAxLmMKQEAgLTU4LDggKzU4LDggQEAKIHN0YXRpYyBpbnQgY2ZpX2ludGVsZXh0X3dyaXRldihzdHJ1Y3QgbXRkX2luZm8gKiwgY29uc3Qgc3RydWN0IGt2ZWMgKiwgdW5zaWduZWQgbG9uZywgbG9mZl90LCBzaXplX3QgKik7CiBzdGF0aWMgaW50IGNmaV9pbnRlbGV4dF9lcmFzZV92YXJzaXplKHN0cnVjdCBtdGRfaW5mbyAqLCBzdHJ1Y3QgZXJhc2VfaW5mbyAqKTsKIHN0YXRpYyB2b2lkIGNmaV9pbnRlbGV4dF9zeW5jIChzdHJ1Y3QgbXRkX2luZm8gKik7Ci1zdGF0aWMgaW50IGNmaV9pbnRlbGV4dF9sb2NrKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBsb2ZmX3Qgb2ZzLCBzaXplX3QgbGVuKTsKLXN0YXRpYyBpbnQgY2ZpX2ludGVsZXh0X3VubG9jayhzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgbG9mZl90IG9mcywgc2l6ZV90IGxlbik7CitzdGF0aWMgaW50IGNmaV9pbnRlbGV4dF9sb2NrKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBsb2ZmX3Qgb2ZzLCB1aW50NjRfdCBsZW4pOworc3RhdGljIGludCBjZmlfaW50ZWxleHRfdW5sb2NrKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBsb2ZmX3Qgb2ZzLCB1aW50NjRfdCBsZW4pOwogI2lmZGVmIENPTkZJR19NVERfT1RQCiBzdGF0aWMgaW50IGNmaV9pbnRlbGV4dF9yZWFkX2ZhY3RfcHJvdF9yZWcgKHN0cnVjdCBtdGRfaW5mbyAqLCBsb2ZmX3QsIHNpemVfdCwgc2l6ZV90ICosIHVfY2hhciAqKTsKIHN0YXRpYyBpbnQgY2ZpX2ludGVsZXh0X3JlYWRfdXNlcl9wcm90X3JlZyAoc3RydWN0IG10ZF9pbmZvICosIGxvZmZfdCwgc2l6ZV90LCBzaXplX3QgKiwgdV9jaGFyICopOwpAQCAtNTU4LDggKzU1OCw4IEBACiAJfQogCiAJZm9yIChpPTA7IGk8bXRkLT5udW1lcmFzZXJlZ2lvbnM7aSsrKXsKLQkJcHJpbnRrKEtFUk5fREVCVUcgImVyYXNlIHJlZ2lvbiAlZDogb2Zmc2V0PTB4JXgsc2l6ZT0weCV4LGJsb2Nrcz0lZFxuIiwKLQkJICAgICAgIGksbXRkLT5lcmFzZXJlZ2lvbnNbaV0ub2Zmc2V0LAorCQlwcmludGsoS0VSTl9ERUJVRyAiZXJhc2UgcmVnaW9uICVkOiBvZmZzZXQ9MHglbGx4LHNpemU9MHgleCxibG9ja3M9JWRcbiIsCisJCSAgICAgICBpLCh1bnNpZ25lZCBsb25nIGxvbmcpbXRkLT5lcmFzZXJlZ2lvbnNbaV0ub2Zmc2V0LAogCQkgICAgICAgbXRkLT5lcmFzZXJlZ2lvbnNbaV0uZXJhc2VzaXplLAogCQkgICAgICAgbXRkLT5lcmFzZXJlZ2lvbnNbaV0ubnVtYmxvY2tzKTsKIAl9CkBAIC0yMDU4LDcgKzIwNTgsNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgY2ZpX2ludGVsZXh0X2xvY2soc3RydWN0IG10ZF9pbmZvICptdGQsIGxvZmZfdCBvZnMsIHNpemVfdCBsZW4pCitzdGF0aWMgaW50IGNmaV9pbnRlbGV4dF9sb2NrKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBsb2ZmX3Qgb2ZzLCB1aW50NjRfdCBsZW4pCiB7CiAJaW50IHJldDsKIApAQCAtMjA4Miw3ICsyMDgyLDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IGNmaV9pbnRlbGV4dF91bmxvY2soc3RydWN0IG10ZF9pbmZvICptdGQsIGxvZmZfdCBvZnMsIHNpemVfdCBsZW4pCitzdGF0aWMgaW50IGNmaV9pbnRlbGV4dF91bmxvY2soc3RydWN0IG10ZF9pbmZvICptdGQsIGxvZmZfdCBvZnMsIHVpbnQ2NF90IGxlbikKIHsKIAlpbnQgcmV0OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9jaGlwcy9jZmlfY21kc2V0XzAwMDIuYyBiL2RyaXZlcnMvbXRkL2NoaXBzL2NmaV9jbWRzZXRfMDAwMi5jCmluZGV4IGQ3NGVjNDYuLjk0YmI2MWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL2NoaXBzL2NmaV9jbWRzZXRfMDAwMi5jCisrKyBiL2RyaXZlcnMvbXRkL2NoaXBzL2NmaV9jbWRzZXRfMDAwMi5jCkBAIC03MSw4ICs3MSw4IEBACiBzdGF0aWMgdm9pZCBwdXRfY2hpcChzdHJ1Y3QgbWFwX2luZm8gKm1hcCwgc3RydWN0IGZsY2hpcCAqY2hpcCwgdW5zaWduZWQgbG9uZyBhZHIpOwogI2luY2x1ZGUgImZ3aF9sb2NrLmgiCiAKLXN0YXRpYyBpbnQgY2ZpX2F0bWVsX2xvY2soc3RydWN0IG10ZF9pbmZvICptdGQsIGxvZmZfdCBvZnMsIHNpemVfdCBsZW4pOwotc3RhdGljIGludCBjZmlfYXRtZWxfdW5sb2NrKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBsb2ZmX3Qgb2ZzLCBzaXplX3QgbGVuKTsKK3N0YXRpYyBpbnQgY2ZpX2F0bWVsX2xvY2soc3RydWN0IG10ZF9pbmZvICptdGQsIGxvZmZfdCBvZnMsIHVpbnQ2NF90IGxlbik7CitzdGF0aWMgaW50IGNmaV9hdG1lbF91bmxvY2soc3RydWN0IG10ZF9pbmZvICptdGQsIGxvZmZfdCBvZnMsIHVpbnQ2NF90IGxlbik7CiAKIHN0YXRpYyBzdHJ1Y3QgbXRkX2NoaXBfZHJpdmVyIGNmaV9hbWRzdGRfY2hpcGRydiA9IHsKIAkucHJvYmUJCT0gTlVMTCwgLyogTm90IHVzYWJsZSBkaXJlY3RseSAqLwpAQCAtMzIyLDYgKzMyMiwxNCBAQAogfTsKIAogCitzdGF0aWMgdm9pZCBjZmlfZml4dXBfbWFqb3JfbWlub3Ioc3RydWN0IGNmaV9wcml2YXRlICpjZmksCisJCQkJICBzdHJ1Y3QgY2ZpX3ByaV9hbWRzdGQgKmV4dHApCit7CisJaWYgKGNmaS0+bWZyID09IENGSV9NRlJfU0FNU1VORyAmJiBjZmktPmlkID09IDB4MjU3ZSAmJgorCSAgICBleHRwLT5NYWpvclZlcnNpb24gPT0gJzAnKQorCQlleHRwLT5NYWpvclZlcnNpb24gPSAnMSc7Cit9CisKIHN0cnVjdCBtdGRfaW5mbyAqY2ZpX2NtZHNldF8wMDAyKHN0cnVjdCBtYXBfaW5mbyAqbWFwLCBpbnQgcHJpbWFyeSkKIHsKIAlzdHJ1Y3QgY2ZpX3ByaXZhdGUgKmNmaSA9IG1hcC0+ZmxkcnZfcHJpdjsKQEAgLTM2Myw2ICszNzEsOCBAQAogCQkJcmV0dXJuIE5VTEw7CiAJCX0KIAorCQljZmlfZml4dXBfbWFqb3JfbWlub3IoY2ZpLCBleHRwKTsKKwogCQlpZiAoZXh0cC0+TWFqb3JWZXJzaW9uICE9ICcxJyB8fAogCQkgICAgKGV4dHAtPk1pbm9yVmVyc2lvbiA8ICcwJyB8fCBleHRwLT5NaW5vclZlcnNpb24gPiAnNCcpKSB7CiAJCQlwcmludGsoS0VSTl9FUlIgIiAgVW5rbm93biBBbWQvRnVqaXRzdSBFeHRlbmRlZCBRdWVyeSAiCkBAIC0xNzc0LDEyICsxNzg0LDEyIEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBjZmlfYXRtZWxfbG9jayhzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgbG9mZl90IG9mcywgc2l6ZV90IGxlbikKK3N0YXRpYyBpbnQgY2ZpX2F0bWVsX2xvY2soc3RydWN0IG10ZF9pbmZvICptdGQsIGxvZmZfdCBvZnMsIHVpbnQ2NF90IGxlbikKIHsKIAlyZXR1cm4gY2ZpX3ZhcnNpemVfZnJvYihtdGQsIGRvX2F0bWVsX2xvY2ssIG9mcywgbGVuLCBOVUxMKTsKIH0KIAotc3RhdGljIGludCBjZmlfYXRtZWxfdW5sb2NrKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBsb2ZmX3Qgb2ZzLCBzaXplX3QgbGVuKQorc3RhdGljIGludCBjZmlfYXRtZWxfdW5sb2NrKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBsb2ZmX3Qgb2ZzLCB1aW50NjRfdCBsZW4pCiB7CiAJcmV0dXJuIGNmaV92YXJzaXplX2Zyb2IobXRkLCBkb19hdG1lbF91bmxvY2ssIG9mcywgbGVuLCBOVUxMKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL2NoaXBzL2NmaV9jbWRzZXRfMDAyMC5jIGIvZHJpdmVycy9tdGQvY2hpcHMvY2ZpX2NtZHNldF8wMDIwLmMKaW5kZXggZDQ3MTRkZC4uNmM3NDBmMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvY2hpcHMvY2ZpX2NtZHNldF8wMDIwLmMKKysrIGIvZHJpdmVycy9tdGQvY2hpcHMvY2ZpX2NtZHNldF8wMDIwLmMKQEAgLTQyLDggKzQyLDggQEAKIAkJdW5zaWduZWQgbG9uZyBjb3VudCwgbG9mZl90IHRvLCBzaXplX3QgKnJldGxlbik7CiBzdGF0aWMgaW50IGNmaV9zdGFhX2VyYXNlX3ZhcnNpemUoc3RydWN0IG10ZF9pbmZvICosIHN0cnVjdCBlcmFzZV9pbmZvICopOwogc3RhdGljIHZvaWQgY2ZpX3N0YWFfc3luYyAoc3RydWN0IG10ZF9pbmZvICopOwotc3RhdGljIGludCBjZmlfc3RhYV9sb2NrKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBsb2ZmX3Qgb2ZzLCBzaXplX3QgbGVuKTsKLXN0YXRpYyBpbnQgY2ZpX3N0YWFfdW5sb2NrKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBsb2ZmX3Qgb2ZzLCBzaXplX3QgbGVuKTsKK3N0YXRpYyBpbnQgY2ZpX3N0YWFfbG9jayhzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgbG9mZl90IG9mcywgdWludDY0X3QgbGVuKTsKK3N0YXRpYyBpbnQgY2ZpX3N0YWFfdW5sb2NrKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBsb2ZmX3Qgb2ZzLCB1aW50NjRfdCBsZW4pOwogc3RhdGljIGludCBjZmlfc3RhYV9zdXNwZW5kIChzdHJ1Y3QgbXRkX2luZm8gKik7CiBzdGF0aWMgdm9pZCBjZmlfc3RhYV9yZXN1bWUgKHN0cnVjdCBtdGRfaW5mbyAqKTsKIApAQCAtMjIxLDggKzIyMSw4IEBACiAJCX0KIAogCQlmb3IgKGk9MDsgaTxtdGQtPm51bWVyYXNlcmVnaW9ucztpKyspewotCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVkOiBvZmZzZXQ9MHgleCxzaXplPTB4JXgsYmxvY2tzPSVkXG4iLAotCQkJICAgICAgIGksbXRkLT5lcmFzZXJlZ2lvbnNbaV0ub2Zmc2V0LAorCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVkOiBvZmZzZXQ9MHglbGx4LHNpemU9MHgleCxibG9ja3M9JWRcbiIsCisJCQkgICAgICAgaSwgKHVuc2lnbmVkIGxvbmcgbG9uZyltdGQtPmVyYXNlcmVnaW9uc1tpXS5vZmZzZXQsCiAJCQkgICAgICAgbXRkLT5lcmFzZXJlZ2lvbnNbaV0uZXJhc2VzaXplLAogCQkJICAgICAgIG10ZC0+ZXJhc2VyZWdpb25zW2ldLm51bWJsb2Nrcyk7CiAJCX0KQEAgLTk2NCw3ICs5NjQsNyBAQAogCQlhZHIgKz0gcmVnaW9uc1tpXS5lcmFzZXNpemU7CiAJCWxlbiAtPSByZWdpb25zW2ldLmVyYXNlc2l6ZTsKIAotCQlpZiAoYWRyICUgKDE8PCBjZmktPmNoaXBzaGlmdCkgPT0gKChyZWdpb25zW2ldLm9mZnNldCArIChyZWdpb25zW2ldLmVyYXNlc2l6ZSAqIHJlZ2lvbnNbaV0ubnVtYmxvY2tzKSkgJSggMTw8IGNmaS0+Y2hpcHNoaWZ0KSkpCisJCWlmIChhZHIgJSAoMTw8IGNmaS0+Y2hpcHNoaWZ0KSA9PSAoKCh1bnNpZ25lZCBsb25nKXJlZ2lvbnNbaV0ub2Zmc2V0ICsgKHJlZ2lvbnNbaV0uZXJhc2VzaXplICogcmVnaW9uc1tpXS5udW1ibG9ja3MpKSAlKCAxPDwgY2ZpLT5jaGlwc2hpZnQpKSkKIAkJCWkrKzsKIAogCQlpZiAoYWRyID4+IGNmaS0+Y2hpcHNoaWZ0KSB7CkBAIC0xMTM1LDcgKzExMzUsNyBAQAogCXNwaW5fdW5sb2NrX2JoKGNoaXAtPm11dGV4KTsKIAlyZXR1cm4gMDsKIH0KLXN0YXRpYyBpbnQgY2ZpX3N0YWFfbG9jayhzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgbG9mZl90IG9mcywgc2l6ZV90IGxlbikKK3N0YXRpYyBpbnQgY2ZpX3N0YWFfbG9jayhzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgbG9mZl90IG9mcywgdWludDY0X3QgbGVuKQogewogCXN0cnVjdCBtYXBfaW5mbyAqbWFwID0gbXRkLT5wcml2OwogCXN0cnVjdCBjZmlfcHJpdmF0ZSAqY2ZpID0gbWFwLT5mbGRydl9wcml2OwpAQCAtMTI4NCw3ICsxMjg0LDcgQEAKIAlzcGluX3VubG9ja19iaChjaGlwLT5tdXRleCk7CiAJcmV0dXJuIDA7CiB9Ci1zdGF0aWMgaW50IGNmaV9zdGFhX3VubG9jayhzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgbG9mZl90IG9mcywgc2l6ZV90IGxlbikKK3N0YXRpYyBpbnQgY2ZpX3N0YWFfdW5sb2NrKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBsb2ZmX3Qgb2ZzLCB1aW50NjRfdCBsZW4pCiB7CiAJc3RydWN0IG1hcF9pbmZvICptYXAgPSBtdGQtPnByaXY7CiAJc3RydWN0IGNmaV9wcml2YXRlICpjZmkgPSBtYXAtPmZsZHJ2X3ByaXY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9jaGlwcy9md2hfbG9jay5oIGIvZHJpdmVycy9tdGQvY2hpcHMvZndoX2xvY2suaAppbmRleCBhYjQ0ZjJiLi41N2UwZTRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9jaGlwcy9md2hfbG9jay5oCisrKyBiL2RyaXZlcnMvbXRkL2NoaXBzL2Z3aF9sb2NrLmgKQEAgLTc3LDcgKzc3LDcgQEAKIH0KIAogCi1zdGF0aWMgaW50IGZ3aF9sb2NrX3ZhcnNpemUoc3RydWN0IG10ZF9pbmZvICptdGQsIGxvZmZfdCBvZnMsIHNpemVfdCBsZW4pCitzdGF0aWMgaW50IGZ3aF9sb2NrX3ZhcnNpemUoc3RydWN0IG10ZF9pbmZvICptdGQsIGxvZmZfdCBvZnMsIHVpbnQ2NF90IGxlbikKIHsKIAlpbnQgcmV0OwogCkBAIC04OCw3ICs4OCw3IEBACiB9CiAKIAotc3RhdGljIGludCBmd2hfdW5sb2NrX3ZhcnNpemUoc3RydWN0IG10ZF9pbmZvICptdGQsIGxvZmZfdCBvZnMsIHNpemVfdCBsZW4pCitzdGF0aWMgaW50IGZ3aF91bmxvY2tfdmFyc2l6ZShzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgbG9mZl90IG9mcywgdWludDY0X3QgbGVuKQogewogCWludCByZXQ7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL2RldmljZXMvS2NvbmZpZyBiL2RyaXZlcnMvbXRkL2RldmljZXMvS2NvbmZpZwppbmRleCA2ZmRlMGEyLi5iYzMzMjAwIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9kZXZpY2VzL0tjb25maWcKKysrIGIvZHJpdmVycy9tdGQvZGV2aWNlcy9LY29uZmlnCkBAIC0xMjAsNiArMTIwLDEzIEBACiAJICBkb2Vzbid0IGhhdmUgYWNjZXNzIHRvLCBtZW1vcnkgYmV5b25kIHRoZSBtZW09eHh4IGxpbWl0LCBudnJhbSwKIAkgIG1lbW9yeSBvbiB0aGUgdmlkZW8gY2FyZCwgZXRjLi4uCiAKK2NvbmZpZyBNVERfUFMzVlJBTQorCXRyaXN0YXRlICJQUzMgdmlkZW8gUkFNIgorCWRlcGVuZHMgb24gRkJfUFMzCisJaGVscAorCSAgVGhpcyBkcml2ZXIgYWxsb3dzIHlvdSB0byB1c2UgZXhjZXNzIFBTMyB2aWRlbyBSQU0gYXMgdm9sYXRpbGUKKwkgIHN0b3JhZ2Ugb3Igc3lzdGVtIHN3YXAuCisKIGNvbmZpZyBNVERfTEFSVAogCXRyaXN0YXRlICIyOEYxNjB4eCBmbGFzaCBkcml2ZXIgZm9yIExBUlQiCiAJZGVwZW5kcyBvbiBTQTExMDBfTEFSVApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvZGV2aWNlcy9NYWtlZmlsZSBiL2RyaXZlcnMvbXRkL2RldmljZXMvTWFrZWZpbGUKaW5kZXggMDk5M2Q1Yy4uZTUxNTIxZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvZGV2aWNlcy9NYWtlZmlsZQorKysgYi9kcml2ZXJzL210ZC9kZXZpY2VzL01ha2VmaWxlCkBAIC0xNiwzICsxNiw0IEBACiBvYmotJChDT05GSUdfTVREX0JMT0NLMk1URCkJKz0gYmxvY2sybXRkLm8KIG9iai0kKENPTkZJR19NVERfREFUQUZMQVNIKQkrPSBtdGRfZGF0YWZsYXNoLm8KIG9iai0kKENPTkZJR19NVERfTTI1UDgwKQkrPSBtMjVwODAubworb2JqLSQoQ09ORklHX01URF9QUzNWUkFNKQkrPSBwczN2cmFtLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL2RldmljZXMvbGFydC5jIGIvZHJpdmVycy9tdGQvZGV2aWNlcy9sYXJ0LmMKaW5kZXggZjRiZGE0Yy4uNTc4ZGUxYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvZGV2aWNlcy9sYXJ0LmMKKysrIGIvZHJpdmVycy9tdGQvZGV2aWNlcy9sYXJ0LmMKQEAgLTYxOSw3ICs2MTksNyBAQAogfTsKICNlbmRpZgogCi1pbnQgX19pbml0IGxhcnRfZmxhc2hfaW5pdCAodm9pZCkKK3N0YXRpYyBpbnQgX19pbml0IGxhcnRfZmxhc2hfaW5pdCAodm9pZCkKIHsKICAgIGludCByZXN1bHQ7CiAgICBtZW1zZXQgKCZtdGQsMCxzaXplb2YgKG10ZCkpOwpAQCAtNjkwLDcgKzY5MCw3IEBACiAgICByZXR1cm4gKHJlc3VsdCk7CiB9CiAKLXZvaWQgX19leGl0IGxhcnRfZmxhc2hfZXhpdCAodm9pZCkKK3N0YXRpYyB2b2lkIF9fZXhpdCBsYXJ0X2ZsYXNoX2V4aXQgKHZvaWQpCiB7CiAjaWZuZGVmIEhBVkVfUEFSVElUSU9OUwogICAgZGVsX210ZF9kZXZpY2UgKCZtdGQpOwpAQCAtNzA1LDUgKzcwNSwzIEBACiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiBNT0RVTEVfQVVUSE9SKCJBYnJhaGFtIHZkIE1lcndlIDxhYnJhaGFtQDJkM2QuY28uemE+Iik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIk1URCBkcml2ZXIgZm9yIEludGVsIDI4RjE2MEYzIG9uIExBUlQgYm9hcmQiKTsKLQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9kZXZpY2VzL20yNXA4MC5jIGIvZHJpdmVycy9tdGQvZGV2aWNlcy9tMjVwODAuYwppbmRleCA1NzMzZjA2Li43YzNmYzc2IDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9kZXZpY2VzL20yNXA4MC5jCisrKyBiL2RyaXZlcnMvbXRkL2RldmljZXMvbTI1cDgwLmMKQEAgLTIwLDYgKzIwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L21hdGg2NC5oPgogCiAjaW5jbHVkZSA8bGludXgvbXRkL210ZC5oPgogI2luY2x1ZGUgPGxpbnV4L210ZC9wYXJ0aXRpb25zLmg+CkBAIC0xNjksOSArMTcwLDkgQEAKICAqLwogc3RhdGljIGludCBlcmFzZV9jaGlwKHN0cnVjdCBtMjVwICpmbGFzaCkKIHsKLQlERUJVRyhNVERfREVCVUdfTEVWRUwzLCAiJXM6ICVzICVkS2lCXG4iLAotCQkJZGV2X25hbWUoJmZsYXNoLT5zcGktPmRldiksIF9fZnVuY19fLAotCQkJZmxhc2gtPm10ZC5zaXplIC8gMTAyNCk7CisJREVCVUcoTVREX0RFQlVHX0xFVkVMMywgIiVzOiAlcyAlbGxkS2lCXG4iLAorCSAgICAgIGRldl9uYW1lKCZmbGFzaC0+c3BpLT5kZXYpLCBfX2Z1bmNfXywKKwkgICAgICAobG9uZyBsb25nKShmbGFzaC0+bXRkLnNpemUgPj4gMTApKTsKIAogCS8qIFdhaXQgdW50aWwgZmluaXNoZWQgcHJldmlvdXMgd3JpdGUgY29tbWFuZC4gKi8KIAlpZiAod2FpdF90aWxsX3JlYWR5KGZsYXNoKSkKQEAgLTIzMiwxOCArMjMzLDE4IEBACiB7CiAJc3RydWN0IG0yNXAgKmZsYXNoID0gbXRkX3RvX20yNXAobXRkKTsKIAl1MzIgYWRkcixsZW47CisJdWludDMyX3QgcmVtOwogCi0JREVCVUcoTVREX0RFQlVHX0xFVkVMMiwgIiVzOiAlcyAlcyAweCUwOHgsIGxlbiAlZFxuIiwKLQkJCWRldl9uYW1lKCZmbGFzaC0+c3BpLT5kZXYpLCBfX2Z1bmNfXywgImF0IiwKLQkJCSh1MzIpaW5zdHItPmFkZHIsIGluc3RyLT5sZW4pOworCURFQlVHKE1URF9ERUJVR19MRVZFTDIsICIlczogJXMgJXMgMHglbGx4LCBsZW4gJWxsZFxuIiwKKwkgICAgICBkZXZfbmFtZSgmZmxhc2gtPnNwaS0+ZGV2KSwgX19mdW5jX18sICJhdCIsCisJICAgICAgKGxvbmcgbG9uZylpbnN0ci0+YWRkciwgKGxvbmcgbG9uZylpbnN0ci0+bGVuKTsKIAogCS8qIHNhbml0eSBjaGVja3MgKi8KIAlpZiAoaW5zdHItPmFkZHIgKyBpbnN0ci0+bGVuID4gZmxhc2gtPm10ZC5zaXplKQogCQlyZXR1cm4gLUVJTlZBTDsKLQlpZiAoKGluc3RyLT5hZGRyICUgbXRkLT5lcmFzZXNpemUpICE9IDAKLQkJCXx8IChpbnN0ci0+bGVuICUgbXRkLT5lcmFzZXNpemUpICE9IDApIHsKKwlkaXZfdTY0X3JlbShpbnN0ci0+bGVuLCBtdGQtPmVyYXNlc2l6ZSwgJnJlbSk7CisJaWYgKHJlbSkKIAkJcmV0dXJuIC1FSU5WQUw7Ci0JfQogCiAJYWRkciA9IGluc3RyLT5hZGRyOwogCWxlbiA9IGluc3RyLT5sZW47CkBAIC02NzcsMjQgKzY3OCwyNCBAQAogCQlmbGFzaC0+bXRkLmVyYXNlc2l6ZSA9IGluZm8tPnNlY3Rvcl9zaXplOwogCX0KIAotCWRldl9pbmZvKCZzcGktPmRldiwgIiVzICglZCBLYnl0ZXMpXG4iLCBpbmZvLT5uYW1lLAotCQkJZmxhc2gtPm10ZC5zaXplIC8gMTAyNCk7CisJZGV2X2luZm8oJnNwaS0+ZGV2LCAiJXMgKCVsbGQgS2J5dGVzKVxuIiwgaW5mby0+bmFtZSwKKwkJCShsb25nIGxvbmcpZmxhc2gtPm10ZC5zaXplID4+IDEwKTsKIAogCURFQlVHKE1URF9ERUJVR19MRVZFTDIsCi0JCSJtdGQgLm5hbWUgPSAlcywgLnNpemUgPSAweCUuOHggKCV1TWlCKSAiCisJCSJtdGQgLm5hbWUgPSAlcywgLnNpemUgPSAweCVsbHggKCVsbGRNaUIpICIKIAkJCSIuZXJhc2VzaXplID0gMHglLjh4ICgldUtpQikgLm51bWVyYXNlcmVnaW9ucyA9ICVkXG4iLAogCQlmbGFzaC0+bXRkLm5hbWUsCi0JCWZsYXNoLT5tdGQuc2l6ZSwgZmxhc2gtPm10ZC5zaXplIC8gKDEwMjQqMTAyNCksCisJCShsb25nIGxvbmcpZmxhc2gtPm10ZC5zaXplLCAobG9uZyBsb25nKShmbGFzaC0+bXRkLnNpemUgPj4gMjApLAogCQlmbGFzaC0+bXRkLmVyYXNlc2l6ZSwgZmxhc2gtPm10ZC5lcmFzZXNpemUgLyAxMDI0LAogCQlmbGFzaC0+bXRkLm51bWVyYXNlcmVnaW9ucyk7CiAKIAlpZiAoZmxhc2gtPm10ZC5udW1lcmFzZXJlZ2lvbnMpCiAJCWZvciAoaSA9IDA7IGkgPCBmbGFzaC0+bXRkLm51bWVyYXNlcmVnaW9uczsgaSsrKQogCQkJREVCVUcoTVREX0RFQlVHX0xFVkVMMiwKLQkJCQkibXRkLmVyYXNlcmVnaW9uc1slZF0gPSB7IC5vZmZzZXQgPSAweCUuOHgsICIKKwkJCQkibXRkLmVyYXNlcmVnaW9uc1slZF0gPSB7IC5vZmZzZXQgPSAweCVsbHgsICIKIAkJCQkiLmVyYXNlc2l6ZSA9IDB4JS44eCAoJXVLaUIpLCAiCiAJCQkJIi5udW1ibG9ja3MgPSAlZCB9XG4iLAotCQkJCWksIGZsYXNoLT5tdGQuZXJhc2VyZWdpb25zW2ldLm9mZnNldCwKKwkJCQlpLCAobG9uZyBsb25nKWZsYXNoLT5tdGQuZXJhc2VyZWdpb25zW2ldLm9mZnNldCwKIAkJCQlmbGFzaC0+bXRkLmVyYXNlcmVnaW9uc1tpXS5lcmFzZXNpemUsCiAJCQkJZmxhc2gtPm10ZC5lcmFzZXJlZ2lvbnNbaV0uZXJhc2VzaXplIC8gMTAyNCwKIAkJCQlmbGFzaC0+bXRkLmVyYXNlcmVnaW9uc1tpXS5udW1ibG9ja3MpOwpAQCAtNzIyLDEyICs3MjMsMTIgQEAKIAkJaWYgKG5yX3BhcnRzID4gMCkgewogCQkJZm9yIChpID0gMDsgaSA8IG5yX3BhcnRzOyBpKyspIHsKIAkJCQlERUJVRyhNVERfREVCVUdfTEVWRUwyLCAicGFydGl0aW9uc1slZF0gPSAiCi0JCQkJCSJ7Lm5hbWUgPSAlcywgLm9mZnNldCA9IDB4JS44eCwgIgotCQkJCQkJIi5zaXplID0gMHglLjh4ICgldUtpQikgfVxuIiwKKwkJCQkJInsubmFtZSA9ICVzLCAub2Zmc2V0ID0gMHglbGx4LCAiCisJCQkJCQkiLnNpemUgPSAweCVsbHggKCVsbGRLaUIpIH1cbiIsCiAJCQkJCWksIHBhcnRzW2ldLm5hbWUsCi0JCQkJCXBhcnRzW2ldLm9mZnNldCwKLQkJCQkJcGFydHNbaV0uc2l6ZSwKLQkJCQkJcGFydHNbaV0uc2l6ZSAvIDEwMjQpOworCQkJCQkobG9uZyBsb25nKXBhcnRzW2ldLm9mZnNldCwKKwkJCQkJKGxvbmcgbG9uZylwYXJ0c1tpXS5zaXplLAorCQkJCQkobG9uZyBsb25nKShwYXJ0c1tpXS5zaXplID4+IDEwKSk7CiAJCQl9CiAJCQlmbGFzaC0+cGFydGl0aW9uZWQgPSAxOwogCQkJcmV0dXJuIGFkZF9tdGRfcGFydGl0aW9ucygmZmxhc2gtPm10ZCwgcGFydHMsIG5yX3BhcnRzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL2RldmljZXMvbXRkX2RhdGFmbGFzaC5jIGIvZHJpdmVycy9tdGQvZGV2aWNlcy9tdGRfZGF0YWZsYXNoLmMKaW5kZXggNjUxMjZjZC4uZDQ0Zjc0MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvZGV2aWNlcy9tdGRfZGF0YWZsYXNoLmMKKysrIGIvZHJpdmVycy9tdGQvZGV2aWNlcy9tdGRfZGF0YWZsYXNoLmMKQEAgLTE2LDYgKzE2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L21hdGg2NC5oPgogCiAjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaS9mbGFzaC5oPgpAQCAtMTUyLDE1ICsxNTMsMjAgQEAKIAlzdHJ1Y3Qgc3BpX21lc3NhZ2UJbXNnOwogCXVuc2lnbmVkCQlibG9ja3NpemUgPSBwcml2LT5wYWdlX3NpemUgPDwgMzsKIAl1aW50OF90CQkJKmNvbW1hbmQ7CisJdWludDMyX3QJCXJlbTsKIAotCURFQlVHKE1URF9ERUJVR19MRVZFTDIsICIlczogZXJhc2UgYWRkcj0weCV4IGxlbiAweCV4XG4iLAotCQkJZGV2X25hbWUoJnNwaS0+ZGV2KSwKLQkJCWluc3RyLT5hZGRyLCBpbnN0ci0+bGVuKTsKKwlERUJVRyhNVERfREVCVUdfTEVWRUwyLCAiJXM6IGVyYXNlIGFkZHI9MHglbGx4IGxlbiAweCVsbHhcbiIsCisJICAgICAgZGV2X25hbWUoJnNwaS0+ZGV2KSwgKGxvbmcgbG9uZylpbnN0ci0+YWRkciwKKwkgICAgICAobG9uZyBsb25nKWluc3RyLT5sZW4pOwogCiAJLyogU2FuaXR5IGNoZWNrcyAqLwotCWlmICgoaW5zdHItPmFkZHIgKyBpbnN0ci0+bGVuKSA+IG10ZC0+c2l6ZQotCQkJfHwgKGluc3RyLT5sZW4gJSBwcml2LT5wYWdlX3NpemUpICE9IDAKLQkJCXx8IChpbnN0ci0+YWRkciAlIHByaXYtPnBhZ2Vfc2l6ZSkgIT0gMCkKKwlpZiAoaW5zdHItPmFkZHIgKyBpbnN0ci0+bGVuID4gbXRkLT5zaXplKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlkaXZfdTY0X3JlbShpbnN0ci0+bGVuLCBwcml2LT5wYWdlX3NpemUsICZyZW0pOworCWlmIChyZW0pCisJCXJldHVybiAtRUlOVkFMOworCWRpdl91NjRfcmVtKGluc3RyLT5hZGRyLCBwcml2LT5wYWdlX3NpemUsICZyZW0pOworCWlmIChyZW0pCiAJCXJldHVybiAtRUlOVkFMOwogCiAJc3BpX21lc3NhZ2VfaW5pdCgmbXNnKTsKQEAgLTE3OCw3ICsxODQsNyBAQAogCQkvKiBDYWxjdWxhdGUgZmxhc2ggcGFnZSBhZGRyZXNzOyB1c2UgYmxvY2sgZXJhc2UgKGZvciBzcGVlZCkgaWYKIAkJICogd2UncmUgYXQgYSBibG9jayBib3VuZGFyeSBhbmQgbmVlZCB0byBlcmFzZSB0aGUgd2hvbGUgYmxvY2suCiAJCSAqLwotCQlwYWdlYWRkciA9IGluc3RyLT5hZGRyIC8gcHJpdi0+cGFnZV9zaXplOworCQlwYWdlYWRkciA9IGRpdl91NjQoaW5zdHItPmxlbiwgcHJpdi0+cGFnZV9zaXplKTsKIAkJZG9fYmxvY2sgPSAocGFnZWFkZHIgJiAweDcpID09IDAgJiYgaW5zdHItPmxlbiA+PSBibG9ja3NpemU7CiAJCXBhZ2VhZGRyID0gcGFnZWFkZHIgPDwgcHJpdi0+cGFnZV9vZmZzZXQ7CiAKQEAgLTY2Nyw4ICs2NzMsOCBAQAogCWlmIChyZXZpc2lvbiA+PSAnYycpCiAJCW90cF90YWcgPSBvdHBfc2V0dXAoZGV2aWNlLCByZXZpc2lvbik7CiAKLQlkZXZfaW5mbygmc3BpLT5kZXYsICIlcyAoJWQgS0J5dGVzKSBwYWdlc2l6ZSAlZCBieXRlcyVzXG4iLAotCQkJbmFtZSwgRElWX1JPVU5EX1VQKGRldmljZS0+c2l6ZSwgMTAyNCksCisJZGV2X2luZm8oJnNwaS0+ZGV2LCAiJXMgKCVsbGQgS0J5dGVzKSBwYWdlc2l6ZSAlZCBieXRlcyVzXG4iLAorCQkJbmFtZSwgKGxvbmcgbG9uZykoKGRldmljZS0+c2l6ZSArIDEwMjMpID4+IDEwKSwKIAkJCXBhZ2VzaXplLCBvdHBfdGFnKTsKIAlkZXZfc2V0X2RydmRhdGEoJnNwaS0+ZGV2LCBwcml2KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvZGV2aWNlcy9wbWM1NTEuYyBiL2RyaXZlcnMvbXRkL2RldmljZXMvcG1jNTUxLmMKaW5kZXggZDM4YmNhNi4uZDJmZDU1MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvZGV2aWNlcy9wbWM1NTEuYworKysgYi9kcml2ZXJzL210ZC9kZXZpY2VzL3BtYzU1MS5jCkBAIC0zNCw3ICszNCw3IEBACiAgKglhcGVydHVyZSBzaXplLCBub3QgdGhlIGRyYW0gc2l6ZSwgYW5kIHRoZSBWMzcwUERDIHN1cHBsaWVzIG5vCiAgKglvdGhlciBtZXRob2QgZm9yIG1lbW9yeSBzaXplIGRpc2NvdmVyeS4gIFRoaXMgcHJvYmxlbSBpcwogICoJbW9zdGx5IG9ubHkgcmVsZXZhbnQgd2hlbiBjb21waWxlZCBhcyBhIG1vZHVsZSwgYXMgdGhlCi0gKgl1bmxvYWRpbmcgb2YgdGhlIG1vZHVsZSB3aXRoIGFuIGFwZXJ0dXJlIHNpemUgc21hbGxlciB0aGVuCisgKgl1bmxvYWRpbmcgb2YgdGhlIG1vZHVsZSB3aXRoIGFuIGFwZXJ0dXJlIHNpemUgc21hbGxlciB0aGFuCiAgKgl0aGUgcmFtIHdpbGwgY2F1c2UgdGhlIGRyaXZlciB0byBkZXRlY3QgdGhlIG9uYm9hcmQgbWVtb3J5CiAgKglzaXplIHRvIGJlIGVxdWFsIHRvIHRoZSBhcGVydHVyZSBzaXplIHdoZW4gdGhlIG1vZHVsZSBpcwogICoJcmVsb2FkZWQuICBTb29vbywgdG8gaGVscCwgdGhlIG1vZHVsZSBzdXBwb3J0cyBhbiBtc2l6ZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvZGV2aWNlcy9wczN2cmFtLmMgYi9kcml2ZXJzL210ZC9kZXZpY2VzL3BzM3ZyYW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjFlOWJlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tdGQvZGV2aWNlcy9wczN2cmFtLmMKQEAgLTAsMCArMSw3NjggQEAKKy8qKgorICogcHMzdnJhbSAtIFVzZSBleHRyYSBQUzMgdmlkZW8gcmFtIGFzIE1URCBibG9jayBkZXZpY2UuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMDggSmltIFBhcmlzIDxqaW1AanRhbi5jb20+CisgKiBBZGRlZCBzdXBwb3J0IFJTWCBETUEgVml2aWVuIENoYXBwZWxpZXIgPHZpdmllbi5jaGFwcGVsaWVyQGZyZWUuZnI+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9nZnAuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L210ZC9tdGQuaD4KKworI2luY2x1ZGUgPGFzbS9sdjFjYWxsLmg+CisjaW5jbHVkZSA8YXNtL3BzMy5oPgorCisjZGVmaW5lIERFVklDRV9OQU1FCQkicHMzdnJhbSIKKworI2RlZmluZSBYRFJfQlVGX1NJWkUgKDIgKiAxMDI0ICogMTAyNCkgLyogWERSIGJ1ZmZlciAobXVzdCBiZSAxTWlCIGFsaWduZWQpICovCisjZGVmaW5lIFhEUl9JT0lGIDB4MGMwMDAwMDAKKworI2RlZmluZSBGSUZPX0JBU0UgWERSX0lPSUYKKyNkZWZpbmUgRklGT19TSVpFICg2NCAqIDEwMjQpCisKKyNkZWZpbmUgRE1BX1BBR0VfU0laRSAoNCAqIDEwMjQpCisKKyNkZWZpbmUgQ0FDSEVfUEFHRV9TSVpFICgyNTYgKiAxMDI0KQorI2RlZmluZSBDQUNIRV9QQUdFX0NPVU5UICgoWERSX0JVRl9TSVpFIC0gRklGT19TSVpFKSAvIENBQ0hFX1BBR0VfU0laRSkKKworI2RlZmluZSBDQUNIRV9PRkZTRVQgQ0FDSEVfUEFHRV9TSVpFCisjZGVmaW5lIEZJRk9fT0ZGU0VUIDAKKworI2RlZmluZSBDVFJMX1BVVCAweDEwCisjZGVmaW5lIENUUkxfR0VUIDB4MTEKKyNkZWZpbmUgQ1RSTF9UT1AgMHgxNQorCisjZGVmaW5lIFVQTE9BRF9TVUJDSAkxCisjZGVmaW5lIERPV05MT0FEX1NVQkNICTIKKworI2RlZmluZSBOVl9NRU1PUllfVE9fTUVNT1JZX0ZPUk1BVF9PRkZTRVRfSU4JMHgwMDAwMDMwYworI2RlZmluZSBOVl9NRU1PUllfVE9fTUVNT1JZX0ZPUk1BVF9OT1RJRlkJMHgwMDAwMDEwNAorCisjZGVmaW5lIEwxR1BVX0NPTlRFWFRfQVRUUklCVVRFX0ZCX0JMSVQgMHg2MDEKKworc3RydWN0IG10ZF9pbmZvIHBzM3ZyYW1fbXRkOworCisjZGVmaW5lIENBQ0hFX1BBR0VfUFJFU0VOVCAxCisjZGVmaW5lIENBQ0hFX1BBR0VfRElSVFkgICAyCisKK3N0cnVjdCBwczN2cmFtX3RhZyB7CisJdW5zaWduZWQgaW50IGFkZHJlc3M7CisJdW5zaWduZWQgaW50IGZsYWdzOworfTsKKworc3RydWN0IHBzM3ZyYW1fY2FjaGUgeworCXVuc2lnbmVkIGludCBwYWdlX2NvdW50OworCXVuc2lnbmVkIGludCBwYWdlX3NpemU7CisJc3RydWN0IHBzM3ZyYW1fdGFnICp0YWdzOworfTsKKworc3RydWN0IHBzM3ZyYW1fcHJpdiB7CisJdTY0IG1lbW9yeV9oYW5kbGU7CisJdTY0IGNvbnRleHRfaGFuZGxlOworCXUzMiAqY3RybDsKKwl1MzIgKnJlcG9ydHM7CisJdTggX19pb21lbSAqZGRyX2Jhc2U7CisJdTggKnhkcl9idWY7CisKKwl1MzIgKmZpZm9fYmFzZTsKKwl1MzIgKmZpZm9fcHRyOworCisJc3RydWN0IGRldmljZSAqZGV2OworCXN0cnVjdCBwczN2cmFtX2NhY2hlIGNhY2hlOworCisJLyogVXNlZCB0byBzZXJpYWxpemUgY2FjaGUvRE1BIG9wZXJhdGlvbnMgKi8KKwlzdHJ1Y3QgbXV0ZXggbG9jazsKK307CisKKyNkZWZpbmUgRE1BX05PVElGSUVSX0hBTkRMRV9CQVNFIDB4NjY2MDQyMDAgLyogZmlyc3QgRE1BIG5vdGlmaWVyIGhhbmRsZSAqLworI2RlZmluZSBETUFfTk9USUZJRVJfT0ZGU0VUX0JBU0UgMHgxMDAwICAgICAvKiBmaXJzdCBETUEgbm90aWZpZXIgb2Zmc2V0ICovCisjZGVmaW5lIERNQV9OT1RJRklFUl9TSVpFICAgICAgICAweDQwCisjZGVmaW5lIE5PVElGSUVSIDcJLyogbm90aWZpZXIgdXNlZCBmb3IgY29tcGxldGlvbiByZXBvcnQgKi8KKworLyogQSB0cmFpbGluZyAnLScgbWVhbnMgdG8gc3VidHJhY3Qgb2ZmIHBzM2ZiX3ZpZGVvbWVtb3J5LnNpemUgKi8KK2NoYXIgKnNpemUgPSAiMjU2TS0iOworbW9kdWxlX3BhcmFtKHNpemUsIGNoYXJwLCAwKTsKK01PRFVMRV9QQVJNX0RFU0Moc2l6ZSwgIm1lbW9yeSBzaXplIik7CisKK3N0YXRpYyB1MzIgKnBzM3ZyYW1fZ2V0X25vdGlmaWVyKHUzMiAqcmVwb3J0cywgaW50IG5vdGlmaWVyKQoreworCXJldHVybiAodm9pZCAqKSByZXBvcnRzICsKKwkJRE1BX05PVElGSUVSX09GRlNFVF9CQVNFICsKKwkJRE1BX05PVElGSUVSX1NJWkUgKiBub3RpZmllcjsKK30KKworc3RhdGljIHZvaWQgcHMzdnJhbV9ub3RpZmllcl9yZXNldChzdHJ1Y3QgbXRkX2luZm8gKm10ZCkKK3sKKwlpbnQgaTsKKworCXN0cnVjdCBwczN2cmFtX3ByaXYgKnByaXYgPSBtdGQtPnByaXY7CisJdTMyICpub3RpZnkgPSBwczN2cmFtX2dldF9ub3RpZmllcihwcml2LT5yZXBvcnRzLCBOT1RJRklFUik7CisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKwkJbm90aWZ5W2ldID0gMHhmZmZmZmZmZjsKK30KKworc3RhdGljIGludCBwczN2cmFtX25vdGlmaWVyX3dhaXQoc3RydWN0IG10ZF9pbmZvICptdGQsIHVuc2lnbmVkIGludCB0aW1lb3V0X21zKQoreworCXN0cnVjdCBwczN2cmFtX3ByaXYgKnByaXYgPSBtdGQtPnByaXY7CisJdTMyICpub3RpZnkgPSBwczN2cmFtX2dldF9ub3RpZmllcihwcml2LT5yZXBvcnRzLCBOT1RJRklFUik7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0ID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXModGltZW91dF9tcyk7CisKKwlkbyB7CisJCWlmICghbm90aWZ5WzNdKQorCQkJcmV0dXJuIDA7CisJCW1zbGVlcCgxKTsKKwl9IHdoaWxlICh0aW1lX2JlZm9yZShqaWZmaWVzLCB0aW1lb3V0KSk7CisKKwlyZXR1cm4gLUVUSU1FRE9VVDsKK30KKworc3RhdGljIHZvaWQgcHMzdnJhbV9pbml0X3Jpbmcoc3RydWN0IG10ZF9pbmZvICptdGQpCit7CisJc3RydWN0IHBzM3ZyYW1fcHJpdiAqcHJpdiA9IG10ZC0+cHJpdjsKKworCXByaXYtPmN0cmxbQ1RSTF9QVVRdID0gRklGT19CQVNFICsgRklGT19PRkZTRVQ7CisJcHJpdi0+Y3RybFtDVFJMX0dFVF0gPSBGSUZPX0JBU0UgKyBGSUZPX09GRlNFVDsKK30KKworc3RhdGljIGludCBwczN2cmFtX3dhaXRfcmluZyhzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgdW5zaWduZWQgaW50IHRpbWVvdXRfbXMpCit7CisJc3RydWN0IHBzM3ZyYW1fcHJpdiAqcHJpdiA9IG10ZC0+cHJpdjsKKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyh0aW1lb3V0X21zKTsKKworCWRvIHsKKwkJaWYgKHByaXYtPmN0cmxbQ1RSTF9QVVRdID09IHByaXYtPmN0cmxbQ1RSTF9HRVRdKQorCQkJcmV0dXJuIDA7CisJCW1zbGVlcCgxKTsKKwl9IHdoaWxlICh0aW1lX2JlZm9yZShqaWZmaWVzLCB0aW1lb3V0KSk7CisKKwlkZXZfZGJnKHByaXYtPmRldiwgIiVzOiVkOiBGSUZPIHRpbWVvdXQgKCUwOHgvJTA4eC8lMDh4KVxuIiwgX19mdW5jX18sCisJCV9fTElORV9fLCBwcml2LT5jdHJsW0NUUkxfUFVUXSwgcHJpdi0+Y3RybFtDVFJMX0dFVF0sCisJCXByaXYtPmN0cmxbQ1RSTF9UT1BdKTsKKworCXJldHVybiAtRVRJTUVET1VUOworfQorCitzdGF0aWMgdm9pZCBwczN2cmFtX291dF9yaW5nKHN0cnVjdCBwczN2cmFtX3ByaXYgKnByaXYsIHUzMiBkYXRhKQoreworCSoocHJpdi0+Zmlmb19wdHIpKysgPSBkYXRhOworfQorCitzdGF0aWMgdm9pZCBwczN2cmFtX2JlZ2luX3Jpbmcoc3RydWN0IHBzM3ZyYW1fcHJpdiAqcHJpdiwgdTMyIGNoYW4sCisJCQkJICAgICAgdTMyIHRhZywgdTMyIHNpemUpCit7CisJcHMzdnJhbV9vdXRfcmluZyhwcml2LCAoc2l6ZSA8PCAxOCkgfCAoY2hhbiA8PCAxMykgfCB0YWcpOworfQorCitzdGF0aWMgdm9pZCBwczN2cmFtX3Jld2luZF9yaW5nKHN0cnVjdCBtdGRfaW5mbyAqbXRkKQoreworCXN0cnVjdCBwczN2cmFtX3ByaXYgKnByaXYgPSBtdGQtPnByaXY7CisJdTY0IHN0YXR1czsKKworCXBzM3ZyYW1fb3V0X3JpbmcocHJpdiwgMHgyMDAwMDAwMCB8IChGSUZPX0JBU0UgKyBGSUZPX09GRlNFVCkpOworCisJcHJpdi0+Y3RybFtDVFJMX1BVVF0gPSBGSUZPX0JBU0UgKyBGSUZPX09GRlNFVDsKKworCS8qIGFza2luZyB0aGUgSFYgZm9yIGEgYmxpdCB3aWxsIGtpY2sgdGhlIGZpZm8gKi8KKwlzdGF0dXMgPSBsdjFfZ3B1X2NvbnRleHRfYXR0cmlidXRlKHByaXYtPmNvbnRleHRfaGFuZGxlLAorCQkJCQkgICBMMUdQVV9DT05URVhUX0FUVFJJQlVURV9GQl9CTElULAorCQkJCQkgICAwLCAwLCAwLCAwKTsKKwlpZiAoc3RhdHVzKQorCQlkZXZfZXJyKHByaXYtPmRldiwgIiVzOiVkOiBsdjFfZ3B1X2NvbnRleHRfYXR0cmlidXRlIGZhaWxlZFxuIiwKKwkJCV9fZnVuY19fLCBfX0xJTkVfXyk7CisKKwlwcml2LT5maWZvX3B0ciA9IHByaXYtPmZpZm9fYmFzZTsKK30KKworc3RhdGljIHZvaWQgcHMzdnJhbV9maXJlX3Jpbmcoc3RydWN0IG10ZF9pbmZvICptdGQpCit7CisJc3RydWN0IHBzM3ZyYW1fcHJpdiAqcHJpdiA9IG10ZC0+cHJpdjsKKwl1NjQgc3RhdHVzOworCisJbXV0ZXhfbG9jaygmcHMzX2dwdV9tdXRleCk7CisKKwlwcml2LT5jdHJsW0NUUkxfUFVUXSA9IEZJRk9fQkFTRSArIEZJRk9fT0ZGU0VUICsKKwkJKHByaXYtPmZpZm9fcHRyIC0gcHJpdi0+Zmlmb19iYXNlKSAqIHNpemVvZih1MzIpOworCisJLyogYXNraW5nIHRoZSBIViBmb3IgYSBibGl0IHdpbGwga2ljayB0aGUgZmlmbyAqLworCXN0YXR1cyA9IGx2MV9ncHVfY29udGV4dF9hdHRyaWJ1dGUocHJpdi0+Y29udGV4dF9oYW5kbGUsCisJCQkJCSAgIEwxR1BVX0NPTlRFWFRfQVRUUklCVVRFX0ZCX0JMSVQsCisJCQkJCSAgIDAsIDAsIDAsIDApOworCWlmIChzdGF0dXMpCisJCWRldl9lcnIocHJpdi0+ZGV2LCAiJXM6JWQ6IGx2MV9ncHVfY29udGV4dF9hdHRyaWJ1dGUgZmFpbGVkXG4iLAorCQkJX19mdW5jX18sIF9fTElORV9fKTsKKworCWlmICgocHJpdi0+Zmlmb19wdHIgLSBwcml2LT5maWZvX2Jhc2UpICogc2l6ZW9mKHUzMikgPgorCQlGSUZPX1NJWkUgLSAxMDI0KSB7CisJCWRldl9kYmcocHJpdi0+ZGV2LCAiJXM6JWQ6IGZpZm8gZnVsbCwgcmV3aW5kaW5nXG4iLCBfX2Z1bmNfXywKKwkJCV9fTElORV9fKTsKKwkJcHMzdnJhbV93YWl0X3JpbmcobXRkLCAyMDApOworCQlwczN2cmFtX3Jld2luZF9yaW5nKG10ZCk7CisJfQorCisJbXV0ZXhfdW5sb2NrKCZwczNfZ3B1X211dGV4KTsKK30KKworc3RhdGljIHZvaWQgcHMzdnJhbV9iaW5kKHN0cnVjdCBtdGRfaW5mbyAqbXRkKQoreworCXN0cnVjdCBwczN2cmFtX3ByaXYgKnByaXYgPSBtdGQtPnByaXY7CisKKwlwczN2cmFtX2JlZ2luX3JpbmcocHJpdiwgVVBMT0FEX1NVQkNILCAwLCAxKTsKKwlwczN2cmFtX291dF9yaW5nKHByaXYsIDB4MzEzMzczMDMpOworCXBzM3ZyYW1fYmVnaW5fcmluZyhwcml2LCBVUExPQURfU1VCQ0gsIDB4MTgwLCAzKTsKKwlwczN2cmFtX291dF9yaW5nKHByaXYsIERNQV9OT1RJRklFUl9IQU5ETEVfQkFTRSArIE5PVElGSUVSKTsKKwlwczN2cmFtX291dF9yaW5nKHByaXYsIDB4ZmVlZDAwMDEpOwkvKiBETUEgc3lzdGVtIFJBTSBpbnN0YW5jZSAqLworCXBzM3ZyYW1fb3V0X3JpbmcocHJpdiwgMHhmZWVkMDAwMCk7ICAgICAvKiBETUEgdmlkZW8gUkFNIGluc3RhbmNlICovCisKKwlwczN2cmFtX2JlZ2luX3JpbmcocHJpdiwgRE9XTkxPQURfU1VCQ0gsIDAsIDEpOworCXBzM3ZyYW1fb3V0X3JpbmcocHJpdiwgMHgzMTM3YzBkZSk7CisJcHMzdnJhbV9iZWdpbl9yaW5nKHByaXYsIERPV05MT0FEX1NVQkNILCAweDE4MCwgMyk7CisJcHMzdnJhbV9vdXRfcmluZyhwcml2LCBETUFfTk9USUZJRVJfSEFORExFX0JBU0UgKyBOT1RJRklFUik7CisJcHMzdnJhbV9vdXRfcmluZyhwcml2LCAweGZlZWQwMDAwKTsJLyogRE1BIHZpZGVvIFJBTSBpbnN0YW5jZSAqLworCXBzM3ZyYW1fb3V0X3JpbmcocHJpdiwgMHhmZWVkMDAwMSk7CS8qIERNQSBzeXN0ZW0gUkFNIGluc3RhbmNlICovCisKKwlwczN2cmFtX2ZpcmVfcmluZyhtdGQpOworfQorCitzdGF0aWMgaW50IHBzM3ZyYW1fdXBsb2FkKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCB1bnNpZ25lZCBpbnQgc3JjX29mZnNldCwKKwkJCSAgdW5zaWduZWQgaW50IGRzdF9vZmZzZXQsIGludCBsZW4sIGludCBjb3VudCkKK3sKKwlzdHJ1Y3QgcHMzdnJhbV9wcml2ICpwcml2ID0gbXRkLT5wcml2OworCisJcHMzdnJhbV9iZWdpbl9yaW5nKHByaXYsIFVQTE9BRF9TVUJDSCwKKwkJCSAgIE5WX01FTU9SWV9UT19NRU1PUllfRk9STUFUX09GRlNFVF9JTiwgOCk7CisJcHMzdnJhbV9vdXRfcmluZyhwcml2LCBYRFJfSU9JRiArIHNyY19vZmZzZXQpOworCXBzM3ZyYW1fb3V0X3JpbmcocHJpdiwgZHN0X29mZnNldCk7CisJcHMzdnJhbV9vdXRfcmluZyhwcml2LCBsZW4pOworCXBzM3ZyYW1fb3V0X3JpbmcocHJpdiwgbGVuKTsKKwlwczN2cmFtX291dF9yaW5nKHByaXYsIGxlbik7CisJcHMzdnJhbV9vdXRfcmluZyhwcml2LCBjb3VudCk7CisJcHMzdnJhbV9vdXRfcmluZyhwcml2LCAoMSA8PCA4KSB8IDEpOworCXBzM3ZyYW1fb3V0X3JpbmcocHJpdiwgMCk7CisKKwlwczN2cmFtX25vdGlmaWVyX3Jlc2V0KG10ZCk7CisJcHMzdnJhbV9iZWdpbl9yaW5nKHByaXYsIFVQTE9BRF9TVUJDSCwKKwkJCSAgIE5WX01FTU9SWV9UT19NRU1PUllfRk9STUFUX05PVElGWSwgMSk7CisJcHMzdnJhbV9vdXRfcmluZyhwcml2LCAwKTsKKwlwczN2cmFtX2JlZ2luX3JpbmcocHJpdiwgVVBMT0FEX1NVQkNILCAweDEwMCwgMSk7CisJcHMzdnJhbV9vdXRfcmluZyhwcml2LCAwKTsKKwlwczN2cmFtX2ZpcmVfcmluZyhtdGQpOworCWlmIChwczN2cmFtX25vdGlmaWVyX3dhaXQobXRkLCAyMDApIDwgMCkgeworCQlkZXZfZGJnKHByaXYtPmRldiwgIiVzOiVkOiBub3RpZmllciB0aW1lb3V0XG4iLCBfX2Z1bmNfXywKKwkJCV9fTElORV9fKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBzM3ZyYW1fZG93bmxvYWQoc3RydWN0IG10ZF9pbmZvICptdGQsIHVuc2lnbmVkIGludCBzcmNfb2Zmc2V0LAorCQkJICAgIHVuc2lnbmVkIGludCBkc3Rfb2Zmc2V0LCBpbnQgbGVuLCBpbnQgY291bnQpCit7CisJc3RydWN0IHBzM3ZyYW1fcHJpdiAqcHJpdiA9IG10ZC0+cHJpdjsKKworCXBzM3ZyYW1fYmVnaW5fcmluZyhwcml2LCBET1dOTE9BRF9TVUJDSCwKKwkJCSAgIE5WX01FTU9SWV9UT19NRU1PUllfRk9STUFUX09GRlNFVF9JTiwgOCk7CisJcHMzdnJhbV9vdXRfcmluZyhwcml2LCBzcmNfb2Zmc2V0KTsKKwlwczN2cmFtX291dF9yaW5nKHByaXYsIFhEUl9JT0lGICsgZHN0X29mZnNldCk7CisJcHMzdnJhbV9vdXRfcmluZyhwcml2LCBsZW4pOworCXBzM3ZyYW1fb3V0X3JpbmcocHJpdiwgbGVuKTsKKwlwczN2cmFtX291dF9yaW5nKHByaXYsIGxlbik7CisJcHMzdnJhbV9vdXRfcmluZyhwcml2LCBjb3VudCk7CisJcHMzdnJhbV9vdXRfcmluZyhwcml2LCAoMSA8PCA4KSB8IDEpOworCXBzM3ZyYW1fb3V0X3JpbmcocHJpdiwgMCk7CisKKwlwczN2cmFtX25vdGlmaWVyX3Jlc2V0KG10ZCk7CisJcHMzdnJhbV9iZWdpbl9yaW5nKHByaXYsIERPV05MT0FEX1NVQkNILAorCQkJICAgTlZfTUVNT1JZX1RPX01FTU9SWV9GT1JNQVRfTk9USUZZLCAxKTsKKwlwczN2cmFtX291dF9yaW5nKHByaXYsIDApOworCXBzM3ZyYW1fYmVnaW5fcmluZyhwcml2LCBET1dOTE9BRF9TVUJDSCwgMHgxMDAsIDEpOworCXBzM3ZyYW1fb3V0X3JpbmcocHJpdiwgMCk7CisJcHMzdnJhbV9maXJlX3JpbmcobXRkKTsKKwlpZiAocHMzdnJhbV9ub3RpZmllcl93YWl0KG10ZCwgMjAwKSA8IDApIHsKKwkJZGV2X2RiZyhwcml2LT5kZXYsICIlczolZDogbm90aWZpZXIgdGltZW91dFxuIiwgX19mdW5jX18sCisJCQlfX0xJTkVfXyk7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcHMzdnJhbV9jYWNoZV9ldmljdChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgaW50IGVudHJ5KQoreworCXN0cnVjdCBwczN2cmFtX3ByaXYgKnByaXYgPSBtdGQtPnByaXY7CisJc3RydWN0IHBzM3ZyYW1fY2FjaGUgKmNhY2hlID0gJnByaXYtPmNhY2hlOworCisJaWYgKGNhY2hlLT50YWdzW2VudHJ5XS5mbGFncyAmIENBQ0hFX1BBR0VfRElSVFkpIHsKKwkJZGV2X2RiZyhwcml2LT5kZXYsICIlczolZDogZmx1c2hpbmcgJWQgOiAweCUwOHhcbiIsIF9fZnVuY19fLAorCQkJX19MSU5FX18sIGVudHJ5LCBjYWNoZS0+dGFnc1tlbnRyeV0uYWRkcmVzcyk7CisJCWlmIChwczN2cmFtX3VwbG9hZChtdGQsCisJCQkJICAgQ0FDSEVfT0ZGU0VUICsgZW50cnkgKiBjYWNoZS0+cGFnZV9zaXplLAorCQkJCSAgIGNhY2hlLT50YWdzW2VudHJ5XS5hZGRyZXNzLAorCQkJCSAgIERNQV9QQUdFX1NJWkUsCisJCQkJICAgY2FjaGUtPnBhZ2Vfc2l6ZSAvIERNQV9QQUdFX1NJWkUpIDwgMCkgeworCQkJZGV2X2RiZyhwcml2LT5kZXYsICIlczolZDogZmFpbGVkIHRvIHVwbG9hZCBmcm9tICIKKwkJCQkiMHgleCB0byAweCV4IHNpemUgMHgleFxuIiwgX19mdW5jX18sIF9fTElORV9fLAorCQkJCWVudHJ5ICogY2FjaGUtPnBhZ2Vfc2l6ZSwKKwkJCQljYWNoZS0+dGFnc1tlbnRyeV0uYWRkcmVzcywgY2FjaGUtPnBhZ2Vfc2l6ZSk7CisJCX0KKwkJY2FjaGUtPnRhZ3NbZW50cnldLmZsYWdzICY9IH5DQUNIRV9QQUdFX0RJUlRZOworCX0KK30KKworc3RhdGljIHZvaWQgcHMzdnJhbV9jYWNoZV9sb2FkKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBpbnQgZW50cnksCisJCQkgICAgICAgdW5zaWduZWQgaW50IGFkZHJlc3MpCit7CisJc3RydWN0IHBzM3ZyYW1fcHJpdiAqcHJpdiA9IG10ZC0+cHJpdjsKKwlzdHJ1Y3QgcHMzdnJhbV9jYWNoZSAqY2FjaGUgPSAmcHJpdi0+Y2FjaGU7CisKKwlkZXZfZGJnKHByaXYtPmRldiwgIiVzOiVkOiBmZXRjaGluZyAlZCA6IDB4JTA4eFxuIiwgX19mdW5jX18sIF9fTElORV9fLAorCQllbnRyeSwgYWRkcmVzcyk7CisJaWYgKHBzM3ZyYW1fZG93bmxvYWQobXRkLAorCQkJICAgICBhZGRyZXNzLAorCQkJICAgICBDQUNIRV9PRkZTRVQgKyBlbnRyeSAqIGNhY2hlLT5wYWdlX3NpemUsCisJCQkgICAgIERNQV9QQUdFX1NJWkUsCisJCQkgICAgIGNhY2hlLT5wYWdlX3NpemUgLyBETUFfUEFHRV9TSVpFKSA8IDApIHsKKwkJZGV2X2Vycihwcml2LT5kZXYsICIlczolZDogZmFpbGVkIHRvIGRvd25sb2FkIGZyb20gIgorCQkJIjB4JXggdG8gMHgleCBzaXplIDB4JXhcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywgYWRkcmVzcywKKwkJCWVudHJ5ICogY2FjaGUtPnBhZ2Vfc2l6ZSwgY2FjaGUtPnBhZ2Vfc2l6ZSk7CisJfQorCisJY2FjaGUtPnRhZ3NbZW50cnldLmFkZHJlc3MgPSBhZGRyZXNzOworCWNhY2hlLT50YWdzW2VudHJ5XS5mbGFncyB8PSBDQUNIRV9QQUdFX1BSRVNFTlQ7Cit9CisKKworc3RhdGljIHZvaWQgcHMzdnJhbV9jYWNoZV9mbHVzaChzdHJ1Y3QgbXRkX2luZm8gKm10ZCkKK3sKKwlzdHJ1Y3QgcHMzdnJhbV9wcml2ICpwcml2ID0gbXRkLT5wcml2OworCXN0cnVjdCBwczN2cmFtX2NhY2hlICpjYWNoZSA9ICZwcml2LT5jYWNoZTsKKwlpbnQgaTsKKworCWRldl9kYmcocHJpdi0+ZGV2LCAiJXM6JWQ6IEZMVVNIXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCWZvciAoaSA9IDA7IGkgPCBjYWNoZS0+cGFnZV9jb3VudDsgaSsrKSB7CisJCXBzM3ZyYW1fY2FjaGVfZXZpY3QobXRkLCBpKTsKKwkJY2FjaGUtPnRhZ3NbaV0uZmxhZ3MgPSAwOworCX0KK30KKworc3RhdGljIHVuc2lnbmVkIGludCBwczN2cmFtX2NhY2hlX21hdGNoKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBsb2ZmX3QgYWRkcmVzcykKK3sKKwlzdHJ1Y3QgcHMzdnJhbV9wcml2ICpwcml2ID0gbXRkLT5wcml2OworCXN0cnVjdCBwczN2cmFtX2NhY2hlICpjYWNoZSA9ICZwcml2LT5jYWNoZTsKKwl1bnNpZ25lZCBpbnQgYmFzZTsKKwl1bnNpZ25lZCBpbnQgb2Zmc2V0OworCWludCBpOworCXN0YXRpYyBpbnQgY291bnRlcjsKKworCW9mZnNldCA9ICh1bnNpZ25lZCBpbnQpIChhZGRyZXNzICYgKGNhY2hlLT5wYWdlX3NpemUgLSAxKSk7CisJYmFzZSA9ICh1bnNpZ25lZCBpbnQpIChhZGRyZXNzIC0gb2Zmc2V0KTsKKworCS8qIGZ1bGx5IGFzc29jaWF0aXZlIGNoZWNrICovCisJZm9yIChpID0gMDsgaSA8IGNhY2hlLT5wYWdlX2NvdW50OyBpKyspIHsKKwkJaWYgKChjYWNoZS0+dGFnc1tpXS5mbGFncyAmIENBQ0hFX1BBR0VfUFJFU0VOVCkgJiYKKwkJICAgIGNhY2hlLT50YWdzW2ldLmFkZHJlc3MgPT0gYmFzZSkgeworCQkJZGV2X2RiZyhwcml2LT5kZXYsICIlczolZDogZm91bmQgZW50cnkgJWQgOiAweCUwOHhcbiIsCisJCQkJX19mdW5jX18sIF9fTElORV9fLCBpLCBjYWNoZS0+dGFnc1tpXS5hZGRyZXNzKTsKKwkJCXJldHVybiBpOworCQl9CisJfQorCisJLyogY2hvb3NlIGEgcmFuZG9tIGVudHJ5ICovCisJaSA9IChqaWZmaWVzICsgKGNvdW50ZXIrKykpICUgY2FjaGUtPnBhZ2VfY291bnQ7CisJZGV2X2RiZyhwcml2LT5kZXYsICIlczolZDogdXNpbmcgZW50cnkgJWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywgaSk7CisKKwlwczN2cmFtX2NhY2hlX2V2aWN0KG10ZCwgaSk7CisJcHMzdnJhbV9jYWNoZV9sb2FkKG10ZCwgaSwgYmFzZSk7CisKKwlyZXR1cm4gaTsKK30KKworc3RhdGljIGludCBwczN2cmFtX2NhY2hlX2luaXQoc3RydWN0IG10ZF9pbmZvICptdGQpCit7CisJc3RydWN0IHBzM3ZyYW1fcHJpdiAqcHJpdiA9IG10ZC0+cHJpdjsKKworCXByaXYtPmNhY2hlLnBhZ2VfY291bnQgPSBDQUNIRV9QQUdFX0NPVU5UOworCXByaXYtPmNhY2hlLnBhZ2Vfc2l6ZSA9IENBQ0hFX1BBR0VfU0laRTsKKwlwcml2LT5jYWNoZS50YWdzID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHBzM3ZyYW1fdGFnKSAqCisJCQkJICAgQ0FDSEVfUEFHRV9DT1VOVCwgR0ZQX0tFUk5FTCk7CisJaWYgKHByaXYtPmNhY2hlLnRhZ3MgPT0gTlVMTCkgeworCQlkZXZfZXJyKHByaXYtPmRldiwgIiVzOiVkOiBjb3VsZCBub3QgYWxsb2NhdGUgY2FjaGUgdGFnc1xuIiwKKwkJCV9fZnVuY19fLCBfX0xJTkVfXyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWRldl9pbmZvKHByaXYtPmRldiwgImNyZWF0ZWQgcmFtIGNhY2hlOiAlZCBlbnRyaWVzLCAlZCBLaUIgZWFjaFxuIiwKKwkJQ0FDSEVfUEFHRV9DT1VOVCwgQ0FDSEVfUEFHRV9TSVpFIC8gMTAyNCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcHMzdnJhbV9jYWNoZV9jbGVhbnVwKHN0cnVjdCBtdGRfaW5mbyAqbXRkKQoreworCXN0cnVjdCBwczN2cmFtX3ByaXYgKnByaXYgPSBtdGQtPnByaXY7CisKKwlwczN2cmFtX2NhY2hlX2ZsdXNoKG10ZCk7CisJa2ZyZWUocHJpdi0+Y2FjaGUudGFncyk7Cit9CisKK3N0YXRpYyBpbnQgcHMzdnJhbV9lcmFzZShzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgc3RydWN0IGVyYXNlX2luZm8gKmluc3RyKQoreworCXN0cnVjdCBwczN2cmFtX3ByaXYgKnByaXYgPSBtdGQtPnByaXY7CisKKwlpZiAoaW5zdHItPmFkZHIgKyBpbnN0ci0+bGVuID4gbXRkLT5zaXplKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW11dGV4X2xvY2soJnByaXYtPmxvY2spOworCisJcHMzdnJhbV9jYWNoZV9mbHVzaChtdGQpOworCisJLyogU2V0IGJ5dGVzIHRvIDB4RkYgKi8KKwltZW1zZXRfaW8ocHJpdi0+ZGRyX2Jhc2UgKyBpbnN0ci0+YWRkciwgMHhGRiwgaW5zdHItPmxlbik7CisKKwltdXRleF91bmxvY2soJnByaXYtPmxvY2spOworCisJaW5zdHItPnN0YXRlID0gTVREX0VSQVNFX0RPTkU7CisJbXRkX2VyYXNlX2NhbGxiYWNrKGluc3RyKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBzM3ZyYW1fcmVhZChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgbG9mZl90IGZyb20sIHNpemVfdCBsZW4sCisJCQlzaXplX3QgKnJldGxlbiwgdV9jaGFyICpidWYpCit7CisJc3RydWN0IHBzM3ZyYW1fcHJpdiAqcHJpdiA9IG10ZC0+cHJpdjsKKwl1bnNpZ25lZCBpbnQgY2FjaGVkLCBjb3VudDsKKworCWRldl9kYmcocHJpdi0+ZGV2LCAiJXM6JWQ6IGZyb209MHglMDh4IGxlbj0weCV6eFxuIiwgX19mdW5jX18sIF9fTElORV9fLAorCQkodW5zaWduZWQgaW50KWZyb20sIGxlbik7CisKKwlpZiAoZnJvbSA+PSBtdGQtPnNpemUpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGxlbiA+IG10ZC0+c2l6ZSAtIGZyb20pCisJCWxlbiA9IG10ZC0+c2l6ZSAtIGZyb207CisKKwkvKiBDb3B5IGZyb20gdnJhbSB0byBidWYgKi8KKwljb3VudCA9IGxlbjsKKwl3aGlsZSAoY291bnQpIHsKKwkJdW5zaWduZWQgaW50IG9mZnNldCwgYXZhaWw7CisJCXVuc2lnbmVkIGludCBlbnRyeTsKKworCQlvZmZzZXQgPSAodW5zaWduZWQgaW50KSAoZnJvbSAmIChwcml2LT5jYWNoZS5wYWdlX3NpemUgLSAxKSk7CisJCWF2YWlsICA9IHByaXYtPmNhY2hlLnBhZ2Vfc2l6ZSAtIG9mZnNldDsKKworCQltdXRleF9sb2NrKCZwcml2LT5sb2NrKTsKKworCQllbnRyeSA9IHBzM3ZyYW1fY2FjaGVfbWF0Y2gobXRkLCBmcm9tKTsKKwkJY2FjaGVkID0gQ0FDSEVfT0ZGU0VUICsgZW50cnkgKiBwcml2LT5jYWNoZS5wYWdlX3NpemUgKyBvZmZzZXQ7CisKKwkJZGV2X2RiZyhwcml2LT5kZXYsICIlczolZDogZnJvbT0lMDh4IGNhY2hlZD0lMDh4IG9mZnNldD0lMDh4ICIKKwkJCSJhdmFpbD0lMDh4IGNvdW50PSUwOHhcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywKKwkJCSh1bnNpZ25lZCBpbnQpZnJvbSwgY2FjaGVkLCBvZmZzZXQsIGF2YWlsLCBjb3VudCk7CisKKwkJaWYgKGF2YWlsID4gY291bnQpCisJCQlhdmFpbCA9IGNvdW50OworCQltZW1jcHkoYnVmLCBwcml2LT54ZHJfYnVmICsgY2FjaGVkLCBhdmFpbCk7CisKKwkJbXV0ZXhfdW5sb2NrKCZwcml2LT5sb2NrKTsKKworCQlidWYgKz0gYXZhaWw7CisJCWNvdW50IC09IGF2YWlsOworCQlmcm9tICs9IGF2YWlsOworCX0KKworCSpyZXRsZW4gPSBsZW47CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcHMzdnJhbV93cml0ZShzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgbG9mZl90IHRvLCBzaXplX3QgbGVuLAorCQkJIHNpemVfdCAqcmV0bGVuLCBjb25zdCB1X2NoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgcHMzdnJhbV9wcml2ICpwcml2ID0gbXRkLT5wcml2OworCXVuc2lnbmVkIGludCBjYWNoZWQsIGNvdW50OworCisJaWYgKHRvID49IG10ZC0+c2l6ZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAobGVuID4gbXRkLT5zaXplIC0gdG8pCisJCWxlbiA9IG10ZC0+c2l6ZSAtIHRvOworCisJLyogQ29weSBmcm9tIGJ1ZiB0byB2cmFtICovCisJY291bnQgPSBsZW47CisJd2hpbGUgKGNvdW50KSB7CisJCXVuc2lnbmVkIGludCBvZmZzZXQsIGF2YWlsOworCQl1bnNpZ25lZCBpbnQgZW50cnk7CisKKwkJb2Zmc2V0ID0gKHVuc2lnbmVkIGludCkgKHRvICYgKHByaXYtPmNhY2hlLnBhZ2Vfc2l6ZSAtIDEpKTsKKwkJYXZhaWwgID0gcHJpdi0+Y2FjaGUucGFnZV9zaXplIC0gb2Zmc2V0OworCisJCW11dGV4X2xvY2soJnByaXYtPmxvY2spOworCisJCWVudHJ5ID0gcHMzdnJhbV9jYWNoZV9tYXRjaChtdGQsIHRvKTsKKwkJY2FjaGVkID0gQ0FDSEVfT0ZGU0VUICsgZW50cnkgKiBwcml2LT5jYWNoZS5wYWdlX3NpemUgKyBvZmZzZXQ7CisKKwkJZGV2X2RiZyhwcml2LT5kZXYsICIlczolZDogdG89JTA4eCBjYWNoZWQ9JTA4eCBvZmZzZXQ9JTA4eCAiCisJCQkiYXZhaWw9JTA4eCBjb3VudD0lMDh4XG4iLCBfX2Z1bmNfXywgX19MSU5FX18sCisJCQkodW5zaWduZWQgaW50KXRvLCBjYWNoZWQsIG9mZnNldCwgYXZhaWwsIGNvdW50KTsKKworCQlpZiAoYXZhaWwgPiBjb3VudCkKKwkJCWF2YWlsID0gY291bnQ7CisJCW1lbWNweShwcml2LT54ZHJfYnVmICsgY2FjaGVkLCBidWYsIGF2YWlsKTsKKworCQlwcml2LT5jYWNoZS50YWdzW2VudHJ5XS5mbGFncyB8PSBDQUNIRV9QQUdFX0RJUlRZOworCisJCW11dGV4X3VubG9jaygmcHJpdi0+bG9jayk7CisKKwkJYnVmICs9IGF2YWlsOworCQljb3VudCAtPSBhdmFpbDsKKwkJdG8gKz0gYXZhaWw7CisJfQorCisJKnJldGxlbiA9IGxlbjsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgcHMzdnJhbV9wcm9iZShzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHBzM3ZyYW1fcHJpdiAqcHJpdjsKKwlpbnQgc3RhdHVzOworCXU2NCBkZHJfbHBhcjsKKwl1NjQgY3RybF9scGFyOworCXU2NCBpbmZvX2xwYXI7CisJdTY0IHJlcG9ydHNfbHBhcjsKKwl1NjQgZGRyX3NpemU7CisJdTY0IHJlcG9ydHNfc2l6ZTsKKwlpbnQgcmV0ID0gLUVOT01FTTsKKwljaGFyICpyZXN0OworCisJcmV0ID0gLUVJTzsKKwlwczN2cmFtX210ZC5wcml2ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHBzM3ZyYW1fcHJpdiksIEdGUF9LRVJORUwpOworCWlmICghcHMzdnJhbV9tdGQucHJpdikKKwkJZ290byBvdXQ7CisJcHJpdiA9IHBzM3ZyYW1fbXRkLnByaXY7CisKKwltdXRleF9pbml0KCZwcml2LT5sb2NrKTsKKwlwcml2LT5kZXYgPSAmZGV2LT5jb3JlOworCisJLyogQWxsb2NhdGUgWERSIGJ1ZmZlciAoMU1pQiBhbGlnbmVkKSAqLworCXByaXYtPnhkcl9idWYgPSAodm9pZCAqKV9fZ2V0X2ZyZWVfcGFnZXMoR0ZQX0tFUk5FTCwKKwkJZ2V0X29yZGVyKFhEUl9CVUZfU0laRSkpOworCWlmIChwcml2LT54ZHJfYnVmID09IE5VTEwpIHsKKwkJZGV2X2RiZygmZGV2LT5jb3JlLCAiJXM6JWQ6IGNvdWxkIG5vdCBhbGxvY2F0ZSBYRFIgYnVmZmVyXG4iLAorCQkJX19mdW5jX18sIF9fTElORV9fKTsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBvdXRfZnJlZV9wcml2OworCX0KKworCS8qIFB1dCBGSUZPIGF0IGJlZ2dpbm5pbmcgb2YgWERSIGJ1ZmZlciAqLworCXByaXYtPmZpZm9fYmFzZSA9ICh1MzIgKikgKHByaXYtPnhkcl9idWYgKyBGSUZPX09GRlNFVCk7CisJcHJpdi0+Zmlmb19wdHIgPSBwcml2LT5maWZvX2Jhc2U7CisKKwkvKiBYWFg6IE5lZWQgdG8gb3BlbiBHUFUsIGluIGNhc2UgcHMzZmIgb3Igc25kX3BzMyBhcmVuJ3QgbG9hZGVkICovCisJaWYgKHBzM19vcGVuX2h2X2RldmljZShkZXYpKSB7CisJCWRldl9lcnIoJmRldi0+Y29yZSwgIiVzOiVkOiBwczNfb3Blbl9odl9kZXZpY2UgZmFpbGVkXG4iLAorCQkJX19mdW5jX18sIF9fTElORV9fKTsKKwkJcmV0ID0gLUVBR0FJTjsKKwkJZ290byBvdXRfY2xvc2VfZ3B1OworCX0KKworCS8qIFJlcXVlc3QgbWVtb3J5ICovCisJc3RhdHVzID0gLTE7CisJZGRyX3NpemUgPSBtZW1wYXJzZShzaXplLCAmcmVzdCk7CisJaWYgKCpyZXN0ID09ICctJykKKwkJZGRyX3NpemUgLT0gcHMzZmJfdmlkZW9tZW1vcnkuc2l6ZTsKKwlkZHJfc2l6ZSA9IEFMSUdOKGRkcl9zaXplLCAxMDI0KjEwMjQpOworCWlmIChkZHJfc2l6ZSA8PSAwKSB7CisJCWRldl9lcnIoJmRldi0+Y29yZSwgIiVzOiVkOiBzcGVjaWZpZWQgc2l6ZSBpcyB0b28gc21hbGxcbiIsCisJCQlfX2Z1bmNfXywgX19MSU5FX18pOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIG91dF9jbG9zZV9ncHU7CisJfQorCisJd2hpbGUgKGRkcl9zaXplID4gMCkgeworCQlzdGF0dXMgPSBsdjFfZ3B1X21lbW9yeV9hbGxvY2F0ZShkZHJfc2l6ZSwgMCwgMCwgMCwgMCwKKwkJCQkJCSAmcHJpdi0+bWVtb3J5X2hhbmRsZSwKKwkJCQkJCSAmZGRyX2xwYXIpOworCQlpZiAoIXN0YXR1cykKKwkJCWJyZWFrOworCQlkZHJfc2l6ZSAtPSAxMDI0KjEwMjQ7CisJfQorCWlmIChzdGF0dXMgfHwgZGRyX3NpemUgPD0gMCkgeworCQlkZXZfZXJyKCZkZXYtPmNvcmUsICIlczolZDogbHYxX2dwdV9tZW1vcnlfYWxsb2NhdGUgZmFpbGVkXG4iLAorCQkJX19mdW5jX18sIF9fTElORV9fKTsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBvdXRfZnJlZV94ZHJfYnVmOworCX0KKworCS8qIFJlcXVlc3QgY29udGV4dCAqLworCXN0YXR1cyA9IGx2MV9ncHVfY29udGV4dF9hbGxvY2F0ZShwcml2LT5tZW1vcnlfaGFuZGxlLAorCQkJCQkgIDAsCisJCQkJCSAgJnByaXYtPmNvbnRleHRfaGFuZGxlLAorCQkJCQkgICZjdHJsX2xwYXIsCisJCQkJCSAgJmluZm9fbHBhciwKKwkJCQkJICAmcmVwb3J0c19scGFyLAorCQkJCQkgICZyZXBvcnRzX3NpemUpOworCWlmIChzdGF0dXMpIHsKKwkJZGV2X2VycigmZGV2LT5jb3JlLCAiJXM6JWQ6IGx2MV9ncHVfY29udGV4dF9hbGxvY2F0ZSBmYWlsZWRcbiIsCisJCQlfX2Z1bmNfXywgX19MSU5FX18pOworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIG91dF9mcmVlX21lbW9yeTsKKwl9CisKKwkvKiBNYXAgWERSIGJ1ZmZlciB0byBSU1ggKi8KKwlzdGF0dXMgPSBsdjFfZ3B1X2NvbnRleHRfaW9tYXAocHJpdi0+Y29udGV4dF9oYW5kbGUsIFhEUl9JT0lGLAorCQkJCSAgICAgICBwczNfbW1fcGh5c190b19scGFyKF9fcGEocHJpdi0+eGRyX2J1ZikpLAorCQkJCSAgICAgICBYRFJfQlVGX1NJWkUsIDApOworCWlmIChzdGF0dXMpIHsKKwkJZGV2X2VycigmZGV2LT5jb3JlLCAiJXM6JWQ6IGx2MV9ncHVfY29udGV4dF9pb21hcCBmYWlsZWRcbiIsCisJCQlfX2Z1bmNfXywgX19MSU5FX18pOworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIG91dF9mcmVlX2NvbnRleHQ7CisJfQorCisJcHJpdi0+ZGRyX2Jhc2UgPSBpb3JlbWFwX2ZsYWdzKGRkcl9scGFyLCBkZHJfc2l6ZSwgX1BBR0VfTk9fQ0FDSEUpOworCisJaWYgKCFwcml2LT5kZHJfYmFzZSkgeworCQlkZXZfZXJyKCZkZXYtPmNvcmUsICIlczolZDogaW9yZW1hcCBmYWlsZWRcbiIsIF9fZnVuY19fLAorCQkJX19MSU5FX18pOworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIG91dF9mcmVlX2NvbnRleHQ7CisJfQorCisJcHJpdi0+Y3RybCA9IGlvcmVtYXAoY3RybF9scGFyLCA2NCAqIDEwMjQpOworCWlmICghcHJpdi0+Y3RybCkgeworCQlkZXZfZXJyKCZkZXYtPmNvcmUsICIlczolZDogaW9yZW1hcCBmYWlsZWRcbiIsIF9fZnVuY19fLAorCQkJX19MSU5FX18pOworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIG91dF91bm1hcF92cmFtOworCX0KKworCXByaXYtPnJlcG9ydHMgPSBpb3JlbWFwKHJlcG9ydHNfbHBhciwgcmVwb3J0c19zaXplKTsKKwlpZiAoIXByaXYtPnJlcG9ydHMpIHsKKwkJZGV2X2VycigmZGV2LT5jb3JlLCAiJXM6JWQ6IGlvcmVtYXAgZmFpbGVkXG4iLCBfX2Z1bmNfXywKKwkJCV9fTElORV9fKTsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBvdXRfdW5tYXBfY3RybDsKKwl9CisKKwltdXRleF9sb2NrKCZwczNfZ3B1X211dGV4KTsKKwlwczN2cmFtX2luaXRfcmluZygmcHMzdnJhbV9tdGQpOworCW11dGV4X3VubG9jaygmcHMzX2dwdV9tdXRleCk7CisKKwlwczN2cmFtX210ZC5uYW1lID0gInBzM3ZyYW0iOworCXBzM3ZyYW1fbXRkLnNpemUgPSBkZHJfc2l6ZTsKKwlwczN2cmFtX210ZC5mbGFncyA9IE1URF9DQVBfUkFNOworCXBzM3ZyYW1fbXRkLmVyYXNlID0gcHMzdnJhbV9lcmFzZTsKKwlwczN2cmFtX210ZC5wb2ludCA9IE5VTEw7CisJcHMzdnJhbV9tdGQudW5wb2ludCA9IE5VTEw7CisJcHMzdnJhbV9tdGQucmVhZCA9IHBzM3ZyYW1fcmVhZDsKKwlwczN2cmFtX210ZC53cml0ZSA9IHBzM3ZyYW1fd3JpdGU7CisJcHMzdnJhbV9tdGQub3duZXIgPSBUSElTX01PRFVMRTsKKwlwczN2cmFtX210ZC50eXBlID0gTVREX1JBTTsKKwlwczN2cmFtX210ZC5lcmFzZXNpemUgPSBDQUNIRV9QQUdFX1NJWkU7CisJcHMzdnJhbV9tdGQud3JpdGVzaXplID0gMTsKKworCXBzM3ZyYW1fYmluZCgmcHMzdnJhbV9tdGQpOworCisJbXV0ZXhfbG9jaygmcHMzX2dwdV9tdXRleCk7CisJcmV0ID0gcHMzdnJhbV93YWl0X3JpbmcoJnBzM3ZyYW1fbXRkLCAxMDApOworCW11dGV4X3VubG9jaygmcHMzX2dwdV9tdXRleCk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycigmZGV2LT5jb3JlLCAiJXM6JWQ6IGZhaWxlZCB0byBpbml0aWFsaXplIGNoYW5uZWxzXG4iLAorCQkJX19mdW5jX18sIF9fTElORV9fKTsKKwkJcmV0ID0gLUVUSU1FRE9VVDsKKwkJZ290byBvdXRfdW5tYXBfcmVwb3J0czsKKwl9CisKKwlwczN2cmFtX2NhY2hlX2luaXQoJnBzM3ZyYW1fbXRkKTsKKworCWlmIChhZGRfbXRkX2RldmljZSgmcHMzdnJhbV9tdGQpKSB7CisJCWRldl9lcnIoJmRldi0+Y29yZSwgIiVzOiVkOiBhZGRfbXRkX2RldmljZSBmYWlsZWRcbiIsCisJCQlfX2Z1bmNfXywgX19MSU5FX18pOworCQlyZXQgPSAtRUFHQUlOOworCQlnb3RvIG91dF9jYWNoZV9jbGVhbnVwOworCX0KKworCWRldl9pbmZvKCZkZXYtPmNvcmUsICJyZXNlcnZlZCAldSBNaUIgb2YgZ3B1IG1lbW9yeVxuIiwKKwkJKHVuc2lnbmVkIGludCkoZGRyX3NpemUgLyAxMDI0IC8gMTAyNCkpOworCisJcmV0dXJuIDA7CisKK291dF9jYWNoZV9jbGVhbnVwOgorCXBzM3ZyYW1fY2FjaGVfY2xlYW51cCgmcHMzdnJhbV9tdGQpOworb3V0X3VubWFwX3JlcG9ydHM6CisJaW91bm1hcChwcml2LT5yZXBvcnRzKTsKK291dF91bm1hcF9jdHJsOgorCWlvdW5tYXAocHJpdi0+Y3RybCk7CitvdXRfdW5tYXBfdnJhbToKKwlpb3VubWFwKHByaXYtPmRkcl9iYXNlKTsKK291dF9mcmVlX2NvbnRleHQ6CisJbHYxX2dwdV9jb250ZXh0X2ZyZWUocHJpdi0+Y29udGV4dF9oYW5kbGUpOworb3V0X2ZyZWVfbWVtb3J5OgorCWx2MV9ncHVfbWVtb3J5X2ZyZWUocHJpdi0+bWVtb3J5X2hhbmRsZSk7CitvdXRfY2xvc2VfZ3B1OgorCXBzM19jbG9zZV9odl9kZXZpY2UoZGV2KTsKK291dF9mcmVlX3hkcl9idWY6CisJZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZykgcHJpdi0+eGRyX2J1ZiwgZ2V0X29yZGVyKFhEUl9CVUZfU0laRSkpOworb3V0X2ZyZWVfcHJpdjoKKwlrZnJlZShwczN2cmFtX210ZC5wcml2KTsKKwlwczN2cmFtX210ZC5wcml2ID0gTlVMTDsKK291dDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHBzM3ZyYW1fc2h1dGRvd24oc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBwczN2cmFtX3ByaXYgKnByaXY7CisKKwlwcml2ID0gcHMzdnJhbV9tdGQucHJpdjsKKworCWRlbF9tdGRfZGV2aWNlKCZwczN2cmFtX210ZCk7CisJcHMzdnJhbV9jYWNoZV9jbGVhbnVwKCZwczN2cmFtX210ZCk7CisJaW91bm1hcChwcml2LT5yZXBvcnRzKTsKKwlpb3VubWFwKHByaXYtPmN0cmwpOworCWlvdW5tYXAocHJpdi0+ZGRyX2Jhc2UpOworCWx2MV9ncHVfY29udGV4dF9mcmVlKHByaXYtPmNvbnRleHRfaGFuZGxlKTsKKwlsdjFfZ3B1X21lbW9yeV9mcmVlKHByaXYtPm1lbW9yeV9oYW5kbGUpOworCXBzM19jbG9zZV9odl9kZXZpY2UoZGV2KTsKKwlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKSBwcml2LT54ZHJfYnVmLCBnZXRfb3JkZXIoWERSX0JVRl9TSVpFKSk7CisJa2ZyZWUocHJpdik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZHJpdmVyIHBzM3ZyYW1fZHJpdmVyID0geworCS5tYXRjaF9pZAk9IFBTM19NQVRDSF9JRF9HUFUsCisJLm1hdGNoX3N1Yl9pZAk9IFBTM19NQVRDSF9TVUJfSURfR1BVX1JBTURJU0ssCisJLmNvcmUubmFtZQk9IERFVklDRV9OQU1FLAorCS5jb3JlLm93bmVyCT0gVEhJU19NT0RVTEUsCisJLnByb2JlCQk9IHBzM3ZyYW1fcHJvYmUsCisJLnJlbW92ZQkJPSBwczN2cmFtX3NodXRkb3duLAorCS5zaHV0ZG93bgk9IHBzM3ZyYW1fc2h1dGRvd24sCit9OworCitzdGF0aWMgaW50IF9faW5pdCBwczN2cmFtX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcHMzX3N5c3RlbV9idXNfZHJpdmVyX3JlZ2lzdGVyKCZwczN2cmFtX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBwczN2cmFtX2V4aXQodm9pZCkKK3sKKwlwczNfc3lzdGVtX2J1c19kcml2ZXJfdW5yZWdpc3RlcigmcHMzdnJhbV9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChwczN2cmFtX2luaXQpOworbW9kdWxlX2V4aXQocHMzdnJhbV9leGl0KTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FVVEhPUigiSmltIFBhcmlzIDxqaW1AanRhbi5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIk1URCBkcml2ZXIgZm9yIFBTMyB2aWRlbyBSQU0iKTsKK01PRFVMRV9BTElBUyhQUzNfTU9EVUxFX0FMSUFTX0dQVV9SQU1ESVNLKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL2Z0bC5jIGIvZHJpdmVycy9tdGQvZnRsLmMKaW5kZXggOWJmNTgxYy4uYTc5MGMwNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvZnRsLmMKKysrIGIvZHJpdmVycy9tdGQvZnRsLmMKQEAgLTEwOSwyNSArMTA5LDI1IEBACiAvKiBFYWNoIG1lbW9yeSByZWdpb24gY29ycmVzcG9uZHMgdG8gYSBtaW5vciBkZXZpY2UgKi8KIHR5cGVkZWYgc3RydWN0IHBhcnRpdGlvbl90IHsKICAgICBzdHJ1Y3QgbXRkX2Jsa3RyYW5zX2RldiBtYmQ7Ci0gICAgdV9pbnQzMl90CQlzdGF0ZTsKLSAgICB1X2ludDMyX3QJCSpWaXJ0dWFsQmxvY2tNYXA7Ci0gICAgdV9pbnQzMl90CQkqVmlydHVhbFBhZ2VNYXA7Ci0gICAgdV9pbnQzMl90CQlGcmVlVG90YWw7CisgICAgdWludDMyX3QJCXN0YXRlOworICAgIHVpbnQzMl90CQkqVmlydHVhbEJsb2NrTWFwOworICAgIHVpbnQzMl90CQkqVmlydHVhbFBhZ2VNYXA7CisgICAgdWludDMyX3QJCUZyZWVUb3RhbDsKICAgICBzdHJ1Y3QgZXVuX2luZm9fdCB7Ci0JdV9pbnQzMl90CQlPZmZzZXQ7Ci0JdV9pbnQzMl90CQlFcmFzZUNvdW50OwotCXVfaW50MzJfdAkJRnJlZTsKLQl1X2ludDMyX3QJCURlbGV0ZWQ7CisJdWludDMyX3QJCU9mZnNldDsKKwl1aW50MzJfdAkJRXJhc2VDb3VudDsKKwl1aW50MzJfdAkJRnJlZTsKKwl1aW50MzJfdAkJRGVsZXRlZDsKICAgICB9ICpFVU5JbmZvOwogICAgIHN0cnVjdCB4ZmVyX2luZm9fdCB7Ci0JdV9pbnQzMl90CQlPZmZzZXQ7Ci0JdV9pbnQzMl90CQlFcmFzZUNvdW50OwotCXVfaW50MTZfdAkJc3RhdGU7CisJdWludDMyX3QJCU9mZnNldDsKKwl1aW50MzJfdAkJRXJhc2VDb3VudDsKKwl1aW50MTZfdAkJc3RhdGU7CiAgICAgfSAqWGZlckluZm87Ci0gICAgdV9pbnQxNl90CQliYW1faW5kZXg7Ci0gICAgdV9pbnQzMl90CQkqYmFtX2NhY2hlOwotICAgIHVfaW50MTZfdAkJRGF0YVVuaXRzOwotICAgIHVfaW50MzJfdAkJQmxvY2tzUGVyVW5pdDsKKyAgICB1aW50MTZfdAkJYmFtX2luZGV4OworICAgIHVpbnQzMl90CQkqYmFtX2NhY2hlOworICAgIHVpbnQxNl90CQlEYXRhVW5pdHM7CisgICAgdWludDMyX3QJCUJsb2Nrc1BlclVuaXQ7CiAgICAgZXJhc2VfdW5pdF9oZWFkZXJfdAloZWFkZXI7CiB9IHBhcnRpdGlvbl90OwogCkBAIC0xOTksOCArMTk5LDggQEAKIHN0YXRpYyBpbnQgYnVpbGRfbWFwcyhwYXJ0aXRpb25fdCAqcGFydCkKIHsKICAgICBlcmFzZV91bml0X2hlYWRlcl90IGhlYWRlcjsKLSAgICB1X2ludDE2X3QgeHZhbGlkLCB4dHJhbnMsIGk7Ci0gICAgdV9pbnQgYmxvY2tzLCBqOworICAgIHVpbnQxNl90IHh2YWxpZCwgeHRyYW5zLCBpOworICAgIHVuc2lnbmVkIGJsb2NrcywgajsKICAgICBpbnQgaGRyX29rLCByZXQgPSAtMTsKICAgICBzc2l6ZV90IHJldHZhbDsKICAgICBsb2ZmX3Qgb2Zmc2V0OwpAQCAtMjY5LDE0ICsyNjksMTQgQEAKIAogICAgIC8qIFNldCB1cCB2aXJ0dWFsIHBhZ2UgbWFwICovCiAgICAgYmxvY2tzID0gbGUzMl90b19jcHUoaGVhZGVyLkZvcm1hdHRlZFNpemUpID4+IGhlYWRlci5CbG9ja1NpemU7Ci0gICAgcGFydC0+VmlydHVhbEJsb2NrTWFwID0gdm1hbGxvYyhibG9ja3MgKiBzaXplb2YodV9pbnQzMl90KSk7CisgICAgcGFydC0+VmlydHVhbEJsb2NrTWFwID0gdm1hbGxvYyhibG9ja3MgKiBzaXplb2YodWludDMyX3QpKTsKICAgICBpZiAoIXBhcnQtPlZpcnR1YWxCbG9ja01hcCkKIAkgICAgZ290byBvdXRfWGZlckluZm87CiAKLSAgICBtZW1zZXQocGFydC0+VmlydHVhbEJsb2NrTWFwLCAweGZmLCBibG9ja3MgKiBzaXplb2YodV9pbnQzMl90KSk7CisgICAgbWVtc2V0KHBhcnQtPlZpcnR1YWxCbG9ja01hcCwgMHhmZiwgYmxvY2tzICogc2l6ZW9mKHVpbnQzMl90KSk7CiAgICAgcGFydC0+QmxvY2tzUGVyVW5pdCA9ICgxIDw8IGhlYWRlci5FcmFzZVVuaXRTaXplKSA+PiBoZWFkZXIuQmxvY2tTaXplOwogCi0gICAgcGFydC0+YmFtX2NhY2hlID0ga21hbGxvYyhwYXJ0LT5CbG9ja3NQZXJVbml0ICogc2l6ZW9mKHVfaW50MzJfdCksCisgICAgcGFydC0+YmFtX2NhY2hlID0ga21hbGxvYyhwYXJ0LT5CbG9ja3NQZXJVbml0ICogc2l6ZW9mKHVpbnQzMl90KSwKIAkJCSAgICAgIEdGUF9LRVJORUwpOwogICAgIGlmICghcGFydC0+YmFtX2NhY2hlKQogCSAgICBnb3RvIG91dF9WaXJ0dWFsQmxvY2tNYXA7CkBAIC0yOTAsNyArMjkwLDcgQEAKIAlvZmZzZXQgPSBwYXJ0LT5FVU5JbmZvW2ldLk9mZnNldCArIGxlMzJfdG9fY3B1KGhlYWRlci5CQU1PZmZzZXQpOwogCiAJcmV0ID0gcGFydC0+bWJkLm10ZC0+cmVhZChwYXJ0LT5tYmQubXRkLCBvZmZzZXQsCi0JCQkgICAgICBwYXJ0LT5CbG9ja3NQZXJVbml0ICogc2l6ZW9mKHVfaW50MzJfdCksICZyZXR2YWwsCisJCQkgICAgICBwYXJ0LT5CbG9ja3NQZXJVbml0ICogc2l6ZW9mKHVpbnQzMl90KSwgJnJldHZhbCwKIAkJCSAgICAgICh1bnNpZ25lZCBjaGFyICopcGFydC0+YmFtX2NhY2hlKTsKIAogCWlmIChyZXQpCkBAIC0zMzIsNyArMzMyLDcgQEAKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogCiBzdGF0aWMgaW50IGVyYXNlX3hmZXIocGFydGl0aW9uX3QgKnBhcnQsCi0JCSAgICAgIHVfaW50MTZfdCB4ZmVybnVtKQorCQkgICAgICB1aW50MTZfdCB4ZmVybnVtKQogewogICAgIGludCByZXQ7CiAgICAgc3RydWN0IHhmZXJfaW5mb190ICp4ZmVyOwpAQCAtNDA4LDcgKzQwOCw3IEBACiAgICAgZXJhc2VfdW5pdF9oZWFkZXJfdCBoZWFkZXI7CiAgICAgc3RydWN0IHhmZXJfaW5mb190ICp4ZmVyOwogICAgIGludCBuYmFtLCByZXQ7Ci0gICAgdV9pbnQzMl90IGN0bDsKKyAgICB1aW50MzJfdCBjdGw7CiAgICAgc3NpemVfdCByZXRsZW47CiAgICAgbG9mZl90IG9mZnNldDsKIApAQCAtNDMwLDE1ICs0MzAsMTUgQEAKICAgICB9CiAKICAgICAvKiBXcml0ZSB0aGUgQkFNIHN0dWIgKi8KLSAgICBuYmFtID0gKHBhcnQtPkJsb2Nrc1BlclVuaXQgKiBzaXplb2YodV9pbnQzMl90KSArCisgICAgbmJhbSA9IChwYXJ0LT5CbG9ja3NQZXJVbml0ICogc2l6ZW9mKHVpbnQzMl90KSArCiAJICAgIGxlMzJfdG9fY3B1KHBhcnQtPmhlYWRlci5CQU1PZmZzZXQpICsgU0VDVE9SX1NJWkUgLSAxKSAvIFNFQ1RPUl9TSVpFOwogCiAgICAgb2Zmc2V0ID0geGZlci0+T2Zmc2V0ICsgbGUzMl90b19jcHUocGFydC0+aGVhZGVyLkJBTU9mZnNldCk7CiAgICAgY3RsID0gY3B1X3RvX2xlMzIoQkxPQ0tfQ09OVFJPTCk7CiAKLSAgICBmb3IgKGkgPSAwOyBpIDwgbmJhbTsgaSsrLCBvZmZzZXQgKz0gc2l6ZW9mKHVfaW50MzJfdCkpIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbmJhbTsgaSsrLCBvZmZzZXQgKz0gc2l6ZW9mKHVpbnQzMl90KSkgewogCi0JcmV0ID0gcGFydC0+bWJkLm10ZC0+d3JpdGUocGFydC0+bWJkLm10ZCwgb2Zmc2V0LCBzaXplb2YodV9pbnQzMl90KSwKKwlyZXQgPSBwYXJ0LT5tYmQubXRkLT53cml0ZShwYXJ0LT5tYmQubXRkLCBvZmZzZXQsIHNpemVvZih1aW50MzJfdCksCiAJCQkgICAgICAgJnJldGxlbiwgKHVfY2hhciAqKSZjdGwpOwogCiAJaWYgKHJldCkKQEAgLTQ2MSwxOCArNDYxLDE4IEBACiAKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogCi1zdGF0aWMgaW50IGNvcHlfZXJhc2VfdW5pdChwYXJ0aXRpb25fdCAqcGFydCwgdV9pbnQxNl90IHNyY3VuaXQsCi0JCQkgICB1X2ludDE2X3QgeGZlcnVuaXQpCitzdGF0aWMgaW50IGNvcHlfZXJhc2VfdW5pdChwYXJ0aXRpb25fdCAqcGFydCwgdWludDE2X3Qgc3JjdW5pdCwKKwkJCSAgIHVpbnQxNl90IHhmZXJ1bml0KQogewogICAgIHVfY2hhciBidWZbU0VDVE9SX1NJWkVdOwogICAgIHN0cnVjdCBldW5faW5mb190ICpldW47CiAgICAgc3RydWN0IHhmZXJfaW5mb190ICp4ZmVyOwotICAgIHVfaW50MzJfdCBzcmMsIGRlc3QsIGZyZWUsIGk7Ci0gICAgdV9pbnQxNl90IHVuaXQ7CisgICAgdWludDMyX3Qgc3JjLCBkZXN0LCBmcmVlLCBpOworICAgIHVpbnQxNl90IHVuaXQ7CiAgICAgaW50IHJldDsKICAgICBzc2l6ZV90IHJldGxlbjsKICAgICBsb2ZmX3Qgb2Zmc2V0OwotICAgIHVfaW50MTZfdCBzcmN1bml0c3dhcCA9IGNwdV90b19sZTE2KHNyY3VuaXQpOworICAgIHVpbnQxNl90IHNyY3VuaXRzd2FwID0gY3B1X3RvX2xlMTYoc3JjdW5pdCk7CiAKICAgICBldW4gPSAmcGFydC0+RVVOSW5mb1tzcmN1bml0XTsKICAgICB4ZmVyID0gJnBhcnQtPlhmZXJJbmZvW3hmZXJ1bml0XTsKQEAgLTQ4Niw3ICs0ODYsNyBAQAogCW9mZnNldCA9IGV1bi0+T2Zmc2V0ICsgbGUzMl90b19jcHUocGFydC0+aGVhZGVyLkJBTU9mZnNldCk7CiAKIAlyZXQgPSBwYXJ0LT5tYmQubXRkLT5yZWFkKHBhcnQtPm1iZC5tdGQsIG9mZnNldCwKLQkJCSAgICAgIHBhcnQtPkJsb2Nrc1BlclVuaXQgKiBzaXplb2YodV9pbnQzMl90KSwKKwkJCSAgICAgIHBhcnQtPkJsb2Nrc1BlclVuaXQgKiBzaXplb2YodWludDMyX3QpLAogCQkJICAgICAgJnJldGxlbiwgKHVfY2hhciAqKSAocGFydC0+YmFtX2NhY2hlKSk7CiAKIAkvKiBtYXJrIHRoZSBjYWNoZSBiYWQsIGluIGNhc2Ugd2UgZ2V0IGFuIGVycm9yIGxhdGVyICovCkBAIC01MDMsNyArNTAzLDcgQEAKICAgICBvZmZzZXQgPSB4ZmVyLT5PZmZzZXQgKyAyMDsgLyogQmFkISAqLwogICAgIHVuaXQgPSBjcHVfdG9fbGUxNigweDdmZmYpOwogCi0gICAgcmV0ID0gcGFydC0+bWJkLm10ZC0+d3JpdGUocGFydC0+bWJkLm10ZCwgb2Zmc2V0LCBzaXplb2YodV9pbnQxNl90KSwKKyAgICByZXQgPSBwYXJ0LT5tYmQubXRkLT53cml0ZShwYXJ0LT5tYmQubXRkLCBvZmZzZXQsIHNpemVvZih1aW50MTZfdCksCiAJCQkgICAmcmV0bGVuLCAodV9jaGFyICopICZ1bml0KTsKIAogICAgIGlmIChyZXQpIHsKQEAgLTU2MCw3ICs1NjAsNyBAQAogCiAKICAgICAvKiBBbGwgY2xlYXI/IFRoZW4gdXBkYXRlIHRoZSBMb2dpY2FsRVVOIGFnYWluICovCi0gICAgcmV0ID0gcGFydC0+bWJkLm10ZC0+d3JpdGUocGFydC0+bWJkLm10ZCwgeGZlci0+T2Zmc2V0ICsgMjAsIHNpemVvZih1X2ludDE2X3QpLAorICAgIHJldCA9IHBhcnQtPm1iZC5tdGQtPndyaXRlKHBhcnQtPm1iZC5tdGQsIHhmZXItPk9mZnNldCArIDIwLCBzaXplb2YodWludDE2X3QpLAogCQkJICAgJnJldGxlbiwgKHVfY2hhciAqKSZzcmN1bml0c3dhcCk7CiAKICAgICBpZiAocmV0KSB7CkBAIC02MDUsOCArNjA1LDggQEAKIAogc3RhdGljIGludCByZWNsYWltX2Jsb2NrKHBhcnRpdGlvbl90ICpwYXJ0KQogewotICAgIHVfaW50MTZfdCBpLCBldW4sIHhmZXI7Ci0gICAgdV9pbnQzMl90IGJlc3Q7CisgICAgdWludDE2X3QgaSwgZXVuLCB4ZmVyOworICAgIHVpbnQzMl90IGJlc3Q7CiAgICAgaW50IHF1ZXVlZCwgcmV0OwogCiAgICAgREVCVUcoMCwgImZ0bF9jczogcmVjbGFpbWluZyBzcGFjZS4uLlxuIik7CkBAIC03MjMsMTAgKzcyMywxMCBAQAogfQogI2VuZGlmCiAKLXN0YXRpYyB1X2ludDMyX3QgZmluZF9mcmVlKHBhcnRpdGlvbl90ICpwYXJ0KQorc3RhdGljIHVpbnQzMl90IGZpbmRfZnJlZShwYXJ0aXRpb25fdCAqcGFydCkKIHsKLSAgICB1X2ludDE2X3Qgc3RvcCwgZXVuOwotICAgIHVfaW50MzJfdCBibGs7CisgICAgdWludDE2X3Qgc3RvcCwgZXVuOworICAgIHVpbnQzMl90IGJsazsKICAgICBzaXplX3QgcmV0bGVuOwogICAgIGludCByZXQ7CiAKQEAgLTc0OSw3ICs3NDksNyBAQAogCiAJcmV0ID0gcGFydC0+bWJkLm10ZC0+cmVhZChwYXJ0LT5tYmQubXRkLAogCQkgICAgICAgcGFydC0+RVVOSW5mb1tldW5dLk9mZnNldCArIGxlMzJfdG9fY3B1KHBhcnQtPmhlYWRlci5CQU1PZmZzZXQpLAotCQkgICAgICAgcGFydC0+QmxvY2tzUGVyVW5pdCAqIHNpemVvZih1X2ludDMyX3QpLAorCQkgICAgICAgcGFydC0+QmxvY2tzUGVyVW5pdCAqIHNpemVvZih1aW50MzJfdCksCiAJCSAgICAgICAmcmV0bGVuLCAodV9jaGFyICopIChwYXJ0LT5iYW1fY2FjaGUpKTsKIAogCWlmIChyZXQpIHsKQEAgLTc4Niw3ICs3ODYsNyBAQAogc3RhdGljIGludCBmdGxfcmVhZChwYXJ0aXRpb25fdCAqcGFydCwgY2FkZHJfdCBidWZmZXIsCiAJCSAgICB1X2xvbmcgc2VjdG9yLCB1X2xvbmcgbmJsb2NrcykKIHsKLSAgICB1X2ludDMyX3QgbG9nX2FkZHIsIGJzaXplOworICAgIHVpbnQzMl90IGxvZ19hZGRyLCBic2l6ZTsKICAgICB1X2xvbmcgaTsKICAgICBpbnQgcmV0OwogICAgIHNpemVfdCBvZmZzZXQsIHJldGxlbjsKQEAgLTgyOSwxNCArODI5LDE0IEBACiAKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogCi1zdGF0aWMgaW50IHNldF9iYW1fZW50cnkocGFydGl0aW9uX3QgKnBhcnQsIHVfaW50MzJfdCBsb2dfYWRkciwKLQkJCSB1X2ludDMyX3QgdmlydF9hZGRyKQorc3RhdGljIGludCBzZXRfYmFtX2VudHJ5KHBhcnRpdGlvbl90ICpwYXJ0LCB1aW50MzJfdCBsb2dfYWRkciwKKwkJCSB1aW50MzJfdCB2aXJ0X2FkZHIpCiB7Ci0gICAgdV9pbnQzMl90IGJzaXplLCBibGssIGxlX3ZpcnRfYWRkcjsKKyAgICB1aW50MzJfdCBic2l6ZSwgYmxrLCBsZV92aXJ0X2FkZHI7CiAjaWZkZWYgUFNZQ0hPX0RFQlVHCi0gICAgdV9pbnQzMl90IG9sZF9hZGRyOworICAgIHVpbnQzMl90IG9sZF9hZGRyOwogI2VuZGlmCi0gICAgdV9pbnQxNl90IGV1bjsKKyAgICB1aW50MTZfdCBldW47CiAgICAgaW50IHJldDsKICAgICBzaXplX3QgcmV0bGVuLCBvZmZzZXQ7CiAKQEAgLTg0NSwxMSArODQ1LDExIEBACiAgICAgYnNpemUgPSAxIDw8IHBhcnQtPmhlYWRlci5FcmFzZVVuaXRTaXplOwogICAgIGV1biA9IGxvZ19hZGRyIC8gYnNpemU7CiAgICAgYmxrID0gKGxvZ19hZGRyICUgYnNpemUpIC8gU0VDVE9SX1NJWkU7Ci0gICAgb2Zmc2V0ID0gKHBhcnQtPkVVTkluZm9bZXVuXS5PZmZzZXQgKyBibGsgKiBzaXplb2YodV9pbnQzMl90KSArCisgICAgb2Zmc2V0ID0gKHBhcnQtPkVVTkluZm9bZXVuXS5PZmZzZXQgKyBibGsgKiBzaXplb2YodWludDMyX3QpICsKIAkJICBsZTMyX3RvX2NwdShwYXJ0LT5oZWFkZXIuQkFNT2Zmc2V0KSk7CiAKICNpZmRlZiBQU1lDSE9fREVCVUcKLSAgICByZXQgPSBwYXJ0LT5tYmQubXRkLT5yZWFkKHBhcnQtPm1iZC5tdGQsIG9mZnNldCwgc2l6ZW9mKHVfaW50MzJfdCksCisgICAgcmV0ID0gcGFydC0+bWJkLm10ZC0+cmVhZChwYXJ0LT5tYmQubXRkLCBvZmZzZXQsIHNpemVvZih1aW50MzJfdCksCiAgICAgICAgICAgICAgICAgICAgICAgICAmcmV0bGVuLCAodV9jaGFyICopJm9sZF9hZGRyKTsKICAgICBpZiAocmV0KSB7CiAJcHJpbnRrKEtFUk5fV0FSTklORyJmdGw6IEVycm9yIHJlYWRpbmcgb2xkX2FkZHIgaW4gc2V0X2JhbV9lbnRyeTogJWRcbiIscmV0KTsKQEAgLTg4Niw3ICs4ODYsNyBAQAogI2VuZGlmCiAJcGFydC0+YmFtX2NhY2hlW2Jsa10gPSBsZV92aXJ0X2FkZHI7CiAgICAgfQotICAgIHJldCA9IHBhcnQtPm1iZC5tdGQtPndyaXRlKHBhcnQtPm1iZC5tdGQsIG9mZnNldCwgc2l6ZW9mKHVfaW50MzJfdCksCisgICAgcmV0ID0gcGFydC0+bWJkLm10ZC0+d3JpdGUocGFydC0+bWJkLm10ZCwgb2Zmc2V0LCBzaXplb2YodWludDMyX3QpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXRsZW4sICh1X2NoYXIgKikmbGVfdmlydF9hZGRyKTsKIAogICAgIGlmIChyZXQpIHsKQEAgLTkwMCw3ICs5MDAsNyBAQAogc3RhdGljIGludCBmdGxfd3JpdGUocGFydGl0aW9uX3QgKnBhcnQsIGNhZGRyX3QgYnVmZmVyLAogCQkgICAgIHVfbG9uZyBzZWN0b3IsIHVfbG9uZyBuYmxvY2tzKQogewotICAgIHVfaW50MzJfdCBic2l6ZSwgbG9nX2FkZHIsIHZpcnRfYWRkciwgb2xkX2FkZHIsIGJsazsKKyAgICB1aW50MzJfdCBic2l6ZSwgbG9nX2FkZHIsIHZpcnRfYWRkciwgb2xkX2FkZHIsIGJsazsKICAgICB1X2xvbmcgaTsKICAgICBpbnQgcmV0OwogICAgIHNpemVfdCByZXRsZW4sIG9mZnNldDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL2luZnRsY29yZS5jIGIvZHJpdmVycy9tdGQvaW5mdGxjb3JlLmMKaW5kZXggNTBjZTEzOC4uNzNmMDUyMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvaW5mdGxjb3JlLmMKKysrIGIvZHJpdmVycy9tdGQvaW5mdGxjb3JlLmMKQEAgLTUwLDcgKzUwLDcgQEAKIAlzdHJ1Y3QgSU5GVExyZWNvcmQgKmluZnRsOwogCXVuc2lnbmVkIGxvbmcgdGVtcDsKIAotCWlmIChtdGQtPnR5cGUgIT0gTVREX05BTkRGTEFTSCkKKwlpZiAobXRkLT50eXBlICE9IE1URF9OQU5ERkxBU0ggfHwgbXRkLT5zaXplID4gVUlOVF9NQVgpCiAJCXJldHVybjsKIAkvKiBPSywgdGhpcyBpcyBtb2RlcmF0ZWx5IHVnbHkuICBCdXQgcHJvYmFibHkgc2FmZS4gIEFsdGVybmF0aXZlcz8gKi8KIAlpZiAobWVtY21wKG10ZC0+bmFtZSwgIkRpc2tPbkNoaXAiLCAxMCkpCmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9pbmZ0bG1vdW50LmMgYi9kcml2ZXJzL210ZC9pbmZ0bG1vdW50LmMKaW5kZXggOTExMzYyOC4uZjc1MWRkOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvaW5mdGxtb3VudC5jCisrKyBiL2RyaXZlcnMvbXRkL2luZnRsbW91bnQuYwpAQCAtNjMsNyArNjMsNyBAQAogCSAqIG90aGVyd2lzZS4KIAkgKi8KIAlpbmZ0bC0+RXJhc2VTaXplID0gaW5mdGwtPm1iZC5tdGQtPmVyYXNlc2l6ZTsKLSAgICAgICAgaW5mdGwtPm5iX2Jsb2NrcyA9IGluZnRsLT5tYmQubXRkLT5zaXplIC8gaW5mdGwtPkVyYXNlU2l6ZTsKKyAgICAgICAgaW5mdGwtPm5iX2Jsb2NrcyA9ICh1MzIpaW5mdGwtPm1iZC5tdGQtPnNpemUgLyBpbmZ0bC0+RXJhc2VTaXplOwogCiAJaW5mdGwtPk1lZGlhVW5pdCA9IEJMT0NLX05JTDsKIApAQCAtMTg3LDcgKzE4Nyw3IEBACiAJCQkJbWgtPkJsb2NrTXVsdGlwbGllckJpdHMpOwogCQkJaW5mdGwtPkVyYXNlU2l6ZSA9IGluZnRsLT5tYmQubXRkLT5lcmFzZXNpemUgPDwKIAkJCQltaC0+QmxvY2tNdWx0aXBsaWVyQml0czsKLQkJCWluZnRsLT5uYl9ibG9ja3MgPSBpbmZ0bC0+bWJkLm10ZC0+c2l6ZSAvIGluZnRsLT5FcmFzZVNpemU7CisJCQlpbmZ0bC0+bmJfYmxvY2tzID0gKHUzMilpbmZ0bC0+bWJkLm10ZC0+c2l6ZSAvIGluZnRsLT5FcmFzZVNpemU7CiAJCQlibG9jayA+Pj0gbWgtPkJsb2NrTXVsdGlwbGllckJpdHM7CiAJCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbHBkZHIvS2NvbmZpZyBiL2RyaXZlcnMvbXRkL2xwZGRyL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWNkNGVhOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbXRkL2xwZGRyL0tjb25maWcKQEAgLTAsMCArMSwyMiBAQAorIyBkcml2ZXJzL210ZC9jaGlwcy9LY29uZmlnCisKK21lbnUgIkxQRERSIGZsYXNoIG1lbW9yeSBkcml2ZXJzIgorCWRlcGVuZHMgb24gTVREIT1uCisKK2NvbmZpZyBNVERfTFBERFIKKwl0cmlzdGF0ZSAiU3VwcG9ydCBmb3IgTFBERFIgZmxhc2ggY2hpcHMiCisJc2VsZWN0IE1URF9RSU5GT19QUk9CRQorCWhlbHAKKwkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgc3VwcG9ydCBvZiBMUEREUiAoTG93IHBvd2VyIGRvdWJsZSBkYXRhIHJhdGUpCisJICBmbGFzaCBjaGlwcy4gU3lub255bW91cyB3aXRoIE1vYmlsZS1ERFIuIEl0IGlzIGEgbmV3IHN0YW5kYXJkIGZvcgorCSAgRERSIG1lbW9yaWVzLCBpbnRlbmRlZCBmb3IgYmF0dGVyeS1vcGVyYXRlZCBzeXN0ZW1zLgorCitjb25maWcgTVREX1FJTkZPX1BST0JFCisJdHJpc3RhdGUgIkRldGVjdCBmbGFzaCBjaGlwcyBieSBRSU5GTyBwcm9iZSIKKwloZWxwCisJICAgIERldmljZSBJbmZvcm1hdGlvbiBmb3IgTFBERFIgY2hpcHMgaXMgb2ZmZXJlZCB0aHJvdWdoIHRoZSBPdmVybGF5CisJICAgIFdpbmRvdyBRSU5GTyBpbnRlcmZhY2UsIHBlcm1pdHMgc29mdHdhcmUgdG8gYmUgdXNlZCBmb3IgZW50aXJlCisJICAgIGZhbWlsaWVzIG9mIGRldmljZXMuIFRoaXMgc2VydmVzIHNpbWlsYXIgcHVycG9zZSBvZiBDRkkgb24gbGVnYWN5CisJICAgIEZsYXNoIHByb2R1Y3RzCitlbmRtZW51CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL2xwZGRyL01ha2VmaWxlIGIvZHJpdmVycy9tdGQvbHBkZHIvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGE0OGU0NgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbXRkL2xwZGRyL01ha2VmaWxlCkBAIC0wLDAgKzEsNiBAQAorIworIyBsaW51eC9kcml2ZXJzL210ZC9scGRkci9NYWtlZmlsZQorIworCitvYmotJChDT05GSUdfTVREX1FJTkZPX1BST0JFKQkrPSBxaW5mb19wcm9iZS5vCitvYmotJChDT05GSUdfTVREX0xQRERSKQkrPSBscGRkcl9jbWRzLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL2xwZGRyL2xwZGRyX2NtZHMuYyBiL2RyaXZlcnMvbXRkL2xwZGRyL2xwZGRyX2NtZHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjJjYTQ5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tdGQvbHBkZHIvbHBkZHJfY21kcy5jCkBAIC0wLDAgKzEsNzk2IEBACisvKgorICogTFBERFIgZmxhc2ggbWVtb3J5IGRldmljZSBvcGVyYXRpb25zLiBUaGlzIG1vZHVsZSBwcm92aWRlcyByZWFkLCB3cml0ZSwKKyAqIGVyYXNlLCBsb2NrL3VubG9jayBzdXBwb3J0IGZvciBMUEREUiBmbGFzaCBtZW1vcmllcworICogKEMpIDIwMDggS29yb2xldiBBbGV4ZXkgPGFrb3JvbGV2QGluZnJhZGVhZC5vcmc+CisgKiAoQykgMjAwOCBWYXNpbGl5IExlb25lbmtvIDx2YXNpbGl5Lmxlb25lbmtvQGdtYWlsLmNvbT4KKyAqIE1hbnkgdGhhbmtzIHRvIFJvbWFuIEJvcmlzb3YgZm9yIGludGlhbCBlbmFibGluZworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgorICogb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEsIFVTQS4KKyAqIFRPRE86CisgKiBJbXBsZW1lbnQgVlBQIG1hbmFnZW1lbnQKKyAqIEltcGxlbWVudCBYSVAgc3VwcG9ydAorICogSW1wbGVtZW50IE9UUCBzdXBwb3J0CisgKi8KKyNpbmNsdWRlIDxsaW51eC9tdGQvcGZvdy5oPgorI2luY2x1ZGUgPGxpbnV4L210ZC9xaW5mby5oPgorCitzdGF0aWMgaW50IGxwZGRyX3JlYWQoc3RydWN0IG10ZF9pbmZvICptdGQsIGxvZmZfdCBhZHIsIHNpemVfdCBsZW4sCisJCQkJCXNpemVfdCAqcmV0bGVuLCB1X2NoYXIgKmJ1Zik7CitzdGF0aWMgaW50IGxwZGRyX3dyaXRlX2J1ZmZlcnMoc3RydWN0IG10ZF9pbmZvICptdGQsIGxvZmZfdCB0bywKKwkJCQlzaXplX3QgbGVuLCBzaXplX3QgKnJldGxlbiwgY29uc3QgdV9jaGFyICpidWYpOworc3RhdGljIGludCBscGRkcl93cml0ZXYoc3RydWN0IG10ZF9pbmZvICptdGQsIGNvbnN0IHN0cnVjdCBrdmVjICp2ZWNzLAorCQkJCXVuc2lnbmVkIGxvbmcgY291bnQsIGxvZmZfdCB0bywgc2l6ZV90ICpyZXRsZW4pOworc3RhdGljIGludCBscGRkcl9lcmFzZShzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgc3RydWN0IGVyYXNlX2luZm8gKmluc3RyKTsKK3N0YXRpYyBpbnQgbHBkZHJfbG9jayhzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgbG9mZl90IG9mcywgdWludDY0X3QgbGVuKTsKK3N0YXRpYyBpbnQgbHBkZHJfdW5sb2NrKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBsb2ZmX3Qgb2ZzLCB1aW50NjRfdCBsZW4pOworc3RhdGljIGludCBscGRkcl9wb2ludChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgbG9mZl90IGFkciwgc2l6ZV90IGxlbiwKKwkJCXNpemVfdCAqcmV0bGVuLCB2b2lkICoqbXRkYnVmLCByZXNvdXJjZV9zaXplX3QgKnBoeXMpOworc3RhdGljIHZvaWQgbHBkZHJfdW5wb2ludChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgbG9mZl90IGFkciwgc2l6ZV90IGxlbik7CitzdGF0aWMgaW50IGdldF9jaGlwKHN0cnVjdCBtYXBfaW5mbyAqbWFwLCBzdHJ1Y3QgZmxjaGlwICpjaGlwLCBpbnQgbW9kZSk7CitzdGF0aWMgaW50IGNoaXBfcmVhZHkoc3RydWN0IG1hcF9pbmZvICptYXAsIHN0cnVjdCBmbGNoaXAgKmNoaXAsIGludCBtb2RlKTsKK3N0YXRpYyB2b2lkIHB1dF9jaGlwKHN0cnVjdCBtYXBfaW5mbyAqbWFwLCBzdHJ1Y3QgZmxjaGlwICpjaGlwKTsKKworc3RydWN0IG10ZF9pbmZvICpscGRkcl9jbWRzZXQoc3RydWN0IG1hcF9pbmZvICptYXApCit7CisJc3RydWN0IGxwZGRyX3ByaXZhdGUgKmxwZGRyID0gbWFwLT5mbGRydl9wcml2OworCXN0cnVjdCBmbGNoaXBfc2hhcmVkICpzaGFyZWQ7CisJc3RydWN0IGZsY2hpcCAqY2hpcDsKKwlzdHJ1Y3QgbXRkX2luZm8gKm10ZDsKKwlpbnQgbnVtY2hpcHM7CisJaW50IGksIGo7CisKKwltdGQgPSBremFsbG9jKHNpemVvZigqbXRkKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFtdGQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBNVEQgZGV2aWNlXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCW10ZC0+cHJpdiA9IG1hcDsKKwltdGQtPnR5cGUgPSBNVERfTk9SRkxBU0g7CisKKwkvKiBGaWxsIGluIHRoZSBkZWZhdWx0IG10ZCBvcGVyYXRpb25zICovCisJbXRkLT5yZWFkID0gbHBkZHJfcmVhZDsKKwltdGQtPnR5cGUgPSBNVERfTk9SRkxBU0g7CisJbXRkLT5mbGFncyA9IE1URF9DQVBfTk9SRkxBU0g7CisJbXRkLT5mbGFncyAmPSB+TVREX0JJVF9XUklURUFCTEU7CisJbXRkLT5lcmFzZSA9IGxwZGRyX2VyYXNlOworCW10ZC0+d3JpdGUgPSBscGRkcl93cml0ZV9idWZmZXJzOworCW10ZC0+d3JpdGV2ID0gbHBkZHJfd3JpdGV2OworCW10ZC0+cmVhZF9vb2IgPSBOVUxMOworCW10ZC0+d3JpdGVfb29iID0gTlVMTDsKKwltdGQtPnN5bmMgPSBOVUxMOworCW10ZC0+bG9jayA9IGxwZGRyX2xvY2s7CisJbXRkLT51bmxvY2sgPSBscGRkcl91bmxvY2s7CisJbXRkLT5zdXNwZW5kID0gTlVMTDsKKwltdGQtPnJlc3VtZSA9IE5VTEw7CisJaWYgKG1hcF9pc19saW5lYXIobWFwKSkgeworCQltdGQtPnBvaW50ID0gbHBkZHJfcG9pbnQ7CisJCW10ZC0+dW5wb2ludCA9IGxwZGRyX3VucG9pbnQ7CisJfQorCW10ZC0+YmxvY2tfaXNiYWQgPSBOVUxMOworCW10ZC0+YmxvY2tfbWFya2JhZCA9IE5VTEw7CisJbXRkLT5zaXplID0gMSA8PCBscGRkci0+cWluZm8tPkRldlNpemVTaGlmdDsKKwltdGQtPmVyYXNlc2l6ZSA9IDEgPDwgbHBkZHItPnFpbmZvLT5Vbmlmb3JtQmxvY2tTaXplU2hpZnQ7CisJbXRkLT53cml0ZXNpemUgPSAxIDw8IGxwZGRyLT5xaW5mby0+QnVmU2l6ZVNoaWZ0OworCisJc2hhcmVkID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGZsY2hpcF9zaGFyZWQpICogbHBkZHItPm51bWNoaXBzLAorCQkJCQkJR0ZQX0tFUk5FTCk7CisJaWYgKCFzaGFyZWQpIHsKKwkJa2ZyZWUobHBkZHIpOworCQlrZnJlZShtdGQpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwljaGlwID0gJmxwZGRyLT5jaGlwc1swXTsKKwludW1jaGlwcyA9IGxwZGRyLT5udW1jaGlwcyAvIGxwZGRyLT5xaW5mby0+SFdQYXJ0c051bTsKKwlmb3IgKGkgPSAwOyBpIDwgbnVtY2hpcHM7IGkrKykgeworCQlzaGFyZWRbaV0ud3JpdGluZyA9IHNoYXJlZFtpXS5lcmFzaW5nID0gTlVMTDsKKwkJc3Bpbl9sb2NrX2luaXQoJnNoYXJlZFtpXS5sb2NrKTsKKwkJZm9yIChqID0gMDsgaiA8IGxwZGRyLT5xaW5mby0+SFdQYXJ0c051bTsgaisrKSB7CisJCQkqY2hpcCA9IGxwZGRyLT5jaGlwc1tpXTsKKwkJCWNoaXAtPnN0YXJ0ICs9IGogPDwgbHBkZHItPmNoaXBzaGlmdDsKKwkJCWNoaXAtPm9sZHN0YXRlID0gY2hpcC0+c3RhdGUgPSBGTF9SRUFEWTsKKwkJCWNoaXAtPnByaXYgPSAmc2hhcmVkW2ldOworCQkJLyogdGhvc2Ugc2hvdWxkIGJlIHJlc2V0IHRvbyBzaW5jZQorCQkJICAgdGhleSBjcmVhdGUgbWVtb3J5IHJlZmVyZW5jZXMuICovCisJCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZjaGlwLT53cSk7CisJCQlzcGluX2xvY2tfaW5pdCgmY2hpcC0+X3NwaW5sb2NrKTsKKwkJCWNoaXAtPm11dGV4ID0gJmNoaXAtPl9zcGlubG9jazsKKwkJCWNoaXArKzsKKwkJfQorCX0KKworCXJldHVybiBtdGQ7Cit9CitFWFBPUlRfU1lNQk9MKGxwZGRyX2NtZHNldCk7CisKK3N0YXRpYyBpbnQgd2FpdF9mb3JfcmVhZHkoc3RydWN0IG1hcF9pbmZvICptYXAsIHN0cnVjdCBmbGNoaXAgKmNoaXAsCisJCXVuc2lnbmVkIGludCBjaGlwX29wX3RpbWUpCit7CisJdW5zaWduZWQgaW50IHRpbWVvLCByZXNldF90aW1lbywgc2xlZXBfdGltZTsKKwl1bnNpZ25lZCBpbnQgZHNyOworCWZsc3RhdGVfdCBjaGlwX3N0YXRlID0gY2hpcC0+c3RhdGU7CisJaW50IHJldCA9IDA7CisKKwkvKiBzZXQgb3VyIHRpbWVvdXQgdG8gOCB0aW1lcyB0aGUgZXhwZWN0ZWQgZGVsYXkgKi8KKwl0aW1lbyA9IGNoaXBfb3BfdGltZSAqIDg7CisJaWYgKCF0aW1lbykKKwkJdGltZW8gPSA1MDAwMDA7CisJcmVzZXRfdGltZW8gPSB0aW1lbzsKKwlzbGVlcF90aW1lID0gY2hpcF9vcF90aW1lIC8gMjsKKworCWZvciAoOzspIHsKKwkJZHNyID0gQ01EVkFMKG1hcF9yZWFkKG1hcCwgbWFwLT5wZm93X2Jhc2UgKyBQRk9XX0RTUikpOworCQlpZiAoZHNyICYgRFNSX1JFQURZX1NUQVRVUykKKwkJCWJyZWFrOworCQlpZiAoIXRpbWVvKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBGbGFzaCB0aW1lb3V0IGVycm9yIHN0YXRlICVkIFxuIiwKKwkJCQkJCQltYXAtPm5hbWUsIGNoaXBfc3RhdGUpOworCQkJcmV0ID0gLUVUSU1FOworCQkJYnJlYWs7CisJCX0KKworCQkvKiBPSyBTdGlsbCB3YWl0aW5nLiBEcm9wIHRoZSBsb2NrLCB3YWl0IGEgd2hpbGUgYW5kIHJldHJ5LiAqLworCQlzcGluX3VubG9jayhjaGlwLT5tdXRleCk7CisJCWlmIChzbGVlcF90aW1lID49IDEwMDAwMDAvSFopIHsKKwkJCS8qCisJCQkgKiBIYWxmIG9mIHRoZSBub3JtYWwgZGVsYXkgc3RpbGwgcmVtYWluaW5nCisJCQkgKiBjYW4gYmUgcGVyZm9ybWVkIHdpdGggYSBzbGVlcGluZyBkZWxheSBpbnN0ZWFkCisJCQkgKiBvZiBidXN5IHdhaXRpbmcuCisJCQkgKi8KKwkJCW1zbGVlcChzbGVlcF90aW1lLzEwMDApOworCQkJdGltZW8gLT0gc2xlZXBfdGltZTsKKwkJCXNsZWVwX3RpbWUgPSAxMDAwMDAwL0haOworCQl9IGVsc2UgeworCQkJdWRlbGF5KDEpOworCQkJY29uZF9yZXNjaGVkKCk7CisJCQl0aW1lby0tOworCQl9CisJCXNwaW5fbG9jayhjaGlwLT5tdXRleCk7CisKKwkJd2hpbGUgKGNoaXAtPnN0YXRlICE9IGNoaXBfc3RhdGUpIHsKKwkJCS8qIFNvbWVvbmUncyBzdXNwZW5kZWQgdGhlIG9wZXJhdGlvbjogc2xlZXAgKi8KKwkJCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOworCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOworCQkJYWRkX3dhaXRfcXVldWUoJmNoaXAtPndxLCAmd2FpdCk7CisJCQlzcGluX3VubG9jayhjaGlwLT5tdXRleCk7CisJCQlzY2hlZHVsZSgpOworCQkJcmVtb3ZlX3dhaXRfcXVldWUoJmNoaXAtPndxLCAmd2FpdCk7CisJCQlzcGluX2xvY2soY2hpcC0+bXV0ZXgpOworCQl9CisJCWlmIChjaGlwLT5lcmFzZV9zdXNwZW5kZWQgfHwgY2hpcC0+d3JpdGVfc3VzcGVuZGVkKSAgeworCQkJLyogU3VzcGVuZCBoYXMgb2NjdXJlZCB3aGlsZSBzbGVlcDogcmVzZXQgdGltZW91dCAqLworCQkJdGltZW8gPSByZXNldF90aW1lbzsKKwkJCWNoaXAtPmVyYXNlX3N1c3BlbmRlZCA9IGNoaXAtPndyaXRlX3N1c3BlbmRlZCA9IDA7CisJCX0KKwl9CisJLyogY2hlY2sgc3RhdHVzIGZvciBlcnJvcnMgKi8KKwlpZiAoZHNyICYgRFNSX0VSUikgeworCQkvKiBDbGVhciBEU1IqLworCQltYXBfd3JpdGUobWFwLCBDTUQofihEU1JfRVJSKSksIG1hcC0+cGZvd19iYXNlICsgUEZPV19EU1IpOworCQlwcmludGsoS0VSTl9XQVJOSU5HIiVzOiBCYWQgc3RhdHVzIG9uIHdhaXQ6IDB4JXggXG4iLAorCQkJCW1hcC0+bmFtZSwgZHNyKTsKKwkJcHJpbnRfZHJzX2Vycm9yKGRzcik7CisJCXJldCA9IC1FSU87CisJfQorCWNoaXAtPnN0YXRlID0gRkxfUkVBRFk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBnZXRfY2hpcChzdHJ1Y3QgbWFwX2luZm8gKm1hcCwgc3RydWN0IGZsY2hpcCAqY2hpcCwgaW50IG1vZGUpCit7CisJaW50IHJldDsKKwlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKKworIHJldHJ5OgorCWlmIChjaGlwLT5wcml2ICYmIChtb2RlID09IEZMX1dSSVRJTkcgfHwgbW9kZSA9PSBGTF9FUkFTSU5HKQorCQkmJiBjaGlwLT5zdGF0ZSAhPSBGTF9TWU5DSU5HKSB7CisJCS8qCisJCSAqIE9LLiBXZSBoYXZlIHBvc3NpYmlsaXR5IGZvciBjb250ZW5zaW9uIG9uIHRoZSB3cml0ZS9lcmFzZQorCQkgKiBvcGVyYXRpb25zIHdoaWNoIGFyZSBnbG9iYWwgdG8gdGhlIHJlYWwgY2hpcCBhbmQgbm90IHBlcgorCQkgKiBwYXJ0aXRpb24uICBTbyBsZXQncyBmaWdodCBpdCBvdmVyIGluIHRoZSBwYXJ0aXRpb24gd2hpY2gKKwkJICogY3VycmVudGx5IGhhcyBhdXRob3JpdHkgb24gdGhlIG9wZXJhdGlvbi4KKwkJICoKKwkJICogVGhlIHJ1bGVzIGFyZSBhcyBmb2xsb3dzOgorCQkgKgorCQkgKiAtIGFueSB3cml0ZSBvcGVyYXRpb24gbXVzdCBvd24gc2hhcmVkLT53cml0aW5nLgorCQkgKgorCQkgKiAtIGFueSBlcmFzZSBvcGVyYXRpb24gbXVzdCBvd24gX2JvdGhfIHNoYXJlZC0+d3JpdGluZyBhbmQKKwkJICogICBzaGFyZWQtPmVyYXNpbmcuCisJCSAqCisJCSAqIC0gY29udGVuc2lvbiBhcmJpdHJhdGlvbiBpcyBoYW5kbGVkIGluIHRoZSBvd25lcidzIGNvbnRleHQuCisJCSAqCisJCSAqIFRoZSAnc2hhcmVkJyBzdHJ1Y3QgY2FuIGJlIHJlYWQgYW5kL29yIHdyaXR0ZW4gb25seSB3aGVuCisJCSAqIGl0cyBsb2NrIGlzIHRha2VuLgorCQkgKi8KKwkJc3RydWN0IGZsY2hpcF9zaGFyZWQgKnNoYXJlZCA9IGNoaXAtPnByaXY7CisJCXN0cnVjdCBmbGNoaXAgKmNvbnRlbmRlcjsKKwkJc3Bpbl9sb2NrKCZzaGFyZWQtPmxvY2spOworCQljb250ZW5kZXIgPSBzaGFyZWQtPndyaXRpbmc7CisJCWlmIChjb250ZW5kZXIgJiYgY29udGVuZGVyICE9IGNoaXApIHsKKwkJCS8qCisJCQkgKiBUaGUgZW5naW5lIHRvIHBlcmZvcm0gZGVzaXJlZCBvcGVyYXRpb24gb24gdGhpcworCQkJICogcGFydGl0aW9uIGlzIGFscmVhZHkgaW4gdXNlIGJ5IHNvbWVvbmUgZWxzZS4KKwkJCSAqIExldCdzIGZpZ2h0IG92ZXIgaXQgaW4gdGhlIGNvbnRleHQgb2YgdGhlIGNoaXAKKwkJCSAqIGN1cnJlbnRseSB1c2luZyBpdC4gIElmIGl0IGlzIHBvc3NpYmxlIHRvIHN1c3BlbmQsCisJCQkgKiB0aGF0IG90aGVyIHBhcnRpdGlvbiB3aWxsIGRvIGp1c3QgdGhhdCwgb3RoZXJ3aXNlCisJCQkgKiBpdCdsbCBoYXBwaWx5IHNlbmQgdXMgdG8gc2xlZXAuICBJbiBhbnkgY2FzZSwgd2hlbgorCQkJICogZ2V0X2NoaXAgcmV0dXJucyBzdWNjZXNzIHdlJ3JlIGNsZWFyIHRvIGdvIGFoZWFkLgorCQkJICovCisJCQlyZXQgPSBzcGluX3RyeWxvY2soY29udGVuZGVyLT5tdXRleCk7CisJCQlzcGluX3VubG9jaygmc2hhcmVkLT5sb2NrKTsKKwkJCWlmICghcmV0KQorCQkJCWdvdG8gcmV0cnk7CisJCQlzcGluX3VubG9jayhjaGlwLT5tdXRleCk7CisJCQlyZXQgPSBjaGlwX3JlYWR5KG1hcCwgY29udGVuZGVyLCBtb2RlKTsKKwkJCXNwaW5fbG9jayhjaGlwLT5tdXRleCk7CisKKwkJCWlmIChyZXQgPT0gLUVBR0FJTikgeworCQkJCXNwaW5fdW5sb2NrKGNvbnRlbmRlci0+bXV0ZXgpOworCQkJCWdvdG8gcmV0cnk7CisJCQl9CisJCQlpZiAocmV0KSB7CisJCQkJc3Bpbl91bmxvY2soY29udGVuZGVyLT5tdXRleCk7CisJCQkJcmV0dXJuIHJldDsKKwkJCX0KKwkJCXNwaW5fbG9jaygmc2hhcmVkLT5sb2NrKTsKKworCQkJLyogV2Ugc2hvdWxkIG5vdCBvd24gY2hpcCBpZiBpdCBpcyBhbHJlYWR5IGluIEZMX1NZTkNJTkcKKwkJCSAqIHN0YXRlLiBQdXQgY29udGVuZGVyIGFuZCByZXRyeS4gKi8KKwkJCWlmIChjaGlwLT5zdGF0ZSA9PSBGTF9TWU5DSU5HKSB7CisJCQkJcHV0X2NoaXAobWFwLCBjb250ZW5kZXIpOworCQkJCXNwaW5fdW5sb2NrKGNvbnRlbmRlci0+bXV0ZXgpOworCQkJCWdvdG8gcmV0cnk7CisJCQl9CisJCQlzcGluX3VubG9jayhjb250ZW5kZXItPm11dGV4KTsKKwkJfQorCisJCS8qIENoZWNrIGlmIHdlIGhhdmUgc3VzcGVuZGVkIGVyYXNlIG9uIHRoaXMgY2hpcC4KKwkJICAgTXVzdCBzbGVlcCBpbiBzdWNoIGEgY2FzZS4gKi8KKwkJaWYgKG1vZGUgPT0gRkxfRVJBU0lORyAmJiBzaGFyZWQtPmVyYXNpbmcKKwkJICAgICYmIHNoYXJlZC0+ZXJhc2luZy0+b2xkc3RhdGUgPT0gRkxfRVJBU0lORykgeworCQkJc3Bpbl91bmxvY2soJnNoYXJlZC0+bG9jayk7CisJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJCQlhZGRfd2FpdF9xdWV1ZSgmY2hpcC0+d3EsICZ3YWl0KTsKKwkJCXNwaW5fdW5sb2NrKGNoaXAtPm11dGV4KTsKKwkJCXNjaGVkdWxlKCk7CisJCQlyZW1vdmVfd2FpdF9xdWV1ZSgmY2hpcC0+d3EsICZ3YWl0KTsKKwkJCXNwaW5fbG9jayhjaGlwLT5tdXRleCk7CisJCQlnb3RvIHJldHJ5OworCQl9CisKKwkJLyogV2Ugbm93IG93biBpdCAqLworCQlzaGFyZWQtPndyaXRpbmcgPSBjaGlwOworCQlpZiAobW9kZSA9PSBGTF9FUkFTSU5HKQorCQkJc2hhcmVkLT5lcmFzaW5nID0gY2hpcDsKKwkJc3Bpbl91bmxvY2soJnNoYXJlZC0+bG9jayk7CisJfQorCisJcmV0ID0gY2hpcF9yZWFkeShtYXAsIGNoaXAsIG1vZGUpOworCWlmIChyZXQgPT0gLUVBR0FJTikKKwkJZ290byByZXRyeTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgY2hpcF9yZWFkeShzdHJ1Y3QgbWFwX2luZm8gKm1hcCwgc3RydWN0IGZsY2hpcCAqY2hpcCwgaW50IG1vZGUpCit7CisJc3RydWN0IGxwZGRyX3ByaXZhdGUgKmxwZGRyID0gbWFwLT5mbGRydl9wcml2OworCWludCByZXQgPSAwOworCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOworCisJLyogUHJldmVudCBzZXR0aW5nIHN0YXRlIEZMX1NZTkNJTkcgZm9yIGNoaXAgaW4gc3VzcGVuZGVkIHN0YXRlLiAqLworCWlmIChGTF9TWU5DSU5HID09IG1vZGUgJiYgRkxfUkVBRFkgIT0gY2hpcC0+b2xkc3RhdGUpCisJCWdvdG8gc2xlZXA7CisKKwlzd2l0Y2ggKGNoaXAtPnN0YXRlKSB7CisJY2FzZSBGTF9SRUFEWToKKwljYXNlIEZMX0pFREVDX1FVRVJZOgorCQlyZXR1cm4gMDsKKworCWNhc2UgRkxfRVJBU0lORzoKKwkJaWYgKCFscGRkci0+cWluZm8tPlN1c3BFcmFzZVN1cHAgfHwKKwkJCSEobW9kZSA9PSBGTF9SRUFEWSB8fCBtb2RlID09IEZMX1BPSU5UKSkKKwkJCWdvdG8gc2xlZXA7CisKKwkJbWFwX3dyaXRlKG1hcCwgQ01EKExQRERSX1NVU1BFTkQpLAorCQkJbWFwLT5wZm93X2Jhc2UgKyBQRk9XX1BST0dSQU1fRVJBU0VfU1VTUEVORCk7CisJCWNoaXAtPm9sZHN0YXRlID0gRkxfRVJBU0lORzsKKwkJY2hpcC0+c3RhdGUgPSBGTF9FUkFTRV9TVVNQRU5ESU5HOworCQlyZXQgPSB3YWl0X2Zvcl9yZWFkeShtYXAsIGNoaXAsIDApOworCQlpZiAocmV0KSB7CisJCQkvKiBPb3BzLiBzb21ldGhpbmcgZ290IHdyb25nLiAqLworCQkJLyogUmVzdW1lIGFuZCBwcmV0ZW5kIHdlIHdlcmVuJ3QgaGVyZS4gICovCisJCQltYXBfd3JpdGUobWFwLCBDTUQoTFBERFJfUkVTVU1FKSwKKwkJCQltYXAtPnBmb3dfYmFzZSArIFBGT1dfQ09NTUFORF9DT0RFKTsKKwkJCW1hcF93cml0ZShtYXAsIENNRChMUEREUl9TVEFSVF9FWEVDVVRJT04pLAorCQkJCW1hcC0+cGZvd19iYXNlICsgUEZPV19DT01NQU5EX0VYRUNVVEUpOworCQkJY2hpcC0+c3RhdGUgPSBGTF9FUkFTSU5HOworCQkJY2hpcC0+b2xkc3RhdGUgPSBGTF9SRUFEWTsKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IHN1c3BlbmQgb3BlcmF0aW9uIGZhaWxlZC4iCisJCQkJCSJTdGF0ZSBtYXkgYmUgd3JvbmcgXG4iLCBtYXAtPm5hbWUpOworCQkJcmV0dXJuIC1FSU87CisJCX0KKwkJY2hpcC0+ZXJhc2Vfc3VzcGVuZGVkID0gMTsKKwkJY2hpcC0+c3RhdGUgPSBGTF9SRUFEWTsKKwkJcmV0dXJuIDA7CisJCS8qIEVyYXNlIHN1c3BlbmQgKi8KKwljYXNlIEZMX1BPSU5UOgorCQkvKiBPbmx5IGlmIHRoZXJlJ3Mgbm8gb3BlcmF0aW9uIHN1c3BlbmRlZC4uLiAqLworCQlpZiAobW9kZSA9PSBGTF9SRUFEWSAmJiBjaGlwLT5vbGRzdGF0ZSA9PSBGTF9SRUFEWSkKKwkJCXJldHVybiAwOworCisJZGVmYXVsdDoKK3NsZWVwOgorCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJCWFkZF93YWl0X3F1ZXVlKCZjaGlwLT53cSwgJndhaXQpOworCQlzcGluX3VubG9jayhjaGlwLT5tdXRleCk7CisJCXNjaGVkdWxlKCk7CisJCXJlbW92ZV93YWl0X3F1ZXVlKCZjaGlwLT53cSwgJndhaXQpOworCQlzcGluX2xvY2soY2hpcC0+bXV0ZXgpOworCQlyZXR1cm4gLUVBR0FJTjsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHB1dF9jaGlwKHN0cnVjdCBtYXBfaW5mbyAqbWFwLCBzdHJ1Y3QgZmxjaGlwICpjaGlwKQoreworCWlmIChjaGlwLT5wcml2KSB7CisJCXN0cnVjdCBmbGNoaXBfc2hhcmVkICpzaGFyZWQgPSBjaGlwLT5wcml2OworCQlzcGluX2xvY2soJnNoYXJlZC0+bG9jayk7CisJCWlmIChzaGFyZWQtPndyaXRpbmcgPT0gY2hpcCAmJiBjaGlwLT5vbGRzdGF0ZSA9PSBGTF9SRUFEWSkgeworCQkJLyogV2Ugb3duIHRoZSBhYmlsaXR5IHRvIHdyaXRlLCBidXQgd2UncmUgZG9uZSAqLworCQkJc2hhcmVkLT53cml0aW5nID0gc2hhcmVkLT5lcmFzaW5nOworCQkJaWYgKHNoYXJlZC0+d3JpdGluZyAmJiBzaGFyZWQtPndyaXRpbmcgIT0gY2hpcCkgeworCQkJCS8qIGdpdmUgYmFjayB0aGUgb3duZXJzaGlwICovCisJCQkJc3RydWN0IGZsY2hpcCAqbG9hbmVyID0gc2hhcmVkLT53cml0aW5nOworCQkJCXNwaW5fbG9jayhsb2FuZXItPm11dGV4KTsKKwkJCQlzcGluX3VubG9jaygmc2hhcmVkLT5sb2NrKTsKKwkJCQlzcGluX3VubG9jayhjaGlwLT5tdXRleCk7CisJCQkJcHV0X2NoaXAobWFwLCBsb2FuZXIpOworCQkJCXNwaW5fbG9jayhjaGlwLT5tdXRleCk7CisJCQkJc3Bpbl91bmxvY2sobG9hbmVyLT5tdXRleCk7CisJCQkJd2FrZV91cCgmY2hpcC0+d3EpOworCQkJCXJldHVybjsKKwkJCX0KKwkJCXNoYXJlZC0+ZXJhc2luZyA9IE5VTEw7CisJCQlzaGFyZWQtPndyaXRpbmcgPSBOVUxMOworCQl9IGVsc2UgaWYgKHNoYXJlZC0+ZXJhc2luZyA9PSBjaGlwICYmIHNoYXJlZC0+d3JpdGluZyAhPSBjaGlwKSB7CisJCQkvKgorCQkJICogV2Ugb3duIHRoZSBhYmlsaXR5IHRvIGVyYXNlIHdpdGhvdXQgdGhlIGFiaWxpdHkKKwkJCSAqIHRvIHdyaXRlLCB3aGljaCBtZWFucyB0aGUgZXJhc2Ugd2FzIHN1c3BlbmRlZAorCQkJICogYW5kIHNvbWUgb3RoZXIgcGFydGl0aW9uIGlzIGN1cnJlbnRseSB3cml0aW5nLgorCQkJICogRG9uJ3QgbGV0IHRoZSBzd2l0Y2ggYmVsb3cgbWVzcyB0aGluZ3MgdXAgc2luY2UKKwkJCSAqIHdlIGRvbid0IGhhdmUgb3duZXJzaGlwIHRvIHJlc3VtZSBhbnl0aGluZy4KKwkJCSAqLworCQkJc3Bpbl91bmxvY2soJnNoYXJlZC0+bG9jayk7CisJCQl3YWtlX3VwKCZjaGlwLT53cSk7CisJCQlyZXR1cm47CisJCX0KKwkJc3Bpbl91bmxvY2soJnNoYXJlZC0+bG9jayk7CisJfQorCisJc3dpdGNoIChjaGlwLT5vbGRzdGF0ZSkgeworCWNhc2UgRkxfRVJBU0lORzoKKwkJY2hpcC0+c3RhdGUgPSBjaGlwLT5vbGRzdGF0ZTsKKwkJbWFwX3dyaXRlKG1hcCwgQ01EKExQRERSX1JFU1VNRSksCisJCQkJbWFwLT5wZm93X2Jhc2UgKyBQRk9XX0NPTU1BTkRfQ09ERSk7CisJCW1hcF93cml0ZShtYXAsIENNRChMUEREUl9TVEFSVF9FWEVDVVRJT04pLAorCQkJCW1hcC0+cGZvd19iYXNlICsgUEZPV19DT01NQU5EX0VYRUNVVEUpOworCQljaGlwLT5vbGRzdGF0ZSA9IEZMX1JFQURZOworCQljaGlwLT5zdGF0ZSA9IEZMX0VSQVNJTkc7CisJCWJyZWFrOworCWNhc2UgRkxfUkVBRFk6CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IHB1dF9jaGlwKCkgY2FsbGVkIHdpdGggb2xkc3RhdGUgJWQhXG4iLAorCQkJCW1hcC0+bmFtZSwgY2hpcC0+b2xkc3RhdGUpOworCX0KKwl3YWtlX3VwKCZjaGlwLT53cSk7Cit9CisKK2ludCBkb193cml0ZV9idWZmZXIoc3RydWN0IG1hcF9pbmZvICptYXAsIHN0cnVjdCBmbGNoaXAgKmNoaXAsCisJCQl1bnNpZ25lZCBsb25nIGFkciwgY29uc3Qgc3RydWN0IGt2ZWMgKipwdmVjLAorCQkJdW5zaWduZWQgbG9uZyAqcHZlY19zZWVrLCBpbnQgbGVuKQoreworCXN0cnVjdCBscGRkcl9wcml2YXRlICpscGRkciA9IG1hcC0+ZmxkcnZfcHJpdjsKKwltYXBfd29yZCBkYXR1bTsKKwlpbnQgcmV0LCB3YnVmc2l6ZSwgd29yZF9nYXAsIHdvcmRzOworCWNvbnN0IHN0cnVjdCBrdmVjICp2ZWM7CisJdW5zaWduZWQgbG9uZyB2ZWNfc2VlazsKKwl1bnNpZ25lZCBsb25nIHByb2dfYnVmX29mczsKKworCXdidWZzaXplID0gMSA8PCBscGRkci0+cWluZm8tPkJ1ZlNpemVTaGlmdDsKKworCXNwaW5fbG9jayhjaGlwLT5tdXRleCk7CisJcmV0ID0gZ2V0X2NoaXAobWFwLCBjaGlwLCBGTF9XUklUSU5HKTsKKwlpZiAocmV0KSB7CisJCXNwaW5fdW5sb2NrKGNoaXAtPm11dGV4KTsKKwkJcmV0dXJuIHJldDsKKwl9CisJLyogRmlndXJlIG91dCB0aGUgbnVtYmVyIG9mIHdvcmRzIHRvIHdyaXRlICovCisJd29yZF9nYXAgPSAoLWFkciAmIChtYXBfYmFua3dpZHRoKG1hcCktMSkpOworCXdvcmRzID0gKGxlbiAtIHdvcmRfZ2FwICsgbWFwX2Jhbmt3aWR0aChtYXApIC0gMSkgLyBtYXBfYmFua3dpZHRoKG1hcCk7CisJaWYgKCF3b3JkX2dhcCkgeworCQl3b3Jkcy0tOworCX0gZWxzZSB7CisJCXdvcmRfZ2FwID0gbWFwX2Jhbmt3aWR0aChtYXApIC0gd29yZF9nYXA7CisJCWFkciAtPSB3b3JkX2dhcDsKKwkJZGF0dW0gPSBtYXBfd29yZF9mZihtYXApOworCX0KKwkvKiBXcml0ZSBkYXRhICovCisJLyogR2V0IHRoZSBwcm9ncmFtIGJ1ZmZlciBvZmZzZXQgZnJvbSBQRk9XIHJlZ2lzdGVyIGRhdGEgZmlyc3QqLworCXByb2dfYnVmX29mcyA9IG1hcC0+cGZvd19iYXNlICsgQ01EVkFMKG1hcF9yZWFkKG1hcCwKKwkJCQltYXAtPnBmb3dfYmFzZSArIFBGT1dfUFJPR1JBTV9CVUZGRVJfT0ZGU0VUKSk7CisJdmVjID0gKnB2ZWM7CisJdmVjX3NlZWsgPSAqcHZlY19zZWVrOworCWRvIHsKKwkJaW50IG4gPSBtYXBfYmFua3dpZHRoKG1hcCkgLSB3b3JkX2dhcDsKKworCQlpZiAobiA+IHZlYy0+aW92X2xlbiAtIHZlY19zZWVrKQorCQkJbiA9IHZlYy0+aW92X2xlbiAtIHZlY19zZWVrOworCQlpZiAobiA+IGxlbikKKwkJCW4gPSBsZW47CisKKwkJaWYgKCF3b3JkX2dhcCAmJiAobGVuIDwgbWFwX2Jhbmt3aWR0aChtYXApKSkKKwkJCWRhdHVtID0gbWFwX3dvcmRfZmYobWFwKTsKKworCQlkYXR1bSA9IG1hcF93b3JkX2xvYWRfcGFydGlhbChtYXAsIGRhdHVtLAorCQkJCXZlYy0+aW92X2Jhc2UgKyB2ZWNfc2Vlaywgd29yZF9nYXAsIG4pOworCisJCWxlbiAtPSBuOworCQl3b3JkX2dhcCArPSBuOworCQlpZiAoIWxlbiB8fCB3b3JkX2dhcCA9PSBtYXBfYmFua3dpZHRoKG1hcCkpIHsKKwkJCW1hcF93cml0ZShtYXAsIGRhdHVtLCBwcm9nX2J1Zl9vZnMpOworCQkJcHJvZ19idWZfb2ZzICs9IG1hcF9iYW5rd2lkdGgobWFwKTsKKwkJCXdvcmRfZ2FwID0gMDsKKwkJfQorCisJCXZlY19zZWVrICs9IG47CisJCWlmICh2ZWNfc2VlayA9PSB2ZWMtPmlvdl9sZW4pIHsKKwkJCXZlYysrOworCQkJdmVjX3NlZWsgPSAwOworCQl9CisJfSB3aGlsZSAobGVuKTsKKwkqcHZlYyA9IHZlYzsKKwkqcHZlY19zZWVrID0gdmVjX3NlZWs7CisKKwkvKiBHTyBHTyBHTyAqLworCXNlbmRfcGZvd19jb21tYW5kKG1hcCwgTFBERFJfQlVGRl9QUk9HUkFNLCBhZHIsIHdidWZzaXplLCBOVUxMKTsKKwljaGlwLT5zdGF0ZSA9IEZMX1dSSVRJTkc7CisJcmV0ID0gd2FpdF9mb3JfcmVhZHkobWFwLCBjaGlwLCAoMTw8bHBkZHItPnFpbmZvLT5Qcm9nQnVmZmVyVGltZSkpOworCWlmIChyZXQpCXsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyIlcyBCdWZmZXIgcHJvZ3JhbSBlcnJvcjogJWQgYXQgJWx4OyBcbiIsCisJCQltYXAtPm5hbWUsIHJldCwgYWRyKTsKKwkJZ290byBvdXQ7CisJfQorCisgb3V0OglwdXRfY2hpcChtYXAsIGNoaXApOworCXNwaW5fdW5sb2NrKGNoaXAtPm11dGV4KTsKKwlyZXR1cm4gcmV0OworfQorCitpbnQgZG9fZXJhc2Vfb25lYmxvY2soc3RydWN0IG10ZF9pbmZvICptdGQsIGxvZmZfdCBhZHIpCit7CisJc3RydWN0IG1hcF9pbmZvICptYXAgPSBtdGQtPnByaXY7CisJc3RydWN0IGxwZGRyX3ByaXZhdGUgKmxwZGRyID0gbWFwLT5mbGRydl9wcml2OworCWludCBjaGlwbnVtID0gYWRyID4+IGxwZGRyLT5jaGlwc2hpZnQ7CisJc3RydWN0IGZsY2hpcCAqY2hpcCA9ICZscGRkci0+Y2hpcHNbY2hpcG51bV07CisJaW50IHJldDsKKworCXNwaW5fbG9jayhjaGlwLT5tdXRleCk7CisJcmV0ID0gZ2V0X2NoaXAobWFwLCBjaGlwLCBGTF9FUkFTSU5HKTsKKwlpZiAocmV0KSB7CisJCXNwaW5fdW5sb2NrKGNoaXAtPm11dGV4KTsKKwkJcmV0dXJuIHJldDsKKwl9CisJc2VuZF9wZm93X2NvbW1hbmQobWFwLCBMUEREUl9CTE9DS19FUkFTRSwgYWRyLCAwLCBOVUxMKTsKKwljaGlwLT5zdGF0ZSA9IEZMX0VSQVNJTkc7CisJcmV0ID0gd2FpdF9mb3JfcmVhZHkobWFwLCBjaGlwLCAoMTw8bHBkZHItPnFpbmZvLT5CbG9ja0VyYXNlVGltZSkqMTAwMCk7CisJaWYgKHJldCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HIiVzIEVyYXNlIGJsb2NrIGVycm9yICVkIGF0IDogJWxseFxuIiwKKwkJCW1hcC0+bmFtZSwgcmV0LCBhZHIpOworCQlnb3RvIG91dDsKKwl9Cisgb3V0OglwdXRfY2hpcChtYXAsIGNoaXApOworCXNwaW5fdW5sb2NrKGNoaXAtPm11dGV4KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGxwZGRyX3JlYWQoc3RydWN0IG10ZF9pbmZvICptdGQsIGxvZmZfdCBhZHIsIHNpemVfdCBsZW4sCisJCQlzaXplX3QgKnJldGxlbiwgdV9jaGFyICpidWYpCit7CisJc3RydWN0IG1hcF9pbmZvICptYXAgPSBtdGQtPnByaXY7CisJc3RydWN0IGxwZGRyX3ByaXZhdGUgKmxwZGRyID0gbWFwLT5mbGRydl9wcml2OworCWludCBjaGlwbnVtID0gYWRyID4+IGxwZGRyLT5jaGlwc2hpZnQ7CisJc3RydWN0IGZsY2hpcCAqY2hpcCA9ICZscGRkci0+Y2hpcHNbY2hpcG51bV07CisJaW50IHJldCA9IDA7CisKKwlzcGluX2xvY2soY2hpcC0+bXV0ZXgpOworCXJldCA9IGdldF9jaGlwKG1hcCwgY2hpcCwgRkxfUkVBRFkpOworCWlmIChyZXQpIHsKKwkJc3Bpbl91bmxvY2soY2hpcC0+bXV0ZXgpOworCQlyZXR1cm4gcmV0OworCX0KKworCW1hcF9jb3B5X2Zyb20obWFwLCBidWYsIGFkciwgbGVuKTsKKwkqcmV0bGVuID0gbGVuOworCisJcHV0X2NoaXAobWFwLCBjaGlwKTsKKwlzcGluX3VubG9jayhjaGlwLT5tdXRleCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBscGRkcl9wb2ludChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgbG9mZl90IGFkciwgc2l6ZV90IGxlbiwKKwkJCXNpemVfdCAqcmV0bGVuLCB2b2lkICoqbXRkYnVmLCByZXNvdXJjZV9zaXplX3QgKnBoeXMpCit7CisJc3RydWN0IG1hcF9pbmZvICptYXAgPSBtdGQtPnByaXY7CisJc3RydWN0IGxwZGRyX3ByaXZhdGUgKmxwZGRyID0gbWFwLT5mbGRydl9wcml2OworCWludCBjaGlwbnVtID0gYWRyID4+IGxwZGRyLT5jaGlwc2hpZnQ7CisJdW5zaWduZWQgbG9uZyBvZnMsIGxhc3RfZW5kID0gMDsKKwlzdHJ1Y3QgZmxjaGlwICpjaGlwID0gJmxwZGRyLT5jaGlwc1tjaGlwbnVtXTsKKwlpbnQgcmV0ID0gMDsKKworCWlmICghbWFwLT52aXJ0IHx8IChhZHIgKyBsZW4gPiBtdGQtPnNpemUpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIG9mczogb2Zmc2V0IHdpdGhpbiB0aGUgZmlyc3QgY2hpcCB0aGF0IHRoZSBmaXJzdCByZWFkIHNob3VsZCBzdGFydCAqLworCW9mcyA9IGFkciAtIChjaGlwbnVtIDw8IGxwZGRyLT5jaGlwc2hpZnQpOworCisJKm10ZGJ1ZiA9ICh2b2lkICopbWFwLT52aXJ0ICsgY2hpcC0+c3RhcnQgKyBvZnM7CisJKnJldGxlbiA9IDA7CisKKwl3aGlsZSAobGVuKSB7CisJCXVuc2lnbmVkIGxvbmcgdGhpc2xlbjsKKworCQlpZiAoY2hpcG51bSA+PSBscGRkci0+bnVtY2hpcHMpCisJCQlicmVhazsKKworCQkvKiBXZSBjYW5ub3QgcG9pbnQgYWNyb3NzIGNoaXBzIHRoYXQgYXJlIHZpcnR1YWxseSBkaXNqb2ludCAqLworCQlpZiAoIWxhc3RfZW5kKQorCQkJbGFzdF9lbmQgPSBjaGlwLT5zdGFydDsKKwkJZWxzZSBpZiAoY2hpcC0+c3RhcnQgIT0gbGFzdF9lbmQpCisJCQlicmVhazsKKworCQlpZiAoKGxlbiArIG9mcyAtIDEpID4+IGxwZGRyLT5jaGlwc2hpZnQpCisJCQl0aGlzbGVuID0gKDE8PGxwZGRyLT5jaGlwc2hpZnQpIC0gb2ZzOworCQllbHNlCisJCQl0aGlzbGVuID0gbGVuOworCQkvKiBnZXQgdGhlIGNoaXAgKi8KKwkJc3Bpbl9sb2NrKGNoaXAtPm11dGV4KTsKKwkJcmV0ID0gZ2V0X2NoaXAobWFwLCBjaGlwLCBGTF9QT0lOVCk7CisJCXNwaW5fdW5sb2NrKGNoaXAtPm11dGV4KTsKKwkJaWYgKHJldCkKKwkJCWJyZWFrOworCisJCWNoaXAtPnN0YXRlID0gRkxfUE9JTlQ7CisJCWNoaXAtPnJlZl9wb2ludF9jb3VudGVyKys7CisJCSpyZXRsZW4gKz0gdGhpc2xlbjsKKwkJbGVuIC09IHRoaXNsZW47CisKKwkJb2ZzID0gMDsKKwkJbGFzdF9lbmQgKz0gMSA8PCBscGRkci0+Y2hpcHNoaWZ0OworCQljaGlwbnVtKys7CisJCWNoaXAgPSAmbHBkZHItPmNoaXBzW2NoaXBudW1dOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbHBkZHJfdW5wb2ludCAoc3RydWN0IG10ZF9pbmZvICptdGQsIGxvZmZfdCBhZHIsIHNpemVfdCBsZW4pCit7CisJc3RydWN0IG1hcF9pbmZvICptYXAgPSBtdGQtPnByaXY7CisJc3RydWN0IGxwZGRyX3ByaXZhdGUgKmxwZGRyID0gbWFwLT5mbGRydl9wcml2OworCWludCBjaGlwbnVtID0gYWRyID4+IGxwZGRyLT5jaGlwc2hpZnQ7CisJdW5zaWduZWQgbG9uZyBvZnM7CisKKwkvKiBvZnM6IG9mZnNldCB3aXRoaW4gdGhlIGZpcnN0IGNoaXAgdGhhdCB0aGUgZmlyc3QgcmVhZCBzaG91bGQgc3RhcnQgKi8KKwlvZnMgPSBhZHIgLSAoY2hpcG51bSA8PCBscGRkci0+Y2hpcHNoaWZ0KTsKKworCXdoaWxlIChsZW4pIHsKKwkJdW5zaWduZWQgbG9uZyB0aGlzbGVuOworCQlzdHJ1Y3QgZmxjaGlwICpjaGlwOworCisJCWNoaXAgPSAmbHBkZHItPmNoaXBzW2NoaXBudW1dOworCQlpZiAoY2hpcG51bSA+PSBscGRkci0+bnVtY2hpcHMpCisJCQlicmVhazsKKworCQlpZiAoKGxlbiArIG9mcyAtIDEpID4+IGxwZGRyLT5jaGlwc2hpZnQpCisJCQl0aGlzbGVuID0gKDE8PGxwZGRyLT5jaGlwc2hpZnQpIC0gb2ZzOworCQllbHNlCisJCQl0aGlzbGVuID0gbGVuOworCisJCXNwaW5fbG9jayhjaGlwLT5tdXRleCk7CisJCWlmIChjaGlwLT5zdGF0ZSA9PSBGTF9QT0lOVCkgeworCQkJY2hpcC0+cmVmX3BvaW50X2NvdW50ZXItLTsKKwkJCWlmIChjaGlwLT5yZWZfcG9pbnRfY291bnRlciA9PSAwKQorCQkJCWNoaXAtPnN0YXRlID0gRkxfUkVBRFk7CisJCX0gZWxzZQorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFdhcm5pbmc6IHVucG9pbnQgY2FsbGVkIG9uIG5vbiIKKwkJCQkJInBvaW50ZWQgcmVnaW9uXG4iLCBtYXAtPm5hbWUpOworCisJCXB1dF9jaGlwKG1hcCwgY2hpcCk7CisJCXNwaW5fdW5sb2NrKGNoaXAtPm11dGV4KTsKKworCQlsZW4gLT0gdGhpc2xlbjsKKwkJb2ZzID0gMDsKKwkJY2hpcG51bSsrOworCX0KK30KKworc3RhdGljIGludCBscGRkcl93cml0ZV9idWZmZXJzKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBsb2ZmX3QgdG8sIHNpemVfdCBsZW4sCisJCQkJc2l6ZV90ICpyZXRsZW4sIGNvbnN0IHVfY2hhciAqYnVmKQoreworCXN0cnVjdCBrdmVjIHZlYzsKKworCXZlYy5pb3ZfYmFzZSA9ICh2b2lkICopIGJ1ZjsKKwl2ZWMuaW92X2xlbiA9IGxlbjsKKworCXJldHVybiBscGRkcl93cml0ZXYobXRkLCAmdmVjLCAxLCB0bywgcmV0bGVuKTsKK30KKworCitzdGF0aWMgaW50IGxwZGRyX3dyaXRldihzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgY29uc3Qgc3RydWN0IGt2ZWMgKnZlY3MsCisJCQkJdW5zaWduZWQgbG9uZyBjb3VudCwgbG9mZl90IHRvLCBzaXplX3QgKnJldGxlbikKK3sKKwlzdHJ1Y3QgbWFwX2luZm8gKm1hcCA9IG10ZC0+cHJpdjsKKwlzdHJ1Y3QgbHBkZHJfcHJpdmF0ZSAqbHBkZHIgPSBtYXAtPmZsZHJ2X3ByaXY7CisJaW50IHJldCA9IDA7CisJaW50IGNoaXBudW07CisJdW5zaWduZWQgbG9uZyBvZnMsIHZlY19zZWVrLCBpOworCWludCB3YnVmc2l6ZSA9IDEgPDwgbHBkZHItPnFpbmZvLT5CdWZTaXplU2hpZnQ7CisKKwlzaXplX3QgbGVuID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorCQlsZW4gKz0gdmVjc1tpXS5pb3ZfbGVuOworCisJKnJldGxlbiA9IDA7CisJaWYgKCFsZW4pCisJCXJldHVybiAwOworCisJY2hpcG51bSA9IHRvID4+IGxwZGRyLT5jaGlwc2hpZnQ7CisKKwlvZnMgPSB0bzsKKwl2ZWNfc2VlayA9IDA7CisKKwlkbyB7CisJCS8qIFdlIG11c3Qgbm90IGNyb3NzIHdyaXRlIGJsb2NrIGJvdW5kYXJpZXMgKi8KKwkJaW50IHNpemUgPSB3YnVmc2l6ZSAtIChvZnMgJiAod2J1ZnNpemUtMSkpOworCisJCWlmIChzaXplID4gbGVuKQorCQkJc2l6ZSA9IGxlbjsKKworCQlyZXQgPSBkb193cml0ZV9idWZmZXIobWFwLCAmbHBkZHItPmNoaXBzW2NoaXBudW1dLAorCQkJCQkgIG9mcywgJnZlY3MsICZ2ZWNfc2Vlaywgc2l6ZSk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCisJCW9mcyArPSBzaXplOworCQkoKnJldGxlbikgKz0gc2l6ZTsKKwkJbGVuIC09IHNpemU7CisKKwkJLyogQmUgbmljZSBhbmQgcmVzY2hlZHVsZSB3aXRoIHRoZSBjaGlwIGluIGEgdXNhYmxlCisJCSAqIHN0YXRlIGZvciBvdGhlciBwcm9jZXNzZXMgKi8KKwkJY29uZF9yZXNjaGVkKCk7CisKKwl9IHdoaWxlIChsZW4pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbHBkZHJfZXJhc2Uoc3RydWN0IG10ZF9pbmZvICptdGQsIHN0cnVjdCBlcmFzZV9pbmZvICppbnN0cikKK3sKKwl1bnNpZ25lZCBsb25nIG9mcywgbGVuOworCWludCByZXQ7CisJc3RydWN0IG1hcF9pbmZvICptYXAgPSBtdGQtPnByaXY7CisJc3RydWN0IGxwZGRyX3ByaXZhdGUgKmxwZGRyID0gbWFwLT5mbGRydl9wcml2OworCWludCBzaXplID0gMSA8PCBscGRkci0+cWluZm8tPlVuaWZvcm1CbG9ja1NpemVTaGlmdDsKKworCW9mcyA9IGluc3RyLT5hZGRyOworCWxlbiA9IGluc3RyLT5sZW47CisKKwlpZiAob2ZzID4gbXRkLT5zaXplIHx8IChsZW4gKyBvZnMpID4gbXRkLT5zaXplKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXdoaWxlIChsZW4gPiAwKSB7CisJCXJldCA9IGRvX2VyYXNlX29uZWJsb2NrKG10ZCwgb2ZzKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJCW9mcyArPSBzaXplOworCQlsZW4gLT0gc2l6ZTsKKwl9CisJaW5zdHItPnN0YXRlID0gTVREX0VSQVNFX0RPTkU7CisJbXRkX2VyYXNlX2NhbGxiYWNrKGluc3RyKTsKKworCXJldHVybiAwOworfQorCisjZGVmaW5lIERPX1hYTE9DS19MT0NLCQkxCisjZGVmaW5lIERPX1hYTE9DS19VTkxPQ0sJMgoraW50IGRvX3h4bG9jayhzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgbG9mZl90IGFkciwgdWludDMyX3QgbGVuLCBpbnQgdGh1bmspCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IG1hcF9pbmZvICptYXAgPSBtdGQtPnByaXY7CisJc3RydWN0IGxwZGRyX3ByaXZhdGUgKmxwZGRyID0gbWFwLT5mbGRydl9wcml2OworCWludCBjaGlwbnVtID0gYWRyID4+IGxwZGRyLT5jaGlwc2hpZnQ7CisJc3RydWN0IGZsY2hpcCAqY2hpcCA9ICZscGRkci0+Y2hpcHNbY2hpcG51bV07CisKKwlzcGluX2xvY2soY2hpcC0+bXV0ZXgpOworCXJldCA9IGdldF9jaGlwKG1hcCwgY2hpcCwgRkxfTE9DS0lORyk7CisJaWYgKHJldCkgeworCQlzcGluX3VubG9jayhjaGlwLT5tdXRleCk7CisJCXJldHVybiByZXQ7CisJfQorCisJaWYgKHRodW5rID09IERPX1hYTE9DS19MT0NLKSB7CisJCXNlbmRfcGZvd19jb21tYW5kKG1hcCwgTFBERFJfTE9DS19CTE9DSywgYWRyLCBhZHIgKyBsZW4sIE5VTEwpOworCQljaGlwLT5zdGF0ZSA9IEZMX0xPQ0tJTkc7CisJfSBlbHNlIGlmICh0aHVuayA9PSBET19YWExPQ0tfVU5MT0NLKSB7CisJCXNlbmRfcGZvd19jb21tYW5kKG1hcCwgTFBERFJfVU5MT0NLX0JMT0NLLCBhZHIsIGFkciArIGxlbiwgTlVMTCk7CisJCWNoaXAtPnN0YXRlID0gRkxfVU5MT0NLSU5HOworCX0gZWxzZQorCQlCVUcoKTsKKworCXJldCA9IHdhaXRfZm9yX3JlYWR5KG1hcCwgY2hpcCwgMSk7CisJaWYgKHJldCkJeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBibG9jayB1bmxvY2sgZXJyb3Igc3RhdHVzICVkIFxuIiwKKwkJCQltYXAtPm5hbWUsIHJldCk7CisJCWdvdG8gb3V0OworCX0KK291dDoJcHV0X2NoaXAobWFwLCBjaGlwKTsKKwlzcGluX3VubG9jayhjaGlwLT5tdXRleCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBscGRkcl9sb2NrKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBsb2ZmX3Qgb2ZzLCB1aW50NjRfdCBsZW4pCit7CisJcmV0dXJuIGRvX3h4bG9jayhtdGQsIG9mcywgbGVuLCBET19YWExPQ0tfTE9DSyk7Cit9CisKK3N0YXRpYyBpbnQgbHBkZHJfdW5sb2NrKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBsb2ZmX3Qgb2ZzLCB1aW50NjRfdCBsZW4pCit7CisJcmV0dXJuIGRvX3h4bG9jayhtdGQsIG9mcywgbGVuLCBET19YWExPQ0tfVU5MT0NLKTsKK30KKworaW50IHdvcmRfcHJvZ3JhbShzdHJ1Y3QgbWFwX2luZm8gKm1hcCwgbG9mZl90IGFkciwgdWludDMyX3QgY3VydmFsKQoreworICAgIGludCByZXQ7CisJc3RydWN0IGxwZGRyX3ByaXZhdGUgKmxwZGRyID0gbWFwLT5mbGRydl9wcml2OworCWludCBjaGlwbnVtID0gYWRyID4+IGxwZGRyLT5jaGlwc2hpZnQ7CisJc3RydWN0IGZsY2hpcCAqY2hpcCA9ICZscGRkci0+Y2hpcHNbY2hpcG51bV07CisKKwlzcGluX2xvY2soY2hpcC0+bXV0ZXgpOworCXJldCA9IGdldF9jaGlwKG1hcCwgY2hpcCwgRkxfV1JJVElORyk7CisJaWYgKHJldCkgeworCQlzcGluX3VubG9jayhjaGlwLT5tdXRleCk7CisJCXJldHVybiByZXQ7CisJfQorCisJc2VuZF9wZm93X2NvbW1hbmQobWFwLCBMUEREUl9XT1JEX1BST0dSQU0sIGFkciwgMHgwMCwgKG1hcF93b3JkICopJmN1cnZhbCk7CisKKwlyZXQgPSB3YWl0X2Zvcl9yZWFkeShtYXAsIGNoaXAsICgxPDxscGRkci0+cWluZm8tPlNpbmdsZVdvcmRQcm9nVGltZSkpOworCWlmIChyZXQpCXsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyIlcyB3b3JkX3Byb2dyYW0gZXJyb3IgYXQ6ICVsbHg7IHZhbDogJXhcbiIsCisJCQltYXAtPm5hbWUsIGFkciwgY3VydmFsKTsKKwkJZ290byBvdXQ7CisJfQorCitvdXQ6CXB1dF9jaGlwKG1hcCwgY2hpcCk7CisJc3Bpbl91bmxvY2soY2hpcC0+bXV0ZXgpOworCXJldHVybiByZXQ7Cit9CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BVVRIT1IoIkFsZXhleSBLb3JvbGV2IDxha29yb2xldkBpbmZyYWRlYWQub3JnPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJNVEQgZHJpdmVyIGZvciBMUEREUiBmbGFzaCBjaGlwcyIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbHBkZHIvcWluZm9fcHJvYmUuYyBiL2RyaXZlcnMvbXRkL2xwZGRyL3FpbmZvX3Byb2JlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzliZjQwZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbXRkL2xwZGRyL3FpbmZvX3Byb2JlLmMKQEAgLTAsMCArMSwyNTUgQEAKKy8qCisgKiBQcm9iaW5nIGZsYXNoIGNoaXBzIHdpdGggUUlORk8gcmVjb3Jkcy4KKyAqIChDKSAyMDA4IEtvcm9sZXYgQWxleGV5IDxha29yb2xldkBpbmZyYWRlYWQub3JnPgorICogKEMpIDIwMDggVmFzaWxpeSBMZW9uZW5rbyA8dmFzaWxpeS5sZW9uZW5rb0BnbWFpbC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCisgKiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSwgVVNBLgorICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisKKyNpbmNsdWRlIDxsaW51eC9tdGQveGlwLmg+CisjaW5jbHVkZSA8bGludXgvbXRkL21hcC5oPgorI2luY2x1ZGUgPGxpbnV4L210ZC9wZm93Lmg+CisjaW5jbHVkZSA8bGludXgvbXRkL3FpbmZvLmg+CisKK3N0YXRpYyBpbnQgbHBkZHJfY2hpcF9zZXR1cChzdHJ1Y3QgbWFwX2luZm8gKm1hcCwgc3RydWN0IGxwZGRyX3ByaXZhdGUgKmxwZGRyKTsKK3N0cnVjdCBtdGRfaW5mbyAqbHBkZHJfcHJvYmUoc3RydWN0IG1hcF9pbmZvICptYXApOworc3RhdGljIHN0cnVjdCBscGRkcl9wcml2YXRlICpscGRkcl9wcm9iZV9jaGlwKHN0cnVjdCBtYXBfaW5mbyAqbWFwKTsKK3N0YXRpYyBpbnQgbHBkZHJfcGZvd19wcmVzZW50KHN0cnVjdCBtYXBfaW5mbyAqbWFwLAorCQkJc3RydWN0IGxwZGRyX3ByaXZhdGUgKmxwZGRyKTsKKworc3RhdGljIHN0cnVjdCBxaW5mb19xdWVyeV9pbmZvIHFpbmZvX2FycmF5W10gPSB7CisJLyogR2VuZXJhbCBkZXZpY2UgaW5mbyAqLworCXswLCAwLCAiRGV2U2l6ZVNoaWZ0IiwgIkRldmljZSBzaXplIDJebiBieXRlcyJ9LAorCXswLCAzLCAiQnVmU2l6ZVNoaWZ0IiwgIlByb2dyYW0gYnVmZmVyIHNpemUgMl5uIGJ5dGVzIn0sCisJLyogRXJhc2UgYmxvY2sgaW5mb3JtYXRpb24gKi8KKwl7MSwgMSwgIlRvdGFsQmxvY2tzTnVtIiwgIlRvdGFsIG51bWJlciBvZiBibG9ja3MifSwKKwl7MSwgMiwgIlVuaWZvcm1CbG9ja1NpemVTaGlmdCIsICJVbmlmb3JtIGJsb2NrIHNpemUgMl5uIGJ5dGVzIn0sCisJLyogUGFydGl0aW9uIGluZm9ybWF0aW9uICovCisJezIsIDEsICJIV1BhcnRzTnVtIiwgIk51bWJlciBvZiBoYXJkd2FyZSBwYXJ0aXRpb25zIn0sCisJLyogT3B0aW9uYWwgZmVhdHVyZXMgKi8KKwl7NSwgMSwgIlN1c3BFcmFzZVN1cHAiLCAiU3VzcGVuZCBlcmFzZSBzdXBwb3J0ZWQifSwKKwkvKiBPcGVyYXRpb24gdHlwaWNhbCB0aW1lICovCisJezEwLCAwLCAiU2luZ2xlV29yZFByb2dUaW1lIiwgIlNpbmdsZSB3b3JkIHByb2dyYW0gMl5uIHUtc2VjIn0sCisJezEwLCAxLCAiUHJvZ0J1ZmZlclRpbWUiLCAiUHJvZ3JhbSBidWZmZXIgd3JpdGUgMl5uIHUtc2VjIn0sCisJezEwLCAyLCAiQmxvY2tFcmFzZVRpbWUiLCAiQmxvY2sgZXJhc2UgMl5uIG0tc2VjIn0sCisJezEwLCAzLCAiRnVsbENoaXBFcmFzZVRpbWUiLCAiRnVsbCBjaGlwIGVyYXNlIDJebiBtLXNlYyJ9LAorfTsKKworc3RhdGljIGxvbmcgbHBkZHJfZ2V0X3FpbmZvcmVjX3BvcyhzdHJ1Y3QgbWFwX2luZm8gKm1hcCwgY2hhciAqaWRfc3RyKQoreworCWludCBxaW5mb19saW5lcyA9IHNpemVvZihxaW5mb19hcnJheSkvc2l6ZW9mKHN0cnVjdCBxaW5mb19xdWVyeV9pbmZvKTsKKwlpbnQgaTsKKwlpbnQgYmFua3dpZHRoID0gbWFwX2Jhbmt3aWR0aChtYXApICogODsKKwlpbnQgbWFqb3IsIG1pbm9yOworCisJZm9yIChpID0gMDsgaSA8IHFpbmZvX2xpbmVzOyBpKyspIHsKKwkJaWYgKHN0cmNtcChpZF9zdHIsIHFpbmZvX2FycmF5W2ldLmlkX3N0cikgPT0gMCkgeworCQkJbWFqb3IgPSBxaW5mb19hcnJheVtpXS5tYWpvciAmICgoMSA8PCBiYW5rd2lkdGgpIC0gMSk7CisJCQltaW5vciA9IHFpbmZvX2FycmF5W2ldLm1pbm9yICYgKCgxIDw8IGJhbmt3aWR0aCkgLSAxKTsKKwkJCXJldHVybiBtaW5vciB8IChtYWpvciA8PCBiYW5rd2lkdGgpOworCQl9CisJfQorCXByaW50ayhLRVJOX0VSUiIlcyBxaW5mbyBpZCBzdHJpbmcgaXMgd3JvbmchIFxuIiwgbWFwLT5uYW1lKTsKKwlCVUcoKTsKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyB1aW50MTZfdCBscGRkcl9pbmZvX3F1ZXJ5KHN0cnVjdCBtYXBfaW5mbyAqbWFwLCBjaGFyICppZF9zdHIpCit7CisJdW5zaWduZWQgaW50IGRzciwgdmFsOworCWludCBiaXRzX3Blcl9jaGlwID0gbWFwX2Jhbmt3aWR0aChtYXApICogODsKKwl1bnNpZ25lZCBsb25nIGFkciA9IGxwZGRyX2dldF9xaW5mb3JlY19wb3MobWFwLCBpZF9zdHIpOworCWludCBhdHRlbXB0cyA9IDIwOworCisJLyogV3JpdGUgYSByZXF1ZXN0IGZvciB0aGUgUEZPVyByZWNvcmQgKi8KKwltYXBfd3JpdGUobWFwLCBDTUQoTFBERFJfSU5GT19RVUVSWSksCisJCQltYXAtPnBmb3dfYmFzZSArIFBGT1dfQ09NTUFORF9DT0RFKTsKKwltYXBfd3JpdGUobWFwLCBDTUQoYWRyICYgKCgxIDw8IGJpdHNfcGVyX2NoaXApIC0gMSkpLAorCQkJbWFwLT5wZm93X2Jhc2UgKyBQRk9XX0NPTU1BTkRfQUREUkVTU19MKTsKKwltYXBfd3JpdGUobWFwLCBDTUQoYWRyID4+IGJpdHNfcGVyX2NoaXApLAorCQkJbWFwLT5wZm93X2Jhc2UgKyBQRk9XX0NPTU1BTkRfQUREUkVTU19IKTsKKwltYXBfd3JpdGUobWFwLCBDTUQoTFBERFJfU1RBUlRfRVhFQ1VUSU9OKSwKKwkJCW1hcC0+cGZvd19iYXNlICsgUEZPV19DT01NQU5EX0VYRUNVVEUpOworCisJd2hpbGUgKChhdHRlbXB0cy0tKSA+IDApIHsKKwkJZHNyID0gQ01EVkFMKG1hcF9yZWFkKG1hcCwgbWFwLT5wZm93X2Jhc2UgKyBQRk9XX0RTUikpOworCQlpZiAoZHNyICYgRFNSX1JFQURZX1NUQVRVUykKKwkJCWJyZWFrOworCQl1ZGVsYXkoMTApOworCX0KKworCXZhbCA9IENNRFZBTChtYXBfcmVhZChtYXAsIG1hcC0+cGZvd19iYXNlICsgUEZPV19DT01NQU5EX0RBVEEpKTsKKwlyZXR1cm4gdmFsOworfQorCitzdGF0aWMgaW50IGxwZGRyX3Bmb3dfcHJlc2VudChzdHJ1Y3QgbWFwX2luZm8gKm1hcCwgc3RydWN0IGxwZGRyX3ByaXZhdGUgKmxwZGRyKQoreworCW1hcF93b3JkIHBmb3dfdmFsWzRdOworCisJLyogQ2hlY2sgaWRlbnRpZmljYXRpb24gc3RyaW5nICovCisJcGZvd192YWxbMF0gPSBtYXBfcmVhZChtYXAsIG1hcC0+cGZvd19iYXNlICsgUEZPV19RVUVSWV9TVFJJTkdfUCk7CisJcGZvd192YWxbMV0gPSBtYXBfcmVhZChtYXAsIG1hcC0+cGZvd19iYXNlICsgUEZPV19RVUVSWV9TVFJJTkdfRik7CisJcGZvd192YWxbMl0gPSBtYXBfcmVhZChtYXAsIG1hcC0+cGZvd19iYXNlICsgUEZPV19RVUVSWV9TVFJJTkdfTyk7CisJcGZvd192YWxbM10gPSBtYXBfcmVhZChtYXAsIG1hcC0+cGZvd19iYXNlICsgUEZPV19RVUVSWV9TVFJJTkdfVyk7CisKKwlpZiAoIW1hcF93b3JkX2VxdWFsKG1hcCwgQ01EKCdQJyksIHBmb3dfdmFsWzBdKSkKKwkJZ290byBvdXQ7CisKKwlpZiAoIW1hcF93b3JkX2VxdWFsKG1hcCwgQ01EKCdGJyksIHBmb3dfdmFsWzFdKSkKKwkJZ290byBvdXQ7CisKKwlpZiAoIW1hcF93b3JkX2VxdWFsKG1hcCwgQ01EKCdPJyksIHBmb3dfdmFsWzJdKSkKKwkJZ290byBvdXQ7CisKKwlpZiAoIW1hcF93b3JkX2VxdWFsKG1hcCwgQ01EKCdXJyksIHBmb3dfdmFsWzNdKSkKKwkJZ290byBvdXQ7CisKKwlyZXR1cm4gMTsJLyogIlBGT1ciIGlzIGZvdW5kICovCitvdXQ6CisJcHJpbnRrKEtFUk5fV0FSTklORyIlczogUEZPVyBzdHJpbmcgYXQgMHglbHggaXMgbm90IGZvdW5kIFxuIiwKKwkJCQkJbWFwLT5uYW1lLCBtYXAtPnBmb3dfYmFzZSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbHBkZHJfY2hpcF9zZXR1cChzdHJ1Y3QgbWFwX2luZm8gKm1hcCwgc3RydWN0IGxwZGRyX3ByaXZhdGUgKmxwZGRyKQoreworCisJbHBkZHItPnFpbmZvID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHFpbmZvX2NoaXApLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWxwZGRyLT5xaW5mbykgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogbm8gbWVtb3J5IGZvciBMUEREUiBxaW5mbyBzdHJ1Y3R1cmVcbiIsCisJCQkJbWFwLT5uYW1lKTsKKwkJcmV0dXJuIDA7CisJfQorCW1lbXNldChscGRkci0+cWluZm8sIDAsIHNpemVvZihzdHJ1Y3QgcWluZm9fY2hpcCkpOworCisJLyogR2V0IHRoZSBNYW51SUQgKi8KKwlscGRkci0+TWFudWZhY3RJZCA9IENNRFZBTChtYXBfcmVhZChtYXAsIG1hcC0+cGZvd19iYXNlICsgUEZPV19NQU5VRkFDVFVSRVJfSUQpKTsKKwkvKiBHZXQgdGhlIERldmljZUlEICovCisJbHBkZHItPkRldklkID0gQ01EVkFMKG1hcF9yZWFkKG1hcCwgbWFwLT5wZm93X2Jhc2UgKyBQRk9XX0RFVklDRV9JRCkpOworCS8qIHJlYWQgcGFyYW1ldGVycyBmcm9tIGNoaXAgcWluZm8gdGFibGUgKi8KKwlscGRkci0+cWluZm8tPkRldlNpemVTaGlmdCA9IGxwZGRyX2luZm9fcXVlcnkobWFwLCAiRGV2U2l6ZVNoaWZ0Iik7CisJbHBkZHItPnFpbmZvLT5Ub3RhbEJsb2Nrc051bSA9IGxwZGRyX2luZm9fcXVlcnkobWFwLCAiVG90YWxCbG9ja3NOdW0iKTsKKwlscGRkci0+cWluZm8tPkJ1ZlNpemVTaGlmdCA9IGxwZGRyX2luZm9fcXVlcnkobWFwLCAiQnVmU2l6ZVNoaWZ0Iik7CisJbHBkZHItPnFpbmZvLT5IV1BhcnRzTnVtID0gbHBkZHJfaW5mb19xdWVyeShtYXAsICJIV1BhcnRzTnVtIik7CisJbHBkZHItPnFpbmZvLT5Vbmlmb3JtQmxvY2tTaXplU2hpZnQgPQorCQkJCWxwZGRyX2luZm9fcXVlcnkobWFwLCAiVW5pZm9ybUJsb2NrU2l6ZVNoaWZ0Iik7CisJbHBkZHItPnFpbmZvLT5TdXNwRXJhc2VTdXBwID0gbHBkZHJfaW5mb19xdWVyeShtYXAsICJTdXNwRXJhc2VTdXBwIik7CisJbHBkZHItPnFpbmZvLT5TaW5nbGVXb3JkUHJvZ1RpbWUgPQorCQkJCWxwZGRyX2luZm9fcXVlcnkobWFwLCAiU2luZ2xlV29yZFByb2dUaW1lIik7CisJbHBkZHItPnFpbmZvLT5Qcm9nQnVmZmVyVGltZSA9IGxwZGRyX2luZm9fcXVlcnkobWFwLCAiUHJvZ0J1ZmZlclRpbWUiKTsKKwlscGRkci0+cWluZm8tPkJsb2NrRXJhc2VUaW1lID0gbHBkZHJfaW5mb19xdWVyeShtYXAsICJCbG9ja0VyYXNlVGltZSIpOworCXJldHVybiAxOworfQorc3RhdGljIHN0cnVjdCBscGRkcl9wcml2YXRlICpscGRkcl9wcm9iZV9jaGlwKHN0cnVjdCBtYXBfaW5mbyAqbWFwKQoreworCXN0cnVjdCBscGRkcl9wcml2YXRlIGxwZGRyOworCXN0cnVjdCBscGRkcl9wcml2YXRlICpyZXRscGRkcjsKKwlpbnQgbnVtdmlydGNoaXBzOworCisKKwlpZiAoKG1hcC0+cGZvd19iYXNlICsgMHgxMDAwKSA+PSBtYXAtPnNpemUpIHsKKwkJcHJpbnRrKEtFUk5fTk9USUNFIiVzIFByb2JlIGF0IGJhc2UgKDB4JTA4bHgpIHBhc3QgdGhlIGVuZCBvZiIKKwkJCQkidGhlIG1hcCgweCUwOGx4KVxuIiwgbWFwLT5uYW1lLAorCQkJCSh1bnNpZ25lZCBsb25nKW1hcC0+cGZvd19iYXNlLCBtYXAtPnNpemUgLSAxKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCW1lbXNldCgmbHBkZHIsIDAsIHNpemVvZihzdHJ1Y3QgbHBkZHJfcHJpdmF0ZSkpOworCWlmICghbHBkZHJfcGZvd19wcmVzZW50KG1hcCwgJmxwZGRyKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAoIWxwZGRyX2NoaXBfc2V0dXAobWFwLCAmbHBkZHIpKQorCQlyZXR1cm4gTlVMTDsKKworCS8qIE9rIHNvIHdlIGZvdW5kIGEgY2hpcCAqLworCWxwZGRyLmNoaXBzaGlmdCA9IGxwZGRyLnFpbmZvLT5EZXZTaXplU2hpZnQ7CisJbHBkZHIubnVtY2hpcHMgPSAxOworCisJbnVtdmlydGNoaXBzID0gbHBkZHIubnVtY2hpcHMgKiBscGRkci5xaW5mby0+SFdQYXJ0c051bTsKKwlyZXRscGRkciA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBscGRkcl9wcml2YXRlKSArCisJCQludW12aXJ0Y2hpcHMgKiBzaXplb2Yoc3RydWN0IGZsY2hpcCksIEdGUF9LRVJORUwpOworCWlmICghcmV0bHBkZHIpCisJCXJldHVybiBOVUxMOworCisJbWVtc2V0KHJldGxwZGRyLCAwLCBzaXplb2Yoc3RydWN0IGxwZGRyX3ByaXZhdGUpICsKKwkJCQludW12aXJ0Y2hpcHMgKiBzaXplb2Yoc3RydWN0IGZsY2hpcCkpOworCW1lbWNweShyZXRscGRkciwgJmxwZGRyLCBzaXplb2Yoc3RydWN0IGxwZGRyX3ByaXZhdGUpKTsKKworCXJldGxwZGRyLT5udW1jaGlwcyA9IG51bXZpcnRjaGlwczsKKwlyZXRscGRkci0+Y2hpcHNoaWZ0ID0gcmV0bHBkZHItPnFpbmZvLT5EZXZTaXplU2hpZnQgLQorCQkJCV9fZmZzKHJldGxwZGRyLT5xaW5mby0+SFdQYXJ0c051bSk7CisKKwlyZXR1cm4gcmV0bHBkZHI7Cit9CisKK3N0cnVjdCBtdGRfaW5mbyAqbHBkZHJfcHJvYmUoc3RydWN0IG1hcF9pbmZvICptYXApCit7CisJc3RydWN0IG10ZF9pbmZvICptdGQgPSBOVUxMOworCXN0cnVjdCBscGRkcl9wcml2YXRlICpscGRkcjsKKworCS8qIEZpcnN0IHByb2JlIHRoZSBtYXAgdG8gc2VlIGlmIHdlIGhhdmVjYW4gb3BlbiBQRk9XIGhlcmUgKi8KKwlscGRkciA9IGxwZGRyX3Byb2JlX2NoaXAobWFwKTsKKwlpZiAoIWxwZGRyKQorCQlyZXR1cm4gTlVMTDsKKworCW1hcC0+ZmxkcnZfcHJpdiA9IGxwZGRyOworCW10ZCA9IGxwZGRyX2NtZHNldChtYXApOworCWlmIChtdGQpIHsKKwkJaWYgKG10ZC0+c2l6ZSA+IG1hcC0+c2l6ZSkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiUmVkdWNpbmcgdmlzaWJpbGl0eSBvZiAlbGRLaUIgY2hpcCIKKwkJCQkidG8gJWxkS2lCXG4iLCAodW5zaWduZWQgbG9uZyltdGQtPnNpemUgPj4gMTAsCisJCQkJKHVuc2lnbmVkIGxvbmcpbWFwLT5zaXplID4+IDEwKTsKKwkJCW10ZC0+c2l6ZSA9IG1hcC0+c2l6ZTsKKwkJfQorCQlyZXR1cm4gbXRkOworCX0KKworCWtmcmVlKGxwZGRyLT5xaW5mbyk7CisJa2ZyZWUobHBkZHIpOworCW1hcC0+ZmxkcnZfcHJpdiA9IE5VTEw7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbXRkX2NoaXBfZHJpdmVyIGxwZGRyX2NoaXBkcnYgPSB7CisJLnByb2JlCQk9IGxwZGRyX3Byb2JlLAorCS5uYW1lCQk9ICJxaW5mb19wcm9iZSIsCisJLm1vZHVsZQkJPSBUSElTX01PRFVMRQorfTsKKworc3RhdGljIGludCBfX2luaXQgbHBkZHJfcHJvYmVfaW5pdCh2b2lkKQoreworCXJlZ2lzdGVyX210ZF9jaGlwX2RyaXZlcigmbHBkZHJfY2hpcGRydik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBscGRkcl9wcm9iZV9leGl0KHZvaWQpCit7CisJdW5yZWdpc3Rlcl9tdGRfY2hpcF9kcml2ZXIoJmxwZGRyX2NoaXBkcnYpOworfQorCittb2R1bGVfaW5pdChscGRkcl9wcm9iZV9pbml0KTsKK21vZHVsZV9leGl0KGxwZGRyX3Byb2JlX2V4aXQpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQVVUSE9SKCJWYXNpbGl5IExlb25lbmtvIDx2YXNpbGl5Lmxlb25lbmtvQGdtYWlsLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiRHJpdmVyIHRvIHByb2JlIHFpbmZvIGZsYXNoIGNoaXBzIik7CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL21hcHMvS2NvbmZpZyBiL2RyaXZlcnMvbXRkL21hcHMvS2NvbmZpZwppbmRleCA1ZWExNjkzLi4wMjI1Y2JiIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9tYXBzL0tjb25maWcKKysrIGIvZHJpdmVycy9tdGQvbWFwcy9LY29uZmlnCkBAIC0xMCw4ICsxMCw4IEBACiAJICBwYWdlZCBtYXBwaW5ncyBvZiBmbGFzaCBjaGlwcy4KIAogY29uZmlnIE1URF9QSFlTTUFQCi0JdHJpc3RhdGUgIkNGSSBGbGFzaCBkZXZpY2UgaW4gcGh5c2ljYWwgbWVtb3J5IG1hcCIKLQlkZXBlbmRzIG9uIE1URF9DRkkgfHwgTVREX0pFREVDUFJPQkUgfHwgTVREX1JPTQorCXRyaXN0YXRlICJGbGFzaCBkZXZpY2UgaW4gcGh5c2ljYWwgbWVtb3J5IG1hcCIKKwlkZXBlbmRzIG9uIE1URF9DRkkgfHwgTVREX0pFREVDUFJPQkUgfHwgTVREX1JPTSB8fCBNVERfTFBERFIKIAloZWxwCiAJICBUaGlzIHByb3ZpZGVzIGEgJ21hcHBpbmcnIGRyaXZlciB3aGljaCBhbGxvd3MgdGhlIE5PUiBGbGFzaCBhbmQKIAkgIFJPTSBkcml2ZXIgY29kZSB0byBjb21tdW5pY2F0ZSB3aXRoIGNoaXBzIHdoaWNoIGFyZSBtYXBwZWQKQEAgLTIzLDkgKzIzLDIwIEBACiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKIAkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBwaHlzbWFwLgogCitjb25maWcgTVREX1BIWVNNQVBfQ09NUEFUCisJYm9vbCAiUGh5c21hcCBjb21wYXQgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIE1URF9QSFlTTUFQCisJZGVmYXVsdCBuCisJaGVscAorCSAgU2V0dXAgYSBzaW1wbGUgbWFwcGluZyB2aWEgdGhlIEtjb25maWcgb3B0aW9ucy4gIE5vcm1hbGx5IHRoZQorCSAgcGh5c21hcCBjb25maWd1cmF0aW9uIG9wdGlvbnMgYXJlIGRvbmUgdmlhIHlvdXIgYm9hcmQncworCSAgcmVzb3VyY2UgZmlsZS4KKworCSAgSWYgdW5zdXJlLCBzYXkgTiBoZXJlLgorCiBjb25maWcgTVREX1BIWVNNQVBfU1RBUlQKIAloZXggIlBoeXNpY2FsIHN0YXJ0IGFkZHJlc3Mgb2YgZmxhc2ggbWFwcGluZyIKLQlkZXBlbmRzIG9uIE1URF9QSFlTTUFQCisJZGVwZW5kcyBvbiBNVERfUEhZU01BUF9DT01QQVQKIAlkZWZhdWx0ICIweDgwMDAwMDAiCiAJaGVscAogCSAgVGhpcyBpcyB0aGUgcGh5c2ljYWwgbWVtb3J5IGxvY2F0aW9uIGF0IHdoaWNoIHRoZSBmbGFzaCBjaGlwcwpAQCAtMzcsNyArNDgsNyBAQAogCiBjb25maWcgTVREX1BIWVNNQVBfTEVOCiAJaGV4ICJQaHlzaWNhbCBsZW5ndGggb2YgZmxhc2ggbWFwcGluZyIKLQlkZXBlbmRzIG9uIE1URF9QSFlTTUFQCisJZGVwZW5kcyBvbiBNVERfUEhZU01BUF9DT01QQVQKIAlkZWZhdWx0ICIwIgogCWhlbHAKIAkgIFRoaXMgaXMgdGhlIHRvdGFsIGxlbmd0aCBvZiB0aGUgbWFwcGluZyBvZiB0aGUgZmxhc2ggY2hpcHMgb24KQEAgLTUxLDcgKzYyLDcgQEAKIAogY29uZmlnIE1URF9QSFlTTUFQX0JBTktXSURUSAogCWludCAiQmFuayB3aWR0aCBpbiBvY3RldHMiCi0JZGVwZW5kcyBvbiBNVERfUEhZU01BUAorCWRlcGVuZHMgb24gTVREX1BIWVNNQVBfQ09NUEFUCiAJZGVmYXVsdCAiMiIKIAloZWxwCiAJICBUaGlzIGlzIHRoZSB0b3RhbCB3aWR0aCBvZiB0aGUgZGF0YSBidXMgb2YgdGhlIGZsYXNoIGRldmljZXMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL21hcHMvYWxjaGVteS1mbGFzaC5jIGIvZHJpdmVycy9tdGQvbWFwcy9hbGNoZW15LWZsYXNoLmMKaW5kZXggODI4MTFiYy4uODQ1YWQ0ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbWFwcy9hbGNoZW15LWZsYXNoLmMKKysrIGIvZHJpdmVycy9tdGQvbWFwcy9hbGNoZW15LWZsYXNoLmMKQEAgLTExMSw3ICsxMTEsNyBAQAogCiBzdGF0aWMgc3RydWN0IG10ZF9pbmZvICpteW10ZDsKIAotaW50IF9faW5pdCBhbGNoZW15X210ZF9pbml0KHZvaWQpCitzdGF0aWMgaW50IF9faW5pdCBhbGNoZW15X210ZF9pbml0KHZvaWQpCiB7CiAJc3RydWN0IG10ZF9wYXJ0aXRpb24gKnBhcnRzOwogCWludCBuYl9wYXJ0cyA9IDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9tYXBzL2FtZDc2eHJvbS5jIGIvZHJpdmVycy9tdGQvbWFwcy9hbWQ3Nnhyb20uYwppbmRleCBkMWVlYzdkLi4yMzc3MzNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9tYXBzL2FtZDc2eHJvbS5jCisrKyBiL2RyaXZlcnMvbXRkL21hcHMvYW1kNzZ4cm9tLmMKQEAgLTIzMiw4ICsyMzIsOCBAQAogCQkvKiBUcmltIHRoZSBzaXplIGlmIHdlIGFyZSBsYXJnZXIgdGhhbiB0aGUgbWFwICovCiAJCWlmIChtYXAtPm10ZC0+c2l6ZSA+IG1hcC0+bWFwLnNpemUpIHsKIAkJCXByaW50ayhLRVJOX1dBUk5JTkcgTU9EX05BTUUKLQkJCQkiIHJvbSgldSkgbGFyZ2VyIHRoYW4gd2luZG93KCVsdSkuIGZpeGluZy4uLlxuIiwKLQkJCQltYXAtPm10ZC0+c2l6ZSwgbWFwLT5tYXAuc2l6ZSk7CisJCQkJIiByb20oJWxsdSkgbGFyZ2VyIHRoYW4gd2luZG93KCVsdSkuIGZpeGluZy4uLlxuIiwKKwkJCQkodW5zaWduZWQgbG9uZyBsb25nKW1hcC0+bXRkLT5zaXplLCBtYXAtPm1hcC5zaXplKTsKIAkJCW1hcC0+bXRkLT5zaXplID0gbWFwLT5tYXAuc2l6ZTsKIAkJfQogCQlpZiAod2luZG93LT5yc3JjLnBhcmVudCkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbWFwcy9jZmlfZmxhZ2FkbS5jIGIvZHJpdmVycy9tdGQvbWFwcy9jZmlfZmxhZ2FkbS5jCmluZGV4IDBlY2MzZjYuLmI0ZWQ4MTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL21hcHMvY2ZpX2ZsYWdhZG0uYworKysgYi9kcml2ZXJzL210ZC9tYXBzL2NmaV9mbGFnYWRtLmMKQEAgLTg4LDcgKzg4LDcgQEAKIAogc3RhdGljIHN0cnVjdCBtdGRfaW5mbyAqbXltdGQ7CiAKLWludCBfX2luaXQgaW5pdF9mbGFnYWRtKHZvaWQpCitzdGF0aWMgaW50IF9faW5pdCBpbml0X2ZsYWdhZG0odm9pZCkKIHsKIAlwcmludGsoS0VSTl9OT1RJQ0UgIkZsYWdhRE0gZmxhc2ggZGV2aWNlOiAleCBhdCAleFxuIiwKIAkJCUZMQVNIX1NJWkUsIEZMQVNIX1BIWVNfQUREUik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9tYXBzL2NrODA0eHJvbS5jIGIvZHJpdmVycy9tdGQvbWFwcy9jazgwNHhyb20uYwppbmRleCAxYTZmZWI0Li41ZjdhMjQ1IDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9tYXBzL2NrODA0eHJvbS5jCisrKyBiL2RyaXZlcnMvbXRkL21hcHMvY2s4MDR4cm9tLmMKQEAgLTI2Myw4ICsyNjMsOCBAQAogCQkvKiBUcmltIHRoZSBzaXplIGlmIHdlIGFyZSBsYXJnZXIgdGhhbiB0aGUgbWFwICovCiAJCWlmIChtYXAtPm10ZC0+c2l6ZSA+IG1hcC0+bWFwLnNpemUpIHsKIAkJCXByaW50ayhLRVJOX1dBUk5JTkcgTU9EX05BTUUKLQkJCQkiIHJvbSgldSkgbGFyZ2VyIHRoYW4gd2luZG93KCVsdSkuIGZpeGluZy4uLlxuIiwKLQkJCQltYXAtPm10ZC0+c2l6ZSwgbWFwLT5tYXAuc2l6ZSk7CisJCQkJIiByb20oJWxsdSkgbGFyZ2VyIHRoYW4gd2luZG93KCVsdSkuIGZpeGluZy4uLlxuIiwKKwkJCQkodW5zaWduZWQgbG9uZyBsb25nKW1hcC0+bXRkLT5zaXplLCBtYXAtPm1hcC5zaXplKTsKIAkJCW1hcC0+bXRkLT5zaXplID0gbWFwLT5tYXAuc2l6ZTsKIAkJfQogCQlpZiAod2luZG93LT5yc3JjLnBhcmVudCkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbWFwcy9kYm94Mi1mbGFzaC5jIGIvZHJpdmVycy9tdGQvbWFwcy9kYm94Mi1mbGFzaC5jCmluZGV4IGUxMTU2NjcuLmNmYWNmYTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL21hcHMvZGJveDItZmxhc2guYworKysgYi9kcml2ZXJzL210ZC9tYXBzL2Rib3gyLWZsYXNoLmMKQEAgLTY5LDcgKzY5LDcgQEAKIAkucGh5cwkJPSBXSU5ET1dfQUREUiwKIH07CiAKLWludCBfX2luaXQgaW5pdF9kYm94Ml9mbGFzaCh2b2lkKQorc3RhdGljIGludCBfX2luaXQgaW5pdF9kYm94Ml9mbGFzaCh2b2lkKQogewogICAgICAgIAlwcmludGsoS0VSTl9OT1RJQ0UgIkQtQm94IDIgZmxhc2ggZHJpdmVyIChzaXplLT4weCVYIG1lbS0+MHglWClcbiIsIFdJTkRPV19TSVpFLCBXSU5ET1dfQUREUik7CiAJZGJveDJfZmxhc2hfbWFwLnZpcnQgPSBpb3JlbWFwKFdJTkRPV19BRERSLCBXSU5ET1dfU0laRSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9tYXBzL2VkYjczMTIuYyBiL2RyaXZlcnMvbXRkL21hcHMvZWRiNzMxMi5jCmluZGV4IDk0MzM3MzguLmJlOWU5MGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL21hcHMvZWRiNzMxMi5jCisrKyBiL2RyaXZlcnMvbXRkL21hcHMvZWRiNzMxMi5jCkBAIC03MSw3ICs3MSw3IEBACiBzdGF0aWMgaW50ICAgICAgICAgICAgICAgICAgIG10ZF9wYXJ0c19uYiA9IDA7CiBzdGF0aWMgc3RydWN0IG10ZF9wYXJ0aXRpb24gKm10ZF9wYXJ0cyAgICA9IDA7CiAKLWludCBfX2luaXQgaW5pdF9lZGI3MzEybm9yKHZvaWQpCitzdGF0aWMgaW50IF9faW5pdCBpbml0X2VkYjczMTJub3Iodm9pZCkKIHsKIAlzdGF0aWMgY29uc3QgY2hhciAqcm9tX3Byb2JlX3R5cGVzW10gPSBQUk9CRVRZUEVTOwogCWNvbnN0IGNoYXIgKip0eXBlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbWFwcy9lc2Iycm9tLmMgYi9kcml2ZXJzL210ZC9tYXBzL2VzYjJyb20uYwppbmRleCBiYmJjZGQ0Li4xMWEyZjU3IDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9tYXBzL2VzYjJyb20uYworKysgYi9kcml2ZXJzL210ZC9tYXBzL2VzYjJyb20uYwpAQCAtMzI0LDggKzMyNCw4IEBACiAJCS8qIFRyaW0gdGhlIHNpemUgaWYgd2UgYXJlIGxhcmdlciB0aGFuIHRoZSBtYXAgKi8KIAkJaWYgKG1hcC0+bXRkLT5zaXplID4gbWFwLT5tYXAuc2l6ZSkgewogCQkJcHJpbnRrKEtFUk5fV0FSTklORyBNT0RfTkFNRQotCQkJCSIgcm9tKCV1KSBsYXJnZXIgdGhhbiB3aW5kb3coJWx1KS4gZml4aW5nLi4uXG4iLAotCQkJCW1hcC0+bXRkLT5zaXplLCBtYXAtPm1hcC5zaXplKTsKKwkJCQkiIHJvbSglbGx1KSBsYXJnZXIgdGhhbiB3aW5kb3coJWx1KS4gZml4aW5nLi4uXG4iLAorCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpbWFwLT5tdGQtPnNpemUsIG1hcC0+bWFwLnNpemUpOwogCQkJbWFwLT5tdGQtPnNpemUgPSBtYXAtPm1hcC5zaXplOwogCQl9CiAJCWlmICh3aW5kb3ctPnJzcmMucGFyZW50KSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9tYXBzL2ZvcnR1bmV0LmMgYi9kcml2ZXJzL210ZC9tYXBzL2ZvcnR1bmV0LmMKaW5kZXggYThlM2ZkZS4uMWU0MzEyNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbWFwcy9mb3J0dW5ldC5jCisrKyBiL2RyaXZlcnMvbXRkL21hcHMvZm9ydHVuZXQuYwpAQCAtMTgxLDcgKzE4MSw3IEBACiAvKiBCYWNrd2FyZHMtc3BlbGxpbmctY29tcGF0aWJpbGl0eSAqLwogX19zZXR1cCgiTVREX1BhcnRpb249IiwgTVREX05ld19QYXJ0aXRpb24pOwogCi1pbnQgX19pbml0IGluaXRfZm9ydHVuZXQodm9pZCkKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfZm9ydHVuZXQodm9pZCkKIHsKIAlpbnQJaXgsaXk7CiAJZm9yKGl5PWl4PTA7aXg8TUFYX05VTV9SRUdJT05TO2l4KyspCmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9tYXBzL2g3MjB4LWZsYXNoLmMgYi9kcml2ZXJzL210ZC9tYXBzL2g3MjB4LWZsYXNoLmMKaW5kZXggM2I5NTlmYS4uNzJjNzI0ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbWFwcy9oNzIweC1mbGFzaC5jCisrKyBiL2RyaXZlcnMvbXRkL21hcHMvaDcyMHgtZmxhc2guYwpAQCAtNjUsNyArNjUsNyBAQAogLyoKICAqIEluaXRpYWxpemUgRkxBU0ggc3VwcG9ydAogICovCi1pbnQgX19pbml0IGg3MjB4X210ZF9pbml0KHZvaWQpCitzdGF0aWMgaW50IF9faW5pdCBoNzIweF9tdGRfaW5pdCh2b2lkKQogewogCiAJY2hhcgkqcGFydF90eXBlID0gTlVMTDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL21hcHMvaWNoeHJvbS5jIGIvZHJpdmVycy9tdGQvbWFwcy9pY2h4cm9tLmMKaW5kZXggYWViNmM5MS4uYzMyYmMyOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbWFwcy9pY2h4cm9tLmMKKysrIGIvZHJpdmVycy9tdGQvbWFwcy9pY2h4cm9tLmMKQEAgLTI1OCw4ICsyNTgsOCBAQAogCQkvKiBUcmltIHRoZSBzaXplIGlmIHdlIGFyZSBsYXJnZXIgdGhhbiB0aGUgbWFwICovCiAJCWlmIChtYXAtPm10ZC0+c2l6ZSA+IG1hcC0+bWFwLnNpemUpIHsKIAkJCXByaW50ayhLRVJOX1dBUk5JTkcgTU9EX05BTUUKLQkJCQkiIHJvbSgldSkgbGFyZ2VyIHRoYW4gd2luZG93KCVsdSkuIGZpeGluZy4uLlxuIiwKLQkJCQltYXAtPm10ZC0+c2l6ZSwgbWFwLT5tYXAuc2l6ZSk7CisJCQkJIiByb20oJWxsdSkgbGFyZ2VyIHRoYW4gd2luZG93KCVsdSkuIGZpeGluZy4uLlxuIiwKKwkJCQkodW5zaWduZWQgbG9uZyBsb25nKW1hcC0+bXRkLT5zaXplLCBtYXAtPm1hcC5zaXplKTsKIAkJCW1hcC0+bXRkLT5zaXplID0gbWFwLT5tYXAuc2l6ZTsKIAkJfQogCQlpZiAod2luZG93LT5yc3JjLnBhcmVudCkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbWFwcy9pbXBhNy5jIGIvZHJpdmVycy9tdGQvbWFwcy9pbXBhNy5jCmluZGV4IDI2ODJhYjUuLjk5OGEyN2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL21hcHMvaW1wYTcuYworKysgYi9kcml2ZXJzL210ZC9tYXBzL2ltcGE3LmMKQEAgLTcwLDcgKzcwLDcgQEAKIAogc3RhdGljIGNvbnN0IGNoYXIgKnByb2Jlc1tdID0geyAiY21kbGluZXBhcnQiLCBOVUxMIH07CiAKLWludCBfX2luaXQgaW5pdF9pbXBhNyh2b2lkKQorc3RhdGljIGludCBfX2luaXQgaW5pdF9pbXBhNyh2b2lkKQogewogCXN0YXRpYyBjb25zdCBjaGFyICpyb21fcHJvYmVfdHlwZXNbXSA9IFBST0JFVFlQRVM7CiAJY29uc3QgY2hhciAqKnR5cGU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9tYXBzL2lwYXEtZmxhc2guYyBiL2RyaXZlcnMvbXRkL21hcHMvaXBhcS1mbGFzaC5jCmluZGV4IGVkNThmNmEuLjc0OGM4NWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL21hcHMvaXBhcS1mbGFzaC5jCisrKyBiL2RyaXZlcnMvbXRkL21hcHMvaXBhcS1mbGFzaC5jCkBAIC0yMDIsNyArMjAyLDcgQEAKIAogc3RhdGljIGludCBfX2luaXQgaDE5MDBfc3BlY2lhbF9jYXNlKHZvaWQpOwogCi1pbnQgX19pbml0IGlwYXFfbXRkX2luaXQodm9pZCkKK3N0YXRpYyBpbnQgX19pbml0IGlwYXFfbXRkX2luaXQodm9pZCkKIHsKIAlzdHJ1Y3QgbXRkX3BhcnRpdGlvbiAqcGFydHMgPSBOVUxMOwogCWludCBuYl9wYXJ0cyA9IDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9tYXBzL21ieDg2MC5jIGIvZHJpdmVycy9tdGQvbWFwcy9tYng4NjAuYwppbmRleCA3MDZmNjczLi4wZWI1YTdjIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9tYXBzL21ieDg2MC5jCisrKyBiL2RyaXZlcnMvbXRkL21hcHMvbWJ4ODYwLmMKQEAgLTU1LDcgKzU1LDcgQEAKIAkuYmFua3dpZHRoID0gNCwKIH07CiAKLWludCBfX2luaXQgaW5pdF9tYngodm9pZCkKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfbWJ4KHZvaWQpCiB7CiAJcHJpbnRrKEtFUk5fTk9USUNFICJNb3Rvcm9sYSBNQlggZmxhc2ggZGV2aWNlOiAweCV4IGF0IDB4JXhcbiIsIFdJTkRPV19TSVpFKjQsIFdJTkRPV19BRERSKTsKIAltYnhfbWFwLnZpcnQgPSBpb3JlbWFwKFdJTkRPV19BRERSLCBXSU5ET1dfU0laRSAqIDQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbWFwcy9uZXR0ZWwuYyBiL2RyaXZlcnMvbXRkL21hcHMvbmV0dGVsLmMKaW5kZXggOTY1ZTZjNi4uYTk3MTMzZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbWFwcy9uZXR0ZWwuYworKysgYi9kcml2ZXJzL210ZC9tYXBzL25ldHRlbC5jCkBAIC0yMjYsNyArMjI2LDcgQEAKIAogCWlmICgoYW1kX210ZCA9IGRvX21hcF9wcm9iZSgiamVkZWNfcHJvYmUiLCAmbmV0dGVsX2FtZF9tYXApKSkgewogCQlwcmludGsoS0VSTl9OT1RJQ0UgIlNOQVBHRUFSOiBBTUQgZmxhc2ggZGV2aWNlIHNpemUgPSAlZEtcbiIsCi0JCQlhbWRfbXRkLT5zaXplPj4xMCk7CisJCQkoaW50KShhbWRfbXRkLT5zaXplPj4xMCkpOwogCiAJCWFtZF9tdGQtPm93bmVyID0gVEhJU19NT0RVTEU7CiAKQEAgLTM1NywxMyArMzU3LDEyIEBACiAJCSppbnRlbDFwYXIgPSAwOwogCX0KIAotCXByaW50ayhLRVJOX05PVElDRSAiU05BUEdFQVI6IEludGVsIGZsYXNoIGRldmljZSBzaXplID0gJWRLXG4iLAotCQkoaW50ZWxfbXRkLT5zaXplID4+IDEwKSk7CisJcHJpbnRrKEtFUk5fTk9USUNFICJTTkFQR0VBUjogSW50ZWwgZmxhc2ggZGV2aWNlIHNpemUgPSAlbGxkS2lCXG4iLAorCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKShpbnRlbF9tdGQtPnNpemUgPj4gMTApKTsKIAogCWludGVsX210ZC0+b3duZXIgPSBUSElTX01PRFVMRTsKIAotCW51bV9pbnRlbF9wYXJ0aXRpb25zID0gc2l6ZW9mKG5ldHRlbF9pbnRlbF9wYXJ0aXRpb25zKSAvCi0JCXNpemVvZihuZXR0ZWxfaW50ZWxfcGFydGl0aW9uc1swXSk7CisJbnVtX2ludGVsX3BhcnRpdGlvbnMgPSBBUlJBWV9TSVpFKG5ldHRlbF9pbnRlbF9wYXJ0aXRpb25zKTsKIAogCWlmIChpbnRlbGJvb3QpIHsKIAkJLyoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL21hcHMvb2N0YWdvbi01MDY2LmMgYi9kcml2ZXJzL210ZC9tYXBzL29jdGFnb24tNTA2Ni5jCmluZGV4IDQzZTA0YzEuLjJiMmU0NTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL21hcHMvb2N0YWdvbi01MDY2LmMKKysrIGIvZHJpdmVycy9tdGQvbWFwcy9vY3RhZ29uLTUwNjYuYwpAQCAtMTg0LDcgKzE4NCw3IEBACiAJcmVsZWFzZV9yZWdpb24oUEFHRV9JTywgMSk7CiB9CiAKLWludCBfX2luaXQgaW5pdF9vY3Q1MDY2KHZvaWQpCitzdGF0aWMgaW50IF9faW5pdCBpbml0X29jdDUwNjYodm9pZCkKIHsKIAlpbnQgaTsKIAlpbnQgcmV0ID0gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL21hcHMvcGh5c21hcC5jIGIvZHJpdmVycy9tdGQvbWFwcy9waHlzbWFwLmMKaW5kZXggMWRiMTZlNS4uODc3NDM2NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbWFwcy9waHlzbWFwLmMKKysrIGIvZHJpdmVycy9tdGQvbWFwcy9waHlzbWFwLmMKQEAgLTI5LDcgKzI5LDYgQEAKIAlzdHJ1Y3QgbWFwX2luZm8JCW1hcFtNQVhfUkVTT1VSQ0VTXTsKICNpZmRlZiBDT05GSUdfTVREX1BBUlRJVElPTlMKIAlpbnQJCQlucl9wYXJ0czsKLQlzdHJ1Y3QgbXRkX3BhcnRpdGlvbgkqcGFydHM7CiAjZW5kaWYKIH07CiAKQEAgLTU2LDE0ICs1NSwxMCBAQAogCWZvciAoaSA9IDA7IGkgPCBNQVhfUkVTT1VSQ0VTOyBpKyspIHsKIAkJaWYgKGluZm8tPm10ZFtpXSAhPSBOVUxMKSB7CiAjaWZkZWYgQ09ORklHX01URF9QQVJUSVRJT05TCi0JCQlpZiAoaW5mby0+bnJfcGFydHMpIHsKKwkJCWlmIChpbmZvLT5ucl9wYXJ0cyB8fCBwaHlzbWFwX2RhdGEtPm5yX3BhcnRzKQogCQkJCWRlbF9tdGRfcGFydGl0aW9ucyhpbmZvLT5tdGRbaV0pOwotCQkJCWtmcmVlKGluZm8tPnBhcnRzKTsKLQkJCX0gZWxzZSBpZiAocGh5c21hcF9kYXRhLT5ucl9wYXJ0cykgewotCQkJCWRlbF9tdGRfcGFydGl0aW9ucyhpbmZvLT5tdGRbaV0pOwotCQkJfSBlbHNlIHsKKwkJCWVsc2UKIAkJCQlkZWxfbXRkX2RldmljZShpbmZvLT5tdGRbaV0pOwotCQkJfQogI2Vsc2UKIAkJCWRlbF9tdGRfZGV2aWNlKGluZm8tPm10ZFtpXSk7CiAjZW5kaWYKQEAgLTczLDcgKzY4LDEyIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBjb25zdCBjaGFyICpyb21fcHJvYmVfdHlwZXNbXSA9IHsgImNmaV9wcm9iZSIsICJqZWRlY19wcm9iZSIsICJtYXBfcm9tIiwgTlVMTCB9Oworc3RhdGljIGNvbnN0IGNoYXIgKnJvbV9wcm9iZV90eXBlc1tdID0geworCQkJCQkiY2ZpX3Byb2JlIiwKKwkJCQkJImplZGVjX3Byb2JlIiwKKwkJCQkJInFpbmZvX3Byb2JlIiwKKwkJCQkJIm1hcF9yb20iLAorCQkJCQlOVUxMIH07CiAjaWZkZWYgQ09ORklHX01URF9QQVJUSVRJT05TCiBzdGF0aWMgY29uc3QgY2hhciAqcGFydF9wcm9iZV90eXBlc1tdID0geyAiY21kbGluZXBhcnQiLCAiUmVkQm9vdCIsIE5VTEwgfTsKICNlbmRpZgpAQCAtODYsNiArODYsOSBAQAogCWludCBlcnIgPSAwOwogCWludCBpOwogCWludCBkZXZpY2VzX2ZvdW5kID0gMDsKKyNpZmRlZiBDT05GSUdfTVREX1BBUlRJVElPTlMKKwlzdHJ1Y3QgbXRkX3BhcnRpdGlvbiAqcGFydHM7CisjZW5kaWYKIAogCXBoeXNtYXBfZGF0YSA9IGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CiAJaWYgKHBoeXNtYXBfZGF0YSA9PSBOVUxMKQpAQCAtMTE5LDYgKzEyMiw3IEBACiAJCWluZm8tPm1hcFtpXS5zaXplID0gZGV2LT5yZXNvdXJjZVtpXS5lbmQgLSBkZXYtPnJlc291cmNlW2ldLnN0YXJ0ICsgMTsKIAkJaW5mby0+bWFwW2ldLmJhbmt3aWR0aCA9IHBoeXNtYXBfZGF0YS0+d2lkdGg7CiAJCWluZm8tPm1hcFtpXS5zZXRfdnBwID0gcGh5c21hcF9kYXRhLT5zZXRfdnBwOworCQlpbmZvLT5tYXBbaV0ucGZvd19iYXNlID0gcGh5c21hcF9kYXRhLT5wZm93X2Jhc2U7CiAKIAkJaW5mby0+bWFwW2ldLnZpcnQgPSBkZXZtX2lvcmVtYXAoJmRldi0+ZGV2LCBpbmZvLT5tYXBbaV0ucGh5cywKIAkJCQkJCSBpbmZvLT5tYXBbaV0uc2l6ZSk7CkBAIC0xNjMsOSArMTY3LDEwIEBACiAJCWdvdG8gZXJyX291dDsKIAogI2lmZGVmIENPTkZJR19NVERfUEFSVElUSU9OUwotCWVyciA9IHBhcnNlX210ZF9wYXJ0aXRpb25zKGluZm8tPmNtdGQsIHBhcnRfcHJvYmVfdHlwZXMsICZpbmZvLT5wYXJ0cywgMCk7CisJZXJyID0gcGFyc2VfbXRkX3BhcnRpdGlvbnMoaW5mby0+Y210ZCwgcGFydF9wcm9iZV90eXBlcywgJnBhcnRzLCAwKTsKIAlpZiAoZXJyID4gMCkgewotCQlhZGRfbXRkX3BhcnRpdGlvbnMoaW5mby0+Y210ZCwgaW5mby0+cGFydHMsIGVycik7CisJCWFkZF9tdGRfcGFydGl0aW9ucyhpbmZvLT5jbXRkLCBwYXJ0cywgZXJyKTsKKwkJa2ZyZWUocGFydHMpOwogCQlyZXR1cm4gMDsKIAl9CiAKQEAgLTI1MSwxNCArMjU2LDcgQEAKIH07CiAKIAotI2lmZGVmIENPTkZJR19NVERfUEhZU01BUF9MRU4KLSNpZiBDT05GSUdfTVREX1BIWVNNQVBfTEVOICE9IDAKLSN3YXJuaW5nIHVzaW5nIFBIWVNNQVAgY29tcGF0IGNvZGUKLSNkZWZpbmUgUEhZU01BUF9DT01QQVQKLSNlbmRpZgotI2VuZGlmCi0KLSNpZmRlZiBQSFlTTUFQX0NPTVBBVAorI2lmZGVmIENPTkZJR19NVERfUEhZU01BUF9DT01QQVQKIHN0YXRpYyBzdHJ1Y3QgcGh5c21hcF9mbGFzaF9kYXRhIHBoeXNtYXBfZmxhc2hfZGF0YSA9IHsKIAkud2lkdGgJCT0gQ09ORklHX01URF9QSFlTTUFQX0JBTktXSURUSCwKIH07CkBAIC0zMDIsNyArMzAwLDcgQEAKIAlpbnQgZXJyOwogCiAJZXJyID0gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZwaHlzbWFwX2ZsYXNoX2RyaXZlcik7Ci0jaWZkZWYgUEhZU01BUF9DT01QQVQKKyNpZmRlZiBDT05GSUdfTVREX1BIWVNNQVBfQ09NUEFUCiAJaWYgKGVyciA9PSAwKQogCQlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJnBoeXNtYXBfZmxhc2gpOwogI2VuZGlmCkBAIC0zMTIsNyArMzEwLDcgQEAKIAogc3RhdGljIHZvaWQgX19leGl0IHBoeXNtYXBfZXhpdCh2b2lkKQogewotI2lmZGVmIFBIWVNNQVBfQ09NUEFUCisjaWZkZWYgQ09ORklHX01URF9QSFlTTUFQX0NPTVBBVAogCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKCZwaHlzbWFwX2ZsYXNoKTsKICNlbmRpZgogCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZwaHlzbWFwX2ZsYXNoX2RyaXZlcik7CkBAIC0zMjYsOCArMzI0LDcgQEAKIE1PRFVMRV9ERVNDUklQVElPTigiR2VuZXJpYyBjb25maWd1cmFibGUgTVREIG1hcCBkcml2ZXIiKTsKIAogLyogbGVnYWN5IHBsYXRmb3JtIGRyaXZlcnMgY2FuJ3QgaG90cGx1ZyBvciBjb2xkcGxnICovCi0jaWZuZGVmIFBIWVNNQVBfQ09NUEFUCisjaWZuZGVmIENPTkZJR19NVERfUEhZU01BUF9DT01QQVQKIC8qIHdvcmsgd2l0aCBob3RwbHVnIGFuZCBjb2xkcGx1ZyAqLwogTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTpwaHlzbWFwLWZsYXNoIik7CiAjZW5kaWYKLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbWFwcy9wbWNtc3AtZmxhc2guYyBiL2RyaXZlcnMvbXRkL21hcHMvcG1jbXNwLWZsYXNoLmMKaW5kZXggZjQzYmEyOC4uNDc2OGJkNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbWFwcy9wbWNtc3AtZmxhc2guYworKysgYi9kcml2ZXJzL210ZC9tYXBzL3BtY21zcC1mbGFzaC5jCkBAIC00OCw3ICs0OCw3IEBACiAKICNkZWZpbmUgREVCVUdfTUFSS0VSIHByaW50ayhLRVJOX05PVElDRSAiJXNbJWRdXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pCiAKLWludCBfX2luaXQgaW5pdF9tc3BfZmxhc2godm9pZCkKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfbXNwX2ZsYXNoKHZvaWQpCiB7CiAJaW50IGksIGo7CiAJaW50IG9mZnNldCwgY29mZjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL21hcHMvcmVkd29vZC5jIGIvZHJpdmVycy9tdGQvbWFwcy9yZWR3b29kLmMKaW5kZXggZGUwMDJlYi4uOTMzYzBiNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbWFwcy9yZWR3b29kLmMKKysrIGIvZHJpdmVycy9tdGQvbWFwcy9yZWR3b29kLmMKQEAgLTEyMiw3ICsxMjIsNyBAQAogCiBzdGF0aWMgc3RydWN0IG10ZF9pbmZvICpyZWR3b29kX210ZDsKIAotaW50IF9faW5pdCBpbml0X3JlZHdvb2RfZmxhc2godm9pZCkKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfcmVkd29vZF9mbGFzaCh2b2lkKQogewogCWludCBlcnI7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL21hcHMvcnB4bGl0ZS5jIGIvZHJpdmVycy9tdGQvbWFwcy9ycHhsaXRlLmMKaW5kZXggMTRkOTBlZC4uM2UzZWY1MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbWFwcy9ycHhsaXRlLmMKKysrIGIvZHJpdmVycy9tdGQvbWFwcy9ycHhsaXRlLmMKQEAgLTIzLDcgKzIzLDcgQEAKIAkucGh5cyA9IFdJTkRPV19BRERSLAogfTsKIAotaW50IF9faW5pdCBpbml0X3JweGxpdGUodm9pZCkKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfcnB4bGl0ZSh2b2lkKQogewogCXByaW50ayhLRVJOX05PVElDRSAiUlBYIExpdGUgb3IgQ0xMRiBmbGFzaCBkZXZpY2U6ICV4IGF0ICV4XG4iLCBXSU5ET1dfU0laRSo0LCBXSU5ET1dfQUREUik7CiAJcnB4bGl0ZV9tYXAudmlydCA9IGlvcmVtYXAoV0lORE9XX0FERFIsIFdJTkRPV19TSVpFICogNCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9tYXBzL3NiYzgyNDAuYyBiL2RyaXZlcnMvbXRkL21hcHMvc2JjODI0MC5jCmluZGV4IDZlMWU5OWMuLmQ1Mzc0Y2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL21hcHMvc2JjODI0MC5jCisrKyBiL2RyaXZlcnMvbXRkL21hcHMvc2JjODI0MC5jCkBAIC0xMzYsNyArMTM2LDcgQEAKICNlbmRpZgkvKiBDT05GSUdfTVREX1BBUlRJVElPTlMgKi8KIAogCi1pbnQgX19pbml0IGluaXRfc2JjODI0MF9tdGQgKHZvaWQpCitzdGF0aWMgaW50IF9faW5pdCBpbml0X3NiYzgyNDBfbXRkICh2b2lkKQogewogCXN0YXRpYyBzdHJ1Y3QgX2NqcyB7CiAJCXVfbG9uZyBhZGRyOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbWFwcy9zY2IyX2ZsYXNoLmMgYi9kcml2ZXJzL210ZC9tYXBzL3NjYjJfZmxhc2guYwppbmRleCAyMTE2OWU2Li43ZTMyOWYwIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9tYXBzL3NjYjJfZmxhc2guYworKysgYi9kcml2ZXJzL210ZC9tYXBzL3NjYjJfZmxhc2guYwpAQCAtMTE4LDcgKzExOCw4IEBACiAJCXN0cnVjdCBtdGRfZXJhc2VfcmVnaW9uX2luZm8gKnJlZ2lvbiA9ICZtdGQtPmVyYXNlcmVnaW9uc1tpXTsKIAogCQlpZiAocmVnaW9uLT5udW1ibG9ja3MgKiByZWdpb24tPmVyYXNlc2l6ZSA+IG10ZC0+c2l6ZSkgewotCQkJcmVnaW9uLT5udW1ibG9ja3MgPSAobXRkLT5zaXplIC8gcmVnaW9uLT5lcmFzZXNpemUpOworCQkJcmVnaW9uLT5udW1ibG9ja3MgPSAoKHVuc2lnbmVkIGxvbmcpbXRkLT5zaXplIC8KKwkJCQkJCXJlZ2lvbi0+ZXJhc2VzaXplKTsKIAkJCWRvbmUgPSAxOwogCQl9IGVsc2UgewogCQkJcmVnaW9uLT5udW1ibG9ja3MgPSAwOwpAQCAtMTg3LDggKzE4OCw5IEBACiAJCXJldHVybiAtRU5PREVWOwogCX0KIAotCXByaW50ayhLRVJOX05PVElDRSBNT0ROQU1FICI6IGNoaXAgc2l6ZSAweCV4IGF0IG9mZnNldCAweCV4XG4iLAotCSAgICAgICBzY2IyX210ZC0+c2l6ZSwgU0NCMl9XSU5ET1cgLSBzY2IyX210ZC0+c2l6ZSk7CisJcHJpbnRrKEtFUk5fTk9USUNFIE1PRE5BTUUgIjogY2hpcCBzaXplIDB4JWxseCBhdCBvZmZzZXQgMHglbGx4XG4iLAorCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKXNjYjJfbXRkLT5zaXplLAorCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKShTQ0IyX1dJTkRPVyAtIHNjYjJfbXRkLT5zaXplKSk7CiAKIAlhZGRfbXRkX2RldmljZShzY2IyX210ZCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL21hcHMvc2hhcnBzbC1mbGFzaC5jIGIvZHJpdmVycy9tdGQvbWFwcy9zaGFycHNsLWZsYXNoLmMKaW5kZXggMDI2ZWFiMC4uYjM5MmYwOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbWFwcy9zaGFycHNsLWZsYXNoLmMKKysrIGIvZHJpdmVycy9tdGQvbWFwcy9zaGFycHNsLWZsYXNoLmMKQEAgLTQ3LDcgKzQ3LDcgQEAKIAl9CiB9OwogCi1pbnQgX19pbml0IGluaXRfc2hhcnBzbCh2b2lkKQorc3RhdGljIGludCBfX2luaXQgaW5pdF9zaGFycHNsKHZvaWQpCiB7CiAJc3RydWN0IG10ZF9wYXJ0aXRpb24gKnBhcnRzOwogCWludCBuYl9wYXJ0cyA9IDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9tYXBzL3RxbTh4eGwuYyBiL2RyaXZlcnMvbXRkL21hcHMvdHFtOHh4bC5jCmluZGV4IGE1ZDNkODUuLjYwMTQ2OTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL21hcHMvdHFtOHh4bC5jCisrKyBiL2RyaXZlcnMvbXRkL21hcHMvdHFtOHh4bC5jCkBAIC0xMDksNyArMTA5LDcgQEAKIH07CiAjZW5kaWYKIAotaW50IF9faW5pdCBpbml0X3RxbV9tdGQodm9pZCkKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfdHFtX210ZCh2b2lkKQogewogCWludCBpZHggPSAwLCByZXQgPSAwOwogCXVuc2lnbmVkIGxvbmcgZmxhc2hfYWRkciwgZmxhc2hfc2l6ZSwgbXRkX3NpemUgPSAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbWFwcy91Y2xpbnV4LmMgYi9kcml2ZXJzL210ZC9tYXBzL3VjbGludXguYwppbmRleCAwZGM2NDVmLi44MTc1NmUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9tYXBzL3VjbGludXguYworKysgYi9kcml2ZXJzL210ZC9tYXBzL3VjbGludXguYwpAQCAtNTEsNyArNTEsNyBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotaW50IF9faW5pdCB1Y2xpbnV4X210ZF9pbml0KHZvaWQpCitzdGF0aWMgaW50IF9faW5pdCB1Y2xpbnV4X210ZF9pbml0KHZvaWQpCiB7CiAJc3RydWN0IG10ZF9pbmZvICptdGQ7CiAJc3RydWN0IG1hcF9pbmZvICptYXBwOwpAQCAtOTQsNyArOTQsNyBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdm9pZCBfX2V4aXQgdWNsaW51eF9tdGRfY2xlYW51cCh2b2lkKQorc3RhdGljIHZvaWQgX19leGl0IHVjbGludXhfbXRkX2NsZWFudXAodm9pZCkKIHsKIAlpZiAodWNsaW51eF9yYW1fbXRkaW5mbykgewogCQlkZWxfbXRkX3BhcnRpdGlvbnModWNsaW51eF9yYW1fbXRkaW5mbyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9tYXBzL3ZtYXgzMDEuYyBiL2RyaXZlcnMvbXRkL21hcHMvdm1heDMwMS5jCmluZGV4IDVhMGM5YTMuLjZkNDUyZGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL21hcHMvdm1heDMwMS5jCisrKyBiL2RyaXZlcnMvbXRkL21hcHMvdm1heDMwMS5jCkBAIC0xNDYsNyArMTQ2LDcgQEAKIAlpb3VubWFwKCh2b2lkICopdm1heF9tYXBbMF0ubWFwX3ByaXZfMSAtIFdJTkRPV19TVEFSVCk7CiB9CiAKLWludCBfX2luaXQgaW5pdF92bWF4MzAxKHZvaWQpCitzdGF0aWMgaW50IF9faW5pdCBpbml0X3ZtYXgzMDEodm9pZCkKIHsKIAlpbnQgaTsKIAl1bnNpZ25lZCBsb25nIGlvbWFwYWRyOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbWFwcy93cl9zYmM4Mnh4X2ZsYXNoLmMgYi9kcml2ZXJzL210ZC9tYXBzL3dyX3NiYzgyeHhfZmxhc2guYwppbmRleCA0MTNiMGNmLi45MzNhMmI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9tYXBzL3dyX3NiYzgyeHhfZmxhc2guYworKysgYi9kcml2ZXJzL210ZC9tYXBzL3dyX3NiYzgyeHhfZmxhc2guYwpAQCAtNzQsNyArNzQsNyBAQAogCX0JCQkJCQkJXAogfSB3aGlsZSAoMCk7CiAKLWludCBfX2luaXQgaW5pdF9zYmM4Mnh4X2ZsYXNoKHZvaWQpCitzdGF0aWMgaW50IF9faW5pdCBpbml0X3NiYzgyeHhfZmxhc2godm9pZCkKIHsKIAl2b2xhdGlsZSBtZW1jdGxfY3BtMl90ICptYyA9ICZjcG0yX2ltbXItPmltX21lbWN0bDsKIAlpbnQgYmlnZmxhc2g7CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9tdGRjaGFyLmMgYi9kcml2ZXJzL210ZC9tdGRjaGFyLmMKaW5kZXggYmNmZmVkYS4uZTllYzU5ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbXRkY2hhci5jCisrKyBiL2RyaXZlcnMvbXRkL210ZGNoYXIuYwpAQCAtNDUwLDE2ICs0NTAsMjAgQEAKIAkJaWYgKCFlcmFzZSkKIAkJCXJldCA9IC1FTk9NRU07CiAJCWVsc2UgeworCQkJc3RydWN0IGVyYXNlX2luZm9fdXNlciBlaW5mbzsKKwogCQkJd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdHE7CiAJCQlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKIAogCQkJaW5pdF93YWl0cXVldWVfaGVhZCgmd2FpdHEpOwogCi0JCQlpZiAoY29weV9mcm9tX3VzZXIoJmVyYXNlLT5hZGRyLCBhcmdwLAorCQkJaWYgKGNvcHlfZnJvbV91c2VyKCZlaW5mbywgYXJncCwKIAkJCQkgICAgc2l6ZW9mKHN0cnVjdCBlcmFzZV9pbmZvX3VzZXIpKSkgewogCQkJCWtmcmVlKGVyYXNlKTsKIAkJCQlyZXR1cm4gLUVGQVVMVDsKIAkJCX0KKwkJCWVyYXNlLT5hZGRyID0gZWluZm8uc3RhcnQ7CisJCQllcmFzZS0+bGVuID0gZWluZm8ubGVuZ3RoOwogCQkJZXJhc2UtPm10ZCA9IG10ZDsKIAkJCWVyYXNlLT5jYWxsYmFjayA9IG10ZGNoYXJfZXJhc2VfY2FsbGJhY2s7CiAJCQllcmFzZS0+cHJpdiA9ICh1bnNpZ25lZCBsb25nKSZ3YWl0cTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL210ZGNvbmNhdC5jIGIvZHJpdmVycy9tdGQvbXRkY29uY2F0LmMKaW5kZXggMWEwNWNmMy4uM2RiYjFiMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbXRkY29uY2F0LmMKKysrIGIvZHJpdmVycy9tdGQvbXRkY29uY2F0LmMKQEAgLTE5Nyw3ICsxOTcsNyBAQAogCQkJY29udGludWU7CiAJCX0KIAotCQlzaXplID0gbWluKHRvdGFsX2xlbiwgKHNpemVfdCkoc3ViZGV2LT5zaXplIC0gdG8pKTsKKwkJc2l6ZSA9IG1pbl90KHVpbnQ2NF90LCB0b3RhbF9sZW4sIHN1YmRldi0+c2l6ZSAtIHRvKTsKIAkJd3NpemUgPSBzaXplOyAvKiBzdG9yZSBmb3IgZnV0dXJlIHVzZSAqLwogCiAJCWVudHJ5X2hpZ2ggPSBlbnRyeV9sb3c7CkBAIC0zODUsNyArMzg1LDcgQEAKIAlzdHJ1Y3QgbXRkX2NvbmNhdCAqY29uY2F0ID0gQ09OQ0FUKG10ZCk7CiAJc3RydWN0IG10ZF9pbmZvICpzdWJkZXY7CiAJaW50IGksIGVycjsKLQl1X2ludDMyX3QgbGVuZ3RoLCBvZmZzZXQgPSAwOworCXVpbnQ2NF90IGxlbmd0aCwgb2Zmc2V0ID0gMDsKIAlzdHJ1Y3QgZXJhc2VfaW5mbyAqZXJhc2U7CiAKIAlpZiAoIShtdGQtPmZsYWdzICYgTVREX1dSSVRFQUJMRSkpCkBAIC01MTgsNyArNTE4LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBjb25jYXRfbG9jayhzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgbG9mZl90IG9mcywgc2l6ZV90IGxlbikKK3N0YXRpYyBpbnQgY29uY2F0X2xvY2soc3RydWN0IG10ZF9pbmZvICptdGQsIGxvZmZfdCBvZnMsIHVpbnQ2NF90IGxlbikKIHsKIAlzdHJ1Y3QgbXRkX2NvbmNhdCAqY29uY2F0ID0gQ09OQ0FUKG10ZCk7CiAJaW50IGksIGVyciA9IC1FSU5WQUw7CkBAIC01MjgsNyArNTI4LDcgQEAKIAogCWZvciAoaSA9IDA7IGkgPCBjb25jYXQtPm51bV9zdWJkZXY7IGkrKykgewogCQlzdHJ1Y3QgbXRkX2luZm8gKnN1YmRldiA9IGNvbmNhdC0+c3ViZGV2W2ldOwotCQlzaXplX3Qgc2l6ZTsKKwkJdWludDY0X3Qgc2l6ZTsKIAogCQlpZiAob2ZzID49IHN1YmRldi0+c2l6ZSkgewogCQkJc2l6ZSA9IDA7CkBAIC01NTYsNyArNTU2LDcgQEAKIAlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgaW50IGNvbmNhdF91bmxvY2soc3RydWN0IG10ZF9pbmZvICptdGQsIGxvZmZfdCBvZnMsIHNpemVfdCBsZW4pCitzdGF0aWMgaW50IGNvbmNhdF91bmxvY2soc3RydWN0IG10ZF9pbmZvICptdGQsIGxvZmZfdCBvZnMsIHVpbnQ2NF90IGxlbikKIHsKIAlzdHJ1Y3QgbXRkX2NvbmNhdCAqY29uY2F0ID0gQ09OQ0FUKG10ZCk7CiAJaW50IGksIGVyciA9IDA7CkBAIC01NjYsNyArNTY2LDcgQEAKIAogCWZvciAoaSA9IDA7IGkgPCBjb25jYXQtPm51bV9zdWJkZXY7IGkrKykgewogCQlzdHJ1Y3QgbXRkX2luZm8gKnN1YmRldiA9IGNvbmNhdC0+c3ViZGV2W2ldOwotCQlzaXplX3Qgc2l6ZTsKKwkJdWludDY0X3Qgc2l6ZTsKIAogCQlpZiAob2ZzID49IHN1YmRldi0+c2l6ZSkgewogCQkJc2l6ZSA9IDA7CkBAIC02OTYsNyArNjk2LDcgQEAKIAlpbnQgaTsKIAlzaXplX3Qgc2l6ZTsKIAlzdHJ1Y3QgbXRkX2NvbmNhdCAqY29uY2F0OwotCXVfaW50MzJfdCBtYXhfZXJhc2VzaXplLCBjdXJyX2VyYXNlc2l6ZTsKKwl1aW50MzJfdCBtYXhfZXJhc2VzaXplLCBjdXJyX2VyYXNlc2l6ZTsKIAlpbnQgbnVtX2VyYXNlX3JlZ2lvbjsKIAogCXByaW50ayhLRVJOX05PVElDRSAiQ29uY2F0ZW5hdGluZyBNVEQgZGV2aWNlczpcbiIpOwpAQCAtODQyLDEyICs4NDIsMTQgQEAKIAkJY29uY2F0LT5tdGQuZXJhc2VzaXplID0gY3Vycl9lcmFzZXNpemU7CiAJCWNvbmNhdC0+bXRkLm51bWVyYXNlcmVnaW9ucyA9IDA7CiAJfSBlbHNlIHsKKwkJdWludDY0X3QgdG1wNjQ7CisKIAkJLyoKIAkJICogZXJhc2UgYmxvY2sgc2l6ZSB2YXJpZXMgYWNyb3NzIHRoZSBzdWJkZXZpY2VzOiBhbGxvY2F0ZQogCQkgKiBzcGFjZSB0byBzdG9yZSB0aGUgZGF0YSBkZXNjcmliaW5nIHRoZSB2YXJpYWJsZSBlcmFzZSByZWdpb25zCiAJCSAqLwogCQlzdHJ1Y3QgbXRkX2VyYXNlX3JlZ2lvbl9pbmZvICplcmFzZV9yZWdpb25fcDsKLQkJdV9pbnQzMl90IGJlZ2luLCBwb3NpdGlvbjsKKwkJdWludDY0X3QgYmVnaW4sIHBvc2l0aW9uOwogCiAJCWNvbmNhdC0+bXRkLmVyYXNlc2l6ZSA9IG1heF9lcmFzZXNpemU7CiAJCWNvbmNhdC0+bXRkLm51bWVyYXNlcmVnaW9ucyA9IG51bV9lcmFzZV9yZWdpb247CkBAIC04NzksOCArODgxLDkgQEAKIAkJCQkJZXJhc2VfcmVnaW9uX3AtPm9mZnNldCA9IGJlZ2luOwogCQkJCQllcmFzZV9yZWdpb25fcC0+ZXJhc2VzaXplID0KIAkJCQkJICAgIGN1cnJfZXJhc2VzaXplOwotCQkJCQllcmFzZV9yZWdpb25fcC0+bnVtYmxvY2tzID0KLQkJCQkJICAgIChwb3NpdGlvbiAtIGJlZ2luKSAvIGN1cnJfZXJhc2VzaXplOworCQkJCQl0bXA2NCA9IHBvc2l0aW9uIC0gYmVnaW47CisJCQkJCWRvX2Rpdih0bXA2NCwgY3Vycl9lcmFzZXNpemUpOworCQkJCQllcmFzZV9yZWdpb25fcC0+bnVtYmxvY2tzID0gdG1wNjQ7CiAJCQkJCWJlZ2luID0gcG9zaXRpb247CiAKIAkJCQkJY3Vycl9lcmFzZXNpemUgPSBzdWJkZXZbaV0tPmVyYXNlc2l6ZTsKQEAgLTg5Nyw5ICs5MDAsOSBAQAogCQkJCQkJZXJhc2VfcmVnaW9uX3AtPm9mZnNldCA9IGJlZ2luOwogCQkJCQkJZXJhc2VfcmVnaW9uX3AtPmVyYXNlc2l6ZSA9CiAJCQkJCQkgICAgY3Vycl9lcmFzZXNpemU7Ci0JCQkJCQllcmFzZV9yZWdpb25fcC0+bnVtYmxvY2tzID0KLQkJCQkJCSAgICAocG9zaXRpb24gLQotCQkJCQkJICAgICBiZWdpbikgLyBjdXJyX2VyYXNlc2l6ZTsKKwkJCQkJCXRtcDY0ID0gcG9zaXRpb24gLSBiZWdpbjsKKwkJCQkJCWRvX2Rpdih0bXA2NCwgY3Vycl9lcmFzZXNpemUpOworCQkJCQkJZXJhc2VfcmVnaW9uX3AtPm51bWJsb2NrcyA9IHRtcDY0OwogCQkJCQkJYmVnaW4gPSBwb3NpdGlvbjsKIAogCQkJCQkJY3Vycl9lcmFzZXNpemUgPQpAQCAtOTA5LDE0ICs5MTIsMTYgQEAKIAkJCQkJfQogCQkJCQlwb3NpdGlvbiArPQogCQkJCQkgICAgc3ViZGV2W2ldLT5lcmFzZXJlZ2lvbnNbal0uCi0JCQkJCSAgICBudW1ibG9ja3MgKiBjdXJyX2VyYXNlc2l6ZTsKKwkJCQkJICAgIG51bWJsb2NrcyAqICh1aW50NjRfdCljdXJyX2VyYXNlc2l6ZTsKIAkJCQl9CiAJCQl9CiAJCX0KIAkJLyogTm93IHdyaXRlIHRoZSBmaW5hbCBlbnRyeSAqLwogCQllcmFzZV9yZWdpb25fcC0+b2Zmc2V0ID0gYmVnaW47CiAJCWVyYXNlX3JlZ2lvbl9wLT5lcmFzZXNpemUgPSBjdXJyX2VyYXNlc2l6ZTsKLQkJZXJhc2VfcmVnaW9uX3AtPm51bWJsb2NrcyA9IChwb3NpdGlvbiAtIGJlZ2luKSAvIGN1cnJfZXJhc2VzaXplOworCQl0bXA2NCA9IHBvc2l0aW9uIC0gYmVnaW47CisJCWRvX2Rpdih0bXA2NCwgY3Vycl9lcmFzZXNpemUpOworCQllcmFzZV9yZWdpb25fcC0+bnVtYmxvY2tzID0gdG1wNjQ7CiAJfQogCiAJcmV0dXJuICZjb25jYXQtPm10ZDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL210ZGNvcmUuYyBiL2RyaXZlcnMvbXRkL210ZGNvcmUuYwppbmRleCBhOWQyNDY5Li43NmZlMGExIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9tdGRjb3JlLmMKKysrIGIvZHJpdmVycy9tdGQvbXRkY29yZS5jCkBAIC01Nyw2ICs1NywxOSBAQAogCQkJbXRkLT5pbmRleCA9IGk7CiAJCQltdGQtPnVzZWNvdW50ID0gMDsKIAorCQkJaWYgKGlzX3Bvd2VyX29mXzIobXRkLT5lcmFzZXNpemUpKQorCQkJCW10ZC0+ZXJhc2VzaXplX3NoaWZ0ID0gZmZzKG10ZC0+ZXJhc2VzaXplKSAtIDE7CisJCQllbHNlCisJCQkJbXRkLT5lcmFzZXNpemVfc2hpZnQgPSAwOworCisJCQlpZiAoaXNfcG93ZXJfb2ZfMihtdGQtPndyaXRlc2l6ZSkpCisJCQkJbXRkLT53cml0ZXNpemVfc2hpZnQgPSBmZnMobXRkLT53cml0ZXNpemUpIC0gMTsKKwkJCWVsc2UKKwkJCQltdGQtPndyaXRlc2l6ZV9zaGlmdCA9IDA7CisKKwkJCW10ZC0+ZXJhc2VzaXplX21hc2sgPSAoMSA8PCBtdGQtPmVyYXNlc2l6ZV9zaGlmdCkgLSAxOworCQkJbXRkLT53cml0ZXNpemVfbWFzayA9ICgxIDw8IG10ZC0+d3JpdGVzaXplX3NoaWZ0KSAtIDE7CisKIAkJCS8qIFNvbWUgY2hpcHMgYWx3YXlzIHBvd2VyIHVwIGxvY2tlZC4gVW5sb2NrIHRoZW0gbm93ICovCiAJCQlpZiAoKG10ZC0+ZmxhZ3MgJiBNVERfV1JJVEVBQkxFKQogCQkJICAgICYmIChtdGQtPmZsYWdzICYgTVREX1BPV0VSVVBfTE9DSykgJiYgbXRkLT51bmxvY2spIHsKQEAgLTM0NCw3ICszNTcsOCBAQAogCWlmICghdGhpcykKIAkJcmV0dXJuIDA7CiAKLQlyZXR1cm4gc3ByaW50ZihidWYsICJtdGQlZDogJTguOHggJTguOHggXCIlc1wiXG4iLCBpLCB0aGlzLT5zaXplLAorCXJldHVybiBzcHJpbnRmKGJ1ZiwgIm10ZCVkOiAlOC44bGx4ICU4Ljh4IFwiJXNcIlxuIiwgaSwKKwkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpdGhpcy0+c2l6ZSwKIAkJICAgICAgIHRoaXMtPmVyYXNlc2l6ZSwgdGhpcy0+bmFtZSk7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL210ZG9vcHMuYyBiL2RyaXZlcnMvbXRkL210ZG9vcHMuYwppbmRleCBhZWJiM2IyLi4xYTZiM2JlIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9tdGRvb3BzLmMKKysrIGIvZHJpdmVycy9tdGQvbXRkb29wcy5jCkBAIC04MCw5ICs4MCw5IEBACiAJaWYgKHJldCkgewogCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOwogCQlyZW1vdmVfd2FpdF9xdWV1ZSgmd2FpdF9xLCAmd2FpdCk7Ci0JCXByaW50ayAoS0VSTl9XQVJOSU5HICJtdGRvb3BzOiBlcmFzZSBvZiByZWdpb24gWzB4JXgsIDB4JXhdICIKKwkJcHJpbnRrIChLRVJOX1dBUk5JTkcgIm10ZG9vcHM6IGVyYXNlIG9mIHJlZ2lvbiBbMHglbGx4LCAweCVsbHhdICIKIAkJCQkgICAgICJvbiBcIiVzXCIgZmFpbGVkXG4iLAotCQkJZXJhc2UuYWRkciwgZXJhc2UubGVuLCBtdGQtPm5hbWUpOworCQkJKHVuc2lnbmVkIGxvbmcgbG9uZyllcmFzZS5hZGRyLCAodW5zaWduZWQgbG9uZyBsb25nKWVyYXNlLmxlbiwgbXRkLT5uYW1lKTsKIAkJcmV0dXJuIHJldDsKIAl9CiAKQEAgLTI4OSw3ICsyODksMTAgQEAKIAl9CiAKIAljeHQtPm10ZCA9IG10ZDsKLQljeHQtPm9vcHNfcGFnZXMgPSBtdGQtPnNpemUgLyBPT1BTX1BBR0VfU0laRTsKKwlpZiAobXRkLT5zaXplID4gSU5UX01BWCkKKwkJY3h0LT5vb3BzX3BhZ2VzID0gSU5UX01BWCAvIE9PUFNfUEFHRV9TSVpFOworCWVsc2UKKwkJY3h0LT5vb3BzX3BhZ2VzID0gKGludCltdGQtPnNpemUgLyBPT1BTX1BBR0VfU0laRTsKIAogCWZpbmRfbmV4dF9wb3NpdGlvbihjeHQpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9tdGRwYXJ0LmMgYi9kcml2ZXJzL210ZC9tdGRwYXJ0LmMKaW5kZXggMzcyODkxMy4uMTQ0ZTZiNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbXRkcGFydC5jCisrKyBiL2RyaXZlcnMvbXRkL210ZHBhcnQuYwpAQCAtMjYsNyArMjYsNyBAQAogc3RydWN0IG10ZF9wYXJ0IHsKIAlzdHJ1Y3QgbXRkX2luZm8gbXRkOwogCXN0cnVjdCBtdGRfaW5mbyAqbWFzdGVyOwotCXVfaW50MzJfdCBvZmZzZXQ7CisJdWludDY0X3Qgb2Zmc2V0OwogCWludCBpbmRleDsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CiAJaW50IHJlZ2lzdGVyZWQ7CkBAIC0yMzUsNyArMjM1LDcgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKG10ZF9lcmFzZV9jYWxsYmFjayk7CiAKLXN0YXRpYyBpbnQgcGFydF9sb2NrKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBsb2ZmX3Qgb2ZzLCBzaXplX3QgbGVuKQorc3RhdGljIGludCBwYXJ0X2xvY2soc3RydWN0IG10ZF9pbmZvICptdGQsIGxvZmZfdCBvZnMsIHVpbnQ2NF90IGxlbikKIHsKIAlzdHJ1Y3QgbXRkX3BhcnQgKnBhcnQgPSBQQVJUKG10ZCk7CiAJaWYgKChsZW4gKyBvZnMpID4gbXRkLT5zaXplKQpAQCAtMjQzLDcgKzI0Myw3IEBACiAJcmV0dXJuIHBhcnQtPm1hc3Rlci0+bG9jayhwYXJ0LT5tYXN0ZXIsIG9mcyArIHBhcnQtPm9mZnNldCwgbGVuKTsKIH0KIAotc3RhdGljIGludCBwYXJ0X3VubG9jayhzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgbG9mZl90IG9mcywgc2l6ZV90IGxlbikKK3N0YXRpYyBpbnQgcGFydF91bmxvY2soc3RydWN0IG10ZF9pbmZvICptdGQsIGxvZmZfdCBvZnMsIHVpbnQ2NF90IGxlbikKIHsKIAlzdHJ1Y3QgbXRkX3BhcnQgKnBhcnQgPSBQQVJUKG10ZCk7CiAJaWYgKChsZW4gKyBvZnMpID4gbXRkLT5zaXplKQpAQCAtMzE3LDcgKzMxNyw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgbXRkX3BhcnQgKmFkZF9vbmVfcGFydGl0aW9uKHN0cnVjdCBtdGRfaW5mbyAqbWFzdGVyLAogCQljb25zdCBzdHJ1Y3QgbXRkX3BhcnRpdGlvbiAqcGFydCwgaW50IHBhcnRubywKLQkJdV9pbnQzMl90IGN1cl9vZmZzZXQpCisJCXVpbnQ2NF90IGN1cl9vZmZzZXQpCiB7CiAJc3RydWN0IG10ZF9wYXJ0ICpzbGF2ZTsKIApAQCAtMzk1LDE5ICszOTUsMTkgQEAKIAkJc2xhdmUtPm9mZnNldCA9IGN1cl9vZmZzZXQ7CiAJaWYgKHNsYXZlLT5vZmZzZXQgPT0gTVREUEFSVF9PRlNfTlhUQkxLKSB7CiAJCXNsYXZlLT5vZmZzZXQgPSBjdXJfb2Zmc2V0OwotCQlpZiAoKGN1cl9vZmZzZXQgJSBtYXN0ZXItPmVyYXNlc2l6ZSkgIT0gMCkgeworCQlpZiAobXRkX21vZF9ieV9lYihjdXJfb2Zmc2V0LCBtYXN0ZXIpICE9IDApIHsKIAkJCS8qIFJvdW5kIHVwIHRvIG5leHQgZXJhc2VzaXplICovCi0JCQlzbGF2ZS0+b2Zmc2V0ID0gKChjdXJfb2Zmc2V0IC8gbWFzdGVyLT5lcmFzZXNpemUpICsgMSkgKiBtYXN0ZXItPmVyYXNlc2l6ZTsKKwkJCXNsYXZlLT5vZmZzZXQgPSAobXRkX2Rpdl9ieV9lYihjdXJfb2Zmc2V0LCBtYXN0ZXIpICsgMSkgKiBtYXN0ZXItPmVyYXNlc2l6ZTsKIAkJCXByaW50ayhLRVJOX05PVElDRSAiTW92aW5nIHBhcnRpdGlvbiAlZDogIgotCQkJICAgICAgICIweCUwOHggLT4gMHglMDh4XG4iLCBwYXJ0bm8sCi0JCQkgICAgICAgY3VyX29mZnNldCwgc2xhdmUtPm9mZnNldCk7CisJCQkgICAgICAgIjB4JTAxMmxseCAtPiAweCUwMTJsbHhcbiIsIHBhcnRubywKKwkJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKWN1cl9vZmZzZXQsICh1bnNpZ25lZCBsb25nIGxvbmcpc2xhdmUtPm9mZnNldCk7CiAJCX0KIAl9CiAJaWYgKHNsYXZlLT5tdGQuc2l6ZSA9PSBNVERQQVJUX1NJWl9GVUxMKQogCQlzbGF2ZS0+bXRkLnNpemUgPSBtYXN0ZXItPnNpemUgLSBzbGF2ZS0+b2Zmc2V0OwogCi0JcHJpbnRrKEtFUk5fTk9USUNFICIweCUwOHgtMHglMDh4IDogXCIlc1wiXG4iLCBzbGF2ZS0+b2Zmc2V0LAotCQlzbGF2ZS0+b2Zmc2V0ICsgc2xhdmUtPm10ZC5zaXplLCBzbGF2ZS0+bXRkLm5hbWUpOworCXByaW50ayhLRVJOX05PVElDRSAiMHglMDEybGx4LTB4JTAxMmxseCA6IFwiJXNcIlxuIiwgKHVuc2lnbmVkIGxvbmcgbG9uZylzbGF2ZS0+b2Zmc2V0LAorCQkodW5zaWduZWQgbG9uZyBsb25nKShzbGF2ZS0+b2Zmc2V0ICsgc2xhdmUtPm10ZC5zaXplKSwgc2xhdmUtPm10ZC5uYW1lKTsKIAogCS8qIGxldCdzIGRvIHNvbWUgc2FuaXR5IGNoZWNrcyAqLwogCWlmIChzbGF2ZS0+b2Zmc2V0ID49IG1hc3Rlci0+c2l6ZSkgewpAQCAtNDIwLDEzICs0MjAsMTMgQEAKIAl9CiAJaWYgKHNsYXZlLT5vZmZzZXQgKyBzbGF2ZS0+bXRkLnNpemUgPiBtYXN0ZXItPnNpemUpIHsKIAkJc2xhdmUtPm10ZC5zaXplID0gbWFzdGVyLT5zaXplIC0gc2xhdmUtPm9mZnNldDsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyJtdGQ6IHBhcnRpdGlvbiBcIiVzXCIgZXh0ZW5kcyBiZXlvbmQgdGhlIGVuZCBvZiBkZXZpY2UgXCIlc1wiIC0tIHNpemUgdHJ1bmNhdGVkIHRvICUjeFxuIiwKLQkJCXBhcnQtPm5hbWUsIG1hc3Rlci0+bmFtZSwgc2xhdmUtPm10ZC5zaXplKTsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyJtdGQ6IHBhcnRpdGlvbiBcIiVzXCIgZXh0ZW5kcyBiZXlvbmQgdGhlIGVuZCBvZiBkZXZpY2UgXCIlc1wiIC0tIHNpemUgdHJ1bmNhdGVkIHRvICUjbGx4XG4iLAorCQkJcGFydC0+bmFtZSwgbWFzdGVyLT5uYW1lLCAodW5zaWduZWQgbG9uZyBsb25nKXNsYXZlLT5tdGQuc2l6ZSk7CiAJfQogCWlmIChtYXN0ZXItPm51bWVyYXNlcmVnaW9ucyA+IDEpIHsKIAkJLyogRGVhbCB3aXRoIHZhcmlhYmxlIGVyYXNlIHNpemUgc3R1ZmYgKi8KIAkJaW50IGksIG1heCA9IG1hc3Rlci0+bnVtZXJhc2VyZWdpb25zOwotCQl1MzIgZW5kID0gc2xhdmUtPm9mZnNldCArIHNsYXZlLT5tdGQuc2l6ZTsKKwkJdTY0IGVuZCA9IHNsYXZlLT5vZmZzZXQgKyBzbGF2ZS0+bXRkLnNpemU7CiAJCXN0cnVjdCBtdGRfZXJhc2VfcmVnaW9uX2luZm8gKnJlZ2lvbnMgPSBtYXN0ZXItPmVyYXNlcmVnaW9uczsKIAogCQkvKiBGaW5kIHRoZSBmaXJzdCBlcmFzZSByZWdpb25zIHdoaWNoIGlzIHBhcnQgb2YgdGhpcwpAQCAtNDQ5LDcgKzQ0OSw3IEBACiAJfQogCiAJaWYgKChzbGF2ZS0+bXRkLmZsYWdzICYgTVREX1dSSVRFQUJMRSkgJiYKLQkgICAgKHNsYXZlLT5vZmZzZXQgJSBzbGF2ZS0+bXRkLmVyYXNlc2l6ZSkpIHsKKwkgICAgbXRkX21vZF9ieV9lYihzbGF2ZS0+b2Zmc2V0LCAmc2xhdmUtPm10ZCkpIHsKIAkJLyogRG9lc24ndCBzdGFydCBvbiBhIGJvdW5kYXJ5IG9mIG1ham9yIGVyYXNlIHNpemUgKi8KIAkJLyogRklYTUU6IExldCBpdCBiZSB3cml0YWJsZSBpZiBpdCBpcyBvbiBhIGJvdW5kYXJ5IG9mCiAJCSAqIF9taW5vcl8gZXJhc2Ugc2l6ZSB0aG91Z2ggKi8KQEAgLTQ1OCw3ICs0NTgsNyBAQAogCQkJcGFydC0+bmFtZSk7CiAJfQogCWlmICgoc2xhdmUtPm10ZC5mbGFncyAmIE1URF9XUklURUFCTEUpICYmCi0JICAgIChzbGF2ZS0+bXRkLnNpemUgJSBzbGF2ZS0+bXRkLmVyYXNlc2l6ZSkpIHsKKwkgICAgbXRkX21vZF9ieV9lYihzbGF2ZS0+bXRkLnNpemUsICZzbGF2ZS0+bXRkKSkgewogCQlzbGF2ZS0+bXRkLmZsYWdzICY9IH5NVERfV1JJVEVBQkxFOwogCQlwcmludGsoS0VSTl9XQVJOSU5HIm10ZDogcGFydGl0aW9uIFwiJXNcIiBkb2Vzbid0IGVuZCBvbiBhbiBlcmFzZSBibG9jayAtLSBmb3JjZSByZWFkLW9ubHlcbiIsCiAJCQlwYXJ0LT5uYW1lKTsKQEAgLTQ2Niw3ICs0NjYsNyBAQAogCiAJc2xhdmUtPm10ZC5lY2NsYXlvdXQgPSBtYXN0ZXItPmVjY2xheW91dDsKIAlpZiAobWFzdGVyLT5ibG9ja19pc2JhZCkgewotCQl1aW50MzJfdCBvZmZzID0gMDsKKwkJdWludDY0X3Qgb2ZmcyA9IDA7CiAKIAkJd2hpbGUgKG9mZnMgPCBzbGF2ZS0+bXRkLnNpemUpIHsKIAkJCWlmIChtYXN0ZXItPmJsb2NrX2lzYmFkKG1hc3RlciwKQEAgLTUwMSw3ICs1MDEsNyBAQAogCQkgICAgICAgaW50IG5icGFydHMpCiB7CiAJc3RydWN0IG10ZF9wYXJ0ICpzbGF2ZTsKLQl1X2ludDMyX3QgY3VyX29mZnNldCA9IDA7CisJdWludDY0X3QgY3VyX29mZnNldCA9IDA7CiAJaW50IGk7CiAKIAlwcmludGsoS0VSTl9OT1RJQ0UgIkNyZWF0aW5nICVkIE1URCBwYXJ0aXRpb25zIG9uIFwiJXNcIjpcbiIsIG5icGFydHMsIG1hc3Rlci0+bmFtZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9uYW5kL0tjb25maWcgYi9kcml2ZXJzL210ZC9uYW5kL0tjb25maWcKaW5kZXggZjhhZTA0MC4uOGIxMmU2ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbmFuZC9LY29uZmlnCisrKyBiL2RyaXZlcnMvbXRkL25hbmQvS2NvbmZpZwpAQCAtMTYzLDYgKzE2MywxMyBAQAogCSAgaW5jb3JyZWN0IEVDQyBnZW5lcmF0aW9uLCBhbmQgaWYgdXNpbmcgdGhlc2UsIHRoZSBkZWZhdWx0IG9mCiAJICBzb2Z0d2FyZSBFQ0MgaXMgcHJlZmVyYWJsZS4KIAorY29uZmlnIE1URF9OQU5EX05ERkMKKwl0cmlzdGF0ZSAiTkRGQyBOYW5EIEZsYXNoIENvbnRyb2xsZXIiCisJZGVwZW5kcyBvbiA0eHgKKwlzZWxlY3QgTVREX05BTkRfRUNDX1NNQworCWhlbHAKKwkgTkRGQyBOYW5kIEZsYXNoIENvbnRyb2xsZXJzIGFyZSBpbnRlZ3JhdGVkIGluIElCTS9BTUNDJ3MgNHh4IFNvQ3MKKwogY29uZmlnIE1URF9OQU5EX1MzQzI0MTBfQ0xLU1RPUAogCWJvb2wgIlMzQzI0MTAgTkFORCBJRExFIGNsb2NrIHN0b3AiCiAJZGVwZW5kcyBvbiBNVERfTkFORF9TM0MyNDEwCmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9uYW5kL2FsYXVkYS5jIGIvZHJpdmVycy9tdGQvbmFuZC9hbGF1ZGEuYwppbmRleCA5NjIzODAzLi42ZDk2NDkxIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9uYW5kL2FsYXVkYS5jCisrKyBiL2RyaXZlcnMvbXRkL25hbmQvYWxhdWRhLmMKQEAgLTY3NiwxMSArNjc2LDExIEBACiAJCWdvdG8gZXJyb3I7CiAKIAlhbC0+d3JpdGVfb3V0ID0gdXNiX3NuZGJ1bGtwaXBlKGFsLT5kZXYsCi0JCQllcF93ci0+YkVuZHBvaW50QWRkcmVzcyAmIFVTQl9FTkRQT0lOVF9OVU1CRVJfTUFTSyk7CisJCQl1c2JfZW5kcG9pbnRfbnVtKGVwX3dyKSk7CiAJYWwtPmJ1bGtfaW4gPSB1c2JfcmN2YnVsa3BpcGUoYWwtPmRldiwKLQkJCWVwX2luLT5iRW5kcG9pbnRBZGRyZXNzICYgVVNCX0VORFBPSU5UX05VTUJFUl9NQVNLKTsKKwkJCXVzYl9lbmRwb2ludF9udW0oZXBfaW4pKTsKIAlhbC0+YnVsa19vdXQgPSB1c2Jfc25kYnVsa3BpcGUoYWwtPmRldiwKLQkJCWVwX291dC0+YkVuZHBvaW50QWRkcmVzcyAmIFVTQl9FTkRQT0lOVF9OVU1CRVJfTUFTSyk7CisJCQl1c2JfZW5kcG9pbnRfbnVtKGVwX291dCkpOwogCiAJLyogc2Vjb25kIGRldmljZSBpcyBpZGVudGljYWwgdXAgdG8gbm93ICovCiAJbWVtY3B5KGFsKzEsIGFsLCBzaXplb2YoKmFsKSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9uYW5kL2NhZmVfbmFuZC5jIGIvZHJpdmVycy9tdGQvbmFuZC9jYWZlX25hbmQuYwppbmRleCBiODA2NGJmLi4yMmE2YjJlIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9uYW5kL2NhZmVfbmFuZC5jCisrKyBiL2RyaXZlcnMvbXRkL25hbmQvY2FmZV9uYW5kLmMKQEAgLTkwLDcgKzkwLDcgQEAKIG1vZHVsZV9wYXJhbV9hcnJheSh0aW1pbmcsIGludCwgJm51bXRpbWluZ3MsIDA2NDQpOwogCiAjaWZkZWYgQ09ORklHX01URF9QQVJUSVRJT05TCi1zdGF0aWMgY29uc3QgY2hhciAqcGFydF9wcm9iZXNbXSA9IHsgIlJlZEJvb3QiLCBOVUxMIH07CitzdGF0aWMgY29uc3QgY2hhciAqcGFydF9wcm9iZXNbXSA9IHsgImNtZGxpbmVwYXJ0IiwgIlJlZEJvb3QiLCBOVUxMIH07CiAjZW5kaWYKIAogLyogSHJtLiBXaHkgaXNuJ3QgdGhpcyBhbHJlYWR5IGNvbmRpdGlvbmFsIG9uIHNvbWV0aGluZyBpbiB0aGUgc3RydWN0IGRldmljZT8gKi8KQEAgLTgwNSwxMCArODA1LDEzIEBACiAJYWRkX210ZF9kZXZpY2UobXRkKTsKIAogI2lmZGVmIENPTkZJR19NVERfUEFSVElUSU9OUworI2lmZGVmIENPTkZJR19NVERfQ01ETElORV9QQVJUUworCW10ZC0+bmFtZSA9ICJjYWZlX25hbmQiOworI2VuZGlmCiAJbnJfcGFydHMgPSBwYXJzZV9tdGRfcGFydGl0aW9ucyhtdGQsIHBhcnRfcHJvYmVzLCAmcGFydHMsIDApOwogCWlmIChucl9wYXJ0cyA+IDApIHsKIAkJY2FmZS0+cGFydHMgPSBwYXJ0czsKLQkJZGV2X2luZm8oJmNhZmUtPnBkZXYtPmRldiwgIiVkIFJlZEJvb3QgcGFydGl0aW9ucyBmb3VuZFxuIiwgbnJfcGFydHMpOworCQlkZXZfaW5mbygmY2FmZS0+cGRldi0+ZGV2LCAiJWQgcGFydGl0aW9ucyBmb3VuZFxuIiwgbnJfcGFydHMpOwogCQlhZGRfbXRkX3BhcnRpdGlvbnMobXRkLCBwYXJ0cywgbnJfcGFydHMpOwogCX0KICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbmFuZC9mc2xfZWxiY19uYW5kLmMgYi9kcml2ZXJzL210ZC9uYW5kL2ZzbF9lbGJjX25hbmQuYwppbmRleCA0YWE1YmQ2Li42NTkyOWRiIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9uYW5kL2ZzbF9lbGJjX25hbmQuYworKysgYi9kcml2ZXJzL210ZC9uYW5kL2ZzbF9lbGJjX25hbmQuYwpAQCAtNzc3LDcgKzc3Nyw5IEBACiAJLyogRmlsbCBpbiBmc2xfZWxiY19tdGQgc3RydWN0dXJlICovCiAJcHJpdi0+bXRkLnByaXYgPSBjaGlwOwogCXByaXYtPm10ZC5vd25lciA9IFRISVNfTU9EVUxFOwotCXByaXYtPmZtciA9IDA7IC8qIHJlc3QgZmlsbGVkIGluIGxhdGVyICovCisKKwkvKiBTZXQgdGhlIEVDQ00gYWNjb3JkaW5nIHRvIHRoZSBzZXR0aW5ncyBpbiBib290bG9hZGVyLiovCisJcHJpdi0+Zm1yID0gaW5fYmUzMigmbGJjLT5mbXIpICYgRk1SX0VDQ007CiAKIAkvKiBmaWxsIGluIG5hbmRfY2hpcCBzdHJ1Y3R1cmUgKi8KIAkvKiBzZXQgdXAgZnVuY3Rpb24gY2FsbCB0YWJsZSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbmFuZC9uYW5kX2Jhc2UuYyBiL2RyaXZlcnMvbXRkL25hbmQvbmFuZF9iYXNlLmMKaW5kZXggMGE5YzljZC4uMGMzYWZjYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbmFuZC9uYW5kX2Jhc2UuYworKysgYi9kcml2ZXJzL210ZC9uYW5kL25hbmRfYmFzZS5jCkBAIC0yMDE0LDEzICsyMDE0LDE0IEBACiBpbnQgbmFuZF9lcmFzZV9uYW5kKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBzdHJ1Y3QgZXJhc2VfaW5mbyAqaW5zdHIsCiAJCSAgICBpbnQgYWxsb3diYnQpCiB7Ci0JaW50IHBhZ2UsIGxlbiwgc3RhdHVzLCBwYWdlc19wZXJfYmxvY2ssIHJldCwgY2hpcG5yOworCWludCBwYWdlLCBzdGF0dXMsIHBhZ2VzX3Blcl9ibG9jaywgcmV0LCBjaGlwbnI7CiAJc3RydWN0IG5hbmRfY2hpcCAqY2hpcCA9IG10ZC0+cHJpdjsKLQlpbnQgcmV3cml0ZV9iYnRbTkFORF9NQVhfQ0hJUFNdPXswfTsKKwlsb2ZmX3QgcmV3cml0ZV9iYnRbTkFORF9NQVhfQ0hJUFNdPXswfTsKIAl1bnNpZ25lZCBpbnQgYmJ0X21hc2tlZF9wYWdlID0gMHhmZmZmZmZmZjsKKwlsb2ZmX3QgbGVuOwogCi0JREVCVUcoTVREX0RFQlVHX0xFVkVMMywgIm5hbmRfZXJhc2U6IHN0YXJ0ID0gMHglMDh4LCBsZW4gPSAlaVxuIiwKLQkgICAgICAodW5zaWduZWQgaW50KWluc3RyLT5hZGRyLCAodW5zaWduZWQgaW50KWluc3RyLT5sZW4pOworCURFQlVHKE1URF9ERUJVR19MRVZFTDMsICJuYW5kX2VyYXNlOiBzdGFydCA9IDB4JTAxMmxseCwgbGVuID0gJWxsdVxuIiwKKwkgICAgICAodW5zaWduZWQgbG9uZyBsb25nKWluc3RyLT5hZGRyLCAodW5zaWduZWQgbG9uZyBsb25nKWluc3RyLT5sZW4pOwogCiAJLyogU3RhcnQgYWRkcmVzcyBtdXN0IGFsaWduIG9uIGJsb2NrIGJvdW5kYXJ5ICovCiAJaWYgKGluc3RyLT5hZGRyICYgKCgxIDw8IGNoaXAtPnBoeXNfZXJhc2Vfc2hpZnQpIC0gMSkpIHsKQEAgLTIxMTYsNyArMjExNyw4IEBACiAJCQlERUJVRyhNVERfREVCVUdfTEVWRUwwLCAibmFuZF9lcmFzZTogIgogCQkJICAgICAgIkZhaWxlZCBlcmFzZSwgcGFnZSAweCUwOHhcbiIsIHBhZ2UpOwogCQkJaW5zdHItPnN0YXRlID0gTVREX0VSQVNFX0ZBSUxFRDsKLQkJCWluc3RyLT5mYWlsX2FkZHIgPSAocGFnZSA8PCBjaGlwLT5wYWdlX3NoaWZ0KTsKKwkJCWluc3RyLT5mYWlsX2FkZHIgPQorCQkJCSgobG9mZl90KXBhZ2UgPDwgY2hpcC0+cGFnZV9zaGlmdCk7CiAJCQlnb3RvIGVyYXNlX2V4aXQ7CiAJCX0KIApAQCAtMjEyNiw3ICsyMTI4LDggQEAKIAkJICovCiAJCWlmIChiYnRfbWFza2VkX3BhZ2UgIT0gMHhmZmZmZmZmZiAmJgogCQkgICAgKHBhZ2UgJiBCQlRfUEFHRV9NQVNLKSA9PSBiYnRfbWFza2VkX3BhZ2UpCi0JCQkgICAgcmV3cml0ZV9iYnRbY2hpcG5yXSA9IChwYWdlIDw8IGNoaXAtPnBhZ2Vfc2hpZnQpOworCQkJICAgIHJld3JpdGVfYmJ0W2NoaXBucl0gPQorCQkJCQkoKGxvZmZfdClwYWdlIDw8IGNoaXAtPnBhZ2Vfc2hpZnQpOwogCiAJCS8qIEluY3JlbWVudCBwYWdlIGFkZHJlc3MgYW5kIGRlY3JlbWVudCBsZW5ndGggKi8KIAkJbGVuIC09ICgxIDw8IGNoaXAtPnBoeXNfZXJhc2Vfc2hpZnQpOwpAQCAtMjE3Myw3ICsyMTc2LDcgQEAKIAkJCWNvbnRpbnVlOwogCQkvKiB1cGRhdGUgdGhlIEJCVCBmb3IgY2hpcCAqLwogCQlERUJVRyhNVERfREVCVUdfTEVWRUwwLCAibmFuZF9lcmFzZV9uYW5kOiBuYW5kX3VwZGF0ZV9iYnQgIgotCQkgICAgICAiKCVkOjB4JTB4IDB4JTB4KVxuIiwgY2hpcG5yLCByZXdyaXRlX2JidFtjaGlwbnJdLAorCQkgICAgICAiKCVkOjB4JTBsbHggMHglMHgpXG4iLCBjaGlwbnIsIHJld3JpdGVfYmJ0W2NoaXBucl0sCiAJCSAgICAgIGNoaXAtPmJidF90ZC0+cGFnZXNbY2hpcG5yXSk7CiAJCW5hbmRfdXBkYXRlX2JidChtdGQsIHJld3JpdGVfYmJ0W2NoaXBucl0pOwogCX0KQEAgLTIzNjUsNyArMjM2OCw3IEBACiAJaWYgKCFtdGQtPm5hbWUpCiAJCW10ZC0+bmFtZSA9IHR5cGUtPm5hbWU7CiAKLQljaGlwLT5jaGlwc2l6ZSA9IHR5cGUtPmNoaXBzaXplIDw8IDIwOworCWNoaXAtPmNoaXBzaXplID0gKHVpbnQ2NF90KXR5cGUtPmNoaXBzaXplIDw8IDIwOwogCiAJLyogTmV3ZXIgZGV2aWNlcyBoYXZlIGFsbCB0aGUgaW5mb3JtYXRpb24gaW4gYWRkaXRpb25hbCBpZCBieXRlcyAqLwogCWlmICghdHlwZS0+cGFnZXNpemUpIHsKQEAgLTI0MjMsNyArMjQyNiwxMCBAQAogCiAJY2hpcC0+YmJ0X2VyYXNlX3NoaWZ0ID0gY2hpcC0+cGh5c19lcmFzZV9zaGlmdCA9CiAJCWZmcyhtdGQtPmVyYXNlc2l6ZSkgLSAxOwotCWNoaXAtPmNoaXBfc2hpZnQgPSBmZnMoY2hpcC0+Y2hpcHNpemUpIC0gMTsKKwlpZiAoY2hpcC0+Y2hpcHNpemUgJiAweGZmZmZmZmZmKQorCQljaGlwLT5jaGlwX3NoaWZ0ID0gZmZzKCh1bnNpZ25lZCljaGlwLT5jaGlwc2l6ZSkgLSAxOworCWVsc2UKKwkJY2hpcC0+Y2hpcF9zaGlmdCA9IGZmcygodW5zaWduZWQpKGNoaXAtPmNoaXBzaXplID4+IDMyKSkgKyAzMiAtIDE7CiAKIAkvKiBTZXQgdGhlIGJhZCBibG9jayBwb3NpdGlvbiAqLwogCWNoaXAtPmJhZGJsb2NrcG9zID0gbXRkLT53cml0ZXNpemUgPiA1MTIgPwpAQCAtMjUxNyw3ICsyNTIzLDYgQEAKIC8qKgogICogbmFuZF9zY2FuX3RhaWwgLSBbTkFORCBJbnRlcmZhY2VdIFNjYW4gZm9yIHRoZSBOQU5EIGRldmljZQogICogQG10ZDoJICAgIE1URCBkZXZpY2Ugc3RydWN0dXJlCi0gKiBAbWF4Y2hpcHM6CSAgICBOdW1iZXIgb2YgY2hpcHMgdG8gc2NhbiBmb3IKICAqCiAgKiBUaGlzIGlzIHRoZSBzZWNvbmQgcGhhc2Ugb2YgdGhlIG5vcm1hbCBuYW5kX3NjYW4oKSBmdW5jdGlvbi4gSXQKICAqIGZpbGxzIG91dCBhbGwgdGhlIHVuaW5pdGlhbGl6ZWQgZnVuY3Rpb24gcG9pbnRlcnMgd2l0aCB0aGUgZGVmYXVsdHMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL25hbmQvbmFuZF9iYnQuYyBiL2RyaXZlcnMvbXRkL25hbmQvbmFuZF9iYnQuYwppbmRleCAwYjFjNDg1Li41NWMyM2U1IDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9uYW5kL25hbmRfYmJ0LmMKKysrIGIvZHJpdmVycy9tdGQvbmFuZC9uYW5kX2JidC5jCkBAIC0xNzEsMTYgKzE3MSwxNiBAQAogCQkJCWlmICh0bXAgPT0gbXNrKQogCQkJCQljb250aW51ZTsKIAkJCQlpZiAocmVzZXJ2ZWRfYmxvY2tfY29kZSAmJiAodG1wID09IHJlc2VydmVkX2Jsb2NrX2NvZGUpKSB7Ci0JCQkJCXByaW50ayhLRVJOX0RFQlVHICJuYW5kX3JlYWRfYmJ0OiBSZXNlcnZlZCBibG9jayBhdCAweCUwOHhcbiIsCi0JCQkJCSAgICAgICAoKG9mZnMgPDwgMikgKyAoYWN0ID4+IDEpKSA8PCB0aGlzLT5iYnRfZXJhc2Vfc2hpZnQpOworCQkJCQlwcmludGsoS0VSTl9ERUJVRyAibmFuZF9yZWFkX2JidDogUmVzZXJ2ZWQgYmxvY2sgYXQgMHglMDEybGx4XG4iLAorCQkJCQkgICAgICAgKGxvZmZfdCkoKG9mZnMgPDwgMikgKyAoYWN0ID4+IDEpKSA8PCB0aGlzLT5iYnRfZXJhc2Vfc2hpZnQpOwogCQkJCQl0aGlzLT5iYnRbb2ZmcyArIChhY3QgPj4gMyldIHw9IDB4MiA8PCAoYWN0ICYgMHgwNik7CiAJCQkJCW10ZC0+ZWNjX3N0YXRzLmJidGJsb2NrcysrOwogCQkJCQljb250aW51ZTsKIAkJCQl9CiAJCQkJLyogTGVhdmUgaXQgZm9yIG5vdywgaWYgaXRzIG1hdHVyZWQgd2UgY2FuIG1vdmUgdGhpcwogCQkJCSAqIG1lc3NhZ2UgdG8gTVREX0RFQlVHX0xFVkVMMCAqLwotCQkJCXByaW50ayhLRVJOX0RFQlVHICJuYW5kX3JlYWRfYmJ0OiBCYWQgYmxvY2sgYXQgMHglMDh4XG4iLAotCQkJCSAgICAgICAoKG9mZnMgPDwgMikgKyAoYWN0ID4+IDEpKSA8PCB0aGlzLT5iYnRfZXJhc2Vfc2hpZnQpOworCQkJCXByaW50ayhLRVJOX0RFQlVHICJuYW5kX3JlYWRfYmJ0OiBCYWQgYmxvY2sgYXQgMHglMDEybGx4XG4iLAorCQkJCSAgICAgICAobG9mZl90KSgob2ZmcyA8PCAyKSArIChhY3QgPj4gMSkpIDw8IHRoaXMtPmJidF9lcmFzZV9zaGlmdCk7CiAJCQkJLyogRmFjdG9yeSBtYXJrZWQgYmFkIG9yIHdvcm4gb3V0ID8gKi8KIAkJCQlpZiAodG1wID09IDApCiAJCQkJCXRoaXMtPmJidFtvZmZzICsgKGFjdCA+PiAzKV0gfD0gMHgzIDw8IChhY3QgJiAweDA2KTsKQEAgLTI4NCw3ICsyODQsNyBAQAogCiAJLyogUmVhZCB0aGUgcHJpbWFyeSB2ZXJzaW9uLCBpZiBhdmFpbGFibGUgKi8KIAlpZiAodGQtPm9wdGlvbnMgJiBOQU5EX0JCVF9WRVJTSU9OKSB7Ci0JCXNjYW5fcmVhZF9yYXcobXRkLCBidWYsIHRkLT5wYWdlc1swXSA8PCB0aGlzLT5wYWdlX3NoaWZ0LAorCQlzY2FuX3JlYWRfcmF3KG10ZCwgYnVmLCAobG9mZl90KXRkLT5wYWdlc1swXSA8PCB0aGlzLT5wYWdlX3NoaWZ0LAogCQkJICAgICAgbXRkLT53cml0ZXNpemUpOwogCQl0ZC0+dmVyc2lvblswXSA9IGJ1ZlttdGQtPndyaXRlc2l6ZSArIHRkLT52ZXJvZmZzXTsKIAkJcHJpbnRrKEtFUk5fREVCVUcgIkJhZCBibG9jayB0YWJsZSBhdCBwYWdlICVkLCB2ZXJzaW9uIDB4JTAyWFxuIiwKQEAgLTI5Myw3ICsyOTMsNyBAQAogCiAJLyogUmVhZCB0aGUgbWlycm9yIHZlcnNpb24sIGlmIGF2YWlsYWJsZSAqLwogCWlmIChtZCAmJiAobWQtPm9wdGlvbnMgJiBOQU5EX0JCVF9WRVJTSU9OKSkgewotCQlzY2FuX3JlYWRfcmF3KG10ZCwgYnVmLCBtZC0+cGFnZXNbMF0gPDwgdGhpcy0+cGFnZV9zaGlmdCwKKwkJc2Nhbl9yZWFkX3JhdyhtdGQsIGJ1ZiwgKGxvZmZfdCltZC0+cGFnZXNbMF0gPDwgdGhpcy0+cGFnZV9zaGlmdCwKIAkJCSAgICAgIG10ZC0+d3JpdGVzaXplKTsKIAkJbWQtPnZlcnNpb25bMF0gPSBidWZbbXRkLT53cml0ZXNpemUgKyBtZC0+dmVyb2Zmc107CiAJCXByaW50ayhLRVJOX0RFQlVHICJCYWQgYmxvY2sgdGFibGUgYXQgcGFnZSAlZCwgdmVyc2lvbiAweCUwMlhcbiIsCkBAIC00MTEsNyArNDExLDcgQEAKIAkJbnVtYmxvY2tzID0gdGhpcy0+Y2hpcHNpemUgPj4gKHRoaXMtPmJidF9lcmFzZV9zaGlmdCAtIDEpOwogCQlzdGFydGJsb2NrID0gY2hpcCAqIG51bWJsb2NrczsKIAkJbnVtYmxvY2tzICs9IHN0YXJ0YmxvY2s7Ci0JCWZyb20gPSBzdGFydGJsb2NrIDw8ICh0aGlzLT5iYnRfZXJhc2Vfc2hpZnQgLSAxKTsKKwkJZnJvbSA9IChsb2ZmX3Qpc3RhcnRibG9jayA8PCAodGhpcy0+YmJ0X2VyYXNlX3NoaWZ0IC0gMSk7CiAJfQogCiAJZm9yIChpID0gc3RhcnRibG9jazsgaSA8IG51bWJsb2NrczspIHsKQEAgLTQyOCw4ICs0MjgsOCBAQAogCiAJCWlmIChyZXQpIHsKIAkJCXRoaXMtPmJidFtpID4+IDNdIHw9IDB4MDMgPDwgKGkgJiAweDYpOwotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiQmFkIGVyYXNlYmxvY2sgJWQgYXQgMHglMDh4XG4iLAotCQkJICAgICAgIGkgPj4gMSwgKHVuc2lnbmVkIGludClmcm9tKTsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIkJhZCBlcmFzZWJsb2NrICVkIGF0IDB4JTAxMmxseFxuIiwKKwkJCSAgICAgICBpID4+IDEsICh1bnNpZ25lZCBsb25nIGxvbmcpZnJvbSk7CiAJCQltdGQtPmVjY19zdGF0cy5iYWRibG9ja3MrKzsKIAkJfQogCkBAIC00OTUsNyArNDk1LDcgQEAKIAkJZm9yIChibG9jayA9IDA7IGJsb2NrIDwgdGQtPm1heGJsb2NrczsgYmxvY2srKykgewogCiAJCQlpbnQgYWN0YmxvY2sgPSBzdGFydGJsb2NrICsgZGlyICogYmxvY2s7Ci0JCQlsb2ZmX3Qgb2ZmcyA9IGFjdGJsb2NrIDw8IHRoaXMtPmJidF9lcmFzZV9zaGlmdDsKKwkJCWxvZmZfdCBvZmZzID0gKGxvZmZfdClhY3RibG9jayA8PCB0aGlzLT5iYnRfZXJhc2Vfc2hpZnQ7CiAKIAkJCS8qIFJlYWQgZmlyc3QgcGFnZSAqLwogCQkJc2Nhbl9yZWFkX3JhdyhtdGQsIGJ1Ziwgb2ZmcywgbXRkLT53cml0ZXNpemUpOwpAQCAtNzE5LDcgKzcxOSw3IEBACiAKIAkJbWVtc2V0KCZlaW5mbywgMCwgc2l6ZW9mKGVpbmZvKSk7CiAJCWVpbmZvLm10ZCA9IG10ZDsKLQkJZWluZm8uYWRkciA9ICh1bnNpZ25lZCBsb25nKXRvOworCQllaW5mby5hZGRyID0gdG87CiAJCWVpbmZvLmxlbiA9IDEgPDwgdGhpcy0+YmJ0X2VyYXNlX3NoaWZ0OwogCQlyZXMgPSBuYW5kX2VyYXNlX25hbmQobXRkLCAmZWluZm8sIDEpOwogCQlpZiAocmVzIDwgMCkKQEAgLTcyOSw4ICs3MjksOCBAQAogCQlpZiAocmVzIDwgMCkKIAkJCWdvdG8gb3V0ZXJyOwogCi0JCXByaW50ayhLRVJOX0RFQlVHICJCYWQgYmxvY2sgdGFibGUgd3JpdHRlbiB0byAweCUwOHgsIHZlcnNpb24gIgotCQkgICAgICAgIjB4JTAyWFxuIiwgKHVuc2lnbmVkIGludCl0bywgdGQtPnZlcnNpb25bY2hpcF0pOworCQlwcmludGsoS0VSTl9ERUJVRyAiQmFkIGJsb2NrIHRhYmxlIHdyaXR0ZW4gdG8gMHglMDEybGx4LCB2ZXJzaW9uICIKKwkJICAgICAgICIweCUwMlhcbiIsICh1bnNpZ25lZCBsb25nIGxvbmcpdG8sIHRkLT52ZXJzaW9uW2NoaXBdKTsKIAogCQkvKiBNYXJrIGl0IGFzIHVzZWQgKi8KIAkJdGQtPnBhZ2VzW2NoaXBdID0gcGFnZTsKQEAgLTkxMCw3ICs5MTAsNyBAQAogCQkJbmV3dmFsID0gb2xkdmFsIHwgKDB4MiA8PCAoYmxvY2sgJiAweDA2KSk7CiAJCQl0aGlzLT5iYnRbKGJsb2NrID4+IDMpXSA9IG5ld3ZhbDsKIAkJCWlmICgob2xkdmFsICE9IG5ld3ZhbCkgJiYgdGQtPnJlc2VydmVkX2Jsb2NrX2NvZGUpCi0JCQkJbmFuZF91cGRhdGVfYmJ0KG10ZCwgYmxvY2sgPDwgKHRoaXMtPmJidF9lcmFzZV9zaGlmdCAtIDEpKTsKKwkJCQluYW5kX3VwZGF0ZV9iYnQobXRkLCAobG9mZl90KWJsb2NrIDw8ICh0aGlzLT5iYnRfZXJhc2Vfc2hpZnQgLSAxKSk7CiAJCQljb250aW51ZTsKIAkJfQogCQl1cGRhdGUgPSAwOwpAQCAtOTMxLDcgKzkzMSw3IEBACiAJCSAgIG5ldyBvbmVzIGhhdmUgYmVlbiBtYXJrZWQsIHRoZW4gd2UgbmVlZCB0byB1cGRhdGUgdGhlIHN0b3JlZAogCQkgICBiYnRzLiAgVGhpcyBzaG91bGQgb25seSBoYXBwZW4gb25jZS4gKi8KIAkJaWYgKHVwZGF0ZSAmJiB0ZC0+cmVzZXJ2ZWRfYmxvY2tfY29kZSkKLQkJCW5hbmRfdXBkYXRlX2JidChtdGQsIChibG9jayAtIDIpIDw8ICh0aGlzLT5iYnRfZXJhc2Vfc2hpZnQgLSAxKSk7CisJCQluYW5kX3VwZGF0ZV9iYnQobXRkLCAobG9mZl90KShibG9jayAtIDIpIDw8ICh0aGlzLT5iYnRfZXJhc2Vfc2hpZnQgLSAxKSk7CiAJfQogfQogCkBAIC0xMDI3LDcgKzEwMjcsNiBAQAogCWlmICghdGhpcy0+YmJ0IHx8ICF0ZCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlsZW4gPSBtdGQtPnNpemUgPj4gKHRoaXMtPmJidF9lcmFzZV9zaGlmdCArIDIpOwogCS8qIEFsbG9jYXRlIGEgdGVtcG9yYXJ5IGJ1ZmZlciBmb3Igb25lIGVyYXNlYmxvY2sgaW5jbC4gb29iICovCiAJbGVuID0gKDEgPDwgdGhpcy0+YmJ0X2VyYXNlX3NoaWZ0KTsKIAlsZW4gKz0gKGxlbiA+PiB0aGlzLT5wYWdlX3NoaWZ0KSAqIG10ZC0+b29ic2l6ZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL25hbmQvbmFuZHNpbS5jIGIvZHJpdmVycy9tdGQvbmFuZC9uYW5kc2ltLmMKaW5kZXggYWU3YzU3Ny4uY2QwNzExYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbmFuZC9uYW5kc2ltLmMKKysrIGIvZHJpdmVycy9tdGQvbmFuZC9uYW5kc2ltLmMKQEAgLTM4LDYgKzM4LDkgQEAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgogCiAvKiBEZWZhdWx0IHNpbXVsYXRvciBwYXJhbWV0ZXJzIHZhbHVlcyAqLwogI2lmICFkZWZpbmVkKENPTkZJR19OQU5EU0lNX0ZJUlNUX0lEX0JZVEUpICB8fCBcCkBAIC0xMDAsNiArMTAzLDcgQEAKIHN0YXRpYyBjaGFyICpncmF2ZXBhZ2VzID0gTlVMTDsKIHN0YXRpYyB1bnNpZ25lZCBpbnQgcnB0d2VhciA9IDA7CiBzdGF0aWMgdW5zaWduZWQgaW50IG92ZXJyaWRlc2l6ZSA9IDA7CitzdGF0aWMgY2hhciAqY2FjaGVfZmlsZSA9IE5VTEw7CiAKIG1vZHVsZV9wYXJhbShmaXJzdF9pZF9ieXRlLCAgdWludCwgMDQwMCk7CiBtb2R1bGVfcGFyYW0oc2Vjb25kX2lkX2J5dGUsIHVpbnQsIDA0MDApOwpAQCAtMTIyLDEyICsxMjYsMTMgQEAKIG1vZHVsZV9wYXJhbShncmF2ZXBhZ2VzLCAgICAgY2hhcnAsIDA0MDApOwogbW9kdWxlX3BhcmFtKHJwdHdlYXIsICAgICAgICB1aW50LCAwNDAwKTsKIG1vZHVsZV9wYXJhbShvdmVycmlkZXNpemUsICAgdWludCwgMDQwMCk7Cittb2R1bGVfcGFyYW0oY2FjaGVfZmlsZSwgICAgIGNoYXJwLCAwNDAwKTsKIAogTU9EVUxFX1BBUk1fREVTQyhmaXJzdF9pZF9ieXRlLCAgIlRoZSBmaXJzdCBieXRlIHJldHVybmVkIGJ5IE5BTkQgRmxhc2ggJ3JlYWQgSUQnIGNvbW1hbmQgKG1hbnVmYWN0dXJlciBJRCkiKTsKIE1PRFVMRV9QQVJNX0RFU0Moc2Vjb25kX2lkX2J5dGUsICJUaGUgc2Vjb25kIGJ5dGUgcmV0dXJuZWQgYnkgTkFORCBGbGFzaCAncmVhZCBJRCcgY29tbWFuZCAoY2hpcCBJRCkiKTsKIE1PRFVMRV9QQVJNX0RFU0ModGhpcmRfaWRfYnl0ZSwgICJUaGUgdGhpcmQgYnl0ZSByZXR1cm5lZCBieSBOQU5EIEZsYXNoICdyZWFkIElEJyBjb21tYW5kIik7CiBNT0RVTEVfUEFSTV9ERVNDKGZvdXJ0aF9pZF9ieXRlLCAiVGhlIGZvdXJ0aCBieXRlIHJldHVybmVkIGJ5IE5BTkQgRmxhc2ggJ3JlYWQgSUQnIGNvbW1hbmQiKTsKLU1PRFVMRV9QQVJNX0RFU0MoYWNjZXNzX2RlbGF5LCAgICJJbml0aWFsIHBhZ2UgYWNjZXNzIGRlbGF5IChtaWNyb2lzZWNvbmRzKSIpOworTU9EVUxFX1BBUk1fREVTQyhhY2Nlc3NfZGVsYXksICAgIkluaXRpYWwgcGFnZSBhY2Nlc3MgZGVsYXkgKG1pY3Jvc2Vjb25kcykiKTsKIE1PRFVMRV9QQVJNX0RFU0MocHJvZ3JhbW1fZGVsYXksICJQYWdlIHByb2dyYW1tIGRlbGF5IChtaWNyb3NlY29uZHMiKTsKIE1PRFVMRV9QQVJNX0RFU0MoZXJhc2VfZGVsYXksICAgICJTZWN0b3IgZXJhc2UgZGVsYXkgKG1pbGxpc2Vjb25kcykiKTsKIE1PRFVMRV9QQVJNX0RFU0Mob3V0cHV0X2N5Y2xlLCAgICJXb3JkIG91dHB1dCAoZnJvbSBmbGFzaCkgdGltZSAobmFub2RlY29uZHMpIik7CkBAIC0xNTMsNiArMTU4LDcgQEAKIE1PRFVMRV9QQVJNX0RFU0Mob3ZlcnJpZGVzaXplLCAgICJTcGVjaWZpZXMgdGhlIE5BTkQgRmxhc2ggc2l6ZSBvdmVycmlkaW5nIHRoZSBJRCBieXRlcy4gIgogCQkJCSAiVGhlIHNpemUgaXMgc3BlY2lmaWVkIGluIGVyYXNlIGJsb2NrcyBhbmQgYXMgdGhlIGV4cG9uZW50IG9mIGEgcG93ZXIgb2YgdHdvIgogCQkJCSAiIGUuZy4gNSBtZWFucyBhIHNpemUgb2YgMzIgZXJhc2UgYmxvY2tzIik7CitNT0RVTEVfUEFSTV9ERVNDKGNhY2hlX2ZpbGUsICAgICAiRmlsZSB0byB1c2UgdG8gY2FjaGUgbmFuZCBwYWdlcyBpbnN0ZWFkIG9mIG1lbW9yeSIpOwogCiAvKiBUaGUgbGFyZ2VzdCBwb3NzaWJsZSBwYWdlIHNpemUgKi8KICNkZWZpbmUgTlNfTEFSR0VTVF9QQUdFX1NJWkUJMjA0OApAQCAtMjY2LDYgKzI3Miw5IEBACiAgKi8KICNkZWZpbmUgTlNfTUFYX1BSRVZTVEFURVMgMQogCisvKiBNYXhpbXVtIHBhZ2UgY2FjaGUgcGFnZXMgbmVlZGVkIHRvIHJlYWQgb3Igd3JpdGUgYSBOQU5EIHBhZ2UgdG8gdGhlIGNhY2hlX2ZpbGUgKi8KKyNkZWZpbmUgTlNfTUFYX0hFTERfUEFHRVMgMTYKKwogLyoKICAqIEEgdW5pb24gdG8gcmVwcmVzZW50IGZsYXNoIG1lbW9yeSBjb250ZW50cyBhbmQgZmxhc2ggYnVmZmVyLgogICovCkBAIC0yOTUsNiArMzA0LDkgQEAKIAkvKiBUaGUgc2ltdWxhdGVkIE5BTkQgZmxhc2ggcGFnZXMgYXJyYXkgKi8KIAl1bmlvbiBuc19tZW0gKnBhZ2VzOwogCisJLyogU2xhYiBhbGxvY2F0b3IgZm9yIG5hbmQgcGFnZXMgKi8KKwlzdHJ1Y3Qga21lbV9jYWNoZSAqbmFuZF9wYWdlc19zbGFiOworCiAJLyogSW50ZXJuYWwgYnVmZmVyIG9mIHBhZ2UgKyBPT0Igc2l6ZSBieXRlcyAqLwogCXVuaW9uIG5zX21lbSBidWY7CiAKQEAgLTMzNSw2ICszNDcsMTMgQEAKICAgICAgICAgICAgICAgICBpbnQgYWxlOyAvKiBhZGRyZXNzIExhdGNoIEVuYWJsZSAqLwogICAgICAgICAgICAgICAgIGludCB3cDsgIC8qIHdyaXRlIFByb3RlY3QgKi8KICAgICAgICAgfSBsaW5lczsKKworCS8qIEZpZWxkcyBuZWVkZWQgd2hlbiB1c2luZyBhIGNhY2hlIGZpbGUgKi8KKwlzdHJ1Y3QgZmlsZSAqY2ZpbGU7IC8qIE9wZW4gZmlsZSAqLworCXVuc2lnbmVkIGNoYXIgKnBhZ2VzX3dyaXR0ZW47IC8qIFdoaWNoIHBhZ2VzIGhhdmUgYmVlbiB3cml0dGVuICovCisJdm9pZCAqZmlsZV9idWY7CisJc3RydWN0IHBhZ2UgKmhlbGRfcGFnZXNbTlNfTUFYX0hFTERfUEFHRVNdOworCWludCBoZWxkX2NudDsKIH07CiAKIC8qCkBAIC00MjAsMjUgKzQzOSw2OSBAQAogc3RhdGljIHVfY2hhciBuc192ZXJpZnlfYnVmW05TX0xBUkdFU1RfUEFHRV9TSVpFXTsKIAogLyoKLSAqIEFsbG9jYXRlIGFycmF5IG9mIHBhZ2UgcG9pbnRlcnMgYW5kIGluaXRpYWxpemUgdGhlIGFycmF5IHRvIE5VTEwKLSAqIHBvaW50ZXJzLgorICogQWxsb2NhdGUgYXJyYXkgb2YgcGFnZSBwb2ludGVycywgY3JlYXRlIHNsYWIgYWxsb2NhdGlvbiBmb3IgYW4gYXJyYXkKKyAqIGFuZCBpbml0aWFsaXplIHRoZSBhcnJheSBieSBOVUxMIHBvaW50ZXJzLgogICoKICAqIFJFVFVSTlM6IDAgaWYgc3VjY2VzcywgLUVOT01FTSBpZiBtZW1vcnkgYWxsb2MgZmFpbHMuCiAgKi8KIHN0YXRpYyBpbnQgYWxsb2NfZGV2aWNlKHN0cnVjdCBuYW5kc2ltICpucykKIHsKLQlpbnQgaTsKKwlzdHJ1Y3QgZmlsZSAqY2ZpbGU7CisJaW50IGksIGVycjsKKworCWlmIChjYWNoZV9maWxlKSB7CisJCWNmaWxlID0gZmlscF9vcGVuKGNhY2hlX2ZpbGUsIE9fQ1JFQVQgfCBPX1JEV1IgfCBPX0xBUkdFRklMRSwgMDYwMCk7CisJCWlmIChJU19FUlIoY2ZpbGUpKQorCQkJcmV0dXJuIFBUUl9FUlIoY2ZpbGUpOworCQlpZiAoIWNmaWxlLT5mX29wIHx8ICghY2ZpbGUtPmZfb3AtPnJlYWQgJiYgIWNmaWxlLT5mX29wLT5haW9fcmVhZCkpIHsKKwkJCU5TX0VSUigiYWxsb2NfZGV2aWNlOiBjYWNoZSBmaWxlIG5vdCByZWFkYWJsZVxuIik7CisJCQllcnIgPSAtRUlOVkFMOworCQkJZ290byBlcnJfY2xvc2U7CisJCX0KKwkJaWYgKCFjZmlsZS0+Zl9vcC0+d3JpdGUgJiYgIWNmaWxlLT5mX29wLT5haW9fd3JpdGUpIHsKKwkJCU5TX0VSUigiYWxsb2NfZGV2aWNlOiBjYWNoZSBmaWxlIG5vdCB3cml0ZWFibGVcbiIpOworCQkJZXJyID0gLUVJTlZBTDsKKwkJCWdvdG8gZXJyX2Nsb3NlOworCQl9CisJCW5zLT5wYWdlc193cml0dGVuID0gdm1hbGxvYyhucy0+Z2VvbS5wZ251bSk7CisJCWlmICghbnMtPnBhZ2VzX3dyaXR0ZW4pIHsKKwkJCU5TX0VSUigiYWxsb2NfZGV2aWNlOiB1bmFibGUgdG8gYWxsb2NhdGUgcGFnZXMgd3JpdHRlbiBhcnJheVxuIik7CisJCQllcnIgPSAtRU5PTUVNOworCQkJZ290byBlcnJfY2xvc2U7CisJCX0KKwkJbnMtPmZpbGVfYnVmID0ga21hbGxvYyhucy0+Z2VvbS5wZ3N6b29iLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFucy0+ZmlsZV9idWYpIHsKKwkJCU5TX0VSUigiYWxsb2NfZGV2aWNlOiB1bmFibGUgdG8gYWxsb2NhdGUgZmlsZSBidWZcbiIpOworCQkJZXJyID0gLUVOT01FTTsKKwkJCWdvdG8gZXJyX2ZyZWU7CisJCX0KKwkJbnMtPmNmaWxlID0gY2ZpbGU7CisJCW1lbXNldChucy0+cGFnZXNfd3JpdHRlbiwgMCwgbnMtPmdlb20ucGdudW0pOworCQlyZXR1cm4gMDsKKwl9CiAKIAlucy0+cGFnZXMgPSB2bWFsbG9jKG5zLT5nZW9tLnBnbnVtICogc2l6ZW9mKHVuaW9uIG5zX21lbSkpOwogCWlmICghbnMtPnBhZ2VzKSB7Ci0JCU5TX0VSUigiYWxsb2NfbWFwOiB1bmFibGUgdG8gYWxsb2NhdGUgcGFnZSBhcnJheVxuIik7CisJCU5TX0VSUigiYWxsb2NfZGV2aWNlOiB1bmFibGUgdG8gYWxsb2NhdGUgcGFnZSBhcnJheVxuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAlmb3IgKGkgPSAwOyBpIDwgbnMtPmdlb20ucGdudW07IGkrKykgewogCQlucy0+cGFnZXNbaV0uYnl0ZSA9IE5VTEw7CiAJfQorCW5zLT5uYW5kX3BhZ2VzX3NsYWIgPSBrbWVtX2NhY2hlX2NyZWF0ZSgibmFuZHNpbSIsCisJCQkJCQlucy0+Z2VvbS5wZ3N6b29iLCAwLCAwLCBOVUxMKTsKKwlpZiAoIW5zLT5uYW5kX3BhZ2VzX3NsYWIpIHsKKwkJTlNfRVJSKCJjYWNoZV9jcmVhdGU6IHVuYWJsZSB0byBjcmVhdGUga21lbV9jYWNoZVxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KIAogCXJldHVybiAwOworCitlcnJfZnJlZToKKwl2ZnJlZShucy0+cGFnZXNfd3JpdHRlbik7CitlcnJfY2xvc2U6CisJZmlscF9jbG9zZShjZmlsZSwgTlVMTCk7CisJcmV0dXJuIGVycjsKIH0KIAogLyoKQEAgLTQ0OCwxMSArNTExLDIwIEBACiB7CiAJaW50IGk7CiAKKwlpZiAobnMtPmNmaWxlKSB7CisJCWtmcmVlKG5zLT5maWxlX2J1Zik7CisJCXZmcmVlKG5zLT5wYWdlc193cml0dGVuKTsKKwkJZmlscF9jbG9zZShucy0+Y2ZpbGUsIE5VTEwpOworCQlyZXR1cm47CisJfQorCiAJaWYgKG5zLT5wYWdlcykgewogCQlmb3IgKGkgPSAwOyBpIDwgbnMtPmdlb20ucGdudW07IGkrKykgewogCQkJaWYgKG5zLT5wYWdlc1tpXS5ieXRlKQotCQkJCWtmcmVlKG5zLT5wYWdlc1tpXS5ieXRlKTsKKwkJCQlrbWVtX2NhY2hlX2ZyZWUobnMtPm5hbmRfcGFnZXNfc2xhYiwKKwkJCQkJCW5zLT5wYWdlc1tpXS5ieXRlKTsKIAkJfQorCQlrbWVtX2NhY2hlX2Rlc3Ryb3kobnMtPm5hbmRfcGFnZXNfc2xhYik7CiAJCXZmcmVlKG5zLT5wYWdlcyk7CiAJfQogfQpAQCAtNDY0LDcgKzUzNiw3IEBACiAJcmV0dXJuIGtzdHJkdXAoYnVmLCBHRlBfS0VSTkVMKTsKIH0KIAotc3RhdGljIHVfaW50NjRfdCBkaXZpZGUodV9pbnQ2NF90IG4sIHVfaW50MzJfdCBkKQorc3RhdGljIHVpbnQ2NF90IGRpdmlkZSh1aW50NjRfdCBuLCB1aW50MzJfdCBkKQogewogCWRvX2RpdihuLCBkKTsKIAlyZXR1cm4gbjsKQEAgLTQ4MCw4ICs1NTIsOCBAQAogCXN0cnVjdCBuYW5kX2NoaXAgKmNoaXAgPSAoc3RydWN0IG5hbmRfY2hpcCAqKW10ZC0+cHJpdjsKIAlzdHJ1Y3QgbmFuZHNpbSAgICpucyAgID0gKHN0cnVjdCBuYW5kc2ltICopKGNoaXAtPnByaXYpOwogCWludCBpLCByZXQgPSAwOwotCXVfaW50NjRfdCByZW1haW5zOwotCXVfaW50NjRfdCBuZXh0X29mZnNldDsKKwl1aW50NjRfdCByZW1haW5zOworCXVpbnQ2NF90IG5leHRfb2Zmc2V0OwogCiAJaWYgKE5TX0lTX0lOSVRJQUxJWkVEKG5zKSkgewogCQlOU19FUlIoImluaXRfbmFuZHNpbTogbmFuZHNpbSBpcyBhbHJlYWR5IGluaXRpYWxpemVkXG4iKTsKQEAgLTU0OCw3ICs2MjAsNyBAQAogCXJlbWFpbnMgPSBucy0+Z2VvbS50b3RzejsKIAluZXh0X29mZnNldCA9IDA7CiAJZm9yIChpID0gMDsgaSA8IHBhcnRzX251bTsgKytpKSB7Ci0JCXVfaW50NjRfdCBwYXJ0X3N6ID0gKHVfaW50NjRfdClwYXJ0c1tpXSAqIG5zLT5nZW9tLnNlY3N6OworCQl1aW50NjRfdCBwYXJ0X3N6ID0gKHVpbnQ2NF90KXBhcnRzW2ldICogbnMtPmdlb20uc2Vjc3o7CiAKIAkJaWYgKCFwYXJ0X3N6IHx8IHBhcnRfc3ogPiByZW1haW5zKSB7CiAJCQlOU19FUlIoImJhZCBwYXJ0aXRpb24gc2l6ZS5cbiIpOwpAQCAtMTIxMSw2ICsxMjgzLDk3IEBACiAJcmV0dXJuIC0xOwogfQogCitzdGF0aWMgdm9pZCBwdXRfcGFnZXMoc3RydWN0IG5hbmRzaW0gKm5zKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IG5zLT5oZWxkX2NudDsgaSsrKQorCQlwYWdlX2NhY2hlX3JlbGVhc2UobnMtPmhlbGRfcGFnZXNbaV0pOworfQorCisvKiBHZXQgcGFnZSBjYWNoZSBwYWdlcyBpbiBhZHZhbmNlIHRvIHByb3ZpZGUgTk9GUyBtZW1vcnkgYWxsb2NhdGlvbiAqLworc3RhdGljIGludCBnZXRfcGFnZXMoc3RydWN0IG5hbmRzaW0gKm5zLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgcG9zKQoreworCXBnb2ZmX3QgaW5kZXgsIHN0YXJ0X2luZGV4LCBlbmRfaW5kZXg7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBmaWxlLT5mX21hcHBpbmc7CisKKwlzdGFydF9pbmRleCA9IHBvcyA+PiBQQUdFX0NBQ0hFX1NISUZUOworCWVuZF9pbmRleCA9IChwb3MgKyBjb3VudCAtIDEpID4+IFBBR0VfQ0FDSEVfU0hJRlQ7CisJaWYgKGVuZF9pbmRleCAtIHN0YXJ0X2luZGV4ICsgMSA+IE5TX01BWF9IRUxEX1BBR0VTKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlucy0+aGVsZF9jbnQgPSAwOworCWZvciAoaW5kZXggPSBzdGFydF9pbmRleDsgaW5kZXggPD0gZW5kX2luZGV4OyBpbmRleCsrKSB7CisJCXBhZ2UgPSBmaW5kX2dldF9wYWdlKG1hcHBpbmcsIGluZGV4KTsKKwkJaWYgKHBhZ2UgPT0gTlVMTCkgeworCQkJcGFnZSA9IGZpbmRfb3JfY3JlYXRlX3BhZ2UobWFwcGluZywgaW5kZXgsIEdGUF9OT0ZTKTsKKwkJCWlmIChwYWdlID09IE5VTEwpIHsKKwkJCQl3cml0ZV9pbm9kZV9ub3cobWFwcGluZy0+aG9zdCwgMSk7CisJCQkJcGFnZSA9IGZpbmRfb3JfY3JlYXRlX3BhZ2UobWFwcGluZywgaW5kZXgsIEdGUF9OT0ZTKTsKKwkJCX0KKwkJCWlmIChwYWdlID09IE5VTEwpIHsKKwkJCQlwdXRfcGFnZXMobnMpOworCQkJCXJldHVybiAtRU5PTUVNOworCQkJfQorCQkJdW5sb2NrX3BhZ2UocGFnZSk7CisJCX0KKwkJbnMtPmhlbGRfcGFnZXNbbnMtPmhlbGRfY250KytdID0gcGFnZTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2V0X21lbWFsbG9jKHZvaWQpCit7CisJaWYgKGN1cnJlbnQtPmZsYWdzICYgUEZfTUVNQUxMT0MpCisJCXJldHVybiAwOworCWN1cnJlbnQtPmZsYWdzIHw9IFBGX01FTUFMTE9DOworCXJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCBjbGVhcl9tZW1hbGxvYyhpbnQgbWVtYWxsb2MpCit7CisJaWYgKG1lbWFsbG9jKQorCQljdXJyZW50LT5mbGFncyAmPSB+UEZfTUVNQUxMT0M7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHJlYWRfZmlsZShzdHJ1Y3QgbmFuZHNpbSAqbnMsIHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpidWYsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwb3MpCit7CisJbW1fc2VnbWVudF90IG9sZF9mczsKKwlzc2l6ZV90IHR4OworCWludCBlcnIsIG1lbWFsbG9jOworCisJZXJyID0gZ2V0X3BhZ2VzKG5zLCBmaWxlLCBjb3VudCwgKnBvcyk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKwlvbGRfZnMgPSBnZXRfZnMoKTsKKwlzZXRfZnMoZ2V0X2RzKCkpOworCW1lbWFsbG9jID0gc2V0X21lbWFsbG9jKCk7CisJdHggPSB2ZnNfcmVhZChmaWxlLCAoY2hhciBfX3VzZXIgKilidWYsIGNvdW50LCBwb3MpOworCWNsZWFyX21lbWFsbG9jKG1lbWFsbG9jKTsKKwlzZXRfZnMob2xkX2ZzKTsKKwlwdXRfcGFnZXMobnMpOworCXJldHVybiB0eDsKK30KKworc3RhdGljIHNzaXplX3Qgd3JpdGVfZmlsZShzdHJ1Y3QgbmFuZHNpbSAqbnMsIHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpidWYsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwb3MpCit7CisJbW1fc2VnbWVudF90IG9sZF9mczsKKwlzc2l6ZV90IHR4OworCWludCBlcnIsIG1lbWFsbG9jOworCisJZXJyID0gZ2V0X3BhZ2VzKG5zLCBmaWxlLCBjb3VudCwgKnBvcyk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKwlvbGRfZnMgPSBnZXRfZnMoKTsKKwlzZXRfZnMoZ2V0X2RzKCkpOworCW1lbWFsbG9jID0gc2V0X21lbWFsbG9jKCk7CisJdHggPSB2ZnNfd3JpdGUoZmlsZSwgKGNoYXIgX191c2VyICopYnVmLCBjb3VudCwgcG9zKTsKKwljbGVhcl9tZW1hbGxvYyhtZW1hbGxvYyk7CisJc2V0X2ZzKG9sZF9mcyk7CisJcHV0X3BhZ2VzKG5zKTsKKwlyZXR1cm4gdHg7Cit9CisKIC8qCiAgKiBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgY3VycmVudCBwYWdlLgogICovCkBAIC0xMjI3LDYgKzEzOTAsMzggQEAKIAlyZXR1cm4gTlNfR0VUX1BBR0UobnMpLT5ieXRlICsgbnMtPnJlZ3MuY29sdW1uICsgbnMtPnJlZ3Mub2ZmOwogfQogCitpbnQgZG9fcmVhZF9lcnJvcihzdHJ1Y3QgbmFuZHNpbSAqbnMsIGludCBudW0pCit7CisJdW5zaWduZWQgaW50IHBhZ2Vfbm8gPSBucy0+cmVncy5yb3c7CisKKwlpZiAocmVhZF9lcnJvcihwYWdlX25vKSkgeworCQlpbnQgaTsKKwkJbWVtc2V0KG5zLT5idWYuYnl0ZSwgMHhGRiwgbnVtKTsKKwkJZm9yIChpID0gMDsgaSA8IG51bTsgKytpKQorCQkJbnMtPmJ1Zi5ieXRlW2ldID0gcmFuZG9tMzIoKTsKKwkJTlNfV0FSTigic2ltdWxhdGluZyByZWFkIGVycm9yIGluIHBhZ2UgJXVcbiIsIHBhZ2Vfbm8pOworCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgZG9fYml0X2ZsaXBzKHN0cnVjdCBuYW5kc2ltICpucywgaW50IG51bSkKK3sKKwlpZiAoYml0ZmxpcHMgJiYgcmFuZG9tMzIoKSA8ICgxIDw8IDIyKSkgeworCQlpbnQgZmxpcHMgPSAxOworCQlpZiAoYml0ZmxpcHMgPiAxKQorCQkJZmxpcHMgPSAocmFuZG9tMzIoKSAlIChpbnQpIGJpdGZsaXBzKSArIDE7CisJCXdoaWxlIChmbGlwcy0tKSB7CisJCQlpbnQgcG9zID0gcmFuZG9tMzIoKSAlIChudW0gKiA4KTsKKwkJCW5zLT5idWYuYnl0ZVtwb3MgLyA4XSBePSAoMSA8PCAocG9zICUgOCkpOworCQkJTlNfV0FSTigicmVhZF9wYWdlOiBmbGlwcGluZyBiaXQgJWQgaW4gcGFnZSAlZCAiCisJCQkJInJlYWRpbmcgZnJvbSAlZCBlY2M6IGNvcnJlY3RlZD0ldSBmYWlsZWQ9JXVcbiIsCisJCQkJcG9zLCBucy0+cmVncy5yb3csIG5zLT5yZWdzLmNvbHVtbiArIG5zLT5yZWdzLm9mZiwKKwkJCQluc210ZC0+ZWNjX3N0YXRzLmNvcnJlY3RlZCwgbnNtdGQtPmVjY19zdGF0cy5mYWlsZWQpOworCQl9CisJfQorfQorCiAvKgogICogRmlsbCB0aGUgTkFORCBidWZmZXIgd2l0aCBkYXRhIHJlYWQgZnJvbSB0aGUgc3BlY2lmaWVkIHBhZ2UuCiAgKi8KQEAgLTEyMzQsMzYgKzE0MjksNDAgQEAKIHsKIAl1bmlvbiBuc19tZW0gKm15cGFnZTsKIAorCWlmIChucy0+Y2ZpbGUpIHsKKwkJaWYgKCFucy0+cGFnZXNfd3JpdHRlbltucy0+cmVncy5yb3ddKSB7CisJCQlOU19EQkcoInJlYWRfcGFnZTogcGFnZSAlZCBub3Qgd3JpdHRlblxuIiwgbnMtPnJlZ3Mucm93KTsKKwkJCW1lbXNldChucy0+YnVmLmJ5dGUsIDB4RkYsIG51bSk7CisJCX0gZWxzZSB7CisJCQlsb2ZmX3QgcG9zOworCQkJc3NpemVfdCB0eDsKKworCQkJTlNfREJHKCJyZWFkX3BhZ2U6IHBhZ2UgJWQgd3JpdHRlbiwgcmVhZGluZyBmcm9tICVkXG4iLAorCQkJCW5zLT5yZWdzLnJvdywgbnMtPnJlZ3MuY29sdW1uICsgbnMtPnJlZ3Mub2ZmKTsKKwkJCWlmIChkb19yZWFkX2Vycm9yKG5zLCBudW0pKQorCQkJCXJldHVybjsKKwkJCXBvcyA9IChsb2ZmX3QpbnMtPnJlZ3Mucm93ICogbnMtPmdlb20ucGdzem9vYiArIG5zLT5yZWdzLmNvbHVtbiArIG5zLT5yZWdzLm9mZjsKKwkJCXR4ID0gcmVhZF9maWxlKG5zLCBucy0+Y2ZpbGUsIG5zLT5idWYuYnl0ZSwgbnVtLCAmcG9zKTsKKwkJCWlmICh0eCAhPSBudW0pIHsKKwkJCQlOU19FUlIoInJlYWRfcGFnZTogcmVhZCBlcnJvciBmb3IgcGFnZSAlZCByZXQgJWxkXG4iLCBucy0+cmVncy5yb3csIChsb25nKXR4KTsKKwkJCQlyZXR1cm47CisJCQl9CisJCQlkb19iaXRfZmxpcHMobnMsIG51bSk7CisJCX0KKwkJcmV0dXJuOworCX0KKwogCW15cGFnZSA9IE5TX0dFVF9QQUdFKG5zKTsKIAlpZiAobXlwYWdlLT5ieXRlID09IE5VTEwpIHsKIAkJTlNfREJHKCJyZWFkX3BhZ2U6IHBhZ2UgJWQgbm90IGFsbG9jYXRlZFxuIiwgbnMtPnJlZ3Mucm93KTsKIAkJbWVtc2V0KG5zLT5idWYuYnl0ZSwgMHhGRiwgbnVtKTsKIAl9IGVsc2UgewotCQl1bnNpZ25lZCBpbnQgcGFnZV9ubyA9IG5zLT5yZWdzLnJvdzsKIAkJTlNfREJHKCJyZWFkX3BhZ2U6IHBhZ2UgJWQgYWxsb2NhdGVkLCByZWFkaW5nIGZyb20gJWRcbiIsCiAJCQlucy0+cmVncy5yb3csIG5zLT5yZWdzLmNvbHVtbiArIG5zLT5yZWdzLm9mZik7Ci0JCWlmIChyZWFkX2Vycm9yKHBhZ2Vfbm8pKSB7Ci0JCQlpbnQgaTsKLQkJCW1lbXNldChucy0+YnVmLmJ5dGUsIDB4RkYsIG51bSk7Ci0JCQlmb3IgKGkgPSAwOyBpIDwgbnVtOyArK2kpCi0JCQkJbnMtPmJ1Zi5ieXRlW2ldID0gcmFuZG9tMzIoKTsKLQkJCU5TX1dBUk4oInNpbXVsYXRpbmcgcmVhZCBlcnJvciBpbiBwYWdlICV1XG4iLCBwYWdlX25vKTsKKwkJaWYgKGRvX3JlYWRfZXJyb3IobnMsIG51bSkpCiAJCQlyZXR1cm47Ci0JCX0KIAkJbWVtY3B5KG5zLT5idWYuYnl0ZSwgTlNfUEFHRV9CWVRFX09GRihucyksIG51bSk7Ci0JCWlmIChiaXRmbGlwcyAmJiByYW5kb20zMigpIDwgKDEgPDwgMjIpKSB7Ci0JCQlpbnQgZmxpcHMgPSAxOwotCQkJaWYgKGJpdGZsaXBzID4gMSkKLQkJCQlmbGlwcyA9IChyYW5kb20zMigpICUgKGludCkgYml0ZmxpcHMpICsgMTsKLQkJCXdoaWxlIChmbGlwcy0tKSB7Ci0JCQkJaW50IHBvcyA9IHJhbmRvbTMyKCkgJSAobnVtICogOCk7Ci0JCQkJbnMtPmJ1Zi5ieXRlW3BvcyAvIDhdIF49ICgxIDw8IChwb3MgJSA4KSk7Ci0JCQkJTlNfV0FSTigicmVhZF9wYWdlOiBmbGlwcGluZyBiaXQgJWQgaW4gcGFnZSAlZCAiCi0JCQkJCSJyZWFkaW5nIGZyb20gJWQgZWNjOiBjb3JyZWN0ZWQ9JXUgZmFpbGVkPSV1XG4iLAotCQkJCQlwb3MsIG5zLT5yZWdzLnJvdywgbnMtPnJlZ3MuY29sdW1uICsgbnMtPnJlZ3Mub2ZmLAotCQkJCQluc210ZC0+ZWNjX3N0YXRzLmNvcnJlY3RlZCwgbnNtdGQtPmVjY19zdGF0cy5mYWlsZWQpOwotCQkJfQotCQl9CisJCWRvX2JpdF9mbGlwcyhucywgbnVtKTsKIAl9CiB9CiAKQEAgLTEyNzUsMTEgKzE0NzQsMjAgQEAKIAl1bmlvbiBuc19tZW0gKm15cGFnZTsKIAlpbnQgaTsKIAorCWlmIChucy0+Y2ZpbGUpIHsKKwkJZm9yIChpID0gMDsgaSA8IG5zLT5nZW9tLnBnc2VjOyBpKyspCisJCQlpZiAobnMtPnBhZ2VzX3dyaXR0ZW5bbnMtPnJlZ3Mucm93ICsgaV0pIHsKKwkJCQlOU19EQkcoImVyYXNlX3NlY3RvcjogZnJlZWluZyBwYWdlICVkXG4iLCBucy0+cmVncy5yb3cgKyBpKTsKKwkJCQlucy0+cGFnZXNfd3JpdHRlbltucy0+cmVncy5yb3cgKyBpXSA9IDA7CisJCQl9CisJCXJldHVybjsKKwl9CisKIAlteXBhZ2UgPSBOU19HRVRfUEFHRShucyk7CiAJZm9yIChpID0gMDsgaSA8IG5zLT5nZW9tLnBnc2VjOyBpKyspIHsKIAkJaWYgKG15cGFnZS0+Ynl0ZSAhPSBOVUxMKSB7CiAJCQlOU19EQkcoImVyYXNlX3NlY3RvcjogZnJlZWluZyBwYWdlICVkXG4iLCBucy0+cmVncy5yb3craSk7Ci0JCQlrZnJlZShteXBhZ2UtPmJ5dGUpOworCQkJa21lbV9jYWNoZV9mcmVlKG5zLT5uYW5kX3BhZ2VzX3NsYWIsIG15cGFnZS0+Ynl0ZSk7CiAJCQlteXBhZ2UtPmJ5dGUgPSBOVUxMOwogCQl9CiAJCW15cGFnZSsrOwpAQCAtMTI5NSwxNiArMTUwMyw1NyBAQAogCXVuaW9uIG5zX21lbSAqbXlwYWdlOwogCXVfY2hhciAqcGdfb2ZmOwogCisJaWYgKG5zLT5jZmlsZSkgeworCQlsb2ZmX3Qgb2ZmLCBwb3M7CisJCXNzaXplX3QgdHg7CisJCWludCBhbGw7CisKKwkJTlNfREJHKCJwcm9nX3BhZ2U6IHdyaXRpbmcgcGFnZSAlZFxuIiwgbnMtPnJlZ3Mucm93KTsKKwkJcGdfb2ZmID0gbnMtPmZpbGVfYnVmICsgbnMtPnJlZ3MuY29sdW1uICsgbnMtPnJlZ3Mub2ZmOworCQlvZmYgPSAobG9mZl90KW5zLT5yZWdzLnJvdyAqIG5zLT5nZW9tLnBnc3pvb2IgKyBucy0+cmVncy5jb2x1bW4gKyBucy0+cmVncy5vZmY7CisJCWlmICghbnMtPnBhZ2VzX3dyaXR0ZW5bbnMtPnJlZ3Mucm93XSkgeworCQkJYWxsID0gMTsKKwkJCW1lbXNldChucy0+ZmlsZV9idWYsIDB4ZmYsIG5zLT5nZW9tLnBnc3pvb2IpOworCQl9IGVsc2UgeworCQkJYWxsID0gMDsKKwkJCXBvcyA9IG9mZjsKKwkJCXR4ID0gcmVhZF9maWxlKG5zLCBucy0+Y2ZpbGUsIHBnX29mZiwgbnVtLCAmcG9zKTsKKwkJCWlmICh0eCAhPSBudW0pIHsKKwkJCQlOU19FUlIoInByb2dfcGFnZTogcmVhZCBlcnJvciBmb3IgcGFnZSAlZCByZXQgJWxkXG4iLCBucy0+cmVncy5yb3csIChsb25nKXR4KTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCX0KKwkJZm9yIChpID0gMDsgaSA8IG51bTsgaSsrKQorCQkJcGdfb2ZmW2ldICY9IG5zLT5idWYuYnl0ZVtpXTsKKwkJaWYgKGFsbCkgeworCQkJcG9zID0gKGxvZmZfdClucy0+cmVncy5yb3cgKiBucy0+Z2VvbS5wZ3N6b29iOworCQkJdHggPSB3cml0ZV9maWxlKG5zLCBucy0+Y2ZpbGUsIG5zLT5maWxlX2J1ZiwgbnMtPmdlb20ucGdzem9vYiwgJnBvcyk7CisJCQlpZiAodHggIT0gbnMtPmdlb20ucGdzem9vYikgeworCQkJCU5TX0VSUigicHJvZ19wYWdlOiB3cml0ZSBlcnJvciBmb3IgcGFnZSAlZCByZXQgJWxkXG4iLCBucy0+cmVncy5yb3csIChsb25nKXR4KTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlucy0+cGFnZXNfd3JpdHRlbltucy0+cmVncy5yb3ddID0gMTsKKwkJfSBlbHNlIHsKKwkJCXBvcyA9IG9mZjsKKwkJCXR4ID0gd3JpdGVfZmlsZShucywgbnMtPmNmaWxlLCBwZ19vZmYsIG51bSwgJnBvcyk7CisJCQlpZiAodHggIT0gbnVtKSB7CisJCQkJTlNfRVJSKCJwcm9nX3BhZ2U6IHdyaXRlIGVycm9yIGZvciBwYWdlICVkIHJldCAlbGRcbiIsIG5zLT5yZWdzLnJvdywgKGxvbmcpdHgpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gMDsKKwl9CisKIAlteXBhZ2UgPSBOU19HRVRfUEFHRShucyk7CiAJaWYgKG15cGFnZS0+Ynl0ZSA9PSBOVUxMKSB7CiAJCU5TX0RCRygicHJvZ19wYWdlOiBhbGxvY2F0aW5nIHBhZ2UgJWRcbiIsIG5zLT5yZWdzLnJvdyk7CiAJCS8qCiAJCSAqIFdlIGFsbG9jYXRlIG1lbW9yeSB3aXRoIEdGUF9OT0ZTIGJlY2F1c2UgYSBmbGFzaCBGUyBtYXkKIAkJICogdXRpbGl6ZSB0aGlzLiBJZiBpdCBpcyBob2xkaW5nIGFuIEZTIGxvY2ssIHRoZW4gZ2V0cyBoZXJlLAotCQkgKiB0aGVuIGttYWxsb2MgcnVucyB3cml0ZWJhY2sgd2hpY2ggZ29lcyB0byB0aGUgRlMgYWdhaW4KLQkJICogYW5kIGRlYWRsb2Nrcy4gVGhpcyB3YXMgc2VlbiBpbiBwcmFjdGljZS4KKwkJICogdGhlbiBrZXJuZWwgbWVtb3J5IGFsbG9jIHJ1bnMgd3JpdGViYWNrIHdoaWNoIGdvZXMgdG8gdGhlIEZTCisJCSAqIGFnYWluIGFuZCBkZWFkbG9ja3MuIFRoaXMgd2FzIHNlZW4gaW4gcHJhY3RpY2UuCiAJCSAqLwotCQlteXBhZ2UtPmJ5dGUgPSBrbWFsbG9jKG5zLT5nZW9tLnBnc3pvb2IsIEdGUF9OT0ZTKTsKKwkJbXlwYWdlLT5ieXRlID0ga21lbV9jYWNoZV9hbGxvYyhucy0+bmFuZF9wYWdlc19zbGFiLCBHRlBfTk9GUyk7CiAJCWlmIChteXBhZ2UtPmJ5dGUgPT0gTlVMTCkgewogCQkJTlNfRVJSKCJwcm9nX3BhZ2U6IGVycm9yIGFsbG9jYXRpbmcgbWVtb3J5IGZvciBwYWdlICVkXG4iLCBucy0+cmVncy5yb3cpOwogCQkJcmV0dXJuIC0xOwpAQCAtMTczNiwxMyArMTk4NSwxNyBAQAogCiAJCS8qIENoZWNrIGlmIGNoaXAgaXMgZXhwZWN0aW5nIGNvbW1hbmQgKi8KIAkJaWYgKE5TX1NUQVRFKG5zLT5ueHN0YXRlKSAhPSBTVEFURV9VTktOT1dOICYmICEobnMtPm54c3RhdGUgJiBTVEFURV9DTURfTUFTSykpIHsKLQkJCS8qCi0JCQkgKiBXZSBhcmUgaW4gc2l0dWF0aW9uIHdoZW4gc29tZXRoaW5nIGVsc2UgKG5vdCBjb21tYW5kKQotCQkJICogd2FzIGV4cGVjdGVkIGJ1dCBjb21tYW5kIHdhcyBpbnB1dC4gSW4gdGhpcyBjYXNlIGlnbm9yZQotCQkJICogcHJldmlvdXMgY29tbWFuZChzKS9zdGF0ZShzKSBhbmQgYWNjZXB0IHRoZSBsYXN0IG9uZS4KLQkJCSAqLwotCQkJTlNfV0FSTigid3JpdGVfYnl0ZTogY29tbWFuZCAoJSN4KSB3YXNuJ3QgZXhwZWN0ZWQsIGV4cGVjdGVkIHN0YXRlIGlzICVzLCAiCi0JCQkJImlnbm9yZSBwcmV2aW91cyBzdGF0ZXNcbiIsICh1aW50KWJ5dGUsIGdldF9zdGF0ZV9uYW1lKG5zLT5ueHN0YXRlKSk7CisJCQkvKiBEbyBub3Qgd2FybiBpZiBvbmx5IDIgaWQgYnl0ZXMgYXJlIHJlYWQgKi8KKwkJCWlmICghKG5zLT5yZWdzLmNvbW1hbmQgPT0gTkFORF9DTURfUkVBRElEICYmCisJCQkgICAgTlNfU1RBVEUobnMtPnN0YXRlKSA9PSBTVEFURV9EQVRBT1VUX0lEICYmIG5zLT5yZWdzLmNvdW50ID09IDIpKSB7CisJCQkJLyoKKwkJCQkgKiBXZSBhcmUgaW4gc2l0dWF0aW9uIHdoZW4gc29tZXRoaW5nIGVsc2UgKG5vdCBjb21tYW5kKQorCQkJCSAqIHdhcyBleHBlY3RlZCBidXQgY29tbWFuZCB3YXMgaW5wdXQuIEluIHRoaXMgY2FzZSBpZ25vcmUKKwkJCQkgKiBwcmV2aW91cyBjb21tYW5kKHMpL3N0YXRlKHMpIGFuZCBhY2NlcHQgdGhlIGxhc3Qgb25lLgorCQkJCSAqLworCQkJCU5TX1dBUk4oIndyaXRlX2J5dGU6IGNvbW1hbmQgKCUjeCkgd2Fzbid0IGV4cGVjdGVkLCBleHBlY3RlZCBzdGF0ZSBpcyAlcywgIgorCQkJCQkiaWdub3JlIHByZXZpb3VzIHN0YXRlc1xuIiwgKHVpbnQpYnl0ZSwgZ2V0X3N0YXRlX25hbWUobnMtPm54c3RhdGUpKTsKKwkJCX0KIAkJCXN3aXRjaF90b19yZWFkeV9zdGF0ZShucywgTlNfU1RBVFVTX0ZBSUxFRChucykpOwogCQl9CiAKQEAgLTIwNDQsNyArMjI5Nyw3IEBACiAJfQogCiAJaWYgKG92ZXJyaWRlc2l6ZSkgewotCQl1X2ludDY0X3QgbmV3X3NpemUgPSAodV9pbnQ2NF90KW5zbXRkLT5lcmFzZXNpemUgPDwgb3ZlcnJpZGVzaXplOworCQl1aW50NjRfdCBuZXdfc2l6ZSA9ICh1aW50NjRfdCluc210ZC0+ZXJhc2VzaXplIDw8IG92ZXJyaWRlc2l6ZTsKIAkJaWYgKG5ld19zaXplID4+IG92ZXJyaWRlc2l6ZSAhPSBuc210ZC0+ZXJhc2VzaXplKSB7CiAJCQlOU19FUlIoIm92ZXJyaWRlc2l6ZSBpcyB0b28gYmlnXG4iKTsKIAkJCWdvdG8gZXJyX2V4aXQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9uYW5kL25kZmMuYyBiL2RyaXZlcnMvbXRkL25hbmQvbmRmYy5jCmluZGV4IDk1NTk1OWUuLjU4MmNmODAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL25hbmQvbmRmYy5jCisrKyBiL2RyaXZlcnMvbXRkL25hbmQvbmRmYy5jCkBAIC0yLDEyICsyLDIwIEBACiAgKiAgZHJpdmVycy9tdGQvbmRmYy5jCiAgKgogICogIE92ZXJ2aWV3OgotICogICBQbGF0Zm9ybSBpbmRlcGVuZGVuZCBkcml2ZXIgZm9yIE5ERkMgKE5hbkQgRmxhc2ggQ29udHJvbGxlcikKKyAqICAgUGxhdGZvcm0gaW5kZXBlbmRlbnQgZHJpdmVyIGZvciBOREZDIChOYW5EIEZsYXNoIENvbnRyb2xsZXIpCiAgKiAgIGludGVncmF0ZWQgaW50byBFUDQ0MCBjb3JlcwogICoKKyAqICAgUG9ydGVkIHRvIGFuIE9GIHBsYXRmb3JtIGRyaXZlciBieSBTZWFuIE1hY0xlbm5hbgorICoKKyAqICAgVGhlIE5ERkMgc3VwcG9ydHMgbXVsdGlwbGUgY2hpcHMsIGJ1dCB0aGlzIGRyaXZlciBvbmx5IHN1cHBvcnRzIGEKKyAqICAgc2luZ2xlIGNoaXAgc2luY2UgSSBkbyBub3QgaGF2ZSBhY2Nlc3MgdG8gYW55IGJvYXJkcyB3aXRoCisgKiAgIG11bHRpcGxlIGNoaXBzLgorICoKICAqICBBdXRob3I6IFRob21hcyBHbGVpeG5lcgogICoKICAqICBDb3B5cmlnaHQgMjAwNiBJQk0KKyAqICBDb3B5cmlnaHQgMjAwOCBQSUtBIFRlY2hub2xvZ2llcworICogICAgU2VhbiBNYWNMZW5uYW4gPHNtYWNsZW5uYW5AcGlrYXRlY2guY29tPgogICoKICAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUJIGl0IGFuZC9vciBtb2RpZnkgaXQKICAqICB1bmRlciAgdGhlIHRlcm1zIG9mCSB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKQEAgLTIxLDI3ICsyOSwyMCBAQAogI2luY2x1ZGUgPGxpbnV4L210ZC9wYXJ0aXRpb25zLmg+CiAjaW5jbHVkZSA8bGludXgvbXRkL25kZmMuaD4KICNpbmNsdWRlIDxsaW51eC9tdGQvbXRkLmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0KKyNpbmNsdWRlIDxsaW51eC9vZl9wbGF0Zm9ybS5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgotI2lmZGVmIENPTkZJR180MHgKLSNpbmNsdWRlIDxhc20vaWJtNDA1Lmg+Ci0jZWxzZQotI2luY2x1ZGUgPGFzbS9pYm00NHguaD4KLSNlbmRpZgogCi1zdHJ1Y3QgbmRmY19uYW5kX210ZCB7Ci0Jc3RydWN0IG10ZF9pbmZvCQkJbXRkOwotCXN0cnVjdCBuYW5kX2NoaXAJCWNoaXA7Ci0Jc3RydWN0IHBsYXRmb3JtX25hbmRfY2hpcAkqcGxfY2hpcDsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbmRmY19uYW5kX210ZCBuZGZjX210ZFtOREZDX01BWF9CQU5LU107CiAKIHN0cnVjdCBuZGZjX2NvbnRyb2xsZXIgewotCXZvaWQgX19pb21lbQkJKm5kZmNiYXNlOwotCXN0cnVjdCBuYW5kX2h3X2NvbnRyb2wJbmRmY19jb250cm9sOwotCWF0b21pY190CQljaGlsZHNfYWN0aXZlOworCXN0cnVjdCBvZl9kZXZpY2UgKm9mZGV2OworCXZvaWQgX19pb21lbSAqbmRmY2Jhc2U7CisJc3RydWN0IG10ZF9pbmZvIG10ZDsKKwlzdHJ1Y3QgbmFuZF9jaGlwIGNoaXA7CisJaW50IGNoaXBfc2VsZWN0OworCXN0cnVjdCBuYW5kX2h3X2NvbnRyb2wgbmRmY19jb250cm9sOworI2lmZGVmIENPTkZJR19NVERfUEFSVElUSU9OUworCXN0cnVjdCBtdGRfcGFydGl0aW9uICpwYXJ0czsKKyNlbmRpZgogfTsKIAogc3RhdGljIHN0cnVjdCBuZGZjX2NvbnRyb2xsZXIgbmRmY19jdHJsOwpAQCAtNTAsMTcgKzUxLDE0IEBACiB7CiAJdWludDMyX3QgY2NyOwogCXN0cnVjdCBuZGZjX2NvbnRyb2xsZXIgKm5kZmMgPSAmbmRmY19jdHJsOwotCXN0cnVjdCBuYW5kX2NoaXAgKm5hbmRjaGlwID0gbXRkLT5wcml2OwotCXN0cnVjdCBuZGZjX25hbmRfbXRkICpuYW5kbXRkID0gbmFuZGNoaXAtPnByaXY7Ci0Jc3RydWN0IHBsYXRmb3JtX25hbmRfY2hpcCAqcGNoaXAgPSBuYW5kbXRkLT5wbF9jaGlwOwogCi0JY2NyID0gX19yYXdfcmVhZGwobmRmYy0+bmRmY2Jhc2UgKyBOREZDX0NDUik7CisJY2NyID0gaW5fYmUzMihuZGZjLT5uZGZjYmFzZSArIE5ERkNfQ0NSKTsKIAlpZiAoY2hpcCA+PSAwKSB7CiAJCWNjciAmPSB+TkRGQ19DQ1JfQlNfTUFTSzsKLQkJY2NyIHw9IE5ERkNfQ0NSX0JTKGNoaXAgKyBwY2hpcC0+Y2hpcF9vZmZzZXQpOworCQljY3IgfD0gTkRGQ19DQ1JfQlMoY2hpcCArIG5kZmMtPmNoaXBfc2VsZWN0KTsKIAl9IGVsc2UKIAkJY2NyIHw9IE5ERkNfQ0NSX1JFU0VUX0NFOwotCV9fcmF3X3dyaXRlbChjY3IsIG5kZmMtPm5kZmNiYXNlICsgTkRGQ19DQ1IpOworCW91dF9iZTMyKG5kZmMtPm5kZmNiYXNlICsgTkRGQ19DQ1IsIGNjcik7CiB9CiAKIHN0YXRpYyB2b2lkIG5kZmNfaHdjb250cm9sKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBpbnQgY21kLCB1bnNpZ25lZCBpbnQgY3RybCkKQEAgLTgwLDcgKzc4LDcgQEAKIHsKIAlzdHJ1Y3QgbmRmY19jb250cm9sbGVyICpuZGZjID0gJm5kZmNfY3RybDsKIAotCXJldHVybiBfX3Jhd19yZWFkbChuZGZjLT5uZGZjYmFzZSArIE5ERkNfU1RBVCkgJiBOREZDX1NUQVRfSVNfUkVBRFk7CisJcmV0dXJuIGluX2JlMzIobmRmYy0+bmRmY2Jhc2UgKyBOREZDX1NUQVQpICYgTkRGQ19TVEFUX0lTX1JFQURZOwogfQogCiBzdGF0aWMgdm9pZCBuZGZjX2VuYWJsZV9od2VjYyhzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgaW50IG1vZGUpCkBAIC04OCw5ICs4Niw5IEBACiAJdWludDMyX3QgY2NyOwogCXN0cnVjdCBuZGZjX2NvbnRyb2xsZXIgKm5kZmMgPSAmbmRmY19jdHJsOwogCi0JY2NyID0gX19yYXdfcmVhZGwobmRmYy0+bmRmY2Jhc2UgKyBOREZDX0NDUik7CisJY2NyID0gaW5fYmUzMihuZGZjLT5uZGZjYmFzZSArIE5ERkNfQ0NSKTsKIAljY3IgfD0gTkRGQ19DQ1JfUkVTRVRfRUNDOwotCV9fcmF3X3dyaXRlbChjY3IsIG5kZmMtPm5kZmNiYXNlICsgTkRGQ19DQ1IpOworCW91dF9iZTMyKG5kZmMtPm5kZmNiYXNlICsgTkRGQ19DQ1IsIGNjcik7CiAJd21iKCk7CiB9CiAKQEAgLTEwMiw5ICsxMDAsMTAgQEAKIAl1aW50OF90ICpwID0gKHVpbnQ4X3QgKikmZWNjOwogCiAJd21iKCk7Ci0JZWNjID0gX19yYXdfcmVhZGwobmRmYy0+bmRmY2Jhc2UgKyBOREZDX0VDQyk7Ci0JZWNjX2NvZGVbMF0gPSBwWzFdOwotCWVjY19jb2RlWzFdID0gcFsyXTsKKwllY2MgPSBpbl9iZTMyKG5kZmMtPm5kZmNiYXNlICsgTkRGQ19FQ0MpOworCS8qIFRoZSBOREZDIHVzZXMgU21hcnQgTWVkaWEgKFNNQykgYnl0ZXMgb3JkZXIgKi8KKwllY2NfY29kZVswXSA9IHBbMl07CisJZWNjX2NvZGVbMV0gPSBwWzFdOwogCWVjY19jb2RlWzJdID0gcFszXTsKIAogCXJldHVybiAwOwpAQCAtMTIzLDcgKzEyMiw3IEBACiAJdWludDMyX3QgKnAgPSAodWludDMyX3QgKikgYnVmOwogCiAJZm9yKDtsZW4gPiAwOyBsZW4gLT0gNCkKLQkJKnArKyA9IF9fcmF3X3JlYWRsKG5kZmMtPm5kZmNiYXNlICsgTkRGQ19EQVRBKTsKKwkJKnArKyA9IGluX2JlMzIobmRmYy0+bmRmY2Jhc2UgKyBOREZDX0RBVEEpOwogfQogCiBzdGF0aWMgdm9pZCBuZGZjX3dyaXRlX2J1ZihzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgY29uc3QgdWludDhfdCAqYnVmLCBpbnQgbGVuKQpAQCAtMTMyLDcgKzEzMSw3IEBACiAJdWludDMyX3QgKnAgPSAodWludDMyX3QgKikgYnVmOwogCiAJZm9yKDtsZW4gPiAwOyBsZW4gLT0gNCkKLQkJX19yYXdfd3JpdGVsKCpwKyssIG5kZmMtPm5kZmNiYXNlICsgTkRGQ19EQVRBKTsKKwkJb3V0X2JlMzIobmRmYy0+bmRmY2Jhc2UgKyBOREZDX0RBVEEsICpwKyspOwogfQogCiBzdGF0aWMgaW50IG5kZmNfdmVyaWZ5X2J1ZihzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgY29uc3QgdWludDhfdCAqYnVmLCBpbnQgbGVuKQpAQCAtMTQxLDcgKzE0MCw3IEBACiAJdWludDMyX3QgKnAgPSAodWludDMyX3QgKikgYnVmOwogCiAJZm9yKDtsZW4gPiAwOyBsZW4gLT0gNCkKLQkJaWYgKCpwKysgIT0gX19yYXdfcmVhZGwobmRmYy0+bmRmY2Jhc2UgKyBOREZDX0RBVEEpKQorCQlpZiAoKnArKyAhPSBpbl9iZTMyKG5kZmMtPm5kZmNiYXNlICsgTkRGQ19EQVRBKSkKIAkJCXJldHVybiAtRUZBVUxUOwogCXJldHVybiAwOwogfQpAQCAtMTQ5LDEwICsxNDgsMTkgQEAKIC8qCiAgKiBJbml0aWFsaXplIGNoaXAgc3RydWN0dXJlCiAgKi8KLXN0YXRpYyB2b2lkIG5kZmNfY2hpcF9pbml0KHN0cnVjdCBuZGZjX25hbmRfbXRkICptdGQpCitzdGF0aWMgaW50IG5kZmNfY2hpcF9pbml0KHN0cnVjdCBuZGZjX2NvbnRyb2xsZXIgKm5kZmMsCisJCQkgIHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSkKIHsKLQlzdHJ1Y3QgbmRmY19jb250cm9sbGVyICpuZGZjID0gJm5kZmNfY3RybDsKLQlzdHJ1Y3QgbmFuZF9jaGlwICpjaGlwID0gJm10ZC0+Y2hpcDsKKyNpZmRlZiBDT05GSUdfTVREX1BBUlRJVElPTlMKKyNpZmRlZiBDT05GSUdfTVREX0NNRExJTkVfUEFSVFMKKwlzdGF0aWMgY29uc3QgY2hhciAqcGFydF90eXBlc1tdID0geyAiY21kbGluZXBhcnQiLCBOVUxMIH07CisjZWxzZQorCXN0YXRpYyBjb25zdCBjaGFyICpwYXJ0X3R5cGVzW10gPSB7IE5VTEwgfTsKKyNlbmRpZgorI2VuZGlmCisJc3RydWN0IGRldmljZV9ub2RlICpmbGFzaF9ucDsKKwlzdHJ1Y3QgbmFuZF9jaGlwICpjaGlwID0gJm5kZmMtPmNoaXA7CisJaW50IHJldDsKIAogCWNoaXAtPklPX0FERFJfUiA9IG5kZmMtPm5kZmNiYXNlICsgTkRGQ19EQVRBOwogCWNoaXAtPklPX0FERFJfVyA9IG5kZmMtPm5kZmNiYXNlICsgTkRGQ19EQVRBOwpAQCAtMTYwLDggKzE2OCw2IEBACiAJY2hpcC0+ZGV2X3JlYWR5ID0gbmRmY19yZWFkeTsKIAljaGlwLT5zZWxlY3RfY2hpcCA9IG5kZmNfc2VsZWN0X2NoaXA7CiAJY2hpcC0+Y2hpcF9kZWxheSA9IDUwOwotCWNoaXAtPnByaXYgPSBtdGQ7Ci0JY2hpcC0+b3B0aW9ucyA9IG10ZC0+cGxfY2hpcC0+b3B0aW9uczsKIAljaGlwLT5jb250cm9sbGVyID0gJm5kZmMtPm5kZmNfY29udHJvbDsKIAljaGlwLT5yZWFkX2J1ZiA9IG5kZmNfcmVhZF9idWY7CiAJY2hpcC0+d3JpdGVfYnVmID0gbmRmY193cml0ZV9idWY7CkBAIC0xNzIsMTQzICsxNzgsMTM2IEBACiAJY2hpcC0+ZWNjLm1vZGUgPSBOQU5EX0VDQ19IVzsKIAljaGlwLT5lY2Muc2l6ZSA9IDI1NjsKIAljaGlwLT5lY2MuYnl0ZXMgPSAzOwotCWNoaXAtPmVjY2xheW91dCA9IGNoaXAtPmVjYy5sYXlvdXQgPSBtdGQtPnBsX2NoaXAtPmVjY2xheW91dDsKLQltdGQtPm10ZC5wcml2ID0gY2hpcDsKLQltdGQtPm10ZC5vd25lciA9IFRISVNfTU9EVUxFOwotfQogCi1zdGF0aWMgaW50IG5kZmNfY2hpcF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCXN0cnVjdCBwbGF0Zm9ybV9uYW5kX2NoaXAgKm5jID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7Ci0Jc3RydWN0IG5kZmNfY2hpcF9zZXR0aW5ncyAqc2V0dGluZ3MgPSBuYy0+cHJpdjsKLQlzdHJ1Y3QgbmRmY19jb250cm9sbGVyICpuZGZjID0gJm5kZmNfY3RybDsKLQlzdHJ1Y3QgbmRmY19uYW5kX210ZCAqbmFuZG10ZDsKKwluZGZjLT5tdGQucHJpdiA9IGNoaXA7CisJbmRmYy0+bXRkLm93bmVyID0gVEhJU19NT0RVTEU7CiAKLQlpZiAobmMtPmNoaXBfb2Zmc2V0ID49IE5ERkNfTUFYX0JBTktTIHx8IG5jLT5ucl9jaGlwcyA+IE5ERkNfTUFYX0JBTktTKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCS8qIFNldCB0aGUgYmFuayBzZXR0aW5ncyAqLwotCV9fcmF3X3dyaXRlbChzZXR0aW5ncy0+YmFua19zZXR0aW5ncywKLQkJICAgICBuZGZjLT5uZGZjYmFzZSArIE5ERkNfQkNGRzAgKyAobmMtPmNoaXBfb2Zmc2V0IDw8IDIpKTsKLQotCW5hbmRtdGQgPSAmbmRmY19tdGRbcGRldi0+aWRdOwotCWlmIChuYW5kbXRkLT5wbF9jaGlwKQotCQlyZXR1cm4gLUVCVVNZOwotCi0JbmFuZG10ZC0+cGxfY2hpcCA9IG5jOwotCW5kZmNfY2hpcF9pbml0KG5hbmRtdGQpOwotCi0JLyogU2NhbiBmb3IgY2hpcHMgKi8KLQlpZiAobmFuZF9zY2FuKCZuYW5kbXRkLT5tdGQsIG5jLT5ucl9jaGlwcykpIHsKLQkJbmFuZG10ZC0+cGxfY2hpcCA9IE5VTEw7CisJZmxhc2hfbnAgPSBvZl9nZXRfbmV4dF9jaGlsZChub2RlLCBOVUxMKTsKKwlpZiAoIWZsYXNoX25wKQogCQlyZXR1cm4gLUVOT0RFVjsKKworCW5kZmMtPm10ZC5uYW1lID0ga2FzcHJpbnRmKEdGUF9LRVJORUwsICIlcy4lcyIsCisJCQkJICAgbmRmYy0+b2ZkZXYtPmRldi5idXNfaWQsIGZsYXNoX25wLT5uYW1lKTsKKwlpZiAoIW5kZmMtPm10ZC5uYW1lKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyOwogCX0KIAorCXJldCA9IG5hbmRfc2NhbigmbmRmYy0+bXRkLCAxKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycjsKKwogI2lmZGVmIENPTkZJR19NVERfUEFSVElUSU9OUwotCXByaW50aygiTnVtYmVyIG9mIHBhcnRpdGlvbnMgJWRcbiIsIG5jLT5ucl9wYXJ0aXRpb25zKTsKLQlpZiAobmMtPm5yX3BhcnRpdGlvbnMpIHsKLQkJLyogQWRkIHRoZSBmdWxsIGRldmljZSwgc28gY29tcGxldGUgZHVtcHMgY2FuIGJlIG1hZGUgKi8KLQkJYWRkX210ZF9kZXZpY2UoJm5hbmRtdGQtPm10ZCk7Ci0JCWFkZF9tdGRfcGFydGl0aW9ucygmbmFuZG10ZC0+bXRkLCBuYy0+cGFydGl0aW9ucywKLQkJCQkgICBuYy0+bnJfcGFydGl0aW9ucyk7CisJcmV0ID0gcGFyc2VfbXRkX3BhcnRpdGlvbnMoJm5kZmMtPm10ZCwgcGFydF90eXBlcywgJm5kZmMtPnBhcnRzLCAwKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnI7CiAKLQl9IGVsc2UKLSNlbHNlCi0JCWFkZF9tdGRfZGV2aWNlKCZuYW5kbXRkLT5tdGQpOwotI2VuZGlmCi0KLQlhdG9taWNfaW5jKCZuZGZjLT5jaGlsZHNfYWN0aXZlKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBuZGZjX2NoaXBfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbmRmY19uYW5kX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0Jc3RydWN0IHBsYXRmb3JtX25hbmRfY3RybCAqbmMgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKLQlzdHJ1Y3QgbmRmY19jb250cm9sbGVyX3NldHRpbmdzICpzZXR0aW5ncyA9IG5jLT5wcml2OwotCXN0cnVjdCByZXNvdXJjZSAqcmVzID0gcGRldi0+cmVzb3VyY2U7Ci0Jc3RydWN0IG5kZmNfY29udHJvbGxlciAqbmRmYyA9ICZuZGZjX2N0cmw7Ci0JdW5zaWduZWQgbG9uZyBsb25nIHBoeXMgPSBzZXR0aW5ncy0+bmRmY19lcnBuIHwgcmVzLT5zdGFydDsKLQotI2lmbmRlZiBDT05GSUdfUEhZU182NEJJVAotCW5kZmMtPm5kZmNiYXNlID0gaW9yZW1hcCgocGh5c19hZGRyX3QpcGh5cywgcmVzLT5lbmQgLSByZXMtPnN0YXJ0ICsgMSk7Ci0jZWxzZQotCW5kZmMtPm5kZmNiYXNlID0gaW9yZW1hcDY0KHBoeXMsIHJlcy0+ZW5kIC0gcmVzLT5zdGFydCArIDEpOwotI2VuZGlmCi0JaWYgKCFuZGZjLT5uZGZjYmFzZSkgewotCQlwcmludGsoS0VSTl9FUlIgIk5ERkM6IGlvcmVtYXAgZmFpbGVkXG4iKTsKLQkJcmV0dXJuIC1FSU87CisjaWZkZWYgQ09ORklHX01URF9PRl9QQVJUUworCWlmIChyZXQgPT0gMCkgeworCQlyZXQgPSBvZl9tdGRfcGFyc2VfcGFydGl0aW9ucygmbmRmYy0+b2ZkZXYtPmRldiwgZmxhc2hfbnAsCisJCQkJCSAgICAgICZuZGZjLT5wYXJ0cyk7CisJCWlmIChyZXQgPCAwKQorCQkJZ290byBlcnI7CiAJfQorI2VuZGlmCiAKLQlfX3Jhd193cml0ZWwoc2V0dGluZ3MtPmNjcl9zZXR0aW5ncywgbmRmYy0+bmRmY2Jhc2UgKyBOREZDX0NDUik7CisJaWYgKHJldCA+IDApCisJCXJldCA9IGFkZF9tdGRfcGFydGl0aW9ucygmbmRmYy0+bXRkLCBuZGZjLT5wYXJ0cywgcmV0KTsKKwllbHNlCisjZW5kaWYKKwkJcmV0ID0gYWRkX210ZF9kZXZpY2UoJm5kZmMtPm10ZCk7CisKK2VycjoKKwlvZl9ub2RlX3B1dChmbGFzaF9ucCk7CisJaWYgKHJldCkKKwkJa2ZyZWUobmRmYy0+bXRkLm5hbWUpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IG5kZmNfcHJvYmUoc3RydWN0IG9mX2RldmljZSAqb2ZkZXYsCisJCQkJY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqbWF0Y2gpCit7CisJc3RydWN0IG5kZmNfY29udHJvbGxlciAqbmRmYyA9ICZuZGZjX2N0cmw7CisJY29uc3QgdTMyICpyZWc7CisJdTMyIGNjcjsKKwlpbnQgZXJyLCBsZW47CiAKIAlzcGluX2xvY2tfaW5pdCgmbmRmYy0+bmRmY19jb250cm9sLmxvY2spOwogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJm5kZmMtPm5kZmNfY29udHJvbC53cSk7CisJbmRmYy0+b2ZkZXYgPSBvZmRldjsKKwlkZXZfc2V0X2RydmRhdGEoJm9mZGV2LT5kZXYsIG5kZmMpOwogCi0JcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgbmRmYyk7Ci0KLQlwcmludGsoIk5ERkMgTkFORCBEcml2ZXIgaW5pdGlhbGl6ZWQuIENoaXAtUmV2OiAweCUwOHhcbiIsCi0JICAgICAgIF9fcmF3X3JlYWRsKG5kZmMtPm5kZmNiYXNlICsgTkRGQ19SRVZJRCkpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbmRmY19uYW5kX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCXN0cnVjdCBuZGZjX2NvbnRyb2xsZXIgKm5kZmMgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQotCWlmIChhdG9taWNfcmVhZCgmbmRmYy0+Y2hpbGRzX2FjdGl2ZSkpCi0JCXJldHVybiAtRUJVU1k7Ci0KLQlpZiAobmRmYykgewotCQlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKLQkJaW91bm1hcChuZGZjX2N0cmwubmRmY2Jhc2UpOwotCQluZGZjX2N0cmwubmRmY2Jhc2UgPSBOVUxMOworCS8qIFJlYWQgdGhlIHJlZyBwcm9wZXJ0eSB0byBnZXQgdGhlIGNoaXAgc2VsZWN0ICovCisJcmVnID0gb2ZfZ2V0X3Byb3BlcnR5KG9mZGV2LT5ub2RlLCAicmVnIiwgJmxlbik7CisJaWYgKHJlZyA9PSBOVUxMIHx8IGxlbiAhPSAxMikgeworCQlkZXZfZXJyKCZvZmRldi0+ZGV2LCAidW5hYmxlIHJlYWQgcmVnIHByb3BlcnR5ICglZClcbiIsIGxlbik7CisJCXJldHVybiAtRU5PRU5UOwogCX0KKwluZGZjLT5jaGlwX3NlbGVjdCA9IHJlZ1swXTsKKworCW5kZmMtPm5kZmNiYXNlID0gb2ZfaW9tYXAob2ZkZXYtPm5vZGUsIDApOworCWlmICghbmRmYy0+bmRmY2Jhc2UpIHsKKwkJZGV2X2Vycigmb2ZkZXYtPmRldiwgImZhaWxlZCB0byBnZXQgbWVtb3J5XG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJY2NyID0gTkRGQ19DQ1JfQlMobmRmYy0+Y2hpcF9zZWxlY3QpOworCisJLyogSXQgaXMgb2sgaWYgY2NyIGRvZXMgbm90IGV4aXN0IC0ganVzdCBkZWZhdWx0IHRvIDAgKi8KKwlyZWcgPSBvZl9nZXRfcHJvcGVydHkob2ZkZXYtPm5vZGUsICJjY3IiLCBOVUxMKTsKKwlpZiAocmVnKQorCQljY3IgfD0gKnJlZzsKKworCW91dF9iZTMyKG5kZmMtPm5kZmNiYXNlICsgTkRGQ19DQ1IsIGNjcik7CisKKwkvKiBTZXQgdGhlIGJhbmsgc2V0dGluZ3MgaWYgZ2l2ZW4gKi8KKwlyZWcgPSBvZl9nZXRfcHJvcGVydHkob2ZkZXYtPm5vZGUsICJiYW5rLXNldHRpbmdzIiwgTlVMTCk7CisJaWYgKHJlZykgeworCQlpbnQgb2Zmc2V0ID0gTkRGQ19CQ0ZHMCArIChuZGZjLT5jaGlwX3NlbGVjdCA8PCAyKTsKKwkJb3V0X2JlMzIobmRmYy0+bmRmY2Jhc2UgKyBvZmZzZXQsICpyZWcpOworCX0KKworCWVyciA9IG5kZmNfY2hpcF9pbml0KG5kZmMsIG9mZGV2LT5ub2RlKTsKKwlpZiAoZXJyKSB7CisJCWlvdW5tYXAobmRmYy0+bmRmY2Jhc2UpOworCQlyZXR1cm4gZXJyOworCX0KKwogCXJldHVybiAwOwogfQogCi0vKiBkcml2ZXIgZGV2aWNlIHJlZ2lzdHJhdGlvbiAqLworc3RhdGljIGludCBfX2RldmV4aXQgbmRmY19yZW1vdmUoc3RydWN0IG9mX2RldmljZSAqb2ZkZXYpCit7CisJc3RydWN0IG5kZmNfY29udHJvbGxlciAqbmRmYyA9IGRldl9nZXRfZHJ2ZGF0YSgmb2ZkZXYtPmRldik7CiAKLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIG5kZmNfY2hpcF9kcml2ZXIgPSB7Ci0JLnByb2JlCQk9IG5kZmNfY2hpcF9wcm9iZSwKLQkucmVtb3ZlCQk9IG5kZmNfY2hpcF9yZW1vdmUsCi0JLmRyaXZlcgkJPSB7Ci0JCS5uYW1lCT0gIm5kZmMtY2hpcCIsCi0JCS5vd25lcgk9IFRISVNfTU9EVUxFLAotCX0sCisJbmFuZF9yZWxlYXNlKCZuZGZjLT5tdGQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIG5kZmNfbWF0Y2hbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gImlibSxuZGZjIiwgfSwKKwl7fQogfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIG5kZmNfbWF0Y2gpOwogCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBuZGZjX25hbmRfZHJpdmVyID0gewotCS5wcm9iZQkJPSBuZGZjX25hbmRfcHJvYmUsCi0JLnJlbW92ZQkJPSBuZGZjX25hbmRfcmVtb3ZlLAotCS5kcml2ZXIJCT0gewotCQkubmFtZQk9ICJuZGZjLW5hbmQiLAotCQkub3duZXIJPSBUSElTX01PRFVMRSwKK3N0YXRpYyBzdHJ1Y3Qgb2ZfcGxhdGZvcm1fZHJpdmVyIG5kZmNfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lCT0gIm5kZmMiLAogCX0sCisJLm1hdGNoX3RhYmxlID0gbmRmY19tYXRjaCwKKwkucHJvYmUgPSBuZGZjX3Byb2JlLAorCS5yZW1vdmUgPSBfX2RldmV4aXRfcChuZGZjX3JlbW92ZSksCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBuZGZjX25hbmRfaW5pdCh2b2lkKQogewotCWludCByZXQ7Ci0KLQlzcGluX2xvY2tfaW5pdCgmbmRmY19jdHJsLm5kZmNfY29udHJvbC5sb2NrKTsKLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZuZGZjX2N0cmwubmRmY19jb250cm9sLndxKTsKLQotCXJldCA9IHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmbmRmY19uYW5kX2RyaXZlcik7Ci0JaWYgKCFyZXQpCi0JCXJldCA9IHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmbmRmY19jaGlwX2RyaXZlcik7Ci0JcmV0dXJuIHJldDsKKwlyZXR1cm4gb2ZfcmVnaXN0ZXJfcGxhdGZvcm1fZHJpdmVyKCZuZGZjX2RyaXZlcik7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBuZGZjX25hbmRfZXhpdCh2b2lkKQogewotCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZuZGZjX2NoaXBfZHJpdmVyKTsKLQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmbmRmY19uYW5kX2RyaXZlcik7CisJb2ZfdW5yZWdpc3Rlcl9wbGF0Zm9ybV9kcml2ZXIoJm5kZmNfZHJpdmVyKTsKIH0KIAogbW9kdWxlX2luaXQobmRmY19uYW5kX2luaXQpOwpAQCAtMzE2LDYgKzMxNSw0IEBACiAKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIE1PRFVMRV9BVVRIT1IoIlRob21hcyBHbGVpeG5lciA8dGdseEBsaW51dHJvbml4LmRlPiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJQbGF0Zm9ybSBkcml2ZXIgZm9yIE5ERkMiKTsKLU1PRFVMRV9BTElBUygicGxhdGZvcm06bmRmYy1jaGlwIik7Ci1NT0RVTEVfQUxJQVMoInBsYXRmb3JtOm5kZmMtbmFuZCIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJPRiBQbGF0Zm9ybSBkcml2ZXIgZm9yIE5ERkMiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL25hbmQvcHhhM3h4X25hbmQuYyBiL2RyaXZlcnMvbXRkL25hbmQvcHhhM3h4X25hbmQuYwppbmRleCBmYzQxNDQ0Li5jYzU1Y2JjIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9uYW5kL3B4YTN4eF9uYW5kLmMKKysrIGIvZHJpdmVycy9tdGQvbmFuZC9weGEzeHhfbmFuZC5jCkBAIC0yOTgsNyArMjk4LDcgQEAKICNkZWZpbmUgTkRUUjFfdEFSKGMpCShtaW4oKGMpLCAxNSkgPDwgMCkKIAogLyogY29udmVydCBuYW5vLXNlY29uZHMgdG8gbmFuZCBmbGFzaCBjb250cm9sbGVyIGNsb2NrIGN5Y2xlcyAqLwotI2RlZmluZSBuczJjeWNsZShucywgY2xrKQkoaW50KSgoKG5zKSAqIChjbGsgLyAxMDAwMDAwKSAvIDEwMDApICsgMSkKKyNkZWZpbmUgbnMyY3ljbGUobnMsIGNsaykJKGludCkoKChucykgKiAoY2xrIC8gMTAwMDAwMCkgLyAxMDAwKSAtIDEpCiAKIHN0YXRpYyB2b2lkIHB4YTN4eF9uYW5kX3NldF90aW1pbmcoc3RydWN0IHB4YTN4eF9uYW5kX2luZm8gKmluZm8sCiAJCQkJICAgY29uc3Qgc3RydWN0IHB4YTN4eF9uYW5kX3RpbWluZyAqdCkKQEAgLTM2OCwxNCArMzY4LDE0IEBACiAJCS8qIGxhcmdlIGJsb2NrLCAyIGN5Y2xlcyBmb3IgY29sdW1uIGFkZHJlc3MKIAkJICogcm93IGFkZHJlc3Mgc3RhcnRzIGZyb20gM3JkIGN5Y2xlCiAJCSAqLwotCQlpbmZvLT5uZGNiMSB8PSAocGFnZV9hZGRyIDw8IDE2KSB8IChjb2x1bW4gJiAweGZmZmYpOworCQlpbmZvLT5uZGNiMSB8PSBwYWdlX2FkZHIgPDwgMTY7CiAJCWlmIChpbmZvLT5yb3dfYWRkcl9jeWNsZXMgPT0gMykKIAkJCWluZm8tPm5kY2IyID0gKHBhZ2VfYWRkciA+PiAxNikgJiAweGZmOwogCX0gZWxzZQogCQkvKiBzbWFsbCBibG9jaywgMSBjeWNsZXMgZm9yIGNvbHVtbiBhZGRyZXNzCiAJCSAqIHJvdyBhZGRyZXNzIHN0YXJ0cyBmcm9tIDJuZCBjeWNsZQogCQkgKi8KLQkJaW5mby0+bmRjYjEgPSAocGFnZV9hZGRyIDw8IDgpIHwgKGNvbHVtbiAmIDB4ZmYpOworCQlpbmZvLT5uZGNiMSA9IHBhZ2VfYWRkciA8PCA4OwogCiAJaWYgKGNtZCA9PSBjbWRzZXQtPnByb2dyYW0pCiAJCWluZm8tPm5kY2IwIHw9IE5EQ0IwX0NNRF9UWVBFKDEpIHwgTkRDQjBfQVVUT19SUzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL25hbmQvc2hhcnBzbC5jIGIvZHJpdmVycy9tdGQvbmFuZC9zaGFycHNsLmMKaW5kZXggMzBhNTE4ZTIuLjU0ZWM3NTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL25hbmQvc2hhcnBzbC5jCisrKyBiL2RyaXZlcnMvbXRkL25hbmQvc2hhcnBzbC5jCkBAIC0yLDYgKzIsNyBAQAogICogZHJpdmVycy9tdGQvbmFuZC9zaGFycHNsLmMKICAqCiAgKiAgQ29weXJpZ2h0IChDKSAyMDA0IFJpY2hhcmQgUHVyZGllCisgKiAgQ29weXJpZ2h0IChDKSAyMDA4IERtaXRyeSBCYXJ5c2hrb3YKICAqCiAgKiAgQmFzZWQgb24gU2hhcnAncyBOQU5EIGRyaXZlciBzaGFycF9zbC5jCiAgKgpAQCAtMTksMjIgKzIwLDMxIEBACiAjaW5jbHVkZSA8bGludXgvbXRkL25hbmQuaD4KICNpbmNsdWRlIDxsaW51eC9tdGQvbmFuZF9lY2MuaD4KICNpbmNsdWRlIDxsaW51eC9tdGQvcGFydGl0aW9ucy5oPgorI2luY2x1ZGUgPGxpbnV4L210ZC9zaGFycHNsLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisKICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KIAotc3RhdGljIHZvaWQgX19pb21lbSAqc2hhcnBzbF9pb19iYXNlOwotc3RhdGljIGludCBzaGFycHNsX3BoeXNfYmFzZSA9IDB4MEMwMDAwMDA7CitzdHJ1Y3Qgc2hhcnBzbF9uYW5kIHsKKwlzdHJ1Y3QgbXRkX2luZm8JCW10ZDsKKwlzdHJ1Y3QgbmFuZF9jaGlwCWNoaXA7CisKKwl2b2lkIF9faW9tZW0JCSppbzsKK307CisKKyNkZWZpbmUgbXRkX3RvX3NoYXJwc2woX210ZCkJY29udGFpbmVyX29mKF9tdGQsIHN0cnVjdCBzaGFycHNsX25hbmQsIG10ZCkKIAogLyogcmVnaXN0ZXIgb2Zmc2V0ICovCi0jZGVmaW5lIEVDQ0xQTEIJIAlzaGFycHNsX2lvX2Jhc2UrMHgwMAkvKiBsaW5lIHBhcml0eSA3IC0gMCBiaXQgKi8KLSNkZWZpbmUgRUNDTFBVQgkgCXNoYXJwc2xfaW9fYmFzZSsweDA0CS8qIGxpbmUgcGFyaXR5IDE1IC0gOCBiaXQgKi8KLSNkZWZpbmUgRUNDQ1AJICAgCXNoYXJwc2xfaW9fYmFzZSsweDA4CS8qIGNvbHVtbiBwYXJpdHkgNSAtIDAgYml0ICovCi0jZGVmaW5lIEVDQ0NOVFIJIAlzaGFycHNsX2lvX2Jhc2UrMHgwQwkvKiBFQ0MgYnl0ZSBjb3VudGVyICovCi0jZGVmaW5lIEVDQ0NMUlIJIAlzaGFycHNsX2lvX2Jhc2UrMHgxMAkvKiBjbGVhcmUgRUNDICovCi0jZGVmaW5lIEZMQVNISU8JIAlzaGFycHNsX2lvX2Jhc2UrMHgxNAkvKiBGbGFzaCBJL08gKi8KLSNkZWZpbmUgRkxBU0hDVEwJc2hhcnBzbF9pb19iYXNlKzB4MTgJLyogRmxhc2ggQ29udHJvbCAqLworI2RlZmluZSBFQ0NMUExCCQkweDAwCS8qIGxpbmUgcGFyaXR5IDcgLSAwIGJpdCAqLworI2RlZmluZSBFQ0NMUFVCCQkweDA0CS8qIGxpbmUgcGFyaXR5IDE1IC0gOCBiaXQgKi8KKyNkZWZpbmUgRUNDQ1AJCTB4MDgJLyogY29sdW1uIHBhcml0eSA1IC0gMCBiaXQgKi8KKyNkZWZpbmUgRUNDQ05UUgkJMHgwQwkvKiBFQ0MgYnl0ZSBjb3VudGVyICovCisjZGVmaW5lIEVDQ0NMUlIJCTB4MTAJLyogY2xlYXJlIEVDQyAqLworI2RlZmluZSBGTEFTSElPCQkweDE0CS8qIEZsYXNoIEkvTyAqLworI2RlZmluZSBGTEFTSENUTAkweDE4CS8qIEZsYXNoIENvbnRyb2wgKi8KIAogLyogRmxhc2ggY29udHJvbCBiaXQgKi8KICNkZWZpbmUgRkxSWUJZCQkoMSA8PCA1KQpAQCAtNDUsMzUgKzU1LDYgQEAKICNkZWZpbmUgRkxDRTAJCSgxIDw8IDApCiAKIC8qCi0gKiBNVEQgc3RydWN0dXJlIGZvciBTaGFycFNMCi0gKi8KLXN0YXRpYyBzdHJ1Y3QgbXRkX2luZm8gKnNoYXJwc2xfbXRkID0gTlVMTDsKLQotLyoKLSAqIERlZmluZSBwYXJ0aXRpb25zIGZvciBmbGFzaCBkZXZpY2UKLSAqLwotI2RlZmluZSBERUZBVUxUX05VTV9QQVJUSVRJT05TIDMKLQotc3RhdGljIGludCBucl9wYXJ0aXRpb25zOwotc3RhdGljIHN0cnVjdCBtdGRfcGFydGl0aW9uIHNoYXJwc2xfbmFuZF9kZWZhdWx0X3BhcnRpdGlvbl9pbmZvW10gPSB7Ci0JewotCSAubmFtZSA9ICJTeXN0ZW0gQXJlYSIsCi0JIC5vZmZzZXQgPSAwLAotCSAuc2l6ZSA9IDcgKiAxMDI0ICogMTAyNCwKLQkgfSwKLQl7Ci0JIC5uYW1lID0gIlJvb3QgRmlsZXN5c3RlbSIsCi0JIC5vZmZzZXQgPSA3ICogMTAyNCAqIDEwMjQsCi0JIC5zaXplID0gMzAgKiAxMDI0ICogMTAyNCwKLQkgfSwKLQl7Ci0JIC5uYW1lID0gIkhvbWUgRmlsZXN5c3RlbSIsCi0JIC5vZmZzZXQgPSBNVERQQVJUX09GU19BUFBFTkQsCi0JIC5zaXplID0gTVREUEFSVF9TSVpfRlVMTCwKLQkgfSwKLX07Ci0KLS8qCiAgKgloYXJkd2FyZSBzcGVjaWZpYyBhY2Nlc3MgdG8gY29udHJvbC1saW5lcwogICoJY3RybDoKICAqCU5BTkRfQ05FOiBiaXQgMCAtPiAhIGJpdCAwICYgNApAQCAtODQsNiArNjUsNyBAQAogc3RhdGljIHZvaWQgc2hhcnBzbF9uYW5kX2h3Y29udHJvbChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgaW50IGNtZCwKIAkJCQkgICB1bnNpZ25lZCBpbnQgY3RybCkKIHsKKwlzdHJ1Y3Qgc2hhcnBzbF9uYW5kICpzaGFycHNsID0gbXRkX3RvX3NoYXJwc2wobXRkKTsKIAlzdHJ1Y3QgbmFuZF9jaGlwICpjaGlwID0gbXRkLT5wcml2OwogCiAJaWYgKGN0cmwgJiBOQU5EX0NUUkxfQ0hBTkdFKSB7CkBAIC05MywxMDMgKzc1LDk3IEBACiAKIAkJYml0cyBePSAweDExOwogCi0JCXdyaXRlYigocmVhZGIoRkxBU0hDVEwpICYgfjB4MTcpIHwgYml0cywgRkxBU0hDVEwpOworCQl3cml0ZWIoKHJlYWRiKHNoYXJwc2wtPmlvICsgRkxBU0hDVEwpICYgfjB4MTcpIHwgYml0cywgc2hhcnBzbC0+aW8gKyBGTEFTSENUTCk7CiAJfQogCiAJaWYgKGNtZCAhPSBOQU5EX0NNRF9OT05FKQogCQl3cml0ZWIoY21kLCBjaGlwLT5JT19BRERSX1cpOwogfQogCi1zdGF0aWMgdWludDhfdCBzY2FuX2ZmX3BhdHRlcm5bXSA9IHsgMHhmZiwgMHhmZiB9OwotCi1zdGF0aWMgc3RydWN0IG5hbmRfYmJ0X2Rlc2NyIHNoYXJwc2xfYmJ0ID0gewotCS5vcHRpb25zID0gMCwKLQkub2ZmcyA9IDQsCi0JLmxlbiA9IDIsCi0JLnBhdHRlcm4gPSBzY2FuX2ZmX3BhdHRlcm4KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbmFuZF9iYnRfZGVzY3Igc2hhcnBzbF9ha2l0YV9iYnQgPSB7Ci0JLm9wdGlvbnMgPSAwLAotCS5vZmZzID0gNCwKLQkubGVuID0gMSwKLQkucGF0dGVybiA9IHNjYW5fZmZfcGF0dGVybgotfTsKLQotc3RhdGljIHN0cnVjdCBuYW5kX2VjY2xheW91dCBha2l0YV9vb2JpbmZvID0gewotCS5lY2NieXRlcyA9IDI0LAotCS5lY2Nwb3MgPSB7Ci0JCSAgIDB4NSwgMHgxLCAweDIsIDB4MywgMHg2LCAweDcsIDB4MTUsIDB4MTEsCi0JCSAgIDB4MTIsIDB4MTMsIDB4MTYsIDB4MTcsIDB4MjUsIDB4MjEsIDB4MjIsIDB4MjMsCi0JCSAgIDB4MjYsIDB4MjcsIDB4MzUsIDB4MzEsIDB4MzIsIDB4MzMsIDB4MzYsIDB4Mzd9LAotCS5vb2JmcmVlID0ge3sweDA4LCAweDA5fX0KLX07Ci0KIHN0YXRpYyBpbnQgc2hhcnBzbF9uYW5kX2Rldl9yZWFkeShzdHJ1Y3QgbXRkX2luZm8gKm10ZCkKIHsKLQlyZXR1cm4gISgocmVhZGIoRkxBU0hDVEwpICYgRkxSWUJZKSA9PSAwKTsKKwlzdHJ1Y3Qgc2hhcnBzbF9uYW5kICpzaGFycHNsID0gbXRkX3RvX3NoYXJwc2wobXRkKTsKKwlyZXR1cm4gISgocmVhZGIoc2hhcnBzbC0+aW8gKyBGTEFTSENUTCkgJiBGTFJZQlkpID09IDApOwogfQogCiBzdGF0aWMgdm9pZCBzaGFycHNsX25hbmRfZW5hYmxlX2h3ZWNjKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBpbnQgbW9kZSkKIHsKLQl3cml0ZWIoMCwgRUNDQ0xSUik7CisJc3RydWN0IHNoYXJwc2xfbmFuZCAqc2hhcnBzbCA9IG10ZF90b19zaGFycHNsKG10ZCk7CisJd3JpdGViKDAsIHNoYXJwc2wtPmlvICsgRUNDQ0xSUik7CiB9CiAKIHN0YXRpYyBpbnQgc2hhcnBzbF9uYW5kX2NhbGN1bGF0ZV9lY2Moc3RydWN0IG10ZF9pbmZvICptdGQsIGNvbnN0IHVfY2hhciAqIGRhdCwgdV9jaGFyICogZWNjX2NvZGUpCiB7Ci0JZWNjX2NvZGVbMF0gPSB+cmVhZGIoRUNDTFBVQik7Ci0JZWNjX2NvZGVbMV0gPSB+cmVhZGIoRUNDTFBMQik7Ci0JZWNjX2NvZGVbMl0gPSAofnJlYWRiKEVDQ0NQKSA8PCAyKSB8IDB4MDM7Ci0JcmV0dXJuIHJlYWRiKEVDQ0NOVFIpICE9IDA7CisJc3RydWN0IHNoYXJwc2xfbmFuZCAqc2hhcnBzbCA9IG10ZF90b19zaGFycHNsKG10ZCk7CisJZWNjX2NvZGVbMF0gPSB+cmVhZGIoc2hhcnBzbC0+aW8gKyBFQ0NMUFVCKTsKKwllY2NfY29kZVsxXSA9IH5yZWFkYihzaGFycHNsLT5pbyArIEVDQ0xQTEIpOworCWVjY19jb2RlWzJdID0gKH5yZWFkYihzaGFycHNsLT5pbyArIEVDQ0NQKSA8PCAyKSB8IDB4MDM7CisJcmV0dXJuIHJlYWRiKHNoYXJwc2wtPmlvICsgRUNDQ05UUikgIT0gMDsKIH0KIAogI2lmZGVmIENPTkZJR19NVERfUEFSVElUSU9OUwotY29uc3QgY2hhciAqcGFydF9wcm9iZXNbXSA9IHsgImNtZGxpbmVwYXJ0IiwgTlVMTCB9Oworc3RhdGljIGNvbnN0IGNoYXIgKnBhcnRfcHJvYmVzW10gPSB7ICJjbWRsaW5lcGFydCIsIE5VTEwgfTsKICNlbmRpZgogCiAvKgogICogTWFpbiBpbml0aWFsaXphdGlvbiByb3V0aW5lCiAgKi8KLXN0YXRpYyBpbnQgX19pbml0IHNoYXJwc2xfbmFuZF9pbml0KHZvaWQpCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzaGFycHNsX25hbmRfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKIAlzdHJ1Y3QgbmFuZF9jaGlwICp0aGlzOworI2lmZGVmIENPTkZJR19NVERfUEFSVElUSU9OUwogCXN0cnVjdCBtdGRfcGFydGl0aW9uICpzaGFycHNsX3BhcnRpdGlvbl9pbmZvOworCWludCBucl9wYXJ0aXRpb25zOworI2VuZGlmCisJc3RydWN0IHJlc291cmNlICpyOwogCWludCBlcnIgPSAwOworCXN0cnVjdCBzaGFycHNsX25hbmQgKnNoYXJwc2w7CisJc3RydWN0IHNoYXJwc2xfbmFuZF9wbGF0Zm9ybV9kYXRhICpkYXRhID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisKKwlpZiAoIWRhdGEpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAibm8gcGxhdGZvcm0gZGF0YSFcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CiAKIAkvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIE1URCBkZXZpY2Ugc3RydWN0dXJlIGFuZCBwcml2YXRlIGRhdGEgKi8KLQlzaGFycHNsX210ZCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBtdGRfaW5mbykgKyBzaXplb2Yoc3RydWN0IG5hbmRfY2hpcCksIEdGUF9LRVJORUwpOwotCWlmICghc2hhcnBzbF9tdGQpIHsKKwlzaGFycHNsID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHNoYXJwc2xfbmFuZCksIEdGUF9LRVJORUwpOworCWlmICghc2hhcnBzbCkgewogCQlwcmludGsoIlVuYWJsZSB0byBhbGxvY2F0ZSBTaGFycFNMIE5BTkQgTVREIGRldmljZSBzdHJ1Y3R1cmUuXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCisJciA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJaWYgKCFyKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIm5vIGlvIG1lbW9yeSByZXNvdXJjZSBkZWZpbmVkIVxuIik7CisJCWVyciA9IC1FTk9ERVY7CisJCWdvdG8gZXJyX2dldF9yZXM7CisJfQorCiAJLyogbWFwIHBoeXNpY2FsIGFkZHJlc3MgKi8KLQlzaGFycHNsX2lvX2Jhc2UgPSBpb3JlbWFwKHNoYXJwc2xfcGh5c19iYXNlLCAweDEwMDApOwotCWlmICghc2hhcnBzbF9pb19iYXNlKSB7CisJc2hhcnBzbC0+aW8gPSBpb3JlbWFwKHItPnN0YXJ0LCByZXNvdXJjZV9zaXplKHIpKTsKKwlpZiAoIXNoYXJwc2wtPmlvKSB7CiAJCXByaW50aygiaW9yZW1hcCB0byBhY2Nlc3MgU2hhcnAgU0wgTkFORCBjaGlwIGZhaWxlZFxuIik7Ci0JCWtmcmVlKHNoYXJwc2xfbXRkKTsKLQkJcmV0dXJuIC1FSU87CisJCWVyciA9IC1FSU87CisJCWdvdG8gZXJyX2lvcmVtYXA7CiAJfQogCiAJLyogR2V0IHBvaW50ZXIgdG8gcHJpdmF0ZSBkYXRhICovCi0JdGhpcyA9IChzdHJ1Y3QgbmFuZF9jaGlwICopKCZzaGFycHNsX210ZFsxXSk7Ci0KLQkvKiBJbml0aWFsaXplIHN0cnVjdHVyZXMgKi8KLQltZW1zZXQoc2hhcnBzbF9tdGQsIDAsIHNpemVvZihzdHJ1Y3QgbXRkX2luZm8pKTsKLQltZW1zZXQodGhpcywgMCwgc2l6ZW9mKHN0cnVjdCBuYW5kX2NoaXApKTsKKwl0aGlzID0gKHN0cnVjdCBuYW5kX2NoaXAgKikoJnNoYXJwc2wtPmNoaXApOwogCiAJLyogTGluayB0aGUgcHJpdmF0ZSBkYXRhIHdpdGggdGhlIE1URCBzdHJ1Y3R1cmUgKi8KLQlzaGFycHNsX210ZC0+cHJpdiA9IHRoaXM7Ci0Jc2hhcnBzbF9tdGQtPm93bmVyID0gVEhJU19NT0RVTEU7CisJc2hhcnBzbC0+bXRkLnByaXYgPSB0aGlzOworCXNoYXJwc2wtPm10ZC5vd25lciA9IFRISVNfTU9EVUxFOworCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgc2hhcnBzbCk7CiAKIAkvKgogCSAqIFBYQSBpbml0aWFsaXplCiAJICovCi0Jd3JpdGViKHJlYWRiKEZMQVNIQ1RMKSB8IEZMV1AsIEZMQVNIQ1RMKTsKKwl3cml0ZWIocmVhZGIoc2hhcnBzbC0+aW8gKyBGTEFTSENUTCkgfCBGTFdQLCBzaGFycHNsLT5pbyArIEZMQVNIQ1RMKTsKIAogCS8qIFNldCBhZGRyZXNzIG9mIE5BTkQgSU8gbGluZXMgKi8KLQl0aGlzLT5JT19BRERSX1IgPSBGTEFTSElPOwotCXRoaXMtPklPX0FERFJfVyA9IEZMQVNISU87CisJdGhpcy0+SU9fQUREUl9SID0gc2hhcnBzbC0+aW8gKyBGTEFTSElPOworCXRoaXMtPklPX0FERFJfVyA9IHNoYXJwc2wtPmlvICsgRkxBU0hJTzsKIAkvKiBTZXQgYWRkcmVzcyBvZiBoYXJkd2FyZSBjb250cm9sIGZ1bmN0aW9uICovCiAJdGhpcy0+Y21kX2N0cmwgPSBzaGFycHNsX25hbmRfaHdjb250cm9sOwogCXRoaXMtPmRldl9yZWFkeSA9IHNoYXJwc2xfbmFuZF9kZXZfcmVhZHk7CkBAIC0xOTksNjggKzE3NSw4OSBAQAogCXRoaXMtPmVjYy5tb2RlID0gTkFORF9FQ0NfSFc7CiAJdGhpcy0+ZWNjLnNpemUgPSAyNTY7CiAJdGhpcy0+ZWNjLmJ5dGVzID0gMzsKLQl0aGlzLT5iYWRibG9ja19wYXR0ZXJuID0gJnNoYXJwc2xfYmJ0OwotCWlmIChtYWNoaW5lX2lzX2FraXRhKCkgfHwgbWFjaGluZV9pc19ib3J6b2koKSkgewotCQl0aGlzLT5iYWRibG9ja19wYXR0ZXJuID0gJnNoYXJwc2xfYWtpdGFfYmJ0OwotCQl0aGlzLT5lY2MubGF5b3V0ID0gJmFraXRhX29vYmluZm87Ci0JfQorCXRoaXMtPmJhZGJsb2NrX3BhdHRlcm4gPSBkYXRhLT5iYWRibG9ja19wYXR0ZXJuOworCXRoaXMtPmVjYy5sYXlvdXQgPSBkYXRhLT5lY2NfbGF5b3V0OwogCXRoaXMtPmVjYy5od2N0bCA9IHNoYXJwc2xfbmFuZF9lbmFibGVfaHdlY2M7CiAJdGhpcy0+ZWNjLmNhbGN1bGF0ZSA9IHNoYXJwc2xfbmFuZF9jYWxjdWxhdGVfZWNjOwogCXRoaXMtPmVjYy5jb3JyZWN0ID0gbmFuZF9jb3JyZWN0X2RhdGE7CiAKIAkvKiBTY2FuIHRvIGZpbmQgZXhpc3RlbmNlIG9mIHRoZSBkZXZpY2UgKi8KLQllcnIgPSBuYW5kX3NjYW4oc2hhcnBzbF9tdGQsIDEpOwotCWlmIChlcnIpIHsKLQkJaW91bm1hcChzaGFycHNsX2lvX2Jhc2UpOwotCQlrZnJlZShzaGFycHNsX210ZCk7Ci0JCXJldHVybiBlcnI7Ci0JfQorCWVyciA9IG5hbmRfc2Nhbigmc2hhcnBzbC0+bXRkLCAxKTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycl9zY2FuOwogCiAJLyogUmVnaXN0ZXIgdGhlIHBhcnRpdGlvbnMgKi8KLQlzaGFycHNsX210ZC0+bmFtZSA9ICJzaGFycHNsLW5hbmQiOwotCW5yX3BhcnRpdGlvbnMgPSBwYXJzZV9tdGRfcGFydGl0aW9ucyhzaGFycHNsX210ZCwgcGFydF9wcm9iZXMsICZzaGFycHNsX3BhcnRpdGlvbl9pbmZvLCAwKTsKLQorCXNoYXJwc2wtPm10ZC5uYW1lID0gInNoYXJwc2wtbmFuZCI7CisjaWZkZWYgQ09ORklHX01URF9QQVJUSVRJT05TCisJbnJfcGFydGl0aW9ucyA9IHBhcnNlX210ZF9wYXJ0aXRpb25zKCZzaGFycHNsLT5tdGQsIHBhcnRfcHJvYmVzLCAmc2hhcnBzbF9wYXJ0aXRpb25faW5mbywgMCk7CiAJaWYgKG5yX3BhcnRpdGlvbnMgPD0gMCkgewotCQlucl9wYXJ0aXRpb25zID0gREVGQVVMVF9OVU1fUEFSVElUSU9OUzsKLQkJc2hhcnBzbF9wYXJ0aXRpb25faW5mbyA9IHNoYXJwc2xfbmFuZF9kZWZhdWx0X3BhcnRpdGlvbl9pbmZvOwotCQlpZiAobWFjaGluZV9pc19wb29kbGUoKSkgewotCQkJc2hhcnBzbF9wYXJ0aXRpb25faW5mb1sxXS5zaXplID0gMjIgKiAxMDI0ICogMTAyNDsKLQkJfSBlbHNlIGlmIChtYWNoaW5lX2lzX2NvcmdpKCkgfHwgbWFjaGluZV9pc19zaGVwaGVyZCgpKSB7Ci0JCQlzaGFycHNsX3BhcnRpdGlvbl9pbmZvWzFdLnNpemUgPSAyNSAqIDEwMjQgKiAxMDI0OwotCQl9IGVsc2UgaWYgKG1hY2hpbmVfaXNfaHVza3koKSkgewotCQkJc2hhcnBzbF9wYXJ0aXRpb25faW5mb1sxXS5zaXplID0gNTMgKiAxMDI0ICogMTAyNDsKLQkJfSBlbHNlIGlmIChtYWNoaW5lX2lzX3NwaXR6KCkpIHsKLQkJCXNoYXJwc2xfcGFydGl0aW9uX2luZm9bMV0uc2l6ZSA9IDUgKiAxMDI0ICogMTAyNDsKLQkJfSBlbHNlIGlmIChtYWNoaW5lX2lzX2FraXRhKCkpIHsKLQkJCXNoYXJwc2xfcGFydGl0aW9uX2luZm9bMV0uc2l6ZSA9IDU4ICogMTAyNCAqIDEwMjQ7Ci0JCX0gZWxzZSBpZiAobWFjaGluZV9pc19ib3J6b2koKSkgewotCQkJc2hhcnBzbF9wYXJ0aXRpb25faW5mb1sxXS5zaXplID0gMzIgKiAxMDI0ICogMTAyNDsKLQkJfQorCQlucl9wYXJ0aXRpb25zID0gZGF0YS0+bnJfcGFydGl0aW9uczsKKwkJc2hhcnBzbF9wYXJ0aXRpb25faW5mbyA9IGRhdGEtPnBhcnRpdGlvbnM7CiAJfQogCi0JYWRkX210ZF9wYXJ0aXRpb25zKHNoYXJwc2xfbXRkLCBzaGFycHNsX3BhcnRpdGlvbl9pbmZvLCBucl9wYXJ0aXRpb25zKTsKKwlpZiAobnJfcGFydGl0aW9ucyA+IDApCisJCWVyciA9IGFkZF9tdGRfcGFydGl0aW9ucygmc2hhcnBzbC0+bXRkLCBzaGFycHNsX3BhcnRpdGlvbl9pbmZvLCBucl9wYXJ0aXRpb25zKTsKKwllbHNlCisjZW5kaWYKKwllcnIgPSBhZGRfbXRkX2RldmljZSgmc2hhcnBzbC0+bXRkKTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycl9hZGQ7CiAKIAkvKiBSZXR1cm4gaGFwcHkgKi8KIAlyZXR1cm4gMDsKLX0KIAotbW9kdWxlX2luaXQoc2hhcnBzbF9uYW5kX2luaXQpOworZXJyX2FkZDoKKwluYW5kX3JlbGVhc2UoJnNoYXJwc2wtPm10ZCk7CisKK2Vycl9zY2FuOgorCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCWlvdW5tYXAoc2hhcnBzbC0+aW8pOworZXJyX2lvcmVtYXA6CitlcnJfZ2V0X3JlczoKKwlrZnJlZShzaGFycHNsKTsKKwlyZXR1cm4gZXJyOworfQogCiAvKgogICogQ2xlYW4gdXAgcm91dGluZQogICovCi1zdGF0aWMgdm9pZCBfX2V4aXQgc2hhcnBzbF9uYW5kX2NsZWFudXAodm9pZCkKK3N0YXRpYyBpbnQgX19kZXZleGl0IHNoYXJwc2xfbmFuZF9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKLQkvKiBSZWxlYXNlIHJlc291cmNlcywgdW5yZWdpc3RlciBkZXZpY2UgKi8KLQluYW5kX3JlbGVhc2Uoc2hhcnBzbF9tdGQpOworCXN0cnVjdCBzaGFycHNsX25hbmQgKnNoYXJwc2wgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKIAotCWlvdW5tYXAoc2hhcnBzbF9pb19iYXNlKTsKKwkvKiBSZWxlYXNlIHJlc291cmNlcywgdW5yZWdpc3RlciBkZXZpY2UgKi8KKwluYW5kX3JlbGVhc2UoJnNoYXJwc2wtPm10ZCk7CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKworCWlvdW5tYXAoc2hhcnBzbC0+aW8pOwogCiAJLyogRnJlZSB0aGUgTVREIGRldmljZSBzdHJ1Y3R1cmUgKi8KLQlrZnJlZShzaGFycHNsX210ZCk7CisJa2ZyZWUoc2hhcnBzbCk7CisKKwlyZXR1cm4gMDsKIH0KIAotbW9kdWxlX2V4aXQoc2hhcnBzbF9uYW5kX2NsZWFudXApOworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgc2hhcnBzbF9uYW5kX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZQk9ICJzaGFycHNsLW5hbmQiLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwl9LAorCS5wcm9iZQkJPSBzaGFycHNsX25hbmRfcHJvYmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChzaGFycHNsX25hbmRfcmVtb3ZlKSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHNoYXJwc2xfbmFuZF9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3Rlcigmc2hhcnBzbF9uYW5kX2RyaXZlcik7Cit9Cittb2R1bGVfaW5pdChzaGFycHNsX25hbmRfaW5pdCk7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBzaGFycHNsX25hbmRfZXhpdCh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZzaGFycHNsX25hbmRfZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KHNoYXJwc2xfbmFuZF9leGl0KTsKIAogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogTU9EVUxFX0FVVEhPUigiUmljaGFyZCBQdXJkaWUgPHJwdXJkaWVAcnBzeXMubmV0PiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbmZ0bGNvcmUuYyBiL2RyaXZlcnMvbXRkL25mdGxjb3JlLmMKaW5kZXggMzIwYjkyOS4uZDFjNDU0NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbmZ0bGNvcmUuYworKysgYi9kcml2ZXJzL210ZC9uZnRsY29yZS5jCkBAIC0zOSw3ICszOSw3IEBACiAJc3RydWN0IE5GVExyZWNvcmQgKm5mdGw7CiAJdW5zaWduZWQgbG9uZyB0ZW1wOwogCi0JaWYgKG10ZC0+dHlwZSAhPSBNVERfTkFOREZMQVNIKQorCWlmIChtdGQtPnR5cGUgIT0gTVREX05BTkRGTEFTSCB8fCBtdGQtPnNpemUgPiBVSU5UX01BWCkKIAkJcmV0dXJuOwogCS8qIE9LLCB0aGlzIGlzIG1vZGVyYXRlbHkgdWdseS4gIEJ1dCBwcm9iYWJseSBzYWZlLiAgQWx0ZXJuYXRpdmVzPyAqLwogCWlmIChtZW1jbXAobXRkLT5uYW1lLCAiRGlza09uQ2hpcCIsIDEwKSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL25mdGxtb3VudC5jIGIvZHJpdmVycy9tdGQvbmZ0bG1vdW50LmMKaW5kZXggY2NjNGYyMC4uOGIyMmIxOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbmZ0bG1vdW50LmMKKysrIGIvZHJpdmVycy9tdGQvbmZ0bG1vdW50LmMKQEAgLTUxLDcgKzUxLDcgQEAKIAkgICB0aGUgbXRkIGRldmljZSBhY2NvcmRpbmdseS4gIFdlIGNvdWxkIGV2ZW4gZ2V0IHJpZCBvZgogCSAgIG5mdGwtPkVyYXNlU2l6ZSBpZiB0aGVyZSB3ZXJlIGFueSBwb2ludCBpbiBkb2luZyBzby4gKi8KIAluZnRsLT5FcmFzZVNpemUgPSBuZnRsLT5tYmQubXRkLT5lcmFzZXNpemU7Ci0gICAgICAgIG5mdGwtPm5iX2Jsb2NrcyA9IG5mdGwtPm1iZC5tdGQtPnNpemUgLyBuZnRsLT5FcmFzZVNpemU7CisgICAgICAgIG5mdGwtPm5iX2Jsb2NrcyA9ICh1MzIpbmZ0bC0+bWJkLm10ZC0+c2l6ZSAvIG5mdGwtPkVyYXNlU2l6ZTsKIAogCW5mdGwtPk1lZGlhVW5pdCA9IEJMT0NLX05JTDsKIAluZnRsLT5TcGFyZU1lZGlhVW5pdCA9IEJMT0NLX05JTDsKQEAgLTE2OCw3ICsxNjgsNyBAQAogCQkJcHJpbnRrKEtFUk5fTk9USUNFICJXQVJOSU5HOiBTdXBwb3J0IGZvciBORlRMIHdpdGggVW5pdFNpemVGYWN0b3IgMHglMDJ4IGlzIGV4cGVyaW1lbnRhbFxuIiwKIAkJCSAgICAgICBtaC0+VW5pdFNpemVGYWN0b3IpOwogCQkJbmZ0bC0+RXJhc2VTaXplID0gbmZ0bC0+bWJkLm10ZC0+ZXJhc2VzaXplIDw8ICgweGZmIC0gbWgtPlVuaXRTaXplRmFjdG9yKTsKLQkJCW5mdGwtPm5iX2Jsb2NrcyA9IG5mdGwtPm1iZC5tdGQtPnNpemUgLyBuZnRsLT5FcmFzZVNpemU7CisJCQluZnRsLT5uYl9ibG9ja3MgPSAodTMyKW5mdGwtPm1iZC5tdGQtPnNpemUgLyBuZnRsLT5FcmFzZVNpemU7CiAJCX0KICNlbmRpZgogCQluZnRsLT5uYl9ib290X2Jsb2NrcyA9IGxlMTZfdG9fY3B1KG1oLT5GaXJzdFBoeXNpY2FsRVVOKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL29uZW5hbmQvb25lbmFuZF9iYXNlLmMgYi9kcml2ZXJzL210ZC9vbmVuYW5kL29uZW5hbmRfYmFzZS5jCmluZGV4IDkwZWQzMTkuLjUyOWFmMjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL29uZW5hbmQvb25lbmFuZF9iYXNlLmMKKysrIGIvZHJpdmVycy9tdGQvb25lbmFuZC9vbmVuYW5kX2Jhc2UuYwpAQCAtMTc3Miw3ICsxNzcyLDcgQEAKIAlpbnQgbGVuOwogCWludCByZXQgPSAwOwogCi0JREVCVUcoTVREX0RFQlVHX0xFVkVMMywgIm9uZW5hbmRfZXJhc2U6IHN0YXJ0ID0gMHglMDh4LCBsZW4gPSAlaVxuIiwgKHVuc2lnbmVkIGludCkgaW5zdHItPmFkZHIsICh1bnNpZ25lZCBpbnQpIGluc3RyLT5sZW4pOworCURFQlVHKE1URF9ERUJVR19MRVZFTDMsICJvbmVuYW5kX2VyYXNlOiBzdGFydCA9IDB4JTAxMmxseCwgbGVuID0gJWxsdVxuIiwgKHVuc2lnbmVkIGxvbmcgbG9uZykgaW5zdHItPmFkZHIsICh1bnNpZ25lZCBsb25nIGxvbmcpIGluc3RyLT5sZW4pOwogCiAJYmxvY2tfc2l6ZSA9ICgxIDw8IHRoaXMtPmVyYXNlX3NoaWZ0KTsKIApAQCAtMTgxMCw3ICsxODEwLDcgQEAKIAogCQkvKiBDaGVjayBpZiB3ZSBoYXZlIGEgYmFkIGJsb2NrLCB3ZSBkbyBub3QgZXJhc2UgYmFkIGJsb2NrcyAqLwogCQlpZiAob25lbmFuZF9ibG9ja19pc2JhZF9ub2xvY2sobXRkLCBhZGRyLCAwKSkgewotCQkJcHJpbnRrIChLRVJOX1dBUk5JTkcgIm9uZW5hbmRfZXJhc2U6IGF0dGVtcHQgdG8gZXJhc2UgYSBiYWQgYmxvY2sgYXQgYWRkciAweCUwOHhcbiIsICh1bnNpZ25lZCBpbnQpIGFkZHIpOworCQkJcHJpbnRrIChLRVJOX1dBUk5JTkcgIm9uZW5hbmRfZXJhc2U6IGF0dGVtcHQgdG8gZXJhc2UgYSBiYWQgYmxvY2sgYXQgYWRkciAweCUwMTJsbHhcbiIsICh1bnNpZ25lZCBsb25nIGxvbmcpIGFkZHIpOwogCQkJaW5zdHItPnN0YXRlID0gTVREX0VSQVNFX0ZBSUxFRDsKIAkJCWdvdG8gZXJhc2VfZXhpdDsKIAkJfQpAQCAtMjAyOSw3ICsyMDI5LDcgQEAKICAqCiAgKiBMb2NrIG9uZSBvciBtb3JlIGJsb2NrcwogICovCi1zdGF0aWMgaW50IG9uZW5hbmRfbG9jayhzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgbG9mZl90IG9mcywgc2l6ZV90IGxlbikKK3N0YXRpYyBpbnQgb25lbmFuZF9sb2NrKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBsb2ZmX3Qgb2ZzLCB1aW50NjRfdCBsZW4pCiB7CiAJaW50IHJldDsKIApAQCAtMjA0Nyw3ICsyMDQ3LDcgQEAKICAqCiAgKiBVbmxvY2sgb25lIG9yIG1vcmUgYmxvY2tzCiAgKi8KLXN0YXRpYyBpbnQgb25lbmFuZF91bmxvY2soc3RydWN0IG10ZF9pbmZvICptdGQsIGxvZmZfdCBvZnMsIHNpemVfdCBsZW4pCitzdGF0aWMgaW50IG9uZW5hbmRfdW5sb2NrKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBsb2ZmX3Qgb2ZzLCB1aW50NjRfdCBsZW4pCiB7CiAJaW50IHJldDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvcmZkX2Z0bC5jIGIvZHJpdmVycy9tdGQvcmZkX2Z0bC5jCmluZGV4IGU1MzhjMGEuLmQyYWE5YzQ2IDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9yZmRfZnRsLmMKKysrIGIvZHJpdmVycy9tdGQvcmZkX2Z0bC5jCkBAIC0yMSw4ICsyMSw2IEBACiAKICNpbmNsdWRlIDxhc20vdHlwZXMuaD4KIAotI2RlZmluZSBjb25zdF9jcHVfdG9fbGUxNglfX2NvbnN0YW50X2NwdV90b19sZTE2Ci0KIHN0YXRpYyBpbnQgYmxvY2tfc2l6ZSA9IDA7CiBtb2R1bGVfcGFyYW0oYmxvY2tfc2l6ZSwgaW50LCAwKTsKIE1PRFVMRV9QQVJNX0RFU0MoYmxvY2tfc2l6ZSwgIkJsb2NrIHNpemUgdG8gdXNlIGJ5IFJGRCwgZGVmYXVsdHMgdG8gZXJhc2UgdW5pdCBzaXplIik7CkBAIC0xNTYsNyArMTU0LDcgQEAKIAlzaXplX3QgcmV0bGVuOwogCiAJc2VjdG9yc19wZXJfYmxvY2sgPSBwYXJ0LT5ibG9ja19zaXplIC8gU0VDVE9SX1NJWkU7Ci0JcGFydC0+dG90YWxfYmxvY2tzID0gcGFydC0+bWJkLm10ZC0+c2l6ZSAvIHBhcnQtPmJsb2NrX3NpemU7CisJcGFydC0+dG90YWxfYmxvY2tzID0gKHUzMilwYXJ0LT5tYmQubXRkLT5zaXplIC8gcGFydC0+YmxvY2tfc2l6ZTsKIAogCWlmIChwYXJ0LT50b3RhbF9ibG9ja3MgPCAyKQogCQlyZXR1cm4gLUVOT0VOVDsKQEAgLTI3NiwxNiArMjc0LDE3IEBACiAKIAlwYXJ0ID0gKHN0cnVjdCBwYXJ0aXRpb24qKWVyYXNlLT5wcml2OwogCi0JaSA9IGVyYXNlLT5hZGRyIC8gcGFydC0+YmxvY2tfc2l6ZTsKLQlpZiAoaSA+PSBwYXJ0LT50b3RhbF9ibG9ja3MgfHwgcGFydC0+YmxvY2tzW2ldLm9mZnNldCAhPSBlcmFzZS0+YWRkcikgewotCQlwcmludGsoS0VSTl9FUlIgUFJFRklYICJlcmFzZSBjYWxsYmFjayBmb3IgdW5rbm93biBvZmZzZXQgJXggIgotCQkJCSJvbiAnJXMnXG4iLCBlcmFzZS0+YWRkciwgcGFydC0+bWJkLm10ZC0+bmFtZSk7CisJaSA9ICh1MzIpZXJhc2UtPmFkZHIgLyBwYXJ0LT5ibG9ja19zaXplOworCWlmIChpID49IHBhcnQtPnRvdGFsX2Jsb2NrcyB8fCBwYXJ0LT5ibG9ja3NbaV0ub2Zmc2V0ICE9IGVyYXNlLT5hZGRyIHx8CisJICAgIGVyYXNlLT5hZGRyID4gVUlOVF9NQVgpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBSRUZJWCAiZXJhc2UgY2FsbGJhY2sgZm9yIHVua25vd24gb2Zmc2V0ICVsbHggIgorCQkJCSJvbiAnJXMnXG4iLCAodW5zaWduZWQgbG9uZyBsb25nKWVyYXNlLT5hZGRyLCBwYXJ0LT5tYmQubXRkLT5uYW1lKTsKIAkJcmV0dXJuOwogCX0KIAogCWlmIChlcmFzZS0+c3RhdGUgIT0gTVREX0VSQVNFX0RPTkUpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyBQUkVGSVggImVyYXNlIGZhaWxlZCBhdCAweCV4IG9uICclcycsICIKLQkJCQkic3RhdGUgJWRcbiIsIGVyYXNlLT5hZGRyLAorCQlwcmludGsoS0VSTl9XQVJOSU5HIFBSRUZJWCAiZXJhc2UgZmFpbGVkIGF0IDB4JWxseCBvbiAnJXMnLCAiCisJCQkJInN0YXRlICVkXG4iLCAodW5zaWduZWQgbG9uZyBsb25nKWVyYXNlLT5hZGRyLAogCQkJCXBhcnQtPm1iZC5tdGQtPm5hbWUsIGVyYXNlLT5zdGF0ZSk7CiAKIAkJcGFydC0+YmxvY2tzW2ldLnN0YXRlID0gQkxPQ0tfRkFJTEVEOwpAQCAtMjk3LDcgKzI5Niw3IEBACiAJCXJldHVybjsKIAl9CiAKLQltYWdpYyA9IGNvbnN0X2NwdV90b19sZTE2KFJGRF9NQUdJQyk7CisJbWFnaWMgPSBjcHVfdG9fbGUxNihSRkRfTUFHSUMpOwogCiAJcGFydC0+YmxvY2tzW2ldLnN0YXRlID0gQkxPQ0tfRVJBU0VEOwogCXBhcnQtPmJsb2Nrc1tpXS5mcmVlX3NlY3RvcnMgPSBwYXJ0LT5kYXRhX3NlY3RvcnNfcGVyX2Jsb2NrOwpAQCAtMzQ1LDkgKzM0NCw5IEBACiAJcmMgPSBwYXJ0LT5tYmQubXRkLT5lcmFzZShwYXJ0LT5tYmQubXRkLCBlcmFzZSk7CiAKIAlpZiAocmMpIHsKLQkJcHJpbnRrKEtFUk5fRVJSIFBSRUZJWCAiZXJhc2Ugb2YgcmVnaW9uICV4LCV4IG9uICclcycgIgotCQkJCSJmYWlsZWRcbiIsIGVyYXNlLT5hZGRyLCBlcmFzZS0+bGVuLAotCQkJCXBhcnQtPm1iZC5tdGQtPm5hbWUpOworCQlwcmludGsoS0VSTl9FUlIgUFJFRklYICJlcmFzZSBvZiByZWdpb24gJWxseCwlbGx4IG9uICclcycgIgorCQkJCSJmYWlsZWRcbiIsICh1bnNpZ25lZCBsb25nIGxvbmcpZXJhc2UtPmFkZHIsCisJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZyllcmFzZS0+bGVuLCBwYXJ0LT5tYmQubXRkLT5uYW1lKTsKIAkJa2ZyZWUoZXJhc2UpOwogCX0KIApAQCAtNTg3LDcgKzU4Niw3IEBACiAJaW50IGJsb2NrLCBvZmZzZXQsIHJjOwogCXVfbG9uZyBhZGRyOwogCXNpemVfdCByZXRsZW47Ci0JdTE2IGRlbCA9IGNvbnN0X2NwdV90b19sZTE2KFNFQ1RPUl9ERUxFVEVEKTsKKwl1MTYgZGVsID0gY3B1X3RvX2xlMTYoU0VDVE9SX0RFTEVURUQpOwogCiAJYmxvY2sgPSBvbGRfYWRkciAvIHBhcnQtPmJsb2NrX3NpemU7CiAJb2Zmc2V0ID0gKG9sZF9hZGRyICUgcGFydC0+YmxvY2tfc2l6ZSkgLyBTRUNUT1JfU0laRSAtCkBAIC03NjMsNyArNzYyLDcgQEAKIHsKIAlzdHJ1Y3QgcGFydGl0aW9uICpwYXJ0OwogCi0JaWYgKG10ZC0+dHlwZSAhPSBNVERfTk9SRkxBU0gpCisJaWYgKG10ZC0+dHlwZSAhPSBNVERfTk9SRkxBU0ggfHwgbXRkLT5zaXplID4gVUlOVF9NQVgpCiAJCXJldHVybjsKIAogCXBhcnQgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcGFydGl0aW9uKSwgR0ZQX0tFUk5FTCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9zc2ZkYy5jIGIvZHJpdmVycy9tdGQvc3NmZGMuYwppbmRleCAzM2E1ZDZlLi4zZjY3ZTAwIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9zc2ZkYy5jCisrKyBiL2RyaXZlcnMvbXRkL3NzZmRjLmMKQEAgLTI5NCw3ICsyOTQsOCBAQAogCWludCBjaXNfc2VjdG9yOwogCiAJLyogQ2hlY2sgZm9yIHNtYWxsIHBhZ2UgTkFORCBmbGFzaCAqLwotCWlmIChtdGQtPnR5cGUgIT0gTVREX05BTkRGTEFTSCB8fCBtdGQtPm9vYnNpemUgIT0gT09CX1NJWkUpCisJaWYgKG10ZC0+dHlwZSAhPSBNVERfTkFOREZMQVNIIHx8IG10ZC0+b29ic2l6ZSAhPSBPT0JfU0laRSB8fAorCSAgICBtdGQtPnNpemUgPiBVSU5UX01BWCkKIAkJcmV0dXJuOwogCiAJLyogQ2hlY2sgZm9yIFNTREZDIGZvcm1hdCBieSByZWFkaW5nIENJUy9JREkgc2VjdG9yICovCkBAIC0zMTYsNyArMzE3LDcgQEAKIAogCXNzZmRjLT5jaXNfYmxvY2sgPSBjaXNfc2VjdG9yIC8gKG10ZC0+ZXJhc2VzaXplID4+IFNFQ1RPUl9TSElGVCk7CiAJc3NmZGMtPmVyYXNlX3NpemUgPSBtdGQtPmVyYXNlc2l6ZTsKLQlzc2ZkYy0+bWFwX2xlbiA9IG10ZC0+c2l6ZSAvIG10ZC0+ZXJhc2VzaXplOworCXNzZmRjLT5tYXBfbGVuID0gKHUzMiltdGQtPnNpemUgLyBtdGQtPmVyYXNlc2l6ZTsKIAogCURFQlVHKE1URF9ERUJVR19MRVZFTDEsCiAJCSJTU0ZEQ19STzogY2lzX2Jsb2NrPSVkLGVyYXNlX3NpemU9JWQsbWFwX2xlbj0lZCxuX3pvbmVzPSVkXG4iLApAQCAtMzI3LDcgKzMyOCw3IEBACiAJc3NmZGMtPmhlYWRzID0gMTY7CiAJc3NmZGMtPnNlY3RvcnMgPSAzMjsKIAlnZXRfY2hzKG10ZC0+c2l6ZSwgTlVMTCwgJnNzZmRjLT5oZWFkcywgJnNzZmRjLT5zZWN0b3JzKTsKLQlzc2ZkYy0+Y3lsaW5kZXJzID0gKHVuc2lnbmVkIHNob3J0KSgobXRkLT5zaXplID4+IFNFQ1RPUl9TSElGVCkgLworCXNzZmRjLT5jeWxpbmRlcnMgPSAodW5zaWduZWQgc2hvcnQpKCgodTMyKW10ZC0+c2l6ZSA+PiBTRUNUT1JfU0hJRlQpIC8KIAkJCSgobG9uZylzc2ZkYy0+c2VjdG9ycyAqIChsb25nKXNzZmRjLT5oZWFkcykpOwogCiAJREVCVUcoTVREX0RFQlVHX0xFVkVMMSwgIlNTRkRDX1JPOiB1c2luZyBDOiVkIEg6JWQgUzolZCA9PSAlbGQgc2VjdHNcbiIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC90ZXN0cy9NYWtlZmlsZSBiL2RyaXZlcnMvbXRkL3Rlc3RzL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxZDUwMTMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL210ZC90ZXN0cy9NYWtlZmlsZQpAQCAtMCwwICsxLDcgQEAKK29iai0kKENPTkZJR19NVERfVEVTVFMpICs9IG10ZF9vb2J0ZXN0Lm8KK29iai0kKENPTkZJR19NVERfVEVTVFMpICs9IG10ZF9wYWdldGVzdC5vCitvYmotJChDT05GSUdfTVREX1RFU1RTKSArPSBtdGRfcmVhZHRlc3Qubworb2JqLSQoQ09ORklHX01URF9URVNUUykgKz0gbXRkX3NwZWVkdGVzdC5vCitvYmotJChDT05GSUdfTVREX1RFU1RTKSArPSBtdGRfc3RyZXNzdGVzdC5vCitvYmotJChDT05GSUdfTVREX1RFU1RTKSArPSBtdGRfc3VicGFnZXRlc3Qubworb2JqLSQoQ09ORklHX01URF9URVNUUykgKz0gbXRkX3RvcnR1cmV0ZXN0Lm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL3Rlc3RzL210ZF9vb2J0ZXN0LmMgYi9kcml2ZXJzL210ZC90ZXN0cy9tdGRfb29idGVzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmYmMzZjgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL210ZC90ZXN0cy9tdGRfb29idGVzdC5jCkBAIC0wLDAgKzEsNzQyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA2LTIwMDggTm9raWEgQ29ycG9yYXRpb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIFRlc3QgT09CIHJlYWQgYW5kIHdyaXRlIG9uIE1URCBkZXZpY2UuCisgKgorICogQXV0aG9yOiBBZHJpYW4gSHVudGVyIDxleHQtYWRyaWFuLmh1bnRlckBub2tpYS5jb20+CisgKi8KKworI2luY2x1ZGUgPGFzbS9kaXY2NC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L210ZC9tdGQuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorCisjZGVmaW5lIFBSSU5UX1BSRUYgS0VSTl9JTkZPICJtdGRfb29idGVzdDogIgorCitzdGF0aWMgaW50IGRldjsKK21vZHVsZV9wYXJhbShkZXYsIGludCwgU19JUlVHTyk7CitNT0RVTEVfUEFSTV9ERVNDKGRldiwgIk1URCBkZXZpY2UgbnVtYmVyIHRvIHVzZSIpOworCitzdGF0aWMgc3RydWN0IG10ZF9pbmZvICptdGQ7CitzdGF0aWMgdW5zaWduZWQgY2hhciAqcmVhZGJ1ZjsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyICp3cml0ZWJ1ZjsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyICpiYnQ7CisKK3N0YXRpYyBpbnQgZWJjbnQ7CitzdGF0aWMgaW50IHBnY250Oworc3RhdGljIGludCBlcnJjbnQ7CitzdGF0aWMgaW50IHVzZV9vZmZzZXQ7CitzdGF0aWMgaW50IHVzZV9sZW47CitzdGF0aWMgaW50IHVzZV9sZW5fbWF4Oworc3RhdGljIGludCB2YXJ5X29mZnNldDsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIG5leHQgPSAxOworCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBzaW1wbGVfcmFuZCh2b2lkKQoreworCW5leHQgPSBuZXh0ICogMTEwMzUxNTI0NSArIDEyMzQ1OworCXJldHVybiAodW5zaWduZWQgaW50KSgobmV4dCAvIDY1NTM2KSAlIDMyNzY4KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNpbXBsZV9zcmFuZCh1bnNpZ25lZCBsb25nIHNlZWQpCit7CisJbmV4dCA9IHNlZWQ7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9yYW5kb21fZGF0YSh1bnNpZ25lZCBjaGFyICpidWYsIHNpemVfdCBsZW4pCit7CisJc2l6ZV90IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbGVuOyArK2kpCisJCWJ1ZltpXSA9IHNpbXBsZV9yYW5kKCk7Cit9CisKK3N0YXRpYyBpbnQgZXJhc2VfZXJhc2VibG9jayhpbnQgZWJudW0pCit7CisJaW50IGVycjsKKwlzdHJ1Y3QgZXJhc2VfaW5mbyBlaTsKKwlsb2ZmX3QgYWRkciA9IGVibnVtICogbXRkLT5lcmFzZXNpemU7CisKKwltZW1zZXQoJmVpLCAwLCBzaXplb2Yoc3RydWN0IGVyYXNlX2luZm8pKTsKKwllaS5tdGQgID0gbXRkOworCWVpLmFkZHIgPSBhZGRyOworCWVpLmxlbiAgPSBtdGQtPmVyYXNlc2l6ZTsKKworCWVyciA9IG10ZC0+ZXJhc2UobXRkLCAmZWkpOworCWlmIChlcnIpIHsKKwkJcHJpbnRrKFBSSU5UX1BSRUYgImVycm9yICVkIHdoaWxlIGVyYXNpbmcgRUIgJWRcbiIsIGVyciwgZWJudW0pOworCQlyZXR1cm4gZXJyOworCX0KKworCWlmIChlaS5zdGF0ZSA9PSBNVERfRVJBU0VfRkFJTEVEKSB7CisJCXByaW50ayhQUklOVF9QUkVGICJzb21lIGVyYXNlIGVycm9yIG9jY3VycmVkIGF0IEVCICVkXG4iLAorCQkgICAgICAgZWJudW0pOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBlcmFzZV93aG9sZV9kZXZpY2Uodm9pZCkKK3sKKwlpbnQgZXJyOworCXVuc2lnbmVkIGludCBpOworCisJcHJpbnRrKFBSSU5UX1BSRUYgImVyYXNpbmcgd2hvbGUgZGV2aWNlXG4iKTsKKwlmb3IgKGkgPSAwOyBpIDwgZWJjbnQ7ICsraSkgeworCQlpZiAoYmJ0W2ldKQorCQkJY29udGludWU7CisJCWVyciA9IGVyYXNlX2VyYXNlYmxvY2soaSk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOworCQljb25kX3Jlc2NoZWQoKTsKKwl9CisJcHJpbnRrKFBSSU5UX1BSRUYgImVyYXNlZCAldSBlcmFzZWJsb2Nrc1xuIiwgaSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGRvX3Zhcnlfb2Zmc2V0KHZvaWQpCit7CisJdXNlX2xlbiAtPSAxOworCWlmICh1c2VfbGVuIDwgMSkgeworCQl1c2Vfb2Zmc2V0ICs9IDE7CisJCWlmICh1c2Vfb2Zmc2V0ID49IHVzZV9sZW5fbWF4KQorCQkJdXNlX29mZnNldCA9IDA7CisJCXVzZV9sZW4gPSB1c2VfbGVuX21heCAtIHVzZV9vZmZzZXQ7CisJfQorfQorCitzdGF0aWMgaW50IHdyaXRlX2VyYXNlYmxvY2soaW50IGVibnVtKQoreworCWludCBpOworCXN0cnVjdCBtdGRfb29iX29wcyBvcHM7CisJaW50IGVyciA9IDA7CisJbG9mZl90IGFkZHIgPSBlYm51bSAqIG10ZC0+ZXJhc2VzaXplOworCisJZm9yIChpID0gMDsgaSA8IHBnY250OyArK2ksIGFkZHIgKz0gbXRkLT53cml0ZXNpemUpIHsKKwkJc2V0X3JhbmRvbV9kYXRhKHdyaXRlYnVmLCB1c2VfbGVuKTsKKwkJb3BzLm1vZGUgICAgICA9IE1URF9PT0JfQVVUTzsKKwkJb3BzLmxlbiAgICAgICA9IDA7CisJCW9wcy5yZXRsZW4gICAgPSAwOworCQlvcHMub29ibGVuICAgID0gdXNlX2xlbjsKKwkJb3BzLm9vYnJldGxlbiA9IDA7CisJCW9wcy5vb2JvZmZzICAgPSB1c2Vfb2Zmc2V0OworCQlvcHMuZGF0YnVmICAgID0gMDsKKwkJb3BzLm9vYmJ1ZiAgICA9IHdyaXRlYnVmOworCQllcnIgPSBtdGQtPndyaXRlX29vYihtdGQsIGFkZHIsICZvcHMpOworCQlpZiAoZXJyIHx8IG9wcy5vb2JyZXRsZW4gIT0gdXNlX2xlbikgeworCQkJcHJpbnRrKFBSSU5UX1BSRUYgImVycm9yOiB3cml0ZW9vYiBmYWlsZWQgYXQgJSNsbHhcbiIsCisJCQkgICAgICAgKGxvbmcgbG9uZylhZGRyKTsKKwkJCXByaW50ayhQUklOVF9QUkVGICJlcnJvcjogdXNlX2xlbiAlZCwgdXNlX29mZnNldCAlZFxuIiwKKwkJCSAgICAgICB1c2VfbGVuLCB1c2Vfb2Zmc2V0KTsKKwkJCWVycmNudCArPSAxOworCQkJcmV0dXJuIGVyciA/IGVyciA6IC0xOworCQl9CisJCWlmICh2YXJ5X29mZnNldCkKKwkJCWRvX3Zhcnlfb2Zmc2V0KCk7CisJfQorCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCB3cml0ZV93aG9sZV9kZXZpY2Uodm9pZCkKK3sKKwlpbnQgZXJyOworCXVuc2lnbmVkIGludCBpOworCisJcHJpbnRrKFBSSU5UX1BSRUYgIndyaXRpbmcgT09CcyBvZiB3aG9sZSBkZXZpY2VcbiIpOworCWZvciAoaSA9IDA7IGkgPCBlYmNudDsgKytpKSB7CisJCWlmIChiYnRbaV0pCisJCQljb250aW51ZTsKKwkJZXJyID0gd3JpdGVfZXJhc2VibG9jayhpKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisJCWlmIChpICUgMjU2ID09IDApCisJCQlwcmludGsoUFJJTlRfUFJFRiAid3JpdHRlbiB1cCB0byBlcmFzZWJsb2NrICV1XG4iLCBpKTsKKwkJY29uZF9yZXNjaGVkKCk7CisJfQorCXByaW50ayhQUklOVF9QUkVGICJ3cml0dGVuICV1IGVyYXNlYmxvY2tzXG4iLCBpKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2ZXJpZnlfZXJhc2VibG9jayhpbnQgZWJudW0pCit7CisJaW50IGk7CisJc3RydWN0IG10ZF9vb2Jfb3BzIG9wczsKKwlpbnQgZXJyID0gMDsKKwlsb2ZmX3QgYWRkciA9IGVibnVtICogbXRkLT5lcmFzZXNpemU7CisKKwlmb3IgKGkgPSAwOyBpIDwgcGdjbnQ7ICsraSwgYWRkciArPSBtdGQtPndyaXRlc2l6ZSkgeworCQlzZXRfcmFuZG9tX2RhdGEod3JpdGVidWYsIHVzZV9sZW4pOworCQlvcHMubW9kZSAgICAgID0gTVREX09PQl9BVVRPOworCQlvcHMubGVuICAgICAgID0gMDsKKwkJb3BzLnJldGxlbiAgICA9IDA7CisJCW9wcy5vb2JsZW4gICAgPSB1c2VfbGVuOworCQlvcHMub29icmV0bGVuID0gMDsKKwkJb3BzLm9vYm9mZnMgICA9IHVzZV9vZmZzZXQ7CisJCW9wcy5kYXRidWYgICAgPSAwOworCQlvcHMub29iYnVmICAgID0gcmVhZGJ1ZjsKKwkJZXJyID0gbXRkLT5yZWFkX29vYihtdGQsIGFkZHIsICZvcHMpOworCQlpZiAoZXJyIHx8IG9wcy5vb2JyZXRsZW4gIT0gdXNlX2xlbikgeworCQkJcHJpbnRrKFBSSU5UX1BSRUYgImVycm9yOiByZWFkb29iIGZhaWxlZCBhdCAlI2xseFxuIiwKKwkJCSAgICAgICAobG9uZyBsb25nKWFkZHIpOworCQkJZXJyY250ICs9IDE7CisJCQlyZXR1cm4gZXJyID8gZXJyIDogLTE7CisJCX0KKwkJaWYgKG1lbWNtcChyZWFkYnVmLCB3cml0ZWJ1ZiwgdXNlX2xlbikpIHsKKwkJCXByaW50ayhQUklOVF9QUkVGICJlcnJvcjogdmVyaWZ5IGZhaWxlZCBhdCAlI2xseFxuIiwKKwkJCSAgICAgICAobG9uZyBsb25nKWFkZHIpOworCQkJZXJyY250ICs9IDE7CisJCQlpZiAoZXJyY250ID4gMTAwMCkgeworCQkJCXByaW50ayhQUklOVF9QUkVGICJlcnJvcjogdG9vIG1hbnkgZXJyb3JzXG4iKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCX0KKwkJaWYgKHVzZV9vZmZzZXQgIT0gMCB8fCB1c2VfbGVuIDwgbXRkLT5lY2NsYXlvdXQtPm9vYmF2YWlsKSB7CisJCQlpbnQgazsKKworCQkJb3BzLm1vZGUgICAgICA9IE1URF9PT0JfQVVUTzsKKwkJCW9wcy5sZW4gICAgICAgPSAwOworCQkJb3BzLnJldGxlbiAgICA9IDA7CisJCQlvcHMub29ibGVuICAgID0gbXRkLT5lY2NsYXlvdXQtPm9vYmF2YWlsOworCQkJb3BzLm9vYnJldGxlbiA9IDA7CisJCQlvcHMub29ib2ZmcyAgID0gMDsKKwkJCW9wcy5kYXRidWYgICAgPSAwOworCQkJb3BzLm9vYmJ1ZiAgICA9IHJlYWRidWY7CisJCQllcnIgPSBtdGQtPnJlYWRfb29iKG10ZCwgYWRkciwgJm9wcyk7CisJCQlpZiAoZXJyIHx8IG9wcy5vb2JyZXRsZW4gIT0gbXRkLT5lY2NsYXlvdXQtPm9vYmF2YWlsKSB7CisJCQkJcHJpbnRrKFBSSU5UX1BSRUYgImVycm9yOiByZWFkb29iIGZhaWxlZCBhdCAiCisJCQkJICAgICAgICIlI2xseFxuIiwgKGxvbmcgbG9uZylhZGRyKTsKKwkJCQllcnJjbnQgKz0gMTsKKwkJCQlyZXR1cm4gZXJyID8gZXJyIDogLTE7CisJCQl9CisJCQlpZiAobWVtY21wKHJlYWRidWYgKyB1c2Vfb2Zmc2V0LCB3cml0ZWJ1ZiwgdXNlX2xlbikpIHsKKwkJCQlwcmludGsoUFJJTlRfUFJFRiAiZXJyb3I6IHZlcmlmeSBmYWlsZWQgYXQgIgorCQkJCSAgICAgICAiJSNsbHhcbiIsIChsb25nIGxvbmcpYWRkcik7CisJCQkJZXJyY250ICs9IDE7CisJCQkJaWYgKGVycmNudCA+IDEwMDApIHsKKwkJCQkJcHJpbnRrKFBSSU5UX1BSRUYgImVycm9yOiB0b28gbWFueSAiCisJCQkJCSAgICAgICAiZXJyb3JzXG4iKTsKKwkJCQkJcmV0dXJuIC0xOworCQkJCX0KKwkJCX0KKwkJCWZvciAoayA9IDA7IGsgPCB1c2Vfb2Zmc2V0OyArK2spCisJCQkJaWYgKHJlYWRidWZba10gIT0gMHhmZikgeworCQkJCQlwcmludGsoUFJJTlRfUFJFRiAiZXJyb3I6IHZlcmlmeSAweGZmICIKKwkJCQkJICAgICAgICJmYWlsZWQgYXQgJSNsbHhcbiIsCisJCQkJCSAgICAgICAobG9uZyBsb25nKWFkZHIpOworCQkJCQllcnJjbnQgKz0gMTsKKwkJCQkJaWYgKGVycmNudCA+IDEwMDApIHsKKwkJCQkJCXByaW50ayhQUklOVF9QUkVGICJlcnJvcjogdG9vICIKKwkJCQkJCSAgICAgICAibWFueSBlcnJvcnNcbiIpOworCQkJCQkJcmV0dXJuIC0xOworCQkJCQl9CisJCQkJfQorCQkJZm9yIChrID0gdXNlX29mZnNldCArIHVzZV9sZW47CisJCQkgICAgIGsgPCBtdGQtPmVjY2xheW91dC0+b29iYXZhaWw7ICsraykKKwkJCQlpZiAocmVhZGJ1ZltrXSAhPSAweGZmKSB7CisJCQkJCXByaW50ayhQUklOVF9QUkVGICJlcnJvcjogdmVyaWZ5IDB4ZmYgIgorCQkJCQkgICAgICAgImZhaWxlZCBhdCAlI2xseFxuIiwKKwkJCQkJICAgICAgIChsb25nIGxvbmcpYWRkcik7CisJCQkJCWVycmNudCArPSAxOworCQkJCQlpZiAoZXJyY250ID4gMTAwMCkgeworCQkJCQkJcHJpbnRrKFBSSU5UX1BSRUYgImVycm9yOiB0b28gIgorCQkJCQkJICAgICAgICJtYW55IGVycm9yc1xuIik7CisJCQkJCQlyZXR1cm4gLTE7CisJCQkJCX0KKwkJCQl9CisJCX0KKwkJaWYgKHZhcnlfb2Zmc2V0KQorCQkJZG9fdmFyeV9vZmZzZXQoKTsKKwl9CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCB2ZXJpZnlfZXJhc2VibG9ja19pbl9vbmVfZ28oaW50IGVibnVtKQoreworCXN0cnVjdCBtdGRfb29iX29wcyBvcHM7CisJaW50IGVyciA9IDA7CisJbG9mZl90IGFkZHIgPSBlYm51bSAqIG10ZC0+ZXJhc2VzaXplOworCXNpemVfdCBsZW4gPSBtdGQtPmVjY2xheW91dC0+b29iYXZhaWwgKiBwZ2NudDsKKworCXNldF9yYW5kb21fZGF0YSh3cml0ZWJ1ZiwgbGVuKTsKKwlvcHMubW9kZSAgICAgID0gTVREX09PQl9BVVRPOworCW9wcy5sZW4gICAgICAgPSAwOworCW9wcy5yZXRsZW4gICAgPSAwOworCW9wcy5vb2JsZW4gICAgPSBsZW47CisJb3BzLm9vYnJldGxlbiA9IDA7CisJb3BzLm9vYm9mZnMgICA9IDA7CisJb3BzLmRhdGJ1ZiAgICA9IDA7CisJb3BzLm9vYmJ1ZiAgICA9IHJlYWRidWY7CisJZXJyID0gbXRkLT5yZWFkX29vYihtdGQsIGFkZHIsICZvcHMpOworCWlmIChlcnIgfHwgb3BzLm9vYnJldGxlbiAhPSBsZW4pIHsKKwkJcHJpbnRrKFBSSU5UX1BSRUYgImVycm9yOiByZWFkb29iIGZhaWxlZCBhdCAlI2xseFxuIiwKKwkJICAgICAgIChsb25nIGxvbmcpYWRkcik7CisJCWVycmNudCArPSAxOworCQlyZXR1cm4gZXJyID8gZXJyIDogLTE7CisJfQorCWlmIChtZW1jbXAocmVhZGJ1Ziwgd3JpdGVidWYsIGxlbikpIHsKKwkJcHJpbnRrKFBSSU5UX1BSRUYgImVycm9yOiB2ZXJpZnkgZmFpbGVkIGF0ICUjbGx4XG4iLAorCQkgICAgICAgKGxvbmcgbG9uZylhZGRyKTsKKwkJZXJyY250ICs9IDE7CisJCWlmIChlcnJjbnQgPiAxMDAwKSB7CisJCQlwcmludGsoUFJJTlRfUFJFRiAiZXJyb3I6IHRvbyBtYW55IGVycm9yc1xuIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHZlcmlmeV9hbGxfZXJhc2VibG9ja3Modm9pZCkKK3sKKwlpbnQgZXJyOworCXVuc2lnbmVkIGludCBpOworCisJcHJpbnRrKFBSSU5UX1BSRUYgInZlcmlmeWluZyBhbGwgZXJhc2VibG9ja3NcbiIpOworCWZvciAoaSA9IDA7IGkgPCBlYmNudDsgKytpKSB7CisJCWlmIChiYnRbaV0pCisJCQljb250aW51ZTsKKwkJZXJyID0gdmVyaWZ5X2VyYXNlYmxvY2soaSk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOworCQlpZiAoaSAlIDI1NiA9PSAwKQorCQkJcHJpbnRrKFBSSU5UX1BSRUYgInZlcmlmaWVkIHVwIHRvIGVyYXNlYmxvY2sgJXVcbiIsIGkpOworCQljb25kX3Jlc2NoZWQoKTsKKwl9CisJcHJpbnRrKFBSSU5UX1BSRUYgInZlcmlmaWVkICV1IGVyYXNlYmxvY2tzXG4iLCBpKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpc19ibG9ja19iYWQoaW50IGVibnVtKQoreworCWludCByZXQ7CisJbG9mZl90IGFkZHIgPSBlYm51bSAqIG10ZC0+ZXJhc2VzaXplOworCisJcmV0ID0gbXRkLT5ibG9ja19pc2JhZChtdGQsIGFkZHIpOworCWlmIChyZXQpCisJCXByaW50ayhQUklOVF9QUkVGICJibG9jayAlZCBpcyBiYWRcbiIsIGVibnVtKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHNjYW5fZm9yX2JhZF9lcmFzZWJsb2Nrcyh2b2lkKQoreworCWludCBpLCBiYWQgPSAwOworCisJYmJ0ID0ga21hbGxvYyhlYmNudCwgR0ZQX0tFUk5FTCk7CisJaWYgKCFiYnQpIHsKKwkJcHJpbnRrKFBSSU5UX1BSRUYgImVycm9yOiBjYW5ub3QgYWxsb2NhdGUgbWVtb3J5XG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCW1lbXNldChiYnQsIDAgLCBlYmNudCk7CisKKwlwcmludGsoUFJJTlRfUFJFRiAic2Nhbm5pbmcgZm9yIGJhZCBlcmFzZWJsb2Nrc1xuIik7CisJZm9yIChpID0gMDsgaSA8IGViY250OyArK2kpIHsKKwkJYmJ0W2ldID0gaXNfYmxvY2tfYmFkKGkpID8gMSA6IDA7CisJCWlmIChiYnRbaV0pCisJCQliYWQgKz0gMTsKKwkJY29uZF9yZXNjaGVkKCk7CisJfQorCXByaW50ayhQUklOVF9QUkVGICJzY2FubmVkICVkIGVyYXNlYmxvY2tzLCAlZCBhcmUgYmFkXG4iLCBpLCBiYWQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9faW5pdCBtdGRfb29idGVzdF9pbml0KHZvaWQpCit7CisJaW50IGVyciA9IDA7CisJdW5zaWduZWQgaW50IGk7CisJdWludDY0X3QgdG1wOworCXN0cnVjdCBtdGRfb29iX29wcyBvcHM7CisJbG9mZl90IGFkZHIgPSAwLCBhZGRyMDsKKworCXByaW50ayhLRVJOX0lORk8gIlxuIik7CisJcHJpbnRrKEtFUk5fSU5GTyAiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIik7CisJcHJpbnRrKFBSSU5UX1BSRUYgIk1URCBkZXZpY2U6ICVkXG4iLCBkZXYpOworCisJbXRkID0gZ2V0X210ZF9kZXZpY2UoTlVMTCwgZGV2KTsKKwlpZiAoSVNfRVJSKG10ZCkpIHsKKwkJZXJyID0gUFRSX0VSUihtdGQpOworCQlwcmludGsoUFJJTlRfUFJFRiAiZXJyb3I6IGNhbm5vdCBnZXQgTVREIGRldmljZVxuIik7CisJCXJldHVybiBlcnI7CisJfQorCisJaWYgKG10ZC0+dHlwZSAhPSBNVERfTkFOREZMQVNIKSB7CisJCXByaW50ayhQUklOVF9QUkVGICJ0aGlzIHRlc3QgcmVxdWlyZXMgTkFORCBmbGFzaFxuIik7CisJCWdvdG8gb3V0OworCX0KKworCXRtcCA9IG10ZC0+c2l6ZTsKKwlkb19kaXYodG1wLCBtdGQtPmVyYXNlc2l6ZSk7CisJZWJjbnQgPSB0bXA7CisJcGdjbnQgPSBtdGQtPmVyYXNlc2l6ZSAvIG10ZC0+d3JpdGVzaXplOworCisJcHJpbnRrKFBSSU5UX1BSRUYgIk1URCBkZXZpY2Ugc2l6ZSAlbGx1LCBlcmFzZWJsb2NrIHNpemUgJXUsICIKKwkgICAgICAgInBhZ2Ugc2l6ZSAldSwgY291bnQgb2YgZXJhc2VibG9ja3MgJXUsIHBhZ2VzIHBlciAiCisJICAgICAgICJlcmFzZWJsb2NrICV1LCBPT0Igc2l6ZSAldVxuIiwKKwkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyltdGQtPnNpemUsIG10ZC0+ZXJhc2VzaXplLAorCSAgICAgICBtdGQtPndyaXRlc2l6ZSwgZWJjbnQsIHBnY250LCBtdGQtPm9vYnNpemUpOworCisJZXJyID0gLUVOT01FTTsKKwltdGQtPmVyYXNlc2l6ZSA9IG10ZC0+ZXJhc2VzaXplOworCXJlYWRidWYgPSBrbWFsbG9jKG10ZC0+ZXJhc2VzaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXJlYWRidWYpIHsKKwkJcHJpbnRrKFBSSU5UX1BSRUYgImVycm9yOiBjYW5ub3QgYWxsb2NhdGUgbWVtb3J5XG4iKTsKKwkJZ290byBvdXQ7CisJfQorCXdyaXRlYnVmID0ga21hbGxvYyhtdGQtPmVyYXNlc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCF3cml0ZWJ1ZikgeworCQlwcmludGsoUFJJTlRfUFJFRiAiZXJyb3I6IGNhbm5vdCBhbGxvY2F0ZSBtZW1vcnlcbiIpOworCQlnb3RvIG91dDsKKwl9CisKKwllcnIgPSBzY2FuX2Zvcl9iYWRfZXJhc2VibG9ja3MoKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKworCXVzZV9vZmZzZXQgPSAwOworCXVzZV9sZW4gPSBtdGQtPmVjY2xheW91dC0+b29iYXZhaWw7CisJdXNlX2xlbl9tYXggPSBtdGQtPmVjY2xheW91dC0+b29iYXZhaWw7CisJdmFyeV9vZmZzZXQgPSAwOworCisJLyogRmlyc3QgdGVzdDogd3JpdGUgYWxsIE9PQiwgcmVhZCBpdCBiYWNrIGFuZCB2ZXJpZnkgKi8KKwlwcmludGsoUFJJTlRfUFJFRiAidGVzdCAxIG9mIDVcbiIpOworCisJZXJyID0gZXJhc2Vfd2hvbGVfZGV2aWNlKCk7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisKKwlzaW1wbGVfc3JhbmQoMSk7CisJZXJyID0gd3JpdGVfd2hvbGVfZGV2aWNlKCk7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisKKwlzaW1wbGVfc3JhbmQoMSk7CisJZXJyID0gdmVyaWZ5X2FsbF9lcmFzZWJsb2NrcygpOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCisJLyoKKwkgKiBTZWNvbmQgdGVzdDogd3JpdGUgYWxsIE9PQiwgYSBibG9jayBhdCBhIHRpbWUsIHJlYWQgaXQgYmFjayBhbmQKKwkgKiB2ZXJpZnkuCisJICovCisJcHJpbnRrKFBSSU5UX1BSRUYgInRlc3QgMiBvZiA1XG4iKTsKKworCWVyciA9IGVyYXNlX3dob2xlX2RldmljZSgpOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCisJc2ltcGxlX3NyYW5kKDMpOworCWVyciA9IHdyaXRlX3dob2xlX2RldmljZSgpOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCisJLyogQ2hlY2sgYWxsIGVyYXNlYmxvY2tzICovCisJc2ltcGxlX3NyYW5kKDMpOworCXByaW50ayhQUklOVF9QUkVGICJ2ZXJpZnlpbmcgYWxsIGVyYXNlYmxvY2tzXG4iKTsKKwlmb3IgKGkgPSAwOyBpIDwgZWJjbnQ7ICsraSkgeworCQlpZiAoYmJ0W2ldKQorCQkJY29udGludWU7CisJCWVyciA9IHZlcmlmeV9lcmFzZWJsb2NrX2luX29uZV9nbyhpKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gb3V0OworCQlpZiAoaSAlIDI1NiA9PSAwKQorCQkJcHJpbnRrKFBSSU5UX1BSRUYgInZlcmlmaWVkIHVwIHRvIGVyYXNlYmxvY2sgJXVcbiIsIGkpOworCQljb25kX3Jlc2NoZWQoKTsKKwl9CisJcHJpbnRrKFBSSU5UX1BSRUYgInZlcmlmaWVkICV1IGVyYXNlYmxvY2tzXG4iLCBpKTsKKworCS8qCisJICogVGhpcmQgdGVzdDogd3JpdGUgT09CIGF0IHZhcnlpbmcgb2Zmc2V0cyBhbmQgbGVuZ3RocywgcmVhZCBpdCBiYWNrCisJICogYW5kIHZlcmlmeS4KKwkgKi8KKwlwcmludGsoUFJJTlRfUFJFRiAidGVzdCAzIG9mIDVcbiIpOworCisJZXJyID0gZXJhc2Vfd2hvbGVfZGV2aWNlKCk7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisKKwkvKiBXcml0ZSBhbGwgZXJhc2VibG9ja3MgKi8KKwl1c2Vfb2Zmc2V0ID0gMDsKKwl1c2VfbGVuID0gbXRkLT5lY2NsYXlvdXQtPm9vYmF2YWlsOworCXVzZV9sZW5fbWF4ID0gbXRkLT5lY2NsYXlvdXQtPm9vYmF2YWlsOworCXZhcnlfb2Zmc2V0ID0gMTsKKwlzaW1wbGVfc3JhbmQoNSk7CisJcHJpbnRrKFBSSU5UX1BSRUYgIndyaXRpbmcgT09CcyBvZiB3aG9sZSBkZXZpY2VcbiIpOworCWZvciAoaSA9IDA7IGkgPCBlYmNudDsgKytpKSB7CisJCWlmIChiYnRbaV0pCisJCQljb250aW51ZTsKKwkJZXJyID0gd3JpdGVfZXJhc2VibG9jayhpKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gb3V0OworCQlpZiAoaSAlIDI1NiA9PSAwKQorCQkJcHJpbnRrKFBSSU5UX1BSRUYgIndyaXR0ZW4gdXAgdG8gZXJhc2VibG9jayAldVxuIiwgaSk7CisJCWNvbmRfcmVzY2hlZCgpOworCX0KKwlwcmludGsoUFJJTlRfUFJFRiAid3JpdHRlbiAldSBlcmFzZWJsb2Nrc1xuIiwgaSk7CisKKwkvKiBDaGVjayBhbGwgZXJhc2VibG9ja3MgKi8KKwl1c2Vfb2Zmc2V0ID0gMDsKKwl1c2VfbGVuID0gbXRkLT5lY2NsYXlvdXQtPm9vYmF2YWlsOworCXVzZV9sZW5fbWF4ID0gbXRkLT5lY2NsYXlvdXQtPm9vYmF2YWlsOworCXZhcnlfb2Zmc2V0ID0gMTsKKwlzaW1wbGVfc3JhbmQoNSk7CisJZXJyID0gdmVyaWZ5X2FsbF9lcmFzZWJsb2NrcygpOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCisJdXNlX29mZnNldCA9IDA7CisJdXNlX2xlbiA9IG10ZC0+ZWNjbGF5b3V0LT5vb2JhdmFpbDsKKwl1c2VfbGVuX21heCA9IG10ZC0+ZWNjbGF5b3V0LT5vb2JhdmFpbDsKKwl2YXJ5X29mZnNldCA9IDA7CisKKwkvKiBGb3VydGggdGVzdDogdHJ5IHRvIHdyaXRlIG9mZiBlbmQgb2YgZGV2aWNlICovCisJcHJpbnRrKFBSSU5UX1BSRUYgInRlc3QgNCBvZiA1XG4iKTsKKworCWVyciA9IGVyYXNlX3dob2xlX2RldmljZSgpOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCisJYWRkcjAgPSAwOworCWZvciAoaSA9IDA7IGJidFtpXSAmJiBpIDwgZWJjbnQ7ICsraSkKKwkJYWRkcjAgKz0gbXRkLT5lcmFzZXNpemU7CisKKwkvKiBBdHRlbXB0IHRvIHdyaXRlIG9mZiBlbmQgb2YgT09CICovCisJb3BzLm1vZGUgICAgICA9IE1URF9PT0JfQVVUTzsKKwlvcHMubGVuICAgICAgID0gMDsKKwlvcHMucmV0bGVuICAgID0gMDsKKwlvcHMub29ibGVuICAgID0gMTsKKwlvcHMub29icmV0bGVuID0gMDsKKwlvcHMub29ib2ZmcyAgID0gbXRkLT5lY2NsYXlvdXQtPm9vYmF2YWlsOworCW9wcy5kYXRidWYgICAgPSAwOworCW9wcy5vb2JidWYgICAgPSB3cml0ZWJ1ZjsKKwlwcmludGsoUFJJTlRfUFJFRiAiYXR0ZW1wdGluZyB0byBzdGFydCB3cml0ZSBwYXN0IGVuZCBvZiBPT0JcbiIpOworCXByaW50ayhQUklOVF9QUkVGICJhbiBlcnJvciBpcyBleHBlY3RlZC4uLlxuIik7CisJZXJyID0gbXRkLT53cml0ZV9vb2IobXRkLCBhZGRyMCwgJm9wcyk7CisJaWYgKGVycikgeworCQlwcmludGsoUFJJTlRfUFJFRiAiZXJyb3Igb2NjdXJyZWQgYXMgZXhwZWN0ZWRcbiIpOworCQllcnIgPSAwOworCX0gZWxzZSB7CisJCXByaW50ayhQUklOVF9QUkVGICJlcnJvcjogY2FuIHdyaXRlIHBhc3QgZW5kIG9mIE9PQlxuIik7CisJCWVycmNudCArPSAxOworCX0KKworCS8qIEF0dGVtcHQgdG8gcmVhZCBvZmYgZW5kIG9mIE9PQiAqLworCW9wcy5tb2RlICAgICAgPSBNVERfT09CX0FVVE87CisJb3BzLmxlbiAgICAgICA9IDA7CisJb3BzLnJldGxlbiAgICA9IDA7CisJb3BzLm9vYmxlbiAgICA9IDE7CisJb3BzLm9vYnJldGxlbiA9IDA7CisJb3BzLm9vYm9mZnMgICA9IG10ZC0+ZWNjbGF5b3V0LT5vb2JhdmFpbDsKKwlvcHMuZGF0YnVmICAgID0gMDsKKwlvcHMub29iYnVmICAgID0gcmVhZGJ1ZjsKKwlwcmludGsoUFJJTlRfUFJFRiAiYXR0ZW1wdGluZyB0byBzdGFydCByZWFkIHBhc3QgZW5kIG9mIE9PQlxuIik7CisJcHJpbnRrKFBSSU5UX1BSRUYgImFuIGVycm9yIGlzIGV4cGVjdGVkLi4uXG4iKTsKKwllcnIgPSBtdGQtPnJlYWRfb29iKG10ZCwgYWRkcjAsICZvcHMpOworCWlmIChlcnIpIHsKKwkJcHJpbnRrKFBSSU5UX1BSRUYgImVycm9yIG9jY3VycmVkIGFzIGV4cGVjdGVkXG4iKTsKKwkJZXJyID0gMDsKKwl9IGVsc2UgeworCQlwcmludGsoUFJJTlRfUFJFRiAiZXJyb3I6IGNhbiByZWFkIHBhc3QgZW5kIG9mIE9PQlxuIik7CisJCWVycmNudCArPSAxOworCX0KKworCWlmIChiYnRbZWJjbnQgLSAxXSkKKwkJcHJpbnRrKFBSSU5UX1BSRUYgInNraXBwaW5nIGVuZCBvZiBkZXZpY2UgdGVzdHMgYmVjYXVzZSBsYXN0ICIKKwkJICAgICAgICJibG9jayBpcyBiYWRcbiIpOworCWVsc2UgeworCQkvKiBBdHRlbXB0IHRvIHdyaXRlIG9mZiBlbmQgb2YgZGV2aWNlICovCisJCW9wcy5tb2RlICAgICAgPSBNVERfT09CX0FVVE87CisJCW9wcy5sZW4gICAgICAgPSAwOworCQlvcHMucmV0bGVuICAgID0gMDsKKwkJb3BzLm9vYmxlbiAgICA9IG10ZC0+ZWNjbGF5b3V0LT5vb2JhdmFpbCArIDE7CisJCW9wcy5vb2JyZXRsZW4gPSAwOworCQlvcHMub29ib2ZmcyAgID0gMDsKKwkJb3BzLmRhdGJ1ZiAgICA9IDA7CisJCW9wcy5vb2JidWYgICAgPSB3cml0ZWJ1ZjsKKwkJcHJpbnRrKFBSSU5UX1BSRUYgImF0dGVtcHRpbmcgdG8gd3JpdGUgcGFzdCBlbmQgb2YgZGV2aWNlXG4iKTsKKwkJcHJpbnRrKFBSSU5UX1BSRUYgImFuIGVycm9yIGlzIGV4cGVjdGVkLi4uXG4iKTsKKwkJZXJyID0gbXRkLT53cml0ZV9vb2IobXRkLCBtdGQtPnNpemUgLSBtdGQtPndyaXRlc2l6ZSwgJm9wcyk7CisJCWlmIChlcnIpIHsKKwkJCXByaW50ayhQUklOVF9QUkVGICJlcnJvciBvY2N1cnJlZCBhcyBleHBlY3RlZFxuIik7CisJCQllcnIgPSAwOworCQl9IGVsc2UgeworCQkJcHJpbnRrKFBSSU5UX1BSRUYgImVycm9yOiB3cm90ZSBwYXN0IGVuZCBvZiBkZXZpY2VcbiIpOworCQkJZXJyY250ICs9IDE7CisJCX0KKworCQkvKiBBdHRlbXB0IHRvIHJlYWQgb2ZmIGVuZCBvZiBkZXZpY2UgKi8KKwkJb3BzLm1vZGUgICAgICA9IE1URF9PT0JfQVVUTzsKKwkJb3BzLmxlbiAgICAgICA9IDA7CisJCW9wcy5yZXRsZW4gICAgPSAwOworCQlvcHMub29ibGVuICAgID0gbXRkLT5lY2NsYXlvdXQtPm9vYmF2YWlsICsgMTsKKwkJb3BzLm9vYnJldGxlbiA9IDA7CisJCW9wcy5vb2JvZmZzICAgPSAwOworCQlvcHMuZGF0YnVmICAgID0gMDsKKwkJb3BzLm9vYmJ1ZiAgICA9IHJlYWRidWY7CisJCXByaW50ayhQUklOVF9QUkVGICJhdHRlbXB0aW5nIHRvIHJlYWQgcGFzdCBlbmQgb2YgZGV2aWNlXG4iKTsKKwkJcHJpbnRrKFBSSU5UX1BSRUYgImFuIGVycm9yIGlzIGV4cGVjdGVkLi4uXG4iKTsKKwkJZXJyID0gbXRkLT5yZWFkX29vYihtdGQsIG10ZC0+c2l6ZSAtIG10ZC0+d3JpdGVzaXplLCAmb3BzKTsKKwkJaWYgKGVycikgeworCQkJcHJpbnRrKFBSSU5UX1BSRUYgImVycm9yIG9jY3VycmVkIGFzIGV4cGVjdGVkXG4iKTsKKwkJCWVyciA9IDA7CisJCX0gZWxzZSB7CisJCQlwcmludGsoUFJJTlRfUFJFRiAiZXJyb3I6IHJlYWQgcGFzdCBlbmQgb2YgZGV2aWNlXG4iKTsKKwkJCWVycmNudCArPSAxOworCQl9CisKKwkJZXJyID0gZXJhc2VfZXJhc2VibG9jayhlYmNudCAtIDEpOworCQlpZiAoZXJyKQorCQkJZ290byBvdXQ7CisKKwkJLyogQXR0ZW1wdCB0byB3cml0ZSBvZmYgZW5kIG9mIGRldmljZSAqLworCQlvcHMubW9kZSAgICAgID0gTVREX09PQl9BVVRPOworCQlvcHMubGVuICAgICAgID0gMDsKKwkJb3BzLnJldGxlbiAgICA9IDA7CisJCW9wcy5vb2JsZW4gICAgPSBtdGQtPmVjY2xheW91dC0+b29iYXZhaWw7CisJCW9wcy5vb2JyZXRsZW4gPSAwOworCQlvcHMub29ib2ZmcyAgID0gMTsKKwkJb3BzLmRhdGJ1ZiAgICA9IDA7CisJCW9wcy5vb2JidWYgICAgPSB3cml0ZWJ1ZjsKKwkJcHJpbnRrKFBSSU5UX1BSRUYgImF0dGVtcHRpbmcgdG8gd3JpdGUgcGFzdCBlbmQgb2YgZGV2aWNlXG4iKTsKKwkJcHJpbnRrKFBSSU5UX1BSRUYgImFuIGVycm9yIGlzIGV4cGVjdGVkLi4uXG4iKTsKKwkJZXJyID0gbXRkLT53cml0ZV9vb2IobXRkLCBtdGQtPnNpemUgLSBtdGQtPndyaXRlc2l6ZSwgJm9wcyk7CisJCWlmIChlcnIpIHsKKwkJCXByaW50ayhQUklOVF9QUkVGICJlcnJvciBvY2N1cnJlZCBhcyBleHBlY3RlZFxuIik7CisJCQllcnIgPSAwOworCQl9IGVsc2UgeworCQkJcHJpbnRrKFBSSU5UX1BSRUYgImVycm9yOiB3cm90ZSBwYXN0IGVuZCBvZiBkZXZpY2VcbiIpOworCQkJZXJyY250ICs9IDE7CisJCX0KKworCQkvKiBBdHRlbXB0IHRvIHJlYWQgb2ZmIGVuZCBvZiBkZXZpY2UgKi8KKwkJb3BzLm1vZGUgICAgICA9IE1URF9PT0JfQVVUTzsKKwkJb3BzLmxlbiAgICAgICA9IDA7CisJCW9wcy5yZXRsZW4gICAgPSAwOworCQlvcHMub29ibGVuICAgID0gbXRkLT5lY2NsYXlvdXQtPm9vYmF2YWlsOworCQlvcHMub29icmV0bGVuID0gMDsKKwkJb3BzLm9vYm9mZnMgICA9IDE7CisJCW9wcy5kYXRidWYgICAgPSAwOworCQlvcHMub29iYnVmICAgID0gcmVhZGJ1ZjsKKwkJcHJpbnRrKFBSSU5UX1BSRUYgImF0dGVtcHRpbmcgdG8gcmVhZCBwYXN0IGVuZCBvZiBkZXZpY2VcbiIpOworCQlwcmludGsoUFJJTlRfUFJFRiAiYW4gZXJyb3IgaXMgZXhwZWN0ZWQuLi5cbiIpOworCQllcnIgPSBtdGQtPnJlYWRfb29iKG10ZCwgbXRkLT5zaXplIC0gbXRkLT53cml0ZXNpemUsICZvcHMpOworCQlpZiAoZXJyKSB7CisJCQlwcmludGsoUFJJTlRfUFJFRiAiZXJyb3Igb2NjdXJyZWQgYXMgZXhwZWN0ZWRcbiIpOworCQkJZXJyID0gMDsKKwkJfSBlbHNlIHsKKwkJCXByaW50ayhQUklOVF9QUkVGICJlcnJvcjogcmVhZCBwYXN0IGVuZCBvZiBkZXZpY2VcbiIpOworCQkJZXJyY250ICs9IDE7CisJCX0KKwl9CisKKwkvKiBGaWZ0aCB0ZXN0OiB3cml0ZSAvIHJlYWQgYWNyb3NzIGJsb2NrIGJvdW5kYXJpZXMgKi8KKwlwcmludGsoUFJJTlRfUFJFRiAidGVzdCA1IG9mIDVcbiIpOworCisJLyogRXJhc2UgYWxsIGVyYXNlYmxvY2tzICovCisJZXJyID0gZXJhc2Vfd2hvbGVfZGV2aWNlKCk7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisKKwkvKiBXcml0ZSBhbGwgZXJhc2VibG9ja3MgKi8KKwlzaW1wbGVfc3JhbmQoMTEpOworCXByaW50ayhQUklOVF9QUkVGICJ3cml0aW5nIE9PQnMgb2Ygd2hvbGUgZGV2aWNlXG4iKTsKKwlmb3IgKGkgPSAwOyBpIDwgZWJjbnQgLSAxOyArK2kpIHsKKwkJaW50IGNudCA9IDI7CisJCWludCBwZzsKKwkJc2l6ZV90IHN6ID0gbXRkLT5lY2NsYXlvdXQtPm9vYmF2YWlsOworCQlpZiAoYmJ0W2ldIHx8IGJidFtpICsgMV0pCisJCQljb250aW51ZTsKKwkJYWRkciA9IChpICsgMSkgKiBtdGQtPmVyYXNlc2l6ZSAtIG10ZC0+d3JpdGVzaXplOworCQlmb3IgKHBnID0gMDsgcGcgPCBjbnQ7ICsrcGcpIHsKKwkJCXNldF9yYW5kb21fZGF0YSh3cml0ZWJ1Ziwgc3opOworCQkJb3BzLm1vZGUgICAgICA9IE1URF9PT0JfQVVUTzsKKwkJCW9wcy5sZW4gICAgICAgPSAwOworCQkJb3BzLnJldGxlbiAgICA9IDA7CisJCQlvcHMub29ibGVuICAgID0gc3o7CisJCQlvcHMub29icmV0bGVuID0gMDsKKwkJCW9wcy5vb2JvZmZzICAgPSAwOworCQkJb3BzLmRhdGJ1ZiAgICA9IDA7CisJCQlvcHMub29iYnVmICAgID0gd3JpdGVidWY7CisJCQllcnIgPSBtdGQtPndyaXRlX29vYihtdGQsIGFkZHIsICZvcHMpOworCQkJaWYgKGVycikKKwkJCQlnb3RvIG91dDsKKwkJCWlmIChpICUgMjU2ID09IDApCisJCQkJcHJpbnRrKFBSSU5UX1BSRUYgIndyaXR0ZW4gdXAgdG8gZXJhc2VibG9jayAiCisJCQkJICAgICAgICIldVxuIiwgaSk7CisJCQljb25kX3Jlc2NoZWQoKTsKKwkJCWFkZHIgKz0gbXRkLT53cml0ZXNpemU7CisJCX0KKwl9CisJcHJpbnRrKFBSSU5UX1BSRUYgIndyaXR0ZW4gJXUgZXJhc2VibG9ja3NcbiIsIGkpOworCisJLyogQ2hlY2sgYWxsIGVyYXNlYmxvY2tzICovCisJc2ltcGxlX3NyYW5kKDExKTsKKwlwcmludGsoUFJJTlRfUFJFRiAidmVyaWZ5aW5nIGFsbCBlcmFzZWJsb2Nrc1xuIik7CisJZm9yIChpID0gMDsgaSA8IGViY250IC0gMTsgKytpKSB7CisJCWlmIChiYnRbaV0gfHwgYmJ0W2kgKyAxXSkKKwkJCWNvbnRpbnVlOworCQlzZXRfcmFuZG9tX2RhdGEod3JpdGVidWYsIG10ZC0+ZWNjbGF5b3V0LT5vb2JhdmFpbCAqIDIpOworCQlhZGRyID0gKGkgKyAxKSAqIG10ZC0+ZXJhc2VzaXplIC0gbXRkLT53cml0ZXNpemU7CisJCW9wcy5tb2RlICAgICAgPSBNVERfT09CX0FVVE87CisJCW9wcy5sZW4gICAgICAgPSAwOworCQlvcHMucmV0bGVuICAgID0gMDsKKwkJb3BzLm9vYmxlbiAgICA9IG10ZC0+ZWNjbGF5b3V0LT5vb2JhdmFpbCAqIDI7CisJCW9wcy5vb2JyZXRsZW4gPSAwOworCQlvcHMub29ib2ZmcyAgID0gMDsKKwkJb3BzLmRhdGJ1ZiAgICA9IDA7CisJCW9wcy5vb2JidWYgICAgPSByZWFkYnVmOworCQllcnIgPSBtdGQtPnJlYWRfb29iKG10ZCwgYWRkciwgJm9wcyk7CisJCWlmIChlcnIpCisJCQlnb3RvIG91dDsKKwkJaWYgKG1lbWNtcChyZWFkYnVmLCB3cml0ZWJ1ZiwgbXRkLT5lY2NsYXlvdXQtPm9vYmF2YWlsICogMikpIHsKKwkJCXByaW50ayhQUklOVF9QUkVGICJlcnJvcjogdmVyaWZ5IGZhaWxlZCBhdCAlI2xseFxuIiwKKwkJCSAgICAgICAobG9uZyBsb25nKWFkZHIpOworCQkJZXJyY250ICs9IDE7CisJCQlpZiAoZXJyY250ID4gMTAwMCkgeworCQkJCXByaW50ayhQUklOVF9QUkVGICJlcnJvcjogdG9vIG1hbnkgZXJyb3JzXG4iKTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJfQorCQlpZiAoaSAlIDI1NiA9PSAwKQorCQkJcHJpbnRrKFBSSU5UX1BSRUYgInZlcmlmaWVkIHVwIHRvIGVyYXNlYmxvY2sgJXVcbiIsIGkpOworCQljb25kX3Jlc2NoZWQoKTsKKwl9CisJcHJpbnRrKFBSSU5UX1BSRUYgInZlcmlmaWVkICV1IGVyYXNlYmxvY2tzXG4iLCBpKTsKKworCXByaW50ayhQUklOVF9QUkVGICJmaW5pc2hlZCB3aXRoICVkIGVycm9yc1xuIiwgZXJyY250KTsKK291dDoKKwlrZnJlZShiYnQpOworCWtmcmVlKHdyaXRlYnVmKTsKKwlrZnJlZShyZWFkYnVmKTsKKwlwdXRfbXRkX2RldmljZShtdGQpOworCWlmIChlcnIpCisJCXByaW50ayhQUklOVF9QUkVGICJlcnJvciAlZCBvY2N1cnJlZFxuIiwgZXJyKTsKKwlwcmludGsoS0VSTl9JTkZPICI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iKTsKKwlyZXR1cm4gZXJyOworfQorbW9kdWxlX2luaXQobXRkX29vYnRlc3RfaW5pdCk7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBtdGRfb29idGVzdF9leGl0KHZvaWQpCit7CisJcmV0dXJuOworfQorbW9kdWxlX2V4aXQobXRkX29vYnRlc3RfZXhpdCk7CisKK01PRFVMRV9ERVNDUklQVElPTigiT3V0LW9mLWJhbmQgdGVzdCBtb2R1bGUiKTsKK01PRFVMRV9BVVRIT1IoIkFkcmlhbiBIdW50ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL3Rlc3RzL210ZF9wYWdldGVzdC5jIGIvZHJpdmVycy9tdGQvdGVzdHMvbXRkX3BhZ2V0ZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTY0ODgxOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbXRkL3Rlc3RzL210ZF9wYWdldGVzdC5jCkBAIC0wLDAgKzEsNjMyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA2LTIwMDggTm9raWEgQ29ycG9yYXRpb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIFRlc3QgcGFnZSByZWFkIGFuZCB3cml0ZSBvbiBNVEQgZGV2aWNlLgorICoKKyAqIEF1dGhvcjogQWRyaWFuIEh1bnRlciA8ZXh0LWFkcmlhbi5odW50ZXJAbm9raWEuY29tPgorICovCisKKyNpbmNsdWRlIDxhc20vZGl2NjQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9tdGQvbXRkLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKworI2RlZmluZSBQUklOVF9QUkVGIEtFUk5fSU5GTyAibXRkX3BhZ2V0ZXN0OiAiCisKK3N0YXRpYyBpbnQgZGV2OworbW9kdWxlX3BhcmFtKGRldiwgaW50LCBTX0lSVUdPKTsKK01PRFVMRV9QQVJNX0RFU0MoZGV2LCAiTVREIGRldmljZSBudW1iZXIgdG8gdXNlIik7CisKK3N0YXRpYyBzdHJ1Y3QgbXRkX2luZm8gKm10ZDsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyICp0d29wYWdlczsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyICp3cml0ZWJ1ZjsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyICpib3VuZGFyeTsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyICpiYnQ7CisKK3N0YXRpYyBpbnQgcGdzaXplOworc3RhdGljIGludCBidWZzaXplOworc3RhdGljIGludCBlYmNudDsKK3N0YXRpYyBpbnQgcGdjbnQ7CitzdGF0aWMgaW50IGVycmNudDsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIG5leHQgPSAxOworCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBzaW1wbGVfcmFuZCh2b2lkKQoreworCW5leHQgPSBuZXh0ICogMTEwMzUxNTI0NSArIDEyMzQ1OworCXJldHVybiAodW5zaWduZWQgaW50KSgobmV4dCAvIDY1NTM2KSAlIDMyNzY4KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNpbXBsZV9zcmFuZCh1bnNpZ25lZCBsb25nIHNlZWQpCit7CisJbmV4dCA9IHNlZWQ7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9yYW5kb21fZGF0YSh1bnNpZ25lZCBjaGFyICpidWYsIHNpemVfdCBsZW4pCit7CisJc2l6ZV90IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbGVuOyArK2kpCisJCWJ1ZltpXSA9IHNpbXBsZV9yYW5kKCk7Cit9CisKK3N0YXRpYyBpbnQgZXJhc2VfZXJhc2VibG9jayhpbnQgZWJudW0pCit7CisJaW50IGVycjsKKwlzdHJ1Y3QgZXJhc2VfaW5mbyBlaTsKKwlsb2ZmX3QgYWRkciA9IGVibnVtICogbXRkLT5lcmFzZXNpemU7CisKKwltZW1zZXQoJmVpLCAwLCBzaXplb2Yoc3RydWN0IGVyYXNlX2luZm8pKTsKKwllaS5tdGQgID0gbXRkOworCWVpLmFkZHIgPSBhZGRyOworCWVpLmxlbiAgPSBtdGQtPmVyYXNlc2l6ZTsKKworCWVyciA9IG10ZC0+ZXJhc2UobXRkLCAmZWkpOworCWlmIChlcnIpIHsKKwkJcHJpbnRrKFBSSU5UX1BSRUYgImVycm9yICVkIHdoaWxlIGVyYXNpbmcgRUIgJWRcbiIsIGVyciwgZWJudW0pOworCQlyZXR1cm4gZXJyOworCX0KKworCWlmIChlaS5zdGF0ZSA9PSBNVERfRVJBU0VfRkFJTEVEKSB7CisJCXByaW50ayhQUklOVF9QUkVGICJzb21lIGVyYXNlIGVycm9yIG9jY3VycmVkIGF0IEVCICVkXG4iLAorCQkgICAgICAgZWJudW0pOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3cml0ZV9lcmFzZWJsb2NrKGludCBlYm51bSkKK3sKKwlpbnQgZXJyID0gMDsKKwlzaXplX3Qgd3JpdHRlbiA9IDA7CisJbG9mZl90IGFkZHIgPSBlYm51bSAqIG10ZC0+ZXJhc2VzaXplOworCisJc2V0X3JhbmRvbV9kYXRhKHdyaXRlYnVmLCBtdGQtPmVyYXNlc2l6ZSk7CisJY29uZF9yZXNjaGVkKCk7CisJZXJyID0gbXRkLT53cml0ZShtdGQsIGFkZHIsIG10ZC0+ZXJhc2VzaXplLCAmd3JpdHRlbiwgd3JpdGVidWYpOworCWlmIChlcnIgfHwgd3JpdHRlbiAhPSBtdGQtPmVyYXNlc2l6ZSkKKwkJcHJpbnRrKFBSSU5UX1BSRUYgImVycm9yOiB3cml0ZSBmYWlsZWQgYXQgJSNsbHhcbiIsCisJCSAgICAgICAobG9uZyBsb25nKWFkZHIpOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCB2ZXJpZnlfZXJhc2VibG9jayhpbnQgZWJudW0pCit7CisJdWludDMyX3QgajsKKwlzaXplX3QgcmVhZCA9IDA7CisJaW50IGVyciA9IDAsIGk7CisJbG9mZl90IGFkZHIwLCBhZGRybjsKKwlsb2ZmX3QgYWRkciA9IGVibnVtICogbXRkLT5lcmFzZXNpemU7CisKKwlhZGRyMCA9IDA7CisJZm9yIChpID0gMDsgYmJ0W2ldICYmIGkgPCBlYmNudDsgKytpKQorCQlhZGRyMCArPSBtdGQtPmVyYXNlc2l6ZTsKKworCWFkZHJuID0gbXRkLT5zaXplOworCWZvciAoaSA9IDA7IGJidFtlYmNudCAtIGkgLSAxXSAmJiBpIDwgZWJjbnQ7ICsraSkKKwkJYWRkcm4gLT0gbXRkLT5lcmFzZXNpemU7CisKKwlzZXRfcmFuZG9tX2RhdGEod3JpdGVidWYsIG10ZC0+ZXJhc2VzaXplKTsKKwlmb3IgKGogPSAwOyBqIDwgcGdjbnQgLSAxOyArK2osIGFkZHIgKz0gcGdzaXplKSB7CisJCS8qIERvIGEgcmVhZCB0byBzZXQgdGhlIGludGVybmFsIGRhdGFSQU1zIHRvIGRpZmZlcmVudCBkYXRhICovCisJCWVyciA9IG10ZC0+cmVhZChtdGQsIGFkZHIwLCBidWZzaXplLCAmcmVhZCwgdHdvcGFnZXMpOworCQlpZiAoZXJyID09IC1FVUNMRUFOKQorCQkJZXJyID0gMDsKKwkJaWYgKGVyciB8fCByZWFkICE9IGJ1ZnNpemUpIHsKKwkJCXByaW50ayhQUklOVF9QUkVGICJlcnJvcjogcmVhZCBmYWlsZWQgYXQgJSNsbHhcbiIsCisJCQkgICAgICAgKGxvbmcgbG9uZylhZGRyMCk7CisJCQlyZXR1cm4gZXJyOworCQl9CisJCWVyciA9IG10ZC0+cmVhZChtdGQsIGFkZHJuIC0gYnVmc2l6ZSwgYnVmc2l6ZSwgJnJlYWQsIHR3b3BhZ2VzKTsKKwkJaWYgKGVyciA9PSAtRVVDTEVBTikKKwkJCWVyciA9IDA7CisJCWlmIChlcnIgfHwgcmVhZCAhPSBidWZzaXplKSB7CisJCQlwcmludGsoUFJJTlRfUFJFRiAiZXJyb3I6IHJlYWQgZmFpbGVkIGF0ICUjbGx4XG4iLAorCQkJICAgICAgIChsb25nIGxvbmcpKGFkZHJuIC0gYnVmc2l6ZSkpOworCQkJcmV0dXJuIGVycjsKKwkJfQorCQltZW1zZXQodHdvcGFnZXMsIDAsIGJ1ZnNpemUpOworCQlyZWFkID0gMDsKKwkJZXJyID0gbXRkLT5yZWFkKG10ZCwgYWRkciwgYnVmc2l6ZSwgJnJlYWQsIHR3b3BhZ2VzKTsKKwkJaWYgKGVyciA9PSAtRVVDTEVBTikKKwkJCWVyciA9IDA7CisJCWlmIChlcnIgfHwgcmVhZCAhPSBidWZzaXplKSB7CisJCQlwcmludGsoUFJJTlRfUFJFRiAiZXJyb3I6IHJlYWQgZmFpbGVkIGF0ICUjbGx4XG4iLAorCQkJICAgICAgIChsb25nIGxvbmcpYWRkcik7CisJCQlicmVhazsKKwkJfQorCQlpZiAobWVtY21wKHR3b3BhZ2VzLCB3cml0ZWJ1ZiArIChqICogcGdzaXplKSwgYnVmc2l6ZSkpIHsKKwkJCXByaW50ayhQUklOVF9QUkVGICJlcnJvcjogdmVyaWZ5IGZhaWxlZCBhdCAlI2xseFxuIiwKKwkJCSAgICAgICAobG9uZyBsb25nKWFkZHIpOworCQkJZXJyY250ICs9IDE7CisJCX0KKwl9CisJLyogQ2hlY2sgYm91bmRhcnkgYmV0d2VlbiBlcmFzZWJsb2NrcyAqLworCWlmIChhZGRyIDw9IGFkZHJuIC0gcGdzaXplIC0gcGdzaXplICYmICFiYnRbZWJudW0gKyAxXSkgeworCQl1bnNpZ25lZCBsb25nIG9sZG5leHQgPSBuZXh0OworCQkvKiBEbyBhIHJlYWQgdG8gc2V0IHRoZSBpbnRlcm5hbCBkYXRhUkFNcyB0byBkaWZmZXJlbnQgZGF0YSAqLworCQllcnIgPSBtdGQtPnJlYWQobXRkLCBhZGRyMCwgYnVmc2l6ZSwgJnJlYWQsIHR3b3BhZ2VzKTsKKwkJaWYgKGVyciA9PSAtRVVDTEVBTikKKwkJCWVyciA9IDA7CisJCWlmIChlcnIgfHwgcmVhZCAhPSBidWZzaXplKSB7CisJCQlwcmludGsoUFJJTlRfUFJFRiAiZXJyb3I6IHJlYWQgZmFpbGVkIGF0ICUjbGx4XG4iLAorCQkJICAgICAgIChsb25nIGxvbmcpYWRkcjApOworCQkJcmV0dXJuIGVycjsKKwkJfQorCQllcnIgPSBtdGQtPnJlYWQobXRkLCBhZGRybiAtIGJ1ZnNpemUsIGJ1ZnNpemUsICZyZWFkLCB0d29wYWdlcyk7CisJCWlmIChlcnIgPT0gLUVVQ0xFQU4pCisJCQllcnIgPSAwOworCQlpZiAoZXJyIHx8IHJlYWQgIT0gYnVmc2l6ZSkgeworCQkJcHJpbnRrKFBSSU5UX1BSRUYgImVycm9yOiByZWFkIGZhaWxlZCBhdCAlI2xseFxuIiwKKwkJCSAgICAgICAobG9uZyBsb25nKShhZGRybiAtIGJ1ZnNpemUpKTsKKwkJCXJldHVybiBlcnI7CisJCX0KKwkJbWVtc2V0KHR3b3BhZ2VzLCAwLCBidWZzaXplKTsKKwkJcmVhZCA9IDA7CisJCWVyciA9IG10ZC0+cmVhZChtdGQsIGFkZHIsIGJ1ZnNpemUsICZyZWFkLCB0d29wYWdlcyk7CisJCWlmIChlcnIgPT0gLUVVQ0xFQU4pCisJCQllcnIgPSAwOworCQlpZiAoZXJyIHx8IHJlYWQgIT0gYnVmc2l6ZSkgeworCQkJcHJpbnRrKFBSSU5UX1BSRUYgImVycm9yOiByZWFkIGZhaWxlZCBhdCAlI2xseFxuIiwKKwkJCSAgICAgICAobG9uZyBsb25nKWFkZHIpOworCQkJcmV0dXJuIGVycjsKKwkJfQorCQltZW1jcHkoYm91bmRhcnksIHdyaXRlYnVmICsgbXRkLT5lcmFzZXNpemUgLSBwZ3NpemUsIHBnc2l6ZSk7CisJCXNldF9yYW5kb21fZGF0YShib3VuZGFyeSArIHBnc2l6ZSwgcGdzaXplKTsKKwkJaWYgKG1lbWNtcCh0d29wYWdlcywgYm91bmRhcnksIGJ1ZnNpemUpKSB7CisJCQlwcmludGsoUFJJTlRfUFJFRiAiZXJyb3I6IHZlcmlmeSBmYWlsZWQgYXQgJSNsbHhcbiIsCisJCQkgICAgICAgKGxvbmcgbG9uZylhZGRyKTsKKwkJCWVycmNudCArPSAxOworCQl9CisJCW5leHQgPSBvbGRuZXh0OworCX0KKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGNyb3NzdGVzdCh2b2lkKQoreworCXNpemVfdCByZWFkID0gMDsKKwlpbnQgZXJyID0gMCwgaTsKKwlsb2ZmX3QgYWRkciwgYWRkcjAsIGFkZHJuOworCXVuc2lnbmVkIGNoYXIgKnBwMSwgKnBwMiwgKnBwMywgKnBwNDsKKworCXByaW50ayhQUklOVF9QUkVGICJjcm9zc3Rlc3RcbiIpOworCXBwMSA9IGttYWxsb2MocGdzaXplICogNCwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwcDEpIHsKKwkJcHJpbnRrKFBSSU5UX1BSRUYgImVycm9yOiBjYW5ub3QgYWxsb2NhdGUgbWVtb3J5XG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCXBwMiA9IHBwMSArIHBnc2l6ZTsKKwlwcDMgPSBwcDIgKyBwZ3NpemU7CisJcHA0ID0gcHAzICsgcGdzaXplOworCW1lbXNldChwcDEsIDAsIHBnc2l6ZSAqIDQpOworCisJYWRkcjAgPSAwOworCWZvciAoaSA9IDA7IGJidFtpXSAmJiBpIDwgZWJjbnQ7ICsraSkKKwkJYWRkcjAgKz0gbXRkLT5lcmFzZXNpemU7CisKKwlhZGRybiA9IG10ZC0+c2l6ZTsKKwlmb3IgKGkgPSAwOyBiYnRbZWJjbnQgLSBpIC0gMV0gJiYgaSA8IGViY250OyArK2kpCisJCWFkZHJuIC09IG10ZC0+ZXJhc2VzaXplOworCisJLyogUmVhZCAybmQtdG8tbGFzdCBwYWdlIHRvIHBwMSAqLworCXJlYWQgPSAwOworCWFkZHIgPSBhZGRybiAtIHBnc2l6ZSAtIHBnc2l6ZTsKKwllcnIgPSBtdGQtPnJlYWQobXRkLCBhZGRyLCBwZ3NpemUsICZyZWFkLCBwcDEpOworCWlmIChlcnIgPT0gLUVVQ0xFQU4pCisJCWVyciA9IDA7CisJaWYgKGVyciB8fCByZWFkICE9IHBnc2l6ZSkgeworCQlwcmludGsoUFJJTlRfUFJFRiAiZXJyb3I6IHJlYWQgZmFpbGVkIGF0ICUjbGx4XG4iLAorCQkgICAgICAgKGxvbmcgbG9uZylhZGRyKTsKKwkJa2ZyZWUocHAxKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwkvKiBSZWFkIDNyZC10by1sYXN0IHBhZ2UgdG8gcHAxICovCisJcmVhZCA9IDA7CisJYWRkciA9IGFkZHJuIC0gcGdzaXplIC0gcGdzaXplIC0gcGdzaXplOworCWVyciA9IG10ZC0+cmVhZChtdGQsIGFkZHIsIHBnc2l6ZSwgJnJlYWQsIHBwMSk7CisJaWYgKGVyciA9PSAtRVVDTEVBTikKKwkJZXJyID0gMDsKKwlpZiAoZXJyIHx8IHJlYWQgIT0gcGdzaXplKSB7CisJCXByaW50ayhQUklOVF9QUkVGICJlcnJvcjogcmVhZCBmYWlsZWQgYXQgJSNsbHhcbiIsCisJCSAgICAgICAobG9uZyBsb25nKWFkZHIpOworCQlrZnJlZShwcDEpOworCQlyZXR1cm4gZXJyOworCX0KKworCS8qIFJlYWQgZmlyc3QgcGFnZSB0byBwcDIgKi8KKwlyZWFkID0gMDsKKwlhZGRyID0gYWRkcjA7CisJcHJpbnRrKFBSSU5UX1BSRUYgInJlYWRpbmcgcGFnZSBhdCAlI2xseFxuIiwgKGxvbmcgbG9uZylhZGRyKTsKKwllcnIgPSBtdGQtPnJlYWQobXRkLCBhZGRyLCBwZ3NpemUsICZyZWFkLCBwcDIpOworCWlmIChlcnIgPT0gLUVVQ0xFQU4pCisJCWVyciA9IDA7CisJaWYgKGVyciB8fCByZWFkICE9IHBnc2l6ZSkgeworCQlwcmludGsoUFJJTlRfUFJFRiAiZXJyb3I6IHJlYWQgZmFpbGVkIGF0ICUjbGx4XG4iLAorCQkgICAgICAgKGxvbmcgbG9uZylhZGRyKTsKKwkJa2ZyZWUocHAxKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwkvKiBSZWFkIGxhc3QgcGFnZSB0byBwcDMgKi8KKwlyZWFkID0gMDsKKwlhZGRyID0gYWRkcm4gLSBwZ3NpemU7CisJcHJpbnRrKFBSSU5UX1BSRUYgInJlYWRpbmcgcGFnZSBhdCAlI2xseFxuIiwgKGxvbmcgbG9uZylhZGRyKTsKKwllcnIgPSBtdGQtPnJlYWQobXRkLCBhZGRyLCBwZ3NpemUsICZyZWFkLCBwcDMpOworCWlmIChlcnIgPT0gLUVVQ0xFQU4pCisJCWVyciA9IDA7CisJaWYgKGVyciB8fCByZWFkICE9IHBnc2l6ZSkgeworCQlwcmludGsoUFJJTlRfUFJFRiAiZXJyb3I6IHJlYWQgZmFpbGVkIGF0ICUjbGx4XG4iLAorCQkgICAgICAgKGxvbmcgbG9uZylhZGRyKTsKKwkJa2ZyZWUocHAxKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwkvKiBSZWFkIGZpcnN0IHBhZ2UgYWdhaW4gdG8gcHA0ICovCisJcmVhZCA9IDA7CisJYWRkciA9IGFkZHIwOworCXByaW50ayhQUklOVF9QUkVGICJyZWFkaW5nIHBhZ2UgYXQgJSNsbHhcbiIsIChsb25nIGxvbmcpYWRkcik7CisJZXJyID0gbXRkLT5yZWFkKG10ZCwgYWRkciwgcGdzaXplLCAmcmVhZCwgcHA0KTsKKwlpZiAoZXJyID09IC1FVUNMRUFOKQorCQllcnIgPSAwOworCWlmIChlcnIgfHwgcmVhZCAhPSBwZ3NpemUpIHsKKwkJcHJpbnRrKFBSSU5UX1BSRUYgImVycm9yOiByZWFkIGZhaWxlZCBhdCAlI2xseFxuIiwKKwkJICAgICAgIChsb25nIGxvbmcpYWRkcik7CisJCWtmcmVlKHBwMSk7CisJCXJldHVybiBlcnI7CisJfQorCisJLyogcHAyIGFuZCBwcDQgc2hvdWxkIGJlIHRoZSBzYW1lICovCisJcHJpbnRrKFBSSU5UX1BSRUYgInZlcmlmeWluZyBwYWdlcyByZWFkIGF0ICUjbGx4IG1hdGNoXG4iLAorCSAgICAgICAobG9uZyBsb25nKWFkZHIwKTsKKwlpZiAobWVtY21wKHBwMiwgcHA0LCBwZ3NpemUpKSB7CisJCXByaW50ayhQUklOVF9QUkVGICJ2ZXJpZnkgZmFpbGVkIVxuIik7CisJCWVycmNudCArPSAxOworCX0gZWxzZSBpZiAoIWVycikKKwkJcHJpbnRrKFBSSU5UX1BSRUYgImNyb3NzdGVzdCBva1xuIik7CisJa2ZyZWUocHAxKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGVyYXNlY3Jvc3N0ZXN0KHZvaWQpCit7CisJc2l6ZV90IHJlYWQgPSAwLCB3cml0dGVuID0gMDsKKwlpbnQgZXJyID0gMCwgaSwgZWJudW0sIG9rID0gMSwgZWJudW0yOworCWxvZmZfdCBhZGRyMDsKKwljaGFyICpyZWFkYnVmID0gdHdvcGFnZXM7CisKKwlwcmludGsoUFJJTlRfUFJFRiAiZXJhc2Vjcm9zc3Rlc3RcbiIpOworCisJZWJudW0gPSAwOworCWFkZHIwID0gMDsKKwlmb3IgKGkgPSAwOyBiYnRbaV0gJiYgaSA8IGViY250OyArK2kpIHsKKwkJYWRkcjAgKz0gbXRkLT5lcmFzZXNpemU7CisJCWVibnVtICs9IDE7CisJfQorCisJZWJudW0yID0gZWJjbnQgLSAxOworCXdoaWxlIChlYm51bTIgJiYgYmJ0W2VibnVtMl0pCisJCWVibnVtMiAtPSAxOworCisJcHJpbnRrKFBSSU5UX1BSRUYgImVyYXNpbmcgYmxvY2sgJWRcbiIsIGVibnVtKTsKKwllcnIgPSBlcmFzZV9lcmFzZWJsb2NrKGVibnVtKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJcHJpbnRrKFBSSU5UX1BSRUYgIndyaXRpbmcgMXN0IHBhZ2Ugb2YgYmxvY2sgJWRcbiIsIGVibnVtKTsKKwlzZXRfcmFuZG9tX2RhdGEod3JpdGVidWYsIHBnc2l6ZSk7CisJc3RyY3B5KHdyaXRlYnVmLCAiVGhlcmUgaXMgbm8gZGF0YSBsaWtlIHRoaXMhIik7CisJZXJyID0gbXRkLT53cml0ZShtdGQsIGFkZHIwLCBwZ3NpemUsICZ3cml0dGVuLCB3cml0ZWJ1Zik7CisJaWYgKGVyciB8fCB3cml0dGVuICE9IHBnc2l6ZSkgeworCQlwcmludGsoUFJJTlRfUFJFRiAiZXJyb3I6IHdyaXRlIGZhaWxlZCBhdCAlI2xseFxuIiwKKwkJICAgICAgIChsb25nIGxvbmcpYWRkcjApOworCQlyZXR1cm4gZXJyID8gZXJyIDogLTE7CisJfQorCisJcHJpbnRrKFBSSU5UX1BSRUYgInJlYWRpbmcgMXN0IHBhZ2Ugb2YgYmxvY2sgJWRcbiIsIGVibnVtKTsKKwltZW1zZXQocmVhZGJ1ZiwgMCwgcGdzaXplKTsKKwllcnIgPSBtdGQtPnJlYWQobXRkLCBhZGRyMCwgcGdzaXplLCAmcmVhZCwgcmVhZGJ1Zik7CisJaWYgKGVyciA9PSAtRVVDTEVBTikKKwkJZXJyID0gMDsKKwlpZiAoZXJyIHx8IHJlYWQgIT0gcGdzaXplKSB7CisJCXByaW50ayhQUklOVF9QUkVGICJlcnJvcjogcmVhZCBmYWlsZWQgYXQgJSNsbHhcbiIsCisJCSAgICAgICAobG9uZyBsb25nKWFkZHIwKTsKKwkJcmV0dXJuIGVyciA/IGVyciA6IC0xOworCX0KKworCXByaW50ayhQUklOVF9QUkVGICJ2ZXJpZnlpbmcgMXN0IHBhZ2Ugb2YgYmxvY2sgJWRcbiIsIGVibnVtKTsKKwlpZiAobWVtY21wKHdyaXRlYnVmLCByZWFkYnVmLCBwZ3NpemUpKSB7CisJCXByaW50ayhQUklOVF9QUkVGICJ2ZXJpZnkgZmFpbGVkIVxuIik7CisJCWVycmNudCArPSAxOworCQlvayA9IDA7CisJCXJldHVybiBlcnI7CisJfQorCisJcHJpbnRrKFBSSU5UX1BSRUYgImVyYXNpbmcgYmxvY2sgJWRcbiIsIGVibnVtKTsKKwllcnIgPSBlcmFzZV9lcmFzZWJsb2NrKGVibnVtKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJcHJpbnRrKFBSSU5UX1BSRUYgIndyaXRpbmcgMXN0IHBhZ2Ugb2YgYmxvY2sgJWRcbiIsIGVibnVtKTsKKwlzZXRfcmFuZG9tX2RhdGEod3JpdGVidWYsIHBnc2l6ZSk7CisJc3RyY3B5KHdyaXRlYnVmLCAiVGhlcmUgaXMgbm8gZGF0YSBsaWtlIHRoaXMhIik7CisJZXJyID0gbXRkLT53cml0ZShtdGQsIGFkZHIwLCBwZ3NpemUsICZ3cml0dGVuLCB3cml0ZWJ1Zik7CisJaWYgKGVyciB8fCB3cml0dGVuICE9IHBnc2l6ZSkgeworCQlwcmludGsoUFJJTlRfUFJFRiAiZXJyb3I6IHdyaXRlIGZhaWxlZCBhdCAlI2xseFxuIiwKKwkJICAgICAgIChsb25nIGxvbmcpYWRkcjApOworCQlyZXR1cm4gZXJyID8gZXJyIDogLTE7CisJfQorCisJcHJpbnRrKFBSSU5UX1BSRUYgImVyYXNpbmcgYmxvY2sgJWRcbiIsIGVibnVtMik7CisJZXJyID0gZXJhc2VfZXJhc2VibG9jayhlYm51bTIpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlwcmludGsoUFJJTlRfUFJFRiAicmVhZGluZyAxc3QgcGFnZSBvZiBibG9jayAlZFxuIiwgZWJudW0pOworCW1lbXNldChyZWFkYnVmLCAwLCBwZ3NpemUpOworCWVyciA9IG10ZC0+cmVhZChtdGQsIGFkZHIwLCBwZ3NpemUsICZyZWFkLCByZWFkYnVmKTsKKwlpZiAoZXJyID09IC1FVUNMRUFOKQorCQllcnIgPSAwOworCWlmIChlcnIgfHwgcmVhZCAhPSBwZ3NpemUpIHsKKwkJcHJpbnRrKFBSSU5UX1BSRUYgImVycm9yOiByZWFkIGZhaWxlZCBhdCAlI2xseFxuIiwKKwkJICAgICAgIChsb25nIGxvbmcpYWRkcjApOworCQlyZXR1cm4gZXJyID8gZXJyIDogLTE7CisJfQorCisJcHJpbnRrKFBSSU5UX1BSRUYgInZlcmlmeWluZyAxc3QgcGFnZSBvZiBibG9jayAlZFxuIiwgZWJudW0pOworCWlmIChtZW1jbXAod3JpdGVidWYsIHJlYWRidWYsIHBnc2l6ZSkpIHsKKwkJcHJpbnRrKFBSSU5UX1BSRUYgInZlcmlmeSBmYWlsZWQhXG4iKTsKKwkJZXJyY250ICs9IDE7CisJCW9rID0gMDsKKwl9CisKKwlpZiAob2sgJiYgIWVycikKKwkJcHJpbnRrKFBSSU5UX1BSRUYgImVyYXNlY3Jvc3N0ZXN0IG9rXG4iKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGVyYXNldGVzdCh2b2lkKQoreworCXNpemVfdCByZWFkID0gMCwgd3JpdHRlbiA9IDA7CisJaW50IGVyciA9IDAsIGksIGVibnVtLCBvayA9IDE7CisJbG9mZl90IGFkZHIwOworCisJcHJpbnRrKFBSSU5UX1BSRUYgImVyYXNldGVzdFxuIik7CisKKwllYm51bSA9IDA7CisJYWRkcjAgPSAwOworCWZvciAoaSA9IDA7IGJidFtpXSAmJiBpIDwgZWJjbnQ7ICsraSkgeworCQlhZGRyMCArPSBtdGQtPmVyYXNlc2l6ZTsKKwkJZWJudW0gKz0gMTsKKwl9CisKKwlwcmludGsoUFJJTlRfUFJFRiAiZXJhc2luZyBibG9jayAlZFxuIiwgZWJudW0pOworCWVyciA9IGVyYXNlX2VyYXNlYmxvY2soZWJudW0pOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlwcmludGsoUFJJTlRfUFJFRiAid3JpdGluZyAxc3QgcGFnZSBvZiBibG9jayAlZFxuIiwgZWJudW0pOworCXNldF9yYW5kb21fZGF0YSh3cml0ZWJ1ZiwgcGdzaXplKTsKKwllcnIgPSBtdGQtPndyaXRlKG10ZCwgYWRkcjAsIHBnc2l6ZSwgJndyaXR0ZW4sIHdyaXRlYnVmKTsKKwlpZiAoZXJyIHx8IHdyaXR0ZW4gIT0gcGdzaXplKSB7CisJCXByaW50ayhQUklOVF9QUkVGICJlcnJvcjogd3JpdGUgZmFpbGVkIGF0ICUjbGx4XG4iLAorCQkgICAgICAgKGxvbmcgbG9uZylhZGRyMCk7CisJCXJldHVybiBlcnIgPyBlcnIgOiAtMTsKKwl9CisKKwlwcmludGsoUFJJTlRfUFJFRiAiZXJhc2luZyBibG9jayAlZFxuIiwgZWJudW0pOworCWVyciA9IGVyYXNlX2VyYXNlYmxvY2soZWJudW0pOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlwcmludGsoUFJJTlRfUFJFRiAicmVhZGluZyAxc3QgcGFnZSBvZiBibG9jayAlZFxuIiwgZWJudW0pOworCWVyciA9IG10ZC0+cmVhZChtdGQsIGFkZHIwLCBwZ3NpemUsICZyZWFkLCB0d29wYWdlcyk7CisJaWYgKGVyciA9PSAtRVVDTEVBTikKKwkJZXJyID0gMDsKKwlpZiAoZXJyIHx8IHJlYWQgIT0gcGdzaXplKSB7CisJCXByaW50ayhQUklOVF9QUkVGICJlcnJvcjogcmVhZCBmYWlsZWQgYXQgJSNsbHhcbiIsCisJCSAgICAgICAobG9uZyBsb25nKWFkZHIwKTsKKwkJcmV0dXJuIGVyciA/IGVyciA6IC0xOworCX0KKworCXByaW50ayhQUklOVF9QUkVGICJ2ZXJpZnlpbmcgMXN0IHBhZ2Ugb2YgYmxvY2sgJWQgaXMgYWxsIDB4ZmZcbiIsCisJICAgICAgIGVibnVtKTsKKwlmb3IgKGkgPSAwOyBpIDwgcGdzaXplOyArK2kpCisJCWlmICh0d29wYWdlc1tpXSAhPSAweGZmKSB7CisJCQlwcmludGsoUFJJTlRfUFJFRiAidmVyaWZ5aW5nIGFsbCAweGZmIGZhaWxlZCBhdCAlZFxuIiwKKwkJCSAgICAgICBpKTsKKwkJCWVycmNudCArPSAxOworCQkJb2sgPSAwOworCQkJYnJlYWs7CisJCX0KKworCWlmIChvayAmJiAhZXJyKQorCQlwcmludGsoUFJJTlRfUFJFRiAiZXJhc2V0ZXN0IG9rXG4iKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgaXNfYmxvY2tfYmFkKGludCBlYm51bSkKK3sKKwlsb2ZmX3QgYWRkciA9IGVibnVtICogbXRkLT5lcmFzZXNpemU7CisJaW50IHJldDsKKworCXJldCA9IG10ZC0+YmxvY2tfaXNiYWQobXRkLCBhZGRyKTsKKwlpZiAocmV0KQorCQlwcmludGsoUFJJTlRfUFJFRiAiYmxvY2sgJWQgaXMgYmFkXG4iLCBlYm51bSk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBzY2FuX2Zvcl9iYWRfZXJhc2VibG9ja3Modm9pZCkKK3sKKwlpbnQgaSwgYmFkID0gMDsKKworCWJidCA9IGttYWxsb2MoZWJjbnQsIEdGUF9LRVJORUwpOworCWlmICghYmJ0KSB7CisJCXByaW50ayhQUklOVF9QUkVGICJlcnJvcjogY2Fubm90IGFsbG9jYXRlIG1lbW9yeVxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwltZW1zZXQoYmJ0LCAwICwgZWJjbnQpOworCisJcHJpbnRrKFBSSU5UX1BSRUYgInNjYW5uaW5nIGZvciBiYWQgZXJhc2VibG9ja3NcbiIpOworCWZvciAoaSA9IDA7IGkgPCBlYmNudDsgKytpKSB7CisJCWJidFtpXSA9IGlzX2Jsb2NrX2JhZChpKSA/IDEgOiAwOworCQlpZiAoYmJ0W2ldKQorCQkJYmFkICs9IDE7CisJCWNvbmRfcmVzY2hlZCgpOworCX0KKwlwcmludGsoUFJJTlRfUFJFRiAic2Nhbm5lZCAlZCBlcmFzZWJsb2NrcywgJWQgYXJlIGJhZFxuIiwgaSwgYmFkKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2luaXQgbXRkX3BhZ2V0ZXN0X2luaXQodm9pZCkKK3sKKwlpbnQgZXJyID0gMDsKKwl1aW50NjRfdCB0bXA7CisJdWludDMyX3QgaTsKKworCXByaW50ayhLRVJOX0lORk8gIlxuIik7CisJcHJpbnRrKEtFUk5fSU5GTyAiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIik7CisJcHJpbnRrKFBSSU5UX1BSRUYgIk1URCBkZXZpY2U6ICVkXG4iLCBkZXYpOworCisJbXRkID0gZ2V0X210ZF9kZXZpY2UoTlVMTCwgZGV2KTsKKwlpZiAoSVNfRVJSKG10ZCkpIHsKKwkJZXJyID0gUFRSX0VSUihtdGQpOworCQlwcmludGsoUFJJTlRfUFJFRiAiZXJyb3I6IGNhbm5vdCBnZXQgTVREIGRldmljZVxuIik7CisJCXJldHVybiBlcnI7CisJfQorCisJaWYgKG10ZC0+dHlwZSAhPSBNVERfTkFOREZMQVNIKSB7CisJCXByaW50ayhQUklOVF9QUkVGICJ0aGlzIHRlc3QgcmVxdWlyZXMgTkFORCBmbGFzaFxuIik7CisJCWdvdG8gb3V0OworCX0KKworCXRtcCA9IG10ZC0+c2l6ZTsKKwlkb19kaXYodG1wLCBtdGQtPmVyYXNlc2l6ZSk7CisJZWJjbnQgPSB0bXA7CisJcGdjbnQgPSBtdGQtPmVyYXNlc2l6ZSAvIG10ZC0+d3JpdGVzaXplOworCisJcHJpbnRrKFBSSU5UX1BSRUYgIk1URCBkZXZpY2Ugc2l6ZSAlbGx1LCBlcmFzZWJsb2NrIHNpemUgJXUsICIKKwkgICAgICAgInBhZ2Ugc2l6ZSAldSwgY291bnQgb2YgZXJhc2VibG9ja3MgJXUsIHBhZ2VzIHBlciAiCisJICAgICAgICJlcmFzZWJsb2NrICV1LCBPT0Igc2l6ZSAldVxuIiwKKwkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyltdGQtPnNpemUsIG10ZC0+ZXJhc2VzaXplLAorCSAgICAgICBwZ3NpemUsIGViY250LCBwZ2NudCwgbXRkLT5vb2JzaXplKTsKKworCWVyciA9IC1FTk9NRU07CisJYnVmc2l6ZSA9IHBnc2l6ZSAqIDI7CisJd3JpdGVidWYgPSBrbWFsbG9jKG10ZC0+ZXJhc2VzaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXdyaXRlYnVmKSB7CisJCXByaW50ayhQUklOVF9QUkVGICJlcnJvcjogY2Fubm90IGFsbG9jYXRlIG1lbW9yeVxuIik7CisJCWdvdG8gb3V0OworCX0KKwl0d29wYWdlcyA9IGttYWxsb2MoYnVmc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCF0d29wYWdlcykgeworCQlwcmludGsoUFJJTlRfUFJFRiAiZXJyb3I6IGNhbm5vdCBhbGxvY2F0ZSBtZW1vcnlcbiIpOworCQlnb3RvIG91dDsKKwl9CisJYm91bmRhcnkgPSBrbWFsbG9jKGJ1ZnNpemUsIEdGUF9LRVJORUwpOworCWlmICghYm91bmRhcnkpIHsKKwkJcHJpbnRrKFBSSU5UX1BSRUYgImVycm9yOiBjYW5ub3QgYWxsb2NhdGUgbWVtb3J5XG4iKTsKKwkJZ290byBvdXQ7CisJfQorCisJZXJyID0gc2Nhbl9mb3JfYmFkX2VyYXNlYmxvY2tzKCk7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisKKwkvKiBFcmFzZSBhbGwgZXJhc2VibG9ja3MgKi8KKwlwcmludGsoUFJJTlRfUFJFRiAiZXJhc2luZyB3aG9sZSBkZXZpY2VcbiIpOworCWZvciAoaSA9IDA7IGkgPCBlYmNudDsgKytpKSB7CisJCWlmIChiYnRbaV0pCisJCQljb250aW51ZTsKKwkJZXJyID0gZXJhc2VfZXJhc2VibG9jayhpKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gb3V0OworCQljb25kX3Jlc2NoZWQoKTsKKwl9CisJcHJpbnRrKFBSSU5UX1BSRUYgImVyYXNlZCAldSBlcmFzZWJsb2Nrc1xuIiwgaSk7CisKKwkvKiBXcml0ZSBhbGwgZXJhc2VibG9ja3MgKi8KKwlzaW1wbGVfc3JhbmQoMSk7CisJcHJpbnRrKFBSSU5UX1BSRUYgIndyaXRpbmcgd2hvbGUgZGV2aWNlXG4iKTsKKwlmb3IgKGkgPSAwOyBpIDwgZWJjbnQ7ICsraSkgeworCQlpZiAoYmJ0W2ldKQorCQkJY29udGludWU7CisJCWVyciA9IHdyaXRlX2VyYXNlYmxvY2soaSk7CisJCWlmIChlcnIpCisJCQlnb3RvIG91dDsKKwkJaWYgKGkgJSAyNTYgPT0gMCkKKwkJCXByaW50ayhQUklOVF9QUkVGICJ3cml0dGVuIHVwIHRvIGVyYXNlYmxvY2sgJXVcbiIsIGkpOworCQljb25kX3Jlc2NoZWQoKTsKKwl9CisJcHJpbnRrKFBSSU5UX1BSRUYgIndyaXR0ZW4gJXUgZXJhc2VibG9ja3NcbiIsIGkpOworCisJLyogQ2hlY2sgYWxsIGVyYXNlYmxvY2tzICovCisJc2ltcGxlX3NyYW5kKDEpOworCXByaW50ayhQUklOVF9QUkVGICJ2ZXJpZnlpbmcgYWxsIGVyYXNlYmxvY2tzXG4iKTsKKwlmb3IgKGkgPSAwOyBpIDwgZWJjbnQ7ICsraSkgeworCQlpZiAoYmJ0W2ldKQorCQkJY29udGludWU7CisJCWVyciA9IHZlcmlmeV9lcmFzZWJsb2NrKGkpOworCQlpZiAoZXJyKQorCQkJZ290byBvdXQ7CisJCWlmIChpICUgMjU2ID09IDApCisJCQlwcmludGsoUFJJTlRfUFJFRiAidmVyaWZpZWQgdXAgdG8gZXJhc2VibG9jayAldVxuIiwgaSk7CisJCWNvbmRfcmVzY2hlZCgpOworCX0KKwlwcmludGsoUFJJTlRfUFJFRiAidmVyaWZpZWQgJXUgZXJhc2VibG9ja3NcbiIsIGkpOworCisJZXJyID0gY3Jvc3N0ZXN0KCk7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisKKwllcnIgPSBlcmFzZWNyb3NzdGVzdCgpOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCisJZXJyID0gZXJhc2V0ZXN0KCk7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisKKwlwcmludGsoUFJJTlRfUFJFRiAiZmluaXNoZWQgd2l0aCAlZCBlcnJvcnNcbiIsIGVycmNudCk7CitvdXQ6CisKKwlrZnJlZShiYnQpOworCWtmcmVlKGJvdW5kYXJ5KTsKKwlrZnJlZSh0d29wYWdlcyk7CisJa2ZyZWUod3JpdGVidWYpOworCXB1dF9tdGRfZGV2aWNlKG10ZCk7CisJaWYgKGVycikKKwkJcHJpbnRrKFBSSU5UX1BSRUYgImVycm9yICVkIG9jY3VycmVkXG4iLCBlcnIpOworCXByaW50ayhLRVJOX0lORk8gIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIpOworCXJldHVybiBlcnI7Cit9Cittb2R1bGVfaW5pdChtdGRfcGFnZXRlc3RfaW5pdCk7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBtdGRfcGFnZXRlc3RfZXhpdCh2b2lkKQoreworCXJldHVybjsKK30KK21vZHVsZV9leGl0KG10ZF9wYWdldGVzdF9leGl0KTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJOQU5EIHBhZ2UgdGVzdCIpOworTU9EVUxFX0FVVEhPUigiQWRyaWFuIEh1bnRlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvdGVzdHMvbXRkX3JlYWR0ZXN0LmMgYi9kcml2ZXJzL210ZC90ZXN0cy9tdGRfcmVhZHRlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDVlNzdmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tdGQvdGVzdHMvbXRkX3JlYWR0ZXN0LmMKQEAgLTAsMCArMSwyNTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYtMjAwOCBOb2tpYSBDb3Jwb3JhdGlvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKgorICogQ2hlY2sgTVREIGRldmljZSByZWFkLgorICoKKyAqIEF1dGhvcjogQWRyaWFuIEh1bnRlciA8ZXh0LWFkcmlhbi5odW50ZXJAbm9raWEuY29tPgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9tdGQvbXRkLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKworI2RlZmluZSBQUklOVF9QUkVGIEtFUk5fSU5GTyAibXRkX3JlYWR0ZXN0OiAiCisKK3N0YXRpYyBpbnQgZGV2OworbW9kdWxlX3BhcmFtKGRldiwgaW50LCBTX0lSVUdPKTsKK01PRFVMRV9QQVJNX0RFU0MoZGV2LCAiTVREIGRldmljZSBudW1iZXIgdG8gdXNlIik7CisKK3N0YXRpYyBzdHJ1Y3QgbXRkX2luZm8gKm10ZDsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyICppb2J1ZjsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyICppb2J1ZjE7CitzdGF0aWMgdW5zaWduZWQgY2hhciAqYmJ0OworCitzdGF0aWMgaW50IHBnc2l6ZTsKK3N0YXRpYyBpbnQgZWJjbnQ7CitzdGF0aWMgaW50IHBnY250OworCitzdGF0aWMgaW50IHJlYWRfZXJhc2VibG9ja19ieV9wYWdlKGludCBlYm51bSkKK3sKKwlzaXplX3QgcmVhZCA9IDA7CisJaW50IGksIHJldCwgZXJyID0gMDsKKwlsb2ZmX3QgYWRkciA9IGVibnVtICogbXRkLT5lcmFzZXNpemU7CisJdm9pZCAqYnVmID0gaW9idWY7CisJdm9pZCAqb29iYnVmID0gaW9idWYxOworCisJZm9yIChpID0gMDsgaSA8IHBnY250OyBpKyspIHsKKwkJbWVtc2V0KGJ1ZiwgMCAsIHBnY250KTsKKwkJcmV0ID0gbXRkLT5yZWFkKG10ZCwgYWRkciwgcGdzaXplLCAmcmVhZCwgYnVmKTsKKwkJaWYgKHJldCA9PSAtRVVDTEVBTikKKwkJCXJldCA9IDA7CisJCWlmIChyZXQgfHwgcmVhZCAhPSBwZ3NpemUpIHsKKwkJCXByaW50ayhQUklOVF9QUkVGICJlcnJvcjogcmVhZCBmYWlsZWQgYXQgJSNsbHhcbiIsCisJCQkgICAgICAgKGxvbmcgbG9uZylhZGRyKTsKKwkJCWlmICghZXJyKQorCQkJCWVyciA9IHJldDsKKwkJCWlmICghZXJyKQorCQkJCWVyciA9IC1FSU5WQUw7CisJCX0KKwkJaWYgKG10ZC0+b29ic2l6ZSkgeworCQkJc3RydWN0IG10ZF9vb2Jfb3BzIG9wczsKKworCQkJb3BzLm1vZGUgICAgICA9IE1URF9PT0JfUExBQ0U7CisJCQlvcHMubGVuICAgICAgID0gMDsKKwkJCW9wcy5yZXRsZW4gICAgPSAwOworCQkJb3BzLm9vYmxlbiAgICA9IG10ZC0+b29ic2l6ZTsKKwkJCW9wcy5vb2JyZXRsZW4gPSAwOworCQkJb3BzLm9vYm9mZnMgICA9IDA7CisJCQlvcHMuZGF0YnVmICAgID0gMDsKKwkJCW9wcy5vb2JidWYgICAgPSBvb2JidWY7CisJCQlyZXQgPSBtdGQtPnJlYWRfb29iKG10ZCwgYWRkciwgJm9wcyk7CisJCQlpZiAocmV0IHx8IG9wcy5vb2JyZXRsZW4gIT0gbXRkLT5vb2JzaXplKSB7CisJCQkJcHJpbnRrKFBSSU5UX1BSRUYgImVycm9yOiByZWFkIG9vYiBmYWlsZWQgYXQgIgorCQkJCQkJICAiJSNsbHhcbiIsIChsb25nIGxvbmcpYWRkcik7CisJCQkJaWYgKCFlcnIpCisJCQkJCWVyciA9IHJldDsKKwkJCQlpZiAoIWVycikKKwkJCQkJZXJyID0gLUVJTlZBTDsKKwkJCX0KKwkJCW9vYmJ1ZiArPSBtdGQtPm9vYnNpemU7CisJCX0KKwkJYWRkciArPSBwZ3NpemU7CisJCWJ1ZiArPSBwZ3NpemU7CisJfQorCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgZHVtcF9lcmFzZWJsb2NrKGludCBlYm51bSkKK3sKKwlpbnQgaSwgaiwgbjsKKwljaGFyIGxpbmVbMTI4XTsKKwlpbnQgcGcsIG9vYjsKKworCXByaW50ayhQUklOVF9QUkVGICJkdW1waW5nIGVyYXNlYmxvY2sgJWRcbiIsIGVibnVtKTsKKwluID0gbXRkLT5lcmFzZXNpemU7CisJZm9yIChpID0gMDsgaSA8IG47KSB7CisJCWNoYXIgKnAgPSBsaW5lOworCisJCXAgKz0gc3ByaW50ZihwLCAiJTA1eDogIiwgaSk7CisJCWZvciAoaiA9IDA7IGogPCAzMiAmJiBpIDwgbjsgaisrLCBpKyspCisJCQlwICs9IHNwcmludGYocCwgIiUwMngiLCAodW5zaWduZWQgaW50KWlvYnVmW2ldKTsKKwkJcHJpbnRrKEtFUk5fQ1JJVCAiJXNcbiIsIGxpbmUpOworCQljb25kX3Jlc2NoZWQoKTsKKwl9CisJaWYgKCFtdGQtPm9vYnNpemUpCisJCXJldHVybjsKKwlwcmludGsoUFJJTlRfUFJFRiAiZHVtcGluZyBvb2IgZnJvbSBlcmFzZWJsb2NrICVkXG4iLCBlYm51bSk7CisJbiA9IG10ZC0+b29ic2l6ZTsKKwlmb3IgKHBnID0gMCwgaSA9IDA7IHBnIDwgcGdjbnQ7IHBnKyspCisJCWZvciAob29iID0gMDsgb29iIDwgbjspIHsKKwkJCWNoYXIgKnAgPSBsaW5lOworCisJCQlwICs9IHNwcmludGYocCwgIiUwNXg6ICIsIGkpOworCQkJZm9yIChqID0gMDsgaiA8IDMyICYmIG9vYiA8IG47IGorKywgb29iKyssIGkrKykKKwkJCQlwICs9IHNwcmludGYocCwgIiUwMngiLAorCQkJCQkgICAgICh1bnNpZ25lZCBpbnQpaW9idWYxW2ldKTsKKwkJCXByaW50ayhLRVJOX0NSSVQgIiVzXG4iLCBsaW5lKTsKKwkJCWNvbmRfcmVzY2hlZCgpOworCQl9Cit9CisKK3N0YXRpYyBpbnQgaXNfYmxvY2tfYmFkKGludCBlYm51bSkKK3sKKwlsb2ZmX3QgYWRkciA9IGVibnVtICogbXRkLT5lcmFzZXNpemU7CisJaW50IHJldDsKKworCXJldCA9IG10ZC0+YmxvY2tfaXNiYWQobXRkLCBhZGRyKTsKKwlpZiAocmV0KQorCQlwcmludGsoUFJJTlRfUFJFRiAiYmxvY2sgJWQgaXMgYmFkXG4iLCBlYm51bSk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBzY2FuX2Zvcl9iYWRfZXJhc2VibG9ja3Modm9pZCkKK3sKKwlpbnQgaSwgYmFkID0gMDsKKworCWJidCA9IGttYWxsb2MoZWJjbnQsIEdGUF9LRVJORUwpOworCWlmICghYmJ0KSB7CisJCXByaW50ayhQUklOVF9QUkVGICJlcnJvcjogY2Fubm90IGFsbG9jYXRlIG1lbW9yeVxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwltZW1zZXQoYmJ0LCAwICwgZWJjbnQpOworCisJcHJpbnRrKFBSSU5UX1BSRUYgInNjYW5uaW5nIGZvciBiYWQgZXJhc2VibG9ja3NcbiIpOworCWZvciAoaSA9IDA7IGkgPCBlYmNudDsgKytpKSB7CisJCWJidFtpXSA9IGlzX2Jsb2NrX2JhZChpKSA/IDEgOiAwOworCQlpZiAoYmJ0W2ldKQorCQkJYmFkICs9IDE7CisJCWNvbmRfcmVzY2hlZCgpOworCX0KKwlwcmludGsoUFJJTlRfUFJFRiAic2Nhbm5lZCAlZCBlcmFzZWJsb2NrcywgJWQgYXJlIGJhZFxuIiwgaSwgYmFkKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2luaXQgbXRkX3JlYWR0ZXN0X2luaXQodm9pZCkKK3sKKwl1aW50NjRfdCB0bXA7CisJaW50IGVyciwgaTsKKworCXByaW50ayhLRVJOX0lORk8gIlxuIik7CisJcHJpbnRrKEtFUk5fSU5GTyAiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIik7CisJcHJpbnRrKFBSSU5UX1BSRUYgIk1URCBkZXZpY2U6ICVkXG4iLCBkZXYpOworCisJbXRkID0gZ2V0X210ZF9kZXZpY2UoTlVMTCwgZGV2KTsKKwlpZiAoSVNfRVJSKG10ZCkpIHsKKwkJZXJyID0gUFRSX0VSUihtdGQpOworCQlwcmludGsoUFJJTlRfUFJFRiAiZXJyb3I6IENhbm5vdCBnZXQgTVREIGRldmljZVxuIik7CisJCXJldHVybiBlcnI7CisJfQorCisJaWYgKG10ZC0+d3JpdGVzaXplID09IDEpIHsKKwkJcHJpbnRrKFBSSU5UX1BSRUYgIm5vdCBOQU5EIGZsYXNoLCBhc3N1bWUgcGFnZSBzaXplIGlzIDUxMiAiCisJCSAgICAgICAiYnl0ZXMuXG4iKTsKKwkJcGdzaXplID0gNTEyOworCX0gZWxzZQorCQlwZ3NpemUgPSBtdGQtPndyaXRlc2l6ZTsKKworCXRtcCA9IG10ZC0+c2l6ZTsKKwlkb19kaXYodG1wLCBtdGQtPmVyYXNlc2l6ZSk7CisJZWJjbnQgPSB0bXA7CisJcGdjbnQgPSBtdGQtPmVyYXNlc2l6ZSAvIG10ZC0+d3JpdGVzaXplOworCisJcHJpbnRrKFBSSU5UX1BSRUYgIk1URCBkZXZpY2Ugc2l6ZSAlbGx1LCBlcmFzZWJsb2NrIHNpemUgJXUsICIKKwkgICAgICAgInBhZ2Ugc2l6ZSAldSwgY291bnQgb2YgZXJhc2VibG9ja3MgJXUsIHBhZ2VzIHBlciAiCisJICAgICAgICJlcmFzZWJsb2NrICV1LCBPT0Igc2l6ZSAldVxuIiwKKwkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyltdGQtPnNpemUsIG10ZC0+ZXJhc2VzaXplLAorCSAgICAgICBwZ3NpemUsIGViY250LCBwZ2NudCwgbXRkLT5vb2JzaXplKTsKKworCWVyciA9IC1FTk9NRU07CisJaW9idWYgPSBrbWFsbG9jKG10ZC0+ZXJhc2VzaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWlvYnVmKSB7CisJCXByaW50ayhQUklOVF9QUkVGICJlcnJvcjogY2Fubm90IGFsbG9jYXRlIG1lbW9yeVxuIik7CisJCWdvdG8gb3V0OworCX0KKwlpb2J1ZjEgPSBrbWFsbG9jKG10ZC0+ZXJhc2VzaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWlvYnVmMSkgeworCQlwcmludGsoUFJJTlRfUFJFRiAiZXJyb3I6IGNhbm5vdCBhbGxvY2F0ZSBtZW1vcnlcbiIpOworCQlnb3RvIG91dDsKKwl9CisKKwllcnIgPSBzY2FuX2Zvcl9iYWRfZXJhc2VibG9ja3MoKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKworCS8qIFJlYWQgYWxsIGVyYXNlYmxvY2tzIDEgcGFnZSBhdCBhIHRpbWUgKi8KKwlwcmludGsoUFJJTlRfUFJFRiAidGVzdGluZyBwYWdlIHJlYWRcbiIpOworCWZvciAoaSA9IDA7IGkgPCBlYmNudDsgKytpKSB7CisJCWludCByZXQ7CisKKwkJaWYgKGJidFtpXSkKKwkJCWNvbnRpbnVlOworCQlyZXQgPSByZWFkX2VyYXNlYmxvY2tfYnlfcGFnZShpKTsKKwkJaWYgKHJldCkgeworCQkJZHVtcF9lcmFzZWJsb2NrKGkpOworCQkJaWYgKCFlcnIpCisJCQkJZXJyID0gcmV0OworCQl9CisJCWNvbmRfcmVzY2hlZCgpOworCX0KKworCWlmIChlcnIpCisJCXByaW50ayhQUklOVF9QUkVGICJmaW5pc2hlZCB3aXRoIGVycm9yc1xuIik7CisJZWxzZQorCQlwcmludGsoUFJJTlRfUFJFRiAiZmluaXNoZWRcbiIpOworCitvdXQ6CisKKwlrZnJlZShpb2J1Zik7CisJa2ZyZWUoaW9idWYxKTsKKwlrZnJlZShiYnQpOworCXB1dF9tdGRfZGV2aWNlKG10ZCk7CisJaWYgKGVycikKKwkJcHJpbnRrKFBSSU5UX1BSRUYgImVycm9yICVkIG9jY3VycmVkXG4iLCBlcnIpOworCXByaW50ayhLRVJOX0lORk8gIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIpOworCXJldHVybiBlcnI7Cit9Cittb2R1bGVfaW5pdChtdGRfcmVhZHRlc3RfaW5pdCk7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBtdGRfcmVhZHRlc3RfZXhpdCh2b2lkKQoreworCXJldHVybjsKK30KK21vZHVsZV9leGl0KG10ZF9yZWFkdGVzdF9leGl0KTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJSZWFkIHRlc3QgbW9kdWxlIik7CitNT0RVTEVfQVVUSE9SKCJBZHJpYW4gSHVudGVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC90ZXN0cy9tdGRfc3BlZWR0ZXN0LmMgYi9kcml2ZXJzL210ZC90ZXN0cy9tdGRfc3BlZWR0ZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQxMzYzYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbXRkL3Rlc3RzL210ZF9zcGVlZHRlc3QuYwpAQCAtMCwwICsxLDUwMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBOb2tpYSBDb3Jwb3JhdGlvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKgorICogVGVzdCByZWFkIGFuZCB3cml0ZSBzcGVlZCBvZiBhIE1URCBkZXZpY2UuCisgKgorICogQXV0aG9yOiBBZHJpYW4gSHVudGVyIDxleHQtYWRyaWFuLmh1bnRlckBub2tpYS5jb20+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L210ZC9tdGQuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorCisjZGVmaW5lIFBSSU5UX1BSRUYgS0VSTl9JTkZPICJtdGRfc3BlZWR0ZXN0OiAiCisKK3N0YXRpYyBpbnQgZGV2OworbW9kdWxlX3BhcmFtKGRldiwgaW50LCBTX0lSVUdPKTsKK01PRFVMRV9QQVJNX0RFU0MoZGV2LCAiTVREIGRldmljZSBudW1iZXIgdG8gdXNlIik7CisKK3N0YXRpYyBzdHJ1Y3QgbXRkX2luZm8gKm10ZDsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyICppb2J1ZjsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyICpiYnQ7CisKK3N0YXRpYyBpbnQgcGdzaXplOworc3RhdGljIGludCBlYmNudDsKK3N0YXRpYyBpbnQgcGdjbnQ7CitzdGF0aWMgaW50IGdvb2RlYmNudDsKK3N0YXRpYyBzdHJ1Y3QgdGltZXZhbCBzdGFydCwgZmluaXNoOworc3RhdGljIHVuc2lnbmVkIGxvbmcgbmV4dCA9IDE7CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHNpbXBsZV9yYW5kKHZvaWQpCit7CisJbmV4dCA9IG5leHQgKiAxMTAzNTE1MjQ1ICsgMTIzNDU7CisJcmV0dXJuICh1bnNpZ25lZCBpbnQpKChuZXh0IC8gNjU1MzYpICUgMzI3NjgpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2ltcGxlX3NyYW5kKHVuc2lnbmVkIGxvbmcgc2VlZCkKK3sKKwluZXh0ID0gc2VlZDsKK30KKworc3RhdGljIHZvaWQgc2V0X3JhbmRvbV9kYXRhKHVuc2lnbmVkIGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbikKK3sKKwlzaXplX3QgaTsKKworCWZvciAoaSA9IDA7IGkgPCBsZW47ICsraSkKKwkJYnVmW2ldID0gc2ltcGxlX3JhbmQoKTsKK30KKworc3RhdGljIGludCBlcmFzZV9lcmFzZWJsb2NrKGludCBlYm51bSkKK3sKKwlpbnQgZXJyOworCXN0cnVjdCBlcmFzZV9pbmZvIGVpOworCWxvZmZfdCBhZGRyID0gZWJudW0gKiBtdGQtPmVyYXNlc2l6ZTsKKworCW1lbXNldCgmZWksIDAsIHNpemVvZihzdHJ1Y3QgZXJhc2VfaW5mbykpOworCWVpLm10ZCAgPSBtdGQ7CisJZWkuYWRkciA9IGFkZHI7CisJZWkubGVuICA9IG10ZC0+ZXJhc2VzaXplOworCisJZXJyID0gbXRkLT5lcmFzZShtdGQsICZlaSk7CisJaWYgKGVycikgeworCQlwcmludGsoUFJJTlRfUFJFRiAiZXJyb3IgJWQgd2hpbGUgZXJhc2luZyBFQiAlZFxuIiwgZXJyLCBlYm51bSk7CisJCXJldHVybiBlcnI7CisJfQorCisJaWYgKGVpLnN0YXRlID09IE1URF9FUkFTRV9GQUlMRUQpIHsKKwkJcHJpbnRrKFBSSU5UX1BSRUYgInNvbWUgZXJhc2UgZXJyb3Igb2NjdXJyZWQgYXQgRUIgJWRcbiIsCisJCSAgICAgICBlYm51bSk7CisJCXJldHVybiAtRUlPOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGVyYXNlX3dob2xlX2RldmljZSh2b2lkKQoreworCWludCBlcnI7CisJdW5zaWduZWQgaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgZWJjbnQ7ICsraSkgeworCQlpZiAoYmJ0W2ldKQorCQkJY29udGludWU7CisJCWVyciA9IGVyYXNlX2VyYXNlYmxvY2soaSk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOworCQljb25kX3Jlc2NoZWQoKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd3JpdGVfZXJhc2VibG9jayhpbnQgZWJudW0pCit7CisJc2l6ZV90IHdyaXR0ZW4gPSAwOworCWludCBlcnIgPSAwOworCWxvZmZfdCBhZGRyID0gZWJudW0gKiBtdGQtPmVyYXNlc2l6ZTsKKworCWVyciA9IG10ZC0+d3JpdGUobXRkLCBhZGRyLCBtdGQtPmVyYXNlc2l6ZSwgJndyaXR0ZW4sIGlvYnVmKTsKKwlpZiAoZXJyIHx8IHdyaXR0ZW4gIT0gbXRkLT5lcmFzZXNpemUpIHsKKwkJcHJpbnRrKFBSSU5UX1BSRUYgImVycm9yOiB3cml0ZSBmYWlsZWQgYXQgJSNsbHhcbiIsIGFkZHIpOworCQlpZiAoIWVycikKKwkJCWVyciA9IC1FSU5WQUw7CisJfQorCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCB3cml0ZV9lcmFzZWJsb2NrX2J5X3BhZ2UoaW50IGVibnVtKQoreworCXNpemVfdCB3cml0dGVuID0gMDsKKwlpbnQgaSwgZXJyID0gMDsKKwlsb2ZmX3QgYWRkciA9IGVibnVtICogbXRkLT5lcmFzZXNpemU7CisJdm9pZCAqYnVmID0gaW9idWY7CisKKwlmb3IgKGkgPSAwOyBpIDwgcGdjbnQ7IGkrKykgeworCQllcnIgPSBtdGQtPndyaXRlKG10ZCwgYWRkciwgcGdzaXplLCAmd3JpdHRlbiwgYnVmKTsKKwkJaWYgKGVyciB8fCB3cml0dGVuICE9IHBnc2l6ZSkgeworCQkJcHJpbnRrKFBSSU5UX1BSRUYgImVycm9yOiB3cml0ZSBmYWlsZWQgYXQgJSNsbHhcbiIsCisJCQkgICAgICAgYWRkcik7CisJCQlpZiAoIWVycikKKwkJCQllcnIgPSAtRUlOVkFMOworCQkJYnJlYWs7CisJCX0KKwkJYWRkciArPSBwZ3NpemU7CisJCWJ1ZiArPSBwZ3NpemU7CisJfQorCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCB3cml0ZV9lcmFzZWJsb2NrX2J5XzJwYWdlcyhpbnQgZWJudW0pCit7CisJc2l6ZV90IHdyaXR0ZW4gPSAwLCBzeiA9IHBnc2l6ZSAqIDI7CisJaW50IGksIG4gPSBwZ2NudCAvIDIsIGVyciA9IDA7CisJbG9mZl90IGFkZHIgPSBlYm51bSAqIG10ZC0+ZXJhc2VzaXplOworCXZvaWQgKmJ1ZiA9IGlvYnVmOworCisJZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworCQllcnIgPSBtdGQtPndyaXRlKG10ZCwgYWRkciwgc3osICZ3cml0dGVuLCBidWYpOworCQlpZiAoZXJyIHx8IHdyaXR0ZW4gIT0gc3opIHsKKwkJCXByaW50ayhQUklOVF9QUkVGICJlcnJvcjogd3JpdGUgZmFpbGVkIGF0ICUjbGx4XG4iLAorCQkJICAgICAgIGFkZHIpOworCQkJaWYgKCFlcnIpCisJCQkJZXJyID0gLUVJTlZBTDsKKwkJCXJldHVybiBlcnI7CisJCX0KKwkJYWRkciArPSBzejsKKwkJYnVmICs9IHN6OworCX0KKwlpZiAocGdjbnQgJSAyKSB7CisJCWVyciA9IG10ZC0+d3JpdGUobXRkLCBhZGRyLCBwZ3NpemUsICZ3cml0dGVuLCBidWYpOworCQlpZiAoZXJyIHx8IHdyaXR0ZW4gIT0gcGdzaXplKSB7CisJCQlwcmludGsoUFJJTlRfUFJFRiAiZXJyb3I6IHdyaXRlIGZhaWxlZCBhdCAlI2xseFxuIiwKKwkJCSAgICAgICBhZGRyKTsKKwkJCWlmICghZXJyKQorCQkJCWVyciA9IC1FSU5WQUw7CisJCX0KKwl9CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHJlYWRfZXJhc2VibG9jayhpbnQgZWJudW0pCit7CisJc2l6ZV90IHJlYWQgPSAwOworCWludCBlcnIgPSAwOworCWxvZmZfdCBhZGRyID0gZWJudW0gKiBtdGQtPmVyYXNlc2l6ZTsKKworCWVyciA9IG10ZC0+cmVhZChtdGQsIGFkZHIsIG10ZC0+ZXJhc2VzaXplLCAmcmVhZCwgaW9idWYpOworCS8qIElnbm9yZSBjb3JyZWN0ZWQgRUNDIGVycm9ycyAqLworCWlmIChlcnIgPT0gLUVVQ0xFQU4pCisJCWVyciA9IDA7CisJaWYgKGVyciB8fCByZWFkICE9IG10ZC0+ZXJhc2VzaXplKSB7CisJCXByaW50ayhQUklOVF9QUkVGICJlcnJvcjogcmVhZCBmYWlsZWQgYXQgJSNsbHhcbiIsIGFkZHIpOworCQlpZiAoIWVycikKKwkJCWVyciA9IC1FSU5WQUw7CisJfQorCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCByZWFkX2VyYXNlYmxvY2tfYnlfcGFnZShpbnQgZWJudW0pCit7CisJc2l6ZV90IHJlYWQgPSAwOworCWludCBpLCBlcnIgPSAwOworCWxvZmZfdCBhZGRyID0gZWJudW0gKiBtdGQtPmVyYXNlc2l6ZTsKKwl2b2lkICpidWYgPSBpb2J1ZjsKKworCWZvciAoaSA9IDA7IGkgPCBwZ2NudDsgaSsrKSB7CisJCWVyciA9IG10ZC0+cmVhZChtdGQsIGFkZHIsIHBnc2l6ZSwgJnJlYWQsIGJ1Zik7CisJCS8qIElnbm9yZSBjb3JyZWN0ZWQgRUNDIGVycm9ycyAqLworCQlpZiAoZXJyID09IC1FVUNMRUFOKQorCQkJZXJyID0gMDsKKwkJaWYgKGVyciB8fCByZWFkICE9IHBnc2l6ZSkgeworCQkJcHJpbnRrKFBSSU5UX1BSRUYgImVycm9yOiByZWFkIGZhaWxlZCBhdCAlI2xseFxuIiwKKwkJCSAgICAgICBhZGRyKTsKKwkJCWlmICghZXJyKQorCQkJCWVyciA9IC1FSU5WQUw7CisJCQlicmVhazsKKwkJfQorCQlhZGRyICs9IHBnc2l6ZTsKKwkJYnVmICs9IHBnc2l6ZTsKKwl9CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHJlYWRfZXJhc2VibG9ja19ieV8ycGFnZXMoaW50IGVibnVtKQoreworCXNpemVfdCByZWFkID0gMCwgc3ogPSBwZ3NpemUgKiAyOworCWludCBpLCBuID0gcGdjbnQgLyAyLCBlcnIgPSAwOworCWxvZmZfdCBhZGRyID0gZWJudW0gKiBtdGQtPmVyYXNlc2l6ZTsKKwl2b2lkICpidWYgPSBpb2J1ZjsKKworCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKwkJZXJyID0gbXRkLT5yZWFkKG10ZCwgYWRkciwgc3osICZyZWFkLCBidWYpOworCQkvKiBJZ25vcmUgY29ycmVjdGVkIEVDQyBlcnJvcnMgKi8KKwkJaWYgKGVyciA9PSAtRVVDTEVBTikKKwkJCWVyciA9IDA7CisJCWlmIChlcnIgfHwgcmVhZCAhPSBzeikgeworCQkJcHJpbnRrKFBSSU5UX1BSRUYgImVycm9yOiByZWFkIGZhaWxlZCBhdCAlI2xseFxuIiwKKwkJCSAgICAgICBhZGRyKTsKKwkJCWlmICghZXJyKQorCQkJCWVyciA9IC1FSU5WQUw7CisJCQlyZXR1cm4gZXJyOworCQl9CisJCWFkZHIgKz0gc3o7CisJCWJ1ZiArPSBzejsKKwl9CisJaWYgKHBnY250ICUgMikgeworCQllcnIgPSBtdGQtPnJlYWQobXRkLCBhZGRyLCBwZ3NpemUsICZyZWFkLCBidWYpOworCQkvKiBJZ25vcmUgY29ycmVjdGVkIEVDQyBlcnJvcnMgKi8KKwkJaWYgKGVyciA9PSAtRVVDTEVBTikKKwkJCWVyciA9IDA7CisJCWlmIChlcnIgfHwgcmVhZCAhPSBwZ3NpemUpIHsKKwkJCXByaW50ayhQUklOVF9QUkVGICJlcnJvcjogcmVhZCBmYWlsZWQgYXQgJSNsbHhcbiIsCisJCQkgICAgICAgYWRkcik7CisJCQlpZiAoIWVycikKKwkJCQllcnIgPSAtRUlOVkFMOworCQl9CisJfQorCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBpc19ibG9ja19iYWQoaW50IGVibnVtKQoreworCWxvZmZfdCBhZGRyID0gZWJudW0gKiBtdGQtPmVyYXNlc2l6ZTsKKwlpbnQgcmV0OworCisJcmV0ID0gbXRkLT5ibG9ja19pc2JhZChtdGQsIGFkZHIpOworCWlmIChyZXQpCisJCXByaW50ayhQUklOVF9QUkVGICJibG9jayAlZCBpcyBiYWRcbiIsIGVibnVtKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc3RhcnRfdGltaW5nKHZvaWQpCit7CisJZG9fZ2V0dGltZW9mZGF5KCZzdGFydCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzdG9wX3RpbWluZyh2b2lkKQoreworCWRvX2dldHRpbWVvZmRheSgmZmluaXNoKTsKK30KKworc3RhdGljIGxvbmcgY2FsY19zcGVlZCh2b2lkKQoreworCWxvbmcgbXMsIGssIHNwZWVkOworCisJbXMgPSAoZmluaXNoLnR2X3NlYyAtIHN0YXJ0LnR2X3NlYykgKiAxMDAwICsKKwkgICAgIChmaW5pc2gudHZfdXNlYyAtIHN0YXJ0LnR2X3VzZWMpIC8gMTAwMDsKKwlrID0gZ29vZGViY250ICogbXRkLT5lcmFzZXNpemUgLyAxMDI0OworCXNwZWVkID0gKGsgKiAxMDAwKSAvIG1zOworCXJldHVybiBzcGVlZDsKK30KKworc3RhdGljIGludCBzY2FuX2Zvcl9iYWRfZXJhc2VibG9ja3Modm9pZCkKK3sKKwlpbnQgaSwgYmFkID0gMDsKKworCWJidCA9IGttYWxsb2MoZWJjbnQsIEdGUF9LRVJORUwpOworCWlmICghYmJ0KSB7CisJCXByaW50ayhQUklOVF9QUkVGICJlcnJvcjogY2Fubm90IGFsbG9jYXRlIG1lbW9yeVxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwltZW1zZXQoYmJ0LCAwICwgZWJjbnQpOworCisJcHJpbnRrKFBSSU5UX1BSRUYgInNjYW5uaW5nIGZvciBiYWQgZXJhc2VibG9ja3NcbiIpOworCWZvciAoaSA9IDA7IGkgPCBlYmNudDsgKytpKSB7CisJCWJidFtpXSA9IGlzX2Jsb2NrX2JhZChpKSA/IDEgOiAwOworCQlpZiAoYmJ0W2ldKQorCQkJYmFkICs9IDE7CisJCWNvbmRfcmVzY2hlZCgpOworCX0KKwlwcmludGsoUFJJTlRfUFJFRiAic2Nhbm5lZCAlZCBlcmFzZWJsb2NrcywgJWQgYXJlIGJhZFxuIiwgaSwgYmFkKTsKKwlnb29kZWJjbnQgPSBlYmNudCAtIGJhZDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2luaXQgbXRkX3NwZWVkdGVzdF9pbml0KHZvaWQpCit7CisJaW50IGVyciwgaTsKKwlsb25nIHNwZWVkOworCXVpbnQ2NF90IHRtcDsKKworCXByaW50ayhLRVJOX0lORk8gIlxuIik7CisJcHJpbnRrKEtFUk5fSU5GTyAiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIik7CisJcHJpbnRrKFBSSU5UX1BSRUYgIk1URCBkZXZpY2U6ICVkXG4iLCBkZXYpOworCisJbXRkID0gZ2V0X210ZF9kZXZpY2UoTlVMTCwgZGV2KTsKKwlpZiAoSVNfRVJSKG10ZCkpIHsKKwkJZXJyID0gUFRSX0VSUihtdGQpOworCQlwcmludGsoUFJJTlRfUFJFRiAiZXJyb3I6IGNhbm5vdCBnZXQgTVREIGRldmljZVxuIik7CisJCXJldHVybiBlcnI7CisJfQorCisJaWYgKG10ZC0+d3JpdGVzaXplID09IDEpIHsKKwkJcHJpbnRrKFBSSU5UX1BSRUYgIm5vdCBOQU5EIGZsYXNoLCBhc3N1bWUgcGFnZSBzaXplIGlzIDUxMiAiCisJCSAgICAgICAiYnl0ZXMuXG4iKTsKKwkJcGdzaXplID0gNTEyOworCX0gZWxzZQorCQlwZ3NpemUgPSBtdGQtPndyaXRlc2l6ZTsKKworCXRtcCA9IG10ZC0+c2l6ZTsKKwlkb19kaXYodG1wLCBtdGQtPmVyYXNlc2l6ZSk7CisJZWJjbnQgPSB0bXA7CisJcGdjbnQgPSBtdGQtPmVyYXNlc2l6ZSAvIG10ZC0+d3JpdGVzaXplOworCisJcHJpbnRrKFBSSU5UX1BSRUYgIk1URCBkZXZpY2Ugc2l6ZSAlbGx1LCBlcmFzZWJsb2NrIHNpemUgJXUsICIKKwkgICAgICAgInBhZ2Ugc2l6ZSAldSwgY291bnQgb2YgZXJhc2VibG9ja3MgJXUsIHBhZ2VzIHBlciAiCisJICAgICAgICJlcmFzZWJsb2NrICV1LCBPT0Igc2l6ZSAldVxuIiwKKwkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyltdGQtPnNpemUsIG10ZC0+ZXJhc2VzaXplLAorCSAgICAgICBwZ3NpemUsIGViY250LCBwZ2NudCwgbXRkLT5vb2JzaXplKTsKKworCWVyciA9IC1FTk9NRU07CisJaW9idWYgPSBrbWFsbG9jKG10ZC0+ZXJhc2VzaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWlvYnVmKSB7CisJCXByaW50ayhQUklOVF9QUkVGICJlcnJvcjogY2Fubm90IGFsbG9jYXRlIG1lbW9yeVxuIik7CisJCWdvdG8gb3V0OworCX0KKworCXNpbXBsZV9zcmFuZCgxKTsKKwlzZXRfcmFuZG9tX2RhdGEoaW9idWYsIG10ZC0+ZXJhc2VzaXplKTsKKworCWVyciA9IHNjYW5fZm9yX2JhZF9lcmFzZWJsb2NrcygpOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCisJZXJyID0gZXJhc2Vfd2hvbGVfZGV2aWNlKCk7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisKKwkvKiBXcml0ZSBhbGwgZXJhc2VibG9ja3MsIDEgZXJhc2VibG9jayBhdCBhIHRpbWUgKi8KKwlwcmludGsoUFJJTlRfUFJFRiAidGVzdGluZyBlcmFzZWJsb2NrIHdyaXRlIHNwZWVkXG4iKTsKKwlzdGFydF90aW1pbmcoKTsKKwlmb3IgKGkgPSAwOyBpIDwgZWJjbnQ7ICsraSkgeworCQlpZiAoYmJ0W2ldKQorCQkJY29udGludWU7CisJCWVyciA9IHdyaXRlX2VyYXNlYmxvY2soaSk7CisJCWlmIChlcnIpCisJCQlnb3RvIG91dDsKKwkJY29uZF9yZXNjaGVkKCk7CisJfQorCXN0b3BfdGltaW5nKCk7CisJc3BlZWQgPSBjYWxjX3NwZWVkKCk7CisJcHJpbnRrKFBSSU5UX1BSRUYgImVyYXNlYmxvY2sgd3JpdGUgc3BlZWQgaXMgJWxkIEtpQi9zXG4iLCBzcGVlZCk7CisKKwkvKiBSZWFkIGFsbCBlcmFzZWJsb2NrcywgMSBlcmFzZWJsb2NrIGF0IGEgdGltZSAqLworCXByaW50ayhQUklOVF9QUkVGICJ0ZXN0aW5nIGVyYXNlYmxvY2sgcmVhZCBzcGVlZFxuIik7CisJc3RhcnRfdGltaW5nKCk7CisJZm9yIChpID0gMDsgaSA8IGViY250OyArK2kpIHsKKwkJaWYgKGJidFtpXSkKKwkJCWNvbnRpbnVlOworCQllcnIgPSByZWFkX2VyYXNlYmxvY2soaSk7CisJCWlmIChlcnIpCisJCQlnb3RvIG91dDsKKwkJY29uZF9yZXNjaGVkKCk7CisJfQorCXN0b3BfdGltaW5nKCk7CisJc3BlZWQgPSBjYWxjX3NwZWVkKCk7CisJcHJpbnRrKFBSSU5UX1BSRUYgImVyYXNlYmxvY2sgcmVhZCBzcGVlZCBpcyAlbGQgS2lCL3NcbiIsIHNwZWVkKTsKKworCWVyciA9IGVyYXNlX3dob2xlX2RldmljZSgpOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCisJLyogV3JpdGUgYWxsIGVyYXNlYmxvY2tzLCAxIHBhZ2UgYXQgYSB0aW1lICovCisJcHJpbnRrKFBSSU5UX1BSRUYgInRlc3RpbmcgcGFnZSB3cml0ZSBzcGVlZFxuIik7CisJc3RhcnRfdGltaW5nKCk7CisJZm9yIChpID0gMDsgaSA8IGViY250OyArK2kpIHsKKwkJaWYgKGJidFtpXSkKKwkJCWNvbnRpbnVlOworCQllcnIgPSB3cml0ZV9lcmFzZWJsb2NrX2J5X3BhZ2UoaSk7CisJCWlmIChlcnIpCisJCQlnb3RvIG91dDsKKwkJY29uZF9yZXNjaGVkKCk7CisJfQorCXN0b3BfdGltaW5nKCk7CisJc3BlZWQgPSBjYWxjX3NwZWVkKCk7CisJcHJpbnRrKFBSSU5UX1BSRUYgInBhZ2Ugd3JpdGUgc3BlZWQgaXMgJWxkIEtpQi9zXG4iLCBzcGVlZCk7CisKKwkvKiBSZWFkIGFsbCBlcmFzZWJsb2NrcywgMSBwYWdlIGF0IGEgdGltZSAqLworCXByaW50ayhQUklOVF9QUkVGICJ0ZXN0aW5nIHBhZ2UgcmVhZCBzcGVlZFxuIik7CisJc3RhcnRfdGltaW5nKCk7CisJZm9yIChpID0gMDsgaSA8IGViY250OyArK2kpIHsKKwkJaWYgKGJidFtpXSkKKwkJCWNvbnRpbnVlOworCQllcnIgPSByZWFkX2VyYXNlYmxvY2tfYnlfcGFnZShpKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gb3V0OworCQljb25kX3Jlc2NoZWQoKTsKKwl9CisJc3RvcF90aW1pbmcoKTsKKwlzcGVlZCA9IGNhbGNfc3BlZWQoKTsKKwlwcmludGsoUFJJTlRfUFJFRiAicGFnZSByZWFkIHNwZWVkIGlzICVsZCBLaUIvc1xuIiwgc3BlZWQpOworCisJZXJyID0gZXJhc2Vfd2hvbGVfZGV2aWNlKCk7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisKKwkvKiBXcml0ZSBhbGwgZXJhc2VibG9ja3MsIDIgcGFnZXMgYXQgYSB0aW1lICovCisJcHJpbnRrKFBSSU5UX1BSRUYgInRlc3RpbmcgMiBwYWdlIHdyaXRlIHNwZWVkXG4iKTsKKwlzdGFydF90aW1pbmcoKTsKKwlmb3IgKGkgPSAwOyBpIDwgZWJjbnQ7ICsraSkgeworCQlpZiAoYmJ0W2ldKQorCQkJY29udGludWU7CisJCWVyciA9IHdyaXRlX2VyYXNlYmxvY2tfYnlfMnBhZ2VzKGkpOworCQlpZiAoZXJyKQorCQkJZ290byBvdXQ7CisJCWNvbmRfcmVzY2hlZCgpOworCX0KKwlzdG9wX3RpbWluZygpOworCXNwZWVkID0gY2FsY19zcGVlZCgpOworCXByaW50ayhQUklOVF9QUkVGICIyIHBhZ2Ugd3JpdGUgc3BlZWQgaXMgJWxkIEtpQi9zXG4iLCBzcGVlZCk7CisKKwkvKiBSZWFkIGFsbCBlcmFzZWJsb2NrcywgMiBwYWdlcyBhdCBhIHRpbWUgKi8KKwlwcmludGsoUFJJTlRfUFJFRiAidGVzdGluZyAyIHBhZ2UgcmVhZCBzcGVlZFxuIik7CisJc3RhcnRfdGltaW5nKCk7CisJZm9yIChpID0gMDsgaSA8IGViY250OyArK2kpIHsKKwkJaWYgKGJidFtpXSkKKwkJCWNvbnRpbnVlOworCQllcnIgPSByZWFkX2VyYXNlYmxvY2tfYnlfMnBhZ2VzKGkpOworCQlpZiAoZXJyKQorCQkJZ290byBvdXQ7CisJCWNvbmRfcmVzY2hlZCgpOworCX0KKwlzdG9wX3RpbWluZygpOworCXNwZWVkID0gY2FsY19zcGVlZCgpOworCXByaW50ayhQUklOVF9QUkVGICIyIHBhZ2UgcmVhZCBzcGVlZCBpcyAlbGQgS2lCL3NcbiIsIHNwZWVkKTsKKworCS8qIEVyYXNlIGFsbCBlcmFzZWJsb2NrcyAqLworCXByaW50ayhQUklOVF9QUkVGICJUZXN0aW5nIGVyYXNlIHNwZWVkXG4iKTsKKwlzdGFydF90aW1pbmcoKTsKKwlmb3IgKGkgPSAwOyBpIDwgZWJjbnQ7ICsraSkgeworCQlpZiAoYmJ0W2ldKQorCQkJY29udGludWU7CisJCWVyciA9IGVyYXNlX2VyYXNlYmxvY2soaSk7CisJCWlmIChlcnIpCisJCQlnb3RvIG91dDsKKwkJY29uZF9yZXNjaGVkKCk7CisJfQorCXN0b3BfdGltaW5nKCk7CisJc3BlZWQgPSBjYWxjX3NwZWVkKCk7CisJcHJpbnRrKFBSSU5UX1BSRUYgImVyYXNlIHNwZWVkIGlzICVsZCBLaUIvc1xuIiwgc3BlZWQpOworCisJcHJpbnRrKFBSSU5UX1BSRUYgImZpbmlzaGVkXG4iKTsKK291dDoKKwlrZnJlZShpb2J1Zik7CisJa2ZyZWUoYmJ0KTsKKwlwdXRfbXRkX2RldmljZShtdGQpOworCWlmIChlcnIpCisJCXByaW50ayhQUklOVF9QUkVGICJlcnJvciAlZCBvY2N1cnJlZFxuIiwgZXJyKTsKKwlwcmludGsoS0VSTl9JTkZPICI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iKTsKKwlyZXR1cm4gZXJyOworfQorbW9kdWxlX2luaXQobXRkX3NwZWVkdGVzdF9pbml0KTsKKworc3RhdGljIHZvaWQgX19leGl0IG10ZF9zcGVlZHRlc3RfZXhpdCh2b2lkKQoreworCXJldHVybjsKK30KK21vZHVsZV9leGl0KG10ZF9zcGVlZHRlc3RfZXhpdCk7CisKK01PRFVMRV9ERVNDUklQVElPTigiU3BlZWQgdGVzdCBtb2R1bGUiKTsKK01PRFVMRV9BVVRIT1IoIkFkcmlhbiBIdW50ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL3Rlc3RzL210ZF9zdHJlc3N0ZXN0LmMgYi9kcml2ZXJzL210ZC90ZXN0cy9tdGRfc3RyZXNzdGVzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzOTIwNDcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL210ZC90ZXN0cy9tdGRfc3RyZXNzdGVzdC5jCkBAIC0wLDAgKzEsMzMwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA2LTIwMDggTm9raWEgQ29ycG9yYXRpb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIFRlc3QgcmFuZG9tIHJlYWRzLCB3cml0ZXMgYW5kIGVyYXNlcyBvbiBNVEQgZGV2aWNlLgorICoKKyAqIEF1dGhvcjogQWRyaWFuIEh1bnRlciA8ZXh0LWFkcmlhbi5odW50ZXJAbm9raWEuY29tPgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9tdGQvbXRkLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisKKyNkZWZpbmUgUFJJTlRfUFJFRiBLRVJOX0lORk8gIm10ZF9zdHJlc3N0ZXN0OiAiCisKK3N0YXRpYyBpbnQgZGV2OworbW9kdWxlX3BhcmFtKGRldiwgaW50LCBTX0lSVUdPKTsKK01PRFVMRV9QQVJNX0RFU0MoZGV2LCAiTVREIGRldmljZSBudW1iZXIgdG8gdXNlIik7CisKK3N0YXRpYyBpbnQgY291bnQgPSAxMDAwMDsKK21vZHVsZV9wYXJhbShjb3VudCwgaW50LCBTX0lSVUdPKTsKK01PRFVMRV9QQVJNX0RFU0MoY291bnQsICJOdW1iZXIgb2Ygb3BlcmF0aW9ucyB0byBkbyAoZGVmYXVsdCBpcyAxMDAwMCkiKTsKKworc3RhdGljIHN0cnVjdCBtdGRfaW5mbyAqbXRkOworc3RhdGljIHVuc2lnbmVkIGNoYXIgKndyaXRlYnVmOworc3RhdGljIHVuc2lnbmVkIGNoYXIgKnJlYWRidWY7CitzdGF0aWMgdW5zaWduZWQgY2hhciAqYmJ0Oworc3RhdGljIGludCAqb2Zmc2V0czsKKworc3RhdGljIGludCBwZ3NpemU7CitzdGF0aWMgaW50IGJ1ZnNpemU7CitzdGF0aWMgaW50IGViY250Oworc3RhdGljIGludCBwZ2NudDsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIG5leHQgPSAxOworCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBzaW1wbGVfcmFuZCh2b2lkKQoreworCW5leHQgPSBuZXh0ICogMTEwMzUxNTI0NSArIDEyMzQ1OworCXJldHVybiAodW5zaWduZWQgaW50KSgobmV4dCAvIDY1NTM2KSAlIDMyNzY4KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNpbXBsZV9zcmFuZCh1bnNpZ25lZCBsb25nIHNlZWQpCit7CisJbmV4dCA9IHNlZWQ7Cit9CisKK3N0YXRpYyBpbnQgcmFuZF9lYih2b2lkKQoreworCWludCBlYjsKKworYWdhaW46CisJaWYgKGViY250IDwgMzI3NjgpCisJCWViID0gc2ltcGxlX3JhbmQoKTsKKwllbHNlCisJCWViID0gKHNpbXBsZV9yYW5kKCkgPDwgMTUpIHwgc2ltcGxlX3JhbmQoKTsKKwkvKiBSZWFkIG9yIHdyaXRlIHVwIDIgZXJhc2VibG9ja3MgYXQgYSB0aW1lIC0gaGVuY2UgJ2ViY250IC0gMScgKi8KKwllYiAlPSAoZWJjbnQgLSAxKTsKKwlpZiAoYmJ0W2ViXSkKKwkJZ290byBhZ2FpbjsKKwlyZXR1cm4gZWI7Cit9CisKK3N0YXRpYyBpbnQgcmFuZF9vZmZzKHZvaWQpCit7CisJaW50IG9mZnM7CisKKwlpZiAoYnVmc2l6ZSA8IDMyNzY4KQorCQlvZmZzID0gc2ltcGxlX3JhbmQoKTsKKwllbHNlCisJCW9mZnMgPSAoc2ltcGxlX3JhbmQoKSA8PCAxNSkgfCBzaW1wbGVfcmFuZCgpOworCW9mZnMgJT0gYnVmc2l6ZTsKKwlyZXR1cm4gb2ZmczsKK30KKworc3RhdGljIGludCByYW5kX2xlbihpbnQgb2ZmcykKK3sKKwlpbnQgbGVuOworCisJaWYgKGJ1ZnNpemUgPCAzMjc2OCkKKwkJbGVuID0gc2ltcGxlX3JhbmQoKTsKKwllbHNlCisJCWxlbiA9IChzaW1wbGVfcmFuZCgpIDw8IDE1KSB8IHNpbXBsZV9yYW5kKCk7CisJbGVuICU9IChidWZzaXplIC0gb2Zmcyk7CisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIGludCBlcmFzZV9lcmFzZWJsb2NrKGludCBlYm51bSkKK3sKKwlpbnQgZXJyOworCXN0cnVjdCBlcmFzZV9pbmZvIGVpOworCWxvZmZfdCBhZGRyID0gZWJudW0gKiBtdGQtPmVyYXNlc2l6ZTsKKworCW1lbXNldCgmZWksIDAsIHNpemVvZihzdHJ1Y3QgZXJhc2VfaW5mbykpOworCWVpLm10ZCAgPSBtdGQ7CisJZWkuYWRkciA9IGFkZHI7CisJZWkubGVuICA9IG10ZC0+ZXJhc2VzaXplOworCisJZXJyID0gbXRkLT5lcmFzZShtdGQsICZlaSk7CisJaWYgKHVubGlrZWx5KGVycikpIHsKKwkJcHJpbnRrKFBSSU5UX1BSRUYgImVycm9yICVkIHdoaWxlIGVyYXNpbmcgRUIgJWRcbiIsIGVyciwgZWJudW0pOworCQlyZXR1cm4gZXJyOworCX0KKworCWlmICh1bmxpa2VseShlaS5zdGF0ZSA9PSBNVERfRVJBU0VfRkFJTEVEKSkgeworCQlwcmludGsoUFJJTlRfUFJFRiAic29tZSBlcmFzZSBlcnJvciBvY2N1cnJlZCBhdCBFQiAlZFxuIiwKKwkJICAgICAgIGVibnVtKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaXNfYmxvY2tfYmFkKGludCBlYm51bSkKK3sKKwlsb2ZmX3QgYWRkciA9IGVibnVtICogbXRkLT5lcmFzZXNpemU7CisJaW50IHJldDsKKworCXJldCA9IG10ZC0+YmxvY2tfaXNiYWQobXRkLCBhZGRyKTsKKwlpZiAocmV0KQorCQlwcmludGsoUFJJTlRfUFJFRiAiYmxvY2sgJWQgaXMgYmFkXG4iLCBlYm51bSk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBkb19yZWFkKHZvaWQpCit7CisJc2l6ZV90IHJlYWQgPSAwOworCWludCBlYiA9IHJhbmRfZWIoKTsKKwlpbnQgb2ZmcyA9IHJhbmRfb2ZmcygpOworCWludCBsZW4gPSByYW5kX2xlbihvZmZzKSwgZXJyOworCWxvZmZfdCBhZGRyOworCisJaWYgKGJidFtlYiArIDFdKSB7CisJCWlmIChvZmZzID49IG10ZC0+ZXJhc2VzaXplKQorCQkJb2ZmcyAtPSBtdGQtPmVyYXNlc2l6ZTsKKwkJaWYgKG9mZnMgKyBsZW4gPiBtdGQtPmVyYXNlc2l6ZSkKKwkJCWxlbiA9IG10ZC0+ZXJhc2VzaXplIC0gb2ZmczsKKwl9CisJYWRkciA9IGViICogbXRkLT5lcmFzZXNpemUgKyBvZmZzOworCWVyciA9IG10ZC0+cmVhZChtdGQsIGFkZHIsIGxlbiwgJnJlYWQsIHJlYWRidWYpOworCWlmIChlcnIgPT0gLUVVQ0xFQU4pCisJCWVyciA9IDA7CisJaWYgKHVubGlrZWx5KGVyciB8fCByZWFkICE9IGxlbikpIHsKKwkJcHJpbnRrKFBSSU5UX1BSRUYgImVycm9yOiByZWFkIGZhaWxlZCBhdCAweCVsbHhcbiIsCisJCSAgICAgICAobG9uZyBsb25nKWFkZHIpOworCQlpZiAoIWVycikKKwkJCWVyciA9IC1FSU5WQUw7CisJCXJldHVybiBlcnI7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRvX3dyaXRlKHZvaWQpCit7CisJaW50IGViID0gcmFuZF9lYigpLCBvZmZzLCBlcnIsIGxlbjsKKwlzaXplX3Qgd3JpdHRlbiA9IDA7CisJbG9mZl90IGFkZHI7CisKKwlvZmZzID0gb2Zmc2V0c1tlYl07CisJaWYgKG9mZnMgPj0gbXRkLT5lcmFzZXNpemUpIHsKKwkJZXJyID0gZXJhc2VfZXJhc2VibG9jayhlYik7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOworCQlvZmZzID0gb2Zmc2V0c1tlYl0gPSAwOworCX0KKwlsZW4gPSByYW5kX2xlbihvZmZzKTsKKwlsZW4gPSAoKGxlbiArIHBnc2l6ZSAtIDEpIC8gcGdzaXplKSAqIHBnc2l6ZTsKKwlpZiAob2ZmcyArIGxlbiA+IG10ZC0+ZXJhc2VzaXplKSB7CisJCWlmIChiYnRbZWIgKyAxXSkKKwkJCWxlbiA9IG10ZC0+ZXJhc2VzaXplIC0gb2ZmczsKKwkJZWxzZSB7CisJCQllcnIgPSBlcmFzZV9lcmFzZWJsb2NrKGViICsgMSk7CisJCQlpZiAoZXJyKQorCQkJCXJldHVybiBlcnI7CisJCQlvZmZzZXRzW2ViICsgMV0gPSAwOworCQl9CisJfQorCWFkZHIgPSBlYiAqIG10ZC0+ZXJhc2VzaXplICsgb2ZmczsKKwllcnIgPSBtdGQtPndyaXRlKG10ZCwgYWRkciwgbGVuLCAmd3JpdHRlbiwgd3JpdGVidWYpOworCWlmICh1bmxpa2VseShlcnIgfHwgd3JpdHRlbiAhPSBsZW4pKSB7CisJCXByaW50ayhQUklOVF9QUkVGICJlcnJvcjogd3JpdGUgZmFpbGVkIGF0IDB4JWxseFxuIiwKKwkJICAgICAgIChsb25nIGxvbmcpYWRkcik7CisJCWlmICghZXJyKQorCQkJZXJyID0gLUVJTlZBTDsKKwkJcmV0dXJuIGVycjsKKwl9CisJb2ZmcyArPSBsZW47CisJd2hpbGUgKG9mZnMgPiBtdGQtPmVyYXNlc2l6ZSkgeworCQlvZmZzZXRzW2ViKytdID0gbXRkLT5lcmFzZXNpemU7CisJCW9mZnMgLT0gbXRkLT5lcmFzZXNpemU7CisJfQorCW9mZnNldHNbZWJdID0gb2ZmczsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkb19vcGVyYXRpb24odm9pZCkKK3sKKwlpZiAoc2ltcGxlX3JhbmQoKSAmIDEpCisJCXJldHVybiBkb19yZWFkKCk7CisJZWxzZQorCQlyZXR1cm4gZG9fd3JpdGUoKTsKK30KKworc3RhdGljIGludCBzY2FuX2Zvcl9iYWRfZXJhc2VibG9ja3Modm9pZCkKK3sKKwlpbnQgaSwgYmFkID0gMDsKKworCWJidCA9IGttYWxsb2MoZWJjbnQsIEdGUF9LRVJORUwpOworCWlmICghYmJ0KSB7CisJCXByaW50ayhQUklOVF9QUkVGICJlcnJvcjogY2Fubm90IGFsbG9jYXRlIG1lbW9yeVxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwltZW1zZXQoYmJ0LCAwICwgZWJjbnQpOworCisJcHJpbnRrKFBSSU5UX1BSRUYgInNjYW5uaW5nIGZvciBiYWQgZXJhc2VibG9ja3NcbiIpOworCWZvciAoaSA9IDA7IGkgPCBlYmNudDsgKytpKSB7CisJCWJidFtpXSA9IGlzX2Jsb2NrX2JhZChpKSA/IDEgOiAwOworCQlpZiAoYmJ0W2ldKQorCQkJYmFkICs9IDE7CisJCWNvbmRfcmVzY2hlZCgpOworCX0KKwlwcmludGsoUFJJTlRfUFJFRiAic2Nhbm5lZCAlZCBlcmFzZWJsb2NrcywgJWQgYXJlIGJhZFxuIiwgaSwgYmFkKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2luaXQgbXRkX3N0cmVzc3Rlc3RfaW5pdCh2b2lkKQoreworCWludCBlcnI7CisJaW50IGksIG9wOworCXVpbnQ2NF90IHRtcDsKKworCXByaW50ayhLRVJOX0lORk8gIlxuIik7CisJcHJpbnRrKEtFUk5fSU5GTyAiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIik7CisJcHJpbnRrKFBSSU5UX1BSRUYgIk1URCBkZXZpY2U6ICVkXG4iLCBkZXYpOworCisJbXRkID0gZ2V0X210ZF9kZXZpY2UoTlVMTCwgZGV2KTsKKwlpZiAoSVNfRVJSKG10ZCkpIHsKKwkJZXJyID0gUFRSX0VSUihtdGQpOworCQlwcmludGsoUFJJTlRfUFJFRiAiZXJyb3I6IGNhbm5vdCBnZXQgTVREIGRldmljZVxuIik7CisJCXJldHVybiBlcnI7CisJfQorCisJaWYgKG10ZC0+d3JpdGVzaXplID09IDEpIHsKKwkJcHJpbnRrKFBSSU5UX1BSRUYgIm5vdCBOQU5EIGZsYXNoLCBhc3N1bWUgcGFnZSBzaXplIGlzIDUxMiAiCisJCSAgICAgICAiYnl0ZXMuXG4iKTsKKwkJcGdzaXplID0gNTEyOworCX0gZWxzZQorCQlwZ3NpemUgPSBtdGQtPndyaXRlc2l6ZTsKKworCXRtcCA9IG10ZC0+c2l6ZTsKKwlkb19kaXYodG1wLCBtdGQtPmVyYXNlc2l6ZSk7CisJZWJjbnQgPSB0bXA7CisJcGdjbnQgPSBtdGQtPmVyYXNlc2l6ZSAvIG10ZC0+d3JpdGVzaXplOworCisJcHJpbnRrKFBSSU5UX1BSRUYgIk1URCBkZXZpY2Ugc2l6ZSAlbGx1LCBlcmFzZWJsb2NrIHNpemUgJXUsICIKKwkgICAgICAgInBhZ2Ugc2l6ZSAldSwgY291bnQgb2YgZXJhc2VibG9ja3MgJXUsIHBhZ2VzIHBlciAiCisJICAgICAgICJlcmFzZWJsb2NrICV1LCBPT0Igc2l6ZSAldVxuIiwKKwkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyltdGQtPnNpemUsIG10ZC0+ZXJhc2VzaXplLAorCSAgICAgICBwZ3NpemUsIGViY250LCBwZ2NudCwgbXRkLT5vb2JzaXplKTsKKworCS8qIFJlYWQgb3Igd3JpdGUgdXAgMiBlcmFzZWJsb2NrcyBhdCBhIHRpbWUgKi8KKwlidWZzaXplID0gbXRkLT5lcmFzZXNpemUgKiAyOworCisJZXJyID0gLUVOT01FTTsKKwlyZWFkYnVmID0gdm1hbGxvYyhidWZzaXplKTsKKwl3cml0ZWJ1ZiA9IHZtYWxsb2MoYnVmc2l6ZSk7CisJb2Zmc2V0cyA9IGttYWxsb2MoZWJjbnQgKiBzaXplb2YoaW50KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFyZWFkYnVmIHx8ICF3cml0ZWJ1ZiB8fCAhb2Zmc2V0cykgeworCQlwcmludGsoUFJJTlRfUFJFRiAiZXJyb3I6IGNhbm5vdCBhbGxvY2F0ZSBtZW1vcnlcbiIpOworCQlnb3RvIG91dDsKKwl9CisJZm9yIChpID0gMDsgaSA8IGViY250OyBpKyspCisJCW9mZnNldHNbaV0gPSBtdGQtPmVyYXNlc2l6ZTsKKwlzaW1wbGVfc3JhbmQoY3VycmVudC0+cGlkKTsKKwlmb3IgKGkgPSAwOyBpIDwgYnVmc2l6ZTsgaSsrKQorCQl3cml0ZWJ1ZltpXSA9IHNpbXBsZV9yYW5kKCk7CisKKwllcnIgPSBzY2FuX2Zvcl9iYWRfZXJhc2VibG9ja3MoKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKworCS8qIERvIG9wZXJhdGlvbnMgKi8KKwlwcmludGsoUFJJTlRfUFJFRiAiZG9pbmcgb3BlcmF0aW9uc1xuIik7CisJZm9yIChvcCA9IDA7IG9wIDwgY291bnQ7IG9wKyspIHsKKwkJaWYgKChvcCAmIDEwMjMpID09IDApCisJCQlwcmludGsoUFJJTlRfUFJFRiAiJWQgb3BlcmF0aW9ucyBkb25lXG4iLCBvcCk7CisJCWVyciA9IGRvX29wZXJhdGlvbigpOworCQlpZiAoZXJyKQorCQkJZ290byBvdXQ7CisJCWNvbmRfcmVzY2hlZCgpOworCX0KKwlwcmludGsoUFJJTlRfUFJFRiAiZmluaXNoZWQsICVkIG9wZXJhdGlvbnMgZG9uZVxuIiwgb3ApOworCitvdXQ6CisJa2ZyZWUob2Zmc2V0cyk7CisJa2ZyZWUoYmJ0KTsKKwl2ZnJlZSh3cml0ZWJ1Zik7CisJdmZyZWUocmVhZGJ1Zik7CisJcHV0X210ZF9kZXZpY2UobXRkKTsKKwlpZiAoZXJyKQorCQlwcmludGsoUFJJTlRfUFJFRiAiZXJyb3IgJWQgb2NjdXJyZWRcbiIsIGVycik7CisJcHJpbnRrKEtFUk5fSU5GTyAiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIik7CisJcmV0dXJuIGVycjsKK30KK21vZHVsZV9pbml0KG10ZF9zdHJlc3N0ZXN0X2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgbXRkX3N0cmVzc3Rlc3RfZXhpdCh2b2lkKQoreworCXJldHVybjsKK30KK21vZHVsZV9leGl0KG10ZF9zdHJlc3N0ZXN0X2V4aXQpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIlN0cmVzcyB0ZXN0IG1vZHVsZSIpOworTU9EVUxFX0FVVEhPUigiQWRyaWFuIEh1bnRlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvdGVzdHMvbXRkX3N1YnBhZ2V0ZXN0LmMgYi9kcml2ZXJzL210ZC90ZXN0cy9tdGRfc3VicGFnZXRlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Yjg4OTcyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tdGQvdGVzdHMvbXRkX3N1YnBhZ2V0ZXN0LmMKQEAgLTAsMCArMSw1MjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYtMjAwNyBOb2tpYSBDb3Jwb3JhdGlvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKgorICogVGVzdCBzdWItcGFnZSByZWFkIGFuZCB3cml0ZSBvbiBNVEQgZGV2aWNlLgorICogQXV0aG9yOiBBZHJpYW4gSHVudGVyIDxleHQtYWRyaWFuLmh1bnRlckBub2tpYS5jb20+CisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9tdGQvbXRkLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKworI2RlZmluZSBQUklOVF9QUkVGIEtFUk5fSU5GTyAibXRkX3N1YnBhZ2V0ZXN0OiAiCisKK3N0YXRpYyBpbnQgZGV2OworbW9kdWxlX3BhcmFtKGRldiwgaW50LCBTX0lSVUdPKTsKK01PRFVMRV9QQVJNX0RFU0MoZGV2LCAiTVREIGRldmljZSBudW1iZXIgdG8gdXNlIik7CisKK3N0YXRpYyBzdHJ1Y3QgbXRkX2luZm8gKm10ZDsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyICp3cml0ZWJ1ZjsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyICpyZWFkYnVmOworc3RhdGljIHVuc2lnbmVkIGNoYXIgKmJidDsKKworc3RhdGljIGludCBzdWJwZ3NpemU7CitzdGF0aWMgaW50IGJ1ZnNpemU7CitzdGF0aWMgaW50IGViY250Oworc3RhdGljIGludCBwZ2NudDsKK3N0YXRpYyBpbnQgZXJyY250Oworc3RhdGljIHVuc2lnbmVkIGxvbmcgbmV4dCA9IDE7CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHNpbXBsZV9yYW5kKHZvaWQpCit7CisJbmV4dCA9IG5leHQgKiAxMTAzNTE1MjQ1ICsgMTIzNDU7CisJcmV0dXJuICh1bnNpZ25lZCBpbnQpKChuZXh0IC8gNjU1MzYpICUgMzI3NjgpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2ltcGxlX3NyYW5kKHVuc2lnbmVkIGxvbmcgc2VlZCkKK3sKKwluZXh0ID0gc2VlZDsKK30KKworc3RhdGljIHZvaWQgc2V0X3JhbmRvbV9kYXRhKHVuc2lnbmVkIGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbikKK3sKKwlzaXplX3QgaTsKKworCWZvciAoaSA9IDA7IGkgPCBsZW47ICsraSkKKwkJYnVmW2ldID0gc2ltcGxlX3JhbmQoKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGNsZWFyX2RhdGEodW5zaWduZWQgY2hhciAqYnVmLCBzaXplX3QgbGVuKQoreworCW1lbXNldChidWYsIDAsIGxlbik7Cit9CisKK3N0YXRpYyBpbnQgZXJhc2VfZXJhc2VibG9jayhpbnQgZWJudW0pCit7CisJaW50IGVycjsKKwlzdHJ1Y3QgZXJhc2VfaW5mbyBlaTsKKwlsb2ZmX3QgYWRkciA9IGVibnVtICogbXRkLT5lcmFzZXNpemU7CisKKwltZW1zZXQoJmVpLCAwLCBzaXplb2Yoc3RydWN0IGVyYXNlX2luZm8pKTsKKwllaS5tdGQgID0gbXRkOworCWVpLmFkZHIgPSBhZGRyOworCWVpLmxlbiAgPSBtdGQtPmVyYXNlc2l6ZTsKKworCWVyciA9IG10ZC0+ZXJhc2UobXRkLCAmZWkpOworCWlmIChlcnIpIHsKKwkJcHJpbnRrKFBSSU5UX1BSRUYgImVycm9yICVkIHdoaWxlIGVyYXNpbmcgRUIgJWRcbiIsIGVyciwgZWJudW0pOworCQlyZXR1cm4gZXJyOworCX0KKworCWlmIChlaS5zdGF0ZSA9PSBNVERfRVJBU0VfRkFJTEVEKSB7CisJCXByaW50ayhQUklOVF9QUkVGICJzb21lIGVyYXNlIGVycm9yIG9jY3VycmVkIGF0IEVCICVkXG4iLAorCQkgICAgICAgZWJudW0pOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBlcmFzZV93aG9sZV9kZXZpY2Uodm9pZCkKK3sKKwlpbnQgZXJyOworCXVuc2lnbmVkIGludCBpOworCisJcHJpbnRrKFBSSU5UX1BSRUYgImVyYXNpbmcgd2hvbGUgZGV2aWNlXG4iKTsKKwlmb3IgKGkgPSAwOyBpIDwgZWJjbnQ7ICsraSkgeworCQlpZiAoYmJ0W2ldKQorCQkJY29udGludWU7CisJCWVyciA9IGVyYXNlX2VyYXNlYmxvY2soaSk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOworCQljb25kX3Jlc2NoZWQoKTsKKwl9CisJcHJpbnRrKFBSSU5UX1BSRUYgImVyYXNlZCAldSBlcmFzZWJsb2Nrc1xuIiwgaSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd3JpdGVfZXJhc2VibG9jayhpbnQgZWJudW0pCit7CisJc2l6ZV90IHdyaXR0ZW4gPSAwOworCWludCBlcnIgPSAwOworCWxvZmZfdCBhZGRyID0gZWJudW0gKiBtdGQtPmVyYXNlc2l6ZTsKKworCXNldF9yYW5kb21fZGF0YSh3cml0ZWJ1Ziwgc3VicGdzaXplKTsKKwllcnIgPSBtdGQtPndyaXRlKG10ZCwgYWRkciwgc3VicGdzaXplLCAmd3JpdHRlbiwgd3JpdGVidWYpOworCWlmICh1bmxpa2VseShlcnIgfHwgd3JpdHRlbiAhPSBzdWJwZ3NpemUpKSB7CisJCXByaW50ayhQUklOVF9QUkVGICJlcnJvcjogd3JpdGUgZmFpbGVkIGF0ICUjbGx4XG4iLAorCQkgICAgICAgKGxvbmcgbG9uZylhZGRyKTsKKwkJaWYgKHdyaXR0ZW4gIT0gc3VicGdzaXplKSB7CisJCQlwcmludGsoUFJJTlRfUFJFRiAiICB3cml0ZSBzaXplOiAlI3hcbiIsIHN1YnBnc2l6ZSk7CisJCQlwcmludGsoUFJJTlRfUFJFRiAiICB3cml0dGVuOiAlI3p4XG4iLCB3cml0dGVuKTsKKwkJfQorCQlyZXR1cm4gZXJyID8gZXJyIDogLTE7CisJfQorCisJYWRkciArPSBzdWJwZ3NpemU7CisKKwlzZXRfcmFuZG9tX2RhdGEod3JpdGVidWYsIHN1YnBnc2l6ZSk7CisJZXJyID0gbXRkLT53cml0ZShtdGQsIGFkZHIsIHN1YnBnc2l6ZSwgJndyaXR0ZW4sIHdyaXRlYnVmKTsKKwlpZiAodW5saWtlbHkoZXJyIHx8IHdyaXR0ZW4gIT0gc3VicGdzaXplKSkgeworCQlwcmludGsoUFJJTlRfUFJFRiAiZXJyb3I6IHdyaXRlIGZhaWxlZCBhdCAlI2xseFxuIiwKKwkJICAgICAgIChsb25nIGxvbmcpYWRkcik7CisJCWlmICh3cml0dGVuICE9IHN1YnBnc2l6ZSkgeworCQkJcHJpbnRrKFBSSU5UX1BSRUYgIiAgd3JpdGUgc2l6ZTogJSN4XG4iLCBzdWJwZ3NpemUpOworCQkJcHJpbnRrKFBSSU5UX1BSRUYgIiAgd3JpdHRlbjogJSN6eFxuIiwgd3JpdHRlbik7CisJCX0KKwkJcmV0dXJuIGVyciA/IGVyciA6IC0xOworCX0KKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgd3JpdGVfZXJhc2VibG9jazIoaW50IGVibnVtKQoreworCXNpemVfdCB3cml0dGVuID0gMDsKKwlpbnQgZXJyID0gMCwgazsKKwlsb2ZmX3QgYWRkciA9IGVibnVtICogbXRkLT5lcmFzZXNpemU7CisKKwlmb3IgKGsgPSAxOyBrIDwgMzM7ICsraykgeworCQlpZiAoYWRkciArIChzdWJwZ3NpemUgKiBrKSA+IChlYm51bSArIDEpICogbXRkLT5lcmFzZXNpemUpCisJCQlicmVhazsKKwkJc2V0X3JhbmRvbV9kYXRhKHdyaXRlYnVmLCBzdWJwZ3NpemUgKiBrKTsKKwkJZXJyID0gbXRkLT53cml0ZShtdGQsIGFkZHIsIHN1YnBnc2l6ZSAqIGssICZ3cml0dGVuLCB3cml0ZWJ1Zik7CisJCWlmICh1bmxpa2VseShlcnIgfHwgd3JpdHRlbiAhPSBzdWJwZ3NpemUgKiBrKSkgeworCQkJcHJpbnRrKFBSSU5UX1BSRUYgImVycm9yOiB3cml0ZSBmYWlsZWQgYXQgJSNsbHhcbiIsCisJCQkgICAgICAgKGxvbmcgbG9uZylhZGRyKTsKKwkJCWlmICh3cml0dGVuICE9IHN1YnBnc2l6ZSkgeworCQkJCXByaW50ayhQUklOVF9QUkVGICIgIHdyaXRlIHNpemU6ICUjeFxuIiwKKwkJCQkgICAgICAgc3VicGdzaXplICogayk7CisJCQkJcHJpbnRrKFBSSU5UX1BSRUYgIiAgd3JpdHRlbjogJSMwOHp4XG4iLAorCQkJCSAgICAgICB3cml0dGVuKTsKKwkJCX0KKwkJCXJldHVybiBlcnIgPyBlcnIgOiAtMTsKKwkJfQorCQlhZGRyICs9IHN1YnBnc2l6ZSAqIGs7CisJfQorCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfc3VicGFnZSh1bnNpZ25lZCBjaGFyICpwKQoreworCWludCBpLCBqOworCisJZm9yIChpID0gMDsgaSA8IHN1YnBnc2l6ZTsgKSB7CisJCWZvciAoaiA9IDA7IGkgPCBzdWJwZ3NpemUgJiYgaiA8IDMyOyArK2ksICsraikKKwkJCXByaW50aygiJTAyeCIsICpwKyspOworCQlwcmludGsoIlxuIik7CisJfQorfQorCitzdGF0aWMgaW50IHZlcmlmeV9lcmFzZWJsb2NrKGludCBlYm51bSkKK3sKKwlzaXplX3QgcmVhZCA9IDA7CisJaW50IGVyciA9IDA7CisJbG9mZl90IGFkZHIgPSBlYm51bSAqIG10ZC0+ZXJhc2VzaXplOworCisJc2V0X3JhbmRvbV9kYXRhKHdyaXRlYnVmLCBzdWJwZ3NpemUpOworCWNsZWFyX2RhdGEocmVhZGJ1Ziwgc3VicGdzaXplKTsKKwlyZWFkID0gMDsKKwllcnIgPSBtdGQtPnJlYWQobXRkLCBhZGRyLCBzdWJwZ3NpemUsICZyZWFkLCByZWFkYnVmKTsKKwlpZiAodW5saWtlbHkoZXJyIHx8IHJlYWQgIT0gc3VicGdzaXplKSkgeworCQlpZiAoZXJyID09IC1FVUNMRUFOICYmIHJlYWQgPT0gc3VicGdzaXplKSB7CisJCQlwcmludGsoUFJJTlRfUFJFRiAiRUNDIGNvcnJlY3Rpb24gYXQgJSNsbHhcbiIsCisJCQkgICAgICAgKGxvbmcgbG9uZylhZGRyKTsKKwkJCWVyciA9IDA7CisJCX0gZWxzZSB7CisJCQlwcmludGsoUFJJTlRfUFJFRiAiZXJyb3I6IHJlYWQgZmFpbGVkIGF0ICUjbGx4XG4iLAorCQkJICAgICAgIChsb25nIGxvbmcpYWRkcik7CisJCQlyZXR1cm4gZXJyID8gZXJyIDogLTE7CisJCX0KKwl9CisJaWYgKHVubGlrZWx5KG1lbWNtcChyZWFkYnVmLCB3cml0ZWJ1Ziwgc3VicGdzaXplKSkpIHsKKwkJcHJpbnRrKFBSSU5UX1BSRUYgImVycm9yOiB2ZXJpZnkgZmFpbGVkIGF0ICUjbGx4XG4iLAorCQkgICAgICAgKGxvbmcgbG9uZylhZGRyKTsKKwkJcHJpbnRrKFBSSU5UX1BSRUYgIi0tLS0tLS0tLS0tLS0gd3JpdHRlbi0tLS0tLS0tLS0tLS0tLS1cbiIpOworCQlwcmludF9zdWJwYWdlKHdyaXRlYnVmKTsKKwkJcHJpbnRrKFBSSU5UX1BSRUYgIi0tLS0tLS0tLS0tLS0gcmVhZCAtLS0tLS0tLS0tLS0tLS0tLS1cbiIpOworCQlwcmludF9zdWJwYWdlKHJlYWRidWYpOworCQlwcmludGsoUFJJTlRfUFJFRiAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CisJCWVycmNudCArPSAxOworCX0KKworCWFkZHIgKz0gc3VicGdzaXplOworCisJc2V0X3JhbmRvbV9kYXRhKHdyaXRlYnVmLCBzdWJwZ3NpemUpOworCWNsZWFyX2RhdGEocmVhZGJ1Ziwgc3VicGdzaXplKTsKKwlyZWFkID0gMDsKKwllcnIgPSBtdGQtPnJlYWQobXRkLCBhZGRyLCBzdWJwZ3NpemUsICZyZWFkLCByZWFkYnVmKTsKKwlpZiAodW5saWtlbHkoZXJyIHx8IHJlYWQgIT0gc3VicGdzaXplKSkgeworCQlpZiAoZXJyID09IC1FVUNMRUFOICYmIHJlYWQgPT0gc3VicGdzaXplKSB7CisJCQlwcmludGsoUFJJTlRfUFJFRiAiRUNDIGNvcnJlY3Rpb24gYXQgJSNsbHhcbiIsCisJCQkgICAgICAgKGxvbmcgbG9uZylhZGRyKTsKKwkJCWVyciA9IDA7CisJCX0gZWxzZSB7CisJCQlwcmludGsoUFJJTlRfUFJFRiAiZXJyb3I6IHJlYWQgZmFpbGVkIGF0ICUjbGx4XG4iLAorCQkJICAgICAgIChsb25nIGxvbmcpYWRkcik7CisJCQlyZXR1cm4gZXJyID8gZXJyIDogLTE7CisJCX0KKwl9CisJaWYgKHVubGlrZWx5KG1lbWNtcChyZWFkYnVmLCB3cml0ZWJ1Ziwgc3VicGdzaXplKSkpIHsKKwkJcHJpbnRrKFBSSU5UX1BSRUYgImVycm9yOiB2ZXJpZnkgZmFpbGVkIGF0ICUjbGx4XG4iLAorCQkgICAgICAgKGxvbmcgbG9uZylhZGRyKTsKKwkJcHJpbnRrKFBSSU5UX1BSRUYgIi0tLS0tLS0tLS0tLS0gd3JpdHRlbi0tLS0tLS0tLS0tLS0tLS1cbiIpOworCQlwcmludF9zdWJwYWdlKHdyaXRlYnVmKTsKKwkJcHJpbnRrKFBSSU5UX1BSRUYgIi0tLS0tLS0tLS0tLS0gcmVhZCAtLS0tLS0tLS0tLS0tLS0tLS1cbiIpOworCQlwcmludF9zdWJwYWdlKHJlYWRidWYpOworCQlwcmludGsoUFJJTlRfUFJFRiAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CisJCWVycmNudCArPSAxOworCX0KKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgdmVyaWZ5X2VyYXNlYmxvY2syKGludCBlYm51bSkKK3sKKwlzaXplX3QgcmVhZCA9IDA7CisJaW50IGVyciA9IDAsIGs7CisJbG9mZl90IGFkZHIgPSBlYm51bSAqIG10ZC0+ZXJhc2VzaXplOworCisJZm9yIChrID0gMTsgayA8IDMzOyArK2spIHsKKwkJaWYgKGFkZHIgKyAoc3VicGdzaXplICogaykgPiAoZWJudW0gKyAxKSAqIG10ZC0+ZXJhc2VzaXplKQorCQkJYnJlYWs7CisJCXNldF9yYW5kb21fZGF0YSh3cml0ZWJ1Ziwgc3VicGdzaXplICogayk7CisJCWNsZWFyX2RhdGEocmVhZGJ1Ziwgc3VicGdzaXplICogayk7CisJCXJlYWQgPSAwOworCQllcnIgPSBtdGQtPnJlYWQobXRkLCBhZGRyLCBzdWJwZ3NpemUgKiBrLCAmcmVhZCwgcmVhZGJ1Zik7CisJCWlmICh1bmxpa2VseShlcnIgfHwgcmVhZCAhPSBzdWJwZ3NpemUgKiBrKSkgeworCQkJaWYgKGVyciA9PSAtRVVDTEVBTiAmJiByZWFkID09IHN1YnBnc2l6ZSAqIGspIHsKKwkJCQlwcmludGsoUFJJTlRfUFJFRiAiRUNDIGNvcnJlY3Rpb24gYXQgJSNsbHhcbiIsCisJCQkJICAgICAgIChsb25nIGxvbmcpYWRkcik7CisJCQkJZXJyID0gMDsKKwkJCX0gZWxzZSB7CisJCQkJcHJpbnRrKFBSSU5UX1BSRUYgImVycm9yOiByZWFkIGZhaWxlZCBhdCAiCisJCQkJICAgICAgICIlI2xseFxuIiwgKGxvbmcgbG9uZylhZGRyKTsKKwkJCQlyZXR1cm4gZXJyID8gZXJyIDogLTE7CisJCQl9CisJCX0KKwkJaWYgKHVubGlrZWx5KG1lbWNtcChyZWFkYnVmLCB3cml0ZWJ1Ziwgc3VicGdzaXplICogaykpKSB7CisJCQlwcmludGsoUFJJTlRfUFJFRiAiZXJyb3I6IHZlcmlmeSBmYWlsZWQgYXQgJSNsbHhcbiIsCisJCQkgICAgICAgKGxvbmcgbG9uZylhZGRyKTsKKwkJCWVycmNudCArPSAxOworCQl9CisJCWFkZHIgKz0gc3VicGdzaXplICogazsKKwl9CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHZlcmlmeV9lcmFzZWJsb2NrX2ZmKGludCBlYm51bSkKK3sKKwl1aW50MzJfdCBqOworCXNpemVfdCByZWFkID0gMDsKKwlpbnQgZXJyID0gMDsKKwlsb2ZmX3QgYWRkciA9IGVibnVtICogbXRkLT5lcmFzZXNpemU7CisKKwltZW1zZXQod3JpdGVidWYsIDB4ZmYsIHN1YnBnc2l6ZSk7CisJZm9yIChqID0gMDsgaiA8IG10ZC0+ZXJhc2VzaXplIC8gc3VicGdzaXplOyArK2opIHsKKwkJY2xlYXJfZGF0YShyZWFkYnVmLCBzdWJwZ3NpemUpOworCQlyZWFkID0gMDsKKwkJZXJyID0gbXRkLT5yZWFkKG10ZCwgYWRkciwgc3VicGdzaXplLCAmcmVhZCwgcmVhZGJ1Zik7CisJCWlmICh1bmxpa2VseShlcnIgfHwgcmVhZCAhPSBzdWJwZ3NpemUpKSB7CisJCQlpZiAoZXJyID09IC1FVUNMRUFOICYmIHJlYWQgPT0gc3VicGdzaXplKSB7CisJCQkJcHJpbnRrKFBSSU5UX1BSRUYgIkVDQyBjb3JyZWN0aW9uIGF0ICUjbGx4XG4iLAorCQkJCSAgICAgICAobG9uZyBsb25nKWFkZHIpOworCQkJCWVyciA9IDA7CisJCQl9IGVsc2UgeworCQkJCXByaW50ayhQUklOVF9QUkVGICJlcnJvcjogcmVhZCBmYWlsZWQgYXQgIgorCQkJCSAgICAgICAiJSNsbHhcbiIsIChsb25nIGxvbmcpYWRkcik7CisJCQkJcmV0dXJuIGVyciA/IGVyciA6IC0xOworCQkJfQorCQl9CisJCWlmICh1bmxpa2VseShtZW1jbXAocmVhZGJ1Ziwgd3JpdGVidWYsIHN1YnBnc2l6ZSkpKSB7CisJCQlwcmludGsoUFJJTlRfUFJFRiAiZXJyb3I6IHZlcmlmeSAweGZmIGZhaWxlZCBhdCAiCisJCQkgICAgICAgIiUjbGx4XG4iLCAobG9uZyBsb25nKWFkZHIpOworCQkJZXJyY250ICs9IDE7CisJCX0KKwkJYWRkciArPSBzdWJwZ3NpemU7CisJfQorCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCB2ZXJpZnlfYWxsX2VyYXNlYmxvY2tzX2ZmKHZvaWQpCit7CisJaW50IGVycjsKKwl1bnNpZ25lZCBpbnQgaTsKKworCXByaW50ayhQUklOVF9QUkVGICJ2ZXJpZnlpbmcgYWxsIGVyYXNlYmxvY2tzIGZvciAweGZmXG4iKTsKKwlmb3IgKGkgPSAwOyBpIDwgZWJjbnQ7ICsraSkgeworCQlpZiAoYmJ0W2ldKQorCQkJY29udGludWU7CisJCWVyciA9IHZlcmlmeV9lcmFzZWJsb2NrX2ZmKGkpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKwkJaWYgKGkgJSAyNTYgPT0gMCkKKwkJCXByaW50ayhQUklOVF9QUkVGICJ2ZXJpZmllZCB1cCB0byBlcmFzZWJsb2NrICV1XG4iLCBpKTsKKwkJY29uZF9yZXNjaGVkKCk7CisJfQorCXByaW50ayhQUklOVF9QUkVGICJ2ZXJpZmllZCAldSBlcmFzZWJsb2Nrc1xuIiwgaSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaXNfYmxvY2tfYmFkKGludCBlYm51bSkKK3sKKwlsb2ZmX3QgYWRkciA9IGVibnVtICogbXRkLT5lcmFzZXNpemU7CisJaW50IHJldDsKKworCXJldCA9IG10ZC0+YmxvY2tfaXNiYWQobXRkLCBhZGRyKTsKKwlpZiAocmV0KQorCQlwcmludGsoUFJJTlRfUFJFRiAiYmxvY2sgJWQgaXMgYmFkXG4iLCBlYm51bSk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBzY2FuX2Zvcl9iYWRfZXJhc2VibG9ja3Modm9pZCkKK3sKKwlpbnQgaSwgYmFkID0gMDsKKworCWJidCA9IGttYWxsb2MoZWJjbnQsIEdGUF9LRVJORUwpOworCWlmICghYmJ0KSB7CisJCXByaW50ayhQUklOVF9QUkVGICJlcnJvcjogY2Fubm90IGFsbG9jYXRlIG1lbW9yeVxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwltZW1zZXQoYmJ0LCAwICwgZWJjbnQpOworCisJcHJpbnRrKFBSSU5UX1BSRUYgInNjYW5uaW5nIGZvciBiYWQgZXJhc2VibG9ja3NcbiIpOworCWZvciAoaSA9IDA7IGkgPCBlYmNudDsgKytpKSB7CisJCWJidFtpXSA9IGlzX2Jsb2NrX2JhZChpKSA/IDEgOiAwOworCQlpZiAoYmJ0W2ldKQorCQkJYmFkICs9IDE7CisJCWNvbmRfcmVzY2hlZCgpOworCX0KKwlwcmludGsoUFJJTlRfUFJFRiAic2Nhbm5lZCAlZCBlcmFzZWJsb2NrcywgJWQgYXJlIGJhZFxuIiwgaSwgYmFkKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2luaXQgbXRkX3N1YnBhZ2V0ZXN0X2luaXQodm9pZCkKK3sKKwlpbnQgZXJyID0gMDsKKwl1aW50MzJfdCBpOworCXVpbnQ2NF90IHRtcDsKKworCXByaW50ayhLRVJOX0lORk8gIlxuIik7CisJcHJpbnRrKEtFUk5fSU5GTyAiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIik7CisJcHJpbnRrKFBSSU5UX1BSRUYgIk1URCBkZXZpY2U6ICVkXG4iLCBkZXYpOworCisJbXRkID0gZ2V0X210ZF9kZXZpY2UoTlVMTCwgZGV2KTsKKwlpZiAoSVNfRVJSKG10ZCkpIHsKKwkJZXJyID0gUFRSX0VSUihtdGQpOworCQlwcmludGsoUFJJTlRfUFJFRiAiZXJyb3I6IGNhbm5vdCBnZXQgTVREIGRldmljZVxuIik7CisJCXJldHVybiBlcnI7CisJfQorCisJaWYgKG10ZC0+dHlwZSAhPSBNVERfTkFOREZMQVNIKSB7CisJCXByaW50ayhQUklOVF9QUkVGICJ0aGlzIHRlc3QgcmVxdWlyZXMgTkFORCBmbGFzaFxuIik7CisJCWdvdG8gb3V0OworCX0KKworCXN1YnBnc2l6ZSA9IG10ZC0+d3JpdGVzaXplID4+IG10ZC0+c3VicGFnZV9zZnQ7CisJcHJpbnRrKFBSSU5UX1BSRUYgIk1URCBkZXZpY2Ugc2l6ZSAlbGx1LCBlcmFzZWJsb2NrIHNpemUgJXUsICIKKwkgICAgICAgInBhZ2Ugc2l6ZSAldSwgc3VicGFnZSBzaXplICV1LCBjb3VudCBvZiBlcmFzZWJsb2NrcyAldSwgIgorCSAgICAgICAicGFnZXMgcGVyIGVyYXNlYmxvY2sgJXUsIE9PQiBzaXplICV1XG4iLAorCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKW10ZC0+c2l6ZSwgbXRkLT5lcmFzZXNpemUsCisJICAgICAgIG10ZC0+d3JpdGVzaXplLCBzdWJwZ3NpemUsIGViY250LCBwZ2NudCwgbXRkLT5vb2JzaXplKTsKKworCWVyciA9IC1FTk9NRU07CisJYnVmc2l6ZSA9IHN1YnBnc2l6ZSAqIDMyOworCXdyaXRlYnVmID0ga21hbGxvYyhidWZzaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXdyaXRlYnVmKSB7CisJCXByaW50ayhQUklOVF9QUkVGICJlcnJvcjogY2Fubm90IGFsbG9jYXRlIG1lbW9yeVxuIik7CisJCWdvdG8gb3V0OworCX0KKwlyZWFkYnVmID0ga21hbGxvYyhidWZzaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXJlYWRidWYpIHsKKwkJcHJpbnRrKFBSSU5UX1BSRUYgImVycm9yOiBjYW5ub3QgYWxsb2NhdGUgbWVtb3J5XG4iKTsKKwkJZ290byBvdXQ7CisJfQorCisJdG1wID0gbXRkLT5zaXplOworCWRvX2Rpdih0bXAsIG10ZC0+ZXJhc2VzaXplKTsKKwllYmNudCA9IHRtcDsKKwlwZ2NudCA9IG10ZC0+ZXJhc2VzaXplIC8gbXRkLT53cml0ZXNpemU7CisKKwllcnIgPSBzY2FuX2Zvcl9iYWRfZXJhc2VibG9ja3MoKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKworCWVyciA9IGVyYXNlX3dob2xlX2RldmljZSgpOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCisJcHJpbnRrKFBSSU5UX1BSRUYgIndyaXRpbmcgd2hvbGUgZGV2aWNlXG4iKTsKKwlzaW1wbGVfc3JhbmQoMSk7CisJZm9yIChpID0gMDsgaSA8IGViY250OyArK2kpIHsKKwkJaWYgKGJidFtpXSkKKwkJCWNvbnRpbnVlOworCQllcnIgPSB3cml0ZV9lcmFzZWJsb2NrKGkpOworCQlpZiAodW5saWtlbHkoZXJyKSkKKwkJCWdvdG8gb3V0OworCQlpZiAoaSAlIDI1NiA9PSAwKQorCQkJcHJpbnRrKFBSSU5UX1BSRUYgIndyaXR0ZW4gdXAgdG8gZXJhc2VibG9jayAldVxuIiwgaSk7CisJCWNvbmRfcmVzY2hlZCgpOworCX0KKwlwcmludGsoUFJJTlRfUFJFRiAid3JpdHRlbiAldSBlcmFzZWJsb2Nrc1xuIiwgaSk7CisKKwlzaW1wbGVfc3JhbmQoMSk7CisJcHJpbnRrKFBSSU5UX1BSRUYgInZlcmlmeWluZyBhbGwgZXJhc2VibG9ja3NcbiIpOworCWZvciAoaSA9IDA7IGkgPCBlYmNudDsgKytpKSB7CisJCWlmIChiYnRbaV0pCisJCQljb250aW51ZTsKKwkJZXJyID0gdmVyaWZ5X2VyYXNlYmxvY2soaSk7CisJCWlmICh1bmxpa2VseShlcnIpKQorCQkJZ290byBvdXQ7CisJCWlmIChpICUgMjU2ID09IDApCisJCQlwcmludGsoUFJJTlRfUFJFRiAidmVyaWZpZWQgdXAgdG8gZXJhc2VibG9jayAldVxuIiwgaSk7CisJCWNvbmRfcmVzY2hlZCgpOworCX0KKwlwcmludGsoUFJJTlRfUFJFRiAidmVyaWZpZWQgJXUgZXJhc2VibG9ja3NcbiIsIGkpOworCisJZXJyID0gZXJhc2Vfd2hvbGVfZGV2aWNlKCk7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisKKwllcnIgPSB2ZXJpZnlfYWxsX2VyYXNlYmxvY2tzX2ZmKCk7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisKKwkvKiBXcml0ZSBhbGwgZXJhc2VibG9ja3MgKi8KKwlzaW1wbGVfc3JhbmQoMyk7CisJcHJpbnRrKFBSSU5UX1BSRUYgIndyaXRpbmcgd2hvbGUgZGV2aWNlXG4iKTsKKwlmb3IgKGkgPSAwOyBpIDwgZWJjbnQ7ICsraSkgeworCQlpZiAoYmJ0W2ldKQorCQkJY29udGludWU7CisJCWVyciA9IHdyaXRlX2VyYXNlYmxvY2syKGkpOworCQlpZiAodW5saWtlbHkoZXJyKSkKKwkJCWdvdG8gb3V0OworCQlpZiAoaSAlIDI1NiA9PSAwKQorCQkJcHJpbnRrKFBSSU5UX1BSRUYgIndyaXR0ZW4gdXAgdG8gZXJhc2VibG9jayAldVxuIiwgaSk7CisJCWNvbmRfcmVzY2hlZCgpOworCX0KKwlwcmludGsoUFJJTlRfUFJFRiAid3JpdHRlbiAldSBlcmFzZWJsb2Nrc1xuIiwgaSk7CisKKwkvKiBDaGVjayBhbGwgZXJhc2VibG9ja3MgKi8KKwlzaW1wbGVfc3JhbmQoMyk7CisJcHJpbnRrKFBSSU5UX1BSRUYgInZlcmlmeWluZyBhbGwgZXJhc2VibG9ja3NcbiIpOworCWZvciAoaSA9IDA7IGkgPCBlYmNudDsgKytpKSB7CisJCWlmIChiYnRbaV0pCisJCQljb250aW51ZTsKKwkJZXJyID0gdmVyaWZ5X2VyYXNlYmxvY2syKGkpOworCQlpZiAodW5saWtlbHkoZXJyKSkKKwkJCWdvdG8gb3V0OworCQlpZiAoaSAlIDI1NiA9PSAwKQorCQkJcHJpbnRrKFBSSU5UX1BSRUYgInZlcmlmaWVkIHVwIHRvIGVyYXNlYmxvY2sgJXVcbiIsIGkpOworCQljb25kX3Jlc2NoZWQoKTsKKwl9CisJcHJpbnRrKFBSSU5UX1BSRUYgInZlcmlmaWVkICV1IGVyYXNlYmxvY2tzXG4iLCBpKTsKKworCWVyciA9IGVyYXNlX3dob2xlX2RldmljZSgpOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCisJZXJyID0gdmVyaWZ5X2FsbF9lcmFzZWJsb2Nrc19mZigpOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCisJcHJpbnRrKFBSSU5UX1BSRUYgImZpbmlzaGVkIHdpdGggJWQgZXJyb3JzXG4iLCBlcnJjbnQpOworCitvdXQ6CisJa2ZyZWUoYmJ0KTsKKwlrZnJlZShyZWFkYnVmKTsKKwlrZnJlZSh3cml0ZWJ1Zik7CisJcHV0X210ZF9kZXZpY2UobXRkKTsKKwlpZiAoZXJyKQorCQlwcmludGsoUFJJTlRfUFJFRiAiZXJyb3IgJWQgb2NjdXJyZWRcbiIsIGVycik7CisJcHJpbnRrKEtFUk5fSU5GTyAiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIik7CisJcmV0dXJuIGVycjsKK30KK21vZHVsZV9pbml0KG10ZF9zdWJwYWdldGVzdF9pbml0KTsKKworc3RhdGljIHZvaWQgX19leGl0IG10ZF9zdWJwYWdldGVzdF9leGl0KHZvaWQpCit7CisJcmV0dXJuOworfQorbW9kdWxlX2V4aXQobXRkX3N1YnBhZ2V0ZXN0X2V4aXQpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIlN1YnBhZ2UgdGVzdCBtb2R1bGUiKTsKK01PRFVMRV9BVVRIT1IoIkFkcmlhbiBIdW50ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL3Rlc3RzL210ZF90b3J0dXJldGVzdC5jIGIvZHJpdmVycy9tdGQvdGVzdHMvbXRkX3RvcnR1cmV0ZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjMxYTBhYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbXRkL3Rlc3RzL210ZF90b3J0dXJldGVzdC5jCkBAIC0wLDAgKzEsNTMwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA2LTIwMDggQXJ0ZW0gQml0eXV0c2tpeQorICogQ29weXJpZ2h0IChDKSAyMDA2LTIwMDggSmFya2tvIExhdmluZW4KKyAqIENvcHlyaWdodCAoQykgMjAwNi0yMDA4IEFkcmlhbiBIdW50ZXIKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIEF1dGhvcnM6IEFydGVtIEJpdHl1dHNraXksIEphcmtrbyBMYXZpbmVuLCBBZHJpYSBIdW50ZXIKKyAqCisgKiBXQVJOSU5HOiB0aGlzIHRlc3QgcHJvZ3JhbSBtYXkga2lsbCB5b3VyIGZsYXNoIGFuZCB5b3VyIGRldmljZS4gRG8gbm90CisgKiB1c2UgaXQgdW5sZXNzIHlvdSBrbm93IHdoYXQgeW91IGRvLiBBdXRob3JzIGFyZSBub3QgcmVzcG9uc2libGUgZm9yIGFueQorICogZGFtYWdlIGNhdXNlZCBieSB0aGlzIHByb2dyYW0uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L210ZC9tdGQuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorCisjZGVmaW5lIFBSSU5UX1BSRUYgS0VSTl9JTkZPICJtdGRfdG9ydHVyZXRlc3Q6ICIKKyNkZWZpbmUgUkVUUklFUyAzCisKK3N0YXRpYyBpbnQgZWIgPSA4OworbW9kdWxlX3BhcmFtKGViLCBpbnQsIFNfSVJVR08pOworTU9EVUxFX1BBUk1fREVTQyhlYiwgImVyYXNlYmxvY2sgbnVtYmVyIHdpdGhpbiB0aGUgc2VsZWN0ZWQgTVREIGRldmljZSIpOworCitzdGF0aWMgaW50IGViY250ID0gMzI7Cittb2R1bGVfcGFyYW0oZWJjbnQsIGludCwgU19JUlVHTyk7CitNT0RVTEVfUEFSTV9ERVNDKGViY250LCAibnVtYmVyIG9mIGNvbnNlY3V0aXZlIGVyYXNlYmxvY2tzIHRvIHRvcnR1cmUiKTsKKworc3RhdGljIGludCBwZ2NudDsKK21vZHVsZV9wYXJhbShwZ2NudCwgaW50LCBTX0lSVUdPKTsKK01PRFVMRV9QQVJNX0RFU0MocGdjbnQsICJudW1iZXIgb2YgcGFnZXMgcGVyIGVyYXNlYmxvY2sgdG8gdG9ydHVyZSAoMCA9PiBhbGwpIik7CisKK3N0YXRpYyBpbnQgZGV2OworbW9kdWxlX3BhcmFtKGRldiwgaW50LCBTX0lSVUdPKTsKK01PRFVMRV9QQVJNX0RFU0MoZGV2LCAiTVREIGRldmljZSBudW1iZXIgdG8gdXNlIik7CisKK3N0YXRpYyBpbnQgZ3JhbiA9IDUxMjsKK21vZHVsZV9wYXJhbShncmFuLCBpbnQsIFNfSVJVR08pOworTU9EVUxFX1BBUk1fREVTQyhncmFuLCAiaG93IG9mdGVuIHRoZSBzdGF0dXMgaW5mb3JtYXRpb24gc2hvdWxkIGJlIHByaW50ZWQiKTsKKworc3RhdGljIGludCBjaGVjayA9IDE7Cittb2R1bGVfcGFyYW0oY2hlY2ssIGludCwgU19JUlVHTyk7CitNT0RVTEVfUEFSTV9ERVNDKGNoZWNrLCAiaWYgdGhlIHdyaXR0ZW4gZGF0YSBzaG91bGQgYmUgY2hlY2tlZCIpOworCitzdGF0aWMgdW5zaWduZWQgaW50IGN5Y2xlc19jb3VudDsKK21vZHVsZV9wYXJhbShjeWNsZXNfY291bnQsIHVpbnQsIFNfSVJVR08pOworTU9EVUxFX1BBUk1fREVTQyhjeWNsZXNfY291bnQsICJob3cgbWFueSBlcmFzZSBjeWNsZXMgdG8gZG8gIgorCQkJICAgICAgICIoaW5maW5pdGUgYnkgZGVmYXVsdCkiKTsKKworc3RhdGljIHN0cnVjdCBtdGRfaW5mbyAqbXRkOworCisvKiBUaGlzIGJ1ZmZlciBjb250YWlucyAweDU1NTU1NS4uLjB4QUFBQUFBLi4uIHBhdHRlcm4gKi8KK3N0YXRpYyB1bnNpZ25lZCBjaGFyICpwYXR0XzVBNTsKKy8qIFRoaXMgYnVmZmVyIGNvbnRhaW5zIDB4QUFBQUFBLi4uMHg1NTU1NTUuLi4gcGF0dGVybiAqLworc3RhdGljIHVuc2lnbmVkIGNoYXIgKnBhdHRfQTVBOworLyogVGhpcyBidWZmZXIgY29udGFpbnMgYWxsIDB4RkYgYnl0ZXMgKi8KK3N0YXRpYyB1bnNpZ25lZCBjaGFyICpwYXR0X0ZGOworLyogVGhpcyBhIHRlbXBvcmFyeSBidWZmZXIgaXMgdXNlIHdoZW4gY2hlY2tpbmcgZGF0YSAqLworc3RhdGljIHVuc2lnbmVkIGNoYXIgKmNoZWNrX2J1ZjsKKy8qIEhvdyBtYW55IGVyYXNlIGN5Y2xlcyB3ZXJlIGRvbmUgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgZXJhc2VfY3ljbGVzOworCitzdGF0aWMgaW50IHBnc2l6ZTsKK3N0YXRpYyBzdHJ1Y3QgdGltZXZhbCBzdGFydCwgZmluaXNoOworCitzdGF0aWMgdm9pZCByZXBvcnRfY29ycnVwdCh1bnNpZ25lZCBjaGFyICpyZWFkLCB1bnNpZ25lZCBjaGFyICp3cml0dGVuKTsKKworc3RhdGljIGlubGluZSB2b2lkIHN0YXJ0X3RpbWluZyh2b2lkKQoreworCWRvX2dldHRpbWVvZmRheSgmc3RhcnQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc3RvcF90aW1pbmcodm9pZCkKK3sKKwlkb19nZXR0aW1lb2ZkYXkoJmZpbmlzaCk7Cit9CisKKy8qCisgKiBFcmFzZSBlcmFzZWJsb2NrIG51bWJlciBAZWJudW0uCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGVyYXNlX2VyYXNlYmxvY2soaW50IGVibnVtKQoreworCWludCBlcnI7CisJc3RydWN0IGVyYXNlX2luZm8gZWk7CisJbG9mZl90IGFkZHIgPSBlYm51bSAqIG10ZC0+ZXJhc2VzaXplOworCisJbWVtc2V0KCZlaSwgMCwgc2l6ZW9mKHN0cnVjdCBlcmFzZV9pbmZvKSk7CisJZWkubXRkICA9IG10ZDsKKwllaS5hZGRyID0gYWRkcjsKKwllaS5sZW4gID0gbXRkLT5lcmFzZXNpemU7CisKKwllcnIgPSBtdGQtPmVyYXNlKG10ZCwgJmVpKTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhQUklOVF9QUkVGICJlcnJvciAlZCB3aGlsZSBlcmFzaW5nIEVCICVkXG4iLCBlcnIsIGVibnVtKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlpZiAoZWkuc3RhdGUgPT0gTVREX0VSQVNFX0ZBSUxFRCkgeworCQlwcmludGsoUFJJTlRfUFJFRiAic29tZSBlcmFzZSBlcnJvciBvY2N1cnJlZCBhdCBFQiAlZFxuIiwKKwkJICAgICAgIGVibnVtKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBDaGVjayB0aGF0IHRoZSBjb250ZW50cyBvZiBlcmFzZWJsb2NrIG51bWJlciBAZW5idW0gaXMgZXF1aXZhbGVudCB0byB0aGUKKyAqIEBidWYgYnVmZmVyLgorICovCitzdGF0aWMgaW5saW5lIGludCBjaGVja19lcmFzZWJsb2NrKGludCBlYm51bSwgdW5zaWduZWQgY2hhciAqYnVmKQoreworCWludCBlcnIsIHJldHJpZXMgPSAwOworCXNpemVfdCByZWFkID0gMDsKKwlsb2ZmX3QgYWRkciA9IGVibnVtICogbXRkLT5lcmFzZXNpemU7CisJc2l6ZV90IGxlbiA9IG10ZC0+ZXJhc2VzaXplOworCisJaWYgKHBnY250KSB7CisJCWFkZHIgPSAoZWJudW0gKyAxKSAqIG10ZC0+ZXJhc2VzaXplIC0gcGdjbnQgKiBwZ3NpemU7CisJCWxlbiA9IHBnY250ICogcGdzaXplOworCX0KKworcmV0cnk6CisJZXJyID0gbXRkLT5yZWFkKG10ZCwgYWRkciwgbGVuLCAmcmVhZCwgY2hlY2tfYnVmKTsKKwlpZiAoZXJyID09IC1FVUNMRUFOKQorCQlwcmludGsoUFJJTlRfUFJFRiAic2luZ2xlIGJpdCBmbGlwIG9jY3VycmVkIGF0IEVCICVkICIKKwkJICAgICAgICJNVEQgcmVwb3J0ZWQgdGhhdCBpdCB3YXMgZml4ZWQuXG4iLCBlYm51bSk7CisJZWxzZSBpZiAoZXJyKSB7CisJCXByaW50ayhQUklOVF9QUkVGICJlcnJvciAlZCB3aGlsZSByZWFkaW5nIEVCICVkLCAiCisJCSAgICAgICAicmVhZCAlemRcbiIsIGVyciwgZWJudW0sIHJlYWQpOworCQlyZXR1cm4gZXJyOworCX0KKworCWlmIChyZWFkICE9IGxlbikgeworCQlwcmludGsoUFJJTlRfUFJFRiAiZmFpbGVkIHRvIHJlYWQgJXpkIGJ5dGVzIGZyb20gRUIgJWQsICIKKwkJICAgICAgICJyZWFkIG9ubHkgJXpkLCBidXQgbm8gZXJyb3IgcmVwb3J0ZWRcbiIsCisJCSAgICAgICBsZW4sIGVibnVtLCByZWFkKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJaWYgKG1lbWNtcChidWYsIGNoZWNrX2J1ZiwgbGVuKSkgeworCQlwcmludGsoUFJJTlRfUFJFRiAicmVhZCB3cm9uZyBkYXRhIGZyb20gRUIgJWRcbiIsIGVibnVtKTsKKwkJcmVwb3J0X2NvcnJ1cHQoY2hlY2tfYnVmLCBidWYpOworCisJCWlmIChyZXRyaWVzKysgPCBSRVRSSUVTKSB7CisJCQkvKiBUcnkgcmVhZCBhZ2FpbiAqLworCQkJeWllbGQoKTsKKwkJCXByaW50ayhQUklOVF9QUkVGICJyZS10cnkgcmVhZGluZyBkYXRhIGZyb20gRUIgJWRcbiIsCisJCQkgICAgICAgZWJudW0pOworCQkJZ290byByZXRyeTsKKwkJfSBlbHNlIHsKKwkJCXByaW50ayhQUklOVF9QUkVGICJyZXRyaWVkICVkIHRpbWVzLCBzdGlsbCBlcnJvcnMsICIKKwkJCSAgICAgICAiZ2l2ZS11cFxuIiwgUkVUUklFUyk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0KKworCWlmIChyZXRyaWVzICE9IDApCisJCXByaW50ayhQUklOVF9QUkVGICJvbmx5IGF0dGVtcHQgbnVtYmVyICVkIHdhcyBPSyAoISEhKVxuIiwKKwkJICAgICAgIHJldHJpZXMpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHdyaXRlX3BhdHRlcm4oaW50IGVibnVtLCB2b2lkICpidWYpCit7CisJaW50IGVycjsKKwlzaXplX3Qgd3JpdHRlbiA9IDA7CisJbG9mZl90IGFkZHIgPSBlYm51bSAqIG10ZC0+ZXJhc2VzaXplOworCXNpemVfdCBsZW4gPSBtdGQtPmVyYXNlc2l6ZTsKKworCWlmIChwZ2NudCkgeworCQlhZGRyID0gKGVibnVtICsgMSkgKiBtdGQtPmVyYXNlc2l6ZSAtIHBnY250ICogcGdzaXplOworCQlsZW4gPSBwZ2NudCAqIHBnc2l6ZTsKKwl9CisJZXJyID0gbXRkLT53cml0ZShtdGQsIGFkZHIsIGxlbiwgJndyaXR0ZW4sIGJ1Zik7CisJaWYgKGVycikgeworCQlwcmludGsoUFJJTlRfUFJFRiAiZXJyb3IgJWQgd2hpbGUgd3JpdGluZyBFQiAlZCwgd3JpdHRlbiAlemQiCisJCSAgICAgICIgYnl0ZXNcbiIsIGVyciwgZWJudW0sIHdyaXR0ZW4pOworCQlyZXR1cm4gZXJyOworCX0KKwlpZiAod3JpdHRlbiAhPSBsZW4pIHsKKwkJcHJpbnRrKFBSSU5UX1BSRUYgIndyaXR0ZW4gb25seSAlemQgYnl0ZXMgb2YgJXpkLCBidXQgbm8gZXJyb3IiCisJCSAgICAgICAiIHJlcG9ydGVkXG4iLCB3cml0dGVuLCBsZW4pOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2luaXQgdG9ydF9pbml0KHZvaWQpCit7CisJaW50IGVyciA9IDAsIGksIGluZmluaXRlID0gIWN5Y2xlc19jb3VudDsKKwlpbnQgYmFkX2Vic1tlYmNudF07CisKKwlwcmludGsoS0VSTl9JTkZPICJcbiIpOworCXByaW50ayhLRVJOX0lORk8gIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIpOworCXByaW50ayhQUklOVF9QUkVGICJXYXJuaW5nOiB0aGlzIHByb2dyYW0gaXMgdHJ5aW5nIHRvIHdlYXIgb3V0IHlvdXIgIgorCSAgICAgICAiZmxhc2gsIHN0b3AgaXQgaWYgdGhpcyBpcyBub3Qgd2FudGVkLlxuIik7CisJcHJpbnRrKFBSSU5UX1BSRUYgIk1URCBkZXZpY2U6ICVkXG4iLCBkZXYpOworCXByaW50ayhQUklOVF9QUkVGICJ0b3J0dXJlICVkIGVyYXNlYmxvY2tzICglZC0lZCkgb2YgbXRkJWRcbiIsCisJICAgICAgIGViY250LCBlYiwgZWIgKyBlYmNudCAtIDEsIGRldik7CisJaWYgKHBnY250KQorCQlwcmludGsoUFJJTlRfUFJFRiAidG9ydHVyaW5nIGp1c3QgJWQgcGFnZXMgcGVyIGVyYXNlYmxvY2tcbiIsCisJCQlwZ2NudCk7CisJcHJpbnRrKFBSSU5UX1BSRUYgIndyaXRlIHZlcmlmeSAlc1xuIiwgY2hlY2sgPyAiZW5hYmxlZCIgOiAiZGlzYWJsZWQiKTsKKworCW10ZCA9IGdldF9tdGRfZGV2aWNlKE5VTEwsIGRldik7CisJaWYgKElTX0VSUihtdGQpKSB7CisJCWVyciA9IFBUUl9FUlIobXRkKTsKKwkJcHJpbnRrKFBSSU5UX1BSRUYgImVycm9yOiBjYW5ub3QgZ2V0IE1URCBkZXZpY2VcbiIpOworCQlyZXR1cm4gZXJyOworCX0KKworCWlmIChtdGQtPndyaXRlc2l6ZSA9PSAxKSB7CisJCXByaW50ayhQUklOVF9QUkVGICJub3QgTkFORCBmbGFzaCwgYXNzdW1lIHBhZ2Ugc2l6ZSBpcyA1MTIgIgorCQkgICAgICAgImJ5dGVzLlxuIik7CisJCXBnc2l6ZSA9IDUxMjsKKwl9IGVsc2UKKwkJcGdzaXplID0gbXRkLT53cml0ZXNpemU7CisKKwlpZiAocGdjbnQgJiYgKHBnY250ID4gbXRkLT5lcmFzZXNpemUgLyBwZ3NpemUgfHwgcGdjbnQgPCAwKSkgeworCQlwcmludGsoUFJJTlRfUFJFRiAiZXJyb3I6IGludmFsaWQgcGdjbnQgdmFsdWUgJWRcbiIsIHBnY250KTsKKwkJZ290byBvdXRfbXRkOworCX0KKworCWVyciA9IC1FTk9NRU07CisJcGF0dF81QTUgPSBrbWFsbG9jKG10ZC0+ZXJhc2VzaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXBhdHRfNUE1KSB7CisJCXByaW50ayhQUklOVF9QUkVGICJlcnJvcjogY2Fubm90IGFsbG9jYXRlIG1lbW9yeVxuIik7CisJCWdvdG8gb3V0X210ZDsKKwl9CisKKwlwYXR0X0E1QSA9IGttYWxsb2MobXRkLT5lcmFzZXNpemUsIEdGUF9LRVJORUwpOworCWlmICghcGF0dF9BNUEpIHsKKwkJcHJpbnRrKFBSSU5UX1BSRUYgImVycm9yOiBjYW5ub3QgYWxsb2NhdGUgbWVtb3J5XG4iKTsKKwkJZ290byBvdXRfcGF0dF81QTU7CisJfQorCisJcGF0dF9GRiA9IGttYWxsb2MobXRkLT5lcmFzZXNpemUsIEdGUF9LRVJORUwpOworCWlmICghcGF0dF9GRikgeworCQlwcmludGsoUFJJTlRfUFJFRiAiZXJyb3I6IGNhbm5vdCBhbGxvY2F0ZSBtZW1vcnlcbiIpOworCQlnb3RvIG91dF9wYXR0X0E1QTsKKwl9CisKKwljaGVja19idWYgPSBrbWFsbG9jKG10ZC0+ZXJhc2VzaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWNoZWNrX2J1ZikgeworCQlwcmludGsoUFJJTlRfUFJFRiAiZXJyb3I6IGNhbm5vdCBhbGxvY2F0ZSBtZW1vcnlcbiIpOworCQlnb3RvIG91dF9wYXR0X0ZGOworCX0KKworCWVyciA9IDA7CisKKwkvKiBJbml0aWFsaXplIHBhdHRlcm5zICovCisJbWVtc2V0KHBhdHRfRkYsIDB4RkYsIG10ZC0+ZXJhc2VzaXplKTsKKwlmb3IgKGkgPSAwOyBpIDwgbXRkLT5lcmFzZXNpemUgLyBwZ3NpemU7IGkrKykgeworCQlpZiAoIShpICYgMSkpIHsKKwkJCW1lbXNldChwYXR0XzVBNSArIGkgKiBwZ3NpemUsIDB4NTUsIHBnc2l6ZSk7CisJCQltZW1zZXQocGF0dF9BNUEgKyBpICogcGdzaXplLCAweEFBLCBwZ3NpemUpOworCQl9IGVsc2UgeworCQkJbWVtc2V0KHBhdHRfNUE1ICsgaSAqIHBnc2l6ZSwgMHhBQSwgcGdzaXplKTsKKwkJCW1lbXNldChwYXR0X0E1QSArIGkgKiBwZ3NpemUsIDB4NTUsIHBnc2l6ZSk7CisJCX0KKwl9CisKKwkvKgorCSAqIENoZWNrIGlmIHRoZXJlIGlzIGEgYmFkIGVyYXNlYmxvY2sgYW1vbmcgdGhvc2Ugd2UgYXJlIGdvaW5nIHRvIHRlc3QuCisJICovCisJbWVtc2V0KCZiYWRfZWJzWzBdLCAwLCBzaXplb2YoaW50KSAqIGViY250KTsKKwlpZiAobXRkLT5ibG9ja19pc2JhZCkgeworCQlmb3IgKGkgPSBlYjsgaSA8IGViICsgZWJjbnQ7IGkrKykgeworCQkJZXJyID0gbXRkLT5ibG9ja19pc2JhZChtdGQsCisJCQkJCSAgICAgICAobG9mZl90KWkgKiBtdGQtPmVyYXNlc2l6ZSk7CisKKwkJCWlmIChlcnIgPCAwKSB7CisJCQkJcHJpbnRrKFBSSU5UX1BSRUYgImJsb2NrX2lzYmFkKCkgcmV0dXJuZWQgJWQgIgorCQkJCSAgICAgICAiZm9yIEVCICVkXG4iLCBlcnIsIGkpOworCQkJCWdvdG8gb3V0OworCQkJfQorCisJCQlpZiAoZXJyKSB7CisJCQkJcHJpbnRrKCJFQiAlZCBpcyBiYWQuIFNraXAgaXQuXG4iLCBpKTsKKwkJCQliYWRfZWJzW2kgLSBlYl0gPSAxOworCQkJfQorCQl9CisJfQorCisJc3RhcnRfdGltaW5nKCk7CisJd2hpbGUgKDEpIHsKKwkJaW50IGk7CisJCXZvaWQgKnBhdHQ7CisKKwkJLyogRXJhc2UgYWxsIGVyYXNlYmxvY2tzICovCisJCWZvciAoaSA9IGViOyBpIDwgZWIgKyBlYmNudDsgaSsrKSB7CisJCQlpZiAoYmFkX2Vic1tpIC0gZWJdKQorCQkJCWNvbnRpbnVlOworCQkJZXJyID0gZXJhc2VfZXJhc2VibG9jayhpKTsKKwkJCWlmIChlcnIpCisJCQkJZ290byBvdXQ7CisJCQljb25kX3Jlc2NoZWQoKTsKKwkJfQorCisJCS8qIENoZWNrIGlmIHRoZSBlcmFzZWJsb2NrcyBjb250YWluIG9ubHkgMHhGRiBieXRlcyAqLworCQlpZiAoY2hlY2spIHsKKwkJCWZvciAoaSA9IGViOyBpIDwgZWIgKyBlYmNudDsgaSsrKSB7CisJCQkJaWYgKGJhZF9lYnNbaSAtIGViXSkKKwkJCQkJY29udGludWU7CisJCQkJZXJyID0gY2hlY2tfZXJhc2VibG9jayhpLCBwYXR0X0ZGKTsKKwkJCQlpZiAoZXJyKSB7CisJCQkJCXByaW50ayhQUklOVF9QUkVGICJ2ZXJpZnkgZmFpbGVkIgorCQkJCQkgICAgICAgIiBmb3IgMHhGRi4uLiBwYXR0ZXJuXG4iKTsKKwkJCQkJZ290byBvdXQ7CisJCQkJfQorCQkJCWNvbmRfcmVzY2hlZCgpOworCQkJfQorCQl9CisKKwkJLyogV3JpdGUgdGhlIHBhdHRlcm4gKi8KKwkJZm9yIChpID0gZWI7IGkgPCBlYiArIGViY250OyBpKyspIHsKKwkJCWlmIChiYWRfZWJzW2kgLSBlYl0pCisJCQkJY29udGludWU7CisJCQlpZiAoKGViICsgZXJhc2VfY3ljbGVzKSAmIDEpCisJCQkJcGF0dCA9IHBhdHRfNUE1OworCQkJZWxzZQorCQkJCXBhdHQgPSBwYXR0X0E1QTsKKwkJCWVyciA9IHdyaXRlX3BhdHRlcm4oaSwgcGF0dCk7CisJCQlpZiAoZXJyKQorCQkJCWdvdG8gb3V0OworCQkJY29uZF9yZXNjaGVkKCk7CisJCX0KKworCQkvKiBWZXJpZnkgd2hhdCB3ZSB3cm90ZSAqLworCQlpZiAoY2hlY2spIHsKKwkJCWZvciAoaSA9IGViOyBpIDwgZWIgKyBlYmNudDsgaSsrKSB7CisJCQkJaWYgKGJhZF9lYnNbaSAtIGViXSkKKwkJCQkJY29udGludWU7CisJCQkJaWYgKChlYiArIGVyYXNlX2N5Y2xlcykgJiAxKQorCQkJCQlwYXR0ID0gcGF0dF81QTU7CisJCQkJZWxzZQorCQkJCQlwYXR0ID0gcGF0dF9BNUE7CisJCQkJZXJyID0gY2hlY2tfZXJhc2VibG9jayhpLCBwYXR0KTsKKwkJCQlpZiAoZXJyKSB7CisJCQkJCXByaW50ayhQUklOVF9QUkVGICJ2ZXJpZnkgZmFpbGVkIGZvciAlcyIKKwkJCQkJICAgICAgICIgcGF0dGVyblxuIiwKKwkJCQkJICAgICAgICgoZWIgKyBlcmFzZV9jeWNsZXMpICYgMSkgPworCQkJCQkgICAgICAgIjB4NTVBQTU1Li4uIiA6ICIweEFBNTVBQS4uLiIpOworCQkJCQlnb3RvIG91dDsKKwkJCQl9CisJCQkJY29uZF9yZXNjaGVkKCk7CisJCQl9CisJCX0KKworCQllcmFzZV9jeWNsZXMgKz0gMTsKKworCQlpZiAoZXJhc2VfY3ljbGVzICUgZ3JhbiA9PSAwKSB7CisJCQlsb25nIG1zOworCisJCQlzdG9wX3RpbWluZygpOworCQkJbXMgPSAoZmluaXNoLnR2X3NlYyAtIHN0YXJ0LnR2X3NlYykgKiAxMDAwICsKKwkJCSAgICAgKGZpbmlzaC50dl91c2VjIC0gc3RhcnQudHZfdXNlYykgLyAxMDAwOworCQkJcHJpbnRrKFBSSU5UX1BSRUYgIiUwOHUgZXJhc2UgY3ljbGVzIGRvbmUsIHRvb2sgJWx1ICIKKwkJCSAgICAgICAibWlsbGlzZWNvbmRzICglbHUgc2Vjb25kcylcbiIsCisJCQkgICAgICAgZXJhc2VfY3ljbGVzLCBtcywgbXMgLyAxMDAwKTsKKwkJCXN0YXJ0X3RpbWluZygpOworCQl9CisKKwkJaWYgKCFpbmZpbml0ZSAmJiAtLWN5Y2xlc19jb3VudCA9PSAwKQorCQkJYnJlYWs7CisJfQorb3V0OgorCisJcHJpbnRrKFBSSU5UX1BSRUYgImZpbmlzaGVkIGFmdGVyICV1IGVyYXNlIGN5Y2xlc1xuIiwKKwkgICAgICAgZXJhc2VfY3ljbGVzKTsKKwlrZnJlZShjaGVja19idWYpOworb3V0X3BhdHRfRkY6CisJa2ZyZWUocGF0dF9GRik7CitvdXRfcGF0dF9BNUE6CisJa2ZyZWUocGF0dF9BNUEpOworb3V0X3BhdHRfNUE1OgorCWtmcmVlKHBhdHRfNUE1KTsKK291dF9tdGQ6CisJcHV0X210ZF9kZXZpY2UobXRkKTsKKwlpZiAoZXJyKQorCQlwcmludGsoUFJJTlRfUFJFRiAiZXJyb3IgJWQgb2NjdXJyZWQgZHVyaW5nIHRvcnR1cmluZ1xuIiwgZXJyKTsKKwlwcmludGsoS0VSTl9JTkZPICI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iKTsKKwlyZXR1cm4gZXJyOworfQorbW9kdWxlX2luaXQodG9ydF9pbml0KTsKKworc3RhdGljIHZvaWQgX19leGl0IHRvcnRfZXhpdCh2b2lkKQoreworCXJldHVybjsKK30KK21vZHVsZV9leGl0KHRvcnRfZXhpdCk7CisKK3N0YXRpYyBpbnQgY291bnRkaWZmcyh1bnNpZ25lZCBjaGFyICpidWYsIHVuc2lnbmVkIGNoYXIgKmNoZWNrX2J1ZiwKKwkJICAgICAgdW5zaWduZWQgb2Zmc2V0LCB1bnNpZ25lZCBsZW4sIHVuc2lnbmVkICpieXRlc3AsCisJCSAgICAgIHVuc2lnbmVkICpiaXRzcCk7CitzdGF0aWMgdm9pZCBwcmludF9idWZzKHVuc2lnbmVkIGNoYXIgKnJlYWQsIHVuc2lnbmVkIGNoYXIgKndyaXR0ZW4sIGludCBzdGFydCwKKwkJICAgICAgIGludCBsZW4pOworCisvKgorICogUmVwb3J0IHRoZSBkZXRhaWxlZCBpbmZvcm1hdGlvbiBhYm91dCBob3cgdGhlIHJlYWQgRUIgZGlmZmVycyBmcm9tIHdoYXQgd2FzCisgKiB3cml0dGVuLgorICovCitzdGF0aWMgdm9pZCByZXBvcnRfY29ycnVwdCh1bnNpZ25lZCBjaGFyICpyZWFkLCB1bnNpZ25lZCBjaGFyICp3cml0dGVuKQoreworCWludCBpOworCWludCBieXRlcywgYml0cywgcGFnZXMsIGZpcnN0OworCWludCBvZmZzZXQsIGxlbjsKKwlzaXplX3QgY2hlY2tfbGVuID0gbXRkLT5lcmFzZXNpemU7CisKKwlpZiAocGdjbnQpCisJCWNoZWNrX2xlbiA9IHBnY250ICogcGdzaXplOworCisJYnl0ZXMgPSBiaXRzID0gcGFnZXMgPSAwOworCWZvciAoaSA9IDA7IGkgPCBjaGVja19sZW47IGkgKz0gcGdzaXplKQorCQlpZiAoY291bnRkaWZmcyh3cml0dGVuLCByZWFkLCBpLCBwZ3NpemUsICZieXRlcywKKwkJCSAgICAgICAmYml0cykgPj0gMCkKKwkJCXBhZ2VzKys7CisKKwlwcmludGsoUFJJTlRfUFJFRiAidmVyaWZ5IGZhaWxzIG9uICVkIHBhZ2VzLCAlZCBieXRlcy8lZCBiaXRzXG4iLAorCSAgICAgICBwYWdlcywgYnl0ZXMsIGJpdHMpOworCXByaW50ayhQUklOVF9QUkVGICJUaGUgZm9sbG93aW5nIGlzIGEgbGlzdCBvZiBhbGwgZGlmZmVyZW5jZXMgYmV0d2VlbiIKKwkgICAgICAgIiB3aGF0IHdhcyByZWFkIGZyb20gZmxhc2ggYW5kIHdoYXQgd2FzIGV4cGVjdGVkXG4iKTsKKworCWZvciAoaSA9IDA7IGkgPCBjaGVja19sZW47IGkgKz0gcGdzaXplKSB7CisJCWNvbmRfcmVzY2hlZCgpOworCQlieXRlcyA9IGJpdHMgPSAwOworCQlmaXJzdCA9IGNvdW50ZGlmZnMod3JpdHRlbiwgcmVhZCwgaSwgcGdzaXplLCAmYnl0ZXMsCisJCQkJICAgJmJpdHMpOworCQlpZiAoZmlyc3QgPCAwKQorCQkJY29udGludWU7CisKKwkJcHJpbnRrKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIgorCQkgICAgICAgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOworCisJCXByaW50ayhQUklOVF9QUkVGICJQYWdlICV6ZCBoYXMgJWQgYnl0ZXMvJWQgYml0cyBmYWlsaW5nIHZlcmlmeSwiCisJCSAgICAgICAiIHN0YXJ0aW5nIGF0IG9mZnNldCAweCV4XG4iLAorCQkgICAgICAgKG10ZC0+ZXJhc2VzaXplIC0gY2hlY2tfbGVuICsgaSkgLyBwZ3NpemUsCisJCSAgICAgICBieXRlcywgYml0cywgZmlyc3QpOworCisJCW9mZnNldCA9IGZpcnN0ICYgfjB4NzsKKwkJbGVuID0gKChmaXJzdCArIGJ5dGVzKSB8IDB4NykgKyAxIC0gb2Zmc2V0OworCisJCXByaW50X2J1ZnMocmVhZCwgd3JpdHRlbiwgb2Zmc2V0LCBsZW4pOworCX0KK30KKworc3RhdGljIHZvaWQgcHJpbnRfYnVmcyh1bnNpZ25lZCBjaGFyICpyZWFkLCB1bnNpZ25lZCBjaGFyICp3cml0dGVuLCBpbnQgc3RhcnQsCisJCSAgICAgICBpbnQgbGVuKQoreworCWludCBpID0gMCwgajEsIGoyOworCWNoYXIgKmRpZmY7CisKKwlwcmludGsoIk9mZnNldCAgICAgICBSZWFkICAgICAgICAgICAgICAgICAgICAgICAgICBXcml0dGVuXG4iKTsKKwl3aGlsZSAoaSA8IGxlbikgeworCQlwcmludGsoIjB4JTA4eDogIiwgc3RhcnQgKyBpKTsKKwkJZGlmZiA9ICIgICAiOworCQlmb3IgKGoxID0gMDsgajEgPCA4ICYmIGkgKyBqMSA8IGxlbjsgajErKykgeworCQkJcHJpbnRrKCIgJTAyeCIsIHJlYWRbc3RhcnQgKyBpICsgajFdKTsKKwkJCWlmIChyZWFkW3N0YXJ0ICsgaSArIGoxXSAhPSB3cml0dGVuW3N0YXJ0ICsgaSArIGoxXSkKKwkJCQlkaWZmID0gIioqKiI7CisJCX0KKworCQl3aGlsZSAoajEgPCA4KSB7CisJCQlwcmludGsoIiAiKTsKKwkJCWoxICs9IDE7CisJCX0KKworCQlwcmludGsoIiAgJXMgIiwgZGlmZik7CisKKwkJZm9yIChqMiA9IDA7IGoyIDwgOCAmJiBpICsgajIgPCBsZW47IGoyKyspCisJCQlwcmludGsoIiAlMDJ4Iiwgd3JpdHRlbltzdGFydCArIGkgKyBqMl0pOworCQlwcmludGsoIlxuIik7CisJCWkgKz0gODsKKwl9Cit9CisKKy8qCisgKiBDb3VudCB0aGUgbnVtYmVyIG9mIGRpZmZlcmluZyBieXRlcyBhbmQgYml0cyBhbmQgcmV0dXJuIHRoZSBmaXJzdCBkaWZmZXJpbmcKKyAqIG9mZnNldC4KKyAqLworc3RhdGljIGludCBjb3VudGRpZmZzKHVuc2lnbmVkIGNoYXIgKmJ1ZiwgdW5zaWduZWQgY2hhciAqY2hlY2tfYnVmLAorCQkgICAgICB1bnNpZ25lZCBvZmZzZXQsIHVuc2lnbmVkIGxlbiwgdW5zaWduZWQgKmJ5dGVzcCwKKwkJICAgICAgdW5zaWduZWQgKmJpdHNwKQoreworCXVuc2lnbmVkIGksIGJpdDsKKwlpbnQgZmlyc3QgPSAtMTsKKworCWZvciAoaSA9IG9mZnNldDsgaSA8IG9mZnNldCArIGxlbjsgaSsrKQorCQlpZiAoYnVmW2ldICE9IGNoZWNrX2J1ZltpXSkgeworCQkJZmlyc3QgPSBpOworCQkJYnJlYWs7CisJCX0KKworCXdoaWxlIChpIDwgb2Zmc2V0ICsgbGVuKSB7CisJCWlmIChidWZbaV0gIT0gY2hlY2tfYnVmW2ldKSB7CisJCQkoKmJ5dGVzcCkrKzsKKwkJCWJpdCA9IDE7CisJCQl3aGlsZSAoYml0IDwgMjU2KSB7CisJCQkJaWYgKChidWZbaV0gJiBiaXQpICE9IChjaGVja19idWZbaV0gJiBiaXQpKQorCQkJCQkoKmJpdHNwKSsrOworCQkJCWJpdCA8PD0gMTsKKwkJCX0KKwkJfQorCQlpKys7CisJfQorCisJcmV0dXJuIGZpcnN0OworfQorCitNT0RVTEVfREVTQ1JJUFRJT04oIkVyYXNlYmxvY2sgdG9ydHVyaW5nIG1vZHVsZSIpOworTU9EVUxFX0FVVEhPUigiQXJ0ZW0gQml0eXV0c2tpeSwgSmFya2tvIExhdmluZW4sIEFkcmlhbiBIdW50ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL3ViaS9idWlsZC5jIGIvZHJpdmVycy9tdGQvdWJpL2J1aWxkLmMKaW5kZXggN2NhZjIyYy4uOTA4Mjc2OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvdWJpL2J1aWxkLmMKKysrIGIvZHJpdmVycy9tdGQvdWJpL2J1aWxkLmMKQEAgLTU2MSw3ICs1NjEsNyBAQAogCSAqLwogCiAJdWJpLT5wZWJfc2l6ZSAgID0gdWJpLT5tdGQtPmVyYXNlc2l6ZTsKLQl1YmktPnBlYl9jb3VudCAgPSB1YmktPm10ZC0+c2l6ZSAvIHViaS0+bXRkLT5lcmFzZXNpemU7CisJdWJpLT5wZWJfY291bnQgID0gbXRkX2Rpdl9ieV9lYih1YmktPm10ZC0+c2l6ZSwgdWJpLT5tdGQpOwogCXViaS0+Zmxhc2hfc2l6ZSA9IHViaS0+bXRkLT5zaXplOwogCiAJaWYgKHViaS0+bXRkLT5ibG9ja19pc2JhZCAmJiB1YmktPm10ZC0+YmxvY2tfbWFya2JhZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL3ViaS9lYmEuYyBiL2RyaXZlcnMvbXRkL3ViaS9lYmEuYwppbmRleCAwNDhhNjA2Li4yNWRlZjM0IDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC91YmkvZWJhLmMKKysrIGIvZHJpdmVycy9tdGQvdWJpL2ViYS5jCkBAIC03MTcsNyArNzE3LDcgQEAKICAqIHRvIHRoZSByZWFsIGRhdGEgc2l6ZSwgYWx0aG91Z2ggdGhlIEBidWYgYnVmZmVyIGhhcyB0byBjb250YWluIHRoZQogICogYWxpZ25tZW50LiBJbiBhbGwgb3RoZXIgY2FzZXMsIEBsZW4gaGFzIHRvIGJlIGFsaWduZWQuCiAgKgotICogSXQgaXMgcHJvaGliaXRlZCB0byB3cml0ZSBtb3JlIHRoZW4gb25jZSB0byBsb2dpY2FsIGVyYXNlYmxvY2tzIG9mIHN0YXRpYworICogSXQgaXMgcHJvaGliaXRlZCB0byB3cml0ZSBtb3JlIHRoYW4gb25jZSB0byBsb2dpY2FsIGVyYXNlYmxvY2tzIG9mIHN0YXRpYwogICogdm9sdW1lcy4gVGhpcyBmdW5jdGlvbiByZXR1cm5zIHplcm8gaW4gY2FzZSBvZiBzdWNjZXNzIGFuZCBhIG5lZ2F0aXZlIGVycm9yCiAgKiBjb2RlIGluIGNhc2Ugb2YgZmFpbHVyZS4KICAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvdWJpL2dsdWViaS5jIGIvZHJpdmVycy9tdGQvdWJpL2dsdWViaS5jCmluZGV4IDYwNTgxMmIuLjZkZDRmNWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL3ViaS9nbHVlYmkuYworKysgYi9kcml2ZXJzL210ZC91YmkvZ2x1ZWJpLmMKQEAgLTIxNSw3ICsyMTUsOCBAQAogCXN0cnVjdCB1Ymlfdm9sdW1lICp2b2w7CiAJc3RydWN0IHViaV9kZXZpY2UgKnViaTsKIAotCWRiZ19nZW4oImVyYXNlICV1IGJ5dGVzIGF0IG9mZnNldCAldSIsIGluc3RyLT5sZW4sIGluc3RyLT5hZGRyKTsKKwlkYmdfZ2VuKCJlcmFzZSAlbGx1IGJ5dGVzIGF0IG9mZnNldCAlbGx1IiwgKHVuc2lnbmVkIGxvbmcgbG9uZylpbnN0ci0+bGVuLAorCQkgKHVuc2lnbmVkIGxvbmcgbG9uZylpbnN0ci0+YWRkcik7CiAKIAlpZiAoaW5zdHItPmFkZHIgPCAwIHx8IGluc3RyLT5hZGRyID4gbXRkLT5zaXplIC0gbXRkLT5lcmFzZXNpemUpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMjIzLDExICsyMjQsMTEgQEAKIAlpZiAoaW5zdHItPmxlbiA8IDAgfHwgaW5zdHItPmFkZHIgKyBpbnN0ci0+bGVuID4gbXRkLT5zaXplKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWlmIChpbnN0ci0+YWRkciAlIG10ZC0+d3JpdGVzaXplIHx8IGluc3RyLT5sZW4gJSBtdGQtPndyaXRlc2l6ZSkKKwlpZiAobXRkX21vZF9ieV93cyhpbnN0ci0+YWRkciwgbXRkKSB8fCBtdGRfbW9kX2J5X3dzKGluc3RyLT5sZW4sIG10ZCkpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JbG51bSA9IGluc3RyLT5hZGRyIC8gbXRkLT5lcmFzZXNpemU7Ci0JY291bnQgPSBpbnN0ci0+bGVuIC8gbXRkLT5lcmFzZXNpemU7CisJbG51bSA9IG10ZF9kaXZfYnlfZWIoaW5zdHItPmFkZHIsIG10ZCk7CisJY291bnQgPSBtdGRfZGl2X2J5X2ViKGluc3RyLT5sZW4sIG10ZCk7CiAKIAl2b2wgPSBjb250YWluZXJfb2YobXRkLCBzdHJ1Y3QgdWJpX3ZvbHVtZSwgZ2x1ZWJpX210ZCk7CiAJdWJpID0gdm9sLT51Ymk7CkBAIC0yNTUsNyArMjU2LDcgQEAKIAogb3V0X2VycjoKIAlpbnN0ci0+c3RhdGUgPSBNVERfRVJBU0VfRkFJTEVEOwotCWluc3RyLT5mYWlsX2FkZHIgPSBsbnVtICogbXRkLT5lcmFzZXNpemU7CisJaW5zdHItPmZhaWxfYWRkciA9IChsb25nIGxvbmcpbG51bSAqIG10ZC0+ZXJhc2VzaXplOwogCXJldHVybiBlcnI7CiB9CiAKQEAgLTI5NCw3ICsyOTUsNyBAQAogCSAqIGJ5dGVzLgogCSAqLwogCWlmICh2b2wtPnZvbF90eXBlID09IFVCSV9EWU5BTUlDX1ZPTFVNRSkKLQkJbXRkLT5zaXplID0gdm9sLT51c2FibGVfbGViX3NpemUgKiB2b2wtPnJlc2VydmVkX3BlYnM7CisJCW10ZC0+c2l6ZSA9IChsb25nIGxvbmcpdm9sLT51c2FibGVfbGViX3NpemUgKiB2b2wtPnJlc2VydmVkX3BlYnM7CiAJZWxzZQogCQltdGQtPnNpemUgPSB2b2wtPnVzZWRfYnl0ZXM7CiAKQEAgLTMwNCw4ICszMDUsOCBAQAogCQlyZXR1cm4gLUVORklMRTsKIAl9CiAKLQlkYmdfZ2VuKCJhZGRlZCBtdGQlZCAoXCIlc1wiKSwgc2l6ZSAldSwgRUIgc2l6ZSAldSIsCi0JCW10ZC0+aW5kZXgsIG10ZC0+bmFtZSwgbXRkLT5zaXplLCBtdGQtPmVyYXNlc2l6ZSk7CisJZGJnX2dlbigiYWRkZWQgbXRkJWQgKFwiJXNcIiksIHNpemUgJWxsdSwgRUIgc2l6ZSAldSIsCisJCW10ZC0+aW5kZXgsIG10ZC0+bmFtZSwgKHVuc2lnbmVkIGxvbmcgbG9uZyltdGQtPnNpemUsIG10ZC0+ZXJhc2VzaXplKTsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvdWJpL2lvLmMgYi9kcml2ZXJzL210ZC91YmkvaW8uYwppbmRleCBhNzQxMThjLi5mZTgxMDM5IDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC91YmkvaW8uYworKysgYi9kcml2ZXJzL210ZC91YmkvaW8uYwpAQCAtNDY1LDcgKzQ2NSw3IEBACiAgKiBUaGlzIGZ1bmN0aW9uIHN5bmNocm9ub3VzbHkgZXJhc2VzIHBoeXNpY2FsIGVyYXNlYmxvY2sgQHBudW0uIElmIEB0b3J0dXJlCiAgKiBmbGFnIGlzIG5vdCB6ZXJvLCB0aGUgcGh5c2ljYWwgZXJhc2VibG9jayBpcyBjaGVja2VkIGJ5IG1lYW5zIG9mIHdyaXRpbmcKICAqIGRpZmZlcmVudCBwYXR0ZXJucyB0byBpdCBhbmQgcmVhZGluZyB0aGVtIGJhY2suIElmIHRoZSB0b3J0dXJpbmcgaXMgZW5hYmxlZCwKLSAqIHRoZSBwaHlzaWNhbCBlcmFzZWJsb2NrIGlzIGVyYXNlZCBtb3JlIHRoZW4gb25jZS4KKyAqIHRoZSBwaHlzaWNhbCBlcmFzZWJsb2NrIGlzIGVyYXNlZCBtb3JlIHRoYW4gb25jZS4KICAqCiAgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIG51bWJlciBvZiBlcmFzdXJlcyBtYWRlIGluIGNhc2Ugb2Ygc3VjY2VzcywgJS1FSU8KICAqIGlmIHRoZSBlcmFzdXJlIGZhaWxlZCBvciB0aGUgdG9ydHVyaW5nIHRlc3QgZmFpbGVkLCBhbmQgb3RoZXIgbmVnYXRpdmUgZXJyb3IKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL3ViaS9rYXBpLmMgYi9kcml2ZXJzL210ZC91Ymkva2FwaS5jCmluZGV4IDVkOWJjZjEuLjRhYmJlNTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL3ViaS9rYXBpLmMKKysrIGIvZHJpdmVycy9tdGQvdWJpL2thcGkuYwpAQCAtNTY0LDcgKzU2NCw3IEBACiAgKiBAZHR5cGU6IGV4cGVjdGVkIGRhdGEgdHlwZQogICoKICAqIFRoaXMgZnVuY3Rpb24gbWFwcyBhbiB1bi1tYXBwZWQgbG9naWNhbCBlcmFzZWJsb2NrIEBsbnVtIHRvIGEgcGh5c2ljYWwKLSAqIGVyYXNlYmxvY2suIFRoaXMgbWVhbnMsIHRoYXQgYWZ0ZXIgYSBzdWNjZXNzZnVsbCBpbnZvY2F0aW9uIG9mIHRoaXMKKyAqIGVyYXNlYmxvY2suIFRoaXMgbWVhbnMsIHRoYXQgYWZ0ZXIgYSBzdWNjZXNzZnVsIGludm9jYXRpb24gb2YgdGhpcwogICogZnVuY3Rpb24gdGhlIGxvZ2ljYWwgZXJhc2VibG9jayBAbG51bSB3aWxsIGJlIGVtcHR5IChjb250YWluIG9ubHkgJTB4RkYKICAqIGJ5dGVzKSBhbmQgYmUgbWFwcGVkIHRvIGEgcGh5c2ljYWwgZXJhc2VibG9jaywgZXZlbiBpZiBhbiB1bmNsZWFuIHJlYm9vdAogICogaGFwcGVucy4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL3ViaS9zY2FuLmMgYi9kcml2ZXJzL210ZC91Ymkvc2Nhbi5jCmluZGV4IDQxZDQ3ZTEuLmVjZGUyMDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL3ViaS9zY2FuLmMKKysrIGIvZHJpdmVycy9tdGQvdWJpL3NjYW4uYwpAQCAtNDc4LDcgKzQ3OCw3IEBACiAJCQlyZXR1cm4gMDsKIAkJfSBlbHNlIHsKIAkJCS8qCi0JCQkgKiBUaGlzIGxvZ2ljYWwgZXJhc2VibG9jayBpcyBvbGRlciB0aGVuIHRoZSBvbmUgZm91bmQKKwkJCSAqIFRoaXMgbG9naWNhbCBlcmFzZWJsb2NrIGlzIG9sZGVyIHRoYW4gdGhlIG9uZSBmb3VuZAogCQkJICogcHJldmlvdXNseS4KIAkJCSAqLwogCQkJaWYgKGNtcF9yZXMgJiA0KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvdWJpL3ViaS1tZWRpYS5oIGIvZHJpdmVycy9tdGQvdWJpL3ViaS1tZWRpYS5oCmluZGV4IDJhZDk0MDQuLjg0MTlmZGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL3ViaS91YmktbWVkaWEuaAorKysgYi9kcml2ZXJzL210ZC91YmkvdWJpLW1lZGlhLmgKQEAgLTEzNSw3ICsxMzUsNyBAQAogICogVGhlIGVyYXNlIGNvdW50ZXIgaGVhZGVyIHRha2VzIDY0IGJ5dGVzIGFuZCBoYXMgYSBwbGVudHkgb2YgdW51c2VkIHNwYWNlIGZvcgogICogZnV0dXJlIHVzYWdlLiBUaGUgdW51c2VkIGZpZWxkcyBhcmUgemVyb2VkLiBUaGUgQHZlcnNpb24gZmllbGQgaXMgdXNlZCB0bwogICogaW5kaWNhdGUgdGhlIHZlcnNpb24gb2YgVUJJIGltcGxlbWVudGF0aW9uIHdoaWNoIGlzIHN1cHBvc2VkIHRvIGJlIGFibGUgdG8KLSAqIHdvcmsgd2l0aCB0aGlzIFVCSSBpbWFnZS4gSWYgQHZlcnNpb24gaXMgZ3JlYXRlciB0aGVuIHRoZSBjdXJyZW50IFVCSQorICogd29yayB3aXRoIHRoaXMgVUJJIGltYWdlLiBJZiBAdmVyc2lvbiBpcyBncmVhdGVyIHRoYW4gdGhlIGN1cnJlbnQgVUJJCiAgKiB2ZXJzaW9uLCB0aGUgaW1hZ2UgaXMgcmVqZWN0ZWQuIFRoaXMgbWF5IGJlIHVzZWZ1bCBpbiBmdXR1cmUgaWYgc29tZXRoaW5nCiAgKiBpcyBjaGFuZ2VkIHJhZGljYWxseS4gVGhpcyBmaWVsZCBpcyBkdXBsaWNhdGVkIGluIHRoZSB2b2x1bWUgaWRlbnRpZmllcgogICogaGVhZGVyLgpAQCAtMTg3LDcgKzE4Nyw3IEBACiAgKiAoc2VxdWVuY2UgbnVtYmVyKSBpcyB1c2VkIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gb2xkZXIgYW5kIG5ld2VyIHZlcnNpb25zIG9mCiAgKiBsb2dpY2FsIGVyYXNlYmxvY2tzLgogICoKLSAqIFRoZXJlIGFyZSAyIHNpdHVhdGlvbnMgd2hlbiB0aGVyZSBtYXkgYmUgbW9yZSB0aGVuIG9uZSBwaHlzaWNhbCBlcmFzZWJsb2NrCisgKiBUaGVyZSBhcmUgMiBzaXR1YXRpb25zIHdoZW4gdGhlcmUgbWF5IGJlIG1vcmUgdGhhbiBvbmUgcGh5c2ljYWwgZXJhc2VibG9jawogICogY29ycmVzcG9uZGluZyB0byB0aGUgc2FtZSBsb2dpY2FsIGVyYXNlYmxvY2ssIGkuZS4sIGhhdmluZyB0aGUgc2FtZSBAdm9sX2lkCiAgKiBhbmQgQGxudW0gdmFsdWVzIGluIHRoZSB2b2x1bWUgaWRlbnRpZmllciBoZWFkZXIuIFN1cHBvc2Ugd2UgaGF2ZSBhIGxvZ2ljYWwKICAqIGVyYXNlYmxvY2sgTCBhbmQgaXQgaXMgbWFwcGVkIHRvIHRoZSBwaHlzaWNhbCBlcmFzZWJsb2NrIFAuCmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC91YmkvdnRibC5jIGIvZHJpdmVycy9tdGQvdWJpL3Z0YmwuYwppbmRleCAzMzNjODk0Li4xYWZjNjFlIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC91YmkvdnRibC5jCisrKyBiL2RyaXZlcnMvbXRkL3ViaS92dGJsLmMKQEAgLTU3Nyw3ICs1NzcsNyBAQAogCQlpZiAodnRibFtpXS5mbGFncyAmIFVCSV9WVEJMX0FVVE9SRVNJWkVfRkxHKSB7CiAJCQkvKiBBdXRvIHJlLXNpemUgZmxhZyBtYXkgYmUgc2V0IG9ubHkgZm9yIG9uZSB2b2x1bWUgKi8KIAkJCWlmICh1YmktPmF1dG9yZXNpemVfdm9sX2lkICE9IC0xKSB7Ci0JCQkJdWJpX2VycigibW9yZSB0aGVuIG9uZSBhdXRvLXJlc2l6ZSB2b2x1bWUgKCVkICIKKwkJCQl1YmlfZXJyKCJtb3JlIHRoYW4gb25lIGF1dG8tcmVzaXplIHZvbHVtZSAoJWQgIgogCQkJCQkiYW5kICVkKSIsIHViaS0+YXV0b3Jlc2l6ZV92b2xfaWQsIGkpOwogCQkJCWtmcmVlKHZvbCk7CiAJCQkJcmV0dXJuIC1FSU5WQUw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC91Ymkvd2wuYyBiL2RyaXZlcnMvbXRkL3ViaS93bC5jCmluZGV4IDE0OTAxY2IuLjg5MTUzNGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL3ViaS93bC5jCisrKyBiL2RyaXZlcnMvbXRkL3ViaS93bC5jCkBAIC0xMjgsNyArMTI4LDcgQEAKICAqIHNpdHVhdGlvbiB3aGVuIHRoZSBwaWNrZWQgcGh5c2ljYWwgZXJhc2VibG9jayBpcyBjb25zdGFudGx5IGVyYXNlZCBhZnRlciB0aGUKICAqIGRhdGEgaXMgd3JpdHRlbiB0byBpdC4gU28sIHdlIGhhdmUgYSBjb25zdGFudCB3aGljaCBsaW1pdHMgdGhlIGhpZ2hlc3QgZXJhc2UKICAqIGNvdW50ZXIgb2YgdGhlIGZyZWUgcGh5c2ljYWwgZXJhc2VibG9jayB0byBwaWNrLiBOYW1lbHksIHRoZSBXTCBzdWItc3lzdGVtCi0gKiBkb2VzIG5vdCBwaWNrIGVyYXNlYmxvY2tzIHdpdGggZXJhc2UgY291bnRlciBncmVhdGVyIHRoZW4gdGhlIGxvd2VzdCBlcmFzZQorICogZG9lcyBub3QgcGljayBlcmFzZWJsb2NrcyB3aXRoIGVyYXNlIGNvdW50ZXIgZ3JlYXRlciB0aGFuIHRoZSBsb3dlc3QgZXJhc2UKICAqIGNvdW50ZXIgcGx1cyAlV0xfRlJFRV9NQVhfRElGRi4KICAqLwogI2RlZmluZSBXTF9GUkVFX01BWF9ESUZGICgyKlVCSV9XTF9USFJFU0hPTEQpCkBAIC05MTcsNyArOTE3LDcgQEAKIAkJLyoKIAkJICogV2Ugc2NoZWR1bGUgd2Vhci1sZXZlbGluZyBvbmx5IGlmIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlCiAJCSAqIGxvd2VzdCBlcmFzZSBjb3VudGVyIG9mIHVzZWQgcGh5c2ljYWwgZXJhc2VibG9ja3MgYW5kIGEgaGlnaAotCQkgKiBlcmFzZSBjb3VudGVyIG9mIGZyZWUgcGh5c2ljYWwgZXJhc2VibG9ja3MgaXMgZ3JlYXRlciB0aGVuCisJCSAqIGVyYXNlIGNvdW50ZXIgb2YgZnJlZSBwaHlzaWNhbCBlcmFzZWJsb2NrcyBpcyBncmVhdGVyIHRoYW4KIAkJICogJVVCSV9XTF9USFJFU0hPTEQuCiAJCSAqLwogCQllMSA9IHJiX2VudHJ5KHJiX2ZpcnN0KCZ1YmktPnVzZWQpLCBzdHJ1Y3QgdWJpX3dsX2VudHJ5LCB1LnJiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0LzNjNTAzLmMgYi9kcml2ZXJzL25ldC8zYzUwMy5jCmluZGV4IGMwOTJjMzkuLjViOTFhODUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0LzNjNTAzLmMKKysrIGIvZHJpdmVycy9uZXQvM2M1MDMuYwpAQCAtMTc3LDYgKzE3Nyw3IEBACiAJLm5kb19nZXRfc3RhdHMJCT0gZWlwX2dldF9zdGF0cywKIAkubmRvX3NldF9tdWx0aWNhc3RfbGlzdCA9IGVpcF9zZXRfbXVsdGljYXN0X2xpc3QsCiAJLm5kb192YWxpZGF0ZV9hZGRyCT0gZXRoX3ZhbGlkYXRlX2FkZHIsCisJLm5kb19zZXRfbWFjX2FkZHJlc3MgCT0gZXRoX21hY19hZGRyLAogCS5uZG9fY2hhbmdlX210dQkJPSBldGhfY2hhbmdlX210dSwKICNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgogCS5uZG9fcG9sbF9jb250cm9sbGVyIAk9IGVpcF9wb2xsLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvM2M1OXguYyBiL2RyaXZlcnMvbmV0LzNjNTl4LmMKaW5kZXggNjY1ZTdmZC4uY2RiYmI2MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvM2M1OXguYworKysgYi9kcml2ZXJzL25ldC8zYzU5eC5jCkBAIC0zMTA5LDYgKzMxMDksOCBAQAogCXN0cnVjdCB2b3J0ZXhfcHJpdmF0ZSAqdnAgPSBuZXRkZXZfcHJpdihkZXYpOwogCXZvaWQgX19pb21lbSAqaW9hZGRyID0gdnAtPmlvYWRkcjsKIAorCWRldmljZV9zZXRfd2FrZXVwX2VuYWJsZSh2cC0+Z2VuZGV2LCB2cC0+ZW5hYmxlX3dvbCk7CisKIAlpZiAodnAtPmVuYWJsZV93b2wpIHsKIAkJLyogUG93ZXIgdXAgb246IDE9PURvd25sb2FkZWQgRmlsdGVyLCAyPT1NYWdpYyBQYWNrZXRzLCA0PT1MaW5rIFN0YXR1cy4gKi8KIAkJRUwzV0lORE9XKDcpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvODEzOWNwLmMgYi9kcml2ZXJzL25ldC84MTM5Y3AuYwppbmRleCBkZDdhYzgyLi40ZTE5YWUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC84MTM5Y3AuYworKysgYi9kcml2ZXJzL25ldC84MTM5Y3AuYwpAQCAtMTgyMSw2ICsxODIxLDcgQEAKIAkubmRvX29wZW4JCT0gY3Bfb3BlbiwKIAkubmRvX3N0b3AJCT0gY3BfY2xvc2UsCiAJLm5kb192YWxpZGF0ZV9hZGRyCT0gZXRoX3ZhbGlkYXRlX2FkZHIsCisJLm5kb19zZXRfbWFjX2FkZHJlc3MgCT0gZXRoX21hY19hZGRyLAogCS5uZG9fc2V0X211bHRpY2FzdF9saXN0CT0gY3Bfc2V0X3J4X21vZGUsCiAJLm5kb19nZXRfc3RhdHMJCT0gY3BfZ2V0X3N0YXRzLAogCS5uZG9fZG9faW9jdGwJCT0gY3BfaW9jdGwsCkBAIC0xODMyLDYgKzE4MzMsNyBAQAogI2lmZGVmIEJST0tFTgogCS5uZG9fY2hhbmdlX210dQkJPSBjcF9jaGFuZ2VfbXR1LAogI2VuZGlmCisKICNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgogCS5uZG9fcG9sbF9jb250cm9sbGVyCT0gY3BfcG9sbF9jb250cm9sbGVyLAogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC84MTM5dG9vLmMgYi9kcml2ZXJzL25ldC84MTM5dG9vLmMKaW5kZXggZmUzNzBmOC4uYTViMjQyMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvODEzOXRvby5jCisrKyBiL2RyaXZlcnMvbmV0LzgxMzl0b28uYwpAQCAtOTE3LDYgKzkxNyw3IEBACiAJLm5kb19zdG9wCQk9IHJ0bDgxMzlfY2xvc2UsCiAJLm5kb19nZXRfc3RhdHMJCT0gcnRsODEzOV9nZXRfc3RhdHMsCiAJLm5kb192YWxpZGF0ZV9hZGRyCT0gZXRoX3ZhbGlkYXRlX2FkZHIsCisJLm5kb19zZXRfbWFjX2FkZHJlc3MgCT0gZXRoX21hY19hZGRyLAogCS5uZG9fc3RhcnRfeG1pdAkJPSBydGw4MTM5X3N0YXJ0X3htaXQsCiAJLm5kb19zZXRfbXVsdGljYXN0X2xpc3QJPSBydGw4MTM5X3NldF9yeF9tb2RlLAogCS5uZG9fZG9faW9jdGwJCT0gbmV0ZGV2X2lvY3RsLApAQCAtOTI0LDcgKzkyNSw2IEBACiAjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKIAkubmRvX3BvbGxfY29udHJvbGxlcgk9IHJ0bDgxMzlfcG9sbF9jb250cm9sbGVyLAogI2VuZGlmCi0KIH07CiAKIHN0YXRpYyBpbnQgX19kZXZpbml0IHJ0bDgxMzlfaW5pdF9vbmUgKHN0cnVjdCBwY2lfZGV2ICpwZGV2LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvODM5MC5jIGIvZHJpdmVycy9uZXQvODM5MC5jCmluZGV4IGZiZTYwOWEuLmVjM2UyMmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0LzgzOTAuYworKysgYi9kcml2ZXJzL25ldC84MzkwLmMKQEAgLTYzLDYgKzYzLDcgQEAKIAkubmRvX2dldF9zdGF0cwkJPSBlaV9nZXRfc3RhdHMsCiAJLm5kb19zZXRfbXVsdGljYXN0X2xpc3QgPSBlaV9zZXRfbXVsdGljYXN0X2xpc3QsCiAJLm5kb192YWxpZGF0ZV9hZGRyCT0gZXRoX3ZhbGlkYXRlX2FkZHIsCisJLm5kb19zZXRfbWFjX2FkZHJlc3MgCT0gZXRoX21hY19hZGRyLAogCS5uZG9fY2hhbmdlX210dQkJPSBldGhfY2hhbmdlX210dSwKICNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgogCS5uZG9fcG9sbF9jb250cm9sbGVyCT0gZWlfcG9sbCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0LzgzOTBwLmMgYi9kcml2ZXJzL25ldC84MzkwcC5jCmluZGV4IGVlNzBiMzUuLmRhODYzYzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0LzgzOTBwLmMKKysrIGIvZHJpdmVycy9uZXQvODM5MHAuYwpAQCAtNjgsNiArNjgsNyBAQAogCS5uZG9fZ2V0X3N0YXRzCQk9IGVpcF9nZXRfc3RhdHMsCiAJLm5kb19zZXRfbXVsdGljYXN0X2xpc3QgPSBlaXBfc2V0X211bHRpY2FzdF9saXN0LAogCS5uZG9fdmFsaWRhdGVfYWRkcgk9IGV0aF92YWxpZGF0ZV9hZGRyLAorCS5uZG9fc2V0X21hY19hZGRyZXNzIAk9IGV0aF9tYWNfYWRkciwKIAkubmRvX2NoYW5nZV9tdHUJCT0gZXRoX2NoYW5nZV9tdHUsCiAjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKIAkubmRvX3BvbGxfY29udHJvbGxlcgk9IGVpcF9wb2xsLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvS2NvbmZpZyBiL2RyaXZlcnMvbmV0L0tjb25maWcKaW5kZXggOWExODI3MC4uOWZlOGNiNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvS2NvbmZpZworKysgYi9kcml2ZXJzL25ldC9LY29uZmlnCkBAIC04MzAsNyArODMwLDcgQEAKIAogY29uZmlnIEJGSU5fTUFDCiAJdHJpc3RhdGUgIkJsYWNrZmluIG9uLWNoaXAgTUFDIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBORVRfRVRIRVJORVQgJiYgKEJGNTI2IHx8IEJGNTI3IHx8IEJGNTM2IHx8IEJGNTM3KQorCWRlcGVuZHMgb24gTkVUX0VUSEVSTkVUICYmIChCRjUxNiB8fCBCRjUxOCB8fCBCRjUyNiB8fCBCRjUyNyB8fCBCRjUzNiB8fCBCRjUzNykKIAlzZWxlY3QgQ1JDMzIKIAlzZWxlY3QgTUlJCiAJc2VsZWN0IFBIWUxJQgpAQCAtMTYwMCw3ICsxNjAwLDcgQEAKIAkgIG9sZCBSWC1yZXNldCBiZWhhdmlvci4gIElmIHVuc3VyZSwgc2F5IE4uCiAKIGNvbmZpZyBSNjA0MAotCXRyaXN0YXRlICJSREMgUjYwNDAgRmFzdCBFdGhlcm5ldCBBZGFwdGVyIHN1cHBvcnQgKEVYUEVSSU1FTlRBTCkiCisJdHJpc3RhdGUgIlJEQyBSNjA0MCBGYXN0IEV0aGVybmV0IEFkYXB0ZXIgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIE5FVF9QQ0kgJiYgUENJCiAJc2VsZWN0IENSQzMyCiAJc2VsZWN0IE1JSQpAQCAtMjYxNCw2ICsyNjE0LDggQEAKIAogc291cmNlICJkcml2ZXJzL25ldC93aXJlbGVzcy9LY29uZmlnIgogCitzb3VyY2UgImRyaXZlcnMvbmV0L3dpbWF4L0tjb25maWciCisKIHNvdXJjZSAiZHJpdmVycy9uZXQvdXNiL0tjb25maWciCiAKIHNvdXJjZSAiZHJpdmVycy9uZXQvcGNtY2lhL0tjb25maWciCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9NYWtlZmlsZSBiL2RyaXZlcnMvbmV0L01ha2VmaWxlCmluZGV4IGU1YzM0YjQuLmEzYzVjMDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbmV0L01ha2VmaWxlCkBAIC0yNjMsMyArMjYzLDQgQEAKIG9iai0kKENPTkZJR19WSVJUSU9fTkVUKSArPSB2aXJ0aW9fbmV0Lm8KIG9iai0kKENPTkZJR19TRkMpICs9IHNmYy8KIAorb2JqLSQoQ09ORklHX1dJTUFYKSArPSB3aW1heC8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2FjZW5pYy5jIGIvZHJpdmVycy9uZXQvYWNlbmljLmMKaW5kZXggNWIzOTZmZi4uOTU4OWQ2MjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2FjZW5pYy5jCisrKyBiL2RyaXZlcnMvbmV0L2FjZW5pYy5jCkBAIC00NjAsNiArNDYwLDcgQEAKIAkubmRvX2dldF9zdGF0cwkJPSBhY2VfZ2V0X3N0YXRzLAogCS5uZG9fc3RhcnRfeG1pdAkJPSBhY2Vfc3RhcnRfeG1pdCwKIAkubmRvX3NldF9tdWx0aWNhc3RfbGlzdAk9IGFjZV9zZXRfbXVsdGljYXN0X2xpc3QsCisJLm5kb192YWxpZGF0ZV9hZGRyCT0gZXRoX3ZhbGlkYXRlX2FkZHIsCiAJLm5kb19zZXRfbWFjX2FkZHJlc3MJPSBhY2Vfc2V0X21hY19hZGRyLAogCS5uZG9fY2hhbmdlX210dQkJPSBhY2VfY2hhbmdlX210dSwKICNpZiBBQ0VOSUNfRE9fVkxBTgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYWNlbmljX2Zpcm13YXJlLmggYi9kcml2ZXJzL25ldC9hY2VuaWNfZmlybXdhcmUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQ0MWY3OC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL25ldC9hY2VuaWNfZmlybXdhcmUuaAorKysgL2Rldi9udWxsCkBAIC0xLDk0NTYgKzAsMCBAQAotLyoKLSAqIERlY2xhcmUgdGhlc2UgaGVyZSBldmVuIGlmIFRpZ29uIEkgc3VwcG9ydCBpcyBkaXNhYmxlZCB0byBhdm9pZAotICogdGhlIGNvbXBpbGVyIGNvbXBsYWluaW5nIGFib3V0IHVuZGVmaW5lZCBzeW1ib2xzLgotICovCi0jZGVmaW5lIHRpZ29uRndSZWxlYXNlTWFqb3IgMHhjCi0jZGVmaW5lIHRpZ29uRndSZWxlYXNlTWlub3IgMHg0Ci0jZGVmaW5lIHRpZ29uRndSZWxlYXNlRml4IDB4YgotI2RlZmluZSB0aWdvbkZ3U3RhcnRBZGRyIDB4MDAwMDQwMDAKLSNkZWZpbmUgdGlnb25Gd1RleHRBZGRyIDB4MDAwMDQwMDAKLSNkZWZpbmUgdGlnb25Gd1RleHRMZW4gMHgxMTE0MAotI2RlZmluZSB0aWdvbkZ3Um9kYXRhQWRkciAweDAwMDE1MTQwCi0jZGVmaW5lIHRpZ29uRndSb2RhdGFMZW4gMHhhYzAKLSNkZWZpbmUgdGlnb25Gd0RhdGFBZGRyIDB4MDAwMTVjMjAKLSNkZWZpbmUgdGlnb25Gd0RhdGFMZW4gMHgxNzAKLSNkZWZpbmUgdGlnb25Gd1Nic3NBZGRyIDB4MDAwMTVkOTAKLSNkZWZpbmUgdGlnb25Gd1Nic3NMZW4gMHgzOAotI2RlZmluZSB0aWdvbkZ3QnNzQWRkciAweDAwMDE1ZGQwCi0jZGVmaW5lIHRpZ29uRndCc3NMZW4gMHgyMDgwCi0jaWZkZWYgQ09ORklHX0FDRU5JQ19PTUlUX1RJR09OX0kKLSNkZWZpbmUgdGlnb25Gd1RleHQgTlVMTAotI2RlZmluZSB0aWdvbkZ3RGF0YSBOVUxMCi0jZGVmaW5lIHRpZ29uRndSb2RhdGEgTlVMTAotI2Vsc2UKLS8qIEdlbmVyYXRlZCBieSBnZW5mdy5jICovCi1zdGF0aWMgdTMyIHRpZ29uRndUZXh0WyhNQVhfVEVYVF9MRU4vNCkgKyAxXSBfX2RldmluaXRkYXRhID0gewotMHgxMDAwMDAwMywKLTB4MCwgMHhkLCAweGQsIDB4M2MxZDAwMDEsCi0weDhmYmQ1YzU0LCAweDNhMGYwMjEsIDB4M2MxMDAwMDAsIDB4MjYxMDQwMDAsCi0weGMwMDEwMGMsIDB4MCwgMHhkLCAweDI3YmRmZmQ4LAotMHgzYzFjYzAwMCwgMHgzYzFiMDAxMywgMHgzNzdiZDgwMCwgMHhkMDIxLAotMHgzYzE3MDAxMywgMHgzNmY3NTQxOCwgMHgyZTAyMDIxLCAweDM0MDU4M2U4LAotMHhhZmJmMDAyNCwgMHhjMDAyNDg4LCAweGFmYjAwMDIwLCAweGMwMDIzZTgsCi0weDAsIDB4M2MwNDAwMDEsIDB4MjQ4NDUxYTQsIDB4MjQwNTAwMDEsCi0weDJlMDMwMjEsIDB4MzgyMSwgMHgzYzEwMDAwMSwgMHgyNjEwN2U1MCwKLTB4YWZiMDAwMTAsIDB4YzAwMjQwMywgMHhhZmJiMDAxNCwgMHgzYzAyMDAwZiwKLTB4MzQ0MmZmZmYsIDB4MjAyMTAyNCwgMHgzNjIxMDJiLCAweDEwNDAwMDA5LAotMHgyNDA1MDAwMywgMHgzYzA0MDAwMSwgMHgyNDg0NTFiMCwgMHgyMDAzMDIxLAotMHgzNjAzODIxLCAweDNjMDIwMDEwLCAweGFmYTIwMDEwLCAweGMwMDI0MDMsCi0weGFmYTAwMDE0LCAweDIwMjEsIDB4MzQwNWMwMDAsIDB4M2MwMTAwMDEsCi0weDM3MDgyMSwgMHhhMDIwODNiMCwgMHgzYzAxMDAwMSwgMHgzNzA4MjEsCi0weGEwMjA4M2IyLCAweDNjMDEwMDAxLCAweDM3MDgyMSwgMHhhMDIwODNiMywKLTB4M2MwMTAwMDEsIDB4MzcwODIxLCAweGFjMjA4M2I0LCAweGEyZTAwNGQ4LAotMHg0MThjMCwgMHgyNDg0MDAwMSwgMHg3NzEwMjEsIDB4YWM0MDcyN2MsCi0weDc3MTAyMSwgMHhhYzQwNzI4MCwgMHgyZTMxMDIxLCAweGE0NDU3MjdjLAotMHgyYzgyMDAyMCwgMHgxNDQwZmZmNywgMHg0MThjMCwgMHgyMDIxLAotMHgzNDA1YzAwMCwgMHg0MThjMCwgMHgyNDg0MDAwMSwgMHg3NzEwMjEsCi0weGFjNDA3MzdjLCAweDc3MTAyMSwgMHhhYzQwNzM4MCwgMHgyZTMxMDIxLAotMHhhNDQ1NzM3YywgMHgyYzgyMDA4MCwgMHg1NDQwZmZmNywgMHg0MThjMCwKLTB4YWY4MDAwNTQsIDB4YWY4MDAxMWMsIDB4OGY4MjAwNDQsIDB4MzQ0MjAwNDAsCi0weGFmODIwMDQ0LCAweDhmODIwMDQ0LCAweDM0NDIwMDIwLCAweGFmODIwMDQ0LAotMHg4ZjQyMDIxOCwgMHgzMDQyMDAwMiwgMHgxMDQwMDAwOSwgMHgwLAotMHg4ZjQyMDIyMCwgMHgzYzAzMDAwMiwgMHgzNDYzMDAwNCwgMHg0MzEwMjUsCi0weGFlZTIwNGM0LCAweDhmNDIwMjFjLCAweDgwMDEwNzQsIDB4MzQ0MjAwMDQsCi0weDhmNDIwMjIwLCAweDNjMDMwMDAyLCAweDM0NjMwMDA2LCAweDQzMTAyNSwKLTB4YWVlMjA0YzQsIDB4OGY0MjAyMWMsIDB4MzQ0MjAwMDYsIDB4YWVlMjA0Y2MsCi0weDhmNDIwMjE4LCAweDMwNDIwMDEwLCAweDEwNDAwMDBhLCAweDAsCi0weDhmNDIwMjFjLCAweDM0NDIwMDA0LCAweGFlZTIwNGM4LCAweDhmNDIwMjIwLAotMHgzYzAzMDAwYSwgMHgzNDYzMDAwNCwgMHg0MzEwMjUsIDB4ODAwMTA4YSwKLTB4YWVlMjA0YzAsIDB4OGY0MjAyMjAsIDB4M2MwMzAwMGEsIDB4MzQ2MzAwMDYsCi0weDQzMTAyNSwgMHhhZWUyMDRjMCwgMHg4ZjQyMDIxYywgMHgzNDQyMDAwNiwKLTB4YWVlMjA0YzgsIDB4OGY0MjAyMTgsIDB4MzA0MjAyMDAsIDB4MTA0MDAwMDMsCi0weDI0MDIwMDAxLCAweDgwMDEwOTEsIDB4YTJlMjcyNDgsIDB4YTJlMDcyNDgsCi0weDI0MDIwMDAxLCAweGFmODIwMGEwLCAweGFmODIwMGIwLCAweDhmODMwMDU0LAotMHg4ZjgyMDA1NCwgMHg4MDAxMDk5LCAweDI0NjMwMDY0LCAweDhmODIwMDU0LAotMHg2MjEwMjMsIDB4MmM0MjAwNjUsIDB4MTQ0MGZmZmMsIDB4MCwKLTB4YWY4MDAwNDQsIDB4OGY0MjAyMDgsIDB4OGY0MzAyMGMsIDB4YWVlMjAwMTAsCi0weGFlZTMwMDE0LCAweDhlZTQwMDEwLCAweDhlZTUwMDE0LCAweDI2ZTIwMDMwLAotMHhhZWUyMDAyOCwgMHgyNDAyMDQ5MCwgMHhhZWUyMDAxOCwgMHhhZjg0MDA5MCwKLTB4YWY4NTAwOTQsIDB4OGVlMjAwMjgsIDB4YWY4MjAwYjQsIDB4OTZlMjAwMWEsCi0weGFmODIwMDljLCAweDhmODIwMGIwLCAweDhlZTMwNGNjLCAweDQzMTAyNSwKLTB4YWY4MjAwYjAsIDB4OGY4MjAwYjAsIDB4MzA0MjAwMDQsIDB4MTQ0MGZmZmQsCi0weDAsIDB4OGVlMjA0NTAsIDB4OGVlMzA0NTQsIDB4YWVlMzA0ZmMsCi0weDhlZTIwNGZjLCAweDI0NDJlMDAwLCAweDJjNDIyMDAxLCAweDE0NDAwMDBkLAotMHgyNmU0MDAzMCwgMHg4ZWUyMDQ1MCwgMHg4ZWUzMDQ1NCwgMHgzYzA0MDAwMSwKLTB4MjQ4NDUxYmMsIDB4M2MwNTAwMDEsIDB4YWZhMDAwMTAsIDB4YWZhMDAwMTQsCi0weDhlZTcwNGZjLCAweDM0YTVmMDAwLCAweGMwMDI0MDMsIDB4NjAzMDIxLAotMHgyNmU0MDAzMCwgMHhjMDAyNDg4LCAweDI0MDUwNDAwLCAweDI3NDQwMDgwLAotMHhjMDAyNDg4LCAweDI0MDUwMDgwLCAweDI2ZTQ3NzdjLCAweGMwMDI0ODgsCi0weDI0MDUwNDAwLCAweDhmNDIwMjVjLCAweDI2ZTQwMDk0LCAweGFlZTIwMDYwLAotMHg4ZjQyMDI2MCwgMHgyNzQ1MDIwMCwgMHgyNDA2MDAwOCwgMHhhZWUyMDA2OCwKLTB4MjQwMjAwMDYsIDB4YzAwMjQ5YSwgMHhhZWUyMDA2NCwgMHgzYzAyM2I5YSwKLTB4MzQ0MmNhMDAsIDB4MjAyMSwgMHgyNDAzMDAwMiwgMHhhZWUzMDA3NCwKLTB4YWVlMzAwNzAsIDB4YWVlMjAwNmMsIDB4MjQwMjAzZTgsIDB4YWVlMjAxMDQsCi0weDI0MDIwMDAxLCAweGFlZTMwMTAwLCAweGFlZTIwMTBjLCAweDNjMDMwMDAxLAotMHg2NDE4MjEsIDB4OTA2MzVjMjAsIDB4MmU0MTAyMSwgMHgyNDg0MDAwMSwKLTB4YTA0MzAwOWMsIDB4MmM4MjAwMGYsIDB4MTQ0MGZmZjgsIDB4MCwKLTB4OGY4MjAwNDAsIDB4MmU0MTgyMSwgMHgyNDg0MDAwMSwgMHgyMTcwMiwKLTB4MjQ0MjAwMzAsIDB4YTA2MjAwOWMsIDB4MmU0MTAyMSwgMHhhMDQwMDA5YywKLTB4OTZlMjA0NmEsIDB4MzA0MjAwMDMsIDB4MTQ0MDAwMDksIDB4MCwKLTB4OTZlMjA0N2EsIDB4MzA0MjAwMDMsIDB4NTA0MDAxMzEsIDB4M2MwMzA4MDAsCi0weDk2ZTIwNDZhLCAweDMwNDIwMDAzLCAweDEwNDAwMDJhLCAweDNjMDIwNzAwLAotMHg5NmUyMDQ3YSwgMHgzMDQyMDAwMywgMHgxMDQwMDAyNiwgMHgzYzAyMDcwMCwKLTB4OTZlMzA0N2EsIDB4OTZlMjA0NmEsIDB4MTQ2MjAwMjIsIDB4M2MwMjA3MDAsCi0weDhlZTIwNGMwLCAweDI0MDMwMDAxLCAweGEyZTM0ZTIwLCAweDM0NDIwZTAwLAotMHhhZWUyMDRjMCwgMHg4ZjQyMDIxOCwgMHgzMDQyMDEwMCwgMHgxMDQwMDAwNSwKLTB4MCwgMHgzYzAyMDAwMSwgMHgyNDQyZTE2OCwgMHg4MDAxMTFkLAotMHgyMTEwMCwgMHgzYzAyMDAwMSwgMHgyNDQyZDM1YywgMHgyMTEwMCwKLTB4MjExODIsIDB4M2MwMzA4MDAsIDB4NDMxMDI1LCAweDNjMDEwMDAxLAotMHhhYzIyMTIzOCwgMHgzYzAyMDAwMSwgMHgyNDQyZjY4MCwgMHgyMTEwMCwKLTB4MjExODIsIDB4M2MwMzA4MDAsIDB4NDMxMDI1LCAweDNjMDEwMDAxLAotMHhhYzIyMTI3OCwgMHg4ZWUyMDAwMCwgMHgzNDQyNDAwMCwgMHg4MDAxMjM4LAotMHhhZWUyMDAwMCwgMHgzNDQyMzAwMCwgMHhhZmEyMDAxOCwgMHg4ZWUyMDYwOCwKLTB4OGY0MzAyMjgsIDB4MjQ0MjAwMDEsIDB4MzA0OTAwZmYsIDB4NTEyMzAwZTIsCi0weGFmYTAwMDEwLCAweDhlZTIwNjA4LCAweDIxMGMwLCAweDU3MTAyMSwKLTB4OGZhMzAwMTgsIDB4OGZhNDAwMWMsIDB4YWM0MzA2MGMsIDB4YWM0NDA2MTAsCi0weDhmODcwMTIwLCAweDI3NjIzODAwLCAweDI0ZTgwMDIwLCAweDEwMjEwMmIsCi0weDUwNDAwMDAxLCAweDI3NjgzMDAwLCAweDhmODIwMTI4LCAweDExMDIwMDA0LAotMHgwLCAweDhmODIwMTI0LCAweDE1MDIwMDA3LCAweDEwMjEsCi0weDhlZTIwMWE0LCAweDMwMjEsIDB4MjQ0MjAwMDEsIDB4YWVlMjAxYTQsCi0weDgwMDExYTAsIDB4OGVlMjAxYTQsIDB4OGVlNDA2MDgsIDB4NDIwYzAsCi0weDgwMTgyMSwgMHg4ZWU0MDQzMCwgMHg4ZWU1MDQzNCwgMHhhMzI4MjEsCi0weGEzMzAyYiwgMHg4MjIwMjEsIDB4ODYyMDIxLCAweGFjZTQwMDAwLAotMHhhY2U1MDAwNCwgMHg4ZWUzMDYwOCwgMHgyNDAyMDAwOCwgMHhhNGUyMDAwZSwKLTB4MjQwMjAwMGQsIDB4YWNlMjAwMTgsIDB4YWNlOTAwMWMsIDB4MzE4YzAsCi0weDI0NjMwNjBjLCAweDJlMzEwMjEsIDB4YWNlMjAwMDgsIDB4OGVlMjA0YzQsCi0weGFjZTIwMDEwLCAweGFmODgwMTIwLCAweDkyZTI0ZTIwLCAweDE0NDAwMDM3LAotMHgyNDA2MDAwMSwgMHg4ZWUyNGUzMCwgMHgyMTBjMCwgMHgyNDQyNTAzOCwKLTB4MmUyMjAyMSwgMHg4YzgzMDAwMCwgMHgyNDAyMDAwNywgMHgxNDYyMDAxZiwKLTB4MCwgMHg4ZWUzNGUzMCwgMHg4ZWUyNGUzNCwgMHgxMDYyMDAxYiwKLTB4MjQwMzAwNDAsIDB4OGM4MjAwMDQsIDB4MjQ0MjAwMDEsIDB4YWM4MjAwMDQsCi0weDhlZTI0ZTM0LCAweDhlZTU0ZTMwLCAweDI0NDIwMDAxLCAweDEwNDMwMDA3LAotMHgwLCAweDhlZTI0ZTM0LCAweDI0NDIwMDAxLCAweDEwYTIwMDA1LAotMHgwLCAweDgwMDExOGEsIDB4MCwgMHgxNGEwMDAwNSwKLTB4MCwgMHg4ZjgyMDEyOCwgMHgyNDQyMDAyMCwgMHhhZjgyMDEyOCwKLTB4OGY4MjAxMjgsIDB4OGM4MjAwMDQsIDB4MmM0MjAwMTEsIDB4NTA0MDAwMTMsCi0weGFjODAwMDAwLCAweDgwMDExYTAsIDB4MCwgMHg4ZWUyNGUzMCwKLTB4MjQwMzAwNDAsIDB4MjQ0MjAwMDEsIDB4NTA0MzAwMDMsIDB4MTAyMSwKLTB4OGVlMjRlMzAsIDB4MjQ0MjAwMDEsIDB4YWVlMjRlMzAsIDB4OGVlMjRlMzAsCi0weDIxMGMwLCAweDI0NDI1MDM4LCAweDJlMjIwMjEsIDB4MjQwMjAwMDcsCi0weGFjODIwMDAwLCAweDI0MDIwMDAxLCAweGFjODIwMDA0LCAweDU0YzAwMDBjLAotMHhhZWU5MDYwOCwgMHgzYzA0MDAwMSwgMHgyNDg0NTFjOCwgMHhhZmEwMDAxMCwKLTB4YWZhMDAwMTQsIDB4OGVlNjA2MDgsIDB4OGY0NzAyMjgsIDB4M2MwNTAwMDksCi0weGMwMDI0MDMsIDB4MzRhNWYwMDAsIDB4ODAwMTIyMywgMHgwLAotMHg4ZjgzMDEyMCwgMHgyNzYyMzgwMCwgMHgyNDY2MDAyMCwgMHhjMjEwMmIsCi0weDUwNDAwMDAxLCAweDI3NjYzMDAwLCAweDhmODIwMTI4LCAweDEwYzIwMDA0LAotMHgwLCAweDhmODIwMTI0LCAweDE0YzIwMDA3LCAweDAsCi0weDhlZTIwMWE0LCAweDMwMjEsIDB4MjQ0MjAwMDEsIDB4YWVlMjAxYTQsCi0weDgwMDEyMDcsIDB4OGVlMjAxYTQsIDB4OGVlMjA2MDgsIDB4YWM2MjAwMWMsCi0weDhlZTQwNGEwLCAweDhlZTUwNGE0LCAweDI0NjIwMDFjLCAweGFjNjIwMDA4LAotMHgyNDAyMDAwOCwgMHhhNDYyMDAwZSwgMHgyNDAyMDAxMSwgMHhhYzYyMDAxOCwKLTB4YWM2NDAwMDAsIDB4YWM2NTAwMDQsIDB4OGVlMjA0YzQsIDB4YWM2MjAwMTAsCi0weGFmODYwMTIwLCAweDkyZTI0ZTIwLCAweDE0NDAwMDM3LCAweDI0MDYwMDAxLAotMHg4ZWUyNGUzMCwgMHgyMTBjMCwgMHgyNDQyNTAzOCwgMHgyZTIyMDIxLAotMHg4YzgzMDAwMCwgMHgyNDAyMDAxMiwgMHgxNDYyMDAxZiwgMHgwLAotMHg4ZWUzNGUzMCwgMHg4ZWUyNGUzNCwgMHgxMDYyMDAxYiwgMHgyNDAzMDA0MCwKLTB4OGM4MjAwMDQsIDB4MjQ0MjAwMDEsIDB4YWM4MjAwMDQsIDB4OGVlMjRlMzQsCi0weDhlZTU0ZTMwLCAweDI0NDIwMDAxLCAweDEwNDMwMDA3LCAweDAsCi0weDhlZTI0ZTM0LCAweDI0NDIwMDAxLCAweDEwYTIwMDA1LCAweDAsCi0weDgwMDExZjEsIDB4MCwgMHgxNGEwMDAwNSwgMHgwLAotMHg4ZjgyMDEyOCwgMHgyNDQyMDAyMCwgMHhhZjgyMDEyOCwgMHg4ZjgyMDEyOCwKLTB4OGM4MjAwMDQsIDB4MmM0MjAwMTEsIDB4NTA0MDAwMTMsIDB4YWM4MDAwMDAsCi0weDgwMDEyMDcsIDB4MCwgMHg4ZWUyNGUzMCwgMHgyNDAzMDA0MCwKLTB4MjQ0MjAwMDEsIDB4NTA0MzAwMDMsIDB4MTAyMSwgMHg4ZWUyNGUzMCwKLTB4MjQ0MjAwMDEsIDB4YWVlMjRlMzAsIDB4OGVlMjRlMzAsIDB4MjEwYzAsCi0weDI0NDI1MDM4LCAweDJlMjIwMjEsIDB4MjQwMjAwMTIsIDB4YWM4MjAwMDAsCi0weDI0MDIwMDAxLCAweGFjODIwMDA0LCAweDE0YzAwMDFiLCAweDAsCi0weDNjMDQwMDAxLCAweDI0ODQ1MWQwLCAweGFmYTAwMDEwLCAweGFmYTAwMDE0LAotMHg4ZWU2MDYwOCwgMHg4ZjQ3MDIyOCwgMHgzYzA1MDAwOSwgMHhjMDAyNDAzLAotMHgzNGE1ZjAwMSwgMHg4ZWUyMDFiMCwgMHgyNDQyMDAwMSwgMHhhZWUyMDFiMCwKLTB4ODAwMTIyMywgMHg4ZWUyMDFiMCwgMHgzYzA0MDAwMSwgMHgyNDg0NTFkYywKLTB4YWZhMDAwMTQsIDB4OGVlNjA2MDgsIDB4OGY0NzAyMjgsIDB4M2MwNTAwMDksCi0weGMwMDI0MDMsIDB4MzRhNWYwMDUsIDB4OGVlMjAxYWMsIDB4MjQ0MjAwMDEsCi0weGFlZTIwMWFjLCAweDhlZTIwMWFjLCAweDhlZTIwMTYwLCAweDNjMDQwMDAxLAotMHgyNDg0NTFlOCwgMHgzNDA1ZjAwMSwgMHgyNDQyMDAwMSwgMHhhZWUyMDE2MCwKLTB4OGVlMjAxNjAsIDB4MzAyMSwgMHgzODIxLCAweGFmYTAwMDEwLAotMHhjMDAyNDAzLCAweGFmYTAwMDE0LCAweDgwMDEyMzgsIDB4MCwKLTB4M2MwMjAwMDEsIDB4MjQ0MmY1YTgsIDB4MjExMDAsIDB4MjExODIsCi0weDQzMTAyNSwgMHgzYzAxMDAwMSwgMHhhYzIyMTI3OCwgMHg5NmUyMDQ1YSwKLTB4MzA0MjAwMDMsIDB4MTA0MDAwMjUsIDB4M2MwNTBmZmYsIDB4OGVlMjA0YzgsCi0weDM0YTVmZmZmLCAweDM0NDIwYTAwLCAweGFlZTIwNGM4LCAweDhlZTMwNGM4LAotMHgzYzA0MDAwMSwgMHgyNDg0NTFmNCwgMHgyNDAyMDAwMSwgMHhhMmUyMDRlYywKLTB4YTJlMjA0ZWQsIDB4M2MwMjAwMDIsIDB4NjIxODI1LCAweDNjMDIwMDAxLAotMHgyNDQyYTM5MCwgMHg0NTEwMjQsIDB4MjEwODIsIDB4YWVlMzA0YzgsCi0weDNjMDMwODAwLCAweDQzMTAyNSwgMHgzYzAxMDAwMSwgMHhhYzIyMTIyMCwKLTB4M2MwMjAwMDEsIDB4MjQ0MmFkZDQsIDB4NDUxMDI0LCAweDIxMDgyLAotMHg0MzEwMjUsIDB4M2MwMTAwMDEsIDB4YWMyMjEyODAsIDB4OTZlNjA0NWEsCi0weDM4MjEsIDB4MjQwNTAwMTEsIDB4YWZhMDAwMTAsIDB4YzAwMjQwMywKLTB4YWZhMDAwMTQsIDB4ODAwMTI2OCwgMHgwLCAweDNjMDIwMDAxLAotMHgyNDQyYTlkNCwgMHgyMTEwMCwgMHgyMTE4MiwgMHgzYzAzMDgwMCwKLTB4NDMxMDI1LCAweDNjMDEwMDAxLCAweGFjMjIxMjgwLCAweDk2ZTIwNDZhLAotMHgzMDQyMDAxMCwgMHgxNDQwMDAwOSwgMHgwLCAweDk2ZTIwNDdhLAotMHgzMDQyMDAxMCwgMHgxMDQwMDExMiwgMHgwLCAweDk2ZTIwNDZhLAotMHgzMDQyMDAxMCwgMHgxMDQwMDAwNSwgMHgzYzAyMDcwMCwgMHg5NmUyMDQ3YSwKLTB4MzA0MjAwMTAsIDB4MTQ0MDAxMDIsIDB4M2MwMjA3MDAsIDB4MzQ0MjMwMDAsCi0weGFmYTIwMDE4LCAweDhlZTIwNjA4LCAweDhmNDMwMjI4LCAweDI0NDIwMDAxLAotMHgzMDQ5MDBmZiwgMHg1MTIzMDBlMiwgMHhhZmEwMDAxMCwgMHg4ZWUyMDYwOCwKLTB4MjEwYzAsIDB4NTcxMDIxLCAweDhmYTMwMDE4LCAweDhmYTQwMDFjLAotMHhhYzQzMDYwYywgMHhhYzQ0MDYxMCwgMHg4Zjg3MDEyMCwgMHgyNzYyMzgwMCwKLTB4MjRlODAwMjAsIDB4MTAyMTAyYiwgMHg1MDQwMDAwMSwgMHgyNzY4MzAwMCwKLTB4OGY4MjAxMjgsIDB4MTEwMjAwMDQsIDB4MCwgMHg4ZjgyMDEyNCwKLTB4MTUwMjAwMDcsIDB4MTAyMSwgMHg4ZWUyMDFhNCwgMHgzMDIxLAotMHgyNDQyMDAwMSwgMHhhZWUyMDFhNCwgMHg4MDAxMmVhLCAweDhlZTIwMWE0LAotMHg4ZWU0MDYwOCwgMHg0MjBjMCwgMHg4MDE4MjEsIDB4OGVlNDA0MzAsCi0weDhlZTUwNDM0LCAweGEzMjgyMSwgMHhhMzMwMmIsIDB4ODIyMDIxLAotMHg4NjIwMjEsIDB4YWNlNDAwMDAsIDB4YWNlNTAwMDQsIDB4OGVlMzA2MDgsCi0weDI0MDIwMDA4LCAweGE0ZTIwMDBlLCAweDI0MDIwMDBkLCAweGFjZTIwMDE4LAotMHhhY2U5MDAxYywgMHgzMThjMCwgMHgyNDYzMDYwYywgMHgyZTMxMDIxLAotMHhhY2UyMDAwOCwgMHg4ZWUyMDRjNCwgMHhhY2UyMDAxMCwgMHhhZjg4MDEyMCwKLTB4OTJlMjRlMjAsIDB4MTQ0MDAwMzcsIDB4MjQwNjAwMDEsIDB4OGVlMjRlMzAsCi0weDIxMGMwLCAweDI0NDI1MDM4LCAweDJlMjIwMjEsIDB4OGM4MzAwMDAsCi0weDI0MDIwMDA3LCAweDE0NjIwMDFmLCAweDAsIDB4OGVlMzRlMzAsCi0weDhlZTI0ZTM0LCAweDEwNjIwMDFiLCAweDI0MDMwMDQwLCAweDhjODIwMDA0LAotMHgyNDQyMDAwMSwgMHhhYzgyMDAwNCwgMHg4ZWUyNGUzNCwgMHg4ZWU1NGUzMCwKLTB4MjQ0MjAwMDEsIDB4MTA0MzAwMDcsIDB4MCwgMHg4ZWUyNGUzNCwKLTB4MjQ0MjAwMDEsIDB4MTBhMjAwMDUsIDB4MCwgMHg4MDAxMmQ0LAotMHgwLCAweDE0YTAwMDA1LCAweDAsIDB4OGY4MjAxMjgsCi0weDI0NDIwMDIwLCAweGFmODIwMTI4LCAweDhmODIwMTI4LCAweDhjODIwMDA0LAotMHgyYzQyMDAxMSwgMHg1MDQwMDAxMywgMHhhYzgwMDAwMCwgMHg4MDAxMmVhLAotMHgwLCAweDhlZTI0ZTMwLCAweDI0MDMwMDQwLCAweDI0NDIwMDAxLAotMHg1MDQzMDAwMywgMHgxMDIxLCAweDhlZTI0ZTMwLCAweDI0NDIwMDAxLAotMHhhZWUyNGUzMCwgMHg4ZWUyNGUzMCwgMHgyMTBjMCwgMHgyNDQyNTAzOCwKLTB4MmUyMjAyMSwgMHgyNDAyMDAwNywgMHhhYzgyMDAwMCwgMHgyNDAyMDAwMSwKLTB4YWM4MjAwMDQsIDB4NTRjMDAwMGMsIDB4YWVlOTA2MDgsIDB4M2MwNDAwMDEsCi0weDI0ODQ1MWM4LCAweGFmYTAwMDEwLCAweGFmYTAwMDE0LCAweDhlZTYwNjA4LAotMHg4ZjQ3MDIyOCwgMHgzYzA1MDAwOSwgMHhjMDAyNDAzLCAweDM0YTVmMDAwLAotMHg4MDAxMzZkLCAweDAsIDB4OGY4MzAxMjAsIDB4Mjc2MjM4MDAsCi0weDI0NjYwMDIwLCAweGMyMTAyYiwgMHg1MDQwMDAwMSwgMHgyNzY2MzAwMCwKLTB4OGY4MjAxMjgsIDB4MTBjMjAwMDQsIDB4MCwgMHg4ZjgyMDEyNCwKLTB4MTRjMjAwMDcsIDB4MCwgMHg4ZWUyMDFhNCwgMHgzMDIxLAotMHgyNDQyMDAwMSwgMHhhZWUyMDFhNCwgMHg4MDAxMzUxLCAweDhlZTIwMWE0LAotMHg4ZWUyMDYwOCwgMHhhYzYyMDAxYywgMHg4ZWU0MDRhMCwgMHg4ZWU1MDRhNCwKLTB4MjQ2MjAwMWMsIDB4YWM2MjAwMDgsIDB4MjQwMjAwMDgsIDB4YTQ2MjAwMGUsCi0weDI0MDIwMDExLCAweGFjNjIwMDE4LCAweGFjNjQwMDAwLCAweGFjNjUwMDA0LAotMHg4ZWUyMDRjNCwgMHhhYzYyMDAxMCwgMHhhZjg2MDEyMCwgMHg5MmUyNGUyMCwKLTB4MTQ0MDAwMzcsIDB4MjQwNjAwMDEsIDB4OGVlMjRlMzAsIDB4MjEwYzAsCi0weDI0NDI1MDM4LCAweDJlMjIwMjEsIDB4OGM4MzAwMDAsIDB4MjQwMjAwMTIsCi0weDE0NjIwMDFmLCAweDAsIDB4OGVlMzRlMzAsIDB4OGVlMjRlMzQsCi0weDEwNjIwMDFiLCAweDI0MDMwMDQwLCAweDhjODIwMDA0LCAweDI0NDIwMDAxLAotMHhhYzgyMDAwNCwgMHg4ZWUyNGUzNCwgMHg4ZWU1NGUzMCwgMHgyNDQyMDAwMSwKLTB4MTA0MzAwMDcsIDB4MCwgMHg4ZWUyNGUzNCwgMHgyNDQyMDAwMSwKLTB4MTBhMjAwMDUsIDB4MCwgMHg4MDAxMzNiLCAweDAsCi0weDE0YTAwMDA1LCAweDAsIDB4OGY4MjAxMjgsIDB4MjQ0MjAwMjAsCi0weGFmODIwMTI4LCAweDhmODIwMTI4LCAweDhjODIwMDA0LCAweDJjNDIwMDExLAotMHg1MDQwMDAxMywgMHhhYzgwMDAwMCwgMHg4MDAxMzUxLCAweDAsCi0weDhlZTI0ZTMwLCAweDI0MDMwMDQwLCAweDI0NDIwMDAxLCAweDUwNDMwMDAzLAotMHgxMDIxLCAweDhlZTI0ZTMwLCAweDI0NDIwMDAxLCAweGFlZTI0ZTMwLAotMHg4ZWUyNGUzMCwgMHgyMTBjMCwgMHgyNDQyNTAzOCwgMHgyZTIyMDIxLAotMHgyNDAyMDAxMiwgMHhhYzgyMDAwMCwgMHgyNDAyMDAwMSwgMHhhYzgyMDAwNCwKLTB4MTRjMDAwMWIsIDB4MCwgMHgzYzA0MDAwMSwgMHgyNDg0NTFkMCwKLTB4YWZhMDAwMTAsIDB4YWZhMDAwMTQsIDB4OGVlNjA2MDgsIDB4OGY0NzAyMjgsCi0weDNjMDUwMDA5LCAweGMwMDI0MDMsIDB4MzRhNWYwMDEsIDB4OGVlMjAxYjAsCi0weDI0NDIwMDAxLCAweGFlZTIwMWIwLCAweDgwMDEzNmQsIDB4OGVlMjAxYjAsCi0weDNjMDQwMDAxLCAweDI0ODQ1MWRjLCAweGFmYTAwMDE0LCAweDhlZTYwNjA4LAotMHg4ZjQ3MDIyOCwgMHgzYzA1MDAwOSwgMHhjMDAyNDAzLCAweDM0YTVmMDA1LAotMHg4ZWUyMDFhYywgMHgyNDQyMDAwMSwgMHhhZWUyMDFhYywgMHg4ZWUyMDFhYywKLTB4OGVlMjAxNjAsIDB4M2MwNDAwMDEsIDB4MjQ4NDUxZTgsIDB4MzQwNWYwMDIsCi0weDI0NDIwMDAxLCAweGFlZTIwMTYwLCAweDhlZTIwMTYwLCAweDMwMjEsCi0weDM4MjEsIDB4YWZhMDAwMTAsIDB4YzAwMjQwMywgMHhhZmEwMDAxNCwKLTB4OTZlNjA0N2EsIDB4OTZlNzA0NmEsIDB4M2MwNDAwMDEsIDB4MjQ4NDUyMDAsCi0weDI0MDUwMDEyLCAweGFmYTAwMDEwLCAweGMwMDI0MDMsIDB4YWZhMDAwMTQsCi0weGMwMDQ1MDAsIDB4MCwgMHhjMDAyMzE4LCAweDAsCi0weDNjMDYwMDAxLCAweDM0YzYzODAwLCAweGFlZTAwNjA4LCAweGFmNDAwMjI4LAotMHhhZjQwMDIyYywgMHg5NmUzMDQ1OCwgMHg4ZWU0MDAwMCwgMHgzYzA1MTJkOCwKLTB4MzRhNWMzNTgsIDB4Mjc2MjM4MDAsIDB4YWVlMjcyNTgsIDB4Mjc2MjM4MDAsCi0weGFlZTI3MjYwLCAweDI3NjIzODAwLCAweGFlZTI3MjY0LCAweDM2NjEwMjEsCi0weGFlZTI3MjcwLCAweDI0MDJmZmZmLCAweGFlZTAwNGQ0LCAweGFlZTAwNGUwLAotMHhhZWUwMDRlNCwgMHhhZWUwMDRmMCwgMHhhMmUwMDRmNCwgMHhhZWUwMGUwYywKLTB4YWVlMDBlMTgsIDB4YWVlMDBlMTAsIDB4YWVlMDBlMTQsIDB4YWVlMDBlMWMsCi0weGFlZTA3MjRjLCAweGFlZTA1MjQ0LCAweGFlZTA1MjQwLCAweGFlZTA1MjNjLAotMHhhZWUwNzI1MCwgMHhhZWUwNzI1NCwgMHhhZWUwNzI1YywgMHhhZWUwNzI2OCwKLTB4YWVlMDA0ZDAsIDB4MjQ2M2ZmZmYsIDB4ODUyMDI1LCAweGFlZTMwNGY4LAotMHhhZWU0MDAwMCwgMHhhZjgwMDA2MCwgMHhhZjgyMDA2NCwgMHgzYzAyMDEwMCwKLTB4YWZhMjAwMTgsIDB4OGVlMjA2MDgsIDB4OGY0MzAyMjgsIDB4MjQ0MjAwMDEsCi0weDMwNDkwMGZmLCAweDUxMjMwMGUyLCAweGFmYTAwMDEwLCAweDhlZTIwNjA4LAotMHgyMTBjMCwgMHg1NzEwMjEsIDB4OGZhMzAwMTgsIDB4OGZhNDAwMWMsCi0weGFjNDMwNjBjLCAweGFjNDQwNjEwLCAweDhmODcwMTIwLCAweDI3NjIzODAwLAotMHgyNGU4MDAyMCwgMHgxMDIxMDJiLCAweDUwNDAwMDAxLCAweDI3NjgzMDAwLAotMHg4ZjgyMDEyOCwgMHgxMTAyMDAwNCwgMHgwLCAweDhmODIwMTI0LAotMHgxNTAyMDAwNywgMHgxMDIxLCAweDhlZTIwMWE0LCAweDMwMjEsCi0weDI0NDIwMDAxLCAweGFlZTIwMWE0LCAweDgwMDE0MjIsIDB4OGVlMjAxYTQsCi0weDhlZTQwNjA4LCAweDQyMGMwLCAweDgwMTgyMSwgMHg4ZWU0MDQzMCwKLTB4OGVlNTA0MzQsIDB4YTMyODIxLCAweGEzMzAyYiwgMHg4MjIwMjEsCi0weDg2MjAyMSwgMHhhY2U0MDAwMCwgMHhhY2U1MDAwNCwgMHg4ZWUzMDYwOCwKLTB4MjQwMjAwMDgsIDB4YTRlMjAwMGUsIDB4MjQwMjAwMGQsIDB4YWNlMjAwMTgsCi0weGFjZTkwMDFjLCAweDMxOGMwLCAweDI0NjMwNjBjLCAweDJlMzEwMjEsCi0weGFjZTIwMDA4LCAweDhlZTIwNGM0LCAweGFjZTIwMDEwLCAweGFmODgwMTIwLAotMHg5MmUyNGUyMCwgMHgxNDQwMDAzNywgMHgyNDA2MDAwMSwgMHg4ZWUyNGUzMCwKLTB4MjEwYzAsIDB4MjQ0MjUwMzgsIDB4MmUyMjAyMSwgMHg4YzgzMDAwMCwKLTB4MjQwMjAwMDcsIDB4MTQ2MjAwMWYsIDB4MCwgMHg4ZWUzNGUzMCwKLTB4OGVlMjRlMzQsIDB4MTA2MjAwMWIsIDB4MjQwMzAwNDAsIDB4OGM4MjAwMDQsCi0weDI0NDIwMDAxLCAweGFjODIwMDA0LCAweDhlZTI0ZTM0LCAweDhlZTU0ZTMwLAotMHgyNDQyMDAwMSwgMHgxMDQzMDAwNywgMHgwLCAweDhlZTI0ZTM0LAotMHgyNDQyMDAwMSwgMHgxMGEyMDAwNSwgMHgwLCAweDgwMDE0MGMsCi0weDAsIDB4MTRhMDAwMDUsIDB4MCwgMHg4ZjgyMDEyOCwKLTB4MjQ0MjAwMjAsIDB4YWY4MjAxMjgsIDB4OGY4MjAxMjgsIDB4OGM4MjAwMDQsCi0weDJjNDIwMDExLCAweDUwNDAwMDEzLCAweGFjODAwMDAwLCAweDgwMDE0MjIsCi0weDAsIDB4OGVlMjRlMzAsIDB4MjQwMzAwNDAsIDB4MjQ0MjAwMDEsCi0weDUwNDMwMDAzLCAweDEwMjEsIDB4OGVlMjRlMzAsIDB4MjQ0MjAwMDEsCi0weGFlZTI0ZTMwLCAweDhlZTI0ZTMwLCAweDIxMGMwLCAweDI0NDI1MDM4LAotMHgyZTIyMDIxLCAweDI0MDIwMDA3LCAweGFjODIwMDAwLCAweDI0MDIwMDAxLAotMHhhYzgyMDAwNCwgMHg1NGMwMDAwYywgMHhhZWU5MDYwOCwgMHgzYzA0MDAwMSwKLTB4MjQ4NDUxYzgsIDB4YWZhMDAwMTAsIDB4YWZhMDAwMTQsIDB4OGVlNjA2MDgsCi0weDhmNDcwMjI4LCAweDNjMDUwMDA5LCAweGMwMDI0MDMsIDB4MzRhNWYwMDAsCi0weDgwMDE0YTUsIDB4MCwgMHg4ZjgzMDEyMCwgMHgyNzYyMzgwMCwKLTB4MjQ2NjAwMjAsIDB4YzIxMDJiLCAweDUwNDAwMDAxLCAweDI3NjYzMDAwLAotMHg4ZjgyMDEyOCwgMHgxMGMyMDAwNCwgMHgwLCAweDhmODIwMTI0LAotMHgxNGMyMDAwNywgMHgwLCAweDhlZTIwMWE0LCAweDMwMjEsCi0weDI0NDIwMDAxLCAweGFlZTIwMWE0LCAweDgwMDE0ODksIDB4OGVlMjAxYTQsCi0weDhlZTIwNjA4LCAweGFjNjIwMDFjLCAweDhlZTQwNGEwLCAweDhlZTUwNGE0LAotMHgyNDYyMDAxYywgMHhhYzYyMDAwOCwgMHgyNDAyMDAwOCwgMHhhNDYyMDAwZSwKLTB4MjQwMjAwMTEsIDB4YWM2MjAwMTgsIDB4YWM2NDAwMDAsIDB4YWM2NTAwMDQsCi0weDhlZTIwNGM0LCAweGFjNjIwMDEwLCAweGFmODYwMTIwLCAweDkyZTI0ZTIwLAotMHgxNDQwMDAzNywgMHgyNDA2MDAwMSwgMHg4ZWUyNGUzMCwgMHgyMTBjMCwKLTB4MjQ0MjUwMzgsIDB4MmUyMjAyMSwgMHg4YzgzMDAwMCwgMHgyNDAyMDAxMiwKLTB4MTQ2MjAwMWYsIDB4MCwgMHg4ZWUzNGUzMCwgMHg4ZWUyNGUzNCwKLTB4MTA2MjAwMWIsIDB4MjQwMzAwNDAsIDB4OGM4MjAwMDQsIDB4MjQ0MjAwMDEsCi0weGFjODIwMDA0LCAweDhlZTI0ZTM0LCAweDhlZTU0ZTMwLCAweDI0NDIwMDAxLAotMHgxMDQzMDAwNywgMHgwLCAweDhlZTI0ZTM0LCAweDI0NDIwMDAxLAotMHgxMGEyMDAwNSwgMHgwLCAweDgwMDE0NzMsIDB4MCwKLTB4MTRhMDAwMDUsIDB4MCwgMHg4ZjgyMDEyOCwgMHgyNDQyMDAyMCwKLTB4YWY4MjAxMjgsIDB4OGY4MjAxMjgsIDB4OGM4MjAwMDQsIDB4MmM0MjAwMTEsCi0weDUwNDAwMDEzLCAweGFjODAwMDAwLCAweDgwMDE0ODksIDB4MCwKLTB4OGVlMjRlMzAsIDB4MjQwMzAwNDAsIDB4MjQ0MjAwMDEsIDB4NTA0MzAwMDMsCi0weDEwMjEsIDB4OGVlMjRlMzAsIDB4MjQ0MjAwMDEsIDB4YWVlMjRlMzAsCi0weDhlZTI0ZTMwLCAweDIxMGMwLCAweDI0NDI1MDM4LCAweDJlMjIwMjEsCi0weDI0MDIwMDEyLCAweGFjODIwMDAwLCAweDI0MDIwMDAxLCAweGFjODIwMDA0LAotMHgxNGMwMDAxYiwgMHgwLCAweDNjMDQwMDAxLCAweDI0ODQ1MWQwLAotMHhhZmEwMDAxMCwgMHhhZmEwMDAxNCwgMHg4ZWU2MDYwOCwgMHg4ZjQ3MDIyOCwKLTB4M2MwNTAwMDksIDB4YzAwMjQwMywgMHgzNGE1ZjAwMSwgMHg4ZWUyMDFiMCwKLTB4MjQ0MjAwMDEsIDB4YWVlMjAxYjAsIDB4ODAwMTRhNSwgMHg4ZWUyMDFiMCwKLTB4M2MwNDAwMDEsIDB4MjQ4NDUxZGMsIDB4YWZhMDAwMTQsIDB4OGVlNjA2MDgsCi0weDhmNDcwMjI4LCAweDNjMDUwMDA5LCAweGMwMDI0MDMsIDB4MzRhNWYwMDUsCi0weDhlZTIwMWFjLCAweDI0NDIwMDAxLCAweGFlZTIwMWFjLCAweDhlZTIwMWFjLAotMHg4ZWUyMDE1NCwgMHgyNDQyMDAwMSwgMHhhZWUyMDE1NCwgMHhjMDAxNGRjLAotMHg4ZWUyMDE1NCwgMHg4ZjgyMDBhMCwgMHgzMDQyMDAwNCwgMHgxNDQwZmZmZCwKLTB4MCwgMHg4ZjgyMDA0MCwgMHgzMDQyMDAwMSwgMHgxNDQwMDAwOCwKLTB4MCwgMHg4ZjQzMDEwNCwgMHgyNDAyMDAwMSwgMHgxMDYyMDAwNCwKLTB4MCwgMHg4ZjQyMDI2NCwgMHgxMDQwMDAwNiwgMHgwLAotMHg4ZWUyMDE3YywgMHgyNDQyMDAwMSwgMHhhZWUyMDE3YywgMHg4MDAxNGM1LAotMHg4ZWUyMDE3YywgMHg4ZjgyMDA0NCwgMHgzNDQyMDAwNCwgMHhhZjgyMDA0NCwKLTB4OGVlMjAxNzgsIDB4MjQ0MjAwMDEsIDB4YWVlMjAxNzgsIDB4OGVlMjAxNzgsCi0weDhmODIwMGQ4LCAweDhmODMwMGQ0LCAweDQzMTAyMywgMHhhZWUyNzI2YywKLTB4OGVlMjcyNmMsIDB4MWM0MDAwMDMsIDB4M2MwMzAwMDEsIDB4NDMxMDIxLAotMHhhZWUyNzI2YywgMHhjMDA0MDY0LCAweDAsIDB4YzAwNDQ0MCwKLTB4YWY4MDAyMjgsIDB4OGZiZjAwMjQsIDB4OGZiMDAwMjAsIDB4M2UwMDAwOCwKLTB4MjdiZDAwMjgsIDB4M2UwMDAwOCwgMHgwLCAweDNlMDAwMDgsCi0weDAsIDB4MCwgMHgwLCAweDI0MDIwMDJjLAotMHhhZjgyMDA1MCwgMHhhZWUwNzI3NCwgMHg4ZjQyMDIzOCwgMHhhZWUyNzI3OCwKLTB4OGY4MjAwNTQsIDB4MjQ0MjAwNjcsIDB4YWY4MjAwNTgsIDB4YWVlMDdiODgsCi0weGFlZTA3YjhjLCAweGFlZTA3Yjg0LCAweDNjMDEwMDAxLCAweDM3MDgyMSwKLTB4YWMyMDgzYmMsIDB4M2MwMTAwMDEsIDB4MzcwODIxLCAweDNlMDAwMDgsCi0weGEwMjA4M2I5LCAweDI3YmRmZmQ4LCAweGFmYmYwMDI0LCAweGFmYjAwMDIwLAotMHg4ZjgyMDA1NCwgMHgzYzAzMDAwMSwgMHg4YzYzNWNkOCwgMHgyNDQyMDA2NywKLTB4MTA2MDAwMGQsIDB4YWY4MjAwNTgsIDB4M2MwMjAwMDEsIDB4NTcxMDIxLAotMHg5MDQyODNiOCwgMHgxMDQwMDAwNSwgMHgzYzAzMDIwMCwgMHgzYzAxMDAwMSwKLTB4MzcwODIxLCAweDgwMDE1MDMsIDB4YTAyMDgzYjgsIDB4OGVlMjAwMDAsCi0weDQzMTAyNSwgMHhhZWUyMDAwMCwgMHg4ZjQyMDIxOCwgMHgzMDQyMDEwMCwKLTB4MTA0MDAwYzYsIDB4MCwgMHg4ZjgyMDBiMCwgMHgzMDQyMDAwNCwKLTB4MTA0MDAwYzIsIDB4MCwgMHgzYzAzMDAwMSwgMHg3NzE4MjEsCi0weDhjNjM4M2QwLCAweDhmODIwMTA0LCAweDE0NjIwMGI0LCAweDAsCi0weDNjMDMwMDAxLCAweDc3MTgyMSwgMHg4YzYzODNkNCwgMHg4ZjgyMDBiNCwKLTB4MTQ2MjAwYWUsIDB4MCwgMHg4ZjgyMDBiMCwgMHgzYzAzMDA4MCwKLTB4NDMxMDI0LCAweDEwNDAwMDBkLCAweDAsIDB4OGY4MjAxMWMsCi0weDM0NDIwMDAyLCAweGFmODIwMTFjLCAweDhmODIwMGIwLCAweDI0MDNmZmZiLAotMHg0MzEwMjQsIDB4YWY4MjAwYjAsIDB4OGY4MjAxMWMsIDB4MjQwM2ZmZmQsCi0weDQzMTAyNCwgMHg4MDAxNWNjLCAweGFmODIwMTFjLCAweDNjMDMwMDAxLAotMHg3NzE4MjEsIDB4OGM2MzgzZDAsIDB4OGY4MjAxMDQsIDB4MTQ2MjAwODIsCi0weDAsIDB4M2MwMzAwMDEsIDB4NzcxODIxLCAweDhjNjM4M2Q0LAotMHg4ZjgyMDBiNCwgMHgxNDYyMDA3YywgMHgwLCAweDNjMDcwMDAxLAotMHhmNzM4MjEsIDB4OGNlNzgzZDAsIDB4OGY4MjAwYjAsIDB4M2MwNDAwMDEsCi0weDI0ODQ1MjcwLCAweGFmYTAwMDE0LCAweGFmYTIwMDEwLCAweDhmODYwMGIwLAotMHgzYzA1MDAwNSwgMHhjMDAyNDAzLCAweDM0YTUwOTAwLCAweDhmODIwMTFjLAotMHgzNDQyMDAwMiwgMHhhZjgyMDExYywgMHg4ZjgzMDEwNCwgMHg4ZjgyMDBiMCwKLTB4MzQ0MjAwMDEsIDB4YWY4MjAwYjAsIDB4YWY4MzAxMDQsIDB4OGY4MzAxMjAsCi0weDI3NjIzODAwLCAweDI0NjYwMDIwLCAweGMyMTAyYiwgMHg1MDQwMDAwMSwKLTB4Mjc2NjMwMDAsIDB4OGY4MjAxMjgsIDB4MTBjMjAwMDQsIDB4MCwKLTB4OGY4MjAxMjQsIDB4MTRjMjAwMDYsIDB4MCwgMHg4ZWUyMDFhNCwKLTB4MjQ0MjAwMDEsIDB4YWVlMjAxYTQsIDB4ODAwMTVhMCwgMHg4ZWUyMDFhNCwKLTB4OGY0NDAyMDgsIDB4OGY0NTAyMGMsIDB4MjZlMjAwMzAsIDB4YWM2MjAwMDgsCi0weDI0MDIwNDAwLCAweGE0NjIwMDBlLCAweDI0MDIwMDBmLCAweGFjNjIwMDE4LAotMHhhYzYwMDAxYywgMHhhYzY0MDAwMCwgMHhhYzY1MDAwNCwgMHg4ZWUyMDRjNCwKLTB4YWM2MjAwMTAsIDB4YWY4NjAxMjAsIDB4OTJlMjRlMjAsIDB4MTQ0MDAwMzcsCi0weDAsIDB4OGVlMjRlMzAsIDB4MjEwYzAsIDB4MjQ0MjUwMzgsCi0weDJlMjIwMjEsIDB4OGM4MzAwMDAsIDB4MjQwMjAwMDcsIDB4MTQ2MjAwMWYsCi0weDAsIDB4OGVlMzRlMzAsIDB4OGVlMjRlMzQsIDB4MTA2MjAwMWIsCi0weDI0MDMwMDQwLCAweDhjODIwMDA0LCAweDI0NDIwMDAxLCAweGFjODIwMDA0LAotMHg4ZWUyNGUzNCwgMHg4ZWU1NGUzMCwgMHgyNDQyMDAwMSwgMHgxMDQzMDAwNywKLTB4MCwgMHg4ZWUyNGUzNCwgMHgyNDQyMDAwMSwgMHgxMGEyMDAwNSwKLTB4MCwgMHg4MDAxNThhLCAweDAsIDB4MTRhMDAwMDUsCi0weDAsIDB4OGY4MjAxMjgsIDB4MjQ0MjAwMjAsIDB4YWY4MjAxMjgsCi0weDhmODIwMTI4LCAweDhjODIwMDA0LCAweDJjNDIwMDExLCAweDUwNDAwMDEzLAotMHhhYzgwMDAwMCwgMHg4MDAxNWEwLCAweDAsIDB4OGVlMjRlMzAsCi0weDI0MDMwMDQwLCAweDI0NDIwMDAxLCAweDUwNDMwMDAzLCAweDEwMjEsCi0weDhlZTI0ZTMwLCAweDI0NDIwMDAxLCAweGFlZTI0ZTMwLCAweDhlZTI0ZTMwLAotMHgyMTBjMCwgMHgyNDQyNTAzOCwgMHgyZTIyMDIxLCAweDI0MDIwMDA3LAotMHhhYzgyMDAwMCwgMHgyNDAyMDAwMSwgMHhhYzgyMDAwNCwgMHg4ZjgyMDExYywKLTB4MjQwM2ZmZmQsIDB4NDMxMDI0LCAweGFmODIwMTFjLCAweDhlZTIwMWU0LAotMHgzYzA3MDAwMSwgMHhmNzM4MjEsIDB4OGNlNzgzZDAsIDB4MjQ0MjAwMDEsCi0weGFlZTIwMWU0LCAweDhlZTIwMWU0LCAweDNjMDQwMDAxLCAweDI0ODQ1MjdjLAotMHg4MDAxNWJkLCAweGFmYTAwMDEwLCAweDhmODIwMTA0LCAweDNjMDEwMDAxLAotMHgzNzA4MjEsIDB4YWMyMjgzZDAsIDB4OGY4MjAwYjQsIDB4M2MwNzAwMDEsCi0weGY3MzgyMSwgMHg4Y2U3ODNkMCwgMHgzYzA0MDAwMSwgMHgyNDg0NTI4NCwKLTB4M2MwMTAwMDEsIDB4MzcwODIxLCAweGFjMjI4M2Q0LCAweGFmYTAwMDEwLAotMHhhZmEwMDAxNCwgMHg4Zjg2MDBiMCwgMHgzYzA1MDAwNSwgMHhjMDAyNDAzLAotMHgzNGE1MDkwMCwgMHg4MDAxNWNjLCAweDAsIDB4OGY4MjAxMDQsCi0weDNjMDEwMDAxLCAweDM3MDgyMSwgMHhhYzIyODNkMCwgMHg4ZjgyMDBiNCwKLTB4M2MwMTAwMDEsIDB4MzcwODIxLCAweGFjMjI4M2Q0LCAweDhlZTI3Mjc0LAotMHg5MmUzMDRmNCwgMHgyNDQyMDA2NywgMHgxNDYwMDAwNiwgMHhhZWUyNzI3NCwKLTB4OGVlMjcyNzQsIDB4OGY0MzAyMzQsIDB4NDMxMDJiLCAweDE0NDAwMDdiLAotMHgwLCAweDhlZTMwNGU0LCAweDhlZTIwNGY4LCAweDE0NjIwMDA0LAotMHgwLCAweDkyZTIwNGY0LCAweDUwNDAwMDc0LCAweGEyZTAwNGY0LAotMHg4ZjgzMDEyMCwgMHgyNzYyMzgwMCwgMHgyNDY2MDAyMCwgMHhjMjEwMmIsCi0weDUwNDAwMDAxLCAweDI3NjYzMDAwLCAweDhmODIwMTI4LCAweDEwYzIwMDA0LAotMHgwLCAweDhmODIwMTI0LCAweDE0YzIwMDA3LCAweDAsCi0weDhlZTIwMWE0LCAweDgwMjEsIDB4MjQ0MjAwMDEsIDB4YWVlMjAxYTQsCi0weDgwMDE2MzcsIDB4OGVlMjAxYTQsIDB4OGVlMjA0ZTQsIDB4YWM2MjAwMWMsCi0weDhlZTQwNGIwLCAweDhlZTUwNGI0LCAweDI0NjIwMDFjLCAweGFjNjIwMDA4LAotMHgyNDAyMDAwOCwgMHhhNDYyMDAwZSwgMHgyNDAyMDAxMSwgMHhhYzYyMDAxOCwKLTB4YWM2NDAwMDAsIDB4YWM2NTAwMDQsIDB4OGVlMjA0YzQsIDB4YWM2MjAwMTAsCi0weGFmODYwMTIwLCAweDkyZTI0ZTIwLCAweDE0NDAwMDM3LCAweDI0MTAwMDAxLAotMHg4ZWUyNGUzMCwgMHgyMTBjMCwgMHgyNDQyNTAzOCwgMHgyZTIyMDIxLAotMHg4YzgzMDAwMCwgMHgyNDAyMDAxMiwgMHgxNDYyMDAxZiwgMHgwLAotMHg4ZWUzNGUzMCwgMHg4ZWUyNGUzNCwgMHgxMDYyMDAxYiwgMHgyNDAzMDA0MCwKLTB4OGM4MjAwMDQsIDB4MjQ0MjAwMDEsIDB4YWM4MjAwMDQsIDB4OGVlMjRlMzQsCi0weDhlZTU0ZTMwLCAweDI0NDIwMDAxLCAweDEwNDMwMDA3LCAweDAsCi0weDhlZTI0ZTM0LCAweDI0NDIwMDAxLCAweDEwYTIwMDA1LCAweDAsCi0weDgwMDE2MjEsIDB4MCwgMHgxNGEwMDAwNSwgMHgwLAotMHg4ZjgyMDEyOCwgMHgyNDQyMDAyMCwgMHhhZjgyMDEyOCwgMHg4ZjgyMDEyOCwKLTB4OGM4MjAwMDQsIDB4MmM0MjAwMTEsIDB4NTA0MDAwMTMsIDB4YWM4MDAwMDAsCi0weDgwMDE2MzcsIDB4MCwgMHg4ZWUyNGUzMCwgMHgyNDAzMDA0MCwKLTB4MjQ0MjAwMDEsIDB4NTA0MzAwMDMsIDB4MTAyMSwgMHg4ZWUyNGUzMCwKLTB4MjQ0MjAwMDEsIDB4YWVlMjRlMzAsIDB4OGVlMjRlMzAsIDB4MjEwYzAsCi0weDI0NDI1MDM4LCAweDJlMjIwMjEsIDB4MjQwMjAwMTIsIDB4YWM4MjAwMDAsCi0weDI0MDIwMDAxLCAweGFjODIwMDA0LCAweDU2MDAwMDBiLCAweDI0MTAwMDAxLAotMHg4ZWUyMDRlNCwgMHgzYzA0MDAwMSwgMHgyNDg0NTI4YywgMHhhZmEwMDAxNCwKLTB4YWZhMjAwMTAsIDB4OGVlNjA2MDgsIDB4OGY0NzAyMjgsIDB4M2MwNTAwMDksCi0weGMwMDI0MDMsIDB4MzRhNWYwMDYsIDB4MTYwMDAwMDMsIDB4MjQwMjAwMDEsCi0weDgwMDE2NTAsIDB4YTJlMjA0ZjQsIDB4OGVlMjAxNzAsIDB4MjQ0MjAwMDEsCi0weGFlZTIwMTcwLCAweDhlZTIwMTcwLCAweDhlZTIwNGU0LCAweGEyZTAwNGY0LAotMHhhZWUwMDRmMCwgMHhhZWUwNzI3NCwgMHhhZWUyMDRmOCwgMHg4ZWUyMGUxYywKLTB4MTA0MDAwNmQsIDB4MCwgMHg4ZjgzMDEyMCwgMHgyNzYyMzgwMCwKLTB4MjQ2NjAwMjAsIDB4YzIxMDJiLCAweDUwNDAwMDAxLCAweDI3NjYzMDAwLAotMHg4ZjgyMDEyOCwgMHgxMGMyMDAwNCwgMHgwLCAweDhmODIwMTI0LAotMHgxNGMyMDAwNywgMHgwLCAweDhlZTIwMWE0LCAweDgwMjEsCi0weDI0NDIwMDAxLCAweGFlZTIwMWE0LCAweDgwMDE2YWQsIDB4OGVlMjAxYTQsCi0weDhlZTI3MjRjLCAweGFjNjIwMDFjLCAweDhlZTQwNGE4LCAweDhlZTUwNGFjLAotMHgyNDYyMDAxYywgMHhhYzYyMDAwOCwgMHgyNDAyMDAwOCwgMHhhNDYyMDAwZSwKLTB4MjQwMjAwMTEsIDB4YWM2MjAwMTgsIDB4YWM2NDAwMDAsIDB4YWM2NTAwMDQsCi0weDhlZTIwNGM0LCAweGFjNjIwMDEwLCAweGFmODYwMTIwLCAweDkyZTI0ZTIwLAotMHgxNDQwMDAzNywgMHgyNDEwMDAwMSwgMHg4ZWUyNGUzMCwgMHgyMTBjMCwKLTB4MjQ0MjUwMzgsIDB4MmUyMjAyMSwgMHg4YzgzMDAwMCwgMHgyNDAyMDAxMiwKLTB4MTQ2MjAwMWYsIDB4MCwgMHg4ZWUzNGUzMCwgMHg4ZWUyNGUzNCwKLTB4MTA2MjAwMWIsIDB4MjQwMzAwNDAsIDB4OGM4MjAwMDQsIDB4MjQ0MjAwMDEsCi0weGFjODIwMDA0LCAweDhlZTI0ZTM0LCAweDhlZTU0ZTMwLCAweDI0NDIwMDAxLAotMHgxMDQzMDAwNywgMHgwLCAweDhlZTI0ZTM0LCAweDI0NDIwMDAxLAotMHgxMGEyMDAwNSwgMHgwLCAweDgwMDE2OTcsIDB4MCwKLTB4MTRhMDAwMDUsIDB4MCwgMHg4ZjgyMDEyOCwgMHgyNDQyMDAyMCwKLTB4YWY4MjAxMjgsIDB4OGY4MjAxMjgsIDB4OGM4MjAwMDQsIDB4MmM0MjAwMTEsCi0weDUwNDAwMDEzLCAweGFjODAwMDAwLCAweDgwMDE2YWQsIDB4MCwKLTB4OGVlMjRlMzAsIDB4MjQwMzAwNDAsIDB4MjQ0MjAwMDEsIDB4NTA0MzAwMDMsCi0weDEwMjEsIDB4OGVlMjRlMzAsIDB4MjQ0MjAwMDEsIDB4YWVlMjRlMzAsCi0weDhlZTI0ZTMwLCAweDIxMGMwLCAweDI0NDI1MDM4LCAweDJlMjIwMjEsCi0weDI0MDIwMDEyLCAweGFjODIwMDAwLCAweDI0MDIwMDAxLCAweGFjODIwMDA0LAotMHg1NjAwMDAwYiwgMHgyNDEwMDAwMSwgMHg4ZWUyNzI0YywgMHgzYzA0MDAwMSwKLTB4MjQ4NDUyOTgsIDB4YWZhMDAwMTQsIDB4YWZhMjAwMTAsIDB4OGVlNjcyNGMsCi0weDhmNDcwMjgwLCAweDNjMDUwMDA5LCAweGMwMDI0MDMsIDB4MzRhNWYwMDgsCi0weDU2MDAwMDAxLCAweGFlZTAwZTFjLCAweDhlZTIwMTc0LCAweDI0NDIwMDAxLAotMHhhZWUyMDE3NCwgMHg4ZWUyMDE3NCwgMHg4ZWUyNGUyNCwgMHgxMDQwMDAxOSwKLTB4MCwgMHhhZWUwNGUyNCwgMHg4ZjgyMDA0MCwgMHgzMDQyMDAwMSwKLTB4MTQ0MDAwMDgsIDB4MCwgMHg4ZjQzMDEwNCwgMHgyNDAyMDAwMSwKLTB4MTA2MjAwMDQsIDB4MCwgMHg4ZjQyMDI2NCwgMHgxMDQwMDAwNiwKLTB4MCwgMHg4ZWUyMDE3YywgMHgyNDQyMDAwMSwgMHhhZWUyMDE3YywKLTB4ODAwMTZkYSwgMHg4ZWUyMDE3YywgMHg4ZjgyMDA0NCwgMHgzNDQyMDAwNCwKLTB4YWY4MjAwNDQsIDB4OGVlMjAxNzgsIDB4MjQ0MjAwMDEsIDB4YWVlMjAxNzgsCi0weDhlZTIwMTc4LCAweDhlZTI3Mjc4LCAweDI0NDJmZjk5LCAweGFlZTI3Mjc4LAotMHg4ZWUyNzI3OCwgMHgxYzQwMDJhZCwgMHgwLCAweDhmNDIwMjM4LAotMHgxMDQwMDJhYSwgMHgwLCAweDNjMDIwMDAxLCAweDU3MTAyMSwKLTB4OTA0MjgzZTAsIDB4MTQ0MDAyYTUsIDB4MCwgMHg4ZjQyMDA4MCwKLTB4YWVlMjAwNGMsIDB4OGY0MjAwYzAsIDB4YWVlMjAwNDgsIDB4OGY0MjAwODQsCi0weGFlZTIwMDM4LCAweDhmNDIwMDg0LCAweGFlZTIwMjQ0LCAweDhmNDIwMDg4LAotMHhhZWUyMDI0OCwgMHg4ZjQyMDA4YywgMHhhZWUyMDI0YywgMHg4ZjQyMDA5MCwKLTB4YWVlMjAyNTAsIDB4OGY0MjAwOTQsIDB4YWVlMjAyNTQsIDB4OGY0MjAwOTgsCi0weGFlZTIwMjU4LCAweDhmNDIwMDljLCAweGFlZTIwMjVjLCAweDhmNDIwMGEwLAotMHhhZWUyMDI2MCwgMHg4ZjQyMDBhNCwgMHhhZWUyMDI2NCwgMHg4ZjQyMDBhOCwKLTB4YWVlMjAyNjgsIDB4OGY0MjAwYWMsIDB4YWVlMjAyNmMsIDB4OGY0MjAwYjAsCi0weGFlZTIwMjcwLCAweDhmNDIwMGI0LCAweGFlZTIwMjc0LCAweDhmNDIwMGI4LAotMHhhZWUyMDI3OCwgMHg4ZjQyMDBiYywgMHgyNDA0MDAwMSwgMHhhZWUyMDI3YywKLTB4YWVlMDAwM2MsIDB4NDEwODAsIDB4NTcxMDIxLCAweDhlZTMwMDNjLAotMHg4YzQyMDI0NCwgMHgyNDg0MDAwMSwgMHg2MjE4MjEsIDB4MmM4MjAwMGYsCi0weGFlZTMwMDNjLCAweDE0NDBmZmY4LCAweDQxMDgwLCAweDhmNDIwMGNjLAotMHhhZWUyMDA1MCwgMHg4ZjQyMDBkMCwgMHhhZWUyMDA1NCwgMHg4ZjgzMDEyMCwKLTB4Mjc2MjM4MDAsIDB4MjQ2NjAwMjAsIDB4YzIxMDJiLCAweDUwNDAwMDAxLAotMHgyNzY2MzAwMCwgMHg4ZjgyMDEyOCwgMHgxMGMyMDAwNCwgMHgwLAotMHg4ZjgyMDEyNCwgMHgxNGMyMDAwNywgMHgwLCAweDhlZTIwMWE0LAotMHg4MDIxLCAweDI0NDIwMDAxLCAweGFlZTIwMWE0LCAweDgwMDE3NzUsCi0weDhlZTIwMWE0LCAweDhmNDQwMjA4LCAweDhmNDUwMjBjLCAweDI2ZTIwMDMwLAotMHhhYzYyMDAwOCwgMHgyNDAyMDQwMCwgMHhhNDYyMDAwZSwgMHgyNDAyMDAwZiwKLTB4YWM2MjAwMTgsIDB4YWM2MDAwMWMsIDB4YWM2NDAwMDAsIDB4YWM2NTAwMDQsCi0weDhlZTIwNGM0LCAweGFjNjIwMDEwLCAweGFmODYwMTIwLCAweDkyZTI0ZTIwLAotMHgxNDQwMDAzNywgMHgyNDEwMDAwMSwgMHg4ZWUyNGUzMCwgMHgyMTBjMCwKLTB4MjQ0MjUwMzgsIDB4MmUyMjAyMSwgMHg4YzgzMDAwMCwgMHgyNDAyMDAwNywKLTB4MTQ2MjAwMWYsIDB4MCwgMHg4ZWUzNGUzMCwgMHg4ZWUyNGUzNCwKLTB4MTA2MjAwMWIsIDB4MjQwMzAwNDAsIDB4OGM4MjAwMDQsIDB4MjQ0MjAwMDEsCi0weGFjODIwMDA0LCAweDhlZTI0ZTM0LCAweDhlZTU0ZTMwLCAweDI0NDIwMDAxLAotMHgxMDQzMDAwNywgMHgwLCAweDhlZTI0ZTM0LCAweDI0NDIwMDAxLAotMHgxMGEyMDAwNSwgMHgwLCAweDgwMDE3NWYsIDB4MCwKLTB4MTRhMDAwMDUsIDB4MCwgMHg4ZjgyMDEyOCwgMHgyNDQyMDAyMCwKLTB4YWY4MjAxMjgsIDB4OGY4MjAxMjgsIDB4OGM4MjAwMDQsIDB4MmM0MjAwMTEsCi0weDUwNDAwMDEzLCAweGFjODAwMDAwLCAweDgwMDE3NzUsIDB4MCwKLTB4OGVlMjRlMzAsIDB4MjQwMzAwNDAsIDB4MjQ0MjAwMDEsIDB4NTA0MzAwMDMsCi0weDEwMjEsIDB4OGVlMjRlMzAsIDB4MjQ0MjAwMDEsIDB4YWVlMjRlMzAsCi0weDhlZTI0ZTMwLCAweDIxMGMwLCAweDI0NDI1MDM4LCAweDJlMjIwMjEsCi0weDI0MDIwMDA3LCAweGFjODIwMDAwLCAweDI0MDIwMDAxLCAweGFjODIwMDA0LAotMHgxMjAwMDIxMiwgMHgzYzAyMDQwMCwgMHhhZmEyMDAxOCwgMHgzYzAyMDAwMSwKLTB4NTcxMDIxLCAweDkwNDI4M2IwLCAweDEwNDAwMTBiLCAweDAsCi0weDhlZTIwNjA4LCAweDhmNDMwMjI4LCAweDI0NDIwMDAxLCAweDMwNGEwMGZmLAotMHg1MTQzMDBmZCwgMHhhZmEwMDAxMCwgMHg4ZWUyMDYwOCwgMHgyMTBjMCwKLTB4NTcxMDIxLCAweDhmYTMwMDE4LCAweDhmYTQwMDFjLCAweGFjNDMwNjBjLAotMHhhYzQ0MDYxMCwgMHg4ZjgzMDA1NCwgMHg4ZjgyMDA1NCwgMHgyNDY5MDAzMiwKLTB4MTIyMTAyMywgMHgyYzQyMDAzMywgMHgxMDQwMDA2YSwgMHg1ODIxLAotMHgyNDE4MDAwOCwgMHgyNDBmMDAwZCwgMHgyNDBkMDAwNywgMHgyNDBjMDA0MCwKLTB4MjQwZTAwMDEsIDB4OGY4NzAxMjAsIDB4Mjc2MjM4MDAsIDB4MjRlODAwMjAsCi0weDEwMjEwMmIsIDB4NTA0MDAwMDEsIDB4Mjc2ODMwMDAsIDB4OGY4MjAxMjgsCi0weDExMDIwMDA0LCAweDAsIDB4OGY4MjAxMjQsIDB4MTUwMjAwMDcsCi0weDEwMjEsIDB4OGVlMjAxYTQsIDB4ODAyMSwgMHgyNDQyMDAwMSwKLTB4YWVlMjAxYTQsIDB4ODAwMTdmMywgMHg4ZWUyMDFhNCwgMHg4ZWU0MDYwOCwKLTB4NDIwYzAsIDB4ODAxODIxLCAweDhlZTQwNDMwLCAweDhlZTUwNDM0LAotMHhhMzI4MjEsIDB4YTMzMDJiLCAweDgyMjAyMSwgMHg4NjIwMjEsCi0weGFjZTQwMDAwLCAweGFjZTUwMDA0LCAweDhlZTIwNjA4LCAweGE0ZjgwMDBlLAotMHhhY2VmMDAxOCwgMHhhY2VhMDAxYywgMHgyMTBjMCwgMHgyNDQyMDYwYywKLTB4MmUyMTAyMSwgMHhhY2UyMDAwOCwgMHg4ZWUyMDRjNCwgMHhhY2UyMDAxMCwKLTB4YWY4ODAxMjAsIDB4OTJlMjRlMjAsIDB4MTQ0MDAwMzMsIDB4MjQxMDAwMDEsCi0weDhlZTI0ZTMwLCAweDIxMGMwLCAweDI0NDI1MDM4LCAweDJlMjIwMjEsCi0weDhjODIwMDAwLCAweDE0NGQwMDFmLCAweDAsIDB4OGVlMzRlMzAsCi0weDhlZTI0ZTM0LCAweDEwNjIwMDFiLCAweDAsIDB4OGM4MjAwMDQsCi0weDI0NDIwMDAxLCAweGFjODIwMDA0LCAweDhlZTI0ZTM0LCAweDhlZTM0ZTMwLAotMHgyNDQyMDAwMSwgMHgxMDRjMDAwNywgMHgwLCAweDhlZTI0ZTM0LAotMHgyNDQyMDAwMSwgMHgxMDYyMDAwNSwgMHgwLCAweDgwMDE3ZTAsCi0weDAsIDB4MTQ2MDAwMDUsIDB4MCwgMHg4ZjgyMDEyOCwKLTB4MjQ0MjAwMjAsIDB4YWY4MjAxMjgsIDB4OGY4MjAxMjgsIDB4OGM4MjAwMDQsCi0weDJjNDIwMDExLCAweDUwNDAwMDEwLCAweGFjODAwMDAwLCAweDgwMDE3ZjMsCi0weDAsIDB4OGVlMjRlMzAsIDB4MjQ0MjAwMDEsIDB4NTA0YzAwMDMsCi0weDEwMjEsIDB4OGVlMjRlMzAsIDB4MjQ0MjAwMDEsIDB4YWVlMjRlMzAsCi0weDhlZTI0ZTMwLCAweDIxMGMwLCAweDI0NDI1MDM4LCAweDJlMjIwMjEsCi0weGFjOGQwMDAwLCAweGFjOGUwMDA0LCAweDU2MDAwMDA2LCAweDI0MGIwMDAxLAotMHg4ZjgyMDA1NCwgMHgxMjIxMDIzLCAweDJjNDIwMDMzLCAweDE0NDBmZjlkLAotMHgwLCAweDMxNjMwMGZmLCAweDI0MDIwMDAxLCAweDE0NjIwMDc3LAotMHgzYzA1MDAwOSwgMHhhZWVhMDYwOCwgMHg4ZjgzMDA1NCwgMHg4ZjgyMDA1NCwKLTB4MjQ2OTAwMzIsIDB4MTIyMTAyMywgMHgyYzQyMDAzMywgMHgxMDQwMDA2MSwKLTB4NTgyMSwgMHgyNDBkMDAwOCwgMHgyNDBjMDAxMSwgMHgyNDA4MDAxMiwKLTB4MjQwNzAwNDAsIDB4MjQwYTAwMDEsIDB4OGY4MzAxMjAsIDB4Mjc2MjM4MDAsCi0weDI0NjYwMDIwLCAweGMyMTAyYiwgMHg1MDQwMDAwMSwgMHgyNzY2MzAwMCwKLTB4OGY4MjAxMjgsIDB4MTBjMjAwMDQsIDB4MCwgMHg4ZjgyMDEyNCwKLTB4MTRjMjAwMDcsIDB4MCwgMHg4ZWUyMDFhNCwgMHg4MDIxLAotMHgyNDQyMDAwMSwgMHhhZWUyMDFhNCwgMHg4MDAxODVmLCAweDhlZTIwMWE0LAotMHg4ZWUyMDYwOCwgMHhhYzYyMDAxYywgMHg4ZWU0MDRhMCwgMHg4ZWU1MDRhNCwKLTB4MjQ2MjAwMWMsIDB4YWM2MjAwMDgsIDB4YTQ2ZDAwMGUsIDB4YWM2YzAwMTgsCi0weGFjNjQwMDAwLCAweGFjNjUwMDA0LCAweDhlZTIwNGM0LCAweGFjNjIwMDEwLAotMHhhZjg2MDEyMCwgMHg5MmUyNGUyMCwgMHgxNDQwMDAzMywgMHgyNDEwMDAwMSwKLTB4OGVlMjRlMzAsIDB4MjEwYzAsIDB4MjQ0MjUwMzgsIDB4MmUyMjAyMSwKLTB4OGM4MjAwMDAsIDB4MTQ0ODAwMWYsIDB4MCwgMHg4ZWUzNGUzMCwKLTB4OGVlMjRlMzQsIDB4MTA2MjAwMWIsIDB4MCwgMHg4YzgyMDAwNCwKLTB4MjQ0MjAwMDEsIDB4YWM4MjAwMDQsIDB4OGVlMjRlMzQsIDB4OGVlMzRlMzAsCi0weDI0NDIwMDAxLCAweDEwNDcwMDA3LCAweDAsIDB4OGVlMjRlMzQsCi0weDI0NDIwMDAxLCAweDEwNjIwMDA1LCAweDAsIDB4ODAwMTg0YywKLTB4MCwgMHgxNDYwMDAwNSwgMHgwLCAweDhmODIwMTI4LAotMHgyNDQyMDAyMCwgMHhhZjgyMDEyOCwgMHg4ZjgyMDEyOCwgMHg4YzgyMDAwNCwKLTB4MmM0MjAwMTEsIDB4NTA0MDAwMTAsIDB4YWM4MDAwMDAsIDB4ODAwMTg1ZiwKLTB4MCwgMHg4ZWUyNGUzMCwgMHgyNDQyMDAwMSwgMHg1MDQ3MDAwMywKLTB4MTAyMSwgMHg4ZWUyNGUzMCwgMHgyNDQyMDAwMSwgMHhhZWUyNGUzMCwKLTB4OGVlMjRlMzAsIDB4MjEwYzAsIDB4MjQ0MjUwMzgsIDB4MmUyMjAyMSwKLTB4YWM4ODAwMDAsIDB4YWM4YTAwMDQsIDB4NTYwMDAwMDYsIDB4MjQwYjAwMDEsCi0weDhmODIwMDU0LCAweDEyMjEwMjMsIDB4MmM0MjAwMzMsIDB4MTQ0MGZmYTYsCi0weDAsIDB4MzE2MzAwZmYsIDB4MjQwMjAwMDEsIDB4MTQ2MjAwMDMsCi0weDNjMDUwMDA5LCAweDgwMDE5N2MsIDB4MjQxMDAwMDEsIDB4M2MwNDAwMDEsCi0weDI0ODQ1MmE0LCAweGFmYTAwMDEwLCAweGFmYTAwMDE0LCAweDhmODYwMTIwLAotMHg4Zjg3MDEyNCwgMHg4MDAxODdiLCAweDM0YTVmMDExLCAweDNjMDQwMDAxLAotMHgyNDg0NTJiMCwgMHhhZmEwMDAxMCwgMHhhZmEwMDAxNCwgMHg4Zjg2MDEyMCwKLTB4OGY4NzAxMjQsIDB4MzRhNWYwMTAsIDB4YzAwMjQwMywgMHg4MDIxLAotMHg4MDAxOTdjLCAweDAsIDB4M2MwNDAwMDEsIDB4MjQ4NDUyYmMsCi0weGFmYTAwMDE0LCAweDhlZTYwNjA4LCAweDhmNDcwMjI4LCAweDNjMDUwMDA5LAotMHg4MDAxOTc1LCAweDM0YTVmMDBmLCAweDhlZTIwNjA4LCAweDhmNDMwMjI4LAotMHgyNDQyMDAwMSwgMHgzMDQ5MDBmZiwgMHg1MTIzMDBlMiwgMHhhZmEwMDAxMCwKLTB4OGVlMjA2MDgsIDB4MjEwYzAsIDB4NTcxMDIxLCAweDhmYTMwMDE4LAotMHg4ZmE0MDAxYywgMHhhYzQzMDYwYywgMHhhYzQ0MDYxMCwgMHg4Zjg3MDEyMCwKLTB4Mjc2MjM4MDAsIDB4MjRlODAwMjAsIDB4MTAyMTAyYiwgMHg1MDQwMDAwMSwKLTB4Mjc2ODMwMDAsIDB4OGY4MjAxMjgsIDB4MTEwMjAwMDQsIDB4MCwKLTB4OGY4MjAxMjQsIDB4MTUwMjAwMDcsIDB4MTAyMSwgMHg4ZWUyMDFhNCwKLTB4ODAyMSwgMHgyNDQyMDAwMSwgMHhhZWUyMDFhNCwgMHg4MDAxOGY3LAotMHg4ZWUyMDFhNCwgMHg4ZWU0MDYwOCwgMHg0MjBjMCwgMHg4MDE4MjEsCi0weDhlZTQwNDMwLCAweDhlZTUwNDM0LCAweGEzMjgyMSwgMHhhMzMwMmIsCi0weDgyMjAyMSwgMHg4NjIwMjEsIDB4YWNlNDAwMDAsIDB4YWNlNTAwMDQsCi0weDhlZTMwNjA4LCAweDI0MDIwMDA4LCAweGE0ZTIwMDBlLCAweDI0MDIwMDBkLAotMHhhY2UyMDAxOCwgMHhhY2U5MDAxYywgMHgzMThjMCwgMHgyNDYzMDYwYywKLTB4MmUzMTAyMSwgMHhhY2UyMDAwOCwgMHg4ZWUyMDRjNCwgMHhhY2UyMDAxMCwKLTB4YWY4ODAxMjAsIDB4OTJlMjRlMjAsIDB4MTQ0MDAwMzcsIDB4MjQxMDAwMDEsCi0weDhlZTI0ZTMwLCAweDIxMGMwLCAweDI0NDI1MDM4LCAweDJlMjIwMjEsCi0weDhjODMwMDAwLCAweDI0MDIwMDA3LCAweDE0NjIwMDFmLCAweDAsCi0weDhlZTM0ZTMwLCAweDhlZTI0ZTM0LCAweDEwNjIwMDFiLCAweDI0MDMwMDQwLAotMHg4YzgyMDAwNCwgMHgyNDQyMDAwMSwgMHhhYzgyMDAwNCwgMHg4ZWUyNGUzNCwKLTB4OGVlNTRlMzAsIDB4MjQ0MjAwMDEsIDB4MTA0MzAwMDcsIDB4MCwKLTB4OGVlMjRlMzQsIDB4MjQ0MjAwMDEsIDB4MTBhMjAwMDUsIDB4MCwKLTB4ODAwMThlMSwgMHgwLCAweDE0YTAwMDA1LCAweDAsCi0weDhmODIwMTI4LCAweDI0NDIwMDIwLCAweGFmODIwMTI4LCAweDhmODIwMTI4LAotMHg4YzgyMDAwNCwgMHgyYzQyMDAxMSwgMHg1MDQwMDAxMywgMHhhYzgwMDAwMCwKLTB4ODAwMThmNywgMHgwLCAweDhlZTI0ZTMwLCAweDI0MDMwMDQwLAotMHgyNDQyMDAwMSwgMHg1MDQzMDAwMywgMHgxMDIxLCAweDhlZTI0ZTMwLAotMHgyNDQyMDAwMSwgMHhhZWUyNGUzMCwgMHg4ZWUyNGUzMCwgMHgyMTBjMCwKLTB4MjQ0MjUwMzgsIDB4MmUyMjAyMSwgMHgyNDAyMDAwNywgMHhhYzgyMDAwMCwKLTB4MjQwMjAwMDEsIDB4YWM4MjAwMDQsIDB4NTYwMDAwMGMsIDB4YWVlOTA2MDgsCi0weDNjMDQwMDAxLCAweDI0ODQ1MmM4LCAweGFmYTAwMDEwLCAweGFmYTAwMDE0LAotMHg4ZWU2MDYwOCwgMHg4ZjQ3MDIyOCwgMHgzYzA1MDAwOSwgMHhjMDAyNDAzLAotMHgzNGE1ZjAwMCwgMHg4MDAxOTdjLCAweDAsIDB4OGY4MzAxMjAsCi0weDI3NjIzODAwLCAweDI0NjYwMDIwLCAweGMyMTAyYiwgMHg1MDQwMDAwMSwKLTB4Mjc2NjMwMDAsIDB4OGY4MjAxMjgsIDB4MTBjMjAwMDQsIDB4MCwKLTB4OGY4MjAxMjQsIDB4MTRjMjAwMDcsIDB4MCwgMHg4ZWUyMDFhNCwKLTB4ODAyMSwgMHgyNDQyMDAwMSwgMHhhZWUyMDFhNCwgMHg4MDAxOTVlLAotMHg4ZWUyMDFhNCwgMHg4ZWUyMDYwOCwgMHhhYzYyMDAxYywgMHg4ZWU0MDRhMCwKLTB4OGVlNTA0YTQsIDB4MjQ2MjAwMWMsIDB4YWM2MjAwMDgsIDB4MjQwMjAwMDgsCi0weGE0NjIwMDBlLCAweDI0MDIwMDExLCAweGFjNjIwMDE4LCAweGFjNjQwMDAwLAotMHhhYzY1MDAwNCwgMHg4ZWUyMDRjNCwgMHhhYzYyMDAxMCwgMHhhZjg2MDEyMCwKLTB4OTJlMjRlMjAsIDB4MTQ0MDAwMzcsIDB4MjQxMDAwMDEsIDB4OGVlMjRlMzAsCi0weDIxMGMwLCAweDI0NDI1MDM4LCAweDJlMjIwMjEsIDB4OGM4MzAwMDAsCi0weDI0MDIwMDEyLCAweDE0NjIwMDFmLCAweDAsIDB4OGVlMzRlMzAsCi0weDhlZTI0ZTM0LCAweDEwNjIwMDFiLCAweDI0MDMwMDQwLCAweDhjODIwMDA0LAotMHgyNDQyMDAwMSwgMHhhYzgyMDAwNCwgMHg4ZWUyNGUzNCwgMHg4ZWU1NGUzMCwKLTB4MjQ0MjAwMDEsIDB4MTA0MzAwMDcsIDB4MCwgMHg4ZWUyNGUzNCwKLTB4MjQ0MjAwMDEsIDB4MTBhMjAwMDUsIDB4MCwgMHg4MDAxOTQ4LAotMHgwLCAweDE0YTAwMDA1LCAweDAsIDB4OGY4MjAxMjgsCi0weDI0NDIwMDIwLCAweGFmODIwMTI4LCAweDhmODIwMTI4LCAweDhjODIwMDA0LAotMHgyYzQyMDAxMSwgMHg1MDQwMDAxMywgMHhhYzgwMDAwMCwgMHg4MDAxOTVlLAotMHgwLCAweDhlZTI0ZTMwLCAweDI0MDMwMDQwLCAweDI0NDIwMDAxLAotMHg1MDQzMDAwMywgMHgxMDIxLCAweDhlZTI0ZTMwLCAweDI0NDIwMDAxLAotMHhhZWUyNGUzMCwgMHg4ZWUyNGUzMCwgMHgyMTBjMCwgMHgyNDQyNTAzOCwKLTB4MmUyMjAyMSwgMHgyNDAyMDAxMiwgMHhhYzgyMDAwMCwgMHgyNDAyMDAwMSwKLTB4YWM4MjAwMDQsIDB4NTYwMDAwMWQsIDB4MjQxMDAwMDEsIDB4M2MwNDAwMDEsCi0weDI0ODQ1MmQwLCAweGFmYTAwMDEwLCAweGFmYTAwMDE0LCAweDhlZTYwNjA4LAotMHg4ZjQ3MDIyOCwgMHgzYzA1MDAwOSwgMHhjMDAyNDAzLCAweDM0YTVmMDAxLAotMHg4ZWUyMDFiMCwgMHgyNDQyMDAwMSwgMHhhZWUyMDFiMCwgMHg4MDAxOTdjLAotMHg4ZWUyMDFiMCwgMHgzYzA0MDAwMSwgMHgyNDg0NTJkYywgMHhhZmEwMDAxNCwKLTB4OGVlNjA2MDgsIDB4OGY0NzAyMjgsIDB4M2MwNTAwMDksIDB4MzRhNWYwMDUsCi0weGMwMDI0MDMsIDB4MCwgMHg4ZWUyMDFhYywgMHg4MDIxLAotMHgyNDQyMDAwMSwgMHhhZWUyMDFhYywgMHg4ZWUyMDFhYywgMHgxMjAwMDAwYywKLTB4MjQwMjAwMDEsIDB4M2MwMTAwMDEsIDB4MzcwODIxLCAweGEwMjA4M2IwLAotMHg4ZjQyMDIzOCwgMHg4ZWUzMDE1OCwgMHgyNDYzMDAwMSwgMHhhZWUzMDE1OCwKLTB4OGVlMzAxNTgsIDB4ODAwMTk4YywgMHhhZWUyNzI3OCwgMHgyNDAyMDAwMSwKLTB4M2MwMTAwMDEsIDB4MzcwODIxLCAweGEwMjI4M2IwLCAweDNjMDIwMDAxLAotMHg4YzQyNWNkOCwgMHgxMDQwMDE4NywgMHgwLCAweDhlZTI3Yjg0LAotMHgyNDQzMDAwMSwgMHgyODQyMDBjOSwgMHgxNDQwMDFhNCwgMHhhZWUzN2I4NCwKLTB4OGVlMjA0ZDQsIDB4MzA0MjAwMDIsIDB4MTQ0MDAxMTksIDB4YWVlMDdiODQsCi0weDhlZTIwNGQ0LCAweDNjMDMwNjAwLCAweDM0NjMxMDAwLCAweDM0NDIwMDAyLAotMHhhZWUyMDRkNCwgMHhhZmEzMDAxOCwgMHg4ZWUyMDYwOCwgMHg4ZjQzMDIyOCwKLTB4MjQ0MjAwMDEsIDB4MzA0YTAwZmYsIDB4NTE0MzAwZmQsIDB4YWZhMDAwMTAsCi0weDhlZTIwNjA4LCAweDIxMGMwLCAweDU3MTAyMSwgMHg4ZmEzMDAxOCwKLTB4OGZhNDAwMWMsIDB4YWM0MzA2MGMsIDB4YWM0NDA2MTAsIDB4OGY4MzAwNTQsCi0weDhmODIwMDU0LCAweDI0NjkwMDMyLCAweDEyMjEwMjMsIDB4MmM0MjAwMzMsCi0weDEwNDAwMDZhLCAweDU4MjEsIDB4MjQxODAwMDgsIDB4MjQwZjAwMGQsCi0weDI0MGQwMDA3LCAweDI0MGMwMDQwLCAweDI0MGUwMDAxLCAweDhmODcwMTIwLAotMHgyNzYyMzgwMCwgMHgyNGU4MDAyMCwgMHgxMDIxMDJiLCAweDUwNDAwMDAxLAotMHgyNzY4MzAwMCwgMHg4ZjgyMDEyOCwgMHgxMTAyMDAwNCwgMHgwLAotMHg4ZjgyMDEyNCwgMHgxNTAyMDAwNywgMHgxMDIxLCAweDhlZTIwMWE0LAotMHg4MDIxLCAweDI0NDIwMDAxLCAweGFlZTIwMWE0LCAweDgwMDFhMTUsCi0weDhlZTIwMWE0LCAweDhlZTQwNjA4LCAweDQyMGMwLCAweDgwMTgyMSwKLTB4OGVlNDA0MzAsIDB4OGVlNTA0MzQsIDB4YTMyODIxLCAweGEzMzAyYiwKLTB4ODIyMDIxLCAweDg2MjAyMSwgMHhhY2U0MDAwMCwgMHhhY2U1MDAwNCwKLTB4OGVlMjA2MDgsIDB4YTRmODAwMGUsIDB4YWNlZjAwMTgsIDB4YWNlYTAwMWMsCi0weDIxMGMwLCAweDI0NDIwNjBjLCAweDJlMjEwMjEsIDB4YWNlMjAwMDgsCi0weDhlZTIwNGM0LCAweGFjZTIwMDEwLCAweGFmODgwMTIwLCAweDkyZTI0ZTIwLAotMHgxNDQwMDAzMywgMHgyNDEwMDAwMSwgMHg4ZWUyNGUzMCwgMHgyMTBjMCwKLTB4MjQ0MjUwMzgsIDB4MmUyMjAyMSwgMHg4YzgyMDAwMCwgMHgxNDRkMDAxZiwKLTB4MCwgMHg4ZWUzNGUzMCwgMHg4ZWUyNGUzNCwgMHgxMDYyMDAxYiwKLTB4MCwgMHg4YzgyMDAwNCwgMHgyNDQyMDAwMSwgMHhhYzgyMDAwNCwKLTB4OGVlMjRlMzQsIDB4OGVlMzRlMzAsIDB4MjQ0MjAwMDEsIDB4MTA0YzAwMDcsCi0weDAsIDB4OGVlMjRlMzQsIDB4MjQ0MjAwMDEsIDB4MTA2MjAwMDUsCi0weDAsIDB4ODAwMWEwMiwgMHgwLCAweDE0NjAwMDA1LAotMHgwLCAweDhmODIwMTI4LCAweDI0NDIwMDIwLCAweGFmODIwMTI4LAotMHg4ZjgyMDEyOCwgMHg4YzgyMDAwNCwgMHgyYzQyMDAxMSwgMHg1MDQwMDAxMCwKLTB4YWM4MDAwMDAsIDB4ODAwMWExNSwgMHgwLCAweDhlZTI0ZTMwLAotMHgyNDQyMDAwMSwgMHg1MDRjMDAwMywgMHgxMDIxLCAweDhlZTI0ZTMwLAotMHgyNDQyMDAwMSwgMHhhZWUyNGUzMCwgMHg4ZWUyNGUzMCwgMHgyMTBjMCwKLTB4MjQ0MjUwMzgsIDB4MmUyMjAyMSwgMHhhYzhkMDAwMCwgMHhhYzhlMDAwNCwKLTB4NTYwMDAwMDYsIDB4MjQwYjAwMDEsIDB4OGY4MjAwNTQsIDB4MTIyMTAyMywKLTB4MmM0MjAwMzMsIDB4MTQ0MGZmOWQsIDB4MCwgMHgzMTYzMDBmZiwKLTB4MjQwMjAwMDEsIDB4NTQ2MjAwNzgsIDB4YWZhMDAwMTAsIDB4YWVlYTA2MDgsCi0weDhmODMwMDU0LCAweDhmODIwMDU0LCAweDI0NjkwMDMyLCAweDEyMjEwMjMsCi0weDJjNDIwMDMzLCAweDEwNDAwMDYxLCAweDU4MjEsIDB4MjQwZDAwMDgsCi0weDI0MGMwMDExLCAweDI0MDgwMDEyLCAweDI0MDcwMDQwLCAweDI0MGEwMDAxLAotMHg4ZjgzMDEyMCwgMHgyNzYyMzgwMCwgMHgyNDY2MDAyMCwgMHhjMjEwMmIsCi0weDUwNDAwMDAxLCAweDI3NjYzMDAwLCAweDhmODIwMTI4LCAweDEwYzIwMDA0LAotMHgwLCAweDhmODIwMTI0LCAweDE0YzIwMDA3LCAweDAsCi0weDhlZTIwMWE0LCAweDgwMjEsIDB4MjQ0MjAwMDEsIDB4YWVlMjAxYTQsCi0weDgwMDFhODEsIDB4OGVlMjAxYTQsIDB4OGVlMjA2MDgsIDB4YWM2MjAwMWMsCi0weDhlZTQwNGEwLCAweDhlZTUwNGE0LCAweDI0NjIwMDFjLCAweGFjNjIwMDA4LAotMHhhNDZkMDAwZSwgMHhhYzZjMDAxOCwgMHhhYzY0MDAwMCwgMHhhYzY1MDAwNCwKLTB4OGVlMjA0YzQsIDB4YWM2MjAwMTAsIDB4YWY4NjAxMjAsIDB4OTJlMjRlMjAsCi0weDE0NDAwMDMzLCAweDI0MTAwMDAxLCAweDhlZTI0ZTMwLCAweDIxMGMwLAotMHgyNDQyNTAzOCwgMHgyZTIyMDIxLCAweDhjODIwMDAwLCAweDE0NDgwMDFmLAotMHgwLCAweDhlZTM0ZTMwLCAweDhlZTI0ZTM0LCAweDEwNjIwMDFiLAotMHgwLCAweDhjODIwMDA0LCAweDI0NDIwMDAxLCAweGFjODIwMDA0LAotMHg4ZWUyNGUzNCwgMHg4ZWUzNGUzMCwgMHgyNDQyMDAwMSwgMHgxMDQ3MDAwNywKLTB4MCwgMHg4ZWUyNGUzNCwgMHgyNDQyMDAwMSwgMHgxMDYyMDAwNSwKLTB4MCwgMHg4MDAxYTZlLCAweDAsIDB4MTQ2MDAwMDUsCi0weDAsIDB4OGY4MjAxMjgsIDB4MjQ0MjAwMjAsIDB4YWY4MjAxMjgsCi0weDhmODIwMTI4LCAweDhjODIwMDA0LCAweDJjNDIwMDExLCAweDUwNDAwMDEwLAotMHhhYzgwMDAwMCwgMHg4MDAxYTgxLCAweDAsIDB4OGVlMjRlMzAsCi0weDI0NDIwMDAxLCAweDUwNDcwMDAzLCAweDEwMjEsIDB4OGVlMjRlMzAsCi0weDI0NDIwMDAxLCAweGFlZTI0ZTMwLCAweDhlZTI0ZTMwLCAweDIxMGMwLAotMHgyNDQyNTAzOCwgMHgyZTIyMDIxLCAweGFjODgwMDAwLCAweGFjOGEwMDA0LAotMHg1NjAwMDAwNiwgMHgyNDBiMDAwMSwgMHg4ZjgyMDA1NCwgMHgxMjIxMDIzLAotMHgyYzQyMDAzMywgMHgxNDQwZmZhNiwgMHgwLCAweDMxNjMwMGZmLAotMHgyNDAyMDAwMSwgMHgxMDYyMDAyMiwgMHgwLCAweDNjMDQwMDAxLAotMHgyNDg0NTJhNCwgMHhhZmEwMDAxMCwgMHhhZmEwMDAxNCwgMHg4Zjg2MDEyMCwKLTB4OGY4NzAxMjQsIDB4M2MwNTAwMDksIDB4YzAwMjQwMywgMHgzNGE1ZjAxMSwKLTB4ODAwMWFhZCwgMHgwLCAweDNjMDQwMDAxLCAweDI0ODQ1MmIwLAotMHhhZmEwMDAxNCwgMHg4Zjg2MDEyMCwgMHg4Zjg3MDEyNCwgMHgzYzA1MDAwOSwKLTB4YzAwMjQwMywgMHgzNGE1ZjAxMCwgMHg4MDAxYWFkLCAweDAsCi0weDNjMDQwMDAxLCAweDI0ODQ1MmJjLCAweGFmYTAwMDE0LCAweDhlZTYwNjA4LAotMHg4ZjQ3MDIyOCwgMHgzYzA1MDAwOSwgMHhjMDAyNDAzLCAweDM0YTVmMDBmLAotMHg4ZWUyMDFhYywgMHgyNDQyMDAwMSwgMHhhZWUyMDFhYywgMHg4ZWUyMDFhYywKLTB4OGVlMjAxNWMsIDB4MjQ0MjAwMDEsIDB4YWVlMjAxNWMsIDB4OGVlMjAxNWMsCi0weDhlZTIwNGQ0LCAweDMwNDIwMDAxLCAweDEwNDAwMDU1LCAweDAsCi0weDhmNDIwMjE4LCAweDMwNDIwMDgwLCAweDEwNDAwMDI5LCAweDAsCi0weDhmODIwMDQ0LCAweDM0NDIwMDQwLCAweGFmODIwMDQ0LCAweDhlZTI3YjdjLAotMHg0MDI4MjEsIDB4OGVlMjAwYzAsIDB4OGVlMzAwYzQsIDB4MjQwNjAwMDAsCi0weDI0MDdmZmZmLCAweDIwMjEsIDB4NDYxMDI0LCAweDE0NDQwMDBkLAotMHg2NzE4MjQsIDB4MTQ2NTAwMGIsIDB4MCwgMHg4ZWUyN2I4MCwKLTB4NDAyODIxLCAweDhlZTIwMGUwLCAweDhlZTMwMGU0LCAweDIwMjEsCi0weDQ2MTAyNCwgMHgxNDQ0MDAwMywgMHg2NzE4MjQsIDB4MTA2NTAwMGIsCi0weDAsIDB4OGVlMjAwYzAsIDB4OGVlMzAwYzQsIDB4OGVlNDAwZTAsCi0weDhlZTUwMGU0LCAweGFlZTM3YjdjLCAweGFlZTU3YjgwLCAweDhmODIwMDQ0LAotMHgzODQyMDAyMCwgMHg4MDAxYjM4LCAweGFmODIwMDQ0LCAweDhmODIwMDQ0LAotMHgyNDAzZmZkZiwgMHg0MzEwMjQsIDB4ODAwMWIzOCwgMHhhZjgyMDA0NCwKLTB4OGY4MjAwNDQsIDB4MjQwM2ZmZGYsIDB4NDMxMDI0LCAweGFmODIwMDQ0LAotMHg4ZWUyN2I3YywgMHg0MDI4MjEsIDB4OGVlMjAwYzAsIDB4OGVlMzAwYzQsCi0weDI0MDYwMDAwLCAweDI0MDdmZmZmLCAweDIwMjEsIDB4NDYxMDI0LAotMHgxNDQ0MDAwZCwgMHg2NzE4MjQsIDB4MTQ2NTAwMGIsIDB4MCwKLTB4OGVlMjdiODAsIDB4NDAyODIxLCAweDhlZTIwMGUwLCAweDhlZTMwMGU0LAotMHgyMDIxLCAweDQ2MTAyNCwgMHgxNDQ0MDAwMywgMHg2NzE4MjQsCi0weDEwNjUwMDBiLCAweDAsIDB4OGVlMjAwYzAsIDB4OGVlMzAwYzQsCi0weDhlZTQwMGUwLCAweDhlZTUwMGU0LCAweGFlZTM3YjdjLCAweGFlZTU3YjgwLAotMHg4ZjgyMDA0NCwgMHgzODQyMDA0MCwgMHg4MDAxYjM4LCAweGFmODIwMDQ0LAotMHg4ZjgyMDA0NCwgMHgzNDQyMDA0MCwgMHg4MDAxYjM4LCAweGFmODIwMDQ0LAotMHg4ZjgyMDA0NCwgMHgzNDQyMDA0MCwgMHhhZjgyMDA0NCwgMHg4ZWUyN2I4YywKLTB4MjQ0MzAwMDEsIDB4Mjg0MjAwMTUsIDB4MTQ0MDAwMjgsIDB4YWVlMzdiOGMsCi0weDhmODIwMDQ0LCAweDM4NDIwMDIwLCAweGFmODIwMDQ0LCAweDgwMDFiMzgsCi0weGFlZTA3YjhjLCAweDhlZTIwNGQ0LCAweDMwNDIwMDAxLCAweDEwNDAwMDExLAotMHgwLCAweDhmNDIwMjE4LCAweDMwNDIwMDgwLCAweDEwNDAwMDA5LAotMHgwLCAweDhmODIwMDQ0LCAweDM0NDIwMDIwLCAweGFmODIwMDQ0LAotMHg4ZjgyMDA0NCwgMHgyNDAzZmZiZiwgMHg0MzEwMjQsIDB4ODAwMWIzNiwKLTB4YWY4MjAwNDQsIDB4OGY4MjAwNDQsIDB4MzQ0MjAwNjAsIDB4ODAwMWIzNiwKLTB4YWY4MjAwNDQsIDB4OGY4MjAwNDQsIDB4MzQ0MjAwNDAsIDB4YWY4MjAwNDQsCi0weDhlZTI3Yjg4LCAweDI0NDMwMDAxLCAweDI4NDIxMzg5LCAweDE0NDAwMDA1LAotMHhhZWUzN2I4OCwgMHg4ZjgyMDA0NCwgMHgzODQyMDAyMCwgMHhhZjgyMDA0NCwKLTB4YWVlMDdiODgsIDB4YzAwNDYwMywgMHgwLCAweDhmYmYwMDI0LAotMHg4ZmIwMDAyMCwgMHgzZTAwMDA4LCAweDI3YmQwMDI4LCAweDI3YmRmZmI4LAotMHhhZmJmMDA0NCwgMHhhZmI2MDA0MCwgMHhhZmI1MDAzYywgMHhhZmI0MDAzOCwKLTB4YWZiMzAwMzQsIDB4YWZiMjAwMzAsIDB4YWZiMTAwMmMsIDB4YWZiMDAwMjgsCi0weDhmOTYwMDY0LCAweDMyYzIwMDA0LCAweDEwNDAwMDBjLCAweDI0MDIwMDA0LAotMHhhZjgyMDA2NCwgMHg4ZjQyMDExNCwgMHhhZWUyMDRlMCwgMHg4ZjgyMDA2MCwKLTB4MzQ0MjAwMDgsIDB4YWY4MjAwNjAsIDB4OGVlMjAxNmMsIDB4MjQ0MjAwMDEsCi0weGFlZTIwMTZjLCAweDgwMDIyZjQsIDB4OGVlMjAxNmMsIDB4MzJjMjAwMDEsCi0weDEwNDAwMDA0LCAweDI0MDIwMDAxLCAweGFmODIwMDY0LCAweDgwMDIyZjQsCi0weDAsIDB4MzJjMjAwMDIsIDB4MTQ0MDAwMGMsIDB4M2MwNTAwMDMsCi0weDNjMDQwMDAxLCAweDI0ODQ1MzU0LCAweDM0YTUwMDAxLCAweDJjMDMwMjEsCi0weDM4MjEsIDB4YWZhMDAwMTAsIDB4YzAwMjQwMywgMHhhZmEwMDAxNCwKLTB4MjQwMmZmZjgsIDB4ODAwMjJmNCwgMHhhZjgyMDA2NCwgMHg4ZjQzMDIyYywKLTB4OGY0MjAxMGMsIDB4NTA2MjAwMGMsIDB4YWZhMDAwMTAsIDB4OGY0MjAyMmMsCi0weDIxMDgwLCAweDVhMTAyMSwgMHg4YzQyMDMwMCwgMHhhZmEyMDAyMCwKLTB4OGY0MjAyMmMsIDB4MjQwNzAwMDEsIDB4MjQ0MjAwMDEsIDB4MzA0MjAwM2YsCi0weDgwMDFiODAsIDB4YWY0MjAyMmMsIDB4M2MwNDAwMDEsIDB4MjQ4NDUzNjAsCi0weGFmYTAwMDE0LCAweDhmNDYwMjJjLCAweDhmNDcwMTBjLCAweDNjMDUwMDAzLAotMHhjMDAyNDAzLCAweDM0YTVmMDFmLCAweDM4MjEsIDB4MTRlMDAwMDMsCi0weDAsIDB4ODAwMjJlZCwgMHhhZjk2MDA2NCwgMHg5M2EyMDAyMCwKLTB4MjQ0M2ZmZmYsIDB4MmM2MjAwMTEsIDB4MTA0MDA2NTgsIDB4MzEwODAsCi0weDNjMDEwMDAxLCAweDIyMDgyMSwgMHg4YzIyNTQxOCwgMHg0MDAwMDgsCi0weDAsIDB4OGZhMjAwMjAsIDB4MzA0MjBmZmYsIDB4YWVlMjBlMGMsCi0weDhmODIwMDYwLCAweDM0NDIwMjAwLCAweGFmODIwMDYwLCAweDhlZTIwMTE4LAotMHgyNDQyMDAwMSwgMHhhZWUyMDExOCwgMHg4MDAyMmU4LCAweDhlZTIwMTE4LAotMHg4ZmEyMDAyMCwgMHgyNDAzMDAwMSwgMHgzYzAxMDAwMSwgMHgzNzA4MjEsCi0weGEwMjM4M2IxLCAweDMwNDIwZmZmLCAweGFlZTI1MjM4LCAweDhmODIwMDYwLAotMHgzNDQyMDEwMCwgMHhhZjgyMDA2MCwgMHg4ZWUyMDE0NCwgMHgyNDQyMDAwMSwKLTB4YWVlMjAxNDQsIDB4ODAwMjJlOCwgMHg4ZWUyMDE0NCwgMHg4ZmEyMDAyMCwKLTB4MjEyMDAsIDB4MjI1MDIsIDB4MjQwMjAwMDEsIDB4MTA4MjAwMDUsCi0weDI0MDIwMDAyLCAweDEwODIwMDA5LCAweDI0MDJmZmZlLCAweDgwMDFiYzksCi0weGFmYTAwMDEwLCAweDhlZTIwNGQ0LCAweGFlZTQwMDcwLCAweGFlZTQwMDc0LAotMHgzNDQyMDAwMSwgMHg4MDAxYmJkLCAweGFlZTIwNGQ0LCAweDhlZTMwNGQ0LAotMHhhZWU0MDA3MCwgMHhhZWU0MDA3NCwgMHg2MjE4MjQsIDB4YWVlMzA0ZDQsCi0weDhmODQwMDU0LCAweDQxNDQyLCAweDQxYzgyLCAweDQzMTAyMSwKLTB4NDFjYzIsIDB4NDMxMDIzLCAweDQxZDAyLCAweDQzMTAyMSwKLTB4NDFkNDIsIDB4NDMxMDIzLCAweDgwMDFiZDAsIDB4YWVlMjAwNzgsCi0weDNjMDQwMDAxLCAweDI0ODQ1MzZjLCAweGFmYTAwMDE0LCAweDhmYTYwMDIwLAotMHgzYzA1MDAwMywgMHhjMDAyNDAzLCAweDM0YTUwMDA0LCAweDhlZTIwMTEwLAotMHgyNDQyMDAwMSwgMHhhZWUyMDExMCwgMHg4MDAyMmU4LCAweDhlZTIwMTEwLAotMHgyNzQ0MDIxMiwgMHhjMDAyMmZlLCAweDI0MDUwMDA2LCAweDMwNDkwMDFmLAotMHg5MjBjMCwgMHgyZTQxMDIxLCAweDk0NDI3MjdjLCAweDMwNDI0MDAwLAotMHgxMDQwMDAwYSwgMHg5NzEwMjEsIDB4OTc0MzAyMTIsIDB4YTQ0MzcyN2UsCi0weDhmNDMwMjE0LCAweDk3MTAyMSwgMHhhYzQzNzI4MCwgMHgyZTQxODIxLAotMHgzNDAyODAwMCwgMHg4MDAxYzc5LCAweGE0NjI3MjdjLCAweDk0NDM3MjdlLAotMHg5NzQyMDIxMiwgMHgxNDYyMDAwNiwgMHgyZTQxMDIxLCAweDk3MTAyMSwKLTB4OGM0MzcyODAsIDB4OGY0MjAyMTQsIDB4MTA2MjAwOWYsIDB4MmU0MTAyMSwKLTB4OTQ0MjcyN2MsIDB4MzA0MjgwMDAsIDB4MTA0MDAwMmEsIDB4MjQwNmZmZmYsCi0weDIwMjEsIDB4NDEwYzAsIDB4MmUyMTAyMSwgMHg5NDQyNzM3YywKLTB4MzA0MjQwMDAsIDB4NTQ0MDAwMDUsIDB4ODAzMDIxLCAweDI0ODQwMDAxLAotMHgyYzgyMDA4MCwgMHgxNDQwZmZmOCwgMHg0MTBjMCwgMHg0YzEwMDEwLAotMHg2MThjMCwgMHg2MTBjMCwgMHg1NzE4MjEsIDB4OGM2MzczN2MsCi0weDU3MTAyMSwgMHhhZmEzMDAxMCwgMHg4YzQyNzM4MCwgMHgzYzA0MDAwMSwKLTB4MjQ4NDUzNzgsIDB4YWZhMjAwMTQsIDB4OGY0NzAyMTQsIDB4M2MwNTAwMDMsCi0weGMwMDI0MDMsIDB4MzRhNTAwMTMsIDB4ODAwMWM5MCwgMHgzYzAyMDgwMCwKLTB4OTc0NDAyMTIsIDB4NzcxMDIxLCAweGE0NDQ3MzdlLCAweDhmNDQwMjE0LAotMHg3NzEwMjEsIDB4MmUzMTgyMSwgMHhhYzQ0NzM4MCwgMHgzNDAyODAwMCwKLTB4YTQ2MjczN2MsIDB4OTEwYzAsIDB4MmUyMTAyMSwgMHg4MDAxYzc5LAotMHhhNDQ2NzI3YywgMHgyZTQxMDIxLCAweDk0NDU3MjdjLCAweDgwMDFjMmUsCi0weDUxMGMwLCAweDk0NDM3MzdlLCAweDk3NDIwMjEyLCAweDE0NjIwMDA2LAotMHg1MTBjMCwgMHg5NzEwMjEsIDB4OGM0MzczODAsIDB4OGY0MjAyMTQsCi0weDEwNjIwMDY1LCAweDUxMGMwLCAweDJlMjEwMjEsIDB4OTQ0NTczN2MsCi0weDUxMGMwLCAweDJlMjEwMjEsIDB4OTQ0MjczN2MsIDB4MzA0MjgwMDAsCi0weDEwNDBmZmYwLCAweDk3MTAyMSwgMHg1MjBjMCwgMHg5NzEwMjEsCi0weDk0NDM3MzdlLCAweDk3NDIwMjEyLCAweDE0NjIwMDA2LCAweDI0MDZmZmZmLAotMHg5NzEwMjEsIDB4OGM0MzczODAsIDB4OGY0MjAyMTQsIDB4MTA2MjAwNTMsCi0weDNjMDIwODAwLCAweDIwMjEsIDB4NDEwYzAsIDB4MmUyMTAyMSwKLTB4OTQ0MjczN2MsIDB4MzA0MjQwMDAsIDB4NTQ0MDAwMDUsIDB4ODAzMDIxLAotMHgyNDg0MDAwMSwgMHgyYzgyMDA4MCwgMHgxNDQwZmZmOCwgMHg0MTBjMCwKLTB4NGMxMDAyMywgMHg2MThjMCwgMHg5MTBjMCwgMHg1NzE4MjEsCi0weDhjNjM3MjdjLCAweDU3MTAyMSwgMHhhZmEzMDAxMCwgMHg4YzQyNzI4MCwKLTB4M2MwNDAwMDEsIDB4MjQ4NDUzODQsIDB4YWZhMjAwMTQsIDB4OGY0NzAyMTQsCi0weDNjMDUwMDAzLCAweGMwMDI0MDMsIDB4MzRhNWYwMTcsIDB4ODAwMWM5MCwKLTB4M2MwMjA4MDAsIDB4OGY0MzAyMTAsIDB4YjcxMDIxLCAweGFjNDM3NzdjLAotMHg4ZjQzMDIxNCwgMHhiNzEwMjEsIDB4YWM0Mzc3ODAsIDB4M2MwMjAwMDEsCi0weDU3MTAyMSwgMHg4YzQyODNiNCwgMHgyNDQyMDAwMSwgMHgzYzAxMDAwMSwKLTB4MzcwODIxLCAweGFjMjI4M2I0LCAweDNjMDMwMDAxLCAweDc3MTgyMSwKLTB4OGM2MzgzYjQsIDB4MmU1MTAyMSwgMHg4MDAxYzgyLCAweGE0NDM3NzdjLAotMHg5NzQ0MDIxMiwgMHg3NzEwMjEsIDB4YTQ0NDczN2UsIDB4OGY0NDAyMTQsCi0weDc3MTAyMSwgMHgyZTMxODIxLCAweGFjNDQ3MzgwLCAweDM0MDI4MDAwLAotMHhhNDYyNzM3YywgMHg1MTBjMCwgMHgyZTIxMDIxLCAweGE0NDY3MzdjLAotMHgyMDIxLCAweDQyOGMwLCAweDJlNTEwMjEsIDB4OTQ0Mjc3N2MsCi0weDEwNDBmZmRjLCAweDI0ODQwMDAxLCAweDJjODIwMDgwLCAweDU0NDBmZmZhLAotMHg0MjhjMCwgMHg5MmUyMDRkOCwgMHgxMDQwMDAwNiwgMHgyNDAyMDAwMSwKLTB4OGVlMzA0ZGMsIDB4MTIyMTAwNCwgMHg2MjE4MjUsIDB4ODAwMWM4ZiwKLTB4YWVlMzA0ZGMsIDB4OGY4MzAyMjgsIDB4MjQwMjAwMDEsIDB4MTIyMTAwNCwKLTB4NjIxODI1LCAweGFmODMwMjI4LCAweDNjMDIwODAwLCAweDM0NDIxMDAwLAotMHhhZmEyMDAxOCwgMHg4ZWUyMDYwOCwgMHg4ZjQzMDIyOCwgMHgyNDQyMDAwMSwKLTB4MzA0YTAwZmYsIDB4NTE0MzAwZmQsIDB4YWZhMDAwMTAsIDB4OGVlMjA2MDgsCi0weDIxMGMwLCAweDU3MTAyMSwgMHg4ZmEzMDAxOCwgMHg4ZmE0MDAxYywKLTB4YWM0MzA2MGMsIDB4YWM0NDA2MTAsIDB4OGY4MzAwNTQsIDB4OGY4MjAwNTQsCi0weDI0NjkwMDMyLCAweDEyMjEwMjMsIDB4MmM0MjAwMzMsIDB4MTA0MDAwNmEsCi0weDU4MjEsIDB4MjQxMDAwMDgsIDB4MjQwZjAwMGQsIDB4MjQwZDAwMDcsCi0weDI0MGMwMDQwLCAweDI0MGUwMDAxLCAweDhmODcwMTIwLCAweDI3NjIzODAwLAotMHgyNGU4MDAyMCwgMHgxMDIxMDJiLCAweDUwNDAwMDAxLCAweDI3NjgzMDAwLAotMHg4ZjgyMDEyOCwgMHgxMTAyMDAwNCwgMHgwLCAweDhmODIwMTI0LAotMHgxNTAyMDAwNywgMHgxMDIxLCAweDhlZTIwMWE0LCAweDM4MjEsCi0weDI0NDIwMDAxLCAweGFlZTIwMWE0LCAweDgwMDFkMDgsIDB4OGVlMjAxYTQsCi0weDhlZTQwNjA4LCAweDQyMGMwLCAweDgwMTgyMSwgMHg4ZWU0MDQzMCwKLTB4OGVlNTA0MzQsIDB4YTMyODIxLCAweGEzMzAyYiwgMHg4MjIwMjEsCi0weDg2MjAyMSwgMHhhY2U0MDAwMCwgMHhhY2U1MDAwNCwgMHg4ZWUyMDYwOCwKLTB4YTRmMDAwMGUsIDB4YWNlZjAwMTgsIDB4YWNlYTAwMWMsIDB4MjEwYzAsCi0weDI0NDIwNjBjLCAweDJlMjEwMjEsIDB4YWNlMjAwMDgsIDB4OGVlMjA0YzQsCi0weGFjZTIwMDEwLCAweGFmODgwMTIwLCAweDkyZTI0ZTIwLCAweDE0NDAwMDMzLAotMHgyNDA3MDAwMSwgMHg4ZWUyNGUzMCwgMHgyMTBjMCwgMHgyNDQyNTAzOCwKLTB4MmUyMjAyMSwgMHg4YzgyMDAwMCwgMHgxNDRkMDAxZiwgMHgwLAotMHg4ZWUzNGUzMCwgMHg4ZWUyNGUzNCwgMHgxMDYyMDAxYiwgMHgwLAotMHg4YzgyMDAwNCwgMHgyNDQyMDAwMSwgMHhhYzgyMDAwNCwgMHg4ZWUyNGUzNCwKLTB4OGVlMzRlMzAsIDB4MjQ0MjAwMDEsIDB4MTA0YzAwMDcsIDB4MCwKLTB4OGVlMjRlMzQsIDB4MjQ0MjAwMDEsIDB4MTA2MjAwMDUsIDB4MCwKLTB4ODAwMWNmNSwgMHgwLCAweDE0NjAwMDA1LCAweDAsCi0weDhmODIwMTI4LCAweDI0NDIwMDIwLCAweGFmODIwMTI4LCAweDhmODIwMTI4LAotMHg4YzgyMDAwNCwgMHgyYzQyMDAxMSwgMHg1MDQwMDAxMCwgMHhhYzgwMDAwMCwKLTB4ODAwMWQwOCwgMHgwLCAweDhlZTI0ZTMwLCAweDI0NDIwMDAxLAotMHg1MDRjMDAwMywgMHgxMDIxLCAweDhlZTI0ZTMwLCAweDI0NDIwMDAxLAotMHhhZWUyNGUzMCwgMHg4ZWUyNGUzMCwgMHgyMTBjMCwgMHgyNDQyNTAzOCwKLTB4MmUyMjAyMSwgMHhhYzhkMDAwMCwgMHhhYzhlMDAwNCwgMHg1NGUwMDAwNiwKLTB4MjQwYjAwMDEsIDB4OGY4MjAwNTQsIDB4MTIyMTAyMywgMHgyYzQyMDAzMywKLTB4MTQ0MGZmOWQsIDB4MCwgMHgzMTYzMDBmZiwgMHgyNDAyMDAwMSwKLTB4NTQ2MjAwNzgsIDB4YWZhMDAwMTAsIDB4YWVlYTA2MDgsIDB4OGY4MzAwNTQsCi0weDhmODIwMDU0LCAweDI0NjkwMDMyLCAweDEyMjEwMjMsIDB4MmM0MjAwMzMsCi0weDEwNDAwMDYxLCAweDU4MjEsIDB4MjQwZTAwMDgsIDB4MjQwZDAwMTEsCi0weDI0MGEwMDEyLCAweDI0MDgwMDQwLCAweDI0MGMwMDAxLCAweDhmODMwMTIwLAotMHgyNzYyMzgwMCwgMHgyNDY2MDAyMCwgMHhjMjEwMmIsIDB4NTA0MDAwMDEsCi0weDI3NjYzMDAwLCAweDhmODIwMTI4LCAweDEwYzIwMDA0LCAweDAsCi0weDhmODIwMTI0LCAweDE0YzIwMDA3LCAweDAsIDB4OGVlMjAxYTQsCi0weDM4MjEsIDB4MjQ0MjAwMDEsIDB4YWVlMjAxYTQsIDB4ODAwMWQ3NCwKLTB4OGVlMjAxYTQsIDB4OGVlMjA2MDgsIDB4YWM2MjAwMWMsIDB4OGVlNDA0YTAsCi0weDhlZTUwNGE0LCAweDI0NjIwMDFjLCAweGFjNjIwMDA4LCAweGE0NmUwMDBlLAotMHhhYzZkMDAxOCwgMHhhYzY0MDAwMCwgMHhhYzY1MDAwNCwgMHg4ZWUyMDRjNCwKLTB4YWM2MjAwMTAsIDB4YWY4NjAxMjAsIDB4OTJlMjRlMjAsIDB4MTQ0MDAwMzMsCi0weDI0MDcwMDAxLCAweDhlZTI0ZTMwLCAweDIxMGMwLCAweDI0NDI1MDM4LAotMHgyZTIyMDIxLCAweDhjODIwMDAwLCAweDE0NGEwMDFmLCAweDAsCi0weDhlZTM0ZTMwLCAweDhlZTI0ZTM0LCAweDEwNjIwMDFiLCAweDAsCi0weDhjODIwMDA0LCAweDI0NDIwMDAxLCAweGFjODIwMDA0LCAweDhlZTI0ZTM0LAotMHg4ZWUzNGUzMCwgMHgyNDQyMDAwMSwgMHgxMDQ4MDAwNywgMHgwLAotMHg4ZWUyNGUzNCwgMHgyNDQyMDAwMSwgMHgxMDYyMDAwNSwgMHgwLAotMHg4MDAxZDYxLCAweDAsIDB4MTQ2MDAwMDUsIDB4MCwKLTB4OGY4MjAxMjgsIDB4MjQ0MjAwMjAsIDB4YWY4MjAxMjgsIDB4OGY4MjAxMjgsCi0weDhjODIwMDA0LCAweDJjNDIwMDExLCAweDUwNDAwMDEwLCAweGFjODAwMDAwLAotMHg4MDAxZDc0LCAweDAsIDB4OGVlMjRlMzAsIDB4MjQ0MjAwMDEsCi0weDUwNDgwMDAzLCAweDEwMjEsIDB4OGVlMjRlMzAsIDB4MjQ0MjAwMDEsCi0weGFlZTI0ZTMwLCAweDhlZTI0ZTMwLCAweDIxMGMwLCAweDI0NDI1MDM4LAotMHgyZTIyMDIxLCAweGFjOGEwMDAwLCAweGFjOGMwMDA0LCAweDU0ZTAwMDA2LAotMHgyNDBiMDAwMSwgMHg4ZjgyMDA1NCwgMHgxMjIxMDIzLCAweDJjNDIwMDMzLAotMHgxNDQwZmZhNiwgMHgwLCAweDMxNjMwMGZmLCAweDI0MDIwMDAxLAotMHgxMDYyMDAyMiwgMHgwLCAweDNjMDQwMDAxLCAweDI0ODQ1MzkwLAotMHhhZmEwMDAxMCwgMHhhZmEwMDAxNCwgMHg4Zjg2MDEyMCwgMHg4Zjg3MDEyNCwKLTB4M2MwNTAwMDksIDB4YzAwMjQwMywgMHgzNGE1ZjAxMSwgMHg4MDAxZGEwLAotMHgwLCAweDNjMDQwMDAxLCAweDI0ODQ1MzljLCAweGFmYTAwMDE0LAotMHg4Zjg2MDEyMCwgMHg4Zjg3MDEyNCwgMHgzYzA1MDAwOSwgMHhjMDAyNDAzLAotMHgzNGE1ZjAxMCwgMHg4MDAxZGEwLCAweDAsIDB4M2MwNDAwMDEsCi0weDI0ODQ1M2E4LCAweGFmYTAwMDE0LCAweDhlZTYwNjA4LCAweDhmNDcwMjI4LAotMHgzYzA1MDAwOSwgMHhjMDAyNDAzLCAweDM0YTVmMDBmLCAweDhlZTIwMWFjLAotMHgyNDQyMDAwMSwgMHhhZWUyMDFhYywgMHg4ZWUyMDFhYywgMHg4ZWUyMDEyNCwKLTB4MjQ0MjAwMDEsIDB4YWVlMjAxMjQsIDB4ODAwMWY5NywgMHg4ZWUyMDEyNCwKLTB4Mjc0NDAyMTIsIDB4YzAwMjJmZSwgMHgyNDA1MDAwNiwgMHgzMDQ5MDAxZiwKLTB4OTI4YzAsIDB4MmU1MTAyMSwgMHg5NDQyNzI3YywgMHgzMDQyODAwMCwKLTB4MTA0MDAwMmYsIDB4MmU1MTAyMSwgMHg5NDQyNzI3YywgMHgzMDQyNDAwMCwKLTB4MTQ0MDAwMWMsIDB4YjcxMDIxLCAweDk0NDM3MjdlLCAweDk3NDIwMjEyLAotMHgxNDYyMDAxOCwgMHhiNzEwMjEsIDB4OGM0MzcyODAsIDB4OGY0MjAyMTQsCi0weDU0NjIwMDE2LCAweGFmYTIwMDEwLCAweDkyZTIwNGQ4LCAweDEwNDAwMDA3LAotMHgyNDAyMDAwMSwgMHg4ZWUzMDRkYywgMHgxMjIxMDA0LCAweDIxMDI3LAotMHg2MjE4MjQsIDB4ODAwMWRjOSwgMHhhZWUzMDRkYywgMHg4ZjgzMDIyOCwKLTB4MTIyMTAwNCwgMHgyMTAyNywgMHg2MjE4MjQsIDB4YWY4MzAyMjgsCi0weDkxMGMwLCAweDJlMjE4MjEsIDB4MzQwMmMwMDAsIDB4ODAwMWU0ZSwKLTB4YTQ2MjcyN2MsIDB4OGY0MjAyMTQsIDB4YWZhMjAwMTAsIDB4OTEwYzAsCi0weDU3MTAyMSwgMHg4YzQyNzI3YywgMHgzYzA0MDAwMSwgMHgyNDg0NTNiNCwKLTB4M2MwNTAwMDMsIDB4YWZhMjAwMTQsIDB4OGY0NzAyMTAsIDB4MzRhNWYwMWMsCi0weGMwMDI0MDMsIDB4MTIwMzAyMSwgMHg4MDAxZTgzLCAweDNjMDIwODAwLAotMHhiNzEwMjEsIDB4OTQ0MzcyN2UsIDB4OTc0MjAyMTIsIDB4MTQ2MjAwMTksCi0weDkxOGMwLCAweGI3MTAyMSwgMHg4YzQzNzI4MCwgMHg4ZjQyMDIxNCwKLTB4MTQ2MjAwMTQsIDB4OTE4YzAsIDB4MmU1MTAyMSwgMHg5NDQ3NzI3YywKLTB4NzIwYzAsIDB4OTcxMDIxLCAweDk0NDM3MzdlLCAweGI3MTAyMSwKLTB4YTQ0MzcyN2UsIDB4OTcxMDIxLCAweDhjNDM3MzgwLCAweGI3MTAyMSwKLTB4YWM0MzcyODAsIDB4MmU0MTAyMSwgMHg5NDQzNzM3YywgMHgyZTUxMDIxLAotMHhhNDQzNzI3YywgMHgyZTQxODIxLCAweDM0MDJjMDAwLCAweDgwMDFlNGUsCi0weGE0NjI3MzdjLCAweDJlMzEwMjEsIDB4OTQ0NzcyN2MsIDB4MzAyMSwKLTB4NzIwYzAsIDB4MmU0MTAyMSwgMHg5NDQyNzM3YywgMHg0MDIxLAotMHgzMDQyODAwMCwgMHgxNDQwMDAyNSwgMHhlMDI4MjEsIDB4NjA1MDIxLAotMHgzNDBiYzAwMCwgMHg5NzEwMjEsIDB4OTQ0MzczN2UsIDB4OTc0MjAyMTIsCi0weDU0NjIwMDE1LCAweGUwMjgyMSwgMHg5NzEwMjEsIDB4OGM0MzczODAsCi0weDhmNDIwMjE0LCAweDU0NjIwMDEwLCAweGUwMjgyMSwgMHgxMTAwMDAwNiwKLTB4MmU0MTAyMSwgMHg5NDQzNzM3YywgMHg1MTBjMCwgMHgyZTIxMDIxLAotMHg4MDAxZTFhLCAweGE0NDM3MzdjLCAweDk0NDM3MzdjLCAweDJlYTEwMjEsCi0weGE0NDM3MjdjLCAweDcxMGMwLCAweDJlMjEwMjEsIDB4YTQ0YjczN2MsCi0weDgwMDFlMjgsIDB4MjQwNjAwMDEsIDB4NTEwYzAsIDB4MmUyMTAyMSwKLTB4OTQ0NzczN2MsIDB4NzIwYzAsIDB4MmU0MTAyMSwgMHg5NDQyNzM3YywKLTB4MzA0MjgwMDAsIDB4MTA0MGZmZGYsIDB4MjUwODAwMDEsIDB4MzBjMjAwZmYsCi0weDE0NDAwMDI1LCAweDIwMjEsIDB4NzIwYzAsIDB4OTcxMDIxLAotMHg5NDQzNzM3ZSwgMHg5NzQyMDIxMiwgMHgxNDYyMDAwZiwgMHg5MTBjMCwKLTB4OTcxMDIxLCAweDhjNDM3MzgwLCAweDhmNDIwMjE0LCAweDE0NjIwMDBhLAotMHg5MTBjMCwgMHgyZTQxODIxLCAweDM0MDJjMDAwLCAweDE1MDAwMDE1LAotMHhhNDYyNzM3YywgMHg5MTBjMCwgMHgyZTIxODIxLCAweDM0MDI4MDAwLAotMHg4MDAxZTRlLCAweGE0NjI3MjdjLCAweDU3MTAyMSwgMHg4YzQyNzI3YywKLTB4M2MwNDAwMDEsIDB4MjQ4NDUzYzAsIDB4M2MwNTAwMDMsIDB4YWZhMjAwMTAsCi0weDcxMGMwLCAweDU3MTAyMSwgMHg4YzQyNzM3YywgMHgzNGE1MDAxZSwKLTB4MTIwMzAyMSwgMHhjMDAyNDAzLCAweGFmYTIwMDE0LCAweDgwMDFlODMsCi0weDNjMDIwODAwLCAweDIwMjEsIDB4NDI4YzAsIDB4YjcxMDIxLAotMHg5NDQzNzc3ZSwgMHg5NzQyMDIxMiwgMHg1NDYyMDAyYiwgMHgyNDg0MDAwMSwKLTB4YjcxMDIxLCAweDhjNDM3NzgwLCAweDhmNDIwMjE0LCAweDU0NjIwMDI2LAotMHgyNDg0MDAwMSwgMHgzYzAyMDAwMSwgMHg1NzEwMjEsIDB4OGM0MjgzYjQsCi0weDI0NDJmZmZmLCAweDNjMDEwMDAxLCAweDM3MDgyMSwgMHhhYzIyODNiNCwKLTB4M2MwMjAwMDEsIDB4NTcxMDIxLCAweDhjNDI4M2I0LCAweDgwOTAyMSwKLTB4MjQyMTAyYiwgMHgxMDQwMDAwZSwgMHgyNGIxNzc3YywgMHgyNGIwNzc4NCwKLTB4MmYwMjAyMSwgMHgyZjEyODIxLCAweGMwMDI0OTAsIDB4MjQwNjAwMDgsCi0weDI2MzEwMDA4LCAweDNjMDIwMDAxLCAweDU3MTAyMSwgMHg4YzQyODNiNCwKLTB4MjY1MjAwMDEsIDB4MjQyMTAyYiwgMHgxNDQwZmZmNSwgMHgyNjEwMDAwOCwKLTB4M2MwNDAwMDEsIDB4OTcyMDIxLCAweDhjODQ4M2I0LCAweDI0MDUwMDA4LAotMHg0MjBjMCwgMHgyNDg0Nzc3YywgMHhjMDAyNDg4LCAweDJlNDIwMjEsCi0weDgwMDFlODMsIDB4M2MwMjA4MDAsIDB4MmM4MjAwODAsIDB4MTQ0MGZmY2YsCi0weDQyOGMwLCAweDNjMDIwODAwLCAweDM0NDIyMDAwLCAweGFmYTIwMDE4LAotMHg4ZWUyMDYwOCwgMHg4ZjQzMDIyOCwgMHgyNDQyMDAwMSwgMHgzMDRhMDBmZiwKLTB4NTE0MzAwZmQsIDB4YWZhMDAwMTAsIDB4OGVlMjA2MDgsIDB4MjEwYzAsCi0weDU3MTAyMSwgMHg4ZmEzMDAxOCwgMHg4ZmE0MDAxYywgMHhhYzQzMDYwYywKLTB4YWM0NDA2MTAsIDB4OGY4MzAwNTQsIDB4OGY4MjAwNTQsIDB4MjQ2OTAwMzIsCi0weDEyMjEwMjMsIDB4MmM0MjAwMzMsIDB4MTA0MDAwNmEsIDB4NTgyMSwKLTB4MjQxMDAwMDgsIDB4MjQwZjAwMGQsIDB4MjQwZDAwMDcsIDB4MjQwYzAwNDAsCi0weDI0MGUwMDAxLCAweDhmODcwMTIwLCAweDI3NjIzODAwLCAweDI0ZTgwMDIwLAotMHgxMDIxMDJiLCAweDUwNDAwMDAxLCAweDI3NjgzMDAwLCAweDhmODIwMTI4LAotMHgxMTAyMDAwNCwgMHgwLCAweDhmODIwMTI0LCAweDE1MDIwMDA3LAotMHgxMDIxLCAweDhlZTIwMWE0LCAweDM4MjEsIDB4MjQ0MjAwMDEsCi0weGFlZTIwMWE0LCAweDgwMDFlZmIsIDB4OGVlMjAxYTQsIDB4OGVlNDA2MDgsCi0weDQyMGMwLCAweDgwMTgyMSwgMHg4ZWU0MDQzMCwgMHg4ZWU1MDQzNCwKLTB4YTMyODIxLCAweGEzMzAyYiwgMHg4MjIwMjEsIDB4ODYyMDIxLAotMHhhY2U0MDAwMCwgMHhhY2U1MDAwNCwgMHg4ZWUyMDYwOCwgMHhhNGYwMDAwZSwKLTB4YWNlZjAwMTgsIDB4YWNlYTAwMWMsIDB4MjEwYzAsIDB4MjQ0MjA2MGMsCi0weDJlMjEwMjEsIDB4YWNlMjAwMDgsIDB4OGVlMjA0YzQsIDB4YWNlMjAwMTAsCi0weGFmODgwMTIwLCAweDkyZTI0ZTIwLCAweDE0NDAwMDMzLCAweDI0MDcwMDAxLAotMHg4ZWUyNGUzMCwgMHgyMTBjMCwgMHgyNDQyNTAzOCwgMHgyZTIyMDIxLAotMHg4YzgyMDAwMCwgMHgxNDRkMDAxZiwgMHgwLCAweDhlZTM0ZTMwLAotMHg4ZWUyNGUzNCwgMHgxMDYyMDAxYiwgMHgwLCAweDhjODIwMDA0LAotMHgyNDQyMDAwMSwgMHhhYzgyMDAwNCwgMHg4ZWUyNGUzNCwgMHg4ZWUzNGUzMCwKLTB4MjQ0MjAwMDEsIDB4MTA0YzAwMDcsIDB4MCwgMHg4ZWUyNGUzNCwKLTB4MjQ0MjAwMDEsIDB4MTA2MjAwMDUsIDB4MCwgMHg4MDAxZWU4LAotMHgwLCAweDE0NjAwMDA1LCAweDAsIDB4OGY4MjAxMjgsCi0weDI0NDIwMDIwLCAweGFmODIwMTI4LCAweDhmODIwMTI4LCAweDhjODIwMDA0LAotMHgyYzQyMDAxMSwgMHg1MDQwMDAxMCwgMHhhYzgwMDAwMCwgMHg4MDAxZWZiLAotMHgwLCAweDhlZTI0ZTMwLCAweDI0NDIwMDAxLCAweDUwNGMwMDAzLAotMHgxMDIxLCAweDhlZTI0ZTMwLCAweDI0NDIwMDAxLCAweGFlZTI0ZTMwLAotMHg4ZWUyNGUzMCwgMHgyMTBjMCwgMHgyNDQyNTAzOCwgMHgyZTIyMDIxLAotMHhhYzhkMDAwMCwgMHhhYzhlMDAwNCwgMHg1NGUwMDAwNiwgMHgyNDBiMDAwMSwKLTB4OGY4MjAwNTQsIDB4MTIyMTAyMywgMHgyYzQyMDAzMywgMHgxNDQwZmY5ZCwKLTB4MCwgMHgzMTYzMDBmZiwgMHgyNDAyMDAwMSwgMHg1NDYyMDA3OCwKLTB4YWZhMDAwMTAsIDB4YWVlYTA2MDgsIDB4OGY4MzAwNTQsIDB4OGY4MjAwNTQsCi0weDI0NjkwMDMyLCAweDEyMjEwMjMsIDB4MmM0MjAwMzMsIDB4MTA0MDAwNjEsCi0weDU4MjEsIDB4MjQwZTAwMDgsIDB4MjQwZDAwMTEsIDB4MjQwYTAwMTIsCi0weDI0MDgwMDQwLCAweDI0MGMwMDAxLCAweDhmODMwMTIwLCAweDI3NjIzODAwLAotMHgyNDY2MDAyMCwgMHhjMjEwMmIsIDB4NTA0MDAwMDEsIDB4Mjc2NjMwMDAsCi0weDhmODIwMTI4LCAweDEwYzIwMDA0LCAweDAsIDB4OGY4MjAxMjQsCi0weDE0YzIwMDA3LCAweDAsIDB4OGVlMjAxYTQsIDB4MzgyMSwKLTB4MjQ0MjAwMDEsIDB4YWVlMjAxYTQsIDB4ODAwMWY2NywgMHg4ZWUyMDFhNCwKLTB4OGVlMjA2MDgsIDB4YWM2MjAwMWMsIDB4OGVlNDA0YTAsIDB4OGVlNTA0YTQsCi0weDI0NjIwMDFjLCAweGFjNjIwMDA4LCAweGE0NmUwMDBlLCAweGFjNmQwMDE4LAotMHhhYzY0MDAwMCwgMHhhYzY1MDAwNCwgMHg4ZWUyMDRjNCwgMHhhYzYyMDAxMCwKLTB4YWY4NjAxMjAsIDB4OTJlMjRlMjAsIDB4MTQ0MDAwMzMsIDB4MjQwNzAwMDEsCi0weDhlZTI0ZTMwLCAweDIxMGMwLCAweDI0NDI1MDM4LCAweDJlMjIwMjEsCi0weDhjODIwMDAwLCAweDE0NGEwMDFmLCAweDAsIDB4OGVlMzRlMzAsCi0weDhlZTI0ZTM0LCAweDEwNjIwMDFiLCAweDAsIDB4OGM4MjAwMDQsCi0weDI0NDIwMDAxLCAweGFjODIwMDA0LCAweDhlZTI0ZTM0LCAweDhlZTM0ZTMwLAotMHgyNDQyMDAwMSwgMHgxMDQ4MDAwNywgMHgwLCAweDhlZTI0ZTM0LAotMHgyNDQyMDAwMSwgMHgxMDYyMDAwNSwgMHgwLCAweDgwMDFmNTQsCi0weDAsIDB4MTQ2MDAwMDUsIDB4MCwgMHg4ZjgyMDEyOCwKLTB4MjQ0MjAwMjAsIDB4YWY4MjAxMjgsIDB4OGY4MjAxMjgsIDB4OGM4MjAwMDQsCi0weDJjNDIwMDExLCAweDUwNDAwMDEwLCAweGFjODAwMDAwLCAweDgwMDFmNjcsCi0weDAsIDB4OGVlMjRlMzAsIDB4MjQ0MjAwMDEsIDB4NTA0ODAwMDMsCi0weDEwMjEsIDB4OGVlMjRlMzAsIDB4MjQ0MjAwMDEsIDB4YWVlMjRlMzAsCi0weDhlZTI0ZTMwLCAweDIxMGMwLCAweDI0NDI1MDM4LCAweDJlMjIwMjEsCi0weGFjOGEwMDAwLCAweGFjOGMwMDA0LCAweDU0ZTAwMDA2LCAweDI0MGIwMDAxLAotMHg4ZjgyMDA1NCwgMHgxMjIxMDIzLCAweDJjNDIwMDMzLCAweDE0NDBmZmE2LAotMHgwLCAweDMxNjMwMGZmLCAweDI0MDIwMDAxLCAweDEwNjIwMDIyLAotMHgwLCAweDNjMDQwMDAxLCAweDI0ODQ1MzkwLCAweGFmYTAwMDEwLAotMHhhZmEwMDAxNCwgMHg4Zjg2MDEyMCwgMHg4Zjg3MDEyNCwgMHgzYzA1MDAwOSwKLTB4YzAwMjQwMywgMHgzNGE1ZjAxMSwgMHg4MDAxZjkzLCAweDAsCi0weDNjMDQwMDAxLCAweDI0ODQ1MzljLCAweGFmYTAwMDE0LCAweDhmODYwMTIwLAotMHg4Zjg3MDEyNCwgMHgzYzA1MDAwOSwgMHhjMDAyNDAzLCAweDM0YTVmMDEwLAotMHg4MDAxZjkzLCAweDAsIDB4M2MwNDAwMDEsIDB4MjQ4NDUzYTgsCi0weGFmYTAwMDE0LCAweDhlZTYwNjA4LCAweDhmNDcwMjI4LCAweDNjMDUwMDA5LAotMHhjMDAyNDAzLCAweDM0YTVmMDBmLCAweDhlZTIwMWFjLCAweDI0NDIwMDAxLAotMHhhZWUyMDFhYywgMHg4ZWUyMDFhYywgMHg4ZWUyMDEyOCwgMHgyNDQyMDAwMSwKLTB4YWVlMjAxMjgsIDB4OGVlMjAxMjgsIDB4OGVlMjAxNjQsIDB4MjQ0MjAwMDEsCi0weGFlZTIwMTY0LCAweDgwMDIyZTgsIDB4OGVlMjAxNjQsIDB4OGZhMjAwMjAsCi0weDIxMjAwLCAweDIxZDAyLCAweDI0MDIwMDAxLCAweDEwNjIwMDA1LAotMHgyNDAyMDAwMiwgMHgxMDYyMDAwZCwgMHgwLCAweDgwMDFmYjcsCi0weGFmYTAwMDEwLCAweDkyZTIwNGQ4LCAweDE0NDAwMDA2LCAweDI0MDIwMDAxLAotMHg4ZjgyMDIyOCwgMHhhZWUyMDRkYywgMHgyNDAyZmZmZiwgMHhhZjgyMDIyOCwKLTB4MjQwMjAwMDEsIDB4ODAwMWZiZSwgMHhhMmUyMDRkOCwgMHg5MmUyMDRkOCwKLTB4NTA0MDAwMGMsIDB4YTJlMDA0ZDgsIDB4OGVlMjA0ZGMsIDB4YWY4MjAyMjgsCi0weDgwMDFmYmUsIDB4YTJlMDA0ZDgsIDB4M2MwNDAwMDEsIDB4MjQ4NDUzYzgsCi0weGFmYTAwMDE0LCAweDhmYTYwMDIwLCAweDNjMDUwMDAzLCAweGMwMDI0MDMsCi0weDM0YTVmMDA5LCAweDhlZTIwMTNjLCAweDI0NDIwMDAxLCAweGFlZTIwMTNjLAotMHg4MDAyMmU4LCAweDhlZTIwMTNjLCAweDhmYTIwMDIwLCAweDIxMjAwLAotMHgyMjUwMiwgMHgyNDAyMDAwMSwgMHgxMDgyMDAwNSwgMHgyNDAyMDAwMiwKLTB4MTA4MjAwMGYsIDB4MCwgMHg4MDAxZmUzLCAweGFmYTAwMDEwLAotMHg4ZjgyMDIyMCwgMHgzYzAzMDhmZiwgMHgzNDYzZmZmZiwgMHg0MzEwMjQsCi0weDM0NDIwMDA4LCAweGFmODIwMjIwLCAweDI0MDIwMDAxLCAweDNjMDEwMDAxLAotMHgzNzA4MjEsIDB4YTAyMjgzYjIsIDB4ODAwMWZlYSwgMHhhZWU0MDEwOCwKLTB4OGY4MjAyMjAsIDB4M2MwMzA4ZmYsIDB4MzQ2M2ZmZjcsIDB4NDMxMDI0LAotMHhhZjgyMDIyMCwgMHgzYzAxMDAwMSwgMHgzNzA4MjEsIDB4YTAyMDgzYjIsCi0weDgwMDFmZWEsIDB4YWVlNDAxMDgsIDB4M2MwNDAwMDEsIDB4MjQ4NDUzZDQsCi0weGFmYTAwMDE0LCAweDhmYTYwMDIwLCAweDNjMDUwMDAzLCAweGMwMDI0MDMsCi0weDM0YTVmMDBhLCAweDhlZTIwMTJjLCAweDI0NDIwMDAxLCAweGFlZTIwMTJjLAotMHg4MDAyMmU4LCAweDhlZTIwMTJjLCAweDhmYTIwMDIwLCAweDIxMjAwLAotMHgyMWQwMiwgMHgyNDAyMDAwMSwgMHgxMDYyMDAwNSwgMHgyNDAyMDAwMiwKLTB4MTA2MjAwMGUsIDB4MCwgMHg4MDAyMDExLCAweGFmYTAwMDEwLAotMHg4ZjgyMDIyMCwgMHgzYzAzMDhmZiwgMHgzNDYzZmZmZiwgMHg0MzEwMjQsCi0weDM0NDIwMDA4LCAweGFmODIwMjIwLCAweDI0MDIwMDAxLCAweDNjMDEwMDAxLAotMHgzNzA4MjEsIDB4ODAwMjAxOCwgMHhhMDIyODNiMywgMHgzYzAyMDAwMSwKLTB4NTcxMDIxLCAweDkwNDI4M2IyLCAweDNjMDEwMDAxLCAweDM3MDgyMSwKLTB4MTQ0MDAwMGUsIDB4YTAyMDgzYjMsIDB4OGY4MjAyMjAsIDB4M2MwMzA4ZmYsCi0weDM0NjNmZmY3LCAweDQzMTAyNCwgMHg4MDAyMDE4LCAweGFmODIwMjIwLAotMHgzYzA0MDAwMSwgMHgyNDg0NTNlMCwgMHhhZmEwMDAxNCwgMHg4ZmE2MDAyMCwKLTB4M2MwNTAwMDMsIDB4YzAwMjQwMywgMHgzNGE1ZjAwYiwgMHg4ZWUyMDExNCwKLTB4MjQ0MjAwMDEsIDB4YWVlMjAxMTQsIDB4ODAwMjJlOCwgMHg4ZWUyMDExNCwKLTB4Mjc4NDAyMDgsIDB4Mjc0NTAyMDAsIDB4YzAwMjQ5YSwgMHgyNDA2MDAwOCwKLTB4MjZlNDAwOTQsIDB4Mjc0NTAyMDAsIDB4YzAwMjQ5YSwgMHgyNDA2MDAwOCwKLTB4OGVlMjAxMzQsIDB4MjQ0MjAwMDEsIDB4YWVlMjAxMzQsIDB4ODAwMjJlOCwKLTB4OGVlMjAxMzQsIDB4OGY0NjAyNDgsIDB4MjAyMSwgMHhjMDA1MTA4LAotMHgyNDA1MDAwNCwgMHg4ZWUyMDEzMCwgMHgyNDQyMDAwMSwgMHhhZWUyMDEzMCwKLTB4ODAwMjJlOCwgMHg4ZWUyMDEzMCwgMHg4ZWYzMDFjYywgMHg4ZWY0MDFkMCwKLTB4OGVmNTAxZDgsIDB4OGVlMjAxNDAsIDB4MjZlNDAwMzAsIDB4MjQ0MjAwMDEsCi0weGFlZTIwMTQwLCAweDhlZjAwMTQwLCAweDhlZjEwMDc0LCAweDhlZjIwMDcwLAotMHhjMDAyNDg4LCAweDI0MDUwNDAwLCAweGFlZjMwMWNjLCAweGFlZjQwMWQwLAotMHhhZWY1MDFkOCwgMHhhZWYwMDE0MCwgMHhhZWYxMDA3NCwgMHhhZWYyMDA3MCwKLTB4OGY0MjAyNWMsIDB4MjZlNDAwOTQsIDB4YWVlMjAwNjAsIDB4OGY0MjAyNjAsCi0weDI3NDUwMjAwLCAweDI0MDYwMDA4LCAweGFlZTIwMDY4LCAweDI0MDIwMDA2LAotMHhjMDAyNDlhLCAweGFlZTIwMDY0LCAweDNjMDIzYjlhLCAweDM0NDJjYTAwLAotMHhhZWUyMDA2YywgMHgyNDAyMDNlOCwgMHgyNDA0MDAwMiwgMHgyNDAzMDAwMSwKLTB4YWVlMjAxMDQsIDB4YWVlNDAxMDAsIDB4YWVlMzAxMGMsIDB4OGY4MjAyMjAsCi0weDMwNDIwMDA4LCAweDEwNDAwMDA0LCAweDAsIDB4YWVlMzAxMDgsCi0weDgwMDIwNjEsIDB4MjAyMSwgMHhhZWU0MDEwOCwgMHgyMDIxLAotMHgzYzAzMDAwMSwgMHg2NDE4MjEsIDB4OTA2MzVjMzAsIDB4MmU0MTAyMSwKLTB4MjQ4NDAwMDEsIDB4YTA0MzAwOWMsIDB4MmM4MjAwMGYsIDB4MTQ0MGZmZjgsCi0weDAsIDB4OGY4MjAwNDAsIDB4MmU0MTgyMSwgMHgyNDg0MDAwMSwKLTB4MjE3MDIsIDB4MjQ0MjAwMzAsIDB4YTA2MjAwOWMsIDB4MmU0MTAyMSwKLTB4ODAwMjJlOCwgMHhhMDQwMDA5YywgMHgyNDAyMDAwMSwgMHgzYzAxMDAwMSwKLTB4MzcwODIxLCAweGEwMjI4M2UwLCAweDI0MGIwNDAwLCAweDI0MDgwMDE0LAotMHgyNDBhMDA0MCwgMHgyNDA5MDAwMSwgMHg4ZjgzMDEwMCwgMHgyNzYyMzAwMCwKLTB4MjQ2NjAwMjAsIDB4YzIxMDJiLCAweDUwNDAwMDAxLCAweDI3NjYyODAwLAotMHg4ZjgyMDEwOCwgMHgxMGMyMDAwNCwgMHgwLCAweDhmODIwMTA0LAotMHgxNGMyMDAwNywgMHgyNmUyMDAzMCwgMHg4ZWUyMDFhOCwgMHgzODIxLAotMHgyNDQyMDAwMSwgMHhhZWUyMDFhOCwgMHg4MDAyMGE4LCAweDhlZTIwMWE4LAotMHg4ZWU0MDRiOCwgMHg4ZWU1MDRiYywgMHhhYzYyMDAwOCwgMHhhNDZiMDAwZSwKLTB4YWM2ODAwMTgsIDB4YWM2MDAwMWMsIDB4YWM2NDAwMDAsIDB4YWM2NTAwMDQsCi0weDhlZTIwNGNjLCAweGFjNjIwMDEwLCAweGFmODYwMTAwLCAweDkyZTIwNGVjLAotMHgxNDQwMDAwZSwgMHgyNDA3MDAwMSwgMHg4ZWUyNGUyOCwgMHgyNDQyMDAwMSwKLTB4NTA0YTAwMDMsIDB4MTAyMSwgMHg4ZWUyNGUyOCwgMHgyNDQyMDAwMSwKLTB4YWVlMjRlMjgsIDB4OGVlMjRlMjgsIDB4MjEwYzAsIDB4MjQ0MjRlMzgsCi0weDJlMjEwMjEsIDB4YWM0ODAwMDAsIDB4YWM0OTAwMDQsIDB4MTBlMGZmZDIsCi0weDAsIDB4ODAwMjJlOCwgMHgwLCAweDNjMDIwOTAwLAotMHhhZWUwNTIzOCwgMHhhZWUwNTIzYywgMHhhZWUwNTI0MCwgMHhhZWUwNTI0NCwKLTB4YWVlMDAxZDAsIDB4M2MwMTAwMDEsIDB4MzcwODIxLCAweGEwMjA4M2IxLAotMHhhZmEyMDAxOCwgMHg4ZWUyMDYwOCwgMHg4ZjQzMDIyOCwgMHgyNDQyMDAwMSwKLTB4MzA0YTAwZmYsIDB4NTE0MzAwZmQsIDB4YWZhMDAwMTAsIDB4OGVlMjA2MDgsCi0weDIxMGMwLCAweDU3MTAyMSwgMHg4ZmEzMDAxOCwgMHg4ZmE0MDAxYywKLTB4YWM0MzA2MGMsIDB4YWM0NDA2MTAsIDB4OGY4MzAwNTQsIDB4OGY4MjAwNTQsCi0weDI0NjkwMDMyLCAweDEyMjEwMjMsIDB4MmM0MjAwMzMsIDB4MTA0MDAwNmEsCi0weDU4MjEsIDB4MjQxMDAwMDgsIDB4MjQwZjAwMGQsIDB4MjQwZDAwMDcsCi0weDI0MGMwMDQwLCAweDI0MGUwMDAxLCAweDhmODcwMTIwLCAweDI3NjIzODAwLAotMHgyNGU4MDAyMCwgMHgxMDIxMDJiLCAweDUwNDAwMDAxLCAweDI3NjgzMDAwLAotMHg4ZjgyMDEyOCwgMHgxMTAyMDAwNCwgMHgwLCAweDhmODIwMTI0LAotMHgxNTAyMDAwNywgMHgxMDIxLCAweDhlZTIwMWE0LCAweDM4MjEsCi0weDI0NDIwMDAxLCAweGFlZTIwMWE0LCAweDgwMDIxMmMsIDB4OGVlMjAxYTQsCi0weDhlZTQwNjA4LCAweDQyMGMwLCAweDgwMTgyMSwgMHg4ZWU0MDQzMCwKLTB4OGVlNTA0MzQsIDB4YTMyODIxLCAweGEzMzAyYiwgMHg4MjIwMjEsCi0weDg2MjAyMSwgMHhhY2U0MDAwMCwgMHhhY2U1MDAwNCwgMHg4ZWUyMDYwOCwKLTB4YTRmMDAwMGUsIDB4YWNlZjAwMTgsIDB4YWNlYTAwMWMsIDB4MjEwYzAsCi0weDI0NDIwNjBjLCAweDJlMjEwMjEsIDB4YWNlMjAwMDgsIDB4OGVlMjA0YzQsCi0weGFjZTIwMDEwLCAweGFmODgwMTIwLCAweDkyZTI0ZTIwLCAweDE0NDAwMDMzLAotMHgyNDA3MDAwMSwgMHg4ZWUyNGUzMCwgMHgyMTBjMCwgMHgyNDQyNTAzOCwKLTB4MmUyMjAyMSwgMHg4YzgyMDAwMCwgMHgxNDRkMDAxZiwgMHgwLAotMHg4ZWUzNGUzMCwgMHg4ZWUyNGUzNCwgMHgxMDYyMDAxYiwgMHgwLAotMHg4YzgyMDAwNCwgMHgyNDQyMDAwMSwgMHhhYzgyMDAwNCwgMHg4ZWUyNGUzNCwKLTB4OGVlMzRlMzAsIDB4MjQ0MjAwMDEsIDB4MTA0YzAwMDcsIDB4MCwKLTB4OGVlMjRlMzQsIDB4MjQ0MjAwMDEsIDB4MTA2MjAwMDUsIDB4MCwKLTB4ODAwMjExOSwgMHgwLCAweDE0NjAwMDA1LCAweDAsCi0weDhmODIwMTI4LCAweDI0NDIwMDIwLCAweGFmODIwMTI4LCAweDhmODIwMTI4LAotMHg4YzgyMDAwNCwgMHgyYzQyMDAxMSwgMHg1MDQwMDAxMCwgMHhhYzgwMDAwMCwKLTB4ODAwMjEyYywgMHgwLCAweDhlZTI0ZTMwLCAweDI0NDIwMDAxLAotMHg1MDRjMDAwMywgMHgxMDIxLCAweDhlZTI0ZTMwLCAweDI0NDIwMDAxLAotMHhhZWUyNGUzMCwgMHg4ZWUyNGUzMCwgMHgyMTBjMCwgMHgyNDQyNTAzOCwKLTB4MmUyMjAyMSwgMHhhYzhkMDAwMCwgMHhhYzhlMDAwNCwgMHg1NGUwMDAwNiwKLTB4MjQwYjAwMDEsIDB4OGY4MjAwNTQsIDB4MTIyMTAyMywgMHgyYzQyMDAzMywKLTB4MTQ0MGZmOWQsIDB4MCwgMHgzMTYzMDBmZiwgMHgyNDAyMDAwMSwKLTB4NTQ2MjAwNzgsIDB4YWZhMDAwMTAsIDB4YWVlYTA2MDgsIDB4OGY4MzAwNTQsCi0weDhmODIwMDU0LCAweDI0NjkwMDMyLCAweDEyMjEwMjMsIDB4MmM0MjAwMzMsCi0weDEwNDAwMDYxLCAweDU4MjEsIDB4MjQwZTAwMDgsIDB4MjQwZDAwMTEsCi0weDI0MGEwMDEyLCAweDI0MDgwMDQwLCAweDI0MGMwMDAxLCAweDhmODMwMTIwLAotMHgyNzYyMzgwMCwgMHgyNDY2MDAyMCwgMHhjMjEwMmIsIDB4NTA0MDAwMDEsCi0weDI3NjYzMDAwLCAweDhmODIwMTI4LCAweDEwYzIwMDA0LCAweDAsCi0weDhmODIwMTI0LCAweDE0YzIwMDA3LCAweDAsIDB4OGVlMjAxYTQsCi0weDM4MjEsIDB4MjQ0MjAwMDEsIDB4YWVlMjAxYTQsIDB4ODAwMjE5OCwKLTB4OGVlMjAxYTQsIDB4OGVlMjA2MDgsIDB4YWM2MjAwMWMsIDB4OGVlNDA0YTAsCi0weDhlZTUwNGE0LCAweDI0NjIwMDFjLCAweGFjNjIwMDA4LCAweGE0NmUwMDBlLAotMHhhYzZkMDAxOCwgMHhhYzY0MDAwMCwgMHhhYzY1MDAwNCwgMHg4ZWUyMDRjNCwKLTB4YWM2MjAwMTAsIDB4YWY4NjAxMjAsIDB4OTJlMjRlMjAsIDB4MTQ0MDAwMzMsCi0weDI0MDcwMDAxLCAweDhlZTI0ZTMwLCAweDIxMGMwLCAweDI0NDI1MDM4LAotMHgyZTIyMDIxLCAweDhjODIwMDAwLCAweDE0NGEwMDFmLCAweDAsCi0weDhlZTM0ZTMwLCAweDhlZTI0ZTM0LCAweDEwNjIwMDFiLCAweDAsCi0weDhjODIwMDA0LCAweDI0NDIwMDAxLCAweGFjODIwMDA0LCAweDhlZTI0ZTM0LAotMHg4ZWUzNGUzMCwgMHgyNDQyMDAwMSwgMHgxMDQ4MDAwNywgMHgwLAotMHg4ZWUyNGUzNCwgMHgyNDQyMDAwMSwgMHgxMDYyMDAwNSwgMHgwLAotMHg4MDAyMTg1LCAweDAsIDB4MTQ2MDAwMDUsIDB4MCwKLTB4OGY4MjAxMjgsIDB4MjQ0MjAwMjAsIDB4YWY4MjAxMjgsIDB4OGY4MjAxMjgsCi0weDhjODIwMDA0LCAweDJjNDIwMDExLCAweDUwNDAwMDEwLCAweGFjODAwMDAwLAotMHg4MDAyMTk4LCAweDAsIDB4OGVlMjRlMzAsIDB4MjQ0MjAwMDEsCi0weDUwNDgwMDAzLCAweDEwMjEsIDB4OGVlMjRlMzAsIDB4MjQ0MjAwMDEsCi0weGFlZTI0ZTMwLCAweDhlZTI0ZTMwLCAweDIxMGMwLCAweDI0NDI1MDM4LAotMHgyZTIyMDIxLCAweGFjOGEwMDAwLCAweGFjOGMwMDA0LCAweDU0ZTAwMDA2LAotMHgyNDBiMDAwMSwgMHg4ZjgyMDA1NCwgMHgxMjIxMDIzLCAweDJjNDIwMDMzLAotMHgxNDQwZmZhNiwgMHgwLCAweDMxNjMwMGZmLCAweDI0MDIwMDAxLAotMHgxMDYyMDAyMiwgMHgwLCAweDNjMDQwMDAxLCAweDI0ODQ1MzkwLAotMHhhZmEwMDAxMCwgMHhhZmEwMDAxNCwgMHg4Zjg2MDEyMCwgMHg4Zjg3MDEyNCwKLTB4M2MwNTAwMDksIDB4YzAwMjQwMywgMHgzNGE1ZjAxMSwgMHg4MDAyMWM0LAotMHgwLCAweDNjMDQwMDAxLCAweDI0ODQ1MzljLCAweGFmYTAwMDE0LAotMHg4Zjg2MDEyMCwgMHg4Zjg3MDEyNCwgMHgzYzA1MDAwOSwgMHhjMDAyNDAzLAotMHgzNGE1ZjAxMCwgMHg4MDAyMWM0LCAweDAsIDB4M2MwNDAwMDEsCi0weDI0ODQ1M2E4LCAweGFmYTAwMDE0LCAweDhlZTYwNjA4LCAweDhmNDcwMjI4LAotMHgzYzA1MDAwOSwgMHhjMDAyNDAzLCAweDM0YTVmMDBmLCAweDhlZTIwMWFjLAotMHgyNDQyMDAwMSwgMHhhZWUyMDFhYywgMHg4ZWUyMDFhYywgMHg4ZWUyMDEyMCwKLTB4MjQ0MjAwMDEsIDB4YWVlMjAxMjAsIDB4OGVlMjAxMjAsIDB4OGVlMjAxNjgsCi0weDI0NDIwMDAxLCAweGFlZTIwMTY4LCAweDgwMDIyZTgsIDB4OGVlMjAxNjgsCi0weDhmNDIwMjVjLCAweDI2ZTQwMDk0LCAweGFlZTIwMDYwLCAweDhmNDIwMjYwLAotMHgyNzQ1MDIwMCwgMHgyNDA2MDAwOCwgMHhjMDAyNDlhLCAweGFlZTIwMDY4LAotMHg4ZjgyMDIyMCwgMHgzMDQyMDAwOCwgMHgxNDQwMDAwMiwgMHgyNDAyMDAwMSwKLTB4MjQwMjAwMDIsIDB4YWVlMjAxMDgsIDB4OGVlMjAxMWMsIDB4MjQ0MjAwMDEsCi0weGFlZTIwMTFjLCAweDgwMDIyZTgsIDB4OGVlMjAxMWMsIDB4M2MwNDAwMDEsCi0weDI0ODQ1M2VjLCAweGFmYTAwMDEwLCAweGFmYTAwMDE0LCAweDhmYTYwMDIwLAotMHgzYzA1MDAwMywgMHhjMDAyNDAzLCAweDM0YTVmMDBmLCAweDkzYTIwMDIwLAotMHgzYzAzMDcwMCwgMHgzNDYzMTAwMCwgMHg0MzEwMjUsIDB4YWZhMjAwMTgsCi0weDhlZTIwNjA4LCAweDhmNDMwMjI4LCAweDI0NDIwMDAxLCAweDMwNDkwMGZmLAotMHg1MTIzMDBlMiwgMHhhZmEwMDAxMCwgMHg4ZWUyMDYwOCwgMHgyMTBjMCwKLTB4NTcxMDIxLCAweDhmYTMwMDE4LCAweDhmYTQwMDFjLCAweGFjNDMwNjBjLAotMHhhYzQ0MDYxMCwgMHg4Zjg3MDEyMCwgMHgyNzYyMzgwMCwgMHgyNGU4MDAyMCwKLTB4MTAyMTAyYiwgMHg1MDQwMDAwMSwgMHgyNzY4MzAwMCwgMHg4ZjgyMDEyOCwKLTB4MTEwMjAwMDQsIDB4MCwgMHg4ZjgyMDEyNCwgMHgxNTAyMDAwNywKLTB4MTAyMSwgMHg4ZWUyMDFhNCwgMHgzODIxLCAweDI0NDIwMDAxLAotMHhhZWUyMDFhNCwgMHg4MDAyMjVkLCAweDhlZTIwMWE0LCAweDhlZTQwNjA4LAotMHg0MjBjMCwgMHg4MDE4MjEsIDB4OGVlNDA0MzAsIDB4OGVlNTA0MzQsCi0weGEzMjgyMSwgMHhhMzMwMmIsIDB4ODIyMDIxLCAweDg2MjAyMSwKLTB4YWNlNDAwMDAsIDB4YWNlNTAwMDQsIDB4OGVlMzA2MDgsIDB4MjQwMjAwMDgsCi0weGE0ZTIwMDBlLCAweDI0MDIwMDBkLCAweGFjZTIwMDE4LCAweGFjZTkwMDFjLAotMHgzMThjMCwgMHgyNDYzMDYwYywgMHgyZTMxMDIxLCAweGFjZTIwMDA4LAotMHg4ZWUyMDRjNCwgMHhhY2UyMDAxMCwgMHhhZjg4MDEyMCwgMHg5MmUyNGUyMCwKLTB4MTQ0MDAwMzcsIDB4MjQwNzAwMDEsIDB4OGVlMjRlMzAsIDB4MjEwYzAsCi0weDI0NDI1MDM4LCAweDJlMjIwMjEsIDB4OGM4MzAwMDAsIDB4MjQwMjAwMDcsCi0weDE0NjIwMDFmLCAweDAsIDB4OGVlMzRlMzAsIDB4OGVlMjRlMzQsCi0weDEwNjIwMDFiLCAweDI0MDMwMDQwLCAweDhjODIwMDA0LCAweDI0NDIwMDAxLAotMHhhYzgyMDAwNCwgMHg4ZWUyNGUzNCwgMHg4ZWU1NGUzMCwgMHgyNDQyMDAwMSwKLTB4MTA0MzAwMDcsIDB4MCwgMHg4ZWUyNGUzNCwgMHgyNDQyMDAwMSwKLTB4MTBhMjAwMDUsIDB4MCwgMHg4MDAyMjQ3LCAweDAsCi0weDE0YTAwMDA1LCAweDAsIDB4OGY4MjAxMjgsIDB4MjQ0MjAwMjAsCi0weGFmODIwMTI4LCAweDhmODIwMTI4LCAweDhjODIwMDA0LCAweDJjNDIwMDExLAotMHg1MDQwMDAxMywgMHhhYzgwMDAwMCwgMHg4MDAyMjVkLCAweDAsCi0weDhlZTI0ZTMwLCAweDI0MDMwMDQwLCAweDI0NDIwMDAxLCAweDUwNDMwMDAzLAotMHgxMDIxLCAweDhlZTI0ZTMwLCAweDI0NDIwMDAxLCAweGFlZTI0ZTMwLAotMHg4ZWUyNGUzMCwgMHgyMTBjMCwgMHgyNDQyNTAzOCwgMHgyZTIyMDIxLAotMHgyNDAyMDAwNywgMHhhYzgyMDAwMCwgMHgyNDAyMDAwMSwgMHhhYzgyMDAwNCwKLTB4NTRlMDAwMGMsIDB4YWVlOTA2MDgsIDB4M2MwNDAwMDEsIDB4MjQ4NDUzZjQsCi0weGFmYTAwMDEwLCAweGFmYTAwMDE0LCAweDhlZTYwNjA4LCAweDhmNDcwMjI4LAotMHgzYzA1MDAwOSwgMHhjMDAyNDAzLCAweDM0YTVmMDAwLCAweDgwMDIyZTAsCi0weDAsIDB4OGY4MzAxMjAsIDB4Mjc2MjM4MDAsIDB4MjQ2NjAwMjAsCi0weGMyMTAyYiwgMHg1MDQwMDAwMSwgMHgyNzY2MzAwMCwgMHg4ZjgyMDEyOCwKLTB4MTBjMjAwMDQsIDB4MCwgMHg4ZjgyMDEyNCwgMHgxNGMyMDAwNywKLTB4MCwgMHg4ZWUyMDFhNCwgMHgzODIxLCAweDI0NDIwMDAxLAotMHhhZWUyMDFhNCwgMHg4MDAyMmM0LCAweDhlZTIwMWE0LCAweDhlZTIwNjA4LAotMHhhYzYyMDAxYywgMHg4ZWU0MDRhMCwgMHg4ZWU1MDRhNCwgMHgyNDYyMDAxYywKLTB4YWM2MjAwMDgsIDB4MjQwMjAwMDgsIDB4YTQ2MjAwMGUsIDB4MjQwMjAwMTEsCi0weGFjNjIwMDE4LCAweGFjNjQwMDAwLCAweGFjNjUwMDA0LCAweDhlZTIwNGM0LAotMHhhYzYyMDAxMCwgMHhhZjg2MDEyMCwgMHg5MmUyNGUyMCwgMHgxNDQwMDAzNywKLTB4MjQwNzAwMDEsIDB4OGVlMjRlMzAsIDB4MjEwYzAsIDB4MjQ0MjUwMzgsCi0weDJlMjIwMjEsIDB4OGM4MzAwMDAsIDB4MjQwMjAwMTIsIDB4MTQ2MjAwMWYsCi0weDAsIDB4OGVlMzRlMzAsIDB4OGVlMjRlMzQsIDB4MTA2MjAwMWIsCi0weDI0MDMwMDQwLCAweDhjODIwMDA0LCAweDI0NDIwMDAxLCAweGFjODIwMDA0LAotMHg4ZWUyNGUzNCwgMHg4ZWU1NGUzMCwgMHgyNDQyMDAwMSwgMHgxMDQzMDAwNywKLTB4MCwgMHg4ZWUyNGUzNCwgMHgyNDQyMDAwMSwgMHgxMGEyMDAwNSwKLTB4MCwgMHg4MDAyMmFlLCAweDAsIDB4MTRhMDAwMDUsCi0weDAsIDB4OGY4MjAxMjgsIDB4MjQ0MjAwMjAsIDB4YWY4MjAxMjgsCi0weDhmODIwMTI4LCAweDhjODIwMDA0LCAweDJjNDIwMDExLCAweDUwNDAwMDEzLAotMHhhYzgwMDAwMCwgMHg4MDAyMmM0LCAweDAsIDB4OGVlMjRlMzAsCi0weDI0MDMwMDQwLCAweDI0NDIwMDAxLCAweDUwNDMwMDAzLCAweDEwMjEsCi0weDhlZTI0ZTMwLCAweDI0NDIwMDAxLCAweGFlZTI0ZTMwLCAweDhlZTI0ZTMwLAotMHgyMTBjMCwgMHgyNDQyNTAzOCwgMHgyZTIyMDIxLCAweDI0MDIwMDEyLAotMHhhYzgyMDAwMCwgMHgyNDAyMDAwMSwgMHhhYzgyMDAwNCwgMHgxNGUwMDAxYiwKLTB4MCwgMHgzYzA0MDAwMSwgMHgyNDg0NTNmYywgMHhhZmEwMDAxMCwKLTB4YWZhMDAwMTQsIDB4OGVlNjA2MDgsIDB4OGY0NzAyMjgsIDB4M2MwNTAwMDksCi0weGMwMDI0MDMsIDB4MzRhNWYwMDEsIDB4OGVlMjAxYjAsIDB4MjQ0MjAwMDEsCi0weGFlZTIwMWIwLCAweDgwMDIyZTAsIDB4OGVlMjAxYjAsIDB4M2MwNDAwMDEsCi0weDI0ODQ1NDA4LCAweGFmYTAwMDE0LCAweDhlZTYwNjA4LCAweDhmNDcwMjI4LAotMHgzYzA1MDAwOSwgMHhjMDAyNDAzLCAweDM0YTVmMDA1LCAweDhlZTIwMWFjLAotMHgyNDQyMDAwMSwgMHhhZWUyMDFhYywgMHg4ZWUyMDFhYywgMHg4ZWUyMDE1MCwKLTB4MjQ0MjAwMDEsIDB4YWVlMjAxNTAsIDB4OGVlMjAxNTAsIDB4OGVlMjAxNjAsCi0weDI0NDIwMDAxLCAweGFlZTIwMTYwLCAweDhlZTIwMTYwLCAweDhmNDMwMjJjLAotMHg4ZjQyMDEwYywgMHgxNDYyMDAwOSwgMHgyNDAyMDAwMiwgMHhhZjgyMDA2NCwKLTB4OGY4MjAwNjQsIDB4MTQ0MDAwMDUsIDB4MCwgMHg4ZjQzMDIyYywKLTB4OGY0MjAxMGMsIDB4MTQ2MmY4NzUsIDB4MCwgMHg4ZmJmMDA0NCwKLTB4OGZiNjAwNDAsIDB4OGZiNTAwM2MsIDB4OGZiNDAwMzgsIDB4OGZiMzAwMzQsCi0weDhmYjIwMDMwLCAweDhmYjEwMDJjLCAweDhmYjAwMDI4LCAweDNlMDAwMDgsCi0weDI3YmQwMDQ4LCAweDI3YmRmZmY4LCAweDI0MDhmZmZmLCAweDEwYTAwMDE0LAotMHg0ODIxLCAweDNjMGFlZGI4LCAweDM1NGE4MzIwLCAweDkwODcwMDAwLAotMHgyNDg0MDAwMSwgMHgzMDIxLCAweDEwNzEwMjYsIDB4MzA0MjAwMDEsCi0weDEwNDAwMDAyLCAweDgxODQyLCAweDZhMTgyNiwgMHg2MDQwMjEsCi0weDI0YzYwMDAxLCAweDJjYzIwMDA4LCAweDE0NDBmZmY3LCAweDczODQyLAotMHgyNTI5MDAwMSwgMHgxMjUxMDJiLCAweDE0NDBmZmYwLCAweDAsCi0weDEwMDEwMjEsIDB4M2UwMDAwOCwgMHgyN2JkMDAwOCwgMHgyN2JkZmZlOCwKLTB4Mjc2NDI4MDAsIDB4YWZiZjAwMTAsIDB4YzAwMjQ4OCwgMHgyNDA1MTAwMCwKLTB4MjQwMjAwMjEsIDB4YWY4MDAxMDAsIDB4YWY4MDAxMDQsIDB4YWY4MDAxMDgsCi0weGFmODAwMTEwLCAweGFmODAwMTE0LCAweGFmODAwMTE4LCAweGFmODAwMTIwLAotMHhhZjgwMDEyNCwgMHhhZjgwMDEyOCwgMHhhZjgwMDEzMCwgMHhhZjgwMDEzNCwKLTB4YWY4MDAxMzgsIDB4YWVlMDRlMjgsIDB4YWVlMDRlMmMsIDB4YWVlMDRlMzAsCi0weGFlZTA0ZTM0LCAweGFmODIwMTFjLCAweDhmNDIwMjE4LCAweDMwNDIwMDQwLAotMHgxMDQwMDAwNCwgMHgwLCAweDhmODIwMTFjLCAweDM0NDIwMDA0LAotMHhhZjgyMDExYywgMHg4ZmJmMDAxMCwgMHgzZTAwMDA4LCAweDI3YmQwMDE4LAotMHgyN2JkZmZlMCwgMHhhZmJmMDAxOCwgMHg4ZjgyMDEwNCwgMHhhZmEyMDAxMCwKLTB4OGY4MjAxMDAsIDB4M2MwNTAwMDIsIDB4YWZhMjAwMTQsIDB4OGY4NjAwYjAsCi0weDhmODcwMTFjLCAweDNjMDQwMDAxLCAweDI0ODQ1NGMwLCAweGMwMDI0MDMsCi0weDM0YTVmMDAwLCAweDhmODMwMGIwLCAweDNjMDI3ZjAwLCAweDYyMTgyNCwKLTB4M2MwMjA0MDAsIDB4MTA2MjAwMjksIDB4NDMxMDJiLCAweDE0NDAwMDA4LAotMHgzYzAyMjAwMCwgMHgzYzAyMDEwMCwgMHgxMDYyMDAyNCwgMHgzYzAyMDIwMCwKLTB4MTA2MjAwMTEsIDB4MCwgMHg4MDAyMzc0LCAweDAsCi0weDEwNjIwMDA4LCAweDNjMDI0MDAwLCAweDE0NjIwMDFjLCAweDAsCi0weDhlZTIwMTkwLCAweDI0NDIwMDAxLCAweGFlZTIwMTkwLCAweDgwMDIzNzQsCi0weDhlZTIwMTkwLCAweDhlZTIwMThjLCAweDI0NDIwMDAxLCAweGFlZTIwMThjLAotMHg4MDAyMzc0LCAweDhlZTIwMThjLCAweDhmODIwMTFjLCAweDM0NDIwMDAyLAotMHhhZjgyMDExYywgMHg4ZjgzMDEwNCwgMHg4ZjgyMDBiMCwgMHgzNDQyMDAwMSwKLTB4YWY4MjAwYjAsIDB4YWY4MzAxMDQsIDB4OGY4MjAxMWMsIDB4MjQwM2ZmZmQsCi0weDQzMTAyNCwgMHhhZjgyMDExYywgMHg4ZWUyMDFhMCwgMHgyNDQyMDAwMSwKLTB4YWVlMjAxYTAsIDB4ODAwMjM3NywgMHg4ZWUyMDFhMCwgMHg4ZjgyMDBiMCwKLTB4MzQ0MjAwMDEsIDB4YWY4MjAwYjAsIDB4OGZiZjAwMTgsIDB4M2UwMDAwOCwKLTB4MjdiZDAwMjAsIDB4MjdiZGZmZTAsIDB4YWZiZjAwMWMsIDB4YWZiMDAwMTgsCi0weDhmODIwMTIwLCAweGFmYTIwMDEwLCAweDhmODIwMTI0LCAweDNjMDUwMDAxLAotMHhhZmEyMDAxNCwgMHg4Zjg2MDBhMCwgMHg4Zjg3MDExYywgMHgzYzA0MDAwMSwKLTB4MjQ4NDU0Y2MsIDB4YzAwMjQwMywgMHgzNGE1ZjAwMCwgMHg4ZjgzMDBhMCwKLTB4M2MwMjdmMDAsIDB4NjIxODI0LCAweDNjMDIwNDAwLCAweDEwNjIwMDUzLAotMHg4MDIxLCAweDQzMTAyYiwgMHgxNDQwMDAwOCwgMHgzYzA0MjAwMCwKLTB4M2MwMjAxMDAsIDB4MTA2MjAwNGQsIDB4M2MwMjAyMDAsIDB4MTA2MjAwM2EsCi0weDAsIDB4ODAwMjNlMCwgMHgwLCAweDEwNjQwMDAzLAotMHgzYzAyNDAwMCwgMHgxNDYyMDA0NSwgMHgwLCAweDhmODIwMGEwLAotMHg0NDEwMjQsIDB4MTA0MDAwMDYsIDB4MCwgMHg4ZWUyMDE5NCwKLTB4MjQ0MjAwMDEsIDB4YWVlMjAxOTQsIDB4ODAwMjNhOSwgMHg4ZWUyMDE5NCwKLTB4OGVlMjAxOTgsIDB4MjQ0MjAwMDEsIDB4YWVlMjAxOTgsIDB4OGVlMjAxOTgsCi0weDhmODIwMTFjLCAweDM0NDIwMDAyLCAweGFmODIwMTFjLCAweDhmODIwMTFjLAotMHgzMDQyMDIwMCwgMHgxMDQwMDAxYiwgMHgwLCAweDhmODMwMGEwLAotMHg4Zjg0MDEyNCwgMHg4ZjgyMDBhYywgMHgxNDQwMDAwNywgMHgyNDAyMDAwMSwKLTB4M2MwMjAwMDEsIDB4MzQ0MmYwMDAsIDB4NjIxMDI0LCAweDUwNDAwMDAxLAotMHgyNDEwMDAwMSwgMHgyNDAyMDAwMSwgMHgxMjAwMDAwZCwgMHhhZjgyMDBhMCwKLTB4OGY4MjAxMjQsIDB4MjQ0MmZmZTAsIDB4YWY4MjAxMjQsIDB4OGY4MjAxMjQsCi0weDhmODIwMTI0LCAweDI3NjMzMDAwLCAweDQzMTAyYiwgMHgxMDQwMDAwNSwKLTB4Mjc2MjM3ZTAsIDB4YWY4MjAxMjQsIDB4ODAwMjNjYSwgMHgwLAotMHhhZjg0MDEyNCwgMHg4ZjgyMDExYywgMHgyNDAzZmZmZCwgMHg0MzEwMjQsCi0weDgwMDIzZTMsIDB4YWY4MjAxMWMsIDB4OGY4MjAxMWMsIDB4MzQ0MjAwMDIsCi0weGFmODIwMTFjLCAweDhmODMwMTI0LCAweDhmODIwMGEwLCAweDM0NDIwMDAxLAotMHhhZjgyMDBhMCwgMHhhZjgzMDEyNCwgMHg4ZjgyMDExYywgMHgyNDAzZmZmZCwKLTB4NDMxMDI0LCAweGFmODIwMTFjLCAweDhlZTIwMTljLCAweDI0NDIwMDAxLAotMHhhZWUyMDE5YywgMHg4MDAyM2UzLCAweDhlZTIwMTljLCAweDhmODIwMGEwLAotMHgzNDQyMDAwMSwgMHhhZjgyMDBhMCwgMHg4ZmJmMDAxYywgMHg4ZmIwMDAxOCwKLTB4M2UwMDAwOCwgMHgyN2JkMDAyMCwgMHgwLCAweDNjMDIwMDAxLAotMHg4YzQyNWM1OCwgMHgyN2JkZmZlOCwgMHhhZmJmMDAxNCwgMHgxNDQwMDAxMiwKLTB4YWZiMDAwMTAsIDB4M2MxMDAwMDEsIDB4MjYxMDVkZDAsIDB4MjAwMjAyMSwKLTB4YzAwMjQ4OCwgMHgyNDA1MjAwMCwgMHgyNjAyMWZlMCwgMHgzYzAxMDAwMSwKLTB4YWMyMjVkOTQsIDB4M2MwMTAwMDEsIDB4YWMyMjVkOTAsIDB4YWY0MjAyNTAsCi0weDI0MDIyMDAwLCAweGFmNTAwMjU0LCAweGFmNDIwMjU4LCAweDI0MDIwMDAxLAotMHgzYzAxMDAwMSwgMHhhYzIyNWM1OCwgMHg4ZmJmMDAxNCwgMHg4ZmIwMDAxMCwKLTB4M2UwMDAwOCwgMHgyN2JkMDAxOCwgMHgzYzAzMDAwMSwgMHg4YzYzNWQ5NCwKLTB4OGM4MjAwMDAsIDB4OGZhODAwMTAsIDB4OGZhOTAwMTQsIDB4YWM2MjAwMDAsCi0weDNjMDIwMDAxLCAweDhjNDI1ZDk0LCAweDhjODMwMDA0LCAweGFjNDMwMDA0LAotMHhhYzQ1MDAwOCwgMHg4Zjg0MDA1NCwgMHgyNDQzZmZlMCwgMHhhYzQ2MDAxMCwKLTB4YWM0NzAwMTQsIDB4YWM0ODAwMTgsIDB4YWM0OTAwMWMsIDB4M2MwMTAwMDEsCi0weGFjMjM1ZDk0LCAweGFjNDQwMDBjLCAweDNjMDIwMDAxLCAweDI0NDI1ZGQwLAotMHg2MjE4MmIsIDB4MTA2MDAwMDUsIDB4MCwgMHgzYzAyMDAwMSwKLTB4OGM0MjVkOTAsIDB4M2MwMTAwMDEsIDB4YWMyMjVkOTQsIDB4M2MwMzAwMDEsCi0weDhjNjM1ZDk0LCAweDNjMDIwMDAxLCAweDhjNDI1YzQwLCAweGFjNjIwMDAwLAotMHgzYzAzMDAwMSwgMHg4YzYzNWQ5NCwgMHgzYzAyMDAwMSwgMHg4YzQyNWM0MCwKLTB4YWM2MjAwMDQsIDB4M2UwMDAwOCwgMHhhZjQzMDI1MCwgMHgzYzAzMDAwMSwKLTB4OGM2MzVkOTQsIDB4M2MwMjAwMDEsIDB4OGM0MjVjNDAsIDB4MjdiZGZmZDAsCi0weGFmYjQwMDIwLCAweDhmYjQwMDQwLCAweGFmYjAwMDEwLCAweDgwODAyMSwKLTB4YWZiNTAwMjQsIDB4OGZiNTAwNDQsIDB4OGZhNDAwNDgsIDB4YWZiMTAwMTQsCi0weGEwODgyMSwgMHhhZmJmMDAyOCwgMHhhZmIzMDAxYywgMHhhZmIyMDAxOCwKLTB4YWM2MjAwMDAsIDB4M2MwNTAwMDEsIDB4OGNhNTVkOTQsIDB4M2MwMjAwMDEsCi0weDhjNDI1YzQwLCAweGMwOTAyMSwgMHhlMDk4MjEsIDB4MTA4MDAwMDYsCi0weGFjYTIwMDA0LCAweDI0YTUwMDA4LCAweGMwMDI0OTAsIDB4MjQwNjAwMTgsCi0weDgwMDI0NGUsIDB4MCwgMHgyNGE0MDAwOCwgMHhjMDAyNDg4LAotMHgyNDA1MDAxOCwgMHgzYzAyMDAwMSwgMHg4YzQyNWQ5NCwgMHgzYzA1MDAwMSwKLTB4MjRhNTVkZDAsIDB4MjQ0MmZmZTAsIDB4M2MwMTAwMDEsIDB4YWMyMjVkOTQsCi0weDQ1MTAyYiwgMHgxMDQwMDAwNSwgMHgwLCAweDNjMDIwMDAxLAotMHg4YzQyNWQ5MCwgMHgzYzAxMDAwMSwgMHhhYzIyNWQ5NCwgMHgzYzAzMDAwMSwKLTB4OGM2MzVkOTQsIDB4OGUwMjAwMDAsIDB4YWM2MjAwMDAsIDB4M2MwMzAwMDEsCi0weDhjNjM1ZDk0LCAweDhlMDIwMDA0LCAweGFjNjIwMDA0LCAweGFjNzEwMDA4LAotMHg4Zjg0MDA1NCwgMHgyNDYyZmZlMCwgMHgzYzAxMDAwMSwgMHhhYzIyNWQ5NCwKLTB4NDUxMDJiLCAweGFjNzIwMDEwLCAweGFjNzMwMDE0LCAweGFjNzQwMDE4LAotMHhhYzc1MDAxYywgMHgxMDQwMDAwNSwgMHhhYzY0MDAwYywgMHgzYzAyMDAwMSwKLTB4OGM0MjVkOTAsIDB4M2MwMTAwMDEsIDB4YWMyMjVkOTQsIDB4M2MwMzAwMDEsCi0weDhjNjM1ZDk0LCAweDNjMDIwMDAxLCAweDhjNDI1YzQwLCAweGFjNjIwMDAwLAotMHgzYzAzMDAwMSwgMHg4YzYzNWQ5NCwgMHgzYzAyMDAwMSwgMHg4YzQyNWM0MCwKLTB4YWM2MjAwMDQsIDB4YWY0MzAyNTAsIDB4OGZiZjAwMjgsIDB4OGZiNTAwMjQsCi0weDhmYjQwMDIwLCAweDhmYjMwMDFjLCAweDhmYjIwMDE4LCAweDhmYjEwMDE0LAotMHg4ZmIwMDAxMCwgMHgzZTAwMDA4LCAweDI3YmQwMDMwLCAweDEwYTAwMDA1LAotMHgwLCAweGFjODAwMDAwLCAweDI0YTVmZmZjLCAweDE0YTBmZmZkLAotMHgyNDg0MDAwNCwgMHgzZTAwMDA4LCAweDAsIDB4MTBjMDAwMDcsCi0weDAsIDB4OGM4MjAwMDAsIDB4MjQ4NDAwMDQsIDB4MjRjNmZmZmMsCi0weGFjYTIwMDAwLCAweDE0YzBmZmZiLCAweDI0YTUwMDA0LCAweDNlMDAwMDgsCi0weDAsIDB4MTBjMDAwMDcsIDB4MCwgMHg4Y2EyMDAwMCwKLTB4MjRhNTAwMDQsIDB4MjRjNmZmZmMsIDB4YWM4MjAwMDAsIDB4MTRjMGZmZmIsCi0weDI0ODQwMDA0LCAweDNlMDAwMDgsIDB4MCwgMHgzZTAwMDA4LAotMHgwLCAweDI3YmRmZmQ4LCAweGFmYmYwMDIwLCAweDhlZTMwNGU0LAotMHg4ZWUyMDRlMCwgMHgxMDYyMDQzNiwgMHgwLCAweDhlZTIwNGU0LAotMHg4ZWUzMDRmYywgMHgyMTEwMCwgMHg2MjYwMjEsIDB4OTU4NzAwMDgsCi0weDhkOGEwMDAwLCAweDhkOGIwMDA0LCAweDk1OGQwMDBhLCAweDhlZTI3MjVjLAotMHg4ZWUzNzI2YywgMHgzMGU0ZmZmZiwgMHg0NDEwMjEsIDB4NjIxODJiLAotMHgxMDYwMDAxNSwgMHgzMWEyMDAwNCwgMHg4ZjgyMDBkOCwgMHg4ZWUzNzI1OCwKLTB4NDMxMDIzLCAweGFlZTI3MjZjLCAweDhlZTI3MjZjLCAweDFjNDAwMDAzLAotMHgzYzAzMDAwMSwgMHg0MzEwMjEsIDB4YWVlMjcyNmMsIDB4OGVlMjcyNWMsCi0weDhlZTM3MjZjLCAweDQ0MTAyMSwgMHg2MjE4MmIsIDB4MTA2MDAwMDYsCi0weDMxYTIwMDA0LCAweDhlZTIwMWI4LCAweDI0NDIwMDAxLCAweGFlZTIwMWI4LAotMHg4MDAyOGUxLCAweDhlZTIwMWI4LCAweDEwNDAwMjQwLCAweDMxYTIwMjAwLAotMHgxMDQwMDE0ZCwgMHg0ODIxLCAweDk2ZTIwNDVhLCAweDMwNDIwMDEwLAotMHgxMDQwMDE0OSwgMHgwLCAweDhmODQwMTAwLCAweDI3NjIzMDAwLAotMHgyNDg1MDAyMCwgMHhhMjEwMmIsIDB4NTA0MDAwMDEsIDB4Mjc2NTI4MDAsCi0weDhmODIwMTA4LCAweDEwYTIwMDA0LCAweDAsIDB4OGY4MjAxMDQsCi0weDE0YTIwMDA2LCAweDI0MDIwMDBjLCAweDhlZTIwMWE4LCAweDI0NDIwMDAxLAotMHhhZWUyMDFhOCwgMHg4MDAyNTJjLCAweDhlZTIwMWE4LCAweGFjOGEwMDAwLAotMHhhYzhiMDAwNCwgMHg4ZWUzNzI2NCwgMHgyNDA2MDAwNSwgMHhhNDgyMDAwZSwKLTB4YWM4NjAwMTgsIDB4YWM4MzAwMDgsIDB4OGVlMjA0ZTQsIDB4YWM4MjAwMWMsCi0weDhlZTIwNGM4LCAweGFjODIwMDEwLCAweGFmODUwMTAwLCAweDkyZTIwNGVjLAotMHgxNDQwMDAzNiwgMHgyNDA5MDAwMSwgMHg4ZWUyNGUyOCwgMHgyMTBjMCwKLTB4MjQ0MjRlMzgsIDB4MmUyMjAyMSwgMHg4YzgyMDAwMCwgMHgxNDQ2MDAxZiwKLTB4MCwgMHg4ZWUzNGUyOCwgMHg4ZWUyNGUyYywgMHgxMDYyMDAxYiwKLTB4MjQwMzAwNDAsIDB4OGM4MjAwMDQsIDB4MjQ0MjAwMDEsIDB4YWM4MjAwMDQsCi0weDhlZTI0ZTJjLCAweDhlZTU0ZTI4LCAweDI0NDIwMDAxLCAweDEwNDMwMDA3LAotMHgwLCAweDhlZTI0ZTJjLCAweDI0NDIwMDAxLCAweDEwYTIwMDA1LAotMHgwLCAweDgwMDI1MTYsIDB4MCwgMHgxNGEwMDAwNSwKLTB4MCwgMHg4ZjgyMDEwOCwgMHgyNDQyMDAyMCwgMHhhZjgyMDEwOCwKLTB4OGY4MjAxMDgsIDB4OGM4MjAwMDQsIDB4MmM0MjAwMTEsIDB4NTA0MDAwMTMsCi0weGFjODAwMDAwLCAweDgwMDI1MmMsIDB4MCwgMHg4ZWUyNGUyOCwKLTB4MjQwMzAwNDAsIDB4MjQ0MjAwMDEsIDB4NTA0MzAwMDMsIDB4MTAyMSwKLTB4OGVlMjRlMjgsIDB4MjQ0MjAwMDEsIDB4YWVlMjRlMjgsIDB4OGVlMjRlMjgsCi0weDIxMGMwLCAweDI0NDI0ZTM4LCAweDJlMjIwMjEsIDB4MjQwMjAwMDUsCi0weGFjODIwMDAwLCAweDI0MDIwMDAxLCAweGFjODIwMDA0LCAweDE1MjAwMDBhLAotMHgzYzA0MDAwMSwgMHhhZmFiMDAxMCwgMHg4ZWUyNzI2NCwgMHgzYzA0MDAwMSwKLTB4MjQ4NDU3MzAsIDB4M2MwNTAwMDQsIDB4YWZhMjAwMTQsIDB4OGVlNjA0ZTQsCi0weDgwMDI4YmUsIDB4MzRhNWYxMTQsIDB4OGVlMjcyNjQsIDB4MzQ4NDM4MDAsCi0weDM2NDE4MjEsIDB4MjQ0MjAwMTAsIDB4NDMxMDJiLCAweDE0NDAwMDczLAotMHgwLCAweDhlZTI3MjY0LCAweDI0NDgwMDEwLCAweDM2NDEwMjEsCi0weDEwMjEwMmIsIDB4MTQ0MDAwMDIsIDB4M2MwMmZmZmYsIDB4MTAyNDAyMSwKLTB4OGY4NTAxMDAsIDB4Mjc2MjMwMDAsIDB4MjRhNjAwMjAsIDB4YzIxMDJiLAotMHg1MDQwMDAwMSwgMHgyNzY2MjgwMCwgMHg4ZjgyMDEwOCwgMHgxMGMyMDAwNCwKLTB4MCwgMHg4ZjgyMDEwNCwgMHgxNGMyMDAwNywgMHgyNTYzMDAwYywKLTB4OGVlMjAxYTgsIDB4NDgyMSwgMHgyNDQyMDAwMSwgMHhhZWUyMDFhOCwKLTB4ODAwMjVhMCwgMHg4ZWUyMDFhOCwgMHgyYzY0MDAwYywgMHgxNDQxMDIxLAotMHhhY2EyMDAwMCwgMHhhY2EzMDAwNCwgMHgyNGUyZmZmNCwgMHhhNGEyMDAwZSwKLTB4MjQwMjAwMDYsIDB4YWNhODAwMDgsIDB4YWNhMjAwMTgsIDB4OGVlMjA0ZTQsCi0weGFjYTIwMDFjLCAweDhlZTIwNGM4LCAweDNjMDMwMDAyLCAweDQzMTAyNSwKLTB4YWNhMjAwMTAsIDB4YWY4NjAxMDAsIDB4OTJlMjA0ZWMsIDB4MTQ0MDAwMzcsCi0weDI0MDkwMDAxLCAweDhlZTI0ZTI4LCAweDIxMGMwLCAweDI0NDI0ZTM4LAotMHgyZTIyMDIxLCAweDhjODMwMDAwLCAweDI0MDIwMDA1LCAweDE0NjIwMDFmLAotMHgwLCAweDhlZTM0ZTI4LCAweDhlZTI0ZTJjLCAweDEwNjIwMDFiLAotMHgyNDAzMDA0MCwgMHg4YzgyMDAwNCwgMHgyNDQyMDAwMSwgMHhhYzgyMDAwNCwKLTB4OGVlMjRlMmMsIDB4OGVlNTRlMjgsIDB4MjQ0MjAwMDEsIDB4MTA0MzAwMDcsCi0weDAsIDB4OGVlMjRlMmMsIDB4MjQ0MjAwMDEsIDB4MTBhMjAwMDUsCi0weDAsIDB4ODAwMjU4YSwgMHgwLCAweDE0YTAwMDA1LAotMHgwLCAweDhmODIwMTA4LCAweDI0NDIwMDIwLCAweGFmODIwMTA4LAotMHg4ZjgyMDEwOCwgMHg4YzgyMDAwNCwgMHgyYzQyMDAxMSwgMHg1MDQwMDAxMywKLTB4YWM4MDAwMDAsIDB4ODAwMjVhMCwgMHgwLCAweDhlZTI0ZTI4LAotMHgyNDAzMDA0MCwgMHgyNDQyMDAwMSwgMHg1MDQzMDAwMywgMHgxMDIxLAotMHg4ZWUyNGUyOCwgMHgyNDQyMDAwMSwgMHhhZWUyNGUyOCwgMHg4ZWUyNGUyOCwKLTB4MjEwYzAsIDB4MjQ0MjRlMzgsIDB4MmUyMjAyMSwgMHgyNDAyMDAwNSwKLTB4YWM4MjAwMDAsIDB4MjQwMjAwMDEsIDB4YWM4MjAwMDQsIDB4MTUyMDAwMGEsCi0weDI1MDhmZmZjLCAweGFmYWIwMDEwLCAweDhlZTI3MjY0LCAweDNjMDQwMDAxLAotMHgyNDg0NTczMCwgMHgzYzA1MDAwNCwgMHhhZmEyMDAxNCwgMHg4ZWU2MDRlNCwKLTB4ODAwMjhiZSwgMHgzNGE1ZjEyNSwgMHgzNDAyODEwMCwgMHhhNTAyMDAwMCwKLTB4OTU4MjAwMGUsIDB4ODAwMjYxZCwgMHhhNTAyMDAwMiwgMHg4Zjg1MDEwMCwKLTB4Mjc2MjMwMDAsIDB4MjRhNjAwMjAsIDB4YzIxMDJiLCAweDUwNDAwMDAxLAotMHgyNzY2MjgwMCwgMHg4ZjgyMDEwOCwgMHgxMGMyMDAwNCwgMHgwLAotMHg4ZjgyMDEwNCwgMHgxNGMyMDAwNywgMHgyNTYzMDAwYywgMHg4ZWUyMDFhOCwKLTB4NDgyMSwgMHgyNDQyMDAwMSwgMHhhZWUyMDFhOCwgMHg4MDAyNjBkLAotMHg4ZWUyMDFhOCwgMHgyYzY0MDAwYywgMHgxNDQxMDIxLCAweGFjYTIwMDAwLAotMHhhY2EzMDAwNCwgMHg4ZWUzNzI2NCwgMHgyNGUyZmZmNCwgMHhhNGEyMDAwZSwKLTB4MjQwMjAwMDYsIDB4YWNhMjAwMTgsIDB4MjQ2MzAwMTAsIDB4YWNhMzAwMDgsCi0weDhlZTIwNGU0LCAweGFjYTIwMDFjLCAweDhlZTIwNGM4LCAweDNjMDMwMDAyLAotMHg0MzEwMjUsIDB4YWNhMjAwMTAsIDB4YWY4NjAxMDAsIDB4OTJlMjA0ZWMsCi0weDE0NDAwMDM3LCAweDI0MDkwMDAxLCAweDhlZTI0ZTI4LCAweDIxMGMwLAotMHgyNDQyNGUzOCwgMHgyZTIyMDIxLCAweDhjODMwMDAwLCAweDI0MDIwMDA1LAotMHgxNDYyMDAxZiwgMHgwLCAweDhlZTM0ZTI4LCAweDhlZTI0ZTJjLAotMHgxMDYyMDAxYiwgMHgyNDAzMDA0MCwgMHg4YzgyMDAwNCwgMHgyNDQyMDAwMSwKLTB4YWM4MjAwMDQsIDB4OGVlMjRlMmMsIDB4OGVlNTRlMjgsIDB4MjQ0MjAwMDEsCi0weDEwNDMwMDA3LCAweDAsIDB4OGVlMjRlMmMsIDB4MjQ0MjAwMDEsCi0weDEwYTIwMDA1LCAweDAsIDB4ODAwMjVmNywgMHgwLAotMHgxNGEwMDAwNSwgMHgwLCAweDhmODIwMTA4LCAweDI0NDIwMDIwLAotMHhhZjgyMDEwOCwgMHg4ZjgyMDEwOCwgMHg4YzgyMDAwNCwgMHgyYzQyMDAxMSwKLTB4NTA0MDAwMTMsIDB4YWM4MDAwMDAsIDB4ODAwMjYwZCwgMHgwLAotMHg4ZWUyNGUyOCwgMHgyNDAzMDA0MCwgMHgyNDQyMDAwMSwgMHg1MDQzMDAwMywKLTB4MTAyMSwgMHg4ZWUyNGUyOCwgMHgyNDQyMDAwMSwgMHhhZWUyNGUyOCwKLTB4OGVlMjRlMjgsIDB4MjEwYzAsIDB4MjQ0MjRlMzgsIDB4MmUyMjAyMSwKLTB4MjQwMjAwMDUsIDB4YWM4MjAwMDAsIDB4MjQwMjAwMDEsIDB4YWM4MjAwMDQsCi0weDE1MjAwMDBhLCAweDM0MDI4MTAwLCAweGFmYWIwMDEwLCAweDhlZTI3MjY0LAotMHgzYzA0MDAwMSwgMHgyNDg0NTczMCwgMHgzYzA1MDAwNCwgMHhhZmEyMDAxNCwKLTB4OGVlNjA0ZTQsIDB4ODAwMjhiZSwgMHgzNGE1ZjAxNSwgMHg4ZWUzNzI2NCwKLTB4YTQ2MjAwMGMsIDB4OGVlMzcyNjQsIDB4OTU4MjAwMGUsIDB4YTQ2MjAwMGUsCi0weDgwMDI2ODEsIDB4MjRlNzAwMDQsIDB4OGY4NDAxMDAsIDB4Mjc2MjMwMDAsCi0weDI0ODUwMDIwLCAweGEyMTAyYiwgMHg1MDQwMDAwMSwgMHgyNzY1MjgwMCwKLTB4OGY4MjAxMDgsIDB4MTBhMjAwMDQsIDB4MCwgMHg4ZjgyMDEwNCwKLTB4MTRhMjAwMDcsIDB4MjQwMjAwMDYsIDB4OGVlMjAxYTgsIDB4NDgyMSwKLTB4MjQ0MjAwMDEsIDB4YWVlMjAxYTgsIDB4ODAwMjY3NywgMHg4ZWUyMDFhOCwKLTB4YWM4YTAwMDAsIDB4YWM4YjAwMDQsIDB4OGVlMzcyNjQsIDB4YTQ4NzAwMGUsCi0weGFjODIwMDE4LCAweGFjODMwMDA4LCAweDhlZTIwNGU0LCAweGFjODIwMDFjLAotMHg4ZWUyMDRjOCwgMHgzYzAzMDAwMiwgMHg0MzEwMjUsIDB4YWM4MjAwMTAsCi0weGFmODUwMTAwLCAweDkyZTIwNGVjLCAweDE0NDAwMDM3LCAweDI0MDkwMDAxLAotMHg4ZWUyNGUyOCwgMHgyMTBjMCwgMHgyNDQyNGUzOCwgMHgyZTIyMDIxLAotMHg4YzgzMDAwMCwgMHgyNDAyMDAwNSwgMHgxNDYyMDAxZiwgMHgwLAotMHg4ZWUzNGUyOCwgMHg4ZWUyNGUyYywgMHgxMDYyMDAxYiwgMHgyNDAzMDA0MCwKLTB4OGM4MjAwMDQsIDB4MjQ0MjAwMDEsIDB4YWM4MjAwMDQsIDB4OGVlMjRlMmMsCi0weDhlZTU0ZTI4LCAweDI0NDIwMDAxLCAweDEwNDMwMDA3LCAweDAsCi0weDhlZTI0ZTJjLCAweDI0NDIwMDAxLCAweDEwYTIwMDA1LCAweDAsCi0weDgwMDI2NjEsIDB4MCwgMHgxNGEwMDAwNSwgMHgwLAotMHg4ZjgyMDEwOCwgMHgyNDQyMDAyMCwgMHhhZjgyMDEwOCwgMHg4ZjgyMDEwOCwKLTB4OGM4MjAwMDQsIDB4MmM0MjAwMTEsIDB4NTA0MDAwMTMsIDB4YWM4MDAwMDAsCi0weDgwMDI2NzcsIDB4MCwgMHg4ZWUyNGUyOCwgMHgyNDAzMDA0MCwKLTB4MjQ0MjAwMDEsIDB4NTA0MzAwMDMsIDB4MTAyMSwgMHg4ZWUyNGUyOCwKLTB4MjQ0MjAwMDEsIDB4YWVlMjRlMjgsIDB4OGVlMjRlMjgsIDB4MjEwYzAsCi0weDI0NDI0ZTM4LCAweDJlMjIwMjEsIDB4MjQwMjAwMDUsIDB4YWM4MjAwMDAsCi0weDI0MDIwMDAxLCAweGFjODIwMDA0LCAweDE1MjAwMDA5LCAweDNjMDUwMDA0LAotMHhhZmFiMDAxMCwgMHg4ZWUyNzI2NCwgMHgzYzA0MDAwMSwgMHgyNDg0NTczMCwKLTB4YWZhMjAwMTQsIDB4OGVlNjA0ZTQsIDB4ODAwMjhiZSwgMHgzNGE1ZjAwNCwKLTB4OGVlMjcyNWMsIDB4MzBlN2ZmZmYsIDB4NDcxMDIxLCAweGFlZTI3MjVjLAotMHg4ZWUyMDRlNCwgMHg4ZWUzMDRmYywgMHg4ZWU0NzI1OCwgMHgyMTEwMCwKLTB4NDMxMDIxLCAweGFjNDQwMDBjLCAweDhlZTI3MjU4LCAweGFmYTIwMDE4LAotMHg4ZWUzNzI1YywgMHhhZmEzMDAxYywgMHg4ZWUyNzI1YywgMHgyYzQyMDAzYywKLTB4MTA0MDAwMDQsIDB4MjQ2MjAwMDEsIDB4MjQwM2ZmZmUsIDB4NDMxMDI0LAotMHhhZmEyMDAxYywgMHg4ZWUyNzI2NCwgMHgzYzA2MDAwMSwgMHgzNGM2MzgwMCwKLTB4OGVlMzcyNWMsIDB4MjQwNWZmZjgsIDB4NDcxMDIxLCAweDI0NDIwMDA3LAotMHg0NTEwMjQsIDB4MjQ2MzAwMDcsIDB4YWVlMjcyNTgsIDB4OGVlMjcyNmMsCi0weDhlZTQ3MjU4LCAweDY1MTgyNCwgMHg0MzEwMjMsIDB4YWVlMjcyNmMsCi0weDM2NjEwMjEsIDB4ODIyMDJiLCAweDE0ODAwMDA0LCAweDNjMDNmZmZmLAotMHg4ZWUyNzI1OCwgMHg0MzEwMjEsIDB4YWVlMjcyNTgsIDB4OGVlMjcyNTgsCi0weGFlZTI3MjY0LCAweDhmODIwMGYwLCAweDI0NDcwMDA4LCAweDI3NjIxODAwLAotMHhlMjEwMmIsIDB4NTA0MDAwMDEsIDB4Mjc2NzEwMDAsIDB4OGY4MjAwZjQsCi0weDE0ZTIwMDA3LCAweDAsIDB4OGVlMjAxYjQsIDB4NDgyMSwKLTB4MjQ0MjAwMDEsIDB4YWVlMjAxYjQsIDB4ODAwMjZjNCwgMHg4ZWUyMDFiNCwKLTB4OGY4MjAwZjAsIDB4MjQwOTAwMDEsIDB4OGZhMzAwMTgsIDB4OGZhNDAwMWMsCi0weGFjNDMwMDAwLCAweGFjNDQwMDA0LCAweGFmODcwMGYwLCAweDE1MjAwMDEyLAotMHhkMTE0MiwgMHg4ZjgyMDBmMCwgMHhhZmEyMDAxMCwgMHg4ZjgyMDBmNCwKLTB4M2MwNDAwMDEsIDB4MjQ4NDU3M2MsIDB4YWZhMjAwMTQsIDB4OGZhNjAwMTgsCi0weDhmYTcwMDFjLCAweDNjMDUwMDA0LCAweGMwMDI0MDMsIDB4MzRhNWYwMDUsCi0weDhlZTIwMDg4LCAweDI0NDIwMDAxLCAweGFlZTIwMDg4LCAweDhlZTIwMDg4LAotMHg4MDAyOGQzLCAweGFlZTA3MjVjLCAweDMwNDMwMDAzLCAweDI0MDIwMDAyLAotMHgxMDYyMDAxNiwgMHgyODYyMDAwMywgMHgxMDQwMDAwNSwgMHgyNDAyMDAwMSwKLTB4MTA2MjAwMDgsIDB4MCwgMHg4MDAyNzAzLCAweDAsCi0weDI0MDIwMDAzLCAweDEwNjIwMDE3LCAweDAsIDB4ODAwMjcwMywKLTB4MCwgMHg4ZWUyMDBlOCwgMHg4ZWUzMDBlYywgMHgyNDYzMDAwMSwKLTB4MmM2NDAwMDEsIDB4NDQxMDIxLCAweGFlZTIwMGU4LCAweGFlZTMwMGVjLAotMHg4ZWUyMDBlOCwgMHg4MDAyNzAzLCAweDhlZTMwMGVjLCAweDhlZTIwMGYwLAotMHg4ZWUzMDBmNCwgMHgyNDYzMDAwMSwgMHgyYzY0MDAwMSwgMHg0NDEwMjEsCi0weGFlZTIwMGYwLCAweGFlZTMwMGY0LCAweDhlZTIwMGYwLCAweDgwMDI3MDMsCi0weDhlZTMwMGY0LCAweDhlZTIwMGY4LCAweDhlZTMwMGZjLCAweDI0NjMwMDAxLAotMHgyYzY0MDAwMSwgMHg0NDEwMjEsIDB4YWVlMjAwZjgsIDB4YWVlMzAwZmMsCi0weDhlZTIwMGY4LCAweDhlZTMwMGZjLCAweDhlZTI3MjVjLCAweDhlZTQwMGUwLAotMHg4ZWU1MDBlNCwgMHg0MDE4MjEsIDB4MTAyMSwgMHhhMzI4MjEsCi0weGEzMzAyYiwgMHg4MjIwMjEsIDB4ODYyMDIxLCAweGFlZTQwMGUwLAotMHhhZWU1MDBlNCwgMHg4MDAyOGQzLCAweGFlZTA3MjVjLCAweDMwZTJmZmZmLAotMHgxMDQwMDFjMSwgMHgzMWEyMDIwMCwgMHgxMDQwMDE0ZCwgMHg0ODIxLAotMHg5NmUyMDQ1YSwgMHgzMDQyMDAxMCwgMHgxMDQwMDE0OSwgMHgwLAotMHg4Zjg0MDEwMCwgMHgyNzYyMzAwMCwgMHgyNDg1MDAyMCwgMHhhMjEwMmIsCi0weDUwNDAwMDAxLCAweDI3NjUyODAwLCAweDhmODIwMTA4LCAweDEwYTIwMDA0LAotMHgwLCAweDhmODIwMTA0LCAweDE0YTIwMDA2LCAweDI0MDIwMDBjLAotMHg4ZWUyMDFhOCwgMHgyNDQyMDAwMSwgMHhhZWUyMDFhOCwgMHg4MDAyNzZlLAotMHg4ZWUyMDFhOCwgMHhhYzhhMDAwMCwgMHhhYzhiMDAwNCwgMHg4ZWUzNzI2NCwKLTB4MjQwNjAwMDUsIDB4YTQ4MjAwMGUsIDB4YWM4NjAwMTgsIDB4YWM4MzAwMDgsCi0weDhlZTIwNGU0LCAweGFjODIwMDFjLCAweDhlZTIwNGM4LCAweGFjODIwMDEwLAotMHhhZjg1MDEwMCwgMHg5MmUyMDRlYywgMHgxNDQwMDAzNiwgMHgyNDA5MDAwMSwKLTB4OGVlMjRlMjgsIDB4MjEwYzAsIDB4MjQ0MjRlMzgsIDB4MmUyMjAyMSwKLTB4OGM4MjAwMDAsIDB4MTQ0NjAwMWYsIDB4MCwgMHg4ZWUzNGUyOCwKLTB4OGVlMjRlMmMsIDB4MTA2MjAwMWIsIDB4MjQwMzAwNDAsIDB4OGM4MjAwMDQsCi0weDI0NDIwMDAxLCAweGFjODIwMDA0LCAweDhlZTI0ZTJjLCAweDhlZTU0ZTI4LAotMHgyNDQyMDAwMSwgMHgxMDQzMDAwNywgMHgwLCAweDhlZTI0ZTJjLAotMHgyNDQyMDAwMSwgMHgxMGEyMDAwNSwgMHgwLCAweDgwMDI3NTgsCi0weDAsIDB4MTRhMDAwMDUsIDB4MCwgMHg4ZjgyMDEwOCwKLTB4MjQ0MjAwMjAsIDB4YWY4MjAxMDgsIDB4OGY4MjAxMDgsIDB4OGM4MjAwMDQsCi0weDJjNDIwMDExLCAweDUwNDAwMDEzLCAweGFjODAwMDAwLCAweDgwMDI3NmUsCi0weDAsIDB4OGVlMjRlMjgsIDB4MjQwMzAwNDAsIDB4MjQ0MjAwMDEsCi0weDUwNDMwMDAzLCAweDEwMjEsIDB4OGVlMjRlMjgsIDB4MjQ0MjAwMDEsCi0weGFlZTI0ZTI4LCAweDhlZTI0ZTI4LCAweDIxMGMwLCAweDI0NDI0ZTM4LAotMHgyZTIyMDIxLCAweDI0MDIwMDA1LCAweGFjODIwMDAwLCAweDI0MDIwMDAxLAotMHhhYzgyMDAwNCwgMHgxNTIwMDAwYSwgMHgzYzA0MDAwMSwgMHhhZmFiMDAxMCwKLTB4OGVlMjcyNjQsIDB4M2MwNDAwMDEsIDB4MjQ4NDU3MzAsIDB4M2MwNTAwMDQsCi0weGFmYTIwMDE0LCAweDhlZTYwNGU0LCAweDgwMDI4YmUsIDB4MzRhNWYwMTQsCi0weDhlZTI3MjY0LCAweDM0ODQzODAwLCAweDM2NDE4MjEsIDB4MjQ0MjAwMTAsCi0weDQzMTAyYiwgMHgxNDQwMDA3MywgMHgwLCAweDhlZTI3MjY0LAotMHgyNDQ4MDAxMCwgMHgzNjQxMDIxLCAweDEwMjEwMmIsIDB4MTQ0MDAwMDIsCi0weDNjMDJmZmZmLCAweDEwMjQwMjEsIDB4OGY4NTAxMDAsIDB4Mjc2MjMwMDAsCi0weDI0YTYwMDIwLCAweGMyMTAyYiwgMHg1MDQwMDAwMSwgMHgyNzY2MjgwMCwKLTB4OGY4MjAxMDgsIDB4MTBjMjAwMDQsIDB4MCwgMHg4ZjgyMDEwNCwKLTB4MTRjMjAwMDcsIDB4MjU2MzAwMGMsIDB4OGVlMjAxYTgsIDB4NDgyMSwKLTB4MjQ0MjAwMDEsIDB4YWVlMjAxYTgsIDB4ODAwMjdlMiwgMHg4ZWUyMDFhOCwKLTB4MmM2NDAwMGMsIDB4MTQ0MTAyMSwgMHhhY2EyMDAwMCwgMHhhY2EzMDAwNCwKLTB4MjRlMmZmZjQsIDB4YTRhMjAwMGUsIDB4MjQwMjAwMDYsIDB4YWNhODAwMDgsCi0weGFjYTIwMDE4LCAweDhlZTIwNGU0LCAweGFjYTIwMDFjLCAweDhlZTIwNGM4LAotMHgzYzAzMDAwMiwgMHg0MzEwMjUsIDB4YWNhMjAwMTAsIDB4YWY4NjAxMDAsCi0weDkyZTIwNGVjLCAweDE0NDAwMDM3LCAweDI0MDkwMDAxLCAweDhlZTI0ZTI4LAotMHgyMTBjMCwgMHgyNDQyNGUzOCwgMHgyZTIyMDIxLCAweDhjODMwMDAwLAotMHgyNDAyMDAwNSwgMHgxNDYyMDAxZiwgMHgwLCAweDhlZTM0ZTI4LAotMHg4ZWUyNGUyYywgMHgxMDYyMDAxYiwgMHgyNDAzMDA0MCwgMHg4YzgyMDAwNCwKLTB4MjQ0MjAwMDEsIDB4YWM4MjAwMDQsIDB4OGVlMjRlMmMsIDB4OGVlNTRlMjgsCi0weDI0NDIwMDAxLCAweDEwNDMwMDA3LCAweDAsIDB4OGVlMjRlMmMsCi0weDI0NDIwMDAxLCAweDEwYTIwMDA1LCAweDAsIDB4ODAwMjdjYywKLTB4MCwgMHgxNGEwMDAwNSwgMHgwLCAweDhmODIwMTA4LAotMHgyNDQyMDAyMCwgMHhhZjgyMDEwOCwgMHg4ZjgyMDEwOCwgMHg4YzgyMDAwNCwKLTB4MmM0MjAwMTEsIDB4NTA0MDAwMTMsIDB4YWM4MDAwMDAsIDB4ODAwMjdlMiwKLTB4MCwgMHg4ZWUyNGUyOCwgMHgyNDAzMDA0MCwgMHgyNDQyMDAwMSwKLTB4NTA0MzAwMDMsIDB4MTAyMSwgMHg4ZWUyNGUyOCwgMHgyNDQyMDAwMSwKLTB4YWVlMjRlMjgsIDB4OGVlMjRlMjgsIDB4MjEwYzAsIDB4MjQ0MjRlMzgsCi0weDJlMjIwMjEsIDB4MjQwMjAwMDUsIDB4YWM4MjAwMDAsIDB4MjQwMjAwMDEsCi0weGFjODIwMDA0LCAweDE1MjAwMDBhLCAweDI1MDhmZmZjLCAweGFmYWIwMDEwLAotMHg4ZWUyNzI2NCwgMHgzYzA0MDAwMSwgMHgyNDg0NTczMCwgMHgzYzA1MDAwNCwKLTB4YWZhMjAwMTQsIDB4OGVlNjA0ZTQsIDB4ODAwMjhiZSwgMHgzNGE1ZjAxNSwKLTB4MzQwMjgxMDAsIDB4YTUwMjAwMDAsIDB4OTU4MjAwMGUsIDB4ODAwMjg1ZiwKLTB4YTUwMjAwMDIsIDB4OGY4NTAxMDAsIDB4Mjc2MjMwMDAsIDB4MjRhNjAwMjAsCi0weGMyMTAyYiwgMHg1MDQwMDAwMSwgMHgyNzY2MjgwMCwgMHg4ZjgyMDEwOCwKLTB4MTBjMjAwMDQsIDB4MCwgMHg4ZjgyMDEwNCwgMHgxNGMyMDAwNywKLTB4MjU2MzAwMGMsIDB4OGVlMjAxYTgsIDB4NDgyMSwgMHgyNDQyMDAwMSwKLTB4YWVlMjAxYTgsIDB4ODAwMjg0ZiwgMHg4ZWUyMDFhOCwgMHgyYzY0MDAwYywKLTB4MTQ0MTAyMSwgMHhhY2EyMDAwMCwgMHhhY2EzMDAwNCwgMHg4ZWUzNzI2NCwKLTB4MjRlMmZmZjQsIDB4YTRhMjAwMGUsIDB4MjQwMjAwMDYsIDB4YWNhMjAwMTgsCi0weDI0NjMwMDEwLCAweGFjYTMwMDA4LCAweDhlZTIwNGU0LCAweGFjYTIwMDFjLAotMHg4ZWUyMDRjOCwgMHgzYzAzMDAwMiwgMHg0MzEwMjUsIDB4YWNhMjAwMTAsCi0weGFmODYwMTAwLCAweDkyZTIwNGVjLCAweDE0NDAwMDM3LCAweDI0MDkwMDAxLAotMHg4ZWUyNGUyOCwgMHgyMTBjMCwgMHgyNDQyNGUzOCwgMHgyZTIyMDIxLAotMHg4YzgzMDAwMCwgMHgyNDAyMDAwNSwgMHgxNDYyMDAxZiwgMHgwLAotMHg4ZWUzNGUyOCwgMHg4ZWUyNGUyYywgMHgxMDYyMDAxYiwgMHgyNDAzMDA0MCwKLTB4OGM4MjAwMDQsIDB4MjQ0MjAwMDEsIDB4YWM4MjAwMDQsIDB4OGVlMjRlMmMsCi0weDhlZTU0ZTI4LCAweDI0NDIwMDAxLCAweDEwNDMwMDA3LCAweDAsCi0weDhlZTI0ZTJjLCAweDI0NDIwMDAxLCAweDEwYTIwMDA1LCAweDAsCi0weDgwMDI4MzksIDB4MCwgMHgxNGEwMDAwNSwgMHgwLAotMHg4ZjgyMDEwOCwgMHgyNDQyMDAyMCwgMHhhZjgyMDEwOCwgMHg4ZjgyMDEwOCwKLTB4OGM4MjAwMDQsIDB4MmM0MjAwMTEsIDB4NTA0MDAwMTMsIDB4YWM4MDAwMDAsCi0weDgwMDI4NGYsIDB4MCwgMHg4ZWUyNGUyOCwgMHgyNDAzMDA0MCwKLTB4MjQ0MjAwMDEsIDB4NTA0MzAwMDMsIDB4MTAyMSwgMHg4ZWUyNGUyOCwKLTB4MjQ0MjAwMDEsIDB4YWVlMjRlMjgsIDB4OGVlMjRlMjgsIDB4MjEwYzAsCi0weDI0NDI0ZTM4LCAweDJlMjIwMjEsIDB4MjQwMjAwMDUsIDB4YWM4MjAwMDAsCi0weDI0MDIwMDAxLCAweGFjODIwMDA0LCAweDE1MjAwMDBhLCAweDM0MDI4MTAwLAotMHhhZmFiMDAxMCwgMHg4ZWUyNzI2NCwgMHgzYzA0MDAwMSwgMHgyNDg0NTczMCwKLTB4M2MwNTAwMDQsIDB4YWZhMjAwMTQsIDB4OGVlNjA0ZTQsIDB4ODAwMjhiZSwKLTB4MzRhNWYwMTYsIDB4OGVlMzcyNjQsIDB4YTQ2MjAwMGMsIDB4OGVlMzcyNjQsCi0weDk1ODIwMDBlLCAweGE0NjIwMDBlLCAweDgwMDI4YzIsIDB4MjRlNzAwMDQsCi0weDhmODMwMTAwLCAweDI3NjIzMDAwLCAweDI0NjQwMDIwLCAweDgyMTAyYiwKLTB4NTA0MDAwMDEsIDB4Mjc2NDI4MDAsIDB4OGY4MjAxMDgsIDB4MTA4MjAwMDQsCi0weDAsIDB4OGY4MjAxMDQsIDB4MTQ4MjAwMDcsIDB4MjQwNTAwMDUsCi0weDhlZTIwMWE4LCAweDQ4MjEsIDB4MjQ0MjAwMDEsIDB4YWVlMjAxYTgsCi0weDgwMDI4YjYsIDB4OGVlMjAxYTgsIDB4YWM2YTAwMDAsIDB4YWM2YjAwMDQsCi0weDhlZTI3MjY0LCAweGE0NjcwMDBlLCAweGFjNjUwMDE4LCAweGFjNjIwMDA4LAotMHg4ZWUyMDRlNCwgMHhhYzYyMDAxYywgMHg4ZWUyMDRjOCwgMHhhYzYyMDAxMCwKLTB4YWY4NDAxMDAsIDB4OTJlMjA0ZWMsIDB4MTQ0MDAwMzYsIDB4MjQwOTAwMDEsCi0weDhlZTI0ZTI4LCAweDIxMGMwLCAweDI0NDI0ZTM4LCAweDJlMjIwMjEsCi0weDhjODIwMDAwLCAweDE0NDUwMDFmLCAweDAsIDB4OGVlMzRlMjgsCi0weDhlZTI0ZTJjLCAweDEwNjIwMDFiLCAweDI0MDMwMDQwLCAweDhjODIwMDA0LAotMHgyNDQyMDAwMSwgMHhhYzgyMDAwNCwgMHg4ZWUyNGUyYywgMHg4ZWU1NGUyOCwKLTB4MjQ0MjAwMDEsIDB4MTA0MzAwMDcsIDB4MCwgMHg4ZWUyNGUyYywKLTB4MjQ0MjAwMDEsIDB4MTBhMjAwMDUsIDB4MCwgMHg4MDAyOGEwLAotMHgwLCAweDE0YTAwMDA1LCAweDAsIDB4OGY4MjAxMDgsCi0weDI0NDIwMDIwLCAweGFmODIwMTA4LCAweDhmODIwMTA4LCAweDhjODIwMDA0LAotMHgyYzQyMDAxMSwgMHg1MDQwMDAxMywgMHhhYzgwMDAwMCwgMHg4MDAyOGI2LAotMHgwLCAweDhlZTI0ZTI4LCAweDI0MDMwMDQwLCAweDI0NDIwMDAxLAotMHg1MDQzMDAwMywgMHgxMDIxLCAweDhlZTI0ZTI4LCAweDI0NDIwMDAxLAotMHhhZWUyNGUyOCwgMHg4ZWUyNGUyOCwgMHgyMTBjMCwgMHgyNDQyNGUzOCwKLTB4MmUyMjAyMSwgMHgyNDAyMDAwNSwgMHhhYzgyMDAwMCwgMHgyNDAyMDAwMSwKLTB4YWM4MjAwMDQsIDB4MTUyMDAwMGIsIDB4M2MwNTAwMDQsIDB4M2MwNDAwMDEsCi0weDI0ODQ1NzQ4LCAweGFmYWIwMDEwLCAweGFmYTAwMDE0LCAweDhlZTYwNGU0LAotMHgzNGE1ZjAxNywgMHhjMDAyNDAzLCAweDMwZTdmZmZmLCAweDgwMDI4ZTEsCi0weDAsIDB4OGVlMjcyNjQsIDB4M2MwNTAwMDEsIDB4MzBlNGZmZmYsCi0weDQ0MTAyMSwgMHhhZWUyNzI2NCwgMHg4ZWUyNzI1YywgMHg4ZWUzNzI2NCwKLTB4MzRhNTM4MDAsIDB4NDQxMDIxLCAweGFlZTI3MjVjLCAweDM2NTEwMjEsCi0weDYyMTgyYiwgMHgxNDYwMDAwNCwgMHgzYzAzZmZmZiwgMHg4ZWUyNzI2NCwKLTB4NDMxMDIxLCAweGFlZTI3MjY0LCAweDhlZTMwNGU0LCAweDk2ZTIwNDU4LAotMHgyNDYzMDAwMSwgMHgyNDQyZmZmZiwgMHg2MjE4MjQsIDB4YWVlMzA0ZTQsCi0weDhlZTMwNGU0LCAweDhlZTIwNGUwLCAweDE0NjIwMDA1LCAweDAsCi0weDhmODIwMDYwLCAweDI0MDNmZmY3LCAweDQzMTAyNCwgMHhhZjgyMDA2MCwKLTB4OGZiZjAwMjAsIDB4M2UwMDAwOCwgMHgyN2JkMDAyOCwgMHgyN2JkZmZlMCwKLTB4YWZiZjAwMTgsIDB4OGVlMzA0ZTgsIDB4OGVlMjA0ZTAsIDB4MTA2MjAxODksCi0weDAsIDB4OGVlMjA0ZTgsIDB4OGVlMzA0ZmMsIDB4MjExMDAsCi0weDYyMTgyMSwgMHg5NDY3MDAwOCwgMHg5MmUyMDRlZCwgMHg4YzY4MDAwMCwKLTB4OGM2OTAwMDQsIDB4MTA0MDAwMjMsIDB4OTQ2YTAwMGEsIDB4OGVlMjA0YzgsCi0weDM0NDYwNDAwLCAweDMxNDIwMjAwLCAweDEwNDAwMDFmLCAweDAsCi0weDk2ZTIwNDVhLCAweDMwNDIwMDEwLCAweDEwNDAwMDFiLCAweDNjMDI4MDAwLAotMHgzYzAxMDAwMSwgMHgzNzA4MjEsIDB4YWMyMjgzZDgsIDB4OGVlMjcyNjQsCi0weDk0NjQwMDBlLCAweDNjMDUwMDAxLCAweDM0YTUzODAwLCAweDI0NDIwMDA0LAotMHhhZWUyNzI2NCwgMHg4ZWUzNzI2NCwgMHg0MjQwMCwgMHgzNjUxMDIxLAotMHgzYzAxMDAwMSwgMHgzNzA4MjEsIDB4YWMyNDgzZGMsIDB4NjIxODJiLAotMHgxNDYwMDAwNSwgMHgyNGU3MDAwNCwgMHg4ZWUyNzI2NCwgMHgzYzAzZmZmZiwKLTB4NDMxMDIxLCAweGFlZTI3MjY0LCAweDhlZTI3MjY0LCAweDgwMDI5MTcsCi0weGFlZTI3MjU4LCAweDhlZTYwNGM4LCAweDhlZTI3MjZjLCAweDMwZTRmZmZmLAotMHg0NDEwMmEsIDB4MTA0MDAwMTUsIDB4MCwgMHg4ZjgyMDBkOCwKLTB4OGVlMzcyNTgsIDB4NDMxMDIzLCAweGFlZTI3MjZjLCAweDhlZTI3MjZjLAotMHgxYzQwMDAwNywgMHg0NDEwMmEsIDB4OGVlMjcyNmMsIDB4M2MwMzAwMDEsCi0weDQzMTAyMSwgMHhhZWUyNzI2YywgMHg4ZWUyNzI2YywgMHg0NDEwMmEsCi0weDEwNDAwMDA2LCAweDAsIDB4OGVlMjAxYjgsIDB4MjQ0MjAwMDEsCi0weGFlZTIwMWI4LCAweDgwMDJhNzIsIDB4OGVlMjAxYjgsIDB4M2MwMjAwMDEsCi0weDU3MTAyMSwgMHg4YzQyODNkOCwgMHg1NDQwMDAwMSwgMHgyNGU3ZmZmYywKLTB4MzE0MjAwMDQsIDB4MTA0MDAwYjksIDB4MzBlMmZmZmYsIDB4M2MwMjAwMDEsCi0weDU3MTAyMSwgMHg4YzQyODNkOCwgMHgxMDQwMDAyZiwgMHg1MDIxLAotMHg4Zjg0MDEwMCwgMHgyNzYyMzAwMCwgMHgyNDg1MDAyMCwgMHhhMjEwMmIsCi0weDUwNDAwMDAxLCAweDI3NjUyODAwLCAweDhmODIwMTA4LCAweDEwYTIwMDMyLAotMHgwLCAweDhmODIwMTA0LCAweDEwYTIwMDJmLCAweDI0MDIwMDE1LAotMHhhYzg4MDAwMCwgMHhhYzg5MDAwNCwgMHg4ZWUzNzI2NCwgMHhhNDg3MDAwZSwKLTB4YWM4MjAwMTgsIDB4YWM4MzAwMDgsIDB4OGVlMjA0ZTgsIDB4M2MwMzAwMDEsCi0weDc3MTgyMSwgMHg4YzYzODNkYywgMHhhYzg2MDAxMCwgMHg0MzEwMjUsCi0weGFjODIwMDFjLCAweGFmODUwMTAwLCAweDkyZTIwNGVjLCAweDE0NDAwMDY2LAotMHgyNDBhMDAwMSwgMHg4ZWUyNGUyOCwgMHgyNDAzMDA0MCwgMHgyNDQyMDAwMSwKLTB4NTA0MzAwMDMsIDB4MTAyMSwgMHg4ZWUyNGUyOCwgMHgyNDQyMDAwMSwKLTB4YWVlMjRlMjgsIDB4OGVlMjRlMjgsIDB4MjEwYzAsIDB4MjQ0MjRlMzgsCi0weDJlMjE4MjEsIDB4MjQwMjAwMTUsIDB4YWM2MjAwMDAsIDB4MjQwMjAwMDEsCi0weDgwMDI5YmYsIDB4YWM2MjAwMDQsIDB4OGY4NDAxMDAsIDB4Mjc2MjMwMDAsCi0weDI0ODUwMDIwLCAweGEyMTAyYiwgMHg1MDQwMDAwMSwgMHgyNzY1MjgwMCwKLTB4OGY4MjAxMDgsIDB4MTBhMjAwMDQsIDB4MCwgMHg4ZjgyMDEwNCwKLTB4MTRhMjAwMDYsIDB4MjQwMjAwMDYsIDB4OGVlMjAxYTgsIDB4MjQ0MjAwMDEsCi0weGFlZTIwMWE4LCAweDgwMDI5YmYsIDB4OGVlMjAxYTgsIDB4YWM4ODAwMDAsCi0weGFjODkwMDA0LCAweDhlZTM3MjY0LCAweGE0ODcwMDBlLCAweGFjODIwMDE4LAotMHhhYzgzMDAwOCwgMHg4ZWUyMDRlOCwgMHhhYzg2MDAxMCwgMHhhYzgyMDAxYywKLTB4YWY4NTAxMDAsIDB4OTJlMjA0ZWMsIDB4MTQ0MDAwMzcsIDB4MjQwYTAwMDEsCi0weDhlZTI0ZTI4LCAweDIxMGMwLCAweDI0NDI0ZTM4LCAweDJlMjIwMjEsCi0weDhjODMwMDAwLCAweDI0MDIwMDA1LCAweDE0NjIwMDFmLCAweDAsCi0weDhlZTM0ZTI4LCAweDhlZTI0ZTJjLCAweDEwNjIwMDFiLCAweDI0MDMwMDQwLAotMHg4YzgyMDAwNCwgMHgyNDQyMDAwMSwgMHhhYzgyMDAwNCwgMHg4ZWUyNGUyYywKLTB4OGVlNTRlMjgsIDB4MjQ0MjAwMDEsIDB4MTA0MzAwMDcsIDB4MCwKLTB4OGVlMjRlMmMsIDB4MjQ0MjAwMDEsIDB4MTBhMjAwMDUsIDB4MCwKLTB4ODAwMjlhOSwgMHgwLCAweDE0YTAwMDA1LCAweDAsCi0weDhmODIwMTA4LCAweDI0NDIwMDIwLCAweGFmODIwMTA4LCAweDhmODIwMTA4LAotMHg4YzgyMDAwNCwgMHgyYzQyMDAxMSwgMHg1MDQwMDAxMywgMHhhYzgwMDAwMCwKLTB4ODAwMjliZiwgMHgwLCAweDhlZTI0ZTI4LCAweDI0MDMwMDQwLAotMHgyNDQyMDAwMSwgMHg1MDQzMDAwMywgMHgxMDIxLCAweDhlZTI0ZTI4LAotMHgyNDQyMDAwMSwgMHhhZWUyNGUyOCwgMHg4ZWUyNGUyOCwgMHgyMTBjMCwKLTB4MjQ0MjRlMzgsIDB4MmUyMjAyMSwgMHgyNDAyMDAwNSwgMHhhYzgyMDAwMCwKLTB4MjQwMjAwMDEsIDB4YWM4MjAwMDQsIDB4MTU0MDAwMGEsIDB4MjQwMjAwMDEsCi0weGFmYTkwMDEwLCAweDhlZTI3MjY0LCAweDNjMDQwMDAxLCAweDI0ODQ1NzMwLAotMHgzYzA1MDAwNCwgMHhhZmEyMDAxNCwgMHg4ZWU2MDRlNCwgMHg4MDAyYTRmLAotMHgzNGE1ZjIwNCwgMHhhMmUyMDRlZCwgMHg4ZWUyMDRlOCwgMHg4ZWUzMDRmYywKLTB4OGVlNDcyNTgsIDB4M2MwNjAwMDEsIDB4MzRjNjM4MDAsIDB4M2MwMTAwMDEsCi0weDM3MDgyMSwgMHhhYzIwODNkOCwgMHgzYzAxMDAwMSwgMHgzNzA4MjEsCi0weGFjMjA4M2RjLCAweDIxMTAwLCAweDQzMTAyMSwgMHhhYzQ0MDAwYywKLTB4OGVlMjcyNjQsIDB4MjQwNWZmZjgsIDB4MzBlM2ZmZmYsIDB4NDMxMDIxLAotMHgyNDQyMDAwNywgMHg0NTEwMjQsIDB4MjQ2MzAwMDcsIDB4YWVlMjcyNTgsCi0weDhlZTI3MjZjLCAweDhlZTQ3MjU4LCAweDY1MTgyNCwgMHg0MzEwMjMsCi0weGFlZTI3MjZjLCAweDM2NjEwMjEsIDB4ODIyMDJiLCAweDE0ODAwMDA0LAotMHgzYzAzZmZmZiwgMHg4ZWUyNzI1OCwgMHg0MzEwMjEsIDB4YWVlMjcyNTgsCi0weDhlZTI3MjU4LCAweDgwMDJhNjQsIDB4YWVlMjcyNjQsIDB4MTA0MDAwNzMsCi0weDAsIDB4OGY4MzAxMDAsIDB4Mjc2MjMwMDAsIDB4MjQ2NDAwMjAsCi0weDgyMTAyYiwgMHgxNDQwMDAwMiwgMHg1MDIxLCAweDI3NjQyODAwLAotMHg4ZjgyMDEwOCwgMHgxMDgyMDAwNCwgMHgwLCAweDhmODIwMTA0LAotMHgxNDgyMDAwNiwgMHgyNDA1MDAwNSwgMHg4ZWUyMDFhOCwgMHgyNDQyMDAwMSwKLTB4YWVlMjAxYTgsIDB4ODAwMmE0NiwgMHg4ZWUyMDFhOCwgMHhhYzY4MDAwMCwKLTB4YWM2OTAwMDQsIDB4OGVlMjcyNjQsIDB4YTQ2NzAwMGUsIDB4YWM2NTAwMTgsCi0weGFjNjIwMDA4LCAweDhlZTIwNGU4LCAweGFjNjYwMDEwLCAweGFjNjIwMDFjLAotMHhhZjg0MDEwMCwgMHg5MmUyMDRlYywgMHgxNDQwMDAzNiwgMHgyNDBhMDAwMSwKLTB4OGVlMjRlMjgsIDB4MjEwYzAsIDB4MjQ0MjRlMzgsIDB4MmUyMjAyMSwKLTB4OGM4MjAwMDAsIDB4MTQ0NTAwMWYsIDB4MCwgMHg4ZWUzNGUyOCwKLTB4OGVlMjRlMmMsIDB4MTA2MjAwMWIsIDB4MjQwMzAwNDAsIDB4OGM4MjAwMDQsCi0weDI0NDIwMDAxLCAweGFjODIwMDA0LCAweDhlZTI0ZTJjLCAweDhlZTU0ZTI4LAotMHgyNDQyMDAwMSwgMHgxMDQzMDAwNywgMHgwLCAweDhlZTI0ZTJjLAotMHgyNDQyMDAwMSwgMHgxMGEyMDAwNSwgMHgwLCAweDgwMDJhMzAsCi0weDAsIDB4MTRhMDAwMDUsIDB4MCwgMHg4ZjgyMDEwOCwKLTB4MjQ0MjAwMjAsIDB4YWY4MjAxMDgsIDB4OGY4MjAxMDgsIDB4OGM4MjAwMDQsCi0weDJjNDIwMDExLCAweDUwNDAwMDEzLCAweGFjODAwMDAwLCAweDgwMDJhNDYsCi0weDAsIDB4OGVlMjRlMjgsIDB4MjQwMzAwNDAsIDB4MjQ0MjAwMDEsCi0weDUwNDMwMDAzLCAweDEwMjEsIDB4OGVlMjRlMjgsIDB4MjQ0MjAwMDEsCi0weGFlZTI0ZTI4LCAweDhlZTI0ZTI4LCAweDIxMGMwLCAweDI0NDI0ZTM4LAotMHgyZTIyMDIxLCAweDI0MDIwMDA1LCAweGFjODIwMDAwLCAweDI0MDIwMDAxLAotMHhhYzgyMDAwNCwgMHgxNTQwMDAwYywgMHgzMGU1ZmZmZiwgMHgzYzA0MDAwMSwKLTB4MjQ4NDU3NDgsIDB4M2MwNTAwMDQsIDB4YWZhOTAwMTAsIDB4YWZhMDAwMTQsCi0weDhlZTYwNGU0LCAweDM0YTVmMjM3LCAweGMwMDI0MDMsIDB4MzBlN2ZmZmYsCi0weDgwMDJhNzIsIDB4MCwgMHg4ZWUyNzI2NCwgMHg0NTEwMjEsCi0weGFlZTI3MjY0LCAweDhlZTI3MjZjLCAweDhlZTM3MjY0LCAweDNjMDQwMDAxLAotMHgzNDg0MzgwMCwgMHhhMmUwMDRlZCwgMHg0NTEwMjMsIDB4YWVlMjcyNmMsCi0weDM2NDEwMjEsIDB4NjIxODJiLCAweDE0NjAwMDA0LCAweDNjMDNmZmZmLAotMHg4ZWUyNzI2NCwgMHg0MzEwMjEsIDB4YWVlMjcyNjQsIDB4OGVlMzA0ZTgsCi0weDk2ZTIwNDU4LCAweDI0NjMwMDAxLCAweDI0NDJmZmZmLCAweDYyMTgyNCwKLTB4YWVlMzA0ZTgsIDB4OGVlMzA0ZTgsIDB4OGVlMjA0ZTAsIDB4MTQ2MjAwMDUsCi0weDAsIDB4OGY4MjAwNjAsIDB4MjQwM2ZmZjcsIDB4NDMxMDI0LAotMHhhZjgyMDA2MCwgMHg4ZmJmMDAxOCwgMHgzZTAwMDA4LCAweDI3YmQwMDIwLAotMHgyN2JkZmZlMCwgMHhhZmJmMDAxYywgMHhhZmIwMDAxOCwgMHg4ZjgyMDEwMCwKLTB4OGVlMzRlMmMsIDB4OGY4MjAxMDQsIDB4OGY4NTAxMDgsIDB4MjQwMjAwNDAsCi0weDI0NjMwMDAxLCAweDUwNjIwMDAzLCAweDEwMjEsIDB4OGVlMjRlMmMsCi0weDI0NDIwMDAxLCAweGFlZTI0ZTJjLCAweDhlZTI0ZTJjLCAweDhlZTM0ZTJjLAotMHgyMTBjMCwgMHgyNDQyNGUzOCwgMHgyZTIyMDIxLCAweDhlZTI0ZTI4LAotMHg4Yzg3MDAwNCwgMHgxNDYyMDAwNywgMHhhMDMwMjEsIDB4OGY4MjAxMDgsCi0weDI0NDIwMDIwLCAweGFmODIwMTA4LCAweDhmODIwMTA4LCAweDgwMDJhYTIsCi0weGFjODAwMDAwLCAweDhlZTI0ZTJjLCAweDI0MDMwMDQwLCAweDI0NDIwMDAxLAotMHg1MDQzMDAwMywgMHgxMDIxLCAweDhlZTI0ZTJjLCAweDI0NDIwMDAxLAotMHgyMTBjMCwgMHgyNDQyNGUzOCwgMHgyZTIyMDIxLCAweDhjODIwMDA0LAotMHg4ZjgzMDEwOCwgMHgyMTE0MCwgMHg2MjE4MjEsIDB4YWY4MzAxMDgsCi0weGFjODAwMDAwLCAweDhjYzIwMDE4LCAweDI0NDNmZmZlLCAweDJjNjIwMDEzLAotMHgxMDQwMDBjMSwgMHgzMTA4MCwgMHgzYzAxMDAwMSwgMHgyMjA4MjEsCi0weDhjMjI1NzcwLCAweDQwMDAwOCwgMHgwLCAweDhlZTIwNGYwLAotMHg0NzEwMjEsIDB4YWVlMjA0ZjAsIDB4OGVlMjA0ZjAsIDB4OGY0MzAyM2MsCi0weDQzMTAyYiwgMHgxNDQwMDBiZSwgMHgwLCAweDhlZTMwNGU0LAotMHg4ZWUyMDRmOCwgMHg1MDYyMDBiYSwgMHhhMmUwMDRmNCwgMHg4ZjgzMDEyMCwKLTB4Mjc2MjM4MDAsIDB4MjQ2NjAwMjAsIDB4YzIxMDJiLCAweDUwNDAwMDAxLAotMHgyNzY2MzAwMCwgMHg4ZjgyMDEyOCwgMHgxMGMyMDAwNCwgMHgwLAotMHg4ZjgyMDEyNCwgMHgxNGMyMDAwNywgMHgwLCAweDhlZTIwMWE0LAotMHg4MDIxLCAweDI0NDIwMDAxLCAweGFlZTIwMWE0LCAweDgwMDJiMTIsCi0weDhlZTIwMWE0LCAweDhlZTIwNGU0LCAweGFjNjIwMDFjLCAweDhlZTQwNGIwLAotMHg4ZWU1MDRiNCwgMHgyNDYyMDAxYywgMHhhYzYyMDAwOCwgMHgyNDAyMDAwOCwKLTB4YTQ2MjAwMGUsIDB4MjQwMjAwMTEsIDB4YWM2MjAwMTgsIDB4YWM2NDAwMDAsCi0weGFjNjUwMDA0LCAweDhlZTIwNGM0LCAweGFjNjIwMDEwLCAweGFmODYwMTIwLAotMHg5MmUyNGUyMCwgMHgxNDQwMDAzNywgMHgyNDEwMDAwMSwgMHg4ZWUyNGUzMCwKLTB4MjEwYzAsIDB4MjQ0MjUwMzgsIDB4MmUyMjAyMSwgMHg4YzgzMDAwMCwKLTB4MjQwMjAwMTIsIDB4MTQ2MjAwMWYsIDB4MCwgMHg4ZWUzNGUzMCwKLTB4OGVlMjRlMzQsIDB4MTA2MjAwMWIsIDB4MjQwMzAwNDAsIDB4OGM4MjAwMDQsCi0weDI0NDIwMDAxLCAweGFjODIwMDA0LCAweDhlZTI0ZTM0LCAweDhlZTU0ZTMwLAotMHgyNDQyMDAwMSwgMHgxMDQzMDAwNywgMHgwLCAweDhlZTI0ZTM0LAotMHgyNDQyMDAwMSwgMHgxMGEyMDAwNSwgMHgwLCAweDgwMDJhZmMsCi0weDAsIDB4MTRhMDAwMDUsIDB4MCwgMHg4ZjgyMDEyOCwKLTB4MjQ0MjAwMjAsIDB4YWY4MjAxMjgsIDB4OGY4MjAxMjgsIDB4OGM4MjAwMDQsCi0weDJjNDIwMDExLCAweDUwNDAwMDEzLCAweGFjODAwMDAwLCAweDgwMDJiMTIsCi0weDAsIDB4OGVlMjRlMzAsIDB4MjQwMzAwNDAsIDB4MjQ0MjAwMDEsCi0weDUwNDMwMDAzLCAweDEwMjEsIDB4OGVlMjRlMzAsIDB4MjQ0MjAwMDEsCi0weGFlZTI0ZTMwLCAweDhlZTI0ZTMwLCAweDIxMGMwLCAweDI0NDI1MDM4LAotMHgyZTIyMDIxLCAweDI0MDIwMDEyLCAweGFjODIwMDAwLCAweDI0MDIwMDAxLAotMHhhYzgyMDAwNCwgMHg1NjAwMDAwYiwgMHgyNDEwMDAwMSwgMHg4ZWUyMDRlNCwKLTB4M2MwNDAwMDEsIDB4MjQ4NDU3NTQsIDB4YWZhMDAwMTQsIDB4YWZhMjAwMTAsCi0weDhlZTYwNjA4LCAweDhmNDcwMjI4LCAweDNjMDUwMDA5LCAweGMwMDI0MDMsCi0weDM0YTVmMDA2LCAweDE2MDAwMDAzLCAweDI0MDIwMDAxLCAweDgwMDJiNzEsCi0weGEyZTIwNGY0LCAweDhlZTIwMTcwLCAweDI0NDIwMDAxLCAweGFlZTIwMTcwLAotMHg4ZWUyMDE3MCwgMHg4ZWUyMDRlNCwgMHhhMmUwMDRmNCwgMHhhZWUwMDRmMCwKLTB4YWVlMjA0ZjgsIDB4OGY0MjAyM2MsIDB4NTA0MDAwNDUsIDB4YWVlMDcyNzQsCi0weDhlZTIwMTg0LCAweDI0NDIwMDAxLCAweGFlZTIwMTg0LCAweDhlZTIwMTg0LAotMHg4MDAyYjcxLCAweGFlZTA3Mjc0LCAweDhlZTIwNTA0LCAweDI0MDMwMDQwLAotMHgyNDQyMDAwMSwgMHg1MDQzMDAwMywgMHgxMDIxLCAweDhlZTIwNTA0LAotMHgyNDQyMDAwMSwgMHhhZWUyMDUwNCwgMHg4ZWUyMDUwNCwgMHg4Y2MzMDAxOCwKLTB4MjEwODAsIDB4NTcxMDIxLCAweDhjNDQwNTA4LCAweDI0MDIwMDAzLAotMHgxNDYyMDAwZiwgMHgwLCAweDNjMDIwMDAxLCAweDU3MTAyMSwKLTB4OTA0MjgzYjEsIDB4MTA0MDAwMTQsIDB4MCwgMHg4ZWUyMDFkMCwKLTB4OGVlMzUyNDAsIDB4NDQxMDIxLCAweGFlZTIwMWQwLCAweDhlZTIwMWQ4LAotMHg2NDE4MjEsIDB4MzA2MzAwZmYsIDB4ODAwMmI1OSwgMHhhZWUzNTI0MCwKLTB4OGVlMjAxY2MsIDB4OGVlMzBlMTAsIDB4NDQxMDIxLCAweGFlZTIwMWNjLAotMHg4ZWUyMDFkOCwgMHg2NDE4MjEsIDB4MzA2MzAxZmYsIDB4YWVlMzBlMTAsCi0weDQ0MTAyMSwgMHhhZWUyMDFkOCwgMHg4ZWUyMDAwMCwgMHgzNDQyMDA0MCwKLTB4ODAwMmI3MSwgMHhhZWUyMDAwMCwgMHg4ZWUyMDE0YywgMHgzYzAxMDAwMSwKLTB4MzcwODIxLCAweGEwMjA4M2UwLCAweDI0NDIwMDAxLCAweGFlZTIwMTRjLAotMHg4MDAyYjcxLCAweDhlZTIwMTRjLCAweDk0YzcwMDBlLCAweDhjYzIwMDFjLAotMHgzYzA0MDAwMSwgMHgyNDg0NTc2MCwgMHhhZmE2MDAxNCwgMHhhZmEyMDAxMCwKLTB4OGNjNjAwMTgsIDB4M2MwNTAwMDgsIDB4YzAwMjQwMywgMHgzNGE1MDkxMCwKLTB4OGZiZjAwMWMsIDB4OGZiMDAwMTgsIDB4M2UwMDAwOCwgMHgyN2JkMDAyMCwKLTB4MjdiZGZmOTgsIDB4YWZiZjAwNjAsIDB4YWZiZTAwNWMsIDB4YWZiNjAwNTgsCi0weGFmYjUwMDU0LCAweGFmYjQwMDUwLCAweGFmYjMwMDRjLCAweGFmYjIwMDQ4LAotMHhhZmIxMDA0NCwgMHhhZmIwMDA0MCwgMHg4ZjgzMDEwOCwgMHg4ZjgyMDEwNCwKLTB4YWZhMDAwMjQsIDB4MTA2MjAzZTcsIDB4YWZhMDAwMmMsIDB4M2MxZTAwMDEsCi0weDM3ZGUzODAwLCAweDNjMGJmZmZmLCAweDhmOTMwMTA4LCAweDhlNjIwMDE4LAotMHg4ZjgzMDEwNCwgMHgyNDQzZmZmZSwgMHgyYzYyMDAxNCwgMHgxMDQwMDNjZiwKLTB4MzEwODAsIDB4M2MwMTAwMDEsIDB4MjIwODIxLCAweDhjMjI1N2MwLAotMHg0MDAwMDgsIDB4MCwgMHg5NjYzMDAwZSwgMHg4ZWUyNzI1YywKLTB4OGVlNDA0ZjAsIDB4NDMxMDIxLCAweGFlZTI3MjVjLCAweDhlNjMwMDFjLAotMHg5NmUyMDQ1OCwgMHgyNDg0MDAwMSwgMHhhZWU0MDRmMCwgMHgyNDYzMDAwMSwKLTB4MjQ0MmZmZmYsIDB4NjIxODI0LCAweGFlZTMwNGU0LCAweDhmNDIwMjNjLAotMHg4MjIwMmIsIDB4MTQ4MDAzYjksIDB4MCwgMHg4ZjgzMDEyMCwKLTB4Mjc2MjM4MDAsIDB4MjQ2NjAwMjAsIDB4YzIxMDJiLCAweDUwNDAwMDAxLAotMHgyNzY2MzAwMCwgMHg4ZjgyMDEyOCwgMHgxMGMyMDAwNCwgMHgwLAotMHg4ZjgyMDEyNCwgMHgxNGMyMDAwNywgMHgwLCAweDhlZTIwMWE0LAotMHg4MDIxLCAweDI0NDIwMDAxLCAweGFlZTIwMWE0LCAweDgwMDJiZmUsCi0weDhlZTIwMWE0LCAweDhlZTIwNGU0LCAweGFjNjIwMDFjLCAweDhlZTQwNGIwLAotMHg4ZWU1MDRiNCwgMHgyNDYyMDAxYywgMHhhYzYyMDAwOCwgMHgyNDAyMDAwOCwKLTB4YTQ2MjAwMGUsIDB4MjQwMjAwMTEsIDB4YWM2MjAwMTgsIDB4YWM2NDAwMDAsCi0weGFjNjUwMDA0LCAweDhlZTIwNGM0LCAweGFjNjIwMDEwLCAweGFmODYwMTIwLAotMHg5MmUyNGUyMCwgMHgxNDQwMDAzNywgMHgyNDEwMDAwMSwgMHg4ZWUyNGUzMCwKLTB4MjEwYzAsIDB4MjQ0MjUwMzgsIDB4MmUyMjAyMSwgMHg4YzgzMDAwMCwKLTB4MjQwMjAwMTIsIDB4MTQ2MjAwMWYsIDB4MCwgMHg4ZWUzNGUzMCwKLTB4OGVlMjRlMzQsIDB4MTA2MjAwMWIsIDB4MjQwYzAwNDAsIDB4OGM4MjAwMDQsCi0weDI0NDIwMDAxLCAweGFjODIwMDA0LCAweDhlZTI0ZTM0LCAweDhlZTM0ZTMwLAotMHgyNDQyMDAwMSwgMHgxMDRjMDAwNywgMHgwLCAweDhlZTI0ZTM0LAotMHgyNDQyMDAwMSwgMHgxMDYyMDAwNSwgMHgwLCAweDgwMDJiZTgsCi0weDAsIDB4MTQ2MDAwMDUsIDB4MCwgMHg4ZjgyMDEyOCwKLTB4MjQ0MjAwMjAsIDB4YWY4MjAxMjgsIDB4OGY4MjAxMjgsIDB4OGM4MjAwMDQsCi0weDJjNDIwMDExLCAweDUwNDAwMDEzLCAweGFjODAwMDAwLCAweDgwMDJiZmUsCi0weDAsIDB4OGVlMjRlMzAsIDB4MjQwYzAwNDAsIDB4MjQ0MjAwMDEsCi0weDUwNGMwMDAzLCAweDEwMjEsIDB4OGVlMjRlMzAsIDB4MjQ0MjAwMDEsCi0weGFlZTI0ZTMwLCAweDhlZTI0ZTMwLCAweDIxMGMwLCAweDI0NDI1MDM4LAotMHgyZTIyMDIxLCAweDI0MDIwMDEyLCAweDI0MGMwMDAxLCAweGFjODIwMDAwLAotMHhhYzhjMDAwNCwgMHg1NjAwMDAwZCwgMHgyNDEwMDAwMSwgMHg4ZWUyMDRlNCwKLTB4M2MwNDAwMDEsIDB4MjQ4NDU3NTQsIDB4YWZhMDAwMTQsIDB4YWZhMjAwMTAsCi0weDhlZTYwNjA4LCAweDhmNDcwMjI4LCAweDNjMDUwMDA5LCAweDM0YTVmMDA2LAotMHhjMDAyNDAzLCAweGFmYWIwMDM4LCAweDhmYWIwMDM4LCAweDEyMDAwMzBhLAotMHgyNDBjMDAwMSwgMHg4MDAyZjE5LCAweDAsIDB4OTY2YzAwMWMsCi0weGFmYWMwMDJjLCAweDk2NjIwMDFlLCAweDNjMGM4MDAwLCAweGFmYWMwMDI0LAotMHhhZTYyMDAxYywgMHg4ZTc1MDAxYywgMHg4ZWUyMDRmYywgMHg4ZWU0MDRmYywKLTB4MTUxOTAwLCAweDYyMTAyMSwgMHg4YzUyMDAwYywgMHg5MmUyN2I5OCwKLTB4NjQxODIxLCAweDk0NzYwMDBhLCAweDE0NDAwMDAzLCAweDMyYzIwMDAyLAotMHhhZWYyN2JhNCwgMHhhZWY1N2I5YywgMHgxMDQwMDA0YiwgMHg4MDIxLAotMHg5NmUyMDQ1YSwgMHgzMDQyMDAwMiwgMHgxMDQwMDA0NywgMHgwLAotMHg4ZTYzMDAxYywgMHg4ZWUyMDRmYywgMHgzMjEwMCwgMHg4MjEwMjEsCi0weDhjNDIwMDBjLCAweDM3ZTE4MjEsIDB4MjQ0MjAwMjIsIDB4NDMxMDJiLAotMHgxNDQwMDAwYSwgMHgyNDA1MDAxNCwgMHg4ZWUyMDRmYywgMHg4MjEwMjEsCi0weDhjNDQwMDBjLCAweGFmYWIwMDM4LCAweGMwMDJmNzUsIDB4MjQ4NDAwMGUsCi0weDhmYWIwMDM4LCAweDgwMDJjNTIsIDB4MzA1MGZmZmYsIDB4OGVlMjA0ZmMsCi0weDgyMTAyMSwgMHg4YzQyMDAwYywgMHg5NDUwMDAwZSwgMHg5NDQzMDAxMCwKLTB4OTQ0NDAwMTIsIDB4OTQ0NTAwMTQsIDB4MjAzODAyMSwgMHgyMDQ4MDIxLAotMHgyMDU4MDIxLCAweDk0NDMwMDE2LCAweDk0NDQwMDE4LCAweDk0NDUwMDFhLAotMHgyMDM4MDIxLCAweDIwNDgwMjEsIDB4MjA1ODAyMSwgMHg5NDQzMDAxYywKLTB4OTQ0NDAwMWUsIDB4OTQ0MjAwMjAsIDB4MjAzODAyMSwgMHgyMDQ4MDIxLAotMHgyMDI4MDIxLCAweDEwMWMwMiwgMHgzMjAyZmZmZiwgMHg2MjgwMjEsCi0weDhlNjMwMDFjLCAweDhlZTIwNGZjLCAweDEwMjQwMiwgMHgzMjkwMCwKLTB4YTIxMDIxLCAweDhjNDMwMDBjLCAweDMyMDJmZmZmLCAweDgyODAyMSwKLTB4MzdlMTAyMSwgMHgyNDYzMDAxOCwgMHg2MjE4MmIsIDB4MTQ2MDAwMDksCi0weDAsIDB4OGVlMjA0ZmMsIDB4YTIxMDIxLCAweDhjNDMwMDBjLAotMHgxMDEwMjcsIDB4M2MwMWZmZmYsIDB4MjMwODIxLCAweDgwMDJjNmYsCi0weGE0MjIwMDE4LCAweDhlZTIwNGZjLCAweGEyMTAyMSwgMHg4YzQzMDAwYywKLTB4MTAxMDI3LCAweGE0NjIwMDE4LCAweDk2ZTIwNDVhLCAweDg4MjEsCi0weDMwNDIwMDA4LCAweDE0NDAwMDYzLCAweGEwMjEsIDB4OGU2MzAwMWMsCi0weDhlZTIwNGZjLCAweDMzMTAwLCAweGMyMTAyMSwgMHg4YzQyMDAwYywKLTB4MzdlMTgyMSwgMHgyNDQyMDAyMiwgMHg0MzEwMmIsIDB4MTQ0MDAwMzUsCi0weDAsIDB4OGVlMjA0ZmMsIDB4YzIxMDIxLCAweDhjNDIwMDBjLAotMHgyNDQ3MDAxMCwgMHgzN2UxMDIxLCAweGUyMTAyYiwgMHg1MDQwMDAwMSwKLTB4ZWIzODIxLCAweDhlZTIwNGZjLCAweDk0ZjEwMDAwLCAweGMyMTAyMSwKLTB4OGM0MjAwMGMsIDB4MjQ0NzAwMTYsIDB4MzdlMTAyMSwgMHhlMjEwMmIsCi0weDE0NDAwMDAyLCAweDI2MzRmZmVjLCAweGViMzgyMSwgMHg4ZWUyMDRmYywKLTB4OTBlMzAwMDEsIDB4YzIxMDIxLCAweDhjNDIwMDBjLCAweDI0NDcwMDFhLAotMHgzN2UxMDIxLCAweGUyMTAyYiwgMHgxNDQwMDAwMiwgMHgyODM4ODIxLAotMHhlYjM4MjEsIDB4OTRlMjAwMDAsIDB4MjRlNzAwMDIsIDB4MjIyODgyMSwKLTB4MzdlMTAyMSwgMHhlMjEwMmIsIDB4NTA0MDAwMDEsIDB4ZWIzODIxLAotMHg5NGUyMDAwMCwgMHgyNGU3MDAwMiwgMHgyMjI4ODIxLCAweDM3ZTEwMjEsCi0weGUyMTAyYiwgMHg1MDQwMDAwMSwgMHhlYjM4MjEsIDB4OTRlMjAwMDAsCi0weDI0ZTcwMDAyLCAweDIyMjg4MjEsIDB4MzdlMTAyMSwgMHhlMjEwMmIsCi0weDUwNDAwMDAxLCAweGViMzgyMSwgMHg5NGUyMDAwMCwgMHg4MDAyY2QwLAotMHgyMjI4ODIxLCAweDhlZTIwNGZjLCAweGMyMTAyMSwgMHg4YzQzMDAwYywKLTB4OGVlMjA0ZmMsIDB4OTQ3MTAwMTAsIDB4OGVlMzA0ZmMsIDB4YzIxMDIxLAotMHg4YzQ0MDAwYywgMHhjMzE4MjEsIDB4OGM2MjAwMGMsIDB4MjYzNGZmZWMsCi0weDkwODQwMDE3LCAweDhlZTMwNGZjLCAweDk0NDIwMDFhLCAweDI4NDg4MjEsCi0weGMzMTgyMSwgMHg4YzY1MDAwYywgMHg4ZWUzMDRmYywgMHgyMjI4ODIxLAotMHg4ZWUyMDRmYywgMHhjMzE4MjEsIDB4YzIxMDIxLCAweDhjNDQwMDBjLAotMHg4YzYyMDAwYywgMHg5NGEzMDAxYywgMHg5NDg0MDAxZSwgMHg5NDQyMDAyMCwKLTB4MjIzODgyMSwgMHgyMjQ4ODIxLCAweDIyMjg4MjEsIDB4MTExYzAyLAotMHgzMjIyZmZmZiwgMHg2Mjg4MjEsIDB4MTExYzAyLCAweDMyMjJmZmZmLAotMHg2Mjg4MjEsIDB4MzJjMjAwMDEsIDB4MTA0MDAwYjIsIDB4MCwKLTB4OTZlMjA0NWEsIDB4MzA0MjAwMDEsIDB4MTA0MDAwYWUsIDB4MzJjMjAwODAsCi0weDEwNDAwMDA4LCAweDAsIDB4OTJlMjdiOTgsIDB4MTQ0MDAwMDUsCi0weDAsIDB4MjQwYzAwMDEsIDB4YTJlYzdiOTgsIDB4YWVmNTdiOWMsCi0weGFlZjI3YmE0LCAweDhlZTMwNGZjLCAweDE1MTEwMCwgMHg0MzEwMjEsCi0weDhjNDcwMDBjLCAweDM3ZTE4MjEsIDB4MjRlMjAwMGUsIDB4NDMxMDJiLAotMHgxNDQwMDAwOCwgMHhlMDIwMjEsIDB4MjQwNTAwMGUsIDB4YzAwMmY3NSwKLTB4YWZhYjAwMzgsIDB4MzA0MmZmZmYsIDB4OGZhYjAwMzgsIDB4ODAwMmQwOSwKLTB4MjAyODAyMSwgMHg5NGU2MDAwMCwgMHgyNGU3MDAwMiwgMHg5NGU1MDAwMCwKLTB4MjRlNzAwMDIsIDB4OTRlMzAwMDAsIDB4MjRlNzAwMDIsIDB4OTRlMjAwMDAsCi0weDI0ZTcwMDAyLCAweDk0ZTQwMDAwLCAweDI0ZTcwMDAyLCAweDIwNjgwMjEsCi0weDIwNTgwMjEsIDB4MjAzODAyMSwgMHgyMDI4MDIxLCAweDk0ZTIwMDAwLAotMHg5NGUzMDAwMiwgMHgyMDQ4MDIxLCAweDIwMjgwMjEsIDB4MjAzODAyMSwKLTB4MTAxYzAyLCAweDMyMDJmZmZmLCAweDYyODAyMSwgMHgxMDFjMDIsCi0weDMyMDJmZmZmLCAweDhlZTQ3YjljLCAweDYyODAyMSwgMHgxNDk1MDAwNCwKLTB4MzIwNWZmZmYsIDB4OTY2MjAwMTYsIDB4ODAwMmQxNywgMHg1MTIwMjEsCi0weDk2NjIwMDE2LCAweDU0MjAyMSwgMHg0MTQwMiwgMHgzMDgzZmZmZiwKLTB4NDMyMDIxLCAweDg1MjAyMywgMHg0MTQwMiwgMHg4MjIwMjEsCi0weDMwODRmZmZmLCAweDUwODAwMDAxLCAweDM0MDRmZmZmLCAweDhlZTI3YmE0LAotMHgyNDQzMDAxNywgMHgzN2UxMDIxLCAweDYyMTAyYiwgMHg1MDQwMDAwMSwKLTB4NmIxODIxLCAweDkwNjMwMDAwLCAweDI0MDIwMDExLCAweDE0NjIwMDMxLAotMHgyNDAyMDAwNiwgMHg4ZWUyN2JhNCwgMHgzN2UxODIxLCAweDI0NDIwMDI4LAotMHg0MzEwMmIsIDB4MTQ0MDAwMTgsIDB4MCwgMHg4ZWUyN2I5YywKLTB4MTJhMjAwMGEsIDB4MzJjMjAxMDAsIDB4OGVlMjdiYTQsIDB4M2MwMWZmZmYsCi0weDIyMDgyMSwgMHg5NDIyMDAyOCwgMHg4MjIwMjEsIDB4NDFjMDIsCi0weDMwODJmZmZmLCAweDYyMjAyMSwgMHgzMmMyMDEwMCwgMHgxNDQwMDAwNCwKLTB4NDEwMjcsIDB4OTJlMjdiOTgsIDB4MTQ0MDAwMDIsIDB4NDEwMjcsCi0weDMwNDRmZmZmLCAweDhlZTI3YmE0LCAweDNjMDFmZmZmLCAweDIyMDgyMSwKLTB4ODAwMmQ4YSwgMHhhNDI0MDAyOCwgMHg4ZWUyN2I5YywgMHgxMmEyMDAwOCwKLTB4MzJjMjAxMDAsIDB4OGVlMjdiYTQsIDB4OTQ0MjAwMjgsIDB4ODIyMDIxLAotMHg0MWMwMiwgMHgzMDgyZmZmZiwgMHg2MjIwMjEsIDB4MzJjMjAxMDAsCi0weDE0NDAwMDA0LCAweDQxMDI3LCAweDkyZTI3Yjk4LCAweDE0NDAwMDAyLAotMHg0MTAyNywgMHgzMDQ0ZmZmZiwgMHg4ZWUyN2JhNCwgMHg4MDAyZDhhLAotMHhhNDQ0MDAyOCwgMHgxNDYyMDAyZiwgMHgzN2UxODIxLCAweDhlZTI3YmE0LAotMHgyNDQyMDAzMiwgMHg0MzEwMmIsIDB4MTQ0MDAwMTgsIDB4MCwKLTB4OGVlMjdiOWMsIDB4MTJhMjAwMGEsIDB4MzJjMjAxMDAsIDB4OGVlMjdiYTQsCi0weDNjMDFmZmZmLCAweDIyMDgyMSwgMHg5NDIyMDAzMiwgMHg4MjIwMjEsCi0weDQxYzAyLCAweDMwODJmZmZmLCAweDYyMjAyMSwgMHgzMmMyMDEwMCwKLTB4MTQ0MDAwMDQsIDB4NDEwMjcsIDB4OTJlMjdiOTgsIDB4MTQ0MDAwMDIsCi0weDQxMDI3LCAweDMwNDRmZmZmLCAweDhlZTI3YmE0LCAweDNjMDFmZmZmLAotMHgyMjA4MjEsIDB4ODAwMmQ4YSwgMHhhNDI0MDAzMiwgMHg4ZWUyN2I5YywKLTB4MTJhMjAwMDgsIDB4MzJjMjAxMDAsIDB4OGVlMjdiYTQsIDB4OTQ0MjAwMzIsCi0weDgyMjAyMSwgMHg0MWMwMiwgMHgzMDgyZmZmZiwgMHg2MjIwMjEsCi0weDMyYzIwMTAwLCAweDE0NDAwMDA0LCAweDQxMDI3LCAweDkyZTI3Yjk4LAotMHgxNDQwMDAwMiwgMHg0MTAyNywgMHgzMDQ0ZmZmZiwgMHg4ZWUyN2JhNCwKLTB4YTQ0NDAwMzIsIDB4OGZhYzAwMjQsIDB4MTE4MDAwMmMsIDB4MzdlMTgyMSwKLTB4OGU0MjAwMDAsIDB4YWU0MmZmZmMsIDB4MjY0MjAwMGEsIDB4NDMxMDJiLAotMHgxNDQwMDAxYiwgMHgzNDAzODEwMCwgMHgyNjQzMDAwNCwgMHgzN2UxMDIxLAotMHg2MjEwMmIsIDB4MTQ0MDAwMDMsIDB4NjAyMDIxLCAweDZiMTgyMSwKLTB4NjAyMDIxLCAweDhjNjIwMDAwLCAweDI0NjMwMDA0LCAweGFlNDIwMDAwLAotMHgzN2UxMDIxLCAweDYyMTAyYiwgMHg1MDQwMDAwMSwgMHg2YjE4MjEsCi0weDhjNjIwMDAwLCAweGFjODIwMDAwLCAweDM0MDI4MTAwLCAweGE0NjIwMDAwLAotMHgyNDYzMDAwMiwgMHgzN2UxMDIxLCAweDYyMTAyYiwgMHg1MDQwMDAwMSwKLTB4NmIxODIxLCAweDk3YWMwMDJlLCAweDgwMDJkYjQsIDB4YTQ2YzAwMDAsCi0weDhlNDIwMDA0LCAweDhlNDQwMDA4LCAweGE2NDMwMDA4LCAweDk3YWMwMDJlLAotMHhhNjRjMDAwYSwgMHhhZTQyMDAwMCwgMHhhZTQ0MDAwNCwgMHg5NjYyMDAwZSwKLTB4MjY1MmZmZmMsIDB4MjQ0MjAwMDQsIDB4YTY2MjAwMGUsIDB4OTY2MjAwMGUsCi0weDhlZTM3MjVjLCAweDYyMTgyMSwgMHhhZWUzNzI1YywgMHhhZmIyMDAxOCwKLTB4OGVlMzcyNWMsIDB4YWZhMzAwMWMsIDB4OGVlMjcyNWMsIDB4MmM0MjAwM2MsCi0weDEwNDAwMDA0LCAweDI0NjIwMDAxLCAweDI0MDNmZmZlLCAweDQzMTAyNCwKLTB4YWZhMjAwMWMsIDB4MzJjMjAwODAsIDB4MTA0MDAwMGMsIDB4MzJjMjAxMDAsCi0weDhlZTI3YmE4LCAweDI0NDMwMDAxLCAweDIxMGMwLCAweDU3MTAyMSwKLTB4YWVlMzdiYTgsIDB4OGZhMzAwMTgsIDB4OGZhNDAwMWMsIDB4YWM0MzdiYWMsCi0weGFjNDQ3YmIwLCAweDgwMDJlYTAsIDB4YWVlMDcyNWMsIDB4MTA0MDAwNzIsCi0weDAsIDB4OGVlMjdiYTgsIDB4MjQ0MzAwMDEsIDB4MjEwYzAsCi0weDU3MTAyMSwgMHhhZWUzN2JhOCwgMHg4ZmEzMDAxOCwgMHg4ZmE0MDAxYywKLTB4YWM0MzdiYWMsIDB4YWM0NDdiYjAsIDB4OGVlMjdiYTgsIDB4MTA0MDAwNjMsCi0weDQ4MjEsIDB4NTAyMSwgMHg4ZjgyMDBmMCwgMHgyNDQ4MDAwOCwKLTB4Mjc2MjE4MDAsIDB4MTAyMTAyYiwgMHg1MDQwMDAwMSwgMHgyNzY4MTAwMCwKLTB4OGY4MjAwZjQsIDB4MTUwMjAwMDcsIDB4MCwgMHg4ZWUyMDFiNCwKLTB4ODAyMSwgMHgyNDQyMDAwMSwgMHhhZWUyMDFiNCwgMHg4MDAyZGZhLAotMHg4ZWUyMDFiNCwgMHg4ZjgzMDBmMCwgMHgyNDEwMDAwMSwgMHgxNTcxMDIxLAotMHg4YzQ0N2JhYywgMHg4YzQ1N2JiMCwgMHhhYzY0MDAwMCwgMHhhYzY1MDAwNCwKLTB4YWY4ODAwZjAsIDB4MTYwMDAwMDYsIDB4MmVhMTAyMSwgMHg4ZWUyMDA4OCwKLTB4MjQ0MjAwMDEsIDB4YWVlMjAwODgsIDB4ODAwMmUzZiwgMHg4ZWUyMDA4OCwKLTB4OGM0MjdiYjAsIDB4OGVlNDAwZTAsIDB4OGVlNTAwZTQsIDB4OGVlNjdiOWMsCi0weDQwMTgyMSwgMHgxMDIxLCAweGEzMjgyMSwgMHhhMzM4MmIsCi0weDgyMjAyMSwgMHg4NzIwMjEsIDB4OGVlMjA0ZmMsIDB4YzkzMDIxLAotMHg2MzEwMCwgMHhhZWU0MDBlMCwgMHhhZWU1MDBlNCwgMHhjMjMwMjEsCi0weDk0YzIwMDBhLCAweDI0MGMwMDAyLCAweDIxMTQyLCAweDMwNDMwMDAzLAotMHgxMDZjMDAxNiwgMHgyODYyMDAwMywgMHgxMDQwMDAwNSwgMHgyNDBjMDAwMSwKLTB4MTA2YzAwMDgsIDB4MCwgMHg4MDAyZTNmLCAweDAsCi0weDI0MGMwMDAzLCAweDEwNmMwMDE3LCAweDAsIDB4ODAwMmUzZiwKLTB4MCwgMHg4ZWUyMDBlOCwgMHg4ZWUzMDBlYywgMHgyNDYzMDAwMSwKLTB4MmM2NDAwMDEsIDB4NDQxMDIxLCAweGFlZTIwMGU4LCAweGFlZTMwMGVjLAotMHg4ZWUyMDBlOCwgMHg4MDAyZTNmLCAweDhlZTMwMGVjLCAweDhlZTIwMGYwLAotMHg4ZWUzMDBmNCwgMHgyNDYzMDAwMSwgMHgyYzY0MDAwMSwgMHg0NDEwMjEsCi0weGFlZTIwMGYwLCAweGFlZTMwMGY0LCAweDhlZTIwMGYwLCAweDgwMDJlM2YsCi0weDhlZTMwMGY0LCAweDhlZTIwMGY4LCAweDhlZTMwMGZjLCAweDI0NjMwMDAxLAotMHgyYzY0MDAwMSwgMHg0NDEwMjEsIDB4YWVlMjAwZjgsIDB4YWVlMzAwZmMsCi0weDhlZTIwMGY4LCAweDhlZTMwMGZjLCAweDhlZTI3YmE4LCAweDI1MjkwMDAxLAotMHgxMjIxMDJiLCAweDE0NDBmZmEwLCAweDI1NGEwMDA4LCAweGEyZTA3Yjk4LAotMHg4MDAyZTlmLCAweGFlZTA3YmE4LCAweDhmODIwMGYwLCAweDI0NDcwMDA4LAotMHgyNzYyMTgwMCwgMHhlMjEwMmIsIDB4NTA0MDAwMDEsIDB4Mjc2NzEwMDAsCi0weDhmODIwMGY0LCAweDE0ZTIwMDA3LCAweDAsIDB4OGVlMjAxYjQsCi0weDgwMjEsIDB4MjQ0MjAwMDEsIDB4YWVlMjAxYjQsIDB4ODAwMmU1ZCwKLTB4OGVlMjAxYjQsIDB4OGY4MjAwZjAsIDB4MjQxMDAwMDEsIDB4OGZhMzAwMTgsCi0weDhmYTQwMDFjLCAweGFjNDMwMDAwLCAweGFjNDQwMDA0LCAweGFmODcwMGYwLAotMHgxNjAwMDAwNywgMHgwLCAweDhlZTIwMDg4LCAweDI0NDIwMDAxLAotMHhhZWUyMDA4OCwgMHg4ZWUyMDA4OCwgMHg4MDAyZWEwLCAweGFlZTA3MjVjLAotMHg4ZWUyNzI1YywgMHg4ZWU0MDBlMCwgMHg4ZWU1MDBlNCwgMHgyNDBjMDAwMiwKLTB4NDAxODIxLCAweDEwMjEsIDB4YTMyODIxLCAweGEzMzAyYiwKLTB4ODIyMDIxLCAweDg2MjAyMSwgMHgxNjExNDIsIDB4MzA0MzAwMDMsCi0weGFlZTQwMGUwLCAweGFlZTUwMGU0LCAweDEwNmMwMDE3LCAweDJjNjIwMDAzLAotMHgxMDQwMDAwNSwgMHgyNDBjMDAwMSwgMHgxMDZjMDAwOCwgMHgwLAotMHg4MDAyZWEwLCAweGFlZTA3MjVjLCAweDI0MGMwMDAzLCAweDEwNmMwMDE5LAotMHgwLCAweDgwMDJlYTAsIDB4YWVlMDcyNWMsIDB4OGVlMjAwZTgsCi0weDhlZTMwMGVjLCAweDI0NjMwMDAxLCAweDJjNjQwMDAxLCAweDQ0MTAyMSwKLTB4YWVlMjAwZTgsIDB4YWVlMzAwZWMsIDB4OGVlMjAwZTgsIDB4OGVlMzAwZWMsCi0weDgwMDJlYTAsIDB4YWVlMDcyNWMsIDB4OGVlMjAwZjAsIDB4OGVlMzAwZjQsCi0weDI0NjMwMDAxLCAweDJjNjQwMDAxLCAweDQ0MTAyMSwgMHhhZWUyMDBmMCwKLTB4YWVlMzAwZjQsIDB4OGVlMjAwZjAsIDB4OGVlMzAwZjQsIDB4ODAwMmVhMCwKLTB4YWVlMDcyNWMsIDB4OGVlMjAwZjgsIDB4OGVlMzAwZmMsIDB4MjQ2MzAwMDEsCi0weDJjNjQwMDAxLCAweDQ0MTAyMSwgMHhhZWUyMDBmOCwgMHhhZWUzMDBmYywKLTB4OGVlMjAwZjgsIDB4OGVlMzAwZmMsIDB4YWVlMDcyNWMsIDB4OGU2MjAwMWMsCi0weDk2ZTMwNDU4LCAweDhlZTQwNGYwLCAweDI0NDIwMDAxLCAweDI0NjNmZmZmLAotMHg0MzEwMjQsIDB4MjQ4NDAwMDEsIDB4YWVlMjA0ZTQsIDB4YWVlNDA0ZjAsCi0weDhmNDIwMjNjLCAweDgyMjAyYiwgMHgxNDgwMDBiMCwgMHgwLAotMHg4ZjgzMDEyMCwgMHgyNzYyMzgwMCwgMHgyNDY2MDAyMCwgMHhjMjEwMmIsCi0weDUwNDAwMDAxLCAweDI3NjYzMDAwLCAweDhmODIwMTI4LCAweDEwYzIwMDA0LAotMHgwLCAweDhmODIwMTI0LCAweDE0YzIwMDA3LCAweDAsCi0weDhlZTIwMWE0LCAweDgwMjEsIDB4MjQ0MjAwMDEsIDB4YWVlMjAxYTQsCi0weDgwMDJmMDcsIDB4OGVlMjAxYTQsIDB4OGVlMjA0ZTQsIDB4YWM2MjAwMWMsCi0weDhlZTQwNGIwLCAweDhlZTUwNGI0LCAweDI0NjIwMDFjLCAweGFjNjIwMDA4LAotMHgyNDAyMDAwOCwgMHhhNDYyMDAwZSwgMHgyNDAyMDAxMSwgMHhhYzYyMDAxOCwKLTB4YWM2NDAwMDAsIDB4YWM2NTAwMDQsIDB4OGVlMjA0YzQsIDB4YWM2MjAwMTAsCi0weGFmODYwMTIwLCAweDkyZTI0ZTIwLCAweDE0NDAwMDM3LCAweDI0MTAwMDAxLAotMHg4ZWUyNGUzMCwgMHgyMTBjMCwgMHgyNDQyNTAzOCwgMHgyZTIyMDIxLAotMHg4YzgzMDAwMCwgMHgyNDAyMDAxMiwgMHgxNDYyMDAxZiwgMHgwLAotMHg4ZWUzNGUzMCwgMHg4ZWUyNGUzNCwgMHgxMDYyMDAxYiwgMHgyNDBjMDA0MCwKLTB4OGM4MjAwMDQsIDB4MjQ0MjAwMDEsIDB4YWM4MjAwMDQsIDB4OGVlMjRlMzQsCi0weDhlZTM0ZTMwLCAweDI0NDIwMDAxLCAweDEwNGMwMDA3LCAweDAsCi0weDhlZTI0ZTM0LCAweDI0NDIwMDAxLCAweDEwNjIwMDA1LCAweDAsCi0weDgwMDJlZjEsIDB4MCwgMHgxNDYwMDAwNSwgMHgwLAotMHg4ZjgyMDEyOCwgMHgyNDQyMDAyMCwgMHhhZjgyMDEyOCwgMHg4ZjgyMDEyOCwKLTB4OGM4MjAwMDQsIDB4MmM0MjAwMTEsIDB4NTA0MDAwMTMsIDB4YWM4MDAwMDAsCi0weDgwMDJmMDcsIDB4MCwgMHg4ZWUyNGUzMCwgMHgyNDBjMDA0MCwKLTB4MjQ0MjAwMDEsIDB4NTA0YzAwMDMsIDB4MTAyMSwgMHg4ZWUyNGUzMCwKLTB4MjQ0MjAwMDEsIDB4YWVlMjRlMzAsIDB4OGVlMjRlMzAsIDB4MjEwYzAsCi0weDI0NDI1MDM4LCAweDJlMjIwMjEsIDB4MjQwMjAwMTIsIDB4MjQwYzAwMDEsCi0weGFjODIwMDAwLCAweGFjOGMwMDA0LCAweDU2MDAwMDBkLCAweDI0MTAwMDAxLAotMHg4ZWUyMDRlNCwgMHgzYzA0MDAwMSwgMHgyNDg0NTc1NCwgMHhhZmEwMDAxNCwKLTB4YWZhMjAwMTAsIDB4OGVlNjA2MDgsIDB4OGY0NzAyMjgsIDB4M2MwNTAwMDksCi0weDM0YTVmMDA2LCAweGMwMDI0MDMsIDB4YWZhYjAwMzgsIDB4OGZhYjAwMzgsCi0weDE2MDAwMDAzLCAweDI0MGMwMDAxLCAweDgwMDJmNWMsIDB4YTJlYzA0ZjQsCi0weDhlZTIwMTcwLCAweDI0NDIwMDAxLCAweGFlZTIwMTcwLCAweDhlZTIwMTcwLAotMHg4ZWUyMDRlNCwgMHhhMmUwMDRmNCwgMHhhZWUwMDRmMCwgMHhhZWUwNzI3NCwKLTB4YWVlMjA0ZjgsIDB4OGY0MjAyM2MsIDB4MTA0MDAwMzgsIDB4MCwKLTB4OGVlMjAxODQsIDB4MjQ0MjAwMDEsIDB4YWVlMjAxODQsIDB4ODAwMmY1YywKLTB4OGVlMjAxODQsIDB4OGVlMjA1MDQsIDB4MjQwYzAwNDAsIDB4MjQ0MjAwMDEsCi0weDUwNGMwMDAzLCAweDEwMjEsIDB4OGVlMjA1MDQsIDB4MjQ0MjAwMDEsCi0weGFlZTIwNTA0LCAweDhlZTIwNTA0LCAweDhlNjMwMDE4LCAweDI0MGMwMDAzLAotMHgyMTA4MCwgMHg1NzEwMjEsIDB4MTQ2YzAwMGYsIDB4OGM0NDA1MDgsCi0weDNjMDIwMDAxLCAweDU3MTAyMSwgMHg5MDQyODNiMSwgMHgxMDQwMDAxNCwKLTB4MCwgMHg4ZWUyMDFkMCwgMHg4ZWUzNTI0MCwgMHg0NDEwMjEsCi0weGFlZTIwMWQwLCAweDhlZTIwMWQ4LCAweDY0MTgyMSwgMHgzMDYzMDBmZiwKLTB4ODAwMmY0ZiwgMHhhZWUzNTI0MCwgMHg4ZWUyMDFjYywgMHg4ZWUzMGUxMCwKLTB4NDQxMDIxLCAweGFlZTIwMWNjLCAweDhlZTIwMWQ4LCAweDY0MTgyMSwKLTB4MzA2MzAxZmYsIDB4YWVlMzBlMTAsIDB4NDQxMDIxLCAweGFlZTIwMWQ4LAotMHg4ZWUyMDAwMCwgMHgzNDQyMDA0MCwgMHg4MDAyZjVjLCAweGFlZTIwMDAwLAotMHg4ZWUyMDE0YywgMHgzYzAxMDAwMSwgMHgzNzA4MjEsIDB4YTAyMDgzZTAsCi0weDI0NDIwMDAxLCAweGFlZTIwMTRjLCAweDhlZTIwMTRjLCAweDhmODIwMTA4LAotMHgyNDQyMDAyMCwgMHhhZjgyMDEwOCwgMHg4ZjgyMDEwOCwgMHg4ZjgyMDEwOCwKLTB4Mjc2MzMwMDAsIDB4NDMxMDJiLCAweDE0NDAwMDAyLCAweDI3NjIyODAwLAotMHhhZjgyMDEwOCwgMHg4ZjgzMDEwOCwgMHg4ZjgyMDEwNCwgMHgxNDYyZmMxZSwKLTB4MCwgMHg4ZmJmMDA2MCwgMHg4ZmJlMDA1YywgMHg4ZmI2MDA1OCwKLTB4OGZiNTAwNTQsIDB4OGZiNDAwNTAsIDB4OGZiMzAwNGMsIDB4OGZiMjAwNDgsCi0weDhmYjEwMDQ0LCAweDhmYjAwMDQwLCAweDNlMDAwMDgsIDB4MjdiZDAwNjgsCi0weDUyODQzLCAweDEwYTAwMDBkLCAweDMwMjEsIDB4M2MwMzAwMDEsCi0weDM0NjMzODAwLCAweDNjMDdmZmZmLCAweDM2MzEwMjEsIDB4ODIxMDJiLAotMHg1MDQwMDAwMSwgMHg4NzIwMjEsIDB4OTQ4MjAwMDAsIDB4MjQ4NDAwMDIsCi0weDI0YTVmZmZmLCAweDE0YTBmZmY4LCAweGMyMzAyMSwgMHg2MWMwMiwKLTB4MzBjMmZmZmYsIDB4NjIzMDIxLCAweDYxYzAyLCAweDMwYzJmZmZmLAotMHg2MjMwMjEsIDB4M2UwMDAwOCwgMHgzMGMyZmZmZiwgMHgyN2JkZmY4OCwKLTB4MjQwZjAwMDEsIDB4YWZiZjAwNzAsIDB4YWZiZTAwNmMsIDB4YWZiNjAwNjgsCi0weGFmYjUwMDY0LCAweGFmYjQwMDYwLCAweGFmYjMwMDVjLCAweGFmYjIwMDU4LAotMHhhZmIxMDA1NCwgMHhhZmIwMDA1MCwgMHhhM2EwMDAyNywgMHhhZmFmMDAyYywKLTB4OGVlMjA0ZDQsIDB4ODAyMSwgMHgzMDQyMDAwMSwgMHgxNDQwMDAyYSwKLTB4YTNhMDAwMzcsIDB4OGY4NzAwZTAsIDB4OGY4ODAwYzQsIDB4OGY4MjAwZTgsCi0weGUyMjAyMywgMHgyYzgyMTAwMCwgMHg1MDQwMDAwMSwgMHgyNDg0MTAwMCwKLTB4NDIwYzIsIDB4ODAxODIxLCAweDhlZTQwMGM4LCAweDhlZTUwMGNjLAotMHgxMDIxLCAweGEzMjgyMSwgMHhhMzMwMmIsIDB4ODIyMDIxLAotMHg4NjIwMjEsIDB4YWVlNDAwYzgsIDB4YWVlNTAwY2MsIDB4OGY4MzAwYzgsCi0weDNjMDIwMDBhLCAweDM0NDJlZmZmLCAweDEwMzIwMjMsIDB4NDQxMDJiLAotMHgxMDQwMDAwMywgMHgzYzAyMDAwYSwgMHgzNDQyZjAwMCwgMHg4MjIwMjEsCi0weDgwMTgyMSwgMHg4ZWU0MDBjMCwgMHg4ZWU1MDBjNCwgMHgxMDIxLAotMHhhMzI4MjEsIDB4YTMzMDJiLCAweDgyMjAyMSwgMHg4NjIwMjEsCi0weGFlZTQwMGMwLCAweGFlZTUwMGM0LCAweGFmODgwMGM4LCAweGFmODcwMGU0LAotMHg4MDAzNGNjLCAweGFmODcwMGU4LCAweDNjMDIwMDAxLCAweDU3MTAyMSwKLTB4OTA0MjgzYzAsIDB4MTA0MDAwMGIsIDB4MCwgMHgzYzE0MDAwMSwKLTB4Mjk3YTAyMSwgMHg4ZTk0ODNjNCwgMHgzYzEzMDAwMSwgMHgyNzc5ODIxLAotMHg4ZTczODNjOCwgMHgzYzEyMDAwMSwgMHgyNTc5MDIxLCAweDgwMDMxOTMsCi0weDhlNTI4M2NjLCAweDhmODMwMGUwLCAweDhmODIwMGU0LCAweDEwNDMwMDA3LAotMHg4ODIxLCAweDhmODIwMGU0LCAweDI0MTEwMDAxLCAweDhjNDMwMDAwLAotMHg4YzQ0MDAwNCwgMHhhZmEzMDAxOCwgMHhhZmE0MDAxYywgMHgxNjIwMDAwZSwKLTB4M2MwMmZmZmYsIDB4OGY4MjAwYzQsIDB4YWZhMjAwMTAsIDB4OGY4MjAwYzgsCi0weDNjMDQwMDAxLCAweDI0ODQ1ODcwLCAweGFmYTIwMDE0LCAweDhmODYwMGUwLAotMHg4Zjg3MDBlNCwgMHgzYzA1MDAwNiwgMHhjMDAyNDAzLCAweDM0YTVmMDAwLAotMHg4MDAzNGNjLCAweDAsIDB4OGZhMzAwMWMsIDB4OGZiMjAwMTgsCi0weDMwNzRmZmZmLCAweDI2OTRmZmZjLCAweDYyMTAyNCwgMHgxMDQwMDA1OCwKLTB4MjQwOTgyMSwgMHgzYzAyMDA4MCwgMHg2MjEwMjQsIDB4MTA0MDAwMGEsCi0weDNjMDQwMDQwLCAweDhlZTIwMDdjLCAweDI0NDIwMDAxLCAweGFlZTIwMDdjLAotMHg4ZWUyMDA3YywgMHg4ZWUyMDFmYywgMHgyNDQyMDAwMSwgMHhhZWUyMDFmYywKLTB4ODAwMzRjNiwgMHg4ZWUyMDFmYywgMHgzYzA2MDAwNCwgMHgzYzBiMDAwMSwKLTB4M2MwYTAwMDIsIDB4M2MwNTAwMTAsIDB4M2MwOTAwMDgsIDB4OGVlMjAwODAsCi0weDNjMDgwMDIwLCAweDM0MDc4MDAwLCAweDI0NDIwMDAxLCAweGFlZTIwMDgwLAotMHg4ZWUyMDA4MCwgMHg4ZmEyMDAxYywgMHg0NDE4MjQsIDB4MTA2NjAwMjEsCi0weGMzMTAyYiwgMHgxNDQwMDAwNywgMHgwLCAweDEwNmIwMDExLAotMHgwLCAweDEwNmEwMDE1LCAweDAsIDB4ODAwMzA0OSwKLTB4NDIwNDIsIDB4MTA2NTAwMjMsIDB4YTMxMDJiLCAweDE0NDAwMDA1LAotMHgwLCAweDEwNjkwMDE5LCAweDAsIDB4ODAwMzA0OSwKLTB4NDIwNDIsIDB4MTA2ODAwMjEsIDB4MCwgMHg4MDAzMDQ5LAotMHg0MjA0MiwgMHg4ZWUyMDAzNCwgMHgyNDQyMDAwMSwgMHhhZWUyMDAzNCwKLTB4OGVlMjAwMzQsIDB4ODAwMzA0OSwgMHg0MjA0MiwgMHg4ZWUyMDFlYywKLTB4MjQ0MjAwMDEsIDB4YWVlMjAxZWMsIDB4OGVlMjAxZWMsIDB4ODAwMzA0OSwKLTB4NDIwNDIsIDB4OGVlMjAxZjAsIDB4MjQ0MjAwMDEsIDB4YWVlMjAxZjAsCi0weDhlZTIwMWYwLCAweDgwMDMwNDksIDB4NDIwNDIsIDB4OGVlMjAxZjQsCi0weDI0NDIwMDAxLCAweGFlZTIwMWY0LCAweDhlZTIwMWY0LCAweDgwMDMwNDksCi0weDQyMDQyLCAweDhlZTIwMDMwLCAweDI0NDIwMDAxLCAweGFlZTIwMDMwLAotMHg4ZWUyMDAzMCwgMHg4MDAzMDQ5LCAweDQyMDQyLCAweDhlZTIwMWY4LAotMHgyNDQyMDAwMSwgMHhhZWUyMDFmOCwgMHg4ZWUyMDFmOCwgMHg0MjA0MiwKLTB4MTA4NzA0N2MsIDB4MCwgMHg4MDAzMDBlLCAweDAsCi0weDNjMDIwMDAxLCAweDU3MTAyMSwgMHg5MDQyODNiMiwgMHgxNDQwMDA4NCwKLTB4MjQwMjAwMDEsIDB4M2MwMzAwMDEsIDB4NzcxODIxLCAweDkwNjM4M2IzLAotMHgxNDYyMDA3ZiwgMHgzYzAyMDEwMCwgMHg4ZTQzMDAwMCwgMHg2MjEwMjQsCi0weDEwNDAwMDZmLCAweDI0MDJmZmZmLCAweDE0NjIwMDA1LCAweDI0MTAwMDAxLAotMHg5NjQzMDAwNCwgMHgzNDAyZmZmZiwgMHgxMDYyMDA3NSwgMHgwLAotMHg5MmUyMDRkOCwgMHgxNDQwMDA3MiwgMHgwLCAweDNjMDIwMDAxLAotMHg1NzEwMjEsIDB4OGM0MjgzYjQsIDB4Mjg0MjAwMDUsIDB4MTA0MDAwMjAsCi0weDM4MjEsIDB4M2MwMjAwMDEsIDB4NTcxMDIxLCAweDhjNDI4M2I0LAotMHgxODQwMDAxNiwgMHgyODIxLCAweDk2NjYwMDAwLCAweDUyMGMwLAotMHg5NzEwMjEsIDB4OTQ0Mjc3N2UsIDB4MTQ0NjAwMDksIDB4OTcxMDIxLAotMHg5NDQzNzc4MCwgMHg5NjYyMDAwMiwgMHgxNDYyMDAwNSwgMHg5NzEwMjEsCi0weDk0NDM3NzgyLCAweDk2NjIwMDA0LCAweDUwNjIwMDA4LCAweDI0MDcwMDAxLAotMHgzYzAyMDAwMSwgMHg1NzEwMjEsIDB4OGM0MjgzYjQsIDB4MjRhNTAwMDEsCi0weGEyMTAyYSwgMHg1NDQwZmZlZSwgMHg1MjBjMCwgMHgzMGUyMDBmZiwKLTB4MTA0MDA0NDAsIDB4MCwgMHg4MDAzMGQ1LCAweDAsCi0weDI0MDIwMjEsIDB4YzAwMjJmZSwgMHgyNDA1MDAwNiwgMHgzMDQ0MDAxZiwKLTB4NDI4YzAsIDB4MmU1MTAyMSwgMHg5NDQyNzI3YywgMHgzMDQyNDAwMCwKLTB4MTQ0MDA0MzQsIDB4YjcxMDIxLCAweDk0NDM3MjdlLCAweDk2NjIwMDAwLAotMHgxNDYyMDAwYiwgMHg0MThjMCwgMHhiNzEwMjEsIDB4OTQ0MzcyODAsCi0weDk2NjIwMDAyLCAweDE0NjIwMDA2LCAweDQxOGMwLCAweGI3MTAyMSwKLTB4OTQ0MzcyODIsIDB4OTY2MjAwMDQsIDB4MTA2MjAwMzUsIDB4NDE4YzAsCi0weDJlMzEwMjEsIDB4OTQ0MjcyN2MsIDB4MzA0MjgwMDAsIDB4MTQ0MDA0MjEsCi0weDJlMzEwMjEsIDB4OTQ0YjcyN2MsIDB4OTY2NzAwMDAsIDB4YjI4YzAsCi0weGI3MTAyMSwgMHg5NDQyNzM3ZSwgMHg4MDAzMGI3LCAweDMwMjEsCi0weDQyMGMwLCAweDJlNDEwMjEsIDB4OTQ0MzczN2MsIDB4MmU0MTAyMSwKLTB4OTQ0YjczN2MsIDB4MzA2MzgwMDAsIDB4MTQ2MDAwMTAsIDB4YjI4YzAsCi0weGI3MTAyMSwgMHg5NDQyNzM3ZSwgMHgxNDQ3ZmZmNSwgMHgxNjAyMDIxLAotMHhiNzEwMjEsIDB4OTQ0MzczODAsIDB4OTY2MjAwMDIsIDB4NTQ2MmZmZjEsCi0weDQyMGMwLCAweGI3MTAyMSwgMHg5NDQzNzM4MiwgMHg5NjYyMDAwNCwKLTB4NTQ2MmZmZWMsIDB4NDIwYzAsIDB4MjQwNjAwMDEsIDB4MzBjMjAwZmYsCi0weDEwNDAwNDAwLCAweDAsIDB4ODAwMzBkNSwgMHgwLAotMHg5NzQzMDIwMiwgMHg5NjQyMDAwMCwgMHgxNDYyMDNmYSwgMHgwLAotMHg5NzQzMDIwNCwgMHg5NjQyMDAwMiwgMHgxNDYyMDNmNiwgMHgwLAotMHg5NzQzMDIwNiwgMHg5NjQyMDAwNCwgMHgxNDYyMDNmMiwgMHgwLAotMHg5MjQyMDAwMCwgMHgzYTAzMDAwMSwgMHgzMDQyMDAwMSwgMHg0MzEwMjQsCi0weDEwNDAwMDc0LCAweDI0MDJmZmZmLCAweDhlNjMwMDAwLCAweDE0NjIwMDA0LAotMHgzNDAyZmZmZiwgMHg5NjYzMDAwNCwgMHgxMDYyMDA2ZiwgMHgyNDBmMDAwMiwKLTB4M2MwMjAwMDEsIDB4NTcxMDIxLCAweDkwNDI4M2IyLCAweDE0NDAwMDZhLAotMHgyNDBmMDAwMywgMHg5MmUyMDRkOCwgMHg1NDQwMDA2OCwgMHhhZmFmMDAyYywKLTB4M2MwMjAwMDEsIDB4NTcxMDIxLCAweDhjNDI4M2I0LCAweDI4NDIwMDA1LAotMHgxMDQwMDAyMCwgMHgzODIxLCAweDNjMDIwMDAxLCAweDU3MTAyMSwKLTB4OGM0MjgzYjQsIDB4MTg0MDAwMTYsIDB4MjgyMSwgMHg5NjY2MDAwMCwKLTB4NTIwYzAsIDB4OTcxMDIxLCAweDk0NDI3NzdlLCAweDE0NDYwMDA5LAotMHg5NzEwMjEsIDB4OTQ0Mzc3ODAsIDB4OTY2MjAwMDIsIDB4MTQ2MjAwMDUsCi0weDk3MTAyMSwgMHg5NDQzNzc4MiwgMHg5NjYyMDAwNCwgMHg1MDYyMDAwOCwKLTB4MjQwNzAwMDEsIDB4M2MwMjAwMDEsIDB4NTcxMDIxLCAweDhjNDI4M2I0LAotMHgyNGE1MDAwMSwgMHhhMjEwMmEsIDB4NTQ0MGZmZWUsIDB4NTIwYzAsCi0weDMwZTIwMGZmLCAweDE0NDAwMDQ0LCAweDI0MGYwMDAzLCAweDgwMDM0YzYsCi0weDAsIDB4MjQwMjAyMSwgMHhjMDAyMmZlLCAweDI0MDUwMDA2LAotMHgzMDQ0MDAxZiwgMHg0MjhjMCwgMHgyZTUxMDIxLCAweDk0NDI3MjdjLAotMHgzMDQyNDAwMCwgMHgxNDQwMDNhZiwgMHhiNzEwMjEsIDB4OTQ0MzcyN2UsCi0weDk2NjIwMDAwLCAweDE0NjIwMDBiLCAweDQxOGMwLCAweGI3MTAyMSwKLTB4OTQ0MzcyODAsIDB4OTY2MjAwMDIsIDB4MTQ2MjAwMDYsIDB4NDE4YzAsCi0weGI3MTAyMSwgMHg5NDQzNzI4MiwgMHg5NjYyMDAwNCwgMHgxMDYyMDAyNywKLTB4NDE4YzAsIDB4MmUzMTAyMSwgMHg5NDQyNzI3YywgMHgzMDQyODAwMCwKLTB4MTQ0MDAzOWMsIDB4MmUzMTAyMSwgMHg5NDRiNzI3YywgMHg5NjY3MDAwMCwKLTB4YjI4YzAsIDB4YjcxMDIxLCAweDk0NDI3MzdlLCAweDgwMDMxM2MsCi0weDMwMjEsIDB4NDIwYzAsIDB4MmU0MTAyMSwgMHg5NDQzNzM3YywKLTB4MmU0MTAyMSwgMHg5NDRiNzM3YywgMHgzMDYzODAwMCwgMHgxNDYwMDAxMCwKLTB4YjI4YzAsIDB4YjcxMDIxLCAweDk0NDI3MzdlLCAweDE0NDdmZmY1LAotMHgxNjAyMDIxLCAweGI3MTAyMSwgMHg5NDQzNzM4MCwgMHg5NjYyMDAwMiwKLTB4NTQ2MmZmZjEsIDB4NDIwYzAsIDB4YjcxMDIxLCAweDk0NDM3MzgyLAotMHg5NjYyMDAwNCwgMHg1NDYyZmZlYywgMHg0MjBjMCwgMHgyNDA2MDAwMSwKLTB4MzBjMjAwZmYsIDB4MTA0MDAzN2IsIDB4MCwgMHg4MDAzMTRmLAotMHgyNDBmMDAwMywgMHgyNDBmMDAwMSwgMHhhZmFmMDAyYywgMHg4ZjQyMDI2MCwKLTB4NTQxMDJiLCAweDEwNDAwMDNhLCAweDAsIDB4OGY4MzAwZTQsCi0weDhmODIwMGUwLCAweDEwNjIwMDAzLCAweDI0NjMwMDA4LCAweGFmODMwMGU0LAotMHhhZjgzMDBlOCwgMHg4ZWU0MDBjMCwgMHg4ZWU1MDBjNCwgMHgyODAxODIxLAotMHgxMDIxLCAweGEzMjgyMSwgMHhhMzMwMmIsIDB4ODIyMDIxLAotMHg4NjIwMjEsIDB4YWVlNDAwYzAsIDB4YWVlNTAwYzQsIDB4OGVlMjAwNTgsCi0weDI0NDIwMDAxLCAweGFlZTIwMDU4LCAweDhlZTIwMDU4LCAweDhlZTIwMDdjLAotMHgyNDQyMDAwMSwgMHhhZWUyMDA3YywgMHg4ZWUyMDA3YywgMHg4ZjgyMDBlMCwKLTB4YWZhMjAwMTAsIDB4OGY4MjAwZTQsIDB4M2MwNDAwMDEsIDB4MjQ4NDU4NzgsCi0weGFmYTIwMDE0LCAweDhmYTYwMDE4LCAweDhmYTcwMDFjLCAweDNjMDUwMDA2LAotMHhjMDAyNDAzLCAweDM0YTVmMDAzLCAweDgwMDM0Y2MsIDB4MCwKLTB4OGVlMjUyNDAsIDB4YWZhMjAwMTAsIDB4OGVlMjUyNDQsIDB4M2MwNDAwMDEsCi0weDI0ODQ1ODg0LCAweGFmYTIwMDE0LCAweDhlZTYwZTEwLCAweDhlZTcwZTE4LAotMHgzYzA1MDAwNiwgMHhjMDAyNDAzLCAweDM0YTVmMDAyLCAweDhlZTIwMWMwLAotMHgyNDQyMDAwMSwgMHhhZWUyMDFjMCwgMHg4ZWUyMDAwMCwgMHg4ZWUzMDFjMCwKLTB4MjQwM2ZmYmYsIDB4NDMxMDI0LCAweDgwMDM0NzAsIDB4YWVlMjAwMDAsCi0weDk2ZTIwNDY4LCAweDU0MTAyYiwgMHgxMDQwMDAwMywgMHgwLAotMHgyNDBmMDAwMSwgMHhhM2FmMDAyNywgMHgxMjgwMDMwMSwgMHgyNDE2MDAwNywKLTB4MjQxNTAwNDAsIDB4MjQxZTAwMDEsIDB4MjQwZTAwMTIsIDB4OGVlMjcyNGMsCi0weDhmNDMwMjgwLCAweDI0NDIwMDAxLCAweDMwNDIwN2ZmLCAweDEwNjIwMmQzLAotMHgwLCAweDkzYTIwMDI3LCAweDEwNDAwMDE0LCAweDAsCi0weDhlZTM1MjQwLCAweDhlZTI1MjQ0LCAweDEwNjIwMDA5LCAweDI2ZWQ1MjQ0LAotMHg4ZWU2NTI0NCwgMHg4ZWUzNTI0NCwgMHgyMTE0MCwgMHgyNDQyNTI0OCwKLTB4MmUyODAyMSwgMHgyNDYzMDAwMSwgMHg4MDAzMWJmLCAweDMwNmIwMGZmLAotMHg5MmUyNzI0OCwgMHgxNDQwZmZjYSwgMHgwLCAweDhlZTIwMWUwLAotMHgyNDQyMDAwMSwgMHhhZWUyMDFlMCwgMHg4ZWUyMDFlMCwgMHg4ZWUzMGUxMCwKLTB4OGVlMjBlMTgsIDB4MTA2MmZmYzIsIDB4MjZlZDBlMTgsIDB4OGVlNjBlMTgsCi0weDhlZTMwZTE4LCAweDIxMTQwLCAweDI0NDIwZTIwLCAweDJlMjgwMjEsCi0weDI0NjMwMDAxLCAweDMwNmIwMWZmLCAweDk2ZTIwNDZhLCAweDMwNDIwMDEwLAotMHgxMDQwMDAxOSwgMHgwLCAweDk2NDIwMDBjLCAweDM0MGY4MTAwLAotMHgxNDRmMDAxNSwgMHgwLCAweDNjMDIwMDAxLCAweDU3MTAyMSwKLTB4OTA0MjgzYzAsIDB4MTQ0MDAwMTAsIDB4MCwgMHg5NjQyMDAwZSwKLTB4YTYwMjAwMTYsIDB4OGU0MjAwMDgsIDB4OGU0MzAwMDQsIDB4OGU0NDAwMDAsCi0weDI2OTRmZmZjLCAweGFlNDIwMDBjLCAweGFlNDMwMDA4LCAweGFlNDQwMDA0LAotMHg5NjAyMDAwZSwgMHgyNjczMDAwNCwgMHgyNDBmMDAwMSwgMHhhM2FmMDAzNywKLTB4MzQ0MjAyMDAsIDB4YTYwMjAwMGUsIDB4OGUwMjAwMDAsIDB4OGUwMzAwMDQsCi0weDNjMDQwMDAxLCAweDM0ODQzODAwLCAweDMwNmEwMDA3LCAweDI2YTk4MjMsCi0weDM2NDEwMjEsIDB4MjYyMTAyYiwgMHgxMDQwMDAwNSwgMHgyOGFhMDIxLAotMHgyNjQxMDIzLCAweDM2MjE4MjMsIDB4M2MwMjAwMjAsIDB4NDM5ODIzLAotMHgyNjgyMDAwNywgMHgyNDA0ZmZmOCwgMHg5NjAzMDAwYSwgMHg0NDYwMjQsCi0weDZhMTgyMSwgMHg2YzEwMmIsIDB4MTA0MDAwMDIsIDB4MTgwMzgyMSwKLTB4NjAzODIxLCAweGFlMTMwMDE4LCAweDhmODgwMTIwLCAweDI0ZTIwMDA3LAotMHg0NDM4MjQsIDB4Mjc2MjM4MDAsIDB4MjUwOTAwMjAsIDB4MTIyMTAyYiwKLTB4NTA0MDAwMDEsIDB4Mjc2OTMwMDAsIDB4OGY4MjAxMjgsIDB4MTEyMjAwMDQsCi0weDAsIDB4OGY4MjAxMjQsIDB4MTUyMjAwMDcsIDB4MTQwMTgyMSwKLTB4OGVlMjAxYTQsIDB4ODgyMSwgMHgyNDQyMDAwMSwgMHhhZWUyMDFhNCwKLTB4ODAwMzI0YywgMHg4ZWUyMDFhNCwgMHg4ZTA0MDAwMCwgMHg4ZTA1MDAwNCwKLTB4MTAyMSwgMHhhZDEzMDAwOCwgMHhhNTA3MDAwZSwgMHhhZDE2MDAxOCwKLTB4YWQwNjAwMWMsIDB4YTMzMDJiLCAweGEzMjgyMywgMHg4MjIwMjMsCi0weDg2MjAyMywgMHhhZDA0MDAwMCwgMHhhZDA1MDAwNCwgMHg4ZWUyMDRjMCwKLTB4YWQwMjAwMTAsIDB4YWY4OTAxMjAsIDB4OTJlMjRlMjAsIDB4MTQ0MDAwMzMsCi0weDI0MTEwMDAxLCAweDhlZTI0ZTMwLCAweDIxMGMwLCAweDI0NDI1MDM4LAotMHgyZTIyMDIxLCAweDhjODIwMDAwLCAweDE0NTYwMDFmLCAweDAsCi0weDhlZTM0ZTMwLCAweDhlZTI0ZTM0LCAweDEwNjIwMDFiLCAweDAsCi0weDhjODIwMDA0LCAweDI0NDIwMDAxLCAweGFjODIwMDA0LCAweDhlZTI0ZTM0LAotMHg4ZWUzNGUzMCwgMHgyNDQyMDAwMSwgMHgxMDU1MDAwNywgMHgwLAotMHg4ZWUyNGUzNCwgMHgyNDQyMDAwMSwgMHgxMDYyMDAwNSwgMHgwLAotMHg4MDAzMjM5LCAweDAsIDB4MTQ2MDAwMDUsIDB4MCwKLTB4OGY4MjAxMjgsIDB4MjQ0MjAwMjAsIDB4YWY4MjAxMjgsIDB4OGY4MjAxMjgsCi0weDhjODIwMDA0LCAweDJjNDIwMDExLCAweDUwNDAwMDEwLCAweGFjODAwMDAwLAotMHg4MDAzMjRjLCAweDAsIDB4OGVlMjRlMzAsIDB4MjQ0MjAwMDEsCi0weDUwNTUwMDAzLCAweDEwMjEsIDB4OGVlMjRlMzAsIDB4MjQ0MjAwMDEsCi0weGFlZTI0ZTMwLCAweDhlZTI0ZTMwLCAweDIxMGMwLCAweDI0NDI1MDM4LAotMHgyZTIyMDIxLCAweGFjOTYwMDAwLCAweGFjOWUwMDA0LCAweDE2MjAwMDE4LAotMHgzYzA1MDAwNiwgMHg4ZTAyMDAxOCwgMHgzYzA0MDAwMSwgMHgyNDg0NTg5MCwKLTB4YWZhMjAwMTAsIDB4OGUwMjAwMDAsIDB4OGUwMzAwMDQsIDB4MzRhNWYwMDksCi0weDIwMDMwMjEsIDB4YzAwMjQwMywgMHhhZmEzMDAxNCwgMHg5M2EyMDAzNywKLTB4MTA0MDAyMTYsIDB4MzQwZjgxMDAsIDB4OGU0MjAwMDQsIDB4OGU0MzAwMDgsCi0weDhlNDQwMDBjLCAweGE2NGYwMDBjLCAweGFlNDIwMDAwLCAweGFlNDMwMDA0LAotMHhhZTQ0MDAwOCwgMHg5NjAyMDAxNiwgMHg4MDAzNDcwLCAweGE2NDIwMDBlLAotMHgxNGVjMDE2OCwgMHgyOGExODIzLCAweDk2MGMwMDBhLCAweDk2MDMwMDBlLAotMHgyOGExMDIzLCAweGE2MDIwMDBhLCAweDM0NjIwMDA0LCAweGE2MDIwMDBlLAotMHg4Zjg4MDEyMCwgMHgyNzYyMzgwMCwgMHgyNTA5MDAyMCwgMHgxMjIxMDJiLAotMHgxNDQwMDAwMiwgMHgzMDZhZmZmZiwgMHgyNzY5MzAwMCwgMHg4ZjgyMDEyOCwKLTB4MTEyMjAwMDQsIDB4MCwgMHg4ZjgyMDEyNCwgMHgxNTIyMDAwNywKLTB4MjQwNDAwMjAsIDB4OGVlMjAxYTQsIDB4ODgyMSwgMHgyNDQyMDAwMSwKLTB4YWVlMjAxYTQsIDB4ODAwMzJjYSwgMHg4ZWUyMDFhNCwgMHg4ZWU1NzI0YywKLTB4OGVlNjA0OTAsIDB4OGVlNzA0OTQsIDB4YTUwNDAwMGUsIDB4MjQwNDAwMDQsCi0weGFkMTAwMDA4LCAweGFkMDQwMDE4LCAweDUyOTQwLCAweGEwMTgyMSwKLTB4MTAyMSwgMHhlMzM4MjEsIDB4ZTMyMDJiLCAweGMyMzAyMSwKLTB4YzQzMDIxLCAweGFkMDYwMDAwLCAweGFkMDcwMDA0LCAweDhlZTI3MjRjLAotMHhhZDAyMDAxYywgMHg4ZWUyMDRjNCwgMHhhZDAyMDAxMCwgMHhhZjg5MDEyMCwKLTB4OTJlMjRlMjAsIDB4MTQ0MDAwMzMsIDB4MjQxMTAwMDEsIDB4OGVlMjRlMzAsCi0weDIxMGMwLCAweDI0NDI1MDM4LCAweDJlMjIwMjEsIDB4OGM4MjAwMDAsCi0weDE0NTYwMDFmLCAweDAsIDB4OGVlMzRlMzAsIDB4OGVlMjRlMzQsCi0weDEwNjIwMDFiLCAweDAsIDB4OGM4MjAwMDQsIDB4MjQ0MjAwMDEsCi0weGFjODIwMDA0LCAweDhlZTI0ZTM0LCAweDhlZTM0ZTMwLCAweDI0NDIwMDAxLAotMHgxMDU1MDAwNywgMHgwLCAweDhlZTI0ZTM0LCAweDI0NDIwMDAxLAotMHgxMDYyMDAwNSwgMHgwLCAweDgwMDMyYjcsIDB4MCwKLTB4MTQ2MDAwMDUsIDB4MCwgMHg4ZjgyMDEyOCwgMHgyNDQyMDAyMCwKLTB4YWY4MjAxMjgsIDB4OGY4MjAxMjgsIDB4OGM4MjAwMDQsIDB4MmM0MjAwMTEsCi0weDUwNDAwMDEwLCAweGFjODAwMDAwLCAweDgwMDMyY2EsIDB4MCwKLTB4OGVlMjRlMzAsIDB4MjQ0MjAwMDEsIDB4NTA1NTAwMDMsIDB4MTAyMSwKLTB4OGVlMjRlMzAsIDB4MjQ0MjAwMDEsIDB4YWVlMjRlMzAsIDB4OGVlMjRlMzAsCi0weDIxMGMwLCAweDI0NDI1MDM4LCAweDJlMjIwMjEsIDB4YWM5NjAwMDAsCi0weGFjOWUwMDA0LCAweDE2MjAwMDBkLCAweDAsIDB4YTYwYzAwMGEsCi0weGE2MGEwMDBlLCAweDhmODIwMTAwLCAweGFmYTIwMDEwLCAweDhmODIwMTA0LAotMHgzYzA0MDAwMSwgMHgyNDg0NTg5YywgMHgzYzA1MDAwNiwgMHhhZmEyMDAxNCwKLTB4OGVlNjcyNGMsIDB4ODAwMzQzYiwgMHgzNGE1ZjAwYiwgMHgzYzAxMDAwMSwKLTB4MzcwODIxLCAweGEwMjA4M2MwLCAweGFkYWIwMDAwLCAweDhlZTIwMWQ4LAotMHg4ZWUzNzI0YywgMHgyNDQyZmZmZiwgMHhhZWUyMDFkOCwgMHg4ZWUyMDFkOCwKLTB4MjQ2MzAwMDEsIDB4MzA2MzA3ZmYsIDB4MjZlMjUyNDQsIDB4MTVhMjAwMDYsCi0weGFlZTM3MjRjLCAweDhlZTIwMWQwLCAweDI0NDJmZmZmLCAweGFlZTIwMWQwLAotMHg4MDAzMmVmLCAweDhlZTIwMWQwLCAweDhlZTIwMWNjLCAweDI0NDJmZmZmLAotMHhhZWUyMDFjYywgMHg4ZWUyMDFjYywgMHg4ZjQyMDI0MCwgMHgxMDQwMDA3MywKLTB4MCwgMHg4ZWUyMGUxYywgMHgyNDQyMDAwMSwgMHhhZWUyMGUxYywKLTB4OGY0MzAyNDAsIDB4NDMxMDJiLCAweDE0NDAwMTc2LCAweGEwMjEsCi0weDhmODMwMTIwLCAweDI3NjIzODAwLCAweDI0NjYwMDIwLCAweGMyMTAyYiwKLTB4NTA0MDAwMDEsIDB4Mjc2NjMwMDAsIDB4OGY4MjAxMjgsIDB4MTBjMjAwMDQsCi0weDAsIDB4OGY4MjAxMjQsIDB4MTRjMjAwMDcsIDB4MCwKLTB4OGVlMjAxYTQsIDB4ODgyMSwgMHgyNDQyMDAwMSwgMHhhZWUyMDFhNCwKLTB4ODAwMzM0ZiwgMHg4ZWUyMDFhNCwgMHg4ZWUyNzI0YywgMHhhYzYyMDAxYywKLTB4OGVlNDA0YTgsIDB4OGVlNTA0YWMsIDB4MjQ2MjAwMWMsIDB4YWM2MjAwMDgsCi0weDI0MDIwMDA4LCAweGE0NjIwMDBlLCAweDI0MDIwMDExLCAweGFjNjIwMDE4LAotMHhhYzY0MDAwMCwgMHhhYzY1MDAwNCwgMHg4ZWUyMDRjNCwgMHhhYzYyMDAxMCwKLTB4YWY4NjAxMjAsIDB4OTJlMjRlMjAsIDB4MTQ0MDAwMzMsIDB4MjQxMTAwMDEsCi0weDhlZTI0ZTMwLCAweDIxMGMwLCAweDI0NDI1MDM4LCAweDJlMjIwMjEsCi0weDhjODIwMDAwLCAweDE0NGUwMDFmLCAweDAsIDB4OGVlMzRlMzAsCi0weDhlZTI0ZTM0LCAweDEwNjIwMDFiLCAweDAsIDB4OGM4MjAwMDQsCi0weDI0NDIwMDAxLCAweGFjODIwMDA0LCAweDhlZTI0ZTM0LCAweDhlZTM0ZTMwLAotMHgyNDQyMDAwMSwgMHgxMDU1MDAwNywgMHgwLCAweDhlZTI0ZTM0LAotMHgyNDQyMDAwMSwgMHgxMDYyMDAwNSwgMHgwLCAweDgwMDMzM2MsCi0weDAsIDB4MTQ2MDAwMDUsIDB4MCwgMHg4ZjgyMDEyOCwKLTB4MjQ0MjAwMjAsIDB4YWY4MjAxMjgsIDB4OGY4MjAxMjgsIDB4OGM4MjAwMDQsCi0weDJjNDIwMDExLCAweDUwNDAwMDEwLCAweGFjODAwMDAwLCAweDgwMDMzNGYsCi0weDAsIDB4OGVlMjRlMzAsIDB4MjQ0MjAwMDEsIDB4NTA1NTAwMDMsCi0weDEwMjEsIDB4OGVlMjRlMzAsIDB4MjQ0MjAwMDEsIDB4YWVlMjRlMzAsCi0weDhlZTI0ZTMwLCAweDIxMGMwLCAweDI0NDI1MDM4LCAweDJlMjIwMjEsCi0weGFjOGUwMDAwLCAweGFjOWUwMDA0LCAweDU2MjAwMDBkLCAweDI0MTEwMDAxLAotMHg4ZWUyNzI0YywgMHgzYzA0MDAwMSwgMHgyNDg0NThhOCwgMHhhZmEwMDAxNCwKLTB4YWZhMjAwMTAsIDB4OGVlNjcyNGMsIDB4OGY0NzAyODAsIDB4M2MwNTAwMDksCi0weDM0YTVmMDA4LCAweGMwMDI0MDMsIDB4YWZhZTAwNDgsIDB4OGZhZTAwNDgsCi0weDU2MjAwMDAxLCAweGFlZTAwZTFjLCAweDhlZTIwMTg4LCAweDI0NDIwMDAxLAotMHhhZWUyMDE4OCwgMHg4MDAzM2M4LCAweDhlZTIwMTg4LCAweDhmODMwMTIwLAotMHgyNzYyMzgwMCwgMHgyNDY2MDAyMCwgMHhjMjEwMmIsIDB4NTA0MDAwMDEsCi0weDI3NjYzMDAwLCAweDhmODIwMTI4LCAweDEwYzIwMDA0LCAweDAsCi0weDhmODIwMTI0LCAweDE0YzIwMDA3LCAweDAsIDB4OGVlMjAxYTQsCi0weDg4MjEsIDB4MjQ0MjAwMDEsIDB4YWVlMjAxYTQsIDB4ODAwMzNiYSwKLTB4OGVlMjAxYTQsIDB4OGVlMjcyNGMsIDB4YWM2MjAwMWMsIDB4OGVlNDA0YTgsCi0weDhlZTUwNGFjLCAweDI0NjIwMDFjLCAweGFjNjIwMDA4LCAweDI0MDIwMDA4LAotMHhhNDYyMDAwZSwgMHgyNDAyMDAxMSwgMHhhYzYyMDAxOCwgMHhhYzY0MDAwMCwKLTB4YWM2NTAwMDQsIDB4OGVlMjA0YzQsIDB4YWM2MjAwMTAsIDB4YWY4NjAxMjAsCi0weDkyZTI0ZTIwLCAweDE0NDAwMDMzLCAweDI0MTEwMDAxLCAweDhlZTI0ZTMwLAotMHgyMTBjMCwgMHgyNDQyNTAzOCwgMHgyZTIyMDIxLCAweDhjODIwMDAwLAotMHgxNDRlMDAxZiwgMHgwLCAweDhlZTM0ZTMwLCAweDhlZTI0ZTM0LAotMHgxMDYyMDAxYiwgMHgwLCAweDhjODIwMDA0LCAweDI0NDIwMDAxLAotMHhhYzgyMDAwNCwgMHg4ZWUyNGUzNCwgMHg4ZWUzNGUzMCwgMHgyNDQyMDAwMSwKLTB4MTA1NTAwMDcsIDB4MCwgMHg4ZWUyNGUzNCwgMHgyNDQyMDAwMSwKLTB4MTA2MjAwMDUsIDB4MCwgMHg4MDAzM2E3LCAweDAsCi0weDE0NjAwMDA1LCAweDAsIDB4OGY4MjAxMjgsIDB4MjQ0MjAwMjAsCi0weGFmODIwMTI4LCAweDhmODIwMTI4LCAweDhjODIwMDA0LCAweDJjNDIwMDExLAotMHg1MDQwMDAxMCwgMHhhYzgwMDAwMCwgMHg4MDAzM2JhLCAweDAsCi0weDhlZTI0ZTMwLCAweDI0NDIwMDAxLCAweDUwNTUwMDAzLCAweDEwMjEsCi0weDhlZTI0ZTMwLCAweDI0NDIwMDAxLCAweGFlZTI0ZTMwLCAweDhlZTI0ZTMwLAotMHgyMTBjMCwgMHgyNDQyNTAzOCwgMHgyZTIyMDIxLCAweGFjOGUwMDAwLAotMHhhYzllMDAwNCwgMHgxNjIwMDAwZCwgMHgwLCAweDhlZTI3MjRjLAotMHgzYzA0MDAwMSwgMHgyNDg0NThhOCwgMHhhZmEwMDAxNCwgMHhhZmEyMDAxMCwKLTB4OGVlNjcyNGMsIDB4OGY0NzAyODAsIDB4M2MwNTAwMDksIDB4MzRhNWYwMDgsCi0weGMwMDI0MDMsIDB4YWZhZTAwNDgsIDB4OGZhZTAwNDgsIDB4OGVlMjAxNzQsCi0weDI0NDIwMDAxLCAweGFlZTIwMTc0LCAweDhlZTIwMTc0LCAweDgwMDM0NmUsCi0weGEwMjEsIDB4OTYwYzAwMGEsIDB4MTgzMTAyYiwgMHg1NDQwMDAwMSwKLTB4MTgwMTgyMSwgMHhhNjAzMDAwYSwgMHg4Zjg4MDEyMCwgMHgyNzYyMzgwMCwKLTB4MjUwOTAwMjAsIDB4MTIyMTAyYiwgMHg1MDQwMDAwMSwgMHgyNzY5MzAwMCwKLTB4OGY4MjAxMjgsIDB4MTEyMjAwMDQsIDB4MCwgMHg4ZjgyMDEyNCwKLTB4MTUyMjAwMDcsIDB4MjQwNDAwMjAsIDB4OGVlMjAxYTQsIDB4ODgyMSwKLTB4MjQ0MjAwMDEsIDB4YWVlMjAxYTQsIDB4ODAwMzQyZiwgMHg4ZWUyMDFhNCwKLTB4OGVlNTcyNGMsIDB4OGVlNjA0OTAsIDB4OGVlNzA0OTQsIDB4YTUwNDAwMGUsCi0weDI0MDQwMDA0LCAweGFkMTAwMDA4LCAweGFkMDQwMDE4LCAweDUyOTQwLAotMHhhMDE4MjEsIDB4MTAyMSwgMHhlMzM4MjEsIDB4ZTMyMDJiLAotMHhjMjMwMjEsIDB4YzQzMDIxLCAweGFkMDYwMDAwLCAweGFkMDcwMDA0LAotMHg4ZWUyNzI0YywgMHhhZDAyMDAxYywgMHg4ZWUyMDRjNCwgMHhhZDAyMDAxMCwKLTB4YWY4OTAxMjAsIDB4OTJlMjRlMjAsIDB4MTQ0MDAwMzMsIDB4MjQxMTAwMDEsCi0weDhlZTI0ZTMwLCAweDIxMGMwLCAweDI0NDI1MDM4LCAweDJlMjIwMjEsCi0weDhjODIwMDAwLCAweDE0NTYwMDFmLCAweDAsIDB4OGVlMzRlMzAsCi0weDhlZTI0ZTM0LCAweDEwNjIwMDFiLCAweDAsIDB4OGM4MjAwMDQsCi0weDI0NDIwMDAxLCAweGFjODIwMDA0LCAweDhlZTI0ZTM0LCAweDhlZTM0ZTMwLAotMHgyNDQyMDAwMSwgMHgxMDU1MDAwNywgMHgwLCAweDhlZTI0ZTM0LAotMHgyNDQyMDAwMSwgMHgxMDYyMDAwNSwgMHgwLCAweDgwMDM0MWMsCi0weDAsIDB4MTQ2MDAwMDUsIDB4MCwgMHg4ZjgyMDEyOCwKLTB4MjQ0MjAwMjAsIDB4YWY4MjAxMjgsIDB4OGY4MjAxMjgsIDB4OGM4MjAwMDQsCi0weDJjNDIwMDExLCAweDUwNDAwMDEwLCAweGFjODAwMDAwLCAweDgwMDM0MmYsCi0weDAsIDB4OGVlMjRlMzAsIDB4MjQ0MjAwMDEsIDB4NTA1NTAwMDMsCi0weDEwMjEsIDB4OGVlMjRlMzAsIDB4MjQ0MjAwMDEsIDB4YWVlMjRlMzAsCi0weDhlZTI0ZTMwLCAweDIxMGMwLCAweDI0NDI1MDM4LCAweDJlMjIwMjEsCi0weGFjOTYwMDAwLCAweGFjOWUwMDA0LCAweDE2MjAwMDFkLCAweDAsCi0weGE2MGMwMDBhLCAweDhmODIwMTAwLCAweGFmYTIwMDEwLCAweDhmODIwMTA0LAotMHgzYzA0MDAwMSwgMHgyNDg0NTg5YywgMHgzYzA1MDAwNiwgMHhhZmEyMDAxNCwKLTB4OGVlNjcyNGMsIDB4MzRhNWYwMGQsIDB4YzAwMjQwMywgMHgyMDAzODIxLAotMHg5M2EyMDAzNywgMHgxMDQwMDAzMSwgMHgzNDBmODEwMCwgMHg4ZTQyMDAwNCwKLTB4OGU0MzAwMDgsIDB4OGU0NDAwMGMsIDB4YTY0ZjAwMGMsIDB4YWU0MjAwMDAsCi0weGFlNDMwMDA0LCAweGFlNDQwMDA4LCAweDk2MDIwMDE2LCAweGE2NDIwMDBlLAotMHg5NjAyMDAwZSwgMHgzMDQyZmRmZiwgMHg4MDAzNDcwLCAweGE2MDIwMDBlLAotMHg4ZWUyMDFkOCwgMHgyNDQyZmZmZiwgMHhhZWUyMDFkOCwgMHg4ZWUyMDFkOCwKLTB4OGVlMjAxY2MsIDB4M2MwNDAwMWYsIDB4M2MwMTAwMDEsIDB4MzcwODIxLAotMHhhMDNlODNjMCwgMHgyNDQyZmZmZiwgMHhhZWUyMDFjYywgMHg5NjAzMDAwYSwKLTB4MzQ4NGZmZmYsIDB4OGVlMjAxY2MsIDB4NmExODIxLCAweDI2Mzk4MjEsCi0weDkzMjAyYiwgMHgxMDgwMDAwMywgMHgzYzAyZmZmNSwgMHgzNDQyMTAwMCwKLTB4MjYyOTgyMSwgMHhhZGFiMDAwMCwgMHg4ZWUyNzI0YywgMHgyNDQyMDAwMSwKLTB4MzA0MjA3ZmYsIDB4YWVlMjcyNGMsIDB4OGY0MjAyNDAsIDB4MTA0MDAwMDQsCi0weDI4M2EwMjMsIDB4OGVlMjBlMWMsIDB4MjQ0MjAwMDEsIDB4YWVlMjBlMWMsCi0weGEzYTAwMDI3LCAweDE2ODBmZDI5LCAweDAsIDB4MTI4MDAwMjQsCi0weDAsIDB4M2MwMTAwMDEsIDB4MzcwODIxLCAweGFjMzQ4M2M0LAotMHgzYzAxMDAwMSwgMHgzNzA4MjEsIDB4YWMzMzgzYzgsIDB4M2MwMTAwMDEsCi0weDM3MDgyMSwgMHhhYzMyODNjYywgMHg5M2EyMDAzNywgMHgxMDQwMDAwOCwKLTB4MCwgMHgzYzAyMDAwMSwgMHg1NzEwMjEsIDB4OGM0MjgzY2MsCi0weDI0NDIwMDA0LCAweDNjMDEwMDAxLCAweDM3MDgyMSwgMHhhYzIyODNjYywKLTB4OGVlMjcyNGMsIDB4OGY0MzAyODAsIDB4MjQ0MjAwMDEsIDB4MzA0MjA3ZmYsCi0weDE0NjIwMDA2LCAweDAsIDB4OGVlMjAxYzQsIDB4MjQ0MjAwMDEsCi0weGFlZTIwMWM0LCAweDgwMDM0Y2MsIDB4OGVlMjAxYzQsIDB4OGVlMjAxYmMsCi0weDI0NDIwMDAxLCAweGFlZTIwMWJjLCAweDgwMDM0Y2MsIDB4OGVlMjAxYmMsCi0weDk3YTQwMDFlLCAweDI0ODRmZmZjLCAweDgwMTgyMSwgMHg4ZWU0MDBjMCwKLTB4OGVlNTAwYzQsIDB4MTAyMSwgMHhhMzI4MjEsIDB4YTMzMDJiLAotMHg4MjIwMjEsIDB4ODYyMDIxLCAweGFlZTQwMGMwLCAweGFlZTUwMGM0LAotMHg4ZmFmMDAyYywgMHgyNDAyMDAwMiwgMHgxMWUyMDAwZiwgMHgyOWUyMDAwMywKLTB4MTQ0MDAwMTcsIDB4MjQwMjAwMDMsIDB4MTVlMjAwMTUsIDB4MCwKLTB4OGVlMjAwZDAsIDB4OGVlMzAwZDQsIDB4MjQ2MzAwMDEsIDB4MmM2NDAwMDEsCi0weDQ0MTAyMSwgMHhhZWUyMDBkMCwgMHhhZWUzMDBkNCwgMHg4ZWUyMDBkMCwKLTB4ODAwMzRjNiwgMHg4ZWUzMDBkNCwgMHg4ZWUyMDBkOCwgMHg4ZWUzMDBkYywKLTB4MjQ2MzAwMDEsIDB4MmM2NDAwMDEsIDB4NDQxMDIxLCAweGFlZTIwMGQ4LAotMHhhZWUzMDBkYywgMHg4ZWUyMDBkOCwgMHg4MDAzNGM2LCAweDhlZTMwMGRjLAotMHg4ZWUyMDBjOCwgMHg4ZWUzMDBjYywgMHgyNDYzMDAwMSwgMHgyYzY0MDAwMSwKLTB4NDQxMDIxLCAweGFlZTIwMGM4LCAweGFlZTMwMGNjLCAweDhlZTIwMGM4LAotMHg4ZWUzMDBjYywgMHg4ZjgzMDBlNCwgMHg4ZjgyMDBlMCwgMHgxMDYyMDAwMywKLTB4MjQ2MzAwMDgsIDB4YWY4MzAwZTQsIDB4YWY4MzAwZTgsIDB4OGZiZjAwNzAsCi0weDhmYmUwMDZjLCAweDhmYjYwMDY4LCAweDhmYjUwMDY0LCAweDhmYjQwMDYwLAotMHg4ZmIzMDA1YywgMHg4ZmIyMDA1OCwgMHg4ZmIxMDA1NCwgMHg4ZmIwMDA1MCwKLTB4M2UwMDAwOCwgMHgyN2JkMDA3OCwgMHgyN2JkZmZiMCwgMHhhZmI1MDA0NCwKLTB4YTgyMSwgMHhhZmIwMDAzMCwgMHg4MDIxLCAweGFmYmYwMDRjLAotMHhhZmI2MDA0OCwgMHhhZmI0MDA0MCwgMHhhZmIzMDAzYywgMHhhZmIyMDAzOCwKLTB4YWZiMTAwMzQsIDB4OGVlMjA0ZDQsIDB4MjQxNDAwMDEsIDB4MzA0MjAwMDEsCi0weDE0NDAwMDJhLCAweGIwMjEsIDB4OGY4NzAwZTAsIDB4OGY4ODAwYzQsCi0weDhmODIwMGU4LCAweGUyMjAyMywgMHgyYzgyMTAwMCwgMHg1MDQwMDAwMSwKLTB4MjQ4NDEwMDAsIDB4NDIwYzIsIDB4ODAxODIxLCAweDhlZTQwMGM4LAotMHg4ZWU1MDBjYywgMHgxMDIxLCAweGEzMjgyMSwgMHhhMzMwMmIsCi0weDgyMjAyMSwgMHg4NjIwMjEsIDB4YWVlNDAwYzgsIDB4YWVlNTAwY2MsCi0weDhmODMwMGM4LCAweDNjMDIwMDBhLCAweDM0NDJlZmZmLCAweDEwMzIwMjMsCi0weDQ0MTAyYiwgMHgxMDQwMDAwMywgMHgzYzAyMDAwYSwgMHgzNDQyZjAwMCwKLTB4ODIyMDIxLCAweDgwMTgyMSwgMHg4ZWU0MDBjMCwgMHg4ZWU1MDBjNCwKLTB4MTAyMSwgMHhhMzI4MjEsIDB4YTMzMDJiLCAweDgyMjAyMSwKLTB4ODYyMDIxLCAweGFlZTQwMGMwLCAweGFlZTUwMGM0LCAweGFmODgwMGM4LAotMHhhZjg3MDBlNCwgMHg4MDAzODUwLCAweGFmODcwMGU4LCAweDNjMDIwMDAxLAotMHg1NzEwMjEsIDB4OTA0MjgzYzAsIDB4MTA0MDAwMGIsIDB4MCwKLTB4M2MxMzAwMDEsIDB4Mjc3OTgyMSwgMHg4ZTczODNjNCwgMHgzYzExMDAwMSwKLTB4MjM3ODgyMSwgMHg4ZTMxODNjOCwgMHgzYzEyMDAwMSwgMHgyNTc5MDIxLAotMHg4MDAzNmU4LCAweDhlNTI4M2NjLCAweDhmODMwMGUwLCAweDhmODIwMGU0LAotMHgxMDQzMDAwNywgMHg0ODIxLCAweDhmODIwMGU0LCAweDI0MDkwMDAxLAotMHg4YzQzMDAwMCwgMHg4YzQ0MDAwNCwgMHhhZmEzMDAxOCwgMHhhZmE0MDAxYywKLTB4MTUyMDAwMGUsIDB4M2MwMmZmZmYsIDB4OGY4MjAwYzQsIDB4YWZhMjAwMTAsCi0weDhmODIwMGM4LCAweDNjMDQwMDAxLCAweDI0ODQ1ODcwLCAweGFmYTIwMDE0LAotMHg4Zjg2MDBlMCwgMHg4Zjg3MDBlNCwgMHgzYzA1MDAwNiwgMHhjMDAyNDAzLAotMHgzNGE1ZjAwMCwgMHg4MDAzODUwLCAweDAsIDB4OGZhMzAwMWMsCi0weDhmYjIwMDE4LCAweDMwNzNmZmZmLCAweDI2NzNmZmZjLCAweDYyMTAyNCwKLTB4MTA0MDAwNTgsIDB4MjQwODgyMSwgMHgzYzAyMDA4MCwgMHg2MjEwMjQsCi0weDEwNDAwMDBhLCAweDNjMDQwMDQwLCAweDhlZTIwMDdjLCAweDI0NDIwMDAxLAotMHhhZWUyMDA3YywgMHg4ZWUyMDA3YywgMHg4ZWUyMDFmYywgMHgyNDQyMDAwMSwKLTB4YWVlMjAxZmMsIDB4ODAwMzg0YSwgMHg4ZWUyMDFmYywgMHgzYzA2MDAwNCwKLTB4M2MwYjAwMDEsIDB4M2MwYTAwMDIsIDB4M2MwNTAwMTAsIDB4M2MwOTAwMDgsCi0weDhlZTIwMDgwLCAweDNjMDgwMDIwLCAweDM0MDc4MDAwLCAweDI0NDIwMDAxLAotMHhhZWUyMDA4MCwgMHg4ZWUyMDA4MCwgMHg4ZmEyMDAxYywgMHg0NDE4MjQsCi0weDEwNjYwMDIxLCAweGMzMTAyYiwgMHgxNDQwMDAwNywgMHgwLAotMHgxMDZiMDAxMSwgMHgwLCAweDEwNmEwMDE1LCAweDAsCi0weDgwMDM1OTIsIDB4NDIwNDIsIDB4MTA2NTAwMjMsIDB4YTMxMDJiLAotMHgxNDQwMDAwNSwgMHgwLCAweDEwNjkwMDE5LCAweDAsCi0weDgwMDM1OTIsIDB4NDIwNDIsIDB4MTA2ODAwMjEsIDB4MCwKLTB4ODAwMzU5MiwgMHg0MjA0MiwgMHg4ZWUyMDAzNCwgMHgyNDQyMDAwMSwKLTB4YWVlMjAwMzQsIDB4OGVlMjAwMzQsIDB4ODAwMzU5MiwgMHg0MjA0MiwKLTB4OGVlMjAxZWMsIDB4MjQ0MjAwMDEsIDB4YWVlMjAxZWMsIDB4OGVlMjAxZWMsCi0weDgwMDM1OTIsIDB4NDIwNDIsIDB4OGVlMjAxZjAsIDB4MjQ0MjAwMDEsCi0weGFlZTIwMWYwLCAweDhlZTIwMWYwLCAweDgwMDM1OTIsIDB4NDIwNDIsCi0weDhlZTIwMWY0LCAweDI0NDIwMDAxLCAweGFlZTIwMWY0LCAweDhlZTIwMWY0LAotMHg4MDAzNTkyLCAweDQyMDQyLCAweDhlZTIwMDMwLCAweDI0NDIwMDAxLAotMHhhZWUyMDAzMCwgMHg4ZWUyMDAzMCwgMHg4MDAzNTkyLCAweDQyMDQyLAotMHg4ZWUyMDFmOCwgMHgyNDQyMDAwMSwgMHhhZWUyMDFmOCwgMHg4ZWUyMDFmOCwKLTB4NDIwNDIsIDB4MTA4NzAyYjcsIDB4MCwgMHg4MDAzNTU3LAotMHgwLCAweDNjMDIwMDAxLCAweDU3MTAyMSwgMHg5MDQyODNiMiwKLTB4MTQ0MDAwODQsIDB4MjQwMjAwMDEsIDB4M2MwMzAwMDEsIDB4NzcxODIxLAotMHg5MDYzODNiMywgMHgxNDYyMDA3ZiwgMHgzYzAyMDEwMCwgMHg4ZTQzMDAwMCwKLTB4NjIxMDI0LCAweDEwNDAwMDZmLCAweDI0MDJmZmZmLCAweDE0NjIwMDA1LAotMHgyNDEwMDAwMSwgMHg5NjQzMDAwNCwgMHgzNDAyZmZmZiwgMHgxMDYyMDA3NSwKLTB4MCwgMHg5MmUyMDRkOCwgMHgxNDQwMDA3MiwgMHgwLAotMHgzYzAyMDAwMSwgMHg1NzEwMjEsIDB4OGM0MjgzYjQsIDB4Mjg0MjAwMDUsCi0weDEwNDAwMDIwLCAweDM4MjEsIDB4M2MwMjAwMDEsIDB4NTcxMDIxLAotMHg4YzQyODNiNCwgMHgxODQwMDAxNiwgMHgyODIxLCAweDk2MjYwMDAwLAotMHg1MjBjMCwgMHg5NzEwMjEsIDB4OTQ0Mjc3N2UsIDB4MTQ0NjAwMDksCi0weDk3MTAyMSwgMHg5NDQzNzc4MCwgMHg5NjIyMDAwMiwgMHgxNDYyMDAwNSwKLTB4OTcxMDIxLCAweDk0NDM3NzgyLCAweDk2MjIwMDA0LCAweDUwNjIwMDA4LAotMHgyNDA3MDAwMSwgMHgzYzAyMDAwMSwgMHg1NzEwMjEsIDB4OGM0MjgzYjQsCi0weDI0YTUwMDAxLCAweGEyMTAyYSwgMHg1NDQwZmZlZSwgMHg1MjBjMCwKLTB4MzBlMjAwZmYsIDB4MTA0MDAyN2IsIDB4MCwgMHg4MDAzNjFlLAotMHgwLCAweDI0MDIwMjEsIDB4YzAwMjJmZSwgMHgyNDA1MDAwNiwKLTB4MzA0NDAwMWYsIDB4NDI4YzAsIDB4MmU1MTAyMSwgMHg5NDQyNzI3YywKLTB4MzA0MjQwMDAsIDB4MTQ0MDAyNmYsIDB4YjcxMDIxLCAweDk0NDM3MjdlLAotMHg5NjIyMDAwMCwgMHgxNDYyMDAwYiwgMHg0MThjMCwgMHhiNzEwMjEsCi0weDk0NDM3MjgwLCAweDk2MjIwMDAyLCAweDE0NjIwMDA2LCAweDQxOGMwLAotMHhiNzEwMjEsIDB4OTQ0MzcyODIsIDB4OTYyMjAwMDQsIDB4MTA2MjAwMzUsCi0weDQxOGMwLCAweDJlMzEwMjEsIDB4OTQ0MjcyN2MsIDB4MzA0MjgwMDAsCi0weDE0NDAwMjVjLCAweDJlMzEwMjEsIDB4OTQ0ODcyN2MsIDB4OTYyNzAwMDAsCi0weDgyOGMwLCAweGI3MTAyMSwgMHg5NDQyNzM3ZSwgMHg4MDAzNjAwLAotMHgzMDIxLCAweDQyMGMwLCAweDJlNDEwMjEsIDB4OTQ0MzczN2MsCi0weDJlNDEwMjEsIDB4OTQ0ODczN2MsIDB4MzA2MzgwMDAsIDB4MTQ2MDAwMTAsCi0weDgyOGMwLCAweGI3MTAyMSwgMHg5NDQyNzM3ZSwgMHgxNDQ3ZmZmNSwKLTB4MTAwMjAyMSwgMHhiNzEwMjEsIDB4OTQ0MzczODAsIDB4OTYyMjAwMDIsCi0weDU0NjJmZmYxLCAweDQyMGMwLCAweGI3MTAyMSwgMHg5NDQzNzM4MiwKLTB4OTYyMjAwMDQsIDB4NTQ2MmZmZWMsIDB4NDIwYzAsIDB4MjQwNjAwMDEsCi0weDMwYzIwMGZmLCAweDEwNDAwMjNiLCAweDAsIDB4ODAwMzYxZSwKLTB4MCwgMHg5NzQzMDIwMiwgMHg5NjQyMDAwMCwgMHgxNDYyMDIzNSwKLTB4MCwgMHg5NzQzMDIwNCwgMHg5NjQyMDAwMiwgMHgxNDYyMDIzMSwKLTB4MCwgMHg5NzQzMDIwNiwgMHg5NjQyMDAwNCwgMHgxNDYyMDIyZCwKLTB4MCwgMHg5MjQyMDAwMCwgMHgzYTAzMDAwMSwgMHgzMDQyMDAwMSwKLTB4NDMxMDI0LCAweDEwNDAwMDc0LCAweDI0MDJmZmZmLCAweDhlMjMwMDAwLAotMHgxNDYyMDAwNCwgMHgzNDAyZmZmZiwgMHg5NjIzMDAwNCwgMHgxMDYyMDA2ZiwKLTB4MjQxNDAwMDIsIDB4M2MwMjAwMDEsIDB4NTcxMDIxLCAweDkwNDI4M2IyLAotMHgxNDQwMDA2YSwgMHgyNDE0MDAwMywgMHg5MmUyMDRkOCwgMHgxNDQwMDA2NywKLTB4MCwgMHgzYzAyMDAwMSwgMHg1NzEwMjEsIDB4OGM0MjgzYjQsCi0weDI4NDIwMDA1LCAweDEwNDAwMDIwLCAweDM4MjEsIDB4M2MwMjAwMDEsCi0weDU3MTAyMSwgMHg4YzQyODNiNCwgMHgxODQwMDAxNiwgMHgyODIxLAotMHg5NjI2MDAwMCwgMHg1MjBjMCwgMHg5NzEwMjEsIDB4OTQ0Mjc3N2UsCi0weDE0NDYwMDA5LCAweDk3MTAyMSwgMHg5NDQzNzc4MCwgMHg5NjIyMDAwMiwKLTB4MTQ2MjAwMDUsIDB4OTcxMDIxLCAweDk0NDM3NzgyLCAweDk2MjIwMDA0LAotMHg1MDYyMDAwOCwgMHgyNDA3MDAwMSwgMHgzYzAyMDAwMSwgMHg1NzEwMjEsCi0weDhjNDI4M2I0LCAweDI0YTUwMDAxLCAweGEyMTAyYSwgMHg1NDQwZmZlZSwKLTB4NTIwYzAsIDB4MzBlMjAwZmYsIDB4MTQ0MDAwNDQsIDB4MjQxNDAwMDMsCi0weDgwMDM4NGEsIDB4MCwgMHgyNDAyMDIxLCAweGMwMDIyZmUsCi0weDI0MDUwMDA2LCAweDMwNDQwMDFmLCAweDQyOGMwLCAweDJlNTEwMjEsCi0weDk0NDI3MjdjLCAweDMwNDI0MDAwLCAweDE0NDAwMWVhLCAweGI3MTAyMSwKLTB4OTQ0MzcyN2UsIDB4OTYyMjAwMDAsIDB4MTQ2MjAwMGIsIDB4NDE4YzAsCi0weGI3MTAyMSwgMHg5NDQzNzI4MCwgMHg5NjIyMDAwMiwgMHgxNDYyMDAwNiwKLTB4NDE4YzAsIDB4YjcxMDIxLCAweDk0NDM3MjgyLCAweDk2MjIwMDA0LAotMHgxMDYyMDAyNywgMHg0MThjMCwgMHgyZTMxMDIxLCAweDk0NDI3MjdjLAotMHgzMDQyODAwMCwgMHgxNDQwMDFkNywgMHgyZTMxMDIxLCAweDk0NDg3MjdjLAotMHg5NjI3MDAwMCwgMHg4MjhjMCwgMHhiNzEwMjEsIDB4OTQ0MjczN2UsCi0weDgwMDM2ODUsIDB4MzAyMSwgMHg0MjBjMCwgMHgyZTQxMDIxLAotMHg5NDQzNzM3YywgMHgyZTQxMDIxLCAweDk0NDg3MzdjLCAweDMwNjM4MDAwLAotMHgxNDYwMDAxMCwgMHg4MjhjMCwgMHhiNzEwMjEsIDB4OTQ0MjczN2UsCi0weDE0NDdmZmY1LCAweDEwMDIwMjEsIDB4YjcxMDIxLCAweDk0NDM3MzgwLAotMHg5NjIyMDAwMiwgMHg1NDYyZmZmMSwgMHg0MjBjMCwgMHhiNzEwMjEsCi0weDk0NDM3MzgyLCAweDk2MjIwMDA0LCAweDU0NjJmZmVjLCAweDQyMGMwLAotMHgyNDA2MDAwMSwgMHgzMGMyMDBmZiwgMHgxMDQwMDFiNiwgMHgwLAotMHg4MDAzNjk4LCAweDI0MTQwMDAzLCAweDI0MTQwMDAxLCAweDhmNDIwMjYwLAotMHg1MzEwMmIsIDB4MTA0MDAwNDksIDB4MCwgMHg4ZjgzMDBlNCwKLTB4OGY4MjAwZTAsIDB4MTA2MjAwMDMsIDB4MjQ2MzAwMDgsIDB4YWY4MzAwZTQsCi0weGFmODMwMGU4LCAweDhlZTQwMGMwLCAweDhlZTUwMGM0LCAweDI2MDE4MjEsCi0weDEwMjEsIDB4YTMyODIxLCAweGEzMzAyYiwgMHg4MjIwMjEsCi0weDg2MjAyMSwgMHhhZWU0MDBjMCwgMHhhZWU1MDBjNCwgMHg4ZWUyMDA1OCwKLTB4MjQ0MjAwMDEsIDB4YWVlMjAwNTgsIDB4OGVlMjAwNTgsIDB4OGVlMjAwN2MsCi0weDI0NDIwMDAxLCAweGFlZTIwMDdjLCAweDhlZTIwMDdjLCAweDhmODIwMGUwLAotMHhhZmEyMDAxMCwgMHg4ZjgyMDBlNCwgMHgzYzA0MDAwMSwgMHgyNDg0NTg3OCwKLTB4YWZhMjAwMTQsIDB4OGZhNjAwMTgsIDB4OGZhNzAwMWMsIDB4M2MwNTAwMDYsCi0weGMwMDI0MDMsIDB4MzRhNWYwMDMsIDB4ODAwMzg1MCwgMHgwLAotMHg4ZWUyNTI0MCwgMHhhZmEyMDAxMCwgMHg4ZWUyNTI0NCwgMHgzYzA0MDAwMSwKLTB4MjQ4NDU4ODQsIDB4YWZhMjAwMTQsIDB4OGVlNjBlMTAsIDB4OGVlNzBlMTgsCi0weGMwMDI0MDMsIDB4MzRhNWYwMDIsIDB4OGVlMjAxYzAsIDB4MjQ0MjAwMDEsCi0weGFlZTIwMWMwLCAweDhlZTIwMDAwLCAweDhlZTMwMWMwLCAweDI0MDNmZmJmLAotMHg0MzEwMjQsIDB4ODAwMzdmOCwgMHhhZWUyMDAwMCwgMHg4ZWUyNTI0MCwKLTB4YWZhMjAwMTAsIDB4OGVlMjUyNDQsIDB4M2MwNDAwMDEsIDB4MjQ4NDU4ODQsCi0weGFmYTIwMDE0LCAweDhlZTYwZTEwLCAweDhlZTcwZTE4LCAweDNjMDUwMDA2LAotMHhjMDAyNDAzLCAweDM0YTVmMDAyLCAweDhlZTIwMWMwLCAweDI0NDIwMDAxLAotMHhhZWUyMDFjMCwgMHg4MDAzN2Y4LCAweDhlZTIwMWMwLCAweDk2ZTIwNDY4LAotMHg1MzEwMmIsIDB4NTQ0MDAwMDEsIDB4M2MxNTgwMDAsIDB4MTI2MDAxMzEsCi0weDNjMGMwMDFmLCAweDM1OGNmZmZmLCAweDhlZTI3MjRjLCAweDhmNDMwMjgwLAotMHgyNDQyMDAwMSwgMHgzMDQyMDdmZiwgMHgxMDYyMDEwOCwgMHgwLAotMHgxMmEwMDAxNCwgMHgwLCAweDhlZTM1MjQwLCAweDhlZTI1MjQ0LAotMHgxMDYyMDAwOSwgMHgyNmVlNTI0NCwgMHg4ZWViNTI0NCwgMHg4ZWUzNTI0NCwKLTB4MjExNDAsIDB4MjQ0MjUyNDgsIDB4MmUyODAyMSwgMHgyNDYzMDAwMSwKLTB4ODAwMzcxMiwgMHgzMDY4MDBmZiwgMHg5MmUyNzI0OCwgMHgxNDQwZmZjMCwKLTB4M2MwNTAwMDYsIDB4OGVlMjAxZTAsIDB4MjQ0MjAwMDEsIDB4YWVlMjAxZTAsCi0weDhlZTIwMWUwLCAweDhlZTMwZTEwLCAweDhlZTIwZTE4LCAweDEwNjJmZmNiLAotMHgyNmVlMGUxOCwgMHg4ZWViMGUxOCwgMHhhODIxLCAweDhlZTMwZTE4LAotMHgyMTE0MCwgMHgyNDQyMGUyMCwgMHgyZTI4MDIxLCAweDI0NjMwMDAxLAotMHgzMDY4MDFmZiwgMHg5NmUyMDQ2YSwgMHgzMDQyMDAxMCwgMHgxMDQwMDAxNywKLTB4MzQwMjgxMDAsIDB4OTY0MzAwMGMsIDB4MTQ2MjAwMTQsIDB4MCwKLTB4M2MwMjAwMDEsIDB4NTcxMDIxLCAweDkwNDI4M2MwLCAweDE0NDAwMDBmLAotMHgwLCAweDk2NDIwMDBlLCAweGE2MDIwMDE2LCAweDhlNDIwMDA4LAotMHg4ZTQzMDAwNCwgMHg4ZTQ0MDAwMCwgMHgyNjczZmZmYywgMHhhZTQyMDAwYywKLTB4YWU0MzAwMDgsIDB4YWU0NDAwMDQsIDB4OTYwMjAwMGUsIDB4MjYzMTAwMDQsCi0weDI0MTYwMDAxLCAweDM0NDIwMjAwLCAweGE2MDIwMDBlLCAweDk2MDMwMDBhLAotMHgyNjA1MDIxLCAweDczMTAyYiwgMHgxMDQwMDAwMiwgMHgyNjA2ODIxLAotMHg2MDUwMjEsIDB4MmQ0MjAwM2QsIDB4MTA0MDAwMmEsIDB4MzgyMSwKLTB4OTYyMzAwMGMsIDB4MjQwMjA4MDAsIDB4NTQ2MjAwMjcsIDB4YWUxMTAwMTgsCi0weDNjMDIwMDAxLCAweDU3MTAyMSwgMHg5MDQyODNjMCwgMHg1NDQwMDAyMiwKLTB4YWUxMTAwMTgsIDB4MjYyMjAwMTcsIDB4MTgyMTAyYiwgMHgxMDQwMDAxMywKLTB4MCwgMHgzYzAyZmZmNSwgMHg1MTEwMjEsIDB4OTA0MjEwMTcsCi0weDM4NDMwMDA2LCAweDJjNjMwMDAxLCAweDM4NDIwMDExLCAweDJjNDIwMDAxLAotMHg2MjE4MjUsIDB4MTA2MDAwMTMsIDB4MjYyMjAwMTAsIDB4MTgyMTAyYiwKLTB4MTA0MDAwMGUsIDB4MCwgMHgzYzA3ZmZmNSwgMHhmMTM4MjEsCi0weDk0ZTcxMDEwLCAweDgwMDM3NWUsIDB4MjRlNzAwMGUsIDB4OTIyMjAwMTcsCi0weDM4NDMwMDA2LCAweDJjNjMwMDAxLCAweDM4NDIwMDExLCAweDJjNDIwMDAxLAotMHg2MjE4MjUsIDB4NTA2MDAwMDQsIDB4YWUxMTAwMTgsIDB4OTYyNzAwMTAsCi0weDI0ZTcwMDBlLCAweGFlMTEwMDE4LCAweDNjMDIwMDAxLCAweDU3MTAyMSwKLTB4OTA0MjgzYzAsIDB4MjEwMmIsIDB4MTRlMDAwMDIsIDB4MjRlYzAsCi0weDE0MDM4MjEsIDB4OGY4MzAxMjAsIDB4Mjc2MjM4MDAsIDB4MjQ2NjAwMjAsCi0weGMyMTAyYiwgMHg1MDQwMDAwMSwgMHgyNzY2MzAwMCwgMHg4ZjgyMDEyOCwKLTB4MTBjMjAwMDQsIDB4MCwgMHg4ZjgyMDEyNCwgMHgxNGMyMDAwNywKLTB4MjQwMjAwMGIsIDB4OGVlMjAxYTQsIDB4NDgyMSwgMHgyNDQyMDAwMSwKLTB4YWVlMjAxYTQsIDB4ODAwMzdiZiwgMHg4ZWUyMDFhNCwgMHg4ZTA0MDAwMCwKLTB4OGUwNTAwMDQsIDB4YWM2MjAwMTgsIDB4MTc1MTAyNSwgMHg0OTEwMjUsCi0weGFjNzEwMDA4LCAweGE0NjcwMDBlLCAweGFjNjIwMDFjLCAweGFjNjQwMDAwLAotMHhhYzY1MDAwNCwgMHg4ZWUyMDRjMCwgMHhhYzYyMDAxMCwgMHhhZjg2MDEyMCwKLTB4OTJlMjRlMjAsIDB4MTQ0MDAwMzgsIDB4MjQwOTAwMDEsIDB4OGVlMjRlMzAsCi0weDIxMGMwLCAweDI0NDI1MDM4LCAweDJlMjIwMjEsIDB4OGM4MzAwMDAsCi0weDI0MDIwMDA3LCAweDE0NjIwMDIwLCAweDAsIDB4OGVlMzRlMzAsCi0weDhlZTI0ZTM0LCAweDEwNjIwMDFjLCAweDAsIDB4OGM4MjAwMDQsCi0weDI0NDIwMDAxLCAweGFjODIwMDA0LCAweDhlZTM0ZTM0LCAweDhlZTU0ZTMwLAotMHgyNDAyMDA0MCwgMHgyNDYzMDAwMSwgMHgxMDYyMDAwNywgMHgwLAotMHg4ZWUyNGUzNCwgMHgyNDQyMDAwMSwgMHgxMGEyMDAwNSwgMHgwLAotMHg4MDAzN2E5LCAweDAsIDB4MTRhMDAwMDUsIDB4MCwKLTB4OGY4MjAxMjgsIDB4MjQ0MjAwMjAsIDB4YWY4MjAxMjgsIDB4OGY4MjAxMjgsCi0weDhjODIwMDA0LCAweDJjNDIwMDExLCAweDUwNDAwMDEzLCAweGFjODAwMDAwLAotMHg4MDAzN2JmLCAweDAsIDB4OGVlMjRlMzAsIDB4MjQwMzAwNDAsCi0weDI0NDIwMDAxLCAweDUwNDMwMDAzLCAweDEwMjEsIDB4OGVlMjRlMzAsCi0weDI0NDIwMDAxLCAweGFlZTI0ZTMwLCAweDhlZTI0ZTMwLCAweDIxMGMwLAotMHgyNDQyNTAzOCwgMHgyZTIyMDIxLCAweDI0MDIwMDA3LCAweGFjODIwMDAwLAotMHgyNDAyMDAwMSwgMHhhYzgyMDAwNCwgMHgxNTIwMDAxOCwgMHgzYzA1MDAwNiwKLTB4OGUwMjAwMTgsIDB4M2MwNDAwMDEsIDB4MjQ4NDU4OTAsIDB4YWZhMjAwMTAsCi0weDhlMDIwMDAwLCAweDhlMDMwMDA0LCAweDM0YTVmMDA5LCAweDIwMDMwMjEsCi0weGMwMDI0MDMsIDB4YWZhMzAwMTQsIDB4MzJjMjAwZmYsIDB4MTA0MDAwMmIsCi0weDM0MDI4MTAwLCAweDhlNDMwMDA0LCAweDhlNDQwMDA4LCAweDhlNDUwMDBjLAotMHhhNjQyMDAwYywgMHhhZTQzMDAwMCwgMHhhZTQ0MDAwNCwgMHhhZTQ1MDAwOCwKLTB4OTYwMjAwMTYsIDB4ODAwMzdmOCwgMHhhNjQyMDAwZSwgMHgxNTRkMDAwYSwKLTB4MCwgMHg5NjAyMDAwZSwgMHhhNjEzMDAwYSwgMHgzNDQyMDAwNCwKLTB4YTYwMjAwMGUsIDB4M2MwMTAwMDEsIDB4MzcwODIxLCAweGEwMjA4M2MwLAotMHg4MDAzN2Y2LCAweDk4MjEsIDB4OTYwNDAwMGEsIDB4OTMxMDJiLAotMHgxMDQwMDAwMiwgMHgyNjAxODIxLCAweDgwMTgyMSwgMHgyNDAyMDAwMSwKLTB4YTYwMzAwMGEsIDB4M2MwMTAwMDEsIDB4MzcwODIxLCAweGEwMjI4M2MwLAotMHg5NjA0MDAwYSwgMHgyMjQ4ODIxLCAweDE5MTEwMmIsIDB4MTA0MDAwMDMsCi0weDNjMDJmZmY1LCAweDM0NDIxMDAwLCAweDIyMjg4MjEsIDB4MjY0OTgyMywKLTB4YTgyMSwgMHgxNjYwZmVmNCwgMHhhZGM4MDAwMCwgMHgxMjYwMDAyMSwKLTB4MzJjMjAwZmYsIDB4M2MwMTAwMDEsIDB4MzcwODIxLCAweGFjMzM4M2M0LAotMHgzYzAxMDAwMSwgMHgzNzA4MjEsIDB4YWMzMTgzYzgsIDB4M2MwMTAwMDEsCi0weDM3MDgyMSwgMHgxMDQwMDAwOCwgMHhhYzMyODNjYywgMHgzYzAyMDAwMSwKLTB4NTcxMDIxLCAweDhjNDI4M2NjLCAweDI0NDIwMDA0LCAweDNjMDEwMDAxLAotMHgzNzA4MjEsIDB4YWMyMjgzY2MsIDB4OGVlMjcyNGMsIDB4OGY0MzAyODAsCi0weDI0NDIwMDAxLCAweDE0NjIwMDA2LCAweDAsIDB4OGVlMjAxYzQsCi0weDI0NDIwMDAxLCAweGFlZTIwMWM0LCAweDgwMDM4NTAsIDB4OGVlMjAxYzQsCi0weDhlZTIwMWJjLCAweDI0NDIwMDAxLCAweGFlZTIwMWJjLCAweDgwMDM4NTAsCi0weDhlZTIwMWJjLCAweDk3YTQwMDFlLCAweDI0ODRmZmZjLCAweDgwMTgyMSwKLTB4OGVlNDAwYzAsIDB4OGVlNTAwYzQsIDB4MTAyMSwgMHhhMzI4MjEsCi0weGEzMzAyYiwgMHg4MjIwMjEsIDB4ODYyMDIxLCAweDI0MDIwMDAyLAotMHhhZWU0MDBjMCwgMHhhZWU1MDBjNCwgMHgxMjgyMDAwZiwgMHgyYTgyMDAwMywKLTB4MTQ0MDAwMTcsIDB4MjQwMjAwMDMsIDB4MTY4MjAwMTUsIDB4MCwKLTB4OGVlMjAwZDAsIDB4OGVlMzAwZDQsIDB4MjQ2MzAwMDEsIDB4MmM2NDAwMDEsCi0weDQ0MTAyMSwgMHhhZWUyMDBkMCwgMHhhZWUzMDBkNCwgMHg4ZWUyMDBkMCwKLTB4ODAwMzg0YSwgMHg4ZWUzMDBkNCwgMHg4ZWUyMDBkOCwgMHg4ZWUzMDBkYywKLTB4MjQ2MzAwMDEsIDB4MmM2NDAwMDEsIDB4NDQxMDIxLCAweGFlZTIwMGQ4LAotMHhhZWUzMDBkYywgMHg4ZWUyMDBkOCwgMHg4MDAzODRhLCAweDhlZTMwMGRjLAotMHg4ZWUyMDBjOCwgMHg4ZWUzMDBjYywgMHgyNDYzMDAwMSwgMHgyYzY0MDAwMSwKLTB4NDQxMDIxLCAweGFlZTIwMGM4LCAweGFlZTMwMGNjLCAweDhlZTIwMGM4LAotMHg4ZWUzMDBjYywgMHg4ZjgzMDBlNCwgMHg4ZjgyMDBlMCwgMHgxMDYyMDAwMywKLTB4MjQ2MzAwMDgsIDB4YWY4MzAwZTQsIDB4YWY4MzAwZTgsIDB4OGZiZjAwNGMsCi0weDhmYjYwMDQ4LCAweDhmYjUwMDQ0LCAweDhmYjQwMDQwLCAweDhmYjMwMDNjLAotMHg4ZmIyMDAzOCwgMHg4ZmIxMDAzNCwgMHg4ZmIwMDAzMCwgMHgzZTAwMDA4LAotMHgyN2JkMDA1MCwgMHgyN2JkZmY5MCwgMHhhZmI2MDA2MCwgMHhiMDIxLAotMHhhZmJmMDA2OCwgMHhhZmJlMDA2NCwgMHhhZmI1MDA1YywgMHhhZmI0MDA1OCwKLTB4YWZiMzAwNTQsIDB4YWZiMjAwNTAsIDB4YWZiMTAwNGMsIDB4YWZiMDAwNDgsCi0weDhlZTIwNGQ0LCAweDg4MjEsIDB4MjQxNTAwMDEsIDB4MzA0MjAwMDEsCi0weDE0NDAwMDJhLCAweGEzYTAwMDJmLCAweDhmODcwMGUwLCAweDhmODgwMGM0LAotMHg4ZjgyMDBlOCwgMHhlMjIwMjMsIDB4MmM4MjEwMDAsIDB4NTA0MDAwMDEsCi0weDI0ODQxMDAwLCAweDQyMGMyLCAweDgwMTgyMSwgMHg4ZWU0MDBjOCwKLTB4OGVlNTAwY2MsIDB4MTAyMSwgMHhhMzI4MjEsIDB4YTMzMDJiLAotMHg4MjIwMjEsIDB4ODYyMDIxLCAweGFlZTQwMGM4LCAweGFlZTUwMGNjLAotMHg4ZjgzMDBjOCwgMHgzYzAyMDAwYSwgMHgzNDQyZWZmZiwgMHgxMDMyMDIzLAotMHg0NDEwMmIsIDB4MTA0MDAwMDMsIDB4M2MwMjAwMGEsIDB4MzQ0MmYwMDAsCi0weDgyMjAyMSwgMHg4MDE4MjEsIDB4OGVlNDAwYzAsIDB4OGVlNTAwYzQsCi0weDEwMjEsIDB4YTMyODIxLCAweGEzMzAyYiwgMHg4MjIwMjEsCi0weDg2MjAyMSwgMHhhZWU0MDBjMCwgMHhhZWU1MDBjNCwgMHhhZjg4MDBjOCwKLTB4YWY4NzAwZTQsIDB4ODAwM2M1YiwgMHhhZjg3MDBlOCwgMHgzYzAyMDAwMSwKLTB4NTcxMDIxLCAweDkwNDI4M2MwLCAweDEwNDAwMDBiLCAweDAsCi0weDNjMTMwMDAxLCAweDI3Nzk4MjEsIDB4OGU3MzgzYzQsIDB4M2MxMDAwMDEsCi0weDIxNzgwMjEsIDB4OGUxMDgzYzgsIDB4M2MxMjAwMDEsIDB4MjU3OTAyMSwKLTB4ODAwM2E1OSwgMHg4ZTUyODNjYywgMHg4ZjgzMDBlMCwgMHg4ZjgyMDBlNCwKLTB4MTA0MzAwMDcsIDB4MzgyMSwgMHg4ZjgyMDBlNCwgMHgyNDA3MDAwMSwKLTB4OGM0MzAwMDAsIDB4OGM0NDAwMDQsIDB4YWZhMzAwMTgsIDB4YWZhNDAwMWMsCi0weDE0ZTAwMDBlLCAweDNjMDJmZmZmLCAweDhmODIwMGM0LCAweGFmYTIwMDEwLAotMHg4ZjgyMDBjOCwgMHgzYzA0MDAwMSwgMHgyNDg0NThiNCwgMHhhZmEyMDAxNCwKLTB4OGY4NjAwZTAsIDB4OGY4NzAwZTQsIDB4M2MwNTAwMDYsIDB4YzAwMjQwMywKLTB4MzRhNWYyMDAsIDB4ODAwM2M1YiwgMHgwLCAweDhmYTMwMDFjLAotMHg4ZmIyMDAxOCwgMHgzMDczZmZmZiwgMHgyNjczZmZmYywgMHg2MjEwMjQsCi0weDEwNDAwMDU4LCAweDI0MDgwMjEsIDB4M2MwMjAwODAsIDB4NjIxMDI0LAotMHgxMDQwMDAwYSwgMHgzYzA0MDA0MCwgMHg4ZWUyMDA3YywgMHgyNDQyMDAwMSwKLTB4YWVlMjAwN2MsIDB4OGVlMjAwN2MsIDB4OGVlMjAxZmMsIDB4MjQ0MjAwMDEsCi0weGFlZTIwMWZjLCAweDgwMDNjNTUsIDB4OGVlMjAxZmMsIDB4M2MwNjAwMDQsCi0weDNjMGIwMDAxLCAweDNjMGEwMDAyLCAweDNjMDUwMDEwLCAweDNjMDkwMDA4LAotMHg4ZWUyMDA4MCwgMHgzYzA4MDAyMCwgMHgzNDA3ODAwMCwgMHgyNDQyMDAwMSwKLTB4YWVlMjAwODAsIDB4OGVlMjAwODAsIDB4OGZhMjAwMWMsIDB4NDQxODI0LAotMHgxMDY2MDAyMSwgMHhjMzEwMmIsIDB4MTQ0MDAwMDcsIDB4MCwKLTB4MTA2YjAwMTEsIDB4MCwgMHgxMDZhMDAxNSwgMHgwLAotMHg4MDAzOTE2LCAweDQyMDQyLCAweDEwNjUwMDIzLCAweGEzMTAyYiwKLTB4MTQ0MDAwMDUsIDB4MCwgMHgxMDY5MDAxOSwgMHgwLAotMHg4MDAzOTE2LCAweDQyMDQyLCAweDEwNjgwMDIxLCAweDAsCi0weDgwMDM5MTYsIDB4NDIwNDIsIDB4OGVlMjAwMzQsIDB4MjQ0MjAwMDEsCi0weGFlZTIwMDM0LCAweDhlZTIwMDM0LCAweDgwMDM5MTYsIDB4NDIwNDIsCi0weDhlZTIwMWVjLCAweDI0NDIwMDAxLCAweGFlZTIwMWVjLCAweDhlZTIwMWVjLAotMHg4MDAzOTE2LCAweDQyMDQyLCAweDhlZTIwMWYwLCAweDI0NDIwMDAxLAotMHhhZWUyMDFmMCwgMHg4ZWUyMDFmMCwgMHg4MDAzOTE2LCAweDQyMDQyLAotMHg4ZWUyMDFmNCwgMHgyNDQyMDAwMSwgMHhhZWUyMDFmNCwgMHg4ZWUyMDFmNCwKLTB4ODAwMzkxNiwgMHg0MjA0MiwgMHg4ZWUyMDAzMCwgMHgyNDQyMDAwMSwKLTB4YWVlMjAwMzAsIDB4OGVlMjAwMzAsIDB4ODAwMzkxNiwgMHg0MjA0MiwKLTB4OGVlMjAxZjgsIDB4MjQ0MjAwMDEsIDB4YWVlMjAxZjgsIDB4OGVlMjAxZjgsCi0weDQyMDQyLCAweDEwODcwMzNlLCAweDAsIDB4ODAwMzhkYiwKLTB4MCwgMHgzYzAyMDAwMSwgMHg1NzEwMjEsIDB4OTA0MjgzYjIsCi0weDE0NDAwMDg0LCAweDI0MDIwMDAxLCAweDNjMDMwMDAxLCAweDc3MTgyMSwKLTB4OTA2MzgzYjMsIDB4MTQ2MjAwN2YsIDB4M2MwMjAxMDAsIDB4OGU0MzAwMDAsCi0weDYyMTAyNCwgMHgxMDQwMDA2ZiwgMHgyNDAyZmZmZiwgMHgxNDYyMDAwNSwKLTB4MjQxMTAwMDEsIDB4OTY0MzAwMDQsIDB4MzQwMmZmZmYsIDB4MTA2MjAwNzUsCi0weDAsIDB4OTJlMjA0ZDgsIDB4MTQ0MDAwNzIsIDB4MCwKLTB4M2MwMjAwMDEsIDB4NTcxMDIxLCAweDhjNDI4M2I0LCAweDI4NDIwMDA1LAotMHgxMDQwMDAyMCwgMHgzODIxLCAweDNjMDIwMDAxLCAweDU3MTAyMSwKLTB4OGM0MjgzYjQsIDB4MTg0MDAwMTYsIDB4MjgyMSwgMHg5NjA2MDAwMCwKLTB4NTIwYzAsIDB4OTcxMDIxLCAweDk0NDI3NzdlLCAweDE0NDYwMDA5LAotMHg5NzEwMjEsIDB4OTQ0Mzc3ODAsIDB4OTYwMjAwMDIsIDB4MTQ2MjAwMDUsCi0weDk3MTAyMSwgMHg5NDQzNzc4MiwgMHg5NjAyMDAwNCwgMHg1MDYyMDAwOCwKLTB4MjQwNzAwMDEsIDB4M2MwMjAwMDEsIDB4NTcxMDIxLCAweDhjNDI4M2I0LAotMHgyNGE1MDAwMSwgMHhhMjEwMmEsIDB4NTQ0MGZmZWUsIDB4NTIwYzAsCi0weDMwZTIwMGZmLCAweDEwNDAwMzAyLCAweDAsIDB4ODAwMzlhMiwKLTB4MCwgMHgyNDAyMDIxLCAweGMwMDIyZmUsIDB4MjQwNTAwMDYsCi0weDMwNDQwMDFmLCAweDQyOGMwLCAweDJlNTEwMjEsIDB4OTQ0MjcyN2MsCi0weDMwNDI0MDAwLCAweDE0NDAwMmY2LCAweGI3MTAyMSwgMHg5NDQzNzI3ZSwKLTB4OTYwMjAwMDAsIDB4MTQ2MjAwMGIsIDB4NDE4YzAsIDB4YjcxMDIxLAotMHg5NDQzNzI4MCwgMHg5NjAyMDAwMiwgMHgxNDYyMDAwNiwgMHg0MThjMCwKLTB4YjcxMDIxLCAweDk0NDM3MjgyLCAweDk2MDIwMDA0LCAweDEwNjIwMDM1LAotMHg0MThjMCwgMHgyZTMxMDIxLCAweDk0NDI3MjdjLCAweDMwNDI4MDAwLAotMHgxNDQwMDJlMywgMHgyZTMxMDIxLCAweDk0NGQ3MjdjLCAweDk2MDcwMDAwLAotMHhkMjhjMCwgMHhiNzEwMjEsIDB4OTQ0MjczN2UsIDB4ODAwMzk4NCwKLTB4MzAyMSwgMHg0MjBjMCwgMHgyZTQxMDIxLCAweDk0NDM3MzdjLAotMHgyZTQxMDIxLCAweDk0NGQ3MzdjLCAweDMwNjM4MDAwLCAweDE0NjAwMDEwLAotMHhkMjhjMCwgMHhiNzEwMjEsIDB4OTQ0MjczN2UsIDB4MTQ0N2ZmZjUsCi0weDFhMDIwMjEsIDB4YjcxMDIxLCAweDk0NDM3MzgwLCAweDk2MDIwMDAyLAotMHg1NDYyZmZmMSwgMHg0MjBjMCwgMHhiNzEwMjEsIDB4OTQ0MzczODIsCi0weDk2MDIwMDA0LCAweDU0NjJmZmVjLCAweDQyMGMwLCAweDI0MDYwMDAxLAotMHgzMGMyMDBmZiwgMHgxMDQwMDJjMiwgMHgwLCAweDgwMDM5YTIsCi0weDAsIDB4OTc0MzAyMDIsIDB4OTY0MjAwMDAsIDB4MTQ2MjAyYmMsCi0weDAsIDB4OTc0MzAyMDQsIDB4OTY0MjAwMDIsIDB4MTQ2MjAyYjgsCi0weDAsIDB4OTc0MzAyMDYsIDB4OTY0MjAwMDQsIDB4MTQ2MjAyYjQsCi0weDAsIDB4OTI0MjAwMDAsIDB4M2EyMzAwMDEsIDB4MzA0MjAwMDEsCi0weDQzMTAyNCwgMHgxMDQwMDA3NCwgMHgyNDAyZmZmZiwgMHg4ZTAzMDAwMCwKLTB4MTQ2MjAwMDQsIDB4MzQwMmZmZmYsIDB4OTYwMzAwMDQsIDB4MTA2MjAwNmYsCi0weDI0MTUwMDAyLCAweDNjMDIwMDAxLCAweDU3MTAyMSwgMHg5MDQyODNiMiwKLTB4MTQ0MDAwNmEsIDB4MjQxNTAwMDMsIDB4OTJlMjA0ZDgsIDB4MTQ0MDAwNjcsCi0weDAsIDB4M2MwMjAwMDEsIDB4NTcxMDIxLCAweDhjNDI4M2I0LAotMHgyODQyMDAwNSwgMHgxMDQwMDAyMCwgMHgzODIxLCAweDNjMDIwMDAxLAotMHg1NzEwMjEsIDB4OGM0MjgzYjQsIDB4MTg0MDAwMTYsIDB4MjgyMSwKLTB4OTYwNjAwMDAsIDB4NTIwYzAsIDB4OTcxMDIxLCAweDk0NDI3NzdlLAotMHgxNDQ2MDAwOSwgMHg5NzEwMjEsIDB4OTQ0Mzc3ODAsIDB4OTYwMjAwMDIsCi0weDE0NjIwMDA1LCAweDk3MTAyMSwgMHg5NDQzNzc4MiwgMHg5NjAyMDAwNCwKLTB4NTA2MjAwMDgsIDB4MjQwNzAwMDEsIDB4M2MwMjAwMDEsIDB4NTcxMDIxLAotMHg4YzQyODNiNCwgMHgyNGE1MDAwMSwgMHhhMjEwMmEsIDB4NTQ0MGZmZWUsCi0weDUyMGMwLCAweDMwZTIwMGZmLCAweDE0NDAwMDQ0LCAweDI0MTUwMDAzLAotMHg4MDAzYzU1LCAweDAsIDB4MjQwMjAyMSwgMHhjMDAyMmZlLAotMHgyNDA1MDAwNiwgMHgzMDQ0MDAxZiwgMHg0MjhjMCwgMHgyZTUxMDIxLAotMHg5NDQyNzI3YywgMHgzMDQyNDAwMCwgMHgxNDQwMDI3MSwgMHhiNzEwMjEsCi0weDk0NDM3MjdlLCAweDk2MDIwMDAwLCAweDE0NjIwMDBiLCAweDQxOGMwLAotMHhiNzEwMjEsIDB4OTQ0MzcyODAsIDB4OTYwMjAwMDIsIDB4MTQ2MjAwMDYsCi0weDQxOGMwLCAweGI3MTAyMSwgMHg5NDQzNzI4MiwgMHg5NjAyMDAwNCwKLTB4MTA2MjAwMjcsIDB4NDE4YzAsIDB4MmUzMTAyMSwgMHg5NDQyNzI3YywKLTB4MzA0MjgwMDAsIDB4MTQ0MDAyNWUsIDB4MmUzMTAyMSwgMHg5NDRkNzI3YywKLTB4OTYwNzAwMDAsIDB4ZDI4YzAsIDB4YjcxMDIxLCAweDk0NDI3MzdlLAotMHg4MDAzYTA5LCAweDMwMjEsIDB4NDIwYzAsIDB4MmU0MTAyMSwKLTB4OTQ0MzczN2MsIDB4MmU0MTAyMSwgMHg5NDRkNzM3YywgMHgzMDYzODAwMCwKLTB4MTQ2MDAwMTAsIDB4ZDI4YzAsIDB4YjcxMDIxLCAweDk0NDI3MzdlLAotMHgxNDQ3ZmZmNSwgMHgxYTAyMDIxLCAweGI3MTAyMSwgMHg5NDQzNzM4MCwKLTB4OTYwMjAwMDIsIDB4NTQ2MmZmZjEsIDB4NDIwYzAsIDB4YjcxMDIxLAotMHg5NDQzNzM4MiwgMHg5NjAyMDAwNCwgMHg1NDYyZmZlYywgMHg0MjBjMCwKLTB4MjQwNjAwMDEsIDB4MzBjMjAwZmYsIDB4MTA0MDAyM2QsIDB4MCwKLTB4ODAwM2ExYywgMHgyNDE1MDAwMywgMHgyNDE1MDAwMSwgMHg4ZjQyMDI2MCwKLTB4NTMxMDJiLCAweDEwNDAwMDM2LCAweDAsIDB4OGY4MzAwZTQsCi0weDhmODIwMGUwLCAweDEwNjIwMDAzLCAweDI0NjMwMDA4LCAweGFmODMwMGU0LAotMHhhZjgzMDBlOCwgMHg4ZWU0MDBjMCwgMHg4ZWU1MDBjNCwgMHgyNjAxODIxLAotMHgxMDIxLCAweGEzMjgyMSwgMHhhMzMwMmIsIDB4ODIyMDIxLAotMHg4NjIwMjEsIDB4YWVlNDAwYzAsIDB4YWVlNTAwYzQsIDB4OGVlMjAwNTgsCi0weDI0NDIwMDAxLCAweGFlZTIwMDU4LCAweDhlZTIwMDU4LCAweDhlZTIwMDdjLAotMHgyNDQyMDAwMSwgMHhhZWUyMDA3YywgMHg4ZWUyMDA3YywgMHg4ZjgyMDBlMCwKLTB4YWZhMjAwMTAsIDB4OGY4MjAwZTQsIDB4M2MwNDAwMDEsIDB4MjQ4NDU4YzAsCi0weGFmYTIwMDE0LCAweDhmYTYwMDE4LCAweDhmYTcwMDFjLCAweDNjMDUwMDA2LAotMHhjMDAyNDAzLCAweDM0YTVmMjAzLCAweDgwMDNjNWIsIDB4MCwKLTB4OGVlMjUyNDAsIDB4YWZhMjAwMTAsIDB4OGVlMjUyNDQsIDB4M2MwNDAwMDEsCi0weDI0ODQ1OGNjLCAweGFmYTIwMDE0LCAweDhlZTYwZTEwLCAweDhlZTcwZTE4LAotMHgzYzA1MDAwNiwgMHhjMDAyNDAzLCAweDM0YTVmMjAyLCAweDhlZTIwMWMwLAotMHgyNDQyMDAwMSwgMHhhZWUyMDFjMCwgMHg4MDAzYzAyLCAweDhlZTIwMWMwLAotMHg5NmUyMDQ2OCwgMHg1MzEwMmIsIDB4NTQ0MDAwMDEsIDB4M2MxNjgwMDAsCi0weDEyNjAwMWNiLCAweDNjMGUwMDFmLCAweDM1Y2VmZmZmLCAweDNjMGZmZmY1LAotMHgzNWVmMTAwMCwgMHgyNDFlMDA0MCwgMHg4ZWUyNzI0YywgMHg4ZjQzMDI4MCwKLTB4MjQ0MjAwMDEsIDB4MzA0MjA3ZmYsIDB4MTA2MjAxOWUsIDB4MCwKLTB4MTJjMDAwMTIsIDB4MCwgMHg4ZWUzNTI0MCwgMHg4ZWUyNTI0NCwKLTB4MTA2MjAwMGEsIDB4MjZmODUyNDQsIDB4OGVmNDUyNDQsIDB4YWZiODAwMjQsCi0weDhlZTM1MjQ0LCAweDIxMTQwLCAweDI0NDI1MjQ4LCAweDJlMjg4MjEsCi0weDI0NjMwMDAxLCAweDgwMDNhODUsIDB4MzA2ZDAwZmYsIDB4OGVlMjAxZTAsCi0weDI0NDIwMDAxLCAweGFlZTIwMWUwLCAweDhlZTIwMWUwLCAweDhlZTMwZTEwLAotMHg4ZWUyMGUxOCwgMHgxMDYyZmZjYSwgMHgyNmY4MGUxOCwgMHg4ZWY0MGUxOCwKLTB4YjAyMSwgMHhhZmI4MDAyNCwgMHg4ZWUzMGUxOCwgMHgyMTE0MCwKLTB4MjQ0MjBlMjAsIDB4MmUyODgyMSwgMHgyNDYzMDAwMSwgMHgzMDZkMDFmZiwKLTB4OTZlMjA0NmEsIDB4MzA0MjAwMTAsIDB4MTA0MDAwMTgsIDB4MzQwMjgxMDAsCi0weDk2NDMwMDBjLCAweDE0NjIwMDE1LCAweDAsIDB4M2MwMjAwMDEsCi0weDU3MTAyMSwgMHg5MDQyODNjMCwgMHgxNDQwMDAxMCwgMHgwLAotMHg5NjQyMDAwZSwgMHhhNjIyMDAxNiwgMHg4ZTQyMDAwOCwgMHg4ZTQzMDAwNCwKLTB4OGU0NDAwMDAsIDB4MjY3M2ZmZmMsIDB4YWU0MjAwMGMsIDB4YWU0MzAwMDgsCi0weGFlNDQwMDA0LCAweDk2MjIwMDBlLCAweDI2MTAwMDA0LCAweDI0MTgwMDAxLAotMHhhM2I4MDAyZiwgMHgzNDQyMDIwMCwgMHhhNjIyMDAwZSwgMHg4ZTIyMDAwMCwKLTB4OGUyMzAwMDQsIDB4M2MwNDAwMDEsIDB4MzQ4NDM4MDAsIDB4MjAwMzAyMSwKLTB4MzA2YTAwMDcsIDB4MjBhODAyMywgMHgzNjQxMDIxLCAweDIwMjEwMmIsCi0weDEwNDAwMDA1LCAweDI2YTk4MjEsIDB4MjA0MTAyMywgMHgzNjIxODIzLAotMHgzYzAyMDAyMCwgMHg0MzgwMjMsIDB4MjY2MjAwMDcsIDB4OTYyMzAwMGEsCi0weDI0MThmZmY4LCAweDU4YzgyNCwgMHg2YTE4MjEsIDB4NzkxMDJiLAotMHgxMDQwMDAwMiwgMHgzMjA2MDIxLCAweDYwNjAyMSwgMHgxODAxODIxLAotMHgyNDYyMDAwNywgMHgyNDE4ZmZmOCwgMHg1ODYwMjQsIDB4MjZjMTAyYiwKLTB4MTQ0MDAwMDQsIDB4MTkzMjgyMywgMHgxODMyODIzLCAweDgwMDNhYzMsCi0weGMzMTAyMSwgMHhkMzEwMjEsIDB4NGEyMDIzLCAweDFjNDEwMmIsCi0weDU0NDAwMDAxLCAweDhmMjAyMSwgMHgyNTQyMDA0MCwgMHg0YzEwMmIsCi0weDE0NDAwMDM1LCAweDU4MjEsIDB4OTRjMzAwMGMsIDB4MjQwMjA4MDAsCi0weDU0NjIwMDMyLCAweGFlMjYwMDE4LCAweDNjMDIwMDAxLCAweDU3MTAyMSwKLTB4OTA0MjgzYzAsIDB4NTQ0MDAwMmQsIDB4YWUyNjAwMTgsIDB4MjRjMjAwMTcsCi0weDFjMjEwMmIsIDB4MTA0MDAwMTMsIDB4MCwgMHgzYzAyZmZmNSwKLTB4NDYxMDIxLCAweDkwNDIxMDE3LCAweDM4NDMwMDA2LCAweDJjNjMwMDAxLAotMHgzODQyMDAxMSwgMHgyYzQyMDAwMSwgMHg2MjE4MjUsIDB4MTA2MDAwMTQsCi0weDI0YzIwMDEwLCAweDFjMjEwMmIsIDB4MTA0MDAwMGUsIDB4MCwKLTB4M2MwYmZmZjUsIDB4MTY2NTgyMSwgMHg5NTZiMTAxMCwgMHg4MDAzYWY0LAotMHgyNTYyMDAwZSwgMHg5MGMyMDAxNywgMHgzODQzMDAwNiwgMHgyYzYzMDAwMSwKLTB4Mzg0MjAwMTEsIDB4MmM0MjAwMDEsIDB4NjIxODI1LCAweDEwNjAwMDA1LAotMHgxNjAxODIxLCAweDk0Y2IwMDEwLCAweDI1NjIwMDBlLCAweDRhNTgyMSwKLTB4MTYwMTgyMSwgMHgyNDYyMDAwNywgMHgyNDE4ZmZmOCwgMHg1ODU4MjQsCi0weGMzMTAyMSwgMHg0YTIwMjMsIDB4MWM0MTAyYiwgMHgxMDQwMDAwMiwKLTB4MTYzMjgyMywgMHg4ZjIwMjEsIDB4YWUyNjAwMTgsIDB4M2MwMjAwMDEsCi0weDU3MTAyMSwgMHg5MDQyODNjMCwgMHgyMTAyYiwgMHgyMTZjMCwKLTB4MTU2MDAwMDIsIDB4YWZhMjAwNDQsIDB4MTgwNTgyMSwgMHgzMDgyMDAwMSwKLTB4MTA0MDAwMDcsIDB4NDAyMSwgMHg5MDg4MDAwMCwgMHgyNDg0MDAwMSwKLTB4MWM0MTAyYiwgMHgxMDQwMDAwMiwgMHgyNGE1ZmZmZiwgMHg4ZjIwMjEsCi0weDUwYTAwMDEyLCAweDgxYzAyLCAweDJjYTIwMDAyLCAweDU0NDAwMDA5LAotMHgyNGE1ZmZmZiwgMHg5NDgyMDAwMCwgMHgyNDg0MDAwMiwgMHgxMDI0MDIxLAotMHgxYzQxMDJiLCAweDEwNDAwMDA2LCAweDI0YTVmZmZlLCAweDgwMDNiMjEsCi0weDhmMjAyMSwgMHg5MDgyMDAwMCwgMHgyMTIwMCwgMHgxMDI0MDIxLAotMHgxNGEwZmZmMiwgMHgyY2EyMDAwMiwgMHg4MWMwMiwgMHgzMTAyZmZmZiwKLTB4NjI0MDIxLCAweDMxMDhmZmZmLCAweDE0MDI4MjEsIDB4MTE0MDAwMTEsCi0weDIwMDIwMjEsIDB4MmNhMjAwMDIsIDB4NTQ0MDAwMDksIDB4MjRhNWZmZmYsCi0weDk0ODIwMDAwLCAweDI0ODQwMDAyLCAweDEwMjQwMjEsIDB4MWM0MTAyYiwKLTB4MTA0MDAwMDYsIDB4MjRhNWZmZmUsIDB4ODAwM2IzOCwgMHg4ZjIwMjEsCi0weDkwODIwMDAwLCAweDIxMjAwLCAweDEwMjQwMjEsIDB4MTRhMGZmZjIsCi0weDJjYTIwMDAyLCAweDgxYzAyLCAweDMxMDJmZmZmLCAweDYyNDAyMSwKLTB4ODFjMDIsIDB4MzEwMmZmZmYsIDB4OGY4OTAxMjAsIDB4NjI0MDIxLAotMHgyNzYyMzgwMCwgMHgyNTIzMDAyMCwgMHg2MjEwMmIsIDB4MTQ0MDAwMDIsCi0weDMxMDhmZmZmLCAweDI3NjMzMDAwLCAweDhmODIwMTI4LCAweDEwNjIwMDA0LAotMHgwLCAweDhmODIwMTI0LCAweDE0NjIwMDA3LCAweDE0MDI4MjEsCi0weDhlZTIwMWE0LCAweDM4MjEsIDB4MjQ0MjAwMDEsIDB4YWVlMjAxYTQsCi0weDgwMDNiYzksIDB4OGVlMjAxYTQsIDB4OGUyNjAwMDAsIDB4OGUyNzAwMDQsCi0weDgxNDAwLCAweDM0NDgwMDBiLCAweGFkMzAwMDA4LCAweGE1MmIwMDBlLAotMHhhZDI4MDAxOCwgMHg4ZmI4MDA0NCwgMHgyMDIxLCAweDI5NjEwMjUsCi0weDU4MTAyNSwgMHhhZDIyMDAxYywgMHhlNTEwMmIsIDB4ZTUzODIzLAotMHhjNDMwMjMsIDB4YzIzMDIzLCAweGFkMjYwMDAwLCAweGFkMjcwMDA0LAotMHg4ZWUyMDRjMCwgMHhhZDIyMDAxMCwgMHhhZjgzMDEyMCwgMHg5MmUyNGUyMCwKLTB4MTQ0MDAwNWYsIDB4MjQwNzAwMDEsIDB4MjUwMmZmZWUsIDB4MmM0MjAwMDIsCi0weDE0NDAwMDAzLCAweDI0MDIwMDExLCAweDE1MDIwMDI0LCAweDAsCi0weDhlZTI0ZTMwLCAweDIxMGMwLCAweDI0NDI1MDM4LCAweDJlMjIwMjEsCi0weDhjODMwMDAwLCAweDI0MDIwMDEyLCAweDE0NjIwMDBmLCAweDAsCi0weDhlZTM0ZTMwLCAweDhlZTI0ZTM0LCAweDEwNjIwMDBiLCAweDAsCi0weDhjODIwMDA0LCAweDI0NDIwMDAxLCAweGFjODIwMDA0LCAweDhlZTI0ZTM0LAotMHg4ZWUzNGUzMCwgMHgyNDQyMDAwMSwgMHgxMDVlMDAyYSwgMHgwLAotMHg4MDAzYmE4LCAweDAsIDB4OGVlMjRlMzAsIDB4MjQ0MjAwMDEsCi0weDUwNWUwMDAzLCAweDEwMjEsIDB4OGVlMjRlMzAsIDB4MjQ0MjAwMDEsCi0weGFlZTI0ZTMwLCAweDhlZTI0ZTMwLCAweDIxMGMwLCAweDI0NDI1MDM4LAotMHgyZTIyMDIxLCAweDgwMDNiYzYsIDB4MjQwMjAwMTIsIDB4OGVlMjRlMzAsCi0weDIxMGMwLCAweDI0NDI1MDM4LCAweDJlMjIwMjEsIDB4OGM4MzAwMDAsCi0weDI0MDIwMDA3LCAweDE0NjIwMDFmLCAweDAsIDB4OGVlMzRlMzAsCi0weDhlZTI0ZTM0LCAweDEwNjIwMDFiLCAweDAsIDB4OGM4MjAwMDQsCi0weDI0NDIwMDAxLCAweGFjODIwMDA0LCAweDhlZTI0ZTM0LCAweDhlZTM0ZTMwLAotMHgyNDQyMDAwMSwgMHgxMDVlMDAwNywgMHgwLCAweDhlZTI0ZTM0LAotMHgyNDQyMDAwMSwgMHgxMDYyMDAwNSwgMHgwLCAweDgwMDNiYjQsCi0weDAsIDB4MTQ2MDAwMDUsIDB4MCwgMHg4ZjgyMDEyOCwKLTB4MjQ0MjAwMjAsIDB4YWY4MjAxMjgsIDB4OGY4MjAxMjgsIDB4OGM4MjAwMDQsCi0weDJjNDIwMDExLCAweDUwNDAwMDEyLCAweGFjODAwMDAwLCAweDgwMDNiYzksCi0weDAsIDB4OGVlMjRlMzAsIDB4MjQ0MjAwMDEsIDB4NTA1ZTAwMDMsCi0weDEwMjEsIDB4OGVlMjRlMzAsIDB4MjQ0MjAwMDEsIDB4YWVlMjRlMzAsCi0weDhlZTI0ZTMwLCAweDIxMGMwLCAweDI0NDI1MDM4LCAweDJlMjIwMjEsCi0weDI0MDIwMDA3LCAweGFjODIwMDAwLCAweDI0MDIwMDAxLCAweGFjODIwMDA0LAotMHgxNGUwMDAxOSwgMHgzYzA1MDAwNiwgMHgzYzA0MDAwMSwgMHgyNDg0NTg5MCwKLTB4OGUyMjAwMTgsIDB4MzRhNWYyMDksIDB4YWZhMjAwMTAsIDB4OGUyMjAwMDAsCi0weDhlMjMwMDA0LCAweDIyMDMwMjEsIDB4MTYwMzgyMSwgMHhjMDAyNDAzLAotMHhhZmEzMDAxNCwgMHg5M2EyMDAyZiwgMHgxMDQwMDAyYSwgMHgzNDAyODEwMCwKLTB4OGU0MzAwMDQsIDB4OGU0NDAwMDgsIDB4OGU0NTAwMGMsIDB4YTY0MjAwMGMsCi0weGFlNDMwMDAwLCAweGFlNDQwMDA0LCAweGFlNDUwMDA4LCAweDk2MjIwMDE2LAotMHg4MDAzYzAyLCAweGE2NDIwMDBlLCAweDE1OTkwMDBhLCAweDI2YTE4MjMsCi0weDk2MjIwMDBlLCAweGE2MjMwMDBhLCAweDM0NDIwMDA0LCAweGE2MjIwMDBlLAotMHgzYzAxMDAwMSwgMHgzNzA4MjEsIDB4YTAyMDgzYzAsIDB4ODAwM2JmZiwKLTB4OTgyMSwgMHg5NjI0MDAwYSwgMHg4MzEwMmIsIDB4NTQ0MDAwMDEsCi0weDgwMTgyMSwgMHgyNDAyMDAwMSwgMHhhNjIzMDAwYSwgMHgzYzAxMDAwMSwKLTB4MzcwODIxLCAweGEwMjI4M2MwLCAweDk2MjIwMDBhLCAweDRhMTgyMSwKLTB4MjAzODAyMSwgMHgxZDAxMDJiLCAweDU0NDAwMDAxLCAweDIwZjgwMjEsCi0weDI2Mzk4MjMsIDB4YjAyMSwgMHg4ZmI4MDAyNCwgMHgxNjYwZmU1ZSwKLTB4YWYwZDAwMDAsIDB4MTI2MDAwMjIsIDB4MCwgMHgzYzAxMDAwMSwKLTB4MzcwODIxLCAweGFjMzM4M2M0LCAweDNjMDEwMDAxLCAweDM3MDgyMSwKLTB4YWMzMDgzYzgsIDB4M2MwMTAwMDEsIDB4MzcwODIxLCAweGFjMzI4M2NjLAotMHg5M2EyMDAyZiwgMHgxMDQwMDAwOCwgMHgwLCAweDNjMDIwMDAxLAotMHg1NzEwMjEsIDB4OGM0MjgzY2MsIDB4MjQ0MjAwMDQsIDB4M2MwMTAwMDEsCi0weDM3MDgyMSwgMHhhYzIyODNjYywgMHg4ZjQzMDI4MCwgMHg4ZWUyNzI0YywKLTB4MTQ2MjAwMDYsIDB4MCwgMHg4ZWUyMDFjNCwgMHgyNDQyMDAwMSwKLTB4YWVlMjAxYzQsIDB4ODAwM2M1YiwgMHg4ZWUyMDFjNCwgMHg4ZWUyMDFiYywKLTB4MjQ0MjAwMDEsIDB4YWVlMjAxYmMsIDB4ODAwM2M1YiwgMHg4ZWUyMDFiYywKLTB4OTdhNDAwMWUsIDB4MjQ4NGZmZmMsIDB4ODAxODIxLCAweDhlZTQwMGMwLAotMHg4ZWU1MDBjNCwgMHgxMDIxLCAweGEzMjgyMSwgMHhhMzMwMmIsCi0weDgyMjAyMSwgMHg4NjIwMjEsIDB4MjQwMjAwMDIsIDB4YWVlNDAwYzAsCi0weGFlZTUwMGM0LCAweDEyYTIwMDBmLCAweDJhYTIwMDAzLCAweDE0NDAwMDE3LAotMHgyNDAyMDAwMywgMHgxNmEyMDAxNSwgMHgwLCAweDhlZTIwMGQwLAotMHg4ZWUzMDBkNCwgMHgyNDYzMDAwMSwgMHgyYzY0MDAwMSwgMHg0NDEwMjEsCi0weGFlZTIwMGQwLCAweGFlZTMwMGQ0LCAweDhlZTIwMGQwLCAweDgwMDNjNTUsCi0weDhlZTMwMGQ0LCAweDhlZTIwMGQ4LCAweDhlZTMwMGRjLCAweDI0NjMwMDAxLAotMHgyYzY0MDAwMSwgMHg0NDEwMjEsIDB4YWVlMjAwZDgsIDB4YWVlMzAwZGMsCi0weDhlZTIwMGQ4LCAweDgwMDNjNTUsIDB4OGVlMzAwZGMsIDB4OGVlMjAwYzgsCi0weDhlZTMwMGNjLCAweDI0NjMwMDAxLCAweDJjNjQwMDAxLCAweDQ0MTAyMSwKLTB4YWVlMjAwYzgsIDB4YWVlMzAwY2MsIDB4OGVlMjAwYzgsIDB4OGVlMzAwY2MsCi0weDhmODMwMGU0LCAweDhmODIwMGUwLCAweDEwNjIwMDAzLCAweDI0NjMwMDA4LAotMHhhZjgzMDBlNCwgMHhhZjgzMDBlOCwgMHg4ZmJmMDA2OCwgMHg4ZmJlMDA2NCwKLTB4OGZiNjAwNjAsIDB4OGZiNTAwNWMsIDB4OGZiNDAwNTgsIDB4OGZiMzAwNTQsCi0weDhmYjIwMDUwLCAweDhmYjEwMDRjLCAweDhmYjAwMDQ4LCAweDNlMDAwMDgsCi0weDI3YmQwMDcwLCAweDI3YmRmZmUwLCAweGFmYmYwMDE4LCAweDhlZTMwZTE0LAotMHg4ZWUyMGUwYywgMHgxMDYyMDA3NCwgMHgwLCAweDhlZTMwZTBjLAotMHg4ZWUyMGUxNCwgMHg2MjIwMjMsIDB4NDgyMDAwMSwgMHgyNDg0MDIwMCwKLTB4OGVlMzBlMTgsIDB4OGVlMjBlMTQsIDB4NDMxMDJiLCAweDE0NDAwMDA0LAotMHgyNDAyMDIwMCwgMHg4ZWUzMGUxNCwgMHg4MDAzYzdkLCAweDQzMTgyMywKLTB4OGVlMjBlMTgsIDB4OGVlMzBlMTQsIDB4NDMxMDIzLCAweDI0NDNmZmZmLAotMHg4MDQ4MjEsIDB4NjkxMDJhLCAweDU0NDAwMDAxLCAweDYwNDgyMSwKLTB4OGY4NzAxMDAsIDB4Mjc2MjMwMDAsIDB4MjRlODAwMjAsIDB4MTAyMTAyYiwKLTB4NTA0MDAwMDEsIDB4Mjc2ODI4MDAsIDB4OGY4MjAxMDgsIDB4MTEwMjAwMDQsCi0weDAsIDB4OGY4MjAxMDQsIDB4MTUwMjAwMDcsIDB4MTAyMSwKLTB4OGVlMjAxYTgsIDB4MjAyMSwgMHgyNDQyMDAwMSwgMHhhZWUyMDFhOCwKLTB4ODAwM2NiZiwgMHg4ZWUyMDFhOCwgMHg4ZWU0MGUxNCwgMHg0MjE0MCwKLTB4ODAxODIxLCAweDhlZTQwNDYwLCAweDhlZTUwNDY0LCAweGEzMjgyMSwKLTB4YTMzMDJiLCAweDgyMjAyMSwgMHg4NjIwMjEsIDB4YWNlNDAwMDAsCi0weGFjZTUwMDA0LCAweDhlZTMwZTE0LCAweDkxMTQwLCAweGE0ZTIwMDBlLAotMHgyNDAyMDAwMiwgMHhhY2UyMDAxOCwgMHgzMTk0MCwgMHgyNDYzMGUyMCwKLTB4MmUzMTAyMSwgMHhhY2UyMDAwOCwgMHg4ZWUyMGUxNCwgMHhhY2UyMDAxYywKLTB4OGVlMjA0Y2MsIDB4YWNlMjAwMTAsIDB4YWY4ODAxMDAsIDB4OTJlMjA0ZWMsCi0weDE0NDAwMDExLCAweDI0MDQwMDAxLCAweDhlZTI0ZTI4LCAweDI0MDMwMDQwLAotMHgyNDQyMDAwMSwgMHg1MDQzMDAwMywgMHgxMDIxLCAweDhlZTI0ZTI4LAotMHgyNDQyMDAwMSwgMHhhZWUyNGUyOCwgMHg4ZWUyNGUyOCwgMHgyMTBjMCwKLTB4MjQ0MjRlMzgsIDB4MmUyMTgyMSwgMHgyNDAyMDAwMiwgMHhhYzYyMDAwMCwKLTB4MjQwMjAwMDEsIDB4YWM2MjAwMDQsIDB4MTQ4MDAwMGUsIDB4MjQwMzAwNDAsCi0weDhlZTIwZTE0LCAweGFmYTIwMDEwLCAweDhlZTIwZTE4LCAweDNjMDUwMDA3LAotMHhhZmEyMDAxNCwgMHg4ZWU2MGUwYywgMHg4ZWU3MGUxMCwgMHgzYzA0MDAwMSwKLTB4MjQ4NDU4ZDQsIDB4YzAwMjQwMywgMHgzNGE1ZjAwMSwgMHg4MDAzY2RkLAotMHgwLCAweDhlZTIwNTAwLCAweDI0NDIwMDAxLCAweDUwNDMwMDAzLAotMHgxMDIxLCAweDhlZTIwNTAwLCAweDI0NDIwMDAxLCAweGFlZTIwNTAwLAotMHg4ZWUyMDUwMCwgMHgyMTA4MCwgMHg1NzEwMjEsIDB4YWM0OTA1MDgsCi0weDhlZTIwZTE0LCAweDQ5MTAyMSwgMHgzMDQyMDFmZiwgMHhhZWUyMGUxNCwKLTB4OGVlMzBlMTQsIDB4OGVlMjBlMGMsIDB4MTQ2MjAwMDUsIDB4MCwKLTB4OGY4MjAwNjAsIDB4MjQwM2ZkZmYsIDB4NDMxMDI0LCAweGFmODIwMDYwLAotMHg4ZmJmMDAxOCwgMHgzZTAwMDA4LCAweDI3YmQwMDIwLCAweDI3YmRmZmUwLAotMHhhZmJmMDAxOCwgMHg4ZWUzNTIzYywgMHg4ZWUyNTIzOCwgMHgxMDYyMDA3NCwKLTB4MCwgMHg4ZWUzNTIzOCwgMHg4ZWUyNTIzYywgMHg2MjIwMjMsCi0weDQ4MjAwMDEsIDB4MjQ4NDAxMDAsIDB4OGVlMzUyNDQsIDB4OGVlMjUyM2MsCi0weDQzMTAyYiwgMHgxNDQwMDAwNCwgMHgyNDAyMDEwMCwgMHg4ZWUzNTIzYywKLTB4ODAwM2NmZiwgMHg0MzE4MjMsIDB4OGVlMjUyNDQsIDB4OGVlMzUyM2MsCi0weDQzMTAyMywgMHgyNDQzZmZmZiwgMHg4MDQ4MjEsIDB4NjkxMDJhLAotMHg1NDQwMDAwMSwgMHg2MDQ4MjEsIDB4OGY4NzAxMDAsIDB4Mjc2MjMwMDAsCi0weDI0ZTgwMDIwLCAweDEwMjEwMmIsIDB4NTA0MDAwMDEsIDB4Mjc2ODI4MDAsCi0weDhmODIwMTA4LCAweDExMDIwMDA0LCAweDAsIDB4OGY4MjAxMDQsCi0weDE1MDIwMDA3LCAweDEwMjEsIDB4OGVlMjAxYTgsIDB4MjAyMSwKLTB4MjQ0MjAwMDEsIDB4YWVlMjAxYTgsIDB4ODAwM2Q0MSwgMHg4ZWUyMDFhOCwKLTB4OGVlNDUyM2MsIDB4NDIxNDAsIDB4ODAxODIxLCAweDhlZTQwNDcwLAotMHg4ZWU1MDQ3NCwgMHhhMzI4MjEsIDB4YTMzMDJiLCAweDgyMjAyMSwKLTB4ODYyMDIxLCAweGFjZTQwMDAwLCAweGFjZTUwMDA0LCAweDhlZTM1MjNjLAotMHg5MTE0MCwgMHhhNGUyMDAwZSwgMHgyNDAyMDAwMywgMHhhY2UyMDAxOCwKLTB4MzE5NDAsIDB4MjQ2MzUyNDgsIDB4MmUzMTAyMSwgMHhhY2UyMDAwOCwKLTB4OGVlMjUyM2MsIDB4YWNlMjAwMWMsIDB4OGVlMjA0Y2MsIDB4YWNlMjAwMTAsCi0weGFmODgwMTAwLCAweDkyZTIwNGVjLCAweDE0NDAwMDExLCAweDI0MDQwMDAxLAotMHg4ZWUyNGUyOCwgMHgyNDAzMDA0MCwgMHgyNDQyMDAwMSwgMHg1MDQzMDAwMywKLTB4MTAyMSwgMHg4ZWUyNGUyOCwgMHgyNDQyMDAwMSwgMHhhZWUyNGUyOCwKLTB4OGVlMjRlMjgsIDB4MjEwYzAsIDB4MjQ0MjRlMzgsIDB4MmUyMTgyMSwKLTB4MjQwMjAwMDMsIDB4YWM2MjAwMDAsIDB4MjQwMjAwMDEsIDB4YWM2MjAwMDQsCi0weDE0ODAwMDBlLCAweDI0MDMwMDQwLCAweDhlZTI1MjNjLCAweGFmYTIwMDEwLAotMHg4ZWUyNTI0NCwgMHgzYzA1MDAwNywgMHhhZmEyMDAxNCwgMHg4ZWU2NTIzOCwKLTB4OGVlNzUyNDAsIDB4M2MwNDAwMDEsIDB4MjQ4NDU4ZTAsIDB4YzAwMjQwMywKLTB4MzRhNWYwMTAsIDB4ODAwM2Q1ZiwgMHgwLCAweDhlZTIwNTAwLAotMHgyNDQyMDAwMSwgMHg1MDQzMDAwMywgMHgxMDIxLCAweDhlZTIwNTAwLAotMHgyNDQyMDAwMSwgMHhhZWUyMDUwMCwgMHg4ZWUyMDUwMCwgMHgyMTA4MCwKLTB4NTcxMDIxLCAweGFjNDkwNTA4LCAweDhlZTI1MjNjLCAweDQ5MTAyMSwKLTB4MzA0MjAwZmYsIDB4YWVlMjUyM2MsIDB4OGVlMzUyM2MsIDB4OGVlMjUyMzgsCi0weDE0NjIwMDA1LCAweDAsIDB4OGY4MjAwNjAsIDB4MjQwM2ZlZmYsCi0weDQzMTAyNCwgMHhhZjgyMDA2MCwgMHg4ZmJmMDAxOCwgMHgzZTAwMDA4LAotMHgyN2JkMDAyMCwgMHg4ZjgyMDEyMCwgMHg4ZWUzNGUzNCwgMHg4ZjgyMDEyNCwKLTB4OGY4NjAxMjgsIDB4MjQwMjAwNDAsIDB4MjQ2MzAwMDEsIDB4NTA2MjAwMDMsCi0weDEwMjEsIDB4OGVlMjRlMzQsIDB4MjQ0MjAwMDEsIDB4YWVlMjRlMzQsCi0weDhlZTI0ZTM0LCAweDhlZTQ0ZTM0LCAweDhlZTM0ZTMwLCAweDIxMGMwLAotMHgyNDQyNTAzOCwgMHgxNDgzMDAwNywgMHgyZTIyODIxLCAweDhmODIwMTI4LAotMHgyNDQyMDAyMCwgMHhhZjgyMDEyOCwgMHg4ZjgyMDEyOCwgMHg4MDAzZDkyLAotMHhhY2EwMDAwMCwgMHg4ZWUyNGUzNCwgMHgyNDAzMDA0MCwgMHgyNDQyMDAwMSwKLTB4NTA0MzAwMDMsIDB4MTAyMSwgMHg4ZWUyNGUzNCwgMHgyNDQyMDAwMSwKLTB4MjEwYzAsIDB4MjQ0MjUwMzgsIDB4MmUyMjgyMSwgMHg4Y2EyMDAwNCwKLTB4OGY4MzAxMjgsIDB4MjExNDAsIDB4NjIxODIxLCAweGFmODMwMTI4LAotMHhhY2EwMDAwMCwgMHg4Y2MyMDAxOCwgMHgyNDQzZmZmZSwgMHgyYzYyMDAxMiwKLTB4MTA0MDAwMDgsIDB4MzEwODAsIDB4M2MwMTAwMDEsIDB4MjIwODIxLAotMHg4YzIyNThmMCwgMHg0MDAwMDgsIDB4MCwgMHgyNDAyMDAwMSwKLTB4YWVlMjRlMjQsIDB4M2UwMDAwOCwgMHgwLCAweDI3YmRmZmM4LAotMHhhZmJmMDAzMCwgMHhhZmI1MDAyYywgMHhhZmI0MDAyOCwgMHhhZmIzMDAyNCwKLTB4YWZiMjAwMjAsIDB4YWZiMTAwMWMsIDB4YWZiMDAwMTgsIDB4OGY4MzAxMjgsCi0weDhmODIwMTI0LCAweDEwNjIwMmIwLCAweDk4MjEsIDB4M2MxMTAwMWYsCi0weDM2MzFmZmZmLCAweDNjMTJmZmY1LCAweDM2NTIxMDAwLCAweDI0MTUwMDEyLAotMHgyNDE0MDA0MCwgMHg4ZjhjMDEyOCwgMHg4ZjgyMDEyOCwgMHgyNDQyMDAyMCwKLTB4YWY4MjAxMjgsIDB4OTE4MjAwMWIsIDB4OGY4MzAxMjgsIDB4MjQ0M2ZmZmUsCi0weDJjNjIwMDEyLCAweDEwNDAwMjljLCAweDMxMDgwLCAweDNjMDEwMDAxLAotMHgyMjA4MjEsIDB4OGMyMjU5NDgsIDB4NDAwMDA4LCAweDAsCi0weDhmNDIwMjE4LCAweDMwNDIwMTAwLCAweDEwNDAwMDA3LCAweDAsCi0weDk1ODMwMDE2LCAweDk1ODIwMDE4LCAweDYyMTgyMywgMHgzMTQwMiwKLTB4NDMxMDIxLCAweGE1ODIwMDE2LCAweDhkODIwMDFjLCAweDNjMDM4MDAwLAotMHgzMDQ0ZmZmZiwgMHg0MzY4MjQsIDB4M2MwMzA4MDAsIDB4NDMxODI0LAotMHgxMWEwMDAwNCwgMHhhZDg0MDAxYywgMHg0MTE0MCwgMHg4MDAzZGQ4LAotMHgyNDQyNTI0OCwgMHg0MTE0MCwgMHgyNDQyMGUyMCwgMHgyZTI1ODIxLAotMHg5NTYyMDAwZSwgMHgzMDQyZmZmYywgMHgxMDYwMDAwNCwgMHhhNTYyMDAwZSwKLTB4OTU4NDAwMTYsIDB4ODAwM2VjMCwgMHgwLCAweDhkNjkwMDE4LAotMHg0MDIxLCAweDk1MmEwMDAwLCAweDI1MjkwMDAyLCAweDk1MjcwMDAwLAotMHgyNTI5MDAwMiwgMHg5NTI2MDAwMCwgMHgyNTI5MDAwMiwgMHg5NTI1MDAwMCwKLTB4MjUyOTAwMDIsIDB4OTUyNDAwMDAsIDB4MjUyOTAwMDIsIDB4OTUyMzAwMDAsCi0weDI1MjkwMDAyLCAweDk1MjIwMDAwLCAweDI1MjkwMDAyLCAweDE0NzUwMjEsCi0weDE0NjUwMjEsIDB4MTQ1NTAyMSwgMHgxNDQ1MDIxLCAweDE0MzUwMjEsCi0weDE0MjUwMjEsIDB4YTFjMDIsIDB4MzE0MmZmZmYsIDB4NjI1MDIxLAotMHhhMWMwMiwgMHgzMTQyZmZmZiwgMHg2MjUwMjEsIDB4OTZlMjA0NmEsCi0weDMxNGVmZmZmLCAweDMwNDIwMDAyLCAweDEwNDAwMDQ0LCAweDUwMjEsCi0weDI1MjIwMDE0LCAweDIyMjEwMmIsIDB4MTA0MDAwMTQsIDB4MTIwMTgyMSwKLTB4MjQwNTAwMGEsIDB4MjAyMSwgMHgyMjMxMDJiLCAweDU0NDAwMDAxLAotMHg3MjE4MjEsIDB4OTQ2MjAwMDAsIDB4MjQ2MzAwMDIsIDB4MjRhNWZmZmYsCi0weDE0YTBmZmY5LCAweDgyMjAyMSwgMHg0MWMwMiwgMHgzMDgyZmZmZiwKLTB4NjIyMDIxLCAweDQxNDAyLCAweDMwODNmZmZmLCAweDQzMTAyMSwKLTB4MzA0MmZmZmYsIDB4ODAwM2UzMywgMHgxNDI1MDIxLCAweDk1MmEwMDAwLAotMHgyNTI5MDAwMiwgMHg5NTI4MDAwMCwgMHgyNTI5MDAwMiwgMHg5NTI3MDAwMCwKLTB4MjUyOTAwMDIsIDB4OTUyNjAwMDAsIDB4MjUyOTAwMDIsIDB4OTUyNTAwMDAsCi0weDI1MjkwMDAyLCAweDk1MjMwMDAwLCAweDI1MjkwMDAyLCAweDk1MjIwMDAwLAotMHgyNTI5MDAwMiwgMHg5NTI0MDAwMCwgMHgyNTI5MDAwMiwgMHgxNDg1MDIxLAotMHgxNDc1MDIxLCAweDE0NjUwMjEsIDB4MTQ1NTAyMSwgMHgxNDM1MDIxLAotMHgxNDI1MDIxLCAweDk1MjIwMDAwLCAweDk1MjMwMDAyLCAweDE0NDUwMjEsCi0weDE0MjUwMjEsIDB4MTQzNTAyMSwgMHhhMWMwMiwgMHgzMTQyZmZmZiwKLTB4NjI1MDIxLCAweGExYzAyLCAweDMxNDJmZmZmLCAweDYyNTAyMSwKLTB4MzE0OGZmZmYsIDB4NTEwMDAwMDEsIDB4MzQwOGZmZmYsIDB4OGQ2MjAwMTgsCi0weDk0NDMwMDBjLCAweDI0MDIwODAwLCAweDU0NjIwMDA1LCAweGE1NjgwMDEwLAotMHg5NTYyMDAwZSwgMHgzNDQyMDAwMiwgMHhhNTYyMDAwZSwgMHhhNTY4MDAxMCwKLTB4OTZlMjA0NmEsIDB4MjgyMSwgMHgzMDQyMDAwOCwgMHgxNDQwMDA1NiwKLTB4MzAyMSwgMHg4ZDYzMDAxOCwgMHgyNDYyMDAyNCwgMHgyMjIxMDJiLAotMHgxMDQwMDAzNCwgMHgyNDY5MDAxMCwgMHgyMjkxMDJiLCAweDU0NDAwMDAxLAotMHgxMzI0ODIxLCAweDk1MjUwMDAwLCAweDI0NjkwMDE0LCAweDIyOTEwMmIsCi0weDEwNDAwMDAyLCAweDI0YTVmZmVjLCAweDEzMjQ4MjEsIDB4OTUyMjAwMDAsCi0weDMwNDIwZmZmLCAweDE0NDAwMDAzLCAweDI1MjkwMDAyLCAweDgwMDNlNjAsCi0weDI0MTMwMDAxLCAweDk4MjEsIDB4YTAzMDIxLCAweDIyOTEwMmIsCi0weDU0NDAwMDAxLCAweDEzMjQ4MjEsIDB4OTEyMjAwMDEsIDB4MjUyOTAwMDIsCi0weGEyMjgyMSwgMHgyMjkxMDJiLCAweDU0NDAwMDAxLCAweDEzMjQ4MjEsCi0weDI1MjkwMDAyLCAweDIyOTEwMmIsIDB4NTQ0MDAwMDEsIDB4MTMyNDgyMSwKLTB4OTUyMjAwMDAsIDB4MjUyOTAwMDIsIDB4YTIyODIxLCAweDIyOTEwMmIsCi0weDU0NDAwMDAxLCAweDEzMjQ4MjEsIDB4OTUyMjAwMDAsIDB4MjUyOTAwMDIsCi0weGEyMjgyMSwgMHgyMjkxMDJiLCAweDU0NDAwMDAxLCAweDEzMjQ4MjEsCi0weDk1MjIwMDAwLCAweDI1MjkwMDAyLCAweGEyMjgyMSwgMHgyMjkxMDJiLAotMHg1NDQwMDAwMSwgMHgxMzI0ODIxLCAweDk1MjIwMDAwLCAweDgwMDNlOTksCi0weGEyMjgyMSwgMHg5NDY1MDAxMCwgMHg5NDYyMDAxNCwgMHgyNDY5MDAxNiwKLTB4MzA0MjBmZmYsIDB4MTQ0MDAwMDMsIDB4MjRhNWZmZWMsIDB4ODAwM2U4YywKLTB4MjQxMzAwMDEsIDB4OTgyMSwgMHhhMDMwMjEsIDB4OTEyMzAwMDEsCi0weDI1MjkwMDA0LCAweDk1MjIwMDAwLCAweDI1MjkwMDAyLCAweDk1MjQwMDAwLAotMHgyNTI5MDAwMiwgMHhhMzI4MjEsIDB4YTIyODIxLCAweDk1MjIwMDAwLAotMHg5NTIzMDAwMiwgMHhhNDI4MjEsIDB4YTIyODIxLCAweGEzMjgyMSwKLTB4NTFjMDIsIDB4MzBhMmZmZmYsIDB4NjIyODIxLCAweDUxYzAyLAotMHgzMGEyZmZmZiwgMHg2MjI4MjEsIDB4OTZlMjA0NmEsIDB4MzA0MjAwMDEsCi0weDEwNDAwMDFlLCAweDIwMjEsIDB4OTU4MjAwMTYsIDB4NGUyMDIzLAotMHg0MTQwMiwgMHg4MjIwMjEsIDB4MzI2MjAwZmYsIDB4NTA0MDAwMDIsCi0weDg2MjAyMSwgMHg4NTIwMjEsIDB4NDE0MDIsIDB4ODIyMDIxLAotMHgzMDg0ZmZmZiwgMHg1MDgwMDAwMSwgMHgzNDA0ZmZmZiwgMHg4ZDYyMDAxOCwKLTB4MjQ0MzAwMTcsIDB4MjIzMTAyYiwgMHg1NDQwMDAwMSwgMHg3MjE4MjEsCi0weDkwNjIwMDAwLCAweDM4NDMwMDExLCAweDJjNjMwMDAxLCAweDM4NDIwMDA2LAotMHgyYzQyMDAwMSwgMHg2MjE4MjUsIDB4MTA2MDAwMDQsIDB4MCwKLTB4OTU2MjAwMGUsIDB4MzQ0MjAwMDEsIDB4YTU2MjAwMGUsIDB4OTU2MjAwMGUsCi0weDI0MGEwMDAyLCAweDMwNDIwMDA0LCAweDEwNDAwMDAyLCAweGE1NjQwMDEyLAotMHgyNDBhMDAwNCwgMHg4Zjg4MDEyMCwgMHgyNzYyMzgwMCwgMHgyNTA5MDAyMCwKLTB4MTIyMTAyYiwgMHg1MDQwMDAwMSwgMHgyNzY5MzAwMCwgMHg4ZjgyMDEyOCwKLTB4MTEyMjAwMDQsIDB4MCwgMHg4ZjgyMDEyNCwgMHgxNTIyMDAwNywKLTB4MjQwNDAwMjAsIDB4OGVlMjAxYTQsIDB4ODAyMSwgMHgyNDQyMDAwMSwKLTB4YWVlMjAxYTQsIDB4ODAwM2Y0ZiwgMHg4ZWUyMDFhNCwgMHg4ZWU1NzI0YywKLTB4OGVlNjA0OTAsIDB4OGVlNzA0OTQsIDB4YWQwYjAwMDgsIDB4YTUwNDAwMGUsCi0weGFkMGEwMDE4LCAweDUyOTQwLCAweGEwMTgyMSwgMHgxMDIxLAotMHhlMzM4MjEsIDB4ZTMyMDJiLCAweGMyMzAyMSwgMHhjNDMwMjEsCi0weGFkMDYwMDAwLCAweGFkMDcwMDA0LCAweDhlZTI3MjRjLCAweDRkMTAyNSwKLTB4YWQwMjAwMWMsIDB4OGVlMjA0YzQsIDB4YWQwMjAwMTAsIDB4YWY4OTAxMjAsCi0weDkyZTI0ZTIwLCAweDE0NDAwMDYwLCAweDI0MTAwMDAxLCAweDI1NDNmZmVlLAotMHgyYzYzMDAwMiwgMHgzOTQyMDAxMSwgMHgyYzQyMDAwMSwgMHg2MjE4MjUsCi0weDEwNjAwMDI0LCAweDAsIDB4OGVlMjRlMzAsIDB4MjEwYzAsCi0weDI0NDI1MDM4LCAweDJlMjIwMjEsIDB4OGM4MjAwMDAsIDB4MTQ1NTAwMGYsCi0weDAsIDB4OGVlMzRlMzAsIDB4OGVlMjRlMzQsIDB4MTA2MjAwMGIsCi0weDAsIDB4OGM4MjAwMDQsIDB4MjQ0MjAwMDEsIDB4YWM4MjAwMDQsCi0weDhlZTI0ZTM0LCAweDhlZTM0ZTMwLCAweDI0NDIwMDAxLCAweDEwNTQwMDJiLAotMHgwLCAweDgwMDNmMmUsIDB4MCwgMHg4ZWUyNGUzMCwKLTB4MjQ0MjAwMDEsIDB4NTA1NDAwMDMsIDB4MTAyMSwgMHg4ZWUyNGUzMCwKLTB4MjQ0MjAwMDEsIDB4YWVlMjRlMzAsIDB4OGVlMjRlMzAsIDB4MjEwYzAsCi0weDI0NDI1MDM4LCAweDJlMjIwMjEsIDB4MjQwMjAwMDEsIDB4ODAwM2Y0ZSwKLTB4YWM5NTAwMDAsIDB4OGVlMjRlMzAsIDB4MjEwYzAsIDB4MjQ0MjUwMzgsCi0weDJlMjIwMjEsIDB4OGM4MzAwMDAsIDB4MjQwMjAwMDcsIDB4MTQ2MjAwMWYsCi0weDAsIDB4OGVlMzRlMzAsIDB4OGVlMjRlMzQsIDB4MTA2MjAwMWIsCi0weDAsIDB4OGM4MjAwMDQsIDB4MjQ0MjAwMDEsIDB4YWM4MjAwMDQsCi0weDhlZTI0ZTM0LCAweDhlZTM0ZTMwLCAweDI0NDIwMDAxLCAweDEwNTQwMDA3LAotMHgwLCAweDhlZTI0ZTM0LCAweDI0NDIwMDAxLCAweDEwNjIwMDA1LAotMHgwLCAweDgwMDNmM2EsIDB4MCwgMHgxNDYwMDAwNSwKLTB4MCwgMHg4ZjgyMDEyOCwgMHgyNDQyMDAyMCwgMHhhZjgyMDEyOCwKLTB4OGY4MjAxMjgsIDB4OGM4MjAwMDQsIDB4MmM0MjAwMTEsIDB4NTA0MDAwMTIsCi0weGFjODAwMDAwLCAweDgwMDNmNGYsIDB4MCwgMHg4ZWUyNGUzMCwKLTB4MjQ0MjAwMDEsIDB4NTA1NDAwMDMsIDB4MTAyMSwgMHg4ZWUyNGUzMCwKLTB4MjQ0MjAwMDEsIDB4YWVlMjRlMzAsIDB4OGVlMjRlMzAsIDB4MjEwYzAsCi0weDI0NDI1MDM4LCAweDJlMjIwMjEsIDB4MjQwMjAwMDcsIDB4YWM4MjAwMDAsCi0weDI0MDIwMDAxLCAweGFjODIwMDA0LCAweDE2MDAwMDBkLCAweDAsCi0weDhmODIwMTIwLCAweDNjMDQwMDAxLCAweDI0ODQ1OTM4LCAweGFmYTAwMDE0LAotMHhhZmEyMDAxMCwgMHg4ZDg2MDAxYywgMHg4Zjg3MDEyNCwgMHgzYzA1MDAwOCwKLTB4YzAwMjQwMywgMHgzNGE1MDAwMSwgMHg4MDA0MDU3LCAweDAsCi0weDhlZTI3MjRjLCAweDI0NDIwMDAxLCAweDMwNDIwN2ZmLCAweDExYTAwMDA2LAotMHhhZWUyNzI0YywgMHg4ZWUyMDFkMCwgMHgyNDQyZmZmZiwgMHhhZWUyMDFkMCwKLTB4ODAwM2Y2YiwgMHg4ZWUyMDFkMCwgMHg4ZWUyMDFjYywgMHgyNDQyZmZmZiwKLTB4YWVlMjAxY2MsIDB4OGVlMjAxY2MsIDB4OGVlMjAxZDgsIDB4MjQ0MmZmZmYsCi0weGFlZTIwMWQ4LCAweDgwMDQwNTcsIDB4OGVlMjAxZDgsIDB4OGY0MjAyNDAsCi0weDEwNDAwMGU1LCAweDAsIDB4OGVlMjBlMWMsIDB4MjQ0MjAwMDEsCi0weDgwMDQwNTcsIDB4YWVlMjBlMWMsIDB4OTU4MjAwMWUsIDB4YWQ4MjAwMWMsCi0weDhmNDIwMjQwLCAweDEwNDAwMDcyLCAweDAsIDB4OGVlMjBlMWMsCi0weDI0NDIwMDAxLCAweGFlZTIwZTFjLCAweDhmNDMwMjQwLCAweDQzMTAyYiwKLTB4MTQ0MDAwZDUsIDB4MCwgMHg4ZjgzMDEyMCwgMHgyNzYyMzgwMCwKLTB4MjQ2NjAwMjAsIDB4YzIxMDJiLCAweDUwNDAwMDAxLCAweDI3NjYzMDAwLAotMHg4ZjgyMDEyOCwgMHgxMGMyMDAwNCwgMHgwLCAweDhmODIwMTI0LAotMHgxNGMyMDAwNywgMHgwLCAweDhlZTIwMWE0LCAweDgwMjEsCi0weDI0NDIwMDAxLCAweGFlZTIwMWE0LCAweDgwMDNmZGEsIDB4OGVlMjAxYTQsCi0weDhlZTI3MjRjLCAweGFjNjIwMDFjLCAweDhlZTQwNGE4LCAweDhlZTUwNGFjLAotMHgyNDYyMDAxYywgMHhhYzYyMDAwOCwgMHgyNDAyMDAwOCwgMHhhNDYyMDAwZSwKLTB4MjQwMjAwMTEsIDB4YWM2MjAwMTgsIDB4YWM2NDAwMDAsIDB4YWM2NTAwMDQsCi0weDhlZTIwNGM0LCAweGFjNjIwMDEwLCAweGFmODYwMTIwLCAweDkyZTI0ZTIwLAotMHgxNDQwMDAzNCwgMHgyNDEwMDAwMSwgMHg4ZWUyNGUzMCwgMHgyMTBjMCwKLTB4MjQ0MjUwMzgsIDB4MmUyMjAyMSwgMHg4YzgyMDAwMCwgMHgxNDU1MDAxZiwKLTB4MCwgMHg4ZWUzNGUzMCwgMHg4ZWUyNGUzNCwgMHgxMDYyMDAxYiwKLTB4MCwgMHg4YzgyMDAwNCwgMHgyNDQyMDAwMSwgMHhhYzgyMDAwNCwKLTB4OGVlMjRlMzQsIDB4OGVlMzRlMzAsIDB4MjQ0MjAwMDEsIDB4MTA1NDAwMDcsCi0weDAsIDB4OGVlMjRlMzQsIDB4MjQ0MjAwMDEsIDB4MTA2MjAwMDUsCi0weDAsIDB4ODAwM2ZjNiwgMHgwLCAweDE0NjAwMDA1LAotMHgwLCAweDhmODIwMTI4LCAweDI0NDIwMDIwLCAweGFmODIwMTI4LAotMHg4ZjgyMDEyOCwgMHg4YzgyMDAwNCwgMHgyYzQyMDAxMSwgMHg1MDQwMDAxMSwKLTB4YWM4MDAwMDAsIDB4ODAwM2ZkYSwgMHgwLCAweDhlZTI0ZTMwLAotMHgyNDQyMDAwMSwgMHg1MDU0MDAwMywgMHgxMDIxLCAweDhlZTI0ZTMwLAotMHgyNDQyMDAwMSwgMHhhZWUyNGUzMCwgMHg4ZWUyNGUzMCwgMHgyMTBjMCwKLTB4MjQ0MjUwMzgsIDB4MmUyMjAyMSwgMHgyNDAyMDAwMSwgMHhhYzk1MDAwMCwKLTB4YWM4MjAwMDQsIDB4NTYwMDAwMGIsIDB4MjQxMDAwMDEsIDB4OGVlMjcyNGMsCi0weDNjMDQwMDAxLCAweDI0ODQ1OGE4LCAweGFmYTAwMDE0LCAweGFmYTIwMDEwLAotMHg4ZWU2NzI0YywgMHg4ZjQ3MDI4MCwgMHgzYzA1MDAwOSwgMHhjMDAyNDAzLAotMHgzNGE1ZjAwOCwgMHg1NjAwMDAwMSwgMHhhZWUwMGUxYywgMHg4ZWUyMDE4OCwKLTB4MjQ0MjAwMDEsIDB4YWVlMjAxODgsIDB4ODAwNDA1MCwgMHg4ZWUyMDE4OCwKLTB4OGY4MzAxMjAsIDB4Mjc2MjM4MDAsIDB4MjQ2NjAwMjAsIDB4YzIxMDJiLAotMHg1MDQwMDAwMSwgMHgyNzY2MzAwMCwgMHg4ZjgyMDEyOCwgMHgxMGMyMDAwNCwKLTB4MCwgMHg4ZjgyMDEyNCwgMHgxNGMyMDAwNywgMHgwLAotMHg4ZWUyMDFhNCwgMHg4MDIxLCAweDI0NDIwMDAxLCAweGFlZTIwMWE0LAotMHg4MDA0MDQ0LCAweDhlZTIwMWE0LCAweDhlZTI3MjRjLCAweGFjNjIwMDFjLAotMHg4ZWU0MDRhOCwgMHg4ZWU1MDRhYywgMHgyNDYyMDAxYywgMHhhYzYyMDAwOCwKLTB4MjQwMjAwMDgsIDB4YTQ2MjAwMGUsIDB4MjQwMjAwMTEsIDB4YWM2MjAwMTgsCi0weGFjNjQwMDAwLCAweGFjNjUwMDA0LCAweDhlZTIwNGM0LCAweGFjNjIwMDEwLAotMHhhZjg2MDEyMCwgMHg5MmUyNGUyMCwgMHgxNDQwMDAzNCwgMHgyNDEwMDAwMSwKLTB4OGVlMjRlMzAsIDB4MjEwYzAsIDB4MjQ0MjUwMzgsIDB4MmUyMjAyMSwKLTB4OGM4MjAwMDAsIDB4MTQ1NTAwMWYsIDB4MCwgMHg4ZWUzNGUzMCwKLTB4OGVlMjRlMzQsIDB4MTA2MjAwMWIsIDB4MCwgMHg4YzgyMDAwNCwKLTB4MjQ0MjAwMDEsIDB4YWM4MjAwMDQsIDB4OGVlMjRlMzQsIDB4OGVlMzRlMzAsCi0weDI0NDIwMDAxLCAweDEwNTQwMDA3LCAweDAsIDB4OGVlMjRlMzQsCi0weDI0NDIwMDAxLCAweDEwNjIwMDA1LCAweDAsIDB4ODAwNDAzMCwKLTB4MCwgMHgxNDYwMDAwNSwgMHgwLCAweDhmODIwMTI4LAotMHgyNDQyMDAyMCwgMHhhZjgyMDEyOCwgMHg4ZjgyMDEyOCwgMHg4YzgyMDAwNCwKLTB4MmM0MjAwMTEsIDB4NTA0MDAwMTEsIDB4YWM4MDAwMDAsIDB4ODAwNDA0NCwKLTB4MCwgMHg4ZWUyNGUzMCwgMHgyNDQyMDAwMSwgMHg1MDU0MDAwMywKLTB4MTAyMSwgMHg4ZWUyNGUzMCwgMHgyNDQyMDAwMSwgMHhhZWUyNGUzMCwKLTB4OGVlMjRlMzAsIDB4MjEwYzAsIDB4MjQ0MjUwMzgsIDB4MmUyMjAyMSwKLTB4MjQwMjAwMDEsIDB4YWM5NTAwMDAsIDB4YWM4MjAwMDQsIDB4MTYwMDAwMGIsCi0weDAsIDB4OGVlMjcyNGMsIDB4M2MwNDAwMDEsIDB4MjQ4NDU4YTgsCi0weGFmYTAwMDE0LCAweGFmYTIwMDEwLCAweDhlZTY3MjRjLCAweDhmNDcwMjgwLAotMHgzYzA1MDAwOSwgMHhjMDAyNDAzLCAweDM0YTVmMDA4LCAweDhlZTIwMTc0LAotMHgyNDQyMDAwMSwgMHhhZWUyMDE3NCwgMHg4MDA0MDU3LCAweDhlZTIwMTc0LAotMHgyNDAyMDAwMSwgMHhhZWUyNGUyNCwgMHg4ZjgzMDEyOCwgMHg4ZjgyMDEyNCwKLTB4MTQ2MmZkNTgsIDB4MCwgMHg4ZmJmMDAzMCwgMHg4ZmI1MDAyYywKLTB4OGZiNDAwMjgsIDB4OGZiMzAwMjQsIDB4OGZiMjAwMjAsIDB4OGZiMTAwMWMsCi0weDhmYjAwMDE4LCAweDNlMDAwMDgsIDB4MjdiZDAwMzgsIDB4MjdiZGZmZTgsCi0weDI3ODQwMjA4LCAweDI3NDUwMjAwLCAweDI0MDYwMDA4LCAweGFmYmYwMDE0LAotMHhjMDAyNDlhLCAweGFmYjAwMDEwLCAweDIwMjEsIDB4MjQxMDAwMDEsCi0weDI0MDIyNDFmLCAweGFmOTAwMjEwLCAweGFmOTAwMjAwLCAweGFmODAwMjA0LAotMHhhZjgyMDIxNCwgMHg4ZjQ2MDI0OCwgMHgyNDAzMDAwNCwgMHgzYzAyMDA0MCwKLTB4M2MwMTAwMDEsIDB4YWMyMzVjYzQsIDB4M2MwMTAwMDEsIDB4YWMyMzVjYzgsCi0weDNjMDEwMDAxLCAweGFjMjA1ZDljLCAweDNjMDEwMDAxLCAweGFjMjI1Y2MwLAotMHgzYzAxMDAwMSwgMHhhYzIzNWNjOCwgMHhjMDA1MTA4LCAweDI0MDUwMDA0LAotMHhjMDA0ODIyLCAweDAsIDB4OGVlMjAwMDAsIDB4M2MwM2ZlZmYsCi0weDM0NjNmZmZkLCAweDQzMTAyNCwgMHhhZWUyMDAwMCwgMHgzYzAyM2MwMCwKLTB4YWY4MjAyMWMsIDB4M2MwMTAwMDEsIDB4MzcwODIxLCAweGFjMzA4M2FjLAotMHg4ZmJmMDAxNCwgMHg4ZmIwMDAxMCwgMHgzZTAwMDA4LCAweDI3YmQwMDE4LAotMHgyN2JkZmZlMCwgMHgzYzA1MDAwOCwgMHgzNGE1MDQwMCwgMHhhZmJmMDAxOCwKLTB4YWZhMDAwMTAsIDB4YWZhMDAwMTQsIDB4OGY4NjAyMDAsIDB4M2MwNDAwMDEsCi0weDI0ODQ1OWYwLCAweGMwMDI0MDMsIDB4MzgyMSwgMHg4ZWUyMDI4MCwKLTB4MjQ0MjAwMDEsIDB4YWVlMjAyODAsIDB4OGVlMjAyODAsIDB4OGY4MzAyMDAsCi0weDNjMDIzZjAwLCAweDYyMTgyNCwgMHg4ZmJmMDAxOCwgMHgzYzAyMDQwMCwKLTB4M2UwMDAwOCwgMHgyN2JkMDAyMCwgMHgyN2JkZmZkOCwgMHhhZmJmMDAyMCwKLTB4YWZiMTAwMWMsIDB4YWZiMDAwMTgsIDB4OGY5MDAyMjAsIDB4OGVlMjAyMTQsCi0weDM4MjEsIDB4MjQ0MjAwMDEsIDB4YWVlMjAyMTQsIDB4OGVlMjAyMTQsCi0weDNjMDIwMzAwLCAweDIwMjEwMjQsIDB4MTA0MDAwMjcsIDB4M2MxMTA0MDAsCi0weGMwMDQyOWIsIDB4MCwgMHgzYzAyMDEwMCwgMHgyMDIxMDI0LAotMHgxMDQwMDAwNywgMHgwLCAweDhlZTIwMjE4LCAweDI0NDIwMDAxLAotMHhhZWUyMDIxOCwgMHg4ZWUyMDIxOCwgMHg4MDA0MGM2LCAweDNjMDNmZGZmLAotMHg4ZWUyMDIxYywgMHgyNDQyMDAwMSwgMHhhZWUyMDIxYywgMHg4ZWUyMDIxYywKLTB4M2MwM2ZkZmYsIDB4MzQ2M2ZmZmYsIDB4M2MwODA4ZmYsIDB4MzUwOGZmZmYsCi0weDhlZTIwMDAwLCAweDNjMDQwMDAxLCAweDI0ODQ1OWZjLCAweDNjMDUwMDA4LAotMHgyMDAzMDIxLCAweDQzMTAyNCwgMHhhZWUyMDAwMCwgMHg4ZjgyMDIyMCwKLTB4MzgyMSwgMHgzYzAzMDMwMCwgMHg0ODEwMjQsIDB4NDMxMDI1LAotMHhhZjgyMDIyMCwgMHhhZmEwMDAxMCwgMHhjMDAyNDAzLCAweGFmYTAwMDE0LAotMHg4MDA0Mjk2LCAweDAsIDB4MjExMTAyNCwgMHgxMDQwMDAxZiwKLTB4M2MwMjQwMDAsIDB4OGY4MzAyMjQsIDB4MjQwMjE0MDIsIDB4MTQ2MjAwMGIsCi0weDNjMDNmZGZmLCAweDNjMDQwMDAxLCAweDI0ODQ1YTA4LCAweDNjMDUwMDA4LAotMHhhZmEwMDAxMCwgMHhhZmEwMDAxNCwgMHg4Zjg2MDIyNCwgMHgzNGE1ZmZmZiwKLTB4YzAwMjQwMywgMHgzODIxLCAweDNjMDNmZGZmLCAweDhlZTIwMDAwLAotMHgzNDYzZmZmZiwgMHgyMDAyMDIxLCAweDQzMTAyNCwgMHhjMDA0ZTU0LAotMHhhZWUyMDAwMCwgMHg4ZWUyMDIyMCwgMHgyNDQyMDAwMSwgMHhhZWUyMDIyMCwKLTB4OGVlMjAyMjAsIDB4OGY4MjAyMjAsIDB4M2MwMzA4ZmYsIDB4MzQ2M2ZmZmYsCi0weDQzMTAyNCwgMHg4MDA0Mjk1LCAweDUxMTAyNSwgMHgyMDIxMDI0LAotMHgxMDQwMDE0MiwgMHgwLCAweDhlZTIwMjJjLCAweDI0NDIwMDAxLAotMHhhZWUyMDIyYywgMHg4ZWUyMDIyYywgMHg4ZjgyMDIyMCwgMHgzYzAzMDhmZiwKLTB4MzQ2M2ZmZmYsIDB4NDMxMDI0LCAweDM0NDIwMDA0LCAweGFmODIwMjIwLAotMHg4ZjgzMDA1NCwgMHg4ZjgyMDA1NCwgMHg4MDA0MTBlLCAweDI0NjMwMDAyLAotMHg4ZjgyMDA1NCwgMHg2MjEwMjMsIDB4MmM0MjAwMDMsIDB4MTQ0MGZmZmMsCi0weDAsIDB4OGY4NjAwZTAsIDB4OGY4NDAwZTQsIDB4MzBjMjAwMDcsCi0weDEwNDAwMDEyLCAweDAsIDB4OGY4MzAwZTQsIDB4MjQwMmZmZjgsCi0weGMyMTAyNCwgMHgxMDQzMDAwZCwgMHgwLCAweDhmODIwMDU0LAotMHg4ZjgzMDBlMCwgMHgxNGMzMDAwOSwgMHgyNDQ0MDA1MCwgMHg4ZjgyMDA1NCwKLTB4ODIxMDIzLCAweDJjNDIwMDUxLCAweDEwNDAwMDA0LCAweDAsCi0weDhmODIwMGUwLCAweDEwYzJmZmY5LCAweDAsIDB4OGY4MjAyMjAsCi0weDNjMDMwOGZmLCAweDM0NjNmZmZkLCAweDQzMTAyNCwgMHhhZjgyMDIyMCwKLTB4OGY4NjAwZTAsIDB4MzBjMjAwMDcsIDB4MTA0MDAwMDMsIDB4MjQwMmZmZjgsCi0weGMyMzAyNCwgMHhhZjg2MDBlMCwgMHg4ZjgzMDBjNCwgMHgzYzAyMDAxZiwKLTB4MzQ0MmZmZmYsIDB4MjQ2ODAwMDgsIDB4NDgxMDJiLCAweDEwNDAwMDAzLAotMHgzYzAyZmZmNSwgMHgzNDQyMTAwMCwgMHgxMDI0MDIxLCAweDhmOGIwMGM4LAotMHg4Zjg1MDEyMCwgMHg4Zjg0MDEyNCwgMHg4MDA0MTQ1LCAweDYwMjEsCi0weDI3NjIzODAwLCAweDgyMTAyYiwgMHg1MDQwMDAwMSwgMHgyNzY0MzAwMCwKLTB4MTBhNDAwMTAsIDB4MzE4MjAwZmYsIDB4OGM4MjAwMTgsIDB4Mzg0MzAwMDcsCi0weDJjNjMwMDAxLCAweDM4NDIwMDBiLCAweDJjNDIwMDAxLCAweDYyMTgyNSwKLTB4NTA2MGZmZjMsIDB4MjQ4NDAwMjAsIDB4OGVlMjAyNDAsIDB4MjQwYzAwMDEsCi0weDI0NDIwMDAxLCAweGFlZTIwMjQwLCAweDhlZTIwMjQwLCAweDhjOGIwMDA4LAotMHgzMTgyMDBmZiwgMHgxNDQwMDA2NSwgMHgwLCAweDNjMDIwMDAxLAotMHg1NzEwMjEsIDB4OTA0MjgzYzAsIDB4MTQ0MDAwNjAsIDB4MCwKLTB4OGY4NDAwZTQsIDB4YzQxMDIzLCAweDIxOGMzLCAweDQ2MjAwMDEsCi0weDI0NjMwMjAwLCAweDhmODkwMGM0LCAweDEwNjAwMDA1LCAweDI0MDIwMDAxLAotMHgxMDYyMDAwOSwgMHgwLCAweDgwMDQxODcsIDB4MCwKLTB4OGVlMjAyMzAsIDB4MTIwNTgyMSwgMHgyNDQyMDAwMSwgMHhhZWUyMDIzMCwKLTB4ODAwNDFiYywgMHg4ZWUyMDIzMCwgMHg4ZWUyMDIzNCwgMHgzYzA1MDAwYSwKLTB4MjQ0MjAwMDEsIDB4YWVlMjAyMzQsIDB4OGM4YjAwMDAsIDB4MzRhNWYwMDAsCi0weDhlZTIwMjM0LCAweDEyYjE4MjMsIDB4YTMxMDJiLCAweDU0NDAwMDAxLAotMHg2NTE4MjEsIDB4MmM2MjIzM2YsIDB4MTQ0MDAwNDAsIDB4MCwKLTB4OGY4MjAwZTgsIDB4MjQ0MjAwMDgsIDB4YWY4MjAwZTgsIDB4OGY4MjAwZTgsCi0weDhmODIwMGU0LCAweDEyMDU4MjEsIDB4MjQ0MjAwMDgsIDB4YWY4MjAwZTQsCi0weDgwMDQxYmMsIDB4OGY4MjAwZTQsIDB4OGVlMjAyMzgsIDB4M2MwMzAwMGEsCi0weDI0NDIwMDAxLCAweGFlZTIwMjM4LCAweDhjODQwMDAwLCAweDM0NjNmMDAwLAotMHg4ZWUyMDIzOCwgMHg4ODM4MjMsIDB4NjcxMDJiLCAweDU0NDAwMDAxLAotMHhlMzM4MjEsIDB4M2MwMjAwMDMsIDB4MzQ0MjBkNDAsIDB4NDcxMDJiLAotMHgxMDQwMDAwMywgMHgwLCAweDgwMDQxYmMsIDB4ODA1ODIxLAotMHg4ZjgyMDBlNCwgMHgyNDQ0MDAwOCwgMHhhZjg0MDBlNCwgMHg4Zjg0MDBlNCwKLTB4MTA4NjAwMTgsIDB4M2MwNTAwMGEsIDB4MzRhNWYwMDAsIDB4M2MwYTAwMDMsCi0weDM1NGEwZDQwLCAweDhlZTIwMDdjLCAweDI0NDIwMDAxLCAweGFlZTIwMDdjLAotMHg4YzgzMDAwMCwgMHg4ZWUyMDA3YywgMHg2ODM4MjMsIDB4YTcxMDJiLAotMHg1NDQwMDAwMSwgMHhlNTM4MjEsIDB4MTQ3MTAyYiwgMHg1NDQwMDAwNywKLTB4NjA1ODIxLCAweDhmODIwMGU0LCAweDI0NDQwMDA4LCAweGFmODQwMGU0LAotMHg4Zjg0MDBlNCwgMHgxNDg2ZmZlZiwgMHgwLCAweDE0ODYwMDA1LAotMHgwLCAweDEyMDU4MjEsIDB4YWY4NjAwZTQsIDB4ODAwNDFiYywKLTB4YWY4NjAwZTgsIDB4YWY4NDAwZTQsIDB4YWY4NDAwZTgsIDB4OGY4MjAwYzgsCi0weDNjMDMwMDBhLCAweDM0NjNmMDAwLCAweDQ4MzgyMywgMHg2NzEwMmIsCi0weDU0NDAwMDAxLCAweGUzMzgyMSwgMHgzYzAyMDAwMywgMHgzNDQyMGQzZiwKLTB4NDcxMDJiLCAweDU0NDAwMDA3LCAweDYwMjEsIDB4MTY4MzgyMywKLTB4NjcxMDJiLCAweDU0NDAwMDAzLCAweGUzMzgyMSwgMHg4MDA0MWNmLAotMHgzYzAyMDAwMywgMHgzYzAyMDAwMywgMHgzNDQyMGQzZiwgMHg0NzEwMmIsCi0weDE0NDAwMDE2LCAweDMxODIwMGZmLCAweDE0NDAwMDA2LCAweDAsCi0weDNjMDIwMDAxLCAweDU3MTAyMSwgMHg5MDQyODNjMCwgMHgxMDQwMDAwZiwKLTB4MCwgMHg4ZWUyMDIzYywgMHgzYzA0ZmRmZiwgMHg4ZWUzMDAwMCwKLTB4MzQ4NGZmZmYsIDB4MjQ0MjAwMDEsIDB4YWVlMjAyM2MsIDB4OGVlMjAyM2MsCi0weDI0MDIwMDAxLCAweDY0MTgyNCwgMHgzYzAxMDAwMSwgMHgzNzA4MjEsCi0weGEwMjI4M2I4LCAweDgwMDQyMmMsIDB4YWVlMzAwMDAsIDB4YWY4YjAwYzgsCi0weDhmODMwMGM4LCAweDhmODIwMGM0LCAweDNjMDQwMDBhLCAweDM0ODRmMDAwLAotMHg2MjM4MjMsIDB4ODcxMDJiLCAweDU0NDAwMDAxLCAweGU0MzgyMSwKLTB4M2MwMjAwMDMsIDB4MzQ0MjBkNDAsIDB4NDcxMDJiLCAweDJjZTMwMDAxLAotMHg0MzEwMjUsIDB4MTA0MDAwMDgsIDB4MCwgMHg4ZjgyMDIyMCwKLTB4M2MwMzA4ZmYsIDB4MzQ2M2ZmZmYsIDB4NDMxMDI0LCAweDNjMDM0MDAwLAotMHg0MzEwMjUsIDB4YWY4MjAyMjAsIDB4OGY4NjAwZTAsIDB4OGY4NDAwZTQsCi0weDEwYzQwMDJhLCAweDAsIDB4OGVlMjAwN2MsIDB4MjQ0MjAwMDEsCi0weGFlZTIwMDdjLCAweDhlZTIwMDdjLCAweDI0YzJmZmY4LCAweGFmODIwMGUwLAotMHgzYzAyMDAwMSwgMHg4YzQyN2UzMCwgMHgzYzAzMDAwOCwgMHg4Zjg2MDBlMCwKLTB4NDMxMDI0LCAweDEwNDAwMDFkLCAweDAsIDB4MTBjNDAwMWIsCi0weDI0MGRmZmY4LCAweDNjMGEwMDBhLCAweDM1NGFmMDAwLCAweDNjMGMwMDgwLAotMHgyNDg1MDAwOCwgMHgyNzYyMjgwMCwgMHg1MGEyMDAwMSwgMHgyNzY1MTgwMCwKLTB4OGM4ODAwMDQsIDB4OGM4MjAwMDAsIDB4OGNhOTAwMDAsIDB4MzEwM2ZmZmYsCi0weDQzMTAyMSwgMHg0ZDEwMjQsIDB4MjQ0MzAwMTAsIDB4NmIxMDJiLAotMHg1NDQwMDAwMSwgMHg2YTE4MjEsIDB4MTJiMTAyYiwgMHg1NDQwMDAwMSwKLTB4MTJhNDgyMSwgMHgxMDY5MDAwMiwgMHgxMGMxMDI1LCAweGFjODIwMDA0LAotMHhhMDIwMjEsIDB4MTRjNGZmZWIsIDB4MjQ4NTAwMDgsIDB4OGY4MjAyMjAsCi0weDNjMDMwOGZmLCAweDM0NjNmZmZmLCAweDQzMTAyNCwgMHgzNDQyMDAwMiwKLTB4YWY4MjAyMjAsIDB4OGY4MzAwNTQsIDB4OGY4MjAwNTQsIDB4ODAwNDIzNywKLTB4MjQ2MzAwMDEsIDB4OGY4MjAwNTQsIDB4NjIxMDIzLCAweDJjNDIwMDAyLAotMHgxNDQwZmZmYywgMHgwLCAweDhmODIwMjIwLCAweDNjMDMwOGZmLAotMHgzNDYzZmZmYiwgMHg0MzEwMjQsIDB4YWY4MjAyMjAsIDB4NjAxMDA1NSwKLTB4MCwgMHg4ZWUyMDIyOCwgMHgyNDQyMDAwMSwgMHhhZWUyMDIyOCwKLTB4OGVlMjAyMjgsIDB4OGY4MjAyMjAsIDB4M2MwMzA4ZmYsIDB4MzQ2M2ZmZmYsCi0weDQzMTAyNCwgMHgzNDQyMDAwNCwgMHhhZjgyMDIyMCwgMHg4ZjgzMDA1NCwKLTB4OGY4MjAwNTQsIDB4ODAwNDI1MSwgMHgyNDYzMDAwMiwgMHg4ZjgyMDA1NCwKLTB4NjIxMDIzLCAweDJjNDIwMDAzLCAweDE0NDBmZmZjLCAweDAsCi0weDhmODYwMGUwLCAweDMwYzIwMDA3LCAweDEwNDAwMDEyLCAweDAsCi0weDhmODMwMGU0LCAweDI0MDJmZmY4LCAweGMyMTAyNCwgMHgxMDQzMDAwZCwKLTB4MCwgMHg4ZjgyMDA1NCwgMHg4ZjgzMDBlMCwgMHgxNGMzMDAwOSwKLTB4MjQ0NDAwMzIsIDB4OGY4MjAwNTQsIDB4ODIxMDIzLCAweDJjNDIwMDMzLAotMHgxMDQwMDAwNCwgMHgwLCAweDhmODIwMGUwLCAweDEwYzJmZmY5LAotMHgwLCAweDhmODIwMjIwLCAweDNjMDMwOGZmLCAweDM0NjNmZmZkLAotMHg0MzEwMjQsIDB4YWY4MjAyMjAsIDB4OGY4NjAwZTAsIDB4MzBjMjAwMDcsCi0weDEwNDAwMDAzLCAweDI0MDJmZmY4LCAweGMyMzAyNCwgMHhhZjg2MDBlMCwKLTB4MjQwMzAxZjUsIDB4OGY4MjAwZTgsIDB4NjczODIzLCAweDcxOGMwLAotMHg0MzEwMjEsIDB4YWY4MjAwZTgsIDB4OGY4MjAwZTgsIDB4YWY4MjAwZTQsCi0weDhlZTIwMDdjLCAweDNjMDQwOGZmLCAweDM0ODRmZmZmLCAweDQ3MTAyMSwKLTB4YWVlMjAwN2MsIDB4OGY4MjAyMjAsIDB4M2MwMzgwMDAsIDB4MzQ2MzAwMDIsCi0weDQ0MTAyNCwgMHg0MzEwMjUsIDB4YWY4MjAyMjAsIDB4OGY4MzAwNTQsCi0weDhmODIwMDU0LCAweDgwMDQyOGQsIDB4MjQ2MzAwMDEsIDB4OGY4MjAwNTQsCi0weDYyMTAyMywgMHgyYzQyMDAwMiwgMHgxNDQwZmZmYywgMHgwLAotMHg4ZjgyMDIyMCwgMHgzYzAzMDhmZiwgMHgzNDYzZmZmYiwgMHg0MzEwMjQsCi0weGFmODIwMjIwLCAweDhmYmYwMDIwLCAweDhmYjEwMDFjLCAweDhmYjAwMDE4LAotMHgzZTAwMDA4LCAweDI3YmQwMDI4LCAweDNjMDIwMDAxLCAweDhjNDI1Y2Q4LAotMHgyN2JkZmZkOCwgMHgxMDQwMDAxMiwgMHhhZmJmMDAyMCwgMHgzYzA0MDAwMSwKLTB4MjQ4NDVhMTQsIDB4M2MwNTAwMDgsIDB4MjQwMjAwMDEsIDB4M2MwMTAwMDEsCi0weDM3MDgyMSwgMHhhYzIyODNhYywgMHhhZmEwMDAxMCwgMHhhZmEwMDAxNCwKLTB4OGY4NjAyMjAsIDB4MzRhNTA0OTgsIDB4M2MwMTAwMDEsIDB4YWMyMDVjZDgsCi0weDNjMDEwMDAxLCAweGFjMjI1Y2NjLCAweGMwMDI0MDMsIDB4MzgyMSwKLTB4OGY0MjAyNjgsIDB4M2MwMzdmZmYsIDB4MzQ2M2ZmZmYsIDB4NDMxMDI0LAotMHhhZjQyMDI2OCwgMHg4ZWUyMDRkMCwgMHg4ZWU0MDRkNCwgMHgyNDAzZmZmZSwKLTB4NDMxMDI0LCAweDMwODQwMDAyLCAweDEwODAwMTFlLCAweGFlZTIwNGQwLAotMHg4ZWUyMDRkNCwgMHgyNDAzZmZmZCwgMHg0MzEwMjQsIDB4YWVlMjA0ZDQsCi0weDhmODIwMDQ0LCAweDNjMDMwNjAwLCAweDM0NjMyMDAwLCAweDM0NDIwMDIwLAotMHhhZjgyMDA0NCwgMHhhZmEzMDAxOCwgMHg4ZWUyMDYwOCwgMHg4ZjQzMDIyOCwKLTB4MjQ0MjAwMDEsIDB4MzA0YTAwZmYsIDB4NTE0MzAwZmUsIDB4YWZhMDAwMTAsCi0weDhlZTIwNjA4LCAweDIxMGMwLCAweDU3MTAyMSwgMHg4ZmEzMDAxOCwKLTB4OGZhNDAwMWMsIDB4YWM0MzA2MGMsIDB4YWM0NDA2MTAsIDB4OGY4MzAwNTQsCi0weDhmODIwMDU0LCAweDI0NjkwMDMyLCAweDEyMjEwMjMsIDB4MmM0MjAwMzMsCi0weDEwNDAwMDZhLCAweDU4MjEsIDB4MjQxODAwMDgsIDB4MjQwZjAwMGQsCi0weDI0MGQwMDA3LCAweDI0MGMwMDQwLCAweDI0MGUwMDAxLCAweDhmODcwMTIwLAotMHgyNzYyMzgwMCwgMHgyNGU4MDAyMCwgMHgxMDIxMDJiLCAweDUwNDAwMDAxLAotMHgyNzY4MzAwMCwgMHg4ZjgyMDEyOCwgMHgxMTAyMDAwNCwgMHgwLAotMHg4ZjgyMDEyNCwgMHgxNTAyMDAwNywgMHgxMDIxLCAweDhlZTIwMWE0LAotMHgyODIxLCAweDI0NDIwMDAxLCAweGFlZTIwMWE0LCAweDgwMDQzM2QsCi0weDhlZTIwMWE0LCAweDhlZTQwNjA4LCAweDQyMGMwLCAweDgwMTgyMSwKLTB4OGVlNDA0MzAsIDB4OGVlNTA0MzQsIDB4YTMyODIxLCAweGEzMzAyYiwKLTB4ODIyMDIxLCAweDg2MjAyMSwgMHhhY2U0MDAwMCwgMHhhY2U1MDAwNCwKLTB4OGVlMjA2MDgsIDB4YTRmODAwMGUsIDB4YWNlZjAwMTgsIDB4YWNlYTAwMWMsCi0weDIxMGMwLCAweDI0NDIwNjBjLCAweDJlMjEwMjEsIDB4YWNlMjAwMDgsCi0weDhlZTIwNGM0LCAweGFjZTIwMDEwLCAweGFmODgwMTIwLCAweDkyZTI0ZTIwLAotMHgxNDQwMDAzMywgMHgyNDA1MDAwMSwgMHg4ZWUyNGUzMCwgMHgyMTBjMCwKLTB4MjQ0MjUwMzgsIDB4MmUyMjAyMSwgMHg4YzgyMDAwMCwgMHgxNDRkMDAxZiwKLTB4MCwgMHg4ZWUzNGUzMCwgMHg4ZWUyNGUzNCwgMHgxMDYyMDAxYiwKLTB4MCwgMHg4YzgyMDAwNCwgMHgyNDQyMDAwMSwgMHhhYzgyMDAwNCwKLTB4OGVlMjRlMzQsIDB4OGVlMzRlMzAsIDB4MjQ0MjAwMDEsIDB4MTA0YzAwMDcsCi0weDAsIDB4OGVlMjRlMzQsIDB4MjQ0MjAwMDEsIDB4MTA2MjAwMDUsCi0weDAsIDB4ODAwNDMyYSwgMHgwLCAweDE0NjAwMDA1LAotMHgwLCAweDhmODIwMTI4LCAweDI0NDIwMDIwLCAweGFmODIwMTI4LAotMHg4ZjgyMDEyOCwgMHg4YzgyMDAwNCwgMHgyYzQyMDAxMSwgMHg1MDQwMDAxMCwKLTB4YWM4MDAwMDAsIDB4ODAwNDMzZCwgMHgwLCAweDhlZTI0ZTMwLAotMHgyNDQyMDAwMSwgMHg1MDRjMDAwMywgMHgxMDIxLCAweDhlZTI0ZTMwLAotMHgyNDQyMDAwMSwgMHhhZWUyNGUzMCwgMHg4ZWUyNGUzMCwgMHgyMTBjMCwKLTB4MjQ0MjUwMzgsIDB4MmUyMjAyMSwgMHhhYzhkMDAwMCwgMHhhYzhlMDAwNCwKLTB4NTRhMDAwMDYsIDB4MjQwYjAwMDEsIDB4OGY4MjAwNTQsIDB4MTIyMTAyMywKLTB4MmM0MjAwMzMsIDB4MTQ0MGZmOWQsIDB4MCwgMHgzMTYzMDBmZiwKLTB4MjQwMjAwMDEsIDB4NTQ2MjAwNzksIDB4YWZhMDAwMTAsIDB4YWVlYTA2MDgsCi0weDhmODMwMDU0LCAweDhmODIwMDU0LCAweDI0NjkwMDMyLCAweDEyMjEwMjMsCi0weDJjNDIwMDMzLCAweDEwNDAwMDYxLCAweDU4MjEsIDB4MjQwZDAwMDgsCi0weDI0MGMwMDExLCAweDI0MDgwMDEyLCAweDI0MDcwMDQwLCAweDI0MGEwMDAxLAotMHg4ZjgzMDEyMCwgMHgyNzYyMzgwMCwgMHgyNDY2MDAyMCwgMHhjMjEwMmIsCi0weDUwNDAwMDAxLCAweDI3NjYzMDAwLCAweDhmODIwMTI4LCAweDEwYzIwMDA0LAotMHgwLCAweDhmODIwMTI0LCAweDE0YzIwMDA3LCAweDAsCi0weDhlZTIwMWE0LCAweDI4MjEsIDB4MjQ0MjAwMDEsIDB4YWVlMjAxYTQsCi0weDgwMDQzYTksIDB4OGVlMjAxYTQsIDB4OGVlMjA2MDgsIDB4YWM2MjAwMWMsCi0weDhlZTQwNGEwLCAweDhlZTUwNGE0LCAweDI0NjIwMDFjLCAweGFjNjIwMDA4LAotMHhhNDZkMDAwZSwgMHhhYzZjMDAxOCwgMHhhYzY0MDAwMCwgMHhhYzY1MDAwNCwKLTB4OGVlMjA0YzQsIDB4YWM2MjAwMTAsIDB4YWY4NjAxMjAsIDB4OTJlMjRlMjAsCi0weDE0NDAwMDMzLCAweDI0MDUwMDAxLCAweDhlZTI0ZTMwLCAweDIxMGMwLAotMHgyNDQyNTAzOCwgMHgyZTIyMDIxLCAweDhjODIwMDAwLCAweDE0NDgwMDFmLAotMHgwLCAweDhlZTM0ZTMwLCAweDhlZTI0ZTM0LCAweDEwNjIwMDFiLAotMHgwLCAweDhjODIwMDA0LCAweDI0NDIwMDAxLCAweGFjODIwMDA0LAotMHg4ZWUyNGUzNCwgMHg4ZWUzNGUzMCwgMHgyNDQyMDAwMSwgMHgxMDQ3MDAwNywKLTB4MCwgMHg4ZWUyNGUzNCwgMHgyNDQyMDAwMSwgMHgxMDYyMDAwNSwKLTB4MCwgMHg4MDA0Mzk2LCAweDAsIDB4MTQ2MDAwMDUsCi0weDAsIDB4OGY4MjAxMjgsIDB4MjQ0MjAwMjAsIDB4YWY4MjAxMjgsCi0weDhmODIwMTI4LCAweDhjODIwMDA0LCAweDJjNDIwMDExLCAweDUwNDAwMDEwLAotMHhhYzgwMDAwMCwgMHg4MDA0M2E5LCAweDAsIDB4OGVlMjRlMzAsCi0weDI0NDIwMDAxLCAweDUwNDcwMDAzLCAweDEwMjEsIDB4OGVlMjRlMzAsCi0weDI0NDIwMDAxLCAweGFlZTI0ZTMwLCAweDhlZTI0ZTMwLCAweDIxMGMwLAotMHgyNDQyNTAzOCwgMHgyZTIyMDIxLCAweGFjODgwMDAwLCAweGFjOGEwMDA0LAotMHg1NGEwMDAwNiwgMHgyNDBiMDAwMSwgMHg4ZjgyMDA1NCwgMHgxMjIxMDIzLAotMHgyYzQyMDAzMywgMHgxNDQwZmZhNiwgMHgwLCAweDMxNjMwMGZmLAotMHgyNDAyMDAwMSwgMHg1NDYyMDAwMywgMHhhZmEwMDAxMCwgMHg4MDA0M2Q2LAotMHgwLCAweDNjMDQwMDAxLCAweDI0ODQ1YTIwLCAweGFmYTAwMDE0LAotMHg4Zjg2MDEyMCwgMHg4Zjg3MDEyNCwgMHgzYzA1MDAwOSwgMHhjMDAyNDAzLAotMHgzNGE1ZjAxMSwgMHg4MDA0M2Q2LCAweDAsIDB4M2MwNDAwMDEsCi0weDI0ODQ1YTJjLCAweGFmYTAwMDE0LCAweDhmODYwMTIwLCAweDhmODcwMTI0LAotMHgzYzA1MDAwOSwgMHhjMDAyNDAzLCAweDM0YTVmMDEwLCAweDgwMDQzZDYsCi0weDAsIDB4M2MwNDAwMDEsIDB4MjQ4NDVhMzgsIDB4YWZhMDAwMTQsCi0weDhlZTYwNjA4LCAweDhmNDcwMjI4LCAweDNjMDUwMDA5LCAweGMwMDI0MDMsCi0weDM0YTVmMDBmLCAweDhlZTIwMWFjLCAweDI0NDIwMDAxLCAweGFlZTIwMWFjLAotMHg4ZWUyMDFhYywgMHg4ZWUyMDE1YywgMHgyNDQyMDAwMSwgMHhhZWUyMDE1YywKLTB4OGVlMjAxNWMsIDB4OGZiZjAwMjAsIDB4M2UwMDAwOCwgMHgyN2JkMDAyOCwKLTB4M2MwMjAwMDEsIDB4OGM0MjVjZDgsIDB4MjdiZGZmZTAsIDB4MTQ0MDAwMGQsCi0weGFmYmYwMDE4LCAweDNjMDQwMDAxLCAweDI0ODQ1YTQ0LCAweDNjMDUwMDA4LAotMHhhZmEwMDAxMCwgMHhhZmEwMDAxNCwgMHg4Zjg2MDIyMCwgMHgzNGE1MDQ5OSwKLTB4MjQwMjAwMDEsIDB4M2MwMTAwMDEsIDB4YWMyMjVjZDgsIDB4YzAwMjQwMywKLTB4MzgyMSwgMHg4ZWUyMDRkMCwgMHgzYzAzMDAwMSwgMHg3NzE4MjEsCi0weDk0NjM4M2IyLCAweDM0NDIwMDAxLCAweDEwNjAwMDA3LCAweGFlZTIwNGQwLAotMHg4ZjgyMDIyMCwgMHgzYzAzMDhmZiwgMHgzNDYzZmZmZiwgMHg0MzEwMjQsCi0weDM0NDIwMDA4LCAweGFmODIwMjIwLCAweDIwMjEsIDB4YzAwNTJhMiwKLTB4MjQwNTAwMDQsIDB4YWY0MjAyNjgsIDB4OGZiZjAwMTgsIDB4M2UwMDAwOCwKLTB4MjdiZDAwMjAsIDB4MCwgMHgwLCAweDAsCi0weDAsIDB4MCwgMHgwLCAweDAsCi0weDAsIDB4MCwgMHgwLCAweDAsCi0weDAsIDB4MCwgMHgwLCAweDAsCi0weDAsIDB4MCwgMHgwLCAweDAsCi0weDAsIDB4MCwgMHgwLCAweDAsCi0weDAsIDB4MCwgMHgwLCAweDAsCi0weDAsIDB4MCwgMHgwLCAweDAsCi0weDAsIDB4MCwgMHgwLCAweDAsCi0weDAsIDB4MCwgMHgwLCAweDAsCi0weDAsIDB4MCwgMHgwLCAweDAsCi0weDAsIDB4MCwgMHgwLCAweDAsCi0weDAsIDB4MCwgMHgwLCAweDAsCi0weDAsIDB4MCwgMHgwLCAweDAsCi0weDAsIDB4MCwgMHgwLCAweDAsCi0weDAsIDB4MCwgMHgwLCAweDNjMTIwMDAxLAotMHgyNjUyMTIwMCwgMHgzYzE0MDAwMSwgMHg4ZTk0NWM1MCwgMHgzYzEwMDAwMSwKLTB4MjYxMDExMjAsIDB4M2MxNWMwMDAsIDB4MzZiNTAwNjAsIDB4OGU4YTAwMDAsCi0weDhlYjMwMDAwLCAweDI2YTQwMGIsIDB4MjQ4MDAwYSwgMHgyMDBmODIxLAotMHgwLCAweGQsIDB4MCwgMHgwLAotMHgwLCAweDAsIDB4MCwgMHgwLAotMHgwLCAweDAsIDB4MCwgMHgwLAotMHgwLCAweDAsIDB4MCwgMHgwLAotMHgwLCAweDAsIDB4MCwgMHgwLAotMHgwLCAweDAsIDB4MCwgMHgwLAotMHgwLCAweDAsIDB4MCwgMHgwLAotMHgwLCAweDAsIDB4MCwgMHgwLAotMHgwLCAweDAsIDB4MCwgMHgwLAotMHgwLCAweDAsIDB4MCwgMHgwLAotMHgwLCAweDAsIDB4MCwgMHgwLAotMHgwLCAweDAsIDB4MCwgMHgwLAotMHgwLCAweDAsIDB4MCwgMHg4MDAxNGQ2LAotMHgwLCAweDgwMDE0ZDgsIDB4M2MwYTAwMDEsIDB4ODAwMTRkOCwKLTB4M2MwYTAwMDIsIDB4ODAwMTRkOCwgMHgwLCAweDgwMDI0YTYsCi0weDAsIDB4ODAwMTRkOCwgMHgzYzBhMDAwMywgMHg4MDAxNGQ4LAotMHgzYzBhMDAwNCwgMHg4MDAyZjhjLCAweDAsIDB4ODAwMTRkOCwKLTB4M2MwYTAwMDUsIDB4ODAwM2NlOCwgMHgwLCAweDgwMDNjNjYsCi0weDAsIDB4ODAwMTRkOCwgMHgzYzBhMDAwNiwgMHg4MDAxNGQ4LAotMHgzYzBhMDAwNywgMHg4MDAxNGQ4LCAweDAsIDB4ODAwMTRkOCwKLTB4MCwgMHg4MDAxNGQ4LCAweDAsIDB4ODAwMmE3NSwKLTB4MCwgMHg4MDAxNGQ4LCAweDNjMGEwMDBiLCAweDgwMDE0ZDgsCi0weDNjMGEwMDBjLCAweDgwMDE0ZDgsIDB4M2MwYTAwMGQsIDB4ODAwMjM3YSwKLTB4MCwgMHg4MDAyMzM5LCAweDAsIDB4ODAwMTRkOCwKLTB4M2MwYTAwMGUsIDB4ODAwMWIzYywgMHgwLCAweDgwMDI0YTQsCi0weDAsIDB4ODAwMTRkOCwgMHgzYzBhMDAwZiwgMHg4MDA0MGE3LAotMHgwLCAweDgwMDQwOTEsIDB4MCwgMHg4MDAxNGQ4LAotMHgzYzBhMDAxMCwgMHg4MDAxNGVlLCAweDAsIDB4ODAwMTRkOCwKLTB4M2MwYTAwMTEsIDB4ODAwMTRkOCwgMHgzYzBhMDAxMiwgMHg4MDAxNGQ4LAotMHgzYzBhMDAxMywgMHgwLCAweDAsIDB4MCwKLTB4MCwgMHgwLCAweDAsIDB4MCwKLTB4MCwgMHgwLCAweDAsIDB4MCwKLTB4MCwgMHgwLCAweDAsIDB4MCwKLTB4MCwgMHgwLCAweDAsIDB4MCwKLTB4MCwgMHgwLCAweDAsIDB4MCwKLTB4MCwgMHgwLCAweDAsIDB4MCwKLTB4MCwgMHgwLCAweDAsIDB4MCwKLTB4MCwgMHgwLCAweDAsIDB4MCwKLTB4MCwgMHgwLCAweDAsIDB4MCwKLTB4MCwgMHgwLCAweDAsIDB4MCwKLTB4MCwgMHgwLCAweDAsIDB4MCwKLTB4MCwgMHgwLCAweDAsIDB4MCwKLTB4MCwgMHgwLCAweDAsIDB4MCwKLTB4MCwgMHgwLCAweDAsIDB4MCwKLTB4MCwgMHgwLCAweDAsIDB4M2MwMzAwMDEsCi0weDM0NjMzODAwLCAweDI0MDUwMDgwLCAweDI0MDQwMDFmLCAweDI0MDZmZmZmLAotMHgyNDAyMDAwMSwgMHhhZjgwMDIxYywgMHhhZjgyMDIwMCwgMHhhZjgyMDIyMCwKLTB4MzYzMTAyMSwgMHhhZjgyMDBjMCwgMHgzNjMxMDIxLCAweGFmODIwMGM0LAotMHgzNjMxMDIxLCAweGFmODIwMGM4LCAweDI3NjIzODAwLCAweGFmODIwMGQwLAotMHgyNzYyMzgwMCwgMHhhZjgyMDBkNCwgMHgyNzYyMzgwMCwgMHhhZjgyMDBkOCwKLTB4Mjc2MjE4MDAsIDB4YWY4MjAwZTAsIDB4Mjc2MjE4MDAsIDB4YWY4MjAwZTQsCi0weDI3NjIxODAwLCAweGFmODIwMGU4LCAweDI3NjIxMDAwLCAweGFmODIwMGYwLAotMHgyNzYyMTAwMCwgMHhhZjgyMDBmNCwgMHgyNzYyMTAwMCwgMHhhZjgyMDBmOCwKLTB4YWNhMDAwMDAsIDB4MjQ4NGZmZmYsIDB4MTQ4NmZmZmQsIDB4MjRhNTAwMDQsCi0weDhmODMwMDQwLCAweDNjMDJmMDAwLCAweDYyMTgyNCwgMHgzYzAyNTAwMCwKLTB4MTA2MjAwMGMsIDB4NDMxMDJiLCAweDE0NDAwMDA2LCAweDNjMDI2MDAwLAotMHgzYzAyNDAwMCwgMHgxMDYyMDAwOCwgMHgyNDAyMDgwMCwgMHg4MDA0NTM5LAotMHgwLCAweDEwNjIwMDA0LCAweDI0MDIwODAwLCAweDgwMDQ1MzksCi0weDAsIDB4MjQwMjA3MDAsIDB4M2MwMTAwMDEsIDB4YWMyMjVjZGMsCi0weDNlMDAwMDgsIDB4MCwgMHgyN2JkZmZkOCwgMHhhZmJmMDAyNCwKLTB4YWZiMDAwMjAsIDB4OGY4MzAwNTQsIDB4OGY4MjAwNTQsIDB4M2MwMTAwMDEsCi0weGFjMjA1Y2M0LCAweDgwMDQ1NDUsIDB4MjQ2MzAwNjQsIDB4OGY4MjAwNTQsCi0weDYyMTAyMywgMHgyYzQyMDA2NSwgMHgxNDQwZmZmYywgMHgwLAotMHhjMDA0ZDcxLCAweDAsIDB4MjQwNDAwMDEsIDB4MjgyMSwKLTB4MjdhNjAwMTgsIDB4MzQwMjgwMDAsIDB4YzAwNDk4ZSwgMHhhN2EyMDAxOCwKLTB4OGY4MzAwNTQsIDB4OGY4MjAwNTQsIDB4ODAwNDU1NiwgMHgyNDYzMDA2NCwKLTB4OGY4MjAwNTQsIDB4NjIxMDIzLCAweDJjNDIwMDY1LCAweDE0NDBmZmZjLAotMHgyNDA0MDAwMSwgMHgyNDA1MDAwMSwgMHhjMDA0OTRjLCAweDI3YTYwMDE4LAotMHg4ZjgzMDA1NCwgMHg4ZjgyMDA1NCwgMHg4MDA0NTYyLCAweDI0NjMwMDY0LAotMHg4ZjgyMDA1NCwgMHg2MjEwMjMsIDB4MmM0MjAwNjUsIDB4MTQ0MGZmZmMsCi0weDI0MDQwMDAxLCAweDI0MDUwMDAxLCAweGMwMDQ5NGMsIDB4MjdhNjAwMTgsCi0weDhmODMwMDU0LCAweDhmODIwMDU0LCAweDgwMDQ1NmUsIDB4MjQ2MzAwNjQsCi0weDhmODIwMDU0LCAweDYyMTAyMywgMHgyYzQyMDA2NSwgMHgxNDQwZmZmYywKLTB4MjQwNDAwMDEsIDB4M2MwNjAwMDEsIDB4MjRjNjVkYTAsIDB4YzAwNDk0YywKLTB4MjQwNTAwMDIsIDB4OGY4MzAwNTQsIDB4OGY4MjAwNTQsIDB4ODAwNDU3YiwKLTB4MjQ2MzAwNjQsIDB4OGY4MjAwNTQsIDB4NjIxMDIzLCAweDJjNDIwMDY1LAotMHgxNDQwZmZmYywgMHgyNDA0MDAwMSwgMHgyNDA1MDAwMywgMHgzYzEwMDAwMSwKLTB4MjYxMDVkYTIsIDB4YzAwNDk0YywgMHgyMDAzMDIxLCAweDk3YTYwMDE4LAotMHgzYzA3MDAwMSwgMHg5NGU3NWRhMCwgMHgzYzA0MDAwMSwgMHgyNDg0NWFiMCwKLTB4YWZhMDAwMTQsIDB4OTYwMjAwMDAsIDB4M2MwNTAwMGQsIDB4MzRhNTAxMDAsCi0weGMwMDI0MDMsIDB4YWZhMjAwMTAsIDB4OTdhMjAwMTgsIDB4MTA0MDAwNGMsCi0weDI0MDM2MDQwLCAweDk2MDIwMDAwLCAweDMwNDJmZmYwLCAweDE0NDMwMDBhLAotMHgyNDAyMDAyMCwgMHgzYzAzMDAwMSwgMHg5NDYzNWRhMCwgMHg1NDYyMDAwOSwKLTB4MjQwMjc4MzAsIDB4MjQwMjAwMDMsIDB4M2MwMTAwMDEsIDB4YWMyMjVjYzQsCi0weDgwMDQ1YWMsIDB4MjQwMjAwMDUsIDB4M2MwMzAwMDEsIDB4OTQ2MzVkYTAsCi0weDI0MDI3ODMwLCAweDE0NjIwMDBmLCAweDI0MDMwMDEwLCAweDNjMDIwMDAxLAotMHg5NDQyNWRhMiwgMHgzMDQyZmZmMCwgMHgxNDQzMDAwYSwgMHgyNDAyMDAwMywKLTB4M2MwMTAwMDEsIDB4YWMyMjVjYzQsIDB4MjQwMjAwMDYsIDB4M2MwMTAwMDEsCi0weGFjMjI1ZGIwLCAweDNjMDEwMDAxLCAweGFjMjI1ZGJjLCAweDgwMDQ1ZTYsCi0weDNjMDlmZmYwLCAweDNjMDIwMDAxLCAweDhjNDI1Y2M0LCAweDNjMDMwMDAxLAotMHg5NDYzNWRhMCwgMHgzNDQyMDAwMSwgMHgzYzAxMDAwMSwgMHhhYzIyNWNjNCwKLTB4MjQwMjAwMTUsIDB4MTQ2MjAwMGYsIDB4MCwgMHgzYzAyMDAwMSwKLTB4OTQ0MjVkYTIsIDB4MzA0MmZmZjAsIDB4Mzg0M2Y0MjAsIDB4MmM2MzAwMDEsCi0weDM4NDJmNDMwLCAweDJjNDIwMDAxLCAweDYyMTgyNSwgMHgxMDYwMDAwNSwKLTB4MjQwMjAwMDMsIDB4M2MwMTAwMDEsIDB4YWMyMjVkYmMsIDB4ODAwNDVlNiwKLTB4M2MwOWZmZjAsIDB4M2MwMzAwMDEsIDB4OTQ2MzVkYTAsIDB4MjQwMjc4MTAsCi0weDE0NjIwMDBiLCAweDI0MDIwMDAyLCAweDNjMDIwMDAxLCAweDk0NDI1ZGEyLAotMHgzMDQyZmZmMCwgMHgxNDQwMDAwNiwgMHgyNDAyMDAwMiwgMHgyNDAyMDAwNCwKLTB4M2MwMTAwMDEsIDB4YWMyMjVkYmMsIDB4ODAwNDVlNiwgMHgzYzA5ZmZmMCwKLTB4M2MwMTAwMDEsIDB4YWMyMjVkYmMsIDB4ODAwNDVlNiwgMHgzYzA5ZmZmMCwKLTB4M2MwMjAwMDEsIDB4OGM0MjVjYzQsIDB4MjQwMzAwMDEsIDB4M2MwMTAwMDEsCi0weGFjMjM1ZGJjLCAweDM0NDIwMDA0LCAweDNjMDEwMDAxLCAweGFjMjI1Y2M0LAotMHgzYzA5ZmZmMCwgMHgzNTI5YmRjMCwgMHgzYzA2MDAwMSwgMHg4Y2M2NWNjNCwKLTB4M2MwNDAwMDEsIDB4MjQ4NDVhYjAsIDB4MjQwMjAwMDEsIDB4M2MwMTAwMDEsCi0weGFjMjI1Y2NjLCAweDhmODIwMDU0LCAweDNjMDcwMDAxLCAweDhjZTc1ZGJjLAotMHgzYzAzMDAwMSwgMHg5NDYzNWRhMCwgMHgzYzA4MDAwMSwgMHg5NTA4NWRhMiwKLTB4M2MwNTAwMGQsIDB4MzRhNTAxMDAsIDB4M2MwMTAwMDEsIDB4YWMyMDVjYzgsCi0weDQ5MTAyMSwgMHgzYzAxMDAwMSwgMHhhYzIyNWRhYywgMHhhZmEzMDAxMCwKLTB4YzAwMjQwMywgMHhhZmE4MDAxNCwgMHg4ZmJmMDAyNCwgMHg4ZmIwMDAyMCwKLTB4M2UwMDAwOCwgMHgyN2JkMDAyOCwgMHgyN2JkZmZlOCwgMHgzYzA1MDAwMSwKLTB4OGNhNTVjYzgsIDB4MjQwNjAwMDQsIDB4MjQwMjAwMDEsIDB4MTRhMjAwMTQsCi0weGFmYmYwMDEwLCAweDNjMDIwMDAxLCAweDhjNDI3ZTNjLCAweDMwNDI4MDAwLAotMHgxMDQwMDAwNSwgMHgzYzA0MDAwZiwgMHgzYzAzMDAwMSwgMHg4YzYzNWRiYywKLTB4ODAwNDYxNywgMHgzNDg0NDI0MCwgMHgzYzA0MDAwNCwgMHgzYzAzMDAwMSwKLTB4OGM2MzVkYmMsIDB4MzQ4NDkzZTAsIDB4MjQwMjAwMDUsIDB4MTQ2MjAwMTYsCi0weDAsIDB4M2MwNDAwM2QsIDB4ODAwNDYyZiwgMHgzNDg0MDkwMCwKLTB4M2MwMjAwMDEsIDB4OGM0MjdlMzgsIDB4MzA0MjgwMDAsIDB4MTA0MDAwMDUsCi0weDNjMDQwMDFlLCAweDNjMDMwMDAxLCAweDhjNjM1ZGJjLCAweDgwMDQ2MmEsCi0weDM0ODQ4NDgwLCAweDNjMDQwMDBmLCAweDNjMDMwMDAxLCAweDhjNjM1ZGJjLAotMHgzNDg0NDI0MCwgMHgyNDAyMDAwNSwgMHgxNDYyMDAwMywgMHgwLAotMHgzYzA0MDA3YSwgMHgzNDg0MTIwMCwgMHgzYzAyMDAwMSwgMHg4YzQyNWRhYywKLTB4OGY4MzAwNTQsIDB4NDQxMDIxLCAweDQzMTAyMywgMHg0NDEwMmIsCi0weDE0NDAwMDM3LCAweDAsIDB4M2MwMjAwMDEsIDB4OGM0MjVjZDAsCi0weDE0NDAwMDMzLCAweDAsIDB4M2MwMTAwMDEsIDB4MTBjMDAwMjUsCi0weGFjMjA1Y2UwLCAweDNjMDkwMDAxLCAweDhkMjk1Y2M0LCAweDI0MDcwMDAxLAotMHgzYzA0NDAwMCwgMHgzYzA4MDAwMSwgMHgyNTA4N2UzYywgMHgyNTBhZmZmYywKLTB4NTI4NDIsIDB4MTRhMDAwMDIsIDB4MjRjNmZmZmYsIDB4MjQwNTAwMDgsCi0weGE5MTAyNCwgMHgxMDQwMDAxMCwgMHgwLCAweDE0YTcwMDA4LAotMHgwLCAweDhkMDIwMDAwLCAweDQ0MTAyNCwgMHgxMDQwMDAwYSwKLTB4MCwgMHgzYzAxMDAwMSwgMHg4MDA0NjViLCAweGFjMjU1Y2UwLAotMHg4ZDQyMDAwMCwgMHg0NDEwMjQsIDB4MTA0MDAwMDMsIDB4MCwKLTB4M2MwMTAwMDEsIDB4YWMyNzVjZTAsIDB4M2MwMjAwMDEsIDB4OGM0MjVjZTAsCi0weDYxODJiLCAweDJjNDIwMDAxLCAweDQzMTAyNCwgMHg1NDQwZmZlNSwKLTB4NTI4NDIsIDB4OGY4MjAwNTQsIDB4M2MwMzAwMDEsIDB4OGM2MzVjZTAsCi0weDNjMDEwMDAxLCAweGFjMjI1ZGFjLCAweDEwNjAwMDJhLCAweDI0MDIwMDAxLAotMHgzYzAxMDAwMSwgMHhhYzI1NWNjOCwgMHgzYzAxMDAwMSwgMHhhYzIyNWNjYywKLTB4M2MwMjAwMDEsIDB4OGM0MjVjZTAsIDB4MTA0MDAwMjIsIDB4MCwKLTB4M2MwMjAwMDEsIDB4OGM0MjVjY2MsIDB4MTA0MDAwMGEsIDB4MjQwMjAwMDEsCi0weDNjMDEwMDAxLCAweGFjMjA1Y2NjLCAweDNjMDEwMDAxLCAweDM3MDgyMSwKLTB4YWMyMjgzYWMsIDB4M2MwMTAwMDEsIDB4YWMyMDVkNGMsIDB4M2MwMTAwMDEsCi0weGFjMjI1ZDA0LCAweDNjMDMwMDAxLCAweDc3MTgyMSwgMHg4YzYzODNhYywKLTB4MjQwMjAwMDgsIDB4MTA2MjAwMDUsIDB4MjQwMjAwMDEsIDB4YzAwNDY5NSwKLTB4MCwgMHg4MDA0NjkyLCAweDAsIDB4M2MwMzAwMDEsCi0weDhjNjM1Y2M4LCAweDEwNjIwMDA3LCAweDI0MDIwMDBlLCAweDNjMDMwMDAxLAotMHg4YzYzN2RkMCwgMHgxMDYyMDAwMywgMHgwLCAweGMwMDRlNTQsCi0weDhmODQwMjIwLCAweDhmYmYwMDEwLCAweDNlMDAwMDgsIDB4MjdiZDAwMTgsCi0weDI3YmRmZmUwLCAweDNjMDJmZGZmLCAweGFmYmYwMDE4LCAweDhlZTMwMDAwLAotMHgzYzA1MDAwMSwgMHg4Y2E1NWNjOCwgMHgzYzA0MDAwMSwgMHg4Yzg0NWNmMCwKLTB4MzQ0MmZmZmYsIDB4NjIxODI0LCAweDE0YTQwMDA4LCAweGFlZTMwMDAwLAotMHgzYzAzMDAwMSwgMHg3NzE4MjEsIDB4OGM2MzgzYWMsIDB4M2MwMjAwMDEsCi0weDhjNDI1Y2Y0LCAweDEwNjIwMDA4LCAweDAsIDB4M2MwMjAwMDEsCi0weDU3MTAyMSwgMHg4YzQyODNhYywgMHgzYzAxMDAwMSwgMHhhYzI1NWNmMCwKLTB4M2MwMTAwMDEsIDB4YWMyMjVjZjQsIDB4M2MwMzAwMDEsIDB4OGM2MzVjYzgsCi0weDI0MDIwMDAyLCAweDEwNjIwMTY5LCAweDJjNjIwMDAzLCAweDEwNDAwMDA1LAotMHgyNDAyMDAwMSwgMHgxMDYyMDAwOCwgMHgwLCAweDgwMDQ4MWMsCi0weDAsIDB4MjQwMjAwMDQsIDB4MTA2MjAwYjEsIDB4MjQwMjAwMDEsCi0weDgwMDQ4MWQsIDB4MCwgMHgzYzAyMDAwMSwgMHg1NzEwMjEsCi0weDhjNDI4M2FjLCAweDI0NDNmZmZmLCAweDJjNjIwMDA4LCAweDEwNDAwMTVhLAotMHgzMTA4MCwgMHgzYzAxMDAwMSwgMHgyMjA4MjEsIDB4OGMyMjVhYzgsCi0weDQwMDAwOCwgMHgwLCAweDNjMDMwMDAxLCAweDhjNjM1ZGJjLAotMHgyNDAyMDAwNSwgMHgxNDYyMDAxNCwgMHgwLCAweDNjMDIwMDAxLAotMHg4YzQyNWNkNCwgMHgxMDQwMDAwYSwgMHgyNDAyMDAwMywgMHhjMDA0ODIyLAotMHgwLCAweDI0MDIwMDAyLCAweDNjMDEwMDAxLCAweDM3MDgyMSwKLTB4YWMyMjgzYWMsIDB4M2MwMTAwMDEsIDB4ODAwNDZlMCwgMHhhYzIwNWNkNCwKLTB4M2MwMTAwMDEsIDB4MzcwODIxLCAweGFjMjI4M2FjLCAweDNjMDEwMDAxLAotMHg4MDA0ODFmLCAweGFjMjA1YzYwLCAweGMwMDQ4MjIsIDB4MCwKLTB4M2MwMjAwMDEsIDB4OGM0MjVjZDQsIDB4M2MwMTAwMDEsIDB4YWMyMDVjNjAsCi0weDEwNDAwMGRkLCAweDI0MDIwMDAyLCAweDNjMDEwMDAxLCAweDM3MDgyMSwKLTB4YWMyMjgzYWMsIDB4M2MwMTAwMDEsIDB4ODAwNDgxZiwgMHhhYzIwNWNkNCwKLTB4M2MwMzAwMDEsIDB4OGM2MzVkYmMsIDB4MjQwMjAwMDUsIDB4MTQ2MjAwMDMsCi0weDI0MDIwMDAxLCAweDNjMDEwMDAxLCAweGFjMjI1ZDAwLCAweGMwMDQ5Y2YsCi0weDAsIDB4M2MwMzAwMDEsIDB4OGM2MzVkMDAsIDB4ODAwNDc4ZSwKLTB4MjQwMjAwMTEsIDB4M2MwNTAwMDEsIDB4OGNhNTVjYzgsIDB4M2MwNjAwMDEsCi0weDhjYzY3ZTNjLCAweGMwMDUxMDgsIDB4MjAyMSwgMHgyNDAyMDAwNSwKLTB4M2MwMTAwMDEsIDB4YWMyMDVjZDQsIDB4M2MwMTAwMDEsIDB4MzcwODIxLAotMHg4MDA0ODFmLCAweGFjMjI4M2FjLCAweDNjMDQwMDAxLCAweDI0ODQ1YWJjLAotMHgzYzA1MDAwZiwgMHgzNGE1MDEwMCwgMHgzMDIxLCAweDM4MjEsCi0weGFmYTAwMDEwLCAweGMwMDI0MDMsIDB4YWZhMDAwMTQsIDB4ODAwNDgxZiwKLTB4MCwgMHg4ZjgyMDIyMCwgMHgzYzAzZjcwMCwgMHg0MzEwMjUsCi0weDgwMDQ3YjcsIDB4YWY4MjAyMjAsIDB4OGY4MjAyMjAsIDB4M2MwMzAwMDQsCi0weDQzMTAyNCwgMHgxNDQwMDBhOSwgMHgyNDAyMDAwNywgMHg4ZjgzMDA1NCwKLTB4M2MwMjAwMDEsIDB4OGM0MjVkYTQsIDB4MjQ2M2Q4ZjAsIDB4NDMxMDIzLAotMHgyYzQyMjcxMCwgMHgxNDQwMDBmOCwgMHgyNDAyMDAwMSwgMHg4MDA0ODFkLAotMHgwLCAweDNjMDUwMDAxLCAweDhjYTU1Y2M4LCAweGMwMDUyYTIsCi0weDIwMjEsIDB4YzAwNTM4NiwgMHgyMDIxLCAweDNjMDMwMDAxLAotMHg4YzYzN2UzNCwgMHg0NjEwMGVhLCAweDI0MDIwMDAxLCAweDNjMDIwMDA4LAotMHg2MjEwMjQsIDB4MTA0MDAwMDYsIDB4MCwgMHg4ZjgyMDIxNCwKLTB4M2MwM2ZmZmYsIDB4NDMxMDI0LCAweDgwMDQ3NDEsIDB4MzQ0MjI1MWYsCi0weDhmODIwMjE0LCAweDNjMDNmZmZmLCAweDQzMTAyNCwgMHgzNDQyMjQxZiwKLTB4YWY4MjAyMTQsIDB4OGVlMjAwMDAsIDB4M2MwMzAyMDAsIDB4NDMxMDI1LAotMHhhZWUyMDAwMCwgMHg4ZjgyMDIyMCwgMHgyNDAzZmZmYiwgMHg0MzEwMjQsCi0weGFmODIwMjIwLCAweDhmODIwMjIwLCAweDM0NDIwMDAyLCAweGFmODIwMjIwLAotMHgyNDAyMDAwOCwgMHgzYzAxMDAwMSwgMHgzNzA4MjEsIDB4YWMyMjgzYWMsCi0weDhmODIwMjIwLCAweDNjMDMwMDA0LCAweDQzMTAyNCwgMHgxNDQwMDAwNSwKLTB4MCwgMHg4ZjgyMDIyMCwgMHgzYzAzZjcwMCwgMHg0MzEwMjUsCi0weGFmODIwMjIwLCAweDNjMDMwMDAxLCAweDhjNjM1ZGJjLCAweDI0MDIwMDA1LAotMHgxNDYyMDAwYSwgMHgwLCAweDNjMDIwMDAxLCAweDk0NDI1ZGEyLAotMHgyNDQyOWZiYywgMHgyYzQyMDAwNCwgMHgxMDQwMDAwNCwgMHgyNDA0MDAxOCwKLTB4MjQwNTAwMDIsIDB4YzAwNGQ5MywgMHgyNDA2MDAyMCwgMHhjMDA0M2RkLAotMHgwLCAweDNjMDEwMDAxLCAweDgwMDQ4MWYsIDB4YWMyMDVkNTAsCi0weDNjMDIwMDAxLCAweDU3MTAyMSwgMHg4YzQyODNhYywgMHgyNDQzZmZmZiwKLTB4MmM2MjAwMDgsIDB4MTA0MDAwYWMsIDB4MzEwODAsIDB4M2MwMTAwMDEsCi0weDIyMDgyMSwgMHg4YzIyNWFlOCwgMHg0MDAwMDgsIDB4MCwKLTB4YzAwNDI5YiwgMHgwLCAweDNjMDEwMDAxLCAweGFjMjA1Y2NjLAotMHhhZjgwMDIwNCwgMHgzYzAxMDAwMSwgMHhjMDA0ODIyLCAweGFjMjA3ZTIwLAotMHgyNDAyMDAwMSwgMHgzYzAxMDAwMSwgMHhhYzIyNWNlNCwgMHgyNDAyMDAwMiwKLTB4M2MwMTAwMDEsIDB4MzcwODIxLCAweDgwMDQ4MWYsIDB4YWMyMjgzYWMsCi0weGMwMDQ4OWYsIDB4MCwgMHgzYzAzMDAwMSwgMHg4YzYzNWNlNCwKLTB4MjQwMjAwMDksIDB4MTQ2MjAwOTAsIDB4MjQwMjAwMDMsIDB4M2MwMTAwMDEsCi0weDM3MDgyMSwgMHg4MDA0ODFmLCAweGFjMjI4M2FjLCAweDNjMDIwMDAxLAotMHg4YzQyN2UzOCwgMHgzMDQyNDAwMCwgMHgxMDQwMDAwNSwgMHgwLAotMHg4ZjgyMDA0NCwgMHgzYzAzZmZmZiwgMHg4MDA0NzlmLCAweDM0NjM3ZmZmLAotMHg4ZjgyMDA0NCwgMHgyNDAzZmY3ZiwgMHg0MzEwMjQsIDB4YWY4MjAwNDQsCi0weDhmODMwMDU0LCAweDgwMDQ3YjksIDB4MjQwMjAwMDQsIDB4OGY4MzAwNTQsCi0weDNjMDIwMDAxLCAweDhjNDI1ZGE0LCAweDI0NjNkOGYwLCAweDQzMTAyMywKLTB4MmM0MjI3MTAsIDB4MTQ0MDAwNzQsIDB4MjQwMjAwMDUsIDB4M2MwMTAwMDEsCi0weDM3MDgyMSwgMHg4MDA0ODFmLCAweGFjMjI4M2FjLCAweDhmODIwMjIwLAotMHgzYzAzZjcwMCwgMHg0MzEwMjUsIDB4YWY4MjAyMjAsIDB4YWY4MDAyMDQsCi0weDNjMDEwMDAxLCAweGFjMjA3ZTIwLCAweDhmODMwMDU0LCAweDI0MDIwMDA2LAotMHgzYzAxMDAwMSwgMHgzNzA4MjEsIDB4YWMyMjgzYWMsIDB4M2MwMTAwMDEsCi0weDgwMDQ4MWYsIDB4YWMyMzVkYTQsIDB4OGY4MzAwNTQsIDB4M2MwMjAwMDEsCi0weDhjNDI1ZGE0LCAweDI0NjNmZmY2LCAweDQzMTAyMywgMHgyYzQyMDAwYSwKLTB4MTQ0MDAwNTksIDB4MCwgMHgyNDAyMDAwNywgMHgzYzAxMDAwMSwKLTB4MzcwODIxLCAweDgwMDQ4MWYsIDB4YWMyMjgzYWMsIDB4OGY4MjAyMjAsCi0weDNjMDRmNzAwLCAweDQ0MTAyNSwgMHhhZjgyMDIyMCwgMHg4ZjgyMDIyMCwKLTB4M2MwMzAzMDAsIDB4NDMxMDI0LCAweDE0NDAwMDA1LCAweDE4MjEsCi0weDhmODIwMjIwLCAweDI0MDMwMDAxLCAweDQ0MTAyNSwgMHhhZjgyMDIyMCwKLTB4MTA2MDAwNDMsIDB4MjQwMjAwMDEsIDB4OGY4MjAyMTQsIDB4M2MwM2ZmZmYsCi0weDNjMDQwMDAxLCAweDhjODQ1ZDk4LCAweDQzMTAyNCwgMHgzNDQyMjUxZiwKLTB4YWY4MjAyMTQsIDB4MjQwMjAwMDgsIDB4M2MwMTAwMDEsIDB4MzcwODIxLAotMHgxMDgwMDAwYiwgMHhhYzIyODNhYywgMHgzYzAyMDAwMSwgMHg4YzQyNWQ3NCwKLTB4MTQ0MDAwMDcsIDB4MjQwMjAwMDEsIDB4M2MwMTAwMDEsIDB4YWMyMjdkZDAsCi0weGMwMDRlNTQsIDB4OGY4NDAyMjAsIDB4ODAwNDgwYywgMHgwLAotMHg4ZjgyMDIyMCwgMHgzYzAzMDAwOCwgMHg0MzEwMjQsIDB4MTQ0MDAwMTcsCi0weDI0MDIwMDBlLCAweDNjMDEwMDAxLCAweGFjMjI3ZGQwLCAweDhlZTIwMDAwLAotMHgyMDIxLCAweDNjMDMwMjAwLCAweDQzMTAyNSwgMHhjMDA1Mzg2LAotMHhhZWUyMDAwMCwgMHg4ZjgyMDIyMCwgMHgyNDAzZmZmYiwgMHg0MzEwMjQsCi0weGFmODIwMjIwLCAweDhmODIwMjIwLCAweDM0NDIwMDAyLCAweGMwMDQzZGQsCi0weGFmODIwMjIwLCAweDNjMDUwMDAxLCAweDhjYTU1Y2M4LCAweGMwMDUyYTIsCi0weDIwMjEsIDB4ODAwNDgxZiwgMHgwLCAweDNjMDIwMDAxLAotMHg4YzQyNWQ3NCwgMHgxMDQwMDAxMCwgMHgwLCAweDNjMDIwMDAxLAotMHg4YzQyNWQ3MCwgMHgyNDQyZmZmZiwgMHgzYzAxMDAwMSwgMHhhYzIyNWQ3MCwKLTB4MTQ0MDAwMDksIDB4MjQwMjAwMDIsIDB4M2MwMTAwMDEsIDB4YWMyMDVkNzQsCi0weDNjMDEwMDAxLCAweDgwMDQ4MWYsIDB4YWMyMjVkNzAsIDB4MjQwMjAwMDEsCi0weDNjMDEwMDAxLCAweGFjMjI1Y2NjLCAweDhmYmYwMDE4LCAweDNlMDAwMDgsCi0weDI3YmQwMDIwLCAweDhmODIwMjAwLCAweDhmODIwMjIwLCAweDhmODIwMjIwLAotMHgzNDQyMDAwNCwgMHhhZjgyMDIyMCwgMHg4ZjgyMDIwMCwgMHgzYzA2MDAwMSwKLTB4OGNjNjVjYzgsIDB4MzQ0MjAwMDQsIDB4YWY4MjAyMDAsIDB4MjQwMjAwMDIsCi0weDEwYzIwMDNhLCAweDJjYzIwMDAzLCAweDEwNDAwMDA1LCAweDI0MDIwMDAxLAotMHgxMGMyMDAwOCwgMHgwLCAweDgwMDQ4NjgsIDB4MCwKLTB4MjQwMjAwMDQsIDB4MTBjMjAwMTMsIDB4MjQwMjAwMDEsIDB4ODAwNDg2OCwKLTB4MCwgMHgzYzAzMDAwMSwgMHg4YzYzNWNiOCwgMHgzYzAyMDAwMSwKLTB4OGM0MjVjYzAsIDB4M2MwNDAwMDEsIDB4OGM4NDVjZGMsIDB4M2MwNTAwMDEsCi0weDhjYTU1Y2JjLCAweGFmODYwMjAwLCAweGFmODYwMjIwLCAweDM0NjMwMDIyLAotMHg0NDEwMjUsIDB4NDUxMDI1LCAweDM0NDIwMDAyLCAweDgwMDQ4NjcsCi0weGFmODMwMjAwLCAweDNjMDMwMDAxLCAweDhjNjM1ZDk4LCAweGFmODIwMjAwLAotMHgxMDYwMDAwOSwgMHhhZjgyMDIyMCwgMHgzYzAyMDAwMSwgMHg4YzQyNWQ3NCwKLTB4MTQ0MDAwMDUsIDB4M2MwMzNmMDAsIDB4M2MwMjAwMDEsIDB4OGM0MjVjYjAsCi0weDgwMDQ4NWIsIDB4MzQ2MzAwZTAsIDB4M2MwMjAwMDEsIDB4OGM0MjVjYjAsCi0weDNjMDMzZjAwLCAweDM0NjMwMGUyLCAweDQzMTAyNSwgMHhhZjgyMDIwMCwKLTB4M2MwMzAwMDEsIDB4OGM2MzVjYjQsIDB4M2MwNGY3MDAsIDB4M2MwMjAwMDEsCi0weDhjNDI1Y2MwLCAweDNjMDUwMDAxLCAweDhjYTU1Y2RjLCAweDY0MTgyNSwKLTB4NDMxMDI1LCAweDQ1MTAyNSwgMHhhZjgyMDIyMCwgMHgzZTAwMDA4LAotMHgwLCAweDhmODIwMjIwLCAweDNjMDMwMDAxLCAweDhjNjM1Y2M4LAotMHgzNDQyMDAwNCwgMHhhZjgyMDIyMCwgMHgyNDAyMDAwMSwgMHgxMDYyMDAwZiwKLTB4MCwgMHg4ZjgzMDA1NCwgMHg4ZjgyMDA1NCwgMHgyNDYzMDAwMiwKLTB4NjIxMDIzLCAweDJjNDIwMDAzLCAweDEwNDAwMDExLCAweDAsCi0weDhmODIwMDU0LCAweDYyMTAyMywgMHgyYzQyMDAwMywgMHgxMDQwMDAwYywKLTB4MCwgMHg4MDA0ODc5LCAweDAsIDB4OGY4MzAwNTQsCi0weDhmODIwMDU0LCAweDgwMDQ4ODUsIDB4MjQ2MzAwMDcsIDB4OGY4MjAwNTQsCi0weDYyMTAyMywgMHgyYzQyMDAwOCwgMHgxNDQwZmZmYywgMHgwLAotMHg4Zjg0MDBlMCwgMHgzMDgyMDAwNywgMHgxMDQwMDAwZCwgMHgwLAotMHg4ZjgyMDA1NCwgMHg4ZjgzMDBlMCwgMHgxNDgzMDAwOSwgMHgyNDQ1MDAzMiwKLTB4OGY4MjAwNTQsIDB4YTIxMDIzLCAweDJjNDIwMDMzLCAweDEwNDAwMDA0LAotMHgwLCAweDhmODIwMGUwLCAweDEwODJmZmY5LCAweDAsCi0weDhmODIwMjIwLCAweDI0MDNmZmZkLCAweDQzMTAyNCwgMHhhZjgyMDIyMCwKLTB4M2UwMDAwOCwgMHgwLCAweDNjMDMwMDAxLCAweDhjNjM1Y2U0LAotMHgzYzAyMDAwMSwgMHg4YzQyNWNlOCwgMHg1MDYyMDAwNCwgMHgyNDYzZmZmZiwKLTB4M2MwMTAwMDEsIDB4YWMyMzVjZTgsIDB4MjQ2M2ZmZmYsIDB4MmM2MjAwMDksCi0weDEwNDAwMDlkLCAweDMxMDgwLCAweDNjMDEwMDAxLCAweDIyMDgyMSwKLTB4OGMyMjViMDgsIDB4NDAwMDA4LCAweDAsIDB4OGY4MjAwNDQsCi0weDM0NDI4MDgwLCAweGFmODIwMDQ0LCAweDhmODMwMDU0LCAweDgwMDQ5MzgsCi0weDI0MDIwMDAyLCAweDhmODMwMDU0LCAweDNjMDIwMDAxLCAweDhjNDI1ZGE4LAotMHgyNDYzZDhmMCwgMHg0MzEwMjMsIDB4MmM0MjI3MTAsIDB4MTQ0MDAwOGEsCi0weDI0MDIwMDAzLCAweDgwMDQ5NDUsIDB4MCwgMHg4ZjgyMDA0NCwKLTB4M2MwM2ZmZmYsIDB4MzQ2MzdmZmYsIDB4NDMxMDI0LCAweGFmODIwMDQ0LAotMHg4ZjgzMDA1NCwgMHg4MDA0OTM4LCAweDI0MDIwMDA0LCAweDhmODMwMDU0LAotMHgzYzAyMDAwMSwgMHg4YzQyNWRhOCwgMHgyNDYzZmZmNiwgMHg0MzEwMjMsCi0weDJjNDIwMDBhLCAweDE0NDAwMDc4LCAweDI0MDIwMDA1LCAweDgwMDQ5NDUsCi0weDAsIDB4OGY4MjAyMjAsIDB4M2MwM2Y3MDAsIDB4NDMxMDI1LAotMHhhZjgyMDIyMCwgMHg4ZjgyMDIyMCwgMHgyNDAzZmZmYiwgMHg0MzEwMjQsCi0weGFmODIwMjIwLCAweDhmODIwMjIwLCAweDM0NDIwMDAyLCAweGFmODIwMjIwLAotMHgzYzAyM2YwMCwgMHgzNDQyMDBlMCwgMHhhZjgyMDIwMCwgMHg4ZjgyMDIwMCwKLTB4MjQwM2ZmZmQsIDB4NDMxMDI0LCAweGFmODIwMjAwLCAweDI0MDQwMDAxLAotMHgzNDA1ZmZmZiwgMHhhZjg0MDIwNCwgMHg4ZjgzMDA1NCwgMHg4ZjgyMDA1NCwKLTB4ODAwNDhlYywgMHgyNDYzMDAwMSwgMHg4ZjgyMDA1NCwgMHg2MjEwMjMsCi0weDJjNDIwMDAyLCAweDE0NDBmZmZjLCAweDAsIDB4OGY4MjAyMjQsCi0weDQyMDQwLCAweGE0MTAyYiwgMHgxMDQwZmZmMiwgMHgwLAotMHg4ZjgyMDIyMCwgMHgzYzAzZjcwMCwgMHg0MzEwMjUsIDB4YWY4MjAyMjAsCi0weDhmODIwMjE0LCAweDNjMDNmZmZmLCAweDQzMTAyNCwgMHgzNDQyMjUxZiwKLTB4YWY4MjAyMTQsIDB4OGY4MjAyMjAsIDB4MjQwM2ZmZmIsIDB4NDMxMDI0LAotMHhhZjgyMDIyMCwgMHg4ZjgyMDIyMCwgMHgzYzA0ZjcwMCwgMHgzNDg0MDAwOCwKLTB4MzQ0MjAwMDIsIDB4YWY4MjAyMjAsIDB4OGY4MjAyMjAsIDB4M2MwMzNmMDAsCi0weDM0NjMwMGUyLCAweDQ0MTAyNSwgMHhhZjgyMDIyMCwgMHhhZjgzMDIwMCwKLTB4OGY4NDAwZjAsIDB4Mjc2MjE3ZjgsIDB4MTQ4MjAwMDIsIDB4MjQ4NTAwMDgsCi0weDI3NjUxMDAwLCAweDhmODIwMGY0LCAweDEwYTIwMDA3LCAweDNjMDM4MDAwLAotMHgzNDYzMDA0MCwgMHgzYzAyMDAwMSwgMHgyNDQyNWM3MCwgMHhhYzgyMDAwMCwKLTB4YWM4MzAwMDQsIDB4YWY4NTAwZjAsIDB4OGY4MzAwNTQsIDB4ODAwNDkzOCwKLTB4MjQwMjAwMDYsIDB4OGY4MzAwNTQsIDB4M2MwMjAwMDEsIDB4OGM0MjVkYTgsCi0weDI0NjNmZmY2LCAweDQzMTAyMywgMHgyYzQyMDAwYSwgMHgxNDQwMDAyMiwKLTB4MjQwMjAwMDcsIDB4ODAwNDk0NSwgMHgwLCAweDhmODIwMGUwLAotMHhhZjgyMDBlNCwgMHg4ZjgyMDBlMCwgMHhhZjgyMDBlOCwgMHg4ZjgyMDIyMCwKLTB4MzQ0MjAwMDQsIDB4YWY4MjAyMjAsIDB4OGY4MjAyMjAsIDB4MjQwM2ZmZjcsCi0weDQzMTAyNCwgMHhhZjgyMDIyMCwgMHg4ZjgyMDA0NCwgMHgzNDQyODA4MCwKLTB4YWY4MjAwNDQsIDB4OGY4MzAwNTQsIDB4MjQwMjAwMDgsIDB4M2MwMTAwMDEsCi0weGFjMjI1Y2U0LCAweDNjMDEwMDAxLCAweDgwMDQ5NDcsIDB4YWMyMzVkYTgsCi0weDhmODMwMDU0LCAweDNjMDIwMDAxLCAweDhjNDI1ZGE4LCAweDI0NjNkOGYwLAotMHg0MzEwMjMsIDB4MmM0MjI3MTAsIDB4MTQ0MDAwMDMsIDB4MjQwMjAwMDksCi0weDNjMDEwMDAxLCAweGFjMjI1Y2U0LCAweDNlMDAwMDgsIDB4MCwKLTB4MCwgMHgwLCAweDAsIDB4MjdiZGZmZDgsCi0weGFmYjIwMDE4LCAweDgwOTAyMSwgMHhhZmIzMDAxYywgMHhhMDk4MjEsCi0weGFmYjEwMDE0LCAweGMwODgyMSwgMHhhZmIwMDAxMCwgMHg4MDIxLAotMHhhZmJmMDAyMCwgMHhhNjIwMDAwMCwgMHhjMDA0ZDRiLCAweDI0MDQwMDAxLAotMHgyNjEwMDAwMSwgMHgyZTAyMDAyMCwgMHgxNDQwZmZmYiwgMHgwLAotMHhjMDA0ZDRiLCAweDIwMjEsIDB4YzAwNGQ0YiwgMHgyNDA0MDAwMSwKLTB4YzAwNGQ0YiwgMHgyNDA0MDAwMSwgMHhjMDA0ZDRiLCAweDIwMjEsCi0weDI0MTAwMDEwLCAweDI1MDEwMjQsIDB4MTA0MDAwMDIsIDB4MjAyMSwKLTB4MjQwNDAwMDEsIDB4YzAwNGQ0YiwgMHgxMDgwNDIsIDB4MTYwMGZmZmEsCi0weDI1MDEwMjQsIDB4MjQxMDAwMTAsIDB4MjcwMTAyNCwgMHgxMDQwMDAwMiwKLTB4MjAyMSwgMHgyNDA0MDAwMSwgMHhjMDA0ZDRiLCAweDEwODA0MiwKLTB4MTYwMGZmZmEsIDB4MjcwMTAyNCwgMHhjMDA0ZDcxLCAweDM0MTA4MDAwLAotMHhjMDA0ZDcxLCAweDAsIDB4YzAwNGQyYiwgMHgwLAotMHg1MDQwMDAwNSwgMHgxMDgwNDIsIDB4OTYyMjAwMDAsIDB4NTAxMDI1LAotMHhhNjIyMDAwMCwgMHgxMDgwNDIsIDB4MTYwMGZmZjcsIDB4MCwKLTB4YzAwNGQ3MSwgMHgwLCAweDhmYmYwMDIwLCAweDhmYjMwMDFjLAotMHg4ZmIyMDAxOCwgMHg4ZmIxMDAxNCwgMHg4ZmIwMDAxMCwgMHgzZTAwMDA4LAotMHgyN2JkMDAyOCwgMHgyN2JkZmZkOCwgMHhhZmIxMDAxNCwgMHg4MDg4MjEsCi0weGFmYjIwMDE4LCAweGEwOTAyMSwgMHhhZmIzMDAxYywgMHhjMDk4MjEsCi0weGFmYjAwMDEwLCAweDgwMjEsIDB4YWZiZjAwMjAsIDB4YzAwNGQ0YiwKLTB4MjQwNDAwMDEsIDB4MjYxMDAwMDEsIDB4MmUwMjAwMjAsIDB4MTQ0MGZmZmIsCi0weDAsIDB4YzAwNGQ0YiwgMHgyMDIxLCAweGMwMDRkNGIsCi0weDI0MDQwMDAxLCAweGMwMDRkNGIsIDB4MjAyMSwgMHhjMDA0ZDRiLAotMHgyNDA0MDAwMSwgMHgyNDEwMDAxMCwgMHgyMzAxMDI0LCAweDEwNDAwMDAyLAotMHgyMDIxLCAweDI0MDQwMDAxLCAweGMwMDRkNGIsIDB4MTA4MDQyLAotMHgxNjAwZmZmYSwgMHgyMzAxMDI0LCAweDI0MTAwMDEwLCAweDI1MDEwMjQsCi0weDEwNDAwMDAyLCAweDIwMjEsIDB4MjQwNDAwMDEsIDB4YzAwNGQ0YiwKLTB4MTA4MDQyLCAweDE2MDBmZmZhLCAweDI1MDEwMjQsIDB4YzAwNGQ0YiwKLTB4MjQwNDAwMDEsIDB4YzAwNGQ0YiwgMHgyMDIxLCAweDM0MTA4MDAwLAotMHg5NjYyMDAwMCwgMHg1MDEwMjQsIDB4MTA0MDAwMDIsIDB4MjAyMSwKLTB4MjQwNDAwMDEsIDB4YzAwNGQ0YiwgMHgxMDgwNDIsIDB4MTYwMGZmZjgsCi0weDAsIDB4YzAwNGQ3MSwgMHgwLCAweDhmYmYwMDIwLAotMHg4ZmIzMDAxYywgMHg4ZmIyMDAxOCwgMHg4ZmIxMDAxNCwgMHg4ZmIwMDAxMCwKLTB4M2UwMDAwOCwgMHgyN2JkMDAyOCwgMHgzYzAzMDAwMSwgMHg4YzYzNWQwMCwKLTB4M2MwMjAwMDEsIDB4OGM0MjVkNDgsIDB4MjdiZGZmZDgsIDB4YWZiZjAwMjAsCi0weGFmYjEwMDFjLCAweDEwNjIwMDAzLCAweGFmYjAwMDE4LCAweDNjMDEwMDAxLAotMHhhYzIzNWQ0OCwgMHgyNDYzZmZmZiwgMHgyYzYyMDAxMywgMHgxMDQwMDM0OSwKLTB4MzEwODAsIDB4M2MwMTAwMDEsIDB4MjIwODIxLCAweDhjMjI1YjMwLAotMHg0MDAwMDgsIDB4MCwgMHhjMDA0ZDcxLCAweDgwMjEsCi0weDM0MDI4MDAwLCAweGE3YTIwMDEwLCAweDI3YjEwMDEwLCAweGMwMDRkNGIsCi0weDI0MDQwMDAxLCAweDI2MTAwMDAxLCAweDJlMDIwMDIwLCAweDE0NDBmZmZiLAotMHgwLCAweGMwMDRkNGIsIDB4MjAyMSwgMHhjMDA0ZDRiLAotMHgyNDA0MDAwMSwgMHhjMDA0ZDRiLCAweDIwMjEsIDB4YzAwNGQ0YiwKLTB4MjQwNDAwMDEsIDB4MjQxMDAwMTAsIDB4MzIwMjAwMDEsIDB4MTA0MDAwMDIsCi0weDIwMjEsIDB4MjQwNDAwMDEsIDB4YzAwNGQ0YiwgMHgxMDgwNDIsCi0weDE2MDBmZmZhLCAweDMyMDIwMDAxLCAweDI0MTAwMDEwLCAweGMwMDRkNGIsCi0weDIwMjEsIDB4MTA4MDQyLCAweDE2MDBmZmZjLCAweDAsCi0weGMwMDRkNGIsIDB4MjQwNDAwMDEsIDB4YzAwNGQ0YiwgMHgyMDIxLAotMHgzNDEwODAwMCwgMHg5NjIyMDAwMCwgMHg1MDEwMjQsIDB4MTA0MDAwMDIsCi0weDIwMjEsIDB4MjQwNDAwMDEsIDB4YzAwNGQ0YiwgMHgxMDgwNDIsCi0weDE2MDBmZmY4LCAweDAsIDB4YzAwNGQ3MSwgMHgwLAotMHg4MDA0ZDI0LCAweDI0MDIwMDAyLCAweDI3YjEwMDEwLCAweGE3YTAwMDEwLAotMHg4MDIxLCAweGMwMDRkNGIsIDB4MjQwNDAwMDEsIDB4MjYxMDAwMDEsCi0weDJlMDIwMDIwLCAweDE0NDBmZmZiLCAweDAsIDB4YzAwNGQ0YiwKLTB4MjAyMSwgMHhjMDA0ZDRiLCAweDI0MDQwMDAxLCAweGMwMDRkNGIsCi0weDI0MDQwMDAxLCAweGMwMDRkNGIsIDB4MjAyMSwgMHgyNDEwMDAxMCwKLTB4MzIwMjAwMDEsIDB4MTA0MDAwMDIsIDB4MjAyMSwgMHgyNDA0MDAwMSwKLTB4YzAwNGQ0YiwgMHgxMDgwNDIsIDB4MTYwMGZmZmEsIDB4MzIwMjAwMDEsCi0weDI0MTAwMDEwLCAweGMwMDRkNGIsIDB4MjAyMSwgMHgxMDgwNDIsCi0weDE2MDBmZmZjLCAweDAsIDB4YzAwNGQ3MSwgMHgzNDEwODAwMCwKLTB4YzAwNGQ3MSwgMHgwLCAweGMwMDRkMmIsIDB4MCwKLTB4NTA0MDAwMDUsIDB4MTA4MDQyLCAweDk2MjIwMDAwLCAweDUwMTAyNSwKLTB4YTYyMjAwMDAsIDB4MTA4MDQyLCAweDE2MDBmZmY3LCAweDAsCi0weGMwMDRkNzEsIDB4MCwgMHg5N2EyMDAxMCwgMHgzMDQyODAwMCwKLTB4MTQ0MDAyZGMsIDB4MjQwMjAwMDMsIDB4ODAwNGQyNCwgMHgwLAotMHgyNDAyMTIwMCwgMHhhN2EyMDAxMCwgMHgyN2IxMDAxMCwgMHg4MDIxLAotMHhjMDA0ZDRiLCAweDI0MDQwMDAxLCAweDI2MTAwMDAxLCAweDJlMDIwMDIwLAotMHgxNDQwZmZmYiwgMHgwLCAweGMwMDRkNGIsIDB4MjAyMSwKLTB4YzAwNGQ0YiwgMHgyNDA0MDAwMSwgMHhjMDA0ZDRiLCAweDIwMjEsCi0weGMwMDRkNGIsIDB4MjQwNDAwMDEsIDB4MjQxMDAwMTAsIDB4MzIwMjAwMDEsCi0weDEwNDAwMDAyLCAweDIwMjEsIDB4MjQwNDAwMDEsIDB4YzAwNGQ0YiwKLTB4MTA4MDQyLCAweDE2MDBmZmZhLCAweDMyMDIwMDAxLCAweDI0MTAwMDEwLAotMHhjMDA0ZDRiLCAweDIwMjEsIDB4MTA4MDQyLCAweDE2MDBmZmZjLAotMHgwLCAweGMwMDRkNGIsIDB4MjQwNDAwMDEsIDB4YzAwNGQ0YiwKLTB4MjAyMSwgMHgzNDEwODAwMCwgMHg5NjIyMDAwMCwgMHg1MDEwMjQsCi0weDEwNDAwMDAyLCAweDIwMjEsIDB4MjQwNDAwMDEsIDB4YzAwNGQ0YiwKLTB4MTA4MDQyLCAweDE2MDBmZmY4LCAweDAsIDB4YzAwNGQ3MSwKLTB4MCwgMHg4ZjgzMDA1NCwgMHg4MDA0ZDE2LCAweDI0MDIwMDA0LAotMHg4ZjgzMDA1NCwgMHgzYzAyMDAwMSwgMHg4YzQyNWRiOCwgMHgyNDYzZmY5YywKLTB4NDMxMDIzLCAweDJjNDIwMDY0LCAweDE0NDAwMjllLCAweDI0MDIwMDAyLAotMHgzYzAzMDAwMSwgMHg4YzYzNWRiYywgMHgxMDYyMDI5NywgMHgyYzYyMDAwMywKLTB4MTQ0MDAyOTYsIDB4MjQwMjAwMTEsIDB4MjQwMjAwMDMsIDB4MTA2MjAwMDUsCi0weDI0MDIwMDA0LCAweDEwNjIwMjkxLCAweDI0MDIwMDBmLCAweDgwMDRkMjQsCi0weDI0MDIwMDExLCAweDgwMDRkMjQsIDB4MjQwMjAwMDUsIDB4MjQwMjAwMTQsCi0weGE3YTIwMDEwLCAweDI3YjEwMDEwLCAweDgwMjEsIDB4YzAwNGQ0YiwKLTB4MjQwNDAwMDEsIDB4MjYxMDAwMDEsIDB4MmUwMjAwMjAsIDB4MTQ0MGZmZmIsCi0weDAsIDB4YzAwNGQ0YiwgMHgyMDIxLCAweGMwMDRkNGIsCi0weDI0MDQwMDAxLCAweGMwMDRkNGIsIDB4MjAyMSwgMHhjMDA0ZDRiLAotMHgyNDA0MDAwMSwgMHgyNDEwMDAxMCwgMHgzMjAyMDAwMSwgMHgxMDQwMDAwMiwKLTB4MjAyMSwgMHgyNDA0MDAwMSwgMHhjMDA0ZDRiLCAweDEwODA0MiwKLTB4MTYwMGZmZmEsIDB4MzIwMjAwMDEsIDB4MjQxMDAwMTAsIDB4MzIwMjAwMTIsCi0weDEwNDAwMDAyLCAweDIwMjEsIDB4MjQwNDAwMDEsIDB4YzAwNGQ0YiwKLTB4MTA4MDQyLCAweDE2MDBmZmZhLCAweDMyMDIwMDEyLCAweGMwMDRkNGIsCi0weDI0MDQwMDAxLCAweGMwMDRkNGIsIDB4MjAyMSwgMHgzNDEwODAwMCwKLTB4OTYyMjAwMDAsIDB4NTAxMDI0LCAweDEwNDAwMDAyLCAweDIwMjEsCi0weDI0MDQwMDAxLCAweGMwMDRkNGIsIDB4MTA4MDQyLCAweDE2MDBmZmY4LAotMHgwLCAweGMwMDRkNzEsIDB4MCwgMHg4ZjgzMDA1NCwKLTB4ODAwNGQxNiwgMHgyNDAyMDAwNiwgMHg4ZjgzMDA1NCwgMHgzYzAyMDAwMSwKLTB4OGM0MjVkYjgsIDB4MjQ2M2ZmOWMsIDB4NDMxMDIzLCAweDJjNDIwMDY0LAotMHgxNDQwMDI1MCwgMHgyNDAyMDAwNywgMHg4MDA0ZDI0LCAweDAsCi0weDI0MDIwMDA2LCAweGE3YTIwMDEwLCAweDI3YjEwMDEwLCAweDgwMjEsCi0weGMwMDRkNGIsIDB4MjQwNDAwMDEsIDB4MjYxMDAwMDEsIDB4MmUwMjAwMjAsCi0weDE0NDBmZmZiLCAweDAsIDB4YzAwNGQ0YiwgMHgyMDIxLAotMHhjMDA0ZDRiLCAweDI0MDQwMDAxLCAweGMwMDRkNGIsIDB4MjAyMSwKLTB4YzAwNGQ0YiwgMHgyNDA0MDAwMSwgMHgyNDEwMDAxMCwgMHgzMjAyMDAwMSwKLTB4MTA0MDAwMDIsIDB4MjAyMSwgMHgyNDA0MDAwMSwgMHhjMDA0ZDRiLAotMHgxMDgwNDIsIDB4MTYwMGZmZmEsIDB4MzIwMjAwMDEsIDB4MjQxMDAwMTAsCi0weDMyMDIwMDEzLCAweDEwNDAwMDAyLCAweDIwMjEsIDB4MjQwNDAwMDEsCi0weGMwMDRkNGIsIDB4MTA4MDQyLCAweDE2MDBmZmZhLCAweDMyMDIwMDEzLAotMHhjMDA0ZDRiLCAweDI0MDQwMDAxLCAweGMwMDRkNGIsIDB4MjAyMSwKLTB4MzQxMDgwMDAsIDB4OTYyMjAwMDAsIDB4NTAxMDI0LCAweDEwNDAwMDAyLAotMHgyMDIxLCAweDI0MDQwMDAxLCAweGMwMDRkNGIsIDB4MTA4MDQyLAotMHgxNjAwZmZmOCwgMHgwLCAweGMwMDRkNzEsIDB4MCwKLTB4OGY4MzAwNTQsIDB4ODAwNGQxNiwgMHgyNDAyMDAwOCwgMHg4ZjgzMDA1NCwKLTB4M2MwMjAwMDEsIDB4OGM0MjVkYjgsIDB4MjQ2M2ZmOWMsIDB4NDMxMDIzLAotMHgyYzQyMDA2NCwgMHgxNDQwMDIwZiwgMHgyNDAyMDAwOSwgMHg4MDA0ZDI0LAotMHgwLCAweDI3YjEwMDEwLCAweGE3YTAwMDEwLCAweDgwMjEsCi0weGMwMDRkNGIsIDB4MjQwNDAwMDEsIDB4MjYxMDAwMDEsIDB4MmUwMjAwMjAsCi0weDE0NDBmZmZiLCAweDAsIDB4YzAwNGQ0YiwgMHgyMDIxLAotMHhjMDA0ZDRiLCAweDI0MDQwMDAxLCAweGMwMDRkNGIsIDB4MjQwNDAwMDEsCi0weGMwMDRkNGIsIDB4MjAyMSwgMHgyNDEwMDAxMCwgMHgzMjAyMDAwMSwKLTB4MTA0MDAwMDIsIDB4MjAyMSwgMHgyNDA0MDAwMSwgMHhjMDA0ZDRiLAotMHgxMDgwNDIsIDB4MTYwMGZmZmEsIDB4MzIwMjAwMDEsIDB4MjQxMDAwMTAsCi0weDMyMDIwMDE4LCAweDEwNDAwMDAyLCAweDIwMjEsIDB4MjQwNDAwMDEsCi0weGMwMDRkNGIsIDB4MTA4MDQyLCAweDE2MDBmZmZhLCAweDMyMDIwMDE4LAotMHhjMDA0ZDcxLCAweDM0MTA4MDAwLCAweGMwMDRkNzEsIDB4MCwKLTB4YzAwNGQyYiwgMHgwLCAweDUwNDAwMDA1LCAweDEwODA0MiwKLTB4OTYyMjAwMDAsIDB4NTAxMDI1LCAweGE2MjIwMDAwLCAweDEwODA0MiwKLTB4MTYwMGZmZjcsIDB4MCwgMHhjMDA0ZDcxLCAweDgwMjEsCi0weDk3YTIwMDEwLCAweDI3YjEwMDEwLCAweDM0NDIwMDAxLCAweGE3YTIwMDEwLAotMHhjMDA0ZDRiLCAweDI0MDQwMDAxLCAweDI2MTAwMDAxLCAweDJlMDIwMDIwLAotMHgxNDQwZmZmYiwgMHgwLCAweGMwMDRkNGIsIDB4MjAyMSwKLTB4YzAwNGQ0YiwgMHgyNDA0MDAwMSwgMHhjMDA0ZDRiLCAweDIwMjEsCi0weGMwMDRkNGIsIDB4MjQwNDAwMDEsIDB4MjQxMDAwMTAsIDB4MzIwMjAwMDEsCi0weDEwNDAwMDAyLCAweDIwMjEsIDB4MjQwNDAwMDEsIDB4YzAwNGQ0YiwKLTB4MTA4MDQyLCAweDE2MDBmZmZhLCAweDMyMDIwMDAxLCAweDI0MTAwMDEwLAotMHgzMjAyMDAxOCwgMHgxMDQwMDAwMiwgMHgyMDIxLCAweDI0MDQwMDAxLAotMHhjMDA0ZDRiLCAweDEwODA0MiwgMHgxNjAwZmZmYSwgMHgzMjAyMDAxOCwKLTB4YzAwNGQ0YiwgMHgyNDA0MDAwMSwgMHhjMDA0ZDRiLCAweDIwMjEsCi0weDM0MTA4MDAwLCAweDk2MjIwMDAwLCAweDUwMTAyNCwgMHgxMDQwMDAwMiwKLTB4MjAyMSwgMHgyNDA0MDAwMSwgMHhjMDA0ZDRiLCAweDEwODA0MiwKLTB4MTYwMGZmZjgsIDB4MCwgMHhjMDA0ZDcxLCAweDAsCi0weDhmODMwMDU0LCAweDgwMDRkMTYsIDB4MjQwMjAwMGEsIDB4OGY4MzAwNTQsCi0weDNjMDIwMDAxLCAweDhjNDI1ZGI4LCAweDI0NjNmZjljLCAweDQzMTAyMywKLTB4MmM0MjAwNjQsIDB4MTQ0MDAxOWIsIDB4MjQwMjAwMGIsIDB4ODAwNGQyNCwKLTB4MCwgMHgyN2IxMDAxMCwgMHhhN2EwMDAxMCwgMHg4MDIxLAotMHhjMDA0ZDRiLCAweDI0MDQwMDAxLCAweDI2MTAwMDAxLCAweDJlMDIwMDIwLAotMHgxNDQwZmZmYiwgMHgwLCAweGMwMDRkNGIsIDB4MjAyMSwKLTB4YzAwNGQ0YiwgMHgyNDA0MDAwMSwgMHhjMDA0ZDRiLCAweDI0MDQwMDAxLAotMHhjMDA0ZDRiLCAweDIwMjEsIDB4MjQxMDAwMTAsIDB4MzIwMjAwMDEsCi0weDEwNDAwMDAyLCAweDIwMjEsIDB4MjQwNDAwMDEsIDB4YzAwNGQ0YiwKLTB4MTA4MDQyLCAweDE2MDBmZmZhLCAweDMyMDIwMDAxLCAweDI0MTAwMDEwLAotMHgzMjAyMDAxNywgMHgxMDQwMDAwMiwgMHgyMDIxLCAweDI0MDQwMDAxLAotMHhjMDA0ZDRiLCAweDEwODA0MiwgMHgxNjAwZmZmYSwgMHgzMjAyMDAxNywKLTB4YzAwNGQ3MSwgMHgzNDEwODAwMCwgMHhjMDA0ZDcxLCAweDAsCi0weGMwMDRkMmIsIDB4MCwgMHg1MDQwMDAwNSwgMHgxMDgwNDIsCi0weDk2MjIwMDAwLCAweDUwMTAyNSwgMHhhNjIyMDAwMCwgMHgxMDgwNDIsCi0weDE2MDBmZmY3LCAweDAsIDB4YzAwNGQ3MSwgMHg4MDIxLAotMHg5N2EyMDAxMCwgMHgyN2IxMDAxMCwgMHgzNDQyMDcwMCwgMHhhN2EyMDAxMCwKLTB4YzAwNGQ0YiwgMHgyNDA0MDAwMSwgMHgyNjEwMDAwMSwgMHgyZTAyMDAyMCwKLTB4MTQ0MGZmZmIsIDB4MCwgMHhjMDA0ZDRiLCAweDIwMjEsCi0weGMwMDRkNGIsIDB4MjQwNDAwMDEsIDB4YzAwNGQ0YiwgMHgyMDIxLAotMHhjMDA0ZDRiLCAweDI0MDQwMDAxLCAweDI0MTAwMDEwLCAweDMyMDIwMDAxLAotMHgxMDQwMDAwMiwgMHgyMDIxLCAweDI0MDQwMDAxLCAweGMwMDRkNGIsCi0weDEwODA0MiwgMHgxNjAwZmZmYSwgMHgzMjAyMDAwMSwgMHgyNDEwMDAxMCwKLTB4MzIwMjAwMTcsIDB4MTA0MDAwMDIsIDB4MjAyMSwgMHgyNDA0MDAwMSwKLTB4YzAwNGQ0YiwgMHgxMDgwNDIsIDB4MTYwMGZmZmEsIDB4MzIwMjAwMTcsCi0weGMwMDRkNGIsIDB4MjQwNDAwMDEsIDB4YzAwNGQ0YiwgMHgyMDIxLAotMHgzNDEwODAwMCwgMHg5NjIyMDAwMCwgMHg1MDEwMjQsIDB4MTA0MDAwMDIsCi0weDIwMjEsIDB4MjQwNDAwMDEsIDB4YzAwNGQ0YiwgMHgxMDgwNDIsCi0weDE2MDBmZmY4LCAweDAsIDB4YzAwNGQ3MSwgMHgwLAotMHg4ZjgzMDA1NCwgMHg4MDA0ZDE2LCAweDI0MDIwMDBjLCAweDhmODMwMDU0LAotMHgzYzAyMDAwMSwgMHg4YzQyNWRiOCwgMHgyNDYzZmY5YywgMHg0MzEwMjMsCi0weDJjNDIwMDY0LCAweDE0NDAwMTI3LCAweDI0MDIwMDEyLCAweDgwMDRkMjQsCi0weDAsIDB4MjdiMTAwMTAsIDB4YTdhMDAwMTAsIDB4ODAyMSwKLTB4YzAwNGQ0YiwgMHgyNDA0MDAwMSwgMHgyNjEwMDAwMSwgMHgyZTAyMDAyMCwKLTB4MTQ0MGZmZmIsIDB4MCwgMHhjMDA0ZDRiLCAweDIwMjEsCi0weGMwMDRkNGIsIDB4MjQwNDAwMDEsIDB4YzAwNGQ0YiwgMHgyNDA0MDAwMSwKLTB4YzAwNGQ0YiwgMHgyMDIxLCAweDI0MTAwMDEwLCAweDMyMDIwMDAxLAotMHgxMDQwMDAwMiwgMHgyMDIxLCAweDI0MDQwMDAxLCAweGMwMDRkNGIsCi0weDEwODA0MiwgMHgxNjAwZmZmYSwgMHgzMjAyMDAwMSwgMHgyNDEwMDAxMCwKLTB4MzIwMjAwMTQsIDB4MTA0MDAwMDIsIDB4MjAyMSwgMHgyNDA0MDAwMSwKLTB4YzAwNGQ0YiwgMHgxMDgwNDIsIDB4MTYwMGZmZmEsIDB4MzIwMjAwMTQsCi0weGMwMDRkNzEsIDB4MzQxMDgwMDAsIDB4YzAwNGQ3MSwgMHgwLAotMHhjMDA0ZDJiLCAweDAsIDB4NTA0MDAwMDUsIDB4MTA4MDQyLAotMHg5NjIyMDAwMCwgMHg1MDEwMjUsIDB4YTYyMjAwMDAsIDB4MTA4MDQyLAotMHgxNjAwZmZmNywgMHgwLCAweGMwMDRkNzEsIDB4ODAyMSwKLTB4OTdhMjAwMTAsIDB4MjdiMTAwMTAsIDB4MzQ0MjAwMTAsIDB4YTdhMjAwMTAsCi0weGMwMDRkNGIsIDB4MjQwNDAwMDEsIDB4MjYxMDAwMDEsIDB4MmUwMjAwMjAsCi0weDE0NDBmZmZiLCAweDAsIDB4YzAwNGQ0YiwgMHgyMDIxLAotMHhjMDA0ZDRiLCAweDI0MDQwMDAxLCAweGMwMDRkNGIsIDB4MjAyMSwKLTB4YzAwNGQ0YiwgMHgyNDA0MDAwMSwgMHgyNDEwMDAxMCwgMHgzMjAyMDAwMSwKLTB4MTA0MDAwMDIsIDB4MjAyMSwgMHgyNDA0MDAwMSwgMHhjMDA0ZDRiLAotMHgxMDgwNDIsIDB4MTYwMGZmZmEsIDB4MzIwMjAwMDEsIDB4MjQxMDAwMTAsCi0weDMyMDIwMDE0LCAweDEwNDAwMDAyLCAweDIwMjEsIDB4MjQwNDAwMDEsCi0weGMwMDRkNGIsIDB4MTA4MDQyLCAweDE2MDBmZmZhLCAweDMyMDIwMDE0LAotMHhjMDA0ZDRiLCAweDI0MDQwMDAxLCAweGMwMDRkNGIsIDB4MjAyMSwKLTB4MzQxMDgwMDAsIDB4OTYyMjAwMDAsIDB4NTAxMDI0LCAweDEwNDAwMDAyLAotMHgyMDIxLCAweDI0MDQwMDAxLCAweGMwMDRkNGIsIDB4MTA4MDQyLAotMHgxNjAwZmZmOCwgMHgwLCAweGMwMDRkNzEsIDB4MCwKLTB4OGY4MzAwNTQsIDB4ODAwNGQxNiwgMHgyNDAyMDAxMywgMHg4ZjgzMDA1NCwKLTB4M2MwMjAwMDEsIDB4OGM0MjVkYjgsIDB4MjQ2M2ZmOWMsIDB4NDMxMDIzLAotMHgyYzQyMDA2NCwgMHgxNDQwMDBiMywgMHgyNDAyMDAwZCwgMHg4MDA0ZDI0LAotMHgwLCAweDI3YjEwMDEwLCAweGE3YTAwMDEwLCAweDgwMjEsCi0weGMwMDRkNGIsIDB4MjQwNDAwMDEsIDB4MjYxMDAwMDEsIDB4MmUwMjAwMjAsCi0weDE0NDBmZmZiLCAweDAsIDB4YzAwNGQ0YiwgMHgyMDIxLAotMHhjMDA0ZDRiLCAweDI0MDQwMDAxLCAweGMwMDRkNGIsIDB4MjQwNDAwMDEsCi0weGMwMDRkNGIsIDB4MjAyMSwgMHgyNDEwMDAxMCwgMHgzMjAyMDAwMSwKLTB4MTA0MDAwMDIsIDB4MjAyMSwgMHgyNDA0MDAwMSwgMHhjMDA0ZDRiLAotMHgxMDgwNDIsIDB4MTYwMGZmZmEsIDB4MzIwMjAwMDEsIDB4MjQxMDAwMTAsCi0weDMyMDIwMDE4LCAweDEwNDAwMDAyLCAweDIwMjEsIDB4MjQwNDAwMDEsCi0weGMwMDRkNGIsIDB4MTA4MDQyLCAweDE2MDBmZmZhLCAweDMyMDIwMDE4LAotMHhjMDA0ZDcxLCAweDM0MTA4MDAwLCAweGMwMDRkNzEsIDB4MCwKLTB4YzAwNGQyYiwgMHgwLCAweDUwNDAwMDA1LCAweDEwODA0MiwKLTB4OTYyMjAwMDAsIDB4NTAxMDI1LCAweGE2MjIwMDAwLCAweDEwODA0MiwKLTB4MTYwMGZmZjcsIDB4MCwgMHhjMDA0ZDcxLCAweDgwMjEsCi0weDk3YTIwMDEwLCAweDI3YjEwMDEwLCAweDMwNDJmZmZlLCAweGE3YTIwMDEwLAotMHhjMDA0ZDRiLCAweDI0MDQwMDAxLCAweDI2MTAwMDAxLCAweDJlMDIwMDIwLAotMHgxNDQwZmZmYiwgMHgwLCAweGMwMDRkNGIsIDB4MjAyMSwKLTB4YzAwNGQ0YiwgMHgyNDA0MDAwMSwgMHhjMDA0ZDRiLCAweDIwMjEsCi0weGMwMDRkNGIsIDB4MjQwNDAwMDEsIDB4MjQxMDAwMTAsIDB4MzIwMjAwMDEsCi0weDEwNDAwMDAyLCAweDIwMjEsIDB4MjQwNDAwMDEsIDB4YzAwNGQ0YiwKLTB4MTA4MDQyLCAweDE2MDBmZmZhLCAweDMyMDIwMDAxLCAweDI0MTAwMDEwLAotMHgzMjAyMDAxOCwgMHgxMDQwMDAwMiwgMHgyMDIxLCAweDI0MDQwMDAxLAotMHhjMDA0ZDRiLCAweDEwODA0MiwgMHgxNjAwZmZmYSwgMHgzMjAyMDAxOCwKLTB4YzAwNGQ0YiwgMHgyNDA0MDAwMSwgMHhjMDA0ZDRiLCAweDIwMjEsCi0weDM0MTA4MDAwLCAweDk2MjIwMDAwLCAweDUwMTAyNCwgMHgxMDQwMDAwMiwKLTB4MjAyMSwgMHgyNDA0MDAwMSwgMHhjMDA0ZDRiLCAweDEwODA0MiwKLTB4MTYwMGZmZjgsIDB4MCwgMHhjMDA0ZDcxLCAweDAsCi0weDhmODMwMDU0LCAweDgwMDRkMTYsIDB4MjQwMjAwMGUsIDB4MjQwMjA4NDAsCi0weGE3YTIwMDEwLCAweDI3YjEwMDEwLCAweDgwMjEsIDB4YzAwNGQ0YiwKLTB4MjQwNDAwMDEsIDB4MjYxMDAwMDEsIDB4MmUwMjAwMjAsIDB4MTQ0MGZmZmIsCi0weDAsIDB4YzAwNGQ0YiwgMHgyMDIxLCAweGMwMDRkNGIsCi0weDI0MDQwMDAxLCAweGMwMDRkNGIsIDB4MjAyMSwgMHhjMDA0ZDRiLAotMHgyNDA0MDAwMSwgMHgyNDEwMDAxMCwgMHgzMjAyMDAwMSwgMHgxMDQwMDAwMiwKLTB4MjAyMSwgMHgyNDA0MDAwMSwgMHhjMDA0ZDRiLCAweDEwODA0MiwKLTB4MTYwMGZmZmEsIDB4MzIwMjAwMDEsIDB4MjQxMDAwMTAsIDB4MzIwMjAwMTMsCi0weDEwNDAwMDAyLCAweDIwMjEsIDB4MjQwNDAwMDEsIDB4YzAwNGQ0YiwKLTB4MTA4MDQyLCAweDE2MDBmZmZhLCAweDMyMDIwMDEzLCAweGMwMDRkNGIsCi0weDI0MDQwMDAxLCAweGMwMDRkNGIsIDB4MjAyMSwgMHgzNDEwODAwMCwKLTB4OTYyMjAwMDAsIDB4NTAxMDI0LCAweDEwNDAwMDAyLCAweDIwMjEsCi0weDI0MDQwMDAxLCAweGMwMDRkNGIsIDB4MTA4MDQyLCAweDE2MDBmZmY4LAotMHgwLCAweGMwMDRkNzEsIDB4MCwgMHg4ZjgzMDA1NCwKLTB4MjQwMjAwMTAsIDB4M2MwMTAwMDEsIDB4YWMyMjVkMDAsIDB4M2MwMTAwMDEsCi0weDgwMDRkMjYsIDB4YWMyMzVkYjgsIDB4OGY4MzAwNTQsIDB4M2MwMjAwMDEsCi0weDhjNDI1ZGI4LCAweDI0NjNmZjljLCAweDQzMTAyMywgMHgyYzQyMDA2NCwKLTB4MTQ0MDAwMDQsIDB4MCwgMHgyNDAyMDAxMSwgMHgzYzAxMDAwMSwKLTB4YWMyMjVkMDAsIDB4OGZiZjAwMjAsIDB4OGZiMTAwMWMsIDB4OGZiMDAwMTgsCi0weDNlMDAwMDgsIDB4MjdiZDAwMjgsIDB4OGY4NTAwNDQsIDB4OGY4MjAwNDQsCi0weDNjMDMwMDAxLCAweDQzMTAyNSwgMHgzYzAzMDAwOCwgMHhhZjgyMDA0NCwKLTB4OGY4NDAwNTQsIDB4OGY4MjAwNTQsIDB4YTMyODI0LCAweDgwMDRkMzcsCi0weDI0ODQwMDAxLCAweDhmODIwMDU0LCAweDgyMTAyMywgMHgyYzQyMDAwMiwKLTB4MTQ0MGZmZmMsIDB4MCwgMHg4ZjgyMDA0NCwgMHgzYzAzZmZmZSwKLTB4MzQ2M2ZmZmYsIDB4NDMxMDI0LCAweGFmODIwMDQ0LCAweDhmODMwMDU0LAotMHg4ZjgyMDA1NCwgMHg4MDA0ZDQ1LCAweDI0NjMwMDAxLCAweDhmODIwMDU0LAotMHg2MjEwMjMsIDB4MmM0MjAwMDIsIDB4MTQ0MGZmZmMsIDB4MCwKLTB4M2UwMDAwOCwgMHhhMDEwMjEsIDB4OGY4MzAwNDQsIDB4M2MwMmZmZjAsCi0weDM0NDJmZmZmLCAweDQyNDgwLCAweDYyMTgyNCwgMHgzYzAyMDAwMiwKLTB4ODIyMDI1LCAweDY0MTgyNSwgMHhhZjgzMDA0NCwgMHg4ZjgyMDA0NCwKLTB4M2MwM2ZmZmUsIDB4MzQ2M2ZmZmYsIDB4NDMxMDI0LCAweGFmODIwMDQ0LAotMHg4ZjgzMDA1NCwgMHg4ZjgyMDA1NCwgMHg4MDA0ZDVlLCAweDI0NjMwMDAxLAotMHg4ZjgyMDA1NCwgMHg2MjEwMjMsIDB4MmM0MjAwMDIsIDB4MTQ0MGZmZmMsCi0weDAsIDB4OGY4MjAwNDQsIDB4M2MwMzAwMDEsIDB4NDMxMDI1LAotMHhhZjgyMDA0NCwgMHg4ZjgzMDA1NCwgMHg4ZjgyMDA1NCwgMHg4MDA0ZDZiLAotMHgyNDYzMDAwMSwgMHg4ZjgyMDA1NCwgMHg2MjEwMjMsIDB4MmM0MjAwMDIsCi0weDE0NDBmZmZjLCAweDAsIDB4M2UwMDAwOCwgMHgwLAotMHg4ZjgyMDA0NCwgMHgzYzAzZmZmMCwgMHgzNDYzZmZmZiwgMHg0MzEwMjQsCi0weGFmODIwMDQ0LCAweDhmODIwMDQ0LCAweDNjMDMwMDAxLCAweDQzMTAyNSwKLTB4YWY4MjAwNDQsIDB4OGY4MzAwNTQsIDB4OGY4MjAwNTQsIDB4ODAwNGQ3ZiwKLTB4MjQ2MzAwMDEsIDB4OGY4MjAwNTQsIDB4NjIxMDIzLCAweDJjNDIwMDAyLAotMHgxNDQwZmZmYywgMHgwLCAweDhmODIwMDQ0LCAweDNjMDNmZmZlLAotMHgzNDYzZmZmZiwgMHg0MzEwMjQsIDB4YWY4MjAwNDQsIDB4OGY4MzAwNTQsCi0weDhmODIwMDU0LCAweDgwMDRkOGQsIDB4MjQ2MzAwMDEsIDB4OGY4MjAwNTQsCi0weDYyMTAyMywgMHgyYzQyMDAwMiwgMHgxNDQwZmZmYywgMHgwLAotMHgzZTAwMDA4LCAweDAsIDB4MjdiZGZmYzgsIDB4YWZiMzAwMjQsCi0weDgwOTgyMSwgMHhhZmI1MDAyYywgMHhhMGE4MjEsIDB4YWZiMjAwMjAsCi0weGMwOTAyMSwgMHgzMmEyZmZmZiwgMHhhZmJmMDAzMCwgMHhhZmI0MDAyOCwKLTB4YWZiMTAwMWMsIDB4YWZiMDAwMTgsIDB4MTQ0MDAwMzQsIDB4YTdiMjAwMTAsCi0weDMyNzFmZmZmLCAweDI3YjIwMDEwLCAweDgwMjEsIDB4YzAwNGQ0YiwKLTB4MjQwNDAwMDEsIDB4MjYxMDAwMDEsIDB4MmUwMjAwMjAsIDB4MTQ0MGZmZmIsCi0weDAsIDB4YzAwNGQ0YiwgMHgyMDIxLCAweGMwMDRkNGIsCi0weDI0MDQwMDAxLCAweGMwMDRkNGIsIDB4MjAyMSwgMHhjMDA0ZDRiLAotMHgyNDA0MDAwMSwgMHgyNDEwMDAxMCwgMHgzMjAyMDAwMSwgMHgxMDQwMDAwMiwKLTB4MjAyMSwgMHgyNDA0MDAwMSwgMHhjMDA0ZDRiLCAweDEwODA0MiwKLTB4MTYwMGZmZmEsIDB4MzIwMjAwMDEsIDB4MjQxMDAwMTAsIDB4MjMwMTAyNCwKLTB4MTA0MDAwMDIsIDB4MjAyMSwgMHgyNDA0MDAwMSwgMHhjMDA0ZDRiLAotMHgxMDgwNDIsIDB4MTYwMGZmZmEsIDB4MjMwMTAyNCwgMHhjMDA0ZDRiLAotMHgyNDA0MDAwMSwgMHhjMDA0ZDRiLCAweDIwMjEsIDB4MzQxMDgwMDAsCi0weDk2NDIwMDAwLCAweDUwMTAyNCwgMHgxMDQwMDAwMiwgMHgyMDIxLAotMHgyNDA0MDAwMSwgMHhjMDA0ZDRiLCAweDEwODA0MiwgMHgxMjAwMDA3NSwKLTB4MCwgMHg4MDA0ZGM5LCAweDAsIDB4MzI3NGZmZmYsCi0weDI3YjEwMDEwLCAweGE3YTAwMDEwLCAweDgwMjEsIDB4YzAwNGQ0YiwKLTB4MjQwNDAwMDEsIDB4MjYxMDAwMDEsIDB4MmUwMjAwMjAsIDB4MTQ0MGZmZmIsCi0weDAsIDB4YzAwNGQ0YiwgMHgyMDIxLCAweGMwMDRkNGIsCi0weDI0MDQwMDAxLCAweGMwMDRkNGIsIDB4MjQwNDAwMDEsIDB4YzAwNGQ0YiwKLTB4MjAyMSwgMHgyNDEwMDAxMCwgMHgzMjAyMDAwMSwgMHgxMDQwMDAwMiwKLTB4MjAyMSwgMHgyNDA0MDAwMSwgMHhjMDA0ZDRiLCAweDEwODA0MiwKLTB4MTYwMGZmZmEsIDB4MzIwMjAwMDEsIDB4MjQxMDAwMTAsIDB4MjkwMTAyNCwKLTB4MTA0MDAwMDIsIDB4MjAyMSwgMHgyNDA0MDAwMSwgMHhjMDA0ZDRiLAotMHgxMDgwNDIsIDB4MTYwMGZmZmEsIDB4MjkwMTAyNCwgMHhjMDA0ZDcxLAotMHgzNDEwODAwMCwgMHhjMDA0ZDcxLCAweDAsIDB4YzAwNGQyYiwKLTB4MCwgMHg1MDQwMDAwNSwgMHgxMDgwNDIsIDB4OTYyMjAwMDAsCi0weDUwMTAyNSwgMHhhNjIyMDAwMCwgMHgxMDgwNDIsIDB4MTYwMGZmZjcsCi0weDAsIDB4YzAwNGQ3MSwgMHgwLCAweDMyYTVmZmZmLAotMHgyNDAyMDAwMSwgMHg1NGEyMDAwNCwgMHgyNDAyMDAwMiwgMHg5N2EyMDAxMCwKLTB4ODAwNGUxNCwgMHg1MjEwMjUsIDB4MTRhMjAwMDYsIDB4MzI3MWZmZmYsCi0weDk3YTIwMDEwLCAweDEyMTgyNywgMHg0MzEwMjQsIDB4YTdhMjAwMTAsCi0weDMyNzFmZmZmLCAweDI3YjIwMDEwLCAweDgwMjEsIDB4YzAwNGQ0YiwKLTB4MjQwNDAwMDEsIDB4MjYxMDAwMDEsIDB4MmUwMjAwMjAsIDB4MTQ0MGZmZmIsCi0weDAsIDB4YzAwNGQ0YiwgMHgyMDIxLCAweGMwMDRkNGIsCi0weDI0MDQwMDAxLCAweGMwMDRkNGIsIDB4MjAyMSwgMHhjMDA0ZDRiLAotMHgyNDA0MDAwMSwgMHgyNDEwMDAxMCwgMHgzMjAyMDAwMSwgMHgxMDQwMDAwMiwKLTB4MjAyMSwgMHgyNDA0MDAwMSwgMHhjMDA0ZDRiLCAweDEwODA0MiwKLTB4MTYwMGZmZmEsIDB4MzIwMjAwMDEsIDB4MjQxMDAwMTAsIDB4MjMwMTAyNCwKLTB4MTA0MDAwMDIsIDB4MjAyMSwgMHgyNDA0MDAwMSwgMHhjMDA0ZDRiLAotMHgxMDgwNDIsIDB4MTYwMGZmZmEsIDB4MjMwMTAyNCwgMHhjMDA0ZDRiLAotMHgyNDA0MDAwMSwgMHhjMDA0ZDRiLCAweDIwMjEsIDB4MzQxMDgwMDAsCi0weDk2NDIwMDAwLCAweDUwMTAyNCwgMHgxMDQwMDAwMiwgMHgyMDIxLAotMHgyNDA0MDAwMSwgMHhjMDA0ZDRiLCAweDEwODA0MiwgMHgxNjAwZmZmOCwKLTB4MCwgMHhjMDA0ZDcxLCAweDAsIDB4OGZiZjAwMzAsCi0weDhmYjUwMDJjLCAweDhmYjQwMDI4LCAweDhmYjMwMDI0LCAweDhmYjIwMDIwLAotMHg4ZmIxMDAxYywgMHg4ZmIwMDAxOCwgMHgzZTAwMDA4LCAweDI3YmQwMDM4LAotMHgwLCAweDAsIDB4MCwgMHgyN2JkZmZlOCwKLTB4YWZiZjAwMTAsIDB4M2MwMzAwMDEsIDB4NzcxODIxLCAweDhjNjM4M2FjLAotMHgyNDAyMDAwOCwgMHgxNDYyMDIyYywgMHg4MDMwMjEsIDB4M2MwMjAwMDEsCi0weDhjNDI1ZDk4LCAweDE0NDAwMDMzLCAweDAsIDB4OGY4NTAyMjQsCi0weDM4YTMwMDIwLCAweDJjNjMwMDAxLCAweDM4YTIwMDEwLCAweDJjNDIwMDAxLAotMHg2MjE4MjUsIDB4MTQ2MDAwMGQsIDB4MzhhMzAwMzAsIDB4MmM2MzAwMDEsCi0weDM4YTIwNDAwLCAweDJjNDIwMDAxLCAweDYyMTgyNSwgMHgxNDYwMDAwNywKLTB4MzhhMzA0MDIsIDB4MmM2MzAwMDEsIDB4MzhhMjA0MDQsIDB4MmM0MjAwMDEsCi0weDYyMTgyNSwgMHgxMDYwMDAwNSwgMHgwLCAweGMwMDQyOWIsCi0weDAsIDB4ODAwNGU4ZCwgMHgyNDAyMDAwZSwgMHhjMDA0M2RkLAotMHgwLCAweDNjMDUwMDAxLCAweDhjYTU1Y2M4LCAweGMwMDUyYTIsCi0weDIwMjEsIDB4M2MwMzAwMDEsIDB4OGM2MzVjYzgsIDB4MjQwMjAwMDQsCi0weDE0NjIwMDA1LCAweDI0MDNmZmZiLCAweDNjMDIwMDAxLCAweDhjNDI1Y2M0LAotMHg4MDA0ZTg5LCAweDI0MDNmZmY3LCAweDNjMDIwMDAxLCAweDhjNDI1Y2M0LAotMHg0MzEwMjQsIDB4M2MwMTAwMDEsIDB4YWMyMjVjYzQsIDB4MjQwMjAwMGUsCi0weDNjMDEwMDAxLCAweGMwMDQyOWIsIDB4YWMyMjdkZDAsIDB4ODAwNTA4NywKLTB4MCwgMHg4ZjgyMDIyMCwgMHgzYzAzMDQwMCwgMHg0MzEwMjQsCi0weDEwNDAwMDI3LCAweDI0MDNmZmJmLCAweDhmODUwMjI0LCAweDNjMDIwMDAxLAotMHg4YzQyN2RkYywgMHhhMzIwMjQsIDB4NDMxMDI0LCAweDE0ODIwMDBjLAotMHgwLCAweDNjMDIwMDAxLCAweDhjNDI3ZGUwLCAweDI0NDIwMDAxLAotMHgzYzAxMDAwMSwgMHhhYzIyN2RlMCwgMHgyYzQyMDAwMiwgMHgxNDQwMDAwOCwKLTB4MjQwMjAwMDEsIDB4M2MwMTAwMDEsIDB4ODAwNGVhZCwgMHhhYzIyN2UwMCwKLTB4M2MwMTAwMDEsIDB4YWMyMDdkZTAsIDB4M2MwMTAwMDEsIDB4YWMyMDdlMDAsCi0weDNjMDIwMDAxLCAweDhjNDI3ZTAwLCAweDEwNDAwMDA2LCAweDMwYTIwMDQwLAotMHgxMDQwMDAwNCwgMHgyNDAyMDAwMSwgMHgzYzAxMDAwMSwgMHg4MDA0ZWI4LAotMHhhYzIyN2UwNCwgMHgzYzAxMDAwMSwgMHhhYzIwN2UwNCwgMHgzYzAxMDAwMSwKLTB4YWMyNTdkZGMsIDB4M2MwMTAwMDEsIDB4ODAwNGVjOCwgMHhhYzIwN2UxMCwKLTB4MjQwMjAwMDEsIDB4M2MwMTAwMDEsIDB4YWMyMjdlMTAsIDB4M2MwMTAwMDEsCi0weGFjMjA3ZTAwLCAweDNjMDEwMDAxLCAweGFjMjA3ZGUwLCAweDNjMDEwMDAxLAotMHhhYzIwN2UwNCwgMHgzYzAxMDAwMSwgMHhhYzIwN2RkYywgMHgzYzAzMDAwMSwKLTB4OGM2MzdkZDAsIDB4M2MwMjAwMDEsIDB4OGM0MjdkZDQsIDB4MTA2MjAwMDMsCi0weDNjMDIwMjAwLCAweDNjMDEwMDAxLCAweGFjMjM3ZGQ0LCAweGMyMTAyNCwKLTB4MTA0MDAwMDcsIDB4MjQ2M2ZmZmYsIDB4OGY4MjAyMjAsIDB4MjQwMzAwMDEsCi0weDNjMDEwMDAxLCAweGFjMjM1Y2NjLCAweDgwMDUwODUsIDB4M2MwM2Y3MDAsCi0weDJjNjIwMDBlLCAweDEwNDAwMWE4LCAweDMxMDgwLCAweDNjMDEwMDAxLAotMHgyMjA4MjEsIDB4OGMyMjViODAsIDB4NDAwMDA4LCAweDAsCi0weDNjMDEwMDAxLCAweGFjMjA3ZTAwLCAweDNjMDEwMDAxLCAweGFjMjA3ZGUwLAotMHgzYzAxMDAwMSwgMHhhYzIwN2RkYywgMHgzYzAxMDAwMSwgMHhhYzIwN2UwNCwKLTB4M2MwMTAwMDEsIDB4YWMyMDdkZjgsIDB4M2MwMTAwMDEsIDB4YWMyMDdkZjAsCi0weGMwMDQ4NmEsIDB4YWY4MDAyMjQsIDB4MjQwMjAwMDIsIDB4M2MwMTAwMDEsCi0weGFjMjI3ZGQwLCAweDNjMDIwMDAxLCAweDhjNDI3ZTEwLCAweDE0NDAwMDU2LAotMHgzYzAzZmRmZiwgMHg4ZWUyMDAwMCwgMHgzNDYzZmZmZiwgMHg0MzEwMjQsCi0weGMwMDQyOWIsIDB4YWVlMjAwMDAsIDB4YWY4MDAyMDQsIDB4OGY4MjAyMDAsCi0weDI0MDNmZmZkLCAweDQzMTAyNCwgMHhhZjgyMDIwMCwgMHgzYzAxMDAwMSwKLTB4YWMyMDdlMjAsIDB4OGY4MzAwNTQsIDB4M2MwMjAwMDEsIDB4OGM0MjdkZjgsCi0weDI0MDQwMDAxLCAweDNjMDEwMDAxLCAweGFjMjQ3ZTBjLCAweDI0NDIwMDAxLAotMHgzYzAxMDAwMSwgMHhhYzIyN2RmOCwgMHgyYzQyMDAwNCwgMHgzYzAxMDAwMSwKLTB4YWMyMzdkZjQsIDB4MTQ0MDAwMDYsIDB4MjQwMjAwMDMsIDB4M2MwMTAwMDEsCi0weGFjMjQ1Y2NjLCAweDNjMDEwMDAxLCAweDgwMDUwODMsIDB4YWMyMDdkZjgsCi0weDNjMDEwMDAxLCAweDgwMDUwODMsIDB4YWMyMjdkZDAsIDB4OGY4MzAwNTQsCi0weDNjMDIwMDAxLCAweDhjNDI3ZGY0LCAweDI0NjNkOGYwLCAweDQzMTAyMywKLTB4MmM0MjI3MTAsIDB4MTQ0MDAwMDMsIDB4MjQwMjAwMDQsIDB4M2MwMTAwMDEsCi0weGFjMjI3ZGQwLCAweDNjMDIwMDAxLCAweDhjNDI3ZTEwLCAweDE0NDAwMDI2LAotMHgzYzAzZmRmZiwgMHg4ZWUyMDAwMCwgMHgzNDYzZmZmZiwgMHg0MzEwMjQsCi0weDgwMDUwODMsIDB4YWVlMjAwMDAsIDB4M2MwNDAwMDEsIDB4OGM4NDVkOWMsCi0weDNjMDEwMDAxLCAweGMwMDUwOGEsIDB4YWMyMDdkZTgsIDB4M2MwMjAwMDEsCi0weDhjNDI3ZTFjLCAweGFmODIwMjA0LCAweDNjMDIwMDAxLCAweDhjNDI3ZTEwLAotMHgxNDQwMDAxNSwgMHgzYzAzZmRmZiwgMHg4ZWUyMDAwMCwgMHgzNDYzZmZmZiwKLTB4NDMxMDI0LCAweGFlZTIwMDAwLCAweDhmODIwMjA0LCAweDMwNDIwMDMwLAotMHgxNDQwMDEzYywgMHgyNDAyMDAwMiwgMHgzYzAzMDAwMSwgMHg4YzYzN2UxYywKLTB4MjQwMjAwMDUsIDB4M2MwMTAwMDEsIDB4YWMyMjdkZDAsIDB4M2MwMTAwMDEsCi0weDgwMDUwODMsIDB4YWMyMzdlMjAsIDB4M2MwMjAwMDEsIDB4OGM0MjdlMTAsCi0weDEwNDAwMDEwLCAweDNjMDNmZGZmLCAweDNjMDIwMDAxLCAweDhjNDI1ZDZjLAotMHgyNDQyMDAwMSwgMHgzYzAxMDAwMSwgMHhhYzIyNWQ2YywgMHgyYzQyMDAwMiwKLTB4MTQ0MDAxMzEsIDB4MjQwMjAwMDEsIDB4M2MwMTAwMDEsIDB4YWMyMjVkNzQsCi0weDNjMDEwMDAxLCAweGFjMjA1ZDZjLCAweDNjMDEwMDAxLCAweDgwMDUwODMsCi0weGFjMjI1Y2NjLCAweDhlZTIwMDAwLCAweDM0NjNmZmZmLCAweDQzMTAyNCwKLTB4YWVlMjAwMDAsIDB4M2MwMjAwMDEsIDB4OGM0MjdlMDAsIDB4MTA0MDAxMjIsCi0weDAsIDB4M2MwMjAwMDEsIDB4OGM0MjdkZGMsIDB4MTA0MDAxMWUsCi0weDAsIDB4M2MwMTAwMDEsIDB4YWMyMjdlMDgsIDB4MjQwMjAwMDMsCi0weDNjMDEwMDAxLCAweGFjMjI3ZGUwLCAweDgwMDUwMjQsIDB4MjQwMjAwMDYsCi0weDNjMDEwMDAxLCAweGFjMjA3ZGU4LCAweDhmODIwMjA0LCAweDM0NDIwMDQwLAotMHhhZjgyMDIwNCwgMHgzYzAyMDAwMSwgMHg4YzQyN2UyMCwgMHgyNDAzMDAwNywKLTB4M2MwMTAwMDEsIDB4YWMyMzdkZDAsIDB4MzQ0MjAwNDAsIDB4M2MwMTAwMDEsCi0weGFjMjI3ZTIwLCAweDNjMDIwMDAxLCAweDhjNDI3ZTAwLCAweDEwNDAwMDA1LAotMHgwLCAweDNjMDIwMDAxLCAweDhjNDI3ZGRjLCAweDEwNDAwMGY5LAotMHgyNDAyMDAwMiwgMHgzYzA1MDAwMSwgMHgyNGE1N2RlMCwgMHg4Y2EyMDAwMCwKLTB4MmM0MjRlMjEsIDB4MTA0MDAwZjMsIDB4MjQwMjAwMDIsIDB4M2MwMjAwMDEsCi0weDhjNDI3ZTA0LCAweDEwNDAwMGY4LCAweDI0MDRmZmJmLCAweDNjMDIwMDAxLAotMHg4YzQyN2RkYywgMHgzYzAzMDAwMSwgMHg4YzYzN2UwOCwgMHg0NDEwMjQsCi0weDY0MTgyNCwgMHgxMDQzMDAwNCwgMHgyNDAyMDAwMSwgMHgzYzAxMDAwMSwKLTB4ODAwNTA4MywgMHhhYzIyN2RkMCwgMHgyNDAyMDAwMywgMHhhY2EyMDAwMCwKLTB4MjQwMjAwMDgsIDB4M2MwMTAwMDEsIDB4YWMyMjdkZDAsIDB4M2MwMjAwMDEsCi0weDhjNDI3ZTBjLCAweDEwNDAwMDBjLCAweDI0MDIwMDAxLCAweDNjMDQwMDAxLAotMHhjMDA1MDk3LCAweDhjODQ3ZGRjLCAweDNjMDIwMDAxLCAweDhjNDI3ZTI4LAotMHgxNDQwMDAwNSwgMHgyNDAyMDAwMSwgMHgzYzAyMDAwMSwgMHg4YzQyN2UyNCwKLTB4MTA0MDAwMDYsIDB4MjQwMjAwMDEsIDB4M2MwMTAwMDEsIDB4YWMyMjVjY2MsCi0weDNjMDEwMDAxLCAweDgwMDUwODMsIDB4YWMyMDdkZjgsIDB4M2MwMjAwMDEsCi0weDhjNDI3ZGYwLCAweDNjMDMwMDAxLCAweDhjNjM3ZGRjLCAweDJjNDIwMDAxLAotMHgyMTBjMCwgMHgzMDYzMDAwOCwgMHgzYzAxMDAwMSwgMHhhYzIyN2RmMCwKLTB4M2MwMTAwMDEsIDB4YWMyMzdkZWMsIDB4OGY4MzAwNTQsIDB4MjQwMjAwMDksCi0weDNjMDEwMDAxLCAweGFjMjI3ZGQwLCAweDNjMDEwMDAxLCAweDgwMDUwODMsCi0weGFjMjM3ZGY0LCAweDhmODMwMDU0LCAweDNjMDIwMDAxLCAweDhjNDI3ZGY0LAotMHgyNDYzZDhmMCwgMHg0MzEwMjMsIDB4MmM0MjI3MTAsIDB4MTQ0MDAwYTgsCi0weDAsIDB4M2MwMjAwMDEsIDB4OGM0MjdlMDAsIDB4MTA0MDAwMDUsCi0weDAsIDB4M2MwMjAwMDEsIDB4OGM0MjdkZGMsIDB4MTA0MDAwYTksCi0weDI0MDIwMDAyLCAweDNjMDMwMDAxLCAweDI0NjM3ZGUwLCAweDhjNjIwMDAwLAotMHgyYzQyNGUyMSwgMHgxMDQwMDBhMywgMHgyNDAyMDAwMiwgMHgzYzAyMDAwMSwKLTB4OGM0MjdlMGMsIDB4MTA0MDAwMGUsIDB4MCwgMHgzYzAyMDAwMSwKLTB4OGM0MjdkZGMsIDB4M2MwMTAwMDEsIDB4YWMyMDdlMGMsIDB4MzA0MjAwODAsCi0weDEwNDAwMDJmLCAweDI0MDIwMDBjLCAweDhmODIwMjA0LCAweDMwNDIwMDgwLAotMHgxNDQwMDAwYywgMHgyNDAyMDAwMywgMHg4MDA1MDExLCAweDI0MDIwMDBjLAotMHgzYzAyMDAwMSwgMHg4YzQyN2RkYywgMHgzMDQyMDA4MCwgMHgxNDQwMDAwNSwKLTB4MjQwMjAwMDMsIDB4OGY4MjAyMDQsIDB4MzA0MjAwODAsIDB4MTA0MDAwMWYsCi0weDI0MDIwMDAzLCAweGFjNjIwMDAwLCAweDI0MDIwMDBhLCAweDNjMDEwMDAxLAotMHhhYzIyN2RkMCwgMHgzYzA0MDAwMSwgMHgyNDg0N2UxOCwgMHg4YzgyMDAwMCwKLTB4M2MwMzAwMDEsIDB4OGM2MzdkZjAsIDB4NDMxMDI1LCAweGFmODIwMjA0LAotMHg4YzgzMDAwMCwgMHgzYzA0MDAwMSwgMHg4Yzg0N2RmMCwgMHgyNDAyMDAwYiwKLTB4M2MwMTAwMDEsIDB4YWMyMjdkZDAsIDB4NjQxODI1LCAweDNjMDEwMDAxLAotMHhhYzIzN2UyMCwgMHgzYzA1MDAwMSwgMHgyNGE1N2RlMCwgMHg4Y2EyMDAwMCwKLTB4MmM0MjRlMjEsIDB4MTA0MDAwNmYsIDB4MjQwMjAwMDIsIDB4M2MwMjAwMDEsCi0weDhjNDI3ZTEwLCAweDEwNDAwMDA1LCAweDAsIDB4MjQwMjAwMGMsCi0weDNjMDEwMDAxLCAweDgwMDUwODMsIDB4YWMyMjdkZDAsIDB4M2MwMjAwMDEsCi0weDhjNDI3ZTAwLCAweDEwNDAwMDZjLCAweDAsIDB4M2MwNDAwMDEsCi0weDhjODQ3ZGRjLCAweDEwODAwMDVlLCAweDMwODIwMDA4LCAweDNjMDMwMDAxLAotMHg4YzYzN2RlYywgMHgxMDYyMDA2NCwgMHgyNDAyMDAwMywgMHgzYzAxMDAwMSwKLTB4YWMyNDdlMDgsIDB4YWNhMjAwMDAsIDB4MjQwMjAwMDYsIDB4M2MwMTAwMDEsCi0weDgwMDUwODMsIDB4YWMyMjdkZDAsIDB4OGY4MjAyMDAsIDB4MzQ0MjAwMDIsCi0weGFmODIwMjAwLCAweDhmODMwMDU0LCAweDI0MDIwMDBkLCAweDNjMDEwMDAxLAotMHhhYzIyN2RkMCwgMHgzYzAxMDAwMSwgMHhhYzIzN2RmNCwgMHg4ZjgzMDA1NCwKLTB4M2MwMjAwMDEsIDB4OGM0MjdkZjQsIDB4MjQ2M2Q4ZjAsIDB4NDMxMDIzLAotMHgyYzQyMjcxMCwgMHgxNDQwMDAzYSwgMHgwLCAweDNjMDIwMDAxLAotMHg4YzQyN2UxMCwgMHgxMDQwMDAyOSwgMHgyNDAyMDAwZSwgMHgzYzAzMDAwMSwKLTB4OGM2MzdlMjQsIDB4M2MwMTAwMDEsIDB4MTQ2MDAwMTUsIDB4YWMyMjdkZDAsCi0weGMwMDQzZGQsIDB4MCwgMHgzYzA1MDAwMSwgMHg4Y2E1NWNjOCwKLTB4YzAwNTJhMiwgMHgyMDIxLCAweDNjMDMwMDAxLCAweDhjNjM1Y2M4LAotMHgyNDAyMDAwNCwgMHgxNDYyMDAwNSwgMHgyNDAzZmZmYiwgMHgzYzAyMDAwMSwKLTB4OGM0MjVjYzQsIDB4ODAwNTA1MiwgMHgyNDAzZmZmNywgMHgzYzAyMDAwMSwKLTB4OGM0MjVjYzQsIDB4NDMxMDI0LCAweDNjMDEwMDAxLCAweGFjMjI1Y2M0LAotMHg4ZWUyMDAwMCwgMHgzYzAzMDIwMCwgMHg0MzEwMjUsIDB4YWVlMjAwMDAsCi0weDhmODIwMjI0LCAweDNjMDEwMDAxLCAweGFjMjI3ZTJjLCAweDhmODIwMjIwLAotMHgyNDAzZmZmYiwgMHg0MzEwMjQsIDB4YWY4MjAyMjAsIDB4OGY4MjAyMjAsCi0weDM0NDIwMDAyLCAweDgwMDUwODMsIDB4YWY4MjAyMjAsIDB4M2MwMjAwMDEsCi0weDhjNDI3ZTAwLCAweDEwNDAwMDA1LCAweDAsIDB4M2MwMjAwMDEsCi0weDhjNDI3ZGRjLCAweDEwNDAwMDBmLCAweDI0MDIwMDAyLCAweDNjMDIwMDAxLAotMHg4YzQyN2RlMCwgMHgyYzQyNGUyMSwgMHgxMDQwMDAwYSwgMHgyNDAyMDAwMiwKLTB4M2MwMjAwMDEsIDB4OGM0MjdlMDAsIDB4MTA0MDAwMGYsIDB4MCwKLTB4M2MwMjAwMDEsIDB4OGM0MjdkZGMsIDB4MTQ0MDAwMGIsIDB4MCwKLTB4MjQwMjAwMDIsIDB4M2MwMTAwMDEsIDB4ODAwNTA4MywgMHhhYzIyN2RkMCwKLTB4M2MwMjAwMDEsIDB4OGM0MjdlMDAsIDB4MTA0MDAwMDMsIDB4MCwKLTB4YzAwNDI5YiwgMHgwLCAweDhmODIwMjIwLCAweDNjMDNmNzAwLAotMHg0MzEwMjUsIDB4YWY4MjAyMjAsIDB4OGZiZjAwMTAsIDB4M2UwMDAwOCwKLTB4MjdiZDAwMTgsIDB4M2MwMzAwMDEsIDB4MjQ2MzdlMjgsIDB4OGM2MjAwMDAsCi0weDEwNDAwMDA1LCAweDM0NDIyMDAwLCAweDNjMDEwMDAxLCAweGFjMjI3ZTFjLAotMHg4MDA1MDk1LCAweGFjNjAwMDAwLCAweDNjMDEwMDAxLCAweGFjMjQ3ZTFjLAotMHgzZTAwMDA4LCAweDAsIDB4MjdiZGZmZTAsIDB4MzA4MjAwMzAsCi0weGFmYmYwMDE4LCAweDNjMDEwMDAxLCAweGFjMjI3ZTI0LCAweDE0NDAwMDY3LAotMHgzYzAyZmZmZiwgMHgzNDQyMWYwZSwgMHg4MjEwMjQsIDB4MTQ0MDAwNjEsCi0weDI0MDIwMDMwLCAweDMwODIyMDAwLCAweDEwNDAwMDVkLCAweDMwODM4MDAwLAotMHgzMWEwMiwgMHgzMDgyMDAwMSwgMHgyMTIwMCwgMHgzYzA0MDAwMSwKLTB4OGM4NDVkOWMsIDB4NjIxODI1LCAweDMzMWMyLCAweDNjMDMwMDAxLAotMHgyNDYzNWQ3OCwgMHgzMDgyODAwMCwgMHgyMTIwMiwgMHgzMDg0MDAwMSwKLTB4NDIyMDAsIDB4NDQxMDI1LCAweDIzOWMyLCAweDYxMDgwLAotMHg0MzEwMjEsIDB4NDcxMDIxLCAweDkwNDMwMDAwLCAweDI0MDIwMDAxLAotMHgxMDYyMDAyNSwgMHgwLCAweDEwNjAwMDA3LCAweDI0MDIwMDAyLAotMHgxMDYyMDAxMywgMHgyNDAyMDAwMywgMHgxMDYyMDAyYywgMHgzYzA1MDAwZiwKLTB4ODAwNTBmOSwgMHgwLCAweDhmODIwMjAwLCAweDI0MDNmZWZmLAotMHg0MzEwMjQsIDB4YWY4MjAyMDAsIDB4OGY4MjAyMjAsIDB4M2MwM2ZmZmUsCi0weDM0NjNmZmZmLCAweDQzMTAyNCwgMHhhZjgyMDIyMCwgMHgzYzAxMDAwMSwKLTB4YWMyMDdlNDQsIDB4M2MwMTAwMDEsIDB4ODAwNTEwNCwgMHhhYzIwN2U0YywKLTB4OGY4MjAyMDAsIDB4MzQ0MjAxMDAsIDB4YWY4MjAyMDAsIDB4OGY4MjAyMjAsCi0weDNjMDNmZmZlLCAweDM0NjNmZmZmLCAweDQzMTAyNCwgMHhhZjgyMDIyMCwKLTB4MjQwMjAxMDAsIDB4M2MwMTAwMDEsIDB4YWMyMjdlNDQsIDB4M2MwMTAwMDEsCi0weDgwMDUxMDQsIDB4YWMyMDdlNGMsIDB4OGY4MjAyMDAsIDB4MjQwM2ZlZmYsCi0weDQzMTAyNCwgMHhhZjgyMDIwMCwgMHg4ZjgyMDIyMCwgMHgzYzAzMDAwMSwKLTB4NDMxMDI1LCAweGFmODIwMjIwLCAweDNjMDEwMDAxLCAweGFjMjA3ZTQ0LAotMHgzYzAxMDAwMSwgMHg4MDA1MTA0LCAweGFjMjM3ZTRjLCAweDhmODIwMjAwLAotMHgzNDQyMDEwMCwgMHhhZjgyMDIwMCwgMHg4ZjgyMDIyMCwgMHgzYzAzMDAwMSwKLTB4NDMxMDI1LCAweGFmODIwMjIwLCAweDI0MDIwMTAwLCAweDNjMDEwMDAxLAotMHhhYzIyN2U0NCwgMHgzYzAxMDAwMSwgMHg4MDA1MTA0LCAweGFjMjM3ZTRjLAotMHgzNGE1ZmZmZiwgMHgzYzA0MDAwMSwgMHgyNDg0NWJiOCwgMHhhZmEzMDAxMCwKLTB4YzAwMjQwMywgMHhhZmEwMDAxNCwgMHg4MDA1MTA0LCAweDAsCi0weDI0MDIwMDMwLCAweDNjMDEwMDAxLCAweGFjMjI3ZTI4LCAweDhmYmYwMDE4LAotMHgzZTAwMDA4LCAweDI3YmQwMDIwLCAweDAsIDB4MjdiZGZmYzgsCi0weGFmYjIwMDI4LCAweDgwOTAyMSwgMHhhZmIzMDAyYywgMHhhMDk4MjEsCi0weGFmYjAwMDIwLCAweGMwODAyMSwgMHgzYzA0MDAwMSwgMHgyNDg0NWJkMCwKLTB4M2MwNTAwMDksIDB4M2MwMjAwMDEsIDB4OGM0MjVjYzgsIDB4MzRhNTkwMDEsCi0weDI0MDMwMjEsIDB4MjYwMzgyMSwgMHhhZmJmMDAzMCwgMHhhZmIxMDAyNCwKLTB4YTdhMDAwMWEsIDB4YWZiMDAwMTQsIDB4YzAwMjQwMywgMHhhZmEyMDAxMCwKLTB4MjQwMjAwMDIsIDB4MTI2MjAwODMsIDB4MmU2MjAwMDMsIDB4MTA0MDAwMDUsCi0weDI0MDIwMDAxLCAweDEyNjIwMDBhLCAweDAsIDB4ODAwNTI5YiwKLTB4MCwgMHgyNDAyMDAwNCwgMHgxMjYyMDBmYSwgMHgyNDAyMDAwOCwKLTB4MTI2MjAwZjksIDB4M2MwMmZmZWMsIDB4ODAwNTI5YiwgMHgwLAotMHgzYzAyMDAwMSwgMHg4YzQyNWNjNCwgMHgzMDQyMDAwMiwgMHgxNDQwMDAwNCwKLTB4MTI4OTQwLCAweDNjMDJmZmZiLCAweDM0NDJmZmZmLCAweDIwMjgwMjQsCi0weDNjMDEwMDAxLCAweDMxMDgyMSwgMHhhYzMwN2UzYywgMHgzYzAyNDAwMCwKLTB4MjAyMTAyNCwgMHgxMDQwMDA0ZSwgMHgxMDIzYzIsIDB4MzA4NDAwMzAsCi0weDEwMTM4MiwgMHgzMDQyMDAxYywgMHgzYzAzMDAwMSwgMHgyNDYzNWQwOCwKLTB4NDMxMDIxLCAweDgyMzgyMSwgMHgzYzAyMDAyMCwgMHgyMDIxMDI0LAotMHgxMDQwMDAwNiwgMHgyNDAyMDEwMCwgMHgzYzAxMDAwMSwgMHgzMTA4MjEsCi0weGFjMjI3ZTQwLCAweDgwMDUxNTAsIDB4M2MwMjAwODAsIDB4M2MwMTAwMDEsCi0weDMxMDgyMSwgMHhhYzIwN2U0MCwgMHgzYzAyMDA4MCwgMHgyMDIxMDI0LAotMHgxMDQwMDAwNiwgMHgxMjE5NDAsIDB4M2MwMjAwMDEsIDB4M2MwMTAwMDEsCi0weDIzMDgyMSwgMHg4MDA1MTVjLCAweGFjMjI3ZTQ4LCAweDEyMTE0MCwKLTB4M2MwMTAwMDEsIDB4MjIwODIxLCAweGFjMjA3ZTQ4LCAweDk0ZTQwMDAwLAotMHgzYzAzMDAwMSwgMHg4YzYzNWRiYywgMHgyNDAyMDAwNSwgMHgxMDYyMDAxMCwKLTB4YTdhNDAwMTgsIDB4MzIwMjQwMDAsIDB4MTA0MDAwMDIsIDB4MzQ4MjQwMDAsCi0weGE3YTIwMDE4LCAweDI0MDQwMDAxLCAweDk0ZTIwMDAyLCAweDI0MDUwMDA0LAotMHgyNGU2MDAwMiwgMHgzNDQyMDAwMSwgMHhjMDA0OThlLCAweGE0ZTIwMDAyLAotMHgyNDA0MDAwMSwgMHgyODIxLCAweGMwMDQ5OGUsIDB4MjdhNjAwMTgsCi0weDNjMDIwMDAxLCAweDhjNDI1Y2M4LCAweDI0MTEwMDAxLCAweDNjMDEwMDAxLAotMHhhYzMxNWNkNCwgMHgxNDUzMDAwNCwgMHgzMjAyODAwMCwgMHhjMDA0MjliLAotMHgwLCAweDMyMDI4MDAwLCAweDEwNDAwMTFmLCAweDAsCi0weGMwMDQyOWIsIDB4MCwgMHgzYzAzMDAwMSwgMHg4YzYzNWRiYywKLTB4MjQwMjAwMDUsIDB4MTA2MjAxMTgsIDB4MjQwMjAwMDIsIDB4M2MwMTAwMDEsCi0weGFjMzE1Y2NjLCAweDNjMDEwMDAxLCAweDgwMDUyOWIsIDB4YWMyMjVjYzgsCi0weDI0MDQwMDAxLCAweDI0MDUwMDA0LCAweDI3YjAwMDFhLCAweGMwMDQ5OGUsCi0weDIwMDMwMjEsIDB4MjQwNDAwMDEsIDB4MjgyMSwgMHhjMDA0OThlLAotMHgyMDAzMDIxLCAweDNjMDIwMDAxLCAweDUxMTAyMSwgMHg4YzQyN2UzNCwKLTB4M2MwNDAwMDEsIDB4OGM4NDVjYzgsIDB4M2MwM2JmZmYsIDB4MzQ2M2ZmZmYsCi0weDNjMDEwMDAxLCAweGFjMzM1Y2Q0LCAweDQzMTAyNCwgMHgzYzAxMDAwMSwKLTB4MzEwODIxLCAweDEwOTMwMGZhLCAweGFjMjI3ZTM0LCAweDgwMDUyOWIsCi0weDAsIDB4M2MwMjIwMDAsIDB4MjAyMTAyNCwgMHgxMDQwMDAwNSwKLTB4MjQwMjAwMDEsIDB4M2MwMTAwMDEsIDB4YWMyMjVkOTgsIDB4ODAwNTFhZCwKLTB4MTI4OTQwLCAweDNjMDEwMDAxLCAweGFjMjA1ZDk4LCAweDEyODk0MCwKLTB4M2MwMTAwMDEsIDB4MzEwODIxLCAweGFjMzA3ZTM4LCAweDNjMDI0MDAwLAotMHgyMDIxMDI0LCAweDE0NDAwMDE2LCAweDAsIDB4M2MwMjAwMDEsCi0weDhjNDI1ZDk4LCAweDEwNDAwMDA4LCAweDI0MDQwMDA0LCAweDI0MDUwMDAxLAotMHhjMDA0ZDkzLCAweDI0MDYyMDAwLCAweDI0MDIwMDAxLCAweDNjMDEwMDAxLAotMHgzNzA4MjEsIDB4YWMyMjgzYWMsIDB4M2MwMjAwMDEsIDB4NTExMDIxLAotMHg4YzQyN2UzMCwgMHgzYzAzYmZmZiwgMHgzNDYzZmZmZiwgMHg0MzEwMjQsCi0weDNjMDEwMDAxLCAweDMxMDgyMSwgMHg4MDA1Mjk5LCAweGFjMjI3ZTMwLAotMHgzYzAyMDAwMSwgMHg4YzQyNWQ5OCwgMHgxMDQwMDAyOCwgMHgzYzAzMDBhMCwKLTB4MjAzMTAyNCwgMHg1NDQzMDAwZCwgMHgzYzAyMDAyMCwgMHgzYzAyMDAwMSwKLTB4OGM0MjVkOWMsIDB4MjQwMzAxMDAsIDB4M2MwMTAwMDEsIDB4MzEwODIxLAotMHhhYzIzN2U0NCwgMHgzYzAzMDAwMSwgMHgzYzAxMDAwMSwgMHgzMTA4MjEsCi0weGFjMjM3ZTRjLCAweDgwMDUxZjAsIDB4MzQ0MjA0MDAsIDB4MjAyMTAyNCwKLTB4MTA0MDAwMDgsIDB4MjQwMzAxMDAsIDB4M2MwMjAwMDEsIDB4OGM0MjVkOWMsCi0weDNjMDEwMDAxLCAweDMxMDgyMSwgMHhhYzIzN2U0NCwgMHg4MDA1MWYwLAotMHgzNDQyMDgwMCwgMHgzYzAyMDA4MCwgMHgyMDIxMDI0LCAweDEwNDAwMDJlLAotMHgzYzAzMDAwMSwgMHgzYzAyMDAwMSwgMHg4YzQyNWQ5YywgMHgzYzAxMDAwMSwKLTB4MzEwODIxLCAweGFjMjM3ZTRjLCAweDM0NDIwYzAwLCAweDNjMDEwMDAxLAotMHhhYzIyNWQ5YywgMHg4MDA1MjE4LCAweDI0MDQwMDAxLCAweDNjMDIwMDIwLAotMHgyMDIxMDI0LCAweDEwNDAwMDA2LCAweDI0MDIwMTAwLCAweDNjMDEwMDAxLAotMHgzMTA4MjEsIDB4YWMyMjdlNDQsIDB4ODAwNTIwMSwgMHgzYzAyMDA4MCwKLTB4M2MwMTAwMDEsIDB4MzEwODIxLCAweGFjMjA3ZTQ0LCAweDNjMDIwMDgwLAotMHgyMDIxMDI0LCAweDEwNDAwMDA3LCAweDEyMTk0MCwgMHgzYzAyMDAwMSwKLTB4M2MwMTAwMDEsIDB4MjMwODIxLCAweGFjMjI3ZTRjLCAweDgwMDUyMGYsCi0weDI0MDQwMDAxLCAweDEyMTE0MCwgMHgzYzAxMDAwMSwgMHgyMjA4MjEsCi0weGFjMjA3ZTRjLCAweDI0MDQwMDAxLCAweDI4MjEsIDB4MjdiMDAwMWUsCi0weGMwMDQ5NGMsIDB4MjAwMzAyMSwgMHgyNDA0MDAwMSwgMHgyODIxLAotMHhjMDA0OTRjLCAweDIwMDMwMjEsIDB4MjQwNDAwMDEsIDB4MjQwNTAwMDEsCi0weDI3YjAwMDFjLCAweGMwMDQ5NGMsIDB4MjAwMzAyMSwgMHgyNDA0MDAwMSwKLTB4MjQwNTAwMDEsIDB4YzAwNDk0YywgMHgyMDAzMDIxLCAweDgwMDUyOTksCi0weDAsIDB4M2MwMmZmZWMsIDB4MzQ0MmZmZmYsIDB4MjAyODAyNCwKLTB4M2MwMjAwMDgsIDB4MjAyODAyNSwgMHgxMjExNDAsIDB4M2MwMTAwMDEsCi0weDIyMDgyMSwgMHhhYzMwN2UzOCwgMHgzYzAyMjAwMCwgMHgyMDIxMDI0LAotMHgxMDQwMDAwOSwgMHgwLCAweDNjMDIwMDAxLCAweDhjNDI1ZDc0LAotMHgxNDQwMDAwNSwgMHgyNDAyMDAwMSwgMHgzYzAxMDAwMSwgMHhhYzIyNWQ5OCwKLTB4ODAwNTIzYSwgMHgzYzAyNDAwMCwgMHgzYzAxMDAwMSwgMHhhYzIwNWQ5OCwKLTB4M2MwMjQwMDAsIDB4MjAyMTAyNCwgMHgxNDQwMDAxZSwgMHgwLAotMHgzYzAyMDAwMSwgMHg4YzQyNWQ5OCwgMHgzYzAxMDAwMSwgMHhhYzIwNWNlMCwKLTB4MTA0MDAwMDcsIDB4MjQwMjIwMjAsIDB4M2MwMTAwMDEsIDB4YWMyMjVkOWMsCi0weDI0MDIwMDAxLCAweDNjMDEwMDAxLCAweDM3MDgyMSwgMHhhYzIyODNhYywKLTB4M2MwNGJmZmYsIDB4MTIxOTQwLCAweDNjMDIwMDAxLCAweDQzMTAyMSwKLTB4OGM0MjdlMzAsIDB4M2MwNTAwMDEsIDB4OGNhNTVjYzgsIDB4MzQ4NGZmZmYsCi0weDQ0MTAyNCwgMHgzYzAxMDAwMSwgMHgyMzA4MjEsIDB4YWMyMjdlMzAsCi0weDI0MDIwMDAxLCAweDEwYTIwMDQ0LCAweDAsIDB4ODAwNTI5OSwKLTB4MCwgMHgzYzAyMDAwMSwgMHg4YzQyNWQ5OCwgMHgxMDQwMDAxYywKLTB4MjQwMjIwMDAsIDB4M2MwMTAwMDEsIDB4YWMyMjVkOWMsIDB4M2MwMzAwYTAsCi0weDIwMzEwMjQsIDB4MTQ0MzAwMDUsIDB4MTIxMTQwLCAweDM0MDJhMDAwLAotMHgzYzAxMDAwMSwgMHg4MDA1Mjk0LCAweGFjMjI1ZDljLCAweDNjMDMwMDAxLAotMHg2MjE4MjEsIDB4OGM2MzdlMzgsIDB4M2MwMjAwMjAsIDB4NjIxMDI0LAotMHgxMDQwMDAwNCwgMHgyNDAyMjAwMSwgMHgzYzAxMDAwMSwgMHg4MDA1Mjk0LAotMHhhYzIyNWQ5YywgMHgzYzAyMDA4MCwgMHg2MjEwMjQsIDB4MTA0MDAwMWYsCi0weDM0MDJhMDAxLCAweDNjMDEwMDAxLCAweDgwMDUyOTQsIDB4YWMyMjVkOWMsCi0weDNjMDIwMDIwLCAweDIwMjEwMjQsIDB4MTA0MDAwMDcsIDB4MTIxOTQwLAotMHgyNDAyMDEwMCwgMHgzYzAxMDAwMSwgMHgyMzA4MjEsIDB4YWMyMjdlNDQsCi0weDgwMDUyODgsIDB4M2MwMjAwODAsIDB4MTIxMTQwLCAweDNjMDEwMDAxLAotMHgyMjA4MjEsIDB4YWMyMDdlNDQsIDB4M2MwMjAwODAsIDB4MjAyMTAyNCwKLTB4MTA0MDAwMDYsIDB4MTIxOTQwLCAweDNjMDIwMDAxLCAweDNjMDEwMDAxLAotMHgyMzA4MjEsIDB4ODAwNTI5NCwgMHhhYzIyN2U0YywgMHgxMjExNDAsCi0weDNjMDEwMDAxLCAweDIyMDgyMSwgMHhhYzIwN2U0YywgMHgzYzAzMDAwMSwKLTB4OGM2MzVjYzgsIDB4MjQwMjAwMDEsIDB4MTA2MjAwMDMsIDB4MCwKLTB4YzAwNDI5YiwgMHgwLCAweDhmYmYwMDMwLCAweDhmYjMwMDJjLAotMHg4ZmIyMDAyOCwgMHg4ZmIxMDAyNCwgMHg4ZmIwMDAyMCwgMHgzZTAwMDA4LAotMHgyN2JkMDAzOCwgMHgyN2JkZmZkOCwgMHhhZmIyMDAyMCwgMHg4MDkwMjEsCi0weGFmYjEwMDFjLCAweDg4MjEsIDB4MjQwMjAwMDIsIDB4YWZiZjAwMjQsCi0weGFmYjAwMDE4LCAweGE3YTAwMDEyLCAweDEwYTIwMGQzLCAweGE3YTAwMDEwLAotMHgyY2EyMDAwMywgMHgxMDQwMDAwNSwgMHgyNDAyMDAwMSwgMHgxMGEyMDAwYSwKLTB4MTI4MTQwLCAweDgwMDUzODAsIDB4MjIwMTAyMSwgMHgyNDAyMDAwNCwKLTB4MTBhMjAwN2QsIDB4MjQwMjAwMDgsIDB4MTBhMjAwN2MsIDB4MTIyOTQwLAotMHg4MDA1MzgwLCAweDIyMDEwMjEsIDB4M2MwMzAwMDEsIDB4NzAxODIxLAotMHg4YzYzN2UzYywgMHgzYzAyNDAwMCwgMHg2MjEwMjQsIDB4MTQ0MDAwMDksCi0weDI0MDQwMDAxLCAweDNjMDI3ZmZmLCAweDM0NDJmZmZmLCAweDYyODgyNCwKLTB4M2MwMTAwMDEsIDB4MzAwODIxLCAweGFjMzE3ZTM0LCAweDgwMDUzODAsCi0weDIyMDEwMjEsIDB4MjQwNTAwMDEsIDB4YzAwNDk0YywgMHgyN2E2MDAxMCwKLTB4MjQwNDAwMDEsIDB4MjQwNTAwMDEsIDB4YzAwNDk0YywgMHgyN2E2MDAxMCwKLTB4OTdhMjAwMTAsIDB4MzA0MjAwMDQsIDB4MTA0MDAwMzQsIDB4M2MxMTQwMDAsCi0weDNjMDIwMDAxLCAweDhjNDI1ZGJjLCAweDI0NDNmZmZmLCAweDJjNjIwMDA2LAotMHgxMDQwMDAzNCwgMHgzMTA4MCwgMHgzYzAxMDAwMSwgMHgyMjA4MjEsCi0weDhjMjI1YmUwLCAweDQwMDAwOCwgMHgwLCAweDI0MDQwMDAxLAotMHgyNDA1MDAxMSwgMHgyN2IwMDAxMiwgMHhjMDA0OTRjLCAweDIwMDMwMjEsCi0weDI0MDQwMDAxLCAweDI0MDUwMDExLCAweGMwMDQ5NGMsIDB4MjAwMzAyMSwKLTB4OTdhNTAwMTIsIDB4MzBhMjQwMDAsIDB4MTA0MDAwMDIsIDB4M2MwNDAwMTAsCi0weDNjMDQwMDA4LCAweDNjMDMwMDAxLCAweDgwMDUzMDEsIDB4MzBhMjgwMDAsCi0weDI0MDQwMDAxLCAweDI0MDUwMDE0LCAweDI3YjAwMDEyLCAweGMwMDQ5NGMsCi0weDIwMDMwMjEsIDB4MjQwNDAwMDEsIDB4MjQwNTAwMTQsIDB4YzAwNDk0YywKLTB4MjAwMzAyMSwgMHg5N2E1MDAxMiwgMHgzMGEyMTAwMCwgMHgxMDQwMDAwMiwKLTB4M2MwNDAwMTAsIDB4M2MwNDAwMDgsIDB4M2MwMzAwMDEsIDB4MzBhMjA4MDAsCi0weDU0NDAwMDAxLCAweDNjMDMwMDAyLCAweDNjMDI4MDAwLCAweDIyMjEwMjUsCi0weDY0MTgyNSwgMHg4MDA1MzBlLCAweDQzODgyNSwgMHgzYzExMDAwMSwKLTB4MjMwODgyMSwgMHg4ZTMxN2UzYywgMHgzYzAyN2ZmZiwgMHgzNDQyZmZmZiwKLTB4MjIyODgyNCwgMHgzYzAyMDAwMSwgMHg4YzQyNWNkOCwgMHgxMDQwMDAxZCwKLTB4MTIxMTQwLCAweDNjMDIwMDAxLCAweDhjNDI1ZDk4LCAweDEwNDAwMDAyLAotMHgzYzAyMjAwMCwgMHgyMjI4ODI1LCAweDEyMTE0MCwgMHgzYzAxMDAwMSwKLTB4MjIwODIxLCAweDhjMjI3ZTQwLCAweDEwNDAwMDAzLCAweDNjMDIwMDIwLAotMHg4MDA1MzIyLCAweDIyMjg4MjUsIDB4M2MwMmZmZGYsIDB4MzQ0MmZmZmYsCi0weDIyMjg4MjQsIDB4MTIxMTQwLCAweDNjMDEwMDAxLCAweDIyMDgyMSwKLTB4OGMyMjdlNDgsIDB4MTA0MDAwMDMsIDB4M2MwMjAwODAsIDB4ODAwNTMyZCwKLTB4MjIyODgyNSwgMHgzYzAyZmY3ZiwgMHgzNDQyZmZmZiwgMHgyMjI4ODI0LAotMHgxMjExNDAsIDB4M2MwMTAwMDEsIDB4MjIwODIxLCAweGFjMzE3ZTM0LAotMHg4MDA1MzgwLCAweDIyMDEwMjEsIDB4MTIyOTQwLCAweDNjMDMwMDAxLAotMHg2NTE4MjEsIDB4OGM2MzdlMzgsIDB4M2MwMjQwMDAsIDB4NjIxMDI0LAotMHgxNDQwMDAwOCwgMHgzYzAyN2ZmZiwgMHgzNDQyZmZmZiwgMHg2Mjg4MjQsCi0weDNjMDEwMDAxLCAweDI1MDgyMSwgMHhhYzMxN2UzMCwgMHg4MDA1MzgwLAotMHgyMjAxMDIxLCAweDNjMDIwMDAxLCAweDhjNDI1Y2Q4LCAweDEwNDAwMDMzLAotMHgzYzExYzAwYywgMHgzYzAyMDAwMSwgMHg4YzQyNWQ3NCwgMHgzYzA0YzAwYywKLTB4MzQ4NDIwMDAsIDB4M2MwMzAwMDEsIDB4OGM2MzVkOTgsIDB4MjEwMmIsCi0weDIxMDIzLCAweDQ0MTAyNCwgMHgxMDYwMDAwMywgMHg1MTg4MjUsCi0weDNjMDIyMDAwLCAweDIyMjg4MjUsIDB4M2MwMjAwMDEsIDB4NDUxMDIxLAotMHg4YzQyN2U0NCwgMHgxMDQwMDAwMywgMHgzYzAyMDAyMCwgMHg4MDA1MzVkLAotMHgyMjI4ODI1LCAweDNjMDJmZmRmLCAweDM0NDJmZmZmLCAweDIyMjg4MjQsCi0weDEyMTE0MCwgMHgzYzAxMDAwMSwgMHgyMjA4MjEsIDB4OGMyMjdlNGMsCi0weDEwNDAwMDAzLCAweDNjMDIwMDgwLCAweDgwMDUzNjgsIDB4MjIyODgyNSwKLTB4M2MwMmZmN2YsIDB4MzQ0MmZmZmYsIDB4MjIyODgyNCwgMHgzYzAyMDAwMSwKLTB4OGM0MjVkNjAsIDB4MTA0MDAwMDIsIDB4M2MwMjA4MDAsIDB4MjIyODgyNSwKLTB4M2MwMjAwMDEsIDB4OGM0MjVkNjQsIDB4MTA0MDAwMDIsIDB4M2MwMjA0MDAsCi0weDIyMjg4MjUsIDB4M2MwMjAwMDEsIDB4OGM0MjVkNjgsIDB4MTA0MDAwMDYsCi0weDNjMDIwMTAwLCAweDgwMDUzN2IsIDB4MjIyODgyNSwgMHgzYzAyN2ZmZiwKLTB4MzQ0MmZmZmYsIDB4NjI4ODI0LCAweDEyMTE0MCwgMHgzYzAxMDAwMSwKLTB4MjIwODIxLCAweGFjMzE3ZTMwLCAweDIyMDEwMjEsIDB4OGZiZjAwMjQsCi0weDhmYjIwMDIwLCAweDhmYjEwMDFjLCAweDhmYjAwMDE4LCAweDNlMDAwMDgsCi0weDI3YmQwMDI4LCAweDI3YmRmZmQ4LCAweGFmYjQwMDIwLCAweDgwYTAyMSwKLTB4YWZiZjAwMjQsIDB4YWZiMzAwMWMsIDB4YWZiMjAwMTgsIDB4YWZiMTAwMTQsCi0weGFmYjAwMDEwLCAweDhmOTAwMjAwLCAweDNjMDMwMDAxLCAweDhjNjM1Y2M4LAotMHg4ZjkzMDIyMCwgMHgyNDAyMDAwMiwgMHgxMDYyMDA2MywgMHgyYzYyMDAwMywKLTB4MTA0MDAwMDUsIDB4MjQwMjAwMDEsIDB4MTA2MjAwMGEsIDB4MTQxOTQwLAotMHg4MDA1NDQ4LCAweDAsIDB4MjQwMjAwMDQsIDB4MTA2MjAwNWEsCi0weDI0MDIwMDA4LCAweDEwNjIwMDU5LCAweDE0OTE0MCwgMHg4MDA1NDQ4LAotMHgwLCAweDNjMDQwMDAxLCAweDgzMjAyMSwgMHg4Yzg0N2UzYywKLTB4M2MxMTAwMDEsIDB4MjIzODgyMSwgMHg4ZTMxN2UzNCwgMHgzYzAyNDAwMCwKLTB4ODIxMDI0LCAweDEwNDAwMDNlLCAweDNjMDIwMDA4LCAweDIyMjEwMjQsCi0weDEwNDAwMDIwLCAweDM2MTAwMDAyLCAweDNjMDIwMDAxLCAweDQzMTAyMSwKLTB4OGM0MjdlNDAsIDB4MTA0MDAwMDUsIDB4MzYxMDAwMjAsIDB4MzYxMDAxMDAsCi0weDNjMDIwMDIwLCAweDgwMDUzYmQsIDB4MjIyODgyNSwgMHgyNDAyZmVmZiwKLTB4MjAyODAyNCwgMHgzYzAyZmZkZiwgMHgzNDQyZmZmZiwgMHgyMjI4ODI0LAotMHgxNDExNDAsIDB4M2MwMTAwMDEsIDB4MjIwODIxLCAweDhjMjI3ZTQ4LAotMHgxMDQwMDAwNSwgMHgzYzAyMDAwMSwgMHgyNjI5ODI1LCAweDNjMDIwMDgwLAotMHg4MDA1M2RjLCAweDIyMjg4MjUsIDB4M2MwMmZmZmUsIDB4MzQ0MmZmZmYsCi0weDI2Mjk4MjQsIDB4M2MwMmZmN2YsIDB4MzQ0MmZmZmYsIDB4ODAwNTNkYywKLTB4MjIyODgyNCwgMHgyNDAyZmVkZiwgMHgyMDI4MDI0LCAweDNjMDJmZmZlLAotMHgzNDQyZmZmZiwgMHgyNjI5ODI0LCAweDNjMDJmZjVmLCAweDM0NDJmZmZmLAotMHgyMjI4ODI0LCAweDNjMDEwMDAxLCAweDIzMDgyMSwgMHhhYzIwN2U0MCwKLTB4M2MwMTAwMDEsIDB4MjMwODIxLCAweGFjMjA3ZTQ4LCAweGMwMDQ4NmEsCi0weDAsIDB4YWY5MDAyMDAsIDB4YWY5MzAyMjAsIDB4OGY4MjAyMjAsCi0weDI0MDNmZmZiLCAweDQzMTAyNCwgMHhhZjgyMDIyMCwgMHg4ZjgyMDIyMCwKLTB4MzQ0MjAwMDIsIDB4YWY4MjAyMjAsIDB4ODAwNTNmMywgMHgxNDExNDAsCi0weDhmODIwMjAwLCAweDI0MDNmZmZkLCAweDQzMTAyNCwgMHhjMDA0ODZhLAotMHhhZjgyMDIwMCwgMHgzYzAyYmZmZiwgMHgzNDQyZmZmZiwgMHhjMDA0MjliLAotMHgyMjI4ODI0LCAweDE0MTE0MCwgMHgzYzAxMDAwMSwgMHgyMjA4MjEsCi0weDgwMDU0NDgsIDB4YWMzMTdlMzQsIDB4MTQ5MTQwLCAweDNjMDQwMDAxLAotMHg5MjIwMjEsIDB4OGM4NDdlMzgsIDB4M2MxMTAwMDEsIDB4MjMyODgyMSwKLTB4OGUzMTdlMzAsIDB4M2MwMjQwMDAsIDB4ODIxMDI0LCAweDE0NDAwMDExLAotMHgwLCAweDNjMDIwMDAxLCAweDhjNDI1ZDk4LCAweDE0NDAwMDA2LAotMHgzYzAyYmZmZiwgMHg4ZjgyMDIwMCwgMHgzNDQyMDAwMiwgMHhjMDA0ODZhLAotMHhhZjgyMDIwMCwgMHgzYzAyYmZmZiwgMHgzNDQyZmZmZiwgMHhjMDA0MjliLAotMHgyMjI4ODI0LCAweDNjMDEwMDAxLCAweDMyMDgyMSwgMHg4MDA1NDQ4LAotMHhhYzMxN2UzMCwgMHgzYzAyMDAwMSwgMHg4YzQyNWQ5OCwgMHgxMDQwMDAwNSwKLTB4M2MwMjAwMjAsIDB4M2MwMjAwMDEsIDB4OGM0MjVkNzQsIDB4MTA0MDAwMmIsCi0weDNjMDIwMDIwLCAweDgyMTAyNCwgMHgxMDQwMDAwNywgMHgzNjEwMDAyMCwKLTB4MjQwMjAxMDAsIDB4M2MwMTAwMDEsIDB4MzIwODIxLCAweGFjMjI3ZTQ0LAotMHg4MDA1NDI4LCAweDM2MTAwMTAwLCAweDNjMDEwMDAxLCAweDMyMDgyMSwKLTB4YWMyMDdlNDQsIDB4MjQwMmZlZmYsIDB4MjAyODAyNCwgMHgzYzAyMDA4MCwKLTB4ODIxMDI0LCAweDEwNDAwMDA3LCAweDE0MTk0MCwgMHgzYzAyMDAwMSwKLTB4M2MwMTAwMDEsIDB4MjMwODIxLCAweGFjMjI3ZTRjLCAweDgwMDU0MzksCi0weDI2Mjk4MjUsIDB4MTQxMTQwLCAweDNjMDEwMDAxLCAweDIyMDgyMSwKLTB4YWMyMDdlNGMsIDB4M2MwMmZmZmUsIDB4MzQ0MmZmZmYsIDB4MjYyOTgyNCwKLTB4YzAwNDg2YSwgMHgwLCAweGFmOTAwMjAwLCAweGFmOTMwMjIwLAotMHg4ZjgyMDIyMCwgMHgyNDAzZmZmYiwgMHg0MzEwMjQsIDB4YWY4MjAyMjAsCi0weDhmODIwMjIwLCAweDM0NDIwMDAyLCAweGFmODIwMjIwLCAweDE0MTE0MCwKLTB4M2MwMTAwMDEsIDB4MjIwODIxLCAweGFjMzE3ZTMwLCAweDhmYmYwMDI0LAotMHg4ZmI0MDAyMCwgMHg4ZmIzMDAxYywgMHg4ZmIyMDAxOCwgMHg4ZmIxMDAxNCwKLTB4OGZiMDAwMTAsIDB4M2UwMDAwOCwgMHgyN2JkMDAyOCwgMHgwIH07Ci1zdGF0aWMgdTMyIHRpZ29uRndSb2RhdGFbKE1BWF9ST0RBVEFfTEVOLzQpICsgMV0gX19kZXZpbml0ZGF0YSA9IHsKLTB4MjQ0ODY1NjEsIDB4NjQ2NTcyM2EsIDB4MjAyZjcwNzIsCi0weDZmNmE2NTYzLCAweDc0NzMyZjcyLCAweDYzNzMyZjczLCAweDc3MmY2NzY1LAotMHgyZjJlMmY2ZSwgMHg2OTYzMmY2NiwgMHg3NzJmNjM2ZiwgMHg2ZDZkNmY2ZSwKLTB4MmY2Njc3NmQsIDB4NjE2OTZlMmUsIDB4NjMyYzc2MjAsIDB4MzEyZTMxMmUsCi0weDMyMmUzMTMxLCAweDIwMzEzOTM5LCAweDM4MmYzMDM0LCAweDJmMzIzNzIwLAotMHgzMjMyM2EzMSwgMHgzMzNhMzQzMiwgMHgyMDczNjg3NSwgMHg2MTZlNjcyMCwKLTB4NDU3ODcwMjAsIDB4MjQwMDAwMDAsIDB4NzQ2ODY1NWYsIDB4NDQ0MTU3NGUsCi0weDAsIDB4NTM1NDQxNDMsIDB4NGI1ZjMxMjAsIDB4MCwKLTB4NDI2MTY0NTMsIDB4NmU2NDUyNmUsIDB4NjcwMDAwMDAsIDB4M2Y0NTZlNzEsCi0weDQ1NzY3NDAwLCAweDNmNmU2ZjUxLCAweDY0NDU3NjUwLCAweDAsCi0weDY1NzY1MjZlLCAweDY3NDY3NTZjLCAweDZjMDAwMDAwLCAweDQ5NmM2YzQzLAotMHg2ZjZlNjY1MiwgMHg3ODAwMDAwMCwgMHg1MzY1NmU2NCwgMHg0MzZiNTM3NSwKLTB4NmQwMDAwMDAsIDB4NTI2NTYzNzYsIDB4NTY2YzYxNmUsIDB4MCwKLTB4MCwgMHgyNDQ4NjU2MSwgMHg2NDY1NzIzYSwgMHgyMDJmNzA3MiwKLTB4NmY2YTY1NjMsIDB4NzQ3MzJmNzIsIDB4NjM3MzJmNzMsIDB4NzcyZjY3NjUsCi0weDJmMmUyZjZlLCAweDY5NjMyZjY2LCAweDc3MmY2MzZmLCAweDZkNmQ2ZjZlLAotMHgyZjc0Njk2ZCwgMHg2NTcyMmU2MywgMHgyYzc2MjAzMSwgMHgyZTMxMmUzMiwKLTB4MmUzODIwMzEsIDB4MzkzOTM4MmYsIDB4MzAzNzJmMzMsIDB4MzEyMDMxMzcsCi0weDNhMzUzODNhLCAweDM0MzUyMDczLCAweDY4NzU2MTZlLCAweDY3MjA0NTc4LAotMHg3MDIwMjQwMCwgMHg1NDJkNDQ2ZCwgMHg2MTUyNjQzMSwgMHgwLAotMHg1NDJkNDQ2ZCwgMHg2MTQyNDIwMCwgMHg1NDJkNDQ2ZCwgMHg2MTMyMDAwMCwKLTB4M2Y2ZTZmNTEsIDB4NjQ1NDc4NDUsIDB4MCwgMHgzZjZlNmY1MSwKLTB4NjQ1Mjc4NDUsIDB4MCwgMHg2NTZlNzE0ZCwgMHg0NTc2NTA0NiwKLTB4NjE2OTZjMDAsIDB4NjU2ZTcxNGQsIDB4NDU3NjQ2NjEsIDB4Njk2YzAwMDAsCi0weDY2NjE2OTZjLCAweDQ1NmU0NTRkLCAweDAsIDB4M2Y0NTZlNzEsCi0weDQ1NzY3NDAwLCAweDNmNmU2ZjUxLCAweDY0NDU3NjUwLCAweDAsCi0weDY1NzY1MjZlLCAweDY3NDY3NTZjLCAweDZjMDAwMDAwLCAweDAsCi0weDAsIDB4MjQ0ODY1NjEsIDB4NjQ2NTcyM2EsIDB4MjAyZjcwNzIsCi0weDZmNmE2NTYzLCAweDc0NzMyZjcyLCAweDYzNzMyZjczLCAweDc3MmY2NzY1LAotMHgyZjJlMmY2ZSwgMHg2OTYzMmY2NiwgMHg3NzJmNjM2ZiwgMHg2ZDZkNmY2ZSwKLTB4MmY2MzZmNmQsIDB4NmQ2MTZlNjQsIDB4MmU2MzJjNzYsIDB4MjAzMTJlMzEsCi0weDJlMzIyZTMxLCAweDMwMjAzMTM5LCAweDM5MzgyZjMxLCAweDMxMmYzMTM4LAotMHgyMDMxMzczYSwgMHgzMTMxM2EzMSwgMHgzODIwNzM2OCwgMHg3NTYxNmU2NywKLTB4MjA0NTc4NzAsIDB4MjAyNDAwMDAsIDB4M2Y0ZDYyNmYsIDB4Nzg0NTc2NzQsCi0weDAsIDB4NGU0ZjYzNmYsIDB4NmQ2MTZlNjQsIDB4MCwKLTB4Njg3Mzc0NjUsIDB4NWY0NTUyNTIsIDB4MCwgMHg0MTJkNDU3MiwKLTB4NzI0Mjc1NjMsIDB4MCwgMHg0NTUyNTI0ZiwgMHg1MjJkNDE2NCwKLTB4NjQwMDAwMDAsIDB4NjU2ZTcxNGQsIDB4NDU3NjUwNDYsIDB4NjE2OTZjMDAsCi0weDY1NmU3MTRkLCAweDQ1NzY0NjYxLCAweDY5NmMwMDAwLCAweDY2NjE2OTZjLAotMHg0NTZlNDU0ZCwgMHgwLCAweDQ0MmQ0NTcyLCAweDcyNGM2MTczLAotMHg3NDAwMDAwMCwgMHg0NDJkNDU3MiwgMHg3MjMyMDAwMCwgMHg2ZDQzNzM3NCwKLTB4NGQ2NDQ1NTIsIDB4NTIwMDAwMDAsIDB4NzA3MjZmNmQsIDB4NGQ2NDQ1NTIsCi0weDUyMDAwMDAwLCAweDQ2Njk2Yzc0LCAweDRkNjQ0NTUyLCAweDUyMDAwMDAwLAotMHg2MzZkNjQ1ZiwgMHg0NTUyNTIwMCwgMHgzZjQ1NmU3MSwgMHg0NTc2NzQwMCwKLTB4M2Y2ZTZmNTEsIDB4NjQ0NTc2NTAsIDB4MCwgMHg2NTc2NTI2ZSwKLTB4Njc0Njc1NmMsIDB4NmMwMDAwMDAsIDB4MCwgMHg2ZWEwLAotMHg3ZmJjLCAweDZlMzgsIDB4ODczNCwgMHg4MmIwLAotMHg4NzgwLCAweDg3ODAsIDB4NmY1NCwgMHg3Njk0LAotMHg3ZjBjLCAweDgwYTgsIDB4ODA3NCwgMHg4NzgwLAotMHg3ZTcwLCAweDgwY2MsIDB4NmU2NCwgMHg4MWNjLAotMHgwLCAweDI0NDg2NTYxLCAweDY0NjU3MjNhLCAweDIwMmY3MDcyLAotMHg2ZjZhNjU2MywgMHg3NDczMmY3MiwgMHg2MzczMmY3MywgMHg3NzJmNjc2NSwKLTB4MmYyZTJmNmUsIDB4Njk2MzJmNjYsIDB4NzcyZjYzNmYsIDB4NmQ2ZDZmNmUsCi0weDJmNjQ2ZDYxLCAweDJlNjMyYzc2LCAweDIwMzEyZTMxLCAweDJlMzIyZTMzLAotMHgyMDMxMzkzOSwgMHgzODJmMzAzNCwgMHgyZjMyMzcyMCwgMHgzMjMyM2EzMSwKLTB4MzMzYTM0MzEsIDB4MjA3MzY4NzUsIDB4NjE2ZTY3MjAsIDB4NDU3ODcwMjAsCi0weDI0MDAwMDAwLCAweDY0NmQ2MTcyLCAweDY0NDE1NDRlLCAweDAsCi0weDY0NmQ2MTc3LCAweDcyNDE1NDRlLCAweDAsIDB4MCwKLTB4MCwgMHgyNDQ4NjU2MSwgMHg2NDY1NzIzYSwgMHgyMDJmNzA3MiwKLTB4NmY2YTY1NjMsIDB4NzQ3MzJmNzIsIDB4NjM3MzJmNzMsIDB4NzcyZjY3NjUsCi0weDJmMmUyZjZlLCAweDY5NjMyZjY2LCAweDc3MmY2MzZmLCAweDZkNmQ2ZjZlLAotMHgyZjc0NzI2MSwgMHg2MzY1MmU2MywgMHgyYzc2MjAzMSwgMHgyZTMxMmUzMiwKLTB4MmUzMjIwMzEsIDB4MzkzOTM4MmYsIDB4MzAzNDJmMzIsIDB4MzcyMDMyMzIsCi0weDNhMzEzMzNhLCAweDM1MzAyMDczLCAweDY4NzU2MTZlLCAweDY3MjA0NTc4LAotMHg3MDIwMjQwMCwgMHgyNDQ4NjU2MSwgMHg2NDY1NzIzYSwgMHgyMDJmNzA3MiwKLTB4NmY2YTY1NjMsIDB4NzQ3MzJmNzIsIDB4NjM3MzJmNzMsIDB4NzcyZjY3NjUsCi0weDJmMmUyZjZlLCAweDY5NjMyZjY2LCAweDc3MmY2MzZmLCAweDZkNmQ2ZjZlLAotMHgyZjY0NjE3NCwgMHg2MTJlNjMyYywgMHg3NjIwMzEyZSwgMHgzMTJlMzIyZSwKLTB4MzIyMDMxMzksIDB4MzkzODJmMzAsIDB4MzQyZjMyMzcsIDB4MjAzMjMyM2EsCi0weDMxMzMzYTM0LCAweDMwMjA3MzY4LCAweDc1NjE2ZTY3LCAweDIwNDU3ODcwLAotMHgyMDI0MDAwMCwgMHg0NjU3NWY1NiwgMHg0NTUyNTM0OSwgMHg0ZjRlM2EyMCwKLTB4MjMzMTIwNDYsIDB4NzI2OTIwNDEsIDB4NzA3MjIwMzcsIDB4MjAzMTM3M2EsCi0weDM1MzUzYTM0LCAweDM4MjA1MDQ0LCAweDU0MjAzMjMwLCAweDMwMzAwMDAwLAotMHg0NjU3NWY0MywgMHg0ZjRkNTA0OSwgMHg0YzQ1NWY1NCwgMHg0OTRkNDUzYSwKLTB4MjAzMTM3M2EsIDB4MzUzNTNhMzQsIDB4MzgwMDAwMDAsIDB4NDY1NzVmNDMsCi0weDRmNGQ1MDQ5LCAweDRjNDU1ZjQyLCAweDU5M2EyMDY0LCAweDY1NzY3MjYzLAotMHg3MzAwMDAwMCwgMHg0NjU3NWY0MywgMHg0ZjRkNTA0OSwgMHg0YzQ1NWY0OCwKLTB4NGY1MzU0M2EsIDB4MjA2MzZmNmQsIDB4NzA3NTc0NjUsIDB4MCwKLTB4NDY1NzVmNDMsIDB4NGY0ZDUwNDksIDB4NGM0NTVmNDQsIDB4NGY0ZDQxNDksCi0weDRlM2EyMDY1LCAweDZlNjcyZTYxLCAweDYzNzQ2NTZmLCAweDZlMmU2MzZmLAotMHg2ZDAwMDAwMCwgMHg0NjU3NWY0MywgMHg0ZjRkNTA0OSwgMHg0YzQ1NTIzYSwKLTB4MjA2NzYzNjMsIDB4MjA3NjY1NzIsIDB4NzM2OTZmNmUsIDB4MjAzMjJlMzcsCi0weDJlMzIwMDAwLCAweDAsIDB4MCwgMHgwLAotMHgwLCAweDI0NDg2NTYxLCAweDY0NjU3MjNhLCAweDIwMmY3MDcyLAotMHg2ZjZhNjU2MywgMHg3NDczMmY3MiwgMHg2MzczMmY3MywgMHg3NzJmNjc2NSwKLTB4MmYyZTJmNmUsIDB4Njk2MzJmNjYsIDB4NzcyZjYzNmYsIDB4NmQ2ZDZmNmUsCi0weDJmNmQ2NTZkLCAweDJlNjMyYzc2LCAweDIwMzEyZTMxLCAweDJlMzIyZTMyLAotMHgyMDMxMzkzOSwgMHgzODJmMzAzNCwgMHgyZjMyMzcyMCwgMHgzMjMyM2EzMSwKLTB4MzMzYTM0MzQsIDB4MjA3MzY4NzUsIDB4NjE2ZTY3MjAsIDB4NDU3ODcwMjAsCi0weDI0MDAwMDAwLCAweDI0NDg2NTYxLCAweDY0NjU3MjNhLCAweDIwMmY3MDcyLAotMHg2ZjZhNjU2MywgMHg3NDczMmY3MiwgMHg2MzczMmY3MywgMHg3NzJmNjc2NSwKLTB4MmYyZTJmNmUsIDB4Njk2MzJmNjYsIDB4NzcyZjYzNmYsIDB4NmQ2ZDZmNmUsCi0weDJmNzM2NTZlLCAweDY0MmU2MzJjLCAweDc2MjAzMTJlLCAweDMxMmUzMjJlLAotMHgzMTMxMjAzMSwgMHgzOTM5MzgyZiwgMHgzMTMyMmYzMiwgMHgzMjIwMzEzNywKLTB4M2EzMTM3M2EsIDB4MzUzNTIwNzMsIDB4Njg3NTYxNmUsIDB4NjcyMDQ1NzgsCi0weDcwMjAyNDAwLCAweDczNmU2NDY0LCAweDY1NGU2ZjUxLCAweDIwMDAwMDAwLAotMHg2ZTZmNDU0ZSwgMHg1MTVmNTQ1OCwgMHgwLCAweDczNmU2NDY0LAotMHg3NDRlNmY1MSwgMHgyMDAwMDAwMCwgMHgzZjZlNmY1MSwgMHg2NDU0Nzg0NSwKLTB4MCwgMHg3NTZlNmI3MiwgMHg2NDc0Nzk3MCwgMHg2NTAwMDAwMCwKLTB4MCwgMHhhY2NjLCAweGFjY2MsIDB4YWQ5YywKLTB4YWFiMCwgMHhhYWIwLCAweGFkOWMsIDB4YWQ5YywKLTB4YWQ5YywgMHhhZDljLCAweGFkOWMsIDB4YWQ5YywKLTB4YWQ5YywgMHhhZDljLCAweGFkOWMsIDB4YWQ5YywKLTB4YWQ5YywgMHhhZDljLCAweGFkOWMsIDB4YWQ3YywKLTB4MCwgMHhiY2E4LCAweGJjYTgsIDB4YmQ3MCwKLTB4YWU0YywgMHhiMDU4LCAweGJkNzAsIDB4YmQ3MCwKLTB4YmQ3MCwgMHhiZDcwLCAweGJkNzAsIDB4YmQ3MCwKLTB4YmQ3MCwgMHhiZDcwLCAweGJkNzAsIDB4YmQ3MCwKLTB4YmQ3MCwgMHhiZDcwLCAweGJkNzAsIDB4YmQ1NCwKLTB4YjA0MCwgMHgyNDQ4NjU2MSwgMHg2NDY1NzIzYSwgMHgyMDJmNzA3MiwKLTB4NmY2YTY1NjMsIDB4NzQ3MzJmNzIsIDB4NjM3MzJmNzMsIDB4NzcyZjY3NjUsCi0weDJmMmUyZjZlLCAweDY5NjMyZjY2LCAweDc3MmY2MzZmLCAweDZkNmQ2ZjZlLAotMHgyZjcyNjU2MywgMHg3NjJlNjMyYywgMHg3NjIwMzEyZSwgMHgzMTJlMzIyZSwKLTB4MzEzOTIwMzEsIDB4MzkzOTM4MmYsIDB4MzAzNzJmMzIsIDB4MzQyMDMyMzEsCi0weDNhMzMzMDNhLCAweDMwMzUyMDczLCAweDY4NzU2MTZlLCAweDY3MjA0NTc4LAotMHg3MDIwMjQwMCwgMHg3MDZiNTI3OCwgMHg0NTUyNTIwMCwgMHg2NjcyNmQzMiwKLTB4NGM2MTcyNjcsIDB4NjUwMDAwMDAsIDB4NzI3ODRlNmYsIDB4NTI3ODQyNjQsCi0weDAsIDB4NzI3ODUxNDQsIDB4NmQ2MTQ0NDYsIDB4MCwKLTB4NzI3ODUxNDQsIDB4NmQ2MTQyNDYsIDB4MCwgMHgzZjZlNmY1MSwKLTB4NjQ1Mjc4NDUsIDB4MCwgMHg3MDZiNTI3OCwgMHg0NTUyNTI3MywKLTB4MCwgMHg2NjcyNmQzMiwgMHg0YzcyNjc1MywgMHgwLAotMHg3Mjc4NGU2ZiwgMHg0MjY0NTMwMCwgMHgzZjcyNDI2NCwgMHg0NDZkNjE0NiwKLTB4MCwgMHgzZjcyNGE0MiwgMHg2NDQ0NmQ0NiwgMHgwLAotMHgwLCAweGY2NzgsIDB4ZjY3OCwgMHhmNjc4LAotMHhmNjc4LCAweGY2NzgsIDB4ZjY3OCwgMHhmNjc4LAotMHhmNjc4LCAweGY2NzgsIDB4ZjY3OCwgMHhmNjc4LAotMHhmNjc4LCAweGY2NzgsIDB4ZjY3OCwgMHhmNjc4LAotMHhmNjcwLCAweGY2NzAsIDB4ZjY3MCwgMHg1NzJkNDQ0ZCwKLTB4NDE0NTZlNDYsIDB4MCwgMHgwLCAweGZkYzAsCi0weDEwMTVjLCAweGZkZGMsIDB4MTAxNWMsIDB4MTAxNWMsCi0weDEwMTVjLCAweDEwMTVjLCAweDEwMTVjLCAweDEwMTVjLAotMHhmNzA0LCAweDEwMTVjLCAweDEwMTVjLCAweDEwMTVjLAotMHgxMDE1YywgMHgxMDE1YywgMHgxMDE1NCwgMHgxMDE1NCwKLTB4MTAxNTQsIDB4MjQ0ODY1NjEsIDB4NjQ2NTcyM2EsIDB4MjAyZjcwNzIsCi0weDZmNmE2NTYzLCAweDc0NzMyZjcyLCAweDYzNzMyZjczLCAweDc3MmY2NzY1LAotMHgyZjJlMmY2ZSwgMHg2OTYzMmY2NiwgMHg3NzJmNjM2ZiwgMHg2ZDZkNmY2ZSwKLTB4MmY2ZDYxNjMsIDB4MmU2MzJjNzYsIDB4MjAzMTJlMzEsIDB4MmUzMjJlMzEsCi0weDMyMjAzMTM5LCAweDM5MzgyZjMwLCAweDM0MmYzMjM3LCAweDIwMzIzMjNhLAotMHgzMTMzM2EzNCwgMHgzMjIwNzM2OCwgMHg3NTYxNmU2NywgMHgyMDQ1Nzg3MCwKLTB4MjAyNDAwMDAsIDB4NmQ2MTYzNzQsIDB4Nzg0MTU0NGUsIDB4MCwKLTB4NGU3NDUzNzksIDB4NmUyNjRjNmIsIDB4MCwgMHg3MjY1NmQ2MSwKLTB4NzM3MzcyNzQsIDB4MCwgMHg2YzY5NmU2YiwgMHg0NDRmNTc0ZSwKLTB4MCwgMHg2NTZlNzE0ZCwgMHg0NTc2NTA0NiwgMHg2MTY5NmMwMCwKLTB4NjU2ZTcxNGQsIDB4NDU3NjQ2NjEsIDB4Njk2YzAwMDAsIDB4NjY2MTY5NmMsCi0weDQ1NmU0NTRkLCAweDAsIDB4NmM2OTZlNmIsIDB4NTU1MDAwMDAsCi0weDAsIDB4MjQ0ODY1NjEsIDB4NjQ2NTcyM2EsIDB4MjAyZjcwNzIsCi0weDZmNmE2NTYzLCAweDc0NzMyZjcyLCAweDYzNzMyZjczLCAweDc3MmY2NzY1LAotMHgyZjJlMmY2ZSwgMHg2OTYzMmY2NiwgMHg3NzJmNjM2ZiwgMHg2ZDZkNmY2ZSwKLTB4MmY2MzZiNzMsIDB4NzU2ZDJlNjMsIDB4MmM3NjIwMzEsIDB4MmUzMTJlMzIsCi0weDJlMzIyMDMxLCAweDM5MzkzODJmLCAweDMwMzQyZjMyLCAweDM3MjAzMjMyLAotMHgzYTMxMzMzYSwgMHgzMzM5MjA3MywgMHg2ODc1NjE2ZSwgMHg2NzIwNDU3OCwKLTB4NzAyMDI0MDAsIDB4NTA3MjZmNjIsIDB4NjU1MDY4NzksIDB4MCwKLTB4NmM2ZTZiNDEsIDB4NTM1MzUyNTQsIDB4MCwgMHgxMWIyYywKLTB4MTFiYzQsIDB4MTFiZjgsIDB4MTFjMmMsIDB4MTFjNTgsCi0weDExYzZjLCAweDExY2E4LCAweDEyMDdjLCAweDExZGU0LAotMHgxMWUyNCwgMHgxMWU1MCwgMHgxMWU5MCwgMHgxMWVjMCwKLTB4MTFlZmMsIDB4MTFmMzAsIDB4MTIwN2MsIDB4MTIyYzAsCi0weDEyMmQ4LCAweDEyMzAwLCAweDEyMzIwLCAweDEyMzQ4LAotMHgxMjQ3OCwgMHgxMjRhMCwgMHgxMjRmNCwgMHgxMjUxYywKLTB4MCwgMHgxMjc4YywgMHgxMjg1YywgMHgxMjkzNCwKLTB4MTJhMDQsIDB4MTJhNjAsIDB4MTJiM2MsIDB4MTJiNjQsCi0weDEyYzQwLCAweDEyYzY4LCAweDEyZTEwLCAweDEyZTM4LAotMHgxMmZlMCwgMHgxMzFkOCwgMHgxMzQ2YywgMHgxMzM4MCwKLTB4MTM0NmMsIDB4MTM0OTgsIDB4MTMwMDgsIDB4MTMxYjAsCi0weDAsIDB4MTNiODQsIDB4MTNiYzgsIDB4MTNjNjAsCi0weDEzY2FjLCAweDEzZDFjLCAweDEzZGI0LCAweDEzZGU4LAotMHgxM2U3MCwgMHgxM2YwOCwgMHgxM2ZkOCwgMHgxNDAxOCwKLTB4MTQwOWMsIDB4MTQwYzAsIDB4MTQxZjQsIDB4NjQ2ZjQyNjEsCi0weDczNjU1MDY3LCAweDAsIDB4MCwgMHgwLAotMHgwLCAweDczNzQ2ZDYxLCAweDYzNGM0ZTRiLCAweDAsCi0weDAsIDB4MTRjMzgsIDB4MTRjMzgsIDB4MTRiODAsCi0weDE0YmM0LCAweDE0YzM4LCAweDE0YzM4LCAweDAsCi0weDAsIDB4MCB9Owotc3RhdGljIHUzMiB0aWdvbkZ3RGF0YVsoTUFYX0RBVEFfTEVOLzQpICsgMV0gX19kZXZpbml0ZGF0YSA9IHsKLTB4NDE2Yzc0NjUsCi0weDZmNmUyMDQxLCAweDYzNjU0ZTQ5LCAweDQzMjA1NjAwLCAweDQxNmM3NDY1LAotMHg2ZjZlMjA0MSwgMHg2MzY1NGU0OSwgMHg0MzIwNTYwMCwgMHg0MjQyNDI0MiwKLTB4MCwgMHgwLCAweDAsIDB4MTM1NDE4LAotMHgxM2U3ZmMsIDB4MCwgMHgwLCAweDAsCi0weDAsIDB4MCwgMHgwLCAweDYwY2YwMCwKLTB4NjAsIDB4Y2YwMDAwMDAsIDB4MCwgMHgwLAotMHgwLCAweDAsIDB4MCwgMHgwLAotMHgwLCAweDAsIDB4MCwgMHgwLAotMHgwLCAweDAsIDB4MCwgMHgwLAotMHgwLCAweDAsIDB4MCwgMHgwLAotMHgwLCAweDAsIDB4MywgMHgwLAotMHgxLCAweDAsIDB4MCwgMHgwLAotMHgxLCAweDAsIDB4MSwgMHgwLAotMHgwLCAweDAsIDB4MCwgMHgxLAotMHgxLCAweDAsIDB4MCwgMHgwLAotMHgwLCAweDAsIDB4MTAwMDAwMCwgMHgyMTAwMDAwMCwKLTB4MTIwMDAxNDAsIDB4MCwgMHgwLCAweDIwMDAwMDAwLAotMHgxMjAwMDBhMCwgMHgwLCAweDEyMDAwMDYwLCAweDEyMDAwMTgwLAotMHgxMjAwMDFlMCwgMHgwLCAweDAsIDB4MCwKLTB4MSwgMHgwLCAweDAsIDB4MCwKLTB4MCwgMHgwLCAweDAsIDB4MiwKLTB4MCwgMHgwLCAweDMwMDAxLCAweDEsCi0weDMwMjAxLCAweDAsIDB4MCwgMHgwIH07Ci0jZW5kaWYKLS8qIEdlbmVyYXRlZCBieSBnZW5mdy5jICovCi0jZGVmaW5lIHRpZ29uMkZ3UmVsZWFzZU1ham9yIDB4YwotI2RlZmluZSB0aWdvbjJGd1JlbGVhc2VNaW5vciAweDQKLSNkZWZpbmUgdGlnb24yRndSZWxlYXNlRml4IDB4YgotI2RlZmluZSB0aWdvbjJGd1N0YXJ0QWRkciAweDAwMDA0MDAwCi0jZGVmaW5lIHRpZ29uMkZ3VGV4dEFkZHIgMHgwMDAwNDAwMAotI2RlZmluZSB0aWdvbjJGd1RleHRMZW4gMHgxMWJjMAotI2RlZmluZSB0aWdvbjJGd1JvZGF0YUFkZHIgMHgwMDAxNWJjMAotI2RlZmluZSB0aWdvbjJGd1JvZGF0YUxlbiAweDEwZDAKLSNkZWZpbmUgdGlnb24yRndEYXRhQWRkciAweDAwMDE2Y2MwCi0jZGVmaW5lIHRpZ29uMkZ3RGF0YUxlbiAweDFjMAotI2RlZmluZSB0aWdvbjJGd1Nic3NBZGRyIDB4MDAwMTZlODAKLSNkZWZpbmUgdGlnb24yRndTYnNzTGVuIDB4Y2MKLSNkZWZpbmUgdGlnb24yRndCc3NBZGRyIDB4MDAwMTZmNTAKLSNkZWZpbmUgdGlnb24yRndCc3NMZW4gMHgyMGMwCi1zdGF0aWMgdTMyIHRpZ29uMkZ3VGV4dFsoTUFYX1RFWFRfTEVOLzQpICsgMV0gX19kZXZpbml0ZGF0YSA9IHsKLTB4MCwKLTB4MTAwMDAwMDMsIDB4MCwgMHhkLCAweGQsCi0weDNjMWQwMDAxLCAweDhmYmQ2ZDIwLCAweDNhMGYwMjEsIDB4M2MxMDAwMDAsCi0weDI2MTA0MDAwLCAweGMwMDEwYzAsIDB4MCwgMHhkLAotMHgzYzFkMDAwMSwgMHg4ZmJkNmQyNCwgMHgzYTBmMDIxLCAweDNjMTAwMDAwLAotMHgyNjEwNDAwMCwgMHhjMDAxN2UwLCAweDAsIDB4ZCwKLTB4MCwgMHgwLCAweDAsIDB4MCwKLTB4MCwgMHgwLCAweDAsIDB4MCwKLTB4MCwgMHgwLCAweDAsIDB4MCwKLTB4MCwgMHgwLCAweDAsIDB4MCwKLTB4MCwgMHgwLCAweDAsIDB4MCwKLTB4MCwgMHgwLCAweDAsIDB4MCwKLTB4MCwgMHgwLCAweDAsIDB4MCwKLTB4MCwgMHgwLCAweDAsIDB4MCwKLTB4MCwgMHgwLCAweDAsIDB4MCwKLTB4MCwgMHgwLCAweDAsIDB4MCwKLTB4MCwgMHgwLCAweDAsIDB4MjAwMDAwOCwKLTB4MCwgMHg4MDAxNzJmLCAweDNjMGEwMDAxLCAweDgwMDE3MmYsCi0weDNjMGEwMDAyLCAweDgwMDE3MmYsIDB4MCwgMHg4MDAyY2FjLAotMHgwLCAweDgwMDJjNGYsIDB4MCwgMHg4MDAxNzJmLAotMHgzYzBhMDAwNCwgMHg4MDAzMjhhLCAweDAsIDB4ODAwMWE1MiwKLTB4MCwgMHg4MDAzOTRkLCAweDAsIDB4ODAwMzhmNCwKLTB4MCwgMHg4MDAxNzJmLCAweDNjMGEwMDA2LCAweDgwMDM5YmIsCi0weDNjMGEwMDA3LCAweDgwMDE3MmYsIDB4M2MwYTAwMDgsIDB4ODAwMTcyZiwKLTB4M2MwYTAwMDksIDB4ODAwM2ExMywgMHgwLCAweDgwMDJlYTYsCi0weDAsIDB4ODAwMTcyZiwgMHgzYzBhMDAwYiwgMHg4MDAxNzJmLAotMHgzYzBhMDAwYywgMHg4MDAxNzJmLCAweDNjMGEwMDBkLCAweDgwMDI4ZmIsCi0weDAsIDB4ODAwMjg5MCwgMHgwLCAweDgwMDE3MmYsCi0weDNjMGEwMDBlLCAweDgwMDIwOGMsIDB4MCwgMHg4MDAxOTY0LAotMHgwLCAweDgwMDFhMDQsIDB4MCwgMHg4MDAzY2E2LAotMHgwLCAweDgwMDNjOTQsIDB4MCwgMHg4MDAxNzJmLAotMHgwLCAweDgwMDE5MWEsIDB4MCwgMHg4MDAxNzJmLAotMHgwLCAweDgwMDE3MmYsIDB4M2MwYTAwMTMsIDB4ODAwMTcyZiwKLTB4M2MwYTAwMTQsIDB4MCwgMHgwLCAweDAsCi0weDAsIDB4MCwgMHgwLCAweDAsCi0weDAsIDB4MCwgMHgwLCAweDAsCi0weDAsIDB4MCwgMHgwLCAweDAsCi0weDAsIDB4MCwgMHgwLCAweDAsCi0weDAsIDB4MCwgMHgwLCAweDAsCi0weDAsIDB4MCwgMHgwLCAweDAsCi0weDAsIDB4MCwgMHgwLCAweDAsCi0weDAsIDB4MCwgMHgwLCAweDAsCi0weDAsIDB4MCwgMHgwLCAweDAsCi0weDAsIDB4MCwgMHgwLCAweDAsCi0weDAsIDB4MCwgMHgwLCAweDAsCi0weDAsIDB4MCwgMHgwLCAweDAsCi0weDAsIDB4MCwgMHgwLCAweDAsCi0weDAsIDB4MCwgMHgwLCAweDAsCi0weDAsIDB4MCwgMHgwLCAweDI3YmRmZmUwLAotMHgzYzFjYzAwMCwgMHhhZmJmMDAxYywgMHhhZmIwMDAxOCwgMHg4ZjgyMDE0MCwKLTB4MjQwMzAwMDMsIDB4YWY4MzAwZWMsIDB4MzQ0MjAwMDQsIDB4YzAwMmIyMCwKLTB4YWY4MjAxNDAsIDB4M2MwMTAwYzAsIDB4YzAwMTc2MywgMHhhYzIwM2ZmYywKLTB4NDAxODIxLCAweDNjMDIwMDEwLCAweDNjMDEwMDAxLCAweGFjMjM2ZTljLAotMHgxMDYyMDAxMSwgMHg0MzEwMmIsIDB4MTQ0MDAwMDIsIDB4M2MwMjAwMjAsCi0weDNjMDIwMDA4LCAweDEwNjIwMDBjLCAweDI0MDUwMTAwLCAweDNjMDYwMDAxLAotMHg4Y2M2NmU5YywgMHgzYzA0MDAwMSwgMHgyNDg0NWM3NCwgMHgzODIxLAotMHhhZmEwMDAxMCwgMHhjMDAyYjNiLCAweGFmYTAwMDE0LCAweDNjMDIwMDIwLAotMHgzYzAxMDAwMSwgMHhhYzIyNmU5YywgMHgyNDAyMDAwOCwgMHgzYzAxMDAwMSwKLTB4YWMyMjZlYjQsIDB4MjQwMjAwMWYsIDB4M2MwMTAwMDEsIDB4YWMyMjZlYzQsCi0weDI0MDIwMDE2LCAweDNjMDEwMDAxLCAweGFjMjI2ZTk4LCAweDNjMDVmZmZlLAotMHgzNGE1NmYwOCwgMHgzYzAyMDAwMSwgMHg4YzQyNmU5YywgMHgzYzAzMDAwMiwKLTB4MjQ2MzkwMTAsIDB4M2MwNDAwMDEsIDB4OGM4NDZjYzQsIDB4NDMxMDIzLAotMHgxNDgwMDAwMiwgMHg0NTgwMjEsIDB4MjYxMGZhMzgsIDB4MjQwMmYwMDAsCi0weDIwMjgwMjQsIDB4YzAwMTc4NSwgMHgyMDAyMDIxLCAweDIwMjI4MjMsCi0weDNjMDQwMDIwLCAweDgyMTgyMywgMHg2NTE4MjMsIDB4MjQ3YmIwMDAsCi0weDNjMDNmZmZlLCAweDM0NjNiZjA4LCAweDM2M2I4MjEsIDB4M2MwNjAwYmYsCi0weDM0YzZmMDAwLCAweDNjMDcwMDAxLCAweDhjZTc2Y2MwLCAweDNjMDMwMGJmLAotMHgzNDYzZTAwMCwgMHg4NTIwMjMsIDB4M2MwMTAwMDEsIDB4YWMyNDZlYTgsCi0weDgyMjAyMywgMHgzYzAxMDAwMSwgMHhhYzI1NmU5MCwgMHg1Mjg0MiwKLTB4M2MwMTAwMDEsIDB4YWMyMjZlODQsIDB4Mjc2MjBmZmMsIDB4M2MwMTAwMDEsCi0weGFjMjI2ZDIwLCAweDI3NjIxZmZjLCAweGRiMzAyMywgMHg3YjE4MjMsCi0weDNjMDEwMDAxLCAweGFjMjQ2ZTg4LCAweDNjMDEwMDAxLCAweGFjMjU2ZWFjLAotMHgzYzAxMDAwMSwgMHhhYzIyNmQyNCwgMHhhZjg2MDE1MCwgMHgxMGUwMDAxMSwKLTB4YWY4MzAyNTAsIDB4M2MxZDAwMDEsIDB4OGZiZDZjY2MsIDB4M2EwZjAyMSwKLTB4YzAwMTc0OSwgMHgwLCAweDNjMDIwMDAxLCAweDhjNDI2Y2QwLAotMHgzYzAzMDAwMSwgMHg4YzYzNmNkNCwgMHgyNDQyZmUwMCwgMHgyNDYzMDIwMCwKLTB4M2MwMTAwMDEsIDB4YWMyMjZjZDAsIDB4M2MwMTAwMDEsIDB4MTAwMDAwMDQsCi0weGFjMjM2Y2Q0LCAweDNjMWQwMDAxLCAweDhmYmQ2ZDIwLCAweDNhMGYwMjEsCi0weDNjMDIwMDAxLCAweDhjNDI2Y2M0LCAweDEwNDAwMDBkLCAweDI2ZmFmYTM4LAotMHgzYzAyMDAwMSwgMHg4YzQyNmNkMCwgMHgzYzAzMDAwMSwgMHg4YzYzNmNkNCwKLTB4M2MxYTAwMDEsIDB4OGY1YTZjZDQsIDB4MjQ0MmZhMzgsIDB4MjQ2MzA1YzgsCi0weDNjMDEwMDAxLCAweGFjMjI2Y2QwLCAweDNjMDEwMDAxLCAweGFjMjM2Y2Q0LAotMHgzYzAyMDAwMSwgMHg4YzQyNmNjOCwgMHgxNDQwMDAwMywgMHgwLAotMHgzYzAxMDAwMSwgMHhhYzIwNmNkMCwgMHhjMDAxMTUxLCAweDAsCi0weDhmYmYwMDFjLCAweDhmYjAwMDE4LCAweDNlMDAwMDgsIDB4MjdiZDAwMjAsCi0weDNjMDIwMDAxLCAweDhjNDI2Y2QwLCAweDNjMDMwMDAxLCAweDhjNjM2Y2Q0LAotMHgyN2JkZmY5OCwgMHhhZmIwMDA0OCwgMHgzYzEwMDAwMSwgMHg4ZTEwNjZiOCwKLTB4YWZiMjAwNTAsIDB4M2MxMjAwMDAsIDB4MjY1MjQxMDAsIDB4YWZiZjAwNjAsCi0weGFmYmUwMDVjLCAweGFmYjUwMDU4LCAweGFmYjMwMDU0LCAweGFmYjEwMDRjLAotMHhhZmEyMDAzNCwgMHhhZmEzMDAzMCwgMHhhZmEwMDAxMCwgMHhhZmEwMDAxNCwKLTB4OGY4NjAwNDAsIDB4M2MwNDAwMDEsIDB4MjQ4NDVjODAsIDB4MjQwNTAyMDAsCi0weDNjMDEwMDAxLCAweGFjMzI2ZTgwLCAweGMwMDJiM2IsIDB4MjAwMzgyMSwKLTB4OGY4MzAwNDAsIDB4M2MwMmYwMDAsIDB4NjIxODI0LCAweDNjMDI2MDAwLAotMHgxMDYyMDAwYiwgMHhhM2EwMDAzZiwgMHgyNDBlMDAwMSwgMHgzYzA0MDAwMSwKLTB4MjQ4NDVjODgsIDB4YTNhZTAwM2YsIDB4YWZhMDAwMTAsIDB4YWZhMDAwMTQsCi0weDhmODYwMDQwLCAweDI0MDUwMzAwLCAweGMwMDJiM2IsIDB4MjAwMzgyMSwKLTB4OGY4MjAyNDAsIDB4M2MwMzAwMDEsIDB4NDMxMDI1LCAweGFmODIwMjQwLAotMHhhZjgwMDA0OCwgMHg4ZjgyMDA0OCwgMHgxNDQwMDAwNSwgMHgwLAotMHhhZjgwMDA0OCwgMHg4ZjgyMDA0OCwgMHgxMDQwMDAwNCwgMHgwLAotMHhhZjgwMDA0OCwgMHgxMDAwMDAwMywgMHgyZTAyMDIxLCAweGFmODAwMDRjLAotMHgyZTAyMDIxLCAweDNjMDUwMDAxLCAweGMwMDJiYTgsIDB4MzRhNTQwZjgsCi0weDM0MDIwMjEsIDB4YzAwMmJhOCwgMHgyNDA1MDVjOCwgMHgzYzAyMDAwMSwKLTB4OGM0MjZlYTgsIDB4M2MwZDAwMDEsIDB4OGRhZDZlODgsIDB4M2MwMzAwMDEsCi0weDhjNjM2ZTg0LCAweDNjMDgwMDAxLCAweDhkMDg2ZTkwLCAweDNjMDkwMDAxLAotMHg4ZDI5NmVhYywgMHgzYzBhMDAwMSwgMHg4ZDRhNmViNCwgMHgzYzBiMDAwMSwKLTB4OGQ2YjZlYzQsIDB4M2MwYzAwMDEsIDB4OGQ4YzZlOTgsIDB4M2MwNDAwMDEsCi0weDI0ODQ1Yzk0LCAweDI0MDUwNDAwLCAweGFmNDIwMTNjLCAweDhmNDIwMTNjLAotMHgyNDA2MDAwMSwgMHgyNDA3MDAwMSwgMHhhZjQwMDAwMCwgMHhhZjRkMDEzOCwKLTB4YWY0MzAxNDQsIDB4YWY0ODAxNDgsIDB4YWY0OTAxNGMsIDB4YWY0YTAxNTAsCi0weGFmNGIwMTU0LCAweGFmNGMwMTU4LCAweDI0NDJmZjgwLCAweGFmNDIwMTQwLAotMHgyNDAyMDAwMSwgMHhhZmEyMDAxMCwgMHhjMDAyYjNiLCAweGFmYTAwMDE0LAotMHg4ZjQyMDEzOCwgMHhhZmEyMDAxMCwgMHg4ZjQyMDEzYywgMHhhZmEyMDAxNCwKLTB4OGY0NjAxNDQsIDB4OGY0NzAxNDgsIDB4M2MwNDAwMDEsIDB4MjQ4NDVjYTAsCi0weGMwMDJiM2IsIDB4MjQwNTA1MDAsIDB4YWZiNzAwMTAsIDB4YWZiYTAwMTQsCi0weDhmNDYwMTRjLCAweDhmNDcwMTUwLCAweDNjMDQwMDAxLCAweDI0ODQ1Y2FjLAotMHhjMDAyYjNiLCAweDI0MDUwNjAwLCAweDNjMDIwMDAxLCAweDhjNDI2ZTljLAotMHgzNjAzODIxLCAweDNjMDYwMDAyLCAweDI0YzY5MDEwLCAweDI0NDhmZmZmLAotMHgxMDYxODI0LCAweGU4MTAyNCwgMHg0MzEwMmIsIDB4MTA0MDAwMDYsCi0weDI0MDUwOTAwLCAweDNjMDQwMDAxLCAweDI0ODQ1Y2I4LCAweGFmYTgwMDEwLAotMHhjMDAyYjNiLCAweGFmYTAwMDE0LCAweDhmODIwMDBjLCAweGFmYTIwMDEwLAotMHg4ZjgyMDAzYywgMHhhZmEyMDAxNCwgMHg4Zjg2MDAwMCwgMHg4Zjg3MDAwNCwKLTB4M2MwNDAwMDEsIDB4MjQ4NDVjYzQsIDB4YzAwMmIzYiwgMHgyNDA1MTAwMCwKLTB4OGMwMjAyMjAsIDB4OGMwMzAyMjQsIDB4OGMwNjAyMTgsIDB4OGMwNzAyMWMsCi0weDNjMDQwMDAxLCAweDI0ODQ1Y2NjLCAweDI0MDUxMTAwLCAweGFmYTIwMDEwLAotMHhjMDAyYjNiLCAweGFmYTMwMDE0LCAweGFmODAwMDU0LCAweGFmODAwMTFjLAotMHg4YzAyMDIxOCwgMHgzMDQyMDAwMiwgMHgxMDQwMDAwOSwgMHgwLAotMHg4YzAyMDIyMCwgMHgzYzAzMDAwMiwgMHgzNDYzMDAwNCwgMHg0MzEwMjUsCi0weGFmNDIwMDBjLCAweDhjMDIwMjFjLCAweDEwMDAwMDA4LCAweDM0NDIwMDA0LAotMHg4YzAyMDIyMCwgMHgzYzAzMDAwMiwgMHgzNDYzMDAwNiwgMHg0MzEwMjUsCi0weGFmNDIwMDBjLCAweDhjMDIwMjFjLCAweDM0NDIwMDA2LCAweGFmNDIwMDE0LAotMHg4YzAyMDIxOCwgMHgzMDQyMDAxMCwgMHgxMDQwMDAwYSwgMHgwLAotMHg4YzAyMDIxYywgMHgzNDQyMDAwNCwgMHhhZjQyMDAxMCwgMHg4YzAyMDIyMCwKLTB4M2MwMzAwMGEsIDB4MzQ2MzAwMDQsIDB4NDMxMDI1LCAweDEwMDAwMDA5LAotMHhhZjQyMDAwOCwgMHg4YzAyMDIyMCwgMHgzYzAzMDAwYSwgMHgzNDYzMDAwNiwKLTB4NDMxMDI1LCAweGFmNDIwMDA4LCAweDhjMDIwMjFjLCAweDM0NDIwMDA2LAotMHhhZjQyMDAxMCwgMHgyNDAyMDAwMSwgMHhhZjgyMDBhMCwgMHhhZjgyMDBiMCwKLTB4OGY4MzAwNTQsIDB4OGY4MjAwNTQsIDB4YWY4MDAwZDAsIDB4YWY4MDAwYzAsCi0weDEwMDAwMDAyLCAweDI0NjMwMDY0LCAweDhmODIwMDU0LCAweDYyMTAyMywKLTB4MmM0MjAwNjUsIDB4MTQ0MGZmZmMsIDB4MCwgMHg4YzA0MDIwOCwKLTB4OGMwNTAyMGMsIDB4MjZlMjAwMjgsIDB4YWVlMjAwMjAsIDB4MjQwMjA0OTAsCi0weGFlZTIwMDEwLCAweGFlZTQwMDA4LCAweGFlZTUwMDBjLCAweDI2ZTQwMDA4LAotMHg4YzgyMDAwMCwgMHg4YzgzMDAwNCwgMHhhZjgyMDA5MCwgMHhhZjgzMDA5NCwKLTB4OGM4MjAwMTgsIDB4YWY4MjAwYjQsIDB4OTQ4MjAwMGEsIDB4YWY4MjAwOWMsCi0weDhmNDIwMDE0LCAweGFmODIwMGIwLCAweDhmODIwMGIwLCAweDMwNDIwMDA0LAotMHgxNDQwZmZmZCwgMHgwLCAweDhmODIwMGIwLCAweDNjMDNlZjAwLAotMHg0MzEwMjQsIDB4MTA0MDAwMjEsIDB4MCwgMHg4ZjgyMDBiNCwKLTB4YWZhMjAwMTAsIDB4OGY4MjAwOTAsIDB4OGY4MzAwOTQsIDB4M2MwNDAwMDEsCi0weDI0ODQ1Y2Q0LCAweGFmYTMwMDE0LCAweDhmODYwMGIwLCAweDhmODcwMDljLAotMHgzYzA1MDAwMSwgMHhjMDAyYjNiLCAweDM0YTUyMDBkLCAweDNjMDQwMDAxLAotMHgyNDg0NWNlMCwgMHgyNDAyMDNjMCwgMHhhZmEyMDAxMCwgMHhhZmEwMDAxNCwKLTB4OGY4NjAxNDQsIDB4M2MwNzAwMDEsIDB4MjRlNzVjZTgsIDB4YzAwMmIzYiwKLTB4MzQwNWRlYWQsIDB4OGY4MjAxMWMsIDB4MzQ0MjAwMDIsIDB4YWY4MjAxMWMsCi0weDhmODIwMjIwLCAweDM0NDIwMDA0LCAweGFmODIwMjIwLCAweDhmODIwMTQwLAotMHgzYzAzMDAwMSwgMHg0MzEwMjUsIDB4YWY4MjAxNDAsIDB4OTZlMjA0NzIsCi0weDk2ZTYwNDUyLCAweDk2ZTcwNDYyLCAweGFmYTIwMDEwLCAweDk2ZTIwNDgyLAotMHgzYzA0MDAwMSwgMHgyNDg0NWQxNCwgMHgyNDA1MTIwMCwgMHhjMDAyYjNiLAotMHhhZmEyMDAxNCwgMHg5NmYwMDQ1MiwgMHgzMjAyMDAwMSwgMHgxMDQwMDAwMiwKLTB4YjAyMSwgMHgyNDE2MDAwMSwgMHgzMjAyMDAwMiwgMHg1NDQwMDAwMSwKLTB4MzZkNjAwMDIsIDB4MzIwMjAwMDgsIDB4NTQ0MDAwMDEsIDB4MzZkNjAwMDQsCi0weDMyMDIwMDEwLCAweDU0NDAwMDAxLCAweDM2ZDYwMDA4LCAweDMyMDIwMDIwLAotMHg1NDQwMDAwMSwgMHgzNmQ2MDAxMCwgMHgzMjAyMDA0MCwgMHg1NDQwMDAwMSwKLTB4MzZkNjAwMjAsIDB4MzIwMjAwODAsIDB4NTQ0MDAwMDEsIDB4MzZkNjAwNDAsCi0weDk2ZTYwNDgyLCAweDMwYzIwMjAwLCAweDU0NDAwMDAxLCAweDM2ZDY0MDAwLAotMHg5NmUzMDQ3MiwgMHgzMDYyMDIwMCwgMHgxMDQwMDAwMywgMHgzMDYyMDEwMCwKLTB4MTAwMDAwMDMsIDB4MzZkNjIwMDAsIDB4NTQ0MDAwMDEsIDB4MzZkNjEwMDAsCi0weDk2ZjAwNDYyLCAweDMyYzI0MDAwLCAweDE0NDAwMDA0LCAweDMyMDcwMDliLAotMHgzMGMyMDA5YiwgMHgxNGUyMDAwNywgMHgyNDBlMDAwMSwgMHgzMmMyMjAwMCwKLTB4MTQ0MDAwMGQsIDB4MzIwMjAwMDEsIDB4MzA2MjAwOWIsIDB4MTBlMjAwMDksCi0weDI0MGUwMDAxLCAweDNjMDQwMDAxLCAweDI0ODQ1ZDIwLCAweDI0MDUxMzAwLAotMHgyMDAzODIxLCAweGEzYWUwMDNmLCAweGFmYTMwMDEwLCAweGMwMDJiM2IsCi0weGFmYTAwMDE0LCAweDMyMDIwMDAxLCAweDU0NDAwMDAxLCAweDM2ZDYwMDgwLAotMHgzMjAyMDAwMiwgMHg1NDQwMDAwMSwgMHgzNmQ2MDEwMCwgMHgzMjAyMDAwOCwKLTB4NTQ0MDAwMDEsIDB4MzZkNjAyMDAsIDB4MzIwMjAwMTAsIDB4NTQ0MDAwMDEsCi0weDM2ZDYwNDAwLCAweDMyMDIwMDgwLCAweDU0NDAwMDAxLCAweDM2ZDYwODAwLAotMHg4YzAyMDIxOCwgMHgzMDQyMDIwMCwgMHgxMDQwMDAwMiwgMHgzYzAyMDAwOCwKLTB4MmMyYjAyNSwgMHg4YzAyMDIxOCwgMHgzMDQyMDgwMCwgMHgxMDQwMDAwMiwKLTB4M2MwMjAwODAsIDB4MmMyYjAyNSwgMHg4YzAyMDIxOCwgMHgzMDQyMDQwMCwKLTB4MTA0MDAwMDIsIDB4M2MwMjAxMDAsIDB4MmMyYjAyNSwgMHg4YzAyMDIxOCwKLTB4MzA0MjAxMDAsIDB4MTA0MDAwMDIsIDB4M2MwMjAyMDAsIDB4MmMyYjAyNSwKLTB4OGMwMjAyMTgsIDB4MzA0MjAwODAsIDB4MTA0MDAwMDIsIDB4M2MwMjA0MDAsCi0weDJjMmIwMjUsIDB4OGMwMjAyMTgsIDB4MzA0MjIwMDAsIDB4MTA0MDAwMDIsCi0weDNjMDIwMDEwLCAweDJjMmIwMjUsIDB4OGMwMjAyMTgsIDB4MzA0MjQwMDAsCi0weDEwNDAwMDAyLCAweDNjMDIwMDIwLCAweDJjMmIwMjUsIDB4OGMwMjAyMTgsCi0weDMwNDIxMDAwLCAweDEwNDAwMDAyLCAweDNjMDIwMDQwLCAweDJjMmIwMjUsCi0weDhlZTIwNDk4LCAweDhlZTMwNDljLCAweGFmNDIwMTYwLCAweGFmNDMwMTY0LAotMHg4ZWUyMDRhMCwgMHg4ZWUzMDRhNCwgMHhhZjQyMDE2OCwgMHhhZjQzMDE2YywKLTB4OGVlMjA0YTgsIDB4OGVlMzA0YWMsIDB4YWY0MjAxNzAsIDB4YWY0MzAxNzQsCi0weDhlZTIwNDI4LCAweDhlZTMwNDJjLCAweGFmNDIwMTc4LCAweGFmNDMwMTdjLAotMHg4ZWUyMDQ0OCwgMHg4ZWUzMDQ0YywgMHhhZjQyMDE4MCwgMHhhZjQzMDE4NCwKLTB4OGVlMjA0NTgsIDB4OGVlMzA0NWMsIDB4YWY0MjAxODgsIDB4YWY0MzAxOGMsCi0weDhlZTIwNDY4LCAweDhlZTMwNDZjLCAweGFmNDIwMTkwLCAweGFmNDMwMTk0LAotMHg4ZWUyMDQ3OCwgMHg4ZWUzMDQ3YywgMHhhZjQyMDE5OCwgMHhhZjQzMDE5YywKLTB4OGVlMjA0ODgsIDB4OGVlMzA0OGMsIDB4YWY0MjAxYTAsIDB4YWY0MzAxYTQsCi0weDhlZTIwNGIwLCAweDhlZTMwNGI0LCAweDI0MDQwMDgwLCAweGFmNDIwMWE4LAotMHhhZjQzMDFhYywgMHhjMDAyYmE4LCAweDI0MDUwMDgwLCAweDhjMDIwMjVjLAotMHgyNzQ0MDIyNCwgMHhhZjQyMDFmMCwgMHg4YzAyMDI2MCwgMHgyNDA1MDIwMCwKLTB4MjQwNjAwMDgsIDB4YzAwMmJiZiwgMHhhZjQyMDFmOCwgMHgzYzA0M2I5YSwKLTB4MzQ4NGNhMDAsIDB4MzgyMSwgMHgyNDAyMDAwNiwgMHgyNDAzMDAwMiwKLTB4YWY0MjAxZjQsIDB4MjQwMjAzZTgsIDB4YWY0MzAyMDQsIDB4YWY0MzAyMDAsCi0weGFmNDQwMWZjLCAweGFmNDIwMjk0LCAweDI0MDIwMDAxLCAweGFmNDMwMjkwLAotMHhhZjQyMDI5YywgMHgzYzAzMDAwMSwgMHg2NzE4MjEsIDB4OTA2MzZjZDgsCi0weDM0NzEwMjEsIDB4MjRlNzAwMDEsIDB4YTA0MzAyMmMsIDB4MmNlMjAwMGYsCi0weDE0NDBmZmY4LCAweDM0NzE4MjEsIDB4MjRlNzAwMDEsIDB4M2MwODAwMDEsCi0weDM1MDg0MGY4LCAweDhmODIwMDQwLCAweDNjMDQwMDAxLCAweDI0ODQ1ZDJjLAotMHgyNDA1MTQwMCwgMHgyMTcwMiwgMHgyNDQyMDAzMCwgMHhhMDYyMDIyYywKLTB4MzQ3MTAyMSwgMHhhMDQwMDIyYywgMHg4YzA3MDIxOCwgMHgyYzAzMDIxLAotMHgyNDAyMDVjOCwgMHhhZmEyMDAxMCwgMHhjMDAyYjNiLCAweGFmYTgwMDE0LAotMHgzYzA0MDAwMSwgMHgyNDg0NWQzOCwgMHgzYzA1MDAwMCwgMHgyNGE1NWM4MCwKLTB4MjQwNjAwMTAsIDB4MjdiMTAwMzAsIDB4MjIwMzgyMSwgMHgyN2IzMDAzNCwKLTB4YzAwMTdhMywgMHhhZmIzMDAxMCwgMHgzYzAzMDAwMSwgMHg4YzYzNmNjOCwKLTB4MTA2MDAwMGEsIDB4NDA4MDIxLCAweDhmYTMwMDMwLCAweDI0MDVmZjAwLAotMHg4ZmEyMDAzNCwgMHgyNDY0MDBmZiwgMHg4NTIwMjQsIDB4ODMxODIzLAotMHg0MzEwMjMsIDB4YWZhMjAwMzQsIDB4YWZhNDAwMzAsIDB4M2MwNDAwMDEsCi0weDI0ODQ1ZDQ0LCAweDNjMDUwMDAwLCAweDI0YTU0MTAwLCAweDI0MDYwMTA4LAotMHgyMjAzODIxLCAweGMwMDE3YTMsIDB4YWZiMzAwMTAsIDB4NDA5MDIxLAotMHgzMmMyMDAwMywgMHgzYzAxMDAwMSwgMHhhYzMyNmU4MCwgMHgxMDQwMDA0NSwKLTB4MjIwMzgyMSwgMHg4ZjgyMDA1MCwgMHgzYzAzMDAxMCwgMHg0MzEwMjQsCi0weDEwNDAwMDE2LCAweDAsIDB4OGMwMjAyMTgsIDB4MzA0MjAwNDAsCi0weDEwNDAwMDBmLCAweDI0MDIwMDAxLCAweDhmODIwMDUwLCAweDhjMDMwMjE4LAotMHgyNDBlMDAwMSwgMHgzYzA0MDAwMSwgMHgyNDg0NWQ1MCwgMHhhM2FlMDAzZiwKLTB4YWZhMjAwMTAsIDB4YWZhMzAwMTQsIDB4OGY4NzAwNDAsIDB4MjQwNTE1MDAsCi0weGMwMDJiM2IsIDB4MmMwMzAyMSwgMHgxMDAwMDAwNCwgMHgwLAotMHgzYzAxMDAwMSwgMHgzNzA4MjEsIDB4YTAyMjQwZjQsIDB4M2MwNDAwMDEsCi0weDI0ODQ1ZDVjLCAweDNjMDUwMDAxLCAweDI0YTU1YjQwLCAweDNjMDYwMDAxLAotMHgyNGM2NWJhYywgMHhjNTMwMjMsIDB4OGY0MjAwMTAsIDB4MjdiMzAwMzAsCi0weDI2MDM4MjEsIDB4MjdiMTAwMzQsIDB4MzQ0MjBhMDAsIDB4YWY0MjAwMTAsCi0weGMwMDE3YTMsIDB4YWZiMTAwMTAsIDB4M2MwNDAwMDEsIDB4MjQ4NDVkNzAsCi0weDNjMDUwMDAxLCAweDI0YTViNzE0LCAweDNjMDYwMDAxLCAweDI0YzZiYTkwLAotMHhjNTMwMjMsIDB4MjYwMzgyMSwgMHhhZjQyMDEwOCwgMHhjMDAxN2EzLAotMHhhZmIxMDAxMCwgMHgzYzA0MDAwMSwgMHgyNDg0NWQ4YywgMHgzYzA1MDAwMSwKLTB4MjRhNWJlNTgsIDB4M2MwNjAwMDEsIDB4MjRjNmM5MDAsIDB4YzUzMDIzLAotMHgyNjAzODIxLCAweDNjMDEwMDAxLCAweGFjMjI2ZWY0LCAweGMwMDE3YTMsCi0weGFmYjEwMDEwLCAweDNjMDQwMDAxLCAweDI0ODQ1ZGE0LCAweDEwMDAwMDI0LAotMHgyNDA1MTYwMCwgMHgzYzA0MDAwMSwgMHgyNDg0NWRhYywgMHgzYzA1MDAwMSwKLTB4MjRhNWExMGMsIDB4M2MwNjAwMDEsIDB4MjRjNmEyMzgsIDB4YzUzMDIzLAotMHhjMDAxN2EzLCAweGFmYjMwMDEwLCAweDNjMDQwMDAxLCAweDI0ODQ1ZGJjLAotMHgzYzA1MDAwMSwgMHgyNGE1YjJiMCwgMHgzYzA2MDAwMSwgMHgyNGM2YjcwYywKLTB4YzUzMDIzLCAweDIyMDM4MjEsIDB4YWY0MjAxMDgsIDB4YzAwMTdhMywKLTB4YWZiMzAwMTAsIDB4M2MwNDAwMDEsIDB4MjQ4NDVkZDAsIDB4M2MwNTAwMDEsCi0weDI0YTViYTk4LCAweDNjMDYwMDAxLCAweDI0YzZiZTUwLCAweGM1MzAyMywKLTB4MjIwMzgyMSwgMHgzYzAxMDAwMSwgMHhhYzIyNmVmNCwgMHhjMDAxN2EzLAotMHhhZmIzMDAxMCwgMHgzYzA0MDAwMSwgMHgyNDg0NWRlNCwgMHgyNDA1MTY1MCwKLTB4MmMwMzAyMSwgMHgzODIxLCAweDNjMDEwMDAxLCAweGFjMjI2ZWY4LAotMHhhZmEwMDAxMCwgMHhjMDAyYjNiLCAweGFmYTAwMDE0LCAweDMyYzIwMDIwLAotMHgxMDQwMDAyMSwgMHgyN2E3MDAzMCwgMHgzYzA0MDAwMSwgMHgyNDg0NWRmMCwKLTB4M2MwNTAwMDEsIDB4MjRhNWIxM2MsIDB4M2MwNjAwMDEsIDB4MjRjNmIyYTgsCi0weGM1MzAyMywgMHgyNDAyMjAwMCwgMHhhZjQyMDAxYywgMHgyN2EyMDAzNCwKLTB4YzAwMTdhMywgMHhhZmEyMDAxMCwgMHgyMTkwMCwgMHgzMTk4MiwKLTB4M2MwNDA4MDAsIDB4NjQxODI1LCAweGFlNDMwMDI4LCAweDI0MDMwMDEwLAotMHhhZjQzMDAzYywgMHg5NmUzMDQ1MCwgMHhhZjQzMDA0MCwgMHg4ZjQzMDA0MCwKLTB4M2MwNDAwMDEsIDB4MjQ4NDVlMDQsIDB4YWZhMDAwMTQsIDB4YWZhMzAwMTAsCi0weDhmNDcwMDFjLCAweDI0MDUxNjYwLCAweDNjMDEwMDAxLCAweGFjMjI2ZWYwLAotMHgxMDAwMDAyNSwgMHgzMmM2MDAyMCwgMHg4ZWUyMDQ0OCwgMHg4ZWUzMDQ0YywKLTB4YWY0MzAwMWMsIDB4OGY0MjAwMWMsIDB4MjQ0MmUwMDAsIDB4MmM0MjIwMDEsCi0weDE0NDAwMDBhLCAweDI0MGUwMDAxLCAweDNjMDQwMDAxLCAweDI0ODQ1ZTEwLAotMHhhM2FlMDAzZiwgMHhhZmEwMDAxMCwgMHhhZmEwMDAxNCwgMHg4ZjQ2MDAxYywKLTB4MjQwNTE3MDAsIDB4YzAwMmIzYiwgMHgzODIxLCAweDNjMDIwMDAwLAotMHgyNDQyNWNiYywgMHgyMTEwMCwgMHgyMTE4MiwgMHgzYzAzMDgwMCwKLTB4NDMxMDI1LCAweGFlNDIwMDI4LCAweDI0MDIwMDA4LCAweGFmNDIwMDNjLAotMHg5NmUyMDQ1MCwgMHhhZjQyMDA0MCwgMHg4ZjQyMDA0MCwgMHgzYzA0MDAwMSwKLTB4MjQ4NDVlMWMsIDB4YWZhMDAwMTQsIDB4YWZhMjAwMTAsIDB4OGY0NzAwMWMsCi0weDI0MDUxODAwLCAweDMyYzYwMDIwLCAweGMwMDJiM2IsIDB4MCwKLTB4M2MwNTBmZmYsIDB4M2MwMzAwMDEsIDB4OGM2MzZlZjQsIDB4MzRhNWZmZmYsCi0weDI0MDMwMjEsIDB4M2MwMjAwMDEsIDB4OGM0MjZlZjgsIDB4M2MwNDA4MDAsCi0weDY1MTgyNCwgMHgzMTg4MiwgMHg2NDE4MjUsIDB4NDUxMDI0LAotMHgyMTA4MiwgMHg0NDEwMjUsIDB4YWNjMjAwODAsIDB4MzJjMjAxODAsCi0weDEwNDAwMDU2LCAweGFjYzMwMDIwLCAweDhmODIwMDVjLCAweDNjMDMwMDgwLAotMHg0MzEwMjQsIDB4MTA0MDAwMGQsIDB4MCwgMHg4ZjgyMDA1MCwKLTB4YWZhMjAwMTAsIDB4OGY4MjAwNWMsIDB4MjQwZTAwMDEsIDB4M2MwNDAwMDEsCi0weDI0ODQ1ZTI4LCAweGEzYWUwMDNmLCAweGFmYTIwMDE0LCAweDhmODcwMDQwLAotMHgyNDA1MTkwMCwgMHhjMDAyYjNiLCAweDJjMDMwMjEsIDB4OGY4MjAwNTAsCi0weDNjMDMwMDEwLCAweDQzMTAyNCwgMHgxMDQwMDAxNiwgMHgwLAotMHg4YzAyMDIxOCwgMHgzMDQyMDA0MCwgMHgxMDQwMDAwZiwgMHgyNDAyMDAwMSwKLTB4OGY4MjAwNTAsIDB4OGMwMzAyMTgsIDB4MjQwZTAwMDEsIDB4M2MwNDAwMDEsCi0weDI0ODQ1ZDUwLCAweGEzYWUwMDNmLCAweGFmYTIwMDEwLCAweGFmYTMwMDE0LAotMHg4Zjg3MDA0MCwgMHgyNDA1MjAwMCwgMHhjMDAyYjNiLCAweDJjMDMwMjEsCi0weDEwMDAwMDA0LCAweDAsIDB4M2MwMTAwMDEsIDB4MzcwODIxLAotMHhhMDIyNDBmNCwgMHgzYzA0MDAwMSwgMHgyNDg0NWUzNCwgMHgzYzA1MDAwMSwKLTB4MjRhNTVhYzAsIDB4M2MwNjAwMDEsIDB4MjRjNjViMzgsIDB4YzUzMDIzLAotMHg4ZjQyMDAwOCwgMHgyN2IzMDAzMCwgMHgyNjAzODIxLCAweDI3YjEwMDM0LAotMHgzNDQyMGUwMCwgMHhhZjQyMDAwOCwgMHhjMDAxN2EzLCAweGFmYjEwMDEwLAotMHgzYzA0MDAwMSwgMHgyNDg0NWU0YywgMHgzYzA1MDAwMSwgMHgyNGE1ZDhiNCwKLTB4M2MwNjAwMDEsIDB4MjRjNmUzYzgsIDB4YzUzMDIzLCAweDI2MDM4MjEsCi0weGFmNDIwMTBjLCAweGMwMDE3YTMsIDB4YWZiMTAwMTAsIDB4M2MwNDAwMDEsCi0weDI0ODQ1ZTY0LCAweDNjMDUwMDAxLCAweDI0YTVlOWFjLCAweDNjMDYwMDAxLAotMHgyNGM2ZjBmMCwgMHhjNTMwMjMsIDB4MjYwMzgyMSwgMHgzYzAxMDAwMSwKLTB4YWMyMjZmMDQsIDB4YzAwMTdhMywgMHhhZmIxMDAxMCwgMHgzYzA0MDAwMSwKLTB4MjQ4NDVlN2MsIDB4MTAwMDAwMjcsIDB4MjQwNTIxMDAsIDB4M2MwNDAwMDEsCi0weDI0ODQ1ZTg0LCAweDNjMDUwMDAxLCAweDI0YTU5ZmM4LCAweDNjMDYwMDAxLAotMHgyNGM2YTEwNCwgMHhjNTMwMjMsIDB4MjdiMTAwMzAsIDB4MjIwMzgyMSwKLTB4MjdiMzAwMzQsIDB4YzAwMTdhMywgMHhhZmIzMDAxMCwgMHgzYzA0MDAwMSwKLTB4MjQ4NDVlOTQsIDB4M2MwNTAwMDEsIDB4MjRhNWNhZDQsIDB4M2MwNjAwMDEsCi0weDI0YzZkOGFjLCAweGM1MzAyMywgMHgyMjAzODIxLCAweGFmNDIwMTBjLAotMHhjMDAxN2EzLCAweGFmYjMwMDEwLCAweDNjMDQwMDAxLCAweDI0ODQ1ZWE0LAotMHgzYzA1MDAwMSwgMHgyNGE1ZTg0YywgMHgzYzA2MDAwMSwgMHgyNGM2ZTlhNCwKLTB4YzUzMDIzLCAweDIyMDM4MjEsIDB4M2MwMTAwMDEsIDB4YWMyMjZmMDQsCi0weGMwMDE3YTMsIDB4YWZiMzAwMTAsIDB4M2MwNDAwMDEsIDB4MjQ4NDVlYjgsCi0weDI0MDUyMTUwLCAweDJjMDMwMjEsIDB4MzgyMSwgMHgzYzAxMDAwMSwKLTB4YWMyMjZmMTAsIDB4YWZhMDAwMTAsIDB4YzAwMmIzYiwgMHhhZmEwMDAxNCwKLTB4M2MxMTBmZmYsIDB4M2MwMzAwMDEsIDB4OGM2MzZmMDQsIDB4MzYzMWZmZmYsCi0weDI0MDk4MjEsIDB4M2MwMjAwMDEsIDB4OGM0MjZmMTAsIDB4M2MwZTA4MDAsCi0weDcxMTgyNCwgMHgzMTg4MiwgMHg2ZTE4MjUsIDB4NTExMDI0LAotMHgyMTA4MiwgMHg0ZTEwMjUsIDB4YWU2MzAwMzgsIDB4YWU2MjAwNzgsCi0weDhjMDIwMjE4LCAweDMwNDIwMDQwLCAweDE0NDAwMDA0LCAweDI0MDIwMDAxLAotMHgzYzAxMDAwMSwgMHgzNzA4MjEsIDB4YTAyMjQwZjQsIDB4M2MwNDAwMDEsCi0weDI0ODQ1ZWM0LCAweDNjMDUwMDAxLCAweDI0YTVlM2QwLCAweDNjMDYwMDAxLAotMHgyNGM2ZTUyYywgMHhjNTMwMjMsIDB4MjdiZTAwMzAsIDB4M2MwMzgyMSwKLTB4MjdiNTAwMzQsIDB4YzAwMTdhMywgMHhhZmI1MDAxMCwgMHgzYzAxMDAwMSwKLTB4YWMyMjZlZmMsIDB4NTExMDI0LCAweDIxMDgyLCAweDNjMGUwODAwLAotMHg0ZTEwMjUsIDB4YWU2MjAwNTAsIDB4MzJjMjIwMDAsIDB4MTA0MDAwMDYsCi0weDNjMDM4MjEsIDB4M2MwMjAwMDAsIDB4MjQ0MjVjYmMsIDB4MjIyMTAyNCwKLTB4MTAwMDAwMGYsIDB4MjEwODIsIDB4M2MwNDAwMDEsIDB4MjQ4NDVlZDgsCi0weDNjMDUwMDAxLCAweDI0YTVlNTM0LCAweDNjMDYwMDAxLCAweDI0YzZlNmU0LAotMHhjNTMwMjMsIDB4YzAwMTdhMywgMHhhZmI1MDAxMCwgMHgzYzAxMDAwMSwKLTB4YWMyMjZmMTQsIDB4NTExMDI0LCAweDIxMDgyLCAweDNjMGUwODAwLAotMHg0ZTEwMjUsIDB4YWU2MjAwNDgsIDB4MzJjMjQwMDAsIDB4MTA0MDAwMDUsCi0weDI3YTcwMDMwLCAweDNjMDIwMDAwLCAweDI0NDI1Y2JjLCAweDEwMDAwMDBlLAotMHgyMTEwMCwgMHgzYzA0MDAwMSwgMHgyNDg0NWVmMCwgMHgzYzA1MDAwMSwKLTB4MjRhNWU2ZWMsIDB4M2MwNjAwMDEsIDB4MjRjNmU4NDQsIDB4YzUzMDIzLAotMHgyN2EyMDAzNCwgMHhjMDAxN2EzLCAweGFmYTIwMDEwLCAweDNjMDEwMDAxLAotMHhhYzIyNmYwOCwgMHgyMTEwMCwgMHgyMTE4MiwgMHgzYzAzMDgwMCwKLTB4NDMxMDI1LCAweGFlNDIwMDYwLCAweDNjMDQwMDAxLCAweDI0ODQ1ZjA4LAotMHgzYzA1MDAwMSwgMHgyNGE1ODIzMCwgMHgzYzA2MDAwMSwgMHgyNGM2ODY1MCwKLTB4YzUzMDIzLCAweDI3YjEwMDMwLCAweDIyMDM4MjEsIDB4MjdiMzAwMzQsCi0weGMwMDE3YTMsIDB4YWZiMzAwMTAsIDB4M2MwZTBmZmYsIDB4MzVjZWZmZmYsCi0weDNjMDQwMDAxLCAweDI0ODQ1ZjE0LCAweDNjMDUwMDAwLCAweDI0YTU2NDY4LAotMHgzYzA2MDAwMCwgMHgyNGM2NjU4OCwgMHhjNTMwMjMsIDB4MjIwMzgyMSwKLTB4MjQwZjAyMSwgMHgzYzAxMDAwMSwgMHhhYzIyNmVkYywgMHg0ZTEwMjQsCi0weDIxMDgyLCAweDNjMTUwODAwLCAweDU1MTAyNSwgMHhhZmFlMDA0NCwKLTB4YWZjMjAwYjgsIDB4YzAwMTdhMywgMHhhZmIzMDAxMCwgMHgzYzA0MDAwMSwKLTB4MjQ4NDVmMjAsIDB4M2MwNTAwMDAsIDB4MjRhNTY1OTAsIDB4M2MwNjAwMDAsCi0weDI0YzY2ODA4LCAweDhmYWUwMDQ0LCAweGM1MzAyMywgMHgyMjAzODIxLAotMHgzYzAxMDAwMSwgMHhhYzIyNmVkMCwgMHg0ZTEwMjQsIDB4MjEwODIsCi0weDU1MTAyNSwgMHhhZmMyMDBlOCwgMHhjMDAxN2EzLCAweGFmYjMwMDEwLAotMHgzYzA0MDAwMSwgMHgyNDg0NWYzOCwgMHgzYzA1MDAwMCwgMHgyNGE1NjgxMCwKLTB4M2MwNjAwMDAsIDB4MjRjNjY5NDAsIDB4OGZhZTAwNDQsIDB4YzUzMDIzLAotMHgyMjAzODIxLCAweDNjMDEwMDAxLCAweGFjMjI2ZWM4LCAweDRlMTAyNCwKLTB4MjEwODIsIDB4NTUxMDI1LCAweGFmYzIwMGMwLCAweGMwMDE3YTMsCi0weGFmYjMwMDEwLCAweDNjMDQwMDAxLCAweDI0ODQ1ZjUwLCAweDNjMDUwMDAxLAotMHgyNGE1ZmFkMCwgMHgzYzA2MDAwMSwgMHgyNGM2ZmJhOCwgMHg4ZmFlMDA0NCwKLTB4YzUzMDIzLCAweDIyMDM4MjEsIDB4M2MwMTAwMDEsIDB4YWMyMjZlZDQsCi0weDRlMTAyNCwgMHgyMTA4MiwgMHg1NTEwMjUsIDB4YWZjMjAwYzgsCi0weGMwMDE3YTMsIDB4YWZiMzAwMTAsIDB4M2MwNDAwMDEsIDB4MjQ4NDVmNWMsCi0weDNjMDUwMDAxLCAweDI0YTVjOTNjLCAweDNjMDYwMDAxLCAweDI0YzZjYTIwLAotMHhjNTMwMjMsIDB4MjIwMzgyMSwgMHhhZjQyMDExMCwgMHhjMDAxN2EzLAotMHhhZmIzMDAxMCwgMHgzYzA0MDAwMSwgMHgyNDg0NWY2YywgMHgzYzA1MDAwMSwKLTB4MjRhNWM5MTAsIDB4M2MwNjAwMDEsIDB4MjRjNmM5MzQsIDB4YzUzMDIzLAotMHgyMjAzODIxLCAweGFmNDIwMTI0LCAweGMwMDE3YTMsIDB4YWZiMzAwMTAsCi0weDNjMDQwMDAxLCAweDI0ODQ1ZjdjLCAweDNjMDUwMDAxLCAweDI0YTU1YTgwLAotMHgzYzA2MDAwMSwgMHgyNGM2NWFhYywgMHhjNTMwMjMsIDB4MjIwMzgyMSwKLTB4YWY0MjAxMjAsIDB4YWY0MjAxMTQsIDB4YzAwMTdhMywgMHhhZmIzMDAxMCwKLTB4M2MwNDAwMDEsIDB4MjQ4NDVmODgsIDB4M2MwNTAwMDEsIDB4MjRhNWYyOTgsCi0weDNjMDYwMDAxLCAweDI0YzZmNmI0LCAweGM1MzAyMywgMHgyMjAzODIxLAotMHhhZjQyMDExOCwgMHhjMDAxN2EzLCAweGFmYjMwMDEwLCAweDhmYWUwMDQ0LAotMHgzYzAxMDAwMSwgMHhhYzIyNmYxOCwgMHg0ZTEwMjQsIDB4MjEwODIsCi0weDU1MTAyNSwgMHhjMDAzZmMzLCAweGFmYzIwMGQwLCAweGMwMDNjNDAsCi0weDAsIDB4YzAwMjdhOCwgMHgwLCAweGFjMDAwMjI4LAotMHhhYzAwMDIyYywgMHg5NmUyMDQ1MCwgMHgyNDQyZmZmZiwgMHhhZjQyMDAzOCwKLTB4OTZlMjA0NjAsIDB4YWY0MjAwODAsIDB4MzJjMjQwMDAsIDB4MTQ0MDAwMDMsCi0weDAsIDB4OTZlMjA0ODAsIDB4YWY0MjAwODQsIDB4OTZlNzA0OTAsCi0weDUwZTAwMDAxLCAweDI0MDcwODAwLCAweDI0ZTJmZmZmLCAweGFmNDIwMDg4LAotMHhhZjQyMDA3YywgMHgyNDAyMDgwMCwgMHgxMGUyMDAwZiwgMHgzMmMyNDAwMCwKLTB4MTA0MDAwMDMsIDB4MjQwMjA0MDAsIDB4MTBlMjAwMGIsIDB4MCwKLTB4MjQwZTAwMDEsIDB4M2MwNDAwMDEsIDB4MjQ4NDVmOTgsIDB4YTNhZTAwM2YsCi0weDk2ZTYwNDkwLCAweDI0MDUyMTcwLCAweDJjMDM4MjEsIDB4YWZhMDAwMTAsCi0weGMwMDJiM2IsIDB4YWZhMDAwMTQsIDB4OGY0MzAxMzgsIDB4OGY0NDAxMzgsCi0weDI0MDIwMDAxLCAweGEzNDIwNWMyLCAweGFmNDMwMDk0LCAweGFmNDQwMDk4LAotMHhhZmEwMDAxMCwgMHhhZmEwMDAxNCwgMHg4ZjQ2MDA4MCwgMHg4ZjQ3MDA4NCwKLTB4M2MwNDAwMDEsIDB4MjQ4NDVmYTQsIDB4YzAwMmIzYiwgMHgyNDA1MjIwMCwKLTB4YzAwMjRhNCwgMHgzYzExMDgwMCwgMHgzYzE0MzNkOCwgMHgzNjk0Y2I1OCwKLTB4M2MwMjA4MDAsIDB4MzQ0MjAwODAsIDB4M2MwNDAwMDEsIDB4MjQ4NDVmYjAsCi0weDNjMDUwMDAwLCAweDI0YTU1ZDAwLCAweDNjMDYwMDAwLCAweDI0YzY1ZDFjLAotMHhjNTMwMjMsIDB4MjdhNzAwMzAsIDB4YWY4MjAwNjAsIDB4MjQwMmZmZmYsCi0weGFmODIwMDY0LCAweDI3YTIwMDM0LCAweGMwMDE3YTMsIDB4YWZhMjAwMTAsCi0weDNjMDEwMDAxLCAweGFjMjI2ZWI4LCAweDIxMTAwLCAweDIxMTgyLAotMHg1MTEwMjUsIDB4YzAwMThmYywgMHhhZTQyMDAwMCwgMHg4ZjgyMDI0MCwKLTB4M2MwMzAwMDEsIDB4NDMxMDI1LCAweGFmODIwMjQwLCAweDNjMDIwMDAwLAotMHgyNDQyNDAzNCwgMHhhZjgyMDI0NCwgMHhhZjgwMDI0MCwgMHg4ZjgyMDA2MCwKLTB4NTExMDI0LCAweDE0NDAwMDA1LCAweDNjMDMwODAwLCAweDhmODIwMDYwLAotMHg0MzEwMjQsIDB4MTA0MGZmZmQsIDB4MCwgMHhjMDAzYzRkLAotMHg4ODIxLCAweDNjMDIwMTAwLCAweGFmYTIwMDIwLCAweDhmNTMwMDE4LAotMHgyNDAyMDBmZiwgMHg1NjYyMDAwMSwgMHgyNjcxMDAwMSwgMHg4YzAyMDIyOCwKLTB4MTYyMjAwMGUsIDB4MTMzMGMwLCAweDhmNDIwMzNjLCAweDI0NDIwMDAxLAotMHhhZjQyMDMzYywgMHg4ZjQyMDMzYywgMHg4YzAyMDIyOCwgMHgzYzA0MDAwMSwKLTB4MjQ4NDVjMjQsIDB4M2MwNTAwMDksIDB4YWZhMDAwMTQsIDB4YWZhMjAwMTAsCi0weDhmYTYwMDIwLCAweDEwMDAwMDNmLCAweDM0YTUwMTAwLCAweGQ3MTAyMSwKLTB4OGZhMzAwMjAsIDB4OGZhNDAwMjQsIDB4YWM0MzA0YzAsIDB4YWM0NDA0YzQsCi0weGMwMTgyMSwgMHg4ZjQ0MDE3OCwgMHg4ZjQ1MDE3YywgMHgxMDIxLAotMHgyNDA3MDAwNCwgMHhhZmE3MDAxMCwgMHhhZmIxMDAxNCwgMHg4ZjQ4MDAwYywKLTB4MjRjNjA0YzAsIDB4MmU2MzAyMSwgMHhhZmE4MDAxOCwgMHg4ZjQ4MDEwYywKLTB4MjQwNzAwMDgsIDB4YTMyODIxLCAweGEzNDgyYiwgMHg4MjIwMjEsCi0weDEwMGY4MDksIDB4ODkyMDIxLCAweDE0NDAwMDBiLCAweDI0MDcwMDA4LAotMHg4ZjgyMDEyMCwgMHhhZmEyMDAxMCwgMHg4ZjgyMDEyNCwgMHgzYzA0MDAwMSwKLTB4MjQ4NDVjMmMsIDB4M2MwNTAwMDksIDB4YWZhMjAwMTQsIDB4OGZhNjAwMjAsCi0weDEwMDAwMDFjLCAweDM0YTUwMjAwLCAweDhmNDQwMTYwLCAweDhmNDUwMTY0LAotMHg4ZjQzMDAwYywgMHhhZjUxMDAxOCwgMHg4Zjg2MDEyMCwgMHgyNDAyMDAxMCwKLTB4YWZhMjAwMTAsIDB4YWZiMTAwMTQsIDB4YWZhMzAwMTgsIDB4OGY0MjAxMGMsCi0weDQwZjgwOSwgMHgyNGM2MDAxYywgMHgxNDQwMDAxMCwgMHgwLAotMHg4ZjQyMDM0MCwgMHgyNDQyMDAwMSwgMHhhZjQyMDM0MCwgMHg4ZjQyMDM0MCwKLTB4OGY4MjAxMjAsIDB4YWZhMjAwMTAsIDB4OGY4MjAxMjQsIDB4M2MwNDAwMDEsCi0weDI0ODQ1YzM0LCAweDNjMDUwMDA5LCAweGFmYTIwMDE0LCAweDhmYTYwMDIwLAotMHgzNGE1MDMwMCwgMHhjMDAyYjNiLCAweDI2MDM4MjEsIDB4OGY0MjAyZTQsCi0weDI0NDIwMDAxLCAweGFmNDIwMmU0LCAweDhmNDIwMmU0LCAweDkzYTIwMDNmLAotMHgxMDQwMDA2OSwgMHgzYzAyMDcwMCwgMHgzNDQyMzAwMCwgMHhhZmEyMDAyOCwKLTB4OGY1MzAwMTgsIDB4MjQwMjAwZmYsIDB4MTI2MjAwMDIsIDB4ODgyMSwKLTB4MjY3MTAwMDEsIDB4OGMwMjAyMjgsIDB4MTYyMjAwMGUsIDB4MTMzMGMwLAotMHg4ZjQyMDMzYywgMHgyNDQyMDAwMSwgMHhhZjQyMDMzYywgMHg4ZjQyMDMzYywKLTB4OGMwMjAyMjgsIDB4M2MwNDAwMDEsIDB4MjQ4NDVjMjQsIDB4M2MwNTAwMDksCi0weGFmYTAwMDE0LCAweGFmYTIwMDEwLCAweDhmYTYwMDI4LCAweDEwMDAwMDNmLAotMHgzNGE1MDEwMCwgMHhkNzEwMjEsIDB4OGZhMzAwMjgsIDB4OGZhNDAwMmMsCi0weGFjNDMwNGMwLCAweGFjNDQwNGM0LCAweGMwMTgyMSwgMHg4ZjQ0MDE3OCwKLTB4OGY0NTAxN2MsIDB4MTAyMSwgMHgyNDA3MDAwNCwgMHhhZmE3MDAxMCwKLTB4YWZiMTAwMTQsIDB4OGY0ODAwMGMsIDB4MjRjNjA0YzAsIDB4MmU2MzAyMSwKLTB4YWZhODAwMTgsIDB4OGY0ODAxMGMsIDB4MjQwNzAwMDgsIDB4YTMyODIxLAotMHhhMzQ4MmIsIDB4ODIyMDIxLCAweDEwMGY4MDksIDB4ODkyMDIxLAotMHgxNDQwMDAwYiwgMHgyNDA3MDAwOCwgMHg4ZjgyMDEyMCwgMHhhZmEyMDAxMCwKLTB4OGY4MjAxMjQsIDB4M2MwNDAwMDEsIDB4MjQ4NDVjMmMsIDB4M2MwNTAwMDksCi0weGFmYTIwMDE0LCAweDhmYTYwMDI4LCAweDEwMDAwMDFjLCAweDM0YTUwMjAwLAotMHg4ZjQ0MDE2MCwgMHg4ZjQ1MDE2NCwgMHg4ZjQzMDAwYywgMHhhZjUxMDAxOCwKLTB4OGY4NjAxMjAsIDB4MjQwMjAwMTAsIDB4YWZhMjAwMTAsIDB4YWZiMTAwMTQsCi0weGFmYTMwMDE4LCAweDhmNDIwMTBjLCAweDQwZjgwOSwgMHgyNGM2MDAxYywKLTB4MTQ0MDAwMTAsIDB4MCwgMHg4ZjQyMDM0MCwgMHgyNDQyMDAwMSwKLTB4YWY0MjAzNDAsIDB4OGY0MjAzNDAsIDB4OGY4MjAxMjAsIDB4YWZhMjAwMTAsCi0weDhmODIwMTI0LCAweDNjMDQwMDAxLCAweDI0ODQ1YzM0LCAweDNjMDUwMDA5LAotMHhhZmEyMDAxNCwgMHg4ZmE2MDAyOCwgMHgzNGE1MDMwMCwgMHhjMDAyYjNiLAotMHgyNjAzODIxLCAweDhmNDIwMmYwLCAweDI0NDIwMDAxLCAweGFmNDIwMmYwLAotMHg4ZjQyMDJmMCwgMHgzYzA0MDAwMSwgMHgyNDg0NWZjMCwgMHhhZmEwMDAxMCwKLTB4YWZhMDAwMTQsIDB4OGZhNjAwMjgsIDB4MjQwNTIzMDAsIDB4YzAwMmIzYiwKLTB4MzgyMSwgMHgxMDAwMDAwNCwgMHgwLCAweDhjMDIwMjY0LAotMHgxMDQwMDAwNSwgMHgwLCAweDhmODIwMGEwLCAweDMwNDIwMDA0LAotMHgxNDQwZmZmYSwgMHgwLCAweDhmODIwMDQ0LCAweDM0NDIwMDA0LAotMHhhZjgyMDA0NCwgMHg4ZjQyMDMwOCwgMHgyNDQyMDAwMSwgMHhhZjQyMDMwOCwKLTB4OGY0MjAzMDgsIDB4OGY4MjAwZDgsIDB4OGY4MzAwZDQsIDB4NDMxMDIzLAotMHgyNDQyZmY4MCwgMHhhZjQyMDA5MCwgMHg4ZjQyMDA5MCwgMHgyODQyZmY4MSwKLTB4MTA0MDAwMDYsIDB4MjQwMjAwMDEsIDB4OGY0MjAwOTAsIDB4OGY0MzAxNDQsCi0weDQzMTAyMSwgMHhhZjQyMDA5MCwgMHgyNDAyMDAwMSwgMHhhZjQyMDA4YywKLTB4MzJjMjAwMDgsIDB4MTA0MDAwMDYsIDB4MCwgMHg4ZjgyMDIxNCwKLTB4M2MwMzgxMDAsIDB4MzA0MmZmZmYsIDB4NDMxMDI1LCAweGFmODIwMjE0LAotMHgzYzAzMDAwMSwgMHg4YzYzNmQ5NCwgMHgzMDYyMDAwMiwgMHgxMDQwMDAwOSwKLTB4MzA2MjAwMDEsIDB4M2MwNDAwMDEsIDB4MjQ4NDVmY2MsIDB4M2MwNTAwMDAsCi0weDI0YTU2ZDUwLCAweDNjMDYwMDAwLCAweDI0YzY3MWM4LCAweDEwMDAwMDEyLAotMHhjNTMwMjMsIDB4MTA0MDAwMDksIDB4MCwgMHgzYzA0MDAwMSwKLTB4MjQ4NDVmZGMsIDB4M2MwNTAwMDAsIDB4MjRhNTcxZDAsIDB4M2MwNjAwMDAsCi0weDI0YzY3Njc4LCAweDEwMDAwMDA4LCAweGM1MzAyMywgMHgzYzA0MDAwMSwKLTB4MjQ4NDVmZWMsIDB4M2MwNTAwMDAsIDB4MjRhNTY5NDgsIDB4M2MwNjAwMDAsCi0weDI0YzY2ZDQ4LCAweGM1MzAyMywgMHgyN2E3MDAzMCwgMHgyN2EyMDAzNCwKLTB4YzAwMTdhMywgMHhhZmEyMDAxMCwgMHgzYzAxMDAwMSwgMHhhYzIyNmVjYywKLTB4M2MwMjAwMDEsIDB4OGM0MjZlY2MsIDB4M2MwMzA4MDAsIDB4MjExMDAsCi0weDIxMTgyLCAweDQzMTAyNSwgMHhhZTQyMDA0MCwgMHg4ZjgyMDBhMCwKLTB4YWZhMjAwMTAsIDB4OGY4MjAwYjAsIDB4YWZhMjAwMTQsIDB4OGY4NjAwNWMsCi0weDhmODcwMTFjLCAweDNjMDQwMDAxLCAweDI0ODQ1ZmZjLCAweDNjMDEwMDAxLAotMHhhYzM2NmVhNCwgMHgzYzAxMDAwMSwgMHhhYzIwNmU5NCwgMHgzYzAxMDAwMSwKLTB4YWMzYzZlOGMsIDB4M2MwMTAwMDEsIDB4YWMzYjZlYmMsIDB4M2MwMTAwMDEsCi0weGFjMzc2ZWMwLCAweDNjMDEwMDAxLCAweGFjM2E2ZWEwLCAweGMwMDJiM2IsCi0weDI0MDUyNDAwLCAweDhmODIwMjAwLCAweGFmYTIwMDEwLCAweDhmODIwMjIwLAotMHhhZmEyMDAxNCwgMHg4Zjg2MDA0NCwgMHg4Zjg3MDA1MCwgMHgzYzA0MDAwMSwKLTB4MjQ4NDYwMDgsIDB4YzAwMmIzYiwgMHgyNDA1MjUwMCwgMHg4ZjgzMDA2MCwKLTB4NzQxMDBiLCAweDI0MjAwMGEsIDB4MjAwZjgyMSwgMHgwLAotMHhkLCAweDhmYmYwMDYwLCAweDhmYmUwMDVjLCAweDhmYjUwMDU4LAotMHg4ZmIzMDA1NCwgMHg4ZmIyMDA1MCwgMHg4ZmIxMDA0YywgMHg4ZmIwMDA0OCwKLTB4M2UwMDAwOCwgMHgyN2JkMDA2OCwgMHgyN2JkZmZlMCwgMHgzYzA0MDAwMSwKLTB4MjQ4NDYwMTQsIDB4MjQwNTI2MDAsIDB4MzAyMSwgMHgzODIxLAotMHhhZmJmMDAxOCwgMHhhZmEwMDAxMCwgMHhjMDAyYjNiLCAweGFmYTAwMDE0LAotMHg4ZmJmMDAxOCwgMHgzZTAwMDA4LCAweDI3YmQwMDIwLCAweDNlMDAwMDgsCi0weDAsIDB4M2UwMDAwOCwgMHgwLCAweDAsCi0weDAsIDB4MCwgMHgwLCAweDAsCi0weDNlMDAwMDgsIDB4MCwgMHgzZTAwMDA4LCAweDAsCi0weDI3YmRmZGUwLCAweDI3YTUwMDE4LCAweDNjMDRkZWFkLCAweDM0ODRiZWVmLAotMHhhZmJmMDIxOCwgMHg4ZjgyMDE1MCwgMHgzYzAzMDAxZiwgMHgzNDYzZmZmZiwKLTB4YWZhNDAwMTgsIDB4YTIyODIzLCAweGEzMjgyNCwgMHg4Y2EyMDAwMCwKLTB4MTA0NDAwMGEsIDB4MCwgMHhhZmE1MDAxMCwgMHg4Y2EyMDAwMCwKLTB4YWZhMjAwMTQsIDB4OGY4NjAxNTAsIDB4OGY4NzAyNTAsIDB4M2MwNDAwMDEsCi0weDI0ODQ2MDFjLCAweGMwMDJiM2IsIDB4MjQwNTI3MDAsIDB4OGZiZjAyMTgsCi0weDNlMDAwMDgsIDB4MjdiZDAyMjAsIDB4MjdiZGZmZTAsIDB4M2MwNmFiYmEsCi0weDM0YzZiYWJlLCAweGFmYjAwMDE4LCAweDNjMTAwMDA0LCAweDNjMDcwMDdmLAotMHgzNGU3ZmZmZiwgMHhhZmJmMDAxYywgMHgxMDI4NDAsIDB4OGUwNDAwMDAsCi0weDhjYTMwMDAwLCAweGFjYTAwMDAwLCAweGFlMDYwMDAwLCAweDhjYTIwMDAwLAotMHhhY2EzMDAwMCwgMHgxMDQ2MDAwNSwgMHhhZTA0MDAwMCwgMHhhMDgwMjEsCi0weGYwMTAyYiwgMHgxMDQwZmZmNSwgMHgxMDI4NDAsIDB4M2MwNDAwMDEsCi0weDI0ODQ2MDI4LCAweDI0MDUyODAwLCAweDIwMDMwMjEsIDB4MzgyMSwKLTB4YWZhMDAwMTAsIDB4YzAwMmIzYiwgMHhhZmEwMDAxNCwgMHgyMDAxMDIxLAotMHg4ZmJmMDAxYywgMHg4ZmIwMDAxOCwgMHgzZTAwMDA4LCAweDI3YmQwMDIwLAotMHg4YzAyMDIyNCwgMHgzMDQ3MDAzZiwgMHgxMGUwMDAxMCwgMHg4MDMwMjEsCi0weDI4MjEsIDB4MjQwMzAwMjAsIDB4ZTMxMDI0LCAweDEwNDAwMDAyLAotMHg2MzA0MiwgMHhhNjI4MjEsIDB4MzE4NDIsIDB4MTQ2MGZmZmIsCi0weGUzMTAyNCwgMHgyNDAyZjAwMCwgMHhhMjI4MjQsIDB4MzQwMmZmZmYsCi0weDQ1MTAyYiwgMHgxNDQwMDAwMywgMHgzYzAyMDAwMSwgMHgxMDAwMDAwOCwKLTB4M2MwMjAwMDEsIDB4MzQ0MmZmZmYsIDB4ODUxODIzLCAweDQzMTAyYiwKLTB4MTQ0MDAwMDMsIDB4YTAxMDIxLCAweDNjMDJmZmZlLCAweDgyMTAyMSwKLTB4M2UwMDAwOCwgMHgwLCAweDI3YmRmZmQwLCAweGFmYjUwMDI4LAotMHg4ZmI1MDA0MCwgMHhhZmIyMDAyMCwgMHhhMDkwMjEsIDB4YWZiMTAwMWMsCi0weDI0YzYwMDAzLCAweGFmYmYwMDJjLCAweGFmYjMwMDI0LCAweGFmYjAwMDE4LAotMHg4ZWEyMDAwMCwgMHgyNDAzZmZmYywgMHhjMzgwMjQsIDB4NTAxMDJiLAotMHgxNDQwMDAxYiwgMHhlMDg4MjEsIDB4OGUzMzAwMDAsIDB4YWZiMDAwMTAsCi0weDhlYTIwMDAwLCAweGFmYTIwMDE0LCAweDhlMjcwMDAwLCAweDI0MDUzMDAwLAotMHhjMDAyYjNiLCAweDI0MDMwMjEsIDB4OGUyMzAwMDAsIDB4NzAyMDIxLAotMHg2NDEwMmIsIDB4MTA0MDAwMDcsIDB4MjQwMjgyMSwgMHg4Y2EyMDAwMCwKLTB4YWM2MjAwMDAsIDB4MjQ2MzAwMDQsIDB4NjQxMDJiLCAweDE0NDBmZmZiLAotMHgyNGE1MDAwNCwgMHg4ZWEyMDAwMCwgMHg1MDEwMjMsIDB4YWVhMjAwMDAsCi0weDhlMjIwMDAwLCAweDUwMTAyMSwgMHgxMDAwMDAwYiwgMHhhZTIyMDAwMCwKLTB4MjQwMjAwMmQsIDB4YTA4MjAwMDAsIDB4YWZiMDAwMTAsIDB4OGVhMjAwMDAsCi0weDI0MDk4MjEsIDB4YWZhMjAwMTQsIDB4OGUyNzAwMDAsIDB4MjQwNTMxMDAsCi0weGMwMDJiM2IsIDB4MjYwMzAyMSwgMHgyNjAxMDIxLCAweDhmYmYwMDJjLAotMHg4ZmI1MDAyOCwgMHg4ZmIzMDAyNCwgMHg4ZmIyMDAyMCwgMHg4ZmIxMDAxYywKLTB4OGZiMDAwMTgsIDB4M2UwMDAwOCwgMHgyN2JkMDAzMCwgMHgyN2JkZmZlOCwKLTB4M2MxY2MwMDAsIDB4M2MwNWZmZmUsIDB4M2MwMzAwMDEsIDB4OGM2MzZlODQsCi0weDNjMDQwMDAxLCAweDhjODQ2ZTkwLCAweDM0YTViZjA4LCAweDI0MDIxZmZjLAotMHgzYzAxMDAwMSwgMHhhYzIyNmNkMCwgMHgzYzAyMDBjMCwgMHgzYzAxMDAwMSwKLTB4YWMyMjZjZDQsIDB4M2MwMjAwMjAsIDB4YWZiZjAwMTAsIDB4M2MwMTAwYzAsCi0weGFjMjAxZmZjLCAweDQzMTAyMywgMHg0NDEwMjMsIDB4MjQ1YmIwMDAsCi0weDM2NWI4MjEsIDB4M2MxZDAwMDEsIDB4OGZiZDZjY2MsIDB4M2EwZjAyMSwKLTB4M2MwNDAwYzAsIDB4MzQ4NDAyMDAsIDB4M2MxYTAwYzAsIDB4M2MwMzAwYzAsCi0weDM0NjMwN2M4LCAweDI0MDIxZGZjLCAweDNjMDEwMDAxLCAweGFjMjI2Y2QwLAotMHgyNDAyMTgzNCwgMHgzYzAxMDAwMSwgMHhhYzI0NmNkNCwgMHgzYzAxMDAwMSwKLTB4YWMyMjZjZDAsIDB4M2MwMTAwMDEsIDB4YWMyMzZjZDQsIDB4YzAwMTgwZCwKLTB4Mzc1YTAyMDAsIDB4OGZiZjAwMTAsIDB4M2UwMDAwOCwgMHgyN2JkMDAxOCwKLTB4MjdiZGZmYzgsIDB4M2MwNDAwMDEsIDB4MjQ4NDYwMzQsIDB4MjQwNTMyMDAsCi0weDNjMDIwMDAxLCAweDhjNDI2Y2QwLCAweDNjMDMwMDAxLCAweDhjNjM2Y2Q0LAotMHgzMDIxLCAweDM2MDM4MjEsIDB4YWZiZjAwMzAsIDB4YWZiMzAwMmMsCi0weGFmYjIwMDI4LCAweGFmYjEwMDI0LCAweGFmYjAwMDIwLCAweGFmYTIwMDFjLAotMHhhZmEzMDAxOCwgMHhhZmI3MDAxMCwgMHhjMDAyYjNiLCAweGFmYmEwMDE0LAotMHhjMDAxOTE2LCAweDAsIDB4OGY4MjAyNDAsIDB4MzQ0MjAwMDQsCi0weGFmODIwMjQwLCAweDI0MDIwMDAxLCAweGFmNDIwMDAwLCAweDNjMDIwMDAxLAotMHg1NzEwMjEsIDB4OTA0MjQwZjQsIDB4MTA0MDAwOTIsIDB4MjQwM2ZmZmMsCi0weDNjMTAwMDAxLCAweDI2MTBhYzczLCAweDNjMTIwMDAxLCAweDI2NTJhODRjLAotMHgyMTIxMDIzLCAweDQzODAyNCwgMHg4ZmEzMDAxYywgMHgzYzA0MDAwMSwKLTB4MjQ4NDYwNDAsIDB4NzAxMDJiLCAweDE0NDAwMDFhLCAweDI3YjMwMDE4LAotMHg4ZmIxMDAxOCwgMHgyNDA1MzAwMCwgMHgyNDAzMDIxLCAweGFmYjAwMDEwLAotMHhhZmEzMDAxNCwgMHhjMDAyYjNiLCAweDIyMDM4MjEsIDB4OGZhMzAwMTgsCi0weDcwMjAyMSwgMHg2NDEwMmIsIDB4MTA0MDAwMDcsIDB4MjQwMzAyMSwKLTB4OGNjMjAwMDAsIDB4YWM2MjAwMDAsIDB4MjQ2MzAwMDQsIDB4NjQxMDJiLAotMHgxNDQwZmZmYiwgMHgyNGM2MDAwNCwgMHg4ZmEyMDAxYywgMHg1MDEwMjMsCi0weGFmYTIwMDFjLCAweDhlNjIwMDAwLCAweDUwMTAyMSwgMHgxMDAwMDAwYSwKLTB4YWU2MjAwMDAsIDB4MjQwODgyMSwgMHgyNDA1MzEwMCwgMHhhZmIwMDAxMCwKLTB4YWZhMzAwMTQsIDB4OGZhNzAwMTgsIDB4MjIwMzAyMSwgMHgyNDAyMDAyZCwKLTB4YzAwMmIzYiwgMHhhMDgyMDAwMCwgMHgyNDA3MDAyMCwgMHg4ZmEzMDAxYywKLTB4M2MwNDAwMDEsIDB4MjQ4NDYwNWMsIDB4MjQxMjAwMjAsIDB4M2MwMTAwMDEsCi0weGFjMzE2ZWIwLCAweDJjNjIwMDIwLCAweDE0NDAwMDFkLCAweDI3YjEwMDE4LAotMHg4ZmIwMDAxOCwgMHgyNDA1MzAwMCwgMHgzYzA2MDAwMSwgMHgyNGM2NmY1MCwKLTB4YWZhNzAwMTAsIDB4YWZhMzAwMTQsIDB4YzAwMmIzYiwgMHgyMDAzODIxLAotMHg4ZmEzMDAxOCwgMHgzYzA0MDAwMSwgMHgyNDg0NmY1MCwgMHgyNDY1MDAyMCwKLTB4NjUxMDJiLCAweDEwNDAwMDA3LCAweDAsIDB4OGM4MjAwMDAsCi0weGFjNjIwMDAwLCAweDI0NjMwMDA0LCAweDY1MTAyYiwgMHgxNDQwZmZmYiwKLTB4MjQ4NDAwMDQsIDB4OGZhMjAwMWMsIDB4NTIxMDIzLCAweGFmYTIwMDFjLAotMHg4ZTIyMDAwMCwgMHg1MjEwMjEsIDB4MTAwMDAwMGIsIDB4YWUyMjAwMDAsCi0weDNjMTAwMDAxLCAweDI2MTA2ZjUwLCAweDI0MDUzMTAwLCAweGFmYTcwMDEwLAotMHhhZmEzMDAxNCwgMHg4ZmE3MDAxOCwgMHgyMDAzMDIxLCAweDI0MDIwMDJkLAotMHhjMDAyYjNiLCAweGEwODIwMDAwLCAweDI0MDcwMDIwLCAweDNjMDQwMDAxLAotMHgyNDg0NjA3MCwgMHg4ZmEzMDAxYywgMHgyNDEyMDAyMCwgMHgzYzAxMDAwMSwKLTB4YWMzMDZlZTQsIDB4MmM2MjAwMjAsIDB4MTQ0MDAwMWQsIDB4MjdiMTAwMTgsCi0weDhmYjAwMDE4LCAweDI0MDUzMDAwLCAweDNjMDYwMDAxLCAweDI0YzY2ZjcwLAotMHhhZmE3MDAxMCwgMHhhZmEzMDAxNCwgMHhjMDAyYjNiLCAweDIwMDM4MjEsCi0weDhmYTMwMDE4LCAweDNjMDQwMDAxLCAweDI0ODQ2ZjcwLCAweDI0NjUwMDIwLAotMHg2NTEwMmIsIDB4MTA0MDAwMDcsIDB4MCwgMHg4YzgyMDAwMCwKLTB4YWM2MjAwMDAsIDB4MjQ2MzAwMDQsIDB4NjUxMDJiLCAweDE0NDBmZmZiLAotMHgyNDg0MDAwNCwgMHg4ZmEyMDAxYywgMHg1MjEwMjMsIDB4YWZhMjAwMWMsCi0weDhlMjIwMDAwLCAweDUyMTAyMSwgMHgxMDAwMDAwYiwgMHhhZTIyMDAwMCwKLTB4M2MxMDAwMDEsIDB4MjYxMDZmNzAsIDB4MjQwNTMxMDAsIDB4YWZhNzAwMTAsCi0weGFmYTMwMDE0LCAweDhmYTcwMDE4LCAweDIwMDMwMjEsIDB4MjQwMjAwMmQsCi0weGMwMDJiM2IsIDB4YTA4MjAwMDAsIDB4M2MwMTAwMDEsIDB4MTAwMDAwMzEsCi0weGFjMzA2ZWUwLCAweDNjMTAwMDAxLCAweDI2MTA4MjFmLCAweDNjMTIwMDAxLAotMHgyNjUyODA5YywgMHgyMTIxMDIzLCAweDQzODAyNCwgMHg4ZmEzMDAxYywKLTB4M2MwNDAwMDEsIDB4MjQ4NDYwODQsIDB4NzAxMDJiLCAweDE0NDAwMDFhLAotMHgyN2IzMDAxOCwgMHg4ZmIxMDAxOCwgMHgyNDA1MzAwMCwgMHgyNDAzMDIxLAotMHhhZmIwMDAxMCwgMHhhZmEzMDAxNCwgMHhjMDAyYjNiLCAweDIyMDM4MjEsCi0weDhmYTMwMDE4LCAweDcwMjAyMSwgMHg2NDEwMmIsIDB4MTA0MDAwMDcsCi0weDI0MDMwMjEsIDB4OGNjMjAwMDAsIDB4YWM2MjAwMDAsIDB4MjQ2MzAwMDQsCi0weDY0MTAyYiwgMHgxNDQwZmZmYiwgMHgyNGM2MDAwNCwgMHg4ZmEyMDAxYywKLTB4NTAxMDIzLCAweGFmYTIwMDFjLCAweDhlNjIwMDAwLCAweDUwMTAyMSwKLTB4MTAwMDAwMGEsIDB4YWU2MjAwMDAsIDB4MjQwODgyMSwgMHgyNDA1MzEwMCwKLTB4YWZiMDAwMTAsIDB4YWZhMzAwMTQsIDB4OGZhNzAwMTgsIDB4MjIwMzAyMSwKLTB4MjQwMjAwMmQsIDB4YzAwMmIzYiwgMHhhMDgyMDAwMCwgMHgzYzAxMDAwMSwKLTB4YWMzMTZlYjAsIDB4M2MwMzAwMDEsIDB4OGM2MzZlYjAsIDB4MjQwMjA0MDAsCi0weDYwZjgwOSwgMHhhZjgyMDA3MCwgMHg4ZmJmMDAzMCwgMHg4ZmIzMDAyYywKLTB4OGZiMjAwMjgsIDB4OGZiMTAwMjQsIDB4OGZiMDAwMjAsIDB4M2UwMDAwOCwKLTB4MjdiZDAwMzgsIDB4MCwgMHgwLCAweDhmODIwMDQwLAotMHgzYzAzZjAwMCwgMHg0MzEwMjQsIDB4M2MwMzYwMDAsIDB4MTQ0MzAwMDYsCi0weDAsIDB4OGY4MjAwNTAsIDB4MjQwM2ZmODAsIDB4NDMxMDI0LAotMHgzNDQyMDA1NSwgMHhhZjgyMDA1MCwgMHg4ZjgyMDA1NCwgMHgyNDQyMDNlOCwKLTB4YWY4MjAwNTgsIDB4MjQwMjAxZjQsIDB4YWY0MjAwZTAsIDB4MjQwMjAwMDQsCi0weGFmNDIwMGU4LCAweDI0MDIwMDAyLCAweGFmNDAwMWIwLCAweGFmNDAwMGU0LAotMHhhZjQyMDBkYywgMHhhZjQwMDBkOCwgMHhhZjQwMDBkNCwgMHgzZTAwMDA4LAotMHhhZjQwMDBkMCwgMHg4ZjgyMDA1NCwgMHgyNDQyMDAwNSwgMHgzZTAwMDA4LAotMHhhZjgyMDA3OCwgMHgyN2JkZmZlOCwgMHhhZmJmMDAxMCwgMHg4ZjgyMDA1NCwKLTB4MjQ0MjAzZTgsIDB4YWY4MjAwNTgsIDB4M2MwMjA4MDAsIDB4MmMyMTAyNCwKLTB4MTA0MDAwMDQsIDB4M2MwMmY3ZmYsIDB4MzQ0MmZmZmYsIDB4MmMyYjAyNCwKLTB4MzY5NDAwNDAsIDB4M2MwMjAwMDEsIDB4OGM0MjZkYTgsIDB4MTA0MDAwMTcsCi0weDNjMDIwMjAwLCAweDNjMDMwMDAxLCAweDhjNjM2ZjFjLCAweDEwNjAwMDE2LAotMHgyODJhMDI1LCAweDNjMDIwMDAxLCAweDhjNDI2ZTQ0LCAweDE0NDAwMDEyLAotMHgzYzAyMDIwMCwgMHgzYzAyMDAwMSwgMHg4YzQyNmQ5NCwgMHgzMDQyMDAwMywKLTB4MTQ0MDAwMGQsIDB4M2MwMjAyMDAsIDB4OGY4MzAyMjQsIDB4M2MwMjAwMDIsCi0weDhjNDI4ZmVjLCAweDEwNjIwMDA4LCAweDNjMDIwMjAwLCAweGMwMDNkYWYsCi0weDAsIDB4MTAwMDAwMDQsIDB4M2MwMjAyMDAsIDB4YzAwNDE5NiwKLTB4MCwgMHgzYzAyMDIwMCwgMHgyYzIxMDI0LCAweDEwNDAwMDAzLAotMHgwLCAweGMwMDFmNGIsIDB4MCwgMHg4ZjQyMDBkOCwKLTB4OGY0MzAwZGMsIDB4MjQ0MjAwMDEsIDB4YWY0MjAwZDgsIDB4NDMxMDJiLAotMHgxNDQwMDAwMywgMHgwLCAweGFmNDAwMGQ4LCAweDM2OTQwMDgwLAotMHg4YzAzMDIzOCwgMHgxMDYwMDAwYywgMHgwLCAweDhmNDIwMWIwLAotMHgyNDQyMDNlOCwgMHhhZjQyMDFiMCwgMHg0MzEwMmIsIDB4MTQ0MDAwMDYsCi0weDAsIDB4OTM0MjA1YzUsIDB4MTQ0MDAwMDMsIDB4MCwKLTB4YzAwMWRhMCwgMHgwLCAweDhmYmYwMDEwLCAweDNlMDAwMDgsCi0weDI3YmQwMDE4LCAweDNlMDAwMDgsIDB4MCwgMHgyN2JkZmZkOCwKLTB4YWZiZjAwMjAsIDB4OGY0MzAwMmMsIDB4OGY0MjAwMzgsIDB4MTA2MjAwNTksCi0weDAsIDB4M2MwMjAwMDEsIDB4NTcxMDIxLCAweDkwNDI0MGYwLAotMHgxMDQwMDAyNiwgMHgyNDA3MDAwOCwgMHg4ZjQ0MDE3MCwgMHg4ZjQ1MDE3NCwKLTB4OGY0ODAwMGMsIDB4OGY4NjAxMjAsIDB4MjQwMjAwMjAsIDB4YWZhMjAwMTAsCi0weGFmYTMwMDE0LCAweGFmYTgwMDE4LCAweDhmNDIwMTBjLCAweDQwZjgwOSwKLTB4MjRjNjAwMWMsIDB4MTQ0MDAwMTEsIDB4MjQwMjAwMDEsIDB4M2MwMTAwMDEsCi0weDM3MDgyMSwgMHhhMDIyNDBmMCwgMHg4ZjgyMDEyNCwgMHhhZmEyMDAxMCwKLTB4OGY4MjAxMjgsIDB4M2MwNDAwMDEsIDB4MjQ4NDYxMjgsIDB4YWZhMjAwMTQsCi0weDhmNDYwMDJjLCAweDhmODcwMTIwLCAweDNjMDUwMDA5LCAweGMwMDJiM2IsCi0weDM0YTUwOTAwLCAweDEwMDAwMDVjLCAweDAsIDB4OGY0MjAzMDAsCi0weDI0NDIwMDAxLCAweGFmNDIwMzAwLCAweDhmNDIwMzAwLCAweDhmNDIwMDJjLAotMHhhMzQwMDVjMSwgMHgxMDAwMDAyNywgMHhhZjQyMDAzOCwgMHg4ZjQ0MDE3MCwKLTB4OGY0NTAxNzQsIDB4OGY0MzAwMmMsIDB4OGY0ODAwMGMsIDB4OGY4NjAxMjAsCi0weDI0MDIwMDgwLCAweGFmYTIwMDEwLCAweGFmYTMwMDE0LCAweGFmYTgwMDE4LAotMHg4ZjQyMDEwYywgMHg0MGY4MDksIDB4MjRjNjAwMWMsIDB4MTQ0MDAwMTEsCi0weDI0MDIwMDAxLCAweDNjMDEwMDAxLCAweDM3MDgyMSwgMHhhMDIyNDBmMSwKLTB4OGY4MjAxMjQsIDB4YWZhMjAwMTAsIDB4OGY4MjAxMjgsIDB4M2MwNDAwMDEsCi0weDI0ODQ2MTM0LCAweGFmYTIwMDE0LCAweDhmNDYwMDJjLCAweDhmODcwMTIwLAotMHgzYzA1MDAwOSwgMHhjMDAyYjNiLCAweDM0YTUxMTAwLCAweDEwMDAwMDM2LAotMHgwLCAweDhmNDIwMzAwLCAweDhmNDMwMDJjLCAweDI0NDIwMDAxLAotMHhhZjQyMDMwMCwgMHg4ZjQyMDMwMCwgMHgyNDAyMDAwMSwgMHhhMzQyMDVjMSwKLTB4YWY0MzAwMzgsIDB4M2MwMTAwMDEsIDB4MzcwODIxLCAweGEwMjA0MGYxLAotMHgzYzAxMDAwMSwgMHgzNzA4MjEsIDB4YTAyMDQwZjAsIDB4MTAwMDAwMjYsCi0weGFmNDAwMDM0LCAweDkzNDIwNWMxLCAweDEwNDAwMDFkLCAweDAsCi0weGEzNDAwNWMxLCAweDhmODIwMDQwLCAweDMwNDIwMDAxLCAweDE0NDAwMDA4LAotMHgyMDIxLCAweDhjMDMwMTA0LCAweDI0MDIwMDAxLCAweDUwNjIwMDA1LAotMHgyNDA0MDAwMSwgMHg4YzAyMDI2NCwgMHgxMDQwMDAwMywgMHg4MDEwMjEsCi0weDI0MDQwMDAxLCAweDgwMTAyMSwgMHgxMDQwMDAwNiwgMHgwLAotMHg4ZjQyMDMwYywgMHgyNDQyMDAwMSwgMHhhZjQyMDMwYywgMHgxMDAwMDAwOCwKLTB4OGY0MjAzMGMsIDB4OGY4MjAwNDQsIDB4MzQ0MjAwMDQsIDB4YWY4MjAwNDQsCi0weDhmNDIwMzA4LCAweDI0NDIwMDAxLCAweGFmNDIwMzA4LCAweDhmNDIwMzA4LAotMHgzYzAxMDAwMSwgMHgzNzA4MjEsIDB4YTAyMDQwZjAsIDB4M2MwMTAwMDEsCi0weDM3MDgyMSwgMHhhMDIwNDBmMSwgMHg4ZjQyMDAwMCwgMHgxMDQwMDAwNywKLTB4MCwgMHhhZjgwMDA0YywgMHg4ZjgyMDA0YywgMHgxMDQwZmZmZCwKLTB4MCwgMHgxMDAwMDAwNSwgMHgwLCAweGFmODAwMDQ4LAotMHg4ZjgyMDA0OCwgMHgxMDQwZmZmZCwgMHgwLCAweDhmODIwMDYwLAotMHgzYzAzZmY3ZiwgMHgzNDYzZmZmZiwgMHg0MzEwMjQsIDB4YWY4MjAwNjAsCi0weDhmNDIwMDAwLCAweDEwNDAwMDAzLCAweDAsIDB4MTAwMDAwMDIsCi0weGFmODAwMDRjLCAweGFmODAwMDQ4LCAweDhmYmYwMDIwLCAweDNlMDAwMDgsCi0weDI3YmQwMDI4LCAweDNlMDAwMDgsIDB4MCwgMHgyN2JkZmZkOCwKLTB4YWZiZjAwMjAsIDB4OGY0MzAwNDQsIDB4OGY0MjAwN2MsIDB4MTA2MjAwMjksCi0weDI0MDcwMDA4LCAweDhmNDQwMTY4LCAweDhmNDUwMTZjLCAweDhmNDgwMDBjLAotMHg4Zjg2MDEyMCwgMHgyNDAyMDA0MCwgMHhhZmEyMDAxMCwgMHhhZmEzMDAxNCwKLTB4YWZhODAwMTgsIDB4OGY0MjAxMGMsIDB4NDBmODA5LCAweDI0YzYwMDFjLAotMHgxNDQwMDAxMSwgMHgyNDAyMDAwMSwgMHgzYzAxMDAwMSwgMHgzNzA4MjEsCi0weGEwMjI0MGYyLCAweDhmODIwMTI0LCAweGFmYTIwMDEwLCAweDhmODIwMTI4LAotMHgzYzA0MDAwMSwgMHgyNDg0NjEzYywgMHhhZmEyMDAxNCwgMHg4ZjQ2MDA0NCwKLTB4OGY4NzAxMjAsIDB4M2MwNTAwMDksIDB4YzAwMmIzYiwgMHgzNGE1MTMwMCwKLTB4MTAwMDAwMGYsIDB4MCwgMHg4ZjQyMDMwNCwgMHgyNDQyMDAwMSwKLTB4YWY0MjAzMDQsIDB4OGY0MjAzMDQsIDB4OGY0MjAwNDQsIDB4YWY0MjAwN2MsCi0weDNjMDEwMDAxLCAweDM3MDgyMSwgMHhhMDIwNDBmMiwgMHgxMDAwMDAwNCwKLTB4YWY0MDAwNzgsIDB4M2MwMTAwMDEsIDB4MzcwODIxLCAweGEwMjA0MGYyLAotMHg4ZjQyMDAwMCwgMHgxMDQwMDAwNywgMHgwLCAweGFmODAwMDRjLAotMHg4ZjgyMDA0YywgMHgxMDQwZmZmZCwgMHgwLCAweDEwMDAwMDA1LAotMHgwLCAweGFmODAwMDQ4LCAweDhmODIwMDQ4LCAweDEwNDBmZmZkLAotMHgwLCAweDhmODIwMDYwLCAweDNjMDNmZWZmLCAweDM0NjNmZmZmLAotMHg0MzEwMjQsIDB4YWY4MjAwNjAsIDB4OGY0MjAwMDAsIDB4MTA0MDAwMDMsCi0weDAsIDB4MTAwMDAwMDIsIDB4YWY4MDAwNGMsIDB4YWY4MDAwNDgsCi0weDhmYmYwMDIwLCAweDNlMDAwMDgsIDB4MjdiZDAwMjgsIDB4M2UwMDAwOCwKLTB4MCwgMHgzYzAyMDAwMSwgMHg4YzQyNmRhOCwgMHgyN2JkZmZhOCwKLTB4YWZiZjAwNTAsIDB4YWZiZTAwNGMsIDB4YWZiNTAwNDgsIDB4YWZiMzAwNDQsCi0weGFmYjIwMDQwLCAweGFmYjEwMDNjLCAweGFmYjAwMDM4LCAweDEwNDAwMGQ1LAotMHg4ZjkwMDA0NCwgMHg4ZjQyMDBkMCwgMHgyNDQzMDAwMSwgMHgyODQyMDAwYiwKLTB4MTQ0MDAwZTQsIDB4YWY0MzAwZDAsIDB4OGY0MjAwMDQsIDB4MzA0MjAwMDIsCi0weDE0NDAwMDljLCAweGFmNDAwMGQwLCAweDhmNDIwMDA0LCAweDNjMDMwMDAxLAotMHg4YzYzNmQ5OCwgMHgzNDQyMDAwMiwgMHhhZjQyMDAwNCwgMHgyNDAyMDAwMSwKLTB4MTQ2MjAwMDMsIDB4M2MwMjA2MDAsIDB4MTAwMDAwMDIsIDB4MzQ0MjMwMDAsCi0weDM0NDIxMDAwLCAweGFmYTIwMDIwLCAweDhmNGEwMDE4LCAweGFmYWEwMDM0LAotMHgyN2FhMDAyMCwgMHhhZmFhMDAyYywgMHg4ZmFhMDAzNCwgMHgyNDAyMDBmZiwKLTB4MTE0MjAwMDIsIDB4MTgyMSwgMHgyNTQzMDAwMSwgMHg4YzAyMDIyOCwKLTB4NjA5ODIxLCAweDE2NjIwMDBlLCAweDNjMDUwMDA5LCAweDhmNDIwMzNjLAotMHgyNDQyMDAwMSwgMHhhZjQyMDMzYywgMHg4ZjQyMDMzYywgMHg4YzAyMDIyOCwKLTB4OGZhNzAwMzQsIDB4M2MwNDAwMDEsIDB4MjQ4NDYxMGMsIDB4YWZhMDAwMTQsCi0weGFmYTIwMDEwLCAweDhmYTYwMDIwLCAweDEwMDAwMDcwLCAweDM0YTUwNTAwLAotMHg4ZmFhMDAzNCwgMHhhMzhjMCwgMHhmNzEwMjEsIDB4OGZhMzAwMjAsCi0weDhmYTQwMDI0LCAweGFjNDMwNGMwLCAweGFjNDQwNGM0LCAweDhmODMwMDU0LAotMHg4ZjgyMDA1NCwgMHgyNDcxMDNlOCwgMHgyMjIxMDIzLCAweDJjNDIwM2U5LAotMHgxMDQwMDAxYiwgMHhhODIxLCAweGUwOTAyMSwgMHgyNjVlMDRjMCwKLTB4OGY0NDAxNzgsIDB4OGY0NTAxN2MsIDB4MjQwMTgyMSwgMHgyNDBhMDAwNCwKLTB4YWZhYTAwMTAsIDB4YWZiMzAwMTQsIDB4OGY0ODAwMGMsIDB4MTAyMSwKLTB4MmZlMzAyMSwgMHhhZmE4MDAxOCwgMHg4ZjQ4MDEwYywgMHgyNDA3MDAwOCwKLTB4YTMyODIxLCAweGEzNDgyYiwgMHg4MjIwMjEsIDB4MTAwZjgwOSwKLTB4ODkyMDIxLCAweDU0NDAwMDA2LCAweDI0MTUwMDAxLCAweDhmODIwMDU0LAotMHgyMjIxMDIzLCAweDJjNDIwM2U5LCAweDE0NDBmZmU5LCAweDAsCi0weDMyYTIwMGZmLCAweDU0NDAwMDE4LCAweGFmNTMwMDE4LCAweDhmNDIwMzc4LAotMHgyNDQyMDAwMSwgMHhhZjQyMDM3OCwgMHg4ZjQyMDM3OCwgMHg4ZjgyMDEyMCwKLTB4OGZhYTAwMmMsIDB4OGZhNzAwMzQsIDB4YWZhMjAwMTAsIDB4OGY4MjAxMjQsCi0weDNjMDQwMDAxLCAweDI0ODQ2MTE4LCAweGFmYTIwMDE0LCAweDhkNDYwMDAwLAotMHgzYzA1MDAwOSwgMHgxMDAwMDAzNSwgMHgzNGE1MDYwMCwgMHg4ZjQyMDMwOCwKLTB4MjQxNTAwMDEsIDB4MjQ0MjAwMDEsIDB4YWY0MjAzMDgsIDB4OGY0MjAzMDgsCi0weDEwMDAwMDFlLCAweDMyYTIwMGZmLCAweDhmODMwMDU0LCAweDhmODIwMDU0LAotMHgyNDcxMDNlOCwgMHgyMjIxMDIzLCAweDJjNDIwM2U5LCAweDEwNDAwMDE2LAotMHhhODIxLCAweDNjMWUwMDIwLCAweDI0MTIwMDEwLCAweDhmNDIwMDBjLAotMHg4ZjQ0MDE2MCwgMHg4ZjQ1MDE2NCwgMHg4Zjg2MDEyMCwgMHhhZmIyMDAxMCwKLTB4YWZiMzAwMTQsIDB4NWUxMDI1LCAweGFmYTIwMDE4LCAweDhmNDIwMTBjLAotMHgyNDA3MDAwOCwgMHg0MGY4MDksIDB4MjRjNjAwMWMsIDB4MTQ0MGZmZTMsCi0weDAsIDB4OGY4MjAwNTQsIDB4MjIyMTAyMywgMHgyYzQyMDNlOSwKLTB4MTQ0MGZmZWUsIDB4MCwgMHgzMmEyMDBmZiwgMHgxNDQwMDAxMSwKLTB4M2MwNTAwMDksIDB4OGY0MjAzNzgsIDB4MjQ0MjAwMDEsIDB4YWY0MjAzNzgsCi0weDhmNDIwMzc4LCAweDhmODIwMTIwLCAweDhmYWEwMDJjLCAweDhmYTcwMDM0LAotMHhhZmEyMDAxMCwgMHg4ZjgyMDEyNCwgMHgzYzA0MDAwMSwgMHgyNDg0NjEyMCwKLTB4YWZhMjAwMTQsIDB4OGQ0NjAwMDAsIDB4MzRhNTA3MDAsIDB4YzAwMmIzYiwKLTB4MCwgMHg4ZjQyMDJlYywgMHgyNDQyMDAwMSwgMHhhZjQyMDJlYywKLTB4OGY0MjAyZWMsIDB4OGY0MjAwMDQsIDB4MzA0MjAwMDEsIDB4NTA0MDAwMjksCi0weDM2MTAwMDQwLCAweDNjMDIwNDAwLCAweDJjMjEwMjQsIDB4MTA0MDAwMTMsCi0weDI0MDRmZmRmLCAweDhmNDIwMjUwLCAweDhmNDMwMjU0LCAweDhmNDQwMWI0LAotMHgxNDY0MDAwNiwgMHgzNjEwMDA0MCwgMHg4ZjQyMDI3MCwgMHg4ZjQzMDI3NCwKLTB4OGY0NDAxYjgsIDB4MTA2NDAwMDcsIDB4MjQwMmZmZGYsIDB4OGY0MjAyNTAsCi0weDhmNDMwMjU0LCAweDhmNDQwMjcwLCAweDhmNDUwMjc0LCAweDEwMDAwMDEyLAotMHgzYTEwMDAyMCwgMHgxMDAwMDAyYiwgMHgyMDI4MDI0LCAweDhmNDIwMjUwLAotMHg4ZjQzMDI1NCwgMHg4ZjQ1MDFiNCwgMHgxNDY1MDAwNiwgMHgyMDQ4MDI0LAotMHg4ZjQyMDI3MCwgMHg4ZjQzMDI3NCwgMHg4ZjQ0MDFiOCwgMHg1MDY0MDAyMSwKLTB4MzYxMDAwNDAsIDB4OGY0MjAyNTAsIDB4OGY0MzAyNTQsIDB4OGY0NDAyNzAsCi0weDhmNDUwMjc0LCAweDNhMTAwMDQwLCAweGFmNDMwMWI0LCAweDEwMDAwMDE5LAotMHhhZjQ1MDFiOCwgMHg4ZjQyMDBkNCwgMHgyNDQzMDAwMSwgMHgxMDAwMDAxMSwKLTB4Mjg0MjAwMzMsIDB4OGY0MjAwMDQsIDB4MzA0MjAwMDEsIDB4MTA0MDAwMDksCi0weDNjMDIwNDAwLCAweDJjMjEwMjQsIDB4MTA0MDAwMDQsIDB4MjQwMmZmZGYsCi0weDIwMjgwMjQsIDB4MTAwMDAwMGIsIDB4MzYxMDAwNDAsIDB4MTAwMDAwMDksCi0weDM2MTAwMDYwLCAweDhmNDIwMGQ0LCAweDM2MTAwMDQwLCAweDI0NDMwMDAxLAotMHgyODQyMDFmNSwgMHgxNDQwMDAwMywgMHhhZjQzMDBkNCwgMHhhZjQwMDBkNCwKLTB4M2ExMDAwMjAsIDB4YWY5MDAwNDQsIDB4MjQwMmZmN2YsIDB4MjgyYTAyNCwKLTB4OGZiZjAwNTAsIDB4OGZiZTAwNGMsIDB4OGZiNTAwNDgsIDB4OGZiMzAwNDQsCi0weDhmYjIwMDQwLCAweDhmYjEwMDNjLCAweDhmYjAwMDM4LCAweDNlMDAwMDgsCi0weDI3YmQwMDU4LCAweDNlMDAwMDgsIDB4MCwgMHgzYzAyMDAwMSwKLTB4OGM0MjZkYTgsIDB4MjdiZGZmYjAsIDB4YWZiZjAwNDgsIDB4YWZiZTAwNDQsCi0weGFmYjUwMDQwLCAweGFmYjMwMDNjLCAweGFmYjIwMDM4LCAweGFmYjEwMDM0LAotMHgxMDQwMDBjNywgMHhhZmIwMDAzMCwgMHg4ZjQyMDBkMCwgMHgyNDQzMDAwMSwKLTB4Mjg0MjAwMGIsIDB4MTQ0MDAwZGEsIDB4YWY0MzAwZDAsIDB4OGY0MjAwMDQsCi0weDMwNDIwMDAyLCAweDE0NDAwMDk3LCAweGFmNDAwMGQwLCAweDhmNDIwMDA0LAotMHgzYzAzMDAwMSwgMHg4YzYzNmQ5OCwgMHgzNDQyMDAwMiwgMHhhZjQyMDAwNCwKLTB4MjQwMjAwMDEsIDB4MTQ2MjAwMDMsIDB4M2MwMjA2MDAsIDB4MTAwMDAwMDIsCi0weDM0NDIzMDAwLCAweDM0NDIxMDAwLCAweGFmYTIwMDIwLCAweDE4MjEsCi0weDhmNWUwMDE4LCAweDI3YWEwMDIwLCAweDI0MDIwMGZmLCAweDEzYzIwMDAyLAotMHhhZmFhMDAyYywgMHgyN2MzMDAwMSwgMHg4YzAyMDIyOCwgMHg2MDkwMjEsCi0weDE2NDIwMDBlLCAweDFlMzhjMCwgMHg4ZjQyMDMzYywgMHgyNDQyMDAwMSwKLTB4YWY0MjAzM2MsIDB4OGY0MjAzM2MsIDB4OGMwMjAyMjgsIDB4M2MwNDAwMDEsCi0weDI0ODQ2MTBjLCAweDNjMDUwMDA5LCAweGFmYTAwMDE0LCAweGFmYTIwMDEwLAotMHg4ZmE2MDAyMCwgMHgxMDAwMDA2ZCwgMHgzNGE1MDUwMCwgMHhmNzEwMjEsCi0weDhmYTMwMDIwLCAweDhmYTQwMDI0LCAweGFjNDMwNGMwLCAweGFjNDQwNGM0LAotMHg4ZjgzMDA1NCwgMHg4ZjgyMDA1NCwgMHgyNDcwMDNlOCwgMHgyMDIxMDIzLAotMHgyYzQyMDNlOSwgMHgxMDQwMDAxYiwgMHg5ODIxLCAweGUwODgyMSwKLTB4MjYzNTA0YzAsIDB4OGY0NDAxNzgsIDB4OGY0NTAxN2MsIDB4MjIwMTgyMSwKLTB4MjQwYTAwMDQsIDB4YWZhYTAwMTAsIDB4YWZiMjAwMTQsIDB4OGY0ODAwMGMsCi0weDEwMjEsIDB4MmY1MzAyMSwgMHhhZmE4MDAxOCwgMHg4ZjQ4MDEwYywKLTB4MjQwNzAwMDgsIDB4YTMyODIxLCAweGEzNDgyYiwgMHg4MjIwMjEsCi0weDEwMGY4MDksIDB4ODkyMDIxLCAweDU0NDAwMDA2LCAweDI0MTMwMDAxLAotMHg4ZjgyMDA1NCwgMHgyMDIxMDIzLCAweDJjNDIwM2U5LCAweDE0NDBmZmU5LAotMHgwLCAweDMyNjIwMGZmLCAweDU0NDAwMDE3LCAweGFmNTIwMDE4LAotMHg4ZjQyMDM3OCwgMHgyNDQyMDAwMSwgMHhhZjQyMDM3OCwgMHg4ZjQyMDM3OCwKLTB4OGY4MjAxMjAsIDB4OGZhYTAwMmMsIDB4YWZhMjAwMTAsIDB4OGY4MjAxMjQsCi0weDNjMDQwMDAxLCAweDI0ODQ2MTE4LCAweDNjMDUwMDA5LCAweGFmYTIwMDE0LAotMHg4ZDQ2MDAwMCwgMHgxMDAwMDAzNSwgMHgzNGE1MDYwMCwgMHg4ZjQyMDMwOCwKLTB4MjQxMzAwMDEsIDB4MjQ0MjAwMDEsIDB4YWY0MjAzMDgsIDB4OGY0MjAzMDgsCi0weDEwMDAwMDFlLCAweDMyNjIwMGZmLCAweDhmODMwMDU0LCAweDhmODIwMDU0LAotMHgyNDcwMDNlOCwgMHgyMDIxMDIzLCAweDJjNDIwM2U5LCAweDEwNDAwMDE2LAotMHg5ODIxLCAweDNjMTUwMDIwLCAweDI0MTEwMDEwLCAweDhmNDIwMDBjLAotMHg4ZjQ0MDE2MCwgMHg4ZjQ1MDE2NCwgMHg4Zjg2MDEyMCwgMHhhZmIxMDAxMCwKLTB4YWZiMjAwMTQsIDB4NTUxMDI1LCAweGFmYTIwMDE4LCAweDhmNDIwMTBjLAotMHgyNDA3MDAwOCwgMHg0MGY4MDksIDB4MjRjNjAwMWMsIDB4MTQ0MGZmZTMsCi0weDAsIDB4OGY4MjAwNTQsIDB4MjAyMTAyMywgMHgyYzQyMDNlOSwKLTB4MTQ0MGZmZWUsIDB4MCwgMHgzMjYyMDBmZiwgMHgxNDQwMDAxMSwKLTB4MCwgMHg4ZjQyMDM3OCwgMHgyNDQyMDAwMSwgMHhhZjQyMDM3OCwKLTB4OGY0MjAzNzgsIDB4OGY4MjAxMjAsIDB4OGZhYTAwMmMsIDB4YWZhMjAwMTAsCi0weDhmODIwMTI0LCAweDNjMDQwMDAxLCAweDI0ODQ2MTIwLCAweDNjMDUwMDA5LAotMHhhZmEyMDAxNCwgMHg4ZDQ2MDAwMCwgMHgzNGE1MDcwMCwgMHhjMDAyYjNiLAotMHgzYzAzODIxLCAweDhmNDIwMmVjLCAweDI0NDIwMDAxLCAweGFmNDIwMmVjLAotMHg4ZjQyMDJlYywgMHg4ZjQyMDAwNCwgMHgzMDQyMDAwMSwgMHgxMDQwMDAxOCwKLTB4MjQwNDAwMDEsIDB4OGY0MjAyNTAsIDB4OGY0MzAyNTQsIDB4OGY0NTAxYjQsCi0weDNjMDEwMDAxLCAweDE0NjUwMDA2LCAweGEwMjQ2Y2YxLCAweDhmNDIwMjcwLAotMHg4ZjQzMDI3NCwgMHg4ZjQ0MDFiOCwgMHgxMDY0MDAyMSwgMHgwLAotMHg4ZjQyMDI1MCwgMHg4ZjQzMDI1NCwgMHgzYzA0MDAwMSwgMHg5MDg0NmNmMCwKLTB4OGY0NjAyNzAsIDB4OGY0NzAyNzQsIDB4Mzg4NDAwMDEsIDB4YWY0MzAxYjQsCi0weGFmNDcwMWI4LCAweDNjMDEwMDAxLCAweDEwMDAwMDI1LCAweGEwMjQ2Y2YwLAotMHg4ZjQyMDBkNCwgMHgzYzAxMDAwMSwgMHhhMDIwNmNmMCwgMHgyNDQzMDAwMSwKLTB4Mjg0MjAwMzMsIDB4MTQ0MDAwMWUsIDB4YWY0MzAwZDQsIDB4M2MwMjAwMDEsCi0weDkwNDI2Y2YxLCAweGFmNDAwMGQ0LCAweDEwMDAwMDE3LCAweDM4NDIwMDAxLAotMHg4ZjQyMDAwNCwgMHgzMDQyMDAwMSwgMHgxMDQwMDAwOCwgMHgwLAotMHhjMDA1NjVhLCAweDIwMjEsIDB4M2MwMTAwMDEsIDB4YTAyMDZjZjEsCi0weDNjMDEwMDAxLCAweDEwMDAwMDBlLCAweGEwMjA2Y2YwLCAweDhmNDIwMGQ0LAotMHgzYzAxMDAwMSwgMHhhMDIwNmNmMCwgMHgyNDQzMDAwMSwgMHgyODQyMDFmNSwKLTB4MTQ0MDAwMDcsIDB4YWY0MzAwZDQsIDB4M2MwMjAwMDEsIDB4OTA0MjZjZjEsCi0weGFmNDAwMGQ0LCAweDQyMTAyNiwgMHgzYzAxMDAwMSwgMHhhMDIyNmNmMSwKLTB4M2MwMzAwMDEsIDB4OGM2MzZkOTgsIDB4MjQwMjAwMDIsIDB4MTQ2MjAwMGMsCi0weDNjMDMwMDAyLCAweDNjMDMwMDAxLCAweDkwNjM2Y2YxLCAweDI0MDIwMDAxLAotMHg1NDYyMDAxZiwgMHgyMDIxLCAweDNjMDIwMDAxLCAweDkwNDI2Y2YwLAotMHgxNDQzMDAxYiwgMHgyNDA0MDAwNSwgMHgxMDAwMDAxOSwgMHgyNDA0MDAwNiwKLTB4M2MwMjAwMDIsIDB4OGM0MjhmZjQsIDB4NDMxMDI0LCAweDEwNDAwMDBiLAotMHgyNDAyMDAwMSwgMHgzYzAzMDAwMSwgMHg5MDYzNmNmMSwgMHg1NDYyMDAxMCwKLTB4MjAyMSwgMHgzYzAyMDAwMSwgMHg5MDQyNmNmMCwgMHgxNDQzMDAwYywKLTB4MjQwNDAwMDMsIDB4MTAwMDAwMGEsIDB4MjQwNDAwMDQsIDB4M2MwMzAwMDEsCi0weDkwNjM2Y2YxLCAweDE0NjIwMDA2LCAweDIwMjEsIDB4M2MwMjAwMDEsCi0weDkwNDI2Y2YwLCAweDI0MDQwMDAxLCAweDUwNDQwMDAxLCAweDI0MDQwMDAyLAotMHhjMDA1NjVhLCAweDAsIDB4MjQwMmZmN2YsIDB4MjgyYTAyNCwKLTB4OGZiZjAwNDgsIDB4OGZiZTAwNDQsIDB4OGZiNTAwNDAsIDB4OGZiMzAwM2MsCi0weDhmYjIwMDM4LCAweDhmYjEwMDM0LCAweDhmYjAwMDMwLCAweDNlMDAwMDgsCi0weDI3YmQwMDUwLCAweDNlMDAwMDgsIDB4MCwgMHgzYzAyMDAwMSwKLTB4OGM0MjZkYTgsIDB4MjdiZGZmYjAsIDB4YWZiZjAwNDgsIDB4YWZiZTAwNDQsCi0weGFmYjUwMDQwLCAweGFmYjMwMDNjLCAweGFmYjIwMDM4LCAweGFmYjEwMDM0LAotMHgxMDQwMDBkZSwgMHhhZmIwMDAzMCwgMHg4ZjQyMDBkMCwgMHgzYzA0MDAwMSwKLTB4OGM4NDZkOTgsIDB4MjQ0MzAwMDEsIDB4Mjg0MjAwMGIsIDB4YWY0NDAwZTgsCi0weDE0NDAwMGZlLCAweGFmNDMwMGQwLCAweDhmNDIwMDA0LCAweDMwNDIwMDAyLAotMHgxNDQwMDA5NSwgMHhhZjQwMDBkMCwgMHg4ZjQyMDAwNCwgMHgzNDQyMDAwMiwKLTB4YWY0MjAwMDQsIDB4MjQwMjAwMDEsIDB4MTQ4MjAwMDMsIDB4M2MwMjA2MDAsCi0weDEwMDAwMDAyLCAweDM0NDIzMDAwLCAweDM0NDIxMDAwLCAweGFmYTIwMDIwLAotMHgxODIxLCAweDhmNWUwMDE4LCAweDI3YWEwMDIwLCAweDI0MDIwMGZmLAotMHgxM2MyMDAwMiwgMHhhZmFhMDAyYywgMHgyN2MzMDAwMSwgMHg4YzAyMDIyOCwKLTB4NjA5MDIxLCAweDE2NDIwMDBlLCAweDFlMzhjMCwgMHg4ZjQyMDMzYywKLTB4MjQ0MjAwMDEsIDB4YWY0MjAzM2MsIDB4OGY0MjAzM2MsIDB4OGMwMjAyMjgsCi0weDNjMDQwMDAxLCAweDI0ODQ2MTBjLCAweDNjMDUwMDA5LCAweGFmYTAwMDE0LAotMHhhZmEyMDAxMCwgMHg4ZmE2MDAyMCwgMHgxMDAwMDA2ZCwgMHgzNGE1MDUwMCwKLTB4ZjcxMDIxLCAweDhmYTMwMDIwLCAweDhmYTQwMDI0LCAweGFjNDMwNGMwLAotMHhhYzQ0MDRjNCwgMHg4ZjgzMDA1NCwgMHg4ZjgyMDA1NCwgMHgyNDcwMDNlOCwKLTB4MjAyMTAyMywgMHgyYzQyMDNlOSwgMHgxMDQwMDAxYiwgMHg5ODIxLAotMHhlMDg4MjEsIDB4MjYzNTA0YzAsIDB4OGY0NDAxNzgsIDB4OGY0NTAxN2MsCi0weDIyMDE4MjEsIDB4MjQwYTAwMDQsIDB4YWZhYTAwMTAsIDB4YWZiMjAwMTQsCi0weDhmNDgwMDBjLCAweDEwMjEsIDB4MmY1MzAyMSwgMHhhZmE4MDAxOCwKLTB4OGY0ODAxMGMsIDB4MjQwNzAwMDgsIDB4YTMyODIxLCAweGEzNDgyYiwKLTB4ODIyMDIxLCAweDEwMGY4MDksIDB4ODkyMDIxLCAweDU0NDAwMDA2LAotMHgyNDEzMDAwMSwgMHg4ZjgyMDA1NCwgMHgyMDIxMDIzLCAweDJjNDIwM2U5LAotMHgxNDQwZmZlOSwgMHgwLCAweDMyNjIwMGZmLCAweDU0NDAwMDE3LAotMHhhZjUyMDAxOCwgMHg4ZjQyMDM3OCwgMHgyNDQyMDAwMSwgMHhhZjQyMDM3OCwKLTB4OGY0MjAzNzgsIDB4OGY4MjAxMjAsIDB4OGZhYTAwMmMsIDB4YWZhMjAwMTAsCi0weDhmODIwMTI0LCAweDNjMDQwMDAxLCAweDI0ODQ2MTE4LCAweDNjMDUwMDA5LAotMHhhZmEyMDAxNCwgMHg4ZDQ2MDAwMCwgMHgxMDAwMDAzNSwgMHgzNGE1MDYwMCwKLTB4OGY0MjAzMDgsIDB4MjQxMzAwMDEsIDB4MjQ0MjAwMDEsIDB4YWY0MjAzMDgsCi0weDhmNDIwMzA4LCAweDEwMDAwMDFlLCAweDMyNjIwMGZmLCAweDhmODMwMDU0LAotMHg4ZjgyMDA1NCwgMHgyNDcwMDNlOCwgMHgyMDIxMDIzLCAweDJjNDIwM2U5LAotMHgxMDQwMDAxNiwgMHg5ODIxLCAweDNjMTUwMDIwLCAweDI0MTEwMDEwLAotMHg4ZjQyMDAwYywgMHg4ZjQ0MDE2MCwgMHg4ZjQ1MDE2NCwgMHg4Zjg2MDEyMCwKLTB4YWZiMTAwMTAsIDB4YWZiMjAwMTQsIDB4NTUxMDI1LCAweGFmYTIwMDE4LAotMHg4ZjQyMDEwYywgMHgyNDA3MDAwOCwgMHg0MGY4MDksIDB4MjRjNjAwMWMsCi0weDE0NDBmZmUzLCAweDAsIDB4OGY4MjAwNTQsIDB4MjAyMTAyMywKLTB4MmM0MjAzZTksIDB4MTQ0MGZmZWUsIDB4MCwgMHgzMjYyMDBmZiwKLTB4MTQ0MDAwMTEsIDB4MCwgMHg4ZjQyMDM3OCwgMHgyNDQyMDAwMSwKLTB4YWY0MjAzNzgsIDB4OGY0MjAzNzgsIDB4OGY4MjAxMjAsIDB4OGZhYTAwMmMsCi0weGFmYTIwMDEwLCAweDhmODIwMTI0LCAweDNjMDQwMDAxLCAweDI0ODQ2MTIwLAotMHgzYzA1MDAwOSwgMHhhZmEyMDAxNCwgMHg4ZDQ2MDAwMCwgMHgzNGE1MDcwMCwKLTB4YzAwMmIzYiwgMHgzYzAzODIxLCAweDhmNDIwMmVjLCAweDI0NDIwMDAxLAotMHhhZjQyMDJlYywgMHg4ZjQyMDJlYywgMHg4ZjQyMDAwNCwgMHgzMDQyMDAwMSwKLTB4MTA0MDAwMzMsIDB4M2MwMjA0MDAsIDB4MmMyMTAyNCwgMHgxMDQwMDAxNywKLTB4MCwgMHg5MzQyMDVjMCwgMHg4ZjQ0MDI1MCwgMHg4ZjQ1MDI1NCwKLTB4OGY0MzAxYjQsIDB4MzQ0MjAwMjAsIDB4MTRhMzAwMDYsIDB4YTM0MjA1YzAsCi0weDhmNDIwMjcwLCAweDhmNDMwMjc0LCAweDhmNDQwMWI4LCAweDEwNjQwMDA4LAotMHgwLCAweDhmNDIwMjUwLCAweDhmNDMwMjU0LCAweDkzNDQwNWMwLAotMHg4ZjQ2MDI3MCwgMHg4ZjQ3MDI3NCwgMHgxMDAwMDAxNiwgMHgzODg0MDA0MCwKLTB4OTM0MjA1YzAsIDB4MTAwMDAwNDgsIDB4MzA0MjAwYmYsIDB4OTM0MjA1YzAsCi0weDhmNDQwMjUwLCAweDhmNDUwMjU0LCAweDhmNDMwMWI0LCAweDMwNDIwMGJmLAotMHgxNGEzMDAwNiwgMHhhMzQyMDVjMCwgMHg4ZjQyMDI3MCwgMHg4ZjQzMDI3NCwKLTB4OGY0NDAxYjgsIDB4MTA2NDAwMGIsIDB4MCwgMHg4ZjQyMDI1MCwKLTB4OGY0MzAyNTQsIDB4OTM0NDA1YzAsIDB4OGY0NjAyNzAsIDB4OGY0NzAyNzQsCi0weDM4ODQwMDIwLCAweGFmNDMwMWI0LCAweGFmNDcwMWI4LCAweDEwMDAwMDMzLAotMHhhMzQ0MDVjMCwgMHg5MzQyMDVjMCwgMHgxMDAwMDAyZiwgMHgzNDQyMDAyMCwKLTB4OTM0MjA1YzAsIDB4OGY0MzAwZDQsIDB4MzQ0MjAwMjAsIDB4YTM0MjA1YzAsCi0weDI0NjIwMDAxLCAweDEwMDAwMDIzLCAweDI4NjMwMDMzLCAweDhmNDIwMGU0LAotMHg4ZjQzMDBlMCwgMHgyNDQyMDAwMSwgMHhhZjQyMDBlNCwgMHg0MzEwMmEsCi0weDE0NDAwMDA2LCAweDI0MDMwMDAxLCAweDhmNDIwMGU4LCAweDE0NDMwMDAyLAotMHhhZjQwMDBlNCwgMHgyNDAzMDAwNCwgMHhhZjQzMDBlOCwgMHg4ZjQyMDAwNCwKLTB4MzA0MjAwMDEsIDB4MTA0MDAwMGQsIDB4M2MwMjA0MDAsIDB4MmMyMTAyNCwKLTB4MTA0MDAwMDcsIDB4MCwgMHg5MzQyMDVjMCwgMHgzNDQyMDA0MCwKLTB4YTM0MjA1YzAsIDB4OTM0MjA1YzAsIDB4MTAwMDAwMGYsIDB4MzA0MjAwZGYsCi0weDkzNDIwNWMwLCAweDEwMDAwMDBjLCAweDM0NDIwMDYwLCAweDkzNDIwNWMwLAotMHg4ZjQzMDBkNCwgMHgzNDQyMDAyMCwgMHhhMzQyMDVjMCwgMHgyNDYyMDAwMSwKLTB4Mjg2MzAwZmIsIDB4MTQ2MDAwMDUsIDB4YWY0MjAwZDQsIDB4OTM0MjA1YzAsCi0weGFmNDAwMGQ0LCAweDM4NDIwMDQwLCAweGEzNDIwNWMwLCAweDkzNDIwNWMwLAotMHg4ZjQzMDBlOCwgMHgzMDQyMDA3ZiwgMHhhMzQyMDVjMCwgMHgyNDAyMDAwMSwKLTB4MTQ2MjAwMDUsIDB4MCwgMHg5MzQ0MDVjMCwgMHg0MjEwMiwKLTB4MTAwMDAwMDMsIDB4MzQ4NDAwZjAsIDB4OTM0NDA1YzAsIDB4MzQ4NDAwMGYsCi0weGMwMDU2NDAsIDB4MCwgMHgyNDAyZmY3ZiwgMHgyODJhMDI0LAotMHg4ZmJmMDA0OCwgMHg4ZmJlMDA0NCwgMHg4ZmI1MDA0MCwgMHg4ZmIzMDAzYywKLTB4OGZiMjAwMzgsIDB4OGZiMTAwMzQsIDB4OGZiMDAwMzAsIDB4M2UwMDAwOCwKLTB4MjdiZDAwNTAsIDB4M2UwMDAwOCwgMHgwLCAweDI3YmRmZmIwLAotMHgyNzQ0MDFjMCwgMHgyNmUzMDAyOCwgMHgyNDY1MDQwMCwgMHg2NTEwMmIsCi0weGFmYmYwMDQ4LCAweGFmYmUwMDQ0LCAweGFmYjUwMDQwLCAweGFmYjMwMDNjLAotMHhhZmIyMDAzOCwgMHhhZmIxMDAzNCwgMHgxMDQwMDAwNywgMHhhZmIwMDAzMCwKLTB4OGM4MjAwMDAsIDB4YWM2MjAwMDAsIDB4MjQ2MzAwMDQsIDB4NjUxMDJiLAotMHgxNDQwZmZmYiwgMHgyNDg0MDAwNCwgMHg4YzAyMDA4MCwgMHhhZWUyMDA0NCwKLTB4OGMwMjAwYzAsIDB4YWVlMjAwNDAsIDB4OGMwMjAwODQsIDB4YWVlMjAwMzAsCi0weDhjMDIwMDg0LCAweGFlZTIwMjNjLCAweDhjMDIwMDg4LCAweGFlZTIwMjQwLAotMHg4YzAyMDA4YywgMHhhZWUyMDI0NCwgMHg4YzAyMDA5MCwgMHhhZWUyMDI0OCwKLTB4OGMwMjAwOTQsIDB4YWVlMjAyNGMsIDB4OGMwMjAwOTgsIDB4YWVlMjAyNTAsCi0weDhjMDIwMDljLCAweGFlZTIwMjU0LCAweDhjMDIwMGEwLCAweGFlZTIwMjU4LAotMHg4YzAyMDBhNCwgMHhhZWUyMDI1YywgMHg4YzAyMDBhOCwgMHhhZWUyMDI2MCwKLTB4OGMwMjAwYWMsIDB4YWVlMjAyNjQsIDB4OGMwMjAwYjAsIDB4YWVlMjAyNjgsCi0weDhjMDIwMGI0LCAweGFlZTIwMjZjLCAweDhjMDIwMGI4LCAweGFlZTIwMjcwLAotMHg4YzAyMDBiYywgMHgyNDA0MDAwMSwgMHhhZWUyMDI3NCwgMHhhZWUwMDAzNCwKLTB4NDEwODAsIDB4NTcxMDIxLCAweDhlZTMwMDM0LCAweDhjNDIwMjNjLAotMHgyNDg0MDAwMSwgMHg2MjE4MjEsIDB4MmM4MjAwMGYsIDB4YWVlMzAwMzQsCi0weDE0NDBmZmY4LCAweDQxMDgwLCAweDhjMDIwMGNjLCAweGFlZTIwMDQ4LAotMHg4YzAyMDBkMCwgMHhhZWUyMDA0YywgMHg4YzAyMDBlMCwgMHhhZWUyMDFmOCwKLTB4OGMwMjAwZTQsIDB4YWVlMjAxZmMsIDB4OGMwMjAwZTgsIDB4YWVlMjAyMDAsCi0weDhjMDIwMGVjLCAweGFlZTIwMjA0LCAweDhjMDIwMGYwLCAweGFlZTIwMjA4LAotMHg4ZWU0MDBjMCwgMHg4ZWU1MDBjNCwgMHg4YzAyMDBmYywgMHg0NTEwMmIsCi0weDEwNDAwMDBiLCAweDAsIDB4OGVlMjAwYzAsIDB4OGVlMzAwYzQsCi0weDI0MDQwMDAxLCAweDI0MDUwMDAwLCAweDY1MTgyMSwgMHg2NTMwMmIsCi0weDQ0MTAyMSwgMHg0NjEwMjEsIDB4YWVlMjAwYzAsIDB4YWVlMzAwYzQsCi0weDhjMDIwMGZjLCAweDhlZTQwMGMwLCAweDhlZTUwMGM0LCAweDI0MDhmZmZmLAotMHgyNDA5MDAwMCwgMHg0MDE4MjEsIDB4MTAyMSwgMHg4ODIwMjQsCi0weGE5MjgyNCwgMHg4MjIwMjUsIDB4YTMyODI1LCAweGFlZTQwMGMwLAotMHhhZWU1MDBjNCwgMHg4ZWU0MDBkMCwgMHg4ZWU1MDBkNCwgMHg4YzAyMDBmNCwKLTB4NDUxMDJiLCAweDEwNDAwMDBiLCAweDAsIDB4OGVlMjAwZDAsCi0weDhlZTMwMGQ0LCAweDI0MDQwMDAxLCAweDI0MDUwMDAwLCAweDY1MTgyMSwKLTB4NjUzMDJiLCAweDQ0MTAyMSwgMHg0NjEwMjEsIDB4YWVlMjAwZDAsCi0weGFlZTMwMGQ0LCAweDhjMDIwMGY0LCAweDhlZTQwMGQwLCAweDhlZTUwMGQ0LAotMHg0MDE4MjEsIDB4MTAyMSwgMHg4ODIwMjQsIDB4YTkyODI0LAotMHg4MjIwMjUsIDB4YTMyODI1LCAweGFlZTQwMGQwLCAweGFlZTUwMGQ0LAotMHg4ZWU0MDBjOCwgMHg4ZWU1MDBjYywgMHg4YzAyMDBmOCwgMHg0NTEwMmIsCi0weDEwNDAwMDBiLCAweDAsIDB4OGVlMjAwYzgsIDB4OGVlMzAwY2MsCi0weDI0MDQwMDAxLCAweDI0MDUwMDAwLCAweDY1MTgyMSwgMHg2NTMwMmIsCi0weDQ0MTAyMSwgMHg0NjEwMjEsIDB4YWVlMjAwYzgsIDB4YWVlMzAwY2MsCi0weDhjMDIwMGY4LCAweDhlZTQwMGM4LCAweDhlZTUwMGNjLCAweDQwMTgyMSwKLTB4MTAyMSwgMHg4ODIwMjQsIDB4YTkyODI0LCAweDgyMjAyNSwKLTB4YTMyODI1LCAweDI0MDIwMDA4LCAweGFlZTQwMGM4LCAweGFlZTUwMGNjLAotMHhhZmEyMDAxMCwgMHhhZmEwMDAxNCwgMHg4ZjQyMDAwYywgMHg4YzA0MDIwOCwKLTB4OGMwNTAyMGMsIDB4YWZhMjAwMTgsIDB4OGY0MjAxMGMsIDB4MjZlNjAwMjgsCi0weDQwZjgwOSwgMHgyNDA3MDQwMCwgMHgxMDQwMDBmMCwgMHgzYzAyMDQwMCwKLTB4YWZhMjAwMjAsIDB4OTM0MjA1YzYsIDB4MTA0MDAwODksIDB4MTgyMSwKLTB4OGY1ZTAwMTgsIDB4MjdhYTAwMjAsIDB4MjQwMjAwZmYsIDB4MTNjMjAwMDIsCi0weGFmYWEwMDJjLCAweDI3YzMwMDAxLCAweDhjMDIwMjI4LCAweDYwOTAyMSwKLTB4MTY0MjAwMGUsIDB4MWUzOGMwLCAweDhmNDIwMzNjLCAweDI0NDIwMDAxLAotMHhhZjQyMDMzYywgMHg4ZjQyMDMzYywgMHg4YzAyMDIyOCwgMHgzYzA0MDAwMSwKLTB4MjQ4NDYxMGMsIDB4M2MwNTAwMDksIDB4YWZhMDAwMTQsIDB4YWZhMjAwMTAsCi0weDhmYTYwMDIwLCAweDEwMDAwMDZiLCAweDM0YTUwNTAwLCAweGY3MTAyMSwKLTB4OGZhMzAwMjAsIDB4OGZhNDAwMjQsIDB4YWM0MzA0YzAsIDB4YWM0NDA0YzQsCi0weDhmODMwMDU0LCAweDhmODIwMDU0LCAweDI0NzAwM2U4LCAweDIwMjEwMjMsCi0weDJjNDIwM2U5LCAweDEwNDAwMDFiLCAweDk4MjEsIDB4ZTA4ODIxLAotMHgyNjM1MDRjMCwgMHg4ZjQ0MDE3OCwgMHg4ZjQ1MDE3YywgMHgyMjAxODIxLAotMHgyNDBhMDAwNCwgMHhhZmFhMDAxMCwgMHhhZmIyMDAxNCwgMHg4ZjQ4MDAwYywKLTB4MTAyMSwgMHgyZjUzMDIxLCAweGFmYTgwMDE4LCAweDhmNDgwMTBjLAotMHgyNDA3MDAwOCwgMHhhMzI4MjEsIDB4YTM0ODJiLCAweDgyMjAyMSwKLTB4MTAwZjgwOSwgMHg4OTIwMjEsIDB4NTQ0MDAwMDYsIDB4MjQxMzAwMDEsCi0weDhmODIwMDU0LCAweDIwMjEwMjMsIDB4MmM0MjAzZTksIDB4MTQ0MGZmZTksCi0weDAsIDB4MzI2MjAwZmYsIDB4NTQ0MDAwMTcsIDB4YWY1MjAwMTgsCi0weDhmNDIwMzc4LCAweDI0NDIwMDAxLCAweGFmNDIwMzc4LCAweDhmNDIwMzc4LAotMHg4ZjgyMDEyMCwgMHg4ZmFhMDAyYywgMHhhZmEyMDAxMCwgMHg4ZjgyMDEyNCwKLTB4M2MwNDAwMDEsIDB4MjQ4NDYxMTgsIDB4M2MwNTAwMDksIDB4YWZhMjAwMTQsCi0weDhkNDYwMDAwLCAweDEwMDAwMDMzLCAweDM0YTUwNjAwLCAweDhmNDIwMzA4LAotMHgyNDEzMDAwMSwgMHgyNDQyMDAwMSwgMHhhZjQyMDMwOCwgMHg4ZjQyMDMwOCwKLTB4MTAwMDAwMWMsIDB4MzI2MjAwZmYsIDB4OGY4MzAwNTQsIDB4OGY4MjAwNTQsCi0weDI0NzAwM2U4LCAweDIwMjEwMjMsIDB4MmM0MjAzZTksIDB4MTA0MDAwMTQsCi0weDk4MjEsIDB4MjQxMTAwMTAsIDB4OGY0MjAwMGMsIDB4OGY0NDAxNjAsCi0weDhmNDUwMTY0LCAweDhmODYwMTIwLCAweGFmYjEwMDEwLCAweGFmYjIwMDE0LAotMHhhZmEyMDAxOCwgMHg4ZjQyMDEwYywgMHgyNDA3MDAwOCwgMHg0MGY4MDksCi0weDI0YzYwMDFjLCAweDE0NDBmZmU1LCAweDAsIDB4OGY4MjAwNTQsCi0weDIwMjEwMjMsIDB4MmM0MjAzZTksIDB4MTQ0MGZmZWYsIDB4MCwKLTB4MzI2MjAwZmYsIDB4NTQ0MDAwMTIsIDB4MjQwMjAwMDEsIDB4OGY0MjAzNzgsCi0weDI0NDIwMDAxLCAweGFmNDIwMzc4LCAweDhmNDIwMzc4LCAweDhmODIwMTIwLAotMHg4ZmFhMDAyYywgMHhhZmEyMDAxMCwgMHg4ZjgyMDEyNCwgMHgzYzA0MDAwMSwKLTB4MjQ4NDYxMjAsIDB4M2MwNTAwMDksIDB4YWZhMjAwMTQsIDB4OGQ0NjAwMDAsCi0weDM0YTUwNzAwLCAweGMwMDJiM2IsIDB4M2MwMzgyMSwgMHgxMDIxLAotMHgxNDQwMDA1YiwgMHgyNDAyMDAwMSwgMHgxMDAwMDA2NSwgMHgwLAotMHg4ZjUxMDAxOCwgMHgyNDAyMDBmZiwgMHgxMjIyMDAwMiwgMHg4MDIxLAotMHgyNjMwMDAwMSwgMHg4YzAyMDIyOCwgMHgxNjAyMDAwZSwgMHgxMTMwYzAsCi0weDhmNDIwMzNjLCAweDI0NDIwMDAxLCAweGFmNDIwMzNjLCAweDhmNDIwMzNjLAotMHg4YzAyMDIyOCwgMHgzYzA0MDAwMSwgMHgyNDg0NjBmNCwgMHgzYzA1MDAwOSwKLTB4YWZhMDAwMTQsIDB4YWZhMjAwMTAsIDB4OGZhNjAwMjAsIDB4MTAwMDAwM2YsCi0weDM0YTUwMTAwLCAweGQ3MTAyMSwgMHg4ZmEzMDAyMCwgMHg4ZmE0MDAyNCwKLTB4YWM0MzA0YzAsIDB4YWM0NDA0YzQsIDB4YzAxODIxLCAweDhmNDQwMTc4LAotMHg4ZjQ1MDE3YywgMHgxMDIxLCAweDI0MDcwMDA0LCAweGFmYTcwMDEwLAotMHhhZmIwMDAxNCwgMHg4ZjQ4MDAwYywgMHgyNGM2MDRjMCwgMHgyZTYzMDIxLAotMHhhZmE4MDAxOCwgMHg4ZjQ4MDEwYywgMHgyNDA3MDAwOCwgMHhhMzI4MjEsCi0weGEzNDgyYiwgMHg4MjIwMjEsIDB4MTAwZjgwOSwgMHg4OTIwMjEsCi0weDE0NDAwMDBiLCAweDI0MDcwMDA4LCAweDhmODIwMTIwLCAweGFmYTIwMDEwLAotMHg4ZjgyMDEyNCwgMHgzYzA0MDAwMSwgMHgyNDg0NjBmYywgMHgzYzA1MDAwOSwKLTB4YWZhMjAwMTQsIDB4OGZhNjAwMjAsIDB4MTAwMDAwMWMsIDB4MzRhNTAyMDAsCi0weDhmNDQwMTYwLCAweDhmNDUwMTY0LCAweDhmNDMwMDBjLCAweGFmNTAwMDE4LAotMHg4Zjg2MDEyMCwgMHgyNDAyMDAxMCwgMHhhZmEyMDAxMCwgMHhhZmIwMDAxNCwKLTB4YWZhMzAwMTgsIDB4OGY0MjAxMGMsIDB4NDBmODA5LCAweDI0YzYwMDFjLAotMHg1NDQwMDAxMSwgMHgyNDAyMDAwMSwgMHg4ZjQyMDM0MCwgMHgyNDQyMDAwMSwKLTB4YWY0MjAzNDAsIDB4OGY0MjAzNDAsIDB4OGY4MjAxMjAsIDB4YWZhMjAwMTAsCi0weDhmODIwMTI0LCAweDNjMDQwMDAxLCAweDI0ODQ2MTA0LCAweDNjMDUwMDA5LAotMHhhZmEyMDAxNCwgMHg4ZmE2MDAyMCwgMHgzNGE1MDMwMCwgMHhjMDAyYjNiLAotMHgyMjAzODIxLCAweDEwMjEsIDB4MTA0MDAwMGQsIDB4MjQwMjAwMDEsCi0weDhmNDIwMmU4LCAweGEzNDAwNWM2LCAweGFmNDAwMWIwLCAweDI0NDIwMDAxLAotMHhhZjQyMDJlOCwgMHg4ZjQyMDJlOCwgMHg4ZWUyMDE1MCwgMHgyNDQyMDAwMSwKLTB4YWVlMjAxNTAsIDB4MTAwMDAwMDMsIDB4OGVlMjAxNTAsIDB4MjQwMjAwMDEsCi0weGEzNDIwNWM2LCAweDhmYmYwMDQ4LCAweDhmYmUwMDQ0LCAweDhmYjUwMDQwLAotMHg4ZmIzMDAzYywgMHg4ZmIyMDAzOCwgMHg4ZmIxMDAzNCwgMHg4ZmIwMDAzMCwKLTB4M2UwMDAwOCwgMHgyN2JkMDA1MCwgMHgyN2JkZmZkOCwgMHhhZmJmMDAyMCwKLTB4OGY4MjAwYjAsIDB4MzA0MjAwMDQsIDB4MTA0MDAwNjgsIDB4MCwKLTB4OGY0MzAxMjgsIDB4OGY4MjAxMDQsIDB4MTQ2MjAwMDUsIDB4MCwKLTB4OGY0MzAxMzAsIDB4OGY4MjAwYjQsIDB4MTA2MjAwMDYsIDB4MCwKLTB4OGY4MjAxMDQsIDB4YWY0MjAxMjgsIDB4OGY4MjAwYjQsIDB4MTAwMDAwNWIsCi0weGFmNDIwMTMwLCAweDhmODIwMGIwLCAweDNjMDMwMDgwLCAweDQzMTAyNCwKLTB4MTA0MDAwMGQsIDB4MCwgMHg4ZjgyMDExYywgMHgzNDQyMDAwMiwKLTB4YWY4MjAxMWMsIDB4OGY4MjAwYjAsIDB4MjQwM2ZmZmIsIDB4NDMxMDI0LAotMHhhZjgyMDBiMCwgMHg4ZjgyMDExYywgMHgyNDAzZmZmZCwgMHg0MzEwMjQsCi0weDEwMDAwMDRhLCAweGFmODIwMTFjLCAweDhmNDMwMTI4LCAweDhmODIwMTA0LAotMHgxNDYyMDAwNSwgMHgwLCAweDhmNDMwMTMwLCAweDhmODIwMGI0LAotMHgxMDYyMDAxMCwgMHgwLCAweDhmODIwMTA0LCAweGFmNDIwMTI4LAotMHg4ZjgyMDBiNCwgMHg4ZjQzMDEyOCwgMHhhZjQyMDEzMCwgMHhhZmEzMDAxMCwKLTB4OGY0MjAxMzAsIDB4M2MwNDAwMDEsIDB4MjQ4NDYxNDQsIDB4YWZhMjAwMTQsCi0weDhmODYwMTFjLCAweDhmODcwMGIwLCAweDNjMDUwMDA1LCAweDEwMDAwMDMxLAotMHgzNGE1MDkwMCwgMHg4ZjQyMDEyOCwgMHhhZmEyMDAxMCwgMHg4ZjQyMDEzMCwKLTB4M2MwNDAwMDEsIDB4MjQ4NDYxNTAsIDB4YWZhMjAwMTQsIDB4OGY4NjAxMWMsCi0weDhmODcwMGIwLCAweDNjMDUwMDA1LCAweGMwMDJiM2IsIDB4MzRhNTEwMDAsCi0weDhmODIwMTFjLCAweDM0NDIwMDAyLCAweGFmODIwMTFjLCAweDhmODMwMTA0LAotMHg4ZjgyMDBiMCwgMHgzNDQyMDAwMSwgMHhhZjgyMDBiMCwgMHgyNDAyMDAwOCwKLTB4YWY4MzAxMDQsIDB4YWZhMjAwMTAsIDB4YWZhMDAwMTQsIDB4OGY0MjAwMGMsCi0weDhjMDQwMjA4LCAweDhjMDUwMjBjLCAweGFmYTIwMDE4LCAweDhmNDIwMTBjLAotMHgyNmU2MDAyOCwgMHg0MGY4MDksIDB4MjQwNzA0MDAsIDB4OGY4MjAxMWMsCi0weDI0MDNmZmZkLCAweDQzMTAyNCwgMHhhZjgyMDExYywgMHg4ZWUyMDFkYywKLTB4MjQ0MjAwMDEsIDB4YWVlMjAxZGMsIDB4OGVlMjAxZGMsIDB4OGY0MjAxMjgsCi0weGFmYTIwMDEwLCAweDhmNDIwMTMwLCAweDNjMDQwMDAxLCAweDI0ODQ2MTVjLAotMHhhZmEyMDAxNCwgMHg4Zjg2MDExYywgMHg4Zjg3MDBiMCwgMHgzYzA1MDAwNSwKLTB4MzRhNTExMDAsIDB4YzAwMmIzYiwgMHgwLCAweDhmODIwMGEwLAotMHgzMDQyMDAwNCwgMHgxMDQwMDA2OSwgMHgwLCAweDhmNDMwMTJjLAotMHg4ZjgyMDEyNCwgMHgxNDYyMDAwNSwgMHgwLCAweDhmNDMwMTM0LAotMHg4ZjgyMDBhNCwgMHgxMDYyMDAwNiwgMHgwLCAweDhmODIwMTI0LAotMHhhZjQyMDEyYywgMHg4ZjgyMDBhNCwgMHgxMDAwMDA1YywgMHhhZjQyMDEzNCwKLTB4OGY4MjAwYTAsIDB4M2MwMzAwODAsIDB4NDMxMDI0LCAweDEwNDAwMDBkLAotMHgwLCAweDhmODIwMTFjLCAweDM0NDIwMDAyLCAweGFmODIwMTFjLAotMHg4ZjgyMDBhMCwgMHgyNDAzZmZmYiwgMHg0MzEwMjQsIDB4YWY4MjAwYTAsCi0weDhmODIwMTFjLCAweDI0MDNmZmZkLCAweDQzMTAyNCwgMHgxMDAwMDA0YiwKLTB4YWY4MjAxMWMsIDB4OGY0MzAxMmMsIDB4OGY4MjAxMjQsIDB4MTQ2MjAwMDUsCi0weDAsIDB4OGY0MzAxMzQsIDB4OGY4MjAwYTQsIDB4MTA2MjAwMTAsCi0weDAsIDB4OGY4MjAxMjQsIDB4YWY0MjAxMmMsIDB4OGY4MjAwYTQsCi0weDhmNDMwMTJjLCAweGFmNDIwMTM0LCAweGFmYTMwMDEwLCAweDhmNDIwMTM0LAotMHgzYzA0MDAwMSwgMHgyNDg0NjE2OCwgMHhhZmEyMDAxNCwgMHg4Zjg2MDExYywKLTB4OGY4NzAwYTAsIDB4M2MwNTAwMDUsIDB4MTAwMDAwMzIsIDB4MzRhNTEyMDAsCi0weDhmNDIwMTJjLCAweGFmYTIwMDEwLCAweDhmNDIwMTM0LCAweDNjMDQwMDAxLAotMHgyNDg0NjE3NCwgMHhhZmEyMDAxNCwgMHg4Zjg2MDExYywgMHg4Zjg3MDBhMCwKLTB4M2MwNTAwMDUsIDB4YzAwMmIzYiwgMHgzNGE1MTMwMCwgMHg4ZjgyMDExYywKLTB4MzQ0MjAwMDIsIDB4YWY4MjAxMWMsIDB4OGY4MzAxMjQsIDB4OGY4MjAwYTAsCi0weDM0NDIwMDAxLCAweGFmODIwMGEwLCAweDI0MDIwMDgwLCAweGFmODMwMTI0LAotMHhhZmEyMDAxMCwgMHhhZmEwMDAxNCwgMHg4ZjQyMDAxNCwgMHg4YzA0MDIwOCwKLTB4OGMwNTAyMGMsIDB4YWZhMjAwMTgsIDB4OGY0MjAxMDgsIDB4M2MwNjAwMDEsCi0weDI0YzY2ZWQ4LCAweDQwZjgwOSwgMHgyNDA3MDAwNCwgMHg4ZjgyMDExYywKLTB4MjQwM2ZmZmQsIDB4NDMxMDI0LCAweGFmODIwMTFjLCAweDhlZTIwMWRjLAotMHgyNDQyMDAwMSwgMHhhZWUyMDFkYywgMHg4ZWUyMDFkYywgMHg4ZjQyMDEyYywKLTB4YWZhMjAwMTAsIDB4OGY0MjAxMzQsIDB4M2MwNDAwMDEsIDB4MjQ4NDYxODAsCi0weGFmYTIwMDE0LCAweDhmODYwMTFjLCAweDhmODcwMGEwLCAweDNjMDUwMDA1LAotMHgzNGE1MTQwMCwgMHhjMDAyYjNiLCAweDAsIDB4OGZiZjAwMjAsCi0weDNlMDAwMDgsIDB4MjdiZDAwMjgsIDB4M2MwODEwMDAsIDB4MjQwNzAwMDEsCi0weDNjMDYwMDgwLCAweDNjMDUwMTAwLCAweDhmODIwMDcwLCAweDQ4MTAyNCwKLTB4MTA0MGZmZmQsIDB4MCwgMHg4ZjgyMDA1NCwgMHgyNDQyMDAwNSwKLTB4YWY4MjAwNzgsIDB4OGMwNDAyMzQsIDB4MTA4MDAwMTYsIDB4MTgyMSwKLTB4M2MwMjAwMDEsIDB4NTcxMDIxLCAweDhjNDI0MGU4LCAweDI0NDIwMDA1LAotMHgzYzAxMDAwMSwgMHgzNzA4MjEsIDB4YWMyMjQwZTgsIDB4M2MwMjAwMDEsCi0weDU3MTAyMSwgMHg4YzQyNDBlOCwgMHg0NDEwMmIsIDB4MTQ0MDAwMDksCi0weDAsIDB4M2MwMzAwODAsIDB4M2MwMTAwMDEsIDB4MzcwODIxLAotMHhhYzIwNDBlOCwgMHgzYzAxMDAwMSwgMHgzNzA4MjEsIDB4MTAwMDAwMGIsCi0weGEwMjc0MGYwLCAweDNjMDIwMDAxLCAweDU3MTAyMSwgMHg5MDQyNDBmMCwKLTB4NTQ0MDAwMDYsIDB4NjYxODI1LCAweDNjMDIwMDAxLCAweDU3MTAyMSwKLTB4OTA0MjQwZjEsIDB4NTQ0MDAwMDEsIDB4NjYxODI1LCAweDhjMDQwMjMwLAotMHgxMDgwMDAxMywgMHgwLCAweDNjMDIwMDAxLCAweDU3MTAyMSwKLTB4OGM0MjQwZWMsIDB4MjQ0MjAwMDUsIDB4M2MwMTAwMDEsIDB4MzcwODIxLAotMHhhYzIyNDBlYywgMHgzYzAyMDAwMSwgMHg1NzEwMjEsIDB4OGM0MjQwZWMsCi0weDQ0MTAyYiwgMHgxNDQwMDAwNiwgMHgwLCAweDNjMDEwMDAxLAotMHgzNzA4MjEsIDB4YWMyMDQwZWMsIDB4MTAwMDAwMDYsIDB4NjUxODI1LAotMHgzYzAyMDAwMSwgMHg1NzEwMjEsIDB4OTA0MjQwZjIsIDB4NTQ0MDAwMDEsCi0weDY1MTgyNSwgMHgxMDYwZmZiYywgMHgwLCAweDhmNDIwMDAwLAotMHgxMDQwMDAwNywgMHgwLCAweGFmODAwMDRjLCAweDhmODIwMDRjLAotMHgxMDQwZmZmZCwgMHgwLCAweDEwMDAwMDA1LCAweDAsCi0weGFmODAwMDQ4LCAweDhmODIwMDQ4LCAweDEwNDBmZmZkLCAweDAsCi0weDhmODIwMDYwLCAweDQzMTAyNSwgMHhhZjgyMDA2MCwgMHg4ZjQyMDAwMCwKLTB4MTA0MDAwMDMsIDB4MCwgMHgxMDAwZmZhNywgMHhhZjgwMDA0YywKLTB4MTAwMGZmYTUsIDB4YWY4MDAwNDgsIDB4M2UwMDAwOCwgMHgwLAotMHgwLCAweDAsIDB4MCwgMHgyN2JkZmZlMCwKLTB4YWZiZjAwMTgsIDB4OGY4NjAwNjQsIDB4MzBjMjAwMDQsIDB4MTA0MDAwMjUsCi0weDI0MDQwMDA0LCAweDhjMDIwMTE0LCAweGFmNDIwMDIwLCAweGFmODQwMDY0LAotMHg4ZjQyMDJmYywgMHgyNDQyMDAwMSwgMHhhZjQyMDJmYywgMHg4ZjQyMDJmYywKLTB4OGY4MjAwNjQsIDB4MzA0MjAwMDQsIDB4MTQ0MDAwMDUsIDB4MCwKLTB4OGMwMzAxMTQsIDB4OGY0MjAwMjAsIDB4MTQ2MmZmZjIsIDB4MCwKLTB4OGY0MjAwMDAsIDB4MTA0MDAwMDcsIDB4OGY0MzAwM2MsIDB4YWY4MDAwNGMsCi0weDhmODIwMDRjLCAweDEwNDBmZmZkLCAweDAsIDB4MTAwMDAwMDUsCi0weDAsIDB4YWY4MDAwNDgsIDB4OGY4MjAwNDgsIDB4MTA0MGZmZmQsCi0weDAsIDB4OGY4MjAwNjAsIDB4NDMxMDI1LCAweGFmODIwMDYwLAotMHg4ZjQyMDAwMCwgMHgxMDQwMDA3MywgMHgwLCAweDEwMDAwMDZmLAotMHgwLCAweDMwYzIwMDA4LCAweDEwNDAwMDIwLCAweDI0MDQwMDA4LAotMHg4YzAyMDExYywgMHhhZjQyMDA0OCwgMHhhZjg0MDA2NCwgMHg4ZjQyMDJhOCwKLTB4MjQ0MjAwMDEsIDB4YWY0MjAyYTgsIDB4OGY0MjAyYTgsIDB4OGY4MjAwNjQsCi0weDMwNDIwMDA4LCAweDE0NDAwMDA1LCAweDAsIDB4OGMwMzAxMWMsCi0weDhmNDIwMDQ4LCAweDE0NjJmZmYyLCAweDAsIDB4OGY0MjAwMDAsCi0weDEwNDAwMDA3LCAweDAsIDB4YWY4MDAwNGMsIDB4OGY4MjAwNGMsCi0weDEwNDBmZmZkLCAweDAsIDB4MTAwMDAwMDUsIDB4MCwKLTB4YWY4MDAwNDgsIDB4OGY4MjAwNDgsIDB4MTA0MGZmZmQsIDB4MCwKLTB4OGY4MjAwNjAsIDB4MTAwMGZmZDksIDB4MzQ0MjAyMDAsIDB4MzBjMjAwMjAsCi0weDEwNDAwMDIzLCAweDI0MDQwMDIwLCAweDhjMDIwMTJjLCAweGFmNDIwMDY4LAotMHhhZjg0MDA2NCwgMHg4ZjQyMDJkOCwgMHgyNDQyMDAwMSwgMHhhZjQyMDJkOCwKLTB4OGY0MjAyZDgsIDB4OGY4MjAwNjQsIDB4MzA0MjAwMjAsIDB4MTQ0MDAwMDUsCi0weDMyYzI0MDAwLCAweDhjMDMwMTJjLCAweDhmNDIwMDY4LCAweDE0NjJmZmYyLAotMHgzMmMyNDAwMCwgMHgxNDQwMDAwMiwgMHgzYzAyMDAwMSwgMHgyYzJiMDI1LAotMHg4ZjQyMDAwMCwgMHgxMDQwMDAwNywgMHgwLCAweGFmODAwMDRjLAotMHg4ZjgyMDA0YywgMHgxMDQwZmZmZCwgMHgwLCAweDEwMDAwMDA1LAotMHgwLCAweGFmODAwMDQ4LCAweDhmODIwMDQ4LCAweDEwNDBmZmZkLAotMHgwLCAweDhmODIwMDYwLCAweDEwMDBmZmI0LCAweDM0NDIwODAwLAotMHgzMGMyMDAxMCwgMHgxMDQwMDAyOSwgMHgyNDA0MDAxMCwgMHg4YzAyMDEyNCwKLTB4YWY0MjAwNTgsIDB4YWY4NDAwNjQsIDB4OGY0MjAyZDQsIDB4MjQ0MjAwMDEsCi0weGFmNDIwMmQ0LCAweDhmNDIwMmQ0LCAweDhmODIwMDY0LCAweDMwNDIwMDEwLAotMHgxNDQwMDAwNSwgMHgzMmMyMjAwMCwgMHg4YzAzMDEyNCwgMHg4ZjQyMDA1OCwKLTB4MTQ2MmZmZjIsIDB4MzJjMjIwMDAsIDB4NTA0MDAwMDEsIDB4MzZkNjgwMDAsCi0weDhmNDIwMDAwLCAweDEwNDAwMDA3LCAweDAsIDB4YWY4MDAwNGMsCi0weDhmODIwMDRjLCAweDEwNDBmZmZkLCAweDAsIDB4MTAwMDAwMDUsCi0weDAsIDB4YWY4MDAwNDgsIDB4OGY4MjAwNDgsIDB4MTA0MGZmZmQsCi0weDAsIDB4OGY4MjAwNjAsIDB4MzQ0MjAxMDAsIDB4YWY4MjAwNjAsCi0weDhmNDIwMDAwLCAweDEwNDAwMDAzLCAweDAsIDB4MTAwMDAwNmMsCi0weGFmODAwMDRjLCAweDEwMDAwMDZhLCAweGFmODAwMDQ4LCAweDMwYzIwMDAxLAotMHgxMDQwMDAwNCwgMHgyNDAyMDAwMSwgMHhhZjgyMDA2NCwgMHgxMDAwMDA2NCwKLTB4MCwgMHgzMGMyMDAwMiwgMHgxNDQwMDAwYiwgMHgzYzA1MDAwMywKLTB4M2MwNDAwMDEsIDB4MjQ4NDYyNDQsIDB4MzRhNTA1MDAsIDB4MzgyMSwKLTB4YWZhMDAwMTAsIDB4YzAwMmIzYiwgMHhhZmEwMDAxNCwgMHgyNDAyZmZjMCwKLTB4MTAwMDAwNTcsIDB4YWY4MjAwNjQsIDB4OGMwNTAyMmMsIDB4OGMwMjAxMGMsCi0weDEwYTIwMDQ4LCAweDUxMDgwLCAweDhjNDYwMzAwLCAweDI0YTIwMDAxLAotMHgzMDQ1MDAzZiwgMHgyNDAyMDAwMywgMHhhYzA1MDIyYywgMHg2MWUwMiwKLTB4MTA2MjAwMDUsIDB4MjQwMjAwMTAsIDB4MTA2MjAwMWQsIDB4MzBjMjBmZmYsCi0weDEwMDAwMDM5LCAweDAsIDB4OGY0MzAyYTgsIDB4OGY0NDAwMDAsCi0weDMwYzIwZmZmLCAweGFmNDIwMDQ4LCAweDI0NjMwMDAxLCAweGFmNDMwMmE4LAotMHgxMDgwMDAwNywgMHg4ZjQyMDJhOCwgMHhhZjgwMDA0YywgMHg4ZjgyMDA0YywKLTB4MTA0MGZmZmQsIDB4MCwgMHgxMDAwMDAwNSwgMHgwLAotMHhhZjgwMDA0OCwgMHg4ZjgyMDA0OCwgMHgxMDQwZmZmZCwgMHgwLAotMHg4ZjgyMDA2MCwgMHgzNDQyMDIwMCwgMHhhZjgyMDA2MCwgMHg4ZjQyMDAwMCwKLTB4MTA0MDAwMWYsIDB4MCwgMHgxMDAwMDAxYiwgMHgwLAotMHhhZjQyMDA1OCwgMHgzMmMyMjAwMCwgMHg1MDQwMDAwMSwgMHgzNmQ2ODAwMCwKLTB4OGY0MjAyZDQsIDB4OGY0MzAwMDAsIDB4MjQ0MjAwMDEsIDB4YWY0MjAyZDQsCi0weDEwNjAwMDA3LCAweDhmNDIwMmQ0LCAweGFmODAwMDRjLCAweDhmODIwMDRjLAotMHgxMDQwZmZmZCwgMHgwLCAweDEwMDAwMDA1LCAweDAsCi0weGFmODAwMDQ4LCAweDhmODIwMDQ4LCAweDEwNDBmZmZkLCAweDAsCi0weDhmODIwMDYwLCAweDM0NDIwMTAwLCAweGFmODIwMDYwLCAweDhmNDIwMDAwLAotMHgxMDQwMDAwMywgMHgwLCAweDEwMDAwMDA2LCAweGFmODAwMDRjLAotMHgxMDAwMDAwNCwgMHhhZjgwMDA0OCwgMHhjMDAyMTk2LCAweGMwMjAyMSwKLTB4NDAyODIxLCAweDhjMDIwMTBjLCAweDE0YTIwMDAyLCAweDI0MDIwMDAyLAotMHhhZjgyMDA2NCwgMHg4ZjgyMDA2NCwgMHgzMDQyMDAwMiwgMHgxNDQwMDAwNCwKLTB4MCwgMHg4YzAyMDEwYywgMHgxNGEyZmZhYywgMHgwLAotMHg4ZmJmMDAxOCwgMHgzZTAwMDA4LCAweDI3YmQwMDIwLCAweDNlMDAwMDgsCi0weDAsIDB4MjdiZGZmYTAsIDB4YWZiMDAwNDAsIDB4ODA4MDIxLAotMHgxMDE2MDIsIDB4MjQ0MmZmZmYsIDB4MzA0MzAwZmYsIDB4MmM2MjAwMTMsCi0weGFmYmYwMDU4LCAweGFmYmUwMDU0LCAweGFmYjUwMDUwLCAweGFmYjMwMDRjLAotMHhhZmIyMDA0OCwgMHhhZmIxMDA0NCwgMHgxMDQwMDFmMywgMHhhZmE1MDAzNCwKLTB4MzEwODAsIDB4M2MwMTAwMDEsIDB4MjIwODIxLCAweDhjMjI2Mjg4LAotMHg0MDAwMDgsIDB4MCwgMHgxMDEzMDIsIDB4MzA0NDBmZmYsCi0weDI0MDIwMDAxLCAweDEwODIwMDA1LCAweDI0MDIwMDAyLCAweDEwODIwMDBjLAotMHgyNDAyZmZmZSwgMHgxMDAwMDAyNCwgMHgzYzA1MDAwMywgMHg4ZjQzMDAwNCwKLTB4M2MwMjAwMDEsIDB4OGM0MjZmMDQsIDB4YWY0NDAyMDAsIDB4YWY0NDAyMDQsCi0weDNjMDQwMDAxLCAweDhjODQ2ZTgwLCAweDEwMDAwMDA5LCAweDM0NjMwMDAxLAotMHg4ZjQzMDAwNCwgMHhhZjQ0MDIwMCwgMHhhZjQ0MDIwNCwgMHgzYzA0MDAwMSwKLTB4OGM4NDZlODAsIDB4NjIxODI0LCAweDNjMDIwMDAxLCAweDI0NDJjYTI4LAotMHgyMTEwMCwgMHgyMTE4MiwgMHhhZjQzMDAwNCwgMHgzYzAzMDgwMCwKLTB4NDMxMDI1LCAweGFjODIwMDM4LCAweDhmODQwMDU0LCAweDQxNDQyLAotMHg0MWM4MiwgMHg0MzEwMjEsIDB4NDFjYzIsIDB4NDMxMDIzLAotMHg0MWQwMiwgMHg0MzEwMjEsIDB4NDFkNDIsIDB4NDMxMDIzLAotMHgxMDAwMDAwOSwgMHhhZjQyMDIwOCwgMHgzYzA0MDAwMSwgMHgyNDg0NjI1MCwKLTB4MzRhNTEwMDAsIDB4MjAwMzAyMSwgMHgzODIxLCAweGFmYTAwMDEwLAotMHhjMDAyYjNiLCAweGFmYTAwMDE0LCAweDhmNDIwMmEwLCAweDI0NDIwMDAxLAotMHhhZjQyMDJhMCwgMHgxMDAwMDIxZiwgMHg4ZjQyMDJhMCwgMHgyN2IwMDAyOCwKLTB4MjAwMjAyMSwgMHgyNDA1MDIxMCwgMHhjMDAyYmJmLCAweDI0MDYwMDA4LAotMHhjMDAyNTE4LCAweDIwMDIwMjEsIDB4MTAwMDAyMTYsIDB4MCwKLTB4OGZhYTAwMzQsIDB4MjdhNDAwMjgsIDB4YTE4ODAsIDB4MjU0MjAwMDEsCi0weDMwNDIwMDNmLCAweGFmYTIwMDM0LCAweDhjNjUwMzAwLCAweDhmYWEwMDM0LAotMHgyMTA4MCwgMHg4YzQzMDMwMCwgMHgyNTQyMDAwMSwgMHgzMDQyMDAzZiwKLTB4YWZhMjAwMzQsIDB4YWMwMjAyMmMsIDB4YWZhNTAwMjgsIDB4YzAwMjUxOCwKLTB4YWZhMzAwMmMsIDB4MTAwMDAyMDMsIDB4MCwgMHgyN2IwMDAyOCwKLTB4MjAwMjAyMSwgMHgyNDA1MDIxMCwgMHhjMDAyYmJmLCAweDI0MDYwMDA4LAotMHhjMDAyNjU3LCAweDIwMDIwMjEsIDB4MTAwMDAxZmEsIDB4MCwKLTB4OGZhYTAwMzQsIDB4MjdhNDAwMjgsIDB4YTE4ODAsIDB4MjU0MjAwMDEsCi0weDMwNDIwMDNmLCAweGFmYTIwMDM0LCAweDhjNjUwMzAwLCAweDhmYWEwMDM0LAotMHgyMTA4MCwgMHg4YzQzMDMwMCwgMHgyNTQyMDAwMSwgMHgzMDQyMDAzZiwKLTB4YWZhMjAwMzQsIDB4YWMwMjAyMmMsIDB4YWZhNTAwMjgsIDB4YzAwMjY1NywKLTB4YWZhMzAwMmMsIDB4MTAwMDAxZTcsIDB4MCwgMHgxMDEzMDIsCi0weDMwNDMwZmZmLCAweDI0MDIwMDAxLCAweDEwNjIwMDA1LCAweDI0MDIwMDAyLAotMHgxMDYyMDAxZSwgMHgzYzAyMDAwMiwgMHgxMDAwMDAzMywgMHgzYzA1MDAwMywKLTB4M2MwMzAwMDIsIDB4MmMzMTAyNCwgMHg1NDQwMDAzNywgMHgyYzNiMDI1LAotMHg4ZjgyMDIyOCwgMHgzYzAxMDAwMSwgMHgzNzA4MjEsIDB4YWMyMjM4ZDgsCi0weDhmODIwMjJjLCAweDNjMDEwMDAxLCAweDM3MDgyMSwgMHhhYzIyMzhkYywKLTB4OGY4MjAyMzAsIDB4M2MwMTAwMDEsIDB4MzcwODIxLCAweGFjMjIzOGUwLAotMHg4ZjgyMDIzNCwgMHgzYzAxMDAwMSwgMHgzNzA4MjEsIDB4YWMyMjM4ZTQsCi0weDI0MDJmZmZmLCAweGFmODIwMjI4LCAweGFmODIwMjJjLCAweGFmODIwMjMwLAotMHhhZjgyMDIzNCwgMHgxMDAwMDAyMCwgMHgyYzNiMDI1LCAweDJjMjEwMjQsCi0weDEwNDAwMDEyLCAweDNjMDJmZmZkLCAweDNjMDIwMDAxLCAweDU3MTAyMSwKLTB4OGM0MjM4ZDgsIDB4YWY4MjAyMjgsIDB4M2MwMjAwMDEsIDB4NTcxMDIxLAotMHg4YzQyMzhkYywgMHhhZjgyMDIyYywgMHgzYzAyMDAwMSwgMHg1NzEwMjEsCi0weDhjNDIzOGUwLCAweGFmODIwMjMwLCAweDNjMDIwMDAxLCAweDU3MTAyMSwKLTB4OGM0MjM4ZTQsIDB4YWY4MjAyMzQsIDB4M2MwMmZmZmQsIDB4MzQ0MmZmZmYsCi0weDEwMDAwMDA5LCAweDJjMmIwMjQsIDB4M2MwNDAwMDEsIDB4MjQ4NDYyNWMsCi0weDM0YTUxMTAwLCAweDIwMDMwMjEsIDB4MzgyMSwgMHhhZmEwMDAxMCwKLTB4YzAwMmIzYiwgMHhhZmEwMDAxNCwgMHg4ZjQyMDJjYywgMHgyNDQyMDAwMSwKLTB4YWY0MjAyY2MsIDB4MTAwMDAxOWYsIDB4OGY0MjAyY2MsIDB4MTAxMzAyLAotMHgzMDQ1MGZmZiwgMHgyNDAyMDAwMSwgMHgxMGEyMDAwNSwgMHgyNDAyMDAwMiwKLTB4MTBhMjAwMGQsIDB4M2MwNDA4ZmYsIDB4MTAwMDAwMTQsIDB4M2MwNTAwMDMsCi0weDNjMDIwOGZmLCAweDM0NDJmZmZmLCAweDhmODMwMjIwLCAweDNjMDQwMDA0LAotMHgyYzRiMDI1LCAweDYyMTgyNCwgMHgzNDYzMDAwOCwgMHhhZjgzMDIyMCwKLTB4MTAwMDAwMTIsIDB4YWY0NTAyOTgsIDB4MzQ4NGZmZjcsIDB4M2MwM2ZmZmIsCi0weDhmODIwMjIwLCAweDM0NjNmZmZmLCAweDJjM2IwMjQsIDB4NDQxMDI0LAotMHhhZjgyMDIyMCwgMHgxMDAwMDAwOSwgMHhhZjQ1MDI5OCwgMHgzYzA0MDAwMSwKLTB4MjQ4NDYyNjgsIDB4MzRhNTEyMDAsIDB4MjAwMzAyMSwgMHgzODIxLAotMHhhZmEwMDAxMCwgMHhjMDAyYjNiLCAweGFmYTAwMDE0LCAweDhmNDIwMmJjLAotMHgyNDQyMDAwMSwgMHhhZjQyMDJiYywgMHgxMDAwMDE3NiwgMHg4ZjQyMDJiYywKLTB4Mjc4NDAyMDgsIDB4MjQwNTAyMDAsIDB4YzAwMmJiZiwgMHgyNDA2MDAwOCwKLTB4Mjc0NDAyMjQsIDB4MjQwNTAyMDAsIDB4YzAwMmJiZiwgMHgyNDA2MDAwOCwKLTB4OGY0MjAyYzQsIDB4MjQ0MjAwMDEsIDB4YWY0MjAyYzQsIDB4MTAwMDAxNjksCi0weDhmNDIwMmM0LCAweDEwMTMwMiwgMHgzMDQzMGZmZiwgMHgyNDAyMDAwMSwKLTB4MTA2MjAwMTEsIDB4Mjg2MjAwMDIsIDB4NTA0MDAwMDUsIDB4MjQwMjAwMDIsCi0weDEwNjAwMDA3LCAweDAsIDB4MTAwMDAwMTcsIDB4MCwKLTB4MTA2MjAwMGYsIDB4MCwgMHgxMDAwMDAxMywgMHgwLAotMHg4YzA2MDI0OCwgMHgyMDIxLCAweGMwMDUxMDQsIDB4MjQwNTAwMDQsCi0weDEwMDAwMDA3LCAweDAsIDB4OGMwNjAyNDgsIDB4MjAyMSwKLTB4YzAwNTEwNCwgMHgyNDA1MDAwNCwgMHgxMDAwMDAxMCwgMHgwLAotMHg4YzA2MDI0YywgMHgyMDIxLCAweGMwMDUxMDQsIDB4MjQwNTAwMDEsCi0weDEwMDAwMDBhLCAweDAsIDB4M2MwNDAwMDEsIDB4MjQ4NDYyNzQsCi0weDNjMDUwMDAzLCAweDM0YTUxMzAwLCAweDIwMDMwMjEsIDB4MzgyMSwKLTB4YWZhMDAwMTAsIDB4YzAwMmIzYiwgMHhhZmEwMDAxNCwgMHg4ZjQyMDJjMCwKLTB4MjQ0MjAwMDEsIDB4YWY0MjAyYzAsIDB4MTAwMDAxM2EsIDB4OGY0MjAyYzAsCi0weGMwMDI0MjYsIDB4MCwgMHgxMDAwMDEzNiwgMHgwLAotMHgyNDAyMDAwMSwgMHhhMzQyMDVjNSwgMHgyNDEwMDEwMCwgMHg4ZjQ0MDFhOCwKLTB4OGY0NTAxYWMsIDB4YWZiMDAwMTAsIDB4YWZhMDAwMTQsIDB4OGY0MjAwMTQsCi0weGFmYTIwMDE4LCAweDhmNDIwMTA4LCAweDI2ZTYwMDI4LCAweDQwZjgwOSwKLTB4MjQwNzA0MDAsIDB4MTA0MGZmZjUsIDB4MCwgMHgxMDAwMDEyNSwKLTB4MCwgMHgzYzAzZmZmZiwgMHgzNDYzN2ZmZiwgMHg4ZjQyMDM2OCwKLTB4OGY0NDAzNjAsIDB4MmMzYjAyNCwgMHgxODIxLCAweGFmNDAwMDU4LAotMHhhZjQwMDA1YywgMHhhZjQwMDA2MCwgMHhhZjQwMDA2NCwgMHg0NDEwMjMsCi0weGFmNDIwMzY4LCAweDNjMDIwOTAwLCAweGFmNDAwMzYwLCAweGFmYTIwMDIwLAotMHg4ZjVlMDAxOCwgMHgyN2FhMDAyMCwgMHgyNDAyMDBmZiwgMHgxM2MyMDAwMiwKLTB4YWZhYTAwM2MsIDB4MjdjMzAwMDEsIDB4OGMwMjAyMjgsIDB4NjA5MDIxLAotMHgxNjQyMDAwZSwgMHgxZTM4YzAsIDB4OGY0MjAzM2MsIDB4MjQ0MjAwMDEsCi0weGFmNDIwMzNjLCAweDhmNDIwMzNjLCAweDhjMDIwMjI4LCAweDNjMDQwMDAxLAotMHgyNDg0NjIwYywgMHgzYzA1MDAwOSwgMHhhZmEwMDAxNCwgMHhhZmEyMDAxMCwKLTB4OGZhNjAwMjAsIDB4MTAwMDAwNmIsIDB4MzRhNTA1MDAsIDB4ZjcxMDIxLAotMHg4ZmEzMDAyMCwgMHg4ZmE0MDAyNCwgMHhhYzQzMDRjMCwgMHhhYzQ0MDRjNCwKLTB4OGY4MzAwNTQsIDB4OGY4MjAwNTQsIDB4MjQ3MDAzZTgsIDB4MjAyMTAyMywKLTB4MmM0MjAzZTksIDB4MTA0MDAwMWIsIDB4OTgyMSwgMHhlMDg4MjEsCi0weDI2MzUwNGMwLCAweDhmNDQwMTc4LCAweDhmNDUwMTdjLCAweDIyMDE4MjEsCi0weDI0MGEwMDA0LCAweGFmYWEwMDEwLCAweGFmYjIwMDE0LCAweDhmNDgwMDBjLAotMHgxMDIxLCAweDJmNTMwMjEsIDB4YWZhODAwMTgsIDB4OGY0ODAxMGMsCi0weDI0MDcwMDA4LCAweGEzMjgyMSwgMHhhMzQ4MmIsIDB4ODIyMDIxLAotMHgxMDBmODA5LCAweDg5MjAyMSwgMHg1NDQwMDAwNiwgMHgyNDEzMDAwMSwKLTB4OGY4MjAwNTQsIDB4MjAyMTAyMywgMHgyYzQyMDNlOSwgMHgxNDQwZmZlOSwKLTB4MCwgMHgzMjYyMDBmZiwgMHg1NDQwMDAxNywgMHhhZjUyMDAxOCwKLTB4OGY0MjAzNzgsIDB4MjQ0MjAwMDEsIDB4YWY0MjAzNzgsIDB4OGY0MjAzNzgsCi0weDhmODIwMTIwLCAweDhmYWEwMDNjLCAweGFmYTIwMDEwLCAweDhmODIwMTI0LAotMHgzYzA0MDAwMSwgMHgyNDg0NjIxOCwgMHgzYzA1MDAwOSwgMHhhZmEyMDAxNCwKLTB4OGQ0NjAwMDAsIDB4MTAwMDAwMzMsIDB4MzRhNTA2MDAsIDB4OGY0MjAzMDgsCi0weDI0MTMwMDAxLCAweDI0NDIwMDAxLCAweGFmNDIwMzA4LCAweDhmNDIwMzA4LAotMHgxMDAwMDAxYywgMHgzMjYyMDBmZiwgMHg4ZjgzMDA1NCwgMHg4ZjgyMDA1NCwKLTB4MjQ3MDAzZTgsIDB4MjAyMTAyMywgMHgyYzQyMDNlOSwgMHgxMDQwMDAxNCwKLTB4OTgyMSwgMHgyNDExMDAxMCwgMHg4ZjQyMDAwYywgMHg4ZjQ0MDE2MCwKLTB4OGY0NTAxNjQsIDB4OGY4NjAxMjAsIDB4YWZiMTAwMTAsIDB4YWZiMjAwMTQsCi0weGFmYTIwMDE4LCAweDhmNDIwMTBjLCAweDI0MDcwMDA4LCAweDQwZjgwOSwKLTB4MjRjNjAwMWMsIDB4MTQ0MGZmZTUsIDB4MCwgMHg4ZjgyMDA1NCwKLTB4MjAyMTAyMywgMHgyYzQyMDNlOSwgMHgxNDQwZmZlZiwgMHgwLAotMHgzMjYyMDBmZiwgMHgxNDQwMDAxMSwgMHgwLCAweDhmNDIwMzc4LAotMHgyNDQyMDAwMSwgMHhhZjQyMDM3OCwgMHg4ZjQyMDM3OCwgMHg4ZjgyMDEyMCwKLTB4OGZhYTAwM2MsIDB4YWZhMjAwMTAsIDB4OGY4MjAxMjQsIDB4M2MwNDAwMDEsCi0weDI0ODQ2MjIwLCAweDNjMDUwMDA5LCAweGFmYTIwMDE0LCAweDhkNDYwMDAwLAotMHgzNGE1MDcwMCwgMHhjMDAyYjNiLCAweDNjMDM4MjEsIDB4OGY0MjAyYjAsCi0weDI0NDIwMDAxLCAweGFmNDIwMmIwLCAweDhmNDIwMmIwLCAweDhmNDIwMmY4LAotMHgyNDQyMDAwMSwgMHhhZjQyMDJmOCwgMHgxMDAwMDA4YSwgMHg4ZjQyMDJmOCwKLTB4OGMwMjAyNWMsIDB4Mjc0NDAyMjQsIDB4YWY0MjAxZjAsIDB4OGMwMjAyNjAsCi0weDI0MDUwMjAwLCAweDI0MDYwMDA4LCAweGMwMDJiYmYsIDB4YWY0MjAxZjgsCi0weDhmODIwMjIwLCAweDMwNDIwMDA4LCAweDE0NDAwMDAyLCAweDI0MDIwMDAxLAotMHgyNDAyMDAwMiwgMHhhZjQyMDI5OCwgMHg4ZjQyMDJhYywgMHgyNDQyMDAwMSwKLTB4YWY0MjAyYWMsIDB4MTAwMDAwNzcsIDB4OGY0MjAyYWMsIDB4M2MwMjAwZmYsCi0weDM0NDJmZmZmLCAweDIwMjE4MjQsIDB4MzJjMjAxODAsIDB4MTQ0MDAwMDYsCi0weDM0MDJmZmZiLCAweDQzMTAyYiwgMHgxNDQwMDAwMywgMHgwLAotMHgxMDAwMDA2YywgMHhhZjQzMDBiYywgMHgzYzA0MDAwMSwgMHgyNDg0NjI4MCwKLTB4M2MwNTAwMDMsIDB4MzRhNTE1MDAsIDB4MjAwMzAyMSwgMHgzODIxLAotMHhhZmEwMDAxMCwgMHhjMDAyYjNiLCAweGFmYTAwMDE0LCAweDNjMDIwNzAwLAotMHgzNDQyMTAwMCwgMHgxMDFlMDIsIDB4NjIxODI1LCAweGFmYTMwMDIwLAotMHg4ZjUxMDAxOCwgMHgyNDAyMDBmZiwgMHgxMjIyMDAwMiwgMHg4MDIxLAotMHgyNjMwMDAwMSwgMHg4YzAyMDIyOCwgMHgxNjAyMDAwZSwgMHgxMTMwYzAsCi0weDhmNDIwMzNjLCAweDI0NDIwMDAxLCAweGFmNDIwMzNjLCAweDhmNDIwMzNjLAotMHg4YzAyMDIyOCwgMHgzYzA0MDAwMSwgMHgyNDg0NjFmNCwgMHgzYzA1MDAwOSwKLTB4YWZhMDAwMTQsIDB4YWZhMjAwMTAsIDB4OGZhNjAwMjAsIDB4MTAwMDAwM2YsCi0weDM0YTUwMTAwLCAweGQ3MTAyMSwgMHg4ZmEzMDAyMCwgMHg4ZmE0MDAyNCwKLTB4YWM0MzA0YzAsIDB4YWM0NDA0YzQsIDB4YzAxODIxLCAweDhmNDQwMTc4LAotMHg4ZjQ1MDE3YywgMHgxMDIxLCAweDI0MDcwMDA0LCAweGFmYTcwMDEwLAotMHhhZmIwMDAxNCwgMHg4ZjQ4MDAwYywgMHgyNGM2MDRjMCwgMHgyZTYzMDIxLAotMHhhZmE4MDAxOCwgMHg4ZjQ4MDEwYywgMHgyNDA3MDAwOCwgMHhhMzI4MjEsCi0weGEzNDgyYiwgMHg4MjIwMjEsIDB4MTAwZjgwOSwgMHg4OTIwMjEsCi0weDE0NDAwMDBiLCAweDI0MDcwMDA4LCAweDhmODIwMTIwLCAweGFmYTIwMDEwLAotMHg4ZjgyMDEyNCwgMHgzYzA0MDAwMSwgMHgyNDg0NjFmYywgMHgzYzA1MDAwOSwKLTB4YWZhMjAwMTQsIDB4OGZhNjAwMjAsIDB4MTAwMDAwMWMsIDB4MzRhNTAyMDAsCi0weDhmNDQwMTYwLCAweDhmNDUwMTY0LCAweDhmNDMwMDBjLCAweGFmNTAwMDE4LAotMHg4Zjg2MDEyMCwgMHgyNDAyMDAxMCwgMHhhZmEyMDAxMCwgMHhhZmIwMDAxNCwKLTB4YWZhMzAwMTgsIDB4OGY0MjAxMGMsIDB4NDBmODA5LCAweDI0YzYwMDFjLAotMHgxNDQwMDAxMCwgMHgwLCAweDhmNDIwMzQwLCAweDI0NDIwMDAxLAotMHhhZjQyMDM0MCwgMHg4ZjQyMDM0MCwgMHg4ZjgyMDEyMCwgMHhhZmEyMDAxMCwKLTB4OGY4MjAxMjQsIDB4M2MwNDAwMDEsIDB4MjQ4NDYyMDQsIDB4M2MwNTAwMDksCi0weGFmYTIwMDE0LCAweDhmYTYwMDIwLCAweDM0YTUwMzAwLCAweGMwMDJiM2IsCi0weDIyMDM4MjEsIDB4OGY0MjAyZTAsIDB4MjQ0MjAwMDEsIDB4YWY0MjAyZTAsCi0weDhmNDIwMmUwLCAweDhmNDIwMmYwLCAweDI0NDIwMDAxLCAweGFmNDIwMmYwLAotMHg4ZjQyMDJmMCwgMHg4ZmEyMDAzNCwgMHg4ZmJmMDA1OCwgMHg4ZmJlMDA1NCwKLTB4OGZiNTAwNTAsIDB4OGZiMzAwNGMsIDB4OGZiMjAwNDgsIDB4OGZiMTAwNDQsCi0weDhmYjAwMDQwLCAweDNlMDAwMDgsIDB4MjdiZDAwNjAsIDB4MjdiZGZmZjgsCi0weDI0MDhmZmZmLCAweDEwYTAwMDE0LCAweDQ4MjEsIDB4M2MwYWVkYjgsCi0weDM1NGE4MzIwLCAweDkwODcwMDAwLCAweDI0ODQwMDAxLCAweDMwMjEsCi0weDEwNzEwMjYsIDB4MzA0MjAwMDEsIDB4MTA0MDAwMDIsIDB4ODE4NDIsCi0weDZhMTgyNiwgMHg2MDQwMjEsIDB4MjRjNjAwMDEsIDB4MmNjMjAwMDgsCi0weDE0NDBmZmY3LCAweDczODQyLCAweDI1MjkwMDAxLCAweDEyNTEwMmIsCi0weDE0NDBmZmYwLCAweDAsIDB4MTAwMTAyMSwgMHgzZTAwMDA4LAotMHgyN2JkMDAwOCwgMHgyN2JkZmZiMCwgMHhhZmJmMDA0OCwgMHhhZmJlMDA0NCwKLTB4YWZiNTAwNDAsIDB4YWZiMzAwM2MsIDB4YWZiMjAwMzgsIDB4YWZiMTAwMzQsCi0weGFmYjAwMDMwLCAweDhmODcwMjIwLCAweGFmYTcwMDI0LCAweDhmODcwMjAwLAotMHhhZmE3MDAyYywgMHg4ZjgyMDIyMCwgMHgzYzAzMDhmZiwgMHgzNDYzZmZmZiwKLTB4NDMxMDI0LCAweDM0NDIwMDA0LCAweGFmODIwMjIwLCAweDhmODIwMjAwLAotMHgzYzAzYzBmZiwgMHgzNDYzZmZmZiwgMHg0MzEwMjQsIDB4MzQ0MjAwMDQsCi0weGFmODIwMjAwLCAweDhmNTMwMzU4LCAweDhmNTUwMzVjLCAweDhmNWUwMzYwLAotMHg4ZjQ3MDM2NCwgMHhhZmE3MDAxNCwgMHg4ZjQ3MDM2OCwgMHhhZmE3MDAxYywKLTB4OGY0MjAyZDAsIDB4Mjc0NDAxYzAsIDB4MjQ0MjAwMDEsIDB4YWY0MjAyZDAsCi0weDhmNTAwMmQwLCAweDhmNTEwMjA0LCAweDhmNTIwMjAwLCAweGMwMDJiYTgsCi0weDI0MDUwNDAwLCAweGFmNTMwMzU4LCAweGFmNTUwMzVjLCAweGFmNWUwMzYwLAotMHg4ZmE3MDAxNCwgMHhhZjQ3MDM2NCwgMHg4ZmE3MDAxYywgMHhhZjQ3MDM2OCwKLTB4YWY1MDAyZDAsIDB4YWY1MTAyMDQsIDB4YWY1MjAyMDAsIDB4OGMwMjAyNWMsCi0weDI3NDQwMjI0LCAweGFmNDIwMWYwLCAweDhjMDIwMjYwLCAweDI0MDUwMjAwLAotMHgyNDA2MDAwOCwgMHhhZjQyMDFmOCwgMHgyNDAyMDAwNiwgMHhjMDAyYmJmLAotMHhhZjQyMDFmNCwgMHgzYzAyM2I5YSwgMHgzNDQyY2EwMCwgMHhhZjQyMDFmYywKLTB4MjQwMjAzZTgsIDB4MjQwNDAwMDIsIDB4MjQwMzAwMDEsIDB4YWY0MjAyOTQsCi0weGFmNDQwMjkwLCAweGFmNDMwMjljLCAweDhmODIwMjIwLCAweDMwNDIwMDA4LAotMHgxMDQwMDAwNCwgMHgwLCAweGFmNDMwMjk4LCAweDEwMDAwMDAzLAotMHgzMDIxLCAweGFmNDQwMjk4LCAweDMwMjEsIDB4M2MwMzAwMDEsCi0weDY2MTgyMSwgMHg5MDYzNmQwMCwgMHgzNDYxMDIxLCAweDI0YzYwMDAxLAotMHhhMDQzMDIyYywgMHgyY2MyMDAwZiwgMHgxNDQwZmZmOCwgMHgzNDYxODIxLAotMHgyNGM2MDAwMSwgMHg4ZjgyMDA0MCwgMHgyNDA0MDA4MCwgMHgyNDA1MDA4MCwKLTB4MjE3MDIsIDB4MjQ0MjAwMzAsIDB4YTA2MjAyMmMsIDB4MzQ2MTAyMSwKLTB4YzAwMmJhOCwgMHhhMDQwMDIyYywgMHg4ZmE3MDAyNCwgMHgzMGUyMDAwNCwKLTB4MTQ0MDAwMDYsIDB4MCwgMHg4ZjgyMDIyMCwgMHgzYzAzMDhmZiwKLTB4MzQ2M2ZmZmIsIDB4NDMxMDI0LCAweGFmODIwMjIwLCAweDhmYTcwMDJjLAotMHgzMGUyMDAwNCwgMHgxNDQwMDAwNiwgMHgwLCAweDhmODIwMjAwLAotMHgzYzAzYzBmZiwgMHgzNDYzZmZmYiwgMHg0MzEwMjQsIDB4YWY4MjAyMDAsCi0weDhmYmYwMDQ4LCAweDhmYmUwMDQ0LCAweDhmYjUwMDQwLCAweDhmYjMwMDNjLAotMHg4ZmIyMDAzOCwgMHg4ZmIxMDAzNCwgMHg4ZmIwMDAzMCwgMHgzZTAwMDA4LAotMHgyN2JkMDA1MCwgMHgwLCAweDAsIDB4YWY0MDAxMDQsCi0weDI0MDQwMDAxLCAweDQxMGMwLCAweDJlMjE4MjEsIDB4MjQ4MjAwMDEsCi0weDNjMDEwMDAxLCAweDIzMDgyMSwgMHhhNDIyMzRkMCwgMHg0MDIwMjEsCi0weDJjODIwMDgwLCAweDE0NDBmZmY4LCAweDQxMGMwLCAweDI0MDIwMDAxLAotMHgzYzAxMDAwMSwgMHgzNzA4MjEsIDB4YTQyMDM4ZDAsIDB4YWY0MjAxMDAsCi0weGFmODAwMjI4LCAweGFmODAwMjJjLCAweGFmODAwMjMwLCAweGFmODAwMjM0LAotMHgzZTAwMDA4LCAweDAsIDB4MjdiZGZmZTgsIDB4YWZiZjAwMTQsCi0weGFmYjAwMDEwLCAweDhmNDIwMTA0LCAweDI4NDIwMDA1LCAweDEwNDAwMDI2LAotMHg4MDgwMjEsIDB4M2MwMjAwMDEsIDB4OGY0MzAxMDQsIDB4MzQ0MjMwZDAsCi0weDJlMjIwMjEsIDB4MzE4YzAsIDB4NjIxODIxLCAweDJlMzE4MjEsCi0weDgzMTAyYiwgMHgxMDQwMDAxNSwgMHgxMDIxLCAweDk2MDcwMDAwLAotMHgyNDg0MDAwNiwgMHgyNDY2MDAwNiwgMHg5NDgyZmZmYywgMHgxNDQ3MDAwOSwKLTB4MjgyMSwgMHg5NDgzZmZmZSwgMHg5NjAyMDAwMiwgMHgxNDYyMDAwNiwKLTB4YTAxMDIxLCAweDk0ODIwMDAwLCAweDk2MDMwMDA0LCAweDQzMTAyNiwKLTB4MmM0NTAwMDEsIDB4YTAxMDIxLCAweDE0NDAwMDA5LCAweDI0ODQwMDA4LAotMHg4NjEwMmIsIDB4MTQ0MGZmZjAsIDB4MTAyMSwgMHgzMDQyMDBmZiwKLTB4MTQ0MDAwMzAsIDB4MjQwMjAwMDEsIDB4MTAwMDAwMmUsIDB4MTAyMSwKLTB4MTAwMGZmZmEsIDB4MjQwMjAwMDEsIDB4MjAwMjAyMSwgMHhjMDAyNDBjLAotMHgyNDA1MDAwNiwgMHgzMDQyMDA3ZiwgMHgyMThjMCwgMHgyZTMxMDIxLAotMHgzYzAxMDAwMSwgMHgyMjA4MjEsIDB4OTQyMjMwZDAsIDB4MTA0MGZmZjIsCi0weDJlMzEwMjEsIDB4M2MwNjAwMDEsIDB4YzIzMDIxLCAweDk0YzYzMGQwLAotMHgxMGMwZmZlZCwgMHgzYzA4MDAwMSwgMHgzNTA4MzRkMiwgMHg5NjA3MDAwMCwKLTB4NjEwYzAsIDB4NTcyMDIxLCAweDg4MjAyMSwgMHg5NDgyMDAwMCwKLTB4MTQ0NzAwMDksIDB4MjgyMSwgMHg5NDgzMDAwMiwgMHg5NjAyMDAwMiwKLTB4MTQ2MjAwMDYsIDB4YTAxMDIxLCAweDk0ODIwMDA0LCAweDk2MDMwMDA0LAotMHg0MzEwMjYsIDB4MmM0NTAwMDEsIDB4YTAxMDIxLCAweDE0NDAwMDA3LAotMHg2MTBjMCwgMHgyZTIxMDIxLCAweDNjMDYwMDAxLCAweGMyMzAyMSwKLTB4OTRjNjM0ZDAsIDB4MTRjMGZmZWIsIDB4NjEwYzAsIDB4MTBjMGZmZDIsCi0weDI0MDIwMDAxLCAweDhmYmYwMDE0LCAweDhmYjAwMDEwLCAweDNlMDAwMDgsCi0weDI3YmQwMDE4LCAweDNlMDAwMDgsIDB4MCwgMHgyN2JkZmZiMCwKLTB4ODAxMDIxLCAweGFmYjAwMDMwLCAweDI0NTAwMDAyLCAweDIwMDIwMjEsCi0weDI0MDUwMDA2LCAweGFmYjEwMDM0LCAweDQwODgyMSwgMHhhZmJmMDA0OCwKLTB4YWZiZTAwNDQsIDB4YWZiNTAwNDAsIDB4YWZiMzAwM2MsIDB4YzAwMjQwYywKLTB4YWZiMjAwMzgsIDB4MzA0NzAwN2YsIDB4NzEwYzAsIDB4MmUyMTAyMSwKLTB4M2MwNTAwMDEsIDB4YTIyODIxLCAweDk0YTUzMGQwLCAweDUwYTAwMDFjLAotMHhhMDMwMjEsIDB4M2MwOTAwMDEsIDB4MzUyOTM0ZDIsIDB4OTYyODAwMDIsCi0weDUxMGMwLCAweDU3MjAyMSwgMHg4OTIwMjEsIDB4OTQ4MjAwMDAsCi0weDE0NDgwMDA5LCAweDMwMjEsIDB4OTQ4MzAwMDIsIDB4OTYwMjAwMDIsCi0weDE0NjIwMDA2LCAweGMwMTAyMSwgMHg5NDgyMDAwNCwgMHg5NjAzMDAwNCwKLTB4NDMxMDI2LCAweDJjNDYwMDAxLCAweGMwMTAyMSwgMHgxNDQwMDAwNywKLTB4NTEwYzAsIDB4MmUyMTAyMSwgMHgzYzA1MDAwMSwgMHhhMjI4MjEsCi0weDk0YTUzNGQwLCAweDE0YTBmZmViLCAweDUxMGMwLCAweGEwMzAyMSwKLTB4MTBjMDAwMTQsIDB4NjEwYzAsIDB4NTcxODIxLCAweDNjMDEwMDAxLAotMHgyMzA4MjEsIDB4OGMyMzM0ZDAsIDB4NTcxMDIxLCAweGFmYTMwMDEwLAotMHgzYzAxMDAwMSwgMHgyMjA4MjEsIDB4OGMyMjM0ZDQsIDB4M2MwNDAwMDEsCi0weDI0ODQ2Mzk0LCAweGFmYTIwMDE0LCAweDhlMjYwMDAwLCAweDhlMjcwMDA0LAotMHgzYzA1MDAwNCwgMHhjMDAyYjNiLCAweDM0YTUwNDAwLCAweDEwMDAwMDYzLAotMHgzYzAyMDgwMCwgMHg4ZjQ1MDEwMCwgMHgxMGEwMDAwNiwgMHg1MTBjMCwKLTB4MmUyMTAyMSwgMHgzYzAxMDAwMSwgMHgyMjA4MjEsIDB4OTQyMjM0ZDAsCi0weGFmNDIwMTAwLCAweGEwMzAyMSwgMHgxNGMwMDAxMSwgMHg2MjhjMCwKLTB4NzEwYzAsIDB4MmUyMTAyMSwgMHhhZmE3MDAxMCwgMHgzYzAxMDAwMSwKLTB4MjIwODIxLCAweDk0MjIzMGQwLCAweDNjMDQwMDAxLCAweDI0ODQ2M2EwLAotMHhhZmEyMDAxNCwgMHg4ZTI2MDAwMCwgMHg4ZTI3MDAwNCwgMHgzYzA1MDAwNCwKLTB4YzAwMmIzYiwgMHgzNGE1MDUwMCwgMHgxMDAwMDA0OCwgMHgzYzAyMDgwMCwKLTB4YjcxODIxLCAweDNjMDIwMDAxLCAweDk2MDQwMDAwLCAweDM0NDIzNGQyLAotMHg2MjE4MjEsIDB4YTQ2NDAwMDAsIDB4OGUwMjAwMDIsIDB4NzIwYzAsCi0weGFjNjIwMDAyLCAweDJlNDEwMjEsIDB4M2MwMzAwMDEsIDB4NjIxODIxLAotMHg5NDYzMzBkMCwgMHgyZTUxMDIxLCAweDNjMDEwMDAxLCAweDIyMDgyMSwKLTB4YTQyMzM0ZDAsIDB4MmU0MTAyMSwgMHgzYzAxMDAwMSwgMHgyMjA4MjEsCi0weGE0MjYzMGQwLCAweDhmNDIwMTA0LCAweDI0NDIwMDAxLCAweDI4NDIwMDgwLAotMHgxMDQwMDAwZiwgMHgzYzAyMDAwMiwgMHg4ZjQyMDEwNCwgMHgzYzA0MDAwMSwKLTB4MzQ4NDMwZDIsIDB4OTYwMzAwMDAsIDB4MjEwYzAsIDB4NTcxMDIxLAotMHg0NDEwMjEsIDB4YTQ0MzAwMDAsIDB4OGUwMzAwMDIsIDB4YWM0MzAwMDIsCi0weDhmNDIwMTA0LCAweDI0NDIwMDAxLCAweGFmNDIwMTA0LCAweDNjMDIwMDAyLAotMHgyYzIxMDI0LCAweDEwNDAwMDExLCAweDcyMTQyLCAweDNjMDMwMDAxLAotMHgzNDYzMzhkOCwgMHgyNDAyMDAwMywgMHg0NDEwMjMsIDB4MjEwODAsCi0weDU3MjAyMSwgMHg4MzIwMjEsIDB4NTcxMDIxLCAweDQzMTAyMSwKLTB4MzBlNTAwMWYsIDB4OGM0MzAwMDAsIDB4MjQwMjAwMDEsIDB4YTIxMDA0LAotMHg2MjE4MjUsIDB4MTAwMDAwMGMsIDB4YWM4MzAwMDAsIDB4MjQwMjAwMDMsCi0weDQ0MTAyMywgMHgyMTA4MCwgMHg1YzI4MjEsIDB4NWMxMDIxLAotMHgzMGU0MDAxZiwgMHg4YzQzMDIyOCwgMHgyNDAyMDAwMSwgMHg4MjEwMDQsCi0weDYyMTgyNSwgMHhhY2EzMDIyOCwgMHgzYzAyMDgwMCwgMHgzNDQyMTAwMCwKLTB4MTgyMSwgMHhhZmEyMDAyMCwgMHg4ZjVlMDAxOCwgMHgyN2FhMDAyMCwKLTB4MjQwMjAwZmYsIDB4MTNjMjAwMDIsIDB4YWZhYTAwMmMsIDB4MjdjMzAwMDEsCi0weDhjMDIwMjI4LCAweDYwOTAyMSwgMHgxNjQyMDAwZSwgMHgxZTM4YzAsCi0weDhmNDIwMzNjLCAweDI0NDIwMDAxLCAweGFmNDIwMzNjLCAweDhmNDIwMzNjLAotMHg4YzAyMDIyOCwgMHgzYzA0MDAwMSwgMHgyNDg0NjM1YywgMHgzYzA1MDAwOSwKLTB4YWZhMDAwMTQsIDB4YWZhMjAwMTAsIDB4OGZhNjAwMjAsIDB4MTAwMDAwNmIsCi0weDM0YTUwNTAwLCAweGY3MTAyMSwgMHg4ZmEzMDAyMCwgMHg4ZmE0MDAyNCwKLTB4YWM0MzA0YzAsIDB4YWM0NDA0YzQsIDB4OGY4MzAwNTQsIDB4OGY4MjAwNTQsCi0weDI0NzAwM2U4LCAweDIwMjEwMjMsIDB4MmM0MjAzZTksIDB4MTA0MDAwMWIsCi0weDk4MjEsIDB4ZTA4ODIxLCAweDI2MzUwNGMwLCAweDhmNDQwMTc4LAotMHg4ZjQ1MDE3YywgMHgyMjAxODIxLCAweDI0MGEwMDA0LCAweGFmYWEwMDEwLAotMHhhZmIyMDAxNCwgMHg4ZjQ4MDAwYywgMHgxMDIxLCAweDJmNTMwMjEsCi0weGFmYTgwMDE4LCAweDhmNDgwMTBjLCAweDI0MDcwMDA4LCAweGEzMjgyMSwKLTB4YTM0ODJiLCAweDgyMjAyMSwgMHgxMDBmODA5LCAweDg5MjAyMSwKLTB4NTQ0MDAwMDYsIDB4MjQxMzAwMDEsIDB4OGY4MjAwNTQsIDB4MjAyMTAyMywKLTB4MmM0MjAzZTksIDB4MTQ0MGZmZTksIDB4MCwgMHgzMjYyMDBmZiwKLTB4NTQ0MDAwMTcsIDB4YWY1MjAwMTgsIDB4OGY0MjAzNzgsIDB4MjQ0MjAwMDEsCi0weGFmNDIwMzc4LCAweDhmNDIwMzc4LCAweDhmODIwMTIwLCAweDhmYWEwMDJjLAotMHhhZmEyMDAxMCwgMHg4ZjgyMDEyNCwgMHgzYzA0MDAwMSwgMHgyNDg0NjM2OCwKLTB4M2MwNTAwMDksIDB4YWZhMjAwMTQsIDB4OGQ0NjAwMDAsIDB4MTAwMDAwMzMsCi0weDM0YTUwNjAwLCAweDhmNDIwMzA4LCAweDI0MTMwMDAxLCAweDI0NDIwMDAxLAotMHhhZjQyMDMwOCwgMHg4ZjQyMDMwOCwgMHgxMDAwMDAxYywgMHgzMjYyMDBmZiwKLTB4OGY4MzAwNTQsIDB4OGY4MjAwNTQsIDB4MjQ3MDAzZTgsIDB4MjAyMTAyMywKLTB4MmM0MjAzZTksIDB4MTA0MDAwMTQsIDB4OTgyMSwgMHgyNDExMDAxMCwKLTB4OGY0MjAwMGMsIDB4OGY0NDAxNjAsIDB4OGY0NTAxNjQsIDB4OGY4NjAxMjAsCi0weGFmYjEwMDEwLCAweGFmYjIwMDE0LCAweGFmYTIwMDE4LCAweDhmNDIwMTBjLAotMHgyNDA3MDAwOCwgMHg0MGY4MDksIDB4MjRjNjAwMWMsIDB4MTQ0MGZmZTUsCi0weDAsIDB4OGY4MjAwNTQsIDB4MjAyMTAyMywgMHgyYzQyMDNlOSwKLTB4MTQ0MGZmZWYsIDB4MCwgMHgzMjYyMDBmZiwgMHgxNDQwMDAxMSwKLTB4MCwgMHg4ZjQyMDM3OCwgMHgyNDQyMDAwMSwgMHhhZjQyMDM3OCwKLTB4OGY0MjAzNzgsIDB4OGY4MjAxMjAsIDB4OGZhYTAwMmMsIDB4YWZhMjAwMTAsCi0weDhmODIwMTI0LCAweDNjMDQwMDAxLCAweDI0ODQ2MzcwLCAweDNjMDUwMDA5LAotMHhhZmEyMDAxNCwgMHg4ZDQ2MDAwMCwgMHgzNGE1MDcwMCwgMHhjMDAyYjNiLAotMHgzYzAzODIxLCAweDhmNDIwMmI0LCAweDI0NDIwMDAxLCAweGFmNDIwMmI0LAotMHg4ZjQyMDJiNCwgMHg4ZjQyMDJmNCwgMHgyNDQyMDAwMSwgMHhhZjQyMDJmNCwKLTB4OGY0MjAyZjQsIDB4OGZiZjAwNDgsIDB4OGZiZTAwNDQsIDB4OGZiNTAwNDAsCi0weDhmYjMwMDNjLCAweDhmYjIwMDM4LCAweDhmYjEwMDM0LCAweDhmYjAwMDMwLAotMHgzZTAwMDA4LCAweDI3YmQwMDUwLCAweDI3YmRmZmEwLCAweDgwMTAyMSwKLTB4YWZiMDAwNDAsIDB4MjQ1MDAwMDIsIDB4MjAwMjAyMSwgMHgyNDA1MDAwNiwKLTB4YWZiMTAwNDQsIDB4NDA4ODIxLCAweGFmYmYwMDU4LCAweGFmYmUwMDU0LAotMHhhZmI1MDA1MCwgMHhhZmIzMDA0YywgMHhjMDAyNDBjLCAweGFmYjIwMDQ4LAotMHgzMDQ4MDA3ZiwgMHg4MTBjMCwgMHgyZTIxMDIxLCAweDNjMDYwMDAxLAotMHhjMjMwMjEsIDB4OTRjNjMwZDAsIDB4MTBjMDAwMWMsIDB4MzgyMSwKLTB4M2MwYTAwMDEsIDB4MzU0YTM0ZDIsIDB4OTYyOTAwMDIsIDB4NjEwYzAsCi0weDU3MjAyMSwgMHg4YTIwMjEsIDB4OTQ4MjAwMDAsIDB4MTQ0OTAwMDksCi0weDI4MjEsIDB4OTQ4MzAwMDIsIDB4OTYwMjAwMDIsIDB4MTQ2MjAwMDYsCi0weGEwMTAyMSwgMHg5NDgyMDAwNCwgMHg5NjAzMDAwNCwgMHg0MzEwMjYsCi0weDJjNDUwMDAxLCAweGEwMTAyMSwgMHgxNDQwMDAwOCwgMHg2MTBjMCwKLTB4YzAzODIxLCAweDJlMjEwMjEsIDB4M2MwNjAwMDEsIDB4YzIzMDIxLAotMHg5NGM2MzRkMCwgMHgxNGMwZmZlYSwgMHg2MTBjMCwgMHgxNGMwMDAxMSwKLTB4YWZhNzAwMjgsIDB4ODEwYzAsIDB4MmUyMTAyMSwgMHhhZmE4MDAxMCwKLTB4M2MwMTAwMDEsIDB4MjIwODIxLCAweDk0MjIzMGQwLCAweDNjMDQwMDAxLAotMHgyNDg0NjNhYywgMHhhZmEyMDAxNCwgMHg4ZTI2MDAwMCwgMHg4ZTI3MDAwNCwKLTB4M2MwNTAwMDQsIDB4YzAwMmIzYiwgMHgzNGE1MDkwMCwgMHgxMDAwMDA3NSwKLTB4M2MwMjA4MDAsIDB4MTBlMDAwMGMsIDB4NjEwYzAsIDB4MmUyMTAyMSwKLTB4M2MwMzAwMDEsIDB4NjIxODIxLCAweDk0NjMzNGQwLCAweDcxMGMwLAotMHgyZTIxMDIxLCAweDNjMDEwMDAxLCAweDIyMDgyMSwgMHhhNDIzMzRkMCwKLTB4MTAwMDAwMGIsIDB4M2MwNDAwMDEsIDB4MmUyMTAyMSwgMHgzYzAzMDAwMSwKLTB4NjIxODIxLCAweDk0NjMzNGQwLCAweDgxMGMwLCAweDJlMjEwMjEsCi0weDNjMDEwMDAxLCAweDIyMDgyMSwgMHhhNDIzMzBkMCwgMHgzYzA0MDAwMSwKLTB4MzQ4NDMwZDAsIDB4OGY0MzAxMDAsIDB4NjEwYzAsIDB4MmUyMTAyMSwKLTB4M2MwMTAwMDEsIDB4MjIwODIxLCAweGE0MjMzNGQwLCAweDhmNDIwMTA0LAotMHgyZTQzODIxLCAweDI4MjEsIDB4MTg0MDAwMjksIDB4YWY0NjAxMDAsCi0weDI0ZTYwMDA2LCAweDk0YzNmZmZjLCAweDk2MDIwMDAwLCAweDE0NjIwMDA5LAotMHgyMDIxLCAweDk0YzNmZmZlLCAweDk2MDIwMDAyLCAweDE0NjIwMDA2LAotMHg4MDEwMjEsIDB4OTRjMjAwMDAsIDB4OTYwMzAwMDQsIDB4NDMxMDI2LAotMHgyYzQ0MDAwMSwgMHg4MDEwMjEsIDB4NTA0MDAwMTQsIDB4MjRhNTAwMDEsCi0weDhmNDIwMTA0LCAweDI0NDJmZmZmLCAweGEyMTAyYSwgMHgxMDQwMDAwYiwKLTB4MjRlNDAwMDQsIDB4OTQ4MjAwMDYsIDB4OGM4MzAwMDgsIDB4YTQ4MmZmZmUsCi0weGFjODMwMDAwLCAweDhmNDIwMTA0LCAweDI0YTUwMDAxLCAweDI0NDJmZmZmLAotMHhhMjEwMmEsIDB4MTQ0MGZmZjcsIDB4MjQ4NDAwMDgsIDB4OGY0MjAxMDQsCi0weDI0NDJmZmZmLCAweDEwMDAwMDA2LCAweGFmNDIwMTA0LCAweDhmNDIwMTA0LAotMHgyNGM2MDAwOCwgMHhhMjEwMmEsIDB4MTQ0MGZmZGEsIDB4MjRlNzAwMDgsCi0weDgxMGMwLCAweDJlMjEwMjEsIDB4M2MwMTAwMDEsIDB4MjIwODIxLAotMHg5NDIyMzBkMCwgMHgxNDQwMDAyMywgMHgzYzAyMDgwMCwgMHgzYzAyMDAwMiwKLTB4MmMyMTAyNCwgMHgxMDQwMDAxMiwgMHg4MjE0MiwgMHgzYzAzMDAwMSwKLTB4MzQ2MzM4ZDgsIDB4MjQwMjAwMDMsIDB4NDQxMDIzLCAweDIxMDgwLAotMHg1NzIwMjEsIDB4ODMyMDIxLCAweDU3MTAyMSwgMHg0MzEwMjEsCi0weDMxMDUwMDFmLCAweDI0MDMwMDAxLCAweDhjNDIwMDAwLCAweGEzMTgwNCwKLTB4MzE4MjcsIDB4NDMxMDI0LCAweDEwMDAwMDBkLCAweGFjODIwMDAwLAotMHgyNDAyMDAwMywgMHg0NDEwMjMsIDB4MjEwODAsIDB4NWMyODIxLAotMHg1YzEwMjEsIDB4MzEwNDAwMWYsIDB4MjQwMzAwMDEsIDB4OGM0MjAyMjgsCi0weDgzMTgwNCwgMHgzMTgyNywgMHg0MzEwMjQsIDB4YWNhMjAyMjgsCi0weDNjMDIwODAwLCAweDM0NDIyMDAwLCAweDE4MjEsIDB4YWZhMjAwMjAsCi0weDhmNWUwMDE4LCAweDI3YWIwMDIwLCAweDI0MDIwMGZmLCAweDEzYzIwMDAyLAotMHhhZmFiMDAzNCwgMHgyN2MzMDAwMSwgMHg4YzAyMDIyOCwgMHg2MDkwMjEsCi0weDE2NDIwMDBlLCAweDFlMzhjMCwgMHg4ZjQyMDMzYywgMHgyNDQyMDAwMSwKLTB4YWY0MjAzM2MsIDB4OGY0MjAzM2MsIDB4OGMwMjAyMjgsIDB4M2MwNDAwMDEsCi0weDI0ODQ2MzVjLCAweDNjMDUwMDA5LCAweGFmYTAwMDE0LCAweGFmYTIwMDEwLAotMHg4ZmE2MDAyMCwgMHgxMDAwMDA2YiwgMHgzNGE1MDUwMCwgMHhmNzEwMjEsCi0weDhmYTMwMDIwLCAweDhmYTQwMDI0LCAweGFjNDMwNGMwLCAweGFjNDQwNGM0LAotMHg4ZjgzMDA1NCwgMHg4ZjgyMDA1NCwgMHgyNDcwMDNlOCwgMHgyMDIxMDIzLAotMHgyYzQyMDNlOSwgMHgxMDQwMDAxYiwgMHg5ODIxLCAweGUwODgyMSwKLTB4MjYzNTA0YzAsIDB4OGY0NDAxNzgsIDB4OGY0NTAxN2MsIDB4MjIwMTgyMSwKLTB4MjQwYjAwMDQsIDB4YWZhYjAwMTAsIDB4YWZiMjAwMTQsIDB4OGY0ODAwMGMsCi0weDEwMjEsIDB4MmY1MzAyMSwgMHhhZmE4MDAxOCwgMHg4ZjQ4MDEwYywKLTB4MjQwNzAwMDgsIDB4YTMyODIxLCAweGEzNDgyYiwgMHg4MjIwMjEsCi0weDEwMGY4MDksIDB4ODkyMDIxLCAweDU0NDAwMDA2LCAweDI0MTMwMDAxLAotMHg4ZjgyMDA1NCwgMHgyMDIxMDIzLCAweDJjNDIwM2U5LCAweDE0NDBmZmU5LAotMHgwLCAweDMyNjIwMGZmLCAweDU0NDAwMDE3LCAweGFmNTIwMDE4LAotMHg4ZjQyMDM3OCwgMHgyNDQyMDAwMSwgMHhhZjQyMDM3OCwgMHg4ZjQyMDM3OCwKLTB4OGY4MjAxMjAsIDB4OGZhYjAwMzQsIDB4YWZhMjAwMTAsIDB4OGY4MjAxMjQsCi0weDNjMDQwMDAxLCAweDI0ODQ2MzY4LCAweDNjMDUwMDA5LCAweGFmYTIwMDE0LAotMHg4ZDY2MDAwMCwgMHgxMDAwMDAzMywgMHgzNGE1MDYwMCwgMHg4ZjQyMDMwOCwKLTB4MjQxMzAwMDEsIDB4MjQ0MjAwMDEsIDB4YWY0MjAzMDgsIDB4OGY0MjAzMDgsCi0weDEwMDAwMDFjLCAweDMyNjIwMGZmLCAweDhmODMwMDU0LCAweDhmODIwMDU0LAotMHgyNDcwMDNlOCwgMHgyMDIxMDIzLCAweDJjNDIwM2U5LCAweDEwNDAwMDE0LAotMHg5ODIxLCAweDI0MTEwMDEwLCAweDhmNDIwMDBjLCAweDhmNDQwMTYwLAotMHg4ZjQ1MDE2NCwgMHg4Zjg2MDEyMCwgMHhhZmIxMDAxMCwgMHhhZmIyMDAxNCwKLTB4YWZhMjAwMTgsIDB4OGY0MjAxMGMsIDB4MjQwNzAwMDgsIDB4NDBmODA5LAotMHgyNGM2MDAxYywgMHgxNDQwZmZlNSwgMHgwLCAweDhmODIwMDU0LAotMHgyMDIxMDIzLCAweDJjNDIwM2U5LCAweDE0NDBmZmVmLCAweDAsCi0weDMyNjIwMGZmLCAweDE0NDAwMDExLCAweDAsIDB4OGY0MjAzNzgsCi0weDI0NDIwMDAxLCAweGFmNDIwMzc4LCAweDhmNDIwMzc4LCAweDhmODIwMTIwLAotMHg4ZmFiMDAzNCwgMHhhZmEyMDAxMCwgMHg4ZjgyMDEyNCwgMHgzYzA0MDAwMSwKLTB4MjQ4NDYzNzAsIDB4M2MwNTAwMDksIDB4YWZhMjAwMTQsIDB4OGQ2NjAwMDAsCi0weDM0YTUwNzAwLCAweGMwMDJiM2IsIDB4M2MwMzgyMSwgMHg4ZjQyMDJiOCwKLTB4MjQ0MjAwMDEsIDB4YWY0MjAyYjgsIDB4OGY0MjAyYjgsIDB4OGY0MjAyZjQsCi0weDI0NDIwMDAxLCAweGFmNDIwMmY0LCAweDhmNDIwMmY0LCAweDhmYmYwMDU4LAotMHg4ZmJlMDA1NCwgMHg4ZmI1MDA1MCwgMHg4ZmIzMDA0YywgMHg4ZmIyMDA0OCwKLTB4OGZiMTAwNDQsIDB4OGZiMDAwNDAsIDB4M2UwMDAwOCwgMHgyN2JkMDA2MCwKLTB4MCwgMHgwLCAweDAsIDB4MjdiZGZmZTAsCi0weDI3NjQ0MDAwLCAweGFmYmYwMDE4LCAweGMwMDJiYTgsIDB4MjQwNTEwMDAsCi0weDNjMDMwMDAxLCAweDM0NjMyY2MwLCAweDNjMDQwMDAxLCAweDM0ODQyZWM4LAotMHgyNDAyMDAyMCwgMHhhZjgyMDExYywgMHgyZTMxMDIxLCAweGFmODAwMTAwLAotMHhhZjgwMDEwNCwgMHhhZjgwMDEwOCwgMHhhZjgwMDExMCwgMHhhZjgwMDExNCwKLTB4YWY4MDAxMTgsIDB4YWY4MDAxMjAsIDB4YWY4MDAxMjQsIDB4YWY4MDAxMjgsCi0weGFmODAwMTMwLCAweGFmODAwMTM0LCAweGFmODAwMTM4LCAweGFmNDIwMGVjLAotMHgyZTMxMDIxLCAweGFmNDIwMGYwLCAweDJlNDEwMjEsIDB4YWY0MjAwZjQsCi0weDJlNDEwMjEsIDB4YWY0MjAwZjgsIDB4M2MwMjAwMDEsIDB4NTcxMDIxLAotMHg5MDQyNDBmNCwgMHgxNDQwMDAxYywgMHgzYzA1MDAwMSwgMHg4ZjgyMDExYywKLTB4M2MwNDAwMDEsIDB4MjQ4NDY0NzAsIDB4M2MwNTAwMDEsIDB4MzQ0MjAwMDEsCi0weGFmODIwMTFjLCAweGFmYTAwMDEwLCAweGFmYTAwMDE0LCAweDhmODYwMTFjLAotMHgzNGE1MDEwMCwgMHhjMDAyYjNiLCAweDM4MjEsIDB4OGMwMjAyMTgsCi0weDMwNDIwMDQwLCAweDEwNDAwMDE0LCAweDAsIDB4OGY4MjAxMWMsCi0weDNjMDQwMDAxLCAweDI0ODQ2NDdjLCAweDNjMDUwMDAxLCAweDM0NDIwMDA0LAotMHhhZjgyMDExYywgMHhhZmEwMDAxMCwgMHhhZmEwMDAxNCwgMHg4Zjg2MDExYywKLTB4MTAwMDAwMDcsIDB4MzRhNTAyMDAsIDB4M2MwNDAwMDEsIDB4MjQ4NDY0ODQsCi0weGFmYTAwMDEwLCAweGFmYTAwMDE0LCAweDhmODYwMTFjLCAweDM0YTUwMzAwLAotMHhjMDAyYjNiLCAweDM4MjEsIDB4OGZiZjAwMTgsIDB4M2UwMDAwOCwKLTB4MjdiZDAwMjAsIDB4OGZhOTAwMTAsIDB4OGY4MzAxMmMsIDB4OGZhYTAwMTQsCi0weDhmYWIwMDE4LCAweDEwNjAwMDBhLCAweDI3NjI0ZmUwLCAweDE0NjIwMDAyLAotMHgyNDY4MDAyMCwgMHgyNzY4NDgwMCwgMHg4ZjgyMDEyOCwgMHgxMTAyMDAwNCwKLTB4MCwgMHg4ZjgyMDEyNCwgMHgxNTAyMDAwNywgMHgwLAotMHg4ZjQzMDMzNCwgMHgxMDIxLCAweDI0NjMwMDAxLCAweGFmNDMwMzM0LAotMHgxMDAwMDAzOSwgMHg4ZjQzMDMzNCwgMHhhYzY0MDAwMCwgMHhhYzY1MDAwNCwKLTB4YWM2NjAwMDgsIDB4YTQ2NzAwMGUsIDB4YWM2OTAwMTgsIDB4YWM2YTAwMWMsCi0weGFjNmIwMDEwLCAweGFjNjIwMDE0LCAweGFmODgwMTIwLCAweDhmNDIwMGZjLAotMHg4ZjQ0MDBmNCwgMHgyNDQyZmZmZiwgMHhhZjQyMDBmYywgMHg4YzgyMDAwMCwKLTB4MTA0OTAwMDUsIDB4MzA0MmZmOGYsIDB4MTA0MDAwMTksIDB4MzEyMmZmOGYsCi0weDEwNDAwMDE4LCAweDNjMDIwMDAxLCAweDhjODMwMDA0LCAweDJjNjIwMDEwLAotMHgxMDQwMDAxMywgMHgzYzAyMDAwMSwgMHgyNDYzMDAwMSwgMHhhYzgzMDAwNCwKLTB4OGY0MzAwZjgsIDB4MzQ0MjMwYzgsIDB4MmUyMTAyMSwgMHg1NDYyMDAwNCwKLTB4MjQ2MjAwMDgsIDB4M2MwMjAwMDEsIDB4MzQ0MjJlYzgsIDB4MmUyMTAyMSwKLTB4MTQ0NDAwMTUsIDB4MjQwMjAwMDEsIDB4OGY4MjAxMjgsIDB4MjQ0MjAwMjAsCi0weGFmODIwMTI4LCAweDhmODIwMTI4LCAweDEwMDAwMDBmLCAweDI0MDIwMDAxLAotMHgzYzAyMDAwMSwgMHgzNDQyMzBjOCwgMHgyZTIxMDIxLCAweDU0ODIwMDA0LAotMHgyNDgyMDAwOCwgMHgzYzAyMDAwMSwgMHgzNDQyMmVjOCwgMHgyZTIxMDIxLAotMHg0MDIwMjEsIDB4MjQwMjAwMDEsIDB4YWY0NDAwZjQsIDB4YWM4OTAwMDAsCi0weGFjODIwMDA0LCAweDI0MDIwMDAxLCAweDNlMDAwMDgsIDB4MCwKLTB4M2UwMDAwOCwgMHgwLCAweDhmYTkwMDEwLCAweDhmODMwMTBjLAotMHg4ZmFhMDAxNCwgMHg4ZmFiMDAxOCwgMHgxMDYwMDAwYSwgMHgyNzYyNDdlMCwKLTB4MTQ2MjAwMDIsIDB4MjQ2ODAwMjAsIDB4Mjc2ODQwMDAsIDB4OGY4MjAxMDgsCi0weDExMDIwMDA0LCAweDAsIDB4OGY4MjAxMDQsIDB4MTUwMjAwMDcsCi0weDAsIDB4OGY0MzAzMzgsIDB4MTAyMSwgMHgyNDYzMDAwMSwKLTB4YWY0MzAzMzgsIDB4MTAwMDAwMzUsIDB4OGY0MzAzMzgsIDB4YWM2NDAwMDAsCi0weGFjNjUwMDA0LCAweGFjNjYwMDA4LCAweGE0NjcwMDBlLCAweGFjNjkwMDE4LAotMHhhYzZhMDAxYywgMHhhYzZiMDAxMCwgMHhhYzYyMDAxNCwgMHhhZjg4MDEwMCwKLTB4OGY0NDAwZWMsIDB4OGM4MjAwMDAsIDB4MzA0MjAwMDYsIDB4MTA0MDAwMTksCi0weDMxMjIwMDA2LCAweDEwNDAwMDE4LCAweDNjMDIwMDAxLCAweDhjODMwMDA0LAotMHgyYzYyMDAxMCwgMHgxMDQwMDAxMywgMHgzYzAyMDAwMSwgMHgyNDYzMDAwMSwKLTB4YWM4MzAwMDQsIDB4OGY0MzAwZjAsIDB4MzQ0MjJlYzAsIDB4MmUyMTAyMSwKLTB4NTQ2MjAwMDQsIDB4MjQ2MjAwMDgsIDB4M2MwMjAwMDEsIDB4MzQ0MjJjYzAsCi0weDJlMjEwMjEsIDB4MTQ0NDAwMTUsIDB4MjQwMjAwMDEsIDB4OGY4MjAxMDgsCi0weDI0NDIwMDIwLCAweGFmODIwMTA4LCAweDhmODIwMTA4LCAweDEwMDAwMDBmLAotMHgyNDAyMDAwMSwgMHgzYzAyMDAwMSwgMHgzNDQyMmVjMCwgMHgyZTIxMDIxLAotMHg1NDgyMDAwNCwgMHgyNDgyMDAwOCwgMHgzYzAyMDAwMSwgMHgzNDQyMmNjMCwKLTB4MmUyMTAyMSwgMHg0MDIwMjEsIDB4MjQwMjAwMDEsIDB4YWY0NDAwZWMsCi0weGFjODkwMDAwLCAweGFjODIwMDA0LCAweDI0MDIwMDAxLCAweDNlMDAwMDgsCi0weDAsIDB4M2UwMDAwOCwgMHgwLCAweDI3YmRmZmQ4LAotMHgzYzA0MDAwMSwgMHgyNDg0NjQ4YywgMHgzYzA1MDAwMSwgMHhhZmJmMDAyNCwKLTB4YWZiMjAwMjAsIDB4YWZiMTAwMWMsIDB4YWZiMDAwMTgsIDB4OGY5MDAxMDQsCi0weDhmOTEwMGIwLCAweDhmOTIwMTFjLCAweDM0YTUyNTAwLCAweDhmODIwMTAwLAotMHgyNDAzMDIxLCAweDIyMDM4MjEsIDB4YWZhMjAwMTAsIDB4YzAwMmIzYiwKLTB4YWZiMDAwMTQsIDB4OGUwMjAwMDgsIDB4YWZhMjAwMTAsIDB4OGUwMjAwMGMsCi0weDNjMDQwMDAxLCAweDI0ODQ2NDk4LCAweGFmYTIwMDE0LCAweDhlMDYwMDAwLAotMHg4ZTA3MDAwNCwgMHgzYzA1MDAwMSwgMHhjMDAyYjNiLCAweDM0YTUyNTEwLAotMHg4ZTAyMDAxOCwgMHhhZmEyMDAxMCwgMHg4ZTAyMDAxYywgMHgzYzA0MDAwMSwKLTB4MjQ4NDY0YTQsIDB4YWZhMjAwMTQsIDB4OGUwNjAwMTAsIDB4OGUwNzAwMTQsCi0weDNjMDUwMDAxLCAweGMwMDJiM2IsIDB4MzRhNTI1MjAsIDB4M2MwMjdmMDAsCi0weDIyMjEwMjQsIDB4M2MwMzA4MDAsIDB4NTQ0MzAwMTYsIDB4M2MwMzAyMDAsCi0weDhmODIwMDljLCAweDMwNDJmZmZmLCAweDE0NDAwMDEyLCAweDNjMDMwMjAwLAotMHgzYzA0MDAwMSwgMHgyNDg0NjRiMCwgMHgzYzA1MDAwMiwgMHgzNGE1ZjAzMCwKLTB4MzAyMSwgMHgzODIxLCAweDM2NDIwMDAyLCAweGFmODIwMTFjLAotMHgzNjIyMDAwMSwgMHhhZjgyMDBiMCwgMHhhZjkwMDEwNCwgMHhhZjkyMDExYywKLTB4YWZhMDAwMTAsIDB4YzAwMmIzYiwgMHhhZmEwMDAxNCwgMHgxMDAwMDAyNCwKLTB4MCwgMHgyYzMxMDI0LCAweDEwNDAwMDBkLCAweDIyMzEwMjQsCi0weDEwNDAwMDBiLCAweDM2NDIwMDAyLCAweGFmODIwMTFjLCAweDM2MjIwMDAxLAotMHhhZjgyMDBiMCwgMHhhZjkwMDEwNCwgMHhhZjkyMDExYywgMHg4ZjQyMDMzMCwKLTB4MjQ0MjAwMDEsIDB4YWY0MjAzMzAsIDB4MTAwMDAwMTUsIDB4OGY0MjAzMzAsCi0weDNjMDQwMDAxLCAweDI0ODQ2NGI4LCAweDI0MDIwMmE5LCAweGFmYTIwMDEwLAotMHhhZmEwMDAxNCwgMHg4Zjg2MDE0NCwgMHgzYzA3MDAwMSwgMHgyNGU3NjRjMCwKLTB4YzAwMmIzYiwgMHgzNDA1ZGVhZCwgMHg4ZjgyMDExYywgMHgzNDQyMDAwMiwKLTB4YWY4MjAxMWMsIDB4OGY4MjAyMjAsIDB4MzQ0MjAwMDQsIDB4YWY4MjAyMjAsCi0weDhmODIwMTQwLCAweDNjMDMwMDAxLCAweDQzMTAyNSwgMHhhZjgyMDE0MCwKLTB4OGZiZjAwMjQsIDB4OGZiMjAwMjAsIDB4OGZiMTAwMWMsIDB4OGZiMDAwMTgsCi0weDNlMDAwMDgsIDB4MjdiZDAwMjgsIDB4MjdiZGZmZDgsIDB4M2MwNDAwMDEsCi0weDI0ODQ2NGU4LCAweDNjMDUwMDAxLCAweGFmYmYwMDI0LCAweGFmYjIwMDIwLAotMHhhZmIxMDAxYywgMHhhZmIwMDAxOCwgMHg4ZjkwMDEyNCwgMHg4ZjkxMDBhMCwKLTB4OGY5MjAxMWMsIDB4MzRhNTI2MDAsIDB4OGY4MjAxMjAsIDB4MjQwMzAyMSwKLTB4MjIwMzgyMSwgMHhhZmEyMDAxMCwgMHhjMDAyYjNiLCAweGFmYjAwMDE0LAotMHg4ZTAyMDAwOCwgMHhhZmEyMDAxMCwgMHg4ZTAyMDAwYywgMHgzYzA0MDAwMSwKLTB4MjQ4NDY0ZjQsIDB4YWZhMjAwMTQsIDB4OGUwNjAwMDAsIDB4OGUwNzAwMDQsCi0weDNjMDUwMDAxLCAweGMwMDJiM2IsIDB4MzRhNTI2MTAsIDB4OGUwMjAwMTgsCi0weGFmYTIwMDEwLCAweDhlMDIwMDFjLCAweDNjMDQwMDAxLCAweDI0ODQ2NTAwLAotMHhhZmEyMDAxNCwgMHg4ZTA2MDAxMCwgMHg4ZTA3MDAxNCwgMHgzYzA1MDAwMSwKLTB4YzAwMmIzYiwgMHgzNGE1MjYyMCwgMHgzYzAyN2YwMCwgMHgyMjIxMDI0LAotMHgzYzAzMDgwMCwgMHg1NDQzMDAxNiwgMHgzYzAzMDIwMCwgMHg4ZjgyMDBhYywKLTB4MzA0MmZmZmYsIDB4MTQ0MDAwMTIsIDB4M2MwMzAyMDAsIDB4M2MwNDAwMDEsCi0weDI0ODQ2NTBjLCAweDNjMDUwMDAxLCAweDM0YTVmMDMwLCAweDMwMjEsCi0weDM4MjEsIDB4MzY0MjAwMDIsIDB4YWY4MjAxMWMsIDB4MzYyMjAwMDEsCi0weGFmODIwMGEwLCAweGFmOTAwMTI0LCAweGFmOTIwMTFjLCAweGFmYTAwMDEwLAotMHhjMDAyYjNiLCAweGFmYTAwMDE0LCAweDEwMDAwMDI0LCAweDAsCi0weDJjMzEwMjQsIDB4MTA0MDAwMGQsIDB4MjIzMTAyNCwgMHgxMDQwMDAwYiwKLTB4MzY0MjAwMDIsIDB4YWY4MjAxMWMsIDB4MzYyMjAwMDEsIDB4YWY4MjAwYTAsCi0weGFmOTAwMTI0LCAweGFmOTIwMTFjLCAweDhmNDIwMzJjLCAweDI0NDIwMDAxLAotMHhhZjQyMDMyYywgMHgxMDAwMDAxNSwgMHg4ZjQyMDMyYywgMHgzYzA0MDAwMSwKLTB4MjQ4NDY0YjgsIDB4MjQwMjAyZTIsIDB4YWZhMjAwMTAsIDB4YWZhMDAwMTQsCi0weDhmODYwMTQ0LCAweDNjMDcwMDAxLCAweDI0ZTc2NGMwLCAweGMwMDJiM2IsCi0weDM0MDVkZWFkLCAweDhmODIwMTFjLCAweDM0NDIwMDAyLCAweGFmODIwMTFjLAotMHg4ZjgyMDIyMCwgMHgzNDQyMDAwNCwgMHhhZjgyMDIyMCwgMHg4ZjgyMDE0MCwKLTB4M2MwMzAwMDEsIDB4NDMxMDI1LCAweGFmODIwMTQwLCAweDhmYmYwMDI0LAotMHg4ZmIyMDAyMCwgMHg4ZmIxMDAxYywgMHg4ZmIwMDAxOCwgMHgzZTAwMDA4LAotMHgyN2JkMDAyOCwgMHg2MDIxLCAweDUwMjEsIDB4MzAyMSwKLTB4MjgyMSwgMHg2ODIxLCAweDQ4MjEsIDB4NzgyMSwKLTB4NzAyMSwgMHg4Zjg4MDEyNCwgMHg4Zjg3MDEwNCwgMHgxNTgwMDAyZSwKLTB4OGY4YjAxMWMsIDB4MTFhMDAwMTQsIDB4MzE2MjA4MDAsIDB4OGY4MjAxMjAsCi0weDEwNDYwMDI5LCAweDAsIDB4M2MwNDAwMDEsIDB4OGM4NDZlZTQsCi0weDhjYzIwMDAwLCAweDhjYzMwMDA0LCAweGFjODIwMDAwLCAweGFjODMwMDA0LAotMHg4Y2MyMDAwOCwgMHhhYzgyMDAwOCwgMHg5NGMyMDAwZSwgMHhhNDgyMDAwZSwKLTB4OGNjMjAwMTAsIDB4MjQwYzAwMDEsIDB4YWM4MjAwMTAsIDB4OGNjMjAwMTQsCi0weDEwMDAwMDEyLCAweDI0YzYwMDIwLCAweDEwNDAwMDE3LCAweDAsCi0weDNjMDQwMDAxLCAweDhjODQ2ZWU0LCAweDhkMDIwMDAwLCAweDhkMDMwMDA0LAotMHhhYzgyMDAwMCwgMHhhYzgzMDAwNCwgMHg4ZDAyMDAwOCwgMHhhYzgyMDAwOCwKLTB4OTUwMjAwMGUsIDB4YTQ4MjAwMGUsIDB4OGQwMjAwMTAsIDB4MjUwNjAwMjAsCi0weGFjODIwMDEwLCAweDhkMDIwMDE0LCAweDI0MGMwMDAxLCAweGMwMTgyMSwKLTB4YWM4MjAwMTQsIDB4Mjc2MjRmZTAsIDB4NDMxMDJiLCAweDU0NDAwMDAxLAotMHgyNzYzNDgwMCwgMHg2MDMwMjEsIDB4MTU0MDAwMmYsIDB4MzE2MjAxMDAsCi0weDExMjAwMDE0LCAweDMxNjI4MDAwLCAweDhmODIwMTAwLCAweDEwNDUwMDJhLAotMHgzMTYyMDEwMCwgMHgzYzA0MDAwMSwgMHg4Yzg0NmVlMCwgMHg4Y2EyMDAwMCwKLTB4OGNhMzAwMDQsIDB4YWM4MjAwMDAsIDB4YWM4MzAwMDQsIDB4OGNhMjAwMDgsCi0weGFjODIwMDA4LCAweDk0YTIwMDBlLCAweGE0ODIwMDBlLCAweDhjYTIwMDEwLAotMHgyNDBhMDAwMSwgMHhhYzgyMDAxMCwgMHg4Y2EyMDAxNCwgMHgxMDAwMDAxMiwKLTB4MjRhNTAwMjAsIDB4MTA0MDAwMTgsIDB4MzE2MjAxMDAsIDB4M2MwNDAwMDEsCi0weDhjODQ2ZWUwLCAweDhjZTIwMDAwLCAweDhjZTMwMDA0LCAweGFjODIwMDAwLAotMHhhYzgzMDAwNCwgMHg4Y2UyMDAwOCwgMHhhYzgyMDAwOCwgMHg5NGUyMDAwZSwKLTB4YTQ4MjAwMGUsIDB4OGNlMjAwMTAsIDB4MjRlNTAwMjAsIDB4YWM4MjAwMTAsCi0weDhjZTIwMDE0LCAweDI0MGEwMDAxLCAweGEwMTgyMSwgMHhhYzgyMDAxNCwKLTB4Mjc2MjQ3ZTAsIDB4NDMxMDJiLCAweDU0NDAwMDAxLCAweDI3NjM0MDAwLAotMHg2MDI4MjEsIDB4MzE2MjAxMDAsIDB4NTQ0MDAwMWQsIDB4MzE2MjEwMDAsCi0weDExYTAwMDA5LCAweDMxYTIwODAwLCAweDEwNDAwMDA0LCAweDI1MDIwMDIwLAotMHg4ZjgyMDBhOCwgMHhhNWUyMDAwMCwgMHgyNTAyMDAyMCwgMHhhZjgyMDEyNCwKLTB4OGY4ODAxMjQsIDB4NjgyMSwgMHgxMTgwMDAxMSwgMHgzMTYyMTAwMCwKLTB4M2MwNDAwMDEsIDB4OGM4NDZlZTQsIDB4OGM4MjAwMDAsIDB4OGM4MzAwMDQsCi0weGFmODIwMDgwLCAweGFmODMwMDg0LCAweDhjODIwMDA4LCAweGFmODIwMGE0LAotMHg5NDgyMDAwZSwgMHhhZjgyMDBhYywgMHg4YzgyMDAxMCwgMHg2MDIxLAotMHhhZjgyMDBhMCwgMHg4YzhkMDAxMCwgMHg4YzhmMDAxNCwgMHgzMTYyMTAwMCwKLTB4MTQ0MGZmODIsIDB4MCwgMHgxMTIwMDAwZiwgMHgzMTIyMDgwMCwKLTB4MTA0MDAwMDQsIDB4M2MwMjAwMDIsIDB4OGY4MjAwYjgsIDB4YTVjMjAwMDAsCi0weDNjMDIwMDAyLCAweDEyMjEwMjQsIDB4MTA0MDAwMDQsIDB4MjRlMjAwMjAsCi0weDhmODIwMGI0LCAweGFmODIwMGQ0LCAweDI0ZTIwMDIwLCAweGFmODIwMTA0LAotMHg4Zjg3MDEwNCwgMHg0ODIxLCAweDExNDBmZjcwLCAweDAsCi0weDNjMDQwMDAxLCAweDhjODQ2ZWUwLCAweDhjODIwMDAwLCAweDhjODMwMDA0LAotMHhhZjgyMDA5MCwgMHhhZjgzMDA5NCwgMHg4YzgyMDAwOCwgMHhhZjgyMDBiNCwKLTB4OTQ4MjAwMGUsIDB4YWY4MjAwOWMsIDB4OGM4MjAwMTAsIDB4NTAyMSwKLTB4YWY4MjAwYjAsIDB4OGM4OTAwMTAsIDB4MTAwMGZmNjAsIDB4OGM4ZTAwMTQsCi0weDNlMDAwMDgsIDB4MCwgMHg2MDIxLCAweDU4MjEsCi0weDMwMjEsIDB4MjgyMSwgMHg2ODIxLCAweDUwMjEsCi0weDc4MjEsIDB4NzAyMSwgMHg4Zjg4MDEyNCwgMHg4Zjg3MDEwNCwKLTB4M2MxODAxMDAsIDB4MTU4MDAwMmUsIDB4OGY4OTAxMWMsIDB4MTFhMDAwMTQsCi0weDMxMjIwODAwLCAweDhmODIwMTIwLCAweDEwNDYwMDI5LCAweDAsCi0weDNjMDQwMDAxLCAweDhjODQ2ZWU0LCAweDhjYzIwMDAwLCAweDhjYzMwMDA0LAotMHhhYzgyMDAwMCwgMHhhYzgzMDAwNCwgMHg4Y2MyMDAwOCwgMHhhYzgyMDAwOCwKLTB4OTRjMjAwMGUsIDB4YTQ4MjAwMGUsIDB4OGNjMjAwMTAsIDB4MjQwYzAwMDEsCi0weGFjODIwMDEwLCAweDhjYzIwMDE0LCAweDEwMDAwMDEyLCAweDI0YzYwMDIwLAotMHgxMDQwMDAxNywgMHgwLCAweDNjMDQwMDAxLCAweDhjODQ2ZWU0LAotMHg4ZDAyMDAwMCwgMHg4ZDAzMDAwNCwgMHhhYzgyMDAwMCwgMHhhYzgzMDAwNCwKLTB4OGQwMjAwMDgsIDB4YWM4MjAwMDgsIDB4OTUwMjAwMGUsIDB4YTQ4MjAwMGUsCi0weDhkMDIwMDEwLCAweDI1MDYwMDIwLCAweGFjODIwMDEwLCAweDhkMDIwMDE0LAotMHgyNDBjMDAwMSwgMHhjMDE4MjEsIDB4YWM4MjAwMTQsIDB4Mjc2MjRmZTAsCi0weDQzMTAyYiwgMHg1NDQwMDAwMSwgMHgyNzYzNDgwMCwgMHg2MDMwMjEsCi0weDE1NjAwMDJmLCAweDMxMjIwMTAwLCAweDExNDAwMDE0LCAweDMxMjI4MDAwLAotMHg4ZjgyMDEwMCwgMHgxMDQ1MDAyYSwgMHgzMTIyMDEwMCwgMHgzYzA0MDAwMSwKLTB4OGM4NDZlZTAsIDB4OGNhMjAwMDAsIDB4OGNhMzAwMDQsIDB4YWM4MjAwMDAsCi0weGFjODMwMDA0LCAweDhjYTIwMDA4LCAweGFjODIwMDA4LCAweDk0YTIwMDBlLAotMHhhNDgyMDAwZSwgMHg4Y2EyMDAxMCwgMHgyNDBiMDAwMSwgMHhhYzgyMDAxMCwKLTB4OGNhMjAwMTQsIDB4MTAwMDAwMTIsIDB4MjRhNTAwMjAsIDB4MTA0MDAwMTgsCi0weDMxMjIwMTAwLCAweDNjMDQwMDAxLCAweDhjODQ2ZWUwLCAweDhjZTIwMDAwLAotMHg4Y2UzMDAwNCwgMHhhYzgyMDAwMCwgMHhhYzgzMDAwNCwgMHg4Y2UyMDAwOCwKLTB4YWM4MjAwMDgsIDB4OTRlMjAwMGUsIDB4YTQ4MjAwMGUsIDB4OGNlMjAwMTAsCi0weDI0ZTUwMDIwLCAweGFjODIwMDEwLCAweDhjZTIwMDE0LCAweDI0MGIwMDAxLAotMHhhMDE4MjEsIDB4YWM4MjAwMTQsIDB4Mjc2MjQ3ZTAsIDB4NDMxMDJiLAotMHg1NDQwMDAwMSwgMHgyNzYzNDAwMCwgMHg2MDI4MjEsIDB4MzEyMjAxMDAsCi0weDU0NDAwMDFkLCAweDMxMjIxMDAwLCAweDExYTAwMDA5LCAweDMxYTIwODAwLAotMHgxMDQwMDAwNCwgMHgyNTAyMDAyMCwgMHg4ZjgyMDBhOCwgMHhhNWUyMDAwMCwKLTB4MjUwMjAwMjAsIDB4YWY4MjAxMjQsIDB4OGY4ODAxMjQsIDB4NjgyMSwKLTB4MTE4MDAwMTEsIDB4MzEyMjEwMDAsIDB4M2MwNDAwMDEsIDB4OGM4NDZlZTQsCi0weDhjODIwMDAwLCAweDhjODMwMDA0LCAweGFmODIwMDgwLCAweGFmODMwMDg0LAotMHg4YzgyMDAwOCwgMHhhZjgyMDBhNCwgMHg5NDgyMDAwZSwgMHhhZjgyMDBhYywKLTB4OGM4MjAwMTAsIDB4NjAyMSwgMHhhZjgyMDBhMCwgMHg4YzhkMDAxMCwKLTB4OGM4ZjAwMTQsIDB4MzEyMjEwMDAsIDB4MTQ0MDAwMjIsIDB4MCwKLTB4MTE0MDAwMGYsIDB4MzE0MjA4MDAsIDB4MTA0MDAwMDQsIDB4M2MwMjAwMDIsCi0weDhmODIwMGI4LCAweGE1YzIwMDAwLCAweDNjMDIwMDAyLCAweDE0MjEwMjQsCi0weDEwNDAwMDA0LCAweDI0ZTIwMDIwLCAweDhmODIwMGI0LCAweGFmODIwMGQ0LAotMHgyNGUyMDAyMCwgMHhhZjgyMDEwNCwgMHg4Zjg3MDEwNCwgMHg1MDIxLAotMHgxMTYwMDAxMCwgMHgwLCAweDNjMDQwMDAxLCAweDhjODQ2ZWUwLAotMHg4YzgyMDAwMCwgMHg4YzgzMDAwNCwgMHhhZjgyMDA5MCwgMHhhZjgzMDA5NCwKLTB4OGM4MjAwMDgsIDB4YWY4MjAwYjQsIDB4OTQ4MjAwMGUsIDB4YWY4MjAwOWMsCi0weDhjODIwMDEwLCAweDU4MjEsIDB4YWY4MjAwYjAsIDB4OGM4YTAwMTAsCi0weDhjOGUwMDE0LCAweDhmODIwMDcwLCAweDNjMDMxMDAwLCAweDQzMTAyNCwKLTB4MTA0MGZmNWMsIDB4MCwgMHg4ZjgyMDA1NCwgMHgyNDQyMDAwNSwKLTB4YWY4MjAwNzgsIDB4OGMwNDAyMzQsIDB4MTA4MDAwMTYsIDB4MTgyMSwKLTB4M2MwMjAwMDEsIDB4NTcxMDIxLCAweDhjNDI0MGU4LCAweDI0NDIwMDA1LAotMHgzYzAxMDAwMSwgMHgzNzA4MjEsIDB4YWMyMjQwZTgsIDB4M2MwMjAwMDEsCi0weDU3MTAyMSwgMHg4YzQyNDBlOCwgMHg0NDEwMmIsIDB4MTQ0MDAwMDksCi0weDI0MDIwMDAxLCAweDNjMDMwMDgwLCAweDNjMDEwMDAxLCAweDM3MDgyMSwKLTB4YWMyMDQwZTgsIDB4M2MwMTAwMDEsIDB4MzcwODIxLCAweDEwMDAwMDBjLAotMHhhMDIyNDBmMCwgMHgzYzAyMDAwMSwgMHg1NzEwMjEsIDB4OTA0MjQwZjAsCi0weDE0NDAwMDA2LCAweDNjMDIwMDgwLCAweDNjMDIwMDAxLCAweDU3MTAyMSwKLTB4OTA0MjQwZjEsIDB4MTA0MDAwMDIsIDB4M2MwMjAwODAsIDB4NjIxODI1LAotMHg4YzA0MDIzMCwgMHgxMDgwMDAxMywgMHgwLCAweDNjMDIwMDAxLAotMHg1NzEwMjEsIDB4OGM0MjQwZWMsIDB4MjQ0MjAwMDUsIDB4M2MwMTAwMDEsCi0weDM3MDgyMSwgMHhhYzIyNDBlYywgMHgzYzAyMDAwMSwgMHg1NzEwMjEsCi0weDhjNDI0MGVjLCAweDQ0MTAyYiwgMHgxNDQwMDAwNiwgMHgwLAotMHgzYzAxMDAwMSwgMHgzNzA4MjEsIDB4YWMyMDQwZWMsIDB4MTAwMDAwMDYsCi0weDc4MTgyNSwgMHgzYzAyMDAwMSwgMHg1NzEwMjEsIDB4OTA0MjQwZjIsCi0weDU0NDAwMDAxLCAweDc4MTgyNSwgMHgxMDYwZmYxYSwgMHgwLAotMHg4ZjQyMDAwMCwgMHgxMDQwMDAwNywgMHgwLCAweGFmODAwMDRjLAotMHg4ZjgyMDA0YywgMHgxMDQwZmZmZCwgMHgwLCAweDEwMDAwMDA1LAotMHgwLCAweGFmODAwMDQ4LCAweDhmODIwMDQ4LCAweDEwNDBmZmZkLAotMHgwLCAweDhmODIwMDYwLCAweDQzMTAyNSwgMHhhZjgyMDA2MCwKLTB4OGY0MjAwMDAsIDB4MTA0MDAwMDMsIDB4MCwgMHgxMDAwZmYwNSwKLTB4YWY4MDAwNGMsIDB4MTAwMGZmMDMsIDB4YWY4MDAwNDgsIDB4M2UwMDAwOCwKLTB4MCwgMHgwLCAweDAsIDB4M2MwMjAwMDEsCi0weDhjNDI2ZDI4LCAweDI3YmRmZmU4LCAweGFmYmYwMDE0LCAweDE0NDAwMDEyLAotMHhhZmIwMDAxMCwgMHgzYzEwMDAwMSwgMHgyNjEwNmY5MCwgMHgyMDAyMDIxLAotMHhjMDAyYmE4LCAweDI0MDUyMDAwLCAweDI2MDIxZmUwLCAweDNjMDEwMDAxLAotMHhhYzIyNmVlYywgMHgzYzAxMDAwMSwgMHhhYzIyNmVlOCwgMHhhYzAyMDI1MCwKLTB4MjQwMjIwMDAsIDB4YWMxMDAyNTQsIDB4YWMwMjAyNTgsIDB4MjQwMjAwMDEsCi0weDNjMDEwMDAxLCAweGFjMjI2ZDI4LCAweDhmYmYwMDE0LCAweDhmYjAwMDEwLAotMHgzZTAwMDA4LCAweDI3YmQwMDE4LCAweDNjMDkwMDAxLCAweDhkMjk2ZWVjLAotMHg4YzgyMDAwMCwgMHg4ZmEzMDAxMCwgMHg4ZmE4MDAxNCwgMHhhZDIyMDAwMCwKLTB4OGM4MjAwMDQsIDB4YWQyNTAwMDgsIDB4YWQyMjAwMDQsIDB4OGY4MjAwNTQsCi0weGFkMjYwMDEwLCAweGFkMjcwMDE0LCAweGFkMjMwMDE4LCAweGFkMjgwMDFjLAotMHhhZDIyMDAwYywgMHgyNTI5ZmZlMCwgMHgzYzAyMDAwMSwgMHgyNDQyNmY5MCwKLTB4MTIyMTAyYiwgMHgxMDQwMDAwMywgMHgwLCAweDNjMDkwMDAxLAotMHg4ZDI5NmVlOCwgMHgzYzAyMDAwMSwgMHg4YzQyNmQxMCwgMHhhZDIyMDAwMCwKLTB4M2MwMjAwMDEsIDB4OGM0MjZkMTAsIDB4M2MwMTAwMDEsIDB4YWMyOTZlZWMsCi0weGFkMjIwMDA0LCAweGFjMDkwMjUwLCAweDNlMDAwMDgsIDB4MCwKLTB4MjdiZGZmZDAsIDB4YWZiMDAwMTAsIDB4M2MxMDAwMDEsIDB4OGUxMDZlZWMsCi0weDNjMDIwMDAxLCAweDhjNDI2ZDEwLCAweGFmYjEwMDE0LCAweDgwODgyMSwKLTB4YWZiZTAwMjQsIDB4OGZiZTAwNDAsIDB4OGZhNDAwNDgsIDB4YWZiMjAwMTgsCi0weGEwOTAyMSwgMHhhZmJmMDAyOCwgMHhhZmI1MDAyMCwgMHhhZmIzMDAxYywKLTB4YWUwMjAwMDAsIDB4M2MwMjAwMDEsIDB4OGM0MjZkMTAsIDB4YzA5ODIxLAotMHhlMGE4MjEsIDB4MTA4MDAwMDYsIDB4YWUwMjAwMDQsIDB4MjYwNTAwMDgsCi0weGMwMDJiYjMsIDB4MjQwNjAwMTgsIDB4MTAwMDAwMDUsIDB4MjYxMGZmZTAsCi0weDI2MDQwMDA4LCAweGMwMDJiYTgsIDB4MjQwNTAwMTgsIDB4MjYxMGZmZTAsCi0weDNjMDMwMDAxLCAweDI0NjM2ZjkwLCAweDIwMzEwMmIsIDB4MTA0MDAwMDMsCi0weDAsIDB4M2MxMDAwMDEsIDB4OGUxMDZlZTgsIDB4OGUyMjAwMDAsCi0weGFlMDIwMDAwLCAweDhlMjIwMDA0LCAweGFlMTIwMDA4LCAweGFlMDIwMDA0LAotMHg4ZjgyMDA1NCwgMHhhZTEzMDAxMCwgMHhhZTE1MDAxNCwgMHhhZTFlMDAxOCwKLTB4OGZhODAwNDQsIDB4YWUwODAwMWMsIDB4YWUwMjAwMGMsIDB4MjYxMGZmZTAsCi0weDIwMzEwMmIsIDB4MTA0MDAwMDMsIDB4MCwgMHgzYzEwMDAwMSwKLTB4OGUxMDZlZTgsIDB4M2MwMjAwMDEsIDB4OGM0MjZkMTAsIDB4YWUwMjAwMDAsCi0weDNjMDIwMDAxLCAweDhjNDI2ZDEwLCAweDNjMDEwMDAxLCAweGFjMzA2ZWVjLAotMHhhZTAyMDAwNCwgMHhhYzEwMDI1MCwgMHg4ZmJmMDAyOCwgMHg4ZmJlMDAyNCwKLTB4OGZiNTAwMjAsIDB4OGZiMzAwMWMsIDB4OGZiMjAwMTgsIDB4OGZiMTAwMTQsCi0weDhmYjAwMDEwLCAweDNlMDAwMDgsIDB4MjdiZDAwMzAsIDB4ODUxODIxLAotMHg4MzEwMmIsIDB4MTA0MDAwMDYsIDB4MCwgMHhhYzgwMDAwMCwKLTB4MjQ4NDAwMDQsIDB4ODMxMDJiLCAweDU0NDBmZmZkLCAweGFjODAwMDAwLAotMHgzZTAwMDA4LCAweDAsIDB4YTYxODIxLCAweGEzMTAyYiwKLTB4MTA0MDAwMDcsIDB4MCwgMHg4YzgyMDAwMCwgMHhhY2EyMDAwMCwKLTB4MjRhNTAwMDQsIDB4YTMxMDJiLCAweDE0NDBmZmZiLCAweDI0ODQwMDA0LAotMHgzZTAwMDA4LCAweDAsIDB4ODYxODIxLCAweDgzMTAyYiwKLTB4MTA0MDAwMDcsIDB4MCwgMHg4Y2EyMDAwMCwgMHhhYzgyMDAwMCwKLTB4MjQ4NDAwMDQsIDB4ODMxMDJiLCAweDE0NDBmZmZiLCAweDI0YTUwMDA0LAotMHgzZTAwMDA4LCAweDAsIDB4NjMwODAsIDB4ODYxODIxLAotMHg4MzEwMmIsIDB4MTA0MDAwMDYsIDB4MCwgMHhhYzg1MDAwMCwKLTB4MjQ4NDAwMDQsIDB4ODMxMDJiLCAweDU0NDBmZmZkLCAweGFjODUwMDAwLAotMHgzZTAwMDA4LCAweDAsIDB4MCwgMHgyNmU1MDAyOCwKLTB4YTAzMDIxLCAweDI3NDMwMWMwLCAweDhmNGQwMzU4LCAweDhmNDcwMzVjLAotMHg4ZjQ4MDM2MCwgMHg4ZjQ5MDM2NCwgMHg4ZjRhMDM2OCwgMHg4ZjRiMDIwNCwKLTB4OGY0YzAyMDAsIDB4MjQ2NDA0MDAsIDB4NjQxMDJiLCAweDEwNDAwMDA4LAotMHgzYzAyMDhmZiwgMHg4Y2MyMDAwMCwgMHhhYzYyMDAwMCwgMHgyNDYzMDAwNCwKLTB4NjQxMDJiLCAweDE0NDBmZmZiLCAweDI0YzYwMDA0LCAweDNjMDIwOGZmLAotMHgzNDQyZmZmZiwgMHgzYzAzYzBmZiwgMHhhZjRkMDM1OCwgMHhhZjQ3MDM1YywKLTB4YWY0ODAzNjAsIDB4YWY0OTAzNjQsIDB4YWY0YTAzNjgsIDB4YWY0YjAyMDQsCi0weGFmNGMwMjAwLCAweDhmODQwMjIwLCAweDM0NjNmZmZmLCAweDhmODYwMjAwLAotMHg4MjEwMjQsIDB4MzQ0MjAwMDQsIDB4YzMxODI0LCAweDM0NjMwMDA0LAotMHhhZjgyMDIyMCwgMHhhZjgzMDIwMCwgMHg4Y2EyMDIxNCwgMHhhYzAyMDA4NCwKLTB4OGNhMjAyMTgsIDB4YWMwMjAwODgsIDB4OGNhMjAyMWMsIDB4YWMwMjAwOGMsCi0weDhjYTIwMjIwLCAweGFjMDIwMDkwLCAweDhjYTIwMjI0LCAweGFjMDIwMDk0LAotMHg4Y2EyMDIyOCwgMHhhYzAyMDA5OCwgMHg4Y2EyMDIyYywgMHhhYzAyMDA5YywKLTB4OGNhMjAyMzAsIDB4YWMwMjAwYTAsIDB4OGNhMjAyMzQsIDB4YWMwMjAwYTQsCi0weDhjYTIwMjM4LCAweGFjMDIwMGE4LCAweDhjYTIwMjNjLCAweGFjMDIwMGFjLAotMHg4Y2EyMDI0MCwgMHhhYzAyMDBiMCwgMHg4Y2EyMDI0NCwgMHhhYzAyMDBiNCwKLTB4OGNhMjAyNDgsIDB4YWMwMjAwYjgsIDB4OGNhMjAyNGMsIDB4YWMwMjAwYmMsCi0weDhjYTIwMDFjLCAweGFjMDIwMDgwLCAweDhjYTIwMDE4LCAweGFjMDIwMGMwLAotMHg4Y2EyMDAyMCwgMHhhYzAyMDBjYywgMHg4Y2EyMDAyNCwgMHhhYzAyMDBkMCwKLTB4OGNhMjAxZDAsIDB4YWMwMjAwZTAsIDB4OGNhMjAxZDQsIDB4YWMwMjAwZTQsCi0weDhjYTIwMWQ4LCAweGFjMDIwMGU4LCAweDhjYTIwMWRjLCAweGFjMDIwMGVjLAotMHg4Y2EyMDFlMCwgMHhhYzAyMDBmMCwgMHg4Y2EyMDA5OCwgMHg4Y2EzMDA5YywKLTB4YWMwMzAwZmMsIDB4OGNhMjAwYTgsIDB4OGNhMzAwYWMsIDB4YWMwMzAwZjQsCi0weDhjYTIwMGEwLCAweDhjYTMwMGE0LCAweDMwODQwMDA0LCAweGFjMDMwMGY4LAotMHgxNDgwMDAwNywgMHgzMGMyMDAwNCwgMHg4ZjgyMDIyMCwgMHgzYzAzMDhmZiwKLTB4MzQ2M2ZmZmIsIDB4NDMxMDI0LCAweGFmODIwMjIwLCAweDMwYzIwMDA0LAotMHgxNDQwMDAwNiwgMHgwLCAweDhmODIwMjAwLCAweDNjMDNjMGZmLAotMHgzNDYzZmZmYiwgMHg0MzEwMjQsIDB4YWY4MjAyMDAsIDB4OGY0MjAyZGMsCi0weGEzNDAwNWM1LCAweDI0NDIwMDAxLCAweGFmNDIwMmRjLCAweDhmNDIwMmRjLAotMHgzZTAwMDA4LCAweDAsIDB4MjdiZGZmZDgsIDB4YWZiZjAwMjQsCi0weGFmYjAwMDIwLCAweDhmNDMwMDI0LCAweDhmNDIwMDIwLCAweDEwNjIwMDM4LAotMHgwLCAweDhmNDMwMDIwLCAweDhmNDIwMDI0LCAweDYyMjAyMywKLTB4NDgxMDAwMywgMHgwLCAweDhmNDIwMDQwLCAweDgyMjAyMSwKLTB4OGY0MzAwMzAsIDB4OGY0MjAwMjQsIDB4NDMxMDJiLCAweDE0NDAwMDA1LAotMHgwLCAweDhmNDMwMDQwLCAweDhmNDIwMDI0LCAweDEwMDAwMDA1LAotMHg2MjEwMjMsIDB4OGY0MjAwMzAsIDB4OGY0MzAwMjQsIDB4NDMxMDIzLAotMHgyNDQyZmZmZiwgMHg0MDYwMjEsIDB4OGMxMDJhLCAweDU0NDAwMDAxLAotMHg4MDYwMjEsIDB4OGY0YTAwMjQsIDB4OGY0OTAwNDAsIDB4OGY0ODAwMjQsCi0weDhmNDQwMTgwLCAweDhmNDUwMTg0LCAweDhmNDYwMDI0LCAweDhmNGIwMDFjLAotMHgyNDA3MDAwMSwgMHhhZmE3MDAxMCwgMHg4NDEwMCwgMHgxMDAxODIxLAotMHgxNGM1MDIxLCAweDI1MjlmZmZmLCAweDE0OTgwMjQsIDB4YWZiMDAwMTQsCi0weDhmNDcwMDE0LCAweDEwMjEsIDB4NjMxMDAsIDB4YWZhNzAwMTgsCi0weGEzMjgyMSwgMHhhMzM4MmIsIDB4ODIyMDIxLCAweDg3MjAyMSwKLTB4OGY0MjAxMDgsIDB4MTY2MzAyMSwgMHg0MGY4MDksIDB4YzM5MDAsCi0weDU0NDAwMDAxLCAweGFmNTAwMDI0LCAweDhmNDMwMDI0LCAweDhmNDIwMDIwLAotMHgxNDYyMDAxOCwgMHgwLCAweDhmNDIwMDAwLCAweDEwNDAwMDA3LAotMHgwLCAweGFmODAwMDRjLCAweDhmODIwMDRjLCAweDEwNDBmZmZkLAotMHgwLCAweDEwMDAwMDA1LCAweDAsIDB4YWY4MDAwNDgsCi0weDhmODIwMDQ4LCAweDEwNDBmZmZkLCAweDAsIDB4OGY4MjAwNjAsCi0weDI0MDNmZmVmLCAweDQzMTAyNCwgMHhhZjgyMDA2MCwgMHg4ZjQyMDAwMCwKLTB4MTA0MDAwMDMsIDB4MCwgMHgxMDAwMDAwMiwgMHhhZjgwMDA0YywKLTB4YWY4MDAwNDgsIDB4OGZiZjAwMjQsIDB4OGZiMDAwMjAsIDB4M2UwMDAwOCwKLTB4MjdiZDAwMjgsIDB4M2UwMDAwOCwgMHgwLCAweDI3YmRmZmMwLAotMHgzMmMyMDAyMCwgMHhhZmJmMDAzOCwgMHhhZmIzMDAzNCwgMHhhZmIyMDAzMCwKLTB4YWZiMTAwMmMsIDB4MTA0MDAwMDQsIDB4YWZiMDAwMjgsIDB4OGY1MzAwMjgsCi0weDEwMDAwMDAyLCAweDAsIDB4OGY1MzAwMjAsIDB4OGY0MjAwMzAsCi0weDEwNTMwMGViLCAweDIxMTAwLCAweDhmNDMwMDFjLCAweDYyODAyMSwKLTB4OGUwNDAwMDAsIDB4OGUwNTAwMDQsIDB4OTYxMjAwMDgsIDB4OGY0MjAwOTAsCi0weDk2MTEwMDBhLCAweDMyNDZmZmZmLCAweDQ2MTAyYSwgMHgxMDQwMDAxNywKLTB4MCwgMHg4ZjgyMDBkOCwgMHg4ZjQzMDA5OCwgMHg0MzEwMjMsCi0weDI0NDJkY2JlLCAweGFmNDIwMDkwLCAweDhmNDIwMDkwLCAweDI4NDJkY2JmLAotMHgxMDQwMDAwNSwgMHgwLCAweDhmNDIwMDkwLCAweDhmNDMwMTQ0LAotMHg0MzEwMjEsIDB4YWY0MjAwOTAsIDB4OGY0MjAwOTAsIDB4NDYxMDJhLAotMHgxMDQwMDAwNiwgMHgwLCAweDhmNDIwMzQ4LCAweDI0NDIwMDAxLAotMHhhZjQyMDM0OCwgMHgxMDAwMDBlMSwgMHg4ZjQyMDM0OCwgMHg4ZjgyMDBmYywKLTB4MTQ0MDAwMDYsIDB4MCwgMHg4ZjQyMDM0NCwgMHgyNDQyMDAwMSwKLTB4YWY0MjAzNDQsIDB4MTAwMDAwZDksIDB4OGY0MjAzNDQsIDB4OTM0MjA1YzIsCi0weDEwNDAwMDBiLCAweDMyYzIwMDA4LCAweDEwNDAwMDA4LCAweDMyMjIwMjAwLAotMHgxMDQwMDAwNiwgMHgzYzAzNDAwMCwgMHg5NjAyMDAwZSwgMHhhZjQzMDBhYywKLTB4MjE0MDAsIDB4MTAwMDAwMDIsIDB4YWY0MjAwYjAsIDB4YWY0MDAwYWMsCi0weDMyMjIwMDA0LCAweDEwNDAwMDdmLCAweDMyMjIwODAwLCAweDEwNDAwMDAzLAotMHgzMjQ3ZmZmZiwgMHgxMDAwMDAwMiwgMHgyNDAyMDAyMCwgMHgyNDAyMDAwNCwKLTB4YWZhMjAwMTAsIDB4OGY0MjAwMzAsIDB4YWZhMjAwMTQsIDB4OGY0MjAwMTAsCi0weDNjMDMwMDAyLCAweDQzMTAyNSwgMHhhZmEyMDAxOCwgMHg4ZjQ2MDA5OCwKLTB4OGY0MjAxMDgsIDB4NDBmODA5LCAweDAsIDB4MTA0MDAwYjcsCi0weDAsIDB4OGY0MjAwOWMsIDB4OGY0MzAwOTQsIDB4MjQyMTAyMSwKLTB4YWY0MjAwOWMsIDB4YWUwMzAwMGMsIDB4OGY0MjAwYWMsIDB4MTA0MDAwMDgsCi0weDNjMDM0MDAwLCAweDhmNDIwMDk0LCAweDQzMTAyNSwgMHhhZmEyMDAyMCwKLTB4OGY0MjAwOWMsIDB4OGY0MzAwYjAsIDB4MTAwMDAwMDQsIDB4NDMxMDI1LAotMHg4ZjQyMDA5NCwgMHhhZmEyMDAyMCwgMHg4ZjQyMDA5YywgMHhhZmEyMDAyNCwKLTB4OGY4MjAwZmMsIDB4OGZhMzAwMjAsIDB4OGZhNDAwMjQsIDB4YWM0MzAwMDAsCi0weGFjNDQwMDA0LCAweDI0NDIwMDA4LCAweGFmODIwMGYwLCAweDhmNDIwMDljLAotMHg4ZjQ0MDI3MCwgMHg4ZjQ1MDI3NCwgMHg0MDE4MjEsIDB4MTAyMSwKLTB4YTMyODIxLCAweGEzMzAyYiwgMHg4MjIwMjEsIDB4ODYyMDIxLAotMHgzMjIzMDA2MCwgMHgyNDAyMDA0MCwgMHhhZjQ0MDI3MCwgMHhhZjQ1MDI3NCwKLTB4MTA2MjAwMTcsIDB4MmM2MjAwNDEsIDB4MTA0MDAwMDUsIDB4MjQwMjAwMjAsCi0weDEwNjIwMDA4LCAweDI0MDIwMDAxLCAweDEwMDAwMDI2LCAweDAsCi0weDI0MDIwMDYwLCAweDEwNjIwMDE5LCAweDI0MDIwMDAxLCAweDEwMDAwMDIxLAotMHgwLCAweDhmNDIwMjc4LCAweDhmNDMwMjdjLCAweDI0NjMwMDAxLAotMHgyYzY0MDAwMSwgMHg0NDEwMjEsIDB4YWY0MjAyNzgsIDB4YWY0MzAyN2MsCi0weDhmNDIwMjc4LCAweDhmNDMwMjdjLCAweDEwMDAwMDE2LCAweDI0MDIwMDAxLAotMHg4ZjQyMDI4MCwgMHg4ZjQzMDI4NCwgMHgyNDYzMDAwMSwgMHgyYzY0MDAwMSwKLTB4NDQxMDIxLCAweGFmNDIwMjgwLCAweGFmNDMwMjg0LCAweDhmNDIwMjgwLAotMHg4ZjQzMDI4NCwgMHgxMDAwMDAwYiwgMHgyNDAyMDAwMSwgMHg4ZjQyMDI4OCwKLTB4OGY0MzAyOGMsIDB4MjQ2MzAwMDEsIDB4MmM2NDAwMDEsIDB4NDQxMDIxLAotMHhhZjQyMDI4OCwgMHhhZjQzMDI4YywgMHg4ZjQyMDI4OCwgMHg4ZjQzMDI4YywKLTB4MjQwMjAwMDEsIDB4YTM0MjA1YzIsIDB4OGY0MjAwOTgsIDB4MzI0NGZmZmYsCi0weDI0MDZmZmY4LCAweDhmNDUwMTNjLCAweDQ0MTAyMSwgMHgyNDQyMDAwNywKLTB4NDYxMDI0LCAweDI0ODQwMDA3LCAweGFmNDIwMDk0LCAweDhmNDIwMDkwLAotMHg4ZjQzMDA5NCwgMHg4NjIwMjQsIDB4NDQxMDIzLCAweDY1MTgyYiwKLTB4MTQ2MDAwMDUsIDB4YWY0MjAwOTAsIDB4OGY0MjAwOTQsIDB4OGY0MzAxNDQsCi0weDQzMTAyMywgMHhhZjQyMDA5NCwgMHg4ZjQyMDA5NCwgMHgxMDAwMDAyMywKLTB4YWY0MDAwOWMsIDB4MzI0N2ZmZmYsIDB4NTBlMDAwMjIsIDB4MzJjMjAwMjAsCi0weDE0NDAwMDAyLCAweDI0MDIwMDEwLCAweDI0MDIwMDAyLCAweGFmYTIwMDEwLAotMHg4ZjQyMDAzMCwgMHhhZmEyMDAxNCwgMHg4ZjQyMDAxMCwgMHhhZmEyMDAxOCwKLTB4OGY0NjAwOTgsIDB4OGY0MjAxMDgsIDB4NDBmODA5LCAweDAsCi0weDEwNDAwMDNhLCAweDMyNDVmZmZmLCAweDhmNDIwMDk4LCAweDhmNDMwMDkwLAotMHg4ZjQ2MDEzYywgMHg0NTEwMjEsIDB4YWY0MjAwOTgsIDB4OGY0MjAwOWMsCi0weDhmNDQwMDk4LCAweGEzNDAwNWMyLCAweDY1MTgyMywgMHhhZjQzMDA5MCwKLTB4NDUxMDIxLCAweDg2MjAyYiwgMHgxNDgwMDAwNSwgMHhhZjQyMDA5YywKLTB4OGY0MjAwOTgsIDB4OGY0MzAxNDQsIDB4NDMxMDIzLCAweGFmNDIwMDk4LAotMHgzMmMyMDAyMCwgMHgxMDQwMDAwNSwgMHgwLCAweDhmNDIwMzU4LAotMHgyNDQyZmZmZiwgMHhhZjQyMDM1OCwgMHg4ZjQyMDM1OCwgMHg4ZjQyMDAzMCwKLTB4OGY0MzAwNDAsIDB4MjQ0MjAwMDEsIDB4MjQ2M2ZmZmYsIDB4NDMxMDI0LAotMHhhZjQyMDAzMCwgMHg4ZjQyMDAzMCwgMHgxNDUzMDAxOCwgMHgwLAotMHg4ZjQyMDAwMCwgMHgxMDQwMDAwNywgMHgwLCAweGFmODAwMDRjLAotMHg4ZjgyMDA0YywgMHgxMDQwZmZmZCwgMHgwLCAweDEwMDAwMDA1LAotMHgwLCAweGFmODAwMDQ4LCAweDhmODIwMDQ4LCAweDEwNDBmZmZkLAotMHgwLCAweDhmODIwMDYwLCAweDI0MDNmZmY3LCAweDQzMTAyNCwKLTB4YWY4MjAwNjAsIDB4OGY0MjAwMDAsIDB4MTA0MDAwMDMsIDB4MCwKLTB4MTAwMDAwMDIsIDB4YWY4MDAwNGMsIDB4YWY4MDAwNDgsIDB4OGZiZjAwMzgsCi0weDhmYjMwMDM0LCAweDhmYjIwMDMwLCAweDhmYjEwMDJjLCAweDhmYjAwMDI4LAotMHgzZTAwMDA4LCAweDI3YmQwMDQwLCAweDNlMDAwMDgsIDB4MCwKLTB4MjdiZGZmZDAsIDB4MzJjMjAwMjAsIDB4YWZiZjAwMmMsIDB4YWZiMjAwMjgsCi0weGFmYjEwMDI0LCAweDEwNDAwMDA0LCAweGFmYjAwMDIwLCAweDhmNTIwMDI4LAotMHgxMDAwMDAwMiwgMHgwLCAweDhmNTIwMDIwLCAweDhmNDIwMDMwLAotMHgxMDUyMDBiNSwgMHgyMTEwMCwgMHg4ZjQzMDAxYywgMHg2MjgwMjEsCi0weDhlMDQwMDAwLCAweDhlMDUwMDA0LCAweDk2MTEwMDA4LCAweDhmNDIwMDkwLAotMHg5NjA3MDAwYSwgMHgzMjI2ZmZmZiwgMHg0NjEwMmEsIDB4MTA0MDAwMTcsCi0weDAsIDB4OGY4MjAwZDgsIDB4OGY0MzAwOTgsIDB4NDMxMDIzLAotMHgyNDQyZGM0NiwgMHhhZjQyMDA5MCwgMHg4ZjQyMDA5MCwgMHgyODQyZGM0NywKLTB4MTA0MDAwMDUsIDB4MCwgMHg4ZjQyMDA5MCwgMHg4ZjQzMDE0NCwKLTB4NDMxMDIxLCAweGFmNDIwMDkwLCAweDhmNDIwMDkwLCAweDQ2MTAyYSwKLTB4MTA0MDAwMDYsIDB4MCwgMHg4ZjQyMDM0OCwgMHgyNDQyMDAwMSwKLTB4YWY0MjAzNDgsIDB4MTAwMDAwYWIsIDB4OGY0MjAzNDgsIDB4OGY4NjAwZmMsCi0weDEwYzAwMDBjLCAweDAsIDB4OGY4MjAwZjQsIDB4MjQwM2ZmZjgsCi0weDQzMTAyNCwgMHg0NjEwMjMsIDB4MjE4YzMsIDB4NTg2MDAwMDEsCi0weDI0NjMwMTAwLCAweDhmNDIwMDhjLCAweDQzMTAyYiwgMHgxNDQwMDAwNiwKLTB4NzEyYzIsIDB4OGY0MjAzNDQsIDB4MjQ0MjAwMDEsIDB4YWY0MjAzNDQsCi0weDEwMDAwMDk4LCAweDhmNDIwMzQ0LCAweDkzNDMwNWMyLCAweDEwNjAwMDBmLAotMHgzMDQ2MDAwMSwgMHg4ZjQyMDAxMCwgMHgzNDQ4MDQwMCwgMHgzMmMyMDAwOCwKLTB4MTA0MDAwMDgsIDB4MzBlMjAyMDAsIDB4MTA0MDAwMDYsIDB4M2MwMzQwMDAsCi0weDk2MDIwMDBlLCAweGFmNDMwMGFjLCAweDIxNDAwLCAweDEwMDAwMDA0LAotMHhhZjQyMDBiMCwgMHgxMDAwMDAwMiwgMHhhZjQwMDBhYywgMHg4ZjQ4MDAxMCwKLTB4MzBlMjAwMDQsIDB4MTA0MDAwNDUsIDB4MzIyN2ZmZmYsIDB4OGY0OTAwYWMsCi0weDExMjAwMDA1LCAweDMwYzIwMGZmLCAweDE0NDAwMDA2LCAweDI0MDIwMDQwLAotMHgxMDAwMDAwNCwgMHgyNDAyMDAwOCwgMHgxNDQwMDAwMiwgMHgyNDAyMDAyMCwKLTB4MjQwMjAwMDQsIDB4YWZhMjAwMTAsIDB4OGY0MzAwMzAsIDB4MTEyMDAwMDQsCi0weGFmYTMwMDE0LCAweDhmNDIwMGIwLCAweDYyMTAyNSwgMHhhZmEyMDAxNCwKLTB4M2MwMjAwMDIsIDB4MTAyMTAyNSwgMHhhZmEyMDAxOCwgMHg4ZjQ2MDA5OCwKLTB4OGY0MjAxMDgsIDB4NDBmODA5LCAweDAsIDB4MTA0MDAwNjksCi0weDMyMjRmZmZmLCAweDhmNDIwMDhjLCAweDhmNDMwMDk0LCAweDI0NDIwMDAxLAotMHhhZjQyMDA4YywgMHgyNDAyMDAwMSwgMHhhZTAzMDAwYywgMHhhMzQyMDVjMiwKLTB4OGY0MjAwOTgsIDB4MjQwNmZmZjgsIDB4OGY0NTAxM2MsIDB4NDQxMDIxLAotMHgyNDQyMDAwNywgMHg0NjEwMjQsIDB4MjQ4NDAwMDcsIDB4YWY0MjAwOTQsCi0weDhmNDIwMDkwLCAweDhmNDMwMDk0LCAweDg2MjAyNCwgMHg0NDEwMjMsCi0weDY1MTgyYiwgMHgxNDYwMDAwNSwgMHhhZjQyMDA5MCwgMHg4ZjQyMDA5NCwKLTB4OGY0MzAxNDQsIDB4NDMxMDIzLCAweGFmNDIwMDk0LCAweDhmNDMwMDk0LAotMHg4ZjQyMDE0MCwgMHg0MzEwMmIsIDB4MTA0MDAwMDksIDB4MCwKLTB4OGY0MzAxM2MsIDB4OGY0NDAwOTQsIDB4OGY0MjAwOTAsIDB4OGY0NTAxMzgsCi0weDY0MTgyMywgMHg0MzEwMjMsIDB4YWY0MjAwOTAsIDB4YWY0NTAwOTQsCi0weDhmNDIwMDk0LCAweDEwMDAwMDFmLCAweGFmNDIwMDk4LCAweDEwZTAwMDFkLAotMHgzMGMyMDBmZiwgMHgxNDQwMDAwMiwgMHgyNDAyMDAxMCwgMHgyNDAyMDAwMiwKLTB4YWZhMjAwMTAsIDB4OGY0MjAwMzAsIDB4YWZhODAwMTgsIDB4YWZhMjAwMTQsCi0weDhmNDYwMDk4LCAweDhmNDIwMTA4LCAweDQwZjgwOSwgMHgwLAotMHgxMDQwMDAzMCwgMHgzMjI1ZmZmZiwgMHg4ZjQyMDA5OCwgMHg4ZjQ0MDEzYywKLTB4NDUxMDIxLCAweGFmNDIwMDk4LCAweDhmNDIwMDkwLCAweDhmNDMwMDk4LAotMHhhMzQwMDVjMiwgMHg0NTEwMjMsIDB4NjQxODJiLCAweDE0NjAwMDA1LAotMHhhZjQyMDA5MCwgMHg4ZjQyMDA5OCwgMHg4ZjQzMDE0NCwgMHg0MzEwMjMsCi0weGFmNDIwMDk4LCAweDhmNDIwMDMwLCAweDhmNDMwMDQwLCAweDI0NDIwMDAxLAotMHgyNDYzZmZmZiwgMHg0MzEwMjQsIDB4YWY0MjAwMzAsIDB4OGY0MjAwMzAsCi0weDE0NTIwMDE4LCAweDAsIDB4OGY0MjAwMDAsIDB4MTA0MDAwMDcsCi0weDAsIDB4YWY4MDAwNGMsIDB4OGY4MjAwNGMsIDB4MTA0MGZmZmQsCi0weDAsIDB4MTAwMDAwMDUsIDB4MCwgMHhhZjgwMDA0OCwKLTB4OGY4MjAwNDgsIDB4MTA0MGZmZmQsIDB4MCwgMHg4ZjgyMDA2MCwKLTB4MjQwM2ZmZjcsIDB4NDMxMDI0LCAweGFmODIwMDYwLCAweDhmNDIwMDAwLAotMHgxMDQwMDAwMywgMHgwLCAweDEwMDAwMDAyLCAweGFmODAwMDRjLAotMHhhZjgwMDA0OCwgMHg4ZmJmMDAyYywgMHg4ZmIyMDAyOCwgMHg4ZmIxMDAyNCwKLTB4OGZiMDAwMjAsIDB4M2UwMDAwOCwgMHgyN2JkMDAzMCwgMHgzZTAwMDA4LAotMHgwLCAweDI3YmRmZmQ4LCAweDNjMDIwMDAxLCAweDM0NDIyZWMwLAotMHhhZmJmMDAyMCwgMHg4ZjQzMDBmMCwgMHg4Zjg0MDEwOCwgMHgyZTIxMDIxLAotMHg1NDYyMDAwNCwgMHgyNDYyMDAwOCwgMHgzYzAyMDAwMSwgMHgzNDQyMmNjMCwKLTB4MmUyMTAyMSwgMHg0MDE4MjEsIDB4YWY0MzAwZjAsIDB4YWM2MDAwMDAsCi0weDhmNDIwMGVjLCAweDhjNjYwMDA0LCAweDE0NjIwMDA0LCAweDNjMDIwMDAxLAotMHgyNDgyMDAyMCwgMHgxMDAwMDAwZiwgMHhhZjgyMDEwOCwgMHg4ZjQzMDBmMCwKLTB4MzQ0MjJlYzAsIDB4MmUyMTAyMSwgMHg1NDYyMDAwNCwgMHgyNDYyMDAwOCwKLTB4M2MwMjAwMDEsIDB4MzQ0MjJjYzAsIDB4MmUyMTAyMSwgMHg0MDE4MjEsCi0weDhjNjIwMDA0LCAweDIxMTQwLCAweDgyMTAyMSwgMHhhZjgyMDEwOCwKLTB4YWM2MDAwMDAsIDB4OGM4NTAwMTgsIDB4MzBhMjAwMzYsIDB4MTA0MDAwNmMsCi0weDMwYTIwMDAxLCAweDhjODIwMDFjLCAweDhmNDMwMDQwLCAweDhmNDQwMDM0LAotMHgyNDQyMDAwMSwgMHgyNDYzZmZmZiwgMHg0MzEwMjQsIDB4ODYyMDIxLAotMHhhZjQyMDAyYywgMHgzMGEyMDAzMCwgMHgxNDQwMDAwNiwgMHhhZjQ0MDAzNCwKLTB4OGY0MjAwMzQsIDB4OGMwMzAyM2MsIDB4NDMxMDJiLCAweDE0NDAwMGI0LAotMHgwLCAweDMyYzIwMDEwLCAweDEwNDAwMDI4LCAweDI0MDcwMDA4LAotMHg4ZjQ0MDE3MCwgMHg4ZjQ1MDE3NCwgMHg4ZjQzMDAyYywgMHg4ZjQ4MDAwYywKLTB4OGY4NjAxMjAsIDB4MjQwMjAwODAsIDB4YWZhMjAwMTAsIDB4YWZhMzAwMTQsCi0weGFmYTgwMDE4LCAweDhmNDIwMTBjLCAweDQwZjgwOSwgMHgyNGM2MDAxYywKLTB4MTQ0MDAwMTEsIDB4MjQwMjAwMDEsIDB4M2MwMTAwMDEsIDB4MzcwODIxLAotMHhhMDIyNDBmMSwgMHg4ZjgyMDEyNCwgMHhhZmEyMDAxMCwgMHg4ZjgyMDEyOCwKLTB4M2MwNDAwMDEsIDB4MjQ4NDY3YzQsIDB4YWZhMjAwMTQsIDB4OGY0NjAwMmMsCi0weDhmODcwMTIwLCAweDNjMDUwMDA5LCAweGMwMDJiM2IsIDB4MzRhNTExMDAsCi0weDEwMDAwMDM2LCAweDAsIDB4OGY0MjAzMDAsIDB4OGY0MzAwMmMsCi0weDI0NDIwMDAxLCAweGFmNDIwMzAwLCAweDhmNDIwMzAwLCAweDI0MDIwMDAxLAotMHhhMzQyMDVjMSwgMHgxMDAwMDAyNiwgMHhhZjQzMDAzOCwgMHg4ZjQ0MDE3MCwKLTB4OGY0NTAxNzQsIDB4OGY0MzAwMmMsIDB4OGY0ODAwMGMsIDB4OGY4NjAxMjAsCi0weDI0MDIwMDIwLCAweGFmYTIwMDEwLCAweGFmYTMwMDE0LCAweGFmYTgwMDE4LAotMHg4ZjQyMDEwYywgMHg0MGY4MDksIDB4MjRjNjAwMWMsIDB4MTQ0MDAwMTEsCi0weDI0MDIwMDAxLCAweDNjMDEwMDAxLCAweDM3MDgyMSwgMHhhMDIyNDBmMCwKLTB4OGY4MjAxMjQsIDB4YWZhMjAwMTAsIDB4OGY4MjAxMjgsIDB4M2MwNDAwMDEsCi0weDI0ODQ2N2I4LCAweGFmYTIwMDE0LCAweDhmNDYwMDJjLCAweDhmODcwMTIwLAotMHgzYzA1MDAwOSwgMHhjMDAyYjNiLCAweDM0YTUwOTAwLCAweDEwMDAwMDBmLAotMHgwLCAweDhmNDIwMzAwLCAweDI0NDIwMDAxLCAweGFmNDIwMzAwLAotMHg4ZjQyMDMwMCwgMHg4ZjQyMDAyYywgMHhhMzQwMDVjMSwgMHhhZjQyMDAzOCwKLTB4M2MwMTAwMDEsIDB4MzcwODIxLCAweGEwMjA0MGYxLCAweDNjMDEwMDAxLAotMHgzNzA4MjEsIDB4YTAyMDQwZjAsIDB4YWY0MDAwMzQsIDB4OGY0MjAzMTQsCi0weDI0NDIwMDAxLCAweGFmNDIwMzE0LCAweDEwMDAwMDU5LCAweDhmNDIwMzE0LAotMHgxMDQwMDAyMiwgMHgzMGEyNzAwMCwgMHg4Yzg1MDAxYywgMHg4ZjQyMDAyOCwKLTB4YTIyMDIzLCAweDQ4MTAwMDMsIDB4MCwgMHg4ZjQyMDA0MCwKLTB4ODIyMDIxLCAweDhmNDIwMzU4LCAweDhmNDMwMDAwLCAweGFmNDUwMDI4LAotMHg0NDEwMjEsIDB4MTA2MDAwMDcsIDB4YWY0MjAzNTgsIDB4YWY4MDAwNGMsCi0weDhmODIwMDRjLCAweDEwNDBmZmZkLCAweDAsIDB4MTAwMDAwMDUsCi0weDAsIDB4YWY4MDAwNDgsIDB4OGY4MjAwNDgsIDB4MTA0MGZmZmQsCi0weDAsIDB4OGY4MjAwNjAsIDB4MzQ0MjAwMDgsIDB4YWY4MjAwNjAsCi0weDhmNDIwMDAwLCAweDEwNDAwMDAzLCAweDAsIDB4MTAwMDAwMzgsCi0weGFmODAwMDRjLCAweDEwMDAwMDM2LCAweGFmODAwMDQ4LCAweDEwNDAwMDJmLAotMHgzMGEyMTAwMCwgMHgxMDQwMDAwYywgMHgzMGEyNDAwMCwgMHg4YzgzMDAxYywKLTB4OGY0MjAwNTAsIDB4NjIyMDIzLCAweDQ4MjAwMDEsIDB4MjQ4NDAyMDAsCi0weDhmNDIwMzVjLCAweDQ0MTAyMSwgMHhhZjQyMDM1YywgMHg4ZjQyMDM2OCwKLTB4MTAwMDAwMWEsIDB4YWY0MzAwNTAsIDB4MTA0MDAwMGMsIDB4MzJjMjgwMDAsCi0weDhjODMwMDFjLCAweDhmNDIwMDcwLCAweDYyMjAyMywgMHg0ODIwMDAxLAotMHgyNDg0MDQwMCwgMHg4ZjQyMDM2NCwgMHg0NDEwMjEsIDB4YWY0MjAzNjQsCi0weDhmNDIwMzY4LCAweDEwMDAwMDBkLCAweGFmNDMwMDcwLCAweDEwNDAwMDBlLAotMHgzYzAyMDgwMCwgMHg4YzgzMDAxYywgMHg4ZjQyMDA2MCwgMHg2MjIwMjMsCi0weDQ4MjAwMDEsIDB4MjQ4NDAxMDAsIDB4OGY0MjAzNjAsIDB4NDQxMDIxLAotMHhhZjQyMDM2MCwgMHg4ZjQyMDM2OCwgMHhhZjQzMDA2MCwgMHg0NDEwMjEsCi0weGFmNDIwMzY4LCAweDNjMDIwODAwLCAweDJjMjEwMjQsIDB4NTA0MDAwMDgsCi0weDM2OTQwMDQwLCAweDEwMDAwMDA2LCAweDAsIDB4MzBhMjAxMDAsCi0weDEwNDAwMDAzLCAweDAsIDB4YzAwMmJkOCwgMHgwLAotMHg4ZmJmMDAyMCwgMHgzZTAwMDA4LCAweDI3YmQwMDI4LCAweDNlMDAwMDgsCi0weDAsIDB4MjdiZGZmYTgsIDB4YWZiZjAwNTAsIDB4YWZiZTAwNGMsCi0weGFmYjUwMDQ4LCAweGFmYjMwMDQ0LCAweGFmYjIwMDQwLCAweGFmYjEwMDNjLAotMHhhZmIwMDAzOCwgMHg4ZjkxMDEwOCwgMHgyNjIyMDAyMCwgMHhhZjgyMDEwOCwKLTB4OGUzMjAwMTgsIDB4YTgyMSwgMHgzMjQyMDAyNCwgMHgxMDQwMDFiYSwKLTB4ZjAyMSwgMHg4ZTI2MDAxYywgMHg4ZjQzMDAxYywgMHg2MTEwMCwKLTB4NjIxODIxLCAweDhjNzAwMDBjLCAweDk2MDQwMDBjLCAweDk2MmQwMDE2LAotMHg5NDczMDAwYSwgMHgyYzgzMDVkZCwgMHgzODgyODg3MCwgMHgyYzQyMDAwMSwKLTB4NjIxODI1LCAweDEwNjAwMDE1LCAweDI4MjEsIDB4MzJjMjAwNDAsCi0weDEwNDAwMDE1LCAweDI0MDIwODAwLCAweDk2MDMwMDE0LCAweDE0NjIwMDEyLAotMHgzNDAyYWFhYSwgMHg5NjAzMDAwZSwgMHgxNDYyMDAwNywgMHgyMDIxLAotMHg5NjAzMDAxMCwgMHgyNDAyMDMwMCwgMHgxNDYyMDAwNCwgMHg4MDEwMjEsCi0weDk2MDIwMDEyLCAweDJjNDQwMDAxLCAweDgwMTAyMSwgMHg1NDQwMDAwNiwKLTB4MjQwNTAwMTYsIDB4MTAwMDAwMDQsIDB4MCwgMHgyNDAyMDgwMCwKLTB4NTA4MjAwMDEsIDB4MjQwNTAwMGUsIDB4OTM0MjA1YzMsIDB4MTQ0MDAwMDgsCi0weDU4MjEsIDB4MjQwYjAwMDEsIDB4MzI2MjAxODAsIDB4YWY0NTAwYTgsCi0weGFmNTAwMGEwLCAweDEwNDAwMDAyLCAweGFmNDYwMGE0LCAweGEzNGIwNWMzLAotMHgxMGEwMDA4NSwgMHgyMDU0MDIxLCAweDkxMDIwMDAwLCAweDM4MjEsCi0weDMwNDIwMDBmLCAweDI1MDgwLCAweDMyYzIwMDAyLCAweDEwNDAwMDEyLAotMHgxMGExODIxLCAweDMyNjIwMDAyLCAweDEwNDAwMDEwLCAweDMyYzIwMDAxLAotMHgxMDAyMDIxLCAweDk0ODIwMDAwLCAweDI0ODQwMDAyLCAweGUyMzgyMSwKLTB4ODMxMDJiLCAweDE0NDBmZmZiLCAweDMwZTJmZmZmLCAweDcxYzAyLAotMHg2MjM4MjEsIDB4NzFjMDIsIDB4MzBlMmZmZmYsIDB4NjIzODIxLAotMHg3MTAyNywgMHhhNTAyMDAwYSwgMHgzMmMyMDAwMSwgMHgxMDQwMDA2YSwKLTB4MzI2MjAwMDEsIDB4MTA0MDAwNjgsIDB4MCwgMHg4ZjQyMDBhOCwKLTB4MTA0MDAwNjUsIDB4MCwgMHg4ZjQyMDBhMCwgMHg4ZjQzMDBhOCwKLTB4NDMxMDIxLCAweDkwNGMwMDA5LCAweDMxODkwMGZmLCAweDM5MjMwMDA2LAotMHgzMTgyYiwgMHgzOTIyMDAxMSwgMHgyMTAyYiwgMHg2MjE4MjQsCi0weDEwNjAwMDBjLCAweDNjMDUwMDA2LCAweDhmNDIwMGE0LCAweDNjMDQwMDAxLAotMHgyNDg0NjdkNCwgMHhhZmEyMDAxMCwgMHg4ZjQyMDBhMCwgMHgzNGE1NDYwMCwKLTB4MTIwMzgyMSwgMHhjMDAyYjNiLCAweGFmYTIwMDE0LCAweDEwMDAwMDRlLAotMHgwLCAweDMyYzIwMDA0LCAweDE0NDAwMDEzLCAweDI4MjEsCi0weDMxNjIwMGZmLCAweDE0NDAwMDA0LCAweDAsIDB4OTUwMjAwMDIsCi0weDEwMDAwMDBkLCAweDRhMjgyMywgMHg5NTA1MDAwYywgMHg5NTAyMDAwZSwKLTB4OTUwMzAwMTAsIDB4YTIyODIxLCAweGEzMjgyMSwgMHg5NTAzMDAxMiwKLTB4OTEwNDAwMDksIDB4OTUwMjAwMDIsIDB4YTMyODIxLCAweGE0MjgyMSwKLTB4NGExMDIzLCAweGEyMjgyMSwgMHgyMDAyMDIxLCAweDk0ODIwMDAwLAotMHgyNDg0MDAwMiwgMHhlMjM4MjEsIDB4ODgxMDJiLCAweDE0NDBmZmZiLAotMHg3MWMwMiwgMHgzMGUyZmZmZiwgMHg2MjM4MjEsIDB4NzFjMDIsCi0weDMwZTJmZmZmLCAweDYyMzgyMSwgMHgxYTUyODIxLCAweDUxYzAyLAotMHgzMGEyZmZmZiwgMHg2MjI4MjEsIDB4NTFjMDIsIDB4MzBhMmZmZmYsCi0weDYyMjgyMSwgMHhhNzI4MjMsIDB4NTE0MDIsIDB4YTIyODIxLAotMHgzMGE1ZmZmZiwgMHg1MGEwMDAwMSwgMHgzNDA1ZmZmZiwgMHgzMTYyMDBmZiwKLTB4MTQ0MDAwMDgsIDB4MzE4MzAwZmYsIDB4OGY0MzAwYTAsIDB4OGY0MjAwYTgsCi0weDYyNDAyMSwgMHg5MTAyMDAwMCwgMHgzMDQyMDAwZiwgMHgyNTA4MCwKLTB4MzE4MzAwZmYsIDB4MjQwMjAwMDYsIDB4MTQ2MjAwMDMsIDB4MTBhMTAyMSwKLTB4MTAwMDAwMDIsIDB4MjQ0NDAwMTAsIDB4MjQ0NDAwMDYsIDB4MzE2MjAwZmYsCi0weDE0NDAwMDA2LCAweDAsIDB4OTQ4MjAwMDAsIDB4YTIyODIxLAotMHg1MWMwMiwgMHgzMGEyZmZmZiwgMHg2MjI4MjEsIDB4OTM0MjA1YzMsCi0weDEwNDAwMDAzLCAweDMyNjIwMTAwLCAweDUwNDAwMDAzLCAweGE0ODUwMDAwLAotMHg1MjgyNywgMHhhNDg1MDAwMCwgMHg5NjIyMDAwZSwgMHg4ZjQzMDA5YywKLTB4NjIxODIxLCAweDMyYTIwMGZmLCAweDEwNDAwMDA3LCAweGFmNDMwMDljLAotMHgzYzAyNDAwMCwgMHgyMDIxMDI1LCAweGFmYTIwMDIwLCAweDhmNDIwMDljLAotMHgxMDAwMDAwMywgMHg1ZTEwMjUsIDB4YWZiMDAwMjAsIDB4OGY0MjAwOWMsCi0weGFmYTIwMDI0LCAweDMyNjIwMDgwLCAweDEwNDAwMDEwLCAweDMyNjIwMTAwLAotMHg4ZjQyMDBiNCwgMHgyNDQzMDAwMSwgMHgyMTBjMCwgMHg1NzEwMjEsCi0weGFmNDMwMGI0LCAweDhmYTMwMDIwLCAweDhmYTQwMDI0LCAweDNjMDEwMDAxLAotMHgyMjA4MjEsIDB4YWMyMzM4ZTgsIDB4M2MwMTAwMDEsIDB4MjIwODIxLAotMHhhYzI0MzhlYywgMHgxMDAwMDBhNSwgMHgzMmMyMDAyMCwgMHgxMDQwMDA2NCwKLTB4MCwgMHg4ZjQyMDBiNCwgMHgyNDQzMDAwMSwgMHgyMTBjMCwKLTB4NTcxMDIxLCAweGFmNDMwMGI0LCAweDhmYTMwMDIwLCAweDhmYTQwMDI0LAotMHgzYzAxMDAwMSwgMHgyMjA4MjEsIDB4YWMyMzM4ZTgsIDB4M2MwMTAwMDEsCi0weDIyMDgyMSwgMHhhYzI0MzhlYywgMHg4ZjQyMDBiNCwgMHgxMDQwMDA1MSwKLTB4MzgyMSwgMHgzYzA5MDAwMSwgMHgzNTI5MzhlOCwgMHgzYzA4MDAxZiwKLTB4MzUwOGZmZmYsIDB4MjQwYmZmZmYsIDB4MzQwYWZmZmYsIDB4NzEwYzAsCi0weDU3MTAyMSwgMHg0OTEwMjEsIDB4OGM0MzAwMDAsIDB4OGM0NDAwMDQsCi0weGFmYTMwMDI4LCAweGFmYTQwMDJjLCAweDhmODIwMGZjLCAweDhmYTMwMDI4LAotMHg4ZmE0MDAyYywgMHhhYzQzMDAwMCwgMHhhYzQ0MDAwNCwgMHgyNDQyMDAwOCwKLTB4YWY4MjAwZjAsIDB4OGY0MjAwOGMsIDB4MjQ0MmZmZmYsIDB4YWY0MjAwOGMsCi0weDk3YTIwMDJlLCAweDhmNDQwMjcwLCAweDhmNDUwMjc0LCAweDQwMTgyMSwKLTB4MTAyMSwgMHhhMzI4MjEsIDB4YTMzMDJiLCAweDgyMjAyMSwKLTB4ODYyMDIxLCAweGFmNDQwMjcwLCAweGFmNDUwMjc0LCAweDhmYTIwMDI4LAotMHg0ODEwMjQsIDB4OTA0MzAwMDAsIDB4MzA2MzAwMDEsIDB4MTQ2MDAwMGIsCi0weDQwMjAyMSwgMHg4ZjQyMDI3OCwgMHg4ZjQzMDI3YywgMHgyNDYzMDAwMSwKLTB4MmM2NDAwMDEsIDB4NDQxMDIxLCAweGFmNDIwMjc4LCAweGFmNDMwMjdjLAotMHg4ZjQyMDI3OCwgMHgxMDAwMDAxYSwgMHg4ZjQzMDI3YywgMHg4YzgyMDAwMCwKLTB4MTQ0YjAwMGUsIDB4MCwgMHg5NDgyMDAwNCwgMHgxNDRhMDAwYiwKLTB4MCwgMHg4ZjQyMDI4OCwgMHg4ZjQzMDI4YywgMHgyNDYzMDAwMSwKLTB4MmM2NDAwMDEsIDB4NDQxMDIxLCAweGFmNDIwMjg4LCAweGFmNDMwMjhjLAotMHg4ZjQyMDI4OCwgMHgxMDAwMDAwYSwgMHg4ZjQzMDI4YywgMHg4ZjQyMDI4MCwKLTB4OGY0MzAyODQsIDB4MjQ2MzAwMDEsIDB4MmM2NDAwMDEsIDB4NDQxMDIxLAotMHhhZjQyMDI4MCwgMHhhZjQzMDI4NCwgMHg4ZjQyMDI4MCwgMHg4ZjQzMDI4NCwKLTB4OGY0MjAwYjQsIDB4MjRlNzAwMDEsIDB4ZTIxMDJiLCAweDE0NDBmZmI4LAotMHg3MTBjMCwgMHhhMzQwMDVjMywgMHgxMDAwMDAzZiwgMHhhZjQwMDBiNCwKLTB4OGY4MjAwZmMsIDB4OGZhMzAwMjAsIDB4OGZhNDAwMjQsIDB4YWM0MzAwMDAsCi0weGFjNDQwMDA0LCAweDI0NDIwMDA4LCAweGFmODIwMGYwLCAweDhmNDIwMDljLAotMHg4ZjQ2MDA4YywgMHg4ZjQ0MDI3MCwgMHg4ZjQ1MDI3NCwgMHg0MDE4MjEsCi0weDEwMjEsIDB4MjRjNmZmZmYsIDB4YWY0NjAwOGMsIDB4YTMyODIxLAotMHhhMzMwMmIsIDB4ODIyMDIxLCAweDg2MjAyMSwgMHhhZjQ0MDI3MCwKLTB4YWY0NTAyNzQsIDB4OTIwMjAwMDAsIDB4MzA0MjAwMDEsIDB4MTQ0MDAwMGMsCi0weDI0MDJmZmZmLCAweDhmNDIwMjc4LCAweDhmNDMwMjdjLCAweDI0NjMwMDAxLAotMHgyYzY0MDAwMSwgMHg0NDEwMjEsIDB4YWY0MjAyNzgsIDB4YWY0MzAyN2MsCi0weDhmNDIwMjc4LCAweDhmNDMwMjdjLCAweDEwMDAwMDFjLCAweDMyYzIwMDIwLAotMHg4ZTAzMDAwMCwgMHgxNDYyMDAwZiwgMHgzNDAyZmZmZiwgMHg5NjAzMDAwNCwKLTB4MTQ2MjAwMGMsIDB4MCwgMHg4ZjQyMDI4OCwgMHg4ZjQzMDI4YywKLTB4MjQ2MzAwMDEsIDB4MmM2NDAwMDEsIDB4NDQxMDIxLCAweGFmNDIwMjg4LAotMHhhZjQzMDI4YywgMHg4ZjQyMDI4OCwgMHg4ZjQzMDI4YywgMHgxMDAwMDAwYiwKLTB4MzJjMjAwMjAsIDB4OGY0MjAyODAsIDB4OGY0MzAyODQsIDB4MjQ2MzAwMDEsCi0weDJjNjQwMDAxLCAweDQ0MTAyMSwgMHhhZjQyMDI4MCwgMHhhZjQzMDI4NCwKLTB4OGY0MjAyODAsIDB4OGY0MzAyODQsIDB4MzJjMjAwMjAsIDB4MTA0MDAwMDUsCi0weGFmNDAwMDljLCAweDhmNDIwMzU4LCAweDI0NDJmZmZmLCAweGFmNDIwMzU4LAotMHg4ZjQyMDM1OCwgMHg4ZTIyMDAxYywgMHg4ZjQzMDA0MCwgMHgyNDQyMDAwMSwKLTB4MjQ2M2ZmZmYsIDB4NDMxMDI0LCAweGFmNDIwMDJjLCAweDMyNDIwMDYwLAotMHgxNDQwMDAwOCwgMHgzMmMyMDAxMCwgMHg4ZjQyMDAzNCwgMHgyNDQyMDAwMSwKLTB4YWY0MjAwMzQsIDB4OGMwMzAyM2MsIDB4NDMxMDJiLCAweDE0NDAwMTAyLAotMHgzMmMyMDAxMCwgMHgxMDQwMDAxOCwgMHgyNDA3MDAwOCwgMHg4ZjQ0MDE3MCwKLTB4OGY0NTAxNzQsIDB4OGY0MzAwMmMsIDB4OGY0ODAwMGMsIDB4OGY4NjAxMjAsCi0weDI0MDIwMDgwLCAweGFmYTIwMDEwLCAweGFmYTMwMDE0LCAweGFmYTgwMDE4LAotMHg4ZjQyMDEwYywgMHg0MGY4MDksIDB4MjRjNjAwMWMsIDB4MTA0MDAwNDcsCi0weDI0MDIwMDAxLCAweDhmNDIwMzAwLCAweDhmNDMwMDJjLCAweDI0NDIwMDAxLAotMHhhZjQyMDMwMCwgMHg4ZjQyMDMwMCwgMHgyNDAyMDAwMSwgMHhhMzQyMDVjMSwKLTB4MTAwMDAwN2MsIDB4YWY0MzAwMzgsIDB4OGY0NDAxNzAsIDB4OGY0NTAxNzQsCi0weDhmNDMwMDJjLCAweDhmNDgwMDBjLCAweDhmODYwMTIwLCAweDI0MDIwMDIwLAotMHhhZmEyMDAxMCwgMHhhZmEzMDAxNCwgMHhhZmE4MDAxOCwgMHg4ZjQyMDEwYywKLTB4NDBmODA5LCAweDI0YzYwMDFjLCAweDEwNDAwMDU3LCAweDI0MDIwMDAxLAotMHgxMDAwMDA2NSwgMHgwLCAweDMyNDIwMDEyLCAweDEwNDAwMDc1LAotMHgzMjQyMDAwMSwgMHg5NjIyMDAwZSwgMHg4ZjQzMDA5YywgMHg2MjE4MjEsCi0weDMyYzIwMDIwLCAweDEwNDAwMDA1LCAweGFmNDMwMDljLCAweDhmNDIwMzU4LAotMHgyNDQyZmZmZiwgMHhhZjQyMDM1OCwgMHg4ZjQyMDM1OCwgMHg4ZTIyMDAxYywKLTB4OGY0MzAwNDAsIDB4MjQ0MjAwMDEsIDB4MjQ2M2ZmZmYsIDB4NDMxMDI0LAotMHhhZjQyMDAyYywgMHgzMjQyMDAxMCwgMHgxNDQwMDAwOCwgMHgzMmMyMDAxMCwKLTB4OGY0MjAwMzQsIDB4MjQ0MjAwMDEsIDB4YWY0MjAwMzQsIDB4OGMwMzAyM2MsCi0weDQzMTAyYiwgMHgxNDQwMDBiYywgMHgzMmMyMDAxMCwgMHgxMDQwMDAyOCwKLTB4MjQwNzAwMDgsIDB4OGY0NDAxNzAsIDB4OGY0NTAxNzQsIDB4OGY0MzAwMmMsCi0weDhmNDgwMDBjLCAweDhmODYwMTIwLCAweDI0MDIwMDgwLCAweGFmYTIwMDEwLAotMHhhZmEzMDAxNCwgMHhhZmE4MDAxOCwgMHg4ZjQyMDEwYywgMHg0MGY4MDksCi0weDI0YzYwMDFjLCAweDE0NDAwMDExLCAweDI0MDIwMDAxLCAweDNjMDEwMDAxLAotMHgzNzA4MjEsIDB4YTAyMjQwZjEsIDB4OGY4MjAxMjQsIDB4YWZhMjAwMTAsCi0weDhmODIwMTI4LCAweDNjMDQwMDAxLCAweDI0ODQ2N2M0LCAweGFmYTIwMDE0LAotMHg4ZjQ2MDAyYywgMHg4Zjg3MDEyMCwgMHgzYzA1MDAwOSwgMHhjMDAyYjNiLAotMHgzNGE1MTEwMCwgMHgxMDAwMDAzNiwgMHgwLCAweDhmNDIwMzAwLAotMHg4ZjQzMDAyYywgMHgyNDQyMDAwMSwgMHhhZjQyMDMwMCwgMHg4ZjQyMDMwMCwKLTB4MjQwMjAwMDEsIDB4YTM0MjA1YzEsIDB4MTAwMDAwMjYsIDB4YWY0MzAwMzgsCi0weDhmNDQwMTcwLCAweDhmNDUwMTc0LCAweDhmNDMwMDJjLCAweDhmNDgwMDBjLAotMHg4Zjg2MDEyMCwgMHgyNDAyMDAyMCwgMHhhZmEyMDAxMCwgMHhhZmEzMDAxNCwKLTB4YWZhODAwMTgsIDB4OGY0MjAxMGMsIDB4NDBmODA5LCAweDI0YzYwMDFjLAotMHgxNDQwMDAxMSwgMHgyNDAyMDAwMSwgMHgzYzAxMDAwMSwgMHgzNzA4MjEsCi0weGEwMjI0MGYwLCAweDhmODIwMTI0LCAweGFmYTIwMDEwLCAweDhmODIwMTI4LAotMHgzYzA0MDAwMSwgMHgyNDg0NjdiOCwgMHhhZmEyMDAxNCwgMHg4ZjQ2MDAyYywKLTB4OGY4NzAxMjAsIDB4M2MwNTAwMDksIDB4YzAwMmIzYiwgMHgzNGE1MDkwMCwKLTB4MTAwMDAwMGYsIDB4MCwgMHg4ZjQyMDMwMCwgMHgyNDQyMDAwMSwKLTB4YWY0MjAzMDAsIDB4OGY0MjAzMDAsIDB4OGY0MjAwMmMsIDB4YTM0MDA1YzEsCi0weGFmNDIwMDM4LCAweDNjMDEwMDAxLCAweDM3MDgyMSwgMHhhMDIwNDBmMSwKLTB4M2MwMTAwMDEsIDB4MzcwODIxLCAweGEwMjA0MGYwLCAweGFmNDAwMDM0LAotMHg4ZjQyMDMxNCwgMHgyNDQyMDAwMSwgMHhhZjQyMDMxNCwgMHgxMDAwMDA2MiwKLTB4OGY0MjAzMTQsIDB4MTA0MDAwMjIsIDB4MzI0MjcwMDAsIDB4OGUyNTAwMWMsCi0weDhmNDIwMDI4LCAweGEyMjAyMywgMHg0ODEwMDAzLCAweDAsCi0weDhmNDIwMDQwLCAweDgyMjAyMSwgMHg4ZjQyMDM1OCwgMHg4ZjQzMDAwMCwKLTB4YWY0NTAwMjgsIDB4NDQxMDIxLCAweDEwNjAwMDA3LCAweGFmNDIwMzU4LAotMHhhZjgwMDA0YywgMHg4ZjgyMDA0YywgMHgxMDQwZmZmZCwgMHgwLAotMHgxMDAwMDAwNSwgMHgwLCAweGFmODAwMDQ4LCAweDhmODIwMDQ4LAotMHgxMDQwZmZmZCwgMHgwLCAweDhmODIwMDYwLCAweDM0NDIwMDA4LAotMHhhZjgyMDA2MCwgMHg4ZjQyMDAwMCwgMHgxMDQwMDAwMywgMHgwLAotMHgxMDAwMDA0MSwgMHhhZjgwMDA0YywgMHgxMDAwMDAzZiwgMHhhZjgwMDA0OCwKLTB4MTA0MDAwMmYsIDB4MzI0MjEwMDAsIDB4MTA0MDAwMGMsIDB4MzI0MjQwMDAsCi0weDhlMjMwMDFjLCAweDhmNDIwMDUwLCAweDYyMjAyMywgMHg0ODIwMDAxLAotMHgyNDg0MDIwMCwgMHg4ZjQyMDM1YywgMHg0NDEwMjEsIDB4YWY0MjAzNWMsCi0weDhmNDIwMzY4LCAweDEwMDAwMDFhLCAweGFmNDMwMDUwLCAweDEwNDAwMDBjLAotMHgzMmMyODAwMCwgMHg4ZTIzMDAxYywgMHg4ZjQyMDA3MCwgMHg2MjIwMjMsCi0weDQ4MjAwMDEsIDB4MjQ4NDA0MDAsIDB4OGY0MjAzNjQsIDB4NDQxMDIxLAotMHhhZjQyMDM2NCwgMHg4ZjQyMDM2OCwgMHgxMDAwMDAwZCwgMHhhZjQzMDA3MCwKLTB4MTA0MDAwMGUsIDB4M2MwMjA4MDAsIDB4OGUyMzAwMWMsIDB4OGY0MjAwNjAsCi0weDYyMjAyMywgMHg0ODIwMDAxLCAweDI0ODQwMTAwLCAweDhmNDIwMzYwLAotMHg0NDEwMjEsIDB4YWY0MjAzNjAsIDB4OGY0MjAzNjgsIDB4YWY0MzAwNjAsCi0weDQ0MTAyMSwgMHhhZjQyMDM2OCwgMHgzYzAyMDgwMCwgMHgyYzIxMDI0LAotMHg1MDQwMDAxMSwgMHgzNjk0MDA0MCwgMHgxMDAwMDAwZiwgMHgwLAotMHgzMjQyMDA0OCwgMHgxMDQwMDAwNywgMHgyNDE1MDAwMSwgMHg4ZTIyMDAxYywKLTB4M2MwM2ZmZmYsIDB4NDNmMDI0LCAweDMwNDJmZmZmLCAweDEwMDBmZDc1LAotMHhhZTIyMDAxYywgMHgzMjQyMDEwMCwgMHgxMDQwMDAwMywgMHgwLAotMHhjMDAyYmQ4LCAweDAsIDB4OGZiZjAwNTAsIDB4OGZiZTAwNGMsCi0weDhmYjUwMDQ4LCAweDhmYjMwMDQ0LCAweDhmYjIwMDQwLCAweDhmYjEwMDNjLAotMHg4ZmIwMDAzOCwgMHgzZTAwMDA4LCAweDI3YmQwMDU4LCAweDNlMDAwMDgsCi0weDAsIDB4MCwgMHgwLCAweDhmODMwMGU0LAotMHg4ZjgyMDBlMCwgMHgyNDA0ZmZmOCwgMHg0NDEwMjQsIDB4NjIxMDI2LAotMHgyMTAyYiwgMHgyMTAyMywgMHgzZTAwMDA4LCAweDYyMTAyNCwKLTB4M2UwMDAwOCwgMHgwLCAweDI3YmRmZmUwLCAweGFmYmYwMDFjLAotMHhhZmIwMDAxOCwgMHg4Zjg2MDBjNCwgMHg4Zjg0MDBlMCwgMHg4Zjg1MDBlNCwKLTB4MjQwMmZmZjgsIDB4ODIxODI0LCAweDEwYTMwMDA5LCAweDI3NjIzZmY4LAotMHgxNGEyMDAwMiwgMHgyNGEyMDAwOCwgMHgyNzYyMzAwMCwgMHg0MDgwMjEsCi0weDE2MDMwMDA1LCAweDMwODIwMDA0LCAweDEwNDAwMDA0LCAweGMwMjAyMSwKLTB4MTAwMDAwMjIsIDB4MTAyMSwgMHg4ZTA0MDAwMCwgMHg4ZjQyMDExYywKLTB4MTRhMjAwMDMsIDB4MCwgMHg4ZjQyMDEyMCwgMHhhZjQyMDExNCwKLTB4OGNhMzAwMDAsIDB4OGY0MjAxNDgsIDB4ODMxODIzLCAweDQzMTAyYiwKLTB4MTA0MDAwMDMsIDB4MCwgMHg4ZjQyMDE0OCwgMHg2MjE4MjEsCi0weDk0YTIwMDA2LCAweDI0NDIwMDUwLCAweDYyMTAyYiwgMHgxNDQwMDAwZiwKLTB4YTAxMDIxLCAweGFmYTQwMDEwLCAweGFmYTMwMDE0LCAweDhjYTYwMDAwLAotMHg4Y2E3MDAwNCwgMHgzYzA0MDAwMSwgMHhjMDAyYjNiLCAweDI0ODQ2ODk0LAotMHg4ZjQyMDIwYywgMHgyNDQyMDAwMSwgMHhhZjQyMDIwYywgMHg4ZjQyMDIwYywKLTB4MTAyMSwgMHhhZjkwMDBlOCwgMHhhZjkwMDBlNCwgMHg4ZmJmMDAxYywKLTB4OGZiMDAwMTgsIDB4M2UwMDAwOCwgMHgyN2JkMDAyMCwgMHgzZTAwMDA4LAotMHgwLCAweDhmODQwMGUwLCAweDhmODgwMGM0LCAweDhmODMwMGU4LAotMHgyNDAyZmZmOCwgMHg4MjM4MjQsIDB4ZTMyMDIzLCAweDJjODIxMDAwLAotMHg1MDQwMDAwMSwgMHgyNDg0MTAwMCwgMHg0MjBjMiwgMHg4MDE4MjEsCi0weDhmNDQwMjU4LCAweDhmNDUwMjVjLCAweDEwMjEsIDB4YTMyODIxLAotMHhhMzMwMmIsIDB4ODIyMDIxLCAweDg2MjAyMSwgMHhhZjQ0MDI1OCwKLTB4YWY0NTAyNWMsIDB4OGY4MzAwYzgsIDB4OGY0MjAxNDgsIDB4MTAzMjAyMywKLTB4ODIxMDJiLCAweDE0NDAwMDA0LCAweDgwMTgyMSwgMHg4ZjQyMDE0OCwKLTB4ODIyMDIxLCAweDgwMTgyMSwgMHg4ZjQ0MDI1MCwgMHg4ZjQ1MDI1NCwKLTB4MTAyMSwgMHhhMzI4MjEsIDB4YTMzMDJiLCAweDgyMjAyMSwKLTB4ODYyMDIxLCAweGFmNDQwMjUwLCAweGFmNDUwMjU0LCAweGFmODgwMGM4LAotMHhhZjg3MDBlNCwgMHhhZjg3MDBlOCwgMHgzZTAwMDA4LCAweDAsCi0weDI3YmRmZjMwLCAweDI0MGEwMDAxLCAweGFmYmYwMGM4LCAweGFmYmUwMGM0LAotMHhhZmI1MDBjMCwgMHhhZmIzMDBiYywgMHhhZmIyMDBiOCwgMHhhZmIxMDBiNCwKLTB4YWZiMDAwYjAsIDB4YTNhMDAwOTcsIDB4YWZhMDAwNDQsIDB4YWZhYTAwNWMsCi0weDkzNDIwNWM0LCAweGE3YTAwMDhlLCAweDEwNDAwMDBhLCAweGE3YTAwMDg2LAotMHg4ZjRiMDBjNCwgMHhhZmFiMDA2NCwgMHg4ZjRhMDBjMCwgMHhhZmFhMDA2YywKLTB4OGY0YjAwY2MsIDB4YWZhYjAwNzQsIDB4OGY0YTAwYzgsIDB4MTAwMDAxMjksCi0weGFmYWEwMDdjLCAweDhmNDIwMTE0LCAweDQwZjgwOSwgMHgwLAotMHg0MDMwMjEsIDB4MTBjMDAzNGYsIDB4MCwgMHg4Y2MyMDAwMCwKLTB4OGNjMzAwMDQsIDB4YWZhMjAwMjAsIDB4YWZhMzAwMjQsIDB4OGZhYjAwMjQsCi0weDhmYWEwMDIwLCAweDMxNjJmZmZmLCAweDI0NDJmZmZjLCAweGFmYTIwMDZjLAotMHgzYzAyMDAwNiwgMHgyYzIxMDI0LCAweGFmYWIwMDdjLCAweDE0NDAwMDE1LAotMHhhZmFhMDA2NCwgMHg5MTQyMDAwMCwgMHgzMDQyMDAwMSwgMHgxMDQwMDAxMSwKLTB4MjQwMmZmZmYsIDB4OGQ0MzAwMDAsIDB4MTQ2MjAwMDQsIDB4MzQwMmZmZmYsCi0weDk1NDMwMDA0LCAweDEwNjIwMDBiLCAweDAsIDB4YzAwMjRiYiwKLTB4OGZhNDAwNjQsIDB4MzA0MjAwZmYsIDB4MTQ0MDAwMDYsIDB4MCwKLTB4OGY0MjAxMTgsIDB4NDBmODA5LCAweDAsIDB4MTAwMDAzMmQsCi0weDAsIDB4OGZhMjAwMjQsIDB4M2MwM2ZmYmYsIDB4MzQ2M2ZmZmYsCi0weDQzMTAyNCwgMHgzYzAzZmZmZiwgMHg0MzE4MjQsIDB4MTQ2MDAwMDMsCi0weGFmYTIwMDI0LCAweDEwMDAwMDQwLCAweDE4MjEsIDB4M2MwMjAwODAsCi0weDYyMTAyNCwgMHgxMDQwMDAwNywgMHgwLCAweDhmNDIwMzhjLAotMHgyNDQyMDAwMSwgMHhhZjQyMDM4YywgMHg4ZjQyMDM4YywgMHgxMDAwMDAzNiwKLTB4MjQwMzAwMDEsIDB4OGY0MjAyMTAsIDB4MjQ0MjAwMDEsIDB4YWY0MjAyMTAsCi0weDhmNDIwMjEwLCAweDNjMDIwMDAxLCAweDYyMTAyNCwgMHgxMDQwMDAwNiwKLTB4M2MwMjAwMDIsIDB4OGY0MjAxYzQsIDB4MjQ0MjAwMDEsIDB4YWY0MjAxYzQsCi0weDhmNDIwMWM0LCAweDNjMDIwMDAyLCAweDYyMTAyNCwgMHgxMDQwMDAwNiwKLTB4M2MwMjAwMDQsIDB4OGY0MjAzN2MsIDB4MjQ0MjAwMDEsIDB4YWY0MjAzN2MsCi0weDhmNDIwMzdjLCAweDNjMDIwMDA0LCAweDYyMTAyNCwgMHgxMDQwMDAwNiwKLTB4M2MwMjAwMDgsIDB4OGY0MjAzODAsIDB4MjQ0MjAwMDEsIDB4YWY0MjAzODAsCi0weDhmNDIwMzgwLCAweDNjMDIwMDA4LCAweDYyMTAyNCwgMHgxMDQwMDAwNiwKLTB4M2MwMjAwMTAsIDB4OGY0MjAzODQsIDB4MjQ0MjAwMDEsIDB4YWY0MjAzODQsCi0weDhmNDIwMzg0LCAweDNjMDIwMDEwLCAweDYyMTAyNCwgMHgxMDQwMDAwNiwKLTB4M2MwMjAwMjAsIDB4OGY0MjAxYzAsIDB4MjQ0MjAwMDEsIDB4YWY0MjAxYzAsCi0weDhmNDIwMWMwLCAweDNjMDIwMDIwLCAweDYyMTAyNCwgMHgxMDQwMDAwNiwKLTB4MjQwMzAwMDEsIDB4OGY0MjAzODgsIDB4MjQ0MjAwMDEsIDB4YWY0MjAzODgsCi0weDhmNDIwMzg4LCAweDI0MDMwMDAxLCAweDhjMDIwMjYwLCAweDhmYWIwMDZjLAotMHg0YjEwMmIsIDB4MTA0MDAwMTQsIDB4MzA3MDAwZmYsIDB4OGY0MjAxZTgsCi0weDI0NDIwMDAxLCAweGFmNDIwMWU4LCAweDhmNDIwMWU4LCAweDhmYWEwMDdjLAotMHg4ZjgyMDBlMCwgMHgzNTRhMDEwMCwgMHhhZmFhMDA3YywgMHhhZmEyMDAxMCwKLTB4OGY4MjAwZTQsIDB4MjQxMDAwMDEsIDB4M2MwNDAwMDEsIDB4MjQ4NDY4YTAsCi0weGFmYTIwMDE0LCAweDhmYTYwMDIwLCAweDhmYTcwMDI0LCAweDNjMDUwMDA3LAotMHhjMDAyYjNiLCAweDM0YTUwODAwLCAweDEyMDAwMDEwLCAweDNjMDIwMDgwLAotMHgyYzIxMDI0LCAweDE0NDAwMDBlLCAweDMyYzIwNDAwLCAweDhmYWIwMDdjLAotMHgzYzAyMDA4MCwgMHgzNDQyMDEwMCwgMHgxNjIxMDI0LCAweDEwNDAwMDA1LAotMHgwLCAweDhmNDIwMjBjLCAweDI0NDIwMDAxLCAweGFmNDIwMjBjLAotMHg4ZjQyMDIwYywgMHgxMDAwMDJiMCwgMHg4ZmEzMDA2YywgMHgzMmMyMDQwMCwKLTB4MTA0MDAwMTUsIDB4MzQwMjgxMDAsIDB4OGZhYTAwNjQsIDB4OTU0MzAwMGMsCi0weDE0NjIwMDEyLCAweDNjMDIwMTAwLCAweDI0MGIwMjAwLCAweGE3YWIwMDhlLAotMHg5NTQyMDAwZSwgMHg4ZDQzMDAwOCwgMHg4ZDQ0MDAwNCwgMHg4ZDQ1MDAwMCwKLTB4OGZhYTAwNmMsIDB4OGZhYjAwNjQsIDB4MjU0YWZmZmMsIDB4YWZhYTAwNmMsCi0weGE3YTIwMDg2LCAweGFkNjMwMDBjLCAweGFkNjQwMDA4LCAweGFkNjUwMDA0LAotMHgyNTZiMDAwNCwgMHhhZmFiMDA2NCwgMHgzYzAyMDEwMCwgMHgyYzIxMDI0LAotMHgxMDQwMDAwNCwgMHgwLCAweDhmYWEwMDZjLCAweDI1NGEwMDA0LAotMHhhZmFhMDA2YywgMHg4ZjQyMDBiYywgMHg1MDQwMDAwYSwgMHhhZmEwMDA3NCwKLTB4OGZhYjAwNmMsIDB4NGIxMDJiLCAweDUwNDAwMDA2LCAweGFmYTAwMDc0LAotMHg4ZjQyMDBiYywgMHgxNjIxMDIzLCAweGFmYTIwMDc0LCAweDhmNGEwMGJjLAotMHhhZmFhMDA2YywgMHg4ZjQyMDA4MCwgMHg4ZmFiMDA2YywgMHg0YjEwMmIsCi0weDEwNDAwMDU2LCAweDMyYzI4MDAwLCAweDEwNDAwMDVlLCAweDI0MGEwMDAzLAotMHgzMmMyMTAwMCwgMHgxMDQwMDA1YiwgMHhhZmFhMDA1YywgMHgxMDAwMDA1OCwKLTB4MjQwYjAwMDQsIDB4OGY0MjAzNTAsIDB4MjQwM2ZmYmYsIDB4MjgzYTAyNCwKLTB4MjQ0MjAwMDEsIDB4YWY0MjAzNTAsIDB4MTAwMDAyNGYsIDB4OGY0MjAzNTAsCi0weDJjMmIwMjUsIDB4MjQwMmZmYmYsIDB4MjgyYTAyNCwgMHg4ZjgzMDEyOCwKLTB4M2MwNDAwMDEsIDB4MjQ4NDY4ZDAsIDB4MjY2MjAwMDEsIDB4YWZhMjAwMTQsCi0weGFmYTMwMDEwLCAweDhmODYwMTIwLCAweDhmODcwMTI0LCAweDNjMDUwMDA3LAotMHhjMDAyYjNiLCAweDM0YTUyMjUwLCAweDEwMDAwMjNmLCAweDAsCi0weDJjMmIwMjUsIDB4MjQwMmZmYmYsIDB4MjgyYTAyNCwgMHg4ZjgzMDEyOCwKLTB4M2MwNDAwMDEsIDB4MjQ4NDY4ZDAsIDB4MjQwMjAwMDIsIDB4YWZhMjAwMTQsCi0weGFmYTMwMDEwLCAweDhmODYwMTIwLCAweDhmODcwMTI0LCAweDNjMDUwMDA3LAotMHhjMDAyYjNiLCAweDM0YTUyNDUwLCAweDEwMDAwMjJmLCAweDAsCi0weDhlYTIwMDAwLCAweDhlYTMwMDA0LCAweDNjMDQwMDAxLCAweDI0ODQ2OGU4LAotMHhhZmIwMDAxMCwgMHhhZmJlMDAxNCwgMHg4ZWE3MDAxOCwgMHgzNGE1MjgwMCwKLTB4YzAwMmIzYiwgMHg2MDMwMjEsIDB4MTAwMDAyMjMsIDB4MCwKLTB4YTZiMTAwMGEsIDB4OGY4MjAxMjQsIDB4M2MwNDAwMDEsIDB4MjQ4NDY4ZjAsCi0weGFmYmUwMDE0LCAweGFmYTIwMDEwLCAweDhmNDYwMDQ0LCAweDhmODcwMTIwLAotMHgzYzA1MDAwNywgMHhjMDAyYjNiLCAweDM0YTUzMDAwLCAweDEwMDAwMjE2LAotMHgwLCAweGE2YjEwMDBhLCAweGE2YjIwMDBlLCAweDhmODIwMTI0LAotMHgzYzA0MDAwMSwgMHgyNDg0NjhmYywgMHhhZmJlMDAxNCwgMHhhZmEyMDAxMCwKLTB4OGY0NjAwNDQsIDB4OGY4NzAxMjAsIDB4M2MwNTAwMDcsIDB4YzAwMmIzYiwKLTB4MzRhNTMyMDAsIDB4MTAwMDAyMDgsIDB4MCwgMHg4ZjQyMDA4NCwKLTB4OGZhYTAwNmMsIDB4NGExMDJiLCAweDE0NDAwMDA3LCAweDNjMDIwMDAxLAotMHgyYzIxMDI0LCAweDEwNDAwMDA0LCAweDAsIDB4MjQwYjAwMDIsCi0weGFmYWIwMDVjLCAweDhmYWEwMDZjLCAweDExNDAwMjFiLCAweDI3YWIwMDIwLAotMHhhZmFiMDBhNCwgMHgzYzBhMDAxZiwgMHgzNTRhZmZmZiwgMHhhZmFhMDA5YywKLTB4OGZhYjAwNWMsIDB4MjQwYTAwMDEsIDB4NTU2YTAwMjEsIDB4MjQwYTAwMDIsCi0weDhmNDMwMDU0LCAweDhmNDIwMDUwLCAweDEwNjIwMDBiLCAweDI3NGIwMDU0LAotMHg4ZjVlMDA1NCwgMHgzNDAzZWNjMCwgMHhhZmFiMDA0YywgMHgyN2MyMDAwMSwKLTB4MzA0MjAxZmYsIDB4YWZhMjAwNTQsIDB4MWUxMTQwLCAweDQzMTAyMSwKLTB4MTAwMDAwNmIsIDB4MmUyYTgyMSwgMHg4ZjQyMDA0NCwgMHg4ZmFhMDA2YywKLTB4M2MwNDAwMDEsIDB4MjQ4NDY4YWMsIDB4YWZhYTAwMTQsIDB4YWZhMjAwMTAsCi0weDhmNDYwMDU0LCAweDhmNDcwMDUwLCAweDNjMDUwMDA3LCAweGMwMDJiM2IsCi0weDM0YTUxMzAwLCAweDhmNDMwMzUwLCAweDI0MDJmZmJmLCAweDI4MmEwMjQsCi0weDI0NjMwMDAxLCAweGFmNDMwMzUwLCAweDEwMDAwMWQzLCAweDhmNDIwMzUwLAotMHgxNTZhMDAxZCwgMHgwLCAweDhmNDMwMDc0LCAweDhmNDIwMDcwLAotMHgxMDYyMDAwYSwgMHgyNzRiMDA3NCwgMHg4ZjVlMDA3NCwgMHhhZmFiMDA0YywKLTB4MjdjMjAwMDEsIDB4MzA0MjAzZmYsIDB4YWZhMjAwNTQsIDB4MWUxMTQwLAotMHgyNDQyNmNjMCwgMHgxMDAwMDA0YSwgMHgyZTJhODIxLCAweDhmNDIwMDQ0LAotMHg4ZmFhMDA2YywgMHgzYzA0MDAwMSwgMHgyNDg0NjhiOCwgMHgzYzA1MDAwNywKLTB4YWZhYTAwMTQsIDB4YWZhMjAwMTAsIDB4OGY0NjAwNzQsIDB4OGY0NzAwNzAsCi0weDM0YTUxNTAwLCAweDI0MGIwMDAxLCAweGMwMDJiM2IsIDB4YWZhYjAwNWMsCi0weDEwMDBmZmMzLCAweDAsIDB4OGY0MzAwNjQsIDB4OGY0MjAwNjAsCi0weDEwNjIwMDFhLCAweDI3NGEwMDY0LCAweDhmNWUwMDY0LCAweDhmYWIwMDVjLAotMHhhZmFhMDA0YywgMHgyN2MyMDAwMSwgMHgzMDQyMDBmZiwgMHhhZmEyMDA1NCwKLTB4MjQwMjAwMDQsIDB4MTU2MjAwMGUsIDB4MWUxMTQwLCAweDFlMTE4MCwKLTB4MjQ0MjBjYzAsIDB4MmUyMTAyMSwgMHhhZmEyMDA0NCwgMHg5NDQyMDAyYSwKLTB4OGZhYTAwNDQsIDB4OGZhYjAwNmMsIDB4NGIxMDJiLCAweDEwNDAwMDI0LAotMHgyNTU1MDAyMCwgMHgyNDBhMDAwMSwgMHgxMDAwMDAyMSwgMHhhM2FhMDA5NywKLTB4MjQ0MjRjYzAsIDB4MTAwMDAwMWUsIDB4MmUyYTgyMSwgMHg4ZjQyMDA0NCwKLTB4OGZhYjAwNmMsIDB4M2MwNDAwMDEsIDB4MjQ4NDY4YzQsIDB4YWZhYjAwMTQsCi0weGFmYTIwMDEwLCAweDhmNDYwMDY0LCAweDhmNDcwMDYwLCAweDNjMDUwMDA3LAotMHhjMDAyYjNiLCAweDM0YTUxODAwLCAweDNjMDIwMDA4LCAweDJjMjEwMjQsCi0weDE0NDBmZjM0LCAweDAsIDB4OGY0MjAzNzAsIDB4MjQwYTAwMDEsCi0weGFmYWEwMDVjLCAweDI0NDIwMDAxLCAweGFmNDIwMzcwLCAweDEwMDBmZjkwLAotMHg4ZjQyMDM3MCwgMHgyN2EzMDAzNiwgMHgxMzEwNDAsIDB4NjIxODIxLAotMHg5NDYyMDAwMCwgMHg0NDEwMjEsIDB4MTAwMDAwMjAsIDB4YTQ2MjAwMDAsCi0weDhmYWIwMDY0LCAweGFlYWIwMDE4LCAweDkzYTIwMDk3LCAweDEwNDAwMDcyLAotMHg5ODIxLCAweDhmYWEwMDQ0LCAweDhmYTQwMDZjLCAweDhmYTMwMGE0LAotMHgyNTQyMDAyMCwgMHhhZmEyMDAyOCwgMHgyNTQyMDAwOCwgMHhhZmEyMDAzMCwKLTB4MjU0MjAwMTAsIDB4YWZhYTAwMmMsIDB4YWZhMjAwMzQsIDB4OTU0MjAwMmEsCi0weGE3YTIwMDM4LCAweDk1NDIwMDE4LCAweGE3YTIwMDNhLCAweDk1NDIwMDFhLAotMHhhN2EyMDAzYywgMHg5NTQyMDAxYywgMHhhN2EyMDAzZSwgMHg5NDYyMDAxOCwKLTB4MjQ2MzAwMDIsIDB4ODIyMDIzLCAweDE4ODBmZmRlLCAweDI2NzMwMDAxLAotMHgyZTYyMDAwNCwgMHgxNDQwZmZmOSwgMHgwLCAweDhmNDIwMGZjLAotMHgyNjY1MDAwMSwgMHhhMjEwMmEsIDB4MTQ0MDAwMmIsIDB4MjQwMzAwMDEsCi0weDhmODMwMTJjLCAweDEwNjAwMDIzLCAweDAsIDB4OGY4MjAxMjQsCi0weDQzMTAyMywgMHgyMjE0MywgMHg1ODgwMDAwMSwgMHgyNDg0MDA0MCwKLTB4OGY4MjAxMjgsIDB4NDMxMDIzLCAweDIxOTQzLCAweDU4NjAwMDAxLAotMHgyNDYzMDA0MCwgMHg2NDEwMmEsIDB4NTQ0MDAwMDEsIDB4NjAyMDIxLAotMHhhZjQ0MDBmYywgMHg4ZjQyMDBmYywgMHhhMjEwMmEsIDB4MTA0MDAwMTEsCi0weDI0MDMwMDAxLCAweDEwMDAwMDE1LCAweDMwNjIwMGZmLCAweDhmYWIwMDY0LAotMHg5NjA3MDAxOCwgMHhhZmFiMDAxMCwgMHg4ZTIyMDAwOCwgMHgzYzA0MDAwMSwKLTB4MjQ4NDY4ZGMsIDB4OGM0MzAwMDQsIDB4OGM0MjAwMDAsIDB4MzRhNTI0MDAsCi0weDI0MDMwMjEsIDB4YzAwMmIzYiwgMHhhZmEzMDAxNCwgMHgxMDAwMDAyYiwKLTB4MCwgMHg4ZjQyMDMzNCwgMHgxODIxLCAweDI0NDIwMDAxLAotMHhhZjQyMDMzNCwgMHg4ZjQyMDMzNCwgMHgzMDYyMDBmZiwgMHg1MDQwZmVkYywKLTB4M2MwMjA4MDAsIDB4MTI2MDAwMjEsIDB4OTAyMSwgMHg4ZmIxMDBhNCwKLTB4MjIwODAyMSwgMHg4ZTIyMDAwOCwgMHg5NjA3MDAxOCwgMHg4ZmE2MDA2NCwKLTB4OGM0NDAwMDAsIDB4OGM0NTAwMDQsIDB4MjQwYTAwMDEsIDB4YWZhYTAwMTAsCi0weGFmYmUwMDE0LCAweDhmNDIwMDA4LCAweGFmYTIwMDE4LCAweDhmNDIwMTBjLAotMHg0MGY4MDksIDB4MCwgMHgxMDQwZmZkOCwgMHgzYzA1MDAwNywKLTB4OTYwMjAwMTgsIDB4OGZhYjAwNjQsIDB4OGZhYTAwOWMsIDB4MTYyNTgyMSwKLTB4MTRiMTAyYiwgMHgxMDQwMDAwNCwgMHhhZmFiMDA2NCwgMHg4ZjQyMDE0OCwKLTB4MTYyNTgyMywgMHhhZmFiMDA2NCwgMHgyNjEwMDAwMiwgMHgyNjUyMDAwMSwKLTB4MjUzMTAyYiwgMHgxNDQwZmZlMywgMHgyNjMxMDAwNCwgMHg4ZmIwMDA2YywKLTB4MTAwMDAwMzYsIDB4OTdiMTAwMzgsIDB4OGY0MjAwZmMsIDB4MjQwNTAwMDIsCi0weGEyMTAyYSwgMHgxNDQwMDAxYiwgMHgyNDAzMDAwMSwgMHg4ZjgzMDEyYywKLTB4MTA2MDAwMTMsIDB4MCwgMHg4ZjgyMDEyNCwgMHg0MzEwMjMsCi0weDIyMTQzLCAweDU4ODAwMDAxLCAweDI0ODQwMDQwLCAweDhmODIwMTI4LAotMHg0MzEwMjMsIDB4MjE5NDMsIDB4NTg2MDAwMDEsIDB4MjQ2MzAwNDAsCi0weDY0MTAyYSwgMHg1NDQwMDAwMSwgMHg2MDIwMjEsIDB4YWY0NDAwZmMsCi0weDhmNDIwMGZjLCAweGEyMTAyYSwgMHgxNDQwMDAwNiwgMHgyNDAzMDAwMSwKLTB4OGY0MjAzMzQsIDB4MTgyMSwgMHgyNDQyMDAwMSwgMHhhZjQyMDMzNCwKLTB4OGY0MjAzMzQsIDB4MzA2MjAwZmYsIDB4MTA0MGZlYTUsIDB4M2MwMjA4MDAsCi0weDk2YjEwMDBhLCAweDhmYjAwMDZjLCAweDMyMjNmZmZmLCAweDcwMTAyYiwKLTB4NTQ0MDAwMDEsIDB4NjA4MDIxLCAweDhlYTQwMDAwLCAweDhlYTUwMDA0LAotMHgyNDBiMDAwMSwgMHhhZmFiMDAxMCwgMHhhZmJlMDAxNCwgMHg4ZjQyMDAwOCwKLTB4OGZhNjAwNjQsIDB4YWZhMjAwMTgsIDB4OGY0MjAxMGMsIDB4NDBmODA5LAotMHgyMDAzODIxLCAweDEwNDBmZWEyLCAweDNjMDUwMDA3LCAweDk2YTMwMDBlLAotMHg5N2FhMDA4ZSwgMHgxMTQwMDAwNywgMHg2MDkwMjEsIDB4OTM0MjA1YzQsCi0weDE0NDAwMDA0LCAweDAsIDB4OTdhYjAwODYsIDB4NmExODI1LAotMHhhNmFiMDAxNiwgMHg4ZmFhMDA3YywgMHgzYzAyZmZmZiwgMHgxNDIxMDI0LAotMHgxMDQwMDAwMywgMHhhMTQwMiwgMHgzNDYzMDQwMCwgMHhhNmEyMDAxNCwKLTB4OGZhYjAwNmMsIDB4NTYwYjAwNzIsIDB4YTZhMzAwMGUsIDB4MzQ2MjAwMDQsCi0weGE2YTIwMDBlLCAweDhmYWEwMDc0LCAweDE2YTEwMjEsIDB4YTZhMjAwMGEsCi0weDhmNDMwMDQ0LCAweDhmNDQwMWEwLCAweDhmNDUwMWE0LCAweDM0MDI4MDAwLAotMHhhZmEyMDAxMCwgMHg4ZjQyMDA0NCwgMHgyYTAzMDIxLCAweDI0MDcwMDIwLAotMHhhZmEyMDAxNCwgMHg4ZjQyMDAwYywgMHgzMTk0MCwgMHg2MDQ4MjEsCi0weGFmYTIwMDE4LCAweDhmNDIwMTBjLCAweDQwMjEsIDB4YTkyODIxLAotMHhhOTE4MmIsIDB4ODgyMDIxLCAweDQwZjgwOSwgMHg4MzIwMjEsCi0weDUwNDBmZTdmLCAweGE2YjIwMDBlLCAweDhmNDIwMzY4LCAweGFmYTAwMDZjLAotMHhhMzQwMDVjNCwgMHgyNDQyZmZmZiwgMHhhZjQyMDM2OCwgMHg4ZmFiMDA1YywKLTB4MjQwYTAwMDEsIDB4OGY0MjAzNjgsIDB4MTU2YTAwMDYsIDB4MjQwYTAwMDIsCi0weDhmNDIwMzVjLCAweDI0NDJmZmZmLCAweGFmNDIwMzVjLCAweDEwMDAwMDBjLAotMHg4ZjQyMDM1YywgMHgxNTZhMDAwNiwgMHgwLCAweDhmNDIwMzY0LAotMHgyNDQyZmZmZiwgMHhhZjQyMDM2NCwgMHgxMDAwMDAwNSwgMHg4ZjQyMDM2NCwKLTB4OGY0MjAzNjAsIDB4MjQ0MmZmZmYsIDB4YWY0MjAzNjAsIDB4OGY0MjAzNjAsCi0weDhmYWEwMDU0LCAweDhmYWIwMDRjLCAweGFkNmEwMDAwLCAweDhmNDIwMDQ0LAotMHg4ZjQ0MDA4OCwgMHg4ZjQzMDA3OCwgMHgyNDQyMDAwMSwgMHg0NDEwMjQsCi0weDI0NjMwMDAxLCAweGFmNDIwMDQ0LCAweGFmNDMwMDc4LCAweDhjMDIwMjQwLAotMHg2MjE4MmIsIDB4MTQ2MDAwNzUsIDB4MjQwNzAwMDgsIDB4OGY0NDAxNjgsCi0weDhmNDUwMTZjLCAweDhmNDMwMDQ0LCAweDhmNDgwMDBjLCAweDhmODYwMTIwLAotMHgyNDAyMDA0MCwgMHhhZmEyMDAxMCwgMHhhZmEzMDAxNCwgMHhhZmE4MDAxOCwKLTB4OGY0MjAxMGMsIDB4NDBmODA5LCAweDI0YzYwMDFjLCAweDE0NDAwMDExLAotMHgyNDBiMDAwMSwgMHgzYzAxMDAwMSwgMHgzNzA4MjEsIDB4YTAyYjQwZjIsCi0weDhmODIwMTI0LCAweGFmYTIwMDEwLCAweDhmODIwMTI4LCAweDNjMDQwMDAxLAotMHgyNDg0Njg4YywgMHhhZmEyMDAxNCwgMHg4ZjQ2MDA0NCwgMHg4Zjg3MDEyMCwKLTB4M2MwNTAwMDksIDB4YzAwMmIzYiwgMHgzNGE1MTMwMCwgMHgxMDAwMDAwYiwKLTB4MCwgMHg4ZjQyMDMwNCwgMHgyNDQyMDAwMSwgMHhhZjQyMDMwNCwKLTB4OGY0MjAzMDQsIDB4OGY0MjAwNDQsIDB4YWY0MjAwN2MsIDB4M2MwMTAwMDEsCi0weDM3MDgyMSwgMHhhMDIwNDBmMiwgMHhhZjQwMDA3OCwgMHg4ZjQyMDMxOCwKLTB4MjQ0MjAwMDEsIDB4YWY0MjAzMTgsIDB4MTAwMDAwNDgsIDB4OGY0MjAzMTgsCi0weGE2YjAwMDBhLCAweDhmNDMwMDQ0LCAweDhmNDQwMWEwLCAweDhmNDUwMWE0LAotMHgzNDAyODAwMCwgMHhhZmEyMDAxMCwgMHg4ZjQyMDA0NCwgMHgyYTAzMDIxLAotMHgyNDA3MDAyMCwgMHhhZmEyMDAxNCwgMHg4ZjQyMDAwYywgMHgzMTk0MCwKLTB4NjA0ODIxLCAweGFmYTIwMDE4LCAweDhmNDIwMTBjLCAweDQwMjEsCi0weGE5MjgyMSwgMHhhOTE4MmIsIDB4ODgyMDIxLCAweDQwZjgwOSwKLTB4ODMyMDIxLCAweDEwNDBmZTFmLCAweDI0MGEwMDAxLCAweGEzNGEwNWM0LAotMHg4ZmFiMDA2YywgMHg4ZmFhMDA2NCwgMHgxNzA1ODIzLCAweGFmYWIwMDZjLAotMHg4ZmFiMDA5YywgMHgxNTA1MDIxLCAweDE2YTEwMmIsIDB4MTA0MDAwMDQsCi0weGFmYWEwMDY0LCAweDhmNDIwMTQ4LCAweDE0MjUwMjMsIDB4YWZhYTAwNjQsCi0weDhmNDIwMzY4LCAweDI0NDJmZmZmLCAweGFmNDIwMzY4LCAweDhmYWEwMDVjLAotMHgyNDBiMDAwMSwgMHg4ZjQyMDM2OCwgMHgxNTRiMDAwNiwgMHgyNDBiMDAwMiwKLTB4OGY0MjAzNWMsIDB4MjQ0MmZmZmYsIDB4YWY0MjAzNWMsIDB4MTAwMDAwMGMsCi0weDhmNDIwMzVjLCAweDExNGIwMDA2LCAweDAsIDB4OGY0MjAzNjAsCi0weDI0NDJmZmZmLCAweGFmNDIwMzYwLCAweDEwMDAwMDA1LCAweDhmNDIwMzYwLAotMHg4ZjQyMDM2NCwgMHgyNDQyZmZmZiwgMHhhZjQyMDM2NCwgMHg4ZjQyMDM2NCwKLTB4OGZhYjAwNTQsIDB4OGZhYTAwNGMsIDB4YWQ0YjAwMDAsIDB4OGY0MjAwNDQsCi0weDhmNDQwMDg4LCAweDhmNDMwMDc4LCAweDI0NDIwMDAxLCAweDQ0MTAyNCwKLTB4MjQ2MzAwMDEsIDB4YWY0MjAwNDQsIDB4YWY0MzAwNzgsIDB4OGZhYTAwNmMsCi0weDE1NDBmZTBiLCAweDAsIDB4OGZhYjAwNmMsIDB4MTE2MDAwMWUsCi0weDAsIDB4OTM0MjA1YzQsIDB4MTA0MDAwMDksIDB4MCwKLTB4OGZhYTAwNjQsIDB4YWY0YTAwYzQsIDB4YWY0YjAwYzAsIDB4OGZhYjAwN2MsCi0weGFmNGIwMGM4LCAweDhmYWEwMDc0LCAweDEwMDAwMDBlLCAweGFmNGEwMGNjLAotMHg5N2FiMDA4ZSwgMHgxMTYwMDAwYiwgMHgzNDAzODEwMCwgMHg4ZmEyMDAyMCwKLTB4OGM0NjAwMGMsIDB4YTQ0MzAwMGMsIDB4OTdhYTAwODYsIDB4OGM0NDAwMDQsCi0weDhjNDUwMDA4LCAweGE0NGEwMDBlLCAweGFjNDQwMDAwLCAweGFjNDUwMDA0LAotMHhhYzQ2MDAwOCwgMHg4ZjQyMDM0YywgMHgyNDQyMDAwMSwgMHhhZjQyMDM0YywKLTB4MTAwMDAwMTAsIDB4OGY0MjAzNGMsIDB4OGZhYjAwN2MsIDB4MzE2NGZmZmYsCi0weDI0ODRmZmZjLCAweDgwMTgyMSwgMHg4ZjQ0MDI1MCwgMHg4ZjQ1MDI1NCwKLTB4OGY0NjAxMTgsIDB4MTAyMSwgMHhhMzI4MjEsIDB4YTMzODJiLAotMHg4MjIwMjEsIDB4ODcyMDIxLCAweGFmNDQwMjUwLCAweGMwZjgwOSwKLTB4YWY0NTAyNTQsIDB4OGZiZjAwYzgsIDB4OGZiZTAwYzQsIDB4OGZiNTAwYzAsCi0weDhmYjMwMGJjLCAweDhmYjIwMGI4LCAweDhmYjEwMGI0LCAweDhmYjAwMGIwLAotMHgzZTAwMDA4LCAweDI3YmQwMGQwLCAweDNlMDAwMDgsIDB4MCwKLTB4MjdiZGZmMzgsIDB4MjQwYjAwMDEsIDB4YWZiZjAwYzAsIDB4YWZiZTAwYmMsCi0weGFmYjUwMGI4LCAweGFmYjMwMGI0LCAweGFmYjIwMGIwLCAweGFmYjEwMGFjLAotMHhhZmIwMDBhOCwgMHhhM2EwMDA4NywgMHhhZmEwMDA0NCwgMHhhZmFiMDA1YywKLTB4OTM0MjA1YzQsIDB4YTdhMDAwNzYsIDB4MTA0MDAwMDcsIDB4YTdhMDAwN2UsCi0weDhmNGMwMGMwLCAweGFmYWMwMDY0LCAweDhmNGIwMGM4LCAweDhmNWUwMGM0LAotMHgxMDAwMDEzMCwgMHhhZmFiMDA2YywgMHg4ZjQyMDExNCwgMHg0MGY4MDksCi0weDAsIDB4NDAzMDIxLCAweDEwYzAwMmExLCAweDAsCi0weDhjYzIwMDAwLCAweDhjYzMwMDA0LCAweGFmYTIwMDIwLCAweGFmYTMwMDI0LAotMHg4ZmFjMDAyNCwgMHg4ZmJlMDAyMCwgMHgzMTgyZmZmZiwgMHgyNDQyZmZmYywKLTB4YWZhMjAwNjQsIDB4M2MwMjAwMDYsIDB4MmMyMTAyNCwgMHgxNDQwMDAxNSwKLTB4YWZhYzAwNmMsIDB4OTNjMjAwMDAsIDB4MzA0MjAwMDEsIDB4MTA0MDAwMTEsCi0weDI0MDJmZmZmLCAweDhmYzMwMDAwLCAweDE0NjIwMDA0LCAweDM0MDJmZmZmLAotMHg5N2MzMDAwNCwgMHgxMDYyMDAwYiwgMHgwLCAweGMwMDI0YmIsCi0weDNjMDIwMjEsIDB4MzA0MjAwZmYsIDB4MTQ0MDAwMDYsIDB4MCwKLTB4OGY0MjAxMTgsIDB4NDBmODA5LCAweDAsIDB4MTAwMDAyODAsCi0weDAsIDB4OGZhMjAwMjQsIDB4M2MwM2ZmYmYsIDB4MzQ2M2ZmZmYsCi0weDQzMTAyNCwgMHgzYzAzZmZmZiwgMHg0MzE4MjQsIDB4MTQ2MDAwMDMsCi0weGFmYTIwMDI0LCAweDEwMDAwMDQwLCAweDgwMjEsIDB4M2MwMjAwODAsCi0weDYyMTAyNCwgMHgxMDQwMDAwNywgMHgwLCAweDhmNDIwMzhjLAotMHgyNDQyMDAwMSwgMHhhZjQyMDM4YywgMHg4ZjQyMDM4YywgMHgxMDAwMDAzNiwKLTB4MjQxMDAwMDEsIDB4OGY0MjAyMTAsIDB4MjQ0MjAwMDEsIDB4YWY0MjAyMTAsCi0weDhmNDIwMjEwLCAweDNjMDIwMDAxLCAweDYyMTAyNCwgMHgxMDQwMDAwNiwKLTB4M2MwMjAwMDIsIDB4OGY0MjAxYzQsIDB4MjQ0MjAwMDEsIDB4YWY0MjAxYzQsCi0weDhmNDIwMWM0LCAweDNjMDIwMDAyLCAweDYyMTAyNCwgMHgxMDQwMDAwNiwKLTB4M2MwMjAwMDQsIDB4OGY0MjAzN2MsIDB4MjQ0MjAwMDEsIDB4YWY0MjAzN2MsCi0weDhmNDIwMzdjLCAweDNjMDIwMDA0LCAweDYyMTAyNCwgMHgxMDQwMDAwNiwKLTB4M2MwMjAwMDgsIDB4OGY0MjAzODAsIDB4MjQ0MjAwMDEsIDB4YWY0MjAzODAsCi0weDhmNDIwMzgwLCAweDNjMDIwMDA4LCAweDYyMTAyNCwgMHgxMDQwMDAwNiwKLTB4M2MwMjAwMTAsIDB4OGY0MjAzODQsIDB4MjQ0MjAwMDEsIDB4YWY0MjAzODQsCi0weDhmNDIwMzg0LCAweDNjMDIwMDEwLCAweDYyMTAyNCwgMHgxMDQwMDAwNiwKLTB4M2MwMjAwMjAsIDB4OGY0MjAxYzAsIDB4MjQ0MjAwMDEsIDB4YWY0MjAxYzAsCi0weDhmNDIwMWMwLCAweDNjMDIwMDIwLCAweDYyMTAyNCwgMHgxMDQwMDAwNiwKLTB4MjQxMDAwMDEsIDB4OGY0MjAzODgsIDB4MjQ0MjAwMDEsIDB4YWY0MjAzODgsCi0weDhmNDIwMzg4LCAweDI0MTAwMDAxLCAweDhjMDIwMjYwLCAweDhmYWIwMDY0LAotMHg0YjEwMmIsIDB4MTA0MDAwMTUsIDB4MzIwMjAwZmYsIDB4OGY0MjAxZTgsCi0weDI0NDIwMDAxLCAweGFmNDIwMWU4LCAweDhmNDIwMWU4LCAweDhmYWMwMDZjLAotMHg4ZjgyMDBlMCwgMHgzNThjMDEwMCwgMHhhZmFjMDA2YywgMHhhZmEyMDAxMCwKLTB4OGY4MjAwZTQsIDB4MjQxMDAwMDEsIDB4M2MwNDAwMDEsIDB4MjQ4NDY4YTAsCi0weGFmYTIwMDE0LCAweDhmYTYwMDIwLCAweDhmYTcwMDI0LCAweDNjMDUwMDA3LAotMHhjMDAyYjNiLCAweDM0YTUzNjAwLCAweDMyMDIwMGZmLCAweDEwNDAwMDEwLAotMHgzYzAyMDA4MCwgMHgyYzIxMDI0LCAweDE0NDAwMDBlLCAweDMyYzIwNDAwLAotMHg4ZmFiMDA2YywgMHgzYzAyMDA4MCwgMHgzNDQyMDEwMCwgMHgxNjIxMDI0LAotMHgxMDQwMDAwNSwgMHgwLCAweDhmNDIwMjBjLCAweDI0NDIwMDAxLAotMHhhZjQyMDIwYywgMHg4ZjQyMDIwYywgMHgxMDAwMDIwMiwgMHg4ZmEzMDA2NCwKLTB4MzJjMjA0MDAsIDB4MTA0MDAwMTIsIDB4MzQwMjgxMDAsIDB4OTdjMzAwMGMsCi0weDE0NjIwMDBmLCAweDAsIDB4MjQwYzAyMDAsIDB4YTdhYzAwNzYsCi0weDk3YzIwMDBlLCAweDhmYzMwMDA4LCAweDhmYzQwMDA0LCAweDhmYWIwMDY0LAotMHg4ZmM1MDAwMCwgMHgyNTZiZmZmYywgMHhhZmFiMDA2NCwgMHhhN2EyMDA3ZSwKLTB4YWZjMzAwMGMsIDB4YWZjNDAwMDgsIDB4YWZjNTAwMDQsIDB4MjdkZTAwMDQsCi0weDhmYTcwMDY0LCAweDMyMDIwMGZmLCAweDE0NDAwMDM0LCAweDNjMDIwMTAwLAotMHg5N2M0MDAwYywgMHgyYzgzMDVkZCwgMHgzODgyODg3MCwgMHgyYzQyMDAwMSwKLTB4NjIxODI1LCAweDEwNjAwMDE1LCAweDI4MjEsIDB4MzJjMjA4MDAsCi0weDEwNDAwMDE1LCAweDI0MDIwODAwLCAweDk3YzMwMDE0LCAweDE0NjIwMDEyLAotMHgzNDAyYWFhYSwgMHg5N2MzMDAwZSwgMHgxNDYyMDAwNywgMHgyMDIxLAotMHg5N2MzMDAxMCwgMHgyNDAyMDMwMCwgMHgxNDYyMDAwNCwgMHg4MDEwMjEsCi0weDk3YzIwMDEyLCAweDJjNDQwMDAxLCAweDgwMTAyMSwgMHg1NDQwMDAwNiwKLTB4MjQwNTAwMTYsIDB4MTAwMDAwMDQsIDB4MCwgMHgyNDAyMDgwMCwKLTB4NTA4MjAwMDEsIDB4MjQwNTAwMGUsIDB4MTBhMDAwMTMsIDB4M2M1MjAyMSwKLTB4MjQ4MzAwMDksIDB4M2MwMjAwMWYsIDB4MzQ0MmZmZmYsIDB4NDMxMDJiLAotMHgxMDQwMDAwMywgMHgwLCAweDhmNDIwMTQ4LCAweDYyMTgyMywKLTB4OTA2MjAwMDAsIDB4Mzg0MzAwMDYsIDB4MmM2MzAwMDEsIDB4Mzg0MjAwMTEsCi0weDJjNDIwMDAxLCAweDYyMTgyNSwgMHgxMDYwMDAwNCwgMHgzYzAyMDEwMCwKLTB4OTQ4MjAwMDIsIDB4NDUzODIxLCAweDNjMDIwMTAwLCAweDJjMjEwMjQsCi0weDUwNDAwMDBlLCAweGFmYTcwMDY0LCAweDhmYWMwMDY0LCAweDEwZWMwMDA4LAotMHgzYzA1MDAwNywgMHgzYzA0MDAwMSwgMHgyNDg0NjkwOCwgMHg4ZmE2MDA2NCwKLTB4MzRhNTQwMDAsIDB4YWZhMDAwMTAsIDB4YzAwMmIzYiwgMHhhZmEwMDAxNCwKLTB4OGZhYjAwNjQsIDB4MjU2YjAwMDQsIDB4YWZhYjAwNjQsIDB4OGY0MjAwODAsCi0weDhmYWMwMDY0LCAweDRjMTAyYiwgMHgxMDQwMDAyYywgMHgzMmMyODAwMCwKLTB4MTA0MDAwMzQsIDB4MjQwYjAwMDMsIDB4MzJjMjEwMDAsIDB4MTA0MDAwMzEsCi0weGFmYWIwMDVjLCAweDEwMDAwMDJlLCAweDI0MGMwMDA0LCAweDhmNDIwMzUwLAotMHgyNDAzZmZiZiwgMHgyODNhMDI0LCAweDI0NDIwMDAxLCAweGFmNDIwMzUwLAotMHgxMDAwMDE3MywgMHg4ZjQyMDM1MCwgMHgzYzAyMDgwMCwgMHgyYzJiMDI1LAotMHgyNDAyZmZiZiwgMHgyODJhMDI0LCAweDhmODMwMTI4LCAweDNjMDQwMDAxLAotMHgyNDg0NjhkMCwgMHgyNjYyMDAwMSwgMHhhZmEyMDAxNCwgMHhhZmEzMDAxMCwKLTB4OGY4NjAxMjAsIDB4OGY4NzAxMjQsIDB4M2MwNTAwMDcsIDB4YzAwMmIzYiwKLTB4MzRhNTUzMDAsIDB4MTAwMDAxNjIsIDB4MCwgMHg4ZWEyMDAwMCwKLTB4OGVhMzAwMDQsIDB4M2MwNDAwMDEsIDB4MjQ4NDY4ZTgsIDB4YWZiMDAwMTAsCi0weGFmYjEwMDE0LCAweDhlYTcwMDE4LCAweDM0YTU1OTAwLCAweGMwMDJiM2IsCi0weDYwMzAyMSwgMHgxMDAwMDE1NiwgMHgwLCAweDhmNDIwMDg0LAotMHg4ZmFiMDA2NCwgMHg0YjEwMmIsIDB4MTQ0MDAwMDcsIDB4M2MwMjAwMDEsCi0weDJjMjEwMjQsIDB4MTA0MDAwMDQsIDB4MCwgMHgyNDBjMDAwMiwKLTB4YWZhYzAwNWMsIDB4OGZhYjAwNjQsIDB4MTE2MDAxNjYsIDB4MjdhYzAwMjAsCi0weGFmYWMwMDhjLCAweDhmYWIwMDVjLCAweDI0MGMwMDAxLCAweDU1NmMwMDIxLAotMHgyNDBjMDAwMiwgMHg4ZjQzMDA1NCwgMHg4ZjQyMDA1MCwgMHgxMDYyMDAwYiwKLTB4Mjc0YjAwNTQsIDB4OGY1MTAwNTQsIDB4MzQwM2VjYzAsIDB4YWZhYjAwNGMsCi0weDI2MjIwMDAxLCAweDMwNDIwMWZmLCAweGFmYTIwMDU0LCAweDExMTE0MCwKLTB4NDMxMDIxLCAweDEwMDAwMDZiLCAweDJlMmE4MjEsIDB4OGY0MjAwNDQsCi0weDhmYWMwMDY0LCAweDNjMDQwMDAxLCAweDI0ODQ2OGFjLCAweGFmYWMwMDE0LAotMHhhZmEyMDAxMCwgMHg4ZjQ2MDA1NCwgMHg4ZjQ3MDA1MCwgMHgzYzA1MDAwNywKLTB4YzAwMmIzYiwgMHgzNGE1NDMwMCwgMHg4ZjQzMDM1MCwgMHgyNDAyZmZiZiwKLTB4MjgyYTAyNCwgMHgyNDYzMDAwMSwgMHhhZjQzMDM1MCwgMHgxMDAwMDEyNCwKLTB4OGY0MjAzNTAsIDB4MTU2YzAwMWQsIDB4MCwgMHg4ZjQzMDA3NCwKLTB4OGY0MjAwNzAsIDB4MTA2MjAwMGEsIDB4Mjc0YjAwNzQsIDB4OGY1MTAwNzQsCi0weGFmYWIwMDRjLCAweDI2MjIwMDAxLCAweDMwNDIwM2ZmLCAweGFmYTIwMDU0LAotMHgxMTExNDAsIDB4MjQ0MjZjYzAsIDB4MTAwMDAwNGEsIDB4MmUyYTgyMSwKLTB4OGY0MjAwNDQsIDB4OGZhYzAwNjQsIDB4M2MwNDAwMDEsIDB4MjQ4NDY4YjgsCi0weDNjMDUwMDA3LCAweGFmYWMwMDE0LCAweGFmYTIwMDEwLCAweDhmNDYwMDc0LAotMHg4ZjQ3MDA3MCwgMHgzNGE1NDUwMCwgMHgyNDBiMDAwMSwgMHhjMDAyYjNiLAotMHhhZmFiMDA1YywgMHgxMDAwZmZjMywgMHgwLCAweDhmNDMwMDY0LAotMHg4ZjQyMDA2MCwgMHgxMDYyMDAxYSwgMHgyNzRjMDA2NCwgMHg4ZjUxMDA2NCwKLTB4OGZhYjAwNWMsIDB4YWZhYzAwNGMsIDB4MjYyMjAwMDEsIDB4MzA0MjAwZmYsCi0weGFmYTIwMDU0LCAweDI0MDIwMDA0LCAweDE1NjIwMDBlLCAweDExMTE0MCwKLTB4MTExMTgwLCAweDI0NDIwY2MwLCAweDJlMjEwMjEsIDB4YWZhMjAwNDQsCi0weDk0NDIwMDJhLCAweDhmYWMwMDQ0LCAweDhmYWIwMDY0LCAweDRiMTAyYiwKLTB4MTA0MDAwMjQsIDB4MjU5NTAwMjAsIDB4MjQwYzAwMDEsIDB4MTAwMDAwMjEsCi0weGEzYWMwMDg3LCAweDI0NDI0Y2MwLCAweDEwMDAwMDFlLCAweDJlMmE4MjEsCi0weDhmNDIwMDQ0LCAweDhmYWIwMDY0LCAweDNjMDQwMDAxLCAweDI0ODQ2OGM0LAotMHhhZmFiMDAxNCwgMHhhZmEyMDAxMCwgMHg4ZjQ2MDA2NCwgMHg4ZjQ3MDA2MCwKLTB4M2MwNTAwMDcsIDB4YzAwMmIzYiwgMHgzNGE1NDgwMCwgMHgzYzAyMDAwOCwKLTB4MmMyMTAyNCwgMHgxNDQwZmY2MSwgMHgwLCAweDhmNDIwMzcwLAotMHgyNDBjMDAwMSwgMHhhZmFjMDA1YywgMHgyNDQyMDAwMSwgMHhhZjQyMDM3MCwKLTB4MTAwMGZmOTAsIDB4OGY0MjAzNzAsIDB4MjdhMzAwMzYsIDB4MTMxMDQwLAotMHg2MjE4MjEsIDB4OTQ2MjAwMDAsIDB4NDQxMDIxLCAweDEwMDAwMDFmLAotMHhhNDYyMDAwMCwgMHhhZWJlMDAxOCwgMHg5M2EyMDA4NywgMHgxMDQwMDA4NCwKLTB4OTgyMSwgMHg4ZmFiMDA0NCwgMHg4ZmE0MDA2NCwgMHg4ZmEzMDA4YywKLTB4MjU2MjAwMjAsIDB4YWZhMjAwMjgsIDB4MjU2MjAwMDgsIDB4YWZhMjAwMzAsCi0weDI1NjIwMDEwLCAweGFmYWIwMDJjLCAweGFmYTIwMDM0LCAweDk1NjIwMDJhLAotMHhhN2EyMDAzOCwgMHg5NTYyMDAxOCwgMHhhN2EyMDAzYSwgMHg5NTYyMDAxYSwKLTB4YTdhMjAwM2MsIDB4OTU2MjAwMWMsIDB4YTdhMjAwM2UsIDB4OTQ2MjAwMTgsCi0weDI0NjMwMDAyLCAweDgyMjAyMywgMHgxODgwZmZkZiwgMHgyNjczMDAwMSwKLTB4MmU2MjAwMDQsIDB4MTQ0MGZmZjksIDB4MCwgMHg4ZjQyMDBmYywKLTB4MjYyMTAyYSwgMHgxNDQwMDAzMCwgMHgyNDAzMDAwMSwgMHg4ZjgzMDEyYywKLTB4MTA2MDAwMjgsIDB4MCwgMHg4ZjgyMDEyNCwgMHg0MzEwMjMsCi0weDIyMTQzLCAweDU4ODAwMDAxLCAweDI0ODQwMDQwLCAweDhmODIwMTI4LAotMHg0MzEwMjMsIDB4MjE5NDMsIDB4NTg2MDAwMDEsIDB4MjQ2MzAwNDAsCi0weDY0MTAyYSwgMHg1NDQwMDAwMSwgMHg2MDIwMjEsIDB4YWY0NDAwZmMsCi0weDhmNDIwMGZjLCAweDI2MjEwMmEsIDB4MTA0MDAwMTYsIDB4MjQwMzAwMDEsCi0weDEwMDAwMDFhLCAweDMwNjIwMGZmLCAweDhmYWMwMDhjLCAweDEwMTA0MCwKLTB4NGMxMDIxLCAweDk0NDcwMDE4LCAweDEwMTA4MCwgMHg0YzEwMjEsCi0weGFmYmUwMDEwLCAweDhjNDIwMDA4LCAweDNjMDQwMDAxLCAweDI0ODQ2OGRjLAotMHgzYzA1MDAwNywgMHg4YzQzMDAwNCwgMHg4YzQyMDAwMCwgMHgzNGE1NTUwMCwKLTB4MjAwMzAyMSwgMHhjMDAyYjNiLCAweGFmYTMwMDE0LCAweDEwMDAwMDM5LAotMHgwLCAweDhmNDIwMzM0LCAweDE4MjEsIDB4MjQ0MjAwMDEsCi0weGFmNDIwMzM0LCAweDhmNDIwMzM0LCAweDMwNjIwMGZmLCAweDEwNDBmZjA2LAotMHg4MDIxLCAweDhmNDMwMDA4LCAweDI0MDJmYmZmLCAweDEyNjAwMDJkLAotMHg2MjUwMjQsIDB4M2MwYjQwMDAsIDB4MjJiNDAyNSwgMHg4ZmIxMDA4YywKLTB4MjY2OWZmZmYsIDB4MjIwOTAyMSwgMHg4ZTQyMDAwOCwgMHg5NjI3MDAxOCwKLTB4OGM0NDAwMDAsIDB4OGM0NTAwMDQsIDB4NTYwOTAwMDQsIDB4MjQwYjAwMDEsCi0weDI0MGMwMDAyLCAweDEwMDAwMDAyLCAweGFmYWMwMDEwLCAweGFmYWIwMDEwLAotMHgxNjAwMDAwNCwgMHhhZmE4MDAxNCwgMHg4ZjQyMDAwOCwgMHgxMDAwMDAwMiwKLTB4YWZhMjAwMTgsIDB4YWZhYTAwMTgsIDB4OGY0MjAxMGMsIDB4M2MwMzAyMSwKLTB4YWZhODAwOTgsIDB4YWZhOTAwOWMsIDB4NDBmODA5LCAweGFmYWEwMGEwLAotMHg4ZmE4MDA5OCwgMHg4ZmE5MDA5YywgMHg4ZmFhMDBhMCwgMHgxMDQwZmZjMiwKLTB4M2MwMjAwMWYsIDB4OTYyMzAwMTgsIDB4MzQ0MmZmZmYsIDB4M2MzZjAyMSwKLTB4NWUxMDJiLCAweDEwNDAwMDAzLCAweDI2MzEwMDAyLCAweDhmNDIwMTQ4LAotMHgzYzJmMDIzLCAweDI2MTAwMDAxLCAweDIxMzEwMmIsIDB4MTQ0MGZmZGEsCi0weDI2NTIwMDA0LCAweDhmYjAwMDY0LCAweDEwMDAwMDFhLCAweDAsCi0weDk2YTMwMDBhLCAweDhmYjAwMDY0LCAweDcwMTAyYiwgMHg1NDQwMDAwMSwKLTB4NjA4MDIxLCAweDhlYTQwMDAwLCAweDhlYTUwMDA0LCAweDhmYWIwMDVjLAotMHgyNDBjMDAwMiwgMHhhZmFjMDAxMCwgMHg5MzQzMDVjNCwgMHhiMTcwMCwKLTB4MTA2MDAwMDMsIDB4MjIyMzAyNSwgMHgzYzAyMDgwMCwgMHhjMjMwMjUsCi0weGFmYTYwMDE0LCAweDhmNDIwMDA4LCAweGFmYTIwMDE4LCAweDhmNDIwMTBjLAotMHgzYzAzMDIxLCAweDQwZjgwOSwgMHgyMDAzODIxLCAweDEwNDBmZWNiLAotMHgzYzA1MDAwNywgMHg5N2FjMDA3NiwgMHgxMTgwMDAwNywgMHg5NmEzMDAwZSwKLTB4OTM0MjA1YzQsIDB4MTQ0MDAwMDQsIDB4MCwgMHg5N2FiMDA3ZSwKLTB4NmMxODI1LCAweGE2YWIwMDE2LCAweDhmYWMwMDZjLCAweDNjMDJmZmZmLAotMHgxODIxMDI0LCAweDEwNDAwMDAzLCAweGMxNDAyLCAweDM0NjMwNDAwLAotMHhhNmEyMDAxNCwgMHhhNmIwMDAwYSwgMHg4ZmFiMDA2NCwgMHg1NjBiMDAwNiwKLTB4M2QwZjAyMSwgMHgzNDYyMDAwNCwgMHhhZmEwMDA2NCwgMHhhNmEyMDAwZSwKLTB4MTAwMDAwMGQsIDB4YTM0MDA1YzQsIDB4OGZhYzAwNjQsIDB4M2MwMjAwMWYsCi0weDM0NDJmZmZmLCAweDVlMTAyYiwgMHgxOTA2MDIzLCAweGFmYWMwMDY0LAotMHhhNmEzMDAwZSwgMHgyNDBiMDAwMSwgMHgxMDQwMDAwMywgMHhhMzRiMDVjNCwKLTB4OGY0MjAxNDgsIDB4M2MyZjAyMywgMHg4ZmFiMDA1NCwgMHg4ZmFjMDA0YywKLTB4YWQ4YjAwMDAsIDB4OGZhYzAwNjQsIDB4MTU4MGZlYmEsIDB4MCwKLTB4OGZhYjAwNjQsIDB4MTE2MDAwMWIsIDB4MCwgMHg5MzQyMDVjNCwKLTB4MTA0MDAwMDYsIDB4MCwgMHhhZjVlMDBjNCwgMHhhZjRiMDBjMCwKLTB4OGZhYzAwNmMsIDB4MTAwMDAwMGUsIDB4YWY0YzAwYzgsIDB4OTdhYjAwNzYsCi0weDExNjAwMDBiLCAweDM0MDM4MTAwLCAweDhmYTIwMDIwLCAweDhjNDYwMDBjLAotMHhhNDQzMDAwYywgMHg5N2FjMDA3ZSwgMHg4YzQ0MDAwNCwgMHg4YzQ1MDAwOCwKLTB4YTQ0YzAwMGUsIDB4YWM0NDAwMDAsIDB4YWM0NTAwMDQsIDB4YWM0NjAwMDgsCi0weDhmNDIwMzRjLCAweDI0NDIwMDAxLCAweGFmNDIwMzRjLCAweDEwMDAwMDEwLAotMHg4ZjQyMDM0YywgMHg4ZmFiMDA2YywgMHgzMTY0ZmZmZiwgMHgyNDg0ZmZmYywKLTB4ODAxODIxLCAweDhmNDQwMjUwLCAweDhmNDUwMjU0LCAweDhmNDYwMTE4LAotMHgxMDIxLCAweGEzMjgyMSwgMHhhMzM4MmIsIDB4ODIyMDIxLAotMHg4NzIwMjEsIDB4YWY0NDAyNTAsIDB4YzBmODA5LCAweGFmNDUwMjU0LAotMHg4ZmJmMDBjMCwgMHg4ZmJlMDBiYywgMHg4ZmI1MDBiOCwgMHg4ZmIzMDBiNCwKLTB4OGZiMjAwYjAsIDB4OGZiMTAwYWMsIDB4OGZiMDAwYTgsIDB4M2UwMDAwOCwKLTB4MjdiZDAwYzgsIDB4M2UwMDAwOCwgMHgwLCAweDI3YmRmZmQ4LAotMHhhZmJmMDAyNCwgMHhhZmIwMDAyMCwgMHg4ZjQzMDA0YywgMHg4ZjQyMDA0OCwKLTB4MTA2MjAwMzQsIDB4MCwgMHg4ZjQzMDA0OCwgMHg4ZjQyMDA0YywKLTB4NjIyMDIzLCAweDQ4MjAwMDEsIDB4MjQ4NDAyMDAsIDB4OGY0MzAwNTQsCi0weDhmNDIwMDRjLCAweDQzMTAyYiwgMHgxNDQwMDAwNCwgMHgyNDAyMDIwMCwKLTB4OGY0MzAwNGMsIDB4MTAwMDAwMDUsIDB4NDMxMDIzLCAweDhmNDIwMDU0LAotMHg4ZjQzMDA0YywgMHg0MzEwMjMsIDB4MjQ0MmZmZmYsIDB4NDA1MDIxLAotMHg4YTEwMmEsIDB4NTQ0MDAwMDEsIDB4ODA1MDIxLCAweDhmNDkwMDRjLAotMHg4ZjQ4MDA0YywgMHg4ZjQ0MDE4OCwgMHg4ZjQ1MDE4YywgMHg4ZjQ2MDA0YywKLTB4MjQwNzEwMDAsIDB4YWZhNzAwMTAsIDB4ODQxNDAsIDB4MTAwMTgyMSwKLTB4MTJhNDgyMSwgMHgzMTMwMDFmZiwgMHhhZmIwMDAxNCwgMHg4ZjQ3MDAxNCwKLTB4MTAyMSwgMHg2MzE0MCwgMHhhZmE3MDAxOCwgMHhhMzI4MjEsCi0weGEzMzgyYiwgMHg4MjIwMjEsIDB4ODcyMDIxLCAweDM0MDJlY2MwLAotMHhjMjMwMjEsIDB4OGY0MjAxMDgsIDB4MmU2MzAyMSwgMHg0MGY4MDksCi0weGEzOTQwLCAweDU0NDAwMDAxLCAweGFmNTAwMDRjLCAweDhmNDMwMDRjLAotMHg4ZjQyMDA0OCwgMHgxNDYyMDAxOCwgMHgwLCAweDhmNDIwMDAwLAotMHgxMDQwMDAwNywgMHgwLCAweGFmODAwMDRjLCAweDhmODIwMDRjLAotMHgxMDQwZmZmZCwgMHgwLCAweDEwMDAwMDA1LCAweDAsCi0weGFmODAwMDQ4LCAweDhmODIwMDQ4LCAweDEwNDBmZmZkLCAweDAsCi0weDhmODIwMDYwLCAweDI0MDNmZGZmLCAweDQzMTAyNCwgMHhhZjgyMDA2MCwKLTB4OGY0MjAwMDAsIDB4MTA0MDAwMDMsIDB4MCwgMHgxMDAwMDAwMiwKLTB4YWY4MDAwNGMsIDB4YWY4MDAwNDgsIDB4OGZiZjAwMjQsIDB4OGZiMDAwMjAsCi0weDNlMDAwMDgsIDB4MjdiZDAwMjgsIDB4M2UwMDAwOCwgMHgwLAotMHgyN2JkZmZkOCwgMHhhZmJmMDAyNCwgMHhhZmIwMDAyMCwgMHg4ZjQzMDA1YywKLTB4OGY0MjAwNTgsIDB4MTA2MjAwNDksIDB4MCwgMHg4ZjQzMDA1OCwKLTB4OGY0MjAwNWMsIDB4NjIyMDIzLCAweDQ4MjAwMDEsIDB4MjQ4NDAxMDAsCi0weDhmNDMwMDY0LCAweDhmNDIwMDVjLCAweDQzMTAyYiwgMHgxNDQwMDAwNCwKLTB4MjQwMjAxMDAsIDB4OGY0MzAwNWMsIDB4MTAwMDAwMDUsIDB4NDMxMDIzLAotMHg4ZjQyMDA2NCwgMHg4ZjQzMDA1YywgMHg0MzEwMjMsIDB4MjQ0MmZmZmYsCi0weDQwMzgyMSwgMHg4NzEwMmEsIDB4NTQ0MDAwMDEsIDB4ODAzODIxLAotMHg4ZjQyMDA1YywgMHg0NzEwMjEsIDB4MzA1MDAwZmYsIDB4MzJjMjEwMDAsCi0weDEwNDAwMDE1LCAweDI0MDgyMDAwLCAweDhmNDkwMDVjLCAweDhmNDQwMTkwLAotMHg4ZjQ1MDE5NCwgMHg4ZjQ2MDA1YywgMHg3Mzk4MCwgMHhhZmE4MDAxMCwKLTB4YWZiMDAwMTQsIDB4OGY0ODAwMTQsIDB4OTQ5ODAsIDB4MTIwMTgyMSwKLTB4MTAyMSwgMHhhMzI4MjEsIDB4YTM0ODJiLCAweDgyMjAyMSwKLTB4ODkyMDIxLCAweDYzMTgwLCAweGFmYTgwMDE4LCAweDhmNDIwMTA4LAotMHgxMDAwMDAxNCwgMHgyNGM2MGNjMCwgMHg4ZjQ5MDA1YywgMHg4ZjQ0MDE5MCwKLTB4OGY0NTAxOTQsIDB4OGY0NjAwNWMsIDB4NzM5NDAsIDB4YWZhODAwMTAsCi0weGFmYjAwMDE0LCAweDhmNDgwMDE0LCAweDk0OTQwLCAweDEyMDE4MjEsCi0weDEwMjEsIDB4YTMyODIxLCAweGEzNDgyYiwgMHg4MjIwMjEsCi0weDg5MjAyMSwgMHg2MzE0MCwgMHhhZmE4MDAxOCwgMHg4ZjQyMDEwOCwKLTB4MjRjNjRjYzAsIDB4NDBmODA5LCAweDJlNjMwMjEsIDB4NTQ0MDAwMDEsCi0weGFmNTAwMDVjLCAweDhmNDMwMDVjLCAweDhmNDIwMDU4LCAweDE0NjIwMDE4LAotMHgwLCAweDhmNDIwMDAwLCAweDEwNDAwMDA3LCAweDAsCi0weGFmODAwMDRjLCAweDhmODIwMDRjLCAweDEwNDBmZmZkLCAweDAsCi0weDEwMDAwMDA1LCAweDAsIDB4YWY4MDAwNDgsIDB4OGY4MjAwNDgsCi0weDEwNDBmZmZkLCAweDAsIDB4OGY4MjAwNjAsIDB4MjQwM2ZlZmYsCi0weDQzMTAyNCwgMHhhZjgyMDA2MCwgMHg4ZjQyMDAwMCwgMHgxMDQwMDAwMywKLTB4MCwgMHgxMDAwMDAwMiwgMHhhZjgwMDA0YywgMHhhZjgwMDA0OCwKLTB4OGZiZjAwMjQsIDB4OGZiMDAwMjAsIDB4M2UwMDAwOCwgMHgyN2JkMDAyOCwKLTB4M2UwMDAwOCwgMHgwLCAweDI3YmRmZmQ4LCAweGFmYmYwMDI0LAotMHhhZmIwMDAyMCwgMHg4ZjQzMDA2YywgMHg4ZjQyMDA2OCwgMHgxMDYyMDAzMywKLTB4MCwgMHg4ZjQzMDA2OCwgMHg4ZjQyMDA2YywgMHg2MjIwMjMsCi0weDQ4MjAwMDEsIDB4MjQ4NDA0MDAsIDB4OGY0MzAwNzQsIDB4OGY0MjAwNmMsCi0weDQzMTAyYiwgMHgxNDQwMDAwNCwgMHgyNDAyMDQwMCwgMHg4ZjQzMDA2YywKLTB4MTAwMDAwMDUsIDB4NDMxMDIzLCAweDhmNDIwMDc0LCAweDhmNDMwMDZjLAotMHg0MzEwMjMsIDB4MjQ0MmZmZmYsIDB4NDA1MDIxLCAweDhhMTAyYSwKLTB4NTQ0MDAwMDEsIDB4ODA1MDIxLCAweDhmNDkwMDZjLCAweDhmNDgwMDZjLAotMHg4ZjQ0MDE5OCwgMHg4ZjQ1MDE5YywgMHg4ZjQ2MDA2YywgMHgyNDA3NDAwMCwKLTB4YWZhNzAwMTAsIDB4ODQxNDAsIDB4MTAwMTgyMSwgMHgxMmE0ODIxLAotMHgzMTMwMDNmZiwgMHhhZmIwMDAxNCwgMHg4ZjQ3MDAxNCwgMHgxMDIxLAotMHg2MzE0MCwgMHgyNGM2NmNjMCwgMHhhZmE3MDAxOCwgMHhhMzI4MjEsCi0weGEzMzgyYiwgMHg4MjIwMjEsIDB4ODcyMDIxLCAweDhmNDIwMTA4LAotMHgyZTYzMDIxLCAweDQwZjgwOSwgMHhhMzk0MCwgMHg1NDQwMDAwMSwKLTB4YWY1MDAwNmMsIDB4OGY0MzAwNmMsIDB4OGY0MjAwNjgsIDB4MTQ2MjAwMTgsCi0weDAsIDB4OGY0MjAwMDAsIDB4MTA0MDAwMDcsIDB4MCwKLTB4YWY4MDAwNGMsIDB4OGY4MjAwNGMsIDB4MTA0MGZmZmQsIDB4MCwKLTB4MTAwMDAwMDUsIDB4MCwgMHhhZjgwMDA0OCwgMHg4ZjgyMDA0OCwKLTB4MTA0MGZmZmQsIDB4MCwgMHg4ZjgyMDA2MCwgMHgyNDAzZjdmZiwKLTB4NDMxMDI0LCAweGFmODIwMDYwLCAweDhmNDIwMDAwLCAweDEwNDAwMDAzLAotMHgwLCAweDEwMDAwMDAyLCAweGFmODAwMDRjLCAweGFmODAwMDQ4LAotMHg4ZmJmMDAyNCwgMHg4ZmIwMDAyMCwgMHgzZTAwMDA4LCAweDI3YmQwMDI4LAotMHgzZTAwMDA4LCAweDAsIDB4OGY0MjAwZmMsIDB4M2MwMzAwMDEsCi0weDhmNDQwMGY4LCAweDM0NjMzMGM4LCAweDI0NDIwMDAxLCAweGFmNDIwMGZjLAotMHg4Zjg1MDEyOCwgMHgyZTMxMDIxLCAweDU0ODIwMDA0LCAweDI0ODIwMDA4LAotMHgzYzAyMDAwMSwgMHgzNDQyMmVjOCwgMHgyZTIxMDIxLCAweDQwMTgyMSwKLTB4YWY0MzAwZjgsIDB4YWM2MDAwMDAsIDB4OGY0MjAwZjQsIDB4MTQ2MjAwMDQsCi0weDNjMDIwMDAxLCAweDI0YTIwMDIwLCAweDEwMDAwMDBmLCAweGFmODIwMTI4LAotMHg4ZjQzMDBmOCwgMHgzNDQyMzBjOCwgMHgyZTIxMDIxLCAweDU0NjIwMDA0LAotMHgyNDYyMDAwOCwgMHgzYzAyMDAwMSwgMHgzNDQyMmVjOCwgMHgyZTIxMDIxLAotMHg0MDE4MjEsIDB4OGM2MjAwMDQsIDB4MjExNDAsIDB4YTIxMDIxLAotMHhhZjgyMDEyOCwgMHhhYzYwMDAwMCwgMHg4Y2EzMDAxOCwgMHgzMDYyMDA3MCwKLTB4MTA0MDAwMmQsIDB4MzA2MjAwMjAsIDB4MTA0MDAwMDQsIDB4M2MwMjAwMTAsCi0weDJjMjEwMjQsIDB4MTA0MDAwMGQsIDB4MCwgMHgzMDYyMDA0MCwKLTB4MTA0MDAwMDQsIDB4M2MwMjAwMjAsIDB4MmMyMTAyNCwgMHgxMDQwMDAwNywKLTB4MCwgMHgzMDYyMDAxMCwgMHgxMDQwMDAxZiwgMHgzYzAyMDA0MCwKLTB4MmMyMTAyNCwgMHgxNDQwMDAxYywgMHgwLCAweDhmODIwMDQwLAotMHgzMDQyMDAwMSwgMHgxNDQwMDAwOCwgMHgyMDIxLCAweDhjMDMwMTA0LAotMHgyNDAyMDAwMSwgMHg1MDYyMDAwNSwgMHgyNDA0MDAwMSwgMHg4YzAyMDI2NCwKLTB4MTA0MDAwMDMsIDB4ODAxMDIxLCAweDI0MDQwMDAxLCAweDgwMTAyMSwKLTB4MTA0MDAwMDYsIDB4MCwgMHg4ZjQyMDMwYywgMHgyNDQyMDAwMSwKLTB4YWY0MjAzMGMsIDB4MTAwMDAwMDgsIDB4OGY0MjAzMGMsIDB4OGY4MjAwNDQsCi0weDM0NDIwMDA0LCAweGFmODIwMDQ0LCAweDhmNDIwMzA4LCAweDI0NDIwMDAxLAotMHhhZjQyMDMwOCwgMHg4ZjQyMDMwOCwgMHgzZTAwMDA4LCAweDAsCi0weDNlMDAwMDgsIDB4MCwgMHgyN2JkZmY5OCwgMHhhZmJmMDA2MCwKLTB4YWZiZTAwNWMsIDB4YWZiNTAwNTgsIDB4YWZiMzAwNTQsIDB4YWZiMjAwNTAsCi0weGFmYjEwMDRjLCAweGFmYjAwMDQ4LCAweDhmNDIwMGZjLCAweDI0NDIwMDAxLAotMHhhZjQyMDBmYywgMHg4Zjg4MDEyOCwgMHgyNTAyMDAyMCwgMHhhZjgyMDEyOCwKLTB4OGQwMzAwMTgsIDB4MzA2MjAwNzAsIDB4MTA0MDAwMmUsIDB4MzA2MjAwMjAsCi0weDEwNDAwMDA0LCAweDNjMDIwMDEwLCAweDJjMjEwMjQsIDB4MTA0MDAwMGQsCi0weDAsIDB4MzA2MjAwNDAsIDB4MTA0MDAwMDQsIDB4M2MwMjAwMjAsCi0weDJjMjEwMjQsIDB4MTA0MDAwMDcsIDB4MCwgMHgzMDYyMDAxMCwKLTB4MTA0MDAxYTksIDB4M2MwMjAwNDAsIDB4MmMyMTAyNCwgMHgxNDQwMDFhNiwKLTB4MCwgMHg4ZjgyMDA0MCwgMHgzMDQyMDAwMSwgMHgxNDQwMDAwOCwKLTB4MjAyMSwgMHg4YzAzMDEwNCwgMHgyNDAyMDAwMSwgMHg1MDYyMDAwNSwKLTB4MjQwNDAwMDEsIDB4OGMwMjAyNjQsIDB4MTA0MDAwMDMsIDB4ODAxMDIxLAotMHgyNDA0MDAwMSwgMHg4MDEwMjEsIDB4MTA0MDAwMDYsIDB4MCwKLTB4OGY0MjAzMGMsIDB4MjQ0MjAwMDEsIDB4YWY0MjAzMGMsIDB4MTAwMDAxOTIsCi0weDhmNDIwMzBjLCAweDhmODIwMDQ0LCAweDM0NDIwMDA0LCAweGFmODIwMDQ0LAotMHg4ZjQyMDMwOCwgMHgyNDQyMDAwMSwgMHhhZjQyMDMwOCwgMHgxMDAwMDE4YSwKLTB4OGY0MjAzMDgsIDB4MzA2MjAwMDIsIDB4MTA0MDAxNGIsIDB4M2MwMjA4MDAsCi0weDhkMWUwMDFjLCAweDFlNTcwMiwgMHhhZmFhMDAzNCwgMHg5NTBhMDAxNiwKLTB4M2MyMjAyNCwgMHhhZmFhMDAyNCwgMHg4ZmFhMDAzNCwgMHgyNDAyMDAwMSwKLTB4MTU0MjAwMDYsIDB4MzNkZWZmZmYsIDB4MWUxMTQwLCAweDM0MDNlY2MwLAotMHg0MzEwMjEsIDB4MTAwMDAwMTAsIDB4MmUyYTgyMSwgMHgyNDAyMDAwMiwKLTB4MTU0MjAwMDUsIDB4MjQwMjAwMDMsIDB4MWUxMTQwLCAweDI0NDI2Y2MwLAotMHgxMDAwMDAwOSwgMHgyZTJhODIxLCAweDE1NDIwMDA1LCAweDFlMTE4MCwKLTB4MWUxMTQwLCAweDI0NDI0Y2MwLCAweDEwMDAwMDAzLCAweDJlMmE4MjEsCi0weDU3MTAyMSwgMHgyNDU1MGNlMCwgMHg5NmEyMDAwZSwgMHgzMDRhZmZmYywKLTB4MzA0MjA0MDAsIDB4MTA0MDAwMDMsIDB4YWZhYTAwMmMsIDB4MTAwMDAwZTEsCi0weDg4MjEsIDB4MTA4MDAwMDQsIDB4ODgyMSwgMHg5N2IxMDAyNiwKLTB4MTAwMDAwZGQsIDB4YTZiMTAwMTIsIDB4OGViMzAwMTgsIDB4OTY2YTAwMGMsCi0weGE3YWEwMDNlLCAweDk3YTUwMDNlLCAweDJjYTMwNWRkLCAweDM4YTI4ODcwLAotMHgyYzQyMDAwMSwgMHg2MjE4MjUsIDB4MTA2MDAwMTUsIDB4MjAyMSwKLTB4MzJjMjA4MDAsIDB4MTA0MDAwMTUsIDB4MjQwMjA4MDAsIDB4OTY2MzAwMTQsCi0weDE0NjIwMDEyLCAweDM0MDJhYWFhLCAweDk2NjMwMDBlLCAweDE0NjIwMDA3LAotMHgyODIxLCAweDk2NjMwMDEwLCAweDI0MDIwMzAwLCAweDE0NjIwMDA0LAotMHhhMDEwMjEsIDB4OTY2MjAwMTIsIDB4MmM0NTAwMDEsIDB4YTAxMDIxLAotMHg1NDQwMDAwNiwgMHgyNDA0MDAxNiwgMHgxMDAwMDAwNCwgMHgwLAotMHgyNDAyMDgwMCwgMHg1MGEyMDAwMSwgMHgyNDA0MDAwZSwgMHgxMDgwMDBiOSwKLTB4MjY0OTAyMSwgMHg5MjQyMDAwMCwgMHgzMDQyMDAwZiwgMHgyODA4MCwKLTB4MzJjMjAxMDAsIDB4MTA0MDAwMjAsIDB4MjUwMTgyMSwgMHgzYzAyMDAyMCwKLTB4NDMxMDJiLCAweDE0NDAwMDBlLCAweDI0MDIwMjEsIDB4MjgyMSwKLTB4OTQ4MjAwMDAsIDB4MjQ4NDAwMDIsIDB4YTIyODIxLCAweDgzMTAyYiwKLTB4MTQ0MGZmZmIsIDB4MzBhMmZmZmYsIDB4NTFjMDIsIDB4NjIyODIxLAotMHg1MWMwMiwgMHgzMGEyZmZmZiwgMHgxMDAwMDAwOSwgMHg2MjI4MjEsCi0weDhmNDcwMTQ4LCAweDhmNDIwMTEwLCAweDEwMjg0MiwgMHgzYzA2MDAyMCwKLTB4NDBmODA5LCAweGFmYTgwMDQwLCAweDMwNDVmZmZmLCAweDhmYTgwMDQwLAotMHg1MGEwMDAwMSwgMHgzNDA1ZmZmZiwgMHg4ZmFhMDAyYywgMHgzNTRhMDAwMiwKLTB4MTAwMDAwMDIsIDB4YWZhYTAwMmMsIDB4MjgyMSwgMHgzMmMyMDA4MCwKLTB4MTA0MDAwOTAsIDB4YTZhNTAwMTAsIDB4MjY0MzAwMDksIDB4M2MwMjAwMWYsCi0weDM0NDJmZmZmLCAweDQzMTAyYiwgMHgxMDQwMDAwMywgMHgwLAotMHg4ZjQyMDE0OCwgMHg2MjE4MjMsIDB4OTA2NjAwMDAsIDB4MzBjMjAwZmYsCi0weDM4NDMwMDA2LCAweDJjNjMwMDAxLCAweDM4NDIwMDExLCAweDJjNDIwMDAxLAotMHg2MjE4MjUsIDB4MTA2MDAwN2YsIDB4MjQwMjA4MDAsIDB4ODgyMSwKLTB4OTdhMzAwM2UsIDB4MTQ2MjAwMGYsIDB4MjYwMjAyMSwgMHg5NjcxMDAwMCwKLTB4OTY2MjAwMDIsIDB4OTY2MzAwMDQsIDB4OTY2NDAwMDYsIDB4MjIyODgyMSwKLTB4MjIzODgyMSwgMHgyMjQ4ODIxLCAweDk2NjIwMDA4LCAweDk2NjMwMDBhLAotMHg5NjY0MDAwYywgMHgyMjI4ODIxLCAweDIyMzg4MjEsIDB4MTAwMDAwMDcsCi0weDIyNDg4MjEsIDB4OTQ4MjAwMDAsIDB4MjQ4NDAwMDIsIDB4MjIyODgyMSwKLTB4OTIxMDJiLCAweDE0NDBmZmZiLCAweDAsIDB4MTExYzAyLAotMHgzMjIyZmZmZiwgMHg2Mjg4MjEsIDB4MTExYzAyLCAweDMyMjJmZmZmLAotMHg2Mjg4MjEsIDB4MzJjMjAyMDAsIDB4MTA0MDAwMDMsIDB4MjY0NDAwMDYsCi0weDEwMDAwMDNlLCAweDgwMjEsIDB4M2MwNTAwMWYsIDB4MzRhNWZmZmYsCi0weGE0MTAyYiwgMHgxMDQwMDAwMywgMHgwLCAweDhmNDIwMTQ4LAotMHg4MjIwMjMsIDB4OTQ4MjAwMDAsIDB4MzA0MjFmZmYsIDB4MTA0MDAwMDQsCi0weDI2NDQwMDBjLCAweDk2NDIwMDAyLCAweDEwMDAwMDMwLCAweDUwODAyMywKLTB4OTY0MjAwMDIsIDB4MjY0MzAwMTQsIDB4NTA4MDIzLCAweDNjMDIwMDIwLAotMHg0MzEwMmIsIDB4MTQ0MDAwMGEsIDB4ZDA4MDIxLCAweDk2NDIwMDBjLAotMHgyMDI4MDIxLCAweDk2NDIwMDBlLCAweDk2NDMwMDEwLCAweDk2NDQwMDEyLAotMHgyMDI4MDIxLCAweDIwMzgwMjEsIDB4MTAwMDAwMjAsIDB4MjA0ODAyMSwKLTB4YTQxMDJiLCAweDEwNDAwMDAzLCAweDAsIDB4OGY0MjAxNDgsCi0weDgyMjAyMywgMHg5NDgyMDAwMCwgMHgyNDg0MDAwMiwgMHgyMDI4MDIxLAotMHhhNDEwMmIsIDB4MTA0MDAwMDMsIDB4MCwgMHg4ZjQyMDE0OCwKLTB4ODIyMDIzLCAweDk0ODIwMDAwLCAweDI0ODQwMDAyLCAweDIwMjgwMjEsCi0weGE0MTAyYiwgMHgxMDQwMDAwMywgMHgwLCAweDhmNDIwMTQ4LAotMHg4MjIwMjMsIDB4OTQ4MjAwMDAsIDB4MjQ4NDAwMDIsIDB4MjAyODAyMSwKLTB4YTQxMDJiLCAweDEwNDAwMDAzLCAweDAsIDB4OGY0MjAxNDgsCi0weDgyMjAyMywgMHg5NDgyMDAwMCwgMHgyMDI4MDIxLCAweDNjMDIwMTAwLAotMHgyYzIxMDI0LCAweDEwNDAwMDBlLCAweDAsIDB4OGZhYTAwMmMsCi0weDMxNDIwMDA0LCAweDEwNDAwMDBhLCAweDAsIDB4OTUwNDAwMGUsCi0weDI2NDIwMjEsIDB4YzAwM2VlYywgMHgyNDg0ZmZmYywgMHgzMDQyZmZmZiwKLTB4MjIyODgyMSwgMHgxMTFjMDIsIDB4MzIyMmZmZmYsIDB4NjI4ODIxLAotMHg4ZmFhMDAyNCwgMHgxNTE4ODIzLCAweDExMTQwMiwgMHgyMjI4ODIxLAotMHgyMzA4ODIxLCAweDExMTQwMiwgMHgyMjI4ODIxLCAweDMyMzFmZmZmLAotMHg1MjIwMDAwMSwgMHgzNDExZmZmZiwgMHg4ZmFhMDAyYywgMHgzNTRhMDAwMSwKLTB4YWZhYTAwMmMsIDB4YTZiMTAwMTIsIDB4OTdhYTAwMmUsIDB4YTZhYTAwMGUsCi0weDhmYWEwMDJjLCAweDMxNDIwMDA0LCAweDEwNDAwMDAyLCAweDI0MDkxMDAwLAotMHgzNDA5ODAwMCwgMHg4ZjQ4MDA0NCwgMHg4ZjQ0MDFhMCwgMHg4ZjQ1MDFhNCwKLTB4YWZhOTAwMTAsIDB4OGY0OTAwNDQsIDB4ODQxNDAsIDB4MTAwMTgyMSwKLTB4YWZhOTAwMTQsIDB4OGY0ODAwMGMsIDB4MmEwMzAyMSwgMHgyNDA3MDAyMCwKLTB4YWZhODAwMTgsIDB4OGY0ODAxMGMsIDB4MTAyMSwgMHhhMzI4MjEsCi0weGEzNDgyYiwgMHg4MjIwMjEsIDB4MTAwZjgwOSwgMHg4OTIwMjEsCi0weDE0NDAwMDBiLCAweDAsIDB4OGY4MjAxMjgsIDB4M2MwNDAwMDEsCi0weDI0ODQ2OTE0LCAweGFmYmUwMDE0LCAweGFmYTIwMDEwLCAweDhmODYwMTI0LAotMHg4Zjg3MDEyMCwgMHgzYzA1MDAwNywgMHhjMDAyYjNiLCAweDM0YTU5OTIwLAotMHg4ZjQyMDM2OCwgMHgyNDQyZmZmZiwgMHhhZjQyMDM2OCwgMHg4ZjQyMDA0NCwKLTB4OGY0MzAwODgsIDB4MjQ0MjAwMDEsIDB4NDMxMDI0LCAweGFmNDIwMDQ0LAotMHg4ZmFhMDAzNCwgMHg4ZjQ0MDM2OCwgMHgyNDAyMDAwMSwgMHgxNTQyMDAwNiwKLTB4MjQwMjAwMDIsIDB4OGY0MjAzNWMsIDB4MjQ0MmZmZmYsIDB4YWY0MjAzNWMsCi0weDEwMDAwMDQ5LCAweDhmNDIwMzVjLCAweDE1NDIwMDA2LCAweDAsCi0weDhmNDIwMzY0LCAweDI0NDJmZmZmLCAweGFmNDIwMzY0LCAweDEwMDAwMDQyLAotMHg4ZjQyMDM2NCwgMHg4ZjQyMDM2MCwgMHgyNDQyZmZmZiwgMHhhZjQyMDM2MCwKLTB4MTAwMDAwM2QsIDB4OGY0MjAzNjAsIDB4MzA2MjEwMDAsIDB4MTA0MDAwMDUsCi0weDMwNjI4MDAwLCAweDhmNDIwMDc4LCAweDI0NDIwMDAxLCAweDEwMDAwMDM2LAotMHhhZjQyMDA3OCwgMHgxMDQwMDAzNCwgMHgwLCAweDhmNDIwMDc4LAotMHgyNDQyMDAwMSwgMHhhZjQyMDA3OCwgMHg4YzAzMDI0MCwgMHg0MzEwMmIsCi0weDE0NDAwMDJkLCAweDI0MDcwMDA4LCAweDhmNDQwMTY4LCAweDhmNDUwMTZjLAotMHg4ZjQzMDA0NCwgMHg4ZjQ4MDAwYywgMHg4Zjg2MDEyMCwgMHgyNDAyMDA0MCwKLTB4YWZhMjAwMTAsIDB4YWZhMzAwMTQsIDB4YWZhODAwMTgsIDB4OGY0MjAxMGMsCi0weDQwZjgwOSwgMHgyNGM2MDAxYywgMHgxNDQwMDAxMSwgMHgyNDAyMDAwMSwKLTB4M2MwMTAwMDEsIDB4MzcwODIxLCAweGEwMjI0MGYyLCAweDhmODIwMTI0LAotMHhhZmEyMDAxMCwgMHg4ZjgyMDEyOCwgMHgzYzA0MDAwMSwgMHgyNDg0Njg4YywKLTB4YWZhMjAwMTQsIDB4OGY0NjAwNDQsIDB4OGY4NzAxMjAsIDB4M2MwNTAwMDksCi0weGMwMDJiM2IsIDB4MzRhNTEzMDAsIDB4MTAwMDAwMGIsIDB4MCwKLTB4OGY0MjAzMDQsIDB4MjQ0MjAwMDEsIDB4YWY0MjAzMDQsIDB4OGY0MjAzMDQsCi0weDhmNDIwMDQ0LCAweGFmNDIwMDdjLCAweDNjMDEwMDAxLCAweDM3MDgyMSwKLTB4YTAyMDQwZjIsIDB4YWY0MDAwNzgsIDB4OGY0MjAzMTgsIDB4MjQ0MjAwMDEsCi0weGFmNDIwMzE4LCAweDhmNDIwMzE4LCAweDhmYmYwMDYwLCAweDhmYmUwMDVjLAotMHg4ZmI1MDA1OCwgMHg4ZmIzMDA1NCwgMHg4ZmIyMDA1MCwgMHg4ZmIxMDA0YywKLTB4OGZiMDAwNDgsIDB4M2UwMDAwOCwgMHgyN2JkMDA2OCwgMHgzZTAwMDA4LAotMHgwLCAweDAsIDB4MCwgMHg4ZjQyMDEzYywKLTB4YWY4MjAwYzAsIDB4OGY0MjAxM2MsIDB4YWY4MjAwYzQsIDB4OGY0MjAxM2MsCi0weGFmODIwMGM4LCAweDhmNDIwMTM4LCAweGFmODIwMGQwLCAweDhmNDIwMTM4LAotMHhhZjgyMDBkNCwgMHg4ZjQyMDEzOCwgMHgzZTAwMDA4LCAweGFmODIwMGQ4LAotMHgyN2JkZmZlMCwgMHgyNzg0MDIwOCwgMHgyNDA1MDIwMCwgMHhhZmJmMDAxOCwKLTB4YzAwMmJiZiwgMHgyNDA2MDAwOCwgMHg4YzAyMDIwNCwgMHhjMDA0MDEyLAotMHhhZjgyMDIxMCwgMHgzYzAyMDAwMSwgMHg4YzQyNmQ5NCwgMHgzMDQyMDAwMiwKLTB4MTA0MDAwMGUsIDB4MjAyMSwgMHg4YzA2MDI0OCwgMHgyNDAyMDAwMiwKLTB4M2MwMTAwMDEsIDB4YWMyMjZkOTgsIDB4YzAwNTEwNCwgMHgyNDA1MDAwMiwKLTB4MjAyMSwgMHg4YzA2MDI0OCwgMHgyNDAyMDAwMSwgMHgzYzAxMDAwMSwKLTB4YWMyMjZkOTgsIDB4MTAwMDAwMTEsIDB4MjQwNTAwMDEsIDB4OGMwNjAyNDgsCi0weDI0MDIwMDA0LCAweDNjMDEwMDAxLCAweGFjMjI2ZDk4LCAweGMwMDUxMDQsCi0weDI0MDUwMDA0LCAweDNjMDIwMDAxLCAweDhjNDI2ZDk0LCAweDMwNDIwMDAxLAotMHgxMDQwMDAwOCwgMHgyNDAyMDAwMSwgMHgzYzAxMDAwMSwgMHhhYzIyNmQ5OCwKLTB4MjAyMSwgMHgyNDA1MDAwMSwgMHgzYzA2NjAxYiwgMHhjMDA1MTA0LAotMHgwLCAweDNjMDQwMDAxLCAweDI0ODQ2OWQwLCAweDhmNDIwMTUwLAotMHg4ZjQzMDE1NCwgMHgzYzA1MDAwOCwgMHg4ZjQ2MDE1OCwgMHgyMTY0MCwKLTB4MzE5NDAsIDB4MzQ2MzA0MDMsIDB4NDMxMDI1LCAweDYzM2MwLAotMHg0NjEwMjUsIDB4YWY4MjAyMWMsIDB4YWZhMDAwMTAsIDB4YWZhMDAwMTQsCi0weDhmODYwMjFjLCAweDM0YTUwMjAwLCAweGMwMDJiM2IsIDB4MzgyMSwKLTB4M2MwMTAwMDEsIDB4YWMyMDZkOTAsIDB4M2MwMTAwMDEsIDB4YWMyMDZkYTgsCi0weDhmYmYwMDE4LCAweDNlMDAwMDgsIDB4MjdiZDAwMjAsIDB4MjdiZGZmZTAsCi0weDNjMDUwMDA4LCAweDM0YTUwMzAwLCAweGFmYmYwMDE4LCAweGFmYTAwMDEwLAotMHhhZmEwMDAxNCwgMHg4Zjg2MDIwMCwgMHgzYzA0MDAwMSwgMHgyNDg0NjlkYywKLTB4YzAwMmIzYiwgMHgzODIxLCAweDhmNDIwNDEwLCAweDI0NDIwMDAxLAotMHhhZjQyMDQxMCwgMHg4ZjQyMDQxMCwgMHg4ZmJmMDAxOCwgMHgzZTAwMDA4LAotMHgyN2JkMDAyMCwgMHgyN2JkZmZkOCwgMHhhZmJmMDAyMCwgMHhhZmIxMDAxYywKLTB4YWZiMDAwMTgsIDB4OGY0MjAzYTQsIDB4MjQ0MjAwMDEsIDB4YWY0MjAzYTQsCi0weDhmNDIwM2E0LCAweDhmOTAwMjIwLCAweDhmODIwMGUwLCAweGFmYTIwMDEwLAotMHg4ZjgyMDBlNCwgMHhhZmEyMDAxNCwgMHg4Zjg2MDBjNCwgMHg4Zjg3MDBjOCwKLTB4M2MwNDAwMDEsIDB4MjQ4NDY5ZTgsIDB4YzAwMmIzYiwgMHgyMDAyODIxLAotMHgzYzA0NDAwMCwgMHgyMDQxMDI0LCAweDUwNDAwMGI0LCAweDNjMDQwMTAwLAotMHg4ZjQyMDNiYywgMHgyNDQyMDAwMSwgMHhhZjQyMDNiYywgMHg4ZjQyMDNiYywKLTB4OGY4NzAwYzQsIDB4OGY4MzAwYzgsIDB4OGY0MjAxNDgsIDB4NjcxODIzLAotMHg0MzEwMmIsIDB4MTA0MDAwMDMsIDB4MCwgMHg4ZjQyMDE0OCwKLTB4NjIxODIxLCAweDEwNjAwMDA1LCAweDAsIDB4OGY0MjAxNGMsCi0weDQzMTAyYiwgMHgxMDQwMDAwYiwgMHgwLCAweDhmODIwMGUwLAotMHg4ZjQzMDEyNCwgMHhhZjQyMDExYywgMHhhZjQzMDExNCwgMHg4ZjgyMDIyMCwKLTB4M2MwMzA4ZmYsIDB4MzQ2M2ZmZmIsIDB4NDMxMDI0LCAweDEwMDAwMGNlLAotMHg0NDEwMjUsIDB4OGY4MjAyMjAsIDB4M2MwMzA4ZmYsIDB4MzQ2M2ZmZmYsCi0weDQzMTAyNCwgMHgzNDQyMDAwNCwgMHhhZjgyMDIyMCwgMHg4ZjgyMDBlMCwKLTB4OGY0MzAxMjQsIDB4YWY0MjAxMWMsIDB4YWY0MzAxMTQsIDB4OGY4NjAwYzgsCi0weDhmODQwMTIwLCAweDhmODMwMTI0LCAweDEwMDAwMDA1LCAweDI4MjEsCi0weDE0NjIwMDAyLCAweDI0NjIwMDIwLCAweDI3NjI0ODAwLCAweDQwMTgyMSwKLTB4MTA2NDAwMGMsIDB4MzBhMjAwZmYsIDB4OGM2MjAwMTgsIDB4MzA0MjAwMDMsCi0weDEwNDBmZmY3LCAweDI3NjI0ZmUwLCAweDhmNDIwM2QwLCAweDI0MDUwMDAxLAotMHgyNDQyMDAwMSwgMHhhZjQyMDNkMCwgMHg4ZjQyMDNkMCwgMHg4YzY2MDAwOCwKLTB4MzBhMjAwZmYsIDB4MTQ0MDAwNTgsIDB4MCwgMHg5MzQyMDVjNCwKLTB4MTQ0MDAwNTUsIDB4MCwgMHg4Zjg3MDBjNCwgMHg4Zjg4MDBlMCwKLTB4OGY4NDAwZTQsIDB4MjQwMmZmZjgsIDB4MTAyNDAyNCwgMHgxMDQxMDIzLAotMHgyMThjMywgMHg0NjIwMDAxLCAweDI0NjMwMjAwLCAweDEwNjAwMDA1LAotMHgyNDAyMDAwMSwgMHgxMDYyMDAwOSwgMHgwLCAweDEwMDAwMDFmLAotMHgwLCAweDhmNDIwM2MwLCAweGUwMzAyMSwgMHgyNDQyMDAwMSwKLTB4YWY0MjAzYzAsIDB4MTAwMDAwNDAsIDB4OGY0MjAzYzAsIDB4OGY0MjAzYzQsCi0weDI0NDIwMDAxLCAweGFmNDIwM2M0LCAweDhjODYwMDAwLCAweDhmNDIwMTQ4LAotMHg4ZjQzMDNjNCwgMHhlNjE4MjMsIDB4NDMxMDJiLCAweDEwNDAwMDA0LAotMHgyYzYyMjMzZiwgMHg4ZjQyMDE0OCwgMHg2MjE4MjEsIDB4MmM2MjIzM2YsCi0weDE0NDAwMDMxLCAweDAsIDB4OGY0MjAyMGMsIDB4MjQ0MjAwMDEsCi0weGFmNDIwMjBjLCAweDhmNDIwMjBjLCAweGUwMzAyMSwgMHgyNDgyMDAwOCwKLTB4YWY4MjAwZTQsIDB4MTAwMDAwMjgsIDB4YWY4MjAwZTgsIDB4OGY0MjAzYzgsCi0weDI0NDIwMDAxLCAweGFmNDIwM2M4LCAweDhmNDIwM2M4LCAweDhjODUwMDAwLAotMHg4ZjQyMDE0OCwgMHhhNzE4MjMsIDB4NDMxMDJiLCAweDEwNDAwMDAzLAotMHgwLCAweDhmNDIwMTQ4LCAweDYyMTgyMSwgMHg4ZjQyMDE0YywKLTB4NDMxMDJiLCAweDU0NDAwMDBhLCAweGEwMzAyMSwgMHg4ZjQyMDIwYywKLTB4MjQ0MjAwMDEsIDB4YWY0MjAyMGMsIDB4OGY0MjAyMGMsIDB4MjQ4MjAwMDgsCi0weGFmODIwMGU0LCAweDhmODQwMGU0LCAweDE0ODhmZmVjLCAweGFmODQwMGU4LAotMHgxNDg4MDAwZCwgMHgyNzYyMzAwMCwgMHgxNDgyMDAwMiwgMHgyNDgyZmZmOCwKLTB4Mjc2MjNmZjgsIDB4OTQ0MzAwMDYsIDB4M2MwMjAwMWYsIDB4MzQ0MmZmZmYsCi0weGMzMzAyMSwgMHg0NjEwMmIsIDB4MTA0MDAwMDMsIDB4MCwKLTB4OGY0MjAxNDgsIDB4YzIzMDIzLCAweGFmODYwMGM4LCAweDhmODMwMGM0LAotMHg4ZjQyMDE0OCwgMHhjMzE4MjMsIDB4NDMxMDJiLCAweDEwNDAwMDAzLAotMHgwLCAweDhmNDIwMTQ4LCAweDYyMTgyMSwgMHgxMDYwMDAwNSwKLTB4MCwgMHg4ZjQyMDE0YywgMHg0MzEwMmIsIDB4NTA0MDAwMDgsCi0weDNjMDJmZGZmLCAweDhmODIwMjIwLCAweDNjMDMwOGZmLCAweDM0NjNmZmZiLAotMHg0MzEwMjQsIDB4M2MwMzQwMDAsIDB4MTAwMDAwM2YsIDB4NDMxMDI1LAotMHg4ZjQzMDNjYywgMHgzNDQyZmZmZiwgMHgyODJhMDI0LCAweDI0NjMwMDAxLAotMHhhZjQzMDNjYywgMHgxMDAwMDAzOSwgMHg4ZjQyMDNjYywgMHgyMDQxMDI0LAotMHgxMDQwMDAwZSwgMHgzYzExMDIwMCwgMHg4ZjQyMDNhOCwgMHgyNDQyMDAwMSwKLTB4YWY0MjAzYTgsIDB4OGY0MjAzYTgsIDB4OGY4MjAyMjAsIDB4M2MwMzA4ZmYsCi0weDM0NjNmZmZmLCAweDQzMTAyNCwgMHg0NDEwMjUsIDB4YzAwM2RhZiwKLTB4YWY4MjAyMjAsIDB4MTAwMDAwMjksIDB4MCwgMHgyMTExMDI0LAotMHg1MDQwMDAwOCwgMHgzYzExMDQwMCwgMHg4ZjQyMDNhYywgMHgyNDQyMDAwMSwKLTB4YWY0MjAzYWMsIDB4YzAwM2RhZiwgMHg4ZjQyMDNhYywgMHgxMDAwMDAxOSwKLTB4MCwgMHgyMTExMDI0LCAweDEwNDAwMDFjLCAweDAsCi0weDhmODMwMjI0LCAweDI0MDIxNDAyLCAweDE0NjIwMDA5LCAweDNjMDUwMDA4LAotMHgzYzA0MDAwMSwgMHgyNDg0NjlmNCwgMHhhZmEwMDAxMCwgMHhhZmEwMDAxNCwKLTB4OGY4NjAyMjQsIDB4MzRhNTA1MDAsIDB4YzAwMmIzYiwgMHgzODIxLAotMHg4ZjQyMDNiMCwgMHgyNDQyMDAwMSwgMHhhZjQyMDNiMCwgMHg4ZjQyMDNiMCwKLTB4OGY4MjAyMjAsIDB4MjAwMjAyMSwgMHgzNDQyMDAwMiwgMHhjMDA0ZTljLAotMHhhZjgyMDIyMCwgMHg4ZjgyMDIyMCwgMHgzYzAzMDhmZiwgMHgzNDYzZmZmZiwKLTB4NDMxMDI0LCAweDUxMTAyNSwgMHhhZjgyMDIyMCwgMHg4ZmJmMDAyMCwKLTB4OGZiMTAwMWMsIDB4OGZiMDAwMTgsIDB4M2UwMDAwOCwgMHgyN2JkMDAyOCwKLTB4M2UwMDAwOCwgMHgwLCAweDNjMDIwMDAxLCAweDhjNDI2ZGE4LAotMHgyN2JkZmZiMCwgMHhhZmJmMDA0OCwgMHhhZmJlMDA0NCwgMHhhZmI1MDA0MCwKLTB4YWZiMzAwM2MsIDB4YWZiMjAwMzgsIDB4YWZiMTAwMzQsIDB4MTA0MDAwMGYsCi0weGFmYjAwMDMwLCAweDNjMDQwMDAxLCAweDI0ODQ2YTAwLCAweDNjMDUwMDA4LAotMHhhZmEwMDAxMCwgMHhhZmEwMDAxNCwgMHg4Zjg2MDIyMCwgMHgzNGE1MDYwMCwKLTB4MjQwMjAwMDEsIDB4M2MwMTAwMDEsIDB4YWMyMDZkYTgsIDB4M2MwMTAwMDEsCi0weGFjMjI2ZDljLCAweGMwMDJiM2IsIDB4MzgyMSwgMHgzYzAzN2ZmZiwKLTB4OGMwMjAyNjgsIDB4MzQ2M2ZmZmYsIDB4M2MwNGZkZmYsIDB4NDMxMDI0LAotMHhhYzAyMDI2OCwgMHg4ZjQyMDAwNCwgMHgzNDg0ZmZmZiwgMHgzMDQyMDAwMiwKLTB4MTA0MDAwOTIsIDB4Mjg0YTAyNCwgMHgzYzA0MDYwMCwgMHgzNDg0MjAwMCwKLTB4OGY0MjAwMDQsIDB4MjgyMSwgMHgyNDAzZmZmZCwgMHg0MzEwMjQsCi0weGFmNDIwMDA0LCAweGFmYTQwMDIwLCAweDhmNWUwMDE4LCAweDI3YWEwMDIwLAotMHgyNDAyMDBmZiwgMHgxM2MyMDAwMiwgMHhhZmFhMDAyYywgMHgyN2M1MDAwMSwKLTB4OGMwMjAyMjgsIDB4YTA5MDIxLCAweDE2NDIwMDBlLCAweDFlMzhjMCwKLTB4OGY0MjAzM2MsIDB4MjQ0MjAwMDEsIDB4YWY0MjAzM2MsIDB4OGY0MjAzM2MsCi0weDhjMDIwMjI4LCAweDNjMDQwMDAxLCAweDI0ODQ2OTk4LCAweDNjMDUwMDA5LAotMHhhZmEwMDAxNCwgMHhhZmEyMDAxMCwgMHg4ZmE2MDAyMCwgMHgxMDAwMDA2ZCwKLTB4MzRhNTA1MDAsIDB4ZjcxMDIxLCAweDhmYTMwMDIwLCAweDhmYTQwMDI0LAotMHhhYzQzMDRjMCwgMHhhYzQ0MDRjNCwgMHg4ZjgzMDA1NCwgMHg4ZjgyMDA1NCwKLTB4MjQ3MDAzZTgsIDB4MjAyMTAyMywgMHgyYzQyMDNlOSwgMHgxMDQwMDAxYiwKLTB4OTgyMSwgMHhlMDg4MjEsIDB4MjYzNTA0YzAsIDB4OGY0NDAxNzgsCi0weDhmNDUwMTdjLCAweDIyMDE4MjEsIDB4MjQwYTAwMDQsIDB4YWZhYTAwMTAsCi0weGFmYjIwMDE0LCAweDhmNDgwMDBjLCAweDEwMjEsIDB4MmY1MzAyMSwKLTB4YWZhODAwMTgsIDB4OGY0ODAxMGMsIDB4MjQwNzAwMDgsIDB4YTMyODIxLAotMHhhMzQ4MmIsIDB4ODIyMDIxLCAweDEwMGY4MDksIDB4ODkyMDIxLAotMHg1NDQwMDAwNiwgMHgyNDEzMDAwMSwgMHg4ZjgyMDA1NCwgMHgyMDIxMDIzLAotMHgyYzQyMDNlOSwgMHgxNDQwZmZlOSwgMHgwLCAweDMyNjIwMGZmLAotMHg1NDQwMDAxNywgMHhhZjUyMDAxOCwgMHg4ZjQyMDM3OCwgMHgyNDQyMDAwMSwKLTB4YWY0MjAzNzgsIDB4OGY0MjAzNzgsIDB4OGY4MjAxMjAsIDB4OGZhYTAwMmMsCi0weGFmYTIwMDEwLCAweDhmODIwMTI0LCAweDNjMDQwMDAxLCAweDI0ODQ2OWE0LAotMHgzYzA1MDAwOSwgMHhhZmEyMDAxNCwgMHg4ZDQ2MDAwMCwgMHgxMDAwMDAzNSwKLTB4MzRhNTA2MDAsIDB4OGY0MjAzMDgsIDB4MjQxMzAwMDEsIDB4MjQ0MjAwMDEsCi0weGFmNDIwMzA4LCAweDhmNDIwMzA4LCAweDEwMDAwMDFlLCAweDMyNjIwMGZmLAotMHg4ZjgzMDA1NCwgMHg4ZjgyMDA1NCwgMHgyNDcwMDNlOCwgMHgyMDIxMDIzLAotMHgyYzQyMDNlOSwgMHgxMDQwMDAxNiwgMHg5ODIxLCAweDNjMTUwMDIwLAotMHgyNDExMDAxMCwgMHg4ZjQyMDAwYywgMHg4ZjQ0MDE2MCwgMHg4ZjQ1MDE2NCwKLTB4OGY4NjAxMjAsIDB4YWZiMTAwMTAsIDB4YWZiMjAwMTQsIDB4NTUxMDI1LAotMHhhZmEyMDAxOCwgMHg4ZjQyMDEwYywgMHgyNDA3MDAwOCwgMHg0MGY4MDksCi0weDI0YzYwMDFjLCAweDE0NDBmZmUzLCAweDAsIDB4OGY4MjAwNTQsCi0weDIwMjEwMjMsIDB4MmM0MjAzZTksIDB4MTQ0MGZmZWUsIDB4MCwKLTB4MzI2MjAwZmYsIDB4MTQ0MDAwMTEsIDB4MCwgMHg4ZjQyMDM3OCwKLTB4MjQ0MjAwMDEsIDB4YWY0MjAzNzgsIDB4OGY0MjAzNzgsIDB4OGY4MjAxMjAsCi0weDhmYWEwMDJjLCAweGFmYTIwMDEwLCAweDhmODIwMTI0LCAweDNjMDQwMDAxLAotMHgyNDg0NjlhYywgMHgzYzA1MDAwOSwgMHhhZmEyMDAxNCwgMHg4ZDQ2MDAwMCwKLTB4MzRhNTA3MDAsIDB4YzAwMmIzYiwgMHgzYzAzODIxLCAweDhmNDIwMmVjLAotMHgyNDQyMDAwMSwgMHhhZjQyMDJlYywgMHg4ZjQyMDJlYywgMHg4ZmJmMDA0OCwKLTB4OGZiZTAwNDQsIDB4OGZiNTAwNDAsIDB4OGZiMzAwM2MsIDB4OGZiMjAwMzgsCi0weDhmYjEwMDM0LCAweDhmYjAwMDMwLCAweDNlMDAwMDgsIDB4MjdiZDAwNTAsCi0weDNjMDIwMDAxLCAweDhjNDI2ZGE4LCAweDI3YmRmZmUwLCAweDE0NDAwMDBkLAotMHhhZmJmMDAxOCwgMHgzYzA0MDAwMSwgMHgyNDg0NmEwYywgMHgzYzA1MDAwOCwKLTB4YWZhMDAwMTAsIDB4YWZhMDAwMTQsIDB4OGY4NjAyMjAsIDB4MzRhNTA3MDAsCi0weDI0MDIwMDAxLCAweDNjMDEwMDAxLCAweGFjMjI2ZGE4LCAweGMwMDJiM2IsCi0weDM4MjEsIDB4M2MwMjAwMDQsIDB4MmMyMTAyNCwgMHgxMDQwMDAwNywKLTB4MCwgMHg4ZjgyMDIyMCwgMHgzYzAzMDhmZiwgMHgzNDYzZmZmZiwKLTB4NDMxMDI0LCAweDM0NDIwMDA4LCAweGFmODIwMjIwLCAweDNjMDUwMDAxLAotMHg4Y2E1NmQ5OCwgMHgyNDAyMDAwMSwgMHgxNGEyMDAwNywgMHgyMDIxLAotMHhjMDA1MjliLCAweDI0MDUwMDAxLCAweGFjMDIwMjZjLCAweDhjMDMwMjZjLAotMHgxMDAwMDAwNiwgMHgzYzAyMDAwNywgMHhjMDA1MjliLCAweDIwMjEsCi0weGFjMDIwMjY4LCAweDhjMDMwMjY4LCAweDNjMDIwMDA3LCAweDYyMTgyNCwKLTB4M2MwMjAwMDIsIDB4NTA2MjAwMGQsIDB4M2MwMjA1ZjUsIDB4NDMxMDJiLAotMHgxNDQwMDAwNiwgMHgzYzAyMDAwNCwgMHgzYzAyMDAwMSwgMHgxMDYyMDAwOSwKLTB4M2MwMjAwOTgsIDB4MTAwMDAwMGIsIDB4MCwgMHgxNDYyMDAwOSwKLTB4M2MwMjNiOWEsIDB4MTAwMDAwMDQsIDB4MzQ0MmNhMDAsIDB4MTAwMDAwMDIsCi0weDM0NDJlMTAwLCAweDM0NDI5NjgwLCAweGFmNDIwMWZjLCAweDhmNDIwMWZjLAotMHhhZWUyMDA2NCwgMHg4ZmJmMDAxOCwgMHgzZTAwMDA4LCAweDI3YmQwMDIwLAotMHgwLCAweDAsIDB4MCwgMHg4NjEwMmIsCi0weDUwNDAwMDAxLCAweDg3MjAyMywgMHhjNDEwMjMsIDB4MjQ4NDMsCi0weDEyNTEwMmIsIDB4MTA0MDAwMWIsIDB4OTEwNDAsIDB4ODI0MDIxLAotMHg4ODEwMmIsIDB4MTA0MDAwMDcsIDB4MTgyMSwgMHg5NDgyMDAwMCwKLTB4MjQ4NDAwMDIsIDB4NjIxODIxLCAweDg4MTAyYiwgMHgxNDQwZmZmYiwKLTB4MCwgMHg2MDIwMjEsIDB4YzczMDIzLCAweGE5MTAyMywKLTB4MjEwNDAsIDB4YzIyODIxLCAweGM1MTAyYiwgMHgxMDQwMDAwNywKLTB4MTgyMSwgMHg5NGMyMDAwMCwgMHgyNGM2MDAwMiwgMHg2MjE4MjEsCi0weGM1MTAyYiwgMHgxNDQwZmZmYiwgMHgwLCAweDEwMDAwMDBkLAotMHg4MzIwMjEsIDB4NTEwNDAsIDB4ODIyODIxLCAweDg1MTAyYiwKLTB4MTA0MDAwMDcsIDB4MTgyMSwgMHg5NDgyMDAwMCwgMHgyNDg0MDAwMiwKLTB4NjIxODIxLCAweDg1MTAyYiwgMHgxNDQwZmZmYiwgMHgwLAotMHg2MDIwMjEsIDB4NDFjMDIsIDB4MzA4MmZmZmYsIDB4NjIyMDIxLAotMHg0MWMwMiwgMHgzMDgyZmZmZiwgMHg2MjIwMjEsIDB4M2UwMDAwOCwKLTB4MzA4MmZmZmYsIDB4M2UwMDAwOCwgMHgwLCAweDgwMjgyMSwKLTB4MzBhMjAwMDEsIDB4MTA0MDAwMmIsIDB4M2MwMzAwMWYsIDB4MzQ2M2ZmZmYsCi0weDI0YTIwMDA0LCAweDYyMTAyYiwgMHg1NDQwMDAwNywgMHg2NTEwMmIsCi0weDkwYTIwMDAxLCAweDkwYTQwMDAzLCAweDkwYTMwMDAwLCAweDkwYTUwMDAyLAotMHgxMDAwMDAyYSwgMHg0NDEwMjEsIDB4MTA0MDAwMDMsIDB4MCwKLTB4OGY0MjAxNDgsIDB4YTIyODIzLCAweDkwYTQwMDAwLCAweDI0YTUwMDAxLAotMHg2NTEwMmIsIDB4MTA0MDAwMDMsIDB4MCwgMHg4ZjQyMDE0OCwKLTB4YTIyODIzLCAweDkwYTIwMDAwLCAweDI0YTUwMDAxLCAweDIxMjAwLAotMHg4MjIwMjEsIDB4NjUxMDJiLCAweDEwNDAwMDAzLCAweDAsCi0weDhmNDIwMTQ4LCAweGEyMjgyMywgMHg5MGEyMDAwMCwgMHgyNGE1MDAwMSwKLTB4ODIyMDIxLCAweDY1MTAyYiwgMHgxMDQwMDAwMywgMHgwLAotMHg4ZjQyMDE0OCwgMHhhMjI4MjMsIDB4OTBhMjAwMDAsIDB4MTAwMDAwMmQsCi0weDIxMjAwLCAweDM0NjNmZmZmLCAweDI0YTIwMDA0LCAweDYyMTAyYiwKLTB4NTQ0MDAwMGEsIDB4NjUxMDJiLCAweDkwYTIwMDAwLCAweDkwYTQwMDAyLAotMHg5MGEzMDAwMSwgMHg5MGE1MDAwMywgMHg0NDEwMjEsIDB4MjEyMDAsCi0weDY1MTgyMSwgMHgxMDAwMDAyMCwgMHg0MzIwMjEsIDB4MTA0MDAwMDMsCi0weDAsIDB4OGY0MjAxNDgsIDB4YTIyODIzLCAweDkwYTIwMDAwLAotMHgyNGE1MDAwMSwgMHgyMjIwMCwgMHg2NTEwMmIsIDB4MTA0MDAwMDMsCi0weDAsIDB4OGY0MjAxNDgsIDB4YTIyODIzLCAweDkwYTIwMDAwLAotMHgyNGE1MDAwMSwgMHg4MjIwMjEsIDB4NjUxMDJiLCAweDEwNDAwMDAzLAotMHgwLCAweDhmNDIwMTQ4LCAweGEyMjgyMywgMHg5MGEyMDAwMCwKLTB4MjRhNTAwMDEsIDB4MjEyMDAsIDB4ODIyMDIxLCAweDY1MTAyYiwKLTB4MTA0MDAwMDMsIDB4MCwgMHg4ZjQyMDE0OCwgMHhhMjI4MjMsCi0weDkwYTIwMDAwLCAweDgyMjAyMSwgMHg0MWMwMiwgMHgzMDgyZmZmZiwKLTB4NjIyMDIxLCAweDQxYzAyLCAweDMwODJmZmZmLCAweDYyMjAyMSwKLTB4M2UwMDAwOCwgMHgzMDgyZmZmZiwgMHgwLCAweDhmODIwMjIwLAotMHgzNDQyMDAwMiwgMHhhZjgyMDIyMCwgMHgzYzAyMDAwMiwgMHg4YzQyOGZmOCwKLTB4MzA0MjQwMDAsIDB4MTA0MDAwNTQsIDB4MjQwNDAwMDEsIDB4OGY4MjAyMDAsCi0weDI0MDY3ZmZmLCAweDhmODMwMjAwLCAweDMwNDUwMDAyLCAweDI0MDJmZmZkLAotMHg2MjE4MjQsIDB4YWY4MzAyMDAsIDB4YWY4NDAyMDQsIDB4OGY4MzAwNTQsCi0weDhmODIwMDU0LCAweDEwMDAwMDAyLCAweDI0NjMwMDAxLCAweDhmODIwMDU0LAotMHg2MjEwMjMsIDB4MmM0MjAwMDIsIDB4MTQ0MGZmZmMsIDB4MCwKLTB4OGY4MjAyMjQsIDB4MTQ0NDAwNGQsIDB4NDIwNDAsIDB4YzQxMDJiLAotMHgxMDQwZmZmMSwgMHgwLCAweDhmODIwMjAwLCAweDQ1MTAyNSwKLTB4YWY4MjAyMDAsIDB4OGY4MjAyMjAsIDB4MzQ0MjgwMDAsIDB4YWY4MjAyMjAsCi0weDhmODMwMDU0LCAweDhmODIwMDU0LCAweDEwMDAwMDAyLCAweDI0NjMwMDAxLAotMHg4ZjgyMDA1NCwgMHg2MjEwMjMsIDB4MmM0MjAwMDIsIDB4MTQ0MGZmZmMsCi0weDAsIDB4OGY4MjAyMjAsIDB4M2MwMzAwMDQsIDB4NDMxMDI0LAotMHgxNDQwMDAwZiwgMHgwLCAweDhmODIwMjIwLCAweDNjMDNmZmZmLAotMHgzNDYzN2ZmZiwgMHg0MzEwMjQsIDB4YWY4MjAyMjAsIDB4OGY4MzAwNTQsCi0weDhmODIwMDU0LCAweDEwMDAwMDAyLCAweDI0NjMwMDAxLCAweDhmODIwMDU0LAotMHg2MjEwMjMsIDB4MmM0MjAwMDIsIDB4MTQ0MGZmZmMsIDB4MCwKLTB4OGY4MjAyMjAsIDB4M2MwMzAwMDQsIDB4NDMxMDI0LCAweDE0NDAwMDBkLAotMHgwLCAweDhmODIwMjIwLCAweDM0NDI4MDAwLCAweGFmODIwMjIwLAotMHg4ZjgzMDA1NCwgMHg4ZjgyMDA1NCwgMHgxMDAwMDAwMiwgMHgyNDYzMDAwMSwKLTB4OGY4MjAwNTQsIDB4NjIxMDIzLCAweDJjNDIwMDAyLCAweDE0NDBmZmZjLAotMHgwLCAweDhmODIwMjIwLCAweDNjMDMwMDA0LCAweDQzMTAyNCwKLTB4MTA0MDAwMWIsIDB4MTAyMSwgMHg4ZjgzMDIyMCwgMHgyNDAyMDAwMSwKLTB4MTAwMDAwMTUsIDB4M2MwNGY3MDAsIDB4OGY4MjAyMjAsIDB4M2MwNGY3MDAsCi0weDQ0MTAyNSwgMHhhZjgyMDIyMCwgMHg4ZjgyMDIyMCwgMHgyNDAzZmZmZCwKLTB4NDMxMDI0LCAweGFmODIwMjIwLCAweDhmODIwMjIwLCAweDNjMDMwMzAwLAotMHg0MzEwMjQsIDB4MTQ0MDAwMDMsIDB4MCwgMHgxMDAwMDAwOCwKLTB4MTAyMSwgMHg4ZjgyMDIyMCwgMHgzNDQyMDAwMiwgMHhhZjgyMDIyMCwKLTB4OGY4MzAyMjAsIDB4MjQwMjAwMDEsIDB4NjQxODI1LCAweGFmODMwMjIwLAotMHgzZTAwMDA4LCAweDAsIDB4MjAyMSwgMHgzYzA1MDEwMCwKLTB4MjQwMjAwMDEsIDB4YWY4MDAyMWMsIDB4YWY4MjAyMDAsIDB4YWY4MjAyMjAsCi0weDI3NjI1MDAwLCAweGFmODIwMGMwLCAweDI3NjI1MDAwLCAweGFmODIwMGM0LAotMHgyNzYyNTAwMCwgMHhhZjgyMDBjOCwgMHgyNzYyNTAwMCwgMHhhZjgyMDBkMCwKLTB4Mjc2MjUwMDAsIDB4YWY4MjAwZDQsIDB4Mjc2MjUwMDAsIDB4YWY4MjAwZDgsCi0weDI3NjIzMDAwLCAweGFmODIwMGUwLCAweDI3NjIzMDAwLCAweGFmODIwMGU0LAotMHgyNzYyMzAwMCwgMHhhZjgyMDBlOCwgMHgyNzYyMjgwMCwgMHhhZjgyMDBmMCwKLTB4Mjc2MjI4MDAsIDB4YWY4MjAwZjQsIDB4Mjc2MjI4MDAsIDB4YWY4MjAwZjgsCi0weDQxOGMwLCAweDI0ODQwMDAxLCAweDM2MzEwMjEsIDB4YWM0NTMwMDQsCi0weDM2MzEwMjEsIDB4YWM0MDMwMDAsIDB4Mjg4MjAyMDAsIDB4MTQ0MGZmZjksCi0weDQxOGMwLCAweDIwMjEsIDB4NDE4YzAsIDB4MjQ4NDAwMDEsCi0weDM2MzEwMjEsIDB4YWM0MDI4MDQsIDB4MzYzMTAyMSwgMHhhYzQwMjgwMCwKLTB4Mjg4MjAxMDAsIDB4MTQ0MGZmZjksIDB4NDE4YzAsIDB4YWY4MDAyM2MsCi0weDI0MDMwMDgwLCAweDI0MDQwMTAwLCAweGFjNjAwMDAwLCAweDI0NjMwMDA0LAotMHg2NDEwMmIsIDB4NTQ0MGZmZmQsIDB4YWM2MDAwMDAsIDB4OGY4MzAwNDAsCi0weDNjMDJmMDAwLCAweDYyMTgyNCwgMHgzYzAyNTAwMCwgMHgxMDYyMDAwYywKLTB4NDMxMDJiLCAweDE0NDAwMDA2LCAweDNjMDI2MDAwLCAweDNjMDI0MDAwLAotMHgxMDYyMDAwOCwgMHgyNDAyMDgwMCwgMHgxMDAwMDAwOCwgMHgwLAotMHgxMDYyMDAwNCwgMHgyNDAyMDgwMCwgMHgxMDAwMDAwNCwgMHgwLAotMHgyNDAyMDcwMCwgMHgzYzAxMDAwMSwgMHhhYzIyNmRhYywgMHgzZTAwMDA4LAotMHgwLCAweDNjMDIwMDAxLCAweDhjNDI2ZGJjLCAweDI3YmRmZmQwLAotMHhhZmJmMDAyYywgMHhhZmIyMDAyOCwgMHhhZmIxMDAyNCwgMHhhZmIwMDAyMCwKLTB4M2MwMTAwMDEsIDB4MTA0MDAwMDUsIDB4YWMyMDZkOTQsIDB4YzAwNGQ5ZSwKLTB4MCwgMHgzYzAxMDAwMSwgMHhhYzIwNmRiYywgMHg4ZjgzMDA1NCwKLTB4OGY4MjAwNTQsIDB4MTAwMDAwMDIsIDB4MjQ2MzAwNjQsIDB4OGY4MjAwNTQsCi0weDYyMTAyMywgMHgyYzQyMDA2NSwgMHgxNDQwZmZmYywgMHgwLAotMHhjMDA0ZGI5LCAweDAsIDB4MjQwNDAwMDEsIDB4MjgyMSwKLTB4MjdhNjAwMTgsIDB4MzQwMjgwMDAsIDB4YzAwNDViZSwgMHhhN2EyMDAxOCwKLTB4OGY4MzAwNTQsIDB4OGY4MjAwNTQsIDB4MTAwMDAwMDIsIDB4MjQ2MzAwNjQsCi0weDhmODIwMDU0LCAweDYyMTAyMywgMHgyYzQyMDA2NSwgMHgxNDQwZmZmYywKLTB4MjQwNDAwMDEsIDB4MjQwNTAwMDEsIDB4YzAwNDU3YywgMHgyN2E2MDAxOCwKLTB4OGY4MzAwNTQsIDB4OGY4MjAwNTQsIDB4MTAwMDAwMDIsIDB4MjQ2MzAwNjQsCi0weDhmODIwMDU0LCAweDYyMTAyMywgMHgyYzQyMDA2NSwgMHgxNDQwZmZmYywKLTB4MjQwNDAwMDEsIDB4MjQwNTAwMDEsIDB4YzAwNDU3YywgMHgyN2E2MDAxOCwKLTB4OGY4MzAwNTQsIDB4OGY4MjAwNTQsIDB4MTAwMDAwMDIsIDB4MjQ2MzAwNjQsCi0weDhmODIwMDU0LCAweDYyMTAyMywgMHgyYzQyMDA2NSwgMHgxNDQwZmZmYywKLTB4MjQwNDAwMDEsIDB4M2MwNjAwMDEsIDB4MjRjNjZmMjQsIDB4YzAwNDU3YywKLTB4MjQwNTAwMDIsIDB4OGY4MzAwNTQsIDB4OGY4MjAwNTQsIDB4MTAwMDAwMDIsCi0weDI0NjMwMDY0LCAweDhmODIwMDU0LCAweDYyMTAyMywgMHgyYzQyMDA2NSwKLTB4MTQ0MGZmZmMsIDB4MjQwNDAwMDEsIDB4MjQwNTAwMDMsIDB4M2MxMDAwMDEsCi0weDI2MTA2ZjI2LCAweGMwMDQ1N2MsIDB4MjAwMzAyMSwgMHg5N2E2MDAxOCwKLTB4M2MwNzAwMDEsIDB4OTRlNzZmMjQsIDB4M2MwNDAwMDEsIDB4MjQ4NDZhZTAsCi0weGFmYTAwMDE0LCAweDk2MDIwMDAwLCAweDNjMDUwMDBkLCAweDM0YTUwMTAwLAotMHhjMDAyYjNiLCAweGFmYTIwMDEwLCAweDk3YTIwMDE4LCAweDEwNDAwMDRkLAotMHgyNDAzNjA0MCwgMHg5NjAyMDAwMCwgMHgzMDQyZmZmMCwgMHgxNDQzMDAwYywKLTB4MjQwMjAwMjAsIDB4M2MwMzAwMDEsIDB4OTQ2MzZmMjQsIDB4MTQ2MjAwMGIsCi0weDI0MDI3ODMwLCAweDI0MDIwMDAzLCAweDNjMDEwMDAxLCAweGFjMjI2ZDk0LAotMHgyNDAyMDAwNSwgMHgzYzAxMDAwMSwgMHgxMDAwMDAzZiwgMHhhYzIyNmYzNCwKLTB4M2MwMzAwMDEsIDB4OTQ2MzZmMjQsIDB4MjQwMjc4MzAsIDB4MTQ2MjAwMGMsCi0weDI0MDMwMDEwLCAweDNjMDIwMDAxLCAweDk0NDI2ZjI2LCAweDMwNDJmZmYwLAotMHgxNDQzMDAwNywgMHgyNDAyMDAwMywgMHgzYzAxMDAwMSwgMHhhYzIyNmQ5NCwKLTB4MjQwMjAwMDYsIDB4M2MwMTAwMDEsIDB4MTAwMDAwMmYsIDB4YWMyMjZmMzQsCi0weDNjMDIwMDAxLCAweDhjNDI2ZDk0LCAweDNjMDMwMDAxLCAweDk0NjM2ZjI0LAotMHgzNDQyMDAwMSwgMHgzYzAxMDAwMSwgMHhhYzIyNmQ5NCwgMHgyNDAyMDAxNSwKLTB4MTQ2MjAwMGIsIDB4MCwgMHgzYzAyMDAwMSwgMHg5NDQyNmYyNiwKLTB4MzA0MmZmZjAsIDB4Mzg0M2Y0MjAsIDB4MmM2MzAwMDEsIDB4Mzg0MmY0MzAsCi0weDJjNDIwMDAxLCAweDYyMTgyNSwgMHgxNDYwMDAxYiwgMHgyNDAyMDAwMywKLTB4M2MwMzAwMDEsIDB4OTQ2MzZmMjQsIDB4MjQwMjc4MTAsIDB4MTQ2MjAwMTYsCi0weDI0MDIwMDAyLCAweDNjMDIwMDAxLCAweDk0NDI2ZjI2LCAweDMwNDJmZmYwLAotMHgxNDQwMDAxMSwgMHgyNDAyMDAwMiwgMHgxMDAwMDAwZiwgMHgyNDAyMDAwNCwKLTB4M2MwMjAwMDEsIDB4OGM0MjZkOTQsIDB4MzQ0MjAwMDgsIDB4M2MwMTAwMDEsCi0weGFjMjI2ZDk0LCAweDEwMDAwMDVlLCAweDI0MDIwMDA0LCAweDNjMDIwMDAxLAotMHg4YzQyNmQ5NCwgMHgzNDQyMDAwNCwgMHgzYzAxMDAwMSwgMHgxMDAwMDBhZiwKLTB4YWMyMjZkOTQsIDB4MjQwMjAwMDEsIDB4M2MwMTAwMDEsIDB4YWMyMjZmNDAsCi0weDNjMDIwMDAxLCAweDhjNDI2ZDk0LCAweDMwNDIwMDAyLCAweDE0NDAwMGIyLAotMHgzYzA5ZmZmMCwgMHgyNDAyMGUwMCwgMHhhZjgyMDIzOCwgMHg4Zjg0MDA1NCwKLTB4OGY4MjAwNTQsIDB4MjQwMzAwMDgsIDB4M2MwMTAwMDEsIDB4YWMyMzZkOTgsCi0weDEwMDAwMDAyLCAweDI0ODQwMWY0LCAweDhmODIwMDU0LCAweDgyMTAyMywKLTB4MmM0MjAxZjUsIDB4MTQ0MGZmZmMsIDB4M2MwMjAwYzgsIDB4MzQ0MjAxZmIsCi0weGFmODIwMjM4LCAweDhmODMwMDU0LCAweDhmODIwMDU0LCAweDEwMDAwMDAyLAotMHgyNDYzMDFmNCwgMHg4ZjgyMDA1NCwgMHg2MjEwMjMsIDB4MmM0MjAxZjUsCi0weDE0NDBmZmZjLCAweDgwMjEsIDB4MjQxMjAwMDEsIDB4MjQxMTAwMDksCi0weGMwMDQ0ODIsIDB4MCwgMHgzYzAxMDAwMSwgMHhhYzMyNmRiNCwKLTB4YzAwNDU0NywgMHgwLCAweDNjMDIwMDAxLCAweDhjNDI2ZGI0LAotMHgxNDUxZmZmYiwgMHgzYzAyMDBjOCwgMHgzNDQyMDFmNiwgMHhhZjgyMDIzOCwKLTB4OGY4MzAwNTQsIDB4OGY4MjAwNTQsIDB4MTAwMDAwMDIsIDB4MjQ2MzAwMGEsCi0weDhmODIwMDU0LCAweDYyMTAyMywgMHgyYzQyMDAwYiwgMHgxNDQwZmZmYywKLTB4MCwgMHg4ZjgyMDIyMCwgMHgyNDA0MDAwMSwgMHgzNDQyMDAwMiwKLTB4YWY4MjAyMjAsIDB4OGY4MzAyMDAsIDB4MjQwNTdmZmYsIDB4MjQwMmZmZmQsCi0weDYyMTgyNCwgMHhhZjgzMDIwMCwgMHhhZjg0MDIwNCwgMHg4ZjgzMDA1NCwKLTB4OGY4MjAwNTQsIDB4MTAwMDAwMDIsIDB4MjQ2MzAwMDEsIDB4OGY4MjAwNTQsCi0weDYyMTAyMywgMHgyYzQyMDAwMiwgMHgxNDQwZmZmYywgMHgwLAotMHg4ZjgyMDIyNCwgMHgxNDQ0MDAwNSwgMHgzNDAyODAwMCwgMHg0MjA0MCwKLTB4YTQxMDJiLCAweDEwNDBmZmYwLCAweDM0MDI4MDAwLCAweDEwODJmZmEwLAotMHgyNjEwMDAwMSwgMHgyZTAyMDAxNCwgMHgxNDQwZmZjZCwgMHgyNDAyMDAwNCwKLTB4M2MwMTAwMDEsIDB4YWMyMjZkOTgsIDB4ODAyMSwgMHgyNDEyMDAwOSwKLTB4M2MxMWZmZmYsIDB4MzYzMTNmN2YsIDB4YzAwNDQ4MiwgMHgwLAotMHgyNDAyMDAwMSwgMHgzYzAxMDAwMSwgMHhhYzIyNmRiNCwgMHhjMDA0NTQ3LAotMHgwLCAweDNjMDIwMDAxLCAweDhjNDI2ZGI0LCAweDE0NTJmZmZiLAotMHgwLCAweDhmODIwMDQ0LCAweDUxMTAyNCwgMHgzNDQyNTA4MCwKLTB4YWY4MjAwNDQsIDB4OGY4MzAwNTQsIDB4OGY4MjAwNTQsIDB4MTAwMDAwMDIsCi0weDI0NjMwMDBhLCAweDhmODIwMDU0LCAweDYyMTAyMywgMHgyYzQyMDAwYiwKLTB4MTQ0MGZmZmMsIDB4MCwgMHg4ZjgyMDA0NCwgMHg1MTEwMjQsCi0weDM0NDJmMDgwLCAweGFmODIwMDQ0LCAweDhmODMwMDU0LCAweDhmODIwMDU0LAotMHgxMDAwMDAwMiwgMHgyNDYzMDAwYSwgMHg4ZjgyMDA1NCwgMHg2MjEwMjMsCi0weDJjNDIwMDBiLCAweDE0NDBmZmZjLCAweDAsIDB4OGY4MjAyMjAsCi0weDNjMDNmNzAwLCAweDQzMTAyNSwgMHhhZjgyMDIyMCwgMHg4ZjgzMDA1NCwKLTB4OGY4MjAwNTQsIDB4MTAwMDAwMDIsIDB4MjQ2MzAwNjQsIDB4OGY4MjAwNTQsCi0weDYyMTAyMywgMHgyYzQyMDA2NSwgMHgxNDQwZmZmYywgMHgwLAotMHg4ZjgyMDIyMCwgMHgyNDA0MDAwMSwgMHgzNDQyMDAwMiwgMHhhZjgyMDIyMCwKLTB4OGY4MzAyMDAsIDB4MjQwNTdmZmYsIDB4MjQwMmZmZmQsIDB4NjIxODI0LAotMHhhZjgzMDIwMCwgMHhhZjg0MDIwNCwgMHg4ZjgzMDA1NCwgMHg4ZjgyMDA1NCwKLTB4MTAwMDAwMDIsIDB4MjQ2MzAwMDEsIDB4OGY4MjAwNTQsIDB4NjIxMDIzLAotMHgyYzQyMDAwMiwgMHgxNDQwZmZmYywgMHgwLCAweDhmODIwMjI0LAotMHgxNDQ0MDAwNSwgMHgzNDAyODAwMCwgMHg0MjA0MCwgMHhhNDEwMmIsCi0weDEwNDBmZmYwLCAweDM0MDI4MDAwLCAweDEwODJmZjUwLCAweDI2MTAwMDAxLAotMHgyZTAyMDA2NCwgMHgxNDQwZmZiMCwgMHgwLCAweDNjMDIwMDAxLAotMHg4YzQyNmQ5NCwgMHgzMDQyMDAwNCwgMHgxNDQwMDAwNywgMHgzYzA5ZmZmMCwKLTB4OGY4MjAwNDQsIDB4M2MwM2ZmZmYsIDB4MzQ2MzNmN2YsIDB4NDMxMDI0LAotMHhhZjgyMDA0NCwgMHgzYzA5ZmZmMCwgMHgzNTI5YmRjMCwgMHgzYzA2MDAwMSwKLTB4OGNjNjZkOTQsIDB4M2MwNDAwMDEsIDB4MjQ4NDZhZTAsIDB4MjQwMjAwMDEsCi0weDNjMDEwMDAxLCAweGFjMjI2ZDljLCAweDhmODIwMDU0LCAweDNjMDcwMDAxLAotMHg4Y2U3NmY0MCwgMHgzYzAzMDAwMSwgMHg5NDYzNmYyNCwgMHgzYzA4MDAwMSwKLTB4OTUwODZmMjYsIDB4M2MwNTAwMGQsIDB4MzRhNTAxMDAsIDB4M2MwMTAwMDEsCi0weGFjMjA2ZDk4LCAweDQ5MTAyMSwgMHgzYzAxMDAwMSwgMHhhYzIyNmYzMCwKLTB4YWZhMzAwMTAsIDB4YzAwMmIzYiwgMHhhZmE4MDAxNCwgMHg4ZmJmMDAyYywKLTB4OGZiMjAwMjgsIDB4OGZiMTAwMjQsIDB4OGZiMDAwMjAsIDB4M2UwMDAwOCwKLTB4MjdiZDAwMzAsIDB4MjdiZGZmZTgsIDB4M2MwNTAwMDEsIDB4OGNhNTZkOTgsCi0weDI0MDYwMDA0LCAweDI0MDIwMDAxLCAweDE0YTIwMDE0LCAweGFmYmYwMDEwLAotMHgzYzAyMDAwMiwgMHg4YzQyOGZmYywgMHgzMDQyODAwMCwgMHgxMDQwMDAwNSwKLTB4M2MwNDAwMGYsIDB4M2MwMzAwMDEsIDB4OGM2MzZmNDAsIDB4MTAwMDAwMDUsCi0weDM0ODQ0MjQwLCAweDNjMDQwMDA0LCAweDNjMDMwMDAxLCAweDhjNjM2ZjQwLAotMHgzNDg0OTNlMCwgMHgyNDAyMDAwNSwgMHgxNDYyMDAxNiwgMHgwLAotMHgzYzA0MDAzZCwgMHgxMDAwMDAxMywgMHgzNDg0MDkwMCwgMHgzYzAyMDAwMiwKLTB4OGM0MjhmZjgsIDB4MzA0MjgwMDAsIDB4MTA0MDAwMDUsIDB4M2MwNDAwMWUsCi0weDNjMDMwMDAxLCAweDhjNjM2ZjQwLCAweDEwMDAwMDA1LCAweDM0ODQ4NDgwLAotMHgzYzA0MDAwZiwgMHgzYzAzMDAwMSwgMHg4YzYzNmY0MCwgMHgzNDg0NDI0MCwKLTB4MjQwMjAwMDUsIDB4MTQ2MjAwMDMsIDB4MCwgMHgzYzA0MDA3YSwKLTB4MzQ4NDEyMDAsIDB4M2MwMjAwMDEsIDB4OGM0MjZmMzAsIDB4OGY4MzAwNTQsCi0weDQ0MTAyMSwgMHg0MzEwMjMsIDB4NDQxMDJiLCAweDE0NDAwMDRjLAotMHgwLCAweDNjMDIwMDAxLCAweDhjNDI2ZGEwLCAweDE0NDAwMDQ4LAotMHgwLCAweDNjMDEwMDAxLCAweDEwYzAwMDI1LCAweGFjMjA2ZGIwLAotMHgzYzA5MDAwMSwgMHg4ZDI5NmQ5NCwgMHgyNDA3MDAwMSwgMHgzYzA0NDAwMCwKLTB4M2MwODAwMDIsIDB4MjUwODhmZmMsIDB4MjUwYWZmZmMsIDB4NTI4NDIsCi0weDE0YTAwMDAyLCAweDI0YzZmZmZmLCAweDI0MDUwMDA4LCAweGE5MTAyNCwKLTB4MTA0MDAwMTAsIDB4MCwgMHgxNGE3MDAwOCwgMHgwLAotMHg4ZDAyMDAwMCwgMHg0NDEwMjQsIDB4MTA0MDAwMGEsIDB4MCwKLTB4M2MwMTAwMDEsIDB4MTAwMDAwMDcsIDB4YWMyNTZkYjAsIDB4OGQ0MjAwMDAsCi0weDQ0MTAyNCwgMHgxMDQwMDAwMywgMHgwLCAweDNjMDEwMDAxLAotMHhhYzI3NmRiMCwgMHgzYzAyMDAwMSwgMHg4YzQyNmRiMCwgMHg2MTgyYiwKLTB4MmM0MjAwMDEsIDB4NDMxMDI0LCAweDU0NDBmZmU1LCAweDUyODQyLAotMHg4ZjgyMDA1NCwgMHgzYzAzMDAwMSwgMHg4YzYzNmRiMCwgMHgzYzAxMDAwMSwKLTB4YWMyMjZmMzAsIDB4MTA2MDAwM2IsIDB4MjQwMjAwMDUsIDB4M2MwMzAwMDEsCi0weDhjNjM2ZjQwLCAweDNjMDEwMDAxLCAweGFjMjU2ZDk4LCAweDE0NjIwMDEyLAotMHgyNDAyMDAwMSwgMHgzYzAyMDAwMiwgMHg4YzQyOGZmOCwgMHgzYzAzMjAwMCwKLTB4MzQ2MzUwMDAsIDB4NDMxMDI0LCAweDE0NDAwMDA2LCAweDI0MDIwMDAxLAotMHgzYzAxMDAwMSwgMHhhYzIwNmYxYywgMHgzYzAxMDAwMSwgMHhhYzIyNmQ5OCwKLTB4MjQwMjAwMDEsIDB4M2MwMTAwMDEsIDB4YWMyMjZlMjQsIDB4M2MwMTAwMDEsCi0weGFjMjI2ZGE0LCAweDI0MDIwMDAxLCAweDNjMDEwMDAxLCAweGFjMjI2ZDljLAotMHgzYzAyMDAwMSwgMHg4YzQyNmRiMCwgMHgxMDQwMDAxZSwgMHgwLAotMHgzYzAyMDAwMSwgMHg4YzQyNmQ5YywgMHgxMDQwMDAwOCwgMHgyNDAyMDAwMSwKLTB4M2MwMTAwMDEsIDB4YWMyMDZkOWMsIDB4YWVlMjA0YjgsIDB4M2MwMTAwMDEsCi0weGFjMjA2ZTFjLCAweDNjMDEwMDAxLCAweGFjMjI2ZGQ0LCAweDhlZTMwNGI4LAotMHgyNDAyMDAwOCwgMHgxMDYyMDAwNSwgMHgyNDAyMDAwMSwgMHhjMDA0MjM5LAotMHgwLCAweDEwMDAwMDBiLCAweDAsIDB4M2MwMzAwMDEsCi0weDhjNjM2ZDk4LCAweDEwNjIwMDA3LCAweDI0MDIwMDBlLCAweDNjMDMwMDAyLAotMHg4YzYzOGY5MCwgMHgxMDYyMDAwMywgMHgwLCAweGMwMDRlOWMsCi0weDhmODQwMjIwLCAweDhmYmYwMDEwLCAweDNlMDAwMDgsIDB4MjdiZDAwMTgsCi0weDI3YmRmZmUwLCAweDNjMDNmZGZmLCAweDNjMDQwMDAxLCAweDhjODQ2ZDk4LAotMHgzYzAyMDAwMSwgMHg4YzQyNmRjMCwgMHgzNDYzZmZmZiwgMHgyODNhMDI0LAotMHgxNDgyMDAwNiwgMHhhZmJmMDAxOCwgMHg4ZWUzMDRiOCwgMHgzYzAyMDAwMSwKLTB4OGM0MjZkYzQsIDB4MTA2MjAwMDYsIDB4MCwgMHg4ZWUyMDRiOCwKLTB4M2MwMTAwMDEsIDB4YWMyNDZkYzAsIDB4M2MwMTAwMDEsIDB4YWMyMjZkYzQsCi0weDNjMDMwMDAxLCAweDhjNjM2ZDk4LCAweDI0MDIwMDAyLCAweDEwNjIwMTljLAotMHgyYzYyMDAwMywgMHgxMDQwMDAwNSwgMHgyNDAyMDAwMSwgMHgxMDYyMDAwYSwKLTB4MCwgMHgxMDAwMDIyNiwgMHgwLCAweDI0MDIwMDA0LAotMHgxMDYyMDBiNiwgMHgyNDAyMDAwOCwgMHgxMDYyMDEwYSwgMHgyNDAyMDAwMSwKLTB4MTAwMDAyMWYsIDB4MCwgMHg4ZWUyMDRiOCwgMHgyNDQzZmZmZiwKLTB4MmM2MjAwMDgsIDB4MTA0MDAyMWMsIDB4MzEwODAsIDB4M2MwMTAwMDEsCi0weDIyMDgyMSwgMHg4YzIyNmFmOCwgMHg0MDAwMDgsIDB4MCwKLTB4M2MwMzAwMDEsIDB4OGM2MzZmNDAsIDB4MjQwMjAwMDUsIDB4MTQ2MjAwMTAsCi0weDAsIDB4M2MwMjAwMDEsIDB4OGM0MjZkYTQsIDB4MTA0MDAwMDgsCi0weDI0MDIwMDAzLCAweGMwMDQ0ODIsIDB4MCwgMHgyNDAyMDAwMiwKLTB4YWVlMjA0YjgsIDB4M2MwMTAwMDEsIDB4MTAwMDAwMDIsIDB4YWMyMDZkYTQsCi0weGFlZTIwNGI4LCAweDNjMDEwMDAxLCAweDEwMDAwMjAzLCAweGFjMjA2ZDMwLAotMHhjMDA0NDgyLCAweDAsIDB4M2MwMjAwMDEsIDB4OGM0MjZkYTQsCi0weDNjMDEwMDAxLCAweGFjMjA2ZDMwLCAweDE0NDAwMTdhLCAweDI0MDIwMDAyLAotMHgxMDAwMDE5ZCwgMHgyNDAyMDAwNywgMHgzYzAzMDAwMSwgMHg4YzYzNmY0MCwKLTB4MjQwMjAwMDUsIDB4MTQ2MjAwMDMsIDB4MjQwMjAwMDEsIDB4M2MwMTAwMDEsCi0weGFjMjI2ZGQwLCAweGMwMDQ1ZmYsIDB4MCwgMHgzYzAzMDAwMSwKLTB4OGM2MzZkZDAsIDB4MTAwMDAxNzQsIDB4MjQwMjAwMTEsIDB4M2MwNTAwMDEsCi0weDhjYTU2ZDk4LCAweDNjMDYwMDAyLCAweDhjYzY4ZmZjLCAweGMwMDUxMDQsCi0weDIwMjEsIDB4MjQwMjAwMDUsIDB4M2MwMTAwMDEsIDB4YWMyMDZkYTQsCi0weDEwMDAwMWUxLCAweGFlZTIwNGI4LCAweDNjMDQwMDAxLCAweDI0ODQ2YWVjLAotMHgzYzA1MDAwZiwgMHgzNGE1MDEwMCwgMHgzMDIxLCAweDM4MjEsCi0weGFmYTAwMDEwLCAweGMwMDJiM2IsIDB4YWZhMDAwMTQsIDB4MTAwMDAxZDYsCi0weDAsIDB4OGY4MjAyMjAsIDB4M2MwMzAwMDQsIDB4NDMxMDI0LAotMHgxNDQwMDE3NSwgMHgyNDAyMDAwNywgMHg4ZjgzMDA1NCwgMHgzYzAyMDAwMSwKLTB4OGM0MjZmMjgsIDB4MjQ2M2Q4ZjAsIDB4NDMxMDIzLCAweDJjNDIyNzEwLAotMHgxNDQwMDAwMywgMHgyNDAyMDAwMSwgMHgzYzAxMDAwMSwgMHhhYzIyNmQ5YywKLTB4M2MwMjAwMDIsIDB4OGM0MjhmZmMsIDB4MzA0MjUwMDAsIDB4MTA0MDAxYzIsCi0weDAsIDB4OGY4MjAyMjAsIDB4MzA0MjgwMDAsIDB4MTA0MDAxN2QsCi0weDAsIDB4MTAwMDAxNzUsIDB4MCwgMHgzYzA1MDAwMSwKLTB4OGNhNTZkOTgsIDB4YzAwNTI5YiwgMHgyMDIxLCAweGMwMDU1MWIsCi0weDIwMjEsIDB4M2MwMzAwMDIsIDB4OGM2MzhmZjQsIDB4NDYxMDFiMCwKLTB4MjQwMjAwMDEsIDB4M2MwMjAwMDgsIDB4NjIxMDI0LCAweDEwNDAwMDA2LAotMHgwLCAweDhmODIwMjE0LCAweDNjMDNmZmZmLCAweDQzMTAyNCwKLTB4MTAwMDAwMDUsIDB4MzQ0MjI1MWYsIDB4OGY4MjAyMTQsIDB4M2MwM2ZmZmYsCi0weDQzMTAyNCwgMHgzNDQyMjQxZiwgMHhhZjgyMDIxNCwgMHg4ZjgyMDIyMCwKLTB4M2MwMzAyMDAsIDB4MzQ0MjAwMDIsIDB4YWY4MjAyMjAsIDB4MjQwMjAwMDgsCi0weGFlZTIwNGI4LCAweDhmODIwMjIwLCAweDI4M2EwMjUsIDB4M2MwMzAwMDQsCi0weDQzMTAyNCwgMHgxNDQwMDAxNiwgMHgwLCAweDNjMDIwMDAyLAotMHg4YzQyOGZmYywgMHgzMDQyNTAwMCwgMHgxMDQwMDAwZCwgMHgwLAotMHg4ZjgyMDIyMCwgMHgzMDQyODAwMCwgMHgxMDQwMDAwNiwgMHgwLAotMHg4ZjgyMDIyMCwgMHgzYzAzZmZmZiwgMHgzNDYzN2ZmZiwgMHgxMDAwMDAwMywKLTB4NDMxMDI0LCAweDhmODIwMjIwLCAweDM0NDI4MDAwLCAweGFmODIwMjIwLAotMHg4ZjgyMDIyMCwgMHgzYzAzZjcwMCwgMHg0MzEwMjUsIDB4YWY4MjAyMjAsCi0weDNjMDMwMDAxLCAweDhjNjM2ZjQwLCAweDI0MDIwMDA1LCAweDE0NjIwMDBhLAotMHgwLCAweDNjMDIwMDAxLCAweDk0NDI2ZjI2LCAweDI0NDI5ZmJjLAotMHgyYzQyMDAwNCwgMHgxMDQwMDAwNCwgMHgyNDA0MDAxOCwgMHgyNDA1MDAwMiwKLTB4YzAwNGRkYiwgMHgyNDA2MDAyMCwgMHhjMDAzZTZkLCAweDAsCi0weDNjMDEwMDAxLCAweDEwMDAwMTcwLCAweGFjMjA2ZTIwLCAweDhlZTIwNGI4LAotMHgyNDQzZmZmZiwgMHgyYzYyMDAwOCwgMHgxMDQwMDE2YiwgMHgzMTA4MCwKLTB4M2MwMTAwMDEsIDB4MjIwODIxLCAweDhjMjI2YjE4LCAweDQwMDAwOCwKLTB4MCwgMHhjMDA0NTQ3LCAweDAsIDB4M2MwMzAwMDEsCi0weDhjNjM2ZGI0LCAweDEwMDAwMGU4LCAweDI0MDIwMDA5LCAweDNjMDIwMDAyLAotMHg4YzQyOGZmOCwgMHgzMDQyNDAwMCwgMHgxMDQwMDAwNCwgMHgwLAotMHg4ZjgyMDA0NCwgMHgxMDAwMDAwNiwgMHgzNDQyZjA4MCwgMHg4ZjgyMDA0NCwKLTB4M2MwM2ZmZmYsIDB4MzQ2MzNmN2YsIDB4NDMxMDI0LCAweDM0NDJhMDgwLAotMHhhZjgyMDA0NCwgMHg4ZjgzMDA1NCwgMHgxMDAwMDBlYSwgMHgyNDAyMDAwNCwKLTB4OGY4MzAwNTQsIDB4M2MwMjAwMDEsIDB4OGM0MjZmMjgsIDB4MjQ2M2Q4ZjAsCi0weDQzMTAyMywgMHgyYzQyMjcxMCwgMHgxNDQwMDE0NywgMHgyNDAyMDAwNSwKLTB4MTAwMDAwZDgsIDB4MCwgMHg4ZjgyMDIyMCwgMHgzYzAzZjcwMCwKLTB4NDMxMDI1LCAweGFmODIwMjIwLCAweGFmODAwMjA0LCAweDNjMDEwMDAyLAotMHgxMDAwMDBkNiwgMHhhYzIwOGZlMCwgMHg4ZjgzMDA1NCwgMHgzYzAyMDAwMSwKLTB4OGM0MjZmMjgsIDB4MjQ2M2ZmZjYsIDB4NDMxMDIzLCAweDJjNDIwMDBhLAotMHgxNDQwMDEzNSwgMHgyNDAyMDAwNywgMHgxMDAwMDBkNywgMHgwLAotMHhjMDAzZjUwLCAweDAsIDB4MTA0MDAxMmQsIDB4MjQwMjAwMDEsCi0weDhmODIwMjE0LCAweDNjMDNmZmZmLCAweDNjMDQwMDAxLCAweDhjODQ2ZjFjLAotMHg0MzEwMjQsIDB4MzQ0MjI1MWYsIDB4YWY4MjAyMTQsIDB4MjQwMjAwMDgsCi0weDEwODAwMDA1LCAweGFlZTIwNGI4LCAweDNjMDIwMDAxLCAweDhjNDI2ZTQ0LAotMHgxMDQwMDA2NCwgMHgyNDAyMDAwMSwgMHg4ZjgyMDIyMCwgMHgzYzAzMDAwOCwKLTB4NDMxMDI0LCAweDEwNDAwMDZhLCAweDNjMDIwMjAwLCAweDEwMDAwMDc4LAotMHgwLCAweDhlZTIwNGI4LCAweDI0NDNmZmZmLCAweDJjNjIwMDA3LAotMHgxMDQwMDExNSwgMHgzMTA4MCwgMHgzYzAxMDAwMSwgMHgyMjA4MjEsCi0weDhjMjI2YjM4LCAweDQwMDAwOCwgMHgwLCAweGMwMDNkYWYsCi0weDAsIDB4M2MwMTAwMDEsIDB4YWMyMDZkOWMsIDB4YWY4MDAyMDQsCi0weDNjMDEwMDAyLCAweGMwMDQ0ODIsIDB4YWMyMDhmZTAsIDB4MjQwMjAwMDEsCi0weDNjMDEwMDAxLCAweGFjMjI2ZGI0LCAweDI0MDIwMDAyLCAweDEwMDAwMTAyLAotMHhhZWUyMDRiOCwgMHhjMDA0NTQ3LCAweDAsIDB4M2MwMzAwMDEsCi0weDhjNjM2ZGI0LCAweDEwMDAwMDg0LCAweDI0MDIwMDA5LCAweDNjMDIwMDAyLAotMHg4YzQyOGZmOCwgMHgzMDQyNDAwMCwgMHgxMDQwMDAwMywgMHgzYzAyMDBjOCwKLTB4MTAwMDAwMDIsIDB4MzQ0MjAxZjYsIDB4MzQ0MjAxZmUsIDB4YWY4MjAyMzgsCi0weDhmODMwMDU0LCAweDEwMDAwMDhiLCAweDI0MDIwMDA0LCAweDhmODMwMDU0LAotMHgzYzAyMDAwMSwgMHg4YzQyNmYyOCwgMHgyNDYzZDhmMCwgMHg0MzEwMjMsCi0weDJjNDIyNzEwLCAweDE0NDAwMGU4LCAweDI0MDIwMDA1LCAweDEwMDAwMDc5LAotMHgwLCAweDhmODIwMjIwLCAweDNjMDNmNzAwLCAweDQzMTAyNSwKLTB4YWY4MjAyMjAsIDB4YWY4MDAyMDQsIDB4M2MwMTAwMDIsIDB4MTAwMDAwNzcsCi0weGFjMjA4ZmUwLCAweDhmODMwMDU0LCAweDNjMDIwMDAxLCAweDhjNDI2ZjI4LAotMHgyNDYzZmZmNiwgMHg0MzEwMjMsIDB4MmM0MjAwMGEsIDB4MTQ0MDAwZDYsCi0weDI0MDIwMDA3LCAweDEwMDAwMDc4LCAweDAsIDB4YzAwM2Y1MCwKLTB4MCwgMHgxMDQwMDBjZSwgMHgyNDAyMDAwMSwgMHg4ZjgyMDIxNCwKLTB4M2MwM2ZmZmYsIDB4M2MwNDAwMDEsIDB4OGM4NDZmMWMsIDB4NDMxMDI0LAotMHgzNDQyMjUxZiwgMHhhZjgyMDIxNCwgMHgyNDAyMDAwOCwgMHgxMDgwMDAwZiwKLTB4YWVlMjA0YjgsIDB4M2MwMjAwMDEsIDB4OGM0MjZlNDQsIDB4MTQ0MDAwMGIsCi0weDAsIDB4OGY4MjAyMjAsIDB4MzQ0MjAwMDIsIDB4YWY4MjAyMjAsCi0weDI0MDIwMDAxLCAweDNjMDEwMDAyLCAweGFjMjI4ZjkwLCAweGMwMDRlOWMsCi0weDhmODQwMjIwLCAweDEwMDAwMDE2LCAweDAsIDB4OGY4MjAyMjAsCi0weDNjMDMwMDA4LCAweDQzMTAyNCwgMHgxNDQwMDAxMSwgMHgzYzAyMDIwMCwKLTB4MjgyYTAyNSwgMHgyNDAyMDAwZSwgMHgzYzAxMDAwMiwgMHhhYzIyOGY5MCwKLTB4YzAwNTUxYiwgMHgyMDIxLCAweDhmODIwMjIwLCAweDM0NDIwMDAyLAotMHhjMDAzZTZkLCAweGFmODIwMjIwLCAweDNjMDUwMDAxLCAweDhjYTU2ZDk4LAotMHhjMDA1MjliLCAweDIwMjEsIDB4MTAwMDAwYTMsIDB4MCwKLTB4M2MwMjAwMDEsIDB4OGM0MjZlNDQsIDB4MTA0MDAwOWYsIDB4MCwKLTB4M2MwMjAwMDEsIDB4OGM0MjZlNDAsIDB4MjQ0MmZmZmYsIDB4M2MwMTAwMDEsCi0weGFjMjI2ZTQwLCAweDE0NDAwMDk4LCAweDI0MDIwMDAyLCAweDNjMDEwMDAxLAotMHhhYzIwNmU0NCwgMHgzYzAxMDAwMSwgMHgxMDAwMDA5MywgMHhhYzIyNmU0MCwKLTB4OGVlMjA0YjgsIDB4MjQ0M2ZmZmYsIDB4MmM2MjAwMDcsIDB4MTA0MDAwOGUsCi0weDMxMDgwLCAweDNjMDEwMDAxLCAweDIyMDgyMSwgMHg4YzIyNmI1OCwKLTB4NDAwMDA4LCAweDAsIDB4M2MwMjAwMDEsIDB4OGM0MjZkYTQsCi0weDEwNDAwMDE4LCAweDI0MDIwMDA1LCAweGMwMDQ0ODIsIDB4MCwKLTB4MjQwMjAwMDIsIDB4YWVlMjA0YjgsIDB4M2MwMTAwMDEsIDB4MTAwMDAwN2UsCi0weGFjMjA2ZGE0LCAweGMwMDQ5NjMsIDB4MCwgMHgzYzAzMDAwMSwKLTB4OGM2MzZkZDQsIDB4MjQwMjAwMDYsIDB4MTQ2MjAwNzcsIDB4MjQwMjAwMDMsCi0weDEwMDAwMDc1LCAweGFlZTIwNGI4LCAweDNjMDUwMDAxLCAweDhjYTU2ZDk4LAotMHgzYzA2MDAwMiwgMHg4Y2M2OGZmOCwgMHhjMDA1MTA0LCAweDIwMjEsCi0weDI0MDIwMDA1LCAweDEwMDAwMDZjLCAweGFlZTIwNGI4LCAweDhmODIwMjIwLAotMHgzYzAzZjcwMCwgMHg0MzEwMjUsIDB4YWY4MjAyMjAsIDB4OGY4MzAwNTQsCi0weDI0MDIwMDA2LCAweGFlZTIwNGI4LCAweDNjMDEwMDAxLCAweDEwMDAwMDYyLAotMHhhYzIzNmYyOCwgMHg4ZjgyMDIyMCwgMHgzYzAzMDAwNCwgMHg0MzEwMjQsCi0weDEwNDAwMDAzLCAweDI0MDIwMDA3LCAweDEwMDAwMDViLCAweGFlZTIwNGI4LAotMHg4ZjgzMDA1NCwgMHgzYzAyMDAwMSwgMHg4YzQyNmYyOCwgMHgyNDYzZDhmMCwKLTB4NDMxMDIzLCAweDJjNDIyNzEwLCAweDE0NDAwMDAzLCAweDI0MDIwMDAxLAotMHgzYzAxMDAwMSwgMHhhYzIyNmQ5YywgMHgzYzAyMDAwMiwgMHg4YzQyOGZmOCwKLTB4MzA0MjUwMDAsIDB4MTA0MDAwNGMsIDB4MCwgMHg4ZjgyMDIyMCwKLTB4MzA0MjgwMDAsIDB4MTA0MDAwMDcsIDB4MCwgMHg4ZjgyMDIyMCwKLTB4M2MwM2ZmZmYsIDB4MzQ2MzdmZmYsIDB4NDMxMDI0LCAweDEwMDAwMDQyLAotMHhhZjgyMDIyMCwgMHg4ZjgyMDIyMCwgMHgzNDQyODAwMCwgMHgxMDAwMDAzZSwKLTB4YWY4MjAyMjAsIDB4M2MwNTAwMDEsIDB4OGNhNTZkOTgsIDB4YzAwNTI5YiwKLTB4MjAyMSwgMHhjMDA1NTFiLCAweDIwMjEsIDB4M2MwMjAwMDIsCi0weDhjNDI4ZmYwLCAweDQ0MTAwMzIsIDB4MjQwMjAwMDEsIDB4OGY4MjAyMTQsCi0weDNjMDNmZmZmLCAweDQzMTAyNCwgMHgzNDQyMjUxZiwgMHhhZjgyMDIxNCwKLTB4MjQwMjAwMDgsIDB4YWVlMjA0YjgsIDB4OGY4MjAyMjAsIDB4MzQ0MjAwMDIsCi0weGFmODIwMjIwLCAweDhmODIwMjIwLCAweDNjMDMwMDA0LCAweDQzMTAyNCwKLTB4MTQ0MDAwMTYsIDB4MCwgMHgzYzAyMDAwMiwgMHg4YzQyOGZmOCwKLTB4MzA0MjUwMDAsIDB4MTA0MDAwMGQsIDB4MCwgMHg4ZjgyMDIyMCwKLTB4MzA0MjgwMDAsIDB4MTA0MDAwMDYsIDB4MCwgMHg4ZjgyMDIyMCwKLTB4M2MwM2ZmZmYsIDB4MzQ2MzdmZmYsIDB4MTAwMDAwMDMsIDB4NDMxMDI0LAotMHg4ZjgyMDIyMCwgMHgzNDQyODAwMCwgMHhhZjgyMDIyMCwgMHg4ZjgyMDIyMCwKLTB4M2MwM2Y3MDAsIDB4NDMxMDI1LCAweGFmODIwMjIwLCAweDNjMDIwMDAxLAotMHg5NDQyNmYyNiwgMHgyNDQyOWZiYywgMHgyYzQyMDAwNCwgMHgxMDQwMDAwNCwKLTB4MjQwNDAwMTgsIDB4MjQwNTAwMDIsIDB4YzAwNGRkYiwgMHgyNDA2MDAyMCwKLTB4YzAwM2U2ZCwgMHgwLCAweDEwMDAwMDAzLCAweDAsCi0weDNjMDEwMDAxLCAweGFjMjI2ZDljLCAweDhmYmYwMDE4LCAweDNlMDAwMDgsCi0weDI3YmQwMDIwLCAweDhmODIwMjAwLCAweDhmODIwMjIwLCAweDhmODIwMjIwLAotMHgzNDQyMDAwNCwgMHhhZjgyMDIyMCwgMHg4ZjgyMDIwMCwgMHgzYzA1MDAwMSwKLTB4OGNhNTZkOTgsIDB4MzQ0MjAwMDQsIDB4YWY4MjAyMDAsIDB4MjQwMjAwMDIsCi0weDEwYTIwMDRiLCAweDJjYTIwMDAzLCAweDEwNDAwMDA1LCAweDI0MDIwMDAxLAotMHgxMGEyMDAwYSwgMHgwLCAweDEwMDAwMGIxLCAweDAsCi0weDI0MDIwMDA0LCAweDEwYTIwMDcyLCAweDI0MDIwMDA4LCAweDEwYTIwMDg1LAotMHgzYzAyZjBmZiwgMHgxMDAwMDBhYSwgMHgwLCAweDhmODMwMDUwLAotMHgzYzAyZjBmZiwgMHgzNDQyZmZmZiwgMHgzYzA0MDAwMSwgMHg4Yzg0NmY0MCwKLTB4NjIxODI0LCAweDNjMDIwNzAwLCAweDYyMTgyNSwgMHgyNDAyMGUwMCwKLTB4MjQ4NGZmZmIsIDB4MmM4NDAwMDIsIDB4YWY4MzAwNTAsIDB4YWY4NTAyMDAsCi0weGFmODUwMjIwLCAweDE0ODAwMDA2LCAweGFmODIwMjM4LCAweDhmODIwMDQ0LAotMHgzYzAzZmZmZiwgMHgzNDYzM2Y3ZiwgMHg0MzEwMjQsIDB4YWY4MjAwNDQsCi0weDNjMDMwMDAxLCAweDhjNjM2ZjQwLCAweDI0MDIwMDA1LCAweDE0NjIwMDA0LAotMHgwLCAweDhmODIwMDQ0LCAweDM0NDI1MDAwLCAweGFmODIwMDQ0LAotMHgzYzAyMDAwMSwgMHg4YzQyNmQ4OCwgMHgzYzAzMDAwMSwgMHg4YzYzNmY0MCwKLTB4MzQ0MjAwMjIsIDB4MjQ2M2ZmZmMsIDB4MmM2MzAwMDIsIDB4MTQ2MDAwMGMsCi0weGFmODIwMjAwLCAweDNjMDIwMDAxLCAweDhjNDI2ZGFjLCAweDNjMDMwMDAxLAotMHg4YzYzNmQ5MCwgMHgzYzA0MDAwMSwgMHg4Yzg0NmQ4YywgMHgzNDQyODAwMCwKLTB4NjIxODI1LCAweDY0MTgyNSwgMHgxMDAwMDAwYSwgMHgzNDYyMDAwMiwKLTB4M2MwMjAwMDEsIDB4OGM0MjZkOTAsIDB4M2MwMzAwMDEsIDB4OGM2MzZkYWMsCi0weDNjMDQwMDAxLCAweDhjODQ2ZDhjLCAweDQzMTAyNSwgMHg0NDEwMjUsCi0weDM0NDIwMDAyLCAweGFmODIwMjIwLCAweDEwMDAwMDJmLCAweDI0MDIwMDAxLAotMHgyNDAyMGUwMSwgMHhhZjgyMDIzOCwgMHg4ZjgzMDA1MCwgMHgzYzAyZjBmZiwKLTB4MzQ0MmZmZmYsIDB4M2MwNDAwMDEsIDB4OGM4NDZmMWMsIDB4NjIxODI0LAotMHgzYzAyMGQwMCwgMHg2MjE4MjUsIDB4MjQwMjAwMDEsIDB4YWY4MzAwNTAsCi0weGFmODIwMjAwLCAweGFmODIwMjIwLCAweDEwODAwMDA1LCAweDNjMDMzZjAwLAotMHgzYzAyMDAwMSwgMHg4YzQyNmQ4MCwgMHgxMDAwMDAwNCwgMHgzNDYzMDA3MCwKLTB4M2MwMjAwMDEsIDB4OGM0MjZkODAsIDB4MzQ2MzAwNzIsIDB4NDMxMDI1LAotMHhhZjgyMDIwMCwgMHgzYzAzMDAwMSwgMHg4YzYzNmQ4NCwgMHgzYzAyZjcwMCwKLTB4NjIxODI1LCAweDNjMDIwMDAxLCAweDhjNDI2ZDkwLCAweDNjMDQwMDAxLAotMHg4Yzg0NmRhYywgMHgzYzA1MDAwMSwgMHg4Y2E1NmY0MCwgMHg0MzEwMjUsCi0weDQ0MTAyNSwgMHhhZjgyMDIyMCwgMHgyNDAyMDAwNSwgMHgxNGEyMDAwNiwKLTB4MjQwMjAwMDEsIDB4OGY4MjAwNDQsIDB4MjQwM2FmZmYsIDB4NDMxMDI0LAotMHhhZjgyMDA0NCwgMHgyNDAyMDAwMSwgMHgxMDAwMDAzZCwgMHhhZjgyMDIzOCwKLTB4OGY4MzAwNTAsIDB4M2MwMmYwZmYsIDB4MzQ0MmZmZmYsIDB4M2MwNDAwMDEsCi0weDhjODQ2ZjFjLCAweDYyMTgyNCwgMHgzYzAyMGEwMCwgMHg2MjE4MjUsCi0weDI0MDIwMDAxLCAweGFmODMwMDUwLCAweGFmODIwMjAwLCAweDEwODAwMDFlLAotMHhhZjgyMDIyMCwgMHgzYzAyMDAwMSwgMHg4YzQyNmU0NCwgMHgxNDQwMDAxYSwKLTB4M2MwMzNmMDAsIDB4M2MwMjAwMDEsIDB4OGM0MjZkODAsIDB4MTAwMDAwMWEsCi0weDM0NjMwMGUwLCAweDhmODMwMDUwLCAweDNjMDQwMDAxLCAweDhjODQ2ZjFjLAotMHgzNDQyZmZmZiwgMHg2MjE4MjQsIDB4MTA4MDAwMGYsIDB4YWY4MzAwNTAsCi0weDNjMDIwMDAxLCAweDhjNDI2ZTQ0LCAweDE0NDAwMDBiLCAweDNjMDQzZjAwLAotMHgzYzAzMDAwMSwgMHg4YzYzNmQ4MCwgMHgzNDg0MDBlMCwgMHgyNDAyMDAwMSwKLTB4YWY4MjAyMDAsIDB4YWY4MjAyMjAsIDB4NjQxODI1LCAweGFmODMwMjAwLAotMHgxMDAwMDAwOCwgMHgzYzA1ZjcwMCwgMHgzYzAyMDAwMSwgMHg4YzQyNmQ4MCwKLTB4M2MwMzNmMDAsIDB4MzQ2MzAwZTIsIDB4NDMxMDI1LCAweGFmODIwMjAwLAotMHgzYzA1ZjcwMCwgMHgzNGE1ODAwMCwgMHgzYzAzMDAwMSwgMHg4YzYzNmQ4NCwKLTB4M2MwMjAwMDEsIDB4OGM0MjZkOTAsIDB4M2MwNDAwMDEsIDB4OGM4NDZkYWMsCi0weDY1MTgyNSwgMHg0MzEwMjUsIDB4NDQxMDI1LCAweGFmODIwMjIwLAotMHgzZTAwMDA4LCAweDAsIDB4M2MwMzAwMDEsIDB4OGM2MzZkYjQsCi0weDNjMDIwMDAxLCAweDhjNDI2ZGI4LCAweDEwNjIwMDAzLCAweDI0MDIwMDAyLAotMHgzYzAxMDAwMSwgMHhhYzIzNmRiOCwgMHgxMDYyMDAxZCwgMHgyYzYyMDAwMywKLTB4MTA0MDAwMjUsIDB4MjQwMjAwMDEsIDB4MTQ2MjAwMjMsIDB4MjQwMjAwMDQsCi0weDNjMDMwMDAxLCAweDhjNjM2ZDk4LCAweDEwNjIwMDA2LCAweDI0MDIwMDA4LAotMHgxNDYyMDAwYywgMHgzYzAyMDBjOCwgMHgzNDQyMDFmYiwgMHgxMDAwMDAwOSwKLTB4YWY4MjAyMzgsIDB4MjQwMjBlMDEsIDB4YWY4MjAyMzgsIDB4OGY4MjAwNDQsCi0weDNjMDNmZmZmLCAweDM0NjMzZjdmLCAweDQzMTAyNCwgMHgzNDQyMDA4MCwKLTB4YWY4MjAwNDQsIDB4OGY4MzAwNTQsIDB4MjQwMjAwMDIsIDB4M2MwMTAwMDEsCi0weGFjMjI2ZGI0LCAweDNjMDEwMDAxLCAweDEwMDAwMDBiLCAweGFjMjM2ZjJjLAotMHg4ZjgzMDA1NCwgMHgzYzAyMDAwMSwgMHg4YzQyNmYyYywgMHgyNDYzZDhmMCwKLTB4NDMxMDIzLCAweDJjNDIyNzEwLCAweDE0NDAwMDAzLCAweDI0MDIwMDA5LAotMHgzYzAxMDAwMSwgMHhhYzIyNmRiNCwgMHgzZTAwMDA4LCAweDAsCi0weDAsIDB4MCwgMHgwLCAweDI3YmRmZmQ4LAotMHhhZmIyMDAxOCwgMHg4MDkwMjEsIDB4YWZiMzAwMWMsIDB4YTA5ODIxLAotMHhhZmIxMDAxNCwgMHhjMDg4MjEsIDB4YWZiMDAwMTAsIDB4ODAyMSwKLTB4YWZiZjAwMjAsIDB4YTYyMDAwMDAsIDB4YzAwNGQ3OCwgMHgyNDA0MDAwMSwKLTB4MjYxMDAwMDEsIDB4MmUwMjAwMjAsIDB4MTQ0MGZmZmIsIDB4MCwKLTB4YzAwNGQ3OCwgMHgyMDIxLCAweGMwMDRkNzgsIDB4MjQwNDAwMDEsCi0weGMwMDRkNzgsIDB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwgMHgyMDIxLAotMHgyNDEwMDAxMCwgMHgyNTAxMDI0LCAweDEwNDAwMDAyLCAweDIwMjEsCi0weDI0MDQwMDAxLCAweGMwMDRkNzgsIDB4MTA4MDQyLCAweDE2MDBmZmZhLAotMHgyNTAxMDI0LCAweDI0MTAwMDEwLCAweDI3MDEwMjQsIDB4MTA0MDAwMDIsCi0weDIwMjEsIDB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwgMHgxMDgwNDIsCi0weDE2MDBmZmZhLCAweDI3MDEwMjQsIDB4YzAwNGRiOSwgMHgzNDEwODAwMCwKLTB4YzAwNGRiOSwgMHgwLCAweGMwMDRkNTgsIDB4MCwKLTB4NTA0MDAwMDUsIDB4MTA4MDQyLCAweDk2MjIwMDAwLCAweDUwMTAyNSwKLTB4YTYyMjAwMDAsIDB4MTA4MDQyLCAweDE2MDBmZmY3LCAweDAsCi0weGMwMDRkYjksIDB4MCwgMHg4ZmJmMDAyMCwgMHg4ZmIzMDAxYywKLTB4OGZiMjAwMTgsIDB4OGZiMTAwMTQsIDB4OGZiMDAwMTAsIDB4M2UwMDAwOCwKLTB4MjdiZDAwMjgsIDB4MjdiZGZmZDgsIDB4YWZiMTAwMTQsIDB4ODA4ODIxLAotMHhhZmIyMDAxOCwgMHhhMDkwMjEsIDB4YWZiMzAwMWMsIDB4YzA5ODIxLAotMHhhZmIwMDAxMCwgMHg4MDIxLCAweGFmYmYwMDIwLCAweGMwMDRkNzgsCi0weDI0MDQwMDAxLCAweDI2MTAwMDAxLCAweDJlMDIwMDIwLCAweDE0NDBmZmZiLAotMHgwLCAweGMwMDRkNzgsIDB4MjAyMSwgMHhjMDA0ZDc4LAotMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LCAweDIwMjEsIDB4YzAwNGQ3OCwKLTB4MjQwNDAwMDEsIDB4MjQxMDAwMTAsIDB4MjMwMTAyNCwgMHgxMDQwMDAwMiwKLTB4MjAyMSwgMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LCAweDEwODA0MiwKLTB4MTYwMGZmZmEsIDB4MjMwMTAyNCwgMHgyNDEwMDAxMCwgMHgyNTAxMDI0LAotMHgxMDQwMDAwMiwgMHgyMDIxLCAweDI0MDQwMDAxLCAweGMwMDRkNzgsCi0weDEwODA0MiwgMHgxNjAwZmZmYSwgMHgyNTAxMDI0LCAweGMwMDRkNzgsCi0weDI0MDQwMDAxLCAweGMwMDRkNzgsIDB4MjAyMSwgMHgzNDEwODAwMCwKLTB4OTY2MjAwMDAsIDB4NTAxMDI0LCAweDEwNDAwMDAyLCAweDIwMjEsCi0weDI0MDQwMDAxLCAweGMwMDRkNzgsIDB4MTA4MDQyLCAweDE2MDBmZmY4LAotMHgwLCAweGMwMDRkYjksIDB4MCwgMHg4ZmJmMDAyMCwKLTB4OGZiMzAwMWMsIDB4OGZiMjAwMTgsIDB4OGZiMTAwMTQsIDB4OGZiMDAwMTAsCi0weDNlMDAwMDgsIDB4MjdiZDAwMjgsIDB4M2MwNDAwMDEsIDB4OGM4NDZkZDAsCi0weDNjMDIwMDAxLCAweDhjNDI2ZTE4LCAweDI3YmRmZmQ4LCAweGFmYmYwMDIwLAotMHhhZmIxMDAxYywgMHgxMDgyMDAwMywgMHhhZmIwMDAxOCwgMHgzYzAxMDAwMSwKLTB4YWMyNDZlMTgsIDB4M2MwMzAwMDEsIDB4OGM2MzZmNDAsIDB4MjQwMjAwMDUsCi0weDE0NjIwMDA1LCAweDI0ODNmZmZmLCAweGMwMDQ5NjMsIDB4MCwKLTB4MTAwMDAzNGMsIDB4MCwgMHgyYzYyMDAxMywgMHgxMDQwMDM0OSwKLTB4MzEwODAsIDB4M2MwMTAwMDEsIDB4MjIwODIxLCAweDhjMjI2YjgwLAotMHg0MDAwMDgsIDB4MCwgMHhjMDA0ZGI5LCAweDgwMjEsCi0weDM0MDI4MDAwLCAweGE3YTIwMDEwLCAweDI3YjEwMDEwLCAweGMwMDRkNzgsCi0weDI0MDQwMDAxLCAweDI2MTAwMDAxLCAweDJlMDIwMDIwLCAweDE0NDBmZmZiLAotMHgwLCAweGMwMDRkNzgsIDB4MjAyMSwgMHhjMDA0ZDc4LAotMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LCAweDIwMjEsIDB4YzAwNGQ3OCwKLTB4MjQwNDAwMDEsIDB4MjQxMDAwMTAsIDB4MzIwMjAwMDEsIDB4MTA0MDAwMDIsCi0weDIwMjEsIDB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwgMHgxMDgwNDIsCi0weDE2MDBmZmZhLCAweDMyMDIwMDAxLCAweDI0MTAwMDEwLCAweGMwMDRkNzgsCi0weDIwMjEsIDB4MTA4MDQyLCAweDE2MDBmZmZjLCAweDAsCi0weGMwMDRkNzgsIDB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwgMHgyMDIxLAotMHgzNDEwODAwMCwgMHg5NjIyMDAwMCwgMHg1MDEwMjQsIDB4MTA0MDAwMDIsCi0weDIwMjEsIDB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwgMHgxMDgwNDIsCi0weDE2MDBmZmY4LCAweDAsIDB4YzAwNGRiOSwgMHgwLAotMHgxMDAwMDMwZSwgMHgyNDAyMDAwMiwgMHgyN2IxMDAxMCwgMHhhN2EwMDAxMCwKLTB4ODAyMSwgMHhjMDA0ZDc4LCAweDI0MDQwMDAxLCAweDI2MTAwMDAxLAotMHgyZTAyMDAyMCwgMHgxNDQwZmZmYiwgMHgwLCAweGMwMDRkNzgsCi0weDIwMjEsIDB4YzAwNGQ3OCwgMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LAotMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LCAweDIwMjEsIDB4MjQxMDAwMTAsCi0weDMyMDIwMDAxLCAweDEwNDAwMDAyLCAweDIwMjEsIDB4MjQwNDAwMDEsCi0weGMwMDRkNzgsIDB4MTA4MDQyLCAweDE2MDBmZmZhLCAweDMyMDIwMDAxLAotMHgyNDEwMDAxMCwgMHhjMDA0ZDc4LCAweDIwMjEsIDB4MTA4MDQyLAotMHgxNjAwZmZmYywgMHgwLCAweGMwMDRkYjksIDB4MzQxMDgwMDAsCi0weGMwMDRkYjksIDB4MCwgMHhjMDA0ZDU4LCAweDAsCi0weDUwNDAwMDA1LCAweDEwODA0MiwgMHg5NjIyMDAwMCwgMHg1MDEwMjUsCi0weGE2MjIwMDAwLCAweDEwODA0MiwgMHgxNjAwZmZmNywgMHgwLAotMHhjMDA0ZGI5LCAweDAsIDB4OTdhMjAwMTAsIDB4MzA0MjgwMDAsCi0weDE0NDAwMmRjLCAweDI0MDIwMDAzLCAweDEwMDAwMmQ4LCAweDAsCi0weDI0MDIxMjAwLCAweGE3YTIwMDEwLCAweDI3YjEwMDEwLCAweDgwMjEsCi0weGMwMDRkNzgsIDB4MjQwNDAwMDEsIDB4MjYxMDAwMDEsIDB4MmUwMjAwMjAsCi0weDE0NDBmZmZiLCAweDAsIDB4YzAwNGQ3OCwgMHgyMDIxLAotMHhjMDA0ZDc4LCAweDI0MDQwMDAxLCAweGMwMDRkNzgsIDB4MjAyMSwKLTB4YzAwNGQ3OCwgMHgyNDA0MDAwMSwgMHgyNDEwMDAxMCwgMHgzMjAyMDAwMSwKLTB4MTA0MDAwMDIsIDB4MjAyMSwgMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LAotMHgxMDgwNDIsIDB4MTYwMGZmZmEsIDB4MzIwMjAwMDEsIDB4MjQxMDAwMTAsCi0weGMwMDRkNzgsIDB4MjAyMSwgMHgxMDgwNDIsIDB4MTYwMGZmZmMsCi0weDAsIDB4YzAwNGQ3OCwgMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LAotMHgyMDIxLCAweDM0MTA4MDAwLCAweDk2MjIwMDAwLCAweDUwMTAyNCwKLTB4MTA0MDAwMDIsIDB4MjAyMSwgMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LAotMHgxMDgwNDIsIDB4MTYwMGZmZjgsIDB4MCwgMHhjMDA0ZGI5LAotMHgwLCAweDhmODMwMDU0LCAweDEwMDAwMjk2LCAweDI0MDIwMDA0LAotMHg4ZjgzMDA1NCwgMHgzYzAyMDAwMSwgMHg4YzQyNmYzYywgMHgyNDYzZmY5YywKLTB4NDMxMDIzLCAweDJjNDIwMDY0LCAweDE0NDAwMjllLCAweDI0MDIwMDAyLAotMHgzYzAzMDAwMSwgMHg4YzYzNmY0MCwgMHgxMDYyMDI5NywgMHgyYzYyMDAwMywKLTB4MTQ0MDAyOTYsIDB4MjQwMjAwMTEsIDB4MjQwMjAwMDMsIDB4MTA2MjAwMDUsCi0weDI0MDIwMDA0LCAweDEwNjIwMjkxLCAweDI0MDIwMDBmLCAweDEwMDAwMjhmLAotMHgyNDAyMDAxMSwgMHgxMDAwMDI4ZCwgMHgyNDAyMDAwNSwgMHgyNDAyMDAxNCwKLTB4YTdhMjAwMTAsIDB4MjdiMTAwMTAsIDB4ODAyMSwgMHhjMDA0ZDc4LAotMHgyNDA0MDAwMSwgMHgyNjEwMDAwMSwgMHgyZTAyMDAyMCwgMHgxNDQwZmZmYiwKLTB4MCwgMHhjMDA0ZDc4LCAweDIwMjEsIDB4YzAwNGQ3OCwKLTB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwgMHgyMDIxLCAweGMwMDRkNzgsCi0weDI0MDQwMDAxLCAweDI0MTAwMDEwLCAweDMyMDIwMDAxLCAweDEwNDAwMDAyLAotMHgyMDIxLCAweDI0MDQwMDAxLCAweGMwMDRkNzgsIDB4MTA4MDQyLAotMHgxNjAwZmZmYSwgMHgzMjAyMDAwMSwgMHgyNDEwMDAxMCwgMHgzMjAyMDAxMiwKLTB4MTA0MDAwMDIsIDB4MjAyMSwgMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LAotMHgxMDgwNDIsIDB4MTYwMGZmZmEsIDB4MzIwMjAwMTIsIDB4YzAwNGQ3OCwKLTB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwgMHgyMDIxLCAweDM0MTA4MDAwLAotMHg5NjIyMDAwMCwgMHg1MDEwMjQsIDB4MTA0MDAwMDIsIDB4MjAyMSwKLTB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwgMHgxMDgwNDIsIDB4MTYwMGZmZjgsCi0weDAsIDB4YzAwNGRiOSwgMHgwLCAweDhmODMwMDU0LAotMHgxMDAwMDI0OCwgMHgyNDAyMDAwNiwgMHg4ZjgzMDA1NCwgMHgzYzAyMDAwMSwKLTB4OGM0MjZmM2MsIDB4MjQ2M2ZmOWMsIDB4NDMxMDIzLCAweDJjNDIwMDY0LAotMHgxNDQwMDI1MCwgMHgyNDAyMDAwNywgMHgxMDAwMDI0YywgMHgwLAotMHgyNDAyMDAwNiwgMHhhN2EyMDAxMCwgMHgyN2IxMDAxMCwgMHg4MDIxLAotMHhjMDA0ZDc4LCAweDI0MDQwMDAxLCAweDI2MTAwMDAxLCAweDJlMDIwMDIwLAotMHgxNDQwZmZmYiwgMHgwLCAweGMwMDRkNzgsIDB4MjAyMSwKLTB4YzAwNGQ3OCwgMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LCAweDIwMjEsCi0weGMwMDRkNzgsIDB4MjQwNDAwMDEsIDB4MjQxMDAwMTAsIDB4MzIwMjAwMDEsCi0weDEwNDAwMDAyLCAweDIwMjEsIDB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwKLTB4MTA4MDQyLCAweDE2MDBmZmZhLCAweDMyMDIwMDAxLCAweDI0MTAwMDEwLAotMHgzMjAyMDAxMywgMHgxMDQwMDAwMiwgMHgyMDIxLCAweDI0MDQwMDAxLAotMHhjMDA0ZDc4LCAweDEwODA0MiwgMHgxNjAwZmZmYSwgMHgzMjAyMDAxMywKLTB4YzAwNGQ3OCwgMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LCAweDIwMjEsCi0weDM0MTA4MDAwLCAweDk2MjIwMDAwLCAweDUwMTAyNCwgMHgxMDQwMDAwMiwKLTB4MjAyMSwgMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LCAweDEwODA0MiwKLTB4MTYwMGZmZjgsIDB4MCwgMHhjMDA0ZGI5LCAweDAsCi0weDhmODMwMDU0LCAweDEwMDAwMjA3LCAweDI0MDIwMDA4LCAweDhmODMwMDU0LAotMHgzYzAyMDAwMSwgMHg4YzQyNmYzYywgMHgyNDYzZmY5YywgMHg0MzEwMjMsCi0weDJjNDIwMDY0LCAweDE0NDAwMjBmLCAweDI0MDIwMDA5LCAweDEwMDAwMjBiLAotMHgwLCAweDI3YjEwMDEwLCAweGE3YTAwMDEwLCAweDgwMjEsCi0weGMwMDRkNzgsIDB4MjQwNDAwMDEsIDB4MjYxMDAwMDEsIDB4MmUwMjAwMjAsCi0weDE0NDBmZmZiLCAweDAsIDB4YzAwNGQ3OCwgMHgyMDIxLAotMHhjMDA0ZDc4LCAweDI0MDQwMDAxLCAweGMwMDRkNzgsIDB4MjQwNDAwMDEsCi0weGMwMDRkNzgsIDB4MjAyMSwgMHgyNDEwMDAxMCwgMHgzMjAyMDAwMSwKLTB4MTA0MDAwMDIsIDB4MjAyMSwgMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LAotMHgxMDgwNDIsIDB4MTYwMGZmZmEsIDB4MzIwMjAwMDEsIDB4MjQxMDAwMTAsCi0weDMyMDIwMDE4LCAweDEwNDAwMDAyLCAweDIwMjEsIDB4MjQwNDAwMDEsCi0weGMwMDRkNzgsIDB4MTA4MDQyLCAweDE2MDBmZmZhLCAweDMyMDIwMDE4LAotMHhjMDA0ZGI5LCAweDM0MTA4MDAwLCAweGMwMDRkYjksIDB4MCwKLTB4YzAwNGQ1OCwgMHgwLCAweDUwNDAwMDA1LCAweDEwODA0MiwKLTB4OTYyMjAwMDAsIDB4NTAxMDI1LCAweGE2MjIwMDAwLCAweDEwODA0MiwKLTB4MTYwMGZmZjcsIDB4MCwgMHhjMDA0ZGI5LCAweDgwMjEsCi0weDk3YTIwMDEwLCAweDI3YjEwMDEwLCAweDM0NDIwMDAxLCAweGE3YTIwMDEwLAotMHhjMDA0ZDc4LCAweDI0MDQwMDAxLCAweDI2MTAwMDAxLCAweDJlMDIwMDIwLAotMHgxNDQwZmZmYiwgMHgwLCAweGMwMDRkNzgsIDB4MjAyMSwKLTB4YzAwNGQ3OCwgMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LCAweDIwMjEsCi0weGMwMDRkNzgsIDB4MjQwNDAwMDEsIDB4MjQxMDAwMTAsIDB4MzIwMjAwMDEsCi0weDEwNDAwMDAyLCAweDIwMjEsIDB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwKLTB4MTA4MDQyLCAweDE2MDBmZmZhLCAweDMyMDIwMDAxLCAweDI0MTAwMDEwLAotMHgzMjAyMDAxOCwgMHgxMDQwMDAwMiwgMHgyMDIxLCAweDI0MDQwMDAxLAotMHhjMDA0ZDc4LCAweDEwODA0MiwgMHgxNjAwZmZmYSwgMHgzMjAyMDAxOCwKLTB4YzAwNGQ3OCwgMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LCAweDIwMjEsCi0weDM0MTA4MDAwLCAweDk2MjIwMDAwLCAweDUwMTAyNCwgMHgxMDQwMDAwMiwKLTB4MjAyMSwgMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LCAweDEwODA0MiwKLTB4MTYwMGZmZjgsIDB4MCwgMHhjMDA0ZGI5LCAweDAsCi0weDhmODMwMDU0LCAweDEwMDAwMTkzLCAweDI0MDIwMDBhLCAweDhmODMwMDU0LAotMHgzYzAyMDAwMSwgMHg4YzQyNmYzYywgMHgyNDYzZmY5YywgMHg0MzEwMjMsCi0weDJjNDIwMDY0LCAweDE0NDAwMTliLCAweDI0MDIwMDBiLCAweDEwMDAwMTk3LAotMHgwLCAweDI3YjEwMDEwLCAweGE3YTAwMDEwLCAweDgwMjEsCi0weGMwMDRkNzgsIDB4MjQwNDAwMDEsIDB4MjYxMDAwMDEsIDB4MmUwMjAwMjAsCi0weDE0NDBmZmZiLCAweDAsIDB4YzAwNGQ3OCwgMHgyMDIxLAotMHhjMDA0ZDc4LCAweDI0MDQwMDAxLCAweGMwMDRkNzgsIDB4MjQwNDAwMDEsCi0weGMwMDRkNzgsIDB4MjAyMSwgMHgyNDEwMDAxMCwgMHgzMjAyMDAwMSwKLTB4MTA0MDAwMDIsIDB4MjAyMSwgMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LAotMHgxMDgwNDIsIDB4MTYwMGZmZmEsIDB4MzIwMjAwMDEsIDB4MjQxMDAwMTAsCi0weDMyMDIwMDE3LCAweDEwNDAwMDAyLCAweDIwMjEsIDB4MjQwNDAwMDEsCi0weGMwMDRkNzgsIDB4MTA4MDQyLCAweDE2MDBmZmZhLCAweDMyMDIwMDE3LAotMHhjMDA0ZGI5LCAweDM0MTA4MDAwLCAweGMwMDRkYjksIDB4MCwKLTB4YzAwNGQ1OCwgMHgwLCAweDUwNDAwMDA1LCAweDEwODA0MiwKLTB4OTYyMjAwMDAsIDB4NTAxMDI1LCAweGE2MjIwMDAwLCAweDEwODA0MiwKLTB4MTYwMGZmZjcsIDB4MCwgMHhjMDA0ZGI5LCAweDgwMjEsCi0weDk3YTIwMDEwLCAweDI3YjEwMDEwLCAweDM0NDIwNzAwLCAweGE3YTIwMDEwLAotMHhjMDA0ZDc4LCAweDI0MDQwMDAxLCAweDI2MTAwMDAxLCAweDJlMDIwMDIwLAotMHgxNDQwZmZmYiwgMHgwLCAweGMwMDRkNzgsIDB4MjAyMSwKLTB4YzAwNGQ3OCwgMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LCAweDIwMjEsCi0weGMwMDRkNzgsIDB4MjQwNDAwMDEsIDB4MjQxMDAwMTAsIDB4MzIwMjAwMDEsCi0weDEwNDAwMDAyLCAweDIwMjEsIDB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwKLTB4MTA4MDQyLCAweDE2MDBmZmZhLCAweDMyMDIwMDAxLCAweDI0MTAwMDEwLAotMHgzMjAyMDAxNywgMHgxMDQwMDAwMiwgMHgyMDIxLCAweDI0MDQwMDAxLAotMHhjMDA0ZDc4LCAweDEwODA0MiwgMHgxNjAwZmZmYSwgMHgzMjAyMDAxNywKLTB4YzAwNGQ3OCwgMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LCAweDIwMjEsCi0weDM0MTA4MDAwLCAweDk2MjIwMDAwLCAweDUwMTAyNCwgMHgxMDQwMDAwMiwKLTB4MjAyMSwgMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LCAweDEwODA0MiwKLTB4MTYwMGZmZjgsIDB4MCwgMHhjMDA0ZGI5LCAweDAsCi0weDhmODMwMDU0LCAweDEwMDAwMTFmLCAweDI0MDIwMDBjLCAweDhmODMwMDU0LAotMHgzYzAyMDAwMSwgMHg4YzQyNmYzYywgMHgyNDYzZmY5YywgMHg0MzEwMjMsCi0weDJjNDIwMDY0LCAweDE0NDAwMTI3LCAweDI0MDIwMDEyLCAweDEwMDAwMTIzLAotMHgwLCAweDI3YjEwMDEwLCAweGE3YTAwMDEwLCAweDgwMjEsCi0weGMwMDRkNzgsIDB4MjQwNDAwMDEsIDB4MjYxMDAwMDEsIDB4MmUwMjAwMjAsCi0weDE0NDBmZmZiLCAweDAsIDB4YzAwNGQ3OCwgMHgyMDIxLAotMHhjMDA0ZDc4LCAweDI0MDQwMDAxLCAweGMwMDRkNzgsIDB4MjQwNDAwMDEsCi0weGMwMDRkNzgsIDB4MjAyMSwgMHgyNDEwMDAxMCwgMHgzMjAyMDAwMSwKLTB4MTA0MDAwMDIsIDB4MjAyMSwgMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LAotMHgxMDgwNDIsIDB4MTYwMGZmZmEsIDB4MzIwMjAwMDEsIDB4MjQxMDAwMTAsCi0weDMyMDIwMDE0LCAweDEwNDAwMDAyLCAweDIwMjEsIDB4MjQwNDAwMDEsCi0weGMwMDRkNzgsIDB4MTA4MDQyLCAweDE2MDBmZmZhLCAweDMyMDIwMDE0LAotMHhjMDA0ZGI5LCAweDM0MTA4MDAwLCAweGMwMDRkYjksIDB4MCwKLTB4YzAwNGQ1OCwgMHgwLCAweDUwNDAwMDA1LCAweDEwODA0MiwKLTB4OTYyMjAwMDAsIDB4NTAxMDI1LCAweGE2MjIwMDAwLCAweDEwODA0MiwKLTB4MTYwMGZmZjcsIDB4MCwgMHhjMDA0ZGI5LCAweDgwMjEsCi0weDk3YTIwMDEwLCAweDI3YjEwMDEwLCAweDM0NDIwMDEwLCAweGE3YTIwMDEwLAotMHhjMDA0ZDc4LCAweDI0MDQwMDAxLCAweDI2MTAwMDAxLCAweDJlMDIwMDIwLAotMHgxNDQwZmZmYiwgMHgwLCAweGMwMDRkNzgsIDB4MjAyMSwKLTB4YzAwNGQ3OCwgMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LCAweDIwMjEsCi0weGMwMDRkNzgsIDB4MjQwNDAwMDEsIDB4MjQxMDAwMTAsIDB4MzIwMjAwMDEsCi0weDEwNDAwMDAyLCAweDIwMjEsIDB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwKLTB4MTA4MDQyLCAweDE2MDBmZmZhLCAweDMyMDIwMDAxLCAweDI0MTAwMDEwLAotMHgzMjAyMDAxNCwgMHgxMDQwMDAwMiwgMHgyMDIxLCAweDI0MDQwMDAxLAotMHhjMDA0ZDc4LCAweDEwODA0MiwgMHgxNjAwZmZmYSwgMHgzMjAyMDAxNCwKLTB4YzAwNGQ3OCwgMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LCAweDIwMjEsCi0weDM0MTA4MDAwLCAweDk2MjIwMDAwLCAweDUwMTAyNCwgMHgxMDQwMDAwMiwKLTB4MjAyMSwgMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LCAweDEwODA0MiwKLTB4MTYwMGZmZjgsIDB4MCwgMHhjMDA0ZGI5LCAweDAsCi0weDhmODMwMDU0LCAweDEwMDAwMGFiLCAweDI0MDIwMDEzLCAweDhmODMwMDU0LAotMHgzYzAyMDAwMSwgMHg4YzQyNmYzYywgMHgyNDYzZmY5YywgMHg0MzEwMjMsCi0weDJjNDIwMDY0LCAweDE0NDAwMGIzLCAweDI0MDIwMDBkLCAweDEwMDAwMGFmLAotMHgwLCAweDI3YjEwMDEwLCAweGE3YTAwMDEwLCAweDgwMjEsCi0weGMwMDRkNzgsIDB4MjQwNDAwMDEsIDB4MjYxMDAwMDEsIDB4MmUwMjAwMjAsCi0weDE0NDBmZmZiLCAweDAsIDB4YzAwNGQ3OCwgMHgyMDIxLAotMHhjMDA0ZDc4LCAweDI0MDQwMDAxLCAweGMwMDRkNzgsIDB4MjQwNDAwMDEsCi0weGMwMDRkNzgsIDB4MjAyMSwgMHgyNDEwMDAxMCwgMHgzMjAyMDAwMSwKLTB4MTA0MDAwMDIsIDB4MjAyMSwgMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LAotMHgxMDgwNDIsIDB4MTYwMGZmZmEsIDB4MzIwMjAwMDEsIDB4MjQxMDAwMTAsCi0weDMyMDIwMDE4LCAweDEwNDAwMDAyLCAweDIwMjEsIDB4MjQwNDAwMDEsCi0weGMwMDRkNzgsIDB4MTA4MDQyLCAweDE2MDBmZmZhLCAweDMyMDIwMDE4LAotMHhjMDA0ZGI5LCAweDM0MTA4MDAwLCAweGMwMDRkYjksIDB4MCwKLTB4YzAwNGQ1OCwgMHgwLCAweDUwNDAwMDA1LCAweDEwODA0MiwKLTB4OTYyMjAwMDAsIDB4NTAxMDI1LCAweGE2MjIwMDAwLCAweDEwODA0MiwKLTB4MTYwMGZmZjcsIDB4MCwgMHhjMDA0ZGI5LCAweDgwMjEsCi0weDk3YTIwMDEwLCAweDI3YjEwMDEwLCAweDMwNDJmZmZlLCAweGE3YTIwMDEwLAotMHhjMDA0ZDc4LCAweDI0MDQwMDAxLCAweDI2MTAwMDAxLCAweDJlMDIwMDIwLAotMHgxNDQwZmZmYiwgMHgwLCAweGMwMDRkNzgsIDB4MjAyMSwKLTB4YzAwNGQ3OCwgMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LCAweDIwMjEsCi0weGMwMDRkNzgsIDB4MjQwNDAwMDEsIDB4MjQxMDAwMTAsIDB4MzIwMjAwMDEsCi0weDEwNDAwMDAyLCAweDIwMjEsIDB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwKLTB4MTA4MDQyLCAweDE2MDBmZmZhLCAweDMyMDIwMDAxLCAweDI0MTAwMDEwLAotMHgzMjAyMDAxOCwgMHgxMDQwMDAwMiwgMHgyMDIxLCAweDI0MDQwMDAxLAotMHhjMDA0ZDc4LCAweDEwODA0MiwgMHgxNjAwZmZmYSwgMHgzMjAyMDAxOCwKLTB4YzAwNGQ3OCwgMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LCAweDIwMjEsCi0weDM0MTA4MDAwLCAweDk2MjIwMDAwLCAweDUwMTAyNCwgMHgxMDQwMDAwMiwKLTB4MjAyMSwgMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LCAweDEwODA0MiwKLTB4MTYwMGZmZjgsIDB4MCwgMHhjMDA0ZGI5LCAweDAsCi0weDhmODMwMDU0LCAweDEwMDAwMDM3LCAweDI0MDIwMDBlLCAweDI0MDIwODQwLAotMHhhN2EyMDAxMCwgMHgyN2IxMDAxMCwgMHg4MDIxLCAweGMwMDRkNzgsCi0weDI0MDQwMDAxLCAweDI2MTAwMDAxLCAweDJlMDIwMDIwLCAweDE0NDBmZmZiLAotMHgwLCAweGMwMDRkNzgsIDB4MjAyMSwgMHhjMDA0ZDc4LAotMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LCAweDIwMjEsIDB4YzAwNGQ3OCwKLTB4MjQwNDAwMDEsIDB4MjQxMDAwMTAsIDB4MzIwMjAwMDEsIDB4MTA0MDAwMDIsCi0weDIwMjEsIDB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwgMHgxMDgwNDIsCi0weDE2MDBmZmZhLCAweDMyMDIwMDAxLCAweDI0MTAwMDEwLCAweDMyMDIwMDEzLAotMHgxMDQwMDAwMiwgMHgyMDIxLCAweDI0MDQwMDAxLCAweGMwMDRkNzgsCi0weDEwODA0MiwgMHgxNjAwZmZmYSwgMHgzMjAyMDAxMywgMHhjMDA0ZDc4LAotMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LCAweDIwMjEsIDB4MzQxMDgwMDAsCi0weDk2MjIwMDAwLCAweDUwMTAyNCwgMHgxMDQwMDAwMiwgMHgyMDIxLAotMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LCAweDEwODA0MiwgMHgxNjAwZmZmOCwKLTB4MCwgMHhjMDA0ZGI5LCAweDAsIDB4OGY4MzAwNTQsCi0weDI0MDIwMDEwLCAweDNjMDEwMDAxLCAweGFjMjI2ZGQwLCAweDNjMDEwMDAxLAotMHgxMDAwMDAwYywgMHhhYzIzNmYzYywgMHg4ZjgzMDA1NCwgMHgzYzAyMDAwMSwKLTB4OGM0MjZmM2MsIDB4MjQ2M2ZmOWMsIDB4NDMxMDIzLCAweDJjNDIwMDY0LAotMHgxNDQwMDAwNCwgMHgwLCAweDI0MDIwMDExLCAweDNjMDEwMDAxLAotMHhhYzIyNmRkMCwgMHg4ZmJmMDAyMCwgMHg4ZmIxMDAxYywgMHg4ZmIwMDAxOCwKLTB4M2UwMDAwOCwgMHgyN2JkMDAyOCwgMHgzYzAzMDAwMSwgMHg4YzYzNmQ5OCwKLTB4MjdiZGZmYzgsIDB4MjQwMjAwMDIsIDB4YWZiZjAwMzQsIDB4YWZiMjAwMzAsCi0weGFmYjEwMDJjLCAweDE0NjIwMDA0LCAweGFmYjAwMDI4LCAweDNjMTIwMDAyLAotMHgxMDAwMDAwMywgMHg4ZTUyOGZmOCwgMHgzYzEyMDAwMiwgMHg4ZTUyOGZmYywKLTB4M2MwMzAwMDEsIDB4OGM2MzZkZDQsIDB4M2MwMjAwMDEsIDB4OGM0MjZlMWMsCi0weDUwNjIwMDA0LCAweDI0NjNmZmZmLCAweDNjMDEwMDAxLCAweGFjMjM2ZTFjLAotMHgyNDYzZmZmZiwgMHgyYzYyMDAwNiwgMHgxMDQwMDM3NywgMHgzMTA4MCwKLTB4M2MwMTAwMDEsIDB4MjIwODIxLCAweDhjMjI2YmQ4LCAweDQwMDAwOCwKLTB4MCwgMHgyMDIxLCAweDI4MjEsIDB4YzAwNGRkYiwKLTB4MzQwNjgwMDAsIDB4MjQwNDAwMTAsIDB4MjQwNTAwMDIsIDB4MjQwNjAwMDIsCi0weDI0MDIwMDAyLCAweGMwMDRkZGIsIDB4YTdhMjAwMTgsIDB4MjQwMjAwMDIsCi0weDNjMDEwMDAxLCAweDEwMDAwMzY0LCAweGFjMjI2ZGQ0LCAweDI3YjEwMDE4LAotMHhhN2EwMDAxOCwgMHg4MDIxLCAweGMwMDRkNzgsIDB4MjQwNDAwMDEsCi0weDI2MTAwMDAxLCAweDJlMDIwMDIwLCAweDE0NDBmZmZiLCAweDAsCi0weGMwMDRkNzgsIDB4MjAyMSwgMHhjMDA0ZDc4LCAweDI0MDQwMDAxLAotMHhjMDA0ZDc4LCAweDI0MDQwMDAxLCAweGMwMDRkNzgsIDB4MjAyMSwKLTB4MjQxMDAwMTAsIDB4MzIwMjAwMDEsIDB4MTA0MDAwMDIsIDB4MjAyMSwKLTB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwgMHgxMDgwNDIsIDB4MTYwMGZmZmEsCi0weDMyMDIwMDAxLCAweDI0MTAwMDEwLCAweGMwMDRkNzgsIDB4MjAyMSwKLTB4MTA4MDQyLCAweDE2MDBmZmZjLCAweDAsIDB4YzAwNGRiOSwKLTB4MzQxMDgwMDAsIDB4YzAwNGRiOSwgMHgwLCAweGMwMDRkNTgsCi0weDAsIDB4NTA0MDAwMDUsIDB4MTA4MDQyLCAweDk2MjIwMDAwLAotMHg1MDEwMjUsIDB4YTYyMjAwMDAsIDB4MTA4MDQyLCAweDE2MDBmZmY3LAotMHgwLCAweGMwMDRkYjksIDB4MCwgMHg5N2EyMDAxOCwKLTB4MzA0MjgwMDAsIDB4MTQ0MDAwMDQsIDB4MjQwMjAwMDMsIDB4M2MwMTAwMDEsCi0weGFjMjI2ZGQ0LCAweDI0MDIwMDAzLCAweDNjMDEwMDAxLCAweDEwMDAwMzJhLAotMHhhYzIyNmRkNCwgMHgyNDA0MDAxMCwgMHgyNDA1MDAwMiwgMHgyNDA2MDAwMiwKLTB4MjQwMjAwMDIsIDB4YzAwNGRkYiwgMHhhN2EyMDAxOCwgMHgzYzAzMDAwMSwKLTB4OGM2MzZlMjAsIDB4MjQwMjAwMDEsIDB4MTQ2MjAxZTEsIDB4ODAyMSwKLTB4MjdiMTAwMTgsIDB4YTdhMDAwMTgsIDB4YzAwNGQ3OCwgMHgyNDA0MDAwMSwKLTB4MjYxMDAwMDEsIDB4MmUwMjAwMjAsIDB4MTQ0MGZmZmIsIDB4MCwKLTB4YzAwNGQ3OCwgMHgyMDIxLCAweGMwMDRkNzgsIDB4MjQwNDAwMDEsCi0weGMwMDRkNzgsIDB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwgMHgyMDIxLAotMHgyNDEwMDAxMCwgMHgzMjAyMDAwMSwgMHgxMDQwMDAwMiwgMHgyMDIxLAotMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LCAweDEwODA0MiwgMHgxNjAwZmZmYSwKLTB4MzIwMjAwMDEsIDB4MjQxMDAwMTAsIDB4MzIwMjAwMTgsIDB4MTA0MDAwMDIsCi0weDIwMjEsIDB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwgMHgxMDgwNDIsCi0weDE2MDBmZmZhLCAweDMyMDIwMDE4LCAweGMwMDRkYjksIDB4MzQxMDgwMDAsCi0weGMwMDRkYjksIDB4MCwgMHhjMDA0ZDU4LCAweDAsCi0weDUwNDAwMDA1LCAweDEwODA0MiwgMHg5NjIyMDAwMCwgMHg1MDEwMjUsCi0weGE2MjIwMDAwLCAweDEwODA0MiwgMHgxNjAwZmZmNywgMHgwLAotMHhjMDA0ZGI5LCAweDgwMjEsIDB4MjdiMTAwMTgsIDB4YTdhMDAwMTgsCi0weGMwMDRkNzgsIDB4MjQwNDAwMDEsIDB4MjYxMDAwMDEsIDB4MmUwMjAwMjAsCi0weDE0NDBmZmZiLCAweDAsIDB4YzAwNGQ3OCwgMHgyMDIxLAotMHhjMDA0ZDc4LCAweDI0MDQwMDAxLCAweGMwMDRkNzgsIDB4MjQwNDAwMDEsCi0weGMwMDRkNzgsIDB4MjAyMSwgMHgyNDEwMDAxMCwgMHgzMjAyMDAwMSwKLTB4MTA0MDAwMDIsIDB4MjAyMSwgMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LAotMHgxMDgwNDIsIDB4MTYwMGZmZmEsIDB4MzIwMjAwMDEsIDB4MjQxMDAwMTAsCi0weDMyMDIwMDE4LCAweDEwNDAwMDAyLCAweDIwMjEsIDB4MjQwNDAwMDEsCi0weGMwMDRkNzgsIDB4MTA4MDQyLCAweDE2MDBmZmZhLCAweDMyMDIwMDE4LAotMHhjMDA0ZGI5LCAweDM0MTA4MDAwLCAweGMwMDRkYjksIDB4MCwKLTB4YzAwNGQ1OCwgMHgwLCAweDUwNDAwMDA1LCAweDEwODA0MiwKLTB4OTYyMjAwMDAsIDB4NTAxMDI1LCAweGE2MjIwMDAwLCAweDEwODA0MiwKLTB4MTYwMGZmZjcsIDB4MCwgMHhjMDA0ZGI5LCAweDgwMjEsCi0weDI0MDQwMDE4LCAweDI4MjEsIDB4YzAwNGRkYiwgMHgyNDA2MDQwNCwKLTB4YTdhMDAwMWEsIDB4YzAwNGQ3OCwgMHgyNDA0MDAwMSwgMHgyNjEwMDAwMSwKLTB4MmUwMjAwMjAsIDB4MTQ0MGZmZmIsIDB4MCwgMHhjMDA0ZDc4LAotMHgyMDIxLCAweGMwMDRkNzgsIDB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwKLTB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwgMHgyMDIxLCAweDI0MTAwMDEwLAotMHgzMjAyMDAwMSwgMHgxMDQwMDAwMiwgMHgyMDIxLCAweDI0MDQwMDAxLAotMHhjMDA0ZDc4LCAweDEwODA0MiwgMHgxNjAwZmZmYSwgMHgzMjAyMDAwMSwKLTB4MjQxMDAwMTAsIDB4MzIwMjAwMTgsIDB4MTA0MDAwMDIsIDB4MjAyMSwKLTB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwgMHgxMDgwNDIsIDB4MTYwMGZmZmEsCi0weDMyMDIwMDE4LCAweGMwMDRkYjksIDB4MzQxMDgwMDAsIDB4YzAwNGRiOSwKLTB4MCwgMHhjMDA0ZDU4LCAweDAsIDB4NTA0MDAwMDUsCi0weDEwODA0MiwgMHg5N2EyMDAxYSwgMHg1MDEwMjUsIDB4YTdhMjAwMWEsCi0weDEwODA0MiwgMHgxNjAwZmZmNywgMHgwLCAweGMwMDRkYjksCi0weDgwMjEsIDB4YTdhMDAwMWEsIDB4YzAwNGQ3OCwgMHgyNDA0MDAwMSwKLTB4MjYxMDAwMDEsIDB4MmUwMjAwMjAsIDB4MTQ0MGZmZmIsIDB4MCwKLTB4YzAwNGQ3OCwgMHgyMDIxLCAweGMwMDRkNzgsIDB4MjQwNDAwMDEsCi0weGMwMDRkNzgsIDB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwgMHgyMDIxLAotMHgyNDEwMDAxMCwgMHgzMjAyMDAwMSwgMHgxMDQwMDAwMiwgMHgyMDIxLAotMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LCAweDEwODA0MiwgMHgxNjAwZmZmYSwKLTB4MzIwMjAwMDEsIDB4MjQxMDAwMTAsIDB4MzIwMjAwMTgsIDB4MTA0MDAwMDIsCi0weDIwMjEsIDB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwgMHgxMDgwNDIsCi0weDE2MDBmZmZhLCAweDMyMDIwMDE4LCAweGMwMDRkYjksIDB4MzQxMDgwMDAsCi0weGMwMDRkYjksIDB4MCwgMHhjMDA0ZDU4LCAweDAsCi0weDUwNDAwMDA1LCAweDEwODA0MiwgMHg5N2EyMDAxYSwgMHg1MDEwMjUsCi0weGE3YTIwMDFhLCAweDEwODA0MiwgMHgxNjAwZmZmNywgMHgwLAotMHhjMDA0ZGI5LCAweDgwMjEsIDB4YTdhMDAwMWMsIDB4YzAwNGQ3OCwKLTB4MjQwNDAwMDEsIDB4MjYxMDAwMDEsIDB4MmUwMjAwMjAsIDB4MTQ0MGZmZmIsCi0weDAsIDB4YzAwNGQ3OCwgMHgyMDIxLCAweGMwMDRkNzgsCi0weDI0MDQwMDAxLCAweGMwMDRkNzgsIDB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwKLTB4MjAyMSwgMHgyNDEwMDAxMCwgMHhjMDA0ZDc4LCAweDIwMjEsCi0weDEwODA0MiwgMHgxNjAwZmZmYywgMHgwLCAweDI0MTAwMDEwLAotMHgzMjAyMDAxZSwgMHgxMDQwMDAwMiwgMHgyMDIxLCAweDI0MDQwMDAxLAotMHhjMDA0ZDc4LCAweDEwODA0MiwgMHgxNjAwZmZmYSwgMHgzMjAyMDAxZSwKLTB4YzAwNGRiOSwgMHgzNDEwODAwMCwgMHhjMDA0ZGI5LCAweDAsCi0weGMwMDRkNTgsIDB4MCwgMHg1MDQwMDAwNSwgMHgxMDgwNDIsCi0weDk3YTIwMDFjLCAweDUwMTAyNSwgMHhhN2EyMDAxYywgMHgxMDgwNDIsCi0weDE2MDBmZmY3LCAweDAsIDB4YzAwNGRiOSwgMHg4MDIxLAotMHhhN2EwMDAxYywgMHhjMDA0ZDc4LCAweDI0MDQwMDAxLCAweDI2MTAwMDAxLAotMHgyZTAyMDAyMCwgMHgxNDQwZmZmYiwgMHgwLCAweGMwMDRkNzgsCi0weDIwMjEsIDB4YzAwNGQ3OCwgMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LAotMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LCAweDIwMjEsIDB4MjQxMDAwMTAsCi0weGMwMDRkNzgsIDB4MjAyMSwgMHgxMDgwNDIsIDB4MTYwMGZmZmMsCi0weDAsIDB4MjQxMDAwMTAsIDB4MzIwMjAwMWUsIDB4MTA0MDAwMDIsCi0weDIwMjEsIDB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwgMHgxMDgwNDIsCi0weDE2MDBmZmZhLCAweDMyMDIwMDFlLCAweGMwMDRkYjksIDB4MzQxMDgwMDAsCi0weGMwMDRkYjksIDB4MCwgMHhjMDA0ZDU4LCAweDAsCi0weDUwNDAwMDA1LCAweDEwODA0MiwgMHg5N2EyMDAxYywgMHg1MDEwMjUsCi0weGE3YTIwMDFjLCAweDEwODA0MiwgMHgxNjAwZmZmNywgMHgwLAotMHhjMDA0ZGI5LCAweDgwMjEsIDB4MjQwMjAwMDIsIDB4YTdhMjAwMWUsCi0weGMwMDRkNzgsIDB4MjQwNDAwMDEsIDB4MjYxMDAwMDEsIDB4MmUwMjAwMjAsCi0weDE0NDBmZmZiLCAweDAsIDB4YzAwNGQ3OCwgMHgyMDIxLAotMHhjMDA0ZDc4LCAweDI0MDQwMDAxLCAweGMwMDRkNzgsIDB4MjAyMSwKLTB4YzAwNGQ3OCwgMHgyNDA0MDAwMSwgMHgyNDEwMDAxMCwgMHhjMDA0ZDc4LAotMHgyMDIxLCAweDEwODA0MiwgMHgxNjAwZmZmYywgMHgwLAotMHgyNDEwMDAxMCwgMHgzMjAyMDAxZSwgMHgxMDQwMDAwMiwgMHgyMDIxLAotMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LCAweDEwODA0MiwgMHgxNjAwZmZmYSwKLTB4MzIwMjAwMWUsIDB4YzAwNGQ3OCwgMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LAotMHgyMDIxLCAweDM0MTA4MDAwLCAweDk3YTIwMDFlLCAweDUwMTAyNCwKLTB4MTA0MDAwMDIsIDB4MjAyMSwgMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LAotMHgxMDgwNDIsIDB4MTYwMGZmZjgsIDB4MCwgMHhjMDA0ZGI5LAotMHg4MDIxLCAweGE3YTAwMDIwLCAweGMwMDRkNzgsIDB4MjQwNDAwMDEsCi0weDI2MTAwMDAxLCAweDJlMDIwMDIwLCAweDE0NDBmZmZiLCAweDAsCi0weGMwMDRkNzgsIDB4MjAyMSwgMHhjMDA0ZDc4LCAweDI0MDQwMDAxLAotMHhjMDA0ZDc4LCAweDI0MDQwMDAxLCAweGMwMDRkNzgsIDB4MjAyMSwKLTB4MjQxMDAwMTAsIDB4YzAwNGQ3OCwgMHgyMDIxLCAweDEwODA0MiwKLTB4MTYwMGZmZmMsIDB4MCwgMHgyNDEwMDAxMCwgMHgzMjAyMDAxZSwKLTB4MTA0MDAwMDIsIDB4MjAyMSwgMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LAotMHgxMDgwNDIsIDB4MTYwMGZmZmEsIDB4MzIwMjAwMWUsIDB4YzAwNGRiOSwKLTB4MzQxMDgwMDAsIDB4YzAwNGRiOSwgMHgwLCAweGMwMDRkNTgsCi0weDAsIDB4NTA0MDAwMDUsIDB4MTA4MDQyLCAweDk3YTIwMDIwLAotMHg1MDEwMjUsIDB4YTdhMjAwMjAsIDB4MTA4MDQyLCAweDE2MDBmZmY3LAotMHgwLCAweGMwMDRkYjksIDB4ODAyMSwgMHhhN2EwMDAyMCwKLTB4YzAwNGQ3OCwgMHgyNDA0MDAwMSwgMHgyNjEwMDAwMSwgMHgyZTAyMDAyMCwKLTB4MTQ0MGZmZmIsIDB4MCwgMHhjMDA0ZDc4LCAweDIwMjEsCi0weGMwMDRkNzgsIDB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwgMHgyNDA0MDAwMSwKLTB4YzAwNGQ3OCwgMHgyMDIxLCAweDI0MTAwMDEwLCAweGMwMDRkNzgsCi0weDIwMjEsIDB4MTA4MDQyLCAweDE2MDBmZmZjLCAweDAsCi0weDI0MTAwMDEwLCAweDMyMDIwMDFlLCAweDEwNDAwMDAyLCAweDIwMjEsCi0weDI0MDQwMDAxLCAweGMwMDRkNzgsIDB4MTA4MDQyLCAweDE2MDBmZmZhLAotMHgzMjAyMDAxZSwgMHhjMDA0ZGI5LCAweDM0MTA4MDAwLCAweGMwMDRkYjksCi0weDAsIDB4YzAwNGQ1OCwgMHgwLCAweDUwNDAwMDA1LAotMHgxMDgwNDIsIDB4OTdhMjAwMjAsIDB4NTAxMDI1LCAweGE3YTIwMDIwLAotMHgxMDgwNDIsIDB4MTYwMGZmZjcsIDB4MCwgMHhjMDA0ZGI5LAotMHg4MDIxLCAweGE3YTAwMDIyLCAweGMwMDRkNzgsIDB4MjQwNDAwMDEsCi0weDI2MTAwMDAxLCAweDJlMDIwMDIwLCAweDE0NDBmZmZiLCAweDAsCi0weGMwMDRkNzgsIDB4MjAyMSwgMHhjMDA0ZDc4LCAweDI0MDQwMDAxLAotMHhjMDA0ZDc4LCAweDIwMjEsIDB4YzAwNGQ3OCwgMHgyNDA0MDAwMSwKLTB4MjQxMDAwMTAsIDB4YzAwNGQ3OCwgMHgyMDIxLCAweDEwODA0MiwKLTB4MTYwMGZmZmMsIDB4MCwgMHgyNDEwMDAxMCwgMHhjMDA0ZDc4LAotMHgyMDIxLCAweDEwODA0MiwgMHgxNjAwZmZmYywgMHgwLAotMHhjMDA0ZDc4LCAweDI0MDQwMDAxLCAweGMwMDRkNzgsIDB4MjAyMSwKLTB4MzQxMDgwMDAsIDB4OTdhMjAwMjIsIDB4NTAxMDI0LCAweDEwNDAwMDAyLAotMHgyMDIxLCAweDI0MDQwMDAxLCAweGMwMDRkNzgsIDB4MTA4MDQyLAotMHgxNjAwZmZmOCwgMHgwLCAweGMwMDRkYjksIDB4MCwKLTB4MjQwNDAwMTgsIDB4MjQwNTAwMDIsIDB4YzAwNGRkYiwgMHgyNDA2MDAwNCwKLTB4M2MxMDAwMDEsIDB4OGUxMDZlMjQsIDB4MjQwMjAwMDEsIDB4MTYwMjAxMWQsCi0weDAsIDB4M2MwMjAwMDEsIDB4OTQ0MjZmMjYsIDB4M2MwMTAwMDEsCi0weGFjMjA2ZTI0LCAweDI0NDI5ZmJjLCAweDJjNDIwMDA0LCAweDEwNDAwMDBjLAotMHgyNDA0MDAwOSwgMHgyNDA1MDAwMSwgMHhjMDA0ZGRiLCAweDI0MDYwNDAwLAotMHgyNDA0MDAxOCwgMHgyNDA1MDAwMSwgMHhjMDA0ZGRiLCAweDI0MDYwMDIwLAotMHgyNDA0MDAxOCwgMHgyNDA1MDAwMSwgMHhjMDA0ZGRiLCAweDI0MDYyMDAwLAotMHgzYzAyNDAwMCwgMHgyNDIxMDI0LCAweDEwNDAwMTIzLCAweDNjMDIyMDAwLAotMHgyNDIxMDI0LCAweDEwNDAwMDA0LCAweDAsIDB4M2MwMTAwMDEsCi0weDEwMDAwMDAzLCAweGFjMzA2ZjFjLCAweDNjMDEwMDAxLCAweGFjMjA2ZjFjLAotMHgzYzAzMDAwMSwgMHg4YzYzNmYzNCwgMHgyNDAyMDAwNSwgMHgxNDYyMDBmOSwKLTB4MCwgMHgzYzAyMDAwMSwgMHg4YzQyNmYxYywgMHgxMDQwMDA2NywKLTB4M2MwMjAwMDQsIDB4MjQyMTAyNCwgMHgxMDQwMDAxMSwgMHhhN2EwMDAxOCwKLTB4M2MwMjAwMDgsIDB4MjQyMTAyNCwgMHgxMDQwMDAwMiwgMHgyNDAyMDIwMCwKLTB4YTdhMjAwMTgsIDB4M2MwMjAwMTAsIDB4MjQyMTAyNCwgMHgxMDQwMDAwNCwKLTB4MCwgMHg5N2EyMDAxOCwgMHgzNDQyMDEwMCwgMHhhN2EyMDAxOCwKLTB4OTdhNjAwMTgsIDB4MjQwNDAwMDksIDB4MTAwMDAwMDQsIDB4MjgyMSwKLTB4MjQwNDAwMDksIDB4MjgyMSwgMHgzMDIxLCAweGMwMDRkZGIsCi0weDAsIDB4MjQwMjAwMDEsIDB4YTdhMjAwMWEsIDB4M2MwMjAwMDgsCi0weDI0MjEwMjQsIDB4MTA0MDAwMGMsIDB4M2MwMjAwMDIsIDB4MjQyMTAyNCwKLTB4MTA0MDAwMDIsIDB4MjQwMjAxMDEsIDB4YTdhMjAwMWEsIDB4M2MwMjAwMDEsCi0weDI0MjEwMjQsIDB4MTA0MDAwMDUsIDB4M2MwMjAwMTAsIDB4OTdhMjAwMWEsCi0weDM0NDIwMDQwLCAweGE3YTIwMDFhLCAweDNjMDIwMDEwLCAweDI0MjEwMjQsCi0weDEwNDAwMDBlLCAweDNjMDIwMDAyLCAweDI0MjEwMjQsIDB4MTA0MDAwMDUsCi0weDNjMDIwMDAxLCAweDk3YTIwMDFhLCAweDM0NDIwMDgwLCAweGE3YTIwMDFhLAotMHgzYzAyMDAwMSwgMHgyNDIxMDI0LCAweDEwNDAwMDA1LCAweDNjMDMwMGEwLAotMHg5N2EyMDAxYSwgMHgzNDQyMDAyMCwgMHhhN2EyMDAxYSwgMHgzYzAzMDBhMCwKLTB4MjQzMTAyNCwgMHg1NDQzMDAwNCwgMHgzYzAyMDAyMCwgMHg5N2EyMDAxYSwKLTB4MTAwMDAwMGMsIDB4MzQ0MjA0MDAsIDB4MjQyMTAyNCwgMHg1MDQwMDAwNCwKLTB4M2MwMjAwODAsIDB4OTdhMjAwMWEsIDB4MTAwMDAwMDYsIDB4MzQ0MjA4MDAsCi0weDI0MjEwMjQsIDB4MTA0MDAwMDQsIDB4MCwgMHg5N2EyMDAxYSwKLTB4MzQ0MjBjMDAsIDB4YTdhMjAwMWEsIDB4OTdhNjAwMWEsIDB4MjQwNDAwMDQsCi0weGMwMDRkZGIsIDB4MjgyMSwgMHgzYzAyMDAwNCwgMHgyNDIxMDI0LAotMHgxMDQwMDAwNCwgMHhhN2EwMDAxYywgMHgzMjQyNTAwMCwgMHgxNDQwMDAwNCwKLTB4MCwgMHgzMjQyNDAwMCwgMHgxMDQwMDAwNSwgMHgyMDIxLAotMHhjMDA0Y2Y5LCAweDI0MDIwMjEsIDB4MTAwMDAwOTYsIDB4MCwKLTB4OTdhNjAwMWMsIDB4MjgyMSwgMHgzNGM2MTIwMCwgMHhjMDA0ZGRiLAotMHhhN2E2MDAxYywgMHgxMDAwMDA4ZiwgMHgwLCAweDI0MjEwMjQsCi0weDEwNDAwMDA0LCAweGE3YTAwMDE4LCAweDMyNDI1MDAwLCAweDE0NDAwMDA0LAotMHgwLCAweDMyNDI0MDAwLCAweDEwNDAwMDA1LCAweDNjMDIwMDEwLAotMHhjMDA0Y2Y5LCAweDI0MDIwMjEsIDB4MTAwMDAwMTksIDB4YTdhMDAwMWEsCi0weDI0MjEwMjQsIDB4MTA0MDAwMDQsIDB4MCwgMHg5N2EyMDAxOCwKLTB4MTAwMDAwMDQsIDB4YTdhMjAwMTgsIDB4OTdhMjAwMTgsIDB4MzQ0MjAxMDAsCi0weGE3YTIwMDE4LCAweDNjMDIwMDAxLCAweDI0MjEwMjQsIDB4MTA0MDAwMDQsCi0weDAsIDB4OTdhMjAwMTgsIDB4MTAwMDAwMDQsIDB4YTdhMjAwMTgsCi0weDk3YTIwMDE4LCAweDM0NDIyMDAwLCAweGE3YTIwMDE4LCAweDk3YTYwMDE4LAotMHgyMDIxLCAweGMwMDRkZGIsIDB4MjgyMSwgMHhhN2EwMDAxYSwKLTB4ODAyMSwgMHhjMDA0ZDc4LCAweDI0MDQwMDAxLCAweDI2MTAwMDAxLAotMHgyZTAyMDAyMCwgMHgxNDQwZmZmYiwgMHgwLCAweGMwMDRkNzgsCi0weDIwMjEsIDB4YzAwNGQ3OCwgMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LAotMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LCAweDIwMjEsIDB4MjQxMDAwMTAsCi0weDMyMDIwMDAxLCAweDEwNDAwMDAyLCAweDIwMjEsIDB4MjQwNDAwMDEsCi0weGMwMDRkNzgsIDB4MTA4MDQyLCAweDE2MDBmZmZhLCAweDMyMDIwMDAxLAotMHgyNDEwMDAxMCwgMHhjMDA0ZDc4LCAweDIwMjEsIDB4MTA4MDQyLAotMHgxNjAwZmZmYywgMHgwLCAweGMwMDRkYjksIDB4MzQxMDgwMDAsCi0weGMwMDRkYjksIDB4MCwgMHhjMDA0ZDU4LCAweDAsCi0weDUwNDAwMDA1LCAweDEwODA0MiwgMHg5N2EyMDAxYSwgMHg1MDEwMjUsCi0weGE3YTIwMDFhLCAweDEwODA0MiwgMHgxNjAwZmZmNywgMHgwLAotMHhjMDA0ZGI5LCAweDgwMjEsIDB4YTdhMDAwMWEsIDB4YzAwNGQ3OCwKLTB4MjQwNDAwMDEsIDB4MjYxMDAwMDEsIDB4MmUwMjAwMjAsIDB4MTQ0MGZmZmIsCi0weDAsIDB4YzAwNGQ3OCwgMHgyMDIxLCAweGMwMDRkNzgsCi0weDI0MDQwMDAxLCAweGMwMDRkNzgsIDB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwKLTB4MjAyMSwgMHgyNDEwMDAxMCwgMHgzMjAyMDAwMSwgMHgxMDQwMDAwMiwKLTB4MjAyMSwgMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LCAweDEwODA0MiwKLTB4MTYwMGZmZmEsIDB4MzIwMjAwMDEsIDB4MjQxMDAwMTAsIDB4YzAwNGQ3OCwKLTB4MjAyMSwgMHgxMDgwNDIsIDB4MTYwMGZmZmMsIDB4MCwKLTB4YzAwNGRiOSwgMHgzNDEwODAwMCwgMHhjMDA0ZGI5LCAweDAsCi0weGMwMDRkNTgsIDB4MCwgMHg1MDQwMDAwNSwgMHgxMDgwNDIsCi0weDk3YTIwMDFhLCAweDUwMTAyNSwgMHhhN2EyMDAxYSwgMHgxMDgwNDIsCi0weDE2MDBmZmY3LCAweDAsIDB4YzAwNGRiOSwgMHgwLAotMHgzYzA0MDAwMSwgMHgyNDg0NmJjYywgMHg5N2E2MDAxOCwgMHg5N2E3MDAxYSwKLTB4M2MwMjAwMDEsIDB4OGM0MjZkOTgsIDB4M2MwMzAwMDEsIDB4OGM2MzZmMWMsCi0weDNjMDUwMDBkLCAweDM0YTUwMjA1LCAweGFmYTIwMDEwLCAweGMwMDJiM2IsCi0weGFmYTMwMDE0LCAweDhmODMwMDU0LCAweDI0MDIwMDA0LCAweDNjMDEwMDAxLAotMHhhYzIyNmRkNCwgMHgzYzAxMDAwMSwgMHgxMDAwMDAxNywgMHhhYzIzNmYzOCwKLTB4OGY4MzAwNTQsIDB4M2MwMjAwMDEsIDB4OGM0MjZmMzgsIDB4MjQ2M2ZmOWMsCi0weDQzMTAyMywgMHgyYzQyMDA2NCwgMHgxNDQwMDAwZiwgMHgwLAotMHg4ZjgyMDIyMCwgMHgyNDAzMDAwNSwgMHgzYzAxMDAwMSwgMHhhYzIzNmRkNCwKLTB4M2MwM2Y3MDAsIDB4NDMxMDI1LCAweDEwMDAwMDA3LCAweGFmODIwMjIwLAotMHgyNDAyMDAwNiwgMHgzYzAxMDAwMSwgMHhhYzIyNmRkNCwgMHgyNDAyMDAxMSwKLTB4M2MwMTAwMDEsIDB4YWMyMjZkZDAsIDB4OGZiZjAwMzQsIDB4OGZiMjAwMzAsCi0weDhmYjEwMDJjLCAweDhmYjAwMDI4LCAweDNlMDAwMDgsIDB4MjdiZDAwMzgsCi0weDI3YmRmZmQ4LCAweGFmYjAwMDE4LCAweDgwODAyMSwgMHhhZmIxMDAxYywKLTB4ODgyMSwgMHgzMjAyNDAwMCwgMHgxMDQwMDAxMywgMHhhZmJmMDAyMCwKLTB4M2MwMjAwMTAsIDB4MjAyMTAyNCwgMHgyYzQyMDAwMSwgMHgyMTAyMywKLTB4MzA0MzQxMDAsIDB4M2MwMjAwMDEsIDB4MjAyMTAyNCwgMHgxNDQwMDAwNiwKLTB4MzQ3MTQwMDAsIDB4M2MwMjAwMDIsIDB4MjAyMTAyNCwgMHgxNDQwMDAwMiwKLTB4MzQ3MTYwMDAsIDB4MzQ3MTQwNDAsIDB4MjAyMSwgMHgyODIxLAotMHgxMDAwMDAzNiwgMHgyMjAzMDIxLCAweDMyMDIxMDAwLCAweDEwNDAwMDM1LAotMHgyMDIxLCAweDI4MjEsIDB4YzAwNGRkYiwgMHgyNDA2MDA0MCwKLTB4MjQwNDAwMTgsIDB4MjgyMSwgMHhjMDA0ZGRiLCAweDI0MDYwYzAwLAotMHgyNDA0MDAxNywgMHgyODIxLCAweGMwMDRkZGIsIDB4MjQwNjA0MDAsCi0weDI0MDQwMDE2LCAweDI4MjEsIDB4YzAwNGRkYiwgMHgyNDA2MDAwNiwKLTB4MjQwNDAwMTcsIDB4MjgyMSwgMHhjMDA0ZGRiLCAweDI0MDYyNTAwLAotMHgyNDA0MDAxNiwgMHgyODIxLCAweGMwMDRkZGIsIDB4MjQwNjAwMDYsCi0weDI0MDQwMDE3LCAweDI4MjEsIDB4YzAwNGRkYiwgMHgyNDA2NDYwMCwKLTB4MjQwNDAwMTYsIDB4MjgyMSwgMHhjMDA0ZGRiLCAweDI0MDYwMDA2LAotMHgyNDA0MDAxNywgMHgyODIxLCAweGMwMDRkZGIsIDB4MjQwNjY3MDAsCi0weDI0MDQwMDE2LCAweDI4MjEsIDB4YzAwNGRkYiwgMHgyNDA2MDAwNiwKLTB4MjQwNDAwMWYsIDB4MjgyMSwgMHhjMDA0ZGRiLCAweDI0MDYwMDEwLAotMHgyNDA0MDAwOSwgMHgyODIxLCAweGMwMDRkZGIsIDB4MjQwNjE1MDAsCi0weDI0MDQwMDA5LCAweDI4MjEsIDB4MjQwNjFkMDAsIDB4YzAwNGRkYiwKLTB4MCwgMHgzYzA0MDAwMSwgMHgyNDg0NmJmMCwgMHgzYzA1MDAwZSwKLTB4MzRhNTAxMDAsIDB4MjAwMzAyMSwgMHgyMjAzODIxLCAweGFmYTAwMDEwLAotMHhjMDAyYjNiLCAweGFmYTAwMDE0LCAweDhmYmYwMDIwLCAweDhmYjEwMDFjLAotMHg4ZmIwMDAxOCwgMHgzZTAwMDA4LCAweDI3YmQwMDI4LCAweDhmODUwMDQ0LAotMHg4ZjgyMDA0NCwgMHgzYzAzMDAwMSwgMHg0MzEwMjUsIDB4M2MwMzAwMDgsCi0weGFmODIwMDQ0LCAweDhmODQwMDU0LCAweDhmODIwMDU0LCAweGEzMjgyNCwKLTB4MTAwMDAwMDIsIDB4MjQ4NDAwMDEsIDB4OGY4MjAwNTQsIDB4ODIxMDIzLAotMHgyYzQyMDAwMiwgMHgxNDQwZmZmYywgMHgwLCAweDhmODIwMDQ0LAotMHgzYzAzZmZmZSwgMHgzNDYzZmZmZiwgMHg0MzEwMjQsIDB4YWY4MjAwNDQsCi0weDhmODMwMDU0LCAweDhmODIwMDU0LCAweDEwMDAwMDAyLCAweDI0NjMwMDAxLAotMHg4ZjgyMDA1NCwgMHg2MjEwMjMsIDB4MmM0MjAwMDIsIDB4MTQ0MGZmZmMsCi0weDAsIDB4M2UwMDAwOCwgMHhhMDEwMjEsIDB4OGY4MzAwNDQsCi0weDNjMDJmZmYwLCAweDM0NDJmZmZmLCAweDQyNDgwLCAweDYyMTgyNCwKLTB4M2MwMjAwMDIsIDB4ODIyMDI1LCAweDY0MTgyNSwgMHhhZjgzMDA0NCwKLTB4OGY4MjAwNDQsIDB4M2MwM2ZmZmUsIDB4MzQ2M2ZmZmYsIDB4NDMxMDI0LAotMHhhZjgyMDA0NCwgMHg4ZjgzMDA1NCwgMHg4ZjgyMDA1NCwgMHgxMDAwMDAwMiwKLTB4MjQ2MzAwMDEsIDB4OGY4MjAwNTQsIDB4NjIxMDIzLCAweDJjNDIwMDAyLAotMHgxNDQwZmZmYywgMHgwLCAweDhmODIwMDQ0LCAweDNjMDMwMDAxLAotMHg0MzEwMjUsIDB4YWY4MjAwNDQsIDB4OGY4MzAwNTQsIDB4OGY4MjAwNTQsCi0weDEwMDAwMDAyLCAweDI0NjMwMDAxLCAweDhmODIwMDU0LCAweDYyMTAyMywKLTB4MmM0MjAwMDIsIDB4MTQ0MGZmZmMsIDB4MCwgMHgzZTAwMDA4LAotMHgwLCAweDhmODIwMDQ0LCAweDI0MDNmZjdmLCAweDQzMTAyNCwKLTB4YWY4MjAwNDQsIDB4OGY4MzAwNTQsIDB4OGY4MjAwNTQsIDB4MTAwMDAwMDIsCi0weDI0NjMwMDAxLCAweDhmODIwMDU0LCAweDYyMTAyMywgMHgyYzQyMDAwMiwKLTB4MTQ0MGZmZmMsIDB4MCwgMHg4ZjgyMDA0NCwgMHgzNDQyMDA4MCwKLTB4YWY4MjAwNDQsIDB4OGY4MzAwNTQsIDB4OGY4MjAwNTQsIDB4MTAwMDAwMDIsCi0weDI0NjMwMDAxLCAweDhmODIwMDU0LCAweDYyMTAyMywgMHgyYzQyMDAwMiwKLTB4MTQ0MGZmZmMsIDB4MCwgMHgzZTAwMDA4LCAweDAsCi0weDhmODIwMDQ0LCAweDNjMDNmZmYwLCAweDM0NjNmZmZmLCAweDQzMTAyNCwKLTB4YWY4MjAwNDQsIDB4OGY4MjAwNDQsIDB4M2MwMzAwMDEsIDB4NDMxMDI1LAotMHhhZjgyMDA0NCwgMHg4ZjgzMDA1NCwgMHg4ZjgyMDA1NCwgMHgxMDAwMDAwMiwKLTB4MjQ2MzAwMDEsIDB4OGY4MjAwNTQsIDB4NjIxMDIzLCAweDJjNDIwMDAyLAotMHgxNDQwZmZmYywgMHgwLCAweDhmODIwMDQ0LCAweDNjMDNmZmZlLAotMHgzNDYzZmZmZiwgMHg0MzEwMjQsIDB4YWY4MjAwNDQsIDB4OGY4MzAwNTQsCi0weDhmODIwMDU0LCAweDEwMDAwMDAyLCAweDI0NjMwMDAxLCAweDhmODIwMDU0LAotMHg2MjEwMjMsIDB4MmM0MjAwMDIsIDB4MTQ0MGZmZmMsIDB4MCwKLTB4M2UwMDAwOCwgMHgwLCAweDI3YmRmZmM4LCAweGFmYjMwMDI0LAotMHg4MDk4MjEsIDB4YWZiZTAwMmMsIDB4YTBmMDIxLCAweGFmYjIwMDIwLAotMHhjMDkwMjEsIDB4MzNjMmZmZmYsIDB4YWZiZjAwMzAsIDB4YWZiNTAwMjgsCi0weGFmYjEwMDFjLCAweGFmYjAwMDE4LCAweDE0NDAwMDM0LCAweGE3YjIwMDEwLAotMHgzMjcxZmZmZiwgMHgyN2IyMDAxMCwgMHg4MDIxLCAweGMwMDRkNzgsCi0weDI0MDQwMDAxLCAweDI2MTAwMDAxLCAweDJlMDIwMDIwLCAweDE0NDBmZmZiLAotMHgwLCAweGMwMDRkNzgsIDB4MjAyMSwgMHhjMDA0ZDc4LAotMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LCAweDIwMjEsIDB4YzAwNGQ3OCwKLTB4MjQwNDAwMDEsIDB4MjQxMDAwMTAsIDB4MzIwMjAwMDEsIDB4MTA0MDAwMDIsCi0weDIwMjEsIDB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwgMHgxMDgwNDIsCi0weDE2MDBmZmZhLCAweDMyMDIwMDAxLCAweDI0MTAwMDEwLCAweDIzMDEwMjQsCi0weDEwNDAwMDAyLCAweDIwMjEsIDB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwKLTB4MTA4MDQyLCAweDE2MDBmZmZhLCAweDIzMDEwMjQsIDB4YzAwNGQ3OCwKLTB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwgMHgyMDIxLCAweDM0MTA4MDAwLAotMHg5NjQyMDAwMCwgMHg1MDEwMjQsIDB4MTA0MDAwMDIsIDB4MjAyMSwKLTB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwgMHgxMDgwNDIsIDB4MTIwMDAwNzUsCi0weDAsIDB4MTAwMGZmZjYsIDB4MCwgMHgzMjc1ZmZmZiwKLTB4MjdiMTAwMTAsIDB4YTdhMDAwMTAsIDB4ODAyMSwgMHhjMDA0ZDc4LAotMHgyNDA0MDAwMSwgMHgyNjEwMDAwMSwgMHgyZTAyMDAyMCwgMHgxNDQwZmZmYiwKLTB4MCwgMHhjMDA0ZDc4LCAweDIwMjEsIDB4YzAwNGQ3OCwKLTB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwgMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LAotMHgyMDIxLCAweDI0MTAwMDEwLCAweDMyMDIwMDAxLCAweDEwNDAwMDAyLAotMHgyMDIxLCAweDI0MDQwMDAxLCAweGMwMDRkNzgsIDB4MTA4MDQyLAotMHgxNjAwZmZmYSwgMHgzMjAyMDAwMSwgMHgyNDEwMDAxMCwgMHgyYjAxMDI0LAotMHgxMDQwMDAwMiwgMHgyMDIxLCAweDI0MDQwMDAxLCAweGMwMDRkNzgsCi0weDEwODA0MiwgMHgxNjAwZmZmYSwgMHgyYjAxMDI0LCAweGMwMDRkYjksCi0weDM0MTA4MDAwLCAweGMwMDRkYjksIDB4MCwgMHhjMDA0ZDU4LAotMHgwLCAweDUwNDAwMDA1LCAweDEwODA0MiwgMHg5NjIyMDAwMCwKLTB4NTAxMDI1LCAweGE2MjIwMDAwLCAweDEwODA0MiwgMHgxNjAwZmZmNywKLTB4MCwgMHhjMDA0ZGI5LCAweDAsIDB4MzNjNWZmZmYsCi0weDI0MDIwMDAxLCAweDU0YTIwMDA0LCAweDI0MDIwMDAyLCAweDk3YTIwMDEwLAotMHgxMDAwMDAwNiwgMHg1MjEwMjUsIDB4MTRhMjAwMDYsIDB4MzI3MWZmZmYsCi0weDk3YTIwMDEwLCAweDEyMTgyNywgMHg0MzEwMjQsIDB4YTdhMjAwMTAsCi0weDMyNzFmZmZmLCAweDI3YjIwMDEwLCAweDgwMjEsIDB4YzAwNGQ3OCwKLTB4MjQwNDAwMDEsIDB4MjYxMDAwMDEsIDB4MmUwMjAwMjAsIDB4MTQ0MGZmZmIsCi0weDAsIDB4YzAwNGQ3OCwgMHgyMDIxLCAweGMwMDRkNzgsCi0weDI0MDQwMDAxLCAweGMwMDRkNzgsIDB4MjAyMSwgMHhjMDA0ZDc4LAotMHgyNDA0MDAwMSwgMHgyNDEwMDAxMCwgMHgzMjAyMDAwMSwgMHgxMDQwMDAwMiwKLTB4MjAyMSwgMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LCAweDEwODA0MiwKLTB4MTYwMGZmZmEsIDB4MzIwMjAwMDEsIDB4MjQxMDAwMTAsIDB4MjMwMTAyNCwKLTB4MTA0MDAwMDIsIDB4MjAyMSwgMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LAotMHgxMDgwNDIsIDB4MTYwMGZmZmEsIDB4MjMwMTAyNCwgMHhjMDA0ZDc4LAotMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LCAweDIwMjEsIDB4MzQxMDgwMDAsCi0weDk2NDIwMDAwLCAweDUwMTAyNCwgMHgxMDQwMDAwMiwgMHgyMDIxLAotMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LCAweDEwODA0MiwgMHgxNjAwZmZmOCwKLTB4MCwgMHhjMDA0ZGI5LCAweDAsIDB4OGZiZjAwMzAsCi0weDhmYmUwMDJjLCAweDhmYjUwMDI4LCAweDhmYjMwMDI0LCAweDhmYjIwMDIwLAotMHg4ZmIxMDAxYywgMHg4ZmIwMDAxOCwgMHgzZTAwMDA4LCAweDI3YmQwMDM4LAotMHgwLCAweDAsIDB4MCwgMHgyN2JkZmZlOCwKLTB4YWZiZjAwMTAsIDB4OGVlMzA0YjgsIDB4MjQwMjAwMDgsIDB4MTQ2MjAxZTAsCi0weDAsIDB4M2MwMjAwMDEsIDB4OGM0MjZmMWMsIDB4MTQ0MDAwMDUsCi0weDAsIDB4YzAwM2RhZiwgMHg4Zjg0MDIyNCwgMHgxMDAwMDFkOCwKLTB4MCwgMHg4ZjgyMDIyMCwgMHgzYzAzMDAwOCwgMHg0MzEwMjQsCi0weDEwNDAwMDI2LCAweDI0MDIwMDAxLCAweDhmODQwMjI0LCAweDhmODIwMjIwLAotMHgzYzAzMDQwMCwgMHg0MzEwMjQsIDB4MTA0MDAwMDYsIDB4MCwKLTB4M2MwMTAwMDIsIDB4YWMyMDhmYTAsIDB4M2MwMTAwMDIsIDB4MTAwMDAwMGIsCi0weGFjMjA4ZmMwLCAweDNjMDMwMDAyLCAweDI0NjM4ZmEwLCAweDhjNjIwMDAwLAotMHgyNDQyMDAwMSwgMHhhYzYyMDAwMCwgMHgyYzQyMDAwMiwgMHgxNDQwMDAwMywKLTB4MjQwMjAwMDEsIDB4M2MwMTAwMDIsIDB4YWMyMjhmYzAsIDB4M2MwMjAwMDIsCi0weDhjNDI4ZmMwLCAweDEwNDAwMDA2LCAweDMwODIwMDQwLCAweDEwNDAwMDA0LAotMHgyNDAyMDAwMSwgMHgzYzAxMDAwMiwgMHgxMDAwMDAwMywgMHhhYzIyOGZjNCwKLTB4M2MwMTAwMDIsIDB4YWMyMDhmYzQsIDB4M2MwMTAwMDIsIDB4YWMyNDhmOWMsCi0weDNjMDEwMDAyLCAweDEwMDAwMDBiLCAweGFjMjA4ZmQwLCAweDNjMDEwMDAyLAotMHhhYzIyOGZkMCwgMHgzYzAxMDAwMiwgMHhhYzIwOGZjMCwgMHgzYzAxMDAwMiwKLTB4YWMyMDhmYTAsIDB4M2MwMTAwMDIsIDB4YWMyMDhmYzQsIDB4M2MwMTAwMDIsCi0weGFjMjA4ZjljLCAweDNjMDMwMDAyLCAweDhjNjM4ZjkwLCAweDNjMDIwMDAyLAotMHg4YzQyOGY5NCwgMHg1MDYyMDAwNCwgMHgyNDYzZmZmZiwgMHgzYzAxMDAwMiwKLTB4YWMyMzhmOTQsIDB4MjQ2M2ZmZmYsIDB4MmM2MjAwMGUsIDB4MTA0MDAxOTQsCi0weDMxMDgwLCAweDNjMDEwMDAxLCAweDIyMDgyMSwgMHg4YzIyNmMwMCwKLTB4NDAwMDA4LCAweDAsIDB4MjQwMjAwMDIsIDB4M2MwMTAwMDIsCi0weGFjMjA4ZmMwLCAweDNjMDEwMDAyLCAweGFjMjA4ZmEwLCAweDNjMDEwMDAyLAotMHhhYzIwOGY5YywgMHgzYzAxMDAwMiwgMHhhYzIwOGZjNCwgMHgzYzAxMDAwMiwKLTB4YWMyMDhmYjgsIDB4M2MwMTAwMDIsIDB4YWMyMDhmYjAsIDB4YWY4MDAyMjQsCi0weDNjMDEwMDAyLCAweGFjMjI4ZjkwLCAweDNjMDIwMDAyLCAweDhjNDI4ZmQwLAotMHgxNDQwMDA0ZiwgMHgzYzAyZmRmZiwgMHgzNDQyZmZmZiwgMHhjMDAzZGFmLAotMHgyODJhMDI0LCAweGFmODAwMjA0LCAweDhmODIwMjAwLCAweDI0MDNmZmZkLAotMHg0MzEwMjQsIDB4YWY4MjAyMDAsIDB4M2MwMTAwMDIsIDB4YWMyMDhmZTAsCi0weDhmODMwMDU0LCAweDNjMDIwMDAyLCAweDhjNDI4ZmI4LCAweDI0MDQwMDAxLAotMHgzYzAxMDAwMiwgMHhhYzI0OGZjYywgMHgyNDQyMDAwMSwgMHgzYzAxMDAwMiwKLTB4YWMyMjhmYjgsIDB4MmM0MjAwMDQsIDB4M2MwMTAwMDIsIDB4YWMyMzhmYjQsCi0weDE0NDAwMDA2LCAweDI0MDIwMDAzLCAweDNjMDEwMDAxLCAweGFjMjQ2ZDljLAotMHgzYzAxMDAwMiwgMHgxMDAwMDE1ZSwgMHhhYzIwOGZiOCwgMHgzYzAxMDAwMiwKLTB4MTAwMDAxNWIsIDB4YWMyMjhmOTAsIDB4OGY4MzAwNTQsIDB4M2MwMjAwMDIsCi0weDhjNDI4ZmI0LCAweDI0NjNkOGYwLCAweDQzMTAyMywgMHgyYzQyMjcxMCwKLTB4MTQ0MDAwMDMsIDB4MjQwMjAwMDQsIDB4M2MwMTAwMDIsIDB4YWMyMjhmOTAsCi0weDNjMDIwMDAyLCAweDhjNDI4ZmQwLCAweDE0NDAwMDIxLCAweDNjMDJmZGZmLAotMHgzNDQyZmZmZiwgMHgxMDAwMDE0YSwgMHgyODJhMDI0LCAweDNjMDQwMDAxLAotMHg4Yzg0NmYyMCwgMHgzYzAxMDAwMiwgMHhjMDA1MDg0LCAweGFjMjA4ZmE4LAotMHgzYzAyMDAwMiwgMHg4YzQyOGZkYywgMHhhZjgyMDIwNCwgMHgzYzAyMDAwMiwKLTB4OGM0MjhmZDAsIDB4MTQ0MDAwMTIsIDB4M2MwM2ZkZmYsIDB4OGY4MjAyMDQsCi0weDM0NjNmZmZmLCAweDMwNDIwMDMwLCAweDE0NDAwMTJmLCAweDI4M2EwMjQsCi0weDNjMDMwMDAyLCAweDhjNjM4ZmRjLCAweDI0MDIwMDA1LCAweDNjMDEwMDAyLAotMHhhYzIyOGY5MCwgMHgzYzAxMDAwMiwgMHgxMDAwMDEzMSwgMHhhYzIzOGZlMCwKLTB4M2MwMjAwMDIsIDB4OGM0MjhmZDAsIDB4MTA0MDAwMTAsIDB4M2MwMmZkZmYsCi0weDNjMDIwMDAxLCAweDhjNDI2ZTNjLCAweDI0NDIwMDAxLCAweDNjMDEwMDAxLAotMHhhYzIyNmUzYywgMHgyYzQyMDAwMiwgMHgxNDQwMDEyNSwgMHgyNDAyMDAwMSwKLTB4M2MwMTAwMDEsIDB4YWMyMjZlNDQsIDB4M2MwMTAwMDEsIDB4YWMyMDZlM2MsCi0weDNjMDEwMDAxLCAweDEwMDAwMTFlLCAweGFjMjI2ZDljLCAweDNjMDMwMDAyLAotMHg4YzYzOGZjMCwgMHgzNDQyZmZmZiwgMHgxMDYwMDExOSwgMHgyODJhMDI0LAotMHgzYzAyMDAwMiwgMHg4YzQyOGY5YywgMHgxMDQwMDExNSwgMHgwLAotMHgzYzAxMDAwMiwgMHhhYzIyOGZjOCwgMHgyNDAyMDAwMywgMHgzYzAxMDAwMiwKLTB4YWMyMjhmYTAsIDB4MTAwMDAwYjgsIDB4MjQwMjAwMDYsIDB4M2MwMTAwMDIsCi0weGFjMjA4ZmE4LCAweDhmODIwMjA0LCAweDM0NDIwMDQwLCAweGFmODIwMjA0LAotMHgzYzAyMDAwMiwgMHg4YzQyOGZlMCwgMHgyNDAzMDAwNywgMHgzYzAxMDAwMiwKLTB4YWMyMzhmOTAsIDB4MzQ0MjAwNDAsIDB4M2MwMTAwMDIsIDB4YWMyMjhmZTAsCi0weDNjMDIwMDAyLCAweDhjNDI4ZmMwLCAweDEwNDAwMDA1LCAweDAsCi0weDNjMDIwMDAyLCAweDhjNDI4ZjljLCAweDEwNDAwMGYwLCAweDI0MDIwMDAyLAotMHgzYzA1MDAwMiwgMHgyNGE1OGZhMCwgMHg4Y2EyMDAwMCwgMHgyYzQyNGUyMSwKLTB4MTA0MDAwZWEsIDB4MjQwMjAwMDIsIDB4M2MwMjAwMDIsIDB4OGM0MjhmYzQsCi0weDEwNDAwMGVmLCAweDI0MDRmZmJmLCAweDNjMDIwMDAyLCAweDhjNDI4ZjljLAotMHgzYzAzMDAwMiwgMHg4YzYzOGZjOCwgMHg0NDEwMjQsIDB4NjQxODI0LAotMHgxMDQzMDAwNCwgMHgyNDAyMDAwMSwgMHgzYzAxMDAwMiwgMHgxMDAwMDBlNCwKLTB4YWMyMjhmOTAsIDB4MjQwMjAwMDMsIDB4YWNhMjAwMDAsIDB4MjQwMjAwMDgsCi0weDNjMDEwMDAyLCAweGFjMjI4ZjkwLCAweDNjMDIwMDAyLCAweDhjNDI4ZmNjLAotMHgxMDQwMDAwYywgMHgyNDAyMDAwMSwgMHgzYzA0MDAwMiwgMHhjMDA1MDkxLAotMHg4Yzg0OGY5YywgMHgzYzAyMDAwMiwgMHg4YzQyOGZlOCwgMHgxNDQwMDAwNSwKLTB4MjQwMjAwMDEsIDB4M2MwMjAwMDIsIDB4OGM0MjhmZTQsIDB4MTA0MDAwMDYsCi0weDI0MDIwMDAxLCAweDNjMDEwMDAxLCAweGFjMjI2ZDljLCAweDNjMDEwMDAyLAotMHgxMDAwMDBjYiwgMHhhYzIwOGZiOCwgMHgzYzAyMDAwMiwgMHg4YzQyOGZiMCwKLTB4M2MwMzAwMDIsIDB4OGM2MzhmOWMsIDB4MmM0MjAwMDEsIDB4MjEwYzAsCi0weDMwNjMwMDA4LCAweDNjMDEwMDAyLCAweGFjMjI4ZmIwLCAweDNjMDEwMDAyLAotMHhhYzIzOGZhYywgMHg4ZjgzMDA1NCwgMHgyNDAyMDAwOSwgMHgzYzAxMDAwMiwKLTB4YWMyMjhmOTAsIDB4M2MwMTAwMDIsIDB4MTAwMDAwYjksIDB4YWMyMzhmYjQsCi0weDhmODMwMDU0LCAweDNjMDIwMDAyLCAweDhjNDI4ZmI0LCAweDI0NjNkOGYwLAotMHg0MzEwMjMsIDB4MmM0MjI3MTAsIDB4MTQ0MDAwOWYsIDB4MCwKLTB4M2MwMjAwMDIsIDB4OGM0MjhmYzAsIDB4MTA0MDAwMDUsIDB4MCwKLTB4M2MwMjAwMDIsIDB4OGM0MjhmOWMsIDB4MTA0MDAwYTAsIDB4MjQwMjAwMDIsCi0weDNjMDMwMDAyLCAweDI0NjM4ZmEwLCAweDhjNjIwMDAwLCAweDJjNDI0ZTIxLAotMHgxMDQwMDA5YSwgMHgyNDAyMDAwMiwgMHgzYzAyMDAwMiwgMHg4YzQyOGZjYywKLTB4MTA0MDAwMGUsIDB4MCwgMHgzYzAyMDAwMiwgMHg4YzQyOGY5YywKLTB4M2MwMTAwMDIsIDB4YWMyMDhmY2MsIDB4MzA0MjAwODAsIDB4MTA0MDAwMmYsCi0weDI0MDIwMDBjLCAweDhmODIwMjA0LCAweDMwNDIwMDgwLCAweDE0NDAwMDBjLAotMHgyNDAyMDAwMywgMHgxMDAwMDAyOSwgMHgyNDAyMDAwYywgMHgzYzAyMDAwMiwKLTB4OGM0MjhmOWMsIDB4MzA0MjAwODAsIDB4MTQ0MDAwMDUsIDB4MjQwMjAwMDMsCi0weDhmODIwMjA0LCAweDMwNDIwMDgwLCAweDEwNDAwMDFmLCAweDI0MDIwMDAzLAotMHhhYzYyMDAwMCwgMHgyNDAyMDAwYSwgMHgzYzAxMDAwMiwgMHhhYzIyOGY5MCwKLTB4M2MwNDAwMDIsIDB4MjQ4NDhmZDgsIDB4OGM4MjAwMDAsIDB4M2MwMzAwMDIsCi0weDhjNjM4ZmIwLCAweDQzMTAyNSwgMHhhZjgyMDIwNCwgMHg4YzgzMDAwMCwKLTB4M2MwNDAwMDIsIDB4OGM4NDhmYjAsIDB4MjQwMjAwMGIsIDB4M2MwMTAwMDIsCi0weGFjMjI4ZjkwLCAweDY0MTgyNSwgMHgzYzAxMDAwMiwgMHhhYzIzOGZlMCwKLTB4M2MwNTAwMDIsIDB4MjRhNThmYTAsIDB4OGNhMjAwMDAsIDB4MmM0MjRlMjEsCi0weDEwNDAwMDY2LCAweDI0MDIwMDAyLCAweDNjMDIwMDAyLCAweDhjNDI4ZmQwLAotMHgxMDQwMDAwNSwgMHgwLCAweDI0MDIwMDBjLCAweDNjMDEwMDAyLAotMHgxMDAwMDA2NywgMHhhYzIyOGY5MCwgMHgzYzAyMDAwMiwgMHg4YzQyOGZjMCwKLTB4MTA0MDAwNjMsIDB4MCwgMHgzYzA0MDAwMiwgMHg4Yzg0OGY5YywKLTB4MTA4MDAwNTUsIDB4MzA4MjAwMDgsIDB4M2MwMzAwMDIsIDB4OGM2MzhmYWMsCi0weDEwNjIwMDViLCAweDI0MDIwMDAzLCAweDNjMDEwMDAyLCAweGFjMjQ4ZmM4LAotMHhhY2EyMDAwMCwgMHgyNDAyMDAwNiwgMHgzYzAxMDAwMiwgMHgxMDAwMDA1NCwKLTB4YWMyMjhmOTAsIDB4OGY4MjAyMDAsIDB4MzQ0MjAwMDIsIDB4YWY4MjAyMDAsCi0weDhmODMwMDU0LCAweDI0MDIwMDBkLCAweDNjMDEwMDAyLCAweGFjMjI4ZjkwLAotMHgzYzAxMDAwMiwgMHhhYzIzOGZiNCwgMHg4ZjgzMDA1NCwgMHgzYzAyMDAwMiwKLTB4OGM0MjhmYjQsIDB4MjQ2M2Q4ZjAsIDB4NDMxMDIzLCAweDJjNDIyNzEwLAotMHgxNDQwMDAzMSwgMHgwLCAweDNjMDIwMDAyLCAweDhjNDI4ZmQwLAotMHgxMDQwMDAyMCwgMHgyNDAyMDAwZSwgMHgzYzAzMDAwMiwgMHg4YzYzOGZlNCwKLTB4M2MwMTAwMDIsIDB4MTQ2MDAwMTUsIDB4YWMyMjhmOTAsIDB4YzAwM2U2ZCwKLTB4MCwgMHgzYzA1MDAwMSwgMHg4Y2E1NmQ5OCwgMHhjMDA1MjliLAotMHgyMDIxLCAweDNjMDMwMDAxLCAweDhjNjM2ZDk4LCAweDI0MDIwMDA0LAotMHgxNDYyMDAwNSwgMHgyNDAzZmZmYiwgMHgzYzAyMDAwMSwgMHg4YzQyNmQ5NCwKLTB4MTAwMDAwMDMsIDB4MjQwM2ZmZjcsIDB4M2MwMjAwMDEsIDB4OGM0MjZkOTQsCi0weDQzMTAyNCwgMHgzYzAxMDAwMSwgMHhhYzIyNmQ5NCwgMHg4ZjgzMDIyNCwKLTB4M2MwMjAyMDAsIDB4M2MwMTAwMDIsIDB4YWMyMzhmZWMsIDB4MTAwMDAwMjAsCi0weDI4MmEwMjUsIDB4M2MwMjAwMDIsIDB4OGM0MjhmYzAsIDB4MTA0MDAwMDUsCi0weDAsIDB4M2MwMjAwMDIsIDB4OGM0MjhmOWMsIDB4MTA0MDAwMGYsCi0weDI0MDIwMDAyLCAweDNjMDIwMDAyLCAweDhjNDI4ZmEwLCAweDJjNDI0ZTIxLAotMHgxMDQwMDAwYSwgMHgyNDAyMDAwMiwgMHgzYzAyMDAwMiwgMHg4YzQyOGZjMCwKLTB4MTA0MDAwMGYsIDB4MCwgMHgzYzAyMDAwMiwgMHg4YzQyOGY5YywKLTB4MTQ0MDAwMGIsIDB4MCwgMHgyNDAyMDAwMiwgMHgzYzAxMDAwMiwKLTB4MTAwMDAwMDcsIDB4YWMyMjhmOTAsIDB4M2MwMjAwMDIsIDB4OGM0MjhmYzAsCi0weDEwNDAwMDAzLCAweDAsIDB4YzAwM2RhZiwgMHgwLAotMHg4ZjgyMDIyMCwgMHgzYzAzZjcwMCwgMHg0MzEwMjUsIDB4YWY4MjAyMjAsCi0weDhmYmYwMDEwLCAweDNlMDAwMDgsIDB4MjdiZDAwMTgsIDB4M2MwMzAwMDIsCi0weDI0NjM4ZmU4LCAweDhjNjIwMDAwLCAweDEwNDAwMDA1LCAweDM0NDIyMDAwLAotMHgzYzAxMDAwMiwgMHhhYzIyOGZkYywgMHgxMDAwMDAwMywgMHhhYzYwMDAwMCwKLTB4M2MwMTAwMDIsIDB4YWMyNDhmZGMsIDB4M2UwMDAwOCwgMHgwLAotMHgyN2JkZmZlMCwgMHgzMDgyMDAzMCwgMHhhZmJmMDAxOCwgMHgzYzAxMDAwMiwKLTB4YWMyMjhmZTQsIDB4MTQ0MDAwNjcsIDB4M2MwMmZmZmYsIDB4MzQ0MjFmMGUsCi0weDgyMTAyNCwgMHgxNDQwMDA2MSwgMHgyNDAyMDAzMCwgMHgzMDgyMjAwMCwKLTB4MTA0MDAwNWQsIDB4MzA4MzgwMDAsIDB4MzFhMDIsIDB4MzA4MjAwMDEsCi0weDIxMjAwLCAweDNjMDQwMDAxLCAweDhjODQ2ZjIwLCAweDYyMTgyNSwKLTB4MzMxYzIsIDB4M2MwMzAwMDEsIDB4MjQ2MzZlNDgsIDB4MzA4MjgwMDAsCi0weDIxMjAyLCAweDMwODQwMDAxLCAweDQyMjAwLCAweDQ0MTAyNSwKLTB4MjM5YzIsIDB4NjEwODAsIDB4NDMxMDIxLCAweDQ3MTAyMSwKLTB4OTA0MzAwMDAsIDB4MjQwMjAwMDEsIDB4MTA2MjAwMjUsIDB4MCwKLTB4MTA2MDAwMDcsIDB4MjQwMjAwMDIsIDB4MTA2MjAwMTMsIDB4MjQwMjAwMDMsCi0weDEwNjIwMDJjLCAweDNjMDUwMDBmLCAweDEwMDAwMDM3LCAweDAsCi0weDhmODIwMjAwLCAweDI0MDNmZWZmLCAweDQzMTAyNCwgMHhhZjgyMDIwMCwKLTB4OGY4MjAyMjAsIDB4M2MwM2ZmZmUsIDB4MzQ2M2ZmZmYsIDB4NDMxMDI0LAotMHhhZjgyMDIyMCwgMHgzYzAxMDAwMiwgMHhhYzIwOTAwNCwgMHgzYzAxMDAwMiwKLTB4MTAwMDAwMzQsIDB4YWMyMDkwMGMsIDB4OGY4MjAyMDAsIDB4MzQ0MjAxMDAsCi0weGFmODIwMjAwLCAweDhmODIwMjIwLCAweDNjMDNmZmZlLCAweDM0NjNmZmZmLAotMHg0MzEwMjQsIDB4YWY4MjAyMjAsIDB4MjQwMjAxMDAsIDB4M2MwMTAwMDIsCi0weGFjMjI5MDA0LCAweDNjMDEwMDAyLCAweDEwMDAwMDI2LCAweGFjMjA5MDBjLAotMHg4ZjgyMDIwMCwgMHgyNDAzZmVmZiwgMHg0MzEwMjQsIDB4YWY4MjAyMDAsCi0weDhmODIwMjIwLCAweDNjMDMwMDAxLCAweDQzMTAyNSwgMHhhZjgyMDIyMCwKLTB4M2MwMTAwMDIsIDB4YWMyMDkwMDQsIDB4M2MwMTAwMDIsIDB4MTAwMDAwMTksCi0weGFjMjM5MDBjLCAweDhmODIwMjAwLCAweDM0NDIwMTAwLCAweGFmODIwMjAwLAotMHg4ZjgyMDIyMCwgMHgzYzAzMDAwMSwgMHg0MzEwMjUsIDB4YWY4MjAyMjAsCi0weDI0MDIwMTAwLCAweDNjMDEwMDAyLCAweGFjMjI5MDA0LCAweDNjMDEwMDAyLAotMHgxMDAwMDAwYywgMHhhYzIzOTAwYywgMHgzNGE1ZmZmZiwgMHgzYzA0MDAwMSwKLTB4MjQ4NDZjMzgsIDB4YWZhMzAwMTAsIDB4YzAwMmIzYiwgMHhhZmEwMDAxNCwKLTB4MTAwMDAwMDQsIDB4MCwgMHgyNDAyMDAzMCwgMHgzYzAxMDAwMiwKLTB4YWMyMjhmZTgsIDB4OGZiZjAwMTgsIDB4M2UwMDAwOCwgMHgyN2JkMDAyMCwKLTB4MCwgMHgwLCAweDAsIDB4MjdiZGZmYzgsCi0weGFmYjIwMDI4LCAweDgwOTAyMSwgMHhhZmIzMDAyYywgMHhhMDk4MjEsCi0weGFmYjAwMDIwLCAweGMwODAyMSwgMHgzYzA0MDAwMSwgMHgyNDg0NmM1MCwKLTB4M2MwNTAwMDksIDB4M2MwMjAwMDEsIDB4OGM0MjZkOTgsIDB4MzRhNTkwMDEsCi0weDI0MDMwMjEsIDB4MjYwMzgyMSwgMHhhZmJmMDAzMCwgMHhhZmIxMDAyNCwKLTB4YTdhMDAwMWEsIDB4YWZiMDAwMTQsIDB4YzAwMmIzYiwgMHhhZmEyMDAxMCwKLTB4MjQwMjAwMDIsIDB4MTI2MjAwODMsIDB4MmU2MjAwMDMsIDB4MTA0MDAwMDUsCi0weDI0MDIwMDAxLCAweDEyNjIwMDBhLCAweDAsIDB4MTAwMDAxNzMsCi0weDAsIDB4MjQwMjAwMDQsIDB4MTI2MjAwZjgsIDB4MjQwMjAwMDgsCi0weDEyNjIwMGY3LCAweDNjMDJmZmVjLCAweDEwMDAwMTZjLCAweDAsCi0weDNjMDIwMDAxLCAweDhjNDI2ZDk0LCAweDMwNDIwMDAyLCAweDE0NDAwMDA0LAotMHgxMjg5NDAsIDB4M2MwMmZmZmIsIDB4MzQ0MmZmZmYsIDB4MjAyODAyNCwKLTB4M2MwMTAwMDIsIDB4MzEwODIxLCAweGFjMzA4ZmZjLCAweDNjMDI0MDAwLAotMHgyMDIxMDI0LCAweDEwNDAwMDRlLCAweDEwMjNjMiwgMHgzMDg0MDAzMCwKLTB4MTAxMzgyLCAweDMwNDIwMDFjLCAweDNjMDMwMDAxLCAweDI0NjM2ZGQ4LAotMHg0MzEwMjEsIDB4ODIzODIxLCAweDNjMDIwMDIwLCAweDIwMjEwMjQsCi0weDEwNDAwMDA2LCAweDI0MDIwMTAwLCAweDNjMDEwMDAyLCAweDMxMDgyMSwKLTB4YWMyMjkwMDAsIDB4MTAwMDAwMDUsIDB4M2MwMjAwODAsIDB4M2MwMTAwMDIsCi0weDMxMDgyMSwgMHhhYzIwOTAwMCwgMHgzYzAyMDA4MCwgMHgyMDIxMDI0LAotMHgxMDQwMDAwNiwgMHgxMjE5NDAsIDB4M2MwMjAwMDEsIDB4M2MwMTAwMDIsCi0weDIzMDgyMSwgMHgxMDAwMDAwNSwgMHhhYzIyOTAwOCwgMHgxMjExNDAsCi0weDNjMDEwMDAyLCAweDIyMDgyMSwgMHhhYzIwOTAwOCwgMHg5NGU0MDAwMCwKLTB4M2MwMzAwMDEsIDB4OGM2MzZmNDAsIDB4MjQwMjAwMDUsIDB4MTA2MjAwMTAsCi0weGE3YTQwMDE4LCAweDMyMDI0MDAwLCAweDEwNDAwMDAyLCAweDM0ODI0MDAwLAotMHhhN2EyMDAxOCwgMHgyNDA0MDAwMSwgMHg5NGUyMDAwMiwgMHgyNDA1MDAwNCwKLTB4MjRlNjAwMDIsIDB4MzQ0MjAwMDEsIDB4YzAwNDViZSwgMHhhNGUyMDAwMiwKLTB4MjQwNDAwMDEsIDB4MjgyMSwgMHhjMDA0NWJlLCAweDI3YTYwMDE4LAotMHgzYzAyMDAwMSwgMHg4YzQyNmQ5OCwgMHgyNDExMDAwMSwgMHgzYzAxMDAwMSwKLTB4YWMzMTZkYTQsIDB4MTQ1MzAwMDQsIDB4MzIwMjgwMDAsIDB4YzAwM2RhZiwKLTB4MCwgMHgzMjAyODAwMCwgMHgxMDQwMDExYywgMHgwLAotMHhjMDAzZGFmLCAweDAsIDB4M2MwMzAwMDEsIDB4OGM2MzZmNDAsCi0weDI0MDIwMDA1LCAweDEwNjIwMTE1LCAweDI0MDIwMDAyLCAweDNjMDEwMDAxLAotMHhhYzMxNmQ5YywgMHgzYzAxMDAwMSwgMHgxMDAwMDExMCwgMHhhYzIyNmQ5OCwKLTB4MjQwNDAwMDEsIDB4MjQwNTAwMDQsIDB4MjdiMDAwMWEsIDB4YzAwNDViZSwKLTB4MjAwMzAyMSwgMHgyNDA0MDAwMSwgMHgyODIxLCAweGMwMDQ1YmUsCi0weDIwMDMwMjEsIDB4M2MwMjAwMDIsIDB4NTExMDIxLCAweDhjNDI4ZmY0LAotMHgzYzA0MDAwMSwgMHg4Yzg0NmQ5OCwgMHgzYzAzYmZmZiwgMHgzNDYzZmZmZiwKLTB4M2MwMTAwMDEsIDB4YWMzMzZkYTQsIDB4NDMxMDI0LCAweDNjMDEwMDAyLAotMHgzMTA4MjEsIDB4MTA5MzAwZjcsIDB4YWMyMjhmZjQsIDB4MTAwMDAwZjcsCi0weDAsIDB4M2MwMjIwMDAsIDB4MjAyMTAyNCwgMHgxMDQwMDAwNSwKLTB4MjQwMjAwMDEsIDB4M2MwMTAwMDEsIDB4YWMyMjZmMWMsIDB4MTAwMDAwMDQsCi0weDEyODk0MCwgMHgzYzAxMDAwMSwgMHhhYzIwNmYxYywgMHgxMjg5NDAsCi0weDNjMDEwMDAyLCAweDMxMDgyMSwgMHhhYzMwOGZmOCwgMHgzYzAyNDAwMCwKLTB4MjAyMTAyNCwgMHgxNDQwMDAxNCwgMHgwLCAweDNjMDIwMDAxLAotMHg4YzQyNmYxYywgMHgxMDQwMDAwNiwgMHgyNDA0MDAwNCwgMHgyNDA1MDAwMSwKLTB4YzAwNGRkYiwgMHgyNDA2MjAwMCwgMHgyNDAyMDAwMSwgMHhhZWUyMDRiOCwKLTB4M2MwMjAwMDIsIDB4NTExMDIxLCAweDhjNDI4ZmYwLCAweDNjMDNiZmZmLAotMHgzNDYzZmZmZiwgMHg0MzEwMjQsIDB4M2MwMTAwMDIsIDB4MzEwODIxLAotMHgxMDAwMDBkMCwgMHhhYzIyOGZmMCwgMHgzYzAyMDAwMSwgMHg4YzQyNmYxYywKLTB4MTA0MDAwMjgsIDB4M2MwMzAwYTAsIDB4MjAzMTAyNCwgMHg1NDQzMDAwZCwKLTB4M2MwMjAwMjAsIDB4M2MwMjAwMDEsIDB4OGM0MjZmMjAsIDB4MjQwMzAxMDAsCi0weDNjMDEwMDAyLCAweDMxMDgyMSwgMHhhYzIzOTAwNCwgMHgzYzAzMDAwMSwKLTB4M2MwMTAwMDIsIDB4MzEwODIxLCAweGFjMjM5MDBjLCAweDEwMDAwMDE1LAotMHgzNDQyMDQwMCwgMHgyMDIxMDI0LCAweDEwNDAwMDA4LCAweDI0MDMwMTAwLAotMHgzYzAyMDAwMSwgMHg4YzQyNmYyMCwgMHgzYzAxMDAwMiwgMHgzMTA4MjEsCi0weGFjMjM5MDA0LCAweDEwMDAwMDBiLCAweDM0NDIwODAwLCAweDNjMDIwMDgwLAotMHgyMDIxMDI0LCAweDEwNDAwMDJlLCAweDNjMDMwMDAxLCAweDNjMDIwMDAxLAotMHg4YzQyNmYyMCwgMHgzYzAxMDAwMiwgMHgzMTA4MjEsIDB4YWMyMzkwMGMsCi0weDM0NDIwYzAwLCAweDNjMDEwMDAxLCAweGFjMjI2ZjIwLCAweDEwMDAwMDI1LAotMHgyNDA0MDAwMSwgMHgzYzAyMDAyMCwgMHgyMDIxMDI0LCAweDEwNDAwMDA2LAotMHgyNDAyMDEwMCwgMHgzYzAxMDAwMiwgMHgzMTA4MjEsIDB4YWMyMjkwMDQsCi0weDEwMDAwMDA1LCAweDNjMDIwMDgwLCAweDNjMDEwMDAyLCAweDMxMDgyMSwKLTB4YWMyMDkwMDQsIDB4M2MwMjAwODAsIDB4MjAyMTAyNCwgMHgxMDQwMDAwNywKLTB4MTIxOTQwLCAweDNjMDIwMDAxLCAweDNjMDEwMDAyLCAweDIzMDgyMSwKLTB4YWMyMjkwMGMsIDB4MTAwMDAwMDYsIDB4MjQwNDAwMDEsIDB4MTIxMTQwLAotMHgzYzAxMDAwMiwgMHgyMjA4MjEsIDB4YWMyMDkwMGMsIDB4MjQwNDAwMDEsCi0weDI4MjEsIDB4MjdiMDAwMWUsIDB4YzAwNDU3YywgMHgyMDAzMDIxLAotMHgyNDA0MDAwMSwgMHgyODIxLCAweGMwMDQ1N2MsIDB4MjAwMzAyMSwKLTB4MjQwNDAwMDEsIDB4MjQwNTAwMDEsIDB4MjdiMDAwMWMsIDB4YzAwNDU3YywKLTB4MjAwMzAyMSwgMHgyNDA0MDAwMSwgMHgyNDA1MDAwMSwgMHhjMDA0NTdjLAotMHgyMDAzMDIxLCAweDEwMDAwMDc3LCAweDAsIDB4M2MwMmZmZWMsCi0weDM0NDJmZmZmLCAweDIwMjgwMjQsIDB4M2MwMjAwMDgsIDB4MjAyODAyNSwKLTB4MTIxMTQwLCAweDNjMDEwMDAyLCAweDIyMDgyMSwgMHhhYzMwOGZmOCwKLTB4M2MwMjIwMDAsIDB4MjAyMTAyNCwgMHgxMDQwMDAwOSwgMHgwLAotMHgzYzAyMDAwMSwgMHg4YzQyNmU0NCwgMHgxNDQwMDAwNSwgMHgyNDAyMDAwMSwKLTB4M2MwMTAwMDEsIDB4YWMyMjZmMWMsIDB4MTAwMDAwMDQsIDB4M2MwMjQwMDAsCi0weDNjMDEwMDAxLCAweGFjMjA2ZjFjLCAweDNjMDI0MDAwLCAweDIwMjEwMjQsCi0weDE0NDAwMDFkLCAweDI0MDIwZTAxLCAweDNjMDMwMDAxLCAweDhjNjM2ZjFjLAotMHhhZjgyMDIzOCwgMHgzYzAxMDAwMSwgMHhhYzIwNmRiMCwgMHgxMDYwMDAwNSwKLTB4MjQwMjIwMjAsIDB4M2MwMTAwMDEsIDB4YWMyMjZmMjAsIDB4MjQwMjAwMDEsCi0weGFlZTIwNGI4LCAweDNjMDRiZmZmLCAweDEyMTk0MCwgMHgzYzAyMDAwMiwKLTB4NDMxMDIxLCAweDhjNDI4ZmYwLCAweDNjMDUwMDAxLCAweDhjYTU2ZDk4LAotMHgzNDg0ZmZmZiwgMHg0NDEwMjQsIDB4M2MwMTAwMDIsIDB4MjMwODIxLAotMHhhYzIyOGZmMCwgMHgyNDAyMDAwMSwgMHgxMGEyMDA0NCwgMHgwLAotMHgxMDAwMDA0MCwgMHgwLCAweDNjMDIwMDAxLCAweDhjNDI2ZjFjLAotMHgxMDQwMDAxYywgMHgyNDAyMjAwMCwgMHgzYzAxMDAwMSwgMHhhYzIyNmYyMCwKLTB4M2MwMzAwYTAsIDB4MjAzMTAyNCwgMHgxNDQzMDAwNSwgMHgxMjExNDAsCi0weDM0MDJhMDAwLCAweDNjMDEwMDAxLCAweDEwMDAwMDJkLCAweGFjMjI2ZjIwLAotMHgzYzAzMDAwMiwgMHg2MjE4MjEsIDB4OGM2MzhmZjgsIDB4M2MwMjAwMjAsCi0weDYyMTAyNCwgMHgxMDQwMDAwNCwgMHgyNDAyMjAwMSwgMHgzYzAxMDAwMSwKLTB4MTAwMDAwMjMsIDB4YWMyMjZmMjAsIDB4M2MwMjAwODAsIDB4NjIxMDI0LAotMHgxMDQwMDAxZiwgMHgzNDAyYTAwMSwgMHgzYzAxMDAwMSwgMHgxMDAwMDAxYywKLTB4YWMyMjZmMjAsIDB4M2MwMjAwMjAsIDB4MjAyMTAyNCwgMHgxMDQwMDAwNywKLTB4MTIxOTQwLCAweDI0MDIwMTAwLCAweDNjMDEwMDAyLCAweDIzMDgyMSwKLTB4YWMyMjkwMDQsIDB4MTAwMDAwMDYsIDB4M2MwMjAwODAsIDB4MTIxMTQwLAotMHgzYzAxMDAwMiwgMHgyMjA4MjEsIDB4YWMyMDkwMDQsIDB4M2MwMjAwODAsCi0weDIwMjEwMjQsIDB4MTA0MDAwMDYsIDB4MTIxOTQwLCAweDNjMDIwMDAxLAotMHgzYzAxMDAwMiwgMHgyMzA4MjEsIDB4MTAwMDAwMDUsIDB4YWMyMjkwMGMsCi0weDEyMTE0MCwgMHgzYzAxMDAwMiwgMHgyMjA4MjEsIDB4YWMyMDkwMGMsCi0weDNjMDMwMDAxLCAweDhjNjM2ZDk4LCAweDI0MDIwMDAxLCAweDEwNjIwMDAzLAotMHgwLCAweGMwMDNkYWYsIDB4MCwgMHg4ZmJmMDAzMCwKLTB4OGZiMzAwMmMsIDB4OGZiMjAwMjgsIDB4OGZiMTAwMjQsIDB4OGZiMDAwMjAsCi0weDNlMDAwMDgsIDB4MjdiZDAwMzgsIDB4MjdiZGZmYjAsIDB4YWZiMzAwM2MsCi0weDk4MjEsIDB4YWZiNTAwNDAsIDB4YTgyMSwgMHhhZmIxMDAzNCwKLTB4ODgyMSwgMHgyNDAyMDAwMiwgMHhhZmJmMDA0OCwgMHhhZmJlMDA0NCwKLTB4YWZiMjAwMzgsIDB4YWZiMDAwMzAsIDB4YWZhNDAwMmMsIDB4YTdhMDAwMWEsCi0weGE3YTAwMDE4LCAweGE3YTAwMDIwLCAweGE3YTAwMDFlLCAweGE3YTAwMDIyLAotMHgxMGEyMDEzMCwgMHhhN2EwMDAxYywgMHgyY2EyMDAwMywgMHgxMDQwMDAwNSwKLTB4MjQwMjAwMDEsIDB4MTBhMjAwMGEsIDB4M2MwMjQwMDAsIDB4MTAwMDAyNWQsCi0weDIyMDEwMjEsIDB4MjQwMjAwMDQsIDB4MTBhMjAyMGEsIDB4MjQwMjAwMDgsCi0weDEwYTIwMjA4LCAweDIyMDEwMjEsIDB4MTAwMDAyNTYsIDB4MCwKLTB4OGZhODAwMmMsIDB4ODgxNDAsIDB4M2MwMzAwMDIsIDB4NzAxODIxLAotMHg4YzYzOGZmYywgMHg2MjEwMjQsIDB4MTQ0MDAwMDksIDB4MjQwNDAwMDEsCi0weDNjMDI3ZmZmLCAweDM0NDJmZmZmLCAweDYyODgyNCwgMHgzYzAxMDAwMiwKLTB4MzAwODIxLCAweGFjMzE4ZmY0LCAweDEwMDAwMjQ2LCAweDIyMDEwMjEsCi0weDI0MDUwMDAxLCAweGMwMDQ1N2MsIDB4MjdhNjAwMTgsIDB4MjQwNDAwMDEsCi0weDI0MDUwMDAxLCAweGMwMDQ1N2MsIDB4MjdhNjAwMTgsIDB4OTdhMjAwMTgsCi0weDMwNDIwMDA0LCAweDEwNDAwMGQ5LCAweDNjMTE0MDAwLCAweDNjMDIwMDAxLAotMHg4YzQyNmY0MCwgMHgyNDQzZmZmZiwgMHgyYzYyMDAwNiwgMHgxMDQwMDBkOSwKLTB4MzEwODAsIDB4M2MwMTAwMDEsIDB4MjIwODIxLCAweDhjMjI2YzY4LAotMHg0MDAwMDgsIDB4MCwgMHgyNDA0MDAwMSwgMHgyNDA1MDAxMSwKLTB4MjdiMDAwMWEsIDB4YzAwNDU3YywgMHgyMDAzMDIxLCAweDI0MDQwMDAxLAotMHgyNDA1MDAxMSwgMHhjMDA0NTdjLCAweDIwMDMwMjEsIDB4OTdhMzAwMWEsCi0weDMwNjI0MDAwLCAweDEwNDAwMDAyLCAweDNjMTUwMDEwLCAweDNjMTUwMDA4LAotMHgzMDYyODAwMCwgMHgxMDQwMDBhYSwgMHgzYzEzMDAwMSwgMHgxMDAwMDBhOCwKLTB4M2MxMzAwMDIsIDB4MjQwNDAwMDEsIDB4MjQwNTAwMTQsIDB4MjdiMDAwMWEsCi0weGMwMDQ1N2MsIDB4MjAwMzAyMSwgMHgyNDA0MDAwMSwgMHgyNDA1MDAxNCwKLTB4YzAwNDU3YywgMHgyMDAzMDIxLCAweDk3YTMwMDFhLCAweDMwNjIxMDAwLAotMHgxMDQwMDAwMiwgMHgzYzE1MDAxMCwgMHgzYzE1MDAwOCwgMHgzMDYyMDgwMCwKLTB4MTA0MDAwOTcsIDB4M2MxMzAwMDEsIDB4MTAwMDAwOTUsIDB4M2MxMzAwMDIsCi0weDI0MDQwMDAxLCAweDI0MDUwMDE5LCAweDI3YjAwMDFjLCAweGMwMDQ1N2MsCi0weDIwMDMwMjEsIDB4MjQwNDAwMDEsIDB4MjQwNTAwMTksIDB4YzAwNDU3YywKLTB4MjAwMzAyMSwgMHg5N2EyMDAxYywgMHgzMDQzMDcwMCwgMHgyNDAyMDQwMCwKLTB4MTA2MjAwMjcsIDB4Mjg2MjA0MDEsIDB4MTA0MDAwMGUsIDB4MjQwMjAyMDAsCi0weDEwNjIwMDFmLCAweDI4NjIwMjAxLCAweDEwNDAwMDA1LCAweDI0MDIwMTAwLAotMHg1MDYyMDAxZSwgMHgzYzEzMDAwMSwgMHgxMDAwMDAxZSwgMHgyNDA0MDAwMSwKLTB4MjQwMjAzMDAsIDB4NTA2MjAwMTksIDB4M2MxMzAwMDIsIDB4MTAwMDAwMTksCi0weDI0MDQwMDAxLCAweDI0MDIwNjAwLCAweDEwNjIwMDBkLCAweDI4NjIwNjAxLAotMHgxMDQwMDAwNSwgMHgyNDAyMDUwMCwgMHg1MDYyMDAwYiwgMHgzYzEzMDAwMiwKLTB4MTAwMDAwMTAsIDB4MjQwNDAwMDEsIDB4MjQwMjA3MDAsIDB4MTQ2MjAwMGQsCi0weDI0MDQwMDAxLCAweDNjMTMwMDA0LCAweDEwMDAwMDBhLCAweDNjMTUwMDA4LAotMHgxMDAwMDAwNiwgMHgzYzEzMDAwNCwgMHgxMDAwMDAwNSwgMHgzYzE1MDAwOCwKLTB4M2MxMzAwMDEsIDB4MTAwMDAwMDIsIDB4M2MxNTAwMDgsIDB4M2MxNTAwMTAsCi0weDI0MDQwMDAxLCAweDI0MDUwMDE4LCAweDI3YjAwMDFlLCAweGMwMDQ1N2MsCi0weDIwMDMwMjEsIDB4MjQwNDAwMDEsIDB4MjQwNTAwMTgsIDB4YzAwNDU3YywKLTB4MjAwMzAyMSwgMHg4ZmE4MDAyYywgMHg5N2E3MDAxZSwgMHg4MTE0MCwKLTB4M2MwNjAwMDIsIDB4YzIzMDIxLCAweDhjYzY4ZmY0LCAweDk3YTIwMDIyLAotMHgzYzEwMDAwMSwgMHgyNjEwNmM1YywgMHgyMDAyMDIxLCAweGFmYTIwMDEwLAotMHg5N2EyMDAxYywgMHgzYzA1MDAwYywgMHgzNGE1MDMwMywgMHhjMDAyYjNiLAotMHhhZmEyMDAxNCwgMHgzYzAyMDAwNCwgMHgxNjYyMDAxMCwgMHgzYzAyMDAwMSwKLTB4OGY4NDAwNTQsIDB4MjQwMzAwMDEsIDB4MjQwMjAwMDIsIDB4M2MwMTAwMDEsCi0weGFjMjM2ZDljLCAweDNjMDEwMDAxLCAweGFjMjI2ZDk4LCAweDNjMDEwMDAxLAotMHhhYzIzNmRhNCwgMHgzYzAxMDAwMSwgMHhhYzIzNmUyNCwgMHgzYzAxMDAwMSwKLTB4YWMyNDZmMzAsIDB4MTAwMDAwNGYsIDB4MmIzODgyNSwgMHgxNjYyMDAzOSwKLTB4M2MwMjgwMDAsIDB4M2MwMjAwMDEsIDB4OGM0MjZlMjAsIDB4MTQ0MDAwMWUsCi0weDI0MDQwMDE4LCAweDIwMjEsIDB4MjgyMSwgMHhjMDA0ZGRiLAotMHgzNDA2ODAwMCwgMHg4ZjgzMDA1NCwgMHg4ZjgyMDA1NCwgMHgyYjM4ODI1LAotMHgxMDAwMDAwMiwgMHgyNDYzMDAzMiwgMHg4ZjgyMDA1NCwgMHg2MjEwMjMsCi0weDJjNDIwMDMzLCAweDE0NDBmZmZjLCAweDAsIDB4OGY4MzAwNTQsCi0weDI0MDIwMDAxLCAweDNjMDEwMDAxLCAweGFjMjI2ZTIwLCAweDNjMDEwMDAxLAotMHhhYzIyNmQ5YywgMHgzYzAxMDAwMSwgMHhhYzIyNmQ5OCwgMHgzYzAxMDAwMSwKLTB4YWMyMjZkYTQsIDB4M2MwMTAwMDEsIDB4YWMyMjZlMjQsIDB4M2MwMTAwMDEsCi0weDEwMDAwMDJjLCAweGFjMjM2ZjMwLCAweDI4MjEsIDB4YzAwNGRkYiwKLTB4MjQwNjA0MDQsIDB4MjAyMSwgMHgyNDA1MDAxZSwgMHgyN2E2MDAxOCwKLTB4MjQwMjAwMDIsIDB4YzAwNDViZSwgMHhhN2EyMDAxOCwgMHgyMDIxLAotMHgyODIxLCAweDI3YTYwMDE4LCAweGMwMDQ1YmUsIDB4YTdhMDAwMTgsCi0weDI0MDQwMDE4LCAweDI0MDUwMDAyLCAweGMwMDRkZGIsIDB4MjQwNjAwMDQsCi0weDNjMDI4MDAwLCAweDIyMjEwMjUsIDB4MmIzMTgyNSwgMHgxMDAwMDAxNSwKLTB4NDM4ODI1LCAweDIyMjEwMjUsIDB4Mjc1MTgyNSwgMHg0Mzg4MjUsCi0weDIwMDIwMjEsIDB4OTdhNjAwMWMsIDB4M2MwNzAwMDEsIDB4OGNlNzZkOTgsCi0weDNjMDUwMDBjLCAweDM0YTUwMzI2LCAweGFmYjMwMDEwLCAweGMwMDJiM2IsCi0weGFmYjEwMDE0LCAweDEwMDAwMDA3LCAweDAsIDB4M2MxMTAwMDIsCi0weDIzMDg4MjEsIDB4OGUzMThmZmMsIDB4M2MwMjdmZmYsIDB4MzQ0MmZmZmYsCi0weDIyMjg4MjQsIDB4M2MwMjAwMDEsIDB4OGM0MjZkYTgsIDB4MTA0MDAwMWUsCi0weDAsIDB4M2MwMjAwMDEsIDB4OGM0MjZmMWMsIDB4MTA0MDAwMDIsCi0weDNjMDIyMDAwLCAweDIyMjg4MjUsIDB4OGZhODAwMmMsIDB4ODExNDAsCi0weDNjMDEwMDAyLCAweDIyMDgyMSwgMHg4YzIyOTAwMCwgMHgxMDQwMDAwMywKLTB4M2MwMjAwMjAsIDB4MTAwMDAwMDUsIDB4MjIyODgyNSwgMHgzYzAyZmZkZiwKLTB4MzQ0MmZmZmYsIDB4MjIyODgyNCwgMHg4ZmE4MDAyYywgMHg4MTE0MCwKLTB4M2MwMTAwMDIsIDB4MjIwODIxLCAweDhjMjI5MDA4LCAweDEwNDAwMDAzLAotMHgzYzAyMDA4MCwgMHgxMDAwMDAwNCwgMHgyMjI4ODI1LCAweDNjMDJmZjdmLAotMHgzNDQyZmZmZiwgMHgyMjI4ODI0LCAweDhmYTgwMDJjLCAweDgxMTQwLAotMHgzYzAxMDAwMiwgMHgyMjA4MjEsIDB4YWMzMThmZjQsIDB4MTAwMDAxMzUsCi0weDIyMDEwMjEsIDB4OGZhODAwMmMsIDB4OGYxNDAsIDB4M2MwMzAwMDIsCi0weDdlMTgyMSwgMHg4YzYzOGZmOCwgMHgzYzAyNDAwMCwgMHg2MjEwMjQsCi0weDE0NDAwMDA5LCAweDI0MDQwMDAxLCAweDNjMDI3ZmZmLCAweDM0NDJmZmZmLAotMHg2Mjg4MjQsIDB4M2MwMTAwMDIsIDB4M2UwODIxLCAweGFjMzE4ZmYwLAotMHgxMDAwMDEyNCwgMHgyMjAxMDIxLCAweDI4MjEsIDB4YzAwNDU3YywKLTB4MjdhNjAwMTgsIDB4MjQwNDAwMDEsIDB4MjgyMSwgMHhjMDA0NTdjLAotMHgyN2E2MDAxOCwgMHgyNDA0MDAwMSwgMHgyNDA1MDAwMSwgMHgyN2IyMDAyMCwKLTB4YzAwNDU3YywgMHgyNDAzMDIxLCAweDI0MDQwMDAxLCAweDI0MDUwMDAxLAotMHhjMDA0NTdjLCAweDI0MDMwMjEsIDB4MjQwNDAwMDEsIDB4MjQwNTAwMDQsCi0weDI3YjEwMDFlLCAweGMwMDQ1N2MsIDB4MjIwMzAyMSwgMHgyNDA0MDAwMSwKLTB4MjQwNTAwMDQsIDB4YzAwNDU3YywgMHgyMjAzMDIxLCAweDI0MDQwMDAxLAotMHgyNDA1MDAwNSwgMHgyN2IwMDAyMiwgMHhjMDA0NTdjLCAweDIwMDMwMjEsCi0weDI0MDQwMDAxLCAweDI0MDUwMDA1LCAweGMwMDQ1N2MsIDB4MjAwMzAyMSwKLTB4MjQwNDAwMDEsIDB4MjQwNTAwMTAsIDB4YzAwNDU3YywgMHgyN2E2MDAxOCwKLTB4MjQwNDAwMDEsIDB4MjQwNTAwMTAsIDB4YzAwNDU3YywgMHgyN2E2MDAxOCwKLTB4MjQwNDAwMDEsIDB4MjQwNTAwMGEsIDB4YzAwNDU3YywgMHgyNDAzMDIxLAotMHgyNDA0MDAwMSwgMHgyNDA1MDAwYSwgMHhjMDA0NTdjLCAweDI0MDMwMjEsCi0weDI0MDQwMDAxLCAweDI0MDUwMDE4LCAweGMwMDQ1N2MsIDB4MjIwMzAyMSwKLTB4MjQwNDAwMDEsIDB4MjQwNTAwMTgsIDB4YzAwNDU3YywgMHgyMjAzMDIxLAotMHgyNDA0MDAwMSwgMHgyNDA1MDAwMSwgMHhjMDA0NTdjLCAweDI3YTYwMDE4LAotMHgyNDA0MDAwMSwgMHgyNDA1MDAwMSwgMHhjMDA0NTdjLCAweDI3YTYwMDE4LAotMHg5N2EyMDAxOCwgMHgzMDQyMDAwNCwgMHgxMDQwMDA2NiwgMHgzYzExNDAwMCwKLTB4M2MwMzAwMDEsIDB4OGM2MzZmMzQsIDB4MjQwMjAwMDUsIDB4MTQ2MjAwNjcsCi0weDI0MDQwMDAxLCAweDI0MDUwMDE5LCAweDI3YjAwMDFjLCAweGMwMDQ1N2MsCi0weDIwMDMwMjEsIDB4MjQwNDAwMDEsIDB4MjQwNTAwMTksIDB4YzAwNDU3YywKLTB4MjAwMzAyMSwgMHg5N2EyMDAxYywgMHgzMDQzMDcwMCwgMHgyNDAyMDQwMCwKLTB4MTA2MjAwMjcsIDB4Mjg2MjA0MDEsIDB4MTA0MDAwMGUsIDB4MjQwMjAyMDAsCi0weDEwNjIwMDFmLCAweDI4NjIwMjAxLCAweDEwNDAwMDA1LCAweDI0MDIwMTAwLAotMHg1MDYyMDAxZSwgMHgzYzEzMDAwMSwgMHgxMDAwMDAxZSwgMHgzYzAyMDAwNCwKLTB4MjQwMjAzMDAsIDB4NTA2MjAwMTksIDB4M2MxMzAwMDIsIDB4MTAwMDAwMTksCi0weDNjMDIwMDA0LCAweDI0MDIwNjAwLCAweDEwNjIwMDBkLCAweDI4NjIwNjAxLAotMHgxMDQwMDAwNSwgMHgyNDAyMDUwMCwgMHg1MDYyMDAwYiwgMHgzYzEzMDAwMiwKLTB4MTAwMDAwMTAsIDB4M2MwMjAwMDQsIDB4MjQwMjA3MDAsIDB4MTQ2MjAwMGQsCi0weDNjMDIwMDA0LCAweDNjMTMwMDA0LCAweDEwMDAwMDBhLCAweDNjMTUwMDA4LAotMHgxMDAwMDAwNiwgMHgzYzEzMDAwNCwgMHgxMDAwMDAwNSwgMHgzYzE1MDAwOCwKLTB4M2MxMzAwMDEsIDB4MTAwMDAwMDIsIDB4M2MxNTAwMDgsIDB4M2MxNTAwMTAsCi0weDNjMDIwMDA0LCAweDEyNjIwMDE3LCAweDNjMDI4MDAwLCAweDhmODIwMDU0LAotMHgyNDEwMDAwMSwgMHgzYzAxMDAwMSwgMHhhYzMwNmQ5YywgMHgzYzAxMDAwMSwKLTB4YWMzMDZkOTgsIDB4M2MwMTAwMDEsIDB4YWMzMDZkYTQsIDB4M2MwMTAwMDEsCi0weGFjMzA2ZTI0LCAweDNjMDEwMDAxLCAweGFjMjI2ZjMwLCAweDNjMDIwMDAxLAotMHgxNjYyMDAyMiwgMHgyNzU4ODI1LCAweDIwMjEsIDB4MjgyMSwKLTB4YzAwNGRkYiwgMHgzNDA2ODAwMCwgMHgzYzAxMDAwMSwgMHgxMDAwMDAxYiwKLTB4YWMzMDZlMjAsIDB4MjIyMTAyNSwgMHgyYjMxODI1LCAweDQzODgyNSwKLTB4OTdhNjAwMWMsIDB4M2MwMjAwMDEsIDB4OGM0MjZmMWMsIDB4M2MwNzAwMDEsCi0weDhjZTc2ZDk4LCAweDNjMDQwMDAxLCAweDI0ODQ2YzVjLCAweGFmYTIwMDEwLAotMHg5N2EyMDAxZSwgMHgzYzA1MDAwYywgMHgzNGE1MDMyMywgMHgzYzAxMDAwMSwKLTB4YWMyMDZlMjAsIDB4YzAwMmIzYiwgMHhhZmEyMDAxNCwgMHgxMDAwMDAwNywKLTB4MCwgMHgzYzExMDAwMiwgMHgyM2U4ODIxLCAweDhlMzE4ZmYwLAotMHgzYzAyN2ZmZiwgMHgzNDQyZmZmZiwgMHgyMjI4ODI0LCAweDNjMDIwMDAxLAotMHg4YzQyNmRhOCwgMHgxMDQwMDA2OSwgMHgwLCAweDNjMDIwMDAxLAotMHg4YzQyNmYxYywgMHgxMDQwMDAwMiwgMHgzYzAyMjAwMCwgMHgyMjI4ODI1LAotMHg4ZmE4MDAyYywgMHg4MTE0MCwgMHgzYzAxMDAwMiwgMHgyMjA4MjEsCi0weDhjMjI5MDA0LCAweDEwNDAwMDAzLCAweDNjMDIwMDIwLCAweDEwMDAwMDA1LAotMHgyMjI4ODI1LCAweDNjMDJmZmRmLCAweDM0NDJmZmZmLCAweDIyMjg4MjQsCi0weDhmYTgwMDJjLCAweDgxMTQwLCAweDNjMDEwMDAyLCAweDIyMDgyMSwKLTB4OGMyMjkwMGMsIDB4MTA0MDAwMDMsIDB4M2MwMjAwODAsIDB4MTAwMDAwNGYsCi0weDIyMjg4MjUsIDB4M2MwMmZmN2YsIDB4MzQ0MmZmZmYsIDB4MTAwMDAwNGIsCi0weDIyMjg4MjQsIDB4OGZhODAwMmMsIDB4ODI5NDAsIDB4M2MwMzAwMDIsCi0weDY1MTgyMSwgMHg4YzYzOGZmOCwgMHgzYzAyNDAwMCwgMHg2MjEwMjQsCi0weDE0NDAwMDA4LCAweDNjMDI3ZmZmLCAweDM0NDJmZmZmLCAweDYyODgyNCwKLTB4M2MwMTAwMDIsIDB4MjUwODIxLCAweGFjMzE4ZmYwLCAweDEwMDAwMDQxLAotMHgyMjAxMDIxLCAweDNjMDIwMDAxLCAweDhjNDI2ZGE4LCAweDEwNDAwMDM0LAotMHgzYzExYzAwYywgMHgzYzAyMDAwMSwgMHg4YzQyNmU0NCwgMHgzYzA0YzAwYywKLTB4MzQ4NDIwMDAsIDB4M2MwMzAwMDEsIDB4OGM2MzZmMWMsIDB4MjEwMmIsCi0weDIxMDIzLCAweDQ0MTAyNCwgMHgxMDYwMDAwMywgMHg1MTg4MjUsCi0weDNjMDIyMDAwLCAweDIyMjg4MjUsIDB4M2MwMjAwMDIsIDB4NDUxMDIxLAotMHg4YzQyOTAwNCwgMHgxMDQwMDAwMywgMHgzYzAyMDAyMCwgMHgxMDAwMDAwNCwKLTB4MjIyODgyNSwgMHgzYzAyZmZkZiwgMHgzNDQyZmZmZiwgMHgyMjI4ODI0LAotMHg4ZmE4MDAyYywgMHg4MTE0MCwgMHgzYzAxMDAwMiwgMHgyMjA4MjEsCi0weDhjMjI5MDBjLCAweDEwNDAwMDAzLCAweDNjMDIwMDgwLCAweDEwMDAwMDA0LAotMHgyMjI4ODI1LCAweDNjMDJmZjdmLCAweDM0NDJmZmZmLCAweDIyMjg4MjQsCi0weDNjMDIwMDAxLCAweDhjNDI2ZTMwLCAweDEwNDAwMDAyLCAweDNjMDIwODAwLAotMHgyMjI4ODI1LCAweDNjMDIwMDAxLCAweDhjNDI2ZTM0LCAweDEwNDAwMDAyLAotMHgzYzAyMDQwMCwgMHgyMjI4ODI1LCAweDNjMDIwMDAxLCAweDhjNDI2ZTM4LAotMHgxMDQwMDAwNiwgMHgzYzAyMDEwMCwgMHgxMDAwMDAwNCwgMHgyMjI4ODI1LAotMHgzYzAyN2ZmZiwgMHgzNDQyZmZmZiwgMHg2Mjg4MjQsIDB4OGZhODAwMmMsCi0weDgxMTQwLCAweDNjMDEwMDAyLCAweDIyMDgyMSwgMHhhYzMxOGZmMCwKLTB4MjIwMTAyMSwgMHg4ZmJmMDA0OCwgMHg4ZmJlMDA0NCwgMHg4ZmI1MDA0MCwKLTB4OGZiMzAwM2MsIDB4OGZiMjAwMzgsIDB4OGZiMTAwMzQsIDB4OGZiMDAwMzAsCi0weDNlMDAwMDgsIDB4MjdiZDAwNTAsIDB4MjdiZGZmZDAsIDB4YWZiMjAwMjgsCi0weDgwOTAyMSwgMHhhZmJmMDAyYywgMHhhZmIxMDAyNCwgMHhhZmIwMDAyMCwKLTB4OGY4NDAyMDAsIDB4M2MxMDAwMDEsIDB4OGUxMDZkOTgsIDB4OGY4NjAyMjAsCi0weDI0MDIwMDAyLCAweDEyMDIwMDVjLCAweDJlMDIwMDAzLCAweDEwNDAwMDA1LAotMHgyNDAyMDAwMSwgMHgxMjAyMDAwYSwgMHgxMjE5NDAsIDB4MTAwMDAxMGMsCi0weDAsIDB4MjQwMjAwMDQsIDB4MTIwMjAwYmYsIDB4MjQwMjAwMDgsCi0weDEyMDIwMGJlLCAweDEyODk0MCwgMHgxMDAwMDEwNSwgMHgwLAotMHgzYzA1MDAwMiwgMHhhMzI4MjEsIDB4OGNhNThmZmMsIDB4M2MxMDAwMDIsCi0weDIwMzgwMjEsIDB4OGUxMDhmZjQsIDB4M2MwMjQwMDAsIDB4YTIxMDI0LAotMHgxMDQwMDAzOCwgMHgzYzAyMDAwOCwgMHgyMDIxMDI0LCAweDEwNDAwMDIwLAotMHgzNDg0MDAwMiwgMHgzYzAyMDAwMiwgMHg0MzEwMjEsIDB4OGM0MjkwMDAsCi0weDEwNDAwMDA1LCAweDM0ODQwMDIwLCAweDM0ODQwMTAwLCAweDNjMDIwMDIwLAotMHgxMDAwMDAwNiwgMHgyMDI4MDI1LCAweDI0MDJmZWZmLCAweDgyMjAyNCwKLTB4M2MwMmZmZGYsIDB4MzQ0MmZmZmYsIDB4MjAyODAyNCwgMHgxMjExNDAsCi0weDNjMDEwMDAyLCAweDIyMDgyMSwgMHg4YzIyOTAwOCwgMHgxMDQwMDAwNSwKLTB4M2MwMjAwMDEsIDB4YzIzMDI1LCAweDNjMDIwMDgwLCAweDEwMDAwMDE2LAotMHgyMDI4MDI1LCAweDNjMDJmZmZlLCAweDM0NDJmZmZmLCAweGMyMzAyNCwKLTB4M2MwMmZmN2YsIDB4MzQ0MmZmZmYsIDB4MTAwMDAwMGYsIDB4MjAyODAyNCwKLTB4MjQwMmZlZGYsIDB4ODIyMDI0LCAweDNjMDJmZmZlLCAweDM0NDJmZmZmLAotMHhjMjMwMjQsIDB4M2MwMmZmNWYsIDB4MzQ0MmZmZmYsIDB4MjAyODAyNCwKLTB4M2MwMTAwMDIsIDB4MjMwODIxLCAweGFjMjA5MDAwLCAweDNjMDEwMDAyLAotMHgyMzA4MjEsIDB4YWMyMDkwMDgsIDB4YWY4NDAyMDAsIDB4YWY4NjAyMjAsCi0weDhmODIwMjIwLCAweDM0NDIwMDAyLCAweGFmODIwMjIwLCAweDEwMDAwMDBhLAotMHgxMjExNDAsIDB4M2MwMmJmZmYsIDB4MzQ0MmZmZmYsIDB4OGY4MzAyMDAsCi0weDIwMjgwMjQsIDB4MjQwMmZmZmQsIDB4NjIxODI0LCAweGMwMDNkYWYsCi0weGFmODMwMjAwLCAweDEyMTE0MCwgMHgzYzAxMDAwMiwgMHgyMjA4MjEsCi0weDEwMDAwMGI3LCAweGFjMzA4ZmY0LCAweDNjMDIwMDAxLCAweDhjNDI2ZjFjLAotMHgxMDQwMDA2OSwgMHgyNDA1MDAwNCwgMHgyNDA0MDAwMSwgMHhjMDA0NTdjLAotMHgyN2E2MDAxOCwgMHgyNDA0MDAwMSwgMHgyNDA1MDAwNSwgMHhjMDA0NTdjLAotMHgyN2E2MDAxYSwgMHg5N2EzMDAxOCwgMHg5N2EyMDAxYSwgMHgzYzA0MDAwMSwKLTB4MjQ4NDZlNDgsIDB4MzA2MzBjMDAsIDB4MzFhODIsIDB4MzA0MjBjMDAsCi0weDIxMjgyLCAweGE3YTIwMDFhLCAweDIxMDgwLCAweDQ0MTAyMSwKLTB4NDMxMDIxLCAweGE3YTMwMDE4LCAweDkwNDgwMDAwLCAweDI0MDIwMDAxLAotMHgzMTAzZmZmZiwgMHgxMDYyMDAyOSwgMHgyODYyMDAwMiwgMHgxMDQwMDAwNSwKLTB4MCwgMHgxMDYwMDAwOSwgMHgwLCAweDEwMDAwMDNkLAotMHgwLCAweDEwNzAwMDEzLCAweDI0MDIwMDAzLCAweDEwNjIwMDJjLAotMHgwLCAweDEwMDAwMDM3LCAweDAsIDB4OGY4MjAyMDAsCi0weDI0MDNmZWZmLCAweDQzMTAyNCwgMHhhZjgyMDIwMCwgMHg4ZjgyMDIyMCwKLTB4M2MwM2ZmZmUsIDB4MzQ2M2ZmZmYsIDB4NDMxMDI0LCAweGFmODIwMjIwLAotMHgzYzAxMDAwMiwgMHhhYzIwOTAwNCwgMHgzYzAxMDAwMiwgMHgxMDAwMDAzMiwKLTB4YWMyMDkwMGMsIDB4OGY4MjAyMDAsIDB4MzQ0MjAxMDAsIDB4YWY4MjAyMDAsCi0weDhmODIwMjIwLCAweDNjMDNmZmZlLCAweDM0NjNmZmZmLCAweDQzMTAyNCwKLTB4YWY4MjAyMjAsIDB4MjQwMjAxMDAsIDB4M2MwMTAwMDIsIDB4YWMyMjkwMDQsCi0weDNjMDEwMDAyLCAweDEwMDAwMDI0LCAweGFjMjA5MDBjLCAweDhmODIwMjAwLAotMHgyNDAzZmVmZiwgMHg0MzEwMjQsIDB4YWY4MjAyMDAsIDB4OGY4MjAyMjAsCi0weDNjMDMwMDAxLCAweDQzMTAyNSwgMHhhZjgyMDIyMCwgMHgzYzAxMDAwMiwKLTB4YWMyMDkwMDQsIDB4M2MwMTAwMDIsIDB4MTAwMDAwMTcsIDB4YWMyMzkwMGMsCi0weDhmODIwMjAwLCAweDM0NDIwMTAwLCAweGFmODIwMjAwLCAweDhmODIwMjIwLAotMHgzYzAzMDAwMSwgMHg0MzEwMjUsIDB4YWY4MjAyMjAsIDB4MjQwMjAxMDAsCi0weDNjMDEwMDAyLCAweGFjMjI5MDA0LCAweDNjMDEwMDAyLCAweDEwMDAwMDBhLAotMHhhYzIzOTAwYywgMHgzYzA0MDAwMSwgMHgyNDg0NmM4MCwgMHg5N2E2MDAxYSwKLTB4OTdhNzAwMTgsIDB4M2MwNTAwMDEsIDB4MzRhNWZmZmYsIDB4YWZhODAwMTAsCi0weGMwMDJiM2IsIDB4YWZhMDAwMTQsIDB4OGY4MjAyMDAsIDB4MzQ0MjAwMDIsCi0weDEwMDAwMDRiLCAweGFmODIwMjAwLCAweDEyODk0MCwgMHgzYzA1MDAwMiwKLTB4YjEyODIxLCAweDhjYTU4ZmY4LCAweDNjMTAwMDAyLCAweDIxMTgwMjEsCi0weDhlMTA4ZmYwLCAweDNjMDI0MDAwLCAweGEyMTAyNCwgMHgxNDQwMDAxMCwKLTB4MCwgMHgzYzAyMDAwMSwgMHg4YzQyNmYxYywgMHgxNDQwMDAwNSwKLTB4M2MwMmJmZmYsIDB4OGY4MjAyMDAsIDB4MzQ0MjAwMDIsIDB4YWY4MjAyMDAsCi0weDNjMDJiZmZmLCAweDM0NDJmZmZmLCAweGMwMDNkYWYsIDB4MjAyODAyNCwKLTB4M2MwMTAwMDIsIDB4MzEwODIxLCAweDEwMDAwMDMxLCAweGFjMzA4ZmYwLAotMHgzYzAyMDAwMSwgMHg4YzQyNmYxYywgMHgxMDQwMDAwNSwgMHgzYzAyMDAyMCwKLTB4M2MwMjAwMDEsIDB4OGM0MjZlNDQsIDB4MTA0MDAwMjUsIDB4M2MwMjAwMjAsCi0weGEyMTAyNCwgMHgxMDQwMDAwNywgMHgzNDg0MDAyMCwgMHgyNDAyMDEwMCwKLTB4M2MwMTAwMDIsIDB4MzEwODIxLCAweGFjMjI5MDA0LCAweDEwMDAwMDA2LAotMHgzNDg0MDEwMCwgMHgzYzAxMDAwMiwgMHgzMTA4MjEsIDB4YWMyMDkwMDQsCi0weDI0MDJmZWZmLCAweDgyMjAyNCwgMHgzYzAyMDA4MCwgMHhhMjEwMjQsCi0weDEwNDAwMDA3LCAweDEyMTk0MCwgMHgzYzAyMDAwMSwgMHgzYzAxMDAwMiwKLTB4MjMwODIxLCAweGFjMjI5MDBjLCAweDEwMDAwMDA4LCAweGMyMzAyNSwKLTB4MTIxMTQwLCAweDNjMDEwMDAyLCAweDIyMDgyMSwgMHhhYzIwOTAwYywKLTB4M2MwMmZmZmUsIDB4MzQ0MmZmZmYsIDB4YzIzMDI0LCAweGFmODQwMjAwLAotMHhhZjg2MDIyMCwgMHg4ZjgyMDIyMCwgMHgzNDQyMDAwMiwgMHhhZjgyMDIyMCwKLTB4MTIxMTQwLCAweDNjMDEwMDAyLCAweDIyMDgyMSwgMHhhYzMwOGZmMCwKLTB4OGZiZjAwMmMsIDB4OGZiMjAwMjgsIDB4OGZiMTAwMjQsIDB4OGZiMDAwMjAsCi0weDNlMDAwMDgsIDB4MjdiZDAwMzAsIDB4MCwgMHgxODIxLAotMHgzMDg0MDBmZiwgMHgyNDA1ZmZkZiwgMHgyNDA2ZmZiZiwgMHg2NDEwMDcsCi0weDMwNDIwMDAxLCAweDEwNDAwMDA0LCAweDAsIDB4OGY4MjAwNDQsCi0weDEwMDAwMDAzLCAweDM0NDIwMDQwLCAweDhmODIwMDQ0LCAweDQ2MTAyNCwKLTB4YWY4MjAwNDQsIDB4OGY4MjAwNDQsIDB4MzQ0MjAwMjAsIDB4YWY4MjAwNDQsCi0weDhmODIwMDQ0LCAweDQ1MTAyNCwgMHhhZjgyMDA0NCwgMHgyNDYzMDAwMSwKLTB4Mjg2MjAwMDgsIDB4NTQ0MGZmZWUsIDB4NjQxMDA3LCAweDNlMDAwMDgsCi0weDAsIDB4MmM4MjAwMDgsIDB4MTA0MDAwMWIsIDB4MCwKLTB4MjQwNWZmZGYsIDB4MjQwNmZmYmYsIDB4NDE4ODAsIDB4M2MwMjAwMDEsCi0weDI0NDI2ZTYwLCAweDYyMTgyMSwgMHgyNDY0MDAwNCwgMHg5MDYyMDAwMCwKLTB4MTA0MDAwMDQsIDB4MCwgMHg4ZjgyMDA0NCwgMHgxMDAwMDAwMywKLTB4MzQ0MjAwNDAsIDB4OGY4MjAwNDQsIDB4NDYxMDI0LCAweGFmODIwMDQ0LAotMHg4ZjgyMDA0NCwgMHgzNDQyMDAyMCwgMHhhZjgyMDA0NCwgMHg4ZjgyMDA0NCwKLTB4NDUxMDI0LCAweGFmODIwMDQ0LCAweDI0NjMwMDAxLCAweDY0MTAyYiwKLTB4MTQ0MGZmZWUsIDB4MCwgMHgzZTAwMDA4LCAweDAsCi0weDAsIDB4MCwgMHgwLCAweDhmODQwMGM0LAotMHg4Zjg2MDBlMCwgMHg4Zjg3MDBlNCwgMHgyNDAyZmZmOCwgMHhjMjI4MjQsCi0weDEwZTUwMDFhLCAweDI3NjIzZmY4LCAweDE0ZTIwMDAyLCAweDI0ZTgwMDA4LAotMHgyNzY4MzAwMCwgMHg1NTA1MDAwNCwgMHg4ZDBhMDAwMCwgMHgzMGMyMDAwNCwKLTB4MTQ0MDAwMTIsIDB4ODA1MDIxLCAweDhjZTkwMDAwLCAweDhmNDIwMTNjLAotMHgxNDk0ODIzLCAweDQ5MTgyYiwgMHg5NGViMDAwNiwgMHgxMDYwMDAwMiwKLTB4MjU2MzAwNTAsIDB4NDk0ODIxLCAweDEyMzE4MmIsIDB4NTA0MDAwMDMsCi0weDhmNDIwMWZjLCAweDNlMDAwMDgsIDB4ZTAxMDIxLCAweGFmODgwMGU4LAotMHgyNDQyMDAwMSwgMHhhZjQyMDFmYywgMHhhZjg4MDBlNCwgMHgzZTAwMDA4LAotMHgxMDIxLCAweDNlMDAwMDgsIDB4MCwgMHg4ZjgzMDBlNCwKLTB4Mjc2MjNmZjgsIDB4MTA2MjAwMDQsIDB4MjQ2MjAwMDgsIDB4YWY4MjAwZTgsCi0weDNlMDAwMDgsIDB4YWY4MjAwZTQsIDB4Mjc2MjMwMDAsIDB4YWY4MjAwZTgsCi0weDNlMDAwMDgsIDB4YWY4MjAwZTQsIDB4M2UwMDAwOCwgMHgwLAotMHgwLCAweDAsIDB4MCwgMHg4Zjg4MDEyMCwKLTB4Mjc2MjRmZTAsIDB4OGY4MzAxMjgsIDB4MTUwMjAwMDIsIDB4MjUwOTAwMjAsCi0weDI3Njk0ODAwLCAweDExMjMwMDEyLCAweDhmYTIwMDEwLCAweGFkMDQwMDAwLAotMHhhZDA1MDAwNCwgMHhhZDA2MDAwOCwgMHhhNTA3MDAwZSwgMHg4ZmEzMDAxNCwKLTB4YWQwMjAwMTgsIDB4OGZhMjAwMTgsIDB4YWQwMzAwMWMsIDB4MjUwMzAwMTYsCi0weGFkMDIwMDEwLCAweGFkMDMwMDE0LCAweGFmODkwMTIwLCAweDhmNDMwMGZjLAotMHgyNDAyMDAwMSwgMHgyNDYzZmZmZiwgMHgzZTAwMDA4LCAweGFmNDMwMGZjLAotMHg4ZjQzMDMyNCwgMHgxMDIxLCAweDI0NjMwMDAxLCAweDNlMDAwMDgsCi0weGFmNDMwMzI0LCAweDNlMDAwMDgsIDB4MCwgMHg4Zjg4MDEwMCwKLTB4Mjc2MjQ3ZTAsIDB4OGY4MzAxMDgsIDB4MTUwMjAwMDIsIDB4MjUwOTAwMjAsCi0weDI3Njk0MDAwLCAweDExMjMwMDBmLCAweDhmYTIwMDEwLCAweGFkMDQwMDAwLAotMHhhZDA1MDAwNCwgMHhhZDA2MDAwOCwgMHhhNTA3MDAwZSwgMHg4ZmEzMDAxNCwKLTB4YWQwMjAwMTgsIDB4OGZhMjAwMTgsIDB4YWQwMzAwMWMsIDB4MjUwMzAwMTYsCi0weGFkMDIwMDEwLCAweGFkMDMwMDE0LCAweGFmODkwMTAwLCAweDNlMDAwMDgsCi0weDI0MDIwMDAxLCAweDhmNDMwMzI4LCAweDEwMjEsIDB4MjQ2MzAwMDEsCi0weDNlMDAwMDgsIDB4YWY0MzAzMjgsIDB4M2UwMDAwOCwgMHgwLAotMHgwLCAweDAsIDB4MCwgMHgwIH07Ci1zdGF0aWMgdTMyIHRpZ29uMkZ3Um9kYXRhWyhNQVhfUk9EQVRBX0xFTi80KSArIDFdIF9fZGV2aW5pdGRhdGEgPSB7Ci0weDI0NDg2NTYxLCAweDY0NjU3MjNhLCAweDIwMmY3MDcyLAotMHg2ZjZhNjU2MywgMHg3NDczMmY3MiwgMHg2MzczMmY3MywgMHg3NzJmNjc2NSwKLTB4MmYyZTJmNmUsIDB4Njk2MzJmNjYsIDB4NzczMjJmNjMsIDB4NmY2ZDZkNmYsCi0weDZlMmY2Njc3LCAweDZkNjE2OTZlLCAweDJlNjMyYzc2LCAweDIwMzEyZTMxLAotMHgyZTMyMmUzNCwgMHgzNTIwMzEzOSwgMHgzOTM5MmYzMCwgMHgzMTJmMzIzNCwKLTB4MjAzMDMwM2EsIDB4MzEzMDNhMzUsIDB4MzUyMDczNjgsIDB4NzU2MTZlNjcsCi0weDIwNDU3ODcwLCAweDIwMjQwMDAwLCAweDY1NzY3NDUyLCAweDZlNjc0NjAwLAotMHg1MTY1NzY3NCwgMHg0NjAwMDAwMCwgMHg1MTY1NzY3NCwgMHg1MDVmNDYwMCwKLTB4NGQ2NTc2NzQsIDB4NTI2ZTY3NDYsIDB4MCwgMHg0ZDUxNjU3NiwKLTB4NzQ0NjAwMDAsIDB4NGQ1MTY1NzYsIDB4NTA1ZjQ2MDAsIDB4NTE3MzQzNmYsCi0weDZlNDk1ZjQ2LCAweDAsIDB4NTE3MzQzNmYsIDB4NmU3MzQ2MDAsCi0weDUxNzI1MDcyLCAweDZmNjQ0NjAwLCAweDYyNjE2NDRkLCAweDY1NmQ1MzdhLAotMHgwLCAweDY4Nzc1NjY1LCAweDcyMDAwMDAwLCAweDYyNjE2NDQ4LAotMHg3NzU2NjU3MiwgMHgwLCAweDJhMmE0NDQxLCAweDU3NGU1ZjQxLAotMHgwLCAweDc0Nzg1Mjc4LCAweDQyNjY1MzdhLCAweDAsCi0weDYyNjY0MTc0LCAweDZlNGQ3MjZiLCAweDAsIDB4NzI2NTY0NWEsCi0weDZmNmU2NTMxLCAweDAsIDB4NzA2MzY5NDMsIDB4NmY2ZTY2MDAsCi0weDY3NjU2ZTQzLCAweDZmNmU2NjAwLCAweDJhNjQ2ZDYxLCAweDUyNDQ2NjZjLAotMHgwLCAweDJhNTA0MTRlLCAweDQ5NDMyYTAwLCAweDJlMmUyZjJlLAotMHgyZTJmMmUyZSwgMHgyZjJlMmUyZiwgMHgyZTJlMmY3MywgMHg3MjYzMmY2ZSwKLTB4Njk2MzJmNjYsIDB4NzczMjJmNjMsIDB4NmY2ZDZkNmYsIDB4NmUyZjY2NzcsCi0weDZkNjE2OTZlLCAweDJlNjMwMDAwLCAweDcyNjM2MjQ2LCAweDZjNjE2NzczLAotMHgwLCAweDYyNjE2NDUyLCAweDc4NTI2MzYyLCAweDAsCi0weDY3NmM2ZjYyLCAweDQ2NmM2NzczLCAweDAsIDB4MmI1ZjY0NjksCi0weDczNzA1ZjZjLCAweDZmNmY3MDAwLCAweDJiNjU3NjVmLCAweDY4NjE2ZTY0LAotMHg2YzY1NzIwMCwgMHg2MzYxNmU3NCwgMHgzMTQ0NmQ2MSwgMHgwLAotMHgyYjcxNWY2NCwgMHg2ZDYxNWY3NCwgMHg2ZjVmNmU2OSwgMHg2MzVmNjM2YiwKLTB4NzM3NTZkMDAsIDB4MmI2ODVmNzMsIDB4NjU2ZTY0NWYsIDB4NjQ2MTc0NjEsCi0weDVmNzI2NTYxLCAweDY0Nzk1ZjYzLCAweDZiNzM3NTZkLCAweDAsCi0weDJiNjg1ZjY0LCAweDZkNjE1ZjcyLCAweDY0NWY2MTczLCAweDczNjk3Mzc0LAotMHg1ZjYzNmI3MywgMHg3NTZkMDAwMCwgMHg3NDQzNmI3MywgMHg2ZDRmNmUwMCwKLTB4MmI3MTVmNjQsIDB4NmQ2MTVmNzQsIDB4NmY1ZjZlNjksIDB4NjMwMDAwMDAsCi0weDJiNjg1ZjczLCAweDY1NmU2NDVmLCAweDY0NjE3NDYxLCAweDVmNzI2NTYxLAotMHg2NDc5MDAwMCwgMHgyYjY4NWY2NCwgMHg2ZDYxNWY3MiwgMHg2NDVmNjE3MywKLTB4NzM2OTczNzQsIDB4MCwgMHg3NDQzNmI3MywgMHg2ZDRmNjY2NiwKLTB4MCwgMHgyYjY4NWY3MywgMHg2NTZlNjQ1ZiwgMHg2MjY0NWY3MiwKLTB4NjU2MTY0NzksIDB4MCwgMHg2ODczNzQ1MywgMHg1MjY5NmU2NywKLTB4MCwgMHg2MjYxNjQ1MywgMHg1MjY5NmU2NywgMHgwLAotMHg2ZTY5NjM1MywgMHg1MjY5NmU2NywgMHgwLCAweDc3NDQ2ZDYxLAotMHg0MTZjNmM0MSwgMHgwLCAweDJiNzE1ZjY0LCAweDZkNjE1Zjc0LAotMHg2ZjVmNjg2ZiwgMHg3Mzc0NWY2MywgMHg2YjczNzU2ZCwgMHgwLAotMHgyYjY4NWY2ZCwgMHg2MTYzNWY3MiwgMHg3ODVmNjM2ZiwgMHg2ZDcwNWY2MywKLTB4NmI3Mzc1NmQsIDB4MCwgMHgyYjY4NWY2NCwgMHg2ZDYxNWY3NywKLTB4NzI1ZjYxNzMsIDB4NzM2OTczNzQsIDB4NWY2MzZiNzMsIDB4NzU2ZDAwMDAsCi0weDcyNDM2YjczLCAweDZkNGY2ZTAwLCAweDJiNzE1ZjY0LCAweDZkNjE1Zjc0LAotMHg2ZjVmNjg2ZiwgMHg3Mzc0MDAwMCwgMHgyYjY4NWY2ZCwgMHg2MTYzNWY3MiwKLTB4Nzg1ZjYzNmYsIDB4NmQ3MDAwMDAsIDB4MmI2ODVmNjQsIDB4NmQ2MTVmNzcsCi0weDcyNWY2MTczLCAweDczNjk3Mzc0LCAweDAsIDB4NzI0MzZiNzMsCi0weDZkNGY2NjY2LCAweDAsIDB4MmI2ODVmNzIsIDB4NjU2Mzc2NWYsCi0weDYyNjQ1ZjcyLCAweDY1NjE2NDc5LCAweDAsIDB4MmI2ODVmNzIsCi0weDY1NjM3NjVmLCAweDZhNzU2ZDYyLCAweDZmNWY2MjY0LCAweDVmNzI2NTYxLAotMHg2NDc5MDAwMCwgMHgyYjY4NWY3MiwgMHg2NTYzNzY1ZiwgMHg2ZDY5NmU2OSwKLTB4NWY2MjY0NWYsIDB4NzI2NTYxNjQsIDB4NzkwMDAwMDAsIDB4MmI2ZDY4NWYsCi0weDYzNmY2ZDZkLCAweDYxNmU2NDAwLCAweDJiNjg1Zjc0LCAweDY5NmQ2NTcyLAotMHgwLCAweDJiNjg1ZjY0LCAweDZmNWY3NTcwLCAweDY0NjE3NDY1LAotMHg1Zjc0Nzg1ZiwgMHg2MzZmNmU3MywgMHgwLCAweDJiNjg1ZjY0LAotMHg2ZjVmNzU3MCwgMHg2NDYxNzQ2NSwgMHg1ZjcyNzg1ZiwgMHg3MDcyNmY2NCwKLTB4MCwgMHgyYjYzNmI3MywgMHg3NTZkMzEzNiwgMHgwLAotMHgyYjcwNjU2NSwgMHg2YjVmNmQ2MSwgMHg2MzVmNzI3OCwgMHg1Zjc3NjEwMCwKLTB4MmI3MDY1NjUsIDB4NmI1ZjZkNjEsIDB4NjM1ZjcyNzgsIDB4MCwKLTB4MmI2NDY1NzEsIDB4NWY2ZDYxNjMsIDB4NWY3Mjc4MDAsIDB4MmI2ODVmNmQsCi0weDYxNjM1ZjcyLCAweDc4NWY2MTc0LCAweDc0NmUwMDAwLCAweDYyNjE2NDUyLAotMHg2NTc0NTM3YSwgMHgwLCAweDcyNzg0MjY0LCAweDQyNjY1MzdhLAotMHgwLCAweDJiNmU3NTZjLCAweDZjNWY2ODYxLCAweDZlNjQ2YzY1LAotMHg3MjAwMDAwMCwgMHg2Njc3NGY3MCwgMHg0NjYxNjk2YywgMHgwLAotMHgyYjY4NWY3NSwgMHg3MDY0NjE3NCwgMHg2NTVmNmM2NSwgMHg2NDM0MDAwMCwKLTB4MmI2ODVmNzUsIDB4NzA2NDYxNzQsIDB4NjU1ZjZjNjUsIDB4NjQzNjAwMDAsCi0weDJiNjg1Zjc1LCAweDcwNjQ2MTc0LCAweDY1NWY2YzY1LCAweDY0MzIwMDAwLAotMHg2OTZlNzQ1MywgMHg3NDYxNzQ2NSwgMHgwLCAweDJhMmE2OTZlLAotMHg2OTc0NDM3MCwgMHgwLCAweDIzNzM2MzcyLCAweDY1NjE2ZDAwLAotMHg2OTUzNzQ2MSwgMHg2MzZiNDU3MiwgMHgwLCAweDcwNzI2ZjYyLAotMHg2NTRkNjU2ZCwgMHgwLCAweDJhMmE0NDQxLCAweDU3NGU1ZjQyLAotMHgwLCAweDJiNzM3NzVmLCAweDY0NmQ2MTVmLCAweDYxNzM3MzY5LAotMHg3Mzc0NWY3MCwgMHg2Yzc1NzM1ZiwgMHg3NDY5NmQ2NSwgMHg3MjAwMDAwMCwKLTB4MmIyNjcwNzIsIDB4NjU2YzZmNjEsIDB4NjQ1Zjc3NzIsIDB4NWY2NDY1NzMsCi0weDYzNzIwMDAwLCAweDJiMjY3MDcyLCAweDY1NmM2ZjYxLCAweDY0NWY3MjY0LAotMHg1ZjY0NjU3MywgMHg2MzcyMDAwMCwgMHgyYjY4NWY2OCwgMHg2NjVmNzQ2OSwKLTB4NmQ2NTcyMDAsIDB4MjQ0ODY1NjEsIDB4NjQ2NTcyM2EsIDB4MjAyZjcwNzIsCi0weDZmNmE2NTYzLCAweDc0NzMyZjcyLCAweDYzNzMyZjczLCAweDc3MmY2NzY1LAotMHgyZjJlMmY2ZSwgMHg2OTYzMmY2NiwgMHg3NzMyMmY2MywgMHg2ZjZkNmQ2ZiwKLTB4NmUyZjc0NjksIDB4NmQ2NTcyMmUsIDB4NjMyYzc2MjAsIDB4MzEyZTMxMmUsCi0weDMyMmUzMzM1LCAweDIwMzEzOTM5LCAweDM5MmYzMDMxLCAweDJmMzIzNzIwLAotMHgzMTM5M2EzMCwgMHgzOTNhMzUzMCwgMHgyMDY4NjE3OSwgMHg2NTczMjA0NSwKLTB4Nzg3MDIwMjQsIDB4MCwgMHg2NTc2NzQ1MiwgMHg2ZTY3NDYwMCwKLTB4NTE2NTc2NzQsIDB4NDYwMDAwMDAsIDB4NTE2NTc2NzQsIDB4NTA1ZjQ2MDAsCi0weDRkNjU3Njc0LCAweDUyNmU2NzQ2LCAweDAsIDB4NGQ1MTY1NzYsCi0weDc0NDYwMDAwLCAweDRkNTE2NTc2LCAweDUwNWY0NjAwLCAweDUxNzM0MzZmLAotMHg2ZTQ5NWY0NiwgMHgwLCAweDUxNzM0MzZmLCAweDZlNzM0NjAwLAotMHg1MTcyNTA3MiwgMHg2ZjY0NDYwMCwgMHg1NDJkNDQ2ZCwgMHg2MTUyNjQzMiwKLTB4MCwgMHg1NDJkNDQ2ZCwgMHg2MTUyNjQzMSwgMHgwLAotMHg1NDJkNDQ2ZCwgMHg2MTUyNjQ0MiwgMHgwLCAweDU0MmQ0NDZkLAotMHg2MTU3NzIzMiwgMHgwLCAweDU0MmQ0NDZkLCAweDYxNTc3MjMxLAotMHgwLCAweDU0MmQ0NDZkLCAweDYxNTc3MjQyLCAweDAsCi0weDAsIDB4MjQ0ODY1NjEsIDB4NjQ2NTcyM2EsIDB4MjAyZjcwNzIsCi0weDZmNmE2NTYzLCAweDc0NzMyZjcyLCAweDYzNzMyZjczLCAweDc3MmY2NzY1LAotMHgyZjJlMmY2ZSwgMHg2OTYzMmY2NiwgMHg3NzMyMmY2MywgMHg2ZjZkNmQ2ZiwKLTB4NmUyZjYzNmYsIDB4NmQ2ZDYxNmUsIDB4NjQyZTYzMmMsIDB4NzYyMDMxMmUsCi0weDMxMmUzMjJlLCAweDMyMzgyMDMxLCAweDM5MzkzOTJmLCAweDMwMzEyZjMyLAotMHgzMDIwMzEzOSwgMHgzYTM0MzkzYSwgMHgzNDM5MjA3MywgMHg2ODc1NjE2ZSwKLTB4NjcyMDQ1NzgsIDB4NzAyMDI0MDAsIDB4NjU3Njc0NTIsIDB4NmU2NzQ2MDAsCi0weDUxNjU3Njc0LCAweDQ2MDAwMDAwLCAweDUxNjU3Njc0LCAweDUwNWY0NjAwLAotMHg0ZDY1NzY3NCwgMHg1MjZlNjc0NiwgMHgwLCAweDRkNTE2NTc2LAotMHg3NDQ2MDAwMCwgMHg0ZDUxNjU3NiwgMHg1MDVmNDYwMCwgMHg1MTczNDM2ZiwKLTB4NmU0OTVmNDYsIDB4MCwgMHg1MTczNDM2ZiwgMHg2ZTczNDYwMCwKLTB4NTE3MjUwNzIsIDB4NmY2NDQ2MDAsIDB4M2Y0ODYzNmQsIDB4NjQ0ZDYyNzgsCi0weDAsIDB4M2Y2MzZkNjQsIDB4NDg3Mzc0NTMsIDB4MCwKLTB4M2Y2MzZkNjQsIDB4NGQ2MzRkNjQsIDB4MCwgMHgzZjYzNmQ2NCwKLTB4NTA3MjZmNmQsIDB4MCwgMHgzZjYzNmQ2NCwgMHg0YzY5NmU2YiwKLTB4MCwgMHgzZjYzNmQ2NCwgMHg0NTcyNzIwMCwgMHg4NmFjLAotMHg4ZTVjLCAweDhlNWMsIDB4OGRlNCwgMHg4Yjc4LAotMHg4ZTMwLCAweDhlNWMsIDB4ODc5MCwgMHg4ODAwLAotMHg4OTkwLCAweDhhNjgsIDB4OGEzNCwgMHg4ZTVjLAotMHg4ODcwLCAweDhiMjQsIDB4OGU1YywgMHg4YjM0LAotMHg4N2I0LCAweDg4MjQsIDB4MCwgMHgwLAotMHgwLCAweDI0NDg2NTYxLCAweDY0NjU3MjNhLCAweDIwMmY3MDcyLAotMHg2ZjZhNjU2MywgMHg3NDczMmY3MiwgMHg2MzczMmY3MywgMHg3NzJmNjc2NSwKLTB4MmYyZTJmNmUsIDB4Njk2MzJmNjYsIDB4NzczMjJmNjMsIDB4NmY2ZDZkNmYsCi0weDZlMmY2ZDYzLCAweDYxNzM3NDJlLCAweDYzMmM3NjIwLCAweDMxMmUzMTJlLAotMHgzMjJlMzgyMCwgMHgzMTM5MzkzOCwgMHgyZjMxMzIyZiwgMHgzMDM4MjAzMCwKLTB4MzIzYTMzMzYsIDB4M2EzMzM2MjAsIDB4NzM2ODc1NjEsIDB4NmU2NzIwNDUsCi0weDc4NzAyMDI0LCAweDAsIDB4NjU3Njc0NTIsIDB4NmU2NzQ2MDAsCi0weDUxNjU3Njc0LCAweDQ2MDAwMDAwLCAweDUxNjU3Njc0LCAweDUwNWY0NjAwLAotMHg0ZDY1NzY3NCwgMHg1MjZlNjc0NiwgMHgwLCAweDRkNTE2NTc2LAotMHg3NDQ2MDAwMCwgMHg0ZDUxNjU3NiwgMHg1MDVmNDYwMCwgMHg1MTczNDM2ZiwKLTB4NmU0OTVmNDYsIDB4MCwgMHg1MTczNDM2ZiwgMHg2ZTczNDYwMCwKLTB4NTE3MjUwNzIsIDB4NmY2NDQ2MDAsIDB4NjE2NDY0NGQsIDB4NjM0NDc1NzAsCi0weDAsIDB4NjE2NDY0NGQsIDB4NjM0Njc1NmMsIDB4MCwKLTB4NjQ2NTZjNGQsIDB4NjM0ZTZmNDUsIDB4MCwgMHgwLAotMHgwLCAweDI0NDg2NTYxLCAweDY0NjU3MjNhLCAweDIwMmY3MDcyLAotMHg2ZjZhNjU2MywgMHg3NDczMmY3MiwgMHg2MzczMmY3MywgMHg3NzJmNjc2NSwKLTB4MmYyZTJmNmUsIDB4Njk2MzJmNjYsIDB4NzczMjJmNjMsIDB4NmY2ZDZkNmYsCi0weDZlMmY2NDZkLCAweDYxMmU2MzJjLCAweDc2MjAzMTJlLCAweDMxMmUzMjJlLAotMHgzMjM0MjAzMSwgMHgzOTM5MzgyZiwgMHgzMTMyMmYzMiwgMHgzMTIwMzAzMCwKLTB4M2EzMzMzM2EsIDB4MzAzOTIwNzMsIDB4Njg3NTYxNmUsIDB4NjcyMDQ1NzgsCi0weDcwMjAyNDAwLCAweDY1NzY3NDUyLCAweDZlNjc0NjAwLCAweDUxNjU3Njc0LAotMHg0NjAwMDAwMCwgMHg1MTY1NzY3NCwgMHg1MDVmNDYwMCwgMHg0ZDY1NzY3NCwKLTB4NTI2ZTY3NDYsIDB4MCwgMHg0ZDUxNjU3NiwgMHg3NDQ2MDAwMCwKLTB4NGQ1MTY1NzYsIDB4NTA1ZjQ2MDAsIDB4NTE3MzQzNmYsIDB4NmU0OTVmNDYsCi0weDAsIDB4NTE3MzQzNmYsIDB4NmU3MzQ2MDAsIDB4NTE3MjUwNzIsCi0weDZmNjQ0NjAwLCAweDczNzc0NDZkLCAweDYxNGY2NjY2LCAweDAsCi0weDMxNDQ2ZDYxLCAweDRmNmUwMDAwLCAweDczNzc0NDZkLCAweDYxNGY2ZTAwLAotMHgyMzcyNDQ2ZCwgMHg2MTQxNTQ0ZSwgMHgwLCAweDcyNDQ2ZDYxLAotMHg0MTU0NGUzMCwgMHgwLCAweDcyNDQ2ZDYxLCAweDQxNTQ0ZTMxLAotMHgwLCAweDcyNDQ2ZDYxLCAweDM0NDc2MjAwLCAweDJhNTA0MTRlLAotMHg0OTQzMmEwMCwgMHgyZTJlMmYyZSwgMHgyZTJmMmUyZSwgMHgyZjJlMmUyZiwKLTB4MmUyZTJmNzMsIDB4NzI2MzJmNmUsIDB4Njk2MzJmNjYsIDB4NzczMjJmNjMsCi0weDZmNmQ2ZDZmLCAweDZlMmY2NDZkLCAweDYxMmU2MzAwLCAweDIzNzc0NDZkLAotMHg2MTQxNTQ0ZSwgMHgwLCAweDc3NDQ2ZDYxLCAweDQxNTQ0ZTMwLAotMHgwLCAweDc3NDQ2ZDYxLCAweDQxNTQ0ZTMxLCAweDAsCi0weDc3NDQ2ZDYxLCAweDM0NDc2MjAwLCAweDAsIDB4MCwKLTB4MCwgMHgyNDQ4NjU2MSwgMHg2NDY1NzIzYSwgMHgyMDJmNzA3MiwKLTB4NmY2YTY1NjMsIDB4NzQ3MzJmNzIsIDB4NjM3MzJmNzMsIDB4NzcyZjY3NjUsCi0weDJmMmUyZjZlLCAweDY5NjMyZjY2LCAweDc3MzIyZjYzLCAweDZmNmQ2ZDZmLAotMHg2ZTJmNzQ3MiwgMHg2MTYzNjUyZSwgMHg2MzJjNzYyMCwgMHgzMTJlMzEyZSwKLTB4MzIyZTM1MjAsIDB4MzEzOTM5MzgsIDB4MmYzMDM5MmYsIDB4MzMzMDIwMzEsCi0weDM4M2EzNTMwLCAweDNhMzIzODIwLCAweDczNjg3NTYxLCAweDZlNjcyMDQ1LAotMHg3ODcwMjAyNCwgMHgwLCAweDAsIDB4MCwKLTB4MCwgMHgyNDQ4NjU2MSwgMHg2NDY1NzIzYSwgMHgyMDJmNzA3MiwKLTB4NmY2YTY1NjMsIDB4NzQ3MzJmNzIsIDB4NjM3MzJmNzMsIDB4NzcyZjY3NjUsCi0weDJmMmUyZjZlLCAweDY5NjMyZjY2LCAweDc3MzIyZjYzLCAweDZmNmQ2ZDZmLAotMHg2ZTJmNjQ2MSwgMHg3NDYxMmU2MywgMHgyYzc2MjAzMSwgMHgyZTMxMmUzMiwKLTB4MmUzMTMyMjAsIDB4MzEzOTM5MzksIDB4MmYzMDMxMmYsIDB4MzIzMDIwMzEsCi0weDM5M2EzNDM5LCAweDNhMzUzMTIwLCAweDczNjg3NTYxLCAweDZlNjcyMDQ1LAotMHg3ODcwMjAyNCwgMHgwLCAweDQ2NTc1ZjU2LCAweDQ1NTI1MzQ5LAotMHg0ZjRlM2EyMCwgMHgyMzMxMjA0NiwgMHg3MjY5MjA0MSwgMHg3MDcyMjAzNywKLTB4MjAzMTM3M2EsIDB4MzUzNzNhMzUsIDB4MzIyMDUwNDQsIDB4NTQyMDMyMzAsCi0weDMwMzAwMDAwLCAweDQ2NTc1ZjQzLCAweDRmNGQ1MDQ5LCAweDRjNDU1ZjU0LAotMHg0OTRkNDUzYSwgMHgyMDMxMzczYSwgMHgzNTM3M2EzNSwgMHgzMjAwMDAwMCwKLTB4NDY1NzVmNDMsIDB4NGY0ZDUwNDksIDB4NGM0NTVmNDIsIDB4NTkzYTIwNjQsCi0weDY1NzY3MjYzLCAweDczMDAwMDAwLCAweDQ2NTc1ZjQzLCAweDRmNGQ1MDQ5LAotMHg0YzQ1NWY0OCwgMHg0ZjUzNTQzYSwgMHgyMDYzNmY2ZCwgMHg3MDc1NzQ2NSwKLTB4MCwgMHg0NjU3NWY0MywgMHg0ZjRkNTA0OSwgMHg0YzQ1NWY0NCwKLTB4NGY0ZDQxNDksIDB4NGUzYTIwNjUsIDB4NmU2NzJlNjEsIDB4NjM3NDY1NmYsCi0weDZlMmU2MzZmLCAweDZkMDAwMDAwLCAweDQ2NTc1ZjQzLCAweDRmNGQ1MDQ5LAotMHg0YzQ1NTIzYSwgMHgyMDY3NjM2MywgMHgyMDc2NjU3MiwgMHg3MzY5NmY2ZSwKLTB4MjAzMjJlMzcsIDB4MmUzMjAwMDAsIDB4MCwgMHgxMjA0MTEwMCwKLTB4MCwgMHgyNDQ4NjU2MSwgMHg2NDY1NzIzYSwgMHgyMDJmNzA3MiwKLTB4NmY2YTY1NjMsIDB4NzQ3MzJmNzIsIDB4NjM3MzJmNzMsIDB4NzcyZjY3NjUsCi0weDJmMmUyZjZlLCAweDY5NjMyZjY2LCAweDc3MzIyZjYzLCAweDZmNmQ2ZDZmLAotMHg2ZTJmNmQ2NSwgMHg2ZDJlNjMyYywgMHg3NjIwMzEyZSwgMHgzMTJlMzIyZSwKLTB4MzUyMDMxMzksIDB4MzkzODJmMzAsIDB4MzkyZjMzMzAsIDB4MjAzMTM4M2EsCi0weDM1MzAzYTMwLCAweDM4MjA3MzY4LCAweDc1NjE2ZTY3LCAweDIwNDU3ODcwLAotMHgyMDI0MDAwMCwgMHgyNDQ4NjU2MSwgMHg2NDY1NzIzYSwgMHgyMDJmNzA3MiwKLTB4NmY2YTY1NjMsIDB4NzQ3MzJmNzIsIDB4NjM3MzJmNzMsIDB4NzcyZjY3NjUsCi0weDJmMmUyZjZlLCAweDY5NjMyZjY2LCAweDc3MzIyZjYzLCAweDZmNmQ2ZDZmLAotMHg2ZTJmNzM2NSwgMHg2ZTY0MmU2MywgMHgyYzc2MjAzMSwgMHgyZTMxMmUzMiwKLTB4MmUzNDM0MjAsIDB4MzEzOTM5MzgsIDB4MmYzMTMyMmYsIDB4MzIzMTIwMzAsCi0weDMwM2EzMzMzLCAweDNhMzEzODIwLCAweDczNjg3NTYxLCAweDZlNjcyMDQ1LAotMHg3ODcwMjAyNCwgMHgwLCAweDY1NzY3NDUyLCAweDZlNjc0NjAwLAotMHg1MTY1NzY3NCwgMHg0NjAwMDAwMCwgMHg1MTY1NzY3NCwgMHg1MDVmNDYwMCwKLTB4NGQ2NTc2NzQsIDB4NTI2ZTY3NDYsIDB4MCwgMHg0ZDUxNjU3NiwKLTB4NzQ0NjAwMDAsIDB4NGQ1MTY1NzYsIDB4NTA1ZjQ2MDAsIDB4NTE3MzQzNmYsCi0weDZlNDk1ZjQ2LCAweDAsIDB4NTE3MzQzNmYsIDB4NmU3MzQ2MDAsCi0weDUxNzI1MDcyLCAweDZmNjQ0NjAwLCAweDY5NzM2ZTc0LCAweDU0NjM3MDU1LAotMHgwLCAweDI0NDg2NTYxLCAweDY0NjU3MjNhLCAweDIwMmY3MDcyLAotMHg2ZjZhNjU2MywgMHg3NDczMmY3MiwgMHg2MzczMmY3MywgMHg3NzJmNjc2NSwKLTB4MmYyZTJmNmUsIDB4Njk2MzJmNjYsIDB4NzczMjJmNjMsIDB4NmY2ZDZkNmYsCi0weDZlMmY3MjY1LCAweDYzNzYyZTYzLCAweDJjNzYyMDMxLCAweDJlMzEyZTMyLAotMHgyZTM1MzMyMCwgMHgzMTM5MzkzOSwgMHgyZjMwMzEyZiwgMHgzMTM2MjAzMCwKLTB4MzIzYTM1MzUsIDB4M2EzNDMzMjAsIDB4NzM2ODc1NjEsIDB4NmU2NzIwNDUsCi0weDc4NzAyMDI0LCAweDAsIDB4NjU3Njc0NTIsIDB4NmU2NzQ2MDAsCi0weDUxNjU3Njc0LCAweDQ2MDAwMDAwLCAweDUxNjU3Njc0LCAweDUwNWY0NjAwLAotMHg0ZDY1NzY3NCwgMHg1MjZlNjc0NiwgMHgwLCAweDRkNTE2NTc2LAotMHg3NDQ2MDAwMCwgMHg0ZDUxNjU3NiwgMHg1MDVmNDYwMCwgMHg1MTczNDM2ZiwKLTB4NmU0OTVmNDYsIDB4MCwgMHg1MTczNDM2ZiwgMHg2ZTczNDYwMCwKLTB4NTE3MjUwNzIsIDB4NmY2NDQ2MDAsIDB4NzI0ZDYxNjMsIDB4NDM2ODZiMzAsCi0weDAsIDB4NzI3ODQ2NzIsIDB4NmQzMjRjNjcsIDB4MCwKLTB4NzI3ODRlNmYsIDB4NTM3NDQyNjQsIDB4MCwgMHg3Mjc4NGU2ZiwKLTB4NGQ2OTQyNjQsIDB4MCwgMHg3Mjc4NGU2ZiwgMHg0YTZkNDI2NCwKLTB4MCwgMHg3Mjc4NDM2YiwgMHg0NDZkNjE0NiwgMHgwLAotMHg3Mjc4NTE0NCwgMHg2ZDQ1Nzg0NiwgMHgwLCAweDcyNzg1MTQ0LAotMHg2ZDYxNDYwMCwgMHg3Mjc4NTE0NCwgMHg0YzQyNjQ0NiwgMHgwLAotMHg3Mjc4NTE0NCwgMHg2ZDQyNjQ0NiwgMHgwLCAweDcyNzg0MzcyLAotMHg2MzUwNjE2NCwgMHgwLCAweDcyNTM2ZDUxLCAweDQ0NmQ2MTQ2LAotMHgwLCAweDI0NDg2NTYxLCAweDY0NjU3MjNhLCAweDIwMmY3MDcyLAotMHg2ZjZhNjU2MywgMHg3NDczMmY3MiwgMHg2MzczMmY3MywgMHg3NzJmNjc2NSwKLTB4MmYyZTJmNmUsIDB4Njk2MzJmNjYsIDB4NzczMjJmNjMsIDB4NmY2ZDZkNmYsCi0weDZlMmY2ZDYxLCAweDYzMmU2MzJjLCAweDc2MjAzMTJlLCAweDMxMmUzMjJlLAotMHgzMjMyMjAzMSwgMHgzOTM5MzgyZiwgMHgzMTMyMmYzMCwgMHgzODIwMzAzMiwKLTB4M2EzMzM2M2EsIDB4MzMzMDIwNzMsIDB4Njg3NTYxNmUsIDB4NjcyMDQ1NzgsCi0weDcwMjAyNDAwLCAweDY1NzY3NDUyLCAweDZlNjc0NjAwLCAweDUxNjU3Njc0LAotMHg0NjAwMDAwMCwgMHg1MTY1NzY3NCwgMHg1MDVmNDYwMCwgMHg0ZDY1NzY3NCwKLTB4NTI2ZTY3NDYsIDB4MCwgMHg0ZDUxNjU3NiwgMHg3NDQ2MDAwMCwKLTB4NGQ1MTY1NzYsIDB4NTA1ZjQ2MDAsIDB4NTE3MzQzNmYsIDB4NmU0OTVmNDYsCi0weDAsIDB4NTE3MzQzNmYsIDB4NmU3MzQ2MDAsIDB4NTE3MjUwNzIsCi0weDZmNjQ0NjAwLCAweDZkNjE2MzU0LCAweDY4NzI2NTczLCAweDAsCi0weDIzNzQ0ZDYxLCAweDYzNDE1NDRlLCAweDAsIDB4MjM3MjRkNjEsCi0weDYzNDE1NDRlLCAweDAsIDB4NzI2NTZkNDEsIDB4NzM3MzcyNzQsCi0weDAsIDB4NmM2OTZlNmIsIDB4NDQ0ZjU3NGUsIDB4MCwKLTB4NmM2OTZlNmIsIDB4NTU1MDAwMDAsIDB4MCwgMHgwLAotMHgwLCAweDI0NDg2NTYxLCAweDY0NjU3MjNhLCAweDIwMmY3MDcyLAotMHg2ZjZhNjU2MywgMHg3NDczMmY3MiwgMHg2MzczMmY3MywgMHg3NzJmNjc2NSwKLTB4MmYyZTJmNmUsIDB4Njk2MzJmNjYsIDB4NzczMjJmNjMsIDB4NmY2ZDZkNmYsCi0weDZlMmY2MzZiLCAweDczNzU2ZDJlLCAweDYzMmM3NjIwLCAweDMxMmUzMTJlLAotMHgzMjJlMzkyMCwgMHgzMTM5MzkzOSwgMHgyZjMwMzEyZiwgMHgzMTM0MjAzMCwKLTB4MzAzYTMwMzMsIDB4M2EzNDM4MjAsIDB4NzM2ODc1NjEsIDB4NmU2NzIwNDUsCi0weDc4NzAyMDI0LCAweDAsIDB4NjU3Njc0NTIsIDB4NmU2NzQ2MDAsCi0weDUxNjU3Njc0LCAweDQ2MDAwMDAwLCAweDUxNjU3Njc0LCAweDUwNWY0NjAwLAotMHg0ZDY1NzY3NCwgMHg1MjZlNjc0NiwgMHgwLCAweDRkNTE2NTc2LAotMHg3NDQ2MDAwMCwgMHg0ZDUxNjU3NiwgMHg1MDVmNDYwMCwgMHg1MTczNDM2ZiwKLTB4NmU0OTVmNDYsIDB4MCwgMHg1MTczNDM2ZiwgMHg2ZTczNDYwMCwKLTB4NTE3MjUwNzIsIDB4NmY2NDQ2MDAsIDB4MCwgMHgwLAotMHgwLCAweDUwNzI2ZjYyLCAweDY1NTA2ODc5LCAweDAsCi0weDZjNmU2YjQxLCAweDUzNTM1MjU0LCAweDAsIDB4MTA5YTQsCi0weDEwYTFjLCAweDEwYTUwLCAweDEwYTdjLCAweDExMDUwLAotMHgxMGFhOCwgMHgxMGIxMCwgMHgxMTFmYywgMHgxMGRjMCwKLTB4MTBjNjgsIDB4MTBjODAsIDB4MTBjYzQsIDB4MTBjZWMsCi0weDEwZDBjLCAweDEwZDM0LCAweDExMWZjLCAweDEwZGMwLAotMHgxMGRmOCwgMHgxMGUxMCwgMHgxMGU0MCwgMHgxMGU2OCwKLTB4MTBlODgsIDB4MTBlYjAsIDB4MCwgMHgxMGZkYywKLTB4MTEwMDgsIDB4MTEwMmMsIDB4MTExZmMsIDB4MTEwNTAsCi0weDExMDc4LCAweDExMTA4LCAweDAsIDB4MCwKLTB4MCwgMHgxMTg2YywgMHgxMTkzYywgMHgxMWExNCwKLTB4MTFhZTQsIDB4MTFiNDAsIDB4MTFjMWMsIDB4MTFjNDQsCi0weDExZDIwLCAweDExZDQ4LCAweDExZWYwLCAweDExZjE4LAotMHgxMjBjMCwgMHgxMjJiOCwgMHgxMjU0YywgMHgxMjQ2MCwKLTB4MTI1NGMsIDB4MTI1NzgsIDB4MTIwZTgsIDB4MTIyOTAsCi0weDcyNzM3NDVmLCAweDY3NmQ2OTY5LCAweDAsIDB4MTI2MDgsCi0weDEyNjQwLCAweDEyNzI4LCAweDEzMzc0LCAweDEzM2I0LAotMHgxMzNjYywgMHg3MzY1NzQ2YywgMHg2ZjZmNzAwMCwgMHgwLAotMHgwLCAweDEzYmJjLCAweDEzYmZjLCAweDEzYzhjLAotMHgxM2NkMCwgMHgxM2QzNCwgMHgxM2RjMCwgMHgxM2RmNCwKLTB4MTNlN2MsIDB4MTNmMTQsIDB4MTNmZTQsIDB4MTQwMjQsCi0weDE0MGE4LCAweDE0MGNjLCAweDE0MWRjLCAweDY0NmY0MjYxLAotMHg3MzY1NTA2NywgMHgwLCAweDAsIDB4MCwKLTB4MCwgMHg3Mzc0NmQ2MSwgMHg2MzRjNGU0YiwgMHgwLAotMHg2NzY1NzQ2ZCwgMHg2MzZjNmU2YiwgMHgwLCAweDE0ZWQ4LAotMHgxNGVkOCwgMHgxNGI4YywgMHgxNGJkOCwgMHgxNGMyNCwKLTB4MTRlZDgsIDB4NzM2NTc0NmQsIDB4NjE2MzYxNjMsIDB4NzQwMDAwMDAsCi0weDAsIDB4MCB9Owotc3RhdGljIHUzMiB0aWdvbjJGd0RhdGFbKE1BWF9EQVRBX0xFTi80KSArIDFdIF9fZGV2aW5pdGRhdGEgPSB7Ci0weDEsCi0weDEsIDB4MSwgMHhjMDAxZmMsIDB4M2ZmYywKLTB4YzAwMDAwLCAweDQxNmM3NDY1LCAweDZmNmUyMDQxLCAweDYzNjU0ZTQ5LAotMHg0MzIwNTYwMCwgMHgwLCAweDAsIDB4MCwKLTB4MCwgMHgwLCAweDAsIDB4NDE2Yzc0NjUsCi0weDZmNmUyMDQxLCAweDYzNjU0ZTQ5LCAweDQzMjA1NjAwLCAweDQyNDI0MjQyLAotMHgwLCAweDAsIDB4MCwgMHgxZmZmZmMsCi0weDFmZmY3YywgMHgwLCAweDAsIDB4MCwKLTB4MCwgMHgwLCAweDAsIDB4NjBjZjAwLAotMHg2MCwgMHhjZjAwMDAwMCwgMHgwLCAweDAsCi0weDAsIDB4MCwgMHgwLCAweDAsCi0weDAsIDB4MCwgMHgwLCAweDAsCi0weDAsIDB4MCwgMHgwLCAweDAsCi0weDAsIDB4MCwgMHgwLCAweDAsCi0weDAsIDB4MCwgMHgzLCAweDAsCi0weDEsIDB4MCwgMHgwLCAweDAsCi0weDEsIDB4MCwgMHgxLCAweDAsCi0weDAsIDB4MCwgMHgwLCAweDEsCi0weDEsIDB4MCwgMHgwLCAweDAsCi0weDAsIDB4MCwgMHgxMDAwMDAwLCAweDIxMDAwMDAwLAotMHgxMjAwMDE0MCwgMHgwLCAweDAsIDB4MjAwMDAwMDAsCi0weDEyMDAwMGEwLCAweDAsIDB4MTIwMDAwNjAsIDB4MTIwMDAxODAsCi0weDEyMDAwMWUwLCAweDAsIDB4MCwgMHgwLAotMHgxLCAweDAsIDB4MCwgMHgwLAotMHgwLCAweDAsIDB4MCwgMHgyLAotMHgwLCAweDAsIDB4MzAwMDEsIDB4MSwKLTB4MzAyMDEsIDB4MCwgMHgwLCAweDEwMTAxMDEsCi0weDEwMTAxMDAsIDB4MTAxMDAsIDB4MTAxMDAwMSwgMHgxMDAwMSwKLTB4MTAwMDEwMSwgMHgxMDEsIDB4MCwgMHgwIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9hbWQ4MTExZS5jIGIvZHJpdmVycy9uZXQvYW1kODExMWUuYwppbmRleCAxODdhYzZlLi43NzA5OTkyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9hbWQ4MTExZS5jCisrKyBiL2RyaXZlcnMvbmV0L2FtZDgxMTFlLmMKQEAgLTE4MTMsNiArMTgxMywyNSBAQAogCWxwLT5leHRfcGh5X2FkZHIgPSAxOwogfQogCitzdGF0aWMgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzIGFtZDgxMTFlX25ldGRldl9vcHMgPSB7CisJLm5kb19vcGVuCQk9IGFtZDgxMTFlX29wZW4sCisJLm5kb19zdG9wCQk9IGFtZDgxMTFlX2Nsb3NlLAorCS5uZG9fc3RhcnRfeG1pdAkJPSBhbWQ4MTExZV9zdGFydF94bWl0LAorCS5uZG9fdHhfdGltZW91dAkJPSBhbWQ4MTExZV90eF90aW1lb3V0LAorCS5uZG9fZ2V0X3N0YXRzCQk9IGFtZDgxMTFlX2dldF9zdGF0cywKKwkubmRvX3NldF9tdWx0aWNhc3RfbGlzdCA9IGFtZDgxMTFlX3NldF9tdWx0aWNhc3RfbGlzdCwKKwkubmRvX3ZhbGlkYXRlX2FkZHIJPSBldGhfdmFsaWRhdGVfYWRkciwKKwkubmRvX3NldF9tYWNfYWRkcmVzcwk9IGFtZDgxMTFlX3NldF9tYWNfYWRkcmVzcywKKwkubmRvX2RvX2lvY3RsCQk9IGFtZDgxMTFlX2lvY3RsLAorCS5uZG9fY2hhbmdlX210dQkJPSBhbWQ4MTExZV9jaGFuZ2VfbXR1LAorI2lmIEFNRDgxMTFFX1ZMQU5fVEFHX1VTRUQKKwkubmRvX3ZsYW5fcnhfcmVnaXN0ZXIJPSBhbWQ4MTExZV92bGFuX3J4X3JlZ2lzdGVyLAorI2VuZGlmCisjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKKwkubmRvX3BvbGxfY29udHJvbGxlcgkgPSBhbWQ4MTExZV9wb2xsLAorI2VuZGlmCit9OworCiBzdGF0aWMgaW50IF9fZGV2aW5pdCBhbWQ4MTExZV9wcm9iZV9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsCiAJCQkJICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQogewpAQCAtMTg3Miw3ICsxODkxLDYgQEAKIAogI2lmIEFNRDgxMTFFX1ZMQU5fVEFHX1VTRUQKIAlkZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfSFdfVkxBTl9UWCB8IE5FVElGX0ZfSFdfVkxBTl9SWCA7Ci0JZGV2LT52bGFuX3J4X3JlZ2lzdGVyID1hbWQ4MTExZV92bGFuX3J4X3JlZ2lzdGVyOwogI2VuZGlmCiAKIAlscCA9IG5ldGRldl9wcml2KGRldik7CkBAIC0xOTAxLDI3ICsxOTE5LDE2IEBACiAJaWYoZHluYW1pY19pcGdbY2FyZF9pZHgrK10pCiAJCWxwLT5vcHRpb25zIHw9IE9QVElPTl9EWU5fSVBHX0VOQUJMRTsKIAorCiAJLyogSW5pdGlhbGl6ZSBkcml2ZXIgZW50cnkgcG9pbnRzICovCi0JZGV2LT5vcGVuID0gYW1kODExMWVfb3BlbjsKLQlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9IGFtZDgxMTFlX3N0YXJ0X3htaXQ7Ci0JZGV2LT5zdG9wID0gYW1kODExMWVfY2xvc2U7Ci0JZGV2LT5nZXRfc3RhdHMgPSBhbWQ4MTExZV9nZXRfc3RhdHM7Ci0JZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSBhbWQ4MTExZV9zZXRfbXVsdGljYXN0X2xpc3Q7Ci0JZGV2LT5zZXRfbWFjX2FkZHJlc3MgPSBhbWQ4MTExZV9zZXRfbWFjX2FkZHJlc3M7Ci0JZGV2LT5kb19pb2N0bCA9IGFtZDgxMTFlX2lvY3RsOwotCWRldi0+Y2hhbmdlX210dSA9IGFtZDgxMTFlX2NoYW5nZV9tdHU7CisJZGV2LT5uZXRkZXZfb3BzID0gJmFtZDgxMTFlX25ldGRldl9vcHM7CiAJU0VUX0VUSFRPT0xfT1BTKGRldiwgJm9wcyk7CiAJZGV2LT5pcnEgPXBkZXYtPmlycTsKLQlkZXYtPnR4X3RpbWVvdXQgPSBhbWQ4MTExZV90eF90aW1lb3V0OwogCWRldi0+d2F0Y2hkb2dfdGltZW8gPSBBTUQ4MTExRV9UWF9USU1FT1VUOwogCW5ldGlmX25hcGlfYWRkKGRldiwgJmxwLT5uYXBpLCBhbWQ4MTExZV9yeF9wb2xsLCAzMik7Ci0jaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKLQlkZXYtPnBvbGxfY29udHJvbGxlciA9IGFtZDgxMTFlX3BvbGw7Ci0jZW5kaWYKIAogI2lmIEFNRDgxMTFFX1ZMQU5fVEFHX1VTRUQKIAlkZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfSFdfVkxBTl9UWCB8IE5FVElGX0ZfSFdfVkxBTl9SWDsKLQlkZXYtPnZsYW5fcnhfcmVnaXN0ZXIgPWFtZDgxMTFlX3ZsYW5fcnhfcmVnaXN0ZXI7CiAjZW5kaWYKIAkvKiBQcm9iZSB0aGUgZXh0ZXJuYWwgUEhZICovCiAJYW1kODExMWVfcHJvYmVfZXh0X3BoeShkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYXBwbGV0YWxrL2lwZGRwLmMgYi9kcml2ZXJzL25ldC9hcHBsZXRhbGsvaXBkZHAuYwppbmRleCA5YTBiZTliLi5kYTY0YmE4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9hcHBsZXRhbGsvaXBkZHAuYworKysgYi9kcml2ZXJzL25ldC9hcHBsZXRhbGsvaXBkZHAuYwpAQCAtNDgsMTIgKzQ4LDE4IEBACiAKIC8qIEluZGV4IHRvIGZ1bmN0aW9ucywgYXMgZnVuY3Rpb24gcHJvdG90eXBlcy4gKi8KIHN0YXRpYyBpbnQgaXBkZHBfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKLXN0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqaXBkZHBfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogc3RhdGljIGludCBpcGRkcF9jcmVhdGUoc3RydWN0IGlwZGRwX3JvdXRlICpuZXdfcnQpOwogc3RhdGljIGludCBpcGRkcF9kZWxldGUoc3RydWN0IGlwZGRwX3JvdXRlICpydCk7CiBzdGF0aWMgc3RydWN0IGlwZGRwX3JvdXRlKiBpcGRkcF9maW5kX3JvdXRlKHN0cnVjdCBpcGRkcF9yb3V0ZSAqcnQpOwogc3RhdGljIGludCBpcGRkcF9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKmlmciwgaW50IGNtZCk7CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgaXBkZHBfbmV0ZGV2X29wcyA9IHsKKwkubmRvX3N0YXJ0X3htaXQJCT0gaXBkZHBfeG1pdCwKKwkubmRvX2RvX2lvY3RsICAgCT0gaXBkZHBfaW9jdGwsCisJLm5kb19jaGFuZ2VfbXR1CQk9IGV0aF9jaGFuZ2VfbXR1LAorCS5uZG9fc2V0X21hY19hZGRyZXNzIAk9IGV0aF9tYWNfYWRkciwKKwkubmRvX3ZhbGlkYXRlX2FkZHIJPSBldGhfdmFsaWRhdGVfYWRkciwKK307CiAKIHN0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZSAqIF9faW5pdCBpcGRkcF9pbml0KHZvaWQpCiB7CkBAIC02MSw3ICs2Nyw3IEBACiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKIAlpbnQgZXJyOwogCi0JZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzKSk7CisJZGV2ID0gYWxsb2NfZXRoZXJkZXYoMCk7CiAJaWYgKCFkZXYpCiAJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwogCkBAIC03MSw5ICs3Nyw3IEBACiAgICAgICAgICAgICAgICAgcHJpbnRrKHZlcnNpb24pOwogCiAJLyogSW5pdGFsaXplIHRoZSBkZXZpY2Ugc3RydWN0dXJlLiAqLwotICAgICAgICBkZXYtPmhhcmRfc3RhcnRfeG1pdCA9IGlwZGRwX3htaXQ7Ci0gICAgICAgIGRldi0+Z2V0X3N0YXRzICAgICAgPSBpcGRkcF9nZXRfc3RhdHM7Ci0gICAgICAgIGRldi0+ZG9faW9jdGwgICAgICAgPSBpcGRkcF9pb2N0bDsKKwlkZXYtPm5ldGRldl9vcHMgPSAmaXBkZHBfbmV0ZGV2X29wczsKIAogICAgICAgICBkZXYtPnR5cGUgPSBBUlBIUkRfSVBERFA7ICAgICAgIAkvKiBJUCBvdmVyIEREUCB0dW5uZWwgKi8KICAgICAgICAgZGV2LT5tdHUgPSA1ODU7CkBAIC0xMDMsMTMgKzEwNyw2IEBACiAgICAgICAgIHJldHVybiBkZXY7CiB9CiAKLS8qCi0gKiBHZXQgdGhlIGN1cnJlbnQgc3RhdGlzdGljcy4gVGhpcyBtYXkgYmUgY2FsbGVkIHdpdGggdGhlIGNhcmQgb3BlbiBvciBjbG9zZWQuCi0gKi8KLXN0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqaXBkZHBfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCi17Ci0JcmV0dXJuIG5ldGRldl9wcml2KGRldik7Ci19CiAKIC8qCiAgKiBUcmFuc21pdCBMTEFQL0VMQVAgZnJhbWUgdXNpbmcgYWFycF9zZW5kX2RkcC4KQEAgLTE3MCw4ICsxNjcsOCBAQAogCiAgICAgICAgIHNrYi0+cHJvdG9jb2wgPSBodG9ucyhFVEhfUF9BVEFMSyk7ICAgICAvKiBQcm90b2NvbCBoYXMgY2hhbmdlZCAqLwogCi0JKChzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqKSBuZXRkZXZfcHJpdihkZXYpKS0+dHhfcGFja2V0cysrOwotCSgoc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKikgbmV0ZGV2X3ByaXYoZGV2KSktPnR4X2J5dGVzICs9IHNrYi0+bGVuOworCWRldi0+c3RhdHMudHhfcGFja2V0cysrOworCWRldi0+c3RhdHMudHhfYnl0ZXMgKz0gc2tiLT5sZW47CiAKICAgICAgICAgaWYoYWFycF9zZW5kX2RkcChydC0+ZGV2LCBza2IsICZydC0+YXQsIE5VTEwpIDwgMCkKICAgICAgICAgICAgICAgICBkZXZfa2ZyZWVfc2tiKHNrYik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9hcm0vZXRoZXJoLmMgYi9kcml2ZXJzL25ldC9hcm0vZXRoZXJoLmMKaW5kZXggNjI3ODYwNi4uZDE1ZDhiNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvYXJtL2V0aGVyaC5jCisrKyBiL2RyaXZlcnMvbmV0L2FybS9ldGhlcmguYwpAQCAtNjQ2LDYgKzY0Niw3IEBACiAJLm5kb19nZXRfc3RhdHMJCT0gZWlfZ2V0X3N0YXRzLAogCS5uZG9fc2V0X211bHRpY2FzdF9saXN0ID0gZWlfc2V0X211bHRpY2FzdF9saXN0LAogCS5uZG9fdmFsaWRhdGVfYWRkcgk9IGV0aF92YWxpZGF0ZV9hZGRyLAorCS5uZG9fc2V0X21hY19hZGRyZXNzCT0gZXRoX3NldF9tYWNfYWRkciwKIAkubmRvX2NoYW5nZV9tdHUJCT0gZXRoX2NoYW5nZV9tdHUsCiAjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKIAkubmRvX3BvbGxfY29udHJvbGxlcgk9IGVpX3BvbGwsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9hcm0va3M4Njk1bmV0LmMgYi9kcml2ZXJzL25ldC9hcm0va3M4Njk1bmV0LmMKaW5kZXggOWFkMjJkMS4uMWNmMmY5NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvYXJtL2tzODY5NW5ldC5jCisrKyBiL2RyaXZlcnMvbmV0L2FybS9rczg2OTVuZXQuYwpAQCAtMTM1Nyw2ICsxMzU3LDcgQEAKIAkubmRvX3N0YXJ0X3htaXQJCT0ga3M4Njk1X3N0YXJ0X3htaXQsCiAJLm5kb190eF90aW1lb3V0CQk9IGtzODY5NV90aW1lb3V0LAogCS5uZG9fc2V0X21hY19hZGRyZXNzCT0ga3M4Njk1X3NldF9tYWMsCisJLm5kb192YWxpZGF0ZV9hZGRyCT0gZXRoX3ZhbGlkYXRlX2FkZHIsCiAJLm5kb19zZXRfbXVsdGljYXN0X2xpc3QJPSBrczg2OTVfc2V0X211bHRpY2FzdCwKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2F0cC5jIGIvZHJpdmVycy9uZXQvYXRwLmMKaW5kZXggZWE0OTNjZS4uNDMxN2IzZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvYXRwLmMKKysrIGIvZHJpdmVycy9uZXQvYXRwLmMKQEAgLTIwNCw4ICsyMDQsNyBAQAogc3RhdGljIHZvaWQgbmV0X3J4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogc3RhdGljIHZvaWQgcmVhZF9ibG9jayhsb25nIGlvYWRkciwgaW50IGxlbmd0aCwgdW5zaWduZWQgY2hhciAqYnVmZmVyLCBpbnQgZGF0YV9tb2RlKTsKIHN0YXRpYyBpbnQgbmV0X2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwotc3RhdGljIHZvaWQgc2V0X3J4X21vZGVfODAwMihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKLXN0YXRpYyB2b2lkIHNldF9yeF9tb2RlXzgwMTIoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBzZXRfcnhfbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIHN0YXRpYyB2b2lkIHR4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiAKIApAQCAtMjQyLDYgKzI0MSwxNyBAQAogCXJldHVybiAtRU5PREVWOwogfQogCitzdGF0aWMgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzIGF0cF9uZXRkZXZfb3BzID0geworCS5uZG9fb3BlbgkJPSBuZXRfb3BlbiwKKwkubmRvX3N0b3AJCT0gbmV0X2Nsb3NlLAorCS5uZG9fc3RhcnRfeG1pdAkJPSBhdHBfc2VuZF9wYWNrZXQsCisJLm5kb19zZXRfbXVsdGljYXN0X2xpc3QgPSBzZXRfcnhfbW9kZSwKKwkubmRvX3R4X3RpbWVvdXQJCT0gdHhfdGltZW91dCwKKwkubmRvX2NoYW5nZV9tdHUJCT0gZXRoX2NoYW5nZV9tdHUsCisJLm5kb19zZXRfbWFjX2FkZHJlc3MgCT0gZXRoX21hY19hZGRyLAorCS5uZG9fdmFsaWRhdGVfYWRkcgk9IGV0aF92YWxpZGF0ZV9hZGRyLAorfTsKKwogc3RhdGljIGludCBfX2luaXQgYXRwX3Byb2JlMShsb25nIGlvYWRkcikKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gTlVMTDsKQEAgLTM0MiwxMiArMzUyLDcgQEAKIAlpZiAoZGV2LT5tZW1fZW5kICYgMHhmKQogCQluZXRfZGVidWcgPSBkZXYtPm1lbV9lbmQgJiA3OwogCi0JZGV2LT5vcGVuCQk9IG5ldF9vcGVuOwotCWRldi0+c3RvcAkJPSBuZXRfY2xvc2U7Ci0JZGV2LT5oYXJkX3N0YXJ0X3htaXQJPSBhdHBfc2VuZF9wYWNrZXQ7Ci0JZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPQotCSAgbHAtPmNoaXBfdHlwZSA9PSBSVEw4MDAyID8gJnNldF9yeF9tb2RlXzgwMDIgOiAmc2V0X3J4X21vZGVfODAxMjsKLQlkZXYtPnR4X3RpbWVvdXQJCT0gdHhfdGltZW91dDsKKwlkZXYtPm5ldGRldl9vcHMgCT0gJmF0cF9uZXRkZXZfb3BzOwogCWRldi0+d2F0Y2hkb2dfdGltZW8JPSBUWF9USU1FT1VUOwogCiAJcmVzID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CkBAIC05MDMsNiArOTA4LDE3IEBACiAgICAgd3JpdGVfcmVnKGlvYWRkciwgQ01SMiwgQ01SMl9JUlFPVVQpOyAvKiBTd2l0Y2ggYmFjayB0byBwYWdlIDAgKi8KIH0KIAorc3RhdGljIHZvaWQgc2V0X3J4X21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0X2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CisKKwlpZiAobHAtPmNoaXBfdHlwZSA9PSBSVEw4MDAyKQorCQlyZXR1cm4gc2V0X3J4X21vZGVfODAwMihkZXYpOworCWVsc2UKKwkJcmV0dXJuIHNldF9yeF9tb2RlXzgwMTIoZGV2KTsKK30KKworCiBzdGF0aWMgaW50IF9faW5pdCBhdHBfaW5pdF9tb2R1bGUodm9pZCkgewogCWlmIChkZWJ1ZykJCQkJCS8qIEVtaXQgdmVyc2lvbiBldmVuIGlmIG5vIGNhcmRzIGRldGVjdGVkLiAqLwogCQlwcmludGsoS0VSTl9JTkZPICIlcyIsIHZlcnNpb24pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYXg4ODc5Ni5jIGIvZHJpdmVycy9uZXQvYXg4ODc5Ni5jCmluZGV4IDMzNzQ4OGUuLmE0ZWI2YzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2F4ODg3OTYuYworKysgYi9kcml2ZXJzL25ldC9heDg4Nzk2LmMKQEAgLTM3LDcgKzM3LDEwIEBACiAjZGVmaW5lIF9fZWlfb3BlbiAgICAgICBheF9laV9vcGVuCiAjZGVmaW5lIF9fZWlfY2xvc2UgICAgICBheF9laV9jbG9zZQogI2RlZmluZSBfX2VpX3BvbGwJYXhfZWlfcG9sbAorI2RlZmluZSBfX2VpX3N0YXJ0X3htaXQgYXhfZWlfc3RhcnRfeG1pdAogI2RlZmluZSBfX2VpX3R4X3RpbWVvdXQgYXhfZWlfdHhfdGltZW91dAorI2RlZmluZSBfX2VpX2dldF9zdGF0cyAgYXhfZWlfZ2V0X3N0YXRzCisjZGVmaW5lIF9fZWlfc2V0X211bHRpY2FzdF9saXN0IGF4X2VpX3NldF9tdWx0aWNhc3RfbGlzdAogI2RlZmluZSBfX2VpX2ludGVycnVwdCAgYXhfZWlfaW50ZXJydXB0CiAjZGVmaW5lIF9fX19hbGxvY19laV9uZXRkZXYgYXhfX2FsbG9jX2VpX25ldGRldgogI2RlZmluZSBfX05TODM5MF9pbml0ICAgYXhfTlM4MzkwX2luaXQKQEAgLTYyMyw2ICs2MjYsMjMgQEAKIH0KICNlbmRpZgogCitzdGF0aWMgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzIGF4X25ldGRldl9vcHMgPSB7CisJLm5kb19vcGVuCQk9IGF4X29wZW4sCisJLm5kb19zdG9wCQk9IGF4X2Nsb3NlLAorCS5uZG9fZG9faW9jdGwJCT0gYXhfaW9jdGwsCisKKwkubmRvX3N0YXJ0X3htaXQJCT0gYXhfZWlfc3RhcnRfeG1pdCwKKwkubmRvX3R4X3RpbWVvdXQJCT0gYXhfZWlfdHhfdGltZW91dCwKKwkubmRvX2dldF9zdGF0cwkJPSBheF9laV9nZXRfc3RhdHMsCisJLm5kb19zZXRfbXVsdGljYXN0X2xpc3QgPSBheF9laV9zZXRfbXVsdGljYXN0X2xpc3QsCisJLm5kb192YWxpZGF0ZV9hZGRyCT0gZXRoX3ZhbGlkYXRlX2FkZHIsCisJLm5kb19zZXRfbWFjX2FkZHJlc3MgCT0gZXRoX21hY19hZGRyLAorCS5uZG9fY2hhbmdlX210dQkJPSBldGhfY2hhbmdlX210dSwKKyNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgorCS5uZG9fcG9sbF9jb250cm9sbGVyCT0gYXhfZWlfcG9sbCwKKyNlbmRpZgorfTsKKwogLyogc2V0dXAgY29kZSAqLwogCiBzdGF0aWMgdm9pZCBheF9pbml0aWFsX3NldHVwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBlaV9kZXZpY2UgKmVpX2xvY2FsKQpAQCAtNzM4LDkgKzc1OCw3IEBACiAJZWlfc3RhdHVzLmdldF84MzkwX2hkcgk9ICZheF9nZXRfODM5MF9oZHI7CiAJZWlfc3RhdHVzLnByaXYgPSAwOwogCi0JZGV2LT5vcGVuCQk9IGF4X29wZW47Ci0JZGV2LT5zdG9wCQk9IGF4X2Nsb3NlOwotCWRldi0+ZG9faW9jdGwJCT0gYXhfaW9jdGw7CisJZGV2LT5uZXRkZXZfb3BzCQk9ICZheF9uZXRkZXZfb3BzOwogCWRldi0+ZXRodG9vbF9vcHMJPSAmYXhfZXRodG9vbF9vcHM7CiAKIAlheC0+bXNnX2VuYWJsZQkJPSBORVRJRl9NU0dfTElOSzsKQEAgLTc1Myw5ICs3NzEsNiBAQAogCWF4LT5taWkubWRpb193cml0ZQk9IGF4X3BoeV93cml0ZTsKIAlheC0+bWlpLmRldgkJPSBkZXY7CiAKLSNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgotCWRldi0+cG9sbF9jb250cm9sbGVyID0gYXhfZWlfcG9sbDsKLSNlbmRpZgogCWF4X05TODM5MF9pbml0KGRldiwgMCk7CiAKIAlpZiAoZmlyc3RfaW5pdCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2I0NC5jIGIvZHJpdmVycy9uZXQvYjQ0LmMKaW5kZXggMGU3NDcwYS4uYzM4NTEyZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvYjQ0LmMKKysrIGIvZHJpdmVycy9uZXQvYjQ0LmMKQEAgLTczLDggKzczLDggQEAKIAkgIChCUCktPnR4X2NvbnMgLSAoQlApLT50eF9wcm9kIC0gVFhfUklOR19HQVAoQlApKQogI2RlZmluZSBORVhUX1RYKE4pCQkoKChOKSArIDEpICYgKEI0NF9UWF9SSU5HX1NJWkUgLSAxKSkKIAotI2RlZmluZSBSWF9QS1RfT0ZGU0VUCQkzMAotI2RlZmluZSBSWF9QS1RfQlVGX1NaCQkoMTUzNiArIFJYX1BLVF9PRkZTRVQgKyA2NCkKKyNkZWZpbmUgUlhfUEtUX09GRlNFVAkJKFJYX0hFQURFUl9MRU4gKyAyKQorI2RlZmluZSBSWF9QS1RfQlVGX1NaCQkoMTUzNiArIFJYX1BLVF9PRkZTRVQpCiAKIC8qIG1pbmltdW0gbnVtYmVyIG9mIGZyZWUgVFggZGVzY3JpcHRvcnMgcmVxdWlyZWQgdG8gd2FrZSB1cCBUWCBwcm9jZXNzICovCiAjZGVmaW5lIEI0NF9UWF9XQUtFVVBfVEhSRVNICQkoQjQ0X1RYX1JJTkdfU0laRSAvIDQpCkBAIC02NzksMTAgKzY3OSwxMCBAQAogCQkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKIAkJCXJldHVybiAtRU5PTUVNOwogCQl9CisJCWJwLT5mb3JjZV9jb3B5YnJlYWsgPSAxOwogCX0KIAogCXJoID0gKHN0cnVjdCByeF9oZWFkZXIgKikgc2tiLT5kYXRhOwotCXNrYl9yZXNlcnZlKHNrYiwgUlhfUEtUX09GRlNFVCk7CiAKIAlyaC0+bGVuID0gMDsKIAlyaC0+ZmxhZ3MgPSAwOwpAQCAtNjkzLDEzICs2OTMsMTMgQEAKIAlpZiAoc3JjX21hcCAhPSBOVUxMKQogCQlzcmNfbWFwLT5za2IgPSBOVUxMOwogCi0JY3RybCAgPSAoREVTQ19DVFJMX0xFTiAmIChSWF9QS1RfQlVGX1NaIC0gUlhfUEtUX09GRlNFVCkpOworCWN0cmwgPSAoREVTQ19DVFJMX0xFTiAmIFJYX1BLVF9CVUZfU1opOwogCWlmIChkZXN0X2lkeCA9PSAoQjQ0X1JYX1JJTkdfU0laRSAtIDEpKQogCQljdHJsIHw9IERFU0NfQ1RSTF9FT1Q7CiAKIAlkcCA9ICZicC0+cnhfcmluZ1tkZXN0X2lkeF07CiAJZHAtPmN0cmwgPSBjcHVfdG9fbGUzMihjdHJsKTsKLQlkcC0+YWRkciA9IGNwdV90b19sZTMyKCh1MzIpIG1hcHBpbmcgKyBSWF9QS1RfT0ZGU0VUICsgYnAtPmRtYV9vZmZzZXQpOworCWRwLT5hZGRyID0gY3B1X3RvX2xlMzIoKHUzMikgbWFwcGluZyArIGJwLT5kbWFfb2Zmc2V0KTsKIAogCWlmIChicC0+ZmxhZ3MgJiBCNDRfRkxBR19SWF9SSU5HX0hBQ0spCiAJCWI0NF9zeW5jX2RtYV9kZXNjX2Zvcl9kZXZpY2UoYnAtPnNkZXYsIGJwLT5yeF9yaW5nX2RtYSwKQEAgLTgwMSw3ICs4MDEsNyBAQAogCQkvKiBPbWl0IENSQy4gKi8KIAkJbGVuIC09IDQ7CiAKLQkJaWYgKGxlbiA+IFJYX0NPUFlfVEhSRVNIT0xEKSB7CisJCWlmICghYnAtPmZvcmNlX2NvcHlicmVhayAmJiBsZW4gPiBSWF9DT1BZX1RIUkVTSE9MRCkgewogCQkJaW50IHNrYl9zaXplOwogCQkJc2tiX3NpemUgPSBiNDRfYWxsb2Nfcnhfc2tiKGJwLCBjb25zLCBicC0+cnhfcHJvZCk7CiAJCQlpZiAoc2tiX3NpemUgPCAwKQpAQCAtODA5LDggKzgwOSw4IEBACiAJCQlzc2JfZG1hX3VubWFwX3NpbmdsZShicC0+c2RldiwgbWFwLAogCQkJCQkgICAgIHNrYl9zaXplLCBETUFfRlJPTV9ERVZJQ0UpOwogCQkJLyogTGVhdmUgb3V0IHJ4X2hlYWRlciAqLwotICAgICAgICAgICAgICAgIAlza2JfcHV0KHNrYiwgbGVuICsgUlhfUEtUX09GRlNFVCk7Ci0gICAgICAgICAgICAJICAgICAgICBza2JfcHVsbChza2IsIFJYX1BLVF9PRkZTRVQpOworCQkJc2tiX3B1dChza2IsIGxlbiArIFJYX1BLVF9PRkZTRVQpOworCQkJc2tiX3B1bGwoc2tiLCBSWF9QS1RfT0ZGU0VUKTsKIAkJfSBlbHNlIHsKIAkJCXN0cnVjdCBza19idWZmICpjb3B5X3NrYjsKIApAQCAtMjEwOCw2ICsyMTA4LDIyIEBACiAJcmV0dXJuIGVycjsKIH0KIAorc3RhdGljIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyBiNDRfbmV0ZGV2X29wcyA9IHsKKwkubmRvX29wZW4JCT0gYjQ0X29wZW4sCisJLm5kb19zdG9wCQk9IGI0NF9jbG9zZSwKKwkubmRvX3N0YXJ0X3htaXQJCT0gYjQ0X3N0YXJ0X3htaXQsCisJLm5kb19nZXRfc3RhdHMJCT0gYjQ0X2dldF9zdGF0cywKKwkubmRvX3NldF9tdWx0aWNhc3RfbGlzdCA9IGI0NF9zZXRfcnhfbW9kZSwKKwkubmRvX3NldF9tYWNfYWRkcmVzcwk9IGI0NF9zZXRfbWFjX2FkZHIsCisJLm5kb192YWxpZGF0ZV9hZGRyCT0gZXRoX3ZhbGlkYXRlX2FkZHIsCisJLm5kb19kb19pb2N0bAkJPSBiNDRfaW9jdGwsCisJLm5kb190eF90aW1lb3V0CQk9IGI0NF90eF90aW1lb3V0LAorCS5uZG9fY2hhbmdlX210dQkJPSBiNDRfY2hhbmdlX210dSwKKyNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgorCS5uZG9fcG9sbF9jb250cm9sbGVyCT0gYjQ0X3BvbGxfY29udHJvbGxlciwKKyNlbmRpZgorfTsKKwogc3RhdGljIGludCBfX2RldmluaXQgYjQ0X2luaXRfb25lKHN0cnVjdCBzc2JfZGV2aWNlICpzZGV2LAogCQkJCSAgY29uc3Qgc3RydWN0IHNzYl9kZXZpY2VfaWQgKmVudCkKIHsKQEAgLTIxMzcsNiArMjE1Myw3IEBACiAJYnAgPSBuZXRkZXZfcHJpdihkZXYpOwogCWJwLT5zZGV2ID0gc2RldjsKIAlicC0+ZGV2ID0gZGV2OworCWJwLT5mb3JjZV9jb3B5YnJlYWsgPSAwOwogCiAJYnAtPm1zZ19lbmFibGUgPSBuZXRpZl9tc2dfaW5pdChiNDRfZGVidWcsIEI0NF9ERUZfTVNHX0VOQUJMRSk7CiAKQEAgLTIxNDUsMjAgKzIxNjIsOSBAQAogCWJwLT5yeF9wZW5kaW5nID0gQjQ0X0RFRl9SWF9SSU5HX1BFTkRJTkc7CiAJYnAtPnR4X3BlbmRpbmcgPSBCNDRfREVGX1RYX1JJTkdfUEVORElORzsKIAotCWRldi0+b3BlbiA9IGI0NF9vcGVuOwotCWRldi0+c3RvcCA9IGI0NF9jbG9zZTsKLQlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9IGI0NF9zdGFydF94bWl0OwotCWRldi0+Z2V0X3N0YXRzID0gYjQ0X2dldF9zdGF0czsKLQlkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9IGI0NF9zZXRfcnhfbW9kZTsKLQlkZXYtPnNldF9tYWNfYWRkcmVzcyA9IGI0NF9zZXRfbWFjX2FkZHI7Ci0JZGV2LT5kb19pb2N0bCA9IGI0NF9pb2N0bDsKLQlkZXYtPnR4X3RpbWVvdXQgPSBiNDRfdHhfdGltZW91dDsKKwlkZXYtPm5ldGRldl9vcHMgPSAmYjQ0X25ldGRldl9vcHM7CiAJbmV0aWZfbmFwaV9hZGQoZGV2LCAmYnAtPm5hcGksIGI0NF9wb2xsLCA2NCk7CiAJZGV2LT53YXRjaGRvZ190aW1lbyA9IEI0NF9UWF9USU1FT1VUOwotI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCi0JZGV2LT5wb2xsX2NvbnRyb2xsZXIgPSBiNDRfcG9sbF9jb250cm9sbGVyOwotI2VuZGlmCi0JZGV2LT5jaGFuZ2VfbXR1ID0gYjQ0X2NoYW5nZV9tdHU7CiAJZGV2LT5pcnEgPSBzZGV2LT5pcnE7CiAJU0VUX0VUSFRPT0xfT1BTKGRldiwgJmI0NF9ldGh0b29sX29wcyk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2I0NC5oIGIvZHJpdmVycy9uZXQvYjQ0LmgKaW5kZXggN2RiMGM4NC4uZTY3ODQ5OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvYjQ0LmgKKysrIGIvZHJpdmVycy9uZXQvYjQ0LmgKQEAgLTM5NSw3ICszOTUsNyBAQAogCXUzMgkJCXJ4X3BlbmRpbmc7CiAJdTMyCQkJdHhfcGVuZGluZzsKIAl1OAkJCXBoeV9hZGRyOwotCisJdTgJCQlmb3JjZV9jb3B5YnJlYWs7CiAJc3RydWN0IG1paV9pZl9pbmZvCW1paV9pZjsKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2JueDJ4LmggYi9kcml2ZXJzL25ldC9ibngyeC5oCmluZGV4IGZkNzA1ZDEuLjZmY2NjZWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2JueDJ4LmgKKysrIGIvZHJpdmVycy9uZXQvYm54MnguaApAQCAtMjAsNiArMjAsMTEgQEAKICAqICh5b3Ugd2lsbCBuZWVkIHRvIHJlYm9vdCBhZnRlcndhcmRzKSAqLwogLyogI2RlZmluZSBCTlgyWF9TVE9QX09OX0VSUk9SICovCiAKKyNpZiBkZWZpbmVkKENPTkZJR19WTEFOXzgwMjFRKSB8fCBkZWZpbmVkKENPTkZJR19WTEFOXzgwMjFRX01PRFVMRSkKKyNkZWZpbmUgQkNNX1ZMQU4JCQkxCisjZW5kaWYKKworCiAvKiBlcnJvci9kZWJ1ZyBwcmludHMgKi8KIAogI2RlZmluZSBEUlZfTU9EVUxFX05BTUUJCSJibngyeCIKQEAgLTc4LDExICs4Myw2IEBACiAjZW5kaWYKIAogCi0jaWZkZWYgTkVUSUZfRl9IV19WTEFOX1RYCi0jZGVmaW5lIEJDTV9WTEFOCQkJMQotI2VuZGlmCi0KLQogI2RlZmluZSBVNjRfTE8oeCkJCQkodTMyKSgoKHU2NCkoeCkpICYgMHhmZmZmZmZmZikKICNkZWZpbmUgVTY0X0hJKHgpCQkJKHUzMikoKCh1NjQpKHgpKSA+PiAzMikKICNkZWZpbmUgSElMT19VNjQoaGksIGxvKQkJKCgoKHU2NCkoaGkpKSA8PCAzMikgKyAobG8pKQpAQCAtMTUwLDYgKzE1MCw5IEBACiAKICNkZWZpbmUgUEFHRVNfUEVSX1NHRV9TSElGVAkJMAogI2RlZmluZSBQQUdFU19QRVJfU0dFCQkJKDEgPDwgUEFHRVNfUEVSX1NHRV9TSElGVCkKKyNkZWZpbmUgU0dFX1BBR0VfU0laRQkJCVBBR0VfU0laRQorI2RlZmluZSBTR0VfUEFHRV9TSElGVAkJCVBBR0VfU0hJRlQKKyNkZWZpbmUgU0dFX1BBR0VfQUxJR04oYWRkcikJCVBBR0VfQUxJR04oYWRkcikKIAogI2RlZmluZSBCQ01fUlhfRVRIX1BBWUxPQURfQUxJR04JNjQKIApAQCAtNzM2LDcgKzczOSw3IEBACiAJc3RydWN0IGJueDJ4X2Zhc3RwYXRoCWZwW01BWF9DT05URVhUXTsKIAl2b2lkIF9faW9tZW0JCSpyZWd2aWV3OwogCXZvaWQgX19pb21lbQkJKmRvb3JiZWxsczsKLSNkZWZpbmUgQk5YMlhfREJfU0laRQkJKDE2KjIwNDgpCisjZGVmaW5lIEJOWDJYX0RCX1NJWkUJCSgxNipCQ01fUEFHRV9TSVpFKQogCiAJc3RydWN0IG5ldF9kZXZpY2UJKmRldjsKIAlzdHJ1Y3QgcGNpX2RldgkJKnBkZXY7CkBAIC04MDEsNiArODA0LDggQEAKICNkZWZpbmUgVFBBX0VOQUJMRV9GTEFHCQkJMHg4MAogI2RlZmluZSBOT19NQ1BfRkxBRwkJCTB4MTAwCiAjZGVmaW5lIEJQX05PTUNQKGJwKQkJCShicC0+ZmxhZ3MgJiBOT19NQ1BfRkxBRykKKyNkZWZpbmUgSFdfVkxBTl9UWF9GTEFHCQkJMHg0MDAKKyNkZWZpbmUgSFdfVkxBTl9SWF9GTEFHCQkJMHg4MDAKIAogCWludAkJCWZ1bmM7CiAjZGVmaW5lIEJQX1BPUlQoYnApCQkJKGJwLT5mdW5jICUgUE9SVF9NQVgpCkBAIC04MTEsNyArODE2LDcgQEAKIAlpbnQJCQlwbV9jYXA7CiAJaW50CQkJcGNpZV9jYXA7CiAKLQlzdHJ1Y3Qgd29ya19zdHJ1Y3QJc3BfdGFzazsKKwlzdHJ1Y3QgZGVsYXllZF93b3JrCXNwX3Rhc2s7CiAJc3RydWN0IHdvcmtfc3RydWN0CXJlc2V0X3Rhc2s7CiAKIAlzdHJ1Y3QgdGltZXJfbGlzdAl0aW1lcjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2JueDJ4X2xpbmsuYyBiL2RyaXZlcnMvbmV0L2JueDJ4X2xpbmsuYwppbmRleCA2N2RlOTRmLi5mZWZhNmFiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ibngyeF9saW5rLmMKKysrIGIvZHJpdmVycy9uZXQvYm54MnhfbGluay5jCkBAIC0zMzU5LDcgKzMzNTksNyBAQAogCXU4IHNoaWZ0ID0gOCo0OwogCXU4IGRpZ2l0OwogCWlmIChsZW4gPCAxMCkgewotCQkvKiBOZWVkIG1vcmUgdGhlbiAxMGNoYXJzIGZvciB0aGlzIGZvcm1hdCAqLworCQkvKiBOZWVkIG1vcmUgdGhhbiAxMGNoYXJzIGZvciB0aGlzIGZvcm1hdCAqLwogCQkqc3RyX3B0ciA9ICdcMCc7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2JueDJ4X21haW4uYyBiL2RyaXZlcnMvbmV0L2JueDJ4X21haW4uYwppbmRleCBlZjgxMDNiLi43YzUzMzc5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ibngyeF9tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvYm54MnhfbWFpbi5jCkBAIC0zOCw5ICszOCw3IEBACiAjaW5jbHVkZSA8bGludXgvdGltZS5oPgogI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KICNpbmNsdWRlIDxsaW51eC9taWkuaD4KLSNpZmRlZiBORVRJRl9GX0hXX1ZMQU5fVFgKLQkjaW5jbHVkZSA8bGludXgvaWZfdmxhbi5oPgotI2VuZGlmCisjaW5jbHVkZSA8bGludXgvaWZfdmxhbi5oPgogI2luY2x1ZGUgPG5ldC9pcC5oPgogI2luY2x1ZGUgPG5ldC90Y3AuaD4KICNpbmNsdWRlIDxuZXQvY2hlY2tzdW0uaD4KQEAgLTk1LDYgKzkzLDcgQEAKIG1vZHVsZV9wYXJhbSh1c2VfbXVsdGksIGludCwgMCk7CiBNT0RVTEVfUEFSTV9ERVNDKHVzZV9tdWx0aSwgInVzZSBwZXItQ1BVIHF1ZXVlcyIpOwogI2VuZGlmCitzdGF0aWMgc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKmJueDJ4X3dxOwogCiBlbnVtIGJueDJ4X2JvYXJkX3R5cGUgewogCUJDTTU3NzEwID0gMCwKQEAgLTY3MSw3ICs2NzAsOCBAQAogCQlzeW5jaHJvbml6ZV9pcnEoYnAtPnBkZXYtPmlycSk7CiAKIAkvKiBtYWtlIHN1cmUgc3BfdGFzayBpcyBub3QgcnVubmluZyAqLwotCWNhbmNlbF93b3JrX3N5bmMoJmJwLT5zcF90YXNrKTsKKwljYW5jZWxfZGVsYXllZF93b3JrKCZicC0+c3BfdGFzayk7CisJZmx1c2hfd29ya3F1ZXVlKGJueDJ4X3dxKTsKIH0KIAogLyogZmFzdCBwYXRoICovCkBAIC05NzIsNyArOTcyLDcgQEAKIAkJcmV0dXJuOwogCiAJcGNpX3VubWFwX3BhZ2UoYnAtPnBkZXYsIHBjaV91bm1hcF9hZGRyKHN3X2J1ZiwgbWFwcGluZyksCi0JCSAgICAgICBCQ01fUEFHRV9TSVpFKlBBR0VTX1BFUl9TR0UsIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCSAgICAgICBTR0VfUEFHRV9TSVpFKlBBR0VTX1BFUl9TR0UsIFBDSV9ETUFfRlJPTURFVklDRSk7CiAJX19mcmVlX3BhZ2VzKHBhZ2UsIFBBR0VTX1BFUl9TR0VfU0hJRlQpOwogCiAJc3dfYnVmLT5wYWdlID0gTlVMTDsKQEAgLTEwMDAsNyArMTAwMCw3IEBACiAJaWYgKHVubGlrZWx5KHBhZ2UgPT0gTlVMTCkpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JbWFwcGluZyA9IHBjaV9tYXBfcGFnZShicC0+cGRldiwgcGFnZSwgMCwgQkNNX1BBR0VfU0laRSpQQUdFU19QRVJfU0dFLAorCW1hcHBpbmcgPSBwY2lfbWFwX3BhZ2UoYnAtPnBkZXYsIHBhZ2UsIDAsIFNHRV9QQUdFX1NJWkUqUEFHRVNfUEVSX1NHRSwKIAkJCSAgICAgICBQQ0lfRE1BX0ZST01ERVZJQ0UpOwogCWlmICh1bmxpa2VseShkbWFfbWFwcGluZ19lcnJvcigmYnAtPnBkZXYtPmRldiwgbWFwcGluZykpKSB7CiAJCV9fZnJlZV9wYWdlcyhwYWdlLCBQQUdFU19QRVJfU0dFX1NISUZUKTsKQEAgLTEwOTYsOSArMTA5Niw5IEBACiAJCQkJICBzdHJ1Y3QgZXRoX2Zhc3RfcGF0aF9yeF9jcWUgKmZwX2NxZSkKIHsKIAlzdHJ1Y3QgYm54MnggKmJwID0gZnAtPmJwOwotCXUxNiBzZ2VfbGVuID0gQkNNX1BBR0VfQUxJR04obGUxNl90b19jcHUoZnBfY3FlLT5wa3RfbGVuKSAtCisJdTE2IHNnZV9sZW4gPSBTR0VfUEFHRV9BTElHTihsZTE2X3RvX2NwdShmcF9jcWUtPnBrdF9sZW4pIC0KIAkJCQkgICAgIGxlMTZfdG9fY3B1KGZwX2NxZS0+bGVuX29uX2JkKSkgPj4KLQkJICAgICAgQkNNX1BBR0VfU0hJRlQ7CisJCSAgICAgIFNHRV9QQUdFX1NISUZUOwogCXUxNiBsYXN0X21heCwgbGFzdF9lbGVtLCBmaXJzdF9lbGVtOwogCXUxNiBkZWx0YSA9IDA7CiAJdTE2IGk7CkBAIC0xMjAzLDIyICsxMjAzLDIyIEBACiAJCQkgICAgICAgdTE2IGNxZV9pZHgpCiB7CiAJc3RydWN0IHN3X3J4X3BhZ2UgKnJ4X3BnLCBvbGRfcnhfcGc7Ci0Jc3RydWN0IHBhZ2UgKnNnZTsKIAl1MTYgbGVuX29uX2JkID0gbGUxNl90b19jcHUoZnBfY3FlLT5sZW5fb25fYmQpOwogCXUzMiBpLCBmcmFnX2xlbiwgZnJhZ19zaXplLCBwYWdlczsKIAlpbnQgZXJyOwogCWludCBqOwogCiAJZnJhZ19zaXplID0gbGUxNl90b19jcHUoZnBfY3FlLT5wa3RfbGVuKSAtIGxlbl9vbl9iZDsKLQlwYWdlcyA9IEJDTV9QQUdFX0FMSUdOKGZyYWdfc2l6ZSkgPj4gQkNNX1BBR0VfU0hJRlQ7CisJcGFnZXMgPSBTR0VfUEFHRV9BTElHTihmcmFnX3NpemUpID4+IFNHRV9QQUdFX1NISUZUOwogCiAJLyogVGhpcyBpcyBuZWVkZWQgaW4gb3JkZXIgdG8gZW5hYmxlIGZvcndhcmRpbmcgc3VwcG9ydCAqLwogCWlmIChmcmFnX3NpemUpCi0JCXNrYl9zaGluZm8oc2tiKS0+Z3NvX3NpemUgPSBtaW4oKHUzMilCQ01fUEFHRV9TSVpFLAorCQlza2Jfc2hpbmZvKHNrYiktPmdzb19zaXplID0gbWluKCh1MzIpU0dFX1BBR0VfU0laRSwKIAkJCQkJICAgICAgIG1heChmcmFnX3NpemUsICh1MzIpbGVuX29uX2JkKSk7CiAKICNpZmRlZiBCTlgyWF9TVE9QX09OX0VSUk9SCi0JaWYgKHBhZ2VzID4gOCpQQUdFU19QRVJfU0dFKSB7CisJaWYgKHBhZ2VzID4KKwkgICAgbWluKCh1MzIpOCwgKHUzMilNQVhfU0tCX0ZSQUdTKSAqIFNHRV9QQUdFX1NJWkUgKiBQQUdFU19QRVJfU0dFKSB7CiAJCUJOWDJYX0VSUigiU0dMIGxlbmd0aCBpcyB0b28gbG9uZzogJWQuIENRRSBpbmRleCBpcyAlZFxuIiwKIAkJCSAgcGFnZXMsIGNxZV9pZHgpOwogCQlCTlgyWF9FUlIoImZwX2NxZS0+cGt0X2xlbiA9ICVkICBmcF9jcWUtPmxlbl9vbl9iZCA9ICVkXG4iLApAQCAtMTIzNCw5ICsxMjM0LDggQEAKIAogCQkvKiBGVyBnaXZlcyB0aGUgaW5kaWNlcyBvZiB0aGUgU0dFIGFzIGlmIHRoZSByaW5nIGlzIGFuIGFycmF5CiAJCSAgIChtZWFuaW5nIHRoYXQgIm5leHQiIGVsZW1lbnQgd2lsbCBjb25zdW1lIDIgaW5kaWNlcykgKi8KLQkJZnJhZ19sZW4gPSBtaW4oZnJhZ19zaXplLCAodTMyKShCQ01fUEFHRV9TSVpFKlBBR0VTX1BFUl9TR0UpKTsKKwkJZnJhZ19sZW4gPSBtaW4oZnJhZ19zaXplLCAodTMyKShTR0VfUEFHRV9TSVpFKlBBR0VTX1BFUl9TR0UpKTsKIAkJcnhfcGcgPSAmZnAtPnJ4X3BhZ2VfcmluZ1tzZ2VfaWR4XTsKLQkJc2dlID0gcnhfcGctPnBhZ2U7CiAJCW9sZF9yeF9wZyA9ICpyeF9wZzsKIAogCQkvKiBJZiB3ZSBmYWlsIHRvIGFsbG9jYXRlIGEgc3Vic3RpdHV0ZSBwYWdlLCB3ZSBzaW1wbHkgc3RvcApAQCAtMTI0OSw3ICsxMjQ4LDcgQEAKIAogCQkvKiBVbm1hcCB0aGUgcGFnZSBhcyB3ZSByIGdvaW5nIHRvIHBhc3MgaXQgdG8gdGhlIHN0YWNrICovCiAJCXBjaV91bm1hcF9wYWdlKGJwLT5wZGV2LCBwY2lfdW5tYXBfYWRkcigmb2xkX3J4X3BnLCBtYXBwaW5nKSwKLQkJCSAgICAgIEJDTV9QQUdFX1NJWkUqUEFHRVNfUEVSX1NHRSwgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJCSAgICAgIFNHRV9QQUdFX1NJWkUqUEFHRVNfUEVSX1NHRSwgUENJX0RNQV9GUk9NREVWSUNFKTsKIAogCQkvKiBBZGQgb25lIGZyYWcgYW5kIHVwZGF0ZSB0aGUgYXBwcm9wcmlhdGUgZmllbGRzIGluIHRoZSBza2IgKi8KIAkJc2tiX2ZpbGxfcGFnZV9kZXNjKHNrYiwgaiwgb2xkX3J4X3BnLnBhZ2UsIDAsIGZyYWdfbGVuKTsKQEAgLTEyODIsNiArMTI4MSwxMyBAQAogCWlmIChsaWtlbHkobmV3X3NrYikpIHsKIAkJLyogZml4IGlwIHhzdW0gYW5kIGdpdmUgaXQgdG8gdGhlIHN0YWNrICovCiAJCS8qIChubyBuZWVkIHRvIG1hcCB0aGUgbmV3IHNrYikgKi8KKyNpZmRlZiBCQ01fVkxBTgorCQlpbnQgaXNfdmxhbl9jcWUgPQorCQkJKGxlMTZfdG9fY3B1KGNxZS0+ZmFzdF9wYXRoX2NxZS5wYXJzX2ZsYWdzLmZsYWdzKSAmCisJCQkgUEFSU0lOR19GTEFHU19WTEFOKTsKKwkJaW50IGlzX25vdF9od2FjY2VsX3ZsYW5fY3FlID0KKwkJCShpc192bGFuX2NxZSAmJiAoIShicC0+ZmxhZ3MgJiBIV19WTEFOX1JYX0ZMQUcpKSk7CisjZW5kaWYKIAogCQlwcmVmZXRjaChza2IpOwogCQlwcmVmZXRjaCgoKGNoYXIgKikoc2tiKSkgKyAxMjgpOwpAQCAtMTMwNiw2ICsxMzEyLDEyIEBACiAJCQlzdHJ1Y3QgaXBoZHIgKmlwaDsKIAogCQkJaXBoID0gKHN0cnVjdCBpcGhkciAqKXNrYi0+ZGF0YTsKKyNpZmRlZiBCQ01fVkxBTgorCQkJLyogSWYgdGhlcmUgaXMgbm8gUnggVkxBTiBvZmZsb2FkaW5nIC0KKwkJCSAgIHRha2UgVkxBTiB0YWcgaW50byBhbiBhY2NvdW50ICovCisJCQlpZiAodW5saWtlbHkoaXNfbm90X2h3YWNjZWxfdmxhbl9jcWUpKQorCQkJCWlwaCA9IChzdHJ1Y3QgaXBoZHIgKikoKHU4ICopaXBoICsgVkxBTl9ITEVOKTsKKyNlbmRpZgogCQkJaXBoLT5jaGVjayA9IDA7CiAJCQlpcGgtPmNoZWNrID0gaXBfZmFzdF9jc3VtKCh1OCAqKWlwaCwgaXBoLT5paGwpOwogCQl9CkBAIC0xMzEzLDkgKzEzMjUsOCBAQAogCQlpZiAoIWJueDJ4X2ZpbGxfZnJhZ19za2IoYnAsIGZwLCBza2IsCiAJCQkJCSAmY3FlLT5mYXN0X3BhdGhfY3FlLCBjcWVfaWR4KSkgewogI2lmZGVmIEJDTV9WTEFOCi0JCQlpZiAoKGJwLT52bGdycCAhPSBOVUxMKSAmJgotCQkJICAgIChsZTE2X3RvX2NwdShjcWUtPmZhc3RfcGF0aF9jcWUucGFyc19mbGFncy5mbGFncykgJgotCQkJICAgICBQQVJTSU5HX0ZMQUdTX1ZMQU4pKQorCQkJaWYgKChicC0+dmxncnAgIT0gTlVMTCkgJiYgaXNfdmxhbl9jcWUgJiYKKwkJCSAgICAoIWlzX25vdF9od2FjY2VsX3ZsYW5fY3FlKSkKIAkJCQl2bGFuX2h3YWNjZWxfcmVjZWl2ZV9za2Ioc2tiLCBicC0+dmxncnAsCiAJCQkJCQlsZTE2X3RvX2NwdShjcWUtPmZhc3RfcGF0aF9jcWUuCiAJCQkJCQkJICAgIHZsYW5fdGFnKSk7CkBAIC0xMzU1LDExICsxMzY2LDIzIEBACiAJcnhfcHJvZHMuY3FlX3Byb2QgPSByeF9jb21wX3Byb2Q7CiAJcnhfcHJvZHMuc2dlX3Byb2QgPSByeF9zZ2VfcHJvZDsKIAorCS8qCisJICogTWFrZSBzdXJlIHRoYXQgdGhlIEJEIGFuZCBTR0UgZGF0YSBpcyB1cGRhdGVkIGJlZm9yZSB1cGRhdGluZyB0aGUKKwkgKiBwcm9kdWNlcnMgc2luY2UgRlcgbWlnaHQgcmVhZCB0aGUgQkQvU0dFIHJpZ2h0IGFmdGVyIHRoZSBwcm9kdWNlcgorCSAqIGlzIHVwZGF0ZWQuCisJICogVGhpcyBpcyBvbmx5IGFwcGxpY2FibGUgZm9yIHdlYWstb3JkZXJlZCBtZW1vcnkgbW9kZWwgYXJjaHMgc3VjaAorCSAqIGFzIElBLTY0LiBUaGUgZm9sbG93aW5nIGJhcnJpZXIgaXMgYWxzbyBtYW5kYXRvcnkgc2luY2UgRlcgd2lsbAorCSAqIGFzc3VtZXMgQkRzIG11c3QgaGF2ZSBidWZmZXJzLgorCSAqLworCXdtYigpOworCiAJZm9yIChpID0gMDsgaSA8IHNpemVvZihzdHJ1Y3QgdHN0b3JtX2V0aF9yeF9wcm9kdWNlcnMpLzQ7IGkrKykKIAkJUkVHX1dSKGJwLCBCQVJfVFNUUk9STV9JTlRNRU0gKwogCQkgICAgICAgVFNUT1JNX1JYX1BST0RTX09GRlNFVChCUF9QT1JUKGJwKSwgRlBfQ0xfSUQoZnApKSArIGkqNCwKIAkJICAgICAgICgodTMyICopJnJ4X3Byb2RzKVtpXSk7CiAKKwltbWlvd2IoKTsgLyoga2VlcCBwcm9kIHVwZGF0ZXMgb3JkZXJlZCAqLworCiAJRFAoTkVUSUZfTVNHX1JYX1NUQVRVUywKIAkgICAiV3JvdGU6IGJkX3Byb2QgJXUgIGNxZV9wcm9kICV1ICBzZ2VfcHJvZCAldVxuIiwKIAkgICBiZF9wcm9kLCByeF9jb21wX3Byb2QsIHJ4X3NnZV9wcm9kKTsKQEAgLTE0MTUsNyArMTQzOCw3IEBACiAJCURQKE5FVElGX01TR19SWF9TVEFUVVMsICJDUUUgdHlwZSAleCAgZXJyICV4ICBzdGF0dXMgJXgiCiAJCSAgICIgIHF1ZXVlICV4ICB2bGFuICV4ICBsZW4gJXVcbiIsIENRRV9UWVBFKGNxZV9mcF9mbGFncyksCiAJCSAgIGNxZV9mcF9mbGFncywgY3FlLT5mYXN0X3BhdGhfY3FlLnN0YXR1c19mbGFncywKLQkJICAgY3FlLT5mYXN0X3BhdGhfY3FlLnJzc19oYXNoX3Jlc3VsdCwKKwkJICAgbGUzMl90b19jcHUoY3FlLT5mYXN0X3BhdGhfY3FlLnJzc19oYXNoX3Jlc3VsdCksCiAJCSAgIGxlMTZfdG9fY3B1KGNxZS0+ZmFzdF9wYXRoX2NxZS52bGFuX3RhZyksCiAJCSAgIGxlMTZfdG9fY3B1KGNxZS0+ZmFzdF9wYXRoX2NxZS5wa3RfbGVuKSk7CiAKQEAgLTE1NDcsNyArMTU3MCw3IEBACiAJCX0KIAogI2lmZGVmIEJDTV9WTEFOCi0JCWlmICgoYnAtPnZsZ3JwICE9IE5VTEwpICYmCisJCWlmICgoYnAtPnZsZ3JwICE9IE5VTEwpICYmIChicC0+ZmxhZ3MgJiBIV19WTEFOX1JYX0ZMQUcpICYmCiAJCSAgICAobGUxNl90b19jcHUoY3FlLT5mYXN0X3BhdGhfY3FlLnBhcnNfZmxhZ3MuZmxhZ3MpICYKIAkJICAgICBQQVJTSU5HX0ZMQUdTX1ZMQU4pKQogCQkJdmxhbl9od2FjY2VsX3JlY2VpdmVfc2tiKHNrYiwgYnAtPnZsZ3JwLApAQCAtMTU4MCw3ICsxNjAzLDYgQEAKIAkvKiBVcGRhdGUgcHJvZHVjZXJzICovCiAJYm54MnhfdXBkYXRlX3J4X3Byb2QoYnAsIGZwLCBiZF9wcm9kX2Z3LCBzd19jb21wX3Byb2QsCiAJCQkgICAgIGZwLT5yeF9zZ2VfcHJvZCk7Ci0JbW1pb3diKCk7IC8qIGtlZXAgcHJvZCB1cGRhdGVzIG9yZGVyZWQgKi8KIAogCWZwLT5yeF9wa3QgKz0gcnhfcGt0OwogCWZwLT5yeF9jYWxscysrOwpAQCAtMTY2MCw3ICsxNjgyLDcgQEAKIAogCiAJaWYgKHVubGlrZWx5KHN0YXR1cyAmIDB4MSkpIHsKLQkJc2NoZWR1bGVfd29yaygmYnAtPnNwX3Rhc2spOworCQlxdWV1ZV9kZWxheWVkX3dvcmsoYm54Mnhfd3EsICZicC0+c3BfdGFzaywgMCk7CiAKIAkJc3RhdHVzICY9IH4weDE7CiAJCWlmICghc3RhdHVzKQpAQCAtMTg4Nyw3ICsxOTA5LDggQEAKIAogc3RhdGljIHZvaWQgYm54MnhfY2FsY19mY19hZHYoc3RydWN0IGJueDJ4ICpicCkKIHsKLQlzd2l0Y2ggKGJwLT5saW5rX3ZhcnMuaWVlZV9mYykgeworCXN3aXRjaCAoYnAtPmxpbmtfdmFycy5pZWVlX2ZjICYKKwkJTURJT19DT01CT19JRUVFMF9BVVRPX05FR19BRFZfUEFVU0VfTUFTSykgewogCWNhc2UgTURJT19DT01CT19JRUVFMF9BVVRPX05FR19BRFZfUEFVU0VfTk9ORToKIAkJYnAtPnBvcnQuYWR2ZXJ0aXNpbmcgJj0gfihBRFZFUlRJU0VEX0FzeW1fUGF1c2UgfAogCQkJCQkgIEFEVkVSVElTRURfUGF1c2UpOwpAQCAtMTk1NywxMCArMTk4MCwxMSBAQAogCQlyYyA9IGJueDJ4X3BoeV9pbml0KCZicC0+bGlua19wYXJhbXMsICZicC0+bGlua192YXJzKTsKIAkJYm54MnhfcmVsZWFzZV9waHlfbG9jayhicCk7CiAKKwkJYm54MnhfY2FsY19mY19hZHYoYnApOworCiAJCWlmIChicC0+bGlua192YXJzLmxpbmtfdXApCiAJCQlibngyeF9saW5rX3JlcG9ydChicCk7CiAKLQkJYm54MnhfY2FsY19mY19hZHYoYnApOwogCiAJCXJldHVybiByYzsKIAl9CkBAIC0yMjIwLDkgKzIyNDQsNyBAQAogCS8qIE1ha2Ugc3VyZSB0aGF0IHdlIGFyZSBzeW5jZWQgd2l0aCB0aGUgY3VycmVudCBzdGF0aXN0aWNzICovCiAJYm54Mnhfc3RhdHNfaGFuZGxlKGJwLCBTVEFUU19FVkVOVF9TVE9QKTsKIAotCWJueDJ4X2FjcXVpcmVfcGh5X2xvY2soYnApOwogCWJueDJ4X2xpbmtfdXBkYXRlKCZicC0+bGlua19wYXJhbXMsICZicC0+bGlua192YXJzKTsKLQlibngyeF9yZWxlYXNlX3BoeV9sb2NrKGJwKTsKIAogCWlmIChicC0+bGlua192YXJzLmxpbmtfdXApIHsKIApAQCAtMjQ3MSw2ICsyNDkzLDggQEAKIAlpZiAoYXNzZXJ0ZWQgJiBBVFROX0hBUkRfV0lSRURfTUFTSykgewogCQlpZiAoYXNzZXJ0ZWQgJiBBVFROX05JR19GT1JfRlVOQykgewogCisJCQlibngyeF9hY3F1aXJlX3BoeV9sb2NrKGJwKTsKKwogCQkJLyogc2F2ZSBuaWcgaW50ZXJydXB0IG1hc2sgKi8KIAkJCWJwLT5uaWdfbWFzayA9IFJFR19SRChicCwgbmlnX2ludF9tYXNrX2FkZHIpOwogCQkJUkVHX1dSKGJwLCBuaWdfaW50X21hc2tfYWRkciwgMCk7CkBAIC0yNTI2LDggKzI1NTAsMTAgQEAKIAlSRUdfV1IoYnAsIGhjX2FkZHIsIGFzc2VydGVkKTsKIAogCS8qIG5vdyBzZXQgYmFjayB0aGUgbWFzayAqLwotCWlmIChhc3NlcnRlZCAmIEFUVE5fTklHX0ZPUl9GVU5DKQorCWlmIChhc3NlcnRlZCAmIEFUVE5fTklHX0ZPUl9GVU5DKSB7CiAJCVJFR19XUihicCwgbmlnX2ludF9tYXNrX2FkZHIsIGJwLT5uaWdfbWFzayk7CisJCWJueDJ4X3JlbGVhc2VfcGh5X2xvY2soYnApOworCX0KIH0KIAogc3RhdGljIGlubGluZSB2b2lkIGJueDJ4X2F0dG5faW50X2RlYXNzZXJ0ZWQwKHN0cnVjdCBibngyeCAqYnAsIHUzMiBhdHRuKQpAQCAtMjc5NSw4ICsyODIxLDEwIEBACiBzdGF0aWMgdm9pZCBibngyeF9hdHRuX2ludChzdHJ1Y3QgYm54MnggKmJwKQogewogCS8qIHJlYWQgbG9jYWwgY29weSBvZiBiaXRzICovCi0JdTMyIGF0dG5fYml0cyA9IGJwLT5kZWZfc3RhdHVzX2Jsay0+YXR0ZW5fc3RhdHVzX2Jsb2NrLmF0dG5fYml0czsKLQl1MzIgYXR0bl9hY2sgPSBicC0+ZGVmX3N0YXR1c19ibGstPmF0dGVuX3N0YXR1c19ibG9jay5hdHRuX2JpdHNfYWNrOworCXUzMiBhdHRuX2JpdHMgPSBsZTMyX3RvX2NwdShicC0+ZGVmX3N0YXR1c19ibGstPmF0dGVuX3N0YXR1c19ibG9jay4KKwkJCQkJCQkJYXR0bl9iaXRzKTsKKwl1MzIgYXR0bl9hY2sgPSBsZTMyX3RvX2NwdShicC0+ZGVmX3N0YXR1c19ibGstPmF0dGVuX3N0YXR1c19ibG9jay4KKwkJCQkJCQkJYXR0bl9iaXRzX2Fjayk7CiAJdTMyIGF0dG5fc3RhdGUgPSBicC0+YXR0bl9zdGF0ZTsKIAogCS8qIGxvb2sgZm9yIGNoYW5nZWQgYml0cyAqLwpAQCAtMjgyMCw3ICsyODQ4LDcgQEAKIAogc3RhdGljIHZvaWQgYm54Mnhfc3BfdGFzayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7Ci0Jc3RydWN0IGJueDJ4ICpicCA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgYm54MngsIHNwX3Rhc2spOworCXN0cnVjdCBibngyeCAqYnAgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGJueDJ4LCBzcF90YXNrLndvcmspOwogCXUxNiBzdGF0dXM7CiAKIApAQCAtMjg0NCw3ICsyODcyLDcgQEAKIAlpZiAoc3RhdHVzICYgMHgyKQogCQlicC0+c3RhdHNfcGVuZGluZyA9IDA7CiAKLQlibngyeF9hY2tfc2IoYnAsIERFRl9TQl9JRCwgQVRURU5USU9OX0lELCBicC0+ZGVmX2F0dF9pZHgsCisJYm54MnhfYWNrX3NiKGJwLCBERUZfU0JfSUQsIEFUVEVOVElPTl9JRCwgbGUxNl90b19jcHUoYnAtPmRlZl9hdHRfaWR4KSwKIAkJICAgICBJR1VfSU5UX05PUCwgMSk7CiAJYm54MnhfYWNrX3NiKGJwLCBERUZfU0JfSUQsIFVTVE9STV9JRCwgbGUxNl90b19jcHUoYnAtPmRlZl91X2lkeCksCiAJCSAgICAgSUdVX0lOVF9OT1AsIDEpOwpAQCAtMjg3NSw3ICsyOTAzLDcgQEAKIAkJcmV0dXJuIElSUV9IQU5ETEVEOwogI2VuZGlmCiAKLQlzY2hlZHVsZV93b3JrKCZicC0+c3BfdGFzayk7CisJcXVldWVfZGVsYXllZF93b3JrKGJueDJ4X3dxLCAmYnAtPnNwX3Rhc2ssIDApOwogCiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQpAQCAtMjg5Miw3ICsyOTIwLDcgQEAKICNkZWZpbmUgQUREXzY0KHNfaGksIGFfaGksIHNfbG8sIGFfbG8pIFwKIAlkbyB7IFwKIAkJc19sbyArPSBhX2xvOyBcCi0JCXNfaGkgKz0gYV9oaSArIChzX2xvIDwgYV9sbykgPyAxIDogMDsgXAorCQlzX2hpICs9IGFfaGkgKyAoKHNfbG8gPCBhX2xvKSA/IDEgOiAwKTsgXAogCX0gd2hpbGUgKDApCiAKIC8qIGRpZmZlcmVuY2UgPSBtaW51ZW5kIC0gc3VidHJhaGVuZCAqLwpAQCAtNDQ5Niw3ICs0NTI0LDcgQEAKIAogc3RhdGljIHZvaWQgYm54MnhfaW5pdF9pbmRfdGFibGUoc3RydWN0IGJueDJ4ICpicCkKIHsKLQlpbnQgcG9ydCA9IEJQX1BPUlQoYnApOworCWludCBmdW5jID0gQlBfRlVOQyhicCk7CiAJaW50IGk7CiAKIAlpZiAoIWlzX211bHRpKGJwKSkKQEAgLTQ1MDUsMTAgKzQ1MzMsOCBAQAogCURQKE5FVElGX01TR19JRlVQLCAiSW5pdGlhbGl6aW5nIGluZGlyZWN0aW9uIHRhYmxlXG4iKTsKIAlmb3IgKGkgPSAwOyBpIDwgVFNUT1JNX0lORElSRUNUSU9OX1RBQkxFX1NJWkU7IGkrKykKIAkJUkVHX1dSOChicCwgQkFSX1RTVFJPUk1fSU5UTUVNICsKLQkJCVRTVE9STV9JTkRJUkVDVElPTl9UQUJMRV9PRkZTRVQocG9ydCkgKyBpLAotCQkJaSAlIGJwLT5udW1fcXVldWVzKTsKLQotCVJFR19XUihicCwgUFJTX1JFR19BX1BSU1VfMjAsIDB4Zik7CisJCQlUU1RPUk1fSU5ESVJFQ1RJT05fVEFCTEVfT0ZGU0VUKGZ1bmMpICsgaSwKKwkJCUJQX0NMX0lEKGJwKSArIChpICUgYnAtPm51bV9xdWV1ZXMpKTsKIH0KIAogc3RhdGljIHZvaWQgYm54Mnhfc2V0X2NsaWVudF9jb25maWcoc3RydWN0IGJueDJ4ICpicCkKQEAgLTQ1MTcsMTIgKzQ1NDMsMTIgQEAKIAlpbnQgcG9ydCA9IEJQX1BPUlQoYnApOwogCWludCBpOwogCi0JdHN0b3JtX2NsaWVudC5tdHUgPSBicC0+ZGV2LT5tdHUgKyBFVEhfT1ZSRUhFQUQ7CisJdHN0b3JtX2NsaWVudC5tdHUgPSBicC0+ZGV2LT5tdHU7CiAJdHN0b3JtX2NsaWVudC5zdGF0aXN0aWNzX2NvdW50ZXJfaWQgPSBCUF9DTF9JRChicCk7CiAJdHN0b3JtX2NsaWVudC5jb25maWdfZmxhZ3MgPQogCQkJCVRTVE9STV9FVEhfQ0xJRU5UX0NPTkZJR19TVEFUU0lUSUNTX0VOQUJMRTsKICNpZmRlZiBCQ01fVkxBTgotCWlmIChicC0+cnhfbW9kZSAmJiBicC0+dmxncnApIHsKKwlpZiAoYnAtPnJ4X21vZGUgJiYgYnAtPnZsZ3JwICYmIChicC0+ZmxhZ3MgJiBIV19WTEFOX1JYX0ZMQUcpKSB7CiAJCXRzdG9ybV9jbGllbnQuY29uZmlnX2ZsYWdzIHw9CiAJCQkJVFNUT1JNX0VUSF9DTElFTlRfQ09ORklHX1ZMQU5fUkVNT1ZBTF9FTkFCTEU7CiAJCURQKE5FVElGX01TR19JRlVQLCAidmxhbiByZW1vdmFsIGVuYWJsZWRcbiIpOwpAQCAtNDUzMSw3ICs0NTU3LDcgQEAKIAogCWlmIChicC0+ZmxhZ3MgJiBUUEFfRU5BQkxFX0ZMQUcpIHsKIAkJdHN0b3JtX2NsaWVudC5tYXhfc2dlc19mb3JfcGFja2V0ID0KLQkJCUJDTV9QQUdFX0FMSUdOKHRzdG9ybV9jbGllbnQubXR1KSA+PiBCQ01fUEFHRV9TSElGVDsKKwkJCVNHRV9QQUdFX0FMSUdOKHRzdG9ybV9jbGllbnQubXR1KSA+PiBTR0VfUEFHRV9TSElGVDsKIAkJdHN0b3JtX2NsaWVudC5tYXhfc2dlc19mb3JfcGFja2V0ID0KIAkJCSgodHN0b3JtX2NsaWVudC5tYXhfc2dlc19mb3JfcGFja2V0ICsKIAkJCSAgUEFHRVNfUEVSX1NHRSAtIDEpICYgKH4oUEFHRVNfUEVSX1NHRSAtIDEpKSkgPj4KQEAgLTQ3MTQsMTAgKzQ3NDAsMTEgQEAKIAkJCSBicC0+ZTFob3YpOwogCX0KIAotCS8qIEluaXQgQ1EgcmluZyBtYXBwaW5nIGFuZCBhZ2dyZWdhdGlvbiBzaXplICovCi0JbWF4X2FnZ19zaXplID0gbWluKCh1MzIpKGJwLT5yeF9idWZfc2l6ZSArCi0JCQkJIDgqQkNNX1BBR0VfU0laRSpQQUdFU19QRVJfU0dFKSwKLQkJCSAgICh1MzIpMHhmZmZmKTsKKwkvKiBJbml0IENRIHJpbmcgbWFwcGluZyBhbmQgYWdncmVnYXRpb24gc2l6ZSwgdGhlIEZXIGxpbWl0IGlzIDggZnJhZ3MgKi8KKwltYXhfYWdnX3NpemUgPQorCQltaW4oKHUzMikobWluKCh1MzIpOCwgKHUzMilNQVhfU0tCX0ZSQUdTKSAqCisJCQkgIFNHRV9QQUdFX1NJWkUgKiBQQUdFU19QRVJfU0dFKSwKKwkJICAgICh1MzIpMHhmZmZmKTsKIAlmb3JfZWFjaF9xdWV1ZShicCwgaSkgewogCQlzdHJ1Y3QgYm54MnhfZmFzdHBhdGggKmZwID0gJmJwLT5mcFtpXTsKIApAQCAtNDc4NSw2ICs0ODEyLDE1IEBACiAJYm54MnhfaW5pdF9jb250ZXh0KGJwKTsKIAlibngyeF9pbml0X2ludGVybmFsKGJwLCBsb2FkX2NvZGUpOwogCWJueDJ4X2luaXRfaW5kX3RhYmxlKGJwKTsKKwlibngyeF9zdGF0c19pbml0KGJwKTsKKworCS8qIEF0IHRoaXMgcG9pbnQsIHdlIGFyZSByZWFkeSBmb3IgaW50ZXJydXB0cyAqLworCWF0b21pY19zZXQoJmJwLT5pbnRyX3NlbSwgMCk7CisKKwkvKiBmbHVzaCBhbGwgYmVmb3JlIGVuYWJsaW5nIGludGVycnVwdHMgKi8KKwltYigpOworCW1taW93YigpOworCiAJYm54MnhfaW50X2VuYWJsZShicCk7CiB9CiAKQEAgLTUxMzQsNyArNTE3MCw2IEBACiAJUkVHX1dSKGJwLCBQWFAyX1JFR19SUV9TUkNfRU5ESUFOX00sIDEpOwogCVJFR19XUihicCwgUFhQMl9SRUdfUlFfQ0RVX0VORElBTl9NLCAxKTsKIAlSRUdfV1IoYnAsIFBYUDJfUkVHX1JRX0RCR19FTkRJQU5fTSwgMSk7Ci0JUkVHX1dSKGJwLCBQWFAyX1JFR19SUV9IQ19FTkRJQU5fTSwgMSk7CiAKIC8qCVJFR19XUihicCwgUFhQMl9SRUdfUkRfUEJGX1NXQVBfTU9ERSwgMSk7ICovCiAJUkVHX1dSKGJwLCBQWFAyX1JFR19SRF9RTV9TV0FQX01PREUsIDEpOwpAQCAtNTIxMiw2ICs1MjQ3LDcgQEAKIAl9CiAKIAlibngyeF9pbml0X2Jsb2NrKGJwLCBQUlNfQ09NTU9OX1NUQVJULCBQUlNfQ09NTU9OX0VORCk7CisJUkVHX1dSKGJwLCBQUlNfUkVHX0FfUFJTVV8yMCwgMHhmKTsKIAkvKiBzZXQgTklDIG1vZGUgKi8KIAlSRUdfV1IoYnAsIFBSU19SRUdfTklDX01PREUsIDEpOwogCWlmIChDSElQX0lTX0UxSChicCkpCkBAIC02MzkzLDE3ICs2NDI5LDggQEAKIAkJfQogCX0KIAotCWJueDJ4X3N0YXRzX2luaXQoYnApOwotCiAJYnAtPnN0YXRlID0gQk5YMlhfU1RBVEVfT1BFTklOR19XQUlUNF9QT1JUOwogCi0JLyogRW5hYmxlIFJ4IGludGVycnVwdCBoYW5kbGluZyBiZWZvcmUgc2VuZGluZyB0aGUgcmFtcm9kCi0JICAgYXMgaXQncyBjb21wbGV0ZWQgb24gUnggRlAgcXVldWUgKi8KLQlibngyeF9uYXBpX2VuYWJsZShicCk7Ci0KLQkvKiBFbmFibGUgaW50ZXJydXB0IGhhbmRsaW5nICovCi0JYXRvbWljX3NldCgmYnAtPmludHJfc2VtLCAwKTsKLQogCXJjID0gYm54Mnhfc2V0dXBfbGVhZGluZyhicCk7CiAJaWYgKHJjKSB7CiAJCUJOWDJYX0VSUigiU2V0dXAgbGVhZGluZyBmYWlsZWQhXG4iKTsKQEAgLTc1MDEsNyArNzUyOCw3IEBACiAKIAltdXRleF9pbml0KCZicC0+cG9ydC5waHlfbXV0ZXgpOwogCi0JSU5JVF9XT1JLKCZicC0+c3BfdGFzaywgYm54Mnhfc3BfdGFzayk7CisJSU5JVF9ERUxBWUVEX1dPUksoJmJwLT5zcF90YXNrLCBibngyeF9zcF90YXNrKTsKIAlJTklUX1dPUksoJmJwLT5yZXNldF90YXNrLCBibngyeF9yZXNldF90YXNrKTsKIAogCXJjID0gYm54MnhfZ2V0X2h3aW5mbyhicCk7CkBAIC04MjQzLDYgKzgyNzAsOSBAQAogCXN0cnVjdCBibngyeCAqYnAgPSBuZXRkZXZfcHJpdihkZXYpOwogCWludCByYzsKIAorCWlmICghbmV0aWZfcnVubmluZyhkZXYpKQorCQlyZXR1cm4gLUVBR0FJTjsKKwogCURQKEJOWDJYX01TR19OVk0sICJldGh0b29sX2VlcHJvbTogY21kICVkXG4iCiAJICAgRFBfTEVWRUwgIiAgbWFnaWMgMHgleCAgb2Zmc2V0IDB4JXggKCVkKSAgbGVuIDB4JXggKCVkKVxuIiwKIAkgICBlZXByb20tPmNtZCwgZWVwcm9tLT5tYWdpYywgZWVwcm9tLT5vZmZzZXQsIGVlcHJvbS0+b2Zmc2V0LApAQCAtODcyNCw2ICs4NzU0LDggQEAKIAl0eF9iZC0+Z2VuZXJhbF9kYXRhID0gKChVTklDQVNUX0FERFJFU1MgPDwKIAkJCQlFVEhfVFhfQkRfRVRIX0FERFJfVFlQRV9TSElGVCkgfCAxKTsKIAorCXdtYigpOworCiAJZnAtPmh3X3R4X3Byb2RzLT5iZHNfcHJvZCA9CiAJCWNwdV90b19sZTE2KGxlMTZfdG9fY3B1KGZwLT5od190eF9wcm9kcy0+YmRzX3Byb2QpICsgMSk7CiAJbWIoKTsgLyogRlcgcmVzdHJpY3Rpb246IG11c3Qgbm90IHJlb3JkZXIgd3JpdGluZyBuYmQgYW5kIHBhY2tldHMgKi8KQEAgLTg3NzUsNyArODgwNyw2IEBACiAJLyogVXBkYXRlIHByb2R1Y2VycyAqLwogCWJueDJ4X3VwZGF0ZV9yeF9wcm9kKGJwLCBmcCwgZnAtPnJ4X2JkX3Byb2QsIGZwLT5yeF9jb21wX3Byb2QsCiAJCQkgICAgIGZwLT5yeF9zZ2VfcHJvZCk7Ci0JbW1pb3diKCk7IC8qIGtlZXAgcHJvZCB1cGRhdGVzIG9yZGVyZWQgKi8KIAogdGVzdF9sb29wYmFja19leGl0OgogCWJwLT5saW5rX3BhcmFtcy5sb29wYmFja19tb2RlID0gTE9PUEJBQ0tfTk9ORTsKQEAgLTk1NDYsMTEgKzk1NzcsMTQgQEAKIAkgICAic2VuZGluZyBwa3QgJXUgQCVwICBuZXh0X2lkeCAldSAgYmQgJXUgQCVwXG4iLAogCSAgIHBrdF9wcm9kLCB0eF9idWYsIGZwLT50eF9wa3RfcHJvZCwgYmRfcHJvZCwgdHhfYmQpOwogCi0JaWYgKChicC0+dmxncnAgIT0gTlVMTCkgJiYgdmxhbl90eF90YWdfcHJlc2VudChza2IpKSB7CisjaWZkZWYgQkNNX1ZMQU4KKwlpZiAoKGJwLT52bGdycCAhPSBOVUxMKSAmJiB2bGFuX3R4X3RhZ19wcmVzZW50KHNrYikgJiYKKwkgICAgKGJwLT5mbGFncyAmIEhXX1ZMQU5fVFhfRkxBRykpIHsKIAkJdHhfYmQtPnZsYW4gPSBjcHVfdG9fbGUxNih2bGFuX3R4X3RhZ19nZXQoc2tiKSk7CiAJCXR4X2JkLT5iZF9mbGFncy5hc19iaXRmaWVsZCB8PSBFVEhfVFhfQkRfRkxBR1NfVkxBTl9UQUc7CiAJCXZsYW5fb2ZmICs9IDQ7CiAJfSBlbHNlCisjZW5kaWYKIAkJdHhfYmQtPnZsYW4gPSBjcHVfdG9fbGUxNihwa3RfcHJvZCk7CiAKIAlpZiAoeG1pdF90eXBlKSB7CkBAIC05NzAyLDYgKzk3MzYsMTUgQEAKIAogCURQKE5FVElGX01TR19UWF9RVUVVRUQsICJkb29yYmVsbDogbmJkICVkICBiZCAldVxuIiwgbmJkLCBiZF9wcm9kKTsKIAorCS8qCisJICogTWFrZSBzdXJlIHRoYXQgdGhlIEJEIGRhdGEgaXMgdXBkYXRlZCBiZWZvcmUgdXBkYXRpbmcgdGhlIHByb2R1Y2VyCisJICogc2luY2UgRlcgbWlnaHQgcmVhZCB0aGUgQkQgcmlnaHQgYWZ0ZXIgdGhlIHByb2R1Y2VyIGlzIHVwZGF0ZWQuCisJICogVGhpcyBpcyBvbmx5IGFwcGxpY2FibGUgZm9yIHdlYWstb3JkZXJlZCBtZW1vcnkgbW9kZWwgYXJjaHMgc3VjaAorCSAqIGFzIElBLTY0LiBUaGUgZm9sbG93aW5nIGJhcnJpZXIgaXMgYWxzbyBtYW5kYXRvcnkgc2luY2UgRlcgd2lsbAorCSAqIGFzc3VtZXMgcGFja2V0cyBtdXN0IGhhdmUgQkRzLgorCSAqLworCXdtYigpOworCiAJZnAtPmh3X3R4X3Byb2RzLT5iZHNfcHJvZCA9CiAJCWNwdV90b19sZTE2KGxlMTZfdG9fY3B1KGZwLT5od190eF9wcm9kcy0+YmRzX3Byb2QpICsgbmJkKTsKIAltYigpOyAvKiBGVyByZXN0cmljdGlvbjogbXVzdCBub3QgcmVvcmRlciB3cml0aW5nIG5iZCBhbmQgcGFja2V0cyAqLwpAQCAtOTcxNSw2ICs5NzU4LDkgQEAKIAlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKIAogCWlmICh1bmxpa2VseShibngyeF90eF9hdmFpbChmcCkgPCBNQVhfU0tCX0ZSQUdTICsgMykpIHsKKwkJLyogV2Ugd2FudCBibngyeF90eF9pbnQgdG8gInNlZSIgdGhlIHVwZGF0ZWQgdHhfYmRfcHJvZAorCQkgICBpZiB3ZSBwdXQgVHggaW50byBYT0ZGIHN0YXRlLiAqLworCQlzbXBfbWIoKTsKIAkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOwogCQlicC0+ZXRoX3N0YXRzLmRyaXZlcl94b2ZmKys7CiAJCWlmIChibngyeF90eF9hdmFpbChmcCkgPj0gTUFYX1NLQl9GUkFHUyArIDMpCkBAIC05OTg0LDYgKzEwMDMwLDE2IEBACiAJc3RydWN0IGJueDJ4ICpicCA9IG5ldGRldl9wcml2KGRldik7CiAKIAlicC0+dmxncnAgPSB2bGdycDsKKworCS8qIFNldCBmbGFncyBhY2NvcmRpbmcgdG8gdGhlIHJlcXVpcmVkIGNhcGFiaWxpdGllcyAqLworCWJwLT5mbGFncyAmPSB+KEhXX1ZMQU5fUlhfRkxBRyB8IEhXX1ZMQU5fVFhfRkxBRyk7CisKKwlpZiAoZGV2LT5mZWF0dXJlcyAmIE5FVElGX0ZfSFdfVkxBTl9UWCkKKwkJYnAtPmZsYWdzIHw9IEhXX1ZMQU5fVFhfRkxBRzsKKworCWlmIChkZXYtPmZlYXR1cmVzICYgTkVUSUZfRl9IV19WTEFOX1JYKQorCQlicC0+ZmxhZ3MgfD0gSFdfVkxBTl9SWF9GTEFHOworCiAJaWYgKG5ldGlmX3J1bm5pbmcoZGV2KSkKIAkJYm54Mnhfc2V0X2NsaWVudF9jb25maWcoYnApOwogfQpAQCAtMTAxNDAsNiArMTAxOTYsNyBAQAogCQlkZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfSElHSERNQTsKICNpZmRlZiBCQ01fVkxBTgogCWRldi0+ZmVhdHVyZXMgfD0gKE5FVElGX0ZfSFdfVkxBTl9UWCB8IE5FVElGX0ZfSFdfVkxBTl9SWCk7CisJYnAtPmZsYWdzIHw9IChIV19WTEFOX1JYX0ZMQUcgfCBIV19WTEFOX1RYX0ZMQUcpOwogI2VuZGlmCiAJZGV2LT5mZWF0dXJlcyB8PSAoTkVUSUZfRl9UU08gfCBORVRJRl9GX1RTT19FQ04pOwogCWRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9UU082OwpAQCAtMTA1MTYsMTIgKzEwNTczLDIwIEBACiAKIHN0YXRpYyBpbnQgX19pbml0IGJueDJ4X2luaXQodm9pZCkKIHsKKwlibngyeF93cSA9IGNyZWF0ZV9zaW5nbGV0aHJlYWRfd29ya3F1ZXVlKCJibngyeCIpOworCWlmIChibngyeF93cSA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIkNhbm5vdCBjcmVhdGUgd29ya3F1ZXVlXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCiAJcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJmJueDJ4X3BjaV9kcml2ZXIpOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgYm54MnhfY2xlYW51cCh2b2lkKQogewogCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmYm54MnhfcGNpX2RyaXZlcik7CisKKwlkZXN0cm95X3dvcmtxdWV1ZShibngyeF93cSk7CiB9CiAKIG1vZHVsZV9pbml0KGJueDJ4X2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYm9uZGluZy9ib25kX21haW4uYyBiL2RyaXZlcnMvbmV0L2JvbmRpbmcvYm9uZF9tYWluLmMKaW5kZXggNDYwYzJjYS4uOWZiMzg4MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvYm9uZGluZy9ib25kX21haW4uYworKysgYi9kcml2ZXJzL25ldC9ib25kaW5nL2JvbmRfbWFpbi5jCkBAIC00MTQ4LDcgKzQxNDgsNyBAQAogCiAJYm9uZF9mb3JfZWFjaF9zbGF2ZShib25kLCBzbGF2ZSwgaSkgewogCQlwcl9kZWJ1ZygicyAlcCBzLT5wICVwIGNfbSAlcFxuIiwgc2xhdmUsCi0JCQlzbGF2ZS0+cHJldiwgc2xhdmUtPmRldi0+Y2hhbmdlX210dSk7CisJCQlzbGF2ZS0+cHJldiwgc2xhdmUtPmRldi0+bmV0ZGV2X29wcy0+bmRvX2NoYW5nZV9tdHUpOwogCiAJCXJlcyA9IGRldl9zZXRfbXR1KHNsYXZlLT5kZXYsIG5ld19tdHUpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9jYXNzaW5pLmMgYi9kcml2ZXJzL25ldC9jYXNzaW5pLmMKaW5kZXggMzIxZjQzZC4uODQwYjNkMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvY2Fzc2luaS5jCisrKyBiL2RyaXZlcnMvbmV0L2Nhc3NpbmkuYwpAQCAtNDk3Nyw2ICs0OTc3LDIyIEBACiAJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIFBDSV9MQVRFTkNZX1RJTUVSLCAweGZmKTsKIH0KIAorc3RhdGljIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyBjYXNfbmV0ZGV2X29wcyA9IHsKKwkubmRvX29wZW4JCT0gY2FzX29wZW4sCisJLm5kb19zdG9wCQk9IGNhc19jbG9zZSwKKwkubmRvX3N0YXJ0X3htaXQJCT0gY2FzX3N0YXJ0X3htaXQsCisJLm5kb19nZXRfc3RhdHMgCQk9IGNhc19nZXRfc3RhdHMsCisJLm5kb19zZXRfbXVsdGljYXN0X2xpc3QgPSBjYXNfc2V0X211bHRpY2FzdCwKKwkubmRvX2RvX2lvY3RsCQk9IGNhc19pb2N0bCwKKwkubmRvX3R4X3RpbWVvdXQJCT0gY2FzX3R4X3RpbWVvdXQsCisJLm5kb19jaGFuZ2VfbXR1CQk9IGNhc19jaGFuZ2VfbXR1LAorCS5uZG9fc2V0X21hY19hZGRyZXNzCT0gZXRoX21hY19hZGRyLAorCS5uZG9fdmFsaWRhdGVfYWRkcgk9IGV0aF92YWxpZGF0ZV9hZGRyLAorI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCisJLm5kb19wb2xsX2NvbnRyb2xsZXIJPSBjYXNfbmV0cG9sbCwKKyNlbmRpZgorfTsKKwogc3RhdGljIGludCBfX2RldmluaXQgY2FzX2luaXRfb25lKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAogCQkJCSAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKIHsKQEAgLTUxNjYsMjIgKzUxODIsMTMgQEAKIAlmb3IgKGkgPSAwOyBpIDwgTl9SWF9GTE9XUzsgaSsrKQogCQlza2JfcXVldWVfaGVhZF9pbml0KCZjcC0+cnhfZmxvd3NbaV0pOwogCi0JZGV2LT5vcGVuID0gY2FzX29wZW47Ci0JZGV2LT5zdG9wID0gY2FzX2Nsb3NlOwotCWRldi0+aGFyZF9zdGFydF94bWl0ID0gY2FzX3N0YXJ0X3htaXQ7Ci0JZGV2LT5nZXRfc3RhdHMgPSBjYXNfZ2V0X3N0YXRzOwotCWRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gY2FzX3NldF9tdWx0aWNhc3Q7Ci0JZGV2LT5kb19pb2N0bCA9IGNhc19pb2N0bDsKKwlkZXYtPm5ldGRldl9vcHMgPSAmY2FzX25ldGRldl9vcHM7CiAJZGV2LT5ldGh0b29sX29wcyA9ICZjYXNfZXRodG9vbF9vcHM7Ci0JZGV2LT50eF90aW1lb3V0ID0gY2FzX3R4X3RpbWVvdXQ7CiAJZGV2LT53YXRjaGRvZ190aW1lbyA9IENBU19UWF9USU1FT1VUOwotCWRldi0+Y2hhbmdlX210dSA9IGNhc19jaGFuZ2VfbXR1OworCiAjaWZkZWYgVVNFX05BUEkKIAluZXRpZl9uYXBpX2FkZChkZXYsICZjcC0+bmFwaSwgY2FzX3BvbGwsIDY0KTsKICNlbmRpZgotI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCi0JZGV2LT5wb2xsX2NvbnRyb2xsZXIgPSBjYXNfbmV0cG9sbDsKLSNlbmRpZgogCWRldi0+aXJxID0gcGRldi0+aXJxOwogCWRldi0+ZG1hID0gMDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY3hnYjMvYWRhcHRlci5oIGIvZHJpdmVycy9uZXQvY3hnYjMvYWRhcHRlci5oCmluZGV4IDViMzQ2ZjkuLmE4OWQ4Y2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2N4Z2IzL2FkYXB0ZXIuaAorKysgYi9kcml2ZXJzL25ldC9jeGdiMy9hZGFwdGVyLmgKQEAgLTUwLDEyICs1MCwxNyBAQAogc3RydWN0IGFkYXB0ZXI7CiBzdHJ1Y3Qgc2dlX3FzZXQ7CiAKK2VudW0gewkJCS8qIHJ4X29mZmxvYWQgZmxhZ3MgKi8KKwlUM19SWF9DU1VNCT0gMSA8PCAwLAorCVQzX0xSTwkJPSAxIDw8IDEsCit9OworCiBzdHJ1Y3QgcG9ydF9pbmZvIHsKIAlzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcjsKIAlzdHJ1Y3Qgdmxhbl9ncm91cCAqdmxhbl9ncnA7CiAJc3RydWN0IHNnZV9xc2V0ICpxczsKIAl1OCBwb3J0X2lkOwotCXU4IHJ4X2NzdW1fb2ZmbG9hZDsKKwl1OCByeF9vZmZsb2FkOwogCXU4IG5xc2V0czsKIAl1OCBmaXJzdF9xc2V0OwogCXN0cnVjdCBjcGh5IHBoeTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2N4Z2IzL2N4Z2IzX21haW4uYyBiL2RyaXZlcnMvbmV0L2N4Z2IzL2N4Z2IzX21haW4uYwppbmRleCAyODQ3Zjk0Li4wMDg5NzQ2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9jeGdiMy9jeGdiM19tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvY3hnYjMvY3hnYjNfbWFpbi5jCkBAIC01NDYsNyArNTQ2LDcgQEAKIAkJcGktPnFzID0gJmFkYXAtPnNnZS5xc1twaS0+Zmlyc3RfcXNldF07CiAJCWZvciAoaiA9IHBpLT5maXJzdF9xc2V0OyBqIDwgcGktPmZpcnN0X3FzZXQgKyBwaS0+bnFzZXRzOwogCQkgICAgICsraiwgKytxc2V0X2lkeCkgewotCQkJc2V0X3FzZXRfbHJvKGRldiwgcXNldF9pZHgsIHBpLT5yeF9jc3VtX29mZmxvYWQpOworCQkJc2V0X3FzZXRfbHJvKGRldiwgcXNldF9pZHgsIHBpLT5yeF9vZmZsb2FkICYgVDNfTFJPKTsKIAkJCWVyciA9IHQzX3NnZV9hbGxvY19xc2V0KGFkYXAsIHFzZXRfaWR4LCAxLAogCQkJCShhZGFwLT5mbGFncyAmIFVTSU5HX01TSVgpID8gcXNldF9pZHggKyAxIDoKIAkJCQkJCQkgICAgIGlycV9pZHgsCkBAIC0xNjU3LDE3ICsxNjU3LDE5IEBACiB7CiAJc3RydWN0IHBvcnRfaW5mbyAqcCA9IG5ldGRldl9wcml2KGRldik7CiAKLQlyZXR1cm4gcC0+cnhfY3N1bV9vZmZsb2FkOworCXJldHVybiBwLT5yeF9vZmZsb2FkICYgVDNfUlhfQ1NVTTsKIH0KIAogc3RhdGljIGludCBzZXRfcnhfY3N1bShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgZGF0YSkKIHsKIAlzdHJ1Y3QgcG9ydF9pbmZvICpwID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAotCXAtPnJ4X2NzdW1fb2ZmbG9hZCA9IGRhdGE7Ci0JaWYgKCFkYXRhKSB7CisJaWYgKGRhdGEpIHsKKwkJcC0+cnhfb2ZmbG9hZCB8PSBUM19SWF9DU1VNOworCX0gZWxzZSB7CiAJCWludCBpOwogCisJCXAtPnJ4X29mZmxvYWQgJj0gfihUM19SWF9DU1VNIHwgVDNfTFJPKTsKIAkJZm9yIChpID0gcC0+Zmlyc3RfcXNldDsgaSA8IHAtPmZpcnN0X3FzZXQgKyBwLT5ucXNldHM7IGkrKykKIAkJCXNldF9xc2V0X2xybyhkZXYsIGksIDApOwogCX0KQEAgLTE4MzAsMTUgKzE4MzIsMTggQEAKIAlpbnQgaTsKIAogCWlmIChkYXRhICYgRVRIX0ZMQUdfTFJPKSB7Ci0JCWlmICghcGktPnJ4X2NzdW1fb2ZmbG9hZCkKKwkJaWYgKCEocGktPnJ4X29mZmxvYWQgJiBUM19SWF9DU1VNKSkKIAkJCXJldHVybiAtRUlOVkFMOwogCisJCXBpLT5yeF9vZmZsb2FkIHw9IFQzX0xSTzsKIAkJZm9yIChpID0gcGktPmZpcnN0X3FzZXQ7IGkgPCBwaS0+Zmlyc3RfcXNldCArIHBpLT5ucXNldHM7IGkrKykKIAkJCXNldF9xc2V0X2xybyhkZXYsIGksIDEpOwogCi0JfSBlbHNlCisJfSBlbHNlIHsKKwkJcGktPnJ4X29mZmxvYWQgJj0gflQzX0xSTzsKIAkJZm9yIChpID0gcGktPmZpcnN0X3FzZXQ7IGkgPCBwaS0+Zmlyc3RfcXNldCArIHBpLT5ucXNldHM7IGkrKykKIAkJCXNldF9xc2V0X2xybyhkZXYsIGksIDApOworCX0KIAogCXJldHVybiAwOwogfQpAQCAtMTkyNiw3ICsxOTMxLDcgQEAKIAkJCQlwaSA9IGFkYXAycGluZm8oYWRhcHRlciwgaSk7CiAJCQkJaWYgKHQucXNldF9pZHggPj0gcGktPmZpcnN0X3FzZXQgJiYKIAkJCQkgICAgdC5xc2V0X2lkeCA8IHBpLT5maXJzdF9xc2V0ICsgcGktPm5xc2V0cyAmJgotCQkJCSAgICAhcGktPnJ4X2NzdW1fb2ZmbG9hZCkKKwkJCQkgICAgIShwaS0+cnhfb2ZmbG9hZCAmIFQzX1JYX0NTVU0pKQogCQkJCQlyZXR1cm4gLUVJTlZBTDsKIAkJCX0KIApAQCAtMjk0Niw3ICsyOTUxLDcgQEAKIAkJYWRhcHRlci0+cG9ydFtpXSA9IG5ldGRldjsKIAkJcGkgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwogCQlwaS0+YWRhcHRlciA9IGFkYXB0ZXI7Ci0JCXBpLT5yeF9jc3VtX29mZmxvYWQgPSAxOworCQlwaS0+cnhfb2ZmbG9hZCA9IFQzX1JYX0NTVU0gfCBUM19MUk87CiAJCXBpLT5wb3J0X2lkID0gaTsKIAkJbmV0aWZfY2Fycmllcl9vZmYobmV0ZGV2KTsKIAkJbmV0aWZfdHhfc3RvcF9hbGxfcXVldWVzKG5ldGRldik7CkBAIC0yOTU1LDYgKzI5NjAsNyBAQAogCQluZXRkZXYtPm1lbV9lbmQgPSBtbWlvX3N0YXJ0ICsgbW1pb19sZW4gLSAxOwogCQluZXRkZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfU0cgfCBORVRJRl9GX0lQX0NTVU0gfCBORVRJRl9GX1RTTzsKIAkJbmV0ZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX0xMVFg7CisJCW5ldGRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9MUk87CiAJCWlmIChwY2lfdXNpbmdfZGFjKQogCQkJbmV0ZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX0hJR0hETUE7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2N4Z2IzL3NnZS5jIGIvZHJpdmVycy9uZXQvY3hnYjMvc2dlLmMKaW5kZXggNmM2NDFhOC4uMTRmOWZiMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvY3hnYjMvc2dlLmMKKysrIGIvZHJpdmVycy9uZXQvY3hnYjMvc2dlLmMKQEAgLTE5MzIsNyArMTkzMiw3IEBACiAJc2tiX3B1bGwoc2tiLCBzaXplb2YoKnApICsgcGFkKTsKIAlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBhZGFwLT5wb3J0W3AtPmlmZl0pOwogCXBpID0gbmV0ZGV2X3ByaXYoc2tiLT5kZXYpOwotCWlmIChwaS0+cnhfY3N1bV9vZmZsb2FkICYmIHAtPmNzdW1fdmFsaWQgJiYgcC0+Y3N1bSA9PSBodG9ucygweGZmZmYpICYmCisJaWYgKChwaS0+cnhfb2ZmbG9hZCAmIFQzX1JYX0NTVU0pICYmIHAtPmNzdW1fdmFsaWQgJiYgcC0+Y3N1bSA9PSBodG9ucygweGZmZmYpICYmCiAJICAgICFwLT5mcmFnbWVudCkgewogCQlxcy0+cG9ydF9zdGF0c1tTR0VfUFNUQVRfUlhfQ1NVTV9HT09EXSsrOwogCQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX1VOTkVDRVNTQVJZOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZGU2MDAuYyBiL2RyaXZlcnMvbmV0L2RlNjAwLmMKaW5kZXggOTcwZjgyMC4uZGU2M2YxZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZGU2MDAuYworKysgYi9kcml2ZXJzL25ldC9kZTYwMC5jCkBAIC0zNzgsNiArMzc4LDE2IEBACiAJICovCiB9CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgZGU2MDBfbmV0ZGV2X29wcyA9IHsKKwkubmRvX29wZW4JCT0gZGU2MDBfb3BlbiwKKwkubmRvX3N0b3AJCT0gZGU2MDBfY2xvc2UsCisJLm5kb19zdGFydF94bWl0CQk9IGRlNjAwX3N0YXJ0X3htaXQsCisJLm5kb19jaGFuZ2VfbXR1CQk9IGV0aF9jaGFuZ2VfbXR1LAorCS5uZG9fc2V0X21hY19hZGRyZXNzIAk9IGV0aF9tYWNfYWRkciwKKwkubmRvX3ZhbGlkYXRlX2FkZHIJPSBldGhfdmFsaWRhdGVfYWRkciwKK307CisKKwogc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlICogX19pbml0IGRlNjAwX3Byb2JlKHZvaWQpCiB7CiAJaW50CWk7CkBAIC00MzksOSArNDQ5LDcgQEAKIAogCXByaW50aygiLCBFdGhlcm5ldCBBZGRyZXNzOiAlcE1cbiIsIGRldi0+ZGV2X2FkZHIpOwogCi0JZGV2LT5vcGVuID0gZGU2MDBfb3BlbjsKLQlkZXYtPnN0b3AgPSBkZTYwMF9jbG9zZTsKLQlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9ICZkZTYwMF9zdGFydF94bWl0OworCWRldi0+bmV0ZGV2X29wcyA9ICZkZTYwMF9uZXRkZXZfb3BzOwogCiAJZGV2LT5mbGFncyY9fklGRl9NVUxUSUNBU1Q7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2RlNjIwLmMgYi9kcml2ZXJzL25ldC9kZTYyMC5jCmluZGV4IGJkZmE4OTQuLmQ1MmYzNGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2RlNjIwLmMKKysrIGIvZHJpdmVycy9uZXQvZGU2MjAuYwpAQCAtNzg0LDYgKzc4NCwxNyBAQAogCXJldHVybiAwOyAvKiBhbGwgb2sgKi8KIH0KIAorc3RhdGljIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyBkZTYyMF9uZXRkZXZfb3BzID0geworCS5uZG9fb3BlbiAJCT0gZGU2MjBfb3BlbiwKKwkubmRvX3N0b3AgCQk9IGRlNjIwX2Nsb3NlLAorCS5uZG9fc3RhcnRfeG1pdCAJPSBkZTYyMF9zdGFydF94bWl0LAorCS5uZG9fdHhfdGltZW91dCAJPSBkZTYyMF90aW1lb3V0LAorCS5uZG9fc2V0X211bHRpY2FzdF9saXN0ID0gZGU2MjBfc2V0X211bHRpY2FzdF9saXN0LAorCS5uZG9fY2hhbmdlX210dQkJPSBldGhfY2hhbmdlX210dSwKKwkubmRvX3NldF9tYWNfYWRkcmVzcyAJPSBldGhfbWFjX2FkZHIsCisJLm5kb192YWxpZGF0ZV9hZGRyCT0gZXRoX3ZhbGlkYXRlX2FkZHIsCit9OworCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogT25seSBzdGFydC11cCBjb2RlIGJlbG93CkBAIC04NjEsMTIgKzg3Miw4IEBACiAJZWxzZQogCQlwcmludGsoIiBVVFApXG4iKTsKIAotCWRldi0+b3BlbiAJCT0gZGU2MjBfb3BlbjsKLQlkZXYtPnN0b3AgCQk9IGRlNjIwX2Nsb3NlOwotCWRldi0+aGFyZF9zdGFydF94bWl0IAk9IGRlNjIwX3N0YXJ0X3htaXQ7Ci0JZGV2LT50eF90aW1lb3V0IAk9IGRlNjIwX3RpbWVvdXQ7CisJZGV2LT5uZXRkZXZfb3BzID0gJmRlNjIwX25ldGRldl9vcHM7CiAJZGV2LT53YXRjaGRvZ190aW1lbwk9IEhaKjI7Ci0JZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSBkZTYyMF9zZXRfbXVsdGljYXN0X2xpc3Q7CiAKIAkvKiBiYXNlX2FkZHIgYW5kIGlycSBhcmUgYWxyZWFkeSBzZXQsIHNlZSBhYm92ZSEgKi8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZTEwMC5jIGIvZHJpdmVycy9uZXQvZTEwMC5jCmluZGV4IDEzNGIyZDYuLjg2YmI4NzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2UxMDAuYworKysgYi9kcml2ZXJzL25ldC9lMTAwLmMKQEAgLTE2MSw2ICsxNjEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgogI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgogI2luY2x1ZGUgPGFzbS91bmFsaWduZWQuaD4KIAogCkBAIC0xNzQsMTAgKzE3NSwxNyBAQAogI2RlZmluZSBFMTAwX1dBVENIRE9HX1BFUklPRAkoMiAqIEhaKQogI2RlZmluZSBFMTAwX05BUElfV0VJR0hUCTE2CiAKKyNkZWZpbmUgRklSTVdBUkVfRDEwMU0JCSJlMTAwL2QxMDFtX3Vjb2RlLmJpbiIKKyNkZWZpbmUgRklSTVdBUkVfRDEwMVMJCSJlMTAwL2QxMDFzX3Vjb2RlLmJpbiIKKyNkZWZpbmUgRklSTVdBUkVfRDEwMkUJCSJlMTAwL2QxMDJlX3Vjb2RlLmJpbiIKKwogTU9EVUxFX0RFU0NSSVBUSU9OKERSVl9ERVNDUklQVElPTik7CiBNT0RVTEVfQVVUSE9SKERSVl9DT1BZUklHSFQpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogTU9EVUxFX1ZFUlNJT04oRFJWX1ZFUlNJT04pOworTU9EVUxFX0ZJUk1XQVJFKEZJUk1XQVJFX0QxMDFNKTsKK01PRFVMRV9GSVJNV0FSRShGSVJNV0FSRV9EMTAxUyk7CitNT0RVTEVfRklSTVdBUkUoRklSTVdBUkVfRDEwMkUpOwogCiBzdGF0aWMgaW50IGRlYnVnID0gMzsKIHN0YXRpYyBpbnQgZWVwcm9tX2JhZF9jc3VtX2FsbG93ID0gMDsKQEAgLTEwNDksMTc4ICsxMDU3LDYgQEAKIAkJY1sxNl0sIGNbMTddLCBjWzE4XSwgY1sxOV0sIGNbMjBdLCBjWzIxXSwgY1syMl0sIGNbMjNdKTsKIH0KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogIE1pY3JvIGNvZGUgZm9yIDgwODY6MTIyOSBSZXYgOCAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiAgUGFyYW1ldGVyIHZhbHVlcyBmb3IgdGhlIEQxMDFNIEItc3RlcCAgKi8KLSNkZWZpbmUgRDEwMU1fQ1BVU0FWRVJfVElNRVJfRFdPUkQJCTc4Ci0jZGVmaW5lIEQxMDFNX0NQVVNBVkVSX0JVTkRMRV9EV09SRAkJNjUKLSNkZWZpbmUgRDEwMU1fQ1BVU0FWRVJfTUlOX1NJWkVfRFdPUkQJCTEyNgotCi0jZGVmaW5lIEQxMDFNX0JfUkNWQlVORExFX1VDT0RFIFwKLXtcCi0weDAwNTUwMjE1LCAweEZGRkYwNDM3LCAweEZGRkZGRkZGLCAweDA2QTcwNzg5LCAweEZGRkZGRkZGLCAweDA1NThGRkZGLCBcCi0weDAwMEMwMDAxLCAweDAwMTAxMzEyLCAweDAwMEMwMDA4LCAweDAwMzgwMjE2LCBcCi0weDAwMTAwMDlDLCAweDAwMjA0MDU2LCAweDAwMjM4MENDLCAweDAwMzgwMDU2LCBcCi0weDAwMTAwMDlDLCAweDAwMjQ0QzBCLCAweDAwMDAwODAwLCAweDAwMTI0ODE4LCBcCi0weDAwMzgwNDM4LCAweDAwMDAwMDAwLCAweDAwMTQwMDAwLCAweDAwMzgwNTU1LCBcCi0weDAwMzA4MDAwLCAweDAwMTAwNjYyLCAweDAwMTAwNTYxLCAweDAwMEUwNDA4LCBcCi0weDAwMTM0ODYxLCAweDAwMEMwMDAyLCAweDAwMTAzMDkzLCAweDAwMzA4MDAwLCBcCi0weDAwMTAwNjI0LCAweDAwMTAwNTYxLCAweDAwMEUwNDA4LCAweDAwMTAwODYxLCBcCi0weDAwMEMwMDdFLCAweDAwMjIyQzIxLCAweDAwMEMwMDAyLCAweDAwMTAzMDkzLCBcCi0weDAwMzgwQzdBLCAweDAwMDgwMDAwLCAweDAwMTAzMDkwLCAweDAwMzgwQzdBLCBcCi0weDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCBcCi0weDAwMTAwMDlDLCAweDAwMjQ0QzJELCAweDAwMDEwMDA0LCAweDAwMDQxMDAwLCBcCi0weDAwM0EwNDM3LCAweDAwMDQ0MDEwLCAweDAwMzgwNzhBLCAweDAwMDAwMDAwLCBcCi0weDAwMTAwMDk5LCAweDAwMjA2QzdBLCAweDAwMTAwMDlDLCAweDAwMjQ0QzQ4LCBcCi0weDAwMTMwODI0LCAweDAwMEMwMDAxLCAweDAwMTAxMjEzLCAweDAwMjYwQzc1LCBcCi0weDAwMDQxMDAwLCAweDAwMDEwMDA0LCAweDAwMTMwODI2LCAweDAwMEMwMDA2LCBcCi0weDAwMjIwNkE4LCAweDAwMTNDOTI2LCAweDAwMTAxMzEzLCAweDAwMzgwNkE4LCBcCi0weDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCBcCi0weDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCBcCi0weDAwMDgwNjAwLCAweDAwMTAxQjEwLCAweDAwMDUwMDA0LCAweDAwMTAwODI2LCBcCi0weDAwMTAxMjEwLCAweDAwMzgwQzM0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCBcCi0weDAwMjExNTVCLCAweDAwMTAwMDk5LCAweDAwMjA2NTU5LCAweDAwMTAwMDlDLCBcCi0weDAwMjQ0NTU5LCAweDAwMTMwODM2LCAweDAwMEMwMDAwLCAweDAwMjIwQzYyLCBcCi0weDAwMEMwMDAxLCAweDAwMTAxQjEzLCAweDAwMjI5QzBFLCAweDAwMjEwQzBFLCBcCi0weDAwMjI2QzBFLCAweDAwMjE2QzBFLCAweDAwMjJGQzBFLCAweDAwMjE1QzBFLCBcCi0weDAwMjE0QzBFLCAweDAwMzgwNTU1LCAweDAwMDEwMDA0LCAweDAwMDQxMDAwLCBcCi0weDAwMjc4QzY3LCAweDAwMDQwODAwLCAweDAwMDE4MTAwLCAweDAwM0EwNDM3LCBcCi0weDAwMTMwODI2LCAweDAwMEMwMDAxLCAweDAwMjIwNTU5LCAweDAwMTAxMzEzLCBcCi0weDAwMzgwNTU5LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCBcCi0weDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCBcCi0weDAwMDAwMDAwLCAweDAwMTMwODMxLCAweDAwMTAwOTBCLCAweDAwMTI0ODEzLCBcCi0weDAwMENGRjgwLCAweDAwMjYwNkFCLCAweDAwMDQxMDAwLCAweDAwMDEwMDA0LCBcCi0weDAwMzgwNkE4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCBcCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICBNaWNybyBjb2RlIGZvciA4MDg2OjEyMjkgUmV2IDkgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogIFBhcmFtZXRlciB2YWx1ZXMgZm9yIHRoZSBEMTAxUyAgKi8KLSNkZWZpbmUgRDEwMVNfQ1BVU0FWRVJfVElNRVJfRFdPUkQJCTc4Ci0jZGVmaW5lIEQxMDFTX0NQVVNBVkVSX0JVTkRMRV9EV09SRAkJNjcKLSNkZWZpbmUgRDEwMVNfQ1BVU0FWRVJfTUlOX1NJWkVfRFdPUkQJCTEyOAotCi0jZGVmaW5lIEQxMDFTX1JDVkJVTkRMRV9VQ09ERSBcCi17XAotMHgwMDU1MDI0MiwgMHhGRkZGMDQ3RSwgMHhGRkZGRkZGRiwgMHgwNkZGMDgxOCwgMHhGRkZGRkZGRiwgMHgwNUE2RkZGRiwgXAotMHgwMDBDMDAwMSwgMHgwMDEwMTMxMiwgMHgwMDBDMDAwOCwgMHgwMDM4MDI0MywgXAotMHgwMDEwMDA5QywgMHgwMDIwNDA1NiwgMHgwMDIzODBEMCwgMHgwMDM4MDA1NiwgXAotMHgwMDEwMDA5QywgMHgwMDI0NEY4QiwgMHgwMDAwMDgwMCwgMHgwMDEyNDgxOCwgXAotMHgwMDM4MDQ3RiwgMHgwMDAwMDAwMCwgMHgwMDE0MDAwMCwgMHgwMDM4MDVBMywgXAotMHgwMDMwODAwMCwgMHgwMDEwMDYxMCwgMHgwMDEwMDU2MSwgMHgwMDBFMDQwOCwgXAotMHgwMDEzNDg2MSwgMHgwMDBDMDAwMiwgMHgwMDEwMzA5MywgMHgwMDMwODAwMCwgXAotMHgwMDEwMDYyNCwgMHgwMDEwMDU2MSwgMHgwMDBFMDQwOCwgMHgwMDEwMDg2MSwgXAotMHgwMDBDMDA3RSwgMHgwMDIyMkZBMSwgMHgwMDBDMDAwMiwgMHgwMDEwMzA5MywgXAotMHgwMDM4MEY5MCwgMHgwMDA4MDAwMCwgMHgwMDEwMzA5MCwgMHgwMDM4MEY5MCwgXAotMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgXAotMHgwMDEwMDA5QywgMHgwMDI0NEZBRCwgMHgwMDAxMDAwNCwgMHgwMDA0MTAwMCwgXAotMHgwMDNBMDQ3RSwgMHgwMDA0NDAxMCwgMHgwMDM4MDgxOSwgMHgwMDAwMDAwMCwgXAotMHgwMDEwMDA5OSwgMHgwMDIwNkZGRCwgMHgwMDEwMDA5QSwgMHgwMDIwQUZGRCwgXAotMHgwMDEwMDA5QywgMHgwMDI0NEZDOCwgMHgwMDEzMDgyNCwgMHgwMDBDMDAwMSwgXAotMHgwMDEwMTIxMywgMHgwMDI2MEZGNywgMHgwMDA0MTAwMCwgMHgwMDAxMDAwNCwgXAotMHgwMDEzMDgyNiwgMHgwMDBDMDAwNiwgMHgwMDIyMDcwMCwgMHgwMDEzQzkyNiwgXAotMHgwMDEwMTMxMywgMHgwMDM4MDcwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgXAotMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgXAotMHgwMDA4MDYwMCwgMHgwMDEwMUIxMCwgMHgwMDA1MDAwNCwgMHgwMDEwMDgyNiwgXAotMHgwMDEwMTIxMCwgMHgwMDM4MEZCNiwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgXAotMHgwMDIxMTVBOSwgMHgwMDEwMDA5OSwgMHgwMDIwNjVBNywgMHgwMDEwMDA5QSwgXAotMHgwMDIwQTVBNywgMHgwMDEwMDA5QywgMHgwMDI0NDVBNywgMHgwMDEzMDgzNiwgXAotMHgwMDBDMDAwMCwgMHgwMDIyMEZFNCwgMHgwMDBDMDAwMSwgMHgwMDEwMUIxMywgXAotMHgwMDIyOUY4RSwgMHgwMDIxMEY4RSwgMHgwMDIyNkY4RSwgMHgwMDIxNkY4RSwgXAotMHgwMDIyRkY4RSwgMHgwMDIxNUY4RSwgMHgwMDIxNEY4RSwgMHgwMDM4MDVBMywgXAotMHgwMDAxMDAwNCwgMHgwMDA0MTAwMCwgMHgwMDI3OEZFOSwgMHgwMDA0MDgwMCwgXAotMHgwMDAxODEwMCwgMHgwMDNBMDQ3RSwgMHgwMDEzMDgyNiwgMHgwMDBDMDAwMSwgXAotMHgwMDIyMDVBNywgMHgwMDEwMTMxMywgMHgwMDM4MDVBNywgMHgwMDAwMDAwMCwgXAotMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgXAotMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDEzMDgzMSwgXAotMHgwMDEwMDkwQiwgMHgwMDEyNDgxMywgMHgwMDBDRkY4MCwgMHgwMDI2MDcwMywgXAotMHgwMDA0MTAwMCwgMHgwMDAxMDAwNCwgMHgwMDM4MDcwMCAgXAotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgTWljcm8gY29kZSBmb3IgdGhlIDgwODY6MTIyOSBSZXYgRi8xMCAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qICBQYXJhbWV0ZXIgdmFsdWVzIGZvciB0aGUgRDEwMiBFLXN0ZXAgICovCi0jZGVmaW5lIEQxMDJfRV9DUFVTQVZFUl9USU1FUl9EV09SRAkJNDIKLSNkZWZpbmUgRDEwMl9FX0NQVVNBVkVSX0JVTkRMRV9EV09SRAkJNTQKLSNkZWZpbmUgRDEwMl9FX0NQVVNBVkVSX01JTl9TSVpFX0RXT1JECQk0NgotCi0jZGVmaW5lICAgICBEMTAyX0VfUkNWQlVORExFX1VDT0RFIFwKLXtcCi0weDAwN0QwMjhGLCAweDBFNDIwNEY5LCAweDE0RUQwQzg1LCAweDE0RkExNEU5LCAweDBFRjcwRTM2LCAweDFGRkYxRkZGLCBcCi0weDAwRTAxNEI5LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCBcCi0weDAwRTAxNEJELCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCBcCi0weDAwRTAxNEQ1LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCBcCi0weDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCBcCi0weDAwRTAxNEMxLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCBcCi0weDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCBcCi0weDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCBcCi0weDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCBcCi0weDAwRTAxNEM4LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCBcCi0weDAwMjAwNjAwLCAweDAwRTAxNEVFLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCBcCi0weDAwMzBGRjgwLCAweDAwOTQwRTQ2LCAweDAwMDM4MjAwLCAweDAwMTAyMDAwLCBcCi0weDAwRTAwRTQzLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCBcCi0weDAwMzAwMDA2LCAweDAwRTAxNEZCLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCBcCi0weDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCBcCi0weDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCBcCi0weDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCBcCi0weDAwOTA2RTQxLCAweDAwODAwRTNDLCAweDAwRTAwRTM5LCAweDAwMDAwMDAwLCBcCi0weDAwOTA2RUZELCAweDAwOTAwRUZELCAweDAwRTAwRUY4LCAweDAwMDAwMDAwLCBcCi0weDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCBcCi0weDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCBcCi0weDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCBcCi0weDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCBcCi0weDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCBcCi0weDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCBcCi0weDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCBcCi0weDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCBcCi0weDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCBcCi0weDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCBcCi0weDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCBcCi0weDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCBcCi0weDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCBcCi0weDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCBcCi19Ci0KLXN0YXRpYyB2b2lkIGUxMDBfc2V0dXBfdWNvZGUoc3RydWN0IG5pYyAqbmljLCBzdHJ1Y3QgY2IgKmNiLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQotewotLyogKklOREVOVC1PRkYqICovCi0Jc3RhdGljIHN0cnVjdCB7Ci0JCXUzMiB1Y29kZVtVQ09ERV9TSVpFICsgMV07Ci0JCXU4IG1hYzsKLQkJdTggdGltZXJfZHdvcmQ7Ci0JCXU4IGJ1bmRsZV9kd29yZDsKLQkJdTggbWluX3NpemVfZHdvcmQ7Ci0JfSB1Y29kZV9vcHRzW10gPSB7Ci0JCXsgRDEwMU1fQl9SQ1ZCVU5ETEVfVUNPREUsCi0JCSAgbWFjXzgyNTU5X0QxMDFNLAotCQkgIEQxMDFNX0NQVVNBVkVSX1RJTUVSX0RXT1JELAotCQkgIEQxMDFNX0NQVVNBVkVSX0JVTkRMRV9EV09SRCwKLQkJICBEMTAxTV9DUFVTQVZFUl9NSU5fU0laRV9EV09SRCB9LAotCQl7IEQxMDFTX1JDVkJVTkRMRV9VQ09ERSwKLQkJICBtYWNfODI1NTlfRDEwMVMsCi0JCSAgRDEwMVNfQ1BVU0FWRVJfVElNRVJfRFdPUkQsCi0JCSAgRDEwMVNfQ1BVU0FWRVJfQlVORExFX0RXT1JELAotCQkgIEQxMDFTX0NQVVNBVkVSX01JTl9TSVpFX0RXT1JEIH0sCi0JCXsgRDEwMl9FX1JDVkJVTkRMRV9VQ09ERSwKLQkJICBtYWNfODI1NTFfRiwKLQkJICBEMTAyX0VfQ1BVU0FWRVJfVElNRVJfRFdPUkQsCi0JCSAgRDEwMl9FX0NQVVNBVkVSX0JVTkRMRV9EV09SRCwKLQkJICBEMTAyX0VfQ1BVU0FWRVJfTUlOX1NJWkVfRFdPUkQgfSwKLQkJeyBEMTAyX0VfUkNWQlVORExFX1VDT0RFLAotCQkgIG1hY184MjU1MV8xMCwKLQkJICBEMTAyX0VfQ1BVU0FWRVJfVElNRVJfRFdPUkQsCi0JCSAgRDEwMl9FX0NQVVNBVkVSX0JVTkRMRV9EV09SRCwKLQkJICBEMTAyX0VfQ1BVU0FWRVJfTUlOX1NJWkVfRFdPUkQgfSwKLQkJeyB7MH0sIDAsIDAsIDAsIDB9Ci0JfSwgKm9wdHM7Ci0vKiAqSU5ERU5ULU9OKiAqLwotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgQ1BVU2F2ZXIgcGFyYW1ldGVycwogKgpAQCAtMTI4MCw0MiArMTExNiwxMDEgQEAKICNkZWZpbmUgQlVORExFTUFYICh1MTYpNgogI2RlZmluZSBJTlRERUxBWSAodTE2KTE1MzYgLyogMHg2MDAgKi8KIAorLyogSW5pdGlhbGl6ZSBmaXJtd2FyZSAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZTEwMF9yZXF1ZXN0X2Zpcm13YXJlKHN0cnVjdCBuaWMgKm5pYykKK3sKKwljb25zdCBjaGFyICpmd19uYW1lOworCWNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZnc7CisJdTggdGltZXIsIGJ1bmRsZSwgbWluX3NpemU7CisJaW50IGVycjsKKwogCS8qIGRvIG5vdCBsb2FkIHUtY29kZSBmb3IgSUNIIGRldmljZXMgKi8KIAlpZiAobmljLT5mbGFncyAmIGljaCkKLQkJZ290byBub2xvYWR1Y29kZTsKKwkJcmV0dXJuIE5VTEw7CiAKIAkvKiBTZWFyY2ggZm9yIHVjb2RlIG1hdGNoIGFnYWluc3QgaC93IHJldmlzaW9uICovCi0JZm9yIChvcHRzID0gdWNvZGVfb3B0czsgb3B0cy0+bWFjOyBvcHRzKyspIHsKLQkJaW50IGk7Ci0JCXUzMiAqdWNvZGUgPSBvcHRzLT51Y29kZTsKLQkJaWYgKG5pYy0+bWFjICE9IG9wdHMtPm1hYykKLQkJCWNvbnRpbnVlOworCWlmIChuaWMtPm1hYyA9PSBtYWNfODI1NTlfRDEwMU0pCisJCWZ3X25hbWUgPSBGSVJNV0FSRV9EMTAxTTsKKwllbHNlIGlmIChuaWMtPm1hYyA9PSBtYWNfODI1NTlfRDEwMVMpCisJCWZ3X25hbWUgPSBGSVJNV0FSRV9EMTAxUzsKKwllbHNlIGlmIChuaWMtPm1hYyA9PSBtYWNfODI1NTFfRiB8fCBuaWMtPm1hYyA9PSBtYWNfODI1NTFfMTApCisJCWZ3X25hbWUgPSBGSVJNV0FSRV9EMTAyRTsKKwllbHNlIC8qIE5vIHVjb2RlIG9uIG90aGVyIGRldmljZXMgKi8KKwkJcmV0dXJuIE5VTEw7CiAKLQkJLyogSW5zZXJ0IHVzZXItdHVuYWJsZSBzZXR0aW5ncyAqLwotCQl1Y29kZVtvcHRzLT50aW1lcl9kd29yZF0gJj0gMHhGRkZGMDAwMDsKLQkJdWNvZGVbb3B0cy0+dGltZXJfZHdvcmRdIHw9IElOVERFTEFZOwotCQl1Y29kZVtvcHRzLT5idW5kbGVfZHdvcmRdICY9IDB4RkZGRjAwMDA7Ci0JCXVjb2RlW29wdHMtPmJ1bmRsZV9kd29yZF0gfD0gQlVORExFTUFYOwotCQl1Y29kZVtvcHRzLT5taW5fc2l6ZV9kd29yZF0gJj0gMHhGRkZGMDAwMDsKLQkJdWNvZGVbb3B0cy0+bWluX3NpemVfZHdvcmRdIHw9IChCVU5ETEVTTUFMTCkgPyAweEZGRkYgOiAweEZGODA7Ci0KLQkJZm9yIChpID0gMDsgaSA8IFVDT0RFX1NJWkU7IGkrKykKLQkJCWNiLT51LnVjb2RlW2ldID0gY3B1X3RvX2xlMzIodWNvZGVbaV0pOwotCQljYi0+Y29tbWFuZCA9IGNwdV90b19sZTE2KGNiX3Vjb2RlIHwgY2JfZWwpOwotCQlyZXR1cm47CisJZXJyID0gcmVxdWVzdF9maXJtd2FyZSgmZncsIGZ3X25hbWUsICZuaWMtPnBkZXYtPmRldik7CisJaWYgKGVycikgeworCQlEUFJJTlRLKFBST0JFLCBFUlIsICJGYWlsZWQgdG8gbG9hZCBmaXJtd2FyZSBcIiVzXCI6ICVkXG4iLAorCQkJZndfbmFtZSwgZXJyKTsKKwkJcmV0dXJuIEVSUl9QVFIoZXJyKTsKKwl9CisJLyogRmlybXdhcmUgc2hvdWxkIGJlIHByZWNpc2VseSBVQ09ERV9TSVpFICh3b3JkcykgcGx1cyB0aHJlZSBieXRlcworCSAgIGluZGljYXRpbmcgdGhlIG9mZnNldHMgZm9yIEJVTkRMRVNNQUxMLCBCVU5ETEVNQVgsIElOVERFTEFZICovCisJaWYgKGZ3LT5zaXplICE9IFVDT0RFX1NJWkUgKiA0ICsgMykgeworCQlEUFJJTlRLKFBST0JFLCBFUlIsICJGaXJtd2FyZSBcIiVzXCIgaGFzIHdyb25nIHNpemUgJXp1XG4iLAorCQkJZndfbmFtZSwgZnctPnNpemUpOworCQlyZWxlYXNlX2Zpcm13YXJlKGZ3KTsKKwkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CiAJfQogCi1ub2xvYWR1Y29kZToKLQljYi0+Y29tbWFuZCA9IGNwdV90b19sZTE2KGNiX25vcCB8IGNiX2VsKTsKKwkvKiBSZWFkIHRpbWVyLCBidW5kbGUgYW5kIG1pbl9zaXplIGZyb20gZW5kIG9mIGZpcm13YXJlIGJsb2IgKi8KKwl0aW1lciA9IGZ3LT5kYXRhW1VDT0RFX1NJWkUgKiA0XTsKKwlidW5kbGUgPSBmdy0+ZGF0YVtVQ09ERV9TSVpFICogNCArIDFdOworCW1pbl9zaXplID0gZnctPmRhdGFbVUNPREVfU0laRSAqIDQgKyAyXTsKKworCWlmICh0aW1lciA+PSBVQ09ERV9TSVpFIHx8IGJ1bmRsZSA+PSBVQ09ERV9TSVpFIHx8CisJICAgIG1pbl9zaXplID49IFVDT0RFX1NJWkUpIHsKKwkJRFBSSU5USyhQUk9CRSwgRVJSLAorCQkJIlwiJXNcIiBoYXMgYm9ndXMgb2Zmc2V0IHZhbHVlcyAoMHgleCwweCV4LDB4JXgpXG4iLAorCQkJZndfbmFtZSwgdGltZXIsIGJ1bmRsZSwgbWluX3NpemUpOworCQlyZWxlYXNlX2Zpcm13YXJlKGZ3KTsKKwkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisJfQorCS8qIE9LLCBmaXJtd2FyZSBpcyB2YWxpZGF0ZWQgYW5kIHJlYWR5IHRvIHVzZS4uLiAqLworCXJldHVybiBmdzsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgZTEwMF9leGVjX2NiX3dhaXQoc3RydWN0IG5pYyAqbmljLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCXZvaWQgKCpjYl9wcmVwYXJlKShzdHJ1Y3QgbmljICosIHN0cnVjdCBjYiAqLCBzdHJ1Y3Qgc2tfYnVmZiAqKSkKK3N0YXRpYyB2b2lkIGUxMDBfc2V0dXBfdWNvZGUoc3RydWN0IG5pYyAqbmljLCBzdHJ1Y3QgY2IgKmNiLAorCQkJICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogeworCWNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZncgPSAodm9pZCAqKXNrYjsKKwl1OCB0aW1lciwgYnVuZGxlLCBtaW5fc2l6ZTsKKworCS8qIEl0J3Mgbm90IGEgcmVhbCBza2I7IHdlIGp1c3QgYWJ1c2VkIHRoZSBmYWN0IHRoYXQgZTEwMF9leGVjX2NiCisJICAgd2lsbCBwYXNzIGl0IHRocm91Z2ggdG8gaGVyZS4uLiAqLworCWNiLT5za2IgPSBOVUxMOworCisJLyogZmlybXdhcmUgaXMgc3RvcmVkIGFzIGxpdHRsZSBlbmRpYW4gYWxyZWFkeSAqLworCW1lbWNweShjYi0+dS51Y29kZSwgZnctPmRhdGEsIFVDT0RFX1NJWkUgKiA0KTsKKworCS8qIFJlYWQgdGltZXIsIGJ1bmRsZSBhbmQgbWluX3NpemUgZnJvbSBlbmQgb2YgZmlybXdhcmUgYmxvYiAqLworCXRpbWVyID0gZnctPmRhdGFbVUNPREVfU0laRSAqIDRdOworCWJ1bmRsZSA9IGZ3LT5kYXRhW1VDT0RFX1NJWkUgKiA0ICsgMV07CisJbWluX3NpemUgPSBmdy0+ZGF0YVtVQ09ERV9TSVpFICogNCArIDJdOworCisJLyogSW5zZXJ0IHVzZXItdHVuYWJsZSBzZXR0aW5ncyBpbiBjYi0+dS51Y29kZSAqLworCWNiLT51LnVjb2RlW3RpbWVyXSAmPSBjcHVfdG9fbGUzMigweEZGRkYwMDAwKTsKKwljYi0+dS51Y29kZVt0aW1lcl0gfD0gY3B1X3RvX2xlMzIoSU5UREVMQVkpOworCWNiLT51LnVjb2RlW2J1bmRsZV0gJj0gY3B1X3RvX2xlMzIoMHhGRkZGMDAwMCk7CisJY2ItPnUudWNvZGVbYnVuZGxlXSB8PSBjcHVfdG9fbGUzMihCVU5ETEVNQVgpOworCWNiLT51LnVjb2RlW21pbl9zaXplXSAmPSBjcHVfdG9fbGUzMigweEZGRkYwMDAwKTsKKwljYi0+dS51Y29kZVttaW5fc2l6ZV0gfD0gY3B1X3RvX2xlMzIoKEJVTkRMRVNNQUxMKSA/IDB4RkZGRiA6IDB4RkY4MCk7CisKKwljYi0+Y29tbWFuZCA9IGNwdV90b19sZTE2KGNiX3Vjb2RlIHwgY2JfZWwpOworfQorCitzdGF0aWMgaW5saW5lIGludCBlMTAwX2xvYWRfdWNvZGVfd2FpdChzdHJ1Y3QgbmljICpuaWMpCit7CisJY29uc3Qgc3RydWN0IGZpcm13YXJlICpmdzsKIAlpbnQgZXJyID0gMCwgY291bnRlciA9IDUwOwogCXN0cnVjdCBjYiAqY2IgPSBuaWMtPmNiX3RvX2NsZWFuOwogCi0JaWYgKChlcnIgPSBlMTAwX2V4ZWNfY2IobmljLCBOVUxMLCBlMTAwX3NldHVwX3Vjb2RlKSkpCisJZncgPSBlMTAwX3JlcXVlc3RfZmlybXdhcmUobmljKTsKKwkvKiBJZiBpdCdzIE5VTEwsIHRoZW4gbm8gdWNvZGUgaXMgcmVxdWlyZWQgKi8KKwlpZiAoIWZ3IHx8IElTX0VSUihmdykpCisJCXJldHVybiBQVFJfRVJSKGZ3KTsKKworCWlmICgoZXJyID0gZTEwMF9leGVjX2NiKG5pYywgKHZvaWQgKilmdywgZTEwMF9zZXR1cF91Y29kZSkpKQogCQlEUFJJTlRLKFBST0JFLEVSUiwgInVjb2RlIGNtZCBmYWlsZWQgd2l0aCBlcnJvciAlZFxuIiwgZXJyKTsKIAogCS8qIG11c3QgcmVzdGFydCBjdWMgKi8KQEAgLTE0MzUsNyArMTMzMCw3IEBACiAJCXJldHVybiBlcnI7CiAJaWYgKChlcnIgPSBlMTAwX2V4ZWNfY21kKG5pYywgcnVjX2xvYWRfYmFzZSwgMCkpKQogCQlyZXR1cm4gZXJyOwotCWlmICgoZXJyID0gZTEwMF9leGVjX2NiX3dhaXQobmljLCBOVUxMLCBlMTAwX3NldHVwX3Vjb2RlKSkpCisJaWYgKChlcnIgPSBlMTAwX2xvYWRfdWNvZGVfd2FpdChuaWMpKSkKIAkJcmV0dXJuIGVycjsKIAlpZiAoKGVyciA9IGUxMDBfZXhlY19jYihuaWMsIE5VTEwsIGUxMDBfY29uZmlndXJlKSkpCiAJCXJldHVybiBlcnI7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9lMTAwMC9lMTAwMF9ody5jIGIvZHJpdmVycy9uZXQvZTEwMDAvZTEwMDBfaHcuYwppbmRleCBkMDRlZWY1My4uZTFhM2ZjMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZTEwMDAvZTEwMDBfaHcuYworKysgYi9kcml2ZXJzL25ldC9lMTAwMC9lMTAwMF9ody5jCkBAIC02NzU4LDcgKzY3NTgsNyBAQAogICogcmV0dXJuczogLSBFMTAwMF9FUlJfWFhYCiAgKiAgICAgICAgICAgIEUxMDAwX1NVQ0NFU1MKICAqCi0gKiBGb3IgcGh5J3Mgb2xkZXIgdGhlbiBJR1AsIHRoaXMgZnVuY3Rpb24gc2ltcGx5IHJlYWRzIHRoZSBwb2xhcml0eSBiaXQgaW4gdGhlCisgKiBGb3IgcGh5J3Mgb2xkZXIgdGhhbiBJR1AsIHRoaXMgZnVuY3Rpb24gc2ltcGx5IHJlYWRzIHRoZSBwb2xhcml0eSBiaXQgaW4gdGhlCiAgKiBQaHkgU3RhdHVzIHJlZ2lzdGVyLiAgRm9yIElHUCBwaHkncywgdGhpcyBiaXQgaXMgdmFsaWQgb25seSBpZiBsaW5rIHNwZWVkIGlzCiAgKiAxMCBNYnBzLiAgSWYgdGhlIGxpbmsgc3BlZWQgaXMgMTAwIE1icHMgdGhlcmUgaXMgbm8gcG9sYXJpdHkgc28gdGhpcyBiaXQgd2lsbAogICogcmV0dXJuIDAuICBJZiB0aGUgbGluayBzcGVlZCBpcyAxMDAwIE1icHMgdGhlIHBvbGFyaXR5IHN0YXR1cyBpcyBpbiB0aGUKQEAgLTY4MzQsNyArNjgzNCw3IEBACiAgKiByZXR1cm5zOiAtIEUxMDAwX0VSUl9YWFgKICAqICAgICAgICAgICAgRTEwMDBfU1VDQ0VTUwogICoKLSAqIEZvciBwaHkncyBvbGRlciB0aGVuIElHUCwgdGhpcyBmdW5jdGlvbiByZWFkcyB0aGUgRG93bnNoaWZ0IGJpdCBpbiB0aGUgUGh5CisgKiBGb3IgcGh5J3Mgb2xkZXIgdGhhbiBJR1AsIHRoaXMgZnVuY3Rpb24gcmVhZHMgdGhlIERvd25zaGlmdCBiaXQgaW4gdGhlIFBoeQogICogU3BlY2lmaWMgU3RhdHVzIHJlZ2lzdGVyLiAgRm9yIElHUCBwaHkncywgaXQgcmVhZHMgdGhlIERvd25ncmFkZSBiaXQgaW4gdGhlCiAgKiBMaW5rIEhlYWx0aCByZWdpc3Rlci4gIEluIElHUCB0aGlzIGJpdCBpcyBsYXRjaGVkIGhpZ2gsIHNvIHRoZSBkcml2ZXIgbXVzdAogICogcmVhZCBpdCBpbW1lZGlhdGVseSBhZnRlciBsaW5rIGlzIGVzdGFibGlzaGVkLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZTEwMDBlL2ljaDhsYW4uYyBiL2RyaXZlcnMvbmV0L2UxMDAwZS9pY2g4bGFuLmMKaW5kZXggZjJhNTk2My4uZTQxNWU4MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZTEwMDBlL2ljaDhsYW4uYworKysgYi9kcml2ZXJzL25ldC9lMTAwMGUvaWNoOGxhbi5jCkBAIC0zOTAsNyArMzkwLDggQEAKIH0KIAogc3RhdGljIERFRklORV9NVVRFWChudm1fbXV0ZXgpOwotc3RhdGljIHBpZF90IG52bV9vd25lciA9IC0xOworc3RhdGljIHBpZF90IG52bV9vd25lcl9waWQgPSAtMTsKK3N0YXRpYyBjaGFyIG52bV9vd25lcl9uYW1lW1RBU0tfQ09NTV9MRU5dID0gIiI7CiAKIC8qKgogICogIGUxMDAwX2FjcXVpcmVfc3dmbGFnX2ljaDhsYW4gLSBBY3F1aXJlIHNvZnR3YXJlIGNvbnRyb2wgZmxhZwpAQCAtNDA4LDExICs0MDksMTUgQEAKIAltaWdodF9zbGVlcCgpOwogCiAJaWYgKCFtdXRleF90cnlsb2NrKCZudm1fbXV0ZXgpKSB7Ci0JCVdBUk4oMSwgS0VSTl9FUlIgImUxMDAwZSBtdXRleCBjb250ZW50aW9uLiBPd25lZCBieSBwaWQgJWRcbiIsCi0JCSAgICAgbnZtX293bmVyKTsKKwkJV0FSTigxLCBLRVJOX0VSUiAiZTEwMDBlIG11dGV4IGNvbnRlbnRpb24uIE93bmVkIGJ5IHByb2Nlc3MgIgorCQkgICAgICIlcyAocGlkICVkKSwgcmVxdWlyZWQgYnkgcHJvY2VzcyAlcyAocGlkICVkKVxuIiwKKwkJICAgICBudm1fb3duZXJfbmFtZSwgbnZtX293bmVyX3BpZCwKKwkJICAgICBjdXJyZW50LT5jb21tLCBjdXJyZW50LT5waWQpOworCiAJCW11dGV4X2xvY2soJm52bV9tdXRleCk7CiAJfQotCW52bV9vd25lciA9IGN1cnJlbnQtPnBpZDsKKwludm1fb3duZXJfcGlkID0gY3VycmVudC0+cGlkOworCXN0cm5jcHkobnZtX293bmVyX25hbWUsIGN1cnJlbnQtPmNvbW0sIFRBU0tfQ09NTV9MRU4pOwogCiAJd2hpbGUgKHRpbWVvdXQpIHsKIAkJZXh0Y25mX2N0cmwgPSBlcjMyKEVYVENORl9DVFJMKTsKQEAgLTQzMCw3ICs0MzUsOCBAQAogCQlod19kYmcoaHcsICJGVyBvciBIVyBoYXMgbG9ja2VkIHRoZSByZXNvdXJjZSBmb3IgdG9vIGxvbmcuXG4iKTsKIAkJZXh0Y25mX2N0cmwgJj0gfkUxMDAwX0VYVENORl9DVFJMX1NXRkxBRzsKIAkJZXczMihFWFRDTkZfQ1RSTCwgZXh0Y25mX2N0cmwpOwotCQludm1fb3duZXIgPSAtMTsKKwkJbnZtX293bmVyX3BpZCA9IC0xOworCQlzdHJjcHkobnZtX293bmVyX25hbWUsICIiKTsKIAkJbXV0ZXhfdW5sb2NrKCZudm1fbXV0ZXgpOwogCQlyZXR1cm4gLUUxMDAwX0VSUl9DT05GSUc7CiAJfQpAQCAtNDU0LDcgKzQ2MCw4IEBACiAJZXh0Y25mX2N0cmwgJj0gfkUxMDAwX0VYVENORl9DVFJMX1NXRkxBRzsKIAlldzMyKEVYVENORl9DVFJMLCBleHRjbmZfY3RybCk7CiAKLQludm1fb3duZXIgPSAtMTsKKwludm1fb3duZXJfcGlkID0gLTE7CisJc3RyY3B5KG52bV9vd25lcl9uYW1lLCAiIik7CiAJbXV0ZXhfdW5sb2NrKCZudm1fbXV0ZXgpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9lMTAwMGUvbmV0ZGV2LmMgYi9kcml2ZXJzL25ldC9lMTAwMGUvbmV0ZGV2LmMKaW5kZXggZDQ2MzlmYS4uOTE4MTdkMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZTEwMDBlL25ldGRldi5jCisrKyBiL2RyaXZlcnMvbmV0L2UxMDAwZS9uZXRkZXYuYwpAQCAtNDgwNyw3ICs0ODA3LDcgQEAKIAkJfQogCX0KIAotCWVyciA9IHBjaV9yZXF1ZXN0X3NlbGVjdGVkX3JlZ2lvbnMocGRldiwKKwllcnIgPSBwY2lfcmVxdWVzdF9zZWxlY3RlZF9yZWdpb25zX2V4Y2x1c2l2ZShwZGV2LAogCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwY2lfc2VsZWN0X2JhcnMocGRldiwgSU9SRVNPVVJDRV9NRU0pLAogCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlMTAwMGVfZHJpdmVyX25hbWUpOwogCWlmIChlcnIpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9lMjEwMC5jIGIvZHJpdmVycy9uZXQvZTIxMDAuYwppbmRleCAyMGViMDVjLi5iMDdiYTE5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9lMjEwMC5jCisrKyBiL2RyaXZlcnMvbmV0L2UyMTAwLmMKQEAgLTE2OSw2ICsxNjksNyBAQAogCS5uZG9fZ2V0X3N0YXRzCQk9IGVpX2dldF9zdGF0cywKIAkubmRvX3NldF9tdWx0aWNhc3RfbGlzdCA9IGVpX3NldF9tdWx0aWNhc3RfbGlzdCwKIAkubmRvX3ZhbGlkYXRlX2FkZHIJPSBldGhfdmFsaWRhdGVfYWRkciwKKwkubmRvX3NldF9tYWNfYWRkcmVzcyAJPSBldGhfbWFjX2FkZHIsCiAJLm5kb19jaGFuZ2VfbXR1CQk9IGV0aF9jaGFuZ2VfbXR1LAogI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCiAJLm5kb19wb2xsX2NvbnRyb2xsZXIgCT0gZWlfcG9sbCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2VoZWEvZWhlYV9tYWluLmMgYi9kcml2ZXJzL25ldC9laGVhL2VoZWFfbWFpbi5jCmluZGV4IGUzMTMxZWEuLmRmZTkyMjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2VoZWEvZWhlYV9tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvZWhlYS9laGVhX21haW4uYwpAQCAtMTMyLDcgKzEzMiw3IEBACiAJaW50IHg7CiAJdW5zaWduZWQgY2hhciAqZGViID0gYWRyOwogCWZvciAoeCA9IDA7IHggPCBsZW47IHggKz0gMTYpIHsKLQkJcHJpbnRrKERSVl9OQU1FICIgJXMgYWRyPSVwIG9mcz0lMDR4ICUwMTZseCAlMDE2bHhcbiIsIG1zZywKKwkJcHJpbnRrKERSVl9OQU1FICIgJXMgYWRyPSVwIG9mcz0lMDR4ICUwMTZsbHggJTAxNmxseFxuIiwgbXNnLAogCQkJICBkZWIsIHgsICooKHU2NCAqKSZkZWJbMF0pLCAqKCh1NjQgKikmZGViWzhdKSk7CiAJCWRlYiArPSAxNjsKIAl9CkBAIC04ODMsNyArODgzLDcgQEAKIAogCXdoaWxlIChlcWUpIHsKIAkJcXBfdG9rZW4gPSBFSEVBX0JNQVNLX0dFVChFSEVBX0VRRV9RUF9UT0tFTiwgZXFlLT5lbnRyeSk7Ci0JCWVoZWFfZXJyb3IoIlFQIGFmZl9lcnI6IGVudHJ5PTB4JWx4LCB0b2tlbj0weCV4IiwKKwkJZWhlYV9lcnJvcigiUVAgYWZmX2VycjogZW50cnk9MHglbGx4LCB0b2tlbj0weCV4IiwKIAkJCSAgIGVxZS0+ZW50cnksIHFwX3Rva2VuKTsKIAogCQlxcCA9IHBvcnQtPnBvcnRfcmVzW3FwX3Rva2VuXS5xcDsKQEAgLTExNTksNyArMTE1OSw3IEBACiAJCW5ldGlmX3N0b3BfcXVldWUocG9ydC0+bmV0ZGV2KTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJZWhlYV9lcnJvcigidW5rbm93biBldmVudCBjb2RlICV4LCBlcWU9MHglbFgiLCBlYywgZXFlKTsKKwkJZWhlYV9lcnJvcigidW5rbm93biBldmVudCBjb2RlICV4LCBlcWU9MHglbGxYIiwgZWMsIGVxZSk7CiAJCWJyZWFrOwogCX0KIH0KQEAgLTE5NzEsNyArMTk3MSw3IEBACiAJCX0KIAogCQlpZiAoZGV2LT5tY19jb3VudCA+IHBvcnQtPmFkYXB0ZXItPm1heF9tY19tYWMpIHsKLQkJCWVoZWFfaW5mbygiTWNhc3QgcmVnaXN0cmF0aW9uIGxpbWl0IHJlYWNoZWQgKDB4JWx4KS4gIgorCQkJZWhlYV9pbmZvKCJNY2FzdCByZWdpc3RyYXRpb24gbGltaXQgcmVhY2hlZCAoMHglbGx4KS4gIgogCQkJCSAgIlVzZSBBTExNVUxUSSEiLAogCQkJCSAgcG9ydC0+YWRhcHRlci0+bWF4X21jX21hYyk7CiAJCQlnb3RvIG91dDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2VoZWEvZWhlYV9waHlwLmMgYi9kcml2ZXJzL25ldC9laGVhL2VoZWFfcGh5cC5jCmluZGV4IDJhMzNhNjEuLjhmZTlkY2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2VoZWEvZWhlYV9waHlwLmMKKysrIGIvZHJpdmVycy9uZXQvZWhlYS9laGVhX3BoeXAuYwpAQCAtMjE0LDcgKzIxNCw3IEBACiAJCQkgICAgIHU2NCAqcXBfaGFuZGxlLCBzdHJ1Y3QgaF9lcGFzICpoX2VwYXMpCiB7CiAJdTY0IGhyZXQ7Ci0JdTY0IG91dHNbUExQQVJfSENBTEw5X0JVRlNJWkVdOworCXVuc2lnbmVkIGxvbmcgb3V0c1tQTFBBUl9IQ0FMTDlfQlVGU0laRV07CiAKIAl1NjQgYWxsb2NhdGVfY29udHJvbHMgPQogCSAgICBFSEVBX0JNQVNLX1NFVChIX0FMTF9SRVNfUVBfRVFQTywgaW5pdF9hdHRyLT5sb3dfbGF0X3JxMSA/IDEgOiAwKQpAQCAtMzEyLDcgKzMxMiw3IEBACiAJCQkgICAgIHU2NCAqY3FfaGFuZGxlLCBzdHJ1Y3QgaF9lcGFzICplcGFzKQogewogCXU2NCBocmV0OwotCXU2NCBvdXRzW1BMUEFSX0hDQUxMOV9CVUZTSVpFXTsKKwl1bnNpZ25lZCBsb25nIG91dHNbUExQQVJfSENBTEw5X0JVRlNJWkVdOwogCiAJaHJldCA9IGVoZWFfcGxwYXJfaGNhbGw5KEhfQUxMT0NfSEVBX1JFU09VUkNFLAogCQkJCSBvdXRzLApAQCAtMzc0LDcgKzM3NCw3IEBACiAJCQkgICAgIHN0cnVjdCBlaGVhX2VxX2F0dHIgKmVxX2F0dHIsIHU2NCAqZXFfaGFuZGxlKQogewogCXU2NCBocmV0LCBhbGxvY2F0ZV9jb250cm9sczsKLQl1NjQgb3V0c1tQTFBBUl9IQ0FMTDlfQlVGU0laRV07CisJdW5zaWduZWQgbG9uZyBvdXRzW1BMUEFSX0hDQUxMOV9CVUZTSVpFXTsKIAogCS8qIHJlc291cmNlIHR5cGUgKi8KIAlhbGxvY2F0ZV9jb250cm9scyA9CkBAIC00MDcsNyArNDA3LDcgQEAKIAkJCSAgdTE2ICpvdXRfc3dyLCB1MTYgKm91dF9yd3IpCiB7CiAJdTY0IGhyZXQ7Ci0JdTY0IG91dHNbUExQQVJfSENBTEw5X0JVRlNJWkVdOworCXVuc2lnbmVkIGxvbmcgb3V0c1tQTFBBUl9IQ0FMTDlfQlVGU0laRV07CiAKIAlocmV0ID0gZWhlYV9wbHBhcl9oY2FsbDkoSF9NT0RJRllfSEVBX1FQLAogCQkJCSBvdXRzLApAQCAtNDQ5LDcgKzQ0OSw3IEBACiAJCQlzdHJ1Y3QgZWhlYV9tciAqbXIpCiB7CiAJdTY0IGhyZXQ7Ci0JdTY0IG91dHNbUExQQVJfSENBTEw5X0JVRlNJWkVdOworCXVuc2lnbmVkIGxvbmcgb3V0c1tQTFBBUl9IQ0FMTDlfQlVGU0laRV07CiAKIAlocmV0ID0gZWhlYV9wbHBhcl9oY2FsbDkoSF9SRUdJU1RFUl9TTVIsCiAJCQkJIG91dHMsCkBAIC00NjgsNyArNDY4LDcgQEAKIAogdTY0IGVoZWFfaF9kaXNhYmxlX2FuZF9nZXRfaGVhKGNvbnN0IHU2NCBhZGFwdGVyX2hhbmRsZSwgY29uc3QgdTY0IHFwX2hhbmRsZSkKIHsKLQl1NjQgb3V0c1tQTFBBUl9IQ0FMTDlfQlVGU0laRV07CisJdW5zaWduZWQgbG9uZyBvdXRzW1BMUEFSX0hDQUxMOV9CVUZTSVpFXTsKIAogCXJldHVybiBlaGVhX3BscGFyX2hjYWxsOShIX0RJU0FCTEVfQU5EX0dFVF9IRUEsCiAJCQkJIG91dHMsCkBAIC00OTMsNyArNDkzLDcgQEAKIAkJCSAgICAgY29uc3QgdTMyIHBkLCB1NjQgKm1yX2hhbmRsZSwgdTMyICpsa2V5KQogewogCXU2NCBocmV0OwotCXU2NCBvdXRzW1BMUEFSX0hDQUxMOV9CVUZTSVpFXTsKKwl1bnNpZ25lZCBsb25nIG91dHNbUExQQVJfSENBTEw5X0JVRlNJWkVdOwogCiAJaHJldCA9IGVoZWFfcGxwYXJfaGNhbGw5KEhfQUxMT0NfSEVBX1JFU09VUkNFLAogCQkJCSBvdXRzLApAQCAtNTY0LDcgKzU2NCw3IEBACiAJCQkgICAgY29uc3QgdTggY2JfY2F0LCBjb25zdCB1NjQgc2VsZWN0X21hc2ssCiAJCQkgICAgdm9pZCAqY2JfYWRkcikKIHsKLQl1NjQgb3V0c1tQTFBBUl9IQ0FMTDlfQlVGU0laRV07CisJdW5zaWduZWQgbG9uZyBvdXRzW1BMUEFSX0hDQUxMOV9CVUZTSVpFXTsKIAl1NjQgcG9ydF9pbmZvOwogCXU2NCBhcnJfaW5kZXggPSAwOwogCXU2NCBjYl9sb2dhZGRyID0gdmlydF90b19hYnMoY2JfYWRkcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9laGVhL2VoZWFfcW1yLmMgYi9kcml2ZXJzL25ldC9laGVhL2VoZWFfcW1yLmMKaW5kZXggMjI1YzY5Mi4uNDlkNzY2ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZWhlYS9laGVhX3Ftci5jCisrKyBiL2RyaXZlcnMvbmV0L2VoZWEvZWhlYV9xbXIuYwpAQCAtMTY4LDcgKzE2OCw3IEBACiAJCQkJCSAgICAgY3EtPmZ3X2hhbmRsZSwgcnBhZ2UsIDEpOwogCQlpZiAoaHJldCA8IEhfU1VDQ0VTUykgewogCQkJZWhlYV9lcnJvcigicmVnaXN0ZXJfcnBhZ2VfY3EgZmFpbGVkIGVoZWFfY3E9JXAgIgotCQkJCSAgICJocmV0PSVseCBjb3VudGVyPSVpIGFjdF9wYWdlcz0laSIsCisJCQkJICAgImhyZXQ9JWxseCBjb3VudGVyPSVpIGFjdF9wYWdlcz0laSIsCiAJCQkJICAgY3EsIGhyZXQsIGNvdW50ZXIsIGNxLT5hdHRyLm5yX3BhZ2VzKTsKIAkJCWdvdG8gb3V0X2tpbGxfaHdxOwogCQl9CkBAIC0xNzgsMTMgKzE3OCwxMyBAQAogCiAJCQlpZiAoKGhyZXQgIT0gSF9TVUNDRVNTKSB8fCAodnBhZ2UpKSB7CiAJCQkJZWhlYV9lcnJvcigicmVnaXN0cmF0aW9uIG9mIHBhZ2VzIG5vdCAiCi0JCQkJCSAgICJjb21wbGV0ZSBocmV0PSVseFxuIiwgaHJldCk7CisJCQkJCSAgICJjb21wbGV0ZSBocmV0PSVsbHhcbiIsIGhyZXQpOwogCQkJCWdvdG8gb3V0X2tpbGxfaHdxOwogCQkJfQogCQl9IGVsc2UgewogCQkJaWYgKGhyZXQgIT0gSF9QQUdFX1JFR0lTVEVSRUQpIHsKIAkJCQllaGVhX2Vycm9yKCJDUTogcmVnaXN0cmF0aW9uIG9mIHBhZ2UgZmFpbGVkICIKLQkJCQkJICAgImhyZXQ9JWx4XG4iLCBocmV0KTsKKwkJCQkJICAgImhyZXQ9JWxseFxuIiwgaHJldCk7CiAJCQkJZ290byBvdXRfa2lsbF9od3E7CiAJCQl9CiAJCX0KQEAgLTk4NiwxNSArOTg2LDE1IEBACiAJCWxlbmd0aCA9IEVIRUFfUEFHRVNJWkU7CiAKIAlpZiAodHlwZSA9PSAweDgpIC8qIFF1ZXVlIFBhaXIgKi8KLQkJZWhlYV9lcnJvcigiUVAgKHJlc291cmNlPSVsWCkgc3RhdGU6IEFFUj0weCVsWCwgQUVSUj0weCVsWCwgIgotCQkJICAgInBvcnQ9JWxYIiwgcmVzb3VyY2UsIGRhdGFbNl0sIGRhdGFbMTJdLCBkYXRhWzIyXSk7CisJCWVoZWFfZXJyb3IoIlFQIChyZXNvdXJjZT0lbGxYKSBzdGF0ZTogQUVSPTB4JWxsWCwgQUVSUj0weCVsbFgsICIKKwkJCSAgICJwb3J0PSVsbFgiLCByZXNvdXJjZSwgZGF0YVs2XSwgZGF0YVsxMl0sIGRhdGFbMjJdKTsKIAogCWlmICh0eXBlID09IDB4NCkgLyogQ29tcGxldGlvbiBRdWV1ZSAqLwotCQllaGVhX2Vycm9yKCJDUSAocmVzb3VyY2U9JWxYKSBzdGF0ZTogQUVSPTB4JWxYIiwgcmVzb3VyY2UsCisJCWVoZWFfZXJyb3IoIkNRIChyZXNvdXJjZT0lbGxYKSBzdGF0ZTogQUVSPTB4JWxsWCIsIHJlc291cmNlLAogCQkJICAgZGF0YVs2XSk7CiAKIAlpZiAodHlwZSA9PSAweDMpIC8qIEV2ZW50IFF1ZXVlICovCi0JCWVoZWFfZXJyb3IoIkVRIChyZXNvdXJjZT0lbFgpIHN0YXRlOiBBRVI9MHglbFgiLCByZXNvdXJjZSwKKwkJZWhlYV9lcnJvcigiRVEgKHJlc291cmNlPSVsbFgpIHN0YXRlOiBBRVI9MHglbGxYIiwgcmVzb3VyY2UsCiAJCQkgICBkYXRhWzZdKTsKIAogCWVoZWFfZHVtcChkYXRhLCBsZW5ndGgsICJlcnJvciBkYXRhIik7CkBAIC0xMDE2LDExICsxMDE2LDExIEBACiAJCQkJcmJsb2NrKTsKIAogCWlmIChyZXQgPT0gSF9SX1NUQVRFKQotCQllaGVhX2Vycm9yKCJObyBlcnJvciBkYXRhIGlzIGF2YWlsYWJsZTogJWxYLiIsIHJlc19oYW5kbGUpOworCQllaGVhX2Vycm9yKCJObyBlcnJvciBkYXRhIGlzIGF2YWlsYWJsZTogJWxsWC4iLCByZXNfaGFuZGxlKTsKIAllbHNlIGlmIChyZXQgPT0gSF9TVUNDRVNTKQogCQlwcmludF9lcnJvcl9kYXRhKHJibG9jayk7CiAJZWxzZQotCQllaGVhX2Vycm9yKCJFcnJvciBkYXRhIGNvdWxkIG5vdCBiZSBmZXRjaGVkOiAlbFgiLCByZXNfaGFuZGxlKTsKKwkJZWhlYV9lcnJvcigiRXJyb3IgZGF0YSBjb3VsZCBub3QgYmUgZmV0Y2hlZDogJWxsWCIsIHJlc19oYW5kbGUpOwogCiAJa2ZyZWUocmJsb2NrKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2VuYzI4ajYwLmMgYi9kcml2ZXJzL25ldC9lbmMyOGo2MC5jCmluZGV4IGNlZmUxZDkuLmZjNmNjMDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2VuYzI4ajYwLmMKKysrIGIvZHJpdmVycy9uZXQvZW5jMjhqNjAuYwpAQCAtMTUzMSw2ICsxNTMxLDE3IEBACiAJcmV0dXJuIGVuYzI4ajYwX2h3X2luaXQocHJpdik7CiB9CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgZW5jMjhqNjBfbmV0ZGV2X29wcyA9IHsKKwkubmRvX29wZW4JCT0gZW5jMjhqNjBfbmV0X29wZW4sCisJLm5kb19zdG9wCQk9IGVuYzI4ajYwX25ldF9jbG9zZSwKKwkubmRvX3N0YXJ0X3htaXQJCT0gZW5jMjhqNjBfc2VuZF9wYWNrZXQsCisJLm5kb19zZXRfbXVsdGljYXN0X2xpc3QgPSBlbmMyOGo2MF9zZXRfbXVsdGljYXN0X2xpc3QsCisJLm5kb19zZXRfbWFjX2FkZHJlc3MJPSBlbmMyOGo2MF9zZXRfbWFjX2FkZHJlc3MsCisJLm5kb190eF90aW1lb3V0CQk9IGVuYzI4ajYwX3R4X3RpbWVvdXQsCisJLm5kb19jaGFuZ2VfbXR1CQk9IGV0aF9jaGFuZ2VfbXR1LAorCS5uZG9fdmFsaWRhdGVfYWRkcgk9IGV0aF92YWxpZGF0ZV9hZGRyLAorfTsKKwogc3RhdGljIGludCBfX2RldmluaXQgZW5jMjhqNjBfcHJvYmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OwpAQCAtMTU4NSwxMiArMTU5Niw3IEBACiAKIAlkZXYtPmlmX3BvcnQgPSBJRl9QT1JUXzEwQkFTRVQ7CiAJZGV2LT5pcnEgPSBzcGktPmlycTsKLQlkZXYtPm9wZW4gPSBlbmMyOGo2MF9uZXRfb3BlbjsKLQlkZXYtPnN0b3AgPSBlbmMyOGo2MF9uZXRfY2xvc2U7Ci0JZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSBlbmMyOGo2MF9zZW5kX3BhY2tldDsKLQlkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9ICZlbmMyOGo2MF9zZXRfbXVsdGljYXN0X2xpc3Q7Ci0JZGV2LT5zZXRfbWFjX2FkZHJlc3MgPSBlbmMyOGo2MF9zZXRfbWFjX2FkZHJlc3M7Ci0JZGV2LT50eF90aW1lb3V0ID0gJmVuYzI4ajYwX3R4X3RpbWVvdXQ7CisJZGV2LT5uZXRkZXZfb3BzID0gJmVuYzI4ajYwX25ldGRldl9vcHM7CiAJZGV2LT53YXRjaGRvZ190aW1lbyA9IFRYX1RJTUVPVVQ7CiAJU0VUX0VUSFRPT0xfT1BTKGRldiwgJmVuYzI4ajYwX2V0aHRvb2xfb3BzKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZW5pYy9lbmljX21haW4uYyBiL2RyaXZlcnMvbmV0L2VuaWMvZW5pY19tYWluLmMKaW5kZXggZDAzOWUxNi4uN2Q2MDU1MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZW5pYy9lbmljX21haW4uYworKysgYi9kcml2ZXJzL25ldC9lbmljL2VuaWNfbWFpbi5jCkBAIC0xNTk5LDYgKzE1OTksNyBAQAogCS5uZG9fc3RhcnRfeG1pdAkJPSBlbmljX2hhcmRfc3RhcnRfeG1pdCwKIAkubmRvX2dldF9zdGF0cwkJPSBlbmljX2dldF9zdGF0cywKIAkubmRvX3ZhbGlkYXRlX2FkZHIJPSBldGhfdmFsaWRhdGVfYWRkciwKKwkubmRvX3NldF9tYWNfYWRkcmVzcyAJPSBldGhfbWFjX2FkZHIsCiAJLm5kb19zZXRfbXVsdGljYXN0X2xpc3QJPSBlbmljX3NldF9tdWx0aWNhc3RfbGlzdCwKIAkubmRvX2NoYW5nZV9tdHUJCT0gZW5pY19jaGFuZ2VfbXR1LAogCS5uZG9fdmxhbl9yeF9yZWdpc3Rlcgk9IGVuaWNfdmxhbl9yeF9yZWdpc3RlciwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2VwaWMxMDAuYyBiL2RyaXZlcnMvbmV0L2VwaWMxMDAuYwppbmRleCBmOWIzN2M4Li5hNTM5YmMzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9lcGljMTAwLmMKKysrIGIvZHJpdmVycy9uZXQvZXBpYzEwMC5jCkBAIC0zMDgsNyArMzA4LDE4IEBACiBzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmVwaWNfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogc3RhdGljIHZvaWQgc2V0X3J4X21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiAKLQorc3RhdGljIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyBlcGljX25ldGRldl9vcHMgPSB7CisJLm5kb19vcGVuCQk9IGVwaWNfb3BlbiwKKwkubmRvX3N0b3AJCT0gZXBpY19jbG9zZSwKKwkubmRvX3N0YXJ0X3htaXQJCT0gZXBpY19zdGFydF94bWl0LAorCS5uZG9fdHhfdGltZW91dCAJPSBlcGljX3R4X3RpbWVvdXQsCisJLm5kb19nZXRfc3RhdHMJCT0gZXBpY19nZXRfc3RhdHMsCisJLm5kb19zZXRfbXVsdGljYXN0X2xpc3QgPSBzZXRfcnhfbW9kZSwKKwkubmRvX2RvX2lvY3RsIAkJPSBuZXRkZXZfaW9jdGwsCisJLm5kb19jaGFuZ2VfbXR1CQk9IGV0aF9jaGFuZ2VfbXR1LAorCS5uZG9fc2V0X21hY19hZGRyZXNzIAk9IGV0aF9tYWNfYWRkciwKKwkubmRvX3ZhbGlkYXRlX2FkZHIJPSBldGhfdmFsaWRhdGVfYWRkciwKK307CiAKIHN0YXRpYyBpbnQgX19kZXZpbml0IGVwaWNfaW5pdF9vbmUgKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAogCQkJCSAgICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQpAQCAtNDgzLDE1ICs0OTQsOSBAQAogCWRldi0+aWZfcG9ydCA9IGVwLT5kZWZhdWx0X3BvcnQgPSBvcHRpb247CiAKIAkvKiBUaGUgRXBpYy1zcGVjaWZpYyBlbnRyaWVzIGluIHRoZSBkZXZpY2Ugc3RydWN0dXJlLiAqLwotCWRldi0+b3BlbiA9ICZlcGljX29wZW47Ci0JZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSAmZXBpY19zdGFydF94bWl0OwotCWRldi0+c3RvcCA9ICZlcGljX2Nsb3NlOwotCWRldi0+Z2V0X3N0YXRzID0gJmVwaWNfZ2V0X3N0YXRzOwotCWRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gJnNldF9yeF9tb2RlOwotCWRldi0+ZG9faW9jdGwgPSAmbmV0ZGV2X2lvY3RsOworCWRldi0+bmV0ZGV2X29wcyA9ICZlcGljX25ldGRldl9vcHM7CiAJZGV2LT5ldGh0b29sX29wcyA9ICZuZXRkZXZfZXRodG9vbF9vcHM7CiAJZGV2LT53YXRjaGRvZ190aW1lbyA9IFRYX1RJTUVPVVQ7Ci0JZGV2LT50eF90aW1lb3V0ID0gJmVwaWNfdHhfdGltZW91dDsKIAluZXRpZl9uYXBpX2FkZChkZXYsICZlcC0+bmFwaSwgZXBpY19wb2xsLCA2NCk7CiAKIAlyZXQgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2ZlYWxueC5jIGIvZHJpdmVycy9uZXQvZmVhbG54LmMKaW5kZXggMzFhYjFmZi4uZGFmNzI3MmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2ZlYWxueC5jCisrKyBiL2RyaXZlcnMvbmV0L2ZlYWxueC5jCkBAIC00NjcsNiArNDY3LDE4IEBACiAJfQogfQogCitzdGF0aWMgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzIG5ldGRldl9vcHMgPSB7CisJLm5kb19vcGVuCQk9IG5ldGRldl9vcGVuLAorCS5uZG9fc3RvcAkJPSBuZXRkZXZfY2xvc2UsCisJLm5kb19zdGFydF94bWl0CQk9IHN0YXJ0X3R4LAorCS5uZG9fZ2V0X3N0YXRzIAkJPSBnZXRfc3RhdHMsCisJLm5kb19zZXRfbXVsdGljYXN0X2xpc3QgPSBzZXRfcnhfbW9kZSwKKwkubmRvX2RvX2lvY3RsCQk9IG1paV9pb2N0bCwKKwkubmRvX3R4X3RpbWVvdXQJCT0gZmVhbG54X3R4X3RpbWVvdXQsCisJLm5kb19jaGFuZ2VfbXR1CQk9IGV0aF9jaGFuZ2VfbXR1LAorCS5uZG9fc2V0X21hY19hZGRyZXNzIAk9IGV0aF9tYWNfYWRkciwKKwkubmRvX3ZhbGlkYXRlX2FkZHIJPSBldGhfdmFsaWRhdGVfYWRkciwKK307CiAKIHN0YXRpYyBpbnQgX19kZXZpbml0IGZlYWxueF9pbml0X29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwKIAkJCQkgICAgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCkBAIC02NDksMTUgKzY2MSw4IEBACiAJCW5wLT5taWkuZm9yY2VfbWVkaWEgPSAxOwogCX0KIAotCS8qIFRoZSBjaGlwLXNwZWNpZmljIGVudHJpZXMgaW4gdGhlIGRldmljZSBzdHJ1Y3R1cmUuICovCi0JZGV2LT5vcGVuID0gJm5ldGRldl9vcGVuOwotCWRldi0+aGFyZF9zdGFydF94bWl0ID0gJnN0YXJ0X3R4OwotCWRldi0+c3RvcCA9ICZuZXRkZXZfY2xvc2U7Ci0JZGV2LT5nZXRfc3RhdHMgPSAmZ2V0X3N0YXRzOwotCWRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gJnNldF9yeF9tb2RlOwotCWRldi0+ZG9faW9jdGwgPSAmbWlpX2lvY3RsOworCWRldi0+bmV0ZGV2X29wcyA9ICZuZXRkZXZfb3BzOwogCWRldi0+ZXRodG9vbF9vcHMgPSAmbmV0ZGV2X2V0aHRvb2xfb3BzOwotCWRldi0+dHhfdGltZW91dCA9ICZmZWFsbnhfdHhfdGltZW91dDsKIAlkZXYtPndhdGNoZG9nX3RpbWVvID0gVFhfVElNRU9VVDsKIAogCWVyciA9IHJlZ2lzdGVyX25ldGRldihkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZm9yY2VkZXRoLmMgYi9kcml2ZXJzL25ldC9mb3JjZWRldGguYwppbmRleCA1YjY4ZGMyLi41YjkxMGNmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9mb3JjZWRldGguYworKysgYi9kcml2ZXJzL25ldC9mb3JjZWRldGguYwpAQCAtMTMsNyArMTMsNyBAQAogICogQ29weXJpZ2h0IChDKSAyMDA0IEFuZHJldyBkZSBRdWluY2V5ICh3b2wgc3VwcG9ydCkKICAqIENvcHlyaWdodCAoQykgMjAwNCBDYXJsLURhbmllbCBIYWlsZmluZ2VyIChpbnZhbGlkIE1BQyBoYW5kbGluZywgaW5zYW5lCiAgKgkJSVJRIHJhdGUgZml4ZXMsIGJpZ2VuZGlhbiBmaXhlcywgY2xlYW51cHMsIHZlcmlmaWNhdGlvbikKLSAqIENvcHlyaWdodCAoYykgMjAwNCwyMDA1LDIwMDYsMjAwNywyMDA4IE5WSURJQSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChjKSAyMDA0LDIwMDUsMjAwNiwyMDA3LDIwMDgsMjAwOSBOVklESUEgQ29ycG9yYXRpb24KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKQEAgLTM5LDcgKzM5LDcgQEAKICAqIERFVl9ORUVEX1RJTUVSSVJRIHdpbGwgbm90IGhhcm0geW91IG9uIHNhbmUgaGFyZHdhcmUsIG9ubHkgZ2VuZXJhdGluZyBhIGZldwogICogc3VwZXJmbHVvdXMgdGltZXIgaW50ZXJydXB0cyBmcm9tIHRoZSBuaWMuCiAgKi8KLSNkZWZpbmUgRk9SQ0VERVRIX1ZFUlNJT04JCSIwLjYxIgorI2RlZmluZSBGT1JDRURFVEhfVkVSU0lPTgkJIjAuNjIiCiAjZGVmaW5lIERSVl9OQU1FCQkJImZvcmNlZGV0aCIKIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgpAQCAtMjA5NiwxNCArMjA5NiwxNSBAQAogCQkJICAgKChza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2ldLnNpemUgJiAoTlZfVFgyX1RTT19NQVhfU0laRS0xKSkgPyAxIDogMCk7CiAJfQogCisJc3Bpbl9sb2NrX2lycXNhdmUoJm5wLT5sb2NrLCBmbGFncyk7CiAJZW1wdHlfc2xvdHMgPSBudl9nZXRfZW1wdHlfdHhfc2xvdHMobnApOwogCWlmICh1bmxpa2VseShlbXB0eV9zbG90cyA8PSBlbnRyaWVzKSkgewotCQlzcGluX2xvY2tfaXJxc2F2ZSgmbnAtPmxvY2ssIGZsYWdzKTsKIAkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOwogCQlucC0+dHhfc3RvcCA9IDE7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm5wLT5sb2NrLCBmbGFncyk7CiAJCXJldHVybiBORVRERVZfVFhfQlVTWTsKIAl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbnAtPmxvY2ssIGZsYWdzKTsKIAogCXN0YXJ0X3R4ID0gcHV0X3R4ID0gbnAtPnB1dF90eC5vcmlnOwogCkBAIC0yMjE0LDE0ICsyMjE1LDE1IEBACiAJCQkgICAoKHNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaV0uc2l6ZSAmIChOVl9UWDJfVFNPX01BWF9TSVpFLTEpKSA/IDEgOiAwKTsKIAl9CiAKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbnAtPmxvY2ssIGZsYWdzKTsKIAllbXB0eV9zbG90cyA9IG52X2dldF9lbXB0eV90eF9zbG90cyhucCk7CiAJaWYgKHVubGlrZWx5KGVtcHR5X3Nsb3RzIDw9IGVudHJpZXMpKSB7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZucC0+bG9jaywgZmxhZ3MpOwogCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CiAJCW5wLT50eF9zdG9wID0gMTsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbnAtPmxvY2ssIGZsYWdzKTsKIAkJcmV0dXJuIE5FVERFVl9UWF9CVVNZOwogCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZucC0+bG9jaywgZmxhZ3MpOwogCiAJc3RhcnRfdHggPSBwdXRfdHggPSBucC0+cHV0X3R4LmV4OwogCXN0YXJ0X3R4X2N0eCA9IG5wLT5wdXRfdHhfY3R4OwpAQCAtMzQwMywxMCArMzQwNSwxMCBAQAogCiAjaWZkZWYgQ09ORklHX0ZPUkNFREVUSF9OQVBJCiAJCWlmIChldmVudHMgJiBOVlJFR19JUlFfUlhfQUxMKSB7CisJCQlzcGluX2xvY2soJm5wLT5sb2NrKTsKIAkJCW5ldGlmX3J4X3NjaGVkdWxlKCZucC0+bmFwaSk7CiAKIAkJCS8qIERpc2FibGUgZnVydGh1ciByZWNlaXZlIGlycSdzICovCi0JCQlzcGluX2xvY2soJm5wLT5sb2NrKTsKIAkJCW5wLT5pcnFtYXNrICY9IH5OVlJFR19JUlFfUlhfQUxMOwogCiAJCQlpZiAobnAtPm1zaV9mbGFncyAmIE5WX01TSV9YX0VOQUJMRUQpCkBAIC0zNTIwLDEwICszNTIyLDEwIEBACiAKICNpZmRlZiBDT05GSUdfRk9SQ0VERVRIX05BUEkKIAkJaWYgKGV2ZW50cyAmIE5WUkVHX0lSUV9SWF9BTEwpIHsKKwkJCXNwaW5fbG9jaygmbnAtPmxvY2spOwogCQkJbmV0aWZfcnhfc2NoZWR1bGUoJm5wLT5uYXBpKTsKIAogCQkJLyogRGlzYWJsZSBmdXJ0aHVyIHJlY2VpdmUgaXJxJ3MgKi8KLQkJCXNwaW5fbG9jaygmbnAtPmxvY2spOwogCQkJbnAtPmlycW1hc2sgJj0gfk5WUkVHX0lSUV9SWF9BTEw7CiAKIAkJCWlmIChucC0+bXNpX2ZsYWdzICYgTlZfTVNJX1hfRU5BQkxFRCkKQEAgLTYxNjcsMTkgKzYxNjksMTkgQEAKIAl9LAogCXsJLyogTUNQNzkgRXRoZXJuZXQgQ29udHJvbGxlciAqLwogCQlQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfTlZJRElBLCBQQ0lfREVWSUNFX0lEX05WSURJQV9OVkVORVRfMzYpLAotCQkuZHJpdmVyX2RhdGEgPSBERVZfTkVFRF9MSU5LVElNRVJ8REVWX0hBU19MQVJHRURFU0N8REVWX0hBU19DSEVDS1NVTXxERVZfSEFTX0hJR0hfRE1BfERFVl9IQVNfTVNJfERFVl9IQVNfUE9XRVJfQ05UUkx8REVWX0hBU19QQVVTRUZSQU1FX1RYX1YzfERFVl9IQVNfU1RBVElTVElDU19WM3xERVZfSEFTX1RFU1RfRVhURU5ERUR8REVWX0hBU19NR01UX1VOSVR8REVWX0hBU19DT1JSRUNUX01BQ0FERFJ8REVWX0hBU19DT0xMSVNJT05fRklYfERFVl9ORUVEX1RYX0xJTUlUfERFVl9IQVNfR0VBUl9NT0RFLAorCQkuZHJpdmVyX2RhdGEgPSBERVZfTkVFRF9MSU5LVElNRVJ8REVWX0hBU19MQVJHRURFU0N8REVWX0hBU19DSEVDS1NVTXxERVZfSEFTX0hJR0hfRE1BfERFVl9IQVNfTVNJfERFVl9IQVNfUE9XRVJfQ05UUkx8REVWX0hBU19QQVVTRUZSQU1FX1RYX1YzfERFVl9IQVNfU1RBVElTVElDU19WM3xERVZfSEFTX1RFU1RfRVhURU5ERUR8REVWX0hBU19DT1JSRUNUX01BQ0FERFJ8REVWX0hBU19DT0xMSVNJT05fRklYfERFVl9ORUVEX1RYX0xJTUlUfERFVl9IQVNfR0VBUl9NT0RFLAogCX0sCiAJewkvKiBNQ1A3OSBFdGhlcm5ldCBDb250cm9sbGVyICovCiAJCVBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9OVklESUEsIFBDSV9ERVZJQ0VfSURfTlZJRElBX05WRU5FVF8zNyksCi0JCS5kcml2ZXJfZGF0YSA9IERFVl9ORUVEX1RJTUVSSVJRfERFVl9ORUVEX0xJTktUSU1FUnxERVZfSEFTX0xBUkdFREVTQ3xERVZfSEFTX0NIRUNLU1VNfERFVl9IQVNfSElHSF9ETUF8REVWX0hBU19NU0l8REVWX0hBU19QT1dFUl9DTlRSTHxERVZfSEFTX1BBVVNFRlJBTUVfVFhfVjN8REVWX0hBU19TVEFUSVNUSUNTX1YzfERFVl9IQVNfVEVTVF9FWFRFTkRFRHxERVZfSEFTX01HTVRfVU5JVHxERVZfSEFTX0NPUlJFQ1RfTUFDQUREUnxERVZfSEFTX0NPTExJU0lPTl9GSVh8REVWX05FRURfVFhfTElNSVR8REVWX0hBU19HRUFSX01PREUsCisJCS5kcml2ZXJfZGF0YSA9IERFVl9ORUVEX1RJTUVSSVJRfERFVl9ORUVEX0xJTktUSU1FUnxERVZfSEFTX0xBUkdFREVTQ3xERVZfSEFTX0NIRUNLU1VNfERFVl9IQVNfSElHSF9ETUF8REVWX0hBU19NU0l8REVWX0hBU19QT1dFUl9DTlRSTHxERVZfSEFTX1BBVVNFRlJBTUVfVFhfVjN8REVWX0hBU19TVEFUSVNUSUNTX1YzfERFVl9IQVNfVEVTVF9FWFRFTkRFRHxERVZfSEFTX0NPUlJFQ1RfTUFDQUREUnxERVZfSEFTX0NPTExJU0lPTl9GSVh8REVWX05FRURfVFhfTElNSVR8REVWX0hBU19HRUFSX01PREUsCiAJfSwKIAl7CS8qIE1DUDc5IEV0aGVybmV0IENvbnRyb2xsZXIgKi8KIAkJUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX05WSURJQSwgUENJX0RFVklDRV9JRF9OVklESUFfTlZFTkVUXzM4KSwKLQkJLmRyaXZlcl9kYXRhID0gREVWX05FRURfVElNRVJJUlF8REVWX05FRURfTElOS1RJTUVSfERFVl9IQVNfTEFSR0VERVNDfERFVl9IQVNfQ0hFQ0tTVU18REVWX0hBU19ISUdIX0RNQXxERVZfSEFTX01TSXxERVZfSEFTX1BPV0VSX0NOVFJMfERFVl9IQVNfUEFVU0VGUkFNRV9UWF9WM3xERVZfSEFTX1NUQVRJU1RJQ1NfVjN8REVWX0hBU19URVNUX0VYVEVOREVEfERFVl9IQVNfTUdNVF9VTklUfERFVl9IQVNfQ09SUkVDVF9NQUNBRERSfERFVl9IQVNfQ09MTElTSU9OX0ZJWHxERVZfTkVFRF9UWF9MSU1JVHxERVZfSEFTX0dFQVJfTU9ERSwKKwkJLmRyaXZlcl9kYXRhID0gREVWX05FRURfVElNRVJJUlF8REVWX05FRURfTElOS1RJTUVSfERFVl9IQVNfTEFSR0VERVNDfERFVl9IQVNfQ0hFQ0tTVU18REVWX0hBU19ISUdIX0RNQXxERVZfSEFTX01TSXxERVZfSEFTX1BPV0VSX0NOVFJMfERFVl9IQVNfUEFVU0VGUkFNRV9UWF9WM3xERVZfSEFTX1NUQVRJU1RJQ1NfVjN8REVWX0hBU19URVNUX0VYVEVOREVEfERFVl9IQVNfQ09SUkVDVF9NQUNBRERSfERFVl9IQVNfQ09MTElTSU9OX0ZJWHxERVZfTkVFRF9UWF9MSU1JVHxERVZfSEFTX0dFQVJfTU9ERSwKIAl9LAogCXsJLyogTUNQNzkgRXRoZXJuZXQgQ29udHJvbGxlciAqLwogCQlQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfTlZJRElBLCBQQ0lfREVWSUNFX0lEX05WSURJQV9OVkVORVRfMzkpLAotCQkuZHJpdmVyX2RhdGEgPSBERVZfTkVFRF9USU1FUklSUXxERVZfTkVFRF9MSU5LVElNRVJ8REVWX0hBU19MQVJHRURFU0N8REVWX0hBU19DSEVDS1NVTXxERVZfSEFTX0hJR0hfRE1BfERFVl9IQVNfTVNJfERFVl9IQVNfUE9XRVJfQ05UUkx8REVWX0hBU19QQVVTRUZSQU1FX1RYX1YzfERFVl9IQVNfU1RBVElTVElDU19WM3xERVZfSEFTX1RFU1RfRVhURU5ERUR8REVWX0hBU19NR01UX1VOSVR8REVWX0hBU19DT1JSRUNUX01BQ0FERFJ8REVWX0hBU19DT0xMSVNJT05fRklYfERFVl9ORUVEX1RYX0xJTUlUfERFVl9IQVNfR0VBUl9NT0RFLAorCQkuZHJpdmVyX2RhdGEgPSBERVZfTkVFRF9USU1FUklSUXxERVZfTkVFRF9MSU5LVElNRVJ8REVWX0hBU19MQVJHRURFU0N8REVWX0hBU19DSEVDS1NVTXxERVZfSEFTX0hJR0hfRE1BfERFVl9IQVNfTVNJfERFVl9IQVNfUE9XRVJfQ05UUkx8REVWX0hBU19QQVVTRUZSQU1FX1RYX1YzfERFVl9IQVNfU1RBVElTVElDU19WM3xERVZfSEFTX1RFU1RfRVhURU5ERUR8REVWX0hBU19DT1JSRUNUX01BQ0FERFJ8REVWX0hBU19DT0xMSVNJT05fRklYfERFVl9ORUVEX1RYX0xJTUlUfERFVl9IQVNfR0VBUl9NT0RFLAogCX0sCiAJezAsfSwKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9mc19lbmV0L2ZzX2VuZXQtbWFpbi5jIGIvZHJpdmVycy9uZXQvZnNfZW5ldC9mc19lbmV0LW1haW4uYwppbmRleCA0ZTZhOTE5Li5jZTkwMGU1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9mc19lbmV0L2ZzX2VuZXQtbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L2ZzX2VuZXQvZnNfZW5ldC1tYWluLmMKQEAgLTc5NSw2ICs3OTUsNyBAQAogCiAJZXJyID0gZnNfaW5pdF9waHkoZGV2KTsKIAlpZiAoZXJyKSB7CisJCWZyZWVfaXJxKGZlcC0+aW50ZXJydXB0LCBkZXYpOwogCQlpZiAoZmVwLT5mcGktPnVzZV9uYXBpKQogCQkJbmFwaV9kaXNhYmxlKCZmZXAtPm5hcGkpOwogCQlyZXR1cm4gZXJyOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZ2lhbmZhci5jIGIvZHJpdmVycy9uZXQvZ2lhbmZhci5jCmluZGV4IGM2NzJlY2YuLmVhNTMwNjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2dpYW5mYXIuYworKysgYi9kcml2ZXJzL25ldC9naWFuZmFyLmMKQEAgLTIzOCw4ICsyMzgsOCBAQAogCQkJZ290byBlcnJfb3V0OwogCQl9CiAKLQkJc25wcmludGYocHJpdi0+cGh5X2J1c19pZCwgQlVTX0lEX1NJWkUsIFBIWV9JRF9GTVQsICIwIiwKLQkJCQlmaXhlZF9saW5rWzBdKTsKKwkJc25wcmludGYocHJpdi0+cGh5X2J1c19pZCwgc2l6ZW9mKHByaXYtPnBoeV9idXNfaWQpLAorCQkJCVBIWV9JRF9GTVQsICIwIiwgZml4ZWRfbGlua1swXSk7CiAJfSBlbHNlIHsKIAkJcGh5ID0gb2ZfZmluZF9ub2RlX2J5X3BoYW5kbGUoKnBoKTsKIApAQCAtMjU2LDcgKzI1Niw3IEBACiAJCW9mX25vZGVfcHV0KG1kaW8pOwogCiAJCWdmYXJfbWRpb19idXNfbmFtZShidXNfbmFtZSwgbWRpbyk7Ci0JCXNucHJpbnRmKHByaXYtPnBoeV9idXNfaWQsIEJVU19JRF9TSVpFLCAiJXM6JTAyeCIsCisJCXNucHJpbnRmKHByaXYtPnBoeV9idXNfaWQsIHNpemVvZihwcml2LT5waHlfYnVzX2lkKSwgIiVzOiUwMngiLAogCQkJCWJ1c19uYW1lLCAqaWQpOwogCX0KIApAQCAtMjk2LDYgKzI5NiwyMCBAQAogCXJldHVybiBlcnI7CiB9CiAKKy8qIElvY3RsIE1JSSBJbnRlcmZhY2UgKi8KK3N0YXRpYyBpbnQgZ2Zhcl9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKnJxLCBpbnQgY21kKQoreworCXN0cnVjdCBnZmFyX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCisJaWYgKCFuZXRpZl9ydW5uaW5nKGRldikpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCFwcml2LT5waHlkZXYpCisJCXJldHVybiAtRU5PREVWOworCisJcmV0dXJuIHBoeV9taWlfaW9jdGwocHJpdi0+cGh5ZGV2LCBpZl9taWkocnEpLCBjbWQpOworfQorCiAvKiBTZXQgdXAgdGhlIGV0aGVybmV0IGRldmljZSBzdHJ1Y3R1cmUsIHByaXZhdGUgZGF0YSwKICAqIGFuZCBhbnl0aGluZyBlbHNlIHdlIG5lZWQgYmVmb3JlIHdlIHN0YXJ0ICovCiBzdGF0aWMgaW50IGdmYXJfcHJvYmUoc3RydWN0IG9mX2RldmljZSAqb2ZkZXYsCkBAIC0zNjYsNiArMzgwLDcgQEAKIAlkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9IGdmYXJfc2V0X211bHRpOwogCiAJZGV2LT5ldGh0b29sX29wcyA9ICZnZmFyX2V0aHRvb2xfb3BzOworCWRldi0+ZG9faW9jdGwgPSBnZmFyX2lvY3RsOwogCiAJaWYgKHByaXYtPmRldmljZV9mbGFncyAmIEZTTF9HSUFORkFSX0RFVl9IQVNfQ1NVTSkgewogCQlwcml2LT5yeF9jc3VtX2VuYWJsZSA9IDE7CkBAIC0xNjA3LDEwICsxNjIyLDE4IEBACiBzdGF0aWMgdm9pZCBnZmFyX3NjaGVkdWxlX2NsZWFudXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgZ2Zhcl9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnR4bG9jaywgZmxhZ3MpOworCXNwaW5fbG9jaygmcHJpdi0+cnhsb2NrKTsKKwogCWlmIChuZXRpZl9yeF9zY2hlZHVsZV9wcmVwKCZwcml2LT5uYXBpKSkgewogCQlnZmFyX3dyaXRlKCZwcml2LT5yZWdzLT5pbWFzaywgSU1BU0tfUlRYX0RJU0FCTEVEKTsKIAkJX19uZXRpZl9yeF9zY2hlZHVsZSgmcHJpdi0+bmFwaSk7CiAJfQorCisJc3Bpbl91bmxvY2soJnByaXYtPnJ4bG9jayk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+dHhsb2NrLCBmbGFncyk7CiB9CiAKIC8qIEludGVycnVwdCBIYW5kbGVyIGZvciBUcmFuc21pdCBjb21wbGV0ZSAqLwpAQCAtMTk3Myw2ICsxOTk2LDggQEAKIAkJCWNhc2UgMTAwMDoKIAkJCQl0ZW1wdmFsID0KIAkJCQkgICAgKCh0ZW1wdmFsICYgfihNQUNDRkcyX0lGKSkgfCBNQUNDRkcyX0dNSUkpOworCisJCQkJZWNudHJsICY9IH4oRUNOVFJMX1IxMDApOwogCQkJCWJyZWFrOwogCQkJY2FzZSAxMDA6CiAJCQljYXNlIDEwOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaGFtYWNoaS5jIGIvZHJpdmVycy9uZXQvaGFtYWNoaS5jCmluZGV4IDMyMjAwMjIuLjdlOGIzYzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2hhbWFjaGkuYworKysgYi9kcml2ZXJzL25ldC9oYW1hY2hpLmMKQEAgLTU3Niw2ICs1NzYsNyBAQAogCS5uZG9fc2V0X211bHRpY2FzdF9saXN0CT0gc2V0X3J4X21vZGUsCiAJLm5kb19jaGFuZ2VfbXR1CQk9IGV0aF9jaGFuZ2VfbXR1LAogCS5uZG9fdmFsaWRhdGVfYWRkcgk9IGV0aF92YWxpZGF0ZV9hZGRyLAorCS5uZG9fc2V0X21hY19hZGRyZXNzIAk9IGV0aF9tYWNfYWRkciwKIAkubmRvX3R4X3RpbWVvdXQJCT0gaGFtYWNoaV90eF90aW1lb3V0LAogCS5uZG9fZG9faW9jdGwJCT0gbmV0ZGV2X2lvY3RsLAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2hhbXJhZGlvLzZwYWNrLmMgYi9kcml2ZXJzL25ldC9oYW1yYWRpby82cGFjay5jCmluZGV4IDUwZjFlMTcuLjJkNDA4OTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2hhbXJhZGlvLzZwYWNrLmMKKysrIGIvZHJpdmVycy9uZXQvaGFtcmFkaW8vNnBhY2suYwpAQCAtNzE3LDExICs3MTcsMTIgQEAKIAl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKIAlzdHJ1Y3Qgc2l4cGFjayAqc3AgPSBzcF9nZXQodHR5KTsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gc3AtPmRldjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OwogCXVuc2lnbmVkIGludCB0bXAsIGVycjsKIAogCWlmICghc3ApCiAJCXJldHVybiAtRU5YSU87CisJZGV2ID0gc3AtPmRldjsKIAogCXN3aXRjaChjbWQpIHsKIAljYXNlIFNJT0NHSUZOQU1FOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaHAtcGx1cy5jIGIvZHJpdmVycy9uZXQvaHAtcGx1cy5jCmluZGV4IGI1MDdkYmMuLjVlMDcwZjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2hwLXBsdXMuYworKysgYi9kcml2ZXJzL25ldC9ocC1wbHVzLmMKQEAgLTE2Niw2ICsxNjYsNyBAQAogCS5uZG9fZ2V0X3N0YXRzCQk9IGVpcF9nZXRfc3RhdHMsCiAJLm5kb19zZXRfbXVsdGljYXN0X2xpc3QgPSBlaXBfc2V0X211bHRpY2FzdF9saXN0LAogCS5uZG9fdmFsaWRhdGVfYWRkcgk9IGV0aF92YWxpZGF0ZV9hZGRyLAorCS5uZG9fc2V0X21hY19hZGRyZXNzIAk9IGV0aF9tYWNfYWRkciwKIAkubmRvX2NoYW5nZV9tdHUJCT0gZXRoX2NoYW5nZV9tdHUsCiAjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKIAkubmRvX3BvbGxfY29udHJvbGxlcgk9IGVpcF9wb2xsLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaHAxMDAuYyBiL2RyaXZlcnMvbmV0L2hwMTAwLmMKaW5kZXggZWJlNzY1MS4uYWQ4YmU3ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaHAxMDAuYworKysgYi9kcml2ZXJzL25ldC9ocDEwMC5jCkBAIC00MjUsNiArNDI1LDI4IEBACiB9CiAjZW5kaWYgLyogIU1PRFVMRSAmJiBDT05GSUdfSVNBICovCiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgaHAxMDBfYm1fbmV0ZGV2X29wcyA9IHsKKwkubmRvX29wZW4JCT0gaHAxMDBfb3BlbiwKKwkubmRvX3N0b3AJCT0gaHAxMDBfY2xvc2UsCisJLm5kb19zdGFydF94bWl0CQk9IGhwMTAwX3N0YXJ0X3htaXRfYm0sCisJLm5kb19nZXRfc3RhdHMgCQk9IGhwMTAwX2dldF9zdGF0cywKKwkubmRvX3NldF9tdWx0aWNhc3RfbGlzdCA9IGhwMTAwX3NldF9tdWx0aWNhc3RfbGlzdCwKKwkubmRvX2NoYW5nZV9tdHUJCT0gZXRoX2NoYW5nZV9tdHUsCisJLm5kb19zZXRfbWFjX2FkZHJlc3MgCT0gZXRoX21hY19hZGRyLAorCS5uZG9fdmFsaWRhdGVfYWRkcgk9IGV0aF92YWxpZGF0ZV9hZGRyLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyBocDEwMF9uZXRkZXZfb3BzID0geworCS5uZG9fb3BlbgkJPSBocDEwMF9vcGVuLAorCS5uZG9fc3RvcAkJPSBocDEwMF9jbG9zZSwKKwkubmRvX3N0YXJ0X3htaXQJCT0gaHAxMDBfc3RhcnRfeG1pdCwKKwkubmRvX2dldF9zdGF0cyAJCT0gaHAxMDBfZ2V0X3N0YXRzLAorCS5uZG9fc2V0X211bHRpY2FzdF9saXN0ID0gaHAxMDBfc2V0X211bHRpY2FzdF9saXN0LAorCS5uZG9fY2hhbmdlX210dQkJPSBldGhfY2hhbmdlX210dSwKKwkubmRvX3NldF9tYWNfYWRkcmVzcyAJPSBldGhfbWFjX2FkZHIsCisJLm5kb192YWxpZGF0ZV9hZGRyCT0gZXRoX3ZhbGlkYXRlX2FkZHIsCit9OworCiBzdGF0aWMgaW50IF9fZGV2aW5pdCBocDEwMF9wcm9iZTEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGlvYWRkciwKIAkJCQkgIHVfY2hhciBidXMsIHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2KQogewpAQCAtNjU3LDE2ICs2NzksMTAgQEAKIAlscC0+dmlydF9tZW1vcnlfc2l6ZSA9IHZpcnRfbWVtb3J5X3NpemU7CiAJbHAtPnJ4X3JhdGlvID0gaHAxMDBfcnhfcmF0aW87CS8qIGNhbiBiZSBjb25mJ2Qgd2l0aCBpbnNtb2QgKi8KIAotCWRldi0+b3BlbiA9IGhwMTAwX29wZW47Ci0JZGV2LT5zdG9wID0gaHAxMDBfY2xvc2U7Ci0KIAlpZiAobHAtPm1vZGUgPT0gMSkJLyogYnVzbWFzdGVyICovCi0JCWRldi0+aGFyZF9zdGFydF94bWl0ID0gaHAxMDBfc3RhcnRfeG1pdF9ibTsKKwkJZGV2LT5uZXRkZXZfb3BzID0gJmhwMTAwX2JtX25ldGRldl9vcHM7CiAJZWxzZQotCQlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9IGhwMTAwX3N0YXJ0X3htaXQ7Ci0KLQlkZXYtPmdldF9zdGF0cyA9IGhwMTAwX2dldF9zdGF0czsKLQlkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9ICZocDEwMF9zZXRfbXVsdGljYXN0X2xpc3Q7CisJCWRldi0+bmV0ZGV2X29wcyA9ICZocDEwMF9uZXRkZXZfb3BzOwogCiAJLyogQXNrIHRoZSBjYXJkIGZvciB3aGljaCBJUlEgbGluZSBpdCBpcyBjb25maWd1cmVkICovCiAJaWYgKGJ1cyA9PSBIUDEwMF9CVVNfUENJKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9oeWRyYS5jIGIvZHJpdmVycy9uZXQvaHlkcmEuYwppbmRleCA5Y2IzOGE4Li44YWMwOTMwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9oeWRyYS5jCisrKyBiL2RyaXZlcnMvbmV0L2h5ZHJhLmMKQEAgLTEwMyw2ICsxMDMsNyBAQAogCS5uZG9fZ2V0X3N0YXRzCQk9IGVpX2dldF9zdGF0cywKIAkubmRvX3NldF9tdWx0aWNhc3RfbGlzdCA9IGVpX3NldF9tdWx0aWNhc3RfbGlzdCwKIAkubmRvX3ZhbGlkYXRlX2FkZHIJPSBldGhfdmFsaWRhdGVfYWRkciwKKwkubmRvX3NldF9tYWNfYWRkcmVzcyAJPSBldGhfbWFjX2FkZHIsCiAJLm5kb19jaGFuZ2VfbXR1CQk9IGV0aF9jaGFuZ2VfbXR1LAogI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCiAJLm5kb19wb2xsX2NvbnRyb2xsZXIJPSBlaV9wb2xsLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaWJtX25ld2VtYWMvbWFsLmMgYi9kcml2ZXJzL25ldC9pYm1fbmV3ZW1hYy9tYWwuYwppbmRleCBlY2Y5Nzk4Li4yYTJmYzE3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9pYm1fbmV3ZW1hYy9tYWwuYworKysgYi9kcml2ZXJzL25ldC9pYm1fbmV3ZW1hYy9tYWwuYwpAQCAtNjEzLDcgKzYxMyw5IEBACiAJSU5JVF9MSVNUX0hFQUQoJm1hbC0+bGlzdCk7CiAJc3Bpbl9sb2NrX2luaXQoJm1hbC0+bG9jayk7CiAKLQluZXRpZl9uYXBpX2FkZChOVUxMLCAmbWFsLT5uYXBpLCBtYWxfcG9sbCwKKwlpbml0X2R1bW15X25ldGRldigmbWFsLT5kdW1teV9kZXYpOworCisJbmV0aWZfbmFwaV9hZGQoJm1hbC0+ZHVtbXlfZGV2LCAmbWFsLT5uYXBpLCBtYWxfcG9sbCwKIAkJICAgICAgIENPTkZJR19JQk1fTkVXX0VNQUNfUE9MTF9XRUlHSFQpOwogCiAJLyogTG9hZCBwb3dlci1vbiByZXNldCBkZWZhdWx0cyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaWJtX25ld2VtYWMvbWFsLmggYi9kcml2ZXJzL25ldC9pYm1fbmV3ZW1hYy9tYWwuaAppbmRleCAyZjBhODczLi45ZWRlZGZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9pYm1fbmV3ZW1hYy9tYWwuaAorKysgYi9kcml2ZXJzL25ldC9pYm1fbmV3ZW1hYy9tYWwuaApAQCAtMjE0LDYgKzIxNCw4IEBACiAJaW50CQkJaW5kZXg7CiAJc3BpbmxvY2tfdAkJbG9jazsKIAorCXN0cnVjdCBuZXRfZGV2aWNlCWR1bW15X2RldjsKKwogCXVuc2lnbmVkIGludCBmZWF0dXJlczsKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2libXZldGguYyBiL2RyaXZlcnMvbmV0L2libXZldGguYwppbmRleCA5YmMwZjE3Li5kZmE2MzQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9pYm12ZXRoLmMKKysrIGIvZHJpdmVycy9uZXQvaWJtdmV0aC5jCkBAIC02MDIsNyArNjAyLDcgQEAKIAogCWlmKGxwYXJfcmMgIT0gSF9TVUNDRVNTKSB7CiAJCWlibXZldGhfZXJyb3JfcHJpbnRrKCJoX3JlZ2lzdGVyX2xvZ2ljYWxfbGFuIGZhaWxlZCB3aXRoICVsZFxuIiwgbHBhcl9yYyk7Ci0JCWlibXZldGhfZXJyb3JfcHJpbnRrKCJidWZmZXIgVENFOjB4JWx4IGZpbHRlciBUQ0U6MHglbHggcnhxIGRlc2M6MHglbHggTUFDOjB4JWx4XG4iLAorCQlpYm12ZXRoX2Vycm9yX3ByaW50aygiYnVmZmVyIFRDRToweCVsbHggZmlsdGVyIFRDRToweCVsbHggcnhxIGRlc2M6MHglbGx4IE1BQzoweCVsbHhcbiIsCiAJCQkJICAgICBhZGFwdGVyLT5idWZmZXJfbGlzdF9kbWEsCiAJCQkJICAgICBhZGFwdGVyLT5maWx0ZXJfbGlzdF9kbWEsCiAJCQkJICAgICByeHFfZGVzYy5kZXNjLApAQCAtNzU0LDcgKzc1NCw3IEBACiAJCQkJICAgIHZvaWQgKCpkb25lKSAoc3RydWN0IG5ldF9kZXZpY2UgKiwgdTMyKSkKIHsKIAlzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQl1NjQgc2V0X2F0dHIsIGNscl9hdHRyLCByZXRfYXR0cjsKKwl1bnNpZ25lZCBsb25nIHNldF9hdHRyLCBjbHJfYXR0ciwgcmV0X2F0dHI7CiAJbG9uZyByZXQ7CiAJaW50IHJjMSA9IDAsIHJjMiA9IDA7CiAJaW50IHJlc3RhcnQgPSAwOwpAQCAtMTIwOSw3ICsxMjA5LDcgQEAKIAlsb25nIHJldDsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2OwogCXN0cnVjdCBpYm12ZXRoX2FkYXB0ZXIgKmFkYXB0ZXI7Ci0JdTY0IHNldF9hdHRyLCByZXRfYXR0cjsKKwl1bnNpZ25lZCBsb25nIHNldF9hdHRyLCByZXRfYXR0cjsKIAogCXVuc2lnbmVkIGNoYXIgKm1hY19hZGRyX3A7CiAJdW5zaWduZWQgaW50ICptY2FzdEZpbHRlclNpemVfcDsKQEAgLTEzNzgsMTMgKzEzNzgsMTMgQEAKIAlzZXFfcHJpbnRmKHNlcSwgIkZpcm13YXJlIE1BQzogICAgJXBNXG4iLCBmaXJtd2FyZV9tYWMpOwogCiAJc2VxX3ByaW50ZihzZXEsICJcbkFkYXB0ZXIgU3RhdGlzdGljczpcbiIpOwotCXNlcV9wcmludGYoc2VxLCAiICBUWDogIHZpb19tYXBfc2luZ2xlIGZhaWxyZXM6ICAgICAgJWxkXG4iLCBhZGFwdGVyLT50eF9tYXBfZmFpbGVkKTsKLQlzZXFfcHJpbnRmKHNlcSwgIiAgICAgICBzZW5kIGZhaWx1cmVzOiAgICAgICAgICAgICAgICVsZFxuIiwgYWRhcHRlci0+dHhfc2VuZF9mYWlsZWQpOwotCXNlcV9wcmludGYoc2VxLCAiICBSWDogIHJlcGxlbmlzaCB0YXNrIGN5Y2xlczogICAgICAgJWxkXG4iLCBhZGFwdGVyLT5yZXBsZW5pc2hfdGFza19jeWNsZXMpOwotCXNlcV9wcmludGYoc2VxLCAiICAgICAgIGFsbG9jX3NrYl9mYWlsdXJlczogICAgICAgICAgJWxkXG4iLCBhZGFwdGVyLT5yZXBsZW5pc2hfbm9fbWVtKTsKLQlzZXFfcHJpbnRmKHNlcSwgIiAgICAgICBhZGQgYnVmZmVyIGZhaWx1cmVzOiAgICAgICAgICVsZFxuIiwgYWRhcHRlci0+cmVwbGVuaXNoX2FkZF9idWZmX2ZhaWx1cmUpOwotCXNlcV9wcmludGYoc2VxLCAiICAgICAgIGludmFsaWQgYnVmZmVyczogICAgICAgICAgICAgJWxkXG4iLCBhZGFwdGVyLT5yeF9pbnZhbGlkX2J1ZmZlcik7Ci0Jc2VxX3ByaW50ZihzZXEsICIgICAgICAgbm8gYnVmZmVyczogICAgICAgICAgICAgICAgICAlbGRcbiIsIGFkYXB0ZXItPnJ4X25vX2J1ZmZlcik7CisJc2VxX3ByaW50ZihzZXEsICIgIFRYOiAgdmlvX21hcF9zaW5nbGUgZmFpbHJlczogICAgICAlbGxkXG4iLCBhZGFwdGVyLT50eF9tYXBfZmFpbGVkKTsKKwlzZXFfcHJpbnRmKHNlcSwgIiAgICAgICBzZW5kIGZhaWx1cmVzOiAgICAgICAgICAgICAgICVsbGRcbiIsIGFkYXB0ZXItPnR4X3NlbmRfZmFpbGVkKTsKKwlzZXFfcHJpbnRmKHNlcSwgIiAgUlg6ICByZXBsZW5pc2ggdGFzayBjeWNsZXM6ICAgICAgICVsbGRcbiIsIGFkYXB0ZXItPnJlcGxlbmlzaF90YXNrX2N5Y2xlcyk7CisJc2VxX3ByaW50ZihzZXEsICIgICAgICAgYWxsb2Nfc2tiX2ZhaWx1cmVzOiAgICAgICAgICAlbGxkXG4iLCBhZGFwdGVyLT5yZXBsZW5pc2hfbm9fbWVtKTsKKwlzZXFfcHJpbnRmKHNlcSwgIiAgICAgICBhZGQgYnVmZmVyIGZhaWx1cmVzOiAgICAgICAgICVsbGRcbiIsIGFkYXB0ZXItPnJlcGxlbmlzaF9hZGRfYnVmZl9mYWlsdXJlKTsKKwlzZXFfcHJpbnRmKHNlcSwgIiAgICAgICBpbnZhbGlkIGJ1ZmZlcnM6ICAgICAgICAgICAgICVsbGRcbiIsIGFkYXB0ZXItPnJ4X2ludmFsaWRfYnVmZmVyKTsKKwlzZXFfcHJpbnRmKHNlcSwgIiAgICAgICBubyBidWZmZXJzOiAgICAgICAgICAgICAgICAgICVsbGRcbiIsIGFkYXB0ZXItPnJ4X25vX2J1ZmZlcik7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2libXZldGguaCBiL2RyaXZlcnMvbmV0L2libXZldGguaAppbmRleCBkMjgxODY5Li5lYzc2YWNlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9pYm12ZXRoLmgKKysrIGIvZHJpdmVycy9uZXQvaWJtdmV0aC5oCkBAIC0zOSwxMSArMzksMTEgQEAKICNkZWZpbmUgSWJtVmV0aE1jYXN0UmVtb3ZlRmlsdGVyICAgICAweDJVTAogI2RlZmluZSBJYm1WZXRoTWNhc3RDbGVhckZpbHRlclRhYmxlIDB4M1VMCiAKLSNkZWZpbmUgSUJNVkVUSF9JTExBTl9QQURERURfUEtUX0NTVU0JMHgwMDAwMDAwMDAwMDAyMDAwVUxMCi0jZGVmaW5lIElCTVZFVEhfSUxMQU5fVFJVTktfUFJJX01BU0sJMHgwMDAwMDAwMDAwMDAwRjAwVUxMCi0jZGVmaW5lIElCTVZFVEhfSUxMQU5fSVBWNl9UQ1BfQ1NVTQkJMHgwMDAwMDAwMDAwMDAwMDA0VUxMCi0jZGVmaW5lIElCTVZFVEhfSUxMQU5fSVBWNF9UQ1BfQ1NVTQkJMHgwMDAwMDAwMDAwMDAwMDAyVUxMCi0jZGVmaW5lIElCTVZFVEhfSUxMQU5fQUNUSVZFX1RSVU5LCQkweDAwMDAwMDAwMDAwMDAwMDFVTEwKKyNkZWZpbmUgSUJNVkVUSF9JTExBTl9QQURERURfUEtUX0NTVU0JMHgwMDAwMDAwMDAwMDAyMDAwVUwKKyNkZWZpbmUgSUJNVkVUSF9JTExBTl9UUlVOS19QUklfTUFTSwkweDAwMDAwMDAwMDAwMDBGMDBVTAorI2RlZmluZSBJQk1WRVRIX0lMTEFOX0lQVjZfVENQX0NTVU0JCTB4MDAwMDAwMDAwMDAwMDAwNFVMCisjZGVmaW5lIElCTVZFVEhfSUxMQU5fSVBWNF9UQ1BfQ1NVTQkJMHgwMDAwMDAwMDAwMDAwMDAyVUwKKyNkZWZpbmUgSUJNVkVUSF9JTExBTl9BQ1RJVkVfVFJVTksJCTB4MDAwMDAwMDAwMDAwMDAwMVVMCiAKIC8qIGhjYWxsIG1hY3JvcyAqLwogI2RlZmluZSBoX3JlZ2lzdGVyX2xvZ2ljYWxfbGFuKHVhLCBidWZsc3QsIHJ4cSwgZmx0bHN0LCBtYWMpIFwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2lwZy5jIGIvZHJpdmVycy9uZXQvaXBnLmMKaW5kZXggN2I2ZDQzNS4uMzYwYWE1ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaXBnLmMKKysrIGIvZHJpdmVycy9uZXQvaXBnLmMKQEAgLTIyMTAsNiArMjIxMCwxOSBAQAogCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKIH0KIAorc3RhdGljIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyBpcGdfbmV0ZGV2X29wcyA9IHsKKwkubmRvX29wZW4JCT0gaXBnX25pY19vcGVuLAorCS5uZG9fc3RvcAkJPSBpcGdfbmljX3N0b3AsCisJLm5kb19zdGFydF94bWl0CQk9IGlwZ19uaWNfaGFyZF9zdGFydF94bWl0LAorCS5uZG9fZ2V0X3N0YXRzCQk9IGlwZ19uaWNfZ2V0X3N0YXRzLAorCS5uZG9fc2V0X211bHRpY2FzdF9saXN0ID0gaXBnX25pY19zZXRfbXVsdGljYXN0X2xpc3QsCisJLm5kb19kb19pb2N0bAkJPSBpcGdfaW9jdGwsCisJLm5kb190eF90aW1lb3V0IAk9IGlwZ190eF90aW1lb3V0LAorCS5uZG9fY2hhbmdlX210dSAJPSBpcGdfbmljX2NoYW5nZV9tdHUsCisJLm5kb19zZXRfbWFjX2FkZHJlc3MJPSBldGhfbWFjX2FkZHIsCisJLm5kb192YWxpZGF0ZV9hZGRyCT0gZXRoX3ZhbGlkYXRlX2FkZHIsCit9OworCiBzdGF0aWMgaW50IF9fZGV2aW5pdCBpcGdfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsCiAJCQkgICAgICAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkKQogewpAQCAtMjI1OCwxNSArMjI3MSw3IEBACiAKIAkvKiBEZWNsYXJlIElQRyBOSUMgZnVuY3Rpb25zIGZvciBFdGhlcm5ldCBkZXZpY2UgbWV0aG9kcy4KIAkgKi8KLQlkZXYtPm9wZW4gPSAmaXBnX25pY19vcGVuOwotCWRldi0+c3RvcCA9ICZpcGdfbmljX3N0b3A7Ci0JZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSAmaXBnX25pY19oYXJkX3N0YXJ0X3htaXQ7Ci0JZGV2LT5nZXRfc3RhdHMgPSAmaXBnX25pY19nZXRfc3RhdHM7Ci0JZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSAmaXBnX25pY19zZXRfbXVsdGljYXN0X2xpc3Q7Ci0JZGV2LT5kb19pb2N0bCA9IGlwZ19pb2N0bDsKLQlkZXYtPnR4X3RpbWVvdXQgPSBpcGdfdHhfdGltZW91dDsKLQlkZXYtPmNoYW5nZV9tdHUgPSAmaXBnX25pY19jaGFuZ2VfbXR1OwotCisJZGV2LT5uZXRkZXZfb3BzID0gJmlwZ19uZXRkZXZfb3BzOwogCVNFVF9ORVRERVZfREVWKGRldiwgJnBkZXYtPmRldik7CiAJU0VUX0VUSFRPT0xfT1BTKGRldiwgJmlwZ19ldGh0b29sX29wcyk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2lyZGEvYWxpLWlyY2MuYyBiL2RyaXZlcnMvbmV0L2lyZGEvYWxpLWlyY2MuYwppbmRleCAzYzU4ZTY3Li4xNzc3OWY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9pcmRhL2FsaS1pcmNjLmMKKysrIGIvZHJpdmVycy9uZXQvaXJkYS9hbGktaXJjYy5jCkBAIC0xMDksNyArMTA5LDYgQEAKIHN0YXRpYyBpbnQgIGFsaV9pcmNjX25ldF9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIHN0YXRpYyBpbnQgIGFsaV9pcmNjX25ldF9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKnJxLCBpbnQgY21kKTsKIHN0YXRpYyB2b2lkIGFsaV9pcmNjX2NoYW5nZV9zcGVlZChzdHJ1Y3QgYWxpX2lyY2NfY2IgKnNlbGYsIF9fdTMyIGJhdWQpOwotc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICphbGlfaXJjY19uZXRfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogCiAvKiBTSVIgZnVuY3Rpb24gKi8KIHN0YXRpYyBpbnQgIGFsaV9pcmNjX3Npcl9oYXJkX3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CkBAIC0zNjYsNyArMzY1LDYgQEAKIAlkZXYtPm9wZW4gICAgICAgICAgICA9IGFsaV9pcmNjX25ldF9vcGVuOwogCWRldi0+c3RvcCAgICAgICAgICAgID0gYWxpX2lyY2NfbmV0X2Nsb3NlOwogCWRldi0+ZG9faW9jdGwgICAgICAgID0gYWxpX2lyY2NfbmV0X2lvY3RsOwotCWRldi0+Z2V0X3N0YXRzCSAgICAgPSBhbGlfaXJjY19uZXRfZ2V0X3N0YXRzOwogCiAJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CiAJaWYgKGVycikgewpAQCAtODc2LDcgKzg3NCw3IEBACiAgICAgICAgICAqIGFzeW5jX3Vud3JhcF9jaGFyIHdpbGwgZGVsaXZlciBhbGwgZm91bmQgZnJhbWVzICAKIAkgKi8KIAlkbyB7Ci0JCWFzeW5jX3Vud3JhcF9jaGFyKHNlbGYtPm5ldGRldiwgJnNlbGYtPnN0YXRzLCAmc2VsZi0+cnhfYnVmZiwgCisJCWFzeW5jX3Vud3JhcF9jaGFyKHNlbGYtPm5ldGRldiwgJnNlbGYtPm5ldGRldi0+c3RhdHMsICZzZWxmLT5yeF9idWZmLAogCQkJCSAgaW5iKGlvYmFzZStVQVJUX1JYKSk7CiAKIAkJLyogTWFrZSBzdXJlIHdlIGRvbid0IHN0YXkgaGVyZSB0b28gbG9uZyAqLwpAQCAtOTQzLDcgKzk0MSw3IEBACiAJCQluZXRpZl93YWtlX3F1ZXVlKHNlbGYtPm5ldGRldik7CQogCQl9CiAJCQkKLQkJc2VsZi0+c3RhdHMudHhfcGFja2V0cysrOworCQlzZWxmLT5uZXRkZXYtPnN0YXRzLnR4X3BhY2tldHMrKzsKIAkJCiAJCS8qIFR1cm4gb24gcmVjZWl2ZSBpbnRlcnJ1cHRzICovCiAJCW91dGIoVUFSVF9JRVJfUkRJLCBpb2Jhc2UrVUFSVF9JRVIpOwpAQCAtMTQ2Nyw3ICsxNDY1LDcgQEAKIAlzZWxmLT50eF9maWZvLnF1ZXVlW3NlbGYtPnR4X2ZpZm8uZnJlZV0ubGVuID0gc2tiLT5sZW47CiAJc2VsZi0+dHhfZmlmby50YWlsICs9IHNrYi0+bGVuOwogCi0Jc2VsZi0+c3RhdHMudHhfYnl0ZXMgKz0gc2tiLT5sZW47CisJZGV2LT5zdGF0cy50eF9ieXRlcyArPSBza2ItPmxlbjsKIAogCXNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGEoc2tiLCBzZWxmLT50eF9maWZvLnF1ZXVlW3NlbGYtPnR4X2ZpZm8uZnJlZV0uc3RhcnQsCiAJCSAgICAgIHNrYi0+bGVuKTsKQEAgLTE2NjEsMTIgKzE2NTksMTIgQEAKIAkKIAl7CiAJCUlSREFfRVJST1IoIiVzKCksICoqKioqKioqKiBMU1JfRlJBTUVfQUJPUlQgKioqKioqKioqXG4iLCBfX2Z1bmNfXyk7Ci0JCXNlbGYtPnN0YXRzLnR4X2Vycm9ycysrOwotCQlzZWxmLT5zdGF0cy50eF9maWZvX2Vycm9ycysrOwkJCisJCXNlbGYtPm5ldGRldi0+c3RhdHMudHhfZXJyb3JzKys7CisJCXNlbGYtPm5ldGRldi0+c3RhdHMudHhfZmlmb19lcnJvcnMrKzsKIAl9CiAJZWxzZSAKIAl7Ci0JCXNlbGYtPnN0YXRzLnR4X3BhY2tldHMrKzsKKwkJc2VsZi0+bmV0ZGV2LT5zdGF0cy50eF9wYWNrZXRzKys7CiAJfQogCiAJLyogQ2hlY2sgaWYgd2UgbmVlZCB0byBjaGFuZ2UgdGhlIHNwZWVkICovCkBAIC0xODMxLDM1ICsxODI5LDM1IEBACiAJCQlJUkRBX0RFQlVHKDAsIiVzKCksICoqKioqKioqKioqKiogUlggRXJyb3JzICoqKioqKioqKioqKiBcbiIsIF9fZnVuY19fICk7CiAJCQkKIAkJCS8qIFNraXAgZnJhbWUgKi8KLQkJCXNlbGYtPnN0YXRzLnJ4X2Vycm9ycysrOworCQkJc2VsZi0+bmV0ZGV2LT5zdGF0cy5yeF9lcnJvcnMrKzsKIAkJCQogCQkJc2VsZi0+cnhfYnVmZi5kYXRhICs9IGxlbjsKIAkJCQogCQkJaWYgKHN0YXR1cyAmIExTUl9GSUZPX1VSKSAKIAkJCXsKLQkJCQlzZWxmLT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMrKzsKKwkJCQlzZWxmLT5uZXRkZXYtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycysrOwogCQkJCUlSREFfREVCVUcoMCwiJXMoKSwgKioqKioqKioqKioqKiBGSUZPIEVycm9ycyAqKioqKioqKioqKiogXG4iLCBfX2Z1bmNfXyApOwogCQkJfQkKIAkJCWlmIChzdGF0dXMgJiBMU1JfRlJBTUVfRVJST1IpCiAJCQl7Ci0JCQkJc2VsZi0+c3RhdHMucnhfZnJhbWVfZXJyb3JzKys7CisJCQkJc2VsZi0+bmV0ZGV2LT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMrKzsKIAkJCQlJUkRBX0RFQlVHKDAsIiVzKCksICoqKioqKioqKioqKiogRlJBTUUgRXJyb3JzICoqKioqKioqKioqKiBcbiIsIF9fZnVuY19fICk7CiAJCQl9CiAJCQkJCQkJCiAJCQlpZiAoc3RhdHVzICYgTFNSX0NSQ19FUlJPUikgCiAJCQl7Ci0JCQkJc2VsZi0+c3RhdHMucnhfY3JjX2Vycm9ycysrOworCQkJCXNlbGYtPm5ldGRldi0+c3RhdHMucnhfY3JjX2Vycm9ycysrOwogCQkJCUlSREFfREVCVUcoMCwiJXMoKSwgKioqKioqKioqKioqKiBDUkMgRXJyb3JzICoqKioqKioqKioqKiBcbiIsIF9fZnVuY19fICk7CiAJCQl9CiAJCQkKIAkJCWlmKHNlbGYtPnJjdkZyYW1lc092ZXJmbG93KQogCQkJewotCQkJCXNlbGYtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycysrOworCQkJCXNlbGYtPm5ldGRldi0+c3RhdHMucnhfZnJhbWVfZXJyb3JzKys7CiAJCQkJSVJEQV9ERUJVRygwLCIlcygpLCAqKioqKioqKioqKioqIE92ZXJyYW4gRE1BIGJ1ZmZlciAqKioqKioqKioqKiogXG4iLCBfX2Z1bmNfXyApOwogCQkJfQogCQkJaWYobGVuID09IDApCiAJCQl7Ci0JCQkJc2VsZi0+c3RhdHMucnhfZnJhbWVfZXJyb3JzKys7CisJCQkJc2VsZi0+bmV0ZGV2LT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMrKzsKIAkJCQlJUkRBX0RFQlVHKDAsIiVzKCksICoqKioqKioqKiogUmVjZWl2ZSBGcmFtZSBTaXplID0gMCAqKioqKioqKiogXG4iLCBfX2Z1bmNfXyApOwogCQkJfQogCQl9CSAKQEAgLTE5MTAsNyArMTkwOCw3IEBACiAJCQkJSVJEQV9XQVJOSU5HKCIlcygpLCBtZW1vcnkgc3F1ZWV6ZSwgIgogCQkJCQkgICAgICJkcm9wcGluZyBmcmFtZS5cbiIsCiAJCQkJCSAgICAgX19mdW5jX18pOwotCQkJCXNlbGYtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKKwkJCQlzZWxmLT5uZXRkZXYtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKIAogCQkJCXJldHVybiBGQUxTRTsKIAkJCX0KQEAgLTE5MjQsOCArMTkyMiw4IEBACiAKIAkJCS8qIE1vdmUgdG8gbmV4dCBmcmFtZSAqLwogCQkJc2VsZi0+cnhfYnVmZi5kYXRhICs9IGxlbjsKLQkJCXNlbGYtPnN0YXRzLnJ4X2J5dGVzICs9IGxlbjsKLQkJCXNlbGYtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKwkJCXNlbGYtPm5ldGRldi0+c3RhdHMucnhfYnl0ZXMgKz0gbGVuOworCQkJc2VsZi0+bmV0ZGV2LT5zdGF0cy5yeF9wYWNrZXRzKys7CiAKIAkJCXNrYi0+ZGV2ID0gc2VsZi0+bmV0ZGV2OwogCQkJc2tiX3Jlc2V0X21hY19oZWFkZXIoc2tiKTsKQEAgLTE5OTQsNyArMTk5Miw3IEBACiAJc2VsZi0+dHhfYnVmZi5sZW4gPSBhc3luY193cmFwX3NrYihza2IsIHNlbGYtPnR4X2J1ZmYuZGF0YSwgCiAJCQkJCSAgIHNlbGYtPnR4X2J1ZmYudHJ1ZXNpemUpOwogCQotCXNlbGYtPnN0YXRzLnR4X2J5dGVzICs9IHNlbGYtPnR4X2J1ZmYubGVuOworCXNlbGYtPm5ldGRldi0+c3RhdHMudHhfYnl0ZXMgKz0gc2VsZi0+dHhfYnVmZi5sZW47CiAKIAkvKiBUdXJuIG9uIHRyYW5zbWl0IGZpbmlzaGVkIGludGVycnVwdC4gV2lsbCBmaXJlIGltbWVkaWF0ZWx5ISAgKi8KIAlvdXRiKFVBUlRfSUVSX1RIUkksIGlvYmFzZStVQVJUX0lFUik7IApAQCAtMjExMSwxNyArMjEwOSw2IEBACiAJcmV0dXJuIHN0YXR1czsKIH0KIAotc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICphbGlfaXJjY19uZXRfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IGFsaV9pcmNjX2NiICpzZWxmID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQkKLQlJUkRBX0RFQlVHKDIsICIlcygpLCAtLS0tLS0tLS0tLS0tLS0tIFN0YXJ0IC0tLS0tLS0tLS0tLS0tLS1cbiIsIF9fZnVuY19fICk7Ci0JCQotCUlSREFfREVCVUcoMiwgIiVzKCksIC0tLS0tLS0tLS0tLS0tLS0tIEVuZCAtLS0tLS0tLS0tLS0tLS0tLS1cbiIsIF9fZnVuY19fICk7Ci0JCi0JcmV0dXJuICZzZWxmLT5zdGF0czsKLX0KLQogc3RhdGljIGludCBhbGlfaXJjY19zdXNwZW5kKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQogewogCXN0cnVjdCBhbGlfaXJjY19jYiAqc2VsZiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKGRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pcmRhL2FsaS1pcmNjLmggYi9kcml2ZXJzL25ldC9pcmRhL2FsaS1pcmNjLmgKaW5kZXggZWQzNWQ5OS4uMGM4ZWRiNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaXJkYS9hbGktaXJjYy5oCisrKyBiL2RyaXZlcnMvbmV0L2lyZGEvYWxpLWlyY2MuaApAQCAtMTkxLDcgKzE5MSw2IEBACiAJc3RydWN0IHR4X2ZpZm8gdHhfZmlmbzsgICAgLyogSW5mbyBhYm91dCBmcmFtZXMgdG8gYmUgdHJhbnNtaXR0ZWQgKi8KIAogCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXY7ICAgICAvKiBZZXMhIHdlIGFyZSBzb21lIGtpbmQgb2YgbmV0ZGV2aWNlICovCi0Jc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CiAJCiAJc3RydWN0IGlybGFwX2NiICppcmxhcDsgICAgLyogVGhlIGxpbmsgbGF5ZXIgd2UgYXJlIGJpbmRlZCB0byAqLwogCXN0cnVjdCBxb3NfaW5mbyBxb3M7ICAgICAgIC8qIFFvUyBjYXBhYmlsaXRpZXMgZm9yIHRoaXMgZGV2aWNlICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pcmRhL2F1MTAwMF9pcmNjLmggYi9kcml2ZXJzL25ldC9pcmRhL2F1MTAwMF9pcmNjLmgKaW5kZXggYjQ3NjNmMi4uYzA3MmMwOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaXJkYS9hdTEwMDBfaXJjYy5oCisrKyBiL2RyaXZlcnMvbmV0L2lyZGEvYXUxMDAwX2lyY2MuaApAQCAtMTA3LDcgKzEwNyw2IEBACiAJaW9idWZmX3QgcnhfYnVmZjsKIAogCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXY7Ci0Jc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CiAJCiAJc3RydWN0IHRpbWV2YWwgc3RhbXA7CiAJc3RydWN0IHRpbWV2YWwgbm93OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXJkYS9hdTFrX2lyLmMgYi9kcml2ZXJzL25ldC9pcmRhL2F1MWtfaXIuYwppbmRleCA2YzRiNTNmLi45NDExNjQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9pcmRhL2F1MWtfaXIuYworKysgYi9kcml2ZXJzL25ldC9pcmRhL2F1MWtfaXIuYwpAQCAtNTMsNyArNTMsNiBAQAogc3RhdGljIGludCBhdTFrX2lyZGFfcngoc3RydWN0IG5ldF9kZXZpY2UgKik7CiBzdGF0aWMgdm9pZCBhdTFrX2lyZGFfaW50ZXJydXB0KGludCwgdm9pZCAqKTsKIHN0YXRpYyB2b2lkIGF1MWtfdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqKTsKLXN0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqYXUxa19pcmRhX3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICopOwogc3RhdGljIGludCBhdTFrX2lyZGFfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKiwgc3RydWN0IGlmcmVxICosIGludCk7CiBzdGF0aWMgaW50IGF1MWtfaXJkYV9zZXRfc3BlZWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHNwZWVkKTsKIApAQCAtMjEzLDcgKzIxMiw2IEBACiAJZGV2LT5vcGVuID0gYXUxa19pcmRhX3N0YXJ0OwogCWRldi0+aGFyZF9zdGFydF94bWl0ID0gYXUxa19pcmRhX2hhcmRfeG1pdDsKIAlkZXYtPnN0b3AgPSBhdTFrX2lyZGFfc3RvcDsKLQlkZXYtPmdldF9zdGF0cyA9IGF1MWtfaXJkYV9zdGF0czsKIAlkZXYtPmRvX2lvY3RsID0gYXUxa19pcmRhX2lvY3RsOwogCWRldi0+dHhfdGltZW91dCA9IGF1MWtfdHhfdGltZW91dDsKIApAQCAtNTk2LDcgKzU5NCw3IEBACiAJCQl1cGRhdGVfcnhfc3RhdHMoZGV2LCBmbGFncywgY291bnQpOwogCQkJc2tiPWFsbG9jX3NrYihjb3VudCsxLEdGUF9BVE9NSUMpOwogCQkJaWYgKHNrYiA9PSBOVUxMKSB7Ci0JCQkJYXVwLT5zdGF0cy5yeF9kcm9wcGVkKys7CisJCQkJYXVwLT5uZXRkZXYtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKIAkJCQljb250aW51ZTsKIAkJCX0KIAkJCXNrYl9yZXNlcnZlKHNrYiwgMSk7CkBAIC04MzIsMTMgKzgzMCw2IEBACiAJcmV0dXJuIHJldDsKIH0KIAotCi1zdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmF1MWtfaXJkYV9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQotewotCXN0cnVjdCBhdTFrX3ByaXZhdGUgKmF1cCA9IG5ldGRldl9wcml2KGRldik7Ci0JcmV0dXJuICZhdXAtPnN0YXRzOwotfQotCiBNT0RVTEVfQVVUSE9SKCJQZXRlIFBvcG92IDxwcG9wb3ZAbXZpc3RhLmNvbT4iKTsKIE1PRFVMRV9ERVNDUklQVElPTigiQXUxMDAwIElyREEgRGV2aWNlIERyaXZlciIpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pcmRhL2RvbmF1Ym9lLmMgYi9kcml2ZXJzL25ldC9pcmRhL2RvbmF1Ym9lLmMKaW5kZXggNjg3YzJkNS4uNmYzZTdmNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaXJkYS9kb25hdWJvZS5jCisrKyBiL2RyaXZlcnMvbmV0L2lyZGEvZG9uYXVib2UuYwpAQCAtMTE5NCwxMyArMTE5NCwxMyBAQAogICAgICAgICAgICAgICB0eHAgPSB0eHBjOwogICAgICAgICAgICAgICB0eHBjKys7CiAgICAgICAgICAgICAgIHR4cGMgJT0gVFhfU0xPVFM7Ci0gICAgICAgICAgICAgIHNlbGYtPnN0YXRzLnR4X3BhY2tldHMrKzsKKyAgICAgICAgICAgICAgc2VsZi0+bmV0ZGV2LT5zdGF0cy50eF9wYWNrZXRzKys7CiAgICAgICAgICAgICAgIGlmIChzZWxmLT5yaW5nLT50eFt0eHBjXS5jb250cm9sICYgT0JPRV9DVExfVFhfSFdfT1dOUykKICAgICAgICAgICAgICAgICAgIHNlbGYtPnJpbmctPnR4W3R4cF0uY29udHJvbCAmPSB+T0JPRV9DVExfVFhfUlRDRU5UWDsKICAgICAgICAgICAgIH0KLSAgICAgICAgICBzZWxmLT5zdGF0cy50eF9wYWNrZXRzLS07CisgICAgICAgICAgc2VsZi0+bmV0ZGV2LT5zdGF0cy50eF9wYWNrZXRzLS07CiAjZWxzZQotICAgICAgICAgIHNlbGYtPnN0YXRzLnR4X3BhY2tldHMrKzsKKyAgICAgICAgICBzZWxmLT5uZXRkZXYtPnN0YXRzLnR4X3BhY2tldHMrKzsKICNlbmRpZgogICAgICAgICAgIHRvc2hvYm9lX3N0YXJ0X0RNQShzZWxmLCBPQk9FX0NPTkZJRzBIX0VOVFgpOwogICAgICAgICB9CkBAIC0xMjgwLDcgKzEyODAsNyBAQAogICAgICAgICAgICAgICAgICAgICAgIHNrYl9wdXQgKHNrYiwgbGVuKTsKICAgICAgICAgICAgICAgICAgICAgICBza2JfY29weV90b19saW5lYXJfZGF0YShza2IsIHNlbGYtPnJ4X2J1ZnNbc2VsZi0+cnhzXSwKIAkJCQkJICAgICAgbGVuKTsKLSAgICAgICAgICAgICAgICAgICAgICBzZWxmLT5zdGF0cy5yeF9wYWNrZXRzKys7CisgICAgICAgICAgICAgICAgICAgICAgc2VsZi0+bmV0ZGV2LT5zdGF0cy5yeF9wYWNrZXRzKys7CiAgICAgICAgICAgICAgICAgICAgICAgc2tiLT5kZXYgPSBzZWxmLT5uZXRkZXY7CiAgICAgICAgICAgICAgICAgICAgICAgc2tiX3Jlc2V0X21hY19oZWFkZXIoc2tiKTsKICAgICAgICAgICAgICAgICAgICAgICBza2ItPnByb3RvY29sID0gaHRvbnMgKEVUSF9QX0lSREEpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXJkYS9kb25hdWJvZS5oIGIvZHJpdmVycy9uZXQvaXJkYS9kb25hdWJvZS5oCmluZGV4IDFlNjc3MjBmLi4wZGJkMTkzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9pcmRhL2RvbmF1Ym9lLmgKKysrIGIvZHJpdmVycy9uZXQvaXJkYS9kb25hdWJvZS5oCkBAIC0zMDgsNyArMzA4LDYgQEAKIHN0cnVjdCB0b3Nob2JvZV9jYgogewogICBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2OyAgICAvKiBZZXMhIHdlIGFyZSBzb21lIGtpbmQgb2YgbmV0ZGV2aWNlICovCi0gIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOwogICBzdHJ1Y3QgdHR5X2RyaXZlciB0dHlkZXY7CiAKICAgc3RydWN0IGlybGFwX2NiICppcmxhcDsgICAgICAgLyogVGhlIGxpbmsgbGF5ZXIgd2UgYXJlIGJpbmRlZCB0byAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXJkYS9pcmRhLXVzYi5jIGIvZHJpdmVycy9uZXQvaXJkYS9pcmRhLXVzYi5jCmluZGV4IDIwNWU0ZTguLjNhMjJkYzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2lyZGEvaXJkYS11c2IuYworKysgYi9kcml2ZXJzL25ldC9pcmRhL2lyZGEtdXNiLmMKQEAgLTEyMiw3ICsxMjIsNiBAQAogc3RhdGljIGludCBpcmRhX3VzYl9uZXRfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiBzdGF0aWMgaW50IGlyZGFfdXNiX25ldF9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKnJxLCBpbnQgY21kKTsKIHN0YXRpYyB2b2lkIGlyZGFfdXNiX25ldF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwotc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICppcmRhX3VzYl9uZXRfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqIFRSQU5TTUlUIFJPVVRJTkVTICoqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qCkBAIC01MjUsMTMgKzUyNCwxMyBAQAogCS8qIEFzayBVU0IgdG8gc2VuZCB0aGUgcGFja2V0IC0gSXJxIGRpc2FibGVkIC0+IEdGUF9BVE9NSUMgKi8KIAlpZiAoKHJlcyA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgR0ZQX0FUT01JQykpKSB7CiAJCUlSREFfV0FSTklORygiJXMoKSwgZmFpbGVkIFR4IFVSQlxuIiwgX19mdW5jX18pOwotCQlzZWxmLT5zdGF0cy50eF9lcnJvcnMrKzsKKwkJbmV0ZGV2LT5zdGF0cy50eF9lcnJvcnMrKzsKIAkJLyogTGV0IFVTQiByZWNvdmVyIDogV2Ugd2lsbCBjYXRjaCB0aGF0IGluIHRoZSB3YXRjaGRvZyAqLwogCQkvKm5ldGlmX3N0YXJ0X3F1ZXVlKG5ldGRldik7Ki8KIAl9IGVsc2UgewogCQkvKiBJbmNyZW1lbnQgcGFja2V0IHN0YXRzICovCi0JCXNlbGYtPnN0YXRzLnR4X3BhY2tldHMrKzsKLSAgICAgICAgICAgICAgICBzZWxmLT5zdGF0cy50eF9ieXRlcyArPSBza2ItPmxlbjsKKwkJbmV0ZGV2LT5zdGF0cy50eF9wYWNrZXRzKys7CisgICAgICAgICAgICAgICAgbmV0ZGV2LT5zdGF0cy50eF9ieXRlcyArPSBza2ItPmxlbjsKIAkJCiAJCW5ldGRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOwogCX0KQEAgLTY3Nyw3ICs2NzYsNyBAQAogCQlJUkRBX0RFQlVHKDAsICIlczogVHggdGltZWQgb3V0LCB1cmItPnN0YXR1cz0lZCwgdXJiLT50cmFuc2Zlcl9mbGFncz0weCUwNFhcbiIsIG5ldGRldi0+bmFtZSwgdXJiLT5zdGF0dXMsIHVyYi0+dHJhbnNmZXJfZmxhZ3MpOwogCiAJCS8qIEluY3JlYXNlIGVycm9yIGNvdW50ICovCi0JCXNlbGYtPnN0YXRzLnR4X2Vycm9ycysrOworCQluZXRkZXYtPnN0YXRzLnR4X2Vycm9ycysrOwogCiAjaWZkZWYgSVVfQlVHX0tJQ0tfVElNRU9VVAogCQkvKiBDYW4ndCBiZSBhIGJhZCBpZGVhIHRvIHJlc2V0IHRoZSBzcGVlZCA7LSkgLSBKZWFuIElJICovCkBAIC04MjYsNyArODI1LDcgQEAKIAlpZiAodXJiLT5zdGF0dXMgIT0gMCkgewogCQlzd2l0Y2ggKHVyYi0+c3RhdHVzKSB7CiAJCWNhc2UgLUVJTFNFUToKLQkJCXNlbGYtPnN0YXRzLnJ4X2NyY19lcnJvcnMrKzsJCisJCQlzZWxmLT5uZXRkZXYtPnN0YXRzLnJ4X2NyY19lcnJvcnMrKzsKIAkJCS8qIEFsc28gcHJlY3Vyc29yIHRvIGEgaG90LXVucGx1ZyBvbiBVSENJLiAqLwogCQkJLyogRmFsbHRocm91Z2guLi4gKi8KIAkJY2FzZSAtRUNPTk5SRVNFVDoKQEAgLTgzOSw3ICs4MzgsNyBAQAogCQljYXNlIC1FVElNRToKIAkJCS8qIFVzdWFsbHkgcHJlY3Vyc29yIHRvIGEgaG90LXVucGx1ZyBvbiBPSENJLiAqLwogCQlkZWZhdWx0OgotCQkJc2VsZi0+c3RhdHMucnhfZXJyb3JzKys7CisJCQlzZWxmLT5uZXRkZXYtPnN0YXRzLnJ4X2Vycm9ycysrOwogCQkJSVJEQV9ERUJVRygwLCAiJXMoKSwgUlggc3RhdHVzICVkLCB0cmFuc2Zlcl9mbGFncyAweCUwNFggXG4iLCBfX2Z1bmNfXywgdXJiLT5zdGF0dXMsIHVyYi0+dHJhbnNmZXJfZmxhZ3MpOwogCQkJYnJlYWs7CiAJCX0KQEAgLTg5MCw3ICs4ODksNyBAQAogCQkJCSAgICAgICBJUkRBX1NLQl9NQVhfTVRVKTsKIAogCWlmICghbmV3c2tiKSAgewotCQlzZWxmLT5zdGF0cy5yeF9kcm9wcGVkKys7CisJCXNlbGYtPm5ldGRldi0+c3RhdHMucnhfZHJvcHBlZCsrOwogCQkvKiBXZSBjb3VsZCBkZWxpdmVyIHRoZSBjdXJyZW50IHNrYiwgYnV0IHRoaXMgd291bGQgc3RhbGwKIAkJICogdGhlIFJ4IHBhdGguIEJldHRlciBkcm9wIHRoZSBwYWNrZXQuLi4gSmVhbiBJSSAqLwogCQlnb3RvIGRvbmU7ICAKQEAgLTkyNyw4ICs5MjYsOCBAQAogCW5ldGlmX3J4KGRhdGFza2IpOwogCiAJLyogS2VlcCBzdGF0cyB1cCB0byBkYXRlICovCi0Jc2VsZi0+c3RhdHMucnhfYnl0ZXMgKz0gbGVuOwotCXNlbGYtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKwlzZWxmLT5uZXRkZXYtPnN0YXRzLnJ4X2J5dGVzICs9IGxlbjsKKwlzZWxmLT5uZXRkZXYtPnN0YXRzLnJ4X3BhY2tldHMrKzsKIAogZG9uZToKIAkvKiBOb3RlIDogYXQgdGhpcyBwb2ludCwgdGhlIFVSQiB3ZSd2ZSBqdXN0IHJlY2VpdmVkICh1cmIpCkBAIC0xMDc0LDcgKzEwNzMsNyBAQAogewogCXVuc2lnbmVkIGludCBpOwogCWludCByZXQ7Ci0JY2hhciBzdGlyNDIxeF9md19uYW1lWzExXTsKKwljaGFyIHN0aXI0MjF4X2Z3X25hbWVbMTJdOwogCWNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZnc7CiAJY29uc3QgdW5zaWduZWQgY2hhciAqZndfdmVyc2lvbl9wdHI7IC8qIHBvaW50ZXIgdG8gdmVyc2lvbiBzdHJpbmcgKi8KIAl1bnNpZ25lZCBsb25nIGZ3X3ZlcnNpb24gPSAwOwpAQCAtMTM0MiwxNCArMTM0MSw2IEBACiB9CiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qCi0gKiBHZXQgZGV2aWNlIHN0YXRzIChmb3IgL3Byb2MvbmV0L2RldiBhbmQgaWZjb25maWcpCi0gKi8KLXN0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqaXJkYV91c2JfbmV0X2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQotewotCXN0cnVjdCBpcmRhX3VzYl9jYiAqc2VsZiA9IG5ldGRldl9wcml2KGRldik7Ci0JcmV0dXJuICZzZWxmLT5zdGF0czsKLX0KIAogLyoqKioqKioqKioqKioqKioqKioqKiBJUkRBIENPTkZJRyBTVUJST1VUSU5FUyAqKioqKioqKioqKioqKioqKioqKiovCiAvKgpAQCAtMTQyOCw3ICsxNDE5LDYgQEAKIAluZXRkZXYtPndhdGNoZG9nX3RpbWVvICA9IDI1MCpIWi8xMDAwOwkvKiAyNTAgbXMgPiBVU0IgdGltZW91dCAqLwogCW5ldGRldi0+b3BlbiAgICAgICAgICAgID0gaXJkYV91c2JfbmV0X29wZW47CiAJbmV0ZGV2LT5zdG9wICAgICAgICAgICAgPSBpcmRhX3VzYl9uZXRfY2xvc2U7Ci0JbmV0ZGV2LT5nZXRfc3RhdHMJPSBpcmRhX3VzYl9uZXRfZ2V0X3N0YXRzOwogCW5ldGRldi0+ZG9faW9jdGwgICAgICAgID0gaXJkYV91c2JfbmV0X2lvY3RsOwogCiAJcmV0dXJuIHJlZ2lzdGVyX25ldGRldihuZXRkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXJkYS9pcmRhLXVzYi5oIGIvZHJpdmVycy9uZXQvaXJkYS9pcmRhLXVzYi5oCmluZGV4IGEwY2E5YzEuLmFjMDQ0M2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2lyZGEvaXJkYS11c2IuaAorKysgYi9kcml2ZXJzL25ldC9pcmRhL2lyZGEtdXNiLmgKQEAgLTE1Miw3ICsxNTIsNiBAQAogCXN0cnVjdCB1cmIgKnNwZWVkX3VyYjsJCS8qIFVSQiB1c2VkIHRvIHNlbmQgc3BlZWQgY29tbWFuZHMgKi8KIAkKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2OwkvKiBZZXMhIHdlIGFyZSBzb21lIGtpbmQgb2YgbmV0ZGV2LiAqLwotCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOwogCXN0cnVjdCBpcmxhcF9jYiAgICppcmxhcDsJLyogVGhlIGxpbmsgbGF5ZXIgd2UgYXJlIGJpbmRlZCB0byAqLwogCXN0cnVjdCBxb3NfaW5mbyBxb3M7CiAJY2hhciAqc3BlZWRfYnVmZjsJCS8qIEJ1ZmZlciBmb3Igc3BlZWQgY2hhbmdlcyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXJkYS9raW5nc3VuLXNpci5jIGIvZHJpdmVycy9uZXQvaXJkYS9raW5nc3VuLXNpci5jCmluZGV4IGM3NDdjODcuLmI0YTYxNzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2lyZGEva2luZ3N1bi1zaXIuYworKysgYi9kcml2ZXJzL25ldC9pcmRhL2tpbmdzdW4tc2lyLmMKQEAgLTEwNSw3ICsxMDUsNyBAQAogCXN0cnVjdCB1c2JfZGV2aWNlICp1c2JkZXY7ICAgICAgLyogaW5pdDogcHJvYmVfaXJkYSAqLwogCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXY7ICAgICAgLyogbmV0d29yayBsYXllciAqLwogCXN0cnVjdCBpcmxhcF9jYiAgICppcmxhcDsgICAgICAgLyogVGhlIGxpbmsgbGF5ZXIgd2UgYXJlIGJpbmRlZCB0byAqLwotCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOwkvKiBuZXR3b3JrIHN0YXRpc3RpY3MgKi8KKwogCXN0cnVjdCBxb3NfaW5mbyAgIHFvczsKIAogCV9fdTgJCSAgKmluX2J1ZjsJLyogcmVjZWl2ZSBidWZmZXIgKi8KQEAgLTE4NiwxMiArMTg2LDEyIEBACiAJCWNhc2UgLUVQSVBFOgogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6Ci0JCQlraW5nc3VuLT5zdGF0cy50eF9lcnJvcnMrKzsKKwkJCW5ldGRldi0+c3RhdHMudHhfZXJyb3JzKys7CiAJCQluZXRpZl9zdGFydF9xdWV1ZShuZXRkZXYpOwogCQl9CiAJfSBlbHNlIHsKLQkJa2luZ3N1bi0+c3RhdHMudHhfcGFja2V0cysrOwotCQlraW5nc3VuLT5zdGF0cy50eF9ieXRlcyArPSBza2ItPmxlbjsKKwkJbmV0ZGV2LT5zdGF0cy50eF9wYWNrZXRzKys7CisJCW5ldGRldi0+c3RhdHMudHhfYnl0ZXMgKz0gc2tiLT5sZW47CiAJfQogCiAJZGV2X2tmcmVlX3NrYihza2IpOwpAQCAtMjMyLDcgKzIzMiw3IEBACiAJCWlmIChieXRlc1swXSA+PSAxICYmIGJ5dGVzWzBdIDwga2luZ3N1bi0+bWF4X3J4KSB7CiAJCQlmb3IgKGkgPSAxOyBpIDw9IGJ5dGVzWzBdOyBpKyspIHsKIAkJCQlhc3luY191bndyYXBfY2hhcihraW5nc3VuLT5uZXRkZXYsCi0JCQkJCQkgICZraW5nc3VuLT5zdGF0cywKKwkJCQkJCSAgJmtpbmdzdW4tPm5ldGRldi0+c3RhdHMsCiAJCQkJCQkgICZraW5nc3VuLT5yeF9idWZmLCBieXRlc1tpXSk7CiAJCQl9CiAJCQlkb19nZXR0aW1lb2ZkYXkoJmtpbmdzdW4tPnJ4X3RpbWUpOwpAQCAtNDE4LDE1ICs0MTgsNiBAQAogCXJldHVybiByZXQ7CiB9CiAKLS8qCi0gKiBHZXQgZGV2aWNlIHN0YXRzIChmb3IgL3Byb2MvbmV0L2RldiBhbmQgaWZjb25maWcpCi0gKi8KLXN0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqCi1raW5nc3VuX25ldF9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKLXsKLQlzdHJ1Y3Qga2luZ3N1bl9jYiAqa2luZ3N1biA9IG5ldGRldl9wcml2KG5ldGRldik7Ci0JcmV0dXJuICZraW5nc3VuLT5zdGF0czsKLX0KIAogLyoKICAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYnkgdGhlIFVTQiBzdWJzeXN0ZW0gZm9yIGVhY2ggbmV3IGRldmljZQpAQCAtNTMyLDcgKzUyMyw2IEBACiAJbmV0LT5oYXJkX3N0YXJ0X3htaXQgPSBraW5nc3VuX2hhcmRfeG1pdDsKIAluZXQtPm9wZW4gICAgICAgICAgICA9IGtpbmdzdW5fbmV0X29wZW47CiAJbmV0LT5zdG9wICAgICAgICAgICAgPSBraW5nc3VuX25ldF9jbG9zZTsKLQluZXQtPmdldF9zdGF0cwkgICAgID0ga2luZ3N1bl9uZXRfZ2V0X3N0YXRzOwogCW5ldC0+ZG9faW9jdGwgICAgICAgID0ga2luZ3N1bl9uZXRfaW9jdGw7CiAKIAlyZXQgPSByZWdpc3Rlcl9uZXRkZXYobmV0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2lyZGEva3M5NTktc2lyLmMgYi9kcml2ZXJzL25ldC9pcmRhL2tzOTU5LXNpci5jCmluZGV4IDYwMGQ5NmYuLjU1MzIyZmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2lyZGEva3M5NTktc2lyLmMKKysrIGIvZHJpdmVycy9uZXQvaXJkYS9rczk1OS1zaXIuYwpAQCAtMTc0LDcgKzE3NCw3IEBACiAJc3RydWN0IHVzYl9kZXZpY2UgKnVzYmRldjsJLyogaW5pdDogcHJvYmVfaXJkYSAqLwogCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXY7CS8qIG5ldHdvcmsgbGF5ZXIgKi8KIAlzdHJ1Y3QgaXJsYXBfY2IgKmlybGFwOwkvKiBUaGUgbGluayBsYXllciB3ZSBhcmUgYmluZGVkIHRvICovCi0Jc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CS8qIG5ldHdvcmsgc3RhdGlzdGljcyAqLworCiAJc3RydWN0IHFvc19pbmZvIHFvczsKIAogCXN0cnVjdCB1c2JfY3RybHJlcXVlc3QgKnR4X3NldHVwcmVxdWVzdDsKQEAgLTM2Niw3ICszNjYsNyBAQAogCQkJCWNhc2UgLUVQSVBFOgogCQkJCQlicmVhazsKIAkJCQlkZWZhdWx0OgotCQkJCQlraW5nc3VuLT5zdGF0cy50eF9lcnJvcnMrKzsKKwkJCQkJbmV0ZGV2LT5zdGF0cy50eF9lcnJvcnMrKzsKIAkJCQkJbmV0aWZfc3RhcnRfcXVldWUobmV0ZGV2KTsKIAkJCQl9CiAJCQl9CkBAIC00MTYsMTIgKzQxNiwxMiBAQAogCQljYXNlIC1FUElQRToKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgotCQkJa2luZ3N1bi0+c3RhdHMudHhfZXJyb3JzKys7CisJCQluZXRkZXYtPnN0YXRzLnR4X2Vycm9ycysrOwogCQkJbmV0aWZfc3RhcnRfcXVldWUobmV0ZGV2KTsKIAkJfQogCX0gZWxzZSB7Ci0JCWtpbmdzdW4tPnN0YXRzLnR4X3BhY2tldHMrKzsKLQkJa2luZ3N1bi0+c3RhdHMudHhfYnl0ZXMgKz0gc2tiLT5sZW47CisJCW5ldGRldi0+c3RhdHMudHhfcGFja2V0cysrOworCQluZXRkZXYtPnN0YXRzLnR4X2J5dGVzICs9IHNrYi0+bGVuOwogCiAJfQogCkBAIC00NjksNyArNDY5LDcgQEAKIAkJCSAqLwogCQkJaWYgKGtpbmdzdW4tPnJ4X3ZhcmlhYmxlX3hvcm1hc2sgIT0gMCkgewogCQkJCWFzeW5jX3Vud3JhcF9jaGFyKGtpbmdzdW4tPm5ldGRldiwKLQkJCQkJCSAgJmtpbmdzdW4tPnN0YXRzLAorCQkJCQkJICAma2luZ3N1bi0+bmV0ZGV2LT5zdGF0cywKIAkJCQkJCSAgJmtpbmdzdW4tPnJ4X3Vud3JhcF9idWZmLAogCQkJCQkJICBieXRlc1tpXSk7CiAJCQl9CkBAIC02NjksMTUgKzY2OSw2IEBACiB9CiAKIC8qCi0gKiBHZXQgZGV2aWNlIHN0YXRzIChmb3IgL3Byb2MvbmV0L2RldiBhbmQgaWZjb25maWcpCi0gKi8KLXN0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqa3M5NTlfbmV0X2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQotewotCXN0cnVjdCBrczk1OV9jYiAqa2luZ3N1biA9IG5ldGRldl9wcml2KG5ldGRldik7Ci0JcmV0dXJuICZraW5nc3VuLT5zdGF0czsKLX0KLQotLyoKICAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYnkgdGhlIFVTQiBzdWJzeXN0ZW0gZm9yIGVhY2ggbmV3IGRldmljZQogICogaW4gdGhlIHN5c3RlbS4gV2UgbmVlZCB0byBjaGVjayBpZiB0aGUgZGV2aWNlIGlzIG91cnMsIGFuZCBpbgogICogdGhpcyBjYXNlIHN0YXJ0IGhhbmRsaW5nIGl0LgpAQCAtNzkyLDcgKzc4Myw2IEBACiAJbmV0LT5oYXJkX3N0YXJ0X3htaXQgPSBrczk1OV9oYXJkX3htaXQ7CiAJbmV0LT5vcGVuID0ga3M5NTlfbmV0X29wZW47CiAJbmV0LT5zdG9wID0ga3M5NTlfbmV0X2Nsb3NlOwotCW5ldC0+Z2V0X3N0YXRzID0ga3M5NTlfbmV0X2dldF9zdGF0czsKIAluZXQtPmRvX2lvY3RsID0ga3M5NTlfbmV0X2lvY3RsOwogCiAJcmV0ID0gcmVnaXN0ZXJfbmV0ZGV2KG5ldCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pcmRhL2tzZGF6emxlLXNpci5jIGIvZHJpdmVycy9uZXQvaXJkYS9rc2RhenpsZS1zaXIuYwppbmRleCAwZTdmODkzLi41YjMyN2IwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9pcmRhL2tzZGF6emxlLXNpci5jCisrKyBiL2RyaXZlcnMvbmV0L2lyZGEva3NkYXp6bGUtc2lyLmMKQEAgLTE0MCw3ICsxNDAsNyBAQAogCXN0cnVjdCB1c2JfZGV2aWNlICp1c2JkZXY7CS8qIGluaXQ6IHByb2JlX2lyZGEgKi8KIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2OwkvKiBuZXR3b3JrIGxheWVyICovCiAJc3RydWN0IGlybGFwX2NiICppcmxhcDsJLyogVGhlIGxpbmsgbGF5ZXIgd2UgYXJlIGJpbmRlZCB0byAqLwotCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOwkvKiBuZXR3b3JrIHN0YXRpc3RpY3MgKi8KKwogCXN0cnVjdCBxb3NfaW5mbyBxb3M7CiAKIAlzdHJ1Y3QgdXJiICp0eF91cmI7CkBAIC0yNzgsNyArMjc4LDcgQEAKIAkJCQljYXNlIC1FUElQRToKIAkJCQkJYnJlYWs7CiAJCQkJZGVmYXVsdDoKLQkJCQkJa2luZ3N1bi0+c3RhdHMudHhfZXJyb3JzKys7CisJCQkJCW5ldGRldi0+c3RhdHMudHhfZXJyb3JzKys7CiAJCQkJCW5ldGlmX3N0YXJ0X3F1ZXVlKG5ldGRldik7CiAJCQkJfQogCQkJfQpAQCAtMzI5LDEyICszMjksMTIgQEAKIAkJY2FzZSAtRVBJUEU6CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKLQkJCWtpbmdzdW4tPnN0YXRzLnR4X2Vycm9ycysrOworCQkJbmV0ZGV2LT5zdGF0cy50eF9lcnJvcnMrKzsKIAkJCW5ldGlmX3N0YXJ0X3F1ZXVlKG5ldGRldik7CiAJCX0KIAl9IGVsc2UgewotCQlraW5nc3VuLT5zdGF0cy50eF9wYWNrZXRzKys7Ci0JCWtpbmdzdW4tPnN0YXRzLnR4X2J5dGVzICs9IHNrYi0+bGVuOworCQluZXRkZXYtPnN0YXRzLnR4X3BhY2tldHMrKzsKKwkJbmV0ZGV2LT5zdGF0cy50eF9ieXRlcyArPSBza2ItPmxlbjsKIAogCX0KIApAQCAtMzQ4LDkgKzM0OCwxMCBAQAogc3RhdGljIHZvaWQga3NkYXp6bGVfcmN2X2lycShzdHJ1Y3QgdXJiICp1cmIpCiB7CiAJc3RydWN0IGtzZGF6emxlX2NiICpraW5nc3VuID0gdXJiLT5jb250ZXh0OworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBraW5nc3VuLT5uZXRkZXY7CiAKIAkvKiBpbiBwcm9jZXNzIG9mIHN0b3BwaW5nLCBqdXN0IGRyb3AgZGF0YSAqLwotCWlmICghbmV0aWZfcnVubmluZyhraW5nc3VuLT5uZXRkZXYpKSB7CisJaWYgKCFuZXRpZl9ydW5uaW5nKG5ldGRldikpIHsKIAkJa2luZ3N1bi0+cmVjZWl2aW5nID0gMDsKIAkJcmV0dXJuOwogCX0KQEAgLTM2OCw3ICszNjksNyBAQAogCQl1bnNpZ25lZCBpbnQgaTsKIAogCQlmb3IgKGkgPSAwOyBpIDwgdXJiLT5hY3R1YWxfbGVuZ3RoOyBpKyspIHsKLQkJCWFzeW5jX3Vud3JhcF9jaGFyKGtpbmdzdW4tPm5ldGRldiwgJmtpbmdzdW4tPnN0YXRzLAorCQkJYXN5bmNfdW53cmFwX2NoYXIobmV0ZGV2LCAmbmV0ZGV2LT5zdGF0cywKIAkJCQkJICAma2luZ3N1bi0+cnhfdW53cmFwX2J1ZmYsIGJ5dGVzW2ldKTsKIAkJfQogCQlraW5nc3VuLT5yZWNlaXZpbmcgPQpAQCAtNTYyLDE2ICs1NjMsNiBAQAogfQogCiAvKgotICogR2V0IGRldmljZSBzdGF0cyAoZm9yIC9wcm9jL25ldC9kZXYgYW5kIGlmY29uZmlnKQotICovCi1zdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmtzZGF6emxlX25ldF9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UKLQkJCQkJCSAgICAgICAqbmV0ZGV2KQotewotCXN0cnVjdCBrc2RhenpsZV9jYiAqa2luZ3N1biA9IG5ldGRldl9wcml2KG5ldGRldik7Ci0JcmV0dXJuICZraW5nc3VuLT5zdGF0czsKLX0KLQotLyoKICAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYnkgdGhlIFVTQiBzdWJzeXN0ZW0gZm9yIGVhY2ggbmV3IGRldmljZQogICogaW4gdGhlIHN5c3RlbS4gV2UgbmVlZCB0byBjaGVjayBpZiB0aGUgZGV2aWNlIGlzIG91cnMsIGFuZCBpbgogICogdGhpcyBjYXNlIHN0YXJ0IGhhbmRsaW5nIGl0LgpAQCAtNjk2LDcgKzY4Nyw2IEBACiAJbmV0LT5oYXJkX3N0YXJ0X3htaXQgPSBrc2RhenpsZV9oYXJkX3htaXQ7CiAJbmV0LT5vcGVuID0ga3NkYXp6bGVfbmV0X29wZW47CiAJbmV0LT5zdG9wID0ga3NkYXp6bGVfbmV0X2Nsb3NlOwotCW5ldC0+Z2V0X3N0YXRzID0ga3NkYXp6bGVfbmV0X2dldF9zdGF0czsKIAluZXQtPmRvX2lvY3RsID0ga3NkYXp6bGVfbmV0X2lvY3RsOwogCiAJcmV0ID0gcmVnaXN0ZXJfbmV0ZGV2KG5ldCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pcmRhL21jczc3ODAuYyBiL2RyaXZlcnMvbmV0L2lyZGEvbWNzNzc4MC5jCmluZGV4IDkwNGM5NjEuLjdlYWZkY2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2lyZGEvbWNzNzc4MC5jCisrKyBiL2RyaXZlcnMvbmV0L2lyZGEvbWNzNzc4MC5jCkBAIC00MDMsOCArNDAzLDggQEAKIAlpZih1bmxpa2VseShuZXdfbGVuIDw9IDApKSB7CiAJCUlSREFfRVJST1IoIiVzIHNob3J0IGZyYW1lIGxlbmd0aCAlZFxuIiwKIAkJCSAgICAgbWNzLT5uZXRkZXYtPm5hbWUsIG5ld19sZW4pOwotCQkrK21jcy0+c3RhdHMucnhfZXJyb3JzOwotCQkrK21jcy0+c3RhdHMucnhfbGVuZ3RoX2Vycm9yczsKKwkJKyttY3MtPm5ldGRldi0+c3RhdHMucnhfZXJyb3JzOworCQkrK21jcy0+bmV0ZGV2LT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzOwogCQlyZXR1cm47CiAJfQogCWZjcyA9IDA7CkBAIC00MTMsMTQgKzQxMywxNCBAQAogCWlmKGZjcyAhPSBHT09EX0ZDUykgewogCQlJUkRBX0VSUk9SKCJjcmMgZXJyb3IgY2FsYyAweCV4IGxlbiAlZFxuIiwKIAkJCSAgIGZjcywgbmV3X2xlbik7Ci0JCW1jcy0+c3RhdHMucnhfZXJyb3JzKys7Ci0JCW1jcy0+c3RhdHMucnhfY3JjX2Vycm9ycysrOworCQltY3MtPm5ldGRldi0+c3RhdHMucnhfZXJyb3JzKys7CisJCW1jcy0+bmV0ZGV2LT5zdGF0cy5yeF9jcmNfZXJyb3JzKys7CiAJCXJldHVybjsKIAl9CiAKIAlza2IgPSBkZXZfYWxsb2Nfc2tiKG5ld19sZW4gKyAxKTsKIAlpZih1bmxpa2VseSghc2tiKSkgewotCQkrK21jcy0+c3RhdHMucnhfZHJvcHBlZDsKKwkJKyttY3MtPm5ldGRldi0+c3RhdHMucnhfZHJvcHBlZDsKIAkJcmV0dXJuOwogCX0KIApAQCAtNDMzLDggKzQzMyw4IEBACiAKIAluZXRpZl9yeChza2IpOwogCi0JbWNzLT5zdGF0cy5yeF9wYWNrZXRzKys7Ci0JbWNzLT5zdGF0cy5yeF9ieXRlcyArPSBuZXdfbGVuOworCW1jcy0+bmV0ZGV2LT5zdGF0cy5yeF9wYWNrZXRzKys7CisJbWNzLT5uZXRkZXYtPnN0YXRzLnJ4X2J5dGVzICs9IG5ld19sZW47CiAKIAlyZXR1cm47CiB9CkBAIC00NTgsMjIgKzQ1OCwyMiBAQAogCWlmKHVubGlrZWx5KG5ld19sZW4gPD0gMCkpIHsKIAkJSVJEQV9FUlJPUigiJXMgc2hvcnQgZnJhbWUgbGVuZ3RoICVkXG4iLAogCQkJICAgbWNzLT5uZXRkZXYtPm5hbWUsIG5ld19sZW4pOwotCQkrK21jcy0+c3RhdHMucnhfZXJyb3JzOwotCQkrK21jcy0+c3RhdHMucnhfbGVuZ3RoX2Vycm9yczsKKwkJKyttY3MtPm5ldGRldi0+c3RhdHMucnhfZXJyb3JzOworCQkrK21jcy0+bmV0ZGV2LT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzOwogCQlyZXR1cm47CiAJfQogCiAJZmNzID0gfihjcmMzMl9sZSh+MCwgYnVmLCBuZXdfbGVuKSk7CiAJaWYoZmNzICE9IGdldF91bmFsaWduZWRfbGUzMihidWYgKyBuZXdfbGVuKSkgewogCQlJUkRBX0VSUk9SKCJjcmMgZXJyb3IgY2FsYyAweCV4IGxlbiAlZFxuIiwgZmNzLCBuZXdfbGVuKTsKLQkJbWNzLT5zdGF0cy5yeF9lcnJvcnMrKzsKLQkJbWNzLT5zdGF0cy5yeF9jcmNfZXJyb3JzKys7CisJCW1jcy0+bmV0ZGV2LT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkJbWNzLT5uZXRkZXYtPnN0YXRzLnJ4X2NyY19lcnJvcnMrKzsKIAkJcmV0dXJuOwogCX0KIAogCXNrYiA9IGRldl9hbGxvY19za2IobmV3X2xlbiArIDEpOwogCWlmKHVubGlrZWx5KCFza2IpKSB7Ci0JCSsrbWNzLT5zdGF0cy5yeF9kcm9wcGVkOworCQkrK21jcy0+bmV0ZGV2LT5zdGF0cy5yeF9kcm9wcGVkOwogCQlyZXR1cm47CiAJfQogCkBAIC00ODYsOCArNDg2LDggQEAKIAogCW5ldGlmX3J4KHNrYik7CiAKLQltY3MtPnN0YXRzLnJ4X3BhY2tldHMrKzsKLQltY3MtPnN0YXRzLnJ4X2J5dGVzICs9IG5ld19sZW47CisJbWNzLT5uZXRkZXYtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKwltY3MtPm5ldGRldi0+c3RhdHMucnhfYnl0ZXMgKz0gbmV3X2xlbjsKIAogCXJldHVybjsKIH0KQEAgLTc1NiwxNCArNzU2LDYgQEAKIAkJcmV0dXJuIHJldDsKIH0KIAotCi0vKiBHZXQgZGV2aWNlIHN0YXRzIGZvciAvcHJvYy9uZXQvZGV2IGFuZCBpZmNvbmZpZyAqLwotc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICptY3NfbmV0X2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQotewotCXN0cnVjdCBtY3NfY2IgKm1jcyA9IG5ldGRldl9wcml2KG5ldGRldik7Ci0JcmV0dXJuICZtY3MtPnN0YXRzOwotfQotCiAvKiBSZWNlaXZlIGNhbGxiYWNrIGZ1bmN0aW9uLiAgKi8KIHN0YXRpYyB2b2lkIG1jc19yZWNlaXZlX2lycShzdHJ1Y3QgdXJiICp1cmIpCiB7CkBAIC03ODYsMTQgKzc3OCwxNCBAQAogCQkgKi8KIAkJLyogU0lSIHNwZWVkICovCiAJCWlmKG1jcy0+c3BlZWQgPCA1NzYwMDApIHsKLQkJCWFzeW5jX3Vud3JhcF9jaGFyKG1jcy0+bmV0ZGV2LCAmbWNzLT5zdGF0cywKKwkJCWFzeW5jX3Vud3JhcF9jaGFyKG1jcy0+bmV0ZGV2LCAmbWNzLT5uZXRkZXYtPnN0YXRzLAogCQkJCSAgJm1jcy0+cnhfYnVmZiwgMHhjMCk7CiAKIAkJCWZvciAoaSA9IDA7IGkgPCB1cmItPmFjdHVhbF9sZW5ndGg7IGkrKykKLQkJCQlhc3luY191bndyYXBfY2hhcihtY3MtPm5ldGRldiwgJm1jcy0+c3RhdHMsCisJCQkJYXN5bmNfdW53cmFwX2NoYXIobWNzLT5uZXRkZXYsICZtY3MtPm5ldGRldi0+c3RhdHMsCiAJCQkJCSAgJm1jcy0+cnhfYnVmZiwgYnl0ZXNbaV0pOwogCi0JCQlhc3luY191bndyYXBfY2hhcihtY3MtPm5ldGRldiwgJm1jcy0+c3RhdHMsCisJCQlhc3luY191bndyYXBfY2hhcihtY3MtPm5ldGRldiwgJm1jcy0+bmV0ZGV2LT5zdGF0cywKIAkJCQkgICZtY3MtPnJ4X2J1ZmYsIDB4YzEpOwogCQl9CiAJCS8qIE1JUiBzcGVlZCAqLwpAQCAtODY4LDEyICs4NjAsMTIgQEAKIAkJY2FzZSAtRVBJUEU6CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKLQkJCW1jcy0+c3RhdHMudHhfZXJyb3JzKys7CisJCQltY3MtPm5ldGRldi0+c3RhdHMudHhfZXJyb3JzKys7CiAJCQluZXRpZl9zdGFydF9xdWV1ZShuZGV2KTsKIAkJfQogCX0gZWxzZSB7Ci0JCW1jcy0+c3RhdHMudHhfcGFja2V0cysrOwotCQltY3MtPnN0YXRzLnR4X2J5dGVzICs9IHNrYi0+bGVuOworCQltY3MtPm5ldGRldi0+c3RhdHMudHhfcGFja2V0cysrOworCQltY3MtPm5ldGRldi0+c3RhdHMudHhfYnl0ZXMgKz0gc2tiLT5sZW47CiAJfQogCiAJZGV2X2tmcmVlX3NrYihza2IpOwpAQCAtOTMxLDcgKzkyMyw2IEBACiAJbmRldi0+aGFyZF9zdGFydF94bWl0ID0gbWNzX2hhcmRfeG1pdDsKIAluZGV2LT5vcGVuID0gbWNzX25ldF9vcGVuOwogCW5kZXYtPnN0b3AgPSBtY3NfbmV0X2Nsb3NlOwotCW5kZXYtPmdldF9zdGF0cyA9IG1jc19uZXRfZ2V0X3N0YXRzOwogCW5kZXYtPmRvX2lvY3RsID0gbWNzX25ldF9pb2N0bDsKIAogCWlmICghaW50Zi0+Y3VyX2FsdHNldHRpbmcpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pcmRhL21jczc3ODAuaCBiL2RyaXZlcnMvbmV0L2lyZGEvbWNzNzc4MC5oCmluZGV4IGIxODE0OGMuLjZiZGM2MjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2lyZGEvbWNzNzc4MC5oCisrKyBiL2RyaXZlcnMvbmV0L2lyZGEvbWNzNzc4MC5oCkBAIC0xMDQsNyArMTA0LDYgQEAKIAlzdHJ1Y3QgdXNiX2RldmljZSAqdXNiZGV2OwkvKiBpbml0OiBwcm9iZV9pcmRhICovCiAJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsJLyogbmV0d29yayBsYXllciAqLwogCXN0cnVjdCBpcmxhcF9jYiAqaXJsYXA7CS8qIFRoZSBsaW5rIGxheWVyIHdlIGFyZSBiaW5kZWQgdG8gKi8KLQlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsJLyogbmV0d29yayBzdGF0aXN0aWNzICovCiAJc3RydWN0IHFvc19pbmZvIHFvczsKIAl1bnNpZ25lZCBpbnQgc3BlZWQ7CS8qIEN1cnJlbnQgc3BlZWQgKi8KIAl1bnNpZ25lZCBpbnQgbmV3X3NwZWVkOwkvKiBuZXcgc3BlZWQgKi8KQEAgLTE1NCw3ICsxNTMsNiBAQAogc3RhdGljIGludCBtY3NfbmV0X2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHN0cnVjdCBpZnJlcSAqcnEsIGludCBjbWQpOwogc3RhdGljIGludCBtY3NfbmV0X2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpOwogc3RhdGljIGludCBtY3NfbmV0X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldik7Ci1zdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKm1jc19uZXRfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpOwogCiBzdGF0aWMgdm9pZCBtY3NfcmVjZWl2ZV9pcnEoc3RydWN0IHVyYiAqdXJiKTsKIHN0YXRpYyB2b2lkIG1jc19zZW5kX2lycShzdHJ1Y3QgdXJiICp1cmIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXJkYS9uc2MtaXJjYy5jIGIvZHJpdmVycy9uZXQvaXJkYS9uc2MtaXJjYy5jCmluZGV4IDJjNmJmMmQuLjYxZTUwOWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2lyZGEvbnNjLWlyY2MuYworKysgYi9kcml2ZXJzL25ldC9pcmRhL25zYy1pcmNjLmMKQEAgLTE4NSw3ICsxODUsNiBAQAogc3RhdGljIGludCAgbnNjX2lyY2NfbmV0X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiBzdGF0aWMgaW50ICBuc2NfaXJjY19uZXRfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiBzdGF0aWMgaW50ICBuc2NfaXJjY19uZXRfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICpycSwgaW50IGNtZCk7Ci1zdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKm5zY19pcmNjX25ldF9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiAKIC8qIEdsb2JhbHMgKi8KIHN0YXRpYyBpbnQgcG5wX3JlZ2lzdGVyZWQ7CkBAIC00NDYsNyArNDQ1LDYgQEAKIAlkZXYtPm9wZW4gICAgICAgICAgICA9IG5zY19pcmNjX25ldF9vcGVuOwogCWRldi0+c3RvcCAgICAgICAgICAgID0gbnNjX2lyY2NfbmV0X2Nsb3NlOwogCWRldi0+ZG9faW9jdGwgICAgICAgID0gbnNjX2lyY2NfbmV0X2lvY3RsOwotCWRldi0+Z2V0X3N0YXRzCSAgICAgPSBuc2NfaXJjY19uZXRfZ2V0X3N0YXRzOwogCiAJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CiAJaWYgKGVycikgewpAQCAtMTQwMSw3ICsxMzk5LDcgQEAKIAlzZWxmLT50eF9idWZmLmxlbiA9IGFzeW5jX3dyYXBfc2tiKHNrYiwgc2VsZi0+dHhfYnVmZi5kYXRhLCAKIAkJCQkJICAgc2VsZi0+dHhfYnVmZi50cnVlc2l6ZSk7CiAKLQlzZWxmLT5zdGF0cy50eF9ieXRlcyArPSBzZWxmLT50eF9idWZmLmxlbjsKKwlkZXYtPnN0YXRzLnR4X2J5dGVzICs9IHNlbGYtPnR4X2J1ZmYubGVuOwogCQogCS8qIEFkZCBpbnRlcnJ1cHQgb24gdHggbG93IGxldmVsICh3aWxsIGZpcmUgaW1tZWRpYXRlbHkpICovCiAJc3dpdGNoX2JhbmsoaW9iYXNlLCBCQU5LMCk7CkBAIC0xNDczLDcgKzE0NzEsNyBAQAogCXNlbGYtPnR4X2ZpZm8ucXVldWVbc2VsZi0+dHhfZmlmby5mcmVlXS5sZW4gPSBza2ItPmxlbjsKIAlzZWxmLT50eF9maWZvLnRhaWwgKz0gc2tiLT5sZW47CiAKLQlzZWxmLT5zdGF0cy50eF9ieXRlcyArPSBza2ItPmxlbjsKKwlkZXYtPnN0YXRzLnR4X2J5dGVzICs9IHNrYi0+bGVuOwogCiAJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YShza2IsIHNlbGYtPnR4X2ZpZm8ucXVldWVbc2VsZi0+dHhfZmlmby5mcmVlXS5zdGFydCwKIAkJICAgICAgc2tiLT5sZW4pOwpAQCAtMTY1MiwxMyArMTY1MCwxMyBAQAogCQogCS8qIENoZWNrIGZvciB1bmRlcnJydW4hICovCiAJaWYgKGluYihpb2Jhc2UrQVNDUikgJiBBU0NSX1RYVVIpIHsKLQkJc2VsZi0+c3RhdHMudHhfZXJyb3JzKys7Ci0JCXNlbGYtPnN0YXRzLnR4X2ZpZm9fZXJyb3JzKys7CisJCXNlbGYtPm5ldGRldi0+c3RhdHMudHhfZXJyb3JzKys7CisJCXNlbGYtPm5ldGRldi0+c3RhdHMudHhfZmlmb19lcnJvcnMrKzsKIAkJCiAJCS8qIENsZWFyIGJpdCwgYnkgd3JpdGluZyAxIGludG8gaXQgKi8KIAkJb3V0YihBU0NSX1RYVVIsIGlvYmFzZStBU0NSKTsKIAl9IGVsc2UgewotCQlzZWxmLT5zdGF0cy50eF9wYWNrZXRzKys7CisJCXNlbGYtPm5ldGRldi0+c3RhdHMudHhfcGFja2V0cysrOwogCX0KIAogCS8qIEZpbmlzaGVkIHdpdGggdGhpcyBmcmFtZSwgc28gcHJlcGFyZSBmb3IgbmV4dCAqLwpAQCAtMTc5MywyOCArMTc5MSwyOCBAQAogCQlpZiAoc3RhdHVzICYgRlJNX1NUX0VSUl9NU0spIHsKIAkJCWlmIChzdGF0dXMgJiBGUk1fU1RfTE9TVF9GUikgewogCQkJCS8qIEFkZCBudW1iZXIgb2YgbG9zdCBmcmFtZXMgdG8gc3RhdHMgKi8KLQkJCQlzZWxmLT5zdGF0cy5yeF9lcnJvcnMgKz0gbGVuOwkKKwkJCQlzZWxmLT5uZXRkZXYtPnN0YXRzLnJ4X2Vycm9ycyArPSBsZW47CiAJCQl9IGVsc2UgewogCQkJCS8qIFNraXAgZnJhbWUgKi8KLQkJCQlzZWxmLT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkJCQlzZWxmLT5uZXRkZXYtPnN0YXRzLnJ4X2Vycm9ycysrOwogCQkJCQogCQkJCXNlbGYtPnJ4X2J1ZmYuZGF0YSArPSBsZW47CiAJCQkKIAkJCQlpZiAoc3RhdHVzICYgRlJNX1NUX01BWF9MRU4pCi0JCQkJCXNlbGYtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMrKzsKKwkJCQkJc2VsZi0+bmV0ZGV2LT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzKys7CiAJCQkJCiAJCQkJaWYgKHN0YXR1cyAmIEZSTV9TVF9QSFlfRVJSKSAKLQkJCQkJc2VsZi0+c3RhdHMucnhfZnJhbWVfZXJyb3JzKys7CisJCQkJCXNlbGYtPm5ldGRldi0+c3RhdHMucnhfZnJhbWVfZXJyb3JzKys7CiAJCQkJCiAJCQkJaWYgKHN0YXR1cyAmIEZSTV9TVF9CQURfQ1JDKSAKLQkJCQkJc2VsZi0+c3RhdHMucnhfY3JjX2Vycm9ycysrOworCQkJCQlzZWxmLT5uZXRkZXYtPnN0YXRzLnJ4X2NyY19lcnJvcnMrKzsKIAkJCX0KIAkJCS8qIFRoZSBlcnJvcnMgYmVsb3cgY2FuIGJlIHJlcG9ydGVkIGluIGJvdGggY2FzZXMgKi8KIAkJCWlmIChzdGF0dXMgJiBGUk1fU1RfT1ZSMSkKLQkJCQlzZWxmLT5zdGF0cy5yeF9maWZvX2Vycm9ycysrOwkJICAgICAgIAorCQkJCXNlbGYtPm5ldGRldi0+c3RhdHMucnhfZmlmb19lcnJvcnMrKzsKIAkJCQogCQkJaWYgKHN0YXR1cyAmIEZSTV9TVF9PVlIyKQotCQkJCXNlbGYtPnN0YXRzLnJ4X2ZpZm9fZXJyb3JzKys7CisJCQkJc2VsZi0+bmV0ZGV2LT5zdGF0cy5yeF9maWZvX2Vycm9ycysrOwogCQl9IGVsc2UgewogCQkJLyogIAogCQkJICogRmlyc3Qgd2UgbXVzdCBtYWtlIHN1cmUgdGhhdCB0aGUgZnJhbWUgd2UKQEAgLTE4NjMsNyArMTg2MSw3IEBACiAJCQkJSVJEQV9XQVJOSU5HKCIlcygpLCBtZW1vcnkgc3F1ZWV6ZSwgIgogCQkJCQkgICAgICJkcm9wcGluZyBmcmFtZS5cbiIsCiAJCQkJCSAgICAgX19mdW5jX18pOwotCQkJCXNlbGYtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKKwkJCQlzZWxmLT5uZXRkZXYtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKIAogCQkJCS8qIFJlc3RvcmUgYmFuayByZWdpc3RlciAqLwogCQkJCW91dGIoYmFuaywgaW9iYXNlK0JTUik7CkBAIC0xODg5LDggKzE4ODcsOCBAQAogCiAJCQkvKiBNb3ZlIHRvIG5leHQgZnJhbWUgKi8KIAkJCXNlbGYtPnJ4X2J1ZmYuZGF0YSArPSBsZW47Ci0JCQlzZWxmLT5zdGF0cy5yeF9ieXRlcyArPSBsZW47Ci0JCQlzZWxmLT5zdGF0cy5yeF9wYWNrZXRzKys7CisJCQlzZWxmLT5uZXRkZXYtPnN0YXRzLnJ4X2J5dGVzICs9IGxlbjsKKwkJCXNlbGYtPm5ldGRldi0+c3RhdHMucnhfcGFja2V0cysrOwogCiAJCQlza2ItPmRldiA9IHNlbGYtPm5ldGRldjsKIAkJCXNrYl9yZXNldF9tYWNfaGVhZGVyKHNrYik7CkBAIC0xOTIwLDggKzE5MTgsOCBAQAogCS8qICBSZWNlaXZlIGFsbCBjaGFyYWN0ZXJzIGluIFJ4IEZJRk8gKi8KIAlkbyB7CiAJCWJ5dGUgPSBpbmIoaW9iYXNlK1JYRCk7Ci0JCWFzeW5jX3Vud3JhcF9jaGFyKHNlbGYtPm5ldGRldiwgJnNlbGYtPnN0YXRzLCAmc2VsZi0+cnhfYnVmZiwgCi0JCQkJICBieXRlKTsKKwkJYXN5bmNfdW53cmFwX2NoYXIoc2VsZi0+bmV0ZGV2LCAmc2VsZi0+bmV0ZGV2LT5zdGF0cywKKwkJCQkgICZzZWxmLT5yeF9idWZmLCBieXRlKTsKIAl9IHdoaWxlIChpbmIoaW9iYXNlK0xTUikgJiBMU1JfUlhEQSk7IC8qIERhdGEgYXZhaWxhYmxlICovCQogfQogCkBAIC0xOTUyLDcgKzE5NTAsNyBAQAogCQkJc2VsZi0+aWVyID0gSUVSX1RYTERMX0lFOwogCQllbHNlIHsgCiAKLQkJCXNlbGYtPnN0YXRzLnR4X3BhY2tldHMrKzsKKwkJCXNlbGYtPm5ldGRldi0+c3RhdHMudHhfcGFja2V0cysrOwogCQkJbmV0aWZfd2FrZV9xdWV1ZShzZWxmLT5uZXRkZXYpOwogCQkJc2VsZi0+aWVyID0gSUVSX1RYRU1QX0lFOwogCQl9CkBAIC0yMzA3LDEzICsyMzA1LDYgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKm5zY19pcmNjX25ldF9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgbnNjX2lyY2NfY2IgKnNlbGYgPSBuZXRkZXZfcHJpdihkZXYpOwotCQotCXJldHVybiAmc2VsZi0+c3RhdHM7Ci19Ci0KIHN0YXRpYyBpbnQgbnNjX2lyY2Nfc3VzcGVuZChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKIHsKICAgICAgCXN0cnVjdCBuc2NfaXJjY19jYiAqc2VsZiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKGRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pcmRhL25zYy1pcmNjLmggYi9kcml2ZXJzL25ldC9pcmRhL25zYy1pcmNjLmgKaW5kZXggNzFjZDNjNS4uN2JhNzczOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaXJkYS9uc2MtaXJjYy5oCisrKyBiL2RyaXZlcnMvbmV0L2lyZGEvbnNjLWlyY2MuaApAQCAtMjUxLDcgKzI1MSw2IEBACiAJc3RydWN0IHR4X2ZpZm8gdHhfZmlmbzsgICAgLyogSW5mbyBhYm91dCBmcmFtZXMgdG8gYmUgdHJhbnNtaXR0ZWQgKi8KIAogCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXY7ICAgICAvKiBZZXMhIHdlIGFyZSBzb21lIGtpbmQgb2YgbmV0ZGV2aWNlICovCi0Jc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CiAJCiAJc3RydWN0IGlybGFwX2NiICppcmxhcDsgICAgLyogVGhlIGxpbmsgbGF5ZXIgd2UgYXJlIGJpbmRlZCB0byAqLwogCXN0cnVjdCBxb3NfaW5mbyBxb3M7ICAgICAgIC8qIFFvUyBjYXBhYmlsaXRpZXMgZm9yIHRoaXMgZGV2aWNlICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pcmRhL3B4YWZpY3BfaXIuYyBiL2RyaXZlcnMvbmV0L2lyZGEvcHhhZmljcF9pci5jCmluZGV4IDAwNGE5YWEuLjMxNzk0YzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2lyZGEvcHhhZmljcF9pci5jCisrKyBiL2RyaXZlcnMvbmV0L2lyZGEvcHhhZmljcF9pci5jCkBAIC0xMDgsNyArMTA4LDYgQEAKIAlpbnQJCQl0eGRtYTsKIAlpbnQJCQlyeGRtYTsKIAotCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzCXN0YXRzOwogCXN0cnVjdCBpcmxhcF9jYgkJKmlybGFwOwogCXN0cnVjdCBxb3NfaW5mbwkJcW9zOwogCkBAIC0yNTgsMTQgKzI1NywxNSBAQAogCQkJZGF0YSA9IFNUUkJSOwogCQkJaWYgKGxzciAmIChMU1JfT0UgfCBMU1JfUEUgfCBMU1JfRkUgfCBMU1JfQkkpKSB7CiAJCQkJcHJpbnRrKEtFUk5fREVCVUcgInB4YV9pcjogc2lyIHJlY2VpdmluZyBlcnJvclxuIik7Ci0JCQkJc2ktPnN0YXRzLnJ4X2Vycm9ycysrOworCQkJCWRldi0+c3RhdHMucnhfZXJyb3JzKys7CiAJCQkJaWYgKGxzciAmIExTUl9GRSkKLQkJCQkJc2ktPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycysrOworCQkJCQlkZXYtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycysrOwogCQkJCWlmIChsc3IgJiBMU1JfT0UpCi0JCQkJCXNpLT5zdGF0cy5yeF9maWZvX2Vycm9ycysrOworCQkJCQlkZXYtPnN0YXRzLnJ4X2ZpZm9fZXJyb3JzKys7CiAJCQl9IGVsc2UgewotCQkJCXNpLT5zdGF0cy5yeF9ieXRlcysrOwotCQkJCWFzeW5jX3Vud3JhcF9jaGFyKGRldiwgJnNpLT5zdGF0cywgJnNpLT5yeF9idWZmLCBkYXRhKTsKKwkJCQlkZXYtPnN0YXRzLnJ4X2J5dGVzKys7CisJCQkJYXN5bmNfdW53cmFwX2NoYXIoZGV2LCAmZGV2LT5zdGF0cywKKwkJCQkJCSAgJnNpLT5yeF9idWZmLCBkYXRhKTsKIAkJCX0KIAkJCWxzciA9IFNUTFNSOwogCQl9CkBAIC0yNzcsOCArMjc3LDggQEAKIAogCWNhc2UgMHgwQzogLyogQ2hhcmFjdGVyIFRpbWVvdXQgSW5kaWNhdGlvbiAqLwogCSAgCWRvICB7Ci0JCSAgICBzaS0+c3RhdHMucnhfYnl0ZXMrKzsKLQkgICAgICAgICAgICBhc3luY191bndyYXBfY2hhcihkZXYsICZzaS0+c3RhdHMsICZzaS0+cnhfYnVmZiwgU1RSQlIpOworCQkgICAgZGV2LT5zdGF0cy5yeF9ieXRlcysrOworCSAgICAgICAgICAgIGFzeW5jX3Vud3JhcF9jaGFyKGRldiwgJmRldi0+c3RhdHMsICZzaS0+cnhfYnVmZiwgU1RSQlIpOwogCSAgCX0gd2hpbGUgKFNUTFNSICYgTFNSX0RSKTsKIAkJc2ktPmxhc3Rfb3NjciA9IE9TQ1I7CiAJICAJYnJlYWs7CkBAIC0yOTAsOSArMjkwLDggQEAKIAkgICAgCX0KIAogCQlpZiAoc2ktPnR4X2J1ZmYubGVuID09IDApIHsKLQkJCXNpLT5zdGF0cy50eF9wYWNrZXRzKys7Ci0JCQlzaS0+c3RhdHMudHhfYnl0ZXMgKz0gc2ktPnR4X2J1ZmYuZGF0YSAtCi0JCQkJCSAgICAgIHNpLT50eF9idWZmLmhlYWQ7CisJCQlkZXYtPnN0YXRzLnR4X3BhY2tldHMrKzsKKwkJCWRldi0+c3RhdHMudHhfYnl0ZXMgKz0gc2ktPnR4X2J1ZmYuZGF0YSAtIHNpLT50eF9idWZmLmhlYWQ7CiAKICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFdlIG5lZWQgdG8gZW5zdXJlIHRoYXQgdGhlIHRyYW5zbWl0dGVyIGhhcyBmaW5pc2hlZC4gKi8KIAkJCXdoaWxlICgoU1RMU1IgJiBMU1JfVEVNVCkgPT0gMCkKQEAgLTM0MywxMCArMzQyLDEwIEBACiAJRENTUihjaGFubmVsKSA9IGRjc3IgJiB+RENTUl9SVU47CiAKIAlpZiAoZGNzciAmIERDU1JfRU5ESU5UUikgIHsKLQkJc2ktPnN0YXRzLnR4X3BhY2tldHMrKzsKLQkJc2ktPnN0YXRzLnR4X2J5dGVzICs9IHNpLT5kbWFfdHhfYnVmZl9sZW47CisJCWRldi0+c3RhdHMudHhfcGFja2V0cysrOworCQlkZXYtPnN0YXRzLnR4X2J5dGVzICs9IHNpLT5kbWFfdHhfYnVmZl9sZW47CiAJfSBlbHNlIHsKLQkJc2ktPnN0YXRzLnR4X2Vycm9ycysrOworCQlkZXYtPnN0YXRzLnR4X2Vycm9ycysrOwogCX0KIAogCXdoaWxlIChJQ1NSMSAmIElDU1IxX1RCWSkKQEAgLTM5MiwxNCArMzkxLDE0IEBACiAJCWRhdGEgPSBJQ0RSOwogCiAJCWlmIChzdGF0ICYgKElDU1IxX0NSRSB8IElDU1IxX1JPUikpIHsKLQkJCXNpLT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkJCWRldi0+c3RhdHMucnhfZXJyb3JzKys7CiAJCQlpZiAoc3RhdCAmIElDU1IxX0NSRSkgewogCQkJCXByaW50ayhLRVJOX0RFQlVHICJweGFfaXI6IGZpciByZWNlaXZlIENSQyBlcnJvclxuIik7Ci0JCQkJc2ktPnN0YXRzLnJ4X2NyY19lcnJvcnMrKzsKKwkJCQlkZXYtPnN0YXRzLnJ4X2NyY19lcnJvcnMrKzsKIAkJCX0KIAkJCWlmIChzdGF0ICYgSUNTUjFfUk9SKSB7CiAJCQkJcHJpbnRrKEtFUk5fREVCVUcgInB4YV9pcjogZmlyIHJlY2VpdmUgb3ZlcnJ1blxuIik7Ci0JCQkJc2ktPnN0YXRzLnJ4X292ZXJfZXJyb3JzKys7CisJCQkJZGV2LT5zdGF0cy5yeF9vdmVyX2Vycm9ycysrOwogCQkJfQogCQl9IGVsc2UJewogCQkJc2ktPmRtYV9yeF9idWZmW2xlbisrXSA9IGRhdGE7CkBAIC00MTUsMTQgKzQxNCwxNCBAQAogCiAJCWlmIChpY3NyMCAmIElDU1IwX0ZSRSkgewogCQkJcHJpbnRrKEtFUk5fRVJSICJweGFfaXI6IGRyb3BwaW5nIGVycm9uZW91cyBmcmFtZVxuIik7Ci0JCQlzaS0+c3RhdHMucnhfZHJvcHBlZCsrOworCQkJZGV2LT5zdGF0cy5yeF9kcm9wcGVkKys7CiAJCQlyZXR1cm47CiAJCX0KIAogCQlza2IgPSBhbGxvY19za2IobGVuKzEsR0ZQX0FUT01JQyk7CiAJCWlmICghc2tiKSAgewogCQkJcHJpbnRrKEtFUk5fRVJSICJweGFfaXI6IGZpciBvdXQgb2YgbWVtb3J5IGZvciByZWNlaXZlIHNrYlxuIik7Ci0JCQlzaS0+c3RhdHMucnhfZHJvcHBlZCsrOworCQkJZGV2LT5zdGF0cy5yeF9kcm9wcGVkKys7CiAJCQlyZXR1cm47CiAJCX0KIApAQCAtNDM3LDggKzQzNiw4IEBACiAJCXNrYi0+cHJvdG9jb2wgPSBodG9ucyhFVEhfUF9JUkRBKTsKIAkJbmV0aWZfcngoc2tiKTsKIAotCQlzaS0+c3RhdHMucnhfcGFja2V0cysrOwotCQlzaS0+c3RhdHMucnhfYnl0ZXMgKz0gbGVuOworCQlkZXYtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKwkJZGV2LT5zdGF0cy5yeF9ieXRlcyArPSBsZW47CiAJfQogfQogCkBAIC00NTcsMTAgKzQ1NiwxMCBAQAogCWlmIChpY3NyMCAmIChJQ1NSMF9GUkUgfCBJQ1NSMF9SQUIpKSB7CiAJCWlmIChpY3NyMCAmIElDU1IwX0ZSRSkgewogCQkgICAgICAgIHByaW50ayhLRVJOX0RFQlVHICJweGFfaXI6IGZpciByZWNlaXZlIGZyYW1lIGVycm9yXG4iKTsKLQkJCXNpLT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMrKzsKKwkJCWRldi0+c3RhdHMucnhfZnJhbWVfZXJyb3JzKys7CiAJCX0gZWxzZSB7CiAJCQlwcmludGsoS0VSTl9ERUJVRyAicHhhX2lyOiBmaXIgcmVjZWl2ZSBhYm9ydFxuIik7Ci0JCQlzaS0+c3RhdHMucnhfZXJyb3JzKys7CisJCQlkZXYtPnN0YXRzLnJ4X2Vycm9ycysrOwogCQl9CiAJCUlDU1IwID0gaWNzcjAgJiAoSUNTUjBfRlJFIHwgSUNTUjBfUkFCKTsKIAl9CkBAIC01ODksMTIgKzU4OCw2IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpweGFfaXJkYV9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQotewotCXN0cnVjdCBweGFfaXJkYSAqc2kgPSBuZXRkZXZfcHJpdihkZXYpOwotCXJldHVybiAmc2ktPnN0YXRzOwotfQotCiBzdGF0aWMgdm9pZCBweGFfaXJkYV9zdGFydHVwKHN0cnVjdCBweGFfaXJkYSAqc2kpCiB7CiAJLyogRGlzYWJsZSBTVFVBUlQgaW50ZXJydXB0cyAqLwpAQCAtODU3LDcgKzg1MCw2IEBACiAJZGV2LT5vcGVuCQk9IHB4YV9pcmRhX3N0YXJ0OwogCWRldi0+c3RvcAkJPSBweGFfaXJkYV9zdG9wOwogCWRldi0+ZG9faW9jdGwJCT0gcHhhX2lyZGFfaW9jdGw7Ci0JZGV2LT5nZXRfc3RhdHMJCT0gcHhhX2lyZGFfc3RhdHM7CiAKIAlpcmRhX2luaXRfbWF4X3Fvc19jYXBhYmlsaWVzKCZzaS0+cW9zKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXJkYS9zYTExMDBfaXIuYyBiL2RyaXZlcnMvbmV0L2lyZGEvc2ExMTAwX2lyLmMKaW5kZXggZDMwMmJjZi4uN2EyYjAwMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaXJkYS9zYTExMDBfaXIuYworKysgYi9kcml2ZXJzL25ldC9pcmRhL3NhMTEwMF9pci5jCkBAIC02MCw3ICs2MCw2IEBACiAJZG1hX3JlZ3NfdAkJKnR4ZG1hOwogCWRtYV9yZWdzX3QJCSpyeGRtYTsKIAotCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzCXN0YXRzOwogCXN0cnVjdCBkZXZpY2UJCSpkZXY7CiAJc3RydWN0IGlyZGFfcGxhdGZvcm1fZGF0YSAqcGRhdGE7CiAJc3RydWN0IGlybGFwX2NiCQkqaXJsYXA7CkBAIC0zNzUsMTMgKzM3NCwxMyBAQAogCQlkYXRhID0gU2VyMlVURFI7CiAKIAkJaWYgKHN0YXQgJiAoVVRTUjFfRlJFIHwgVVRTUjFfUk9SKSkgewotCQkJc2ktPnN0YXRzLnJ4X2Vycm9ycysrOworCQkJZGV2LT5zdGF0cy5yeF9lcnJvcnMrKzsKIAkJCWlmIChzdGF0ICYgVVRTUjFfRlJFKQotCQkJCXNpLT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMrKzsKKwkJCQlkZXYtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycysrOwogCQkJaWYgKHN0YXQgJiBVVFNSMV9ST1IpCi0JCQkJc2ktPnN0YXRzLnJ4X2ZpZm9fZXJyb3JzKys7CisJCQkJZGV2LT5zdGF0cy5yeF9maWZvX2Vycm9ycysrOwogCQl9IGVsc2UKLQkJCWFzeW5jX3Vud3JhcF9jaGFyKGRldiwgJnNpLT5zdGF0cywgJnNpLT5yeF9idWZmLCBkYXRhKTsKKwkJCWFzeW5jX3Vud3JhcF9jaGFyKGRldiwgJmRldi0+c3RhdHMsICZzaS0+cnhfYnVmZiwgZGF0YSk7CiAKIAkJc3RhdHVzID0gU2VyMlVUU1IwOwogCX0KQEAgLTM5Niw5ICszOTUsOSBAQAogCQkgKiBUaGVyZSBhcmUgYXQgbGVhc3QgNCBieXRlcyBpbiB0aGUgRklGTy4gIFJlYWQgMyBieXRlcwogCQkgKiBhbmQgbGVhdmUgdGhlIHJlc3QgdG8gdGhlIGJsb2NrIGJlbG93LgogCQkgKi8KLQkJYXN5bmNfdW53cmFwX2NoYXIoZGV2LCAmc2ktPnN0YXRzLCAmc2ktPnJ4X2J1ZmYsIFNlcjJVVERSKTsKLQkJYXN5bmNfdW53cmFwX2NoYXIoZGV2LCAmc2ktPnN0YXRzLCAmc2ktPnJ4X2J1ZmYsIFNlcjJVVERSKTsKLQkJYXN5bmNfdW53cmFwX2NoYXIoZGV2LCAmc2ktPnN0YXRzLCAmc2ktPnJ4X2J1ZmYsIFNlcjJVVERSKTsKKwkJYXN5bmNfdW53cmFwX2NoYXIoZGV2LCAmZGV2LT5zdGF0cywgJnNpLT5yeF9idWZmLCBTZXIyVVREUik7CisJCWFzeW5jX3Vud3JhcF9jaGFyKGRldiwgJmRldi0+c3RhdHMsICZzaS0+cnhfYnVmZiwgU2VyMlVURFIpOworCQlhc3luY191bndyYXBfY2hhcihkZXYsICZkZXYtPnN0YXRzLCAmc2ktPnJ4X2J1ZmYsIFNlcjJVVERSKTsKIAl9CiAKIAlpZiAoc3RhdHVzICYgKFVUU1IwX1JGUyB8IFVUU1IwX1JJRCkpIHsKQEAgLTQwNiw3ICs0MDUsNyBAQAogCQkgKiBGaWZvIGNvbnRhaW5zIG1vcmUgdGhhbiAxIGNoYXJhY3Rlci4KIAkJICovCiAJCWRvIHsKLQkJCWFzeW5jX3Vud3JhcF9jaGFyKGRldiwgJnNpLT5zdGF0cywgJnNpLT5yeF9idWZmLAorCQkJYXN5bmNfdW53cmFwX2NoYXIoZGV2LCAmZGV2LT5zdGF0cywgJnNpLT5yeF9idWZmLAogCQkJCQkgIFNlcjJVVERSKTsKIAkJfSB3aGlsZSAoU2VyMlVUU1IxICYgVVRTUjFfUk5FKTsKIApAQCAtNDIyLDggKzQyMSw4IEBACiAJCX0gd2hpbGUgKFNlcjJVVFNSMSAmIFVUU1IxX1RORiAmJiBzaS0+dHhfYnVmZi5sZW4pOwogCiAJCWlmIChzaS0+dHhfYnVmZi5sZW4gPT0gMCkgewotCQkJc2ktPnN0YXRzLnR4X3BhY2tldHMrKzsKLQkJCXNpLT5zdGF0cy50eF9ieXRlcyArPSBzaS0+dHhfYnVmZi5kYXRhIC0KKwkJCWRldi0+c3RhdHMudHhfcGFja2V0cysrOworCQkJZGV2LT5zdGF0cy50eF9ieXRlcyArPSBzaS0+dHhfYnVmZi5kYXRhIC0KIAkJCQkJICAgICAgc2ktPnR4X2J1ZmYuaGVhZDsKIAogCQkJLyoKQEAgLTQ4MiwxMSArNDgxLDExIEBACiAJCWRhdGEgPSBTZXIySFNEUjsKIAogCQlpZiAoc3RhdCAmIChIU1NSMV9DUkUgfCBIU1NSMV9ST1IpKSB7Ci0JCQlzaS0+c3RhdHMucnhfZXJyb3JzKys7CisJCQlkZXYtPnN0YXRzLnJ4X2Vycm9ycysrOwogCQkJaWYgKHN0YXQgJiBIU1NSMV9DUkUpCi0JCQkJc2ktPnN0YXRzLnJ4X2NyY19lcnJvcnMrKzsKKwkJCQlkZXYtPnN0YXRzLnJ4X2NyY19lcnJvcnMrKzsKIAkJCWlmIChzdGF0ICYgSFNTUjFfUk9SKQotCQkJCXNpLT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMrKzsKKwkJCQlkZXYtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycysrOwogCQl9IGVsc2UKIAkJCXNrYi0+ZGF0YVtsZW4rK10gPSBkYXRhOwogCkBAIC01MDUsOCArNTA0LDggQEAKIAkJc2tiLT5kZXYgPSBkZXY7CiAJCXNrYl9yZXNldF9tYWNfaGVhZGVyKHNrYik7CiAJCXNrYi0+cHJvdG9jb2wgPSBodG9ucyhFVEhfUF9JUkRBKTsKLQkJc2ktPnN0YXRzLnJ4X3BhY2tldHMrKzsKLQkJc2ktPnN0YXRzLnJ4X2J5dGVzICs9IGxlbjsKKwkJZGV2LT5zdGF0cy5yeF9wYWNrZXRzKys7CisJCWRldi0+c3RhdHMucnhfYnl0ZXMgKz0gbGVuOwogCiAJCS8qCiAJCSAqIEJlZm9yZSB3ZSBwYXNzIHRoZSBidWZmZXIgdXAsIGFsbG9jYXRlIGEgbmV3IG9uZS4KQEAgLTU0NSwxMCArNTQ0LDEwIEBACiAJICogZnJvbSB0aGUgZmlmby4KIAkgKi8KIAlpZiAoU2VyMkhTU1IwICYgKEhTU1IwX0ZSRSB8IEhTU1IwX1JBQikpIHsKLQkJc2ktPnN0YXRzLnJ4X2Vycm9ycysrOworCQlkZXYtPnN0YXRzLnJ4X2Vycm9ycysrOwogCiAJCWlmIChTZXIySFNTUjAgJiBIU1NSMF9GUkUpCi0JCQlzaS0+c3RhdHMucnhfZnJhbWVfZXJyb3JzKys7CisJCQlkZXYtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycysrOwogCiAJCS8qCiAJCSAqIENsZWFyIG91dCB0aGUgRE1BLi4uCkBAIC02MzMsOCArNjMyLDggQEAKIAkgKi8KIAlpZiAoc2tiKSB7CiAJCWRtYV91bm1hcF9zaW5nbGUoc2ktPmRldiwgc2ktPnR4YnVmX2RtYSwgc2tiLT5sZW4sIERNQV9UT19ERVZJQ0UpOwotCQlzaS0+c3RhdHMudHhfcGFja2V0cyArKzsKLQkJc2ktPnN0YXRzLnR4X2J5dGVzICs9IHNrYi0+bGVuOworCQlkZXYtPnN0YXRzLnR4X3BhY2tldHMgKys7CisJCWRldi0+c3RhdHMudHhfYnl0ZXMgKz0gc2tiLT5sZW47CiAJCWRldl9rZnJlZV9za2JfaXJxKHNrYik7CiAJfQogCkBAIC03NjIsMTIgKzc2MSw2IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzYTExMDBfaXJkYV9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQotewotCXN0cnVjdCBzYTExMDBfaXJkYSAqc2kgPSBuZXRkZXZfcHJpdihkZXYpOwotCXJldHVybiAmc2ktPnN0YXRzOwotfQotCiBzdGF0aWMgaW50IHNhMTEwMF9pcmRhX3N0YXJ0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IHNhMTEwMF9pcmRhICpzaSA9IG5ldGRldl9wcml2KGRldik7CkBAIC05MjQsNyArOTE3LDYgQEAKIAlkZXYtPm9wZW4JCT0gc2ExMTAwX2lyZGFfc3RhcnQ7CiAJZGV2LT5zdG9wCQk9IHNhMTEwMF9pcmRhX3N0b3A7CiAJZGV2LT5kb19pb2N0bAkJPSBzYTExMDBfaXJkYV9pb2N0bDsKLQlkZXYtPmdldF9zdGF0cwkJPSBzYTExMDBfaXJkYV9zdGF0czsKIAlkZXYtPmlycQkJPSBJUlFfU2VyMklDUDsKIAogCWlyZGFfaW5pdF9tYXhfcW9zX2NhcGFiaWxpZXMoJnNpLT5xb3MpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXJkYS9zaXItZGV2LmggYi9kcml2ZXJzL25ldC9pcmRhL3Npci1kZXYuaAppbmRleCAyYTU3YmM2Li42ZDViMWUyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9pcmRhL3Npci1kZXYuaAorKysgYi9kcml2ZXJzL25ldC9pcmRhL3Npci1kZXYuaApAQCAtMTYwLDcgKzE2MCw2IEBACiAKIHN0cnVjdCBzaXJfZGV2IHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2OwotCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOwogCiAJc3RydWN0IGlybGFwX2NiICAgICppcmxhcDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXJkYS9zaXJfZGV2LmMgYi9kcml2ZXJzL25ldC9pcmRhL3Npcl9kZXYuYwppbmRleCBjZWVmMDQwLi41YjU4NjI0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9pcmRhL3Npcl9kZXYuYworKysgYi9kcml2ZXJzL25ldC9pcmRhL3Npcl9kZXYuYwpAQCAtNDU1LDggKzQ1NSw4IEBACiAJCQlpZiAoKHNrYj1kZXYtPnR4X3NrYikgIT0gTlVMTCkgewogCQkJCWRldi0+dHhfc2tiID0gTlVMTDsKIAkJCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOwotCQkJCWRldi0+c3RhdHMudHhfZXJyb3JzKys7CQkgICAgICAKLQkJCQlkZXYtPnN0YXRzLnR4X2Ryb3BwZWQrKzsJCSAgICAgIAorCQkJCWRldi0+bmV0ZGV2LT5zdGF0cy50eF9lcnJvcnMrKzsKKwkJCQlkZXYtPm5ldGRldi0+c3RhdHMudHhfZHJvcHBlZCsrOwogCQkJfQogCQkJZGV2LT50eF9idWZmLmxlbiA9IDA7CiAJCX0KQEAgLTQ5Myw4ICs0OTMsOCBAQAogCQkKIAlpZiAoKHNrYj1kZXYtPnR4X3NrYikgIT0gTlVMTCkgewogCQlkZXYtPnR4X3NrYiA9IE5VTEw7Ci0JCWRldi0+c3RhdHMudHhfcGFja2V0cysrOwkJICAgICAgCi0JCWRldi0+c3RhdHMudHhfYnl0ZXMgKz0gc2tiLT5sZW47CisJCWRldi0+bmV0ZGV2LT5zdGF0cy50eF9wYWNrZXRzKys7CisJCWRldi0+bmV0ZGV2LT5zdGF0cy50eF9ieXRlcyArPSBza2ItPmxlbjsKIAkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKIAl9CiAKQEAgLTU0OCw3ICs1NDgsNyBAQAogCQkgKiBqdXN0IHVwZGF0ZSBzdGF0cyBhbmQgc2V0IG1lZGlhIGJ1c3kKIAkJICovCiAJCWlyZGFfZGV2aWNlX3NldF9tZWRpYV9idXN5KGRldi0+bmV0ZGV2LCBUUlVFKTsKLQkJZGV2LT5zdGF0cy5yeF9kcm9wcGVkKys7CisJCWRldi0+bmV0ZGV2LT5zdGF0cy5yeF9kcm9wcGVkKys7CiAJCUlSREFfREVCVUcoMCwgIiVzOyByeC1kcm9wOiAlemRcbiIsIF9fZnVuY19fLCBjb3VudCk7CiAJCXJldHVybiAwOwogCX0KQEAgLTU1Nyw3ICs1NTcsNyBAQAogCWlmIChsaWtlbHkoYXRvbWljX3JlYWQoJmRldi0+ZW5hYmxlX3J4KSkpIHsKIAkJd2hpbGUgKGNvdW50LS0pCiAJCQkvKiBVbndyYXAgYW5kIGRlc3R1ZmYgb25lIGJ5dGUgKi8KLQkJCWFzeW5jX3Vud3JhcF9jaGFyKGRldi0+bmV0ZGV2LCAmZGV2LT5zdGF0cywgCisJCQlhc3luY191bndyYXBfY2hhcihkZXYtPm5ldGRldiwgJmRldi0+bmV0ZGV2LT5zdGF0cywKIAkJCQkJICAmZGV2LT5yeF9idWZmLCAqY3ArKyk7CiAJfSBlbHNlIHsKIAkJd2hpbGUgKGNvdW50LS0pIHsKQEAgLTU4MiwxMyArNTgyLDYgQEAKIAogLyogY2FsbGJhY2tzIGZyb20gbmV0d29yayBsYXllciAqLwogCi1zdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnNpcmRldl9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYpCi17Ci0Jc3RydWN0IHNpcl9kZXYgKmRldiA9IG5ldGRldl9wcml2KG5kZXYpOwotCi0JcmV0dXJuIChkZXYpID8gJmRldi0+c3RhdHMgOiBOVUxMOwotfQotCiBzdGF0aWMgaW50IHNpcmRldl9oYXJkX3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYpCiB7CiAJc3RydWN0IHNpcl9kZXYgKmRldiA9IG5ldGRldl9wcml2KG5kZXYpOwpAQCAtNjU0LDcgKzY0Nyw3IEBACiAJICovCiAJYXRvbWljX3NldCgmZGV2LT5lbmFibGVfcngsIDApOwogCWlmICh1bmxpa2VseShzaXJkZXZfaXNfcmVjZWl2aW5nKGRldikpKQotCQlkZXYtPnN0YXRzLmNvbGxpc2lvbnMrKzsKKwkJZGV2LT5uZXRkZXYtPnN0YXRzLmNvbGxpc2lvbnMrKzsKIAogCWFjdHVhbCA9IGRldi0+ZHJ2LT5kb193cml0ZShkZXYsIGRldi0+dHhfYnVmZi5kYXRhLCBkZXYtPnR4X2J1ZmYubGVuKTsKIApAQCAtNjY5LDggKzY2Miw4IEBACiAJCUlSREFfRVJST1IoIiVzOiBkcnYtPmRvX3dyaXRlIGZhaWxlZCAoJWQpXG4iLAogCQkJICAgX19mdW5jX18sIGFjdHVhbCk7CiAJCWRldl9rZnJlZV9za2JfYW55KHNrYik7Ci0JCWRldi0+c3RhdHMudHhfZXJyb3JzKys7CQkgICAgICAKLQkJZGV2LT5zdGF0cy50eF9kcm9wcGVkKys7CQkgICAgICAKKwkJZGV2LT5uZXRkZXYtPnN0YXRzLnR4X2Vycm9ycysrOworCQlkZXYtPm5ldGRldi0+c3RhdHMudHhfZHJvcHBlZCsrOwogCQluZXRpZl93YWtlX3F1ZXVlKG5kZXYpOwogCX0KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPnR4X2xvY2ssIGZsYWdzKTsKQEAgLTkxOCw3ICs5MTEsNiBAQAogCW5kZXYtPmhhcmRfc3RhcnRfeG1pdCA9IHNpcmRldl9oYXJkX3htaXQ7CiAJbmRldi0+b3BlbiA9IHNpcmRldl9vcGVuOwogCW5kZXYtPnN0b3AgPSBzaXJkZXZfY2xvc2U7Ci0JbmRldi0+Z2V0X3N0YXRzID0gc2lyZGV2X2dldF9zdGF0czsKIAluZGV2LT5kb19pb2N0bCA9IHNpcmRldl9pb2N0bDsKIAogCWlmIChyZWdpc3Rlcl9uZXRkZXYobmRldikpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2lyZGEvc21zYy1pcmNjMi5jIGIvZHJpdmVycy9uZXQvaXJkYS9zbXNjLWlyY2MyLmMKaW5kZXggNWQwOWUxNS4uZGQ3M2NjZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaXJkYS9zbXNjLWlyY2MyLmMKKysrIGIvZHJpdmVycy9uZXQvaXJkYS9zbXNjLWlyY2MyLmMKQEAgLTE1MCw3ICsxNTAsNiBAQAogLyogUHJpdmF0ZSBkYXRhIGZvciBlYWNoIGluc3RhbmNlICovCiBzdHJ1Y3Qgc21zY19pcmNjX2NiIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2OyAgICAgLyogWWVzISB3ZSBhcmUgc29tZSBraW5kIG9mIG5ldGRldmljZSAqLwotCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOwogCXN0cnVjdCBpcmxhcF9jYiAgICAqaXJsYXA7IC8qIFRoZSBsaW5rIGxheWVyIHdlIGFyZSBiaW5kZWQgdG8gKi8KIAogCWNoaXBpb190IGlvOyAgICAgICAgICAgICAgIC8qIElyREEgY29udHJvbGxlciBpbmZvcm1hdGlvbiAqLwpAQCAtMjE1LDcgKzIxNCw2IEBACiAjaWYgU01TQ19JUkNDMl9DX05FVF9USU1FT1VUCiBzdGF0aWMgdm9pZCBzbXNjX2lyY2NfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKICNlbmRpZgotc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzbXNjX2lyY2NfbmV0X2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIHN0YXRpYyBpbnQgc21zY19pcmNjX2lzX3JlY2VpdmluZyhzdHJ1Y3Qgc21zY19pcmNjX2NiICpzZWxmKTsKIHN0YXRpYyB2b2lkIHNtc2NfaXJjY19wcm9iZV90cmFuc2NlaXZlcihzdHJ1Y3Qgc21zY19pcmNjX2NiICpzZWxmKTsKIHN0YXRpYyB2b2lkIHNtc2NfaXJjY19zZXRfdHJhbnNjZWl2ZXJfZm9yX3NwZWVkKHN0cnVjdCBzbXNjX2lyY2NfY2IgKnNlbGYsIHUzMiBzcGVlZCk7CkBAIC01MjksNyArNTI3LDYgQEAKIAlkZXYtPm9wZW4gICAgICAgICAgICA9IHNtc2NfaXJjY19uZXRfb3BlbjsKIAlkZXYtPnN0b3AgICAgICAgICAgICA9IHNtc2NfaXJjY19uZXRfY2xvc2U7CiAJZGV2LT5kb19pb2N0bCAgICAgICAgPSBzbXNjX2lyY2NfbmV0X2lvY3RsOwotCWRldi0+Z2V0X3N0YXRzCSAgICAgPSBzbXNjX2lyY2NfbmV0X2dldF9zdGF0czsKIAogCXNlbGYgPSBuZXRkZXZfcHJpdihkZXYpOwogCXNlbGYtPm5ldGRldiA9IGRldjsKQEAgLTgzNCwxMyArODMxLDYgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnNtc2NfaXJjY19uZXRfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IHNtc2NfaXJjY19jYiAqc2VsZiA9IG5ldGRldl9wcml2KGRldik7Ci0KLQlyZXR1cm4gJnNlbGYtPnN0YXRzOwotfQotCiAjaWYgU01TQ19JUkNDMl9DX05FVF9USU1FT1VUCiAvKgogICogRnVuY3Rpb24gc21zY19pcmNjX3RpbWVvdXQgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCkBAIC05MjAsNyArOTEwLDcgQEAKIAlzZWxmLT50eF9idWZmLmxlbiA9IGFzeW5jX3dyYXBfc2tiKHNrYiwgc2VsZi0+dHhfYnVmZi5kYXRhLAogCQkJCQkgICBzZWxmLT50eF9idWZmLnRydWVzaXplKTsKIAotCXNlbGYtPnN0YXRzLnR4X2J5dGVzICs9IHNlbGYtPnR4X2J1ZmYubGVuOworCWRldi0+c3RhdHMudHhfYnl0ZXMgKz0gc2VsZi0+dHhfYnVmZi5sZW47CiAKIAkvKiBUdXJuIG9uIHRyYW5zbWl0IGZpbmlzaGVkIGludGVycnVwdC4gV2lsbCBmaXJlIGltbWVkaWF0ZWx5ISAgKi8KIAlvdXRiKFVBUlRfSUVSX1RIUkksIHNlbGYtPmlvLnNpcl9iYXNlICsgVUFSVF9JRVIpOwpAQCAtMTMyMCwxNiArMTMxMCwxNiBAQAogCS8qIENoZWNrIGZvciB1bmRlcnJ1biEgKi8KIAlyZWdpc3Rlcl9iYW5rKGlvYmFzZSwgMCk7CiAJaWYgKGluYihpb2Jhc2UgKyBJUkNDX0xTUikgJiBJUkNDX0xTUl9VTkRFUlJVTikgewotCQlzZWxmLT5zdGF0cy50eF9lcnJvcnMrKzsKLQkJc2VsZi0+c3RhdHMudHhfZmlmb19lcnJvcnMrKzsKKwkJc2VsZi0+bmV0ZGV2LT5zdGF0cy50eF9lcnJvcnMrKzsKKwkJc2VsZi0+bmV0ZGV2LT5zdGF0cy50eF9maWZvX2Vycm9ycysrOwogCiAJCS8qIFJlc2V0IGVycm9yIGNvbmRpdGlvbiAqLwogCQlyZWdpc3Rlcl9iYW5rKGlvYmFzZSwgMCk7CiAJCW91dGIoSVJDQ19NQVNURVJfRVJST1JfUkVTRVQsIGlvYmFzZSArIElSQ0NfTUFTVEVSKTsKIAkJb3V0YigweDAwLCBpb2Jhc2UgKyBJUkNDX01BU1RFUik7CiAJfSBlbHNlIHsKLQkJc2VsZi0+c3RhdHMudHhfcGFja2V0cysrOwotCQlzZWxmLT5zdGF0cy50eF9ieXRlcyArPSBzZWxmLT50eF9idWZmLmxlbjsKKwkJc2VsZi0+bmV0ZGV2LT5zdGF0cy50eF9wYWNrZXRzKys7CisJCXNlbGYtPm5ldGRldi0+c3RhdHMudHhfYnl0ZXMgKz0gc2VsZi0+dHhfYnVmZi5sZW47CiAJfQogCiAJLyogQ2hlY2sgaWYgaXQncyB0aW1lIHRvIGNoYW5nZSB0aGUgc3BlZWQgKi8KQEAgLTE0MjksMTUgKzE0MTksMTUgQEAKIAogCS8qIExvb2sgZm9yIGVycm9ycyAqLwogCWlmIChsc3IgJiAoSVJDQ19MU1JfRlJBTUVfRVJST1IgfCBJUkNDX0xTUl9DUkNfRVJST1IgfCBJUkNDX0xTUl9TSVpFX0VSUk9SKSkgewotCQlzZWxmLT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkJc2VsZi0+bmV0ZGV2LT5zdGF0cy5yeF9lcnJvcnMrKzsKIAkJaWYgKGxzciAmIElSQ0NfTFNSX0ZSQU1FX0VSUk9SKQotCQkJc2VsZi0+c3RhdHMucnhfZnJhbWVfZXJyb3JzKys7CisJCQlzZWxmLT5uZXRkZXYtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycysrOwogCQlpZiAobHNyICYgSVJDQ19MU1JfQ1JDX0VSUk9SKQotCQkJc2VsZi0+c3RhdHMucnhfY3JjX2Vycm9ycysrOworCQkJc2VsZi0+bmV0ZGV2LT5zdGF0cy5yeF9jcmNfZXJyb3JzKys7CiAJCWlmIChsc3IgJiBJUkNDX0xTUl9TSVpFX0VSUk9SKQotCQkJc2VsZi0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOworCQkJc2VsZi0+bmV0ZGV2LT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzKys7CiAJCWlmIChsc3IgJiAoSVJDQ19MU1JfVU5ERVJSVU4gfCBJUkNDX0xTUl9PVkVSUlVOKSkKLQkJCXNlbGYtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMrKzsKKwkJCXNlbGYtPm5ldGRldi0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOwogCQlyZXR1cm47CiAJfQogCkBAIC0xNDYwLDggKzE0NTAsOCBAQAogCXNrYl9yZXNlcnZlKHNrYiwgMSk7CiAKIAltZW1jcHkoc2tiX3B1dChza2IsIGxlbiksIHNlbGYtPnJ4X2J1ZmYuZGF0YSwgbGVuKTsKLQlzZWxmLT5zdGF0cy5yeF9wYWNrZXRzKys7Ci0Jc2VsZi0+c3RhdHMucnhfYnl0ZXMgKz0gbGVuOworCXNlbGYtPm5ldGRldi0+c3RhdHMucnhfcGFja2V0cysrOworCXNlbGYtPm5ldGRldi0+c3RhdHMucnhfYnl0ZXMgKz0gbGVuOwogCiAJc2tiLT5kZXYgPSBzZWxmLT5uZXRkZXY7CiAJc2tiX3Jlc2V0X21hY19oZWFkZXIoc2tiKTsKQEAgLTE0ODksNyArMTQ3OSw3IEBACiAgICAgICAgICAqIGFzeW5jX3Vud3JhcF9jaGFyIHdpbGwgZGVsaXZlciBhbGwgZm91bmQgZnJhbWVzCiAJICovCiAJZG8gewotCQlhc3luY191bndyYXBfY2hhcihzZWxmLT5uZXRkZXYsICZzZWxmLT5zdGF0cywgJnNlbGYtPnJ4X2J1ZmYsCisJCWFzeW5jX3Vud3JhcF9jaGFyKHNlbGYtPm5ldGRldiwgJnNlbGYtPm5ldGRldi0+c3RhdHMsICZzZWxmLT5yeF9idWZmLAogCQkJCSAgaW5iKGlvYmFzZSArIFVBUlRfUlgpKTsKIAogCQkvKiBNYWtlIHN1cmUgd2UgZG9uJ3Qgc3RheSBoZXJlIHRvIGxvbmcgKi8KQEAgLTE5OTIsNyArMTk4Miw3IEBACiAJCQkvKiBUZWxsIG5ldHdvcmsgbGF5ZXIgdGhhdCB3ZSB3YW50IG1vcmUgZnJhbWVzICovCiAJCQluZXRpZl93YWtlX3F1ZXVlKHNlbGYtPm5ldGRldik7CiAJCX0KLQkJc2VsZi0+c3RhdHMudHhfcGFja2V0cysrOworCQlzZWxmLT5uZXRkZXYtPnN0YXRzLnR4X3BhY2tldHMrKzsKIAogCQlpZiAoc2VsZi0+aW8uc3BlZWQgPD0gMTE1MjAwKSB7CiAJCQkvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXJkYS9zdGlyNDIwMC5jIGIvZHJpdmVycy9uZXQvaXJkYS9zdGlyNDIwMC5jCmluZGV4IGNhNGNkOTIuLjhiMTY1OGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2lyZGEvc3RpcjQyMDAuYworKysgYi9kcml2ZXJzL25ldC9pcmRhL3N0aXI0MjAwLmMKQEAgLTE2NCw3ICsxNjQsNyBAQAogICAgICAgICBzdHJ1Y3QgdXNiX2RldmljZSAqdXNiZGV2OyAgICAgIC8qIGluaXQ6IHByb2JlX2lyZGEgKi8KICAgICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsgICAgICAvKiBuZXR3b3JrIGxheWVyICovCiAgICAgICAgIHN0cnVjdCBpcmxhcF9jYiAgICppcmxhcDsgICAgICAgLyogVGhlIGxpbmsgbGF5ZXIgd2UgYXJlIGJpbmRlZCB0byAqLwotICAgICAgICBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsJLyogbmV0d29yayBzdGF0aXN0aWNzICovCisKICAgICAgICAgc3RydWN0IHFvc19pbmZvICAgcW9zOwogCXVuc2lnbmVkIAkgIHNwZWVkOwkvKiBDdXJyZW50IHNwZWVkICovCiAKQEAgLTMyMywxNiArMzIzLDE2IEBACiAJCXByX2RlYnVnKCIlczogc2hvcnQgZnJhbWUgbGVuICVkXG4iLAogCQkJIHN0aXItPm5ldGRldi0+bmFtZSwgbGVuKTsKIAotCQkrK3N0aXItPnN0YXRzLnJ4X2Vycm9yczsKLQkJKytzdGlyLT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzOworCQkrK3N0aXItPm5ldGRldi0+c3RhdHMucnhfZXJyb3JzOworCQkrK3N0aXItPm5ldGRldi0+c3RhdHMucnhfbGVuZ3RoX2Vycm9yczsKIAkJcmV0dXJuOwogCX0KIAogCWZjcyA9IH4oY3JjMzJfbGUofjAsIHJ4X2J1ZmYtPmRhdGEsIGxlbikpOwogCWlmIChmY3MgIT0gZ2V0X3VuYWxpZ25lZF9sZTMyKHJ4X2J1ZmYtPmRhdGEgKyBsZW4pKSB7CiAJCXByX2RlYnVnKCJjcmMgZXJyb3IgY2FsYyAweCV4IGxlbiAlZFxuIiwgZmNzLCBsZW4pOwotCQlzdGlyLT5zdGF0cy5yeF9lcnJvcnMrKzsKLQkJc3Rpci0+c3RhdHMucnhfY3JjX2Vycm9ycysrOworCQlzdGlyLT5uZXRkZXYtPnN0YXRzLnJ4X2Vycm9ycysrOworCQlzdGlyLT5uZXRkZXYtPnN0YXRzLnJ4X2NyY19lcnJvcnMrKzsKIAkJcmV0dXJuOwogCX0KIApAQCAtMzQwLDcgKzM0MCw3IEBACiAJaWYgKGxlbiA8IElSREFfUlhfQ09QWV9USFJFU0hPTEQpIHsKIAkJbnNrYiA9IGRldl9hbGxvY19za2IobGVuICsgMSk7CiAJCWlmICh1bmxpa2VseSghbnNrYikpIHsKLQkJCSsrc3Rpci0+c3RhdHMucnhfZHJvcHBlZDsKKwkJCSsrc3Rpci0+bmV0ZGV2LT5zdGF0cy5yeF9kcm9wcGVkOwogCQkJcmV0dXJuOwogCQl9CiAJCXNrYl9yZXNlcnZlKG5za2IsIDEpOwpAQCAtMzQ5LDcgKzM0OSw3IEBACiAJfSBlbHNlIHsKIAkJbnNrYiA9IGRldl9hbGxvY19za2IocnhfYnVmZi0+dHJ1ZXNpemUpOwogCQlpZiAodW5saWtlbHkoIW5za2IpKSB7Ci0JCQkrK3N0aXItPnN0YXRzLnJ4X2Ryb3BwZWQ7CisJCQkrK3N0aXItPm5ldGRldi0+c3RhdHMucnhfZHJvcHBlZDsKIAkJCXJldHVybjsKIAkJfQogCQlza2JfcmVzZXJ2ZShuc2tiLCAxKTsKQEAgLTM2Niw4ICszNjYsOCBAQAogCiAJbmV0aWZfcngoc2tiKTsKIAotCXN0aXItPnN0YXRzLnJ4X3BhY2tldHMrKzsKLQlzdGlyLT5zdGF0cy5yeF9ieXRlcyArPSBsZW47CisJc3Rpci0+bmV0ZGV2LT5zdGF0cy5yeF9wYWNrZXRzKys7CisJc3Rpci0+bmV0ZGV2LT5zdGF0cy5yeF9ieXRlcyArPSBsZW47CiAKIAlyeF9idWZmLT5kYXRhID0gcnhfYnVmZi0+aGVhZDsKIAlyeF9idWZmLT5sZW4gPSAwOwpAQCAtNDM3LDcgKzQzNyw3IEBACiAJCWlmICh1bmxpa2VseShyeF9idWZmLT5sZW4gPj0gcnhfYnVmZi0+dHJ1ZXNpemUpKSB7CiAJCQlwcl9kZWJ1ZygiJXM6IGZpciBmcmFtZSBleGNlZWRzICVkXG4iLAogCQkJCSBzdGlyLT5uZXRkZXYtPm5hbWUsIHJ4X2J1ZmYtPnRydWVzaXplKTsKLQkJCSsrc3Rpci0+c3RhdHMucnhfb3Zlcl9lcnJvcnM7CisJCQkrK3N0aXItPm5ldGRldi0+c3RhdHMucnhfb3Zlcl9lcnJvcnM7CiAJCQlnb3RvIGVycm9yX3JlY292ZXJ5OwogCQl9CiAKQEAgLTQ0NSwxMCArNDQ1LDEwIEBACiAJCWNvbnRpbnVlOwogCiAJZnJhbWVfZXJyb3I6Ci0JCSsrc3Rpci0+c3RhdHMucnhfZnJhbWVfZXJyb3JzOworCQkrK3N0aXItPm5ldGRldi0+c3RhdHMucnhfZnJhbWVfZXJyb3JzOwogCiAJZXJyb3JfcmVjb3Zlcnk6Ci0JCSsrc3Rpci0+c3RhdHMucnhfZXJyb3JzOworCQkrK3N0aXItPm5ldGRldi0+c3RhdHMucnhfZXJyb3JzOwogCQlyeF9idWZmLT5zdGF0ZSA9IE9VVFNJREVfRlJBTUU7CiAJCXJ4X2J1ZmYtPmluX2ZyYW1lID0gRkFMU0U7CiAJfQpAQCAtNDYxLDcgKzQ2MSw3IEBACiAJaW50IGk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCi0JCWFzeW5jX3Vud3JhcF9jaGFyKHN0aXItPm5ldGRldiwgJnN0aXItPnN0YXRzLAorCQlhc3luY191bndyYXBfY2hhcihzdGlyLT5uZXRkZXYsICZzdGlyLT5uZXRkZXYtPnN0YXRzLAogCQkJCSAgJnN0aXItPnJ4X2J1ZmYsIGJ5dGVzW2ldKTsKIH0KIApAQCAtNjkyLDcgKzY5Miw3IEBACiAJdXNiX2tpbGxfdXJiKHN0aXItPnJ4X3VyYik7CiAKIAlpZiAoc3Rpci0+cnhfYnVmZi5pbl9mcmFtZSkgCi0JCXN0aXItPnN0YXRzLmNvbGxpc2lvbnMrKzsKKwkJc3Rpci0+bmV0ZGV2LT5zdGF0cy5jb2xsaXNpb25zKys7CiB9CiAvKgogICogV3JhcCBkYXRhIGluIHNvY2tldCBidWZmZXIgYW5kIHNlbmQgaXQuCkBAIC03MTgsMTUgKzcxOCwxNSBAQAogCWlmICghZmlyc3RfZnJhbWUpCiAJCWZpZm9fdHh3YWl0KHN0aXIsIHdyYXBsZW4pOwogCi0Jc3Rpci0+c3RhdHMudHhfcGFja2V0cysrOwotCXN0aXItPnN0YXRzLnR4X2J5dGVzICs9IHNrYi0+bGVuOworCXN0aXItPm5ldGRldi0+c3RhdHMudHhfcGFja2V0cysrOworCXN0aXItPm5ldGRldi0+c3RhdHMudHhfYnl0ZXMgKz0gc2tiLT5sZW47CiAJc3Rpci0+bmV0ZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CiAJcHJfZGVidWcoInNlbmQgJWQgKCVkKVxuIiwgc2tiLT5sZW4sIHdyYXBsZW4pOwogCiAJaWYgKHVzYl9idWxrX21zZyhzdGlyLT51c2JkZXYsIHVzYl9zbmRidWxrcGlwZShzdGlyLT51c2JkZXYsIDEpLAogCQkJIHN0aXItPmlvX2J1Ziwgd3JhcGxlbiwKIAkJCSBOVUxMLCBUUkFOU01JVF9USU1FT1VUKSkKLQkJc3Rpci0+c3RhdHMudHhfZXJyb3JzKys7CisJCXN0aXItPm5ldGRldi0+c3RhdHMudHhfZXJyb3JzKys7CiB9CiAKIC8qCkBAIC0xMDA4LDE1ICsxMDA4LDYgQEAKIH0KIAogLyoKLSAqIEdldCBkZXZpY2Ugc3RhdHMgKGZvciAvcHJvYy9uZXQvZGV2IGFuZCBpZmNvbmZpZykKLSAqLwotc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGlyX25ldF9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKLXsKLQlzdHJ1Y3Qgc3Rpcl9jYiAqc3RpciA9IG5ldGRldl9wcml2KG5ldGRldik7Ci0JcmV0dXJuICZzdGlyLT5zdGF0czsKLX0KLQotLyoKICAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYnkgdGhlIFVTQiBzdWJzeXN0ZW0gZm9yIGVhY2ggbmV3IGRldmljZQogICogaW4gdGhlIHN5c3RlbS4gV2UgbmVlZCB0byBjaGVjayBpZiB0aGUgZGV2aWNlIGlzIG91cnMsIGFuZCBpbgogICogdGhpcyBjYXNlIHN0YXJ0IGhhbmRsaW5nIGl0LgpAQCAtMTA2Niw3ICsxMDU3LDYgQEAKIAluZXQtPmhhcmRfc3RhcnRfeG1pdCA9IHN0aXJfaGFyZF94bWl0OwogCW5ldC0+b3BlbiAgICAgICAgICAgID0gc3Rpcl9uZXRfb3BlbjsKIAluZXQtPnN0b3AgICAgICAgICAgICA9IHN0aXJfbmV0X2Nsb3NlOwotCW5ldC0+Z2V0X3N0YXRzCSAgICAgPSBzdGlyX25ldF9nZXRfc3RhdHM7CiAJbmV0LT5kb19pb2N0bCAgICAgICAgPSBzdGlyX25ldF9pb2N0bDsKIAogCXJldCA9IHJlZ2lzdGVyX25ldGRldihuZXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXJkYS92aWEtaXJjYy5jIGIvZHJpdmVycy9uZXQvaXJkYS92aWEtaXJjYy5jCmluZGV4IDc0Yzc4Y2YuLjhiM2U1NDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2lyZGEvdmlhLWlyY2MuYworKysgYi9kcml2ZXJzL25ldC9pcmRhL3ZpYS1pcmNjLmMKQEAgLTEwMSw4ICsxMDEsNiBAQAogc3RhdGljIGludCB2aWFfaXJjY19uZXRfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiBzdGF0aWMgaW50IHZpYV9pcmNjX25ldF9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKnJxLAogCQkJICAgICAgaW50IGNtZCk7Ci1zdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnZpYV9pcmNjX25ldF9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UKLQkJCQkJCSAgICAgICAqZGV2KTsKIHN0YXRpYyB2b2lkIHZpYV9pcmNjX2NoYW5nZV9kb25nbGVfc3BlZWQoaW50IGlvYmFzZSwgaW50IHNwZWVkLAogCQkJCQkgaW50IGRvbmdsZV9pZCk7CiBzdGF0aWMgaW50IFJ4VGltZXJIYW5kbGVyKHN0cnVjdCB2aWFfaXJjY19jYiAqc2VsZiwgaW50IGlvYmFzZSk7CkBAIC00MzQsNyArNDMyLDYgQEAKIAlkZXYtPm9wZW4gPSB2aWFfaXJjY19uZXRfb3BlbjsKIAlkZXYtPnN0b3AgPSB2aWFfaXJjY19uZXRfY2xvc2U7CiAJZGV2LT5kb19pb2N0bCA9IHZpYV9pcmNjX25ldF9pb2N0bDsKLQlkZXYtPmdldF9zdGF0cyA9IHZpYV9pcmNjX25ldF9nZXRfc3RhdHM7CiAKIAllcnIgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKIAlpZiAoZXJyKQpAQCAtODU1LDcgKzg1Miw3IEBACiAJICAgIGFzeW5jX3dyYXBfc2tiKHNrYiwgc2VsZi0+dHhfYnVmZi5kYXRhLAogCQkJICAgc2VsZi0+dHhfYnVmZi50cnVlc2l6ZSk7CiAKLQlzZWxmLT5zdGF0cy50eF9ieXRlcyArPSBzZWxmLT50eF9idWZmLmxlbjsKKwlkZXYtPnN0YXRzLnR4X2J5dGVzICs9IHNlbGYtPnR4X2J1ZmYubGVuOwogCS8qIFNlbmQgdGhpcyBmcmFtZSB3aXRoIG9sZCBzcGVlZCAqLwogCVNldEJhdWRSYXRlKGlvYmFzZSwgc2VsZi0+aW8uc3BlZWQpOwogCVNldFB1bHNlV2lkdGgoaW9iYXNlLCAxMik7CkBAIC05MjEsNyArOTE4LDcgQEAKIAlzZWxmLT50eF9maWZvLnF1ZXVlW3NlbGYtPnR4X2ZpZm8uZnJlZV0ubGVuID0gc2tiLT5sZW47CiAKIAlzZWxmLT50eF9maWZvLnRhaWwgKz0gc2tiLT5sZW47Ci0Jc2VsZi0+c3RhdHMudHhfYnl0ZXMgKz0gc2tiLT5sZW47CisJZGV2LT5zdGF0cy50eF9ieXRlcyArPSBza2ItPmxlbjsKIAlza2JfY29weV9mcm9tX2xpbmVhcl9kYXRhKHNrYiwKIAkJICAgICAgc2VsZi0+dHhfZmlmby5xdWV1ZVtzZWxmLT50eF9maWZvLmZyZWVdLnN0YXJ0LCBza2ItPmxlbik7CiAJc2VsZi0+dHhfZmlmby5sZW4rKzsKQEAgLTk5MCwxMiArOTg3LDEyIEBACiAJLyogQ2xlYXIgYml0LCBieSB3cml0aW5nIDEgaW50byBpdCAqLwogCVR4X3N0YXR1cyA9IEdldFRYU3RhdHVzKGlvYmFzZSk7CiAJaWYgKFR4X3N0YXR1cyAmIDB4MDgpIHsKLQkJc2VsZi0+c3RhdHMudHhfZXJyb3JzKys7Ci0JCXNlbGYtPnN0YXRzLnR4X2ZpZm9fZXJyb3JzKys7CisJCXNlbGYtPm5ldGRldi0+c3RhdHMudHhfZXJyb3JzKys7CisJCXNlbGYtPm5ldGRldi0+c3RhdHMudHhfZmlmb19lcnJvcnMrKzsKIAkJaHdyZXNldChzZWxmKTsKIC8vIGhvdyB0byBjbGVhciB1bmRlcnJydW4gPwogCX0gZWxzZSB7Ci0JCXNlbGYtPnN0YXRzLnR4X3BhY2tldHMrKzsKKwkJc2VsZi0+bmV0ZGV2LT5zdGF0cy50eF9wYWNrZXRzKys7CiAJCVJlc2V0Q2hpcChpb2Jhc2UsIDMpOwogCQlSZXNldENoaXAoaW9iYXNlLCA0KTsKIAl9CkBAIC0xMTE5LDggKzExMTYsOCBAQAogCQl9CiAJCS8vIE1vdmUgdG8gbmV4dCBmcmFtZSAKIAkJc2VsZi0+cnhfYnVmZi5kYXRhICs9IGxlbjsKLQkJc2VsZi0+c3RhdHMucnhfYnl0ZXMgKz0gbGVuOwotCQlzZWxmLT5zdGF0cy5yeF9wYWNrZXRzKys7CisJCXNlbGYtPm5ldGRldi0+c3RhdHMucnhfYnl0ZXMgKz0gbGVuOworCQlzZWxmLT5uZXRkZXYtPnN0YXRzLnJ4X3BhY2tldHMrKzsKIAkJc2tiLT5kZXYgPSBzZWxmLT5uZXRkZXY7CiAJCXNrYl9yZXNldF9tYWNfaGVhZGVyKHNrYik7CiAJCXNrYi0+cHJvdG9jb2wgPSBodG9ucyhFVEhfUF9JUkRBKTsKQEAgLTExODAsNyArMTE3Nyw3IEBACiAJCSAqLwogCQlpZiAoKHNrYiA9PSBOVUxMKSB8fCAoc2tiLT5kYXRhID09IE5VTEwpCiAJCSAgICB8fCAoc2VsZi0+cnhfYnVmZi5kYXRhID09IE5VTEwpIHx8IChsZW4gPCA2KSkgewotCQkJc2VsZi0+c3RhdHMucnhfZHJvcHBlZCsrOworCQkJc2VsZi0+bmV0ZGV2LT5zdGF0cy5yeF9kcm9wcGVkKys7CiAJCQlyZXR1cm4gVFJVRTsKIAkJfQogCQlza2JfcmVzZXJ2ZShza2IsIDEpOwpAQCAtMTE5Miw4ICsxMTg5LDggQEAKIAogCQkvLyBNb3ZlIHRvIG5leHQgZnJhbWUgCiAJCXNlbGYtPnJ4X2J1ZmYuZGF0YSArPSBsZW47Ci0JCXNlbGYtPnN0YXRzLnJ4X2J5dGVzICs9IGxlbjsKLQkJc2VsZi0+c3RhdHMucnhfcGFja2V0cysrOworCQlzZWxmLT5uZXRkZXYtPnN0YXRzLnJ4X2J5dGVzICs9IGxlbjsKKwkJc2VsZi0+bmV0ZGV2LT5zdGF0cy5yeF9wYWNrZXRzKys7CiAJCXNrYi0+ZGV2ID0gc2VsZi0+bmV0ZGV2OwogCQlza2JfcmVzZXRfbWFjX2hlYWRlcihza2IpOwogCQlza2ItPnByb3RvY29sID0gaHRvbnMoRVRIX1BfSVJEQSk7CkBAIC0xMjIwLDEzICsxMjE3LDEzIEBACiAJSVJEQV9ERUJVRygyLCAiJXMoKTogbGVuPSV4XG4iLCBfX2Z1bmNfXywgbGVuKTsKIAogCWlmICgobGVuIC0gNCkgPCAyKSB7Ci0JCXNlbGYtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKKwkJc2VsZi0+bmV0ZGV2LT5zdGF0cy5yeF9kcm9wcGVkKys7CiAJCXJldHVybiBGQUxTRTsKIAl9CiAKIAlza2IgPSBkZXZfYWxsb2Nfc2tiKGxlbiArIDEpOwogCWlmIChza2IgPT0gTlVMTCkgewotCQlzZWxmLT5zdGF0cy5yeF9kcm9wcGVkKys7CisJCXNlbGYtPm5ldGRldi0+c3RhdHMucnhfZHJvcHBlZCsrOwogCQlyZXR1cm4gRkFMU0U7CiAJfQogCXNrYl9yZXNlcnZlKHNrYiwgMSk7CkBAIC0xMjM4LDggKzEyMzUsOCBAQAogCQlzdF9maWZvLT50YWlsID0gMDsKIAkvLyBNb3ZlIHRvIG5leHQgZnJhbWUgCiAJc2VsZi0+cnhfYnVmZi5kYXRhICs9IGxlbjsKLQlzZWxmLT5zdGF0cy5yeF9ieXRlcyArPSBsZW47Ci0Jc2VsZi0+c3RhdHMucnhfcGFja2V0cysrOworCXNlbGYtPm5ldGRldi0+c3RhdHMucnhfYnl0ZXMgKz0gbGVuOworCXNlbGYtPm5ldGRldi0+c3RhdHMucnhfcGFja2V0cysrOwogCXNrYi0+ZGV2ID0gc2VsZi0+bmV0ZGV2OwogCXNrYl9yZXNldF9tYWNfaGVhZGVyKHNrYik7CiAJc2tiLT5wcm90b2NvbCA9IGh0b25zKEVUSF9QX0lSREEpOwpAQCAtMTI5NSw3ICsxMjkyLDcgQEAKIAkJCSAqLwogCQkJaWYgKChza2IgPT0gTlVMTCkgfHwgKHNrYi0+ZGF0YSA9PSBOVUxMKQogCQkJICAgIHx8IChzZWxmLT5yeF9idWZmLmRhdGEgPT0gTlVMTCkgfHwgKGxlbiA8IDYpKSB7Ci0JCQkJc2VsZi0+c3RhdHMucnhfZHJvcHBlZCsrOworCQkJCXNlbGYtPm5ldGRldi0+c3RhdHMucnhfZHJvcHBlZCsrOwogCQkJCWNvbnRpbnVlOwogCQkJfQogCQkJc2tiX3Jlc2VydmUoc2tiLCAxKTsKQEAgLTEzMDcsOCArMTMwNCw4IEBACiAKIAkJCS8vIE1vdmUgdG8gbmV4dCBmcmFtZSAKIAkJCXNlbGYtPnJ4X2J1ZmYuZGF0YSArPSBsZW47Ci0JCQlzZWxmLT5zdGF0cy5yeF9ieXRlcyArPSBsZW47Ci0JCQlzZWxmLT5zdGF0cy5yeF9wYWNrZXRzKys7CisJCQlzZWxmLT5uZXRkZXYtPnN0YXRzLnJ4X2J5dGVzICs9IGxlbjsKKwkJCXNlbGYtPm5ldGRldi0+c3RhdHMucnhfcGFja2V0cysrOwogCQkJc2tiLT5kZXYgPSBzZWxmLT5uZXRkZXY7CiAJCQlza2JfcmVzZXRfbWFjX2hlYWRlcihza2IpOwogCQkJc2tiLT5wcm90b2NvbCA9IGh0b25zKEVUSF9QX0lSREEpOwpAQCAtMTUyMyw3ICsxNTIwLDcgQEAKIAogCUlSREFfQVNTRVJUKGRldiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKIAlzZWxmID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQlzZWxmLT5zdGF0cy5yeF9wYWNrZXRzID0gMDsKKwlkZXYtPnN0YXRzLnJ4X3BhY2tldHMgPSAwOwogCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIDA7KTsKIAlpb2Jhc2UgPSBzZWxmLT5pby5maXJfYmFzZTsKIAlpZiAocmVxdWVzdF9pcnEoc2VsZi0+aW8uaXJxLCB2aWFfaXJjY19pbnRlcnJ1cHQsIDAsIGRldi0+bmFtZSwgZGV2KSkgewpAQCAtMTY2MCwxNCArMTY1Nyw2IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICp2aWFfaXJjY19uZXRfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlCi0JCQkJCQkgICAgICAgKmRldikKLXsKLQlzdHJ1Y3QgdmlhX2lyY2NfY2IgKnNlbGYgPSBuZXRkZXZfcHJpdihkZXYpOwotCi0JcmV0dXJuICZzZWxmLT5zdGF0czsKLX0KLQogTU9EVUxFX0FVVEhPUigiVklBIFRlY2hub2xvZ2llcyxpbmMiKTsKIE1PRFVMRV9ERVNDUklQVElPTigiVklBIElyREEgRGV2aWNlIERyaXZlciIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXJkYS92aWEtaXJjYy5oIGIvZHJpdmVycy9uZXQvaXJkYS92aWEtaXJjYy5oCmluZGV4IDQwM2MzZjcuLmQ5ZDFkYjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2lyZGEvdmlhLWlyY2MuaAorKysgYi9kcml2ZXJzL25ldC9pcmRhL3ZpYS1pcmNjLmgKQEAgLTk1LDcgKzk1LDYgQEAKIAlzdHJ1Y3QgdHhfZmlmbyB0eF9maWZvOwkvKiBJbmZvIGFib3V0IGZyYW1lcyB0byBiZSB0cmFuc21pdHRlZCAqLwogCiAJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsJLyogWWVzISB3ZSBhcmUgc29tZSBraW5kIG9mIG5ldGRldmljZSAqLwotCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOwogCiAJc3RydWN0IGlybGFwX2NiICppcmxhcDsJLyogVGhlIGxpbmsgbGF5ZXIgd2UgYXJlIGJpbmRlZCB0byAqLwogCXN0cnVjdCBxb3NfaW5mbyBxb3M7CS8qIFFvUyBjYXBhYmlsaXRpZXMgZm9yIHRoaXMgZGV2aWNlICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pcmRhL3Zsc2lfaXIuYyBiL2RyaXZlcnMvbmV0L2lyZGEvdmxzaV9pci5jCmluZGV4IDBkMzBmOGQuLjcyM2M0NTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2lyZGEvdmxzaV9pci5jCisrKyBiL2RyaXZlcnMvbmV0L2lyZGEvdmxzaV9pci5jCkBAIC0yOTEsMTQgKzI5MSwxNCBAQAogCQlub3cudHZfc2VjIC0gaWRldi0+bGFzdF9yeC50dl9zZWMgLSBkZWx0YTEsIGRlbHRhMik7CQogCiAJc2VxX3ByaW50ZihzZXEsICJSWDogcGFja2V0cz0lbHUgLyBieXRlcz0lbHUgLyBlcnJvcnM9JWx1IC8gZHJvcHBlZD0lbHUiLAotCQlpZGV2LT5zdGF0cy5yeF9wYWNrZXRzLCBpZGV2LT5zdGF0cy5yeF9ieXRlcywgaWRldi0+c3RhdHMucnhfZXJyb3JzLAotCQlpZGV2LT5zdGF0cy5yeF9kcm9wcGVkKTsKKwkJbmRldi0+c3RhdHMucnhfcGFja2V0cywgbmRldi0+c3RhdHMucnhfYnl0ZXMsIG5kZXYtPnN0YXRzLnJ4X2Vycm9ycywKKwkJbmRldi0+c3RhdHMucnhfZHJvcHBlZCk7CiAJc2VxX3ByaW50ZihzZXEsICIgLyBvdmVycnVuPSVsdSAvIGxlbmd0aD0lbHUgLyBmcmFtZT0lbHUgLyBjcmM9JWx1XG4iLAotCQlpZGV2LT5zdGF0cy5yeF9vdmVyX2Vycm9ycywgaWRldi0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycywKLQkJaWRldi0+c3RhdHMucnhfZnJhbWVfZXJyb3JzLCBpZGV2LT5zdGF0cy5yeF9jcmNfZXJyb3JzKTsKKwkJbmRldi0+c3RhdHMucnhfb3Zlcl9lcnJvcnMsIG5kZXYtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMsCisJCW5kZXYtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycywgbmRldi0+c3RhdHMucnhfY3JjX2Vycm9ycyk7CiAJc2VxX3ByaW50ZihzZXEsICJUWDogcGFja2V0cz0lbHUgLyBieXRlcz0lbHUgLyBlcnJvcnM9JWx1IC8gZHJvcHBlZD0lbHUgLyBmaWZvPSVsdVxuIiwKLQkJaWRldi0+c3RhdHMudHhfcGFja2V0cywgaWRldi0+c3RhdHMudHhfYnl0ZXMsIGlkZXYtPnN0YXRzLnR4X2Vycm9ycywKLQkJaWRldi0+c3RhdHMudHhfZHJvcHBlZCwgaWRldi0+c3RhdHMudHhfZmlmb19lcnJvcnMpOworCQluZGV2LT5zdGF0cy50eF9wYWNrZXRzLCBuZGV2LT5zdGF0cy50eF9ieXRlcywgbmRldi0+c3RhdHMudHhfZXJyb3JzLAorCQluZGV2LT5zdGF0cy50eF9kcm9wcGVkLCBuZGV2LT5zdGF0cy50eF9maWZvX2Vycm9ycyk7CiAKIH0KIAkJCkBAIC02NTEsMjEgKzY1MSwyMSBAQAogCiAJCWlmIChyZXQgPCAwKSB7CiAJCQlyZXQgPSAtcmV0OwotCQkJaWRldi0+c3RhdHMucnhfZXJyb3JzKys7CisJCQluZGV2LT5zdGF0cy5yeF9lcnJvcnMrKzsKIAkJCWlmIChyZXQgJiBWTFNJX1JYX0RST1ApICAKLQkJCQlpZGV2LT5zdGF0cy5yeF9kcm9wcGVkKys7CisJCQkJbmRldi0+c3RhdHMucnhfZHJvcHBlZCsrOwogCQkJaWYgKHJldCAmIFZMU0lfUlhfT1ZFUikgIAotCQkJCWlkZXYtPnN0YXRzLnJ4X292ZXJfZXJyb3JzKys7CisJCQkJbmRldi0+c3RhdHMucnhfb3Zlcl9lcnJvcnMrKzsKIAkJCWlmIChyZXQgJiBWTFNJX1JYX0xFTkdUSCkgIAotCQkJCWlkZXYtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMrKzsKKwkJCQluZGV2LT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzKys7CiAJCQlpZiAocmV0ICYgVkxTSV9SWF9GUkFNRSkgIAotCQkJCWlkZXYtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycysrOworCQkJCW5kZXYtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycysrOwogCQkJaWYgKHJldCAmIFZMU0lfUlhfQ1JDKSAgCi0JCQkJaWRldi0+c3RhdHMucnhfY3JjX2Vycm9ycysrOworCQkJCW5kZXYtPnN0YXRzLnJ4X2NyY19lcnJvcnMrKzsKIAkJfQogCQllbHNlIGlmIChyZXQgPiAwKSB7Ci0JCQlpZGV2LT5zdGF0cy5yeF9wYWNrZXRzKys7Ci0JCQlpZGV2LT5zdGF0cy5yeF9ieXRlcyArPSByZXQ7CisJCQluZGV2LT5zdGF0cy5yeF9wYWNrZXRzKys7CisJCQluZGV2LT5zdGF0cy5yeF9ieXRlcyArPSByZXQ7CiAJCX0KIAl9CiAKQEAgLTY4Niw2ICs2ODYsNyBAQAogCiBzdGF0aWMgdm9pZCB2bHNpX3VuYXJtX3J4KHZsc2lfaXJkYV9kZXZfdCAqaWRldikKIHsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShpZGV2LT5wZGV2KTsKIAlzdHJ1Y3QgdmxzaV9yaW5nICpyID0gaWRldi0+cnhfcmluZzsKIAlzdHJ1Y3QgcmluZ19kZXNjciAqcmQ7CiAJaW50IHJldDsKQEAgLTcxMSwyMSArNzEyLDIxIEBACiAKIAkJaWYgKHJldCA8IDApIHsKIAkJCXJldCA9IC1yZXQ7Ci0JCQlpZGV2LT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkJCW5kZXYtPnN0YXRzLnJ4X2Vycm9ycysrOwogCQkJaWYgKHJldCAmIFZMU0lfUlhfRFJPUCkgIAotCQkJCWlkZXYtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKKwkJCQluZGV2LT5zdGF0cy5yeF9kcm9wcGVkKys7CiAJCQlpZiAocmV0ICYgVkxTSV9SWF9PVkVSKSAgCi0JCQkJaWRldi0+c3RhdHMucnhfb3Zlcl9lcnJvcnMrKzsKKwkJCQluZGV2LT5zdGF0cy5yeF9vdmVyX2Vycm9ycysrOwogCQkJaWYgKHJldCAmIFZMU0lfUlhfTEVOR1RIKSAgCi0JCQkJaWRldi0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOworCQkJCW5kZXYtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMrKzsKIAkJCWlmIChyZXQgJiBWTFNJX1JYX0ZSQU1FKSAgCi0JCQkJaWRldi0+c3RhdHMucnhfZnJhbWVfZXJyb3JzKys7CisJCQkJbmRldi0+c3RhdHMucnhfZnJhbWVfZXJyb3JzKys7CiAJCQlpZiAocmV0ICYgVkxTSV9SWF9DUkMpICAKLQkJCQlpZGV2LT5zdGF0cy5yeF9jcmNfZXJyb3JzKys7CisJCQkJbmRldi0+c3RhdHMucnhfY3JjX2Vycm9ycysrOwogCQl9CiAJCWVsc2UgaWYgKHJldCA+IDApIHsKLQkJCWlkZXYtPnN0YXRzLnJ4X3BhY2tldHMrKzsKLQkJCWlkZXYtPnN0YXRzLnJ4X2J5dGVzICs9IHJldDsKKwkJCW5kZXYtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKwkJCW5kZXYtPnN0YXRzLnJ4X2J5dGVzICs9IHJldDsKIAkJfQogCX0KIH0KQEAgLTEwNTAsOCArMTA1MSw4IEBACiBkcm9wOgogCUlSREFfV0FSTklORygiJXM6IGRyb3BwaW5nIHBhY2tldCAtICVzXG4iLCBfX2Z1bmNfXywgbXNnKTsKIAlkZXZfa2ZyZWVfc2tiX2FueShza2IpOwotCWlkZXYtPnN0YXRzLnR4X2Vycm9ycysrOwotCWlkZXYtPnN0YXRzLnR4X2Ryb3BwZWQrKzsKKwluZGV2LT5zdGF0cy50eF9lcnJvcnMrKzsKKwluZGV2LT5zdGF0cy50eF9kcm9wcGVkKys7CiAJLyogRG9uJ3QgZXZlbiB0aGluayBhYm91dCByZXR1cm5pbmcgTkVUX1hNSVRfRFJPUCAoPTEpIGhlcmUhCiAJICogSW4gZmFjdCBhbnkgcmV0dmFsIT0wIGNhdXNlcyB0aGUgcGFja2V0IHNjaGVkdWxlciB0byByZXF1ZXVlIHRoZQogCSAqIHBhY2tldCBmb3IgbGF0ZXIgcmV0cnkgb2YgdHJhbnNtaXNzaW9uIC0gd2hpY2ggaXNuJ3QgZXhhY3RseQpAQCAtMTA3OCwxNSArMTA3OSwxNSBAQAogCiAJCWlmIChyZXQgPCAwKSB7CiAJCQlyZXQgPSAtcmV0OwotCQkJaWRldi0+c3RhdHMudHhfZXJyb3JzKys7CisJCQluZGV2LT5zdGF0cy50eF9lcnJvcnMrKzsKIAkJCWlmIChyZXQgJiBWTFNJX1RYX0RST1ApCi0JCQkJaWRldi0+c3RhdHMudHhfZHJvcHBlZCsrOworCQkJCW5kZXYtPnN0YXRzLnR4X2Ryb3BwZWQrKzsKIAkJCWlmIChyZXQgJiBWTFNJX1RYX0ZJRk8pCi0JCQkJaWRldi0+c3RhdHMudHhfZmlmb19lcnJvcnMrKzsKKwkJCQluZGV2LT5zdGF0cy50eF9maWZvX2Vycm9ycysrOwogCQl9CiAJCWVsc2UgaWYgKHJldCA+IDApewotCQkJaWRldi0+c3RhdHMudHhfcGFja2V0cysrOwotCQkJaWRldi0+c3RhdHMudHhfYnl0ZXMgKz0gcmV0OworCQkJbmRldi0+c3RhdHMudHhfcGFja2V0cysrOworCQkJbmRldi0+c3RhdHMudHhfYnl0ZXMgKz0gcmV0OwogCQl9CiAJfQogCkBAIC0xMTIyLDYgKzExMjMsNyBAQAogCiBzdGF0aWMgdm9pZCB2bHNpX3VuYXJtX3R4KHZsc2lfaXJkYV9kZXZfdCAqaWRldikKIHsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShpZGV2LT5wZGV2KTsKIAlzdHJ1Y3QgdmxzaV9yaW5nICpyID0gaWRldi0+dHhfcmluZzsKIAlzdHJ1Y3QgcmluZ19kZXNjciAqcmQ7CiAJaW50IHJldDsKQEAgLTExNDUsMTUgKzExNDcsMTUgQEAKIAogCQlpZiAocmV0IDwgMCkgewogCQkJcmV0ID0gLXJldDsKLQkJCWlkZXYtPnN0YXRzLnR4X2Vycm9ycysrOworCQkJbmRldi0+c3RhdHMudHhfZXJyb3JzKys7CiAJCQlpZiAocmV0ICYgVkxTSV9UWF9EUk9QKQotCQkJCWlkZXYtPnN0YXRzLnR4X2Ryb3BwZWQrKzsKKwkJCQluZGV2LT5zdGF0cy50eF9kcm9wcGVkKys7CiAJCQlpZiAocmV0ICYgVkxTSV9UWF9GSUZPKQotCQkJCWlkZXYtPnN0YXRzLnR4X2ZpZm9fZXJyb3JzKys7CisJCQkJbmRldi0+c3RhdHMudHhfZmlmb19lcnJvcnMrKzsKIAkJfQogCQllbHNlIGlmIChyZXQgPiAwKXsKLQkJCWlkZXYtPnN0YXRzLnR4X3BhY2tldHMrKzsKLQkJCWlkZXYtPnN0YXRzLnR4X2J5dGVzICs9IHJldDsKKwkJCW5kZXYtPnN0YXRzLnR4X3BhY2tldHMrKzsKKwkJCW5kZXYtPnN0YXRzLnR4X2J5dGVzICs9IHJldDsKIAkJfQogCX0KIApAQCAtMTM3MywxMyArMTM3NSw2IEBACiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICogdmxzaV9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYpCi17Ci0JdmxzaV9pcmRhX2Rldl90ICppZGV2ID0gbmV0ZGV2X3ByaXYobmRldik7Ci0KLQlyZXR1cm4gJmlkZXYtPnN0YXRzOwotfQotCiBzdGF0aWMgdm9pZCB2bHNpX3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYpCiB7CiAJdmxzaV9pcmRhX2Rldl90ICppZGV2ID0gbmV0ZGV2X3ByaXYobmRldik7CkBAIC0xNjE1LDcgKzE2MTAsNiBAQAogIAogCW5kZXYtPm9wZW4JICAgICAgPSB2bHNpX29wZW47CiAJbmRldi0+c3RvcAkgICAgICA9IHZsc2lfY2xvc2U7Ci0JbmRldi0+Z2V0X3N0YXRzCSAgICAgID0gdmxzaV9nZXRfc3RhdHM7CiAJbmRldi0+aGFyZF9zdGFydF94bWl0ID0gdmxzaV9oYXJkX3N0YXJ0X3htaXQ7CiAJbmRldi0+ZG9faW9jdGwJICAgICAgPSB2bHNpX2lvY3RsOwogCW5kZXYtPnR4X3RpbWVvdXQgICAgICA9IHZsc2lfdHhfdGltZW91dDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2lyZGEvdmxzaV9pci5oIGIvZHJpdmVycy9uZXQvaXJkYS92bHNpX2lyLmgKaW5kZXggOWIxODg0My4uMzA1MGQxYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaXJkYS92bHNpX2lyLmgKKysrIGIvZHJpdmVycy9uZXQvaXJkYS92bHNpX2lyLmgKQEAgLTcxMiw3ICs3MTIsNiBAQAogCiB0eXBlZGVmIHN0cnVjdCB2bHNpX2lyZGFfZGV2IHsKIAlzdHJ1Y3QgcGNpX2RldgkJKnBkZXY7Ci0Jc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMJc3RhdHM7CiAKIAlzdHJ1Y3QgaXJsYXBfY2IJCSppcmxhcDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXJkYS93ODM5NzdhZl9pci5jIGIvZHJpdmVycy9uZXQvaXJkYS93ODM5NzdhZl9pci5jCmluZGV4IDMwZWM5MTMuLmRjMGEyZTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2lyZGEvdzgzOTc3YWZfaXIuYworKysgYi9kcml2ZXJzL25ldC9pcmRhL3c4Mzk3N2FmX2lyLmMKQEAgLTEwMiw3ICsxMDIsNiBAQAogc3RhdGljIGludCAgdzgzOTc3YWZfbmV0X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiBzdGF0aWMgaW50ICB3ODM5NzdhZl9uZXRfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiBzdGF0aWMgaW50ICB3ODM5NzdhZl9uZXRfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICpycSwgaW50IGNtZCk7Ci1zdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnc4Mzk3N2FmX25ldF9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiAKIC8qCiAgKiBGdW5jdGlvbiB3ODM5NzdhZl9pbml0ICgpCkBAIC0yMzcsNyArMjM2LDYgQEAKIAlkZXYtPm9wZW4gICAgICAgICAgICA9IHc4Mzk3N2FmX25ldF9vcGVuOwogCWRldi0+c3RvcCAgICAgICAgICAgID0gdzgzOTc3YWZfbmV0X2Nsb3NlOwogCWRldi0+ZG9faW9jdGwgICAgICAgID0gdzgzOTc3YWZfbmV0X2lvY3RsOwotCWRldi0+Z2V0X3N0YXRzCSAgICAgPSB3ODM5NzdhZl9uZXRfZ2V0X3N0YXRzOwogCiAJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CiAJaWYgKGVycikgewpAQCAtNzAyLDEzICs3MDAsMTMgQEAKIAlpZiAoaW5iKGlvYmFzZStBVURSKSAmIEFVRFJfVU5EUikgewogCQlJUkRBX0RFQlVHKDAsICIlcygpLCBUcmFuc21pdCB1bmRlcnJ1biFcbiIsIF9fZnVuY19fICk7CiAJCQotCQlzZWxmLT5zdGF0cy50eF9lcnJvcnMrKzsKLQkJc2VsZi0+c3RhdHMudHhfZmlmb19lcnJvcnMrKzsKKwkJc2VsZi0+bmV0ZGV2LT5zdGF0cy50eF9lcnJvcnMrKzsKKwkJc2VsZi0+bmV0ZGV2LT5zdGF0cy50eF9maWZvX2Vycm9ycysrOwogCiAJCS8qIENsZWFyIGJpdCwgYnkgd3JpdGluZyAxIHRvIGl0ICovCiAJCW91dGIoQVVEUl9VTkRSLCBpb2Jhc2UrQVVEUik7CiAJfSBlbHNlCi0JCXNlbGYtPnN0YXRzLnR4X3BhY2tldHMrKzsKKwkJc2VsZi0+bmV0ZGV2LT5zdGF0cy50eF9wYWNrZXRzKys7CiAKIAkKIAlpZiAoc2VsZi0+bmV3X3NwZWVkKSB7CkBAIC04NDYsMjggKzg0NCwyOCBAQAogCQlpZiAoc3RhdHVzICYgRlNfRk9fRVJSX01TSykgewogCQkJaWYgKHN0YXR1cyAmIEZTX0ZPX0xTVF9GUikgewogCQkJCS8qIEFkZCBudW1iZXIgb2YgbG9zdCBmcmFtZXMgdG8gc3RhdHMgKi8KLQkJCQlzZWxmLT5zdGF0cy5yeF9lcnJvcnMgKz0gbGVuOwkKKwkJCQlzZWxmLT5uZXRkZXYtPnN0YXRzLnJ4X2Vycm9ycyArPSBsZW47CiAJCQl9IGVsc2UgewogCQkJCS8qIFNraXAgZnJhbWUgKi8KLQkJCQlzZWxmLT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkJCQlzZWxmLT5uZXRkZXYtPnN0YXRzLnJ4X2Vycm9ycysrOwogCQkJCQogCQkJCXNlbGYtPnJ4X2J1ZmYuZGF0YSArPSBsZW47CiAJCQkJCiAJCQkJaWYgKHN0YXR1cyAmIEZTX0ZPX01YX0xFWCkKLQkJCQkJc2VsZi0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOworCQkJCQlzZWxmLT5uZXRkZXYtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMrKzsKIAkJCQkKIAkJCQlpZiAoc3RhdHVzICYgRlNfRk9fUEhZX0VSUikgCi0JCQkJCXNlbGYtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycysrOworCQkJCQlzZWxmLT5uZXRkZXYtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycysrOwogCQkJCQogCQkJCWlmIChzdGF0dXMgJiBGU19GT19DUkNfRVJSKSAKLQkJCQkJc2VsZi0+c3RhdHMucnhfY3JjX2Vycm9ycysrOworCQkJCQlzZWxmLT5uZXRkZXYtPnN0YXRzLnJ4X2NyY19lcnJvcnMrKzsKIAkJCX0KIAkJCS8qIFRoZSBlcnJvcnMgYmVsb3cgY2FuIGJlIHJlcG9ydGVkIGluIGJvdGggY2FzZXMgKi8KIAkJCWlmIChzdGF0dXMgJiBGU19GT19SWF9PVikKLQkJCQlzZWxmLT5zdGF0cy5yeF9maWZvX2Vycm9ycysrOworCQkJCXNlbGYtPm5ldGRldi0+c3RhdHMucnhfZmlmb19lcnJvcnMrKzsKIAkJCQogCQkJaWYgKHN0YXR1cyAmIEZTX0ZPX0ZTRl9PVikKLQkJCQlzZWxmLT5zdGF0cy5yeF9maWZvX2Vycm9ycysrOworCQkJCXNlbGYtPm5ldGRldi0+c3RhdHMucnhfZmlmb19lcnJvcnMrKzsKIAkJCQogCQl9IGVsc2UgewogCQkJLyogQ2hlY2sgaWYgd2UgaGF2ZSB0cmFuc2ZlcnJlZCBhbGwgZGF0YSB0byBtZW1vcnkgKi8KQEAgLTkxNyw3ICs5MTUsNyBAQAogCiAJCQkvKiBNb3ZlIHRvIG5leHQgZnJhbWUgKi8KIAkJCXNlbGYtPnJ4X2J1ZmYuZGF0YSArPSBsZW47Ci0JCQlzZWxmLT5zdGF0cy5yeF9wYWNrZXRzKys7CisJCQlzZWxmLT5uZXRkZXYtPnN0YXRzLnJ4X3BhY2tldHMrKzsKIAkJCQogCQkJc2tiLT5kZXYgPSBzZWxmLT5uZXRkZXY7CiAJCQlza2JfcmVzZXRfbWFjX2hlYWRlcihza2IpOwpAQCAtOTUxLDcgKzk0OSw3IEBACiAJLyogIFJlY2VpdmUgYWxsIGNoYXJhY3RlcnMgaW4gUnggRklGTyAqLwogCWRvIHsKIAkJYnl0ZSA9IGluYihpb2Jhc2UrUkJSKTsKLQkJYXN5bmNfdW53cmFwX2NoYXIoc2VsZi0+bmV0ZGV2LCAmc2VsZi0+c3RhdHMsICZzZWxmLT5yeF9idWZmLCAKKwkJYXN5bmNfdW53cmFwX2NoYXIoc2VsZi0+bmV0ZGV2LCAmc2VsZi0+bmV0ZGV2LT5zdGF0cywgJnNlbGYtPnJ4X2J1ZmYsCiAJCQkJICBieXRlKTsKIAl9IHdoaWxlIChpbmIoaW9iYXNlK1VTUikgJiBVU1JfUkRSKTsgLyogRGF0YSBhdmFpbGFibGUgKi8JCiB9CkBAIC05OTQsNyArOTkyLDcgQEAKIAkJCW91dGIoQVVEUl9TRkVORCwgaW9iYXNlK0FVRFIpOwogCQkJb3V0YihzZXQsIGlvYmFzZStTU1IpOyAKIAotCQkJc2VsZi0+c3RhdHMudHhfcGFja2V0cysrOworCQkJc2VsZi0+bmV0ZGV2LT5zdGF0cy50eF9wYWNrZXRzKys7CiAKIAkJCS8qIEZlZWQgbWUgbW9yZSBwYWNrZXRzICovCiAJCQluZXRpZl93YWtlX3F1ZXVlKHNlbGYtPm5ldGRldik7CkBAIC0xMzM2LDEzICsxMzM0LDYgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnc4Mzk3N2FmX25ldF9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgdzgzOTc3YWZfaXIgKnNlbGYgPSBuZXRkZXZfcHJpdihkZXYpOwotCQotCXJldHVybiAmc2VsZi0+c3RhdHM7Ci19Ci0KIE1PRFVMRV9BVVRIT1IoIkRhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4iKTsKIE1PRFVMRV9ERVNDUklQVElPTigiV2luYm9uZCBXODM5NzdBRiBJckRBIERldmljZSBEcml2ZXIiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2lyZGEvdzgzOTc3YWZfaXIuaCBiL2RyaXZlcnMvbmV0L2lyZGEvdzgzOTc3YWZfaXIuaAppbmRleCA4N2MzOTc1Li5mZWZlOWIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9pcmRhL3c4Mzk3N2FmX2lyLmgKKysrIGIvZHJpdmVycy9uZXQvaXJkYS93ODM5NzdhZl9pci5oCkBAIC0xNzIsNyArMTcyLDYgQEAKIAlpbnQgdHhfbGVuOyAgICAgICAgICAvKiBOdW1iZXIgb2YgZnJhbWVzIGluIHR4X2J1ZmYgKi8KIAogCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXY7IC8qIFllcyEgd2UgYXJlIHNvbWUga2luZCBvZiBuZXRkZXZpY2UgKi8KLQlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsKIAkKIAlzdHJ1Y3QgaXJsYXBfY2IgICAgKmlybGFwOyAvKiBUaGUgbGluayBsYXllciB3ZSBhcmUgYmluZGVkIHRvICovCiAJc3RydWN0IHFvc19pbmZvICAgICBxb3M7ICAgLyogUW9TIGNhcGFiaWxpdGllcyBmb3IgdGhpcyBkZXZpY2UgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2lzZXJpZXNfdmV0aC5jIGIvZHJpdmVycy9uZXQvaXNlcmllc192ZXRoLmMKaW5kZXggYzc0NTdmOS4uY2I3OTNjMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaXNlcmllc192ZXRoLmMKKysrIGIvZHJpdmVycy9uZXQvaXNlcmllc192ZXRoLmMKQEAgLTQyOSw3ICs0MjksNyBAQAogU0lNUExFX1BPUlRfQVRUUihudW1fbWNhc3QpOwogQ1VTVE9NX1BPUlRfQVRUUihscGFyX21hcCwgIjB4JVhcbiIsIHBvcnQtPmxwYXJfbWFwKTsKIENVU1RPTV9QT1JUX0FUVFIoc3RvcHBlZF9tYXAsICIweCVYXG4iLCBwb3J0LT5zdG9wcGVkX21hcCk7Ci1DVVNUT01fUE9SVF9BVFRSKG1hY19hZGRyLCAiMHglbFhcbiIsIHBvcnQtPm1hY19hZGRyKTsKK0NVU1RPTV9QT1JUX0FUVFIobWFjX2FkZHIsICIweCVsbFhcbiIsIHBvcnQtPm1hY19hZGRyKTsKIAogI2RlZmluZSBHRVRfUE9SVF9BVFRSKF9uYW1lKQkoJnZldGhfcG9ydF9hdHRyXyMjX25hbWUuYXR0cikKIHN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICp2ZXRoX3BvcnRfZGVmYXVsdF9hdHRyc1tdID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQva29yaW5hLmMgYi9kcml2ZXJzL25ldC9rb3JpbmEuYwppbmRleCA0YTU1ODBjLi4xZDZlNDhlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9rb3JpbmEuYworKysgYi9kcml2ZXJzL25ldC9rb3JpbmEuYwpAQCAtODQsNyArODQsMTAgQEAKICNkZWZpbmUgS09SSU5BX05VTV9SRFMJNjQgIC8qIG51bWJlciBvZiByZWNlaXZlIGRlc2NyaXB0b3JzICovCiAjZGVmaW5lIEtPUklOQV9OVU1fVERTCTY0ICAvKiBudW1iZXIgb2YgdHJhbnNtaXQgZGVzY3JpcHRvcnMgKi8KIAotI2RlZmluZSBLT1JJTkFfUkJTSVpFCTUzNiAvKiBzaXplIG9mIG9uZSByZXNvdXJjZSBidWZmZXIgPSBFdGhlciBNVFUgKi8KKy8qIEtPUklOQV9SQlNJWkUgaXMgdGhlIGhhcmR3YXJlJ3MgZGVmYXVsdCBtYXhpbXVtIHJlY2VpdmUKKyAqIGZyYW1lIHNpemUgaW4gYnl0ZXMuIEhhdmluZyB0aGlzIGhhcmRjb2RlZCBtZWFucyB0aGF0IHRoZXJlCisgKiBpcyBubyBzdXBwb3J0IGZvciBNVFUgc2l6ZXMgZ3JlYXRlciB0aGFuIDE1MDAuICovCisjZGVmaW5lIEtPUklOQV9SQlNJWkUJMTUzNiAvKiBzaXplIG9mIG9uZSByZXNvdXJjZSBidWZmZXIgPSBFdGhlciBNVFUgKi8KICNkZWZpbmUgS09SSU5BX1JEU19NQVNLCShLT1JJTkFfTlVNX1JEUyAtIDEpCiAjZGVmaW5lIEtPUklOQV9URFNfTUFTSwkoS09SSU5BX05VTV9URFMgLSAxKQogI2RlZmluZSBSRF9SSU5HX1NJWkUgCShLT1JJTkFfTlVNX1JEUyAqIHNpemVvZihzdHJ1Y3QgZG1hX2Rlc2MpKQpAQCAtMTk2LDcgKzE5OSw3IEBACiAJc3RydWN0IGtvcmluYV9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAl1MzIgbGVuZ3RoOwotCXUzMiBjaGFpbl9pbmRleDsKKwl1MzIgY2hhaW5fcHJldiwgY2hhaW5fbmV4dDsKIAlzdHJ1Y3QgZG1hX2Rlc2MgKnRkOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT5sb2NrLCBmbGFncyk7CkBAIC0yMjgsOCArMjMxLDggQEAKIAkvKiBTZXR1cCB0aGUgdHJhbnNtaXQgZGVzY3JpcHRvci4gKi8KIAlkbWFfY2FjaGVfaW52KCh1MzIpIHRkLCBzaXplb2YoKnRkKSk7CiAJdGQtPmNhID0gQ1BIWVNBRERSKHNrYi0+ZGF0YSk7Ci0JY2hhaW5faW5kZXggPSAobHAtPnR4X2NoYWluX3RhaWwgLSAxKSAmCi0JCQlLT1JJTkFfVERTX01BU0s7CisJY2hhaW5fcHJldiA9IChscC0+dHhfY2hhaW5fdGFpbCAtIDEpICYgS09SSU5BX1REU19NQVNLOworCWNoYWluX25leHQgPSAobHAtPnR4X2NoYWluX3RhaWwgKyAxKSAmIEtPUklOQV9URFNfTUFTSzsKIAogCWlmIChyZWFkbCgmKGxwLT50eF9kbWFfcmVncy0+ZG1hbmRwdHIpKSA9PSAwKSB7CiAJCWlmIChscC0+dHhfY2hhaW5fc3RhdHVzID09IGRlc2NfZW1wdHkpIHsKQEAgLTIzNyw3ICsyNDAsNyBAQAogCQkJdGQtPmNvbnRyb2wgPSBETUFfQ09VTlQobGVuZ3RoKSB8CiAJCQkJCURNQV9ERVNDX0NPRiB8IERNQV9ERVNDX0lPRjsKIAkJCS8qIE1vdmUgdGFpbCAqLwotCQkJbHAtPnR4X2NoYWluX3RhaWwgPSBjaGFpbl9pbmRleDsKKwkJCWxwLT50eF9jaGFpbl90YWlsID0gY2hhaW5fbmV4dDsKIAkJCS8qIFdyaXRlIHRvIE5EUFRSICovCiAJCQl3cml0ZWwoQ1BIWVNBRERSKCZscC0+dGRfcmluZ1tscC0+dHhfY2hhaW5faGVhZF0pLAogCQkJCQkmbHAtPnR4X2RtYV9yZWdzLT5kbWFuZHB0cik7CkBAIC0yNDgsMTIgKzI1MSwxMiBAQAogCQkJdGQtPmNvbnRyb2wgPSBETUFfQ09VTlQobGVuZ3RoKSB8CiAJCQkJCURNQV9ERVNDX0NPRiB8IERNQV9ERVNDX0lPRjsKIAkJCS8qIExpbmsgdG8gcHJldiAqLwotCQkJbHAtPnRkX3JpbmdbY2hhaW5faW5kZXhdLmNvbnRyb2wgJj0KKwkJCWxwLT50ZF9yaW5nW2NoYWluX3ByZXZdLmNvbnRyb2wgJj0KIAkJCQkJfkRNQV9ERVNDX0NPRjsKIAkJCS8qIExpbmsgdG8gcHJldiAqLwotCQkJbHAtPnRkX3JpbmdbY2hhaW5faW5kZXhdLmxpbmsgPSAgQ1BIWVNBRERSKHRkKTsKKwkJCWxwLT50ZF9yaW5nW2NoYWluX3ByZXZdLmxpbmsgPSAgQ1BIWVNBRERSKHRkKTsKIAkJCS8qIE1vdmUgdGFpbCAqLwotCQkJbHAtPnR4X2NoYWluX3RhaWwgPSBjaGFpbl9pbmRleDsKKwkJCWxwLT50eF9jaGFpbl90YWlsID0gY2hhaW5fbmV4dDsKIAkJCS8qIFdyaXRlIHRvIE5EUFRSICovCiAJCQl3cml0ZWwoQ1BIWVNBRERSKCZscC0+dGRfcmluZ1tscC0+dHhfY2hhaW5faGVhZF0pLAogCQkJCQkmKGxwLT50eF9kbWFfcmVncy0+ZG1hbmRwdHIpKTsKQEAgLTI2NywxNyArMjcwLDE2IEBACiAJCQl0ZC0+Y29udHJvbCA9IERNQV9DT1VOVChsZW5ndGgpIHwKIAkJCQkJRE1BX0RFU0NfQ09GIHwgRE1BX0RFU0NfSU9GOwogCQkJLyogTW92ZSB0YWlsICovCi0JCQlscC0+dHhfY2hhaW5fdGFpbCA9IGNoYWluX2luZGV4OworCQkJbHAtPnR4X2NoYWluX3RhaWwgPSBjaGFpbl9uZXh0OwogCQkJbHAtPnR4X2NoYWluX3N0YXR1cyA9IGRlc2NfZmlsbGVkOwotCQkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOwogCQl9IGVsc2UgewogCQkJLyogVXBkYXRlIHRhaWwgKi8KIAkJCXRkLT5jb250cm9sID0gRE1BX0NPVU5UKGxlbmd0aCkgfAogCQkJCQlETUFfREVTQ19DT0YgfCBETUFfREVTQ19JT0Y7Ci0JCQlscC0+dGRfcmluZ1tjaGFpbl9pbmRleF0uY29udHJvbCAmPQorCQkJbHAtPnRkX3JpbmdbY2hhaW5fcHJldl0uY29udHJvbCAmPQogCQkJCQl+RE1BX0RFU0NfQ09GOwotCQkJbHAtPnRkX3JpbmdbY2hhaW5faW5kZXhdLmxpbmsgPSAgQ1BIWVNBRERSKHRkKTsKLQkJCWxwLT50eF9jaGFpbl90YWlsID0gY2hhaW5faW5kZXg7CisJCQlscC0+dGRfcmluZ1tjaGFpbl9wcmV2XS5saW5rID0gIENQSFlTQUREUih0ZCk7CisJCQlscC0+dHhfY2hhaW5fdGFpbCA9IGNoYWluX25leHQ7CiAJCX0KIAl9CiAJZG1hX2NhY2hlX3diYWNrKCh1MzIpIHRkLCBzaXplb2YoKnRkKSk7CkBAIC0zMjcsMTMgKzMyOSwxMyBAQAogCiAJZG1hcyA9IHJlYWRsKCZscC0+cnhfZG1hX3JlZ3MtPmRtYXMpOwogCWlmIChkbWFzICYgKERNQV9TVEFUX0RPTkUgfCBETUFfU1RBVF9IQUxUIHwgRE1BX1NUQVRfRVJSKSkgewotCQluZXRpZl9yeF9zY2hlZHVsZV9wcmVwKCZscC0+bmFwaSk7Ci0KIAkJZG1hc20gPSByZWFkbCgmbHAtPnJ4X2RtYV9yZWdzLT5kbWFzbSk7CiAJCXdyaXRlbChkbWFzbSB8IChETUFfU1RBVF9ET05FIHwKIAkJCQlETUFfU1RBVF9IQUxUIHwgRE1BX1NUQVRfRVJSKSwKIAkJCQkmbHAtPnJ4X2RtYV9yZWdzLT5kbWFzbSk7CiAKKwkJbmV0aWZfcnhfc2NoZWR1bGUoJmxwLT5uYXBpKTsKKwogCQlpZiAoZG1hcyAmIERNQV9TVEFUX0VSUikKIAkJCXByaW50ayhLRVJOX0VSUiBEUlZfTkFNRSAiJXM6IERNQSBlcnJvclxuIiwgZGV2LT5uYW1lKTsKIApAQCAtMzUwLDE1ICszNTIsMjAgQEAKIAlzdHJ1Y3QgZG1hX2Rlc2MgKnJkID0gJmxwLT5yZF9yaW5nW2xwLT5yeF9uZXh0X2RvbmVdOwogCXN0cnVjdCBza19idWZmICpza2IsICpza2JfbmV3OwogCXU4ICpwa3RfYnVmOwotCXUzMiBkZXZjcywgcGt0X2xlbiwgZG1hcywgcnhfZnJlZV9kZXNjOworCXUzMiBkZXZjcywgcGt0X2xlbiwgZG1hczsKIAlpbnQgY291bnQ7CiAKIAlkbWFfY2FjaGVfaW52KCh1MzIpcmQsIHNpemVvZigqcmQpKTsKIAogCWZvciAoY291bnQgPSAwOyBjb3VudCA8IGxpbWl0OyBjb3VudCsrKSB7CisJCXNrYiA9IGxwLT5yeF9za2JbbHAtPnJ4X25leHRfZG9uZV07CisJCXNrYl9uZXcgPSBOVUxMOwogCiAJCWRldmNzID0gcmQtPmRldmNzOwogCisJCWlmICgoS09SSU5BX1JCU0laRSAtICh1MzIpRE1BX0NPVU5UKHJkLT5jb250cm9sKSkgPT0gMCkKKwkJCWJyZWFrOworCiAJCS8qIFVwZGF0ZSBzdGF0aXN0aWNzIGNvdW50ZXJzICovCiAJCWlmIChkZXZjcyAmIEVUSF9SWF9DUkMpCiAJCQlkZXYtPnN0YXRzLnJ4X2NyY19lcnJvcnMrKzsKQEAgLTM4MSw2MyArMzg4LDU1IEBACiAJCQkgKiBpbiBSYzMyNDM0IChlcnJhdGEgcmVmICMwNzcpICovCiAJCQlkZXYtPnN0YXRzLnJ4X2Vycm9ycysrOwogCQkJZGV2LT5zdGF0cy5yeF9kcm9wcGVkKys7Ci0JCX0KLQotCQl3aGlsZSAoKHJ4X2ZyZWVfZGVzYyA9IEtPUklOQV9SQlNJWkUgLSAodTMyKURNQV9DT1VOVChyZC0+Y29udHJvbCkpICE9IDApIHsKLQkJCS8qIGluaXQgdGhlIHZhci4gdXNlZCBmb3IgdGhlIGxhdGVyCi0JCQkgKiBvcGVyYXRpb25zIHdpdGhpbiB0aGUgd2hpbGUgbG9vcCAqLwotCQkJc2tiX25ldyA9IE5VTEw7CisJCX0gZWxzZSBpZiAoKGRldmNzICYgRVRIX1JYX1JPSykpIHsKIAkJCXBrdF9sZW4gPSBSQ1ZQS1RfTEVOR1RIKGRldmNzKTsKLQkJCXNrYiA9IGxwLT5yeF9za2JbbHAtPnJ4X25leHRfZG9uZV07CiAKLQkJCWlmICgoZGV2Y3MgJiBFVEhfUlhfUk9LKSkgewotCQkJCS8qIG11c3QgYmUgdGhlIChmaXJzdCBhbmQpIGxhc3QKLQkJCQkgKiBkZXNjcmlwdG9yIHRoZW4gKi8KLQkJCQlwa3RfYnVmID0gKHU4ICopbHAtPnJ4X3NrYltscC0+cnhfbmV4dF9kb25lXS0+ZGF0YTsKKwkJCS8qIG11c3QgYmUgdGhlIChmaXJzdCBhbmQpIGxhc3QKKwkJCSAqIGRlc2NyaXB0b3IgdGhlbiAqLworCQkJcGt0X2J1ZiA9ICh1OCAqKWxwLT5yeF9za2JbbHAtPnJ4X25leHRfZG9uZV0tPmRhdGE7CiAKLQkJCQkvKiBpbnZhbGlkYXRlIHRoZSBjYWNoZSAqLwotCQkJCWRtYV9jYWNoZV9pbnYoKHVuc2lnbmVkIGxvbmcpcGt0X2J1ZiwgcGt0X2xlbiAtIDQpOworCQkJLyogaW52YWxpZGF0ZSB0aGUgY2FjaGUgKi8KKwkJCWRtYV9jYWNoZV9pbnYoKHVuc2lnbmVkIGxvbmcpcGt0X2J1ZiwgcGt0X2xlbiAtIDQpOwogCi0JCQkJLyogTWFsbG9jIHVwIG5ldyBidWZmZXIuICovCi0JCQkJc2tiX25ldyA9IG5ldGRldl9hbGxvY19za2IoZGV2LCBLT1JJTkFfUkJTSVpFICsgMik7CisJCQkvKiBNYWxsb2MgdXAgbmV3IGJ1ZmZlci4gKi8KKwkJCXNrYl9uZXcgPSBuZXRkZXZfYWxsb2Nfc2tiKGRldiwgS09SSU5BX1JCU0laRSArIDIpOwogCi0JCQkJaWYgKCFza2JfbmV3KQotCQkJCQlicmVhazsKLQkJCQkvKiBEbyBub3QgY291bnQgdGhlIENSQyAqLwotCQkJCXNrYl9wdXQoc2tiLCBwa3RfbGVuIC0gNCk7Ci0JCQkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgZGV2KTsKKwkJCWlmICghc2tiX25ldykKKwkJCQlicmVhazsKKwkJCS8qIERvIG5vdCBjb3VudCB0aGUgQ1JDICovCisJCQlza2JfcHV0KHNrYiwgcGt0X2xlbiAtIDQpOworCQkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgZGV2KTsKIAotCQkJCS8qIFBhc3MgdGhlIHBhY2tldCB0byB1cHBlciBsYXllcnMgKi8KLQkJCQluZXRpZl9yZWNlaXZlX3NrYihza2IpOwotCQkJCWRldi0+c3RhdHMucnhfcGFja2V0cysrOwotCQkJCWRldi0+c3RhdHMucnhfYnl0ZXMgKz0gcGt0X2xlbjsKKwkJCS8qIFBhc3MgdGhlIHBhY2tldCB0byB1cHBlciBsYXllcnMgKi8KKwkJCW5ldGlmX3JlY2VpdmVfc2tiKHNrYik7CisJCQlkZXYtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKwkJCWRldi0+c3RhdHMucnhfYnl0ZXMgKz0gcGt0X2xlbjsKIAotCQkJCS8qIFVwZGF0ZSB0aGUgbWNhc3Qgc3RhdHMgKi8KLQkJCQlpZiAoZGV2Y3MgJiBFVEhfUlhfTVApCi0JCQkJCWRldi0+c3RhdHMubXVsdGljYXN0Kys7CisJCQkvKiBVcGRhdGUgdGhlIG1jYXN0IHN0YXRzICovCisJCQlpZiAoZGV2Y3MgJiBFVEhfUlhfTVApCisJCQkJZGV2LT5zdGF0cy5tdWx0aWNhc3QrKzsKIAotCQkJCWxwLT5yeF9za2JbbHAtPnJ4X25leHRfZG9uZV0gPSBza2JfbmV3OwotCQkJfQotCi0JCQlyZC0+ZGV2Y3MgPSAwOwotCi0JCQkvKiBSZXN0b3JlIGRlc2NyaXB0b3IncyBjdXJyX2FkZHIgKi8KLQkJCWlmIChza2JfbmV3KQotCQkJCXJkLT5jYSA9IENQSFlTQUREUihza2JfbmV3LT5kYXRhKTsKLQkJCWVsc2UKLQkJCQlyZC0+Y2EgPSBDUEhZU0FERFIoc2tiLT5kYXRhKTsKLQotCQkJcmQtPmNvbnRyb2wgPSBETUFfQ09VTlQoS09SSU5BX1JCU0laRSkgfAotCQkJCURNQV9ERVNDX0NPRCB8IERNQV9ERVNDX0lPRDsKLQkJCWxwLT5yZF9yaW5nWyhscC0+cnhfbmV4dF9kb25lIC0gMSkgJgotCQkJCUtPUklOQV9SRFNfTUFTS10uY29udHJvbCAmPQotCQkJCX5ETUFfREVTQ19DT0Q7Ci0KLQkJCWxwLT5yeF9uZXh0X2RvbmUgPSAobHAtPnJ4X25leHRfZG9uZSArIDEpICYgS09SSU5BX1JEU19NQVNLOwotCQkJZG1hX2NhY2hlX3diYWNrKCh1MzIpcmQsIHNpemVvZigqcmQpKTsKLQkJCXJkID0gJmxwLT5yZF9yaW5nW2xwLT5yeF9uZXh0X2RvbmVdOwotCQkJd3JpdGVsKH5ETUFfU1RBVF9ET05FLCAmbHAtPnJ4X2RtYV9yZWdzLT5kbWFzKTsKKwkJCWxwLT5yeF9za2JbbHAtPnJ4X25leHRfZG9uZV0gPSBza2JfbmV3OwogCQl9CisKKwkJcmQtPmRldmNzID0gMDsKKworCQkvKiBSZXN0b3JlIGRlc2NyaXB0b3IncyBjdXJyX2FkZHIgKi8KKwkJaWYgKHNrYl9uZXcpCisJCQlyZC0+Y2EgPSBDUEhZU0FERFIoc2tiX25ldy0+ZGF0YSk7CisJCWVsc2UKKwkJCXJkLT5jYSA9IENQSFlTQUREUihza2ItPmRhdGEpOworCisJCXJkLT5jb250cm9sID0gRE1BX0NPVU5UKEtPUklOQV9SQlNJWkUpIHwKKwkJCURNQV9ERVNDX0NPRCB8IERNQV9ERVNDX0lPRDsKKwkJbHAtPnJkX3JpbmdbKGxwLT5yeF9uZXh0X2RvbmUgLSAxKSAmCisJCQlLT1JJTkFfUkRTX01BU0tdLmNvbnRyb2wgJj0KKwkJCX5ETUFfREVTQ19DT0Q7CisKKwkJbHAtPnJ4X25leHRfZG9uZSA9IChscC0+cnhfbmV4dF9kb25lICsgMSkgJiBLT1JJTkFfUkRTX01BU0s7CisJCWRtYV9jYWNoZV93YmFjaygodTMyKXJkLCBzaXplb2YoKnJkKSk7CisJCXJkID0gJmxwLT5yZF9yaW5nW2xwLT5yeF9uZXh0X2RvbmVdOworCQl3cml0ZWwofkRNQV9TVEFUX0RPTkUsICZscC0+cnhfZG1hX3JlZ3MtPmRtYXMpOwogCX0KIAogCWRtYXMgPSByZWFkbCgmbHAtPnJ4X2RtYV9yZWdzLT5kbWFzKTsKQEAgLTYyMywxMiArNjIyLDEyIEBACiAJZG1hcyA9IHJlYWRsKCZscC0+dHhfZG1hX3JlZ3MtPmRtYXMpOwogCiAJaWYgKGRtYXMgJiAoRE1BX1NUQVRfRklOSSB8IERNQV9TVEFUX0VSUikpIHsKLQkJa29yaW5hX3R4KGRldik7Ci0KIAkJZG1hc20gPSByZWFkbCgmbHAtPnR4X2RtYV9yZWdzLT5kbWFzbSk7CiAJCXdyaXRlbChkbWFzbSB8IChETUFfU1RBVF9GSU5JIHwgRE1BX1NUQVRfRVJSKSwKIAkJCQkmbHAtPnR4X2RtYV9yZWdzLT5kbWFzbSk7CiAKKwkJa29yaW5hX3R4KGRldik7CisKIAkJaWYgKGxwLT50eF9jaGFpbl9zdGF0dXMgPT0gZGVzY19maWxsZWQgJiYKIAkJCShyZWFkbCgmKGxwLT50eF9kbWFfcmVncy0+ZG1hbmRwdHIpKSA9PSAwKSkgewogCQkJd3JpdGVsKENQSFlTQUREUigmbHAtPnRkX3JpbmdbbHAtPnR4X2NoYWluX2hlYWRdKSwKQEAgLTkwMSw2ICs5MDAsOCBAQAogCiAJa29yaW5hX2ZyZWVfcmluZyhkZXYpOwogCisJbmFwaV9kaXNhYmxlKCZscC0+bmFwaSk7CisKIAlyZXQgPSBrb3JpbmFfaW5pdChkZXYpOwogCWlmIChyZXQgPCAwKSB7CiAJCXByaW50ayhLRVJOX0VSUiBEUlZfTkFNRSAiJXM6IGNhbm5vdCByZXN0YXJ0IGRldmljZVxuIiwKQEAgLTk5OSwxNCArMTAwMCwxNCBAQAogCSAqIHRoYXQgaGFuZGxlcyB0aGUgRG9uZSBGaW5pc2hlZAogCSAqIE92ciBhbmQgVW5kIEV2ZW50cyAqLwogCXJldCA9IHJlcXVlc3RfaXJxKGxwLT5yeF9pcnEsICZrb3JpbmFfcnhfZG1hX2ludGVycnVwdCwKLQkJSVJRRl9TSEFSRUQgfCBJUlFGX0RJU0FCTEVELCAiS29yaW5hIGV0aGVybmV0IFJ4IiwgZGV2KTsKKwkJCUlSUUZfRElTQUJMRUQsICJLb3JpbmEgZXRoZXJuZXQgUngiLCBkZXYpOwogCWlmIChyZXQgPCAwKSB7CiAJCXByaW50ayhLRVJOX0VSUiBEUlZfTkFNRSAiJXM6IHVuYWJsZSB0byBnZXQgUnggRE1BIElSUSAlZFxuIiwKIAkJICAgIGRldi0+bmFtZSwgbHAtPnJ4X2lycSk7CiAJCWdvdG8gZXJyX3JlbGVhc2U7CiAJfQogCXJldCA9IHJlcXVlc3RfaXJxKGxwLT50eF9pcnEsICZrb3JpbmFfdHhfZG1hX2ludGVycnVwdCwKLQkJSVJRRl9TSEFSRUQgfCBJUlFGX0RJU0FCTEVELCAiS29yaW5hIGV0aGVybmV0IFR4IiwgZGV2KTsKKwkJCUlSUUZfRElTQUJMRUQsICJLb3JpbmEgZXRoZXJuZXQgVHgiLCBkZXYpOwogCWlmIChyZXQgPCAwKSB7CiAJCXByaW50ayhLRVJOX0VSUiBEUlZfTkFNRSAiJXM6IHVuYWJsZSB0byBnZXQgVHggRE1BIElSUSAlZFxuIiwKIAkJICAgIGRldi0+bmFtZSwgbHAtPnR4X2lycSk7CkBAIC0xMDE1LDcgKzEwMTYsNyBAQAogCiAJLyogSW5zdGFsbCBoYW5kbGVyIGZvciBvdmVycnVuIGVycm9yLiAqLwogCXJldCA9IHJlcXVlc3RfaXJxKGxwLT5vdnJfaXJxLCAma29yaW5hX292cl9pbnRlcnJ1cHQsCi0JCQlJUlFGX1NIQVJFRCB8IElSUUZfRElTQUJMRUQsICJFdGhlcm5ldCBPdmVyZmxvdyIsIGRldik7CisJCQlJUlFGX0RJU0FCTEVELCAiRXRoZXJuZXQgT3ZlcmZsb3ciLCBkZXYpOwogCWlmIChyZXQgPCAwKSB7CiAJCXByaW50ayhLRVJOX0VSUiBEUlZfTkFNRSIlczogdW5hYmxlIHRvIGdldCBPVlIgSVJRICVkXG4iLAogCQkgICAgZGV2LT5uYW1lLCBscC0+b3ZyX2lycSk7CkBAIC0xMDI0LDcgKzEwMjUsNyBAQAogCiAJLyogSW5zdGFsbCBoYW5kbGVyIGZvciB1bmRlcmZsb3cgZXJyb3IuICovCiAJcmV0ID0gcmVxdWVzdF9pcnEobHAtPnVuZF9pcnEsICZrb3JpbmFfdW5kX2ludGVycnVwdCwKLQkJCUlSUUZfU0hBUkVEIHwgSVJRRl9ESVNBQkxFRCwgIkV0aGVybmV0IFVuZGVyZmxvdyIsIGRldik7CisJCQlJUlFGX0RJU0FCTEVELCAiRXRoZXJuZXQgVW5kZXJmbG93IiwgZGV2KTsKIAlpZiAocmV0IDwgMCkgewogCQlwcmludGsoS0VSTl9FUlIgRFJWX05BTUUgIiVzOiB1bmFibGUgdG8gZ2V0IFVORCBJUlEgJWRcbiIsCiAJCSAgICBkZXYtPm5hbWUsIGxwLT51bmRfaXJxKTsKQEAgLTEwNjcsNiArMTA2OCw4IEBACiAKIAlrb3JpbmFfZnJlZV9yaW5nKGRldik7CiAKKwluYXBpX2Rpc2FibGUoJmxwLT5uYXBpKTsKKwogCWZyZWVfaXJxKGxwLT5yeF9pcnEsIGRldik7CiAJZnJlZV9pcnEobHAtPnR4X2lycSwgZGV2KTsKIAlmcmVlX2lycShscC0+b3ZyX2lycSwgZGV2KTsKQEAgLTEwODksNyArMTA5Miw2IEBACiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAlTRVRfTkVUREVWX0RFVihkZXYsICZwZGV2LT5kZXYpOwotCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGRldik7CiAJbHAgPSBuZXRkZXZfcHJpdihkZXYpOwogCiAJYmlmLT5kZXYgPSBkZXY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9tYWM4MzkwLmMgYi9kcml2ZXJzL25ldC9tYWM4MzkwLmMKaW5kZXggNTc3MTZlMi4uOGU4ODQ4NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvbWFjODM5MC5jCisrKyBiL2RyaXZlcnMvbmV0L21hYzgzOTAuYwpAQCAtNDg2LDYgKzQ4Niw3IEBACiAJLm5kb19nZXRfc3RhdHMJCT0gZWlfZ2V0X3N0YXRzLAogCS5uZG9fc2V0X211bHRpY2FzdF9saXN0ID0gZWlfc2V0X211bHRpY2FzdF9saXN0LAogCS5uZG9fdmFsaWRhdGVfYWRkcgk9IGV0aF92YWxpZGF0ZV9hZGRyLAorCS5uZG9fc2V0X21hY19hZGRyZXNzIAk9IGV0aF9tYWNfYWRkciwKIAkubmRvX2NoYW5nZV9tdHUJCT0gZXRoX2NoYW5nZV9tdHUsCiAjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKIAkubmRvX3BvbGxfY29udHJvbGxlcgk9IGVpX3BvbGwsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9tbHg0L2VuX25ldGRldi5jIGIvZHJpdmVycy9uZXQvbWx4NC9lbl9uZXRkZXYuYwppbmRleCAxNWJiMzhkLi45ZjY2NDRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9tbHg0L2VuX25ldGRldi5jCisrKyBiL2RyaXZlcnMvbmV0L21seDQvZW5fbmV0ZGV2LmMKQEAgLTk1Miw2ICs5NTIsNyBAQAogCS5uZG9fZ2V0X3N0YXRzCQk9IG1seDRfZW5fZ2V0X3N0YXRzLAogCS5uZG9fc2V0X211bHRpY2FzdF9saXN0CT0gbWx4NF9lbl9zZXRfbXVsdGljYXN0LAogCS5uZG9fc2V0X21hY19hZGRyZXNzCT0gbWx4NF9lbl9zZXRfbWFjLAorCS5uZG9fdmFsaWRhdGVfYWRkcgk9IGV0aF92YWxpZGF0ZV9hZGRyLAogCS5uZG9fY2hhbmdlX210dQkJPSBtbHg0X2VuX2NoYW5nZV9tdHUsCiAJLm5kb190eF90aW1lb3V0CQk9IG1seDRfZW5fdHhfdGltZW91dCwKIAkubmRvX3ZsYW5fcnhfcmVnaXN0ZXIJPSBtbHg0X2VuX3ZsYW5fcnhfcmVnaXN0ZXIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9tbHg0L2VuX3BhcmFtcy5jIGIvZHJpdmVycy9uZXQvbWx4NC9lbl9wYXJhbXMuYwppbmRleCBjZmVlZjBmLi5jMWJkMDQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9tbHg0L2VuX3BhcmFtcy5jCisrKyBiL2RyaXZlcnMvbmV0L21seDQvZW5fcGFyYW1zLmMKQEAgLTM5OSw4ICszOTksMTAgQEAKIAogCXJ4X3NpemUgPSByb3VuZHVwX3Bvd19vZl90d28ocGFyYW0tPnJ4X3BlbmRpbmcpOwogCXJ4X3NpemUgPSBtYXhfdCh1MzIsIHJ4X3NpemUsIE1MWDRfRU5fTUlOX1JYX1NJWkUpOworCXJ4X3NpemUgPSBtaW5fdCh1MzIsIHJ4X3NpemUsIE1MWDRfRU5fTUFYX1JYX1NJWkUpOwogCXR4X3NpemUgPSByb3VuZHVwX3Bvd19vZl90d28ocGFyYW0tPnR4X3BlbmRpbmcpOwogCXR4X3NpemUgPSBtYXhfdCh1MzIsIHR4X3NpemUsIE1MWDRfRU5fTUlOX1RYX1NJWkUpOworCXR4X3NpemUgPSBtaW5fdCh1MzIsIHR4X3NpemUsIE1MWDRfRU5fTUFYX1RYX1NJWkUpOwogCiAJaWYgKHJ4X3NpemUgPT0gcHJpdi0+cHJvZi0+cnhfcmluZ19zaXplICYmCiAJICAgIHR4X3NpemUgPT0gcHJpdi0+cHJvZi0+dHhfcmluZ19zaXplKQpAQCAtNDQwLDggKzQ0Miw4IEBACiAJc3RydWN0IG1seDRfZW5fZGV2ICptZGV2ID0gcHJpdi0+bWRldjsKIAogCW1lbXNldChwYXJhbSwgMCwgc2l6ZW9mKCpwYXJhbSkpOwotCXBhcmFtLT5yeF9tYXhfcGVuZGluZyA9IG1kZXYtPmRldi0+Y2Fwcy5tYXhfcnFfc2c7Ci0JcGFyYW0tPnR4X21heF9wZW5kaW5nID0gbWRldi0+ZGV2LT5jYXBzLm1heF9zcV9zZzsKKwlwYXJhbS0+cnhfbWF4X3BlbmRpbmcgPSBNTFg0X0VOX01BWF9SWF9TSVpFOworCXBhcmFtLT50eF9tYXhfcGVuZGluZyA9IE1MWDRfRU5fTUFYX1RYX1NJWkU7CiAJcGFyYW0tPnJ4X3BlbmRpbmcgPSBtZGV2LT5wcm9maWxlLnByb2ZbcHJpdi0+cG9ydF0ucnhfcmluZ19zaXplOwogCXBhcmFtLT50eF9wZW5kaW5nID0gbWRldi0+cHJvZmlsZS5wcm9mW3ByaXYtPnBvcnRdLnR4X3Jpbmdfc2l6ZTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L21seDQvZW5fdHguYyBiL2RyaXZlcnMvbmV0L21seDQvZW5fdHguYwppbmRleCBmZjRkNzUyLi40YWZkNTk5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9tbHg0L2VuX3R4LmMKKysrIGIvZHJpdmVycy9uZXQvbWx4NC9lbl90eC5jCkBAIC0yMDMsMTkgKzIwMywyMSBAQAogCiAJLyogT3B0aW1pemUgdGhlIGNvbW1vbiBjYXNlIHdoZW4gdGhlcmUgYXJlIG5vIHdyYXBhcm91bmRzICovCiAJaWYgKGxpa2VseSgodm9pZCAqKSB0eF9kZXNjICsgdHhfaW5mby0+bnJfdHhiYiAqIFRYQkJfU0laRSA8PSBlbmQpKSB7Ci0JCWlmICh0eF9pbmZvLT5saW5lYXIpIHsKLQkJCXBjaV91bm1hcF9zaW5nbGUobWRldi0+cGRldiwKLQkJCQkJIChkbWFfYWRkcl90KSBiZTY0X3RvX2NwdShkYXRhLT5hZGRyKSwKKwkJaWYgKCF0eF9pbmZvLT5pbmwpIHsKKwkJCWlmICh0eF9pbmZvLT5saW5lYXIpIHsKKwkJCQlwY2lfdW5tYXBfc2luZ2xlKG1kZXYtPnBkZXYsCisJCQkJCShkbWFfYWRkcl90KSBiZTY0X3RvX2NwdShkYXRhLT5hZGRyKSwKIAkJCQkJIGJlMzJfdG9fY3B1KGRhdGEtPmJ5dGVfY291bnQpLAogCQkJCQkgUENJX0RNQV9UT0RFVklDRSk7Ci0JCQkrK2RhdGE7Ci0JCX0KKwkJCQkrK2RhdGE7CisJCQl9CiAKLQkJZm9yIChpID0gMDsgaSA8IGZyYWdzOyBpKyspIHsKLQkJCWZyYWcgPSAmc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tpXTsKLQkJCXBjaV91bm1hcF9wYWdlKG1kZXYtPnBkZXYsCi0JCQkJICAgICAgIChkbWFfYWRkcl90KSBiZTY0X3RvX2NwdShkYXRhW2ldLmFkZHIpLAotCQkJCSAgICAgICBmcmFnLT5zaXplLCBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJCWZvciAoaSA9IDA7IGkgPCBmcmFnczsgaSsrKSB7CisJCQkJZnJhZyA9ICZza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2ldOworCQkJCXBjaV91bm1hcF9wYWdlKG1kZXYtPnBkZXYsCisJCQkJCShkbWFfYWRkcl90KSBiZTY0X3RvX2NwdShkYXRhW2ldLmFkZHIpLAorCQkJCQlmcmFnLT5zaXplLCBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJCX0KIAkJfQogCQkvKiBTdGFtcCB0aGUgZnJlZWQgZGVzY3JpcHRvciAqLwogCQlmb3IgKGkgPSAwOyBpIDwgdHhfaW5mby0+bnJfdHhiYiAqIFRYQkJfU0laRTsgaSArPSBTVEFNUF9TVFJJREUpIHsKQEAgLTIyNCwyNyArMjI2LDI5IEBACiAJCX0KIAogCX0gZWxzZSB7Ci0JCWlmICgodm9pZCAqKSBkYXRhID49IGVuZCkgewotCQkJZGF0YSA9IChzdHJ1Y3QgbWx4NF93cWVfZGF0YV9zZWcgKikKLQkJCQkJKHJpbmctPmJ1ZiArICgodm9pZCAqKSBkYXRhIC0gZW5kKSk7Ci0JCX0KKwkJaWYgKCF0eF9pbmZvLT5pbmwpIHsKKwkJCWlmICgodm9pZCAqKSBkYXRhID49IGVuZCkgeworCQkJCWRhdGEgPSAoc3RydWN0IG1seDRfd3FlX2RhdGFfc2VnICopCisJCQkJCQkocmluZy0+YnVmICsgKCh2b2lkICopIGRhdGEgLSBlbmQpKTsKKwkJCX0KIAotCQlpZiAodHhfaW5mby0+bGluZWFyKSB7Ci0JCQlwY2lfdW5tYXBfc2luZ2xlKG1kZXYtPnBkZXYsCi0JCQkJCSAoZG1hX2FkZHJfdCkgYmU2NF90b19jcHUoZGF0YS0+YWRkciksCisJCQlpZiAodHhfaW5mby0+bGluZWFyKSB7CisJCQkJcGNpX3VubWFwX3NpbmdsZShtZGV2LT5wZGV2LAorCQkJCQkoZG1hX2FkZHJfdCkgYmU2NF90b19jcHUoZGF0YS0+YWRkciksCiAJCQkJCSBiZTMyX3RvX2NwdShkYXRhLT5ieXRlX2NvdW50KSwKIAkJCQkJIFBDSV9ETUFfVE9ERVZJQ0UpOwotCQkJKytkYXRhOwotCQl9CisJCQkJKytkYXRhOworCQkJfQogCi0JCWZvciAoaSA9IDA7IGkgPCBmcmFnczsgaSsrKSB7Ci0JCQkvKiBDaGVjayBmb3Igd3JhcGFyb3VuZCBiZWZvcmUgdW5tYXBwaW5nICovCi0JCQlpZiAoKHZvaWQgKikgZGF0YSA+PSBlbmQpCi0JCQkJZGF0YSA9IChzdHJ1Y3QgbWx4NF93cWVfZGF0YV9zZWcgKikgcmluZy0+YnVmOwotCQkJZnJhZyA9ICZza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2ldOwotCQkJcGNpX3VubWFwX3BhZ2UobWRldi0+cGRldiwKKwkJCWZvciAoaSA9IDA7IGkgPCBmcmFnczsgaSsrKSB7CisJCQkJLyogQ2hlY2sgZm9yIHdyYXBhcm91bmQgYmVmb3JlIHVubWFwcGluZyAqLworCQkJCWlmICgodm9pZCAqKSBkYXRhID49IGVuZCkKKwkJCQkJZGF0YSA9IChzdHJ1Y3QgbWx4NF93cWVfZGF0YV9zZWcgKikgcmluZy0+YnVmOworCQkJCWZyYWcgPSAmc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tpXTsKKwkJCQlwY2lfdW5tYXBfcGFnZShtZGV2LT5wZGV2LAogCQkJCQkoZG1hX2FkZHJfdCkgYmU2NF90b19jcHUoZGF0YS0+YWRkciksCiAJCQkJCSBmcmFnLT5zaXplLCBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJCX0KIAkJfQogCQkvKiBTdGFtcCB0aGUgZnJlZWQgZGVzY3JpcHRvciAqLwogCQlmb3IgKGkgPSAwOyBpIDwgdHhfaW5mby0+bnJfdHhiYiAqIFRYQkJfU0laRTsgaSArPSBTVEFNUF9TVFJJREUpIHsKQEAgLTc5MCw4ICs3OTQsMTEgQEAKIAkJCXdtYigpOwogCQkJZGF0YS0+Ynl0ZV9jb3VudCA9IGNwdV90b19iZTMyKHNrYl9oZWFkbGVuKHNrYikgLSBsc29faGVhZGVyX3NpemUpOwogCQl9Ci0JfSBlbHNlCisJCXR4X2luZm8tPmlubCA9IDA7CisJfSBlbHNlIHsKIAkJYnVpbGRfaW5saW5lX3dxZSh0eF9kZXNjLCBza2IsIHJlYWxfc2l6ZSwgJnZsYW5fdGFnLCB0eF9pbmQsIGZyYWdwdHIpOworCQl0eF9pbmZvLT5pbmwgPSAxOworCX0KIAogCXJpbmctPnByb2QgKz0gbnJfdHhiYjsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbWx4NC9tYWluLmMgYi9kcml2ZXJzL25ldC9tbHg0L21haW4uYwppbmRleCA3MTBjNzllLi42ZWYyNDkwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9tbHg0L21haW4uYworKysgYi9kcml2ZXJzL25ldC9tbHg0L21haW4uYwpAQCAtOTEyLDggKzkxMiw4IEBACiAJaW50IGk7CiAKIAlpZiAobXNpX3gpIHsKLQkJbnJlcSA9IG1pbihkZXYtPmNhcHMubnVtX2VxcyAtIGRldi0+Y2Fwcy5yZXNlcnZlZF9lcXMsCi0JCQkgICBudW1fcG9zc2libGVfY3B1cygpICsgMSk7CisJCW5yZXEgPSBtaW5fdChpbnQsIGRldi0+Y2Fwcy5udW1fZXFzIC0gZGV2LT5jYXBzLnJlc2VydmVkX2VxcywKKwkJCSAgICAgbnVtX3Bvc3NpYmxlX2NwdXMoKSArIDEpOwogCQllbnRyaWVzID0ga2NhbGxvYyhucmVxLCBzaXplb2YgKmVudHJpZXMsIEdGUF9LRVJORUwpOwogCQlpZiAoIWVudHJpZXMpCiAJCQlnb3RvIG5vX21zaTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L21seDQvbWx4NF9lbi5oIGIvZHJpdmVycy9uZXQvbWx4NC9tbHg0X2VuLmgKaW5kZXggMmU5NmM3Yi4uZTlhZjMyZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvbWx4NC9tbHg0X2VuLmgKKysrIGIvZHJpdmVycy9uZXQvbWx4NC9tbHg0X2VuLmgKQEAgLTExNSw2ICsxMTUsMTAgQEAKIH07CiAjZGVmaW5lIE1MWDRfRU5fTUFYX1JYX0ZSQUdTCTQKIAorLyogTWF4aW11bSByaW5nIHNpemVzICovCisjZGVmaW5lIE1MWDRfRU5fTUFYX1RYX1NJWkUJODE5MgorI2RlZmluZSBNTFg0X0VOX01BWF9SWF9TSVpFCTgxOTIKKwogLyogTWluaW11bSByaW5nIHNpemUgZm9yIG91ciBwYWdlLWFsbG9jYXRpb24gc2NlbWUgdG8gd29yayAqLwogI2RlZmluZSBNTFg0X0VOX01JTl9SWF9TSVpFCShNTFg0X0VOX0FMTE9DX1NJWkUgLyBTTVBfQ0FDSEVfQllURVMpCiAjZGVmaW5lIE1MWDRfRU5fTUlOX1RYX1NJWkUJKDQwOTYgLyBUWEJCX1NJWkUpCkBAIC0yMDIsNiArMjA2LDcgQEAKIAl1MzIgbnJfdHhiYjsKIAl1OCBsaW5lYXI7CiAJdTggZGF0YV9vZmZzZXQ7CisJdTggaW5sOwogfTsKIAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9tbHg0L3Byb2ZpbGUuYyBiL2RyaXZlcnMvbmV0L21seDQvcHJvZmlsZS5jCmluZGV4IDkxOWZiOWUuLmNlYmRmMzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L21seDQvcHJvZmlsZS5jCisrKyBiL2RyaXZlcnMvbmV0L21seDQvcHJvZmlsZS5jCkBAIC0xMDcsOSArMTA3LDkgQEAKIAlwcm9maWxlW01MWDRfUkVTX0FVWENdLm51bSAgICA9IHJlcXVlc3QtPm51bV9xcDsKIAlwcm9maWxlW01MWDRfUkVTX1NSUV0ubnVtICAgICA9IHJlcXVlc3QtPm51bV9zcnE7CiAJcHJvZmlsZVtNTFg0X1JFU19DUV0ubnVtICAgICAgPSByZXF1ZXN0LT5udW1fY3E7Ci0JcHJvZmlsZVtNTFg0X1JFU19FUV0ubnVtICAgICAgPSBtaW4oZGV2X2NhcC0+bWF4X2VxcywKLQkJCQkJICAgIGRldl9jYXAtPnJlc2VydmVkX2VxcyArCi0JCQkJCSAgICBudW1fcG9zc2libGVfY3B1cygpICsgMSk7CisJcHJvZmlsZVtNTFg0X1JFU19FUV0ubnVtICAgICAgPSBtaW5fdCh1bnNpZ25lZCwgZGV2X2NhcC0+bWF4X2VxcywKKwkJCQkJICAgICAgZGV2X2NhcC0+cmVzZXJ2ZWRfZXFzICsKKwkJCQkJICAgICAgbnVtX3Bvc3NpYmxlX2NwdXMoKSArIDEpOwogCXByb2ZpbGVbTUxYNF9SRVNfRE1QVF0ubnVtICAgID0gcmVxdWVzdC0+bnVtX21wdDsKIAlwcm9maWxlW01MWDRfUkVTX0NNUFRdLm51bSAgICA9IE1MWDRfTlVNX0NNUFRTOwogCXByb2ZpbGVbTUxYNF9SRVNfTVRUXS5udW0gICAgID0gcmVxdWVzdC0+bnVtX210dDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L25hdHNlbWkuYyBiL2RyaXZlcnMvbmV0L25hdHNlbWkuYwppbmRleCA0NzhlZGI5Li5jNWRlYzU0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9uYXRzZW1pLmMKKysrIGIvZHJpdmVycy9uZXQvbmF0c2VtaS5jCkBAIC03NzksNiArNzc5LDIyIEBACiAKIH0KIAorc3RhdGljIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyBuYXRzZW1pX25ldGRldl9vcHMgPSB7CisJLm5kb19vcGVuCQk9IG5ldGRldl9vcGVuLAorCS5uZG9fc3RvcAkJPSBuZXRkZXZfY2xvc2UsCisJLm5kb19zdGFydF94bWl0CQk9IHN0YXJ0X3R4LAorCS5uZG9fZ2V0X3N0YXRzCQk9IGdldF9zdGF0cywKKwkubmRvX3NldF9tdWx0aWNhc3RfbGlzdCA9IHNldF9yeF9tb2RlLAorCS5uZG9fY2hhbmdlX210dQkJPSBuYXRzZW1pX2NoYW5nZV9tdHUsCisJLm5kb19kb19pb2N0bAkJPSBuZXRkZXZfaW9jdGwsCisJLm5kb190eF90aW1lb3V0IAk9IG5zX3R4X3RpbWVvdXQsCisJLm5kb19zZXRfbWFjX2FkZHJlc3MgCT0gZXRoX21hY19hZGRyLAorCS5uZG9fdmFsaWRhdGVfYWRkcgk9IGV0aF92YWxpZGF0ZV9hZGRyLAorI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCisJLm5kb19wb2xsX2NvbnRyb2xsZXIJPSBuYXRzZW1pX3BvbGxfY29udHJvbGxlciwKKyNlbmRpZgorfTsKKwogc3RhdGljIGludCBfX2RldmluaXQgbmF0c2VtaV9wcm9iZTEgKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAogCWNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCiB7CkBAIC05MTEsMjAgKzkyNyw5IEBACiAJaWYgKGZpbmRfY250IDwgTUFYX1VOSVRTICAmJiAgZnVsbF9kdXBsZXhbZmluZF9jbnRdKQogCQlucC0+ZnVsbF9kdXBsZXggPSAxOwogCi0JLyogVGhlIGNoaXAtc3BlY2lmaWMgZW50cmllcyBpbiB0aGUgZGV2aWNlIHN0cnVjdHVyZS4gKi8KLQlkZXYtPm9wZW4gPSAmbmV0ZGV2X29wZW47Ci0JZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSAmc3RhcnRfdHg7Ci0JZGV2LT5zdG9wID0gJm5ldGRldl9jbG9zZTsKLQlkZXYtPmdldF9zdGF0cyA9ICZnZXRfc3RhdHM7Ci0JZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSAmc2V0X3J4X21vZGU7Ci0JZGV2LT5jaGFuZ2VfbXR1ID0gJm5hdHNlbWlfY2hhbmdlX210dTsKLQlkZXYtPmRvX2lvY3RsID0gJm5ldGRldl9pb2N0bDsKLQlkZXYtPnR4X3RpbWVvdXQgPSAmbnNfdHhfdGltZW91dDsKKwlkZXYtPm5ldGRldl9vcHMgPSAmbmF0c2VtaV9uZXRkZXZfb3BzOwogCWRldi0+d2F0Y2hkb2dfdGltZW8gPSBUWF9USU1FT1VUOwogCi0jaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKLQlkZXYtPnBvbGxfY29udHJvbGxlciA9ICZuYXRzZW1pX3BvbGxfY29udHJvbGxlcjsKLSNlbmRpZgogCVNFVF9FVEhUT09MX09QUyhkZXYsICZldGh0b29sX29wcyk7CiAKIAlpZiAobXR1KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbmUtaDgzMDAuYyBiL2RyaXZlcnMvbmV0L25lLWg4MzAwLmMKaW5kZXggYjU3MjM5MS4uN2JkNjY2MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvbmUtaDgzMDAuYworKysgYi9kcml2ZXJzL25ldC9uZS1oODMwMC5jCkBAIC0yMDIsNiArMjAyLDcgQEAKIAkubmRvX2dldF9zdGF0cwkJPSBlaV9nZXRfc3RhdHMsCiAJLm5kb19zZXRfbXVsdGljYXN0X2xpc3QgPSBlaV9zZXRfbXVsdGljYXN0X2xpc3QsCiAJLm5kb192YWxpZGF0ZV9hZGRyCT0gZXRoX3ZhbGlkYXRlX2FkZHIsCisJLm5kb19zZXRfbWFjX2FkZHJlc3MgCT0gZXRoX21hY19hZGRyLAogCS5uZG9fY2hhbmdlX210dQkJPSBldGhfY2hhbmdlX210dSwKICNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgogCS5uZG9fcG9sbF9jb250cm9sbGVyCT0gZWlfcG9sbCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L25lMmstcGNpLmMgYi9kcml2ZXJzL25ldC9uZTJrLXBjaS5jCmluZGV4IDYyZjIwYmEuLmYwOTBkM2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L25lMmstcGNpLmMKKysrIGIvZHJpdmVycy9uZXQvbmUyay1wY2kuYwpAQCAtMjA4LDYgKzIwOCw3IEBACiAJLm5kb19nZXRfc3RhdHMJCT0gZWlfZ2V0X3N0YXRzLAogCS5uZG9fc2V0X211bHRpY2FzdF9saXN0ID0gZWlfc2V0X211bHRpY2FzdF9saXN0LAogCS5uZG9fdmFsaWRhdGVfYWRkcgk9IGV0aF92YWxpZGF0ZV9hZGRyLAorCS5uZG9fc2V0X21hY19hZGRyZXNzIAk9IGV0aF9tYWNfYWRkciwKIAkubmRvX2NoYW5nZV9tdHUJCT0gZXRoX2NoYW5nZV9tdHUsCiAjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKIAkubmRvX3BvbGxfY29udHJvbGxlciA9IGVpX3BvbGwsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9uZXR4ZW4vbmV0eGVuX25pYy5oIGIvZHJpdmVycy9uZXQvbmV0eGVuL25ldHhlbl9uaWMuaAppbmRleCBmOGU2MDFjLi5jMTFjNTY4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9uZXR4ZW4vbmV0eGVuX25pYy5oCisrKyBiL2RyaXZlcnMvbmV0L25ldHhlbi9uZXR4ZW5fbmljLmgKQEAgLTMwOCwyNyArMzA4LDE2IEBACiAjZGVmaW5lIG5ldHhlbl9zZXRfY21kX2Rlc2NfY3R4aWQoY21kX2Rlc2MsIHZhcikJXAogCSgoY21kX2Rlc2MpLT5wb3J0X2N0eGlkIHw9ICgodmFyKSA8PCA0ICYgMHhGMCkpCiAKLSNkZWZpbmUgbmV0eGVuX3NldF9jbWRfZGVzY19mbGFncyhjbWRfZGVzYywgdmFsKQlcCi0JKGNtZF9kZXNjKS0+ZmxhZ3Nfb3Bjb2RlID0gKChjbWRfZGVzYyktPmZsYWdzX29wY29kZSAmIFwKLQkJfmNwdV90b19sZTE2KDB4N2YpKSB8IGNwdV90b19sZTE2KCh2YWwpICYgMHg3ZikKLSNkZWZpbmUgbmV0eGVuX3NldF9jbWRfZGVzY19vcGNvZGUoY21kX2Rlc2MsIHZhbCkJXAotCShjbWRfZGVzYyktPmZsYWdzX29wY29kZSA9ICgoY21kX2Rlc2MpLT5mbGFnc19vcGNvZGUgJiBcCi0JCX5jcHVfdG9fbGUxNigodTE2KTB4M2YgPDwgNykpIHwgY3B1X3RvX2xlMTYoKCh2YWwpICYgMHgzZikgPDwgNykKKyNkZWZpbmUgbmV0eGVuX3NldF90eF9wb3J0KF9kZXNjLCBfcG9ydCkgXAorCShfZGVzYyktPnBvcnRfY3R4aWQgPSAoKF9wb3J0KSAmIDB4ZikgfCAoKChfcG9ydCkgPDwgNCkgJiAweGYwKQogCi0jZGVmaW5lIG5ldHhlbl9zZXRfY21kX2Rlc2NfbnVtX29mX2J1ZmYoY21kX2Rlc2MsIHZhbCkJXAotCShjbWRfZGVzYyktPm51bV9vZl9idWZmZXJzX3RvdGFsX2xlbmd0aCA9IFwKLQkJKChjbWRfZGVzYyktPm51bV9vZl9idWZmZXJzX3RvdGFsX2xlbmd0aCAmIFwKLQkJfmNwdV90b19sZTMyKDB4ZmYpKSB8IGNwdV90b19sZTMyKCh2YWwpICYgMHhmZikKLSNkZWZpbmUgbmV0eGVuX3NldF9jbWRfZGVzY190b3RhbGxlbmd0aChjbWRfZGVzYywgdmFsKQlcCi0JKGNtZF9kZXNjKS0+bnVtX29mX2J1ZmZlcnNfdG90YWxfbGVuZ3RoID0gXAotCQkoKGNtZF9kZXNjKS0+bnVtX29mX2J1ZmZlcnNfdG90YWxfbGVuZ3RoICYgXAotCQl+Y3B1X3RvX2xlMzIoKHUzMikweGZmZmZmZiA8PCA4KSkgfCBcCi0JCWNwdV90b19sZTMyKCgodmFsKSAmIDB4ZmZmZmZmKSA8PCA4KQorI2RlZmluZSBuZXR4ZW5fc2V0X3R4X2ZsYWdzX29wY29kZShfZGVzYywgX2ZsYWdzLCBfb3Bjb2RlKSBcCisJKF9kZXNjKS0+ZmxhZ3Nfb3Bjb2RlID0gXAorCWNwdV90b19sZTE2KCgoX2ZsYWdzKSAmIDB4N2YpIHwgKCgoX29wY29kZSkgJiAweDNmKSA8PCA3KSkKIAotI2RlZmluZSBuZXR4ZW5fZ2V0X2NtZF9kZXNjX29wY29kZShjbWRfZGVzYykJXAotCSgobGUxNl90b19jcHUoKGNtZF9kZXNjKS0+ZmxhZ3Nfb3Bjb2RlKSA+PiA3KSAmIDB4MDAzZikKLSNkZWZpbmUgbmV0eGVuX2dldF9jbWRfZGVzY190b3RhbGxlbmd0aChjbWRfZGVzYykJXAotCSgobGUzMl90b19jcHUoKGNtZF9kZXNjKS0+bnVtX29mX2J1ZmZlcnNfdG90YWxfbGVuZ3RoKSA+PiA4KSAmIDB4ZmZmZmZmKQorI2RlZmluZSBuZXR4ZW5fc2V0X3R4X2ZyYWdzX2xlbihfZGVzYywgX2ZyYWdzLCBfbGVuKSBcCisJKF9kZXNjKS0+bnVtX29mX2J1ZmZlcnNfdG90YWxfbGVuZ3RoID0gXAorCWNwdV90b19sZTMyKCgoX2ZyYWdzKSAmIDB4ZmYpIHwgKCgoX2xlbikgJiAweGZmZmZmZikgPDwgOCkpCiAKIHN0cnVjdCBjbWRfZGVzY190eXBlMCB7CiAJdTggdGNwX2hkcl9vZmZzZXQ7CS8qIEZvciBMU08gb25seSAqLwpAQCAtNTEwLDcgKzQ5OSw4IEBACiAJTkVUWEVOX0JSRFRZUEVfUDNfMTBHX1NGUF9DVCA9IDB4MDAyYSwKIAlORVRYRU5fQlJEVFlQRV9QM18xMEdfU0ZQX1FUID0gMHgwMDJiLAogCU5FVFhFTl9CUkRUWVBFX1AzXzEwR19DWDQgPSAweDAwMzEsCi0JTkVUWEVOX0JSRFRZUEVfUDNfMTBHX1hGUCA9IDB4MDAzMgorCU5FVFhFTl9CUkRUWVBFX1AzXzEwR19YRlAgPSAweDAwMzIsCisJTkVUWEVOX0JSRFRZUEVfUDNfMTBHX1RQID0gMHgwMDgwCiAKIH0gbmV0eGVuX2JyZHR5cGVfdDsKIApAQCAtNzU3LDcgKzc0Nyw3IEBACiAgKi8KIHN0cnVjdCBuZXR4ZW5fc2tiX2ZyYWcgewogCXU2NCBkbWE7Ci0JdTMyIGxlbmd0aDsKKwl1bG9uZyBsZW5ndGg7CiB9OwogCiAjZGVmaW5lIF9uZXR4ZW5fc2V0X2JpdHMoY29uZmlnX3dvcmQsIHN0YXJ0LCBiaXRzLCB2YWwpCXtcCkBAIC03ODMsMTMgKzc3Myw3IEBACiBzdHJ1Y3QgbmV0eGVuX2NtZF9idWZmZXIgewogCXN0cnVjdCBza19idWZmICpza2I7CiAJc3RydWN0IG5ldHhlbl9za2JfZnJhZyBmcmFnX2FycmF5W01BWF9CVUZGRVJTX1BFUl9DTUQgKyAxXTsKLQl1MzIgdG90YWxfbGVuZ3RoOwotCXUzMiBtc3M7Ci0JdTE2IHBvcnQ7Ci0JdTggY21kOwotCXU4IGZyYWdfY291bnQ7Ci0JdW5zaWduZWQgbG9uZyB0aW1lX3N0YW1wOwotCXUzMiBzdGF0ZTsKKwl1MzIgZnJhZ19jb3VudDsKIH07CiAKIC8qIEluIHJ4X2J1ZmZlciwgd2UgZG8gbm90IG5lZWQgbXVsdGlwbGUgZnJhZ21lbnRzIGFzIGlzIGEgc2luZ2xlIGJ1ZmZlciAqLwpAQCAtODc2LDcgKzg2MCw2IEBACiAJdTMyIHNrYl9zaXplOwogCXN0cnVjdCBuZXR4ZW5fcnhfYnVmZmVyICpyeF9idWZfYXJyOwkvKiByeCBidWZmZXJzIGZvciByZWNlaXZlICAgKi8KIAlzdHJ1Y3QgbGlzdF9oZWFkIGZyZWVfbGlzdDsKLQlpbnQgYmVnaW5fYWxsb2M7CiB9OwogCiAvKgpAQCAtOTk1LDMxICs5NzgsMzEgQEAKICAqLwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JdTY0IGhvc3RfcGh5c19hZGRyOwkvKiBSaW5nIGJhc2UgYWRkciAqLwotCXUzMiByaW5nX3NpemU7CQkvKiBSaW5nIGVudHJpZXMgKi8KLQl1MTYgbXNpX2luZGV4OwotCXUxNiByc3ZkOwkJLyogUGFkZGluZyAqLworCV9fbGU2NCBob3N0X3BoeXNfYWRkcjsJLyogUmluZyBiYXNlIGFkZHIgKi8KKwlfX2xlMzIgcmluZ19zaXplOwkJLyogUmluZyBlbnRyaWVzICovCisJX19sZTE2IG1zaV9pbmRleDsKKwlfX2xlMTYgcnN2ZDsJCS8qIFBhZGRpbmcgKi8KIH0gbnhfaG9zdHJxX3Nkc19yaW5nX3Q7CiAKIHR5cGVkZWYgc3RydWN0IHsKLQl1NjQgaG9zdF9waHlzX2FkZHI7CS8qIFJpbmcgYmFzZSBhZGRyICovCi0JdTY0IGJ1ZmZfc2l6ZTsJCS8qIFBhY2tldCBidWZmZXIgc2l6ZSAqLwotCXUzMiByaW5nX3NpemU7CQkvKiBSaW5nIGVudHJpZXMgKi8KLQl1MzIgcmluZ19raW5kOwkJLyogQ2xhc3Mgb2YgcmluZyAqLworCV9fbGU2NCBob3N0X3BoeXNfYWRkcjsJLyogUmluZyBiYXNlIGFkZHIgKi8KKwlfX2xlNjQgYnVmZl9zaXplOwkJLyogUGFja2V0IGJ1ZmZlciBzaXplICovCisJX19sZTMyIHJpbmdfc2l6ZTsJCS8qIFJpbmcgZW50cmllcyAqLworCV9fbGUzMiByaW5nX2tpbmQ7CQkvKiBDbGFzcyBvZiByaW5nICovCiB9IG54X2hvc3RycV9yZHNfcmluZ190OwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JdTY0IGhvc3RfcnNwX2RtYV9hZGRyOwkvKiBSZXNwb25zZSBkbWEnZCBoZXJlICovCi0JdTMyIGNhcGFiaWxpdGllc1s0XTsJLyogRmxhZyBiaXQgdmVjdG9yICovCi0JdTMyIGhvc3RfaW50X2NyYl9tb2RlOwkvKiBJbnRlcnJ1cHQgY3JiIHVzYWdlICovCi0JdTMyIGhvc3RfcmRzX2NyYl9tb2RlOwkvKiBSRFMgY3JiIHVzYWdlICovCisJX19sZTY0IGhvc3RfcnNwX2RtYV9hZGRyOwkvKiBSZXNwb25zZSBkbWEnZCBoZXJlICovCisJX19sZTMyIGNhcGFiaWxpdGllc1s0XTsJLyogRmxhZyBiaXQgdmVjdG9yICovCisJX19sZTMyIGhvc3RfaW50X2NyYl9tb2RlOwkvKiBJbnRlcnJ1cHQgY3JiIHVzYWdlICovCisJX19sZTMyIGhvc3RfcmRzX2NyYl9tb2RlOwkvKiBSRFMgY3JiIHVzYWdlICovCiAJLyogVGhlc2UgcmluZyBvZmZzZXRzIGFyZSByZWxhdGl2ZSB0byBkYXRhWzBdIGJlbG93ICovCi0JdTMyIHJkc19yaW5nX29mZnNldDsJLyogT2Zmc2V0IHRvIFJEUyBjb25maWcgKi8KLQl1MzIgc2RzX3Jpbmdfb2Zmc2V0OwkvKiBPZmZzZXQgdG8gU0RTIGNvbmZpZyAqLwotCXUxNiBudW1fcmRzX3JpbmdzOwkvKiBDb3VudCBvZiBSRFMgcmluZ3MgKi8KLQl1MTYgbnVtX3Nkc19yaW5nczsJLyogQ291bnQgb2YgU0RTIHJpbmdzICovCi0JdTE2IHJzdmQxOwkJLyogUGFkZGluZyAqLwotCXUxNiByc3ZkMjsJCS8qIFBhZGRpbmcgKi8KKwlfX2xlMzIgcmRzX3Jpbmdfb2Zmc2V0OwkvKiBPZmZzZXQgdG8gUkRTIGNvbmZpZyAqLworCV9fbGUzMiBzZHNfcmluZ19vZmZzZXQ7CS8qIE9mZnNldCB0byBTRFMgY29uZmlnICovCisJX19sZTE2IG51bV9yZHNfcmluZ3M7CS8qIENvdW50IG9mIFJEUyByaW5ncyAqLworCV9fbGUxNiBudW1fc2RzX3JpbmdzOwkvKiBDb3VudCBvZiBTRFMgcmluZ3MgKi8KKwlfX2xlMTYgcnN2ZDE7CQkvKiBQYWRkaW5nICovCisJX19sZTE2IHJzdmQyOwkJLyogUGFkZGluZyAqLwogCXU4ICByZXNlcnZlZFsxMjhdOyAJLyogcmVzZXJ2ZSBzcGFjZSBmb3IgZnV0dXJlIGV4cGFuc2lvbiovCiAJLyogTVVTVCBCRSA2NC1iaXQgYWxpZ25lZC4KIAkgICBUaGUgZm9sbG93aW5nIGlzIHBhY2tlZDoKQEAgLTEwMjksMjQgKzEwMTIsMjQgQEAKIH0gbnhfaG9zdHJxX3J4X2N0eF90OwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JdTMyIGhvc3RfcHJvZHVjZXJfY3JiOwkvKiBDcmIgdG8gdXNlICovCi0JdTMyIHJzdmQxOwkJLyogUGFkZGluZyAqLworCV9fbGUzMiBob3N0X3Byb2R1Y2VyX2NyYjsJLyogQ3JiIHRvIHVzZSAqLworCV9fbGUzMiByc3ZkMTsJCS8qIFBhZGRpbmcgKi8KIH0gbnhfY2FyZHJzcF9yZHNfcmluZ190OwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JdTMyIGhvc3RfY29uc3VtZXJfY3JiOwkvKiBDcmIgdG8gdXNlICovCi0JdTMyIGludGVycnVwdF9jcmI7CS8qIENyYiB0byB1c2UgKi8KKwlfX2xlMzIgaG9zdF9jb25zdW1lcl9jcmI7CS8qIENyYiB0byB1c2UgKi8KKwlfX2xlMzIgaW50ZXJydXB0X2NyYjsJLyogQ3JiIHRvIHVzZSAqLwogfSBueF9jYXJkcnNwX3Nkc19yaW5nX3Q7CiAKIHR5cGVkZWYgc3RydWN0IHsKIAkvKiBUaGVzZSByaW5nIG9mZnNldHMgYXJlIHJlbGF0aXZlIHRvIGRhdGFbMF0gYmVsb3cgKi8KLQl1MzIgcmRzX3Jpbmdfb2Zmc2V0OwkvKiBPZmZzZXQgdG8gUkRTIGNvbmZpZyAqLwotCXUzMiBzZHNfcmluZ19vZmZzZXQ7CS8qIE9mZnNldCB0byBTRFMgY29uZmlnICovCi0JdTMyIGhvc3RfY3R4X3N0YXRlOwkvKiBTdGFydGluZyBTdGF0ZSAqLwotCXUzMiBudW1fZm5fcGVyX3BvcnQ7CS8qIEhvdyBtYW55IFBDSSBmbiBzaGFyZSB0aGUgcG9ydCAqLwotCXUxNiBudW1fcmRzX3JpbmdzOwkvKiBDb3VudCBvZiBSRFMgcmluZ3MgKi8KLQl1MTYgbnVtX3Nkc19yaW5nczsJLyogQ291bnQgb2YgU0RTIHJpbmdzICovCi0JdTE2IGNvbnRleHRfaWQ7CQkvKiBIYW5kbGUgZm9yIGNvbnRleHQgKi8KKwlfX2xlMzIgcmRzX3Jpbmdfb2Zmc2V0OwkvKiBPZmZzZXQgdG8gUkRTIGNvbmZpZyAqLworCV9fbGUzMiBzZHNfcmluZ19vZmZzZXQ7CS8qIE9mZnNldCB0byBTRFMgY29uZmlnICovCisJX19sZTMyIGhvc3RfY3R4X3N0YXRlOwkvKiBTdGFydGluZyBTdGF0ZSAqLworCV9fbGUzMiBudW1fZm5fcGVyX3BvcnQ7CS8qIEhvdyBtYW55IFBDSSBmbiBzaGFyZSB0aGUgcG9ydCAqLworCV9fbGUxNiBudW1fcmRzX3JpbmdzOwkvKiBDb3VudCBvZiBSRFMgcmluZ3MgKi8KKwlfX2xlMTYgbnVtX3Nkc19yaW5nczsJLyogQ291bnQgb2YgU0RTIHJpbmdzICovCisJX19sZTE2IGNvbnRleHRfaWQ7CQkvKiBIYW5kbGUgZm9yIGNvbnRleHQgKi8KIAl1OCAgcGh5c19wb3J0OwkJLyogUGh5c2ljYWwgaWQgb2YgcG9ydCAqLwogCXU4ICB2aXJ0X3BvcnQ7CQkvKiBWaXJ0dWFsL0xvZ2ljYWwgaWQgb2YgcG9ydCAqLwogCXU4ICByZXNlcnZlZFsxMjhdOwkvKiBzYXZlIHNwYWNlIGZvciBmdXR1cmUgZXhwYW5zaW9uICovCkBAIC0xMDcyLDM0ICsxMDU1LDM0IEBACiAgKi8KIAogdHlwZWRlZiBzdHJ1Y3QgewotCXU2NCBob3N0X3BoeXNfYWRkcjsJLyogUmluZyBiYXNlIGFkZHIgKi8KLQl1MzIgcmluZ19zaXplOwkJLyogUmluZyBlbnRyaWVzICovCi0JdTMyIHJzdmQ7CQkvKiBQYWRkaW5nICovCisJX19sZTY0IGhvc3RfcGh5c19hZGRyOwkvKiBSaW5nIGJhc2UgYWRkciAqLworCV9fbGUzMiByaW5nX3NpemU7CQkvKiBSaW5nIGVudHJpZXMgKi8KKwlfX2xlMzIgcnN2ZDsJCS8qIFBhZGRpbmcgKi8KIH0gbnhfaG9zdHJxX2Nkc19yaW5nX3Q7CiAKIHR5cGVkZWYgc3RydWN0IHsKLQl1NjQgaG9zdF9yc3BfZG1hX2FkZHI7CS8qIFJlc3BvbnNlIGRtYSdkIGhlcmUgKi8KLQl1NjQgY21kX2NvbnNfZG1hX2FkZHI7CS8qICAqLwotCXU2NCBkdW1teV9kbWFfYWRkcjsJLyogICovCi0JdTMyIGNhcGFiaWxpdGllc1s0XTsJLyogRmxhZyBiaXQgdmVjdG9yICovCi0JdTMyIGhvc3RfaW50X2NyYl9tb2RlOwkvKiBJbnRlcnJ1cHQgY3JiIHVzYWdlICovCi0JdTMyIHJzdmQxOwkJLyogUGFkZGluZyAqLwotCXUxNiByc3ZkMjsJCS8qIFBhZGRpbmcgKi8KLQl1MTYgaW50ZXJydXB0X2N0bDsKLQl1MTYgbXNpX2luZGV4OwotCXUxNiByc3ZkMzsJCS8qIFBhZGRpbmcgKi8KKwlfX2xlNjQgaG9zdF9yc3BfZG1hX2FkZHI7CS8qIFJlc3BvbnNlIGRtYSdkIGhlcmUgKi8KKwlfX2xlNjQgY21kX2NvbnNfZG1hX2FkZHI7CS8qICAqLworCV9fbGU2NCBkdW1teV9kbWFfYWRkcjsJLyogICovCisJX19sZTMyIGNhcGFiaWxpdGllc1s0XTsJLyogRmxhZyBiaXQgdmVjdG9yICovCisJX19sZTMyIGhvc3RfaW50X2NyYl9tb2RlOwkvKiBJbnRlcnJ1cHQgY3JiIHVzYWdlICovCisJX19sZTMyIHJzdmQxOwkJLyogUGFkZGluZyAqLworCV9fbGUxNiByc3ZkMjsJCS8qIFBhZGRpbmcgKi8KKwlfX2xlMTYgaW50ZXJydXB0X2N0bDsKKwlfX2xlMTYgbXNpX2luZGV4OworCV9fbGUxNiByc3ZkMzsJCS8qIFBhZGRpbmcgKi8KIAlueF9ob3N0cnFfY2RzX3JpbmdfdCBjZHNfcmluZzsJLyogRGVzYyBvZiBjZHMgcmluZyAqLwogCXU4ICByZXNlcnZlZFsxMjhdOwkvKiBmdXR1cmUgZXhwYW5zaW9uICovCiB9IG54X2hvc3RycV90eF9jdHhfdDsKIAogdHlwZWRlZiBzdHJ1Y3QgewotCXUzMiBob3N0X3Byb2R1Y2VyX2NyYjsJLyogQ3JiIHRvIHVzZSAqLwotCXUzMiBpbnRlcnJ1cHRfY3JiOwkvKiBDcmIgdG8gdXNlICovCisJX19sZTMyIGhvc3RfcHJvZHVjZXJfY3JiOwkvKiBDcmIgdG8gdXNlICovCisJX19sZTMyIGludGVycnVwdF9jcmI7CS8qIENyYiB0byB1c2UgKi8KIH0gbnhfY2FyZHJzcF9jZHNfcmluZ190OwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JdTMyIGhvc3RfY3R4X3N0YXRlOwkvKiBTdGFydGluZyBzdGF0ZSAqLwotCXUxNiBjb250ZXh0X2lkOwkJLyogSGFuZGxlIGZvciBjb250ZXh0ICovCisJX19sZTMyIGhvc3RfY3R4X3N0YXRlOwkvKiBTdGFydGluZyBzdGF0ZSAqLworCV9fbGUxNiBjb250ZXh0X2lkOwkJLyogSGFuZGxlIGZvciBjb250ZXh0ICovCiAJdTggIHBoeXNfcG9ydDsJCS8qIFBoeXNpY2FsIGlkIG9mIHBvcnQgKi8KIAl1OCAgdmlydF9wb3J0OwkJLyogVmlydHVhbC9Mb2dpY2FsIGlkIG9mIHBvcnQgKi8KIAlueF9jYXJkcnNwX2Nkc19yaW5nX3QgY2RzX3Jpbmc7CS8qIENhcmQgY2RzIHNldHRpbmdzICovCkBAIC0xMjAyLDkgKzExODUsOSBAQAogI2RlZmluZSBWUE9SVF9NSVNTX01PREVfQUNDRVBUX01VTFRJCTIgLyogYWNjZXB0IHVubWF0Y2hlZCBtdWx0aWNhc3QgKi8KIAogdHlwZWRlZiBzdHJ1Y3QgewotCXU2NCBxaGRyOwotCXU2NCByZXFfaGRyOwotCXU2NCB3b3Jkc1s2XTsKKwlfX2xlNjQgcWhkcjsKKwlfX2xlNjQgcmVxX2hkcjsKKwlfX2xlNjQgd29yZHNbNl07CiB9IG54X25pY19yZXFfdDsKIAogdHlwZWRlZiBzdHJ1Y3QgewpAQCAtMTQ4Niw4ICsxNDY5LDYgQEAKIAogdm9pZCBuZXR4ZW5faW5pdGlhbGl6ZV9hZGFwdGVyX29wcyhzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIpOwogaW50IG5ldHhlbl9pbml0X2Zpcm13YXJlKHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlcik7Ci12b2lkIG5ldHhlbl90c29fY2hlY2soc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyLAotCQkgICAgICBzdHJ1Y3QgY21kX2Rlc2NfdHlwZTAgKmRlc2MsIHN0cnVjdCBza19idWZmICpza2IpOwogdm9pZCBuZXR4ZW5fbmljX2NsZWFyX3N0YXRzKHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlcik7CiB2b2lkIG5ldHhlbl93YXRjaGRvZ190YXNrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CiB2b2lkIG5ldHhlbl9wb3N0X3J4X2J1ZmZlcnMoc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyLCB1MzIgY3R4LApAQCAtMTQ5Niw2ICsxNDc3LDcgQEAKIHUzMiBuZXR4ZW5fcHJvY2Vzc19yY3ZfcmluZyhzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBjdHgsIGludCBtYXgpOwogdm9pZCBuZXR4ZW5fcDJfbmljX3NldF9tdWx0aShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KTsKIHZvaWQgbmV0eGVuX3AzX25pY19zZXRfbXVsdGkoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldik7Cit2b2lkIG5ldHhlbl9wM19mcmVlX21hY19saXN0KHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlcik7CiBpbnQgbmV0eGVuX3AzX25pY19zZXRfcHJvbWlzYyhzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIsIHUzMik7CiBpbnQgbmV0eGVuX2NvbmZpZ19pbnRyX2NvYWxlc2NlKHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlcik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L25ldHhlbi9uZXR4ZW5fbmljX2N0eC5jIGIvZHJpdmVycy9uZXQvbmV0eGVuL25ldHhlbl9uaWNfY3R4LmMKaW5kZXggNjRiNTE2NC4uNzQ2YmRiNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvbmV0eGVuL25ldHhlbl9uaWNfY3R4LmMKKysrIGIvZHJpdmVycy9uZXQvbmV0eGVuL25ldHhlbl9uaWNfY3R4LmMKQEAgLTc2LDcgKzc2LDcgQEAKIHN0YXRpYyB1MzIKIG5ldHhlbl9wb2xsX3JzcChzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIpCiB7Ci0JdTMyIHJhd19yc3AsIHJzcCA9IE5YX0NEUlBfUlNQX09LOworCXUzMiByc3AgPSBOWF9DRFJQX1JTUF9PSzsKIAlpbnQJdGltZW91dCA9IDA7CiAKIAlkbyB7CkBAIC04NiwxMCArODYsNyBAQAogCQlpZiAoKyt0aW1lb3V0ID4gTlhfT1NfQ1JCX1JFVFJZX0NPVU5UKQogCQkJcmV0dXJuIE5YX0NEUlBfUlNQX1RJTUVPVVQ7CiAKLQkJbmV0eGVuX25pY19yZWFkX3cxKGFkYXB0ZXIsIE5YX0NEUlBfQ1JCX09GRlNFVCwKLQkJCQkmcmF3X3JzcCk7Ci0KLQkJcnNwID0gbGUzMl90b19jcHUocmF3X3JzcCk7CisJCW5ldHhlbl9uaWNfcmVhZF93MShhZGFwdGVyLCBOWF9DRFJQX0NSQl9PRkZTRVQsICZyc3ApOwogCX0gd2hpbGUgKCFOWF9DRFJQX0lTX1JTUChyc3ApKTsKIAogCXJldHVybiByc3A7CkBAIC0xMDksMjAgKzEwNiwxNiBAQAogCWlmIChuZXR4ZW5fYXBpX2xvY2soYWRhcHRlcikpCiAJCXJldHVybiBOWF9SQ09ERV9USU1FT1VUOwogCi0JbmV0eGVuX25pY193cml0ZV93MShhZGFwdGVyLCBOWF9TSUdOX0NSQl9PRkZTRVQsCi0JCQljcHVfdG9fbGUzMihzaWduYXR1cmUpKTsKKwluZXR4ZW5fbmljX3dyaXRlX3cxKGFkYXB0ZXIsIE5YX1NJR05fQ1JCX09GRlNFVCwgc2lnbmF0dXJlKTsKIAotCW5ldHhlbl9uaWNfd3JpdGVfdzEoYWRhcHRlciwgTlhfQVJHMV9DUkJfT0ZGU0VULAotCQkJY3B1X3RvX2xlMzIoYXJnMSkpOworCW5ldHhlbl9uaWNfd3JpdGVfdzEoYWRhcHRlciwgTlhfQVJHMV9DUkJfT0ZGU0VULCBhcmcxKTsKIAotCW5ldHhlbl9uaWNfd3JpdGVfdzEoYWRhcHRlciwgTlhfQVJHMl9DUkJfT0ZGU0VULAotCQkJY3B1X3RvX2xlMzIoYXJnMikpOworCW5ldHhlbl9uaWNfd3JpdGVfdzEoYWRhcHRlciwgTlhfQVJHMl9DUkJfT0ZGU0VULCBhcmcyKTsKIAotCW5ldHhlbl9uaWNfd3JpdGVfdzEoYWRhcHRlciwgTlhfQVJHM19DUkJfT0ZGU0VULAotCQkJY3B1X3RvX2xlMzIoYXJnMykpOworCW5ldHhlbl9uaWNfd3JpdGVfdzEoYWRhcHRlciwgTlhfQVJHM19DUkJfT0ZGU0VULCBhcmczKTsKIAogCW5ldHhlbl9uaWNfd3JpdGVfdzEoYWRhcHRlciwgTlhfQ0RSUF9DUkJfT0ZGU0VULAotCQkJY3B1X3RvX2xlMzIoTlhfQ0RSUF9GT1JNX0NNRChjbWQpKSk7CisJCQlOWF9DRFJQX0ZPUk1fQ01EKGNtZCkpOwogCiAJcnNwID0gbmV0eGVuX3BvbGxfcnNwKGFkYXB0ZXIpOwogCkBAIC0xMzMsNyArMTI2LDYgQEAKIAkJcmNvZGUgPSBOWF9SQ09ERV9USU1FT1VUOwogCX0gZWxzZSBpZiAocnNwID09IE5YX0NEUlBfUlNQX0ZBSUwpIHsKIAkJbmV0eGVuX25pY19yZWFkX3cxKGFkYXB0ZXIsIE5YX0FSRzFfQ1JCX09GRlNFVCwgJnJjb2RlKTsKLQkJcmNvZGUgPSBsZTMyX3RvX2NwdShyY29kZSk7CiAKIAkJcHJpbnRrKEtFUk5fRVJSICIlczogZmFpbGVkIGNhcmQgcmVzcG9uc2UgY29kZToweCV4XG4iLAogCQkJCW5ldHhlbl9uaWNfZHJpdmVyX25hbWUsIHJjb2RlKTsKQEAgLTE4Myw3ICsxNzUsNyBAQAogCiAJaW50IGksIG5yZHNfcmluZ3MsIG5zZHNfcmluZ3M7CiAJc2l6ZV90IHJxX3NpemUsIHJzcF9zaXplOwotCXUzMiBjYXAsIHJlZzsKKwl1MzIgY2FwLCByZWcsIHZhbDsKIAogCWludCBlcnI7CiAKQEAgLTIyNSwxMSArMjE3LDE0IEBACiAKIAlwcnEtPm51bV9yZHNfcmluZ3MgPSBjcHVfdG9fbGUxNihucmRzX3JpbmdzKTsKIAlwcnEtPm51bV9zZHNfcmluZ3MgPSBjcHVfdG9fbGUxNihuc2RzX3JpbmdzKTsKLQlwcnEtPnJkc19yaW5nX29mZnNldCA9IDA7Ci0JcHJxLT5zZHNfcmluZ19vZmZzZXQgPSBwcnEtPnJkc19yaW5nX29mZnNldCArCi0JCShzaXplb2YobnhfaG9zdHJxX3Jkc19yaW5nX3QpICogbnJkc19yaW5ncyk7CisJcHJxLT5yZHNfcmluZ19vZmZzZXQgPSBjcHVfdG9fbGUzMigwKTsKIAotCXBycV9yZHMgPSAobnhfaG9zdHJxX3Jkc19yaW5nX3QgKikocHJxLT5kYXRhICsgcHJxLT5yZHNfcmluZ19vZmZzZXQpOworCXZhbCA9IGxlMzJfdG9fY3B1KHBycS0+cmRzX3Jpbmdfb2Zmc2V0KSArCisJCShzaXplb2YobnhfaG9zdHJxX3Jkc19yaW5nX3QpICogbnJkc19yaW5ncyk7CisJcHJxLT5zZHNfcmluZ19vZmZzZXQgPSBjcHVfdG9fbGUzMih2YWwpOworCisJcHJxX3JkcyA9IChueF9ob3N0cnFfcmRzX3JpbmdfdCAqKShwcnEtPmRhdGEgKworCQkJbGUzMl90b19jcHUocHJxLT5yZHNfcmluZ19vZmZzZXQpKTsKIAogCWZvciAoaSA9IDA7IGkgPCBucmRzX3JpbmdzOyBpKyspIHsKIApAQCAtMjQxLDE3ICsyMzYsMTQgQEAKIAkJcHJxX3Jkc1tpXS5idWZmX3NpemUgPSBjcHVfdG9fbGU2NChyZHNfcmluZy0+ZG1hX3NpemUpOwogCX0KIAotCXBycV9zZHMgPSAobnhfaG9zdHJxX3Nkc19yaW5nX3QgKikocHJxLT5kYXRhICsgcHJxLT5zZHNfcmluZ19vZmZzZXQpOworCXBycV9zZHMgPSAobnhfaG9zdHJxX3Nkc19yaW5nX3QgKikocHJxLT5kYXRhICsKKwkJCWxlMzJfdG9fY3B1KHBycS0+c2RzX3Jpbmdfb2Zmc2V0KSk7CiAKIAlwcnFfc2RzWzBdLmhvc3RfcGh5c19hZGRyID0KIAkJY3B1X3RvX2xlNjQocmVjdl9jdHgtPnJjdl9zdGF0dXNfZGVzY19waHlzX2FkZHIpOwogCXBycV9zZHNbMF0ucmluZ19zaXplID0gY3B1X3RvX2xlMzIoYWRhcHRlci0+bWF4X3J4X2Rlc2NfY291bnQpOwogCS8qIG9ubHkgb25lIG1zaXggdmVjdG9yIGZvciBub3cgKi8KLQlwcnFfc2RzWzBdLm1zaV9pbmRleCA9IGNwdV90b19sZTMyKDApOwotCi0JLyogbm93IGJ5dGVzd2FwIG9mZnNldHMgKi8KLQlwcnEtPnJkc19yaW5nX29mZnNldCA9IGNwdV90b19sZTMyKHBycS0+cmRzX3Jpbmdfb2Zmc2V0KTsKLQlwcnEtPnNkc19yaW5nX29mZnNldCA9IGNwdV90b19sZTMyKHBycS0+c2RzX3Jpbmdfb2Zmc2V0KTsKKwlwcnFfc2RzWzBdLm1zaV9pbmRleCA9IGNwdV90b19sZTE2KDApOwogCiAJcGh5c19hZGRyID0gaG9zdHJxX3BoeXNfYWRkcjsKIAllcnIgPSBuZXR4ZW5faXNzdWVfY21kKGFkYXB0ZXIsCkBAIC0yNjksOSArMjYxLDkgQEAKIAogCiAJcHJzcF9yZHMgPSAoKG54X2NhcmRyc3BfcmRzX3JpbmdfdCAqKQotCQkJICZwcnNwLT5kYXRhW3Byc3AtPnJkc19yaW5nX29mZnNldF0pOworCQkJICZwcnNwLT5kYXRhW2xlMzJfdG9fY3B1KHByc3AtPnJkc19yaW5nX29mZnNldCldKTsKIAotCWZvciAoaSA9IDA7IGkgPCBsZTMyX3RvX2NwdShwcnNwLT5udW1fcmRzX3JpbmdzKTsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IGxlMTZfdG9fY3B1KHByc3AtPm51bV9yZHNfcmluZ3MpOyBpKyspIHsKIAkJcmRzX3JpbmcgPSAmcmVjdl9jdHgtPnJkc19yaW5nc1tpXTsKIAogCQlyZWcgPSBsZTMyX3RvX2NwdShwcnNwX3Jkc1tpXS5ob3N0X3Byb2R1Y2VyX2NyYik7CkBAIC0yNzksNyArMjcxLDcgQEAKIAl9CiAKIAlwcnNwX3NkcyA9ICgobnhfY2FyZHJzcF9zZHNfcmluZ190ICopCi0JCQkmcHJzcC0+ZGF0YVtwcnNwLT5zZHNfcmluZ19vZmZzZXRdKTsKKwkJCSZwcnNwLT5kYXRhW2xlMzJfdG9fY3B1KHByc3AtPnNkc19yaW5nX29mZnNldCldKTsKIAlyZWcgPSBsZTMyX3RvX2NwdShwcnNwX3Nkc1swXS5ob3N0X2NvbnN1bWVyX2NyYik7CiAJcmVjdl9jdHgtPmNyYl9zdHNfY29uc3VtZXIgPSBORVRYRU5fTklDX1JFRyhyZWcgLSAweDIwMCk7CiAKQEAgLTI4OCw3ICsyODAsNyBAQAogCiAJcmVjdl9jdHgtPnN0YXRlID0gbGUzMl90b19jcHUocHJzcC0+aG9zdF9jdHhfc3RhdGUpOwogCXJlY3ZfY3R4LT5jb250ZXh0X2lkID0gbGUxNl90b19jcHUocHJzcC0+Y29udGV4dF9pZCk7Ci0JcmVjdl9jdHgtPnZpcnRfcG9ydCA9IGxlMTZfdG9fY3B1KHByc3AtPnZpcnRfcG9ydCk7CisJcmVjdl9jdHgtPnZpcnRfcG9ydCA9IHByc3AtPnZpcnRfcG9ydDsKIAogb3V0X2ZyZWVfcnNwOgogCXBjaV9mcmVlX2NvbnNpc3RlbnQoYWRhcHRlci0+cGRldiwgcnNwX3NpemUsIHByc3AsIGNhcmRyc3BfcGh5c19hZGRyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L25ldHhlbi9uZXR4ZW5fbmljX2V0aHRvb2wuYyBiL2RyaXZlcnMvbmV0L25ldHhlbi9uZXR4ZW5fbmljX2V0aHRvb2wuYwppbmRleCBlNDVjZTI5Li5jMGJkNDBmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9uZXR4ZW4vbmV0eGVuX25pY19ldGh0b29sLmMKKysrIGIvZHJpdmVycy9uZXQvbmV0eGVuL25ldHhlbl9uaWNfZXRodG9vbC5jCkBAIC0xMzYsMTEgKzEzNiw5IEBACiAKIAkJZWNtZC0+cG9ydCA9IFBPUlRfVFA7CiAKLQkJaWYgKG5ldGlmX3J1bm5pbmcoZGV2KSkgewotCQkJZWNtZC0+c3BlZWQgPSBhZGFwdGVyLT5saW5rX3NwZWVkOwotCQkJZWNtZC0+ZHVwbGV4ID0gYWRhcHRlci0+bGlua19kdXBsZXg7Ci0JCQllY21kLT5hdXRvbmVnID0gYWRhcHRlci0+bGlua19hdXRvbmVnOwotCQl9CisJCWVjbWQtPnNwZWVkID0gYWRhcHRlci0+bGlua19zcGVlZDsKKwkJZWNtZC0+ZHVwbGV4ID0gYWRhcHRlci0+bGlua19kdXBsZXg7CisJCWVjbWQtPmF1dG9uZWcgPSBhZGFwdGVyLT5saW5rX2F1dG9uZWc7CiAKIAl9IGVsc2UgaWYgKGFkYXB0ZXItPmFody5ib2FyZF90eXBlID09IE5FVFhFTl9OSUNfWEdCRSkgewogCQl1MzIgdmFsOwpAQCAtMTcxLDcgKzE2OSw3IEBACiAJfSBlbHNlCiAJCXJldHVybiAtRUlPOwogCi0JZWNtZC0+cGh5X2FkZHJlc3MgPSBhZGFwdGVyLT5wb3J0bnVtOworCWVjbWQtPnBoeV9hZGRyZXNzID0gYWRhcHRlci0+cGh5c2ljYWxfcG9ydDsKIAllY21kLT50cmFuc2NlaXZlciA9IFhDVlJfRVhURVJOQUw7CiAKIAlzd2l0Y2ggKChuZXR4ZW5fYnJkdHlwZV90KSBib2FyZGluZm8tPmJvYXJkX3R5cGUpIHsKQEAgLTE4MCwxMyArMTc4LDEzIEBACiAJY2FzZSBORVRYRU5fQlJEVFlQRV9QM19SRUZfUUc6CiAJY2FzZSBORVRYRU5fQlJEVFlQRV9QM180X0dCOgogCWNhc2UgTkVUWEVOX0JSRFRZUEVfUDNfNF9HQl9NTToKLQljYXNlIE5FVFhFTl9CUkRUWVBFX1AzXzEwMDAwX0JBU0VfVDoKIAogCQllY21kLT5zdXBwb3J0ZWQgfD0gU1VQUE9SVEVEX0F1dG9uZWc7CiAJCWVjbWQtPmFkdmVydGlzaW5nIHw9IEFEVkVSVElTRURfQXV0b25lZzsKIAljYXNlIE5FVFhFTl9CUkRUWVBFX1AyX1NCMzFfMTBHX0NYNDoKIAljYXNlIE5FVFhFTl9CUkRUWVBFX1AzXzEwR19DWDQ6CiAJY2FzZSBORVRYRU5fQlJEVFlQRV9QM18xMEdfQ1g0X0xQOgorCWNhc2UgTkVUWEVOX0JSRFRZUEVfUDNfMTAwMDBfQkFTRV9UOgogCQllY21kLT5zdXBwb3J0ZWQgfD0gU1VQUE9SVEVEX1RQOwogCQllY21kLT5hZHZlcnRpc2luZyB8PSBBRFZFUlRJU0VEX1RQOwogCQllY21kLT5wb3J0ID0gUE9SVF9UUDsKQEAgLTIwNCwxNiArMjAyLDMzIEBACiAJCWVjbWQtPnBvcnQgPSBQT1JUX0ZJQlJFOwogCQllY21kLT5hdXRvbmVnID0gQVVUT05FR19ESVNBQkxFOwogCQlicmVhazsKLQljYXNlIE5FVFhFTl9CUkRUWVBFX1AyX1NCMzFfMTBHOgogCWNhc2UgTkVUWEVOX0JSRFRZUEVfUDNfMTBHX1NGUF9QTFVTOgogCWNhc2UgTkVUWEVOX0JSRFRZUEVfUDNfMTBHX1NGUF9DVDoKIAljYXNlIE5FVFhFTl9CUkRUWVBFX1AzXzEwR19TRlBfUVQ6CisJCWVjbWQtPmFkdmVydGlzaW5nIHw9IEFEVkVSVElTRURfVFA7CisJCWVjbWQtPnN1cHBvcnRlZCB8PSBTVVBQT1JURURfVFA7CisJY2FzZSBORVRYRU5fQlJEVFlQRV9QMl9TQjMxXzEwRzoKIAljYXNlIE5FVFhFTl9CUkRUWVBFX1AzXzEwR19YRlA6CiAJCWVjbWQtPnN1cHBvcnRlZCB8PSBTVVBQT1JURURfRklCUkU7CiAJCWVjbWQtPmFkdmVydGlzaW5nIHw9IEFEVkVSVElTRURfRklCUkU7CiAJCWVjbWQtPnBvcnQgPSBQT1JUX0ZJQlJFOwogCQllY21kLT5hdXRvbmVnID0gQVVUT05FR19ESVNBQkxFOwogCQlicmVhazsKKwljYXNlIE5FVFhFTl9CUkRUWVBFX1AzXzEwR19UUDoKKwkJaWYgKGFkYXB0ZXItPmFody5ib2FyZF90eXBlID09IE5FVFhFTl9OSUNfWEdCRSkgeworCQkJZWNtZC0+YXV0b25lZyA9IEFVVE9ORUdfRElTQUJMRTsKKwkJCWVjbWQtPnN1cHBvcnRlZCB8PSAoU1VQUE9SVEVEX0ZJQlJFIHwgU1VQUE9SVEVEX1RQKTsKKwkJCWVjbWQtPmFkdmVydGlzaW5nIHw9CisJCQkJKEFEVkVSVElTRURfRklCUkUgfCBBRFZFUlRJU0VEX1RQKTsKKwkJCWVjbWQtPnBvcnQgPSBQT1JUX0ZJQlJFOworCQl9IGVsc2UgeworCQkJZWNtZC0+YXV0b25lZyA9IEFVVE9ORUdfRU5BQkxFOworCQkJZWNtZC0+c3VwcG9ydGVkIHw9IChTVVBQT1JURURfVFAgfFNVUFBPUlRFRF9BdXRvbmVnKTsKKwkJCWVjbWQtPmFkdmVydGlzaW5nIHw9CisJCQkJKEFEVkVSVElTRURfVFAgfCBBRFZFUlRJU0VEX0F1dG9uZWcpOworCQkJZWNtZC0+cG9ydCA9IFBPUlRfVFA7CisJCX0KKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcHJpbnRrKEtFUk5fRVJSICJuZXR4ZW4tbmljOiBVbnN1cHBvcnRlZCBib2FyZCBtb2RlbCAlZFxuIiwKIAkJICAgICAgIChuZXR4ZW5fYnJkdHlwZV90KSBib2FyZGluZm8tPmJvYXJkX3R5cGUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbmV0eGVuL25ldHhlbl9uaWNfaHcuYyBiL2RyaXZlcnMvbmV0L25ldHhlbi9uZXR4ZW5fbmljX2h3LmMKaW5kZXggYWE2ZTYwMy4uODIxY2ZmNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvbmV0eGVuL25ldHhlbl9uaWNfaHcuYworKysgYi9kcml2ZXJzL25ldC9uZXR4ZW4vbmV0eGVuX25pY19ody5jCkBAIC01MDMsMTcgKzUwMywxNSBAQAogCiAJaSA9IDA7CiAKKwluZXRpZl90eF9sb2NrX2JoKGFkYXB0ZXItPm5ldGRldik7CisKIAlwcm9kdWNlciA9IGFkYXB0ZXItPmNtZF9wcm9kdWNlcjsKIAlkbyB7CiAJCWNtZF9kZXNjID0gJmNtZF9kZXNjX2FycltpXTsKIAogCQlwYnVmID0gJmFkYXB0ZXItPmNtZF9idWZfYXJyW3Byb2R1Y2VyXTsKLQkJcGJ1Zi0+bXNzID0gMDsKLQkJcGJ1Zi0+dG90YWxfbGVuZ3RoID0gMDsKIAkJcGJ1Zi0+c2tiID0gTlVMTDsKLQkJcGJ1Zi0+Y21kID0gMDsKIAkJcGJ1Zi0+ZnJhZ19jb3VudCA9IDA7Ci0JCXBidWYtPnBvcnQgPSAwOwogCiAJCS8qIGFkYXB0ZXItPmFody5jbWRfZGVzY19oZWFkW3Byb2R1Y2VyXSA9ICpjbWRfZGVzYzsgKi8KIAkJbWVtY3B5KCZhZGFwdGVyLT5haHcuY21kX2Rlc2NfaGVhZFtwcm9kdWNlcl0sCkBAIC01MzEsNiArNTI5LDggQEAKIAogCW5ldHhlbl9uaWNfdXBkYXRlX2NtZF9wcm9kdWNlcihhZGFwdGVyLCBhZGFwdGVyLT5jbWRfcHJvZHVjZXIpOwogCisJbmV0aWZfdHhfdW5sb2NrX2JoKGFkYXB0ZXItPm5ldGRldik7CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtNTM5LDE2ICs1MzksMTkgQEAKIHsKIAlzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihkZXYpOwogCW54X25pY19yZXFfdCByZXE7Ci0JbnhfbWFjX3JlcV90IG1hY19yZXE7CisJbnhfbWFjX3JlcV90ICptYWNfcmVxOworCXU2NCB3b3JkOwogCWludCBydjsKIAogCW1lbXNldCgmcmVxLCAwLCBzaXplb2YobnhfbmljX3JlcV90KSk7Ci0JcmVxLnFoZHIgfD0gKE5YX05JQ19SRVFVRVNUIDw8IDIzKTsKLQlyZXEucmVxX2hkciB8PSBOWF9NQUNfRVZFTlQ7Ci0JcmVxLnJlcV9oZHIgfD0gKCh1NjQpYWRhcHRlci0+cG9ydG51bSA8PCAxNik7Ci0JbWFjX3JlcS5vcCA9IG9wOwotCW1lbWNweSgmbWFjX3JlcS5tYWNfYWRkciwgYWRkciwgNik7Ci0JcmVxLndvcmRzWzBdID0gY3B1X3RvX2xlNjQoKih1NjQgKikmbWFjX3JlcSk7CisJcmVxLnFoZHIgPSBjcHVfdG9fbGU2NChOWF9OSUNfUkVRVUVTVCA8PCAyMyk7CisKKwl3b3JkID0gTlhfTUFDX0VWRU5UIHwgKCh1NjQpYWRhcHRlci0+cG9ydG51bSA8PCAxNik7CisJcmVxLnJlcV9oZHIgPSBjcHVfdG9fbGU2NCh3b3JkKTsKKworCW1hY19yZXEgPSAobnhfbWFjX3JlcV90ICopJnJlcS53b3Jkc1swXTsKKwltYWNfcmVxLT5vcCA9IG9wOworCW1lbWNweShtYWNfcmVxLT5tYWNfYWRkciwgYWRkciwgNik7CiAKIAlydiA9IG5ldHhlbl9zZW5kX2NtZF9kZXNjcyhhZGFwdGVyLCAoc3RydWN0IGNtZF9kZXNjX3R5cGUwICopJnJlcSwgMSk7CiAJaWYgKHJ2ICE9IDApIHsKQEAgLTYxMiwxOCArNjE1LDM1IEBACiBpbnQgbmV0eGVuX3AzX25pY19zZXRfcHJvbWlzYyhzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIsIHUzMiBtb2RlKQogewogCW54X25pY19yZXFfdCByZXE7CisJdTY0IHdvcmQ7CiAKIAltZW1zZXQoJnJlcSwgMCwgc2l6ZW9mKG54X25pY19yZXFfdCkpOwogCi0JcmVxLnFoZHIgfD0gKE5YX0hPU1RfUkVRVUVTVCA8PCAyMyk7Ci0JcmVxLnJlcV9oZHIgfD0gTlhfTklDX0gyQ19PUENPREVfUFJPWFlfU0VUX1ZQT1JUX01JU1NfTU9ERTsKLQlyZXEucmVxX2hkciB8PSAoKHU2NClhZGFwdGVyLT5wb3J0bnVtIDw8IDE2KTsKKwlyZXEucWhkciA9IGNwdV90b19sZTY0KE5YX0hPU1RfUkVRVUVTVCA8PCAyMyk7CisKKwl3b3JkID0gTlhfTklDX0gyQ19PUENPREVfUFJPWFlfU0VUX1ZQT1JUX01JU1NfTU9ERSB8CisJCQkoKHU2NClhZGFwdGVyLT5wb3J0bnVtIDw8IDE2KTsKKwlyZXEucmVxX2hkciA9IGNwdV90b19sZTY0KHdvcmQpOworCiAJcmVxLndvcmRzWzBdID0gY3B1X3RvX2xlNjQobW9kZSk7CiAKIAlyZXR1cm4gbmV0eGVuX3NlbmRfY21kX2Rlc2NzKGFkYXB0ZXIsCiAJCQkJKHN0cnVjdCBjbWRfZGVzY190eXBlMCAqKSZyZXEsIDEpOwogfQogCit2b2lkIG5ldHhlbl9wM19mcmVlX21hY19saXN0KHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlcikKK3sKKwlueF9tYWNfbGlzdF90ICpjdXIsICpuZXh0OworCisJY3VyID0gYWRhcHRlci0+bWFjX2xpc3Q7CisKKwl3aGlsZSAoY3VyKSB7CisJCW5leHQgPSBjdXItPm5leHQ7CisJCWtmcmVlKGN1cik7CisJCWN1ciA9IG5leHQ7CisJfQorfQorCiAjZGVmaW5lCU5FVFhFTl9DT05GSUdfSU5UUl9DT0FMRVNDRQkzCiAKIC8qCkBAIC02MzIsMTMgKzY1MiwxNSBAQAogaW50IG5ldHhlbl9jb25maWdfaW50cl9jb2FsZXNjZShzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIpCiB7CiAJbnhfbmljX3JlcV90IHJlcTsKKwl1NjQgd29yZDsKIAlpbnQgcnY7CiAKIAltZW1zZXQoJnJlcSwgMCwgc2l6ZW9mKG54X25pY19yZXFfdCkpOwogCi0JcmVxLnFoZHIgfD0gKE5YX05JQ19SRVFVRVNUIDw8IDIzKTsKLQlyZXEucmVxX2hkciB8PSBORVRYRU5fQ09ORklHX0lOVFJfQ09BTEVTQ0U7Ci0JcmVxLnJlcV9oZHIgfD0gKCh1NjQpYWRhcHRlci0+cG9ydG51bSA8PCAxNik7CisJcmVxLnFoZHIgPSBjcHVfdG9fbGU2NChOWF9OSUNfUkVRVUVTVCA8PCAyMyk7CisKKwl3b3JkID0gTkVUWEVOX0NPTkZJR19JTlRSX0NPQUxFU0NFIHwgKCh1NjQpYWRhcHRlci0+cG9ydG51bSA8PCAxNik7CisJcmVxLnJlcV9oZHIgPSBjcHVfdG9fbGU2NCh3b3JkKTsKIAogCW1lbWNweSgmcmVxLndvcmRzWzBdLCAmYWRhcHRlci0+Y29hbCwgc2l6ZW9mKGFkYXB0ZXItPmNvYWwpKTsKIApAQCAtNzcyLDEzICs3OTQsMTAgQEAKIAlhZGFwdGVyLT5od19yZWFkX3d4KGFkYXB0ZXIsIGNyYmFkZHIsICZtYWNfbG8sIDQpOwogCWFkYXB0ZXItPmh3X3JlYWRfd3goYWRhcHRlciwgY3JiYWRkcis0LCAmbWFjX2hpLCA0KTsKIAotCW1hY19oaSA9IGNwdV90b19sZTMyKG1hY19oaSk7Ci0JbWFjX2xvID0gY3B1X3RvX2xlMzIobWFjX2xvKTsKLQogCWlmIChwY2lfZnVuYyAmIDEpCi0JCSptYWMgPSAoKG1hY19sbyA+PiAxNikgfCAoKHU2NCltYWNfaGkgPDwgMTYpKTsKKwkJKm1hYyA9IGxlNjRfdG9fY3B1KChtYWNfbG8gPj4gMTYpIHwgKCh1NjQpbWFjX2hpIDw8IDE2KSk7CiAJZWxzZQotCQkqbWFjID0gKChtYWNfbG8pIHwgKCh1NjQpbWFjX2hpIDw8IDMyKSk7CisJCSptYWMgPSBsZTY0X3RvX2NwdSgodTY0KW1hY19sbyB8ICgodTY0KW1hY19oaSA8PCAzMikpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC05MzcsNyArOTU2LDcgQEAKIHsKIAlpbnQgaTsKIAl1MzIgZGF0YSwgc2l6ZSA9IDA7Ci0JdTMyIGZsYXNoYWRkciA9IE5FVFhFTl9CT09UTERfU1RBUlQsIG1lbWFkZHIgPSBORVRYRU5fQk9PVExEX1NUQVJUOworCXUzMiBmbGFzaGFkZHIgPSBORVRYRU5fQk9PVExEX1NUQVJUOwogCiAJc2l6ZSA9IChORVRYRU5fSU1BR0VfU1RBUlQgLSBORVRYRU5fQk9PVExEX1NUQVJUKS80OwogCkBAIC05NDksMTAgKzk2OCw4IEBACiAJCWlmIChuZXR4ZW5fcm9tX2Zhc3RfcmVhZChhZGFwdGVyLCBmbGFzaGFkZHIsIChpbnQgKikmZGF0YSkgIT0gMCkKIAkJCXJldHVybiAtRUlPOwogCi0JCWFkYXB0ZXItPnBjaV9tZW1fd3JpdGUoYWRhcHRlciwgbWVtYWRkciwgJmRhdGEsIDQpOworCQlhZGFwdGVyLT5wY2lfbWVtX3dyaXRlKGFkYXB0ZXIsIGZsYXNoYWRkciwgJmRhdGEsIDQpOwogCQlmbGFzaGFkZHIgKz0gNDsKLQkJbWVtYWRkciArPSA0OwotCQljb25kX3Jlc2NoZWQoKTsKIAl9CiAJbXNsZWVwKDEpOwogCkBAIC0yMDM0LDcgKzIwNTEsMTMgQEAKIAkJcnYgPSAtMTsKIAl9CiAKLQlEUFJJTlRLKElORk8sICJEaXNjb3ZlcmVkIGJvYXJkIHR5cGU6MHgleCAgIiwgYm9hcmRpbmZvLT5ib2FyZF90eXBlKTsKKwlpZiAoYm9hcmRpbmZvLT5ib2FyZF90eXBlID09IE5FVFhFTl9CUkRUWVBFX1AzXzRfR0JfTU0pIHsKKwkJdTMyIGdwaW8gPSBuZXR4ZW5fbmljX3JlZ19yZWFkKGFkYXB0ZXIsCisJCQkJTkVUWEVOX1JPTVVTQl9HTEJfUEFEX0dQSU9fSSk7CisJCWlmICgoZ3BpbyAmIDB4ODAwMCkgPT0gMCkKKwkJCWJvYXJkaW5mby0+Ym9hcmRfdHlwZSA9IE5FVFhFTl9CUkRUWVBFX1AzXzEwR19UUDsKKwl9CisKIAlzd2l0Y2ggKChuZXR4ZW5fYnJkdHlwZV90KSBib2FyZGluZm8tPmJvYXJkX3R5cGUpIHsKIAljYXNlIE5FVFhFTl9CUkRUWVBFX1AyX1NCMzVfNEc6CiAJCWFkYXB0ZXItPmFody5ib2FyZF90eXBlID0gTkVUWEVOX05JQ19HQkU7CkBAIC0yMDUzLDcgKzIwNzYsNiBAQAogCWNhc2UgTkVUWEVOX0JSRFRZUEVfUDNfMTBHX1NGUF9RVDoKIAljYXNlIE5FVFhFTl9CUkRUWVBFX1AzXzEwR19YRlA6CiAJY2FzZSBORVRYRU5fQlJEVFlQRV9QM18xMDAwMF9CQVNFX1Q6Ci0KIAkJYWRhcHRlci0+YWh3LmJvYXJkX3R5cGUgPSBORVRYRU5fTklDX1hHQkU7CiAJCWJyZWFrOwogCWNhc2UgTkVUWEVOX0JSRFRZUEVfUDFfQkQ6CkBAIC0yMDYzLDkgKzIwODUsMTIgQEAKIAljYXNlIE5FVFhFTl9CUkRUWVBFX1AzX1JFRl9RRzoKIAljYXNlIE5FVFhFTl9CUkRUWVBFX1AzXzRfR0I6CiAJY2FzZSBORVRYRU5fQlJEVFlQRV9QM180X0dCX01NOgotCiAJCWFkYXB0ZXItPmFody5ib2FyZF90eXBlID0gTkVUWEVOX05JQ19HQkU7CiAJCWJyZWFrOworCWNhc2UgTkVUWEVOX0JSRFRZUEVfUDNfMTBHX1RQOgorCQlhZGFwdGVyLT5haHcuYm9hcmRfdHlwZSA9IChhZGFwdGVyLT5wb3J0bnVtIDwgMikgPworCQkJTkVUWEVOX05JQ19YR0JFIDogTkVUWEVOX05JQ19HQkU7CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXByaW50aygiJXM6IFVua25vd24oJXgpXG4iLCBuZXR4ZW5fbmljX2RyaXZlcl9uYW1lLAogCQkgICAgICAgYm9hcmRpbmZvLT5ib2FyZF90eXBlKTsKQEAgLTIxMTAsMTIgKzIxMzUsMTYgQEAKIHsKIAlfX3UzMiBzdGF0dXM7CiAJX191MzIgYXV0b25lZzsKLQlfX3UzMiBtb2RlOwogCV9fdTMyIHBvcnRfbW9kZTsKIAotCW5ldHhlbl9uaWNfcmVhZF93MChhZGFwdGVyLCBORVRYRU5fTklVX01PREUsICZtb2RlKTsKLQlpZiAobmV0eGVuX2dldF9uaXVfZW5hYmxlX2dlKG1vZGUpKSB7CS8qIEdiIDEwLzEwMC8xMDAwIE1icHMgbW9kZSAqLworCWlmICghbmV0aWZfY2Fycmllcl9vayhhZGFwdGVyLT5uZXRkZXYpKSB7CisJCWFkYXB0ZXItPmxpbmtfc3BlZWQgICA9IDA7CisJCWFkYXB0ZXItPmxpbmtfZHVwbGV4ICA9IC0xOworCQlhZGFwdGVyLT5saW5rX2F1dG9uZWcgPSBBVVRPTkVHX0VOQUJMRTsKKwkJcmV0dXJuOworCX0KIAorCWlmIChhZGFwdGVyLT5haHcuYm9hcmRfdHlwZSA9PSBORVRYRU5fTklDX0dCRSkgewogCQlhZGFwdGVyLT5od19yZWFkX3d4KGFkYXB0ZXIsCiAJCQkJTkVUWEVOX1BPUlRfTU9ERV9BRERSLCAmcG9ydF9tb2RlLCA0KTsKIAkJaWYgKHBvcnRfbW9kZSA9PSBORVRYRU5fUE9SVF9NT0RFXzgwMl8zX0FQKSB7CkBAIC0yMTQxLDcgKzIxNzAsNyBAQAogCQkJCQlhZGFwdGVyLT5saW5rX3NwZWVkID0gU1BFRURfMTAwMDsKIAkJCQkJYnJlYWs7CiAJCQkJZGVmYXVsdDoKLQkJCQkJYWRhcHRlci0+bGlua19zcGVlZCA9IC0xOworCQkJCQlhZGFwdGVyLT5saW5rX3NwZWVkID0gMDsKIAkJCQkJYnJlYWs7CiAJCQkJfQogCQkJCXN3aXRjaCAobmV0eGVuX2dldF9waHlfZHVwbGV4KHN0YXR1cykpIHsKQEAgLTIxNjQsNyArMjE5Myw3IEBACiAJCQkJZ290byBsaW5rX2Rvd247CiAJCX0gZWxzZSB7CiAJCSAgICAgIGxpbmtfZG93bjoKLQkJCWFkYXB0ZXItPmxpbmtfc3BlZWQgPSAtMTsKKwkJCWFkYXB0ZXItPmxpbmtfc3BlZWQgPSAwOwogCQkJYWRhcHRlci0+bGlua19kdXBsZXggPSAtMTsKIAkJfQogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L25ldHhlbi9uZXR4ZW5fbmljX2luaXQuYyBiL2RyaXZlcnMvbmV0L25ldHhlbi9uZXR4ZW5fbmljX2luaXQuYwppbmRleCBkOTI0NDY4Li5jYTdjOGQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9uZXR4ZW4vbmV0eGVuX25pY19pbml0LmMKKysrIGIvZHJpdmVycy9uZXQvbmV0eGVuL25ldHhlbl9uaWNfaW5pdC5jCkBAIC0zMDgsNyArMzA4LDYgQEAKIAkJCX0KIAkJCW1lbXNldChyZHNfcmluZy0+cnhfYnVmX2FyciwgMCwgUkNWX0JVRkZTSVpFKTsKIAkJCUlOSVRfTElTVF9IRUFEKCZyZHNfcmluZy0+ZnJlZV9saXN0KTsKLQkJCXJkc19yaW5nLT5iZWdpbl9hbGxvYyA9IDA7CiAJCQkvKgogCQkJICogTm93IGdvIHRocm91Z2ggYWxsIG9mIHRoZW0sIHNldCByZWZlcmVuY2UgaGFuZGxlcwogCQkJICogYW5kIHB1dCB0aGVtIGluIHRoZSBxdWV1ZXMuCkBAIC00MzksNiArNDM4LDggQEAKIAlsb25nIHRpbWVvdXQgPSAwOwogCWxvbmcgZG9uZSA9IDA7CiAKKwljb25kX3Jlc2NoZWQoKTsKKwogCXdoaWxlIChkb25lID09IDApIHsKIAkJZG9uZSA9IG5ldHhlbl9uaWNfcmVnX3JlYWQoYWRhcHRlciwgTkVUWEVOX1JPTVVTQl9HTEJfU1RBVFVTKTsKIAkJZG9uZSAmPSAyOwpAQCAtNTMzLDEyICs1MzQsOSBAQAogc3RhdGljIGludCBkb19yb21fZmFzdF9yZWFkKHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlciwKIAkJCSAgICBpbnQgYWRkciwgaW50ICp2YWxwKQogewotCWNvbmRfcmVzY2hlZCgpOwotCiAJbmV0eGVuX25pY19yZWdfd3JpdGUoYWRhcHRlciwgTkVUWEVOX1JPTVVTQl9ST01fQUREUkVTUywgYWRkcik7Ci0JbmV0eGVuX25pY19yZWdfd3JpdGUoYWRhcHRlciwgTkVUWEVOX1JPTVVTQl9ST01fQUJZVEVfQ05ULCAzKTsKLQl1ZGVsYXkoMTAwKTsJCS8qIHByZXZlbnQgYnVyc3Rpbmcgb24gQ1JCICovCiAJbmV0eGVuX25pY19yZWdfd3JpdGUoYWRhcHRlciwgTkVUWEVOX1JPTVVTQl9ST01fRFVNTVlfQllURV9DTlQsIDApOworCW5ldHhlbl9uaWNfcmVnX3dyaXRlKGFkYXB0ZXIsIE5FVFhFTl9ST01VU0JfUk9NX0FCWVRFX0NOVCwgMyk7CiAJbmV0eGVuX25pY19yZWdfd3JpdGUoYWRhcHRlciwgTkVUWEVOX1JPTVVTQl9ST01fSU5TVFJfT1BDT0RFLCAweGIpOwogCWlmIChuZXR4ZW5fd2FpdF9yb21fZG9uZShhZGFwdGVyKSkgewogCQlwcmludGsoIkVycm9yIHdhaXRpbmcgZm9yIHJvbSBkb25lXG4iKTsKQEAgLTU0Niw3ICs1NDQsNyBAQAogCX0KIAkvKiByZXNldCBhYnl0ZV9jbnQgYW5kIGR1bW15X2J5dGVfY250ICovCiAJbmV0eGVuX25pY19yZWdfd3JpdGUoYWRhcHRlciwgTkVUWEVOX1JPTVVTQl9ST01fQUJZVEVfQ05ULCAwKTsKLQl1ZGVsYXkoMTAwKTsJCS8qIHByZXZlbnQgYnVyc3Rpbmcgb24gQ1JCICovCisJdWRlbGF5KDEwKTsKIAluZXR4ZW5fbmljX3JlZ193cml0ZShhZGFwdGVyLCBORVRYRU5fUk9NVVNCX1JPTV9EVU1NWV9CWVRFX0NOVCwgMCk7CiAKIAkqdmFscCA9IG5ldHhlbl9uaWNfcmVnX3JlYWQoYWRhcHRlciwgTkVUWEVOX1JPTVVTQl9ST01fUkRBVEEpOwpAQCAtODg0LDE0ICs4ODIsMTYgQEAKIGludCBuZXR4ZW5fcGluaXRfZnJvbV9yb20oc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyLCBpbnQgdmVyYm9zZSkKIHsKIAlpbnQgYWRkciwgdmFsOwotCWludCBpLCBpbml0X2RlbGF5ID0gMDsKKwlpbnQgaSwgbiwgaW5pdF9kZWxheSA9IDA7CiAJc3RydWN0IGNyYl9hZGRyX3BhaXIgKmJ1ZjsKLQl1bnNpZ25lZCBvZmZzZXQsIG47CisJdW5zaWduZWQgb2Zmc2V0OwogCXUzMiBvZmY7CiAKIAkvKiByZXNldGFsbCAqLworCXJvbV9sb2NrKGFkYXB0ZXIpOwogCW5ldHhlbl9jcmJfd3JpdGVsaXRfYWRhcHRlcihhZGFwdGVyLCBORVRYRU5fUk9NVVNCX0dMQl9TV19SRVNFVCwKIAkJCQkgICAgMHhmZmZmZmZmZik7CisJbmV0eGVuX3JvbV91bmxvY2soYWRhcHRlcik7CiAKIAlpZiAodmVyYm9zZSkgewogCQlpZiAobmV0eGVuX3JvbV9mYXN0X3JlYWQoYWRhcHRlciwgTkVUWEVOX0JPQVJEVFlQRSwgJnZhbCkgPT0gMCkKQEAgLTkxMCw3ICs5MTAsNyBAQAogCiAJaWYgKE5YX0lTX1JFVklTSU9OX1AzKGFkYXB0ZXItPmFody5yZXZpc2lvbl9pZCkpIHsKIAkJaWYgKG5ldHhlbl9yb21fZmFzdF9yZWFkKGFkYXB0ZXIsIDAsICZuKSAhPSAwIHx8Ci0JCQkobiAhPSAweGNhZmVjYWZlVUwpIHx8CisJCQkobiAhPSAweGNhZmVjYWZlKSB8fAogCQkJbmV0eGVuX3JvbV9mYXN0X3JlYWQoYWRhcHRlciwgNCwgJm4pICE9IDApIHsKIAkJCXByaW50ayhLRVJOX0VSUiAiJXM6IEVSUk9SIFJlYWRpbmcgY3JiX2luaXQgYXJlYTogIgogCQkJCQkibjogJTA4eFxuIiwgbmV0eGVuX25pY19kcml2ZXJfbmFtZSwgbik7CkBAIC05NzUsNiArOTc1LDE0IEBACiAJCQkvKiBkbyBub3QgcmVzZXQgUENJICovCiAJCQlpZiAob2ZmID09IChST01VU0JfR0xCICsgMHhiYykpCiAJCQkJY29udGludWU7CisJCQlpZiAob2ZmID09IChST01VU0JfR0xCICsgMHhhOCkpCisJCQkJY29udGludWU7CisJCQlpZiAob2ZmID09IChST01VU0JfR0xCICsgMHhjOCkpIC8qIGNvcmUgY2xvY2sgKi8KKwkJCQljb250aW51ZTsKKwkJCWlmIChvZmYgPT0gKFJPTVVTQl9HTEIgKyAweDI0KSkgLyogTU4gY2xvY2sgKi8KKwkJCQljb250aW51ZTsKKwkJCWlmIChvZmYgPT0gKFJPTVVTQl9HTEIgKyAweDFjKSkgLyogTVMgY2xvY2sgKi8KKwkJCQljb250aW51ZTsKIAkJCWlmIChvZmYgPT0gKE5FVFhFTl9DUkJfUEVHX05FVF8xICsgMHgxOCkpCiAJCQkJYnVmW2ldLmRhdGEgPSAweDEwMjA7CiAJCQkvKiBza2lwIHRoZSBmdW5jdGlvbiBlbmFibGUgcmVnaXN0ZXIgKi8KQEAgLTk5MiwyMyArMTAwMCwyMSBAQAogCQkJY29udGludWU7CiAJCX0KIAorCQlpbml0X2RlbGF5ID0gMTsKIAkJLyogQWZ0ZXIgd3JpdGluZyB0aGlzIHJlZ2lzdGVyLCBIVyBuZWVkcyB0aW1lIGZvciBDUkIgKi8KIAkJLyogdG8gcXVpZXQgZG93biAoZWxzZSBjcmJfd2luZG93IHJldHVybnMgMHhmZmZmZmZmZikgKi8KIAkJaWYgKG9mZiA9PSBORVRYRU5fUk9NVVNCX0dMQl9TV19SRVNFVCkgewotCQkJaW5pdF9kZWxheSA9IDE7CisJCQlpbml0X2RlbGF5ID0gMTAwMDsKIAkJCWlmIChOWF9JU19SRVZJU0lPTl9QMihhZGFwdGVyLT5haHcucmV2aXNpb25faWQpKSB7CiAJCQkJLyogaG9sZCB4ZG1hIGluIHJlc2V0IGFsc28gKi8KIAkJCQlidWZbaV0uZGF0YSA9IE5FVFhFTl9OSUNfWERNQV9SRVNFVDsKKwkJCQlidWZbaV0uZGF0YSA9IDB4ODAwMGZmOwogCQkJfQogCQl9CiAKIAkJYWRhcHRlci0+aHdfd3JpdGVfd3goYWRhcHRlciwgb2ZmLCAmYnVmW2ldLmRhdGEsIDQpOwogCi0JCWlmIChpbml0X2RlbGF5ID09IDEpIHsKLQkJCW1zbGVlcCgxMDAwKTsKLQkJCWluaXRfZGVsYXkgPSAwOwotCQl9Ci0JCW1zbGVlcCgxKTsKKwkJbXNsZWVwKGluaXRfZGVsYXkpOwogCX0KIAlrZnJlZShidWYpOwogCkBAIC0xMjc3LDcgKzEyODMsNyBAQAogCiAJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CiAJCWZvciAoaSA9IDA7IGkgPCBucl9mcmFnczsgaSsrKSB7Ci0JCQlpbmRleCA9IGZyYWdfZGVzYy0+ZnJhZ19oYW5kbGVzW2ldOworCQkJaW5kZXggPSBsZTE2X3RvX2NwdShmcmFnX2Rlc2MtPmZyYWdfaGFuZGxlc1tpXSk7CiAJCQlza2IgPSBuZXR4ZW5fcHJvY2Vzc19yeGJ1ZihhZGFwdGVyLAogCQkJCQlyZHNfcmluZywgaW5kZXgsIGNrc3VtKTsKIAkJCWlmIChza2IpCkBAIC0xNDI4LDcgKzE0MzQsNiBAQAogCXN0cnVjdCByY3ZfZGVzYyAqcGRlc2M7CiAJc3RydWN0IG5ldHhlbl9yeF9idWZmZXIgKmJ1ZmZlcjsKIAlpbnQgY291bnQgPSAwOwotCWludCBpbmRleCA9IDA7CiAJbmV0eGVuX2N0eF9tc2cgbXNnID0gMDsKIAlkbWFfYWRkcl90IGRtYTsKIAlzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkOwpAQCAtMTQzNiw3ICsxNDQxLDYgQEAKIAlyZHNfcmluZyA9ICZyZWN2X2N0eC0+cmRzX3JpbmdzW3JpbmdpZF07CiAKIAlwcm9kdWNlciA9IHJkc19yaW5nLT5wcm9kdWNlcjsKLQlpbmRleCA9IHJkc19yaW5nLT5iZWdpbl9hbGxvYzsKIAloZWFkID0gJnJkc19yaW5nLT5mcmVlX2xpc3Q7CiAKIAkvKiBXZSBjYW4gc3RhcnQgd3JpdGluZyByeCBkZXNjcmlwdG9ycyBpbnRvIHRoZSBwaGFudG9tIG1lbW9yeS4gKi8KQEAgLTE0NDQsMzkgKzE0NDgsMzcgQEAKIAogCQlza2IgPSBkZXZfYWxsb2Nfc2tiKHJkc19yaW5nLT5za2Jfc2l6ZSk7CiAJCWlmICh1bmxpa2VseSghc2tiKSkgewotCQkJcmRzX3JpbmctPmJlZ2luX2FsbG9jID0gaW5kZXg7CiAJCQlicmVhazsKIAkJfQogCisJCWlmICghYWRhcHRlci0+YWh3LmN1dF90aHJvdWdoKQorCQkJc2tiX3Jlc2VydmUoc2tiLCAyKTsKKworCQlkbWEgPSBwY2lfbWFwX3NpbmdsZShwZGV2LCBza2ItPmRhdGEsCisJCQkJcmRzX3JpbmctPmRtYV9zaXplLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQlpZiAocGNpX2RtYV9tYXBwaW5nX2Vycm9yKHBkZXYsIGRtYSkpIHsKKwkJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJCQlicmVhazsKKwkJfQorCisJCWNvdW50Kys7CiAJCWJ1ZmZlciA9IGxpc3RfZW50cnkoaGVhZC0+bmV4dCwgc3RydWN0IG5ldHhlbl9yeF9idWZmZXIsIGxpc3QpOwogCQlsaXN0X2RlbCgmYnVmZmVyLT5saXN0KTsKIAotCQljb3VudCsrOwkvKiBub3cgdGhlcmUgc2hvdWxkIGJlIG5vIGZhaWx1cmUgKi8KLQkJcGRlc2MgPSAmcmRzX3JpbmctPmRlc2NfaGVhZFtwcm9kdWNlcl07Ci0KLQkJaWYgKCFhZGFwdGVyLT5haHcuY3V0X3Rocm91Z2gpCi0JCQlza2JfcmVzZXJ2ZShza2IsIDIpOwotCQkvKiBUaGlzIHdpbGwgYmUgc2V0dXAgd2hlbiB3ZSByZWNlaXZlIHRoZQotCQkgKiBidWZmZXIgYWZ0ZXIgaXQgaGFzIGJlZW4gZmlsbGVkICBGU0wgIFRCRCBUQkQKLQkJICogc2tiLT5kZXYgPSBuZXRkZXY7Ci0JCSAqLwotCQlkbWEgPSBwY2lfbWFwX3NpbmdsZShwZGV2LCBza2ItPmRhdGEsIHJkc19yaW5nLT5kbWFfc2l6ZSwKLQkJCQkgICAgIFBDSV9ETUFfRlJPTURFVklDRSk7Ci0JCXBkZXNjLT5hZGRyX2J1ZmZlciA9IGNwdV90b19sZTY0KGRtYSk7CiAJCWJ1ZmZlci0+c2tiID0gc2tiOwogCQlidWZmZXItPnN0YXRlID0gTkVUWEVOX0JVRkZFUl9CVVNZOwogCQlidWZmZXItPmRtYSA9IGRtYTsKKwogCQkvKiBtYWtlIGEgcmN2IGRlc2NyaXB0b3IgICovCisJCXBkZXNjID0gJnJkc19yaW5nLT5kZXNjX2hlYWRbcHJvZHVjZXJdOworCQlwZGVzYy0+YWRkcl9idWZmZXIgPSBjcHVfdG9fbGU2NChkbWEpOwogCQlwZGVzYy0+cmVmZXJlbmNlX2hhbmRsZSA9IGNwdV90b19sZTE2KGJ1ZmZlci0+cmVmX2hhbmRsZSk7CiAJCXBkZXNjLT5idWZmZXJfbGVuZ3RoID0gY3B1X3RvX2xlMzIocmRzX3JpbmctPmRtYV9zaXplKTsKLQkJRFBSSU5USyhJTkZPLCAiZG9uZSB3cml0aW5nIGRlc2NyaXB0ZXJcbiIpOwotCQlwcm9kdWNlciA9Ci0JCSAgICBnZXRfbmV4dF9pbmRleChwcm9kdWNlciwgcmRzX3JpbmctPm1heF9yeF9kZXNjX2NvdW50KTsKLQkJaW5kZXggPSBnZXRfbmV4dF9pbmRleChpbmRleCwgcmRzX3JpbmctPm1heF9yeF9kZXNjX2NvdW50KTsKKworCQlwcm9kdWNlciA9IGdldF9uZXh0X2luZGV4KHByb2R1Y2VyLCByZHNfcmluZy0+bWF4X3J4X2Rlc2NfY291bnQpOwogCX0KIAkvKiBpZiB3ZSBkaWQgYWxsb2NhdGUgYnVmZmVycywgdGhlbiB3cml0ZSB0aGUgY291bnQgdG8gUGhhbnRvbSAqLwogCWlmIChjb3VudCkgewotCQlyZHNfcmluZy0+YmVnaW5fYWxsb2MgPSBpbmRleDsKIAkJcmRzX3JpbmctPnByb2R1Y2VyID0gcHJvZHVjZXI7CiAJCQkvKiBXaW5kb3cgPSAxICovCiAJCWFkYXB0ZXItPnBjaV93cml0ZV9ub3JtYWxpemUoYWRhcHRlciwKQEAgLTE1MTUsNDkgKzE1MTcsNTAgQEAKIAlzdHJ1Y3QgcmN2X2Rlc2MgKnBkZXNjOwogCXN0cnVjdCBuZXR4ZW5fcnhfYnVmZmVyICpidWZmZXI7CiAJaW50IGNvdW50ID0gMDsKLQlpbnQgaW5kZXggPSAwOwogCXN0cnVjdCBsaXN0X2hlYWQgKmhlYWQ7CisJZG1hX2FkZHJfdCBkbWE7CiAKIAlyZHNfcmluZyA9ICZyZWN2X2N0eC0+cmRzX3JpbmdzW3JpbmdpZF07CiAKIAlwcm9kdWNlciA9IHJkc19yaW5nLT5wcm9kdWNlcjsKLQlpbmRleCA9IHJkc19yaW5nLT5iZWdpbl9hbGxvYzsKIAloZWFkID0gJnJkc19yaW5nLT5mcmVlX2xpc3Q7CiAJLyogV2UgY2FuIHN0YXJ0IHdyaXRpbmcgcnggZGVzY3JpcHRvcnMgaW50byB0aGUgcGhhbnRvbSBtZW1vcnkuICovCiAJd2hpbGUgKCFsaXN0X2VtcHR5KGhlYWQpKSB7CiAKIAkJc2tiID0gZGV2X2FsbG9jX3NrYihyZHNfcmluZy0+c2tiX3NpemUpOwogCQlpZiAodW5saWtlbHkoIXNrYikpIHsKLQkJCXJkc19yaW5nLT5iZWdpbl9hbGxvYyA9IGluZGV4OwogCQkJYnJlYWs7CiAJCX0KIAorCQlpZiAoIWFkYXB0ZXItPmFody5jdXRfdGhyb3VnaCkKKwkJCXNrYl9yZXNlcnZlKHNrYiwgMik7CisKKwkJZG1hID0gcGNpX21hcF9zaW5nbGUocGRldiwgc2tiLT5kYXRhLAorCQkJCXJkc19yaW5nLT5kbWFfc2l6ZSwgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJaWYgKHBjaV9kbWFfbWFwcGluZ19lcnJvcihwZGV2LCBkbWEpKSB7CisJCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCQkJYnJlYWs7CisJCX0KKworCQljb3VudCsrOwogCQlidWZmZXIgPSBsaXN0X2VudHJ5KGhlYWQtPm5leHQsIHN0cnVjdCBuZXR4ZW5fcnhfYnVmZmVyLCBsaXN0KTsKIAkJbGlzdF9kZWwoJmJ1ZmZlci0+bGlzdCk7CiAKLQkJY291bnQrKzsJLyogbm93IHRoZXJlIHNob3VsZCBiZSBubyBmYWlsdXJlICovCi0JCXBkZXNjID0gJnJkc19yaW5nLT5kZXNjX2hlYWRbcHJvZHVjZXJdOwotCQlpZiAoIWFkYXB0ZXItPmFody5jdXRfdGhyb3VnaCkKLQkJCXNrYl9yZXNlcnZlKHNrYiwgMik7CiAJCWJ1ZmZlci0+c2tiID0gc2tiOwogCQlidWZmZXItPnN0YXRlID0gTkVUWEVOX0JVRkZFUl9CVVNZOwotCQlidWZmZXItPmRtYSA9IHBjaV9tYXBfc2luZ2xlKHBkZXYsIHNrYi0+ZGF0YSwKLQkJCQkJICAgICByZHNfcmluZy0+ZG1hX3NpemUsCi0JCQkJCSAgICAgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJYnVmZmVyLT5kbWEgPSBkbWE7CiAKIAkJLyogbWFrZSBhIHJjdiBkZXNjcmlwdG9yICAqLworCQlwZGVzYyA9ICZyZHNfcmluZy0+ZGVzY19oZWFkW3Byb2R1Y2VyXTsKIAkJcGRlc2MtPnJlZmVyZW5jZV9oYW5kbGUgPSBjcHVfdG9fbGUxNihidWZmZXItPnJlZl9oYW5kbGUpOwogCQlwZGVzYy0+YnVmZmVyX2xlbmd0aCA9IGNwdV90b19sZTMyKHJkc19yaW5nLT5kbWFfc2l6ZSk7CiAJCXBkZXNjLT5hZGRyX2J1ZmZlciA9IGNwdV90b19sZTY0KGJ1ZmZlci0+ZG1hKTsKLQkJcHJvZHVjZXIgPQotCQkgICAgZ2V0X25leHRfaW5kZXgocHJvZHVjZXIsIHJkc19yaW5nLT5tYXhfcnhfZGVzY19jb3VudCk7Ci0JCWluZGV4ID0gZ2V0X25leHRfaW5kZXgoaW5kZXgsIHJkc19yaW5nLT5tYXhfcnhfZGVzY19jb3VudCk7Ci0JCWJ1ZmZlciA9ICZyZHNfcmluZy0+cnhfYnVmX2FycltpbmRleF07CisKKwkJcHJvZHVjZXIgPSBnZXRfbmV4dF9pbmRleChwcm9kdWNlciwgcmRzX3JpbmctPm1heF9yeF9kZXNjX2NvdW50KTsKIAl9CiAKIAkvKiBpZiB3ZSBkaWQgYWxsb2NhdGUgYnVmZmVycywgdGhlbiB3cml0ZSB0aGUgY291bnQgdG8gUGhhbnRvbSAqLwogCWlmIChjb3VudCkgewotCQlyZHNfcmluZy0+YmVnaW5fYWxsb2MgPSBpbmRleDsKIAkJcmRzX3JpbmctPnByb2R1Y2VyID0gcHJvZHVjZXI7CiAJCQkvKiBXaW5kb3cgPSAxICovCiAJCWFkYXB0ZXItPnBjaV93cml0ZV9ub3JtYWxpemUoYWRhcHRlciwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L25ldHhlbi9uZXR4ZW5fbmljX21haW4uYyBiL2RyaXZlcnMvbmV0L25ldHhlbi9uZXR4ZW5fbmljX21haW4uYwppbmRleCBiYTAxNTI0Li5kODU0ZjA3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9uZXR4ZW4vbmV0eGVuX25pY19tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvbmV0eGVuL25ldHhlbl9uaWNfbWFpbi5jCkBAIC0zOSw3ICszOSw5IEBACiAjaW5jbHVkZSAibmV0eGVuX25pY19waGFuX3JlZy5oIgogCiAjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl92bGFuLmg+CiAjaW5jbHVkZSA8bmV0L2lwLmg+CisjaW5jbHVkZSA8bGludXgvaXB2Ni5oPgogCiBNT0RVTEVfREVTQ1JJUFRJT04oIk5ldFhlbiBNdWx0aSBwb3J0ICgxLzEwKSBHaWdhYml0IE5ldHdvcmsgRHJpdmVyIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CkBAIC0yNDIsNyArMjQ0LDcgQEAKIAljYXNlIE5FVFhFTl9CUkRUWVBFX1AzXzRfR0I6CiAJY2FzZSBORVRYRU5fQlJEVFlQRV9QM180X0dCX01NOgogCQlhZGFwdGVyLT5tc2l4X3N1cHBvcnRlZCA9ICEhdXNlX21zaV94OwotCQlhZGFwdGVyLT5tYXhfcnhfZGVzY19jb3VudCA9IE1BWF9SQ1ZfREVTQ1JJUFRPUlNfMTBHOworCQlhZGFwdGVyLT5tYXhfcnhfZGVzY19jb3VudCA9IE1BWF9SQ1ZfREVTQ1JJUFRPUlNfMUc7CiAJCWJyZWFrOwogCiAJY2FzZSBORVRYRU5fQlJEVFlQRV9QMl9TQjM1XzRHOgpAQCAtMjUxLDYgKzI1MywxNCBAQAogCQlhZGFwdGVyLT5tYXhfcnhfZGVzY19jb3VudCA9IE1BWF9SQ1ZfREVTQ1JJUFRPUlNfMUc7CiAJCWJyZWFrOwogCisJY2FzZSBORVRYRU5fQlJEVFlQRV9QM18xMEdfVFA6CisJCWFkYXB0ZXItPm1zaXhfc3VwcG9ydGVkID0gISF1c2VfbXNpX3g7CisJCWlmIChhZGFwdGVyLT5haHcuYm9hcmRfdHlwZSA9PSBORVRYRU5fTklDX1hHQkUpCisJCQlhZGFwdGVyLT5tYXhfcnhfZGVzY19jb3VudCA9IE1BWF9SQ1ZfREVTQ1JJUFRPUlNfMTBHOworCQllbHNlCisJCQlhZGFwdGVyLT5tYXhfcnhfZGVzY19jb3VudCA9IE1BWF9SQ1ZfREVTQ1JJUFRPUlNfMUc7CisJCWJyZWFrOworCiAJZGVmYXVsdDoKIAkJYWRhcHRlci0+bXNpeF9zdXBwb3J0ZWQgPSAwOwogCQlhZGFwdGVyLT5tYXhfcnhfZGVzY19jb3VudCA9IE1BWF9SQ1ZfREVTQ1JJUFRPUlNfMUc7CkBAIC0yNzEsMTAgKzI4MSwxNSBAQAogc3RhdGljIGludAogbmV0eGVuX2NoZWNrX2h3X2luaXQoc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyLCBpbnQgZmlyc3RfYm9vdCkKIHsKLQlpbnQgcmV0ID0gMDsKKwl1MzIgdmFsLCB0aW1lb3V0OwogCiAJaWYgKGZpcnN0X2Jvb3QgPT0gMHg1NTU1NTU1NSkgewogCQkvKiBUaGlzIGlzIHRoZSBmaXJzdCBib290IGFmdGVyIHBvd2VyIHVwICovCisJCWFkYXB0ZXItPnBjaV93cml0ZV9ub3JtYWxpemUoYWRhcHRlciwKKwkJCU5FVFhFTl9DQU1fUkFNKDB4MWZjKSwgTkVUWEVOX0JESU5GT19NQUdJQyk7CisKKwkJaWYgKCFOWF9JU19SRVZJU0lPTl9QMihhZGFwdGVyLT5haHcucmV2aXNpb25faWQpKQorCQkJcmV0dXJuIDA7CiAKIAkJLyogUENJIGJ1cyBtYXN0ZXIgd29ya2Fyb3VuZCAqLwogCQlhZGFwdGVyLT5od19yZWFkX3d4KGFkYXB0ZXIsCkBAIC0yOTQsMTggKzMwOSwyNiBAQAogCQkJLyogY2xlYXIgdGhlIHJlZ2lzdGVyIGZvciBmdXR1cmUgdW5sb2Fkcy9sb2FkcyAqLwogCQkJYWRhcHRlci0+cGNpX3dyaXRlX25vcm1hbGl6ZShhZGFwdGVyLAogCQkJCQlORVRYRU5fQ0FNX1JBTSgweDFmYyksIDApOwotCQkJcmV0ID0gLTE7CisJCQlyZXR1cm4gLUVJTzsKIAkJfQogCi0JCWlmIChOWF9JU19SRVZJU0lPTl9QMihhZGFwdGVyLT5haHcucmV2aXNpb25faWQpKSB7Ci0JCQkvKiBTdGFydCBQMiBib290IGxvYWRlciAqLwotCQkJYWRhcHRlci0+cGNpX3dyaXRlX25vcm1hbGl6ZShhZGFwdGVyLAotCQkJCU5FVFhFTl9DQU1fUkFNKDB4MWZjKSwgTkVUWEVOX0JESU5GT19NQUdJQyk7Ci0JCQlhZGFwdGVyLT5wY2lfd3JpdGVfbm9ybWFsaXplKGFkYXB0ZXIsCi0JCQkJCU5FVFhFTl9ST01VU0JfR0xCX1BFR1RVTkVfRE9ORSwgMSk7Ci0JCX0KKwkJLyogU3RhcnQgUDIgYm9vdCBsb2FkZXIgKi8KKwkJdmFsID0gYWRhcHRlci0+cGNpX3JlYWRfbm9ybWFsaXplKGFkYXB0ZXIsCisJCQkJTkVUWEVOX1JPTVVTQl9HTEJfUEVHVFVORV9ET05FKTsKKwkJYWRhcHRlci0+cGNpX3dyaXRlX25vcm1hbGl6ZShhZGFwdGVyLAorCQkJCU5FVFhFTl9ST01VU0JfR0xCX1BFR1RVTkVfRE9ORSwgdmFsIHwgMHgxKTsKKwkJdGltZW91dCA9IDA7CisJCWRvIHsKKwkJCW1zbGVlcCgxKTsKKwkJCXZhbCA9IGFkYXB0ZXItPnBjaV9yZWFkX25vcm1hbGl6ZShhZGFwdGVyLAorCQkJCQlORVRYRU5fQ0FNX1JBTSgweDFmYykpOworCisJCQlpZiAoKyt0aW1lb3V0ID4gNTAwMCkKKwkJCQlyZXR1cm4gLUVJTzsKKworCQl9IHdoaWxlICh2YWwgPT0gTkVUWEVOX0JESU5GT19NQUdJQyk7CiAJfQotCXJldHVybiByZXQ7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIG5ldHhlbl9zZXRfcG9ydF9tb2RlKHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlcikKQEAgLTc4NCw4ICs4MDcsOCBAQAogCQkJCQkJQ1JCX0NNRFBFR19TVEFURSwgMCk7CiAJCQluZXR4ZW5fcGluaXRfZnJvbV9yb20oYWRhcHRlciwgMCk7CiAJCQltc2xlZXAoMSk7Ci0JCQluZXR4ZW5fbG9hZF9maXJtd2FyZShhZGFwdGVyKTsKIAkJfQorCQluZXR4ZW5fbG9hZF9maXJtd2FyZShhZGFwdGVyKTsKIAogCQlpZiAoTlhfSVNfUkVWSVNJT05fUDMocmV2aXNpb25faWQpKQogCQkJbmV0eGVuX3BjaWVfc3RyYXBfaW5pdChhZGFwdGVyKTsKQEAgLTgwMSwxMyArODI0LDYgQEAKIAogCQl9CiAKLQkJaWYgKChmaXJzdF9ib290ID09IDB4NTU1NTU1NTUpICYmCi0JCQkoTlhfSVNfUkVWSVNJT05fUDIocmV2aXNpb25faWQpKSkgewotCQkJLyogVW5sb2NrIHRoZSBIVywgcHJvbXB0aW5nIHRoZSBib290IHNlcXVlbmNlICovCi0JCQlhZGFwdGVyLT5wY2lfd3JpdGVfbm9ybWFsaXplKGFkYXB0ZXIsCi0JCQkJCU5FVFhFTl9ST01VU0JfR0xCX1BFR1RVTkVfRE9ORSwgMSk7Ci0JCX0KLQogCQllcnIgPSBuZXR4ZW5faW5pdGlhbGl6ZV9hZGFwdGVyX29mZmxvYWQoYWRhcHRlcik7CiAJCWlmIChlcnIpCiAJCQlnb3RvIGVycl9vdXRfaW91bm1hcDsKQEAgLTgyMSw3ICs4MzcsOSBAQAogCQlhZGFwdGVyLT5wY2lfd3JpdGVfbm9ybWFsaXplKGFkYXB0ZXIsIENSQl9EUklWRVJfVkVSU0lPTiwgaSk7CiAKIAkJLyogSGFuZHNoYWtlIHdpdGggdGhlIGNhcmQgYmVmb3JlIHdlIHJlZ2lzdGVyIHRoZSBkZXZpY2VzLiAqLwotCQluZXR4ZW5fcGhhbnRvbV9pbml0KGFkYXB0ZXIsIE5FVFhFTl9OSUNfUEVHX1RVTkUpOworCQllcnIgPSBuZXR4ZW5fcGhhbnRvbV9pbml0KGFkYXB0ZXIsIE5FVFhFTl9OSUNfUEVHX1RVTkUpOworCQlpZiAoZXJyKQorCQkJZ290byBlcnJfb3V0X2ZyZWVfb2ZmbG9hZDsKIAogCX0JLyogZmlyc3RfZHJpdmVyICovCiAKQEAgLTkyNSw2ICs5NDMsNyBAQAogCWlmIChhZGFwdGVyLT5mbGFncyAmIE5FVFhFTl9OSUNfTVNJX0VOQUJMRUQpCiAJCXBjaV9kaXNhYmxlX21zaShwZGV2KTsKIAorZXJyX291dF9mcmVlX29mZmxvYWQ6CiAJaWYgKGZpcnN0X2RyaXZlcikKIAkJbmV0eGVuX2ZyZWVfYWRhcHRlcl9vZmZsb2FkKGFkYXB0ZXIpOwogCkBAIC05NjgsNiArOTg3LDkgQEAKIAkJbmV0eGVuX2ZyZWVfaHdfcmVzb3VyY2VzKGFkYXB0ZXIpOwogCQluZXR4ZW5fcmVsZWFzZV9yeF9idWZmZXJzKGFkYXB0ZXIpOwogCQluZXR4ZW5fZnJlZV9zd19yZXNvdXJjZXMoYWRhcHRlcik7CisKKwkJaWYgKE5YX0lTX1JFVklTSU9OX1AzKGFkYXB0ZXItPmFody5yZXZpc2lvbl9pZCkpCisJCQluZXR4ZW5fcDNfZnJlZV9tYWNfbGlzdChhZGFwdGVyKTsKIAl9CiAKIAlpZiAoYWRhcHRlci0+cG9ydG51bSA9PSAwKQpAQCAtOTgzLDggKzEwMDUsMTAgQEAKIAogCWlvdW5tYXAoYWRhcHRlci0+YWh3LmRiX2Jhc2UpOwogCWlvdW5tYXAoYWRhcHRlci0+YWh3LnBjaV9iYXNlMCk7Ci0JaW91bm1hcChhZGFwdGVyLT5haHcucGNpX2Jhc2UxKTsKLQlpb3VubWFwKGFkYXB0ZXItPmFody5wY2lfYmFzZTIpOworCWlmIChhZGFwdGVyLT5haHcucGNpX2Jhc2UxICE9IE5VTEwpCisJCWlvdW5tYXAoYWRhcHRlci0+YWh3LnBjaV9iYXNlMSk7CisJaWYgKGFkYXB0ZXItPmFody5wY2lfYmFzZTIgIT0gTlVMTCkKKwkJaW91bm1hcChhZGFwdGVyLT5haHcucGNpX2Jhc2UyKTsKIAogCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7CiAJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOwpAQCAtMTEzNywyOSArMTE2MSw2NCBAQAogCXJldHVybiAwOwogfQogCi12b2lkIG5ldHhlbl90c29fY2hlY2soc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyLAorc3RhdGljIGJvb2wgbmV0eGVuX3Rzb19jaGVjayhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAogCQkgICAgICBzdHJ1Y3QgY21kX2Rlc2NfdHlwZTAgKmRlc2MsIHN0cnVjdCBza19idWZmICpza2IpCiB7Ci0JaWYgKGRlc2MtPm1zcykgewotCQlkZXNjLT50b3RhbF9oZHJfbGVuZ3RoID0gKHNpemVvZihzdHJ1Y3QgZXRoaGRyKSArCi0JCQkJCSAgaXBfaGRybGVuKHNrYikgKyB0Y3BfaGRybGVuKHNrYikpOworCWJvb2wgdHNvID0gZmFsc2U7CisJdTggb3Bjb2RlID0gVFhfRVRIRVJfUEtUOwogCi0JCWlmICgoTlhfSVNfUkVWSVNJT05fUDMoYWRhcHRlci0+YWh3LnJldmlzaW9uX2lkKSkgJiYKLQkJCQkoc2tiLT5wcm90b2NvbCA9PSBodG9ucyhFVEhfUF9JUFY2KSkpCi0JCQluZXR4ZW5fc2V0X2NtZF9kZXNjX29wY29kZShkZXNjLCBUWF9UQ1BfTFNPNik7Ci0JCWVsc2UKLQkJCW5ldHhlbl9zZXRfY21kX2Rlc2Nfb3Bjb2RlKGRlc2MsIFRYX1RDUF9MU08pOworCWlmICgobmV0ZGV2LT5mZWF0dXJlcyAmIChORVRJRl9GX1RTTyB8IE5FVElGX0ZfVFNPNikpICYmCisJCQlza2Jfc2hpbmZvKHNrYiktPmdzb19zaXplID4gMCkgeworCisJCWRlc2MtPm1zcyA9IGNwdV90b19sZTE2KHNrYl9zaGluZm8oc2tiKS0+Z3NvX3NpemUpOworCQlkZXNjLT50b3RhbF9oZHJfbGVuZ3RoID0KKwkJCXNrYl90cmFuc3BvcnRfb2Zmc2V0KHNrYikgKyB0Y3BfaGRybGVuKHNrYik7CisKKwkJb3Bjb2RlID0gKHNrYi0+cHJvdG9jb2wgPT0gaHRvbnMoRVRIX1BfSVBWNikpID8KKwkJCQlUWF9UQ1BfTFNPNiA6IFRYX1RDUF9MU087CisJCXRzbyA9IHRydWU7CiAKIAl9IGVsc2UgaWYgKHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX1BBUlRJQUwpIHsKLQkJaWYgKGlwX2hkcihza2IpLT5wcm90b2NvbCA9PSBJUFBST1RPX1RDUCkKLQkJCW5ldHhlbl9zZXRfY21kX2Rlc2Nfb3Bjb2RlKGRlc2MsIFRYX1RDUF9QS1QpOwotCQllbHNlIGlmIChpcF9oZHIoc2tiKS0+cHJvdG9jb2wgPT0gSVBQUk9UT19VRFApCi0JCQluZXR4ZW5fc2V0X2NtZF9kZXNjX29wY29kZShkZXNjLCBUWF9VRFBfUEtUKTsKLQkJZWxzZQotCQkJcmV0dXJuOworCQl1OCBsNHByb3RvOworCisJCWlmIChza2ItPnByb3RvY29sID09IGh0b25zKEVUSF9QX0lQKSkgeworCQkJbDRwcm90byA9IGlwX2hkcihza2IpLT5wcm90b2NvbDsKKworCQkJaWYgKGw0cHJvdG8gPT0gSVBQUk9UT19UQ1ApCisJCQkJb3Bjb2RlID0gVFhfVENQX1BLVDsKKwkJCWVsc2UgaWYobDRwcm90byA9PSBJUFBST1RPX1VEUCkKKwkJCQlvcGNvZGUgPSBUWF9VRFBfUEtUOworCQl9IGVsc2UgaWYgKHNrYi0+cHJvdG9jb2wgPT0gaHRvbnMoRVRIX1BfSVBWNikpIHsKKwkJCWw0cHJvdG8gPSBpcHY2X2hkcihza2IpLT5uZXh0aGRyOworCisJCQlpZiAobDRwcm90byA9PSBJUFBST1RPX1RDUCkKKwkJCQlvcGNvZGUgPSBUWF9UQ1BWNl9QS1Q7CisJCQllbHNlIGlmKGw0cHJvdG8gPT0gSVBQUk9UT19VRFApCisJCQkJb3Bjb2RlID0gVFhfVURQVjZfUEtUOworCQl9CiAJfQogCWRlc2MtPnRjcF9oZHJfb2Zmc2V0ID0gc2tiX3RyYW5zcG9ydF9vZmZzZXQoc2tiKTsKIAlkZXNjLT5pcF9oZHJfb2Zmc2V0ID0gc2tiX25ldHdvcmtfb2Zmc2V0KHNrYik7CisJbmV0eGVuX3NldF90eF9mbGFnc19vcGNvZGUoZGVzYywgMCwgb3Bjb2RlKTsKKwlyZXR1cm4gdHNvOworfQorCitzdGF0aWMgdm9pZAorbmV0eGVuX2NsZWFuX3R4X2RtYV9tYXBwaW5nKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQlzdHJ1Y3QgbmV0eGVuX2NtZF9idWZmZXIgKnBidWYsIGludCBsYXN0KQoreworCWludCBrOworCXN0cnVjdCBuZXR4ZW5fc2tiX2ZyYWcgKmJ1ZmZyYWc7CisKKwlidWZmcmFnID0gJnBidWYtPmZyYWdfYXJyYXlbMF07CisJcGNpX3VubWFwX3NpbmdsZShwZGV2LCBidWZmcmFnLT5kbWEsCisJCQlidWZmcmFnLT5sZW5ndGgsIFBDSV9ETUFfVE9ERVZJQ0UpOworCisJZm9yIChrID0gMTsgayA8IGxhc3Q7IGsrKykgeworCQlidWZmcmFnID0gJnBidWYtPmZyYWdfYXJyYXlba107CisJCXBjaV91bm1hcF9wYWdlKHBkZXYsIGJ1ZmZyYWctPmRtYSwKKwkJCWJ1ZmZyYWctPmxlbmd0aCwgUENJX0RNQV9UT0RFVklDRSk7CisJfQogfQogCiBzdGF0aWMgaW50IG5ldHhlbl9uaWNfeG1pdF9mcmFtZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQpAQCAtMTE2NywzMyArMTIyNiwyMiBAQAogCXN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CiAJc3RydWN0IG5ldHhlbl9oYXJkd2FyZV9jb250ZXh0ICpodyA9ICZhZGFwdGVyLT5haHc7CiAJdW5zaWduZWQgaW50IGZpcnN0X3NlZ19sZW4gPSBza2ItPmxlbiAtIHNrYi0+ZGF0YV9sZW47CisJc3RydWN0IG5ldHhlbl9jbWRfYnVmZmVyICpwYnVmOwogCXN0cnVjdCBuZXR4ZW5fc2tiX2ZyYWcgKmJ1ZmZyYWc7Ci0JdW5zaWduZWQgaW50IGk7CisJc3RydWN0IGNtZF9kZXNjX3R5cGUwICpod2Rlc2M7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBhZGFwdGVyLT5wZGV2OworCWRtYV9hZGRyX3QgdGVtcF9kbWE7CisJaW50IGksIGs7CiAKIAl1MzIgcHJvZHVjZXIsIGNvbnN1bWVyOwotCXUzMiBzYXZlZF9wcm9kdWNlciA9IDA7Ci0Jc3RydWN0IGNtZF9kZXNjX3R5cGUwICpod2Rlc2M7Ci0JaW50IGs7Ci0Jc3RydWN0IG5ldHhlbl9jbWRfYnVmZmVyICpwYnVmID0gTlVMTDsKLQlpbnQgZnJhZ19jb3VudDsKLQlpbnQgbm9fb2ZfZGVzYzsKKwlpbnQgZnJhZ19jb3VudCwgbm9fb2ZfZGVzYzsKIAl1MzIgbnVtX3R4ZCA9IGFkYXB0ZXItPm1heF90eF9kZXNjX2NvdW50OworCWJvb2wgaXNfdHNvID0gZmFsc2U7CiAKIAlmcmFnX2NvdW50ID0gc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFncyArIDE7CiAKIAkvKiBUaGVyZSA0IGZyYWdtZW50cyBwZXIgZGVzY3JpcHRvciAqLwogCW5vX29mX2Rlc2MgPSAoZnJhZ19jb3VudCArIDMpID4+IDI7Ci0JaWYgKG5ldGRldi0+ZmVhdHVyZXMgJiAoTkVUSUZfRl9UU08gfCBORVRJRl9GX1RTTzYpKSB7Ci0JCWlmIChza2Jfc2hpbmZvKHNrYiktPmdzb19zaXplID4gMCkgewotCi0JCQlub19vZl9kZXNjKys7Ci0JCQlpZiAoKGlwX2hkcmxlbihza2IpICsgdGNwX2hkcmxlbihza2IpICsKLQkJCSAgICAgc2l6ZW9mKHN0cnVjdCBldGhoZHIpKSA+Ci0JCQkgICAgKHNpemVvZihzdHJ1Y3QgY21kX2Rlc2NfdHlwZTApIC0gMikpIHsKLQkJCQlub19vZl9kZXNjKys7Ci0JCQl9Ci0JCX0KLQl9CiAKIAlwcm9kdWNlciA9IGFkYXB0ZXItPmNtZF9wcm9kdWNlcjsKIAlzbXBfbWIoKTsKQEAgLTEyMDUsMzQgKzEyNTMsMjYgQEAKIAl9CiAKIAkvKiBDb3B5IHRoZSBkZXNjcmlwdG9ycyBpbnRvIHRoZSBoYXJkd2FyZSAgICAqLwotCXNhdmVkX3Byb2R1Y2VyID0gcHJvZHVjZXI7CiAJaHdkZXNjID0gJmh3LT5jbWRfZGVzY19oZWFkW3Byb2R1Y2VyXTsKIAltZW1zZXQoaHdkZXNjLCAwLCBzaXplb2Yoc3RydWN0IGNtZF9kZXNjX3R5cGUwKSk7CiAJLyogVGFrZSBza2ItPmRhdGEgaXRzZWxmICovCiAJcGJ1ZiA9ICZhZGFwdGVyLT5jbWRfYnVmX2Fycltwcm9kdWNlcl07Ci0JaWYgKChuZXRkZXYtPmZlYXR1cmVzICYgKE5FVElGX0ZfVFNPIHwgTkVUSUZfRl9UU082KSkgJiYKLQkJCXNrYl9zaGluZm8oc2tiKS0+Z3NvX3NpemUgPiAwKSB7Ci0JCXBidWYtPm1zcyA9IHNrYl9zaGluZm8oc2tiKS0+Z3NvX3NpemU7Ci0JCWh3ZGVzYy0+bXNzID0gY3B1X3RvX2xlMTYoc2tiX3NoaW5mbyhza2IpLT5nc29fc2l6ZSk7Ci0JfSBlbHNlIHsKLQkJcGJ1Zi0+bXNzID0gMDsKLQkJaHdkZXNjLT5tc3MgPSAwOwotCX0KLQlwYnVmLT50b3RhbF9sZW5ndGggPSBza2ItPmxlbjsKLQlwYnVmLT5za2IgPSBza2I7Ci0JcGJ1Zi0+Y21kID0gVFhfRVRIRVJfUEtUOwotCXBidWYtPmZyYWdfY291bnQgPSBmcmFnX2NvdW50OwotCXBidWYtPnBvcnQgPSBhZGFwdGVyLT5wb3J0bnVtOwotCWJ1ZmZyYWcgPSAmcGJ1Zi0+ZnJhZ19hcnJheVswXTsKLQlidWZmcmFnLT5kbWEgPSBwY2lfbWFwX3NpbmdsZShhZGFwdGVyLT5wZGV2LCBza2ItPmRhdGEsIGZpcnN0X3NlZ19sZW4sCi0JCQkJICAgICAgUENJX0RNQV9UT0RFVklDRSk7Ci0JYnVmZnJhZy0+bGVuZ3RoID0gZmlyc3Rfc2VnX2xlbjsKLQluZXR4ZW5fc2V0X2NtZF9kZXNjX3RvdGFsbGVuZ3RoKGh3ZGVzYywgc2tiLT5sZW4pOwotCW5ldHhlbl9zZXRfY21kX2Rlc2NfbnVtX29mX2J1ZmYoaHdkZXNjLCBmcmFnX2NvdW50KTsKLQluZXR4ZW5fc2V0X2NtZF9kZXNjX29wY29kZShod2Rlc2MsIFRYX0VUSEVSX1BLVCk7CiAKLQluZXR4ZW5fc2V0X2NtZF9kZXNjX3BvcnQoaHdkZXNjLCBhZGFwdGVyLT5wb3J0bnVtKTsKLQluZXR4ZW5fc2V0X2NtZF9kZXNjX2N0eGlkKGh3ZGVzYywgYWRhcHRlci0+cG9ydG51bSk7CisJaXNfdHNvID0gbmV0eGVuX3Rzb19jaGVjayhuZXRkZXYsIGh3ZGVzYywgc2tiKTsKKworCXBidWYtPnNrYiA9IHNrYjsKKwlwYnVmLT5mcmFnX2NvdW50ID0gZnJhZ19jb3VudDsKKwlidWZmcmFnID0gJnBidWYtPmZyYWdfYXJyYXlbMF07CisJdGVtcF9kbWEgPSBwY2lfbWFwX3NpbmdsZShwZGV2LCBza2ItPmRhdGEsIGZpcnN0X3NlZ19sZW4sCisJCQkJICAgICAgUENJX0RNQV9UT0RFVklDRSk7CisJaWYgKHBjaV9kbWFfbWFwcGluZ19lcnJvcihwZGV2LCB0ZW1wX2RtYSkpCisJCWdvdG8gZHJvcF9wYWNrZXQ7CisKKwlidWZmcmFnLT5kbWEgPSB0ZW1wX2RtYTsKKwlidWZmcmFnLT5sZW5ndGggPSBmaXJzdF9zZWdfbGVuOworCW5ldHhlbl9zZXRfdHhfZnJhZ3NfbGVuKGh3ZGVzYywgZnJhZ19jb3VudCwgc2tiLT5sZW4pOworCW5ldHhlbl9zZXRfdHhfcG9ydChod2Rlc2MsIGFkYXB0ZXItPnBvcnRudW0pOworCiAJaHdkZXNjLT5idWZmZXIxX2xlbmd0aCA9IGNwdV90b19sZTE2KGZpcnN0X3NlZ19sZW4pOwogCWh3ZGVzYy0+YWRkcl9idWZmZXIxID0gY3B1X3RvX2xlNjQoYnVmZnJhZy0+ZG1hKTsKIApAQCAtMTI0MCw3ICsxMjgwLDYgQEAKIAkJc3RydWN0IHNrYl9mcmFnX3N0cnVjdCAqZnJhZzsKIAkJaW50IGxlbiwgdGVtcF9sZW47CiAJCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OwotCQlkbWFfYWRkcl90IHRlbXBfZG1hOwogCiAJCS8qIG1vdmUgdG8gbmV4dCBkZXNjLiBpZiB0aGVyZSBpcyBhIG5lZWQgKi8KIAkJaWYgKChpICYgMHgzKSA9PSAwKSB7CkBAIC0xMjU2LDggKzEyOTUsMTIgQEAKIAkJb2Zmc2V0ID0gZnJhZy0+cGFnZV9vZmZzZXQ7CiAKIAkJdGVtcF9sZW4gPSBsZW47Ci0JCXRlbXBfZG1hID0gcGNpX21hcF9wYWdlKGFkYXB0ZXItPnBkZXYsIGZyYWctPnBhZ2UsIG9mZnNldCwKKwkJdGVtcF9kbWEgPSBwY2lfbWFwX3BhZ2UocGRldiwgZnJhZy0+cGFnZSwgb2Zmc2V0LAogCQkJCQlsZW4sIFBDSV9ETUFfVE9ERVZJQ0UpOworCQlpZiAocGNpX2RtYV9tYXBwaW5nX2Vycm9yKHBkZXYsIHRlbXBfZG1hKSkgeworCQkJbmV0eGVuX2NsZWFuX3R4X2RtYV9tYXBwaW5nKHBkZXYsIHBidWYsIGkpOworCQkJZ290byBkcm9wX3BhY2tldDsKKwkJfQogCiAJCWJ1ZmZyYWcrKzsKIAkJYnVmZnJhZy0+ZG1hID0gdGVtcF9kbWE7CkBAIC0xMjg1LDE2ICsxMzI4LDEyIEBACiAJfQogCXByb2R1Y2VyID0gZ2V0X25leHRfaW5kZXgocHJvZHVjZXIsIG51bV90eGQpOwogCi0JLyogbWlnaHQgY2hhbmdlIG9wY29kZSB0byBUWF9UQ1BfTFNPICovCi0JbmV0eGVuX3Rzb19jaGVjayhhZGFwdGVyLCAmaHctPmNtZF9kZXNjX2hlYWRbc2F2ZWRfcHJvZHVjZXJdLCBza2IpOwotCiAJLyogRm9yIExTTywgd2UgbmVlZCB0byBjb3B5IHRoZSBNQUMvSVAvVENQIGhlYWRlcnMgaW50bwogCSAqIHRoZSBkZXNjcmlwdG9yIHJpbmcKIAkgKi8KLQlpZiAobmV0eGVuX2dldF9jbWRfZGVzY19vcGNvZGUoJmh3LT5jbWRfZGVzY19oZWFkW3NhdmVkX3Byb2R1Y2VyXSkKLQkgICAgPT0gVFhfVENQX0xTTykgeworCWlmIChpc190c28pIHsKIAkJaW50IGhkcl9sZW4sIGZpcnN0X2hkcl9sZW4sIG1vcmVfaGRyOwotCQloZHJfbGVuID0gaHctPmNtZF9kZXNjX2hlYWRbc2F2ZWRfcHJvZHVjZXJdLnRvdGFsX2hkcl9sZW5ndGg7CisJCWhkcl9sZW4gPSBza2JfdHJhbnNwb3J0X29mZnNldChza2IpICsgdGNwX2hkcmxlbihza2IpOwogCQlpZiAoaGRyX2xlbiA+IChzaXplb2Yoc3RydWN0IGNtZF9kZXNjX3R5cGUwKSAtIDIpKSB7CiAJCQlmaXJzdF9oZHJfbGVuID0gc2l6ZW9mKHN0cnVjdCBjbWRfZGVzY190eXBlMCkgLSAyOwogCQkJbW9yZV9oZHIgPSAxOwpAQCAtMTMzNiw2ICsxMzc1LDExIEBACiAJbmV0ZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CiAKIAlyZXR1cm4gTkVUREVWX1RYX09LOworCitkcm9wX3BhY2tldDoKKwlhZGFwdGVyLT5zdGF0cy50eGRyb3BwZWQrKzsKKwlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCXJldHVybiBORVRERVZfVFhfT0s7CiB9CiAKIHN0YXRpYyBpbnQgbmV0eGVuX25pY19jaGVja190ZW1wKHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlcikKQEAgLTE0MDcsNiArMTQ1MSw4IEBACiAJCQluZXRpZl9jYXJyaWVyX29mZihuZXRkZXYpOwogCQkJbmV0aWZfc3RvcF9xdWV1ZShuZXRkZXYpOwogCQl9CisKKwkJbmV0eGVuX25pY19zZXRfbGlua19wYXJhbWV0ZXJzKGFkYXB0ZXIpOwogCX0gZWxzZSBpZiAoIWFkYXB0ZXItPmFody5saW5rdXAgJiYgbGlua3VwKSB7CiAJCXByaW50ayhLRVJOX0lORk8gIiVzOiAlcyBOSUMgTGluayBpcyB1cFxuIiwKIAkJICAgICAgIG5ldHhlbl9uaWNfZHJpdmVyX25hbWUsIG5ldGRldi0+bmFtZSk7CkBAIC0xNDE1LDYgKzE0NjEsOCBAQAogCQkJbmV0aWZfY2Fycmllcl9vbihuZXRkZXYpOwogCQkJbmV0aWZfd2FrZV9xdWV1ZShuZXRkZXYpOwogCQl9CisKKwkJbmV0eGVuX25pY19zZXRfbGlua19wYXJhbWV0ZXJzKGFkYXB0ZXIpOwogCX0KIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbnM4MzgyMC5jIGIvZHJpdmVycy9uZXQvbnM4MzgyMC5jCmluZGV4IDQ2YjA3NzIuLmU4MDI5NGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L25zODM4MjAuYworKysgYi9kcml2ZXJzL25ldC9uczgzODIwLmMKQEAgLTE5NTYsNyArMTk1NiwxMSBAQAogCS5uZG9fY2hhbmdlX210dQkJPSBuczgzODIwX2NoYW5nZV9tdHUsCiAJLm5kb19zZXRfbXVsdGljYXN0X2xpc3QgPSBuczgzODIwX3NldF9tdWx0aWNhc3QsCiAJLm5kb192YWxpZGF0ZV9hZGRyCT0gZXRoX3ZhbGlkYXRlX2FkZHIsCisJLm5kb19zZXRfbWFjX2FkZHJlc3MgCT0gZXRoX21hY19hZGRyLAogCS5uZG9fdHhfdGltZW91dAkJPSBuczgzODIwX3R4X3RpbWVvdXQsCisjaWZkZWYgTlM4MzgyMF9WTEFOX0FDQ0VMX1NVUFBPUlQKKwkubmRvX3ZsYW5fcnhfcmVnaXN0ZXIJPSBuczgzODIwX3ZsYW5fcnhfcmVnaXN0ZXIsCisjZW5kaWYKIH07CiAKIHN0YXRpYyBpbnQgX19kZXZpbml0IG5zODM4MjBfaW5pdF9vbmUoc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYsCkBAIC0yMjE2LDcgKzIyMjAsNiBAQAogI2lmZGVmIE5TODM4MjBfVkxBTl9BQ0NFTF9TVVBQT1JUCiAJLyogV2UgYWxzbyBzdXBwb3J0IGhhcmR3YXJlIHZsYW4gYWNjZWxlcmF0aW9uICovCiAJbmRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9IV19WTEFOX1RYIHwgTkVUSUZfRl9IV19WTEFOX1JYOwotCW5kZXYtPnZsYW5fcnhfcmVnaXN0ZXIgPSBuczgzODIwX3ZsYW5fcnhfcmVnaXN0ZXI7CiAjZW5kaWYKIAogCWlmICh1c2luZ19kYWMpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3Bhc2VtaV9tYWMuYyBiL2RyaXZlcnMvbmV0L3Bhc2VtaV9tYWMuYwppbmRleCA1YjdhNTc0Li5kMDM0OWU3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9wYXNlbWlfbWFjLmMKKysrIGIvZHJpdmVycy9uZXQvcGFzZW1pX21hYy5jCkBAIC03MTIsNyArNzEyLDcgQEAKIAlyY21kc3RhID0gcmVhZF9kbWFfcmVnKFBBU19ETUFfUlhJTlRfUkNNRFNUQShtYWMtPmRtYV9pZikpOwogCWNjbWRzdGEgPSByZWFkX2RtYV9yZWcoUEFTX0RNQV9SWENIQU5fQ0NNRFNUQShjaGFuLT5jaG5vKSk7CiAKLQlwcmludGsoS0VSTl9FUlIgInBhc2VtaV9tYWM6IHJ4IGVycm9yLiBtYWNyeCAlMDE2bHgsIHJ4IHN0YXR1cyAlbHhcbiIsCisJcHJpbnRrKEtFUk5fRVJSICJwYXNlbWlfbWFjOiByeCBlcnJvci4gbWFjcnggJTAxNmxseCwgcnggc3RhdHVzICVsbHhcbiIsCiAJCW1hY3J4LCAqY2hhbi0+c3RhdHVzKTsKIAogCXByaW50ayhLRVJOX0VSUiAicGFzZW1pX21hYzogcmNtZHN0YSAlMDh4IGNjbWRzdGEgJTA4eFxuIiwKQEAgLTczMCw4ICs3MzAsOCBAQAogCiAJY21kc3RhID0gcmVhZF9kbWFfcmVnKFBBU19ETUFfVFhDSEFOX1RDTURTVEEoY2hhbi0+Y2hubykpOwogCi0JcHJpbnRrKEtFUk5fRVJSICJwYXNlbWlfbWFjOiB0eCBlcnJvci4gbWFjdHggMHglMDE2bHgsICJcCi0JCSJ0eCBzdGF0dXMgMHglMDE2bHhcbiIsIG1hY3R4LCAqY2hhbi0+c3RhdHVzKTsKKwlwcmludGsoS0VSTl9FUlIgInBhc2VtaV9tYWM6IHR4IGVycm9yLiBtYWN0eCAweCUwMTZsbHgsICJcCisJCSJ0eCBzdGF0dXMgMHglMDE2bGx4XG4iLCBtYWN0eCwgKmNoYW4tPnN0YXR1cyk7CiAKIAlwcmludGsoS0VSTl9FUlIgInBhc2VtaV9tYWM6IHRjbWRzdGEgMHglMDh4XG4iLCBjbWRzdGEpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcGNuZXQzMi5jIGIvZHJpdmVycy9uZXQvcGNuZXQzMi5jCmluZGV4IDA0NGI3YjAuLjY2NWE0MjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3BjbmV0MzIuYworKysgYi9kcml2ZXJzL25ldC9wY25ldDMyLmMKQEAgLTE1NjgsNiArMTU2OCwyMiBAQAogCXJldHVybiBlcnI7CiB9CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgcGNuZXQzMl9uZXRkZXZfb3BzID0geworCS5uZG9fb3BlbgkJPSBwY25ldDMyX29wZW4sCisJLm5kb19zdG9wIAkJPSBwY25ldDMyX2Nsb3NlLAorCS5uZG9fc3RhcnRfeG1pdAkJPSBwY25ldDMyX3N0YXJ0X3htaXQsCisJLm5kb190eF90aW1lb3V0CQk9IHBjbmV0MzJfdHhfdGltZW91dCwKKwkubmRvX2dldF9zdGF0cwkJPSBwY25ldDMyX2dldF9zdGF0cywKKwkubmRvX3NldF9tdWx0aWNhc3RfbGlzdCA9IHBjbmV0MzJfc2V0X211bHRpY2FzdF9saXN0LAorCS5uZG9fZG9faW9jdGwJCT0gcGNuZXQzMl9pb2N0bCwKKwkubmRvX2NoYW5nZV9tdHUJCT0gZXRoX2NoYW5nZV9tdHUsCisJLm5kb19zZXRfbWFjX2FkZHJlc3MgCT0gZXRoX21hY19hZGRyLAorCS5uZG9fdmFsaWRhdGVfYWRkcgk9IGV0aF92YWxpZGF0ZV9hZGRyLAorI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCisJLm5kb19wb2xsX2NvbnRyb2xsZXIJPSBwY25ldDMyX3BvbGxfY29udHJvbGxlciwKKyNlbmRpZgorfTsKKwogLyogcGNuZXQzMl9wcm9iZTEKICAqICBDYWxsZWQgZnJvbSBib3RoIHBjbmV0MzJfcHJvYmVfdmxidXMgYW5kIHBjbmV0X3Byb2JlX3BjaS4KICAqICBwZGV2IHdpbGwgYmUgTlVMTCB3aGVuIGNhbGxlZCBmcm9tIHBjbmV0MzJfcHJvYmVfdmxidXMuCkBAIC0xOTM0LDIwICsxOTUwLDEwIEBACiAJbHAtPndhdGNoZG9nX3RpbWVyLmZ1bmN0aW9uID0gKHZvaWQgKikmcGNuZXQzMl93YXRjaGRvZzsKIAogCS8qIFRoZSBQQ05FVDMyLXNwZWNpZmljIGVudHJpZXMgaW4gdGhlIGRldmljZSBzdHJ1Y3R1cmUuICovCi0JZGV2LT5vcGVuID0gJnBjbmV0MzJfb3BlbjsKLQlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9ICZwY25ldDMyX3N0YXJ0X3htaXQ7Ci0JZGV2LT5zdG9wID0gJnBjbmV0MzJfY2xvc2U7Ci0JZGV2LT5nZXRfc3RhdHMgPSAmcGNuZXQzMl9nZXRfc3RhdHM7Ci0JZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSAmcGNuZXQzMl9zZXRfbXVsdGljYXN0X2xpc3Q7Ci0JZGV2LT5kb19pb2N0bCA9ICZwY25ldDMyX2lvY3RsOworCWRldi0+bmV0ZGV2X29wcyA9ICZwY25ldDMyX25ldGRldl9vcHM7CiAJZGV2LT5ldGh0b29sX29wcyA9ICZwY25ldDMyX2V0aHRvb2xfb3BzOwotCWRldi0+dHhfdGltZW91dCA9IHBjbmV0MzJfdHhfdGltZW91dDsKIAlkZXYtPndhdGNoZG9nX3RpbWVvID0gKDUgKiBIWik7CiAKLSNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgotCWRldi0+cG9sbF9jb250cm9sbGVyID0gcGNuZXQzMl9wb2xsX2NvbnRyb2xsZXI7Ci0jZW5kaWYKLQogCS8qIEZpbGwgaW4gdGhlIGdlbmVyaWMgZmllbGRzIG9mIHRoZSBkZXZpY2Ugc3RydWN0dXJlLiAqLwogCWlmIChyZWdpc3Rlcl9uZXRkZXYoZGV2KSkKIAkJZ290byBlcnJfZnJlZV9yaW5nOwpAQCAtMjI3Niw3ICsyMjgyLDcgQEAKIAlpZiAobHAtPmNoaXBfdmVyc2lvbiA+PSBQQ05FVDMyXzc5Qzk3MEEpIHsKIAkJLyogUHJpbnQgdGhlIGxpbmsgc3RhdHVzIGFuZCBzdGFydCB0aGUgd2F0Y2hkb2cgKi8KIAkJcGNuZXQzMl9jaGVja19tZWRpYShkZXYsIDEpOwotCQltb2RfdGltZXIoJihscC0+d2F0Y2hkb2dfdGltZXIpLCBQQ05FVDMyX1dBVENIRE9HX1RJTUVPVVQpOworCQltb2RfdGltZXIoJmxwLT53YXRjaGRvZ190aW1lciwgUENORVQzMl9XQVRDSERPR19USU1FT1VUKTsKIAl9CiAKIAlpID0gMDsKQEAgLTI5MTEsNyArMjkxNyw3IEBACiAJcGNuZXQzMl9jaGVja19tZWRpYShkZXYsIDApOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT5sb2NrLCBmbGFncyk7CiAKLQltb2RfdGltZXIoJihscC0+d2F0Y2hkb2dfdGltZXIpLCBQQ05FVDMyX1dBVENIRE9HX1RJTUVPVVQpOworCW1vZF90aW1lcigmbHAtPndhdGNoZG9nX3RpbWVyLCByb3VuZF9qaWZmaWVzKFBDTkVUMzJfV0FUQ0hET0dfVElNRU9VVCkpOwogfQogCiBzdGF0aWMgaW50IHBjbmV0MzJfcG1fc3VzcGVuZChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcGh5L3BoeV9kZXZpY2UuYyBiL2RyaXZlcnMvbmV0L3BoeS9waHlfZGV2aWNlLmMKaW5kZXggZTM1NDYwMS4uMGEwNmU0ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvcGh5L3BoeV9kZXZpY2UuYworKysgYi9kcml2ZXJzL25ldC9waHkvcGh5X2RldmljZS5jCkBAIC0yMzEsMTUgKzIzMSw2IEBACiAJaWYgKChwaHlfaWQgJiAweDFmZmZmZmZmKSA9PSAweDFmZmZmZmZmKQogCQlyZXR1cm4gTlVMTDsKIAotCS8qCi0JICogQnJva2VuIGhhcmR3YXJlIGlzIHNvbWV0aW1lcyBtaXNzaW5nIHRoZSBwdWxsLXVwIHJlc2lzdG9yIG9uIHRoZQotCSAqIE1ESU8gbGluZSwgd2hpY2ggcmVzdWx0cyBpbiByZWFkcyB0byBub24tZXhpc3RlbnQgZGV2aWNlcyByZXR1cm5pbmcKLQkgKiAwIHJhdGhlciB0aGFuIDB4ZmZmZi4gQ2F0Y2ggdGhpcyBoZXJlIGFuZCB0cmVhdCAwIGFzIGEgbm9uLWV4aXN0ZW50Ci0JICogZGV2aWNlIGFzIHdlbGwuCi0JICovCi0JaWYgKHBoeV9pZCA9PSAwKQotCQlyZXR1cm4gTlVMTDsKLQogCWRldiA9IHBoeV9kZXZpY2VfY3JlYXRlKGJ1cywgYWRkciwgcGh5X2lkKTsKIAogCXJldHVybiBkZXY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9wbGlwLmMgYi9kcml2ZXJzL25ldC9wbGlwLmMKaW5kZXggMGM0NmQ2MC4uMGJlMGYwYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvcGxpcC5jCisrKyBiL2RyaXZlcnMvbmV0L3BsaXAuYwpAQCAtMjY1LDYgKzI2NSwxMyBAQAogCS5jYWNoZSAgPSBwbGlwX2hhcmRfaGVhZGVyX2NhY2hlLAogfTsKIAorc3RhdGljIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyBwbGlwX25ldGRldl9vcHMgPSB7CisJLm5kb19vcGVuCQkgPSBwbGlwX29wZW4sCisJLm5kb19zdG9wCQkgPSBwbGlwX2Nsb3NlLAorCS5uZG9fc3RhcnRfeG1pdAkJID0gcGxpcF90eF9wYWNrZXQsCisJLm5kb19kb19pb2N0bAkJID0gcGxpcF9pb2N0bCwKK307CisKIC8qIEVudHJ5IHBvaW50IG9mIFBMSVAgZHJpdmVyLgogICAgUHJvYmUgdGhlIGhhcmR3YXJlLCBhbmQgcmVnaXN0ZXIvaW5pdGlhbGl6ZSB0aGUgZHJpdmVyLgogCkBAIC0yODAsMTUgKzI4NywxMSBAQAogCXN0cnVjdCBuZXRfbG9jYWwgKm5sID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAogCS8qIFRoZW4sIG92ZXJyaWRlIHBhcnRzIG9mIGl0ICovCi0JZGV2LT5oYXJkX3N0YXJ0X3htaXQJID0gcGxpcF90eF9wYWNrZXQ7Ci0JZGV2LT5vcGVuCQkgPSBwbGlwX29wZW47Ci0JZGV2LT5zdG9wCQkgPSBwbGlwX2Nsb3NlOwotCWRldi0+ZG9faW9jdGwJCSA9IHBsaXBfaW9jdGw7Ci0KIAlkZXYtPnR4X3F1ZXVlX2xlbiAJID0gMTA7CiAJZGV2LT5mbGFncwkgICAgICAgICA9IElGRl9QT0lOVE9QT0lOVHxJRkZfTk9BUlA7CiAJbWVtc2V0KGRldi0+ZGV2X2FkZHIsIDB4ZmMsIEVUSF9BTEVOKTsKIAorCWRldi0+bmV0ZGV2X29wcwkJID0gJnBsaXBfbmV0ZGV2X29wczsKIAlkZXYtPmhlYWRlcl9vcHMgICAgICAgICAgPSAmcGxpcF9oZWFkZXJfb3BzOwogCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3BwcF9nZW5lcmljLmMgYi9kcml2ZXJzL25ldC9wcHBfZ2VuZXJpYy5jCmluZGV4IDA2YjQ0ODIuLjdiMjcyOGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3BwcF9nZW5lcmljLmMKKysrIGIvZHJpdmVycy9uZXQvcHBwX2dlbmVyaWMuYwpAQCAtMjUwLDYgKzI1MCw3IEBACiBzdGF0aWMgaW50IHBwcF9kaXNjb25uZWN0X2NoYW5uZWwoc3RydWN0IGNoYW5uZWwgKnBjaCk7CiBzdGF0aWMgdm9pZCBwcHBfZGVzdHJveV9jaGFubmVsKHN0cnVjdCBjaGFubmVsICpwY2gpOwogc3RhdGljIGludCB1bml0X2dldChzdHJ1Y3QgaWRyICpwLCB2b2lkICpwdHIpOworc3RhdGljIGludCB1bml0X3NldChzdHJ1Y3QgaWRyICpwLCB2b2lkICpwdHIsIGludCBuKTsKIHN0YXRpYyB2b2lkIHVuaXRfcHV0KHN0cnVjdCBpZHIgKnAsIGludCBuKTsKIHN0YXRpYyB2b2lkICp1bml0X2ZpbmQoc3RydWN0IGlkciAqcCwgaW50IG4pOwogCkBAIC0yNDMyLDExICsyNDMzLDE4IEBACiAJfSBlbHNlIHsKIAkJaWYgKHVuaXRfZmluZCgmcHBwX3VuaXRzX2lkciwgdW5pdCkpCiAJCQlnb3RvIG91dDI7IC8qIHVuaXQgYWxyZWFkeSBleGlzdHMgKi8KLQkJZWxzZSB7Ci0JCQkvKiBkYXJuLCBzb21lb25lIGlzIGNoZWF0aW5nIHVzPyAqLwotCQkJKnJldHAgPSAtRUlOVkFMOworCQkvKgorCQkgKiBpZiBjYWxsZXIgbmVlZCBhIHNwZWNpZmllZCB1bml0IG51bWJlcgorCQkgKiBsZXRzIHRyeSB0byBzYXRpc2Z5IGhpbSwgb3RoZXJ3aXNlIC0tCisJCSAqIGhlIHNob3VsZCBiZXR0ZXIgYXNrIHVzIGZvciBuZXcgdW5pdCBudW1iZXIKKwkJICoKKwkJICogTk9URTogeWVzIEkga25vdyB0aGF0IHJldHVybmluZyBFRVhJU1QgaXQncyBub3QKKwkJICogZmFpciBidXQgYXQgbGVhc3QgcHBwZCB3aWxsIGFzayB1cyB0byBhbGxvY2F0ZQorCQkgKiBuZXcgdW5pdCBpbiB0aGlzIGNhc2Ugc28gdXNlciBpcyBoYXBweSA6KQorCQkgKi8KKwkJdW5pdCA9IHVuaXRfc2V0KCZwcHBfdW5pdHNfaWRyLCBwcHAsIHVuaXQpOworCQlpZiAodW5pdCA8IDApCiAJCQlnb3RvIG91dDI7Ci0JCX0KIAl9CiAKIAkvKiBJbml0aWFsaXplIHRoZSBuZXcgcHBwIHVuaXQgKi8KQEAgLTI2NzcsMTQgKzI2ODUsMzcgQEAKICAqIGJ5IGhvbGRpbmcgYWxsX3BwcF9tdXRleAogICovCiAKKy8qIGFzc29jaWF0ZSBwb2ludGVyIHdpdGggc3BlY2lmaWVkIG51bWJlciAqLworc3RhdGljIGludCB1bml0X3NldChzdHJ1Y3QgaWRyICpwLCB2b2lkICpwdHIsIGludCBuKQoreworCWludCB1bml0LCBlcnI7CisKK2FnYWluOgorCWlmICghaWRyX3ByZV9nZXQocCwgR0ZQX0tFUk5FTCkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJQUFA6IE5vIGZyZWUgbWVtb3J5IGZvciBpZHJcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwllcnIgPSBpZHJfZ2V0X25ld19hYm92ZShwLCBwdHIsIG4sICZ1bml0KTsKKwlpZiAoZXJyID09IC1FQUdBSU4pCisJCWdvdG8gYWdhaW47CisKKwlpZiAodW5pdCAhPSBuKSB7CisJCWlkcl9yZW1vdmUocCwgdW5pdCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiB1bml0OworfQorCiAvKiBnZXQgbmV3IGZyZWUgdW5pdCBudW1iZXIgYW5kIGFzc29jaWF0ZSBwb2ludGVyIHdpdGggaXQgKi8KIHN0YXRpYyBpbnQgdW5pdF9nZXQoc3RydWN0IGlkciAqcCwgdm9pZCAqcHRyKQogewogCWludCB1bml0LCBlcnI7CiAKIGFnYWluOgotCWlmIChpZHJfcHJlX2dldChwLCBHRlBfS0VSTkVMKSA9PSAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiT3V0IG9mIG1lbW9yeSBleHBhbmRpbmcgZHJhd2FibGUgaWRyXG4iKTsKKwlpZiAoIWlkcl9wcmVfZ2V0KHAsIEdGUF9LRVJORUwpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiUFBQOiBObyBmcmVlIG1lbW9yeSBmb3IgaWRyXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9xbGdlL3FsZ2UuaCBiL2RyaXZlcnMvbmV0L3FsZ2UvcWxnZS5oCmluZGV4IDQ1OTY2M2EuLmMxZGFkYWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3FsZ2UvcWxnZS5oCisrKyBiL2RyaXZlcnMvbmV0L3FsZ2UvcWxnZS5oCkBAIC0yOCwxMSArMjgsMTEgQEAKICAgICAgICB9IHdoaWxlICgwKQogCiAjZGVmaW5lIFFMR0VfVkVORE9SX0lEICAgIDB4MTA3NwotI2RlZmluZSBRTEdFX0RFVklDRV9JRDEgICAgMHg4MDEyCi0jZGVmaW5lIFFMR0VfREVWSUNFX0lEICAgMHg4MDAwCisjZGVmaW5lIFFMR0VfREVWSUNFX0lEICAgIDB4ODAxMgogCi0jZGVmaW5lIE1BWF9SWF9SSU5HUyAxMjgKLSNkZWZpbmUgTUFYX1RYX1JJTkdTIDEyOAorI2RlZmluZSBNQVhfQ1BVUyA4CisjZGVmaW5lIE1BWF9UWF9SSU5HUyBNQVhfQ1BVUworI2RlZmluZSBNQVhfUlhfUklOR1MgKChNQVhfQ1BVUyAqIDIpICsgMSkKIAogI2RlZmluZSBOVU1fVFhfUklOR19FTlRSSUVTCTI1NgogI2RlZmluZSBOVU1fUlhfUklOR19FTlRSSUVTCTI1NgpAQCAtNDUsNiArNDUsNyBAQAogI2RlZmluZSBNQVhfU1BMSVRfU0laRSAxMDIzCiAjZGVmaW5lIFFMR0VfU0JfUEFEIDMyCiAKKyNkZWZpbmUgTUFYX0NRIDEyOAogI2RlZmluZSBERkxUX0NPQUxFU0NFX1dBSVQgMTAwCS8qIDEwMCB1c2VjIHdhaXQgZm9yIGNvYWxlc2NpbmcgKi8KICNkZWZpbmUgTUFYX0lOVEVSX0ZSQU1FX1dBSVQgMTAJLyogMTAgdXNlYyBtYXggaW50ZXJmcmFtZS13YWl0IGZvciBjb2FsZXNjaW5nICovCiAjZGVmaW5lIERGTFRfSU5URVJfRlJBTUVfV0FJVCAoTUFYX0lOVEVSX0ZSQU1FX1dBSVQvMikKQEAgLTk2MSw4ICs5NjIsNyBAQAogI2RlZmluZSBJQl9NQUNfSU9DQl9SU1BfRFMJMHg0MAkvKiBkYXRhIGlzIGluIHNtYWxsIGJ1ZmZlciAqLwogI2RlZmluZSBJQl9NQUNfSU9DQl9SU1BfREwJMHg4MAkvKiBkYXRhIGlzIGluIGxhcmdlIGJ1ZmZlciAqLwogCV9fbGUzMiBkYXRhX2xlbjsJLyogKi8KLQlfX2xlMzIgZGF0YV9hZGRyX2xvOwkvKiAqLwotCV9fbGUzMiBkYXRhX2FkZHJfaGk7CS8qICovCisJX19sZTY0IGRhdGFfYWRkcjsJLyogKi8KIAlfX2xlMzIgcnNzOwkJLyogKi8KIAlfX2xlMTYgdmxhbl9pZDsJCS8qIDEyIGJpdHMgKi8KICNkZWZpbmUgSUJfTUFDX0lPQ0JfUlNQX0MJMHgxMDAwCS8qIFZMQU4gQ0ZJIGJpdCAqLwpAQCAtOTc2LDggKzk3Niw3IEBACiAjZGVmaW5lIElCX01BQ19JT0NCX1JTUF9IUwkweDQwCiAjZGVmaW5lIElCX01BQ19JT0NCX1JTUF9ITAkweDgwCiAJX19sZTMyIGhkcl9sZW47CQkvKiAqLwotCV9fbGUzMiBoZHJfYWRkcl9sbzsJLyogKi8KLQlfX2xlMzIgaGRyX2FkZHJfaGk7CS8qICovCisJX19sZTY0IGhkcl9hZGRyOwkvKiAqLwogfSBfX2F0dHJpYnV0ZSgocGFja2VkKSk7CiAKIHN0cnVjdCBpYl9hZV9pb2NiX3JzcCB7CkBAIC0xMDQyLDEwICsxMDQxLDggQEAKIAlfX2xlMTYgY3FfaWRfcnNzOwogI2RlZmluZSBRX0NRX0lEX1JTU19SViAweDgwMDAKIAlfX2xlMTYgcmlkOwotCV9fbGUzMiBhZGRyX2xvOwotCV9fbGUzMiBhZGRyX2hpOwotCV9fbGUzMiBjbnNtcl9pZHhfYWRkcl9sbzsKLQlfX2xlMzIgY25zbXJfaWR4X2FkZHJfaGk7CisJX19sZTY0IGFkZHI7CisJX19sZTY0IGNuc21yX2lkeF9hZGRyOwogfSBfX2F0dHJpYnV0ZSgocGFja2VkKSk7CiAKIC8qCkBAIC0xMDcwLDE4ICsxMDY3LDE0IEBACiAjZGVmaW5lIExFTl9DUFBfNjQJMHgwMDAyCiAjZGVmaW5lIExFTl9DUFBfMTI4CTB4MDAwMwogCV9fbGUxNiByaWQ7Ci0JX19sZTMyIGFkZHJfbG87Ci0JX19sZTMyIGFkZHJfaGk7Ci0JX19sZTMyIHByb2RfaWR4X2FkZHJfbG87Ci0JX19sZTMyIHByb2RfaWR4X2FkZHJfaGk7CisJX19sZTY0IGFkZHI7CisJX19sZTY0IHByb2RfaWR4X2FkZHI7CiAJX19sZTE2IHBrdF9kZWxheTsKIAlfX2xlMTYgaXJxX2RlbGF5OwotCV9fbGUzMiBsYnFfYWRkcl9sbzsKLQlfX2xlMzIgbGJxX2FkZHJfaGk7CisJX19sZTY0IGxicV9hZGRyOwogCV9fbGUxNiBsYnFfYnVmX3NpemU7CiAJX19sZTE2IGxicV9sZW47CQkvKiBlbnRyeSBjb3VudCAqLwotCV9fbGUzMiBzYnFfYWRkcl9sbzsKLQlfX2xlMzIgc2JxX2FkZHJfaGk7CisJX19sZTY0IHNicV9hZGRyOwogCV9fbGUxNiBzYnFfYnVmX3NpemU7CiAJX19sZTE2IHNicV9sZW47CQkvKiBlbnRyeSBjb3VudCAqLwogfSBfX2F0dHJpYnV0ZSgocGFja2VkKSk7CkBAIC0xMTQ1LDcgKzExMzgsNyBAQAogCXN0cnVjdCB3cWljYiB3cWljYjsJLyogc3RydWN0dXJlIHVzZWQgdG8gaW5mb3JtIGNoaXAgb2YgbmV3IHF1ZXVlICovCiAJdm9pZCAqd3FfYmFzZTsJCS8qIHBjaV9hbGxvYzp2aXJ0dWFsIGFkZHIgZm9yIHR4ICovCiAJZG1hX2FkZHJfdCB3cV9iYXNlX2RtYTsJLyogcGNpX2FsbG9jOmRtYSBhZGRyIGZvciB0eCAqLwotCXUzMiAqY25zbXJfaWR4X3NoX3JlZzsJLyogc2hhZG93IGNvcHkgb2YgY29uc3VtZXIgaWR4ICovCisJX19sZTMyICpjbnNtcl9pZHhfc2hfcmVnOwkvKiBzaGFkb3cgY29weSBvZiBjb25zdW1lciBpZHggKi8KIAlkbWFfYWRkcl90IGNuc21yX2lkeF9zaF9yZWdfZG1hOwkvKiBkbWEtc2hhZG93IGNvcHkgb2YgY29uc3VtZXIgKi8KIAl1MzIgd3Ffc2l6ZTsJCS8qIHNpemUgaW4gYnl0ZXMgb2YgcXVldWUgYXJlYSAqLwogCXUzMiB3cV9sZW47CQkvKiBudW1iZXIgb2YgZW50cmllcyBpbiBxdWV1ZSAqLwpAQCAtMTE4MSw3ICsxMTc0LDcgQEAKIAl1MzIgY3Ffc2l6ZTsKIAl1MzIgY3FfbGVuOwogCXUxNiBjcV9pZDsKLQl2b2xhdGlsZSBfX2xlMzIgKnByb2RfaWR4X3NoX3JlZzsJLyogU2hhZG93ZWQgcHJvZHVjZXIgcmVnaXN0ZXIuICovCisJX19sZTMyICpwcm9kX2lkeF9zaF9yZWc7CS8qIFNoYWRvd2VkIHByb2R1Y2VyIHJlZ2lzdGVyLiAqLwogCWRtYV9hZGRyX3QgcHJvZF9pZHhfc2hfcmVnX2RtYTsKIAl2b2lkIF9faW9tZW0gKmNuc21yX2lkeF9kYl9yZWc7CS8qIFBDSSBkb29yYmVsbCBtZW0gYXJlYSArIDAgKi8KIAl1MzIgY25zbXJfaWR4OwkJLyogY3VycmVudCBzdyBpZHggKi8KQEAgLTE0MDIsOSArMTM5NSwxMSBAQAogCWludCByeF9yaW5nX2NvdW50OwogCWludCByaW5nX21lbV9zaXplOwogCXZvaWQgKnJpbmdfbWVtOwotCXN0cnVjdCByeF9yaW5nICpyeF9yaW5nOworCisJc3RydWN0IHJ4X3JpbmcgcnhfcmluZ1tNQVhfUlhfUklOR1NdOworCXN0cnVjdCB0eF9yaW5nIHR4X3JpbmdbTUFYX1RYX1JJTkdTXTsKKwogCWludCByeF9jc3VtOwotCXN0cnVjdCB0eF9yaW5nICp0eF9yaW5nOwogCXUzMiBkZWZhdWx0X3J4X3F1ZXVlOwogCiAJdTE2IHJ4X2NvYWxlc2NlX3VzZWNzOwkvKiBjcWljYi0+aW50X2RlbGF5ICovCkBAIC0xNDU5LDYgKzE0NTQsMjQgQEAKIAltbWlvd2IoKTsKIH0KIAorLyoKKyAqIFNoYWRvdyBSZWdpc3RlcnM6CisgKiBPdXRib3VuZCBxdWV1ZXMgaGF2ZSBhIGNvbnN1bWVyIGluZGV4IHRoYXQgaXMgbWFpbnRhaW5lZCBieSB0aGUgY2hpcC4KKyAqIEluYm91bmQgcXVldWVzIGhhdmUgYSBwcm9kdWNlciBpbmRleCB0aGF0IGlzIG1haW50YWluZWQgYnkgdGhlIGNoaXAuCisgKiBGb3IgbG93ZXIgb3ZlcmhlYWQsIHRoZXNlIHJlZ2lzdGVycyBhcmUgInNoYWRvd2VkIiB0byBob3N0IG1lbW9yeQorICogd2hpY2ggYWxsb3dzIHRoZSBkZXZpY2UgZHJpdmVyIHRvIHRyYWNrIHRoZSBxdWV1ZSBwcm9ncmVzcyB3aXRob3V0CisgKiBQQ0kgcmVhZHMuIFdoZW4gYW4gZW50cnkgaXMgcGxhY2VkIG9uIGFuIGluYm91bmQgcXVldWUsIHRoZSBjaGlwIHdpbGwKKyAqIHVwZGF0ZSB0aGUgcmVsZXZhbnQgaW5kZXggcmVnaXN0ZXIgYW5kIHRoZW4gY29weSB0aGUgdmFsdWUgdG8gdGhlCisgKiBzaGFkb3cgcmVnaXN0ZXIgaW4gaG9zdCBtZW1vcnkuCisgKi8KK3N0YXRpYyBpbmxpbmUgdTMyIHFsX3JlYWRfc2hfcmVnKF9fbGUzMiAgKmFkZHIpCit7CisJdTMyIHJlZzsKKwlyZWcgPSAgbGUzMl90b19jcHUoKmFkZHIpOworCXJtYigpOworCXJldHVybiByZWc7Cit9CisKIGV4dGVybiBjaGFyIHFsZ2VfZHJpdmVyX25hbWVbXTsKIGV4dGVybiBjb25zdCBjaGFyIHFsZ2VfZHJpdmVyX3ZlcnNpb25bXTsKIGV4dGVybiBjb25zdCBzdHJ1Y3QgZXRodG9vbF9vcHMgcWxnZV9ldGh0b29sX29wczsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3FsZ2UvcWxnZV9kYmcuYyBiL2RyaXZlcnMvbmV0L3FsZ2UvcWxnZV9kYmcuYwppbmRleCAzZjVlMDJkLi4zNzliODk1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9xbGdlL3FsZ2VfZGJnLmMKKysrIGIvZHJpdmVycy9uZXQvcWxnZS9xbGdlX2RiZy5jCkBAIC00MzUsMTQgKzQzNSwxMCBAQAogCXByaW50ayhLRVJOX0VSUiBQRlggIndxaWNiLT5jcV9pZF9yc3MgPSAlZC5cbiIsCiAJICAgICAgIGxlMTZfdG9fY3B1KHdxaWNiLT5jcV9pZF9yc3MpKTsKIAlwcmludGsoS0VSTl9FUlIgUEZYICJ3cWljYi0+cmlkID0gMHgleC5cbiIsIGxlMTZfdG9fY3B1KHdxaWNiLT5yaWQpKTsKLQlwcmludGsoS0VSTl9FUlIgUEZYICJ3cWljYi0+d3FfYWRkcl9sbyA9IDB4JS4wOHguXG4iLAotCSAgICAgICBsZTMyX3RvX2NwdSh3cWljYi0+YWRkcl9sbykpOwotCXByaW50ayhLRVJOX0VSUiBQRlggIndxaWNiLT53cV9hZGRyX2hpID0gMHglLjA4eC5cbiIsCi0JICAgICAgIGxlMzJfdG9fY3B1KHdxaWNiLT5hZGRyX2hpKSk7Ci0JcHJpbnRrKEtFUk5fRVJSIFBGWCAid3FpY2ItPndxX2Nuc21yX2lkeF9hZGRyX2xvID0gMHglLjA4eC5cbiIsCi0JICAgICAgIGxlMzJfdG9fY3B1KHdxaWNiLT5jbnNtcl9pZHhfYWRkcl9sbykpOwotCXByaW50ayhLRVJOX0VSUiBQRlggIndxaWNiLT53cV9jbnNtcl9pZHhfYWRkcl9oaSA9IDB4JS4wOHguXG4iLAotCSAgICAgICBsZTMyX3RvX2NwdSh3cWljYi0+Y25zbXJfaWR4X2FkZHJfaGkpKTsKKwlwcmludGsoS0VSTl9FUlIgUEZYICJ3cWljYi0+d3FfYWRkciA9IDB4JWxseC5cbiIsCisJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIGxlNjRfdG9fY3B1KHdxaWNiLT5hZGRyKSk7CisJcHJpbnRrKEtFUk5fRVJSIFBGWCAid3FpY2ItPndxX2Nuc21yX2lkeF9hZGRyID0gMHglbGx4LlxuIiwKKwkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgbGU2NF90b19jcHUod3FpY2ItPmNuc21yX2lkeF9hZGRyKSk7CiB9CiAKIHZvaWQgcWxfZHVtcF90eF9yaW5nKHN0cnVjdCB0eF9yaW5nICp0eF9yaW5nKQpAQCAtNDU1LDEwICs0NTEsMTEgQEAKIAlwcmludGsoS0VSTl9FUlIgUEZYICJ0eF9yaW5nLT5iYXNlID0gJXAuXG4iLCB0eF9yaW5nLT53cV9iYXNlKTsKIAlwcmludGsoS0VSTl9FUlIgUEZYICJ0eF9yaW5nLT5iYXNlX2RtYSA9IDB4JWxseC5cbiIsCiAJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIHR4X3JpbmctPndxX2Jhc2VfZG1hKTsKLQlwcmludGsoS0VSTl9FUlIgUEZYICJ0eF9yaW5nLT5jbnNtcl9pZHhfc2hfcmVnID0gJXAuXG4iLAotCSAgICAgICB0eF9yaW5nLT5jbnNtcl9pZHhfc2hfcmVnKTsKLQlwcmludGsoS0VSTl9FUlIgUEZYICJ0eF9yaW5nLT5jbnNtcl9pZHhfc2hfcmVnX2RtYSA9IDB4JWxseC5cbiIsCi0JICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIHR4X3JpbmctPmNuc21yX2lkeF9zaF9yZWdfZG1hKTsKKwlwcmludGsoS0VSTl9FUlIgUEZYCisJICAgICAgICJ0eF9yaW5nLT5jbnNtcl9pZHhfc2hfcmVnLCBhZGRyID0gMHglcCwgdmFsdWUgPSAlZC5cbiIsCisJICAgICAgIHR4X3JpbmctPmNuc21yX2lkeF9zaF9yZWcsCisJICAgICAgIHR4X3JpbmctPmNuc21yX2lkeF9zaF9yZWcKKwkJCT8gcWxfcmVhZF9zaF9yZWcodHhfcmluZy0+Y25zbXJfaWR4X3NoX3JlZykgOiAwKTsKIAlwcmludGsoS0VSTl9FUlIgUEZYICJ0eF9yaW5nLT5zaXplID0gJWQuXG4iLCB0eF9yaW5nLT53cV9zaXplKTsKIAlwcmludGsoS0VSTl9FUlIgUEZYICJ0eF9yaW5nLT5sZW4gPSAlZC5cbiIsIHR4X3JpbmctPndxX2xlbik7CiAJcHJpbnRrKEtFUk5fRVJSIFBGWCAidHhfcmluZy0+cHJvZF9pZHhfZGJfcmVnID0gJXAuXG4iLApAQCAtNTEwLDMwICs1MDcsMjIgQEAKIAlwcmludGsoS0VSTl9FUlIgUEZYICJjcWljYi0+bXNpeF92ZWN0ID0gJWQuXG4iLCBjcWljYi0+bXNpeF92ZWN0KTsKIAlwcmludGsoS0VSTl9FUlIgUEZYICJjcWljYi0+ZmxhZ3MgPSAleC5cbiIsIGNxaWNiLT5mbGFncyk7CiAJcHJpbnRrKEtFUk5fRVJSIFBGWCAiY3FpY2ItPmxlbiA9ICVkLlxuIiwgbGUxNl90b19jcHUoY3FpY2ItPmxlbikpOwotCXByaW50ayhLRVJOX0VSUiBQRlggImNxaWNiLT5hZGRyX2xvID0gJXguXG4iLAotCSAgICAgICBsZTMyX3RvX2NwdShjcWljYi0+YWRkcl9sbykpOwotCXByaW50ayhLRVJOX0VSUiBQRlggImNxaWNiLT5hZGRyX2hpID0gJXguXG4iLAotCSAgICAgICBsZTMyX3RvX2NwdShjcWljYi0+YWRkcl9oaSkpOwotCXByaW50ayhLRVJOX0VSUiBQRlggImNxaWNiLT5wcm9kX2lkeF9hZGRyX2xvID0gJXguXG4iLAotCSAgICAgICBsZTMyX3RvX2NwdShjcWljYi0+cHJvZF9pZHhfYWRkcl9sbykpOwotCXByaW50ayhLRVJOX0VSUiBQRlggImNxaWNiLT5wcm9kX2lkeF9hZGRyX2hpID0gJXguXG4iLAotCSAgICAgICBsZTMyX3RvX2NwdShjcWljYi0+cHJvZF9pZHhfYWRkcl9oaSkpOworCXByaW50ayhLRVJOX0VSUiBQRlggImNxaWNiLT5hZGRyID0gMHglbGx4LlxuIiwKKwkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgbGU2NF90b19jcHUoY3FpY2ItPmFkZHIpKTsKKwlwcmludGsoS0VSTl9FUlIgUEZYICJjcWljYi0+cHJvZF9pZHhfYWRkciA9IDB4JWxseC5cbiIsCisJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIGxlNjRfdG9fY3B1KGNxaWNiLT5wcm9kX2lkeF9hZGRyKSk7CiAJcHJpbnRrKEtFUk5fRVJSIFBGWCAiY3FpY2ItPnBrdF9kZWxheSA9IDB4JS4wNHguXG4iLAogCSAgICAgICBsZTE2X3RvX2NwdShjcWljYi0+cGt0X2RlbGF5KSk7CiAJcHJpbnRrKEtFUk5fRVJSIFBGWCAiY3FpY2ItPmlycV9kZWxheSA9IDB4JS4wNHguXG4iLAogCSAgICAgICBsZTE2X3RvX2NwdShjcWljYi0+aXJxX2RlbGF5KSk7Ci0JcHJpbnRrKEtFUk5fRVJSIFBGWCAiY3FpY2ItPmxicV9hZGRyX2xvID0gJXguXG4iLAotCSAgICAgICBsZTMyX3RvX2NwdShjcWljYi0+bGJxX2FkZHJfbG8pKTsKLQlwcmludGsoS0VSTl9FUlIgUEZYICJjcWljYi0+bGJxX2FkZHJfaGkgPSAleC5cbiIsCi0JICAgICAgIGxlMzJfdG9fY3B1KGNxaWNiLT5sYnFfYWRkcl9oaSkpOworCXByaW50ayhLRVJOX0VSUiBQRlggImNxaWNiLT5sYnFfYWRkciA9IDB4JWxseC5cbiIsCisJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIGxlNjRfdG9fY3B1KGNxaWNiLT5sYnFfYWRkcikpOwogCXByaW50ayhLRVJOX0VSUiBQRlggImNxaWNiLT5sYnFfYnVmX3NpemUgPSAweCUuMDR4LlxuIiwKIAkgICAgICAgbGUxNl90b19jcHUoY3FpY2ItPmxicV9idWZfc2l6ZSkpOwogCXByaW50ayhLRVJOX0VSUiBQRlggImNxaWNiLT5sYnFfbGVuID0gMHglLjA0eC5cbiIsCiAJICAgICAgIGxlMTZfdG9fY3B1KGNxaWNiLT5sYnFfbGVuKSk7Ci0JcHJpbnRrKEtFUk5fRVJSIFBGWCAiY3FpY2ItPnNicV9hZGRyX2xvID0gJXguXG4iLAotCSAgICAgICBsZTMyX3RvX2NwdShjcWljYi0+c2JxX2FkZHJfbG8pKTsKLQlwcmludGsoS0VSTl9FUlIgUEZYICJjcWljYi0+c2JxX2FkZHJfaGkgPSAleC5cbiIsCi0JICAgICAgIGxlMzJfdG9fY3B1KGNxaWNiLT5zYnFfYWRkcl9oaSkpOworCXByaW50ayhLRVJOX0VSUiBQRlggImNxaWNiLT5zYnFfYWRkciA9IDB4JWxseC5cbiIsCisJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIGxlNjRfdG9fY3B1KGNxaWNiLT5zYnFfYWRkcikpOwogCXByaW50ayhLRVJOX0VSUiBQRlggImNxaWNiLT5zYnFfYnVmX3NpemUgPSAweCUuMDR4LlxuIiwKIAkgICAgICAgbGUxNl90b19jcHUoY3FpY2ItPnNicV9idWZfc2l6ZSkpOwogCXByaW50ayhLRVJOX0VSUiBQRlggImNxaWNiLT5zYnFfbGVuID0gMHglLjA0eC5cbiIsCkBAIC01NTgsOSArNTQ3LDEwIEBACiAJcHJpbnRrKEtFUk5fRVJSIFBGWCAicnhfcmluZy0+Y3Ffc2l6ZSA9ICVkLlxuIiwgcnhfcmluZy0+Y3Ffc2l6ZSk7CiAJcHJpbnRrKEtFUk5fRVJSIFBGWCAicnhfcmluZy0+Y3FfbGVuID0gJWQuXG4iLCByeF9yaW5nLT5jcV9sZW4pOwogCXByaW50ayhLRVJOX0VSUiBQRlgKLQkgICAgICAgInJ4X3JpbmctPnByb2RfaWR4X3NoX3JlZywgYWRkciA9ICVwLCB2YWx1ZSA9ICVkLlxuIiwKKwkgICAgICAgInJ4X3JpbmctPnByb2RfaWR4X3NoX3JlZywgYWRkciA9IDB4JXAsIHZhbHVlID0gJWQuXG4iLAogCSAgICAgICByeF9yaW5nLT5wcm9kX2lkeF9zaF9yZWcsCi0JICAgICAgIHJ4X3JpbmctPnByb2RfaWR4X3NoX3JlZyA/ICoocnhfcmluZy0+cHJvZF9pZHhfc2hfcmVnKSA6IDApOworCSAgICAgICByeF9yaW5nLT5wcm9kX2lkeF9zaF9yZWcKKwkJCT8gcWxfcmVhZF9zaF9yZWcocnhfcmluZy0+cHJvZF9pZHhfc2hfcmVnKSA6IDApOwogCXByaW50ayhLRVJOX0VSUiBQRlggInJ4X3JpbmctPnByb2RfaWR4X3NoX3JlZ19kbWEgPSAlbGx4LlxuIiwKIAkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgcnhfcmluZy0+cHJvZF9pZHhfc2hfcmVnX2RtYSk7CiAJcHJpbnRrKEtFUk5fRVJSIFBGWCAicnhfcmluZy0+Y25zbXJfaWR4X2RiX3JlZyA9ICVwLlxuIiwKQEAgLTgwOSwxMCArNzk5LDggQEAKIAogCXByaW50ayhLRVJOX0VSUiBQRlggImRhdGFfbGVuCT0gJWRcbiIsCiAJICAgICAgIGxlMzJfdG9fY3B1KGliX21hY19yc3AtPmRhdGFfbGVuKSk7Ci0JcHJpbnRrKEtFUk5fRVJSIFBGWCAiZGF0YV9hZGRyX2hpICAgID0gMHgleFxuIiwKLQkgICAgICAgbGUzMl90b19jcHUoaWJfbWFjX3JzcC0+ZGF0YV9hZGRyX2hpKSk7Ci0JcHJpbnRrKEtFUk5fRVJSIFBGWCAiZGF0YV9hZGRyX2xvICAgID0gMHgleFxuIiwKLQkgICAgICAgbGUzMl90b19jcHUoaWJfbWFjX3JzcC0+ZGF0YV9hZGRyX2xvKSk7CisJcHJpbnRrKEtFUk5fRVJSIFBGWCAiZGF0YV9hZGRyICAgID0gMHglbGx4XG4iLAorCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKSBsZTY0X3RvX2NwdShpYl9tYWNfcnNwLT5kYXRhX2FkZHIpKTsKIAlpZiAoaWJfbWFjX3JzcC0+ZmxhZ3MzICYgSUJfTUFDX0lPQ0JfUlNQX1JTU19NQVNLKQogCQlwcmludGsoS0VSTl9FUlIgUEZYICJyc3MgICAgPSAleFxuIiwKIAkJICAgICAgIGxlMzJfdG9fY3B1KGliX21hY19yc3AtPnJzcykpOwpAQCAtODI4LDEwICs4MTYsOCBAQAogCWlmIChpYl9tYWNfcnNwLT5mbGFnczQgJiBJQl9NQUNfSU9DQl9SU1BfSFYpIHsKIAkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiaGRyIGxlbmd0aAk9ICVkLlxuIiwKIAkJICAgICAgIGxlMzJfdG9fY3B1KGliX21hY19yc3AtPmhkcl9sZW4pKTsKLQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiaGRyIGFkZHJfaGkgICAgPSAweCV4LlxuIiwKLQkJICAgICAgIGxlMzJfdG9fY3B1KGliX21hY19yc3AtPmhkcl9hZGRyX2hpKSk7Ci0JCXByaW50ayhLRVJOX0VSUiBQRlggImhkciBhZGRyX2xvICAgID0gMHgleC5cbiIsCi0JCSAgICAgICBsZTMyX3RvX2NwdShpYl9tYWNfcnNwLT5oZHJfYWRkcl9sbykpOworCQlwcmludGsoS0VSTl9FUlIgUEZYICJoZHIgYWRkciAgICA9IDB4JWxseC5cbiIsCisJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKSBsZTY0X3RvX2NwdShpYl9tYWNfcnNwLT5oZHJfYWRkcikpOwogCX0KIH0KICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcWxnZS9xbGdlX21haW4uYyBiL2RyaXZlcnMvbmV0L3FsZ2UvcWxnZV9tYWluLmMKaW5kZXggZjRjMDE2MC4uNDU0MjFjOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvcWxnZS9xbGdlX21haW4uYworKysgYi9kcml2ZXJzL25ldC9xbGdlL3FsZ2VfbWFpbi5jCkBAIC03Niw3ICs3Niw2IEBACiAKIHN0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBxbGdlX3BjaV90YmxbXSBfX2RldmluaXRkYXRhID0gewogCXtQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfUUxPR0lDLCBRTEdFX0RFVklDRV9JRCl9LAotCXtQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfUUxPR0lDLCBRTEdFX0RFVklDRV9JRDEpfSwKIAkvKiByZXF1aXJlZCBsYXN0IGVudHJ5ICovCiAJezAsfQogfTsKQEAgLTEyNywxMiArMTI2LDEyIEBACiAKIGludCBxbF9zZW1fc3BpbmxvY2soc3RydWN0IHFsX2FkYXB0ZXIgKnFkZXYsIHUzMiBzZW1fbWFzaykKIHsKLQl1bnNpZ25lZCBpbnQgc2Vjb25kcyA9IDM7CisJdW5zaWduZWQgaW50IHdhaXRfY291bnQgPSAzMDsKIAlkbyB7CiAJCWlmICghcWxfc2VtX3RyeWxvY2socWRldiwgc2VtX21hc2spKQogCQkJcmV0dXJuIDA7Ci0JCXNzbGVlcCgxKTsKLQl9IHdoaWxlICgtLXNlY29uZHMpOworCQl1ZGVsYXkoMTAwKTsKKwl9IHdoaWxlICgtLXdhaXRfY291bnQpOwogCXJldHVybiAtRVRJTUVET1VUOwogfQogCkBAIC0xNTQ1LDcgKzE1NDQsNyBAQAogc3RhdGljIGludCBxbF9jbGVhbl9vdXRib3VuZF9yeF9yaW5nKHN0cnVjdCByeF9yaW5nICpyeF9yaW5nKQogewogCXN0cnVjdCBxbF9hZGFwdGVyICpxZGV2ID0gcnhfcmluZy0+cWRldjsKLQl1MzIgcHJvZCA9IGxlMzJfdG9fY3B1KCpyeF9yaW5nLT5wcm9kX2lkeF9zaF9yZWcpOworCXUzMiBwcm9kID0gcWxfcmVhZF9zaF9yZWcocnhfcmluZy0+cHJvZF9pZHhfc2hfcmVnKTsKIAlzdHJ1Y3Qgb2JfbWFjX2lvY2JfcnNwICpuZXRfcnNwID0gTlVMTDsKIAlpbnQgY291bnQgPSAwOwogCkBAIC0xNTcxLDcgKzE1NzAsNyBAQAogCQl9CiAJCWNvdW50Kys7CiAJCXFsX3VwZGF0ZV9jcShyeF9yaW5nKTsKLQkJcHJvZCA9IGxlMzJfdG9fY3B1KCpyeF9yaW5nLT5wcm9kX2lkeF9zaF9yZWcpOworCQlwcm9kID0gcWxfcmVhZF9zaF9yZWcocnhfcmluZy0+cHJvZF9pZHhfc2hfcmVnKTsKIAl9CiAJcWxfd3JpdGVfY3FfaWR4KHJ4X3JpbmcpOwogCWlmIChuZXRpZl9xdWV1ZV9zdG9wcGVkKHFkZXYtPm5kZXYpICYmIG5ldF9yc3AgIT0gTlVMTCkgewpAQCAtMTU5MSw3ICsxNTkwLDcgQEAKIHN0YXRpYyBpbnQgcWxfY2xlYW5faW5ib3VuZF9yeF9yaW5nKHN0cnVjdCByeF9yaW5nICpyeF9yaW5nLCBpbnQgYnVkZ2V0KQogewogCXN0cnVjdCBxbF9hZGFwdGVyICpxZGV2ID0gcnhfcmluZy0+cWRldjsKLQl1MzIgcHJvZCA9IGxlMzJfdG9fY3B1KCpyeF9yaW5nLT5wcm9kX2lkeF9zaF9yZWcpOworCXUzMiBwcm9kID0gcWxfcmVhZF9zaF9yZWcocnhfcmluZy0+cHJvZF9pZHhfc2hfcmVnKTsKIAlzdHJ1Y3QgcWxfbmV0X3JzcF9pb2NiICpuZXRfcnNwOwogCWludCBjb3VudCA9IDA7CiAKQEAgLTE2MjQsNyArMTYyMyw3IEBACiAJCX0KIAkJY291bnQrKzsKIAkJcWxfdXBkYXRlX2NxKHJ4X3JpbmcpOwotCQlwcm9kID0gbGUzMl90b19jcHUoKnJ4X3JpbmctPnByb2RfaWR4X3NoX3JlZyk7CisJCXByb2QgPSBxbF9yZWFkX3NoX3JlZyhyeF9yaW5nLT5wcm9kX2lkeF9zaF9yZWcpOwogCQlpZiAoY291bnQgPT0gYnVkZ2V0KQogCQkJYnJlYWs7CiAJfQpAQCAtMTc4Nyw3ICsxNzg2LDcgQEAKIAkgKiBDaGVjayB0aGUgZGVmYXVsdCBxdWV1ZSBhbmQgd2FrZSBoYW5kbGVyIGlmIGFjdGl2ZS4KIAkgKi8KIAlyeF9yaW5nID0gJnFkZXYtPnJ4X3JpbmdbMF07Ci0JaWYgKGxlMzJfdG9fY3B1KCpyeF9yaW5nLT5wcm9kX2lkeF9zaF9yZWcpICE9IHJ4X3JpbmctPmNuc21yX2lkeCkgeworCWlmIChxbF9yZWFkX3NoX3JlZyhyeF9yaW5nLT5wcm9kX2lkeF9zaF9yZWcpICE9IHJ4X3JpbmctPmNuc21yX2lkeCkgewogCQlRUFJJTlRLKHFkZXYsIElOVFIsIElORk8sICJXYWtpbmcgaGFuZGxlciBmb3IgcnhfcmluZ1swXS5cbiIpOwogCQlxbF9kaXNhYmxlX2NvbXBsZXRpb25faW50ZXJydXB0KHFkZXYsIGludHJfY29udGV4dC0+aW50cik7CiAJCXF1ZXVlX2RlbGF5ZWRfd29ya19vbihzbXBfcHJvY2Vzc29yX2lkKCksIHFkZXYtPnFfd29ya3F1ZXVlLApAQCAtMTgwMSw3ICsxODAwLDcgQEAKIAkJICovCiAJCWZvciAoaSA9IDE7IGkgPCBxZGV2LT5yeF9yaW5nX2NvdW50OyBpKyspIHsKIAkJCXJ4X3JpbmcgPSAmcWRldi0+cnhfcmluZ1tpXTsKLQkJCWlmIChsZTMyX3RvX2NwdSgqcnhfcmluZy0+cHJvZF9pZHhfc2hfcmVnKSAhPQorCQkJaWYgKHFsX3JlYWRfc2hfcmVnKHJ4X3JpbmctPnByb2RfaWR4X3NoX3JlZykgIT0KIAkJCSAgICByeF9yaW5nLT5jbnNtcl9pZHgpIHsKIAkJCQlRUFJJTlRLKHFkZXYsIElOVFIsIElORk8sCiAJCQkJCSJXYWtpbmcgaGFuZGxlciBmb3IgcnhfcmluZ1slZF0uXG4iLCBpKTsKQEAgLTIzNTYsMjggKzIzNTUsNiBAQAogCX0KIH0KIAotc3RhdGljIHZvaWQgcWxfZnJlZV9yaW5nX2NiKHN0cnVjdCBxbF9hZGFwdGVyICpxZGV2KQotewotCWtmcmVlKHFkZXYtPnJpbmdfbWVtKTsKLX0KLQotc3RhdGljIGludCBxbF9hbGxvY19yaW5nX2NiKHN0cnVjdCBxbF9hZGFwdGVyICpxZGV2KQotewotCS8qIEFsbG9jYXRlIHNwYWNlIGZvciB0eC9yeCByaW5nIGNvbnRyb2wgYmxvY2tzLiAqLwotCXFkZXYtPnJpbmdfbWVtX3NpemUgPQotCSAgICAocWRldi0+dHhfcmluZ19jb3VudCAqIHNpemVvZihzdHJ1Y3QgdHhfcmluZykpICsKLQkgICAgKHFkZXYtPnJ4X3JpbmdfY291bnQgKiBzaXplb2Yoc3RydWN0IHJ4X3JpbmcpKTsKLQlxZGV2LT5yaW5nX21lbSA9IGttYWxsb2MocWRldi0+cmluZ19tZW1fc2l6ZSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKHFkZXYtPnJpbmdfbWVtID09IE5VTEwpIHsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfSBlbHNlIHsKLQkJcWRldi0+cnhfcmluZyA9IHFkZXYtPnJpbmdfbWVtOwotCQlxZGV2LT50eF9yaW5nID0gcWRldi0+cmluZ19tZW0gKwotCQkgICAgKHFkZXYtPnJ4X3JpbmdfY291bnQgKiBzaXplb2Yoc3RydWN0IHJ4X3JpbmcpKTsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyB2b2lkIHFsX2ZyZWVfbWVtX3Jlc291cmNlcyhzdHJ1Y3QgcWxfYWRhcHRlciAqcWRldikKIHsKIAlpbnQgaTsKQEAgLTI0NjcsMTIgKzI0NDQsOSBAQAogCWJxX2xlbiA9IChyeF9yaW5nLT5jcV9sZW4gPT0gNjU1MzYpID8gMCA6ICh1MTYpIHJ4X3JpbmctPmNxX2xlbjsKIAljcWljYi0+bGVuID0gY3B1X3RvX2xlMTYoYnFfbGVuIHwgTEVOX1YgfCBMRU5fQ1BQX0NPTlQpOwogCi0JY3FpY2ItPmFkZHJfbG8gPSBjcHVfdG9fbGUzMihyeF9yaW5nLT5jcV9iYXNlX2RtYSk7Ci0JY3FpY2ItPmFkZHJfaGkgPSBjcHVfdG9fbGUzMigodTY0KSByeF9yaW5nLT5jcV9iYXNlX2RtYSA+PiAzMik7CisJY3FpY2ItPmFkZHIgPSBjcHVfdG9fbGU2NChyeF9yaW5nLT5jcV9iYXNlX2RtYSk7CiAKLQljcWljYi0+cHJvZF9pZHhfYWRkcl9sbyA9IGNwdV90b19sZTMyKHJ4X3JpbmctPnByb2RfaWR4X3NoX3JlZ19kbWEpOwotCWNxaWNiLT5wcm9kX2lkeF9hZGRyX2hpID0KLQkgICAgY3B1X3RvX2xlMzIoKHU2NCkgcnhfcmluZy0+cHJvZF9pZHhfc2hfcmVnX2RtYSA+PiAzMik7CisJY3FpY2ItPnByb2RfaWR4X2FkZHIgPSBjcHVfdG9fbGU2NChyeF9yaW5nLT5wcm9kX2lkeF9zaF9yZWdfZG1hKTsKIAogCS8qCiAJICogU2V0IHVwIHRoZSBjb250cm9sIGJsb2NrIGxvYWQgZmxhZ3MuCkBAIC0yNDgzLDEwICsyNDU3LDggQEAKIAlpZiAocnhfcmluZy0+bGJxX2xlbikgewogCQljcWljYi0+ZmxhZ3MgfD0gRkxBR1NfTEw7CS8qIExvYWQgbGJxIHZhbHVlcyAqLwogCQkqKCh1NjQgKikgcnhfcmluZy0+bGJxX2Jhc2VfaW5kaXJlY3QpID0gcnhfcmluZy0+bGJxX2Jhc2VfZG1hOwotCQljcWljYi0+bGJxX2FkZHJfbG8gPQotCQkgICAgY3B1X3RvX2xlMzIocnhfcmluZy0+bGJxX2Jhc2VfaW5kaXJlY3RfZG1hKTsKLQkJY3FpY2ItPmxicV9hZGRyX2hpID0KLQkJICAgIGNwdV90b19sZTMyKCh1NjQpIHJ4X3JpbmctPmxicV9iYXNlX2luZGlyZWN0X2RtYSA+PiAzMik7CisJCWNxaWNiLT5sYnFfYWRkciA9CisJCSAgICBjcHVfdG9fbGU2NChyeF9yaW5nLT5sYnFfYmFzZV9pbmRpcmVjdF9kbWEpOwogCQlicV9sZW4gPSAocnhfcmluZy0+bGJxX2J1Zl9zaXplID09IDY1NTM2KSA/IDAgOgogCQkJKHUxNikgcnhfcmluZy0+bGJxX2J1Zl9zaXplOwogCQljcWljYi0+bGJxX2J1Zl9zaXplID0gY3B1X3RvX2xlMTYoYnFfbGVuKTsKQEAgLTI1MDEsMTAgKzI0NzMsOCBAQAogCWlmIChyeF9yaW5nLT5zYnFfbGVuKSB7CiAJCWNxaWNiLT5mbGFncyB8PSBGTEFHU19MUzsJLyogTG9hZCBzYnEgdmFsdWVzICovCiAJCSooKHU2NCAqKSByeF9yaW5nLT5zYnFfYmFzZV9pbmRpcmVjdCkgPSByeF9yaW5nLT5zYnFfYmFzZV9kbWE7Ci0JCWNxaWNiLT5zYnFfYWRkcl9sbyA9Ci0JCSAgICBjcHVfdG9fbGUzMihyeF9yaW5nLT5zYnFfYmFzZV9pbmRpcmVjdF9kbWEpOwotCQljcWljYi0+c2JxX2FkZHJfaGkgPQotCQkgICAgY3B1X3RvX2xlMzIoKHU2NCkgcnhfcmluZy0+c2JxX2Jhc2VfaW5kaXJlY3RfZG1hID4+IDMyKTsKKwkJY3FpY2ItPnNicV9hZGRyID0KKwkJICAgIGNwdV90b19sZTY0KHJ4X3JpbmctPnNicV9iYXNlX2luZGlyZWN0X2RtYSk7CiAJCWNxaWNiLT5zYnFfYnVmX3NpemUgPQogCQkgICAgY3B1X3RvX2xlMTYoKChyeF9yaW5nLT5zYnFfYnVmX3NpemUgLyAyKSArIDgpICYgMHhmZmZmZmZmOCk7CiAJCWJxX2xlbiA9IChyeF9yaW5nLT5zYnFfbGVuID09IDY1NTM2KSA/IDAgOgpAQCAtMjYxMSwxMiArMjU4MSw5IEBACiAJCQkJICAgUV9GTEFHU19MQiB8IFFfRkxBR1NfTEkgfCBRX0ZMQUdTX0xPKTsKIAl3cWljYi0+Y3FfaWRfcnNzID0gY3B1X3RvX2xlMTYodHhfcmluZy0+Y3FfaWQpOwogCXdxaWNiLT5yaWQgPSAwOwotCXdxaWNiLT5hZGRyX2xvID0gY3B1X3RvX2xlMzIodHhfcmluZy0+d3FfYmFzZV9kbWEpOwotCXdxaWNiLT5hZGRyX2hpID0gY3B1X3RvX2xlMzIoKHU2NCkgdHhfcmluZy0+d3FfYmFzZV9kbWEgPj4gMzIpOworCXdxaWNiLT5hZGRyID0gY3B1X3RvX2xlNjQodHhfcmluZy0+d3FfYmFzZV9kbWEpOwogCi0Jd3FpY2ItPmNuc21yX2lkeF9hZGRyX2xvID0gY3B1X3RvX2xlMzIodHhfcmluZy0+Y25zbXJfaWR4X3NoX3JlZ19kbWEpOwotCXdxaWNiLT5jbnNtcl9pZHhfYWRkcl9oaSA9Ci0JICAgIGNwdV90b19sZTMyKCh1NjQpIHR4X3JpbmctPmNuc21yX2lkeF9zaF9yZWdfZG1hID4+IDMyKTsKKwl3cWljYi0+Y25zbXJfaWR4X2FkZHIgPSBjcHVfdG9fbGU2NCh0eF9yaW5nLT5jbnNtcl9pZHhfc2hfcmVnX2RtYSk7CiAKIAlxbF9pbml0X3R4X3JpbmcocWRldiwgdHhfcmluZyk7CiAKQEAgLTI3NDYsMTQgKzI3MTMsMTQgQEAKIAkJCQkgKiBPdXRib3VuZCBxdWV1ZSBpcyBmb3Igb3V0Ym91bmQgY29tcGxldGlvbnMgb25seS4KIAkJCQkgKi8KIAkJCQlpbnRyX2NvbnRleHQtPmhhbmRsZXIgPSBxbGdlX21zaXhfdHhfaXNyOwotCQkJCXNwcmludGYoaW50cl9jb250ZXh0LT5uYW1lLCAiJXMtdHhxLSVkIiwKKwkJCQlzcHJpbnRmKGludHJfY29udGV4dC0+bmFtZSwgIiVzLXR4LSVkIiwKIAkJCQkJcWRldi0+bmRldi0+bmFtZSwgaSk7CiAJCQl9IGVsc2UgewogCQkJCS8qCiAJCQkJICogSW5ib3VuZCBxdWV1ZXMgaGFuZGxlIHVuaWNhc3QgZnJhbWVzIG9ubHkuCiAJCQkJICovCiAJCQkJaW50cl9jb250ZXh0LT5oYW5kbGVyID0gcWxnZV9tc2l4X3J4X2lzcjsKLQkJCQlzcHJpbnRmKGludHJfY29udGV4dC0+bmFtZSwgIiVzLXJ4cS0lZCIsCisJCQkJc3ByaW50ZihpbnRyX2NvbnRleHQtPm5hbWUsICIlcy1yeC0lZCIsCiAJCQkJCXFkZXYtPm5kZXYtPm5hbWUsIGkpOwogCQkJfQogCQl9CkBAIC0zMjQ3LDcgKzMyMTQsNiBAQAogCQltc2xlZXAoMSk7CiAJcWxfYWRhcHRlcl9kb3duKHFkZXYpOwogCXFsX3JlbGVhc2VfYWRhcHRlcl9yZXNvdXJjZXMocWRldik7Ci0JcWxfZnJlZV9yaW5nX2NiKHFkZXYpOwogCXJldHVybiAwOwogfQogCkBAIC0zMjczLDggKzMyMzksOCBAQAogCSAqIFRoaXMgbGltaXRhdGlvbiBjYW4gYmUgcmVtb3ZlZCB3aGVuIHJlcXVlc3RlZC4KIAkgKi8KIAotCWlmIChjcHVfY250ID4gOCkKLQkJY3B1X2NudCA9IDg7CisJaWYgKGNwdV9jbnQgPiBNQVhfQ1BVUykKKwkJY3B1X2NudCA9IE1BWF9DUFVTOwogCiAJLyoKIAkgKiByeF9yaW5nWzBdIGlzIGFsd2F5cyB0aGUgZGVmYXVsdCBxdWV1ZS4KQEAgLTMyOTQsOSArMzI2MCw2IEBACiAJICovCiAJcWRldi0+cnhfcmluZ19jb3VudCA9IHFkZXYtPnR4X3JpbmdfY291bnQgKyBxZGV2LT5yc3NfcmluZ19jb3VudCArIDE7CiAKLQlpZiAocWxfYWxsb2NfcmluZ19jYihxZGV2KSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KIAlmb3IgKGkgPSAwOyBpIDwgcWRldi0+dHhfcmluZ19jb3VudDsgaSsrKSB7CiAJCXR4X3JpbmcgPSAmcWRldi0+dHhfcmluZ1tpXTsKIAkJbWVtc2V0KCh2b2lkICopdHhfcmluZywgMCwgc2l6ZW9mKHR4X3JpbmcpKTsKQEAgLTMzOTMsNyArMzM1Niw2IEBACiAKIGVycm9yX3VwOgogCXFsX3JlbGVhc2VfYWRhcHRlcl9yZXNvdXJjZXMocWRldik7Ci0JcWxfZnJlZV9yaW5nX2NiKHFkZXYpOwogCXJldHVybiBlcnI7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3I2MDQwLmMgYi9kcml2ZXJzL25ldC9yNjA0MC5jCmluZGV4IDUzYmJkZGYuLjcyZmQ5ZTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3I2MDQwLmMKKysrIGIvZHJpdmVycy9uZXQvcjYwNDAuYwpAQCAtNDksOCArNDksOCBAQAogI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KIAogI2RlZmluZSBEUlZfTkFNRQkicjYwNDAiCi0jZGVmaW5lIERSVl9WRVJTSU9OCSIwLjE5IgotI2RlZmluZSBEUlZfUkVMREFURQkiMThEZWMyMDA4IgorI2RlZmluZSBEUlZfVkVSU0lPTgkiMC4yMSIKKyNkZWZpbmUgRFJWX1JFTERBVEUJIjA5SmFuMjAwOSIKIAogLyogUEhZIENISVAgQWRkcmVzcyAqLwogI2RlZmluZSBQSFkxX0FERFIJMQkvKiBGb3IgTUFDMSAqLwpAQCAtMjAwLDcgKzIwMCw3IEBACiAKIHN0YXRpYyBjaGFyIHZlcnNpb25bXSBfX2RldmluaXRkYXRhID0gS0VSTl9JTkZPIERSVl9OQU1FCiAJIjogUkRDIFI2MDQwIE5BUEkgbmV0IGRyaXZlciwiCi0JInZlcnNpb24gIkRSVl9WRVJTSU9OICIgKCIgRFJWX1JFTERBVEUgIilcbiI7CisJInZlcnNpb24gIkRSVl9WRVJTSU9OICIgKCIgRFJWX1JFTERBVEUgIikiOwogCiBzdGF0aWMgaW50IHBoeV90YWJsZVtdID0geyBQSFkxX0FERFIsIFBIWTJfQUREUiB9OwogCkBAIC0zMzAsNyArMzMwLDcgQEAKIAlkbyB7CiAJCXNrYiA9IG5ldGRldl9hbGxvY19za2IoZGV2LCBNQVhfQlVGX1NJWkUpOwogCQlpZiAoIXNrYikgewotCQkJcHJpbnRrKEtFUk5fRVJSICIlczogZmFpbGVkIHRvIGFsbG9jIHNrYiBmb3IgcnhcbiIsIGRldi0+bmFtZSk7CisJCQlwcmludGsoS0VSTl9FUlIgRFJWX05BTUUgIiVzOiBmYWlsZWQgdG8gYWxsb2Mgc2tiIGZvciByeFxuIiwgZGV2LT5uYW1lKTsKIAkJCXJjID0gLUVOT01FTTsKIAkJCWdvdG8gZXJyX2V4aXQ7CiAJCX0KQEAgLTQ1NywyMiArNDU3LDEyIEBACiAJaW93cml0ZTE2KGFkcnBbMF0sIGlvYWRkciArIE1JRF8wTCk7CiAJaW93cml0ZTE2KGFkcnBbMV0sIGlvYWRkciArIE1JRF8wTSk7CiAJaW93cml0ZTE2KGFkcnBbMl0sIGlvYWRkciArIE1JRF8wSCk7Ci0JZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7Ci0KLQkvKiBGcmVlIFJYIGJ1ZmZlciAqLwotCXI2MDQwX2ZyZWVfcnhidWZzKGRldik7Ci0KLQkvKiBGcmVlIFRYIGJ1ZmZlciAqLwotCXI2MDQwX2ZyZWVfdHhidWZzKGRldik7Ci0KLQkvKiBGcmVlIERlc2NyaXB0b3IgbWVtb3J5ICovCi0JcGNpX2ZyZWVfY29uc2lzdGVudChwZGV2LCBSWF9ERVNDX1NJWkUsIGxwLT5yeF9yaW5nLCBscC0+cnhfcmluZ19kbWEpOwotCXBjaV9mcmVlX2NvbnNpc3RlbnQocGRldiwgVFhfREVTQ19TSVpFLCBscC0+dHhfcmluZywgbHAtPnR4X3JpbmdfZG1hKTsKIH0KIAogc3RhdGljIGludCByNjA0MF9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXN0cnVjdCByNjA0MF9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBscC0+cGRldjsKIAogCS8qIGRlbGV0ZWQgdGltZXIgKi8KIAlkZWxfdGltZXJfc3luYygmbHAtPnRpbWVyKTsKQEAgLTQ4MSw4ICs0NzEsMjggQEAKIAluYXBpX2Rpc2FibGUoJmxwLT5uYXBpKTsKIAluZXRpZl9zdG9wX3F1ZXVlKGRldik7CiAJcjYwNDBfZG93bihkZXYpOworCisJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisKKwkvKiBGcmVlIFJYIGJ1ZmZlciAqLworCXI2MDQwX2ZyZWVfcnhidWZzKGRldik7CisKKwkvKiBGcmVlIFRYIGJ1ZmZlciAqLworCXI2MDQwX2ZyZWVfdHhidWZzKGRldik7CisKIAlzcGluX3VubG9ja19pcnEoJmxwLT5sb2NrKTsKIAorCS8qIEZyZWUgRGVzY3JpcHRvciBtZW1vcnkgKi8KKwlpZiAobHAtPnJ4X3JpbmcpIHsKKwkJcGNpX2ZyZWVfY29uc2lzdGVudChwZGV2LCBSWF9ERVNDX1NJWkUsIGxwLT5yeF9yaW5nLCBscC0+cnhfcmluZ19kbWEpOworCQlscC0+cnhfcmluZyA9IDA7CisJfQorCisJaWYgKGxwLT50eF9yaW5nKSB7CisJCXBjaV9mcmVlX2NvbnNpc3RlbnQocGRldiwgVFhfREVTQ19TSVpFLCBscC0+dHhfcmluZywgbHAtPnR4X3JpbmdfZG1hKTsKKwkJbHAtPnR4X3JpbmcgPSAwOworCX0KKwogCXJldHVybiAwOwogfQogCkBAIC0xMDQ5LDYgKzEwNTksNyBAQAogCS5uZG9fc2V0X211bHRpY2FzdF9saXN0ID0gcjYwNDBfbXVsdGljYXN0X2xpc3QsCiAJLm5kb19jaGFuZ2VfbXR1CQk9IGV0aF9jaGFuZ2VfbXR1LAogCS5uZG9fdmFsaWRhdGVfYWRkcgk9IGV0aF92YWxpZGF0ZV9hZGRyLAorCS5uZG9fc2V0X21hY19hZGRyZXNzIAk9IGV0aF9tYWNfYWRkciwKIAkubmRvX2RvX2lvY3RsCQk9IHI2MDQwX2lvY3RsLAogCS5uZG9fdHhfdGltZW91dAkJPSByNjA0MF90eF90aW1lb3V0LAogI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCkBAIC0xMDc3LDIwICsxMDg4LDIwIEBACiAJLyogdGhpcyBzaG91bGQgYWx3YXlzIGJlIHN1cHBvcnRlZCAqLwogCWVyciA9IHBjaV9zZXRfZG1hX21hc2socGRldiwgRE1BXzMyQklUX01BU0spOwogCWlmIChlcnIpIHsKLQkJcHJpbnRrKEtFUk5fRVJSIERSVl9OQU1FICIzMi1iaXQgUENJIERNQSBhZGRyZXNzZXMiCisJCXByaW50ayhLRVJOX0VSUiBEUlZfTkFNRSAiOiAzMi1iaXQgUENJIERNQSBhZGRyZXNzZXMiCiAJCQkJIm5vdCBzdXBwb3J0ZWQgYnkgdGhlIGNhcmRcbiIpOwogCQlnb3RvIGVycl9vdXQ7CiAJfQogCWVyciA9IHBjaV9zZXRfY29uc2lzdGVudF9kbWFfbWFzayhwZGV2LCBETUFfMzJCSVRfTUFTSyk7CiAJaWYgKGVycikgewotCQlwcmludGsoS0VSTl9FUlIgRFJWX05BTUUgIjMyLWJpdCBQQ0kgRE1BIGFkZHJlc3NlcyIKKwkJcHJpbnRrKEtFUk5fRVJSIERSVl9OQU1FICI6IDMyLWJpdCBQQ0kgRE1BIGFkZHJlc3NlcyIKIAkJCQkibm90IHN1cHBvcnRlZCBieSB0aGUgY2FyZFxuIik7CiAJCWdvdG8gZXJyX291dDsKIAl9CiAKIAkvKiBJTyBTaXplIGNoZWNrICovCiAJaWYgKHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMCkgPCBpb19zaXplKSB7Ci0JCXByaW50ayhLRVJOX0VSUiBEUlZfTkFNRSAiSW5zdWZmaWNpZW50IFBDSSByZXNvdXJjZXMsIGFib3J0aW5nXG4iKTsKKwkJcHJpbnRrKEtFUk5fRVJSIERSVl9OQU1FICI6IEluc3VmZmljaWVudCBQQ0kgcmVzb3VyY2VzLCBhYm9ydGluZ1xuIik7CiAJCWVyciA9IC1FSU87CiAJCWdvdG8gZXJyX291dDsKIAl9CkBAIC0xMTAwLDcgKzExMTEsNyBAQAogCiAJZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKHN0cnVjdCByNjA0MF9wcml2YXRlKSk7CiAJaWYgKCFkZXYpIHsKLQkJcHJpbnRrKEtFUk5fRVJSIERSVl9OQU1FICJGYWlsZWQgdG8gYWxsb2NhdGUgZXRoZXJkZXZcbiIpOworCQlwcmludGsoS0VSTl9FUlIgRFJWX05BTUUgIjogRmFpbGVkIHRvIGFsbG9jYXRlIGV0aGVyZGV2XG4iKTsKIAkJZXJyID0gLUVOT01FTTsKIAkJZ290byBlcnJfb3V0OwogCX0KQEAgLTExMTYsMTEgKzExMjcsMTUgQEAKIAogCWlvYWRkciA9IHBjaV9pb21hcChwZGV2LCBiYXIsIGlvX3NpemUpOwogCWlmICghaW9hZGRyKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiaW9yZW1hcCBmYWlsZWQgZm9yIGRldmljZSAlc1xuIiwKKwkJcHJpbnRrKEtFUk5fRVJSIERSVl9OQU1FICI6IGlvcmVtYXAgZmFpbGVkIGZvciBkZXZpY2UgJXNcbiIsCiAJCQlwY2lfbmFtZShwZGV2KSk7CiAJCWVyciA9IC1FSU87CiAJCWdvdG8gZXJyX291dF9mcmVlX3JlczsKIAl9CisJLyogSWYgUEhZIHN0YXR1cyBjaGFuZ2UgcmVnaXN0ZXIgaXMgc3RpbGwgc2V0IHRvIHplcm8gaXQgbWVhbnMgdGhlCisJICogYm9vdGxvYWRlciBkaWRuJ3QgaW5pdGlhbGl6ZSBpdCAqLworCWlmIChpb3JlYWQxNihpb2FkZHIgKyBQSFlfQ0MpID09IDApCisJCWlvd3JpdGUxNigweDlmMDcsIGlvYWRkciArIFBIWV9DQyk7CiAKIAkvKiBJbml0IHN5c3RlbSAmIGRldmljZSAqLwogCWxwLT5iYXNlID0gaW9hZGRyOwpAQCAtMTEzNyw2ICsxMTUyLDEzIEBACiAJYWRycFsxXSA9IGlvcmVhZDE2KGlvYWRkciArIE1JRF8wTSk7CiAJYWRycFsyXSA9IGlvcmVhZDE2KGlvYWRkciArIE1JRF8wSCk7CiAKKwkvKiBTb21lIGJvb3Rsb2FkZXIvQklPU2VzIGRvIG5vdCBpbml0aWFsaXplCisJICogTUFDIGFkZHJlc3MsIHdhcm4gYWJvdXQgdGhhdCAqLworCWlmICghKGFkcnBbMF0gfHwgYWRycFsxXSB8fCBhZHJwWzJdKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HIERSVl9OQU1FICI6IE1BQyBhZGRyZXNzIG5vdCBpbml0aWFsaXplZCwgZ2VuZXJhdGluZyByYW5kb21cbiIpOworCQlyYW5kb21fZXRoZXJfYWRkcihkZXYtPmRldl9hZGRyKTsKKwl9CisKIAkvKiBMaW5rIG5ldyBkZXZpY2UgaW50byByNjA0MF9yb290X2RldiAqLwogCWxwLT5wZGV2ID0gcGRldjsKIAlscC0+ZGV2ID0gZGV2OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2IxMDAwLmMgYi9kcml2ZXJzL25ldC9zYjEwMDAuYwppbmRleCBiZTMwMjUzLi5mYzBlMzhiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zYjEwMDAuYworKysgYi9kcml2ZXJzL25ldC9zYjEwMDAuYwpAQCAtMTM0LDYgKzEzNCwxNiBAQAogfTsKIE1PRFVMRV9ERVZJQ0VfVEFCTEUocG5wLCBzYjEwMDBfcG5wX2lkcyk7CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgc2IxMDAwX25ldGRldl9vcHMgPSB7CisJLm5kb19vcGVuCQk9IHNiMTAwMF9vcGVuLAorCS5uZG9fc3RhcnRfeG1pdAkJPSBzYjEwMDBfc3RhcnRfeG1pdCwKKwkubmRvX2RvX2lvY3RsCQk9IHNiMTAwMF9kZXZfaW9jdGwsCisJLm5kb19zdG9wCQk9IHNiMTAwMF9jbG9zZSwKKwkubmRvX2NoYW5nZV9tdHUJCT0gZXRoX2NoYW5nZV9tdHUsCisJLm5kb19zZXRfbWFjX2FkZHJlc3MgCT0gZXRoX21hY19hZGRyLAorCS5uZG9fdmFsaWRhdGVfYWRkcgk9IGV0aF92YWxpZGF0ZV9hZGRyLAorfTsKKwogc3RhdGljIGludAogc2IxMDAwX3Byb2JlX29uZShzdHJ1Y3QgcG5wX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBucF9kZXZpY2VfaWQgKmlkKQogewpAQCAtMTkyLDExICsyMDIsNyBAQAogCWlmIChzYjEwMDBfZGVidWcgPiAwKQogCQlwcmludGsoS0VSTl9OT1RJQ0UgIiVzIiwgdmVyc2lvbik7CiAKLQkvKiBUaGUgU0IxMDAwLXNwZWNpZmljIGVudHJpZXMgaW4gdGhlIGRldmljZSBzdHJ1Y3R1cmUuICovCi0JZGV2LT5vcGVuCQk9IHNiMTAwMF9vcGVuOwotCWRldi0+ZG9faW9jdGwJCT0gc2IxMDAwX2Rldl9pb2N0bDsKLQlkZXYtPmhhcmRfc3RhcnRfeG1pdAk9IHNiMTAwMF9zdGFydF94bWl0OwotCWRldi0+c3RvcAkJPSBzYjEwMDBfY2xvc2U7CisJZGV2LT5uZXRkZXZfb3BzCT0gJnNiMTAwMF9uZXRkZXZfb3BzOwogCiAJLyogaGFyZHdhcmUgYWRkcmVzcyBpcyAwOjA6c2VyaWFsX251bWJlciAqLwogCWRldi0+ZGV2X2FkZHJbMl0JPSBzZXJpYWxfbnVtYmVyID4+IDI0ICYgMHhmZjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NjOTIwMzEuYyBiL2RyaXZlcnMvbmV0L3NjOTIwMzEuYwppbmRleCA0MmZkMzEyLi44Yjc1YmVmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zYzkyMDMxLmMKKysrIGIvZHJpdmVycy9uZXQvc2M5MjAzMS5jCkBAIC0xNDA4LDYgKzE0MDgsNyBAQAogCS5uZG9fc2V0X211bHRpY2FzdF9saXN0CT0gc2M5MjAzMV9zZXRfbXVsdGljYXN0X2xpc3QsCiAJLm5kb19jaGFuZ2VfbXR1CQk9IGV0aF9jaGFuZ2VfbXR1LAogCS5uZG9fdmFsaWRhdGVfYWRkcgk9IGV0aF92YWxpZGF0ZV9hZGRyLAorCS5uZG9fc2V0X21hY19hZGRyZXNzIAk9IGV0aF9tYWNfYWRkciwKIAkubmRvX3R4X3RpbWVvdXQJCT0gc2M5MjAzMV90eF90aW1lb3V0LAogI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCiAJLm5kb19wb2xsX2NvbnRyb2xsZXIJPSBzYzkyMDMxX3BvbGxfY29udHJvbGxlciwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NmYy9mYWxjb24uYyBiL2RyaXZlcnMvbmV0L3NmYy9mYWxjb24uYwppbmRleCA2ODg0ZGM4Li41YjlmMmQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zZmMvZmFsY29uLmMKKysrIGIvZHJpdmVycy9uZXQvc2ZjL2ZhbGNvbi5jCkBAIC0xNDAzLDkgKzE0MDMsOSBAQAogCX0KIAogCS8qIERpc2FibGUgYm90aCBkZXZpY2VzICovCi0JcGNpX2Rpc2FibGVfZGV2aWNlKGVmeC0+cGNpX2Rldik7CisJcGNpX2NsZWFyX21hc3RlcihlZngtPnBjaV9kZXYpOwogCWlmIChGQUxDT05fSVNfRFVBTF9GVU5DKGVmeCkpCi0JCXBjaV9kaXNhYmxlX2RldmljZShuaWNfZGF0YS0+cGNpX2RldjIpOworCQlwY2lfY2xlYXJfbWFzdGVyKG5pY19kYXRhLT5wY2lfZGV2Mik7CiAJZmFsY29uX2Rpc2FibGVfaW50ZXJydXB0cyhlZngpOwogCiAJaWYgKCsrbl9pbnRfZXJyb3JzIDwgRkFMQ09OX01BWF9JTlRfRVJST1JTKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zZmMvdGVueHByZXNzLmMgYi9kcml2ZXJzL25ldC9zZmMvdGVueHByZXNzLmMKaW5kZXggYjk3Njg3Ni4uOWVjYjc3ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvc2ZjL3RlbnhwcmVzcy5jCisrKyBiL2RyaXZlcnMvbmV0L3NmYy90ZW54cHJlc3MuYwpAQCAtNjM2LDEwICs2MzYsMTEgQEAKIHsKIAlpbnQgcmVnOwogCi0JaWYgKGVmeC0+cGh5X3R5cGUgPT0gUEhZX1RZUEVfU0ZUOTAwMUIpIHsKKwlpZiAoZWZ4LT5waHlfdHlwZSA9PSBQSFlfVFlQRV9TRlQ5MDAxQikKIAkJZGV2aWNlX3JlbW92ZV9maWxlKCZlZngtPnBjaV9kZXYtPmRldiwKIAkJCQkgICAmZGV2X2F0dHJfcGh5X3Nob3J0X3JlYWNoKTsKLQl9IGVsc2UgeworCisJaWYgKGVmeC0+cGh5X3R5cGUgPT0gUEhZX1RZUEVfU0ZYNzEwMSkgewogCQkvKiBQb3dlciBkb3duIHRoZSBMTlBHQSAqLwogCQlyZWcgPSAoMSA8PCBQTUFfUE1EX0xOUEdBX1BPV0VSRE9XTl9MQk4pOwogCQltZGlvX2NsYXVzZTQ1X3dyaXRlKGVmeCwgZWZ4LT5taWkucGh5X2lkLCBNRElPX01NRF9QTUFQTUQsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zaXMxOTAuYyBiL2RyaXZlcnMvbmV0L3NpczE5MC5jCmluZGV4IDgzY2MzYzUuLmE5NzMyNjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3NpczE5MC5jCisrKyBiL2RyaXZlcnMvbmV0L3NpczE5MC5jCkBAIC0xNzgyLDYgKzE3ODIsMjEgQEAKIAkJZ2VuZXJpY19taWlfaW9jdGwoJnRwLT5taWlfaWYsIGlmX21paShpZnIpLCBjbWQsIE5VTEwpOwogfQogCitzdGF0aWMgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzIHNpczE5MF9uZXRkZXZfb3BzID0geworCS5uZG9fb3BlbgkJPSBzaXMxOTBfb3BlbiwKKwkubmRvX3N0b3AJCT0gc2lzMTkwX2Nsb3NlLAorCS5uZG9fZG9faW9jdGwJCT0gc2lzMTkwX2lvY3RsLAorCS5uZG9fc3RhcnRfeG1pdAkJPSBzaXMxOTBfc3RhcnRfeG1pdCwKKwkubmRvX3R4X3RpbWVvdXQJCT0gc2lzMTkwX3R4X3RpbWVvdXQsCisJLm5kb19zZXRfbXVsdGljYXN0X2xpc3QgPSBzaXMxOTBfc2V0X3J4X21vZGUsCisJLm5kb19jaGFuZ2VfbXR1CQk9IGV0aF9jaGFuZ2VfbXR1LAorCS5uZG9fc2V0X21hY19hZGRyZXNzIAk9IGV0aF9tYWNfYWRkciwKKwkubmRvX3ZhbGlkYXRlX2FkZHIJPSBldGhfdmFsaWRhdGVfYWRkciwKKyNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgorCS5uZG9fcG9sbF9jb250cm9sbGVyCSA9IHNpczE5MF9uZXRwb2xsLAorI2VuZGlmCit9OworCiBzdGF0aWMgaW50IF9fZGV2aW5pdCBzaXMxOTBfaW5pdF9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsCiAJCQkJICAgICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQogewpAQCAtMTgxNSwxOSArMTgzMCwxMiBAQAogCiAJSU5JVF9XT1JLKCZ0cC0+cGh5X3Rhc2ssIHNpczE5MF9waHlfdGFzayk7CiAKLQlkZXYtPm9wZW4gPSBzaXMxOTBfb3BlbjsKLQlkZXYtPnN0b3AgPSBzaXMxOTBfY2xvc2U7Ci0JZGV2LT5kb19pb2N0bCA9IHNpczE5MF9pb2N0bDsKLQlkZXYtPnR4X3RpbWVvdXQgPSBzaXMxOTBfdHhfdGltZW91dDsKLQlkZXYtPndhdGNoZG9nX3RpbWVvID0gU0lTMTkwX1RYX1RJTUVPVVQ7Ci0JZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSBzaXMxOTBfc3RhcnRfeG1pdDsKLSNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgotCWRldi0+cG9sbF9jb250cm9sbGVyID0gc2lzMTkwX25ldHBvbGw7Ci0jZW5kaWYKLQlkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9IHNpczE5MF9zZXRfcnhfbW9kZTsKKwlkZXYtPm5ldGRldl9vcHMgPSAmc2lzMTkwX25ldGRldl9vcHM7CisKIAlTRVRfRVRIVE9PTF9PUFMoZGV2LCAmc2lzMTkwX2V0aHRvb2xfb3BzKTsKIAlkZXYtPmlycSA9IHBkZXYtPmlycTsKIAlkZXYtPmJhc2VfYWRkciA9ICh1bnNpZ25lZCBsb25nKSAweGRlYWQ7CisJZGV2LT53YXRjaGRvZ190aW1lbyA9IFNJUzE5MF9UWF9USU1FT1VUOwogCiAJc3Bpbl9sb2NrX2luaXQoJnRwLT5sb2NrKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2lzOTAwLmMgYi9kcml2ZXJzL25ldC9zaXM5MDAuYwppbmRleCA0YWNkNDFhLi5iZTQ0NjViYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvc2lzOTAwLmMKKysrIGIvZHJpdmVycy9uZXQvc2lzOTAwLmMKQEAgLTM4OSw2ICszODksNyBAQAogCS5uZG9fc2V0X211bHRpY2FzdF9saXN0CT0gc2V0X3J4X21vZGUsCiAJLm5kb19jaGFuZ2VfbXR1CQk9IGV0aF9jaGFuZ2VfbXR1LAogCS5uZG9fdmFsaWRhdGVfYWRkcgk9IGV0aF92YWxpZGF0ZV9hZGRyLAorCS5uZG9fc2V0X21hY19hZGRyZXNzIAk9IGV0aF9tYWNfYWRkciwKIAkubmRvX2RvX2lvY3RsCQk9IG1paV9pb2N0bCwKIAkubmRvX3R4X3RpbWVvdXQJCT0gc2lzOTAwX3R4X3RpbWVvdXQsCiAjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKQEAgLTUwOCwxMCArNTA5LDEwIEBACiAJZWxzZQogCQlyZXQgPSBzaXM5MDBfZ2V0X21hY19hZGRyKHBjaV9kZXYsIG5ldF9kZXYpOwogCi0JaWYgKHJldCA9PSAwKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBDYW5ub3QgcmVhZCBNQUMgYWRkcmVzcy5cbiIsIGRldl9uYW1lKTsKLQkJcmV0ID0gLUVOT0RFVjsKLQkJZ290byBlcnJfdW5tYXBfcng7CisJaWYgKCFyZXQgfHwgIWlzX3ZhbGlkX2V0aGVyX2FkZHIobmV0X2Rldi0+ZGV2X2FkZHIpKSB7CisJCXJhbmRvbV9ldGhlcl9hZGRyKG5ldF9kZXYtPmRldl9hZGRyKTsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFVucmVhZGFibGUgb3IgaW52YWxpZCBNQUMgYWRkcmVzcywiCisJCQkJInVzaW5nIHJhbmRvbSBnZW5lcmF0ZWQgb25lXG4iLCBkZXZfbmFtZSk7CiAJfQogCiAJLyogNjMwRVQgOiBzZXQgdGhlIG1paSBhY2Nlc3MgbW9kZSBhcyBzb2Z0d2FyZS1tb2RlICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zbGlwLmMgYi9kcml2ZXJzL25ldC9zbGlwLmMKaW5kZXggOGUxYzBiYS4uNWM2MWQ1ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvc2xpcC5jCisrKyBiL2RyaXZlcnMvbmV0L3NsaXAuYwpAQCAtNjAzLDcgKzYwMyw2IEBACiAJZGV2LT5tdHUJCT0gc2wtPm10dTsKIAlkZXYtPnR5cGUJCT0gQVJQSFJEX1NMSVAgKyBzbC0+bW9kZTsKICNpZmRlZiBTTF9DSEVDS19UUkFOU01JVAotCWRldi0+dHhfdGltZW91dAkJPSBzbF90eF90aW1lb3V0OwogCWRldi0+d2F0Y2hkb2dfdGltZW8JPSAyMCpIWjsKICNlbmRpZgogCXJldHVybiAwOwpAQCAtNjE3LDE5ICs2MTYsMjYgQEAKIAlzbF9mcmVlX2J1ZnMoc2wpOwogfQogCitzdGF0aWMgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzIHNsX25ldGRldl9vcHMgPSB7CisJLm5kb19pbml0CQk9IHNsX2luaXQsCisJLm5kb191bmluaXQJICAJPSBzbF91bmluaXQsCisJLm5kb19vcGVuCQk9IHNsX29wZW4sCisJLm5kb19zdG9wCQk9IHNsX2Nsb3NlLAorCS5uZG9fc3RhcnRfeG1pdAkJPSBzbF94bWl0LAorCS5uZG9fZ2V0X3N0YXRzCSAgICAgICAgPSBzbF9nZXRfc3RhdHMsCisJLm5kb19jaGFuZ2VfbXR1CQk9IHNsX2NoYW5nZV9tdHUsCisJLm5kb190eF90aW1lb3V0CQk9IHNsX3R4X3RpbWVvdXQsCisjaWZkZWYgQ09ORklHX1NMSVBfU01BUlQKKwkubmRvX2RvX2lvY3RsCQk9IHNsX2lvY3RsLAorI2VuZGlmCit9OworCisKIHN0YXRpYyB2b2lkIHNsX3NldHVwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7Ci0JZGV2LT5pbml0CQk9IHNsX2luaXQ7Ci0JZGV2LT51bmluaXQJICAJPSBzbF91bmluaXQ7Ci0JZGV2LT5vcGVuCQk9IHNsX29wZW47CisJZGV2LT5uZXRkZXZfb3BzCQk9ICZzbF9uZXRkZXZfb3BzOwogCWRldi0+ZGVzdHJ1Y3RvcgkJPSBmcmVlX25ldGRldjsKLQlkZXYtPnN0b3AJCT0gc2xfY2xvc2U7Ci0JZGV2LT5nZXRfc3RhdHMJICAgICAgICA9IHNsX2dldF9zdGF0czsKLQlkZXYtPmNoYW5nZV9tdHUJCT0gc2xfY2hhbmdlX210dTsKLQlkZXYtPmhhcmRfc3RhcnRfeG1pdAk9IHNsX3htaXQ7Ci0jaWZkZWYgQ09ORklHX1NMSVBfU01BUlQKLQlkZXYtPmRvX2lvY3RsCQk9IHNsX2lvY3RsOwotI2VuZGlmCisKIAlkZXYtPmhhcmRfaGVhZGVyX2xlbgk9IDA7CiAJZGV2LT5hZGRyX2xlbgkJPSAwOwogCWRldi0+dHhfcXVldWVfbGVuCT0gMTA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zbGlwLmggYi9kcml2ZXJzL25ldC9zbGlwLmgKaW5kZXggODUzZTBmNi4uOWVhNWMxMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvc2xpcC5oCisrKyBiL2RyaXZlcnMvbmV0L3NsaXAuaApAQCAtNzUsNyArNzUsNyBAQAogICB1bnNpZ25lZCBsb25nICAgICAgICAgdHhfZXJyb3JzOyAgICAgIC8qIFBsYW5uZWQgc3R1ZmYgICAgICAgICAgICAgICAgKi8KICAgdW5zaWduZWQgbG9uZyAgICAgICAgIHJ4X2Ryb3BwZWQ7ICAgICAvKiBObyBtZW1vcnkgZm9yIHNrYiAgICAgICAgICAgICovCiAgIHVuc2lnbmVkIGxvbmcgICAgICAgICB0eF9kcm9wcGVkOyAgICAgLyogV2hlbiBNVFUgY2hhbmdlICAgICAgICAgICAgICAqLwotICB1bnNpZ25lZCBsb25nICAgICAgICAgcnhfb3Zlcl9lcnJvcnM7IC8qIEZyYW1lIGJpZ2dlciB0aGVuIFNMSVAgYnVmLiAgKi8KKyAgdW5zaWduZWQgbG9uZyAgICAgICAgIHJ4X292ZXJfZXJyb3JzOyAvKiBGcmFtZSBiaWdnZXIgdGhhbiBTTElQIGJ1Zi4gICovCiAjaWZkZWYgU0xfSU5DTFVERV9DU0xJUAogICB1bnNpZ25lZCBsb25nCQl0eF9jb21wcmVzc2VkOwogICB1bnNpZ25lZCBsb25nCQlyeF9jb21wcmVzc2VkOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc21jLW1jYS5jIGIvZHJpdmVycy9uZXQvc21jLW1jYS5jCmluZGV4IDQwNGI4MGUuLjhkMzZkNDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3NtYy1tY2EuYworKysgYi9kcml2ZXJzL25ldC9zbWMtbWNhLmMKQEAgLTE5Miw2ICsxOTIsNyBAQAogCS5uZG9fZ2V0X3N0YXRzCQk9IGVpX2dldF9zdGF0cywKIAkubmRvX3NldF9tdWx0aWNhc3RfbGlzdCA9IGVpX3NldF9tdWx0aWNhc3RfbGlzdCwKIAkubmRvX3ZhbGlkYXRlX2FkZHIJPSBldGhfdmFsaWRhdGVfYWRkciwKKwkubmRvX3NldF9tYWNfYWRkcmVzcyAJPSBldGhfbWFjX2FkZHIsCiAJLm5kb19jaGFuZ2VfbXR1CQk9IGV0aF9jaGFuZ2VfbXR1LAogI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCiAJLm5kb19wb2xsX2NvbnRyb2xsZXIgCT0gZWlfcG9sbCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NtYy11bHRyYS5jIGIvZHJpdmVycy9uZXQvc21jLXVsdHJhLmMKaW5kZXggYjM4NjYwOC4uMjAzM2ZlZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvc21jLXVsdHJhLmMKKysrIGIvZHJpdmVycy9uZXQvc21jLXVsdHJhLmMKQEAgLTE5Niw2ICsxOTYsNyBAQAogCS5uZG9fZ2V0X3N0YXRzCQk9IGVpX2dldF9zdGF0cywKIAkubmRvX3NldF9tdWx0aWNhc3RfbGlzdCA9IGVpX3NldF9tdWx0aWNhc3RfbGlzdCwKIAkubmRvX3ZhbGlkYXRlX2FkZHIJPSBldGhfdmFsaWRhdGVfYWRkciwKKwkubmRvX3NldF9tYWNfYWRkcmVzcyAJPSBldGhfbWFjX2FkZHIsCiAJLm5kb19jaGFuZ2VfbXR1CQk9IGV0aF9jaGFuZ2VfbXR1LAogI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCiAJLm5kb19wb2xsX2NvbnRyb2xsZXIgCT0gZWlfcG9sbCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3Ntc2M5MTF4LmMgYi9kcml2ZXJzL25ldC9zbXNjOTExeC5jCmluZGV4IGRjM2YxMTAuLmY1MTNiZGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3Ntc2M5MTF4LmMKKysrIGIvZHJpdmVycy9uZXQvc21zYzkxMXguYwpAQCAtMTQ0LDYgKzE0NCw3IEBACiAJfQogCiAJQlVHKCk7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBzbXNjOTExeF9yZWdfd3JpdGUoc3RydWN0IHNtc2M5MTF4X2RhdGEgKnBkYXRhLCB1MzIgcmVnLApAQCAtMTc0MCw2ICsxNzQxLDcgQEAKIAkubmRvX3NldF9tdWx0aWNhc3RfbGlzdAk9IHNtc2M5MTF4X3NldF9tdWx0aWNhc3RfbGlzdCwKIAkubmRvX2RvX2lvY3RsCQk9IHNtc2M5MTF4X2RvX2lvY3RsLAogCS5uZG9fdmFsaWRhdGVfYWRkcgk9IGV0aF92YWxpZGF0ZV9hZGRyLAorCS5uZG9fc2V0X21hY19hZGRyZXNzIAk9IGV0aF9tYWNfYWRkciwKICNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgogCS5uZG9fcG9sbF9jb250cm9sbGVyCT0gc21zYzkxMXhfcG9sbF9jb250cm9sbGVyLAogI2VuZGlmCkBAIC0xOTY3LDcgKzE5NjksNyBAQAogCXNtc2M5MTF4X3JlZ193cml0ZShwZGF0YSwgSU5UX1NUUywgMHhGRkZGRkZGRik7CiAKIAlyZXR2YWwgPSByZXF1ZXN0X2lycShkZXYtPmlycSwgc21zYzkxMXhfaXJxaGFuZGxlciwgSVJRRl9ESVNBQkxFRCwKLQkJCSAgICAgU01TQ19DSElQTkFNRSwgZGV2KTsKKwkJCSAgICAgZGV2LT5uYW1lLCBkZXYpOwogCWlmIChyZXR2YWwpIHsKIAkJU01TQ19XQVJOSU5HKFBST0JFLAogCQkJIlVuYWJsZSB0byBjbGFpbSByZXF1ZXN0ZWQgaXJxOiAlZCIsIGRldi0+aXJxKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3Ntc2M5NDIwLmMgYi9kcml2ZXJzL25ldC9zbXNjOTQyMC5jCmluZGV4IDI3ZTAxN2QuLmMxNGE0YzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3Ntc2M5NDIwLmMKKysrIGIvZHJpdmVycy9uZXQvc21zYzk0MjAuYwpAQCAtMTU1MSw2ICsxNTUxLDcgQEAKIAkubmRvX3NldF9tdWx0aWNhc3RfbGlzdAk9IHNtc2M5NDIwX3NldF9tdWx0aWNhc3RfbGlzdCwKIAkubmRvX2RvX2lvY3RsCQk9IHNtc2M5NDIwX2RvX2lvY3RsLAogCS5uZG9fdmFsaWRhdGVfYWRkcgk9IGV0aF92YWxpZGF0ZV9hZGRyLAorCS5uZG9fc2V0X21hY19hZGRyZXNzIAk9IGV0aF9tYWNfYWRkciwKICNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgogCS5uZG9fcG9sbF9jb250cm9sbGVyCT0gc21zYzk0MjBfcG9sbF9jb250cm9sbGVyLAogI2VuZGlmIC8qIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zdGFyZmlyZS5jIGIvZHJpdmVycy9uZXQvc3RhcmZpcmUuYwppbmRleCA1N2ZiMWY3Li5kYTNhNzZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zdGFyZmlyZS5jCisrKyBiL2RyaXZlcnMvbmV0L3N0YXJmaXJlLmMKQEAgLTY0OCw2ICs2NDgsMjQgQEAKICNlbmRpZiAvKiBWTEFOX1NVUFBPUlQgKi8KIAogCitzdGF0aWMgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzIG5ldGRldl9vcHMgPSB7CisJLm5kb19vcGVuCQk9IG5ldGRldl9vcGVuLAorCS5uZG9fc3RvcAkJPSBuZXRkZXZfY2xvc2UsCisJLm5kb19zdGFydF94bWl0CQk9IHN0YXJ0X3R4LAorCS5uZG9fdHhfdGltZW91dCAJPSB0eF90aW1lb3V0LAorCS5uZG9fZ2V0X3N0YXRzIAkJPSBnZXRfc3RhdHMsCisJLm5kb19zZXRfbXVsdGljYXN0X2xpc3QgPSAmc2V0X3J4X21vZGUsCisJLm5kb19kb19pb2N0bCAJCT0gbmV0ZGV2X2lvY3RsLAorCS5uZG9fY2hhbmdlX210dQkJPSBldGhfY2hhbmdlX210dSwKKwkubmRvX3NldF9tYWNfYWRkcmVzcyAJPSBldGhfbWFjX2FkZHIsCisJLm5kb192YWxpZGF0ZV9hZGRyCT0gZXRoX3ZhbGlkYXRlX2FkZHIsCisjaWZkZWYgVkxBTl9TVVBQT1JUCisJLm5kb192bGFuX3J4X3JlZ2lzdGVyCT0gbmV0ZGV2X3ZsYW5fcnhfcmVnaXN0ZXIsCisJLm5kb192bGFuX3J4X2FkZF92aWQJPSBuZXRkZXZfdmxhbl9yeF9hZGRfdmlkLAorCS5uZG9fdmxhbl9yeF9raWxsX3ZpZAk9IG5ldGRldl92bGFuX3J4X2tpbGxfdmlkLAorI2VuZGlmCit9OworCiBzdGF0aWMgaW50IF9fZGV2aW5pdCBzdGFyZmlyZV9pbml0X29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwKIAkJCQkgICAgICAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKIHsKQEAgLTcxMCwxMSArNzI4LDkgQEAKIAlpZiAoZW5hYmxlX2h3X2Nrc3VtKQogCQlkZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfSVBfQ1NVTSB8IE5FVElGX0ZfU0c7CiAjZW5kaWYgLyogWkVST0NPUFkgKi8KKwogI2lmZGVmIFZMQU5fU1VQUE9SVAogCWRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9IV19WTEFOX1JYIHwgTkVUSUZfRl9IV19WTEFOX0ZJTFRFUjsKLQlkZXYtPnZsYW5fcnhfcmVnaXN0ZXIgPSBuZXRkZXZfdmxhbl9yeF9yZWdpc3RlcjsKLQlkZXYtPnZsYW5fcnhfYWRkX3ZpZCA9IG5ldGRldl92bGFuX3J4X2FkZF92aWQ7Ci0JZGV2LT52bGFuX3J4X2tpbGxfdmlkID0gbmV0ZGV2X3ZsYW5fcnhfa2lsbF92aWQ7CiAjZW5kaWYgLyogVkxBTl9SWF9LSUxMX1ZJRCAqLwogI2lmZGVmIEFERFJfNjRCSVRTCiAJZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX0hJR0hETUE7CkBAIC04MTAsMTggKzgyNiwxMiBAQAogCQl9CiAJfQogCi0JLyogVGhlIGNoaXAtc3BlY2lmaWMgZW50cmllcyBpbiB0aGUgZGV2aWNlIHN0cnVjdHVyZS4gKi8KLQlkZXYtPm9wZW4gPSAmbmV0ZGV2X29wZW47Ci0JZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSAmc3RhcnRfdHg7Ci0JZGV2LT50eF90aW1lb3V0ID0gdHhfdGltZW91dDsKKwlkZXYtPm5ldGRldl9vcHMgPSAmbmV0ZGV2X29wczsKIAlkZXYtPndhdGNoZG9nX3RpbWVvID0gVFhfVElNRU9VVDsKLQluZXRpZl9uYXBpX2FkZChkZXYsICZucC0+bmFwaSwgbmV0ZGV2X3BvbGwsIG1heF9pbnRlcnJ1cHRfd29yayk7Ci0JZGV2LT5zdG9wID0gJm5ldGRldl9jbG9zZTsKLQlkZXYtPmdldF9zdGF0cyA9ICZnZXRfc3RhdHM7Ci0JZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSAmc2V0X3J4X21vZGU7Ci0JZGV2LT5kb19pb2N0bCA9ICZuZXRkZXZfaW9jdGw7CiAJU0VUX0VUSFRPT0xfT1BTKGRldiwgJmV0aHRvb2xfb3BzKTsKIAorCW5ldGlmX25hcGlfYWRkKGRldiwgJm5wLT5uYXBpLCBuZXRkZXZfcG9sbCwgbWF4X2ludGVycnVwdF93b3JrKTsKKwogCWlmIChtdHUpCiAJCWRldi0+bXR1ID0gbXR1OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zdW5kYW5jZS5jIGIvZHJpdmVycy9uZXQvc3VuZGFuY2UuYwppbmRleCA2OTg4OTNiLi5mZWFmMGUwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zdW5kYW5jZS5jCisrKyBiL2RyaXZlcnMvbmV0L3N1bmRhbmNlLmMKQEAgLTQ0OSw2ICs0NDksMTkgQEAKIAl9CiB9CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgbmV0ZGV2X29wcyA9IHsKKwkubmRvX29wZW4JCT0gbmV0ZGV2X29wZW4sCisJLm5kb19zdG9wCQk9IG5ldGRldl9jbG9zZSwKKwkubmRvX3N0YXJ0X3htaXQJCT0gc3RhcnRfdHgsCisJLm5kb19nZXRfc3RhdHMgCQk9IGdldF9zdGF0cywKKwkubmRvX3NldF9tdWx0aWNhc3RfbGlzdCA9IHNldF9yeF9tb2RlLAorCS5uZG9fZG9faW9jdGwgCQk9IG5ldGRldl9pb2N0bCwKKwkubmRvX3R4X3RpbWVvdXQJCT0gdHhfdGltZW91dCwKKwkubmRvX2NoYW5nZV9tdHUJCT0gY2hhbmdlX210dSwKKwkubmRvX3NldF9tYWNfYWRkcmVzcyAJPSBldGhfbWFjX2FkZHIsCisJLm5kb192YWxpZGF0ZV9hZGRyCT0gZXRoX3ZhbGlkYXRlX2FkZHIsCit9OworCiBzdGF0aWMgaW50IF9fZGV2aW5pdCBzdW5kYW5jZV9wcm9iZTEgKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAogCQkJCSAgICAgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCiB7CkBAIC01MzAsMTYgKzU0MywxMCBAQAogCW5wLT5taWlfaWYucmVnX251bV9tYXNrID0gMHgxZjsKIAogCS8qIFRoZSBjaGlwLXNwZWNpZmljIGVudHJpZXMgaW4gdGhlIGRldmljZSBzdHJ1Y3R1cmUuICovCi0JZGV2LT5vcGVuID0gJm5ldGRldl9vcGVuOwotCWRldi0+aGFyZF9zdGFydF94bWl0ID0gJnN0YXJ0X3R4OwotCWRldi0+c3RvcCA9ICZuZXRkZXZfY2xvc2U7Ci0JZGV2LT5nZXRfc3RhdHMgPSAmZ2V0X3N0YXRzOwotCWRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gJnNldF9yeF9tb2RlOwotCWRldi0+ZG9faW9jdGwgPSAmbmV0ZGV2X2lvY3RsOworCWRldi0+bmV0ZGV2X29wcyA9ICZuZXRkZXZfb3BzOwogCVNFVF9FVEhUT09MX09QUyhkZXYsICZldGh0b29sX29wcyk7Ci0JZGV2LT50eF90aW1lb3V0ID0gJnR4X3RpbWVvdXQ7CiAJZGV2LT53YXRjaGRvZ190aW1lbyA9IFRYX1RJTUVPVVQ7Ci0JZGV2LT5jaGFuZ2VfbXR1ID0gJmNoYW5nZV9tdHU7CisKIAlwY2lfc2V0X2RydmRhdGEocGRldiwgZGV2KTsKIAogCWkgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3N1bmdlbS5jIGIvZHJpdmVycy9uZXQvc3VuZ2VtLmMKaW5kZXggOGE3NDYwNC4uODZjNzY1ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvc3VuZ2VtLmMKKysrIGIvZHJpdmVycy9uZXQvc3VuZ2VtLmMKQEAgLTI5ODksNiArMjk4OSwxOSBAQAogCX0KIH0KIAorc3RhdGljIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyBnZW1fbmV0ZGV2X29wcyA9IHsKKwkubmRvX29wZW4JCT0gZ2VtX29wZW4sCisJLm5kb19zdG9wCQk9IGdlbV9jbG9zZSwKKwkubmRvX3N0YXJ0X3htaXQJCT0gZ2VtX3N0YXJ0X3htaXQsCisJLm5kb19nZXRfc3RhdHMJCT0gZ2VtX2dldF9zdGF0cywKKwkubmRvX3NldF9tdWx0aWNhc3RfbGlzdCA9IGdlbV9zZXRfbXVsdGljYXN0LAorCS5uZG9fZG9faW9jdGwJCT0gZ2VtX2lvY3RsLAorCS5uZG9fdHhfdGltZW91dAkJPSBnZW1fdHhfdGltZW91dCwKKwkubmRvX2NoYW5nZV9tdHUJCT0gZ2VtX2NoYW5nZV9tdHUsCisJLm5kb19zZXRfbWFjX2FkZHJlc3MgCT0gZXRoX21hY19hZGRyLAorCS5uZG9fdmFsaWRhdGVfYWRkcgk9IGV0aF92YWxpZGF0ZV9hZGRyLAorfTsKKwogc3RhdGljIGludCBfX2RldmluaXQgZ2VtX2luaXRfb25lKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAogCQkJCSAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKIHsKQEAgLTMxNDIsMTcgKzMxNTUsMTAgQEAKIAlpZiAoZ2VtX2dldF9kZXZpY2VfYWRkcmVzcyhncCkpCiAJCWdvdG8gZXJyX291dF9mcmVlX2NvbnNpc3RlbnQ7CiAKLQlkZXYtPm9wZW4gPSBnZW1fb3BlbjsKLQlkZXYtPnN0b3AgPSBnZW1fY2xvc2U7Ci0JZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSBnZW1fc3RhcnRfeG1pdDsKLQlkZXYtPmdldF9zdGF0cyA9IGdlbV9nZXRfc3RhdHM7Ci0JZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSBnZW1fc2V0X211bHRpY2FzdDsKLQlkZXYtPmRvX2lvY3RsID0gZ2VtX2lvY3RsOworCWRldi0+bmV0ZGV2X29wcyA9ICZnZW1fbmV0ZGV2X29wczsKIAluZXRpZl9uYXBpX2FkZChkZXYsICZncC0+bmFwaSwgZ2VtX3BvbGwsIDY0KTsKIAlkZXYtPmV0aHRvb2xfb3BzID0gJmdlbV9ldGh0b29sX29wczsKLQlkZXYtPnR4X3RpbWVvdXQgPSBnZW1fdHhfdGltZW91dDsKIAlkZXYtPndhdGNoZG9nX3RpbWVvID0gNSAqIEhaOwotCWRldi0+Y2hhbmdlX210dSA9IGdlbV9jaGFuZ2VfbXR1OwogCWRldi0+aXJxID0gcGRldi0+aXJxOwogCWRldi0+ZG1hID0gMDsKIAlkZXYtPnNldF9tYWNfYWRkcmVzcyA9IGdlbV9zZXRfbWFjX2FkZHJlc3M7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zdW5obWUuYyBiL2RyaXZlcnMvbmV0L3N1bmhtZS5jCmluZGV4IGIyMmQzMzUuLjdhNzJhMzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3N1bmhtZS5jCisrKyBiL2RyaXZlcnMvbmV0L3N1bmhtZS5jCkBAIC0yNjA3LDYgKzI2MDcsMTggQEAKIH0KICNlbmRpZiAvKiBDT05GSUdfUENJICovCiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgaG1lX25ldGRldl9vcHMgPSB7CisJLm5kb19vcGVuCQk9IGhhcHB5X21lYWxfb3BlbiwKKwkubmRvX3N0b3AJCT0gaGFwcHlfbWVhbF9jbG9zZSwKKwkubmRvX3N0YXJ0X3htaXQJCT0gaGFwcHlfbWVhbF9zdGFydF94bWl0LAorCS5uZG9fdHhfdGltZW91dAkJPSBoYXBweV9tZWFsX3R4X3RpbWVvdXQsCisJLm5kb19nZXRfc3RhdHMJCT0gaGFwcHlfbWVhbF9nZXRfc3RhdHMsCisJLm5kb19zZXRfbXVsdGljYXN0X2xpc3QgPSBoYXBweV9tZWFsX3NldF9tdWx0aWNhc3QsCisJLm5kb19jaGFuZ2VfbXR1CQk9IGV0aF9jaGFuZ2VfbXR1LAorCS5uZG9fc2V0X21hY19hZGRyZXNzIAk9IGV0aF9tYWNfYWRkciwKKwkubmRvX3ZhbGlkYXRlX2FkZHIJPSBldGhfdmFsaWRhdGVfYWRkciwKK307CisKICNpZmRlZiBDT05GSUdfU0JVUwogc3RhdGljIGludCBfX2RldmluaXQgaGFwcHlfbWVhbF9zYnVzX3Byb2JlX29uZShzdHJ1Y3Qgb2ZfZGV2aWNlICpvcCwgaW50IGlzX3FmZSkKIHsKQEAgLTI3NTAsMTIgKzI3NjIsNyBAQAogCWluaXRfdGltZXIoJmhwLT5oYXBweV90aW1lcik7CiAKIAlocC0+ZGV2ID0gZGV2OwotCWRldi0+b3BlbiA9ICZoYXBweV9tZWFsX29wZW47Ci0JZGV2LT5zdG9wID0gJmhhcHB5X21lYWxfY2xvc2U7Ci0JZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSAmaGFwcHlfbWVhbF9zdGFydF94bWl0OwotCWRldi0+Z2V0X3N0YXRzID0gJmhhcHB5X21lYWxfZ2V0X3N0YXRzOwotCWRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gJmhhcHB5X21lYWxfc2V0X211bHRpY2FzdDsKLQlkZXYtPnR4X3RpbWVvdXQgPSAmaGFwcHlfbWVhbF90eF90aW1lb3V0OworCWRldi0+bmV0ZGV2X29wcyA9ICZobWVfbmV0ZGV2X29wczsKIAlkZXYtPndhdGNoZG9nX3RpbWVvID0gNSpIWjsKIAlkZXYtPmV0aHRvb2xfb3BzID0gJmhtZV9ldGh0b29sX29wczsKIApAQCAtMzA3NiwxMiArMzA4Myw3IEBACiAJaW5pdF90aW1lcigmaHAtPmhhcHB5X3RpbWVyKTsKIAogCWhwLT5kZXYgPSBkZXY7Ci0JZGV2LT5vcGVuID0gJmhhcHB5X21lYWxfb3BlbjsKLQlkZXYtPnN0b3AgPSAmaGFwcHlfbWVhbF9jbG9zZTsKLQlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9ICZoYXBweV9tZWFsX3N0YXJ0X3htaXQ7Ci0JZGV2LT5nZXRfc3RhdHMgPSAmaGFwcHlfbWVhbF9nZXRfc3RhdHM7Ci0JZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSAmaGFwcHlfbWVhbF9zZXRfbXVsdGljYXN0OwotCWRldi0+dHhfdGltZW91dCA9ICZoYXBweV9tZWFsX3R4X3RpbWVvdXQ7CisJZGV2LT5uZXRkZXZfb3BzID0gJmhtZV9uZXRkZXZfb3BzOwogCWRldi0+d2F0Y2hkb2dfdGltZW8gPSA1KkhaOwogCWRldi0+ZXRodG9vbF9vcHMgPSAmaG1lX2V0aHRvb2xfb3BzOwogCWRldi0+aXJxID0gcGRldi0+aXJxOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc3Vudm5ldC5jIGIvZHJpdmVycy9uZXQvc3Vudm5ldC5jCmluZGV4IDIzM2YxY2QuLjYxMTIzMGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3N1bnZuZXQuYworKysgYi9kcml2ZXJzL25ldC9zdW52bmV0LmMKQEAgLTMzNiw3ICszMzYsNyBAQAogCWlmIChJU19FUlIoZGVzYykpCiAJCXJldHVybiBQVFJfRVJSKGRlc2MpOwogCi0JdmlvZGJnKERBVEEsICJ2aW9fd2Fsa19yeF9vbmUgZGVzY1slMDJ4OiUwMng6JTA4eDolMDh4OiVseDolbHhdXG4iLAorCXZpb2RiZyhEQVRBLCAidmlvX3dhbGtfcnhfb25lIGRlc2NbJTAyeDolMDJ4OiUwOHg6JTA4eDolbGx4OiVsbHhdXG4iLAogCSAgICAgICBkZXNjLT5oZHIuc3RhdGUsIGRlc2MtPmhkci5hY2ssCiAJICAgICAgIGRlc2MtPnNpemUsIGRlc2MtPm5jb29raWVzLAogCSAgICAgICBkZXNjLT5jb29raWVzWzBdLmNvb2tpZV9hZGRyLApAQCAtMzk0LDE0ICszOTQsMTQgQEAKIAlzdHJ1Y3QgdmlvX2RyaW5nX3N0YXRlICpkciA9ICZwb3J0LT52aW8uZHJpbmdzW1ZJT19EUklWRVJfUlhfUklOR107CiAJc3RydWN0IHZpb19kcml2ZXJfc3RhdGUgKnZpbyA9ICZwb3J0LT52aW87CiAKLQl2aW9kYmcoREFUQSwgInZuZXRfcnggc3R5cGVfZW52WyUwNHhdIHNlcVslMDE2bHhdIHJjdl9ueHRbJTAxNmx4XVxuIiwKKwl2aW9kYmcoREFUQSwgInZuZXRfcnggc3R5cGVfZW52WyUwNHhdIHNlcVslMDE2bGx4XSByY3Zfbnh0WyUwMTZsbHhdXG4iLAogCSAgICAgICBwa3QtPnRhZy5zdHlwZV9lbnYsIHBrdC0+c2VxLCBkci0+cmN2X254dCk7CiAKIAlpZiAodW5saWtlbHkocGt0LT50YWcuc3R5cGVfZW52ICE9IFZJT19EUklOR19EQVRBKSkKIAkJcmV0dXJuIDA7CiAJaWYgKHVubGlrZWx5KHBrdC0+c2VxICE9IGRyLT5yY3Zfbnh0KSkgewotCQlwcmludGsoS0VSTl9FUlIgUEZYICJSWCBvdXQgb2Ygc2VxdWVuY2Ugc2VxWzB4JWx4XSAiCi0JCSAgICAgICAicmN2X254dFsweCVseF1cbiIsIHBrdC0+c2VxLCBkci0+cmN2X254dCk7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIlJYIG91dCBvZiBzZXF1ZW5jZSBzZXFbMHglbGx4XSAiCisJCSAgICAgICAicmN2X254dFsweCVsbHhdXG4iLCBwa3QtPnNlcSwgZHItPnJjdl9ueHQpOwogCQlyZXR1cm4gMDsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3RlaHV0aS5jIGIvZHJpdmVycy9uZXQvdGVodXRpLmMKaW5kZXggYTEwYTgzYS4uYTdhNGRjNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdGVodXRpLmMKKysrIGIvZHJpdmVycy9uZXQvdGVodXRpLmMKQEAgLTEwMDQsNyArMTAwNCw3IEBACiAgKiBza2IgZm9yIHJ4LiBJdCBhc3N1bWVzIHRoYXQgUnggaXMgZGVzYWJsZWQgaW4gSFcKICAqIGZ1bmNzIGFyZSBncm91cGVkIGZvciBiZXR0ZXIgY2FjaGUgdXNhZ2UKICAqCi0gKiBSeEQgZmlmbyBpcyBzbWFsbGVyIHRoZW4gUnhGIGZpZm8gYnkgZGVzaWduLiBVcG9uIGhpZ2ggbG9hZCwgUnhEIHdpbGwgYmUKKyAqIFJ4RCBmaWZvIGlzIHNtYWxsZXIgdGhhbiBSeEYgZmlmbyBieSBkZXNpZ24uIFVwb24gaGlnaCBsb2FkLCBSeEQgd2lsbCBiZQogICogZmlsbGVkIGFuZCBwYWNrZXRzIHdpbGwgYmUgZHJvcHBlZCBieSBuaWMgd2l0aG91dCBnZXR0aW5nIGludG8gaG9zdCBvcgogICogY291c2luZyBpbnRlcnJ1cHQuIEFueXdheSwgaW4gdGhhdCBjb25kaXRpb24sIGhvc3QgaGFzIG5vIGNoYW5jZSB0byBwcm9jY2VzcwogICogYWxsIHBhY2tldHMsIGJ1dCBkcm9wcGluZyBpbiBuaWMgaXMgY2hlYXBlciwgc2luY2UgaXQgdGFrZXMgMCBjcHUgY3ljbGVzCkBAIC0xODI2LDcgKzE4MjYsNyBAQAogICoKICAqIFB1c2hlcyBkZXNjIHRvIFR4RCBmaWZvIGFuZCBvdmVybGFwcyBpdCBpZiBuZWVkZWQuCiAgKiBOT1RFOiB0aGlzIGZ1bmMgZG9lcyBub3QgY2hlY2sgZm9yIGF2YWlsYWJsZSBzcGFjZS4gdGhpcyBpcyByZXNwb25zaWJpbGl0eQotICogICAgb2YgdGhlIGNhbGxlci4gTmVpdGhlciBkb2VzIGl0IGNoZWNrIHRoYXQgZGF0YSBzaXplIGlzIHNtYWxsZXIgdGhlbgorICogICAgb2YgdGhlIGNhbGxlci4gTmVpdGhlciBkb2VzIGl0IGNoZWNrIHRoYXQgZGF0YSBzaXplIGlzIHNtYWxsZXIgdGhhbgogICogICAgZmlmbyBzaXplLgogICovCiBzdGF0aWMgdm9pZCBiZHhfdHhfcHVzaF9kZXNjKHN0cnVjdCBiZHhfcHJpdiAqcHJpdiwgdm9pZCAqZGF0YSwgaW50IHNpemUpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC90bGFuLmMgYi9kcml2ZXJzL25ldC90bGFuLmMKaW5kZXggODVlZjhiNy4uNjhiOTY3YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdGxhbi5jCisrKyBiL2RyaXZlcnMvbmV0L3RsYW4uYwpAQCAtODMxLDYgKzgzMSwyMSBAQAogfQogI2VuZGlmCiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgVExhbl9uZXRkZXZfb3BzID0geworCS5uZG9fb3BlbiAJCT0gVExhbl9PcGVuLAorCS5uZG9fc3RvcAkJPSBUTGFuX0Nsb3NlLAorCS5uZG9fc3RhcnRfeG1pdAkJPSBUTGFuX1N0YXJ0VHgsCisJLm5kb190eF90aW1lb3V0CQk9IFRMYW5fdHhfdGltZW91dCwKKwkubmRvX2dldF9zdGF0cwkJPSBUTGFuX0dldFN0YXRzLAorCS5uZG9fc2V0X211bHRpY2FzdF9saXN0ID0gVExhbl9TZXRNdWx0aWNhc3RMaXN0LAorCS5uZG9fZG9faW9jdGwJCT0gVExhbl9pb2N0bCwKKwkubmRvX2NoYW5nZV9tdHUJCT0gZXRoX2NoYW5nZV9tdHUsCisJLm5kb19zZXRfbWFjX2FkZHJlc3MgCT0gZXRoX21hY19hZGRyLAorCS5uZG9fdmFsaWRhdGVfYWRkcgk9IGV0aF92YWxpZGF0ZV9hZGRyLAorI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCisJLm5kb19wb2xsX2NvbnRyb2xsZXIJID0gVExhbl9Qb2xsLAorI2VuZGlmCit9OwogCiAKIApAQCAtODkyLDE2ICs5MDcsNyBAQAogCW5ldGlmX2NhcnJpZXJfb2ZmKGRldik7CiAKIAkvKiBEZXZpY2UgbWV0aG9kcyAqLwotCWRldi0+b3BlbiA9ICZUTGFuX09wZW47Ci0JZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSAmVExhbl9TdGFydFR4OwotCWRldi0+c3RvcCA9ICZUTGFuX0Nsb3NlOwotCWRldi0+Z2V0X3N0YXRzID0gJlRMYW5fR2V0U3RhdHM7Ci0JZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSAmVExhbl9TZXRNdWx0aWNhc3RMaXN0OwotCWRldi0+ZG9faW9jdGwgPSAmVExhbl9pb2N0bDsKLSNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgotCWRldi0+cG9sbF9jb250cm9sbGVyID0gJlRMYW5fUG9sbDsKLSNlbmRpZgotCWRldi0+dHhfdGltZW91dCA9ICZUTGFuX3R4X3RpbWVvdXQ7CisJZGV2LT5uZXRkZXZfb3BzID0gJlRMYW5fbmV0ZGV2X29wczsKIAlkZXYtPndhdGNoZG9nX3RpbWVvID0gVFhfVElNRU9VVDsKIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdG9rZW5yaW5nL3NtY3RyLmMgYi9kcml2ZXJzL25ldC90b2tlbnJpbmcvc21jdHIuYwppbmRleCBhMDExNjY2Li41MGViMjljIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC90b2tlbnJpbmcvc21jdHIuYworKysgYi9kcml2ZXJzL25ldC90b2tlbnJpbmcvc21jdHIuYwpAQCAtMzA2NCw3ICszMDY0LDcgQEAKICAqIHdpbGwgY29uc2VxdWVudGx5IGNhdXNlIGEgdGltZW91dC4KICAqCiAgKiBOT1RFIDE6IElmIHRoZSBtb25pdG9yX3N0YXRlIGlzIE1TX0JFQUNPTl9URVNUX1NUQVRFLCBhbGwgdHJhbnNtaXQKLSAqIHF1ZXVlcyBvdGhlciB0aGVuIHRoZSBvbmUgdXNlZCBmb3IgdGhlIGxvYmVfbWVkaWFfdGVzdCBzaG91bGQgYmUKKyAqIHF1ZXVlcyBvdGhlciB0aGFuIHRoZSBvbmUgdXNlZCBmb3IgdGhlIGxvYmVfbWVkaWFfdGVzdCBzaG91bGQgYmUKICAqIGRpc2FibGVkLiE/CiAgKgogICogTk9URSAyOiBJZiB0aGUgbW9uaXRvcl9zdGF0ZSBpcyBNU19CRUFDT05fVEVTVF9TVEFURSBhbmQgdGhlIHJlY2VpdmVfbWFzawpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdHVsaXAvZGUyMTA0eC5jIGIvZHJpdmVycy9uZXQvdHVsaXAvZGUyMTA0eC5jCmluZGV4IDUxNjZiZTkuLmQ1ZDUzYjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3R1bGlwL2RlMjEwNHguYworKysgYi9kcml2ZXJzL25ldC90dWxpcC9kZTIxMDR4LmMKQEAgLTE5MjIsNiArMTkyMiwxOCBAQAogCWdvdG8gZmlsbF9kZWZhdWx0czsKIH0KIAorc3RhdGljIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyBkZV9uZXRkZXZfb3BzID0geworCS5uZG9fb3BlbgkJPSBkZV9vcGVuLAorCS5uZG9fc3RvcAkJPSBkZV9jbG9zZSwKKwkubmRvX3NldF9tdWx0aWNhc3RfbGlzdCA9IGRlX3NldF9yeF9tb2RlLAorCS5uZG9fc3RhcnRfeG1pdAkJPSBkZV9zdGFydF94bWl0LAorCS5uZG9fZ2V0X3N0YXRzCQk9IGRlX2dldF9zdGF0cywKKwkubmRvX3R4X3RpbWVvdXQgCT0gZGVfdHhfdGltZW91dCwKKwkubmRvX2NoYW5nZV9tdHUJCT0gZXRoX2NoYW5nZV9tdHUsCisJLm5kb19zZXRfbWFjX2FkZHJlc3MgCT0gZXRoX21hY19hZGRyLAorCS5uZG9fdmFsaWRhdGVfYWRkcgk9IGV0aF92YWxpZGF0ZV9hZGRyLAorfTsKKwogc3RhdGljIGludCBfX2RldmluaXQgZGVfaW5pdF9vbmUgKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAogCQkJCSAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKIHsKQEAgLTE5NDQsMTQgKzE5NTYsOSBAQAogCWlmICghZGV2KQogCQlyZXR1cm4gLUVOT01FTTsKIAorCWRldi0+bmV0ZGV2X29wcyA9ICZkZV9uZXRkZXZfb3BzOwogCVNFVF9ORVRERVZfREVWKGRldiwgJnBkZXYtPmRldik7Ci0JZGV2LT5vcGVuID0gZGVfb3BlbjsKLQlkZXYtPnN0b3AgPSBkZV9jbG9zZTsKLQlkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9IGRlX3NldF9yeF9tb2RlOwotCWRldi0+aGFyZF9zdGFydF94bWl0ID0gZGVfc3RhcnRfeG1pdDsKLQlkZXYtPmdldF9zdGF0cyA9IGRlX2dldF9zdGF0czsKIAlkZXYtPmV0aHRvb2xfb3BzID0gJmRlX2V0aHRvb2xfb3BzOwotCWRldi0+dHhfdGltZW91dCA9IGRlX3R4X3RpbWVvdXQ7CiAJZGV2LT53YXRjaGRvZ190aW1lbyA9IFRYX1RJTUVPVVQ7CiAKIAlkZSA9IG5ldGRldl9wcml2KGRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC90dWxpcC9kZTR4NS5jIGIvZHJpdmVycy9uZXQvdHVsaXAvZGU0eDUuYwppbmRleCA2N2JmZDZmLi42NDE4Zjc0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC90dWxpcC9kZTR4NS5jCisrKyBiL2RyaXZlcnMvbmV0L3R1bGlwL2RlNHg1LmMKQEAgLTEwNzcsNiArMTA3NywxOCBAQAogICAgIG1kZWxheSgyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBXYWl0IGZvciAybXMgKi9cCiB9CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgZGU0eDVfbmV0ZGV2X29wcyA9IHsKKyAgICAubmRvX29wZW4JCT0gZGU0eDVfb3BlbiwKKyAgICAubmRvX3N0b3AJCT0gZGU0eDVfY2xvc2UsCisgICAgLm5kb19zdGFydF94bWl0CT0gZGU0eDVfcXVldWVfcGt0LAorICAgIC5uZG9fZ2V0X3N0YXRzCT0gZGU0eDVfZ2V0X3N0YXRzLAorICAgIC5uZG9fc2V0X211bHRpY2FzdF9saXN0ID0gc2V0X211bHRpY2FzdF9saXN0LAorICAgIC5uZG9fZG9faW9jdGwJPSBkZTR4NV9pb2N0bCwKKyAgICAubmRvX2NoYW5nZV9tdHUJPSBldGhfY2hhbmdlX210dSwKKyAgICAubmRvX3NldF9tYWNfYWRkcmVzcz0gZXRoX21hY19hZGRyLAorICAgIC5uZG9fdmFsaWRhdGVfYWRkcgk9IGV0aF92YWxpZGF0ZV9hZGRyLAorfTsKKwogCiBzdGF0aWMgaW50IF9fZGV2aW5pdAogZGU0eDVfaHdfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1X2xvbmcgaW9iYXNlLCBzdHJ1Y3QgZGV2aWNlICpnZW5kZXYpCkBAIC0xMjU4LDEzICsxMjcwLDcgQEAKIAogICAgIC8qIFRoZSBERTRYNS1zcGVjaWZpYyBlbnRyaWVzIGluIHRoZSBkZXZpY2Ugc3RydWN0dXJlLiAqLwogICAgIFNFVF9ORVRERVZfREVWKGRldiwgZ2VuZGV2KTsKLSAgICBkZXYtPm9wZW4gPSAmZGU0eDVfb3BlbjsKLSAgICBkZXYtPmhhcmRfc3RhcnRfeG1pdCA9ICZkZTR4NV9xdWV1ZV9wa3Q7Ci0gICAgZGV2LT5zdG9wID0gJmRlNHg1X2Nsb3NlOwotICAgIGRldi0+Z2V0X3N0YXRzID0gJmRlNHg1X2dldF9zdGF0czsKLSAgICBkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9ICZzZXRfbXVsdGljYXN0X2xpc3Q7Ci0gICAgZGV2LT5kb19pb2N0bCA9ICZkZTR4NV9pb2N0bDsKLQorICAgIGRldi0+bmV0ZGV2X29wcyA9ICZkZTR4NV9uZXRkZXZfb3BzOwogICAgIGRldi0+bWVtX3N0YXJ0ID0gMDsKIAogICAgIC8qIEZpbGwgaW4gdGhlIGdlbmVyaWMgZmllbGRzIG9mIHRoZSBkZXZpY2Ugc3RydWN0dXJlLiAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdHVsaXAvZG1mZS5jIGIvZHJpdmVycy9uZXQvdHVsaXAvZG1mZS5jCmluZGV4IDI4YTVjNTEuLjJlNWM5OTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3R1bGlwL2RtZmUuYworKysgYi9kcml2ZXJzL25ldC90dWxpcC9kbWZlLmMKQEAgLTI1Nyw5ICsyNTcsNiBAQAogCXU4IHdvbF9tb2RlOwkJCS8qIHVzZXIgV09MIHNldHRpbmdzICovCiAJc3RydWN0IHRpbWVyX2xpc3QgdGltZXI7CiAKLQkvKiBTeXN0ZW0gZGVmaW5lZCBzdGF0aXN0aWMgY291bnRlciAqLwotCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOwotCiAJLyogRHJpdmVyIGRlZmluZWQgc3RhdGlzdGljIGNvdW50ZXIgKi8KIAl1bnNpZ25lZCBsb25nIHR4X2ZpZm9fdW5kZXJydW47CiAJdW5zaWduZWQgbG9uZyB0eF9sb3NzX2NhcnJpZXI7CkBAIC0zMTYsNyArMzEzLDYgQEAKIHN0YXRpYyBpbnQgZG1mZV9vcGVuKHN0cnVjdCBERVZJQ0UgKik7CiBzdGF0aWMgaW50IGRtZmVfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqLCBzdHJ1Y3QgREVWSUNFICopOwogc3RhdGljIGludCBkbWZlX3N0b3Aoc3RydWN0IERFVklDRSAqKTsKLXN0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqIGRtZmVfZ2V0X3N0YXRzKHN0cnVjdCBERVZJQ0UgKik7CiBzdGF0aWMgdm9pZCBkbWZlX3NldF9maWx0ZXJfbW9kZShzdHJ1Y3QgREVWSUNFICopOwogc3RhdGljIGNvbnN0IHN0cnVjdCBldGh0b29sX29wcyBuZXRkZXZfZXRodG9vbF9vcHM7CiBzdGF0aWMgdTE2IHJlYWRfc3JvbV93b3JkKGxvbmcgLGludCk7CkBAIC0zNTEsNiArMzQ3LDE5IEBACiAKIC8qIERNOTEwWCBuZXR3b3JrIGJvYXJkIHJvdXRpbmUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCitzdGF0aWMgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzIG5ldGRldl9vcHMgPSB7CisJLm5kb19vcGVuIAkJPSBkbWZlX29wZW4sCisJLm5kb19zdG9wCQk9IGRtZmVfc3RvcCwKKwkubmRvX3N0YXJ0X3htaXQJCT0gZG1mZV9zdGFydF94bWl0LAorCS5uZG9fc2V0X211bHRpY2FzdF9saXN0ID0gZG1mZV9zZXRfZmlsdGVyX21vZGUsCisJLm5kb19jaGFuZ2VfbXR1CQk9IGV0aF9jaGFuZ2VfbXR1LAorCS5uZG9fc2V0X21hY19hZGRyZXNzCT0gZXRoX21hY19hZGRyLAorCS5uZG9fdmFsaWRhdGVfYWRkcgk9IGV0aF92YWxpZGF0ZV9hZGRyLAorI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCisJLm5kb19wb2xsX2NvbnRyb2xsZXIJPSBwb2xsX2RtZmUsCisjZW5kaWYKK307CisKIC8qCiAgKglTZWFyY2ggRE05MTBYIGJvYXJkICxhbGxvY2F0ZSBzcGFjZSBhbmQgcmVnaXN0ZXIgaXQKICAqLwpAQCAtNDQyLDE0ICs0NTEsNyBAQAogCWRldi0+YmFzZV9hZGRyID0gZGItPmlvYWRkcjsKIAlkZXYtPmlycSA9IHBkZXYtPmlycTsKIAlwY2lfc2V0X2RydmRhdGEocGRldiwgZGV2KTsKLQlkZXYtPm9wZW4gPSAmZG1mZV9vcGVuOwotCWRldi0+aGFyZF9zdGFydF94bWl0ID0gJmRtZmVfc3RhcnRfeG1pdDsKLQlkZXYtPnN0b3AgPSAmZG1mZV9zdG9wOwotCWRldi0+Z2V0X3N0YXRzID0gJmRtZmVfZ2V0X3N0YXRzOwotCWRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gJmRtZmVfc2V0X2ZpbHRlcl9tb2RlOwotI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCi0JZGV2LT5wb2xsX2NvbnRyb2xsZXIgPSAmcG9sbF9kbWZlOwotI2VuZGlmCisJZGV2LT5uZXRkZXZfb3BzID0gJm5ldGRldl9vcHM7CiAJZGV2LT5ldGh0b29sX29wcyA9ICZuZXRkZXZfZXRodG9vbF9vcHM7CiAJbmV0aWZfY2Fycmllcl9vZmYoZGV2KTsKIAlzcGluX2xvY2tfaW5pdCgmZGItPmxvY2spOwpAQCAtODY3LDE1ICs4NjksMTUgQEAKIAogCQkvKiBBIHBhY2tldCBzZW50IGNvbXBsZXRlZCAqLwogCQlkYi0+dHhfcGFja2V0X2NudC0tOwotCQlkYi0+c3RhdHMudHhfcGFja2V0cysrOworCQlkZXYtPnN0YXRzLnR4X3BhY2tldHMrKzsKIAogCQkvKiBUcmFuc21pdCBzdGF0aXN0aWMgY291bnRlciAqLwogCQlpZiAoIHRkZXMwICE9IDB4N2ZmZmZmZmYgKSB7CiAJCQkvKiBwcmludGsoRFJWX05BTUUgIjogdGRlczA9JXhcbiIsIHRkZXMwKTsgKi8KLQkJCWRiLT5zdGF0cy5jb2xsaXNpb25zICs9ICh0ZGVzMCA+PiAzKSAmIDB4ZjsKLQkJCWRiLT5zdGF0cy50eF9ieXRlcyArPSBsZTMyX3RvX2NwdSh0eHB0ci0+dGRlczEpICYgMHg3ZmY7CisJCQlkZXYtPnN0YXRzLmNvbGxpc2lvbnMgKz0gKHRkZXMwID4+IDMpICYgMHhmOworCQkJZGV2LT5zdGF0cy50eF9ieXRlcyArPSBsZTMyX3RvX2NwdSh0eHB0ci0+dGRlczEpICYgMHg3ZmY7CiAJCQlpZiAodGRlczAgJiBUREVTMF9FUlJfTUFTSykgewotCQkJCWRiLT5zdGF0cy50eF9lcnJvcnMrKzsKKwkJCQlkZXYtPnN0YXRzLnR4X2Vycm9ycysrOwogCiAJCQkJaWYgKHRkZXMwICYgMHgwMDAyKSB7CS8qIFVuZGVyUnVuICovCiAJCQkJCWRiLT50eF9maWZvX3VuZGVycnVuKys7CkBAIC05NjksMTMgKzk3MSwxMyBAQAogCQkJaWYgKHJkZXMwICYgMHg4MDAwKSB7CiAJCQkJLyogVGhpcyBpcyBhIGVycm9yIHBhY2tldCAqLwogCQkJCS8vcHJpbnRrKERSVl9OQU1FICI6IHJkZXMwOiAlbHhcbiIsIHJkZXMwKTsKLQkJCQlkYi0+c3RhdHMucnhfZXJyb3JzKys7CisJCQkJZGV2LT5zdGF0cy5yeF9lcnJvcnMrKzsKIAkJCQlpZiAocmRlczAgJiAxKQotCQkJCQlkYi0+c3RhdHMucnhfZmlmb19lcnJvcnMrKzsKKwkJCQkJZGV2LT5zdGF0cy5yeF9maWZvX2Vycm9ycysrOwogCQkJCWlmIChyZGVzMCAmIDIpCi0JCQkJCWRiLT5zdGF0cy5yeF9jcmNfZXJyb3JzKys7CisJCQkJCWRldi0+c3RhdHMucnhfY3JjX2Vycm9ycysrOwogCQkJCWlmIChyZGVzMCAmIDB4ODApCi0JCQkJCWRiLT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzKys7CisJCQkJCWRldi0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOwogCQkJfQogCiAJCQlpZiAoICEocmRlczAgJiAweDgwMDApIHx8CkBAIC0xMDA4LDggKzEwMTAsOCBAQAogCiAJCQkJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIGRldik7CiAJCQkJCW5ldGlmX3J4KHNrYik7Ci0JCQkJCWRiLT5zdGF0cy5yeF9wYWNrZXRzKys7Ci0JCQkJCWRiLT5zdGF0cy5yeF9ieXRlcyArPSByeGxlbjsKKwkJCQkJZGV2LT5zdGF0cy5yeF9wYWNrZXRzKys7CisJCQkJCWRldi0+c3RhdHMucnhfYnl0ZXMgKz0gcnhsZW47CiAJCQkJfQogCQkJfSBlbHNlIHsKIAkJCQkvKiBSZXVzZSBTS0IgYnVmZmVyIHdoZW4gdGhlIHBhY2tldCBpcyBlcnJvciAqLwpAQCAtMTAyNCwyMCArMTAyNiw2IEBACiAJZGItPnJ4X3JlYWR5X3B0ciA9IHJ4cHRyOwogfQogCi0KLS8qCi0gKglHZXQgc3RhdGlzdGljcyBmcm9tIGRyaXZlci4KLSAqLwotCi1zdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKiBkbWZlX2dldF9zdGF0cyhzdHJ1Y3QgREVWSUNFICpkZXYpCi17Ci0Jc3RydWN0IGRtZmVfYm9hcmRfaW5mbyAqZGIgPSBuZXRkZXZfcHJpdihkZXYpOwotCi0JRE1GRV9EQlVHKDAsICJkbWZlX2dldF9zdGF0cyIsIDApOwotCXJldHVybiAmZGItPnN0YXRzOwotfQotCi0KIC8qCiAgKiBTZXQgRE05MTBYIG11bHRpY2FzdCBhZGRyZXNzCiAgKi8KQEAgLTExNjEsNyArMTE0OSw3IEBACiAKIAkvKiBPcGVyYXRpbmcgTW9kZSBDaGVjayAqLwogCWlmICggKGRiLT5kbTkxMHhfY2hrX21vZGUgJiAweDEpICYmCi0JCShkYi0+c3RhdHMucnhfcGFja2V0cyA+IE1BWF9DSEVDS19QQUNLRVQpICkKKwkJKGRldi0+c3RhdHMucnhfcGFja2V0cyA+IE1BWF9DSEVDS19QQUNLRVQpICkKIAkJZGItPmRtOTEweF9jaGtfbW9kZSA9IDB4NDsKIAogCS8qIER5bmFtaWMgcmVzZXQgRE05MTBYIDogc3lzdGVtIGVycm9yIG9yIHRyYW5zbWl0IHRpbWUtb3V0ICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC90dWxpcC90dWxpcF9jb3JlLmMgYi9kcml2ZXJzL25ldC90dWxpcC90dWxpcF9jb3JlLmMKaW5kZXggZmY4NGJhYi4uYmVlNzVmYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdHVsaXAvdHVsaXBfY29yZS5jCisrKyBiL2RyaXZlcnMvbmV0L3R1bGlwL3R1bGlwX2NvcmUuYwpAQCAtMTIyNSw2ICsxMjI1LDIyIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgdHVsaXBfbmV0ZGV2X29wcyA9IHsKKwkubmRvX29wZW4JCT0gdHVsaXBfb3BlbiwKKwkubmRvX3N0YXJ0X3htaXQJCT0gdHVsaXBfc3RhcnRfeG1pdCwKKwkubmRvX3R4X3RpbWVvdXQJCT0gdHVsaXBfdHhfdGltZW91dCwKKwkubmRvX3N0b3AJCT0gdHVsaXBfY2xvc2UsCisJLm5kb19nZXRfc3RhdHMJCT0gdHVsaXBfZ2V0X3N0YXRzLAorCS5uZG9fZG9faW9jdGwgCQk9IHByaXZhdGVfaW9jdGwsCisJLm5kb19zZXRfbXVsdGljYXN0X2xpc3QgPSBzZXRfcnhfbW9kZSwKKwkubmRvX2NoYW5nZV9tdHUJCT0gZXRoX2NoYW5nZV9tdHUsCisJLm5kb19zZXRfbWFjX2FkZHJlc3MJPSBldGhfbWFjX2FkZHIsCisJLm5kb192YWxpZGF0ZV9hZGRyCT0gZXRoX3ZhbGlkYXRlX2FkZHIsCisjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKKwkubmRvX3BvbGxfY29udHJvbGxlcgkgPSBwb2xsX3R1bGlwLAorI2VuZGlmCit9OworCiBzdGF0aWMgaW50IF9fZGV2aW5pdCB0dWxpcF9pbml0X29uZSAoc3RydWN0IHBjaV9kZXYgKnBkZXYsCiAJCQkJICAgICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQogewpAQCAtMTYwMSwyMCArMTYxNywxMSBAQAogCX0KIAogCS8qIFRoZSBUdWxpcC1zcGVjaWZpYyBlbnRyaWVzIGluIHRoZSBkZXZpY2Ugc3RydWN0dXJlLiAqLwotCWRldi0+b3BlbiA9IHR1bGlwX29wZW47Ci0JZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSB0dWxpcF9zdGFydF94bWl0OwotCWRldi0+dHhfdGltZW91dCA9IHR1bGlwX3R4X3RpbWVvdXQ7CisJZGV2LT5uZXRkZXZfb3BzID0gJnR1bGlwX25ldGRldl9vcHM7CiAJZGV2LT53YXRjaGRvZ190aW1lbyA9IFRYX1RJTUVPVVQ7CiAjaWZkZWYgQ09ORklHX1RVTElQX05BUEkKIAluZXRpZl9uYXBpX2FkZChkZXYsICZ0cC0+bmFwaSwgdHVsaXBfcG9sbCwgMTYpOwogI2VuZGlmCi0JZGV2LT5zdG9wID0gdHVsaXBfY2xvc2U7Ci0JZGV2LT5nZXRfc3RhdHMgPSB0dWxpcF9nZXRfc3RhdHM7Ci0JZGV2LT5kb19pb2N0bCA9IHByaXZhdGVfaW9jdGw7Ci0JZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSBzZXRfcnhfbW9kZTsKLSNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgotCWRldi0+cG9sbF9jb250cm9sbGVyID0gJnBvbGxfdHVsaXA7Ci0jZW5kaWYKIAlTRVRfRVRIVE9PTF9PUFMoZGV2LCAmb3BzKTsKIAogCWlmIChyZWdpc3Rlcl9uZXRkZXYoZGV2KSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3R1bGlwL3VsaTUyNnguYyBiL2RyaXZlcnMvbmV0L3R1bGlwL3VsaTUyNnguYwppbmRleCAwMGNiYzUyLi4wMzBlMDJlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC90dWxpcC91bGk1MjZ4LmMKKysrIGIvZHJpdmVycy9uZXQvdHVsaXAvdWxpNTI2eC5jCkBAIC0xNjgsOSArMTY4LDYgQEAKIAl1OCB3YWl0X3Jlc2V0OwkJCS8qIEhhcmR3YXJlIGZhaWxlZCwgbmVlZCB0byByZXNldCAqLwogCXN0cnVjdCB0aW1lcl9saXN0IHRpbWVyOwogCi0JLyogU3lzdGVtIGRlZmluZWQgc3RhdGlzdGljIGNvdW50ZXIgKi8KLQlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsKLQogCS8qIERyaXZlciBkZWZpbmVkIHN0YXRpc3RpYyBjb3VudGVyICovCiAJdW5zaWduZWQgbG9uZyB0eF9maWZvX3VuZGVycnVuOwogCXVuc2lnbmVkIGxvbmcgdHhfbG9zc19jYXJyaWVyOwpAQCAtMjIwLDcgKzIxNyw2IEBACiBzdGF0aWMgaW50IHVsaTUyNnhfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqKTsKIHN0YXRpYyBpbnQgdWxpNTI2eF9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICosIHN0cnVjdCBuZXRfZGV2aWNlICopOwogc3RhdGljIGludCB1bGk1MjZ4X3N0b3Aoc3RydWN0IG5ldF9kZXZpY2UgKik7Ci1zdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKiB1bGk1MjZ4X2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqKTsKIHN0YXRpYyB2b2lkIHVsaTUyNnhfc2V0X2ZpbHRlcl9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICopOwogc3RhdGljIGNvbnN0IHN0cnVjdCBldGh0b29sX29wcyBuZXRkZXZfZXRodG9vbF9vcHM7CiBzdGF0aWMgdTE2IHJlYWRfc3JvbV93b3JkKGxvbmcsIGludCk7CkBAIC0yNTEsNiArMjQ3LDE5IEBACiAKIC8qIFVMSTUyNlggbmV0d29yayBib2FyZCByb3V0aW5lIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAorc3RhdGljIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyBuZXRkZXZfb3BzID0geworCS5uZG9fb3BlbgkJPSB1bGk1MjZ4X29wZW4sCisJLm5kb19zdG9wCQk9IHVsaTUyNnhfc3RvcCwKKwkubmRvX3N0YXJ0X3htaXQJCT0gdWxpNTI2eF9zdGFydF94bWl0LAorCS5uZG9fc2V0X211bHRpY2FzdF9saXN0ID0gdWxpNTI2eF9zZXRfZmlsdGVyX21vZGUsCisJLm5kb19jaGFuZ2VfbXR1CQk9IGV0aF9jaGFuZ2VfbXR1LAorCS5uZG9fc2V0X21hY19hZGRyZXNzCT0gZXRoX21hY19hZGRyLAorCS5uZG9fdmFsaWRhdGVfYWRkcgk9IGV0aF92YWxpZGF0ZV9hZGRyLAorI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCisJLm5kb19wb2xsX2NvbnRyb2xsZXIgCT0gdWxpNTI2eF9wb2xsLAorI2VuZGlmCit9OworCiAvKgogICoJU2VhcmNoIFVMSTUyNlggYm9hcmQsIGFsbG9jYXRlIHNwYWNlIGFuZCByZWdpc3RlciBpdAogICovCkBAIC0zMzUsMTUgKzM0NCw5IEBACiAJcGNpX3NldF9kcnZkYXRhKHBkZXYsIGRldik7CiAKIAkvKiBSZWdpc3RlciBzb21lIG5lY2Vzc2FyeSBmdW5jdGlvbnMgKi8KLQlkZXYtPm9wZW4gPSAmdWxpNTI2eF9vcGVuOwotCWRldi0+aGFyZF9zdGFydF94bWl0ID0gJnVsaTUyNnhfc3RhcnRfeG1pdDsKLQlkZXYtPnN0b3AgPSAmdWxpNTI2eF9zdG9wOwotCWRldi0+Z2V0X3N0YXRzID0gJnVsaTUyNnhfZ2V0X3N0YXRzOwotCWRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gJnVsaTUyNnhfc2V0X2ZpbHRlcl9tb2RlOworCWRldi0+bmV0ZGV2X29wcyA9ICZuZXRkZXZfb3BzOwogCWRldi0+ZXRodG9vbF9vcHMgPSAmbmV0ZGV2X2V0aHRvb2xfb3BzOwotI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCi0JZGV2LT5wb2xsX2NvbnRyb2xsZXIgPSAmdWxpNTI2eF9wb2xsOwotI2VuZGlmCisKIAlzcGluX2xvY2tfaW5pdCgmZGItPmxvY2spOwogCiAKQEAgLTczMyw3ICs3MzYsOCBAQAogICoJRnJlZSBUWCByZXNvdXJjZSBhZnRlciBUWCBjb21wbGV0ZQogICovCiAKLXN0YXRpYyB2b2lkIHVsaTUyNnhfZnJlZV90eF9wa3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHVsaTUyNnhfYm9hcmRfaW5mbyAqIGRiKQorc3RhdGljIHZvaWQgdWxpNTI2eF9mcmVlX3R4X3BrdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCXN0cnVjdCB1bGk1MjZ4X2JvYXJkX2luZm8gKiBkYikKIHsKIAlzdHJ1Y3QgdHhfZGVzYyAqdHhwdHI7CiAJdTMyIHRkZXMwOwpAQCAtNzQ3LDE1ICs3NTEsMTUgQEAKIAogCQkvKiBBIHBhY2tldCBzZW50IGNvbXBsZXRlZCAqLwogCQlkYi0+dHhfcGFja2V0X2NudC0tOwotCQlkYi0+c3RhdHMudHhfcGFja2V0cysrOworCQlkZXYtPnN0YXRzLnR4X3BhY2tldHMrKzsKIAogCQkvKiBUcmFuc21pdCBzdGF0aXN0aWMgY291bnRlciAqLwogCQlpZiAoIHRkZXMwICE9IDB4N2ZmZmZmZmYgKSB7CiAJCQkvKiBwcmludGsoRFJWX05BTUUgIjogdGRlczA9JXhcbiIsIHRkZXMwKTsgKi8KLQkJCWRiLT5zdGF0cy5jb2xsaXNpb25zICs9ICh0ZGVzMCA+PiAzKSAmIDB4ZjsKLQkJCWRiLT5zdGF0cy50eF9ieXRlcyArPSBsZTMyX3RvX2NwdSh0eHB0ci0+dGRlczEpICYgMHg3ZmY7CisJCQlkZXYtPnN0YXRzLmNvbGxpc2lvbnMgKz0gKHRkZXMwID4+IDMpICYgMHhmOworCQkJZGV2LT5zdGF0cy50eF9ieXRlcyArPSBsZTMyX3RvX2NwdSh0eHB0ci0+dGRlczEpICYgMHg3ZmY7CiAJCQlpZiAodGRlczAgJiBUREVTMF9FUlJfTUFTSykgewotCQkJCWRiLT5zdGF0cy50eF9lcnJvcnMrKzsKKwkJCQlkZXYtPnN0YXRzLnR4X2Vycm9ycysrOwogCQkJCWlmICh0ZGVzMCAmIDB4MDAwMikgewkvKiBVbmRlclJ1biAqLwogCQkJCQlkYi0+dHhfZmlmb191bmRlcnJ1bisrOwogCQkJCQlpZiAoICEoZGItPmNyNl9kYXRhICYgQ1I2X1NGVCkgKSB7CkBAIC04MjUsMTMgKzgyOSwxMyBAQAogCQkJaWYgKHJkZXMwICYgMHg4MDAwKSB7CiAJCQkJLyogVGhpcyBpcyBhIGVycm9yIHBhY2tldCAqLwogCQkJCS8vcHJpbnRrKERSVl9OQU1FICI6IHJkZXMwOiAlbHhcbiIsIHJkZXMwKTsKLQkJCQlkYi0+c3RhdHMucnhfZXJyb3JzKys7CisJCQkJZGV2LT5zdGF0cy5yeF9lcnJvcnMrKzsKIAkJCQlpZiAocmRlczAgJiAxKQotCQkJCQlkYi0+c3RhdHMucnhfZmlmb19lcnJvcnMrKzsKKwkJCQkJZGV2LT5zdGF0cy5yeF9maWZvX2Vycm9ycysrOwogCQkJCWlmIChyZGVzMCAmIDIpCi0JCQkJCWRiLT5zdGF0cy5yeF9jcmNfZXJyb3JzKys7CisJCQkJCWRldi0+c3RhdHMucnhfY3JjX2Vycm9ycysrOwogCQkJCWlmIChyZGVzMCAmIDB4ODApCi0JCQkJCWRiLT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzKys7CisJCQkJCWRldi0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOwogCQkJfQogCiAJCQlpZiAoICEocmRlczAgJiAweDgwMDApIHx8CkBAIC04NTQsOCArODU4LDggQEAKIAogCQkJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIGRldik7CiAJCQkJbmV0aWZfcngoc2tiKTsKLQkJCQlkYi0+c3RhdHMucnhfcGFja2V0cysrOwotCQkJCWRiLT5zdGF0cy5yeF9ieXRlcyArPSByeGxlbjsKKwkJCQlkZXYtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKwkJCQlkZXYtPnN0YXRzLnJ4X2J5dGVzICs9IHJ4bGVuOwogCiAJCQl9IGVsc2UgewogCQkJCS8qIFJldXNlIFNLQiBidWZmZXIgd2hlbiB0aGUgcGFja2V0IGlzIGVycm9yICovCkBAIC04NzIsMTkgKzg3Niw2IEBACiAKIAogLyoKLSAqCUdldCBzdGF0aXN0aWNzIGZyb20gZHJpdmVyLgotICovCi0KLXN0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqIHVsaTUyNnhfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IHVsaTUyNnhfYm9hcmRfaW5mbyAqZGIgPSBuZXRkZXZfcHJpdihkZXYpOwotCi0JVUxJNTI2WF9EQlVHKDAsICJ1bGk1MjZ4X2dldF9zdGF0cyIsIDApOwotCXJldHVybiAmZGItPnN0YXRzOwotfQotCi0KLS8qCiAgKiBTZXQgVUxJNTI2WCBtdWx0aWNhc3QgYWRkcmVzcwogICovCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3R1bGlwL3dpbmJvbmQtODQwLmMgYi9kcml2ZXJzL25ldC90dWxpcC93aW5ib25kLTg0MC5jCmluZGV4IDAyMmQ5OWEuLmY0NjdiZjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3R1bGlwL3dpbmJvbmQtODQwLmMKKysrIGIvZHJpdmVycy9uZXQvdHVsaXAvd2luYm9uZC04NDAuYwpAQCAtMzQzLDcgKzM0MywxOCBAQAogc3RhdGljIGNvbnN0IHN0cnVjdCBldGh0b29sX29wcyBuZXRkZXZfZXRodG9vbF9vcHM7CiBzdGF0aWMgaW50ICBuZXRkZXZfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiAKLQorc3RhdGljIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyBuZXRkZXZfb3BzID0geworCS5uZG9fb3BlbgkJPSBuZXRkZXZfb3BlbiwKKwkubmRvX3N0b3AJCT0gbmV0ZGV2X2Nsb3NlLAorCS5uZG9fc3RhcnRfeG1pdAkJPSBzdGFydF90eCwKKwkubmRvX2dldF9zdGF0cwkJPSBnZXRfc3RhdHMsCisJLm5kb19zZXRfbXVsdGljYXN0X2xpc3QgPSBzZXRfcnhfbW9kZSwKKwkubmRvX2RvX2lvY3RsCQk9IG5ldGRldl9pb2N0bCwKKwkubmRvX3R4X3RpbWVvdXQJCT0gdHhfdGltZW91dCwKKwkubmRvX2NoYW5nZV9tdHUJCT0gZXRoX2NoYW5nZV9tdHUsCisJLm5kb19zZXRfbWFjX2FkZHJlc3MJPSBldGhfbWFjX2FkZHIsCisJLm5kb192YWxpZGF0ZV9hZGRyCT0gZXRoX3ZhbGlkYXRlX2FkZHIsCit9OwogCiBzdGF0aWMgaW50IF9fZGV2aW5pdCB3ODQwX3Byb2JlMSAoc3RydWN0IHBjaV9kZXYgKnBkZXYsCiAJCQkJICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQpAQCAtNDIwLDE0ICs0MzEsOCBAQAogCQlucC0+bWlpX2lmLmZvcmNlX21lZGlhID0gMTsKIAogCS8qIFRoZSBjaGlwLXNwZWNpZmljIGVudHJpZXMgaW4gdGhlIGRldmljZSBzdHJ1Y3R1cmUuICovCi0JZGV2LT5vcGVuID0gJm5ldGRldl9vcGVuOwotCWRldi0+aGFyZF9zdGFydF94bWl0ID0gJnN0YXJ0X3R4OwotCWRldi0+c3RvcCA9ICZuZXRkZXZfY2xvc2U7Ci0JZGV2LT5nZXRfc3RhdHMgPSAmZ2V0X3N0YXRzOwotCWRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gJnNldF9yeF9tb2RlOwotCWRldi0+ZG9faW9jdGwgPSAmbmV0ZGV2X2lvY3RsOworCWRldi0+bmV0ZGV2X29wcyA9ICZuZXRkZXZfb3BzOwogCWRldi0+ZXRodG9vbF9vcHMgPSAmbmV0ZGV2X2V0aHRvb2xfb3BzOwotCWRldi0+dHhfdGltZW91dCA9ICZ0eF90aW1lb3V0OwogCWRldi0+d2F0Y2hkb2dfdGltZW8gPSBUWF9USU1FT1VUOwogCiAJaSA9IHJlZ2lzdGVyX25ldGRldihkZXYpOwpAQCAtMTU1NSw3ICsxNTYwLDcgQEAKICAqIAlydG5sX2xvY2ssICYgbmV0aWZfZGV2aWNlX2RldGFjaCBhZnRlciB0aGUgcnRubF91bmxvY2suCiAgKiAtIGdldF9zdGF0czoKICAqIAlzcGluX2xvY2tfaXJxKG5wLT5sb2NrKSwgZG9lc24ndCB0b3VjaCBodyBpZiBub3QgcHJlc2VudAotICogLSBoYXJkX3N0YXJ0X3htaXQ6CisgKiAtIHN0YXJ0X3htaXQ6CiAgKiAJc3luY2hyb25pemVfaXJxICsgbmV0aWZfdHhfZGlzYWJsZTsKICAqIC0gdHhfdGltZW91dDoKICAqIAluZXRpZl9kZXZpY2VfZGV0YWNoICsgbmV0aWZfdHhfZGlzYWJsZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3R1bGlwL3hpcmNvbV9jYi5jIGIvZHJpdmVycy9uZXQvdHVsaXAveGlyY29tX2NiLmMKaW5kZXggMTNjODcwMy4uYzJjYTlmNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdHVsaXAveGlyY29tX2NiLmMKKysrIGIvZHJpdmVycy9uZXQvdHVsaXAveGlyY29tX2NiLmMKQEAgLTEwNCwxMCArMTA0LDggQEAKIAkgKi8KIAlzcGlubG9ja190IGxvY2s7CiAKLQogCXN0cnVjdCBwY2lfZGV2ICpwZGV2OwogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7Ci0Jc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CiB9OwogCiAKQEAgLTExOSw3ICsxMTcsNiBAQAogc3RhdGljIGludCB4aXJjb21fb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIHN0YXRpYyBpbnQgeGlyY29tX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogc3RhdGljIHZvaWQgeGlyY29tX3VwKHN0cnVjdCB4aXJjb21fcHJpdmF0ZSAqY2FyZCk7Ci1zdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnhpcmNvbV9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiAjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKIHN0YXRpYyB2b2lkIHhpcmNvbV9wb2xsX2NvbnRyb2xsZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiAjZW5kaWYKQEAgLTE5NCw2ICsxOTEsMTggQEAKIAkuZ2V0X2RydmluZm8JCT0gbmV0ZGV2X2dldF9kcnZpbmZvLAogfTsKIAorc3RhdGljIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyBuZXRkZXZfb3BzID0geworCS5uZG9fb3BlbgkJPSB4aXJjb21fb3BlbiwKKwkubmRvX3N0b3AJCT0geGlyY29tX2Nsb3NlLAorCS5uZG9fc3RhcnRfeG1pdAkJPSB4aXJjb21fc3RhcnRfeG1pdCwKKwkubmRvX2NoYW5nZV9tdHUJCT0gZXRoX2NoYW5nZV9tdHUsCisJLm5kb19zZXRfbWFjX2FkZHJlc3MJPSBldGhfbWFjX2FkZHIsCisJLm5kb192YWxpZGF0ZV9hZGRyCT0gZXRoX3ZhbGlkYXRlX2FkZHIsCisjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKKwkubmRvX3BvbGxfY29udHJvbGxlcgk9IHhpcmNvbV9wb2xsX2NvbnRyb2xsZXIsCisjZW5kaWYKK307CisKIC8qIHhpcmNvbV9wcm9iZSBpcyB0aGUgY29kZSB0aGF0IGdldHMgY2FsbGVkIG9uIGRldmljZSBpbnNlcnRpb24uCiAgICBpdCBzZXRzIHVwIHRoZSBoYXJkd2FyZSBhbmQgcmVnaXN0ZXJzIHRoZSBkZXZpY2UgdG8gdGhlIG5ldHdvcmtsYXllci4KIApAQCAtMjY2LDEzICsyNzUsNyBAQAogCXJlYWRfbWFjX2FkZHJlc3MocHJpdmF0ZSk7CiAJc2V0dXBfZGVzY3JpcHRvcnMocHJpdmF0ZSk7CiAKLQlkZXYtPm9wZW4gPSAmeGlyY29tX29wZW47Ci0JZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSAmeGlyY29tX3N0YXJ0X3htaXQ7Ci0JZGV2LT5zdG9wID0gJnhpcmNvbV9jbG9zZTsKLQlkZXYtPmdldF9zdGF0cyA9ICZ4aXJjb21fZ2V0X3N0YXRzOwotI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCi0JZGV2LT5wb2xsX2NvbnRyb2xsZXIgPSAmeGlyY29tX3BvbGxfY29udHJvbGxlcjsKLSNlbmRpZgorCWRldi0+bmV0ZGV2X29wcyA9ICZuZXRkZXZfb3BzOwogCVNFVF9FVEhUT09MX09QUyhkZXYsICZuZXRkZXZfZXRodG9vbF9vcHMpOwogCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBkZXYpOwogCkBAIC00OTcsMTQgKzUwMCw2IEBACiB9CiAKIAotCi1zdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnhpcmNvbV9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKLXsKLSAgICAgICAgc3RydWN0IHhpcmNvbV9wcml2YXRlICpjYXJkID0gbmV0ZGV2X3ByaXYoZGV2KTsKLSAgICAgICAgcmV0dXJuICZjYXJkLT5zdGF0czsKLX0KLQotCiAjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKIHN0YXRpYyB2b2lkIHhpcmNvbV9wb2xsX2NvbnRyb2xsZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKQEAgLTExOTMsNyArMTE4OCw3IEBACiAKIAkJCXNrYiA9IGRldl9hbGxvY19za2IocGt0X2xlbiArIDIpOwogCQkJaWYgKHNrYiA9PSBOVUxMKSB7Ci0JCQkJY2FyZC0+c3RhdHMucnhfZHJvcHBlZCsrOworCQkJCWRldi0+c3RhdHMucnhfZHJvcHBlZCsrOwogCQkJCWdvdG8gb3V0OwogCQkJfQogCQkJc2tiX3Jlc2VydmUoc2tiLCAyKTsKQEAgLTEyMDEsOCArMTE5Niw4IEBACiAJCQlza2JfcHV0KHNrYiwgcGt0X2xlbik7CiAJCQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBkZXYpOwogCQkJbmV0aWZfcngoc2tiKTsKLQkJCWNhcmQtPnN0YXRzLnJ4X3BhY2tldHMrKzsKLQkJCWNhcmQtPnN0YXRzLnJ4X2J5dGVzICs9IHBrdF9sZW47CisJCQlkZXYtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKwkJCWRldi0+c3RhdHMucnhfYnl0ZXMgKz0gcGt0X2xlbjsKIAogCQkgICAgICBvdXQ6CiAJCQkvKiBnaXZlIHRoZSBidWZmZXIgYmFjayB0byB0aGUgY2FyZCAqLwpAQCAtMTIzMiwxNiArMTIyNywxNiBAQAogI2VuZGlmCiAJCWlmIChzdGF0dXMgPiAwKSB7CS8qIGJpdCAzMSBpcyAwIHdoZW4gZG9uZSAqLwogCQkJaWYgKGNhcmQtPnR4X3NrYltkZXNjbnJdIT1OVUxMKSB7Ci0JCQkJY2FyZC0+c3RhdHMudHhfYnl0ZXMgKz0gY2FyZC0+dHhfc2tiW2Rlc2Nucl0tPmxlbjsKKwkJCQlkZXYtPnN0YXRzLnR4X2J5dGVzICs9IGNhcmQtPnR4X3NrYltkZXNjbnJdLT5sZW47CiAJCQkJZGV2X2tmcmVlX3NrYl9pcnEoY2FyZC0+dHhfc2tiW2Rlc2Nucl0pOwogCQkJfQogCQkJY2FyZC0+dHhfc2tiW2Rlc2Nucl0gPSBOVUxMOwogCQkJLyogQml0IDggaW4gdGhlIHN0YXR1cyBmaWVsZCBpcyAxIGlmIHRoZXJlIHdhcyBhIGNvbGxpc2lvbiAqLwogCQkJaWYgKHN0YXR1cyYoMTw8OCkpCi0JCQkJY2FyZC0+c3RhdHMuY29sbGlzaW9ucysrOworCQkJCWRldi0+c3RhdHMuY29sbGlzaW9ucysrOwogCQkJY2FyZC0+dHhfYnVmZmVyWzQqZGVzY25yXSA9IDA7IC8qIGRlc2NyaXB0b3IgaXMgZnJlZSBhZ2FpbiAqLwogCQkJbmV0aWZfd2FrZV9xdWV1ZSAoZGV2KTsKLQkJCWNhcmQtPnN0YXRzLnR4X3BhY2tldHMrKzsKKwkJCWRldi0+c3RhdHMudHhfcGFja2V0cysrOwogCQl9CiAKIAkJbGVhdmUoImludmVzdGlnYXRlX3dyaXRlX2Rlc2NyaXB0b3IiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3R5cGhvb24uYyBiL2RyaXZlcnMvbmV0L3R5cGhvb24uYwppbmRleCAwMDA5ZjRlLi4zYWY5YTk1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC90eXBob29uLmMKKysrIGIvZHJpdmVycy9uZXQvdHlwaG9vbi5jCkBAIC0yMjk2LDYgKzIyOTYsMTkgQEAKIAlyZXR1cm4gbW9kZTsKIH0KIAorc3RhdGljIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyB0eXBob29uX25ldGRldl9vcHMgPSB7CisJLm5kb19vcGVuCQk9IHR5cGhvb25fb3BlbiwKKwkubmRvX3N0b3AJCT0gdHlwaG9vbl9jbG9zZSwKKwkubmRvX3N0YXJ0X3htaXQJCT0gdHlwaG9vbl9zdGFydF90eCwKKwkubmRvX3NldF9tdWx0aWNhc3RfbGlzdAk9IHR5cGhvb25fc2V0X3J4X21vZGUsCisJLm5kb190eF90aW1lb3V0CQk9IHR5cGhvb25fdHhfdGltZW91dCwKKwkubmRvX2dldF9zdGF0cwkJPSB0eXBob29uX2dldF9zdGF0cywKKwkubmRvX3ZhbGlkYXRlX2FkZHIJPSBldGhfdmFsaWRhdGVfYWRkciwKKwkubmRvX3NldF9tYWNfYWRkcmVzcwk9IHR5cGhvb25fc2V0X21hY19hZGRyZXNzLAorCS5uZG9fY2hhbmdlX210dQkJPSBldGhfY2hhbmdlX210dSwKKwkubmRvX3ZsYW5fcnhfcmVnaXN0ZXIJPSB0eXBob29uX3ZsYW5fcnhfcmVnaXN0ZXIsCit9OworCiBzdGF0aWMgaW50IF9fZGV2aW5pdAogdHlwaG9vbl9pbml0X29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKIHsKQEAgLTI0OTUsMTYgKzI1MDgsOSBAQAogCX0KIAogCS8qIFRoZSBjaGlwLXNwZWNpZmljIGVudHJpZXMgaW4gdGhlIGRldmljZSBzdHJ1Y3R1cmUuICovCi0JZGV2LT5vcGVuCQk9IHR5cGhvb25fb3BlbjsKLQlkZXYtPmhhcmRfc3RhcnRfeG1pdAk9IHR5cGhvb25fc3RhcnRfdHg7Ci0JZGV2LT5zdG9wCQk9IHR5cGhvb25fY2xvc2U7Ci0JZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QJPSB0eXBob29uX3NldF9yeF9tb2RlOwotCWRldi0+dHhfdGltZW91dAkJPSB0eXBob29uX3R4X3RpbWVvdXQ7CisJZGV2LT5uZXRkZXZfb3BzCQk9ICZ0eXBob29uX25ldGRldl9vcHM7CiAJbmV0aWZfbmFwaV9hZGQoZGV2LCAmdHAtPm5hcGksIHR5cGhvb25fcG9sbCwgMTYpOwogCWRldi0+d2F0Y2hkb2dfdGltZW8JPSBUWF9USU1FT1VUOwotCWRldi0+Z2V0X3N0YXRzCQk9IHR5cGhvb25fZ2V0X3N0YXRzOwotCWRldi0+c2V0X21hY19hZGRyZXNzCT0gdHlwaG9vbl9zZXRfbWFjX2FkZHJlc3M7Ci0JZGV2LT52bGFuX3J4X3JlZ2lzdGVyCT0gdHlwaG9vbl92bGFuX3J4X3JlZ2lzdGVyOwogCiAJU0VUX0VUSFRPT0xfT1BTKGRldiwgJnR5cGhvb25fZXRodG9vbF9vcHMpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC91Y2NfZ2V0aC5jIGIvZHJpdmVycy9uZXQvdWNjX2dldGguYwppbmRleCA3ZDVhMTMwLi4xMTQ0MTIyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC91Y2NfZ2V0aC5jCisrKyBiL2RyaXZlcnMvbmV0L3VjY19nZXRoLmMKQEAgLTQ0Miw0MCArNDQyLDMwIEBACiB7CiAJc3RydWN0IHVjY19mYXN0X3ByaXZhdGUgKnVjY2Y7CiAJc3RydWN0IHVjY19nZXRoIF9faW9tZW0gKnVnX3JlZ3M7Ci0JdTMyIG1hY2NmZzIsIHVjY207CiAKIAl1Y2NmID0gdWdldGgtPnVjY2Y7CiAJdWdfcmVncyA9IHVnZXRoLT51Z19yZWdzOwogCiAJLyogRW5hYmxlIGludGVycnVwdHMgZm9yIG1hZ2ljIHBhY2tldCBkZXRlY3Rpb24gKi8KLQl1Y2NtID0gaW5fYmUzMih1Y2NmLT5wX3VjY20pOwotCXVjY20gfD0gVUNDRV9NUEQ7Ci0Jb3V0X2JlMzIodWNjZi0+cF91Y2NtLCB1Y2NtKTsKKwlzZXRiaXRzMzIodWNjZi0+cF91Y2NtLCBVQ0NfR0VUSF9VQ0NFX01QRCk7CiAKIAkvKiBFbmFibGUgbWFnaWMgcGFja2V0IGRldGVjdGlvbiAqLwotCW1hY2NmZzIgPSBpbl9iZTMyKCZ1Z19yZWdzLT5tYWNjZmcyKTsKLQltYWNjZmcyIHw9IE1BQ0NGRzJfTVBFOwotCW91dF9iZTMyKCZ1Z19yZWdzLT5tYWNjZmcyLCBtYWNjZmcyKTsKKwlzZXRiaXRzMzIoJnVnX3JlZ3MtPm1hY2NmZzIsIE1BQ0NGRzJfTVBFKTsKIH0KIAogc3RhdGljIHZvaWQgbWFnaWNfcGFja2V0X2RldGVjdGlvbl9kaXNhYmxlKHN0cnVjdCB1Y2NfZ2V0aF9wcml2YXRlICp1Z2V0aCkKIHsKIAlzdHJ1Y3QgdWNjX2Zhc3RfcHJpdmF0ZSAqdWNjZjsKIAlzdHJ1Y3QgdWNjX2dldGggX19pb21lbSAqdWdfcmVnczsKLQl1MzIgbWFjY2ZnMiwgdWNjbTsKIAogCXVjY2YgPSB1Z2V0aC0+dWNjZjsKIAl1Z19yZWdzID0gdWdldGgtPnVnX3JlZ3M7CiAKIAkvKiBEaXNhYmxlIGludGVycnVwdHMgZm9yIG1hZ2ljIHBhY2tldCBkZXRlY3Rpb24gKi8KLQl1Y2NtID0gaW5fYmUzMih1Y2NmLT5wX3VjY20pOwotCXVjY20gJj0gflVDQ0VfTVBEOwotCW91dF9iZTMyKHVjY2YtPnBfdWNjbSwgdWNjbSk7CisJY2xyYml0czMyKHVjY2YtPnBfdWNjbSwgVUNDX0dFVEhfVUNDRV9NUEQpOwogCiAJLyogRGlzYWJsZSBtYWdpYyBwYWNrZXQgZGV0ZWN0aW9uICovCi0JbWFjY2ZnMiA9IGluX2JlMzIoJnVnX3JlZ3MtPm1hY2NmZzIpOwotCW1hY2NmZzIgJj0gfk1BQ0NGRzJfTVBFOwotCW91dF9iZTMyKCZ1Z19yZWdzLT5tYWNjZmcyLCBtYWNjZmcyKTsKKwljbHJiaXRzMzIoJnVnX3JlZ3MtPm1hY2NmZzIsIE1BQ0NGRzJfTVBFKTsKIH0KICNlbmRpZiAvKiBNQUdJQ19QQUNLRVQgKi8KIApAQCAtNTg1LDcgKzU3NSw4IEBACiAKIAkvKiBIYXJkd2FyZSBvbmx5IGlmIHVzZXIgaGFuZGVkIHBvaW50ZXIgYW5kIGRyaXZlciBhY3R1YWxseQogCWdhdGhlcnMgaGFyZHdhcmUgc3RhdGlzdGljcyAqLwotCWlmIChoYXJkd2FyZV9zdGF0aXN0aWNzICYmIChpbl9iZTMyKCZ1Zl9yZWdzLT51cHNtcikgJiBVUFNNUl9IU0UpKSB7CisJaWYgKGhhcmR3YXJlX3N0YXRpc3RpY3MgJiYKKwkgICAgKGluX2JlMzIoJnVmX3JlZ3MtPnVwc21yKSAmIFVDQ19HRVRIX1VQU01SX0hTRSkpIHsKIAkJaGFyZHdhcmVfc3RhdGlzdGljcy0+dHg2NCA9IGluX2JlMzIoJnVnX3JlZ3MtPnR4NjQpOwogCQloYXJkd2FyZV9zdGF0aXN0aWNzLT50eDEyNyA9IGluX2JlMzIoJnVnX3JlZ3MtPnR4MTI3KTsKIAkJaGFyZHdhcmVfc3RhdGlzdGljcy0+dHgyNTUgPSBpbl9iZTMyKCZ1Z19yZWdzLT50eDI1NSk7CkBAIC0xMTgxLDkgKzExNzIsNyBAQAogCW91dF9iZTMyKHVlbXByX3JlZ2lzdGVyLCB2YWx1ZSk7CiAKIAkvKiBTZXQgVVBTTVIgcmVnaXN0ZXIgKi8KLQl2YWx1ZSA9IGluX2JlMzIodXBzbXJfcmVnaXN0ZXIpOwotCXZhbHVlIHw9IGF1dG9tYXRpY19mbG93X2NvbnRyb2xfbW9kZTsKLQlvdXRfYmUzMih1cHNtcl9yZWdpc3RlciwgdmFsdWUpOworCXNldGJpdHMzMih1cHNtcl9yZWdpc3RlciwgYXV0b21hdGljX2Zsb3dfY29udHJvbF9tb2RlKTsKIAogCXZhbHVlID0gaW5fYmUzMihtYWNjZmcxX3JlZ2lzdGVyKTsKIAlpZiAocnhfZmxvd19jb250cm9sX2VuYWJsZSkKQEAgLTEyMDAsMTQgKzExODksMTEgQEAKIAkJCQkJICAgICB1MzIgX19pb21lbSAqdXBzbXJfcmVnaXN0ZXIsCiAJCQkJCSAgICAgdTE2IF9faW9tZW0gKnVlc2NyX3JlZ2lzdGVyKQogewotCXUzMiB1cHNtcl92YWx1ZSA9IDA7CiAJdTE2IHVlc2NyX3ZhbHVlID0gMDsKKwogCS8qIEVuYWJsZSBoYXJkd2FyZSBzdGF0aXN0aWNzIGdhdGhlcmluZyBpZiByZXF1ZXN0ZWQgKi8KLQlpZiAoZW5hYmxlX2hhcmR3YXJlX3N0YXRpc3RpY3MpIHsKLQkJdXBzbXJfdmFsdWUgPSBpbl9iZTMyKHVwc21yX3JlZ2lzdGVyKTsKLQkJdXBzbXJfdmFsdWUgfD0gVVBTTVJfSFNFOwotCQlvdXRfYmUzMih1cHNtcl9yZWdpc3RlciwgdXBzbXJfdmFsdWUpOwotCX0KKwlpZiAoZW5hYmxlX2hhcmR3YXJlX3N0YXRpc3RpY3MpCisJCXNldGJpdHMzMih1cHNtcl9yZWdpc3RlciwgVUNDX0dFVEhfVVBTTVJfSFNFKTsKIAogCS8qIENsZWFyIGhhcmR3YXJlIHN0YXRpc3RpY3MgY291bnRlcnMgKi8KIAl1ZXNjcl92YWx1ZSA9IGluX2JlMTYodWVzY3JfcmVnaXN0ZXIpOwpAQCAtMTIzMywyMyArMTIxOSwxNyBAQAogewogCS8qIE5vdGU6IHRoaXMgZnVuY3Rpb24gZG9lcyBub3QgY2hlY2sgaWYgKi8KIAkvKiB0aGUgcGFyYW1ldGVycyBpdCByZWNlaXZlcyBhcmUgTlVMTCAgICovCi0JdTE2IHRlbW9kZXJfdmFsdWU7Ci0JdTMyIHJlbW9kZXJfdmFsdWU7CiAKIAlpZiAoZW5hYmxlX3R4X2Zpcm13YXJlX3N0YXRpc3RpY3MpIHsKIAkJb3V0X2JlMzIodHhfcm1vbl9iYXNlX3B0ciwKIAkJCSB0eF9maXJtd2FyZV9zdGF0aXN0aWNzX3N0cnVjdHVyZV9hZGRyZXNzKTsKLQkJdGVtb2Rlcl92YWx1ZSA9IGluX2JlMTYodGVtb2Rlcl9yZWdpc3Rlcik7Ci0JCXRlbW9kZXJfdmFsdWUgfD0gVEVNT0RFUl9UWF9STU9OX1NUQVRJU1RJQ1NfRU5BQkxFOwotCQlvdXRfYmUxNih0ZW1vZGVyX3JlZ2lzdGVyLCB0ZW1vZGVyX3ZhbHVlKTsKKwkJc2V0Yml0czE2KHRlbW9kZXJfcmVnaXN0ZXIsIFRFTU9ERVJfVFhfUk1PTl9TVEFUSVNUSUNTX0VOQUJMRSk7CiAJfQogCiAJaWYgKGVuYWJsZV9yeF9maXJtd2FyZV9zdGF0aXN0aWNzKSB7CiAJCW91dF9iZTMyKHJ4X3Jtb25fYmFzZV9wdHIsCiAJCQkgcnhfZmlybXdhcmVfc3RhdGlzdGljc19zdHJ1Y3R1cmVfYWRkcmVzcyk7Ci0JCXJlbW9kZXJfdmFsdWUgPSBpbl9iZTMyKHJlbW9kZXJfcmVnaXN0ZXIpOwotCQlyZW1vZGVyX3ZhbHVlIHw9IFJFTU9ERVJfUlhfUk1PTl9TVEFUSVNUSUNTX0VOQUJMRTsKLQkJb3V0X2JlMzIocmVtb2Rlcl9yZWdpc3RlciwgcmVtb2Rlcl92YWx1ZSk7CisJCXNldGJpdHMzMihyZW1vZGVyX3JlZ2lzdGVyLCBSRU1PREVSX1JYX1JNT05fU1RBVElTVElDU19FTkFCTEUpOwogCX0KIAogCXJldHVybiAwOwpAQCAtMTMxNiwxNSArMTI5NiwxMiBAQAogc3RhdGljIGludCBpbml0X3ByZWFtYmxlX2xlbmd0aCh1OCBwcmVhbWJsZV9sZW5ndGgsCiAJCQkJdTMyIF9faW9tZW0gKm1hY2NmZzJfcmVnaXN0ZXIpCiB7Ci0JdTMyIHZhbHVlID0gMDsKLQogCWlmICgocHJlYW1ibGVfbGVuZ3RoIDwgMykgfHwgKHByZWFtYmxlX2xlbmd0aCA+IDcpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCXZhbHVlID0gaW5fYmUzMihtYWNjZmcyX3JlZ2lzdGVyKTsKLQl2YWx1ZSAmPSB+TUFDQ0ZHMl9QUkVMX01BU0s7Ci0JdmFsdWUgfD0gKHByZWFtYmxlX2xlbmd0aCA8PCBNQUNDRkcyX1BSRUxfU0hJRlQpOwotCW91dF9iZTMyKG1hY2NmZzJfcmVnaXN0ZXIsIHZhbHVlKTsKKwljbHJzZXRiaXRzX2JlMzIobWFjY2ZnMl9yZWdpc3RlciwgTUFDQ0ZHMl9QUkVMX01BU0ssCisJCQlwcmVhbWJsZV9sZW5ndGggPDwgTUFDQ0ZHMl9QUkVMX1NISUZUKTsKKwogCXJldHVybiAwOwogfQogCkBAIC0xMzM3LDE5ICsxMzE0LDE5IEBACiAJdmFsdWUgPSBpbl9iZTMyKHVwc21yX3JlZ2lzdGVyKTsKIAogCWlmIChyZWplY3RfYnJvYWRjYXN0KQotCQl2YWx1ZSB8PSBVUFNNUl9CUk87CisJCXZhbHVlIHw9IFVDQ19HRVRIX1VQU01SX0JSTzsKIAllbHNlCi0JCXZhbHVlICY9IH5VUFNNUl9CUk87CisJCXZhbHVlICY9IH5VQ0NfR0VUSF9VUFNNUl9CUk87CiAKIAlpZiAocmVjZWl2ZV9zaG9ydF9mcmFtZXMpCi0JCXZhbHVlIHw9IFVQU01SX1JTSDsKKwkJdmFsdWUgfD0gVUNDX0dFVEhfVVBTTVJfUlNIOwogCWVsc2UKLQkJdmFsdWUgJj0gflVQU01SX1JTSDsKKwkJdmFsdWUgJj0gflVDQ19HRVRIX1VQU01SX1JTSDsKIAogCWlmIChwcm9taXNjdW91cykKLQkJdmFsdWUgfD0gVVBTTVJfUFJPOworCQl2YWx1ZSB8PSBVQ0NfR0VUSF9VUFNNUl9QUk87CiAJZWxzZQotCQl2YWx1ZSAmPSB+VVBTTVJfUFJPOworCQl2YWx1ZSAmPSB+VUNDX0dFVEhfVVBTTVJfUFJPOwogCiAJb3V0X2JlMzIodXBzbXJfcmVnaXN0ZXIsIHZhbHVlKTsKIApAQCAtMTQxMCwyNiArMTM4NywyNyBAQAogCiAJLyogICAgICAgICAgICAgICAgICAgIFNldCBVUFNNUiAgICAgICAgICAgICAgICAgICAgICAqLwogCXVwc21yID0gaW5fYmUzMigmdWZfcmVncy0+dXBzbXIpOwotCXVwc21yICY9IH4oVVBTTVJfUlBNIHwgVVBTTVJfUjEwTSB8IFVQU01SX1RCSU0gfCBVUFNNUl9STU0pOworCXVwc21yICY9IH4oVUNDX0dFVEhfVVBTTVJfUlBNIHwgVUNDX0dFVEhfVVBTTVJfUjEwTSB8CisJCSAgIFVDQ19HRVRIX1VQU01SX1RCSU0gfCBVQ0NfR0VUSF9VUFNNUl9STU0pOwogCWlmICgodWdldGgtPnBoeV9pbnRlcmZhY2UgPT0gUEhZX0lOVEVSRkFDRV9NT0RFX1JNSUkpIHx8CiAJICAgICh1Z2V0aC0+cGh5X2ludGVyZmFjZSA9PSBQSFlfSU5URVJGQUNFX01PREVfUkdNSUkpIHx8CiAJICAgICh1Z2V0aC0+cGh5X2ludGVyZmFjZSA9PSBQSFlfSU5URVJGQUNFX01PREVfUkdNSUlfSUQpIHx8CiAJICAgICh1Z2V0aC0+cGh5X2ludGVyZmFjZSA9PSBQSFlfSU5URVJGQUNFX01PREVfUkdNSUlfUlhJRCkgfHwKIAkgICAgKHVnZXRoLT5waHlfaW50ZXJmYWNlID09IFBIWV9JTlRFUkZBQ0VfTU9ERV9SR01JSV9UWElEKSB8fAogCSAgICAodWdldGgtPnBoeV9pbnRlcmZhY2UgPT0gUEhZX0lOVEVSRkFDRV9NT0RFX1JUQkkpKSB7Ci0JCXVwc21yIHw9IFVQU01SX1JQTTsKKwkJdXBzbXIgfD0gVUNDX0dFVEhfVVBTTVJfUlBNOwogCQlzd2l0Y2ggKHVnZXRoLT5tYXhfc3BlZWQpIHsKIAkJY2FzZSBTUEVFRF8xMDoKLQkJCXVwc21yIHw9IFVQU01SX1IxME07CisJCQl1cHNtciB8PSBVQ0NfR0VUSF9VUFNNUl9SMTBNOwogCQkJLyogRkFMTFRIUk9VR0ggKi8KIAkJY2FzZSBTUEVFRF8xMDA6CiAJCQlpZiAodWdldGgtPnBoeV9pbnRlcmZhY2UgIT0gUEhZX0lOVEVSRkFDRV9NT0RFX1JUQkkpCi0JCQkJdXBzbXIgfD0gVVBTTVJfUk1NOworCQkJCXVwc21yIHw9IFVDQ19HRVRIX1VQU01SX1JNTTsKIAkJfQogCX0KIAlpZiAoKHVnZXRoLT5waHlfaW50ZXJmYWNlID09IFBIWV9JTlRFUkZBQ0VfTU9ERV9UQkkpIHx8CiAJICAgICh1Z2V0aC0+cGh5X2ludGVyZmFjZSA9PSBQSFlfSU5URVJGQUNFX01PREVfUlRCSSkpIHsKLQkJdXBzbXIgfD0gVVBTTVJfVEJJTTsKKwkJdXBzbXIgfD0gVUNDX0dFVEhfVVBTTVJfVEJJTTsKIAl9CiAJb3V0X2JlMzIoJnVmX3JlZ3MtPnVwc21yLCB1cHNtcik7CiAKQEAgLTE1MTcsOSArMTQ5NSw5IEBACiAJCQkJICAgICh1Z2V0aC0+cGh5X2ludGVyZmFjZSA9PSBQSFlfSU5URVJGQUNFX01PREVfUkdNSUlfVFhJRCkgfHwKIAkJCQkgICAgKHVnZXRoLT5waHlfaW50ZXJmYWNlID09IFBIWV9JTlRFUkZBQ0VfTU9ERV9SVEJJKSkgewogCQkJCQlpZiAocGh5ZGV2LT5zcGVlZCA9PSBTUEVFRF8xMCkKLQkJCQkJCXVwc21yIHw9IFVQU01SX1IxME07CisJCQkJCQl1cHNtciB8PSBVQ0NfR0VUSF9VUFNNUl9SMTBNOwogCQkJCQllbHNlCi0JCQkJCQl1cHNtciAmPSB+KFVQU01SX1IxME0pOworCQkJCQkJdXBzbXIgJj0gflVDQ19HRVRIX1VQU01SX1IxME07CiAJCQkJfQogCQkJCWJyZWFrOwogCQkJZGVmYXVsdDoKQEAgLTE2MDIsMTAgKzE1ODAsOCBAQAogCXVjY2YgPSB1Z2V0aC0+dWNjZjsKIAogCS8qIE1hc2sgR1JBQ0VGVUwgU1RPUCBUWCBpbnRlcnJ1cHQgYml0IGFuZCBjbGVhciBpdCAqLwotCXRlbXAgPSBpbl9iZTMyKHVjY2YtPnBfdWNjbSk7Ci0JdGVtcCAmPSB+VUNDRV9HUkE7Ci0Jb3V0X2JlMzIodWNjZi0+cF91Y2NtLCB0ZW1wKTsKLQlvdXRfYmUzMih1Y2NmLT5wX3VjY2UsIFVDQ0VfR1JBKTsJLyogY2xlYXIgYnkgd3JpdGluZyAxICovCisJY2xyYml0czMyKHVjY2YtPnBfdWNjbSwgVUNDX0dFVEhfVUNDRV9HUkEpOworCW91dF9iZTMyKHVjY2YtPnBfdWNjZSwgVUNDX0dFVEhfVUNDRV9HUkEpOyAgLyogY2xlYXIgYnkgd3JpdGluZyAxICovCiAKIAkvKiBJc3N1ZSBob3N0IGNvbW1hbmQgKi8KIAljZWNyX3N1YmJsb2NrID0KQEAgLTE2MTcsNyArMTU5Myw3IEBACiAJZG8gewogCQltc2xlZXAoMTApOwogCQl0ZW1wID0gaW5fYmUzMih1Y2NmLT5wX3VjY2UpOwotCX0gd2hpbGUgKCEodGVtcCAmIFVDQ0VfR1JBKSAmJiAtLWkpOworCX0gd2hpbGUgKCEodGVtcCAmIFVDQ19HRVRIX1VDQ0VfR1JBKSAmJiAtLWkpOwogCiAJdWNjZi0+c3RvcHBlZF90eCA9IDE7CiAKQEAgLTE5NzUsMTIgKzE5NTEsOSBAQAogCXVmX3JlZ3MgPSB1Z2V0aC0+dWNjZi0+dWZfcmVnczsKIAogCWlmIChkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpIHsKLQotCQlvdXRfYmUzMigmdWZfcmVncy0+dXBzbXIsIGluX2JlMzIoJnVmX3JlZ3MtPnVwc21yKSB8IFVQU01SX1BSTyk7Ci0KKwkJc2V0Yml0czMyKCZ1Zl9yZWdzLT51cHNtciwgVUNDX0dFVEhfVVBTTVJfUFJPKTsKIAl9IGVsc2UgewotCi0JCW91dF9iZTMyKCZ1Zl9yZWdzLT51cHNtciwgaW5fYmUzMigmdWZfcmVncy0+dXBzbXIpJn5VUFNNUl9QUk8pOworCQljbHJiaXRzMzIoJnVmX3JlZ3MtPnVwc21yLCBVQ0NfR0VUSF9VUFNNUl9QUk8pOwogCiAJCXBfODJ4eF9hZGRyX2ZpbHQgPQogCQkgICAgKHN0cnVjdCB1Y2NfZ2V0aF84Mnh4X2FkZHJlc3NfZmlsdGVyaW5nX3ByYW0gX19pb21lbSAqKSB1Z2V0aC0+CkBAIC0yMDIwLDcgKzE5OTMsNiBAQAogewogCXN0cnVjdCB1Y2NfZ2V0aCBfX2lvbWVtICp1Z19yZWdzID0gdWdldGgtPnVnX3JlZ3M7CiAJc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldiA9IHVnZXRoLT5waHlkZXY7Ci0JdTMyIHRlbXB2YWw7CiAKIAl1Z2V0aF92ZGJnKCIlczogSU4iLCBfX2Z1bmNfXyk7CiAKQEAgLTIwMzcsOSArMjAwOSw3IEBACiAJb3V0X2JlMzIodWdldGgtPnVjY2YtPnBfdWNjZSwgMHhmZmZmZmZmZik7CiAKIAkvKiBEaXNhYmxlIFJ4IGFuZCBUeCAqLwotCXRlbXB2YWwgPSBpbl9iZTMyKCZ1Z19yZWdzLT5tYWNjZmcxKTsKLQl0ZW1wdmFsICY9IH4oTUFDQ0ZHMV9FTkFCTEVfUlggfCBNQUNDRkcxX0VOQUJMRV9UWCk7Ci0Jb3V0X2JlMzIoJnVnX3JlZ3MtPm1hY2NmZzEsIHRlbXB2YWwpOworCWNscmJpdHMzMigmdWdfcmVncy0+bWFjY2ZnMSwgTUFDQ0ZHMV9FTkFCTEVfUlggfCBNQUNDRkcxX0VOQUJMRV9UWCk7CiAKIAl1Y2NfZ2V0aF9tZW1jbGVhbih1Z2V0aCk7CiB9CkBAIC0yMTUzLDEwICsyMTIzLDEwIEBACiAJLyogR2VuZXJhdGUgdWNjbV9tYXNrIGZvciByZWNlaXZlICovCiAJdWZfaW5mby0+dWNjbV9tYXNrID0gdWdfaW5mby0+ZXZlbnRSZWdNYXNrICYgVUNDRV9PVEhFUjsvKiBFcnJvcnMgKi8KIAlmb3IgKGkgPSAwOyBpIDwgdWdfaW5mby0+bnVtUXVldWVzUng7IGkrKykKLQkJdWZfaW5mby0+dWNjbV9tYXNrIHw9IChVQ0NFX1JYQkZfU0lOR0xFX01BU0sgPDwgaSk7CisJCXVmX2luZm8tPnVjY21fbWFzayB8PSAoVUNDX0dFVEhfVUNDRV9SWEYwIDw8IGkpOwogCiAJZm9yIChpID0gMDsgaSA8IHVnX2luZm8tPm51bVF1ZXVlc1R4OyBpKyspCi0JCXVmX2luZm8tPnVjY21fbWFzayB8PSAoVUNDRV9UWEJGX1NJTkdMRV9NQVNLIDw8IGkpOworCQl1Zl9pbmZvLT51Y2NtX21hc2sgfD0gKFVDQ19HRVRIX1VDQ0VfVFhCMCA8PCBpKTsKIAkvKiBJbml0aWFsaXplIHRoZSBnZW5lcmFsIGZhc3QgVUNDIGJsb2NrLiAqLwogCWlmICh1Y2NfZmFzdF9pbml0KHVmX2luZm8sICZ1Z2V0aC0+dWNjZikpIHsKIAkJaWYgKG5ldGlmX21zZ19wcm9iZSh1Z2V0aCkpCkBAIC0yMTg1LDcgKzIxNTUsNyBAQAogCXN0cnVjdCB1Y2NfZ2V0aCBfX2lvbWVtICp1Z19yZWdzOwogCWludCByZXRfdmFsID0gLUVJTlZBTDsKIAl1MzIgcmVtb2RlciA9IFVDQ19HRVRIX1JFTU9ERVJfSU5JVDsKLQl1MzIgaW5pdF9lbmV0X3ByYW1fb2Zmc2V0LCBjZWNyX3N1YmJsb2NrLCBjb21tYW5kLCBtYWNjZmcxOworCXUzMiBpbml0X2VuZXRfcHJhbV9vZmZzZXQsIGNlY3Jfc3ViYmxvY2ssIGNvbW1hbmQ7CiAJdTMyIGlmc3RhdCwgaSwgaiwgc2l6ZSwgbDJxdCwgbDNxdCwgbGVuZ3RoOwogCXUxNiB0ZW1vZGVyID0gVUNDX0dFVEhfVEVNT0RFUl9JTklUOwogCXUxNiB0ZXN0OwpAQCAtMjI4MSwxMCArMjI1MSw3IEBACiAJCQkJICZ1Zl9yZWdzLT51cHNtciwKIAkJCQkgJnVnX3JlZ3MtPnVlbXByLCAmdWdfcmVncy0+bWFjY2ZnMSk7CiAKLQltYWNjZmcxID0gaW5fYmUzMigmdWdfcmVncy0+bWFjY2ZnMSk7Ci0JbWFjY2ZnMSB8PSBNQUNDRkcxX0VOQUJMRV9SWDsKLQltYWNjZmcxIHw9IE1BQ0NGRzFfRU5BQkxFX1RYOwotCW91dF9iZTMyKCZ1Z19yZWdzLT5tYWNjZmcxLCBtYWNjZmcxKTsKKwlzZXRiaXRzMzIoJnVnX3JlZ3MtPm1hY2NmZzEsIE1BQ0NGRzFfRU5BQkxFX1JYIHwgTUFDQ0ZHMV9FTkFCTEVfVFgpOwogCiAJLyogICAgICAgICAgICAgICAgICAgIFNldCBJUEdJRkcgICAgICAgICAgICAgICAgICAgICAqLwogCS8qIEZvciBtb3JlIGRldGFpbHMgc2VlIHRoZSBoYXJkd2FyZSBzcGVjLiAgICAgICAgICAgKi8KQEAgLTMyNzQsNyArMzI0MSw2IEBACiBzdGF0aWMgaW50IHVjY19nZXRoX3BvbGwoc3RydWN0IG5hcGlfc3RydWN0ICpuYXBpLCBpbnQgYnVkZ2V0KQogewogCXN0cnVjdCB1Y2NfZ2V0aF9wcml2YXRlICp1Z2V0aCA9IGNvbnRhaW5lcl9vZihuYXBpLCBzdHJ1Y3QgdWNjX2dldGhfcHJpdmF0ZSwgbmFwaSk7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHVnZXRoLT5kZXY7CiAJc3RydWN0IHVjY19nZXRoX2luZm8gKnVnX2luZm87CiAJaW50IGhvd21hbnksIGk7CiAKQEAgLTMyODUsMTQgKzMyNTEsOCBAQAogCQlob3dtYW55ICs9IHVjY19nZXRoX3J4KHVnZXRoLCBpLCBidWRnZXQgLSBob3dtYW55KTsKIAogCWlmIChob3dtYW55IDwgYnVkZ2V0KSB7Ci0JCXN0cnVjdCB1Y2NfZmFzdF9wcml2YXRlICp1Y2NmOwotCQl1MzIgdWNjbTsKLQogCQluZXRpZl9yeF9jb21wbGV0ZShuYXBpKTsKLQkJdWNjZiA9IHVnZXRoLT51Y2NmOwotCQl1Y2NtID0gaW5fYmUzMih1Y2NmLT5wX3VjY20pOwotCQl1Y2NtIHw9IFVDQ0VfUlhfRVZFTlRTOwotCQlvdXRfYmUzMih1Y2NmLT5wX3VjY20sIHVjY20pOworCQlzZXRiaXRzMzIodWdldGgtPnVjY2YtPnBfdWNjbSwgVUNDRV9SWF9FVkVOVFMpOwogCX0KIAogCXJldHVybiBob3dtYW55OwpAQCAtMzMzMiw3ICszMjkyLDcgQEAKIAkvKiBUeCBldmVudCBwcm9jZXNzaW5nICovCiAJaWYgKHVjY2UgJiBVQ0NFX1RYX0VWRU5UUykgewogCQlzcGluX2xvY2soJnVnZXRoLT5sb2NrKTsKLQkJdHhfbWFzayA9IFVDQ0VfVFhCRl9TSU5HTEVfTUFTSzsKKwkJdHhfbWFzayA9IFVDQ19HRVRIX1VDQ0VfVFhCMDsKIAkJZm9yIChpID0gMDsgaSA8IHVnX2luZm8tPm51bVF1ZXVlc1R4OyBpKyspIHsKIAkJCWlmICh1Y2NlICYgdHhfbWFzaykKIAkJCQl1Y2NfZ2V0aF90eChkZXYsIGkpOwpAQCAtMzM0NCwxMiArMzMwNCwxMCBAQAogCiAJLyogRXJyb3JzIGFuZCBvdGhlciBldmVudHMgKi8KIAlpZiAodWNjZSAmIFVDQ0VfT1RIRVIpIHsKLQkJaWYgKHVjY2UgJiBVQ0NFX0JTWSkgeworCQlpZiAodWNjZSAmIFVDQ19HRVRIX1VDQ0VfQlNZKQogCQkJZGV2LT5zdGF0cy5yeF9lcnJvcnMrKzsKLQkJfQotCQlpZiAodWNjZSAmIFVDQ0VfVFhFKSB7CisJCWlmICh1Y2NlICYgVUNDX0dFVEhfVUNDRV9UWEUpCiAJCQlkZXYtPnN0YXRzLnR4X2Vycm9ycysrOwotCQl9CiAJfQogCiAJcmV0dXJuIElSUV9IQU5ETEVEOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdWNjX2dldGguaCBiL2RyaXZlcnMvbmV0L3VjY19nZXRoLmgKaW5kZXggZDc0ZDJmNy4uOGY2OTljYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdWNjX2dldGguaAorKysgYi9kcml2ZXJzL25ldC91Y2NfZ2V0aC5oCkBAIC0xNjIsOTIgKzE2MiwyNyBAQAogCQkJCQkJCQkgICBib3VuZGFyeSAqLwogCiAvKiBVQ0MgR0VUSCBFdmVudCBSZWdpc3RlciAqLwotI2RlZmluZSBVQ0NFX01QRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDAwMDAwMAkvKiBNYWdpYyBwYWNrZXQKLQkJCQkJCQkJICAgZGV0ZWN0aW9uICovCi0jZGVmaW5lIFVDQ0VfU0NBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwMDAwMDAwCi0jZGVmaW5lIFVDQ0VfR1JBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDIwMDAwMDAwCS8qIFR4IGdyYWNlZnVsCi0JCQkJCQkJCSAgIHN0b3AKLQkJCQkJCQkJICAgY29tcGxldGUgKi8KLSNkZWZpbmUgVUNDRV9DQlBSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAwMDAwMDAKLSNkZWZpbmUgVUNDRV9CU1kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDgwMDAwMDAKLSNkZWZpbmUgVUNDRV9SWEMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQwMDAwMDAKLSNkZWZpbmUgVUNDRV9UWEMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwMDAwMDAKLSNkZWZpbmUgVUNDRV9UWEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMDAwMDAKLSNkZWZpbmUgVUNDRV9UWEI3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA4MDAwMDAKLSNkZWZpbmUgVUNDRV9UWEI2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MDAwMDAKLSNkZWZpbmUgVUNDRV9UWEI1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAyMDAwMDAKLSNkZWZpbmUgVUNDRV9UWEI0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAxMDAwMDAKLSNkZWZpbmUgVUNDRV9UWEIzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwODAwMDAKLSNkZWZpbmUgVUNDRV9UWEIyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwNDAwMDAKLSNkZWZpbmUgVUNDRV9UWEIxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMjAwMDAKLSNkZWZpbmUgVUNDRV9UWEIwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMTAwMDAKLSNkZWZpbmUgVUNDRV9SWEI3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDgwMDAKLSNkZWZpbmUgVUNDRV9SWEI2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDQwMDAKLSNkZWZpbmUgVUNDRV9SWEI1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDIwMDAKLSNkZWZpbmUgVUNDRV9SWEI0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDEwMDAKLSNkZWZpbmUgVUNDRV9SWEIzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA4MDAKLSNkZWZpbmUgVUNDRV9SWEIyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0MDAKLSNkZWZpbmUgVUNDRV9SWEIxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyMDAKLSNkZWZpbmUgVUNDRV9SWEIwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMDAKLSNkZWZpbmUgVUNDRV9SWEY3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwODAKLSNkZWZpbmUgVUNDRV9SWEY2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwNDAKLSNkZWZpbmUgVUNDRV9SWEY1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMjAKLSNkZWZpbmUgVUNDRV9SWEY0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTAKLSNkZWZpbmUgVUNDRV9SWEYzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDgKLSNkZWZpbmUgVUNDRV9SWEYyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKLSNkZWZpbmUgVUNDRV9SWEYxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKLSNkZWZpbmUgVUNDRV9SWEYwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgVUNDRV9UWEIgICAoVUNDX0dFVEhfVUNDRV9UWEI3IHwgVUNDX0dFVEhfVUNDRV9UWEI2IHwgXAorCQkgICAgVUNDX0dFVEhfVUNDRV9UWEI1IHwgVUNDX0dFVEhfVUNDRV9UWEI0IHwgXAorCQkgICAgVUNDX0dFVEhfVUNDRV9UWEIzIHwgVUNDX0dFVEhfVUNDRV9UWEIyIHwgXAorCQkgICAgVUNDX0dFVEhfVUNDRV9UWEIxIHwgVUNDX0dFVEhfVUNDRV9UWEIwKQogCi0jZGVmaW5lIFVDQ0VfUlhCRl9TSU5HTEVfTUFTSyAgICAgICAgICAgICAgICAgICAoVUNDRV9SWEYwKQotI2RlZmluZSBVQ0NFX1RYQkZfU0lOR0xFX01BU0sgICAgICAgICAgICAgICAgICAgKFVDQ0VfVFhCMCkKKyNkZWZpbmUgVUNDRV9SWEIgICAoVUNDX0dFVEhfVUNDRV9SWEI3IHwgVUNDX0dFVEhfVUNDRV9SWEI2IHwgXAorCQkgICAgVUNDX0dFVEhfVUNDRV9SWEI1IHwgVUNDX0dFVEhfVUNDRV9SWEI0IHwgXAorCQkgICAgVUNDX0dFVEhfVUNDRV9SWEIzIHwgVUNDX0dFVEhfVUNDRV9SWEIyIHwgXAorCQkgICAgVUNDX0dFVEhfVUNDRV9SWEIxIHwgVUNDX0dFVEhfVUNDRV9SWEIwKQogCi0jZGVmaW5lIFVDQ0VfVFhCICAgICAgICAgKFVDQ0VfVFhCNyB8IFVDQ0VfVFhCNiB8IFVDQ0VfVFhCNSB8IFVDQ0VfVFhCNCB8XAotCQkJVUNDRV9UWEIzIHwgVUNDRV9UWEIyIHwgVUNDRV9UWEIxIHwgVUNDRV9UWEIwKQotI2RlZmluZSBVQ0NFX1JYQiAgICAgICAgIChVQ0NFX1JYQjcgfCBVQ0NFX1JYQjYgfCBVQ0NFX1JYQjUgfCBVQ0NFX1JYQjQgfFwKLQkJCVVDQ0VfUlhCMyB8IFVDQ0VfUlhCMiB8IFVDQ0VfUlhCMSB8IFVDQ0VfUlhCMCkKLSNkZWZpbmUgVUNDRV9SWEYgICAgICAgICAoVUNDRV9SWEY3IHwgVUNDRV9SWEY2IHwgVUNDRV9SWEY1IHwgVUNDRV9SWEY0IHxcCi0JCQlVQ0NFX1JYRjMgfCBVQ0NFX1JYRjIgfCBVQ0NFX1JYRjEgfCBVQ0NFX1JYRjApCi0jZGVmaW5lIFVDQ0VfT1RIRVIgICAgICAgKFVDQ0VfU0NBUiB8IFVDQ0VfR1JBICB8IFVDQ0VfQ0JQUiB8IFVDQ0VfQlNZICB8XAotCQkJVUNDRV9SWEMgIHwgVUNDRV9UWEMgIHwgVUNDRV9UWEUpCisjZGVmaW5lIFVDQ0VfUlhGICAgKFVDQ19HRVRIX1VDQ0VfUlhGNyB8IFVDQ19HRVRIX1VDQ0VfUlhGNiB8IFwKKwkJICAgIFVDQ19HRVRIX1VDQ0VfUlhGNSB8IFVDQ19HRVRIX1VDQ0VfUlhGNCB8IFwKKwkJICAgIFVDQ19HRVRIX1VDQ0VfUlhGMyB8IFVDQ19HRVRIX1VDQ0VfUlhGMiB8IFwKKwkJICAgIFVDQ19HRVRIX1VDQ0VfUlhGMSB8IFVDQ19HRVRIX1VDQ0VfUlhGMCkKIAotI2RlZmluZSBVQ0NFX1JYX0VWRU5UUwkJCQkJCQkoVUNDRV9SWEYgfCBVQ0NFX0JTWSkKLSNkZWZpbmUgVUNDRV9UWF9FVkVOVFMJCQkJCQkJKFVDQ0VfVFhCIHwgVUNDRV9UWEUpCisjZGVmaW5lIFVDQ0VfT1RIRVIgKFVDQ19HRVRIX1VDQ0VfU0NBUiB8IFVDQ19HRVRIX1VDQ0VfR1JBIHwgXAorCQkgICAgVUNDX0dFVEhfVUNDRV9DQlBSIHwgVUNDX0dFVEhfVUNDRV9CU1kgfCBcCisJCSAgICBVQ0NfR0VUSF9VQ0NFX1JYQyAgfCBVQ0NfR0VUSF9VQ0NFX1RYQyB8IFVDQ19HRVRIX1VDQ0VfVFhFKQogCi0vKiBVQ0MgR0VUSCBVUFNNUiAoUHJvdG9jb2wgU3BlY2lmaWMgTW9kZSBSZWdpc3RlcikgKi8KLSNkZWZpbmUgVVBTTVJfRUNNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQwMDAwMDAJLyogRW5hYmxlIENBTQotCQkJCQkJCQkgICBNaXNzIG9yCi0JCQkJCQkJCSAgIEVuYWJsZQotCQkJCQkJCQkgICBGaWx0ZXJpbmcKLQkJCQkJCQkJICAgTWlzcyAqLwotI2RlZmluZSBVUFNNUl9IU0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjAwMDAwMAkvKiBIYXJkd2FyZQotCQkJCQkJCQkgICBTdGF0aXN0aWNzCi0JCQkJCQkJCSAgIEVuYWJsZSAqLwotI2RlZmluZSBVUFNNUl9QUk8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMDAwMAkvKiBQcm9taXNjdW91cyovCi0jZGVmaW5lIFVQU01SX0NBUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMjAwMDAwCS8qIENBTSBwb2xhcml0eQotCQkJCQkJCQkgKi8KLSNkZWZpbmUgVVBTTVJfUlNIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAxMDAwMDAJLyogUmVjZWl2ZQotCQkJCQkJCQkgICBTaG9ydCBGcmFtZXMKLQkJCQkJCQkJICovCi0jZGVmaW5lIFVQU01SX1JQTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDgwMDAwCS8qIFJlZHVjZWQgUGluCi0JCQkJCQkJCSAgIE1vZGUKLQkJCQkJCQkJICAgaW50ZXJmYWNlcyAqLwotI2RlZmluZSBVUFNNUl9SMTBNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDA0MDAwMAkvKiBSR01JSS9STUlJCi0JCQkJCQkJCSAgIDEwIE1vZGUgKi8KLSNkZWZpbmUgVVBTTVJfUkxQQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMjAwMDAJLyogUk1JSQotCQkJCQkJCQkgICBMb29wYmFjawotCQkJCQkJCQkgICBNb2RlICovCi0jZGVmaW5lIFVQU01SX1RCSU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEwMDAwCS8qIFRlbi1iaXQKLQkJCQkJCQkJICAgSW50ZXJmYWNlCi0JCQkJCQkJCSAgIE1vZGUgKi8KLSNkZWZpbmUgVVBTTVJfUk1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDEwMDAJLyogUk1JSS9SR01JSQotCQkJCQkJCQkgICBNb2RlICovCi0jZGVmaW5lIFVQU01SX0NBTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNDAwCS8qIENBTSBBZGRyZXNzCi0JCQkJCQkJCSAgIE1hdGNoaW5nICovCi0jZGVmaW5lIFVQU01SX0JSTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMjAwCS8qIEJyb2FkY2FzdAotCQkJCQkJCQkgICBBZGRyZXNzICovCi0jZGVmaW5lIFVQU01SX1JFUzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAyMDAwCS8qIFJlc2VydmVkCi0JCQkJCQkJCSAgIGZlaWxkIC0gbXVzdAotCQkJCQkJCQkgICBiZSAxICovCisjZGVmaW5lIFVDQ0VfUlhfRVZFTlRTICAoVUNDRV9SWEYgfCBVQ0NfR0VUSF9VQ0NFX0JTWSkKKyNkZWZpbmUgVUNDRV9UWF9FVkVOVFMJKFVDQ0VfVFhCIHwgVUNDX0dFVEhfVUNDRV9UWEUpCiAKIC8qIFVDQyBHRVRIIE1BQ0NGRzEgKE1BQyBDb25maWd1cmF0aW9uIDEgUmVnaXN0ZXIpICovCiAjZGVmaW5lIE1BQ0NGRzFfRkxPV19SWCAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDIwCS8qIEZsb3cgQ29udHJvbApAQCAtOTQ1LDkgKzg4MCwxMCBAQAogI2RlZmluZSBVQ0NfR0VUSF9SRU1PREVSX0lOSVQgICAgICAgICAgICAgICAgICAgMAkvKiBiaXRzIHRoYXQgbXVzdCBiZQogCQkJCQkJCSAgIHNldCAqLwogI2RlZmluZSBVQ0NfR0VUSF9URU1PREVSX0lOSVQgICAgICAgICAgICAgICAgICAgMHhDMDAwCS8qIGJpdHMgdGhhdCBtdXN0ICovCi0jZGVmaW5lIFVDQ19HRVRIX1VQU01SX0lOSVQgICAgICAgICAgICAgICAgICAgICAoVVBTTVJfUkVTMSkJLyogU3RhcnQgdmFsdWUKLQkJCQkJCQkJICAgZm9yIHRoaXMKLQkJCQkJCQkJICAgcmVnaXN0ZXIgKi8KKworLyogSW5pdGlhbCB2YWx1ZSBmb3IgVVBTTVIgKi8KKyNkZWZpbmUgVUNDX0dFVEhfVVBTTVJfSU5JVCAgICAgICAgICAgICAgICAgICAgIFVDQ19HRVRIX1VQU01SX1JFUzEKKwogI2RlZmluZSBVQ0NfR0VUSF9NQUNDRkcxX0lOSVQgICAgICAgICAgICAgICAgICAgMAogI2RlZmluZSBVQ0NfR0VUSF9NQUNDRkcyX0lOSVQgICAgICAgICAgICAgICAgICAgKE1BQ0NGRzJfUkVTRVJWRURfMSkKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdXNiL2RtOTYwMS5jIGIvZHJpdmVycy9uZXQvdXNiL2RtOTYwMS5jCmluZGV4IGVkZDI0NGYuLjViNjdiYmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3VzYi9kbTk2MDEuYworKysgYi9kcml2ZXJzL25ldC91c2IvZG05NjAxLmMKQEAgLTIzLDcgKzIzLDcgQEAKICNpbmNsdWRlIDxsaW51eC91c2IvdXNibmV0Lmg+CiAKIC8qIGRhdGFzaGVldDoKLSBodHRwOi8vd3d3LmRhdmljb20uY29tLnR3L2JpZzUvZG93bmxvYWQvRGF0YSUyMFNoZWV0L0RNOTYwMS1EUy1QMDEtOTMwOTE0LnBkZgorIGh0dHA6Ly9wdG0yLmNjLnV0dS5maS9mdHAvbmV0d29yay9jYXJkcy9ETTk2MDEvRnJvbV9ORVQvRE05NjAxLURTLVAwMS05MzA5MTQucGRmCiAqLwogCiAvKiBjb250cm9sIHJlcXVlc3RzICovCkBAIC0zOTcsMTYgKzM5NywyNCBAQAogCWRtX3dyaXRlX3JlZ19hc3luYyhkZXYsIERNX1JYX0NUUkwsIHJ4X2N0bCk7CiB9CiAKK3N0YXRpYyB2b2lkIF9fZG05NjAxX3NldF9tYWNfYWRkcmVzcyhzdHJ1Y3QgdXNibmV0ICpkZXYpCit7CisJZG1fd3JpdGVfYXN5bmMoZGV2LCBETV9QSFlfQUREUiwgRVRIX0FMRU4sIGRldi0+bmV0LT5kZXZfYWRkcik7Cit9CisKIHN0YXRpYyBpbnQgZG05NjAxX3NldF9tYWNfYWRkcmVzcyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0LCB2b2lkICpwKQogewogCXN0cnVjdCBzb2NrYWRkciAqYWRkciA9IHA7CiAJc3RydWN0IHVzYm5ldCAqZGV2ID0gbmV0ZGV2X3ByaXYobmV0KTsKIAotCWlmICghaXNfdmFsaWRfZXRoZXJfYWRkcihhZGRyLT5zYV9kYXRhKSkKKwlpZiAoIWlzX3ZhbGlkX2V0aGVyX2FkZHIoYWRkci0+c2FfZGF0YSkpIHsKKwkJZGV2X2VycigmbmV0LT5kZXYsICJub3Qgc2V0dGluZyBpbnZhbGlkIG1hYyBhZGRyZXNzICVwTVxuIiwKKwkJCQkJCQkJYWRkci0+c2FfZGF0YSk7CiAJCXJldHVybiAtRUlOVkFMOworCX0KIAogCW1lbWNweShuZXQtPmRldl9hZGRyLCBhZGRyLT5zYV9kYXRhLCBuZXQtPmFkZHJfbGVuKTsKLQlkbV93cml0ZV9hc3luYyhkZXYsIERNX1BIWV9BRERSLCBuZXQtPmFkZHJfbGVuLCBuZXQtPmRldl9hZGRyKTsKKwlfX2RtOTYwMV9zZXRfbWFjX2FkZHJlc3MoZGV2KTsKIAogCXJldHVybiAwOwogfQpAQCAtNDE0LDYgKzQyMiw3IEBACiBzdGF0aWMgaW50IGRtOTYwMV9iaW5kKHN0cnVjdCB1c2JuZXQgKmRldiwgc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCiB7CiAJaW50IHJldDsKKwl1OCBtYWNbRVRIX0FMRU5dOwogCiAJcmV0ID0gdXNibmV0X2dldF9lbmRwb2ludHMoZGV2LCBpbnRmKTsKIAlpZiAocmV0KQpAQCAtNDM4LDEyICs0NDcsMjQgQEAKIAl1ZGVsYXkoMjApOwogCiAJLyogcmVhZCBNQUMgKi8KLQlpZiAoZG1fcmVhZChkZXYsIERNX1BIWV9BRERSLCBFVEhfQUxFTiwgZGV2LT5uZXQtPmRldl9hZGRyKSA8IDApIHsKKwlpZiAoZG1fcmVhZChkZXYsIERNX1BIWV9BRERSLCBFVEhfQUxFTiwgbWFjKSA8IDApIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJFcnJvciByZWFkaW5nIE1BQyBhZGRyZXNzXG4iKTsKIAkJcmV0ID0gLUVOT0RFVjsKIAkJZ290byBvdXQ7CiAJfQogCisJLyoKKwkgKiBPdmVyd3JpdGUgdGhlIGF1dG8tZ2VuZXJhdGVkIGFkZHJlc3Mgb25seSB3aXRoIGdvb2Qgb25lcy4KKwkgKi8KKwlpZiAoaXNfdmFsaWRfZXRoZXJfYWRkcihtYWMpKQorCQltZW1jcHkoZGV2LT5uZXQtPmRldl9hZGRyLCBtYWMsIEVUSF9BTEVOKTsKKwllbHNlIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJImRtOTYwMTogTm8gdmFsaWQgTUFDIGFkZHJlc3MgaW4gRUVQUk9NLCB1c2luZyAlcE1cbiIsCisJCQlkZXYtPm5ldC0+ZGV2X2FkZHIpOworCQlfX2RtOTYwMV9zZXRfbWFjX2FkZHJlc3MoZGV2KTsKKwl9CisKIAkvKiBwb3dlciB1cCBwaHkgKi8KIAlkbV93cml0ZV9yZWcoZGV2LCBETV9HUFJfQ1RSTCwgMSk7CiAJZG1fd3JpdGVfcmVnKGRldiwgRE1fR1BSX0RBVEEsIDApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdXNiL2hzby5jIGIvZHJpdmVycy9uZXQvdXNiL2hzby5jCmluZGV4IGM0OTE4YjguLjBkMGZhOTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3VzYi9oc28uYworKysgYi9kcml2ZXJzL25ldC91c2IvaHNvLmMKQEAgLTEyOTcsNiArMTI5Nyw3IEBACiAJLyogc2V0dXAgKi8KIAlzcGluX2xvY2tfaXJxKCZzZXJpYWwtPnNlcmlhbF9sb2NrKTsKIAl0dHktPmRyaXZlcl9kYXRhID0gc2VyaWFsOworCXR0eV9rcmVmX3B1dChzZXJpYWwtPnR0eSk7CiAJc2VyaWFsLT50dHkgPSB0dHlfa3JlZl9nZXQodHR5KTsKIAlzcGluX3VubG9ja19pcnEoJnNlcmlhbC0+c2VyaWFsX2xvY2spOwogCkBAIC0xNzkyLDggKzE3OTMsOCBAQAogCiAJLyogaW5pdGlhbGl6ZSAqLwogCWN0cmxfcmVxLT53VmFsdWUgPSAwOwotCWN0cmxfcmVxLT53SW5kZXggPSBoc29fcG9ydF90b19tdXgocG9ydCk7Ci0JY3RybF9yZXEtPndMZW5ndGggPSBzaXplOworCWN0cmxfcmVxLT53SW5kZXggPSBjcHVfdG9fbGUxNihoc29fcG9ydF90b19tdXgocG9ydCkpOworCWN0cmxfcmVxLT53TGVuZ3RoID0gY3B1X3RvX2xlMTYoc2l6ZSk7CiAKIAlpZiAodHlwZSA9PSBVU0JfQ0RDX0dFVF9FTkNBUFNVTEFURURfUkVTUE9OU0UpIHsKIAkJLyogUmVhZGluZyBjb21tYW5kICovCkBAIC0yMDQzLDkgKzIwNDQsOCBAQAogCQlyZXR1cm4gLTI7CiAJfQogCi0Jc3Bpbl9sb2NrKCZzZXJpYWwtPnNlcmlhbF9sb2NrKTsKKwkvKiBBbGwgY2FsbGVycyB0byBwdXRfcnhidWZfZGF0YSBob2xkIHNlcmlhbF9sb2NrICovCiAJdHR5ID0gdHR5X2tyZWZfZ2V0KHNlcmlhbC0+dHR5KTsKLQlzcGluX3VubG9jaygmc2VyaWFsLT5zZXJpYWxfbG9jayk7CiAKIAkvKiBQdXNoIGRhdGEgdG8gdHR5ICovCiAJaWYgKHR0eSkgewpAQCAtMjA1Myw4ICsyMDUzLDEwIEBACiAJCQlzZXJpYWwtPmN1cnJfcnhfdXJiX29mZnNldDsKIAkJRDEoImRhdGEgdG8gcHVzaCB0byB0dHkiKTsKIAkJd2hpbGUgKHdyaXRlX2xlbmd0aF9yZW1haW5pbmcpIHsKLQkJCWlmICh0ZXN0X2JpdChUVFlfVEhST1RUTEVELCAmdHR5LT5mbGFncykpCisJCQlpZiAodGVzdF9iaXQoVFRZX1RIUk9UVExFRCwgJnR0eS0+ZmxhZ3MpKSB7CisJCQkJdHR5X2tyZWZfcHV0KHR0eSk7CiAJCQkJcmV0dXJuIC0xOworCQkJfQogCQkJY3Vycl93cml0ZV9sZW4gPSAgdHR5X2luc2VydF9mbGlwX3N0cmluZwogCQkJCSh0dHksIHVyYi0+dHJhbnNmZXJfYnVmZmVyICsKIAkJCQkgc2VyaWFsLT5jdXJyX3J4X3VyYl9vZmZzZXQsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC91c2Iva2F3ZXRoLmMgYi9kcml2ZXJzL25ldC91c2Iva2F3ZXRoLmMKaW5kZXggMmVlMDM0Zi4uN2NiMTBhMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdXNiL2thd2V0aC5jCisrKyBiL2RyaXZlcnMvbmV0L3VzYi9rYXdldGguYwpAQCAtMjUxLDcgKzI1MSw2IEBACiAJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CiB9OwogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAga2F3ZXRoX2NvbnRyb2wKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMjgzLDkgKzI4Miw5IEBACiAKIAlkci0+YlJlcXVlc3RUeXBlPSByZXF1ZXN0dHlwZTsKIAlkci0+YlJlcXVlc3QgPSByZXF1ZXN0OwotCWRyLT53VmFsdWUgPSBjcHVfdG9fbGUxNnAoJnZhbHVlKTsKLQlkci0+d0luZGV4ID0gY3B1X3RvX2xlMTZwKCZpbmRleCk7Ci0JZHItPndMZW5ndGggPSBjcHVfdG9fbGUxNnAoJnNpemUpOworCWRyLT53VmFsdWUgPSBjcHVfdG9fbGUxNih2YWx1ZSk7CisJZHItPndJbmRleCA9IGNwdV90b19sZTE2KGluZGV4KTsKKwlkci0+d0xlbmd0aCA9IGNwdV90b19sZTE2KHNpemUpOwogCiAJcmV0dXJuIGthd2V0aF9pbnRlcm5hbF9jb250cm9sX21zZyhrYXdldGgtPmRldiwKIAkJCQkJcGlwZSwKQEAgLTk3NSw2ICs5NzQsMTcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAga2F3ZXRoX3Byb2JlCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCitzdGF0aWMgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzIGthd2V0aF9uZXRkZXZfb3BzID0geworCS5uZG9fb3BlbiA9CQkJa2F3ZXRoX29wZW4sCisJLm5kb19zdG9wID0JCQlrYXdldGhfY2xvc2UsCisJLm5kb19zdGFydF94bWl0ID0JCWthd2V0aF9zdGFydF94bWl0LAorCS5uZG9fdHhfdGltZW91dCA9CQlrYXdldGhfdHhfdGltZW91dCwKKwkubmRvX3NldF9tdWx0aWNhc3RfbGlzdCA9CWthd2V0aF9zZXRfcnhfbW9kZSwKKwkubmRvX2dldF9zdGF0cyA9CQlrYXdldGhfbmV0ZGV2X3N0YXRzLAorfTsKKwogc3RhdGljIGludCBrYXdldGhfcHJvYmUoCiAJCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLAogCQljb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQgICAgICAvKiBmcm9tIGlkX3RhYmxlICovCkBAIC0xMTQ3LDIyICsxMTU3LDEzIEBACiAJbWVtY3B5KG5ldGRldi0+ZGV2X2FkZHIsICZrYXdldGgtPmNvbmZpZ3VyYXRpb24uaHdfYWRkciwKICAgICAgICAgICAgICAgIHNpemVvZihrYXdldGgtPmNvbmZpZ3VyYXRpb24uaHdfYWRkcikpOwogCi0JbmV0ZGV2LT5vcGVuID0ga2F3ZXRoX29wZW47Ci0JbmV0ZGV2LT5zdG9wID0ga2F3ZXRoX2Nsb3NlOwotCisJbmV0ZGV2LT5uZXRkZXZfb3BzID0gJmthd2V0aF9uZXRkZXZfb3BzOwogCW5ldGRldi0+d2F0Y2hkb2dfdGltZW8gPSBLQVdFVEhfVFhfVElNRU9VVDsKLQluZXRkZXYtPnR4X3RpbWVvdXQgPSBrYXdldGhfdHhfdGltZW91dDsKLQotCW5ldGRldi0+aGFyZF9zdGFydF94bWl0ID0ga2F3ZXRoX3N0YXJ0X3htaXQ7Ci0JbmV0ZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSBrYXdldGhfc2V0X3J4X21vZGU7Ci0JbmV0ZGV2LT5nZXRfc3RhdHMgPSBrYXdldGhfbmV0ZGV2X3N0YXRzOwogCW5ldGRldi0+bXR1ID0gbGUxNl90b19jcHUoa2F3ZXRoLT5jb25maWd1cmF0aW9uLnNlZ21lbnRfc2l6ZSk7CiAJU0VUX0VUSFRPT0xfT1BTKG5ldGRldiwgJm9wcyk7CiAKIAkvKiBrYXdldGggaXMgemVyb2VkIGFzIHBhcnQgb2YgYWxsb2NfbmV0ZGV2ICovCi0KIAlJTklUX0RFTEFZRURfV09SSygma2F3ZXRoLT5sb3dtZW1fd29yaywga2F3ZXRoX3Jlc3VibWl0X3RsKTsKLQogCXVzYl9zZXRfaW50ZmRhdGEoaW50Ziwga2F3ZXRoKTsKIAogI2lmIDAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3VzYi9wZWdhc3VzLmMgYi9kcml2ZXJzL25ldC91c2IvcGVnYXN1cy5jCmluZGV4IDE2Njg4MGMuLmE4MjI4ZDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3VzYi9wZWdhc3VzLmMKKysrIGIvZHJpdmVycy9uZXQvdXNiL3BlZ2FzdXMuYwpAQCAtOTMsNiArOTMsNyBAQAogTU9EVUxFX1BBUk1fREVTQyAobXNnX2xldmVsLCAiT3ZlcnJpZGUgZGVmYXVsdCBtZXNzYWdlIGxldmVsIik7CiAKIE1PRFVMRV9ERVZJQ0VfVEFCTEUodXNiLCBwZWdhc3VzX2lkcyk7CitzdGF0aWMgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzIHBlZ2FzdXNfbmV0ZGV2X29wczsKIAogc3RhdGljIGludCB1cGRhdGVfZXRoX3JlZ3NfYXN5bmMocGVnYXN1c190ICopOwogLyogQWFyZ2ghISEgSSBfcmVhbGx5XyBoYXRlIHN1Y2ggdHdlYWtzICovCkBAIC0xNTAsOCArMTUxLDggQEAKIAlwZWdhc3VzLT5kci5iUmVxdWVzdFR5cGUgPSBQRUdBU1VTX1JFUVRfUkVBRDsKIAlwZWdhc3VzLT5kci5iUmVxdWVzdCA9IFBFR0FTVVNfUkVRX0dFVF9SRUdTOwogCXBlZ2FzdXMtPmRyLndWYWx1ZSA9IGNwdV90b19sZTE2KDApOwotCXBlZ2FzdXMtPmRyLndJbmRleCA9IGNwdV90b19sZTE2cCgmaW5keCk7Ci0JcGVnYXN1cy0+ZHIud0xlbmd0aCA9IGNwdV90b19sZTE2cCgmc2l6ZSk7CisJcGVnYXN1cy0+ZHIud0luZGV4ID0gY3B1X3RvX2xlMTYoaW5keCk7CisJcGVnYXN1cy0+ZHIud0xlbmd0aCA9IGNwdV90b19sZTE2KHNpemUpOwogCXBlZ2FzdXMtPmN0cmxfdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoID0gc2l6ZTsKIAogCXVzYl9maWxsX2NvbnRyb2xfdXJiKHBlZ2FzdXMtPmN0cmxfdXJiLCBwZWdhc3VzLT51c2IsCkBAIC0yMDgsOCArMjA5LDggQEAKIAlwZWdhc3VzLT5kci5iUmVxdWVzdFR5cGUgPSBQRUdBU1VTX1JFUVRfV1JJVEU7CiAJcGVnYXN1cy0+ZHIuYlJlcXVlc3QgPSBQRUdBU1VTX1JFUV9TRVRfUkVHUzsKIAlwZWdhc3VzLT5kci53VmFsdWUgPSBjcHVfdG9fbGUxNigwKTsKLQlwZWdhc3VzLT5kci53SW5kZXggPSBjcHVfdG9fbGUxNnAoJmluZHgpOwotCXBlZ2FzdXMtPmRyLndMZW5ndGggPSBjcHVfdG9fbGUxNnAoJnNpemUpOworCXBlZ2FzdXMtPmRyLndJbmRleCA9IGNwdV90b19sZTE2KGluZHgpOworCXBlZ2FzdXMtPmRyLndMZW5ndGggPSBjcHVfdG9fbGUxNihzaXplKTsKIAlwZWdhc3VzLT5jdHJsX3VyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCA9IHNpemU7CiAKIAl1c2JfZmlsbF9jb250cm9sX3VyYihwZWdhc3VzLT5jdHJsX3VyYiwgcGVnYXN1cy0+dXNiLApAQCAtMjYxLDcgKzI2Miw3IEBACiAJcGVnYXN1cy0+ZHIuYlJlcXVlc3RUeXBlID0gUEVHQVNVU19SRVFUX1dSSVRFOwogCXBlZ2FzdXMtPmRyLmJSZXF1ZXN0ID0gUEVHQVNVU19SRVFfU0VUX1JFRzsKIAlwZWdhc3VzLT5kci53VmFsdWUgPSBjcHVfdG9fbGUxNihkYXRhKTsKLQlwZWdhc3VzLT5kci53SW5kZXggPSBjcHVfdG9fbGUxNnAoJmluZHgpOworCXBlZ2FzdXMtPmRyLndJbmRleCA9IGNwdV90b19sZTE2KGluZHgpOwogCXBlZ2FzdXMtPmRyLndMZW5ndGggPSBjcHVfdG9fbGUxNigxKTsKIAlwZWdhc3VzLT5jdHJsX3VyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCA9IDE7CiAKQEAgLTQ3Niw3ICs0NzcsNyBAQAogCiAJZm9yIChpID0gMDsgaSA8IDM7IGkrKykgewogCQlyZWFkX2Vwcm9tX3dvcmQocGVnYXN1cywgaSwgJncxNik7Ci0JCSgoX19sZTE2ICopIGlkKVtpXSA9IGNwdV90b19sZTE2cCgmdzE2KTsKKwkJKChfX2xlMTYgKikgaWQpW2ldID0gY3B1X3RvX2xlMTYodzE2KTsKIAl9CiB9CiAKQEAgLTEzNjAsMTQgKzEzNjEsMTAgQEAKIAlwZWdhc3VzLT5pbnRmID0gaW50ZjsKIAlwZWdhc3VzLT51c2IgPSBkZXY7CiAJcGVnYXN1cy0+bmV0ID0gbmV0OwotCW5ldC0+b3BlbiA9IHBlZ2FzdXNfb3BlbjsKLQluZXQtPnN0b3AgPSBwZWdhc3VzX2Nsb3NlOworCisKIAluZXQtPndhdGNoZG9nX3RpbWVvID0gUEVHQVNVU19UWF9USU1FT1VUOwotCW5ldC0+dHhfdGltZW91dCA9IHBlZ2FzdXNfdHhfdGltZW91dDsKLQluZXQtPmRvX2lvY3RsID0gcGVnYXN1c19pb2N0bDsKLQluZXQtPmhhcmRfc3RhcnRfeG1pdCA9IHBlZ2FzdXNfc3RhcnRfeG1pdDsKLQluZXQtPnNldF9tdWx0aWNhc3RfbGlzdCA9IHBlZ2FzdXNfc2V0X211bHRpY2FzdDsKLQluZXQtPmdldF9zdGF0cyA9IHBlZ2FzdXNfbmV0ZGV2X3N0YXRzOworCW5ldC0+bmV0ZGV2X29wcyA9ICZwZWdhc3VzX25ldGRldl9vcHM7CiAJU0VUX0VUSFRPT0xfT1BTKG5ldCwgJm9wcyk7CiAJcGVnYXN1cy0+bWlpLmRldiA9IG5ldDsKIAlwZWdhc3VzLT5taWkubWRpb19yZWFkID0gbWRpb19yZWFkOwpAQCAtMTQ4Miw2ICsxNDc5LDE2IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgcGVnYXN1c19uZXRkZXZfb3BzID0geworCS5uZG9fb3BlbiA9CQkJcGVnYXN1c19vcGVuLAorCS5uZG9fc3RvcCA9CQkJcGVnYXN1c19jbG9zZSwKKwkubmRvX2RvX2lvY3RsID0JCQlwZWdhc3VzX2lvY3RsLAorCS5uZG9fc3RhcnRfeG1pdCA9CQlwZWdhc3VzX3N0YXJ0X3htaXQsCisJLm5kb19zZXRfbXVsdGljYXN0X2xpc3QgPQlwZWdhc3VzX3NldF9tdWx0aWNhc3QsCisJLm5kb19nZXRfc3RhdHMgPQkJcGVnYXN1c19uZXRkZXZfc3RhdHMsCisJLm5kb190eF90aW1lb3V0ID0JCXBlZ2FzdXNfdHhfdGltZW91dCwKK307CisKIHN0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciBwZWdhc3VzX2RyaXZlciA9IHsKIAkubmFtZSA9IGRyaXZlcl9uYW1lLAogCS5wcm9iZSA9IHBlZ2FzdXNfcHJvYmUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC92aWEtcmhpbmUuYyBiL2RyaXZlcnMvbmV0L3ZpYS1yaGluZS5jCmluZGV4IGFjMDdjYzYuLjNiOGU2MzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3ZpYS1yaGluZS5jCisrKyBiL2RyaXZlcnMvbmV0L3ZpYS1yaGluZS5jCkBAIC02MjIsNiArNjIyLDcgQEAKIAkubmRvX2dldF9zdGF0cwkJID0gcmhpbmVfZ2V0X3N0YXRzLAogCS5uZG9fc2V0X211bHRpY2FzdF9saXN0CSA9IHJoaW5lX3NldF9yeF9tb2RlLAogCS5uZG9fdmFsaWRhdGVfYWRkcgkgPSBldGhfdmFsaWRhdGVfYWRkciwKKwkubmRvX3NldF9tYWNfYWRkcmVzcyAJID0gZXRoX21hY19hZGRyLAogCS5uZG9fZG9faW9jdGwJCSA9IG5ldGRldl9pb2N0bCwKIAkubmRvX3R4X3RpbWVvdXQgCSA9IHJoaW5lX3R4X3RpbWVvdXQsCiAjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3ZpYS12ZWxvY2l0eS5jIGIvZHJpdmVycy9uZXQvdmlhLXZlbG9jaXR5LmMKaW5kZXggNThlMjVkMC4uYTc1ZjkxZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdmlhLXZlbG9jaXR5LmMKKysrIGIvZHJpdmVycy9uZXQvdmlhLXZlbG9jaXR5LmMKQEAgLTg1NSw2ICs4NTUsNyBAQAogCS5uZG9fc3RhcnRfeG1pdAkJPSB2ZWxvY2l0eV94bWl0LAogCS5uZG9fZ2V0X3N0YXRzCQk9IHZlbG9jaXR5X2dldF9zdGF0cywKIAkubmRvX3ZhbGlkYXRlX2FkZHIJPSBldGhfdmFsaWRhdGVfYWRkciwKKwkubmRvX3NldF9tYWNfYWRkcmVzcyAJPSBldGhfbWFjX2FkZHIsCiAJLm5kb19zZXRfbXVsdGljYXN0X2xpc3QJPSB2ZWxvY2l0eV9zZXRfbXVsdGksCiAJLm5kb19jaGFuZ2VfbXR1CQk9IHZlbG9jaXR5X2NoYW5nZV9tdHUsCiAJLm5kb19kb19pb2N0bAkJPSB2ZWxvY2l0eV9pb2N0bCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3ZpcnRpb19uZXQuYyBiL2RyaXZlcnMvbmV0L3ZpcnRpb19uZXQuYwppbmRleCBiNzAwNGZmLi40M2Y2NTIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC92aXJ0aW9fbmV0LmMKKysrIGIvZHJpdmVycy9uZXQvdmlydGlvX25ldC5jCkBAIC02MjQsNiArNjI0LDE4IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgdmlydG5ldF9uZXRkZXYgPSB7CisJLm5kb19vcGVuICAgICAgICAgICAgPSB2aXJ0bmV0X29wZW4sCisJLm5kb19zdG9wICAgCSAgICAgPSB2aXJ0bmV0X2Nsb3NlLAorCS5uZG9fc3RhcnRfeG1pdCAgICAgID0gc3RhcnRfeG1pdCwKKwkubmRvX3ZhbGlkYXRlX2FkZHIgICA9IGV0aF92YWxpZGF0ZV9hZGRyLAorCS5uZG9fc2V0X21hY19hZGRyZXNzID0gZXRoX21hY19hZGRyLAorCS5uZG9fY2hhbmdlX210dQkgICAgID0gdmlydG5ldF9jaGFuZ2VfbXR1LAorI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCisJLm5kb19wb2xsX2NvbnRyb2xsZXIgPSB2aXJ0bmV0X25ldHBvbGwsCisjZW5kaWYKK307CisKIHN0YXRpYyBpbnQgdmlydG5ldF9wcm9iZShzdHJ1Y3QgdmlydGlvX2RldmljZSAqdmRldikKIHsKIAlpbnQgZXJyOwpAQCAtNjM2LDE0ICs2NDgsOCBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAogCS8qIFNldCB1cCBuZXR3b3JrIGRldmljZSBhcyBub3JtYWwuICovCi0JZGV2LT5vcGVuID0gdmlydG5ldF9vcGVuOwotCWRldi0+c3RvcCA9IHZpcnRuZXRfY2xvc2U7Ci0JZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSBzdGFydF94bWl0OwotCWRldi0+Y2hhbmdlX210dSA9IHZpcnRuZXRfY2hhbmdlX210dTsKKwlkZXYtPm5ldGRldl9vcHMgPSAmdmlydG5ldF9uZXRkZXY7CiAJZGV2LT5mZWF0dXJlcyA9IE5FVElGX0ZfSElHSERNQTsKLSNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgotCWRldi0+cG9sbF9jb250cm9sbGVyID0gdmlydG5ldF9uZXRwb2xsOwotI2VuZGlmCiAJU0VUX0VUSFRPT0xfT1BTKGRldiwgJnZpcnRuZXRfZXRodG9vbF9vcHMpOwogCVNFVF9ORVRERVZfREVWKGRldiwgJnZkZXYtPmRldik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dhbi9peHA0eHhfaHNzLmMgYi9kcml2ZXJzL25ldC93YW4vaXhwNHh4X2hzcy5jCmluZGV4IDJkYzI0MTYuLjBkYmQ4NWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dhbi9peHA0eHhfaHNzLmMKKysrIGIvZHJpdmVycy9uZXQvd2FuL2l4cDR4eF9oc3MuYwpAQCAtNjIyLDcgKzYyMiw3IEBACiAJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBoc3NfaGRsY19yeF9pcnFcbiIsIGRldi0+bmFtZSk7CiAjZW5kaWYKIAlxbWdyX2Rpc2FibGVfaXJxKHF1ZXVlX2lkc1twb3J0LT5pZF0ucngpOwotCW5ldGlmX3J4X3NjaGVkdWxlKGRldiwgJnBvcnQtPm5hcGkpOworCW5ldGlmX3J4X3NjaGVkdWxlKCZwb3J0LT5uYXBpKTsKIH0KIAogc3RhdGljIGludCBoc3NfaGRsY19wb2xsKHN0cnVjdCBuYXBpX3N0cnVjdCAqbmFwaSwgaW50IGJ1ZGdldCkKQEAgLTY1MSw3ICs2NTEsNyBAQAogCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBoc3NfaGRsY19wb2xsIgogCQkJICAgICAgICIgbmV0aWZfcnhfY29tcGxldGVcbiIsIGRldi0+bmFtZSk7CiAjZW5kaWYKLQkJCW5ldGlmX3J4X2NvbXBsZXRlKGRldiwgbmFwaSk7CisJCQluZXRpZl9yeF9jb21wbGV0ZShuYXBpKTsKIAkJCXFtZ3JfZW5hYmxlX2lycShyeHEpOwogCQkJaWYgKCFxbWdyX3N0YXRfZW1wdHkocnhxKSAmJgogCQkJICAgIG5ldGlmX3J4X3Jlc2NoZWR1bGUobmFwaSkpIHsKQEAgLTEwNjksNyArMTA2OSw3IEBACiAJaHNzX3N0YXJ0X2hkbGMocG9ydCk7CiAKIAkvKiB3ZSBtYXkgYWxyZWFkeSBoYXZlIFJYIGRhdGEsIGVuYWJsZXMgSVJRICovCi0JbmV0aWZfcnhfc2NoZWR1bGUoZGV2LCAmcG9ydC0+bmFwaSk7CisJbmV0aWZfcnhfc2NoZWR1bGUoJnBvcnQtPm5hcGkpOwogCXJldHVybiAwOwogCiBlcnJfdW5sb2NrOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2QuYyBiL2RyaXZlcnMvbmV0L3dkLmMKaW5kZXggM2MxZWRkYS4uZDgzMjJkMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2QuYworKysgYi9kcml2ZXJzL25ldC93ZC5jCkBAIC0xNTUsNiArMTU1LDcgQEAKIAkubmRvX2dldF9zdGF0cwkJPSBlaV9nZXRfc3RhdHMsCiAJLm5kb19zZXRfbXVsdGljYXN0X2xpc3QgPSBlaV9zZXRfbXVsdGljYXN0X2xpc3QsCiAJLm5kb192YWxpZGF0ZV9hZGRyCT0gZXRoX3ZhbGlkYXRlX2FkZHIsCisJLm5kb19zZXRfbWFjX2FkZHJlc3MgCT0gZXRoX21hY19hZGRyLAogCS5uZG9fY2hhbmdlX210dQkJPSBldGhfY2hhbmdlX210dSwKICNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgogCS5uZG9fcG9sbF9jb250cm9sbGVyIAk9IGVpX3BvbGwsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aW1heC9LY29uZmlnIGIvZHJpdmVycy9uZXQvd2ltYXgvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjUwMThlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2ltYXgvS2NvbmZpZwpAQCAtMCwwICsxLDE3IEBACisjCisjIFdpTUFYIExBTiBkZXZpY2UgZHJpdmVycyBjb25maWd1cmF0aW9uCisjCisKKworY29tbWVudCAiRW5hYmxlIFdpTUFYIChOZXR3b3JraW5nIG9wdGlvbnMpIHRvIHNlZSB0aGUgV2lNQVggZHJpdmVycyIKKwlkZXBlbmRzIG9uIFdJTUFYID0gbgorCitpZiBXSU1BWAorCittZW51ICJXaU1BWCBXaXJlbGVzcyBCcm9hZGJhbmQgZGV2aWNlcyIKKworc291cmNlICJkcml2ZXJzL25ldC93aW1heC9pMjQwMG0vS2NvbmZpZyIKKworZW5kbWVudQorCitlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2ltYXgvTWFrZWZpbGUgYi9kcml2ZXJzL25ldC93aW1heC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTJiYzAyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2ltYXgvTWFrZWZpbGUKQEAgLTAsMCArMSw1IEBACisKK29iai0kKENPTkZJR19XSU1BWF9JMjQwME0pCSs9IGkyNDAwbS8KKworIyAoZnJvbSBTYW0gUmF2bmJvcmcpIGZvcmNlIGtidWlsZCB0byBjcmVhdGUgYnVpbHQtaW4ubworb2JqLSA6PSBkdW1teS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aW1heC9pMjQwMG0vS2NvbmZpZyBiL2RyaXZlcnMvbmV0L3dpbWF4L2kyNDAwbS9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2MjNiM2QKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aW1heC9pMjQwMG0vS2NvbmZpZwpAQCAtMCwwICsxLDQ5IEBACisKK2NvbmZpZyBXSU1BWF9JMjQwME0KKwl0cmlzdGF0ZQorCWRlcGVuZHMgb24gV0lNQVgKKwlzZWxlY3QgRldfTE9BREVSCisKK2NvbW1lbnQgIkVuYWJsZSBVU0Igc3VwcG9ydCB0byBzZWUgV2lNQVggVVNCIGRyaXZlcnMiCisJZGVwZW5kcyBvbiBVU0IgPSBuCisKK2NvbW1lbnQgIkVuYWJsZSBNTUMgc3VwcG9ydCB0byBzZWUgV2lNQVggU0RJTyBkcml2ZXJzIgorCWRlcGVuZHMgb24gTU1DID0gbgorCitjb25maWcgV0lNQVhfSTI0MDBNX1VTQgorCXRyaXN0YXRlICJJbnRlbCBXaXJlbGVzcyBXaU1BWCBDb25uZWN0aW9uIDI0MDAgb3ZlciBVU0IgKGluY2x1ZGluZyA1eDUwKSIKKwlkZXBlbmRzIG9uIFdJTUFYICYmIFVTQgorCXNlbGVjdCBXSU1BWF9JMjQwME0KKwloZWxwCisJICBTZWxlY3QgaWYgeW91IGhhdmUgYSBkZXZpY2UgYmFzZWQgb24gdGhlIEludGVsIFdpTUFYCisJICBDb25uZWN0aW9uIDI0MDAgb3ZlciBVU0IgKGxpa2UgYW55IG9mIHRoZSBJbnRlbCBXaXJlbGVzcworCSAgV2lNQVgvV2lGaSBMaW5rIDV4NTAgc2VyaWVzKS4KKworCSAgSWYgdW5zdXJlLCBpdCBpcyBzYWZlIHRvIHNlbGVjdCBNIChtb2R1bGUpLgorCitjb25maWcgV0lNQVhfSTI0MDBNX1NESU8KKwl0cmlzdGF0ZSAiSW50ZWwgV2lyZWxlc3MgV2lNQVggQ29ubmVjdGlvbiAyNDAwIG92ZXIgU0RJTyIKKwlkZXBlbmRzIG9uIFdJTUFYICYmIE1NQworCXNlbGVjdCBXSU1BWF9JMjQwME0KKwloZWxwCisJICBTZWxlY3QgaWYgeW91IGhhdmUgYSBkZXZpY2UgYmFzZWQgb24gdGhlIEludGVsIFdpTUFYCisJICBDb25uZWN0aW9uIDI0MDAgb3ZlciBTRElPLgorCisJICBJZiB1bnN1cmUsIGl0IGlzIHNhZmUgdG8gc2VsZWN0IE0gKG1vZHVsZSkuCisKK2NvbmZpZyBXSU1BWF9JMjQwME1fREVCVUdfTEVWRUwKKwlpbnQgIldpTUFYIGkyNDAwbSBkZWJ1ZyBsZXZlbCIKKwlkZXBlbmRzIG9uIFdJTUFYX0kyNDAwTQorCWRlZmF1bHQgOAorCWhlbHAKKworCSAgU2VsZWN0IHRoZSBtYXhpbXVtIGRlYnVnIHZlcmJvc2l0eSBsZXZlbCB0byBiZSBjb21waWxlZCBpbnRvCisJICB0aGUgV2lNQVggaTI0MDBtIGRyaXZlciBjb2RlLgorCisJICBCeSBkZWZhdWx0LCB0aGlzIGlzIGRpc2FibGVkIGF0IHJ1bnRpbWUgYW5kIGNhbiBiZQorCSAgc2VsZWN0aXZlbHkgZW5hYmxlZCBhdCBydW50aW1lIGZvciBkaWZmZXJlbnQgcGFydHMgb2YgdGhlCisJICBjb2RlIHVzaW5nIHRoZSBzeXNmcyBkZWJ1Zy1sZXZlbHMgZmlsZS4KKworCSAgSWYgc2V0IGF0IHplcm8sIHRoaXMgd2lsbCBjb21waWxlIG91dCBhbGwgdGhlIGRlYnVnIGNvZGUuCisKKwkgIEl0IGlzIHJlY29tbWVuZGVkIHRoYXQgaXQgaXMgbGVmdCBhdCA4LgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2ltYXgvaTI0MDBtL01ha2VmaWxlIGIvZHJpdmVycy9uZXQvd2ltYXgvaTI0MDBtL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2OTZlOTMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aW1heC9pMjQwMG0vTWFrZWZpbGUKQEAgLTAsMCArMSwyOSBAQAorCitvYmotJChDT05GSUdfV0lNQVhfSTI0MDBNKSArPSBpMjQwMG0ubworb2JqLSQoQ09ORklHX1dJTUFYX0kyNDAwTV9VU0IpICs9IGkyNDAwbS11c2Iubworb2JqLSQoQ09ORklHX1dJTUFYX0kyNDAwTV9TRElPKSArPSBpMjQwMG0tc2Rpby5vCisKK2kyNDAwbS15IDo9CQlcCisJY29udHJvbC5vCVwKKwlkcml2ZXIubwlcCisJZncubwkJXAorCW9wLXJma2lsbC5vCVwKKwluZXRkZXYubwlcCisJdHgubwkJXAorCXJ4Lm8KKworaTI0MDBtLSQoQ09ORklHX0RFQlVHX0ZTKSArPSBkZWJ1Z2ZzLm8KKworaTI0MDBtLXVzYi15IDo9CQkJXAorCXVzYi1mdy5vCQlcCisJdXNiLW5vdGlmLm8JCVwKKwl1c2ItdHgubwkJXAorCXVzYi1yeC5vCQlcCisJdXNiLm8KKworCitpMjQwMG0tc2Rpby15IDo9IAkJXAorCXNkaW8ubyAgICAgIAkJXAorCXNkaW8tdHgubyAgIAkJXAorCXNkaW8tZncubwkgCVwKKwlzZGlvLXJ4Lm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpbWF4L2kyNDAwbS9jb250cm9sLmMgYi9kcml2ZXJzL25ldC93aW1heC9pMjQwMG0vY29udHJvbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzZDM3ZmUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aW1heC9pMjQwMG0vY29udHJvbC5jCkBAIC0wLDAgKzEsMTI5MSBAQAorLyoKKyAqIEludGVsIFdpcmVsZXNzIFdpTUFYIENvbm5lY3Rpb24gMjQwMG0KKyAqIE1pc2NlbGxhbmVvdXMgY29udHJvbCBmdW5jdGlvbnMgZm9yIG1hbmFnaW5nIHRoZSBkZXZpY2UKKyAqCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgIGRpc3RyaWJ1dGlvbi4KKyAqICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEludGVsIENvcnBvcmF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICoKKyAqIEludGVsIENvcnBvcmF0aW9uIDxsaW51eC13aW1heEBpbnRlbC5jb20+CisgKiBJbmFreSBQZXJlei1Hb256YWxleiA8aW5ha3kucGVyZXotZ29uemFsZXpAaW50ZWwuY29tPgorICogIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbgorICoKKyAqIFRoaXMgaXMgYSBjb2xsZWN0aW9uIG9mIGZ1bmN0aW9ucyB1c2VkIHRvIGNvbnRyb2wgdGhlIGRldmljZSAocGx1cworICogYSBmZXcgaGVscGVycykuCisgKgorICogVGhlcmUgYXJlIHV0aWxpdGllcyBmb3IgaGFuZGxpbmcgVExWIGJ1ZmZlcnMsIGhvb2tzIG9uIHRoZSBkZXZpY2UncworICogcmVwb3J0cyB0byBhY3Qgb24gZGV2aWNlIGNoYW5nZXMgb2Ygc3RhdGUgW2kyNDAwbV9yZXBvcnRfaG9vaygpXSwKKyAqIG9uIGFja3MgdG8gY29tbWFuZHMgW2kyNDAwbV9tc2dfYWNrX2hvb2soKV0sIGEgaGVscGVyIGZvciBzZW5kaW5nCisgKiBjb21tYW5kcyB0byB0aGUgZGV2aWNlIGFuZCBibG9ja2luZyB1bnRpbCBhIHJlcGx5IGFycml2ZXMKKyAqIFtpMjQwMG1fbXNnX3RvX2RldigpXSwgYSBmZXcgaGlnaCBsZXZlbCBjb21tYW5kcyBmb3IgbWFuaXB1bGF0aW5nCisgKiB0aGUgZGV2aWNlIHN0YXRlLCBwb3dlcnN2aW5nIG1vZGUgYW5kIGNvbmZpZ3VyYXRpb24gcGx1cyB0aGUKKyAqIHJvdXRpbmVzIHRvIHNldHVwIHRoZSBkZXZpY2Ugb25jZSBjb21tdW5pY2F0aW9uIGlzIHN0YWJsaXNoZWQgd2l0aAorICogaXQgW2kyNDAwbV9kZXZfaW5pdGlhbGl6ZSgpXS4KKyAqCisgKiBST0FETUFQCisgKgorICogaTI0MDBtX2Rldl9pbml0YWxpemUoKSAgICAgICBDYWxsZWQgYnkgaTI0MDBtX2Rldl9zdGFydCgpCisgKiAgIGkyNDAwbV9zZXRfaW5pdF9jb25maWcoKQorICogICBpMjQwMG1fZmlybXdhcmVfY2hlY2soKQorICogICBpMjQwMG1fY21kX2dldF9zdGF0ZSgpCisgKiBpMjQwMG1fZGV2X3NodXRkb3duKCkgICAgICAgIENhbGxlZCBieSBpMjQwMG1fZGV2X3N0b3AoKQorICogICBpMjQwMG0tPmJ1c19yZXNldCgpCisgKgorICogaTI0MDBtX3tjbWQsZ2V0LHNldH1fKigpCisgKiAgIGkyNDAwbV9tc2dfdG9fZGV2KCkKKyAqICAgaTI0MDBtX21zZ19jaGVja19zdGF0dXMoKQorICoKKyAqIGkyNDAwbV9yZXBvcnRfaG9vaygpICAgICAgICAgQ2FsbGVkIG9uIHJlY2VwdGlvbiBvZiBhbiBldmVudAorICogICBpMjQwMG1fcmVwb3J0X3N0YXRlX2hvb2soKQorICogICAgIGkyNDAwbV90bHZfYnVmZmVyX3dhbGsoKQorICogICAgIGkyNDAwbV90bHZfbWF0Y2goKQorICogICAgIGkyNDAwbV9yZXBvcnRfdGx2X3N5c3RlbV9zdGF0ZSgpCisgKiAgICAgaTI0MDBtX3JlcG9ydF90bHZfcmZfc3dpdGNoZXNfc3RhdHVzKCkKKyAqICAgICBpMjQwMG1fcmVwb3J0X3Rsdl9tZWRpYV9zdGF0dXMoKQorICogICBpMjQwMG1fY21kX2VudGVyX3Bvd2Vyc2F2ZSgpCisgKgorICogaTI0MDBtX21zZ19hY2tfaG9vaygpICAgICAgICBDYWxsZWQgb24gcmVjZXB0aW9uIG9mIGEgcmVwbHkgdG8gYQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kLCBnZXQgb3Igc2V0CisgKi8KKworI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgImkyNDAwbS5oIgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3dpbWF4L2kyNDAwbS5oPgorCisKKyNkZWZpbmUgRF9TVUJNT0RVTEUgY29udHJvbAorI2luY2x1ZGUgImRlYnVnLWxldmVscy5oIgorCisKKy8qCisgKiBSZXR1cm4gaWYgYSBUTFYgaXMgb2YgYSBnaXZlIHR5cGUgYW5kIHNpemUKKyAqCisgKiBAdGx2X2hkcjogcG9pbnRlciB0byB0aGUgVExWCisgKiBAdGx2X3R5cGU6IHR5cGUgb2YgdGhlIFRMViB3ZSBhcmUgbG9va2luZyBmb3IKKyAqIEB0bHZfc2l6ZTogZXhwZWN0ZWQgc2l6ZSBvZiB0aGUgVExWIHdlIGFyZSBsb29raW5nIGZvciAoaWYgLTEsCisgKiAgICAgICAgICAgIGRvbid0IGNoZWNrIHRoZSBzaXplKS4gVGhpcyBpbmNsdWRlcyB0aGUgaGVhZGVyCisgKiBSZXR1cm5zOiAwIGlmIHRoZSBUTFYgbWF0Y2hlcworICogICAgICAgICAgPCAwIGlmIGl0IGRvZXNuJ3QgbWF0Y2ggYXQgYWxsCisgKiAgICAgICAgICA+IDAgdG90YWwgVExWICsgcGF5bG9hZCBzaXplLCBpZiB0aGUgdHlwZSBtYXRjaGVzLCBidXQgbm90CisgKiAgICAgICAgICAgICAgdGhlIHNpemUKKyAqLworc3RhdGljCitzc2l6ZV90IGkyNDAwbV90bHZfbWF0Y2goY29uc3Qgc3RydWN0IGkyNDAwbV90bHZfaGRyICp0bHYsCisJCSAgICAgZW51bSBpMjQwMG1fdGx2IHRsdl90eXBlLCBzc2l6ZV90IHRsdl9zaXplKQoreworCWlmIChsZTE2X3RvX2NwdSh0bHYtPnR5cGUpICE9IHRsdl90eXBlKQkvKiBOb3Qgb3VyIHR5cGU/IHNraXAgKi8KKwkJcmV0dXJuIC0xOworCWlmICh0bHZfc2l6ZSAhPSAtMQorCSAgICAmJiBsZTE2X3RvX2NwdSh0bHYtPmxlbmd0aCkgKyBzaXplb2YoKnRsdikgIT0gdGx2X3NpemUpIHsKKwkJc2l6ZV90IHNpemUgPSBsZTE2X3RvX2NwdSh0bHYtPmxlbmd0aCkgKyBzaXplb2YoKnRsdik7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIlc6IHRsdiB0eXBlIDB4JXggbWlzbWF0Y2hlZCBiZWNhdXNlIG9mICIKKwkJICAgICAgICJzaXplIChnb3QgJXp1IHZzICV6dSBleHBlY3RlZClcbiIsCisJCSAgICAgICB0bHZfdHlwZSwgc2l6ZSwgdGx2X3NpemUpOworCQlyZXR1cm4gc2l6ZTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqIEdpdmVuIGEgYnVmZmVyIG9mIFRMVnMsIGl0ZXJhdGUgb3ZlciB0aGVtCisgKgorICogQGkyNDAwbTogZGV2aWNlIGluc3RhbmNlCisgKiBAdGx2X2J1ZjogcG9pbnRlciB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBUTFYgYnVmZmVyCisgKiBAYnVmX3NpemU6IGJ1ZmZlciBzaXplIGluIGJ5dGVzCisgKiBAdGx2X3Bvczogc2VlayBwb3NpdGlvbjsgdGhpcyBpcyBhc3N1bWVkIHRvIGJlIGEgcG9pbnRlciByZXR1cm5lZAorICogICAgICAgICAgIGJ5IGkyNDAwbV90bHZfYnVmZmVyX3dhbGsoKSBbYW5kIHRodXMsIHZhbGlkYXRlZF0uIFRoZQorICogICAgICAgICAgIFRMViByZXR1cm5lZCB3aWxsIGJlIHRoZSBvbmUgZm9sbG93aW5nIHRoaXMgb25lLgorICoKKyAqIFVzYWdlOgorICoKKyAqIHRsdl9pdHIgPSBOVUxMOworICogd2hpbGUgKHRsdl9pdHIgPSBpMjQwMG1fdGx2X2J1ZmZlcl93YWxrKGkyNDAwbSwgYnVmLCBzaXplLCB0bHZfaXRyKSkgIHsKKyAqICAgICAgICAgLi4uCisgKiAgICAgICAgIC8vIERvIHN0dWZmIHdpdGggdGx2X2l0ciwgRE9OJ1QgTU9ESUZZIElUCisgKiAgICAgICAgIC4uLgorICogfQorICovCitzdGF0aWMKK2NvbnN0IHN0cnVjdCBpMjQwMG1fdGx2X2hkciAqaTI0MDBtX3Rsdl9idWZmZXJfd2FsaygKKwlzdHJ1Y3QgaTI0MDBtICppMjQwMG0sCisJY29uc3Qgdm9pZCAqdGx2X2J1Ziwgc2l6ZV90IGJ1Zl9zaXplLAorCWNvbnN0IHN0cnVjdCBpMjQwMG1fdGx2X2hkciAqdGx2X3BvcykKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBpMjQwMG1fZGV2KGkyNDAwbSk7CisJY29uc3Qgc3RydWN0IGkyNDAwbV90bHZfaGRyICp0bHZfdG9wID0gdGx2X2J1ZiArIGJ1Zl9zaXplOworCXNpemVfdCBvZmZzZXQsIGxlbmd0aCwgYXZhaWxfc2l6ZTsKKwl1bnNpZ25lZCB0eXBlOworCisJaWYgKHRsdl9wb3MgPT0gTlVMTCkJLyogVGFrZSB0aGUgZmlyc3Qgb25lPyAqLworCQl0bHZfcG9zID0gdGx2X2J1ZjsKKwllbHNlCQkJLyogTm9wZSwgdGhlIG5leHQgb25lICovCisJCXRsdl9wb3MgPSAodm9pZCAqKSB0bHZfcG9zCisJCQkrIGxlMTZfdG9fY3B1KHRsdl9wb3MtPmxlbmd0aCkgKyBzaXplb2YoKnRsdl9wb3MpOworCWlmICh0bHZfcG9zID09IHRsdl90b3ApIHsJLyogYnVmZmVyIGRvbmUgKi8KKwkJdGx2X3BvcyA9IE5VTEw7CisJCWdvdG8gZXJyb3JfYmV5b25kX2VuZDsKKwl9CisJaWYgKHRsdl9wb3MgPiB0bHZfdG9wKSB7CisJCXRsdl9wb3MgPSBOVUxMOworCQlXQVJOX09OKDEpOworCQlnb3RvIGVycm9yX2JleW9uZF9lbmQ7CisJfQorCW9mZnNldCA9ICh2b2lkICopIHRsdl9wb3MgLSAodm9pZCAqKSB0bHZfYnVmOworCWF2YWlsX3NpemUgPSBidWZfc2l6ZSAtIG9mZnNldDsKKwlpZiAoYXZhaWxfc2l6ZSA8IHNpemVvZigqdGx2X3BvcykpIHsKKwkJZGV2X2VycihkZXYsICJIVyBCVUc/IHRsdl9idWYgJXAgWyV6dSBieXRlc10sIHRsdiBAJXp1OiAiCisJCQkic2hvcnQgaGVhZGVyXG4iLCB0bHZfYnVmLCBidWZfc2l6ZSwgb2Zmc2V0KTsKKwkJZ290byBlcnJvcl9zaG9ydF9oZWFkZXI7CisJfQorCXR5cGUgPSBsZTE2X3RvX2NwdSh0bHZfcG9zLT50eXBlKTsKKwlsZW5ndGggPSBsZTE2X3RvX2NwdSh0bHZfcG9zLT5sZW5ndGgpOworCWlmIChhdmFpbF9zaXplIDwgc2l6ZW9mKCp0bHZfcG9zKSArIGxlbmd0aCkgeworCQlkZXZfZXJyKGRldiwgIkhXIEJVRz8gdGx2X2J1ZiAlcCBbJXp1IGJ5dGVzXSwgIgorCQkJInRsdiB0eXBlIDB4JTA0eCBAJXp1OiAiCisJCQkic2hvcnQgZGF0YSAoJXp1IGJ5dGVzIHZzICV6dSBuZWVkZWQpXG4iLAorCQkJdGx2X2J1ZiwgYnVmX3NpemUsIHR5cGUsIG9mZnNldCwgYXZhaWxfc2l6ZSwKKwkJCXNpemVvZigqdGx2X3BvcykgKyBsZW5ndGgpOworCQlnb3RvIGVycm9yX3Nob3J0X2hlYWRlcjsKKwl9CitlcnJvcl9zaG9ydF9oZWFkZXI6CitlcnJvcl9iZXlvbmRfZW5kOgorCXJldHVybiB0bHZfcG9zOworfQorCisKKy8qCisgKiBGaW5kIGEgVExWIGluIGEgYnVmZmVyIG9mIHNlcXVlbnRpYWwgVExWcworICoKKyAqIEBpMjQwMG06IGRldmljZSBkZXNjcmlwdG9yCisgKiBAdGx2X2hkcjogcG9pbnRlciB0byB0aGUgZmlyc3QgVExWIGluIHRoZSBzZXF1ZW5jZQorICogQHNpemU6IHNpemUgb2YgdGhlIGJ1ZmZlciBpbiBieXRlczsgYWxsIFRMVnMgYXJlIGFzc3VtZWQgdG8gZml0CisgKiAgICAgICAgZnVsbHkgaW4gdGhlIGJ1ZmZlciAob3RoZXJ3aXNlIHdlJ2xsIGNvbXBsYWluKS4KKyAqIEB0bHZfdHlwZTogdHlwZSBvZiB0aGUgVExWIHdlIGFyZSBsb29raW5nIGZvcgorICogQHRsdl9zaXplOiBleHBlY3RlZCBzaXplIG9mIHRoZSBUTFYgd2UgYXJlIGxvb2tpbmcgZm9yIChpZiAtMSwKKyAqICAgICAgICAgICAgZG9uJ3QgY2hlY2sgdGhlIHNpemUpLiBUaGlzIGluY2x1ZGVzIHRoZSBoZWFkZXIKKyAqCisgKiBSZXR1cm5zOiBOVUxMIGlmIHRoZSBUTFYgaXMgbm90IGZvdW5kLCBvdGhlcndpc2UgYSBwb2ludGVyIHRvCisgKiAgICAgICAgICBpdC4gSWYgdGhlIHNpemVzIGRvbid0IG1hdGNoLCBhbiBlcnJvciBpcyBwcmludGVkIGFuZCBOVUxMCisgKiAgICAgICAgICByZXR1cm5lZC4KKyAqLworc3RhdGljCitjb25zdCBzdHJ1Y3QgaTI0MDBtX3Rsdl9oZHIgKmkyNDAwbV90bHZfZmluZCgKKwlzdHJ1Y3QgaTI0MDBtICppMjQwMG0sCisJY29uc3Qgc3RydWN0IGkyNDAwbV90bHZfaGRyICp0bHZfaGRyLCBzaXplX3Qgc2l6ZSwKKwllbnVtIGkyNDAwbV90bHYgdGx2X3R5cGUsIHNzaXplX3QgdGx2X3NpemUpCit7CisJc3NpemVfdCBtYXRjaDsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBpMjQwMG1fZGV2KGkyNDAwbSk7CisJY29uc3Qgc3RydWN0IGkyNDAwbV90bHZfaGRyICp0bHYgPSBOVUxMOworCXdoaWxlICgodGx2ID0gaTI0MDBtX3Rsdl9idWZmZXJfd2FsayhpMjQwMG0sIHRsdl9oZHIsIHNpemUsIHRsdikpKSB7CisJCW1hdGNoID0gaTI0MDBtX3Rsdl9tYXRjaCh0bHYsIHRsdl90eXBlLCB0bHZfc2l6ZSk7CisJCWlmIChtYXRjaCA9PSAwKQkJLyogZm91bmQgaXQgOikgKi8KKwkJCWJyZWFrOworCQlpZiAobWF0Y2ggPiAwKQorCQkJZGV2X3dhcm4oZGV2LCAiVExWIHR5cGUgMHglMDR4IGZvdW5kIHdpdGggc2l6ZSAiCisJCQkJICJtaXNtYXRjaCAoJXp1IHZzICV6dSBuZWVkZWQpXG4iLAorCQkJCSB0bHZfdHlwZSwgbWF0Y2gsIHRsdl9zaXplKTsKKwl9CisJcmV0dXJuIHRsdjsKK30KKworCitzdGF0aWMgY29uc3Qgc3RydWN0Cit7CisJY2hhciAqbXNnOworCWludCBlcnJubzsKK30gbXNfdG9fZXJybm9bSTI0MDBNX01TX01BWF0gPSB7CisJW0kyNDAwTV9NU19ET05FX09LXSA9IHsgIiIsIDAgfSwKKwlbSTI0MDBNX01TX0RPTkVfSU5fUFJPR1JFU1NdID0geyAiIiwgMCB9LAorCVtJMjQwME1fTVNfSU5WQUxJRF9PUF0gPSB7ICJpbnZhbGlkIG9wY29kZSIsIC1FTk9TWVMgfSwKKwlbSTI0MDBNX01TX0JBRF9TVEFURV0gPSB7ICJpbnZhbGlkIHN0YXRlIiwgLUVJTFNFUSB9LAorCVtJMjQwME1fTVNfSUxMRUdBTF9WQUxVRV0gPSB7ICJpbGxlZ2FsIHZhbHVlIiwgLUVJTlZBTCB9LAorCVtJMjQwME1fTVNfTUlTU0lOR19QQVJBTVNdID0geyAibWlzc2luZyBwYXJhbWV0ZXJzIiwgLUVOT01TRyB9LAorCVtJMjQwME1fTVNfVkVSU0lPTl9FUlJPUl0gPSB7ICJiYWQgdmVyc2lvbiIsIC1FSU8gfSwKKwlbSTI0MDBNX01TX0FDQ0VTU0lCSUxJVFlfRVJST1JdID0geyAiYWNjZXNpYmlsaXR5IGVycm9yIiwgLUVJTyB9LAorCVtJMjQwME1fTVNfQlVTWV0gPSB7ICJidXN5IiwgLUVCVVNZIH0sCisJW0kyNDAwTV9NU19DT1JSVVBURURfVExWXSA9IHsgImNvcnJ1cHRlZCBUTFYiLCAtRUlMU0VRIH0sCisJW0kyNDAwTV9NU19VTklOSVRJQUxJWkVEXSA9IHsgIm5vdCB1bml0aWFsaXplZCIsIC1FSUxTRVEgfSwKKwlbSTI0MDBNX01TX1VOS05PV05fRVJST1JdID0geyAidW5rbm93biBlcnJvciIsIC1FSU8gfSwKKwlbSTI0MDBNX01TX1BST0RVQ1RJT05fRVJST1JdID0geyAicHJvZHVjdGlvbiBlcnJvciIsIC1FSU8gfSwKKwlbSTI0MDBNX01TX05PX1JGXSA9IHsgIm5vIFJGIiwgLUVJTyB9LAorCVtJMjQwME1fTVNfTk9UX1JFQURZX0ZPUl9QT1dFUlNBVkVdID0KKwkJeyAibm90IHJlYWR5IGZvciBwb3dlcnNhdmUiLCAtRUFDQ0VTIH0sCisJW0kyNDAwTV9NU19USEVSTUFMX0NSSVRJQ0FMXSA9IHsgInRoZXJtYWwgY3JpdGljYWwiLCAtRUwzSExUIH0sCit9OworCisKKy8qCisgKiBpMjQwMG1fbXNnX2NoZWNrX3N0YXR1cyAtIHRyYW5zbGF0ZSBhIG1lc3NhZ2UncyBzdGF0dXMgY29kZQorICoKKyAqIEBpMjQwMG06IGRldmljZSBkZXNjcmlwdG9yCisgKiBAbDNsNF9oZHI6IG1lc3NhZ2UgaGVhZGVyCisgKiBAc3RyYnVmOiBidWZmZXIgdG8gcGxhY2UgYSBmb3JtYXR0ZWQgZXJyb3IgbWVzc2FnZSAodW5sZXNzIE5VTEwpLgorICogQHN0cmJ1Zl9zaXplOiBtYXggYW1vdW50IG9mIGF2YWlsYWJsZSBzcGFjZTsgbGFyZ2VyIG1lc3NhZ2VzIHdpbGwKKyAqIGJlIHRydW5jYXRlZC4KKyAqCisgKiBSZXR1cm5zOiBlcnJubyBjb2RlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHN0YXR1cyBjb2RlIGluIEBsM2w0X2hkcgorICogICAgICAgICAgYW5kIGEgbWVzc2FnZSBpbiBAc3RyYnVmIGRlc2NyaWJpbmcgdGhlIGVycm9yLgorICovCitpbnQgaTI0MDBtX21zZ19jaGVja19zdGF0dXMoY29uc3Qgc3RydWN0IGkyNDAwbV9sM2w0X2hkciAqbDNsNF9oZHIsCisJCQkgICAgY2hhciAqc3RyYnVmLCBzaXplX3Qgc3RyYnVmX3NpemUpCit7CisJaW50IHJlc3VsdDsKKwllbnVtIGkyNDAwbV9tcyBzdGF0dXMgPSBsZTE2X3RvX2NwdShsM2w0X2hkci0+c3RhdHVzKTsKKwljb25zdCBjaGFyICpzdHI7CisKKwlpZiAoc3RhdHVzID09IDApCisJCXJldHVybiAwOworCWlmIChzdGF0dXMgPiBBUlJBWV9TSVpFKG1zX3RvX2Vycm5vKSkgeworCQlzdHIgPSAidW5rbm93biBzdGF0dXMgY29kZSI7CisJCXJlc3VsdCA9IC1FQkFEUjsKKwl9IGVsc2UgeworCQlzdHIgPSBtc190b19lcnJub1tzdGF0dXNdLm1zZzsKKwkJcmVzdWx0ID0gbXNfdG9fZXJybm9bc3RhdHVzXS5lcnJubzsKKwl9CisJaWYgKHN0cmJ1ZikKKwkJc25wcmludGYoc3RyYnVmLCBzdHJidWZfc2l6ZSwgIiVzICglZCkiLCBzdHIsIHN0YXR1cyk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworCisvKgorICogQWN0IG9uIGEgVExWIFN5c3RlbSBTdGF0ZSByZXBvcnRlZCBieSB0aGUgZGV2aWNlCisgKgorICogQGkyNDAwbTogZGV2aWNlIGRlc2NyaXB0b3IKKyAqIEBzczogdmFsaWRhdGVkIFN5c3RlbSBTdGF0ZSBUTFYKKyAqLworc3RhdGljCit2b2lkIGkyNDAwbV9yZXBvcnRfdGx2X3N5c3RlbV9zdGF0ZShzdHJ1Y3QgaTI0MDBtICppMjQwMG0sCisJCQkJICAgIGNvbnN0IHN0cnVjdCBpMjQwMG1fdGx2X3N5c3RlbV9zdGF0ZSAqc3MpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gaTI0MDBtX2RldihpMjQwMG0pOworCXN0cnVjdCB3aW1heF9kZXYgKndpbWF4X2RldiA9ICZpMjQwMG0tPndpbWF4X2RldjsKKwllbnVtIGkyNDAwbV9zeXN0ZW1fc3RhdGUgaTI0MDBtX3N0YXRlID0gbGUzMl90b19jcHUoc3MtPnN0YXRlKTsKKworCWRfZm5zdGFydCgzLCBkZXYsICIoaTI0MDBtICVwIHNzICVwIFsldV0pXG4iLCBpMjQwMG0sIHNzLCBpMjQwMG1fc3RhdGUpOworCisJaWYgKHVubGlrZWx5KGkyNDAwbS0+cmVhZHkgPT0gMCkpCS8qIGFjdCBpZiB1cCAqLworCQlnb3RvIG91dDsKKwlpZiAoaTI0MDBtLT5zdGF0ZSAhPSBpMjQwMG1fc3RhdGUpIHsKKwkJaTI0MDBtLT5zdGF0ZSA9IGkyNDAwbV9zdGF0ZTsKKwkJd2FrZV91cF9hbGwoJmkyNDAwbS0+c3RhdGVfd3EpOworCX0KKwlzd2l0Y2ggKGkyNDAwbV9zdGF0ZSkgeworCWNhc2UgSTI0MDBNX1NTX1VOSU5JVElBTElaRUQ6CisJY2FzZSBJMjQwME1fU1NfSU5JVDoKKwljYXNlIEkyNDAwTV9TU19DT05GSUc6CisJY2FzZSBJMjQwME1fU1NfUFJPRFVDVElPTjoKKwkJd2ltYXhfc3RhdGVfY2hhbmdlKHdpbWF4X2RldiwgV0lNQVhfU1RfVU5JTklUSUFMSVpFRCk7CisJCWJyZWFrOworCisJY2FzZSBJMjQwME1fU1NfUkZfT0ZGOgorCWNhc2UgSTI0MDBNX1NTX1JGX1NIVVRET1dOOgorCQl3aW1heF9zdGF0ZV9jaGFuZ2Uod2ltYXhfZGV2LCBXSU1BWF9TVF9SQURJT19PRkYpOworCQlicmVhazsKKworCWNhc2UgSTI0MDBNX1NTX1JFQURZOgorCWNhc2UgSTI0MDBNX1NTX1NUQU5EQlk6CisJY2FzZSBJMjQwME1fU1NfU0xFRVBBQ1RJVkU6CisJCXdpbWF4X3N0YXRlX2NoYW5nZSh3aW1heF9kZXYsIFdJTUFYX1NUX1JFQURZKTsKKwkJYnJlYWs7CisKKwljYXNlIEkyNDAwTV9TU19DT05ORUNUSU5HOgorCWNhc2UgSTI0MDBNX1NTX1dJTUFYX0NPTk5FQ1RFRDoKKwkJd2ltYXhfc3RhdGVfY2hhbmdlKHdpbWF4X2RldiwgV0lNQVhfU1RfUkVBRFkpOworCQlicmVhazsKKworCWNhc2UgSTI0MDBNX1NTX1NDQU46CisJY2FzZSBJMjQwME1fU1NfT1VUX09GX1pPTkU6CisJCXdpbWF4X3N0YXRlX2NoYW5nZSh3aW1heF9kZXYsIFdJTUFYX1NUX1NDQU5OSU5HKTsKKwkJYnJlYWs7CisKKwljYXNlIEkyNDAwTV9TU19JRExFOgorCQlkX3ByaW50ZigxLCBkZXYsICJlbnRlcmluZyBCUy1uZWdvdGlhdGVkIGlkbGUgbW9kZVxuIik7CisJY2FzZSBJMjQwME1fU1NfRElTQ09OTkVDVElORzoKKwljYXNlIEkyNDAwTV9TU19EQVRBX1BBVEhfQ09OTkVDVEVEOgorCQl3aW1heF9zdGF0ZV9jaGFuZ2Uod2ltYXhfZGV2LCBXSU1BWF9TVF9DT05ORUNURUQpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCS8qIEh1aD8ganVzdCBpbiBjYXNlLCBzaHV0IGl0IGRvd24gKi8KKwkJZGV2X2VycihkZXYsICJIVyBCVUc/IHVua25vd24gc3RhdGUgJXU6IHNodXR0aW5nIGRvd25cbiIsCisJCQlpMjQwMG1fc3RhdGUpOworCQlpMjQwMG0tPmJ1c19yZXNldChpMjQwMG0sIEkyNDAwTV9SVF9XQVJNKTsKKwkJYnJlYWs7CisJfTsKK291dDoKKwlkX2ZuZW5kKDMsIGRldiwgIihpMjQwMG0gJXAgc3MgJXAgWyV1XSkgPSB2b2lkXG4iLAorCQlpMjQwMG0sIHNzLCBpMjQwMG1fc3RhdGUpOworfQorCisKKy8qCisgKiBQYXJzZSBhbmQgYWN0IG9uIGEgVExWIE1lZGlhIFN0YXR1cyBzZW50IGJ5IHRoZSBkZXZpY2UKKyAqCisgKiBAaTI0MDBtOiBkZXZpY2UgZGVzY3JpcHRvcgorICogQG1zOiB2YWxpZGF0ZWQgTWVkaWEgU3RhdHVzIFRMVgorICoKKyAqIFRoaXMgd2lsbCBzZXQgdGhlIGNhcnJpZXIgdXAgb24gZG93biBiYXNlZCBvbiB0aGUgZGV2aWNlJ3MgbGluaworICogcmVwb3J0LiBUaGlzIGlzIGRvbmUgYXNpZGVzIG9mIHdoYXQgdGhlIFdpTUFYIHN0YWNrIGRvZXMgYmFzZWQgb24KKyAqIHRoZSBkZXZpY2UncyBzdGF0ZSBhcyBzb21ldGltZXMgd2UgbmVlZCB0byBkbyBhIGxpbmstcmVuZXcgKHRoZSBCUworICogd2FudHMgdXMgdG8gcmVuZXcgYSBESENQIGxlYXNlLCBmb3IgZXhhbXBsZSkuCisgKgorICogSW4gZmFjdCwgZG9jIHNheXMgdGhhdCBldmVyeXRpbWUgd2UgZ2V0IGEgbGluay11cCwgd2Ugc2hvdWxkIGRvIGEKKyAqIERIQ1AgbmVnb3RpYXRpb24uLi4KKyAqLworc3RhdGljCit2b2lkIGkyNDAwbV9yZXBvcnRfdGx2X21lZGlhX3N0YXR1cyhzdHJ1Y3QgaTI0MDBtICppMjQwMG0sCisJCQkJICAgIGNvbnN0IHN0cnVjdCBpMjQwMG1fdGx2X21lZGlhX3N0YXR1cyAqbXMpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gaTI0MDBtX2RldihpMjQwMG0pOworCXN0cnVjdCB3aW1heF9kZXYgKndpbWF4X2RldiA9ICZpMjQwMG0tPndpbWF4X2RldjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldiA9IHdpbWF4X2Rldi0+bmV0X2RldjsKKwllbnVtIGkyNDAwbV9tZWRpYV9zdGF0dXMgc3RhdHVzID0gbGUzMl90b19jcHUobXMtPm1lZGlhX3N0YXR1cyk7CisKKwlkX2Zuc3RhcnQoMywgZGV2LCAiKGkyNDAwbSAlcCBtcyAlcCBbJXVdKVxuIiwgaTI0MDBtLCBtcywgc3RhdHVzKTsKKworCWlmICh1bmxpa2VseShpMjQwMG0tPnJlYWR5ID09IDApKQkvKiBhY3QgaWYgdXAgKi8KKwkJZ290byBvdXQ7CisJc3dpdGNoIChzdGF0dXMpIHsKKwljYXNlIEkyNDAwTV9NRURJQV9TVEFUVVNfTElOS19VUDoKKwkJbmV0aWZfY2Fycmllcl9vbihuZXRfZGV2KTsKKwkJYnJlYWs7CisJY2FzZSBJMjQwME1fTUVESUFfU1RBVFVTX0xJTktfRE9XTjoKKwkJbmV0aWZfY2Fycmllcl9vZmYobmV0X2Rldik7CisJCWJyZWFrOworCS8qCisJICogVGhpcyBpcyB0aGUgbmV0d29yayB0ZWxsaW5nIHVzIHdlIG5lZWQgdG8gcmV0cmFpbiB0aGUgREhDUAorCSAqIGxlYXNlIC0tIHNvIGZhciwgd2UgYXJlIHRydXN0aW5nIHRoZSBXaU1BWCBOZXR3b3JrIFNlcnZpY2UKKwkgKiBpbiB1c2VyIHNwYWNlIHRvIHBpY2sgdGhpcyB1cCBhbmQgcG9rZSB0aGUgREhDUCBjbGllbnQuCisJICovCisJY2FzZSBJMjQwME1fTUVESUFfU1RBVFVTX0xJTktfUkVORVc6CisJCW5ldGlmX2NhcnJpZXJfb24obmV0X2Rldik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRldl9lcnIoZGV2LCAiSFcgQlVHPyB1bmtub3duIG1lZGlhIHN0YXR1cyAldVxuIiwKKwkJCXN0YXR1cyk7CisJfTsKK291dDoKKwlkX2ZuZW5kKDMsIGRldiwgIihpMjQwMG0gJXAgbXMgJXAgWyV1XSkgPSB2b2lkXG4iLAorCQlpMjQwMG0sIG1zLCBzdGF0dXMpOworfQorCisKKy8qCisgKiBQYXJzZSBhICdzdGF0ZSByZXBvcnQnIGFuZCBleHRyYWN0IGNhcnJpZXIgb24vb2ZmIGluZm9ybWF0aW9uCisgKgorICogQGkyNDAwbTogZGV2aWNlIGRlc2NyaXB0b3IKKyAqIEBsM2w0X2hkcjogcG9pbnRlciB0byBtZXNzYWdlOyBpdCBoYXMgYmVlbiBhbHJlYWR5IHZhbGlkYXRlZCBmb3IKKyAqICAgICAgICAgICAgY29uc2lzdGVudCBzaXplLgorICogQHNpemU6IHNpemUgb2YgdGhlIG1lc3NhZ2UgKGhlYWRlciArIHBheWxvYWQpLiBUaGUgaGVhZGVyIGxlbmd0aAorICogICAgICAgIGRlY2xhcmF0aW9uIGlzIGFzc3VtZWQgdG8gYmUgY29uZ3J1ZW50IHdpdGggQHNpemUgKGFzIGluCisgKiAgICAgICAgc2l6ZW9mKCpsM2w0X2hkcikgKyBsM2w0X2hkci0+bGVuZ3RoID09IHNpemUpCisgKgorICogRXh0cmFjdCBmcm9tIHRoZSByZXBvcnQgc3RhdGUgdGhlIHN5c3RlbSBzdGF0ZSBUTFYgYW5kIGluZmVyIGZyb20KKyAqIHRoZXJlIGlmIHdlIGhhdmUgYSBjYXJyaWVyIG9yIG5vdC4gVXBkYXRlIG91ciBsb2NhbCBzdGF0ZSBhbmQgdGVsbAorICogbmV0ZGV2LgorICoKKyAqIFdoZW4gc2V0dGluZyB0aGUgY2FycmllciwgaXQncyBmaW5lIHRvIHNldCBPRkYgdHdpY2UgKGZvciBleGFtcGxlKSwKKyAqIGFzIG5ldGlmX2NhcnJpZXJfb2ZmKCkgd2lsbCBub3QgZ2VuZXJhdGUgdHdvIE9GRiBldmVudHMgKGp1c3Qgb24KKyAqIHRoZSB0cmFuc2l0aW9ucykuCisgKi8KK3N0YXRpYwordm9pZCBpMjQwMG1fcmVwb3J0X3N0YXRlX2hvb2soc3RydWN0IGkyNDAwbSAqaTI0MDBtLAorCQkJICAgICAgY29uc3Qgc3RydWN0IGkyNDAwbV9sM2w0X2hkciAqbDNsNF9oZHIsCisJCQkgICAgICBzaXplX3Qgc2l6ZSwgY29uc3QgY2hhciAqdGFnKQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGkyNDAwbV9kZXYoaTI0MDBtKTsKKwljb25zdCBzdHJ1Y3QgaTI0MDBtX3Rsdl9oZHIgKnRsdjsKKwljb25zdCBzdHJ1Y3QgaTI0MDBtX3Rsdl9zeXN0ZW1fc3RhdGUgKnNzOworCWNvbnN0IHN0cnVjdCBpMjQwMG1fdGx2X3JmX3N3aXRjaGVzX3N0YXR1cyAqcmZzczsKKwljb25zdCBzdHJ1Y3QgaTI0MDBtX3Rsdl9tZWRpYV9zdGF0dXMgKm1zOworCXNpemVfdCB0bHZfc2l6ZSA9IGxlMTZfdG9fY3B1KGwzbDRfaGRyLT5sZW5ndGgpOworCisJZF9mbnN0YXJ0KDQsIGRldiwgIihpMjQwMG0gJXAsIGwzbDRfaGRyICVwLCBzaXplICV6dSwgJXMpXG4iLAorCQkgIGkyNDAwbSwgbDNsNF9oZHIsIHNpemUsIHRhZyk7CisJdGx2ID0gTlVMTDsKKworCXdoaWxlICgodGx2ID0gaTI0MDBtX3Rsdl9idWZmZXJfd2FsayhpMjQwMG0sICZsM2w0X2hkci0+cGwsCisJCQkJCSAgICAgdGx2X3NpemUsIHRsdikpKSB7CisJCWlmICgwID09IGkyNDAwbV90bHZfbWF0Y2godGx2LCBJMjQwME1fVExWX1NZU1RFTV9TVEFURSwKKwkJCQkJICBzaXplb2YoKnNzKSkpIHsKKwkJCXNzID0gY29udGFpbmVyX29mKHRsdiwgdHlwZW9mKCpzcyksIGhkcik7CisJCQlkX3ByaW50ZigyLCBkZXYsICIlczogc3lzdGVtIHN0YXRlIFRMViAiCisJCQkJICJmb3VuZCAoMHglMDR4KSwgc3RhdGUgMHglMDh4XG4iLAorCQkJCSB0YWcsIEkyNDAwTV9UTFZfU1lTVEVNX1NUQVRFLAorCQkJCSBsZTMyX3RvX2NwdShzcy0+c3RhdGUpKTsKKwkJCWkyNDAwbV9yZXBvcnRfdGx2X3N5c3RlbV9zdGF0ZShpMjQwMG0sIHNzKTsKKwkJfQorCQlpZiAoMCA9PSBpMjQwMG1fdGx2X21hdGNoKHRsdiwgSTI0MDBNX1RMVl9SRl9TVEFUVVMsCisJCQkJCSAgc2l6ZW9mKCpyZnNzKSkpIHsKKwkJCXJmc3MgPSBjb250YWluZXJfb2YodGx2LCB0eXBlb2YoKnJmc3MpLCBoZHIpOworCQkJZF9wcmludGYoMiwgZGV2LCAiJXM6IFJGIHN0YXR1cyBUTFYgIgorCQkJCSAiZm91bmQgKDB4JTA0eCksIHN3IDB4JTAyeCBodyAweCUwMnhcbiIsCisJCQkJIHRhZywgSTI0MDBNX1RMVl9SRl9TVEFUVVMsCisJCQkJIGxlMzJfdG9fY3B1KHJmc3MtPnN3X3JmX3N3aXRjaCksCisJCQkJIGxlMzJfdG9fY3B1KHJmc3MtPmh3X3JmX3N3aXRjaCkpOworCQkJaTI0MDBtX3JlcG9ydF90bHZfcmZfc3dpdGNoZXNfc3RhdHVzKGkyNDAwbSwgcmZzcyk7CisJCX0KKwkJaWYgKDAgPT0gaTI0MDBtX3Rsdl9tYXRjaCh0bHYsIEkyNDAwTV9UTFZfTUVESUFfU1RBVFVTLAorCQkJCQkgIHNpemVvZigqbXMpKSkgeworCQkJbXMgPSBjb250YWluZXJfb2YodGx2LCB0eXBlb2YoKm1zKSwgaGRyKTsKKwkJCWRfcHJpbnRmKDIsIGRldiwgIiVzOiBNZWRpYSBTdGF0dXMgVExWOiAldVxuIiwKKwkJCQkgdGFnLCBsZTMyX3RvX2NwdShtcy0+bWVkaWFfc3RhdHVzKSk7CisJCQlpMjQwMG1fcmVwb3J0X3Rsdl9tZWRpYV9zdGF0dXMoaTI0MDBtLCBtcyk7CisJCX0KKwl9CisJZF9mbmVuZCg0LCBkZXYsICIoaTI0MDBtICVwLCBsM2w0X2hkciAlcCwgc2l6ZSAlenUsICVzKSA9IHZvaWRcbiIsCisJCWkyNDAwbSwgbDNsNF9oZHIsIHNpemUsIHRhZyk7Cit9CisKKworLyoKKyAqIGkyNDAwbV9yZXBvcnRfaG9vayAtIChtYXliZSkgYWN0IG9uIGEgcmVwb3J0CisgKgorICogQGkyNDAwbTogZGV2aWNlIGRlc2NyaXB0b3IKKyAqIEBsM2w0X2hkcjogcG9pbnRlciB0byBtZXNzYWdlOyBpdCBoYXMgYmVlbiBhbHJlYWR5IHZhbGlkYXRlZCBmb3IKKyAqICAgICAgICAgICAgY29uc2lzdGVudCBzaXplLgorICogQHNpemU6IHNpemUgb2YgdGhlIG1lc3NhZ2UgKGhlYWRlciArIHBheWxvYWQpLiBUaGUgaGVhZGVyIGxlbmd0aAorICogICAgICAgIGRlY2xhcmF0aW9uIGlzIGFzc3VtZWQgdG8gYmUgY29uZ3J1ZW50IHdpdGggQHNpemUgKGFzIGluCisgKiAgICAgICAgc2l6ZW9mKCpsM2w0X2hkcikgKyBsM2w0X2hkci0+bGVuZ3RoID09IHNpemUpCisgKgorICogRXh0cmFjdCBpbmZvcm1hdGlvbiB3ZSBtaWdodCBuZWVkIChsaWtlIGNhcnJpZW4gb24vb2ZmKSBmcm9tIGEKKyAqIGRldmljZSByZXBvcnQuCisgKi8KK3ZvaWQgaTI0MDBtX3JlcG9ydF9ob29rKHN0cnVjdCBpMjQwMG0gKmkyNDAwbSwKKwkJCWNvbnN0IHN0cnVjdCBpMjQwMG1fbDNsNF9oZHIgKmwzbDRfaGRyLCBzaXplX3Qgc2l6ZSkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBpMjQwMG1fZGV2KGkyNDAwbSk7CisJdW5zaWduZWQgbXNnX3R5cGU7CisKKwlkX2Zuc3RhcnQoMywgZGV2LCAiKGkyNDAwbSAlcCBsM2w0X2hkciAlcCBzaXplICV6dSlcbiIsCisJCSAgaTI0MDBtLCBsM2w0X2hkciwgc2l6ZSk7CisJLyogQ2hldyBvbiB0aGUgbWVzc2FnZSwgd2UgbWlnaHQgbmVlZCBzb21lIGluZm9ybWF0aW9uIGZyb20KKwkgKiBoZXJlICovCisJbXNnX3R5cGUgPSBsZTE2X3RvX2NwdShsM2w0X2hkci0+dHlwZSk7CisJc3dpdGNoIChtc2dfdHlwZSkgeworCWNhc2UgSTI0MDBNX01UX1JFUE9SVF9TVEFURToJLyogY2FycmllciBkZXRlY3Rpb24uLi4gKi8KKwkJaTI0MDBtX3JlcG9ydF9zdGF0ZV9ob29rKGkyNDAwbSwKKwkJCQkJIGwzbDRfaGRyLCBzaXplLCAiUkVQT1JUIFNUQVRFIik7CisJCWJyZWFrOworCS8qIElmIHRoZSBkZXZpY2UgaXMgcmVhZHkgZm9yIHBvd2VyIHNhdmUsIHRoZW4gYXNrIGl0IHRvIGRvCisJICogaXQuICovCisJY2FzZSBJMjQwME1fTVRfUkVQT1JUX1BPV0VSU0FWRV9SRUFEWToJLyogenp6enogKi8KKwkJaWYgKGwzbDRfaGRyLT5zdGF0dXMgPT0gY3B1X3RvX2xlMTYoSTI0MDBNX01TX0RPTkVfT0spKSB7CisJCQlkX3ByaW50ZigxLCBkZXYsICJyZWFkeSBmb3IgcG93ZXJzYXZlLCByZXF1ZXN0aW5nXG4iKTsKKwkJCWkyNDAwbV9jbWRfZW50ZXJfcG93ZXJzYXZlKGkyNDAwbSk7CisJCX0KKwkJYnJlYWs7CisJfTsKKwlkX2ZuZW5kKDMsIGRldiwgIihpMjQwMG0gJXAgbDNsNF9oZHIgJXAgc2l6ZSAlenUpID0gdm9pZFxuIiwKKwkJaTI0MDBtLCBsM2w0X2hkciwgc2l6ZSk7Cit9CisKKworLyoKKyAqIGkyNDAwbV9tc2dfYWNrX2hvb2sgLSBwcm9jZXNzIGNtZC9zZXQvZ2V0IGFjayBmb3IgaW50ZXJuYWwgc3RhdHVzCisgKgorICogQGkyNDAwbTogZGV2aWNlIGRlc2NyaXB0b3IKKyAqIEBsM2w0X2hkcjogcG9pbnRlciB0byBtZXNzYWdlOyBpdCBoYXMgYmVlbiBhbHJlYWR5IHZhbGlkYXRlZCBmb3IKKyAqICAgICAgICAgICAgY29uc2lzdGVudCBzaXplLgorICogQHNpemU6IHNpemUgb2YgdGhlIG1lc3NhZ2UKKyAqCisgKiBFeHRyYWN0IGluZm9ybWF0aW9uIHdlIG1pZ2h0IG5lZWQgZnJvbSBhY2tzIHRvIGNvbW1hbmRzIGFuZCBhY3Qgb24KKyAqIGl0LiBUaGlzIGlzIGFraW4gdG8gaTI0MDBtX3JlcG9ydF9ob29rKCkuIE5vdGUgbW9zdCBvZiB0aGlzCisgKiBwcm9jZXNzaW5nIHNob3VsZCBiZSBkb25lIGluIHRoZSBmdW5jdGlvbiB0aGF0IGNhbGxzIHRoZQorICogY29tbWFuZC4gVGhpcyBpcyBoZXJlIGZvciBzb21lIGNhc2VzIHdoZXJlIGl0IGNhbid0IGhhcHBlbi4uLgorICovCit2b2lkIGkyNDAwbV9tc2dfYWNrX2hvb2soc3RydWN0IGkyNDAwbSAqaTI0MDBtLAorCQkJIGNvbnN0IHN0cnVjdCBpMjQwMG1fbDNsNF9oZHIgKmwzbDRfaGRyLCBzaXplX3Qgc2l6ZSkKK3sKKwlpbnQgcmVzdWx0OworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGkyNDAwbV9kZXYoaTI0MDBtKTsKKwl1bnNpZ25lZCBhY2tfdHlwZSwgYWNrX3N0YXR1czsKKwljaGFyIHN0cmVyclszMl07CisKKwkvKiBDaGV3IG9uIHRoZSBtZXNzYWdlLCB3ZSBtaWdodCBuZWVkIHNvbWUgaW5mb3JtYXRpb24gZnJvbQorCSAqIGhlcmUgKi8KKwlhY2tfdHlwZSA9IGxlMTZfdG9fY3B1KGwzbDRfaGRyLT50eXBlKTsKKwlhY2tfc3RhdHVzID0gbGUxNl90b19jcHUobDNsNF9oZHItPnN0YXR1cyk7CisJc3dpdGNoIChhY2tfdHlwZSkgeworCWNhc2UgSTI0MDBNX01UX0NNRF9FTlRFUl9QT1dFUlNBVkU6CisJCS8qIFRoaXMgaXMganVzdCBsZWZ0IGhlcmUgZm9yIHRoZSBzYWtlIG9mIGV4YW1wbGUsIGFzCisJCSAqIHRoZSBwcm9jZXNzaW5nIGlzIGRvbmUgc29tZXdoZXJlIGVsc2UuICovCisJCWlmICgwKSB7CisJCQlyZXN1bHQgPSBpMjQwMG1fbXNnX2NoZWNrX3N0YXR1cygKKwkJCQlsM2w0X2hkciwgc3RyZXJyLCBzaXplb2Yoc3RyZXJyKSk7CisJCQlpZiAocmVzdWx0ID49IDApCisJCQkJZF9wcmludGYoMSwgZGV2LCAicmVhZHkgZm9yIHBvd2VyIHNhdmU6ICV6ZFxuIiwKKwkJCQkJIHNpemUpOworCQl9CisJCWJyZWFrOworCX07CisJcmV0dXJuOworfQorCisKKy8qCisgKiBpMjQwMG1fbXNnX3NpemVfY2hlY2soKSAtIHZlcmlmeSBtZXNzYWdlIHNpemUgYW5kIGhlYWRlciBhcmUgY29uZ3J1ZW50CisgKgorICogSXQgaXMgb2sgaWYgdGhlIHRvdGFsIG1lc3NhZ2Ugc2l6ZSBpcyBsYXJnZXIgdGhhbiB0aGUgZXhwZWN0ZWQKKyAqIHNpemUsIGFzIHRoZXJlIGNhbiBiZSBwYWRkaW5nLgorICovCitpbnQgaTI0MDBtX21zZ19zaXplX2NoZWNrKHN0cnVjdCBpMjQwMG0gKmkyNDAwbSwKKwkJCSAgY29uc3Qgc3RydWN0IGkyNDAwbV9sM2w0X2hkciAqbDNsNF9oZHIsCisJCQkgIHNpemVfdCBtc2dfc2l6ZSkKK3sKKwlpbnQgcmVzdWx0OworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGkyNDAwbV9kZXYoaTI0MDBtKTsKKwlzaXplX3QgZXhwZWN0ZWRfc2l6ZTsKKwlkX2Zuc3RhcnQoNCwgZGV2LCAiKGkyNDAwbSAlcCBsM2w0X2hkciAlcCBtc2dfc2l6ZSAlenUpXG4iLAorCQkgIGkyNDAwbSwgbDNsNF9oZHIsIG1zZ19zaXplKTsKKwlpZiAobXNnX3NpemUgPCBzaXplb2YoKmwzbDRfaGRyKSkgeworCQlkZXZfZXJyKGRldiwgImJhZCBzaXplIGZvciBtZXNzYWdlIGhlYWRlciAiCisJCQkiKGV4cGVjdGVkIGF0IGxlYXN0ICV6dSwgZ290ICV6dSlcbiIsCisJCQkoc2l6ZV90KSBzaXplb2YoKmwzbDRfaGRyKSwgbXNnX3NpemUpOworCQlyZXN1bHQgPSAtRUlPOworCQlnb3RvIGVycm9yX2hkcl9zaXplOworCX0KKwlleHBlY3RlZF9zaXplID0gbGUxNl90b19jcHUobDNsNF9oZHItPmxlbmd0aCkgKyBzaXplb2YoKmwzbDRfaGRyKTsKKwlpZiAobXNnX3NpemUgPCBleHBlY3RlZF9zaXplKSB7CisJCWRldl9lcnIoZGV2LCAiYmFkIHNpemUgZm9yIG1lc3NhZ2UgY29kZSAweCUwNHggKGV4cGVjdGVkICV6dSwgIgorCQkJImdvdCAlenUpXG4iLCBsZTE2X3RvX2NwdShsM2w0X2hkci0+dHlwZSksCisJCQlleHBlY3RlZF9zaXplLCBtc2dfc2l6ZSk7CisJCXJlc3VsdCA9IC1FSU87CisJfSBlbHNlCisJCXJlc3VsdCA9IDA7CitlcnJvcl9oZHJfc2l6ZToKKwlkX2ZuZW5kKDQsIGRldiwKKwkJIihpMjQwMG0gJXAgbDNsNF9oZHIgJXAgbXNnX3NpemUgJXp1KSA9ICVkXG4iLAorCQlpMjQwMG0sIGwzbDRfaGRyLCBtc2dfc2l6ZSwgcmVzdWx0KTsKKwlyZXR1cm4gcmVzdWx0OworfQorCisKKworLyoKKyAqIENhbmNlbCBhIHdhaXQgZm9yIGEgY29tbWFuZCBBQ0sKKyAqCisgKiBAaTI0MDBtOiBkZXZpY2UgZGVzY3JpcHRvcgorICogQGNvZGU6IFtuZWdhdGl2ZV0gZXJybm8gY29kZSB0byBjYW5jZWwgd2l0aCAoZG9uJ3QgdXNlCisgKiAgICAgLUVJTlBST0dSRVNTKQorICoKKyAqIElmIHRoZXJlIGlzIGFuIGFjayBhbHJlYWR5IGZpbGxlZCBvdXQsIGZyZWUgaXQuCisgKi8KK3ZvaWQgaTI0MDBtX21zZ190b19kZXZfY2FuY2VsX3dhaXQoc3RydWN0IGkyNDAwbSAqaTI0MDBtLCBpbnQgY29kZSkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqYWNrX3NrYjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmkyNDAwbS0+cnhfbG9jaywgZmxhZ3MpOworCWFja19za2IgPSBpMjQwMG0tPmFja19za2I7CisJaWYgKGFja19za2IgJiYgIUlTX0VSUihhY2tfc2tiKSkKKwkJa2ZyZWUoYWNrX3NrYik7CisJaTI0MDBtLT5hY2tfc2tiID0gRVJSX1BUUihjb2RlKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpMjQwMG0tPnJ4X2xvY2ssIGZsYWdzKTsKK30KKworCisvKioKKyAqIGkyNDAwbV9tc2dfdG9fZGV2IC0gU2VuZCBhIGNvbnRyb2wgbWVzc2FnZSB0byB0aGUgZGV2aWNlIGFuZCBnZXQgYSByZXNwb25zZQorICoKKyAqIEBpMjQwMG06IGRldmljZSBkZXNjcmlwdG9yCisgKgorICogQG1zZ19za2I6IGFuIHNrYiAgKgorICoKKyAqIEBidWY6IHBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBjb250YWluaW5nIHRoZSBtZXNzYWdlIHRvIGJlIHNlbnQ7IGl0CisgKiAgICAgICAgICAgaGFzIHRvIHN0YXJ0IHdpdGggYSAmc3RydWN0IGkyNDAwTV9sM2w0X2hkciBhbmQgdGhlbgorICogICAgICAgICAgIGZvbGxvd2VkIGJ5IHRoZSBwYXlsb2FkLiBPbmNlIHRoaXMgZnVuY3Rpb24gcmV0dXJucywgdGhlCisgKiAgICAgICAgICAgYnVmZmVyIGNhbiBiZSByZXVzZWQuCisgKgorICogQGJ1Zl9sZW46IGJ1ZmZlciBzaXplCisgKgorICogUmV0dXJuczoKKyAqCisgKiBQb2ludGVyIHRvIHNrYiBjb250YWluaW5nIHRoZSBhY2sgbWVzc2FnZS4gWW91IG5lZWQgdG8gY2hlY2sgdGhlCisgKiBwb2ludGVyIHdpdGggSVNfRVJSKCksIGFzIGl0IG1pZ2h0IGJlIGFuIGVycm9yIGNvZGUuIEVycm9yIGNvZGVzCisgKiBjb3VsZCBoYXBwZW4gYmVjYXVzZToKKyAqCisgKiAgLSB0aGUgbWVzc2FnZSB3YXNuJ3QgZm9ybWF0dGVkIGNvcnJlY3RseQorICogIC0gY291bGRuJ3Qgc2VuZCB0aGUgbWVzc2FnZQorICogIC0gZmFpbGVkIHdhaXRpbmcgZm9yIGEgcmVzcG9uc2UKKyAqICAtIHRoZSBhY2sgbWVzc2FnZSB3YXNuJ3QgZm9ybWF0dGVkIGNvcnJlY3RseQorICoKKyAqIFRoZSByZXR1cm5lZCBza2IgaGFzIGJlZW4gYWxsb2NhdGVkIHdpdGggd2ltYXhfbXNnX3RvX3VzZXJfYWxsb2MoKSwKKyAqIGl0IGNvbnRhaW5zIHRoZSByZXBvbnNlIGluIGEgbmV0bGluayBhdHRyaWJ1dGUgYW5kIGlzIHJlYWR5IHRvIGJlCisgKiBwYXNzZWQgdXAgdG8gdXNlciBzcGFjZSB3aXRoIHdpbWF4X21zZ190b191c2VyX3NlbmQoKS4gVG8gYWNjZXNzCisgKiB0aGUgcGF5bG9hZCBhbmQgaXRzIGxlbmd0aCwgdXNlIHdpbWF4X21zZ197ZGF0YSxsZW59KCkgb24gdGhlIHNrYi4KKyAqCisgKiBUaGUgc2tiIGhhcyB0byBiZSBmcmVlZCB3aXRoIGtmcmVlX3NrYigpIG9uY2UgZG9uZS4KKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGRlbGl2ZXJzIGEgbWVzc2FnZS9jb21tYW5kIHRvIHRoZSBkZXZpY2UgYW5kIHdhaXRzCisgKiBmb3IgYW4gYWNrIHRvIGJlIHJlY2VpdmVkLiBUaGUgZm9ybWF0IGlzIGRlc2NyaWJlZCBpbgorICogbGludXgvd2ltYXgvaTI0MDBtLmguIEluIHN1bW1hcnksIGEgY29tbWFuZC9nZXQvc2V0IGlzIGZvbGxvd2VkIGJ5IGFuCisgKiBhY2suCisgKgorICogVGhpcyBmdW5jdGlvbiB3aWxsIG5vdCBjaGVjayB0aGUgYWNrIHN0YXR1cywgdGhhdCdzIGxlZnQgdXAgdG8gdGhlCisgKiBjYWxsZXIuICBPbmNlIGRvbmUgd2l0aCB0aGUgYWNrIHNrYiwgaXQgaGFzIHRvIGJlIGtmcmVlX3NrYigpZWQuCisgKgorICogVGhlIGkyNDAwbSBoYW5kbGVzIG9ubHkgb25lIG1lc3NhZ2UgYXQgdGhlIHNhbWUgdGltZSwgdGh1cyB3ZSBuZWVkCisgKiB0aGUgbXV0ZXggdG8gZXhjbHVkZSBvdGhlciBwbGF5ZXJzLgorICoKKyAqIFdlIHdyaXRlIHRoZSBtZXNzYWdlIGFuZCB0aGVuIHdhaXQgZm9yIGFuIGFuc3dlciB0byBjb21lIGJhY2suIFRoZQorICogUlggcGF0aCBpbnRlcmNlcHRzIGNvbnRyb2wgbWVzc2FnZXMgYW5kIGhhbmRsZXMgdGhlbSBpbgorICogaTI0MDBtX3J4X2N0bCgpLiBSZXBvcnRzIChub3RpZmljYXRpb25zKSBhcmUgKG1heWJlKSBwcm9jZXNzZWQKKyAqIGxvY2FsbHkgYW5kIHRoZW4gZm9yd2FyZGVkIChhcyBuZWVkZWQpIHRvIHVzZXIgc3BhY2Ugb24gdGhlIFdpTUFYCisgKiBzdGFjayBtZXNzYWdlIHBpcGUuIEFja3MgYXJlIHNhdmVkIGFuZCBwYXNzZWQgYmFjayB0byB1cyB0aHJvdWdoIGFuCisgKiBza2IgaW4gaTI0MDBtLT5hY2tfc2tiIHdoaWNoIGlzIHJlYWR5IHRvIGJlIGdpdmVuIHRvIGdlbmVyaWMKKyAqIG5ldGxpbmsgaWYgbmVlZCBiZS4KKyAqLworc3RydWN0IHNrX2J1ZmYgKmkyNDAwbV9tc2dfdG9fZGV2KHN0cnVjdCBpMjQwMG0gKmkyNDAwbSwKKwkJCQkgIGNvbnN0IHZvaWQgKmJ1Ziwgc2l6ZV90IGJ1Zl9sZW4pCit7CisJaW50IHJlc3VsdDsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBpMjQwMG1fZGV2KGkyNDAwbSk7CisJY29uc3Qgc3RydWN0IGkyNDAwbV9sM2w0X2hkciAqbXNnX2wzbDRfaGRyOworCXN0cnVjdCBza19idWZmICphY2tfc2tiOworCWNvbnN0IHN0cnVjdCBpMjQwMG1fbDNsNF9oZHIgKmFja19sM2w0X2hkcjsKKwlzaXplX3QgYWNrX2xlbjsKKwlpbnQgYWNrX3RpbWVvdXQ7CisJdW5zaWduZWQgbXNnX3R5cGU7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWRfZm5zdGFydCgzLCBkZXYsICIoaTI0MDBtICVwIGJ1ZiAlcCBsZW4gJXp1KVxuIiwKKwkJICBpMjQwMG0sIGJ1ZiwgYnVmX2xlbik7CisKKwlpZiAoaTI0MDBtLT5ib290X21vZGUpCisJCXJldHVybiBFUlJfUFRSKC1FTk9ERVYpOworCisJbXNnX2wzbDRfaGRyID0gYnVmOworCS8qIENoZWNrIG1zZyAmIHBheWxvYWQgY29uc2lzdGVuY3kgKi8KKwlyZXN1bHQgPSBpMjQwMG1fbXNnX3NpemVfY2hlY2soaTI0MDBtLCBtc2dfbDNsNF9oZHIsIGJ1Zl9sZW4pOworCWlmIChyZXN1bHQgPCAwKQorCQlnb3RvIGVycm9yX2JhZF9tc2c7CisJbXNnX3R5cGUgPSBsZTE2X3RvX2NwdShtc2dfbDNsNF9oZHItPnR5cGUpOworCWRfcHJpbnRmKDEsIGRldiwgIkNNRC9HRVQvU0VUIDB4JTA0eCAlenUgYnl0ZXNcbiIsCisJCSBtc2dfdHlwZSwgYnVmX2xlbik7CisJZF9kdW1wKDIsIGRldiwgYnVmLCBidWZfbGVuKTsKKworCS8qIFNldHVwIHRoZSBjb21wbGV0aW9uLCBhY2tfc2tiICgid2UgYXJlIHdhaXRpbmciKSBhbmQgc2VuZAorCSAqIHRoZSBtZXNzYWdlIHRvIHRoZSBkZXZpY2UgKi8KKwltdXRleF9sb2NrKCZpMjQwMG0tPm1zZ19tdXRleCk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmkyNDAwbS0+cnhfbG9jaywgZmxhZ3MpOworCWkyNDAwbS0+YWNrX3NrYiA9IEVSUl9QVFIoLUVJTlBST0dSRVNTKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpMjQwMG0tPnJ4X2xvY2ssIGZsYWdzKTsKKwlpbml0X2NvbXBsZXRpb24oJmkyNDAwbS0+bXNnX2NvbXBsZXRpb24pOworCXJlc3VsdCA9IGkyNDAwbV90eChpMjQwMG0sIGJ1ZiwgYnVmX2xlbiwgSTI0MDBNX1BUX0NUUkwpOworCWlmIChyZXN1bHQgPCAwKSB7CisJCWRldl9lcnIoZGV2LCAiY2FuJ3Qgc2VuZCBtZXNzYWdlIDB4JTA0eDogJWRcbiIsCisJCQlsZTE2X3RvX2NwdShtc2dfbDNsNF9oZHItPnR5cGUpLCByZXN1bHQpOworCQlnb3RvIGVycm9yX3R4OworCX0KKworCS8qIFNvbWUgY29tbWFuZHMgdGFrZSBsb25nZXIgdG8gZXhlY3V0ZSBiZWNhdXNlIG9mIGNyeXB0byBvcHMsCisJICogc28gd2UgZ2l2ZSB0aGVtIHNvbWUgbW9yZSBsZWV3YXkgb24gdGltZW91dCAqLworCXN3aXRjaCAobXNnX3R5cGUpIHsKKwljYXNlIEkyNDAwTV9NVF9HRVRfVExTX09QRVJBVElPTl9SRVNVTFQ6CisJY2FzZSBJMjQwME1fTVRfQ01EX1NFTkRfRUFQX1JFU1BPTlNFOgorCQlhY2tfdGltZW91dCA9IDUgKiBIWjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYWNrX3RpbWVvdXQgPSBIWjsKKwl9OworCisJLyogVGhlIFJYIHBhdGggaW4gcnguYyB3aWxsIHB1dCBhbnkgcmVzcG9uc2UgZm9yIHRoaXMgbWVzc2FnZQorCSAqIGluIGkyNDAwbS0+YWNrX3NrYiBhbmQgd2FrZSB1cyB1cC4gSWYgd2UgY2FuY2VsIHRoZSB3YWl0LAorCSAqIHdlIG5lZWQgdG8gY2hhbmdlIHRoZSB2YWx1ZSBvZiBpMjQwMG0tPmFja19za2IgdG8gc29tZXRoaW5nCisJICogbm90IC1FSU5QUk9HUkVTUyBzbyBSWCBrbm93cyB0aGVyZSBpcyBubyBvbmUgd2FpdGluZy4gKi8KKwlyZXN1bHQgPSB3YWl0X2Zvcl9jb21wbGV0aW9uX2ludGVycnVwdGlibGVfdGltZW91dCgKKwkJJmkyNDAwbS0+bXNnX2NvbXBsZXRpb24sIGFja190aW1lb3V0KTsKKwlpZiAocmVzdWx0ID09IDApIHsKKwkJZGV2X2VycihkZXYsICJ0aW1lb3V0IHdhaXRpbmcgZm9yIHJlcGx5IHRvIG1lc3NhZ2UgMHglMDR4XG4iLAorCQkJbXNnX3R5cGUpOworCQlyZXN1bHQgPSAtRVRJTUVET1VUOworCQlpMjQwMG1fbXNnX3RvX2Rldl9jYW5jZWxfd2FpdChpMjQwMG0sIHJlc3VsdCk7CisJCWdvdG8gZXJyb3Jfd2FpdF9mb3JfY29tcGxldGlvbjsKKwl9IGVsc2UgaWYgKHJlc3VsdCA8IDApIHsKKwkJZGV2X2VycihkZXYsICJlcnJvciB3YWl0aW5nIGZvciByZXBseSB0byBtZXNzYWdlIDB4JTA0eDogJWRcbiIsCisJCQltc2dfdHlwZSwgcmVzdWx0KTsKKwkJaTI0MDBtX21zZ190b19kZXZfY2FuY2VsX3dhaXQoaTI0MDBtLCByZXN1bHQpOworCQlnb3RvIGVycm9yX3dhaXRfZm9yX2NvbXBsZXRpb247CisJfQorCisJLyogUHVsbCBvdXQgdGhlIGFjayBkYXRhIGZyb20gaTI0MDBtLT5hY2tfc2tiIC0tIHNlZSBpZiBpdCBpcworCSAqIGFuIGVycm9yIGFuZCBhY3QgYWNjb3JkaW5nbHkgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmaTI0MDBtLT5yeF9sb2NrLCBmbGFncyk7CisJYWNrX3NrYiA9IGkyNDAwbS0+YWNrX3NrYjsKKwlpZiAoSVNfRVJSKGFja19za2IpKQorCQlyZXN1bHQgPSBQVFJfRVJSKGFja19za2IpOworCWVsc2UKKwkJcmVzdWx0ID0gMDsKKwlpMjQwMG0tPmFja19za2IgPSBOVUxMOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmkyNDAwbS0+cnhfbG9jaywgZmxhZ3MpOworCWlmIChyZXN1bHQgPCAwKQorCQlnb3RvIGVycm9yX2Fja19zdGF0dXM7CisJYWNrX2wzbDRfaGRyID0gd2ltYXhfbXNnX2RhdGFfbGVuKGFja19za2IsICZhY2tfbGVuKTsKKworCS8qIENoZWNrIHRoZSBhY2sgYW5kIGRlbGl2ZXIgaXQgaWYgaXQgaXMgb2sgKi8KKwlyZXN1bHQgPSBpMjQwMG1fbXNnX3NpemVfY2hlY2soaTI0MDBtLCBhY2tfbDNsNF9oZHIsIGFja19sZW4pOworCWlmIChyZXN1bHQgPCAwKSB7CisJCWRldl9lcnIoZGV2LCAiSFcgQlVHPyByZXBseSB0byBtZXNzYWdlIDB4JTA0eDogJWRcbiIsCisJCQltc2dfdHlwZSwgcmVzdWx0KTsKKwkJZ290byBlcnJvcl9iYWRfYWNrX2xlbjsKKwl9CisJaWYgKG1zZ190eXBlICE9IGxlMTZfdG9fY3B1KGFja19sM2w0X2hkci0+dHlwZSkpIHsKKwkJZGV2X2VycihkZXYsICJIVyBCVUc/IGJhZCByZXBseSAweCUwNHggdG8gbWVzc2FnZSAweCUwNHhcbiIsCisJCQlsZTE2X3RvX2NwdShhY2tfbDNsNF9oZHItPnR5cGUpLCBtc2dfdHlwZSk7CisJCXJlc3VsdCA9IC1FSU87CisJCWdvdG8gZXJyb3JfYmFkX2Fja190eXBlOworCX0KKwlpMjQwMG1fbXNnX2Fja19ob29rKGkyNDAwbSwgYWNrX2wzbDRfaGRyLCBhY2tfbGVuKTsKKwltdXRleF91bmxvY2soJmkyNDAwbS0+bXNnX211dGV4KTsKKwlkX2ZuZW5kKDMsIGRldiwgIihpMjQwMG0gJXAgYnVmICVwIGxlbiAlenUpID0gJXBcbiIsCisJCWkyNDAwbSwgYnVmLCBidWZfbGVuLCBhY2tfc2tiKTsKKwlyZXR1cm4gYWNrX3NrYjsKKworZXJyb3JfYmFkX2Fja190eXBlOgorZXJyb3JfYmFkX2Fja19sZW46CisJa2ZyZWVfc2tiKGFja19za2IpOworZXJyb3JfYWNrX3N0YXR1czoKK2Vycm9yX3dhaXRfZm9yX2NvbXBsZXRpb246CitlcnJvcl90eDoKKwltdXRleF91bmxvY2soJmkyNDAwbS0+bXNnX211dGV4KTsKK2Vycm9yX2JhZF9tc2c6CisJZF9mbmVuZCgzLCBkZXYsICIoaTI0MDBtICVwIGJ1ZiAlcCBsZW4gJXp1KSA9ICVkXG4iLAorCQlpMjQwMG0sIGJ1ZiwgYnVmX2xlbiwgcmVzdWx0KTsKKwlyZXR1cm4gRVJSX1BUUihyZXN1bHQpOworfQorCisKKy8qCisgKiBEZWZpbml0aW9ucyBmb3IgdGhlIEVudGVyIFBvd2VyIFNhdmUgY29tbWFuZAorICoKKyAqIFRoZSBFbnRlciBQb3dlciBTYXZlIGNvbW1hbmQgcmVxdWVzdHMgdGhlIGRldmljZSB0byBnbyBpbnRvIHBvd2VyCisgKiBzYXZpbmcgbW9kZS4gVGhlIGRldmljZSB3aWxsIGFjayBvciBuYWsgdGhlIGNvbW1hbmQgZGVwZW5kaW5nIG9uIGl0CisgKiBiZWluZyByZWFkeSBmb3IgaXQuIElmIGl0IGFja3MsIHdlIHRlbGwgdGhlIFVTQiBzdWJzeXN0ZW0gdG8KKyAqCisgKiBBcyB3ZWxsLCB0aGUgZGV2aWNlIG1pZ2h0IHJlcXVlc3QgdG8gZ28gaW50byBwb3dlciBzYXZpbmcgbW9kZSBieQorICogc2VuZGluZyBhIHJlcG9ydCAoUkVQT1JUX1BPV0VSU0FWRV9SRUFEWSksIGluIHdoaWNoIGNhc2UsIHdlIGlzc3VlCisgKiB0aGlzIGNvbW1hbmQuIFRoZSBob29rdXBzIGluIHRoZSBSWCBjb2RlciBhbGxvdworICovCitlbnVtIHsKKwlJMjQwME1fV0FLRVVQX0VOQUJMRUQgID0gMHgwMSwKKwlJMjQwME1fV0FLRVVQX0RJU0FCTEVEID0gMHgwMiwKKwlJMjQwME1fVExWX1RZUEVfV0FLRVVQX01PREUgPSAxNDQsCit9OworCitzdHJ1Y3QgaTI0MDBtX2NtZF9lbnRlcl9wb3dlcl9zYXZlIHsKKwlzdHJ1Y3QgaTI0MDBtX2wzbDRfaGRyIGhkcjsKKwlzdHJ1Y3QgaTI0MDBtX3Rsdl9oZHIgdGx2OworCV9fbGUzMiB2YWw7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisKKy8qCisgKiBSZXF1ZXN0IGVudGVyaW5nIHBvd2VyIHNhdmUKKyAqCisgKiBUaGlzIGNvbW1hbmQgaXMgKG1haW5seSkgZXhlY3V0ZWQgd2hlbiB0aGUgZGV2aWNlIGluZGljYXRlcyB0aGF0IGl0CisgKiBpcyByZWFkeSB0byBnbyBpbnRvIHBvd2Vyc2F2ZSBtb2RlIHZpYSBhIFJFUE9SVF9QT1dFUlNBVkVfUkVBRFkuCisgKi8KK2ludCBpMjQwMG1fY21kX2VudGVyX3Bvd2Vyc2F2ZShzdHJ1Y3QgaTI0MDBtICppMjQwMG0pCit7CisJaW50IHJlc3VsdDsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBpMjQwMG1fZGV2KGkyNDAwbSk7CisJc3RydWN0IHNrX2J1ZmYgKmFja19za2I7CisJc3RydWN0IGkyNDAwbV9jbWRfZW50ZXJfcG93ZXJfc2F2ZSAqY21kOworCWNoYXIgc3RyZXJyWzMyXTsKKworCXJlc3VsdCA9IC1FTk9NRU07CisJY21kID0ga3phbGxvYyhzaXplb2YoKmNtZCksIEdGUF9LRVJORUwpOworCWlmIChjbWQgPT0gTlVMTCkKKwkJZ290byBlcnJvcl9hbGxvYzsKKwljbWQtPmhkci50eXBlID0gY3B1X3RvX2xlMTYoSTI0MDBNX01UX0NNRF9FTlRFUl9QT1dFUlNBVkUpOworCWNtZC0+aGRyLmxlbmd0aCA9IGNwdV90b19sZTE2KHNpemVvZigqY21kKSAtIHNpemVvZihjbWQtPmhkcikpOworCWNtZC0+aGRyLnZlcnNpb24gPSBjcHVfdG9fbGUxNihJMjQwME1fTDNMNF9WRVJTSU9OKTsKKwljbWQtPnRsdi50eXBlID0gY3B1X3RvX2xlMTYoSTI0MDBNX1RMVl9UWVBFX1dBS0VVUF9NT0RFKTsKKwljbWQtPnRsdi5sZW5ndGggPSBjcHVfdG9fbGUxNihzaXplb2YoY21kLT52YWwpKTsKKwljbWQtPnZhbCA9IGNwdV90b19sZTMyKEkyNDAwTV9XQUtFVVBfRU5BQkxFRCk7CisKKwlhY2tfc2tiID0gaTI0MDBtX21zZ190b19kZXYoaTI0MDBtLCBjbWQsIHNpemVvZigqY21kKSk7CisJcmVzdWx0ID0gUFRSX0VSUihhY2tfc2tiKTsKKwlpZiAoSVNfRVJSKGFja19za2IpKSB7CisJCWRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIGlzc3VlICdFbnRlciBwb3dlciBzYXZlJyBjb21tYW5kOiAlZFxuIiwKKwkJCXJlc3VsdCk7CisJCWdvdG8gZXJyb3JfbXNnX3RvX2RldjsKKwl9CisJcmVzdWx0ID0gaTI0MDBtX21zZ19jaGVja19zdGF0dXMod2ltYXhfbXNnX2RhdGEoYWNrX3NrYiksCisJCQkJCSBzdHJlcnIsIHNpemVvZihzdHJlcnIpKTsKKwlpZiAocmVzdWx0ID09IC1FQUNDRVMpCisJCWRfcHJpbnRmKDEsIGRldiwgIkNhbm5vdCBlbnRlciBwb3dlciBzYXZlIG1vZGVcbiIpOworCWVsc2UgaWYgKHJlc3VsdCA8IDApCisJCWRldl9lcnIoZGV2LCAiJ0VudGVyIHBvd2VyIHNhdmUnICgweCUwNHgpIGNvbW1hbmQgZmFpbGVkOiAiCisJCQkiJWQgLSAlc1xuIiwgSTI0MDBNX01UX0NNRF9FTlRFUl9QT1dFUlNBVkUsCisJCQlyZXN1bHQsIHN0cmVycik7CisJZWxzZQorCQlkX3ByaW50ZigxLCBkZXYsICJkZXZpY2UgcmVhZHkgdG8gcG93ZXIgc2F2ZVxuIik7CisJa2ZyZWVfc2tiKGFja19za2IpOworZXJyb3JfbXNnX3RvX2RldjoKKwlrZnJlZShjbWQpOworZXJyb3JfYWxsb2M6CisJcmV0dXJuIHJlc3VsdDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGkyNDAwbV9jbWRfZW50ZXJfcG93ZXJzYXZlKTsKKworCisvKgorICogRGVmaW5pdGlvbnMgZm9yIGdldHRpbmcgZGV2aWNlIGluZm9ybWF0aW9uCisgKi8KK2VudW0geworCUkyNDAwTV9UTFZfREVUQUlMRURfREVWSUNFX0lORk8gPSAxNDAKK307CisKKy8qKgorICogaTI0MDBtX2dldF9kZXZpY2VfaW5mbyAtIFF1ZXJ5IHRoZSBkZXZpY2UgZm9yIGRldGFpbGVkIGRldmljZSBpbmZvcm1hdGlvbgorICoKKyAqIEBpMjQwMG06IGRldmljZSBkZXNjcmlwdG9yCisgKgorICogUmV0dXJuczogYW4gc2tiIHdob3NlIHNrYi0+ZGF0YSBwb2ludHMgdG8gYSAnc3RydWN0CisgKiAgICBpMjQwMG1fdGx2X2RldGFpbGVkX2RldmljZV9pbmZvJy4gV2hlbiBkb25lLCBrZnJlZV9za2IoKSBpdC4gVGhlCisgKiAgICBza2IgaXMgKmd1YXJhbnRlZWQqIHRvIGNvbnRhaW4gdGhlIHdob2xlIFRMViBkYXRhIHN0cnVjdHVyZS4KKyAqCisgKiAgICBPbiBlcnJvciwgSVNfRVJSKHNrYikgaXMgdHJ1ZSBhbmQgRVJSX1BUUihza2IpIGlzIHRoZSBlcnJvcgorICogICAgY29kZS4KKyAqLworc3RydWN0IHNrX2J1ZmYgKmkyNDAwbV9nZXRfZGV2aWNlX2luZm8oc3RydWN0IGkyNDAwbSAqaTI0MDBtKQoreworCWludCByZXN1bHQ7CisJc3RydWN0IGRldmljZSAqZGV2ID0gaTI0MDBtX2RldihpMjQwMG0pOworCXN0cnVjdCBza19idWZmICphY2tfc2tiOworCXN0cnVjdCBpMjQwMG1fbDNsNF9oZHIgKmNtZDsKKwljb25zdCBzdHJ1Y3QgaTI0MDBtX2wzbDRfaGRyICphY2s7CisJc2l6ZV90IGFja19sZW47CisJY29uc3Qgc3RydWN0IGkyNDAwbV90bHZfaGRyICp0bHY7CisJY29uc3Qgc3RydWN0IGkyNDAwbV90bHZfZGV0YWlsZWRfZGV2aWNlX2luZm8gKmRkaTsKKwljaGFyIHN0cmVyclszMl07CisKKwlhY2tfc2tiID0gRVJSX1BUUigtRU5PTUVNKTsKKwljbWQgPSBremFsbG9jKHNpemVvZigqY21kKSwgR0ZQX0tFUk5FTCk7CisJaWYgKGNtZCA9PSBOVUxMKQorCQlnb3RvIGVycm9yX2FsbG9jOworCWNtZC0+dHlwZSA9IGNwdV90b19sZTE2KEkyNDAwTV9NVF9HRVRfREVWSUNFX0lORk8pOworCWNtZC0+bGVuZ3RoID0gMDsKKwljbWQtPnZlcnNpb24gPSBjcHVfdG9fbGUxNihJMjQwME1fTDNMNF9WRVJTSU9OKTsKKworCWFja19za2IgPSBpMjQwMG1fbXNnX3RvX2RldihpMjQwMG0sIGNtZCwgc2l6ZW9mKCpjbWQpKTsKKwlpZiAoSVNfRVJSKGFja19za2IpKSB7CisJCWRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIGlzc3VlICdnZXQgZGV2aWNlIGluZm8nIGNvbW1hbmQ6ICVsZFxuIiwKKwkJCVBUUl9FUlIoYWNrX3NrYikpOworCQlnb3RvIGVycm9yX21zZ190b19kZXY7CisJfQorCWFjayA9IHdpbWF4X21zZ19kYXRhX2xlbihhY2tfc2tiLCAmYWNrX2xlbik7CisJcmVzdWx0ID0gaTI0MDBtX21zZ19jaGVja19zdGF0dXMoYWNrLCBzdHJlcnIsIHNpemVvZihzdHJlcnIpKTsKKwlpZiAocmVzdWx0IDwgMCkgeworCQlkZXZfZXJyKGRldiwgIidnZXQgZGV2aWNlIGluZm8nICgweCUwNHgpIGNvbW1hbmQgZmFpbGVkOiAiCisJCQkiJWQgLSAlc1xuIiwgSTI0MDBNX01UX0dFVF9ERVZJQ0VfSU5GTywgcmVzdWx0LAorCQkJc3RyZXJyKTsKKwkJZ290byBlcnJvcl9jbWRfZmFpbGVkOworCX0KKwl0bHYgPSBpMjQwMG1fdGx2X2ZpbmQoaTI0MDBtLCBhY2stPnBsLCBhY2tfbGVuIC0gc2l6ZW9mKCphY2spLAorCQkJICAgICAgSTI0MDBNX1RMVl9ERVRBSUxFRF9ERVZJQ0VfSU5GTywgc2l6ZW9mKCpkZGkpKTsKKwlpZiAodGx2ID09IE5VTEwpIHsKKwkJZGV2X2VycihkZXYsICJHRVQgREVWSUNFIElORk86ICIKKwkJCSJkZXRhaWxlZCBkZXZpY2UgaW5mbyBUTFYgbm90IGZvdW5kICgweCUwNHgpXG4iLAorCQkJSTI0MDBNX1RMVl9ERVRBSUxFRF9ERVZJQ0VfSU5GTyk7CisJCXJlc3VsdCA9IC1FSU87CisJCWdvdG8gZXJyb3Jfbm9fdGx2OworCX0KKwlza2JfcHVsbChhY2tfc2tiLCAodm9pZCAqKSB0bHYgLSAodm9pZCAqKSBhY2tfc2tiLT5kYXRhKTsKK2Vycm9yX21zZ190b19kZXY6CisJa2ZyZWUoY21kKTsKK2Vycm9yX2FsbG9jOgorCXJldHVybiBhY2tfc2tiOworCitlcnJvcl9ub190bHY6CitlcnJvcl9jbWRfZmFpbGVkOgorCWtmcmVlX3NrYihhY2tfc2tiKTsKKwlrZnJlZShjbWQpOworCXJldHVybiBFUlJfUFRSKHJlc3VsdCk7Cit9CisKKworLyogRmlybXdhcmUgaW50ZXJmYWNlIHZlcnNpb25zIHdlIHN1cHBvcnQgKi8KK2VudW0geworCUkyNDAwTV9IREl2X01BSk9SID0gOSwKKwlJMjQwME1fSERJdl9NQUpPUl8yID0gOCwKKwlJMjQwME1fSERJdl9NSU5PUiA9IDEsCit9OworCisKKy8qKgorICogaTI0MDBtX2Zpcm13YXJlX2NoZWNrIC0gY2hlY2sgZmlybXdhcmUgdmVyc2lvbnMgYXJlIGNvbXBhdGlibGUgd2l0aAorICogdGhlIGRyaXZlcgorICoKKyAqIEBpMjQwMG06IGRldmljZSBkZXNjcmlwdG9yCisgKgorICogUmV0dXJuczogMCBpZiBvaywgPCAwIGVycm5vIGNvZGUgYW4gZXJyb3IgYW5kIGEgbWVzc2FnZSBpbiB0aGUKKyAqICAgIGtlcm5lbCBsb2cuCisgKgorICogTG9uZyBmdW5jdGlvbiwgYnV0IHF1aXRlIHNpbXBsZTsgZmlyc3QgY2h1bmsgbGF1bmNoZXMgdGhlIGNvbW1hbmQKKyAqIGFuZCBkb3VibGUgY2hlY2tzIHRoZSByZXBseSBmb3IgdGhlIHJpZ2h0IFRMVi4gVGhlbiB3ZSBwcm9jZXNzIHRoZQorICogVExWICh3aGVyZSB0aGUgbWVhdCBpcykuCisgKi8KK2ludCBpMjQwMG1fZmlybXdhcmVfY2hlY2soc3RydWN0IGkyNDAwbSAqaTI0MDBtKQoreworCWludCByZXN1bHQ7CisJc3RydWN0IGRldmljZSAqZGV2ID0gaTI0MDBtX2RldihpMjQwMG0pOworCXN0cnVjdCBza19idWZmICphY2tfc2tiOworCXN0cnVjdCBpMjQwMG1fbDNsNF9oZHIgKmNtZDsKKwljb25zdCBzdHJ1Y3QgaTI0MDBtX2wzbDRfaGRyICphY2s7CisJc2l6ZV90IGFja19sZW47CisJY29uc3Qgc3RydWN0IGkyNDAwbV90bHZfaGRyICp0bHY7CisJY29uc3Qgc3RydWN0IGkyNDAwbV90bHZfbDRfbWVzc2FnZV92ZXJzaW9ucyAqbDRtdjsKKwljaGFyIHN0cmVyclszMl07CisJdW5zaWduZWQgbWFqb3IsIG1pbm9yLCBicmFuY2g7CisKKwlyZXN1bHQgPSAtRU5PTUVNOworCWNtZCA9IGt6YWxsb2Moc2l6ZW9mKCpjbWQpLCBHRlBfS0VSTkVMKTsKKwlpZiAoY21kID09IE5VTEwpCisJCWdvdG8gZXJyb3JfYWxsb2M7CisJY21kLT50eXBlID0gY3B1X3RvX2xlMTYoSTI0MDBNX01UX0dFVF9MTV9WRVJTSU9OKTsKKwljbWQtPmxlbmd0aCA9IDA7CisJY21kLT52ZXJzaW9uID0gY3B1X3RvX2xlMTYoSTI0MDBNX0wzTDRfVkVSU0lPTik7CisKKwlhY2tfc2tiID0gaTI0MDBtX21zZ190b19kZXYoaTI0MDBtLCBjbWQsIHNpemVvZigqY21kKSk7CisJaWYgKElTX0VSUihhY2tfc2tiKSkgeworCQlyZXN1bHQgPSBQVFJfRVJSKGFja19za2IpOworCQlkZXZfZXJyKGRldiwgIkZhaWxlZCB0byBpc3N1ZSAnZ2V0IGxtIHZlcnNpb24nIGNvbW1hbmQ6ICUtZFxuIiwKKwkJCXJlc3VsdCk7CisJCWdvdG8gZXJyb3JfbXNnX3RvX2RldjsKKwl9CisJYWNrID0gd2ltYXhfbXNnX2RhdGFfbGVuKGFja19za2IsICZhY2tfbGVuKTsKKwlyZXN1bHQgPSBpMjQwMG1fbXNnX2NoZWNrX3N0YXR1cyhhY2ssIHN0cmVyciwgc2l6ZW9mKHN0cmVycikpOworCWlmIChyZXN1bHQgPCAwKSB7CisJCWRldl9lcnIoZGV2LCAiJ2dldCBsbSB2ZXJzaW9uJyAoMHglMDR4KSBjb21tYW5kIGZhaWxlZDogIgorCQkJIiVkIC0gJXNcbiIsIEkyNDAwTV9NVF9HRVRfTE1fVkVSU0lPTiwgcmVzdWx0LAorCQkJc3RyZXJyKTsKKwkJZ290byBlcnJvcl9jbWRfZmFpbGVkOworCX0KKwl0bHYgPSBpMjQwMG1fdGx2X2ZpbmQoaTI0MDBtLCBhY2stPnBsLCBhY2tfbGVuIC0gc2l6ZW9mKCphY2spLAorCQkJICAgICAgSTI0MDBNX1RMVl9MNF9NRVNTQUdFX1ZFUlNJT05TLCBzaXplb2YoKmw0bXYpKTsKKwlpZiAodGx2ID09IE5VTEwpIHsKKwkJZGV2X2VycihkZXYsICJnZXQgbG0gdmVyc2lvbjogVExWIG5vdCBmb3VuZCAoMHglMDR4KVxuIiwKKwkJCUkyNDAwTV9UTFZfTDRfTUVTU0FHRV9WRVJTSU9OUyk7CisJCXJlc3VsdCA9IC1FSU87CisJCWdvdG8gZXJyb3Jfbm9fdGx2OworCX0KKwlsNG12ID0gY29udGFpbmVyX29mKHRsdiwgdHlwZW9mKCpsNG12KSwgaGRyKTsKKwltYWpvciA9IGxlMTZfdG9fY3B1KGw0bXYtPm1ham9yKTsKKwltaW5vciA9IGxlMTZfdG9fY3B1KGw0bXYtPm1pbm9yKTsKKwlicmFuY2ggPSBsZTE2X3RvX2NwdShsNG12LT5icmFuY2gpOworCXJlc3VsdCA9IC1FSU5WQUw7CisJaWYgKG1ham9yICE9IEkyNDAwTV9IREl2X01BSk9SCisJICAgICYmIG1ham9yICE9IEkyNDAwTV9IREl2X01BSk9SXzIpIHsKKwkJZGV2X2VycihkZXYsICJ1bnN1cHBvcnRlZCBtYWpvciBmdyBpbnRlcmZhY2UgdmVyc2lvbiAiCisJCQkiJXUuJXUuJXVcbiIsIG1ham9yLCBtaW5vciwgYnJhbmNoKTsKKwkJZ290byBlcnJvcl9iYWRfbWFqb3I7CisJfQorCWlmIChtYWpvciA9PSBJMjQwME1fSERJdl9NQUpPUl8yKQorCQlkZXZfZXJyKGRldiwgImRlcHJlY2F0ZWQgbWFqb3IgZncgaW50ZXJmYWNlIHZlcnNpb24gIgorCQkJIiV1LiV1LiV1XG4iLCBtYWpvciwgbWlub3IsIGJyYW5jaCk7CisJcmVzdWx0ID0gMDsKKwlpZiAobWlub3IgIT0gSTI0MDBNX0hESXZfTUlOT1IpCisJCWRldl93YXJuKGRldiwgInVudGVzdGVkIG1pbm9yIGZ3IGZpcm13YXJlIHZlcnNpb24gJXUuJXUuJXVcbiIsCisJCQkgbWFqb3IsIG1pbm9yLCBicmFuY2gpOworZXJyb3JfYmFkX21ham9yOgorCWRldl9pbmZvKGRldiwgImZpcm13YXJlIGludGVyZmFjZSB2ZXJzaW9uICV1LiV1LiV1XG4iLAorCQkgbWFqb3IsIG1pbm9yLCBicmFuY2gpOworZXJyb3Jfbm9fdGx2OgorZXJyb3JfY21kX2ZhaWxlZDoKKwlrZnJlZV9za2IoYWNrX3NrYik7CitlcnJvcl9tc2dfdG9fZGV2OgorCWtmcmVlKGNtZCk7CitlcnJvcl9hbGxvYzoKKwlyZXR1cm4gcmVzdWx0OworfQorCisKKy8qCisgKiBTZW5kIGFuIERvRXhpdElkbGUgY29tbWFuZCB0byB0aGUgZGV2aWNlIHRvIGFzayBpdCB0byBnbyBvdXQgb2YKKyAqIGJhc2VzdGF0aW9uLWlkbGUgbW9kZS4KKyAqCisgKiBAaTI0MDBtOiBkZXZpY2UgZGVzY3JpcHRvcgorICoKKyAqIFRoaXMgc3RhcnRzIGEgcmVuZWdvdGlhdGlvbiB3aXRoIHRoZSBiYXNlc3RhdGlvbiB0aGF0IG1pZ2h0IGludm9sdmUKKyAqIGFub3RoZXIgY3J5cHRvIGhhbmRzaGFrZSB3aXRoIHVzZXIgc3BhY2UuCisgKgorICogUmV0dXJuczogMCBpZiBvaywgPCAwIGVycm5vIGNvZGUgb24gZXJyb3IuCisgKi8KK2ludCBpMjQwMG1fY21kX2V4aXRfaWRsZShzdHJ1Y3QgaTI0MDBtICppMjQwMG0pCit7CisJaW50IHJlc3VsdDsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBpMjQwMG1fZGV2KGkyNDAwbSk7CisJc3RydWN0IHNrX2J1ZmYgKmFja19za2I7CisJc3RydWN0IGkyNDAwbV9sM2w0X2hkciAqY21kOworCWNoYXIgc3RyZXJyWzMyXTsKKworCXJlc3VsdCA9IC1FTk9NRU07CisJY21kID0ga3phbGxvYyhzaXplb2YoKmNtZCksIEdGUF9LRVJORUwpOworCWlmIChjbWQgPT0gTlVMTCkKKwkJZ290byBlcnJvcl9hbGxvYzsKKwljbWQtPnR5cGUgPSBjcHVfdG9fbGUxNihJMjQwME1fTVRfQ01EX0VYSVRfSURMRSk7CisJY21kLT5sZW5ndGggPSAwOworCWNtZC0+dmVyc2lvbiA9IGNwdV90b19sZTE2KEkyNDAwTV9MM0w0X1ZFUlNJT04pOworCisJYWNrX3NrYiA9IGkyNDAwbV9tc2dfdG9fZGV2KGkyNDAwbSwgY21kLCBzaXplb2YoKmNtZCkpOworCXJlc3VsdCA9IFBUUl9FUlIoYWNrX3NrYik7CisJaWYgKElTX0VSUihhY2tfc2tiKSkgeworCQlkZXZfZXJyKGRldiwgIkZhaWxlZCB0byBpc3N1ZSAnZXhpdCBpZGxlJyBjb21tYW5kOiAlZFxuIiwKKwkJCXJlc3VsdCk7CisJCWdvdG8gZXJyb3JfbXNnX3RvX2RldjsKKwl9CisJcmVzdWx0ID0gaTI0MDBtX21zZ19jaGVja19zdGF0dXMod2ltYXhfbXNnX2RhdGEoYWNrX3NrYiksCisJCQkJCSBzdHJlcnIsIHNpemVvZihzdHJlcnIpKTsKKwlrZnJlZV9za2IoYWNrX3NrYik7CitlcnJvcl9tc2dfdG9fZGV2OgorCWtmcmVlKGNtZCk7CitlcnJvcl9hbGxvYzoKKwlyZXR1cm4gcmVzdWx0OworCit9CisKKworLyoKKyAqIFF1ZXJ5IHRoZSBkZXZpY2UgZm9yIGl0cyBzdGF0ZSwgdXBkYXRlIHRoZSBXaU1BWCBzdGFjaydzIGlkZWEgb2YgaXQKKyAqCisgKiBAaTI0MDBtOiBkZXZpY2UgZGVzY3JpcHRvcgorICoKKyAqIFJldHVybnM6IDAgaWYgb2ssIDwgMCBlcnJubyBjb2RlIG9uIGVycm9yLgorICoKKyAqIEV4ZWN1dGVzIGEgJ0dldCBTdGF0ZScgY29tbWFuZCBhbmQgcGFyc2VzIHRoZSByZXR1cm5lZAorICogVExWcy4KKyAqCisgKiBCZWNhdXNlIHRoaXMgaXMgYWxtb3N0IGlkZW50aWNhbCB0byBhICdSZXBvcnQgU3RhdGUnLCB3ZSB1c2UKKyAqIGkyNDAwbV9yZXBvcnRfc3RhdGVfaG9vaygpIHRvIHBhcnNlIHRoZSBhbnN3ZXIuIFRoaXMgd2lsbCBzZXQgdGhlCisgKiBjYXJyaWVyIHN0YXRlLCBhcyB3ZWxsIGFzIHRoZSBSRiBLaWxsIHN3aXRjaGVzIHN0YXRlLgorICovCitpbnQgaTI0MDBtX2NtZF9nZXRfc3RhdGUoc3RydWN0IGkyNDAwbSAqaTI0MDBtKQoreworCWludCByZXN1bHQ7CisJc3RydWN0IGRldmljZSAqZGV2ID0gaTI0MDBtX2RldihpMjQwMG0pOworCXN0cnVjdCBza19idWZmICphY2tfc2tiOworCXN0cnVjdCBpMjQwMG1fbDNsNF9oZHIgKmNtZDsKKwljb25zdCBzdHJ1Y3QgaTI0MDBtX2wzbDRfaGRyICphY2s7CisJc2l6ZV90IGFja19sZW47CisJY2hhciBzdHJlcnJbMzJdOworCisJcmVzdWx0ID0gLUVOT01FTTsKKwljbWQgPSBremFsbG9jKHNpemVvZigqY21kKSwgR0ZQX0tFUk5FTCk7CisJaWYgKGNtZCA9PSBOVUxMKQorCQlnb3RvIGVycm9yX2FsbG9jOworCWNtZC0+dHlwZSA9IGNwdV90b19sZTE2KEkyNDAwTV9NVF9HRVRfU1RBVEUpOworCWNtZC0+bGVuZ3RoID0gMDsKKwljbWQtPnZlcnNpb24gPSBjcHVfdG9fbGUxNihJMjQwME1fTDNMNF9WRVJTSU9OKTsKKworCWFja19za2IgPSBpMjQwMG1fbXNnX3RvX2RldihpMjQwMG0sIGNtZCwgc2l6ZW9mKCpjbWQpKTsKKwlpZiAoSVNfRVJSKGFja19za2IpKSB7CisJCWRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIGlzc3VlICdnZXQgc3RhdGUnIGNvbW1hbmQ6ICVsZFxuIiwKKwkJCVBUUl9FUlIoYWNrX3NrYikpOworCQlyZXN1bHQgPSBQVFJfRVJSKGFja19za2IpOworCQlnb3RvIGVycm9yX21zZ190b19kZXY7CisJfQorCWFjayA9IHdpbWF4X21zZ19kYXRhX2xlbihhY2tfc2tiLCAmYWNrX2xlbik7CisJcmVzdWx0ID0gaTI0MDBtX21zZ19jaGVja19zdGF0dXMoYWNrLCBzdHJlcnIsIHNpemVvZihzdHJlcnIpKTsKKwlpZiAocmVzdWx0IDwgMCkgeworCQlkZXZfZXJyKGRldiwgIidnZXQgc3RhdGUnICgweCUwNHgpIGNvbW1hbmQgZmFpbGVkOiAiCisJCQkiJWQgLSAlc1xuIiwgSTI0MDBNX01UX0dFVF9TVEFURSwgcmVzdWx0LCBzdHJlcnIpOworCQlnb3RvIGVycm9yX2NtZF9mYWlsZWQ7CisJfQorCWkyNDAwbV9yZXBvcnRfc3RhdGVfaG9vayhpMjQwMG0sIGFjaywgYWNrX2xlbiAtIHNpemVvZigqYWNrKSwKKwkJCQkgIkdFVCBTVEFURSIpOworCXJlc3VsdCA9IDA7CisJa2ZyZWVfc2tiKGFja19za2IpOworZXJyb3JfY21kX2ZhaWxlZDoKK2Vycm9yX21zZ190b19kZXY6CisJa2ZyZWUoY21kKTsKK2Vycm9yX2FsbG9jOgorCXJldHVybiByZXN1bHQ7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChpMjQwMG1fY21kX2dldF9zdGF0ZSk7CisKKworLyoqCisgKiBTZXQgYmFzaWMgY29uZmlndXJhdGlvbiBzZXR0aW5ncworICoKKyAqIEBpMjQwMG06IGRldmljZSBkZXNjcmlwdG9yCisgKiBAYXJnczogYXJyYXkgb2YgcG9pbnRlcnMgdG8gdGhlIFRMViBoZWFkZXJzIHRvIHNlbmQgZm9yCisgKiAgICAgY29uZmlndXJhdGlvbiAoZWFjaCBmb2xsb3dlZCBieSBpdHMgcGF5bG9hZCkuCisgKiAgICAgVExWIGhlYWRlcnMgYW5kIHBheWxvYWRzIG11c3QgYmUgcHJvcGVybHkgaW5pdGlhbGl6ZWQsIHdpdGggdGhlCisgKiAgICAgcmlnaHQgZW5kaWFuZXNzIChMRSkuCisgKiBAYXJnX3NpemU6IG51bWJlciBvZiBwb2ludGVycyBpbiB0aGUgQGFyZ3MgYXJyYXkKKyAqLworaW50IGkyNDAwbV9zZXRfaW5pdF9jb25maWcoc3RydWN0IGkyNDAwbSAqaTI0MDBtLAorCQkJICAgY29uc3Qgc3RydWN0IGkyNDAwbV90bHZfaGRyICoqYXJnLCBzaXplX3QgYXJncykKK3sKKwlpbnQgcmVzdWx0OworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGkyNDAwbV9kZXYoaTI0MDBtKTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqYWNrX3NrYjsKKwlzdHJ1Y3QgaTI0MDBtX2wzbDRfaGRyICpjbWQ7CisJY2hhciBzdHJlcnJbMzJdOworCXVuc2lnbmVkIGFyZ2MsIGFyZ3NpemUsIHRsdl9zaXplOworCWNvbnN0IHN0cnVjdCBpMjQwMG1fdGx2X2hkciAqdGx2X2hkcjsKKwl2b2lkICpidWYsICppdHI7CisKKwlkX2Zuc3RhcnQoMywgZGV2LCAiKGkyNDAwbSAlcCBhcmcgJXAgYXJncyAlenUpXG4iLCBpMjQwMG0sIGFyZywgYXJncyk7CisJcmVzdWx0ID0gMDsKKwlpZiAoYXJncyA9PSAwKQorCQlnb3RvIG5vbmU7CisJLyogQ29tcHV0ZSB0aGUgc2l6ZSBvZiBhbGwgdGhlIFRMVnMsIHNvIHdlIGNhbiBhbGxvYyBhCisJICogY29udGlndW91cyBjb21tYW5kIGJsb2NrIHRvIGNvcHkgdGhlbS4gKi8KKwlhcmdzaXplID0gMDsKKwlmb3IgKGFyZ2MgPSAwOyBhcmdjIDwgYXJnczsgYXJnYysrKSB7CisJCXRsdl9oZHIgPSBhcmdbYXJnY107CisJCWFyZ3NpemUgKz0gc2l6ZW9mKCp0bHZfaGRyKSArIGxlMTZfdG9fY3B1KHRsdl9oZHItPmxlbmd0aCk7CisJfQorCVdBUk5fT04oYXJnYyA+PSA5KTsJLyogQXMgcGVyIGh3IHNwZWMgKi8KKworCS8qIEFsbG9jIHRoZSBzcGFjZSBmb3IgdGhlIGNvbW1hbmQgYW5kIFRMVnMqLworCXJlc3VsdCA9IC1FTk9NRU07CisJYnVmID0ga3phbGxvYyhzaXplb2YoKmNtZCkgKyBhcmdzaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAoYnVmID09IE5VTEwpCisJCWdvdG8gZXJyb3JfYWxsb2M7CisJY21kID0gYnVmOworCWNtZC0+dHlwZSA9IGNwdV90b19sZTE2KEkyNDAwTV9NVF9TRVRfSU5JVF9DT05GSUcpOworCWNtZC0+bGVuZ3RoID0gY3B1X3RvX2xlMTYoYXJnc2l6ZSk7CisJY21kLT52ZXJzaW9uID0gY3B1X3RvX2xlMTYoSTI0MDBNX0wzTDRfVkVSU0lPTik7CisKKwkvKiBDb3B5IHRoZSBUTFZzICovCisJaXRyID0gYnVmICsgc2l6ZW9mKCpjbWQpOworCWZvciAoYXJnYyA9IDA7IGFyZ2MgPCBhcmdzOyBhcmdjKyspIHsKKwkJdGx2X2hkciA9IGFyZ1thcmdjXTsKKwkJdGx2X3NpemUgPSBzaXplb2YoKnRsdl9oZHIpICsgbGUxNl90b19jcHUodGx2X2hkci0+bGVuZ3RoKTsKKwkJbWVtY3B5KGl0ciwgdGx2X2hkciwgdGx2X3NpemUpOworCQlpdHIgKz0gdGx2X3NpemU7CisJfQorCisJLyogU2VuZCB0aGUgbWVzc2FnZSEgKi8KKwlhY2tfc2tiID0gaTI0MDBtX21zZ190b19kZXYoaTI0MDBtLCBidWYsIHNpemVvZigqY21kKSArIGFyZ3NpemUpOworCXJlc3VsdCA9IFBUUl9FUlIoYWNrX3NrYik7CisJaWYgKElTX0VSUihhY2tfc2tiKSkgeworCQlkZXZfZXJyKGRldiwgIkZhaWxlZCB0byBpc3N1ZSAnaW5pdCBjb25maWcnIGNvbW1hbmQ6ICVkXG4iLAorCQkJcmVzdWx0KTsKKworCQlnb3RvIGVycm9yX21zZ190b19kZXY7CisJfQorCXJlc3VsdCA9IGkyNDAwbV9tc2dfY2hlY2tfc3RhdHVzKHdpbWF4X21zZ19kYXRhKGFja19za2IpLAorCQkJCQkgc3RyZXJyLCBzaXplb2Yoc3RyZXJyKSk7CisJaWYgKHJlc3VsdCA8IDApCisJCWRldl9lcnIoZGV2LCAiJ2luaXQgY29uZmlnJyAoMHglMDR4KSBjb21tYW5kIGZhaWxlZDogJWQgLSAlc1xuIiwKKwkJCUkyNDAwTV9NVF9TRVRfSU5JVF9DT05GSUcsIHJlc3VsdCwgc3RyZXJyKTsKKwlrZnJlZV9za2IoYWNrX3NrYik7CitlcnJvcl9tc2dfdG9fZGV2OgorCWtmcmVlKGJ1Zik7CitlcnJvcl9hbGxvYzoKK25vbmU6CisJZF9mbmVuZCgzLCBkZXYsICIoaTI0MDBtICVwIGFyZyAlcCBhcmdzICV6dSkgPSAlZFxuIiwKKwkJaTI0MDBtLCBhcmcsIGFyZ3MsIHJlc3VsdCk7CisJcmV0dXJuIHJlc3VsdDsKKworfQorRVhQT1JUX1NZTUJPTF9HUEwoaTI0MDBtX3NldF9pbml0X2NvbmZpZyk7CisKKworLyoqCisgKiBpMjQwMG1fZGV2X2luaXRpYWxpemUgLSBJbml0aWFsaXplIHRoZSBkZXZpY2Ugb25jZSBjb21tdW5pY2F0aW9ucyBhcmUgcmVhZHkKKyAqCisgKiBAaTI0MDBtOiBkZXZpY2UgZGVzY3JpcHRvcgorICoKKyAqIFJldHVybnM6IDAgaWYgb2ssIDwgMCBlcnJubyBjb2RlIG9uIGVycm9yLgorICoKKyAqIENvbmZpZ3VyZXMgdGhlIGRldmljZSB0byB3b3JrIHRoZSB3YXkgd2UgbGlrZSBpdC4KKyAqCisgKiBBdCB0aGUgcG9pbnQgb2YgdGhpcyBjYWxsLCB0aGUgZGV2aWNlIGlzIHJlZ2lzdGVyZWQgd2l0aCB0aGUgV2lNQVgKKyAqIGFuZCBuZXRkZXYgc3RhY2tzLCBmaXJtd2FyZSBpcyB1cGxvYWRlZCBhbmQgd2UgY2FuIHRhbGsgdG8gdGhlCisgKiBkZXZpY2Ugbm9ybWFsbHkuCisgKi8KK2ludCBpMjQwMG1fZGV2X2luaXRpYWxpemUoc3RydWN0IGkyNDAwbSAqaTI0MDBtKQoreworCWludCByZXN1bHQ7CisJc3RydWN0IGRldmljZSAqZGV2ID0gaTI0MDBtX2RldihpMjQwMG0pOworCXN0cnVjdCBpMjQwMG1fdGx2X2NvbmZpZ19pZGxlX3BhcmFtZXRlcnMgaWRsZV9wYXJhbXM7CisJY29uc3Qgc3RydWN0IGkyNDAwbV90bHZfaGRyICphcmdzWzldOworCXVuc2lnbmVkIGFyZ2MgPSAwOworCisJZF9mbnN0YXJ0KDMsIGRldiwgIihpMjQwMG0gJXApXG4iLCBpMjQwMG0pOworCS8qIFVzZWxlc3MgZm9yIG5vdy4uLm1pZ2h0IGNoYW5nZSAqLworCWlmIChpMjQwMG1faWRsZV9tb2RlX2Rpc2FibGVkKSB7CisJCWlkbGVfcGFyYW1zLmhkci50eXBlID0KKwkJCWNwdV90b19sZTE2KEkyNDAwTV9UTFZfQ09ORklHX0lETEVfUEFSQU1FVEVSUyk7CisJCWlkbGVfcGFyYW1zLmhkci5sZW5ndGggPSBjcHVfdG9fbGUxNigKKwkJCXNpemVvZihpZGxlX3BhcmFtcykgLSBzaXplb2YoaWRsZV9wYXJhbXMuaGRyKSk7CisJCWlkbGVfcGFyYW1zLmlkbGVfdGltZW91dCA9IDA7CisJCWlkbGVfcGFyYW1zLmlkbGVfcGFnaW5nX2ludGVydmFsID0gMDsKKwkJYXJnc1thcmdjKytdID0gJmlkbGVfcGFyYW1zLmhkcjsKKwl9CisJcmVzdWx0ID0gaTI0MDBtX3NldF9pbml0X2NvbmZpZyhpMjQwMG0sIGFyZ3MsIGFyZ2MpOworCWlmIChyZXN1bHQgPCAwKQorCQlnb3RvIGVycm9yOworCXJlc3VsdCA9IGkyNDAwbV9maXJtd2FyZV9jaGVjayhpMjQwMG0pOwkvKiBmdyB2ZXJzaW9ucyBvaz8gKi8KKwlpZiAocmVzdWx0IDwgMCkKKwkJZ290byBlcnJvcjsKKwkvKgorCSAqIFVwZGF0ZSBzdGF0ZTogSGVyZSBpdCBqdXN0IGNhbGxzIGEgZ2V0IHN0YXRlOyBwYXJzaW5nIHRoZQorCSAqIHJlc3VsdCAoU3lzdGVtIFN0YXRlIFRMViBhbmQgUkYgU3RhdHVzIFRMViBbZG9uZSBpbiB0aGUgcngKKwkgKiBwYXRoIGhvb2tzXSkgd2lsbCBzZXQgdGhlIGhhcmR3YXJlIGFuZCBzb2Z0d2FyZSBSRi1LaWxsCisJICogc3RhdHVzLgorCSAqLworCXJlc3VsdCA9IGkyNDAwbV9jbWRfZ2V0X3N0YXRlKGkyNDAwbSk7CitlcnJvcjoKKwlkX2ZuZW5kKDMsIGRldiwgIihpMjQwMG0gJXApID0gJWRcbiIsIGkyNDAwbSwgcmVzdWx0KTsKKwlyZXR1cm4gcmVzdWx0OworfQorCisKKy8qKgorICogaTI0MDBtX2Rldl9zaHV0ZG93biAtIFNodXRkb3duIGEgcnVubmluZyBkZXZpY2UKKyAqCisgKiBAaTI0MDBtOiBkZXZpY2UgZGVzY3JpcHRvcgorICoKKyAqIEdyYWNlZnVsbHkgc3RvcHMgdGhlIGRldmljZSwgbW92aW5nIGl0IHRvIHRoZSBsb3dlc3QgcG93ZXIKKyAqIGNvbnN1bXB0aW9uIHN0YXRlIHBvc3NpYmxlLgorICovCit2b2lkIGkyNDAwbV9kZXZfc2h1dGRvd24oc3RydWN0IGkyNDAwbSAqaTI0MDBtKQoreworCWludCByZXN1bHQgPSAtRU5PREVWOworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGkyNDAwbV9kZXYoaTI0MDBtKTsKKworCWRfZm5zdGFydCgzLCBkZXYsICIoaTI0MDBtICVwKVxuIiwgaTI0MDBtKTsKKwlyZXN1bHQgPSBpMjQwMG0tPmJ1c19yZXNldChpMjQwMG0sIEkyNDAwTV9SVF9XQVJNKTsKKwlkX2ZuZW5kKDMsIGRldiwgIihpMjQwMG0gJXApID0gdm9pZCBbJWRdXG4iLCBpMjQwMG0sIHJlc3VsdCk7CisJcmV0dXJuOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2ltYXgvaTI0MDBtL2RlYnVnLWxldmVscy5oIGIvZHJpdmVycy9uZXQvd2ltYXgvaTI0MDBtL2RlYnVnLWxldmVscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxODNiYWEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aW1heC9pMjQwMG0vZGVidWctbGV2ZWxzLmgKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAqIEludGVsIFdpcmVsZXNzIFdpTUFYIENvbm5lY3Rpb24gMjQwMG0KKyAqIERlYnVnIGxldmVscyBjb250cm9sIGZpbGUgZm9yIHRoZSBpMjQwMG0gbW9kdWxlCisgKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEludGVsIENvcnBvcmF0aW9uIDxsaW51eC13aW1heEBpbnRlbC5jb20+CisgKiBJbmFreSBQZXJlei1Hb256YWxleiA8aW5ha3kucGVyZXotZ29uemFsZXpAaW50ZWwuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworI2lmbmRlZiBfX2RlYnVnX2xldmVsc19faF9fCisjZGVmaW5lIF9fZGVidWdfbGV2ZWxzX19oX18KKworLyogTWF4aW11bSBjb21waWxlIGFuZCBydW4gdGltZSBkZWJ1ZyBsZXZlbCBmb3IgYWxsIHN1Ym1vZHVsZXMgKi8KKyNkZWZpbmUgRF9NT0RVTEVOQU1FIGkyNDAwbQorI2RlZmluZSBEX01BU1RFUiBDT05GSUdfV0lNQVhfSTI0MDBNX0RFQlVHX0xFVkVMCisKKyNpbmNsdWRlIDxsaW51eC93aW1heC9kZWJ1Zy5oPgorCisvKiBMaXN0IG9mIGFsbCB0aGUgZW5hYmxlZCBtb2R1bGVzICovCitlbnVtIGRfbW9kdWxlIHsKKwlEX1NVQk1PRFVMRV9ERUNMQVJFKGNvbnRyb2wpLAorCURfU1VCTU9EVUxFX0RFQ0xBUkUoZHJpdmVyKSwKKwlEX1NVQk1PRFVMRV9ERUNMQVJFKGRlYnVnZnMpLAorCURfU1VCTU9EVUxFX0RFQ0xBUkUoZncpLAorCURfU1VCTU9EVUxFX0RFQ0xBUkUobmV0ZGV2KSwKKwlEX1NVQk1PRFVMRV9ERUNMQVJFKHJma2lsbCksCisJRF9TVUJNT0RVTEVfREVDTEFSRShyeCksCisJRF9TVUJNT0RVTEVfREVDTEFSRSh0eCksCit9OworCisKKyNlbmRpZiAvKiAjaWZuZGVmIF9fZGVidWdfbGV2ZWxzX19oX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpbWF4L2kyNDAwbS9kZWJ1Z2ZzLmMgYi9kcml2ZXJzL25ldC93aW1heC9pMjQwMG0vZGVidWdmcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyNjYzMjkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aW1heC9pMjQwMG0vZGVidWdmcy5jCkBAIC0wLDAgKzEsMzkyIEBACisvKgorICogSW50ZWwgV2lyZWxlc3MgV2lNQVggQ29ubmVjdGlvbiAyNDAwbQorICogRGVidWdmcyBpbnRlcmZhY2VzIHRvIG1hbmlwdWxhdGUgZHJpdmVyIGFuZCBkZXZpY2UgaW5mb3JtYXRpb24KKyAqCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IEludGVsIENvcnBvcmF0aW9uIDxsaW51eC13aW1heEBpbnRlbC5jb20+CisgKiBJbmFreSBQZXJlei1Hb256YWxleiA8aW5ha3kucGVyZXotZ29uemFsZXpAaW50ZWwuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlICJpMjQwMG0uaCIKKworCisjZGVmaW5lIERfU1VCTU9EVUxFIGRlYnVnZnMKKyNpbmNsdWRlICJkZWJ1Zy1sZXZlbHMuaCIKKworc3RhdGljCitpbnQgZGVidWdmc19uZXRkZXZfcXVldWVfc3RvcHBlZF9nZXQodm9pZCAqZGF0YSwgdTY0ICp2YWwpCit7CisJc3RydWN0IGkyNDAwbSAqaTI0MDBtID0gZGF0YTsKKwkqdmFsID0gbmV0aWZfcXVldWVfc3RvcHBlZChpMjQwMG0tPndpbWF4X2Rldi5uZXRfZGV2KTsKKwlyZXR1cm4gMDsKK30KK0RFRklORV9TSU1QTEVfQVRUUklCVVRFKGZvcHNfbmV0ZGV2X3F1ZXVlX3N0b3BwZWQsCisJCQlkZWJ1Z2ZzX25ldGRldl9xdWV1ZV9zdG9wcGVkX2dldCwKKwkJCU5VTEwsICIlbGx1XG4iKTsKKworCitzdGF0aWMKK3N0cnVjdCBkZW50cnkgKmRlYnVnZnNfY3JlYXRlX25ldGRldl9xdWV1ZV9zdG9wcGVkKAorCWNvbnN0IGNoYXIgKm5hbWUsIHN0cnVjdCBkZW50cnkgKnBhcmVudCwgc3RydWN0IGkyNDAwbSAqaTI0MDBtKQoreworCXJldHVybiBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKG5hbWUsIDA0MDAsIHBhcmVudCwgaTI0MDBtLAorCQkJCSAgICZmb3BzX25ldGRldl9xdWV1ZV9zdG9wcGVkKTsKK30KKworCisvKgorICogaW5vZGUtPmlfcHJpdmF0ZSBoYXMgdGhlIEBkYXRhIGFyZ3VtZW50IHRvIGRlYnVnZnNfY3JlYXRlX2ZpbGUoKQorICovCitzdGF0aWMKK2ludCBpMjQwMG1fc3RhdHNfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwlmaWxwLT5wcml2YXRlX2RhdGEgPSBpbm9kZS0+aV9wcml2YXRlOworCXJldHVybiAwOworfQorCisvKgorICogV2UgZG9uJ3QgYWxsb3cgcGFydGlhbCByZWFkcyBvZiB0aGlzIGZpbGUsIGFzIHRoZW4gdGhlIHJlYWRlciB3b3VsZAorICogZ2V0IHdlaXJkbHkgY29uZnVzZWQgZGF0YSBhcyBpdCBpcyB1cGRhdGVkLgorICoKKyAqIFNvIG9yIHlvdSByZWFkIGl0IGFsbCBvciBub3RoaW5nOyBpZiB5b3UgdHJ5IHRvIHJlYWQgd2l0aCBhbiBvZmZzZXQKKyAqICE9IDAsIHdlIGNvbnNpZGVyIHlvdSBhcmUgZG9uZSByZWFkaW5nLgorICovCitzdGF0aWMKK3NzaXplX3QgaTI0MDBtX3J4X3N0YXRzX3JlYWQoc3RydWN0IGZpbGUgKmZpbHAsIGNoYXIgX191c2VyICpidWZmZXIsCisJCQkgICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBpMjQwMG0gKmkyNDAwbSA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwljaGFyIGJ1ZlsxMjhdOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoKnBwb3MgIT0gMCkKKwkJcmV0dXJuIDA7CisJaWYgKGNvdW50IDwgc2l6ZW9mKGJ1ZikpCisJCXJldHVybiAtRU5PU1BDOworCXNwaW5fbG9ja19pcnFzYXZlKCZpMjQwMG0tPnJ4X2xvY2ssIGZsYWdzKTsKKwlzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiJXUgJXUgJXUgJXUgJXUgJXUgJXVcbiIsCisJCSBpMjQwMG0tPnJ4X3BsX251bSwgaTI0MDBtLT5yeF9wbF9taW4sCisJCSBpMjQwMG0tPnJ4X3BsX21heCwgaTI0MDBtLT5yeF9udW0sCisJCSBpMjQwMG0tPnJ4X3NpemVfYWNjLAorCQkgaTI0MDBtLT5yeF9zaXplX21pbiwgaTI0MDBtLT5yeF9zaXplX21heCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaTI0MDBtLT5yeF9sb2NrLCBmbGFncyk7CisJcmV0dXJuIHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKGJ1ZmZlciwgY291bnQsIHBwb3MsIGJ1Ziwgc3RybGVuKGJ1ZikpOworfQorCisKKy8qIEFueSB3cml0ZSBjbGVhcnMgdGhlIHN0YXRzICovCitzdGF0aWMKK3NzaXplX3QgaTI0MDBtX3J4X3N0YXRzX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxwLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLAorCQkJICAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IGkyNDAwbSAqaTI0MDBtID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaTI0MDBtLT5yeF9sb2NrLCBmbGFncyk7CisJaTI0MDBtLT5yeF9wbF9udW0gPSAwOworCWkyNDAwbS0+cnhfcGxfbWF4ID0gMDsKKwlpMjQwMG0tPnJ4X3BsX21pbiA9IFVJTlRfTUFYOworCWkyNDAwbS0+cnhfbnVtID0gMDsKKwlpMjQwMG0tPnJ4X3NpemVfYWNjID0gMDsKKwlpMjQwMG0tPnJ4X3NpemVfbWluID0gVUlOVF9NQVg7CisJaTI0MDBtLT5yeF9zaXplX21heCA9IDA7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaTI0MDBtLT5yeF9sb2NrLCBmbGFncyk7CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMKK2NvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgaTI0MDBtX3J4X3N0YXRzX2ZvcHMgPSB7CisJLm93bmVyID0JVEhJU19NT0RVTEUsCisJLm9wZW4gPQkJaTI0MDBtX3N0YXRzX29wZW4sCisJLnJlYWQgPQkJaTI0MDBtX3J4X3N0YXRzX3JlYWQsCisJLndyaXRlID0JaTI0MDBtX3J4X3N0YXRzX3dyaXRlLAorfTsKKworCisvKiBTZWUgaTI0MDBtX3J4X3N0YXRzX3JlYWQoKSAqLworc3RhdGljCitzc2l6ZV90IGkyNDAwbV90eF9zdGF0c19yZWFkKHN0cnVjdCBmaWxlICpmaWxwLCBjaGFyIF9fdXNlciAqYnVmZmVyLAorCQkJICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgaTI0MDBtICppMjQwMG0gPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJY2hhciBidWZbMTI4XTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKCpwcG9zICE9IDApCisJCXJldHVybiAwOworCWlmIChjb3VudCA8IHNpemVvZihidWYpKQorCQlyZXR1cm4gLUVOT1NQQzsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaTI0MDBtLT50eF9sb2NrLCBmbGFncyk7CisJc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIiV1ICV1ICV1ICV1ICV1ICV1ICV1XG4iLAorCQkgaTI0MDBtLT50eF9wbF9udW0sIGkyNDAwbS0+dHhfcGxfbWluLAorCQkgaTI0MDBtLT50eF9wbF9tYXgsIGkyNDAwbS0+dHhfbnVtLAorCQkgaTI0MDBtLT50eF9zaXplX2FjYywKKwkJIGkyNDAwbS0+dHhfc2l6ZV9taW4sIGkyNDAwbS0+dHhfc2l6ZV9tYXgpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmkyNDAwbS0+dHhfbG9jaywgZmxhZ3MpOworCXJldHVybiBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcihidWZmZXIsIGNvdW50LCBwcG9zLCBidWYsIHN0cmxlbihidWYpKTsKK30KKworLyogQW55IHdyaXRlIGNsZWFycyB0aGUgc3RhdHMgKi8KK3N0YXRpYworc3NpemVfdCBpMjQwMG1fdHhfc3RhdHNfd3JpdGUoc3RydWN0IGZpbGUgKmZpbHAsIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsCisJCQkgICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgaTI0MDBtICppMjQwMG0gPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpMjQwMG0tPnR4X2xvY2ssIGZsYWdzKTsKKwlpMjQwMG0tPnR4X3BsX251bSA9IDA7CisJaTI0MDBtLT50eF9wbF9tYXggPSAwOworCWkyNDAwbS0+dHhfcGxfbWluID0gVUlOVF9NQVg7CisJaTI0MDBtLT50eF9udW0gPSAwOworCWkyNDAwbS0+dHhfc2l6ZV9hY2MgPSAwOworCWkyNDAwbS0+dHhfc2l6ZV9taW4gPSBVSU5UX01BWDsKKwlpMjQwMG0tPnR4X3NpemVfbWF4ID0gMDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpMjQwMG0tPnR4X2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYworY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBpMjQwMG1fdHhfc3RhdHNfZm9wcyA9IHsKKwkub3duZXIgPQlUSElTX01PRFVMRSwKKwkub3BlbiA9CQlpMjQwMG1fc3RhdHNfb3BlbiwKKwkucmVhZCA9CQlpMjQwMG1fdHhfc3RhdHNfcmVhZCwKKwkud3JpdGUgPQlpMjQwMG1fdHhfc3RhdHNfd3JpdGUsCit9OworCisKKy8qIFdyaXRlIDEgdG8gYXNrIHRoZSBkZXZpY2UgdG8gZ28gaW50byBzdXNwZW5kICovCitzdGF0aWMKK2ludCBkZWJ1Z2ZzX2kyNDAwbV9zdXNwZW5kX3NldCh2b2lkICpkYXRhLCB1NjQgdmFsKQoreworCWludCByZXN1bHQ7CisJc3RydWN0IGkyNDAwbSAqaTI0MDBtID0gZGF0YTsKKwlyZXN1bHQgPSBpMjQwMG1fY21kX2VudGVyX3Bvd2Vyc2F2ZShpMjQwMG0pOworCWlmIChyZXN1bHQgPj0gMCkKKwkJcmVzdWx0ID0gMDsKKwlyZXR1cm4gcmVzdWx0OworfQorREVGSU5FX1NJTVBMRV9BVFRSSUJVVEUoZm9wc19pMjQwMG1fc3VzcGVuZCwKKwkJCU5VTEwsIGRlYnVnZnNfaTI0MDBtX3N1c3BlbmRfc2V0LAorCQkJIiVsbHVcbiIpOworCitzdGF0aWMKK3N0cnVjdCBkZW50cnkgKmRlYnVnZnNfY3JlYXRlX2kyNDAwbV9zdXNwZW5kKAorCWNvbnN0IGNoYXIgKm5hbWUsIHN0cnVjdCBkZW50cnkgKnBhcmVudCwgc3RydWN0IGkyNDAwbSAqaTI0MDBtKQoreworCXJldHVybiBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKG5hbWUsIDAyMDAsIHBhcmVudCwgaTI0MDBtLAorCQkJCSAgICZmb3BzX2kyNDAwbV9zdXNwZW5kKTsKK30KKworCisvKgorICogUmVzZXQgdGhlIGRldmljZQorICoKKyAqIFdyaXRlIDAgdG8gYXNrIHRoZSBkZXZpY2UgdG8gc29mdCByZXNldCwgMSB0byBjb2xkIHJlc2V0LCAyIHRvIGJ1cworICogcmVzZXQgKGFzIGRlZmluZWQgYnkgZW51bSBpMjQwMG1fcmVzZXRfdHlwZSkuCisgKi8KK3N0YXRpYworaW50IGRlYnVnZnNfaTI0MDBtX3Jlc2V0X3NldCh2b2lkICpkYXRhLCB1NjQgdmFsKQoreworCWludCByZXN1bHQ7CisJc3RydWN0IGkyNDAwbSAqaTI0MDBtID0gZGF0YTsKKwllbnVtIGkyNDAwbV9yZXNldF90eXBlIHJ0ID0gdmFsOworCXN3aXRjaChydCkgeworCWNhc2UgSTI0MDBNX1JUX1dBUk06CisJY2FzZSBJMjQwME1fUlRfQ09MRDoKKwljYXNlIEkyNDAwTV9SVF9CVVM6CisJCXJlc3VsdCA9IGkyNDAwbS0+YnVzX3Jlc2V0KGkyNDAwbSwgcnQpOworCQlpZiAocmVzdWx0ID49IDApCisJCQlyZXN1bHQgPSAwOworCWRlZmF1bHQ6CisJCXJlc3VsdCA9IC1FSU5WQUw7CisJfQorCXJldHVybiByZXN1bHQ7Cit9CitERUZJTkVfU0lNUExFX0FUVFJJQlVURShmb3BzX2kyNDAwbV9yZXNldCwKKwkJCU5VTEwsIGRlYnVnZnNfaTI0MDBtX3Jlc2V0X3NldCwKKwkJCSIlbGx1XG4iKTsKKworc3RhdGljCitzdHJ1Y3QgZGVudHJ5ICpkZWJ1Z2ZzX2NyZWF0ZV9pMjQwMG1fcmVzZXQoCisJY29uc3QgY2hhciAqbmFtZSwgc3RydWN0IGRlbnRyeSAqcGFyZW50LCBzdHJ1Y3QgaTI0MDBtICppMjQwMG0pCit7CisJcmV0dXJuIGRlYnVnZnNfY3JlYXRlX2ZpbGUobmFtZSwgMDIwMCwgcGFyZW50LCBpMjQwMG0sCisJCQkJICAgJmZvcHNfaTI0MDBtX3Jlc2V0KTsKK30KKworLyoKKyAqIERlYnVnIGxldmVscyBjb250cm9sOyBzZWUgZGVidWcuaAorICovCitzdHJ1Y3QgZF9sZXZlbCBEX0xFVkVMW10gPSB7CisJRF9TVUJNT0RVTEVfREVGSU5FKGNvbnRyb2wpLAorCURfU1VCTU9EVUxFX0RFRklORShkcml2ZXIpLAorCURfU1VCTU9EVUxFX0RFRklORShkZWJ1Z2ZzKSwKKwlEX1NVQk1PRFVMRV9ERUZJTkUoZncpLAorCURfU1VCTU9EVUxFX0RFRklORShuZXRkZXYpLAorCURfU1VCTU9EVUxFX0RFRklORShyZmtpbGwpLAorCURfU1VCTU9EVUxFX0RFRklORShyeCksCisJRF9TVUJNT0RVTEVfREVGSU5FKHR4KSwKK307CitzaXplX3QgRF9MRVZFTF9TSVpFID0gQVJSQVlfU0laRShEX0xFVkVMKTsKKworI2RlZmluZSBfX2RlYnVnZnNfcmVnaXN0ZXIocHJlZml4LCBuYW1lLCBwYXJlbnQpCQkJXAorZG8gewkJCQkJCQkJCVwKKwlyZXN1bHQgPSBkX2xldmVsX3JlZ2lzdGVyX2RlYnVnZnMocHJlZml4LCBuYW1lLCBwYXJlbnQpOwlcCisJaWYgKHJlc3VsdCA8IDApCQkJCQkJCVwKKwkJZ290byBlcnJvcjsJCQkJCQlcCit9IHdoaWxlICgwKQorCisKK2ludCBpMjQwMG1fZGVidWdmc19hZGQoc3RydWN0IGkyNDAwbSAqaTI0MDBtKQoreworCWludCByZXN1bHQ7CisJc3RydWN0IGRldmljZSAqZGV2ID0gaTI0MDBtX2RldihpMjQwMG0pOworCXN0cnVjdCBkZW50cnkgKmRlbnRyeSA9IGkyNDAwbS0+d2ltYXhfZGV2LmRlYnVnZnNfZGVudHJ5OworCXN0cnVjdCBkZW50cnkgKmZkOworCisJZGVudHJ5ID0gZGVidWdmc19jcmVhdGVfZGlyKCJpMjQwMG0iLCBkZW50cnkpOworCXJlc3VsdCA9IFBUUl9FUlIoZGVudHJ5KTsKKwlpZiAoSVNfRVJSKGRlbnRyeSkpIHsKKwkJaWYgKHJlc3VsdCA9PSAtRU5PREVWKQorCQkJcmVzdWx0ID0gMDsJLyogTm8gZGVidWdmcyBzdXBwb3J0ICovCisJCWdvdG8gZXJyb3I7CisJfQorCWkyNDAwbS0+ZGVidWdmc19kZW50cnkgPSBkZW50cnk7CisJX19kZWJ1Z2ZzX3JlZ2lzdGVyKCJkbF8iLCBjb250cm9sLCBkZW50cnkpOworCV9fZGVidWdmc19yZWdpc3RlcigiZGxfIiwgZHJpdmVyLCBkZW50cnkpOworCV9fZGVidWdmc19yZWdpc3RlcigiZGxfIiwgZGVidWdmcywgZGVudHJ5KTsKKwlfX2RlYnVnZnNfcmVnaXN0ZXIoImRsXyIsIGZ3LCBkZW50cnkpOworCV9fZGVidWdmc19yZWdpc3RlcigiZGxfIiwgbmV0ZGV2LCBkZW50cnkpOworCV9fZGVidWdmc19yZWdpc3RlcigiZGxfIiwgcmZraWxsLCBkZW50cnkpOworCV9fZGVidWdmc19yZWdpc3RlcigiZGxfIiwgcngsIGRlbnRyeSk7CisJX19kZWJ1Z2ZzX3JlZ2lzdGVyKCJkbF8iLCB0eCwgZGVudHJ5KTsKKworCWZkID0gZGVidWdmc19jcmVhdGVfc2l6ZV90KCJ0eF9pbiIsIDA0MDAsIGRlbnRyeSwKKwkJCQkgICAmaTI0MDBtLT50eF9pbik7CisJcmVzdWx0ID0gUFRSX0VSUihmZCk7CisJaWYgKElTX0VSUihmZCkgJiYgcmVzdWx0ICE9IC1FTk9ERVYpIHsKKwkJZGV2X2VycihkZXYsICJDYW4ndCBjcmVhdGUgZGVidWdmcyBlbnRyeSAiCisJCQkidHhfaW46ICVkXG4iLCByZXN1bHQpOworCQlnb3RvIGVycm9yOworCX0KKworCWZkID0gZGVidWdmc19jcmVhdGVfc2l6ZV90KCJ0eF9vdXQiLCAwNDAwLCBkZW50cnksCisJCQkJICAgJmkyNDAwbS0+dHhfb3V0KTsKKwlyZXN1bHQgPSBQVFJfRVJSKGZkKTsKKwlpZiAoSVNfRVJSKGZkKSAmJiByZXN1bHQgIT0gLUVOT0RFVikgeworCQlkZXZfZXJyKGRldiwgIkNhbid0IGNyZWF0ZSBkZWJ1Z2ZzIGVudHJ5ICIKKwkJCSJ0eF9vdXQ6ICVkXG4iLCByZXN1bHQpOworCQlnb3RvIGVycm9yOworCX0KKworCWZkID0gZGVidWdmc19jcmVhdGVfdTMyKCJzdGF0ZSIsIDA2MDAsIGRlbnRyeSwKKwkJCQkmaTI0MDBtLT5zdGF0ZSk7CisJcmVzdWx0ID0gUFRSX0VSUihmZCk7CisJaWYgKElTX0VSUihmZCkgJiYgcmVzdWx0ICE9IC1FTk9ERVYpIHsKKwkJZGV2X2VycihkZXYsICJDYW4ndCBjcmVhdGUgZGVidWdmcyBlbnRyeSAiCisJCQkic3RhdGU6ICVkXG4iLCByZXN1bHQpOworCQlnb3RvIGVycm9yOworCX0KKworCS8qCisJICogVHJhY2UgcmVjZWl2ZWQgbWVzc2FnZXMgZnJvbSB1c2VyIHNwYWNlCisJICoKKwkgKiBJbiBvcmRlciB0byB0YXAgdGhlIGJpZGlyZWN0aW9uYWwgbWVzc2FnZSBzdHJlYW0gaW4gdGhlCisJICogJ21zZycgcGlwZSwgdXNlciBzcGFjZSBjYW4gcmVhZCBmcm9tIHRoZSAnbXNnJyBwaXBlOworCSAqIGhvd2V2ZXIsIGR1ZSB0byBsaW1pdGF0aW9ucyBpbiBsaWJubCwgd2UgY2FuJ3Qga25vdyB3aGF0CisJICogdGhlIGRpZmZlcmVudCBhcHBsaWNhdGlvbnMgYXJlIHNlbmRpbmcgZG93biB0byB0aGUga2VybmVsLgorCSAqCisJICogU28gd2UgaGF2ZSB0aGlzIGhhY2sgd2hlcmUgdGhlIGRyaXZlciB3aWxsIGVjaG8gYW55IG1lc3NhZ2UKKwkgKiByZWNlaXZlZCBvbiB0aGUgbXNnIHBpcGUgZnJvbSB1c2VyIHNwYWNlIFt0aHJvdWdoIGEgY2FsbCB0bworCSAqIHdpbWF4X2Rldi0+b3BfbXNnX2Zyb21fdXNlcigpIGludG8KKwkgKiBpMjQwMG1fb3BfbXNnX2Zyb21fdXNlcigpXSBpbnRvIHRoZSAndHJhY2UnIHBpcGUgdGhhdCB0aGlzCisJICogZHJpdmVyIGNyZWF0ZXMuCisJICoKKwkgKiBTbyB0aGVuLCByZWFkaW5nIGZyb20gYm90aCB0aGUgJ3RyYWNlJyBhbmQgJ21zZycgcGlwZXMgaW4KKwkgKiB1c2VyIHNwYWNlIHdpbGwgcHJvdmlkZSBhIGZ1bGwgZHVtcCBvZiB0aGUgdHJhZmZpYy4KKwkgKgorCSAqIFdyaXRlIDEgdG8gYWN0aXZhdGUsIDAgdG8gY2xlYXIuCisJICoKKwkgKiBJdCBpcyBub3QgcmVhbGx5IHZlcnkgYXRvbWljLCBidXQgaXQgaXMgYWxzbyBub3QgdG9vCisJICogY3JpdGljYWwuCisJICovCisJZmQgPSBkZWJ1Z2ZzX2NyZWF0ZV91OCgidHJhY2VfbXNnX2Zyb21fdXNlciIsIDA2MDAsIGRlbnRyeSwKKwkJCSAgICAgICAmaTI0MDBtLT50cmFjZV9tc2dfZnJvbV91c2VyKTsKKwlyZXN1bHQgPSBQVFJfRVJSKGZkKTsKKwlpZiAoSVNfRVJSKGZkKSAmJiByZXN1bHQgIT0gLUVOT0RFVikgeworCQlkZXZfZXJyKGRldiwgIkNhbid0IGNyZWF0ZSBkZWJ1Z2ZzIGVudHJ5ICIKKwkJCSJ0cmFjZV9tc2dfZnJvbV91c2VyOiAlZFxuIiwgcmVzdWx0KTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlmZCA9IGRlYnVnZnNfY3JlYXRlX25ldGRldl9xdWV1ZV9zdG9wcGVkKCJuZXRkZXZfcXVldWVfc3RvcHBlZCIsCisJCQkJCQkgZGVudHJ5LCBpMjQwMG0pOworCXJlc3VsdCA9IFBUUl9FUlIoZmQpOworCWlmIChJU19FUlIoZmQpICYmIHJlc3VsdCAhPSAtRU5PREVWKSB7CisJCWRldl9lcnIoZGV2LCAiQ2FuJ3QgY3JlYXRlIGRlYnVnZnMgZW50cnkgIgorCQkJIm5ldGRldl9xdWV1ZV9zdG9wcGVkOiAlZFxuIiwgcmVzdWx0KTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlmZCA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoInJ4X3N0YXRzIiwgMDYwMCwgZGVudHJ5LCBpMjQwMG0sCisJCQkJICZpMjQwMG1fcnhfc3RhdHNfZm9wcyk7CisJcmVzdWx0ID0gUFRSX0VSUihmZCk7CisJaWYgKElTX0VSUihmZCkgJiYgcmVzdWx0ICE9IC1FTk9ERVYpIHsKKwkJZGV2X2VycihkZXYsICJDYW4ndCBjcmVhdGUgZGVidWdmcyBlbnRyeSAiCisJCQkicnhfc3RhdHM6ICVkXG4iLCByZXN1bHQpOworCQlnb3RvIGVycm9yOworCX0KKworCWZkID0gZGVidWdmc19jcmVhdGVfZmlsZSgidHhfc3RhdHMiLCAwNjAwLCBkZW50cnksIGkyNDAwbSwKKwkJCQkgJmkyNDAwbV90eF9zdGF0c19mb3BzKTsKKwlyZXN1bHQgPSBQVFJfRVJSKGZkKTsKKwlpZiAoSVNfRVJSKGZkKSAmJiByZXN1bHQgIT0gLUVOT0RFVikgeworCQlkZXZfZXJyKGRldiwgIkNhbid0IGNyZWF0ZSBkZWJ1Z2ZzIGVudHJ5ICIKKwkJCSJ0eF9zdGF0czogJWRcbiIsIHJlc3VsdCk7CisJCWdvdG8gZXJyb3I7CisJfQorCisJZmQgPSBkZWJ1Z2ZzX2NyZWF0ZV9pMjQwMG1fc3VzcGVuZCgic3VzcGVuZCIsIGRlbnRyeSwgaTI0MDBtKTsKKwlyZXN1bHQgPSBQVFJfRVJSKGZkKTsKKwlpZiAoSVNfRVJSKGZkKSAmJiByZXN1bHQgIT0gLUVOT0RFVikgeworCQlkZXZfZXJyKGRldiwgIkNhbid0IGNyZWF0ZSBkZWJ1Z2ZzIGVudHJ5IHN1c3BlbmQ6ICVkXG4iLAorCQkJcmVzdWx0KTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlmZCA9IGRlYnVnZnNfY3JlYXRlX2kyNDAwbV9yZXNldCgicmVzZXQiLCBkZW50cnksIGkyNDAwbSk7CisJcmVzdWx0ID0gUFRSX0VSUihmZCk7CisJaWYgKElTX0VSUihmZCkgJiYgcmVzdWx0ICE9IC1FTk9ERVYpIHsKKwkJZGV2X2VycihkZXYsICJDYW4ndCBjcmVhdGUgZGVidWdmcyBlbnRyeSByZXNldDogJWRcbiIsIHJlc3VsdCk7CisJCWdvdG8gZXJyb3I7CisJfQorCisJcmVzdWx0ID0gMDsKK2Vycm9yOgorCXJldHVybiByZXN1bHQ7Cit9CisKK3ZvaWQgaTI0MDBtX2RlYnVnZnNfcm0oc3RydWN0IGkyNDAwbSAqaTI0MDBtKQoreworCWRlYnVnZnNfcmVtb3ZlX3JlY3Vyc2l2ZShpMjQwMG0tPmRlYnVnZnNfZGVudHJ5KTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpbWF4L2kyNDAwbS9kcml2ZXIuYyBiL2RyaXZlcnMvbmV0L3dpbWF4L2kyNDAwbS9kcml2ZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Zjk4MDQ3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2ltYXgvaTI0MDBtL2RyaXZlci5jCkBAIC0wLDAgKzEsNzI4IEBACisvKgorICogSW50ZWwgV2lyZWxlc3MgV2lNQVggQ29ubmVjdGlvbiAyNDAwbQorICogR2VuZXJpYyBwcm9iZS9kaXNjb25uZWN0LCByZXNldCBhbmQgbWVzc2FnZSBwYXNzaW5nCisgKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEludGVsIENvcnBvcmF0aW9uIDxsaW51eC13aW1heEBpbnRlbC5jb20+CisgKiBJbmFreSBQZXJlei1Hb256YWxleiA8aW5ha3kucGVyZXotZ29uemFsZXpAaW50ZWwuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEsIFVTQS4KKyAqCisgKgorICogU2VlIGkyNDAwbS5oIGZvciBkcml2ZXIgZG9jdW1lbnRhdGlvbi4gVGhpcyBjb250YWlucyBoZWxwZXJzIGZvcgorICogdGhlIGRyaXZlciBtb2RlbCBnbHVlIFtfc2V0dXAoKS9fcmVsZWFzZSgpXSwgaGFuZGxpbmcgZGV2aWNlIHJlc2V0cworICogW19kZXZfcmVzZXRfaGFuZGxlKCldLCBhbmQgdGhlIGJhY2tlbmRzIGZvciB0aGUgV2lNQVggc3RhY2sgb3BzCisgKiByZXNldCBbX29wX3Jlc2V0KCldIGFuZCBtZXNzYWdlIGZyb20gdXNlciBbX29wX21zZ19mcm9tX3VzZXIoKV0uCisgKgorICogUk9BRE1BUDoKKyAqCisgKiBpMjQwMG1fb3BfbXNnX2Zyb21fdXNlcigpCisgKiAgIGkyNDAwbV9tc2dfdG9fZGV2KCkKKyAqICAgd2ltYXhfbXNnX3RvX3VzZXJfc2VuZCgpCisgKgorICogaTI0MDBtX29wX3Jlc2V0KCkKKyAqICAgaTI0MG0tPmJ1c19yZXNldCgpCisgKgorICogaTI0MDBtX2Rldl9yZXNldF9oYW5kbGUoKQorICogICBfX2kyNDAwbV9kZXZfcmVzZXRfaGFuZGxlKCkKKyAqICAgICBfX2kyNDAwbV9kZXZfc3RvcCgpCisgKiAgICAgX19pMjQwMG1fZGV2X3N0YXJ0KCkKKyAqCisgKiBpMjQwMG1fc2V0dXAoKQorICogICBpMjQwMG1fYm9vdHJvbV9pbml0KCkKKyAqICAgcmVnaXN0ZXJfbmV0ZGV2KCkKKyAqICAgaTI0MDBtX2Rldl9zdGFydCgpCisgKiAgICAgX19pMjQwMG1fZGV2X3N0YXJ0KCkKKyAqICAgICAgIGkyNDAwbV9kZXZfYm9vdHN0cmFwKCkKKyAqICAgICAgIGkyNDAwbV90eF9zZXR1cCgpCisgKiAgICAgICBpMjQwMG0tPmJ1c19kZXZfc3RhcnQoKQorICogICAgICAgaTI0MDBtX2NoZWNrX21hY19hZGRyKCkKKyAqICAgd2ltYXhfZGV2X2FkZCgpCisgKgorICogaTI0MDBtX3JlbGVhc2UoKQorICogICB3aW1heF9kZXZfcm0oKQorICogICBpMjQwMG1fZGV2X3N0b3AoKQorICogICAgIF9faTI0MDBtX2Rldl9zdG9wKCkKKyAqICAgICAgIGkyNDAwbV9kZXZfc2h1dGRvd24oKQorICogICAgICAgaTI0MDBtLT5idXNfZGV2X3N0b3AoKQorICogICAgICAgaTI0MDBtX3R4X3JlbGVhc2UoKQorICogICB1bnJlZ2lzdGVyX25ldGRldigpCisgKi8KKyNpbmNsdWRlICJpMjQwMG0uaCIKKyNpbmNsdWRlIDxsaW51eC93aW1heC9pMjQwMG0uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorCisjZGVmaW5lIERfU1VCTU9EVUxFIGRyaXZlcgorI2luY2x1ZGUgImRlYnVnLWxldmVscy5oIgorCisKK2ludCBpMjQwMG1faWRsZV9tb2RlX2Rpc2FibGVkOwkvKiAwIChpZGxlIG1vZGUgZW5hYmxlZCkgYnkgZGVmYXVsdCAqLworbW9kdWxlX3BhcmFtX25hbWVkKGlkbGVfbW9kZV9kaXNhYmxlZCwgaTI0MDBtX2lkbGVfbW9kZV9kaXNhYmxlZCwgaW50LCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoaWRsZV9tb2RlX2Rpc2FibGVkLAorCQkgIklmIHRydWUsIHRoZSBkZXZpY2Ugd2lsbCBub3QgZW5hYmxlIGlkbGUgbW9kZSBuZWdvdGlhdGlvbiAiCisJCSAid2l0aCB0aGUgYmFzZSBzdGF0aW9uICh3aGVuIGNvbm5lY3RlZCkgdG8gc2F2ZSBwb3dlci4iKTsKKworLyoqCisgKiBpMjQwMG1fcXVldWVfd29yayAtIHNjaGVkdWxlIHdvcmsgb24gYSBpMjQwMG0ncyBxdWV1ZQorICoKKyAqIEBpMjQwMG06IGRldmljZSBkZXNjcmlwdG9yCisgKgorICogQGZuOiBmdW5jdGlvbiB0byBydW4gdG8gZXhlY3V0ZSB3b3JrLiBJdCBnZXRzIHBhc3NlZCBhICdzdHJ1Y3QKKyAqICAgICB3b3JrX3N0cnVjdCcgdGhhdCBpcyB3cmFwcGVkIGluIGEgJ3N0cnVjdCBpMjQwMG1fd29yaycuIE9uY2UKKyAqICAgICBkb25lLCB5b3UgaGF2ZSB0byAoMSkgaTI0MDBtX3B1dChpMjQwMG1fd29yay0+aTI0MDBtKSBhbmQgdGhlbgorICogICAgICgyKSBrZnJlZShpMjQwMG1fd29yaykuCisgKgorICogQGdmcF9mbGFnczogR0ZQIGZsYWdzIGZvciBtZW1vcnkgYWxsb2NhdGlvbi4KKyAqCisgKiBAcGw6IHBvaW50ZXIgdG8gYSBwYXlsb2FkIGJ1ZmZlciB0aGF0IHlvdSB3YW50IHRvIHBhc3MgdG8gdGhlIF93b3JrCisgKiAgICAgZnVuY3Rpb24uIFVzZSB0aGlzIHRvIHBhY2sgKGZvciBleGFtcGxlKSBhIHN0cnVjdCB3aXRoIGV4dHJhCisgKiAgICAgYXJndW1lbnRzLgorICoKKyAqIEBwbF9zaXplOiBzaXplIG9mIHRoZSBwYXlsb2FkIGJ1ZmZlci4KKyAqCisgKiBXZSBkbyB0aGlzIHF1aXRlIG9mdGVuLCBzbyB0aGlzIGp1c3Qgc2F2ZXMgdHlwaW5nOyBhbGxvY2F0ZSBhCisgKiB3cmFwcGVyIGZvciBhIGkyNDAwbSwgZ2V0IGEgcmVmIHRvIGl0LCBwYWNrIGFyZ3VtZW50cyBhbmQgbGF1bmNoCisgKiB0aGUgd29yay4KKyAqCisgKiBBIHVzdWFsIHdvcmtmbG93IGlzOgorICoKKyAqIHN0cnVjdCBteV93b3JrX2FyZ3MgeworICogICAgICAgICB2b2lkICpzb21ldGhpbmc7CisgKiAgICAgICAgIGludCB3aGF0ZXZlcjsKKyAqIH07CisgKiAuLi4KKyAqCisgKiBzdHJ1Y3QgbXlfd29ya19hcmdzIG15X2FyZ3MgPSB7CisgKiAgICAgICAgIC5zb21ldGhpbmcgPSBGT08sCisgKiAgICAgICAgIC53aGFldGV2ZXIgPSBCTEFICisgKiB9OworICogaTI0MDBtX3F1ZXVlX3dvcmsoaTI0MDBtLCAxLCBteV93b3JrX2Z1bmN0aW9uLCBHRlBfS0VSTkVMLAorICogICAgICAgICAgICAgICAgICAgJmFyZ3MsIHNpemVvZihhcmdzKSkKKyAqCisgKiBBbmQgbm93IHRoZSB3b3JrIGZ1bmN0aW9uIGNhbiB1bnBhY2sgdGhlIGFyZ3VtZW50cyBhbmQgY2FsbCB0aGUKKyAqIHJlYWwgZnVuY3Rpb24gKG9yIGRvIHRoZSBqb2IgaXRzZWxmKToKKyAqCisgKiBzdGF0aWMKKyAqIHZvaWQgbXlfd29ya19mbigoc3RydWN0IHdvcmtfc3RydWN0ICp3cykKKyAqIHsKKyAqICAgICAgICAgc3RydWN0IGkyNDAwbV93b3JrICppdyA9CisgKgkgICAgICAgICAgIGNvbnRhaW5lcl9vZih3cywgc3RydWN0IGkyNDAwbV93b3JrLCB3cyk7CisgKgkgICBzdHJ1Y3QgbXlfd29ya19hcmdzICpteV9hcmdzID0gKHZvaWQgKikgaXctPnBsOworICoKKyAqCSAgIG15X3dvcmsoaXctPmkyNDAwbSwgbXlfYXJncy0+c29tZXRoaW5nLCBteV9hcmdzLT53aGF0ZXZlcnQpOworICogfQorICovCitpbnQgaTI0MDBtX3F1ZXVlX3dvcmsoc3RydWN0IGkyNDAwbSAqaTI0MDBtLAorCQkgICAgICB2b2lkICgqZm4pKHN0cnVjdCB3b3JrX3N0cnVjdCAqKSwgZ2ZwX3QgZ2ZwX2ZsYWdzLAorCQkgICAgICBjb25zdCB2b2lkICpwbCwgc2l6ZV90IHBsX3NpemUpCit7CisJaW50IHJlc3VsdDsKKwlzdHJ1Y3QgaTI0MDBtX3dvcmsgKml3OworCisJQlVHX09OKGkyNDAwbS0+d29ya19xdWV1ZSA9PSBOVUxMKTsKKwlyZXN1bHQgPSAtRU5PTUVNOworCWl3ID0ga3phbGxvYyhzaXplb2YoKml3KSArIHBsX3NpemUsIGdmcF9mbGFncyk7CisJaWYgKGl3ID09IE5VTEwpCisJCWdvdG8gZXJyb3Jfa3phbGxvYzsKKwlpdy0+aTI0MDBtID0gaTI0MDBtX2dldChpMjQwMG0pOworCW1lbWNweShpdy0+cGwsIHBsLCBwbF9zaXplKTsKKwlJTklUX1dPUksoJml3LT53cywgZm4pOworCXJlc3VsdCA9IHF1ZXVlX3dvcmsoaTI0MDBtLT53b3JrX3F1ZXVlLCAmaXctPndzKTsKK2Vycm9yX2t6YWxsb2M6CisJcmV0dXJuIHJlc3VsdDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGkyNDAwbV9xdWV1ZV93b3JrKTsKKworCisvKgorICogU2NoZWR1bGUgaTI0MDBtJ3Mgc3BlY2lmaWMgd29yayBvbiB0aGUgc3lzdGVtJ3MgcXVldWUuCisgKgorICogVXNlZCBmb3IgYSBmZXcgY2FzZXMgd2hlcmUgd2UgcmVhbGx5IG5lZWQgaXQ7IG90aGVyd2lzZSwgaWRlbnRpY2FsCisgKiB0byBpMjQwMG1fcXVldWVfd29yaygpLgorICoKKyAqIFJldHVybnMgPCAwIGVycm5vIGNvZGUgb24gZXJyb3IsIDEgaWYgb2suCisgKgorICogSWYgaXQgcmV0dXJucyB6ZXJvLCBzb21ldGhpbmcgcmVhbGx5IGJhZCBoYXBwZW5lZCwgYXMgaXQgbWVhbnMgdGhlCisgKiB3b3JrcyBzdHJ1Y3Qgd2FzIGFscmVhZHkgcXVldWVkLCBidXQgd2UgaGF2ZSBqdXN0IGFsbG9jYXRlZCBpdCwgc28KKyAqIGl0IHNob3VsZCBub3QgaGFwcGVuLgorICovCitpbnQgaTI0MDBtX3NjaGVkdWxlX3dvcmsoc3RydWN0IGkyNDAwbSAqaTI0MDBtLAorCQkJIHZvaWQgKCpmbikoc3RydWN0IHdvcmtfc3RydWN0ICopLCBnZnBfdCBnZnBfZmxhZ3MpCit7CisJaW50IHJlc3VsdDsKKwlzdHJ1Y3QgaTI0MDBtX3dvcmsgKml3OworCisJQlVHX09OKGkyNDAwbS0+d29ya19xdWV1ZSA9PSBOVUxMKTsKKwlyZXN1bHQgPSAtRU5PTUVNOworCWl3ID0ga3phbGxvYyhzaXplb2YoKml3KSwgZ2ZwX2ZsYWdzKTsKKwlpZiAoaXcgPT0gTlVMTCkKKwkJZ290byBlcnJvcl9remFsbG9jOworCWl3LT5pMjQwMG0gPSBpMjQwMG1fZ2V0KGkyNDAwbSk7CisJSU5JVF9XT1JLKCZpdy0+d3MsIGZuKTsKKwlyZXN1bHQgPSBzY2hlZHVsZV93b3JrKCZpdy0+d3MpOworCWlmIChyZXN1bHQgPT0gMCkKKwkJcmVzdWx0ID0gLUVOWElPOworZXJyb3Jfa3phbGxvYzoKKwlyZXR1cm4gcmVzdWx0OworfQorCisKKy8qCisgKiBXaU1BWCBzdGFjayBvcGVyYXRpb246IHJlbGF5IGEgbWVzc2FnZSBmcm9tIHVzZXIgc3BhY2UKKyAqCisgKiBAd2ltYXhfZGV2OiBkZXZpY2UgZGVzY3JpcHRvcgorICogQHBpcGVfbmFtZTogbmFtZWQgcGlwZSB0aGUgbWVzc2FnZSBpcyBmb3IKKyAqIEBtc2dfYnVmOiBwb2ludGVyIHRvIHRoZSBtZXNzYWdlIGJ5dGVzCisgKiBAbXNnX2xlbjogbGVuZ3RoIG9mIHRoZSBidWZmZXIKKyAqIEBnZW5sX2luZm86IHBhc3NlZCBieSB0aGUgZ2VuZXJpYyBuZXRsaW5rIGxheWVyCisgKgorICogVGhlIFdpTUFYIHN0YWNrIHdpbGwgY2FsbCB0aGlzIGZ1bmN0aW9uIHdoZW4gYSBtZXNzYWdlIHdhcyByZWNlaXZlZAorICogZnJvbSB1c2VyIHNwYWNlLgorICoKKyAqIEZvciB0aGUgaTI0MDBtLCB0aGlzIGlzIGFuIEwzTDQgbWVzc2FnZSwgYXMgc3BlY2lmaWVkIGluCisgKiBpbmNsdWRlL2xpbnV4L3dpbWF4L2kyNDAwbS5oLCBhbmQgdGh1cyBwcmVmaXhlZCB3aXRoIGEgJ3N0cnVjdAorICogaTI0MDBtX2wzbDRfaGRyJy4gRHJpdmVyIChhbmQgZGV2aWNlKSBleHBlY3QgdGhlIG1lc3NhZ2VzIHRvIGJlCisgKiBjb2RlZCBpbiBMaXR0bGUgRW5kaWFuLgorICoKKyAqIFRoaXMgZnVuY3Rpb24ganVzdCB2ZXJpZmllcyB0aGF0IHRoZSBoZWFkZXIgZGVjbGFyYXRpb24gYW5kIHRoZQorICogcGF5bG9hZCBhcmUgY29uc2lzdGVudCBhbmQgdGhlbiBkZWFscyB3aXRoIGl0LCBlaXRoZXIgZm9yd2FyZGluZyBpdAorICogdG8gdGhlIGRldmljZSBvciBwcm9jZXNpbmcgaXQgbG9jYWxseS4KKyAqCisgKiBJbiB0aGUgaTI0MDBtLCBtZXNzYWdlcyBhcmUgYmFzaWNhbGx5IGNvbW1hbmRzIHRoYXQgd2lsbCBjYXJyeSBhbgorICogYWNrLCBzbyB3ZSB1c2UgaTI0MDBtX21zZ190b19kZXYoKSBhbmQgdGhlbiBkZWxpdmVyIHRoZSBhY2sgYmFjayB0bworICogdXNlciBzcGFjZS4gVGhlIHJ4LmMgY29kZSBtaWdodCBpbnRlcmNlcHQgdGhlIHJlc3BvbnNlIGFuZCB1c2UgaXQKKyAqIHRvIHVwZGF0ZSB0aGUgZHJpdmVyJ3Mgc3RhdGUsIGJ1dCB0aGVuIGl0IHdpbGwgcGFzcyBpdCBvbiBzbyBpdCBjYW4KKyAqIGJlIHJlbGF5ZWQgYmFjayB0byB1c2VyIHNwYWNlLgorICoKKyAqIE5vdGUgdGhhdCBhc3luY2hyb25vdXMgZXZlbnRzIGZyb20gdGhlIGRldmljZSBhcmUgcHJvY2Vzc2VkIGFuZAorICogc2VudCB0byB1c2VyIHNwYWNlIGluIHJ4LmMuCisgKi8KK3N0YXRpYworaW50IGkyNDAwbV9vcF9tc2dfZnJvbV91c2VyKHN0cnVjdCB3aW1heF9kZXYgKndpbWF4X2RldiwKKwkJCSAgICBjb25zdCBjaGFyICpwaXBlX25hbWUsCisJCQkgICAgY29uc3Qgdm9pZCAqbXNnX2J1Ziwgc2l6ZV90IG1zZ19sZW4sCisJCQkgICAgY29uc3Qgc3RydWN0IGdlbmxfaW5mbyAqZ2VubF9pbmZvKQoreworCWludCByZXN1bHQ7CisJc3RydWN0IGkyNDAwbSAqaTI0MDBtID0gd2ltYXhfZGV2X3RvX2kyNDAwbSh3aW1heF9kZXYpOworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGkyNDAwbV9kZXYoaTI0MDBtKTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqYWNrX3NrYjsKKworCWRfZm5zdGFydCg0LCBkZXYsICIod2ltYXhfZGV2ICVwIFtpMjQwMG0gJXBdIG1zZ19idWYgJXAgIgorCQkgICJtc2dfbGVuICV6dSBnZW5sX2luZm8gJXApXG4iLCB3aW1heF9kZXYsIGkyNDAwbSwKKwkJICBtc2dfYnVmLCBtc2dfbGVuLCBnZW5sX2luZm8pOworCWFja19za2IgPSBpMjQwMG1fbXNnX3RvX2RldihpMjQwMG0sIG1zZ19idWYsIG1zZ19sZW4pOworCXJlc3VsdCA9IFBUUl9FUlIoYWNrX3NrYik7CisJaWYgKElTX0VSUihhY2tfc2tiKSkKKwkJZ290byBlcnJvcl9tc2dfdG9fZGV2OworCWlmICh1bmxpa2VseShpMjQwMG0tPnRyYWNlX21zZ19mcm9tX3VzZXIpKQorCQl3aW1heF9tc2coJmkyNDAwbS0+d2ltYXhfZGV2LCAidHJhY2UiLAorCQkJICBtc2dfYnVmLCBtc2dfbGVuLCBHRlBfS0VSTkVMKTsKKwlyZXN1bHQgPSB3aW1heF9tc2dfc2VuZCgmaTI0MDBtLT53aW1heF9kZXYsIGFja19za2IpOworZXJyb3JfbXNnX3RvX2RldjoKKwlkX2ZuZW5kKDQsIGRldiwgIih3aW1heF9kZXYgJXAgW2kyNDAwbSAlcF0gbXNnX2J1ZiAlcCBtc2dfbGVuICV6dSAiCisJCSJnZW5sX2luZm8gJXApID0gJWRcbiIsIHdpbWF4X2RldiwgaTI0MDBtLCBtc2dfYnVmLCBtc2dfbGVuLAorCQlnZW5sX2luZm8sIHJlc3VsdCk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworCisvKgorICogQ29udGV4dCB0byB3YWl0IGZvciBhIHJlc2V0IHRvIGZpbmFsaXplCisgKi8KK3N0cnVjdCBpMjQwMG1fcmVzZXRfY3R4IHsKKwlzdHJ1Y3QgY29tcGxldGlvbiBjb21wbGV0aW9uOworCWludCByZXN1bHQ7Cit9OworCisKKy8qCisgKiBXaU1BWCBzdGFjayBvcGVyYXRpb246IHJlc2V0IGEgZGV2aWNlCisgKgorICogQHdpbWF4X2RldjogZGV2aWNlIGRlc2NyaXB0b3IKKyAqCisgKiBTZWUgdGhlIGRvY3VtZW50YXRpb24gZm9yIHdpbWF4X3Jlc2V0KCkgYW5kIHdpbWF4X2Rldi0+b3BfcmVzZXQgZm9yCisgKiB0aGUgcmVxdWlyZW1lbnRzIG9mIHRoaXMgZnVuY3Rpb24uIFRoZSBXaU1BWCBzdGFjayBndWFyYW50ZWVzCisgKiBzZXJpYWxpemF0aW9uIG9uIGNhbGxzIHRvIHRoaXMgZnVuY3Rpb24uCisgKgorICogRG8gYSB3YXJtIHJlc2V0IG9uIHRoZSBkZXZpY2U7IGlmIGl0IGZhaWxzLCByZXNvcnQgdG8gYSBjb2xkIHJlc2V0CisgKiBhbmQgcmV0dXJuIC1FTk9ERVYuIE9uIHN1Y2Nlc3NmdWwgd2FybSByZXNldCwgd2UgbmVlZCB0byBibG9jaworICogdW50aWwgaXQgaXMgY29tcGxldGUuCisgKgorICogVGhlIGJ1cy1kcml2ZXIgaW1wbGVtZW50YXRpb24gb2YgcmVzZXQgdGFrZXMgY2FyZSBvZiBmYWxsaW5nIGJhY2sKKyAqIHRvIGNvbGQgcmVzZXQgaWYgd2FybSBmYWlscy4KKyAqLworc3RhdGljCitpbnQgaTI0MDBtX29wX3Jlc2V0KHN0cnVjdCB3aW1heF9kZXYgKndpbWF4X2RldikKK3sKKwlpbnQgcmVzdWx0OworCXN0cnVjdCBpMjQwMG0gKmkyNDAwbSA9IHdpbWF4X2Rldl90b19pMjQwMG0od2ltYXhfZGV2KTsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBpMjQwMG1fZGV2KGkyNDAwbSk7CisJc3RydWN0IGkyNDAwbV9yZXNldF9jdHggY3R4ID0geworCQkuY29tcGxldGlvbiA9IENPTVBMRVRJT05fSU5JVElBTElaRVJfT05TVEFDSyhjdHguY29tcGxldGlvbiksCisJCS5yZXN1bHQgPSAwLAorCX07CisKKwlkX2Zuc3RhcnQoNCwgZGV2LCAiKHdpbWF4X2RldiAlcClcbiIsIHdpbWF4X2Rldik7CisJbXV0ZXhfbG9jaygmaTI0MDBtLT5pbml0X211dGV4KTsKKwlpMjQwMG0tPnJlc2V0X2N0eCA9ICZjdHg7CisJbXV0ZXhfdW5sb2NrKCZpMjQwMG0tPmluaXRfbXV0ZXgpOworCXJlc3VsdCA9IGkyNDAwbS0+YnVzX3Jlc2V0KGkyNDAwbSwgSTI0MDBNX1JUX1dBUk0pOworCWlmIChyZXN1bHQgPCAwKQorCQlnb3RvIG91dDsKKwlyZXN1bHQgPSB3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJmN0eC5jb21wbGV0aW9uLCA0KkhaKTsKKwlpZiAocmVzdWx0ID09IDApCisJCXJlc3VsdCA9IC1FVElNRURPVVQ7CisJZWxzZSBpZiAocmVzdWx0ID4gMCkKKwkJcmVzdWx0ID0gY3R4LnJlc3VsdDsKKwkvKiBpZiByZXN1bHQgPCAwLCBwYXNzIGl0IG9uICovCisJbXV0ZXhfbG9jaygmaTI0MDBtLT5pbml0X211dGV4KTsKKwlpMjQwMG0tPnJlc2V0X2N0eCA9IE5VTEw7CisJbXV0ZXhfdW5sb2NrKCZpMjQwMG0tPmluaXRfbXV0ZXgpOworb3V0OgorCWRfZm5lbmQoNCwgZGV2LCAiKHdpbWF4X2RldiAlcCkgPSAlZFxuIiwgd2ltYXhfZGV2LCByZXN1bHQpOworCXJldHVybiByZXN1bHQ7Cit9CisKKworLyoKKyAqIENoZWNrIHRoZSBNQUMgYWRkcmVzcyB3ZSBnb3QgZnJvbSBib290IG1vZGUgaXMgb2sKKyAqCisgKiBAaTI0MDBtOiBkZXZpY2UgZGVzY3JpcHRvcgorICoKKyAqIFJldHVybnM6IDAgaWYgb2ssIDwgMCBlcnJubyBjb2RlIG9uIGVycm9yLgorICovCitzdGF0aWMKK2ludCBpMjQwMG1fY2hlY2tfbWFjX2FkZHIoc3RydWN0IGkyNDAwbSAqaTI0MDBtKQoreworCWludCByZXN1bHQ7CisJc3RydWN0IGRldmljZSAqZGV2ID0gaTI0MDBtX2RldihpMjQwMG0pOworCXN0cnVjdCBza19idWZmICpza2I7CisJY29uc3Qgc3RydWN0IGkyNDAwbV90bHZfZGV0YWlsZWRfZGV2aWNlX2luZm8gKmRkaTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldiA9IGkyNDAwbS0+d2ltYXhfZGV2Lm5ldF9kZXY7CisJY29uc3QgdW5zaWduZWQgY2hhciB6ZXJvbWFjW0VUSF9BTEVOXSA9IHsgMCB9OworCisJZF9mbnN0YXJ0KDMsIGRldiwgIihpMjQwMG0gJXApXG4iLCBpMjQwMG0pOworCXNrYiA9IGkyNDAwbV9nZXRfZGV2aWNlX2luZm8oaTI0MDBtKTsKKwlpZiAoSVNfRVJSKHNrYikpIHsKKwkJcmVzdWx0ID0gUFRSX0VSUihza2IpOworCQlkZXZfZXJyKGRldiwgIkNhbm5vdCB2ZXJpZnkgTUFDIGFkZHJlc3MsIGVycm9yIHJlYWRpbmc6ICVkXG4iLAorCQkJcmVzdWx0KTsKKwkJZ290byBlcnJvcjsKKwl9CisJLyogRXh0cmFjdCBNQUMgYWRkcmVzc3MgKi8KKwlkZGkgPSAodm9pZCAqKSBza2ItPmRhdGE7CisJQlVJTERfQlVHX09OKEVUSF9BTEVOICE9IHNpemVvZihkZGktPm1hY19hZGRyZXNzKSk7CisJZF9wcmludGYoMiwgZGV2LCAiR0VUIERFVklDRSBJTkZPOiBtYWMgYWRkciAiCisJCSAiJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCisJCSBkZGktPm1hY19hZGRyZXNzWzBdLCBkZGktPm1hY19hZGRyZXNzWzFdLAorCQkgZGRpLT5tYWNfYWRkcmVzc1syXSwgZGRpLT5tYWNfYWRkcmVzc1szXSwKKwkJIGRkaS0+bWFjX2FkZHJlc3NbNF0sIGRkaS0+bWFjX2FkZHJlc3NbNV0pOworCWlmICghbWVtY21wKG5ldF9kZXYtPnBlcm1fYWRkciwgZGRpLT5tYWNfYWRkcmVzcywKKwkJICAgc2l6ZW9mKGRkaS0+bWFjX2FkZHJlc3MpKSkKKwkJZ290byBvazsKKwlkZXZfd2FybihkZXYsICJ3YXJuaW5nOiBkZXZpY2UgcmVwb3J0cyBhIGRpZmZlcmVudCBNQUMgYWRkcmVzcyAiCisJCSAidG8gdGhhdCBvZiBib290IG1vZGUnc1xuIik7CisJZGV2X3dhcm4oZGV2LCAiZGV2aWNlIHJlcG9ydHMgICAgICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAorCQkgZGRpLT5tYWNfYWRkcmVzc1swXSwgZGRpLT5tYWNfYWRkcmVzc1sxXSwKKwkJIGRkaS0+bWFjX2FkZHJlc3NbMl0sIGRkaS0+bWFjX2FkZHJlc3NbM10sCisJCSBkZGktPm1hY19hZGRyZXNzWzRdLCBkZGktPm1hY19hZGRyZXNzWzVdKTsKKwlkZXZfd2FybihkZXYsICJib290IG1vZGUgcmVwb3J0ZWQgJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCisJCSBuZXRfZGV2LT5wZXJtX2FkZHJbMF0sIG5ldF9kZXYtPnBlcm1fYWRkclsxXSwKKwkJIG5ldF9kZXYtPnBlcm1fYWRkclsyXSwgbmV0X2Rldi0+cGVybV9hZGRyWzNdLAorCQkgbmV0X2Rldi0+cGVybV9hZGRyWzRdLCBuZXRfZGV2LT5wZXJtX2FkZHJbNV0pOworCWlmICghbWVtY21wKHplcm9tYWMsIGRkaS0+bWFjX2FkZHJlc3MsIHNpemVvZih6ZXJvbWFjKSkpCisJCWRldl9lcnIoZGV2LCAiZGV2aWNlIHJlcG9ydHMgYW4gaW52YWxpZCBNQUMgYWRkcmVzcywgIgorCQkJIm5vdCB1cGRhdGluZ1xuIik7CisJZWxzZSB7CisJCWRldl93YXJuKGRldiwgInVwZGF0aW5nIE1BQyBhZGRyZXNzXG4iKTsKKwkJbmV0X2Rldi0+YWRkcl9sZW4gPSBFVEhfQUxFTjsKKwkJbWVtY3B5KG5ldF9kZXYtPnBlcm1fYWRkciwgZGRpLT5tYWNfYWRkcmVzcywgRVRIX0FMRU4pOworCQltZW1jcHkobmV0X2Rldi0+ZGV2X2FkZHIsIGRkaS0+bWFjX2FkZHJlc3MsIEVUSF9BTEVOKTsKKwl9CitvazoKKwlyZXN1bHQgPSAwOworCWtmcmVlX3NrYihza2IpOworZXJyb3I6CisJZF9mbmVuZCgzLCBkZXYsICIoaTI0MDBtICVwKSA9ICVkXG4iLCBpMjQwMG0sIHJlc3VsdCk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworCisvKioKKyAqIF9faTI0MDBtX2Rldl9zdGFydCAtIEJyaW5nIHVwIGRyaXZlciBjb21tdW5pY2F0aW9uIHdpdGggdGhlIGRldmljZQorICoKKyAqIEBpMjQwMG06IGRldmljZSBkZXNjcmlwdG9yCisgKiBAZmxhZ3M6IGJvb3QgbW9kZSBmbGFncworICoKKyAqIFJldHVybnM6IDAgaWYgb2ssIDwgMCBlcnJubyBjb2RlIG9uIGVycm9yLgorICoKKyAqIFVwbG9hZHMgZmlybXdhcmUgYW5kIGJyaW5ncyB1cCBhbGwgdGhlIHJlc291cmNlcyBuZWVkZWQgdG8gYmUgYWJsZQorICogdG8gY29tbXVuaWNhdGUgd2l0aCB0aGUgZGV2aWNlLgorICoKKyAqIFRYIG5lZWRzIHRvIGJlIHNldHVwIGJlZm9yZSB0aGUgYnVzLXNwZWNpZmljIGNvZGUgKG90aGVyd2lzZSBvbgorICogc2h1dGRvd24sIHRoZSBidXMtdHggY29kZSBjb3VsZCB0cnkgdG8gYWNjZXNzIGl0KS4KKyAqLworc3RhdGljCitpbnQgX19pMjQwMG1fZGV2X3N0YXJ0KHN0cnVjdCBpMjQwMG0gKmkyNDAwbSwgZW51bSBpMjQwMG1fYnJpIGZsYWdzKQoreworCWludCByZXN1bHQ7CisJc3RydWN0IHdpbWF4X2RldiAqd2ltYXhfZGV2ID0gJmkyNDAwbS0+d2ltYXhfZGV2OworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2ID0gd2ltYXhfZGV2LT5uZXRfZGV2OworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGkyNDAwbV9kZXYoaTI0MDBtKTsKKwlpbnQgdGltZXMgPSAzOworCisJZF9mbnN0YXJ0KDMsIGRldiwgIihpMjQwMG0gJXApXG4iLCBpMjQwMG0pOworcmV0cnk6CisJcmVzdWx0ID0gaTI0MDBtX2Rldl9ib290c3RyYXAoaTI0MDBtLCBmbGFncyk7CisJaWYgKHJlc3VsdCA8IDApIHsKKwkJZGV2X2VycihkZXYsICJjYW5ub3QgYm9vdHN0cmFwIGRldmljZTogJWRcbiIsIHJlc3VsdCk7CisJCWdvdG8gZXJyb3JfYm9vdHN0cmFwOworCX0KKwlyZXN1bHQgPSBpMjQwMG1fdHhfc2V0dXAoaTI0MDBtKTsKKwlpZiAocmVzdWx0IDwgMCkKKwkJZ290byBlcnJvcl90eF9zZXR1cDsKKwlyZXN1bHQgPSBpMjQwMG0tPmJ1c19kZXZfc3RhcnQoaTI0MDBtKTsKKwlpZiAocmVzdWx0IDwgMCkKKwkJZ290byBlcnJvcl9idXNfZGV2X3N0YXJ0OworCWkyNDAwbS0+d29ya19xdWV1ZSA9IGNyZWF0ZV9zaW5nbGV0aHJlYWRfd29ya3F1ZXVlKHdpbWF4X2Rldi0+bmFtZSk7CisJaWYgKGkyNDAwbS0+d29ya19xdWV1ZSA9PSBOVUxMKSB7CisJCXJlc3VsdCA9IC1FTk9NRU07CisJCWRldl9lcnIoZGV2LCAiY2Fubm90IGNyZWF0ZSB3b3JrcXVldWVcbiIpOworCQlnb3RvIGVycm9yX2NyZWF0ZV93b3JrcXVldWU7CisJfQorCS8qIEF0IHRoaXMgcG9pbnQgaXMgb2sgdG8gc2VuZCBjb21tYW5kcyB0byB0aGUgZGV2aWNlICovCisJcmVzdWx0ID0gaTI0MDBtX2NoZWNrX21hY19hZGRyKGkyNDAwbSk7CisJaWYgKHJlc3VsdCA8IDApCisJCWdvdG8gZXJyb3JfY2hlY2tfbWFjX2FkZHI7CisJaTI0MDBtLT5yZWFkeSA9IDE7CisJd2ltYXhfc3RhdGVfY2hhbmdlKHdpbWF4X2RldiwgV0lNQVhfU1RfVU5JTklUSUFMSVpFRCk7CisJcmVzdWx0ID0gaTI0MDBtX2Rldl9pbml0aWFsaXplKGkyNDAwbSk7CisJaWYgKHJlc3VsdCA8IDApCisJCWdvdG8gZXJyb3JfZGV2X2luaXRpYWxpemU7CisJLyogQXQgdGhpcyBwb2ludCwgcmVwb3J0cyB3aWxsIGNvbWUgZm9yIHRoZSBkZXZpY2UgYW5kIHNldCBpdAorCSAqIHRvIHRoZSByaWdodCBzdGF0ZSBpZiBpdCBpcyBkaWZmZXJlbnQgdGhhbiBVTklOSVRJQUxJWkVEICovCisJZF9mbmVuZCgzLCBkZXYsICIobmV0X2RldiAlcCBbaTI0MDBtICVwXSkgPSAlZFxuIiwKKwkJbmV0X2RldiwgaTI0MDBtLCByZXN1bHQpOworCXJldHVybiByZXN1bHQ7CisKK2Vycm9yX2Rldl9pbml0aWFsaXplOgorZXJyb3JfY2hlY2tfbWFjX2FkZHI6CisJZGVzdHJveV93b3JrcXVldWUoaTI0MDBtLT53b3JrX3F1ZXVlKTsKK2Vycm9yX2NyZWF0ZV93b3JrcXVldWU6CisJaTI0MDBtLT5idXNfZGV2X3N0b3AoaTI0MDBtKTsKK2Vycm9yX2J1c19kZXZfc3RhcnQ6CisJaTI0MDBtX3R4X3JlbGVhc2UoaTI0MDBtKTsKK2Vycm9yX3R4X3NldHVwOgorZXJyb3JfYm9vdHN0cmFwOgorCWlmIChyZXN1bHQgPT0gLUVSRVNUQVJUU1lTICYmIHRpbWVzLS0gPiAwKSB7CisJCWZsYWdzID0gSTI0MDBNX0JSSV9TT0ZUOworCQlnb3RvIHJldHJ5OworCX0KKwlkX2ZuZW5kKDMsIGRldiwgIihuZXRfZGV2ICVwIFtpMjQwMG0gJXBdKSA9ICVkXG4iLAorCQluZXRfZGV2LCBpMjQwMG0sIHJlc3VsdCk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworCitzdGF0aWMKK2ludCBpMjQwMG1fZGV2X3N0YXJ0KHN0cnVjdCBpMjQwMG0gKmkyNDAwbSwgZW51bSBpMjQwMG1fYnJpIGJtX2ZsYWdzKQoreworCWludCByZXN1bHQ7CisJbXV0ZXhfbG9jaygmaTI0MDBtLT5pbml0X211dGV4KTsJLyogV2VsbCwgc3RhcnQgdGhlIGRldmljZSAqLworCXJlc3VsdCA9IF9faTI0MDBtX2Rldl9zdGFydChpMjQwMG0sIGJtX2ZsYWdzKTsKKwlpZiAocmVzdWx0ID49IDApCisJCWkyNDAwbS0+dXBkb3duID0gMTsKKwltdXRleF91bmxvY2soJmkyNDAwbS0+aW5pdF9tdXRleCk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworCisvKioKKyAqIGkyNDAwbV9kZXZfc3RvcCAtIFRlYXIgZG93biBkcml2ZXIgY29tbXVuaWNhdGlvbiB3aXRoIHRoZSBkZXZpY2UKKyAqCisgKiBAaTI0MDBtOiBkZXZpY2UgZGVzY3JpcHRvcgorICoKKyAqIFJldHVybnM6IDAgaWYgb2ssIDwgMCBlcnJubyBjb2RlIG9uIGVycm9yLgorICoKKyAqIFJlbGVhc2VzIGFsbCB0aGUgcmVzb3VyY2VzIGFsbG9jYXRlZCB0byBjb21tdW5pY2F0ZSB3aXRoIHRoZSBkZXZpY2UuCisgKi8KK3N0YXRpYwordm9pZCBfX2kyNDAwbV9kZXZfc3RvcChzdHJ1Y3QgaTI0MDBtICppMjQwMG0pCit7CisJc3RydWN0IHdpbWF4X2RldiAqd2ltYXhfZGV2ID0gJmkyNDAwbS0+d2ltYXhfZGV2OworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGkyNDAwbV9kZXYoaTI0MDBtKTsKKworCWRfZm5zdGFydCgzLCBkZXYsICIoaTI0MDBtICVwKVxuIiwgaTI0MDBtKTsKKwl3aW1heF9zdGF0ZV9jaGFuZ2Uod2ltYXhfZGV2LCBfX1dJTUFYX1NUX1FVSUVTQ0lORyk7CisJaTI0MDBtX2Rldl9zaHV0ZG93bihpMjQwMG0pOworCWkyNDAwbS0+cmVhZHkgPSAwOworCWRlc3Ryb3lfd29ya3F1ZXVlKGkyNDAwbS0+d29ya19xdWV1ZSk7CisJaTI0MDBtLT5idXNfZGV2X3N0b3AoaTI0MDBtKTsKKwlpMjQwMG1fdHhfcmVsZWFzZShpMjQwMG0pOworCXdpbWF4X3N0YXRlX2NoYW5nZSh3aW1heF9kZXYsIFdJTUFYX1NUX0RPV04pOworCWRfZm5lbmQoMywgZGV2LCAiKGkyNDAwbSAlcCkgPSAwXG4iLCBpMjQwMG0pOworfQorCisKKy8qCisgKiBXYXRjaCBvdXQgLS0gd2Ugb25seSBuZWVkIHRvIHN0b3AgaWYgdGhlcmUgaXMgYSBuZWVkIGZvciBpdC4gVGhlCisgKiBkZXZpY2UgY291bGQgaGF2ZSByZXNldCBpdHNlbGYgYW5kIGZhaWxlZCB0byBjb21lIHVwIGFnYWluIChzZWUKKyAqIF9pMjQwMG1fZGV2X3Jlc2V0X2hhbmRsZSgpKS4KKyAqLworc3RhdGljCit2b2lkIGkyNDAwbV9kZXZfc3RvcChzdHJ1Y3QgaTI0MDBtICppMjQwMG0pCit7CisJbXV0ZXhfbG9jaygmaTI0MDBtLT5pbml0X211dGV4KTsKKwlpZiAoaTI0MDBtLT51cGRvd24pIHsKKwkJX19pMjQwMG1fZGV2X3N0b3AoaTI0MDBtKTsKKwkJaTI0MDBtLT51cGRvd24gPSAwOworCX0KKwltdXRleF91bmxvY2soJmkyNDAwbS0+aW5pdF9tdXRleCk7Cit9CisKKworLyoKKyAqIFRoZSBkZXZpY2UgaGFzIHJlYm9vdGVkOyBmaXggdXAgdGhlIGRldmljZSBhbmQgdGhlIGRyaXZlcgorICoKKyAqIFRlYXIgZG93biB0aGUgZHJpdmVyIGNvbW11bmljYXRpb24gd2l0aCB0aGUgZGV2aWNlLCByZWxvYWQgdGhlCisgKiBmaXJtd2FyZSBhbmQgcmVpbml0aWFsaXplIHRoZSBjb21tdW5pY2F0aW9uIHdpdGggdGhlIGRldmljZS4KKyAqCisgKiBJZiBzb21lb25lIGNhbGxzIGEgcmVzZXQgd2hlbiB0aGUgZGV2aWNlJ3MgZmlybXdhcmUgaXMgZG93biwgaW4KKyAqIHRoZW9yeSB3ZSB3b24ndCBzZWUgaXQgYmVjYXVzZSB3ZSBhcmUgbm90IGxpc3RlbmluZy4gSG93ZXZlciwganVzdAorICogaW4gY2FzZSwgbGVhdmUgdGhlIGNvZGUgdG8gaGFuZGxlIGl0LgorICoKKyAqIElmIHRoZXJlIGlzIGEgcmVzZXQgY29udGV4dCwgdXNlIGl0OyB0aGlzIG1lYW5zIHNvbWVvbmUgaXMgd2FpdGluZworICogZm9yIHVzIHRvIHRlbGwgaGltIHdoZW4gdGhlIHJlc2V0IG9wZXJhdGlvbiBpcyBjb21wbGV0ZSBhbmQgdGhlCisgKiBkZXZpY2UgaXMgcmVhZHkgdG8gcm9jayBhZ2Fpbi4KKyAqCisgKiBOT1RFOiBpZiB3ZSBhcmUgaW4gdGhlIHByb2Nlc3Mgb2YgYnJpbmdpbmcgdXAgb3IgZG93biB0aGUKKyAqICAgICAgIGNvbW11bmljYXRpb24gd2l0aCB0aGUgZGV2aWNlIFtydW5uaW5nIGkyNDAwbV9kZXZfc3RhcnQoKSBvcgorICogICAgICAgX3N0b3AoKV0sIGRvbid0IGRvIGFueXRoaW5nLCBsZXQgaXQgZmFpbCBhbmQgaGFuZGxlIGl0LgorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgcmFuIGFsd2F5cyBpbiBhIHRocmVhZCBjb250ZXh0CisgKi8KK3N0YXRpYwordm9pZCBfX2kyNDAwbV9kZXZfcmVzZXRfaGFuZGxlKHN0cnVjdCB3b3JrX3N0cnVjdCAqd3MpCit7CisJaW50IHJlc3VsdDsKKwlzdHJ1Y3QgaTI0MDBtX3dvcmsgKml3ID0gY29udGFpbmVyX29mKHdzLCBzdHJ1Y3QgaTI0MDBtX3dvcmssIHdzKTsKKwlzdHJ1Y3QgaTI0MDBtICppMjQwMG0gPSBpdy0+aTI0MDBtOworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGkyNDAwbV9kZXYoaTI0MDBtKTsKKwllbnVtIHdpbWF4X3N0IHdpbWF4X3N0YXRlOworCXN0cnVjdCBpMjQwMG1fcmVzZXRfY3R4ICpjdHggPSBpMjQwMG0tPnJlc2V0X2N0eDsKKworCWRfZm5zdGFydCgzLCBkZXYsICIod3MgJXAgaTI0MDBtICVwKVxuIiwgd3MsIGkyNDAwbSk7CisJcmVzdWx0ID0gMDsKKwlpZiAobXV0ZXhfdHJ5bG9jaygmaTI0MDBtLT5pbml0X211dGV4KSA9PSAwKSB7CisJCS8qIFdlIGFyZSBzdGlsbCBpbiBpMjQwMG1fZGV2X3N0YXJ0KCkgW2xldCBpdCBmYWlsXSBvcgorCQkgKiBpMjQwMG1fZGV2X3N0b3AoKSBbd2UgYXJlIHNodXR0aW5nIGRvd24gYW55d2F5LCBzbworCQkgKiBpZ25vcmUgaXRdIG9yIHdlIGFyZSByZXNldHRpbmcgc29tZXdoZXJlIGVsc2UuICovCisJCWRldl9lcnIoZGV2LCAiZGV2aWNlIHJlYm9vdGVkXG4iKTsKKwkJaTI0MDBtX21zZ190b19kZXZfY2FuY2VsX3dhaXQoaTI0MDBtLCAtRVJFU1RBUlRTWVMpOworCQljb21wbGV0ZSgmaTI0MDBtLT5tc2dfY29tcGxldGlvbik7CisJCWdvdG8gb3V0OworCX0KKwl3aW1heF9zdGF0ZSA9IHdpbWF4X3N0YXRlX2dldCgmaTI0MDBtLT53aW1heF9kZXYpOworCWlmICh3aW1heF9zdGF0ZSA8IFdJTUFYX1NUX1VOSU5JVElBTElaRUQpIHsKKwkJZGV2X2luZm8oZGV2LCAiZGV2aWNlIHJlYm9vdGVkOiBpdCBpcyBkb3duLCBpZ25vcmluZ1xuIik7CisJCWdvdG8gb3V0X3VubG9jazsJLyogaWZjb25maWcgdXAvZG93biB3YXNuJ3QgY2FsbGVkICovCisJfQorCWRldl9lcnIoZGV2LCAiZGV2aWNlIHJlYm9vdGVkOiByZWluaXRpYWxpemluZyBkcml2ZXJcbiIpOworCV9faTI0MDBtX2Rldl9zdG9wKGkyNDAwbSk7CisJaTI0MDBtLT51cGRvd24gPSAwOworCXJlc3VsdCA9IF9faTI0MDBtX2Rldl9zdGFydChpMjQwMG0sCisJCQkJICAgIEkyNDAwTV9CUklfU09GVCB8IEkyNDAwTV9CUklfTUFDX1JFSU5JVCk7CisJaWYgKHJlc3VsdCA8IDApIHsKKwkJZGV2X2VycihkZXYsICJkZXZpY2UgcmVib290OiBjYW5ub3Qgc3RhcnQgdGhlIGRldmljZTogJWRcbiIsCisJCQlyZXN1bHQpOworCQlyZXN1bHQgPSBpMjQwMG0tPmJ1c19yZXNldChpMjQwMG0sIEkyNDAwTV9SVF9CVVMpOworCQlpZiAocmVzdWx0ID49IDApCisJCQlyZXN1bHQgPSAtRU5PREVWOworCX0gZWxzZQorCQlpMjQwMG0tPnVwZG93biA9IDE7CitvdXRfdW5sb2NrOgorCWlmIChpMjQwMG0tPnJlc2V0X2N0eCkgeworCQljdHgtPnJlc3VsdCA9IHJlc3VsdDsKKwkJY29tcGxldGUoJmN0eC0+Y29tcGxldGlvbik7CisJfQorCW11dGV4X3VubG9jaygmaTI0MDBtLT5pbml0X211dGV4KTsKK291dDoKKwlpMjQwMG1fcHV0KGkyNDAwbSk7CisJa2ZyZWUoaXcpOworCWRfZm5lbmQoMywgZGV2LCAiKHdzICVwIGkyNDAwbSAlcCkgPSB2b2lkXG4iLCB3cywgaTI0MDBtKTsKKwlyZXR1cm47Cit9CisKKworLyoqCisgKiBpMjQwMG1fZGV2X3Jlc2V0X2hhbmRsZSAtIEhhbmRsZSBhIGRldmljZSdzIHJlc2V0IGluIGEgdGhyZWFkIGNvbnRleHQKKyAqCisgKiBTY2hlZHVsZSBhIGRldmljZSByZXNldCBoYW5kbGluZyBvdXQgb24gYSB0aHJlYWQgY29udGV4dCwgc28gaXQKKyAqIGlzIHNhZmUgdG8gY2FsbCBmcm9tIGF0b21pYyBjb250ZXh0LiBXZSBjYW4ndCB1c2UgdGhlIGkyNDAwbSdzCisgKiBxdWV1ZSBhcyB3ZSBhcmUgZ29pbmcgdG8gZGVzdHJveSBpdCBhbmQgcmVpbml0aWFsaXplIGl0IGFzIHBhcnQgb2YKKyAqIHRoZSBkcml2ZXIgYnJpbmd1cC9icmluZ3VwIHByb2Nlc3MuCisgKgorICogU2VlIF9faTI0MDBtX2Rldl9yZXNldF9oYW5kbGUoKSBmb3IgZGV0YWlsczsgdGhhdCB0YWtlcyBjYXJlIG9mCisgKiByZWluaXRpYWxpemluZyB0aGUgZHJpdmVyIHRvIGhhbmRsZSB0aGUgcmVzZXQsIGNhbGxpbmcgaW50byB0aGUKKyAqIGJ1cy1zcGVjaWZpYyBmdW5jdGlvbnMgb3BzIGFzIG5lZWRlZC4KKyAqLworaW50IGkyNDAwbV9kZXZfcmVzZXRfaGFuZGxlKHN0cnVjdCBpMjQwMG0gKmkyNDAwbSkKK3sKKwlyZXR1cm4gaTI0MDBtX3NjaGVkdWxlX3dvcmsoaTI0MDBtLCBfX2kyNDAwbV9kZXZfcmVzZXRfaGFuZGxlLAorCQkJCSAgICBHRlBfQVRPTUlDKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGkyNDAwbV9kZXZfcmVzZXRfaGFuZGxlKTsKKworCisvKioKKyAqIGkyNDAwbV9zZXR1cCAtIGJ1cy1nZW5lcmljIHNldHVwIGZ1bmN0aW9uIGZvciB0aGUgaTI0MDBtIGRldmljZQorICoKKyAqIEBpMjQwMG06IGRldmljZSBkZXNjcmlwdG9yIChidXMtc3BlY2lmaWMgcGFydHMgaGF2ZSBiZWVuIGluaXRpYWxpemVkKQorICoKKyAqIFJldHVybnM6IDAgaWYgb2ssIDwgMCBlcnJubyBjb2RlIG9uIGVycm9yLgorICoKKyAqIEluaXRpYWxpemVzIHRoZSBidXMtZ2VuZXJpYyBwYXJ0cyBvZiB0aGUgaTI0MDBtIGRyaXZlcjsgdGhlCisgKiBidXMtc3BlY2lmaWMgcGFydHMgaGF2ZSBiZWVuIGluaXRpYWxpemVkLCBmdW5jdGlvbiBwb2ludGVycyBmaWxsZWQKKyAqIG91dCBieSB0aGUgYnVzLXNwZWNpZmljIHByb2JlIGZ1bmN0aW9uLgorICoKKyAqIEFzIHdlbGwsIHRoaXMgcmVnaXN0ZXJzIHRoZSBXaU1BWCBhbmQgbmV0IGRldmljZSBub2Rlcy4gT25jZSB0aGlzCisgKiBmdW5jdGlvbiByZXR1cm5zLCB0aGUgZGV2aWNlIGlzIG9wZXJhdGl2ZSBhbmQgaGFzIHRvIGJlIHJlYWR5IHRvCisgKiByZWNlaXZlIGFuZCBzZW5kIG5ldHdvcmsgdHJhZmZpYyBhbmQgV2lNQVggY29udHJvbCBvcGVyYXRpb25zLgorICovCitpbnQgaTI0MDBtX3NldHVwKHN0cnVjdCBpMjQwMG0gKmkyNDAwbSwgZW51bSBpMjQwMG1fYnJpIGJtX2ZsYWdzKQoreworCWludCByZXN1bHQgPSAtRU5PREVWOworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGkyNDAwbV9kZXYoaTI0MDBtKTsKKwlzdHJ1Y3Qgd2ltYXhfZGV2ICp3aW1heF9kZXYgPSAmaTI0MDBtLT53aW1heF9kZXY7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYgPSBpMjQwMG0tPndpbWF4X2Rldi5uZXRfZGV2OworCisJZF9mbnN0YXJ0KDMsIGRldiwgIihpMjQwMG0gJXApXG4iLCBpMjQwMG0pOworCisJc25wcmludGYod2ltYXhfZGV2LT5uYW1lLCBzaXplb2Yod2ltYXhfZGV2LT5uYW1lKSwKKwkJICJpMjQwMG0tJXM6JXMiLCBkZXYtPmJ1cy0+bmFtZSwgZGV2LT5idXNfaWQpOworCisJaTI0MDBtLT5ibV9jbWRfYnVmID0ga3phbGxvYyhJMjQwME1fQk1fQ01EX0JVRl9TSVpFLCBHRlBfS0VSTkVMKTsKKwlpZiAoaTI0MDBtLT5ibV9jbWRfYnVmID09IE5VTEwpIHsKKwkJZGV2X2VycihkZXYsICJjYW5ub3QgYWxsb2NhdGUgVVNCIGNvbW1hbmQgYnVmZmVyXG4iKTsKKwkJZ290byBlcnJvcl9ibV9jbWRfa3phbGxvYzsKKwl9CisJaTI0MDBtLT5ibV9hY2tfYnVmID0ga3phbGxvYyhJMjQwME1fQk1fQUNLX0JVRl9TSVpFLCBHRlBfS0VSTkVMKTsKKwlpZiAoaTI0MDBtLT5ibV9hY2tfYnVmID09IE5VTEwpIHsKKwkJZGV2X2VycihkZXYsICJjYW5ub3QgYWxsb2NhdGUgVVNCIGFjayBidWZmZXJcbiIpOworCQlnb3RvIGVycm9yX2JtX2Fja19idWZfa3phbGxvYzsKKwl9CisJcmVzdWx0ID0gaTI0MDBtX2Jvb3Ryb21faW5pdChpMjQwMG0sIGJtX2ZsYWdzKTsKKwlpZiAocmVzdWx0IDwgMCkgeworCQlkZXZfZXJyKGRldiwgInJlYWQgbWFjIGFkZHI6IGJvb3Ryb20gaW5pdCAiCisJCQkiZmFpbGVkOiAlZFxuIiwgcmVzdWx0KTsKKwkJZ290byBlcnJvcl9ib290cm9tX2luaXQ7CisJfQorCXJlc3VsdCA9IGkyNDAwbV9yZWFkX21hY19hZGRyKGkyNDAwbSk7CisJaWYgKHJlc3VsdCA8IDApCisJCWdvdG8gZXJyb3JfcmVhZF9tYWNfYWRkcjsKKworCXJlc3VsdCA9IHJlZ2lzdGVyX25ldGRldihuZXRfZGV2KTsJLyogT2tleSBkb2tleSwgYnJpbmcgaXQgdXAgKi8KKwlpZiAocmVzdWx0IDwgMCkgeworCQlkZXZfZXJyKGRldiwgImNhbm5vdCByZWdpc3RlciBpMjQwMG0gbmV0d29yayBkZXZpY2U6ICVkXG4iLAorCQkJcmVzdWx0KTsKKwkJZ290byBlcnJvcl9yZWdpc3Rlcl9uZXRkZXY7CisJfQorCW5ldGlmX2NhcnJpZXJfb2ZmKG5ldF9kZXYpOworCisJcmVzdWx0ID0gaTI0MDBtX2Rldl9zdGFydChpMjQwMG0sIGJtX2ZsYWdzKTsKKwlpZiAocmVzdWx0IDwgMCkKKwkJZ290byBlcnJvcl9kZXZfc3RhcnQ7CisKKwlpMjQwMG0tPndpbWF4X2Rldi5vcF9tc2dfZnJvbV91c2VyID0gaTI0MDBtX29wX21zZ19mcm9tX3VzZXI7CisJaTI0MDBtLT53aW1heF9kZXYub3BfcmZraWxsX3N3X3RvZ2dsZSA9IGkyNDAwbV9vcF9yZmtpbGxfc3dfdG9nZ2xlOworCWkyNDAwbS0+d2ltYXhfZGV2Lm9wX3Jlc2V0ID0gaTI0MDBtX29wX3Jlc2V0OworCXJlc3VsdCA9IHdpbWF4X2Rldl9hZGQoJmkyNDAwbS0+d2ltYXhfZGV2LCBuZXRfZGV2KTsKKwlpZiAocmVzdWx0IDwgMCkKKwkJZ290byBlcnJvcl93aW1heF9kZXZfYWRkOworCS8qIFVzZXIgc3BhY2UgbmVlZHMgdG8gZG8gc29tZSBpbml0IHN0dWZmICovCisJd2ltYXhfc3RhdGVfY2hhbmdlKHdpbWF4X2RldiwgV0lNQVhfU1RfVU5JTklUSUFMSVpFRCk7CisKKwkvKiBOb3cgc2V0dXAgYWxsIHRoYXQgcmVxdWlyZXMgYSByZWdpc3RlcmVkIG5ldCBhbmQgd2ltYXggZGV2aWNlLiAqLworCXJlc3VsdCA9IGkyNDAwbV9kZWJ1Z2ZzX2FkZChpMjQwMG0pOworCWlmIChyZXN1bHQgPCAwKSB7CisJCWRldl9lcnIoZGV2LCAiY2Fubm90IHNldHVwIGkyNDAwbSdzIGRlYnVnZnM6ICVkXG4iLCByZXN1bHQpOworCQlnb3RvIGVycm9yX2RlYnVnZnNfc2V0dXA7CisJfQorCWRfZm5lbmQoMywgZGV2LCAiKGkyNDAwbSAlcCkgPSAlZFxuIiwgaTI0MDBtLCByZXN1bHQpOworCXJldHVybiByZXN1bHQ7CisKK2Vycm9yX2RlYnVnZnNfc2V0dXA6CisJd2ltYXhfZGV2X3JtKCZpMjQwMG0tPndpbWF4X2Rldik7CitlcnJvcl93aW1heF9kZXZfYWRkOgorCWkyNDAwbV9kZXZfc3RvcChpMjQwMG0pOworZXJyb3JfZGV2X3N0YXJ0OgorCXVucmVnaXN0ZXJfbmV0ZGV2KG5ldF9kZXYpOworZXJyb3JfcmVnaXN0ZXJfbmV0ZGV2OgorZXJyb3JfcmVhZF9tYWNfYWRkcjoKK2Vycm9yX2Jvb3Ryb21faW5pdDoKKwlrZnJlZShpMjQwMG0tPmJtX2Fja19idWYpOworZXJyb3JfYm1fYWNrX2J1Zl9remFsbG9jOgorCWtmcmVlKGkyNDAwbS0+Ym1fY21kX2J1Zik7CitlcnJvcl9ibV9jbWRfa3phbGxvYzoKKwlkX2ZuZW5kKDMsIGRldiwgIihpMjQwMG0gJXApID0gJWRcbiIsIGkyNDAwbSwgcmVzdWx0KTsKKwlyZXR1cm4gcmVzdWx0OworfQorRVhQT1JUX1NZTUJPTF9HUEwoaTI0MDBtX3NldHVwKTsKKworCisvKioKKyAqIGkyNDAwbV9yZWxlYXNlIC0gcmVsZWFzZSB0aGUgYnVzLWdlbmVyaWMgZHJpdmVyIHJlc291cmNlcworICoKKyAqIFNlbmRzIGEgZGlzY29ubmVjdCBtZXNzYWdlIGFuZCB1bmRvZXMgYW55IHNldHVwIGRvbmUgYnkgaTI0MDBtX3NldHVwKCkKKyAqLwordm9pZCBpMjQwMG1fcmVsZWFzZShzdHJ1Y3QgaTI0MDBtICppMjQwMG0pCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gaTI0MDBtX2RldihpMjQwMG0pOworCisJZF9mbnN0YXJ0KDMsIGRldiwgIihpMjQwMG0gJXApXG4iLCBpMjQwMG0pOworCW5ldGlmX3N0b3BfcXVldWUoaTI0MDBtLT53aW1heF9kZXYubmV0X2Rldik7CisKKwlpMjQwMG1fZGVidWdmc19ybShpMjQwMG0pOworCXdpbWF4X2Rldl9ybSgmaTI0MDBtLT53aW1heF9kZXYpOworCWkyNDAwbV9kZXZfc3RvcChpMjQwMG0pOworCXVucmVnaXN0ZXJfbmV0ZGV2KGkyNDAwbS0+d2ltYXhfZGV2Lm5ldF9kZXYpOworCWtmcmVlKGkyNDAwbS0+Ym1fYWNrX2J1Zik7CisJa2ZyZWUoaTI0MDBtLT5ibV9jbWRfYnVmKTsKKwlkX2ZuZW5kKDMsIGRldiwgIihpMjQwMG0gJXApID0gdm9pZFxuIiwgaTI0MDBtKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGkyNDAwbV9yZWxlYXNlKTsKKworCitzdGF0aWMKK2ludCBfX2luaXQgaTI0MDBtX2RyaXZlcl9pbml0KHZvaWQpCit7CisJcmV0dXJuIDA7Cit9Cittb2R1bGVfaW5pdChpMjQwMG1fZHJpdmVyX2luaXQpOworCitzdGF0aWMKK3ZvaWQgX19leGl0IGkyNDAwbV9kcml2ZXJfZXhpdCh2b2lkKQoreworCS8qIGZvciBzY2hlZHMgaTI0MDBtX2Rldl9yZXNldF9oYW5kbGUoKSAqLworCWZsdXNoX3NjaGVkdWxlZF93b3JrKCk7CisJcmV0dXJuOworfQorbW9kdWxlX2V4aXQoaTI0MDBtX2RyaXZlcl9leGl0KTsKKworTU9EVUxFX0FVVEhPUigiSW50ZWwgQ29ycG9yYXRpb24gPGxpbnV4LXdpbWF4QGludGVsLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiSW50ZWwgMjQwME0gV2lNQVggbmV0d29ya2luZyBidXMtZ2VuZXJpYyBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpbWF4L2kyNDAwbS9mdy5jIGIvZHJpdmVycy9uZXQvd2ltYXgvaTI0MDBtL2Z3LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQ4MjcxZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpbWF4L2kyNDAwbS9mdy5jCkBAIC0wLDAgKzEsMTA5NSBAQAorLyoKKyAqIEludGVsIFdpcmVsZXNzIFdpTUFYIENvbm5lY3Rpb24gMjQwMG0KKyAqIEZpcm13YXJlIHVwbG9hZGVyCisgKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgICBkaXN0cmlidXRpb24uCisgKiAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqCisgKiBJbnRlbCBDb3Jwb3JhdGlvbiA8bGludXgtd2ltYXhAaW50ZWwuY29tPgorICogWWFuaXIgTHViZXRraW4gPHlhbmlyeC5sdWJldGtpbkBpbnRlbC5jb20+CisgKiBJbmFreSBQZXJlei1Hb256YWxleiA8aW5ha3kucGVyZXotZ29uemFsZXpAaW50ZWwuY29tPgorICogIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbgorICoKKyAqCisgKiBUSEUgUFJPQ0VEVVJFCisgKgorICogKHRoaXMgaXMgZGVjcmliZWQgZm9yIFVTQiwgYnV0IGZvciBTRElPIGlzIHNpbWlsYXIpCisgKgorICogVGhlIDI0MDBtIHdvcmtzIGluIHR3byBtb2RlczogYm9vdC1tb2RlIG9yIG5vcm1hbCBtb2RlLiBJbiBib290CisgKiBtb2RlIHdlIGNhbiBleGVjdXRlIG9ubHkgYSBoYW5kZnVsIG9mIGNvbW1hbmRzIHRhcmdldGVkIGF0CisgKiB1cGxvYWRpbmcgdGhlIGZpcm13YXJlIGFuZCBsYXVuY2hpbmcgaXQuCisgKgorICogVGhlIDI0MDBtIGVudGVycyBib290IG1vZGUgd2hlbiBpdCBpcyBmaXJzdCBjb25uZWN0ZWQgdG8gdGhlCisgKiBzeXN0ZW0sIHdoZW4gaXQgY3Jhc2hlcyBhbmQgd2hlbiB5b3UgYXNrIGl0IHRvIHJlYm9vdC4gVGhlcmUgYXJlCisgKiB0d28gc3VibW9kZXMgb2YgdGhlIGJvb3QgbW9kZTogc2lnbmVkIGFuZCBub24tc2lnbmVkLiBTaWduZWQgdGFrZXMKKyAqIGZpcm13YXJlcyBzaWduZWQgd2l0aCBhIGNlcnRhaW4gcHJpdmF0ZSBrZXksIG5vbi1zaWduZWQgdGFrZXMgYW55CisgKiBmaXJtd2FyZS4gTm9ybWFsIGhhcmR3YXJlIHRha2VzIG9ubHkgc2lnbmVkIGZpcm13YXJlLgorICoKKyAqIFVwb24gZW50cmFuY2UgdG8gYm9vdCBtb2RlLCB0aGUgZGV2aWNlIHNlbmRzIGEgZmV3IHplcm8gbGVuZ3RoCisgKiBwYWNrZXRzIChaTFBzKSBvbiB0aGUgbm90aWZpY2F0aW9uIGVuZHBvaW50LCB0aGVuIGEgcmVib290IGJhcmtlcgorICogKDQgbGUzMiB3b3JkcyB3aXRoIHZhbHVlIEkyNDAwTV97UyxOfUJPT1RfQkFSS0VSKS4gV2UgYWNrIGl0IGJ5CisgKiBzZW5kaW5nIHRoZSBzYW1lIGJhcmtlciBvbiB0aGUgYnVsayBvdXQgZW5kcG9pbnQuIFRoZSBkZXZpY2UgYWNrcworICogd2l0aCBhIHJlYm9vdCBhY2sgYmFya2VyICg0IGxlMzIgd29yZHMgd2l0aCB2YWx1ZSAweGZlZWRiYWJlKSBhbmQKKyAqIHRoZW4gdGhlIGRldmljZSBpcyBmdWxseSByZWJvb3RlZC4gQXQgdGhpcyBwb2ludCB3ZSBjYW4gdXBsb2FkIHRoZQorICogZmlybXdhcmUuCisgKgorICogVGhpcyBwcm9jZXNzIGlzIGFjY29tcGxpc2hlZCBieSB0aGUgaTI0MDBtX2Jvb3Ryb21faW5pdCgpCisgKiBmdW5jdGlvbi4gQWxsIHRoZSBkZXZpY2UgaW50ZXJhY3Rpb24gaGFwcGVucyB0aHJvdWdoIHRoZQorICogaTI0MDBtX2JtX2NtZCgpIFtib290IG1vZGUgY29tbWFuZF0uIFNwZWNpYWwgcmV0dXJuIHZhbHVlcyB3aWxsCisgKiBpbmRpY2F0ZSBpZiB0aGUgZGV2aWNlIHJlc2V0cy4KKyAqCisgKiBBZnRlciB0aGlzLCB3ZSByZWFkIHRoZSBNQUMgYWRkcmVzcyBhbmQgdGhlbiAoaWYgbmVlZGVkKQorICogcmVpbml0aWFsaXplIHRoZSBkZXZpY2UuIFdlIG5lZWQgdG8gcmVhZCBpdCBhaGVhZCBvZiB0aW1lIGJlY2F1c2UKKyAqIGluIHRoZSBmdXR1cmUsIHdlIG1pZ2h0IG5vdCB1cGxvYWQgdGhlIGZpcm13YXJlIHVudGlsIHVzZXJzcGFjZQorICogJ2lmY29uZmlnIHVwJ3MgdGhlIGRldmljZS4KKyAqCisgKiBXZSBjYW4gdGhlbiB1cGxvYWQgdGhlIGZpcm13YXJlIGZpbGUuIFRoZSBmaWxlIGlzIGNvbXBvc2VkIG9mIGEgQkNGCisgKiBoZWFkZXIgKGJhc2ljIGRhdGEsIGtleXMgYW5kIHNpZ25hdHVyZXMpIGFuZCBhIGxpc3Qgb2Ygd3JpdGUKKyAqIGNvbW1hbmRzIGFuZCBwYXlsb2Fkcy4gV2UgZmlyc3QgdXBsb2FkIHRoZSBoZWFkZXIKKyAqIFtpMjQwMG1fZG5sb2FkX2luaXQoKV0gYW5kIHRoZW4gcGFzcyB0aGUgY29tbWFuZHMgYW5kIHBheWxvYWRzCisgKiB2ZXJiYXRpbSB0byB0aGUgaTI0MDBtX2JtX2NtZCgpIGZ1bmN0aW9uCisgKiBbaTI0MDBtX2RubG9hZF9iY2YoKV0uIFRoZW4gd2UgdGVsbCB0aGUgZGV2aWNlIHRvIGp1bXAgdG8gdGhlIG5ldworICogZmlybXdhcmUgW2kyNDAwbV9kbmxvYWRfZmluYWxpemUoKV0uCisgKgorICogT25jZSBmaXJtd2FyZSBpcyB1cGxvYWRlZCwgd2UgYXJlIGdvb2QgdG8gZ28gOikKKyAqCisgKiBXaGVuIHdlIGRvbid0IGtub3cgaW4gd2hpY2ggbW9kZSB3ZSBhcmUsIHdlIGZpcnN0IHRyeSBieSBzZW5kaW5nIGEKKyAqIHdhcm0gcmVzZXQgcmVxdWVzdCB0aGF0IHdpbGwgdGFrZSB1cyB0byBib290LW1vZGUuIElmIHdlIHRpbWUgb3V0CisgKiB3YWl0aW5nIGZvciBhIHJlYm9vdCBiYXJrZXIsIHRoYXQgbWVhbnMgbWF5YmUgd2UgYXJlIGFscmVhZHkgaW4KKyAqIGJvb3QgbW9kZSwgc28gd2Ugc2VuZCBhIHJlYm9vdCBiYXJrZXIuCisgKgorICogQ09NTUFORCBFWEVDVVRJT04KKyAqCisgKiBUaGlzIGNvZGUgKGFuZCBwcm9jZXNzKSBpcyBzaW5nbGUgdGhyZWFkZWQ7IGZvciBleGVjdXRpbmcgY29tbWFuZHMsCisgKiB3ZSBwb3N0IGEgVVJCIHRvIHRoZSBub3RpZmljYXRpb24gZW5kcG9pbnQsIHBvc3QgdGhlIGNvbW1hbmQsIHdhaXQKKyAqIGZvciBkYXRhIG9uIHRoZSBub3RpZmljYXRpb24gYnVmZmVyLiBXZSBkb24ndCBuZWVkIHRvIHdvcnJ5IGFib3V0CisgKiBvdGhlcnMgYXMgd2Uga25vdyB3ZSBhcmUgdGhlIG9ubHkgb25lcyBpbiB0aGVyZS4KKyAqCisgKiBCQUNLRU5EIElNUExFTUVOVEFUSU9OCisgKgorICogVGhpcyBjb2RlIGlzIGJ1cy1nZW5lcmljOyB0aGUgYnVzLXNwZWNpZmljIGRyaXZlciBwcm92aWRlcyBiYWNrIGVuZAorICogaW1wbGVtZW50YXRpb25zIHRvIHNlbmQgYSBib290IG1vZGUgY29tbWFuZCB0byB0aGUgZGV2aWNlIGFuZCB0bworICogcmVhZCBhbiBhY2tub2x3ZWRnZW1lbnQgZnJvbSBpdCAob3IgYW4gYXN5bmNocm9ub3VzIG5vdGlmaWNhdGlvbikKKyAqIGZyb20gaXQuCisgKgorICogUk9BRE1BUAorICoKKyAqIGkyNDAwbV9kZXZfYm9vdHN0cmFwICAgICAgICAgICAgICAgQ2FsbGVkIGJ5IF9faTI0MDBtX2Rldl9zdGFydCgpCisgKiAgIHJlcXVlc3RfZmlybXdhcmUKKyAqICAgaTI0MDBtX2Z3X2NoZWNrCisgKiAgIGkyNDAwbV9md19kbmxvYWQKKyAqICAgcmVsZWFzZV9maXJtd2FyZQorICoKKyAqIGkyNDAwbV9md19kbmxvYWQKKyAqICAgaTI0MDBtX2Jvb3Ryb21faW5pdAorICogICAgIGkyNDAwbV9ibV9jbWQKKyAqICAgICBpMjQwMG0tPmJ1c19yZXNldAorICogICBpMjQwMG1fZG5sb2FkX2luaXQKKyAqICAgICBpMjQwMG1fZG5sb2FkX2luaXRfc2lnbmVkCisgKiAgICAgaTI0MDBtX2RubG9hZF9pbml0X25vbnNpZ25lZAorICogICAgICAgaTI0MDBtX2Rvd25sb2FkX2NodW5rCisgKiAgICAgICAgIGkyNDAwbV9ibV9jbWQKKyAqICAgaTI0MDBtX2RubG9hZF9iY2YKKyAqICAgICBpMjQwMG1fYm1fY21kCisgKiAgIGkyNDAwbV9kbmxvYWRfZmluYWxpemUKKyAqICAgICBpMjQwMG1fYm1fY21kCisgKgorICogaTI0MDBtX2JtX2NtZAorICogICBpMjQwMG0tPmJ1c19ibV9jbWRfc2VuZCgpCisgKiAgIGkyNDAwbS0+YnVzX2JtX3dhaXRfZm9yX2FjaworICogICBfX2kyNDAwbV9ibV9hY2tfdmVyaWZ5CisgKgorICogaTI0MDBtX2JtX2NtZF9wcmVwYXJlICAgICAgICAgICAgICBVc2VkIGJ5IGJ1cy1kcml2ZXJzIHRvIHByZXAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZHMgYmVmb3JlIHNlbmRpbmcKKyAqLworI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC91c2IuaD4KKyNpbmNsdWRlICJpMjQwMG0uaCIKKworCisjZGVmaW5lIERfU1VCTU9EVUxFIGZ3CisjaW5jbHVkZSAiZGVidWctbGV2ZWxzLmgiCisKKworc3RhdGljIGNvbnN0IF9fbGUzMiBpMjQwMG1fQUNLX0JBUktFUls0XSA9IHsKKwlfX2NvbnN0YW50X2NwdV90b19sZTMyKEkyNDAwTV9BQ0tfQkFSS0VSKSwKKwlfX2NvbnN0YW50X2NwdV90b19sZTMyKEkyNDAwTV9BQ0tfQkFSS0VSKSwKKwlfX2NvbnN0YW50X2NwdV90b19sZTMyKEkyNDAwTV9BQ0tfQkFSS0VSKSwKKwlfX2NvbnN0YW50X2NwdV90b19sZTMyKEkyNDAwTV9BQ0tfQkFSS0VSKQorfTsKKworCisvKioKKyAqIFByZXBhcmUgYSBib290LW1vZGUgY29tbWFuZCBmb3IgZGVsaXZlcnkKKyAqCisgKiBAY21kOiBwb2ludGVyIHRvIGJvb3Ryb20gaGVhZGVyIHRvIHByZXBhcmUKKyAqCisgKiBDb21wdXRlcyBjaGVja3N1bSBpZiBzbyBuZWVkZWQuIEFmdGVyIGNhbGxpbmcgdGhpcyBmdW5jdGlvbiwgRE8gTk9UCisgKiBtb2RpZnkgdGhlIGNvbW1hbmQgb3IgaGVhZGVyIGFzIHRoZSBjaGVja3N1bSB3b24ndCB3b3JrIGFueW1vcmUuCisgKgorICogV2UgZG8gaXQgZnJvbSBoZXJlIGJlY2F1c2Ugc29tZSB0aW1lcyB3ZSBjYW5ub3QgZG8gaXQgaW4gdGhlCisgKiBvcmlnaW5hbCBjb250ZXh0IHRoZSBjb21tYW5kIHdhcyBzZW50IChpdCBpcyBhIGNvbnN0KSwgc28gd2hlbiB3ZQorICogY29weSBpdCB0byBvdXIgc3RhZ2luZyBidWZmZXIsIHdlIGFkZCB0aGUgY2hlY2tzdW0gdGhlcmUuCisgKi8KK3ZvaWQgaTI0MDBtX2JtX2NtZF9wcmVwYXJlKHN0cnVjdCBpMjQwMG1fYm9vdHJvbV9oZWFkZXIgKmNtZCkKK3sKKwlpZiAoaTI0MDBtX2JyaF9nZXRfdXNlX2NoZWNrc3VtKGNtZCkpIHsKKwkJaW50IGk7CisJCXUzMiBjaGVja3N1bSA9IDA7CisJCWNvbnN0IHUzMiAqY2hlY2tzdW1fcHRyID0gKHZvaWQgKikgY21kLT5wYXlsb2FkOworCQlmb3IgKGkgPSAwOyBpIDwgY21kLT5kYXRhX3NpemUgLyA0OyBpKyspCisJCQljaGVja3N1bSArPSBjcHVfdG9fbGUzMigqY2hlY2tzdW1fcHRyKyspOworCQljaGVja3N1bSArPSBjbWQtPmNvbW1hbmQgKyBjbWQtPnRhcmdldF9hZGRyICsgY21kLT5kYXRhX3NpemU7CisJCWNtZC0+YmxvY2tfY2hlY2tzdW0gPSBjcHVfdG9fbGUzMihjaGVja3N1bSk7CisJfQorfQorRVhQT1JUX1NZTUJPTF9HUEwoaTI0MDBtX2JtX2NtZF9wcmVwYXJlKTsKKworCisvKgorICogVmVyaWZ5IHRoZSBhY2sgZGF0YSByZWNlaXZlZAorICoKKyAqIEdpdmVuIGEgcmVwbHkgdG8gYSBib290IG1vZGUgY29tbWFuZCwgY2hldyBpdCBhbmQgdmVyaWZ5IGV2ZXJ5dGhpbmcKKyAqIGlzIG9rLgorICoKKyAqIEBvcGNvZGU6IG9wY29kZSB3aGljaCBnZW5lcmF0ZWQgdGhpcyBhY2suIEZvciBlcnJvciBtZXNzYWdlcy4KKyAqIEBhY2s6IHBvaW50ZXIgdG8gYWNrIGRhdGEgd2UgcmVjZWl2ZWQKKyAqIEBhY2tfc2l6ZTogc2l6ZSBvZiB0aGF0IGRhdGEgYnVmZmVyCisgKiBAZmxhZ3M6IEkyNDAwTV9CTV9DTURfKiBmbGFncyB3ZSBjYWxsZWQgdGhlIGNvbW1hbmQgd2l0aC4KKyAqCisgKiBXYXkgdG9vIGxvbmcgZnVuY3Rpb24gLS0gbWF5YmUgaXQgc2hvdWxkIGJlIGZ1cnRoZXIgc3BsaXQKKyAqLworc3RhdGljCitzc2l6ZV90IF9faTI0MDBtX2JtX2Fja192ZXJpZnkoc3RydWN0IGkyNDAwbSAqaTI0MDBtLCBpbnQgb3Bjb2RlLAorCQkJICAgICAgIHN0cnVjdCBpMjQwMG1fYm9vdHJvbV9oZWFkZXIgKmFjaywKKwkJCSAgICAgICBzaXplX3QgYWNrX3NpemUsIGludCBmbGFncykKK3sKKwlzc2l6ZV90IHJlc3VsdCA9IC1FTk9NRU07CisJc3RydWN0IGRldmljZSAqZGV2ID0gaTI0MDBtX2RldihpMjQwMG0pOworCisJZF9mbnN0YXJ0KDgsIGRldiwgIihpMjQwMG0gJXAgb3Bjb2RlICVkIGFjayAlcCBzaXplICV6dSlcbiIsCisJCSAgaTI0MDBtLCBvcGNvZGUsIGFjaywgYWNrX3NpemUpOworCWlmIChhY2tfc2l6ZSA8IHNpemVvZigqYWNrKSkgeworCQlyZXN1bHQgPSAtRUlPOworCQlkZXZfZXJyKGRldiwgImJvb3QtbW9kZSBjbWQgJWQ6IEhXIEJVRz8gbm90aWZpY2F0aW9uIGRpZG4ndCAiCisJCQkicmV0dXJuIGVub3VnaCBkYXRhICglenUgYnl0ZXMgdnMgJXp1IGV4cGVjdGVkKVxuIiwKKwkJCW9wY29kZSwgYWNrX3NpemUsIHNpemVvZigqYWNrKSk7CisJCWdvdG8gZXJyb3JfYWNrX3Nob3J0OworCX0KKwlpZiAoYWNrX3NpemUgPT0gc2l6ZW9mKGkyNDAwbV9OQk9PVF9CQVJLRVIpCisJCSAmJiBtZW1jbXAoYWNrLCBpMjQwMG1fTkJPT1RfQkFSS0VSLCBzaXplb2YoKmFjaykpID09IDApIHsKKwkJcmVzdWx0ID0gLUVSRVNUQVJUU1lTOworCQlpMjQwMG0tPnNib290ID0gMDsKKwkJZF9wcmludGYoNiwgZGV2LCAiYm9vdC1tb2RlIGNtZCAlZDogIgorCQkJICJIVyBub24tc2lnbmVkIGJvb3QgYmFya2VyXG4iLCBvcGNvZGUpOworCQlnb3RvIGVycm9yX3JlYm9vdDsKKwl9CisJaWYgKGFja19zaXplID09IHNpemVvZihpMjQwMG1fU0JPT1RfQkFSS0VSKQorCQkgJiYgbWVtY21wKGFjaywgaTI0MDBtX1NCT09UX0JBUktFUiwgc2l6ZW9mKCphY2spKSA9PSAwKSB7CisJCXJlc3VsdCA9IC1FUkVTVEFSVFNZUzsKKwkJaTI0MDBtLT5zYm9vdCA9IDE7CisJCWRfcHJpbnRmKDYsIGRldiwgImJvb3QtbW9kZSBjbWQgJWQ6IEhXIHNpZ25lZCByZWJvb3QgYmFya2VyXG4iLAorCQkJIG9wY29kZSk7CisJCWdvdG8gZXJyb3JfcmVib290OworCX0KKwlpZiAoYWNrX3NpemUgPT0gc2l6ZW9mKGkyNDAwbV9BQ0tfQkFSS0VSKQorCQkgJiYgbWVtY21wKGFjaywgaTI0MDBtX0FDS19CQVJLRVIsIHNpemVvZigqYWNrKSkgPT0gMCkgeworCQlyZXN1bHQgPSAtRUlTQ09OTjsKKwkJZF9wcmludGYoMywgZGV2LCAiYm9vdC1tb2RlIGNtZCAlZDogSFcgcmVib290IGFjayBiYXJrZXJcbiIsCisJCQkgb3Bjb2RlKTsKKwkJZ290byBlcnJvcl9yZWJvb3RfYWNrOworCX0KKwlyZXN1bHQgPSAwOworCWlmIChmbGFncyAmIEkyNDAwTV9CTV9DTURfUkFXKQorCQlnb3RvIG91dF9yYXc7CisJYWNrLT5kYXRhX3NpemUgPSBsZTMyX3RvX2NwdShhY2stPmRhdGFfc2l6ZSk7CisJYWNrLT50YXJnZXRfYWRkciA9IGxlMzJfdG9fY3B1KGFjay0+dGFyZ2V0X2FkZHIpOworCWFjay0+YmxvY2tfY2hlY2tzdW0gPSBsZTMyX3RvX2NwdShhY2stPmJsb2NrX2NoZWNrc3VtKTsKKwlkX3ByaW50Zig1LCBkZXYsICJib290LW1vZGUgY21kICVkOiBub3RpZmljYXRpb24gZm9yIG9wY29kZSAldSAiCisJCSAicmVzcG9uc2UgJXUgY3N1bSAldSByciAldSBkYSAldVxuIiwKKwkJIG9wY29kZSwgaTI0MDBtX2JyaF9nZXRfb3Bjb2RlKGFjayksCisJCSBpMjQwMG1fYnJoX2dldF9yZXNwb25zZShhY2spLAorCQkgaTI0MDBtX2JyaF9nZXRfdXNlX2NoZWNrc3VtKGFjayksCisJCSBpMjQwMG1fYnJoX2dldF9yZXNwb25zZV9yZXF1aXJlZChhY2spLAorCQkgaTI0MDBtX2JyaF9nZXRfZGlyZWN0X2FjY2VzcyhhY2spKTsKKwlyZXN1bHQgPSAtRUlPOworCWlmIChpMjQwMG1fYnJoX2dldF9zaWduYXR1cmUoYWNrKSAhPSAweGNiYmMpIHsKKwkJZGV2X2VycihkZXYsICJib290LW1vZGUgY21kICVkOiBIVyBCVUc/IHdyb25nIHNpZ25hdHVyZSAiCisJCQkiMHglMDR4XG4iLCBvcGNvZGUsIGkyNDAwbV9icmhfZ2V0X3NpZ25hdHVyZShhY2spKTsKKwkJZ290byBlcnJvcl9hY2tfc2lnbmF0dXJlOworCX0KKwlpZiAob3Bjb2RlICE9IC0xICYmIG9wY29kZSAhPSBpMjQwMG1fYnJoX2dldF9vcGNvZGUoYWNrKSkgeworCQlkZXZfZXJyKGRldiwgImJvb3QtbW9kZSBjbWQgJWQ6IEhXIEJVRz8gIgorCQkJInJlY2VpdmVkIHJlc3BvbnNlIGZvciBvcGNvZGUgJXUsIGV4cGVjdGVkICV1XG4iLAorCQkJb3Bjb2RlLCBpMjQwMG1fYnJoX2dldF9vcGNvZGUoYWNrKSwgb3Bjb2RlKTsKKwkJZ290byBlcnJvcl9hY2tfb3Bjb2RlOworCX0KKwlpZiAoaTI0MDBtX2JyaF9nZXRfcmVzcG9uc2UoYWNrKSAhPSAwKSB7CS8qIGZhaWxlZD8gKi8KKwkJZGV2X2VycihkZXYsICJib290LW1vZGUgY21kICVkOiBlcnJvcjsgaHcgcmVzcG9uc2UgJXVcbiIsCisJCQlvcGNvZGUsIGkyNDAwbV9icmhfZ2V0X3Jlc3BvbnNlKGFjaykpOworCQlnb3RvIGVycm9yX2Fja19mYWlsZWQ7CisJfQorCWlmIChhY2tfc2l6ZSA8IGFjay0+ZGF0YV9zaXplICsgc2l6ZW9mKCphY2spKSB7CisJCWRldl9lcnIoZGV2LCAiYm9vdC1tb2RlIGNtZCAlZDogU1cgQlVHICIKKwkJCSJkcml2ZXIgcHJvdmlkZWQgb25seSAlenUgYnl0ZXMgZm9yICV6dSBieXRlcyAiCisJCQkib2YgZGF0YVxuIiwgb3Bjb2RlLCBhY2tfc2l6ZSwKKwkJCShzaXplX3QpIGxlMzJfdG9fY3B1KGFjay0+ZGF0YV9zaXplKSArIHNpemVvZigqYWNrKSk7CisJCWdvdG8gZXJyb3JfYWNrX3Nob3J0X2J1ZmZlcjsKKwl9CisJcmVzdWx0ID0gYWNrX3NpemU7CisJLyogRG9uJ3QgeW91IGxvdmUgdGhpcyBzdGFjayBvZiBlbXB0eSB0YXJnZXRzPyBXZWxsLCBJIGRvbid0CisJICogZWl0aGVyLCBidXQgaXQgaGVscHMgdHJhY2sgZXhhY3RseSB3aG8gY29tZXMgaW4gaGVyZSBhbmQKKwkgKiB3aHkgOikgKi8KK2Vycm9yX2Fja19zaG9ydF9idWZmZXI6CitlcnJvcl9hY2tfZmFpbGVkOgorZXJyb3JfYWNrX29wY29kZToKK2Vycm9yX2Fja19zaWduYXR1cmU6CitvdXRfcmF3OgorZXJyb3JfcmVib290X2FjazoKK2Vycm9yX3JlYm9vdDoKK2Vycm9yX2Fja19zaG9ydDoKKwlkX2ZuZW5kKDgsIGRldiwgIihpMjQwMG0gJXAgb3Bjb2RlICVkIGFjayAlcCBzaXplICV6dSkgPSAlZFxuIiwKKwkJaTI0MDBtLCBvcGNvZGUsIGFjaywgYWNrX3NpemUsIChpbnQpIHJlc3VsdCk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworCisvKioKKyAqIGkyNDAwbV9ibV9jbWQgLSBFeGVjdXRlIGEgYm9vdCBtb2RlIGNvbW1hbmQKKyAqCisgKiBAY21kOiBidWZmZXIgY29udGFpbmluZyB0aGUgY29tbWFuZCBkYXRhIChwb2ludGluZyBhdCB0aGUgaGVhZGVyKS4KKyAqICAgICBUaGlzIGRhdGEgY2FuIGJlIEFOWVdIRVJFIChmb3IgVVNCLCB3ZSB3aWxsIGNvcHkgaXQgdG8gYW4KKyAqICAgICBzcGVjaWZpYyBidWZmZXIpLiBNYWtlIHN1cmUgZXZlcnl0aGluZyBpcyBpbiBwcm9wZXIgbGl0dGxlCisgKiAgICAgZW5kaWFuLgorICoKKyAqICAgICBBIHJhdyBidWZmZXIgY2FuIGJlIGFsc28gc2VudCwganVzdCBjYXN0IGl0IGFuZCBzZXQgZmxhZ3MgdG8KKyAqICAgICBJMjQwME1fQk1fQ01EX1JBVy4KKyAqCisgKiAgICAgVGhpcyBmdW5jdGlvbiB3aWxsIGdlbmVyYXRlIGEgY2hlY2tzdW0gZm9yIHlvdSBpZiB0aGUKKyAqICAgICBjaGVja3N1bSBiaXQgaW4gdGhlIGNvbW1hbmQgaXMgc2V0ICh1bmxlc3MgSTI0MDBNX0JNX0NNRF9SQVcKKyAqICAgICBpcyBzZXQpLgorICoKKyAqICAgICBZb3UgY2FuIHVzZSB0aGUgaTI0MDBtLT5ibV9jbWRfYnVmIHRvIHN0YWdlIHlvdXIgY29tbWFuZHMgYW5kCisgKiAgICAgc2VuZCB0aGVtLgorICoKKyAqICAgICBJZiBOVUxMLCBubyBjb21tYW5kIGlzIHNlbnQgKHdlIGp1c3Qgd2FpdCBmb3IgYW4gYWNrKS4KKyAqCisgKiBAY21kX3NpemU6IHNpemUgb2YgdGhlIGNvbW1hbmQuIFdpbGwgYmUgYXV0byBwYWRkZWQgdG8gdGhlCisgKiAgICAgYnVzLXNwZWNpZmljIGRyaXZlcnMgcGFkZGluZyByZXF1aXJlbWVudHMuCisgKgorICogQGFjazogYnVmZmVyIHdoZXJlIHRvIHBsYWNlIHRoZSBhY2tub3dsZWRnZW1lbnQuIElmIGl0IGlzIGEgcmVndWxhcgorICogICAgIGNvbW1hbmQgcmVzcG9uc2UsIGFsbCBmaWVsZHMgd2lsbCBiZSByZXR1cm5lZCB3aXRoIHRoZSByaWdodCwKKyAqICAgICBuYXRpdmUgZW5kaWFuZXNzLgorICoKKyAqICAgICBZb3UgKmNhbm5vdCogdXNlIGkyNDAwbS0+Ym1fYWNrX2J1ZiBmb3IgdGhpcyBidWZmZXIuCisgKgorICogQGFja19zaXplOiBzaXplIG9mIEBhY2ssIDE2IGFsaWduZWQ7IHlvdSBuZWVkIHRvIHByb3ZpZGUgYXQgbGVhc3QKKyAqICAgICBzaXplb2YoKmFjaykgYnl0ZXMgYW5kIHRoZW4gZW5vdWdoIHRvIGNvbnRhaW4gdGhlIHJldHVybiBkYXRhCisgKiAgICAgZnJvbSB0aGUgY29tbWFuZAorICoKKyAqIEBmbGFnczogc2VlIEkyNDAwTV9CTV9DTURfKiBhYm92ZS4KKyAqCisgKiBAcmV0dXJuczogYnl0ZXMgcmVjZWl2ZWQgYnkgdGhlIG5vdGlmaWNhdGlvbjsgaWYgPCAwLCBhbiBlcnJubyBjb2RlCisgKiAgICAgZGVub3RpbmcgYW4gZXJyb3Igb3I6CisgKgorICogICAgIC1FUkVTVEFSVFNZUyAgVGhlIGRldmljZSBoYXMgcmVib290ZWQKKyAqCisgKiBFeGVjdXRlcyBhIGJvb3QtbW9kZSBjb21tYW5kIGFuZCB3YWl0cyBmb3IgYSByZXNwb25zZSwgZG9pbmcgYmFzaWMKKyAqIHZhbGlkYXRpb24gb24gaXQ7IGlmIGEgemVybyBsZW5ndGggcmVzcG9uc2UgaXMgcmVjZWl2ZWQsIGl0IHJldHJpZXMKKyAqIHdhaXRpbmcgZm9yIGEgcmVzcG9uc2UgdW50aWwgYSBub24temVybyBvbmUgaXMgcmVjZWl2ZWQgKHRpbWluZyBvdXQKKyAqIGFmdGVyICVJMjQwME1fQk9PVF9SRVRSSUVTIHJldHJpZXMpLgorICovCitzdGF0aWMKK3NzaXplX3QgaTI0MDBtX2JtX2NtZChzdHJ1Y3QgaTI0MDBtICppMjQwMG0sCisJCSAgICAgIGNvbnN0IHN0cnVjdCBpMjQwMG1fYm9vdHJvbV9oZWFkZXIgKmNtZCwgc2l6ZV90IGNtZF9zaXplLAorCQkgICAgICBzdHJ1Y3QgaTI0MDBtX2Jvb3Ryb21faGVhZGVyICphY2ssIHNpemVfdCBhY2tfc2l6ZSwKKwkJICAgICAgaW50IGZsYWdzKQoreworCXNzaXplX3QgcmVzdWx0ID0gLUVOT01FTSwgcnhfYnl0ZXM7CisJc3RydWN0IGRldmljZSAqZGV2ID0gaTI0MDBtX2RldihpMjQwMG0pOworCWludCBvcGNvZGUgPSBjbWQgPT0gTlVMTCA/IC0xIDogaTI0MDBtX2JyaF9nZXRfb3Bjb2RlKGNtZCk7CisKKwlkX2Zuc3RhcnQoNiwgZGV2LCAiKGkyNDAwbSAlcCBjbWQgJXAgc2l6ZSAlenUgYWNrICVwIHNpemUgJXp1KVxuIiwKKwkJICBpMjQwMG0sIGNtZCwgY21kX3NpemUsIGFjaywgYWNrX3NpemUpOworCUJVR19PTihhY2tfc2l6ZSA8IHNpemVvZigqYWNrKSk7CisJQlVHX09OKGkyNDAwbS0+Ym9vdF9tb2RlID09IDApOworCisJaWYgKGNtZCAhPSBOVUxMKSB7CQkvKiBzZW5kIHRoZSBjb21tYW5kICovCisJCW1lbWNweShpMjQwMG0tPmJtX2NtZF9idWYsIGNtZCwgY21kX3NpemUpOworCQlyZXN1bHQgPSBpMjQwMG0tPmJ1c19ibV9jbWRfc2VuZChpMjQwMG0sIGNtZCwgY21kX3NpemUsIGZsYWdzKTsKKwkJaWYgKHJlc3VsdCA8IDApCisJCQlnb3RvIGVycm9yX2NtZF9zZW5kOworCQlpZiAoKGZsYWdzICYgSTI0MDBNX0JNX0NNRF9SQVcpID09IDApCisJCQlkX3ByaW50Zig1LCBkZXYsCisJCQkJICJib290LW1vZGUgY21kICVkIGNzdW0gJXUgcnIgJXUgZGEgJXU6ICIKKwkJCQkgImFkZHIgMHglMDR4IHNpemUgJXUgYmxvY2sgY3N1bSAweCUwNHhcbiIsCisJCQkJIG9wY29kZSwgaTI0MDBtX2JyaF9nZXRfdXNlX2NoZWNrc3VtKGNtZCksCisJCQkJIGkyNDAwbV9icmhfZ2V0X3Jlc3BvbnNlX3JlcXVpcmVkKGNtZCksCisJCQkJIGkyNDAwbV9icmhfZ2V0X2RpcmVjdF9hY2Nlc3MoY21kKSwKKwkJCQkgY21kLT50YXJnZXRfYWRkciwgY21kLT5kYXRhX3NpemUsCisJCQkJIGNtZC0+YmxvY2tfY2hlY2tzdW0pOworCX0KKwlyZXN1bHQgPSBpMjQwMG0tPmJ1c19ibV93YWl0X2Zvcl9hY2soaTI0MDBtLCBhY2ssIGFja19zaXplKTsKKwlpZiAocmVzdWx0IDwgMCkgeworCQlkZXZfZXJyKGRldiwgImJvb3QtbW9kZSBjbWQgJWQ6IGVycm9yIHdhaXRpbmcgZm9yIGFuIGFjazogJWRcbiIsCisJCQlvcGNvZGUsIChpbnQpIHJlc3VsdCk7CS8qIGJhaCwgJXpkIGRvZXNuJ3Qgd29yayAqLworCQlnb3RvIGVycm9yX3dhaXRfZm9yX2FjazsKKwl9CisJcnhfYnl0ZXMgPSByZXN1bHQ7CisJLyogdmVyaWZ5IHRoZSBhY2sgYW5kIHJlYWQgbW9yZSBpZiBuZWNjZXNzYXJ5IFtyZXN1bHQgaXMgdGhlCisJICogZmluYWwgYW1vdW50IG9mIGJ5dGVzIHdlIGdldCBpbiB0aGUgYWNrXSAgKi8KKwlyZXN1bHQgPSBfX2kyNDAwbV9ibV9hY2tfdmVyaWZ5KGkyNDAwbSwgb3Bjb2RlLCBhY2ssIGFja19zaXplLCBmbGFncyk7CisJaWYgKHJlc3VsdCA8IDApCisJCWdvdG8gZXJyb3JfYmFkX2FjazsKKwkvKiBEb24ndCB5b3UgbG92ZSB0aGlzIHN0YWNrIG9mIGVtcHR5IHRhcmdldHM/IFdlbGwsIEkgZG9uJ3QKKwkgKiBlaXRoZXIsIGJ1dCBpdCBoZWxwcyB0cmFjayBleGFjdGx5IHdobyBjb21lcyBpbiBoZXJlIGFuZAorCSAqIHdoeSA6KSAqLworCXJlc3VsdCA9IHJ4X2J5dGVzOworZXJyb3JfYmFkX2FjazoKK2Vycm9yX3dhaXRfZm9yX2FjazoKK2Vycm9yX2NtZF9zZW5kOgorCWRfZm5lbmQoNiwgZGV2LCAiKGkyNDAwbSAlcCBjbWQgJXAgc2l6ZSAlenUgYWNrICVwIHNpemUgJXp1KSA9ICVkXG4iLAorCQlpMjQwMG0sIGNtZCwgY21kX3NpemUsIGFjaywgYWNrX3NpemUsIChpbnQpIHJlc3VsdCk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworCisvKioKKyAqIGkyNDAwbV9kb3dubG9hZF9jaHVuayAtIHdyaXRlIGEgc2luZ2xlIGNodW5rIG9mIGRhdGEgdG8gdGhlIGRldmljZSdzIG1lbW9yeQorICoKKyAqIEBpMjQwMG06IGRldmljZSBkZXNjcmlwdG9yCisgKiBAYnVmOiB0aGUgYnVmZmVyIHRvIHdyaXRlCisgKiBAYnVmX2xlbjogbGVuZ3RoIG9mIHRoZSBidWZmZXIgdG8gd3JpdGUKKyAqIEBhZGRyOiBhZGRyZXNzIGluIHRoZSBkZXZpY2UgbWVtb3J5IHNwYWNlCisgKiBAZGlyZWN0OiBib290cm9tIHdyaXRlIG1vZGUKKyAqIEBkb19jc3VtOiBzaG91bGQgYSBjaGVja3N1bSB2YWxpZGF0aW9uIGJlIHBlcmZvcm1lZAorICovCitzdGF0aWMgaW50IGkyNDAwbV9kb3dubG9hZF9jaHVuayhzdHJ1Y3QgaTI0MDBtICppMjQwMG0sIGNvbnN0IHZvaWQgKmNodW5rLAorCQkJCSBzaXplX3QgX19jaHVua19sZW4sIHVuc2lnbmVkIGxvbmcgYWRkciwKKwkJCQkgdW5zaWduZWQgaW50IGRpcmVjdCwgdW5zaWduZWQgaW50IGRvX2NzdW0pCit7CisJaW50IHJldDsKKwlzaXplX3QgY2h1bmtfbGVuID0gQUxJR04oX19jaHVua19sZW4sIEkyNDAwTV9QTF9QQUQpOworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGkyNDAwbV9kZXYoaTI0MDBtKTsKKwlzdHJ1Y3QgeworCQlzdHJ1Y3QgaTI0MDBtX2Jvb3Ryb21faGVhZGVyIGNtZDsKKwkJdTggY21kX3BheWxvYWRbY2h1bmtfbGVuXTsKKwl9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpICpidWY7CisJc3RydWN0IGkyNDAwbV9ib290cm9tX2hlYWRlciBhY2s7CisKKwlkX2Zuc3RhcnQoNSwgZGV2LCAiKGkyNDAwbSAlcCBjaHVuayAlcCBfX2NodW5rX2xlbiAlenUgYWRkciAweCUwOGx4ICIKKwkJICAiZGlyZWN0ICV1IGRvX2NzdW0gJXUpXG4iLCBpMjQwMG0sIGNodW5rLCBfX2NodW5rX2xlbiwKKwkJICBhZGRyLCBkaXJlY3QsIGRvX2NzdW0pOworCWJ1ZiA9IGkyNDAwbS0+Ym1fY21kX2J1ZjsKKwltZW1jcHkoYnVmLT5jbWRfcGF5bG9hZCwgY2h1bmssIF9fY2h1bmtfbGVuKTsKKwltZW1zZXQoYnVmLT5jbWRfcGF5bG9hZCArIF9fY2h1bmtfbGVuLCAweGFkLCBjaHVua19sZW4gLSBfX2NodW5rX2xlbik7CisKKwlidWYtPmNtZC5jb21tYW5kID0gaTI0MDBtX2JyaF9jb21tYW5kKEkyNDAwTV9CUkhfV1JJVEUsCisJCQkJCSAgICAgIF9fY2h1bmtfbGVuICYgMHgzID8gMCA6IGRvX2NzdW0sCisJCQkJCSAgICAgIF9fY2h1bmtfbGVuICYgMHhmID8gMCA6IGRpcmVjdCk7CisJYnVmLT5jbWQudGFyZ2V0X2FkZHIgPSBjcHVfdG9fbGUzMihhZGRyKTsKKwlidWYtPmNtZC5kYXRhX3NpemUgPSBjcHVfdG9fbGUzMihfX2NodW5rX2xlbik7CisJcmV0ID0gaTI0MDBtX2JtX2NtZChpMjQwMG0sICZidWYtPmNtZCwgc2l6ZW9mKGJ1Zi0+Y21kKSArIGNodW5rX2xlbiwKKwkJCSAgICAmYWNrLCBzaXplb2YoYWNrKSwgMCk7CisJaWYgKHJldCA+PSAwKQorCQlyZXQgPSAwOworCWRfZm5lbmQoNSwgZGV2LCAiKGkyNDAwbSAlcCBjaHVuayAlcCBfX2NodW5rX2xlbiAlenUgYWRkciAweCUwOGx4ICIKKwkJImRpcmVjdCAldSBkb19jc3VtICV1KSA9ICVkXG4iLCBpMjQwMG0sIGNodW5rLCBfX2NodW5rX2xlbiwKKwkJYWRkciwgZGlyZWN0LCBkb19jc3VtLCByZXQpOworCXJldHVybiByZXQ7Cit9CisKKworLyoKKyAqIERvd25sb2FkIGEgQkNGIGZpbGUncyBzZWN0aW9ucyB0byB0aGUgZGV2aWNlCisgKgorICogQGkyNDAwbTogZGV2aWNlIGRlc2NyaXB0b3IKKyAqIEBiY2Y6IHBvaW50ZXIgdG8gZmlybXdhcmUgZGF0YSAoZm9sbG93ZWQgYnkgdGhlIHBheWxvYWRzKS4gQXNzdW1lZAorICogICAgICAgdmVyaWZpZWQgYW5kIGNvbnNpc3RlbnQuCisgKiBAYmNmX2xlbjogbGVuZ3RoIChpbiBieXRlcykgb2YgdGhlIEBiY2YgYnVmZmVyLgorICoKKyAqIFJldHVybnM6IDwgMCBlcnJubyBjb2RlIG9uIGVycm9yIG9yIHRoZSBvZmZzZXQgdG8gdGhlIGp1bXAgaW5zdHJ1Y3Rpb24uCisgKgorICogR2l2ZW4gYSBCQ0YgZmlsZSwgZG93bmxvYWRzIGVhY2ggc2VjdGlvbiAoYSBjb21tYW5kIGFuZCBhIHBheWxvYWQpCisgKiB0byB0aGUgZGV2aWNlJ3MgYWRkcmVzcyBzcGFjZS4gQWN0dWFsbHksIGl0IGp1c3QgZXhlY3V0ZXMgZWFjaAorICogY29tbWFuZCBpIHRoZSBCQ0YgZmlsZS4KKyAqCisgKiBUaGUgc2VjdGlvbiBzaXplIGhhcyB0byBiZSBhbGlnbmVkIHRvIDQgYnl0ZXMgQU5EIHRoZSBwYWRkaW5nIGhhcworICogdG8gYmUgdGFrZW4gZnJvbSB0aGUgZmlybXdhcmUgZmlsZSwgYXMgdGhlIHNpZ25hdHVyZSB0YWtlcyBpdCBpbnRvCisgKiBhY2NvdW50LgorICovCitzdGF0aWMKK3NzaXplX3QgaTI0MDBtX2RubG9hZF9iY2Yoc3RydWN0IGkyNDAwbSAqaTI0MDBtLAorCQkJICBjb25zdCBzdHJ1Y3QgaTI0MDBtX2JjZl9oZHIgKmJjZiwgc2l6ZV90IGJjZl9sZW4pCit7CisJc3NpemVfdCByZXQ7CisJc3RydWN0IGRldmljZSAqZGV2ID0gaTI0MDBtX2RldihpMjQwMG0pOworCXNpemVfdCBvZmZzZXQsCQkvKiBpdGVyYXRvciBvZmZzZXQgKi8KKwkJZGF0YV9zaXplLAkvKiBTaXplIG9mIHRoZSBkYXRhIHBheWxvYWQgKi8KKwkJc2VjdGlvbl9zaXplLAkvKiBTaXplIG9mIHRoZSB3aG9sZSBzZWN0aW9uIChjbWQgKyBwYXlsb2FkKSAqLworCQlzZWN0aW9uID0gMTsKKwljb25zdCBzdHJ1Y3QgaTI0MDBtX2Jvb3Ryb21faGVhZGVyICpiaDsKKwlzdHJ1Y3QgaTI0MDBtX2Jvb3Ryb21faGVhZGVyIGFjazsKKworCWRfZm5zdGFydCgzLCBkZXYsICIoaTI0MDBtICVwIGJjZiAlcCBiY2ZfbGVuICV6dSlcbiIsCisJCSAgaTI0MDBtLCBiY2YsIGJjZl9sZW4pOworCS8qIEl0ZXJhdGUgb3ZlciB0aGUgY29tbWFuZCBibG9ja3MgaW4gdGhlIEJDRiBmaWxlIHRoYXQgc3RhcnQKKwkgKiBhZnRlciB0aGUgaGVhZGVyICovCisJb2Zmc2V0ID0gbGUzMl90b19jcHUoYmNmLT5oZWFkZXJfbGVuKSAqIHNpemVvZih1MzIpOworCXdoaWxlICgxKSB7CS8qIHN0YXJ0IHNlbmRpbmcgdGhlIGZpbGUgKi8KKwkJYmggPSAodm9pZCAqKSBiY2YgKyBvZmZzZXQ7CisJCWRhdGFfc2l6ZSA9IGxlMzJfdG9fY3B1KGJoLT5kYXRhX3NpemUpOworCQlzZWN0aW9uX3NpemUgPSBBTElHTihzaXplb2YoKmJoKSArIGRhdGFfc2l6ZSwgNCk7CisJCWRfcHJpbnRmKDcsIGRldiwKKwkJCSAiZG93bmxvYWRpbmcgc2VjdGlvbiAjJXp1IChAJXp1ICV6dSBCKSB0byAweCUwOHhcbiIsCisJCQkgc2VjdGlvbiwgb2Zmc2V0LCBzaXplb2YoKmJoKSArIGRhdGFfc2l6ZSwKKwkJCSBsZTMyX3RvX2NwdShiaC0+dGFyZ2V0X2FkZHIpKTsKKwkJaWYgKGkyNDAwbV9icmhfZ2V0X29wY29kZShiaCkgPT0gSTI0MDBNX0JSSF9TSUdORURfSlVNUCkgeworCQkJLyogU2VjdXJlIGJvb3QgbmVlZHMgdG8gc3RvcCBoZXJlICovCisJCQlkX3ByaW50Zig1LCBkZXYsICAic2lnbmVkIGp1bXAgZm91bmQgQCV6dVxuIiwgb2Zmc2V0KTsKKwkJCWJyZWFrOworCQl9CisJCWlmIChvZmZzZXQgKyBzZWN0aW9uX3NpemUgPT0gYmNmX2xlbikKKwkJCS8qIE5vbi1zZWN1cmUgYm9vdCBzdG9wcyBoZXJlICovCisJCQlicmVhazsKKwkJaWYgKG9mZnNldCArIHNlY3Rpb25fc2l6ZSA+IGJjZl9sZW4pIHsKKwkJCWRldl9lcnIoZGV2LCAiZncgJXM6IGJhZCBzZWN0aW9uICMlenUsICIKKwkJCQkiZW5kIChAJXp1KSBiZXlvbmQgRU9GIChAJXp1KVxuIiwKKwkJCQlpMjQwMG0tPmJ1c19md19uYW1lLCBzZWN0aW9uLAorCQkJCW9mZnNldCArIHNlY3Rpb25fc2l6ZSwgIGJjZl9sZW4pOworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWdvdG8gZXJyb3Jfc2VjdGlvbl9iZXlvbmRfZW9mOworCQl9CisJCV9faTI0MDBtX21zbGVlcCgyMCk7CisJCXJldCA9IGkyNDAwbV9ibV9jbWQoaTI0MDBtLCBiaCwgc2VjdGlvbl9zaXplLAorCQkJCSAgICAmYWNrLCBzaXplb2YoYWNrKSwgSTI0MDBNX0JNX0NNRF9SQVcpOworCQlpZiAocmV0IDwgMCkgeworCQkJZGV2X2VycihkZXYsICJmdyAlczogc2VjdGlvbiAjJXp1IChAJXp1ICV6dSBCKSAiCisJCQkJImZhaWxlZCAlZFxuIiwgaTI0MDBtLT5idXNfZndfbmFtZSwgc2VjdGlvbiwKKwkJCQlvZmZzZXQsIHNpemVvZigqYmgpICsgZGF0YV9zaXplLCAoaW50KSByZXQpOworCQkJZ290byBlcnJvcl9zZW5kOworCQl9CisJCW9mZnNldCArPSBzZWN0aW9uX3NpemU7CisJCXNlY3Rpb24rKzsKKwl9CisJcmV0ID0gb2Zmc2V0OworZXJyb3Jfc2VjdGlvbl9iZXlvbmRfZW9mOgorZXJyb3Jfc2VuZDoKKwlkX2ZuZW5kKDMsIGRldiwgIihpMjQwMG0gJXAgYmNmICVwIGJjZl9sZW4gJXp1KSA9ICVkXG4iLAorCQlpMjQwMG0sIGJjZiwgYmNmX2xlbiwgKGludCkgcmV0KTsKKwlyZXR1cm4gcmV0OworfQorCisKKy8qCisgKiBEbyB0aGUgZmluYWwgc3RlcHMgb2YgdXBsb2FkaW5nIGZpcm13YXJlCisgKgorICogRGVwZW5kaW5nIG9uIHRoZSBib290IG1vZGUgKHNpZ25lZCB2cyBub24tc2lnbmVkKSwgZGlmZmVyZW50CisgKiBhY3Rpb25zIG5lZWQgdG8gYmUgdGFrZW4uCisgKi8KK3N0YXRpYworaW50IGkyNDAwbV9kbmxvYWRfZmluYWxpemUoc3RydWN0IGkyNDAwbSAqaTI0MDBtLAorCQkJICAgY29uc3Qgc3RydWN0IGkyNDAwbV9iY2ZfaGRyICpiY2YsIHNpemVfdCBvZmZzZXQpCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IGRldmljZSAqZGV2ID0gaTI0MDBtX2RldihpMjQwMG0pOworCXN0cnVjdCBpMjQwMG1fYm9vdHJvbV9oZWFkZXIgKmNtZCwgYWNrOworCXN0cnVjdCB7CisJCXN0cnVjdCBpMjQwMG1fYm9vdHJvbV9oZWFkZXIgY21kOworCQl1OCBjbWRfcGxbMF07CisJfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSAqY21kX2J1ZjsKKwlzaXplX3Qgc2lnbmF0dXJlX2Jsb2NrX29mZnNldCwgc2lnbmF0dXJlX2Jsb2NrX3NpemU7CisKKwlkX2Zuc3RhcnQoMywgZGV2LCAib2Zmc2V0ICV6dVxuIiwgb2Zmc2V0KTsKKwljbWQgPSAodm9pZCAqKSBiY2YgKyBvZmZzZXQ7CisJaWYgKGkyNDAwbS0+c2Jvb3QgPT0gMCkgeworCQlzdHJ1Y3QgaTI0MDBtX2Jvb3Ryb21faGVhZGVyIGp1bXBfYWNrOworCQlkX3ByaW50ZigzLCBkZXYsICJ1bnNlY3VyZSBib290LCBqdW1waW5nIHRvIDB4JTA4eFxuIiwKKwkJCWxlMzJfdG9fY3B1KGNtZC0+dGFyZ2V0X2FkZHIpKTsKKwkJaTI0MDBtX2JyaF9zZXRfb3Bjb2RlKGNtZCwgSTI0MDBNX0JSSF9KVU1QKTsKKwkJY21kLT5kYXRhX3NpemUgPSAwOworCQlyZXQgPSBpMjQwMG1fYm1fY21kKGkyNDAwbSwgY21kLCBzaXplb2YoKmNtZCksCisJCQkJICAgICZqdW1wX2Fjaywgc2l6ZW9mKGp1bXBfYWNrKSwgMCk7CisJfSBlbHNlIHsKKwkJZF9wcmludGYoMywgZGV2LCAic2VjdXJlIGJvb3QsIGp1bXBpbmcgdG8gMHglMDh4XG4iLAorCQkJIGxlMzJfdG9fY3B1KGNtZC0+dGFyZ2V0X2FkZHIpKTsKKwkJY21kX2J1ZiA9IGkyNDAwbS0+Ym1fY21kX2J1ZjsKKwkJbWVtY3B5KCZjbWRfYnVmLT5jbWQsIGNtZCwgc2l6ZW9mKCpjbWQpKTsKKwkJc2lnbmF0dXJlX2Jsb2NrX29mZnNldCA9CisJCQlzaXplb2YoKmJjZikKKwkJCSsgbGUzMl90b19jcHUoYmNmLT5rZXlfc2l6ZSkgKiBzaXplb2YodTMyKQorCQkJKyBsZTMyX3RvX2NwdShiY2YtPmV4cG9uZW50X3NpemUpICogc2l6ZW9mKHUzMik7CisJCXNpZ25hdHVyZV9ibG9ja19zaXplID0KKwkJCWxlMzJfdG9fY3B1KGJjZi0+bW9kdWx1c19zaXplKSAqIHNpemVvZih1MzIpOworCQltZW1jcHkoY21kX2J1Zi0+Y21kX3BsLCAodm9pZCAqKSBiY2YgKyBzaWduYXR1cmVfYmxvY2tfb2Zmc2V0LAorCQkgICAgICAgc2lnbmF0dXJlX2Jsb2NrX3NpemUpOworCQlyZXQgPSBpMjQwMG1fYm1fY21kKGkyNDAwbSwgJmNtZF9idWYtPmNtZCwKKwkJCQkgICAgc2l6ZW9mKGNtZF9idWYtPmNtZCkgKyBzaWduYXR1cmVfYmxvY2tfc2l6ZSwKKwkJCQkgICAgJmFjaywgc2l6ZW9mKGFjayksIEkyNDAwTV9CTV9DTURfUkFXKTsKKwl9CisJZF9mbmVuZCgzLCBkZXYsICJyZXR1cm5pbmcgJWRcbiIsIHJldCk7CisJcmV0dXJuIHJldDsKK30KKworCisvKioKKyAqIGkyNDAwbV9ib290cm9tX2luaXQgLSBSZWJvb3RzIGEgcG93ZXJlZCBkZXZpY2UgaW50byBib290IG1vZGUKKyAqCisgKiBAaTI0MDBtOiBkZXZpY2UgZGVzY3JpcHRvcgorICogQGZsYWdzOgorICogICAgICBJMjQwME1fQlJJX1NPRlQ6IGEgcmVib290IG5vdGlmaWNhdGlvbiBoYXMgYmVlbiBzZWVuCisgKiAgICAgICAgICBhbHJlYWR5LCBzbyBkb24ndCB3YWl0IGZvciBpdC4KKyAqCisgKiAgICAgIEkyNDAwTV9CUklfTk9fUkVCT09UOiBEb24ndCBzZW5kIGEgcmVib290IGNvbW1hbmQsIGJ1dCB3YWl0CisgKiAgICAgICAgICBmb3IgYSByZWJvb3QgYmFya2VyIG5vdGlmaWNhdGlvbi4gVGhpcyBpcyBhIG9uZSBzaG90OyBpZgorICogICAgICAgICAgdGhlIHN0YXRlIG1hY2hpbmUgbmVlZHMgdG8gc2VuZCBhIHJlYm9vdCBjb21tYW5kIGl0IHdpbGwuCisgKgorICogUmV0dXJuczoKKyAqCisgKiAgICAgPCAwIGVycm5vIGNvZGUgb24gZXJyb3IsIDAgaWYgb2suCisgKgorICogICAgIGkyNDAwbS0+c2Jvb3Qgc2V0IHRvIDAgZm9yIHVuc2VjdXJlIGJvb3QgcHJvY2VzcywgMSBmb3Igc2VjdXJlCisgKiAgICAgYm9vdCBwcm9jZXNzLgorICoKKyAqIERlc2NyaXB0aW9uOgorICoKKyAqIFRyaWVzIGhhcmQgZW5vdWdoIHRvIHB1dCB0aGUgZGV2aWNlIGluIGJvb3QtbW9kZS4gVGhlcmUgYXJlIHR3bworICogbWFpbiBwaGFzZXMgdG8gdGhpczoKKyAqCisgKiBhLiAoMSkgc2VuZCBhIHJlYm9vdCBjb21tYW5kIGFuZCAoMikgZ2V0IGEgcmVib290IGJhcmtlcgorICogYi4gKDEpIGFjayB0aGUgcmVib290IHNlbmRpbmcgYSByZWJvb3QgYmFya2VyIGFuZCAoMikgZ2V0dGluZyBhbgorICogICAgICAgIGFjayBiYXJrZXIgaW4gcmV0dXJuCisgKgorICogV2Ugd2FudCB0byBza2lwIChhKSBpbiBzb21lIGNhc2VzIFtzb2Z0XS4gVGhlIHN0YXRlIG1hY2hpbmUgaXMKKyAqIGhvcnJpYmxlLCBidXQgaXQgaXMgYmFzaWNhbGx5OiBvbiBlYWNoIHBoYXNlLCBzZW5kIHdoYXQgaGFzIHRvIGJlCisgKiBzZW50IChpZiBhbnkpLCB3YWl0IGZvciB0aGUgYW5zd2VyIGFuZCBhY3Qgb24gdGhlIGFuc3dlci4gV2UgbWlnaHQKKyAqIGhhdmUgdG8gYmFja3RyYWNrIGFuZCByZXRyeSwgc28gd2Uga2VlcCBhIG1heCB0cmllcyBjb3VudGVyIGZvcgorICogdGhhdC4KKyAqCisgKiBJZiB3ZSBnZXQgYSB0aW1lb3V0IGFmdGVyIHNlbmRpbmcgYSB3YXJtIHJlc2V0LCB3ZSBkbyBpdCBhZ2Fpbi4KKyAqLworaW50IGkyNDAwbV9ib290cm9tX2luaXQoc3RydWN0IGkyNDAwbSAqaTI0MDBtLCBlbnVtIGkyNDAwbV9icmkgZmxhZ3MpCit7CisJaW50IHJlc3VsdDsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBpMjQwMG1fZGV2KGkyNDAwbSk7CisJc3RydWN0IGkyNDAwbV9ib290cm9tX2hlYWRlciAqY21kOworCXN0cnVjdCBpMjQwMG1fYm9vdHJvbV9oZWFkZXIgYWNrOworCWludCBjb3VudCA9IEkyNDAwTV9CT09UX1JFVFJJRVM7CisJaW50IGFja190aW1lb3V0X2NudCA9IDE7CisKKwlCVUlMRF9CVUdfT04oc2l6ZW9mKCpjbWQpICE9IHNpemVvZihpMjQwMG1fTkJPT1RfQkFSS0VSKSk7CisJQlVJTERfQlVHX09OKHNpemVvZihhY2spICE9IHNpemVvZihpMjQwMG1fQUNLX0JBUktFUikpOworCisJZF9mbnN0YXJ0KDQsIGRldiwgIihpMjQwMG0gJXAgZmxhZ3MgMHglMDh4KVxuIiwgaTI0MDBtLCBmbGFncyk7CisJcmVzdWx0ID0gLUVOT01FTTsKKwljbWQgPSBpMjQwMG0tPmJtX2NtZF9idWY7CisJaWYgKGZsYWdzICYgSTI0MDBNX0JSSV9TT0ZUKQorCQlnb3RvIGRvX3JlYm9vdF9hY2s7Citkb19yZWJvb3Q6CisJaWYgKC0tY291bnQgPCAwKQorCQlnb3RvIGVycm9yX3RpbWVvdXQ7CisJZF9wcmludGYoNCwgZGV2LCAiZGV2aWNlIHJlYm9vdDogcmVib290IGNvbW1hbmQgWyVkICMgbGVmdF1cbiIsCisJCSBjb3VudCk7CisJaWYgKChmbGFncyAmIEkyNDAwTV9CUklfTk9fUkVCT09UKSA9PSAwKQorCQlpMjQwMG0tPmJ1c19yZXNldChpMjQwMG0sIEkyNDAwTV9SVF9XQVJNKTsKKwlyZXN1bHQgPSBpMjQwMG1fYm1fY21kKGkyNDAwbSwgTlVMTCwgMCwgJmFjaywgc2l6ZW9mKGFjayksCisJCQkgICAgICAgSTI0MDBNX0JNX0NNRF9SQVcpOworCWZsYWdzICY9IH5JMjQwME1fQlJJX05PX1JFQk9PVDsKKwlzd2l0Y2ggKHJlc3VsdCkgeworCWNhc2UgLUVSRVNUQVJUU1lTOgorCQlkX3ByaW50Zig0LCBkZXYsICJkZXZpY2UgcmVib290OiBnb3QgcmVib290IGJhcmtlclxuIik7CisJCWJyZWFrOworCWNhc2UgLUVJU0NPTk46CS8qIHdlIGRvbid0IGtub3cgaG93IGl0IGdvdCBoZXJlLi4uYnV0IHdlIGZvbGxvdyBpdCAqLworCQlkX3ByaW50Zig0LCBkZXYsICJkZXZpY2UgcmVib290OiBnb3QgYWNrIGJhcmtlciAtIHdoYXRldmVyXG4iKTsKKwkJZ290byBkb19yZWJvb3Q7CisJY2FzZSAtRVRJTUVET1VUOgkvKiBkZXZpY2UgaGFzIHRpbWVkIG91dCwgd2UgbWlnaHQgYmUgaW4gYm9vdAorCQkJCSAqIG1vZGUgYWxyZWFkeSBhbmQgZXhwZWN0aW5nIGFuIGFjaywgbGV0J3MgdHJ5CisJCQkJICogdGhhdCAqLworCQlkZXZfaW5mbyhkZXYsICJ3YXJtIHJlc2V0IHRpbWVkIG91dCwgdHJ5aW5nIGFuIGFja1xuIik7CisJCWdvdG8gZG9fcmVib290X2FjazsKKwljYXNlIC1FUFJPVE86CisJY2FzZSAtRVNIVVRET1dOOgkvKiBkZXYgaXMgZ29uZSAqLworCWNhc2UgLUVJTlRSOgkJLyogdXNlciBjYW5jZWxsZWQgKi8KKwkJZ290byBlcnJvcl9kZXZfZ29uZTsKKwlkZWZhdWx0OgorCQlkZXZfZXJyKGRldiwgImRldmljZSByZWJvb3Q6IGVycm9yICVkIHdoaWxlIHdhaXRpbmcgIgorCQkJImZvciByZWJvb3QgYmFya2VyIC0gcmVib290aW5nXG4iLCByZXN1bHQpOworCQlnb3RvIGRvX3JlYm9vdDsKKwl9CisJLyogQXQgdGhpcyBwb2ludCB3ZSBhY2sgYmFjayB3aXRoIDQgUkVCT09UIGJhcmtlcnMgYW5kIGV4cGVjdAorCSAqIDQgQUNLIGJhcmtlcnMuIFRoaXMgaXMgdWdseSwgYXMgd2Ugc2VuZCBhIHJhdyBjb21tYW5kIC0tCisJICogaGVuY2UgdGhlIGNhc3QuIF9ibV9jbWQoKSB3aWxsIGNhdGNoIHRoZSByZWJvb3QgYWNrCisJICogbm90aWZpY2F0aW9uIGFuZCByZXBvcnQgaXQgYXMgLUVJU0NPTk4uICovCitkb19yZWJvb3RfYWNrOgorCWRfcHJpbnRmKDQsIGRldiwgImRldmljZSByZWJvb3QgYWNrOiBzZW5kaW5nIGFjayBbJWQgIyBsZWZ0XVxuIiwgY291bnQpOworCWlmIChpMjQwMG0tPnNib290ID09IDApCisJCW1lbWNweShjbWQsIGkyNDAwbV9OQk9PVF9CQVJLRVIsCisJCSAgICAgICBzaXplb2YoaTI0MDBtX05CT09UX0JBUktFUikpOworCWVsc2UKKwkJbWVtY3B5KGNtZCwgaTI0MDBtX1NCT09UX0JBUktFUiwKKwkJICAgICAgIHNpemVvZihpMjQwMG1fU0JPT1RfQkFSS0VSKSk7CisJcmVzdWx0ID0gaTI0MDBtX2JtX2NtZChpMjQwMG0sIGNtZCwgc2l6ZW9mKCpjbWQpLAorCQkJICAgICAgICZhY2ssIHNpemVvZihhY2spLCBJMjQwME1fQk1fQ01EX1JBVyk7CisJc3dpdGNoIChyZXN1bHQpIHsKKwljYXNlIC1FUkVTVEFSVFNZUzoKKwkJZF9wcmludGYoNCwgZGV2LCAicmVib290IGFjazogZ290IHJlYm9vdCBiYXJrZXIgLSByZXRyeWluZ1xuIik7CisJCWlmICgtLWNvdW50IDwgMCkKKwkJCWdvdG8gZXJyb3JfdGltZW91dDsKKwkJZ290byBkb19yZWJvb3RfYWNrOworCWNhc2UgLUVJU0NPTk46CisJCWRfcHJpbnRmKDQsIGRldiwgInJlYm9vdCBhY2s6IGdvdCBhY2sgYmFya2VyIC0gZ29vZFxuIik7CisJCWJyZWFrOworCWNhc2UgLUVUSU1FRE9VVDoJLyogbm8gcmVzcG9uc2UsIG1heWJlIGl0IGlzIHRoZSBvdGhlciB0eXBlPyAqLworCQlpZiAoYWNrX3RpbWVvdXRfY250LS0gPj0gMCkgeworCQkJZF9wcmludGYoNCwgZGV2LCAicmVib290IGFjayB0aW1lZG91dDogIgorCQkJCSAidHJ5aW5nIHRoZSBvdGhlciB0eXBlP1xuIik7CisJCQlpMjQwMG0tPnNib290ID0gIWkyNDAwbS0+c2Jvb3Q7CisJCQlnb3RvIGRvX3JlYm9vdF9hY2s7CisJCX0gZWxzZSB7CisJCQlkZXZfZXJyKGRldiwgInJlYm9vdCBhY2sgdGltZWRvdXQgdG9vIGxvbmc6ICIKKwkJCQkidHJ5aW5nIHJlYm9vdFxuIik7CisJCQlnb3RvIGRvX3JlYm9vdDsKKwkJfQorCQlicmVhazsKKwljYXNlIC1FUFJPVE86CisJY2FzZSAtRVNIVVRET1dOOgkvKiBkZXYgaXMgZ29uZSAqLworCQlnb3RvIGVycm9yX2Rldl9nb25lOworCWRlZmF1bHQ6CisJCWRldl9lcnIoZGV2LCAiZGV2aWNlIHJlYm9vdCBhY2s6IGVycm9yICVkIHdoaWxlIHdhaXRpbmcgZm9yICIKKwkJCSJyZWJvb3QgYWNrIGJhcmtlciAtIHJlYm9vdGluZ1xuIiwgcmVzdWx0KTsKKwkJZ290byBkb19yZWJvb3Q7CisJfQorCWRfcHJpbnRmKDIsIGRldiwgImRldmljZSByZWJvb3QgYWNrOiBnb3QgYWNrIGJhcmtlciAtIGJvb3QgZG9uZVxuIik7CisJcmVzdWx0ID0gMDsKK2V4aXRfdGltZW91dDoKK2Vycm9yX2Rldl9nb25lOgorCWRfZm5lbmQoNCwgZGV2LCAiKGkyNDAwbSAlcCBmbGFncyAweCUwOHgpID0gJWRcbiIsCisJCWkyNDAwbSwgZmxhZ3MsIHJlc3VsdCk7CisJcmV0dXJuIHJlc3VsdDsKKworZXJyb3JfdGltZW91dDoKKwlkZXZfZXJyKGRldiwgIlRpbWVkIG91dCB3YWl0aW5nIGZvciByZWJvb3QgYWNrLCByZXNldHRpbmdcbiIpOworCWkyNDAwbS0+YnVzX3Jlc2V0KGkyNDAwbSwgSTI0MDBNX1JUX0JVUyk7CisJcmVzdWx0ID0gLUVUSU1FRE9VVDsKKwlnb3RvIGV4aXRfdGltZW91dDsKK30KKworCisvKgorICogUmVhZCB0aGUgTUFDIGFkZHIKKyAqCisgKiBUaGUgcG9zaXRpb24gdGhpcyBmdW5jdGlvbiByZWFkcyBpcyBmaXhlZCBpbiBkZXZpY2UgbWVtb3J5IGFuZAorICogYWx3YXlzIGF2YWlsYWJsZSwgZXZlbiB3aXRob3V0IGZpcm13YXJlLgorICoKKyAqIE5vdGUgd2Ugc3BlY2lmeSB3ZSB3YW50IHRvIHJlYWQgb25seSBzaXggYnl0ZXMsIGJ1dCBwcm92aWRlIHNwYWNlCisgKiBmb3IgMTYsIGFzIHdlIGFsd2F5cyBnZXQgaXQgcm91bmRlZCB1cC4KKyAqLworaW50IGkyNDAwbV9yZWFkX21hY19hZGRyKHN0cnVjdCBpMjQwMG0gKmkyNDAwbSkKK3sKKwlpbnQgcmVzdWx0OworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGkyNDAwbV9kZXYoaTI0MDBtKTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldiA9IGkyNDAwbS0+d2ltYXhfZGV2Lm5ldF9kZXY7CisJc3RydWN0IGkyNDAwbV9ib290cm9tX2hlYWRlciAqY21kOworCXN0cnVjdCB7CisJCXN0cnVjdCBpMjQwMG1fYm9vdHJvbV9oZWFkZXIgYWNrOworCQl1OCBhY2tfcGxbMTZdOworCX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSkgYWNrX2J1ZjsKKworCWRfZm5zdGFydCg1LCBkZXYsICIoaTI0MDBtICVwKVxuIiwgaTI0MDBtKTsKKwljbWQgPSBpMjQwMG0tPmJtX2NtZF9idWY7CisJY21kLT5jb21tYW5kID0gaTI0MDBtX2JyaF9jb21tYW5kKEkyNDAwTV9CUkhfUkVBRCwgMCwgMSk7CisJY21kLT50YXJnZXRfYWRkciA9IGNwdV90b19sZTMyKDB4MDAyMDNmZTgpOworCWNtZC0+ZGF0YV9zaXplID0gY3B1X3RvX2xlMzIoNik7CisJcmVzdWx0ID0gaTI0MDBtX2JtX2NtZChpMjQwMG0sIGNtZCwgc2l6ZW9mKCpjbWQpLAorCQkJICAgICAgICZhY2tfYnVmLmFjaywgc2l6ZW9mKGFja19idWYpLCAwKTsKKwlpZiAocmVzdWx0IDwgMCkgeworCQlkZXZfZXJyKGRldiwgIkJNOiByZWFkIG1hYyBhZGRyIGZhaWxlZDogJWRcbiIsIHJlc3VsdCk7CisJCWdvdG8gZXJyb3JfcmVhZF9tYWM7CisJfQorCWRfcHJpbnRmKDIsIGRldiwKKwkJICJtYWMgYWRkciBpcyAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKKwkJIGFja19idWYuYWNrX3BsWzBdLCBhY2tfYnVmLmFja19wbFsxXSwKKwkJIGFja19idWYuYWNrX3BsWzJdLCBhY2tfYnVmLmFja19wbFszXSwKKwkJIGFja19idWYuYWNrX3BsWzRdLCBhY2tfYnVmLmFja19wbFs1XSk7CisJaWYgKGkyNDAwbS0+YnVzX2JtX21hY19hZGRyX2ltcGFpcmVkID09IDEpIHsKKwkJYWNrX2J1Zi5hY2tfcGxbMF0gPSAweDAwOworCQlhY2tfYnVmLmFja19wbFsxXSA9IDB4MTY7CisJCWFja19idWYuYWNrX3BsWzJdID0gMHhkMzsKKwkJZ2V0X3JhbmRvbV9ieXRlcygmYWNrX2J1Zi5hY2tfcGxbM10sIDMpOworCQlkZXZfZXJyKGRldiwgIkJNIGlzIE1BQyBhZGRyIGltcGFpcmVkLCBmYWtpbmcgTUFDIGFkZHIgdG8gIgorCQkJIm1hYyBhZGRyIGlzICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAorCQkJYWNrX2J1Zi5hY2tfcGxbMF0sIGFja19idWYuYWNrX3BsWzFdLAorCQkJYWNrX2J1Zi5hY2tfcGxbMl0sIGFja19idWYuYWNrX3BsWzNdLAorCQkJYWNrX2J1Zi5hY2tfcGxbNF0sIGFja19idWYuYWNrX3BsWzVdKTsKKwkJcmVzdWx0ID0gMDsKKwl9CisJbmV0X2Rldi0+YWRkcl9sZW4gPSBFVEhfQUxFTjsKKwltZW1jcHkobmV0X2Rldi0+cGVybV9hZGRyLCBhY2tfYnVmLmFja19wbCwgRVRIX0FMRU4pOworCW1lbWNweShuZXRfZGV2LT5kZXZfYWRkciwgYWNrX2J1Zi5hY2tfcGwsIEVUSF9BTEVOKTsKK2Vycm9yX3JlYWRfbWFjOgorCWRfZm5lbmQoNSwgZGV2LCAiKGkyNDAwbSAlcCkgPSAlZFxuIiwgaTI0MDBtLCByZXN1bHQpOworCXJldHVybiByZXN1bHQ7Cit9CisKKworLyoKKyAqIEluaXRpYWxpemUgYSBub24gc2lnbmVkIGJvb3QKKyAqCisgKiBUaGlzIGltcGxpZXMgc2VuZGluZyBzb21lIG1hZ2ljIHZhbHVlcyB0byB0aGUgZGV2aWNlJ3MgbWVtb3J5LiBOb3RlCisgKiB3ZSBjb252ZXJ0IHRoZSB2YWx1ZXMgdG8gbGl0dGxlIGVuZGlhbiBpbiB0aGUgc2FtZSBhcnJheQorICogZGVjbGFyYXRpb24uCisgKi8KK3N0YXRpYworaW50IGkyNDAwbV9kbmxvYWRfaW5pdF9ub25zaWduZWQoc3RydWN0IGkyNDAwbSAqaTI0MDBtKQoreworI2RlZmluZSBQT0tFKGEsIGQpIHsJCQkJCVwKKwkuYWRkcmVzcyA9IF9fY29uc3RhbnRfY3B1X3RvX2xlMzIoYSksCQlcCisJLmRhdGEgPSBfX2NvbnN0YW50X2NwdV90b19sZTMyKGQpCQlcCit9CisJc3RhdGljIGNvbnN0IHN0cnVjdCB7CisJCV9fbGUzMiBhZGRyZXNzOworCQlfX2xlMzIgZGF0YTsKKwl9IGkyNDAwbV9wb2tlc1tdID0geworCQlQT0tFKDB4MDgxQTU4LCAweEE3ODEwMjMwKSwKKwkJUE9LRSgweDA4MDA0MCwgMHgwMDAwMDAwMCksCisJCVBPS0UoMHgwODAwNDgsIDB4MDAwMDAwODIpLAorCQlQT0tFKDB4MDgwMDRDLCAweDAwMDAwODFGKSwKKwkJUE9LRSgweDA4MDA1NCwgMHgwMDAwMDA4NSksCisJCVBPS0UoMHgwODAwNTgsIDB4MDAwMDAxODApLAorCQlQT0tFKDB4MDgwMDVDLCAweDAwMDAwMDE4KSwKKwkJUE9LRSgweDA4MDA2MCwgMHgwMDAwMDAxMCksCisJCVBPS0UoMHgwODA1NzQsIDB4MDAwMDAwMDEpLAorCQlQT0tFKDB4MDgwNTUwLCAweDAwMDAwMDA1KSwKKwkJUE9LRSgweEFFMDAwMCwgMHgwMDAwMDAwMCksCisJfTsKKyN1bmRlZiBQT0tFCisJdW5zaWduZWQgaTsKKwlpbnQgcmV0OworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGkyNDAwbV9kZXYoaTI0MDBtKTsKKworCWRldl93YXJuKGRldiwgIldBUk5JTkchISEgbm9uLXNpZ25lZCBib290IFVOVEVTVEVEIFBBVEghXG4iKTsKKworCWRfZm5zdGFydCg1LCBkZXYsICIoaTI0MDBtICVwKVxuIiwgaTI0MDBtKTsKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShpMjQwMG1fcG9rZXMpOyBpKyspIHsKKwkJcmV0ID0gaTI0MDBtX2Rvd25sb2FkX2NodW5rKGkyNDAwbSwgJmkyNDAwbV9wb2tlc1tpXS5kYXRhLAorCQkJCQkgICAgc2l6ZW9mKGkyNDAwbV9wb2tlc1tpXS5kYXRhKSwKKwkJCQkJICAgIGkyNDAwbV9wb2tlc1tpXS5hZGRyZXNzLCAxLCAxKTsKKwkJaWYgKHJldCA8IDApCisJCQlicmVhazsKKwl9CisJZF9mbmVuZCg1LCBkZXYsICIoaTI0MDBtICVwKSA9ICVkXG4iLCBpMjQwMG0sIHJldCk7CisJcmV0dXJuIHJldDsKK30KKworCisvKgorICogSW5pdGlhbGl6ZSB0aGUgc2lnbmVkIGJvb3QgcHJvY2VzcworICoKKyAqIEBpMjQwMG06IGRldmljZSBkZXNjcmlwdG9yCisgKgorICogQGJjZl9oZHI6IHBvaW50ZXIgdG8gdGhlIGZpcm13YXJlIGhlYWRlcjsgYXNzdW1lcyBpdCBpcyBmdWxseSBpbgorICogICAgIG1lbW9yeSAoaXQgaGFzIGdvbmUgdGhyb3VnaCBiYXNpYyB2YWxpZGF0aW9uKS4KKyAqCisgKiBSZXR1cm5zOiAwIGlmIG9rLCA8IDAgZXJybm8gY29kZSBvbiBlcnJvciwgLUVSRVNUQVJUU1lTIGlmIHRoZSBodworICogICAgIHJlYm9vdGVkLgorICoKKyAqIFRoaXMgd3JpdGVzIHRoZSBmaXJtd2FyZSBCQ0YgaGVhZGVyIHRvIHRoZSBkZXZpY2UgdXNpbmcgdGhlCisgKiBIQVNIX1BBWUxPQURfT05MWSBjb21tYW5kLgorICovCitzdGF0aWMKK2ludCBpMjQwMG1fZG5sb2FkX2luaXRfc2lnbmVkKHN0cnVjdCBpMjQwMG0gKmkyNDAwbSwKKwkJCSAgICAgIGNvbnN0IHN0cnVjdCBpMjQwMG1fYmNmX2hkciAqYmNmX2hkcikKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGkyNDAwbV9kZXYoaTI0MDBtKTsKKwlzdHJ1Y3QgeworCQlzdHJ1Y3QgaTI0MDBtX2Jvb3Ryb21faGVhZGVyIGNtZDsKKwkJc3RydWN0IGkyNDAwbV9iY2ZfaGRyIGNtZF9wbDsKKwl9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpICpjbWRfYnVmOworCXN0cnVjdCBpMjQwMG1fYm9vdHJvbV9oZWFkZXIgYWNrOworCisJZF9mbnN0YXJ0KDUsIGRldiwgIihpMjQwMG0gJXAgYmNmX2hkciAlcClcbiIsIGkyNDAwbSwgYmNmX2hkcik7CisJY21kX2J1ZiA9IGkyNDAwbS0+Ym1fY21kX2J1ZjsKKwljbWRfYnVmLT5jbWQuY29tbWFuZCA9CisJCWkyNDAwbV9icmhfY29tbWFuZChJMjQwME1fQlJIX0hBU0hfUEFZTE9BRF9PTkxZLCAwLCAwKTsKKwljbWRfYnVmLT5jbWQudGFyZ2V0X2FkZHIgPSAwOworCWNtZF9idWYtPmNtZC5kYXRhX3NpemUgPSBjcHVfdG9fbGUzMihzaXplb2YoY21kX2J1Zi0+Y21kX3BsKSk7CisJbWVtY3B5KCZjbWRfYnVmLT5jbWRfcGwsIGJjZl9oZHIsIHNpemVvZigqYmNmX2hkcikpOworCXJldCA9IGkyNDAwbV9ibV9jbWQoaTI0MDBtLCAmY21kX2J1Zi0+Y21kLCBzaXplb2YoKmNtZF9idWYpLAorCQkJICAgICZhY2ssIHNpemVvZihhY2spLCAwKTsKKwlpZiAocmV0ID49IDApCisJCXJldCA9IDA7CisJZF9mbmVuZCg1LCBkZXYsICIoaTI0MDBtICVwIGJjZl9oZHIgJXApID0gJWRcbiIsIGkyNDAwbSwgYmNmX2hkciwgcmV0KTsKKwlyZXR1cm4gcmV0OworfQorCisKKy8qCisgKiBJbml0aWFsaXplIHRoZSBmaXJtd2FyZSBkb3dubG9hZCBhdCB0aGUgZGV2aWNlIHNpemUKKyAqCisgKiBNdWx0aXBsZXggdG8gdGhlIG9uZSB0aGF0IG1hdHRlcnMgYmFzZWQgb24gdGhlIGRldmljZSdzIG1vZGUKKyAqIChzaWduZWQgb3Igbm9uLXNpZ25lZCkuCisgKi8KK3N0YXRpYworaW50IGkyNDAwbV9kbmxvYWRfaW5pdChzdHJ1Y3QgaTI0MDBtICppMjQwMG0sIGNvbnN0IHN0cnVjdCBpMjQwMG1fYmNmX2hkciAqYmNmKQoreworCWludCByZXN1bHQ7CisJc3RydWN0IGRldmljZSAqZGV2ID0gaTI0MDBtX2RldihpMjQwMG0pOworCXUzMiBtb2R1bGVfaWQgPSBsZTMyX3RvX2NwdShiY2YtPm1vZHVsZV9pZCk7CisKKwlpZiAoaTI0MDBtLT5zYm9vdCA9PSAwCisJICAgICYmIChtb2R1bGVfaWQgJiBJMjQwME1fQkNGX01PRF9JRF9QT0tFUykgPT0gMCkgeworCQkvKiBub24tc2lnbmVkIGJvb3QgcHJvY2VzcyB3aXRob3V0IHBva2VzICovCisJCXJlc3VsdCA9IGkyNDAwbV9kbmxvYWRfaW5pdF9ub25zaWduZWQoaTI0MDBtKTsKKwkJaWYgKHJlc3VsdCA9PSAtRVJFU1RBUlRTWVMpCisJCQlyZXR1cm4gcmVzdWx0OworCQlpZiAocmVzdWx0IDwgMCkKKwkJCWRldl9lcnIoZGV2LCAiZncgJXM6IG5vbi1zaWduZWQgZG93bmxvYWQgIgorCQkJCSJpbml0aWFsaXphdGlvbiBmYWlsZWQ6ICVkXG4iLAorCQkJCWkyNDAwbS0+YnVzX2Z3X25hbWUsIHJlc3VsdCk7CisJfSBlbHNlIGlmIChpMjQwMG0tPnNib290ID09IDAKKwkJICYmIChtb2R1bGVfaWQgJiBJMjQwME1fQkNGX01PRF9JRF9QT0tFUykpIHsKKwkJLyogbm9uLXNpZ25lZCBib290IHByb2Nlc3Mgd2l0aCBwb2tlcywgbm90aGluZyB0byBkbyAqLworCQlyZXN1bHQgPSAwOworCX0gZWxzZSB7CQkgLyogc2lnbmVkIGJvb3QgcHJvY2VzcyAqLworCQlyZXN1bHQgPSBpMjQwMG1fZG5sb2FkX2luaXRfc2lnbmVkKGkyNDAwbSwgYmNmKTsKKwkJaWYgKHJlc3VsdCA9PSAtRVJFU1RBUlRTWVMpCisJCQlyZXR1cm4gcmVzdWx0OworCQlpZiAocmVzdWx0IDwgMCkKKwkJCWRldl9lcnIoZGV2LCAiZncgJXM6IHNpZ25lZCBib290IGRvd25sb2FkICIKKwkJCQkiaW5pdGlhbGl6YXRpb24gZmFpbGVkOiAlZFxuIiwKKwkJCQlpMjQwMG0tPmJ1c19md19uYW1lLCByZXN1bHQpOworCX0KKwlyZXR1cm4gcmVzdWx0OworfQorCisKKy8qCisgKiBSdW4gcXVpY2sgY29uc2lzdGVuY3kgdGVzdHMgb24gdGhlIGZpcm13YXJlIGZpbGUKKyAqCisgKiBDaGVjayBmb3IgdGhlIGZpcm13YXJlIGJlaW5nIG1hZGUgZm9yIHRoZSBpMjQwMG0gZGV2aWNlLAorICogZXRjLi4uVGhlc2UgY2hlY2tzIGFyZSBtb3N0bHkgaW5mb3JtYXRpdmUsIGFzIHRoZSBkZXZpY2Ugd2lsbCBtYWtlCisgKiB0aGVtIHRvbzsgYnV0IHRoZSBkcml2ZXIncyByZXNwb25zZSBpcyBtb3JlIGluZm9ybWF0aXZlIG9uIHdoYXQKKyAqIHdlbnQgd3JvbmcuCisgKi8KK3N0YXRpYworaW50IGkyNDAwbV9md19jaGVjayhzdHJ1Y3QgaTI0MDBtICppMjQwMG0sCisJCSAgICBjb25zdCBzdHJ1Y3QgaTI0MDBtX2JjZl9oZHIgKmJjZiwKKwkJICAgIHNpemVfdCBiY2Zfc2l6ZSkKK3sKKwlpbnQgcmVzdWx0OworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGkyNDAwbV9kZXYoaTI0MDBtKTsKKwl1bnNpZ25lZCBtb2R1bGVfdHlwZSwgaGVhZGVyX2xlbiwgbWFqb3JfdmVyc2lvbiwgbWlub3JfdmVyc2lvbiwKKwkJbW9kdWxlX2lkLCBtb2R1bGVfdmVuZG9yLCBkYXRlLCBzaXplOworCisJLyogQ2hlY2sgaGFyZCBlcnJvcnMgKi8KKwlyZXN1bHQgPSAtRUlOVkFMOworCWlmIChiY2Zfc2l6ZSA8IHNpemVvZigqYmNmKSkgewkvKiBiaWcgZW5vdWdoIGhlYWRlcj8gKi8KKwkJZGV2X2VycihkZXYsICJmaXJtd2FyZSAlcyB0b28gc2hvcnQ6ICIKKwkJCSIlenUgQiB2cyAlenUgKGF0IGxlYXN0KSBleHBlY3RlZFxuIiwKKwkJCWkyNDAwbS0+YnVzX2Z3X25hbWUsIGJjZl9zaXplLCBzaXplb2YoKmJjZikpOworCQlnb3RvIGVycm9yOworCX0KKworCW1vZHVsZV90eXBlID0gYmNmLT5tb2R1bGVfdHlwZTsKKwloZWFkZXJfbGVuID0gc2l6ZW9mKHUzMikgKiBsZTMyX3RvX2NwdShiY2YtPmhlYWRlcl9sZW4pOworCW1ham9yX3ZlcnNpb24gPSBsZTMyX3RvX2NwdShiY2YtPmhlYWRlcl92ZXJzaW9uKSAmIDB4ZmZmZjAwMDAgPj4gMTY7CisJbWlub3JfdmVyc2lvbiA9IGxlMzJfdG9fY3B1KGJjZi0+aGVhZGVyX3ZlcnNpb24pICYgMHgwMDAwZmZmZjsKKwltb2R1bGVfaWQgPSBsZTMyX3RvX2NwdShiY2YtPm1vZHVsZV9pZCk7CisJbW9kdWxlX3ZlbmRvciA9IGxlMzJfdG9fY3B1KGJjZi0+bW9kdWxlX3ZlbmRvcik7CisJZGF0ZSA9IGxlMzJfdG9fY3B1KGJjZi0+ZGF0ZSk7CisJc2l6ZSA9IHNpemVvZih1MzIpICogbGUzMl90b19jcHUoYmNmLT5zaXplKTsKKworCWlmIChiY2Zfc2l6ZSAhPSBzaXplKSB7CQkvKiBhbm5veWluZ2x5IHBhcmFub2lkICovCisJCWRldl9lcnIoZGV2LCAiZmlybXdhcmUgJXM6IGJhZCBzaXplLCBnb3QgIgorCQkJIiV6dSBCIHZzICV1IGV4cGVjdGVkXG4iLAorCQkJaTI0MDBtLT5idXNfZndfbmFtZSwgYmNmX3NpemUsIHNpemUpOworCQlnb3RvIGVycm9yOworCX0KKworCWRfcHJpbnRmKDIsIGRldiwgInR5cGUgMHgleCBpZCAweCV4IHZlbmRvciAweCV4OyBoZWFkZXIgdiV1LiV1ICglenUgQikgIgorCQkgImRhdGUgJTA4eCAoJXp1IEIpXG4iLAorCQkgbW9kdWxlX3R5cGUsIG1vZHVsZV9pZCwgbW9kdWxlX3ZlbmRvciwKKwkJIG1ham9yX3ZlcnNpb24sIG1pbm9yX3ZlcnNpb24sIChzaXplX3QpIGhlYWRlcl9sZW4sCisJCSBkYXRlLCAoc2l6ZV90KSBzaXplKTsKKworCWlmIChtb2R1bGVfdHlwZSAhPSA2KSB7CQkvKiBidWlsdCBmb3IgdGhlIHJpZ2h0IGhhcmR3YXJlPyAqLworCQlkZXZfZXJyKGRldiwgImJhZCBmdyAlczogdW5leHBlY3RlZCBtb2R1bGUgdHlwZSAweCV4OyAiCisJCQkiYWJvcnRpbmdcbiIsIGkyNDAwbS0+YnVzX2Z3X25hbWUsIG1vZHVsZV90eXBlKTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwkvKiBDaGVjayBzb2Z0LWVyIGVycm9ycyAqLworCXJlc3VsdCA9IDA7CisJaWYgKG1vZHVsZV92ZW5kb3IgIT0gMHg4MDg2KQorCQlkZXZfZXJyKGRldiwgImJhZCBmdyAlcz8gdW5leHBlY3RlZCB2ZW5kb3IgMHglMDR4XG4iLAorCQkJaTI0MDBtLT5idXNfZndfbmFtZSwgbW9kdWxlX3ZlbmRvcik7CisJaWYgKGRhdGUgPCAweDIwMDgwMzAwKQorCQlkZXZfZXJyKGRldiwgImJhZCBmdyAlcz8gYnVpbGQgZGF0ZSB0b28gb2xkICUwOHhcbiIsCisJCQlpMjQwMG0tPmJ1c19md19uYW1lLCBkYXRlKTsKK2Vycm9yOgorCXJldHVybiByZXN1bHQ7Cit9CisKKworLyoKKyAqIERvd25sb2FkIHRoZSBmaXJtd2FyZSB0byB0aGUgZGV2aWNlCisgKgorICogQGkyNDAwbTogZGV2aWNlIGRlc2NyaXB0b3IKKyAqIEBiY2Y6IHBvaW50ZXIgdG8gbG9hZGVkIChhbmQgbWluaW1hbGx5IHZlcmlmaWVkIGZvciBjb25zaXN0ZW5jeSkKKyAqICAgIGZpcm13YXJlCisgKiBAYmNmX3NpemU6IHNpemUgb2YgdGhlIEBiY2YgYnVmZmVyIChoZWFkZXIgcGx1cyBwYXlsb2FkcykKKyAqCisgKiBUaGUgcHJvY2VzcyBmb3IgZG9pbmcgdGhpcyBpcyBkZXNjcmliZWQgaW4gdGhpcyBmaWxlJ3MgaGVhZGVyLgorICoKKyAqIE5vdGUgd2Ugb25seSByZWluaXRpYWxpemUgYm9vdC1tb2RlIGlmIHRoZSBmbGFncyBzYXkgc28uIFNvbWUgaHcKKyAqIGl0ZXJhdGlvbnMgbmVlZCBpdCwgc29tZSBkb24ndC4gSW4gYW55IGNhc2UsIGlmIHdlIGxvb3AsIHdlIGFsd2F5cworICogbmVlZCB0byByZWluaXRpYWxpemUgdGhlIGJvb3Qgcm9vbSwgaGVuY2UgdGhlIGZsYWdzIG1vZGlmaWNhdGlvbi4KKyAqLworc3RhdGljCitpbnQgaTI0MDBtX2Z3X2RubG9hZChzdHJ1Y3QgaTI0MDBtICppMjQwMG0sIGNvbnN0IHN0cnVjdCBpMjQwMG1fYmNmX2hkciAqYmNmLAorCQkgICAgIHNpemVfdCBiY2Zfc2l6ZSwgZW51bSBpMjQwMG1fYnJpIGZsYWdzKQoreworCWludCByZXQgPSAwOworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGkyNDAwbV9kZXYoaTI0MDBtKTsKKwlpbnQgY291bnQgPSBJMjQwME1fQk9PVF9SRVRSSUVTOworCisJZF9mbnN0YXJ0KDUsIGRldiwgIihpMjQwMG0gJXAgYmNmICVwIHNpemUgJXp1KVxuIiwKKwkJICBpMjQwMG0sIGJjZiwgYmNmX3NpemUpOworCWkyNDAwbS0+Ym9vdF9tb2RlID0gMTsKK2h3X3JlYm9vdDoKKwlpZiAoY291bnQtLSA9PSAwKSB7CisJCXJldCA9IC1FUkVTVEFSVFNZUzsKKwkJZGV2X2VycihkZXYsICJkZXZpY2UgcmVib290ZWQgdG9vIG1hbnkgdGltZXMsIGFib3J0aW5nXG4iKTsKKwkJZ290byBlcnJvcl90b29fbWFueV9yZWJvb3RzOworCX0KKwlpZiAoZmxhZ3MgJiBJMjQwME1fQlJJX01BQ19SRUlOSVQpIHsKKwkJcmV0ID0gaTI0MDBtX2Jvb3Ryb21faW5pdChpMjQwMG0sIGZsYWdzKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWRldl9lcnIoZGV2LCAiYm9vdHJvbSBpbml0IGZhaWxlZDogJWRcbiIsIHJldCk7CisJCQlnb3RvIGVycm9yX2Jvb3Ryb21faW5pdDsKKwkJfQorCX0KKwlmbGFncyB8PSBJMjQwME1fQlJJX01BQ19SRUlOSVQ7CisKKwkvKgorCSAqIEluaXRpYWxpemUgdGhlIGRvd25sb2FkLCBwdXNoIHRoZSBieXRlcyB0byB0aGUgZGV2aWNlIGFuZAorCSAqIHRoZW4ganVtcCB0byB0aGUgbmV3IGZpcm13YXJlLiBOb3RlIEByZXQgaXMgcGFzc2VkIHdpdGggdGhlCisJICogb2Zmc2V0IG9mIHRoZSBqdW1wIGluc3RydWN0aW9uIHRvIF9kbmxvYWRfZmluYWxpemUoKQorCSAqLworCXJldCA9IGkyNDAwbV9kbmxvYWRfaW5pdChpMjQwMG0sIGJjZik7CS8qIEluaXQgZGV2aWNlJ3MgZG5sb2FkICovCisJaWYgKHJldCA9PSAtRVJFU1RBUlRTWVMpCisJCWdvdG8gZXJyb3JfZGV2X3JlYm9vdGVkOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycm9yX2RubG9hZF9pbml0OworCisJcmV0ID0gaTI0MDBtX2RubG9hZF9iY2YoaTI0MDBtLCBiY2YsIGJjZl9zaXplKTsKKwlpZiAocmV0ID09IC1FUkVTVEFSVFNZUykKKwkJZ290byBlcnJvcl9kZXZfcmVib290ZWQ7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycihkZXYsICJmdyAlczogZG93bmxvYWQgZmFpbGVkOiAlZFxuIiwKKwkJCWkyNDAwbS0+YnVzX2Z3X25hbWUsIHJldCk7CisJCWdvdG8gZXJyb3JfZG5sb2FkX2JjZjsKKwl9CisKKwlyZXQgPSBpMjQwMG1fZG5sb2FkX2ZpbmFsaXplKGkyNDAwbSwgYmNmLCByZXQpOworCWlmIChyZXQgPT0gLUVSRVNUQVJUU1lTKQorCQlnb3RvIGVycm9yX2Rldl9yZWJvb3RlZDsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKGRldiwgImZ3ICVzOiAiCisJCQkiZG93bmxvYWQgZmluYWxpemF0aW9uIGZhaWxlZDogJWRcbiIsCisJCQlpMjQwMG0tPmJ1c19md19uYW1lLCByZXQpOworCQlnb3RvIGVycm9yX2RubG9hZF9maW5hbGl6ZTsKKwl9CisKKwlkX3ByaW50ZigyLCBkZXYsICJmdyAlcyBzdWNjZXNzZnVsbHkgdXBsb2FkZWRcbiIsCisJCSBpMjQwMG0tPmJ1c19md19uYW1lKTsKKwlpMjQwMG0tPmJvb3RfbW9kZSA9IDA7CitlcnJvcl9kbmxvYWRfZmluYWxpemU6CitlcnJvcl9kbmxvYWRfYmNmOgorZXJyb3JfZG5sb2FkX2luaXQ6CitlcnJvcl9ib290cm9tX2luaXQ6CitlcnJvcl90b29fbWFueV9yZWJvb3RzOgorCWRfZm5lbmQoNSwgZGV2LCAiKGkyNDAwbSAlcCBiY2YgJXAgc2l6ZSAlenUpID0gJWRcbiIsCisJCWkyNDAwbSwgYmNmLCBiY2Zfc2l6ZSwgcmV0KTsKKwlyZXR1cm4gcmV0OworCitlcnJvcl9kZXZfcmVib290ZWQ6CisJZGV2X2VycihkZXYsICJkZXZpY2UgcmVib290ZWQsICVkIHRyaWVzIGxlZnRcbiIsIGNvdW50KTsKKwkvKiB3ZSBnb3QgdGhlIG5vdGlmaWNhdGlvbiBhbHJlYWR5LCBubyBuZWVkIHRvIHdhaXQgZm9yIGl0IGFnYWluICovCisJZmxhZ3MgfD0gSTI0MDBNX0JSSV9TT0ZUOworCWdvdG8gaHdfcmVib290OworfQorCisKKy8qKgorICogaTI0MDBtX2Rldl9ib290c3RyYXAgLSBCcmluZyB0aGUgZGV2aWNlIHRvIGEga25vd24gc3RhdGUgYW5kIHVwbG9hZCBmaXJtd2FyZQorICoKKyAqIEBpMjQwMG06IGRldmljZSBkZXNjcmlwdG9yCisgKgorICogUmV0dXJuczogPj0gMCBpZiBvaywgPCAwIGVycm5vIGNvZGUgb24gZXJyb3IuCisgKgorICogVGhpcyBzZXRzIHVwIHRoZSBmaXJtd2FyZSB1cGxvYWQgZW52aXJvbm1lbnQsIGxvYWRzIHRoZSBmaXJtd2FyZQorICogZmlsZSBmcm9tIGRpc2ssIHZlcmlmaWVzIGFuZCB0aGVuIGNhbGxzIHRoZSBmaXJtd2FyZSB1cGxvYWQgcHJvY2VzcworICogcGVyIHNlLgorICoKKyAqIENhbiBiZSBjYWxsZWQgZWl0aGVyIGZyb20gcHJvYmUsIG9yIGFmdGVyIGEgd2FybSByZXNldC4gIENhbiBub3QgYmUKKyAqIGNhbGxlZCBmcm9tIHdpdGhpbiBhbiBpbnRlcnJ1cHQuICBBbGwgdGhlIGZsb3cgaW4gdGhpcyBjb2RlIGlzCisgKiBzaW5nbGUtdGhyZWFkZTsgYWxsIEkvT3MgYXJlIHN5bmNocm9ub3VzLgorICovCitpbnQgaTI0MDBtX2Rldl9ib290c3RyYXAoc3RydWN0IGkyNDAwbSAqaTI0MDBtLCBlbnVtIGkyNDAwbV9icmkgZmxhZ3MpCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IGRldmljZSAqZGV2ID0gaTI0MDBtX2RldihpMjQwMG0pOworCWNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZnc7CisJY29uc3Qgc3RydWN0IGkyNDAwbV9iY2ZfaGRyICpiY2Y7CS8qIEZpcm13YXJlIGRhdGEgKi8KKworCWRfZm5zdGFydCg1LCBkZXYsICIoaTI0MDBtICVwKVxuIiwgaTI0MDBtKTsKKwkvKiBMb2FkIGZpcm13YXJlIGZpbGVzIHRvIG1lbW9yeS4gKi8KKwlyZXQgPSByZXF1ZXN0X2Zpcm13YXJlKCZmdywgaTI0MDBtLT5idXNfZndfbmFtZSwgZGV2KTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoZGV2LCAiZncgJXM6IHJlcXVlc3QgZmFpbGVkOiAlZFxuIiwKKwkJCWkyNDAwbS0+YnVzX2Z3X25hbWUsIHJldCk7CisJCWdvdG8gZXJyb3JfZndfcmVxOworCX0KKwliY2YgPSAodm9pZCAqKSBmdy0+ZGF0YTsKKworCXJldCA9IGkyNDAwbV9md19jaGVjayhpMjQwMG0sIGJjZiwgZnctPnNpemUpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycm9yX2Z3X2JhZDsKKwlyZXQgPSBpMjQwMG1fZndfZG5sb2FkKGkyNDAwbSwgYmNmLCBmdy0+c2l6ZSwgZmxhZ3MpOworZXJyb3JfZndfYmFkOgorCXJlbGVhc2VfZmlybXdhcmUoZncpOworZXJyb3JfZndfcmVxOgorCWRfZm5lbmQoNSwgZGV2LCAiKGkyNDAwbSAlcCkgPSAlZFxuIiwgaTI0MDBtLCByZXQpOworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChpMjQwMG1fZGV2X2Jvb3RzdHJhcCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aW1heC9pMjQwMG0vaTI0MDBtLXNkaW8uaCBiL2RyaXZlcnMvbmV0L3dpbWF4L2kyNDAwbS9pMjQwMG0tc2Rpby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4YzJmYjcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aW1heC9pMjQwMG0vaTI0MDBtLXNkaW8uaApAQCAtMCwwICsxLDEzMiBAQAorLyoKKyAqIEludGVsIFdpcmVsZXNzIFdpTUFYIENvbm5lY3Rpb24gMjQwMG0KKyAqIFNESU8tc3BlY2lmaWMgaTI0MDBtIGRyaXZlciBkZWZpbml0aW9ucworICoKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICAgZGlzdHJpYnV0aW9uLgorICogICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgSW50ZWwgQ29ycG9yYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKgorICogSW50ZWwgQ29ycG9yYXRpb24gPGxpbnV4LXdpbWF4QGludGVsLmNvbT4KKyAqIEJyaWFuIEJpYW4gPGJyaWFuLmJpYW5AaW50ZWwuY29tPgorICogRGlyayBCcmFuZGV3aWUgPGRpcmsuai5icmFuZGV3aWVAaW50ZWwuY29tPgorICogSW5ha3kgUGVyZXotR29uemFsZXogPGluYWt5LnBlcmV6LWdvbnphbGV6QGludGVsLmNvbT4KKyAqIFlhbmlyIEx1YmV0a2luIDx5YW5pcngubHViZXRraW5AaW50ZWwuY29tPgorICogIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbgorICoKKyAqCisgKiBUaGlzIGRyaXZlciBpbXBsZW1lbnRzIHRoZSBidXMtc3BlY2lmaWMgcGFydCBvZiB0aGUgaTI0MDBtIGZvcgorICogU0RJTy4gQ2hlY2sgaTI0MDBtLmggZm9yIGEgZ2VuZXJpYyBkcml2ZXIgZGVzY3JpcHRpb24uCisgKgorICogQVJDSElURUNUVVJFCisgKgorICogVGhpcyBkcml2ZXIgc2l0cyB1bmRlciB0aGUgYnVzLWdlbmVyaWMgaTI0MDBtIGRyaXZlciwgcHJvdmlkaW5nIHRoZQorICogY29ubmVjdGlvbiB0byB0aGUgZGV2aWNlLgorICoKKyAqIFdoZW4gcHJvYmVkLCBhbGwgdGhlIGZ1bmN0aW9uIHBvaW50ZXJzIGFyZSBzZXR1cCBhbmQgdGhlbiB0aGUKKyAqIGJ1cy1nZW5lcmljIGNvZGUgY2FsbGVkLiBUaGUgZ2VuZXJpYyBkcml2ZXIgd2lsbCB0aGVuIHVzZSB0aGUKKyAqIHByb3ZpZGVkIHBvaW50ZXJzIGZvciB1cGxvYWRpbmcgZmlybXdhcmUgKGkyNDAwbXNfYnVzX2JtKigpIGluCisgKiBzZGlvLWZ3LmMpIGFuZCB0aGVuIHNldHRpbmcgdXAgdGhlIGRldmljZSAoaTI0MDBtc19kZXZfKigpIGluCisgKiBzZGlvLmMpLgorICoKKyAqIE9uY2UgZmlybXdhcmUgaXMgdXBsb2FkZWQsIFRYIGZ1bmN0aW9ucyAoc2Rpby10eC5jKSBhcmUgY2FsbGVkIHdoZW4KKyAqIGRhdGEgaXMgcmVhZHkgZm9yIHRyYW5zbWlzc2lvbiBpbiB0aGUgVFggZmlmbzsgdGhlbiB0aGUgU0RJTyBJUlEgaXMKKyAqIGZpcmVkIGFuZCBkYXRhIGlzIGF2YWlsYWJsZSAoc2Rpby1yeC5jKSwgaXQgaXMgc2VudCB0byB0aGUgZ2VuZXJpYworICogZHJpdmVyIGZvciBwcm9jZXNzaW5nIHdpdGggaTI0MDBtX3J4LgorICovCisKKyNpZm5kZWYgX19JMjQwME1fU0RJT19IX18KKyNkZWZpbmUgX19JMjQwME1fU0RJT19IX18KKworI2luY2x1ZGUgImkyNDAwbS5oIgorCisvKiBIb3N0LURldmljZSBpbnRlcmZhY2UgZm9yIFNESU8gKi8KK2VudW0geworCUkyNDAwTVNfQkxLX1NJWkUgPSAyNTYsCisJSTI0MDBNU19QTF9TSVpFX01BWCA9IDB4M0UwMCwKKworCUkyNDAwTVNfREFUQV9BRERSID0gMHgwLAorCUkyNDAwTVNfSU5UUl9TVEFUVVNfQUREUiA9IDB4MTMsCisJSTI0MDBNU19JTlRSX0NMRUFSX0FERFIgPSAweDEzLAorCUkyNDAwTVNfSU5UUl9FTkFCTEVfQUREUiA9IDB4MTQsCisJSTI0MDBNU19JTlRSX0dFVF9TSVpFX0FERFIgPSAweDJDLAorCS8qIFRoZSBudW1iZXIgb2YgdGlja3MgdG8gd2FpdCBmb3IgdGhlIGRldmljZSB0byBzaWduYWwgdGhhdAorCSAqIGl0IGlzIHJlYWR5ICovCisJSTI0MDBNU19JTklUX1NMRUVQX0lOVEVSVkFMID0gMTAsCit9OworCisKKy8qKgorICogc3RydWN0IGkyNDAwbXMgLSBkZXNjcmlwdG9yIGZvciBhIFNESU8gY29ubmVjdGVkIGkyNDAwbQorICoKKyAqIEBpMjQwMG06IGJ1cy1nZW5lcmljIGkyNDAwbSBpbXBsZW1lbnRhdGlvbjsgaGFzIHRvIGJlIGZpcnN0IChzZWUKKyAqICAgICBpdCdzIGRvY3VtZW50YXRpb24gaW4gaTI0MDBtLmgpLgorICoKKyAqIEBmdW5jOiBwb2ludGVyIHRvIG91ciBTRElPIGZ1bmN0aW9uCisgKgorICogQHR4X3dvcmtlcjogd29ya3F1ZXVlIHN0cnVjdCB1c2VkIHRvIFRYIGRhdGEgd2hlbiB0aGUgYnVzLWdlbmVyaWMKKyAqICAgICBjb2RlIHNpZ25hbHMgcGFja2V0cyBhcmUgcGVuZGluZyBmb3IgdHJhbnNtaXNzaW9uIHRvIHRoZSBkZXZpY2UuCisgKgorICogQHR4X3dvcmtxdWV1ZTogd29ya3FldWV1ZSB1c2VkIGZvciBkYXRhIFRYOyB3ZSBkb24ndCB1c2UgdGhlCisgKiAgICAgc3lzdGVtJ3Mgd29ya3F1ZXVlIGFzIHRoYXQgbWlnaHQgY2F1c2UgZGVhZGxvY2tzIHdpdGggY29kZSBpbgorICogICAgIHRoZSBidXMtZ2VuZXJpYyBkcml2ZXIuCisgKi8KK3N0cnVjdCBpMjQwMG1zIHsKKwlzdHJ1Y3QgaTI0MDBtIGkyNDAwbTsJCS8qIEZJUlNUISBTZWUgZG9jICovCisJc3RydWN0IHNkaW9fZnVuYyAqZnVuYzsKKworCXN0cnVjdCB3b3JrX3N0cnVjdCB0eF93b3JrZXI7CisJc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKnR4X3dvcmtxdWV1ZTsKKwljaGFyIHR4X3dxX25hbWVbMzJdOworCisJc3RydWN0IGRlbnRyeSAqZGVidWdmc19kZW50cnk7Cit9OworCisKK3N0YXRpYyBpbmxpbmUKK3ZvaWQgaTI0MDBtc19pbml0KHN0cnVjdCBpMjQwMG1zICppMjQwMG1zKQoreworCWkyNDAwbV9pbml0KCZpMjQwMG1zLT5pMjQwMG0pOworfQorCisKK2V4dGVybiBpbnQgaTI0MDBtc19yeF9zZXR1cChzdHJ1Y3QgaTI0MDBtcyAqKTsKK2V4dGVybiB2b2lkIGkyNDAwbXNfcnhfcmVsZWFzZShzdHJ1Y3QgaTI0MDBtcyAqKTsKK2V4dGVybiBzc2l6ZV90IF9faTI0MDBtc19yeF9nZXRfc2l6ZShzdHJ1Y3QgaTI0MDBtcyAqKTsKKworZXh0ZXJuIGludCBpMjQwMG1zX3R4X3NldHVwKHN0cnVjdCBpMjQwMG1zICopOworZXh0ZXJuIHZvaWQgaTI0MDBtc190eF9yZWxlYXNlKHN0cnVjdCBpMjQwMG1zICopOworZXh0ZXJuIHZvaWQgaTI0MDBtc19idXNfdHhfa2ljayhzdHJ1Y3QgaTI0MDBtICopOworCitleHRlcm4gc3NpemVfdCBpMjQwMG1zX2J1c19ibV9jbWRfc2VuZChzdHJ1Y3QgaTI0MDBtICosCisJCQkJICAgICAgIGNvbnN0IHN0cnVjdCBpMjQwMG1fYm9vdHJvbV9oZWFkZXIgKiwKKwkJCQkgICAgICAgc2l6ZV90LCBpbnQpOworZXh0ZXJuIHNzaXplX3QgaTI0MDBtc19idXNfYm1fd2FpdF9mb3JfYWNrKHN0cnVjdCBpMjQwMG0gKiwKKwkJCQkJICAgc3RydWN0IGkyNDAwbV9ib290cm9tX2hlYWRlciAqLAorCQkJCQkgICBzaXplX3QpOworI2VuZGlmIC8qICNpZm5kZWYgX19JMjQwME1fU0RJT19IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpbWF4L2kyNDAwbS9pMjQwMG0tdXNiLmggYi9kcml2ZXJzL25ldC93aW1heC9pMjQwMG0vaTI0MDBtLXVzYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmNzY1NTgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aW1heC9pMjQwMG0vaTI0MDBtLXVzYi5oCkBAIC0wLDAgKzEsMjY0IEBACisvKgorICogSW50ZWwgV2lyZWxlc3MgV2lNQVggQ29ubmVjdGlvbiAyNDAwbQorICogVVNCLXNwZWNpZmljIGkyNDAwbSBkcml2ZXIgZGVmaW5pdGlvbnMKKyAqCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgIGRpc3RyaWJ1dGlvbi4KKyAqICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEludGVsIENvcnBvcmF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICoKKyAqIEludGVsIENvcnBvcmF0aW9uIDxsaW51eC13aW1heEBpbnRlbC5jb20+CisgKiBJbmFreSBQZXJlei1Hb256YWxleiA8aW5ha3kucGVyZXotZ29uemFsZXpAaW50ZWwuY29tPgorICogWWFuaXIgTHViZXRraW4gPHlhbmlyeC5sdWJldGtpbkBpbnRlbC5jb20+CisgKiAgLSBJbml0aWFsIGltcGxlbWVudGF0aW9uCisgKgorICoKKyAqIFRoaXMgZHJpdmVyIGltcGxlbWVudHMgdGhlIGJ1cy1zcGVjaWZpYyBwYXJ0IG9mIHRoZSBpMjQwMG0gZm9yCisgKiBVU0IuIENoZWNrIGkyNDAwbS5oIGZvciBhIGdlbmVyaWMgZHJpdmVyIGRlc2NyaXB0aW9uLgorICoKKyAqIEFSQ0hJVEVDVFVSRQorICoKKyAqIFRoaXMgZHJpdmVyIGxpc3RlbnMgdG8gbm90aWZpY2F0aW9ucyBzZW50IGZyb20gdGhlIG5vdGlmaWNhdGlvbgorICogZW5kcG9pbnQgKGluIHVzYi1ub3RpZi5jKTsgd2hlbiBkYXRhIGlzIHJlYWR5IHRvIHJlYWQsIHRoZSBjb2RlIGluCisgKiB0aGVyZSBzY2hlZHVsZXMgYSByZWFkIGZyb20gdGhlIGRldmljZSAodXNiLXJ4LmMpIGFuZCB0aGVuIHBhc3NlcworICogdGhlIGRhdGEgdG8gdGhlIGdlbmVyaWMgUlggY29kZSAocnguYykuCisgKgorICogV2hlbiB0aGUgZ2VuZXJpYyBkcml2ZXIgbmVlZHMgdG8gc2VuZCBkYXRhIChuZXR3b3JrIG9yIGNvbnRyb2wpLCBpdAorICogcXVldWVzIHVwIGluIHRoZSBUWCBGSUZPICh0eC5jKSBhbmQgdGhhdCB3aWxsIG5vdGlmeSB0aGUgZHJpdmVyCisgKiB0aHJvdWdoIHRoZSBpMjQwMG0tPmJ1c190eF9raWNrKCkgY2FsbGJhY2sKKyAqICh1c2ItdHguYzppMjQwMG11X2J1c190eF9raWNrKSB3aGljaCB3aWxsIHNlbmQgdGhlIGl0ZW1zIGluIHRoZQorICogRklGTyBxdWV1ZS4KKyAqCisgKiBUaGlzIGRyaXZlciwgYXMgd2VsbCwgaW1wbGVtZW50cyB0aGUgVVNCLXNwZWNpZmljIG9wcyBmb3IgdGhlIGdlbmVyaWMKKyAqIGRyaXZlciB0byBiZSBhYmxlIHRvIHNldHVwL3RlYXJkb3duIGNvbW11bmljYXRpb24gd2l0aCB0aGUgZGV2aWNlCisgKiBbaTI0MDBtX2J1c19kZXZfc3RhcnQoKSBhbmQgaTI0MDBtX2J1c19kZXZfc3RvcCgpXSwgcmVzZXRpbmcgdGhlCisgKiBkZXZpY2UgW2kyNDAwbV9idXNfcmVzZXQoKV0gYW5kIHBlcmZvcm1pbmcgZmlybXdhcmUgdXBsb2FkCisgKiBbaTI0MDBtX2J1c19ibV9jbWQoKSBhbmQgaTI0MDBfYnVzX2JtX3dhaXRfZm9yX2FjaygpXS4KKyAqLworCisjaWZuZGVmIF9fSTI0MDBNX1VTQl9IX18KKyNkZWZpbmUgX19JMjQwME1fVVNCX0hfXworCisjaW5jbHVkZSAiaTI0MDBtLmgiCisjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgorCisKKy8qCisgKiBFcnJvciBEZW5zaXR5IENvdW50OiBjaGVhcG8gZXJyb3IgZGVuc2l0eSAob3ZlciB0aW1lKSBjb3VudGVyCisgKgorICogT3JpZ2luYWxseSBieSBSZWluZXR0ZSBDaGF0cmUgPHJlaW5ldHRlLmNoYXRyZUBpbnRlbC5jb20+CisgKgorICogRW1iZWQgYW4gJ3N0cnVjdCBlZGMnIHNvbWV3aGVyZS4gRWFjaCB0aW1lIHRoZXJlIGlzIGEgc29mdCBvcgorICogcmV0cnlhYmxlIGVycm9yLCBjYWxsIGVkY19pbmMoKSBhbmQgY2hlY2sgaWYgdGhlIGVycm9yIHRvcAorICogd2F0ZXJtYXJrIGhhcyBiZWVuIHJlYWNoZWQuCisgKi8KK2VudW0geworCUVEQ19NQVhfRVJST1JTID0gMTAsCisJRURDX0VSUk9SX1RJTUVGUkFNRSA9IEhaLAorfTsKKworLyogZXJyb3IgZGVuc2l0eSBjb3VudGVyICovCitzdHJ1Y3QgZWRjIHsKKwl1bnNpZ25lZCBsb25nIHRpbWVzdGFydDsKKwl1MTYgZXJyb3Jjb3VudDsKK307CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBlZGNfaW5pdChzdHJ1Y3QgZWRjICplZGMpCit7CisJZWRjLT50aW1lc3RhcnQgPSBqaWZmaWVzOworfQorCisvKioKKyAqIGVkY19pbmMgLSByZXBvcnQgYSBzb2Z0IGVycm9yIGFuZCBjaGVjayBpZiB3ZSBhcmUgb3ZlciB0aGUgd2F0ZXJtYXJrCisgKgorICogQGVkYzogcG9pbnRlciB0byBlcnJvciBkZW5zaXR5IGNvdW50ZXIuCisgKiBAbWF4X2VycjogbWF4aW11bSBudW1iZXIgb2YgZXJyb3JzIHdlIGNhbiBhY2NlcHQgb3ZlciB0aGUgdGltZWZyYW1lCisgKiBAdGltZWZyYW1lOiBsZW5naHQgb2YgdGhlIHRpbWVmcmFtZSAoaW4gamlmZmllcykuCisgKgorICogUmV0dXJuczogITAgMSBpZiBtYXhpbXVtIGFjY2VwdGFibGUgZXJyb3JzIHBlciB0aW1lZnJhbWUgaGFzIGJlZW4KKyAqICAgICBleGNlZWRlZC4gMCBvdGhlcndpc2UuCisgKgorICogVGhpcyBpcyB3YXkgdG8gZGV0ZXJtaW5lIGlmIHRoZSBudW1iZXIgb2YgYWNjZXB0YWJsZSBlcnJvcnMgcGVyIHRpbWUKKyAqIHBlcmlvZCBoYXMgYmVlbiBleGNlZWRlZC4gSXQgaXMgbm90IGFjY3VyYXRlIGFzIHRoZXJlIGFyZSBjYXNlcyBpbiB3aGljaAorICogdGhpcyBzY2hlbWUgd2lsbCBub3Qgd29yaywgZm9yIGV4YW1wbGUgaWYgdGhlcmUgYXJlIHBlcmlvZGljIG9jY3VyZW5jZXMKKyAqIG9mIGVycm9ycyB0aGF0IHN0cmFkZGxlIHVwZGF0ZXMgdG8gdGhlIHN0YXJ0IHRpbWUuIFRoaXMgc2NoZW1lIGlzCisgKiBzdWZmaWNpZW50IGZvciBvdXIgdXNhZ2UuCisgKgorICogVG8gdXNlLCBlbWJlZCBhICdzdHJ1Y3QgZWRjJyBzb21ld2hlcmUsIGluaXRpYWxpemUgaXQgd2l0aAorICogZWRjX2luaXQoKSBhbmQgd2hlbiBhbiBlcnJvciBoaXRzOgorICoKKyAqIGlmIChkb19zb21ldGhpbmdfZmFpbHNfd2l0aF9hX3NvZnRfZXJyb3IpIHsKKyAqICAgICAgICBpZiAoZWRjX2luYygmbXktPmVkYywgTUFYX0VSUk9SUywgTUFYX1RJTUVGUkFNRSkpCisgKiAJICAgICAgICAgICBPcHMsIGhhcmQgZXJyb3IsIGRvIHNvbWV0aGluZyBhYm91dCBpdAorICogICAgICAgIGVsc2UKKyAqICAgICAgICAgICAgICAgICBSZXRyeSBvciBpZ25vcmUsIGRlcGVuZGluZyBvbiB3aGF0ZXZlcgorICogfQorICovCitzdGF0aWMgaW5saW5lIGludCBlZGNfaW5jKHN0cnVjdCBlZGMgKmVkYywgdTE2IG1heF9lcnIsIHUxNiB0aW1lZnJhbWUpCit7CisJdW5zaWduZWQgbG9uZyBub3c7CisKKwlub3cgPSBqaWZmaWVzOworCWlmIChub3cgLSBlZGMtPnRpbWVzdGFydCA+IHRpbWVmcmFtZSkgeworCQllZGMtPmVycm9yY291bnQgPSAxOworCQllZGMtPnRpbWVzdGFydCA9IG5vdzsKKwl9IGVsc2UgaWYgKCsrZWRjLT5lcnJvcmNvdW50ID4gbWF4X2VycikgeworCQllZGMtPmVycm9yY291bnQgPSAwOworCQllZGMtPnRpbWVzdGFydCA9IG5vdzsKKwkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCisvKiBIb3N0LURldmljZSBpbnRlcmZhY2UgZm9yIFVTQiAqLworZW51bSB7CisJSTI0MDBNVV9NQVhfTk9USUZJQ0FUSU9OX0xFTiA9IDI1NiwKKwlJMjQwME1VX0JMS19TSVpFID0gMTYsCisJSTI0MDBNVV9QTF9TSVpFX01BWCA9IDB4M0VGRiwKKworCS8qIEVuZHBvaW50cyAqLworCUkyNDAwTVVfRVBfQlVMS19PVVQgPSAwLAorCUkyNDAwTVVfRVBfTk9USUZJQ0FUSU9OLAorCUkyNDAwTVVfRVBfUkVTRVRfQ09MRCwKKwlJMjQwME1VX0VQX0JVTEtfSU4sCit9OworCisKKy8qKgorICogc3RydWN0IGkyNDAwbXUgLSBkZXNjcmlwdG9yIGZvciBhIFVTQiBjb25uZWN0ZWQgaTI0MDBtCisgKgorICogQGkyNDAwbTogYnVzLWdlbmVyaWMgaTI0MDBtIGltcGxlbWVudGF0aW9uOyBoYXMgdG8gYmUgZmlyc3QgKHNlZQorICogICAgIGl0J3MgZG9jdW1lbnRhdGlvbiBpbiBpMjQwMG0uaCkuCisgKgorICogQHVzYl9kZXY6IHBvaW50ZXIgdG8gb3VyIFVTQiBkZXZpY2UKKyAqCisgKiBAdXNiX2lmYWNlOiBwb2ludGVyIHRvIG91ciBVU0IgaW50ZXJmYWNlCisgKgorICogQHVyYl9lZGM6IGVycm9yIGRlbnNpdHkgY291bnRlcjsgdXNlZCB0byBrZWVwIGEgZGVuc2l0eS1vbi10aW1lIHRhYgorICogICAgIG9uIGhvdyBtYW55IHNvZnQgKHJldHJ5YWJsZSBvciBpZ25vcmFibGUpIGVycm9ycyB3ZSBnZXQuIElmIHdlCisgKiAgICAgZ28gb3ZlciB0aGUgdGhyZXNob2xkLCB3ZSBjb25zaWRlciB0aGUgYnVzIHRyYW5zcG9ydCBpcyBmYWlsaW5nCisgKiAgICAgdG9vIG11Y2ggYW5kIHJlc2V0LgorICoKKyAqIEBub3RpZl91cmI6IFVSQiBmb3IgcmVjZWl2aW5nIG5vdGlmaWNhdGlvbnMgZnJvbSB0aGUgZGV2aWNlLgorICoKKyAqIEB0eF9rdGhyZWFkOiB0aHJlYWQgd2UgdXNlIGZvciBkYXRhIFRYLiBXZSB1c2UgYSB0aHJlYWQgYmVjYXVzZSBpbgorICogICAgIG9yZGVyIHRvIGRvIGRlZXAgcG93ZXIgc2F2aW5nIGFuZCBwdXQgdGhlIGRldmljZSB0byBzbGVlcCwgd2UKKyAqICAgICBuZWVkIHRvIGNhbGwgdXNiX2F1dG9wbV8qKCkgW2Jsb2NraW5nIGZ1bmN0aW9uc10uCisgKgorICogQHR4X3dxOiB3YWl0cXVldWUgZm9yIHRoZSBUWCBrdGhyZWFkIHRvIHNsZWVwIHdoZW4gdGhlcmUgaXMgbm8gZGF0YQorICogICAgIHRvIGJlIHNlbnQ7IHdoZW4gbW9yZSBkYXRhIGlzIGF2YWlsYWJsZSwgaXQgaXMgd29rZW4gdXAgYnkKKyAqICAgICBpMjQwMG11X2J1c190eF9raWNrKCkuCisgKgorICogQHJ4X2t0aHJlYWQ6IHRocmVhZCB3ZSB1c2UgZm9yIGRhdGEgUlguIFdlIHVzZSBhIHRocmVhZCBiZWNhdXNlIGluCisgKiAgICAgb3JkZXIgdG8gZG8gZGVlcCBwb3dlciBzYXZpbmcgYW5kIHB1dCB0aGUgZGV2aWNlIHRvIHNsZWVwLCB3ZQorICogICAgIG5lZWQgdG8gY2FsbCB1c2JfYXV0b3BtXyooKSBbYmxvY2tpbmcgZnVuY3Rpb25zXS4KKyAqCisgKiBAcnhfd3E6IHdhaXRxdWV1ZSBmb3IgdGhlIFJYIGt0aHJlYWQgdG8gc2xlZXAgd2hlbiB0aGVyZSBpcyBubyBkYXRhCisgKiAgICAgdG8gcmVjZWl2ZS4gV2hlbiBkYXRhIGlzIGF2YWlsYWJsZSwgaXQgaXMgd29rZW4gdXAgYnkKKyAqICAgICB1c2Itbm90aWYuYzppMjQwMG11X25vdGlmaWNhdGlvbl9ncm9rKCkuCisgKgorICogQHJ4X3BlbmRpbmdfY291bnQ6IG51bWJlciBvZiByeC1kYXRhLXJlYWR5IG5vdGlmaWNhdGlvbnMgdGhhdCB3ZXJlCisgKiAgICAgc3RpbGwgbm90IGhhbmRsZWQgYnkgdGhlIFJYIGt0aHJlYWQuCisgKgorICogQHJ4X3NpemU6IGN1cnJlbnQgUlggYnVmZmVyIHNpemUgdGhhdCBpcyBiZWluZyB1c2VkLgorICoKKyAqIEByeF9zaXplX2FjYzogYWNjdW11bGF0b3Igb2YgdGhlIHNpemVzIG9mIHRoZSBwcmV2aW91cyByZWFkCisgKiAgICAgdHJhbnNhY3Rpb25zLgorICoKKyAqIEByeF9zaXplX2NudDogbnVtYmVyIG9mIHJlYWQgdHJhbnNhY3Rpb25zIGFjY3VtdWxhdGVkIGluCisgKiAgICAgQHJ4X3NpemVfYWNjLgorICoKKyAqIEBkb19hdXRvcG06IGRpc2FibGUoMCkvZW5hYmxlKD4wKSBjYWxsaW5nIHRoZQorICogICAgIHVzYl9hdXRvcG1fZ2V0L3B1dF9pbnRlcmZhY2UoKSBiYXJyaWVycyB3aGVuIGV4ZWN1dGluZworICogICAgIGNvbW1hbmRzLiBTZWUgZG9jIGluIGkyNDAwbXVfc3VzcGVuZCgpIGZvciBtb3JlIGluZm9ybWF0aW9uLgorICoKKyAqIEByeF9zaXplX2F1dG9fc2hyaW5rOiBpZiB0cnVlLCB0aGUgcnhfc2l6ZSBpcyBzaHJpbmtlZAorICogICAgIGF1dG9tYXRpY2FsbHkgYmFzZWQgb24gdGhlIGF2ZXJhZ2Ugc2l6ZSBvZiB0aGUgcmVjZWl2ZWQKKyAqICAgICB0cmFuc2FjdGlvbnMuIFRoaXMgYWxsb3dzIHRoZSByZWNlaXZlIGNvZGUgdG8gYWxsb2NhdGUgc21hbGxlcgorICogICAgIGNodW5rcyBvZiBtZW1vcnkgYW5kIHRodXMgcmVkdWNlIHByZXNzdXJlIG9uIHRoZSBtZW1vcnkKKyAqICAgICBhbGxvY2F0b3IgYnkgbm90IHdhc3Rpbmcgc28gbXVjaCBzcGFjZS4gQnkgZGVmYXVsdCBpdCBpcworICogICAgIGVuYWJsZWQuCisgKgorICogQGRlYnVnZnNfZGVudHJ5OiBob29rdXAgZm9yIGRlYnVnZnMgZmlsZXMuCisgKiAgICAgVGhlc2UgaGF2ZSB0byBiZSBpbiBhIHNlcGFyYXRlIGRpcmVjdG9yeSwgYSBjaGlsZCBvZgorICogICAgICh3aW1heF9kZXYtPmRlYnVnZnNfZGVudHJ5KSBzbyB0aGV5IGNhbiBiZSByZW1vdmVkIHdoZW4gdGhlCisgKiAgICAgbW9kdWxlIHVubG9hZHMsIGFzIHdlIGRvbid0IGtlZXAgZWFjaCBkZW50cnkuCisgKi8KK3N0cnVjdCBpMjQwMG11IHsKKwlzdHJ1Y3QgaTI0MDBtIGkyNDAwbTsJCS8qIEZJUlNUISBTZWUgZG9jICovCisKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdXNiX2RldjsKKwlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqdXNiX2lmYWNlOworCXN0cnVjdCBlZGMgdXJiX2VkYzsJCS8qIEVycm9yIGRlbnNpdHkgY291bnRlciAqLworCisJc3RydWN0IHVyYiAqbm90aWZfdXJiOworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHhfa3RocmVhZDsKKwl3YWl0X3F1ZXVlX2hlYWRfdCB0eF93cTsKKworCXN0cnVjdCB0YXNrX3N0cnVjdCAqcnhfa3RocmVhZDsKKwl3YWl0X3F1ZXVlX2hlYWRfdCByeF93cTsKKwlhdG9taWNfdCByeF9wZW5kaW5nX2NvdW50OworCXNpemVfdCByeF9zaXplLCByeF9zaXplX2FjYywgcnhfc2l6ZV9jbnQ7CisJYXRvbWljX3QgZG9fYXV0b3BtOworCXU4IHJ4X3NpemVfYXV0b19zaHJpbms7CisKKwlzdHJ1Y3QgZGVudHJ5ICpkZWJ1Z2ZzX2RlbnRyeTsKK307CisKKworc3RhdGljIGlubGluZQordm9pZCBpMjQwMG11X2luaXQoc3RydWN0IGkyNDAwbXUgKmkyNDAwbXUpCit7CisJaTI0MDBtX2luaXQoJmkyNDAwbXUtPmkyNDAwbSk7CisJZWRjX2luaXQoJmkyNDAwbXUtPnVyYl9lZGMpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmkyNDAwbXUtPnR4X3dxKTsKKwlhdG9taWNfc2V0KCZpMjQwMG11LT5yeF9wZW5kaW5nX2NvdW50LCAwKTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZpMjQwMG11LT5yeF93cSk7CisJaTI0MDBtdS0+cnhfc2l6ZSA9IFBBR0VfU0laRSAtIHNpemVvZihzdHJ1Y3Qgc2tiX3NoYXJlZF9pbmZvKTsKKwlhdG9taWNfc2V0KCZpMjQwMG11LT5kb19hdXRvcG0sIDEpOworCWkyNDAwbXUtPnJ4X3NpemVfYXV0b19zaHJpbmsgPSAxOworfQorCitleHRlcm4gaW50IGkyNDAwbXVfbm90aWZpY2F0aW9uX3NldHVwKHN0cnVjdCBpMjQwMG11ICopOworZXh0ZXJuIHZvaWQgaTI0MDBtdV9ub3RpZmljYXRpb25fcmVsZWFzZShzdHJ1Y3QgaTI0MDBtdSAqKTsKKworZXh0ZXJuIGludCBpMjQwMG11X3J4X3NldHVwKHN0cnVjdCBpMjQwMG11ICopOworZXh0ZXJuIHZvaWQgaTI0MDBtdV9yeF9yZWxlYXNlKHN0cnVjdCBpMjQwMG11ICopOworZXh0ZXJuIHZvaWQgaTI0MDBtdV9yeF9raWNrKHN0cnVjdCBpMjQwMG11ICopOworCitleHRlcm4gaW50IGkyNDAwbXVfdHhfc2V0dXAoc3RydWN0IGkyNDAwbXUgKik7CitleHRlcm4gdm9pZCBpMjQwMG11X3R4X3JlbGVhc2Uoc3RydWN0IGkyNDAwbXUgKik7CitleHRlcm4gdm9pZCBpMjQwMG11X2J1c190eF9raWNrKHN0cnVjdCBpMjQwMG0gKik7CisKK2V4dGVybiBzc2l6ZV90IGkyNDAwbXVfYnVzX2JtX2NtZF9zZW5kKHN0cnVjdCBpMjQwMG0gKiwKKwkJCQkgICAgICAgY29uc3Qgc3RydWN0IGkyNDAwbV9ib290cm9tX2hlYWRlciAqLAorCQkJCSAgICAgICBzaXplX3QsIGludCk7CitleHRlcm4gc3NpemVfdCBpMjQwMG11X2J1c19ibV93YWl0X2Zvcl9hY2soc3RydWN0IGkyNDAwbSAqLAorCQkJCQkgICBzdHJ1Y3QgaTI0MDBtX2Jvb3Ryb21faGVhZGVyICosCisJCQkJCSAgIHNpemVfdCk7CisjZW5kaWYgLyogI2lmbmRlZiBfX0kyNDAwTV9VU0JfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aW1heC9pMjQwMG0vaTI0MDBtLmggYi9kcml2ZXJzL25ldC93aW1heC9pMjQwMG0vaTI0MDBtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDY3Yzg3MQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpbWF4L2kyNDAwbS9pMjQwMG0uaApAQCAtMCwwICsxLDc1NSBAQAorLyoKKyAqIEludGVsIFdpcmVsZXNzIFdpTUFYIENvbm5lY3Rpb24gMjQwMG0KKyAqIERlY2xhcmF0aW9ucyBmb3IgYnVzLWdlbmVyaWMgaW50ZXJuYWwgQVBJcworICoKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICAgZGlzdHJpYnV0aW9uLgorICogICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgSW50ZWwgQ29ycG9yYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKgorICogSW50ZWwgQ29ycG9yYXRpb24gPGxpbnV4LXdpbWF4QGludGVsLmNvbT4KKyAqIEluYWt5IFBlcmV6LUdvbnphbGV6IDxpbmFreS5wZXJlei1nb256YWxlekBpbnRlbC5jb20+CisgKiBZYW5pciBMdWJldGtpbiA8eWFuaXJ4Lmx1YmV0a2luQGludGVsLmNvbT4KKyAqICAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24KKyAqCisgKgorICogR0VORVJBTCBEUklWRVIgQVJDSElURUNUVVJFCisgKgorICogVGhlIGkyNDAwbSBkcml2ZXIgaXMgc3BsaXQgaW4gdGhlIGZvbGxvd2luZyB0d28gbWFqb3IgcGFydHM6CisgKgorICogIC0gYnVzIHNwZWNpZmljIGRyaXZlcgorICogIC0gYnVzIGdlbmVyaWMgZHJpdmVyICh0aGlzIHBhcnQpCisgKgorICogVGhlIGJ1cyBzcGVjaWZpYyBkcml2ZXIgc2V0cyB1cCBzdHVmZiBzcGVjaWZpYyB0byB0aGUgYnVzIHRoZQorICogZGV2aWNlIGlzIGNvbm5lY3RlZCB0byAoVVNCLCBTRElPLCBQQ0ksIHRhbS10YW0uLi5ub24tYXV0aG9yaXRhdGl2ZQorICogbm9yIGJpbmRpbmcgbGlzdCkgd2hpY2ggaXMgYmFzaWNhbGx5IHRoZSBkZXZpY2UtbW9kZWwgbWFuYWdlbWVudAorICogKHByb2JlL2Rpc2Nvbm5lY3QsIGV0YyksIG1vdmluZyBkYXRhIGZyb20gZGV2aWNlIHRvIGtlcm5lbCBhbmQKKyAqIGJhY2ssIGRvaW5nIHRoZSBwb3dlciBzYXZpbmcgZGV0YWlscyBhbmQgcmVzZXRpbmcgdGhlIGRldmljZS4KKyAqCisgKiBGb3IgZGV0YWlscyBvbiBlYWNoIGJ1cy1zcGVjaWZpYyBkcml2ZXIsIHNlZSBpdCdzIGluY2x1ZGUgZmlsZSwKKyAqIGkyNDAwbS1CVVNOQU1FLmgKKyAqCisgKiBUaGUgYnVzLWdlbmVyaWMgZnVuY3Rpb25hbGl0eSBicmVhayB1cCBpczoKKyAqCisgKiAgLSBGaXJtd2FyZSB1cGxvYWQ6IGZ3LmMgLSB0YWtlcyBjYXJlIG9mIHVwbG9hZGluZyBmaXJtd2FyZSB0byB0aGUKKyAqICAgICAgICBkZXZpY2UuIGJ1cy1zcGVjaWZpYyBkcml2ZXIganVzdCBuZWVkcyB0byBwcm92aWRlcyBhIHdheSB0bworICogICAgICAgIGV4ZWN1dGUgYm9vdC1tb2RlIGNvbW1hbmRzIGFuZCB0byByZXNldCB0aGUgZGV2aWNlLgorICoKKyAqICAtIFJYIGhhbmRsaW5nOiByeC5jIC0gcmVjZWl2ZXMgZGF0YSBmcm9tIHRoZSBidXMtc3BlY2lmaWMgY29kZSBhbmQKKyAqICAgICAgICBmZWVkcyBpdCB0byB0aGUgbmV0d29yayBvciBXaU1BWCBzdGFjayBvciB1c2VzIGl0IHRvIG1vZGlmeQorICogICAgICAgIHRoZSBkcml2ZXIgc3RhdGUuIGJ1cy1zcGVjaWZpYyBkcml2ZXIgb25seSBoYXMgdG8gcmVjZWl2ZQorICogICAgICAgIGZyYW1lcyBhbmQgcGFzcyB0aGVtIHRvIHRoaXMgbW9kdWxlLgorICoKKyAqICAtIFRYIGhhbmRsaW5nOiB0eC5jIC0gbWFuYWdlcyB0aGUgVFggRklGTyBxdWV1ZSBhbmQgcHJvdmlkZXMgbWVhbnMKKyAqICAgICAgICBmb3IgdGhlIGJ1cy1zcGVjaWZpYyBUWCBjb2RlIHRvIHB1bGwgZGF0YSBmcm9tIHRoZSBGSUZPCisgKiAgICAgICAgcXVldWUuIGJ1cy1zcGVjaWZpYyBjb2RlIGp1c3QgcHVsbHMgZnJhbWVzIGZyb20gdGhpcyBtb2R1bGUKKyAqICAgICAgICB0byBzZW5kcyB0aGVtIHRvIHRoZSBkZXZpY2UuCisgKgorICogIC0gbmV0ZGV2IGdsdWU6IG5ldGRldi5jIC0gaW50ZXJmYWNlIHdpdGggTGludXggbmV0d29ya2luZworICogICAgICAgIHN0YWNrLiBQYXNzIGFyb3VuZCBkYXRhIGZyYW1lcywgYW5kIGNvbmZpZ3VyZSB3aGVuIHRoZQorICogICAgICAgIGRldmljZSBpcyB1cCBhbmQgcnVubmluZyBvciBzaHV0ZG93biAodGhyb3VnaCBpZmNvbmZpZyB1cCAvCisgKiAgICAgICAgZG93bikuIEJ1cy1nZW5lcmljIG9ubHkuCisgKgorICogIC0gY29udHJvbCBvcHM6IGNvbnRyb2wuYyAtIGltcGxlbWVudHMgdmFyaW91cyBjb21tbWFuZHMgZm9yCisgKiAgICAgICAgY29udHJvbGxpbmcgdGhlIGRldmljZS4gYnVzLWdlbmVyaWMgb25seS4KKyAqCisgKiAgLSBkZXZpY2UgbW9kZWwgZ2x1ZTogZHJpdmVyLmMgLSBpbXBsZW1lbnRzIGhlbHBlcnMgZm9yIHRoZQorICogICAgICAgIGRldmljZS1tb2RlbCBnbHVlIGRvbmUgYnkgdGhlIGJ1cy1zcGVjaWZpYyBsYXllcgorICogICAgICAgIChzZXR1cC9yZWxlYXNlIHRoZSBkcml2ZXIgcmVzb3VyY2VzKSwgdHVybmluZyB0aGUgZGV2aWNlIG9uCisgKiAgICAgICAgYW5kIG9mZiwgaGFuZGxpbmcgdGhlIGRldmljZSByZWJvb3RzL3Jlc2V0cyBhbmQgYSBmZXcgc2ltcGxlCisgKiAgICAgICAgV2lNQVggc3RhY2sgb3BzLgorICoKKyAqIENvZGUgaXMgYWxzbyBicm9rZW4gdXAgaW4gbGludXgtZ2x1ZSAvIGRldmljZS1nbHVlLgorICoKKyAqIExpbnV4IGdsdWUgY29udGFpbnMgZnVuY3Rpb25zIHRoYXQgZGVhbCBtb3N0bHkgd2l0aCBnbHVpbmcgd2l0aCB0aGUKKyAqIHJlc3Qgb2YgdGhlIExpbnV4IGtlcm5lbC4KKyAqCisgKiBEZXZpY2UtZ2x1ZSBhcmUgZnVuY3Rpb25zIHRoYXQgZGVhbCBtb3N0bHkgd2l0aCB0aGUgd2F5IHRoZSBkZXZpY2UKKyAqIGRvZXMgdGhpbmdzIGFuZCB0YWxrIHRoZSBkZXZpY2UncyBsYW5ndWFnZS4KKyAqCisgKiBkZXZpY2UtZ2x1ZSBjb2RlIGlzIGxpY2Vuc2VkIEJTRCBzbyBvdGhlciBvcGVuIHNvdXJjZSBPU2VzIGNhbiB0YWtlCisgKiBpdCB0byBpbXBsZW1lbnQgdGhlaXIgZHJpdmVycy4KKyAqCisgKgorICogQVBJcyBBTkQgSEVBREVSIEZJTEVTCisgKgorICogVGhpcyBidXMgZ2VuZXJpYyBjb2RlIGV4cG9ydHMgdGhyZWUgQVBJczoKKyAqCisgKiAgLSBIREkgKGhvc3QtZGV2aWNlIGludGVyZmFjZSkgZGVmaW5pdGlvbnMgY29tbW9uIHRvIGFsbCBidXNzZXMKKyAqICAgIChpbmNsdWRlL2xpbnV4L3dpbWF4L2kyNDAwbS5oKTsgdGhlc2UgY2FuIGJlIGFsc28gdXNlZCBieSB1c2VyCisgKiAgICBzcGFjZSBjb2RlLgorICogIC0gaW50ZXJuYWwgQVBJIGZvciB0aGUgYnVzLWdlbmVyaWMgY29kZQorICogIC0gZXh0ZXJuYWwgQVBJIGZvciB0aGUgYnVzLXNwZWNpZmljIGRyaXZlcnMKKyAqCisgKgorICogTElGRSBDWUNMRToKKyAqCisgKiBXaGVuIHRoZSBidXMtc3BlY2lmaWMgZHJpdmVyIHByb2JlcywgaXQgYWxsb2NhdGVzIGEgbmV0d29yayBkZXZpY2UKKyAqIHdpdGggZW5vdWdoIHNwYWNlIGZvciBpdCdzIGRhdGEgc3RydWN0dWUsIHRoYXQgbXVzdCBjb250YWluIGEKKyAqICZzdHJ1Y3QgaTI0MDBtIGF0IHRoZSB0b3AuCisgKgorICogT24gcHJvYmUsIGl0IG5lZWRzIHRvIGZpbGwgdGhlIGkyNDAwbSBtZW1iZXJzIG1hcmtlZCBhcyBbZmlsbF0sIGFzCisgKiB3ZWxsIGFzIGkyNDAwbS0+d2ltYXhfZGV2Lm5ldF9kZXYgYW5kIGNhbGwgaTI0MDBtX3NldHVwKCkuIFRoZQorICogaTI0MDBtIGRyaXZlciB3aWxsIG9ubHkgcmVnaXN0ZXIgd2l0aCB0aGUgV2lNQVggYW5kIG5ldHdvcmsgc3RhY2tzOworICogdGhlIG9ubHkgYWNjZXNzIGRvbmUgdG8gdGhlIGRldmljZSBpcyB0byByZWFkIHRoZSBNQUMgYWRkcmVzcyBzbyB3ZQorICogY2FuIHJlZ2lzdGVyIGEgbmV0d29yayBkZXZpY2UuIFRoaXMgY2FsbHMgaTI0MDBtX2Rldl9zdGFydCgpIHRvCisgKiBsb2FkIGZpcm13YXJlLCBzZXR1cCBjb21tdW5pY2F0aW9uIHdpdGggdGhlIGRldmljZSBhbmQgY29uZmlndXJlIGl0CisgKiBmb3Igb3BlcmF0aW9uLgorICoKKyAqIEF0IHRoaXMgcG9pbnQsIGNvbnRyb2wgYW5kIGRhdGEgY29tbXVuaWNhdGlvbnMgYXJlIHBvc3NpYmxlLgorICoKKyAqIE9uIGRpc2Nvbm5lY3QvZHJpdmVyIHVubG9hZCwgdGhlIGJ1cy1zcGVjaWZpYyBkaXNjb25uZWN0IGZ1bmN0aW9uCisgKiBjYWxscyBpMjQwMG1fcmVsZWFzZSgpIHRvIHVuZG8gaTI0MDBtX3NldHVwKCkuIGkyNDAwbV9kZXZfc3RvcCgpCisgKiBzaHV0cyB0aGUgZmlybXdhcmUgZG93biBhbmQgcmVsZWFzZXMgcmVzb3VyY2VzIHVzZXMgdG8gY29tbXVuaWNhdGUKKyAqIHdpdGggdGhlIGRldmljZS4KKyAqCisgKiBXaGlsZSB0aGUgZGV2aWNlIGlzIHVwLCBpdCBtaWdodCByZXNldC4gVGhlIGJ1cy1zcGVjaWZpYyBkcml2ZXIgaGFzCisgKiB0byBjYXRjaCB0aGF0IHNpdHVhdGlvbiBhbmQgY2FsbCBpMjQwMG1fZGV2X3Jlc2V0X2hhbmRsZSgpIHRvIGRlYWwKKyAqIHdpdGggaXQgKHJlc2V0IHRoZSBpbnRlcm5hbCBkcml2ZXIgc3RydWN0dXJlcyBhbmQgZ28gYmFjayB0byBzcXVhcmUKKyAqIG9uZSkuCisgKi8KKworI2lmbmRlZiBfX0kyNDAwTV9IX18KKyNkZWZpbmUgX19JMjQwME1fSF9fCisKKyNpbmNsdWRlIDxsaW51eC91c2IuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+CisjaW5jbHVkZSA8bGludXgvcndzZW0uaD4KKyNpbmNsdWRlIDxhc20vYXRvbWljLmg+CisjaW5jbHVkZSA8bmV0L3dpbWF4Lmg+CisjaW5jbHVkZSA8bGludXgvd2ltYXgvaTI0MDBtLmg+CisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorCisvKiBNaXNjIGNvbnN0YW50cyAqLworZW51bSB7CisJLyogRmlybXdhcmUgdXBsb2FkaW5nICovCisJSTI0MDBNX0JPT1RfUkVUUklFUyA9IDMsCisJLyogU2l6ZSBvZiB0aGUgQm9vdCBNb2RlIENvbW1hbmQgYnVmZmVyICovCisJSTI0MDBNX0JNX0NNRF9CVUZfU0laRSA9IDE2ICogMTAyNCwKKwlJMjQwME1fQk1fQUNLX0JVRl9TSVpFID0gMjU2LAorfTsKKworCisvKiBGaXJtd2FyZSB2ZXJzaW9uIHdlIHJlcXVlc3Qgd2hlbiBwdWxsaW5nIHRoZSBmdyBpbWFnZSBmaWxlICovCisjZGVmaW5lIEkyNDAwTV9GV19WRVJTSU9OICIxLjMiCisKKworLyoqCisgKiBpMjQwMG1fcmVzZXRfdHlwZSAtIG1ldGhvZHMgdG8gcmVzZXQgYSBkZXZpY2UKKyAqCisgKiBASTI0MDBNX1JUX1dBUk06IFJlc2V0IHdpdGhvdXQgZGV2aWNlIGRpc2Nvbm5lY3Rpb24sIGRldmljZSBoYW5kbGVzCisgKiAgICAgYXJlIGtlcHQgdmFsaWQgYnV0IHN0YXRlIGlzIGJhY2sgdG8gcG93ZXIgb24sIHdpdGggZmlybXdhcmUKKyAqICAgICByZS11cGxvYWRlZC4KKyAqIEBJMjQwME1fUlRfQ09MRDogVGVsbCB0aGUgZGV2aWNlIHRvIGRpc2Nvbm5lY3QgaXRzZWxmIGZyb20gdGhlIGJ1cworICogICAgIGFuZCByZWNvbm5lY3QuIFJlbmRlcnMgYWxsIGRldmljZSBoYW5kbGVzIGludmFsaWQuCisgKiBASTI0MDBNX1JUX0JVUzogVGVsbHMgdGhlIGJ1cyB0byByZXNldCB0aGUgZGV2aWNlOyBsYXN0IG1lYXN1cmUKKyAqICAgICB1c2VkIHdoZW4gYm90aCB0eXBlcyBhYm92ZSBkb24ndCB3b3JrLgorICovCitlbnVtIGkyNDAwbV9yZXNldF90eXBlIHsKKwlJMjQwME1fUlRfV0FSTSwJLyogZmlyc3QgbWVhc3VyZSAqLworCUkyNDAwTV9SVF9DT0xELAkvKiBzZWNvbmQgbWVhc3VyZSAqLworCUkyNDAwTV9SVF9CVVMsCS8qIGNhbGwgaW4gYXJ0aWxsZXJ5ICovCit9OworCitzdHJ1Y3QgaTI0MDBtX3Jlc2V0X2N0eDsKKworLyoqCisgKiBzdHJ1Y3QgaTI0MDBtIC0gZGVzY3JpcHRvciBmb3IgYW4gSW50ZWwgMjQwMG0KKyAqCisgKiBNZW1iZXJzIG1hcmtlZCB3aXRoIFtmaWxsXSBtdXN0IGJlIGZpbGxlZCBvdXQvaW5pdGlhbGl6ZWQgYmVmb3JlCisgKiBjYWxsaW5nIGkyNDAwbV9zZXR1cCgpLgorICoKKyAqIEBidXNfdHhfYmxvY2tfc2l6ZTogW2ZpbGxdIFNESU8gaW1wb3NlcyBhIDI1NiBibG9jayBzaXplLCBVU0IgMTYsCisgKiAgICAgc28gd2UgaGF2ZSBhIHR4X2Jsa19zaXplIHZhcmlhYmxlIHRoYXQgdGhlIGJ1cyBsYXllciBzZXRzIHRvCisgKiAgICAgdGVsbCB0aGUgZW5naW5lIGhvdyBtdWNoIG9mIHRoYXQgd2UgbmVlZC4KKyAqCisgKiBAYnVzX3BsX3NpemVfbWF4OiBbZmlsbF0gTWF4aW11bSBwYXlsb2FkIHNpemUuCisgKgorICogQGJ1c19kZXZfc3RhcnQ6IFtmaWxsXSBGdW5jdGlvbiBjYWxsZWQgYnkgdGhlIGJ1cy1nZW5lcmljIGNvZGUKKyAqICAgICBbaTI0MDBtX2Rldl9zdGFydCgpXSB0byBzZXR1cCB0aGUgYnVzLXNwZWNpZmljIGNvbW11bmljYXRpb25zCisgKiAgICAgdG8gdGhlIHRoZSBkZXZpY2UuIFNlZSBMSUZFIENZQ0xFIGFib3ZlLgorICoKKyAqICAgICBOT1RFOiBEb2Vzbid0IG5lZWQgdG8gdXBsb2FkIHRoZSBmaXJtd2FyZSwgYXMgdGhhdCBpcyB0YWtlbgorICogICAgIGNhcmUgb2YgYnkgdGhlIGJ1cy1nZW5lcmljIGNvZGUuCisgKgorICogQGJ1c19kZXZfc3RvcDogW2ZpbGxdIEZ1bmN0aW9uIGNhbGxlZCBieSB0aGUgYnVzLWdlbmVyaWMgY29kZQorICogICAgIFtpMjQwMG1fZGV2X3N0b3AoKV0gdG8gc2h1dGRvd24gdGhlIGJ1cy1zcGVjaWZpYyBjb21tdW5pY2F0aW9ucworICogICAgIHRvIHRoZSB0aGUgZGV2aWNlLiBTZWUgTElGRSBDWUNMRSBhYm92ZS4KKyAqCisgKiAgICAgVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBuZWVkIHRvIHJlc2V0IHRoZSBkZXZpY2UsIGp1c3QgdGVhciBkb3duCisgKiAgICAgYWxsIHRoZSBob3N0IHJlc291cmNlcyBjcmVhdGVkIHRvICBoYW5kbGUgY29tbXVuaWNhdGlvbiB3aXRoCisgKiAgICAgdGhlIGRldmljZS4KKyAqCisgKiBAYnVzX3R4X2tpY2s6IFtmaWxsXSBGdW5jdGlvbiBjYWxsZWQgYnkgdGhlIGJ1cy1nZW5lcmljIGNvZGUgdG8gbGV0CisgKiAgICAgdGhlIGJ1cy1zcGVjaWZpYyBjb2RlIGtub3cgdGhhdCB0aGVyZSBpcyBkYXRhIGF2YWlsYWJsZSBpbiB0aGUKKyAqICAgICBUWCBGSUZPIGZvciB0cmFuc21pc3Npb24gdG8gdGhlIGRldmljZS4KKyAqCisgKiAgICAgVGhpcyBmdW5jdGlvbiBjYW5ub3Qgc2xlZXAuCisgKgorICogQGJ1c19yZXNldDogW2ZpbGxdIEZ1bmN0aW9uIGNhbGxlZCBieSB0aGUgYnVzLWdlbmVyaWMgY29kZSB0byByZXNldAorICogICAgIHRoZSBkZXZpY2UgaW4gaW4gdmFyaW91cyB3YXlzLiBEb2Vzbid0IG5lZWQgdG8gd2FpdCBmb3IgdGhlCisgKiAgICAgcmVzZXQgdG8gZmluaXNoLgorICoKKyAqICAgICBJZiB3YXJtIG9yIGNvbGQgcmVzZXQgZmFpbCwgdGhpcyBmdW5jdGlvbiBpcyBleHBlY3RlZCB0byBkbyBhCisgKiAgICAgYnVzLXNwZWNpZmljIHJlc2V0IChlZzogVVNCIHJlc2V0KSB0byBnZXQgdGhlIGRldmljZSB0byBhCisgKiAgICAgd29ya2luZyBzdGF0ZSAoZXZlbiBpZiBpdCBpbXBsaWVzIGRldmljZSBkaXNjb25lY2N0aW9uKS4KKyAqCisgKiAgICAgTm90ZSB0aGUgd2FybSByZXNldCBpcyB1c2VkIGJ5IHRoZSBmaXJtd2FyZSB1cGxvYWRlciB0bworICogICAgIHJlaW5pdGlhbGl6ZSB0aGUgZGV2aWNlLgorICoKKyAqICAgICBJTVBPUlRBTlQ6IHRoaXMgaXMgY2FsbGVkIHZlcnkgZWFybHkgaW4gdGhlIGRldmljZSBzZXR1cAorICogICAgIHByb2Nlc3MsIHNvIGl0IGNhbm5vdCByZWx5IG9uIGNvbW1vbiBpbmZyYXN0cnVjdHVyZSBiZWluZyBsYWlkCisgKiAgICAgb3V0LgorICoKKyAqIEBidXNfYm1fY21kX3NlbmQ6IFtmaWxsXSBGdW5jdGlvbiBjYWxsZWQgdG8gc2VuZCBhIGJvb3QtbW9kZQorICogICAgIGNvbW1hbmQuIEZsYWdzIGFyZSBkZWZpbmVkIGluICdlbnVtIGkyNDAwbV9ibV9jbWRfZmxhZ3MnLiBUaGlzCisgKiAgICAgaXMgc3luY2hyb25vdXMgYW5kIGhhcyB0byByZXR1cm4gMCBpZiBvayBvciA8IDAgZXJybm8gY29kZSBpbgorICogICAgIGFueSBlcnJvciBjb25kaXRpb24uCisgKgorICogQGJ1c19ibV93YWl0X2Zvcl9hY2s6IFtmaWxsXSBGdW5jdGlvbiBjYWxsZWQgdG8gd2FpdCBmb3IgYQorICogICAgIGJvb3QtbW9kZSBub3RpZmljYXRpb24gKHRoYXQgY2FuIGJlIGEgcmVzcG9uc2UgdG8gYSBwcmV2aW91c2x5CisgKiAgICAgaXNzdWVkIGNvbW1hbmQgb3IgYW4gYXN5bmNocm9ub3VzIG9uZSkuIFdpbGwgcmVhZCB1bnRpbCBhbGwgdGhlCisgKiAgICAgaW5kaWNhdGVkIHNpemUgaXMgcmVhZCBvciB0aW1lb3V0LiBSZWFkaW5nIG1vcmUgb3IgbGVzcyBkYXRhCisgKiAgICAgdGhhbiBhc2tlZCBmb3IgaXMgYW4gZXJyb3IgY29uZGl0aW9uLiBSZXR1cm4gMCBpZiBvaywgPCAwIGVycm5vCisgKiAgICAgY29kZSBvbiBlcnJvci4KKyAqCisgKiAgICAgVGhlIGNhbGxlciB0byB0aGlzIGZ1bmN0aW9uIHdpbGwgY2hlY2sgaWYgdGhlIHJlc3BvbnNlIGlzIGEKKyAqICAgICBiYXJrZXIgdGhhdCBpbmRpY2F0ZXMgdGhlIGRldmljZSBnb2luZyBpbnRvIHJlc2V0IG1vZGUuCisgKgorICogQGJ1c19md19uYW1lOiBbZmlsbF0gbmFtZSBvZiB0aGUgZmlybXdhcmUgaW1hZ2UgKGluIG1vc3QgY2FzZXMsCisgKiAgICAgdGhleSBhcmUgYWxsIHRoZSBzYW1lIGZvciBhIHNpbmdsZSByZWxlYXNlLCBleGNlcHQgdGhhdCB0aGV5CisgKiAgICAgaGF2ZSB0aGUgdHlwZSBvZiB0aGUgYnVzIGVtYmVkZGVkIGluIHRoZSBuYW1lIChlZzoKKyAqICAgICBpMjQwMG0tZnctWC1WRVJTSU9OLnNiY2YsIHdoZXJlIFggaXMgdGhlIGJ1cyBuYW1lKS4KKyAqCisgKiBAYnVzX2JtX21hY19hZGRyX2ltcGFpcmVkOiBbZmlsbF0gU2V0IHRvIHRydWUgaWYgdGhlIGRldmljZSdzIE1BQworICogICAgIGFkZHJlc3MgcHJvdmlkZWQgaW4gYm9vdCBtb2RlIGlzIGtpbmQgb2YgYnJva2VuIGFuZCBuZWVkcyB0bworICogICAgIGJlIHJlLXJlYWQgbGF0ZXIgb24uCisgKgorICoKKyAqIEB3aW1heF9kZXY6IFdpTUFYIGdlbmVyaWMgZGV2aWNlIGZvciBsaW5rYWdlIGludG8gdGhlIGtlcm5lbCBXaU1BWAorICogICAgIHN0YWNrLiBEdWUgdG8gdGhlIHdheSBhIG5ldF9kZXZpY2UgaXMgYWxsb2NhdGVkLCB3ZSBuZWVkIHRvCisgKiAgICAgZm9yY2UgdGhpcyB0byBiZSB0aGUgZmlyc3QgZmllbGQgc28gdGhhdCB3ZSBjYW4gZ2V0IGZyb20KKyAqICAgICBuZXRkZXZfcHJpdigpIHRoZSByaWdodCBwb2ludGVyLgorICoKKyAqIEBzdGF0ZTogZGV2aWNlJ3Mgc3RhdGUgKGFzIHJlcG9ydGVkIGJ5IGl0KQorICoKKyAqIEBzdGF0ZV93cTogd2FpdHF1ZXVlIHRoYXQgaXMgd29rZW4gdXAgd2hlbmV2ZXIgdGhlIHN0YXRlIGNoYW5nZXMKKyAqCisgKiBAdHhfbG9jazogc3BpbmxvY2sgdG8gcHJvdGVjdCBUWCBtZW1iZXJzCisgKgorICogQHR4X2J1ZjogRklGTyBidWZmZXIgZm9yIFRYOyB3ZSBxdWV1ZSBkYXRhIGhlcmUKKyAqCisgKiBAdHhfaW46IEZJRk8gaW5kZXggZm9yIGluY29taW5nIGRhdGEuIE5vdGUgdGhpcyBkb2Vzbid0IHdyYXAgYXJvdW5kCisgKiAgICAgYW5kIGl0IGlzIGFsd2F5cyBncmVhdGVyIHRoYW4gQHR4X291dC4KKyAqCisgKiBAdHhfb3V0OiBGSUZPIGluZGV4IGZvciBvdXRnb2luZyBkYXRhCisgKgorICogQHR4X21zZzogY3VycmVudCBUWCBtZXNzYWdlIHRoYXQgaXMgYWN0aXZlIGluIHRoZSBGSUZPIGZvcgorICogICAgIGFwcGVuZGluZyBwYXlsb2Fkcy4KKyAqCisgKiBAdHhfc2VxdWVuY2U6IGN1cnJlbnQgc2VxdWVuY2UgbnVtYmVyIGZvciBUWCBtZXNzYWdlcyBmcm9tIHRoZQorICogICAgIGRldmljZSB0byB0aGUgaG9zdC4KKyAqCisgKiBAdHhfbXNnX3NpemU6IHNpemUgb2YgdGhlIGN1cnJlbnQgbWVzc2FnZSBiZWluZyB0cmFuc21pdHRlZCBieSB0aGUKKyAqICAgICBidXMtc3BlY2lmaWMgY29kZS4KKyAqCisgKiBAdHhfcGxfbnVtOiB0b3RhbCBudW1iZXIgb2YgcGF5bG9hZHMgc2VudAorICoKKyAqIEB0eF9wbF9tYXg6IG1heGltdW0gbnVtYmVyIG9mIHBheWxvYWRzIHNlbnQgaW4gYSBUWCBtZXNzYWdlCisgKgorICogQHR4X3BsX21pbjogbWluaW11bSBudW1iZXIgb2YgcGF5bG9hZHMgc2VudCBpbiBhIFRYIG1lc3NhZ2UKKyAqCisgKiBAdHhfbnVtOiBudW1iZXIgb2YgVFggbWVzc2FnZXMgc2VudAorICoKKyAqIEB0eF9zaXplX2FjYzogbnVtYmVyIG9mIGJ5dGVzIGluIGFsbCBUWCBtZXNzYWdlcyBzZW50CisgKiAgICAgKHRoaXMgaXMgZGlmZmVyZW50IHRvIG5ldF9kZXYncyBzdGF0aXN0aWNzIGFzIGl0IGFsc28gY291bnRzCisgKiAgICAgY29udHJvbCBtZXNzYWdlcykuCisgKgorICogQHR4X3NpemVfbWluOiBzbWFsbGVzdCBUWCBtZXNzYWdlIHNlbnQuCisgKgorICogQHR4X3NpemVfbWF4OiBiaWdnZXN0IFRYIG1lc3NhZ2Ugc2VudC4KKyAqCisgKiBAcnhfbG9jazogc3BpbmxvY2sgdG8gcHJvdGVjdCBSWCBtZW1iZXJzCisgKgorICogQHJ4X3BsX251bTogdG90YWwgbnVtYmVyIG9mIHBheWxvYWRzIHJlY2VpdmVkCisgKgorICogQHJ4X3BsX21heDogbWF4aW11bSBudW1iZXIgb2YgcGF5bG9hZHMgcmVjZWl2ZWQgaW4gYSBSWCBtZXNzYWdlCisgKgorICogQHJ4X3BsX21pbjogbWluaW11bSBudW1iZXIgb2YgcGF5bG9hZHMgcmVjZWl2ZWQgaW4gYSBSWCBtZXNzYWdlCisgKgorICogQHJ4X251bTogbnVtYmVyIG9mIFJYIG1lc3NhZ2VzIHJlY2VpdmVkCisgKgorICogQHJ4X3NpemVfYWNjOiBudW1iZXIgb2YgYnl0ZXMgaW4gYWxsIFJYIG1lc3NhZ2VzIHJlY2VpdmVkCisgKiAgICAgKHRoaXMgaXMgZGlmZmVyZW50IHRvIG5ldF9kZXYncyBzdGF0aXN0aWNzIGFzIGl0IGFsc28gY291bnRzCisgKiAgICAgY29udHJvbCBtZXNzYWdlcykuCisgKgorICogQHJ4X3NpemVfbWluOiBzbWFsbGVzdCBSWCBtZXNzYWdlIHJlY2VpdmVkLgorICoKKyAqIEByeF9zaXplX21heDogYnVnZ2VzdCBSWCBtZXNzYWdlIHJlY2VpdmVkLgorICoKKyAqIEBpbml0X211dGV4OiBNdXRleCB1c2VkIGZvciBzZXJpYWxpemluZyB0aGUgZGV2aWNlIGJyaW5ndXAKKyAqICAgICBzZXF1ZW5jZTsgdGhpcyB3YXkgaWYgdGhlIGRldmljZSByZWJvb3RzIGluIHRoZSBtaWRkbGUsIHdlCisgKiAgICAgZG9uJ3QgdHJ5IHRvIGRvIGEgYnJpbmd1cCBhZ2FpbiB3aGlsZSB3ZSBhcmUgdGVhcmluZyBkb3duIHRoZQorICogICAgIG9uZSB0aGF0IGZhaWxlZC4KKyAqCisgKiAgICAgQ2FuJ3QgcmV1c2UgQG1zZ19tdXRleCBiZWNhdXNlIGZyb20gd2l0aGluIHRoZSBicmluZ3VwIHNlcXVlbmNlCisgKiAgICAgd2UgbmVlZCB0byBzZW5kIG1lc3NhZ2VzIHRvIHRoZSBkZXZpY2UgYW5kIHRodXMgdXNlIEBtc2dfbXV0ZXguCisgKgorICogQG1zZ19tdXRleDogbXV0ZXggdXNlZCB0byBzZW5kIGNvbnRyb2wgY29tbWFuZHMgdG8gdGhlIGRldmljZSAod2UKKyAqICAgICBvbmx5IGFsbG93IG9uZSBhdCBhIHRpbWUsIHBlciBob3N0LWRldmljZSBpbnRlcmZhY2UgZGVzaWduKS4KKyAqCisgKiBAbXNnX2NvbXBsZXRpb246IHVzZWQgdG8gd2FpdCBmb3IgYW4gYWNrIHRvIGEgY29udHJvbCBjb21tYW5kIHNlbnQKKyAqICAgICB0byB0aGUgZGV2aWNlLgorICoKKyAqIEBhY2tfc2tiOiB1c2VkIHRvIHN0b3JlIHRoZSBhY3R1YWwgYWNrIHRvIGEgY29udHJvbCBjb21tYW5kIGlmIHRoZQorICogICAgIHJlY2VwdGlvbiBvZiB0aGUgY29tbWFuZCB3YXMgc3VjY2Vzc2Z1bC4gT3RoZXJ3aXNlLCBhIEVSUl9QVFIoKQorICogICAgIGVycm5vIGNvZGUgdGhhdCBpbmRpY2F0ZXMgd2hhdCBmYWlsZWQgd2l0aCB0aGUgYWNrIHJlY2VwdGlvbi4KKyAqCisgKiAgICAgT25seSB2YWxpZCBhZnRlciBAbXNnX2NvbXBsZXRpb24gaXMgd29rZW4gdXAuIE9ubHkgdXBkYXRlYWJsZQorICogICAgIGlmIEBtc2dfY29tcGxldGlvbiBpcyBhcm1lZC4gT25seSB0b3VjaGVkIGJ5CisgKiAgICAgaTI0MDBtX21zZ190b19kZXYoKS4KKyAqCisgKiAgICAgUHJvdGVjdGVkIGJ5IEByeF9sb2NrLiBJbiB0aGVvcnkgdGhlIGNvbW1hbmQgZXhlY3V0aW9uIGZsb3cgaXMKKyAqICAgICBzZXF1ZW50aWFsLCBidXQgaW4gY2FzZSB0aGUgZGV2aWNlIHNlbmRzIGFuIG91dC1vZi1waGFzZSBvcgorICogICAgIHZlcnkgZGVsYXllZCByZXNwb25zZSwgd2UgbmVlZCB0byBhdm9pZCBpdCB0cmFtcGxpbmcgY3VycmVudAorICogICAgIGV4ZWN1dGlvbi4KKyAqCisgKiBAYm1fY21kX2J1ZjogYm9vdCBtb2RlIGNvbW1hbmQgYnVmZmVyIGZvciBjb21wb3NpbmcgZmlybXdhcmUgdXBsb2FkCisgKiAgICAgY29tbWFuZHMuCisgKgorICogICAgIFVTQiBjYW4ndCByL3cgdG8gc3RhY2ssIHZtYWxsb2MsIGV0Yy4uLmFzIHdlbGwsIHdlIGVuZCB1cAorICogICAgIGhhdmluZyB0byBhbGxvYy9mcmVlIGEgbG90IHRvIGNvbXBvc2UgY29tbWFuZHMsIHNvIHdlIHVzZSB0aGVzZQorICogICAgIGZvciBzdGFnZ2luZyBhbmQgbm90IGhhdmluZyB0byByZWFsbG9jIGFsbCB0aGUgdGltZS4KKyAqCisgKiAgICAgVGhpcyBhc3N1bWVzIHRoZSBjb2RlIGFsd2F5cyBydW5zIHNlcmlhbGl6ZWQuIE9ubHkgb25lIHRocmVhZAorICogICAgIGNhbiBjYWxsIGkyNDAwbV9ibV9jbWQoKSBhdCB0aGUgc2FtZSB0aW1lLgorICoKKyAqIEBibV9hY2tfYnVmOiBib290IG1vZGUgYWNrbm9sZWRnZSBidWZmZXIgZm9yIHN0YWdpbmcgcmVjZXB0aW9uIG9mCisgKiAgICAgcmVzcG9uc2VzIHRvIGNvbW1hbmRzLgorICoKKyAqICAgICBTZWUgQGJtX2NtZF9idWYuCisgKgorICogQHdvcmtfcXVldWU6IHdvcmsgcXVldWUgZm9yIHByb2Nlc3NpbmcgZGV2aWNlIHJlcG9ydHMuIFRoaXMKKyAqICAgICB3b3JrcXVldWUgY2Fubm90IGJlIHVzZWQgZm9yIHByb2Nlc3NpbmcgVFggb3IgUlggdG8gdGhlIGRldmljZSwKKyAqICAgICBhcyBmcm9tIGl0IHdlJ2xsIHByb2Nlc3MgZGV2aWNlIHJlcG9ydHMsIHdoaWNoIG1pZ2h0IHJlcXVpcmUKKyAqICAgICBmdXJ0aGVyIGNvbW11bmljYXRpb24gd2l0aCB0aGUgZGV2aWNlLgorICoKKyAqIEBkZWJ1Z2ZzX2RlbnRyeTogaG9va3VwIGZvciBkZWJ1Z2ZzIGZpbGVzLgorICogICAgIFRoZXNlIGhhdmUgdG8gYmUgaW4gYSBzZXBhcmF0ZSBkaXJlY3RvcnksIGEgY2hpbGQgb2YKKyAqICAgICAod2ltYXhfZGV2LT5kZWJ1Z2ZzX2RlbnRyeSkgc28gdGhleSBjYW4gYmUgcmVtb3ZlZCB3aGVuIHRoZQorICogICAgIG1vZHVsZSB1bmxvYWRzLCBhcyB3ZSBkb24ndCBrZWVwIGVhY2ggZGVudHJ5LgorICovCitzdHJ1Y3QgaTI0MDBtIHsKKwlzdHJ1Y3Qgd2ltYXhfZGV2IHdpbWF4X2RldjsJLyogRklSU1QhIFNlZSBkb2MgKi8KKworCXVuc2lnbmVkIHVwZG93bjoxOwkJLyogTmV0d29yayBkZXZpY2UgaXMgdXAgb3IgZG93biAqLworCXVuc2lnbmVkIGJvb3RfbW9kZToxOwkJLyogaXMgdGhlIGRldmljZSBpbiBib290IG1vZGU/ICovCisJdW5zaWduZWQgc2Jvb3Q6MTsJCS8qIHNpZ25lZCBvciB1bnNpZ25lZCBmdyBib290ICovCisJdW5zaWduZWQgcmVhZHk6MTsJCS8qIGFsbCBwcm9iaW5nIHN0ZXBzIGRvbmUgKi8KKwl1OCB0cmFjZV9tc2dfZnJvbV91c2VyOwkJLyogZWNobyByeCBtc2dzIHRvICd0cmFjZScgcGlwZSAqLworCQkJCQkvKiB0eXBlZCB1OCBzbyBkZWJ1Z2ZzL3U4IGNhbiB0d2VhayAqLworCWVudW0gaTI0MDBtX3N5c3RlbV9zdGF0ZSBzdGF0ZTsKKwl3YWl0X3F1ZXVlX2hlYWRfdCBzdGF0ZV93cTsJLyogV29rZW4gdXAgd2hlbiBvbiBzdGF0ZSB1cGRhdGVzICovCisKKwlzaXplX3QgYnVzX3R4X2Jsb2NrX3NpemU7CisJc2l6ZV90IGJ1c19wbF9zaXplX21heDsKKwlpbnQgKCpidXNfZGV2X3N0YXJ0KShzdHJ1Y3QgaTI0MDBtICopOworCXZvaWQgKCpidXNfZGV2X3N0b3ApKHN0cnVjdCBpMjQwMG0gKik7CisJdm9pZCAoKmJ1c190eF9raWNrKShzdHJ1Y3QgaTI0MDBtICopOworCWludCAoKmJ1c19yZXNldCkoc3RydWN0IGkyNDAwbSAqLCBlbnVtIGkyNDAwbV9yZXNldF90eXBlKTsKKwlzc2l6ZV90ICgqYnVzX2JtX2NtZF9zZW5kKShzdHJ1Y3QgaTI0MDBtICosCisJCQkJICAgY29uc3Qgc3RydWN0IGkyNDAwbV9ib290cm9tX2hlYWRlciAqLAorCQkJCSAgIHNpemVfdCwgaW50IGZsYWdzKTsKKwlzc2l6ZV90ICgqYnVzX2JtX3dhaXRfZm9yX2Fjaykoc3RydWN0IGkyNDAwbSAqLAorCQkJCSAgICAgICBzdHJ1Y3QgaTI0MDBtX2Jvb3Ryb21faGVhZGVyICosIHNpemVfdCk7CisJY29uc3QgY2hhciAqYnVzX2Z3X25hbWU7CisJdW5zaWduZWQgYnVzX2JtX21hY19hZGRyX2ltcGFpcmVkOjE7CisKKwlzcGlubG9ja190IHR4X2xvY2s7CQkvKiBwcm90ZWN0IFRYIHN0YXRlICovCisJdm9pZCAqdHhfYnVmOworCXNpemVfdCB0eF9pbiwgdHhfb3V0OworCXN0cnVjdCBpMjQwMG1fbXNnX2hkciAqdHhfbXNnOworCXNpemVfdCB0eF9zZXF1ZW5jZSwgdHhfbXNnX3NpemU7CisJLyogVFggc3RhdHMgKi8KKwl1bnNpZ25lZCB0eF9wbF9udW0sIHR4X3BsX21heCwgdHhfcGxfbWluLAorCQl0eF9udW0sIHR4X3NpemVfYWNjLCB0eF9zaXplX21pbiwgdHhfc2l6ZV9tYXg7CisKKwkvKiBSWCBzdGF0cyAqLworCXNwaW5sb2NrX3QgcnhfbG9jazsJCS8qIHByb3RlY3QgUlggc3RhdGUgKi8KKwl1bnNpZ25lZCByeF9wbF9udW0sIHJ4X3BsX21heCwgcnhfcGxfbWluLAorCQlyeF9udW0sIHJ4X3NpemVfYWNjLCByeF9zaXplX21pbiwgcnhfc2l6ZV9tYXg7CisKKwlzdHJ1Y3QgbXV0ZXggbXNnX211dGV4OwkJLyogc2VyaWFsaXplIGNvbW1hbmQgZXhlY3V0aW9uICovCisJc3RydWN0IGNvbXBsZXRpb24gbXNnX2NvbXBsZXRpb247CisJc3RydWN0IHNrX2J1ZmYgKmFja19za2I7CS8qIHByb3RlY3RlZCBieSByeF9sb2NrICovCisKKwl2b2lkICpibV9hY2tfYnVmOwkJLyogZm9yIHJlY2VpdmluZyBhY2tzIG92ZXIgVVNCICovCisJdm9pZCAqYm1fY21kX2J1ZjsJCS8qIGZvciBpc3N1aW5nIGNvbW1hbmRzIG92ZXIgVVNCICovCisKKwlzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqd29ya19xdWV1ZTsKKworCXN0cnVjdCBtdXRleCBpbml0X211dGV4OwkvKiBwcm90ZWN0IGJyaW5ndXAgc2VxICovCisJc3RydWN0IGkyNDAwbV9yZXNldF9jdHggKnJlc2V0X2N0eDsJLyogcHJvdGVjdGVkIGJ5IGluaXRfbXV0ZXggKi8KKworCXN0cnVjdCB3b3JrX3N0cnVjdCB3YWtlX3R4X3dzOworCXN0cnVjdCBza19idWZmICp3YWtlX3R4X3NrYjsKKworCXN0cnVjdCBkZW50cnkgKmRlYnVnZnNfZGVudHJ5OworfTsKKworCisvKgorICogSW5pdGlhbGl6ZSBhICdzdHJ1Y3QgaTI0MDBtJyBmcm9tIGFsbCB6ZXJvZXMKKyAqCisgKiBUaGlzIGlzIGEgYnVzLWdlbmVyaWMgQVBJIGNhbGwuCisgKi8KK3N0YXRpYyBpbmxpbmUKK3ZvaWQgaTI0MDBtX2luaXQoc3RydWN0IGkyNDAwbSAqaTI0MDBtKQoreworCXdpbWF4X2Rldl9pbml0KCZpMjQwMG0tPndpbWF4X2Rldik7CisKKwlpMjQwMG0tPmJvb3RfbW9kZSA9IDE7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmaTI0MDBtLT5zdGF0ZV93cSk7CisKKwlzcGluX2xvY2tfaW5pdCgmaTI0MDBtLT50eF9sb2NrKTsKKwlpMjQwMG0tPnR4X3BsX21pbiA9IFVJTlRfTUFYOworCWkyNDAwbS0+dHhfc2l6ZV9taW4gPSBVSU5UX01BWDsKKworCXNwaW5fbG9ja19pbml0KCZpMjQwMG0tPnJ4X2xvY2spOworCWkyNDAwbS0+cnhfcGxfbWluID0gVUlOVF9NQVg7CisJaTI0MDBtLT5yeF9zaXplX21pbiA9IFVJTlRfTUFYOworCisJbXV0ZXhfaW5pdCgmaTI0MDBtLT5tc2dfbXV0ZXgpOworCWluaXRfY29tcGxldGlvbigmaTI0MDBtLT5tc2dfY29tcGxldGlvbik7CisKKwltdXRleF9pbml0KCZpMjQwMG0tPmluaXRfbXV0ZXgpOworCS8qIHdha2VfdHhfd3MgaXMgaW5pdGlhbGl6ZWQgaW4gaTI0MDBtX3R4X3NldHVwKCkgKi8KK30KKworCisvKgorICogQnVzLWdlbmVyaWMgaW50ZXJuYWwgQVBJcworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKK3N0YXRpYyBpbmxpbmUKK3N0cnVjdCBpMjQwMG0gKndpbWF4X2Rldl90b19pMjQwMG0oc3RydWN0IHdpbWF4X2RldiAqd2ltYXhfZGV2KQoreworCXJldHVybiBjb250YWluZXJfb2Yod2ltYXhfZGV2LCBzdHJ1Y3QgaTI0MDBtLCB3aW1heF9kZXYpOworfQorCitzdGF0aWMgaW5saW5lCitzdHJ1Y3QgaTI0MDBtICpuZXRfZGV2X3RvX2kyNDAwbShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldikKK3sKKwlyZXR1cm4gd2ltYXhfZGV2X3RvX2kyNDAwbShuZXRkZXZfcHJpdihuZXRfZGV2KSk7Cit9CisKKy8qCisgKiBCb290IG1vZGUgc3VwcG9ydAorICovCisKKy8qKgorICogaTI0MDBtX2JtX2NtZF9mbGFncyAtIGZsYWdzIHRvIGkyNDAwbV9ibV9jbWQoKQorICoKKyAqIEBJMjQwME1fQk1fQ01EX1JBVzogc2VuZCB0aGUgY29tbWFuZCBibG9jayBhcy1pcywgd2l0aG91dCBkb2luZyBhbnkKKyAqICAgICBleHRyYSBwcm9jZXNzaW5nIGZvciBhZGRpbmcgQ1JDLgorICovCitlbnVtIGkyNDAwbV9ibV9jbWRfZmxhZ3MgeworCUkyNDAwTV9CTV9DTURfUkFXCT0gMSA8PCAyLAorfTsKKworLyoqCisgKiBpMjQwMG1fYnJpIC0gQm9vdC1ST00gaW5kaWNhdG9ycworICoKKyAqIEZsYWdzIGZvciBpMjQwMG1fYm9vdHJvbV9pbml0KCkgYW5kIGkyNDAwbV9kZXZfYm9vdHN0cmFwKCkgW3doaWNoCisgKiBhcmUgcGFzc2VkIGZyb20gdGhpbmdzIGxpa2UgaTI0MDBtX3NldHVwKCldLiBDYW4gYmUgY29tYmluZWQgd2l0aAorICogfC4KKyAqCisgKiBASTI0MDBNX0JSSV9TT0ZUOiBUaGUgZGV2aWNlIHJlYm9vdGVkIGFscmVhZHkgYW5kIGEgcmVib290CisgKiAgICAgYmFya2VyIHJlY2VpdmVkLCBwcm9jZWVkIGRpcmVjdGx5IHRvIGFjayB0aGUgYm9vdCBzZXF1ZW5jZS4KKyAqIEBJMjQwME1fQlJJX05PX1JFQk9PVDogRG8gbm90IHJlYm9vdCB0aGUgZGV2aWNlIGFuZCBwcm9jZWVkCisgKiAgICAgZGlyZWN0bHkgdG8gd2FpdCBmb3IgYSByZWJvb3QgYmFya2VyIGZyb20gdGhlIGRldmljZS4KKyAqIEBJMjQwME1fQlJJX01BQ19SRUlOSVQ6IFdlIG5lZWQgdG8gcmVpbml0aWFsaXplIHRoZSBib290CisgKiAgICAgcm9tIGFmdGVyIHJlYWRpbmcgdGhlIE1BQyBhZHJlc3MuIFRoaXMgaXMgcXVpdGUgYSBkaXJ0eSBoYWNrLAorICogICAgIGlmIHlvdSBhc2sgbWUgLS0gdGhlIGRldmljZSByZXF1aXJlcyB0aGUgYm9vdHJvbSB0byBiZQorICogICAgIGludGlhbGl6ZWQgYWZ0ZXIgcmVhZGluZyB0aGUgTUFDIGFkZHJlc3MuCisgKi8KK2VudW0gaTI0MDBtX2JyaSB7CisJSTI0MDBNX0JSSV9TT0ZUICAgICAgID0gMSA8PCAxLAorCUkyNDAwTV9CUklfTk9fUkVCT09UICA9IDEgPDwgMiwKKwlJMjQwME1fQlJJX01BQ19SRUlOSVQgPSAxIDw8IDMsCit9OworCitleHRlcm4gdm9pZCBpMjQwMG1fYm1fY21kX3ByZXBhcmUoc3RydWN0IGkyNDAwbV9ib290cm9tX2hlYWRlciAqKTsKK2V4dGVybiBpbnQgaTI0MDBtX2Rldl9ib290c3RyYXAoc3RydWN0IGkyNDAwbSAqLCBlbnVtIGkyNDAwbV9icmkpOworZXh0ZXJuIGludCBpMjQwMG1fcmVhZF9tYWNfYWRkcihzdHJ1Y3QgaTI0MDBtICopOworZXh0ZXJuIGludCBpMjQwMG1fYm9vdHJvbV9pbml0KHN0cnVjdCBpMjQwMG0gKiwgZW51bSBpMjQwMG1fYnJpKTsKKworLyogTWFrZS9ncm9rIGJvb3Qtcm9tIGhlYWRlciBjb21tYW5kcyAqLworCitzdGF0aWMgaW5saW5lCitfX2xlMzIgaTI0MDBtX2JyaF9jb21tYW5kKGVudW0gaTI0MDBtX2JyaF9vcGNvZGUgb3Bjb2RlLCB1bnNpZ25lZCB1c2VfY2hlY2tzdW0sCisJCQkgIHVuc2lnbmVkIGRpcmVjdF9hY2Nlc3MpCit7CisJcmV0dXJuIGNwdV90b19sZTMyKAorCQlJMjQwME1fQlJIX1NJR05BVFVSRQorCQl8IChkaXJlY3RfYWNjZXNzID8gSTI0MDBNX0JSSF9ESVJFQ1RfQUNDRVNTIDogMCkKKwkJfCBJMjQwME1fQlJIX1JFU1BPTlNFX1JFUVVJUkVEIC8qIHJlc3BvbnNlIGFsd2F5cyByZXF1aXJlZCAqLworCQl8ICh1c2VfY2hlY2tzdW0gPyBJMjQwME1fQlJIX1VTRV9DSEVDS1NVTSA6IDApCisJCXwgKG9wY29kZSAmIEkyNDAwTV9CUkhfT1BDT0RFX01BU0spKTsKK30KKworc3RhdGljIGlubGluZQordm9pZCBpMjQwMG1fYnJoX3NldF9vcGNvZGUoc3RydWN0IGkyNDAwbV9ib290cm9tX2hlYWRlciAqaGRyLAorCQkJICAgZW51bSBpMjQwMG1fYnJoX29wY29kZSBvcGNvZGUpCit7CisJaGRyLT5jb21tYW5kID0gY3B1X3RvX2xlMzIoCisJCShsZTMyX3RvX2NwdShoZHItPmNvbW1hbmQpICYgfkkyNDAwTV9CUkhfT1BDT0RFX01BU0spCisJCXwgKG9wY29kZSAmIEkyNDAwTV9CUkhfT1BDT0RFX01BU0spKTsKK30KKworc3RhdGljIGlubGluZQordW5zaWduZWQgaTI0MDBtX2JyaF9nZXRfb3Bjb2RlKGNvbnN0IHN0cnVjdCBpMjQwMG1fYm9vdHJvbV9oZWFkZXIgKmhkcikKK3sKKwlyZXR1cm4gbGUzMl90b19jcHUoaGRyLT5jb21tYW5kKSAmIEkyNDAwTV9CUkhfT1BDT0RFX01BU0s7Cit9CisKK3N0YXRpYyBpbmxpbmUKK3Vuc2lnbmVkIGkyNDAwbV9icmhfZ2V0X3Jlc3BvbnNlKGNvbnN0IHN0cnVjdCBpMjQwMG1fYm9vdHJvbV9oZWFkZXIgKmhkcikKK3sKKwlyZXR1cm4gKGxlMzJfdG9fY3B1KGhkci0+Y29tbWFuZCkgJiBJMjQwME1fQlJIX1JFU1BPTlNFX01BU0spCisJCT4+IEkyNDAwTV9CUkhfUkVTUE9OU0VfU0hJRlQ7Cit9CisKK3N0YXRpYyBpbmxpbmUKK3Vuc2lnbmVkIGkyNDAwbV9icmhfZ2V0X3VzZV9jaGVja3N1bShjb25zdCBzdHJ1Y3QgaTI0MDBtX2Jvb3Ryb21faGVhZGVyICpoZHIpCit7CisJcmV0dXJuIGxlMzJfdG9fY3B1KGhkci0+Y29tbWFuZCkgJiBJMjQwME1fQlJIX1VTRV9DSEVDS1NVTTsKK30KKworc3RhdGljIGlubGluZQordW5zaWduZWQgaTI0MDBtX2JyaF9nZXRfcmVzcG9uc2VfcmVxdWlyZWQoCisJY29uc3Qgc3RydWN0IGkyNDAwbV9ib290cm9tX2hlYWRlciAqaGRyKQoreworCXJldHVybiBsZTMyX3RvX2NwdShoZHItPmNvbW1hbmQpICYgSTI0MDBNX0JSSF9SRVNQT05TRV9SRVFVSVJFRDsKK30KKworc3RhdGljIGlubGluZQordW5zaWduZWQgaTI0MDBtX2JyaF9nZXRfZGlyZWN0X2FjY2Vzcyhjb25zdCBzdHJ1Y3QgaTI0MDBtX2Jvb3Ryb21faGVhZGVyICpoZHIpCit7CisJcmV0dXJuIGxlMzJfdG9fY3B1KGhkci0+Y29tbWFuZCkgJiBJMjQwME1fQlJIX0RJUkVDVF9BQ0NFU1M7Cit9CisKK3N0YXRpYyBpbmxpbmUKK3Vuc2lnbmVkIGkyNDAwbV9icmhfZ2V0X3NpZ25hdHVyZShjb25zdCBzdHJ1Y3QgaTI0MDBtX2Jvb3Ryb21faGVhZGVyICpoZHIpCit7CisJcmV0dXJuIChsZTMyX3RvX2NwdShoZHItPmNvbW1hbmQpICYgSTI0MDBNX0JSSF9TSUdOQVRVUkVfTUFTSykKKwkJPj4gSTI0MDBNX0JSSF9TSUdOQVRVUkVfU0hJRlQ7Cit9CisKKworLyoKKyAqIERyaXZlciAvIGRldmljZSBzZXR1cCBhbmQgaW50ZXJuYWwgZnVuY3Rpb25zCisgKi8KK2V4dGVybiB2b2lkIGkyNDAwbV9uZXRkZXZfc2V0dXAoc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYpOworZXh0ZXJuIGludCBpMjQwMG1fdHhfc2V0dXAoc3RydWN0IGkyNDAwbSAqKTsKK2V4dGVybiB2b2lkIGkyNDAwbV93YWtlX3R4X3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICopOworZXh0ZXJuIHZvaWQgaTI0MDBtX3R4X3JlbGVhc2Uoc3RydWN0IGkyNDAwbSAqKTsKKworZXh0ZXJuIHZvaWQgaTI0MDBtX25ldF9yeChzdHJ1Y3QgaTI0MDBtICosIHN0cnVjdCBza19idWZmICosIHVuc2lnbmVkLAorCQkJICBjb25zdCB2b2lkICosIGludCk7CitlbnVtIGkyNDAwbV9wdDsKK2V4dGVybiBpbnQgaTI0MDBtX3R4KHN0cnVjdCBpMjQwMG0gKiwgY29uc3Qgdm9pZCAqLCBzaXplX3QsIGVudW0gaTI0MDBtX3B0KTsKKworI2lmZGVmIENPTkZJR19ERUJVR19GUworZXh0ZXJuIGludCBpMjQwMG1fZGVidWdmc19hZGQoc3RydWN0IGkyNDAwbSAqKTsKK2V4dGVybiB2b2lkIGkyNDAwbV9kZWJ1Z2ZzX3JtKHN0cnVjdCBpMjQwMG0gKik7CisjZWxzZQorc3RhdGljIGlubGluZSBpbnQgaTI0MDBtX2RlYnVnZnNfYWRkKHN0cnVjdCBpMjQwMG0gKmkyNDAwbSkKK3sKKwlyZXR1cm4gMDsKK30KK3N0YXRpYyBpbmxpbmUgdm9pZCBpMjQwMG1fZGVidWdmc19ybShzdHJ1Y3QgaTI0MDBtICppMjQwMG0pIHt9CisjZW5kaWYKKworLyogQ2FsbGVkIGJ5IF9kZXZfc3RhcnQoKS9fZGV2X3N0b3AoKSB0byBpbml0aWFsaXplIHRoZSBkZXZpY2UgaXRzZWxmICovCitleHRlcm4gaW50IGkyNDAwbV9kZXZfaW5pdGlhbGl6ZShzdHJ1Y3QgaTI0MDBtICopOworZXh0ZXJuIHZvaWQgaTI0MDBtX2Rldl9zaHV0ZG93bihzdHJ1Y3QgaTI0MDBtICopOworCitleHRlcm4gc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBpMjQwMG1fZGV2X2F0dHJfZ3JvdXA7CisKK2V4dGVybiBpbnQgaTI0MDBtX3NjaGVkdWxlX3dvcmsoc3RydWN0IGkyNDAwbSAqLAorCQkJCXZvaWQgKCopKHN0cnVjdCB3b3JrX3N0cnVjdCAqKSwgZ2ZwX3QpOworCisvKiBIREkgbWVzc2FnZSdzIHBheWxvYWQgZGVzY3JpcHRpb24gaGFuZGxpbmcgKi8KKworc3RhdGljIGlubGluZQorc2l6ZV90IGkyNDAwbV9wbGRfc2l6ZShjb25zdCBzdHJ1Y3QgaTI0MDBtX3BsZCAqcGxkKQoreworCXJldHVybiBJMjQwME1fUExEX1NJWkVfTUFTSyAmIGxlMzJfdG9fY3B1KHBsZC0+dmFsKTsKK30KKworc3RhdGljIGlubGluZQorZW51bSBpMjQwMG1fcHQgaTI0MDBtX3BsZF90eXBlKGNvbnN0IHN0cnVjdCBpMjQwMG1fcGxkICpwbGQpCit7CisJcmV0dXJuIChJMjQwME1fUExEX1RZUEVfTUFTSyAmIGxlMzJfdG9fY3B1KHBsZC0+dmFsKSkKKwkJPj4gSTI0MDBNX1BMRF9UWVBFX1NISUZUOworfQorCitzdGF0aWMgaW5saW5lCit2b2lkIGkyNDAwbV9wbGRfc2V0KHN0cnVjdCBpMjQwMG1fcGxkICpwbGQsIHNpemVfdCBzaXplLAorCQkgICAgZW51bSBpMjQwMG1fcHQgdHlwZSkKK3sKKwlwbGQtPnZhbCA9IGNwdV90b19sZTMyKAorCQkoKHR5cGUgPDwgSTI0MDBNX1BMRF9UWVBFX1NISUZUKSAmIEkyNDAwTV9QTERfVFlQRV9NQVNLKQorCQl8ICAoc2l6ZSAmIEkyNDAwTV9QTERfU0laRV9NQVNLKSk7Cit9CisKKworLyoKKyAqIEFQSSBmb3IgdGhlIGJ1cy1zcGVjaWZpYyBkcml2ZXJzCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKK3N0YXRpYyBpbmxpbmUKK3N0cnVjdCBpMjQwMG0gKmkyNDAwbV9nZXQoc3RydWN0IGkyNDAwbSAqaTI0MDBtKQoreworCWRldl9ob2xkKGkyNDAwbS0+d2ltYXhfZGV2Lm5ldF9kZXYpOworCXJldHVybiBpMjQwMG07Cit9CisKK3N0YXRpYyBpbmxpbmUKK3ZvaWQgaTI0MDBtX3B1dChzdHJ1Y3QgaTI0MDBtICppMjQwMG0pCit7CisJZGV2X3B1dChpMjQwMG0tPndpbWF4X2Rldi5uZXRfZGV2KTsKK30KKworZXh0ZXJuIGludCBpMjQwMG1fZGV2X3Jlc2V0X2hhbmRsZShzdHJ1Y3QgaTI0MDBtICopOworCisvKgorICogX3NldHVwKCkvX3JlbGVhc2UoKSBhcmUgY2FsbGVkIGJ5IHRoZSBwcm9iZS9kaXNjb25uZWN0IGZ1bmN0aW9ucyBvZgorICogdGhlIGJ1cy1zcGVjaWZpYyBkcml2ZXJzLgorICovCitleHRlcm4gaW50IGkyNDAwbV9zZXR1cChzdHJ1Y3QgaTI0MDBtICosIGVudW0gaTI0MDBtX2JyaSBibV9mbGFncyk7CitleHRlcm4gdm9pZCBpMjQwMG1fcmVsZWFzZShzdHJ1Y3QgaTI0MDBtICopOworCitleHRlcm4gaW50IGkyNDAwbV9yeChzdHJ1Y3QgaTI0MDBtICosIHN0cnVjdCBza19idWZmICopOworZXh0ZXJuIHN0cnVjdCBpMjQwMG1fbXNnX2hkciAqaTI0MDBtX3R4X21zZ19nZXQoc3RydWN0IGkyNDAwbSAqLCBzaXplX3QgKik7CitleHRlcm4gdm9pZCBpMjQwMG1fdHhfbXNnX3NlbnQoc3RydWN0IGkyNDAwbSAqKTsKKworc3RhdGljIGNvbnN0IF9fbGUzMiBpMjQwMG1fTkJPT1RfQkFSS0VSWzRdID0geworCV9fY29uc3RhbnRfY3B1X3RvX2xlMzIoSTI0MDBNX05CT09UX0JBUktFUiksCisJX19jb25zdGFudF9jcHVfdG9fbGUzMihJMjQwME1fTkJPT1RfQkFSS0VSKSwKKwlfX2NvbnN0YW50X2NwdV90b19sZTMyKEkyNDAwTV9OQk9PVF9CQVJLRVIpLAorCV9fY29uc3RhbnRfY3B1X3RvX2xlMzIoSTI0MDBNX05CT09UX0JBUktFUikKK307CisKK3N0YXRpYyBjb25zdCBfX2xlMzIgaTI0MDBtX1NCT09UX0JBUktFUls0XSA9IHsKKwlfX2NvbnN0YW50X2NwdV90b19sZTMyKEkyNDAwTV9TQk9PVF9CQVJLRVIpLAorCV9fY29uc3RhbnRfY3B1X3RvX2xlMzIoSTI0MDBNX1NCT09UX0JBUktFUiksCisJX19jb25zdGFudF9jcHVfdG9fbGUzMihJMjQwME1fU0JPT1RfQkFSS0VSKSwKKwlfX2NvbnN0YW50X2NwdV90b19sZTMyKEkyNDAwTV9TQk9PVF9CQVJLRVIpCit9OworCisKKy8qCisgKiBVdGlsaXR5IGZ1bmN0aW9ucworICovCisKK3N0YXRpYyBpbmxpbmUKK3N0cnVjdCBkZXZpY2UgKmkyNDAwbV9kZXYoc3RydWN0IGkyNDAwbSAqaTI0MDBtKQoreworCXJldHVybiBpMjQwMG0tPndpbWF4X2Rldi5uZXRfZGV2LT5kZXYucGFyZW50OworfQorCisvKgorICogSGVscGVyIGZvciBzY2hlZHVsaW5nIHNpbXBsZSB3b3JrIGZ1bmN0aW9ucworICoKKyAqIFRoaXMgc3RydWN0IGNhbiBnZXQgYW55IGtpbmQgb2YgcGF5bG9hZCBhdHRhY2hlZCAobm9ybWFsbHkgaW4gdGhlCisgKiBmb3JtIG9mIGEgc3RydWN0IHdoZXJlIHlvdSBwYWNrIHRoZSBzdHVmZiB5b3Ugd2FudCB0byBwYXNzIHRvIHRoZQorICogX3dvcmsgZnVuY3Rpb24pLgorICovCitzdHJ1Y3QgaTI0MDBtX3dvcmsgeworCXN0cnVjdCB3b3JrX3N0cnVjdCB3czsKKwlzdHJ1Y3QgaTI0MDBtICppMjQwMG07CisJdTggcGxbMF07Cit9OworZXh0ZXJuIGludCBpMjQwMG1fcXVldWVfd29yayhzdHJ1Y3QgaTI0MDBtICosCisJCQkgICAgIHZvaWQgKCopKHN0cnVjdCB3b3JrX3N0cnVjdCAqKSwgZ2ZwX3QsCisJCQkJY29uc3Qgdm9pZCAqLCBzaXplX3QpOworCitleHRlcm4gaW50IGkyNDAwbV9tc2dfY2hlY2tfc3RhdHVzKGNvbnN0IHN0cnVjdCBpMjQwMG1fbDNsNF9oZHIgKiwKKwkJCQkgICBjaGFyICosIHNpemVfdCk7CitleHRlcm4gaW50IGkyNDAwbV9tc2dfc2l6ZV9jaGVjayhzdHJ1Y3QgaTI0MDBtICosCisJCQkJIGNvbnN0IHN0cnVjdCBpMjQwMG1fbDNsNF9oZHIgKiwgc2l6ZV90KTsKK2V4dGVybiBzdHJ1Y3Qgc2tfYnVmZiAqaTI0MDBtX21zZ190b19kZXYoc3RydWN0IGkyNDAwbSAqLCBjb25zdCB2b2lkICosIHNpemVfdCk7CitleHRlcm4gdm9pZCBpMjQwMG1fbXNnX3RvX2Rldl9jYW5jZWxfd2FpdChzdHJ1Y3QgaTI0MDBtICosIGludCk7CitleHRlcm4gdm9pZCBpMjQwMG1fbXNnX2Fja19ob29rKHN0cnVjdCBpMjQwMG0gKiwKKwkJCQljb25zdCBzdHJ1Y3QgaTI0MDBtX2wzbDRfaGRyICosIHNpemVfdCk7CitleHRlcm4gdm9pZCBpMjQwMG1fcmVwb3J0X2hvb2soc3RydWN0IGkyNDAwbSAqLAorCQkJICAgICAgIGNvbnN0IHN0cnVjdCBpMjQwMG1fbDNsNF9oZHIgKiwgc2l6ZV90KTsKK2V4dGVybiBpbnQgaTI0MDBtX2NtZF9lbnRlcl9wb3dlcnNhdmUoc3RydWN0IGkyNDAwbSAqKTsKK2V4dGVybiBpbnQgaTI0MDBtX2NtZF9nZXRfc3RhdGUoc3RydWN0IGkyNDAwbSAqKTsKK2V4dGVybiBpbnQgaTI0MDBtX2NtZF9leGl0X2lkbGUoc3RydWN0IGkyNDAwbSAqKTsKK2V4dGVybiBzdHJ1Y3Qgc2tfYnVmZiAqaTI0MDBtX2dldF9kZXZpY2VfaW5mbyhzdHJ1Y3QgaTI0MDBtICopOworZXh0ZXJuIGludCBpMjQwMG1fZmlybXdhcmVfY2hlY2soc3RydWN0IGkyNDAwbSAqKTsKK2V4dGVybiBpbnQgaTI0MDBtX3NldF9pbml0X2NvbmZpZyhzdHJ1Y3QgaTI0MDBtICosCisJCQkJICBjb25zdCBzdHJ1Y3QgaTI0MDBtX3Rsdl9oZHIgKiosIHNpemVfdCk7CisKK3N0YXRpYyBpbmxpbmUKK3N0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqdXNiX2dldF9lcGQoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmlmYWNlLCBpbnQgZXApCit7CisJcmV0dXJuICZpZmFjZS0+Y3VyX2FsdHNldHRpbmctPmVuZHBvaW50W2VwXS5kZXNjOworfQorCitleHRlcm4gaW50IGkyNDAwbV9vcF9yZmtpbGxfc3dfdG9nZ2xlKHN0cnVjdCB3aW1heF9kZXYgKiwKKwkJCQkgICAgICBlbnVtIHdpbWF4X3JmX3N0YXRlKTsKK2V4dGVybiB2b2lkIGkyNDAwbV9yZXBvcnRfdGx2X3JmX3N3aXRjaGVzX3N0YXR1cygKKwlzdHJ1Y3QgaTI0MDBtICosIGNvbnN0IHN0cnVjdCBpMjQwMG1fdGx2X3JmX3N3aXRjaGVzX3N0YXR1cyAqKTsKKworCisvKgorICogRG8gYSBtaWxsaXNlY29uZC1zbGVlcCBmb3IgYWxsb3dpbmcgd2lyZXNoYXJrIHRvIGR1bXAgYWxsIHRoZSBkYXRhCisgKiBwYWNrZXRzLiBVc2VkIG9ubHkgZm9yIGRlYnVnZ2luZy4KKyAqLworc3RhdGljIGlubGluZQordm9pZCBfX2kyNDAwbV9tc2xlZXAodW5zaWduZWQgbXMpCit7CisjaWYgMQorI2Vsc2UKKwltc2xlZXAobXMpOworI2VuZGlmCit9CisKKy8qIE1vZHVsZSBwYXJhbWV0ZXJzICovCisKK2V4dGVybiBpbnQgaTI0MDBtX2lkbGVfbW9kZV9kaXNhYmxlZDsKKworCisjZW5kaWYgLyogI2lmbmRlZiBfX0kyNDAwTV9IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpbWF4L2kyNDAwbS9uZXRkZXYuYyBiL2RyaXZlcnMvbmV0L3dpbWF4L2kyNDAwbS9uZXRkZXYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42M2ZlNzA4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2ltYXgvaTI0MDBtL25ldGRldi5jCkBAIC0wLDAgKzEsNTI0IEBACisvKgorICogSW50ZWwgV2lyZWxlc3MgV2lNQVggQ29ubmVjdGlvbiAyNDAwbQorICogR2x1ZSB3aXRoIHRoZSBuZXR3b3JraW5nIHN0YWNrCisgKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBJbnRlbCBDb3Jwb3JhdGlvbiA8bGludXgtd2ltYXhAaW50ZWwuY29tPgorICogWWFuaXIgTHViZXRraW4gPHlhbmlyeC5sdWJldGtpbkBpbnRlbC5jb20+CisgKiBJbmFreSBQZXJlei1Hb256YWxleiA8aW5ha3kucGVyZXotZ29uemFsZXpAaW50ZWwuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEsIFVTQS4KKyAqCisgKgorICogVGhpcyBpbXBsZW1lbnRzIGFuIGV0aGVybmV0IGRldmljZSBmb3IgdGhlIGkyNDAwbS4KKyAqCisgKiBXZSBmYWtlIGJlaW5nIGFuIGV0aGVybmV0IGRldmljZSB0byBzaW1wbGlmeSB0aGUgc3VwcG9ydCBmcm9tIHVzZXIKKyAqIHNwYWNlIGFuZCBmcm9tIHRoZSBvdGhlciBzaWRlLiBUaGUgd29ybGQgaXMgKHNhZGx5KSBjb25maWd1cmVkIHRvCisgKiB0YWtlIGluIG9ubHkgRXRoZXJuZXQgZGV2aWNlcy4uLgorICoKKyAqIEJlY2F1c2Ugb2YgdGhpcywgY3VycmVudGx5IHRoZXJlIGlzIGFuIGNvcHktZWFjaC1yeGVkLXBhY2tldAorICogb3ZlcmhlYWQgb24gdGhlIFJYIHBhdGguIEVhY2ggSVAgcGFja2V0IGhhcyB0byBiZSByZWFsbG9jYXRlZCB0bworICogYWRkIGFuIGV0aGVybmV0IGhlYWRlciAoYXMgdGhlcmUgaXMgbm8gc3BhY2UgaW4gd2hhdCB3ZSBnZXQgZnJvbQorICogdGhlIGRldmljZSkuIFRoaXMgaXMgYSBrbm93biBkcmF3YmFjayBhbmQgY29taW5nIHZlcnNpb25zIG9mIHRoZQorICogZGV2aWNlJ3MgZmlybXdhcmUgYXJlIGJlaW5nIGNoYW5nZWQgdG8gYWRkIGhlYWRlciBzcGFjZSB0aGF0IGNhbiBiZQorICogdXNlZCB0byBpbnNlcnQgdGhlIGV0aGVybmV0IGhlYWRlciB3aXRob3V0IGhhdmluZyB0byByZWFsbG9jYXRlIGFuZAorICogY29weS4KKyAqCisgKiBUWCBlcnJvciBoYW5kbGluZyBpcyB0cmlja3k7IGJlY2F1c2Ugd2UgaGF2ZSB0byBGSUZPL3F1ZXVlIHRoZQorICogYnVmZmVycyBmb3IgdHJhbnNtaXNzaW9uIChhcyB0aGUgaGFyZHdhcmUgbGlrZXMgaXQgYWdncmVnYXRlZCksIHdlCisgKiBqdXN0IGdpdmUgdGhlIHNrYiB0byB0aGUgVFggc3Vic3lzdGVtIGFuZCBieSB0aGUgdGltZSBpdCBpcworICogdHJhbnNtaXR0ZWQsIHdlIGhhdmUgbG9uZyBmb3Jnb3R0ZW4gYWJvdXQgaXQuIFNvIHdlIGp1c3QgZG9uJ3QgY2FyZQorICogdG9vIG11Y2ggYWJvdXQgaXQuCisgKgorICogTm90ZSB0aGF0IHdoZW4gdGhlIGRldmljZSBpcyBpbiBpZGxlIG1vZGUgd2l0aCB0aGUgYmFzZXN0YXRpb24sIHdlCisgKiBuZWVkIHRvIG5lZ290aWF0ZSBjb21pbmcgYmFjayB1cCBvbmxpbmUuIFRoYXQgaW52b2x2ZXMgbmVnb3RpYXRpb24KKyAqIGFuZCBwb3NzaWJsZSB1c2VyIHNwYWNlIGludGVyYWN0aW9uLiBUaHVzLCB3ZSBkZWZlciB0byBhIHdvcmtxdWV1ZQorICogdG8gZG8gYWxsIHRoYXQuIEJ5IGRlZmF1bHQsIHdlIG9ubHkgcXVldWUgYSBzaW5nbGUgcGFja2V0IGFuZCBkcm9wCisgKiB0aGUgcmVzdCwgYXMgcG90ZW50aWFsbHkgdGhlIHRpbWUgdG8gZ28gYmFjayBmcm9tIGlkbGUgdG8gbm9ybWFsIGlzCisgKiBsb25nLgorICoKKyAqIFJPQURNQVAKKyAqCisgKiBpMjQwMG1fb3BlbiAgICAgICAgIENhbGxlZCBvbiBpZmNvbmZpZyB1cAorICogaTI0MDBtX3N0b3AgICAgICAgICBDYWxsZWQgb24gaWZjb25maWcgZG93bgorICoKKyAqIGkyNDAwbV9oYXJkX3N0YXJ0X3htaXQgQ2FsbGVkIGJ5IHRoZSBuZXR3b3JrIHN0YWNrIHRvIHNlbmQgYSBwYWNrZXQKKyAqICAgaTI0MDBtX25ldF93YWtlX3R4CSAgV2FrZSB1cCBkZXZpY2UgZnJvbSBiYXNlc3RhdGlvbi1JRExFICYgVFgKKyAqICAgICBpMjQwMG1fd2FrZV90eF93b3JrCisgKiAgICAgICBpMjQwMG1fY21kX2V4aXRfaWRsZQorICogICAgICAgaTI0MDBtX3R4CisgKiAgIGkyNDAwbV9uZXRfdHggICAgICAgIFRYIGEgZGF0YSBmcmFtZQorICogICAgIGkyNDAwbV90eAorICoKKyAqIGkyNDAwbV9jaGFuZ2VfbXR1ICAgICAgQ2FsbGVkIG9uIGlmY29uZmlnIG10dSBYWFgKKyAqCisgKiBpMjQwMG1fdHhfdGltZW91dCAgICAgIENhbGxlZCB3aGVuIHRoZSBkZXZpY2UgdGltZXMgb3V0CisgKgorICogaTI0MDBtX25ldF9yeCAgICAgICAgICBDYWxsZWQgYnkgdGhlIFJYIGNvZGUgd2hlbiBhIGRhdGEgZnJhbWUgaXMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlLgorICogaTI0MDBtX25ldGRldl9zZXR1cCAgICBDYWxsZWQgdG8gc2V0dXAgYWxsIHRoZSBuZXRkZXYgc3R1ZmYgZnJvbQorICogICAgICAgICAgICAgICAgICAgICAgICBhbGxvY19uZXRkZXYuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlICJpMjQwMG0uaCIKKworCisjZGVmaW5lIERfU1VCTU9EVUxFIG5ldGRldgorI2luY2x1ZGUgImRlYnVnLWxldmVscy5oIgorCitlbnVtIHsKKy8qIG5ldGRldiBpbnRlcmZhY2UgKi8KKwkvKgorCSAqIE91dCBvZiBOV0cgc3BlYyAoUjFfdjEuMi4yKSwgMy4zLjMgQVNOIEJlYXJlciBQbGFuZSBNVFUgU2l6ZQorCSAqCisJICogVGhlIE1UVSBpcyAxNDAwIG9yIGxlc3MKKwkgKi8KKwlJMjQwME1fTUFYX01UVSA9IDE0MDAsCisJSTI0MDBNX1RYX1RJTUVPVVQgPSBIWiwKKwlJMjQwME1fVFhfUUxFTiA9IDUsCit9OworCisKK3N0YXRpYworaW50IGkyNDAwbV9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2KQoreworCWludCByZXN1bHQ7CisJc3RydWN0IGkyNDAwbSAqaTI0MDBtID0gbmV0X2Rldl90b19pMjQwMG0obmV0X2Rldik7CisJc3RydWN0IGRldmljZSAqZGV2ID0gaTI0MDBtX2RldihpMjQwMG0pOworCisJZF9mbnN0YXJ0KDMsIGRldiwgIihuZXRfZGV2ICVwIFtpMjQwMG0gJXBdKVxuIiwgbmV0X2RldiwgaTI0MDBtKTsKKwlpZiAoaTI0MDBtLT5yZWFkeSA9PSAwKSB7CisJCWRldl9lcnIoZGV2LCAiRGV2aWNlIGlzIHN0aWxsIGluaXRpYWxpemluZ1xuIik7CisJCXJlc3VsdCA9IC1FQlVTWTsKKwl9IGVsc2UKKwkJcmVzdWx0ID0gMDsKKwlkX2ZuZW5kKDMsIGRldiwgIihuZXRfZGV2ICVwIFtpMjQwMG0gJXBdKSA9ICVkXG4iLAorCQluZXRfZGV2LCBpMjQwMG0sIHJlc3VsdCk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworCisvKgorICoKKyAqIE9uIGtlcm5lbCB2ZXJzaW9ucyB3aGVyZSBjYW5jZWxfd29ya19zeW5jKCkgZGlkbid0IHJldHVybiBhbnl0aGluZywKKyAqIHdlIHJlbHkgb24gd2FrZV90eF9za2IoKSBiZWluZyBub24tTlVMTC4KKyAqLworc3RhdGljCitpbnQgaTI0MDBtX3N0b3Aoc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYpCit7CisJc3RydWN0IGkyNDAwbSAqaTI0MDBtID0gbmV0X2Rldl90b19pMjQwMG0obmV0X2Rldik7CisJc3RydWN0IGRldmljZSAqZGV2ID0gaTI0MDBtX2RldihpMjQwMG0pOworCisJZF9mbnN0YXJ0KDMsIGRldiwgIihuZXRfZGV2ICVwIFtpMjQwMG0gJXBdKVxuIiwgbmV0X2RldiwgaTI0MDBtKTsKKwkvKiBTZWUgaTI0MDBtX2hhcmRfc3RhcnRfeG1pdCgpLCByZWZlcmVuY2VzIGFyZSB0YWtlbiB0aGVyZQorCSAqIGFuZCBoZXJlIHdlIHJlbGVhc2UgdGhlbSBpZiB0aGUgd29yayB3YXMgc3RpbGwKKwkgKiBwZW5kaW5nLiBOb3RlIHdlIGNhbid0IGRpZmZlcmVudGlhdGUgd29yayBub3QgcGVuZGluZyB2cworCSAqIG5ldmVyIHNjaGVkdWxlZCwgc28gdGhlIE5VTEwgY2hlY2sgZG9lcyB0aGF0LiAqLworCWlmIChjYW5jZWxfd29ya19zeW5jKCZpMjQwMG0tPndha2VfdHhfd3MpID09IDAKKwkgICAgJiYgaTI0MDBtLT53YWtlX3R4X3NrYiAhPSBOVUxMKSB7CisJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCXN0cnVjdCBza19idWZmICp3YWtlX3R4X3NrYjsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmkyNDAwbS0+dHhfbG9jaywgZmxhZ3MpOworCQl3YWtlX3R4X3NrYiA9IGkyNDAwbS0+d2FrZV90eF9za2I7CS8qIGNvbXBhdCBoZWxwICovCisJCWkyNDAwbS0+d2FrZV90eF9za2IgPSBOVUxMOwkvKiBjb21wYXQgaGVscCAqLworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpMjQwMG0tPnR4X2xvY2ssIGZsYWdzKTsKKwkJaTI0MDBtX3B1dChpMjQwMG0pOworCQlrZnJlZV9za2Iod2FrZV90eF9za2IpOworCX0KKwlkX2ZuZW5kKDMsIGRldiwgIihuZXRfZGV2ICVwIFtpMjQwMG0gJXBdKSA9IDBcbiIsIG5ldF9kZXYsIGkyNDAwbSk7CisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqIFdha2UgdXAgdGhlIGRldmljZSBhbmQgdHJhbnNtaXQgYSBoZWxkIFNLQiwgdGhlbiByZXN0YXJ0IHRoZSBuZXQgcXVldWUKKyAqCisgKiBXaGVuIHRoZSBkZXZpY2UgZ29lcyBpbnRvIGJhc2VzdGF0aW9uLWlkbGUgbW9kZSwgd2UgbmVlZCB0byB0ZWxsIGl0CisgKiB0byBleGl0IHRoYXQgbW9kZTsgaXQgd2lsbCBuZWdvdGlhdGUgd2l0aCB0aGUgYmFzZSBzdGF0aW9uLCB1c2VyCisgKiBzcGFjZSBtYXkgaGF2ZSB0byBpbnRlcnZlbmUgdG8gcmVoYW5kc2hha2UgY3J5cHRvIGFuZCB0aGVuIHRlbGwgdXMKKyAqIHdoZW4gaXQgaXMgcmVhZHkgdG8gdHJhbnNtaXQgdGhlIHBhY2tldCB3ZSBoYXZlICJxdWV1ZWQiLiBTdGlsbCB3ZQorICogbmVlZCB0byBnaXZlIGl0IHNvbWV0aW1lIGFmdGVyIGl0IHJlcG9ydHMgYmVpbmcgb2suCisgKgorICogT24gZXJyb3IsIHRoZXJlIGlzIG5vdCBtdWNoIHdlIGNhbiBkby4gSWYgdGhlIGVycm9yIHdhcyBvbiBUWCwgd2UKKyAqIHN0aWxsIHdha2UgdGhlIHF1ZXVlIHVwIHRvIHNlZSBpZiB0aGUgbmV4dCBwYWNrZXQgd2lsbCBiZSBsdWNraWVyLgorICoKKyAqIElmIF9jbWRfZXhpdF9pZGxlKCkgZmFpbHMuLi53ZWxsLCBpdCBjb3VsZCBiZSBtYW55IHRoaW5nczsgbW9zdAorICogY29tbW9ubHkgaXQgaXMgdGhhdCBzb21ldGhpbmcgZWxzZSB0b29rIHRoZSBkZXZpY2Ugb3V0IG9mIElETEUgbW9kZQorICogKGZvciBleGFtcGxlLCB0aGUgYmFzZSBzdGF0aW9uKS4gSW4gdGhhdCBjYXNlIHdlIGdldCBhbiAtRUlMU0VRIGFuZAorICogd2UgYXJlIGp1c3QgZ29pbmcgdG8gaWdub3JlIHRoYXQgb25lLiBJZiB0aGUgZGV2aWNlIGlzIGJhY2sgdG8KKyAqIGNvbm5lY3RlZCwgdGhlbiBmaW5lIC0tIGlmIGl0IGlzIHNvbWVvdGhlciBzdGF0ZSwgdGhlIHBhY2tldCB3aWxsCisgKiBiZSBkcm9wcGVkIGFueXdheS4KKyAqLwordm9pZCBpMjQwMG1fd2FrZV90eF93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd3MpCit7CisJaW50IHJlc3VsdDsKKwlzdHJ1Y3QgaTI0MDBtICppMjQwMG0gPSBjb250YWluZXJfb2Yod3MsIHN0cnVjdCBpMjQwMG0sIHdha2VfdHhfd3MpOworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGkyNDAwbV9kZXYoaTI0MDBtKTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gaTI0MDBtLT53YWtlX3R4X3NrYjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmkyNDAwbS0+dHhfbG9jaywgZmxhZ3MpOworCXNrYiA9IGkyNDAwbS0+d2FrZV90eF9za2I7CisJaTI0MDBtLT53YWtlX3R4X3NrYiA9IE5VTEw7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaTI0MDBtLT50eF9sb2NrLCBmbGFncyk7CisKKwlkX2Zuc3RhcnQoMywgZGV2LCAiKHdzICVwIGkyNDAwbSAlcCBza2IgJXApXG4iLCB3cywgaTI0MDBtLCBza2IpOworCXJlc3VsdCA9IC1FSU5WQUw7CisJaWYgKHNrYiA9PSBOVUxMKSB7CisJCWRldl9lcnIoZGV2LCAiV0FLRSZUWDogc2tiIGRpc3NhcGVhcmVkIVxuIik7CisJCWdvdG8gb3V0X3B1dDsKKwl9CisJcmVzdWx0ID0gaTI0MDBtX2NtZF9leGl0X2lkbGUoaTI0MDBtKTsKKwlpZiAocmVzdWx0ID09IC1FSUxTRVEpCisJCXJlc3VsdCA9IDA7CisJaWYgKHJlc3VsdCA8IDApIHsKKwkJZGV2X2VycihkZXYsICJXQUtFJlRYOiBkZXZpY2UgZGlkbid0IGdldCBvdXQgb2YgaWRsZTogIgorCQkJIiVkXG4iLCByZXN1bHQpOworCQkJZ290byBlcnJvcjsKKwl9CisJcmVzdWx0ID0gd2FpdF9ldmVudF90aW1lb3V0KGkyNDAwbS0+c3RhdGVfd3EsCisJCQkJICAgIGkyNDAwbS0+c3RhdGUgIT0gSTI0MDBNX1NTX0lETEUsIDUgKiBIWik7CisJaWYgKHJlc3VsdCA9PSAwKQorCQlyZXN1bHQgPSAtRVRJTUVET1VUOworCWlmIChyZXN1bHQgPCAwKSB7CisJCWRldl9lcnIoZGV2LCAiV0FLRSZUWDogZXJyb3Igd2FpdGluZyBmb3IgZGV2aWNlIHRvIGV4aXQgSURMRTogIgorCQkJIiVkXG4iLCByZXN1bHQpOworCQlnb3RvIGVycm9yOworCX0KKwltc2xlZXAoMjApOwkvKiBkZXZpY2Ugc3RpbGwgbmVlZHMgc29tZSB0aW1lIG9yIGl0IGRyb3BzIGl0ICovCisJcmVzdWx0ID0gaTI0MDBtX3R4KGkyNDAwbSwgc2tiLT5kYXRhLCBza2ItPmxlbiwgSTI0MDBNX1BUX0RBVEEpOworCW5ldGlmX3dha2VfcXVldWUoaTI0MDBtLT53aW1heF9kZXYubmV0X2Rldik7CitlcnJvcjoKKwlrZnJlZV9za2Ioc2tiKTsJLyogcmVmY291bnQgdHJhbnNmZXJyZWQgYnkgX2hhcmRfc3RhcnRfeG1pdCgpICovCitvdXRfcHV0OgorCWkyNDAwbV9wdXQoaTI0MDBtKTsKKwlkX2ZuZW5kKDMsIGRldiwgIih3cyAlcCBpMjQwMG0gJXAgc2tiICVwKSA9IHZvaWQgWyVkXVxuIiwKKwkJd3MsIGkyNDAwbSwgc2tiLCByZXN1bHQpOworfQorCisKKy8qCisgKiBQcmVwYXJlIHRoZSBkYXRhIHBheWxvYWQgVFggaGVhZGVyCisgKgorICogVGhlIGkyNDAwbSBleHBlY3RzIGEgNCBieXRlIGhlYWRlciBpbiBmcm9udCBvZiBhIGRhdGEgcGFja2V0LgorICoKKyAqIEJlY2F1c2Ugd2UgcHJldGVuZCB0byBiZSBhbiBldGhlcm5ldCBkZXZpY2UsIHRoaXMgcGFja2V0IGNvbWVzIHdpdGgKKyAqIGFuIGV0aGVybmV0IGhlYWRlci4gUHVsbCBpdCBhbmQgcHVzaCBvdXIgaGVhZGVyLgorICovCitzdGF0aWMKK3ZvaWQgaTI0MDBtX3R4X3ByZXBfaGVhZGVyKHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGkyNDAwbV9wbF9kYXRhX2hkciAqcGxfaGRyOworCXNrYl9wdWxsKHNrYiwgRVRIX0hMRU4pOworCXBsX2hkciA9IChzdHJ1Y3QgaTI0MDBtX3BsX2RhdGFfaGRyICopIHNrYl9wdXNoKHNrYiwgc2l6ZW9mKCpwbF9oZHIpKTsKKwlwbF9oZHItPnJlc2VydmVkID0gMDsKK30KKworCisvKgorICogVFggYW4gc2tiIHRvIGFuIGlkbGUgZGV2aWNlCisgKgorICogV2hlbiB0aGUgZGV2aWNlIGlzIGluIGJhc2VzdGF0aW9uLWlkbGUgbW9kZSwgd2UgbmVlZCB0byB3YWtlIGl0IHVwCisgKiBhbmQgdGhlbiBUWC4gU28gd2UgcXVldWUgYSB3b3JrX3N0cnVjdCBmb3IgZG9pbmcgc28uCisgKgorICogV2UgbmVlZCB0byBnZXQgYW4gZXh0cmEgcmVmIGZvciB0aGUgc2tiIChzbyBpdCBpcyBub3QgZHJvcHBlZCksIGFzCisgKiB3ZWxsIGFzIGJlIGNhcmVmdWwgbm90IHRvIHF1ZXVlIG1vcmUgdGhhbiBvbmUgcmVxdWVzdCAod29uJ3QgaGVscAorICogYXQgYWxsKS4gSWYgbW9yZSB0aGFuIG9uZSByZXF1ZXN0IGNvbWVzIG9yIHRoZXJlIGFyZSBlcnJvcnMsIHdlCisgKiBqdXN0IGRyb3AgdGhlIHBhY2tldHMgKHNlZSBpMjQwMG1faGFyZF9zdGFydF94bWl0KCkpLgorICovCitzdGF0aWMKK2ludCBpMjQwMG1fbmV0X3dha2VfdHgoc3RydWN0IGkyNDAwbSAqaTI0MDBtLCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldiwKKwkJICAgICAgIHN0cnVjdCBza19idWZmICpza2IpCit7CisJaW50IHJlc3VsdDsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBpMjQwMG1fZGV2KGkyNDAwbSk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWRfZm5zdGFydCgzLCBkZXYsICIoc2tiICVwIG5ldF9kZXYgJXApXG4iLCBza2IsIG5ldF9kZXYpOworCWlmIChuZXRfcmF0ZWxpbWl0KCkpIHsKKwkJZF9wcmludGYoMywgZGV2LCAiV0FLRSZORVRUWDogIgorCQkJICJza2IgJXAgc2VuZGluZyAlZCBieXRlcyB0byByYWRpb1xuIiwKKwkJCSBza2IsIHNrYi0+bGVuKTsKKwkJZF9kdW1wKDQsIGRldiwgc2tiLT5kYXRhLCBza2ItPmxlbik7CisJfQorCS8qIFdlIGhvbGQgYSByZWYgY291bnQgZm9yIGkyNDAwbSBhbmQgc2tiLCBzbyB3aGVuCisJICogc3RvcHBpbmcoKSB0aGUgZGV2aWNlLCB3ZSBuZWVkIHRvIGNhbmNlbCB0aGF0IHdvcmsKKwkgKiBhbmQgaWYgcGVuZGluZywgcmVsZWFzZSB0aG9zZSByZXNvdXJjZXMuICovCisJcmVzdWx0ID0gMDsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaTI0MDBtLT50eF9sb2NrLCBmbGFncyk7CisJaWYgKCF3b3JrX3BlbmRpbmcoJmkyNDAwbS0+d2FrZV90eF93cykpIHsKKwkJbmV0aWZfc3RvcF9xdWV1ZShuZXRfZGV2KTsKKwkJaTI0MDBtX2dldChpMjQwMG0pOworCQlpMjQwMG0tPndha2VfdHhfc2tiID0gc2tiX2dldChza2IpOwkvKiB0cmFuc2ZlciByZWYgY291bnQgKi8KKwkJaTI0MDBtX3R4X3ByZXBfaGVhZGVyKHNrYik7CisJCXJlc3VsdCA9IHNjaGVkdWxlX3dvcmsoJmkyNDAwbS0+d2FrZV90eF93cyk7CisJCVdBUk5fT04ocmVzdWx0ID09IDApOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpMjQwMG0tPnR4X2xvY2ssIGZsYWdzKTsKKwlpZiAocmVzdWx0ID09IDApIHsKKwkJLyogWWVzLCB0aGlzIGhhcHBlbnMgZXZlbiBpZiB3ZSBzdG9wcGVkIHRoZQorCQkgKiBxdWV1ZSAtLSBibGFtZSB0aGUgcXVldWUgZGlzY2lwbGluZXMgdGhhdAorCQkgKiBxdWV1ZSB3aXRob3V0IGxvb2tpbmcgLS0gSSBndWVzcyB0aGVyZSBpcyBhIHJlYXNvbgorCQkgKiBmb3IgdGhhdC4gKi8KKwkJaWYgKG5ldF9yYXRlbGltaXQoKSkKKwkJCWRfcHJpbnRmKDEsIGRldiwgIk5FVFRYOiBkZXZpY2UgZXhpdGluZyBpZGxlLCAiCisJCQkJICJkcm9wcGluZyBza2IgJXAsIHF1ZXVlIHJ1bm5pbmcgJWRcbiIsCisJCQkJIHNrYiwgbmV0aWZfcXVldWVfc3RvcHBlZChuZXRfZGV2KSk7CisJCXJlc3VsdCA9IC1FQlVTWTsKKwl9CisJZF9mbmVuZCgzLCBkZXYsICIoc2tiICVwIG5ldF9kZXYgJXApID0gJWRcbiIsIHNrYiwgbmV0X2RldiwgcmVzdWx0KTsKKwlyZXR1cm4gcmVzdWx0OworfQorCisKKy8qCisgKiBUcmFuc21pdCBhIHBhY2tldCB0byB0aGUgYmFzZSBzdGF0aW9uIG9uIGJlaGFsZiBvZiB0aGUgbmV0d29yayBzdGFjay4KKyAqCisgKiBSZXR1cm5zOiAwIGlmIG9rLCA8IDAgZXJybm8gY29kZSBvbiBlcnJvci4KKyAqCisgKiBXZSBuZWVkIHRvIHB1bGwgdGhlIGV0aGVybmV0IGhlYWRlciBhbmQgYWRkIHRoZSBoYXJkd2FyZSBoZWFkZXIsCisgKiB3aGljaCBpcyBjdXJyZW50bHkgc2V0IHRvIGFsbCB6ZXJvZXMgYW5kIHJlc2VydmVkLgorICovCitzdGF0aWMKK2ludCBpMjQwMG1fbmV0X3R4KHN0cnVjdCBpMjQwMG0gKmkyNDAwbSwgc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYsCisJCSAgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlpbnQgcmVzdWx0OworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGkyNDAwbV9kZXYoaTI0MDBtKTsKKworCWRfZm5zdGFydCgzLCBkZXYsICIoaTI0MDBtICVwIG5ldF9kZXYgJXAgc2tiICVwKVxuIiwKKwkJICBpMjQwMG0sIG5ldF9kZXYsIHNrYik7CisJLyogRklYTUU6IGNoZWNrIGV0aCBoZHIsIG9ubHkgSVB2NCBpcyByb3V0ZWQgYnkgdGhlIGRldmljZSBhcyBvZiBub3cgKi8KKwluZXRfZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJaTI0MDBtX3R4X3ByZXBfaGVhZGVyKHNrYik7CisJZF9wcmludGYoMywgZGV2LCAiTkVUVFg6IHNrYiAlcCBzZW5kaW5nICVkIGJ5dGVzIHRvIHJhZGlvXG4iLAorCQkgc2tiLCBza2ItPmxlbik7CisJZF9kdW1wKDQsIGRldiwgc2tiLT5kYXRhLCBza2ItPmxlbik7CisJcmVzdWx0ID0gaTI0MDBtX3R4KGkyNDAwbSwgc2tiLT5kYXRhLCBza2ItPmxlbiwgSTI0MDBNX1BUX0RBVEEpOworCWRfZm5lbmQoMywgZGV2LCAiKGkyNDAwbSAlcCBuZXRfZGV2ICVwIHNrYiAlcCkgPSAlZFxuIiwKKwkJaTI0MDBtLCBuZXRfZGV2LCBza2IsIHJlc3VsdCk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworCisvKgorICogVHJhbnNtaXQgYSBwYWNrZXQgdG8gdGhlIGJhc2Ugc3RhdGlvbiBvbiBiZWhhbGYgb2YgdGhlIG5ldHdvcmsgc3RhY2sKKyAqCisgKgorICogUmV0dXJuczogTkVUREVWX1RYX09LIChhbHdheXMsIGV2ZW4gaW4gY2FzZSBvZiBlcnJvcikKKyAqCisgKiBJbiBjYXNlIG9mIGVycm9yLCB3ZSBqdXN0IGRyb3AgaXQuIFJlYXNvbnM6CisgKgorICogIC0gd2UgYWRkIGEgaHcgaGVhZGVyIHRvIGVhY2ggc2tiLCBhbmQgaWYgdGhlIG5ldHdvcmsgc3RhY2sKKyAqICAgIHJldHJpZXMsIHdlIGhhdmUgbm8gd2F5IHRvIGtub3cgaWYgdGhhdCBza2IgaGFzIGl0IG9yIG5vdC4KKyAqCisgKiAgLSBuZXR3b3JrIHByb3RvY29scyBoYXZlIHRoZWlyIG93biBkcm9wLXJlY292ZXJ5IG1lY2hhbmlzbXMKKyAqCisgKiAgLSB0aGVyZSBpcyBub3QgbXVjaCBlbHNlIHdlIGNhbiBkbworICoKKyAqIElmIHRoZSBkZXZpY2UgaXMgaWRsZSwgd2UgbmVlZCB0byB3YWtlIGl0IHVwOyB0aGF0IGlzIGFuIG9wZXJhdGlvbgorICogdGhhdCB3aWxsIHNsZWVwLiBTZWUgaTI0MDBtX25ldF93YWtlX3R4KCkgZm9yIGRldGFpbHMuCisgKi8KK3N0YXRpYworaW50IGkyNDAwbV9oYXJkX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCSAgIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2KQoreworCWludCByZXN1bHQ7CisJc3RydWN0IGkyNDAwbSAqaTI0MDBtID0gbmV0X2Rldl90b19pMjQwMG0obmV0X2Rldik7CisJc3RydWN0IGRldmljZSAqZGV2ID0gaTI0MDBtX2RldihpMjQwMG0pOworCisJZF9mbnN0YXJ0KDMsIGRldiwgIihza2IgJXAgbmV0X2RldiAlcClcbiIsIHNrYiwgbmV0X2Rldik7CisJaWYgKGkyNDAwbS0+c3RhdGUgPT0gSTI0MDBNX1NTX0lETEUpCisJCXJlc3VsdCA9IGkyNDAwbV9uZXRfd2FrZV90eChpMjQwMG0sIG5ldF9kZXYsIHNrYik7CisJZWxzZQorCQlyZXN1bHQgPSBpMjQwMG1fbmV0X3R4KGkyNDAwbSwgbmV0X2Rldiwgc2tiKTsKKwlpZiAocmVzdWx0IDwgIDApCisJCW5ldF9kZXYtPnN0YXRzLnR4X2Ryb3BwZWQrKzsKKwllbHNlIHsKKwkJbmV0X2Rldi0+c3RhdHMudHhfcGFja2V0cysrOworCQluZXRfZGV2LT5zdGF0cy50eF9ieXRlcyArPSBza2ItPmxlbjsKKwl9CisJa2ZyZWVfc2tiKHNrYik7CisJcmVzdWx0ID0gTkVUREVWX1RYX09LOworCWRfZm5lbmQoMywgZGV2LCAiKHNrYiAlcCBuZXRfZGV2ICVwKSA9ICVkXG4iLCBza2IsIG5ldF9kZXYsIHJlc3VsdCk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworCitzdGF0aWMKK2ludCBpMjQwMG1fY2hhbmdlX210dShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldiwgaW50IG5ld19tdHUpCit7CisJaW50IHJlc3VsdDsKKwlzdHJ1Y3QgaTI0MDBtICppMjQwMG0gPSBuZXRfZGV2X3RvX2kyNDAwbShuZXRfZGV2KTsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBpMjQwMG1fZGV2KGkyNDAwbSk7CisKKwlpZiAobmV3X210dSA+PSBJMjQwME1fTUFYX01UVSkgeworCQlkZXZfZXJyKGRldiwgIkNhbm5vdCBjaGFuZ2UgTVRVIHRvICVkIChtYXggaXMgJWQpXG4iLAorCQkJbmV3X210dSwgSTI0MDBNX01BWF9NVFUpOworCQlyZXN1bHQgPSAtRUlOVkFMOworCX0gZWxzZSB7CisJCW5ldF9kZXYtPm10dSA9IG5ld19tdHU7CisJCXJlc3VsdCA9IDA7CisJfQorCXJldHVybiByZXN1bHQ7Cit9CisKKworc3RhdGljCit2b2lkIGkyNDAwbV90eF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2KQoreworCS8qCisJICogV2UgbWlnaHQgd2FudCB0byBraWNrIHRoZSBkZXZpY2UKKwkgKgorCSAqIFRoZXJlIGlzIG5vdCBtdWNoIHdlIGNhbiBkbyB0aG91Z2gsIGFzIHRoZSBkZXZpY2UgcmVxdWlyZXMKKwkgKiB0aGF0IHdlIHNlbmQgdGhlIGRhdGEgYWdncmVnYXRlZC4gQnkgdGhlIHRpbWUgd2UgcmVjZWl2ZQorCSAqIHRoaXMsIHRoZXJlIG1pZ2h0IGJlIGRhdGEgcGVuZGluZyB0byBiZSBzZW50IG9yIG5vdC4uLgorCSAqLworCW5ldF9kZXYtPnN0YXRzLnR4X2Vycm9ycysrOworCXJldHVybjsKK30KKworCisvKgorICogQ3JlYXRlIGEgZmFrZSBldGhlcm5ldCBoZWFkZXIKKyAqCisgKiBGb3IgZW11bGF0aW5nIGFuIGV0aGVybmV0IGRldmljZSwgZXZlcnkgcmVjZWl2ZWQgSVAgaGVhZGVyIGhhcyB0bworICogYmUgcHJlZml4ZWQgd2l0aCBhbiBldGhlcm5ldCBoZWFkZXIuCisgKgorICogV2hhdCB3ZSByZWNlaXZlIGhhcyAocG90ZW50aWFsbHkpIG1hbnkgSVAgcGFja2V0cyBjb25jYXRlbmF0ZWQgd2l0aAorICogbm8gRVRIX0hMRU4gYnl0ZXMgcHJlZml4ZWQuIFRodXMgdGhlcmUgaXMgbm8gc3BhY2UgZm9yIGFuIGV0aAorICogaGVhZGVyLgorICoKKyAqIFdlIHdvdWxkIGhhdmUgdG8gcmVhbGxvY2F0ZSBvciBkbyB1Z2x5IGZyYWdtZW50IHRyaWNrcyBpbiBvcmRlciB0bworICogYWRkIGl0LgorICoKKyAqIEJ1dCB3aGF0IHdlIGRvIGlzIHVzZSB0aGUgaGVhZGVyIHNwYWNlIG9mIHRoZSBSWCB0cmFuc2FjdGlvbgorICogKCptc2dfaGRyKSBhcyB3ZSBkb24ndCBuZWVkIGl0IGFueW1vcmU7IHRoZW4gd2UnbGwgcG9pbnQgYWxsIHRoZQorICogZGF0YSBza2JzIHRoZXJlLCBhcyB0aGV5IHNoYXJlIHRoZSBzYW1lIGJhY2tpbmcgc3RvcmUuCisgKgorICogV2Ugb25seSBzdXBwb3J0IElQdjQgZm9yIHYzIGZpcm13YXJlLgorICovCitzdGF0aWMKK3ZvaWQgaTI0MDBtX3J4X2Zha2VfZXRoX2hlYWRlcihzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldiwKKwkJCSAgICAgICB2b2lkICpfZXRoX2hkcikKK3sKKwlzdHJ1Y3QgZXRoaGRyICpldGhfaGRyID0gX2V0aF9oZHI7CisKKwltZW1jcHkoZXRoX2hkci0+aF9kZXN0LCBuZXRfZGV2LT5kZXZfYWRkciwgc2l6ZW9mKGV0aF9oZHItPmhfZGVzdCkpOworCW1lbXNldChldGhfaGRyLT5oX3NvdXJjZSwgMCwgc2l6ZW9mKGV0aF9oZHItPmhfZGVzdCkpOworCWV0aF9oZHItPmhfcHJvdG8gPSBfX2NvbnN0YW50X2NwdV90b19iZTE2KEVUSF9QX0lQKTsKK30KKworCisvKgorICogaTI0MDBtX25ldF9yeCAtIHBhc3MgYSBuZXR3b3JrIHBhY2tldCB0byB0aGUgc3RhY2sKKyAqCisgKiBAaTI0MDBtOiBkZXZpY2UgaW5zdGFuY2UKKyAqIEBza2Jfcng6IHRoZSBza2Igd2hlcmUgdGhlIGJ1ZmZlciBwb2ludGVkIHRvIGJ5IEBidWYgaXMKKyAqIEBpOiAxIGlmIHBheWxvYWQgaXMgdGhlIG9ubHkgb25lCisgKiBAYnVmOiBwb2ludGVyIHRvIHRoZSBidWZmZXIgY29udGFpbmluZyB0aGUgZGF0YQorICogQGxlbjogYnVmZmVyJ3MgbGVuZ3RoCisgKgorICogV2UganVzdCBjbG9uZSB0aGUgc2tiIGFuZCBzZXQgaXQgdXAgc28gdGhhdCBpdCdzIHNrYi0+ZGF0YSBwb2ludGVyCisgKiBwb2ludHMgdG8gImJ1ZiIgYW5kIGl0J3MgbGVuZ3RoLgorICoKKyAqIE5vdGUgdGhhdCBpZiB0aGUgcGF5bG9hZCBpcyB0aGUgbGFzdCAob3IgdGhlIG9ubHkgb25lKSBpbiBhCisgKiBtdWx0aS1wYXlsb2FkIG1lc3NhZ2UsIHdlIGRvbid0IGNsb25lIHRoZSBTS0IgYnV0IGp1c3QgcmV1c2UgaXQuCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBub3JtYWxseSBydW4gZnJvbSBhIHRocmVhZCBjb250ZXh0LiBIb3dldmVyLCB3ZQorICogc3RpbGwgdXNlIG5ldGlmX3J4KCkgaW5zdGVhZCBvZiBuZXRpZl9yZWNlaXZlX3NrYigpIGFzIHdhcworICogcmVjb21tZW5kZWQgaW4gdGhlIG1haWxpbmcgbGlzdC4gUmVhc29uIGlzIGluIHNvbWUgc3RyZXNzIHRlc3RzCisgKiB3aGVuIHNlbmRpbmcvcmVjZWl2aW5nIGEgbG90IG9mIGRhdGEgd2Ugc2VlbSB0byBoaXQgYSBzb2Z0bG9jayBpbgorICogdGhlIGtlcm5lbCdzIFRDUCBpbXBsZW1lbnRhdGlvbiBbYXJvdWRuIHRjcF9kZWxheV90aW1lcigpXS4gVXNpbmcKKyAqIG5ldGlmX3J4KCkgdG9vayBjYXJlIG9mIHRoZSBpc3N1ZS4KKyAqCisgKiBUaGlzIGlzLCBvZiBjb3Vyc2UsIHN0aWxsIG9wZW4gdG8gZG8gbW9yZSByZXNlYXJjaCBvbiB3aHkgcnVubmluZworICogd2l0aCBuZXRpZl9yZWNlaXZlX3NrYigpIGhpdHMgdGhpcyBzb2Z0bG9jay4gRklYTUUuCisgKgorICogRklYTUU6IGN1cnJlbnRseSB3ZSBkb24ndCBkbyBhbnkgZWZmb3J0cyBhdCBkaXN0aW5ndWlzaGluZyBpZiB3aGF0CisgKiB3ZSBnb3Qgd2FzIGFuIElQdjQgb3IgSVB2NiBoZWFkZXIsIHRvIHNldHVwIHRoZSBwcm90b2NvbCBmaWVsZAorICogY29ycmVjdGx5LgorICovCit2b2lkIGkyNDAwbV9uZXRfcngoc3RydWN0IGkyNDAwbSAqaTI0MDBtLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiX3J4LAorCQkgICB1bnNpZ25lZCBpLCBjb25zdCB2b2lkICpidWYsIGludCBidWZfbGVuKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2ID0gaTI0MDBtLT53aW1heF9kZXYubmV0X2RldjsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBpMjQwMG1fZGV2KGkyNDAwbSk7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCWRfZm5zdGFydCgyLCBkZXYsICIoaTI0MDBtICVwIGJ1ZiAlcCBidWZfbGVuICVkKVxuIiwKKwkJICBpMjQwMG0sIGJ1ZiwgYnVmX2xlbik7CisJaWYgKGkpIHsKKwkJc2tiID0gc2tiX2dldChza2JfcngpOworCQlkX3ByaW50ZigyLCBkZXYsICJSWDogcmV1c2luZyBmaXJzdCBwYXlsb2FkIHNrYiAlcFxuIiwgc2tiKTsKKwkJc2tiX3B1bGwoc2tiLCBidWYgLSAodm9pZCAqKSBza2ItPmRhdGEpOworCQlza2JfdHJpbShza2IsICh2b2lkICopIHNrYl9lbmRfcG9pbnRlcihza2IpIC0gYnVmKTsKKwl9IGVsc2UgeworCQkvKiBZZXMsIHRoaXMgaXMgYmFkIC0tIGEgbG90IG9mIG92ZXJoZWFkIC0tIHNlZQorCQkgKiBjb21tZW50cyBhdCB0aGUgdG9wIG9mIHRoZSBmaWxlICovCisJCXNrYiA9IF9fbmV0ZGV2X2FsbG9jX3NrYihuZXRfZGV2LCBidWZfbGVuLCBHRlBfS0VSTkVMKTsKKwkJaWYgKHNrYiA9PSBOVUxMKSB7CisJCQlkZXZfZXJyKGRldiwgIk5FVFJYOiBubyBtZW1vcnkgdG8gcmVhbGxvYyBza2JcbiIpOworCQkJbmV0X2Rldi0+c3RhdHMucnhfZHJvcHBlZCsrOworCQkJZ290byBlcnJvcl9za2JfcmVhbGxvYzsKKwkJfQorCQltZW1jcHkoc2tiX3B1dChza2IsIGJ1Zl9sZW4pLCBidWYsIGJ1Zl9sZW4pOworCX0KKwlpMjQwMG1fcnhfZmFrZV9ldGhfaGVhZGVyKGkyNDAwbS0+d2ltYXhfZGV2Lm5ldF9kZXYsCisJCQkJICBza2ItPmRhdGEgLSBFVEhfSExFTik7CisJc2tiX3NldF9tYWNfaGVhZGVyKHNrYiwgLUVUSF9ITEVOKTsKKwlza2ItPmRldiA9IGkyNDAwbS0+d2ltYXhfZGV2Lm5ldF9kZXY7CisJc2tiLT5wcm90b2NvbCA9IGh0b25zKEVUSF9QX0lQKTsKKwluZXRfZGV2LT5zdGF0cy5yeF9wYWNrZXRzKys7CisJbmV0X2Rldi0+c3RhdHMucnhfYnl0ZXMgKz0gYnVmX2xlbjsKKwlkX3ByaW50ZigzLCBkZXYsICJORVRSWDogcmVjZWl2aW5nICVkIGJ5dGVzIHRvIG5ldHdvcmsgc3RhY2tcbiIsCisJCWJ1Zl9sZW4pOworCWRfZHVtcCg0LCBkZXYsIGJ1ZiwgYnVmX2xlbik7CisJbmV0aWZfcnhfbmkoc2tiKTsJLyogc2VlIG5vdGVzIGluIGZ1bmN0aW9uIGhlYWRlciAqLworZXJyb3Jfc2tiX3JlYWxsb2M6CisJZF9mbmVuZCgyLCBkZXYsICIoaTI0MDBtICVwIGJ1ZiAlcCBidWZfbGVuICVkKSA9IHZvaWRcbiIsCisJCWkyNDAwbSwgYnVmLCBidWZfbGVuKTsKK30KKworCisvKioKKyAqIGkyNDAwbV9uZXRkZXZfc2V0dXAgLSBTZXR1cCBzZXR1cCBAbmV0X2RldidzIGkyNDAwbSBwcml2YXRlIGRhdGEKKyAqCisgKiBDYWxsZWQgYnkgYWxsb2NfbmV0ZGV2KCkKKyAqLwordm9pZCBpMjQwMG1fbmV0ZGV2X3NldHVwKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2KQoreworCWRfZm5zdGFydCgzLCBOVUxMLCAiKG5ldF9kZXYgJXApXG4iLCBuZXRfZGV2KTsKKwlldGhlcl9zZXR1cChuZXRfZGV2KTsKKwluZXRfZGV2LT5tdHUgPSBJMjQwME1fTUFYX01UVTsKKwluZXRfZGV2LT50eF9xdWV1ZV9sZW4gPSBJMjQwME1fVFhfUUxFTjsKKwluZXRfZGV2LT5mZWF0dXJlcyA9CisJCSAgTkVUSUZfRl9WTEFOX0NIQUxMRU5HRUQKKwkJfCBORVRJRl9GX0hJR0hETUE7CisJbmV0X2Rldi0+ZmxhZ3MgPQorCQlJRkZfTk9BUlAJCS8qIGkyNDAwbSBpcyBhcHVyZSBJUCBkZXZpY2UgKi8KKwkJJiAofklGRl9CUk9BRENBU1QJLyogaTI0MDBtIGlzIFAyUCAqLworCQkgICAmIH5JRkZfTVVMVElDQVNUKTsKKwluZXRfZGV2LT53YXRjaGRvZ190aW1lbyA9IEkyNDAwTV9UWF9USU1FT1VUOworCW5ldF9kZXYtPm9wZW4gPSBpMjQwMG1fb3BlbjsKKwluZXRfZGV2LT5zdG9wID0gaTI0MDBtX3N0b3A7CisJbmV0X2Rldi0+aGFyZF9zdGFydF94bWl0ID0gaTI0MDBtX2hhcmRfc3RhcnRfeG1pdDsKKwluZXRfZGV2LT5jaGFuZ2VfbXR1ID0gaTI0MDBtX2NoYW5nZV9tdHU7CisJbmV0X2Rldi0+dHhfdGltZW91dCA9IGkyNDAwbV90eF90aW1lb3V0OworCWRfZm5lbmQoMywgTlVMTCwgIihuZXRfZGV2ICVwKSA9IHZvaWRcbiIsIG5ldF9kZXYpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoaTI0MDBtX25ldGRldl9zZXR1cCk7CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpbWF4L2kyNDAwbS9vcC1yZmtpbGwuYyBiL2RyaXZlcnMvbmV0L3dpbWF4L2kyNDAwbS9vcC1yZmtpbGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODdlYzU4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2ltYXgvaTI0MDBtL29wLXJma2lsbC5jCkBAIC0wLDAgKzEsMjA3IEBACisvKgorICogSW50ZWwgV2lyZWxlc3MgV2lNQVggQ29ubmVjdGlvbiAyNDAwbQorICogSW1wbGVtZW50IGJhY2tlbmQgZm9yIHRoZSBXaU1BWCBzdGFjayByZmtpbGwgc3VwcG9ydAorICoKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBJbnRlbCBDb3Jwb3JhdGlvbiA8bGludXgtd2ltYXhAaW50ZWwuY29tPgorICogSW5ha3kgUGVyZXotR29uemFsZXogPGluYWt5LnBlcmV6LWdvbnphbGV6QGludGVsLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxLCBVU0EuCisgKgorICoKKyAqIFRoZSBXaU1BWCBrZXJuZWwgc3RhY2sgaW50ZWdyYXRlcyBpbnRvIFJGLUtpbGwgYW5kIGtlZXBzIHRoZQorICogc3dpdGNoZXMncyBzdGF0dXMuIFdlIGp1c3QgbmVlZCB0bzoKKyAqCisgKiAtIHJlcG9ydCBjaGFuZ2VzIGluIHRoZSBIVyBSRiBLaWxsIHN3aXRjaCBbd2l0aAorICogICB3aW1heF9yZmtpbGxfe3N3LGh3fV9yZXBvcnQoKSwgd2hpY2ggaGFwcGVucyB3aGVuIHdlIGRldGVjdCB0aG9zZQorICogICBpbmRpY2F0aW9ucyBjb21pbmcgdGhyb3VnaCBoYXJkd2FyZSByZXBvcnRzXS4gV2UgYWxzbyBkbyBpdCBvbgorICogICBpbml0aWFsaXphdGlvbiB0byBsZXQgdGhlIHN0YWNrIGtub3cgdGhlIGludGlhbCBIVyBzdGF0ZS4KKyAqCisgKiAtIGltcGxlbWVudCBpbmRpY2F0aW9ucyBmcm9tIHRoZSBzdGFjayB0byBjaGFuZ2UgdGhlIFNXIFJGIEtpbGwKKyAqICAgc3dpdGNoIChjb21pbmcgZnJvbSBzeXNmcywgdGhlIHdpbWF4IHN0YWNrIG9yIHVzZXIgc3BhY2UpLgorICovCisjaW5jbHVkZSAiaTI0MDBtLmgiCisjaW5jbHVkZSA8bGludXgvd2ltYXgvaTI0MDBtLmg+CisKKworCisjZGVmaW5lIERfU1VCTU9EVUxFIHJma2lsbAorI2luY2x1ZGUgImRlYnVnLWxldmVscy5oIgorCisvKgorICogUmV0dXJuIHRydWUgaWYgdGhlIGkyNDAwbSByYWRpbyBpcyBpbiB0aGUgcmVxdWVzdGVkIHdpbWF4X3JmX3N0YXRlIHN0YXRlCisgKgorICovCitzdGF0aWMKK2ludCBpMjQwMG1fcmFkaW9faXMoc3RydWN0IGkyNDAwbSAqaTI0MDBtLCBlbnVtIHdpbWF4X3JmX3N0YXRlIHN0YXRlKQoreworCWlmIChzdGF0ZSA9PSBXSU1BWF9SRl9PRkYpCisJCXJldHVybiBpMjQwMG0tPnN0YXRlID09IEkyNDAwTV9TU19SRl9PRkYKKwkJCXx8IGkyNDAwbS0+c3RhdGUgPT0gSTI0MDBNX1NTX1JGX1NIVVRET1dOOworCWVsc2UgaWYgKHN0YXRlID09IFdJTUFYX1JGX09OKQorCQkvKiBzdGF0ZSA9PSBXSU1BWF9SRl9PTiAqLworCQlyZXR1cm4gaTI0MDBtLT5zdGF0ZSAhPSBJMjQwME1fU1NfUkZfT0ZGCisJCQkmJiBpMjQwMG0tPnN0YXRlICE9IEkyNDAwTV9TU19SRl9TSFVURE9XTjsKKwllbHNlCisJCUJVRygpOworfQorCisKKy8qCisgKiBXaU1BWCBzdGFjayBvcGVyYXRpb246IGltcGxlbWVudCBTVyBSRktpbGwgdG9nZ2xpbmcKKyAqCisgKiBAd2ltYXhfZGV2OiBkZXZpY2UgZGVzY3JpcHRvcgorICogQHNrYjogc2tiIHdoZXJlIHRoZSBtZXNzYWdlIGhhcyBiZWVuIHJlY2VpdmVkOyBza2ItPmRhdGEgaXMKKyAqICAgICAgIGV4cGVjdGVkIHRvIHBvaW50IHRvIHRoZSBtZXNzYWdlIHBheWxvYWQuCisgKiBAZ2VubF9pbmZvOiBwYXNzZWQgYnkgdGhlIGdlbmVyaWMgbmV0bGluayBsYXllcgorICoKKyAqIEdlbmVyaWMgTmV0bGluayB3aWxsIGNhbGwgdGhpcyBmdW5jdGlvbiB3aGVuIGEgbWVzc2FnZSBpcyBzZW50IGZyb20KKyAqIHVzZXJzcGFjZSB0byBjaGFuZ2UgdGhlIHNvZnR3YXJlIFJGLUtpbGwgc3dpdGNoIHN0YXR1cy4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgc2V0IHRoZSBkZXZpY2UncyBzb2Z3YXJlIFJGLUtpbGwgc3dpdGNoIHN0YXRlIHRvCisgKiBtYXRjaCB3aGF0IGlzIHJlcXVlc3RlZC4KKyAqCisgKiBOT1RFOiB0aGUgaTI0MDBtIGhhcyBhIHN0cmljdCBzdGF0ZSBtYWNoaW5lOyB3ZSBjYW4gb25seSBzZXQgdGhlCisgKiAgICAgICBSRi1LaWxsIHN3aXRjaCB3aGVuIGl0IGlzIG9uLCB0aGUgSFcgUkYtS2lsbCBpcyBvbiBhbmQgdGhlCisgKiAgICAgICBkZXZpY2UgaXMgaW5pdGlhbGl6ZWQuIFNvIHdlIGlnbm9yZSBlcnJvcnMgc3RlYW1pbmcgZnJvbSBub3QKKyAqICAgICAgIGJlaW5nIGluIHRoZSByaWdodCBzdGF0ZSAoLUVJTFNFUSkuCisgKi8KK2ludCBpMjQwMG1fb3BfcmZraWxsX3N3X3RvZ2dsZShzdHJ1Y3Qgd2ltYXhfZGV2ICp3aW1heF9kZXYsCisJCQkgICAgICAgZW51bSB3aW1heF9yZl9zdGF0ZSBzdGF0ZSkKK3sKKwlpbnQgcmVzdWx0OworCXN0cnVjdCBpMjQwMG0gKmkyNDAwbSA9IHdpbWF4X2Rldl90b19pMjQwMG0od2ltYXhfZGV2KTsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBpMjQwMG1fZGV2KGkyNDAwbSk7CisJc3RydWN0IHNrX2J1ZmYgKmFja19za2I7CisJc3RydWN0IHsKKwkJc3RydWN0IGkyNDAwbV9sM2w0X2hkciBoZHI7CisJCXN0cnVjdCBpMjQwMG1fdGx2X3JmX29wZXJhdGlvbiBzd19yZjsKKwl9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpICpjbWQ7CisJY2hhciBzdHJlcnJbMzJdOworCisJZF9mbnN0YXJ0KDQsIGRldiwgIih3aW1heF9kZXYgJXAgc3RhdGUgJWQpXG4iLCB3aW1heF9kZXYsIHN0YXRlKTsKKworCXJlc3VsdCA9IC1FTk9NRU07CisJY21kID0ga3phbGxvYyhzaXplb2YoKmNtZCksIEdGUF9LRVJORUwpOworCWlmIChjbWQgPT0gTlVMTCkKKwkJZ290byBlcnJvcl9hbGxvYzsKKwljbWQtPmhkci50eXBlID0gY3B1X3RvX2xlMTYoSTI0MDBNX01UX0NNRF9SRl9DT05UUk9MKTsKKwljbWQtPmhkci5sZW5ndGggPSBzaXplb2YoY21kLT5zd19yZik7CisJY21kLT5oZHIudmVyc2lvbiA9IGNwdV90b19sZTE2KEkyNDAwTV9MM0w0X1ZFUlNJT04pOworCWNtZC0+c3dfcmYuaGRyLnR5cGUgPSBjcHVfdG9fbGUxNihJMjQwME1fVExWX1JGX09QRVJBVElPTik7CisJY21kLT5zd19yZi5oZHIubGVuZ3RoID0gY3B1X3RvX2xlMTYoc2l6ZW9mKGNtZC0+c3dfcmYuc3RhdHVzKSk7CisJc3dpdGNoIChzdGF0ZSkgeworCWNhc2UgV0lNQVhfUkZfT0ZGOgkvKiBSRktJTEwgT04sIHJhZGlvIE9GRiAqLworCQljbWQtPnN3X3JmLnN0YXR1cyA9IGNwdV90b19sZTMyKDIpOworCQlicmVhazsKKwljYXNlIFdJTUFYX1JGX09OOgkvKiBSRktJTEwgT0ZGLCByYWRpbyBPTiAqLworCQljbWQtPnN3X3JmLnN0YXR1cyA9IGNwdV90b19sZTMyKDEpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlCVUcoKTsKKwl9CisKKwlhY2tfc2tiID0gaTI0MDBtX21zZ190b19kZXYoaTI0MDBtLCBjbWQsIHNpemVvZigqY21kKSk7CisJcmVzdWx0ID0gUFRSX0VSUihhY2tfc2tiKTsKKwlpZiAoSVNfRVJSKGFja19za2IpKSB7CisJCWRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIGlzc3VlICdSRiBDb250cm9sJyBjb21tYW5kOiAlZFxuIiwKKwkJCXJlc3VsdCk7CisJCWdvdG8gZXJyb3JfbXNnX3RvX2RldjsKKwl9CisJcmVzdWx0ID0gaTI0MDBtX21zZ19jaGVja19zdGF0dXMod2ltYXhfbXNnX2RhdGEoYWNrX3NrYiksCisJCQkJCSBzdHJlcnIsIHNpemVvZihzdHJlcnIpKTsKKwlpZiAocmVzdWx0IDwgMCkgeworCQlkZXZfZXJyKGRldiwgIidSRiBDb250cm9sJyAoMHglMDR4KSBjb21tYW5kIGZhaWxlZDogJWQgLSAlc1xuIiwKKwkJCUkyNDAwTV9NVF9DTURfUkZfQ09OVFJPTCwgcmVzdWx0LCBzdHJlcnIpOworCQlnb3RvIGVycm9yX2NtZDsKKwl9CisKKwkvKiBOb3cgd2Ugd2FpdCBmb3IgdGhlIHN0YXRlIHRvIGNoYW5nZSB0byBSQURJT19PRkYgb3IgUkFESU9fT04gKi8KKwlyZXN1bHQgPSB3YWl0X2V2ZW50X3RpbWVvdXQoCisJCWkyNDAwbS0+c3RhdGVfd3EsIGkyNDAwbV9yYWRpb19pcyhpMjQwMG0sIHN0YXRlKSwKKwkJNSAqIEhaKTsKKwlpZiAocmVzdWx0ID09IDApCisJCXJlc3VsdCA9IC1FVElNRURPVVQ7CisJaWYgKHJlc3VsdCA8IDApCisJCWRldl9lcnIoZGV2LCAiRXJyb3Igd2FpdGluZyBmb3IgZGV2aWNlIHRvIHRvZ2dsZSBSRiBzdGF0ZTogIgorCQkJIiVkXG4iLCByZXN1bHQpOworCXJlc3VsdCA9IDA7CitlcnJvcl9jbWQ6CisJa2ZyZWVfc2tiKGFja19za2IpOworZXJyb3JfbXNnX3RvX2RldjoKK2Vycm9yX2FsbG9jOgorCWRfZm5lbmQoNCwgZGV2LCAiKHdpbWF4X2RldiAlcCBzdGF0ZSAlZCkgPSAlZFxuIiwKKwkJd2ltYXhfZGV2LCBzdGF0ZSwgcmVzdWx0KTsKKwlyZXR1cm4gcmVzdWx0OworfQorCisKKy8qCisgKiBJbmZvcm0gdGhlIFdpTUFYIHN0YWNrIG9mIGNoYW5nZXMgaW4gdGhlIFJGIEtpbGwgc3dpdGNoZXMgcmVwb3J0ZWQKKyAqIGJ5IHRoZSBkZXZpY2UKKyAqCisgKiBAaTI0MDBtOiBkZXZpY2UgZGVzY3JpcHRvcgorICogQHJmc3M6IFRMViBmb3IgUkYgU3dpdGNoZXMgc3RhdHVzOyBhbHJlYWR5IHZhbGlkYXRlZAorICoKKyAqIE5PVEU6IHRoZSByZXBvcnRzIG9uIFJGIHN3aXRjaCBzdGF0dXMgY2Fubm90IGJlIHRydXN0ZWQKKyAqICAgICAgIG9yIHVzZWQgdW50aWwgdGhlIGRldmljZSBpcyBpbiBhIHN0YXRlIG9mIFJBRElPX09GRgorICogICAgICAgb3IgZ3JlYXRlci4KKyAqLwordm9pZCBpMjQwMG1fcmVwb3J0X3Rsdl9yZl9zd2l0Y2hlc19zdGF0dXMoCisJc3RydWN0IGkyNDAwbSAqaTI0MDBtLAorCWNvbnN0IHN0cnVjdCBpMjQwMG1fdGx2X3JmX3N3aXRjaGVzX3N0YXR1cyAqcmZzcykKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBpMjQwMG1fZGV2KGkyNDAwbSk7CisJZW51bSBpMjQwMG1fcmZfc3dpdGNoX3N0YXR1cyBodywgc3c7CisJZW51bSB3aW1heF9zdCB3aW1heF9zdGF0ZTsKKworCXN3ID0gbGUzMl90b19jcHUocmZzcy0+c3dfcmZfc3dpdGNoKTsKKwlodyA9IGxlMzJfdG9fY3B1KHJmc3MtPmh3X3JmX3N3aXRjaCk7CisKKwlkX2Zuc3RhcnQoMywgZGV2LCAiKGkyNDAwbSAlcCByZnNzICVwIFtodyAldSBzdyAldV0pXG4iLAorCQkgIGkyNDAwbSwgcmZzcywgaHcsIHN3KTsKKwkvKiBXZSBvbmx5IHByb2Nlc3Mgcncgc3dpdGNoIGV2ZW5zIHdoZW4gdGhlIGRldmljZSBoYXMgYmVlbgorCSAqIGZ1bGx5IGluaXRpYWxpemVkICovCisJd2ltYXhfc3RhdGUgPSB3aW1heF9zdGF0ZV9nZXQoJmkyNDAwbS0+d2ltYXhfZGV2KTsKKwlpZiAod2ltYXhfc3RhdGUgPCBXSU1BWF9TVF9SQURJT19PRkYpIHsKKwkJZF9wcmludGYoMywgZGV2LCAiaWdub3JpbmcgUkYgc3dpdGNoZXMgcmVwb3J0LCBzdGF0ZSAldVxuIiwKKwkJCSB3aW1heF9zdGF0ZSk7CisJCWdvdG8gb3V0OworCX0KKwlzd2l0Y2ggKHN3KSB7CisJY2FzZSBJMjQwME1fUkZfU1dJVENIX09OOgkvKiBSRiBLaWxsIGRpc2FibGVkIChyYWRpbyBvbikgKi8KKwkJd2ltYXhfcmVwb3J0X3Jma2lsbF9zdygmaTI0MDBtLT53aW1heF9kZXYsIFdJTUFYX1JGX09OKTsKKwkJYnJlYWs7CisJY2FzZSBJMjQwME1fUkZfU1dJVENIX09GRjoJLyogUkYgS2lsbCBlbmFibGVkIChyYWRpbyBvZmYpICovCisJCXdpbWF4X3JlcG9ydF9yZmtpbGxfc3coJmkyNDAwbS0+d2ltYXhfZGV2LCBXSU1BWF9SRl9PRkYpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfZXJyKGRldiwgIkhXIEJVRz8gVW5rbm93biBSRiBTVyBzdGF0ZSAweCV4XG4iLCBzdyk7CisJfQorCisJc3dpdGNoIChodykgeworCWNhc2UgSTI0MDBNX1JGX1NXSVRDSF9PTjoJLyogUkYgS2lsbCBkaXNhYmxlZCAocmFkaW8gb24pICovCisJCXdpbWF4X3JlcG9ydF9yZmtpbGxfaHcoJmkyNDAwbS0+d2ltYXhfZGV2LCBXSU1BWF9SRl9PTik7CisJCWJyZWFrOworCWNhc2UgSTI0MDBNX1JGX1NXSVRDSF9PRkY6CS8qIFJGIEtpbGwgZW5hYmxlZCAocmFkaW8gb2ZmKSAqLworCQl3aW1heF9yZXBvcnRfcmZraWxsX2h3KCZpMjQwMG0tPndpbWF4X2RldiwgV0lNQVhfUkZfT0ZGKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGV2X2VycihkZXYsICJIVyBCVUc/IFVua25vd24gUkYgSFcgc3RhdGUgMHgleFxuIiwgaHcpOworCX0KK291dDoKKwlkX2ZuZW5kKDMsIGRldiwgIihpMjQwMG0gJXAgcmZzcyAlcCBbaHcgJXUgc3cgJXVdKSA9IHZvaWRcbiIsCisJCWkyNDAwbSwgcmZzcywgaHcsIHN3KTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpbWF4L2kyNDAwbS9yeC5jIGIvZHJpdmVycy9uZXQvd2ltYXgvaTI0MDBtL3J4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjkyMjAyMjcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aW1heC9pMjQwMG0vcnguYwpAQCAtMCwwICsxLDUzNCBAQAorLyoKKyAqIEludGVsIFdpcmVsZXNzIFdpTUFYIENvbm5lY3Rpb24gMjQwMG0KKyAqIEhhbmRsZSBpbmNvbWluZyB0cmFmZmljIGFuZCBkZWxpdmVyIGl0IHRvIHRoZSBjb250cm9sIG9yIGRhdGEgcGxhbmVzCisgKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgICBkaXN0cmlidXRpb24uCisgKiAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqCisgKiBJbnRlbCBDb3Jwb3JhdGlvbiA8bGludXgtd2ltYXhAaW50ZWwuY29tPgorICogWWFuaXIgTHViZXRraW4gPHlhbmlyeC5sdWJldGtpbkBpbnRlbC5jb20+CisgKiAgLSBJbml0aWFsIGltcGxlbWVudGF0aW9uCisgKiBJbmFreSBQZXJlei1Hb256YWxleiA8aW5ha3kucGVyZXotZ29uemFsZXpAaW50ZWwuY29tPgorICogIC0gVXNlIHNrYl9jbG9uZSgpLCBicmVhayB1cCBwcm9jZXNzaW5nIGluIGNodW5rcworICogIC0gU3BsaXQgdHJhbnNwb3J0L2RldmljZSBzcGVjaWZpYworICogIC0gTWFrZSBidWZmZXIgc2l6ZSBkeW5hbWljIHRvIGV4ZXJ0IGxlc3MgbWVtb3J5IHByZXNzdXJlCisgKgorICoKKyAqIFRoaXMgaGFuZGxlcyB0aGUgUlggcGF0aC4KKyAqCisgKiBXZSByZWNlaXZlIGFuIFJYIG1lc3NhZ2UgZnJvbSB0aGUgYnVzLXNwZWNpZmljIGRyaXZlciwgd2hpY2gKKyAqIGNvbnRhaW5zIG9uZSBvciBtb3JlIHBheWxvYWRzIHRoYXQgaGF2ZSBwb3RlbnRpYWxseSBkaWZmZXJlbnQKKyAqIGRlc3RpbmF0YXJpZXMgKGRhdGEgb3IgY29udHJvbCBwYXRocykuCisgKgorICogU28gd2UganVzdCB0YWtlIHRoYXQgcGF5bG9hZCBmcm9tIHRoZSB0cmFuc3BvcnQgc3BlY2lmaWMgY29kZSBpbgorICogdGhlIGZvcm0gb2YgYW4gc2tiLCBicmVhayBpdCB1cCBpbiBjaHVua3MgKGEgY2xvbmVkIHNrYiBlYWNoIGluIHRoZQorICogY2FzZSBvZiBuZXR3b3JrIHBhY2tldHMpIGFuZCBwYXNzIGl0IHRvIG5ldGRldiBvciB0byB0aGUKKyAqIGNvbW1hbmQvYWNrIGhhbmRsZXIgKGFuZCBmcm9tIHRoZXJlIHRvIHRoZSBXaU1BWCBzdGFjaykuCisgKgorICogUFJPVE9DT0wgRk9STUFUCisgKgorICogVGhlIGZvcm1hdCBvZiB0aGUgYnVmZmVyIGlzOgorICoKKyAqIEhFQURFUiAgICAgICAgICAgICAgICAgICAgICAoc3RydWN0IGkyNDAwbV9tc2dfaGRyKQorICogUEFZTE9BRCBERVNDUklQVE9SIDAgICAgICAgIChzdHJ1Y3QgaTI0MDBtX3BsZCkKKyAqIFBBWUxPQUQgREVTQ1JJUFRPUiAxCisgKiAuLi4KKyAqIFBBWUxPQUQgREVTQ1JJUFRPUiBOCisgKiBQQVlMT0FEIDAgICAgICAgICAgICAgICAgICAgKHJhdyBieXRlcykKKyAqIFBBWUxPQUQgMQorICogLi4uCisgKiBQQVlMT0FEIE4KKyAqCisgKiBTZWUgdHguYyBmb3IgYSBkZWVwZXIgZGVzY3JpcHRpb24gb24gYWxpZ25tZW50IHJlcXVpcmVtZW50cyBhbmQKKyAqIG90aGVyIGZ1biBmYWN0cyBvZiBpdC4KKyAqCisgKiBST0FETUFQCisgKgorICogaTI0MDBtX3J4CisgKiAgIGkyNDAwbV9yeF9tc2dfaGRyX2NoZWNrCisgKiAgIGkyNDAwbV9yeF9wbF9kZXNjcl9jaGVjaworICogICBpMjQwMG1fcnhfcGF5bG9hZAorICogICAgIGkyNDAwbV9uZXRfcngKKyAqICAgICBpMjQwMG1fcnhfY3RsCisgKiAgICAgICBpMjQwMG1fbXNnX3NpemVfY2hlY2sKKyAqICAgICAgIGkyNDAwbV9yZXBvcnRfaG9va193b3JrICAgIFtpbiBhIHdvcmtxdWV1ZV0KKyAqICAgICAgICAgaTI0MDBtX3JlcG9ydF9ob29rCisgKiAgICAgICB3aW1heF9tc2dfdG9fdXNlcgorICogICAgICAgaTI0MDBtX3J4X2N0bF9hY2sKKyAqICAgICAgICAgd2ltYXhfbXNnX3RvX3VzZXJfYWxsb2MKKyAqICAgICBpMjQwMG1fcnhfdHJhY2UKKyAqICAgICAgIGkyNDAwbV9tc2dfc2l6ZV9jaGVjaworICogICAgICAgd2ltYXhfbXNnCisgKi8KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlICJpMjQwMG0uaCIKKworCisjZGVmaW5lIERfU1VCTU9EVUxFIHJ4CisjaW5jbHVkZSAiZGVidWctbGV2ZWxzLmgiCisKK3N0cnVjdCBpMjQwMG1fcmVwb3J0X2hvb2tfYXJncyB7CisJc3RydWN0IHNrX2J1ZmYgKnNrYl9yeDsKKwljb25zdCBzdHJ1Y3QgaTI0MDBtX2wzbDRfaGRyICpsM2w0X2hkcjsKKwlzaXplX3Qgc2l6ZTsKK307CisKKworLyoKKyAqIEV4ZWN1dGUgaTI0MDBtX3JlcG9ydF9ob29rIGluIGEgd29ya3F1ZXVlCisgKgorICogVW5wYWNrcyBhcmd1bWVudHMgZnJvbSB0aGUgZGVmZXJyZWQgY2FsbCwgZXhlY3V0ZXMgaXQgYW5kIHRoZW4KKyAqIGRyb3BzIHRoZSByZWZlcmVuY2VzLgorICoKKyAqIE9idmlvdXMgTk9URTogUmVmZXJlbmNlcyBhcmUgbmVlZGVkIGJlY2F1c2Ugd2UgYXJlIGEgc2VwYXJhdGUKKyAqICAgICB0aHJlYWQ7IG90aGVyd2lzZSB0aGUgYnVmZmVyIGNoYW5nZXMgdW5kZXIgdXMgYmVjYXVzZSBpdCBpcworICogICAgIHJlbGVhc2VkIGJ5IHRoZSBvcmlnaW5hbCBjYWxsZXIuCisgKi8KK3N0YXRpYwordm9pZCBpMjQwMG1fcmVwb3J0X2hvb2tfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndzKQoreworCXN0cnVjdCBpMjQwMG1fd29yayAqaXcgPQorCQljb250YWluZXJfb2Yod3MsIHN0cnVjdCBpMjQwMG1fd29yaywgd3MpOworCXN0cnVjdCBpMjQwMG1fcmVwb3J0X2hvb2tfYXJncyAqYXJncyA9ICh2b2lkICopIGl3LT5wbDsKKwlpMjQwMG1fcmVwb3J0X2hvb2soaXctPmkyNDAwbSwgYXJncy0+bDNsNF9oZHIsIGFyZ3MtPnNpemUpOworCWtmcmVlX3NrYihhcmdzLT5za2JfcngpOworCWkyNDAwbV9wdXQoaXctPmkyNDAwbSk7CisJa2ZyZWUoaXcpOworfQorCisKKy8qCisgKiBQcm9jZXNzIGFuIGFjayB0byBhIGNvbW1hbmQKKyAqCisgKiBAaTI0MDBtOiBkZXZpY2UgZGVzY3JpcHRvcgorICogQHBheWxvYWQ6IHBvaW50ZXIgdG8gbWVzc2FnZQorICogQHNpemU6IHNpemUgb2YgdGhlIG1lc3NhZ2UKKyAqCisgKiBQYXNzIHRoZSBhY2tub2RsZWRnbWVudCAoaW4gYW4gc2tiKSB0byB0aGUgdGhyZWFkIHRoYXQgaXMgd2FpdGluZworICogZm9yIGl0IGluIGkyNDAwbS0+bXNnX2NvbXBsZXRpb24uCisgKgorICogV2UgbmVlZCB0byBjb29yZGluYXRlIHByb3Blcmx5IHdpdGggdGhlIHRocmVhZCB3YWl0aW5nIGZvciB0aGUKKyAqIGFjay4gQ2hlY2sgaWYgaXQgaXMgd2FpdGluZyBvciBpZiBpdCBpcyBnb25lLiBXZSBsb29zZSB0aGUgc3BpbmxvY2sKKyAqIHRvIGF2b2lkIGFsbG9jYXRpbmcgb24gYXRvbWljIGNvbnRleHRzICh5ZWFoLCBjb3VsZCB1c2UgR0ZQX0FUT01JQywKKyAqIGJ1dCB0aGlzIGlzIG5vdCBzbyBzcGVlZCBjcml0aWNhbCkuCisgKi8KK3N0YXRpYwordm9pZCBpMjQwMG1fcnhfY3RsX2FjayhzdHJ1Y3QgaTI0MDBtICppMjQwMG0sCisJCSAgICAgICBjb25zdCB2b2lkICpwYXlsb2FkLCBzaXplX3Qgc2l6ZSkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBpMjQwMG1fZGV2KGkyNDAwbSk7CisJc3RydWN0IHdpbWF4X2RldiAqd2ltYXhfZGV2ID0gJmkyNDAwbS0+d2ltYXhfZGV2OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IHNrX2J1ZmYgKmFja19za2I7CisKKwkvKiBBbnlvbmUgd2FpdGluZyBmb3IgYW4gYW5zd2VyPyAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZpMjQwMG0tPnJ4X2xvY2ssIGZsYWdzKTsKKwlpZiAoaTI0MDBtLT5hY2tfc2tiICE9IEVSUl9QVFIoLUVJTlBST0dSRVNTKSkgeworCQlkZXZfZXJyKGRldiwgIkh1aD8gcmVwbHkgdG8gY29tbWFuZCB3aXRoIG5vIHdhaXRlcnNcbiIpOworCQlnb3RvIGVycm9yX25vX3dhaXRlcjsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaTI0MDBtLT5yeF9sb2NrLCBmbGFncyk7CisKKwlhY2tfc2tiID0gd2ltYXhfbXNnX2FsbG9jKHdpbWF4X2RldiwgTlVMTCwgcGF5bG9hZCwgc2l6ZSwgR0ZQX0tFUk5FTCk7CisKKwkvKiBDaGVjayB3YWl0ZXIgZGlkbid0IHRpbWUgb3V0IHdhaXRpbmcgZm9yIHRoZSBhbnN3ZXIuLi4gKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmaTI0MDBtLT5yeF9sb2NrLCBmbGFncyk7CisJaWYgKGkyNDAwbS0+YWNrX3NrYiAhPSBFUlJfUFRSKC1FSU5QUk9HUkVTUykpIHsKKwkJZF9wcmludGYoMSwgZGV2LCAiSHVoPyB3YWl0ZXIgZm9yIGNvbW1hbmQgcmVwbHkgY2FuY2VsbGVkXG4iKTsKKwkJZ290byBlcnJvcl93YWl0ZXJfY2FuY2VsbGVkOworCX0KKwlpZiAoYWNrX3NrYiA9PSBOVUxMKSB7CisJCWRldl9lcnIoZGV2LCAiQ01EL0dFVC9TRVQgYWNrOiBjYW5ub3QgYWxsb2NhdGUgU0tCXG4iKTsKKwkJaTI0MDBtLT5hY2tfc2tiID0gRVJSX1BUUigtRU5PTUVNKTsKKwl9IGVsc2UKKwkJaTI0MDBtLT5hY2tfc2tiID0gYWNrX3NrYjsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpMjQwMG0tPnJ4X2xvY2ssIGZsYWdzKTsKKwljb21wbGV0ZSgmaTI0MDBtLT5tc2dfY29tcGxldGlvbik7CisJcmV0dXJuOworCitlcnJvcl93YWl0ZXJfY2FuY2VsbGVkOgorCWlmIChhY2tfc2tiKQorCQlrZnJlZV9za2IoYWNrX3NrYik7CitlcnJvcl9ub193YWl0ZXI6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaTI0MDBtLT5yeF9sb2NrLCBmbGFncyk7CisJcmV0dXJuOworfQorCisKKy8qCisgKiBSZWNlaXZlIGFuZCBwcm9jZXNzIGEgY29udHJvbCBwYXlsb2FkCisgKgorICogQGkyNDAwbTogZGV2aWNlIGRlc2NyaXB0b3IKKyAqIEBza2Jfcng6IHNrYiB0aGF0IGNvbnRhaW5zIHRoZSBwYXlsb2FkIChmb3IgcmVmZXJlbmNlIGNvdW50aW5nKQorICogQHBheWxvYWQ6IHBvaW50ZXIgdG8gbWVzc2FnZQorICogQHNpemU6IHNpemUgb2YgdGhlIG1lc3NhZ2UKKyAqCisgKiBUaGVyZSBhcmUgdHdvIHR5cGVzIG9mIGNvbnRyb2wgUlggbWVzc2FnZXM6IHJlcG9ydHMgKGFzeW5jaHJvbm91cywKKyAqIGxpa2UgeW91ciBldmVyeSBkYXkgaW50ZXJydXB0cykgYW5kICdhY2tzJyAocmVwb25zZXMgdG8gYSBjb21tYW5kLAorICogZ2V0IG9yIHNldCByZXF1ZXN0KS4KKyAqCisgKiBJZiBpdCBpcyBhIHJlcG9ydCwgd2UgcnVuIGhvb2tzIG9uIGl0ICh0byBleHRyYWN0IGluZm9ybWF0aW9uIGZvcgorICogdGhpbmdzIHdlIG5lZWQgdG8gZG8gaW4gdGhlIGRyaXZlcikgYW5kIHRoZW4gcGFzcyBpdCBvdmVyIHRvIHRoZQorICogV2lNQVggc3RhY2sgdG8gc2VuZCBpdCB0byB1c2VyIHNwYWNlLgorICoKKyAqIE5PVEU6IHJlcG9ydCBwcm9jZXNzaW5nIGlzIGRvbmUgaW4gYSB3b3JrcXVldWUgc3BlY2lmaWMgdG8gdGhlCisgKiAgICAgZ2VuZXJpYyBkcml2ZXIsIHRvIGF2b2lkIGRlYWRsb2NrcyBpbiB0aGUgc3lzdGVtLgorICoKKyAqIElmIGl0IGlzIG5vdCBhIHJlcG9ydCwgaXQgaXMgYW4gYWNrIHRvIGEgcHJldmlvdXNseSBleGVjdXRlZAorICogY29tbWFuZCwgc2V0IG9yIGdldCwgc28gd2FrZSB1cCB3aG9ldmVyIGlzIHdhaXRpbmcgZm9yIGl0IGZyb20KKyAqIGkyNDAwbV9tc2dfdG9fZGV2KCkuIGkyNDAwbV9yeF9jdGxfYWNrKCkgdGFrZXMgY2FyZSBvZiB0aGF0LgorICoKKyAqIE5vdGUgdGhhdCB0aGUgc2l6ZXMgd2UgcGFzcyB0byBvdGhlciBmdW5jdGlvbnMgZnJvbSBoZXJlIGFyZSB0aGUKKyAqIHNpemVzIG9mIHRoZSBfbDNsNF9oZHIgKyBwYXlsb2FkLCBub3QgZnVsbCBidWZmZXIgc2l6ZXMsIGFzIHdlIGhhdmUKKyAqIHZlcmlmaWVkIGluIF9tc2dfc2l6ZV9jaGVjaygpIHRoYXQgdGhleSBhcmUgY29uZ3J1ZW50LgorICoKKyAqIEZvciByZXBvcnRzOiBXZSBjYW4ndCBjbG9uZSB0aGUgb3JpZ2luYWwgc2tiIHdoZXJlIHRoZSBkYXRhIGlzCisgKiBiZWNhdXNlIHdlIG5lZWQgdG8gc2VuZCB0aGlzIHVwIHZpYSBuZXRsaW5rOyBuZXRsaW5rIGhhcyB0byBhZGQKKyAqIGhlYWRlcnMgYW5kIHdlIGNhbid0IG92ZXJ3cml0ZSB3aGF0J3MgcHJlY2VlZGluZyB0aGUgcGF5bG9hZC4uLmFzCisgKiBpdCBpcyBhbm90aGVyIG1lc3NhZ2UuIFNvIHdlIGp1c3QgZHVwIHRoZW0uCisgKi8KK3N0YXRpYwordm9pZCBpMjQwMG1fcnhfY3RsKHN0cnVjdCBpMjQwMG0gKmkyNDAwbSwgc3RydWN0IHNrX2J1ZmYgKnNrYl9yeCwKKwkJICAgY29uc3Qgdm9pZCAqcGF5bG9hZCwgc2l6ZV90IHNpemUpCit7CisJaW50IHJlc3VsdDsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBpMjQwMG1fZGV2KGkyNDAwbSk7CisJY29uc3Qgc3RydWN0IGkyNDAwbV9sM2w0X2hkciAqbDNsNF9oZHIgPSBwYXlsb2FkOworCXVuc2lnbmVkIG1zZ190eXBlOworCisJcmVzdWx0ID0gaTI0MDBtX21zZ19zaXplX2NoZWNrKGkyNDAwbSwgbDNsNF9oZHIsIHNpemUpOworCWlmIChyZXN1bHQgPCAwKSB7CisJCWRldl9lcnIoZGV2LCAiSFcgQlVHPyBkZXZpY2Ugc2VudCBhIGJhZCBtZXNzYWdlOiAlZFxuIiwKKwkJCXJlc3VsdCk7CisJCWdvdG8gZXJyb3JfY2hlY2s7CisJfQorCW1zZ190eXBlID0gbGUxNl90b19jcHUobDNsNF9oZHItPnR5cGUpOworCWRfcHJpbnRmKDEsIGRldiwgIiVzIDB4JTA0eDogJXp1IGJ5dGVzXG4iLAorCQkgbXNnX3R5cGUgJiBJMjQwME1fTVRfUkVQT1JUX01BU0sgPyAiUkVQT1JUIiA6ICJDTUQvU0VUL0dFVCIsCisJCSBtc2dfdHlwZSwgc2l6ZSk7CisJZF9kdW1wKDIsIGRldiwgbDNsNF9oZHIsIHNpemUpOworCWlmIChtc2dfdHlwZSAmIEkyNDAwTV9NVF9SRVBPUlRfTUFTSykgeworCQkvKiBUaGVzZSBob29rcyBoYXZlIHRvIGJlIHJhbiBzZXJpYWxpemVkOyBhcyB3ZWxsLCB0aGUKKwkJICogaGFuZGxpbmcgbWlnaHQgZm9yY2UgdGhlIGV4ZWN1dGlvbiBvZiBjb21tYW5kcywgYW5kCisJCSAqIHRoYXQgbWlnaHQgY2F1c2UgcmVlbnRyYW5jeSBpc3N1ZXMgd2l0aAorCQkgKiBidXMtc3BlY2lmaWMgc3ViZHJpdmVycyBhbmQgd29ya3F1ZXVlcy4gU28gd2UgcnVuCisJCSAqIGl0IGluIGEgc2VwYXJhdGUgd29ya3F1ZXVlLiAqLworCQlzdHJ1Y3QgaTI0MDBtX3JlcG9ydF9ob29rX2FyZ3MgYXJncyA9IHsKKwkJCS5za2JfcnggPSBza2JfcngsCisJCQkubDNsNF9oZHIgPSBsM2w0X2hkciwKKwkJCS5zaXplID0gc2l6ZQorCQl9OworCQlpZiAodW5saWtlbHkoaTI0MDBtLT5yZWFkeSA9PSAwKSkJLyogb25seSBzZW5kIGlmIHVwICovCisJCQlyZXR1cm47CisJCXNrYl9nZXQoc2tiX3J4KTsKKwkJaTI0MDBtX3F1ZXVlX3dvcmsoaTI0MDBtLCBpMjQwMG1fcmVwb3J0X2hvb2tfd29yaywKKwkJCQkgIEdGUF9LRVJORUwsICZhcmdzLCBzaXplb2YoYXJncykpOworCQlyZXN1bHQgPSB3aW1heF9tc2coJmkyNDAwbS0+d2ltYXhfZGV2LCBOVUxMLCBsM2w0X2hkciwgc2l6ZSwKKwkJCQkgICBHRlBfS0VSTkVMKTsKKwkJaWYgKHJlc3VsdCA8IDApCisJCQlkZXZfZXJyKGRldiwgImVycm9yIHNlbmRpbmcgcmVwb3J0IHRvIHVzZXJzcGFjZTogJWRcbiIsCisJCQkJcmVzdWx0KTsKKwl9IGVsc2UJCS8qIGFuIGFjayB0byBhIENNRCwgR0VUIG9yIFNFVCAqLworCQlpMjQwMG1fcnhfY3RsX2FjayhpMjQwMG0sIHBheWxvYWQsIHNpemUpOworZXJyb3JfY2hlY2s6CisJcmV0dXJuOworfQorCisKKworCisvKgorICogUmVjZWl2ZSBhbmQgc2VuZCB1cCBhIHRyYWNlCisgKgorICogQGkyNDAwbTogZGV2aWNlIGRlc2NyaXB0b3IKKyAqIEBza2Jfcng6IHNrYiB0aGF0IGNvbnRhaW5zIHRoZSB0cmFjZSAoZm9yIHJlZmVyZW5jZSBjb3VudGluZykKKyAqIEBwYXlsb2FkOiBwb2ludGVyIHRvIHRyYWNlIG1lc3NhZ2UgaW5zaWRlIHRoZSBza2IKKyAqIEBzaXplOiBzaXplIG9mIHRoZSBtZXNzYWdlCisgKgorICogVEhlIGkyNDAwbSBtaWdodCBwcm9kdWNlIHRyYWNlIGluZm9ybWF0aW9uIChkaWFnbm9zdGljcykgYW5kIHdlCisgKiBzZW5kIHRoZW0gdGhyb3VnaCBhIGRpZmZlcmVudCBrZXJuZWwtdG8tdXNlciBwaXBlICh0byBhdm9pZAorICogY2xvZ2dpbmcgaXQpLgorICoKKyAqIEFzIGluIGkyNDAwbV9yeF9jdGwoKSwgd2UgY2FuJ3QgY2xvbmUgdGhlIG9yaWdpbmFsIHNrYiB3aGVyZSB0aGUKKyAqIGRhdGEgaXMgYmVjYXVzZSB3ZSBuZWVkIHRvIHNlbmQgdGhpcyB1cCB2aWEgbmV0bGluazsgbmV0bGluayBoYXMgdG8KKyAqIGFkZCBoZWFkZXJzIGFuZCB3ZSBjYW4ndCBvdmVyd3JpdGUgd2hhdCdzIHByZWNlZWRpbmcgdGhlCisgKiBwYXlsb2FkLi4uYXMgaXQgaXMgYW5vdGhlciBtZXNzYWdlLiBTbyB3ZSBqdXN0IGR1cCB0aGVtLgorICovCitzdGF0aWMKK3ZvaWQgaTI0MDBtX3J4X3RyYWNlKHN0cnVjdCBpMjQwMG0gKmkyNDAwbSwKKwkJICAgICBjb25zdCB2b2lkICpwYXlsb2FkLCBzaXplX3Qgc2l6ZSkKK3sKKwlpbnQgcmVzdWx0OworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGkyNDAwbV9kZXYoaTI0MDBtKTsKKwlzdHJ1Y3Qgd2ltYXhfZGV2ICp3aW1heF9kZXYgPSAmaTI0MDBtLT53aW1heF9kZXY7CisJY29uc3Qgc3RydWN0IGkyNDAwbV9sM2w0X2hkciAqbDNsNF9oZHIgPSBwYXlsb2FkOworCXVuc2lnbmVkIG1zZ190eXBlOworCisJcmVzdWx0ID0gaTI0MDBtX21zZ19zaXplX2NoZWNrKGkyNDAwbSwgbDNsNF9oZHIsIHNpemUpOworCWlmIChyZXN1bHQgPCAwKSB7CisJCWRldl9lcnIoZGV2LCAiSFcgQlVHPyBkZXZpY2Ugc2VudCBhIGJhZCB0cmFjZSBtZXNzYWdlOiAlZFxuIiwKKwkJCXJlc3VsdCk7CisJCWdvdG8gZXJyb3JfY2hlY2s7CisJfQorCW1zZ190eXBlID0gbGUxNl90b19jcHUobDNsNF9oZHItPnR5cGUpOworCWRfcHJpbnRmKDEsIGRldiwgIlRyYWNlICVzIDB4JTA0eDogJXp1IGJ5dGVzXG4iLAorCQkgbXNnX3R5cGUgJiBJMjQwME1fTVRfUkVQT1JUX01BU0sgPyAiUkVQT1JUIiA6ICJDTUQvU0VUL0dFVCIsCisJCSBtc2dfdHlwZSwgc2l6ZSk7CisJZF9kdW1wKDIsIGRldiwgbDNsNF9oZHIsIHNpemUpOworCWlmICh1bmxpa2VseShpMjQwMG0tPnJlYWR5ID09IDApKQkvKiBvbmx5IHNlbmQgaWYgdXAgKi8KKwkJcmV0dXJuOworCXJlc3VsdCA9IHdpbWF4X21zZyh3aW1heF9kZXYsICJ0cmFjZSIsIGwzbDRfaGRyLCBzaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAocmVzdWx0IDwgMCkKKwkJZGV2X2VycihkZXYsICJlcnJvciBzZW5kaW5nIHRyYWNlIHRvIHVzZXJzcGFjZTogJWRcbiIsCisJCQlyZXN1bHQpOworZXJyb3JfY2hlY2s6CisJcmV0dXJuOworfQorCisKKy8qCisgKiBBY3Qgb24gYSByZWNlaXZlZCBwYXlsb2FkCisgKgorICogQGkyNDAwbTogZGV2aWNlIGluc3RhbmNlCisgKiBAc2tiX3J4OiBza2Igd2hlcmUgdGhlIHRyYW5zYWN0aW9uIHdhcyByZWNlaXZlZAorICogQHNpbmdsZTogMSBpZiB0aGVyZSBpcyBvbmx5IG9uZSBwYXlsb2FkLCAwIG90aGVyd2lzZQorICogQHBsZDogcGF5bG9hZCBkZXNjcmlwdG9yCisgKiBAcGF5bG9hZDogcGF5bG9hZCBkYXRhCisgKgorICogVXBvbiByZWNlcHRpb24gb2YgYSBwYXlsb2FkLCBsb29rIGF0IGl0cyBndXRzIGluIHRoZSBwYXlsb2FkCisgKiBkZXNjcmlwdG9yIGFuZCBkZWNpZGUgd2hhdCB0byBkbyB3aXRoIGl0LgorICovCitzdGF0aWMKK3ZvaWQgaTI0MDBtX3J4X3BheWxvYWQoc3RydWN0IGkyNDAwbSAqaTI0MDBtLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiX3J4LAorCQkgICAgICAgdW5zaWduZWQgc2luZ2xlLCBjb25zdCBzdHJ1Y3QgaTI0MDBtX3BsZCAqcGxkLAorCQkgICAgICAgY29uc3Qgdm9pZCAqcGF5bG9hZCkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBpMjQwMG1fZGV2KGkyNDAwbSk7CisJc2l6ZV90IHBsX3NpemUgPSBpMjQwMG1fcGxkX3NpemUocGxkKTsKKwllbnVtIGkyNDAwbV9wdCBwbF90eXBlID0gaTI0MDBtX3BsZF90eXBlKHBsZCk7CisKKwlzd2l0Y2ggKHBsX3R5cGUpIHsKKwljYXNlIEkyNDAwTV9QVF9EQVRBOgorCQlkX3ByaW50ZigzLCBkZXYsICJSWDogZGF0YSBwYXlsb2FkICV6dSBieXRlc1xuIiwgcGxfc2l6ZSk7CisJCWkyNDAwbV9uZXRfcngoaTI0MDBtLCBza2JfcngsIHNpbmdsZSwgcGF5bG9hZCwgcGxfc2l6ZSk7CisJCWJyZWFrOworCWNhc2UgSTI0MDBNX1BUX0NUUkw6CisJCWkyNDAwbV9yeF9jdGwoaTI0MDBtLCBza2JfcngsIHBheWxvYWQsIHBsX3NpemUpOworCQlicmVhazsKKwljYXNlIEkyNDAwTV9QVF9UUkFDRToKKwkJaTI0MDBtX3J4X3RyYWNlKGkyNDAwbSwgcGF5bG9hZCwgcGxfc2l6ZSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CS8qIEFueXRoaW5nIGVsc2Ugc2hvdWxkbid0IGNvbWUgdG8gdGhlIGhvc3QgKi8KKwkJaWYgKHByaW50a19yYXRlbGltaXQoKSkKKwkJCWRldl9lcnIoZGV2LCAiUlg6IEhXIEJVRz8gdW5leHBlY3RlZCBwYXlsb2FkIHR5cGUgJXVcbiIsCisJCQkJcGxfdHlwZSk7CisJfQorfQorCisKKy8qCisgKiBDaGVjayBhIHJlY2VpdmVkIHRyYW5zYWN0aW9uJ3MgbWVzc2FnZSBoZWFkZXIKKyAqCisgKiBAaTI0MDBtOiBkZXZpY2UgZGVzY3JpcHRvcgorICogQG1zZ19oZHI6IG1lc3NhZ2UgaGVhZGVyCisgKiBAYnVmX3NpemU6IHNpemUgb2YgdGhlIHJlY2VpdmVkIGJ1ZmZlcgorICoKKyAqIENoZWNrIHRoYXQgdGhlIGRlY2xhcmF0aW9ucyBkb25lIGJ5IGEgUlggYnVmZmVyIG1lc3NhZ2UgaGVhZGVyIGFyZQorICogc2FuZSBhbmQgY29uc2lzdGVudCB3aXRoIHRoZSBhbW91bnQgb2YgZGF0YSB0aGF0IHdhcyByZWNlaXZlZC4KKyAqLworc3RhdGljCitpbnQgaTI0MDBtX3J4X21zZ19oZHJfY2hlY2soc3RydWN0IGkyNDAwbSAqaTI0MDBtLAorCQkJICAgIGNvbnN0IHN0cnVjdCBpMjQwMG1fbXNnX2hkciAqbXNnX2hkciwKKwkJCSAgICBzaXplX3QgYnVmX3NpemUpCit7CisJaW50IHJlc3VsdCA9IC1FSU87CisJc3RydWN0IGRldmljZSAqZGV2ID0gaTI0MDBtX2RldihpMjQwMG0pOworCWlmIChidWZfc2l6ZSA8IHNpemVvZigqbXNnX2hkcikpIHsKKwkJZGV2X2VycihkZXYsICJSWDogSFcgQlVHPyBtZXNzYWdlIHdpdGggc2hvcnQgaGVhZGVyICglenUgIgorCQkJInZzICV6dSBieXRlcyBleHBlY3RlZClcbiIsIGJ1Zl9zaXplLCBzaXplb2YoKm1zZ19oZHIpKTsKKwkJZ290byBlcnJvcjsKKwl9CisJaWYgKG1zZ19oZHItPmJhcmtlciAhPSBjcHVfdG9fbGUzMihJMjQwME1fRDJIX01TR19CQVJLRVIpKSB7CisJCWRldl9lcnIoZGV2LCAiUlg6IEhXIEJVRz8gbWVzc2FnZSByZWNlaXZlZCB3aXRoIHVua25vd24gIgorCQkJImJhcmtlciAweCUwOHggKGJ1Zl9zaXplICV6dSBieXRlcylcbiIsCisJCQlsZTMyX3RvX2NwdShtc2dfaGRyLT5iYXJrZXIpLCBidWZfc2l6ZSk7CisJCWdvdG8gZXJyb3I7CisJfQorCWlmIChtc2dfaGRyLT5udW1fcGxzID09IDApIHsKKwkJZGV2X2VycihkZXYsICJSWDogSFcgQlVHPyB6ZXJvIHBheWxvYWQgcGFja2V0cyBpbiBtZXNzYWdlXG4iKTsKKwkJZ290byBlcnJvcjsKKwl9CisJaWYgKGxlMTZfdG9fY3B1KG1zZ19oZHItPm51bV9wbHMpID4gSTI0MDBNX01BWF9QTFNfSU5fTVNHKSB7CisJCWRldl9lcnIoZGV2LCAiUlg6IEhXIEJVRz8gbWVzc2FnZSBjb250YWlucyBtb3JlIHBheWxvYWQgIgorCQkJInRoYW4gbWF4aW11bTsgaWdub3JpbmcuXG4iKTsKKwkJZ290byBlcnJvcjsKKwl9CisJcmVzdWx0ID0gMDsKK2Vycm9yOgorCXJldHVybiByZXN1bHQ7Cit9CisKKworLyoKKyAqIENoZWNrIGEgcGF5bG9hZCBkZXNjcmlwdG9yIGFnYWluc3QgdGhlIHJlY2VpdmVkIGRhdGEKKyAqCisgKiBAaTI0MDBtOiBkZXZpY2UgZGVzY3JpcHRvcgorICogQHBsZDogcGF5bG9hZCBkZXNjcmlwdG9yCisgKiBAcGxfaXRyOiBvZmZzZXQgKGluIGJ5dGVzKSBpbiB0aGUgcmVjZWl2ZWQgYnVmZmVyIHRoZSBwYXlsb2FkIGlzCisgKiAgICAgICAgICBsb2NhdGVkCisgKiBAYnVmX3NpemU6IHNpemUgb2YgdGhlIHJlY2VpdmVkIGJ1ZmZlcgorICoKKyAqIEdpdmVuIGEgcGF5bG9hZCBkZXNjcmlwdG9yIChwYXJ0IG9mIGEgUlggYnVmZmVyKSwgY2hlY2sgaXQgaXMgc2FuZQorICogYW5kIHRoYXQgdGhlIGRhdGEgaXQgZGVjbGFyZXMgZml0cyBpbiB0aGUgYnVmZmVyLgorICovCitzdGF0aWMKK2ludCBpMjQwMG1fcnhfcGxfZGVzY3JfY2hlY2soc3RydWN0IGkyNDAwbSAqaTI0MDBtLAorCQkJICAgICAgY29uc3Qgc3RydWN0IGkyNDAwbV9wbGQgKnBsZCwKKwkJCSAgICAgIHNpemVfdCBwbF9pdHIsIHNpemVfdCBidWZfc2l6ZSkKK3sKKwlpbnQgcmVzdWx0ID0gLUVJTzsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBpMjQwMG1fZGV2KGkyNDAwbSk7CisJc2l6ZV90IHBsX3NpemUgPSBpMjQwMG1fcGxkX3NpemUocGxkKTsKKwllbnVtIGkyNDAwbV9wdCBwbF90eXBlID0gaTI0MDBtX3BsZF90eXBlKHBsZCk7CisKKwlpZiAocGxfc2l6ZSA+IGkyNDAwbS0+YnVzX3BsX3NpemVfbWF4KSB7CisJCWRldl9lcnIoZGV2LCAiUlg6IEhXIEJVRz8gcGF5bG9hZCBAJXp1OiBzaXplICV6dSBpcyAiCisJCQkiYmlnZ2VyIHRoYW4gbWF4aW11bSAlenU7IGlnbm9yaW5nIG1lc3NhZ2VcbiIsCisJCQlwbF9pdHIsIHBsX3NpemUsIGkyNDAwbS0+YnVzX3BsX3NpemVfbWF4KTsKKwkJZ290byBlcnJvcjsKKwl9CisJaWYgKHBsX2l0ciArIHBsX3NpemUgPiBidWZfc2l6ZSkgewkvKiBlbm91Z2g/ICovCisJCWRldl9lcnIoZGV2LCAiUlg6IEhXIEJVRz8gcGF5bG9hZCBAJXp1OiBzaXplICV6dSAiCisJCQkiZ29lcyBiZXlvbmQgdGhlIHJlY2VpdmVkIGJ1ZmZlciAiCisJCQkic2l6ZSAoJXp1IGJ5dGVzKTsgaWdub3JpbmcgbWVzc2FnZVxuIiwKKwkJCXBsX2l0ciwgcGxfc2l6ZSwgYnVmX3NpemUpOworCQlnb3RvIGVycm9yOworCX0KKwlpZiAocGxfdHlwZSA+PSBJMjQwME1fUFRfSUxMRUdBTCkgeworCQlkZXZfZXJyKGRldiwgIlJYOiBIVyBCVUc/IGlsbGVnYWwgcGF5bG9hZCB0eXBlICV1OyAiCisJCQkiaWdub3JpbmcgbWVzc2FnZVxuIiwgcGxfdHlwZSk7CisJCWdvdG8gZXJyb3I7CisJfQorCXJlc3VsdCA9IDA7CitlcnJvcjoKKwlyZXR1cm4gcmVzdWx0OworfQorCisKKy8qKgorICogaTI0MDBtX3J4IC0gUmVjZWl2ZSBhIGJ1ZmZlciBvZiBkYXRhIGZyb20gdGhlIGRldmljZQorICoKKyAqIEBpMjQwMG06IGRldmljZSBkZXNjcmlwdG9yCisgKiBAc2tiOiBza2J1ZmYgd2hlcmUgdGhlIGRhdGEgaGFzIGJlZW4gcmVjZWl2ZWQKKyAqCisgKiBQYXJzZSBpbiBhIGJ1ZmZlciBvZiBkYXRhIHRoYXQgY29udGFpbnMgYW4gUlggbWVzc2FnZSBzZW50IGZyb20gdGhlCisgKiBkZXZpY2UuIFNlZSB0aGUgZmlsZSBoZWFkZXIgZm9yIHRoZSBmb3JtYXQuIFJ1biBhbGwgY2hlY2tzIG9uIHRoZQorICogYnVmZmVyIGhlYWRlciwgdGhlbiBydW4gb3ZlciBlYWNoIHBheWxvYWQncyBkZXNjcmlwdG9ycywgdmVyaWZ5CisgKiB0aGVpciBjb25zaXN0ZW5jeSBhbmQgYWN0IG9uIGVhY2ggcGF5bG9hZCdzIGNvbnRlbnRzLiAgSWYKKyAqIGV2ZXJ5dGhpbmcgaXMgc3VjY2VzZnVsLCB1cGRhdGUgdGhlIGRldmljZSdzIHN0YXRpc3RpY3MuCisgKgorICogTm90ZTogWW91IG5lZWQgdG8gc2V0IHRoZSBza2IgdG8gY29udGFpbiBvbmx5IHRoZSBsZW5ndGggb2YgdGhlCisgKiByZWNlaXZlZCBidWZmZXI7IGZvciB0aGF0LCB1c2Ugc2tiX3RyaW0oc2tiLCBSRUNFSVZFRF9TSVpFKS4KKyAqCisgKiBSZXR1cm5zOgorICoKKyAqIDAgaWYgb2ssIDwgMCBlcnJubyBvbiBlcnJvcgorICoKKyAqIElmIG9rLCB0aGlzIGZ1bmN0aW9uIG93bnMgbm93IHRoZSBza2IgYW5kIHRoZSBjYWxsZXIgRE9FU04nVCBoYXZlCisgKiB0byBydW4ga2ZyZWVfc2tiKCkgb24gaXQuIEhvd2V2ZXIsIG9uIGVycm9yLCB0aGUgY2FsbGVyIHN0aWxsIG93bnMKKyAqIHRoZSBza2IgYW5kIGl0IGlzIHJlc3BvbnNpYmxlIGZvciByZWxlYXNpbmcgaXQuCisgKi8KK2ludCBpMjQwMG1fcngoc3RydWN0IGkyNDAwbSAqaTI0MDBtLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCWludCBpLCByZXN1bHQ7CisJc3RydWN0IGRldmljZSAqZGV2ID0gaTI0MDBtX2RldihpMjQwMG0pOworCWNvbnN0IHN0cnVjdCBpMjQwMG1fbXNnX2hkciAqbXNnX2hkcjsKKwlzaXplX3QgcGxfaXRyLCBwbF9zaXplLCBza2JfbGVuOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgbnVtX3BsczsKKworCXNrYl9sZW4gPSBza2ItPmxlbjsKKwlkX2Zuc3RhcnQoNCwgZGV2LCAiKGkyNDAwbSAlcCBza2IgJXAgW3NpemUgJXp1XSlcbiIsCisJCSAgaTI0MDBtLCBza2IsIHNrYl9sZW4pOworCXJlc3VsdCA9IC1FSU87CisJbXNnX2hkciA9ICh2b2lkICopIHNrYi0+ZGF0YTsKKwlyZXN1bHQgPSBpMjQwMG1fcnhfbXNnX2hkcl9jaGVjayhpMjQwMG0sIG1zZ19oZHIsIHNrYi0+bGVuKTsKKwlpZiAocmVzdWx0IDwgMCkKKwkJZ290byBlcnJvcl9tc2dfaGRyX2NoZWNrOworCXJlc3VsdCA9IC1FSU87CisJbnVtX3BscyA9IGxlMTZfdG9fY3B1KG1zZ19oZHItPm51bV9wbHMpOworCXBsX2l0ciA9IHNpemVvZigqbXNnX2hkcikgKwkvKiBDaGVjayBwYXlsb2FkIGRlc2NyaXB0b3IocykgKi8KKwkJbnVtX3BscyAqIHNpemVvZihtc2dfaGRyLT5wbGRbMF0pOworCXBsX2l0ciA9IEFMSUdOKHBsX2l0ciwgSTI0MDBNX1BMX1BBRCk7CisJaWYgKHBsX2l0ciA+IHNrYi0+bGVuKSB7CS8qIGdvdCBhbGwgdGhlIHBheWxvYWQgZGVzY3JpcHRvcnM/ICovCisJCWRldl9lcnIoZGV2LCAiUlg6IEhXIEJVRz8gbWVzc2FnZSB0b28gc2hvcnQgKCV1IGJ5dGVzKSBmb3IgIgorCQkJIiV1IHBheWxvYWQgZGVzY3JpcHRvcnMgKCV6dSBlYWNoLCB0b3RhbCAlenUpXG4iLAorCQkJc2tiLT5sZW4sIG51bV9wbHMsIHNpemVvZihtc2dfaGRyLT5wbGRbMF0pLCBwbF9pdHIpOworCQlnb3RvIGVycm9yX3BsX2Rlc2NyX3Nob3J0OworCX0KKwkvKiBXYWxrIGVhY2ggcGF5bG9hZCBwYXlsb2FkLS1jaGVjayB3ZSByZWFsbHkgZ290IGl0ICovCisJZm9yIChpID0gMDsgaSA8IG51bV9wbHM7IGkrKykgeworCQkvKiB3b3JrIGFyb3VuZCBvbGQgZ2NjIHdhcm5pbmdzICovCisJCXBsX3NpemUgPSBpMjQwMG1fcGxkX3NpemUoJm1zZ19oZHItPnBsZFtpXSk7CisJCXJlc3VsdCA9IGkyNDAwbV9yeF9wbF9kZXNjcl9jaGVjayhpMjQwMG0sICZtc2dfaGRyLT5wbGRbaV0sCisJCQkJCQkgIHBsX2l0ciwgc2tiLT5sZW4pOworCQlpZiAocmVzdWx0IDwgMCkKKwkJCWdvdG8gZXJyb3JfcGxfZGVzY3JfY2hlY2s7CisJCWkyNDAwbV9yeF9wYXlsb2FkKGkyNDAwbSwgc2tiLCBudW1fcGxzID09IDEsICZtc2dfaGRyLT5wbGRbaV0sCisJCQkJICBza2ItPmRhdGEgKyBwbF9pdHIpOworCQlwbF9pdHIgKz0gQUxJR04ocGxfc2l6ZSwgSTI0MDBNX1BMX1BBRCk7CisJCWNvbmRfcmVzY2hlZCgpOwkJLyogRG9uJ3QgbW9ub3BvbGl6ZSAqLworCX0KKwlrZnJlZV9za2Ioc2tiKTsKKwkvKiBVcGRhdGUgZGV2aWNlIHN0YXRpc3RpY3MgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmaTI0MDBtLT5yeF9sb2NrLCBmbGFncyk7CisJaTI0MDBtLT5yeF9wbF9udW0gKz0gaTsKKwlpZiAoaSA+IGkyNDAwbS0+cnhfcGxfbWF4KQorCQlpMjQwMG0tPnJ4X3BsX21heCA9IGk7CisJaWYgKGkgPCBpMjQwMG0tPnJ4X3BsX21pbikKKwkJaTI0MDBtLT5yeF9wbF9taW4gPSBpOworCWkyNDAwbS0+cnhfbnVtKys7CisJaTI0MDBtLT5yeF9zaXplX2FjYyArPSBza2ItPmxlbjsKKwlpZiAoc2tiLT5sZW4gPCBpMjQwMG0tPnJ4X3NpemVfbWluKQorCQlpMjQwMG0tPnJ4X3NpemVfbWluID0gc2tiLT5sZW47CisJaWYgKHNrYi0+bGVuID4gaTI0MDBtLT5yeF9zaXplX21heCkKKwkJaTI0MDBtLT5yeF9zaXplX21heCA9IHNrYi0+bGVuOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmkyNDAwbS0+cnhfbG9jaywgZmxhZ3MpOworZXJyb3JfcGxfZGVzY3JfY2hlY2s6CitlcnJvcl9wbF9kZXNjcl9zaG9ydDoKK2Vycm9yX21zZ19oZHJfY2hlY2s6CisJZF9mbmVuZCg0LCBkZXYsICIoaTI0MDBtICVwIHNrYiAlcCBbc2l6ZSAlenVdKSA9ICVkXG4iLAorCQlpMjQwMG0sIHNrYiwgc2tiX2xlbiwgcmVzdWx0KTsKKwlyZXR1cm4gcmVzdWx0OworfQorRVhQT1JUX1NZTUJPTF9HUEwoaTI0MDBtX3J4KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpbWF4L2kyNDAwbS9zZGlvLWRlYnVnLWxldmVscy5oIGIvZHJpdmVycy9uZXQvd2ltYXgvaTI0MDBtL3NkaW8tZGVidWctbGV2ZWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzUxOTk4NwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpbWF4L2kyNDAwbS9zZGlvLWRlYnVnLWxldmVscy5oCkBAIC0wLDAgKzEsMjIgQEAKKy8qCisgKiBkZWJ1ZyBsZXZlbHMgY29udHJvbCBmaWxlIGZvciB0aGUgaTI0MDBtIG1vZHVsZSdzCisgKi8KKyNpZm5kZWYgX19kZWJ1Z19sZXZlbHNfX2hfXworI2RlZmluZSBfX2RlYnVnX2xldmVsc19faF9fCisKKy8qIE1heGltdW0gY29tcGlsZSBhbmQgcnVuIHRpbWUgZGVidWcgbGV2ZWwgZm9yIGFsbCBzdWJtb2R1bGVzICovCisjZGVmaW5lIERfTU9EVUxFTkFNRSBpMjQwMG1fc2RpbworI2RlZmluZSBEX01BU1RFUiBDT05GSUdfV0lNQVhfSTI0MDBNX0RFQlVHX0xFVkVMCisKKyNpbmNsdWRlIDxsaW51eC93aW1heC9kZWJ1Zy5oPgorCisvKiBMaXN0IG9mIGFsbCB0aGUgZW5hYmxlZCBtb2R1bGVzICovCitlbnVtIGRfbW9kdWxlIHsKKwlEX1NVQk1PRFVMRV9ERUNMQVJFKG1haW4pLAorCURfU1VCTU9EVUxFX0RFQ0xBUkUodHgpLAorCURfU1VCTU9EVUxFX0RFQ0xBUkUocngpLAorCURfU1VCTU9EVUxFX0RFQ0xBUkUoZncpCit9OworCisKKyNlbmRpZiAvKiAjaWZuZGVmIF9fZGVidWdfbGV2ZWxzX19oX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpbWF4L2kyNDAwbS9zZGlvLWZ3LmMgYi9kcml2ZXJzL25ldC93aW1heC9pMjQwMG0vc2Rpby1mdy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0ODcyMDUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aW1heC9pMjQwMG0vc2Rpby1mdy5jCkBAIC0wLDAgKzEsMjI0IEBACisvKgorICogSW50ZWwgV2lyZWxlc3MgV2lNQVggQ29ubmVjdGlvbiAyNDAwbQorICogRmlybXdhcmUgdXBsb2FkZXIncyBTRElPIHNwZWNpZmljcworICoKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICAgZGlzdHJpYnV0aW9uLgorICogICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgSW50ZWwgQ29ycG9yYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKgorICogSW50ZWwgQ29ycG9yYXRpb24gPGxpbnV4LXdpbWF4QGludGVsLmNvbT4KKyAqIFlhbmlyIEx1YmV0a2luIDx5YW5pcngubHViZXRraW5AaW50ZWwuY29tPgorICogSW5ha3kgUGVyZXotR29uemFsZXogPGluYWt5LnBlcmV6LWdvbnphbGV6QGludGVsLmNvbT4KKyAqICAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24KKyAqCisgKiBJbmFreSBQZXJlei1Hb256YWxleiA8aW5ha3kucGVyZXotZ29uemFsZXpAaW50ZWwuY29tPgorICogIC0gQnVzIGdlbmVyaWMvc3BlY2lmaWMgc3BsaXQgZm9yIFVTQgorICoKKyAqIERpcmsgQnJhbmRld2llIDxkaXJrLmouYnJhbmRld2llQGludGVsLmNvbT4KKyAqICAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24gZm9yIFNESU8KKyAqCisgKiBJbmFreSBQZXJlei1Hb256YWxleiA8aW5ha3kucGVyZXotZ29uemFsZXpAaW50ZWwuY29tPgorICogIC0gU0RJTyByZWhhc2ggZm9yIGNoYW5nZXMgaW4gdGhlIGJ1cy1kcml2ZXIgbW9kZWwKKyAqCisgKiBUSEUgUFJPQ0VEVVJFCisgKgorICogU2VlIGZ3LmMgZm9yIHRoZSBnZW5lcmljIGRlc2NyaXB0aW9uIG9mIHRoaXMgcHJvY2VkdXJlLgorICoKKyAqIFRoaXMgZmlsZSBpbXBsZW1lbnRzIG9ubHkgdGhlIFNESU8gc3BlY2lmaWNzLiBJdCBib2lscyBkb3duIHRvIGhvdworICogdG8gc2VuZCBhIGNvbW1hbmQgYW5kIHdhaXRpbmcgZm9yIGFuIGFja25vd2xlZGdlbWVudCBmcm9tIHRoZQorICogZGV2aWNlLiBXZSBkbyBwb2xsZWQgcmVhZHMuCisgKgorICogQ09NTUFORCBFWEVDVVRJT04KKyAqCisgKiBUSGUgZ2VuZXJpYyBmaXJtd2FyZSB1cGxvYWQgY29kZSB3aWxsIGNhbGwgaTI0MDBtX2J1c19ibV9jbWRfc2VuZCgpCisgKiB0byBzZW5kIGNvbW1hbmRzLgorICoKKyAqIFRoZSBTRElPIGRldmljZXMgZXhwZWN0cyB0aGluZ3MgaW4gMjU2IGJ5dGUgYmxvY2tzLCBzbyBpdCB3aWxsIHBhZAorICogaXQsIGNvbXB1dGUgdGhlIGNoZWNrc3VtIChpZiBuZWVkZWQpIGFuZCBwYXNzIGl0IHRvIFNESU8uCisgKgorICogQUNLIFJFQ0VQVElPTgorICoKKyAqIFRoaXMgd29ya3MgaW4gcG9sbGluZyBtb2RlIC0tIHRoZSBmdyBsb2FkZXIgc2F5cyB3aGVuIHRvIHdhaXQgZm9yCisgKiBkYXRhIGFuZCBmb3IgdGhhdCBpdCBjYWxscyBpMjQwMG1zX2J1c19ibV93YWl0X2Zvcl9hY2soKS4KKyAqCisgKiBUaGlzIHdpbGwgcG9sbCB0aGUgZGV2aWNlIGZvciBkYXRhIHVudGlsIGl0IGlzIHJlY2VpdmVkLiBXZSBuZWVkIHRvCisgKiByZWNlaXZlIGF0IGxlYXN0IGFzIG11Y2ggYnl0ZXMgYXMgd2hlcmUgYXNrZWQgZm9yIChhbHRob3VnaCBpdCdsbAorICogYWx3YXlzIGJlIGEgbXVsdGlwbGUgb2YgMjU2IGJ5dGVzKS4KKyAqLworI2luY2x1ZGUgPGxpbnV4L21tYy9zZGlvX2Z1bmMuaD4KKyNpbmNsdWRlICJpMjQwMG0tc2Rpby5oIgorCisKKyNkZWZpbmUgRF9TVUJNT0RVTEUgZncKKyNpbmNsdWRlICJzZGlvLWRlYnVnLWxldmVscy5oIgorCisvKgorICogU2VuZCBhIGJvb3QtbW9kZSBjb21tYW5kIHRvIHRoZSBTRElPIGZ1bmN0aW9uCisgKgorICogV2UgdXNlIGEgYm91bmNlIGJ1ZmZlciAoaTI0MDBtLT5ibV9jbWRfYnVmKSBiZWNhdXNlIHdlIG5lZWQgdG8KKyAqIHRvdWNoIHRoZSBoZWFkZXIgaWYgdGhlIFJBVyBmbGFnIGlzIG5vdCBzZXQuCisgKgorICogQGZsYWdzOiBwYXNzIHRocnUgZnJvbSBpMjQwMG1fYm1fY21kKCkKKyAqIEByZXR1cm46IGNtZF9zaXplIGlmIG9rLCA8IDAgZXJybm8gY29kZSBvbiBlcnJvci4KKyAqCisgKiBOb3RlIHRoZSBjb21tYW5kIGlzIHBhZGRlZCB0byB0aGUgU0RJTyBibG9jayBzaXplIGZvciB0aGUgZGV2aWNlLgorICovCitzc2l6ZV90IGkyNDAwbXNfYnVzX2JtX2NtZF9zZW5kKHN0cnVjdCBpMjQwMG0gKmkyNDAwbSwKKwkJCQljb25zdCBzdHJ1Y3QgaTI0MDBtX2Jvb3Ryb21faGVhZGVyICpfY21kLAorCQkJCXNpemVfdCBjbWRfc2l6ZSwgaW50IGZsYWdzKQoreworCXNzaXplX3QgcmVzdWx0OworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGkyNDAwbV9kZXYoaTI0MDBtKTsKKwlzdHJ1Y3QgaTI0MDBtcyAqaTI0MDBtcyA9IGNvbnRhaW5lcl9vZihpMjQwMG0sIHN0cnVjdCBpMjQwMG1zLCBpMjQwMG0pOworCWludCBvcGNvZGUgPSBfY21kID09IE5VTEwgPyAtMSA6IGkyNDAwbV9icmhfZ2V0X29wY29kZShfY21kKTsKKwlzdHJ1Y3QgaTI0MDBtX2Jvb3Ryb21faGVhZGVyICpjbWQ7CisJLyogU0RJTyByZXN0cmljdGlvbiAqLworCXNpemVfdCBjbWRfc2l6ZV9hID0gQUxJR04oY21kX3NpemUsIEkyNDAwTVNfQkxLX1NJWkUpOworCisJZF9mbnN0YXJ0KDUsIGRldiwgIihpMjQwMG0gJXAgY21kICVwIHNpemUgJXp1KVxuIiwKKwkJICBpMjQwMG0sIF9jbWQsIGNtZF9zaXplKTsKKwlyZXN1bHQgPSAtRTJCSUc7CisJaWYgKGNtZF9zaXplID4gSTI0MDBNX0JNX0NNRF9CVUZfU0laRSkKKwkJZ290byBlcnJvcl90b29fYmlnOworCisJbWVtY3B5KGkyNDAwbS0+Ym1fY21kX2J1ZiwgX2NtZCwgY21kX3NpemUpOwkvKiBQcmVwIGNvbW1hbmQgKi8KKwljbWQgPSBpMjQwMG0tPmJtX2NtZF9idWY7CisJaWYgKGNtZF9zaXplX2EgPiBjbWRfc2l6ZSkJCQkvKiBaZXJvIHBhZCBzcGFjZSAqLworCQltZW1zZXQoaTI0MDBtLT5ibV9jbWRfYnVmICsgY21kX3NpemUsIDAsIGNtZF9zaXplX2EgLSBjbWRfc2l6ZSk7CisJaWYgKChmbGFncyAmIEkyNDAwTV9CTV9DTURfUkFXKSA9PSAwKSB7CisJCWlmIChXQVJOX09OKGkyNDAwbV9icmhfZ2V0X3Jlc3BvbnNlX3JlcXVpcmVkKGNtZCkgPT0gMCkpCisJCQlkZXZfd2FybihkZXYsICJTVyBCVUc6IHJlc3BvbnNlX3JlcXVpcmVkID09IDBcbiIpOworCQlpMjQwMG1fYm1fY21kX3ByZXBhcmUoY21kKTsKKwl9CisJZF9wcmludGYoNCwgZGV2LCAiQk0gY21kICVkOiAlenUgYnl0ZXMgKCV6dSBwYWRkZWQpXG4iLAorCQkgb3Bjb2RlLCBjbWRfc2l6ZSwgY21kX3NpemVfYSk7CisJZF9kdW1wKDUsIGRldiwgY21kLCBjbWRfc2l6ZSk7CisKKwlzZGlvX2NsYWltX2hvc3QoaTI0MDBtcy0+ZnVuYyk7CQkJLyogU2VuZCAmIGNoZWNrICovCisJcmVzdWx0ID0gc2Rpb19tZW1jcHlfdG9pbyhpMjQwMG1zLT5mdW5jLCBJMjQwME1TX0RBVEFfQUREUiwKKwkJCQkgIGkyNDAwbS0+Ym1fY21kX2J1ZiwgY21kX3NpemVfYSk7CisJc2Rpb19yZWxlYXNlX2hvc3QoaTI0MDBtcy0+ZnVuYyk7CisJaWYgKHJlc3VsdCA8IDApIHsKKwkJZGV2X2VycihkZXYsICJCTSBjbWQgJWQ6IGNhbm5vdCBzZW5kOiAlbGRcbiIsCisJCQlvcGNvZGUsIChsb25nKSByZXN1bHQpOworCQlnb3RvIGVycm9yX2NtZF9zZW5kOworCX0KKwlyZXN1bHQgPSBjbWRfc2l6ZTsKK2Vycm9yX2NtZF9zZW5kOgorZXJyb3JfdG9vX2JpZzoKKwlkX2ZuZW5kKDUsIGRldiwgIihpMjQwMG0gJXAgY21kICVwIHNpemUgJXp1KSA9ICVkXG4iLAorCQlpMjQwMG0sIF9jbWQsIGNtZF9zaXplLCAoaW50KSByZXN1bHQpOworCXJldHVybiByZXN1bHQ7Cit9CisKKworLyoKKyAqIFJlYWQgYW4gYWNrIGZyb20gdGhlIGRldmljZSdzIGJvb3QtbW9kZSAocG9sbGluZykKKyAqCisgKiBAaTI0MDBtOgorICogQF9hY2s6IHBvaW50ZXIgdG8gd2hlcmUgdG8gc3RvcmUgdGhlIHJlYWQgZGF0YQorICogQGFja19zaXplOiBob3cgbWFueSBieXRlcyB3ZSBzaG91bGQgcmVhZAorICoKKyAqIFJldHVybnM6IDwgMCBlcnJubyBjb2RlIG9uIGVycm9yOyBvdGhlcndpc2UsIGFtb3VudCBvZiByZWNlaXZlZCBieXRlcy4KKyAqCisgKiBUaGUgQUNLIGZvciBhIEJNIGNvbW1hbmQgaXMgYWx3YXlzIGF0IGxlYXN0IHNpemVvZigqYWNrKSBieXRlcywgc28KKyAqIGNoZWNrIGZvciB0aGF0LiBXZSBkb24ndCBuZWVkIHRvIGNoZWNrIGZvciBkZXZpY2UgcmVib290cworICoKKyAqIE5PVEU6IFdlIGRvIGFuIGFydGlmaWNpYWwgdGltZW91dCBvZiAxIHNlYyBvdmVyIHRoZSBTRElPIHRpbWVvdXQ7CisgKiAgICAgdGhpcyB3YXkgd2UgaGF2ZSBjb250cm9sIG92ZXIgaXQuLi50aGVyZSBpcyBubyB3YXkgdGhhdCBJIGtub3cKKyAqICAgICBvZiBzZXR0aW5nIGFuIFNESU8gdHJhbnNhY3Rpb24gdGltZW91dC4KKyAqLworc3NpemVfdCBpMjQwMG1zX2J1c19ibV93YWl0X2Zvcl9hY2soc3RydWN0IGkyNDAwbSAqaTI0MDBtLAorCQkJCSAgICBzdHJ1Y3QgaTI0MDBtX2Jvb3Ryb21faGVhZGVyICphY2ssCisJCQkJICAgIHNpemVfdCBhY2tfc2l6ZSkKK3sKKwlpbnQgcmVzdWx0OworCXNzaXplX3Qgcnhfc2l6ZTsKKwl1NjQgdGltZW91dDsKKwlzdHJ1Y3QgaTI0MDBtcyAqaTI0MDBtcyA9IGNvbnRhaW5lcl9vZihpMjQwMG0sIHN0cnVjdCBpMjQwMG1zLCBpMjQwMG0pOworCXN0cnVjdCBzZGlvX2Z1bmMgKmZ1bmMgPSBpMjQwMG1zLT5mdW5jOworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZmdW5jLT5kZXY7CisKKwlCVUdfT04oc2l6ZW9mKCphY2spID4gYWNrX3NpemUpOworCisJZF9mbnN0YXJ0KDUsIGRldiwgIihpMjQwMG0gJXAgYWNrICVwIHNpemUgJXp1KVxuIiwKKwkJICBpMjQwMG0sIGFjaywgYWNrX3NpemUpOworCisJdGltZW91dCA9IGdldF9qaWZmaWVzXzY0KCkgKyAyICogSFo7CisJc2Rpb19jbGFpbV9ob3N0KGZ1bmMpOworCXdoaWxlICgxKSB7CisJCWlmICh0aW1lX2FmdGVyNjQoZ2V0X2ppZmZpZXNfNjQoKSwgdGltZW91dCkpIHsKKwkJCXJ4X3NpemUgPSAtRVRJTUVET1VUOworCQkJZGV2X2VycihkZXYsICJ0aW1lb3V0IHdhaXRpbmcgZm9yIGFjayBkYXRhXG4iKTsKKwkJCWdvdG8gZXJyb3JfdGltZWRvdXQ7CisJCX0KKworCQkvKiBGaW5kIHRoZSBSWCBzaXplLCBjaGVjayBpZiBpdCBmaXRzIG9yIG5vdCAtLSBpdCBpZgorCQkgKiBkb2Vzbid0IGZpdCwgZmFpbCwgYXMgd2UgaGF2ZSBubyB3YXkgdG8gZGlzcG9zZSBvZgorCQkgKiB0aGUgZXh0cmEgZGF0YS4gKi8KKwkJcnhfc2l6ZSA9IF9faTI0MDBtc19yeF9nZXRfc2l6ZShpMjQwMG1zKTsKKwkJaWYgKHJ4X3NpemUgPCAwKQorCQkJZ290byBlcnJvcl9yeF9nZXRfc2l6ZTsKKwkJcmVzdWx0ID0gLUVOT1NQQzsJCS8qIENoZWNrIGl0IGZpdHMgKi8KKwkJaWYgKHJ4X3NpemUgPCBzaXplb2YoKmFjaykpIHsKKwkJCXJ4X3NpemUgPSAtRUlPOworCQkJZGV2X2VycihkZXYsICJIVyBCVUc/IHJlY2VpdmVkIGlzIHRvbyBzbWFsbCAoJXp1IHZzICIKKwkJCQkiJXp1IG5lZWRlZClcbiIsIHNpemVvZigqYWNrKSwgcnhfc2l6ZSk7CisJCQlnb3RvIGVycm9yX3Rvb19zbWFsbDsKKwkJfQorCQlpZiAocnhfc2l6ZSA+IEkyNDAwTV9CTV9BQ0tfQlVGX1NJWkUpIHsKKwkJCWRldl9lcnIoZGV2LCAiU1cgQlVHPyBCTV9BQ0tfQlVGIGlzIHRvbyBzbWFsbCAoJXUgdnMgIgorCQkJCSIlenUgbmVlZGVkKVxuIiwgSTI0MDBNX0JNX0FDS19CVUZfU0laRSwKKwkJCQlyeF9zaXplKTsKKwkJCWdvdG8gZXJyb3JfdG9vX3NtYWxsOworCQl9CisKKwkJLyogUmVhZCBpdCAqLworCQlyZXN1bHQgPSBzZGlvX21lbWNweV9mcm9taW8oZnVuYywgaTI0MDBtLT5ibV9hY2tfYnVmLAorCQkJCQkgICAgSTI0MDBNU19EQVRBX0FERFIsIHJ4X3NpemUpOworCQlpZiAocmVzdWx0ID09IC1FVElNRURPVVQgfHwgcmVzdWx0ID09IC1FVElNRSkKKwkJCWNvbnRpbnVlOworCQlpZiAocmVzdWx0IDwgMCkgeworCQkJZGV2X2VycihkZXYsICJCTSBTRElPIHJlY2VpdmUgKCV6dSBCKSBmYWlsZWQ6ICVkXG4iLAorCQkJCXJ4X3NpemUsIHJlc3VsdCk7CisJCQlnb3RvIGVycm9yX3JlYWQ7CisJCX0gZWxzZQorCQkJYnJlYWs7CisJfQorCXJ4X3NpemUgPSBtaW4oKHNzaXplX3QpYWNrX3NpemUsIHJ4X3NpemUpOworCW1lbWNweShhY2ssIGkyNDAwbS0+Ym1fYWNrX2J1Ziwgcnhfc2l6ZSk7CitlcnJvcl9yZWFkOgorZXJyb3JfdG9vX3NtYWxsOgorZXJyb3JfcnhfZ2V0X3NpemU6CitlcnJvcl90aW1lZG91dDoKKwlzZGlvX3JlbGVhc2VfaG9zdChmdW5jKTsKKwlkX2ZuZW5kKDUsIGRldiwgIihpMjQwMG0gJXAgYWNrICVwIHNpemUgJXp1KSA9ICVsZFxuIiwKKwkJaTI0MDBtLCBhY2ssIGFja19zaXplLCAobG9uZykgcnhfc2l6ZSk7CisJcmV0dXJuIHJ4X3NpemU7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aW1heC9pMjQwMG0vc2Rpby1yeC5jIGIvZHJpdmVycy9uZXQvd2ltYXgvaTI0MDBtL3NkaW8tcnguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzAwOGI5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2ltYXgvaTI0MDBtL3NkaW8tcnguYwpAQCAtMCwwICsxLDI1NSBAQAorLyoKKyAqIEludGVsIFdpcmVsZXNzIFdpTUFYIENvbm5lY3Rpb24gMjQwMG0KKyAqIFNESU8gUlggaGFuZGxpbmcKKyAqCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgIGRpc3RyaWJ1dGlvbi4KKyAqICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEludGVsIENvcnBvcmF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICoKKyAqIEludGVsIENvcnBvcmF0aW9uIDxsaW51eC13aW1heEBpbnRlbC5jb20+CisgKiBEaXJrIEJyYW5kZXdpZSA8ZGlyay5qLmJyYW5kZXdpZUBpbnRlbC5jb20+CisgKiAgLSBJbml0aWFsIGltcGxlbWVudGF0aW9uCisgKgorICoKKyAqIFRoaXMgaGFuZGxlcyB0aGUgUlggcGF0aCBvbiBTRElPLgorICoKKyAqIFRoZSBTRElPIGJ1cyBkcml2ZXIgY2FsbHMgdGhlICJpcnEiIHJvdXRpbmUgd2hlbiBkYXRhIGlzIGF2YWlsYWJsZS4KKyAqIFRoaXMgaXMgbm90IGEgdHJhZGl0aW9uYWwgaW50ZXJydXB0IHJvdXRpbmUgc2luY2UgdGhlIFNESU8gYnVzCisgKiBkcml2ZXIgY2FsbHMgdXMgZnJvbSBpdHMgaXJxIHRocmVhZCBjb250ZXh0LiAgQmVjYXVzZSBvZiB0aGlzCisgKiBzbGVlcGluZyBpbiB0aGUgU0RJTyBSWCBJUlEgcm91dGluZSBpcyBva2F5LgorICoKKyAqIEZyb20gdGhlcmUgb24sIHdlIG9idGFpbiB0aGUgc2l6ZSBvZiB0aGUgZGF0YSB0aGF0IGlzIGF2YWlsYWJsZSwKKyAqIGFsbG9jYXRlIGFuIHNrYiwgY29weSBpdCBhbmQgdGhlbiBwYXNzIGl0IHRvIHRoZSBnZW5lcmljIGRyaXZlcidzCisgKiBSWCByb3V0aW5lIFtpMjQwMG1fcngoKV0uCisgKgorICogUk9BRE1BUAorICoKKyAqIGkyNDAwbXNfaXJxKCkKKyAqICAgaTI0MDBtc19yeCgpCisgKiAgICAgX19pMjQwMG1zX3J4X2dldF9zaXplKCkKKyAqICAgICBpMjQwMG1fcngoKQorICoKKyAqIGkyNDAwbXNfcnhfc2V0dXAoKQorICoKKyAqIGkyNDAwbXNfcnhfcmVsZWFzZSgpCisgKi8KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvbW1jL3NkaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9tbWMvc2Rpb19mdW5jLmg+CisjaW5jbHVkZSAiaTI0MDBtLXNkaW8uaCIKKworI2RlZmluZSBEX1NVQk1PRFVMRSByeAorI2luY2x1ZGUgInNkaW8tZGVidWctbGV2ZWxzLmgiCisKKworLyoKKyAqIFJlYWQgYW5kIHJldHVybiB0aGUgYW1vdW50IG9mIGJ5dGVzIGF2YWlsYWJsZSBmb3IgUlgKKyAqCisgKiBUaGUgUlggc2l6ZSBoYXMgdG8gYmUgcmVhZCBsaWtlIHRoaXM6IGJ5dGUgcmVhZHMgb2YgdGhyZWUKKyAqIHNlcXVlbnRpYWwgbG9jYXRpb25zOyB0aGVuIGdsdWUnZW0gdG9nZXRoZXIuCisgKgorICogc2Rpb19yZWFkbCgpIGRvZXNuJ3Qgd29yay4KKyAqLworc3NpemVfdCBfX2kyNDAwbXNfcnhfZ2V0X3NpemUoc3RydWN0IGkyNDAwbXMgKmkyNDAwbXMpCit7CisJaW50IHJldCwgY250LCB2YWw7CisJc3NpemVfdCByeF9zaXplOworCXVuc2lnbmVkIHhmZXJfc2l6ZV9hZGRyOworCXN0cnVjdCBzZGlvX2Z1bmMgKmZ1bmMgPSBpMjQwMG1zLT5mdW5jOworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZpMjQwMG1zLT5mdW5jLT5kZXY7CisKKwlkX2Zuc3RhcnQoNywgZGV2LCAiKGkyNDAwbXMgJXApXG4iLCBpMjQwMG1zKTsKKwl4ZmVyX3NpemVfYWRkciA9IEkyNDAwTVNfSU5UUl9HRVRfU0laRV9BRERSOworCXJ4X3NpemUgPSAwOworCWZvciAoY250ID0gMDsgY250IDwgMzsgY250KyspIHsKKwkJdmFsID0gc2Rpb19yZWFkYihmdW5jLCB4ZmVyX3NpemVfYWRkciArIGNudCwgJnJldCk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlkZXZfZXJyKGRldiwgIlJYOiBDYW4ndCByZWFkIGJ5dGUgJWQgb2YgUlggc2l6ZSBmcm9tICIKKwkJCQkiMHglMDh4OiAlZFxuIiwgY250LCB4ZmVyX3NpemVfYWRkciArIGNudCwgcmV0KTsKKwkJCXJ4X3NpemUgPSByZXQ7CisJCQlnb3RvIGVycm9yX3JlYWQ7CisJCX0KKwkJcnhfc2l6ZSA9IHJ4X3NpemUgPDwgOCB8ICh2YWwgJiAweGZmKTsKKwl9CisJZF9wcmludGYoNiwgZGV2LCAiUlg6IHJ4X3NpemUgaXMgJWxkXG4iLCAobG9uZykgcnhfc2l6ZSk7CitlcnJvcl9yZWFkOgorCWRfZm5lbmQoNywgZGV2LCAiKGkyNDAwbXMgJXApID0gJWxkXG4iLCBpMjQwMG1zLCAobG9uZykgcnhfc2l6ZSk7CisJcmV0dXJuIHJ4X3NpemU7Cit9CisKKworLyoKKyAqIFJlYWQgZGF0YSBmcm9tIHRoZSBkZXZpY2UgKHdoZW4gaW4gbm9ybWFsKQorICoKKyAqIEFsbG9jYXRlIGFuIFNLQiBvZiB0aGUgcmlnaHQgc2l6ZSwgcmVhZCB0aGUgZGF0YSBpbiBhbmQgdGhlbgorICogZGVsaXZlciBpdCB0byB0aGUgZ2VuZXJpYyBsYXllci4KKyAqCisgKiBXZSBhbHNvIGNoZWNrIGZvciBhIHJlYm9vdCBiYXJrZXIuIFRoYXQgbWVhbnMgdGhlIGRldmljZSBkaWVkIGFuZAorICogd2UgaGF2ZSB0byByZWJvb3QgaXQuCisgKi8KK3N0YXRpYwordm9pZCBpMjQwMG1zX3J4KHN0cnVjdCBpMjQwMG1zICppMjQwMG1zKQoreworCWludCByZXQ7CisJc3RydWN0IHNkaW9fZnVuYyAqZnVuYyA9IGkyNDAwbXMtPmZ1bmM7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJmZ1bmMtPmRldjsKKwlzdHJ1Y3QgaTI0MDBtICppMjQwMG0gPSAmaTI0MDBtcy0+aTI0MDBtOworCXN0cnVjdCBza19idWZmICpza2I7CisJc3NpemVfdCByeF9zaXplOworCisJZF9mbnN0YXJ0KDcsIGRldiwgIihpMjQwMG1zICVwKVxuIiwgaTI0MDBtcyk7CisJcnhfc2l6ZSA9IF9faTI0MDBtc19yeF9nZXRfc2l6ZShpMjQwMG1zKTsKKwlpZiAocnhfc2l6ZSA8IDApIHsKKwkJcmV0ID0gcnhfc2l6ZTsKKwkJZ290byBlcnJvcl9nZXRfc2l6ZTsKKwl9CisJcmV0ID0gLUVOT01FTTsKKwlza2IgPSBhbGxvY19za2Iocnhfc2l6ZSwgR0ZQX0FUT01JQyk7CisJaWYgKE5VTEwgPT0gc2tiKSB7CisJCWRldl9lcnIoZGV2LCAiUlg6IHVuYWJsZSB0byBhbGxvYyBza2JcbiIpOworCQlnb3RvIGVycm9yX2FsbG9jX3NrYjsKKwl9CisKKwlyZXQgPSBzZGlvX21lbWNweV9mcm9taW8oZnVuYywgc2tiLT5kYXRhLAorCQkJCSBJMjQwME1TX0RBVEFfQUREUiwgcnhfc2l6ZSk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycihkZXYsICJSWDogU0RJTyBkYXRhIHJlYWQgZmFpbGVkOiAlZFxuIiwgcmV0KTsKKwkJZ290byBlcnJvcl9tZW1jcHlfZnJvbWlvOworCX0KKwkvKiBDaGVjayBpZiBkZXZpY2UgaGFzIHJlc2V0ICovCisJaWYgKCFtZW1jbXAoc2tiLT5kYXRhLCBpMjQwMG1fTkJPT1RfQkFSS0VSLAorCQkgICAgc2l6ZW9mKGkyNDAwbV9OQk9PVF9CQVJLRVIpKQorCSAgICB8fCAhbWVtY21wKHNrYi0+ZGF0YSwgaTI0MDBtX1NCT09UX0JBUktFUiwKKwkJICAgICAgIHNpemVvZihpMjQwMG1fU0JPT1RfQkFSS0VSKSkpIHsKKwkJcmV0ID0gaTI0MDBtX2Rldl9yZXNldF9oYW5kbGUoaTI0MDBtKTsKKwkJa2ZyZWVfc2tiKHNrYik7CisJfSBlbHNlIHsKKwkJc2tiX3B1dChza2IsIHJ4X3NpemUpOworCQlpMjQwMG1fcngoaTI0MDBtLCBza2IpOworCX0KKwlkX2ZuZW5kKDcsIGRldiwgIihpMjQwMG1zICVwKSA9IHZvaWRcbiIsIGkyNDAwbXMpOworCXJldHVybjsKKworZXJyb3JfbWVtY3B5X2Zyb21pbzoKKwlrZnJlZV9za2Ioc2tiKTsKK2Vycm9yX2FsbG9jX3NrYjoKK2Vycm9yX2dldF9zaXplOgorCWRfZm5lbmQoNywgZGV2LCAiKGkyNDAwbXMgJXApID0gJWRcbiIsIGkyNDAwbXMsIHJldCk7CisJcmV0dXJuOworfQorCisKKy8qCisgKiBQcm9jZXNzIGFuIGludGVycnVwdCBmcm9tIHRoZSBTRElPIGNhcmQKKyAqCisgKiBGSVhNRTogbmVlZCB0byBwcm9jZXNzIG90aGVyIGV2ZW50cyB0aGF0IGFyZSBub3QganVzdCByZWFkeS10by1yZWFkCisgKgorICogQ2hlY2tzIHRoZXJlIGlzIGRhdGEgcmVhZHkgYW5kIHRoZW4gcHJvY2VlZHMgdG8gcmVhZCBpdC4KKyAqLworc3RhdGljCit2b2lkIGkyNDAwbXNfaXJxKHN0cnVjdCBzZGlvX2Z1bmMgKmZ1bmMpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgaTI0MDBtcyAqaTI0MDBtcyA9IHNkaW9fZ2V0X2RydmRhdGEoZnVuYyk7CisJc3RydWN0IGkyNDAwbSAqaTI0MDBtID0gJmkyNDAwbXMtPmkyNDAwbTsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmZnVuYy0+ZGV2OworCWludCB2YWw7CisKKwlkX2Zuc3RhcnQoNiwgZGV2LCAiKGkyNDAwbXMgJXApXG4iLCBpMjQwMG1zKTsKKwl2YWwgPSBzZGlvX3JlYWRiKGZ1bmMsIEkyNDAwTVNfSU5UUl9TVEFUVVNfQUREUiwgJnJldCk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycihkZXYsICJSWDogQ2FuJ3QgcmVhZCBpbnRlcnJ1cHQgc3RhdHVzOiAlZFxuIiwgcmV0KTsKKwkJZ290byBlcnJvcl9ub19pcnE7CisJfQorCWlmICghdmFsKSB7CisJCWRldl9lcnIoZGV2LCAiUlg6IEJVRz8gZ290IElSUSBidXQgbm8gaW50ZXJydXB0IHJlYWR5P1xuIik7CisJCWdvdG8gZXJyb3Jfbm9faXJxOworCX0KKwlzZGlvX3dyaXRlYihmdW5jLCAxLCBJMjQwME1TX0lOVFJfQ0xFQVJfQUREUiwgJnJldCk7CisJaWYgKFdBUk5fT04oaTI0MDBtLT5ib290X21vZGUgIT0gMCkpCisJCWRldl9lcnIoZGV2LCAiUlg6IFNXIEJVRz8gYm9vdCBtb2RlIGFuZCBJUlEgaXMgdXA/XG4iKTsKKwllbHNlCisJCWkyNDAwbXNfcngoaTI0MDBtcyk7CitlcnJvcl9ub19pcnE6CisJZF9mbmVuZCg2LCBkZXYsICIoaTI0MDBtcyAlcCkgPSB2b2lkXG4iLCBpMjQwMG1zKTsKKwlyZXR1cm47Cit9CisKKworLyoKKyAqIFNldHVwIFNESU8gUlgKKyAqCisgKiBIb29rcyB1cCB0aGUgSVJRIGhhbmRsZXIgYW5kIHRoZW4gZW5hYmxlcyBJUlFzLgorICovCitpbnQgaTI0MDBtc19yeF9zZXR1cChzdHJ1Y3QgaTI0MDBtcyAqaTI0MDBtcykKK3sKKwlpbnQgcmVzdWx0OworCXN0cnVjdCBzZGlvX2Z1bmMgKmZ1bmMgPSBpMjQwMG1zLT5mdW5jOworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZmdW5jLT5kZXY7CisKKwlkX2Zuc3RhcnQoNSwgZGV2LCAiKGkyNDAwbXMgJXApXG4iLCBpMjQwMG1zKTsKKwlzZGlvX2NsYWltX2hvc3QoZnVuYyk7CisJcmVzdWx0ID0gc2Rpb19jbGFpbV9pcnEoZnVuYywgaTI0MDBtc19pcnEpOworCWlmIChyZXN1bHQgPCAwKSB7CisJCWRldl9lcnIoZGV2LCAiQ2Fubm90IGNsYWltIElSUTogJWRcbiIsIHJlc3VsdCk7CisJCWdvdG8gZXJyb3JfaXJxX2NsYWltOworCX0KKwlyZXN1bHQgPSAwOworCXNkaW9fd3JpdGViKGZ1bmMsIDEsIEkyNDAwTVNfSU5UUl9FTkFCTEVfQUREUiwgJnJlc3VsdCk7CisJaWYgKHJlc3VsdCA8IDApIHsKKwkJc2Rpb19yZWxlYXNlX2lycShmdW5jKTsKKwkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gZW5hYmxlIGludGVycnVwdHMgJWRcbiIsIHJlc3VsdCk7CisJfQorZXJyb3JfaXJxX2NsYWltOgorCXNkaW9fcmVsZWFzZV9ob3N0KGZ1bmMpOworCWRfZm5lbmQoNSwgZGV2LCAiKGkyNDAwbXMgJXApID0gJWRcbiIsIGkyNDAwbXMsIHJlc3VsdCk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworCisvKgorICogVGVhciBkb3duIFNESU8gUlgKKyAqCisgKiBEaXNhYmxlcyBJUlFzIGluIHRoZSBkZXZpY2UgYW5kIHJlbW92ZXMgdGhlIElSUSBoYW5kbGVyLgorICovCit2b2lkIGkyNDAwbXNfcnhfcmVsZWFzZShzdHJ1Y3QgaTI0MDBtcyAqaTI0MDBtcykKK3sKKwlpbnQgcmVzdWx0OworCXN0cnVjdCBzZGlvX2Z1bmMgKmZ1bmMgPSBpMjQwMG1zLT5mdW5jOworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZmdW5jLT5kZXY7CisKKwlkX2Zuc3RhcnQoNSwgZGV2LCAiKGkyNDAwbXMgJXApXG4iLCBpMjQwMG1zKTsKKwlzZGlvX2NsYWltX2hvc3QoZnVuYyk7CisJc2Rpb193cml0ZWIoZnVuYywgMCwgSTI0MDBNU19JTlRSX0VOQUJMRV9BRERSLCAmcmVzdWx0KTsKKwlzZGlvX3JlbGVhc2VfaXJxKGZ1bmMpOworCXNkaW9fcmVsZWFzZV9ob3N0KGZ1bmMpOworCWRfZm5lbmQoNSwgZGV2LCAiKGkyNDAwbXMgJXApID0gJWRcbiIsIGkyNDAwbXMsIHJlc3VsdCk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aW1heC9pMjQwMG0vc2Rpby10eC5jIGIvZHJpdmVycy9uZXQvd2ltYXgvaTI0MDBtL3NkaW8tdHguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTA1YTVlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2ltYXgvaTI0MDBtL3NkaW8tdHguYwpAQCAtMCwwICsxLDE1MyBAQAorLyoKKyAqIEludGVsIFdpcmVsZXNzIFdpTUFYIENvbm5lY3Rpb24gMjQwMG0KKyAqIFNESU8gVFggdHJhbnNhY3Rpb24gYmFja2VuZHMKKyAqCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgIGRpc3RyaWJ1dGlvbi4KKyAqICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEludGVsIENvcnBvcmF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICoKKyAqIEludGVsIENvcnBvcmF0aW9uIDxsaW51eC13aW1heEBpbnRlbC5jb20+CisgKiBEaXJrIEJyYW5kZXdpZSA8ZGlyay5qLmJyYW5kZXdpZUBpbnRlbC5jb20+CisgKiAgLSBJbml0aWFsIGltcGxlbWVudGF0aW9uCisgKgorICoKKyAqIFRha2VzIHRoZSBUWCBtZXNzYWdlcyBpbiB0aGUgaTI0MDBtJ3MgZHJpdmVyIFRYIEZJRk8gYW5kIHNlbmRzIHRoZW0KKyAqIHRvIHRoZSBkZXZpY2UgdW50aWwgdGhlcmUgYXJlIG5vIG1vcmUuCisgKgorICogSWYgd2UgZmFpbCBzZW5kaW5nIHRoZSBtZXNzYWdlLCB3ZSBqdXN0IGRyb3AgaXQuIFRoZXJlIGlzbid0IG11Y2gKKyAqIHdlIGNhbiBkbyBhdCB0aGlzIHBvaW50LiBNb3N0IG9mIHRoZSB0cmFmZmljIGlzIG5ldHdvcmssIHdoaWNoIGhhcworICogcmVjb3ZlcnkgbWV0aG9kcyBmb3IgZHJvcHBlZCBwYWNrZXRzLgorICoKKyAqIFRoZSBTRElPIGZ1bmN0aW9ucyBhcmUgbm90IGF0b21pYywgc28gd2UgY2FuJ3QgcnVuIGZyb20gdGhlIGNvbnRleHQKKyAqIHdoZXJlIGkyNDAwbS0+YnVzX3R4X2tpY2soKSBbaTI0MDBtc19idXNfdHhfa2ljaygpXSBpcyBiZWluZyBjYWxsZWQKKyAqIChzb21lIHRpbWVzIGF0b21pYykuIFRodXMsIHRoZSBhY3R1YWwgVFggd29yayBpcyBkZWZlcnJlZCB0byBhCisgKiB3b3JrcXVldWUuCisgKgorICogUk9BRE1BUAorICoKKyAqIGkyNDAwbXNfYnVzX3R4X2tpY2soKQorICogICBpMjQwMG1zX3R4X3N1Ym1pdCgpICAgICBbdGhyb3VnaCB3b3JrcXVldWVdCisgKgorICogaTI0MDBtX3R4X3NldHVwKCkKKyAqCisgKiBpMjQwMG1fdHhfcmVsZWFzZSgpCisgKi8KKyNpbmNsdWRlIDxsaW51eC9tbWMvc2Rpb19mdW5jLmg+CisjaW5jbHVkZSAiaTI0MDBtLXNkaW8uaCIKKworI2RlZmluZSBEX1NVQk1PRFVMRSB0eAorI2luY2x1ZGUgInNkaW8tZGVidWctbGV2ZWxzLmgiCisKKworLyoKKyAqIFB1bGwgVFggdHJhbnNhdGlvbnMgZnJvbSB0aGUgVFggRklGTyBhbmQgc2VuZCB0aGVtIHRvIHRoZSBkZXZpY2UKKyAqIHVudGlsIHRoZXJlIGFyZSBubyBtb3JlLgorICovCitzdGF0aWMKK3ZvaWQgaTI0MDBtc190eF9zdWJtaXQoc3RydWN0IHdvcmtfc3RydWN0ICp3cykKK3sKKwlpbnQgcmVzdWx0OworCXN0cnVjdCBpMjQwMG1zICppMjQwMG1zID0gY29udGFpbmVyX29mKHdzLCBzdHJ1Y3QgaTI0MDBtcywgdHhfd29ya2VyKTsKKwlzdHJ1Y3QgaTI0MDBtICppMjQwMG0gPSAmaTI0MDBtcy0+aTI0MDBtOworCXN0cnVjdCBzZGlvX2Z1bmMgKmZ1bmMgPSBpMjQwMG1zLT5mdW5jOworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZmdW5jLT5kZXY7CisJc3RydWN0IGkyNDAwbV9tc2dfaGRyICp0eF9tc2c7CisJc2l6ZV90IHR4X21zZ19zaXplOworCisJZF9mbnN0YXJ0KDQsIGRldiwgIihpMjQwMG1zICVwLCBpMjQwMG0gJXApXG4iLCBpMjQwMG1zLCBpMjQwMG1zKTsKKworCXdoaWxlIChOVUxMICE9ICh0eF9tc2cgPSBpMjQwMG1fdHhfbXNnX2dldChpMjQwMG0sICZ0eF9tc2dfc2l6ZSkpKSB7CisJCWRfcHJpbnRmKDIsIGRldiwgIlRYOiBzdWJtaXR0aW5nICV6dSBieXRlc1xuIiwgdHhfbXNnX3NpemUpOworCQlkX2R1bXAoNSwgZGV2LCB0eF9tc2csIHR4X21zZ19zaXplKTsKKworCQlzZGlvX2NsYWltX2hvc3QoZnVuYyk7CisJCXJlc3VsdCA9IHNkaW9fbWVtY3B5X3RvaW8oZnVuYywgMCwgdHhfbXNnLCB0eF9tc2dfc2l6ZSk7CisJCXNkaW9fcmVsZWFzZV9ob3N0KGZ1bmMpOworCisJCWkyNDAwbV90eF9tc2dfc2VudChpMjQwMG0pOworCisJCWlmIChyZXN1bHQgPCAwKSB7CisJCQlkZXZfZXJyKGRldiwgIlRYOiBjYW5ub3Qgc3VibWl0IFRYOyB0eF9tc2cgQCV6dSAlenUgQjoiCisJCQkJIiAlZFxuIiwgKHZvaWQgKikgdHhfbXNnIC0gaTI0MDBtLT50eF9idWYsCisJCQkJdHhfbXNnX3NpemUsIHJlc3VsdCk7CisJCX0KKworCQlkX3ByaW50ZigyLCBkZXYsICJUWDogJXp1YiBzdWJtaXR0ZWRcbiIsIHR4X21zZ19zaXplKTsKKwl9CisKKwlkX2ZuZW5kKDQsIGRldiwgIihpMjQwMG1zICVwKSA9IHZvaWRcbiIsIGkyNDAwbXMpOworfQorCisKKy8qCisgKiBUaGUgZ2VuZXJpYyBkcml2ZXIgbm90aWZpZXMgdXMgdGhhdCB0aGVyZSBpcyBkYXRhIHJlYWR5IGZvciBUWAorICoKKyAqIFNjaGVkdWxlIGEgcnVuIG9mIGkyNDAwbXNfdHhfc3VibWl0KCkgdG8gaGFuZGxlIGl0LgorICovCit2b2lkIGkyNDAwbXNfYnVzX3R4X2tpY2soc3RydWN0IGkyNDAwbSAqaTI0MDBtKQoreworCXN0cnVjdCBpMjQwMG1zICppMjQwMG1zID0gY29udGFpbmVyX29mKGkyNDAwbSwgc3RydWN0IGkyNDAwbXMsIGkyNDAwbSk7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJmkyNDAwbXMtPmZ1bmMtPmRldjsKKworCWRfZm5zdGFydCgzLCBkZXYsICIoaTI0MDBtICVwKSA9IHZvaWRcbiIsIGkyNDAwbSk7CisKKwkvKiBzY2hlZHVsZSB0eCB3b3JrLCB0aGlzIGlzIGJlY2F1c2UgdHggbWF5IGJsb2NrLCB0aGVyZWZvcmUKKwkgKiBpdCBoYXMgdG8gcnVuIGluIGEgdGhyZWFkIGNvbnRleHQuCisJICovCisJcXVldWVfd29yayhpMjQwMG1zLT50eF93b3JrcXVldWUsICZpMjQwMG1zLT50eF93b3JrZXIpOworCisJZF9mbmVuZCgzLCBkZXYsICIoaTI0MDBtICVwKSA9IHZvaWRcbiIsIGkyNDAwbSk7Cit9CisKK2ludCBpMjQwMG1zX3R4X3NldHVwKHN0cnVjdCBpMjQwMG1zICppMjQwMG1zKQoreworCWludCByZXN1bHQ7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJmkyNDAwbXMtPmZ1bmMtPmRldjsKKwlzdHJ1Y3QgaTI0MDBtICppMjQwMG0gPSAmaTI0MDBtcy0+aTI0MDBtOworCisJZF9mbnN0YXJ0KDUsIGRldiwgIihpMjQwMG1zICVwKVxuIiwgaTI0MDBtcyk7CisKKwlJTklUX1dPUksoJmkyNDAwbXMtPnR4X3dvcmtlciwgaTI0MDBtc190eF9zdWJtaXQpOworCXNucHJpbnRmKGkyNDAwbXMtPnR4X3dxX25hbWUsIHNpemVvZihpMjQwMG1zLT50eF93cV9uYW1lKSwKKwkJICIlcy10eCIsIGkyNDAwbS0+d2ltYXhfZGV2Lm5hbWUpOworCWkyNDAwbXMtPnR4X3dvcmtxdWV1ZSA9CisJCWNyZWF0ZV9zaW5nbGV0aHJlYWRfd29ya3F1ZXVlKGkyNDAwbXMtPnR4X3dxX25hbWUpOworCWlmIChOVUxMID09IGkyNDAwbXMtPnR4X3dvcmtxdWV1ZSkgeworCQlkZXZfZXJyKGRldiwgIlRYOiBmYWlsZWQgdG8gY3JlYXRlIHdvcmtxdWV1ZVxuIik7CisJCXJlc3VsdCA9IC1FTk9NRU07CisJfSBlbHNlCisJCXJlc3VsdCA9IDA7CisJZF9mbmVuZCg1LCBkZXYsICIoaTI0MDBtcyAlcCkgPSAlZFxuIiwgaTI0MDBtcywgcmVzdWx0KTsKKwlyZXR1cm4gcmVzdWx0OworfQorCit2b2lkIGkyNDAwbXNfdHhfcmVsZWFzZShzdHJ1Y3QgaTI0MDBtcyAqaTI0MDBtcykKK3sKKwlkZXN0cm95X3dvcmtxdWV1ZShpMjQwMG1zLT50eF93b3JrcXVldWUpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2ltYXgvaTI0MDBtL3NkaW8uYyBiL2RyaXZlcnMvbmV0L3dpbWF4L2kyNDAwbS9zZGlvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWJmYTI4MwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpbWF4L2kyNDAwbS9zZGlvLmMKQEAgLTAsMCArMSw1MTEgQEAKKy8qCisgKiBJbnRlbCBXaXJlbGVzcyBXaU1BWCBDb25uZWN0aW9uIDI0MDBtCisgKiBMaW51eCBkcml2ZXIgbW9kZWwgZ2x1ZSBmb3IgdGhlIFNESU8gZGV2aWNlLCByZXNldCAmIGZ3IHVwbG9hZAorICoKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBJbnRlbCBDb3Jwb3JhdGlvbiA8bGludXgtd2ltYXhAaW50ZWwuY29tPgorICogRGlyayBCcmFuZGV3aWUgPGRpcmsuai5icmFuZGV3aWVAaW50ZWwuY29tPgorICogSW5ha3kgUGVyZXotR29uemFsZXogPGluYWt5LnBlcmV6LWdvbnphbGV6QGludGVsLmNvbT4KKyAqIFlhbmlyIEx1YmV0a2luIDx5YW5pcngubHViZXRraW5AaW50ZWwuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEsIFVTQS4KKyAqCisgKgorICogU2VlIGkyNDAwbS1zZGlvLmggZm9yIGEgZ2VuZXJhbCBkZXNjcmlwdGlvbiBvZiB0aGlzIGRyaXZlci4KKyAqCisgKiBUaGlzIGZpbGUgaW1wbGVtZW50cyBkcml2ZXIgbW9kZWwgZ2x1ZSwgYW5kIGhvb2sgdXBzIGZvciB0aGUKKyAqIGdlbmVyaWMgZHJpdmVyIHRvIGltcGxlbWVudCB0aGUgYnVzLXNwZWNpZmljIGZ1bmN0aW9ucyAoZGV2aWNlCisgKiBjb21tdW5pY2F0aW9uIHNldHVwL3RlYXIgZG93biwgZmlybXdhcmUgdXBsb2FkIGFuZCByZXNldHRpbmcpLgorICoKKyAqIFJPQURNQVAKKyAqCisgKiBpMjQwMG1fcHJvYmUoKQorICogICBhbGxvY19uZXRkZXYoKQorICogICAgIGkyNDAwbXNfbmV0ZGV2X3NldHVwKCkKKyAqICAgICAgIGkyNDAwbXNfaW5pdCgpCisgKiAgICAgICBpMjQwMG1fbmV0ZGV2X3NldHVwKCkKKyAqICAgaTI0MDBtc19lbmFibGVfZnVuY3Rpb24oKQorICogICBpMjQwMG1fc2V0dXAoKQorICoKKyAqIGkyNDAwbV9yZW1vdmUoKQorICogICAgIGkyNDAwbV9yZWxlYXNlKCkKKyAqICAgICBmcmVlX25ldGRldihuZXRfZGV2KQorICoKKyAqIGkyNDAwbXNfYnVzX3Jlc2V0KCkgICAgICAgICAgICBDYWxsZWQgYnkgaTI0MDBtLT5idXNfcmVzZXQKKyAqICAgX19pMjQwMG1zX3Jlc2V0KCkKKyAqICAgICBfX2kyNDAwbXNfc2VuZF9iYXJrZXIoKQorICoKKyAqIGkyNDAwbXNfYnVzX2Rldl9zdGFydCgpICAgICAgICBDYWxsZWQgYnkgaTI0MDBtX2Rldl9zdGFydCgpIFt3aG8gaXMKKyAqICAgaTI0MDBtc190eF9zZXR1cCgpICAgICAgICAgICBjYWxsZWQgYnkgaTI0MDBtX3NldHVwKCldCisgKiAgIGkyNDAwbXNfcnhfc2V0dXAoKQorICoKKyAqIGkyNDAwbXNfYnVzX2Rldl9zdG9wKCkgICAgICAgICBDYWxsZWQgYnkgaTI0MDBtX2Rldl9zdG9wKCkgW3dobyBpcworICogICBpMjQwMG1zX3J4X3JlbGVhc2UoKSAgICAgICAgIGlzIGNhbGxlZCBieSBpMjQwMG1fcmVsZWFzZSgpXQorICogICBpMjQwMG1zX3R4X3JlbGVhc2UoKQorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgorI2luY2x1ZGUgPGxpbnV4L21tYy9zZGlvLmg+CisjaW5jbHVkZSA8bGludXgvbW1jL3NkaW9fZnVuYy5oPgorI2luY2x1ZGUgImkyNDAwbS1zZGlvLmgiCisjaW5jbHVkZSA8bGludXgvd2ltYXgvaTI0MDBtLmg+CisKKyNkZWZpbmUgRF9TVUJNT0RVTEUgbWFpbgorI2luY2x1ZGUgInNkaW8tZGVidWctbGV2ZWxzLmgiCisKKy8qIElPRSBXaU1BWCBmdW5jdGlvbiB0aW1lb3V0IGluIHNlY29uZHMgKi8KK3N0YXRpYyBpbnQgaW9lX3RpbWVvdXQgPSAyOworbW9kdWxlX3BhcmFtKGlvZV90aW1lb3V0LCBpbnQsIDApOworCisvKiBPdXIgZmlybXdhcmUgZmlsZSBuYW1lICovCisjZGVmaW5lIEkyNDAwTVNfRldfRklMRV9OQU1FICJpMjQwMG0tZnctc2Rpby0iIEkyNDAwTV9GV19WRVJTSU9OICIuc2JjZiIKKworLyoKKyAqIEVuYWJsZSB0aGUgU0RJTyBmdW5jdGlvbgorICoKKyAqIFRyaWVzIHRvIGVuYWJsZSB0aGUgU0RJTyBmdW5jdGlvbjsgbWlnaHQgZmFpbCBpZiBpdCBpcyBzdGlsbCBub3QKKyAqIHJlYWR5IChpbiBzb21lIGhhcmR3YXJlLCB0aGUgU0RJTyBXaU1BWCBmdW5jdGlvbiBpcyBvbmx5IGVuYWJsZWQKKyAqIHdoZW4gd2UgYXNrIGl0IHRvIGV4cGxpY2l0bHkgZG9pbmcpLiBUcmllcyB1bnRpbCBhIHRpbWVvdXQgaXMKKyAqIHJlYWNoZWQuCisgKgorICogVGhlIHJldmVyc2Ugb2YgdGhpcyBpcy4uLnNkaW9fZGlzYWJsZV9mdW5jdGlvbigpCisgKgorICogUmV0dXJuczogMCBpZiB0aGUgU0RJTyBmdW5jdGlvbiB3YXMgZW5hYmxlZCwgPCAwIGVycm5vIGNvZGUgb24KKyAqICAgICBlcnJvciAoLUVOT0RFViB3aGVuIGl0IHdhcyB1bmFibGUgdG8gZW5hYmxlIHRoZSBmdW5jdGlvbikuCisgKi8KK3N0YXRpYworaW50IGkyNDAwbXNfZW5hYmxlX2Z1bmN0aW9uKHN0cnVjdCBzZGlvX2Z1bmMgKmZ1bmMpCit7CisJdTY0IHRpbWVvdXQ7CisJaW50IGVycjsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmZnVuYy0+ZGV2OworCisJZF9mbnN0YXJ0KDMsIGRldiwgIihmdW5jICVwKVxuIiwgZnVuYyk7CisJLyogU2V0dXAgdGltZW91dCAoRklYTUU6IFRoaXMgbmVlZHMgdG8gcmVhZCB0aGUgQ0lTIHRhYmxlIHRvCisJICogZ2V0IGEgcmVhbCB0aW1lb3V0KSBhbmQgdGhlbiB3YWl0IGZvciB0aGUgZGV2aWNlIHRvIHNpZ25hbAorCSAqIGl0IGlzIHJlYWR5ICovCisJdGltZW91dCA9IGdldF9qaWZmaWVzXzY0KCkgKyBpb2VfdGltZW91dCAqIEhaOworCWVyciA9IC1FTk9ERVY7CisJd2hpbGUgKGVyciAhPSAwICYmIHRpbWVfYmVmb3JlNjQoZ2V0X2ppZmZpZXNfNjQoKSwgdGltZW91dCkpIHsKKwkJc2Rpb19jbGFpbV9ob3N0KGZ1bmMpOworCQllcnIgPSBzZGlvX2VuYWJsZV9mdW5jKGZ1bmMpOworCQlpZiAoMCA9PSBlcnIpIHsKKwkJCXNkaW9fcmVsZWFzZV9ob3N0KGZ1bmMpOworCQkJZF9wcmludGYoMiwgZGV2LCAiU0RJTyBmdW5jdGlvbiBlbmFibGVkXG4iKTsKKwkJCWdvdG8gZnVuY3Rpb25fZW5hYmxlZDsKKwkJfQorCQlkX3ByaW50ZigyLCBkZXYsICJTRElPIGZ1bmN0aW9uIGZhaWxlZCB0byBlbmFibGU6ICVkXG4iLCBlcnIpOworCQlzZGlvX2Rpc2FibGVfZnVuYyhmdW5jKTsKKwkJc2Rpb19yZWxlYXNlX2hvc3QoZnVuYyk7CisJCW1zbGVlcChJMjQwME1TX0lOSVRfU0xFRVBfSU5URVJWQUwpOworCX0KKwkvKiBJZiB0aW1lZCBvdXQsIGRldmljZSBpcyBub3QgdGhlcmUgeWV0IC0tIGdldCAtRU5PREVWIHNvCisJICogdGhlIGRldmljZSBkcml2ZXIgY29yZSB3aWxsIHJldHJ5IGxhdGVyIG9uLiAqLworCWlmIChlcnIgPT0gLUVUSU1FKSB7CisJCWRldl9lcnIoZGV2LCAiQ2FuJ3QgZW5hYmxlIFdpTUFYIGZ1bmN0aW9uOyAiCisJCQkiIGhhcyB0aGUgZnVuY3Rpb24gYmVlbiBlbmFibGVkP1xuIik7CisJCWVyciA9IC1FTk9ERVY7CisJfQorZnVuY3Rpb25fZW5hYmxlZDoKKwlkX2ZuZW5kKDMsIGRldiwgIihmdW5jICVwKSA9ICVkXG4iLCBmdW5jLCBlcnIpOworCXJldHVybiBlcnI7Cit9CisKKworLyoKKyAqIFNldHVwIGRyaXZlciByZXNvdXJjZXMgbmVlZGVkIHRvIGNvbW11bmljYXRlIHdpdGggdGhlIGRldmljZQorICoKKyAqIFRoZSBmdyBuZWVkcyBzb21lIHRpbWUgdG8gc2V0dGxlLCBhbmQgaXQgd2FzIGp1c3QgdXBsb2FkZWQsCisgKiBzbyBnaXZlIGl0IGEgYnJlYWsgZmlyc3QuIEknZCBwcmVmZXIgdG8ganVzdCB3YWl0IGZvciB0aGUgZGV2aWNlIHRvCisgKiBzZW5kIHNvbWV0aGluZywgYnV0IHNlZW1zIHRoZSBwb2tpbmcgd2UgZG8gdG8gZW5hYmxlIFNESU8gc3R1ZmYKKyAqIGludGVyZmVyZXMgd2l0aCBpdCwgc28ganVzdCBnaXZlIGl0IGEgYnJlYWsgYmVmb3JlIHN0YXJ0aW5nLi4uCisgKi8KK3N0YXRpYworaW50IGkyNDAwbXNfYnVzX2Rldl9zdGFydChzdHJ1Y3QgaTI0MDBtICppMjQwMG0pCit7CisJaW50IHJlc3VsdDsKKwlzdHJ1Y3QgaTI0MDBtcyAqaTI0MDBtcyA9IGNvbnRhaW5lcl9vZihpMjQwMG0sIHN0cnVjdCBpMjQwMG1zLCBpMjQwMG0pOworCXN0cnVjdCBzZGlvX2Z1bmMgKmZ1bmMgPSBpMjQwMG1zLT5mdW5jOworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZmdW5jLT5kZXY7CisKKwlkX2Zuc3RhcnQoMywgZGV2LCAiKGkyNDAwbSAlcClcbiIsIGkyNDAwbSk7CisJbXNsZWVwKDIwMCk7CisJcmVzdWx0ID0gaTI0MDBtc19yeF9zZXR1cChpMjQwMG1zKTsKKwlpZiAocmVzdWx0IDwgMCkKKwkJZ290byBlcnJvcl9yeF9zZXR1cDsKKwlyZXN1bHQgPSBpMjQwMG1zX3R4X3NldHVwKGkyNDAwbXMpOworCWlmIChyZXN1bHQgPCAwKQorCQlnb3RvIGVycm9yX3R4X3NldHVwOworCWRfZm5lbmQoMywgZGV2LCAiKGkyNDAwbSAlcCkgPSAlZFxuIiwgaTI0MDBtLCByZXN1bHQpOworCXJldHVybiByZXN1bHQ7CisKKwlpMjQwMG1zX3R4X3JlbGVhc2UoaTI0MDBtcyk7CitlcnJvcl90eF9zZXR1cDoKKwlpMjQwMG1zX3J4X3JlbGVhc2UoaTI0MDBtcyk7CitlcnJvcl9yeF9zZXR1cDoKKwlkX2ZuZW5kKDMsIGRldiwgIihpMjQwMG0gJXApID0gdm9pZFxuIiwgaTI0MDBtKTsKKwlyZXR1cm4gcmVzdWx0OworfQorCisKK3N0YXRpYwordm9pZCBpMjQwMG1zX2J1c19kZXZfc3RvcChzdHJ1Y3QgaTI0MDBtICppMjQwMG0pCit7CisJc3RydWN0IGkyNDAwbXMgKmkyNDAwbXMgPSBjb250YWluZXJfb2YoaTI0MDBtLCBzdHJ1Y3QgaTI0MDBtcywgaTI0MDBtKTsKKwlzdHJ1Y3Qgc2Rpb19mdW5jICpmdW5jID0gaTI0MDBtcy0+ZnVuYzsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmZnVuYy0+ZGV2OworCisJZF9mbnN0YXJ0KDMsIGRldiwgIihpMjQwMG0gJXApXG4iLCBpMjQwMG0pOworCWkyNDAwbXNfcnhfcmVsZWFzZShpMjQwMG1zKTsKKwlpMjQwMG1zX3R4X3JlbGVhc2UoaTI0MDBtcyk7CisJZF9mbmVuZCgzLCBkZXYsICIoaTI0MDBtICVwKSA9IHZvaWRcbiIsIGkyNDAwbSk7Cit9CisKKworLyoKKyAqIFNlbmRzIGEgYmFya2VyIGJ1ZmZlciB0byB0aGUgZGV2aWNlCisgKgorICogVGhpcyBoZWxwZXIgd2lsbCBhbGxvY2F0ZSBhIGttYWxsb2NlZCBidWZmZXIgYW5kIHVzZSBpdCB0byB0cmFuc21pdAorICogKHRoZW4gZnJlZSBpdCkuIFJlYXNvbiBmb3IgdGhpcyBpcyB0aGF0IHRoZSBTRElPIGhvc3QgY29udHJvbGxlcgorICogZXhwZWN0cyBhbGlnbm1lbnQgKHVua25vd24gZXhhY3RseSB3aGljaCkgd2hpY2ggdGhlIHN0YWNrIHdvbid0CisgKiByZWFsbHkgcHJvdmlkZSBhbmQgY2VydGFpbiBhcmNoZXMvaG9zdC1jb250cm9sbGVyIGNvbWJpbmF0aW9ucworICogY2Fubm90IHVzZSBzdGFjay92bWFsbG9jL3RleHQgYXJlYXMgZm9yIERNQSB0cmFuc2ZlcnMuCisgKi8KK3N0YXRpYworaW50IF9faTI0MDBtc19zZW5kX2JhcmtlcihzdHJ1Y3QgaTI0MDBtcyAqaTI0MDBtcywKKwkJCSAgY29uc3QgX19sZTMyICpiYXJrZXIsIHNpemVfdCBiYXJrZXJfc2l6ZSkKK3sKKwlpbnQgIHJldDsKKwlzdHJ1Y3Qgc2Rpb19mdW5jICpmdW5jID0gaTI0MDBtcy0+ZnVuYzsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmZnVuYy0+ZGV2OworCXZvaWQgKmJ1ZmZlcjsKKworCXJldCA9IC1FTk9NRU07CisJYnVmZmVyID0ga21hbGxvYyhJMjQwME1TX0JMS19TSVpFLCBHRlBfS0VSTkVMKTsKKwlpZiAoYnVmZmVyID09IE5VTEwpCisJCWdvdG8gZXJyb3Jfa3phbGxvYzsKKworCW1lbWNweShidWZmZXIsIGJhcmtlciwgYmFya2VyX3NpemUpOworCXNkaW9fY2xhaW1faG9zdChmdW5jKTsKKwlyZXQgPSBzZGlvX21lbWNweV90b2lvKGZ1bmMsIDAsIGJ1ZmZlciwgSTI0MDBNU19CTEtfU0laRSk7CisJc2Rpb19yZWxlYXNlX2hvc3QoZnVuYyk7CisKKwlpZiAocmV0IDwgMCkKKwkJZF9wcmludGYoMCwgZGV2LCAiRTogYmFya2VyIGVycm9yOiAlZFxuIiwgcmV0KTsKKworCWtmcmVlKGJ1ZmZlcik7CitlcnJvcl9remFsbG9jOgorCXJldHVybiByZXQ7Cit9CisKKworLyoKKyAqIFJlc2V0IGEgZGV2aWNlIGF0IGRpZmZlcmVudCBsZXZlbHMgKHdhcm0sIGNvbGQgb3IgYnVzKQorICoKKyAqIEBpMjQwMG1zOiBkZXZpY2UgZGVzY3JpcHRvcgorICogQHJlc2V0X3R5cGU6IHNvZnQsIHdhcm0gb3IgYnVzIHJlc2V0IChJMjQwME1fUlRfV0FSTS9TT0ZUL0JVUykKKyAqCisgKiBGSVhNRTogbm90IHRlc3RlZCAtLSBuZWVkIHRvIGNvbmZpcm0gZXhwZWN0ZWQgZWZmZWN0cworICoKKyAqIFdhcm0gYW5kIGNvbGQgcmVzZXRzIGdldCBhbiBTRElPIHJlc2V0IGlmIHRoZXkgZmFpbCAodW5pbXBsZW1lbnRlZCkKKyAqCisgKiBXYXJtIHJlc2V0OgorICoKKyAqIFRoZSBkZXZpY2Ugd2lsbCBiZSBmdWxseSByZXNldCBpbnRlcm5hbGx5LCBidXQgd29uJ3QgYmUKKyAqIGRpc2Nvbm5lY3RlZCBmcm9tIHRoZSBVU0IgYnVzIChzbyBubyByZWVudW1lcmF0aW9uIHdpbGwKKyAqIGhhcHBlbikuIEZpcm13YXJlIHVwbG9hZCB3aWxsIGJlIG5lY2Nlc3NhcnkuCisgKgorICogVGhlIGRldmljZSB3aWxsIHNlbmQgYSByZWJvb3QgYmFya2VyIGluIHRoZSBub3RpZmljYXRpb24gZW5kcG9pbnQKKyAqIHRoYXQgd2lsbCB0cmlnZ2VyIHRoZSBkcml2ZXIgdG8gcmVpbml0aWFsaXplIHRoZSBzdGF0ZQorICogYXV0b21hdGljYWxseSBmcm9tIG5vdGlmLmM6aTI0MDBtX25vdGlmaWNhdGlvbl9ncm9rKCkgaW50bworICogaTI0MDBtX2Rldl9ib290c3RyYXBfZGVsYXllZCgpLgorICoKKyAqIENvbGQgYW5kIGJ1cyAoVVNCKSByZXNldDoKKyAqCisgKiBUaGUgZGV2aWNlIHdpbGwgYmUgZnVsbHkgcmVzZXQgaW50ZXJuYWxseSwgZGlzY29ubmVjdGVkIGZyb20gdGhlCisgKiBVU0IgYnVzIGFuIGEgcmVlbnVtZXJhdGlvbiB3aWxsIGhhcHBlbi4gRmlybXdhcmUgdXBsb2FkIHdpbGwgYmUKKyAqIG5lY2Nlc3NhcnkuIFRodXMsIHdlIGRvbid0IGRvIGFueSBsb2NraW5nIG9yIHN0cnVjdAorICogcmVpbml0aWFsaXphdGlvbiwgYXMgd2UgYXJlIGdvaW5nIHRvIGJlIGZ1bGx5IGRpc2Nvbm5lY3RlZCBhbmQKKyAqIHJlZW51bWVyYXRlZC4KKyAqCisgKiBOb3RlIHdlIG5lZWQgdG8gcmV0dXJuIC1FTk9ERVYgaWYgYSB3YXJtIHJlc2V0IHdhcyByZXF1ZXN0ZWQgYW5kIHdlCisgKiBoYWQgdG8gcmVzb3J0IHRvIGEgYnVzIHJlc2V0LiBTZWUgaTI0MDBtX29wX3Jlc2V0KCksIHdpbWF4X3Jlc2V0KCkKKyAqIGFuZCB3aW1heF9kZXYtPm9wX3Jlc2V0LgorICoKKyAqIFdBUk5JTkc6IG5vIGRyaXZlciBzdGF0ZSBzYXZlZC9maXhlZAorICovCitzdGF0aWMKK2ludCBpMjQwMG1zX2J1c19yZXNldChzdHJ1Y3QgaTI0MDBtICppMjQwMG0sIGVudW0gaTI0MDBtX3Jlc2V0X3R5cGUgcnQpCit7CisJaW50IHJlc3VsdDsKKwlzdHJ1Y3QgaTI0MDBtcyAqaTI0MDBtcyA9CisJCWNvbnRhaW5lcl9vZihpMjQwMG0sIHN0cnVjdCBpMjQwMG1zLCBpMjQwMG0pOworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGkyNDAwbV9kZXYoaTI0MDBtKTsKKwlzdGF0aWMgY29uc3QgX19sZTMyIGkyNDAwbV9XQVJNX0JPT1RfQkFSS0VSWzRdID0geworCQlfX2NvbnN0YW50X2NwdV90b19sZTMyKEkyNDAwTV9XQVJNX1JFU0VUX0JBUktFUiksCisJCV9fY29uc3RhbnRfY3B1X3RvX2xlMzIoSTI0MDBNX1dBUk1fUkVTRVRfQkFSS0VSKSwKKwkJX19jb25zdGFudF9jcHVfdG9fbGUzMihJMjQwME1fV0FSTV9SRVNFVF9CQVJLRVIpLAorCQlfX2NvbnN0YW50X2NwdV90b19sZTMyKEkyNDAwTV9XQVJNX1JFU0VUX0JBUktFUiksCisJfTsKKwlzdGF0aWMgY29uc3QgX19sZTMyIGkyNDAwbV9DT0xEX0JPT1RfQkFSS0VSWzRdID0geworCQlfX2NvbnN0YW50X2NwdV90b19sZTMyKEkyNDAwTV9DT0xEX1JFU0VUX0JBUktFUiksCisJCV9fY29uc3RhbnRfY3B1X3RvX2xlMzIoSTI0MDBNX0NPTERfUkVTRVRfQkFSS0VSKSwKKwkJX19jb25zdGFudF9jcHVfdG9fbGUzMihJMjQwME1fQ09MRF9SRVNFVF9CQVJLRVIpLAorCQlfX2NvbnN0YW50X2NwdV90b19sZTMyKEkyNDAwTV9DT0xEX1JFU0VUX0JBUktFUiksCisJfTsKKworCWlmIChydCA9PSBJMjQwME1fUlRfV0FSTSkKKwkJcmVzdWx0ID0gX19pMjQwMG1zX3NlbmRfYmFya2VyKGkyNDAwbXMsIGkyNDAwbV9XQVJNX0JPT1RfQkFSS0VSLAorCQkJCQkgICAgICAgc2l6ZW9mKGkyNDAwbV9XQVJNX0JPT1RfQkFSS0VSKSk7CisJZWxzZSBpZiAocnQgPT0gSTI0MDBNX1JUX0NPTEQpCisJCXJlc3VsdCA9IF9faTI0MDBtc19zZW5kX2JhcmtlcihpMjQwMG1zLCBpMjQwMG1fQ09MRF9CT09UX0JBUktFUiwKKwkJCQkJICAgICAgIHNpemVvZihpMjQwMG1fQ09MRF9CT09UX0JBUktFUikpOworCWVsc2UgaWYgKHJ0ID09IEkyNDAwTV9SVF9CVVMpIHsKK2RvX2J1c19yZXNldDoKKwkJZGV2X2VycihkZXYsICJGSVhNRTogU0RJTyBidXMgcmVzZXQgbm90IGltcGxlbWVudGVkXG4iKTsKKwkJcmVzdWx0ID0gcnQgPT0gSTI0MDBNX1JUX1dBUk0gPyAtRU5PREVWIDogLUVOT1NZUzsKKwl9IGVsc2UKKwkJQlVHKCk7CisJaWYgKHJlc3VsdCA8IDAgJiYgcnQgIT0gSTI0MDBNX1JUX0JVUykgeworCQlkZXZfZXJyKGRldiwgIiVzIHJlc2V0IGZhaWxlZCAoJWQpOyB0cnlpbmcgU0RJTyByZXNldFxuIiwKKwkJCXJ0ID09IEkyNDAwTV9SVF9XQVJNID8gIndhcm0iIDogImNvbGQiLCByZXN1bHQpOworCQlydCA9IEkyNDAwTV9SVF9CVVM7CisJCWdvdG8gZG9fYnVzX3Jlc2V0OworCX0KKwlyZXR1cm4gcmVzdWx0OworfQorCisKK3N0YXRpYwordm9pZCBpMjQwMG1zX25ldGRldl9zZXR1cChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldikKK3sKKwlzdHJ1Y3QgaTI0MDBtICppMjQwMG0gPSBuZXRfZGV2X3RvX2kyNDAwbShuZXRfZGV2KTsKKwlzdHJ1Y3QgaTI0MDBtcyAqaTI0MDBtcyA9IGNvbnRhaW5lcl9vZihpMjQwMG0sIHN0cnVjdCBpMjQwMG1zLCBpMjQwMG0pOworCWkyNDAwbXNfaW5pdChpMjQwMG1zKTsKKwlpMjQwMG1fbmV0ZGV2X3NldHVwKG5ldF9kZXYpOworfQorCisKKy8qCisgKiBEZWJ1ZyBsZXZlbHMgY29udHJvbDsgc2VlIGRlYnVnLmgKKyAqLworc3RydWN0IGRfbGV2ZWwgRF9MRVZFTFtdID0geworCURfU1VCTU9EVUxFX0RFRklORShtYWluKSwKKwlEX1NVQk1PRFVMRV9ERUZJTkUodHgpLAorCURfU1VCTU9EVUxFX0RFRklORShyeCksCisJRF9TVUJNT0RVTEVfREVGSU5FKGZ3KSwKK307CitzaXplX3QgRF9MRVZFTF9TSVpFID0gQVJSQVlfU0laRShEX0xFVkVMKTsKKworCisjZGVmaW5lIF9fZGVidWdmc19yZWdpc3RlcihwcmVmaXgsIG5hbWUsIHBhcmVudCkJCQlcCitkbyB7CQkJCQkJCQkJXAorCXJlc3VsdCA9IGRfbGV2ZWxfcmVnaXN0ZXJfZGVidWdmcyhwcmVmaXgsIG5hbWUsIHBhcmVudCk7CVwKKwlpZiAocmVzdWx0IDwgMCkJCQkJCQkJXAorCQlnb3RvIGVycm9yOwkJCQkJCVwKK30gd2hpbGUgKDApCisKKworc3RhdGljCitpbnQgaTI0MDBtc19kZWJ1Z2ZzX2FkZChzdHJ1Y3QgaTI0MDBtcyAqaTI0MDBtcykKK3sKKwlpbnQgcmVzdWx0OworCXN0cnVjdCBkZW50cnkgKmRlbnRyeSA9IGkyNDAwbXMtPmkyNDAwbS53aW1heF9kZXYuZGVidWdmc19kZW50cnk7CisKKwlkZW50cnkgPSBkZWJ1Z2ZzX2NyZWF0ZV9kaXIoImkyNDAwbS11c2IiLCBkZW50cnkpOworCXJlc3VsdCA9IFBUUl9FUlIoZGVudHJ5KTsKKwlpZiAoSVNfRVJSKGRlbnRyeSkpIHsKKwkJaWYgKHJlc3VsdCA9PSAtRU5PREVWKQorCQkJcmVzdWx0ID0gMDsJLyogTm8gZGVidWdmcyBzdXBwb3J0ICovCisJCWdvdG8gZXJyb3I7CisJfQorCWkyNDAwbXMtPmRlYnVnZnNfZGVudHJ5ID0gZGVudHJ5OworCV9fZGVidWdmc19yZWdpc3RlcigiZGxfIiwgbWFpbiwgZGVudHJ5KTsKKwlfX2RlYnVnZnNfcmVnaXN0ZXIoImRsXyIsIHR4LCBkZW50cnkpOworCV9fZGVidWdmc19yZWdpc3RlcigiZGxfIiwgcngsIGRlbnRyeSk7CisJX19kZWJ1Z2ZzX3JlZ2lzdGVyKCJkbF8iLCBmdywgZGVudHJ5KTsKKworCXJldHVybiAwOworCitlcnJvcjoKKwlkZWJ1Z2ZzX3JlbW92ZV9yZWN1cnNpdmUoaTI0MDBtcy0+ZGVidWdmc19kZW50cnkpOworCXJldHVybiByZXN1bHQ7Cit9CisKKworLyoKKyAqIFByb2JlIGEgaTI0MDBtIGludGVyZmFjZSBhbmQgcmVnaXN0ZXIgaXQKKyAqCisgKiBAZnVuYzogICAgU0RJTyBmdW5jdGlvbgorICogQGlkOiAgICAgIFNESU8gZGV2aWNlIElECisgKiBAcmV0dXJuczogMCBpZiBvaywgPCAwIGVycm5vIGNvZGUgb24gZXJyb3IuCisgKgorICogQWxsb2MgYSBuZXQgZGV2aWNlLCBpbml0aWFsaXplIHRoZSBidXMtc3BlY2lmaWMgZGV0YWlscyBhbmQgdGhlbgorICogY2FsbHMgdGhlIGJ1cy1nZW5lcmljIGluaXRpYWxpemF0aW9uIHJvdXRpbmUuIFRoYXQgd2lsbCByZWdpc3RlcgorICogdGhlIHdpbWF4IGFuZCBuZXRkZXYgZGV2aWNlcywgdXBsb2FkIHRoZSBmaXJtd2FyZSBbdXNpbmcKKyAqIF9idXNfYm1fKigpXSwgY2FsbCBfYnVzX2Rldl9zdGFydCgpIHRvIGZpbmFsaXplIHRoZSBzZXR1cCBvZiB0aGUKKyAqIGNvbW11bmljYXRpb24gd2l0aCB0aGUgZGV2aWNlIGFuZCB0aGVuIHdpbGwgc3RhcnQgdG8gdGFsayB0byBpdCB0bworICogZmlubmlzaCBzZXR0aW5nIGl0IHVwLgorICoKKyAqIEluaXRpYWxpemF0aW9uIGlzIHRyaWNreTsgc29tZSBpbnN0YW5jZXMgb2YgdGhlIGh3IGFyZSBwYWNrZWQgd2l0aAorICogb3RoZXJzIGluIGEgd2F5IHRoYXQgcmVxdWlyZXMgYSB0aGlyZCBkcml2ZXIgdGhhdCBlbmFibGVzIHRoZSBXaU1BWAorICogZnVuY3Rpb24uIEluIHRob3NlIGNhc2VzLCB3ZSBjYW4ndCBlbmFibGUgdGhlIFNESU8gZnVuY3Rpb24gYW5kCisgKiB3ZSdsbCByZXR1cm4gd2l0aCAtRU5PREVWLiBXaGVuIHRoZSBkcml2ZXIgdGhhdCBlbmFibGVzIHRoZSBXaU1BWAorICogZnVuY3Rpb24gZG9lcyBpdHMgdGhpbmcsIGl0IGhhcyB0byBkbyBhIGJ1c19yZXNjYW5fZGV2aWNlcygpIG9uIHRoZQorICogU0RJTyBidXMgc28gdGhpcyBkcml2ZXIgaXMgY2FsbGVkIGFnYWluIHRvIGVudW1lcmF0ZSB0aGUgV2lNQVgKKyAqIGZ1bmN0aW9uLgorICovCitzdGF0aWMKK2ludCBpMjQwMG1zX3Byb2JlKHN0cnVjdCBzZGlvX2Z1bmMgKmZ1bmMsCisJCSAgY29uc3Qgc3RydWN0IHNkaW9fZGV2aWNlX2lkICppZCkKK3sKKwlpbnQgcmVzdWx0OworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2OworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZmdW5jLT5kZXY7CisJc3RydWN0IGkyNDAwbSAqaTI0MDBtOworCXN0cnVjdCBpMjQwMG1zICppMjQwMG1zOworCisJLyogQWxsb2NhdGUgaW5zdGFuY2UgW2NhbGxzIGkyNDAwbV9uZXRkZXZfc2V0dXAoKSBvbiBpdF0uICovCisJcmVzdWx0ID0gLUVOT01FTTsKKwluZXRfZGV2ID0gYWxsb2NfbmV0ZGV2KHNpemVvZigqaTI0MDBtcyksICJ3bXglZCIsCisJCQkgICAgICAgaTI0MDBtc19uZXRkZXZfc2V0dXApOworCWlmIChuZXRfZGV2ID09IE5VTEwpIHsKKwkJZGV2X2VycihkZXYsICJubyBtZW1vcnkgZm9yIG5ldHdvcmsgZGV2aWNlIGluc3RhbmNlXG4iKTsKKwkJZ290byBlcnJvcl9hbGxvY19uZXRkZXY7CisJfQorCVNFVF9ORVRERVZfREVWKG5ldF9kZXYsIGRldik7CisJaTI0MDBtID0gbmV0X2Rldl90b19pMjQwMG0obmV0X2Rldik7CisJaTI0MDBtcyA9IGNvbnRhaW5lcl9vZihpMjQwMG0sIHN0cnVjdCBpMjQwMG1zLCBpMjQwMG0pOworCWkyNDAwbS0+d2ltYXhfZGV2Lm5ldF9kZXYgPSBuZXRfZGV2OworCWkyNDAwbXMtPmZ1bmMgPSBmdW5jOworCXNkaW9fc2V0X2RydmRhdGEoZnVuYywgaTI0MDBtcyk7CisKKwlpMjQwMG0tPmJ1c190eF9ibG9ja19zaXplID0gSTI0MDBNU19CTEtfU0laRTsKKwlpMjQwMG0tPmJ1c19wbF9zaXplX21heCA9IEkyNDAwTVNfUExfU0laRV9NQVg7CisJaTI0MDBtLT5idXNfZGV2X3N0YXJ0ID0gaTI0MDBtc19idXNfZGV2X3N0YXJ0OworCWkyNDAwbS0+YnVzX2Rldl9zdG9wID0gaTI0MDBtc19idXNfZGV2X3N0b3A7CisJaTI0MDBtLT5idXNfdHhfa2ljayA9IGkyNDAwbXNfYnVzX3R4X2tpY2s7CisJaTI0MDBtLT5idXNfcmVzZXQgPSBpMjQwMG1zX2J1c19yZXNldDsKKwlpMjQwMG0tPmJ1c19ibV9jbWRfc2VuZCA9IGkyNDAwbXNfYnVzX2JtX2NtZF9zZW5kOworCWkyNDAwbS0+YnVzX2JtX3dhaXRfZm9yX2FjayA9IGkyNDAwbXNfYnVzX2JtX3dhaXRfZm9yX2FjazsKKwlpMjQwMG0tPmJ1c19md19uYW1lID0gSTI0MDBNU19GV19GSUxFX05BTUU7CisJaTI0MDBtLT5idXNfYm1fbWFjX2FkZHJfaW1wYWlyZWQgPSAxOworCisJcmVzdWx0ID0gaTI0MDBtc19lbmFibGVfZnVuY3Rpb24oaTI0MDBtcy0+ZnVuYyk7CisJaWYgKHJlc3VsdCA8IDApIHsKKwkJZGV2X2VycihkZXYsICJDYW5ub3QgZW5hYmxlIFNESU8gZnVuY3Rpb246ICVkXG4iLCByZXN1bHQpOworCQlnb3RvIGVycm9yX2Z1bmNfZW5hYmxlOworCX0KKworCXNkaW9fY2xhaW1faG9zdChmdW5jKTsKKwlyZXN1bHQgPSBzZGlvX3NldF9ibG9ja19zaXplKGZ1bmMsIEkyNDAwTVNfQkxLX1NJWkUpOworCWlmIChyZXN1bHQgPCAwKSB7CisJCWRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIHNldCBibG9jayBzaXplOiAlZFxuIiwgcmVzdWx0KTsKKwkJZ290byBlcnJvcl9zZXRfYmxrX3NpemU7CisJfQorCXNkaW9fcmVsZWFzZV9ob3N0KGZ1bmMpOworCisJcmVzdWx0ID0gaTI0MDBtX3NldHVwKGkyNDAwbSwgSTI0MDBNX0JSSV9OT19SRUJPT1QpOworCWlmIChyZXN1bHQgPCAwKSB7CisJCWRldl9lcnIoZGV2LCAiY2Fubm90IHNldHVwIGRldmljZTogJWRcbiIsIHJlc3VsdCk7CisJCWdvdG8gZXJyb3Jfc2V0dXA7CisJfQorCisJcmVzdWx0ID0gaTI0MDBtc19kZWJ1Z2ZzX2FkZChpMjQwMG1zKTsKKwlpZiAocmVzdWx0IDwgMCkgeworCQlkZXZfZXJyKGRldiwgImNhbm5vdCBjcmVhdGUgU0RJTyBkZWJ1Z2ZzOiAlZFxuIiwKKwkJCXJlc3VsdCk7CisJCWdvdG8gZXJyb3JfZGVidWdmc19hZGQ7CisJfQorCXJldHVybiAwOworCitlcnJvcl9kZWJ1Z2ZzX2FkZDoKKwlpMjQwMG1fcmVsZWFzZShpMjQwMG0pOworZXJyb3Jfc2V0dXA6CisJc2Rpb19zZXRfZHJ2ZGF0YShmdW5jLCBOVUxMKTsKKwlzZGlvX2NsYWltX2hvc3QoZnVuYyk7CitlcnJvcl9zZXRfYmxrX3NpemU6CisJc2Rpb19kaXNhYmxlX2Z1bmMoZnVuYyk7CisJc2Rpb19yZWxlYXNlX2hvc3QoZnVuYyk7CitlcnJvcl9mdW5jX2VuYWJsZToKKwlmcmVlX25ldGRldihuZXRfZGV2KTsKK2Vycm9yX2FsbG9jX25ldGRldjoKKwlyZXR1cm4gcmVzdWx0OworfQorCisKK3N0YXRpYwordm9pZCBpMjQwMG1zX3JlbW92ZShzdHJ1Y3Qgc2Rpb19mdW5jICpmdW5jKQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZmdW5jLT5kZXY7CisJc3RydWN0IGkyNDAwbXMgKmkyNDAwbXMgPSBzZGlvX2dldF9kcnZkYXRhKGZ1bmMpOworCXN0cnVjdCBpMjQwMG0gKmkyNDAwbSA9ICZpMjQwMG1zLT5pMjQwMG07CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYgPSBpMjQwMG0tPndpbWF4X2Rldi5uZXRfZGV2OworCisJZF9mbnN0YXJ0KDMsIGRldiwgIlNESU8gZnVuYyAlcFxuIiwgZnVuYyk7CisJZGVidWdmc19yZW1vdmVfcmVjdXJzaXZlKGkyNDAwbXMtPmRlYnVnZnNfZGVudHJ5KTsKKwlpMjQwMG1fcmVsZWFzZShpMjQwMG0pOworCXNkaW9fc2V0X2RydmRhdGEoZnVuYywgTlVMTCk7CisJc2Rpb19jbGFpbV9ob3N0KGZ1bmMpOworCXNkaW9fZGlzYWJsZV9mdW5jKGZ1bmMpOworCXNkaW9fcmVsZWFzZV9ob3N0KGZ1bmMpOworCWZyZWVfbmV0ZGV2KG5ldF9kZXYpOworCWRfZm5lbmQoMywgZGV2LCAiU0RJTyBmdW5jICVwXG4iLCBmdW5jKTsKK30KKworZW51bSB7CisJSTI0MDBNU19JTlRFTF9WSUQgPSAweDg5LAorfTsKKworc3RhdGljCitjb25zdCBzdHJ1Y3Qgc2Rpb19kZXZpY2VfaWQgaTI0MDBtc19zZGlvX2lkc1tdID0geworCS8qIEludGVsOiBpMjQwMG0gV2lNQVggb3ZlciBTRElPICovCisJeyBTRElPX0RFVklDRShJMjQwME1TX0lOVEVMX1ZJRCwgMHgxNDAyKSB9LAorCXsgfSwgCQkJLyogZW5kOiBhbGwgemVyb2VzICovCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShzZGlvLCBpMjQwMG1zX3NkaW9faWRzKTsKKworCitzdGF0aWMKK3N0cnVjdCBzZGlvX2RyaXZlciBpMjQwMG1fc2Rpb19kcml2ZXIgPSB7CisJLm5hbWUJCT0gS0JVSUxEX01PRE5BTUUsCisJLnByb2JlCQk9IGkyNDAwbXNfcHJvYmUsCisJLnJlbW92ZQkJPSBpMjQwMG1zX3JlbW92ZSwKKwkuaWRfdGFibGUJPSBpMjQwMG1zX3NkaW9faWRzLAorfTsKKworCitzdGF0aWMKK2ludCBfX2luaXQgaTI0MDBtc19kcml2ZXJfaW5pdCh2b2lkKQoreworCXJldHVybiBzZGlvX3JlZ2lzdGVyX2RyaXZlcigmaTI0MDBtX3NkaW9fZHJpdmVyKTsKK30KK21vZHVsZV9pbml0KGkyNDAwbXNfZHJpdmVyX2luaXQpOworCisKK3N0YXRpYwordm9pZCBfX2V4aXQgaTI0MDBtc19kcml2ZXJfZXhpdCh2b2lkKQoreworCWZsdXNoX3NjaGVkdWxlZF93b3JrKCk7CS8qIGZvciB0aGUgc3R1ZmYgd2Ugc2NoZWR1bGUgKi8KKwlzZGlvX3VucmVnaXN0ZXJfZHJpdmVyKCZpMjQwMG1fc2Rpb19kcml2ZXIpOworfQorbW9kdWxlX2V4aXQoaTI0MDBtc19kcml2ZXJfZXhpdCk7CisKKworTU9EVUxFX0FVVEhPUigiSW50ZWwgQ29ycG9yYXRpb24gPGxpbnV4LXdpbWF4QGludGVsLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiSW50ZWwgMjQwME0gV2lNQVggbmV0d29ya2luZyBmb3IgU0RJTyIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0ZJUk1XQVJFKEkyNDAwTVNfRldfRklMRV9OQU1FKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpbWF4L2kyNDAwbS90eC5jIGIvZHJpdmVycy9uZXQvd2ltYXgvaTI0MDBtL3R4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjEzYTg4ZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpbWF4L2kyNDAwbS90eC5jCkBAIC0wLDAgKzEsODE3IEBACisvKgorICogSW50ZWwgV2lyZWxlc3MgV2lNQVggQ29ubmVjdGlvbiAyNDAwbQorICogR2VuZXJpYyAobm9uLWJ1cyBzcGVjaWZpYykgVFggaGFuZGxpbmcKKyAqCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgIGRpc3RyaWJ1dGlvbi4KKyAqICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEludGVsIENvcnBvcmF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICoKKyAqIEludGVsIENvcnBvcmF0aW9uIDxsaW51eC13aW1heEBpbnRlbC5jb20+CisgKiBZYW5pciBMdWJldGtpbiA8eWFuaXJ4Lmx1YmV0a2luQGludGVsLmNvbT4KKyAqICAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24KKyAqCisgKiBJbnRlbCBDb3Jwb3JhdGlvbiA8bGludXgtd2ltYXhAaW50ZWwuY29tPgorICogSW5ha3kgUGVyZXotR29uemFsZXogPGluYWt5LnBlcmV6LWdvbnphbGV6QGludGVsLmNvbT4KKyAqICAtIFJld3JpdHRlbiB0byB1c2UgYSBzaW5nbGUgRklGTyB0byBsb3dlciB0aGUgbWVtb3J5IGFsbG9jYXRpb24KKyAqICAgIHByZXNzdXJlIGFuZCBvcHRpbWl6ZSBjYWNoZSBoaXRzIHdoZW4gY29weWluZyB0byB0aGUgcXVldWUsIGFzCisgKiAgICB3ZWxsIGFzIHNwbGl0dGluZyBvdXQgYnVzLXNwZWNpZmljIGNvZGUuCisgKgorICoKKyAqIEltcGxlbWVudHMgZGF0YSB0cmFuc21pc3Npb24gdG8gdGhlIGRldmljZTsgdGhpcyBpcyBkb25lIHRocm91Z2ggYQorICogc29mdHdhcmUgRklGTywgYXMgZGF0YS9jb250cm9sIGZyYW1lcyBjYW4gYmUgY29hbGVzY2VkICh3aGlsZSB0aGUKKyAqIGRldmljZSBpcyByZWFkaW5nIHRoZSBwcmV2aW91cyB0eCB0cmFuc2FjdGlvbiwgb3RoZXJzIGFjY3VtdWxhdGUpLgorICoKKyAqIEEgRklGTyBpcyB1c2VkIGJlY2F1c2UgYXQgdGhlIGVuZCBpdCBpcyByZXNvdXJjZS1jaGVhcGVyIHRoYXQgdHJ5aW5nCisgKiB0byBpbXBsZW1lbnQgc2NhdHRlci9nYXRoZXIgb3ZlciBVU0IuIEFzIHdlbGwsIG1vc3QgdHJhZmZpYyBpcyBnb2luZworICogdG8gYmUgZG93bmxvYWQgKHZzIHVwbG9hZCkuCisgKgorICogVGhlIGZvcm1hdCBmb3Igc2VuZGluZy9yZWNlaXZpbmcgZGF0YSB0by9mcm9tIHRoZSBpMjQwMG0gaXMKKyAqIGRlc2NyaWJlZCBpbiBkZXRhaWwgaW4gcnguYzpQUk9UT0NPTCBGT1JNQVQuIEluIGhlcmUgd2UgaW1wbGVtZW50CisgKiB0aGUgdHJhbnNtaXNzaW9uIG9mIHRoYXQuIFRoaXMgaXMgc3BsaXQgYmV0d2VlbiBhIGJ1cy1pbmRlcGVuZGVudAorICogcGFydCB0aGF0IGp1c3QgcHJlcGFyZXMgZXZlcnl0aGluZyBhbmQgYSBidXMtc3BlY2lmaWMgcGFydCB0aGF0CisgKiBkb2VzIHRoZSBhY3R1YWwgdHJhbnNtaXNzaW9uIG92ZXIgdGhlIGJ1cyB0byB0aGUgZGV2aWNlIChpbiB0aGUKKyAqIGJ1cy1zcGVjaWZpYyBkcml2ZXIpLgorICoKKyAqCisgKiBUaGUgZ2VuZXJhbCBmb3JtYXQgb2YgYSBkZXZpY2UtaG9zdCB0cmFuc2FjdGlvbiBpcyBNU0ctSERSLCBQTEQxLAorICogUExEMi4uLlBMRE4sIFBMMSwgUEwyLC4uLlBMTiwgUEFERElORy4KKyAqCisgKiBCZWNhdXNlIHdlIG5lZWQgdGhlIHNlbmQgcGF5bG9hZCBkZXNjcmlwdG9ycyBhbmQgdGhlbiBwYXlsb2FkcyBhbmQKKyAqIGJlY2F1c2UgaXQgaXMga2luZCBvZiBleHBlbnNpdmUgdG8gZG8gc2NhdHRlcmxpc3RzIGluIFVTQiAob25lIFVSQgorICogcGVyIG5vZGUpLCBpdCBiZWNvbWVzIGNoZWFwZXIgdG8gYXBwZW5kIGFsbCB0aGUgZGF0YSB0byBhIEZJRk8KKyAqIChjb3B5aW5nIHRvIGEgRklGTyBwb3RlbnRpYWxseSBpbiBjYWNoZSBpcyBjaGVhcGVyKS4KKyAqCisgKiBUaGVuIHRoZSBidXMtc3BlY2lmaWMgY29kZSB0YWtlcyB0aGUgcGFydHMgb2YgdGhhdCBGSUZPIHRoYXQgYXJlCisgKiB3cml0dGVuIGFuZCBwYXNzZXMgdGhlbSB0byB0aGUgZGV2aWNlLgorICoKKyAqIFNvIHRoZSBjb25jZXB0cyB0byBrZWVwIGluIG1pbmQgdGhlcmUgYXJlOgorICoKKyAqIFdlIHVzZSBhIEZJRk8gdG8gcXVldWUgdGhlIGRhdGEgaW4gYSBsaW5lYXIgYnVmZmVyLiBXZSBmaXJzdCBhcHBlbmQKKyAqIGEgTVNHLUhEUiwgc3BhY2UgZm9yIEkyNDAwTV9UWF9QTERfTUFYIHBheWxvYWQgZGVzY3JpcHRvcnMgYW5kIHRoZW4KKyAqIGdvIGFwcGVuZGluZyBwYXlsb2FkcyB1bnRpbCB3ZSBydW4gb3V0IG9mIHNwYWNlIG9yIG9mIHBheWxvYWQKKyAqIGRlc2NyaXB0b3JzLiBUaGVuIHdlIGFwcGVuZCBwYWRkaW5nIHRvIG1ha2UgdGhlIHdob2xlIHRyYW5zYWN0aW9uIGEKKyAqIG11bHRpcGxlIG9mIGkyNDAwbS0+YnVzX3R4X2Jsb2NrX3NpemUgKGFzIGRlZmluZWQgYnkgdGhlIGJ1cyBsYXllcikuCisgKgorICogLSBBIFRYIG1lc3NhZ2U6IGEgY29tYmluYXRpb24gb2YgYSBtZXNzYWdlIGhlYWRlciwgcGF5bG9hZAorICogICBkZXNjcmlwdG9ycyBhbmQgcGF5bG9hZHMuCisgKgorICogICAgIE9wZW46IGl0IGlzIG1hcmtlZCBhcyBhY3RpdmUgKGkyNDAwbS0+dHhfbXNnIGlzIHZhbGlkKSBhbmQgd2UKKyAqICAgICAgIGNhbiBrZWVwIGFkZGluZyBwYXlsb2FkcyB0byBpdC4KKyAqCisgKiAgICAgQ2xvc2VkOiB3ZSBhcmUgbm90IGFwcGVuZGluZyBtb3JlIHBheWxvYWRzIHRvIHRoaXMgVFggbWVzc2FnZQorICogICAgICAgKGV4YWh1c3RlZCBzcGFjZSBpbiB0aGUgcXVldWUsIHRvbyBtYW55IHBheWxvYWRzIG9yCisgKiAgICAgICB3aGljaGV2ZXIpLiAgV2UgaGF2ZSBhcHBlbmRlZCBwYWRkaW5nIHNvIHRoZSB3aG9sZSBtZXNzYWdlCisgKiAgICAgICBsZW5ndGggaXMgYWxpZ25lZCB0byBpMjQwMG0tPmJ1c190eF9ibG9ja19zaXplIChhcyBzZXQgYnkgdGhlCisgKiAgICAgICBidXMvdHJhbnNwb3J0IGxheWVyKS4KKyAqCisgKiAtIE1vc3Qgb2YgdGhlIHRpbWUgd2Uga2VlcCBhIFRYIG1lc3NhZ2Ugb3BlbiB0byB3aGljaCB3ZSBhcHBlbmQKKyAqICAgcGF5bG9hZHMuCisgKgorICogLSBJZiB3ZSBhcmUgZ29pbmcgdG8gYXBwZW5kIGFuZCB0aGVyZSBpcyBubyBtb3JlIHNwYWNlICh3ZSBhcmUgYXQKKyAqICAgdGhlIGVuZCBvZiB0aGUgRklGTyksIHdlIGNsb3NlIHRoZSBtZXNzYWdlLCBtYXJrIHRoZSByZXN0IG9mIHRoZQorICogICBGSUZPIHNwYWNlIHVudXNhYmxlIChza2lwX3RhaWwpLCBjcmVhdGUgYSBuZXcgbWVzc2FnZSBhdCB0aGUKKyAqICAgYmVnaW5uaW5nIG9mIHRoZSBGSUZPIChpZiB0aGVyZSBpcyBzcGFjZSkgYW5kIGFwcGVuZCB0aGUgbWVzc2FnZQorICogICB0aGVyZS4KKyAqCisgKiAgIFRoaXMgaXMgYmVjYXVzZSB3ZSBuZWVkIHRvIGdpdmUgbGluZWFyIFRYIG1lc3NhZ2VzIHRvIHRoZSBidXMKKyAqICAgZW5naW5lLiBTbyB3ZSBkb24ndCB3cml0ZSBhIG1lc3NhZ2UgdG8gdGhlIHJlbWFpbmluZyBGSUZPIHNwYWNlCisgKiAgIHVudGlsIHRoZSB0YWlsIGFuZCBjb250aW51ZSBhdCB0aGUgaGVhZCBvZiBpdC4KKyAqCisgKiAtIFdlIG92ZXJsb2FkIG9uZSBvZiB0aGUgZmllbGRzIGluIHRoZSBtZXNzYWdlIGhlYWRlciB0byB1c2UgaXQgYXMKKyAqICAgJ3NpemUnIG9mIHRoZSBUWCBtZXNzYWdlLCBzbyB3ZSBjYW4gaXRlcmF0ZSBvdmVyIHRoZW0uIEl0IGFsc28KKyAqICAgY29udGFpbnMgYSBmbGFnIHRoYXQgaW5kaWNhdGVzIGlmIHdlIGhhdmUgdG8gc2tpcCBpdCBvciBub3QuCisgKiAgIFdoZW4gd2Ugc2VuZCB0aGUgYnVmZmVyLCB3ZSB1cGRhdGUgdGhhdCB0byBpdHMgcmVhbCBvbi10aGUtd2lyZQorICogICB2YWx1ZS4KKyAqCisgKiAtIFRoZSBNU0ctSERSIFBMRDEuLi5QTEQyIHN0dWZmIGhhcyB0byBiZSBhIHNpemUgbXVsdGlwbGUgb2YgMTYuCisgKgorICogICBJdCBmb2xsb3dzIHRoYXQgaWYgTVNHLUhEUiBzYXlzIHdlIGhhdmUgTiBtZXNzYWdlcywgdGhlIHdob2xlCisgKiAgIGhlYWRlciArIGRlc2NyaXB0b3JzIGlzIDE2ICsgNCpOOyBmb3IgdGhvc2UgdG8gYmUgYSBtdWx0aXBsZSBvZgorICogICAxNiwgaXQgZm9sbG93cyB0aGF0IE4gY2FuIGJlIDQsIDgsIDEyLCAuLi4gKDMyLCA0OCwgNjQsIDgwLi4uCisgKiAgIGJ5dGVzKS4KKyAqCisgKiAgIFNvIGlmIHdlIGhhdmUgb25seSAxIHBheWxvYWQsIHdlIGhhdmUgdG8gc3VibWl0IGEgaGVhZGVyIHRoYXQgaW4KKyAqICAgYWxsIHRydXRoIGhhcyBzcGFjZSBmb3IgNC4KKyAqCisgKiAgIFRoZSBpbXBsaWNhdGlvbiBpcyB0aGF0IHdlIHJlc2VydmUgc3BhY2UgZm9yIDEyICg2NCBieXRlcyk7IGJ1dAorICogICBpZiB3ZSBmaWxsIHVwIG9ubHkgKGVnKSAyLCBvdXIgaGVhZGVyIGJlY29tZXMgMzIgYnl0ZXMgb25seS4gU28KKyAqICAgdGhlIFRYIGVuZ2luZSBoYXMgdG8gc2hpZnQgdGhvc2UgMzIgYnl0ZXMgb2YgbXNnIGhlYWRlciBhbmQgMgorICogICBwYXlsb2FkcyBhbmQgcGFkZGluZyBzbyB0aGF0IHJpZ2h0IGFmdGVyIGl0IHRoZSBwYXlsb2FkcyBzdGFydAorICogICBhbmQgdGhlIFRYIGVuZ2luZSBoYXMgdG8ga25vdyBhYm91dCB0aGF0LgorICoKKyAqICAgSXQgaXMgY2hlYXBlciB0byBtb3ZlIHRoZSBoZWFkZXIgdXAgdGhhbiB0aGUgd2hvbGUgcGF5bG9hZHMgZG93bi4KKyAqCisgKiAgIFdlIGRvIHRoaXMgaW4gaTI0MDBtX3R4X2Nsb3NlKCkuIFNlZSAnaTI0MDBtX21zZ19oZHItPm9mZnNldCcuCisgKgorICogLSBFYWNoIHBheWxvYWQgaGFzIHRvIGJlIHNpemUtcGFkZGVkIHRvIDE2IGJ5dGVzOyBiZWZvcmUgYXBwZW5kaW5nCisgKiAgIGl0LCB3ZSBqdXN0IGRvIGl0LgorICoKKyAqIC0gVGhlIHdob2xlIG1lc3NhZ2UgaGFzIHRvIGJlIHBhZGRlZCB0byBpMjQwMG0tPmJ1c190eF9ibG9ja19zaXplOworICogICB3ZSBkbyB0aGlzIGF0IGNsb3NlIHRpbWUuIFRodXMsIHdoZW4gcmVzZXJ2aW5nIHNwYWNlIGZvciB0aGUKKyAqICAgcGF5bG9hZCwgd2UgYWx3YXlzIG1ha2Ugc3VyZSB0aGVyZSBpcyBhbHNvIGZyZWUgc3BhY2UgZm9yIHRoaXMKKyAqICAgcGFkZGluZyB0aGF0IHNvb25lciBvciBsYXRlciB3aWxsIGhhcHBlbi4KKyAqCisgKiBXaGVuIHdlIGFwcGVuZCBhIG1lc3NhZ2UsIHdlIHRlbGwgdGhlIGJ1cyBzcGVjaWZpYyBjb2RlIHRvIGtpY2sgaW4KKyAqIFRYcy4gSXQgd2lsbCBUWCAoaW4gcGFyYWxsZWwpIHVudGlsIHRoZSBidWZmZXIgaXMgZXhoYXVzdGVkLS1oZW5jZQorICogdGhlIGxvY2tpbiB3ZSBkby4gVGhlIFRYIGNvZGUgd2lsbCBvbmx5IHNlbmQgYSBUWCBtZXNzYWdlIGF0IHRoZQorICogdGltZSAod2hpY2ggcmVtZW1iZXIsIG1pZ2h0IGNvbnRhaW4gbW9yZSB0aGFuIG9uZSBwYXlsb2FkKS4gT2YKKyAqIGNvdXJzZSwgd2hlbiB0aGUgYnVzLXNwZWNpZmljIGRyaXZlciBhdHRlbXB0cyB0byBUWCBhIG1lc3NhZ2UgdGhhdAorICogaXMgc3RpbGwgb3BlbiwgaXQgZ2V0cyBjbG9zZWQgZmlyc3QuCisgKgorICogR2VlLCB0aGlzIGlzIG1lc3N5OyB3ZWxsIGEgcGljdHVyZS4gSW4gdGhlIGV4YW1wbGUgYmVsb3cgd2UgaGF2ZSBhCisgKiBwYXJ0aWFsbHkgZnVsbCBGSUZPLCB3aXRoIGEgY2xvc2VkIG1lc3NhZ2UgcmVhZHkgdG8gYmUgZGVsaXZlcmVkCisgKiAod2l0aCBhIG1vdmVkIG1lc3NhZ2UgaGVhZGVyIHRvIG1ha2Ugc3VyZSBpdCBpcyBzaXplLWFsaWduZWQgdG8KKyAqIDE2KSwgVEFJTCByb29tIHRoYXQgd2FzIHVudXNhYmxlIChhbmQgdGh1cyBpcyBtYXJrZWQgd2l0aCBhIG1lc3NhZ2UKKyAqIGhlYWRlciB0aGF0IHNheXMgJ3NraXAgdGhpcycpIGFuZCBhdCB0aGUgaGVhZCBvZiB0aGUgYnVmZmVyLCBhbgorICogaW1jb21wbGV0ZSBtZXNzYWdlIHdpdGggYSBjb3VwbGUgb2YgcGF5bG9hZHMuCisgKgorICogTiAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworICogICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqICAgIHwgICAgIFRBSUwgcm9vbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogICAgfCAgbXNnX2hkciB0byBza2lwIChzaXplIHw9IDB4ODAwMDApICAgICAgICAgICAgICAgIHwKKyAqICAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLQorICogICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIC98XAorICogICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICB8CisgKiAgICB8ICBUWCBtZXNzYWdlIHBhZGRpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIHwKKyAqICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgfAorICogICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICB8CisgKiAgICB8LSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtfCAgIHwKKyAqICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgfAorICogICAgfCAgcGF5bG9hZCAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICB8CisgKiAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBOICogdHhfYmxvY2tfc2l6ZQorICogICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICB8CisgKiAgICB8LSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtfCAgIHwKKyAqICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgfAorICogICAgfCAgcGF5bG9hZCAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICB8CisgKiAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIHwKKyAqICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgfAorICogICAgfC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLXwtIC18LSAtIC0gLQorICogICAgfCAgcGFkZGluZyAzICAgICAgICAgICAgICAgICAgL3xcICAgICAgICAgICAgICAgICAgIHwgICB8ICAgL3xcCisgKiAgICB8ICBwYWRkaW5nIDIgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgfCAgIHwgICAgfAorICogICAgfCAgcGxkIDEgICAgICAgICAgICAgICAgMzIgYnl0ZXMgKDIgKiAxNikgICAgICAgICAgIHwgICB8ICAgIHwKKyAqICAgIHwgIHBsZCAwICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICB8ICAgfCAgICB8CisgKiAgICB8ICBtb3ZlZCBtc2dfaGRyICAgICAgICAgICAgICBcfC8gICAgICAgICAgICAgICAgICAgfCAgXHwvICAgfAorICogICAgfC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLXwtIC0gLSAgIHwKKyAqICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgIF9QTERfU0laRQorICogICAgfCAgdW51c2VkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgIHwKKyAqICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICB8CisgKiAgICB8LSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtfCAgICAgICAgfAorICogICAgfCAgbXNnX2hkciAoc2l6ZSBYKSAgICAgICBbdGhpcyBtZXNzYWdlIGlzIGNsb3NlZF0gIHwgICAgICAgXHwvCisgKiAgICB8PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09fD09PT09PT09PT0gPD09PSBPVVQKKyAqICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqICAgIHwgICAgICAgICAgRnJlZSByb29vbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiAgICB8PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09fD09PT09PT09PT0gPD09PSBJTgorICogICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqICAgIHwgIHBheWxvYWQgMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqICAgIHwtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC18CisgKiAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogICAgfCAgcGF5bG9hZCAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogICAgfC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLXwKKyAqICAgIHwgIHBsZCAxMSAgICAgICAgICAgICAgICAgICAgIC98XCAgICAgICAgICAgICAgICAgICB8CisgKiAgICB8ICAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgfAorICogICAgfCAgcGxkIDEgICAgICAgICAgICAgICAgNjQgYnl0ZXMgKDIgKiAxNikgICAgICAgICAgIHwKKyAqICAgIHwgIHBsZCAwICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICB8CisgKiAgICB8ICBtc2dfaGRyIChzaXplIFgpICAgICAgICAgICBcfC8gW21lc3NhZ2UgaXMgb3Blbl0gfAorICogMCAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqCisgKiBST0FETUFQCisgKgorICogaTI0MDBtX3R4X3NldHVwKCkgICAgICAgICAgIENhbGxlZCBieSBpMjQwMG1fc2V0dXAKKyAqIGkyNDAwbV90eF9yZWxlYXNlKCkgICAgICAgICBDYWxsZWQgYnkgaTI0MDBtX3JlbGVhc2UoKQorICoKKyAqICBpMjQwMG1fdHgoKSAgICAgICAgICAgICAgICAgQ2FsbGVkIHRvIHNlbmQgZGF0YSBvciBjb250cm9sIGZyYW1lcworICogICAgaTI0MDBtX3R4X2ZpZm9fcHVzaCgpICAgICBBbGxvY2F0ZXMgYXBwZW5kLXNwYWNlIGluIHRoZSBGSUZPCisgKiAgICBpMjQwMG1fdHhfbmV3KCkgICAgICAgICAgIE9wZW5zIGEgbmV3IG1lc3NhZ2UgaW4gdGhlIEZJRk8KKyAqICAgIGkyNDAwbV90eF9maXRzKCkgICAgICAgICAgQ2hlY2tzIGlmIGEgbmV3IHBheWxvYWQgZml0cyBpbiB0aGUgbWVzc2FnZQorICogICAgaTI0MDBtX3R4X2Nsb3NlKCkgICAgICAgICBDbG9zZXMgYW4gb3BlbiBtZXNzYWdlIGluIHRoZSBGSUZPCisgKiAgICBpMjQwMG1fdHhfc2tpcF90YWlsKCkgICAgIE1hcmtzIHVudXNhYmxlIEZJRk8gdGFpbCBzcGFjZQorICogICAgaTI0MDBtLT5idXNfdHhfa2ljaygpCisgKgorICogTm93IGkyNDAwbS0+YnVzX3R4X2tpY2soKSBpcyB0aGUgdGhlIGJ1cy1zcGVjaWZpYyBkcml2ZXIgYmFja2VuZAorICogaW1wbGVtZW50YXRpb247IHRoYXQgd291bGQgZG86CisgKgorICogaTI0MDBtLT5idXNfdHhfa2ljaygpCisgKiAgIGkyNDAwbV90eF9tc2dfZ2V0KCkJR2V0cyBmaXJzdCBtZXNzYWdlIHJlYWR5IHRvIGdvCisgKiAgIC4uLnNlbmRzIGl0Li4uCisgKiAgIGkyNDAwbV90eF9tc2dfc2VudCgpICAgICAgIEFjayB0aGUgbWVzc2FnZSBpcyBzZW50OyByZXBlYXQgZnJvbQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdHhfbXNnX2dldCgpIHVudGlsIGl0IHJldHVybnMgTlVMTAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZJRk8gZW1wdHkpLgorICovCisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSAiaTI0MDBtLmgiCisKKworI2RlZmluZSBEX1NVQk1PRFVMRSB0eAorI2luY2x1ZGUgImRlYnVnLWxldmVscy5oIgorCitlbnVtIHsKKwkvKioKKwkgKiBUWCBCdWZmZXIgc2l6ZQorCSAqCisJICogRG9jIHNheXMgbWF4aW11bSB0cmFuc2FjdGlvbiBpcyAxNktpQi4gSWYgd2UgaGFkIDE2S2lCIGVuCisJICogcm91dGUgYW5kIDE2S2lCIGJlaW5nIHF1ZXVlZCwgaXQgYm9pbHMgZG93biB0byBuZWVkaW5nCisJICogMzJLaUIuCisJICovCisJSTI0MDBNX1RYX0JVRl9TSVpFID0gMzI3NjgsCisJLyoqCisJICogTWVzc2FnZSBoZWFkZXIgYW5kIHBheWxvYWQgZGVzY3JpcHRvcnMgaGF2ZSB0byBiZSAxNgorCSAqIGFsaWduZWQgKDE2ICsgNCAqIE4gPSAxNiAqIE0pLiBJZiB3ZSB0YWtlIHRoYXQgYXZlcmFnZSBzZW50CisJICogcGFja2V0cyBhcmUgTVRVIHNpemUgKH4xNDAwLX4xNTAwKSBpdCBmb2xsb3dzIHRoYXQgd2UgY291bGQKKwkgKiBmaXQgYXQgbW9zdCAxMC0xMSBwYXlsb2FkcyBpbiBvbmUgdHJhbnNhY3Rpb24uIFRvIG1lZXQgdGhlCisJICogYWxpZ25tZW50IHJlcXVpcmVtZW50LCB0aGF0IG1lYW5zIHdlIG5lZWQgdG8gbGVhdmUgc3BhY2UKKwkgKiBmb3IgMTIgKDY0IGJ5dGVzKS4gVG8gc2ltcGxpZnksIHdlIGxlYXZlIHNwYWNlIGZvciB0aGF0LiBJZgorCSAqIGF0IHRoZSBlbmQgdGhlcmUgYXJlIGxlc3MsIHdlIHBhZCB1cCB0byB0aGUgbmVhcmVzdAorCSAqIG11bHRpcGxlIG9mIDE2LgorCSAqLworCUkyNDAwTV9UWF9QTERfTUFYID0gMTIsCisJSTI0MDBNX1RYX1BMRF9TSVpFID0gc2l6ZW9mKHN0cnVjdCBpMjQwMG1fbXNnX2hkcikKKwkrIEkyNDAwTV9UWF9QTERfTUFYICogc2l6ZW9mKHN0cnVjdCBpMjQwMG1fcGxkKSwKKwlJMjQwME1fVFhfU0tJUCA9IDB4ODAwMDAwMDAsCit9OworCisjZGVmaW5lIFRBSUxfRlVMTCAoKHZvaWQgKil+KHVuc2lnbmVkIGxvbmcpTlVMTCkKKworLyoKKyAqIEFsbG9jYXRlIEBzaXplIGJ5dGVzIGluIHRoZSBUWCBmaWZvLCByZXR1cm4gYSBwb2ludGVyIHRvIGl0CisgKgorICogQGkyNDAwbTogZGV2aWNlIGRlc2NyaXB0b3IKKyAqIEBzaXplOiBzaXplIG9mIHRoZSBidWZmZXIgd2UgbmVlZCB0byBhbGxvY2F0ZQorICogQHBhZGRpbmc6IGVuc3VyZSB0aGF0IHRoZXJlIGlzIGF0IGxlYXN0IHRoaXMgbWFueSBieXRlcyBvZiBmcmVlCisgKiAgICAgY29udGlndW91cyBzcGFjZSBpbiB0aGUgZmlmby4gVGhpcyBpcyBuZWVkZWQgYmVjYXVzZSBsYXRlciBvbgorICogICAgIHdlIG1pZ2h0IG5lZWQgdG8gYWRkIHBhZGRpbmcuCisgKgorICogUmV0dXJuczoKKyAqCisgKiAgICAgUG9pbnRlciB0byB0aGUgYWxsb2NhdGVkIHNwYWNlLiBOVUxMIGlmIHRoZXJlIGlzIG5vCisgKiAgICAgc3BhY2UuIFRBSUxfRlVMTCBpZiB0aGVyZSBpcyBubyBzcGFjZSBhdCB0aGUgdGFpbCBidXQgdGhlcmUgaXMgYXQKKyAqICAgICB0aGUgaGVhZCAoQ2FzZSBCIGJlbG93KS4KKyAqCisgKiBUaGVzZSBhcmUgdGhlIHR3byBiYXNpYyBjYXNlcyB3ZSBuZWVkIHRvIGtlZXAgYW4gZXllIGZvciAtLSBpdCBpcworICogbXVjaCBiZXR0ZXIgZXhwbGFpbmVkIGluIGxpbnV4L2tlcm5lbC9rZmlmby5jLCBidXQgdGhpcyBjb2RlCisgKiBiYXNpY2FsbHkgZG9lcyB0aGUgc2FtZS4gTm8gcm9ja2V0IHNjaWVuY2UgaGVyZS4KKyAqCisgKiAgICAgICBDYXNlIEEgICAgICAgICAgICAgICBDYXNlIEIKKyAqIE4gIF9fX19fX19fX19fICAgICAgICAgIF9fX19fX19fX19fCisgKiAgIHwgdGFpbCByb29tIHwgICAgICAgIHwgICBkYXRhICAgIHwKKyAqICAgfCAgICAgICAgICAgfCAgICAgICAgfCAgICAgICAgICAgfAorICogICB8PC0gIElOICAgLT58ICAgICAgICB8PC0gIE9VVCAgLT58CisgKiAgIHwgICAgICAgICAgIHwgICAgICAgIHwgICAgICAgICAgIHwKKyAqICAgfCAgIGRhdGEgICAgfCAgICAgICAgfCAgIHJvb20gICAgfAorICogICB8ICAgICAgICAgICB8ICAgICAgICB8ICAgICAgICAgICB8CisgKiAgIHw8LSAgT1VUICAtPnwgICAgICAgIHw8LSAgSU4gICAtPnwKKyAqICAgfCAgICAgICAgICAgfCAgICAgICAgfCAgICAgICAgICAgfAorICogICB8IGhlYWQgcm9vbSB8ICAgICAgICB8ICAgZGF0YSAgICB8CisgKiAwICAtLS0tLS0tLS0tLSAgICAgICAgICAtLS0tLS0tLS0tLQorICoKKyAqIFdlIGFsbG9jYXRlIG9ubHkgKmNvbnRpZ3VvdXMqIHNwYWNlLgorICoKKyAqIFdlIGNhbiBhbGxvY2F0ZSBvbmx5IGZyb20gJ3Jvb20nLiBJbiBDYXNlIEIsIGl0IGlzIHNpbXBsZTsgaW4gY2FzZQorICogQSwgd2Ugb25seSB0cnkgZnJvbSB0aGUgdGFpbCByb29tOyBpZiBpdCBpcyBub3QgZW5vdWdoLCB3ZSBqdXN0CisgKiBmYWlsIGFuZCByZXR1cm4gVEFJTF9GVUxMIGFuZCBsZXQgdGhlIGNhbGxlciBmaWd1cmUgb3V0IGlmIHdlIHdhbnRzIHRvCisgKiBza2lwIHRoZSB0YWlsIHJvb20gYW5kIHRyeSB0byBhbGxvY2F0ZSBmcm9tIHRoZSBoZWFkLgorICoKKyAqIE5vdGU6CisgKgorICogICAgIEFzc3VtZXMgaTI0MDBtLT50eF9sb2NrIGlzIHRha2VuLCBhbmQgd2UgdXNlIHRoYXQgYXMgYSBiYXJyaWVyCisgKgorICogICAgIFRoZSBpbmRleGVzIGtlZXAgaW5jcmVhc2luZyBhbmQgd2UgcmVzZXQgdGhlbSB0byB6ZXJvIHdoZW4gd2UKKyAqICAgICBwb3AgZGF0YSBvZmYgdGhlIHF1ZXVlCisgKi8KK3N0YXRpYwordm9pZCAqaTI0MDBtX3R4X2ZpZm9fcHVzaChzdHJ1Y3QgaTI0MDBtICppMjQwMG0sIHNpemVfdCBzaXplLCBzaXplX3QgcGFkZGluZykKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBpMjQwMG1fZGV2KGkyNDAwbSk7CisJc2l6ZV90IHJvb20sIHRhaWxfcm9vbSwgbmVlZGVkX3NpemU7CisJdm9pZCAqcHRyOworCisJbmVlZGVkX3NpemUgPSBzaXplICsgcGFkZGluZzsKKwlyb29tID0gSTI0MDBNX1RYX0JVRl9TSVpFIC0gKGkyNDAwbS0+dHhfaW4gLSBpMjQwMG0tPnR4X291dCk7CisJaWYgKHJvb20gPCBuZWVkZWRfc2l6ZSkJeyAvKiB0aGlzIHRha2VzIGNhcmUgb2YgQ2FzZSBCICovCisJCWRfcHJpbnRmKDIsIGRldiwgImZpZm8gcHVzaCAlenUvJXp1OiBubyBzcGFjZVxuIiwKKwkJCSBzaXplLCBwYWRkaW5nKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCS8qIElzIHRoZXJlIHNwYWNlIGF0IHRoZSB0YWlsPyAqLworCXRhaWxfcm9vbSA9IEkyNDAwTV9UWF9CVUZfU0laRSAtIGkyNDAwbS0+dHhfaW4gJSBJMjQwME1fVFhfQlVGX1NJWkU7CisJaWYgKHRhaWxfcm9vbSA8IG5lZWRlZF9zaXplKSB7CisJCWlmIChpMjQwMG0tPnR4X291dCAlIEkyNDAwTV9UWF9CVUZfU0laRQorCQkgICAgPCBpMjQwMG0tPnR4X2luICUgSTI0MDBNX1RYX0JVRl9TSVpFKSB7CisJCQlkX3ByaW50ZigyLCBkZXYsICJmaWZvIHB1c2ggJXp1LyV6dTogdGFpbCBmdWxsXG4iLAorCQkJCSBzaXplLCBwYWRkaW5nKTsKKwkJCXJldHVybiBUQUlMX0ZVTEw7CS8qIFRoZXJlIG1pZ2h0IGJlIGhlYWQgc3BhY2UgKi8KKwkJfSBlbHNlIHsKKwkJCWRfcHJpbnRmKDIsIGRldiwgImZpZm8gcHVzaCAlenUvJXp1OiBubyBoZWFkIHNwYWNlXG4iLAorCQkJCSBzaXplLCBwYWRkaW5nKTsKKwkJCXJldHVybiBOVUxMOwkvKiBUaGVyZSBpcyBubyBzcGFjZSAqLworCQl9CisJfQorCXB0ciA9IGkyNDAwbS0+dHhfYnVmICsgaTI0MDBtLT50eF9pbiAlIEkyNDAwTV9UWF9CVUZfU0laRTsKKwlkX3ByaW50ZigyLCBkZXYsICJmaWZvIHB1c2ggJXp1LyV6dTogYXQgQCV6dVxuIiwgc2l6ZSwgcGFkZGluZywKKwkJIGkyNDAwbS0+dHhfaW4gJSBJMjQwME1fVFhfQlVGX1NJWkUpOworCWkyNDAwbS0+dHhfaW4gKz0gc2l6ZTsKKwlyZXR1cm4gcHRyOworfQorCisKKy8qCisgKiBNYXJrIHRoZSB0YWlsIG9mIHRoZSBGSUZPIGJ1ZmZlciBhcyAndG8tc2tpcCcKKyAqCisgKiBXZSBzaG91bGQgbmV2ZXIgaGl0IHRoZSBCVUdfT04oKSBiZWNhdXNlIGFsbCB0aGUgc2l6ZXMgd2UgcHVzaCB0bworICogdGhlIEZJRk8gYXJlIHBhZGRlZCB0byBiZSBhIG11bHRpcGxlIG9mIDE2IC0tIHRoZSBzaXplIG9mICptc2cKKyAqIChJMjQwME1fUExfUEFEIGZvciB0aGUgcGF5bG9hZHMsIEkyNDAwTV9UWF9QTERfU0laRSBmb3IgdGhlCisgKiBoZWFkZXIpLgorICoKKyAqIE5vdGU6CisgKgorICogICAgIEFzc3VtZXMgaTI0MDBtLT50eF9sb2NrIGlzIHRha2VuLCBhbmQgd2UgdXNlIHRoYXQgYXMgYSBiYXJyaWVyCisgKi8KK3N0YXRpYwordm9pZCBpMjQwMG1fdHhfc2tpcF90YWlsKHN0cnVjdCBpMjQwMG0gKmkyNDAwbSkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBpMjQwMG1fZGV2KGkyNDAwbSk7CisJc2l6ZV90IHR4X2luID0gaTI0MDBtLT50eF9pbiAlIEkyNDAwTV9UWF9CVUZfU0laRTsKKwlzaXplX3QgdGFpbF9yb29tID0gSTI0MDBNX1RYX0JVRl9TSVpFIC0gdHhfaW47CisJc3RydWN0IGkyNDAwbV9tc2dfaGRyICptc2cgPSBpMjQwMG0tPnR4X2J1ZiArIHR4X2luOworCUJVR19PTih0YWlsX3Jvb20gPCBzaXplb2YoKm1zZykpOworCW1zZy0+c2l6ZSA9IHRhaWxfcm9vbSB8IEkyNDAwTV9UWF9TS0lQOworCWRfcHJpbnRmKDIsIGRldiwgInNraXAgdGFpbDogc2tpcHBpbmcgJXp1IGJ5dGVzIEAlenVcbiIsCisJCSB0YWlsX3Jvb20sIHR4X2luKTsKKwlpMjQwMG0tPnR4X2luICs9IHRhaWxfcm9vbTsKK30KKworCisvKgorICogQ2hlY2sgaWYgYSBza2Igd2lsbCBmaXQgaW4gdGhlIFRYIHF1ZXVlJ3MgY3VycmVudCBhY3RpdmUgVFgKKyAqIG1lc3NhZ2UgKGlmIHRoZXJlIGFyZSBzdGlsbCBkZXNjcmlwdG9ycyBsZWZ0IHVudXNlZCkuCisgKgorICogUmV0dXJuczoKKyAqICAgICAwIGlmIHRoZSBtZXNzYWdlIHdvbid0IGZpdCwgMSBpZiBpdCB3aWxsLgorICoKKyAqIE5vdGU6CisgKgorICogICAgIEFzc3VtZXMgYSBUWCBtZXNzYWdlIGlzIGFjdGl2ZSAoaTI0MDBtLT50eF9tc2cpLgorICoKKyAqICAgICBBc3N1bWVzIGkyNDAwbS0+dHhfbG9jayBpcyB0YWtlbiwgYW5kIHdlIHVzZSB0aGF0IGFzIGEgYmFycmllcgorICovCitzdGF0aWMKK3Vuc2lnbmVkIGkyNDAwbV90eF9maXRzKHN0cnVjdCBpMjQwMG0gKmkyNDAwbSkKK3sKKwlzdHJ1Y3QgaTI0MDBtX21zZ19oZHIgKm1zZ19oZHIgPSBpMjQwMG0tPnR4X21zZzsKKwlyZXR1cm4gbGUxNl90b19jcHUobXNnX2hkci0+bnVtX3BscykgPCBJMjQwME1fVFhfUExEX01BWDsKKworfQorCisKKy8qCisgKiBTdGFydCBhIG5ldyBUWCBtZXNzYWdlIGhlYWRlciBpbiB0aGUgcXVldWUuCisgKgorICogUmVzZXJ2ZSBtZW1vcnkgZnJvbSB0aGUgYmFzZSBGSUZPIGVuZ2luZSBhbmQgdGhlbiBqdXN0IGluaXRpYWxpemUKKyAqIHRoZSBtZXNzYWdlIGhlYWRlci4KKyAqCisgKiBXZSBhbGxvY2F0ZSB0aGUgYmlnZ2VzdCBUWCBtZXNzYWdlIGhlYWRlciB3ZSBtaWdodCBuZWVkIChvbmUgdGhhdCdkCisgKiBmaXQgSTI0MDBNX1RYX1BMRF9NQVggcGF5bG9hZHMpIC0tIHdoZW4gaXQgaXMgY2xvc2VkIGl0IHdpbGwgYmUKKyAqICdpcm9uZWQgaXQgb3V0JyBhbmQgdGhlIHVubmVlZGVkIHBhcnRzIHJlbW92ZWQuCisgKgorICogTk9URToKKyAqCisgKiAgICAgQXNzdW1lcyB0aGF0IHRoZSBwcmV2aW91cyBtZXNzYWdlIGlzIENMT1NFRCAoZWc6IGVpdGhlcgorICogICAgIHRoZXJlIHdhcyBub25lIG9yICdpMjQwMG1fdHhfY2xvc2UoKScgd2FzIGNhbGxlZCBvbiBpdCkuCisgKgorICogICAgIEFzc3VtZXMgaTI0MDBtLT50eF9sb2NrIGlzIHRha2VuLCBhbmQgd2UgdXNlIHRoYXQgYXMgYSBiYXJyaWVyCisgKi8KK3N0YXRpYwordm9pZCBpMjQwMG1fdHhfbmV3KHN0cnVjdCBpMjQwMG0gKmkyNDAwbSkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBpMjQwMG1fZGV2KGkyNDAwbSk7CisJc3RydWN0IGkyNDAwbV9tc2dfaGRyICp0eF9tc2c7CisJQlVHX09OKGkyNDAwbS0+dHhfbXNnICE9IE5VTEwpOwordHJ5X2hlYWQ6CisJdHhfbXNnID0gaTI0MDBtX3R4X2ZpZm9fcHVzaChpMjQwMG0sIEkyNDAwTV9UWF9QTERfU0laRSwgMCk7CisJaWYgKHR4X21zZyA9PSBOVUxMKQorCQlnb3RvIG91dDsKKwllbHNlIGlmICh0eF9tc2cgPT0gVEFJTF9GVUxMKSB7CisJCWkyNDAwbV90eF9za2lwX3RhaWwoaTI0MDBtKTsKKwkJZF9wcmludGYoMiwgZGV2LCAibmV3IFRYIG1lc3NhZ2U6IHRhaWwgZnVsbCwgdHJ5aW5nIGhlYWRcbiIpOworCQlnb3RvIHRyeV9oZWFkOworCX0KKwltZW1zZXQodHhfbXNnLCAwLCBJMjQwME1fVFhfUExEX1NJWkUpOworCXR4X21zZy0+c2l6ZSA9IEkyNDAwTV9UWF9QTERfU0laRTsKK291dDoKKwlpMjQwMG0tPnR4X21zZyA9IHR4X21zZzsKKwlkX3ByaW50ZigyLCBkZXYsICJuZXcgVFggbWVzc2FnZTogJXAgQCV6dVxuIiwKKwkJIHR4X21zZywgKHZvaWQgKikgdHhfbXNnIC0gaTI0MDBtLT50eF9idWYpOworfQorCisKKy8qCisgKiBGaW5hbGl6ZSB0aGUgY3VycmVudCBUWCBtZXNzYWdlIGhlYWRlcgorICoKKyAqIFNldHMgdGhlIG1lc3NhZ2UgaGVhZGVyIHRvIGJlIGF0IHRoZSBwcm9wZXIgbG9jYXRpb24gZGVwZW5kaW5nIG9uCisgKiBob3cgbWFueSBkZXNjcmlwdG9ycyB3ZSBoYXZlIChjaGVjayBkb2N1bWVudGF0aW9uIGF0IHRoZSBmaWxlJ3MKKyAqIGhlYWRlciBmb3IgbW9yZSBpbmZvIG9uIHRoYXQpLgorICoKKyAqIEFwcGVuZHMgcGFkZGluZyBieXRlcyB0byBtYWtlIHN1cmUgdGhlIHdob2xlIFRYIG1lc3NhZ2UgKGNvdW50aW5nCisgKiBmcm9tIHRoZSAncmVsb2NhdGVkJyBtZXNzYWdlIGhlYWRlcikgaXMgYWxpZ25lZCB0bworICogdHhfYmxvY2tfc2l6ZS4gV2UgYXNzdW1lIHRoZSBfYXBwZW5kKCkgY29kZSBoYXMgbGVmdCBlbm91Z2ggc3BhY2UKKyAqIGluIHRoZSBGSUZPIGZvciB0aGF0LiBJZiB0aGVyZSBhcmUgbm8gcGF5bG9hZHMsIGp1c3QgcGFzcywgYXMgaXQKKyAqIHdvbid0IGJlIHRyYW5zZmVycmVkLgorICoKKyAqIFRoZSBhbW91bnQgb2YgcGFkZGluZyBieXRlcyBkZXBlbmRzIG9uIGhvdyBtYW55IHBheWxvYWRzIGFyZSBpbiB0aGUKKyAqIFRYIG1lc3NhZ2UsIGFzIHRoZSAibXNnIGhlYWRlciBhbmQgcGF5bG9hZCBkZXNjcmlwdG9ycyIgd2lsbCBiZQorICogc2hpZnRlZCB1cCBpbiB0aGUgYnVmZmVyLgorICovCitzdGF0aWMKK3ZvaWQgaTI0MDBtX3R4X2Nsb3NlKHN0cnVjdCBpMjQwMG0gKmkyNDAwbSkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBpMjQwMG1fZGV2KGkyNDAwbSk7CisJc3RydWN0IGkyNDAwbV9tc2dfaGRyICp0eF9tc2cgPSBpMjQwMG0tPnR4X21zZzsKKwlzdHJ1Y3QgaTI0MDBtX21zZ19oZHIgKnR4X21zZ19tb3ZlZDsKKwlzaXplX3QgYWxpZ25lZF9zaXplLCBwYWRkaW5nLCBoZHJfc2l6ZTsKKwl2b2lkICpwYWRfYnVmOworCisJaWYgKHR4X21zZy0+c2l6ZSAmIEkyNDAwTV9UWF9TS0lQKQkvKiBhIHNraXBwZXI/IG5vdGhpbmcgdG8gZG8gKi8KKwkJZ290byBvdXQ7CisKKwkvKiBSZWxvY2F0ZSB0aGUgbWVzc2FnZSBoZWFkZXIKKwkgKgorCSAqIEZpbmQgdGhlIGN1cnJlbnQgaGVhZGVyIHNpemUsIGFsaWduIGl0IHRvIDE2IGFuZCBpZiB3ZSBuZWVkCisJICogdG8gbW92ZSBpdCBzbyB0aGUgdGFpbCBpcyBuZXh0IHRvIHRoZSBwYXlsb2FkcywgbW92ZSBpdCBhbmQKKwkgKiBzZXQgdGhlIG9mZnNldC4KKwkgKgorCSAqIElmIGl0IG1vdmVkLCB0aGlzIGhlYWRlciBpcyBnb29kIG9ubHkgZm9yIHRyYW5zbWlzc2lvbjsgdGhlCisJICogb3JpZ2luYWwgb25lIChpdCBpcyBrZXB0IGlmIHdlIG1vdmVkKSBpcyBzdGlsbCB1c2VkIHRvCisJICogZmlndXJlIG91dCB3aGVyZSB0aGUgbmV4dCBUWCBtZXNzYWdlIHN0YXJ0cyAoYW5kIHdoZXJlIHRoZQorCSAqIG9mZnNldCB0byB0aGUgbW92ZWQgaGVhZGVyIGlzKS4KKwkgKi8KKwloZHJfc2l6ZSA9IHNpemVvZigqdHhfbXNnKQorCQkrIGxlMTZfdG9fY3B1KHR4X21zZy0+bnVtX3BscykgKiBzaXplb2YodHhfbXNnLT5wbGRbMF0pOworCWhkcl9zaXplID0gQUxJR04oaGRyX3NpemUsIEkyNDAwTV9QTF9QQUQpOworCXR4X21zZy0+b2Zmc2V0ID0gSTI0MDBNX1RYX1BMRF9TSVpFIC0gaGRyX3NpemU7CisJdHhfbXNnX21vdmVkID0gKHZvaWQgKikgdHhfbXNnICsgdHhfbXNnLT5vZmZzZXQ7CisJbWVtbW92ZSh0eF9tc2dfbW92ZWQsIHR4X21zZywgaGRyX3NpemUpOworCXR4X21zZ19tb3ZlZC0+c2l6ZSAtPSB0eF9tc2ctPm9mZnNldDsKKwkvKgorCSAqIE5vdyBmaWd1cmUgb3V0IGhvdyBtdWNoIHdlIGhhdmUgdG8gYWRkIHRvIHRoZSAobW92ZWQhKQorCSAqIG1lc3NhZ2Ugc28gdGhlIHNpemUgaXMgYSBtdWx0aXBsZSBvZiBpMjQwMG0tPmJ1c190eF9ibG9ja19zaXplLgorCSAqLworCWFsaWduZWRfc2l6ZSA9IEFMSUdOKHR4X21zZ19tb3ZlZC0+c2l6ZSwgaTI0MDBtLT5idXNfdHhfYmxvY2tfc2l6ZSk7CisJcGFkZGluZyA9IGFsaWduZWRfc2l6ZSAtIHR4X21zZ19tb3ZlZC0+c2l6ZTsKKwlpZiAocGFkZGluZyA+IDApIHsKKwkJcGFkX2J1ZiA9IGkyNDAwbV90eF9maWZvX3B1c2goaTI0MDBtLCBwYWRkaW5nLCAwKTsKKwkJaWYgKHVubGlrZWx5KFdBUk5fT04ocGFkX2J1ZiA9PSBOVUxMCisJCQkJICAgICB8fCBwYWRfYnVmID09IFRBSUxfRlVMTCkpKSB7CisJCQkvKiBUaGlzIHNob3VsZCBub3QgaGFwcGVuIC0tIGFwcGVuZCBzaG91bGQgdmVyaWZ5CisJCQkgKiB0aGVyZSBpcyBhbHdheXMgc3BhY2UgbGVmdCBhdCBsZWFzdCB0byBhcHBlbmQKKwkJCSAqIHR4X2Jsb2NrX3NpemUgKi8KKwkJCWRldl9lcnIoZGV2LAorCQkJCSJTVyBCVUchIFBvc3NpYmxlIGRhdGEgbGVha2FnZSBmcm9tIG1lbW9yeSB0aGUgIgorCQkJCSJkZXZpY2Ugc2hvdWxkIG5vdCByZWFkIGZvciBwYWRkaW5nIC0gIgorCQkJCSJzaXplICVsdSBhbGlnbmVkX3NpemUgJXp1IHR4X2J1ZiAlcCBpbiAiCisJCQkJIiV6dSBvdXQgJXp1XG4iLAorCQkJCSh1bnNpZ25lZCBsb25nKSB0eF9tc2dfbW92ZWQtPnNpemUsCisJCQkJYWxpZ25lZF9zaXplLCBpMjQwMG0tPnR4X2J1ZiwgaTI0MDBtLT50eF9pbiwKKwkJCQlpMjQwMG0tPnR4X291dCk7CisJCX0gZWxzZQorCQkJbWVtc2V0KHBhZF9idWYsIDB4YWQsIHBhZGRpbmcpOworCX0KKwl0eF9tc2dfbW92ZWQtPnBhZGRpbmcgPSBjcHVfdG9fbGUxNihwYWRkaW5nKTsKKwl0eF9tc2dfbW92ZWQtPnNpemUgKz0gcGFkZGluZzsKKwlpZiAodHhfbXNnICE9IHR4X21zZ19tb3ZlZCkKKwkJdHhfbXNnLT5zaXplICs9IHBhZGRpbmc7CitvdXQ6CisJaTI0MDBtLT50eF9tc2cgPSBOVUxMOworfQorCisKKy8qKgorICogaTI0MDBtX3R4IC0gc2VuZCB0aGUgZGF0YSBpbiBhIGJ1ZmZlciB0byB0aGUgZGV2aWNlCisgKgorICogQGJ1ZjogcG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHRyYW5zbWl0CisgKgorICogQGJ1Zl9sZW46IGJ1ZmZlciBzaXplCisgKgorICogQHBsX3R5cGU6IHR5cGUgb2YgdGhlIHBheWxvYWQgd2UgYXJlIHNlbmRpbmcuCisgKgorICogUmV0dXJuczoKKyAqICAgICAwIGlmIG9rLCA8IDAgZXJybm8gY29kZSBvbiBlcnJvciAoLUVOT1NQQywgaWYgdGhlcmUgaXMgbm8gbW9yZQorICogICAgIHJvb20gZm9yIHRoZSBtZXNzYWdlIGluIHRoZSBxdWV1ZSkuCisgKgorICogQXBwZW5kcyB0aGUgYnVmZmVyIHRvIHRoZSBUWCBGSUZPIGFuZCBub3RpZmllcyB0aGUgYnVzLXNwZWNpZmljCisgKiBwYXJ0IG9mIHRoZSBkcml2ZXIgdGhhdCB0aGVyZSBpcyBuZXcgZGF0YSByZWFkeSB0byB0cmFuc21pdC4KKyAqIE9uY2UgdGhpcyBmdW5jdGlvbiByZXR1cm5zLCB0aGUgYnVmZmVyIGhhcyBiZWVuIGNvcGllZCwgc28gaXQgY2FuCisgKiBiZSByZXVzZWQuCisgKgorICogVGhlIHN0ZXBzIGZvbGxvd2VkIHRvIGFwcGVuZCBhcmUgZXhwbGFpbmVkIGluIGRldGFpbCBpbiB0aGUgZmlsZQorICogaGVhZGVyLgorICoKKyAqIFdoZW5ldmVyIHdlIHdyaXRlIHRvIGEgbWVzc2FnZSwgd2UgaW5jcmVhc2UgbXNnLT5zaXplLCBzbyBpdAorICogcmVmbGVjdHMgZXhhY3RseSBob3cgYmlnIHRoZSBtZXNzYWdlIGlzLiBUaGlzIGlzIG5lZWRlZCBzbyB0aGF0IGlmCisgKiB3ZSBjb25jYXRlbmF0ZSB0d28gbWVzc2FnZXMgYmVmb3JlIHRoZXkgY2FuIGJlIHNlbnQsIHRoZSBjb2RlIHRoYXQKKyAqIHNlbmRzIHRoZSBtZXNzYWdlcyBjYW4gZmluZCB0aGUgYm91bmRhcmllcyAoYW5kIGl0IHdpbGwgcmVwbGFjZSB0aGUKKyAqIHNpemUgd2l0aCB0aGUgcmVhbCBiYXJrZXIgYmVmb3JlIHNlbmRpbmcpLgorICoKKyAqIE5vdGU6CisgKgorICogICAgIENvbGQgYW5kIHdhcm0gcmVzZXQgcGF5bG9hZHMgbmVlZCB0byBiZSBzZW50IGFzIGEgc2luZ2xlCisgKiAgICAgcGF5bG9hZCwgc28gd2UgaGFuZGxlIHRoYXQuCisgKi8KK2ludCBpMjQwMG1fdHgoc3RydWN0IGkyNDAwbSAqaTI0MDBtLCBjb25zdCB2b2lkICpidWYsIHNpemVfdCBidWZfbGVuLAorCSAgICAgIGVudW0gaTI0MDBtX3B0IHBsX3R5cGUpCit7CisJaW50IHJlc3VsdCA9IC1FTk9TUEM7CisJc3RydWN0IGRldmljZSAqZGV2ID0gaTI0MDBtX2RldihpMjQwMG0pOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc2l6ZV90IHBhZGRlZF9sZW47CisJdm9pZCAqcHRyOworCXVuc2lnbmVkIGlzX3NpbmdsZXRvbiA9IHBsX3R5cGUgPT0gSTI0MDBNX1BUX1JFU0VUX1dBUk0KKwkJfHwgcGxfdHlwZSA9PSBJMjQwME1fUFRfUkVTRVRfQ09MRDsKKworCWRfZm5zdGFydCgzLCBkZXYsICIoaTI0MDBtICVwIHNrYiAlcCBbJXp1IGJ5dGVzXSBwdCAldSlcbiIsCisJCSAgaTI0MDBtLCBidWYsIGJ1Zl9sZW4sIHBsX3R5cGUpOworCXBhZGRlZF9sZW4gPSBBTElHTihidWZfbGVuLCBJMjQwME1fUExfUEFEKTsKKwlkX3ByaW50Zig1LCBkZXYsICJwYWRkZWRfbGVuICV6ZCBidWZfbGVuICV6ZFxuIiwgcGFkZGVkX2xlbiwgYnVmX2xlbik7CisJLyogSWYgdGhlcmUgaXMgbm8gY3VycmVudCBUWCBtZXNzYWdlLCBjcmVhdGUgb25lOyBpZiB0aGUKKwkgKiBjdXJyZW50IG9uZSBpcyBvdXQgb2YgcGF5bG9hZCBzbG90cyBvciB3ZSBoYXZlIGEgc2luZ2xldG9uLAorCSAqIGNsb3NlIGl0IGFuZCBzdGFydCBhIG5ldyBvbmUgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmaTI0MDBtLT50eF9sb2NrLCBmbGFncyk7Cit0cnlfbmV3OgorCWlmICh1bmxpa2VseShpMjQwMG0tPnR4X21zZyA9PSBOVUxMKSkKKwkJaTI0MDBtX3R4X25ldyhpMjQwMG0pOworCWVsc2UgaWYgKHVubGlrZWx5KCFpMjQwMG1fdHhfZml0cyhpMjQwMG0pCisJCQkgIHx8IChpc19zaW5nbGV0b24gJiYgaTI0MDBtLT50eF9tc2ctPm51bV9wbHMgIT0gMCkpKSB7CisJCWRfcHJpbnRmKDIsIGRldiwgImNsb3NpbmcgVFggbWVzc2FnZSAoZml0cyAldSBzaW5nbGV0b24gIgorCQkJICIldSBudW1fcGxzICV1KVxuIiwgaTI0MDBtX3R4X2ZpdHMoaTI0MDBtKSwKKwkJCSBpc19zaW5nbGV0b24sIGkyNDAwbS0+dHhfbXNnLT5udW1fcGxzKTsKKwkJaTI0MDBtX3R4X2Nsb3NlKGkyNDAwbSk7CisJCWkyNDAwbV90eF9uZXcoaTI0MDBtKTsKKwl9CisJaWYgKGkyNDAwbS0+dHhfbXNnLT5zaXplICsgcGFkZGVkX2xlbiA+IEkyNDAwTV9UWF9CVUZfU0laRSAvIDIpIHsKKwkJZF9wcmludGYoMiwgZGV2LCAiVFg6IG1lc3NhZ2UgdG9vIGJpZywgZ29pbmcgbmV3XG4iKTsKKwkJaTI0MDBtX3R4X2Nsb3NlKGkyNDAwbSk7CisJCWkyNDAwbV90eF9uZXcoaTI0MDBtKTsKKwl9CisJaWYgKGkyNDAwbS0+dHhfbXNnID09IE5VTEwpCisJCWdvdG8gZXJyb3JfdHhfbmV3OworCS8qIFNvIHdlIGhhdmUgYSBjdXJyZW50IG1lc3NhZ2UgaGVhZGVyOyBub3cgYXBwZW5kIHNwYWNlIGZvcgorCSAqIHRoZSBtZXNzYWdlIC0tIGlmIHRoZXJlIGlzIG5vdCBlbm91Z2gsIHRyeSB0aGUgaGVhZCAqLworCXB0ciA9IGkyNDAwbV90eF9maWZvX3B1c2goaTI0MDBtLCBwYWRkZWRfbGVuLAorCQkJCSAgaTI0MDBtLT5idXNfdHhfYmxvY2tfc2l6ZSk7CisJaWYgKHB0ciA9PSBUQUlMX0ZVTEwpIHsJLyogVGFpbCBpcyBmdWxsLCB0cnkgaGVhZCAqLworCQlkX3ByaW50ZigyLCBkZXYsICJwbCBhcHBlbmQ6IHRhaWwgZnVsbFxuIik7CisJCWkyNDAwbV90eF9jbG9zZShpMjQwMG0pOworCQlpMjQwMG1fdHhfc2tpcF90YWlsKGkyNDAwbSk7CisJCWdvdG8gdHJ5X25ldzsKKwl9IGVsc2UgaWYgKHB0ciA9PSBOVUxMKSB7CS8qIEFsbCBmdWxsICovCisJCXJlc3VsdCA9IC1FTk9TUEM7CisJCWRfcHJpbnRmKDIsIGRldiwgInBsIGFwcGVuZDogYWxsIGZ1bGxcbiIpOworCX0gZWxzZSB7CQkJLyogR290IHNwYWNlLCBjb3B5IGl0LCBzZXQgcGFkZGluZyAqLworCQlzdHJ1Y3QgaTI0MDBtX21zZ19oZHIgKnR4X21zZyA9IGkyNDAwbS0+dHhfbXNnOworCQl1bnNpZ25lZCBudW1fcGxzID0gbGUxNl90b19jcHUodHhfbXNnLT5udW1fcGxzKTsKKwkJbWVtY3B5KHB0ciwgYnVmLCBidWZfbGVuKTsKKwkJbWVtc2V0KHB0ciArIGJ1Zl9sZW4sIDB4YWQsIHBhZGRlZF9sZW4gLSBidWZfbGVuKTsKKwkJaTI0MDBtX3BsZF9zZXQoJnR4X21zZy0+cGxkW251bV9wbHNdLCBidWZfbGVuLCBwbF90eXBlKTsKKwkJZF9wcmludGYoMywgZGV2LCAicGxkIDB4JTA4eCAodHlwZSAweCUxeCBsZW4gMHglMDR6eFxuIiwKKwkJCSBsZTMyX3RvX2NwdSh0eF9tc2ctPnBsZFtudW1fcGxzXS52YWwpLAorCQkJIHBsX3R5cGUsIGJ1Zl9sZW4pOworCQl0eF9tc2ctPm51bV9wbHMgPSBsZTE2X3RvX2NwdShudW1fcGxzKzEpOworCQl0eF9tc2ctPnNpemUgKz0gcGFkZGVkX2xlbjsKKwkJZF9wcmludGYoMiwgZGV2LCAiVFg6IGFwcGVuZGVkICV6dSBiICh1cCB0byAldSBiKSBwbCAjJXUgXG4iLAorCQkJcGFkZGVkX2xlbiwgdHhfbXNnLT5zaXplLCBudW1fcGxzKzEpOworCQlkX3ByaW50ZigyLCBkZXYsCisJCQkgIlRYOiBhcHBlbmRlZCBoZHIgQCV6dSAlenUgYiBwbCAjJXUgQCV6dSAlenUvJXp1IGJcbiIsCisJCQkgKHZvaWQgKil0eF9tc2cgLSBpMjQwMG0tPnR4X2J1ZiwgKHNpemVfdCl0eF9tc2ctPnNpemUsCisJCQkgbnVtX3BscysxLCBwdHIgLSBpMjQwMG0tPnR4X2J1ZiwgYnVmX2xlbiwgcGFkZGVkX2xlbik7CisJCXJlc3VsdCA9IDA7CisJCWlmIChpc19zaW5nbGV0b24pCisJCQlpMjQwMG1fdHhfY2xvc2UoaTI0MDBtKTsKKwl9CitlcnJvcl90eF9uZXc6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaTI0MDBtLT50eF9sb2NrLCBmbGFncyk7CisJaTI0MDBtLT5idXNfdHhfa2ljayhpMjQwMG0pOwkvKiBhbHdheXMga2ljaywgbWlnaHQgZnJlZSB1cCBzcGFjZSAqLworCWRfZm5lbmQoMywgZGV2LCAiKGkyNDAwbSAlcCBza2IgJXAgWyV6dSBieXRlc10gcHQgJXUpID0gJWRcbiIsCisJCWkyNDAwbSwgYnVmLCBidWZfbGVuLCBwbF90eXBlLCByZXN1bHQpOworCXJldHVybiByZXN1bHQ7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChpMjQwMG1fdHgpOworCisKKy8qKgorICogaTI0MDBtX3R4X21zZ19nZXQgLSBHZXQgdGhlIGZpcnN0IFRYIG1lc3NhZ2UgaW4gdGhlIEZJRk8gdG8gc3RhcnQgc2VuZGluZyBpdAorICoKKyAqIEBpMjQwMG06IGRldmljZSBkZXNjcmlwdG9ycworICogQGJ1c19zaXplOiB3aGVyZSB0byBwbGFjZSB0aGUgc2l6ZSBvZiB0aGUgVFggbWVzc2FnZQorICoKKyAqIENhbGxlZCBieSB0aGUgYnVzLXNwZWNpZmljIGRyaXZlciB0byBnZXQgdGhlIGZpcnN0IFRYIG1lc3NhZ2UgYXQKKyAqIHRoZSBGSUYgdGhhdCBpcyByZWFkeSBmb3IgdHJhbnNtaXNzaW9uLgorICoKKyAqIEl0IHNldHMgdGhlIHN0YXRlIGluIEBpMjQwMG0gdG8gaW5kaWNhdGUgdGhlIGJ1cy1zcGVjaWZpYyBkcml2ZXIgaXMKKyAqIHRyYW5zZmVyaW5nIHRoYXQgbWVzc2FnZSAoaTI0MDBtLT50eF9tc2dfc2l6ZSkuCisgKgorICogT25jZSB0aGUgdHJhbnNmZXIgaXMgY29tcGxldGVkLCBjYWxsIGkyNDAwbV90eF9tc2dfc2VudCgpLgorICoKKyAqIE5vdGVzOgorICoKKyAqICAgICBUaGUgc2l6ZSBvZiB0aGUgVFggbWVzc2FnZSB0byBiZSB0cmFuc21pdHRlZCBtaWdodCBiZSBzbWFsbGVyIHRoYW4KKyAqICAgICB0aGF0IG9mIHRoZSBUWCBtZXNzYWdlIGluIHRoZSBGSUZPIChpbiBjYXNlIHRoZSBoZWFkZXIgd2FzCisgKiAgICAgc2hvcnRlcikuIEhlbmNlLCB3ZSBjb3B5IGl0IGluIEBidXNfc2l6ZSwgZm9yIHRoZSBidXMgbGF5ZXIgdG8KKyAqICAgICB1c2UuIFdlIGtlZXAgdGhlIG1lc3NhZ2UncyBzaXplIGluIGkyNDAwbS0+dHhfbXNnX3NpemUgc28gdGhhdAorICogICAgIHdoZW4gdGhlIGJ1cyBsYXRlciBpcyBkb25lIHRyYW5zZmVycmluZyB3ZSBrbm93IGhvdyBtdWNoIHRvCisgKiAgICAgYWR2YW5jZSB0aGUgZmlmby4KKyAqCisgKiAgICAgV2UgY29sbGVjdCBzdGF0aXN0aWNzIGhlcmUgYXMgYWxsIHRoZSBkYXRhIGlzIGF2YWlsYWJsZSBhbmQgd2UKKyAqICAgICBhc3N1bWUgaXQgaXMgZ29pbmcgdG8gd29yayBbc2VlIGkyNDAwbV90eF9tc2dfc2VudCgpXS4KKyAqLworc3RydWN0IGkyNDAwbV9tc2dfaGRyICppMjQwMG1fdHhfbXNnX2dldChzdHJ1Y3QgaTI0MDBtICppMjQwMG0sCisJCQkJCSBzaXplX3QgKmJ1c19zaXplKQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGkyNDAwbV9kZXYoaTI0MDBtKTsKKwlzdHJ1Y3QgaTI0MDBtX21zZ19oZHIgKnR4X21zZywgKnR4X21zZ19tb3ZlZDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzLCBwbHM7CisKKwlkX2Zuc3RhcnQoMywgZGV2LCAiKGkyNDAwbSAlcCBidXNfc2l6ZSAlcClcbiIsIGkyNDAwbSwgYnVzX3NpemUpOworCXNwaW5fbG9ja19pcnFzYXZlKCZpMjQwMG0tPnR4X2xvY2ssIGZsYWdzKTsKK3NraXA6CisJdHhfbXNnX21vdmVkID0gTlVMTDsKKwlpZiAoaTI0MDBtLT50eF9pbiA9PSBpMjQwMG0tPnR4X291dCkgewkvKiBFbXB0eSBGSUZPPyAqLworCQlpMjQwMG0tPnR4X2luID0gMDsKKwkJaTI0MDBtLT50eF9vdXQgPSAwOworCQlkX3ByaW50ZigyLCBkZXYsICJUWDogRklGTyBlbXB0eTogcmVzZXR0aW5nXG4iKTsKKwkJZ290byBvdXRfdW5sb2NrOworCX0KKwl0eF9tc2cgPSBpMjQwMG0tPnR4X2J1ZiArIGkyNDAwbS0+dHhfb3V0ICUgSTI0MDBNX1RYX0JVRl9TSVpFOworCWlmICh0eF9tc2ctPnNpemUgJiBJMjQwME1fVFhfU0tJUCkgewkvKiBza2lwPyAqLworCQlkX3ByaW50ZigyLCBkZXYsICJUWDogc2tpcDogbXNnIEAlenUgKCV6dSBiKVxuIiwKKwkJCSBpMjQwMG0tPnR4X291dCAlIEkyNDAwTV9UWF9CVUZfU0laRSwKKwkJCSAoc2l6ZV90KSB0eF9tc2ctPnNpemUgJiB+STI0MDBNX1RYX1NLSVApOworCQlpMjQwMG0tPnR4X291dCArPSB0eF9tc2ctPnNpemUgJiB+STI0MDBNX1RYX1NLSVA7CisJCWdvdG8gc2tpcDsKKwl9CisKKwlpZiAodHhfbXNnLT5udW1fcGxzID09IDApIHsJCS8qIE5vIHBheWxvYWRzPyAqLworCQlpZiAodHhfbXNnID09IGkyNDAwbS0+dHhfbXNnKSB7CS8qIG9wZW4sIHdlIGFyZSBkb25lICovCisJCQlkX3ByaW50ZigyLCBkZXYsCisJCQkJICJUWDogRklGTyBlbXB0eTogb3BlbiBtc2cgdy9vIHBheWxvYWRzIEAlenVcbiIsCisJCQkJICh2b2lkICopIHR4X21zZyAtIGkyNDAwbS0+dHhfYnVmKTsKKwkJCXR4X21zZyA9IE5VTEw7CisJCQlnb3RvIG91dF91bmxvY2s7CisJCX0gZWxzZSB7CQkJLyogY2xvc2VkLCBza2lwIGl0ICovCisJCQlkX3ByaW50ZigyLCBkZXYsCisJCQkJICJUWDogc2tpcCBtc2cgdy9vIHBheWxvYWRzIEAlenUgKCV6dSBiKVxuIiwKKwkJCQkgKHZvaWQgKikgdHhfbXNnIC0gaTI0MDBtLT50eF9idWYsCisJCQkJIChzaXplX3QpIHR4X21zZy0+c2l6ZSk7CisJCQlpMjQwMG0tPnR4X291dCArPSB0eF9tc2ctPnNpemUgJiB+STI0MDBNX1RYX1NLSVA7CisJCQlnb3RvIHNraXA7CisJCX0KKwl9CisJaWYgKHR4X21zZyA9PSBpMjQwMG0tPnR4X21zZykJCS8qIG9wZW4gbXNnPyAqLworCQlpMjQwMG1fdHhfY2xvc2UoaTI0MDBtKTsKKworCS8qIE5vdyB3ZSBoYXZlIGEgdmFsaWQgVFggbWVzc2FnZSAod2l0aCBwYXlsb2FkcykgdG8gVFggKi8KKwl0eF9tc2dfbW92ZWQgPSAodm9pZCAqKSB0eF9tc2cgKyB0eF9tc2ctPm9mZnNldDsKKwlpMjQwMG0tPnR4X21zZ19zaXplID0gdHhfbXNnLT5zaXplOworCSpidXNfc2l6ZSA9IHR4X21zZ19tb3ZlZC0+c2l6ZTsKKwlkX3ByaW50ZigyLCBkZXYsICJUWDogcGlkICVkIG1zZyBoZHIgYXQgQCV6dSBvZmZzZXQgK0AlenUgIgorCQkgInNpemUgJXp1IGJ1c19zaXplICV6dVxuIiwKKwkJIGN1cnJlbnQtPnBpZCwgKHZvaWQgKikgdHhfbXNnIC0gaTI0MDBtLT50eF9idWYsCisJCSAoc2l6ZV90KSB0eF9tc2ctPm9mZnNldCwgKHNpemVfdCkgdHhfbXNnLT5zaXplLAorCQkgKHNpemVfdCkgdHhfbXNnX21vdmVkLT5zaXplKTsKKwl0eF9tc2dfbW92ZWQtPmJhcmtlciA9IGxlMzJfdG9fY3B1KEkyNDAwTV9IMkRfUFJFVklFV19CQVJLRVIpOworCXR4X21zZ19tb3ZlZC0+c2VxdWVuY2UgPSBsZTMyX3RvX2NwdShpMjQwMG0tPnR4X3NlcXVlbmNlKyspOworCisJcGxzID0gbGUzMl90b19jcHUodHhfbXNnX21vdmVkLT5udW1fcGxzKTsKKwlpMjQwMG0tPnR4X3BsX251bSArPSBwbHM7CQkvKiBVcGRhdGUgc3RhdHMgKi8KKwlpZiAocGxzID4gaTI0MDBtLT50eF9wbF9tYXgpCisJCWkyNDAwbS0+dHhfcGxfbWF4ID0gcGxzOworCWlmIChwbHMgPCBpMjQwMG0tPnR4X3BsX21pbikKKwkJaTI0MDBtLT50eF9wbF9taW4gPSBwbHM7CisJaTI0MDBtLT50eF9udW0rKzsKKwlpMjQwMG0tPnR4X3NpemVfYWNjICs9ICpidXNfc2l6ZTsKKwlpZiAoKmJ1c19zaXplIDwgaTI0MDBtLT50eF9zaXplX21pbikKKwkJaTI0MDBtLT50eF9zaXplX21pbiA9ICpidXNfc2l6ZTsKKwlpZiAoKmJ1c19zaXplID4gaTI0MDBtLT50eF9zaXplX21heCkKKwkJaTI0MDBtLT50eF9zaXplX21heCA9ICpidXNfc2l6ZTsKK291dF91bmxvY2s6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaTI0MDBtLT50eF9sb2NrLCBmbGFncyk7CisJZF9mbnN0YXJ0KDMsIGRldiwgIihpMjQwMG0gJXAgYnVzX3NpemUgJXAgWyV6dV0pID0gJXBcbiIsCisJCSAgaTI0MDBtLCBidXNfc2l6ZSwgKmJ1c19zaXplLCB0eF9tc2dfbW92ZWQpOworCXJldHVybiB0eF9tc2dfbW92ZWQ7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChpMjQwMG1fdHhfbXNnX2dldCk7CisKKworLyoqCisgKiBpMjQwMG1fdHhfbXNnX3NlbnQgLSBpbmRpY2F0ZSB0aGUgdHJhbnNtaXNzaW9uIG9mIGEgVFggbWVzc2FnZQorICoKKyAqIEBpMjQwMG06IGRldmljZSBkZXNjcmlwdG9yCisgKgorICogQ2FsbGVkIGJ5IHRoZSBidXMtc3BlY2lmaWMgZHJpdmVyIHdoZW4gYSBtZXNzYWdlIGhhcyBiZWVuIHNlbnQ7CisgKiB0aGlzIHBvcHMgaXQgZnJvbSB0aGUgRklGTzsgYW5kIGFzIHRoZXJlIGlzIHNwYWNlLCBzdGFydCB0aGUgcXVldWUKKyAqIGluIGNhc2UgaXQgd2FzIHN0b3BwZWQuCisgKgorICogU2hvdWxkIGJlIGNhbGxlZCBldmVuIGlmIHRoZSBtZXNzYWdlIHNlbmQgZmFpbGVkIGFuZCB3ZSBhcmUKKyAqIGRyb3BwaW5nIHRoaXMgVFggbWVzc2FnZS4KKyAqLwordm9pZCBpMjQwMG1fdHhfbXNnX3NlbnQoc3RydWN0IGkyNDAwbSAqaTI0MDBtKQoreworCXVuc2lnbmVkIG47CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBpMjQwMG1fZGV2KGkyNDAwbSk7CisKKwlkX2Zuc3RhcnQoMywgZGV2LCAiKGkyNDAwbSAlcClcbiIsIGkyNDAwbSk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmkyNDAwbS0+dHhfbG9jaywgZmxhZ3MpOworCWkyNDAwbS0+dHhfb3V0ICs9IGkyNDAwbS0+dHhfbXNnX3NpemU7CisJZF9wcmludGYoMiwgZGV2LCAiVFg6IHNlbnQgJXp1IGJcbiIsIChzaXplX3QpIGkyNDAwbS0+dHhfbXNnX3NpemUpOworCWkyNDAwbS0+dHhfbXNnX3NpemUgPSAwOworCUJVR19PTihpMjQwMG0tPnR4X291dCA+IGkyNDAwbS0+dHhfaW4pOworCS8qIGxldmVsIHRoZW0gRklGTyBtYXJrZXJzIG9mZiAqLworCW4gPSBpMjQwMG0tPnR4X291dCAvIEkyNDAwTV9UWF9CVUZfU0laRTsKKwlpMjQwMG0tPnR4X291dCAlPSBJMjQwME1fVFhfQlVGX1NJWkU7CisJaTI0MDBtLT50eF9pbiAtPSBuICogSTI0MDBNX1RYX0JVRl9TSVpFOworCW5ldGlmX3N0YXJ0X3F1ZXVlKGkyNDAwbS0+d2ltYXhfZGV2Lm5ldF9kZXYpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmkyNDAwbS0+dHhfbG9jaywgZmxhZ3MpOworCWRfZm5lbmQoMywgZGV2LCAiKGkyNDAwbSAlcCkgPSB2b2lkXG4iLCBpMjQwMG0pOworfQorRVhQT1JUX1NZTUJPTF9HUEwoaTI0MDBtX3R4X21zZ19zZW50KTsKKworCisvKioKKyAqIGkyNDAwbV90eF9zZXR1cCAtIEluaXRpYWxpemUgdGhlIFRYIHF1ZXVlIGFuZCBpbmZyYXN0cnVjdHVyZQorICoKKyAqIE1ha2Ugc3VyZSB3ZSByZXNldCB0aGUgVFggc2VxdWVuY2UgdG8gemVybywgYXMgd2hlbiB0aGlzIGZ1bmN0aW9uCisgKiBpcyBjYWxsZWQsIHRoZSBmaXJtd2FyZSBoYXMgYmVlbiBqdXN0IHJlc3RhcnRlZC4KKyAqLworaW50IGkyNDAwbV90eF9zZXR1cChzdHJ1Y3QgaTI0MDBtICppMjQwMG0pCit7CisJaW50IHJlc3VsdDsKKworCS8qIERvIHRoaXMgaGVyZSBvbmx5IG9uY2UgLS0gY2FuJ3QgZG8gb24KKwkgKiBpMjQwMG1faGFyZF9zdGFydF94bWl0KCkgYXMgd2UnbGwgY2F1c2UgcmFjZSBjb25kaXRpb25zIGlmCisJICogdGhlIFdTIHdhcyBzY2hlZHVsZWQgb24gYW5vdGhlciBDUFUgKi8KKwlJTklUX1dPUksoJmkyNDAwbS0+d2FrZV90eF93cywgaTI0MDBtX3dha2VfdHhfd29yayk7CisKKwlpMjQwMG0tPnR4X3NlcXVlbmNlID0gMDsKKwlpMjQwMG0tPnR4X2J1ZiA9IGttYWxsb2MoSTI0MDBNX1RYX0JVRl9TSVpFLCBHRlBfS0VSTkVMKTsKKwlpZiAoaTI0MDBtLT50eF9idWYgPT0gTlVMTCkKKwkJcmVzdWx0ID0gLUVOT01FTTsKKwllbHNlCisJCXJlc3VsdCA9IDA7CisJLyogSHVoPyB0aGUgYnVzIGxheWVyIGhhcyB0byBkZWZpbmUgdGhpcy4uLiAqLworCUJVR19PTihpMjQwMG0tPmJ1c190eF9ibG9ja19zaXplID09IDApOworCXJldHVybiByZXN1bHQ7CisKK30KKworCisvKioKKyAqIGkyNDAwbV90eF9yZWxlYXNlIC0gVGVhciBkb3duIHRoZSBUWCBxdWV1ZSBhbmQgaW5mcmFzdHJ1Y3R1cmUKKyAqLwordm9pZCBpMjQwMG1fdHhfcmVsZWFzZShzdHJ1Y3QgaTI0MDBtICppMjQwMG0pCit7CisJa2ZyZWUoaTI0MDBtLT50eF9idWYpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2ltYXgvaTI0MDBtL3VzYi1kZWJ1Zy1sZXZlbHMuaCBiL2RyaXZlcnMvbmV0L3dpbWF4L2kyNDAwbS91c2ItZGVidWctbGV2ZWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQzNThiZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpbWF4L2kyNDAwbS91c2ItZGVidWctbGV2ZWxzLmgKQEAgLTAsMCArMSw0MiBAQAorLyoKKyAqIEludGVsIFdpcmVsZXNzIFdpTUFYIENvbm5lY3Rpb24gMjQwMG0KKyAqIERlYnVnIGxldmVscyBjb250cm9sIGZpbGUgZm9yIHRoZSBpMjQwMG0tdXNiIG1vZHVsZQorICoKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBJbnRlbCBDb3Jwb3JhdGlvbiA8bGludXgtd2ltYXhAaW50ZWwuY29tPgorICogSW5ha3kgUGVyZXotR29uemFsZXogPGluYWt5LnBlcmV6LWdvbnphbGV6QGludGVsLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxLCBVU0EuCisgKi8KKyNpZm5kZWYgX19kZWJ1Z19sZXZlbHNfX2hfXworI2RlZmluZSBfX2RlYnVnX2xldmVsc19faF9fCisKKy8qIE1heGltdW0gY29tcGlsZSBhbmQgcnVuIHRpbWUgZGVidWcgbGV2ZWwgZm9yIGFsbCBzdWJtb2R1bGVzICovCisjZGVmaW5lIERfTU9EVUxFTkFNRSBpMjQwMG1fdXNiCisjZGVmaW5lIERfTUFTVEVSIENPTkZJR19XSU1BWF9JMjQwME1fREVCVUdfTEVWRUwKKworI2luY2x1ZGUgPGxpbnV4L3dpbWF4L2RlYnVnLmg+CisKKy8qIExpc3Qgb2YgYWxsIHRoZSBlbmFibGVkIG1vZHVsZXMgKi8KK2VudW0gZF9tb2R1bGUgeworCURfU1VCTU9EVUxFX0RFQ0xBUkUodXNiKSwKKwlEX1NVQk1PRFVMRV9ERUNMQVJFKGZ3KSwKKwlEX1NVQk1PRFVMRV9ERUNMQVJFKG5vdGlmKSwKKwlEX1NVQk1PRFVMRV9ERUNMQVJFKHJ4KSwKKwlEX1NVQk1PRFVMRV9ERUNMQVJFKHR4KSwKK307CisKKworI2VuZGlmIC8qICNpZm5kZWYgX19kZWJ1Z19sZXZlbHNfX2hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2ltYXgvaTI0MDBtL3VzYi1mdy5jIGIvZHJpdmVycy9uZXQvd2ltYXgvaTI0MDBtL3VzYi1mdy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhZDI4N2MKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aW1heC9pMjQwMG0vdXNiLWZ3LmMKQEAgLTAsMCArMSwzNDAgQEAKKy8qCisgKiBJbnRlbCBXaXJlbGVzcyBXaU1BWCBDb25uZWN0aW9uIDI0MDBtCisgKiBGaXJtd2FyZSB1cGxvYWRlcidzIFVTQiBzcGVjaWZpY3MKKyAqCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgIGRpc3RyaWJ1dGlvbi4KKyAqICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEludGVsIENvcnBvcmF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICoKKyAqIEludGVsIENvcnBvcmF0aW9uIDxsaW51eC13aW1heEBpbnRlbC5jb20+CisgKiBZYW5pciBMdWJldGtpbiA8eWFuaXJ4Lmx1YmV0a2luQGludGVsLmNvbT4KKyAqIEluYWt5IFBlcmV6LUdvbnphbGV6IDxpbmFreS5wZXJlei1nb256YWxlekBpbnRlbC5jb20+CisgKiAgLSBJbml0aWFsIGltcGxlbWVudGF0aW9uCisgKgorICogSW5ha3kgUGVyZXotR29uemFsZXogPGluYWt5LnBlcmV6LWdvbnphbGV6QGludGVsLmNvbT4KKyAqICAtIGJ1cyBnZW5lcmljL3NwZWNpZmljIHNwbGl0CisgKgorICogVEhFIFBST0NFRFVSRQorICoKKyAqIFNlZSBmdy5jIGZvciB0aGUgZ2VuZXJpYyBkZXNjcmlwdGlvbiBvZiB0aGlzIHByb2NlZHVyZS4KKyAqCisgKiBUaGlzIGZpbGUgaW1wbGVtZW50cyBvbmx5IHRoZSBVU0Igc3BlY2lmaWNzLiBJdCBib2lscyBkb3duIHRvIGhvdworICogdG8gc2VuZCBhIGNvbW1hbmQgYW5kIHdhaXRpbmcgZm9yIGFuIGFja25vd2xlZGdlbWVudCBmcm9tIHRoZQorICogZGV2aWNlLgorICoKKyAqIFRoaXMgY29kZSAoYW5kIHByb2Nlc3MpIGlzIHNpbmdsZSB0aHJlYWRlZC4gSXQgYXNzdW1lcyBpdCBpcyB0aGUKKyAqIG9ubHkgdGhyZWFkIHBva2luZyBhcm91bmQgKGd1YXJhbnRlZWQgYnkgZncuYykuCisgKgorICogQ09NTUFORCBFWEVDVVRJT04KKyAqCisgKiBBIHdyaXRlIFVSQiBpcyBwb3N0ZWQgd2l0aCB0aGUgYnVmZmVyIHRvIHRoZSBidWxrIG91dHB1dCBlbmRwb2ludC4KKyAqCisgKiBBQ0sgUkVDRVBUSU9OCisgKgorICogV2UganVzdCBwb3N0IGEgVVJCIHRvIHRoZSBub3RpZmljYXRpb24gZW5kcG9pbnQgYW5kIHdhaXQgZm9yCisgKiBkYXRhLiBXZSByZXBlYXQgdW50aWwgd2UgZ2V0IGFsbCB0aGUgZGF0YSB3ZSBleHBlY3QgKGFzIGluZGljYXRlZAorICogYnkgdGhlIGNhbGwgZnJvbSB0aGUgYnVzIGdlbmVyaWMgY29kZSkuCisgKgorICogVGhlIGRhdGEgaXMgbm90IHJlYWQgZnJvbSB0aGUgYnVsayBpbiBlbmRwb2ludCBmb3IgYm9vdCBtb2RlLgorICoKKyAqIFJPQURNQVAKKyAqCisgKiBpMjQwMG11X2J1c19ibV9jbWRfc2VuZAorICogICBpMjQwMG1fYm1fY21kX3ByZXBhcmUuLi4KKyAqICAgaTI0MDBtdV90eF9idWxrX291dAorICoKKyAqIGkyNDAwbXVfYnVzX2JtX3dhaXRfZm9yX2FjaworICogICBpMjQwMG1fbm90aWZfc3VibWl0CisgKi8KKyNpbmNsdWRlIDxsaW51eC91c2IuaD4KKyNpbmNsdWRlICJpMjQwMG0tdXNiLmgiCisKKworI2RlZmluZSBEX1NVQk1PRFVMRSBmdworI2luY2x1ZGUgInVzYi1kZWJ1Zy1sZXZlbHMuaCIKKworCisvKgorICogU3luY2hyb25vdXMgd3JpdGUgdG8gdGhlIGRldmljZQorICoKKyAqIFRha2VzIGNhcmUgb2YgdXBkYXRpbmcgRURDIGNvdW50cyBhbmQgdGh1cywgaGFuZGxlIGRldmljZSBlcnJvcnMuCisgKi8KK3N0YXRpYworc3NpemVfdCBpMjQwMG11X3R4X2J1bGtfb3V0KHN0cnVjdCBpMjQwMG11ICppMjQwMG11LCB2b2lkICpidWYsIHNpemVfdCBidWZfc2l6ZSkKK3sKKwlpbnQgcmVzdWx0OworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZpMjQwMG11LT51c2JfaWZhY2UtPmRldjsKKwlpbnQgbGVuOworCXN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZXBkOworCWludCBwaXBlLCBkb19hdXRvcG0gPSAxOworCisJcmVzdWx0ID0gdXNiX2F1dG9wbV9nZXRfaW50ZXJmYWNlKGkyNDAwbXUtPnVzYl9pZmFjZSk7CisJaWYgKHJlc3VsdCA8IDApIHsKKwkJZGV2X2VycihkZXYsICJCTS1DTUQ6IGNhbid0IGdldCBhdXRvcG06ICVkXG4iLCByZXN1bHQpOworCQlkb19hdXRvcG0gPSAwOworCX0KKwllcGQgPSB1c2JfZ2V0X2VwZChpMjQwMG11LT51c2JfaWZhY2UsIEkyNDAwTVVfRVBfQlVMS19PVVQpOworCXBpcGUgPSB1c2Jfc25kYnVsa3BpcGUoaTI0MDBtdS0+dXNiX2RldiwgZXBkLT5iRW5kcG9pbnRBZGRyZXNzKTsKK3JldHJ5OgorCXJlc3VsdCA9IHVzYl9idWxrX21zZyhpMjQwMG11LT51c2JfZGV2LCBwaXBlLCBidWYsIGJ1Zl9zaXplLCAmbGVuLCBIWik7CisJc3dpdGNoIChyZXN1bHQpIHsKKwljYXNlIDA6CisJCWlmIChsZW4gIT0gYnVmX3NpemUpIHsKKwkJCWRldl9lcnIoZGV2LCAiQk0tQ01EOiBzaG9ydCB3cml0ZSAoJXUgQiB2cyAlenUgIgorCQkJCSJleHBlY3RlZClcbiIsIGxlbiwgYnVmX3NpemUpOworCQkJcmVzdWx0ID0gLUVJTzsKKwkJCWJyZWFrOworCQl9CisJCXJlc3VsdCA9IGxlbjsKKwkJYnJlYWs7CisJY2FzZSAtRUlOVkFMOgkJCS8qIHdoaWxlIHJlbW92aW5nIGRyaXZlciAqLworCWNhc2UgLUVOT0RFVjoJCQkvKiBkZXYgZGlzY29ubmVjdCAuLi4gKi8KKwljYXNlIC1FTk9FTlQ6CQkJLyoganVzdCBpZ25vcmUgaXQgKi8KKwljYXNlIC1FU0hVVERPV046CQkvKiBhbmQgZXhpdCAqLworCWNhc2UgLUVDT05OUkVTRVQ6CisJCXJlc3VsdCA9IC1FU0hVVERPV047CisJCWJyZWFrOworCWNhc2UgLUVUSU1FRE9VVDoJCQkvKiBiYWguLi4gKi8KKwkJYnJlYWs7CisJZGVmYXVsdDoJCQkJLyogYW55IG90aGVyPyAqLworCQlpZiAoZWRjX2luYygmaTI0MDBtdS0+dXJiX2VkYywKKwkJCSAgICBFRENfTUFYX0VSUk9SUywgRURDX0VSUk9SX1RJTUVGUkFNRSkpIHsKKwkJCQlkZXZfZXJyKGRldiwgIkJNLUNNRDogbWF4aW11bSBlcnJvcnMgaW4gIgorCQkJCQkiVVJCIGV4Y2VlZGVkOyByZXNldHRpbmcgZGV2aWNlXG4iKTsKKwkJCQl1c2JfcXVldWVfcmVzZXRfZGV2aWNlKGkyNDAwbXUtPnVzYl9pZmFjZSk7CisJCQkJcmVzdWx0ID0gLUVOT0RFVjsKKwkJCQlicmVhazsKKwkJfQorCQlkZXZfZXJyKGRldiwgIkJNLUNNRDogVVJCIGVycm9yICVkLCByZXRyeWluZ1xuIiwKKwkJCXJlc3VsdCk7CisJCWdvdG8gcmV0cnk7CisJfQorCXJlc3VsdCA9IGxlbjsKKwlpZiAoZG9fYXV0b3BtKQorCQl1c2JfYXV0b3BtX3B1dF9pbnRlcmZhY2UoaTI0MDBtdS0+dXNiX2lmYWNlKTsKKwlyZXR1cm4gcmVzdWx0OworfQorCisKKy8qCisgKiBTZW5kIGEgYm9vdC1tb2RlIGNvbW1hbmQgb3ZlciB0aGUgYnVsay1vdXQgcGlwZQorICoKKyAqIENvbW1hbmQgY2FuIGJlIGEgcmF3IGNvbW1hbmQsIHdoaWNoIHJlcXVpcmVzIG5vIHByZXBhcmF0aW9uIChhbmQKKyAqIHdoaWNoIG1pZ2h0IG5vdCBldmVuIGJlIGZvbGxvd2luZyB0aGUgY29tbWFuZCBmb3JtYXQpLiBDaGVja3MgdGhhdAorICogdGhlIHJpZ2h0IGFtb3VudCBvZiBkYXRhIHdhcyB0cmFuc2ZlcmVkLgorICoKKyAqIFRvIHNhdGlzZnkgVVNCIHJlcXVpcmVtZW50cyAobm8gb25zdGFjaywgdm1hbGxvYyBvciBpbiBkYXRhIHNlZ21lbnQKKyAqIGJ1ZmZlcnMpLCB3ZSBjb3B5IHRoZSBjb21tYW5kIHRvIGkyNDAwbS0+Ym1fY21kX2J1ZiBhbmQgc2VuZCBpdCBmcm9tCisgKiB0aGVyZS4KKyAqCisgKiBAZmxhZ3M6IHBhc3MgdGhydSBmcm9tIGkyNDAwbV9ibV9jbWQoKQorICogQHJldHVybjogY21kX3NpemUgaWYgb2ssIDwgMCBlcnJubyBjb2RlIG9uIGVycm9yLgorICovCitzc2l6ZV90IGkyNDAwbXVfYnVzX2JtX2NtZF9zZW5kKHN0cnVjdCBpMjQwMG0gKmkyNDAwbSwKKwkJCQljb25zdCBzdHJ1Y3QgaTI0MDBtX2Jvb3Ryb21faGVhZGVyICpfY21kLAorCQkJCXNpemVfdCBjbWRfc2l6ZSwgaW50IGZsYWdzKQoreworCXNzaXplX3QgcmVzdWx0OworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGkyNDAwbV9kZXYoaTI0MDBtKTsKKwlzdHJ1Y3QgaTI0MDBtdSAqaTI0MDBtdSA9IGNvbnRhaW5lcl9vZihpMjQwMG0sIHN0cnVjdCBpMjQwMG11LCBpMjQwMG0pOworCWludCBvcGNvZGUgPSBfY21kID09IE5VTEwgPyAtMSA6IGkyNDAwbV9icmhfZ2V0X29wY29kZShfY21kKTsKKwlzdHJ1Y3QgaTI0MDBtX2Jvb3Ryb21faGVhZGVyICpjbWQ7CisJc2l6ZV90IGNtZF9zaXplX2EgPSBBTElHTihjbWRfc2l6ZSwgMTYpOwkvKiBVU0IgcmVzdHJpY3Rpb24gKi8KKworCWRfZm5zdGFydCg4LCBkZXYsICIoaTI0MDBtICVwIGNtZCAlcCBzaXplICV6dSlcbiIsCisJCSAgaTI0MDBtLCBfY21kLCBjbWRfc2l6ZSk7CisJcmVzdWx0ID0gLUUyQklHOworCWlmIChjbWRfc2l6ZSA+IEkyNDAwTV9CTV9DTURfQlVGX1NJWkUpCisJCWdvdG8gZXJyb3JfdG9vX2JpZzsKKwltZW1jcHkoaTI0MDBtLT5ibV9jbWRfYnVmLCBfY21kLCBjbWRfc2l6ZSk7CisJY21kID0gaTI0MDBtLT5ibV9jbWRfYnVmOworCWlmIChjbWRfc2l6ZV9hID4gY21kX3NpemUpCQkJLyogWmVybyBwYWQgc3BhY2UgKi8KKwkJbWVtc2V0KGkyNDAwbS0+Ym1fY21kX2J1ZiArIGNtZF9zaXplLCAwLCBjbWRfc2l6ZV9hIC0gY21kX3NpemUpOworCWlmICgoZmxhZ3MgJiBJMjQwME1fQk1fQ01EX1JBVykgPT0gMCkgeworCQlpZiAoV0FSTl9PTihpMjQwMG1fYnJoX2dldF9yZXNwb25zZV9yZXF1aXJlZChjbWQpID09IDApKQorCQkJZGV2X3dhcm4oZGV2LCAiU1cgQlVHOiByZXNwb25zZV9yZXF1aXJlZCA9PSAwXG4iKTsKKwkJaTI0MDBtX2JtX2NtZF9wcmVwYXJlKGNtZCk7CisJfQorCXJlc3VsdCA9IGkyNDAwbXVfdHhfYnVsa19vdXQoaTI0MDBtdSwgaTI0MDBtLT5ibV9jbWRfYnVmLCBjbWRfc2l6ZSk7CisJaWYgKHJlc3VsdCA8IDApIHsKKwkJZGV2X2VycihkZXYsICJib290LW1vZGUgY21kICVkOiBjYW5ub3Qgc2VuZDogJXpkXG4iLAorCQkJb3Bjb2RlLCByZXN1bHQpOworCQlnb3RvIGVycm9yX2NtZF9zZW5kOworCX0KKwlpZiAocmVzdWx0ICE9IGNtZF9zaXplKSB7CQkvKiBhbGwgd2FzIHRyYW5zZmVycmVkPyAqLworCQlkZXZfZXJyKGRldiwgImJvb3QtbW9kZSBjbWQgJWQ6IGluY29tcGxldGUgdHJhbnNmZXIgIgorCQkJIiglenUgdnMgJXp1IHN1Ym1pdHRlZClcbiIsICBvcGNvZGUsIHJlc3VsdCwgY21kX3NpemUpOworCQlyZXN1bHQgPSAtRUlPOworCQlnb3RvIGVycm9yX2NtZF9zaXplOworCX0KK2Vycm9yX2NtZF9zaXplOgorZXJyb3JfY21kX3NlbmQ6CitlcnJvcl90b29fYmlnOgorCWRfZm5lbmQoOCwgZGV2LCAiKGkyNDAwbSAlcCBjbWQgJXAgc2l6ZSAlenUpID0gJXpkXG4iLAorCQlpMjQwMG0sIF9jbWQsIGNtZF9zaXplLCByZXN1bHQpOworCXJldHVybiByZXN1bHQ7Cit9CisKKworc3RhdGljCit2b2lkIF9faTI0MDBtdV9ibV9ub3RpZl9jYihzdHJ1Y3QgdXJiICp1cmIpCit7CisJY29tcGxldGUodXJiLT5jb250ZXh0KTsKK30KKworCisvKgorICogc3VibWl0IGEgcmVhZCB0byB0aGUgbm90aWZpY2F0aW9uIGVuZHBvaW50CisgKgorICogQGkyNDAwbTogZGV2aWNlIGRlc2NyaXB0b3IKKyAqIEB1cmI6IHVyYiB0byB1c2UKKyAqIEBjb21wbGV0aW9uOiBjb21wbGV0aW9uIHZhcmlibGUgdG8gY29tcGxldGUgd2hlbiBkb25lCisgKgorICogRGF0YSBpcyBhbHdheXMgcmVhZCB0byBpMjQwMG0tPmJtX2Fja19idWYKKyAqLworc3RhdGljCitpbnQgaTI0MDBtdV9ub3RpZl9zdWJtaXQoc3RydWN0IGkyNDAwbXUgKmkyNDAwbXUsIHN0cnVjdCB1cmIgKnVyYiwKKwkJCSBzdHJ1Y3QgY29tcGxldGlvbiAqY29tcGxldGlvbikKK3sKKwlzdHJ1Y3QgaTI0MDBtICppMjQwMG0gPSAmaTI0MDBtdS0+aTI0MDBtOworCXN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZXBkOworCWludCBwaXBlOworCisJZXBkID0gdXNiX2dldF9lcGQoaTI0MDBtdS0+dXNiX2lmYWNlLCBJMjQwME1VX0VQX05PVElGSUNBVElPTik7CisJcGlwZSA9IHVzYl9yY3ZpbnRwaXBlKGkyNDAwbXUtPnVzYl9kZXYsIGVwZC0+YkVuZHBvaW50QWRkcmVzcyk7CisJdXNiX2ZpbGxfaW50X3VyYih1cmIsIGkyNDAwbXUtPnVzYl9kZXYsIHBpcGUsCisJCQkgaTI0MDBtLT5ibV9hY2tfYnVmLCBJMjQwME1fQk1fQUNLX0JVRl9TSVpFLAorCQkJIF9faTI0MDBtdV9ibV9ub3RpZl9jYiwgY29tcGxldGlvbiwKKwkJCSBlcGQtPmJJbnRlcnZhbCk7CisJcmV0dXJuIHVzYl9zdWJtaXRfdXJiKHVyYiwgR0ZQX0tFUk5FTCk7Cit9CisKKworLyoKKyAqIFJlYWQgYW4gYWNrIGZyb20gIHRoZSBub3RpZmljYXRpb24gZW5kcG9pbnQKKyAqCisgKiBAaTI0MDBtOgorICogQF9hY2s6IHBvaW50ZXIgdG8gd2hlcmUgdG8gc3RvcmUgdGhlIHJlYWQgZGF0YQorICogQGFja19zaXplOiBob3cgbWFueSBieXRlcyB3ZSBzaG91bGQgcmVhZAorICoKKyAqIFJldHVybnM6IDwgMCBlcnJubyBjb2RlIG9uIGVycm9yOyBvdGhlcndpc2UsIGFtb3VudCBvZiByZWNlaXZlZCBieXRlcy4KKyAqCisgKiBTdWJtaXRzIGEgbm90aWZpY2F0aW9uIHJlYWQsIGFwcGVuZHMgdGhlIHJlYWQgZGF0YSB0byB0aGUgZ2l2ZW4gYWNrCisgKiBidWZmZXIgYW5kIHRoZW4gcmVwZWF0cyAodW50aWwgQGFja19zaXplIGJ5dGVzIGhhdmUgYmVlbgorICogcmVjZWl2ZWQpLgorICovCitzc2l6ZV90IGkyNDAwbXVfYnVzX2JtX3dhaXRfZm9yX2FjayhzdHJ1Y3QgaTI0MDBtICppMjQwMG0sCisJCQkJICAgIHN0cnVjdCBpMjQwMG1fYm9vdHJvbV9oZWFkZXIgKl9hY2ssCisJCQkJICAgIHNpemVfdCBhY2tfc2l6ZSkKK3sKKwlzc2l6ZV90IHJlc3VsdCA9IC1FTk9NRU07CisJc3RydWN0IGRldmljZSAqZGV2ID0gaTI0MDBtX2RldihpMjQwMG0pOworCXN0cnVjdCBpMjQwMG11ICppMjQwMG11ID0gY29udGFpbmVyX29mKGkyNDAwbSwgc3RydWN0IGkyNDAwbXUsIGkyNDAwbSk7CisJc3RydWN0IHVyYiBub3RpZl91cmI7CisJdm9pZCAqYWNrID0gX2FjazsKKwlzaXplX3Qgb2Zmc2V0LCBsZW47CisJbG9uZyB2YWw7CisJaW50IGRvX2F1dG9wbSA9IDE7CisJREVDTEFSRV9DT01QTEVUSU9OX09OU1RBQ0sobm90aWZfY29tcGxldGlvbik7CisKKwlkX2Zuc3RhcnQoOCwgZGV2LCAiKGkyNDAwbSAlcCBhY2sgJXAgc2l6ZSAlenUpXG4iLAorCQkgIGkyNDAwbSwgYWNrLCBhY2tfc2l6ZSk7CisJQlVHX09OKF9hY2sgPT0gaTI0MDBtLT5ibV9hY2tfYnVmKTsKKwlyZXN1bHQgPSB1c2JfYXV0b3BtX2dldF9pbnRlcmZhY2UoaTI0MDBtdS0+dXNiX2lmYWNlKTsKKwlpZiAocmVzdWx0IDwgMCkgeworCQlkZXZfZXJyKGRldiwgIkJNLUFDSzogY2FuJ3QgZ2V0IGF1dG9wbTogJWRcbiIsIChpbnQpIHJlc3VsdCk7CisJCWRvX2F1dG9wbSA9IDA7CisJfQorCXVzYl9pbml0X3VyYigmbm90aWZfdXJiKTsJLyogcmVhZHkgbm90aWZpY2F0aW9ucyAqLworCXVzYl9nZXRfdXJiKCZub3RpZl91cmIpOworCW9mZnNldCA9IDA7CisJd2hpbGUgKG9mZnNldCA8IGFja19zaXplKSB7CisJCWluaXRfY29tcGxldGlvbigmbm90aWZfY29tcGxldGlvbik7CisJCXJlc3VsdCA9IGkyNDAwbXVfbm90aWZfc3VibWl0KGkyNDAwbXUsICZub3RpZl91cmIsCisJCQkJCSAgICAgICZub3RpZl9jb21wbGV0aW9uKTsKKwkJaWYgKHJlc3VsdCA8IDApCisJCQlnb3RvIGVycm9yX25vdGlmX3VyYl9zdWJtaXQ7CisJCXZhbCA9IHdhaXRfZm9yX2NvbXBsZXRpb25faW50ZXJydXB0aWJsZV90aW1lb3V0KAorCQkJJm5vdGlmX2NvbXBsZXRpb24sIEhaKTsKKwkJaWYgKHZhbCA9PSAwKSB7CisJCQlyZXN1bHQgPSAtRVRJTUVET1VUOworCQkJdXNiX2tpbGxfdXJiKCZub3RpZl91cmIpOwkvKiBUaW1lZG91dCAqLworCQkJZ290byBlcnJvcl9ub3RpZl93YWl0OworCQl9CisJCWlmICh2YWwgPT0gLUVSRVNUQVJUU1lTKSB7CisJCQlyZXN1bHQgPSAtRUlOVFI7CQkvKiBJbnRlcnJ1cHRlZCAqLworCQkJdXNiX2tpbGxfdXJiKCZub3RpZl91cmIpOworCQkJZ290byBlcnJvcl9ub3RpZl93YWl0OworCQl9CisJCXJlc3VsdCA9IG5vdGlmX3VyYi5zdGF0dXM7CQkvKiBIb3cgd2FzIHRoZSBhY2s/ICovCisJCXN3aXRjaCAocmVzdWx0KSB7CisJCWNhc2UgMDoKKwkJCWJyZWFrOworCQljYXNlIC1FSU5WQUw6CQkJLyogd2hpbGUgcmVtb3ZpbmcgZHJpdmVyICovCisJCWNhc2UgLUVOT0RFVjoJCQkvKiBkZXYgZGlzY29ubmVjdCAuLi4gKi8KKwkJY2FzZSAtRU5PRU5UOgkJCS8qIGp1c3QgaWdub3JlIGl0ICovCisJCWNhc2UgLUVTSFVURE9XTjoJCS8qIGFuZCBleGl0ICovCisJCWNhc2UgLUVDT05OUkVTRVQ6CisJCQlyZXN1bHQgPSAtRVNIVVRET1dOOworCQkJZ290byBlcnJvcl9kZXZfZ29uZTsKKwkJZGVmYXVsdDoJCQkJLyogYW55IG90aGVyPyAqLworCQkJdXNiX2tpbGxfdXJiKCZub3RpZl91cmIpOwkvKiBUaW1lZG91dCAqLworCQkJaWYgKGVkY19pbmMoJmkyNDAwbXUtPnVyYl9lZGMsCisJCQkJICAgIEVEQ19NQVhfRVJST1JTLCBFRENfRVJST1JfVElNRUZSQU1FKSkKKwkJCQlnb3RvIGVycm9yX2V4Y2VlZGVkOworCQkJZGV2X2VycihkZXYsICJCTS1BQ0s6IFVSQiBlcnJvciAlZCwgIgorCQkJCSJyZXRyeWluZ1xuIiwgbm90aWZfdXJiLnN0YXR1cyk7CisJCQljb250aW51ZTsJLyogcmV0cnkgKi8KKwkJfQorCQlpZiAobm90aWZfdXJiLmFjdHVhbF9sZW5ndGggPT0gMCkgeworCQkJZF9wcmludGYoNiwgZGV2LCAiWkxQIHJlY2VpdmVkLCByZXRyeWluZ1xuIik7CisJCQljb250aW51ZTsKKwkJfQorCQkvKiBHb3QgZGF0YSwgYXBwZW5kIGl0IHRvIHRoZSBidWZmZXIgKi8KKwkJbGVuID0gbWluKGFja19zaXplIC0gb2Zmc2V0LCAoc2l6ZV90KSBub3RpZl91cmIuYWN0dWFsX2xlbmd0aCk7CisJCW1lbWNweShhY2sgKyBvZmZzZXQsIGkyNDAwbS0+Ym1fYWNrX2J1ZiwgbGVuKTsKKwkJb2Zmc2V0ICs9IGxlbjsKKwl9CisJcmVzdWx0ID0gb2Zmc2V0OworZXJyb3Jfbm90aWZfdXJiX3N1Ym1pdDoKK2Vycm9yX25vdGlmX3dhaXQ6CitlcnJvcl9kZXZfZ29uZToKK291dDoKKwlpZiAoZG9fYXV0b3BtKQorCQl1c2JfYXV0b3BtX3B1dF9pbnRlcmZhY2UoaTI0MDBtdS0+dXNiX2lmYWNlKTsKKwlkX2ZuZW5kKDgsIGRldiwgIihpMjQwMG0gJXAgYWNrICVwIHNpemUgJXp1KSA9ICV6ZFxuIiwKKwkJaTI0MDBtLCBhY2ssIGFja19zaXplLCByZXN1bHQpOworCXJldHVybiByZXN1bHQ7CisKK2Vycm9yX2V4Y2VlZGVkOgorCWRldl9lcnIoZGV2LCAiYm06IG1heGltdW0gZXJyb3JzIGluIG5vdGlmaWNhdGlvbiBVUkIgZXhjZWVkZWQ7ICIKKwkJInJlc2V0dGluZyBkZXZpY2VcbiIpOworCXVzYl9xdWV1ZV9yZXNldF9kZXZpY2UoaTI0MDBtdS0+dXNiX2lmYWNlKTsKKwlnb3RvIG91dDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpbWF4L2kyNDAwbS91c2Itbm90aWYuYyBiL2RyaXZlcnMvbmV0L3dpbWF4L2kyNDAwbS91c2Itbm90aWYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzAyYzIyYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpbWF4L2kyNDAwbS91c2Itbm90aWYuYwpAQCAtMCwwICsxLDI2OSBAQAorLyoKKyAqIEludGVsIFdpcmVsZXNzIFdpTUFYIENvbm5lY3Rpb24gMjQwMG0gb3ZlciBVU0IKKyAqIE5vdGlmaWNhdGlvbiBoYW5kbGluZworICoKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICAgZGlzdHJpYnV0aW9uLgorICogICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgSW50ZWwgQ29ycG9yYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKgorICogSW50ZWwgQ29ycG9yYXRpb24gPGxpbnV4LXdpbWF4QGludGVsLmNvbT4KKyAqIFlhbmlyIEx1YmV0a2luIDx5YW5pcngubHViZXRraW5AaW50ZWwuY29tPgorICogSW5ha3kgUGVyZXotR29uemFsZXogPGluYWt5LnBlcmV6LWdvbnphbGV6QGludGVsLmNvbT4KKyAqICAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24KKyAqCisgKgorICogVGhlIG5vdGlmaWNhdGlvbiBlbmRwb2ludCBpcyBhY3RpdmUgd2hlbiB0aGUgZGV2aWNlIGlzIG5vdCBpbiBib290CisgKiBtb2RlOyBpbiBoZXJlIHdlIGp1c3QgcmVhZCBhbmQgZ2V0IG5vdGlmaWNhdGlvbnM7IGJhc2VkIG9uIHRob3NlLAorICogd2UgYWN0IHRvIGVpdGhlciByZWluaXRpYWxpemUgdGhlIGRldmljZSBhZnRlciBhIHJlYm9vdCBvciB0bworICogc3VibWl0IGEgUlggcmVxdWVzdC4KKyAqCisgKiBST0FETUFQCisgKgorICogaTI0MDBtdV91c2Jfbm90aWZpY2F0aW9uX3NldHVwKCkKKyAqCisgKiBpMjQwMG11X3VzYl9ub3RpZmljYXRpb25fcmVsZWFzZSgpCisgKgorICogaTI0MDBtdV91c2Jfbm90aWZpY2F0aW9uX2NiKCkJQ2FsbGVkIHdoZW4gYSBVUkIgaXMgcmVhZHkKKyAqICAgaTI0MDBtdV9ub3RpZl9ncm9rKCkKKyAqICAgICBpMjQwMG1fZGV2X3Jlc2V0X2hhbmRsZSgpCisgKiAgICAgaTI0MDBtdV9yeF9raWNrKCkKKyAqLworI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgorI2luY2x1ZGUgImkyNDAwbS11c2IuaCIKKworCisjZGVmaW5lIERfU1VCTU9EVUxFIG5vdGlmCisjaW5jbHVkZSAidXNiLWRlYnVnLWxldmVscy5oIgorCisKK3N0YXRpYyBjb25zdAorX19sZTMyIGkyNDAwbV9aRVJPX0JBUktFUls0XSA9IHsgMCwgMCwgMCwgMCB9OworCisKKy8qCisgKiBQcm9jZXNzIGEgcmVjZWl2ZWQgbm90aWZpY2F0aW9uCisgKgorICogSW4gbm9ybWFsIG9wZXJhdGlvbiBtb2RlLCB3ZSBjYW4gb25seSByZWNlaXZlIHR3byB0eXBlcyBvZiBwYXlsb2FkcworICogb24gdGhlIG5vdGlmaWNhdGlvbiBlbmRwb2ludDoKKyAqCisgKiAgIC0gYSByZWJvb3QgYmFya2VyLCB3ZSBkbyBhIGJvb3RzdHJhcCAodGhlIGRldmljZSBoYXMgcmVzZXRlZCkuCisgKgorICogICAtIGEgYmxvY2sgb2YgemVyb2VzOiB0aGVyZSBpcyBwZW5kaW5nIGRhdGEgaW4gdGhlIElOIGVuZHBvaW50CisgKi8KK3N0YXRpYworaW50IGkyNDAwbXVfbm90aWZpY2F0aW9uX2dyb2soc3RydWN0IGkyNDAwbXUgKmkyNDAwbXUsIGNvbnN0IHZvaWQgKmJ1ZiwKKwkJCQkgc2l6ZV90IGJ1Zl9sZW4pCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmaTI0MDBtdS0+dXNiX2lmYWNlLT5kZXY7CisJc3RydWN0IGkyNDAwbSAqaTI0MDBtID0gJmkyNDAwbXUtPmkyNDAwbTsKKworCWRfZm5zdGFydCg0LCBkZXYsICIoaTI0MDBtICVwIGJ1ZiAlcCBidWZfbGVuICV6dSlcbiIsCisJCSAgaTI0MDBtdSwgYnVmLCBidWZfbGVuKTsKKwlyZXQgPSAtRUlPOworCWlmIChidWZfbGVuIDwgc2l6ZW9mKGkyNDAwbV9OQk9PVF9CQVJLRVIpKQorCQkvKiBOb3QgYSBidWcsIGp1c3QgaWdub3JlICovCisJCWdvdG8gZXJyb3JfYmFkX3NpemU7CisJaWYgKCFtZW1jbXAoaTI0MDBtX05CT09UX0JBUktFUiwgYnVmLCBzaXplb2YoaTI0MDBtX05CT09UX0JBUktFUikpCisJICAgIHx8ICFtZW1jbXAoaTI0MDBtX1NCT09UX0JBUktFUiwgYnVmLCBzaXplb2YoaTI0MDBtX1NCT09UX0JBUktFUikpKQorCQlyZXQgPSBpMjQwMG1fZGV2X3Jlc2V0X2hhbmRsZShpMjQwMG0pOworCWVsc2UgaWYgKCFtZW1jbXAoaTI0MDBtX1pFUk9fQkFSS0VSLCBidWYsIHNpemVvZihpMjQwMG1fWkVST19CQVJLRVIpKSkgeworCQlpMjQwMG11X3J4X2tpY2soaTI0MDBtdSk7CisJCXJldCA9IDA7CisJfSBlbHNlIHsJLyogVW5rbm93biBvciB1bmV4cGVjdGVkIGRhdGEgaW4gdGhlIG5vdGlmIG1lc3NhZ2UgKi8KKwkJY2hhciBwcmVmaXhbNjRdOworCQlyZXQgPSAtRUlPOworCQlkZXZfZXJyKGRldiwgIkhXIEJVRz8gVW5rbm93bi91bmV4cGVjdGVkIGRhdGEgaW4gbm90aWZpY2F0aW9uICIKKwkJCSJtZXNzYWdlICglenUgYnl0ZXMpXG4iLCBidWZfbGVuKTsKKwkJc25wcmludGYocHJlZml4LCBzaXplb2YocHJlZml4KSwgIiVzICVzOiAiLAorCQkJIGRldl9kcml2ZXJfc3RyaW5nKGRldikgLCBkZXYtPmJ1c19pZCk7CisJCWlmIChidWZfbGVuID4gNjQpIHsKKwkJCXByaW50X2hleF9kdW1wKEtFUk5fRVJSLCBwcmVmaXgsIERVTVBfUFJFRklYX09GRlNFVCwKKwkJCQkgICAgICAgOCwgNCwgYnVmLCA2NCwgMCk7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzLi4uIChvbmx5IGZpcnN0IDY0IGJ5dGVzICIKKwkJCSAgICAgICAiZHVtcGVkKVxuIiwgcHJlZml4KTsKKwkJfSBlbHNlCisJCQlwcmludF9oZXhfZHVtcChLRVJOX0VSUiwgcHJlZml4LCBEVU1QX1BSRUZJWF9PRkZTRVQsCisJCQkJICAgICAgIDgsIDQsIGJ1ZiwgYnVmX2xlbiwgMCk7CisJfQorZXJyb3JfYmFkX3NpemU6CisJZF9mbmVuZCg0LCBkZXYsICIoaTI0MDBtICVwIGJ1ZiAlcCBidWZfbGVuICV6dSkgPSAlZFxuIiwKKwkJaTI0MDBtdSwgYnVmLCBidWZfbGVuLCByZXQpOworCXJldHVybiByZXQ7Cit9CisKKworLyoKKyAqIFVSQiBjYWxsYmFjayBmb3IgdGhlIG5vdGlmaWNhdGlvbiBlbmRwb2ludAorICoKKyAqIEB1cmI6IHRoZSB1cmIgcmVjZWl2ZWQgZnJvbSB0aGUgbm90aWZpY2F0aW9uIGVuZHBvaW50CisgKgorICogVGhpcyBmdW5jdGlvbiB3aWxsIGp1c3QgcHJvY2VzcyB0aGUgVVNCIHNpZGUgb2YgdGhlIHRyYW5zYWN0aW9uLAorICogY2hlY2tpbmcgZXZlcnl0aGluZyBpcyBmaW5lLCBwYXNzIHRoZSBwcm9jZXNzaW5nIHRvCisgKiBpMjQwMG1fbm90aWZpY2F0aW9uX2dyb2soKSBhbmQgcmVzdWJtaXQgdGhlIFVSQi4KKyAqLworc3RhdGljCit2b2lkIGkyNDAwbXVfbm90aWZpY2F0aW9uX2NiKHN0cnVjdCB1cmIgKnVyYikKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBpMjQwMG11ICppMjQwMG11ID0gdXJiLT5jb250ZXh0OworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZpMjQwMG11LT51c2JfaWZhY2UtPmRldjsKKworCWRfZm5zdGFydCg0LCBkZXYsICIodXJiICVwIHN0YXR1cyAlZCBhY3R1YWxfbGVuZ3RoICVkKVxuIiwKKwkJICB1cmIsIHVyYi0+c3RhdHVzLCB1cmItPmFjdHVhbF9sZW5ndGgpOworCXJldCA9IHVyYi0+c3RhdHVzOworCXN3aXRjaCAocmV0KSB7CisJY2FzZSAwOgorCQlyZXQgPSBpMjQwMG11X25vdGlmaWNhdGlvbl9ncm9rKGkyNDAwbXUsIHVyYi0+dHJhbnNmZXJfYnVmZmVyLAorCQkJCQkJdXJiLT5hY3R1YWxfbGVuZ3RoKTsKKwkJaWYgKHJldCA9PSAtRUlPICYmIGVkY19pbmMoJmkyNDAwbXUtPnVyYl9lZGMsIEVEQ19NQVhfRVJST1JTLAorCQkJCQkgICBFRENfRVJST1JfVElNRUZSQU1FKSkKKwkJCWdvdG8gZXJyb3JfZXhjZWVkZWQ7CisJCWlmIChyZXQgPT0gLUVOT01FTSkJLyogdWZmLi4ucG93ZXIgY3ljbGU/IHNodXRkb3duPyAqLworCQkJZ290byBlcnJvcl9leGNlZWRlZDsKKwkJYnJlYWs7CisJY2FzZSAtRUlOVkFMOgkJCS8qIHdoaWxlIHJlbW92aW5nIGRyaXZlciAqLworCWNhc2UgLUVOT0RFVjoJCQkvKiBkZXYgZGlzY29ubmVjdCAuLi4gKi8KKwljYXNlIC1FTk9FTlQ6CQkJLyogZGl0dG8gKi8KKwljYXNlIC1FU0hVVERPV046CQkvKiBVUkIga2lsbGVkICovCisJY2FzZSAtRUNPTk5SRVNFVDoJCS8qIGRpc2Nvbm5lY3Rpb24gKi8KKwkJZ290byBvdXQ7CQkvKiBOb3RpZnkgYXJvdW5kICovCisJZGVmYXVsdDoJCQkvKiBTb21lIGVycm9yPyAqLworCQlpZiAoZWRjX2luYygmaTI0MDBtdS0+dXJiX2VkYywKKwkJCSAgICBFRENfTUFYX0VSUk9SUywgRURDX0VSUk9SX1RJTUVGUkFNRSkpCisJCQlnb3RvIGVycm9yX2V4Y2VlZGVkOworCQlkZXZfZXJyKGRldiwgIm5vdGlmaWNhdGlvbjogVVJCIGVycm9yICVkLCByZXRyeWluZ1xuIiwKKwkJCXVyYi0+c3RhdHVzKTsKKwl9CisJdXNiX21hcmtfbGFzdF9idXN5KGkyNDAwbXUtPnVzYl9kZXYpOworCXJldCA9IHVzYl9zdWJtaXRfdXJiKGkyNDAwbXUtPm5vdGlmX3VyYiwgR0ZQX0FUT01JQyk7CisJc3dpdGNoIChyZXQpIHsKKwljYXNlIDA6CisJY2FzZSAtRUlOVkFMOgkJCS8qIHdoaWxlIHJlbW92aW5nIGRyaXZlciAqLworCWNhc2UgLUVOT0RFVjoJCQkvKiBkZXYgZGlzY29ubmVjdCAuLi4gKi8KKwljYXNlIC1FTk9FTlQ6CQkJLyogZGl0dG8gKi8KKwljYXNlIC1FU0hVVERPV046CQkvKiBVUkIga2lsbGVkICovCisJY2FzZSAtRUNPTk5SRVNFVDoJCS8qIGRpc2Nvbm5lY3Rpb24gKi8KKwkJYnJlYWs7CQkJLyoganVzdCBpZ25vcmUgKi8KKwlkZWZhdWx0OgkJCS8qIFNvbWUgZXJyb3I/ICovCisJCWRldl9lcnIoZGV2LCAibm90aWZpY2F0aW9uOiBjYW5ub3Qgc3VibWl0IFVSQjogJWRcbiIsIHJldCk7CisJCWdvdG8gZXJyb3Jfc3VibWl0OworCX0KKwlkX2ZuZW5kKDQsIGRldiwgIih1cmIgJXAgc3RhdHVzICVkIGFjdHVhbF9sZW5ndGggJWQpID0gdm9pZFxuIiwKKwkJdXJiLCB1cmItPnN0YXR1cywgdXJiLT5hY3R1YWxfbGVuZ3RoKTsKKwlyZXR1cm47CisKK2Vycm9yX2V4Y2VlZGVkOgorCWRldl9lcnIoZGV2LCAibWF4aW11bSBlcnJvcnMgaW4gbm90aWZpY2F0aW9uIFVSQiBleGNlZWRlZDsgIgorCQkicmVzZXR0aW5nIGRldmljZVxuIik7CitlcnJvcl9zdWJtaXQ6CisJdXNiX3F1ZXVlX3Jlc2V0X2RldmljZShpMjQwMG11LT51c2JfaWZhY2UpOworb3V0OgorCWRfZm5lbmQoNCwgZGV2LCAiKHVyYiAlcCBzdGF0dXMgJWQgYWN0dWFsX2xlbmd0aCAlZCkgPSB2b2lkXG4iLAorCQl1cmIsIHVyYi0+c3RhdHVzLCB1cmItPmFjdHVhbF9sZW5ndGgpOworCXJldHVybjsKK30KKworCisvKgorICogc2V0dXAgdGhlIG5vdGlmaWNhdGlvbiBlbmRwb2ludAorICoKKyAqIEBpMjQwMG06IGRldmljZSBkZXNjcmlwdG9yCisgKgorICogVGhpcyBwcm9jZWR1cmUgcHJlcGFyZXMgdGhlIG5vdGlmaWNhdGlvbiB1cmIgYW5kIGhhbmRsZXIgZm9yIHJlY2VpdmluZworICogdW5zb2xpY2l0ZWQgYmFya2VycyBmcm9tIHRoZSBkZXZpY2UuCisgKi8KK2ludCBpMjQwMG11X25vdGlmaWNhdGlvbl9zZXR1cChzdHJ1Y3QgaTI0MDBtdSAqaTI0MDBtdSkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmaTI0MDBtdS0+dXNiX2lmYWNlLT5kZXY7CisJaW50IHVzYl9waXBlLCByZXQgPSAwOworCXN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZXBkOworCWNoYXIgKmJ1ZjsKKworCWRfZm5zdGFydCg0LCBkZXYsICIoaTI0MDBtICVwKVxuIiwgaTI0MDBtdSk7CisJYnVmID0ga21hbGxvYyhJMjQwME1VX01BWF9OT1RJRklDQVRJT05fTEVOLCBHRlBfS0VSTkVMIHwgR0ZQX0RNQSk7CisJaWYgKGJ1ZiA9PSBOVUxMKSB7CisJCWRldl9lcnIoZGV2LCAibm90aWZpY2F0aW9uOiBidWZmZXIgYWxsb2NhdGlvbiBmYWlsZWRcbiIpOworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycm9yX2J1Zl9hbGxvYzsKKwl9CisKKwlpMjQwMG11LT5ub3RpZl91cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOworCWlmICghaTI0MDBtdS0+bm90aWZfdXJiKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWRldl9lcnIoZGV2LCAibm90aWZpY2F0aW9uOiBjYW5ub3QgYWxsb2NhdGUgVVJCXG4iKTsKKwkJZ290byBlcnJvcl9hbGxvY191cmI7CisJfQorCWVwZCA9IHVzYl9nZXRfZXBkKGkyNDAwbXUtPnVzYl9pZmFjZSwgSTI0MDBNVV9FUF9OT1RJRklDQVRJT04pOworCXVzYl9waXBlID0gdXNiX3JjdmludHBpcGUoaTI0MDBtdS0+dXNiX2RldiwgZXBkLT5iRW5kcG9pbnRBZGRyZXNzKTsKKwl1c2JfZmlsbF9pbnRfdXJiKGkyNDAwbXUtPm5vdGlmX3VyYiwgaTI0MDBtdS0+dXNiX2RldiwgdXNiX3BpcGUsCisJCQkgYnVmLCBJMjQwME1VX01BWF9OT1RJRklDQVRJT05fTEVOLAorCQkJIGkyNDAwbXVfbm90aWZpY2F0aW9uX2NiLCBpMjQwMG11LCBlcGQtPmJJbnRlcnZhbCk7CisJcmV0ID0gdXNiX3N1Ym1pdF91cmIoaTI0MDBtdS0+bm90aWZfdXJiLCBHRlBfS0VSTkVMKTsKKwlpZiAocmV0ICE9IDApIHsKKwkJZGV2X2VycihkZXYsICJub3RpZmljYXRpb246IGNhbm5vdCBzdWJtaXQgVVJCOiAlZFxuIiwgcmV0KTsKKwkJZ290byBlcnJvcl9zdWJtaXQ7CisJfQorCWRfZm5lbmQoNCwgZGV2LCAiKGkyNDAwbSAlcCkgPSAlZFxuIiwgaTI0MDBtdSwgcmV0KTsKKwlyZXR1cm4gcmV0OworCitlcnJvcl9zdWJtaXQ6CisJdXNiX2ZyZWVfdXJiKGkyNDAwbXUtPm5vdGlmX3VyYik7CitlcnJvcl9hbGxvY191cmI6CisJa2ZyZWUoYnVmKTsKK2Vycm9yX2J1Zl9hbGxvYzoKKwlkX2ZuZW5kKDQsIGRldiwgIihpMjQwMG0gJXApID0gJWRcbiIsIGkyNDAwbXUsIHJldCk7CisJcmV0dXJuIHJldDsKK30KKworCisvKgorICogVGVhciBkb3duIG9mIHRoZSBub3RpZmljYXRpb24gbWVjaGFuaXNtCisgKgorICogQGkyNDAwbTogZGV2aWNlIGRlc2NyaXB0b3IKKyAqCisgKiBLaWxsIHRoZSBpbnRlcnJ1cHQgZW5kcG9pbnQgdXJiLCBmcmVlIGFueSBhbGxvY2F0ZWQgcmVzb3VyY2VzLgorICoKKyAqIFdlIG5lZWQgdG8gY2hlY2sgaWYgd2UgaGF2ZSBkb25lIGl0IGJlZm9yZSBhcyBmb3IgZXhhbXBsZSwKKyAqIF9zdXNwZW5kKCkgY2FsbCB0aGlzOyBpZiBhZnRlciBhIHN1c3BlbmQoKSB3ZSBnZXQgYSBfZGlzY29ubmVjdCgpCisgKiAoYXMgdGhlIGNhc2UgaXMgd2hlbiBoaWJlcm5hdGluZyksIG5vdGhpbmcgYmFkIGhhcHBlbnMuCisgKi8KK3ZvaWQgaTI0MDBtdV9ub3RpZmljYXRpb25fcmVsZWFzZShzdHJ1Y3QgaTI0MDBtdSAqaTI0MDBtdSkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmaTI0MDBtdS0+dXNiX2lmYWNlLT5kZXY7CisKKwlkX2Zuc3RhcnQoNCwgZGV2LCAiKGkyNDAwbXUgJXApXG4iLCBpMjQwMG11KTsKKwlpZiAoaTI0MDBtdS0+bm90aWZfdXJiICE9IE5VTEwpIHsKKwkJdXNiX2tpbGxfdXJiKGkyNDAwbXUtPm5vdGlmX3VyYik7CisJCWtmcmVlKGkyNDAwbXUtPm5vdGlmX3VyYi0+dHJhbnNmZXJfYnVmZmVyKTsKKwkJdXNiX2ZyZWVfdXJiKGkyNDAwbXUtPm5vdGlmX3VyYik7CisJCWkyNDAwbXUtPm5vdGlmX3VyYiA9IE5VTEw7CisJfQorCWRfZm5lbmQoNCwgZGV2LCAiKGkyNDAwbXUgJXApXG4iLCBpMjQwMG11KTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpbWF4L2kyNDAwbS91c2ItcnguYyBiL2RyaXZlcnMvbmV0L3dpbWF4L2kyNDAwbS91c2ItcnguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzRjYzFmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2ltYXgvaTI0MDBtL3VzYi1yeC5jCkBAIC0wLDAgKzEsNDE3IEBACisvKgorICogSW50ZWwgV2lyZWxlc3MgV2lNQVggQ29ubmVjdGlvbiAyNDAwbQorICogVVNCIFJYIGhhbmRsaW5nCisgKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgICBkaXN0cmlidXRpb24uCisgKiAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqCisgKiBJbnRlbCBDb3Jwb3JhdGlvbiA8bGludXgtd2ltYXhAaW50ZWwuY29tPgorICogWWFuaXIgTHViZXRraW4gPHlhbmlyeC5sdWJldGtpbkBpbnRlbC5jb20+CisgKiAgLSBJbml0aWFsIGltcGxlbWVudGF0aW9uCisgKiBJbmFreSBQZXJlei1Hb256YWxleiA8aW5ha3kucGVyZXotZ29uemFsZXpAaW50ZWwuY29tPgorICogIC0gVXNlIHNrYl9jbG9uZSgpLCBicmVhayB1cCBwcm9jZXNzaW5nIGluIGNodW5rcworICogIC0gU3BsaXQgdHJhbnNwb3J0L2RldmljZSBzcGVjaWZpYworICogIC0gTWFrZSBidWZmZXIgc2l6ZSBkeW5hbWljIHRvIGV4ZXJ0IGxlc3MgbWVtb3J5IHByZXNzdXJlCisgKgorICoKKyAqIFRoaXMgaGFuZGxlcyB0aGUgUlggcGF0aCBvbiBVU0IuCisgKgorICogV2hlbiBhIG5vdGlmaWNhdGlvbiBpcyByZWNlaXZlZCB0aGF0IHNheXMgJ3RoZXJlIGlzIFJYIGRhdGEgcmVhZHknLAorICogd2UgY2FsbCBpMjQwMG11X3J4X2tpY2soKTsgdGhhdCB3YWtlcyB1cCB0aGUgUlgga3RocmVhZCwgd2hpY2gKKyAqIHJlYWRzIGEgYnVmZmVyIGZyb20gVVNCIGFuZCBwYXNzZXMgaXQgdG8gaTI0MDBtX3J4KCkgaW4gdGhlIGdlbmVyaWMKKyAqIGhhbmRsaW5nIGNvZGUuIFRoZSBSWCBidWZmZXIgaGFzIGFuIHNwZWNpZmljIGZvcm1hdCB0aGF0IGlzCisgKiBkZXNjcmliZWQgaW4gcnguYy4KKyAqCisgKiBXZSB1c2UgYSBrZXJuZWwgdGhyZWFkIGluIGEgbG9vcCBiZWNhdXNlOgorICoKKyAqICAtIHdlIHdhbnQgdG8gYmUgYWJsZSB0byBjYWxsIHRoZSBVU0IgcG93ZXIgbWFuYWdlbWVudCBnZXQvcHV0CisgKiAgICBmdW5jdGlvbnMgKGJsb2NraW5nKSBiZWZvcmUgZWFjaCB0cmFuc2FjdGlvbi4KKyAqCisgKiAgLSBXZSBtaWdodCBnZXQgYSBsb3Qgb2Ygbm90aWZpY2F0aW9ucyBhbmQgd2UgZG9uJ3Qgd2FudCB0byBzdWJtaXQKKyAqICAgIGEgemlsbGlvbiByZWFkczsgYnkgc2VyaWFsaXppbmcsIHdlIGFyZSB0aHJvdHRsaW5nLgorICoKKyAqICAtIFJYIGRhdGEgcHJvY2Vzc2luZyBjYW4gZ2V0IGhlYXZ5IGVub3VnaCBzbyB0aGF0IGl0IGlzIG5vdAorICogICAgYXBwcm9waWF0ZSBmb3IgZG9pbmcgaXQgaW4gdGhlIFVTQiBjYWxsYmFjazsgdGh1cyB3ZSBydW4gaXQgaW4gYQorICogICAgcHJvY2VzcyBjb250ZXh0LgorICoKKyAqIFdlIHByb3ZpZGUgYSByZWFkIGJ1ZmZlciBvZiBhbiBhcmJpdHJhcnkgc2l6ZSAoc2hvcnQgb2YgYSBwYWdlKTsgaWYKKyAqIHRoZSBjYWxsYmFjayByZXBvcnRzIC1FT1ZFUkZMT1csIGl0IG1lYW5zIGl0IHdhcyB0b28gc21hbGwsIHNvIHdlCisgKiBqdXN0IGRvdWJsZSB0aGUgc2l6ZSBhbmQgcmV0cnkgKGJlaW5nIGNhcmVmdWwgdG8gYXBwZW5kLCBhcworICogc29tZXRpbWVzIHRoZSBkZXZpY2UgcHJvdmlkZWQgc29tZSBkYXRhKS4gRXZlcnkgbm93IGFuZCB0aGVuIHdlCisgKiBjaGVjayBpZiB0aGUgYXZlcmFnZSBwYWNrZXQgc2l6ZSBpcyBzbWFsbGVyIHRoYW4gdGhlIGN1cnJlbnQgcGFja2V0CisgKiBzaXplIGFuZCBpZiBzbywgd2UgaGFsdmUgaXQuIEF0IHRoZSBlbmQsIHRoZSBzaXplIG9mIHRoZQorICogcHJlYWxsb2NhdGVkIGJ1ZmZlciBzaG91bGQgYmUgZm9sbG93aW5nIHRoZSBhdmVyYWdlIHJlY2VpdmVkCisgKiB0cmFuc2FjdGlvbiBzaXplLCBhZGFwdGluZyBkeW5hbWljYWxseSB0byBpdC4KKyAqCisgKiBST0FETUFQCisgKgorICogaTI0MDBtdV9yeF9raWNrKCkJCSAgIENhbGxlZCBmcm9tIG5vdGlmLmMgd2hlbiB3ZSBnZXQgYQorICogICAJCQkgICAgICAgICAgICdkYXRhIHJlYWR5JyBub3RpZmljYXRpb24KKyAqIGkyNDAwbXVfcnhkKCkgICAgICAgICAgICAgICAgICAgS2VybmVsIFJYIGRhZW1vbgorICogICBpMjQwMG11X3J4KCkgICAgICAgICAgICAgICAgICBSZWNlaXZlIFVTQiBkYXRhCisgKiAgIGkyNDAwbV9yeCgpICAgICAgICAgICAgICAgICAgIFNlbmQgZGF0YSB0byBnZW5lcmljIGkyNDAwbSBSWCBoYW5kbGluZworICoKKyAqIGkyNDAwbXVfcnhfc2V0dXAoKSAgICAgICAgICAgICAgY2FsbGVkIGZyb20gaTI0MDBtdV9idXNfZGV2X3N0YXJ0KCkKKyAqCisgKiBpMjQwMG11X3J4X3JlbGVhc2UoKSAgICAgICAgICAgIGNhbGxlZCBmcm9tIGkyNDAwbXVfYnVzX2Rldl9zdG9wKCkKKyAqLworI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgorI2luY2x1ZGUgImkyNDAwbS11c2IuaCIKKworCisjZGVmaW5lIERfU1VCTU9EVUxFIHJ4CisjaW5jbHVkZSAidXNiLWRlYnVnLWxldmVscy5oIgorCisvKgorICogRHluYW1pYyBSWCBzaXplCisgKgorICogV2UgY2FuJ3QgbGV0IHRoZSByeF9zaXplIGJlIGEgbXVsdGlwbGUgb2YgNTEyIGJ5dGVzICh0aGUgUlgKKyAqIGVuZHBvaW50J3MgbWF4IHBhY2tldCBzaXplKS4gT24gc29tZSBVU0IgaG9zdCBjb250cm9sbGVycyAod2UKKyAqIGhhdmVuJ3QgYmVlbiBhYmxlIHRvIGZ1bGx5IGNoYXJhY3Rlcml6ZSB3aGljaCksIGlmIHRoZSBkZXZpY2UgaXMKKyAqIGFib3V0IHRvIHNlbmQgKGZvciBleGFtcGxlKSBYIGJ5dGVzIGFuZCB3ZSBvbmx5IHBvc3QgYSBidWZmZXIgdG8KKyAqIHJlY2VpdmUgbio1MTIsIGl0IHdpbGwgZmFpbCB0byBtYXJrIHRoYXQgYXMgYmFiYmxlIChzbyB0aGF0CisgKiBpMjQwMG11X3J4KCkgW2Nhc2UgLUVPVkVSRkxPV10gY2FuIHJlc2l6ZSB0aGUgYnVmZmVyIGFuZCBnZXQgdGhlCisgKiByZXN0KS4KKyAqCisgKiBTbyBvbiBncm93aW5nIG9yIHNocmlua2luZywgaWYgaXQgaXMgYSBtdWx0aXBsZSBvZiB0aGUKKyAqIG1heHBhY2tldHNpemUsIHdlIHJlbW92ZSBzb21lIChpbnN0ZWFkIG9mIGluY3Jlc2luZyBzb21lLCBzbyBpbiBhCisgKiBidWRkeSBhbGxvY2F0b3Igd2UgdHJ5IHRvIHdhc3RlIGxlc3Mgc3BhY2UpLgorICoKKyAqIE5vdGUgd2UgYWxzbyBuZWVkIGEgaG9vayBmb3IgdGhpcyBvbiBpMjQwMG11X3J4KCkgLS0gd2hlbiB3ZSBkbyB0aGUKKyAqIGZpcnN0IHJlYWQsIHdlIGFyZSBzdXJlIHdlIHdvbid0IGhpdCB0aGlzIHNwb3QgYmVjYXVzZQorICogaTI0MG1tLT5yeF9zaXplIGhhcyBiZWVuIHNldCBwcm9wZXJseS4gSG93ZXZlciwgaWYgd2UgaGF2ZSB0bworICogZG91YmxlIGJlY2F1c2Ugb2YgLUVPVkVSRkxPVywgd2hlbiB3ZSBsYXVuY2ggdGhlIHJlYWQgdG8gZ2V0IHRoZQorICogcmVzdCBvZiB0aGUgZGF0YSwgd2UgKmhhdmUqIHRvIG1ha2Ugc3VyZSB0aGF0IGFsc28gaXMgbm90IGEKKyAqIG11bHRpcGxlIG9mIHRoZSBtYXhfcGt0X3NpemUuCisgKi8KKworc3RhdGljCitzaXplX3QgaTI0MDBtdV9yeF9zaXplX2dyb3coc3RydWN0IGkyNDAwbXUgKmkyNDAwbXUpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJmkyNDAwbXUtPnVzYl9pZmFjZS0+ZGV2OworCXNpemVfdCByeF9zaXplOworCWNvbnN0IHNpemVfdCBtYXhfcGt0X3NpemUgPSA1MTI7CisKKwlyeF9zaXplID0gMiAqIGkyNDAwbXUtPnJ4X3NpemU7CisJaWYgKHJ4X3NpemUgJSBtYXhfcGt0X3NpemUgPT0gMCkgeworCQlyeF9zaXplIC09IDg7CisJCWRfcHJpbnRmKDEsIGRldiwKKwkJCSAiUlg6IGV4cGVjdGVkIHNpemUgZ3JldyB0byAlenUgW2FkanVzdGVkIC04XSAiCisJCQkgImZyb20gJXp1XG4iLAorCQkJIHJ4X3NpemUsIGkyNDAwbXUtPnJ4X3NpemUpOworCX0gZWxzZQorCQlkX3ByaW50ZigxLCBkZXYsCisJCQkgIlJYOiBleHBlY3RlZCBzaXplIGdyZXcgdG8gJXp1IGZyb20gJXp1XG4iLAorCQkJIHJ4X3NpemUsIGkyNDAwbXUtPnJ4X3NpemUpOworCXJldHVybiByeF9zaXplOworfQorCisKK3N0YXRpYwordm9pZCBpMjQwMG11X3J4X3NpemVfbWF5YmVfc2hyaW5rKHN0cnVjdCBpMjQwMG11ICppMjQwMG11KQoreworCWNvbnN0IHNpemVfdCBtYXhfcGt0X3NpemUgPSA1MTI7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJmkyNDAwbXUtPnVzYl9pZmFjZS0+ZGV2OworCisJaWYgKHVubGlrZWx5KGkyNDAwbXUtPnJ4X3NpemVfY250ID49IDEwMAorCQkgICAgICYmIGkyNDAwbXUtPnJ4X3NpemVfYXV0b19zaHJpbmspKSB7CisJCXNpemVfdCBhdmdfcnhfc2l6ZSA9CisJCQlpMjQwMG11LT5yeF9zaXplX2FjYyAvIGkyNDAwbXUtPnJ4X3NpemVfY250OworCQlzaXplX3QgbmV3X3J4X3NpemUgPSBpMjQwMG11LT5yeF9zaXplIC8gMjsKKwkJaWYgKGF2Z19yeF9zaXplIDwgbmV3X3J4X3NpemUpIHsKKwkJCWlmIChuZXdfcnhfc2l6ZSAlIG1heF9wa3Rfc2l6ZSA9PSAwKSB7CisJCQkJbmV3X3J4X3NpemUgLT0gODsKKwkJCQlkX3ByaW50ZigxLCBkZXYsCisJCQkJCSAiUlg6IGV4cGVjdGVkIHNpemUgc2hyYW5rIHRvICV6dSAiCisJCQkJCSAiW2FkanVzdGVkIC04XSBmcm9tICV6dVxuIiwKKwkJCQkJIG5ld19yeF9zaXplLCBpMjQwMG11LT5yeF9zaXplKTsKKwkJCX0gZWxzZQorCQkJCWRfcHJpbnRmKDEsIGRldiwKKwkJCQkJICJSWDogZXhwZWN0ZWQgc2l6ZSBzaHJhbmsgdG8gJXp1ICIKKwkJCQkJICJmcm9tICV6dVxuIiwKKwkJCQkJIG5ld19yeF9zaXplLCBpMjQwMG11LT5yeF9zaXplKTsKKwkJCWkyNDAwbXUtPnJ4X3NpemUgPSBuZXdfcnhfc2l6ZTsKKwkJCWkyNDAwbXUtPnJ4X3NpemVfY250ID0gMDsKKwkJCWkyNDAwbXUtPnJ4X3NpemVfYWNjID0gaTI0MDBtdS0+cnhfc2l6ZTsKKwkJfQorCX0KK30KKworLyoKKyAqIFJlY2VpdmUgYSBtZXNzYWdlIHdpdGggcGF5bG9hZHMgZnJvbSB0aGUgVVNCIGJ1cyBpbnRvIGFuIHNrYgorICoKKyAqIEBpMjQwMG11OiBVU0IgZGV2aWNlIGRlc2NyaXB0b3IKKyAqIEByeF9za2I6IHNrYiB3aGVyZSB0byBwbGFjZSB0aGUgcmVjZWl2ZWQgbWVzc2FnZQorICoKKyAqIERlYWxzIHdpdGggYWxsIHRoZSBVU0Itc3BlY2lmaWNzIG9mIHJlY2VpdmluZywgZHluYW1pY2FsbHkKKyAqIGluY3JlYXNpbmcgdGhlIGJ1ZmZlciBzaXplIGlmIHNvIG5lZWRlZC4gUmV0dXJucyB0aGUgcGF5bG9hZCBpbiB0aGUKKyAqIHNrYiwgcmVhZHkgdG8gcHJvY2Vzcy4gT24gYSB6ZXJvLWxlbmd0aCBwYWNrZXQsIHdlIHJldHJ5LgorICoKKyAqIE9uIHNvZnQgVVNCIGVycm9ycywgd2UgcmV0cnkgKHVudGlsIHRoZXkgYmVjb21lIHRvbyBmcmVxdWVudCBhbmQKKyAqIHRoZW4gYXJlIHByb21vdGVkIHRvIGhhcmQpOyBvbiBoYXJkIFVTQiBlcnJvcnMsIHdlIHJlc2V0IHRoZQorICogZGV2aWNlLiBPbiBvdGhlciBlcnJvcnMgKHNrYiByZWFsbG9hY2F0aW9uLCB3ZSBqdXN0IGRyb3AgaXQgYW5kCisgKiBob3BlIGZvciB0aGUgbmV4dCBpbnZvY2F0aW9uIHRvIHNvbHZlIGl0KS4KKyAqCisgKiBSZXR1cm5zOiBwb2ludGVyIHRvIHRoZSBza2IgaWYgb2ssIEVSUl9QVFIgb24gZXJyb3IuCisgKiAgIE5PVEU6IHRoaXMgZnVuY3Rpb24gbWlnaHQgcmVhbGxvYyB0aGUgc2tiIChpZiBpdCBpcyB0b28gc21hbGwpLAorICogICBzbyBhbHdheXMgdXBkYXRlIHdpdGggdGhlIG9uZSByZXR1cm5lZC4KKyAqICAgRVJSX1BUUigpIGlzIDwgMCBvbiBlcnJvci4KKyAqLworc3RhdGljCitzdHJ1Y3Qgc2tfYnVmZiAqaTI0MDBtdV9yeChzdHJ1Y3QgaTI0MDBtdSAqaTI0MDBtdSwgc3RydWN0IHNrX2J1ZmYgKnJ4X3NrYikKK3sKKwlpbnQgcmVzdWx0ID0gMDsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmaTI0MDBtdS0+dXNiX2lmYWNlLT5kZXY7CisJaW50IHVzYl9waXBlLCByZWFkX3NpemUsIHJ4X3NpemUsIGRvX2F1dG9wbTsKKwlzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVwZDsKKwljb25zdCBzaXplX3QgbWF4X3BrdF9zaXplID0gNTEyOworCisJZF9mbnN0YXJ0KDQsIGRldiwgIihpMjQwMG11ICVwKVxuIiwgaTI0MDBtdSk7CisJZG9fYXV0b3BtID0gYXRvbWljX3JlYWQoJmkyNDAwbXUtPmRvX2F1dG9wbSk7CisJcmVzdWx0ID0gZG9fYXV0b3BtID8KKwkJdXNiX2F1dG9wbV9nZXRfaW50ZXJmYWNlKGkyNDAwbXUtPnVzYl9pZmFjZSkgOiAwOworCWlmIChyZXN1bHQgPCAwKSB7CisJCWRldl9lcnIoZGV2LCAiUlg6IGNhbid0IGdldCBhdXRvcG06ICVkXG4iLCByZXN1bHQpOworCQlkb19hdXRvcG0gPSAwOworCX0KKwllcGQgPSB1c2JfZ2V0X2VwZChpMjQwMG11LT51c2JfaWZhY2UsIEkyNDAwTVVfRVBfQlVMS19JTik7CisJdXNiX3BpcGUgPSB1c2JfcmN2YnVsa3BpcGUoaTI0MDBtdS0+dXNiX2RldiwgZXBkLT5iRW5kcG9pbnRBZGRyZXNzKTsKK3JldHJ5OgorCXJ4X3NpemUgPSBza2JfZW5kX3BvaW50ZXIocnhfc2tiKSAtIHJ4X3NrYi0+ZGF0YSAtIHJ4X3NrYi0+bGVuOworCWlmICh1bmxpa2VseShyeF9zaXplICUgbWF4X3BrdF9zaXplID09IDApKSB7CisJCXJ4X3NpemUgLT0gODsKKwkJZF9wcmludGYoMSwgZGV2LCAiUlg6IHJ4X3NpemUgYWRhcHRlZCB0byAlZCBbLThdXG4iLCByeF9zaXplKTsKKwl9CisJcmVzdWx0ID0gdXNiX2J1bGtfbXNnKAorCQlpMjQwMG11LT51c2JfZGV2LCB1c2JfcGlwZSwgcnhfc2tiLT5kYXRhICsgcnhfc2tiLT5sZW4sCisJCXJ4X3NpemUsICZyZWFkX3NpemUsIEhaKTsKKwl1c2JfbWFya19sYXN0X2J1c3koaTI0MDBtdS0+dXNiX2Rldik7CisJc3dpdGNoIChyZXN1bHQpIHsKKwljYXNlIDA6CisJCWlmIChyZWFkX3NpemUgPT0gMCkKKwkJCWdvdG8gcmV0cnk7CS8qIFpMUCwganVzdCByZXN1Ym1pdCAqLworCQlza2JfcHV0KHJ4X3NrYiwgcmVhZF9zaXplKTsKKwkJYnJlYWs7CisJY2FzZSAtRUlOVkFMOgkJCS8qIHdoaWxlIHJlbW92aW5nIGRyaXZlciAqLworCWNhc2UgLUVOT0RFVjoJCQkvKiBkZXYgZGlzY29ubmVjdCAuLi4gKi8KKwljYXNlIC1FTk9FTlQ6CQkJLyoganVzdCBpZ25vcmUgaXQgKi8KKwljYXNlIC1FU0hVVERPV046CisJY2FzZSAtRUNPTk5SRVNFVDoKKwkJYnJlYWs7CisJY2FzZSAtRU9WRVJGTE9XOiB7CQkvKiB0b28gc21hbGwsIHJlYWxsb2NhdGUgKi8KKwkJc3RydWN0IHNrX2J1ZmYgKm5ld19za2I7CisJCXJ4X3NpemUgPSBpMjQwMG11X3J4X3NpemVfZ3JvdyhpMjQwMG11KTsKKwkJaWYgKHJ4X3NpemUgPD0gKDEgPDwgMTYpKQkvKiBjYXAgaXQgKi8KKwkJCWkyNDAwbXUtPnJ4X3NpemUgPSByeF9zaXplOworCQllbHNlIGlmIChwcmludGtfcmF0ZWxpbWl0KCkpIHsKKwkJCWRldl9lcnIoZGV2LCAiQlVHPyByeF9zaXplIHVwIHRvICVkXG4iLCByeF9zaXplKTsKKwkJCXJlc3VsdCA9IC1FSU5WQUw7CisJCQlnb3RvIG91dDsKKwkJfQorCQlza2JfcHV0KHJ4X3NrYiwgcmVhZF9zaXplKTsKKwkJbmV3X3NrYiA9IHNrYl9jb3B5X2V4cGFuZChyeF9za2IsIDAsIHJ4X3NpemUgLSByeF9za2ItPmxlbiwKKwkJCQkJICBHRlBfS0VSTkVMKTsKKwkJaWYgKG5ld19za2IgPT0gTlVMTCkgeworCQkJaWYgKHByaW50a19yYXRlbGltaXQoKSkKKwkJCQlkZXZfZXJyKGRldiwgIlJYOiBDYW4ndCByZWFsbG9jYXRlIHNrYiB0byAlZDsgIgorCQkJCQkiUlggZHJvcHBlZFxuIiwgcnhfc2l6ZSk7CisJCQlrZnJlZShyeF9za2IpOworCQkJcmVzdWx0ID0gMDsKKwkJCWdvdG8gb3V0OwkvKiBkcm9wIGl0Li4uKi8KKwkJfQorCQlrZnJlZV9za2Iocnhfc2tiKTsKKwkJcnhfc2tiID0gbmV3X3NrYjsKKwkJaTI0MDBtdS0+cnhfc2l6ZV9jbnQgPSAwOworCQlpMjQwMG11LT5yeF9zaXplX2FjYyA9IGkyNDAwbXUtPnJ4X3NpemU7CisJCWRfcHJpbnRmKDEsIGRldiwgIlJYOiBzaXplIGNoYW5nZWQgdG8gJWQsIHJlY2VpdmVkICVkLCAiCisJCQkgImNvcGllZCAlZCwgY2FwYWNpdHkgJWxkXG4iLAorCQkJIHJ4X3NpemUsIHJlYWRfc2l6ZSwgcnhfc2tiLT5sZW4sCisJCQkgKGxvbmcpIChza2JfZW5kX3BvaW50ZXIobmV3X3NrYikgLSBuZXdfc2tiLT5oZWFkKSk7CisJCWdvdG8gcmV0cnk7CisJfQorCQkvKiBJbiBtb3N0IGNhc2VzLCBpdCBoYXBwZW5zIGR1ZSB0byB0aGUgaGFyZHdhcmUgc2NoZWR1bGluZyBhCisJCSAqIHJlYWQgd2hlbiB0aGVyZSB3YXMgbm8gZGF0YSAtIHVuZm9ydHVuYXRlbHksIHdlIGhhdmUgbm8gd2F5CisJCSAqIHRvIHRlbGwgdGhpcyB0aW1lb3V0IGZyb20gYSBVU0IgdGltZW91dC4gU28gd2UganVzdCBpZ25vcmUKKwkJICogaXQuICovCisJY2FzZSAtRVRJTUVET1VUOgorCQlkZXZfZXJyKGRldiwgIlJYOiB0aW1lb3V0OiAlZFxuIiwgcmVzdWx0KTsKKwkJcmVzdWx0ID0gMDsKKwkJYnJlYWs7CisJZGVmYXVsdDoJCQkvKiBBbnkgZXJyb3IgKi8KKwkJaWYgKGVkY19pbmMoJmkyNDAwbXUtPnVyYl9lZGMsCisJCQkgICAgRURDX01BWF9FUlJPUlMsIEVEQ19FUlJPUl9USU1FRlJBTUUpKQorCQkJZ290byBlcnJvcl9yZXNldDsKKwkJZGV2X2VycihkZXYsICJSWDogZXJyb3IgcmVjZWl2aW5nIFVSQjogJWQsIHJldHJ5aW5nXG4iLCByZXN1bHQpOworCQlnb3RvIHJldHJ5OworCX0KK291dDoKKwlpZiAoZG9fYXV0b3BtKQorCQl1c2JfYXV0b3BtX3B1dF9pbnRlcmZhY2UoaTI0MDBtdS0+dXNiX2lmYWNlKTsKKwlkX2ZuZW5kKDQsIGRldiwgIihpMjQwMG11ICVwKSA9ICVwXG4iLCBpMjQwMG11LCByeF9za2IpOworCXJldHVybiByeF9za2I7CisKK2Vycm9yX3Jlc2V0OgorCWRldl9lcnIoZGV2LCAiUlg6IG1heGltdW0gZXJyb3JzIGluIFVSQiBleGNlZWRlZDsgIgorCQkicmVzZXR0aW5nIGRldmljZVxuIik7CisJdXNiX3F1ZXVlX3Jlc2V0X2RldmljZShpMjQwMG11LT51c2JfaWZhY2UpOworCXJ4X3NrYiA9IEVSUl9QVFIocmVzdWx0KTsKKwlnb3RvIG91dDsKK30KKworCisvKgorICogS2VybmVsIHRocmVhZCBmb3IgVVNCIHJlY2VwdGlvbiBvZiBkYXRhCisgKgorICogVGhpcyB0aHJlYWQgd2FpdHMgZm9yIGEga2ljazsgb25jZSBraWNrZWQsIGl0IHdpbGwgYWxsb2NhdGUgYW4gc2tiCisgKiBhbmQgcmVjZWl2ZSBhIHNpbmdsZSBtZXNzYWdlIHRvIGl0IGZyb20gVVNCICh1c2luZworICogaTI0MDBtdV9yeCgpKS4gT25jZSByZWNlaXZlZCwgaXQgaXMgcGFzc2VkIHRvIHRoZSBnZW5lcmljIGkyNDAwbSBSWAorICogY29kZSBmb3IgcHJvY2Vzc2luZy4KKyAqCisgKiBXaGVuIGRvbmUgcHJvY2Vzc2luZywgaXQgcnVucyBzb21lIGRpcnR5IHN0YXRpc3RpY3MgdG8gdmVyaWZ5IGlmCisgKiB0aGUgbGFzdCAxMDAgbWVzc2FnZXMgcmVjZWl2ZWQgd2VyZSBzbWFsbGVyIHRoYW4gaGFsZiBvZiB0aGUKKyAqIGN1cnJlbnQgUlggYnVmZmVyIHNpemUuIEluIHRoYXQgY2FzZSwgdGhlIFJYIGJ1ZmZlciBzaXplIGlzCisgKiBoYWx2ZWQuIFRoaXMgd2lsbCBoZWxwcyBsb3dlcmluZyB0aGUgcHJlc3N1cmUgb24gdGhlIG1lbW9yeQorICogYWxsb2NhdG9yLgorICoKKyAqIEhhcmQgZXJyb3JzIGZvcmNlIHRoZSB0aHJlYWQgdG8gZXhpdC4KKyAqLworc3RhdGljCitpbnQgaTI0MDBtdV9yeGQodm9pZCAqX2kyNDAwbXUpCit7CisJaW50IHJlc3VsdCA9IDA7CisJc3RydWN0IGkyNDAwbXUgKmkyNDAwbXUgPSBfaTI0MDBtdTsKKwlzdHJ1Y3QgaTI0MDBtICppMjQwMG0gPSAmaTI0MDBtdS0+aTI0MDBtOworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZpMjQwMG11LT51c2JfaWZhY2UtPmRldjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldiA9IGkyNDAwbS0+d2ltYXhfZGV2Lm5ldF9kZXY7CisJc2l6ZV90IHBlbmRpbmc7CisJaW50IHJ4X3NpemU7CisJc3RydWN0IHNrX2J1ZmYgKnJ4X3NrYjsKKworCWRfZm5zdGFydCg0LCBkZXYsICIoaTI0MDBtdSAlcClcbiIsIGkyNDAwbXUpOworCXdoaWxlICgxKSB7CisJCWRfcHJpbnRmKDIsIGRldiwgIlRYOiB3YWl0aW5nIGZvciBtZXNzYWdlc1xuIik7CisJCXBlbmRpbmcgPSAwOworCQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoCisJCQlpMjQwMG11LT5yeF93cSwKKwkJCShrdGhyZWFkX3Nob3VsZF9zdG9wKCkJLyogY2hlY2sgdGhpcyBmaXJzdCEgKi8KKwkJCSB8fCAocGVuZGluZyA9IGF0b21pY19yZWFkKCZpMjQwMG11LT5yeF9wZW5kaW5nX2NvdW50KSkpCisJCQkpOworCQlpZiAoa3RocmVhZF9zaG91bGRfc3RvcCgpKQorCQkJYnJlYWs7CisJCWlmIChwZW5kaW5nID09IDApCisJCQljb250aW51ZTsKKwkJcnhfc2l6ZSA9IGkyNDAwbXUtPnJ4X3NpemU7CisJCWRfcHJpbnRmKDIsIGRldiwgIlJYOiByZWFkaW5nIHVwIHRvICVkIGJ5dGVzXG4iLCByeF9zaXplKTsKKwkJcnhfc2tiID0gX19uZXRkZXZfYWxsb2Nfc2tiKG5ldF9kZXYsIHJ4X3NpemUsIEdGUF9LRVJORUwpOworCQlpZiAocnhfc2tiID09IE5VTEwpIHsKKwkJCWRldl9lcnIoZGV2LCAiUlg6IGNhbid0IGFsbG9jYXRlIHNrYiBbJWQgYnl0ZXNdXG4iLAorCQkJCXJ4X3NpemUpOworCQkJbXNsZWVwKDUwKTsJLyogZ2l2ZSBpdCBzb21lIHRpbWU/ICovCisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIFJlY2VpdmUgdGhlIG1lc3NhZ2Ugd2l0aCB0aGUgcGF5bG9hZHMgKi8KKwkJcnhfc2tiID0gaTI0MDBtdV9yeChpMjQwMG11LCByeF9za2IpOworCQlyZXN1bHQgPSBQVFJfRVJSKHJ4X3NrYik7CisJCWlmIChJU19FUlIocnhfc2tiKSkKKwkJCWdvdG8gb3V0OworCQlhdG9taWNfZGVjKCZpMjQwMG11LT5yeF9wZW5kaW5nX2NvdW50KTsKKwkJaWYgKHJ4X3NrYi0+bGVuID09IDApIHsJLyogc29tZSBpZ25vcmFibGUgY29uZGl0aW9uICovCisJCQlrZnJlZV9za2Iocnhfc2tiKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogRGVsaXZlciB0aGUgbWVzc2FnZSB0byB0aGUgZ2VuZXJpYyBpMjQwMG0gY29kZSAqLworCQlpMjQwMG11LT5yeF9zaXplX2NudCsrOworCQlpMjQwMG11LT5yeF9zaXplX2FjYyArPSByeF9za2ItPmxlbjsKKwkJcmVzdWx0ID0gaTI0MDBtX3J4KGkyNDAwbSwgcnhfc2tiKTsKKwkJaWYgKHJlc3VsdCA9PSAtRUlPCisJCSAgICAmJiBlZGNfaW5jKCZpMjQwMG11LT51cmJfZWRjLAorCQkJICAgICAgIEVEQ19NQVhfRVJST1JTLCBFRENfRVJST1JfVElNRUZSQU1FKSkgeworCQkJZ290byBlcnJvcl9yZXNldDsKKwkJfQorCisJCS8qIE1heWJlIGFkanVzdCBSWCBidWZmZXIgc2l6ZSAqLworCQlpMjQwMG11X3J4X3NpemVfbWF5YmVfc2hyaW5rKGkyNDAwbXUpOworCX0KKwlyZXN1bHQgPSAwOworb3V0OgorCWRfZm5lbmQoNCwgZGV2LCAiKGkyNDAwbXUgJXApID0gJWRcbiIsIGkyNDAwbXUsIHJlc3VsdCk7CisJcmV0dXJuIHJlc3VsdDsKKworZXJyb3JfcmVzZXQ6CisJZGV2X2VycihkZXYsICJSWDogbWF4aW11bSBlcnJvcnMgaW4gcmVjZWl2ZWQgYnVmZmVyIGV4Y2VlZGVkOyAiCisJCSJyZXNldHRpbmcgZGV2aWNlXG4iKTsKKwl1c2JfcXVldWVfcmVzZXRfZGV2aWNlKGkyNDAwbXUtPnVzYl9pZmFjZSk7CisJZ290byBvdXQ7Cit9CisKKworLyoKKyAqIFN0YXJ0IHJlYWRpbmcgZnJvbSB0aGUgZGV2aWNlCisgKgorICogQGkyNDAwbTogZGV2aWNlIGluc3RhbmNlCisgKgorICogTm90aWZ5IHRoZSBSWCB0aHJlYWQgdGhhdCB0aGVyZSBpcyBkYXRhIHBlbmRpbmcuCisgKi8KK3ZvaWQgaTI0MDBtdV9yeF9raWNrKHN0cnVjdCBpMjQwMG11ICppMjQwMG11KQoreworCXN0cnVjdCBpMjQwMG0gKmkyNDAwbSA9ICZpMjQwMG11LT5pMjQwMG07CisJc3RydWN0IGRldmljZSAqZGV2ID0gJmkyNDAwbXUtPnVzYl9pZmFjZS0+ZGV2OworCisJZF9mbnN0YXJ0KDMsIGRldiwgIihpMjQwMG11ICVwKVxuIiwgaTI0MDBtKTsKKwlhdG9taWNfaW5jKCZpMjQwMG11LT5yeF9wZW5kaW5nX2NvdW50KTsKKwl3YWtlX3VwX2FsbCgmaTI0MDBtdS0+cnhfd3EpOworCWRfZm5lbmQoMywgZGV2LCAiKGkyNDAwbSAlcCkgPSB2b2lkXG4iLCBpMjQwMG0pOworfQorCisKK2ludCBpMjQwMG11X3J4X3NldHVwKHN0cnVjdCBpMjQwMG11ICppMjQwMG11KQoreworCWludCByZXN1bHQgPSAwOworCXN0cnVjdCBpMjQwMG0gKmkyNDAwbSA9ICZpMjQwMG11LT5pMjQwMG07CisJc3RydWN0IGRldmljZSAqZGV2ID0gJmkyNDAwbXUtPnVzYl9pZmFjZS0+ZGV2OworCXN0cnVjdCB3aW1heF9kZXYgKndpbWF4X2RldiA9ICZpMjQwMG0tPndpbWF4X2RldjsKKworCWkyNDAwbXUtPnJ4X2t0aHJlYWQgPSBrdGhyZWFkX3J1bihpMjQwMG11X3J4ZCwgaTI0MDBtdSwgIiVzLXJ4IiwKKwkJCQkJICB3aW1heF9kZXYtPm5hbWUpOworCWlmIChJU19FUlIoaTI0MDBtdS0+cnhfa3RocmVhZCkpIHsKKwkJcmVzdWx0ID0gUFRSX0VSUihpMjQwMG11LT5yeF9rdGhyZWFkKTsKKwkJZGV2X2VycihkZXYsICJSWDogY2Fubm90IHN0YXJ0IHRocmVhZDogJWRcbiIsIHJlc3VsdCk7CisJfQorCXJldHVybiByZXN1bHQ7Cit9CisKK3ZvaWQgaTI0MDBtdV9yeF9yZWxlYXNlKHN0cnVjdCBpMjQwMG11ICppMjQwMG11KQoreworCWt0aHJlYWRfc3RvcChpMjQwMG11LT5yeF9rdGhyZWFkKTsKK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2ltYXgvaTI0MDBtL3VzYi10eC5jIGIvZHJpdmVycy9uZXQvd2ltYXgvaTI0MDBtL3VzYi10eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmZDg5MzMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aW1heC9pMjQwMG0vdXNiLXR4LmMKQEAgLTAsMCArMSwyMjkgQEAKKy8qCisgKiBJbnRlbCBXaXJlbGVzcyBXaU1BWCBDb25uZWN0aW9uIDI0MDBtCisgKiBVU0Igc3BlY2lmaWMgVFggaGFuZGxpbmcKKyAqCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgIGRpc3RyaWJ1dGlvbi4KKyAqICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEludGVsIENvcnBvcmF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICoKKyAqIEludGVsIENvcnBvcmF0aW9uIDxsaW51eC13aW1heEBpbnRlbC5jb20+CisgKiBZYW5pciBMdWJldGtpbiA8eWFuaXJ4Lmx1YmV0a2luQGludGVsLmNvbT4KKyAqICAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24KKyAqIEluYWt5IFBlcmV6LUdvbnphbGV6IDxpbmFreS5wZXJlei1nb256YWxlekBpbnRlbC5jb20+CisgKiAgLSBTcGxpdCB0cmFuc3BvcnQvZGV2aWNlIHNwZWNpZmljCisgKgorICoKKyAqIFRha2VzIHRoZSBUWCBtZXNzYWdlcyBpbiB0aGUgaTI0MDBtJ3MgZHJpdmVyIFRYIEZJRk8gYW5kIHNlbmRzIHRoZW0KKyAqIHRvIHRoZSBkZXZpY2UgdW50aWwgdGhlcmUgYXJlIG5vIG1vcmUuCisgKgorICogSWYgd2UgZmFpbCBzZW5kaW5nIHRoZSBtZXNzYWdlLCB3ZSBqdXN0IGRyb3AgaXQuIFRoZXJlIGlzbid0IG11Y2gKKyAqIHdlIGNhbiBkbyBhdCB0aGlzIHBvaW50LiBXZSBjb3VsZCBhbHNvIHJldHJ5LCBidXQgdGhlIFVTQiBzdGFjayBoYXMKKyAqIGFscmVhZHkgcmV0cmllZCBhbmQgc3RpbGwgZmFpbGVkLCBzbyB0aGVyZSBpcyBub3QgbXVjaCBvZiBhCisgKiBwb2ludC4gQXMgd2VsbCwgbW9zdCBvZiB0aGUgdHJhZmZpYyBpcyBuZXR3b3JrLCB3aGljaCBoYXMgcmVjb3ZlcnkKKyAqIG1ldGhvZHMgZm9yIGRyb3BwZWQgcGFja2V0cy4KKyAqCisgKiBGb3Igc2VuZGluZyB3ZSBqdXN0IG9idGFpbiBhIEZJRk8gYnVmZmVyIHRvIHNlbmQsIHNlbmQgaXQgdG8gdGhlCisgKiBVU0IgYnVsayBvdXQsIHRlbGwgdGhlIFRYIEZJRk8gY29kZSB3ZSBoYXZlIHNlbnQgaXQ7IHF1ZXJ5IGZvcgorICogYW5vdGhlciBvbmUsIGV0Yy4uLiB1bnRpbCBkb25lLgorICoKKyAqIFdlIHVzZSBhIHRocmVhZCBzbyB3ZSBjYW4gY2FsbCB1c2JfYXV0b3BtX2VuYWJsZSgpIGFuZAorICogdXNiX2F1dG9wbV9kaXNhYmxlKCkgZm9yIGVhY2ggdHJhbnNhY3Rpb247IHRoaXMgd2F5IHdoZW4gdGhlIGRldmljZQorICogZ29lcyBpZGxlLCBpdCB3aWxsIHN1c3BlbmQuIEl0IGFsc28gaGFzIGxlc3Mgb3ZlcmhlYWQgdGhhbiBhCisgKiBkZWRpY2F0ZWQgd29ya3F1ZXVlLCBhcyBpdCBpcyBiZWluZyB1c2VkIGZvciBhIHNpbmdsZSB0YXNrLgorICoKKyAqIFJPQURNQVAKKyAqCisgKiBpMjQwMG11X3R4X3NldHVwKCkKKyAqIGkyNDAwbXVfdHhfcmVsZWFzZSgpCisgKgorICogaTI0MDBtdV9idXNfdHhfa2ljaygpCS0gQ2FsbGVkIGJ5IHRoZSB0eC5jIGNvZGUgd2hlbiB0aGVyZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIG5ldyBkYXRhIGluIHRoZSBGSUZPLgorICogaTI0MDBtdV90eGQoKQorICogICBpMjQwMG1fdHhfbXNnX2dldCgpCisgKiAgIGkyNDAwbV90eF9tc2dfc2VudCgpCisgKi8KKyNpbmNsdWRlICJpMjQwMG0tdXNiLmgiCisKKworI2RlZmluZSBEX1NVQk1PRFVMRSB0eAorI2luY2x1ZGUgInVzYi1kZWJ1Zy1sZXZlbHMuaCIKKworCisvKgorICogR2V0IHRoZSBuZXh0IFRYIG1lc3NhZ2UgaW4gdGhlIFRYIEZJRk8gYW5kIHNlbmQgaXQgdG8gdGhlIGRldmljZQorICoKKyAqIE5vdGUgdGhhdCBhbnkgaXRlcmF0aW9uIGNvbnN1bWVzIGEgbWVzc2FnZSB0byBiZSBzZW50LCBubyBtYXR0ZXIgaWYKKyAqIGl0IHN1Y2NlZWRzIG9yIGZhaWxzICh3ZSBoYXZlIG5vIHJlYWwgd2F5IHRvIHJldHJ5IG9yIGNvbXBsYWluKS4KKyAqCisgKiBSZXR1cm46IDAgaWYgb2ssIDwgMCBlcnJubyBjb2RlIG9uIGhhcmQgZXJyb3IuCisgKi8KK3N0YXRpYworaW50IGkyNDAwbXVfdHgoc3RydWN0IGkyNDAwbXUgKmkyNDAwbXUsIHN0cnVjdCBpMjQwMG1fbXNnX2hkciAqdHhfbXNnLAorCSAgICAgICBzaXplX3QgdHhfbXNnX3NpemUpCit7CisJaW50IHJlc3VsdCA9IDA7CisJc3RydWN0IGkyNDAwbSAqaTI0MDBtID0gJmkyNDAwbXUtPmkyNDAwbTsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmaTI0MDBtdS0+dXNiX2lmYWNlLT5kZXY7CisJaW50IHVzYl9waXBlLCBzZW50X3NpemUsIGRvX2F1dG9wbTsKKwlzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVwZDsKKworCWRfZm5zdGFydCg0LCBkZXYsICIoaTI0MDBtdSAlcClcbiIsIGkyNDAwbXUpOworCWRvX2F1dG9wbSA9IGF0b21pY19yZWFkKCZpMjQwMG11LT5kb19hdXRvcG0pOworCXJlc3VsdCA9IGRvX2F1dG9wbSA/CisJCXVzYl9hdXRvcG1fZ2V0X2ludGVyZmFjZShpMjQwMG11LT51c2JfaWZhY2UpIDogMDsKKwlpZiAocmVzdWx0IDwgMCkgeworCQlkZXZfZXJyKGRldiwgIlRYOiBjYW4ndCBnZXQgYXV0b3BtOiAlZFxuIiwgcmVzdWx0KTsKKwkJZG9fYXV0b3BtID0gMDsKKwl9CisJZXBkID0gdXNiX2dldF9lcGQoaTI0MDBtdS0+dXNiX2lmYWNlLCBJMjQwME1VX0VQX0JVTEtfT1VUKTsKKwl1c2JfcGlwZSA9IHVzYl9zbmRidWxrcGlwZShpMjQwMG11LT51c2JfZGV2LCBlcGQtPmJFbmRwb2ludEFkZHJlc3MpOworcmV0cnk6CisJcmVzdWx0ID0gdXNiX2J1bGtfbXNnKGkyNDAwbXUtPnVzYl9kZXYsIHVzYl9waXBlLAorCQkJICAgICAgdHhfbXNnLCB0eF9tc2dfc2l6ZSwgJnNlbnRfc2l6ZSwgSFopOworCXVzYl9tYXJrX2xhc3RfYnVzeShpMjQwMG11LT51c2JfZGV2KTsKKwlzd2l0Y2ggKHJlc3VsdCkgeworCWNhc2UgMDoKKwkJaWYgKHNlbnRfc2l6ZSAhPSB0eF9tc2dfc2l6ZSkgewkvKiBUb28gc2hvcnQ/IGRyb3AgaXQgKi8KKwkJCWRldl9lcnIoZGV2LCAiVFg6IHNob3J0IHdyaXRlICglZCBCIHZzICV6dSAiCisJCQkJImV4cGVjdGVkKVxuIiwgc2VudF9zaXplLCB0eF9tc2dfc2l6ZSk7CisJCQlyZXN1bHQgPSAtRUlPOworCQl9CisJCWJyZWFrOworCWNhc2UgLUVJTlZBTDoJCQkvKiB3aGlsZSByZW1vdmluZyBkcml2ZXIgKi8KKwljYXNlIC1FTk9ERVY6CQkJLyogZGV2IGRpc2Nvbm5lY3QgLi4uICovCisJY2FzZSAtRU5PRU5UOgkJCS8qIGp1c3QgaWdub3JlIGl0ICovCisJY2FzZSAtRVNIVVRET1dOOgkJLyogYW5kIGV4aXQgKi8KKwljYXNlIC1FQ09OTlJFU0VUOgorCQlyZXN1bHQgPSAtRVNIVVRET1dOOworCQlicmVhazsKKwlkZWZhdWx0OgkJCS8qIFNvbWUgZXJyb3I/ICovCisJCWlmIChlZGNfaW5jKCZpMjQwMG11LT51cmJfZWRjLAorCQkJICAgIEVEQ19NQVhfRVJST1JTLCBFRENfRVJST1JfVElNRUZSQU1FKSkgeworCQkJZGV2X2VycihkZXYsICJUWDogbWF4aW11bSBlcnJvcnMgaW4gVVJCICIKKwkJCQkiZXhjZWVkZWQ7IHJlc2V0dGluZyBkZXZpY2VcbiIpOworCQkJdXNiX3F1ZXVlX3Jlc2V0X2RldmljZShpMjQwMG11LT51c2JfaWZhY2UpOworCQl9IGVsc2UgeworCQkJZGV2X2VycihkZXYsICJUWDogY2Fubm90IHNlbmQgVVJCOyByZXRyeWluZy4gIgorCQkJCSJ0eF9tc2cgQCV6dSAlenUgQiBbJWQgc2VudF06ICVkXG4iLAorCQkJCSh2b2lkICopIHR4X21zZyAtIGkyNDAwbS0+dHhfYnVmLAorCQkJCXR4X21zZ19zaXplLCBzZW50X3NpemUsIHJlc3VsdCk7CisJCQlnb3RvIHJldHJ5OworCQl9CisJfQorCWlmIChkb19hdXRvcG0pCisJCXVzYl9hdXRvcG1fcHV0X2ludGVyZmFjZShpMjQwMG11LT51c2JfaWZhY2UpOworCWRfZm5lbmQoNCwgZGV2LCAiKGkyNDAwbXUgJXApID0gcmVzdWx0XG4iLCBpMjQwMG11KTsKKwlyZXR1cm4gcmVzdWx0OworfQorCisKKy8qCisgKiBHZXQgdGhlIG5leHQgVFggbWVzc2FnZSBpbiB0aGUgVFggRklGTyBhbmQgc2VuZCBpdCB0byB0aGUgZGV2aWNlCisgKgorICogTm90ZSB3ZSBleGl0IHRoZSBsb29wIGlmIGkyNDAwbXVfdHgoKSBmYWlsczsgdGhhdCBmdW50aW9uIG9ubHkKKyAqIGZhaWxzIG9uIGhhcmQgZXJyb3IgKGZhaWxpbmcgdG8gdHggYSBidWZmZXIgbm90IGJlaW5nIG9uZSBvZiB0aGVtLAorICogc2VlIGl0cyBkb2MpLgorICoKKyAqIFJldHVybjogMAorICovCitzdGF0aWMKK2ludCBpMjQwMG11X3R4ZCh2b2lkICpfaTI0MDBtdSkKK3sKKwlpbnQgcmVzdWx0ID0gMDsKKwlzdHJ1Y3QgaTI0MDBtdSAqaTI0MDBtdSA9IF9pMjQwMG11OworCXN0cnVjdCBpMjQwMG0gKmkyNDAwbSA9ICZpMjQwMG11LT5pMjQwMG07CisJc3RydWN0IGRldmljZSAqZGV2ID0gJmkyNDAwbXUtPnVzYl9pZmFjZS0+ZGV2OworCXN0cnVjdCBpMjQwMG1fbXNnX2hkciAqdHhfbXNnOworCXNpemVfdCB0eF9tc2dfc2l6ZTsKKworCWRfZm5zdGFydCg0LCBkZXYsICIoaTI0MDBtdSAlcClcbiIsIGkyNDAwbXUpOworCisJd2hpbGUgKDEpIHsKKwkJZF9wcmludGYoMiwgZGV2LCAiVFg6IHdhaXRpbmcgZm9yIG1lc3NhZ2VzXG4iKTsKKwkJdHhfbXNnID0gTlVMTDsKKwkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKAorCQkJaTI0MDBtdS0+dHhfd3EsCisJCQkoa3RocmVhZF9zaG91bGRfc3RvcCgpCS8qIGNoZWNrIHRoaXMgZmlyc3QhICovCisJCQkgfHwgKHR4X21zZyA9IGkyNDAwbV90eF9tc2dfZ2V0KGkyNDAwbSwgJnR4X21zZ19zaXplKSkpCisJCQkpOworCQlpZiAoa3RocmVhZF9zaG91bGRfc3RvcCgpKQorCQkJYnJlYWs7CisJCVdBUk5fT04odHhfbXNnID09IE5VTEwpOwkvKiBzaG91bGQgbm90IGhhcHBlbi4uLiovCisJCWRfcHJpbnRmKDIsIGRldiwgIlRYOiBzdWJtaXR0aW5nICV6dSBieXRlc1xuIiwgdHhfbXNnX3NpemUpOworCQlkX2R1bXAoNSwgZGV2LCB0eF9tc2csIHR4X21zZ19zaXplKTsKKwkJLyogWWVhaCwgd2UgaWdub3JlIGVycm9ycyAuLi4gbm90IG11Y2ggd2UgY2FuIGRvICovCisJCWkyNDAwbXVfdHgoaTI0MDBtdSwgdHhfbXNnLCB0eF9tc2dfc2l6ZSk7CisJCWkyNDAwbV90eF9tc2dfc2VudChpMjQwMG0pOwkvKiBhY2sgaXQsIGFkdmFuY2UgdGhlIEZJRk8gKi8KKwkJaWYgKHJlc3VsdCA8IDApCisJCQlicmVhazsKKwl9CisJZF9mbmVuZCg0LCBkZXYsICIoaTI0MDBtdSAlcCkgPSAlZFxuIiwgaTI0MDBtdSwgcmVzdWx0KTsKKwlyZXR1cm4gcmVzdWx0OworfQorCisKKy8qCisgKiBpMjQwMG0gVFggZW5naW5lIG5vdGlmaWVzIHVzIHRoYXQgdGhlcmUgaXMgZGF0YSBpbiB0aGUgRklGTyByZWFkeQorICogZm9yIFRYCisgKgorICogSWYgdGhlcmUgaXMgYSBVUkIgaW4gZmxpZ2h0LCBkb24ndCBkbyBhbnl0aGluZzsgd2hlbiBpdCBmaW5pc2hlcywKKyAqIGl0IHdpbGwgc2VlIHRoZXJlIGlzIGRhdGEgaW4gdGhlIEZJRk8gYW5kIHNlbmQgaXQuIEVsc2UsIGp1c3QKKyAqIHN1Ym1pdCBhIHdyaXRlLgorICovCit2b2lkIGkyNDAwbXVfYnVzX3R4X2tpY2soc3RydWN0IGkyNDAwbSAqaTI0MDBtKQoreworCXN0cnVjdCBpMjQwMG11ICppMjQwMG11ID0gY29udGFpbmVyX29mKGkyNDAwbSwgc3RydWN0IGkyNDAwbXUsIGkyNDAwbSk7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJmkyNDAwbXUtPnVzYl9pZmFjZS0+ZGV2OworCisJZF9mbnN0YXJ0KDMsIGRldiwgIihpMjQwMG0gJXApID0gdm9pZFxuIiwgaTI0MDBtKTsKKwl3YWtlX3VwX2FsbCgmaTI0MDBtdS0+dHhfd3EpOworCWRfZm5lbmQoMywgZGV2LCAiKGkyNDAwbSAlcCkgPSB2b2lkXG4iLCBpMjQwMG0pOworfQorCisKK2ludCBpMjQwMG11X3R4X3NldHVwKHN0cnVjdCBpMjQwMG11ICppMjQwMG11KQoreworCWludCByZXN1bHQgPSAwOworCXN0cnVjdCBpMjQwMG0gKmkyNDAwbSA9ICZpMjQwMG11LT5pMjQwMG07CisJc3RydWN0IGRldmljZSAqZGV2ID0gJmkyNDAwbXUtPnVzYl9pZmFjZS0+ZGV2OworCXN0cnVjdCB3aW1heF9kZXYgKndpbWF4X2RldiA9ICZpMjQwMG0tPndpbWF4X2RldjsKKworCWkyNDAwbXUtPnR4X2t0aHJlYWQgPSBrdGhyZWFkX3J1bihpMjQwMG11X3R4ZCwgaTI0MDBtdSwgIiVzLXR4IiwKKwkJCQkJICB3aW1heF9kZXYtPm5hbWUpOworCWlmIChJU19FUlIoaTI0MDBtdS0+dHhfa3RocmVhZCkpIHsKKwkJcmVzdWx0ID0gUFRSX0VSUihpMjQwMG11LT50eF9rdGhyZWFkKTsKKwkJZGV2X2VycihkZXYsICJUWDogY2Fubm90IHN0YXJ0IHRocmVhZDogJWRcbiIsIHJlc3VsdCk7CisJfQorCXJldHVybiByZXN1bHQ7Cit9CisKK3ZvaWQgaTI0MDBtdV90eF9yZWxlYXNlKHN0cnVjdCBpMjQwMG11ICppMjQwMG11KQoreworCWt0aHJlYWRfc3RvcChpMjQwMG11LT50eF9rdGhyZWFkKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpbWF4L2kyNDAwbS91c2IuYyBiL2RyaXZlcnMvbmV0L3dpbWF4L2kyNDAwbS91c2IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNmQ5MzQ2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2ltYXgvaTI0MDBtL3VzYi5jCkBAIC0wLDAgKzEsNTk3IEBACisvKgorICogSW50ZWwgV2lyZWxlc3MgV2lNQVggQ29ubmVjdGlvbiAyNDAwbQorICogTGludXggZHJpdmVyIG1vZGVsIGdsdWUgZm9yIFVTQiBkZXZpY2UsIHJlc2V0ICYgZncgdXBsb2FkCisgKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEludGVsIENvcnBvcmF0aW9uIDxsaW51eC13aW1heEBpbnRlbC5jb20+CisgKiBJbmFreSBQZXJlei1Hb256YWxleiA8aW5ha3kucGVyZXotZ29uemFsZXpAaW50ZWwuY29tPgorICogWWFuaXIgTHViZXRraW4gPHlhbmlyeC5sdWJldGtpbkBpbnRlbC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSwgVVNBLgorICoKKyAqCisgKiBTZWUgaTI0MDBtLXVzYi5oIGZvciBhIGdlbmVyYWwgZGVzY3JpcHRpb24gb2YgdGhpcyBkcml2ZXIuCisgKgorICogVGhpcyBmaWxlIGltcGxlbWVudHMgZHJpdmVyIG1vZGVsIGdsdWUsIGFuZCBob29rIHVwcyBmb3IgdGhlCisgKiBnZW5lcmljIGRyaXZlciB0byBpbXBsZW1lbnQgdGhlIGJ1cy1zcGVjaWZpYyBmdW5jdGlvbnMgKGRldmljZQorICogY29tbXVuaWNhdGlvbiBzZXR1cC90ZWFyIGRvd24sIGZpcm13YXJlIHVwbG9hZCBhbmQgcmVzZXR0aW5nKS4KKyAqCisgKiBST0FETUFQCisgKgorICogaTI0MDBtdV9wcm9iZSgpCisgKiAgIGFsbG9jX25ldGRldigpLi4uCisgKiAgICAgaTI0MDBtdV9uZXRkZXZfc2V0dXAoKQorICogICAgICAgaTI0MDBtdV9pbml0KCkKKyAqICAgICAgIGkyNDAwbV9uZXRkZXZfc2V0dXAoKQorICogICBpMjQwMG1fc2V0dXAoKS4uLgorICoKKyAqIGkyNDAwbXVfZGlzY29ubmVjdAorICogICBpMjQwMG1fcmVsZWFzZSgpCisgKiAgIGZyZWVfbmV0ZGV2KCkKKyAqCisgKiBpMjQwMG11X3N1c3BlbmQoKQorICogICBpMjQwMG1fY21kX2VudGVyX3Bvd2Vyc2F2ZSgpCisgKiAgIGkyNDAwbXVfbm90aWZpY2F0aW9uX3JlbGVhc2UoKQorICoKKyAqIGkyNDAwbXVfcmVzdW1lKCkKKyAqICAgaTI0MDBtdV9ub3RpZmljYXRpb25fc2V0dXAoKQorICoKKyAqIGkyNDAwbXVfYnVzX2Rldl9zdGFydCgpICAgICAgICBDYWxsZWQgYnkgaTI0MDBtX2Rldl9zdGFydCgpIFt3aG8gaXMKKyAqICAgaTI0MDBtdV90eF9zZXR1cCgpICAgICAgICAgICBjYWxsZWQgYnkgaTI0MDBtX3NldHVwKCldCisgKiAgIGkyNDAwbXVfcnhfc2V0dXAoKQorICogICBpMjQwMG11X25vdGlmaWNhdGlvbl9zZXR1cCgpCisgKgorICogaTI0MDBtdV9idXNfZGV2X3N0b3AoKSAgICAgICAgIENhbGxlZCBieSBpMjQwMG1fZGV2X3N0b3AoKSBbd2hvIGlzCisgKiAgIGkyNDAwbXVfbm90aWZpY2F0aW9uX3JlbGVhc2UoKSAgY2FsbGVkIGJ5IGkyNDAwbV9yZWxlYXNlKCldCisgKiAgIGkyNDAwbXVfcnhfcmVsZWFzZSgpCisgKiAgIGkyNDAwbXVfdHhfcmVsZWFzZSgpCisgKgorICogaTI0MDBtdV9idXNfcmVzZXQoKSAgICAgICAgICAgIENhbGxlZCBieSBpMjQwMG0tPmJ1c19yZXNldAorICogICBfX2kyNDAwbXVfcmVzZXQoKQorICogICAgIF9faTI0MDBtdV9zZW5kX2JhcmtlcigpCisgKiAgIHVzYl9yZXNldF9kZXZpY2UoKQorICovCisjaW5jbHVkZSAiaTI0MDBtLXVzYi5oIgorI2luY2x1ZGUgPGxpbnV4L3dpbWF4L2kyNDAwbS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KKworCisjZGVmaW5lIERfU1VCTU9EVUxFIHVzYgorI2luY2x1ZGUgInVzYi1kZWJ1Zy1sZXZlbHMuaCIKKworCisvKiBPdXIgZmlybXdhcmUgZmlsZSBuYW1lICovCisjZGVmaW5lIEkyNDAwTVVfRldfRklMRV9OQU1FICJpMjQwMG0tZnctdXNiLSIgSTI0MDBNX0ZXX1ZFUlNJT04gIi5zYmNmIgorCitzdGF0aWMKK2ludCBpMjQwMG11X2J1c19kZXZfc3RhcnQoc3RydWN0IGkyNDAwbSAqaTI0MDBtKQoreworCWludCByZXN1bHQ7CisJc3RydWN0IGkyNDAwbXUgKmkyNDAwbXUgPSBjb250YWluZXJfb2YoaTI0MDBtLCBzdHJ1Y3QgaTI0MDBtdSwgaTI0MDBtKTsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmaTI0MDBtdS0+dXNiX2lmYWNlLT5kZXY7CisKKwlkX2Zuc3RhcnQoMywgZGV2LCAiKGkyNDAwbSAlcClcbiIsIGkyNDAwbSk7CisJcmVzdWx0ID0gaTI0MDBtdV90eF9zZXR1cChpMjQwMG11KTsKKwlpZiAocmVzdWx0IDwgMCkKKwkJZ290byBlcnJvcl91c2JfdHhfc2V0dXA7CisJcmVzdWx0ID0gaTI0MDBtdV9yeF9zZXR1cChpMjQwMG11KTsKKwlpZiAocmVzdWx0IDwgMCkKKwkJZ290byBlcnJvcl91c2Jfcnhfc2V0dXA7CisJcmVzdWx0ID0gaTI0MDBtdV9ub3RpZmljYXRpb25fc2V0dXAoaTI0MDBtdSk7CisJaWYgKHJlc3VsdCA8IDApCisJCWdvdG8gZXJyb3Jfbm90aWZfc2V0dXA7CisJZF9mbmVuZCgzLCBkZXYsICIoaTI0MDBtICVwKSA9ICVkXG4iLCBpMjQwMG0sIHJlc3VsdCk7CisJcmV0dXJuIHJlc3VsdDsKKworZXJyb3Jfbm90aWZfc2V0dXA6CisJaTI0MDBtdV9yeF9yZWxlYXNlKGkyNDAwbXUpOworZXJyb3JfdXNiX3J4X3NldHVwOgorCWkyNDAwbXVfdHhfcmVsZWFzZShpMjQwMG11KTsKK2Vycm9yX3VzYl90eF9zZXR1cDoKKwlkX2ZuZW5kKDMsIGRldiwgIihpMjQwMG0gJXApID0gdm9pZFxuIiwgaTI0MDBtKTsKKwlyZXR1cm4gcmVzdWx0OworfQorCisKK3N0YXRpYwordm9pZCBpMjQwMG11X2J1c19kZXZfc3RvcChzdHJ1Y3QgaTI0MDBtICppMjQwMG0pCit7CisJc3RydWN0IGkyNDAwbXUgKmkyNDAwbXUgPSBjb250YWluZXJfb2YoaTI0MDBtLCBzdHJ1Y3QgaTI0MDBtdSwgaTI0MDBtKTsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmaTI0MDBtdS0+dXNiX2lmYWNlLT5kZXY7CisKKwlkX2Zuc3RhcnQoMywgZGV2LCAiKGkyNDAwbSAlcClcbiIsIGkyNDAwbSk7CisJaTI0MDBtdV9ub3RpZmljYXRpb25fcmVsZWFzZShpMjQwMG11KTsKKwlpMjQwMG11X3J4X3JlbGVhc2UoaTI0MDBtdSk7CisJaTI0MDBtdV90eF9yZWxlYXNlKGkyNDAwbXUpOworCWRfZm5lbmQoMywgZGV2LCAiKGkyNDAwbSAlcCkgPSB2b2lkXG4iLCBpMjQwMG0pOworfQorCisKKy8qCisgKiBTZW5kcyBhIGJhcmtlciBidWZmZXIgdG8gdGhlIGRldmljZQorICoKKyAqIFRoaXMgaGVscGVyIHdpbGwgYWxsb2NhdGUgYSBrbWFsbG9jZWQgYnVmZmVyIGFuZCB1c2UgaXQgdG8gdHJhbnNtaXQKKyAqICh0aGVuIGZyZWUgaXQpLiBSZWFzb24gZm9yIHRoaXMgaXMgdGhhdCBvdGhlciBhcmNoZXMgY2Fubm90IHVzZQorICogc3RhY2svdm1hbGxvYy90ZXh0IGFyZWFzIGZvciBETUEgdHJhbnNmZXJzLgorICoKKyAqIEVycm9yIHJlY292ZXJ5IGhlcmUgaXMgc2ltcGxlcjogYW55dGhpbmcgaXMgY29uc2lkZXJlZCBhIGhhcmQgZXJyb3IKKyAqIGFuZCB3aWxsIG1vdmUgdGhlIHJlc2V0IGNvZGUgdG8gdXNlIGEgbGFzdC1yZXNvcnQgYnVzLWJhc2VkIHJlc2V0LgorICovCitzdGF0aWMKK2ludCBfX2kyNDAwbXVfc2VuZF9iYXJrZXIoc3RydWN0IGkyNDAwbXUgKmkyNDAwbXUsCisJCQkgIGNvbnN0IF9fbGUzMiAqYmFya2VyLAorCQkJICBzaXplX3QgYmFya2VyX3NpemUsCisJCQkgIHVuc2lnbmVkIGVuZHBvaW50KQoreworCXN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZXBkID0gTlVMTDsKKwlpbnQgcGlwZSwgYWN0dWFsX2xlbiwgcmV0OworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZpMjQwMG11LT51c2JfaWZhY2UtPmRldjsKKwl2b2lkICpidWZmZXI7CisJaW50IGRvX2F1dG9wbSA9IDE7CisKKwlyZXQgPSB1c2JfYXV0b3BtX2dldF9pbnRlcmZhY2UoaTI0MDBtdS0+dXNiX2lmYWNlKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKGRldiwgIlJFU0VUOiBjYW4ndCBnZXQgYXV0b3BtOiAlZFxuIiwgcmV0KTsKKwkJZG9fYXV0b3BtID0gMDsKKwl9CisJcmV0ID0gLUVOT01FTTsKKwlidWZmZXIgPSBrbWFsbG9jKGJhcmtlcl9zaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAoYnVmZmVyID09IE5VTEwpCisJCWdvdG8gZXJyb3Jfa3phbGxvYzsKKwllcGQgPSB1c2JfZ2V0X2VwZChpMjQwMG11LT51c2JfaWZhY2UsIGVuZHBvaW50KTsKKwlwaXBlID0gdXNiX3NuZGJ1bGtwaXBlKGkyNDAwbXUtPnVzYl9kZXYsIGVwZC0+YkVuZHBvaW50QWRkcmVzcyk7CisJbWVtY3B5KGJ1ZmZlciwgYmFya2VyLCBiYXJrZXJfc2l6ZSk7CisJcmV0ID0gdXNiX2J1bGtfbXNnKGkyNDAwbXUtPnVzYl9kZXYsIHBpcGUsIGJ1ZmZlciwgYmFya2VyX3NpemUsCisJCQkgICAmYWN0dWFsX2xlbiwgSFopOworCWlmIChyZXQgPCAwKSB7CisJCWlmIChyZXQgIT0gLUVJTlZBTCkKKwkJCWRldl9lcnIoZGV2LCAiRTogYmFya2VyIGVycm9yOiAlZFxuIiwgcmV0KTsKKwl9IGVsc2UgaWYgKGFjdHVhbF9sZW4gIT0gYmFya2VyX3NpemUpIHsKKwkJZGV2X2VycihkZXYsICJFOiBvbmx5ICVkIGJ5dGVzIHRyYW5zbWl0dGVkXG4iLCBhY3R1YWxfbGVuKTsKKwkJcmV0ID0gLUVJTzsKKwl9CisJa2ZyZWUoYnVmZmVyKTsKK2Vycm9yX2t6YWxsb2M6CisJaWYgKGRvX2F1dG9wbSkKKwkJdXNiX2F1dG9wbV9wdXRfaW50ZXJmYWNlKGkyNDAwbXUtPnVzYl9pZmFjZSk7CisJcmV0dXJuIHJldDsKK30KKworCisvKgorICogUmVzZXQgYSBkZXZpY2UgYXQgZGlmZmVyZW50IGxldmVscyAod2FybSwgY29sZCBvciBidXMpCisgKgorICogQGkyNDAwbTogZGV2aWNlIGRlc2NyaXB0b3IKKyAqIEByZXNldF90eXBlOiBzb2Z0LCB3YXJtIG9yIGJ1cyByZXNldCAoSTI0MDBNX1JUX1dBUk0vU09GVC9CVVMpCisgKgorICogV2FybSBhbmQgY29sZCByZXNldHMgZ2V0IGEgVVNCIHJlc2V0IGlmIHRoZXkgZmFpbC4KKyAqCisgKiBXYXJtIHJlc2V0OgorICoKKyAqIFRoZSBkZXZpY2Ugd2lsbCBiZSBmdWxseSByZXNldCBpbnRlcm5hbGx5LCBidXQgd29uJ3QgYmUKKyAqIGRpc2Nvbm5lY3RlZCBmcm9tIHRoZSBVU0IgYnVzIChzbyBubyByZWVudW1lcmF0aW9uIHdpbGwKKyAqIGhhcHBlbikuIEZpcm13YXJlIHVwbG9hZCB3aWxsIGJlIG5lY2Nlc3NhcnkuCisgKgorICogVGhlIGRldmljZSB3aWxsIHNlbmQgYSByZWJvb3QgYmFya2VyIGluIHRoZSBub3RpZmljYXRpb24gZW5kcG9pbnQKKyAqIHRoYXQgd2lsbCB0cmlnZ2VyIHRoZSBkcml2ZXIgdG8gcmVpbml0aWFsaXplIHRoZSBzdGF0ZQorICogYXV0b21hdGljYWxseSBmcm9tIG5vdGlmLmM6aTI0MDBtX25vdGlmaWNhdGlvbl9ncm9rKCkgaW50bworICogaTI0MDBtX2Rldl9ib290c3RyYXBfZGVsYXllZCgpLgorICoKKyAqIENvbGQgYW5kIGJ1cyAoVVNCKSByZXNldDoKKyAqCisgKiBUaGUgZGV2aWNlIHdpbGwgYmUgZnVsbHkgcmVzZXQgaW50ZXJuYWxseSwgZGlzY29ubmVjdGVkIGZyb20gdGhlCisgKiBVU0IgYnVzIGFuIGEgcmVlbnVtZXJhdGlvbiB3aWxsIGhhcHBlbi4gRmlybXdhcmUgdXBsb2FkIHdpbGwgYmUKKyAqIG5lY2Nlc3NhcnkuIFRodXMsIHdlIGRvbid0IGRvIGFueSBsb2NraW5nIG9yIHN0cnVjdAorICogcmVpbml0aWFsaXphdGlvbiwgYXMgd2UgYXJlIGdvaW5nIHRvIGJlIGZ1bGx5IGRpc2Nvbm5lY3RlZCBhbmQKKyAqIHJlZW51bWVyYXRlZC4KKyAqCisgKiBOb3RlIHdlIG5lZWQgdG8gcmV0dXJuIC1FTk9ERVYgaWYgYSB3YXJtIHJlc2V0IHdhcyByZXF1ZXN0ZWQgYW5kIHdlCisgKiBoYWQgdG8gcmVzb3J0IHRvIGEgYnVzIHJlc2V0LiBTZWUgaTI0MDBtX29wX3Jlc2V0KCksIHdpbWF4X3Jlc2V0KCkKKyAqIGFuZCB3aW1heF9kZXYtPm9wX3Jlc2V0LgorICoKKyAqIFdBUk5JTkc6IG5vIGRyaXZlciBzdGF0ZSBzYXZlZC9maXhlZAorICovCitzdGF0aWMKK2ludCBpMjQwMG11X2J1c19yZXNldChzdHJ1Y3QgaTI0MDBtICppMjQwMG0sIGVudW0gaTI0MDBtX3Jlc2V0X3R5cGUgcnQpCit7CisJaW50IHJlc3VsdDsKKwlzdHJ1Y3QgaTI0MDBtdSAqaTI0MDBtdSA9CisJCWNvbnRhaW5lcl9vZihpMjQwMG0sIHN0cnVjdCBpMjQwMG11LCBpMjQwMG0pOworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGkyNDAwbV9kZXYoaTI0MDBtKTsKKwlzdGF0aWMgY29uc3QgX19sZTMyIGkyNDAwbV9XQVJNX0JPT1RfQkFSS0VSWzRdID0geworCQlfX2NvbnN0YW50X2NwdV90b19sZTMyKEkyNDAwTV9XQVJNX1JFU0VUX0JBUktFUiksCisJCV9fY29uc3RhbnRfY3B1X3RvX2xlMzIoSTI0MDBNX1dBUk1fUkVTRVRfQkFSS0VSKSwKKwkJX19jb25zdGFudF9jcHVfdG9fbGUzMihJMjQwME1fV0FSTV9SRVNFVF9CQVJLRVIpLAorCQlfX2NvbnN0YW50X2NwdV90b19sZTMyKEkyNDAwTV9XQVJNX1JFU0VUX0JBUktFUiksCisJfTsKKwlzdGF0aWMgY29uc3QgX19sZTMyIGkyNDAwbV9DT0xEX0JPT1RfQkFSS0VSWzRdID0geworCQlfX2NvbnN0YW50X2NwdV90b19sZTMyKEkyNDAwTV9DT0xEX1JFU0VUX0JBUktFUiksCisJCV9fY29uc3RhbnRfY3B1X3RvX2xlMzIoSTI0MDBNX0NPTERfUkVTRVRfQkFSS0VSKSwKKwkJX19jb25zdGFudF9jcHVfdG9fbGUzMihJMjQwME1fQ09MRF9SRVNFVF9CQVJLRVIpLAorCQlfX2NvbnN0YW50X2NwdV90b19sZTMyKEkyNDAwTV9DT0xEX1JFU0VUX0JBUktFUiksCisJfTsKKworCWRfZm5zdGFydCgzLCBkZXYsICIoaTI0MDBtICVwIHJ0ICV1KVxuIiwgaTI0MDBtLCBydCk7CisJaWYgKHJ0ID09IEkyNDAwTV9SVF9XQVJNKQorCQlyZXN1bHQgPSBfX2kyNDAwbXVfc2VuZF9iYXJrZXIoaTI0MDBtdSwgaTI0MDBtX1dBUk1fQk9PVF9CQVJLRVIsCisJCQkJCSAgICAgICBzaXplb2YoaTI0MDBtX1dBUk1fQk9PVF9CQVJLRVIpLAorCQkJCQkgICAgICAgSTI0MDBNVV9FUF9CVUxLX09VVCk7CisJZWxzZSBpZiAocnQgPT0gSTI0MDBNX1JUX0NPTEQpCisJCXJlc3VsdCA9IF9faTI0MDBtdV9zZW5kX2JhcmtlcihpMjQwMG11LCBpMjQwMG1fQ09MRF9CT09UX0JBUktFUiwKKwkJCQkJICAgICAgIHNpemVvZihpMjQwMG1fQ09MRF9CT09UX0JBUktFUiksCisJCQkJCSAgICAgICBJMjQwME1VX0VQX1JFU0VUX0NPTEQpOworCWVsc2UgaWYgKHJ0ID09IEkyNDAwTV9SVF9CVVMpIHsKK2RvX2J1c19yZXNldDoKKwkJcmVzdWx0ID0gdXNiX3Jlc2V0X2RldmljZShpMjQwMG11LT51c2JfZGV2KTsKKwkJc3dpdGNoIChyZXN1bHQpIHsKKwkJY2FzZSAwOgorCQljYXNlIC1FSU5WQUw6CS8qIGRldmljZSBpcyBnb25lICovCisJCWNhc2UgLUVOT0RFVjoKKwkJY2FzZSAtRU5PRU5UOgorCQljYXNlIC1FU0hVVERPV046CisJCQlyZXN1bHQgPSBydCA9PSBJMjQwME1fUlRfV0FSTSA/IC1FTk9ERVYgOiAwOworCQkJYnJlYWs7CS8qIFdlIGFzc3VtZSB0aGUgZGV2aWNlIGlzIGRpc2Nvbm5lY3RlZCAqLworCQlkZWZhdWx0OgorCQkJZGV2X2VycihkZXYsICJVU0IgcmVzZXQgZmFpbGVkICglZCksIGdpdmluZyB1cCFcbiIsCisJCQkJcmVzdWx0KTsKKwkJfQorCX0gZWxzZQorCQlCVUcoKTsKKwlpZiAocmVzdWx0IDwgMAorCSAgICAmJiByZXN1bHQgIT0gLUVJTlZBTAkvKiBkZXZpY2UgaXMgZ29uZSAqLworCSAgICAmJiBydCAhPSBJMjQwME1fUlRfQlVTKSB7CisJCWRldl9lcnIoZGV2LCAiJXMgcmVzZXQgZmFpbGVkICglZCk7IHRyeWluZyBVU0IgcmVzZXRcbiIsCisJCQlydCA9PSBJMjQwME1fUlRfV0FSTSA/ICJ3YXJtIiA6ICJjb2xkIiwgcmVzdWx0KTsKKwkJcnQgPSBJMjQwME1fUlRfQlVTOworCQlnb3RvIGRvX2J1c19yZXNldDsKKwl9CisJZF9mbmVuZCgzLCBkZXYsICIoaTI0MDBtICVwIHJ0ICV1KSA9ICVkXG4iLCBpMjQwMG0sIHJ0LCByZXN1bHQpOworCXJldHVybiByZXN1bHQ7Cit9CisKKworc3RhdGljCit2b2lkIGkyNDAwbXVfbmV0ZGV2X3NldHVwKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2KQoreworCXN0cnVjdCBpMjQwMG0gKmkyNDAwbSA9IG5ldF9kZXZfdG9faTI0MDBtKG5ldF9kZXYpOworCXN0cnVjdCBpMjQwMG11ICppMjQwMG11ID0gY29udGFpbmVyX29mKGkyNDAwbSwgc3RydWN0IGkyNDAwbXUsIGkyNDAwbSk7CisJaTI0MDBtdV9pbml0KGkyNDAwbXUpOworCWkyNDAwbV9uZXRkZXZfc2V0dXAobmV0X2Rldik7Cit9CisKKworLyoKKyAqIERlYnVnIGxldmVscyBjb250cm9sOyBzZWUgZGVidWcuaAorICovCitzdHJ1Y3QgZF9sZXZlbCBEX0xFVkVMW10gPSB7CisJRF9TVUJNT0RVTEVfREVGSU5FKHVzYiksCisJRF9TVUJNT0RVTEVfREVGSU5FKGZ3KSwKKwlEX1NVQk1PRFVMRV9ERUZJTkUobm90aWYpLAorCURfU1VCTU9EVUxFX0RFRklORShyeCksCisJRF9TVUJNT0RVTEVfREVGSU5FKHR4KSwKK307CitzaXplX3QgRF9MRVZFTF9TSVpFID0gQVJSQVlfU0laRShEX0xFVkVMKTsKKworCisjZGVmaW5lIF9fZGVidWdmc19yZWdpc3RlcihwcmVmaXgsIG5hbWUsIHBhcmVudCkJCQlcCitkbyB7CQkJCQkJCQkJXAorCXJlc3VsdCA9IGRfbGV2ZWxfcmVnaXN0ZXJfZGVidWdmcyhwcmVmaXgsIG5hbWUsIHBhcmVudCk7CVwKKwlpZiAocmVzdWx0IDwgMCkJCQkJCQkJXAorCQlnb3RvIGVycm9yOwkJCQkJCVwKK30gd2hpbGUgKDApCisKKworc3RhdGljCitpbnQgaTI0MDBtdV9kZWJ1Z2ZzX2FkZChzdHJ1Y3QgaTI0MDBtdSAqaTI0MDBtdSkKK3sKKwlpbnQgcmVzdWx0OworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZpMjQwMG11LT51c2JfaWZhY2UtPmRldjsKKwlzdHJ1Y3QgZGVudHJ5ICpkZW50cnkgPSBpMjQwMG11LT5pMjQwMG0ud2ltYXhfZGV2LmRlYnVnZnNfZGVudHJ5OworCXN0cnVjdCBkZW50cnkgKmZkOworCisJZGVudHJ5ID0gZGVidWdmc19jcmVhdGVfZGlyKCJpMjQwMG0tdXNiIiwgZGVudHJ5KTsKKwlyZXN1bHQgPSBQVFJfRVJSKGRlbnRyeSk7CisJaWYgKElTX0VSUihkZW50cnkpKSB7CisJCWlmIChyZXN1bHQgPT0gLUVOT0RFVikKKwkJCXJlc3VsdCA9IDA7CS8qIE5vIGRlYnVnZnMgc3VwcG9ydCAqLworCQlnb3RvIGVycm9yOworCX0KKwlpMjQwMG11LT5kZWJ1Z2ZzX2RlbnRyeSA9IGRlbnRyeTsKKwlfX2RlYnVnZnNfcmVnaXN0ZXIoImRsXyIsIHVzYiwgZGVudHJ5KTsKKwlfX2RlYnVnZnNfcmVnaXN0ZXIoImRsXyIsIGZ3LCBkZW50cnkpOworCV9fZGVidWdmc19yZWdpc3RlcigiZGxfIiwgbm90aWYsIGRlbnRyeSk7CisJX19kZWJ1Z2ZzX3JlZ2lzdGVyKCJkbF8iLCByeCwgZGVudHJ5KTsKKwlfX2RlYnVnZnNfcmVnaXN0ZXIoImRsXyIsIHR4LCBkZW50cnkpOworCisJLyogRG9uJ3QgdG91Y2ggdGhlc2UgaWYgeW91IGRvbid0IGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nICovCisJZmQgPSBkZWJ1Z2ZzX2NyZWF0ZV91OCgicnhfc2l6ZV9hdXRvX3NocmluayIsIDA2MDAsIGRlbnRyeSwKKwkJCSAgICAgICAmaTI0MDBtdS0+cnhfc2l6ZV9hdXRvX3Nocmluayk7CisJcmVzdWx0ID0gUFRSX0VSUihmZCk7CisJaWYgKElTX0VSUihmZCkgJiYgcmVzdWx0ICE9IC1FTk9ERVYpIHsKKwkJZGV2X2VycihkZXYsICJDYW4ndCBjcmVhdGUgZGVidWdmcyBlbnRyeSAiCisJCQkicnhfc2l6ZV9hdXRvX3NocmluazogJWRcbiIsIHJlc3VsdCk7CisJCWdvdG8gZXJyb3I7CisJfQorCisJZmQgPSBkZWJ1Z2ZzX2NyZWF0ZV9zaXplX3QoInJ4X3NpemUiLCAwNjAwLCBkZW50cnksCisJCQkJICAgJmkyNDAwbXUtPnJ4X3NpemUpOworCXJlc3VsdCA9IFBUUl9FUlIoZmQpOworCWlmIChJU19FUlIoZmQpICYmIHJlc3VsdCAhPSAtRU5PREVWKSB7CisJCWRldl9lcnIoZGV2LCAiQ2FuJ3QgY3JlYXRlIGRlYnVnZnMgZW50cnkgIgorCQkJInJ4X3NpemU6ICVkXG4iLCByZXN1bHQpOworCQlnb3RvIGVycm9yOworCX0KKworCXJldHVybiAwOworCitlcnJvcjoKKwlkZWJ1Z2ZzX3JlbW92ZV9yZWN1cnNpdmUoaTI0MDBtdS0+ZGVidWdmc19kZW50cnkpOworCXJldHVybiByZXN1bHQ7Cit9CisKKworLyoKKyAqIFByb2JlIGEgaTI0MDBtIGludGVyZmFjZSBhbmQgcmVnaXN0ZXIgaXQKKyAqCisgKiBAaWZhY2U6ICAgVVNCIGludGVyZmFjZSB0byBsaW5rIHRvCisgKiBAaWQ6ICAgICAgVVNCIGNsYXNzL3N1YmNsYXNzL3Byb3RvY29sIGlkCisgKiBAcmV0dXJuczogMCBpZiBvaywgPCAwIGVycm5vIGNvZGUgb24gZXJyb3IuCisgKgorICogQWxsb2MgYSBuZXQgZGV2aWNlLCBpbml0aWFsaXplIHRoZSBidXMtc3BlY2lmaWMgZGV0YWlscyBhbmQgdGhlbgorICogY2FsbHMgdGhlIGJ1cy1nZW5lcmljIGluaXRpYWxpemF0aW9uIHJvdXRpbmUuIFRoYXQgd2lsbCByZWdpc3RlcgorICogdGhlIHdpbWF4IGFuZCBuZXRkZXYgZGV2aWNlcywgdXBsb2FkIHRoZSBmaXJtd2FyZSBbdXNpbmcKKyAqIF9idXNfYm1fKigpXSwgY2FsbCBfYnVzX2Rldl9zdGFydCgpIHRvIGZpbmFsaXplIHRoZSBzZXR1cCBvZiB0aGUKKyAqIGNvbW11bmljYXRpb24gd2l0aCB0aGUgZGV2aWNlIGFuZCB0aGVuIHdpbGwgc3RhcnQgdG8gdGFsayB0byBpdCB0bworICogZmlubmlzaCBzZXR0aW5nIGl0IHVwLgorICovCitzdGF0aWMKK2ludCBpMjQwMG11X3Byb2JlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppZmFjZSwKKwkJICBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpCit7CisJaW50IHJlc3VsdDsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldjsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmaWZhY2UtPmRldjsKKwlzdHJ1Y3QgaTI0MDBtICppMjQwMG07CisJc3RydWN0IGkyNDAwbXUgKmkyNDAwbXU7CisJc3RydWN0IHVzYl9kZXZpY2UgKnVzYl9kZXYgPSBpbnRlcmZhY2VfdG9fdXNiZGV2KGlmYWNlKTsKKworCWlmICh1c2JfZGV2LT5zcGVlZCAhPSBVU0JfU1BFRURfSElHSCkKKwkJZGV2X2VycihkZXYsICJkZXZpY2Ugbm90IGNvbm5lY3RlZCBhcyBoaWdoIHNwZWVkXG4iKTsKKworCS8qIEFsbG9jYXRlIGluc3RhbmNlIFtjYWxscyBpMjQwMG1fbmV0ZGV2X3NldHVwKCkgb24gaXRdLiAqLworCXJlc3VsdCA9IC1FTk9NRU07CisJbmV0X2RldiA9IGFsbG9jX25ldGRldihzaXplb2YoKmkyNDAwbXUpLCAid214JWQiLAorCQkJICAgICAgIGkyNDAwbXVfbmV0ZGV2X3NldHVwKTsKKwlpZiAobmV0X2RldiA9PSBOVUxMKSB7CisJCWRldl9lcnIoZGV2LCAibm8gbWVtb3J5IGZvciBuZXR3b3JrIGRldmljZSBpbnN0YW5jZVxuIik7CisJCWdvdG8gZXJyb3JfYWxsb2NfbmV0ZGV2OworCX0KKwlTRVRfTkVUREVWX0RFVihuZXRfZGV2LCBkZXYpOworCWkyNDAwbSA9IG5ldF9kZXZfdG9faTI0MDBtKG5ldF9kZXYpOworCWkyNDAwbXUgPSBjb250YWluZXJfb2YoaTI0MDBtLCBzdHJ1Y3QgaTI0MDBtdSwgaTI0MDBtKTsKKwlpMjQwMG0tPndpbWF4X2Rldi5uZXRfZGV2ID0gbmV0X2RldjsKKwlpMjQwMG11LT51c2JfZGV2ID0gdXNiX2dldF9kZXYodXNiX2Rldik7CisJaTI0MDBtdS0+dXNiX2lmYWNlID0gaWZhY2U7CisJdXNiX3NldF9pbnRmZGF0YShpZmFjZSwgaTI0MDBtdSk7CisKKwlpMjQwMG0tPmJ1c190eF9ibG9ja19zaXplID0gSTI0MDBNVV9CTEtfU0laRTsKKwlpMjQwMG0tPmJ1c19wbF9zaXplX21heCA9IEkyNDAwTVVfUExfU0laRV9NQVg7CisJaTI0MDBtLT5idXNfZGV2X3N0YXJ0ID0gaTI0MDBtdV9idXNfZGV2X3N0YXJ0OworCWkyNDAwbS0+YnVzX2Rldl9zdG9wID0gaTI0MDBtdV9idXNfZGV2X3N0b3A7CisJaTI0MDBtLT5idXNfdHhfa2ljayA9IGkyNDAwbXVfYnVzX3R4X2tpY2s7CisJaTI0MDBtLT5idXNfcmVzZXQgPSBpMjQwMG11X2J1c19yZXNldDsKKwlpMjQwMG0tPmJ1c19ibV9jbWRfc2VuZCA9IGkyNDAwbXVfYnVzX2JtX2NtZF9zZW5kOworCWkyNDAwbS0+YnVzX2JtX3dhaXRfZm9yX2FjayA9IGkyNDAwbXVfYnVzX2JtX3dhaXRfZm9yX2FjazsKKwlpMjQwMG0tPmJ1c19md19uYW1lID0gSTI0MDBNVV9GV19GSUxFX05BTUU7CisJaTI0MDBtLT5idXNfYm1fbWFjX2FkZHJfaW1wYWlyZWQgPSAwOworCisjaWZkZWYgQ09ORklHX1BNCisJaWZhY2UtPm5lZWRzX3JlbW90ZV93YWtldXAgPSAxOwkJLyogYXV0b3N1c3BlbmQgKDE1cyBkZWxheSkgKi8KKwlkZXZpY2VfaW5pdF93YWtldXAoZGV2LCAxKTsKKwl1c2JfYXV0b3BtX2VuYWJsZShpMjQwMG11LT51c2JfaWZhY2UpOworCXVzYl9kZXYtPmF1dG9zdXNwZW5kX2RlbGF5ID0gMTUgKiBIWjsKKwl1c2JfZGV2LT5hdXRvc3VzcGVuZF9kaXNhYmxlZCA9IDA7CisjZW5kaWYKKworCXJlc3VsdCA9IGkyNDAwbV9zZXR1cChpMjQwMG0sIEkyNDAwTV9CUklfTUFDX1JFSU5JVCk7CisJaWYgKHJlc3VsdCA8IDApIHsKKwkJZGV2X2VycihkZXYsICJjYW5ub3Qgc2V0dXAgZGV2aWNlOiAlZFxuIiwgcmVzdWx0KTsKKwkJZ290byBlcnJvcl9zZXR1cDsKKwl9CisJcmVzdWx0ID0gaTI0MDBtdV9kZWJ1Z2ZzX2FkZChpMjQwMG11KTsKKwlpZiAocmVzdWx0IDwgMCkgeworCQlkZXZfZXJyKGRldiwgIkNhbid0IHJlZ2lzdGVyIGkyNDAwbXUncyBkZWJ1Z2ZzOiAlZFxuIiwgcmVzdWx0KTsKKwkJZ290byBlcnJvcl9kZWJ1Z2ZzX2FkZDsKKwl9CisJcmV0dXJuIDA7CisKK2Vycm9yX2RlYnVnZnNfYWRkOgorCWkyNDAwbV9yZWxlYXNlKGkyNDAwbSk7CitlcnJvcl9zZXR1cDoKKwl1c2Jfc2V0X2ludGZkYXRhKGlmYWNlLCBOVUxMKTsKKwl1c2JfcHV0X2RldihpMjQwMG11LT51c2JfZGV2KTsKKwlmcmVlX25ldGRldihuZXRfZGV2KTsKK2Vycm9yX2FsbG9jX25ldGRldjoKKwlyZXR1cm4gcmVzdWx0OworfQorCisKKy8qCisgKiBEaXNjb25lY3QgYSBpMjQwMG0gZnJvbSB0aGUgc3lzdGVtLgorICoKKyAqIGkyNDAwbV9zdG9wKCkgaGFzIGJlZW4gY2FsbGVkIGJlZm9yZSwgc28gYWwgdGhlIHJ4IGFuZCB0eCBjb250ZXh0cworICogaGF2ZSBiZWVuIHRha2VuIGRvd24gYWxyZWFkeS4gTWFrZSBzdXJlIHRoZSBxdWV1ZSBpcyBzdG9wcGVkLAorICogdW5yZWdpc3RlciBuZXRkZXYgYW5kIGkyNDAwbSwgZnJlZSBhbmQga2lsbC4KKyAqLworc3RhdGljCit2b2lkIGkyNDAwbXVfZGlzY29ubmVjdChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaWZhY2UpCit7CisJc3RydWN0IGkyNDAwbXUgKmkyNDAwbXUgPSB1c2JfZ2V0X2ludGZkYXRhKGlmYWNlKTsKKwlzdHJ1Y3QgaTI0MDBtICppMjQwMG0gPSAmaTI0MDBtdS0+aTI0MDBtOworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2ID0gaTI0MDBtLT53aW1heF9kZXYubmV0X2RldjsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmaWZhY2UtPmRldjsKKworCWRfZm5zdGFydCgzLCBkZXYsICIoaWZhY2UgJXAgaTI0MDBtICVwKVxuIiwgaWZhY2UsIGkyNDAwbSk7CisKKwlkZWJ1Z2ZzX3JlbW92ZV9yZWN1cnNpdmUoaTI0MDBtdS0+ZGVidWdmc19kZW50cnkpOworCWkyNDAwbV9yZWxlYXNlKGkyNDAwbSk7CisJdXNiX3NldF9pbnRmZGF0YShpZmFjZSwgTlVMTCk7CisJdXNiX3B1dF9kZXYoaTI0MDBtdS0+dXNiX2Rldik7CisJZnJlZV9uZXRkZXYobmV0X2Rldik7CisJZF9mbmVuZCgzLCBkZXYsICIoaWZhY2UgJXAgaTI0MDBtICVwKSA9IHZvaWRcbiIsIGlmYWNlLCBpMjQwMG0pOworfQorCisKKy8qCisgKiBHZXQgdGhlIGRldmljZSByZWFkeSBmb3IgVVNCIHBvcnQgb3Igc3lzdGVtIHN0YW5kYnkgYW5kIGhpYmVybmF0aW9uCisgKgorICogVVNCIHBvcnQgYW5kIHN5c3RlbSBzdGFuZGJ5IGFyZSBoYW5kbGVkIHRoZSBzYW1lLgorICoKKyAqIFdoZW4gdGhlIHN5c3RlbSBoaWJlcm5hdGVzLCB0aGUgVVNCIGRldmljZSBpcyBwb3dlcmVkIGRvd24gYW5kIHRoZW4KKyAqIHVwLCBzbyB3ZSBkb24ndCByZWFsbHkgaGF2ZSB0byBkbyBtdWNoIGhlcmUsIGFzIGl0IHdpbGwgYmUgc2VlbiBhcworICogYSByZWNvbm5lY3QuIFN0aWxsIGZvciBzaW1wbGljaXR5IHdlIGNvbnNpZGVyIHRoaXMgY2FzZSB0aGUgc2FtZSBhcworICogc3VzcGVuZCwgc28gdGhhdCB0aGUgZGV2aWNlIGhhcyBhIGNoYW5jZSB0byBkbyBub3RpZnkgdGhlIGJhc2UKKyAqIHN0YXRpb24gKGlmIGNvbm5lY3RlZCkuCisgKgorICogU28gYXQgdGhlIGVuZCwgdGhlIHRocmVlIGNhc2VzIHJlcXVpcmUgY29tbW9uIGhhbmRsaW5nLgorICoKKyAqIElmIGF0IHRoZSB0aW1lIG9mIHRoaXMgY2FsbCB0aGUgZGV2aWNlJ3MgZmlybXdhcmUgaXMgbm90IGxvYWRlZCwKKyAqIG5vdGhpbmcgaGFzIHRvIGJlIGRvbmUuCisgKgorICogSWYgdGhlIGZpcm13YXJlIGlzIGxvYWRlZCwgd2UgbmVlZCB0bzoKKyAqCisgKiAgLSB0ZWxsIHRoZSBkZXZpY2UgdG8gZ28gaW50byBob3N0IGludGVyZmFjZSBwb3dlciBzYXZlIG1vZGUsIHdhaXQKKyAqICAgIGZvciBpdCB0byBhY2sKKyAqCisgKiAgICBUaGlzIGlzIHF1aXRlIG1vcmUgaW50ZXJlc3RpbmcgdGhhbiBpdCBpczsgd2UgbmVlZCB0byBleGVjdXRlIGEKKyAqICAgIGNvbW1hbmQsIGJ1dCB0aGlzIHRpbWUsIHdlIGRvbid0IHdhbnQgdGhlIGNvZGUgaW4gdXNiLXt0eCxyeH0uYworICogICAgdG8gY2FsbCB0aGUgdXNiX2F1dG9wbV9nZXQvcHV0X2ludGVyZmFjZSgpIGJhcnJpZXJzIGFzIGl0J2QKKyAqICAgIGRlYWRsb2NrLCBzbyB3ZSBuZWVkIHRvIGRlY3JlbWVudCBpMjQwMG11LT5kb19hdXRvcG0sIHRoYXQgYWN0cworICogICAgYXMgYSBwb29yIG1hbidzIHNlbWFwaG9yZS4gVWdseSwgYnV0IGl0IHdvcmtzLgorICoKKyAqICAgIEFzIHdlbGwsIHRoZSBkZXZpY2UgbWlnaHQgcmVmdXNlIGdvaW5nIHRvIHNsZWVwIGZvciB3aGljaGV2ZXIKKyAqICAgIHJlYXNvbi4gSW4gdGhpcyBjYXNlIHdlIGp1c3QgZmFpbC4gRm9yIHN5c3RlbSBzdXNwZW5kL2hpYmVybmF0ZSwKKyAqICAgIHdlICpjYW4ndCogZmFpbC4gV2UgbG9vayBhdCB1c2JfZGV2LT5hdXRvX3BtIHRvIHNlZSBpZiB0aGUKKyAqICAgIHN1c3BlbmQgY2FsbCBjb21lcyBmcm9tIHRoZSBVU0Igc3RhY2sgb3IgZnJvbSB0aGUgc3lzdGVtIGFuZCBhY3QKKyAqICAgIGluIGNvbnNlcXVlbmNlLgorICoKKyAqICAtIHN0b3AgdGhlIG5vdGlmaWNhdGlvbiBlbmRwb2ludCBwb2xsaW5nCisgKi8KK3N0YXRpYworaW50IGkyNDAwbXVfc3VzcGVuZChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaWZhY2UsIHBtX21lc3NhZ2VfdCBwbV9tc2cpCit7CisJaW50IHJlc3VsdCA9IDA7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJmlmYWNlLT5kZXY7CisJc3RydWN0IGkyNDAwbXUgKmkyNDAwbXUgPSB1c2JfZ2V0X2ludGZkYXRhKGlmYWNlKTsKKyNpZmRlZiBDT05GSUdfUE0KKwlzdHJ1Y3QgdXNiX2RldmljZSAqdXNiX2RldiA9IGkyNDAwbXUtPnVzYl9kZXY7CisjZW5kaWYKKwlzdHJ1Y3QgaTI0MDBtICppMjQwMG0gPSAmaTI0MDBtdS0+aTI0MDBtOworCisJZF9mbnN0YXJ0KDMsIGRldiwgIihpZmFjZSAlcCBwbV9tc2cgJXUpXG4iLCBpZmFjZSwgcG1fbXNnLmV2ZW50KTsKKwlpZiAoaTI0MDBtLT51cGRvd24gPT0gMCkKKwkJZ290byBub19maXJtd2FyZTsKKwlkX3ByaW50ZigxLCBkZXYsICJmdyB1cCwgcmVxdWVzdGluZyBzdGFuZGJ5XG4iKTsKKwlhdG9taWNfZGVjKCZpMjQwMG11LT5kb19hdXRvcG0pOworCXJlc3VsdCA9IGkyNDAwbV9jbWRfZW50ZXJfcG93ZXJzYXZlKGkyNDAwbSk7CisJYXRvbWljX2luYygmaTI0MDBtdS0+ZG9fYXV0b3BtKTsKKyNpZmRlZiBDT05GSUdfUE0KKwlpZiAocmVzdWx0IDwgMCAmJiB1c2JfZGV2LT5hdXRvX3BtID09IDApIHsKKwkJLyogU3lzdGVtIHN1c3BlbmQsIGNhbid0IGZhaWwgKi8KKwkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gc3VzcGVuZCwgd2lsbCByZXNldCBvbiByZXN1bWVcbiIpOworCQlyZXN1bHQgPSAwOworCX0KKyNlbmRpZgorCWlmIChyZXN1bHQgPCAwKQorCQlnb3RvIGVycm9yX2VudGVyX3Bvd2Vyc2F2ZTsKKwlpMjQwMG11X25vdGlmaWNhdGlvbl9yZWxlYXNlKGkyNDAwbXUpOworCWRfcHJpbnRmKDEsIGRldiwgImZ3IHVwLCBnb3Qgc3RhbmRieVxuIik7CitlcnJvcl9lbnRlcl9wb3dlcnNhdmU6Citub19maXJtd2FyZToKKwlkX2ZuZW5kKDMsIGRldiwgIihpZmFjZSAlcCBwbV9tc2cgJXUpID0gJWRcbiIsCisJCWlmYWNlLCBwbV9tc2cuZXZlbnQsIHJlc3VsdCk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworCitzdGF0aWMKK2ludCBpMjQwMG11X3Jlc3VtZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaWZhY2UpCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJmlmYWNlLT5kZXY7CisJc3RydWN0IGkyNDAwbXUgKmkyNDAwbXUgPSB1c2JfZ2V0X2ludGZkYXRhKGlmYWNlKTsKKwlzdHJ1Y3QgaTI0MDBtICppMjQwMG0gPSAmaTI0MDBtdS0+aTI0MDBtOworCisJZF9mbnN0YXJ0KDMsIGRldiwgIihpZmFjZSAlcClcbiIsIGlmYWNlKTsKKwlpZiAoaTI0MDBtLT51cGRvd24gPT0gMCkgeworCQlkX3ByaW50ZigxLCBkZXYsICJmdyB3YXMgZG93biwgbm8gcmVzdW1lIG5lZWVkXG4iKTsKKwkJZ290byBvdXQ7CisJfQorCWRfcHJpbnRmKDEsIGRldiwgImZ3IHdhcyB1cCwgcmVzdW1pbmdcbiIpOworCWkyNDAwbXVfbm90aWZpY2F0aW9uX3NldHVwKGkyNDAwbXUpOworCS8qIFVTQiBoYXMgZmxvdyBjb250cm9sLCBzbyB3ZSBkb24ndCBuZWVkIHRvIGdpdmUgaXQgdGltZSB0bworCSAqIGNvbWUgYmFjazsgb3RoZXJ3aXNlLCB3ZSdkIHVzZSBzb21ldGhpbmcgbGlrZSBhIGdldC1zdGF0ZQorCSAqIGNvbW1hbmQuLi4gKi8KK291dDoKKwlkX2ZuZW5kKDMsIGRldiwgIihpZmFjZSAlcCkgPSAlZFxuIiwgaWZhY2UsIHJldCk7CisJcmV0dXJuIHJldDsKK30KKworCitzdGF0aWMKK3N0cnVjdCB1c2JfZGV2aWNlX2lkIGkyNDAwbXVfaWRfdGFibGVbXSA9IHsKKwl7IFVTQl9ERVZJQ0UoMHg4MDg2LCAweDAxODEpIH0sCisJeyBVU0JfREVWSUNFKDB4ODA4NiwgMHgxNDAzKSB9LAorCXsgVVNCX0RFVklDRSgweDgwODYsIDB4MTQwNSkgfSwKKwl7IFVTQl9ERVZJQ0UoMHg4MDg2LCAweDAxODApIH0sCisJeyBVU0JfREVWSUNFKDB4ODA4NiwgMHgwMTgyKSB9LAorCXsgVVNCX0RFVklDRSgweDgwODYsIDB4MTQwNikgfSwKKwl7IFVTQl9ERVZJQ0UoMHg4MDg2LCAweDE0MDMpIH0sCisJeyB9LAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUodXNiLCBpMjQwMG11X2lkX3RhYmxlKTsKKworCitzdGF0aWMKK3N0cnVjdCB1c2JfZHJpdmVyIGkyNDAwbXVfZHJpdmVyID0geworCS5uYW1lID0gS0JVSUxEX01PRE5BTUUsCisJLnN1c3BlbmQgPSBpMjQwMG11X3N1c3BlbmQsCisJLnJlc3VtZSA9IGkyNDAwbXVfcmVzdW1lLAorCS5wcm9iZSA9IGkyNDAwbXVfcHJvYmUsCisJLmRpc2Nvbm5lY3QgPSBpMjQwMG11X2Rpc2Nvbm5lY3QsCisJLmlkX3RhYmxlID0gaTI0MDBtdV9pZF90YWJsZSwKKwkuc3VwcG9ydHNfYXV0b3N1c3BlbmQgPSAxLAorfTsKKworc3RhdGljCitpbnQgX19pbml0IGkyNDAwbXVfZHJpdmVyX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gdXNiX3JlZ2lzdGVyKCZpMjQwMG11X2RyaXZlcik7Cit9Cittb2R1bGVfaW5pdChpMjQwMG11X2RyaXZlcl9pbml0KTsKKworCitzdGF0aWMKK3ZvaWQgX19leGl0IGkyNDAwbXVfZHJpdmVyX2V4aXQodm9pZCkKK3sKKwlmbHVzaF9zY2hlZHVsZWRfd29yaygpOwkvKiBmb3IgdGhlIHN0dWZmIHdlIHNjaGVkdWxlIGZyb20gc3lzZnMuYyAqLworCXVzYl9kZXJlZ2lzdGVyKCZpMjQwMG11X2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdChpMjQwMG11X2RyaXZlcl9leGl0KTsKKworTU9EVUxFX0FVVEhPUigiSW50ZWwgQ29ycG9yYXRpb24gPGxpbnV4LXdpbWF4QGludGVsLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiSW50ZWwgMjQwME0gV2lNQVggbmV0d29ya2luZyBmb3IgVVNCIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfRklSTVdBUkUoSTI0MDBNVV9GV19GSUxFX05BTUUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvS2NvbmZpZyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL0tjb25maWcKaW5kZXggZWE1NDNmYy4uZTRmOWY3NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvS2NvbmZpZworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9LY29uZmlnCkBAIC0xMTEsNyArMTExLDcgQEAKIAkgIGxldHMgeW91IGNob29zZSBkcml2ZXJzLgogCiBjb25maWcgUENNQ0lBX1JBWUNTCi0JdHJpc3RhdGUgIkF2aWF0b3IvUmF5dGhlb24gMi40TUh6IHdpcmVsZXNzIHN1cHBvcnQiCisJdHJpc3RhdGUgIkF2aWF0b3IvUmF5dGhlb24gMi40R0h6IHdpcmVsZXNzIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBQQ01DSUEgJiYgV0xBTl84MDIxMQogCXNlbGVjdCBXSVJFTEVTU19FWFQKIAktLS1oZWxwLS0tCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGg1ay9iYXNlLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGg1ay9iYXNlLmMKaW5kZXggNGFmMjYwNy4uOGVmODczNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoNWsvYmFzZS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aDVrL2Jhc2UuYwpAQCAtMjY0NCw3ICsyNjQ0LDcgQEAKIAkJaWYgKHNrYl9oZWFkcm9vbShza2IpIDwgcGFkc2l6ZSkgewogCQkJQVRINUtfRVJSKHNjLCAidHggaGRybGVuIG5vdCAlJTQ6ICVkIG5vdCBlbm91Z2giCiAJCQkJICAiIGhlYWRyb29tIHRvIHBhZCAlZFxuIiwgaGRybGVuLCBwYWRzaXplKTsKLQkJCXJldHVybiAtMTsKKwkJCXJldHVybiBORVRERVZfVFhfQlVTWTsKIAkJfQogCQlza2JfcHVzaChza2IsIHBhZHNpemUpOwogCQltZW1tb3ZlKHNrYi0+ZGF0YSwgc2tiLT5kYXRhK3BhZHNpemUsIGhkcmxlbik7CkBAIC0yNjU1LDcgKzI2NTUsNyBAQAogCQlBVEg1S19FUlIoc2MsICJubyBmdXJ0aGVyIHR4YnVmIGF2YWlsYWJsZSwgZHJvcHBpbmcgcGFja2V0XG4iKTsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2MtPnR4YnVmbG9jaywgZmxhZ3MpOwogCQlpZWVlODAyMTFfc3RvcF9xdWV1ZShodywgc2tiX2dldF9xdWV1ZV9tYXBwaW5nKHNrYikpOwotCQlyZXR1cm4gLTE7CisJCXJldHVybiBORVRERVZfVFhfQlVTWTsKIAl9CiAJYmYgPSBsaXN0X2ZpcnN0X2VudHJ5KCZzYy0+dHhidWYsIHN0cnVjdCBhdGg1a19idWYsIGxpc3QpOwogCWxpc3RfZGVsKCZiZi0+bGlzdCk7CkBAIC0yNjczLDEwICsyNjczLDEwIEBACiAJCXNjLT50eGJ1Zl9sZW4rKzsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2MtPnR4YnVmbG9jaywgZmxhZ3MpOwogCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOwotCQlyZXR1cm4gMDsKKwkJcmV0dXJuIE5FVERFVl9UWF9PSzsKIAl9CiAKLQlyZXR1cm4gMDsKKwlyZXR1cm4gTkVUREVWX1RYX09LOwogfQogCiBzdGF0aWMgaW50CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGg1ay9kbWEuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aDVrL2RtYS5jCmluZGV4IDdlMmIxYTYuLmI2NWI0ZmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aDVrL2RtYS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aDVrL2RtYS5jCkBAIC01OTQsNyArNTk0LDcgQEAKIAkJICogWFhYOiBCTUlTUyBpbnRlcnJ1cHRzIG1heSBvY2N1ciBhZnRlciBhc3NvY2lhdGlvbi4KIAkJICogSSBmb3VuZCB0aGlzIG9uIDUyMTAgY29kZSBidXQgaXQgbmVlZHMgdGVzdGluZy4gSWYgdGhpcyBpcwogCQkgKiB0cnVlIHdlIHNob3VsZCBkaXNhYmxlIHRoZW0gYmVmb3JlIGFzc29jIGFuZCByZS1lbmFibGUgdGhlbQotCQkgKiBhZnRlciBhIHN1Y2Nlc3NmdWxsIGFzc29jICsgc29tZSBqaWZmaWVzLgorCQkgKiBhZnRlciBhIHN1Y2Nlc3NmdWwgYXNzb2MgKyBzb21lIGppZmZpZXMuCiAJCQlpbnRlcnJ1cHRfbWFzayAmPSB+QVI1S19JTlRfQk1JU1M7CiAJCSAqLwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aDVrL3BjdS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoNWsvcGN1LmMKaW5kZXggMGNhYzA1Yy4uNzVlYjlmNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoNWsvcGN1LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoNWsvcGN1LmMKQEAgLTY1LDcgKzY1LDcgQEAKIAkJaWYgKGFoLT5haF92ZXJzaW9uID09IEFSNUtfQVI1MjEwKQogCQkJcGN1X3JlZyB8PSBBUjVLX1NUQV9JRDFfTk9fUFNQT0xMOwogCQllbHNlCi0JCQlBUjVLX1JFR19ESVNBQkxFX0JJVFMoYWgsIEFSNUtfQ0ZHLCBBUjVLX0NGR19BREhPQyk7CisJCQlBUjVLX1JFR19FTkFCTEVfQklUUyhhaCwgQVI1S19DRkcsIEFSNUtfQ0ZHX0lCU1MpOwogCQlicmVhazsKIAogCWNhc2UgTkw4MDIxMV9JRlRZUEVfQVA6CkBAIC03NSw3ICs3NSw3IEBACiAJCWlmIChhaC0+YWhfdmVyc2lvbiA9PSBBUjVLX0FSNTIxMCkKIAkJCXBjdV9yZWcgfD0gQVI1S19TVEFfSUQxX05PX1BTUE9MTDsKIAkJZWxzZQotCQkJQVI1S19SRUdfRU5BQkxFX0JJVFMoYWgsIEFSNUtfQ0ZHLCBBUjVLX0NGR19BREhPQyk7CisJCQlBUjVLX1JFR19ESVNBQkxFX0JJVFMoYWgsIEFSNUtfQ0ZHLCBBUjVLX0NGR19JQlNTKTsKIAkJYnJlYWs7CiAKIAljYXNlIE5MODAyMTFfSUZUWVBFX1NUQVRJT046CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGg1ay9yZWcuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aDVrL3JlZy5oCmluZGV4IDkxYWFlYWYuLjkxODlhYjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aDVrL3JlZy5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aDVrL3JlZy5oCkBAIC03Myw3ICs3Myw3IEBACiAjZGVmaW5lCUFSNUtfQ0ZHX1NXUkQJCTB4MDAwMDAwMDQJLyogQnl0ZS1zd2FwIFJYIGRlc2NyaXB0b3IgKi8KICNkZWZpbmUJQVI1S19DRkdfU1dSQgkJMHgwMDAwMDAwOAkvKiBCeXRlLXN3YXAgUlggYnVmZmVyICovCiAjZGVmaW5lCUFSNUtfQ0ZHX1NXUkcJCTB4MDAwMDAwMTAJLyogQnl0ZS1zd2FwIFJlZ2lzdGVyIGFjY2VzcyAqLwotI2RlZmluZSBBUjVLX0NGR19BREhPQwkJMHgwMDAwMDAyMCAJLyogQVAvQWRob2MgaW5kaWNhdGlvbiBbNTIxMStdICovCisjZGVmaW5lIEFSNUtfQ0ZHX0lCU1MJCTB4MDAwMDAwMjAgCS8qIDAtQlNTLCAxLUlCU1MgWzUyMTErXSAqLwogI2RlZmluZSBBUjVLX0NGR19QSFlfT0sJCTB4MDAwMDAxMDAJLyogWzUyMTErXSAqLwogI2RlZmluZSBBUjVLX0NGR19FRUJTCQkweDAwMDAwMjAwCS8qIEVFUFJPTSBpcyBidXN5ICovCiAjZGVmaW5lCUFSNUtfQ0ZHX0NMS0dECQkweDAwMDAwNDAwCS8qIENsb2NrIGdhdGVkIChEaXNhYmxlIGR5bmFtaWMgY2xvY2spICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGg5ay9LY29uZmlnIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoOWsvS2NvbmZpZwppbmRleCBjNDNiZDMyLi45MGE4ZGQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGg5ay9LY29uZmlnCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aDlrL0tjb25maWcKQEAgLTEsNiArMSw3IEBACiBjb25maWcgQVRIOUsKIAl0cmlzdGF0ZSAiQXRoZXJvcyA4MDIuMTFuIHdpcmVsZXNzIGNhcmRzIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBQQ0kgJiYgTUFDODAyMTEgJiYgV0xBTl84MDIxMQorCWRlcGVuZHMgb24gUkZLSUxMIHx8IFJGS0lMTD1uCiAJc2VsZWN0IE1BQzgwMjExX0xFRFMKIAlzZWxlY3QgTEVEU19DTEFTUwogCXNlbGVjdCBORVdfTEVEUwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoOWsvbWFpbi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoOWsvbWFpbi5jCmluZGV4IDE5MWVlYzUuLjcyN2YwNjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aDlrL21haW4uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGg5ay9tYWluLmMKQEAgLTIxNjQsMTMgKzIxNjQsMTMgQEAKIAkJCQkJCSAgICBjb25mLT5odC5jaGFubmVsX3R5cGUpOwogCQl9CiAKKwkJYXRoX3VwZGF0ZV9jaGFpbm1hc2soc2MsIGNvbmYtPmh0LmVuYWJsZWQpOworCiAJCWlmIChhdGhfc2V0X2NoYW5uZWwoc2MsICZzYy0+c2NfYWgtPmFoX2NoYW5uZWxzW3Bvc10pIDwgMCkgewogCQkJRFBSSU5URihzYywgQVRIX0RCR19GQVRBTCwgIlVuYWJsZSB0byBzZXQgY2hhbm5lbFxuIik7CiAJCQltdXRleF91bmxvY2soJnNjLT5tdXRleCk7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQotCi0JCWF0aF91cGRhdGVfY2hhaW5tYXNrKHNjLCBjb25mLT5odC5lbmFibGVkKTsKIAl9CiAKIAlpZiAoY2hhbmdlZCAmIElFRUU4MDIxMV9DT05GX0NIQU5HRV9QT1dFUikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aDlrL3htaXQuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aDlrL3htaXQuYwppbmRleCAzYmZjM2I5Li5jOTJmMGM2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGg5ay94bWl0LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoOWsveG1pdC5jCkBAIC0xMjYsMTUgKzEyNiw3IEBACiAJCXR4X2luZm8tPmZsYWdzIHw9IElFRUU4MDIxMV9UWF9TVEFUX0FDSzsKIAl9CiAKLQl0eF9pbmZvLT5zdGF0dXMucmF0ZXNbMF0uY291bnQgPSB0eF9zdGF0dXMtPnJldHJpZXM7Ci0JaWYgKHR4X2luZm8tPnN0YXR1cy5yYXRlc1swXS5mbGFncyAmIElFRUU4MDIxMV9UWF9SQ19NQ1MpIHsKLQkJLyogQ2hhbmdlIGlkeCBmcm9tIGludGVybmFsIHRhYmxlIGluZGV4IHRvIE1DUyBpbmRleCAqLwotCQlpbnQgaWR4ID0gdHhfaW5mby0+c3RhdHVzLnJhdGVzWzBdLmlkeDsKLQkJc3RydWN0IGF0aF9yYXRlX3RhYmxlICpyYXRlX3RhYmxlID0gc2MtPmN1cl9yYXRlX3RhYmxlOwotCQlpZiAoaWR4ID49IDAgJiYgaWR4IDwgcmF0ZV90YWJsZS0+cmF0ZV9jbnQpCi0JCQl0eF9pbmZvLT5zdGF0dXMucmF0ZXNbMF0uaWR4ID0KLQkJCQlyYXRlX3RhYmxlLT5pbmZvW2lkeF0ucmF0ZWNvZGUgJiAweDdmOwotCX0KKwl0eF9pbmZvLT5zdGF0dXMucmF0ZXNbMF0uY291bnQgPSB0eF9zdGF0dXMtPnJldHJpZXMgKyAxOwogCiAJaGRybGVuID0gaWVlZTgwMjExX2dldF9oZHJsZW5fZnJvbV9za2Ioc2tiKTsKIAlwYWRzaXplID0gaGRybGVuICYgMzsKQEAgLTI2NCwyNSArMjU2LDIyIEBACiAJfQogCiAJLyogR2V0IHNlcW5vICovCi0KLQlpZiAoaWVlZTgwMjExX2lzX2RhdGEoZmMpICYmICFpc19wYWUoc2tiKSkgewotCQkvKiBGb3IgSFQgY2FwYWJsZSBzdGF0aW9ucywgd2Ugc2F2ZSB0aWRubyBmb3IgbGF0ZXIgdXNlLgotCQkgKiBXZSBhbHNvIG92ZXJyaWRlIHNlcW5vIHNldCBieSB1cHBlciBsYXllciB3aXRoIHRoZSBvbmUKLQkJICogaW4gdHggYWdncmVnYXRpb24gc3RhdGUuCi0JCSAqCi0JCSAqIElmIGZyYWdtZW50YXRpb24gaXMgb24sIHRoZSBzZXF1ZW5jZSBudW1iZXIgaXMKLQkJICogbm90IG92ZXJyaWRkZW4sIHNpbmNlIGl0IGhhcyBiZWVuCi0JCSAqIGluY3JlbWVudGVkIGJ5IHRoZSBmcmFnbWVudGF0aW9uIHJvdXRpbmUuCi0JCSAqCi0JCSAqIEZJWE1FOiBjaGVjayBpZiB0aGUgZnJhZ21lbnRhdGlvbiB0aHJlc2hvbGQgZXhjZWVkcwotCQkgKiBJRUVFODAyMTEgbWF4LgotCQkgKi8KLQkJdGlkID0gQVRIX0FOXzJfVElEKGFuLCBiZi0+YmZfdGlkbm8pOwotCQloZHItPnNlcV9jdHJsID0gY3B1X3RvX2xlMTYodGlkLT5zZXFfbmV4dCA8PAotCQkJCQkgICAgSUVFRTgwMjExX1NFUV9TRVFfU0hJRlQpOwotCQliZi0+YmZfc2Vxbm8gPSB0aWQtPnNlcV9uZXh0OwotCQlJTkNSKHRpZC0+c2VxX25leHQsIElFRUU4MDIxMV9TRVFfTUFYKTsKLQl9CisJLyogRm9yIEhUIGNhcGFibGUgc3RhdGlvbnMsIHdlIHNhdmUgdGlkbm8gZm9yIGxhdGVyIHVzZS4KKwkgKiBXZSBhbHNvIG92ZXJyaWRlIHNlcW5vIHNldCBieSB1cHBlciBsYXllciB3aXRoIHRoZSBvbmUKKwkgKiBpbiB0eCBhZ2dyZWdhdGlvbiBzdGF0ZS4KKwkgKgorCSAqIElmIGZyYWdtZW50YXRpb24gaXMgb24sIHRoZSBzZXF1ZW5jZSBudW1iZXIgaXMKKwkgKiBub3Qgb3ZlcnJpZGRlbiwgc2luY2UgaXQgaGFzIGJlZW4KKwkgKiBpbmNyZW1lbnRlZCBieSB0aGUgZnJhZ21lbnRhdGlvbiByb3V0aW5lLgorCSAqCisJICogRklYTUU6IGNoZWNrIGlmIHRoZSBmcmFnbWVudGF0aW9uIHRocmVzaG9sZCBleGNlZWRzCisJICogSUVFRTgwMjExIG1heC4KKwkgKi8KKwl0aWQgPSBBVEhfQU5fMl9USUQoYW4sIGJmLT5iZl90aWRubyk7CisJaGRyLT5zZXFfY3RybCA9IGNwdV90b19sZTE2KHRpZC0+c2VxX25leHQgPDwKKwkJCUlFRUU4MDIxMV9TRVFfU0VRX1NISUZUKTsKKwliZi0+YmZfc2Vxbm8gPSB0aWQtPnNlcV9uZXh0OworCUlOQ1IodGlkLT5zZXFfbmV4dCwgSUVFRTgwMjExX1NFUV9NQVgpOwogfQogCiBzdGF0aWMgaW50IHNldHVwX3R4X2ZsYWdzKHN0cnVjdCBhdGhfc29mdGMgKnNjLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLApAQCAtMTcxOCwxMSArMTcwNywxMCBAQAogCiAJLyogQXNzaWduIHNlcW5vLCB0aWRubyAqLwogCi0JaWYgKGJmX2lzaHQoYmYpICYmIChzYy0+c2NfZmxhZ3MgJiBTQ19PUF9UWEFHR1IpKQorCWlmIChpZWVlODAyMTFfaXNfZGF0YV9xb3MoZmMpICYmIChzYy0+c2NfZmxhZ3MgJiBTQ19PUF9UWEFHR1IpKQogCQlhc3NpZ25fYWdncl90aWRfc2Vxbm8oc2tiLCBiZik7CiAKIAkvKiBETUEgc2V0dXAgKi8KLQogCWJmLT5iZl9tcGR1ID0gc2tiOwogCiAJYmYtPmJmX2RtYWNvbnRleHQgPSBwY2lfbWFwX3NpbmdsZShzYy0+cGRldiwgc2tiLT5kYXRhLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRtZWwuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0bWVsLmMKaW5kZXggMzUwMTU3Zi4uNDIyMzY3MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRtZWwuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdG1lbC5jCkBAIC0zODM2LDcgKzM4MzYsNyBAQAogCSAgIFRoaXMgcm91dGluZSBpcyBhbHNvIHJlc3BvbnNpYmxlIGZvciBpbml0aWFsaXNpbmcgc29tZQogCSAgIGhhcmR3YXJlLXNwZWNpZmljIGZpZWxkcyBpbiB0aGUgYXRtZWxfcHJpdmF0ZSBzdHJ1Y3R1cmUsCiAJICAgaW5jbHVkaW5nIGEgY29weSBvZiB0aGUgZmlybXdhcmUncyBob3N0aW5mbyBzdHVjdHVyZQotCSAgIHdoaWNoIGlzIHRoZSByb3V0ZSBpbnRvIHRoZSByZXN0IG9mIHRoZSBmaXJtYXJlIGRhdGFzdHJ1Y3R1cmVzLiAqLworCSAgIHdoaWNoIGlzIHRoZSByb3V0ZSBpbnRvIHRoZSByZXN0IG9mIHRoZSBmaXJtd2FyZSBkYXRhc3RydWN0dXJlcy4gKi8KIAogCXN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAl1OCBjb25maWd1cmF0aW9uOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL21haW4uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9tYWluLmMKaW5kZXggN2IzMWEzMi4uYzc4OGJhZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL21haW4uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvbWFpbi5jCkBAIC0zMjYxLDcgKzMyNjEsNyBAQAogCXN0cnVjdCBiNDNfd2xkZXYgKmRvd25fZGV2OwogCXN0cnVjdCBiNDNfd2xkZXYgKmQ7CiAJaW50IGVycjsKLQlib29sIGdtb2RlOworCWJvb2wgdW5pbml0aWFsaXplZF92YXIoZ21vZGUpOwogCWludCBwcmV2X3N0YXR1czsKIAogCS8qIEZpbmQgYSBkZXZpY2UgYW5kIFBIWSB3aGljaCBzdXBwb3J0cyB0aGUgYmFuZC4gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0M2xlZ2FjeS9tYWluLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDNsZWdhY3kvbWFpbi5jCmluZGV4IGMxMzI0ZTMuLmZiOTk2YzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0M2xlZ2FjeS9tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzbGVnYWN5L21haW4uYwpAQCAtMjQ2NSw3ICsyNDY1LDcgQEAKIHN0YXRpYyBpbnQgYjQzbGVnYWN5X3N3aXRjaF9waHltb2RlKHN0cnVjdCBiNDNsZWdhY3lfd2wgKndsLAogCQkJCSAgICAgIHVuc2lnbmVkIGludCBuZXdfbW9kZSkKIHsKLQlzdHJ1Y3QgYjQzbGVnYWN5X3dsZGV2ICp1cF9kZXY7CisJc3RydWN0IGI0M2xlZ2FjeV93bGRldiAqdW5pbml0aWFsaXplZF92YXIodXBfZGV2KTsKIAlzdHJ1Y3QgYjQzbGVnYWN5X3dsZGV2ICpkb3duX2RldjsKIAlpbnQgZXJyOwogCWJvb2wgZ21vZGUgPSAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXB3MngwMC9pcHcyMTAwLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pcHcyeDAwL2lwdzIxMDAuYwppbmRleCAxNjY3MDY1Li44MjNjMmJmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pcHcyeDAwL2lwdzIxMDAuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pcHcyeDAwL2lwdzIxMDAuYwpAQCAtMTMzMiw3ICsxMzMyLDcgQEAKIAkJICAgICAgIElQV19BVVhfSE9TVF9SRVNFVF9SRUdfU1RPUF9NQVNURVIpOwogCiAJLyogU3RlcCAyLiBXYWl0IGZvciBzdG9wIE1hc3RlciBBc3NlcnQKLQkgKiAgICAgICAgIChub3QgbW9yZSB0aGVuIDUwdXMsIG90aGVyd2lzZSByZXQgZXJyb3IgKi8KKwkgKiAgICAgICAgIChub3QgbW9yZSB0aGFuIDUwdXMsIG90aGVyd2lzZSByZXQgZXJyb3IgKi8KIAlpID0gNTsKIAlkbyB7CiAJCXVkZWxheShJUFdfV0FJVF9SRVNFVF9NQVNURVJfQVNTRVJUX0NPTVBMRVRFX0RFTEFZKTsKQEAgLTE4MzAsNyArMTgzMCw3IEBACiAJCWNhbmNlbF9kZWxheWVkX3dvcmsoJnByaXYtPnJmX2tpbGwpOwogCX0KIAotCS8qIEtpbGwgdGhlIGZpcm1hcmUgaGFuZyBjaGVjayB0aW1lciAqLworCS8qIEtpbGwgdGhlIGZpcm13YXJlIGhhbmcgY2hlY2sgdGltZXIgKi8KIAlpZiAoIXByaXYtPnN0b3BfaGFuZ19jaGVjaykgewogCQlwcml2LT5zdG9wX2hhbmdfY2hlY2sgPSAxOwogCQljYW5jZWxfZGVsYXllZF93b3JrKCZwcml2LT5oYW5nX2NoZWNrKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLTM5NDUuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLTM5NDUuYwppbmRleCA4ZmRiMzQyLi40NWNmYTFjZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtMzk0NS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLTM5NDUuYwpAQCAtMjIxOSw3ICsyMjE5LDcgQEAKIAkJLyogc2V0IHR4IHBvd2VyIHZhbHVlIGZvciBhbGwgT0ZETSByYXRlcyAqLwogCQlmb3IgKHJhdGVfaW5kZXggPSAwOyByYXRlX2luZGV4IDwgSVdMX09GRE1fUkFURVM7CiAJCSAgICAgcmF0ZV9pbmRleCsrKSB7Ci0JCQlzMzIgcG93ZXJfaWR4OworCQkJczMyIHVuaW5pdGlhbGl6ZWRfdmFyKHBvd2VyX2lkeCk7CiAJCQlpbnQgcmM7CiAKIAkJCS8qIHVzZSBjaGFubmVsIGdyb3VwJ3MgY2xpcC1wb3dlciB0YWJsZSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWNvbW1hbmRzLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1jb21tYW5kcy5oCmluZGV4IDUyOTY2ZmYuLmJhOTk3MjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWNvbW1hbmRzLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtY29tbWFuZHMuaApAQCAtMjU1LDcgKzI1NSw3IEBACiAgKiAgICAgICAgMHgzKSAgNTQgTWJwcwogICoKICAqIExlZ2FjeSBDQ0sgcmF0ZSBmb3JtYXQgZm9yIGJpdHMgNzowIChiaXQgOCBtdXN0IGJlICIwIiwgYml0IDkgIjEiKToKLSAqICAzLTA6ICAgMTApICAxIE1icHMKKyAqICA2LTA6ICAgMTApICAxIE1icHMKICAqICAgICAgICAgMjApICAyIE1icHMKICAqICAgICAgICAgNTUpICA1LjUgTWJwcwogICogICAgICAgIDExMCkgIDExIE1icHMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWhjbWQuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWhjbWQuYwppbmRleCAwMWEyMTY5Li44YzcxYWQ0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1oY21kLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtaGNtZC5jCkBAIC01MSw2ICs1MSw3IEBACiAJCUlXTF9DTUQoUkVQTFlfUkVNT1ZFX1NUQSk7CiAJCUlXTF9DTUQoUkVQTFlfUkVNT1ZFX0FMTF9TVEEpOwogCQlJV0xfQ01EKFJFUExZX1dFUEtFWSk7CisJCUlXTF9DTUQoUkVQTFlfMzk0NV9SWCk7CiAJCUlXTF9DTUQoUkVQTFlfVFgpOwogCQlJV0xfQ01EKFJFUExZX1JBVEVfU0NBTEUpOwogCQlJV0xfQ01EKFJFUExZX0xFRFNfQ01EKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL21haW4uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL21haW4uYwppbmRleCAzZGJhODM2Li40ZTAwMDdkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvbWFpbi5jCkBAIC0xMzY5LDcgKzEzNjksNyBAQAogCiB2b2lkIGxic19zdG9wX2NhcmQoc3RydWN0IGxic19wcml2YXRlICpwcml2KQogewotCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwcml2LT5kZXY7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKIAlzdHJ1Y3QgY21kX2N0cmxfbm9kZSAqY21kbm9kZTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCkBAIC0xMzc3LDkgKzEzNzcsMTAgQEAKIAogCWlmICghcHJpdikKIAkJZ290byBvdXQ7CisJZGV2ID0gcHJpdi0+ZGV2OwogCi0JbmV0aWZfc3RvcF9xdWV1ZShwcml2LT5kZXYpOwotCW5ldGlmX2NhcnJpZXJfb2ZmKHByaXYtPmRldik7CisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCW5ldGlmX2NhcnJpZXJfb2ZmKGRldik7CiAKIAlsYnNfZGVidWdmc19yZW1vdmVfb25lKHByaXYpOwogCWlmIChwcml2LT5tZXNoX3RsdikgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXNfdGYvbWFpbi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXNfdGYvbWFpbi5jCmluZGV4IGQxZmMzMDUuLmU3Mjg5ZTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzX3RmL21haW4uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhc190Zi9tYWluLmMKQEAgLTIwNiw3ICsyMDYsNyBAQAogCSAqIHRoZXJlIGFyZSBubyBidWZmZXJlZCBtdWx0aWNhc3QgZnJhbWVzIHRvIHNlbmQKIAkgKi8KIAlpZWVlODAyMTFfc3RvcF9xdWV1ZXMocHJpdi0+aHcpOwotCXJldHVybiAwOworCXJldHVybiBORVRERVZfVFhfT0s7CiB9CiAKIHN0YXRpYyB2b2lkIGxidGZfdHhfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9vcmlub2NvL29yaW5vY28uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL29yaW5vY28vb3Jpbm9jby5jCmluZGV4IGJjODRlMjcuLmMzYmI4NWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL29yaW5vY28vb3Jpbm9jby5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL29yaW5vY28vb3Jpbm9jby5jCkBAIC0xNjEwLDYgKzE2MTAsMTYgQEAKIAlzdHJ1Y3Qgb3Jpbm9jb19yeF9kYXRhICpyeF9kYXRhLCAqdGVtcDsKIAlzdHJ1Y3QgaGVybWVzX3J4X2Rlc2NyaXB0b3IgKmRlc2M7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyogb3Jpbm9jb19yeCByZXF1aXJlcyB0aGUgZHJpdmVyIGxvY2ssIGFuZCB3ZSBhbHNvIG5lZWQgdG8KKwkgKiBwcm90ZWN0IHByaXYtPnJ4X2xpc3QsIHNvIGp1c3QgaG9sZCB0aGUgbG9jayBvdmVyIHRoZQorCSAqIGxvdC4KKwkgKgorCSAqIElmIG9yaW5vY29fbG9jayBmYWlscywgd2UndmUgdW5wbHVnZ2VkIHRoZSBjYXJkLiBJbiB0aGlzCisJICogY2FzZSBqdXN0IGFib3J0LiAqLworCWlmIChvcmlub2NvX2xvY2socHJpdiwgJmZsYWdzKSAhPSAwKQorCQlyZXR1cm47CiAKIAkvKiBleHRyYWN0IGRlc2MgYW5kIHNrYiBmcm9tIHF1ZXVlICovCiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHJ4X2RhdGEsIHRlbXAsICZwcml2LT5yeF9saXN0LCBsaXN0KSB7CkBAIC0xNjIyLDYgKzE2MzIsOCBAQAogCiAJCWtmcmVlKGRlc2MpOwogCX0KKworCW9yaW5vY29fdW5sb2NrKHByaXYsICZmbGFncyk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTM2NDUsMTIgKzM2NTcsMjIgQEAKIHZvaWQgZnJlZV9vcmlub2NvZGV2KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IG9yaW5vY29fcnhfZGF0YSAqcnhfZGF0YSwgKnRlbXA7CiAKLQkvKiBObyBuZWVkIHRvIGVtcHR5IHByaXYtPnJ4X2xpc3Q6IGlmIHRoZSB0YXNrbGV0IGlzIHNjaGVkdWxlZAotCSAqIHdoZW4gd2UgY2FsbCB0YXNrbGV0X2tpbGwgaXQgd2lsbCBydW4gb25lIGZpbmFsIHRpbWUsCi0JICogZW1wdHlpbmcgdGhlIGxpc3QgKi8KKwkvKiBJZiB0aGUgdGFza2xldCBpcyBzY2hlZHVsZWQgd2hlbiB3ZSBjYWxsIHRhc2tsZXRfa2lsbCBpdAorCSAqIHdpbGwgcnVuIG9uZSBmaW5hbCB0aW1lLiBIb3dldmVyIHRoZSB0YXNrbGV0IHdpbGwgb25seQorCSAqIGRyYWluIHByaXYtPnJ4X2xpc3QgaWYgdGhlIGh3IGlzIHN0aWxsIGF2YWlsYWJsZS4gKi8KIAl0YXNrbGV0X2tpbGwoJnByaXYtPnJ4X3Rhc2tsZXQpOwogCisJLyogRXhwbGljaXRseSBkcmFpbiBwcml2LT5yeF9saXN0ICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHJ4X2RhdGEsIHRlbXAsICZwcml2LT5yeF9saXN0LCBsaXN0KSB7CisJCWxpc3RfZGVsKCZyeF9kYXRhLT5saXN0KTsKKworCQlkZXZfa2ZyZWVfc2tiKHJ4X2RhdGEtPnNrYik7CisJCWtmcmVlKHJ4X2RhdGEtPmRlc2MpOworCQlrZnJlZShyeF9kYXRhKTsKKwl9CisKIAl1bnJlZ2lzdGVyX3BtX25vdGlmaWVyKCZwcml2LT5wbV9ub3RpZmllcik7CiAJb3Jpbm9jb191bmNhY2hlX2Z3KHByaXYpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9vcmlub2NvL29yaW5vY29fY3MuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL29yaW5vY28vb3Jpbm9jb19jcy5jCmluZGV4IGYxMjc2MDIuLjBiMzIyMTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL29yaW5vY28vb3Jpbm9jb19jcy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL29yaW5vY28vb3Jpbm9jb19jcy5jCkBAIC00MzUsNiArNDM1LDcgQEAKIAlQQ01DSUFfREVWSUNFX01BTkZfQ0FSRCgweDAyNTAsIDB4MDAwMiksIC8qIFNhbXN1bmcgU1dMMjAwMC1OIDExTWIvcyBXTEFOIENhcmQgKi8KIAlQQ01DSUFfREVWSUNFX01BTkZfQ0FSRCgweDAyNjEsIDB4MDAwMiksIC8qIEFpcldheSA4MDIuMTEgQWRhcHRlciAoUENNQ0lBKSAqLwogCVBDTUNJQV9ERVZJQ0VfTUFORl9DQVJEKDB4MDI2OCwgMHgwMDAxKSwgLyogQVJ0ZW0gT25haXIgKi8KKwlQQ01DSUFfREVWSUNFX01BTkZfQ0FSRCgweDAyNjgsIDB4MDAwMyksIC8qIEFSdGVtIE9uYWlyIENvbWNhcmQgMTEgKi8KIAlQQ01DSUFfREVWSUNFX01BTkZfQ0FSRCgweDAyNmYsIDB4MDMwNSksIC8qIEJ1ZmZhbG8gV0xJLVBDTS1TMTEgKi8KIAlQQ01DSUFfREVWSUNFX01BTkZfQ0FSRCgweDAyNzQsIDB4MTYxMiksIC8qIExpbmtzeXMgV1BDMTEgVmVyc2lvbiAyLjUgKi8KIAlQQ01DSUFfREVWSUNFX01BTkZfQ0FSRCgweDAyNzQsIDB4MTYxMyksIC8qIExpbmtzeXMgV1BDMTEgVmVyc2lvbiAzICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9wNTQvcDU0Y29tbW9uLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9wNTQvcDU0Y29tbW9uLmMKaW5kZXggODIzNTRiOS4uYzZhMzcwZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcDU0L3A1NGNvbW1vbi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3A1NC9wNTRjb21tb24uYwpAQCAtMTM4LDYgKzEzOCw3IEBACiAJdTggKmZ3X3ZlcnNpb24gPSBOVUxMOwogCXNpemVfdCBsZW47CiAJaW50IGk7CisJaW50IG1heGxlbjsKIAogCWlmIChwcml2LT5yeF9zdGFydCkKIAkJcmV0dXJuIDA7CkBAIC0xOTUsNiArMTk2LDE2IEBACiAJCQllbHNlCiAJCQkJcHJpdi0+cnhfbXR1ID0gKHNpemVfdCkKIAkJCQkJMHg2MjAgLSBwcml2LT50eF9oZHJfbGVuOworCQkJbWF4bGVuID0gcHJpdi0+dHhfaGRyX2xlbiArIC8qIFVTQiBkZXZpY2VzICovCisJCQkJIHNpemVvZihzdHJ1Y3QgcDU0X3J4X2RhdGEpICsKKwkJCQkgNCArIC8qIHJ4IGFsaWdubWVudCAqLworCQkJCSBJRUVFODAyMTFfTUFYX0ZSQUdfVEhSRVNIT0xEOworCQkJaWYgKHByaXYtPnJ4X210dSA+IG1heGxlbiAmJiBQQUdFX1NJWkUgPT0gNDA5NikgeworCQkJCXByaW50ayhLRVJOX0lORk8gInA1NDogcnhfbXR1IHJlZHVjZWQgZnJvbSAlZCAiCisJCQkJCSAgICAgICAgICJ0byAlZFxuIiwgcHJpdi0+cnhfbXR1LAorCQkJCQkJIG1heGxlbik7CisJCQkJcHJpdi0+cnhfbXR1ID0gbWF4bGVuOworCQkJfQogCQkJYnJlYWs7CiAJCQl9CiAJCWNhc2UgQlJfQ09ERV9FWFBPU0VEX0lGOgpAQCAtNTc1LDYgKzU4Niw3IEBACiAJdTE2IGZyZXEgPSBsZTE2X3RvX2NwdShoZHItPmZyZXEpOwogCXNpemVfdCBoZWFkZXJfbGVuID0gc2l6ZW9mKCpoZHIpOwogCXUzMiB0c2YzMjsKKwl1OCByYXRlID0gaGRyLT5yYXRlICYgMHhmOwogCiAJLyoKIAkgKiBJZiB0aGUgZGV2aWNlIGlzIGluIGEgdW5zcGVjaWZpZWQgc3RhdGUgd2UgaGF2ZSB0bwpAQCAtNjAzLDggKzYxNSwxMSBAQAogCXJ4X3N0YXR1cy5xdWFsID0gKDEwMCAqIGhkci0+cnNzaSkgLyAxMjc7CiAJaWYgKGhkci0+cmF0ZSAmIDB4MTApCiAJCXJ4X3N0YXR1cy5mbGFnIHw9IFJYX0ZMQUdfU0hPUlRQUkU7Ci0Jcnhfc3RhdHVzLnJhdGVfaWR4ID0gKGRldi0+Y29uZi5jaGFubmVsLT5iYW5kID09IElFRUU4MDIxMV9CQU5EXzJHSFogPwotCQkJaGRyLT5yYXRlIDogKGhkci0+cmF0ZSAtIDQpKSAmIDB4ZjsKKwlpZiAoZGV2LT5jb25mLmNoYW5uZWwtPmJhbmQgPT0gSUVFRTgwMjExX0JBTkRfNUdIWikKKwkJcnhfc3RhdHVzLnJhdGVfaWR4ID0gKHJhdGUgPCA0KSA/IDAgOiByYXRlIC0gNDsKKwllbHNlCisJCXJ4X3N0YXR1cy5yYXRlX2lkeCA9IHJhdGU7CisKIAlyeF9zdGF0dXMuZnJlcSA9IGZyZXE7CiAJcnhfc3RhdHVzLmJhbmQgPSAgZGV2LT5jb25mLmNoYW5uZWwtPmJhbmQ7CiAJcnhfc3RhdHVzLmFudGVubmEgPSBoZHItPmFudGVubmE7CkBAIC03OTgsNiArODEzLDE2IEBACiAJCQlpbmZvLT5mbGFncyB8PSBJRUVFODAyMTFfVFhfU1RBVF9UWF9GSUxURVJFRDsKIAkJaW5mby0+c3RhdHVzLmFja19zaWduYWwgPSBwNTRfcnNzaV90b19kYm0oZGV2LAogCQkJCShpbnQpcGF5bG9hZC0+YWNrX3Jzc2kpOworCisJCWlmIChlbnRyeV9kYXRhLT5rZXlfdHlwZSA9PSBQNTRfQ1JZUFRPX1RLSVBNSUNIQUVMKSB7CisJCQl1OCAqaXYgPSAodTggKikoZW50cnlfZGF0YS0+YWxpZ24gKyBwYWQgKworCQkJCSAgICAgICAgZW50cnlfZGF0YS0+Y3J5cHRfb2Zmc2V0KTsKKworCQkJLyogUmVzdG9yZSB0aGUgb3JpZ2luYWwgVEtJUCBJVi4gKi8KKwkJCWl2WzJdID0gaXZbMF07CisJCQlpdlswXSA9IGl2WzFdOworCQkJaXZbMV0gPSAoaXZbMF0gfCAweDIwKSAmIDB4N2Y7CS8qIFdFUFNlZWQgLSA4LjMuMi4yICovCisJCX0KIAkJc2tiX3B1bGwoZW50cnksIHNpemVvZigqaGRyKSArIHBhZCArIHNpemVvZigqZW50cnlfZGF0YSkpOwogCQlpZWVlODAyMTFfdHhfc3RhdHVzX2lycXNhZmUoZGV2LCBlbnRyeSk7CiAJCWdvdG8gb3V0OwpAQCAtMTM4Myw3ICsxNDA4LDYgQEAKIAloZHItPnRyaWVzID0gcmlkeDsKIAl0eGhkci0+cnRzX3JhdGVfaWR4ID0gMDsKIAlpZiAoaW5mby0+Y29udHJvbC5od19rZXkpIHsKLQkJY3J5cHRfb2Zmc2V0ICs9IGluZm8tPmNvbnRyb2wuaHdfa2V5LT5pdl9sZW47CiAJCXR4aGRyLT5rZXlfdHlwZSA9IHA1NF9jb252ZXJ0X2FsZ28oaW5mby0+Y29udHJvbC5od19rZXktPmFsZyk7CiAJCXR4aGRyLT5rZXlfbGVuID0gbWluKCh1OCkxNiwgaW5mby0+Y29udHJvbC5od19rZXktPmtleWxlbik7CiAJCW1lbWNweSh0eGhkci0+a2V5LCBpbmZvLT5jb250cm9sLmh3X2tleS0+a2V5LCB0eGhkci0+a2V5X2xlbik7CkBAIC0xMzk3LDYgKzE0MjEsOCBAQAogCQl9CiAJCS8qIHJlc2VydmUgc29tZSBzcGFjZSBmb3IgSUNWICovCiAJCWxlbiArPSBpbmZvLT5jb250cm9sLmh3X2tleS0+aWN2X2xlbjsKKwkJbWVtc2V0KHNrYl9wdXQoc2tiLCBpbmZvLT5jb250cm9sLmh3X2tleS0+aWN2X2xlbiksIDAsCisJCSAgICAgICBpbmZvLT5jb250cm9sLmh3X2tleS0+aWN2X2xlbik7CiAJfSBlbHNlIHsKIAkJdHhoZHItPmtleV90eXBlID0gMDsKIAkJdHhoZHItPmtleV9sZW4gPSAwOwpAQCAtMTgyNCw3ICsxODUwLDcgQEAKIAogc3RhdGljIGludCBwNTRfY29uZmlnKHN0cnVjdCBpZWVlODAyMTFfaHcgKmRldiwgdTMyIGNoYW5nZWQpCiB7Ci0JaW50IHJldDsKKwlpbnQgcmV0ID0gMDsKIAlzdHJ1Y3QgcDU0X2NvbW1vbiAqcHJpdiA9IGRldi0+cHJpdjsKIAlzdHJ1Y3QgaWVlZTgwMjExX2NvbmYgKmNvbmYgPSAmZGV2LT5jb25mOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9wNTQvcDU0dXNiLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9wNTQvcDU0dXNiLmMKaW5kZXggYzQ0YTIwMC4uNmE2YTcyZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcDU0L3A1NHVzYi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3A1NC9wNTR1c2IuYwpAQCAtNTYsNiArNTYsNyBAQAogCXtVU0JfREVWSUNFKDB4MDUwZCwgMHg3MDUwKX0sCS8qIEJlbGtpbiBGNUQ3MDUwIHZlciAxMDAwICovCiAJe1VTQl9ERVZJQ0UoMHgwNTcyLCAweDIwMDApfSwJLyogQ29oaWJhIFByb3RvIGJvYXJkICovCiAJe1VTQl9ERVZJQ0UoMHgwNTcyLCAweDIwMDIpfSwJLyogQ29oaWJhIFByb3RvIGJvYXJkICovCisJe1VTQl9ERVZJQ0UoMHgwNmI5LCAweDAxMjEpfSwJLyogVGhvbXNvbiBTcGVlZFRvdWNoIDEyMWcgKi8KIAl7VVNCX0RFVklDRSgweDA3MDcsIDB4ZWUxMyl9LCAgIC8qIFNNQyAyODYyVy1HIHZlcnNpb24gMiAqLwogCXtVU0JfREVWSUNFKDB4MDgzYSwgMHg0NTIxKX0sICAgLyogU2llbWVucyBHaWdhc2V0IFVTQiBBZGFwdGVyIDU0IHZlcnNpb24gMiAqLwogCXtVU0JfREVWSUNFKDB4MDg0NiwgMHg0MjQwKX0sCS8qIE5ldGdlYXIgV0cxMTEgKHYyKSAqLwpAQCAtMjg0LDYgKzI4NSw3IEBACiAJdXNiX2ZpbGxfYnVsa191cmIoZGF0YV91cmIsIHByaXYtPnVkZXYsCiAJCQkgIHVzYl9zbmRidWxrcGlwZShwcml2LT51ZGV2LCBQNTRVX1BJUEVfREFUQSksCiAJCQkgIHNrYi0+ZGF0YSwgc2tiLT5sZW4sIHA1NHVfdHhfY2IsIHNrYik7CisJZGF0YV91cmItPnRyYW5zZmVyX2ZsYWdzIHw9IFVSQl9aRVJPX1BBQ0tFVDsKIAogCXVzYl9hbmNob3JfdXJiKGRhdGFfdXJiLCAmcHJpdi0+c3VibWl0dGVkKTsKIAlpZiAodXNiX3N1Ym1pdF91cmIoZGF0YV91cmIsIEdGUF9BVE9NSUMpKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyNTAwdXNiLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyNTAwdXNiLmMKaW5kZXggMzAwMjhlMi4uYWY2YjU4NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0MjUwMHVzYi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDI1MDB1c2IuYwpAQCAtMzgsNyArMzgsNyBAQAogLyoKICAqIEFsbG93IGhhcmR3YXJlIGVuY3J5cHRpb24gdG8gYmUgZGlzYWJsZWQuCiAgKi8KLXN0YXRpYyBpbnQgbW9kcGFyYW1fbm9od2NyeXB0ID0gMTsKK3N0YXRpYyBpbnQgbW9kcGFyYW1fbm9od2NyeXB0ID0gMDsKIG1vZHVsZV9wYXJhbV9uYW1lZChub2h3Y3J5cHQsIG1vZHBhcmFtX25vaHdjcnlwdCwgYm9vbCwgU19JUlVHTyk7CiBNT0RVTEVfUEFSTV9ERVNDKG5vaHdjcnlwdCwgIkRpc2FibGUgaGFyZHdhcmUgZW5jcnlwdGlvbi4iKTsKIApAQCAtMzc2LDExICszNzYsMTEgQEAKIAogCQkvKgogCQkgKiBUaGUgZHJpdmVyIGRvZXMgbm90IHN1cHBvcnQgdGhlIElWL0VJViBnZW5lcmF0aW9uCi0JCSAqIGluIGhhcmR3YXJlLiBIb3dldmVyIGl0IGRvZXNuJ3Qgc3VwcG9ydCB0aGUgSVYvRUlWCi0JCSAqIGluc2lkZSB0aGUgaWVlZTgwMjExIGZyYW1lIGVpdGhlciwgYnV0IHJlcXVpcmVzIGl0Ci0JCSAqIHRvIGJlIHByb3ZpZGVkIHNlcGVyYXRlbHkgZm9yIHRoZSBkZXNjcmlwdG9yLgotCQkgKiBydDJ4MDBsaWIgd2lsbCBjdXQgdGhlIElWL0VJViBkYXRhIG91dCBvZiBhbGwgZnJhbWVzCi0JCSAqIGdpdmVuIHRvIHVzIGJ5IG1hYzgwMjExLCBidXQgd2UgbXVzdCB0ZWxsIG1hYzgwMjExCisJCSAqIGluIGhhcmR3YXJlLiBIb3dldmVyIGl0IGRlbWFuZHMgdGhlIGRhdGEgdG8gYmUgcHJvdmlkZWQKKwkJICogYm90aCBzZXBlcmF0ZWx5IGFzIHdlbGwgYXMgaW5zaWRlIHRoZSBmcmFtZS4KKwkJICogV2UgYWxyZWFkeSBwcm92aWRlZCB0aGUgQ09ORklHX0NSWVBUT19DT1BZX0lWIHRvIHJ0MngwMGxpYgorCQkgKiB0byBlbnN1cmUgcnQyeDAwbGliIHdpbGwgbm90IHN0cmlwIHRoZSBkYXRhIGZyb20gdGhlCisJCSAqIGZyYW1lIGFmdGVyIHRoZSBjb3B5LCBub3cgd2UgbXVzdCB0ZWxsIG1hYzgwMjExCiAJCSAqIHRvIGdlbmVyYXRlIHRoZSBJVi9FSVYgZGF0YS4KIAkJICovCiAJCWtleS0+ZmxhZ3MgfD0gSUVFRTgwMjExX0tFWV9GTEFHX0dFTkVSQVRFX0lWOwpAQCAtMTE4MSw3ICsxMTgxLDcgQEAKIAkJCSAgIHRlc3RfYml0KEVOVFJZX1RYRF9GSVJTVF9GUkFHTUVOVCwgJnR4ZGVzYy0+ZmxhZ3MpKTsKIAlydDJ4MDBfc2V0X2ZpZWxkMzIoJndvcmQsIFRYRF9XMF9JRlMsIHR4ZGVzYy0+aWZzKTsKIAlydDJ4MDBfc2V0X2ZpZWxkMzIoJndvcmQsIFRYRF9XMF9EQVRBQllURV9DT1VOVCwgc2tiLT5sZW4pOwotCXJ0MngwMF9zZXRfZmllbGQzMigmd29yZCwgVFhEX1cwX0NJUEhFUiwgdHhkZXNjLT5jaXBoZXIpOworCXJ0MngwMF9zZXRfZmllbGQzMigmd29yZCwgVFhEX1cwX0NJUEhFUiwgISF0eGRlc2MtPmNpcGhlcik7CiAJcnQyeDAwX3NldF9maWVsZDMyKCZ3b3JkLCBUWERfVzBfS0VZX0lELCB0eGRlc2MtPmtleV9pZHgpOwogCXJ0MngwMF9kZXNjX3dyaXRlKHR4ZCwgMCwgd29yZCk7CiB9CkBAIC0xMzM0LDE0ICsxMzM0LDcgQEAKIAogCQkvKiBJQ1YgaXMgbG9jYXRlZCBhdCB0aGUgZW5kIG9mIGZyYW1lICovCiAKLQkJLyoKLQkJICogSGFyZHdhcmUgaGFzIHN0cmlwcGVkIElWL0VJViBkYXRhIGZyb20gODAyLjExIGZyYW1lIGR1cmluZwotCQkgKiBkZWNyeXB0aW9uLiBJdCBoYXMgcHJvdmlkZWQgdGhlIGRhdGEgc2VwZXJhdGVseSBidXQgcnQyeDAwbGliCi0JCSAqIHNob3VsZCBkZWNpZGUgaWYgaXQgc2hvdWxkIGJlIHJlaW5zZXJ0ZWQuCi0JCSAqLwotCQlyeGRlc2MtPmZsYWdzIHw9IFJYX0ZMQUdfSVZfU1RSSVBQRUQ7Ci0JCWlmIChyeGRlc2MtPmNpcGhlciAhPSBDSVBIRVJfVEtJUCkKLQkJCXJ4ZGVzYy0+ZmxhZ3MgfD0gUlhfRkxBR19NTUlDX1NUUklQUEVEOworCQlyeGRlc2MtPmZsYWdzIHw9IFJYX0ZMQUdfTU1JQ19TVFJJUFBFRDsKIAkJaWYgKHJ4ZGVzYy0+Y2lwaGVyX3N0YXR1cyA9PSBSWF9DUllQVE9fU1VDQ0VTUykKIAkJCXJ4ZGVzYy0+ZmxhZ3MgfD0gUlhfRkxBR19ERUNSWVBURUQ7CiAJCWVsc2UgaWYgKHJ4ZGVzYy0+Y2lwaGVyX3N0YXR1cyA9PSBSWF9DUllQVE9fRkFJTF9NSUMpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyeDAwY3J5cHRvLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyeDAwY3J5cHRvLmMKaW5kZXggMzdhZDBkMi4uYWVlOWNiYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0MngwMGNyeXB0by5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDJ4MDBjcnlwdG8uYwpAQCAtMTg0LDggKzE4NCw4IEBACiAJICogTWFrZSByb29tIGZvciBuZXcgZGF0YSwgbm90ZSB0aGF0IHdlIGluY3JlYXNlIGJvdGgKIAkgKiBoZWFkc2l6ZSBhbmQgdGFpbHNpemUgd2hlbiByZXF1aXJlZC4gVGhlIHRhaWxzaXplIGlzCiAJICogb25seSBuZWVkZWQgd2hlbiBJQ1YgZGF0YSBuZWVkcyB0byBiZSBpbnNlcnRlZCBhbmQKLQkgKiB0aGUgcGFkZGluZyBpcyBzbWFsbGVyIHRoZW4gdGhlIElDViBkYXRhLgotCSAqIFdoZW4gYWxpZ25tZW50IHJlcXVpcmVtZW50cyBpcyBncmVhdGVyIHRoZW4gdGhlCisJICogdGhlIHBhZGRpbmcgaXMgc21hbGxlciB0aGFuIHRoZSBJQ1YgZGF0YS4KKwkgKiBXaGVuIGFsaWdubWVudCByZXF1aXJlbWVudHMgaXMgZ3JlYXRlciB0aGFuIHRoZQogCSAqIElDViBkYXRhIHdlIG11c3QgdHJpbSB0aGUgc2tiIHRvIHRoZSBjb3JyZWN0IHNpemUKIAkgKiBiZWNhdXNlIHdlIG5lZWQgdG8gcmVtb3ZlIHRoZSBleHRyYSBieXRlcy4KIAkgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDJ4MDBkZXYuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDJ4MDBkZXYuYwppbmRleCA2ZDkyNTQyLi44N2MwZjJjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyeDAwZGV2LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0MngwMGRldi5jCkBAIC04MDcsMTMgKzgwNywxMSBAQAogewogCWVudHJ5LT5mbGFncyA9IDA7CiAJZW50cnktPmJpdHJhdGUgPSByYXRlLT5iaXRyYXRlOwotCWVudHJ5LT5od192YWx1ZSA9IHJ0MngwMF9jcmVhdGVfcmF0ZV9od192YWx1ZShpbmRleCwgMCk7Ci0JZW50cnktPmh3X3ZhbHVlX3Nob3J0ID0gZW50cnktPmh3X3ZhbHVlOworCWVudHJ5LT5od192YWx1ZSA9aW5kZXg7CisJZW50cnktPmh3X3ZhbHVlX3Nob3J0ID0gaW5kZXg7CiAKLQlpZiAocmF0ZS0+ZmxhZ3MgJiBERVZfUkFURV9TSE9SVF9QUkVBTUJMRSkgeworCWlmIChyYXRlLT5mbGFncyAmIERFVl9SQVRFX1NIT1JUX1BSRUFNQkxFKQogCQllbnRyeS0+ZmxhZ3MgfD0gSUVFRTgwMjExX1JBVEVfU0hPUlRfUFJFQU1CTEU7Ci0JCWVudHJ5LT5od192YWx1ZV9zaG9ydCB8PSBydDJ4MDBfY3JlYXRlX3JhdGVfaHdfdmFsdWUoaW5kZXgsIDEpOwotCX0KIH0KIAogc3RhdGljIGludCBydDJ4MDBsaWJfcHJvYmVfaHdfbW9kZXMoc3RydWN0IHJ0MngwMF9kZXYgKnJ0MngwMGRldiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDJ4MDBsZWRzLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyeDAwbGVkcy5jCmluZGV4IDY4ZjRlMGZjLi5hMGNkMzViIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyeDAwbGVkcy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDJ4MDBsZWRzLmMKQEAgLTk3LDcgKzk3LDcgQEAKIAogdm9pZCBydDJ4MDBsZWRzX2xlZF9yYWRpbyhzdHJ1Y3QgcnQyeDAwX2RldiAqcnQyeDAwZGV2LCBib29sIGVuYWJsZWQpCiB7Ci0JaWYgKHJ0MngwMGRldi0+bGVkX3JhZGlvLnR5cGUgPT0gTEVEX1RZUEVfQVNTT0MpCisJaWYgKHJ0MngwMGRldi0+bGVkX3JhZGlvLnR5cGUgPT0gTEVEX1RZUEVfUkFESU8pCiAJCXJ0MngwMGxlZF9sZWRfc2ltcGxlKCZydDJ4MDBkZXYtPmxlZF9yYWRpbywgZW5hYmxlZCk7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDJ4MDBsaWIuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDJ4MDBsaWIuaAppbmRleCAwMzAyNDMyLi44NmNkMjZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyeDAwbGliLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0MngwMGxpYi5oCkBAIC01MiwyMiArNTIsMTEgQEAKIAogZXh0ZXJuIGNvbnN0IHN0cnVjdCBydDJ4MDBfcmF0ZSBydDJ4MDBfc3VwcG9ydGVkX3JhdGVzWzEyXTsKIAotc3RhdGljIGlubGluZSB1MTYgcnQyeDAwX2NyZWF0ZV9yYXRlX2h3X3ZhbHVlKGNvbnN0IHUxNiBpbmRleCwKLQkJCQkJICAgICAgY29uc3QgdTE2IHNob3J0X3ByZWFtYmxlKQotewotCXJldHVybiAoc2hvcnRfcHJlYW1ibGUgPDwgOCkgfCAoaW5kZXggJiAweGZmKTsKLX0KLQogc3RhdGljIGlubGluZSBjb25zdCBzdHJ1Y3QgcnQyeDAwX3JhdGUgKnJ0MngwMF9nZXRfcmF0ZShjb25zdCB1MTYgaHdfdmFsdWUpCiB7CiAJcmV0dXJuICZydDJ4MDBfc3VwcG9ydGVkX3JhdGVzW2h3X3ZhbHVlICYgMHhmZl07CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IHJ0MngwMF9nZXRfcmF0ZV9wcmVhbWJsZShjb25zdCB1MTYgaHdfdmFsdWUpCi17Ci0JcmV0dXJuIChod192YWx1ZSAmIDB4ZmYwMCk7Ci19Ci0KIC8qCiAgKiBSYWRpbyBjb250cm9sIGhhbmRsZXJzLgogICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyeDAwcXVldWUuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDJ4MDBxdWV1ZS5jCmluZGV4IGVhZWM2YmQuLjc0NmE4ZjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDJ4MDBxdWV1ZS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDJ4MDBxdWV1ZS5jCkBAIC0zMTMsNyArMzEzLDcgQEAKIAkJICogV2hlbiBwcmVhbWJsZSBpcyBlbmFibGVkIHdlIHNob3VsZCBzZXQgdGhlCiAJCSAqIHByZWFtYmxlIGJpdCBmb3IgdGhlIHNpZ25hbC4KIAkJICovCi0JCWlmIChydDJ4MDBfZ2V0X3JhdGVfcHJlYW1ibGUocmF0ZS0+aHdfdmFsdWUpKQorCQlpZiAocmF0ZS0+ZmxhZ3MgJiBJRUVFODAyMTFfVFhfUkNfVVNFX1NIT1JUX1BSRUFNQkxFKQogCQkJdHhkZXNjLT5zaWduYWwgfD0gMHgwODsKIAl9CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyeDAwdXNiLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyeDAwdXNiLmMKaW5kZXggODNkZjMxMi4uMGIyOWQ3NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0MngwMHVzYi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDJ4MDB1c2IuYwpAQCAtNDM0LDExICs0MzQsMTEgQEAKIAogCQlpZiAodXNiX2VuZHBvaW50X2lzX2J1bGtfaW4oZXBfZGVzYykpIHsKIAkJCXJ0MngwMHVzYl9hc3NpZ25fZW5kcG9pbnQocnQyeDAwZGV2LT5yeCwgZXBfZGVzYyk7Ci0JCX0gZWxzZSBpZiAodXNiX2VuZHBvaW50X2lzX2J1bGtfb3V0KGVwX2Rlc2MpKSB7CisJCX0gZWxzZSBpZiAodXNiX2VuZHBvaW50X2lzX2J1bGtfb3V0KGVwX2Rlc2MpICYmCisJCQkgICAocXVldWUgIT0gcXVldWVfZW5kKHJ0MngwMGRldikpKSB7CiAJCQlydDJ4MDB1c2JfYXNzaWduX2VuZHBvaW50KHF1ZXVlLCBlcF9kZXNjKTsKKwkJCXF1ZXVlID0gcXVldWVfbmV4dChxdWV1ZSk7CiAKLQkJCWlmIChxdWV1ZSAhPSBxdWV1ZV9lbmQocnQyeDAwZGV2KSkKLQkJCQlxdWV1ZSA9IHF1ZXVlX25leHQocXVldWUpOwogCQkJdHhfZXBfZGVzYyA9IGVwX2Rlc2M7CiAJCX0KIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQ3M3VzYi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0NzN1c2IuYwppbmRleCBkNjM4YThhLi45NmE4ZDY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQ3M3VzYi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDczdXNiLmMKQEAgLTIzMjEsNiArMjMyMSw3IEBACiAJLyogTGlua3N5cyAqLwogCXsgVVNCX0RFVklDRSgweDEzYjEsIDB4MDAyMCksIFVTQl9ERVZJQ0VfREFUQSgmcnQ3M3VzYl9vcHMpIH0sCiAJeyBVU0JfREVWSUNFKDB4MTNiMSwgMHgwMDIzKSwgVVNCX0RFVklDRV9EQVRBKCZydDczdXNiX29wcykgfSwKKwl7IFVTQl9ERVZJQ0UoMHgxM2IxLCAweDAwMjgpLCBVU0JfREVWSUNFX0RBVEEoJnJ0NzN1c2Jfb3BzKSB9LAogCS8qIE1TSSAqLwogCXsgVVNCX0RFVklDRSgweDBkYjAsIDB4Njg3NyksIFVTQl9ERVZJQ0VfREFUQSgmcnQ3M3VzYl9vcHMpIH0sCiAJeyBVU0JfREVWSUNFKDB4MGRiMCwgMHg2ODc0KSwgVVNCX0RFVklDRV9EQVRBKCZydDczdXNiX29wcykgfSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bDgxOHgvcnRsODE4MF9kZXYuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bDgxOHgvcnRsODE4MF9kZXYuYwppbmRleCA1Zjg4N2ZiLi4zODdjMTMzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGw4MTh4L3J0bDgxODBfZGV2LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsODE4eC9ydGw4MTgwX2Rldi5jCkBAIC04OTcsNiArODk3LDcgQEAKIAlkZXYtPmZsYWdzID0gSUVFRTgwMjExX0hXX0hPU1RfQlJPQURDQVNUX1BTX0JVRkZFUklORyB8CiAJCSAgICAgSUVFRTgwMjExX0hXX1JYX0lOQ0xVREVTX0ZDUyB8CiAJCSAgICAgSUVFRTgwMjExX0hXX1NJR05BTF9VTlNQRUM7CisJZGV2LT53aXBoeS0+aW50ZXJmYWNlX21vZGVzID0gQklUKE5MODAyMTFfSUZUWVBFX1NUQVRJT04pOwogCWRldi0+cXVldWVzID0gMTsKIAlkZXYtPm1heF9zaWduYWwgPSA2NTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsODE4eC9ydGw4MTg3X2Rldi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsODE4eC9ydGw4MTg3X2Rldi5jCmluZGV4IDAwY2UzZWYuLjZhZDZiYWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bDgxOHgvcnRsODE4N19kZXYuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGw4MTh4L3J0bDgxODdfZGV2LmMKQEAgLTIxMyw3ICsyMTMsNyBAQAogCXVyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0FUT01JQyk7CiAJaWYgKCF1cmIpIHsKIAkJa2ZyZWVfc2tiKHNrYik7Ci0JCXJldHVybiAtRU5PTUVNOworCQlyZXR1cm4gTkVUREVWX1RYX09LOwogCX0KIAogCWZsYWdzID0gc2tiLT5sZW47CkBAIC0yODEsNyArMjgxLDcgQEAKIAl9CiAJdXNiX2ZyZWVfdXJiKHVyYik7CiAKLQlyZXR1cm4gcmM7CisJcmV0dXJuIE5FVERFVl9UWF9PSzsKIH0KIAogc3RhdGljIHZvaWQgcnRsODE4N19yeF9jYihzdHJ1Y3QgdXJiICp1cmIpCkBAIC0xNDcxLDYgKzE0NzEsNyBAQAogCWllZWU4MDIxMV91bnJlZ2lzdGVyX2h3KGRldik7CiAKIAlwcml2ID0gZGV2LT5wcml2OworCXVzYl9yZXNldF9kZXZpY2UocHJpdi0+dWRldik7CiAJdXNiX3B1dF9kZXYoaW50ZXJmYWNlX3RvX3VzYmRldihpbnRmKSk7CiAJaWVlZTgwMjExX2ZyZWVfaHcoZGV2KTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3N0cmlwLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9zdHJpcC5jCmluZGV4IGRkMGRlM2EuLjcwMTVmMjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3N0cmlwLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvc3RyaXAuYwpAQCAtMjM2LDcgKzIzNiw3IEBACiAJdW5zaWduZWQgbG9uZyB0eF9lcnJvcnM7CS8qIFBsYW5uZWQgc3R1ZmYgICAgICAgICAgICAgICAgKi8KIAl1bnNpZ25lZCBsb25nIHJ4X2Ryb3BwZWQ7CS8qIE5vIG1lbW9yeSBmb3Igc2tiICAgICAgICAgICAgKi8KIAl1bnNpZ25lZCBsb25nIHR4X2Ryb3BwZWQ7CS8qIFdoZW4gTVRVIGNoYW5nZSAgICAgICAgICAgICAgKi8KLQl1bnNpZ25lZCBsb25nIHJ4X292ZXJfZXJyb3JzOwkvKiBGcmFtZSBiaWdnZXIgdGhlbiBTVFJJUCBidWYuICovCisJdW5zaWduZWQgbG9uZyByeF9vdmVyX2Vycm9yczsJLyogRnJhbWUgYmlnZ2VyIHRoYW4gU1RSSVAgYnVmLiAqLwogCiAJdW5zaWduZWQgbG9uZyBwcHNfdGltZXI7CS8qIFRpbWVyIHRvIGRldGVybWluZSBwcHMgICAgICAgKi8KIAl1bnNpZ25lZCBsb25nIHJ4X3Bwc19jb3VudDsJLyogQ291bnRlciB0byBkZXRlcm1pbmUgcHBzICAgICAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfbWFjLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF9tYWMuYwppbmRleCA5Y2FhOTZhLi5hNjExYWQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF9tYWMuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF9tYWMuYwpAQCAtMjg3LDcgKzI4Nyw3IEBACiAgKiBAc2tiIC0gYSBzay1idWZmZXIKICAqIEBmbGFnczogZXh0cmEgZmxhZ3MgdG8gc2V0IGluIHRoZSBUWCBzdGF0dXMgaW5mbwogICogQGFja3NzaTogQUNLIHNpZ25hbCBzdHJlbmd0aAotICogQHN1Y2Nlc3MgLSBUcnVlIGZvciBzdWNjZXNzZnVsbCB0cmFuc21pc3Npb24gb2YgdGhlIGZyYW1lCisgKiBAc3VjY2VzcyAtIFRydWUgZm9yIHN1Y2Nlc3NmdWwgdHJhbnNtaXNzaW9uIG9mIHRoZSBmcmFtZQogICoKICAqIFRoaXMgaW5mb3JtYXRpb24gY2FsbHMgaWVlZTgwMjExX3R4X3N0YXR1c19pcnFzYWZlKCkgaWYgcmVxdWlyZWQgYnkgdGhlCiAgKiBjb250cm9sIGluZm9ybWF0aW9uLiBJdCBjb3BpZXMgdGhlIGNvbnRyb2wgaW5mb3JtYXRpb24gaW50byB0aGUgc3RhdHVzCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC94ZW4tbmV0ZnJvbnQuYyBiL2RyaXZlcnMvbmV0L3hlbi1uZXRmcm9udC5jCmluZGV4IDc2MTYzNWIuLmNkNjE4NGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3hlbi1uZXRmcm9udC5jCisrKyBiL2RyaXZlcnMvbmV0L3hlbi1uZXRmcm9udC5jCkBAIC0xMTA1LDYgKzExMDUsMTYgQEAKIAlnbnR0YWJfZnJlZV9ncmFudF9yZWZlcmVuY2VzKG5wLT5ncmVmX3J4X2hlYWQpOwogfQogCitzdGF0aWMgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzIHhlbm5ldF9uZXRkZXZfb3BzID0geworCS5uZG9fb3BlbiAgICAgICAgICAgID0geGVubmV0X29wZW4sCisJLm5kb191bmluaXQgICAgICAgICAgPSB4ZW5uZXRfdW5pbml0LAorCS5uZG9fc3RvcCAgICAgICAgICAgID0geGVubmV0X2Nsb3NlLAorCS5uZG9fc3RhcnRfeG1pdCAgICAgID0geGVubmV0X3N0YXJ0X3htaXQsCisJLm5kb19jaGFuZ2VfbXR1CSAgICAgPSB4ZW5uZXRfY2hhbmdlX210dSwKKwkubmRvX3NldF9tYWNfYWRkcmVzcyA9IGV0aF9tYWNfYWRkciwKKwkubmRvX3ZhbGlkYXRlX2FkZHIgICA9IGV0aF92YWxpZGF0ZV9hZGRyLAorfTsKKwogc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlICogX19kZXZpbml0IHhlbm5ldF9jcmVhdGVfZGV2KHN0cnVjdCB4ZW5idXNfZGV2aWNlICpkZXYpCiB7CiAJaW50IGksIGVycjsKQEAgLTExNjEsMTIgKzExNzEsOSBAQAogCQlnb3RvIGV4aXRfZnJlZV90eDsKIAl9CiAKLQluZXRkZXYtPm9wZW4gICAgICAgICAgICA9IHhlbm5ldF9vcGVuOwotCW5ldGRldi0+aGFyZF9zdGFydF94bWl0ID0geGVubmV0X3N0YXJ0X3htaXQ7Ci0JbmV0ZGV2LT5zdG9wICAgICAgICAgICAgPSB4ZW5uZXRfY2xvc2U7CisJbmV0ZGV2LT5uZXRkZXZfb3BzCT0gJnhlbm5ldF9uZXRkZXZfb3BzOworCiAJbmV0aWZfbmFwaV9hZGQobmV0ZGV2LCAmbnAtPm5hcGksIHhlbm5ldF9wb2xsLCA2NCk7Ci0JbmV0ZGV2LT51bmluaXQgICAgICAgICAgPSB4ZW5uZXRfdW5pbml0OwotCW5ldGRldi0+Y2hhbmdlX210dQk9IHhlbm5ldF9jaGFuZ2VfbXR1OwogCW5ldGRldi0+ZmVhdHVyZXMgICAgICAgID0gTkVUSUZfRl9JUF9DU1VNOwogCiAJU0VUX0VUSFRPT0xfT1BTKG5ldGRldiwgJnhlbm5ldF9ldGh0b29sX29wcyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC95ZWxsb3dmaW4uYyBiL2RyaXZlcnMvbmV0L3llbGxvd2Zpbi5jCmluZGV4IGNmOTcxMjkuLjJmMTY0NWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3llbGxvd2Zpbi5jCisrKyBiL2RyaXZlcnMvbmV0L3llbGxvd2Zpbi5jCkBAIC0zNjIsNiArMzYyLDcgQEAKIAkubmRvX3NldF9tdWx0aWNhc3RfbGlzdCA9IHNldF9yeF9tb2RlLAogCS5uZG9fY2hhbmdlX210dQkJPSBldGhfY2hhbmdlX210dSwKIAkubmRvX3ZhbGlkYXRlX2FkZHIJPSBldGhfdmFsaWRhdGVfYWRkciwKKwkubmRvX3NldF9tYWNfYWRkcmVzcyAJPSBldGhfbWFjX2FkZHIsCiAJLm5kb19kb19pb2N0bCAJCT0gbmV0ZGV2X2lvY3RsLAogCS5uZG9fdHhfdGltZW91dCAJPSB5ZWxsb3dmaW5fdHhfdGltZW91dCwKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC96b3JybzgzOTAuYyBiL2RyaXZlcnMvbmV0L3pvcnJvODM5MC5jCmluZGV4IGFmZmQ5MDQuLjM3Yzg0ZTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3pvcnJvODM5MC5jCisrKyBiL2RyaXZlcnMvbmV0L3pvcnJvODM5MC5jCkBAIC0xNDcsNiArMTQ3LDcgQEAKIAkubmRvX2dldF9zdGF0cwkJPSBlaV9nZXRfc3RhdHMsCiAJLm5kb19zZXRfbXVsdGljYXN0X2xpc3QgPSBlaV9zZXRfbXVsdGljYXN0X2xpc3QsCiAJLm5kb192YWxpZGF0ZV9hZGRyCT0gZXRoX3ZhbGlkYXRlX2FkZHIsCisJLm5kb19zZXRfbWFjX2FkZHJlc3MgCT0gZXRoX21hY19hZGRyLAogCS5uZG9fY2hhbmdlX210dQkJPSBldGhfY2hhbmdlX210dSwKICNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgogCS5uZG9fcG9sbF9jb250cm9sbGVyCT0gZWlfcG9sbCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvb2Yvb2ZfaTJjLmMgYi9kcml2ZXJzL29mL29mX2kyYy5jCmluZGV4IGUxYjBhZDYuLmZhNjVhMmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvb2Yvb2ZfaTJjLmMKKysrIGIvZHJpdmVycy9vZi9vZl9pMmMuYwpAQCAtNjYsNCArNjYsMjMgQEAKIH0KIEVYUE9SVF9TWU1CT0wob2ZfcmVnaXN0ZXJfaTJjX2RldmljZXMpOwogCitzdGF0aWMgaW50IG9mX2Rldl9ub2RlX21hdGNoKHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqZGF0YSkKK3sKKyAgICAgICAgcmV0dXJuIGRldl9hcmNoZGF0YV9nZXRfbm9kZSgmZGV2LT5hcmNoZGF0YSkgPT0gZGF0YTsKK30KKworLyogbXVzdCBjYWxsIHB1dF9kZXZpY2UoKSB3aGVuIGRvbmUgd2l0aCByZXR1cm5lZCBpMmNfY2xpZW50IGRldmljZSAqLworc3RydWN0IGkyY19jbGllbnQgKm9mX2ZpbmRfaTJjX2RldmljZV9ieV9ub2RlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisKKwlkZXYgPSBidXNfZmluZF9kZXZpY2UoJmkyY19idXNfdHlwZSwgTlVMTCwgbm9kZSwKKwkJCQkJIG9mX2Rldl9ub2RlX21hdGNoKTsKKwlpZiAoIWRldikKKwkJcmV0dXJuIE5VTEw7CisKKwlyZXR1cm4gdG9faTJjX2NsaWVudChkZXYpOworfQorRVhQT1JUX1NZTUJPTChvZl9maW5kX2kyY19kZXZpY2VfYnlfbm9kZSk7CisKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvb3Byb2ZpbGUvYnVmZmVyX3N5bmMuYyBiL2RyaXZlcnMvb3Byb2ZpbGUvYnVmZmVyX3N5bmMuYwppbmRleCA2NWU4Mjk0Li45ZGE1YTRiIDEwMDY0NAotLS0gYS9kcml2ZXJzL29wcm9maWxlL2J1ZmZlcl9zeW5jLmMKKysrIGIvZHJpdmVycy9vcHJvZmlsZS9idWZmZXJfc3luYy5jCkBAIC0xLDExICsxLDEyIEBACiAvKioKICAqIEBmaWxlIGJ1ZmZlcl9zeW5jLmMKICAqCi0gKiBAcmVtYXJrIENvcHlyaWdodCAyMDAyIE9Qcm9maWxlIGF1dGhvcnMKKyAqIEByZW1hcmsgQ29weXJpZ2h0IDIwMDItMjAwOSBPUHJvZmlsZSBhdXRob3JzCiAgKiBAcmVtYXJrIFJlYWQgdGhlIGZpbGUgQ09QWUlORwogICoKICAqIEBhdXRob3IgSm9obiBMZXZvbiA8bGV2b25AbW92ZW1lbnRhcmlhbi5vcmc+CiAgKiBAYXV0aG9yIEJhcnJ5IEthc2luZG9yZgorICogQGF1dGhvciBSb2JlcnQgUmljaHRlciA8cm9iZXJ0LnJpY2h0ZXJAYW1kLmNvbT4KICAqCiAgKiBUaGlzIGlzIHRoZSBjb3JlIG9mIHRoZSBidWZmZXIgbWFuYWdlbWVudC4gRWFjaAogICogQ1BVIGJ1ZmZlciBpcyBwcm9jZXNzZWQgYW5kIGVudGVyZWQgaW50byB0aGUKQEAgLTMxNSw4OCArMzE2LDczIEBACiAJYWRkX2V2ZW50X2VudHJ5KFRSQUNFX0JFR0lOX0NPREUpOwogfQogCi0jaWZkZWYgQ09ORklHX09QUk9GSUxFX0lCUwotCi0jZGVmaW5lIElCU19GRVRDSF9DT0RFX1NJWkUJMgotI2RlZmluZSBJQlNfT1BfQ09ERV9TSVpFCTUKLQotLyoKLSAqIEFkZCBJQlMgZmV0Y2ggYW5kIG9wIGVudHJpZXMgdG8gZXZlbnQgYnVmZmVyCi0gKi8KLXN0YXRpYyB2b2lkIGFkZF9pYnNfYmVnaW4oaW50IGNwdSwgaW50IGNvZGUsIHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKQorc3RhdGljIHZvaWQgYWRkX2RhdGEoc3RydWN0IG9wX2VudHJ5ICplbnRyeSwgc3RydWN0IG1tX3N0cnVjdCAqbW0pCiB7Ci0JdW5zaWduZWQgbG9uZyByaXA7Ci0JaW50IGksIGNvdW50OwotCXVuc2lnbmVkIGxvbmcgaWJzX2Nvb2tpZSA9IDA7CisJdW5zaWduZWQgbG9uZyBjb2RlLCBwYywgdmFsOworCXVuc2lnbmVkIGxvbmcgY29va2llOwogCW9mZl90IG9mZnNldDsKLQlzdHJ1Y3Qgb3Bfc2FtcGxlICpzYW1wbGU7CiAKLQlzYW1wbGUgPSBjcHVfYnVmZmVyX3JlYWRfZW50cnkoY3B1KTsKLQlpZiAoIXNhbXBsZSkKLQkJZ290byBFcnJvcjsKLQlyaXAgPSBzYW1wbGUtPmVpcDsKLQotI2lmZGVmIF9fTFA2NF9fCi0JcmlwICs9IHNhbXBsZS0+ZXZlbnQgPDwgMzI7Ci0jZW5kaWYKKwlpZiAoIW9wX2NwdV9idWZmZXJfZ2V0X2RhdGEoZW50cnksICZjb2RlKSkKKwkJcmV0dXJuOworCWlmICghb3BfY3B1X2J1ZmZlcl9nZXRfZGF0YShlbnRyeSwgJnBjKSkKKwkJcmV0dXJuOworCWlmICghb3BfY3B1X2J1ZmZlcl9nZXRfc2l6ZShlbnRyeSkpCisJCXJldHVybjsKIAogCWlmIChtbSkgewotCQlpYnNfY29va2llID0gbG9va3VwX2Rjb29raWUobW0sIHJpcCwgJm9mZnNldCk7CisJCWNvb2tpZSA9IGxvb2t1cF9kY29va2llKG1tLCBwYywgJm9mZnNldCk7CiAKLQkJaWYgKGlic19jb29raWUgPT0gTk9fQ09PS0lFKQotCQkJb2Zmc2V0ID0gcmlwOwotCQlpZiAoaWJzX2Nvb2tpZSA9PSBJTlZBTElEX0NPT0tJRSkgeworCQlpZiAoY29va2llID09IE5PX0NPT0tJRSkKKwkJCW9mZnNldCA9IHBjOworCQlpZiAoY29va2llID09IElOVkFMSURfQ09PS0lFKSB7CiAJCQlhdG9taWNfaW5jKCZvcHJvZmlsZV9zdGF0cy5zYW1wbGVfbG9zdF9ub19tYXBwaW5nKTsKLQkJCW9mZnNldCA9IHJpcDsKKwkJCW9mZnNldCA9IHBjOwogCQl9Ci0JCWlmIChpYnNfY29va2llICE9IGxhc3RfY29va2llKSB7Ci0JCQlhZGRfY29va2llX3N3aXRjaChpYnNfY29va2llKTsKLQkJCWxhc3RfY29va2llID0gaWJzX2Nvb2tpZTsKKwkJaWYgKGNvb2tpZSAhPSBsYXN0X2Nvb2tpZSkgeworCQkJYWRkX2Nvb2tpZV9zd2l0Y2goY29va2llKTsKKwkJCWxhc3RfY29va2llID0gY29va2llOwogCQl9CiAJfSBlbHNlCi0JCW9mZnNldCA9IHJpcDsKKwkJb2Zmc2V0ID0gcGM7CiAKIAlhZGRfZXZlbnRfZW50cnkoRVNDQVBFX0NPREUpOwogCWFkZF9ldmVudF9lbnRyeShjb2RlKTsKIAlhZGRfZXZlbnRfZW50cnkob2Zmc2V0KTsJLyogT2Zmc2V0IGZyb20gRGNvb2tpZSAqLwogCi0JLyogd2Ugc2VuZCB0aGUgRGNvb2tpZSBvZmZzZXQsIGJ1dCBzZW5kIHRoZSByYXcgTGluZWFyIEFkZCBhbHNvKi8KLQlhZGRfZXZlbnRfZW50cnkoc2FtcGxlLT5laXApOwotCWFkZF9ldmVudF9lbnRyeShzYW1wbGUtPmV2ZW50KTsKLQotCWlmIChjb2RlID09IElCU19GRVRDSF9DT0RFKQotCQljb3VudCA9IElCU19GRVRDSF9DT0RFX1NJWkU7CS8qSUJTIEZFVENIIGlzIDIgaW50NjRzKi8KLQllbHNlCi0JCWNvdW50ID0gSUJTX09QX0NPREVfU0laRTsJLypJQlMgT1AgaXMgNSBpbnQ2NHMqLwotCi0JZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLQkJc2FtcGxlID0gY3B1X2J1ZmZlcl9yZWFkX2VudHJ5KGNwdSk7Ci0JCWlmICghc2FtcGxlKQotCQkJZ290byBFcnJvcjsKLQkJYWRkX2V2ZW50X2VudHJ5KHNhbXBsZS0+ZWlwKTsKLQkJYWRkX2V2ZW50X2VudHJ5KHNhbXBsZS0+ZXZlbnQpOwotCX0KLQotCXJldHVybjsKLQotRXJyb3I6Ci0JcmV0dXJuOworCXdoaWxlIChvcF9jcHVfYnVmZmVyX2dldF9kYXRhKGVudHJ5LCAmdmFsKSkKKwkJYWRkX2V2ZW50X2VudHJ5KHZhbCk7CiB9CiAKLSNlbmRpZgotCi1zdGF0aWMgdm9pZCBhZGRfc2FtcGxlX2VudHJ5KHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCB1bnNpZ25lZCBsb25nIGV2ZW50KQorc3RhdGljIGlubGluZSB2b2lkIGFkZF9zYW1wbGVfZW50cnkodW5zaWduZWQgbG9uZyBvZmZzZXQsIHVuc2lnbmVkIGxvbmcgZXZlbnQpCiB7CiAJYWRkX2V2ZW50X2VudHJ5KG9mZnNldCk7CiAJYWRkX2V2ZW50X2VudHJ5KGV2ZW50KTsKIH0KIAogCi1zdGF0aWMgaW50IGFkZF91c19zYW1wbGUoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHN0cnVjdCBvcF9zYW1wbGUgKnMpCisvKgorICogQWRkIGEgc2FtcGxlIHRvIHRoZSBnbG9iYWwgZXZlbnQgYnVmZmVyLiBJZiBwb3NzaWJsZSB0aGUKKyAqIHNhbXBsZSBpcyBjb252ZXJ0ZWQgaW50byBhIHBlcnNpc3RlbnQgZGVudHJ5L29mZnNldCBwYWlyCisgKiBmb3IgbGF0ZXIgbG9va3VwIGZyb20gdXNlcnNwYWNlLiBSZXR1cm4gMCBvbiBmYWlsdXJlLgorICovCitzdGF0aWMgaW50CithZGRfc2FtcGxlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBzdHJ1Y3Qgb3Bfc2FtcGxlICpzLCBpbnQgaW5fa2VybmVsKQogewogCXVuc2lnbmVkIGxvbmcgY29va2llOwogCW9mZl90IG9mZnNldDsKIAorCWlmIChpbl9rZXJuZWwpIHsKKwkJYWRkX3NhbXBsZV9lbnRyeShzLT5laXAsIHMtPmV2ZW50KTsKKwkJcmV0dXJuIDE7CisJfQorCisJLyogYWRkIHVzZXJzcGFjZSBzYW1wbGUgKi8KKworCWlmICghbW0pIHsKKwkJYXRvbWljX2luYygmb3Byb2ZpbGVfc3RhdHMuc2FtcGxlX2xvc3Rfbm9fbW0pOworCQlyZXR1cm4gMDsKKwl9CisKIAljb29raWUgPSBsb29rdXBfZGNvb2tpZShtbSwgcy0+ZWlwLCAmb2Zmc2V0KTsKIAogCWlmIChjb29raWUgPT0gSU5WQUxJRF9DT09LSUUpIHsKQEAgLTQxNSwyNSArNDAxLDYgQEAKIH0KIAogCi0vKiBBZGQgYSBzYW1wbGUgdG8gdGhlIGdsb2JhbCBldmVudCBidWZmZXIuIElmIHBvc3NpYmxlIHRoZQotICogc2FtcGxlIGlzIGNvbnZlcnRlZCBpbnRvIGEgcGVyc2lzdGVudCBkZW50cnkvb2Zmc2V0IHBhaXIKLSAqIGZvciBsYXRlciBsb29rdXAgZnJvbSB1c2Vyc3BhY2UuCi0gKi8KLXN0YXRpYyBpbnQKLWFkZF9zYW1wbGUoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHN0cnVjdCBvcF9zYW1wbGUgKnMsIGludCBpbl9rZXJuZWwpCi17Ci0JaWYgKGluX2tlcm5lbCkgewotCQlhZGRfc2FtcGxlX2VudHJ5KHMtPmVpcCwgcy0+ZXZlbnQpOwotCQlyZXR1cm4gMTsKLQl9IGVsc2UgaWYgKG1tKSB7Ci0JCXJldHVybiBhZGRfdXNfc2FtcGxlKG1tLCBzKTsKLQl9IGVsc2UgewotCQlhdG9taWNfaW5jKCZvcHJvZmlsZV9zdGF0cy5zYW1wbGVfbG9zdF9ub19tbSk7Ci0JfQotCXJldHVybiAwOwotfQotCi0KIHN0YXRpYyB2b2lkIHJlbGVhc2VfbW0oc3RydWN0IG1tX3N0cnVjdCAqbW0pCiB7CiAJaWYgKCFtbSkKQEAgLTUyNiw2NiArNDkzLDY5IEBACiB7CiAJc3RydWN0IG1tX3N0cnVjdCAqbW0gPSBOVUxMOwogCXN0cnVjdCBtbV9zdHJ1Y3QgKm9sZG1tOworCXVuc2lnbmVkIGxvbmcgdmFsOwogCXN0cnVjdCB0YXNrX3N0cnVjdCAqbmV3OwogCXVuc2lnbmVkIGxvbmcgY29va2llID0gMDsKIAlpbnQgaW5fa2VybmVsID0gMTsKIAlzeW5jX2J1ZmZlcl9zdGF0ZSBzdGF0ZSA9IHNiX2J1ZmZlcl9zdGFydDsKIAl1bnNpZ25lZCBpbnQgaTsKIAl1bnNpZ25lZCBsb25nIGF2YWlsYWJsZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBvcF9lbnRyeSBlbnRyeTsKKwlzdHJ1Y3Qgb3Bfc2FtcGxlICpzYW1wbGU7CiAKIAltdXRleF9sb2NrKCZidWZmZXJfbXV0ZXgpOwogCiAJYWRkX2NwdV9zd2l0Y2goY3B1KTsKIAotCWNwdV9idWZmZXJfcmVzZXQoY3B1KTsKLQlhdmFpbGFibGUgPSBjcHVfYnVmZmVyX2VudHJpZXMoY3B1KTsKKwlvcF9jcHVfYnVmZmVyX3Jlc2V0KGNwdSk7CisJYXZhaWxhYmxlID0gb3BfY3B1X2J1ZmZlcl9lbnRyaWVzKGNwdSk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgYXZhaWxhYmxlOyArK2kpIHsKLQkJc3RydWN0IG9wX3NhbXBsZSAqcyA9IGNwdV9idWZmZXJfcmVhZF9lbnRyeShjcHUpOwotCQlpZiAoIXMpCisJCXNhbXBsZSA9IG9wX2NwdV9idWZmZXJfcmVhZF9lbnRyeSgmZW50cnksIGNwdSk7CisJCWlmICghc2FtcGxlKQogCQkJYnJlYWs7CiAKLQkJaWYgKGlzX2NvZGUocy0+ZWlwKSkgewotCQkJc3dpdGNoIChzLT5ldmVudCkgewotCQkJY2FzZSAwOgotCQkJY2FzZSBDUFVfSVNfS0VSTkVMOgotCQkJCS8qIGtlcm5lbC91c2Vyc3BhY2Ugc3dpdGNoICovCi0JCQkJaW5fa2VybmVsID0gcy0+ZXZlbnQ7Ci0JCQkJaWYgKHN0YXRlID09IHNiX2J1ZmZlcl9zdGFydCkKLQkJCQkJc3RhdGUgPSBzYl9zYW1wbGVfc3RhcnQ7Ci0JCQkJYWRkX2tlcm5lbF9jdHhfc3dpdGNoKHMtPmV2ZW50KTsKLQkJCQlicmVhazsKLQkJCWNhc2UgQ1BVX1RSQUNFX0JFR0lOOgorCQlpZiAoaXNfY29kZShzYW1wbGUtPmVpcCkpIHsKKwkJCWZsYWdzID0gc2FtcGxlLT5ldmVudDsKKwkJCWlmIChmbGFncyAmIFRSQUNFX0JFR0lOKSB7CiAJCQkJc3RhdGUgPSBzYl9idF9zdGFydDsKIAkJCQlhZGRfdHJhY2VfYmVnaW4oKTsKLQkJCQlicmVhazsKLSNpZmRlZiBDT05GSUdfT1BST0ZJTEVfSUJTCi0JCQljYXNlIElCU19GRVRDSF9CRUdJTjoKLQkJCQlzdGF0ZSA9IHNiX2J0X3N0YXJ0OwotCQkJCWFkZF9pYnNfYmVnaW4oY3B1LCBJQlNfRkVUQ0hfQ09ERSwgbW0pOwotCQkJCWJyZWFrOwotCQkJY2FzZSBJQlNfT1BfQkVHSU46Ci0JCQkJc3RhdGUgPSBzYl9idF9zdGFydDsKLQkJCQlhZGRfaWJzX2JlZ2luKGNwdSwgSUJTX09QX0NPREUsIG1tKTsKLQkJCQlicmVhazsKLSNlbmRpZgotCQkJZGVmYXVsdDoKKwkJCX0KKwkJCWlmIChmbGFncyAmIEtFUk5FTF9DVFhfU1dJVENIKSB7CisJCQkJLyoga2VybmVsL3VzZXJzcGFjZSBzd2l0Y2ggKi8KKwkJCQlpbl9rZXJuZWwgPSBmbGFncyAmIElTX0tFUk5FTDsKKwkJCQlpZiAoc3RhdGUgPT0gc2JfYnVmZmVyX3N0YXJ0KQorCQkJCQlzdGF0ZSA9IHNiX3NhbXBsZV9zdGFydDsKKwkJCQlhZGRfa2VybmVsX2N0eF9zd2l0Y2goZmxhZ3MgJiBJU19LRVJORUwpOworCQkJfQorCQkJaWYgKGZsYWdzICYgVVNFUl9DVFhfU1dJVENICisJCQkgICAgJiYgb3BfY3B1X2J1ZmZlcl9nZXRfZGF0YSgmZW50cnksICZ2YWwpKSB7CiAJCQkJLyogdXNlcnNwYWNlIGNvbnRleHQgc3dpdGNoICovCisJCQkJbmV3ID0gKHN0cnVjdCB0YXNrX3N0cnVjdCAqKXZhbDsKIAkJCQlvbGRtbSA9IG1tOwotCQkJCW5ldyA9IChzdHJ1Y3QgdGFza19zdHJ1Y3QgKilzLT5ldmVudDsKIAkJCQlyZWxlYXNlX21tKG9sZG1tKTsKIAkJCQltbSA9IHRha2VfdGFza3NfbW0obmV3KTsKIAkJCQlpZiAobW0gIT0gb2xkbW0pCiAJCQkJCWNvb2tpZSA9IGdldF9leGVjX2Rjb29raWUobW0pOwogCQkJCWFkZF91c2VyX2N0eF9zd2l0Y2gobmV3LCBjb29raWUpOwotCQkJCWJyZWFrOwogCQkJfQotCQl9IGVsc2UgaWYgKHN0YXRlID49IHNiX2J0X3N0YXJ0ICYmCi0JCQkgICAhYWRkX3NhbXBsZShtbSwgcywgaW5fa2VybmVsKSkgewotCQkJaWYgKHN0YXRlID09IHNiX2J0X3N0YXJ0KSB7Ci0JCQkJc3RhdGUgPSBzYl9idF9pZ25vcmU7Ci0JCQkJYXRvbWljX2luYygmb3Byb2ZpbGVfc3RhdHMuYnRfbG9zdF9ub19tYXBwaW5nKTsKLQkJCX0KKwkJCWlmIChvcF9jcHVfYnVmZmVyX2dldF9zaXplKCZlbnRyeSkpCisJCQkJYWRkX2RhdGEoJmVudHJ5LCBtbSk7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmIChzdGF0ZSA8IHNiX2J0X3N0YXJ0KQorCQkJLyogaWdub3JlIHNhbXBsZSAqLworCQkJY29udGludWU7CisKKwkJaWYgKGFkZF9zYW1wbGUobW0sIHNhbXBsZSwgaW5fa2VybmVsKSkKKwkJCWNvbnRpbnVlOworCisJCS8qIGlnbm9yZSBiYWNrdHJhY2VzIGlmIGZhaWxlZCB0byBhZGQgYSBzYW1wbGUgKi8KKwkJaWYgKHN0YXRlID09IHNiX2J0X3N0YXJ0KSB7CisJCQlzdGF0ZSA9IHNiX2J0X2lnbm9yZTsKKwkJCWF0b21pY19pbmMoJm9wcm9maWxlX3N0YXRzLmJ0X2xvc3Rfbm9fbWFwcGluZyk7CiAJCX0KIAl9CiAJcmVsZWFzZV9tbShtbSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL29wcm9maWxlL2NwdV9idWZmZXIuYyBiL2RyaXZlcnMvb3Byb2ZpbGUvY3B1X2J1ZmZlci5jCmluZGV4IDYxMDkwOTYuLjJlMDNiNmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvb3Byb2ZpbGUvY3B1X2J1ZmZlci5jCisrKyBiL2RyaXZlcnMvb3Byb2ZpbGUvY3B1X2J1ZmZlci5jCkBAIC0xLDExICsxLDEyIEBACiAvKioKICAqIEBmaWxlIGNwdV9idWZmZXIuYwogICoKLSAqIEByZW1hcmsgQ29weXJpZ2h0IDIwMDIgT1Byb2ZpbGUgYXV0aG9ycworICogQHJlbWFyayBDb3B5cmlnaHQgMjAwMi0yMDA5IE9Qcm9maWxlIGF1dGhvcnMKICAqIEByZW1hcmsgUmVhZCB0aGUgZmlsZSBDT1BZSU5HCiAgKgogICogQGF1dGhvciBKb2huIExldm9uIDxsZXZvbkBtb3ZlbWVudGFyaWFuLm9yZz4KICAqIEBhdXRob3IgQmFycnkgS2FzaW5kb3JmIDxiYXJyeS5rYXNpbmRvcmZAYW1kLmNvbT4KKyAqIEBhdXRob3IgUm9iZXJ0IFJpY2h0ZXIgPHJvYmVydC5yaWNodGVyQGFtZC5jb20+CiAgKgogICogRWFjaCBDUFUgaGFzIGEgbG9jYWwgYnVmZmVyIHRoYXQgc3RvcmVzIFBDIHZhbHVlL2V2ZW50CiAgKiBwYWlycy4gV2UgYWxzbyBsb2cgY29udGV4dCBzd2l0Y2hlcyB3aGVuIHdlIG5vdGljZSB0aGVtLgpAQCAtNDUsOCArNDYsOCBAQAogICogY2FuIGJlIGNoYW5nZWQgdG8gYSBzaW5nbGUgYnVmZmVyIHNvbHV0aW9uIHdoZW4gdGhlIHJpbmcgYnVmZmVyCiAgKiBhY2Nlc3MgaXMgaW1wbGVtZW50ZWQgYXMgbm9uLWxvY2tpbmcgYXRvbWljIGNvZGUuCiAgKi8KLXN0cnVjdCByaW5nX2J1ZmZlciAqb3BfcmluZ19idWZmZXJfcmVhZDsKLXN0cnVjdCByaW5nX2J1ZmZlciAqb3BfcmluZ19idWZmZXJfd3JpdGU7CitzdGF0aWMgc3RydWN0IHJpbmdfYnVmZmVyICpvcF9yaW5nX2J1ZmZlcl9yZWFkOworc3RhdGljIHN0cnVjdCByaW5nX2J1ZmZlciAqb3BfcmluZ19idWZmZXJfd3JpdGU7CiBERUZJTkVfUEVSX0NQVShzdHJ1Y3Qgb3Byb2ZpbGVfY3B1X2J1ZmZlciwgY3B1X2J1ZmZlcik7CiAKIHN0YXRpYyB2b2lkIHdxX3N5bmNfYnVmZmVyKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CkBAIC01NCw2ICs1NSwxOSBAQAogI2RlZmluZSBERUZBVUxUX1RJTUVSX0VYUElSRSAoSFogLyAxMCkKIHN0YXRpYyBpbnQgd29ya19lbmFibGVkOwogCit1bnNpZ25lZCBsb25nIG9wcm9maWxlX2dldF9jcHVfYnVmZmVyX3NpemUodm9pZCkKK3sKKwlyZXR1cm4gb3Byb2ZpbGVfY3B1X2J1ZmZlcl9zaXplOworfQorCit2b2lkIG9wcm9maWxlX2NwdV9idWZmZXJfaW5jX3NtcGxfbG9zdCh2b2lkKQoreworCXN0cnVjdCBvcHJvZmlsZV9jcHVfYnVmZmVyICpjcHVfYnVmCisJCT0gJl9fZ2V0X2NwdV92YXIoY3B1X2J1ZmZlcik7CisKKwljcHVfYnVmLT5zYW1wbGVfbG9zdF9vdmVyZmxvdysrOworfQorCiB2b2lkIGZyZWVfY3B1X2J1ZmZlcnModm9pZCkKIHsKIAlpZiAob3BfcmluZ19idWZmZXJfcmVhZCkKQEAgLTY0LDI0ICs3OCwxMSBAQAogCW9wX3JpbmdfYnVmZmVyX3dyaXRlID0gTlVMTDsKIH0KIAotdW5zaWduZWQgbG9uZyBvcHJvZmlsZV9nZXRfY3B1X2J1ZmZlcl9zaXplKHZvaWQpCi17Ci0JcmV0dXJuIGZzX2NwdV9idWZmZXJfc2l6ZTsKLX0KLQotdm9pZCBvcHJvZmlsZV9jcHVfYnVmZmVyX2luY19zbXBsX2xvc3Qodm9pZCkKLXsKLQlzdHJ1Y3Qgb3Byb2ZpbGVfY3B1X2J1ZmZlciAqY3B1X2J1ZgotCQk9ICZfX2dldF9jcHVfdmFyKGNwdV9idWZmZXIpOwotCi0JY3B1X2J1Zi0+c2FtcGxlX2xvc3Rfb3ZlcmZsb3crKzsKLX0KLQogaW50IGFsbG9jX2NwdV9idWZmZXJzKHZvaWQpCiB7CiAJaW50IGk7CiAKLQl1bnNpZ25lZCBsb25nIGJ1ZmZlcl9zaXplID0gZnNfY3B1X2J1ZmZlcl9zaXplOworCXVuc2lnbmVkIGxvbmcgYnVmZmVyX3NpemUgPSBvcHJvZmlsZV9jcHVfYnVmZmVyX3NpemU7CiAKIAlvcF9yaW5nX2J1ZmZlcl9yZWFkID0gcmluZ19idWZmZXJfYWxsb2MoYnVmZmVyX3NpemUsIE9QX0JVRkZFUl9GTEFHUyk7CiAJaWYgKCFvcF9yaW5nX2J1ZmZlcl9yZWFkKQpAQCAtOTcsOCArOTgsNiBAQAogCQliLT5sYXN0X2lzX2tlcm5lbCA9IC0xOwogCQliLT50cmFjaW5nID0gMDsKIAkJYi0+YnVmZmVyX3NpemUgPSBidWZmZXJfc2l6ZTsKLQkJYi0+dGFpbF9wb3MgPSAwOwotCQliLT5oZWFkX3BvcyA9IDA7CiAJCWItPnNhbXBsZV9yZWNlaXZlZCA9IDA7CiAJCWItPnNhbXBsZV9sb3N0X292ZXJmbG93ID0gMDsKIAkJYi0+YmFja3RyYWNlX2Fib3J0ZWQgPSAwOwpAQCAtMTQ1LDQ3ICsxNDQsMTU2IEBACiAJZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsKIH0KIAotc3RhdGljIGlubGluZSBpbnQKLWFkZF9zYW1wbGUoc3RydWN0IG9wcm9maWxlX2NwdV9idWZmZXIgKmNwdV9idWYsCi0JICAgdW5zaWduZWQgbG9uZyBwYywgdW5zaWduZWQgbG9uZyBldmVudCkKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIHByZXBhcmVzIHRoZSBjcHUgYnVmZmVyIHRvIHdyaXRlIGEgc2FtcGxlLgorICoKKyAqIFN0cnVjdCBvcF9lbnRyeSBpcyB1c2VkIGR1cmluZyBvcGVyYXRpb25zIG9uIHRoZSByaW5nIGJ1ZmZlciB3aGlsZQorICogc3RydWN0IG9wX3NhbXBsZSBjb250YWlucyB0aGUgZGF0YSB0aGF0IGlzIHN0b3JlZCBpbiB0aGUgcmluZworICogYnVmZmVyLiBTdHJ1Y3QgZW50cnkgY2FuIGJlIHVuaW5pdGlhbGl6ZWQuIFRoZSBmdW5jdGlvbiByZXNlcnZlcyBhCisgKiBkYXRhIGFycmF5IHRoYXQgaXMgc3BlY2lmaWVkIGJ5IHNpemUuIFVzZQorICogb3BfY3B1X2J1ZmZlcl93cml0ZV9jb21taXQoKSBhZnRlciBwcmVwYXJpbmcgdGhlIHNhbXBsZS4gSW4gY2FzZSBvZgorICogZXJyb3JzIGEgbnVsbCBwb2ludGVyIGlzIHJldHVybmVkLCBvdGhlcndpc2UgdGhlIHBvaW50ZXIgdG8gdGhlCisgKiBzYW1wbGUuCisgKgorICovCitzdHJ1Y3Qgb3Bfc2FtcGxlCisqb3BfY3B1X2J1ZmZlcl93cml0ZV9yZXNlcnZlKHN0cnVjdCBvcF9lbnRyeSAqZW50cnksIHVuc2lnbmVkIGxvbmcgc2l6ZSkKK3sKKwllbnRyeS0+ZXZlbnQgPSByaW5nX2J1ZmZlcl9sb2NrX3Jlc2VydmUKKwkJKG9wX3JpbmdfYnVmZmVyX3dyaXRlLCBzaXplb2Yoc3RydWN0IG9wX3NhbXBsZSkgKworCQkgc2l6ZSAqIHNpemVvZihlbnRyeS0+c2FtcGxlLT5kYXRhWzBdKSwgJmVudHJ5LT5pcnFfZmxhZ3MpOworCWlmIChlbnRyeS0+ZXZlbnQpCisJCWVudHJ5LT5zYW1wbGUgPSByaW5nX2J1ZmZlcl9ldmVudF9kYXRhKGVudHJ5LT5ldmVudCk7CisJZWxzZQorCQllbnRyeS0+c2FtcGxlID0gTlVMTDsKKworCWlmICghZW50cnktPnNhbXBsZSkKKwkJcmV0dXJuIE5VTEw7CisKKwllbnRyeS0+c2l6ZSA9IHNpemU7CisJZW50cnktPmRhdGEgPSBlbnRyeS0+c2FtcGxlLT5kYXRhOworCisJcmV0dXJuIGVudHJ5LT5zYW1wbGU7Cit9CisKK2ludCBvcF9jcHVfYnVmZmVyX3dyaXRlX2NvbW1pdChzdHJ1Y3Qgb3BfZW50cnkgKmVudHJ5KQoreworCXJldHVybiByaW5nX2J1ZmZlcl91bmxvY2tfY29tbWl0KG9wX3JpbmdfYnVmZmVyX3dyaXRlLCBlbnRyeS0+ZXZlbnQsCisJCQkJCSBlbnRyeS0+aXJxX2ZsYWdzKTsKK30KKworc3RydWN0IG9wX3NhbXBsZSAqb3BfY3B1X2J1ZmZlcl9yZWFkX2VudHJ5KHN0cnVjdCBvcF9lbnRyeSAqZW50cnksIGludCBjcHUpCit7CisJc3RydWN0IHJpbmdfYnVmZmVyX2V2ZW50ICplOworCWUgPSByaW5nX2J1ZmZlcl9jb25zdW1lKG9wX3JpbmdfYnVmZmVyX3JlYWQsIGNwdSwgTlVMTCk7CisJaWYgKGUpCisJCWdvdG8gZXZlbnQ7CisJaWYgKHJpbmdfYnVmZmVyX3N3YXBfY3B1KG9wX3JpbmdfYnVmZmVyX3JlYWQsCisJCQkJIG9wX3JpbmdfYnVmZmVyX3dyaXRlLAorCQkJCSBjcHUpKQorCQlyZXR1cm4gTlVMTDsKKwllID0gcmluZ19idWZmZXJfY29uc3VtZShvcF9yaW5nX2J1ZmZlcl9yZWFkLCBjcHUsIE5VTEwpOworCWlmIChlKQorCQlnb3RvIGV2ZW50OworCXJldHVybiBOVUxMOworCitldmVudDoKKwllbnRyeS0+ZXZlbnQgPSBlOworCWVudHJ5LT5zYW1wbGUgPSByaW5nX2J1ZmZlcl9ldmVudF9kYXRhKGUpOworCWVudHJ5LT5zaXplID0gKHJpbmdfYnVmZmVyX2V2ZW50X2xlbmd0aChlKSAtIHNpemVvZihzdHJ1Y3Qgb3Bfc2FtcGxlKSkKKwkJLyBzaXplb2YoZW50cnktPnNhbXBsZS0+ZGF0YVswXSk7CisJZW50cnktPmRhdGEgPSBlbnRyeS0+c2FtcGxlLT5kYXRhOworCXJldHVybiBlbnRyeS0+c2FtcGxlOworfQorCit1bnNpZ25lZCBsb25nIG9wX2NwdV9idWZmZXJfZW50cmllcyhpbnQgY3B1KQoreworCXJldHVybiByaW5nX2J1ZmZlcl9lbnRyaWVzX2NwdShvcF9yaW5nX2J1ZmZlcl9yZWFkLCBjcHUpCisJCSsgcmluZ19idWZmZXJfZW50cmllc19jcHUob3BfcmluZ19idWZmZXJfd3JpdGUsIGNwdSk7Cit9CisKK3N0YXRpYyBpbnQKK29wX2FkZF9jb2RlKHN0cnVjdCBvcHJvZmlsZV9jcHVfYnVmZmVyICpjcHVfYnVmLCB1bnNpZ25lZCBsb25nIGJhY2t0cmFjZSwKKwkgICAgaW50IGlzX2tlcm5lbCwgc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKQogewogCXN0cnVjdCBvcF9lbnRyeSBlbnRyeTsKLQlpbnQgcmV0OworCXN0cnVjdCBvcF9zYW1wbGUgKnNhbXBsZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBzaXplOwogCi0JcmV0ID0gY3B1X2J1ZmZlcl93cml0ZV9lbnRyeSgmZW50cnkpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7CisJZmxhZ3MgPSAwOwogCi0JZW50cnkuc2FtcGxlLT5laXAgPSBwYzsKLQllbnRyeS5zYW1wbGUtPmV2ZW50ID0gZXZlbnQ7CisJaWYgKGJhY2t0cmFjZSkKKwkJZmxhZ3MgfD0gVFJBQ0VfQkVHSU47CiAKLQlyZXQgPSBjcHVfYnVmZmVyX3dyaXRlX2NvbW1pdCgmZW50cnkpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7CisJLyogbm90aWNlIGEgc3dpdGNoIGZyb20gdXNlci0+a2VybmVsIG9yIHZpY2UgdmVyc2EgKi8KKwlpc19rZXJuZWwgPSAhIWlzX2tlcm5lbDsKKwlpZiAoY3B1X2J1Zi0+bGFzdF9pc19rZXJuZWwgIT0gaXNfa2VybmVsKSB7CisJCWNwdV9idWYtPmxhc3RfaXNfa2VybmVsID0gaXNfa2VybmVsOworCQlmbGFncyB8PSBLRVJORUxfQ1RYX1NXSVRDSDsKKwkJaWYgKGlzX2tlcm5lbCkKKwkJCWZsYWdzIHw9IElTX0tFUk5FTDsKKwl9CisKKwkvKiBub3RpY2UgYSB0YXNrIHN3aXRjaCAqLworCWlmIChjcHVfYnVmLT5sYXN0X3Rhc2sgIT0gdGFzaykgeworCQljcHVfYnVmLT5sYXN0X3Rhc2sgPSB0YXNrOworCQlmbGFncyB8PSBVU0VSX0NUWF9TV0lUQ0g7CisJfQorCisJaWYgKCFmbGFncykKKwkJLyogbm90aGluZyB0byBkbyAqLworCQlyZXR1cm4gMDsKKworCWlmIChmbGFncyAmIFVTRVJfQ1RYX1NXSVRDSCkKKwkJc2l6ZSA9IDE7CisJZWxzZQorCQlzaXplID0gMDsKKworCXNhbXBsZSA9IG9wX2NwdV9idWZmZXJfd3JpdGVfcmVzZXJ2ZSgmZW50cnksIHNpemUpOworCWlmICghc2FtcGxlKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXNhbXBsZS0+ZWlwID0gRVNDQVBFX0NPREU7CisJc2FtcGxlLT5ldmVudCA9IGZsYWdzOworCisJaWYgKHNpemUpCisJCW9wX2NwdV9idWZmZXJfYWRkX2RhdGEoJmVudHJ5LCAodW5zaWduZWQgbG9uZyl0YXNrKTsKKworCW9wX2NwdV9idWZmZXJfd3JpdGVfY29tbWl0KCZlbnRyeSk7CiAKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGlubGluZSBpbnQKLWFkZF9jb2RlKHN0cnVjdCBvcHJvZmlsZV9jcHVfYnVmZmVyICpidWZmZXIsIHVuc2lnbmVkIGxvbmcgdmFsdWUpCitvcF9hZGRfc2FtcGxlKHN0cnVjdCBvcHJvZmlsZV9jcHVfYnVmZmVyICpjcHVfYnVmLAorCSAgICAgIHVuc2lnbmVkIGxvbmcgcGMsIHVuc2lnbmVkIGxvbmcgZXZlbnQpCiB7Ci0JcmV0dXJuIGFkZF9zYW1wbGUoYnVmZmVyLCBFU0NBUEVfQ09ERSwgdmFsdWUpOworCXN0cnVjdCBvcF9lbnRyeSBlbnRyeTsKKwlzdHJ1Y3Qgb3Bfc2FtcGxlICpzYW1wbGU7CisKKwlzYW1wbGUgPSBvcF9jcHVfYnVmZmVyX3dyaXRlX3Jlc2VydmUoJmVudHJ5LCAwKTsKKwlpZiAoIXNhbXBsZSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlzYW1wbGUtPmVpcCA9IHBjOworCXNhbXBsZS0+ZXZlbnQgPSBldmVudDsKKworCXJldHVybiBvcF9jcHVfYnVmZmVyX3dyaXRlX2NvbW1pdCgmZW50cnkpOwogfQogCi0vKiBUaGlzIG11c3QgYmUgc2FmZSBmcm9tIGFueSBjb250ZXh0LiBJdCdzIHNhZmUgd3JpdGluZyBoZXJlCi0gKiBiZWNhdXNlIG9mIHRoZSBoZWFkL3RhaWwgc2VwYXJhdGlvbiBvZiB0aGUgd3JpdGVyIGFuZCByZWFkZXIKLSAqIG9mIHRoZSBDUFUgYnVmZmVyLgorLyoKKyAqIFRoaXMgbXVzdCBiZSBzYWZlIGZyb20gYW55IGNvbnRleHQuCiAgKgogICogaXNfa2VybmVsIGlzIG5lZWRlZCBiZWNhdXNlIG9uIHNvbWUgYXJjaGl0ZWN0dXJlcyB5b3UgY2Fubm90CiAgKiB0ZWxsIGlmIHlvdSBhcmUgaW4ga2VybmVsIG9yIHVzZXIgc3BhY2Ugc2ltcGx5IGJ5IGxvb2tpbmcgYXQKICAqIHBjLiBXZSB0YWcgdGhpcyBpbiB0aGUgYnVmZmVyIGJ5IGdlbmVyYXRpbmcga2VybmVsIGVudGVyL2V4aXQKICAqIGV2ZW50cyB3aGVuZXZlciBpc19rZXJuZWwgY2hhbmdlcwogICovCi1zdGF0aWMgaW50IGxvZ19zYW1wbGUoc3RydWN0IG9wcm9maWxlX2NwdV9idWZmZXIgKmNwdV9idWYsIHVuc2lnbmVkIGxvbmcgcGMsCi0JCSAgICAgIGludCBpc19rZXJuZWwsIHVuc2lnbmVkIGxvbmcgZXZlbnQpCitzdGF0aWMgaW50Citsb2dfc2FtcGxlKHN0cnVjdCBvcHJvZmlsZV9jcHVfYnVmZmVyICpjcHVfYnVmLCB1bnNpZ25lZCBsb25nIHBjLAorCSAgIHVuc2lnbmVkIGxvbmcgYmFja3RyYWNlLCBpbnQgaXNfa2VybmVsLCB1bnNpZ25lZCBsb25nIGV2ZW50KQogewotCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzazsKLQogCWNwdV9idWYtPnNhbXBsZV9yZWNlaXZlZCsrOwogCiAJaWYgKHBjID09IEVTQ0FQRV9DT0RFKSB7CkBAIC0xOTMsMjUgKzMwMSwxMCBAQAogCQlyZXR1cm4gMDsKIAl9CiAKLQlpc19rZXJuZWwgPSAhIWlzX2tlcm5lbDsKKwlpZiAob3BfYWRkX2NvZGUoY3B1X2J1ZiwgYmFja3RyYWNlLCBpc19rZXJuZWwsIGN1cnJlbnQpKQorCQlnb3RvIGZhaWw7CiAKLQl0YXNrID0gY3VycmVudDsKLQotCS8qIG5vdGljZSBhIHN3aXRjaCBmcm9tIHVzZXItPmtlcm5lbCBvciB2aWNlIHZlcnNhICovCi0JaWYgKGNwdV9idWYtPmxhc3RfaXNfa2VybmVsICE9IGlzX2tlcm5lbCkgewotCQljcHVfYnVmLT5sYXN0X2lzX2tlcm5lbCA9IGlzX2tlcm5lbDsKLQkJaWYgKGFkZF9jb2RlKGNwdV9idWYsIGlzX2tlcm5lbCkpCi0JCQlnb3RvIGZhaWw7Ci0JfQotCi0JLyogbm90aWNlIGEgdGFzayBzd2l0Y2ggKi8KLQlpZiAoY3B1X2J1Zi0+bGFzdF90YXNrICE9IHRhc2spIHsKLQkJY3B1X2J1Zi0+bGFzdF90YXNrID0gdGFzazsKLQkJaWYgKGFkZF9jb2RlKGNwdV9idWYsICh1bnNpZ25lZCBsb25nKXRhc2spKQotCQkJZ290byBmYWlsOwotCX0KLQotCWlmIChhZGRfc2FtcGxlKGNwdV9idWYsIHBjLCBldmVudCkpCisJaWYgKG9wX2FkZF9zYW1wbGUoY3B1X2J1ZiwgcGMsIGV2ZW50KSkKIAkJZ290byBmYWlsOwogCiAJcmV0dXJuIDE7CkBAIC0yMjEsMTA5ICszMTQsMTAyIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgb3Byb2ZpbGVfYmVnaW5fdHJhY2Uoc3RydWN0IG9wcm9maWxlX2NwdV9idWZmZXIgKmNwdV9idWYpCitzdGF0aWMgaW5saW5lIHZvaWQgb3Byb2ZpbGVfYmVnaW5fdHJhY2Uoc3RydWN0IG9wcm9maWxlX2NwdV9idWZmZXIgKmNwdV9idWYpCiB7Ci0JYWRkX2NvZGUoY3B1X2J1ZiwgQ1BVX1RSQUNFX0JFR0lOKTsKIAljcHVfYnVmLT50cmFjaW5nID0gMTsKLQlyZXR1cm4gMTsKIH0KIAotc3RhdGljIHZvaWQgb3Byb2ZpbGVfZW5kX3RyYWNlKHN0cnVjdCBvcHJvZmlsZV9jcHVfYnVmZmVyICpjcHVfYnVmKQorc3RhdGljIGlubGluZSB2b2lkIG9wcm9maWxlX2VuZF90cmFjZShzdHJ1Y3Qgb3Byb2ZpbGVfY3B1X2J1ZmZlciAqY3B1X2J1ZikKIHsKIAljcHVfYnVmLT50cmFjaW5nID0gMDsKIH0KIAotdm9pZCBvcHJvZmlsZV9hZGRfZXh0X3NhbXBsZSh1bnNpZ25lZCBsb25nIHBjLCBzdHJ1Y3QgcHRfcmVncyAqIGNvbnN0IHJlZ3MsCi0JCQkJdW5zaWduZWQgbG9uZyBldmVudCwgaW50IGlzX2tlcm5lbCkKK3N0YXRpYyBpbmxpbmUgdm9pZAorX19vcHJvZmlsZV9hZGRfZXh0X3NhbXBsZSh1bnNpZ25lZCBsb25nIHBjLCBzdHJ1Y3QgcHRfcmVncyAqIGNvbnN0IHJlZ3MsCisJCQkgIHVuc2lnbmVkIGxvbmcgZXZlbnQsIGludCBpc19rZXJuZWwpCiB7CiAJc3RydWN0IG9wcm9maWxlX2NwdV9idWZmZXIgKmNwdV9idWYgPSAmX19nZXRfY3B1X3ZhcihjcHVfYnVmZmVyKTsKLQotCWlmICghYmFja3RyYWNlX2RlcHRoKSB7Ci0JCWxvZ19zYW1wbGUoY3B1X2J1ZiwgcGMsIGlzX2tlcm5lbCwgZXZlbnQpOwotCQlyZXR1cm47Ci0JfQotCi0JaWYgKCFvcHJvZmlsZV9iZWdpbl90cmFjZShjcHVfYnVmKSkKLQkJcmV0dXJuOworCXVuc2lnbmVkIGxvbmcgYmFja3RyYWNlID0gb3Byb2ZpbGVfYmFja3RyYWNlX2RlcHRoOwogCiAJLyoKIAkgKiBpZiBsb2dfc2FtcGxlKCkgZmFpbCB3ZSBjYW4ndCBiYWNrdHJhY2Ugc2luY2Ugd2UgbG9zdCB0aGUKIAkgKiBzb3VyY2Ugb2YgdGhpcyBldmVudAogCSAqLwotCWlmIChsb2dfc2FtcGxlKGNwdV9idWYsIHBjLCBpc19rZXJuZWwsIGV2ZW50KSkKLQkJb3Byb2ZpbGVfb3BzLmJhY2t0cmFjZShyZWdzLCBiYWNrdHJhY2VfZGVwdGgpOworCWlmICghbG9nX3NhbXBsZShjcHVfYnVmLCBwYywgYmFja3RyYWNlLCBpc19rZXJuZWwsIGV2ZW50KSkKKwkJLyogZmFpbGVkICovCisJCXJldHVybjsKKworCWlmICghYmFja3RyYWNlKQorCQlyZXR1cm47CisKKwlvcHJvZmlsZV9iZWdpbl90cmFjZShjcHVfYnVmKTsKKwlvcHJvZmlsZV9vcHMuYmFja3RyYWNlKHJlZ3MsIGJhY2t0cmFjZSk7CiAJb3Byb2ZpbGVfZW5kX3RyYWNlKGNwdV9idWYpOwogfQogCit2b2lkIG9wcm9maWxlX2FkZF9leHRfc2FtcGxlKHVuc2lnbmVkIGxvbmcgcGMsIHN0cnVjdCBwdF9yZWdzICogY29uc3QgcmVncywKKwkJCSAgICAgdW5zaWduZWQgbG9uZyBldmVudCwgaW50IGlzX2tlcm5lbCkKK3sKKwlfX29wcm9maWxlX2FkZF9leHRfc2FtcGxlKHBjLCByZWdzLCBldmVudCwgaXNfa2VybmVsKTsKK30KKwogdm9pZCBvcHJvZmlsZV9hZGRfc2FtcGxlKHN0cnVjdCBwdF9yZWdzICogY29uc3QgcmVncywgdW5zaWduZWQgbG9uZyBldmVudCkKIHsKIAlpbnQgaXNfa2VybmVsID0gIXVzZXJfbW9kZShyZWdzKTsKIAl1bnNpZ25lZCBsb25nIHBjID0gcHJvZmlsZV9wYyhyZWdzKTsKIAotCW9wcm9maWxlX2FkZF9leHRfc2FtcGxlKHBjLCByZWdzLCBldmVudCwgaXNfa2VybmVsKTsKKwlfX29wcm9maWxlX2FkZF9leHRfc2FtcGxlKHBjLCByZWdzLCBldmVudCwgaXNfa2VybmVsKTsKIH0KIAotI2lmZGVmIENPTkZJR19PUFJPRklMRV9JQlMKLQotI2RlZmluZSBNQVhfSUJTX1NBTVBMRV9TSVpFIDE0Ci0KLXZvaWQgb3Byb2ZpbGVfYWRkX2lic19zYW1wbGUoc3RydWN0IHB0X3JlZ3MgKiBjb25zdCByZWdzLAotCQkJICAgICB1bnNpZ25lZCBpbnQgKiBjb25zdCBpYnNfc2FtcGxlLCBpbnQgaWJzX2NvZGUpCisvKgorICogQWRkIHNhbXBsZXMgd2l0aCBkYXRhIHRvIHRoZSByaW5nIGJ1ZmZlci4KKyAqCisgKiBVc2Ugb3Byb2ZpbGVfYWRkX2RhdGEoJmVudHJ5LCB2YWwpIHRvIGFkZCBkYXRhIGFuZAorICogb3Byb2ZpbGVfd3JpdGVfY29tbWl0KCZlbnRyeSkgdG8gY29tbWl0IHRoZSBzYW1wbGUuCisgKi8KK3ZvaWQKK29wcm9maWxlX3dyaXRlX3Jlc2VydmUoc3RydWN0IG9wX2VudHJ5ICplbnRyeSwgc3RydWN0IHB0X3JlZ3MgKiBjb25zdCByZWdzLAorCQkgICAgICAgdW5zaWduZWQgbG9uZyBwYywgaW50IGNvZGUsIGludCBzaXplKQogeworCXN0cnVjdCBvcF9zYW1wbGUgKnNhbXBsZTsKIAlpbnQgaXNfa2VybmVsID0gIXVzZXJfbW9kZShyZWdzKTsKIAlzdHJ1Y3Qgb3Byb2ZpbGVfY3B1X2J1ZmZlciAqY3B1X2J1ZiA9ICZfX2dldF9jcHVfdmFyKGNwdV9idWZmZXIpOwotCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzazsKLQlpbnQgZmFpbCA9IDA7CiAKIAljcHVfYnVmLT5zYW1wbGVfcmVjZWl2ZWQrKzsKIAotCS8qIG5vdGljZSBhIHN3aXRjaCBmcm9tIHVzZXItPmtlcm5lbCBvciB2aWNlIHZlcnNhICovCi0JaWYgKGNwdV9idWYtPmxhc3RfaXNfa2VybmVsICE9IGlzX2tlcm5lbCkgewotCQlpZiAoYWRkX2NvZGUoY3B1X2J1ZiwgaXNfa2VybmVsKSkKLQkJCWdvdG8gZmFpbDsKLQkJY3B1X2J1Zi0+bGFzdF9pc19rZXJuZWwgPSBpc19rZXJuZWw7Ci0JfQotCi0JLyogbm90aWNlIGEgdGFzayBzd2l0Y2ggKi8KLQlpZiAoIWlzX2tlcm5lbCkgewotCQl0YXNrID0gY3VycmVudDsKLQkJaWYgKGNwdV9idWYtPmxhc3RfdGFzayAhPSB0YXNrKSB7Ci0JCQlpZiAoYWRkX2NvZGUoY3B1X2J1ZiwgKHVuc2lnbmVkIGxvbmcpdGFzaykpCi0JCQkJZ290byBmYWlsOwotCQkJY3B1X2J1Zi0+bGFzdF90YXNrID0gdGFzazsKLQkJfQotCX0KLQotCWZhaWwgPSBmYWlsIHx8IGFkZF9jb2RlKGNwdV9idWYsIGlic19jb2RlKTsKLQlmYWlsID0gZmFpbCB8fCBhZGRfc2FtcGxlKGNwdV9idWYsIGlic19zYW1wbGVbMF0sIGlic19zYW1wbGVbMV0pOwotCWZhaWwgPSBmYWlsIHx8IGFkZF9zYW1wbGUoY3B1X2J1ZiwgaWJzX3NhbXBsZVsyXSwgaWJzX3NhbXBsZVszXSk7Ci0JZmFpbCA9IGZhaWwgfHwgYWRkX3NhbXBsZShjcHVfYnVmLCBpYnNfc2FtcGxlWzRdLCBpYnNfc2FtcGxlWzVdKTsKLQotCWlmIChpYnNfY29kZSA9PSBJQlNfT1BfQkVHSU4pIHsKLQkJZmFpbCA9IGZhaWwgfHwgYWRkX3NhbXBsZShjcHVfYnVmLCBpYnNfc2FtcGxlWzZdLCBpYnNfc2FtcGxlWzddKTsKLQkJZmFpbCA9IGZhaWwgfHwgYWRkX3NhbXBsZShjcHVfYnVmLCBpYnNfc2FtcGxlWzhdLCBpYnNfc2FtcGxlWzldKTsKLQkJZmFpbCA9IGZhaWwgfHwgYWRkX3NhbXBsZShjcHVfYnVmLCBpYnNfc2FtcGxlWzEwXSwgaWJzX3NhbXBsZVsxMV0pOwotCX0KLQotCWlmIChmYWlsKQorCS8qIG5vIGJhY2t0cmFjZXMgZm9yIHNhbXBsZXMgd2l0aCBkYXRhICovCisJaWYgKG9wX2FkZF9jb2RlKGNwdV9idWYsIDAsIGlzX2tlcm5lbCwgY3VycmVudCkpCiAJCWdvdG8gZmFpbDsKIAotCWlmIChiYWNrdHJhY2VfZGVwdGgpCi0JCW9wcm9maWxlX29wcy5iYWNrdHJhY2UocmVncywgYmFja3RyYWNlX2RlcHRoKTsKKwlzYW1wbGUgPSBvcF9jcHVfYnVmZmVyX3dyaXRlX3Jlc2VydmUoZW50cnksIHNpemUgKyAyKTsKKwlpZiAoIXNhbXBsZSkKKwkJZ290byBmYWlsOworCXNhbXBsZS0+ZWlwID0gRVNDQVBFX0NPREU7CisJc2FtcGxlLT5ldmVudCA9IDA7CQkvKiBubyBmbGFncyAqLworCisJb3BfY3B1X2J1ZmZlcl9hZGRfZGF0YShlbnRyeSwgY29kZSk7CisJb3BfY3B1X2J1ZmZlcl9hZGRfZGF0YShlbnRyeSwgcGMpOwogCiAJcmV0dXJuOwogCiBmYWlsOgogCWNwdV9idWYtPnNhbXBsZV9sb3N0X292ZXJmbG93Kys7Ci0JcmV0dXJuOwogfQogCi0jZW5kaWYKK2ludCBvcHJvZmlsZV9hZGRfZGF0YShzdHJ1Y3Qgb3BfZW50cnkgKmVudHJ5LCB1bnNpZ25lZCBsb25nIHZhbCkKK3sKKwlyZXR1cm4gb3BfY3B1X2J1ZmZlcl9hZGRfZGF0YShlbnRyeSwgdmFsKTsKK30KKworaW50IG9wcm9maWxlX3dyaXRlX2NvbW1pdChzdHJ1Y3Qgb3BfZW50cnkgKmVudHJ5KQoreworCXJldHVybiBvcF9jcHVfYnVmZmVyX3dyaXRlX2NvbW1pdChlbnRyeSk7Cit9CiAKIHZvaWQgb3Byb2ZpbGVfYWRkX3BjKHVuc2lnbmVkIGxvbmcgcGMsIGludCBpc19rZXJuZWwsIHVuc2lnbmVkIGxvbmcgZXZlbnQpCiB7CiAJc3RydWN0IG9wcm9maWxlX2NwdV9idWZmZXIgKmNwdV9idWYgPSAmX19nZXRfY3B1X3ZhcihjcHVfYnVmZmVyKTsKLQlsb2dfc2FtcGxlKGNwdV9idWYsIHBjLCBpc19rZXJuZWwsIGV2ZW50KTsKKwlsb2dfc2FtcGxlKGNwdV9idWYsIHBjLCAwLCBpc19rZXJuZWwsIGV2ZW50KTsKIH0KIAogdm9pZCBvcHJvZmlsZV9hZGRfdHJhY2UodW5zaWduZWQgbG9uZyBwYykKQEAgLTM0MCw3ICs0MjYsNyBAQAogCWlmIChwYyA9PSBFU0NBUEVfQ09ERSkKIAkJZ290byBmYWlsOwogCi0JaWYgKGFkZF9zYW1wbGUoY3B1X2J1ZiwgcGMsIDApKQorCWlmIChvcF9hZGRfc2FtcGxlKGNwdV9idWYsIHBjLCAwKSkKIAkJZ290byBmYWlsOwogCiAJcmV0dXJuOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9vcHJvZmlsZS9jcHVfYnVmZmVyLmggYi9kcml2ZXJzL29wcm9maWxlL2NwdV9idWZmZXIuaAppbmRleCBhYWNiMGYwLi42M2Y4MWM0IDEwMDY0NAotLS0gYS9kcml2ZXJzL29wcm9maWxlL2NwdV9idWZmZXIuaAorKysgYi9kcml2ZXJzL29wcm9maWxlL2NwdV9idWZmZXIuaApAQCAtMSwxMCArMSwxMSBAQAogLyoqCiAgKiBAZmlsZSBjcHVfYnVmZmVyLmgKICAqCi0gKiBAcmVtYXJrIENvcHlyaWdodCAyMDAyIE9Qcm9maWxlIGF1dGhvcnMKKyAqIEByZW1hcmsgQ29weXJpZ2h0IDIwMDItMjAwOSBPUHJvZmlsZSBhdXRob3JzCiAgKiBAcmVtYXJrIFJlYWQgdGhlIGZpbGUgQ09QWUlORwogICoKICAqIEBhdXRob3IgSm9obiBMZXZvbiA8bGV2b25AbW92ZW1lbnRhcmlhbi5vcmc+CisgKiBAYXV0aG9yIFJvYmVydCBSaWNodGVyIDxyb2JlcnQucmljaHRlckBhbWQuY29tPgogICovCiAKICNpZm5kZWYgT1BST0ZJTEVfQ1BVX0JVRkZFUl9ICkBAIC0zMSwxNyArMzIsMTIgQEAKIHN0cnVjdCBvcF9zYW1wbGUgewogCXVuc2lnbmVkIGxvbmcgZWlwOwogCXVuc2lnbmVkIGxvbmcgZXZlbnQ7CisJdW5zaWduZWQgbG9uZyBkYXRhWzBdOwogfTsKIAotc3RydWN0IG9wX2VudHJ5IHsKLQlzdHJ1Y3QgcmluZ19idWZmZXJfZXZlbnQgKmV2ZW50OwotCXN0cnVjdCBvcF9zYW1wbGUgKnNhbXBsZTsKLQl1bnNpZ25lZCBsb25nIGlycV9mbGFnczsKLX07CitzdHJ1Y3Qgb3BfZW50cnk7CiAKIHN0cnVjdCBvcHJvZmlsZV9jcHVfYnVmZmVyIHsKLQl2b2xhdGlsZSB1bnNpZ25lZCBsb25nIGhlYWRfcG9zOwotCXZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgdGFpbF9wb3M7CiAJdW5zaWduZWQgbG9uZyBidWZmZXJfc2l6ZTsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKmxhc3RfdGFzazsKIAlpbnQgbGFzdF9pc19rZXJuZWw7CkBAIC01NCw4ICs1MCw2IEBACiAJc3RydWN0IGRlbGF5ZWRfd29yayB3b3JrOwogfTsKIAotZXh0ZXJuIHN0cnVjdCByaW5nX2J1ZmZlciAqb3BfcmluZ19idWZmZXJfcmVhZDsKLWV4dGVybiBzdHJ1Y3QgcmluZ19idWZmZXIgKm9wX3JpbmdfYnVmZmVyX3dyaXRlOwogREVDTEFSRV9QRVJfQ1BVKHN0cnVjdCBvcHJvZmlsZV9jcHVfYnVmZmVyLCBjcHVfYnVmZmVyKTsKIAogLyoKQEAgLTY0LDcgKzU4LDcgQEAKICAqIHJlc2V0IHRoZXNlIHRvIGludmFsaWQgdmFsdWVzOyB0aGUgbmV4dCBzYW1wbGUgY29sbGVjdGVkIHdpbGwKICAqIHBvcHVsYXRlIHRoZSBidWZmZXIgd2l0aCBwcm9wZXIgdmFsdWVzIHRvIGluaXRpYWxpemUgdGhlIGJ1ZmZlcgogICovCi1zdGF0aWMgaW5saW5lIHZvaWQgY3B1X2J1ZmZlcl9yZXNldChpbnQgY3B1KQorc3RhdGljIGlubGluZSB2b2lkIG9wX2NwdV9idWZmZXJfcmVzZXQoaW50IGNwdSkKIHsKIAlzdHJ1Y3Qgb3Byb2ZpbGVfY3B1X2J1ZmZlciAqY3B1X2J1ZiA9ICZwZXJfY3B1KGNwdV9idWZmZXIsIGNwdSk7CiAKQEAgLTcyLDU1ICs2Niw0OCBAQAogCWNwdV9idWYtPmxhc3RfdGFzayA9IE5VTEw7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IGNwdV9idWZmZXJfd3JpdGVfZW50cnkoc3RydWN0IG9wX2VudHJ5ICplbnRyeSkKK3N0cnVjdCBvcF9zYW1wbGUKKypvcF9jcHVfYnVmZmVyX3dyaXRlX3Jlc2VydmUoc3RydWN0IG9wX2VudHJ5ICplbnRyeSwgdW5zaWduZWQgbG9uZyBzaXplKTsKK2ludCBvcF9jcHVfYnVmZmVyX3dyaXRlX2NvbW1pdChzdHJ1Y3Qgb3BfZW50cnkgKmVudHJ5KTsKK3N0cnVjdCBvcF9zYW1wbGUgKm9wX2NwdV9idWZmZXJfcmVhZF9lbnRyeShzdHJ1Y3Qgb3BfZW50cnkgKmVudHJ5LCBpbnQgY3B1KTsKK3Vuc2lnbmVkIGxvbmcgb3BfY3B1X2J1ZmZlcl9lbnRyaWVzKGludCBjcHUpOworCisvKiByZXR1cm5zIHRoZSByZW1haW5pbmcgZnJlZSBzaXplIG9mIGRhdGEgaW4gdGhlIGVudHJ5ICovCitzdGF0aWMgaW5saW5lCitpbnQgb3BfY3B1X2J1ZmZlcl9hZGRfZGF0YShzdHJ1Y3Qgb3BfZW50cnkgKmVudHJ5LCB1bnNpZ25lZCBsb25nIHZhbCkKIHsKLQllbnRyeS0+ZXZlbnQgPSByaW5nX2J1ZmZlcl9sb2NrX3Jlc2VydmUob3BfcmluZ19idWZmZXJfd3JpdGUsCi0JCQkJCQlzaXplb2Yoc3RydWN0IG9wX3NhbXBsZSksCi0JCQkJCQkmZW50cnktPmlycV9mbGFncyk7Ci0JaWYgKGVudHJ5LT5ldmVudCkKLQkJZW50cnktPnNhbXBsZSA9IHJpbmdfYnVmZmVyX2V2ZW50X2RhdGEoZW50cnktPmV2ZW50KTsKLQllbHNlCi0JCWVudHJ5LT5zYW1wbGUgPSBOVUxMOwotCi0JaWYgKCFlbnRyeS0+c2FtcGxlKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCXJldHVybiAwOworCWlmICghZW50cnktPnNpemUpCisJCXJldHVybiAwOworCSplbnRyeS0+ZGF0YSA9IHZhbDsKKwllbnRyeS0+c2l6ZS0tOworCWVudHJ5LT5kYXRhKys7CisJcmV0dXJuIGVudHJ5LT5zaXplOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBjcHVfYnVmZmVyX3dyaXRlX2NvbW1pdChzdHJ1Y3Qgb3BfZW50cnkgKmVudHJ5KQorLyogcmV0dXJucyB0aGUgc2l6ZSBvZiBkYXRhIGluIHRoZSBlbnRyeSAqLworc3RhdGljIGlubGluZQoraW50IG9wX2NwdV9idWZmZXJfZ2V0X3NpemUoc3RydWN0IG9wX2VudHJ5ICplbnRyeSkKIHsKLQlyZXR1cm4gcmluZ19idWZmZXJfdW5sb2NrX2NvbW1pdChvcF9yaW5nX2J1ZmZlcl93cml0ZSwgZW50cnktPmV2ZW50LAotCQkJCQkgZW50cnktPmlycV9mbGFncyk7CisJcmV0dXJuIGVudHJ5LT5zaXplOwogfQogCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBvcF9zYW1wbGUgKmNwdV9idWZmZXJfcmVhZF9lbnRyeShpbnQgY3B1KQorLyogcmV0dXJucyAwIGlmIGVtcHR5IG9yIHRoZSBzaXplIG9mIGRhdGEgaW5jbHVkaW5nIHRoZSBjdXJyZW50IHZhbHVlICovCitzdGF0aWMgaW5saW5lCitpbnQgb3BfY3B1X2J1ZmZlcl9nZXRfZGF0YShzdHJ1Y3Qgb3BfZW50cnkgKmVudHJ5LCB1bnNpZ25lZCBsb25nICp2YWwpCiB7Ci0Jc3RydWN0IHJpbmdfYnVmZmVyX2V2ZW50ICplOwotCWUgPSByaW5nX2J1ZmZlcl9jb25zdW1lKG9wX3JpbmdfYnVmZmVyX3JlYWQsIGNwdSwgTlVMTCk7Ci0JaWYgKGUpCi0JCXJldHVybiByaW5nX2J1ZmZlcl9ldmVudF9kYXRhKGUpOwotCWlmIChyaW5nX2J1ZmZlcl9zd2FwX2NwdShvcF9yaW5nX2J1ZmZlcl9yZWFkLAotCQkJCSBvcF9yaW5nX2J1ZmZlcl93cml0ZSwKLQkJCQkgY3B1KSkKLQkJcmV0dXJuIE5VTEw7Ci0JZSA9IHJpbmdfYnVmZmVyX2NvbnN1bWUob3BfcmluZ19idWZmZXJfcmVhZCwgY3B1LCBOVUxMKTsKLQlpZiAoZSkKLQkJcmV0dXJuIHJpbmdfYnVmZmVyX2V2ZW50X2RhdGEoZSk7Ci0JcmV0dXJuIE5VTEw7CisJaW50IHNpemUgPSBlbnRyeS0+c2l6ZTsKKwlpZiAoIXNpemUpCisJCXJldHVybiAwOworCSp2YWwgPSAqZW50cnktPmRhdGE7CisJZW50cnktPnNpemUtLTsKKwllbnRyeS0+ZGF0YSsrOworCXJldHVybiBzaXplOwogfQogCi0vKiAiYWNxdWlyZSIgYXMgbWFueSBjcHUgYnVmZmVyIHNsb3RzIGFzIHdlIGNhbiAqLwotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGNwdV9idWZmZXJfZW50cmllcyhpbnQgY3B1KQotewotCXJldHVybiByaW5nX2J1ZmZlcl9lbnRyaWVzX2NwdShvcF9yaW5nX2J1ZmZlcl9yZWFkLCBjcHUpCi0JCSsgcmluZ19idWZmZXJfZW50cmllc19jcHUob3BfcmluZ19idWZmZXJfd3JpdGUsIGNwdSk7Ci19Ci0KLS8qIHRyYW5zaWVudCBldmVudHMgZm9yIHRoZSBDUFUgYnVmZmVyIC0+IGV2ZW50IGJ1ZmZlciAqLwotI2RlZmluZSBDUFVfSVNfS0VSTkVMIDEKLSNkZWZpbmUgQ1BVX1RSQUNFX0JFR0lOIDIKLSNkZWZpbmUgSUJTX0ZFVENIX0JFR0lOIDMKLSNkZWZpbmUgSUJTX09QX0JFR0lOICAgIDQKKy8qIGV4dHJhIGRhdGEgZmxhZ3MgKi8KKyNkZWZpbmUgS0VSTkVMX0NUWF9TV0lUQ0gJKDFVTCA8PCAwKQorI2RlZmluZSBJU19LRVJORUwJCSgxVUwgPDwgMSkKKyNkZWZpbmUgVFJBQ0VfQkVHSU4JCSgxVUwgPDwgMikKKyNkZWZpbmUgVVNFUl9DVFhfU1dJVENICQkoMVVMIDw8IDMpCiAKICNlbmRpZiAvKiBPUFJPRklMRV9DUFVfQlVGRkVSX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvb3Byb2ZpbGUvZXZlbnRfYnVmZmVyLmMgYi9kcml2ZXJzL29wcm9maWxlL2V2ZW50X2J1ZmZlci5jCmluZGV4IDE5MWEzMjAuLjJiN2FlMzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvb3Byb2ZpbGUvZXZlbnRfYnVmZmVyLmMKKysrIGIvZHJpdmVycy9vcHJvZmlsZS9ldmVudF9idWZmZXIuYwpAQCAtNzMsOCArNzMsOCBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmb3Byb2ZpbGVmc19sb2NrLCBmbGFncyk7Ci0JYnVmZmVyX3NpemUgPSBmc19idWZmZXJfc2l6ZTsKLQlidWZmZXJfd2F0ZXJzaGVkID0gZnNfYnVmZmVyX3dhdGVyc2hlZDsKKwlidWZmZXJfc2l6ZSA9IG9wcm9maWxlX2J1ZmZlcl9zaXplOworCWJ1ZmZlcl93YXRlcnNoZWQgPSBvcHJvZmlsZV9idWZmZXJfd2F0ZXJzaGVkOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm9wcm9maWxlZnNfbG9jaywgZmxhZ3MpOwogCiAJaWYgKGJ1ZmZlcl93YXRlcnNoZWQgPj0gYnVmZmVyX3NpemUpCmRpZmYgLS1naXQgYS9kcml2ZXJzL29wcm9maWxlL29wcm9mLmMgYi9kcml2ZXJzL29wcm9maWxlL29wcm9mLmMKaW5kZXggY2QzNzU5MC4uM2NmZmNlOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9vcHJvZmlsZS9vcHJvZi5jCisrKyBiL2RyaXZlcnMvb3Byb2ZpbGUvb3Byb2YuYwpAQCAtMjMsNyArMjMsNyBAQAogc3RydWN0IG9wcm9maWxlX29wZXJhdGlvbnMgb3Byb2ZpbGVfb3BzOwogCiB1bnNpZ25lZCBsb25nIG9wcm9maWxlX3N0YXJ0ZWQ7Ci11bnNpZ25lZCBsb25nIGJhY2t0cmFjZV9kZXB0aDsKK3Vuc2lnbmVkIGxvbmcgb3Byb2ZpbGVfYmFja3RyYWNlX2RlcHRoOwogc3RhdGljIHVuc2lnbmVkIGxvbmcgaXNfc2V0dXA7CiBzdGF0aWMgREVGSU5FX01VVEVYKHN0YXJ0X211dGV4KTsKIApAQCAtMTcyLDcgKzE3Miw3IEBACiAJCWdvdG8gb3V0OwogCX0KIAotCWJhY2t0cmFjZV9kZXB0aCA9IHZhbDsKKwlvcHJvZmlsZV9iYWNrdHJhY2VfZGVwdGggPSB2YWw7CiAKIG91dDoKIAltdXRleF91bmxvY2soJnN0YXJ0X211dGV4KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvb3Byb2ZpbGUvb3Byb2YuaCBiL2RyaXZlcnMvb3Byb2ZpbGUvb3Byb2YuaAppbmRleCA1ZGYwYzIxLi5jMjg4ZDNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL29wcm9maWxlL29wcm9mLmgKKysrIGIvZHJpdmVycy9vcHJvZmlsZS9vcHJvZi5oCkBAIC0yMSwxMiArMjEsMTIgQEAKIAogc3RydWN0IG9wcm9maWxlX29wZXJhdGlvbnM7CiAKLWV4dGVybiB1bnNpZ25lZCBsb25nIGZzX2J1ZmZlcl9zaXplOwotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgZnNfY3B1X2J1ZmZlcl9zaXplOwotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgZnNfYnVmZmVyX3dhdGVyc2hlZDsKK2V4dGVybiB1bnNpZ25lZCBsb25nIG9wcm9maWxlX2J1ZmZlcl9zaXplOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgb3Byb2ZpbGVfY3B1X2J1ZmZlcl9zaXplOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgb3Byb2ZpbGVfYnVmZmVyX3dhdGVyc2hlZDsKIGV4dGVybiBzdHJ1Y3Qgb3Byb2ZpbGVfb3BlcmF0aW9ucyBvcHJvZmlsZV9vcHM7CiBleHRlcm4gdW5zaWduZWQgbG9uZyBvcHJvZmlsZV9zdGFydGVkOwotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgYmFja3RyYWNlX2RlcHRoOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgb3Byb2ZpbGVfYmFja3RyYWNlX2RlcHRoOwogCiBzdHJ1Y3Qgc3VwZXJfYmxvY2s7CiBzdHJ1Y3QgZGVudHJ5OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9vcHJvZmlsZS9vcHJvZmlsZV9maWxlcy5jIGIvZHJpdmVycy9vcHJvZmlsZS9vcHJvZmlsZV9maWxlcy5jCmluZGV4IGQ4MjAxOTk4Li41ZDM2ZmZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL29wcm9maWxlL29wcm9maWxlX2ZpbGVzLmMKKysrIGIvZHJpdmVycy9vcHJvZmlsZS9vcHJvZmlsZV9maWxlcy5jCkBAIC0xNCwxNyArMTQsMTggQEAKICNpbmNsdWRlICJvcHJvZmlsZV9zdGF0cy5oIgogI2luY2x1ZGUgIm9wcm9mLmgiCiAKLSNkZWZpbmUgRlNfQlVGRkVSX1NJWkVfREVGQVVMVAkJMTMxMDcyCi0jZGVmaW5lIEZTX0NQVV9CVUZGRVJfU0laRV9ERUZBVUxUCTgxOTIKLSNkZWZpbmUgRlNfQlVGRkVSX1dBVEVSU0hFRF9ERUZBVUxUCTMyNzY4CS8qIEZJWE1FOiB0dW5lICovCisjZGVmaW5lIEJVRkZFUl9TSVpFX0RFRkFVTFQJCTEzMTA3MgorI2RlZmluZSBDUFVfQlVGRkVSX1NJWkVfREVGQVVMVAkJODE5MgorI2RlZmluZSBCVUZGRVJfV0FURVJTSEVEX0RFRkFVTFQJMzI3NjgJLyogRklYTUU6IHR1bmUgKi8KIAotdW5zaWduZWQgbG9uZyBmc19idWZmZXJfc2l6ZTsKLXVuc2lnbmVkIGxvbmcgZnNfY3B1X2J1ZmZlcl9zaXplOwotdW5zaWduZWQgbG9uZyBmc19idWZmZXJfd2F0ZXJzaGVkOwordW5zaWduZWQgbG9uZyBvcHJvZmlsZV9idWZmZXJfc2l6ZTsKK3Vuc2lnbmVkIGxvbmcgb3Byb2ZpbGVfY3B1X2J1ZmZlcl9zaXplOwordW5zaWduZWQgbG9uZyBvcHJvZmlsZV9idWZmZXJfd2F0ZXJzaGVkOwogCiBzdGF0aWMgc3NpemVfdCBkZXB0aF9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsIGxvZmZfdCAqb2Zmc2V0KQogewotCXJldHVybiBvcHJvZmlsZWZzX3Vsb25nX3RvX3VzZXIoYmFja3RyYWNlX2RlcHRoLCBidWYsIGNvdW50LCBvZmZzZXQpOworCXJldHVybiBvcHJvZmlsZWZzX3Vsb25nX3RvX3VzZXIob3Byb2ZpbGVfYmFja3RyYWNlX2RlcHRoLCBidWYsIGNvdW50LAorCQkJCQlvZmZzZXQpOwogfQogCiAKQEAgLTEyNSwxNiArMTI2LDE2IEBACiB2b2lkIG9wcm9maWxlX2NyZWF0ZV9maWxlcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3QgZGVudHJ5ICpyb290KQogewogCS8qIHJlaW5pdGlhbGl6ZSBkZWZhdWx0IHZhbHVlcyAqLwotCWZzX2J1ZmZlcl9zaXplID0JRlNfQlVGRkVSX1NJWkVfREVGQVVMVDsKLQlmc19jcHVfYnVmZmVyX3NpemUgPQlGU19DUFVfQlVGRkVSX1NJWkVfREVGQVVMVDsKLQlmc19idWZmZXJfd2F0ZXJzaGVkID0JRlNfQlVGRkVSX1dBVEVSU0hFRF9ERUZBVUxUOworCW9wcm9maWxlX2J1ZmZlcl9zaXplID0JCUJVRkZFUl9TSVpFX0RFRkFVTFQ7CisJb3Byb2ZpbGVfY3B1X2J1ZmZlcl9zaXplID0JQ1BVX0JVRkZFUl9TSVpFX0RFRkFVTFQ7CisJb3Byb2ZpbGVfYnVmZmVyX3dhdGVyc2hlZCA9CUJVRkZFUl9XQVRFUlNIRURfREVGQVVMVDsKIAogCW9wcm9maWxlZnNfY3JlYXRlX2ZpbGUoc2IsIHJvb3QsICJlbmFibGUiLCAmZW5hYmxlX2ZvcHMpOwogCW9wcm9maWxlZnNfY3JlYXRlX2ZpbGVfcGVybShzYiwgcm9vdCwgImR1bXAiLCAmZHVtcF9mb3BzLCAwNjY2KTsKIAlvcHJvZmlsZWZzX2NyZWF0ZV9maWxlKHNiLCByb290LCAiYnVmZmVyIiwgJmV2ZW50X2J1ZmZlcl9mb3BzKTsKLQlvcHJvZmlsZWZzX2NyZWF0ZV91bG9uZyhzYiwgcm9vdCwgImJ1ZmZlcl9zaXplIiwgJmZzX2J1ZmZlcl9zaXplKTsKLQlvcHJvZmlsZWZzX2NyZWF0ZV91bG9uZyhzYiwgcm9vdCwgImJ1ZmZlcl93YXRlcnNoZWQiLCAmZnNfYnVmZmVyX3dhdGVyc2hlZCk7Ci0Jb3Byb2ZpbGVmc19jcmVhdGVfdWxvbmcoc2IsIHJvb3QsICJjcHVfYnVmZmVyX3NpemUiLCAmZnNfY3B1X2J1ZmZlcl9zaXplKTsKKwlvcHJvZmlsZWZzX2NyZWF0ZV91bG9uZyhzYiwgcm9vdCwgImJ1ZmZlcl9zaXplIiwgJm9wcm9maWxlX2J1ZmZlcl9zaXplKTsKKwlvcHJvZmlsZWZzX2NyZWF0ZV91bG9uZyhzYiwgcm9vdCwgImJ1ZmZlcl93YXRlcnNoZWQiLCAmb3Byb2ZpbGVfYnVmZmVyX3dhdGVyc2hlZCk7CisJb3Byb2ZpbGVmc19jcmVhdGVfdWxvbmcoc2IsIHJvb3QsICJjcHVfYnVmZmVyX3NpemUiLCAmb3Byb2ZpbGVfY3B1X2J1ZmZlcl9zaXplKTsKIAlvcHJvZmlsZWZzX2NyZWF0ZV9maWxlKHNiLCByb290LCAiY3B1X3R5cGUiLCAmY3B1X3R5cGVfZm9wcyk7CiAJb3Byb2ZpbGVmc19jcmVhdGVfZmlsZShzYiwgcm9vdCwgImJhY2t0cmFjZV9kZXB0aCIsICZkZXB0aF9mb3BzKTsKIAlvcHJvZmlsZWZzX2NyZWF0ZV9maWxlKHNiLCByb290LCAicG9pbnRlcl9zaXplIiwgJnBvaW50ZXJfc2l6ZV9mb3BzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGFyaXNjL2FzcC5jIGIvZHJpdmVycy9wYXJpc2MvYXNwLmMKaW5kZXggODIxMzY5MS4uNzkzMTEzMzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGFyaXNjL2FzcC5jCisrKyBiL2RyaXZlcnMvcGFyaXNjL2FzcC5jCkBAIC03MSw4ICs3MSw3IEBACiAgKi8KICNkZWZpbmUgQVNQX0lOVEVSUlVQVF9BRERSIDB4ZjA4MDAwMDAKIAotaW50IF9faW5pdAotYXNwX2luaXRfY2hpcChzdHJ1Y3QgcGFyaXNjX2RldmljZSAqZGV2KQorc3RhdGljIGludCBfX2luaXQgYXNwX2luaXRfY2hpcChzdHJ1Y3QgcGFyaXNjX2RldmljZSAqZGV2KQogewogCXN0cnVjdCBnc2NfaXJxIGdzY19pcnE7CiAJaW50IHJldDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGFyaXNjL2NjaW8tZG1hLmMgYi9kcml2ZXJzL3BhcmlzYy9jY2lvLWRtYS5jCmluZGV4IGRjYzFlOTkuLmNkNGRkN2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGFyaXNjL2NjaW8tZG1hLmMKKysrIGIvZHJpdmVycy9wYXJpc2MvY2Npby1kbWEuYwpAQCAtNTU1LDcgKzU1NSw3IEBACiAgKiAoTG9hZCBDb2hlcmVuY2UgSW5kZXgpIGluc3RydWN0aW9uLiAgVGhlIDggYml0cyB1c2VkIGZvciB0aGUgdmlydHVhbAogICogaW5kZXggYXJlIGJpdHMgMTI6MTkgb2YgdGhlIHZhbHVlIHJldHVybmVkIGJ5IExDSS4KICAqLyAKLXZvaWQgQ0NJT19JTkxJTkUKK3N0YXRpYyB2b2lkIENDSU9fSU5MSU5FCiBjY2lvX2lvX3BkaXJfZW50cnkodTY0ICpwZGlyX3B0ciwgc3BhY2VfdCBzaWQsIHVuc2lnbmVkIGxvbmcgdmJhLAogCQkgICB1bnNpZ25lZCBsb25nIGhpbnRzKQogewpAQCAtMTU3OCw4ICsxNTc4LDYgQEAKIAogCWlvY19jb3VudCsrOwogCi0JcGFyaXNjX3ZtZXJnZV9ib3VuZGFyeSA9IElPVlBfU0laRTsKLQlwYXJpc2Nfdm1lcmdlX21heF9zaXplID0gQklUU19QRVJfTE9ORyAqIElPVlBfU0laRTsKIAlwYXJpc2NfaGFzX2lvbW11KCk7CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BhcmlzYy9kaW5vLmMgYi9kcml2ZXJzL3BhcmlzYy9kaW5vLmMKaW5kZXggM2JjNTRiMy4uZDUzOWQ5ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wYXJpc2MvZGluby5jCisrKyBiL2RyaXZlcnMvcGFyaXNjL2Rpbm8uYwpAQCAtMjg3LDcgKzI4Nyw3IEBACiBESU5PX1BPUlRfT1VUKHcsIDE2LCAyKQogRElOT19QT1JUX09VVChsLCAzMiwgMCkKIAotc3RydWN0IHBjaV9wb3J0X29wcyBkaW5vX3BvcnRfb3BzID0geworc3RhdGljIHN0cnVjdCBwY2lfcG9ydF9vcHMgZGlub19wb3J0X29wcyA9IHsKIAkuaW5iCT0gZGlub19pbjgsCiAJLmludwk9IGRpbm9faW4xNiwKIAkuaW5sCT0gZGlub19pbjMyLApAQCAtNTQ3LDcgKzU0Nyw3IEBACiAJKiogVGhlIGFkZGl0aW9uYWwgIi0xIiBhZGp1c3RzIGZvciBza2V3aW5nIHRoZSBJUlE8LT5zbG90LgogCSovCiAJZGlub19jZmdfcmVhZChkZXYtPmJ1cywgZGV2LT5kZXZmbiwgUENJX0lOVEVSUlVQVF9QSU4sIDEsICZpcnFfcGluKTsgCi0JZGV2LT5pcnEgPSAoaXJxX3BpbiArIFBDSV9TTE9UKGRldi0+ZGV2Zm4pIC0gMSkgJSA0IDsKKwlkZXYtPmlycSA9IHBjaV9zd2l6emxlX2ludGVycnVwdF9waW4oZGV2LCBpcnFfcGluKSAtIDE7CiAKIAkvKiBTaG91bGRuJ3QgcmVhbGx5IG5lZWQgdG8gZG8gdGhpcyBidXQgaXQncyBpbiBjYXNlIHNvbWVvbmUgdHJpZXMKIAkqKiB0byBieXBhc3MgUENJIHNlcnZpY2VzIGFuZCBsb29rIGF0IHRoZSBjYXJkIHRoZW1zZWx2ZXMuCkBAIC02NzIsNyArNjcyLDcgQEAKIAkJCQogCQkJZGlub19jZmdfcmVhZChkZXYtPmJ1cywgZGV2LT5kZXZmbiwgCiAJCQkJICAgICAgUENJX0lOVEVSUlVQVF9QSU4sIDEsICZpcnFfcGluKTsKLQkJCWlycV9waW4gPSAoaXJxX3BpbiArIFBDSV9TTE9UKGRldi0+ZGV2Zm4pIC0gMSkgJSA0IDsKKwkJCWlycV9waW4gPSBwY2lfc3dpenpsZV9pbnRlcnJ1cHRfcGluKGRldiwgaXJxX3BpbikgLSAxOwogCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiRGV2aWNlICVzIGhhcyB1bmRlZmluZWQgSVJRLCAiCiAJCQkJCSJzZXR0aW5nIHRvICVkXG4iLCBwY2lfbmFtZShkZXYpLCBpcnFfcGluKTsKIAkJCWRpbm9fY2ZnX3dyaXRlKGRldi0+YnVzLCBkZXYtPmRldmZuLCAKQEAgLTY5MCw3ICs2OTAsNyBAQAogfQogCiAKLXN0cnVjdCBwY2lfYmlvc19vcHMgZGlub19iaW9zX29wcyA9IHsKK3N0YXRpYyBzdHJ1Y3QgcGNpX2Jpb3Nfb3BzIGRpbm9fYmlvc19vcHMgPSB7CiAJLmluaXQJCT0gZGlub19iaW9zX2luaXQsCiAJLmZpeHVwX2J1cwk9IGRpbm9fZml4dXBfYnVzCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wYXJpc2MvaHBwYi5jIGIvZHJpdmVycy9wYXJpc2MvaHBwYi5jCmluZGV4IDY1ZWVlNjcuLjEzODU2NDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGFyaXNjL2hwcGIuYworKysgYi9kcml2ZXJzL3BhcmlzYy9ocHBiLmMKQEAgLTI5LDcgKzI5LDcgQEAKIAlzdHJ1Y3QgaHBwYl9jYXJkICpuZXh0OwogfTsKIAotc3RydWN0IGhwcGJfY2FyZCBocHBiX2NhcmRfaGVhZCA9IHsKK3N0YXRpYyBzdHJ1Y3QgaHBwYl9jYXJkIGhwcGJfY2FyZF9oZWFkID0gewogCS5ocGEgPSAwLAogCS5uZXh0ID0gTlVMTCwKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BhcmlzYy9pb3NhcGljLmMgYi9kcml2ZXJzL3BhcmlzYy9pb3NhcGljLmMKaW5kZXggOWRlZGJiZC4uMDc5NzY1OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wYXJpc2MvaW9zYXBpYy5jCisrKyBiL2RyaXZlcnMvcGFyaXNjL2lvc2FwaWMuYwpAQCAtNTE5LDggKzUxOSw3IEBACiAJCSoqCiAJCSoqIEFkdmFudGFnZSBpcyBpdCdzIHJlYWxseSBlYXN5IHRvIGltcGxlbWVudC4KIAkJKi8KLQkJaW50cl9waW4gPSAoKGludHJfcGluLTEpK1BDSV9TTE9UKHBjaWRldi0+ZGV2Zm4pKSAlIDQ7Ci0JCWludHJfcGluKys7CS8qIGNvbnZlcnQgYmFjayB0byBJTlRBLUQgKDEtNCkgKi8KKwkJaW50cl9waW4gPSBwY2lfc3dpenpsZV9pbnRlcnJ1cHRfcGluKHBjaWRldiwgaW50cl9waW4pOwogI2VuZGlmIC8qIFBDSV9CUklER0VfRlVOQ1MgKi8KIAogCQkvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wYXJpc2MvbGFzaS5jIGIvZHJpdmVycy9wYXJpc2MvbGFzaS5jCmluZGV4IGJlZTUxMDAuLmU2NTcyN2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGFyaXNjL2xhc2kuYworKysgYi9kcml2ZXJzL3BhcmlzYy9sYXNpLmMKQEAgLTEwNyw3ICsxMDcsNyBAQAogCiAjZWxzZQogCi12b2lkIF9faW5pdCBsYXNpX2xlZF9pbml0KHVuc2lnbmVkIGxvbmcgbGFzaV9ocGEpCitzdGF0aWMgdm9pZCBfX2luaXQgbGFzaV9sZWRfaW5pdCh1bnNpZ25lZCBsb25nIGxhc2lfaHBhKQogewogCXVuc2lnbmVkIGxvbmcgZGF0YXJlZzsKIApAQCAtMTYzLDggKzE2Myw3IEBACiAJZ3NjX3dyaXRlbCgweDAyLCBkYXRhcmVnKTsKIH0KIAotaW50IF9faW5pdAotbGFzaV9pbml0X2NoaXAoc3RydWN0IHBhcmlzY19kZXZpY2UgKmRldikKK3N0YXRpYyBpbnQgX19pbml0IGxhc2lfaW5pdF9jaGlwKHN0cnVjdCBwYXJpc2NfZGV2aWNlICpkZXYpCiB7CiAJZXh0ZXJuIHZvaWQgKCpjaGFzc2lzX3Bvd2VyX29mZikodm9pZCk7CiAJc3RydWN0IGdzY19hc2ljICpsYXNpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wYXJpc2MvbGJhX3BjaS5jIGIvZHJpdmVycy9wYXJpc2MvbGJhX3BjaS5jCmluZGV4IGEyOGM4OTQuLmQ4MjMzZGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGFyaXNjL2xiYV9wY2kuYworKysgYi9kcml2ZXJzL3BhcmlzYy9sYmFfcGNpLmMKQEAgLTgyNCw3ICs4MjQsNyBAQAogfQogCiAKLXN0cnVjdCBwY2lfYmlvc19vcHMgbGJhX2Jpb3Nfb3BzID0geworc3RhdGljIHN0cnVjdCBwY2lfYmlvc19vcHMgbGJhX2Jpb3Nfb3BzID0gewogCS5pbml0ID0JCWxiYV9iaW9zX2luaXQsCiAJLmZpeHVwX2J1cyA9CWxiYV9maXh1cF9idXMsCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wYXJpc2Mvc2JhX2lvbW11LmMgYi9kcml2ZXJzL3BhcmlzYy9zYmFfaW9tbXUuYwppbmRleCBiYzczYjk2Li4zZmFjOGY4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BhcmlzYy9zYmFfaW9tbXUuYworKysgYi9kcml2ZXJzL3BhcmlzYy9zYmFfaW9tbXUuYwpAQCAtNTYxLDcgKzU2MSw3IEBACiAgKiBJT01NVSB1c2VzIGxpdHRsZSBlbmRpYW4gZm9yIHRoZSBwZGlyLgogICovCiAKLXZvaWQgU0JBX0lOTElORQorc3RhdGljIHZvaWQgU0JBX0lOTElORQogc2JhX2lvX3BkaXJfZW50cnkodTY0ICpwZGlyX3B0ciwgc3BhY2VfdCBzaWQsIHVuc2lnbmVkIGxvbmcgdmJhLAogCQkgIHVuc2lnbmVkIGxvbmcgaGludCkKIHsKQEAgLTE4NzQsNyArMTg3NCw3IEBACiAJeyAwLCB9CiB9OwogCi1pbnQgc2JhX2RyaXZlcl9jYWxsYmFjayhzdHJ1Y3QgcGFyaXNjX2RldmljZSAqKTsKK3N0YXRpYyBpbnQgc2JhX2RyaXZlcl9jYWxsYmFjayhzdHJ1Y3QgcGFyaXNjX2RldmljZSAqKTsKIAogc3RhdGljIHN0cnVjdCBwYXJpc2NfZHJpdmVyIHNiYV9kcml2ZXIgPSB7CiAJLm5hbWUgPQkJTU9EVUxFX05BTUUsCkBAIC0xODg3LDggKzE4ODcsNyBAQAogKiogSWYgc28sIGluaXRpYWxpemUgdGhlIGNoaXAgYW5kIHRlbGwgb3RoZXIgcGFydG5lcnMgaW4gY3JpbWUgdGhleQogKiogaGF2ZSB3b3JrIHRvIGRvLgogKi8KLWludAotc2JhX2RyaXZlcl9jYWxsYmFjayhzdHJ1Y3QgcGFyaXNjX2RldmljZSAqZGV2KQorc3RhdGljIGludCBzYmFfZHJpdmVyX2NhbGxiYWNrKHN0cnVjdCBwYXJpc2NfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IHNiYV9kZXZpY2UgKnNiYV9kZXY7CiAJdTMyIGZ1bmNfY2xhc3M7CkBAIC0xOTc5LDggKzE5NzgsNiBAQAogCXByb2NfY3JlYXRlKCJzYmFfaW9tbXUtYml0bWFwIiwgMCwgcm9vdCwgJnNiYV9wcm9jX2JpdG1hcF9mb3BzKTsKICNlbmRpZgogCi0JcGFyaXNjX3ZtZXJnZV9ib3VuZGFyeSA9IElPVlBfU0laRTsKLQlwYXJpc2Nfdm1lcmdlX21heF9zaXplID0gSU9WUF9TSVpFICogQklUU19QRVJfTE9ORzsKIAlwYXJpc2NfaGFzX2lvbW11KCk7CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BhcmlzYy9zdXBlcmlvLmMgYi9kcml2ZXJzL3BhcmlzYy9zdXBlcmlvLmMKaW5kZXggMWU5M2M4My4uNGZhM2JiMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wYXJpc2Mvc3VwZXJpby5jCisrKyBiL2RyaXZlcnMvcGFyaXNjL3N1cGVyaW8uYwpAQCAtNDA1LDcgKzQwNSw2IEBACiAJc2VyaWFsX3BvcnQudHlwZQk9IFBPUlRfMTY1NTBBOwogCXNlcmlhbF9wb3J0LnVhcnRjbGsJPSAxMTUyMDAqMTY7CiAJc2VyaWFsX3BvcnQuZmlmb3NpemUJPSAxNjsKLQlzcGluX2xvY2tfaW5pdCgmc2VyaWFsX3BvcnQubG9jayk7CiAKIAkvKiBzZXJpYWwgcG9ydCAjMSAqLwogCXNlcmlhbF9wb3J0LmlvYmFzZQk9IHNpb19kZXYuc3AxX2Jhc2U7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BhcmlzYy93YXguYyBiL2RyaXZlcnMvcGFyaXNjL3dheC5jCmluZGV4IDg5MmE4M2IuLmRhOWQ1YWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGFyaXNjL3dheC5jCisrKyBiL2RyaXZlcnMvcGFyaXNjL3dheC5jCkBAIC02OCw4ICs2OCw3IEBACiAvLwlnc2Nfd3JpdGVsKDB4RkZGRkZGRkYsIGJhc2UrMHgyMDAwKTsgLyogUlMyMzItQiBvbiBXYXggKi8KIH0KIAotaW50IF9faW5pdAotd2F4X2luaXRfY2hpcChzdHJ1Y3QgcGFyaXNjX2RldmljZSAqZGV2KQorc3RhdGljIGludCBfX2luaXQgd2F4X2luaXRfY2hpcChzdHJ1Y3QgcGFyaXNjX2RldmljZSAqZGV2KQogewogCXN0cnVjdCBnc2NfYXNpYyAqd2F4OwogCXN0cnVjdCBwYXJpc2NfZGV2aWNlICpwYXJlbnQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9LY29uZmlnIGIvZHJpdmVycy9wY2kvS2NvbmZpZwppbmRleCBlMWNhNDI1Li4yYTQ1MDFkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9LY29uZmlnCisrKyBiL2RyaXZlcnMvcGNpL0tjb25maWcKQEAgLTQyLDYgKzQyLDE1IEBACiAKIAkgIFdoZW4gaW4gZG91YnQsIHNheSBOLgogCitjb25maWcgUENJX1NUVUIKKwl0cmlzdGF0ZSAiUENJIFN0dWIgZHJpdmVyIgorCWRlcGVuZHMgb24gUENJCisJaGVscAorCSAgU2F5IFkgb3IgTSBoZXJlIGlmIHlvdSB3YW50IGJlIGFibGUgdG8gcmVzZXJ2ZSBhIFBDSSBkZXZpY2UKKwkgIHdoZW4gaXQgaXMgZ29pbmcgdG8gYmUgYXNzaWduZWQgdG8gYSBndWVzdCBvcGVyYXRpbmcgc3lzdGVtLgorCisJICBXaGVuIGluIGRvdWJ0LCBzYXkgTi4KKwogY29uZmlnIEhUX0lSUQogCWJvb2wgIkludGVycnVwdHMgb24gaHlwZXJ0cmFuc3BvcnQgZGV2aWNlcyIKIAlkZWZhdWx0IHkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL01ha2VmaWxlIGIvZHJpdmVycy9wY2kvTWFrZWZpbGUKaW5kZXggYWYzYmZlMi4uM2QwN2NlMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9wY2kvTWFrZWZpbGUKQEAgLTUzLDYgKzUzLDggQEAKIAogb2JqLSQoQ09ORklHX1BDSV9TWVNDQUxMKSArPSBzeXNjYWxsLm8KIAorb2JqLSQoQ09ORklHX1BDSV9TVFVCKSArPSBwY2ktc3R1Yi5vCisKIGlmZXEgKCQoQ09ORklHX1BDSV9ERUJVRykseSkKIEVYVFJBX0NGTEFHUyArPSAtRERFQlVHCiBlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvYWNjZXNzLmMgYi9kcml2ZXJzL3BjaS9hY2Nlc3MuYwppbmRleCAzOWJiOTZiLi4zODE0NDQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9hY2Nlc3MuYworKysgYi9kcml2ZXJzL3BjaS9hY2Nlc3MuYwpAQCAtNjYsNiArNjYsMzkgQEAKIEVYUE9SVF9TWU1CT0wocGNpX2J1c193cml0ZV9jb25maWdfd29yZCk7CiBFWFBPUlRfU1lNQk9MKHBjaV9idXNfd3JpdGVfY29uZmlnX2R3b3JkKTsKIAorCisvKioKKyAqIHBjaV9yZWFkX3ZwZCAtIFJlYWQgb25lIGVudHJ5IGZyb20gVml0YWwgUHJvZHVjdCBEYXRhCisgKiBAZGV2OglwY2kgZGV2aWNlIHN0cnVjdAorICogQHBvczoJb2Zmc2V0IGluIHZwZCBzcGFjZQorICogQGNvdW50OgludW1iZXIgb2YgYnl0ZXMgdG8gcmVhZAorICogQGJ1ZjoJcG9pbnRlciB0byB3aGVyZSB0byBzdG9yZSByZXN1bHQKKyAqCisgKi8KK3NzaXplX3QgcGNpX3JlYWRfdnBkKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGxvZmZfdCBwb3MsIHNpemVfdCBjb3VudCwgdm9pZCAqYnVmKQoreworCWlmICghZGV2LT52cGQgfHwgIWRldi0+dnBkLT5vcHMpCisJCXJldHVybiAtRU5PREVWOworCXJldHVybiBkZXYtPnZwZC0+b3BzLT5yZWFkKGRldiwgcG9zLCBjb3VudCwgYnVmKTsKK30KK0VYUE9SVF9TWU1CT0wocGNpX3JlYWRfdnBkKTsKKworLyoqCisgKiBwY2lfd3JpdGVfdnBkIC0gV3JpdGUgZW50cnkgdG8gVml0YWwgUHJvZHVjdCBEYXRhCisgKiBAZGV2OglwY2kgZGV2aWNlIHN0cnVjdAorICogQHBvczoJb2Zmc2V0IGluIHZwZCBzcGFjZQorICogQGNvdW50OgludW1iZXIgb2YgYnl0ZXMgdG8gcmVhZAorICogQHZhbDoJdmFsdWUgdG8gd3JpdGUKKyAqCisgKi8KK3NzaXplX3QgcGNpX3dyaXRlX3ZwZChzdHJ1Y3QgcGNpX2RldiAqZGV2LCBsb2ZmX3QgcG9zLCBzaXplX3QgY291bnQsIGNvbnN0IHZvaWQgKmJ1ZikKK3sKKwlpZiAoIWRldi0+dnBkIHx8ICFkZXYtPnZwZC0+b3BzKQorCQlyZXR1cm4gLUVOT0RFVjsKKwlyZXR1cm4gZGV2LT52cGQtPm9wcy0+d3JpdGUoZGV2LCBwb3MsIGNvdW50LCBidWYpOworfQorRVhQT1JUX1NZTUJPTChwY2lfd3JpdGVfdnBkKTsKKwogLyoKICAqIFRoZSBmb2xsb3dpbmcgcm91dGluZXMgYXJlIHRvIHByZXZlbnQgdGhlIHVzZXIgZnJvbSBhY2Nlc3NpbmcgUENJIGNvbmZpZwogICogc3BhY2Ugd2hlbiBpdCdzIHVuc2FmZSB0byBkbyBzby4gIFNvbWUgZGV2aWNlcyByZXF1aXJlIHRoaXMgZHVyaW5nIEJJU1QgYW5kCkBAIC0xMzMsMTI1ICsxNjYsMTQ1IEBACiAKIHN0cnVjdCBwY2lfdnBkX3BjaTIyIHsKIAlzdHJ1Y3QgcGNpX3ZwZCBiYXNlOwotCXNwaW5sb2NrX3QgbG9jazsgLyogY29udHJvbHMgYWNjZXNzIHRvIGhhcmR3YXJlIGFuZCB0aGUgZmxhZ3MgKi8KLQl1OAljYXA7CisJc3RydWN0IG11dGV4IGxvY2s7CisJdTE2CWZsYWc7CiAJYm9vbAlidXN5OwotCWJvb2wJZmxhZzsgLyogdmFsdWUgb2YgRiBiaXQgdG8gd2FpdCBmb3IgKi8KKwl1OAljYXA7CiB9OwogCi0vKiBXYWl0IGZvciBsYXN0IG9wZXJhdGlvbiB0byBjb21wbGV0ZSAqLworLyoKKyAqIFdhaXQgZm9yIGxhc3Qgb3BlcmF0aW9uIHRvIGNvbXBsZXRlLgorICogVGhpcyBjb2RlIGhhcyB0byBzcGluIHNpbmNlIHRoZXJlIGlzIG5vIG90aGVyIG5vdGlmaWNhdGlvbiBmcm9tIHRoZSBQQ0kKKyAqIGhhcmR3YXJlLiBTaW5jZSB0aGUgVlBEIGlzIG9mdGVuIGltcGxlbWVudGVkIGJ5IHNlcmlhbCBhdHRhY2htZW50IHRvIGFuCisgKiBFRVBST00sIGl0IG1heSB0YWtlIG1hbnkgbWlsbGlzZWNvbmRzIHRvIGNvbXBsZXRlLgorICovCiBzdGF0aWMgaW50IHBjaV92cGRfcGNpMjJfd2FpdChzdHJ1Y3QgcGNpX2RldiAqZGV2KQogewogCXN0cnVjdCBwY2lfdnBkX3BjaTIyICp2cGQgPQogCQljb250YWluZXJfb2YoZGV2LT52cGQsIHN0cnVjdCBwY2lfdnBkX3BjaTIyLCBiYXNlKTsKLQl1MTYgZmxhZywgc3RhdHVzOwotCWludCB3YWl0OworCXVuc2lnbmVkIGxvbmcgdGltZW91dCA9IGppZmZpZXMgKyBIWi8yMCArIDI7CisJdTE2IHN0YXR1czsKIAlpbnQgcmV0OwogCiAJaWYgKCF2cGQtPmJ1c3kpCiAJCXJldHVybiAwOwogCi0JZmxhZyA9IHZwZC0+ZmxhZyA/IFBDSV9WUERfQUREUl9GIDogMDsKLQl3YWl0ID0gdnBkLT5mbGFnID8gMTAgOiAxMDAwOyAvKiByZWFkOiAxMDAgdXM7IHdyaXRlOiAxMCBtcyAqLwogCWZvciAoOzspIHsKLQkJcmV0ID0gcGNpX3VzZXJfcmVhZF9jb25maWdfd29yZChkZXYsCi0JCQkJCQl2cGQtPmNhcCArIFBDSV9WUERfQUREUiwKKwkJcmV0ID0gcGNpX3VzZXJfcmVhZF9jb25maWdfd29yZChkZXYsIHZwZC0+Y2FwICsgUENJX1ZQRF9BRERSLAogCQkJCQkJJnN0YXR1cyk7Ci0JCWlmIChyZXQgPCAwKQorCQlpZiAocmV0KQogCQkJcmV0dXJuIHJldDsKLQkJaWYgKChzdGF0dXMgJiBQQ0lfVlBEX0FERFJfRikgPT0gZmxhZykgeworCisJCWlmICgoc3RhdHVzICYgUENJX1ZQRF9BRERSX0YpID09IHZwZC0+ZmxhZykgewogCQkJdnBkLT5idXN5ID0gZmFsc2U7CiAJCQlyZXR1cm4gMDsKIAkJfQotCQlpZiAod2FpdC0tID09IDApCisKKwkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgdGltZW91dCkpCiAJCQlyZXR1cm4gLUVUSU1FRE9VVDsKLQkJdWRlbGF5KDEwKTsKKwkJaWYgKGZhdGFsX3NpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCQkJcmV0dXJuIC1FSU5UUjsKKwkJaWYgKCFjb25kX3Jlc2NoZWQoKSkKKwkJCXVkZWxheSgxMCk7CiAJfQogfQogCi1zdGF0aWMgaW50IHBjaV92cGRfcGNpMjJfcmVhZChzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgcG9zLCBpbnQgc2l6ZSwKLQkJCSAgICAgIGNoYXIgKmJ1ZikKK3N0YXRpYyBzc2l6ZV90IHBjaV92cGRfcGNpMjJfcmVhZChzdHJ1Y3QgcGNpX2RldiAqZGV2LCBsb2ZmX3QgcG9zLCBzaXplX3QgY291bnQsCisJCQkJICB2b2lkICphcmcpCiB7CiAJc3RydWN0IHBjaV92cGRfcGNpMjIgKnZwZCA9CiAJCWNvbnRhaW5lcl9vZihkZXYtPnZwZCwgc3RydWN0IHBjaV92cGRfcGNpMjIsIGJhc2UpOwotCXUzMiB2YWw7CiAJaW50IHJldDsKLQlpbnQgYmVnaW4sIGVuZCwgaTsKKwlsb2ZmX3QgZW5kID0gcG9zICsgY291bnQ7CisJdTggKmJ1ZiA9IGFyZzsKIAotCWlmIChwb3MgPCAwIHx8IHBvcyA+IHZwZC0+YmFzZS5sZW4gfHwgc2l6ZSA+IHZwZC0+YmFzZS5sZW4gIC0gcG9zKQorCWlmIChwb3MgPCAwIHx8IHBvcyA+IHZwZC0+YmFzZS5sZW4gfHwgZW5kID4gdnBkLT5iYXNlLmxlbikKIAkJcmV0dXJuIC1FSU5WQUw7Ci0JaWYgKHNpemUgPT0gMCkKLQkJcmV0dXJuIDA7CiAKLQlzcGluX2xvY2tfaXJxKCZ2cGQtPmxvY2spOworCWlmIChtdXRleF9sb2NrX2tpbGxhYmxlKCZ2cGQtPmxvY2spKQorCQlyZXR1cm4gLUVJTlRSOworCiAJcmV0ID0gcGNpX3ZwZF9wY2kyMl93YWl0KGRldik7CiAJaWYgKHJldCA8IDApCiAJCWdvdG8gb3V0OwotCXJldCA9IHBjaV91c2VyX3dyaXRlX2NvbmZpZ193b3JkKGRldiwgdnBkLT5jYXAgKyBQQ0lfVlBEX0FERFIsCi0JCQkJCSBwb3MgJiB+Myk7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gb3V0OwotCXZwZC0+YnVzeSA9IHRydWU7Ci0JdnBkLT5mbGFnID0gMTsKLQlyZXQgPSBwY2lfdnBkX3BjaTIyX3dhaXQoZGV2KTsKLQlpZiAocmV0IDwgMCkKLQkJZ290byBvdXQ7Ci0JcmV0ID0gcGNpX3VzZXJfcmVhZF9jb25maWdfZHdvcmQoZGV2LCB2cGQtPmNhcCArIFBDSV9WUERfREFUQSwKLQkJCQkJICZ2YWwpOwotb3V0OgotCXNwaW5fdW5sb2NrX2lycSgmdnBkLT5sb2NrKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKIAotCS8qIENvbnZlcnQgdG8gYnl0ZXMgKi8KLQliZWdpbiA9IHBvcyAmIDM7Ci0JZW5kID0gbWluKDQsIGJlZ2luICsgc2l6ZSk7Ci0JZm9yIChpID0gMDsgaSA8IGVuZDsgKytpKSB7Ci0JCWlmIChpID49IGJlZ2luKQotCQkJKmJ1ZisrID0gdmFsOwotCQl2YWwgPj49IDg7CisJd2hpbGUgKHBvcyA8IGVuZCkgeworCQl1MzIgdmFsOworCQl1bnNpZ25lZCBpbnQgaSwgc2tpcDsKKworCQlyZXQgPSBwY2lfdXNlcl93cml0ZV9jb25maWdfd29yZChkZXYsIHZwZC0+Y2FwICsgUENJX1ZQRF9BRERSLAorCQkJCQkJIHBvcyAmIH4zKTsKKwkJaWYgKHJldCA8IDApCisJCQlicmVhazsKKwkJdnBkLT5idXN5ID0gdHJ1ZTsKKwkJdnBkLT5mbGFnID0gUENJX1ZQRF9BRERSX0Y7CisJCXJldCA9IHBjaV92cGRfcGNpMjJfd2FpdChkZXYpOworCQlpZiAocmV0IDwgMCkKKwkJCWJyZWFrOworCisJCXJldCA9IHBjaV91c2VyX3JlYWRfY29uZmlnX2R3b3JkKGRldiwgdnBkLT5jYXAgKyBQQ0lfVlBEX0RBVEEsICZ2YWwpOworCQlpZiAocmV0IDwgMCkKKwkJCWJyZWFrOworCisJCXNraXAgPSBwb3MgJiAzOworCQlmb3IgKGkgPSAwOyAgaSA8IHNpemVvZih1MzIpOyBpKyspIHsKKwkJCWlmIChpID49IHNraXApIHsKKwkJCQkqYnVmKysgPSB2YWw7CisJCQkJaWYgKCsrcG9zID09IGVuZCkKKwkJCQkJYnJlYWs7CisJCQl9CisJCQl2YWwgPj49IDg7CisJCX0KIAl9Ci0JcmV0dXJuIGVuZCAtIGJlZ2luOworb3V0OgorCW11dGV4X3VubG9jaygmdnBkLT5sb2NrKTsKKwlyZXR1cm4gcmV0ID8gcmV0IDogY291bnQ7CiB9CiAKLXN0YXRpYyBpbnQgcGNpX3ZwZF9wY2kyMl93cml0ZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgcG9zLCBpbnQgc2l6ZSwKLQkJCSAgICAgICBjb25zdCBjaGFyICpidWYpCitzdGF0aWMgc3NpemVfdCBwY2lfdnBkX3BjaTIyX3dyaXRlKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGxvZmZfdCBwb3MsIHNpemVfdCBjb3VudCwKKwkJCQkgICBjb25zdCB2b2lkICphcmcpCiB7CiAJc3RydWN0IHBjaV92cGRfcGNpMjIgKnZwZCA9CiAJCWNvbnRhaW5lcl9vZihkZXYtPnZwZCwgc3RydWN0IHBjaV92cGRfcGNpMjIsIGJhc2UpOwotCXUzMiB2YWw7Ci0JaW50IHJldDsKKwljb25zdCB1OCAqYnVmID0gYXJnOworCWxvZmZfdCBlbmQgPSBwb3MgKyBjb3VudDsKKwlpbnQgcmV0ID0gMDsKIAotCWlmIChwb3MgPCAwIHx8IHBvcyA+IHZwZC0+YmFzZS5sZW4gfHwgcG9zICYgMyB8fAotCSAgICBzaXplID4gdnBkLT5iYXNlLmxlbiAtIHBvcyB8fCBzaXplIDwgNCkKKwlpZiAocG9zIDwgMCB8fCAocG9zICYgMykgfHwgKGNvdW50ICYgMykgfHwgZW5kID4gdnBkLT5iYXNlLmxlbikKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQl2YWwgPSAodTgpICpidWYrKzsKLQl2YWwgfD0gKCh1OCkgKmJ1ZisrKSA8PCA4OwotCXZhbCB8PSAoKHU4KSAqYnVmKyspIDw8IDE2OwotCXZhbCB8PSAoKHUzMikodTgpICpidWYrKykgPDwgMjQ7CisJaWYgKG11dGV4X2xvY2tfa2lsbGFibGUoJnZwZC0+bG9jaykpCisJCXJldHVybiAtRUlOVFI7CiAKLQlzcGluX2xvY2tfaXJxKCZ2cGQtPmxvY2spOwogCXJldCA9IHBjaV92cGRfcGNpMjJfd2FpdChkZXYpOwogCWlmIChyZXQgPCAwKQogCQlnb3RvIG91dDsKLQlyZXQgPSBwY2lfdXNlcl93cml0ZV9jb25maWdfZHdvcmQoZGV2LCB2cGQtPmNhcCArIFBDSV9WUERfREFUQSwKLQkJCQkJICB2YWwpOwotCWlmIChyZXQgPCAwKQotCQlnb3RvIG91dDsKLQlyZXQgPSBwY2lfdXNlcl93cml0ZV9jb25maWdfd29yZChkZXYsIHZwZC0+Y2FwICsgUENJX1ZQRF9BRERSLAotCQkJCQkgcG9zIHwgUENJX1ZQRF9BRERSX0YpOwotCWlmIChyZXQgPCAwKQotCQlnb3RvIG91dDsKLQl2cGQtPmJ1c3kgPSB0cnVlOwotCXZwZC0+ZmxhZyA9IDA7Ci0JcmV0ID0gcGNpX3ZwZF9wY2kyMl93YWl0KGRldik7CisKKwl3aGlsZSAocG9zIDwgZW5kKSB7CisJCXUzMiB2YWw7CisKKwkJdmFsID0gKmJ1ZisrOworCQl2YWwgfD0gKmJ1ZisrIDw8IDg7CisJCXZhbCB8PSAqYnVmKysgPDwgMTY7CisJCXZhbCB8PSAqYnVmKysgPDwgMjQ7CisKKwkJcmV0ID0gcGNpX3VzZXJfd3JpdGVfY29uZmlnX2R3b3JkKGRldiwgdnBkLT5jYXAgKyBQQ0lfVlBEX0RBVEEsIHZhbCk7CisJCWlmIChyZXQgPCAwKQorCQkJYnJlYWs7CisJCXJldCA9IHBjaV91c2VyX3dyaXRlX2NvbmZpZ193b3JkKGRldiwgdnBkLT5jYXAgKyBQQ0lfVlBEX0FERFIsCisJCQkJCQkgcG9zIHwgUENJX1ZQRF9BRERSX0YpOworCQlpZiAocmV0IDwgMCkKKwkJCWJyZWFrOworCisJCXZwZC0+YnVzeSA9IHRydWU7CisJCXZwZC0+ZmxhZyA9IDA7CisJCXJldCA9IHBjaV92cGRfcGNpMjJfd2FpdChkZXYpOworCisJCXBvcyArPSBzaXplb2YodTMyKTsKKwl9CiBvdXQ6Ci0Jc3Bpbl91bmxvY2tfaXJxKCZ2cGQtPmxvY2spOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCi0JcmV0dXJuIDQ7CisJbXV0ZXhfdW5sb2NrKCZ2cGQtPmxvY2spOworCXJldHVybiByZXQgPyByZXQgOiBjb3VudDsKIH0KIAogc3RhdGljIHZvaWQgcGNpX3ZwZF9wY2kyMl9yZWxlYXNlKHN0cnVjdCBwY2lfZGV2ICpkZXYpCkBAIC0yNTksNyArMzEyLDcgQEAKIAlrZnJlZShjb250YWluZXJfb2YoZGV2LT52cGQsIHN0cnVjdCBwY2lfdnBkX3BjaTIyLCBiYXNlKSk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgcGNpX3ZwZF9vcHMgcGNpX3ZwZF9wY2kyMl9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHBjaV92cGRfb3BzIHBjaV92cGRfcGNpMjJfb3BzID0gewogCS5yZWFkID0gcGNpX3ZwZF9wY2kyMl9yZWFkLAogCS53cml0ZSA9IHBjaV92cGRfcGNpMjJfd3JpdGUsCiAJLnJlbGVhc2UgPSBwY2lfdnBkX3BjaTIyX3JlbGVhc2UsCkBAIC0yNzksNyArMzMyLDcgQEAKIAogCXZwZC0+YmFzZS5sZW4gPSBQQ0lfVlBEX1BDSTIyX1NJWkU7CiAJdnBkLT5iYXNlLm9wcyA9ICZwY2lfdnBkX3BjaTIyX29wczsKLQlzcGluX2xvY2tfaW5pdCgmdnBkLT5sb2NrKTsKKwltdXRleF9pbml0KCZ2cGQtPmxvY2spOwogCXZwZC0+Y2FwID0gY2FwOwogCXZwZC0+YnVzeSA9IGZhbHNlOwogCWRldi0+dnBkID0gJnZwZC0+YmFzZTsKQEAgLTI4Nyw2ICszNDAsMjkgQEAKIH0KIAogLyoqCisgKiBwY2lfdnBkX3RydW5jYXRlIC0gU2V0IGF2YWlsYWJsZSBWaXRhbCBQcm9kdWN0IERhdGEgc2l6ZQorICogQGRldjoJcGNpIGRldmljZSBzdHJ1Y3QKKyAqIEBzaXplOglhdmFpbGFibGUgbWVtb3J5IGluIGJ5dGVzCisgKgorICogQWRqdXN0IHNpemUgb2YgYXZhaWxhYmxlIFZQRCBhcmVhLgorICovCitpbnQgcGNpX3ZwZF90cnVuY2F0ZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBzaXplX3Qgc2l6ZSkKK3sKKwlpZiAoIWRldi0+dnBkKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIGxpbWl0ZWQgYnkgdGhlIGFjY2VzcyBtZXRob2QgKi8KKwlpZiAoc2l6ZSA+IGRldi0+dnBkLT5sZW4pCisJCXJldHVybiAtRUlOVkFMOworCisJZGV2LT52cGQtPmxlbiA9IHNpemU7CisJZGV2LT52cGQtPmF0dHItPnNpemUgPSBzaXplOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKHBjaV92cGRfdHJ1bmNhdGUpOworCisvKioKICAqIHBjaV9ibG9ja191c2VyX2NmZ19hY2Nlc3MgLSBCbG9jayB1c2Vyc3BhY2UgUENJIGNvbmZpZyByZWFkcy93cml0ZXMKICAqIEBkZXY6CXBjaSBkZXZpY2Ugc3RydWN0CiAgKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvYnVzLmMgYi9kcml2ZXJzL3BjaS9idXMuYwppbmRleCA5OTljYzQwLi41MmI1NGYwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9idXMuYworKysgYi9kcml2ZXJzL3BjaS9idXMuYwpAQCAtNzEsNyArNzEsNyBAQAogfQogCiAvKioKLSAqIGFkZCBhIHNpbmdsZSBkZXZpY2UKKyAqIHBjaV9idXNfYWRkX2RldmljZSAtIGFkZCBhIHNpbmdsZSBkZXZpY2UKICAqIEBkZXY6IGRldmljZSB0byBhZGQKICAqCiAgKiBUaGlzIGFkZHMgYSBzaW5nbGUgcGNpIGRldmljZSB0byB0aGUgZ2xvYmFsCkBAIC05MSw2ICs5MSwzNyBAQAogfQogCiAvKioKKyAqIHBjaV9idXNfYWRkX2NoaWxkIC0gYWRkIGEgY2hpbGQgYnVzCisgKiBAYnVzOiBidXMgdG8gYWRkCisgKgorICogVGhpcyBhZGRzIHN5c2ZzIGVudHJpZXMgZm9yIGEgc2luZ2xlIGJ1cworICovCitpbnQgcGNpX2J1c19hZGRfY2hpbGQoc3RydWN0IHBjaV9idXMgKmJ1cykKK3sKKwlpbnQgcmV0dmFsOworCisJaWYgKGJ1cy0+YnJpZGdlKQorCQlidXMtPmRldi5wYXJlbnQgPSBidXMtPmJyaWRnZTsKKworCXJldHZhbCA9IGRldmljZV9yZWdpc3RlcigmYnVzLT5kZXYpOworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CisKKwlidXMtPmlzX2FkZGVkID0gMTsKKworCXJldHZhbCA9IGRldmljZV9jcmVhdGVfZmlsZSgmYnVzLT5kZXYsICZkZXZfYXR0cl9jcHVhZmZpbml0eSk7CisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIHJldHZhbDsKKworCXJldHZhbCA9IGRldmljZV9jcmVhdGVfZmlsZSgmYnVzLT5kZXYsICZkZXZfYXR0cl9jcHVsaXN0YWZmaW5pdHkpOworCisJLyogQ3JlYXRlIGxlZ2FjeV9pbyBhbmQgbGVnYWN5X21lbSBmaWxlcyBmb3IgdGhpcyBidXMgKi8KKwlwY2lfY3JlYXRlX2xlZ2FjeV9maWxlcyhidXMpOworCisJcmV0dXJuIHJldHZhbDsKK30KKworLyoqCiAgKiBwY2lfYnVzX2FkZF9kZXZpY2VzIC0gaW5zZXJ0IG5ld2x5IGRpc2NvdmVyZWQgUENJIGRldmljZXMKICAqIEBidXM6IGJ1cyB0byBjaGVjayBmb3IgbmV3IGRldmljZXMKICAqCkBAIC0xMDUsNyArMTM2LDcgQEAKIHZvaWQgcGNpX2J1c19hZGRfZGV2aWNlcyhzdHJ1Y3QgcGNpX2J1cyAqYnVzKQogewogCXN0cnVjdCBwY2lfZGV2ICpkZXY7Ci0Jc3RydWN0IHBjaV9idXMgKmNoaWxkX2J1czsKKwlzdHJ1Y3QgcGNpX2J1cyAqY2hpbGQ7CiAJaW50IHJldHZhbDsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnkoZGV2LCAmYnVzLT5kZXZpY2VzLCBidXNfbGlzdCkgewpAQCAtMTIwLDQ1ICsxNTEsMjkgQEAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRldiwgJmJ1cy0+ZGV2aWNlcywgYnVzX2xpc3QpIHsKIAkJQlVHX09OKCFkZXYtPmlzX2FkZGVkKTsKIAorCQljaGlsZCA9IGRldi0+c3Vib3JkaW5hdGU7CiAJCS8qCiAJCSAqIElmIHRoZXJlIGlzIGFuIHVuYXR0YWNoZWQgc3Vib3JkaW5hdGUgYnVzLCBhdHRhY2gKIAkJICogaXQgYW5kIHRoZW4gc2NhbiBmb3IgdW5hdHRhY2hlZCBQQ0kgZGV2aWNlcy4KIAkJICovCi0JCWlmIChkZXYtPnN1Ym9yZGluYXRlKSB7Ci0JCSAgICAgICBpZiAobGlzdF9lbXB0eSgmZGV2LT5zdWJvcmRpbmF0ZS0+bm9kZSkpIHsKLQkJCSAgICAgICBkb3duX3dyaXRlKCZwY2lfYnVzX3NlbSk7Ci0JCQkgICAgICAgbGlzdF9hZGRfdGFpbCgmZGV2LT5zdWJvcmRpbmF0ZS0+bm9kZSwKLQkJCQkJICAgICAgICZkZXYtPmJ1cy0+Y2hpbGRyZW4pOwotCQkJICAgICAgIHVwX3dyaXRlKCZwY2lfYnVzX3NlbSk7Ci0JCQl9Ci0JCQlwY2lfYnVzX2FkZF9kZXZpY2VzKGRldi0+c3Vib3JkaW5hdGUpOwotCi0JCQkvKiByZWdpc3RlciB0aGUgYnVzIHdpdGggc3lzZnMgYXMgdGhlIHBhcmVudCBpcyBub3cKLQkJCSAqIHByb3Blcmx5IHJlZ2lzdGVyZWQuICovCi0JCQljaGlsZF9idXMgPSBkZXYtPnN1Ym9yZGluYXRlOwotCQkJaWYgKGNoaWxkX2J1cy0+aXNfYWRkZWQpCi0JCQkJY29udGludWU7Ci0JCQljaGlsZF9idXMtPmRldi5wYXJlbnQgPSBjaGlsZF9idXMtPmJyaWRnZTsKLQkJCXJldHZhbCA9IGRldmljZV9yZWdpc3RlcigmY2hpbGRfYnVzLT5kZXYpOwotCQkJaWYgKHJldHZhbCkKLQkJCQlkZXZfZXJyKCZkZXYtPmRldiwgIkVycm9yIHJlZ2lzdGVyaW5nIHBjaV9idXMsIgotCQkJCQkiIGNvbnRpbnVpbmcuLi5cbiIpOwotCQkJZWxzZSB7Ci0JCQkJY2hpbGRfYnVzLT5pc19hZGRlZCA9IDE7Ci0JCQkJcmV0dmFsID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZjaGlsZF9idXMtPmRldiwKLQkJCQkJCQkmZGV2X2F0dHJfY3B1YWZmaW5pdHkpOwotCQkJfQotCQkJaWYgKHJldHZhbCkKLQkJCQlkZXZfZXJyKCZkZXYtPmRldiwgIkVycm9yIGNyZWF0aW5nIGNwdWFmZmluaXR5IgotCQkJCQkiIGZpbGUsIGNvbnRpbnVpbmcuLi5cbiIpOwotCi0JCQlyZXR2YWwgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJmNoaWxkX2J1cy0+ZGV2LAotCQkJCQkJJmRldl9hdHRyX2NwdWxpc3RhZmZpbml0eSk7Ci0JCQlpZiAocmV0dmFsKQotCQkJCWRldl9lcnIoJmRldi0+ZGV2LAotCQkJCQkiRXJyb3IgY3JlYXRpbmcgY3B1bGlzdGFmZmluaXR5IgotCQkJCQkiIGZpbGUsIGNvbnRpbnVpbmcuLi5cbiIpOworCQlpZiAoIWNoaWxkKQorCQkJY29udGludWU7CisJCWlmIChsaXN0X2VtcHR5KCZjaGlsZC0+bm9kZSkpIHsKKwkJCWRvd25fd3JpdGUoJnBjaV9idXNfc2VtKTsKKwkJCWxpc3RfYWRkX3RhaWwoJmNoaWxkLT5ub2RlLCAmZGV2LT5idXMtPmNoaWxkcmVuKTsKKwkJCXVwX3dyaXRlKCZwY2lfYnVzX3NlbSk7CiAJCX0KKwkJcGNpX2J1c19hZGRfZGV2aWNlcyhjaGlsZCk7CisKKwkJLyoKKwkJICogcmVnaXN0ZXIgdGhlIGJ1cyB3aXRoIHN5c2ZzIGFzIHRoZSBwYXJlbnQgaXMgbm93CisJCSAqIHByb3Blcmx5IHJlZ2lzdGVyZWQuCisJCSAqLworCQlpZiAoY2hpbGQtPmlzX2FkZGVkKQorCQkJY29udGludWU7CisJCXJldHZhbCA9IHBjaV9idXNfYWRkX2NoaWxkKGNoaWxkKTsKKwkJaWYgKHJldHZhbCkKKwkJCWRldl9lcnIoJmRldi0+ZGV2LCAiRXJyb3IgYWRkaW5nIGJ1cywgY29udGludWluZ1xuIik7CiAJfQogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3RwbHVnL01ha2VmaWxlIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9NYWtlZmlsZQppbmRleCA5YmRiZTFhLi5lMzFmYjkxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3RwbHVnL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvTWFrZWZpbGUKQEAgLTU1LDYgKzU1LDkgQEAKIAkJCQlwY2llaHBfY3RybC5vCVwKIAkJCQlwY2llaHBfcGNpLm8JXAogCQkJCXBjaWVocF9ocGMubworaWZkZWYgQ09ORklHX0FDUEkKK3BjaWVocC1vYmpzCQkrPQlwY2llaHBfYWNwaS5vCitlbmRpZgogCiBzaHBjaHAtb2JqcwkJOj0Jc2hwY2hwX2NvcmUubwlcCiAJCQkJc2hwY2hwX2N0cmwubwlcCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3RwbHVnL2FjcGlfcGNpaHAuYyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvYWNwaV9wY2locC5jCmluZGV4IGUxN2VmNTQuLjFjMTE0MTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvYWNwaV9wY2locC5jCisrKyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvYWNwaV9wY2locC5jCkBAIC0zMyw3ICszMyw2IEBACiAjaW5jbHVkZSA8bGludXgvcGNpLWFjcGkuaD4KICNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KICNpbmNsdWRlIDxhY3BpL2FjcGlfYnVzLmg+Ci0jaW5jbHVkZSA8YWNwaS9hY3R5cGVzLmg+CiAKICNkZWZpbmUgTVlfTkFNRQkiYWNwaV9wY2locCIKIApAQCAtNTAxLDUgKzUwMCw3NCBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwoYWNwaV9yb290X2JyaWRnZSk7CiAKKworc3RhdGljIGludCBpc19lamVjdGFibGUoYWNwaV9oYW5kbGUgaGFuZGxlKQoreworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwlhY3BpX2hhbmRsZSB0bXA7CisJdW5zaWduZWQgbG9uZyBsb25nIHJlbW92YWJsZTsKKwlzdGF0dXMgPSBhY3BpX2dldF9oYW5kbGUoaGFuZGxlLCAiX0FEUiIsICZ0bXApOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkKKwkJcmV0dXJuIDA7CisJc3RhdHVzID0gYWNwaV9nZXRfaGFuZGxlKGhhbmRsZSwgIl9FSjAiLCAmdG1wKTsKKwlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpCisJCXJldHVybiAxOworCXN0YXR1cyA9IGFjcGlfZXZhbHVhdGVfaW50ZWdlcihoYW5kbGUsICJfUk1WIiwgTlVMTCwgJnJlbW92YWJsZSk7CisJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpICYmIHJlbW92YWJsZSkKKwkJcmV0dXJuIDE7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogYWNwaV9wY2locF9jaGVja19lamVjdGFibGUgLSBjaGVjayBpZiBoYW5kbGUgaXMgZWplY3RhYmxlIEFDUEkgUENJIHNsb3QKKyAqIEBwYnVzOiB0aGUgUENJIGJ1cyBvZiB0aGUgUENJIHNsb3QgY29ycmVzcG9uZGluZyB0byAnaGFuZGxlJworICogQGhhbmRsZTogQUNQSSBoYW5kbGUgdG8gY2hlY2sKKyAqCisgKiBSZXR1cm4gMSBpZiBoYW5kbGUgaXMgZWplY3RhYmxlIFBDSSBzbG90LCAwIG90aGVyd2lzZS4KKyAqLworaW50IGFjcGlfcGNpX2NoZWNrX2VqZWN0YWJsZShzdHJ1Y3QgcGNpX2J1cyAqcGJ1cywgYWNwaV9oYW5kbGUgaGFuZGxlKQoreworCWFjcGlfaGFuZGxlIGJyaWRnZV9oYW5kbGUsIHBhcmVudF9oYW5kbGU7CisKKwlpZiAoIShicmlkZ2VfaGFuZGxlID0gYWNwaV9wY2lfZ2V0X2JyaWRnZV9oYW5kbGUocGJ1cykpKQorCQlyZXR1cm4gMDsKKwlpZiAoKEFDUElfRkFJTFVSRShhY3BpX2dldF9wYXJlbnQoaGFuZGxlLCAmcGFyZW50X2hhbmRsZSkpKSkKKwkJcmV0dXJuIDA7CisJaWYgKGJyaWRnZV9oYW5kbGUgIT0gcGFyZW50X2hhbmRsZSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIGlzX2VqZWN0YWJsZShoYW5kbGUpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoYWNwaV9wY2lfY2hlY2tfZWplY3RhYmxlKTsKKworc3RhdGljIGFjcGlfc3RhdHVzCitjaGVja19ob3RwbHVnKGFjcGlfaGFuZGxlIGhhbmRsZSwgdTMyIGx2bCwgdm9pZCAqY29udGV4dCwgdm9pZCAqKnJ2KQoreworCWludCAqZm91bmQgPSAoaW50ICopY29udGV4dDsKKwlpZiAoaXNfZWplY3RhYmxlKGhhbmRsZSkpIHsKKwkJKmZvdW5kID0gMTsKKwkJcmV0dXJuIEFFX0NUUkxfVEVSTUlOQVRFOworCX0KKwlyZXR1cm4gQUVfT0s7Cit9CisKKy8qKgorICogYWNwaV9wY2lfZGV0ZWN0X2VqZWN0YWJsZSAtIGNoZWNrIGlmIHRoZSBQQ0kgYnVzIGhhcyBlamVjdGFibGUgc2xvdHMKKyAqIEBwYnVzIC0gUENJIGJ1cyB0byBzY2FuCisgKgorICogUmV0dXJucyAxIGlmIHRoZSBQQ0kgYnVzIGhhcyBBQ1BJIGJhc2VkIGVqZWN0YWJsZSBzbG90cywgMCBvdGhlcndpc2UuCisgKi8KK2ludCBhY3BpX3BjaV9kZXRlY3RfZWplY3RhYmxlKHN0cnVjdCBwY2lfYnVzICpwYnVzKQoreworCWFjcGlfaGFuZGxlIGhhbmRsZTsKKwlpbnQgZm91bmQgPSAwOworCisJaWYgKCEoaGFuZGxlID0gYWNwaV9wY2lfZ2V0X2JyaWRnZV9oYW5kbGUocGJ1cykpKQorCQlyZXR1cm4gMDsKKwlhY3BpX3dhbGtfbmFtZXNwYWNlKEFDUElfVFlQRV9ERVZJQ0UsIGhhbmRsZSwgKHUzMikxLAorCQkJICAgIGNoZWNrX2hvdHBsdWcsICh2b2lkICopJmZvdW5kLCBOVUxMKTsKKwlyZXR1cm4gZm91bmQ7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChhY3BpX3BjaV9kZXRlY3RfZWplY3RhYmxlKTsKKwogbW9kdWxlX3BhcmFtKGRlYnVnX2FjcGksIGJvb2wsIDA2NDQpOwogTU9EVUxFX1BBUk1fREVTQyhkZWJ1Z19hY3BpLCAiRGVidWdnaW5nIG1vZGUgZm9yIEFDUEkgZW5hYmxlZCBvciBub3QiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvYWNwaXBocC5oIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9hY3BpcGhwLmgKaW5kZXggOWJjYjZjYi4uNGZjMTY4YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvaG90cGx1Zy9hY3BpcGhwLmgKKysrIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9hY3BpcGhwLmgKQEAgLTQ0LDcgKzQ0LDcgQEAKIAlkbyB7CQkJCQkJCVwKIAkJaWYgKGFjcGlwaHBfZGVidWcpCQkJCVwKIAkJCXByaW50ayhLRVJOX0RFQlVHICIlczogIiBmb3JtYXQsCVwKLQkJCQlNWV9OQU1FICwgIyMgYXJnKTsgCQlcCisJCQkJTVlfTkFNRSAsICMjIGFyZyk7CQlcCiAJfSB3aGlsZSAoMCkKICNkZWZpbmUgZXJyKGZvcm1hdCwgYXJnLi4uKSBwcmludGsoS0VSTl9FUlIgIiVzOiAiIGZvcm1hdCwgTVlfTkFNRSAsICMjIGFyZykKICNkZWZpbmUgaW5mbyhmb3JtYXQsIGFyZy4uLikgcHJpbnRrKEtFUk5fSU5GTyAiJXM6ICIgZm9ybWF0LCBNWV9OQU1FICwgIyMgYXJnKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvaG90cGx1Zy9hY3BpcGhwX2dsdWUuYyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvYWNwaXBocF9nbHVlLmMKaW5kZXggM2FmZmM2NC4uODAzZDlkZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvaG90cGx1Zy9hY3BpcGhwX2dsdWUuYworKysgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL2FjcGlwaHBfZ2x1ZS5jCkBAIC00Niw2ICs0Niw3IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpX2hvdHBsdWcuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2ktYWNwaS5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAKICNpbmNsdWRlICIuLi9wY2kuaCIKQEAgLTYyLDYxICs2Myw2IEBACiBzdGF0aWMgdm9pZCBhY3BpcGhwX3NldF9ocHBfdmFsdWVzKGFjcGlfaGFuZGxlIGhhbmRsZSwgc3RydWN0IHBjaV9idXMgKmJ1cyk7CiBzdGF0aWMgdm9pZCBoYW5kbGVfaG90cGx1Z19ldmVudF9mdW5jKGFjcGlfaGFuZGxlIGhhbmRsZSwgdTMyIHR5cGUsIHZvaWQgKmNvbnRleHQpOwogCi0KLS8qCi0gKiBpbml0aWFsaXphdGlvbiAmIHRlcm1pbmF0YXRpb24gcm91dGluZXMKLSAqLwotCi0vKioKLSAqIGlzX2VqZWN0YWJsZSAtIGRldGVybWluZSBpZiBhIHNsb3QgaXMgZWplY3RhYmxlCi0gKiBAaGFuZGxlOiBoYW5kbGUgdG8gYWNwaSBuYW1lc3BhY2UKLSAqCi0gKiBFamVjdGFibGUgc2xvdCBzaG91bGQgc2F0aXNmeSBhdCBsZWFzdCB0aGVzZSBjb25kaXRpb25zOgotICoKLSAqICAxLiBoYXMgX0FEUiBtZXRob2QKLSAqICAyLiBoYXMgX0VKMCBtZXRob2QKLSAqCi0gKiBvcHRpb25hbGx5Ci0gKgotICogIDEuIGhhcyBfU1RBIG1ldGhvZAotICogIDIuIGhhcyBfUFMwIG1ldGhvZAotICogIDMuIGhhcyBfUFMzIG1ldGhvZAotICogIDQuIC4uCi0gKi8KLXN0YXRpYyBpbnQgaXNfZWplY3RhYmxlKGFjcGlfaGFuZGxlIGhhbmRsZSkKLXsKLQlhY3BpX3N0YXR1cyBzdGF0dXM7Ci0JYWNwaV9oYW5kbGUgdG1wOwotCi0Jc3RhdHVzID0gYWNwaV9nZXRfaGFuZGxlKGhhbmRsZSwgIl9BRFIiLCAmdG1wKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJcmV0dXJuIDA7Ci0JfQotCi0Jc3RhdHVzID0gYWNwaV9nZXRfaGFuZGxlKGhhbmRsZSwgIl9FSjAiLCAmdG1wKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JcmV0dXJuIDE7Ci19Ci0KLQotLyogY2FsbGJhY2sgcm91dGluZSB0byBjaGVjayBmb3IgdGhlIGV4aXN0ZW5jZSBvZiBlamVjdGFibGUgc2xvdHMgKi8KLXN0YXRpYyBhY3BpX3N0YXR1cwotaXNfZWplY3RhYmxlX3Nsb3QoYWNwaV9oYW5kbGUgaGFuZGxlLCB1MzIgbHZsLCB2b2lkICpjb250ZXh0LCB2b2lkICoqcnYpCi17Ci0JaW50ICpjb3VudCA9IChpbnQgKiljb250ZXh0OwotCi0JaWYgKGlzX2VqZWN0YWJsZShoYW5kbGUpKSB7Ci0JCSgqY291bnQpKys7Ci0JCS8qIG9ubHkgb25lIGVqZWN0YWJsZSBzbG90IGlzIGVub3VnaCAqLwotCQlyZXR1cm4gQUVfQ1RSTF9URVJNSU5BVEU7Ci0JfSBlbHNlIHsKLQkJcmV0dXJuIEFFX09LOwotCX0KLX0KLQogLyogY2FsbGJhY2sgcm91dGluZSB0byBjaGVjayBmb3IgdGhlIGV4aXN0ZW5jZSBvZiBhIHBjaSBkb2NrIGRldmljZSAqLwogc3RhdGljIGFjcGlfc3RhdHVzCiBpc19wY2lfZG9ja19kZXZpY2UoYWNwaV9oYW5kbGUgaGFuZGxlLCB1MzIgbHZsLCB2b2lkICpjb250ZXh0LCB2b2lkICoqcnYpCkBAIC0xMzEsOSArNzcsNiBAQAogCX0KIH0KIAotCi0KLQogLyoKICAqIHRoZSBfRENLIG1ldGhvZCBjYW4gZG8gZnVubnkgdGhpbmdzLi4uIGFuZCBzb21ldGltZXMgbm90CiAgKiBoYWgtaGFoIGZ1bm55LgpAQCAtMTYwLDkgKzEwMyw5IEBACiAKIAlpZiAoKChidXNlcyA+PiA4KSAmIDB4ZmYpICE9IGJ1cy0+c2Vjb25kYXJ5KSB7CiAJCWJ1c2VzID0gKGJ1c2VzICYgMHhmZjAwMDAwMCkKLQkgICAgIAkJfCAoKHVuc2lnbmVkIGludCkoYnVzLT5wcmltYXJ5KSAgICAgPDwgIDApCi0JICAgICAJCXwgKCh1bnNpZ25lZCBpbnQpKGJ1cy0+c2Vjb25kYXJ5KSAgIDw8ICA4KQotCSAgICAgCQl8ICgodW5zaWduZWQgaW50KShidXMtPnN1Ym9yZGluYXRlKSA8PCAxNik7CisJCQl8ICgodW5zaWduZWQgaW50KShidXMtPnByaW1hcnkpICAgICA8PCAgMCkKKwkJCXwgKCh1bnNpZ25lZCBpbnQpKGJ1cy0+c2Vjb25kYXJ5KSAgIDw8ICA4KQorCQkJfCAoKHVuc2lnbmVkIGludCkoYnVzLT5zdWJvcmRpbmF0ZSkgPDwgMTYpOwogCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGJ1cy0+c2VsZiwgUENJX1BSSU1BUllfQlVTLCBidXNlcyk7CiAJfQogCXJldHVybiBOT1RJRllfT0s7CkBAIC0xODQsMTcgKzEyNywxMiBAQAogCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOwogCXVuc2lnbmVkIGxvbmcgbG9uZyBhZHIsIHN1bjsKIAlpbnQgZGV2aWNlLCBmdW5jdGlvbiwgcmV0dmFsOworCXN0cnVjdCBwY2lfYnVzICpwYnVzID0gYnJpZGdlLT5wY2lfYnVzOwogCi0Jc3RhdHVzID0gYWNwaV9ldmFsdWF0ZV9pbnRlZ2VyKGhhbmRsZSwgIl9BRFIiLCBOVUxMLCAmYWRyKTsKLQotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkKKwlpZiAoIWFjcGlfcGNpX2NoZWNrX2VqZWN0YWJsZShwYnVzLCBoYW5kbGUpICYmICFpc19kb2NrX2RldmljZShoYW5kbGUpKQogCQlyZXR1cm4gQUVfT0s7CiAKLQlzdGF0dXMgPSBhY3BpX2dldF9oYW5kbGUoaGFuZGxlLCAiX0VKMCIsICZ0bXApOwotCi0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpICYmICEoaXNfZG9ja19kZXZpY2UoaGFuZGxlKSkpCi0JCXJldHVybiBBRV9PSzsKLQorCWFjcGlfZXZhbHVhdGVfaW50ZWdlcihoYW5kbGUsICJfQURSIiwgTlVMTCwgJmFkcik7CiAJZGV2aWNlID0gKGFkciA+PiAxNikgJiAweGZmZmY7CiAJZnVuY3Rpb24gPSBhZHIgJiAweGZmZmY7CiAKQEAgLTIwNSw3ICsxNDMsOCBAQAogCUlOSVRfTElTVF9IRUFEKCZuZXdmdW5jLT5zaWJsaW5nKTsKIAluZXdmdW5jLT5oYW5kbGUgPSBoYW5kbGU7CiAJbmV3ZnVuYy0+ZnVuY3Rpb24gPSBmdW5jdGlvbjsKLQlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpCisKKwlpZiAoQUNQSV9TVUNDRVNTKGFjcGlfZ2V0X2hhbmRsZShoYW5kbGUsICJfRUowIiwgJnRtcCkpKQogCQluZXdmdW5jLT5mbGFncyA9IEZVTkNfSEFTX0VKMDsKIAogCWlmIChBQ1BJX1NVQ0NFU1MoYWNwaV9nZXRfaGFuZGxlKGhhbmRsZSwgIl9TVEEiLCAmdG1wKSkpCkBAIC0yNTYsOCArMTk1LDcgQEAKIAkJYnJpZGdlLT5ucl9zbG90cysrOwogCiAJCWRiZygiZm91bmQgQUNQSSBQQ0kgSG90cGx1ZyBzbG90ICVsbHUgYXQgUENJICUwNHg6JTAyeDolMDJ4XG4iLAotCQkJCXNsb3QtPnN1biwgcGNpX2RvbWFpbl9ucihicmlkZ2UtPnBjaV9idXMpLAotCQkJCWJyaWRnZS0+cGNpX2J1cy0+bnVtYmVyLCBzbG90LT5kZXZpY2UpOworCQkgICAgc2xvdC0+c3VuLCBwY2lfZG9tYWluX25yKHBidXMpLCBwYnVzLT5udW1iZXIsIGRldmljZSk7CiAJCXJldHZhbCA9IGFjcGlwaHBfcmVnaXN0ZXJfaG90cGx1Z19zbG90KHNsb3QpOwogCQlpZiAocmV0dmFsKSB7CiAJCQlpZiAocmV0dmFsID09IC1FQlVTWSkKQEAgLTI3NCw4ICsyMTIsNyBAQAogCWxpc3RfYWRkX3RhaWwoJm5ld2Z1bmMtPnNpYmxpbmcsICZzbG90LT5mdW5jcyk7CiAKIAkvKiBhc3NvY2lhdGUgY29ycmVzcG9uZGluZyBwY2lfZGV2ICovCi0JbmV3ZnVuYy0+cGNpX2RldiA9IHBjaV9nZXRfc2xvdChicmlkZ2UtPnBjaV9idXMsCi0JCQkJCSBQQ0lfREVWRk4oZGV2aWNlLCBmdW5jdGlvbikpOworCW5ld2Z1bmMtPnBjaV9kZXYgPSBwY2lfZ2V0X3Nsb3QocGJ1cywgUENJX0RFVkZOKGRldmljZSwgZnVuY3Rpb24pKTsKIAlpZiAobmV3ZnVuYy0+cGNpX2RldikgewogCQlzbG90LT5mbGFncyB8PSAoU0xPVF9FTkFCTEVEIHwgU0xPVF9QT1dFUkVET04pOwogCX0KQEAgLTMyNCwyNyArMjYxLDE3IEBACiAKIAogLyogc2VlIGlmIGl0J3Mgd29ydGggbG9va2luZyBhdCB0aGlzIGJyaWRnZSAqLwotc3RhdGljIGludCBkZXRlY3RfZWplY3RhYmxlX3Nsb3RzKGFjcGlfaGFuZGxlICpicmlkZ2VfaGFuZGxlKQorc3RhdGljIGludCBkZXRlY3RfZWplY3RhYmxlX3Nsb3RzKHN0cnVjdCBwY2lfYnVzICpwYnVzKQogewotCWFjcGlfc3RhdHVzIHN0YXR1czsKLQlpbnQgY291bnQ7Ci0KLQljb3VudCA9IDA7Ci0KLQkvKiBvbmx5IGNoZWNrIHNsb3RzIGRlZmluZWQgZGlyZWN0bHkgYmVsb3cgYnJpZGdlIG9iamVjdCAqLwotCXN0YXR1cyA9IGFjcGlfd2Fsa19uYW1lc3BhY2UoQUNQSV9UWVBFX0RFVklDRSwgYnJpZGdlX2hhbmRsZSwgKHUzMikxLAotCQkJCSAgICAgaXNfZWplY3RhYmxlX3Nsb3QsICh2b2lkICopJmNvdW50LCBOVUxMKTsKLQotCS8qCi0JICogd2UgYWxzbyBuZWVkIHRvIGFkZCB0aGlzIGJyaWRnZSBpZiB0aGVyZSBpcyBhIGRvY2sgYnJpZGdlIG9yCi0JICogb3RoZXIgcGNpIGRldmljZSBvbiBhIGRvY2sgc3RhdGlvbiAocmVtb3ZhYmxlKQotCSAqLwotCWlmICghY291bnQpCi0JCXN0YXR1cyA9IGFjcGlfd2Fsa19uYW1lc3BhY2UoQUNQSV9UWVBFX0RFVklDRSwgYnJpZGdlX2hhbmRsZSwKLQkJCQkodTMyKTEsIGlzX3BjaV9kb2NrX2RldmljZSwgKHZvaWQgKikmY291bnQsCi0JCQkJTlVMTCk7Ci0KLQlyZXR1cm4gY291bnQ7CisJaW50IGZvdW5kID0gYWNwaV9wY2lfZGV0ZWN0X2VqZWN0YWJsZShwYnVzKTsKKwlpZiAoIWZvdW5kKSB7CisJCWFjcGlfaGFuZGxlIGJyaWRnZV9oYW5kbGUgPSBhY3BpX3BjaV9nZXRfYnJpZGdlX2hhbmRsZShwYnVzKTsKKwkJaWYgKCFicmlkZ2VfaGFuZGxlKQorCQkJcmV0dXJuIDA7CisJCWFjcGlfd2Fsa19uYW1lc3BhY2UoQUNQSV9UWVBFX0RFVklDRSwgYnJpZGdlX2hhbmRsZSwgKHUzMikxLAorCQkJCSAgICBpc19wY2lfZG9ja19kZXZpY2UsICh2b2lkICopJmZvdW5kLCBOVUxMKTsKKwl9CisJcmV0dXJuIGZvdW5kOwogfQogCiAKQEAgLTU1NCw3ICs0ODEsNyBAQAogCQlnb3RvIG91dDsKIAogCS8qIGNoZWNrIGlmIHRoaXMgYnJpZGdlIGhhcyBlamVjdGFibGUgc2xvdHMgKi8KLQlpZiAoKGRldGVjdF9lamVjdGFibGVfc2xvdHMoaGFuZGxlKSA+IDApKSB7CisJaWYgKChkZXRlY3RfZWplY3RhYmxlX3Nsb3RzKGRldi0+c3Vib3JkaW5hdGUpID4gMCkpIHsKIAkJZGJnKCJmb3VuZCBQQ0ktdG8tUENJIGJyaWRnZSBhdCBQQ0kgJXNcbiIsIHBjaV9uYW1lKGRldikpOwogCQlhZGRfcDJwX2JyaWRnZShoYW5kbGUsIGRldik7CiAJfQpAQCAtNjE1LDcgKzU0Miw3IEBACiAJfQogCiAJLyogY2hlY2sgaWYgdGhpcyBicmlkZ2UgaGFzIGVqZWN0YWJsZSBzbG90cyAqLwotCWlmIChkZXRlY3RfZWplY3RhYmxlX3Nsb3RzKGhhbmRsZSkgPiAwKSB7CisJaWYgKGRldGVjdF9lamVjdGFibGVfc2xvdHMocGNpX2J1cykgPiAwKSB7CiAJCWRiZygiZm91bmQgUENJIGhvc3QtYnVzIGJyaWRnZSB3aXRoIGhvdC1wbHVnZ2FibGUgc2xvdHNcbiIpOwogCQlhZGRfaG9zdF9icmlkZ2UoaGFuZGxlLCBwY2lfYnVzKTsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3RwbHVnL2FjcGlwaHBfaWJtLmMgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL2FjcGlwaHBfaWJtLmMKaW5kZXggODgxZmRkMi4uNWJlZmE3ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvaG90cGx1Zy9hY3BpcGhwX2libS5jCisrKyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvYWNwaXBocF9pYm0uYwpAQCAtMjcxLDcgKzI3MSw3IEBACiAJCWRiZygiJXM6IGdlbmVyYXRpb25nIGJ1cyBldmVudFxuIiwgX19mdW5jX18pOwogCQlhY3BpX2J1c19nZW5lcmF0ZV9wcm9jX2V2ZW50KG5vdGUtPmRldmljZSwgbm90ZS0+ZXZlbnQsIGRldGFpbCk7CiAJCWFjcGlfYnVzX2dlbmVyYXRlX25ldGxpbmtfZXZlbnQobm90ZS0+ZGV2aWNlLT5wbnAuZGV2aWNlX2NsYXNzLAotCQkJCQkJICBub3RlLT5kZXZpY2UtPmRldi5idXNfaWQsCisJCQkJCQkgIGRldl9uYW1lKCZub3RlLT5kZXZpY2UtPmRldiksCiAJCQkJCQkgIG5vdGUtPmV2ZW50LCBkZXRhaWwpOwogCX0gZWxzZQogCQlub3RlLT5ldmVudCA9IGV2ZW50OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvaG90cGx1Zy9jcHFwaHBfY3RybC5jIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9jcHFwaHBfY3RybC5jCmluZGV4IGE2MGEyNTIuLmNjMjI3YTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvY3BxcGhwX2N0cmwuYworKysgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL2NwcXBocF9jdHJsLmMKQEAgLTE5NTQsNyArMTk1NCw3IEBACiAJCQlyZXR1cm4gOwogCQl9CiAKLQkJaWYgKGZ1bmMgIT0gTlVMTCAmJiBjdHJsICE9IE5VTEwpIHsKKwkJaWYgKGN0cmwgIT0gTlVMTCkgewogCQkJaWYgKGNwcWhwX3Byb2Nlc3NfU0koY3RybCwgZnVuYykgIT0gMCkgewogCQkJCWFtYmVyX0xFRF9vbihjdHJsLCBocF9zbG90KTsKIAkJCQlncmVlbl9MRURfb2ZmKGN0cmwsIGhwX3Nsb3QpOwpAQCAtMjYwNCw3ICsyNjA0LDcgQEAKIAkJCWZvciAoY2xvb3AgPSAwOyBjbG9vcCA8IDQ7IGNsb29wKyspIHsKIAkJCQlpZiAoaXJxcy52YWxpZF9JTlQgJiAoMHgwMSA8PCBjbG9vcCkpIHsKIAkJCQkJcmMgPSBjcHFocF9zZXRfaXJxKGZ1bmMtPmJ1cywgZnVuYy0+ZGV2aWNlLAotCQkJCQkJCSAgIDB4MEEgKyBjbG9vcCwgaXJxcy5pbnRlcnJ1cHRbY2xvb3BdKTsKKwkJCQkJCQkgICBjbG9vcCArIDEsIGlycXMuaW50ZXJydXB0W2Nsb29wXSk7CiAJCQkJCWlmIChyYykKIAkJCQkJCWdvdG8gZnJlZV9hbmRfb3V0OwogCQkJCX0KQEAgLTI5NDUsNyArMjk0NSw3IEBACiAJCX0KIAogCQlpZiAoIWJlaGluZF9icmlkZ2UpIHsKLQkJCXJjID0gY3BxaHBfc2V0X2lycShmdW5jLT5idXMsIGZ1bmMtPmRldmljZSwgdGVtcF9ieXRlICsgMHgwOSwgSVJRKTsKKwkJCXJjID0gY3BxaHBfc2V0X2lycShmdW5jLT5idXMsIGZ1bmMtPmRldmljZSwgdGVtcF9ieXRlLCBJUlEpOwogCQkJaWYgKHJjKQogCQkJCXJldHVybiAxOwogCQl9IGVsc2UgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvaG90cGx1Zy9jcHFwaHBfcGNpLmMgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL2NwcXBocF9wY2kuYwppbmRleCBkZjE0NmJlLi42YzBlZDBmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3RwbHVnL2NwcXBocF9wY2kuYworKysgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL2NwcXBocF9wY2kuYwpAQCAtMTcxLDcgKzE3MSw3IEBACiAJCWZha2VidXMtPm51bWJlciA9IGJ1c19udW07CiAJCWRiZygiJXM6IGRldiAlZCwgYnVzICVkLCBwaW4gJWQsIG51bSAlZFxuIiwKIAkJICAgIF9fZnVuY19fLCBkZXZfbnVtLCBidXNfbnVtLCBpbnRfcGluLCBpcnFfbnVtKTsKLQkJcmMgPSBwY2liaW9zX3NldF9pcnFfcm91dGluZyhmYWtlZGV2LCBpbnRfcGluIC0gMHgwYSwgaXJxX251bSk7CisJCXJjID0gcGNpYmlvc19zZXRfaXJxX3JvdXRpbmcoZmFrZWRldiwgaW50X3BpbiAtIDEsIGlycV9udW0pOwogCQlrZnJlZShmYWtlZGV2KTsKIAkJa2ZyZWUoZmFrZWJ1cyk7CiAJCWRiZygiJXM6IHJjICVkXG4iLCBfX2Z1bmNfXywgcmMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvaG90cGx1Zy9mYWtlcGhwLmMgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL2Zha2VwaHAuYwppbmRleCAzYTI2MzdhLi5iMGU3ZGU5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3RwbHVnL2Zha2VwaHAuYworKysgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL2Zha2VwaHAuYwpAQCAtMzI0LDYgKzMyNCw3IEBACiAKIAkJaWYgKHRlc3RfYW5kX3NldF9iaXQoMCwgJmRzbG90LT5yZW1vdmVkKSkgewogCQkJZGJnKCJTbG90IGFscmVhZHkgc2NoZWR1bGVkIGZvciByZW1vdmFsXG4iKTsKKwkJCXBjaV9kZXZfcHV0KGRldik7CiAJCQlyZXR1cm4gLUVOT0RFVjsKIAkJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaWVocC5oIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9wY2llaHAuaAppbmRleCBiMjgwMWE3Li5kYjg1Mjg0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaWVocC5oCisrKyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvcGNpZWhwLmgKQEAgLTIxNywxNCArMjE3LDI1IEBACiAjaWZkZWYgQ09ORklHX0FDUEkKICNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KICNpbmNsdWRlIDxhY3BpL2FjcGlfYnVzLmg+Ci0jaW5jbHVkZSA8YWNwaS9hY3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLWFjcGkuaD4KIAorZXh0ZXJuIHZvaWQgX19pbml0IHBjaWVocF9hY3BpX3Nsb3RfZGV0ZWN0aW9uX2luaXQodm9pZCk7CitleHRlcm4gaW50IHBjaWVocF9hY3BpX3Nsb3RfZGV0ZWN0aW9uX2NoZWNrKHN0cnVjdCBwY2lfZGV2ICpkZXYpOworCitzdGF0aWMgaW5saW5lIHZvaWQgcGNpZWhwX2Zpcm13YXJlX2luaXQodm9pZCkKK3sKKwlwY2llaHBfYWNwaV9zbG90X2RldGVjdGlvbl9pbml0KCk7Cit9CisKIHN0YXRpYyBpbmxpbmUgaW50IHBjaWVocF9nZXRfaHBfaHdfY29udHJvbF9mcm9tX2Zpcm13YXJlKHN0cnVjdCBwY2lfZGV2ICpkZXYpCiB7CisJaW50IHJldHZhbDsKIAl1MzIgZmxhZ3MgPSAoT1NDX1BDSV9FWFBSRVNTX05BVElWRV9IUF9DT05UUk9MIHwKIAkJICAgICBPU0NfUENJX0VYUFJFU1NfQ0FQX1NUUlVDVFVSRV9DT05UUk9MKTsKLQlyZXR1cm4gYWNwaV9nZXRfaHBfaHdfY29udHJvbF9mcm9tX2Zpcm13YXJlKGRldiwgZmxhZ3MpOworCXJldHZhbCA9IGFjcGlfZ2V0X2hwX2h3X2NvbnRyb2xfZnJvbV9maXJtd2FyZShkZXYsIGZsYWdzKTsKKwlpZiAocmV0dmFsKQorCQlyZXR1cm4gcmV0dmFsOworCXJldHVybiBwY2llaHBfYWNwaV9zbG90X2RldGVjdGlvbl9jaGVjayhkZXYpOwogfQogCiBzdGF0aWMgaW5saW5lIGludCBwY2llaHBfZ2V0X2hwX3BhcmFtc19mcm9tX2Zpcm13YXJlKHN0cnVjdCBwY2lfZGV2ICpkZXYsCkBAIC0yMzUsNiArMjQ2LDcgQEAKIAlyZXR1cm4gMDsKIH0KICNlbHNlCisjZGVmaW5lIHBjaWVocF9maXJtd2FyZV9pbml0KCkJCQkJZG8ge30gd2hpbGUgKDApCiAjZGVmaW5lIHBjaWVocF9nZXRfaHBfaHdfY29udHJvbF9mcm9tX2Zpcm13YXJlKGRldikgCTAKICNkZWZpbmUgcGNpZWhwX2dldF9ocF9wYXJhbXNfZnJvbV9maXJtd2FyZShkZXYsIGhwcCkgICAgKC1FTk9ERVYpCiAjZW5kaWYgCQkJCS8qIENPTkZJR19BQ1BJICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaWVocF9hY3BpLmMgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaWVocF9hY3BpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDM4ZDc5NQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvcGNpZWhwX2FjcGkuYwpAQCAtMCwwICsxLDE0MSBAQAorLyoKKyAqIEFDUEkgcmVsYXRlZCBmdW5jdGlvbnMgZm9yIFBDSSBFeHByZXNzIEhvdCBQbHVnIGRyaXZlci4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggS2VuamkgS2FuZXNoaWdlCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggRnVqaXRzdSBMaW1pdGVkLgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKKyAqIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIEdPT0QgVElUTEUgb3IKKyAqIE5PTiBJTkZSSU5HRU1FTlQuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlCisgKiBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9hY3BpLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvcGNpX2hvdHBsdWcuaD4KKyNpbmNsdWRlICJwY2llaHAuaCIKKworI2RlZmluZSBQQ0lFSFBfREVURUNUX1BDSUUJKDApCisjZGVmaW5lIFBDSUVIUF9ERVRFQ1RfQUNQSQkoMSkKKyNkZWZpbmUgUENJRUhQX0RFVEVDVF9BVVRPCSgyKQorI2RlZmluZSBQQ0lFSFBfREVURUNUX0RFRkFVTFQJUENJRUhQX0RFVEVDVF9BVVRPCisKK3N0YXRpYyBpbnQgc2xvdF9kZXRlY3Rpb25fbW9kZTsKK3N0YXRpYyBjaGFyICpwY2llaHBfZGV0ZWN0X21vZGU7Cittb2R1bGVfcGFyYW0ocGNpZWhwX2RldGVjdF9tb2RlLCBjaGFycCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKHBjaWVocF9kZXRlY3RfbW9kZSwKKwkgIlNsb3QgZGV0ZWN0aW9uIG1vZGU6IHBjaWUsIGFjcGksIGF1dG9cbiIKKwkgIiAgcGNpZSAgICAgICAgICAtIFVzZSBQQ0llIGJhc2VkIHNsb3QgZGV0ZWN0aW9uXG4iCisJICIgIGFjcGkgICAgICAgICAgLSBVc2UgQUNQSSBmb3Igc2xvdCBkZXRlY3Rpb25cbiIKKwkgIiAgYXV0byhkZWZhdWx0KSAtIEF1dG8gc2VsZWN0IG1vZGUuIFVzZSBhY3BpIG9wdGlvbiBpZiBkdXBsaWNhdGVcbiIKKwkgIiAgICAgICAgICAgICAgICAgIHNsb3QgaWRzIGFyZSBmb3VuZC4gT3RoZXJ3aXNlLCB1c2UgcGNpZSBvcHRpb25cbiIpOworCitpbnQgcGNpZWhwX2FjcGlfc2xvdF9kZXRlY3Rpb25fY2hlY2soc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwlpZiAoc2xvdF9kZXRlY3Rpb25fbW9kZSAhPSBQQ0lFSFBfREVURUNUX0FDUEkpCisJCXJldHVybiAwOworCWlmIChhY3BpX3BjaV9kZXRlY3RfZWplY3RhYmxlKGRldi0+c3Vib3JkaW5hdGUpKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gLUVOT0RFVjsKK30KKworc3RhdGljIGludCBfX2luaXQgcGFyc2VfZGV0ZWN0X21vZGUodm9pZCkKK3sKKwlpZiAoIXBjaWVocF9kZXRlY3RfbW9kZSkKKwkJcmV0dXJuIFBDSUVIUF9ERVRFQ1RfREVGQVVMVDsKKwlpZiAoIXN0cmNtcChwY2llaHBfZGV0ZWN0X21vZGUsICJwY2llIikpCisJCXJldHVybiBQQ0lFSFBfREVURUNUX1BDSUU7CisJaWYgKCFzdHJjbXAocGNpZWhwX2RldGVjdF9tb2RlLCAiYWNwaSIpKQorCQlyZXR1cm4gUENJRUhQX0RFVEVDVF9BQ1BJOworCWlmICghc3RyY21wKHBjaWVocF9kZXRlY3RfbW9kZSwgImF1dG8iKSkKKwkJcmV0dXJuIFBDSUVIUF9ERVRFQ1RfQVVUTzsKKwl3YXJuKCJiYWQgc3BlY2lmaWVyICclcycgZm9yIHBjaWVocF9kZXRlY3RfbW9kZS4gVXNlIGRlZmF1bHRcbiIsCisJICAgICBwY2llaHBfZGV0ZWN0X21vZGUpOworCXJldHVybiBQQ0lFSFBfREVURUNUX0RFRkFVTFQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpZV9wb3J0X3NlcnZpY2VfaWQgX19pbml0ZGF0YSBwb3J0X3BjaV9pZHNbXSA9IHsKKwl7CisJCS52ZW5kb3IgPSBQQ0lfQU5ZX0lELAorCQkuZGV2aWNlID0gUENJX0FOWV9JRCwKKwkJLnBvcnRfdHlwZSA9IFBDSUVfQU5ZX1BPUlQsCisJCS5zZXJ2aWNlX3R5cGUgPSBQQ0lFX1BPUlRfU0VSVklDRV9IUCwKKwkJLmRyaXZlcl9kYXRhID0gIDAsCisgICAgICAgIH0sIHsgLyogZW5kOiBhbGwgemVyb2VzICovIH0KK307CisKK3N0YXRpYyBpbnQgX19pbml0ZGF0YSBkdXBfc2xvdF9pZDsKK3N0YXRpYyBpbnQgX19pbml0ZGF0YSBhY3BpX3Nsb3RfZGV0ZWN0ZWQ7CitzdGF0aWMgc3RydWN0IGxpc3RfaGVhZCBfX2luaXRkYXRhIGR1bW15X3Nsb3RzID0gTElTVF9IRUFEX0lOSVQoZHVtbXlfc2xvdHMpOworCisvKiBEdW1teSBkcml2ZXIgZm9yIGR1bXBsaWNhdGUgbmFtZSBkZXRlY3Rpb24gKi8KK3N0YXRpYyBpbnQgX19pbml0IGR1bW15X3Byb2JlKHN0cnVjdCBwY2llX2RldmljZSAqZGV2LAorCQkJICAgICAgY29uc3Qgc3RydWN0IHBjaWVfcG9ydF9zZXJ2aWNlX2lkICppZCkKK3sKKwlpbnQgcG9zOworCXUzMiBzbG90X2NhcDsKKwlzdHJ1Y3Qgc2xvdCAqc2xvdCwgKnRtcDsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IGRldi0+cG9ydDsKKwlzdHJ1Y3QgcGNpX2J1cyAqcGJ1cyA9IHBkZXYtPnN1Ym9yZGluYXRlOworCWlmICghKHNsb3QgPSBremFsbG9jKHNpemVvZigqc2xvdCksIEdGUF9LRVJORUwpKSkKKwkJcmV0dXJuIC1FTk9NRU07CisJLyogTm90ZTogcGNpZWhwX2RldGVjdF9tb2RlICE9IFBDSUVIUF9ERVRFQ1RfQUNQSSBoZXJlICovCisJaWYgKHBjaWVocF9nZXRfaHBfaHdfY29udHJvbF9mcm9tX2Zpcm13YXJlKHBkZXYpKQorCQlyZXR1cm4gLUVOT0RFVjsKKwlpZiAoIShwb3MgPSBwY2lfZmluZF9jYXBhYmlsaXR5KHBkZXYsIFBDSV9DQVBfSURfRVhQKSkpCisJCXJldHVybiAtRU5PREVWOworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwZGV2LCBwb3MgKyBQQ0lfRVhQX1NMVENBUCwgJnNsb3RfY2FwKTsKKwlzbG90LT5udW1iZXIgPSBzbG90X2NhcCA+PiAxOTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHRtcCwgJmR1bW15X3Nsb3RzLCBzbG90X2xpc3QpIHsKKwkJaWYgKHRtcC0+bnVtYmVyID09IHNsb3QtPm51bWJlcikKKwkJCWR1cF9zbG90X2lkKys7CisJfQorCWxpc3RfYWRkX3RhaWwoJnNsb3QtPnNsb3RfbGlzdCwgJmR1bW15X3Nsb3RzKTsKKwlpZiAoIWFjcGlfc2xvdF9kZXRlY3RlZCAmJiBhY3BpX3BjaV9kZXRlY3RfZWplY3RhYmxlKHBidXMpKQorCQlhY3BpX3Nsb3RfZGV0ZWN0ZWQgPSAxOworCXJldHVybiAtRU5PREVWOyAgICAgICAgIC8qIGR1bW15IGRyaXZlciBhbHdheXMgcmV0dXJucyBlcnJvciAqLworfQorCitzdGF0aWMgc3RydWN0IHBjaWVfcG9ydF9zZXJ2aWNlX2RyaXZlciBfX2luaXRkYXRhIGR1bW15X2RyaXZlciA9IHsKKyAgICAgICAgLm5hbWUgICAgICAgICAgID0gInBjaWVocF9kdW1teSIsCisgICAgICAgIC5pZF90YWJsZSAgICAgICA9IHBvcnRfcGNpX2lkcywKKyAgICAgICAgLnByb2JlICAgICAgICAgID0gZHVtbXlfcHJvYmUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBzZWxlY3RfZGV0ZWN0aW9uX21vZGUodm9pZCkKK3sKKwlzdHJ1Y3Qgc2xvdCAqc2xvdCwgKnRtcDsKKwlwY2llX3BvcnRfc2VydmljZV9yZWdpc3RlcigmZHVtbXlfZHJpdmVyKTsKKwlwY2llX3BvcnRfc2VydmljZV91bnJlZ2lzdGVyKCZkdW1teV9kcml2ZXIpOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShzbG90LCB0bXAsICZkdW1teV9zbG90cywgc2xvdF9saXN0KSB7CisJCWxpc3RfZGVsKCZzbG90LT5zbG90X2xpc3QpOworCQlrZnJlZShzbG90KTsKKwl9CisJaWYgKGFjcGlfc2xvdF9kZXRlY3RlZCAmJiBkdXBfc2xvdF9pZCkKKwkJcmV0dXJuIFBDSUVIUF9ERVRFQ1RfQUNQSTsKKwlyZXR1cm4gUENJRUhQX0RFVEVDVF9QQ0lFOworfQorCit2b2lkIF9faW5pdCBwY2llaHBfYWNwaV9zbG90X2RldGVjdGlvbl9pbml0KHZvaWQpCit7CisJc2xvdF9kZXRlY3Rpb25fbW9kZSA9IHBhcnNlX2RldGVjdF9tb2RlKCk7CisJaWYgKHNsb3RfZGV0ZWN0aW9uX21vZGUgIT0gUENJRUhQX0RFVEVDVF9BVVRPKQorCQlnb3RvIG91dDsKKwlzbG90X2RldGVjdGlvbl9tb2RlID0gc2VsZWN0X2RldGVjdGlvbl9tb2RlKCk7CitvdXQ6CisJaWYgKHNsb3RfZGV0ZWN0aW9uX21vZGUgPT0gUENJRUhQX0RFVEVDVF9BQ1BJKQorCQlpbmZvKCJVc2luZyBBQ1BJIGZvciBzbG90IGRldGVjdGlvbi5cbiIpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvaG90cGx1Zy9wY2llaHBfY29yZS5jIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9wY2llaHBfY29yZS5jCmluZGV4IDM5Y2YyNDguLjU0ODJkNGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvcGNpZWhwX2NvcmUuYworKysgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaWVocF9jb3JlLmMKQEAgLTUyMiw2ICs1MjIsNyBAQAogewogCWludCByZXR2YWwgPSAwOwogCisJcGNpZWhwX2Zpcm13YXJlX2luaXQoKTsKIAlyZXR2YWwgPSBwY2llX3BvcnRfc2VydmljZV9yZWdpc3RlcigmaHBkcml2ZXJfcG9ydGRydik7CiAgCWRiZygicGNpZV9wb3J0X3NlcnZpY2VfcmVnaXN0ZXIgPSAlZFxuIiwgcmV0dmFsKTsKICAgCWluZm8oRFJJVkVSX0RFU0MgIiB2ZXJzaW9uOiAiIERSSVZFUl9WRVJTSU9OICJcbiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvaG90cGx1Zy9wY2llaHBfY3RybC5jIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9wY2llaHBfY3RybC5jCmluZGV4IGZlYWQ2M2MuLmZmNDAzNDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvcGNpZWhwX2N0cmwuYworKysgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaWVocF9jdHJsLmMKQEAgLTE3OCwxNSArMTc4LDE0IEBACiAJCQkJICJJc3N1ZSBvZiBTbG90IFBvd2VyIE9mZiBjb21tYW5kIGZhaWxlZFxuIik7CiAJCQlyZXR1cm47CiAJCX0KKwkJLyoKKwkJICogQWZ0ZXIgdHVybmluZyBwb3dlciBvZmYsIHdlIG11c3Qgd2FpdCBmb3IgYXQgbGVhc3QgMSBzZWNvbmQKKwkJICogYmVmb3JlIHRha2luZyBhbnkgYWN0aW9uIHRoYXQgcmVsaWVzIG9uIHBvd2VyIGhhdmluZyBiZWVuCisJCSAqIHJlbW92ZWQgZnJvbSB0aGUgc2xvdC9hZGFwdGVyLgorCQkgKi8KKwkJbXNsZWVwKDEwMDApOwogCX0KIAotCS8qCi0JICogQWZ0ZXIgdHVybmluZyBwb3dlciBvZmYsIHdlIG11c3Qgd2FpdCBmb3IgYXQgbGVhc3QgMSBzZWNvbmQKLQkgKiBiZWZvcmUgdGFraW5nIGFueSBhY3Rpb24gdGhhdCByZWxpZXMgb24gcG93ZXIgaGF2aW5nIGJlZW4KLQkgKiByZW1vdmVkIGZyb20gdGhlIHNsb3QvYWRhcHRlci4KLQkgKi8KLQltc2xlZXAoMTAwMCk7Ci0KIAlpZiAoUFdSX0xFRChjdHJsKSkKIAkJcHNsb3QtPmhwY19vcHMtPmdyZWVuX2xlZF9vZmYocHNsb3QpOwogCkBAIC0yODYsMTUgKzI4NSwxNCBAQAogCQkJCSAiSXNzdWUgb2YgU2xvdCBEaXNhYmxlIGNvbW1hbmQgZmFpbGVkXG4iKTsKIAkJCXJldHVybiByZXR2YWw7CiAJCX0KKwkJLyoKKwkJICogQWZ0ZXIgdHVybmluZyBwb3dlciBvZmYsIHdlIG11c3Qgd2FpdCBmb3IgYXQgbGVhc3QgMSBzZWNvbmQKKwkJICogYmVmb3JlIHRha2luZyBhbnkgYWN0aW9uIHRoYXQgcmVsaWVzIG9uIHBvd2VyIGhhdmluZyBiZWVuCisJCSAqIHJlbW92ZWQgZnJvbSB0aGUgc2xvdC9hZGFwdGVyLgorCQkgKi8KKwkJbXNsZWVwKDEwMDApOwogCX0KIAotCS8qCi0JICogQWZ0ZXIgdHVybmluZyBwb3dlciBvZmYsIHdlIG11c3Qgd2FpdCBmb3IgYXQgbGVhc3QgMSBzZWNvbmQKLQkgKiBiZWZvcmUgdGFraW5nIGFueSBhY3Rpb24gdGhhdCByZWxpZXMgb24gcG93ZXIgaGF2aW5nIGJlZW4KLQkgKiByZW1vdmVkIGZyb20gdGhlIHNsb3QvYWRhcHRlci4KLQkgKi8KLQltc2xlZXAoMTAwMCk7Ci0KIAlpZiAoUFdSX0xFRChjdHJsKSkKIAkJLyogdHVybiBvZmYgR3JlZW4gTEVEICovCiAJCXBfc2xvdC0+aHBjX29wcy0+Z3JlZW5fbGVkX29mZihwX3Nsb3QpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvaG90cGx1Zy9wY2llaHBfaHBjLmMgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaWVocF9ocGMuYwppbmRleCBiNjQzY2ExLi43MWE4MDEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaWVocF9ocGMuYworKysgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaWVocF9ocGMuYwpAQCAtNDIsNDIgKzQyLDYgQEAKIAogc3RhdGljIGF0b21pY190IHBjaWVocF9udW1fY29udHJvbGxlcnMgPSBBVE9NSUNfSU5JVCgwKTsKIAotc3RydWN0IGN0cmxfcmVnIHsKLQl1OCBjYXBfaWQ7Ci0JdTggbnh0X3B0cjsKLQl1MTYgY2FwX3JlZzsKLQl1MzIgZGV2X2NhcDsKLQl1MTYgZGV2X2N0cmw7Ci0JdTE2IGRldl9zdGF0dXM7Ci0JdTMyIGxua19jYXA7Ci0JdTE2IGxua19jdHJsOwotCXUxNiBsbmtfc3RhdHVzOwotCXUzMiBzbG90X2NhcDsKLQl1MTYgc2xvdF9jdHJsOwotCXUxNiBzbG90X3N0YXR1czsKLQl1MTYgcm9vdF9jdHJsOwotCXUxNiByc3ZwOwotCXUzMiByb290X3N0YXR1czsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwotCi0vKiBvZmZzZXRzIHRvIHRoZSBjb250cm9sbGVyIHJlZ2lzdGVycyBiYXNlZCBvbiB0aGUgYWJvdmUgc3RydWN0dXJlIGxheW91dCAqLwotZW51bSBjdHJsX29mZnNldHMgewotCVBDSUVDQVBJRAk9CW9mZnNldG9mKHN0cnVjdCBjdHJsX3JlZywgY2FwX2lkKSwKLQlOWFRDQVBQVFIJPQlvZmZzZXRvZihzdHJ1Y3QgY3RybF9yZWcsIG54dF9wdHIpLAotCUNBUFJFRwkJPQlvZmZzZXRvZihzdHJ1Y3QgY3RybF9yZWcsIGNhcF9yZWcpLAotCURFVkNBUAkJPQlvZmZzZXRvZihzdHJ1Y3QgY3RybF9yZWcsIGRldl9jYXApLAotCURFVkNUUkwJCT0Jb2Zmc2V0b2Yoc3RydWN0IGN0cmxfcmVnLCBkZXZfY3RybCksCi0JREVWU1RBVFVTCT0Jb2Zmc2V0b2Yoc3RydWN0IGN0cmxfcmVnLCBkZXZfc3RhdHVzKSwKLQlMTktDQVAJCT0Jb2Zmc2V0b2Yoc3RydWN0IGN0cmxfcmVnLCBsbmtfY2FwKSwKLQlMTktDVFJMCQk9CW9mZnNldG9mKHN0cnVjdCBjdHJsX3JlZywgbG5rX2N0cmwpLAotCUxOS1NUQVRVUwk9CW9mZnNldG9mKHN0cnVjdCBjdHJsX3JlZywgbG5rX3N0YXR1cyksCi0JU0xPVENBUAkJPQlvZmZzZXRvZihzdHJ1Y3QgY3RybF9yZWcsIHNsb3RfY2FwKSwKLQlTTE9UQ1RSTAk9CW9mZnNldG9mKHN0cnVjdCBjdHJsX3JlZywgc2xvdF9jdHJsKSwKLQlTTE9UU1RBVFVTCT0Jb2Zmc2V0b2Yoc3RydWN0IGN0cmxfcmVnLCBzbG90X3N0YXR1cyksCi0JUk9PVENUUkwJPQlvZmZzZXRvZihzdHJ1Y3QgY3RybF9yZWcsIHJvb3RfY3RybCksCi0JUk9PVFNUQVRVUwk9CW9mZnNldG9mKHN0cnVjdCBjdHJsX3JlZywgcm9vdF9zdGF0dXMpLAotfTsKLQogc3RhdGljIGlubGluZSBpbnQgcGNpZWhwX3JlYWR3KHN0cnVjdCBjb250cm9sbGVyICpjdHJsLCBpbnQgcmVnLCB1MTYgKnZhbHVlKQogewogCXN0cnVjdCBwY2lfZGV2ICpkZXYgPSBjdHJsLT5wY2lfZGV2OwpAQCAtMTAyLDk1ICs2Niw5IEBACiAJcmV0dXJuIHBjaV93cml0ZV9jb25maWdfZHdvcmQoZGV2LCBjdHJsLT5jYXBfYmFzZSArIHJlZywgdmFsdWUpOwogfQogCi0vKiBGaWVsZCBkZWZpbml0aW9ucyBpbiBQQ0kgRXhwcmVzcyBDYXBhYmlsaXRpZXMgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgQ0FQX1ZFUgkJCTB4MDAwRgotI2RlZmluZSBERVZfUE9SVF9UWVBFCQkweDAwRjAKLSNkZWZpbmUgU0xPVF9JTVBMCQkweDAxMDAKLSNkZWZpbmUgTVNHX05VTQkJCTB4M0UwMAotCi0vKiBEZXZpY2Ugb3IgUG9ydCBUeXBlICovCi0jZGVmaW5lIE5BVF9FTkRQVAkJMHgwMAotI2RlZmluZSBMRUdfRU5EUFQJCTB4MDEKLSNkZWZpbmUgUk9PVF9QT1JUCQkweDA0Ci0jZGVmaW5lIFVQX1NUUkVBTQkJMHgwNQotI2RlZmluZQlETl9TVFJFQU0JCTB4MDYKLSNkZWZpbmUgUENJRV9QQ0lfQlJERwkJMHgwNwotI2RlZmluZSBQQ0lfUENJRV9CUkRHCQkweDEwCi0KLS8qIEZpZWxkIGRlZmluaXRpb25zIGluIERldmljZSBDYXBhYmlsaXRpZXMgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgREFUVE5fQlVUVE5fUFJTTgkweDEwMDAKLSNkZWZpbmUgREFUVE5fTEVEX1BSU04JCTB4MjAwMAotI2RlZmluZSBEUFdSX0xFRF9QUlNOCQkweDQwMDAKLQotLyogRmllbGQgZGVmaW5pdGlvbnMgaW4gTGluayBDYXBhYmlsaXRpZXMgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgTUFYX0xOS19TUEVFRAkJMHgwMDBGCi0jZGVmaW5lIE1BWF9MTktfV0lEVEgJCTB4MDNGMAotI2RlZmluZSBMSU5LX0FDVElWRV9SRVBPUlRJTkcJMHgwMDEwMDAwMAotCi0vKiBMaW5rIFdpZHRoIEVuY29kaW5nICovCi0jZGVmaW5lIExOS19YMQkJMHgwMQotI2RlZmluZSBMTktfWDIJCTB4MDIKLSNkZWZpbmUgTE5LX1g0CQkweDA0Ci0jZGVmaW5lIExOS19YOAkJMHgwOAotI2RlZmluZSBMTktfWDEyCQkweDBDCi0jZGVmaW5lIExOS19YMTYJCTB4MTAKLSNkZWZpbmUgTE5LX1gzMgkJMHgyMAotCi0vKkZpZWxkIGRlZmluaXRpb25zIG9mIExpbmsgU3RhdHVzIFJlZ2lzdGVyICovCi0jZGVmaW5lIExOS19TUEVFRAkweDAwMEYKLSNkZWZpbmUgTkVHX0xJTktfV0QJMHgwM0YwCi0jZGVmaW5lIExOS19UUk5fRVJSCTB4MDQwMAotI2RlZmluZQlMTktfVFJOCQkweDA4MDAKLSNkZWZpbmUgU0xPVF9DTEtfQ09ORgkweDEwMDAKLSNkZWZpbmUgTElOS19BQ1RJVkUJMHgyMDAwCi0KLS8qIEZpZWxkIGRlZmluaXRpb25zIGluIFNsb3QgQ2FwYWJpbGl0aWVzIFJlZ2lzdGVyICovCi0jZGVmaW5lIEFUVE5fQlVUVE5fUFJTTgkweDAwMDAwMDAxCi0jZGVmaW5lCVBXUl9DVFJMX1BSU04JMHgwMDAwMDAwMgotI2RlZmluZSBNUkxfU0VOU19QUlNOCTB4MDAwMDAwMDQKLSNkZWZpbmUgQVRUTl9MRURfUFJTTgkweDAwMDAwMDA4Ci0jZGVmaW5lIFBXUl9MRURfUFJTTgkweDAwMDAwMDEwCi0jZGVmaW5lIEhQX1NVUFJfUk1fU1VQCTB4MDAwMDAwMjAKLSNkZWZpbmUgSFBfQ0FQCQkweDAwMDAwMDQwCi0jZGVmaW5lIFNMT1RfUFdSX1ZBTFVFCTB4MDAwMDAzRjgKLSNkZWZpbmUgU0xPVF9QV1JfTElNSVQJMHgwMDAwMEMwMAotI2RlZmluZSBQU04JCTB4RkZGODAwMDAJLyogUFNOOiBQaHlzaWNhbCBTbG90IE51bWJlciAqLwotCi0vKiBGaWVsZCBkZWZpbml0aW9ucyBpbiBTbG90IENvbnRyb2wgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgQVRUTl9CVVRUTl9FTkFCTEUJCTB4MDAwMQotI2RlZmluZSBQV1JfRkFVTFRfREVURUNUX0VOQUJMRQkJMHgwMDAyCi0jZGVmaW5lIE1STF9ERVRFQ1RfRU5BQkxFCQkweDAwMDQKLSNkZWZpbmUgUFJTTl9ERVRFQ1RfRU5BQkxFCQkweDAwMDgKLSNkZWZpbmUgQ01EX0NNUExfSU5UUl9FTkFCTEUJCTB4MDAxMAotI2RlZmluZSBIUF9JTlRSX0VOQUJMRQkJCTB4MDAyMAotI2RlZmluZSBBVFROX0xFRF9DVFJMCQkJMHgwMEMwCi0jZGVmaW5lIFBXUl9MRURfQ1RSTAkJCTB4MDMwMAotI2RlZmluZSBQV1JfQ1RSTAkJCTB4MDQwMAotI2RlZmluZSBFTUlfQ1RSTAkJCTB4MDgwMAotCi0vKiBBdHRlbnRpb24gaW5kaWNhdG9yIGFuZCBQb3dlciBpbmRpY2F0b3Igc3RhdGVzICovCi0jZGVmaW5lIExFRF9PTgkJMHgwMQotI2RlZmluZSBMRURfQkxJTksJMHgxMAotI2RlZmluZSBMRURfT0ZGCQkweDExCi0KIC8qIFBvd2VyIENvbnRyb2wgQ29tbWFuZCAqLwogI2RlZmluZSBQT1dFUl9PTgkwCi0jZGVmaW5lIFBPV0VSX09GRgkweDA0MDAKLQotLyogRU1JIFN0YXR1cyBkZWZpbmVzICovCi0jZGVmaW5lIEVNSV9ESVNFTkdBR0VECTAKLSNkZWZpbmUgRU1JX0VOR0FHRUQJMQotCi0vKiBGaWVsZCBkZWZpbml0aW9ucyBpbiBTbG90IFN0YXR1cyBSZWdpc3RlciAqLwotI2RlZmluZSBBVFROX0JVVFROX1BSRVNTRUQJMHgwMDAxCi0jZGVmaW5lIFBXUl9GQVVMVF9ERVRFQ1RFRAkweDAwMDIKLSNkZWZpbmUgTVJMX1NFTlNfQ0hBTkdFRAkweDAwMDQKLSNkZWZpbmUgUFJTTl9ERVRFQ1RfQ0hBTkdFRAkweDAwMDgKLSNkZWZpbmUgQ01EX0NPTVBMRVRFRAkJMHgwMDEwCi0jZGVmaW5lIE1STF9TVEFURQkJMHgwMDIwCi0jZGVmaW5lIFBSU05fU1RBVEUJCTB4MDA0MAotI2RlZmluZSBFTUlfU1RBVEUJCTB4MDA4MAotI2RlZmluZSBFTUlfU1RBVFVTX0JJVAkJNworI2RlZmluZSBQT1dFUl9PRkYJUENJX0VYUF9TTFRDVExfUENDCiAKIHN0YXRpYyBpcnFyZXR1cm5fdCBwY2llX2lzcihpbnQgaXJxLCB2b2lkICpkZXZfaWQpOwogc3RhdGljIHZvaWQgc3RhcnRfaW50X3BvbGxfdGltZXIoc3RydWN0IGNvbnRyb2xsZXIgKmN0cmwsIGludCBzZWMpOwpAQCAtMjUzLDIyICsxMzEsMjAgQEAKIHN0YXRpYyBpbnQgcGNpZV9wb2xsX2NtZChzdHJ1Y3QgY29udHJvbGxlciAqY3RybCkKIHsKIAl1MTYgc2xvdF9zdGF0dXM7Ci0JaW50IHRpbWVvdXQgPSAxMDAwOworCWludCBlcnIsIHRpbWVvdXQgPSAxMDAwOwogCi0JaWYgKCFwY2llaHBfcmVhZHcoY3RybCwgU0xPVFNUQVRVUywgJnNsb3Rfc3RhdHVzKSkgewotCQlpZiAoc2xvdF9zdGF0dXMgJiBDTURfQ09NUExFVEVEKSB7Ci0JCQlwY2llaHBfd3JpdGV3KGN0cmwsIFNMT1RTVEFUVVMsIENNRF9DT01QTEVURUQpOwotCQkJcmV0dXJuIDE7Ci0JCX0KKwllcnIgPSBwY2llaHBfcmVhZHcoY3RybCwgUENJX0VYUF9TTFRTVEEsICZzbG90X3N0YXR1cyk7CisJaWYgKCFlcnIgJiYgKHNsb3Rfc3RhdHVzICYgUENJX0VYUF9TTFRTVEFfQ0MpKSB7CisJCXBjaWVocF93cml0ZXcoY3RybCwgUENJX0VYUF9TTFRTVEEsIFBDSV9FWFBfU0xUU1RBX0NDKTsKKwkJcmV0dXJuIDE7CiAJfQogCXdoaWxlICh0aW1lb3V0ID4gMCkgewogCQltc2xlZXAoMTApOwogCQl0aW1lb3V0IC09IDEwOwotCQlpZiAoIXBjaWVocF9yZWFkdyhjdHJsLCBTTE9UU1RBVFVTLCAmc2xvdF9zdGF0dXMpKSB7Ci0JCQlpZiAoc2xvdF9zdGF0dXMgJiBDTURfQ09NUExFVEVEKSB7Ci0JCQkJcGNpZWhwX3dyaXRldyhjdHJsLCBTTE9UU1RBVFVTLCBDTURfQ09NUExFVEVEKTsKLQkJCQlyZXR1cm4gMTsKLQkJCX0KKwkJZXJyID0gcGNpZWhwX3JlYWR3KGN0cmwsIFBDSV9FWFBfU0xUU1RBLCAmc2xvdF9zdGF0dXMpOworCQlpZiAoIWVyciAmJiAoc2xvdF9zdGF0dXMgJiBQQ0lfRVhQX1NMVFNUQV9DQykpIHsKKwkJCXBjaWVocF93cml0ZXcoY3RybCwgUENJX0VYUF9TTFRTVEEsIFBDSV9FWFBfU0xUU1RBX0NDKTsKKwkJCXJldHVybiAxOwogCQl9CiAJfQogCXJldHVybiAwOwkvKiB0aW1lb3V0ICovCkBAIC0zMDIsMTQgKzE3OCwxNCBAQAogCiAJbXV0ZXhfbG9jaygmY3RybC0+Y3RybF9sb2NrKTsKIAotCXJldHZhbCA9IHBjaWVocF9yZWFkdyhjdHJsLCBTTE9UU1RBVFVTLCAmc2xvdF9zdGF0dXMpOworCXJldHZhbCA9IHBjaWVocF9yZWFkdyhjdHJsLCBQQ0lfRVhQX1NMVFNUQSwgJnNsb3Rfc3RhdHVzKTsKIAlpZiAocmV0dmFsKSB7CiAJCWN0cmxfZXJyKGN0cmwsICIlczogQ2Fubm90IHJlYWQgU0xPVFNUQVRVUyByZWdpc3RlclxuIiwKIAkJCSBfX2Z1bmNfXyk7CiAJCWdvdG8gb3V0OwogCX0KIAotCWlmIChzbG90X3N0YXR1cyAmIENNRF9DT01QTEVURUQpIHsKKwlpZiAoc2xvdF9zdGF0dXMgJiBQQ0lfRVhQX1NMVFNUQV9DQykgewogCQlpZiAoIWN0cmwtPm5vX2NtZF9jb21wbGV0ZSkgewogCQkJLyoKIAkJCSAqIEFmdGVyIDEgc2VjIGFuZCBDTURfQ09NUExFVEVEIHN0aWxsIG5vdCBzZXQsIGp1c3QKQEAgLTMzMiw3ICsyMDgsNyBAQAogCQl9CiAJfQogCi0JcmV0dmFsID0gcGNpZWhwX3JlYWR3KGN0cmwsIFNMT1RDVFJMLCAmc2xvdF9jdHJsKTsKKwlyZXR2YWwgPSBwY2llaHBfcmVhZHcoY3RybCwgUENJX0VYUF9TTFRDVEwsICZzbG90X2N0cmwpOwogCWlmIChyZXR2YWwpIHsKIAkJY3RybF9lcnIoY3RybCwgIiVzOiBDYW5ub3QgcmVhZCBTTE9UQ1RSTCByZWdpc3RlclxuIiwgX19mdW5jX18pOwogCQlnb3RvIG91dDsKQEAgLTM0Miw3ICsyMTgsNyBAQAogCXNsb3RfY3RybCB8PSAoY21kICYgbWFzayk7CiAJY3RybC0+Y21kX2J1c3kgPSAxOwogCXNtcF9tYigpOwotCXJldHZhbCA9IHBjaWVocF93cml0ZXcoY3RybCwgU0xPVENUUkwsIHNsb3RfY3RybCk7CisJcmV0dmFsID0gcGNpZWhwX3dyaXRldyhjdHJsLCBQQ0lfRVhQX1NMVENUTCwgc2xvdF9jdHJsKTsKIAlpZiAocmV0dmFsKQogCQljdHJsX2VycihjdHJsLCAiQ2Fubm90IHdyaXRlIHRvIFNMT1RDVFJMIHJlZ2lzdGVyXG4iKTsKIApAQCAtMzU2LDggKzIzMiw4IEBACiAJCSAqIGNvbXBsZXRlZCBpbnRlcnJ1cHQgaXMgbm90IGVuYWJsZWQsIHdlIG5lZWQgdG8gcG9sbAogCQkgKiBjb21tYW5kIGNvbXBsZXRlZCBldmVudC4KIAkJICovCi0JCWlmICghKHNsb3RfY3RybCAmIEhQX0lOVFJfRU5BQkxFKSB8fAotCQkgICAgIShzbG90X2N0cmwgJiBDTURfQ01QTF9JTlRSX0VOQUJMRSkpCisJCWlmICghKHNsb3RfY3RybCAmIFBDSV9FWFBfU0xUQ1RMX0hQSUUpIHx8CisJCSAgICAhKHNsb3RfY3RybCAmIFBDSV9FWFBfU0xUQ1RMX0NDSUUpKQogCQkJcG9sbCA9IDE7CiAgICAgICAgICAgICAgICAgcGNpZV93YWl0X2NtZChjdHJsLCBwb2xsKTsKIAl9CkBAIC0zNzAsOSArMjQ2LDkgQEAKIHsKIAl1MTYgbGlua19zdGF0dXM7CiAKLQlpZiAocGNpZWhwX3JlYWR3KGN0cmwsIExOS1NUQVRVUywgJmxpbmtfc3RhdHVzKSkKKwlpZiAocGNpZWhwX3JlYWR3KGN0cmwsIFBDSV9FWFBfTE5LU1RBLCAmbGlua19zdGF0dXMpKQogCQlyZXR1cm4gMDsKLQlyZXR1cm4gISEobGlua19zdGF0dXMgJiBMSU5LX0FDVElWRSk7CisJcmV0dXJuICEhKGxpbmtfc3RhdHVzICYgUENJX0VYUF9MTktTVEFfRExMTEEpOwogfQogCiBzdGF0aWMgdm9pZCBwY2llX3dhaXRfbGlua19hY3RpdmUoc3RydWN0IGNvbnRyb2xsZXIgKmN0cmwpCkBAIC00MTIsMTUgKzI4OCwxNSBAQAogICAgICAgICB9IGVsc2UKICAgICAgICAgICAgICAgICBtc2xlZXAoMTAwMCk7CiAKLQlyZXR2YWwgPSBwY2llaHBfcmVhZHcoY3RybCwgTE5LU1RBVFVTLCAmbG5rX3N0YXR1cyk7CisJcmV0dmFsID0gcGNpZWhwX3JlYWR3KGN0cmwsIFBDSV9FWFBfTE5LU1RBLCAmbG5rX3N0YXR1cyk7CiAJaWYgKHJldHZhbCkgewogCQljdHJsX2VycihjdHJsLCAiQ2Fubm90IHJlYWQgTE5LU1RBVFVTIHJlZ2lzdGVyXG4iKTsKIAkJcmV0dXJuIHJldHZhbDsKIAl9CiAKIAljdHJsX2RiZyhjdHJsLCAiJXM6IGxua19zdGF0dXMgPSAleFxuIiwgX19mdW5jX18sIGxua19zdGF0dXMpOwotCWlmICggKGxua19zdGF0dXMgJiBMTktfVFJOKSB8fCAobG5rX3N0YXR1cyAmIExOS19UUk5fRVJSKSB8fAotCQkhKGxua19zdGF0dXMgJiBORUdfTElOS19XRCkpIHsKKwlpZiAoKGxua19zdGF0dXMgJiBQQ0lfRVhQX0xOS1NUQV9MVCkgfHwKKwkgICAgIShsbmtfc3RhdHVzICYgUENJX0VYUF9MTktTVEFfTkxXKSkgewogCQljdHJsX2VycihjdHJsLCAiTGluayBUcmFpbmluZyBFcnJvciBvY2N1cnMgXG4iKTsKIAkJcmV0dmFsID0gLTE7CiAJCXJldHVybiByZXR2YWw7CkBAIC00MzYsMTYgKzMxMiwxNiBAQAogCXU4IGF0dGVuX2xlZF9zdGF0ZTsKIAlpbnQgcmV0dmFsID0gMDsKIAotCXJldHZhbCA9IHBjaWVocF9yZWFkdyhjdHJsLCBTTE9UQ1RSTCwgJnNsb3RfY3RybCk7CisJcmV0dmFsID0gcGNpZWhwX3JlYWR3KGN0cmwsIFBDSV9FWFBfU0xUQ1RMLCAmc2xvdF9jdHJsKTsKIAlpZiAocmV0dmFsKSB7CiAJCWN0cmxfZXJyKGN0cmwsICIlczogQ2Fubm90IHJlYWQgU0xPVENUUkwgcmVnaXN0ZXJcbiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuIHJldHZhbDsKIAl9CiAKIAljdHJsX2RiZyhjdHJsLCAiJXM6IFNMT1RDVFJMICV4LCB2YWx1ZSByZWFkICV4XG4iLAotCQkgX19mdW5jX18sIGN0cmwtPmNhcF9iYXNlICsgU0xPVENUUkwsIHNsb3RfY3RybCk7CisJCSBfX2Z1bmNfXywgY3RybC0+Y2FwX2Jhc2UgKyBQQ0lfRVhQX1NMVENUTCwgc2xvdF9jdHJsKTsKIAotCWF0dGVuX2xlZF9zdGF0ZSA9IChzbG90X2N0cmwgJiBBVFROX0xFRF9DVFJMKSA+PiA2OworCWF0dGVuX2xlZF9zdGF0ZSA9IChzbG90X2N0cmwgJiBQQ0lfRVhQX1NMVENUTF9BSUMpID4+IDY7CiAKIAlzd2l0Y2ggKGF0dGVuX2xlZF9zdGF0ZSkgewogCWNhc2UgMDoKQEAgLTQ3NSwxNSArMzUxLDE1IEBACiAJdTggcHdyX3N0YXRlOwogCWludAlyZXR2YWwgPSAwOwogCi0JcmV0dmFsID0gcGNpZWhwX3JlYWR3KGN0cmwsIFNMT1RDVFJMLCAmc2xvdF9jdHJsKTsKKwlyZXR2YWwgPSBwY2llaHBfcmVhZHcoY3RybCwgUENJX0VYUF9TTFRDVEwsICZzbG90X2N0cmwpOwogCWlmIChyZXR2YWwpIHsKIAkJY3RybF9lcnIoY3RybCwgIiVzOiBDYW5ub3QgcmVhZCBTTE9UQ1RSTCByZWdpc3RlclxuIiwgX19mdW5jX18pOwogCQlyZXR1cm4gcmV0dmFsOwogCX0KIAljdHJsX2RiZyhjdHJsLCAiJXM6IFNMT1RDVFJMICV4IHZhbHVlIHJlYWQgJXhcbiIsCi0JCSBfX2Z1bmNfXywgY3RybC0+Y2FwX2Jhc2UgKyBTTE9UQ1RSTCwgc2xvdF9jdHJsKTsKKwkJIF9fZnVuY19fLCBjdHJsLT5jYXBfYmFzZSArIFBDSV9FWFBfU0xUQ1RMLCBzbG90X2N0cmwpOwogCi0JcHdyX3N0YXRlID0gKHNsb3RfY3RybCAmIFBXUl9DVFJMKSA+PiAxMDsKKwlwd3Jfc3RhdGUgPSAoc2xvdF9jdHJsICYgUENJX0VYUF9TTFRDVExfUENDKSA+PiAxMDsKIAogCXN3aXRjaCAocHdyX3N0YXRlKSB7CiAJY2FzZSAwOgpAQCAtNTA0LDE3ICszODAsMTUgQEAKIHsKIAlzdHJ1Y3QgY29udHJvbGxlciAqY3RybCA9IHNsb3QtPmN0cmw7CiAJdTE2IHNsb3Rfc3RhdHVzOwotCWludCByZXR2YWwgPSAwOworCWludCByZXR2YWw7CiAKLQlyZXR2YWwgPSBwY2llaHBfcmVhZHcoY3RybCwgU0xPVFNUQVRVUywgJnNsb3Rfc3RhdHVzKTsKKwlyZXR2YWwgPSBwY2llaHBfcmVhZHcoY3RybCwgUENJX0VYUF9TTFRTVEEsICZzbG90X3N0YXR1cyk7CiAJaWYgKHJldHZhbCkgewogCQljdHJsX2VycihjdHJsLCAiJXM6IENhbm5vdCByZWFkIFNMT1RTVEFUVVMgcmVnaXN0ZXJcbiIsCiAJCQkgX19mdW5jX18pOwogCQlyZXR1cm4gcmV0dmFsOwogCX0KLQotCSpzdGF0dXMgPSAoKChzbG90X3N0YXR1cyAmIE1STF9TVEFURSkgPj4gNSkgPT0gMCkgPyAwIDogMTsKLQorCSpzdGF0dXMgPSAhIShzbG90X3N0YXR1cyAmIFBDSV9FWFBfU0xUU1RBX01STFNTKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNTIyLDE4ICszOTYsMTUgQEAKIHsKIAlzdHJ1Y3QgY29udHJvbGxlciAqY3RybCA9IHNsb3QtPmN0cmw7CiAJdTE2IHNsb3Rfc3RhdHVzOwotCXU4IGNhcmRfc3RhdGU7Ci0JaW50IHJldHZhbCA9IDA7CisJaW50IHJldHZhbDsKIAotCXJldHZhbCA9IHBjaWVocF9yZWFkdyhjdHJsLCBTTE9UU1RBVFVTLCAmc2xvdF9zdGF0dXMpOworCXJldHZhbCA9IHBjaWVocF9yZWFkdyhjdHJsLCBQQ0lfRVhQX1NMVFNUQSwgJnNsb3Rfc3RhdHVzKTsKIAlpZiAocmV0dmFsKSB7CiAJCWN0cmxfZXJyKGN0cmwsICIlczogQ2Fubm90IHJlYWQgU0xPVFNUQVRVUyByZWdpc3RlclxuIiwKIAkJCSBfX2Z1bmNfXyk7CiAJCXJldHVybiByZXR2YWw7CiAJfQotCWNhcmRfc3RhdGUgPSAodTgpKChzbG90X3N0YXR1cyAmIFBSU05fU1RBVEUpID4+IDYpOwotCSpzdGF0dXMgPSAoY2FyZF9zdGF0ZSA9PSAxKSA/IDEgOiAwOwotCisJKnN0YXR1cyA9ICEhKHNsb3Rfc3RhdHVzICYgUENJX0VYUF9TTFRTVEFfUERTKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNTQxLDMyICs0MTIsMjggQEAKIHsKIAlzdHJ1Y3QgY29udHJvbGxlciAqY3RybCA9IHNsb3QtPmN0cmw7CiAJdTE2IHNsb3Rfc3RhdHVzOwotCXU4IHB3cl9mYXVsdDsKLQlpbnQgcmV0dmFsID0gMDsKKwlpbnQgcmV0dmFsOwogCi0JcmV0dmFsID0gcGNpZWhwX3JlYWR3KGN0cmwsIFNMT1RTVEFUVVMsICZzbG90X3N0YXR1cyk7CisJcmV0dmFsID0gcGNpZWhwX3JlYWR3KGN0cmwsIFBDSV9FWFBfU0xUU1RBLCAmc2xvdF9zdGF0dXMpOwogCWlmIChyZXR2YWwpIHsKIAkJY3RybF9lcnIoY3RybCwgIkNhbm5vdCBjaGVjayBmb3IgcG93ZXIgZmF1bHRcbiIpOwogCQlyZXR1cm4gcmV0dmFsOwogCX0KLQlwd3JfZmF1bHQgPSAodTgpKChzbG90X3N0YXR1cyAmIFBXUl9GQVVMVF9ERVRFQ1RFRCkgPj4gMSk7Ci0KLQlyZXR1cm4gcHdyX2ZhdWx0OworCXJldHVybiAhIShzbG90X3N0YXR1cyAmIFBDSV9FWFBfU0xUU1RBX1BGRCk7CiB9CiAKIHN0YXRpYyBpbnQgaHBjX2dldF9lbWlfc3RhdHVzKHN0cnVjdCBzbG90ICpzbG90LCB1OCAqc3RhdHVzKQogewogCXN0cnVjdCBjb250cm9sbGVyICpjdHJsID0gc2xvdC0+Y3RybDsKIAl1MTYgc2xvdF9zdGF0dXM7Ci0JaW50IHJldHZhbCA9IDA7CisJaW50IHJldHZhbDsKIAotCXJldHZhbCA9IHBjaWVocF9yZWFkdyhjdHJsLCBTTE9UU1RBVFVTLCAmc2xvdF9zdGF0dXMpOworCXJldHZhbCA9IHBjaWVocF9yZWFkdyhjdHJsLCBQQ0lfRVhQX1NMVFNUQSwgJnNsb3Rfc3RhdHVzKTsKIAlpZiAocmV0dmFsKSB7CiAJCWN0cmxfZXJyKGN0cmwsICJDYW5ub3QgY2hlY2sgRU1JIHN0YXR1c1xuIik7CiAJCXJldHVybiByZXR2YWw7CiAJfQotCSpzdGF0dXMgPSAoc2xvdF9zdGF0dXMgJiBFTUlfU1RBVEUpID4+IEVNSV9TVEFUVVNfQklUOwotCisJKnN0YXR1cyA9ICEhKHNsb3Rfc3RhdHVzICYgUENJX0VYUF9TTFRTVEFfRUlTKTsKIAlyZXR1cm4gcmV0dmFsOwogfQogCkBAIC01NzYsOCArNDQzLDggQEAKIAl1MTYgY21kX21hc2s7CiAJaW50IHJjOwogCi0Jc2xvdF9jbWQgPSBFTUlfQ1RSTDsKLQljbWRfbWFzayA9IEVNSV9DVFJMOworCXNsb3RfY21kID0gUENJX0VYUF9TTFRDVExfRUlDOworCWNtZF9tYXNrID0gUENJX0VYUF9TTFRDVExfRUlDOwogCXJjID0gcGNpZV93cml0ZV9jbWQoc2xvdC0+Y3RybCwgc2xvdF9jbWQsIGNtZF9tYXNrKTsKIAlzbG90LT5sYXN0X2VtaV90b2dnbGUgPSBnZXRfc2Vjb25kcygpOwogCkBAIC01OTEsNyArNDU4LDcgQEAKIAl1MTYgY21kX21hc2s7CiAJaW50IHJjOwogCi0JY21kX21hc2sgPSBBVFROX0xFRF9DVFJMOworCWNtZF9tYXNrID0gUENJX0VYUF9TTFRDVExfQUlDOwogCXN3aXRjaCAodmFsdWUpIHsKIAkJY2FzZSAwIDoJLyogdHVybiBvZmYgKi8KIAkJCXNsb3RfY21kID0gMHgwMEMwOwpAQCAtNjA3LDcgKzQ3NCw3IEBACiAJfQogCXJjID0gcGNpZV93cml0ZV9jbWQoY3RybCwgc2xvdF9jbWQsIGNtZF9tYXNrKTsKIAljdHJsX2RiZyhjdHJsLCAiJXM6IFNMT1RDVFJMICV4IHdyaXRlIGNtZCAleFxuIiwKLQkJIF9fZnVuY19fLCBjdHJsLT5jYXBfYmFzZSArIFNMT1RDVFJMLCBzbG90X2NtZCk7CisJCSBfX2Z1bmNfXywgY3RybC0+Y2FwX2Jhc2UgKyBQQ0lfRVhQX1NMVENUTCwgc2xvdF9jbWQpOwogCiAJcmV0dXJuIHJjOwogfQpAQCAtNjE5LDEwICs0ODYsMTAgQEAKIAl1MTYgY21kX21hc2s7CiAKIAlzbG90X2NtZCA9IDB4MDEwMDsKLQljbWRfbWFzayA9IFBXUl9MRURfQ1RSTDsKKwljbWRfbWFzayA9IFBDSV9FWFBfU0xUQ1RMX1BJQzsKIAlwY2llX3dyaXRlX2NtZChjdHJsLCBzbG90X2NtZCwgY21kX21hc2spOwogCWN0cmxfZGJnKGN0cmwsICIlczogU0xPVENUUkwgJXggd3JpdGUgY21kICV4XG4iLAotCQkgX19mdW5jX18sIGN0cmwtPmNhcF9iYXNlICsgU0xPVENUUkwsIHNsb3RfY21kKTsKKwkJIF9fZnVuY19fLCBjdHJsLT5jYXBfYmFzZSArIFBDSV9FWFBfU0xUQ1RMLCBzbG90X2NtZCk7CiB9CiAKIHN0YXRpYyB2b2lkIGhwY19zZXRfZ3JlZW5fbGVkX29mZihzdHJ1Y3Qgc2xvdCAqc2xvdCkKQEAgLTYzMiwxMCArNDk5LDEwIEBACiAJdTE2IGNtZF9tYXNrOwogCiAJc2xvdF9jbWQgPSAweDAzMDA7Ci0JY21kX21hc2sgPSBQV1JfTEVEX0NUUkw7CisJY21kX21hc2sgPSBQQ0lfRVhQX1NMVENUTF9QSUM7CiAJcGNpZV93cml0ZV9jbWQoY3RybCwgc2xvdF9jbWQsIGNtZF9tYXNrKTsKIAljdHJsX2RiZyhjdHJsLCAiJXM6IFNMT1RDVFJMICV4IHdyaXRlIGNtZCAleFxuIiwKLQkJIF9fZnVuY19fLCBjdHJsLT5jYXBfYmFzZSArIFNMT1RDVFJMLCBzbG90X2NtZCk7CisJCSBfX2Z1bmNfXywgY3RybC0+Y2FwX2Jhc2UgKyBQQ0lfRVhQX1NMVENUTCwgc2xvdF9jbWQpOwogfQogCiBzdGF0aWMgdm9pZCBocGNfc2V0X2dyZWVuX2xlZF9ibGluayhzdHJ1Y3Qgc2xvdCAqc2xvdCkKQEAgLTY0NSwxMCArNTEyLDEwIEBACiAJdTE2IGNtZF9tYXNrOwogCiAJc2xvdF9jbWQgPSAweDAyMDA7Ci0JY21kX21hc2sgPSBQV1JfTEVEX0NUUkw7CisJY21kX21hc2sgPSBQQ0lfRVhQX1NMVENUTF9QSUM7CiAJcGNpZV93cml0ZV9jbWQoY3RybCwgc2xvdF9jbWQsIGNtZF9tYXNrKTsKIAljdHJsX2RiZyhjdHJsLCAiJXM6IFNMT1RDVFJMICV4IHdyaXRlIGNtZCAleFxuIiwKLQkJIF9fZnVuY19fLCBjdHJsLT5jYXBfYmFzZSArIFNMT1RDVFJMLCBzbG90X2NtZCk7CisJCSBfX2Z1bmNfXywgY3RybC0+Y2FwX2Jhc2UgKyBQQ0lfRVhQX1NMVENUTCwgc2xvdF9jbWQpOwogfQogCiBzdGF0aWMgaW50IGhwY19wb3dlcl9vbl9zbG90KHN0cnVjdCBzbG90ICogc2xvdCkKQEAgLTY2MiwxNSArNTI5LDE1IEBACiAJY3RybF9kYmcoY3RybCwgIiVzOiBzbG90LT5ocF9zbG90ICV4XG4iLCBfX2Z1bmNfXywgc2xvdC0+aHBfc2xvdCk7CiAKIAkvKiBDbGVhciBzdGlja3kgcG93ZXItZmF1bHQgYml0IGZyb20gcHJldmlvdXMgcG93ZXIgZmFpbHVyZXMgKi8KLQlyZXR2YWwgPSBwY2llaHBfcmVhZHcoY3RybCwgU0xPVFNUQVRVUywgJnNsb3Rfc3RhdHVzKTsKKwlyZXR2YWwgPSBwY2llaHBfcmVhZHcoY3RybCwgUENJX0VYUF9TTFRTVEEsICZzbG90X3N0YXR1cyk7CiAJaWYgKHJldHZhbCkgewogCQljdHJsX2VycihjdHJsLCAiJXM6IENhbm5vdCByZWFkIFNMT1RTVEFUVVMgcmVnaXN0ZXJcbiIsCiAJCQkgX19mdW5jX18pOwogCQlyZXR1cm4gcmV0dmFsOwogCX0KLQlzbG90X3N0YXR1cyAmPSBQV1JfRkFVTFRfREVURUNURUQ7CisJc2xvdF9zdGF0dXMgJj0gUENJX0VYUF9TTFRTVEFfUEZEOwogCWlmIChzbG90X3N0YXR1cykgewotCQlyZXR2YWwgPSBwY2llaHBfd3JpdGV3KGN0cmwsIFNMT1RTVEFUVVMsIHNsb3Rfc3RhdHVzKTsKKwkJcmV0dmFsID0gcGNpZWhwX3dyaXRldyhjdHJsLCBQQ0lfRVhQX1NMVFNUQSwgc2xvdF9zdGF0dXMpOwogCQlpZiAocmV0dmFsKSB7CiAJCQljdHJsX2VycihjdHJsLAogCQkJCSAiJXM6IENhbm5vdCB3cml0ZSB0byBTTE9UU1RBVFVTIHJlZ2lzdGVyXG4iLApAQCAtNjgwLDEzICs1NDcsMTMgQEAKIAl9CiAKIAlzbG90X2NtZCA9IFBPV0VSX09OOwotCWNtZF9tYXNrID0gUFdSX0NUUkw7CisJY21kX21hc2sgPSBQQ0lfRVhQX1NMVENUTF9QQ0M7CiAJLyogRW5hYmxlIGRldGVjdGlvbiB0aGF0IHdlIHR1cm5lZCBvZmYgYXQgc2xvdCBwb3dlci1vZmYgdGltZSAqLwogCWlmICghcGNpZWhwX3BvbGxfbW9kZSkgewotCQlzbG90X2NtZCB8PSAoUFdSX0ZBVUxUX0RFVEVDVF9FTkFCTEUgfCBNUkxfREVURUNUX0VOQUJMRSB8Ci0JCQkgICAgIFBSU05fREVURUNUX0VOQUJMRSk7Ci0JCWNtZF9tYXNrIHw9IChQV1JfRkFVTFRfREVURUNUX0VOQUJMRSB8IE1STF9ERVRFQ1RfRU5BQkxFIHwKLQkJCSAgICAgUFJTTl9ERVRFQ1RfRU5BQkxFKTsKKwkJc2xvdF9jbWQgfD0gKFBDSV9FWFBfU0xUQ1RMX1BGREUgfCBQQ0lfRVhQX1NMVENUTF9NUkxTQ0UgfAorCQkJICAgICBQQ0lfRVhQX1NMVENUTF9QRENFKTsKKwkJY21kX21hc2sgfD0gKFBDSV9FWFBfU0xUQ1RMX1BGREUgfCBQQ0lfRVhQX1NMVENUTF9NUkxTQ0UgfAorCQkJICAgICBQQ0lfRVhQX1NMVENUTF9QRENFKTsKIAl9CiAKIAlyZXR2YWwgPSBwY2llX3dyaXRlX2NtZChjdHJsLCBzbG90X2NtZCwgY21kX21hc2spOwpAQCAtNjk2LDcgKzU2Myw3IEBACiAJCXJldHVybiAtMTsKIAl9CiAJY3RybF9kYmcoY3RybCwgIiVzOiBTTE9UQ1RSTCAleCB3cml0ZSBjbWQgJXhcbiIsCi0JCSBfX2Z1bmNfXywgY3RybC0+Y2FwX2Jhc2UgKyBTTE9UQ1RSTCwgc2xvdF9jbWQpOworCQkgX19mdW5jX18sIGN0cmwtPmNhcF9iYXNlICsgUENJX0VYUF9TTFRDVEwsIHNsb3RfY21kKTsKIAogCXJldHVybiByZXR2YWw7CiB9CkBAIC03NTMsNyArNjIwLDcgQEAKIAljaGFuZ2VkID0gcGNpZV9tYXNrX2JhZF9kbGxwKGN0cmwpOwogCiAJc2xvdF9jbWQgPSBQT1dFUl9PRkY7Ci0JY21kX21hc2sgPSBQV1JfQ1RSTDsKKwljbWRfbWFzayA9IFBDSV9FWFBfU0xUQ1RMX1BDQzsKIAkvKgogCSAqIElmIHdlIGdldCBNUkwgb3IgcHJlc2VuY2UgZGV0ZWN0IGludGVycnVwdHMgbm93LCB0aGUgaXNyCiAJICogd2lsbCBub3RpY2UgdGhlIHN0aWNreSBwb3dlci1mYXVsdCBiaXQgdG9vIGFuZCBpc3N1ZSBwb3dlcgpAQCAtNzYyLDEwICs2MjksMTAgQEAKIAkgKiB0aWxsIHRoZSBzbG90IGlzIHBvd2VyZWQgb24gYWdhaW4uCiAJICovCiAJaWYgKCFwY2llaHBfcG9sbF9tb2RlKSB7Ci0JCXNsb3RfY21kICY9IH4oUFdSX0ZBVUxUX0RFVEVDVF9FTkFCTEUgfCBNUkxfREVURUNUX0VOQUJMRSB8Ci0JCQkgICAgICBQUlNOX0RFVEVDVF9FTkFCTEUpOwotCQljbWRfbWFzayB8PSAoUFdSX0ZBVUxUX0RFVEVDVF9FTkFCTEUgfCBNUkxfREVURUNUX0VOQUJMRSB8Ci0JCQkgICAgIFBSU05fREVURUNUX0VOQUJMRSk7CisJCXNsb3RfY21kICY9IH4oUENJX0VYUF9TTFRDVExfUEZERSB8IFBDSV9FWFBfU0xUQ1RMX01STFNDRSB8CisJCQkgICAgICBQQ0lfRVhQX1NMVENUTF9QRENFKTsKKwkJY21kX21hc2sgfD0gKFBDSV9FWFBfU0xUQ1RMX1BGREUgfCBQQ0lfRVhQX1NMVENUTF9NUkxTQ0UgfAorCQkJICAgICBQQ0lfRVhQX1NMVENUTF9QRENFKTsKIAl9CiAKIAlyZXR2YWwgPSBwY2llX3dyaXRlX2NtZChjdHJsLCBzbG90X2NtZCwgY21kX21hc2spOwpAQCAtNzc1LDcgKzY0Miw3IEBACiAJCWdvdG8gb3V0OwogCX0KIAljdHJsX2RiZyhjdHJsLCAiJXM6IFNMT1RDVFJMICV4IHdyaXRlIGNtZCAleFxuIiwKLQkJIF9fZnVuY19fLCBjdHJsLT5jYXBfYmFzZSArIFNMT1RDVFJMLCBzbG90X2NtZCk7CisJCSBfX2Z1bmNfXywgY3RybC0+Y2FwX2Jhc2UgKyBQQ0lfRVhQX1NMVENUTCwgc2xvdF9jbWQpOwogIG91dDoKIAlpZiAoY2hhbmdlZCkKIAkJcGNpZV91bm1hc2tfYmFkX2RsbHAoY3RybCk7CkBAIC03OTYsMTkgKzY2MywxOSBAQAogCSAqLwogCWludHJfbG9jID0gMDsKIAlkbyB7Ci0JCWlmIChwY2llaHBfcmVhZHcoY3RybCwgU0xPVFNUQVRVUywgJmRldGVjdGVkKSkgeworCQlpZiAocGNpZWhwX3JlYWR3KGN0cmwsIFBDSV9FWFBfU0xUU1RBLCAmZGV0ZWN0ZWQpKSB7CiAJCQljdHJsX2VycihjdHJsLCAiJXM6IENhbm5vdCByZWFkIFNMT1RTVEFUVVNcbiIsCiAJCQkJIF9fZnVuY19fKTsKIAkJCXJldHVybiBJUlFfTk9ORTsKIAkJfQogCi0JCWRldGVjdGVkICY9IChBVFROX0JVVFROX1BSRVNTRUQgfCBQV1JfRkFVTFRfREVURUNURUQgfAotCQkJICAgICBNUkxfU0VOU19DSEFOR0VEIHwgUFJTTl9ERVRFQ1RfQ0hBTkdFRCB8Ci0JCQkgICAgIENNRF9DT01QTEVURUQpOworCQlkZXRlY3RlZCAmPSAoUENJX0VYUF9TTFRTVEFfQUJQIHwgUENJX0VYUF9TTFRTVEFfUEZEIHwKKwkJCSAgICAgUENJX0VYUF9TTFRTVEFfTVJMU0MgfCBQQ0lfRVhQX1NMVFNUQV9QREMgfAorCQkJICAgICBQQ0lfRVhQX1NMVFNUQV9DQyk7CiAJCWludHJfbG9jIHw9IGRldGVjdGVkOwogCQlpZiAoIWludHJfbG9jKQogCQkJcmV0dXJuIElSUV9OT05FOwotCQlpZiAoZGV0ZWN0ZWQgJiYgcGNpZWhwX3dyaXRldyhjdHJsLCBTTE9UU1RBVFVTLCBkZXRlY3RlZCkpIHsKKwkJaWYgKGRldGVjdGVkICYmIHBjaWVocF93cml0ZXcoY3RybCwgUENJX0VYUF9TTFRTVEEsIGRldGVjdGVkKSkgewogCQkJY3RybF9lcnIoY3RybCwgIiVzOiBDYW5ub3Qgd3JpdGUgdG8gU0xPVFNUQVRVU1xuIiwKIAkJCQkgX19mdW5jX18pOwogCQkJcmV0dXJuIElSUV9OT05FOwpAQCAtODE4LDMxICs2ODUsMzEgQEAKIAljdHJsX2RiZyhjdHJsLCAiJXM6IGludHJfbG9jICV4XG4iLCBfX2Z1bmNfXywgaW50cl9sb2MpOwogCiAJLyogQ2hlY2sgQ29tbWFuZCBDb21wbGV0ZSBJbnRlcnJ1cHQgUGVuZGluZyAqLwotCWlmIChpbnRyX2xvYyAmIENNRF9DT01QTEVURUQpIHsKKwlpZiAoaW50cl9sb2MgJiBQQ0lfRVhQX1NMVFNUQV9DQykgewogCQljdHJsLT5jbWRfYnVzeSA9IDA7CiAJCXNtcF9tYigpOwogCQl3YWtlX3VwKCZjdHJsLT5xdWV1ZSk7CiAJfQogCi0JaWYgKCEoaW50cl9sb2MgJiB+Q01EX0NPTVBMRVRFRCkpCisJaWYgKCEoaW50cl9sb2MgJiB+UENJX0VYUF9TTFRTVEFfQ0MpKQogCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CiAKIAlwX3Nsb3QgPSBwY2llaHBfZmluZF9zbG90KGN0cmwsIGN0cmwtPnNsb3RfZGV2aWNlX29mZnNldCk7CiAKIAkvKiBDaGVjayBNUkwgU2Vuc29yIENoYW5nZWQgKi8KLQlpZiAoaW50cl9sb2MgJiBNUkxfU0VOU19DSEFOR0VEKQorCWlmIChpbnRyX2xvYyAmIFBDSV9FWFBfU0xUU1RBX01STFNDKQogCQlwY2llaHBfaGFuZGxlX3N3aXRjaF9jaGFuZ2UocF9zbG90KTsKIAogCS8qIENoZWNrIEF0dGVudGlvbiBCdXR0b24gUHJlc3NlZCAqLwotCWlmIChpbnRyX2xvYyAmIEFUVE5fQlVUVE5fUFJFU1NFRCkKKwlpZiAoaW50cl9sb2MgJiBQQ0lfRVhQX1NMVFNUQV9BQlApCiAJCXBjaWVocF9oYW5kbGVfYXR0ZW50aW9uX2J1dHRvbihwX3Nsb3QpOwogCiAJLyogQ2hlY2sgUHJlc2VuY2UgRGV0ZWN0IENoYW5nZWQgKi8KLQlpZiAoaW50cl9sb2MgJiBQUlNOX0RFVEVDVF9DSEFOR0VEKQorCWlmIChpbnRyX2xvYyAmIFBDSV9FWFBfU0xUU1RBX1BEQykKIAkJcGNpZWhwX2hhbmRsZV9wcmVzZW5jZV9jaGFuZ2UocF9zbG90KTsKIAogCS8qIENoZWNrIFBvd2VyIEZhdWx0IERldGVjdGVkICovCi0JaWYgKGludHJfbG9jICYgUFdSX0ZBVUxUX0RFVEVDVEVEKQorCWlmIChpbnRyX2xvYyAmIFBDSV9FWFBfU0xUU1RBX1BGRCkKIAkJcGNpZWhwX2hhbmRsZV9wb3dlcl9mYXVsdChwX3Nsb3QpOwogCiAJcmV0dXJuIElSUV9IQU5ETEVEOwpAQCAtODU1LDcgKzcyMiw3IEBACiAJdTMyCWxua19jYXA7CiAJaW50IHJldHZhbCA9IDA7CiAKLQlyZXR2YWwgPSBwY2llaHBfcmVhZGwoY3RybCwgTE5LQ0FQLCAmbG5rX2NhcCk7CisJcmV0dmFsID0gcGNpZWhwX3JlYWRsKGN0cmwsIFBDSV9FWFBfTE5LQ0FQLCAmbG5rX2NhcCk7CiAJaWYgKHJldHZhbCkgewogCQljdHJsX2VycihjdHJsLCAiJXM6IENhbm5vdCByZWFkIExOS0NBUCByZWdpc3RlclxuIiwgX19mdW5jX18pOwogCQlyZXR1cm4gcmV0dmFsOwpAQCAtODg0LDEzICs3NTEsMTMgQEAKIAl1MzIJbG5rX2NhcDsKIAlpbnQgcmV0dmFsID0gMDsKIAotCXJldHZhbCA9IHBjaWVocF9yZWFkbChjdHJsLCBMTktDQVAsICZsbmtfY2FwKTsKKwlyZXR2YWwgPSBwY2llaHBfcmVhZGwoY3RybCwgUENJX0VYUF9MTktDQVAsICZsbmtfY2FwKTsKIAlpZiAocmV0dmFsKSB7CiAJCWN0cmxfZXJyKGN0cmwsICIlczogQ2Fubm90IHJlYWQgTE5LQ0FQIHJlZ2lzdGVyXG4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybiByZXR2YWw7CiAJfQogCi0Jc3dpdGNoICgobG5rX2NhcCAmIDB4MDNGMCkgPj4gNCl7CisJc3dpdGNoICgobG5rX2NhcCAmIFBDSV9FWFBfTE5LU1RBX05MVykgPj4gNCl7CiAJY2FzZSAwOgogCQlsbmtfd2R0aCA9IFBDSUVfTE5LX1dJRFRIX1JFU1JWOwogCQlicmVhazsKQEAgLTkzMywxNCArODAwLDE0IEBACiAJaW50IHJldHZhbCA9IDA7CiAJdTE2IGxua19zdGF0dXM7CiAKLQlyZXR2YWwgPSBwY2llaHBfcmVhZHcoY3RybCwgTE5LU1RBVFVTLCAmbG5rX3N0YXR1cyk7CisJcmV0dmFsID0gcGNpZWhwX3JlYWR3KGN0cmwsIFBDSV9FWFBfTE5LU1RBLCAmbG5rX3N0YXR1cyk7CiAJaWYgKHJldHZhbCkgewogCQljdHJsX2VycihjdHJsLCAiJXM6IENhbm5vdCByZWFkIExOS1NUQVRVUyByZWdpc3RlclxuIiwKIAkJCSBfX2Z1bmNfXyk7CiAJCXJldHVybiByZXR2YWw7CiAJfQogCi0Jc3dpdGNoIChsbmtfc3RhdHVzICYgMHgwRikgeworCXN3aXRjaCAobG5rX3N0YXR1cyAmIFBDSV9FWFBfTE5LU1RBX0NMUykgewogCWNhc2UgMToKIAkJbG5rX3NwZWVkID0gUENJRV8yUFQ1R0I7CiAJCWJyZWFrOwpAQCAtOTYzLDE0ICs4MzAsMTQgQEAKIAlpbnQgcmV0dmFsID0gMDsKIAl1MTYgbG5rX3N0YXR1czsKIAotCXJldHZhbCA9IHBjaWVocF9yZWFkdyhjdHJsLCBMTktTVEFUVVMsICZsbmtfc3RhdHVzKTsKKwlyZXR2YWwgPSBwY2llaHBfcmVhZHcoY3RybCwgUENJX0VYUF9MTktTVEEsICZsbmtfc3RhdHVzKTsKIAlpZiAocmV0dmFsKSB7CiAJCWN0cmxfZXJyKGN0cmwsICIlczogQ2Fubm90IHJlYWQgTE5LU1RBVFVTIHJlZ2lzdGVyXG4iLAogCQkJIF9fZnVuY19fKTsKIAkJcmV0dXJuIHJldHZhbDsKIAl9CiAKLQlzd2l0Y2ggKChsbmtfc3RhdHVzICYgMHgwM0YwKSA+PiA0KXsKKwlzd2l0Y2ggKChsbmtfc3RhdHVzICYgUENJX0VYUF9MTktTVEFfTkxXKSA+PiA0KXsKIAljYXNlIDA6CiAJCWxua193ZHRoID0gUENJRV9MTktfV0lEVEhfUkVTUlY7CiAJCWJyZWFrOwpAQCAtMTAzNiwxOCArOTAzLDE5IEBACiB7CiAJdTE2IGNtZCwgbWFzazsKIAotCWNtZCA9IFBSU05fREVURUNUX0VOQUJMRTsKKwljbWQgPSBQQ0lfRVhQX1NMVENUTF9QRENFOwogCWlmIChBVFROX0JVVFROKGN0cmwpKQotCQljbWQgfD0gQVRUTl9CVVRUTl9FTkFCTEU7CisJCWNtZCB8PSBQQ0lfRVhQX1NMVENUTF9BQlBFOwogCWlmIChQT1dFUl9DVFJMKGN0cmwpKQotCQljbWQgfD0gUFdSX0ZBVUxUX0RFVEVDVF9FTkFCTEU7CisJCWNtZCB8PSBQQ0lfRVhQX1NMVENUTF9QRkRFOwogCWlmIChNUkxfU0VOUyhjdHJsKSkKLQkJY21kIHw9IE1STF9ERVRFQ1RfRU5BQkxFOworCQljbWQgfD0gUENJX0VYUF9TTFRDVExfTVJMU0NFOwogCWlmICghcGNpZWhwX3BvbGxfbW9kZSkKLQkJY21kIHw9IEhQX0lOVFJfRU5BQkxFIHwgQ01EX0NNUExfSU5UUl9FTkFCTEU7CisJCWNtZCB8PSBQQ0lfRVhQX1NMVENUTF9IUElFIHwgUENJX0VYUF9TTFRDVExfQ0NJRTsKIAotCW1hc2sgPSBQUlNOX0RFVEVDVF9FTkFCTEUgfCBBVFROX0JVVFROX0VOQUJMRSB8IE1STF9ERVRFQ1RfRU5BQkxFIHwKLQkgICAgICAgUFdSX0ZBVUxUX0RFVEVDVF9FTkFCTEUgfCBIUF9JTlRSX0VOQUJMRSB8IENNRF9DTVBMX0lOVFJfRU5BQkxFOworCW1hc2sgPSAoUENJX0VYUF9TTFRDVExfUERDRSB8IFBDSV9FWFBfU0xUQ1RMX0FCUEUgfAorCQlQQ0lfRVhQX1NMVENUTF9NUkxTQ0UgfCBQQ0lfRVhQX1NMVENUTF9QRkRFIHwKKwkJUENJX0VYUF9TTFRDVExfSFBJRSB8IFBDSV9FWFBfU0xUQ1RMX0NDSUUpOwogCiAJaWYgKHBjaWVfd3JpdGVfY21kKGN0cmwsIGNtZCwgbWFzaykpIHsKIAkJY3RybF9lcnIoY3RybCwgIkNhbm5vdCBlbmFibGUgc29mdHdhcmUgbm90aWZpY2F0aW9uXG4iKTsKQEAgLTEwNTksOCArOTI3LDkgQEAKIHN0YXRpYyB2b2lkIHBjaWVfZGlzYWJsZV9ub3RpZmljYXRpb24oc3RydWN0IGNvbnRyb2xsZXIgKmN0cmwpCiB7CiAJdTE2IG1hc2s7Ci0JbWFzayA9IFBSU05fREVURUNUX0VOQUJMRSB8IEFUVE5fQlVUVE5fRU5BQkxFIHwgTVJMX0RFVEVDVF9FTkFCTEUgfAotCSAgICAgICBQV1JfRkFVTFRfREVURUNUX0VOQUJMRSB8IEhQX0lOVFJfRU5BQkxFIHwgQ01EX0NNUExfSU5UUl9FTkFCTEU7CisJbWFzayA9IChQQ0lfRVhQX1NMVENUTF9QRENFIHwgUENJX0VYUF9TTFRDVExfQUJQRSB8CisJCVBDSV9FWFBfU0xUQ1RMX01STFNDRSB8IFBDSV9FWFBfU0xUQ1RMX1BGREUgfAorCQlQQ0lfRVhQX1NMVENUTF9IUElFIHwgUENJX0VYUF9TTFRDVExfQ0NJRSk7CiAJaWYgKHBjaWVfd3JpdGVfY21kKGN0cmwsIDAsIG1hc2spKQogCQljdHJsX3dhcm4oY3RybCwgIkNhbm5vdCBkaXNhYmxlIHNvZnR3YXJlIG5vdGlmaWNhdGlvblxuIik7CiB9CkBAIC0xMTU3LDkgKzEwMjYsOSBAQAogCQkgIEVNSShjdHJsKSAgICAgICAgPyAieWVzIiA6ICJubyIpOwogCWN0cmxfaW5mbyhjdHJsLCAiICBDb21tYW5kIENvbXBsZXRlZCAgICA6ICUzc1xuIiwKIAkJICBOT19DTURfQ01QTChjdHJsKSA/ICJubyIgOiAieWVzIik7Ci0JcGNpZWhwX3JlYWR3KGN0cmwsIFNMT1RTVEFUVVMsICZyZWcxNik7CisJcGNpZWhwX3JlYWR3KGN0cmwsIFBDSV9FWFBfU0xUU1RBLCAmcmVnMTYpOwogCWN0cmxfaW5mbyhjdHJsLCAiU2xvdCBTdGF0dXMgICAgICAgICAgICA6IDB4JTA0eFxuIiwgcmVnMTYpOwotCXBjaWVocF9yZWFkdyhjdHJsLCBTTE9UQ1RSTCwgJnJlZzE2KTsKKwlwY2llaHBfcmVhZHcoY3RybCwgUENJX0VYUF9TTFRDVEwsICZyZWcxNik7CiAJY3RybF9pbmZvKGN0cmwsICJTbG90IENvbnRyb2wgICAgICAgICAgIDogMHglMDR4XG4iLCByZWcxNik7CiB9CiAKQEAgLTExODMsNyArMTA1Miw3IEBACiAJCWN0cmxfZXJyKGN0cmwsICJDYW5ub3QgZmluZCBQQ0kgRXhwcmVzcyBjYXBhYmlsaXR5XG4iKTsKIAkJZ290byBhYm9ydF9jdHJsOwogCX0KLQlpZiAocGNpZWhwX3JlYWRsKGN0cmwsIFNMT1RDQVAsICZzbG90X2NhcCkpIHsKKwlpZiAocGNpZWhwX3JlYWRsKGN0cmwsIFBDSV9FWFBfU0xUQ0FQLCAmc2xvdF9jYXApKSB7CiAJCWN0cmxfZXJyKGN0cmwsICJDYW5ub3QgcmVhZCBTTE9UQ0FQIHJlZ2lzdGVyXG4iKTsKIAkJZ290byBhYm9ydF9jdHJsOwogCX0KQEAgLTEyMDgsMTcgKzEwNzcsMTcgQEAKIAkgICAgY3RybC0+bm9fY21kX2NvbXBsZXRlID0gMTsKIAogICAgICAgICAvKiBDaGVjayBpZiBEYXRhIExpbmsgTGF5ZXIgTGluayBBY3RpdmUgUmVwb3J0aW5nIGlzIGltcGxlbWVudGVkICovCi0gICAgICAgIGlmIChwY2llaHBfcmVhZGwoY3RybCwgTE5LQ0FQLCAmbGlua19jYXApKSB7CisgICAgICAgIGlmIChwY2llaHBfcmVhZGwoY3RybCwgUENJX0VYUF9MTktDQVAsICZsaW5rX2NhcCkpIHsKICAgICAgICAgICAgICAgICBjdHJsX2VycihjdHJsLCAiJXM6IENhbm5vdCByZWFkIExOS0NBUCByZWdpc3RlclxuIiwgX19mdW5jX18pOwogICAgICAgICAgICAgICAgIGdvdG8gYWJvcnRfY3RybDsKICAgICAgICAgfQotICAgICAgICBpZiAobGlua19jYXAgJiBMSU5LX0FDVElWRV9SRVBPUlRJTkcpIHsKKyAgICAgICAgaWYgKGxpbmtfY2FwICYgUENJX0VYUF9MTktDQVBfRExMTEFSQykgewogICAgICAgICAgICAgICAgIGN0cmxfZGJnKGN0cmwsICJMaW5rIEFjdGl2ZSBSZXBvcnRpbmcgc3VwcG9ydGVkXG4iKTsKICAgICAgICAgICAgICAgICBjdHJsLT5saW5rX2FjdGl2ZV9yZXBvcnRpbmcgPSAxOwogICAgICAgICB9CiAKIAkvKiBDbGVhciBhbGwgcmVtYWluaW5nIGV2ZW50IGJpdHMgaW4gU2xvdCBTdGF0dXMgcmVnaXN0ZXIgKi8KLQlpZiAocGNpZWhwX3dyaXRldyhjdHJsLCBTTE9UU1RBVFVTLCAweDFmKSkKKwlpZiAocGNpZWhwX3dyaXRldyhjdHJsLCBQQ0lfRVhQX1NMVFNUQSwgMHgxZikpCiAJCWdvdG8gYWJvcnRfY3RybDsKIAogCS8qIERpc2FibGUgc290ZndhcmUgbm90aWZpY2F0aW9uICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9pbnRlbC1pb21tdS5jIGIvZHJpdmVycy9wY2kvaW50ZWwtaW9tbXUuYwppbmRleCAyMzVmYjdhLi4zZGZlY2IyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9pbnRlbC1pb21tdS5jCisrKyBiL2RyaXZlcnMvcGNpL2ludGVsLWlvbW11LmMKQEAgLTQzOCw3ICs0MzgsOCBAQAogCQkJY29udGludWU7CiAKIAkJZm9yIChpID0gMDsgaSA8IGRyaGQtPmRldmljZXNfY250OyBpKyspCi0JCQlpZiAoZHJoZC0+ZGV2aWNlc1tpXS0+YnVzLT5udW1iZXIgPT0gYnVzICYmCisJCQlpZiAoZHJoZC0+ZGV2aWNlc1tpXSAmJgorCQkJICAgIGRyaGQtPmRldmljZXNbaV0tPmJ1cy0+bnVtYmVyID09IGJ1cyAmJgogCQkJICAgIGRyaGQtPmRldmljZXNbaV0tPmRldmZuID09IGRldmZuKQogCQkJCXJldHVybiBkcmhkLT5pb21tdTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvaXJxLmMgYi9kcml2ZXJzL3BjaS9pcnEuYwppbmRleCA2NDQxZGZhLi5kZTAxMTc0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9pcnEuYworKysgYi9kcml2ZXJzL3BjaS9pcnEuYwpAQCAtMTUsNyArMTUsNyBAQAogCiAJZGV2X3ByaW50ayhLRVJOX0VSUiwgJnBkZXYtPmRldiwKIAkJICAgIlBvdGVudGlhbGx5IG1pc3JvdXRlZCBJUlEgKEJyaWRnZSAlcyAlMDR4OiUwNHgpXG4iLAotCQkgICBwYXJlbnQtPmRldi5idXNfaWQsIHBhcmVudC0+dmVuZG9yLCBwYXJlbnQtPmRldmljZSk7CisJCSAgIGRldl9uYW1lKCZwYXJlbnQtPmRldiksIHBhcmVudC0+dmVuZG9yLCBwYXJlbnQtPmRldmljZSk7CiAJZGV2X3ByaW50ayhLRVJOX0VSUiwgJnBkZXYtPmRldiwgIiVzXG4iLCByZWFzb24pOwogCWRldl9wcmludGsoS0VSTl9FUlIsICZwZGV2LT5kZXYsICJQbGVhc2UgcmVwb3J0IHRvIGxpbnV4LWtlcm5lbEB2Z2VyLmtlcm5lbC5vcmdcbiIpOwogCVdBUk5fT04oMSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9tc2kuYyBiL2RyaXZlcnMvcGNpL21zaS5jCmluZGV4IDExYTUxZjguLmI0YTkwYmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL21zaS5jCisrKyBiL2RyaXZlcnMvcGNpL21zaS5jCkBAIC03NzYsMjggKzc3NiwxOSBAQAogCXBjaV9tc2lfZW5hYmxlID0gMDsKIH0KIAorLyoqCisgKiBwY2lfbXNpX2VuYWJsZWQgLSBpcyBNU0kgZW5hYmxlZD8KKyAqCisgKiBSZXR1cm5zIHRydWUgaWYgTVNJIGhhcyBub3QgYmVlbiBkaXNhYmxlZCBieSB0aGUgY29tbWFuZC1saW5lIG9wdGlvbgorICogcGNpPW5vbXNpLgorICoqLworaW50IHBjaV9tc2lfZW5hYmxlZCh2b2lkKQoreworCXJldHVybiBwY2lfbXNpX2VuYWJsZTsKK30KK0VYUE9SVF9TWU1CT0wocGNpX21zaV9lbmFibGVkKTsKKwogdm9pZCBwY2lfbXNpX2luaXRfcGNpX2RldihzdHJ1Y3QgcGNpX2RldiAqZGV2KQogewogCUlOSVRfTElTVF9IRUFEKCZkZXYtPm1zaV9saXN0KTsKIH0KLQotI2lmZGVmIENPTkZJR19BQ1BJCi0jaW5jbHVkZSA8bGludXgvYWNwaS5oPgotI2luY2x1ZGUgPGxpbnV4L3BjaS1hY3BpLmg+Ci1zdGF0aWMgdm9pZCBfX2RldmluaXQgbXNpX2FjcGlfaW5pdCh2b2lkKQotewotCWlmIChhY3BpX3BjaV9kaXNhYmxlZCkKLQkJcmV0dXJuOwotCXBjaV9vc2Nfc3VwcG9ydF9zZXQoT1NDX01TSV9TVVBQT1JUKTsKLQlwY2llX29zY19zdXBwb3J0X3NldChPU0NfTVNJX1NVUFBPUlQpOwotfQotI2Vsc2UKLXN0YXRpYyBpbmxpbmUgdm9pZCBtc2lfYWNwaV9pbml0KHZvaWQpIHsgfQotI2VuZGlmIC8qIENPTkZJR19BQ1BJICovCi0KLXZvaWQgX19kZXZpbml0IG1zaV9pbml0KHZvaWQpCi17Ci0JaWYgKCFwY2lfbXNpX2VuYWJsZSkKLQkJcmV0dXJuOwotCW1zaV9hY3BpX2luaXQoKTsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3BjaS1hY3BpLmMgYi9kcml2ZXJzL3BjaS9wY2ktYWNwaS5jCmluZGV4IGFlNWVjNzYuLmRlZWE4YTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL3BjaS1hY3BpLmMKKysrIGIvZHJpdmVycy9wY2kvcGNpLWFjcGkuYwpAQCAtMTMsOCArMTMsNiBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS1hc3BtLmg+CiAjaW5jbHVkZSA8YWNwaS9hY3BpLmg+Ci0jaW5jbHVkZSA8YWNwaS9hY25hbWVzcC5oPgotI2luY2x1ZGUgPGFjcGkvYWNyZXNyYy5oPgogI2luY2x1ZGUgPGFjcGkvYWNwaV9idXMuaD4KIAogI2luY2x1ZGUgPGxpbnV4L3BjaS1hY3BpLmg+CkBAIC0yNCwxMyArMjIsMTQgQEAKIAlhY3BpX2hhbmRsZSBoYW5kbGU7CiAJdTMyIHN1cHBvcnRfc2V0OwogCXUzMiBjb250cm9sX3NldDsKKwl1MzIgY29udHJvbF9xdWVyeTsKKwlpbnQgaXNfcXVlcmllZDsKIAlzdHJ1Y3QgbGlzdF9oZWFkIHNpYmlsaW5nOwogfTsKIHN0YXRpYyBMSVNUX0hFQUQoYWNwaV9vc2NfZGF0YV9saXN0KTsKIAogc3RydWN0IGFjcGlfb3NjX2FyZ3MgewogCXUzMiBjYXBidWZbM107Ci0JdTMyIGN0cmxfcmVzdWx0OwogfTsKIAogc3RhdGljIERFRklORV9NVVRFWChwY2lfYWNwaV9sb2NrKTsKQEAgLTU2LDcgKzU1LDcgQEAKIAkJCSAgMHg5NiwgMHg1NywgMHg3NCwgMHg0MSwgMHhDMCwgMHgzRCwgMHhENywgMHg2Nn07CiAKIHN0YXRpYyBhY3BpX3N0YXR1cyBhY3BpX3J1bl9vc2MoYWNwaV9oYW5kbGUgaGFuZGxlLAotCQkJCXN0cnVjdCBhY3BpX29zY19hcmdzICpvc2NfYXJncykKKwkJCQlzdHJ1Y3QgYWNwaV9vc2NfYXJncyAqb3NjX2FyZ3MsIHUzMiAqcmV0dmFsKQogewogCWFjcGlfc3RhdHVzIHN0YXR1czsKIAlzdHJ1Y3QgYWNwaV9vYmplY3RfbGlzdCBpbnB1dDsKQEAgLTExMiw4ICsxMTEsNyBAQAogCQlnb3RvIG91dF9rZnJlZTsKIAl9CiBvdXRfc3VjY2VzczoKLQlvc2NfYXJncy0+Y3RybF9yZXN1bHQgPQotCQkqKCh1MzIgKikob3V0X29iai0+YnVmZmVyLnBvaW50ZXIgKyA4KSk7CisJKnJldHZhbCA9ICooKHUzMiAqKShvdXRfb2JqLT5idWZmZXIucG9pbnRlciArIDgpKTsKIAlzdGF0dXMgPSBBRV9PSzsKIAogb3V0X2tmcmVlOgpAQCAtMTIxLDExICsxMTksMTAgQEAKIAlyZXR1cm4gc3RhdHVzOwogfQogCi1zdGF0aWMgYWNwaV9zdGF0dXMgX19hY3BpX3F1ZXJ5X29zYyh1MzIgZmxhZ3MsIHN0cnVjdCBhY3BpX29zY19kYXRhICpvc2NfZGF0YSwKLQkJCQkgICAgdTMyICpyZXN1bHQpCitzdGF0aWMgYWNwaV9zdGF0dXMgX19hY3BpX3F1ZXJ5X29zYyh1MzIgZmxhZ3MsIHN0cnVjdCBhY3BpX29zY19kYXRhICpvc2NfZGF0YSkKIHsKIAlhY3BpX3N0YXR1cyBzdGF0dXM7Ci0JdTMyIHN1cHBvcnRfc2V0OworCXUzMiBzdXBwb3J0X3NldCwgcmVzdWx0OwogCXN0cnVjdCBhY3BpX29zY19hcmdzIG9zY19hcmdzOwogCiAJLyogZG8gX09TQyBxdWVyeSBmb3IgYWxsIHBvc3NpYmxlIGNvbnRyb2xzICovCkBAIC0xMzQsNTYgKzEzMSw0NSBAQAogCW9zY19hcmdzLmNhcGJ1ZltPU0NfU1VQUE9SVF9UWVBFXSA9IHN1cHBvcnRfc2V0OwogCW9zY19hcmdzLmNhcGJ1ZltPU0NfQ09OVFJPTF9UWVBFXSA9IE9TQ19DT05UUk9MX01BU0tTOwogCi0Jc3RhdHVzID0gYWNwaV9ydW5fb3NjKG9zY19kYXRhLT5oYW5kbGUsICZvc2NfYXJncyk7CisJc3RhdHVzID0gYWNwaV9ydW5fb3NjKG9zY19kYXRhLT5oYW5kbGUsICZvc2NfYXJncywgJnJlc3VsdCk7CiAJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKSB7CiAJCW9zY19kYXRhLT5zdXBwb3J0X3NldCA9IHN1cHBvcnRfc2V0OwotCQkqcmVzdWx0ID0gb3NjX2FyZ3MuY3RybF9yZXN1bHQ7CisJCW9zY19kYXRhLT5jb250cm9sX3F1ZXJ5ID0gcmVzdWx0OworCQlvc2NfZGF0YS0+aXNfcXVlcmllZCA9IDE7CiAJfQogCiAJcmV0dXJuIHN0YXR1czsKIH0KIAotc3RhdGljIGFjcGlfc3RhdHVzIGFjcGlfcXVlcnlfb3NjKGFjcGlfaGFuZGxlIGhhbmRsZSwKLQkJCQkgIHUzMiBsZXZlbCwgdm9pZCAqY29udGV4dCwgdm9pZCAqKnJldHZhbCkKKy8qCisgKiBwY2lfYWNwaV9vc2Nfc3VwcG9ydDogSW52b2tlIF9PU0MgaW5kaWNhdGluZyBzdXBwb3J0IGZvciB0aGUgZ2l2ZW4gZmVhdHVyZQorICogQGZsYWdzOiBCaXRtYXNrIG9mIGZsYWdzIHRvIHN1cHBvcnQKKyAqCisgKiBTZWUgdGhlIEFDUEkgc3BlYyBmb3IgdGhlIGRlZmluaXRpb24gb2YgdGhlIGZsYWdzCisgKi8KK2ludCBwY2lfYWNwaV9vc2Nfc3VwcG9ydChhY3BpX2hhbmRsZSBoYW5kbGUsIHUzMiBmbGFncykKIHsKIAlhY3BpX3N0YXR1cyBzdGF0dXM7Ci0Jc3RydWN0IGFjcGlfb3NjX2RhdGEgKm9zY19kYXRhOwotCXUzMiBmbGFncyA9ICh1bnNpZ25lZCBsb25nKWNvbnRleHQsIGR1bW15OwogCWFjcGlfaGFuZGxlIHRtcDsKKwlzdHJ1Y3QgYWNwaV9vc2NfZGF0YSAqb3NjX2RhdGE7CisJaW50IHJjID0gMDsKIAogCXN0YXR1cyA9IGFjcGlfZ2V0X2hhbmRsZShoYW5kbGUsICJfT1NDIiwgJnRtcCk7CiAJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKQotCQlyZXR1cm4gQUVfT0s7CisJCXJldHVybiAtRU5PVFRZOwogCiAJbXV0ZXhfbG9jaygmcGNpX2FjcGlfbG9jayk7CiAJb3NjX2RhdGEgPSBhY3BpX2dldF9vc2NfZGF0YShoYW5kbGUpOwogCWlmICghb3NjX2RhdGEpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJhY3BpIG9zYyBkYXRhIGFycmF5IGlzIGZ1bGxcbiIpOworCQlyYyA9IC1FTk9NRU07CiAJCWdvdG8gb3V0OwogCX0KIAotCV9fYWNwaV9xdWVyeV9vc2MoZmxhZ3MsIG9zY19kYXRhLCAmZHVtbXkpOworCV9fYWNwaV9xdWVyeV9vc2MoZmxhZ3MsIG9zY19kYXRhKTsKIG91dDoKIAltdXRleF91bmxvY2soJnBjaV9hY3BpX2xvY2spOwotCXJldHVybiBBRV9PSzsKLX0KLQotLyoqCi0gKiBfX3BjaV9vc2Nfc3VwcG9ydF9zZXQgLSByZWdpc3RlciBPUyBzdXBwb3J0IHRvIEZpcm13YXJlCi0gKiBAZmxhZ3M6IE9TIHN1cHBvcnQgYml0cwotICogQGhpZDogaGFyZHdhcmUgSUQKLSAqCi0gKiBVcGRhdGUgT1Mgc3VwcG9ydCBmaWVsZHMgYW5kIGRvaW5nIGEgX09TQyBRdWVyeSB0byBvYnRhaW4gYW4gdXBkYXRlCi0gKiBmcm9tIEZpcm13YXJlIG9uIHN1cHBvcnRlZCBjb250cm9sIGJpdHMuCi0gKiovCi1hY3BpX3N0YXR1cyBfX3BjaV9vc2Nfc3VwcG9ydF9zZXQodTMyIGZsYWdzLCBjb25zdCBjaGFyICpoaWQpCi17Ci0JaWYgKCEoZmxhZ3MgJiBPU0NfU1VQUE9SVF9NQVNLUykpCi0JCXJldHVybiBBRV9UWVBFOwotCi0JYWNwaV9nZXRfZGV2aWNlcyhoaWQsIGFjcGlfcXVlcnlfb3NjLAotCQkJICh2b2lkICopKHVuc2lnbmVkIGxvbmcpZmxhZ3MsIE5VTEwpOwotCXJldHVybiBBRV9PSzsKKwlyZXR1cm4gcmM7CiB9CiAKIC8qKgpAQCAtMTk2LDcgKzE4Miw3IEBACiBhY3BpX3N0YXR1cyBwY2lfb3NjX2NvbnRyb2xfc2V0KGFjcGlfaGFuZGxlIGhhbmRsZSwgdTMyIGZsYWdzKQogewogCWFjcGlfc3RhdHVzIHN0YXR1czsKLQl1MzIgY3RybHNldCwgY29udHJvbF9zZXQsIHJlc3VsdDsKKwl1MzIgY29udHJvbF9yZXEsIGNvbnRyb2xfc2V0LCByZXN1bHQ7CiAJYWNwaV9oYW5kbGUgdG1wOwogCXN0cnVjdCBhY3BpX29zY19kYXRhICpvc2NfZGF0YTsKIAlzdHJ1Y3QgYWNwaV9vc2NfYXJncyBvc2NfYXJnczsKQEAgLTIxMywyOCArMTk5LDM0IEBACiAJCWdvdG8gb3V0OwogCX0KIAotCWN0cmxzZXQgPSAoZmxhZ3MgJiBPU0NfQ09OVFJPTF9NQVNLUyk7Ci0JaWYgKCFjdHJsc2V0KSB7CisJY29udHJvbF9yZXEgPSAoZmxhZ3MgJiBPU0NfQ09OVFJPTF9NQVNLUyk7CisJaWYgKCFjb250cm9sX3JlcSkgewogCQlzdGF0dXMgPSBBRV9UWVBFOwogCQlnb3RvIG91dDsKIAl9CiAKLQlzdGF0dXMgPSBfX2FjcGlfcXVlcnlfb3NjKG9zY19kYXRhLT5zdXBwb3J0X3NldCwgb3NjX2RhdGEsICZyZXN1bHQpOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkKKwkvKiBObyBuZWVkIHRvIGV2YWx1YXRlIF9PU0MgaWYgdGhlIGNvbnRyb2wgd2FzIGFscmVhZHkgZ3JhbnRlZC4gKi8KKwlpZiAoKG9zY19kYXRhLT5jb250cm9sX3NldCAmIGNvbnRyb2xfcmVxKSA9PSBjb250cm9sX3JlcSkKIAkJZ290byBvdXQ7CiAKLQlpZiAoKHJlc3VsdCAmIGN0cmxzZXQpICE9IGN0cmxzZXQpIHsKKwlpZiAoIW9zY19kYXRhLT5pc19xdWVyaWVkKSB7CisJCXN0YXR1cyA9IF9fYWNwaV9xdWVyeV9vc2Mob3NjX2RhdGEtPnN1cHBvcnRfc2V0LCBvc2NfZGF0YSk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkKKwkJCWdvdG8gb3V0OworCX0KKworCWlmICgob3NjX2RhdGEtPmNvbnRyb2xfcXVlcnkgJiBjb250cm9sX3JlcSkgIT0gY29udHJvbF9yZXEpIHsKIAkJc3RhdHVzID0gQUVfU1VQUE9SVDsKIAkJZ290byBvdXQ7CiAJfQogCi0JY29udHJvbF9zZXQgPSBvc2NfZGF0YS0+Y29udHJvbF9zZXQgfCBjdHJsc2V0OworCWNvbnRyb2xfc2V0ID0gb3NjX2RhdGEtPmNvbnRyb2xfc2V0IHwgY29udHJvbF9yZXE7CiAJb3NjX2FyZ3MuY2FwYnVmW09TQ19RVUVSWV9UWVBFXSA9IDA7CiAJb3NjX2FyZ3MuY2FwYnVmW09TQ19TVVBQT1JUX1RZUEVdID0gb3NjX2RhdGEtPnN1cHBvcnRfc2V0OwogCW9zY19hcmdzLmNhcGJ1ZltPU0NfQ09OVFJPTF9UWVBFXSA9IGNvbnRyb2xfc2V0OwotCXN0YXR1cyA9IGFjcGlfcnVuX29zYyhoYW5kbGUsICZvc2NfYXJncyk7CisJc3RhdHVzID0gYWNwaV9ydW5fb3NjKGhhbmRsZSwgJm9zY19hcmdzLCAmcmVzdWx0KTsKIAlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpCi0JCW9zY19kYXRhLT5jb250cm9sX3NldCA9IGNvbnRyb2xfc2V0OworCQlvc2NfZGF0YS0+Y29udHJvbF9zZXQgPSByZXN1bHQ7CiBvdXQ6CiAJbXV0ZXhfdW5sb2NrKCZwY2lfYWNwaV9sb2NrKTsKIAlyZXR1cm4gc3RhdHVzOwpAQCAtMzc1LDcgKzM2Nyw3IEBACiAJICogVGhlIHN0cmluZyBzaG91bGQgYmUgdGhlIHNhbWUgYXMgcm9vdCBicmlkZ2UncyBuYW1lCiAJICogUGxlYXNlIGxvb2sgYXQgJ3BjaV9zY2FuX2J1c19wYXJlbnRlZCcKIAkgKi8KLQludW0gPSBzc2NhbmYoZGV2LT5idXNfaWQsICJwY2klMDR4OiUwMngiLCAmc2VnLCAmYnVzKTsKKwludW0gPSBzc2NhbmYoZGV2X25hbWUoZGV2KSwgInBjaSUwNHg6JTAyeCIsICZzZWcsICZidXMpOwogCWlmIChudW0gIT0gMikKIAkJcmV0dXJuIC1FTk9ERVY7CiAJKmhhbmRsZSA9IGFjcGlfZ2V0X3BjaV9yb290YnJpZGdlX2hhbmRsZShzZWcsIGJ1cyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9wY2ktZHJpdmVyLmMgYi9kcml2ZXJzL3BjaS9wY2ktZHJpdmVyLmMKaW5kZXggOTlkODY3Yi4uYzY5N2YyNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvcGNpLWRyaXZlci5jCisrKyBiL2RyaXZlcnMvcGNpL3BjaS1kcml2ZXIuYwpAQCAtMTYsNiArMTYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2NwdS5oPgogI2luY2x1ZGUgInBjaS5oIgogCiAvKgpAQCAtNDgsNyArNDksNyBAQAogCQlzdWJkZXZpY2U9UENJX0FOWV9JRCwgY2xhc3M9MCwgY2xhc3NfbWFzaz0wOwogCXVuc2lnbmVkIGxvbmcgZHJpdmVyX2RhdGE9MDsKIAlpbnQgZmllbGRzPTA7Ci0JaW50IHJldHZhbDsKKwlpbnQgcmV0dmFsPTA7CiAKIAlmaWVsZHMgPSBzc2NhbmYoYnVmLCAiJXggJXggJXggJXggJXggJXggJWx4IiwKIAkJCSZ2ZW5kb3IsICZkZXZpY2UsICZzdWJ2ZW5kb3IsICZzdWJkZXZpY2UsCkBAIC01OCwxNiArNTksMTggQEAKIAogCS8qIE9ubHkgYWNjZXB0IGRyaXZlcl9kYXRhIHZhbHVlcyB0aGF0IG1hdGNoIGFuIGV4aXN0aW5nIGlkX3RhYmxlCiAJICAgZW50cnkgKi8KLQlyZXR2YWwgPSAtRUlOVkFMOwotCXdoaWxlIChpZHMtPnZlbmRvciB8fCBpZHMtPnN1YnZlbmRvciB8fCBpZHMtPmNsYXNzX21hc2spIHsKLQkJaWYgKGRyaXZlcl9kYXRhID09IGlkcy0+ZHJpdmVyX2RhdGEpIHsKLQkJCXJldHZhbCA9IDA7Ci0JCQlicmVhazsKKwlpZiAoaWRzKSB7CisJCXJldHZhbCA9IC1FSU5WQUw7CisJCXdoaWxlIChpZHMtPnZlbmRvciB8fCBpZHMtPnN1YnZlbmRvciB8fCBpZHMtPmNsYXNzX21hc2spIHsKKwkJCWlmIChkcml2ZXJfZGF0YSA9PSBpZHMtPmRyaXZlcl9kYXRhKSB7CisJCQkJcmV0dmFsID0gMDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlkcysrOwogCQl9Ci0JCWlkcysrOworCQlpZiAocmV0dmFsKQkvKiBObyBtYXRjaCAqLworCQkJcmV0dXJuIHJldHZhbDsKIAl9Ci0JaWYgKHJldHZhbCkJLyogTm8gbWF0Y2ggKi8KLQkJcmV0dXJuIHJldHZhbDsKIAogCWR5bmlkID0ga3phbGxvYyhzaXplb2YoKmR5bmlkKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFkeW5pZCkKQEAgLTE4MywzMiArMTg2LDQzIEBACiAJcmV0dXJuIHBjaV9tYXRjaF9pZChkcnYtPmlkX3RhYmxlLCBkZXYpOwogfQogCitzdHJ1Y3QgZHJ2X2Rldl9hbmRfaWQgeworCXN0cnVjdCBwY2lfZHJpdmVyICpkcnY7CisJc3RydWN0IHBjaV9kZXYgKmRldjsKKwljb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQ7Cit9OworCitzdGF0aWMgbG9uZyBsb2NhbF9wY2lfcHJvYmUodm9pZCAqX2RkaSkKK3sKKwlzdHJ1Y3QgZHJ2X2Rldl9hbmRfaWQgKmRkaSA9IF9kZGk7CisKKwlyZXR1cm4gZGRpLT5kcnYtPnByb2JlKGRkaS0+ZGV2LCBkZGktPmlkKTsKK30KKwogc3RhdGljIGludCBwY2lfY2FsbF9wcm9iZShzdHJ1Y3QgcGNpX2RyaXZlciAqZHJ2LCBzdHJ1Y3QgcGNpX2RldiAqZGV2LAogCQkJICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpCiB7Ci0JaW50IGVycm9yOwotI2lmZGVmIENPTkZJR19OVU1BCi0JLyogRXhlY3V0ZSBkcml2ZXIgaW5pdGlhbGl6YXRpb24gb24gbm9kZSB3aGVyZSB0aGUKLQkgICBkZXZpY2UncyBidXMgaXMgYXR0YWNoZWQgdG8uICBUaGlzIHdheSB0aGUgZHJpdmVyIGxpa2VseQotCSAgIGFsbG9jYXRlcyBpdHMgbG9jYWwgbWVtb3J5IG9uIHRoZSByaWdodCBub2RlIHdpdGhvdXQKLQkgICBhbnkgbmVlZCB0byBjaGFuZ2UgaXQuICovCi0Jc3RydWN0IG1lbXBvbGljeSAqb2xkcG9sOwotCWNwdW1hc2tfdCBvbGRtYXNrID0gY3VycmVudC0+Y3B1c19hbGxvd2VkOwotCWludCBub2RlID0gZGV2X3RvX25vZGUoJmRldi0+ZGV2KTsKKwlpbnQgZXJyb3IsIG5vZGU7CisJc3RydWN0IGRydl9kZXZfYW5kX2lkIGRkaSA9IHsgZHJ2LCBkZXYsIGlkIH07CiAKKwkvKiBFeGVjdXRlIGRyaXZlciBpbml0aWFsaXphdGlvbiBvbiBub2RlIHdoZXJlIHRoZSBkZXZpY2UncworCSAgIGJ1cyBpcyBhdHRhY2hlZCB0by4gIFRoaXMgd2F5IHRoZSBkcml2ZXIgbGlrZWx5IGFsbG9jYXRlcworCSAgIGl0cyBsb2NhbCBtZW1vcnkgb24gdGhlIHJpZ2h0IG5vZGUgd2l0aG91dCBhbnkgbmVlZCB0bworCSAgIGNoYW5nZSBpdC4gKi8KKwlub2RlID0gZGV2X3RvX25vZGUoJmRldi0+ZGV2KTsKIAlpZiAobm9kZSA+PSAwKSB7CisJCWludCBjcHU7CiAJCW5vZGVfdG9fY3B1bWFza19wdHIobm9kZWNwdW1hc2ssIG5vZGUpOwotCQlzZXRfY3B1c19hbGxvd2VkX3B0cihjdXJyZW50LCBub2RlY3B1bWFzayk7Ci0JfQotCS8qIEFuZCBzZXQgZGVmYXVsdCBtZW1vcnkgYWxsb2NhdGlvbiBwb2xpY3kgKi8KLQlvbGRwb2wgPSBjdXJyZW50LT5tZW1wb2xpY3k7Ci0JY3VycmVudC0+bWVtcG9saWN5ID0gTlVMTDsJLyogZmFsbCBiYWNrIHRvIHN5c3RlbSBkZWZhdWx0IHBvbGljeSAqLwotI2VuZGlmCi0JZXJyb3IgPSBkcnYtPnByb2JlKGRldiwgaWQpOwotI2lmZGVmIENPTkZJR19OVU1BCi0Jc2V0X2NwdXNfYWxsb3dlZF9wdHIoY3VycmVudCwgJm9sZG1hc2spOwotCWN1cnJlbnQtPm1lbXBvbGljeSA9IG9sZHBvbDsKLSNlbmRpZgorCisJCWdldF9vbmxpbmVfY3B1cygpOworCQljcHUgPSBjcHVtYXNrX2FueV9hbmQobm9kZWNwdW1hc2ssIGNwdV9vbmxpbmVfbWFzayk7CisJCWlmIChjcHUgPCBucl9jcHVfaWRzKQorCQkJZXJyb3IgPSB3b3JrX29uX2NwdShjcHUsIGxvY2FsX3BjaV9wcm9iZSwgJmRkaSk7CisJCWVsc2UKKwkJCWVycm9yID0gbG9jYWxfcGNpX3Byb2JlKCZkZGkpOworCQlwdXRfb25saW5lX2NwdXMoKTsKKwl9IGVsc2UKKwkJZXJyb3IgPSBsb2NhbF9wY2lfcHJvYmUoJmRkaSk7CiAJcmV0dXJuIGVycm9yOwogfQogCkBAIC0zMDAsMjEgKzMxNCwxMiBAQAogCiAjaWZkZWYgQ09ORklHX1BNX1NMRUVQCiAKLXN0YXRpYyBib29sIHBjaV9oYXNfbGVnYWN5X3BtX3N1cHBvcnQoc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYpCi17Ci0Jc3RydWN0IHBjaV9kcml2ZXIgKmRydiA9IHBjaV9kZXYtPmRyaXZlcjsKLQotCXJldHVybiBkcnYgJiYgKGRydi0+c3VzcGVuZCB8fCBkcnYtPnN1c3BlbmRfbGF0ZSB8fCBkcnYtPnJlc3VtZQotCQl8fCBkcnYtPnJlc3VtZV9lYXJseSk7Ci19Ci0KIC8qCiAgKiBEZWZhdWx0ICJzdXNwZW5kIiBtZXRob2QgZm9yIGRldmljZXMgdGhhdCBoYXZlIG5vIGRyaXZlciBwcm92aWRlZCBzdXNwZW5kLAotICogb3Igbm90IGV2ZW4gYSBkcml2ZXIgYXQgYWxsLgorICogb3Igbm90IGV2ZW4gYSBkcml2ZXIgYXQgYWxsIChzZWNvbmQgcGFydCkuCiAgKi8KLXN0YXRpYyB2b2lkIHBjaV9kZWZhdWx0X3BtX3N1c3BlbmQoc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYpCitzdGF0aWMgdm9pZCBwY2lfcG1fc2V0X3Vua25vd25fc3RhdGUoc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYpCiB7Ci0JcGNpX3NhdmVfc3RhdGUocGNpX2Rldik7CiAJLyoKIAkgKiBtYXJrIGl0cyBwb3dlciBzdGF0ZSBhcyAidW5rbm93biIsIHNpbmNlIHdlIGRvbid0IGtub3cgaWYKIAkgKiBlLmcuIHRoZSBCSU9TIHdpbGwgY2hhbmdlIGl0cyBkZXZpY2Ugc3RhdGUgd2hlbiB3ZSBzdXNwZW5kLgpAQCAtMzI1LDE5ICszMzAsOSBAQAogCiAvKgogICogRGVmYXVsdCAicmVzdW1lIiBtZXRob2QgZm9yIGRldmljZXMgdGhhdCBoYXZlIG5vIGRyaXZlciBwcm92aWRlZCByZXN1bWUsCi0gKiBvciBub3QgZXZlbiBhIGRyaXZlciBhdCBhbGwgKGZpcnN0IHBhcnQpLgotICovCi1zdGF0aWMgdm9pZCBwY2lfZGVmYXVsdF9wbV9yZXN1bWVfZWFybHkoc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYpCi17Ci0JLyogcmVzdG9yZSB0aGUgUENJIGNvbmZpZyBzcGFjZSAqLwotCXBjaV9yZXN0b3JlX3N0YXRlKHBjaV9kZXYpOwotfQotCi0vKgotICogRGVmYXVsdCAicmVzdW1lIiBtZXRob2QgZm9yIGRldmljZXMgdGhhdCBoYXZlIG5vIGRyaXZlciBwcm92aWRlZCByZXN1bWUsCiAgKiBvciBub3QgZXZlbiBhIGRyaXZlciBhdCBhbGwgKHNlY29uZCBwYXJ0KS4KICAqLwotc3RhdGljIGludCBwY2lfZGVmYXVsdF9wbV9yZXN1bWVfbGF0ZShzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldikKK3N0YXRpYyBpbnQgcGNpX3BtX3JlZW5hYmxlX2RldmljZShzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldikKIHsKIAlpbnQgcmV0dmFsOwogCkBAIC0zNjMsOCArMzU4LDE2IEBACiAJCWkgPSBkcnYtPnN1c3BlbmQocGNpX2Rldiwgc3RhdGUpOwogCQlzdXNwZW5kX3JlcG9ydF9yZXN1bHQoZHJ2LT5zdXNwZW5kLCBpKTsKIAl9IGVsc2UgewotCQlwY2lfZGVmYXVsdF9wbV9zdXNwZW5kKHBjaV9kZXYpOworCQlwY2lfc2F2ZV9zdGF0ZShwY2lfZGV2KTsKKwkJLyoKKwkJICogVGhpcyBpcyBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIGV4aXN0aW5nIGNvZGUgd2l0aCBsZWdhY3kgUE0KKwkJICogc3VwcG9ydC4KKwkJICovCisJCXBjaV9wbV9zZXRfdW5rbm93bl9zdGF0ZShwY2lfZGV2KTsKIAl9CisKKwlwY2lfZml4dXBfZGV2aWNlKHBjaV9maXh1cF9zdXNwZW5kLCBwY2lfZGV2KTsKKwogCXJldHVybiBpOwogfQogCkBAIC0zODEsMzIgKzM4NCwxMzAgQEAKIAlyZXR1cm4gaTsKIH0KIAotc3RhdGljIGludCBwY2lfbGVnYWN5X3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0JaW50IGVycm9yOwotCXN0cnVjdCBwY2lfZGV2ICogcGNpX2RldiA9IHRvX3BjaV9kZXYoZGV2KTsKLQlzdHJ1Y3QgcGNpX2RyaXZlciAqIGRydiA9IHBjaV9kZXYtPmRyaXZlcjsKLQotCWlmIChkcnYgJiYgZHJ2LT5yZXN1bWUpIHsKLQkJZXJyb3IgPSBkcnYtPnJlc3VtZShwY2lfZGV2KTsKLQl9IGVsc2UgewotCQlwY2lfZGVmYXVsdF9wbV9yZXN1bWVfZWFybHkocGNpX2Rldik7Ci0JCWVycm9yID0gcGNpX2RlZmF1bHRfcG1fcmVzdW1lX2xhdGUocGNpX2Rldik7Ci0JfQotCXJldHVybiBlcnJvcjsKLX0KLQogc3RhdGljIGludCBwY2lfbGVnYWN5X3Jlc3VtZV9lYXJseShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJaW50IGVycm9yID0gMDsKIAlzdHJ1Y3QgcGNpX2RldiAqIHBjaV9kZXYgPSB0b19wY2lfZGV2KGRldik7CiAJc3RydWN0IHBjaV9kcml2ZXIgKiBkcnYgPSBwY2lfZGV2LT5kcml2ZXI7CiAKKwlwY2lfZml4dXBfZGV2aWNlKHBjaV9maXh1cF9yZXN1bWVfZWFybHksIHBjaV9kZXYpOworCiAJaWYgKGRydiAmJiBkcnYtPnJlc3VtZV9lYXJseSkKIAkJZXJyb3IgPSBkcnYtPnJlc3VtZV9lYXJseShwY2lfZGV2KTsKIAlyZXR1cm4gZXJyb3I7CiB9CiAKK3N0YXRpYyBpbnQgcGNpX2xlZ2FjeV9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQoreworCWludCBlcnJvcjsKKwlzdHJ1Y3QgcGNpX2RldiAqIHBjaV9kZXYgPSB0b19wY2lfZGV2KGRldik7CisJc3RydWN0IHBjaV9kcml2ZXIgKiBkcnYgPSBwY2lfZGV2LT5kcml2ZXI7CisKKwlwY2lfZml4dXBfZGV2aWNlKHBjaV9maXh1cF9yZXN1bWUsIHBjaV9kZXYpOworCisJaWYgKGRydiAmJiBkcnYtPnJlc3VtZSkgeworCQllcnJvciA9IGRydi0+cmVzdW1lKHBjaV9kZXYpOworCX0gZWxzZSB7CisJCS8qIHJlc3RvcmUgdGhlIFBDSSBjb25maWcgc3BhY2UgKi8KKwkJcGNpX3Jlc3RvcmVfc3RhdGUocGNpX2Rldik7CisJCWVycm9yID0gcGNpX3BtX3JlZW5hYmxlX2RldmljZShwY2lfZGV2KTsKKwl9CisJcmV0dXJuIGVycm9yOworfQorCisvKiBBdXhpbGlhcnkgZnVuY3Rpb25zIHVzZWQgYnkgdGhlIG5ldyBwb3dlciBtYW5hZ2VtZW50IGZyYW1ld29yayAqLworCitzdGF0aWMgaW50IHBjaV9yZXN0b3JlX3N0YW5kYXJkX2NvbmZpZyhzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldikKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqcGFyZW50ID0gcGNpX2Rldi0+YnVzLT5zZWxmOworCWludCBlcnJvciA9IDA7CisKKwkvKiBDaGVjayBpZiB0aGUgZGV2aWNlJ3MgYnVzIGlzIG9wZXJhdGlvbmFsICovCisJaWYgKCFwYXJlbnQgfHwgcGFyZW50LT5jdXJyZW50X3N0YXRlID09IFBDSV9EMCkgeworCQlwY2lfcmVzdG9yZV9zdGF0ZShwY2lfZGV2KTsKKwkJcGNpX3VwZGF0ZV9jdXJyZW50X3N0YXRlKHBjaV9kZXYsIFBDSV9EMCk7CisJfSBlbHNlIHsKKwkJZGV2X3dhcm4oJnBjaV9kZXYtPmRldiwgInVuYWJsZSB0byByZXN0b3JlIGNvbmZpZywgIgorCQkJImJyaWRnZSAlcyBpbiBsb3cgcG93ZXIgc3RhdGUgRCVkXG4iLCBwY2lfbmFtZShwYXJlbnQpLAorCQkJcGFyZW50LT5jdXJyZW50X3N0YXRlKTsKKwkJcGNpX2Rldi0+Y3VycmVudF9zdGF0ZSA9IFBDSV9VTktOT1dOOworCQllcnJvciA9IC1FQUdBSU47CisJfQorCisJcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgYm9vbCBwY2lfaXNfYnJpZGdlKHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2KQoreworCXJldHVybiAhIShwY2lfZGV2LT5zdWJvcmRpbmF0ZSk7Cit9CisKK3N0YXRpYyB2b2lkIHBjaV9wbV9kZWZhdWx0X3Jlc3VtZV9ub2lycShzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldikKK3sKKwlpZiAocGNpX3Jlc3RvcmVfc3RhbmRhcmRfY29uZmlnKHBjaV9kZXYpKQorCQlwY2lfZml4dXBfZGV2aWNlKHBjaV9maXh1cF9yZXN1bWVfZWFybHksIHBjaV9kZXYpOworfQorCitzdGF0aWMgaW50IHBjaV9wbV9kZWZhdWx0X3Jlc3VtZShzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldikKK3sKKwkvKgorCSAqIHBjaV9yZXN0b3JlX3N0YW5kYXJkX2NvbmZpZygpIHNob3VsZCBoYXZlIGJlZW4gY2FsbGVkIG9uY2UgYWxyZWFkeSwKKwkgKiBidXQgaXQgd291bGQgaGF2ZSBmYWlsZWQgaWYgdGhlIGRldmljZSdzIHBhcmVudCBicmlkZ2UgaGFkIG5vdCBiZWVuCisJICogaW4gcG93ZXIgc3RhdGUgRDAgYXQgdGhhdCB0aW1lLiAgQ2hlY2sgaXQgYW5kIHRyeSBhZ2FpbiBpZiBuZWNlc3NhcnkuCisJICovCisJaWYgKHBjaV9kZXYtPmN1cnJlbnRfc3RhdGUgPT0gUENJX1VOS05PV04pIHsKKwkJaW50IGVycm9yID0gcGNpX3Jlc3RvcmVfc3RhbmRhcmRfY29uZmlnKHBjaV9kZXYpOworCQlpZiAoZXJyb3IpCisJCQlyZXR1cm4gZXJyb3I7CisJfQorCisJcGNpX2ZpeHVwX2RldmljZShwY2lfZml4dXBfcmVzdW1lLCBwY2lfZGV2KTsKKworCWlmICghcGNpX2lzX2JyaWRnZShwY2lfZGV2KSkKKwkJcGNpX2VuYWJsZV93YWtlKHBjaV9kZXYsIFBDSV9EMCwgZmFsc2UpOworCisJcmV0dXJuIHBjaV9wbV9yZWVuYWJsZV9kZXZpY2UocGNpX2Rldik7Cit9CisKK3N0YXRpYyB2b2lkIHBjaV9wbV9kZWZhdWx0X3N1c3BlbmRfZ2VuZXJpYyhzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldikKK3sKKwkvKiBJZiBkZXZpY2UgaXMgZW5hYmxlZCBhdCB0aGlzIHBvaW50LCBkaXNhYmxlIGl0ICovCisJcGNpX2Rpc2FibGVfZW5hYmxlZF9kZXZpY2UocGNpX2Rldik7CisJLyoKKwkgKiBTYXZlIHN0YXRlIHdpdGggaW50ZXJydXB0cyBlbmFibGVkLCBiZWNhdXNlIGluIHByaW5jaXBsZSB0aGUgYnVzIHRoZQorCSAqIGRldmljZSBpcyBvbiBtYXkgYmUgcHV0IGludG8gYSBsb3cgcG93ZXIgc3RhdGUgYWZ0ZXIgdGhpcyBjb2RlIHJ1bnMuCisJICovCisJcGNpX3NhdmVfc3RhdGUocGNpX2Rldik7Cit9CisKK3N0YXRpYyB2b2lkIHBjaV9wbV9kZWZhdWx0X3N1c3BlbmQoc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYpCit7CisJcGNpX3BtX2RlZmF1bHRfc3VzcGVuZF9nZW5lcmljKHBjaV9kZXYpOworCisJaWYgKCFwY2lfaXNfYnJpZGdlKHBjaV9kZXYpKQorCQlwY2lfcHJlcGFyZV90b19zbGVlcChwY2lfZGV2KTsKKworCXBjaV9maXh1cF9kZXZpY2UocGNpX2ZpeHVwX3N1c3BlbmQsIHBjaV9kZXYpOworfQorCitzdGF0aWMgYm9vbCBwY2lfaGFzX2xlZ2FjeV9wbV9zdXBwb3J0KHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2KQoreworCXN0cnVjdCBwY2lfZHJpdmVyICpkcnYgPSBwY2lfZGV2LT5kcml2ZXI7CisJYm9vbCByZXQgPSBkcnYgJiYgKGRydi0+c3VzcGVuZCB8fCBkcnYtPnN1c3BlbmRfbGF0ZSB8fCBkcnYtPnJlc3VtZQorCQl8fCBkcnYtPnJlc3VtZV9lYXJseSk7CisKKwkvKgorCSAqIExlZ2FjeSBQTSBzdXBwb3J0IGlzIHVzZWQgYnkgZGVmYXVsdCwgc28gd2FybiBpZiB0aGUgbmV3IGZyYW1ld29yayBpcworCSAqIHN1cHBvcnRlZCBhcyB3ZWxsLiAgRHJpdmVycyBhcmUgc3VwcG9zZWQgdG8gc3VwcG9ydCBlaXRoZXIgdGhlCisJICogZm9ybWVyLCBvciB0aGUgbGF0dGVyLCBidXQgbm90IGJvdGggYXQgdGhlIHNhbWUgdGltZS4KKwkgKi8KKwlXQVJOX09OKHJldCAmJiBkcnYtPmRyaXZlci5wbSk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKiBOZXcgcG93ZXIgbWFuYWdlbWVudCBmcmFtZXdvcmsgKi8KKwogc3RhdGljIGludCBwY2lfcG1fcHJlcGFyZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGRldmljZV9kcml2ZXIgKmRydiA9IGRldi0+ZHJpdmVyOwpAQCAtNDM0LDE1ICs1MzUsMTYgQEAKIAlzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2ID0gZGV2LT5kcml2ZXI7CiAJaW50IGVycm9yID0gMDsKIAotCWlmIChkcnYgJiYgZHJ2LT5wbSkgewotCQlpZiAoZHJ2LT5wbS0+c3VzcGVuZCkgewotCQkJZXJyb3IgPSBkcnYtPnBtLT5zdXNwZW5kKGRldik7Ci0JCQlzdXNwZW5kX3JlcG9ydF9yZXN1bHQoZHJ2LT5wbS0+c3VzcGVuZCwgZXJyb3IpOwotCQl9Ci0JfSBlbHNlIGlmIChwY2lfaGFzX2xlZ2FjeV9wbV9zdXBwb3J0KHBjaV9kZXYpKSB7Ci0JCWVycm9yID0gcGNpX2xlZ2FjeV9zdXNwZW5kKGRldiwgUE1TR19TVVNQRU5EKTsKKwlpZiAocGNpX2hhc19sZWdhY3lfcG1fc3VwcG9ydChwY2lfZGV2KSkKKwkJcmV0dXJuIHBjaV9sZWdhY3lfc3VzcGVuZChkZXYsIFBNU0dfU1VTUEVORCk7CisKKwlpZiAoZHJ2ICYmIGRydi0+cG0gJiYgZHJ2LT5wbS0+c3VzcGVuZCkgeworCQllcnJvciA9IGRydi0+cG0tPnN1c3BlbmQoZGV2KTsKKwkJc3VzcGVuZF9yZXBvcnRfcmVzdWx0KGRydi0+cG0tPnN1c3BlbmQsIGVycm9yKTsKIAl9Ci0JcGNpX2ZpeHVwX2RldmljZShwY2lfZml4dXBfc3VzcGVuZCwgcGNpX2Rldik7CisKKwlpZiAoIWVycm9yKQorCQlwY2lfcG1fZGVmYXVsdF9zdXNwZW5kKHBjaV9kZXYpOwogCiAJcmV0dXJuIGVycm9yOwogfQpAQCAtNDUzLDM2ICs1NTUsMTYgQEAKIAlzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2ID0gZGV2LT5kcml2ZXI7CiAJaW50IGVycm9yID0gMDsKIAotCWlmIChkcnYgJiYgZHJ2LT5wbSkgewotCQlpZiAoZHJ2LT5wbS0+c3VzcGVuZF9ub2lycSkgewotCQkJZXJyb3IgPSBkcnYtPnBtLT5zdXNwZW5kX25vaXJxKGRldik7Ci0JCQlzdXNwZW5kX3JlcG9ydF9yZXN1bHQoZHJ2LT5wbS0+c3VzcGVuZF9ub2lycSwgZXJyb3IpOwotCQl9Ci0JfSBlbHNlIGlmIChwY2lfaGFzX2xlZ2FjeV9wbV9zdXBwb3J0KHBjaV9kZXYpKSB7Ci0JCWVycm9yID0gcGNpX2xlZ2FjeV9zdXNwZW5kX2xhdGUoZGV2LCBQTVNHX1NVU1BFTkQpOwotCX0gZWxzZSB7Ci0JCXBjaV9kZWZhdWx0X3BtX3N1c3BlbmQocGNpX2Rldik7CisJaWYgKHBjaV9oYXNfbGVnYWN5X3BtX3N1cHBvcnQocGNpX2RldikpCisJCXJldHVybiBwY2lfbGVnYWN5X3N1c3BlbmRfbGF0ZShkZXYsIFBNU0dfU1VTUEVORCk7CisKKwlpZiAoZHJ2ICYmIGRydi0+cG0gJiYgZHJ2LT5wbS0+c3VzcGVuZF9ub2lycSkgeworCQllcnJvciA9IGRydi0+cG0tPnN1c3BlbmRfbm9pcnEoZGV2KTsKKwkJc3VzcGVuZF9yZXBvcnRfcmVzdWx0KGRydi0+cG0tPnN1c3BlbmRfbm9pcnEsIGVycm9yKTsKIAl9CiAKLQlyZXR1cm4gZXJyb3I7Ci19Ci0KLXN0YXRpYyBpbnQgcGNpX3BtX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYgPSB0b19wY2lfZGV2KGRldik7Ci0Jc3RydWN0IGRldmljZV9kcml2ZXIgKmRydiA9IGRldi0+ZHJpdmVyOwotCWludCBlcnJvciA9IDA7Ci0KLQlwY2lfZml4dXBfZGV2aWNlKHBjaV9maXh1cF9yZXN1bWUsIHBjaV9kZXYpOwotCi0JaWYgKGRydiAmJiBkcnYtPnBtKSB7Ci0JCWlmIChkcnYtPnBtLT5yZXN1bWUpCi0JCQllcnJvciA9IGRydi0+cG0tPnJlc3VtZShkZXYpOwotCX0gZWxzZSBpZiAocGNpX2hhc19sZWdhY3lfcG1fc3VwcG9ydChwY2lfZGV2KSkgewotCQllcnJvciA9IHBjaV9sZWdhY3lfcmVzdW1lKGRldik7Ci0JfSBlbHNlIHsKLQkJZXJyb3IgPSBwY2lfZGVmYXVsdF9wbV9yZXN1bWVfbGF0ZShwY2lfZGV2KTsKLQl9CisJaWYgKCFlcnJvcikKKwkJcGNpX3BtX3NldF91bmtub3duX3N0YXRlKHBjaV9kZXYpOwogCiAJcmV0dXJuIGVycm9yOwogfQpAQCAtNDkzLDE2ICs1NzUsMzAgQEAKIAlzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2ID0gZGV2LT5kcml2ZXI7CiAJaW50IGVycm9yID0gMDsKIAotCXBjaV9maXh1cF9kZXZpY2UocGNpX2ZpeHVwX3Jlc3VtZV9lYXJseSwgdG9fcGNpX2RldihkZXYpKTsKKwlpZiAocGNpX2hhc19sZWdhY3lfcG1fc3VwcG9ydChwY2lfZGV2KSkKKwkJcmV0dXJuIHBjaV9sZWdhY3lfcmVzdW1lX2Vhcmx5KGRldik7CiAKLQlpZiAoZHJ2ICYmIGRydi0+cG0pIHsKLQkJaWYgKGRydi0+cG0tPnJlc3VtZV9ub2lycSkKLQkJCWVycm9yID0gZHJ2LT5wbS0+cmVzdW1lX25vaXJxKGRldik7Ci0JfSBlbHNlIGlmIChwY2lfaGFzX2xlZ2FjeV9wbV9zdXBwb3J0KHBjaV9kZXYpKSB7Ci0JCWVycm9yID0gcGNpX2xlZ2FjeV9yZXN1bWVfZWFybHkoZGV2KTsKLQl9IGVsc2UgewotCQlwY2lfZGVmYXVsdF9wbV9yZXN1bWVfZWFybHkocGNpX2Rldik7Ci0JfQorCXBjaV9wbV9kZWZhdWx0X3Jlc3VtZV9ub2lycShwY2lfZGV2KTsKKworCWlmIChkcnYgJiYgZHJ2LT5wbSAmJiBkcnYtPnBtLT5yZXN1bWVfbm9pcnEpCisJCWVycm9yID0gZHJ2LT5wbS0+cmVzdW1lX25vaXJxKGRldik7CisKKwlyZXR1cm4gZXJyb3I7Cit9CisKK3N0YXRpYyBpbnQgcGNpX3BtX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYgPSB0b19wY2lfZGV2KGRldik7CisJc3RydWN0IGRldmljZV9kcml2ZXIgKmRydiA9IGRldi0+ZHJpdmVyOworCWludCBlcnJvciA9IDA7CisKKwlpZiAocGNpX2hhc19sZWdhY3lfcG1fc3VwcG9ydChwY2lfZGV2KSkKKwkJcmV0dXJuIHBjaV9sZWdhY3lfcmVzdW1lKGRldik7CisKKwllcnJvciA9IHBjaV9wbV9kZWZhdWx0X3Jlc3VtZShwY2lfZGV2KTsKKworCWlmICghZXJyb3IgJiYgZHJ2ICYmIGRydi0+cG0gJiYgZHJ2LT5wbS0+cmVzdW1lKQorCQllcnJvciA9IGRydi0+cG0tPnJlc3VtZShkZXYpOwogCiAJcmV0dXJuIGVycm9yOwogfQpAQCAtNTI0LDE2ICs2MjAsMTcgQEAKIAlzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2ID0gZGV2LT5kcml2ZXI7CiAJaW50IGVycm9yID0gMDsKIAotCWlmIChkcnYgJiYgZHJ2LT5wbSkgewotCQlpZiAoZHJ2LT5wbS0+ZnJlZXplKSB7Ci0JCQllcnJvciA9IGRydi0+cG0tPmZyZWV6ZShkZXYpOwotCQkJc3VzcGVuZF9yZXBvcnRfcmVzdWx0KGRydi0+cG0tPmZyZWV6ZSwgZXJyb3IpOwotCQl9Ci0JfSBlbHNlIGlmIChwY2lfaGFzX2xlZ2FjeV9wbV9zdXBwb3J0KHBjaV9kZXYpKSB7Ci0JCWVycm9yID0gcGNpX2xlZ2FjeV9zdXNwZW5kKGRldiwgUE1TR19GUkVFWkUpOwotCQlwY2lfZml4dXBfZGV2aWNlKHBjaV9maXh1cF9zdXNwZW5kLCBwY2lfZGV2KTsKKwlpZiAocGNpX2hhc19sZWdhY3lfcG1fc3VwcG9ydChwY2lfZGV2KSkKKwkJcmV0dXJuIHBjaV9sZWdhY3lfc3VzcGVuZChkZXYsIFBNU0dfRlJFRVpFKTsKKworCWlmIChkcnYgJiYgZHJ2LT5wbSAmJiBkcnYtPnBtLT5mcmVlemUpIHsKKwkJZXJyb3IgPSBkcnYtPnBtLT5mcmVlemUoZGV2KTsKKwkJc3VzcGVuZF9yZXBvcnRfcmVzdWx0KGRydi0+cG0tPmZyZWV6ZSwgZXJyb3IpOwogCX0KIAorCWlmICghZXJyb3IpCisJCXBjaV9wbV9kZWZhdWx0X3N1c3BlbmRfZ2VuZXJpYyhwY2lfZGV2KTsKKwogCXJldHVybiBlcnJvcjsKIH0KIApAQCAtNTQzLDMzICs2NDAsMTYgQEAKIAlzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2ID0gZGV2LT5kcml2ZXI7CiAJaW50IGVycm9yID0gMDsKIAotCWlmIChkcnYgJiYgZHJ2LT5wbSkgewotCQlpZiAoZHJ2LT5wbS0+ZnJlZXplX25vaXJxKSB7Ci0JCQllcnJvciA9IGRydi0+cG0tPmZyZWV6ZV9ub2lycShkZXYpOwotCQkJc3VzcGVuZF9yZXBvcnRfcmVzdWx0KGRydi0+cG0tPmZyZWV6ZV9ub2lycSwgZXJyb3IpOwotCQl9Ci0JfSBlbHNlIGlmIChwY2lfaGFzX2xlZ2FjeV9wbV9zdXBwb3J0KHBjaV9kZXYpKSB7Ci0JCWVycm9yID0gcGNpX2xlZ2FjeV9zdXNwZW5kX2xhdGUoZGV2LCBQTVNHX0ZSRUVaRSk7Ci0JfSBlbHNlIHsKLQkJcGNpX2RlZmF1bHRfcG1fc3VzcGVuZChwY2lfZGV2KTsKKwlpZiAocGNpX2hhc19sZWdhY3lfcG1fc3VwcG9ydChwY2lfZGV2KSkKKwkJcmV0dXJuIHBjaV9sZWdhY3lfc3VzcGVuZF9sYXRlKGRldiwgUE1TR19GUkVFWkUpOworCisJaWYgKGRydiAmJiBkcnYtPnBtICYmIGRydi0+cG0tPmZyZWV6ZV9ub2lycSkgeworCQllcnJvciA9IGRydi0+cG0tPmZyZWV6ZV9ub2lycShkZXYpOworCQlzdXNwZW5kX3JlcG9ydF9yZXN1bHQoZHJ2LT5wbS0+ZnJlZXplX25vaXJxLCBlcnJvcik7CiAJfQogCi0JcmV0dXJuIGVycm9yOwotfQotCi1zdGF0aWMgaW50IHBjaV9wbV90aGF3KHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldiA9IHRvX3BjaV9kZXYoZGV2KTsKLQlzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2ID0gZGV2LT5kcml2ZXI7Ci0JaW50IGVycm9yID0gMDsKLQotCWlmIChkcnYgJiYgZHJ2LT5wbSkgewotCQlpZiAoZHJ2LT5wbS0+dGhhdykKLQkJCWVycm9yID0gIGRydi0+cG0tPnRoYXcoZGV2KTsKLQl9IGVsc2UgaWYgKHBjaV9oYXNfbGVnYWN5X3BtX3N1cHBvcnQocGNpX2RldikpIHsKLQkJcGNpX2ZpeHVwX2RldmljZShwY2lfZml4dXBfcmVzdW1lLCBwY2lfZGV2KTsKLQkJZXJyb3IgPSBwY2lfbGVnYWN5X3Jlc3VtZShkZXYpOwotCX0KKwlpZiAoIWVycm9yKQorCQlwY2lfcG1fc2V0X3Vua25vd25fc3RhdGUocGNpX2Rldik7CiAKIAlyZXR1cm4gZXJyb3I7CiB9CkBAIC01ODAsMTMgKzY2MCwzMCBAQAogCXN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcnYgPSBkZXYtPmRyaXZlcjsKIAlpbnQgZXJyb3IgPSAwOwogCi0JaWYgKGRydiAmJiBkcnYtPnBtKSB7Ci0JCWlmIChkcnYtPnBtLT50aGF3X25vaXJxKQotCQkJZXJyb3IgPSBkcnYtPnBtLT50aGF3X25vaXJxKGRldik7Ci0JfSBlbHNlIGlmIChwY2lfaGFzX2xlZ2FjeV9wbV9zdXBwb3J0KHBjaV9kZXYpKSB7Ci0JCXBjaV9maXh1cF9kZXZpY2UocGNpX2ZpeHVwX3Jlc3VtZV9lYXJseSwgdG9fcGNpX2RldihkZXYpKTsKLQkJZXJyb3IgPSBwY2lfbGVnYWN5X3Jlc3VtZV9lYXJseShkZXYpOwotCX0KKwlpZiAocGNpX2hhc19sZWdhY3lfcG1fc3VwcG9ydChwY2lfZGV2KSkKKwkJcmV0dXJuIHBjaV9sZWdhY3lfcmVzdW1lX2Vhcmx5KGRldik7CisKKwlwY2lfdXBkYXRlX2N1cnJlbnRfc3RhdGUocGNpX2RldiwgUENJX0QwKTsKKworCWlmIChkcnYgJiYgZHJ2LT5wbSAmJiBkcnYtPnBtLT50aGF3X25vaXJxKQorCQllcnJvciA9IGRydi0+cG0tPnRoYXdfbm9pcnEoZGV2KTsKKworCXJldHVybiBlcnJvcjsKK30KKworc3RhdGljIGludCBwY2lfcG1fdGhhdyhzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYgPSB0b19wY2lfZGV2KGRldik7CisJc3RydWN0IGRldmljZV9kcml2ZXIgKmRydiA9IGRldi0+ZHJpdmVyOworCWludCBlcnJvciA9IDA7CisKKwlpZiAocGNpX2hhc19sZWdhY3lfcG1fc3VwcG9ydChwY2lfZGV2KSkKKwkJcmV0dXJuIHBjaV9sZWdhY3lfcmVzdW1lKGRldik7CisKKwlwY2lfcG1fcmVlbmFibGVfZGV2aWNlKHBjaV9kZXYpOworCisJaWYgKGRydiAmJiBkcnYtPnBtICYmIGRydi0+cG0tPnRoYXcpCisJCWVycm9yID0gIGRydi0+cG0tPnRoYXcoZGV2KTsKIAogCXJldHVybiBlcnJvcjsKIH0KQEAgLTU5NywxNyArNjk0LDE3IEBACiAJc3RydWN0IGRldmljZV9kcml2ZXIgKmRydiA9IGRldi0+ZHJpdmVyOwogCWludCBlcnJvciA9IDA7CiAKLQlwY2lfZml4dXBfZGV2aWNlKHBjaV9maXh1cF9zdXNwZW5kLCBwY2lfZGV2KTsKKwlpZiAocGNpX2hhc19sZWdhY3lfcG1fc3VwcG9ydChwY2lfZGV2KSkKKwkJcmV0dXJuIHBjaV9sZWdhY3lfc3VzcGVuZChkZXYsIFBNU0dfSElCRVJOQVRFKTsKIAotCWlmIChkcnYgJiYgZHJ2LT5wbSkgewotCQlpZiAoZHJ2LT5wbS0+cG93ZXJvZmYpIHsKLQkJCWVycm9yID0gZHJ2LT5wbS0+cG93ZXJvZmYoZGV2KTsKLQkJCXN1c3BlbmRfcmVwb3J0X3Jlc3VsdChkcnYtPnBtLT5wb3dlcm9mZiwgZXJyb3IpOwotCQl9Ci0JfSBlbHNlIGlmIChwY2lfaGFzX2xlZ2FjeV9wbV9zdXBwb3J0KHBjaV9kZXYpKSB7Ci0JCWVycm9yID0gcGNpX2xlZ2FjeV9zdXNwZW5kKGRldiwgUE1TR19ISUJFUk5BVEUpOworCWlmIChkcnYgJiYgZHJ2LT5wbSAmJiBkcnYtPnBtLT5wb3dlcm9mZikgeworCQllcnJvciA9IGRydi0+cG0tPnBvd2Vyb2ZmKGRldik7CisJCXN1c3BlbmRfcmVwb3J0X3Jlc3VsdChkcnYtPnBtLT5wb3dlcm9mZiwgZXJyb3IpOwogCX0KIAorCWlmICghZXJyb3IpCisJCXBjaV9wbV9kZWZhdWx0X3N1c3BlbmQocGNpX2Rldik7CisKIAlyZXR1cm4gZXJyb3I7CiB9CiAKQEAgLTYxNiw1NCArNzEzLDQ3IEBACiAJc3RydWN0IGRldmljZV9kcml2ZXIgKmRydiA9IGRldi0+ZHJpdmVyOwogCWludCBlcnJvciA9IDA7CiAKLQlpZiAoZHJ2ICYmIGRydi0+cG0pIHsKLQkJaWYgKGRydi0+cG0tPnBvd2Vyb2ZmX25vaXJxKSB7Ci0JCQllcnJvciA9IGRydi0+cG0tPnBvd2Vyb2ZmX25vaXJxKGRldik7Ci0JCQlzdXNwZW5kX3JlcG9ydF9yZXN1bHQoZHJ2LT5wbS0+cG93ZXJvZmZfbm9pcnEsIGVycm9yKTsKLQkJfQotCX0gZWxzZSBpZiAocGNpX2hhc19sZWdhY3lfcG1fc3VwcG9ydCh0b19wY2lfZGV2KGRldikpKSB7Ci0JCWVycm9yID0gcGNpX2xlZ2FjeV9zdXNwZW5kX2xhdGUoZGV2LCBQTVNHX0hJQkVSTkFURSk7CisJaWYgKHBjaV9oYXNfbGVnYWN5X3BtX3N1cHBvcnQodG9fcGNpX2RldihkZXYpKSkKKwkJcmV0dXJuIHBjaV9sZWdhY3lfc3VzcGVuZF9sYXRlKGRldiwgUE1TR19ISUJFUk5BVEUpOworCisJaWYgKGRydiAmJiBkcnYtPnBtICYmIGRydi0+cG0tPnBvd2Vyb2ZmX25vaXJxKSB7CisJCWVycm9yID0gZHJ2LT5wbS0+cG93ZXJvZmZfbm9pcnEoZGV2KTsKKwkJc3VzcGVuZF9yZXBvcnRfcmVzdWx0KGRydi0+cG0tPnBvd2Vyb2ZmX25vaXJxLCBlcnJvcik7CiAJfQogCiAJcmV0dXJuIGVycm9yOwogfQogCi1zdGF0aWMgaW50IHBjaV9wbV9yZXN0b3JlKHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldiA9IHRvX3BjaV9kZXYoZGV2KTsKLQlzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2ID0gZGV2LT5kcml2ZXI7Ci0JaW50IGVycm9yID0gMDsKLQotCWlmIChkcnYgJiYgZHJ2LT5wbSkgewotCQlpZiAoZHJ2LT5wbS0+cmVzdG9yZSkKLQkJCWVycm9yID0gZHJ2LT5wbS0+cmVzdG9yZShkZXYpOwotCX0gZWxzZSBpZiAocGNpX2hhc19sZWdhY3lfcG1fc3VwcG9ydChwY2lfZGV2KSkgewotCQllcnJvciA9IHBjaV9sZWdhY3lfcmVzdW1lKGRldik7Ci0JfSBlbHNlIHsKLQkJZXJyb3IgPSBwY2lfZGVmYXVsdF9wbV9yZXN1bWVfbGF0ZShwY2lfZGV2KTsKLQl9Ci0JcGNpX2ZpeHVwX2RldmljZShwY2lfZml4dXBfcmVzdW1lLCBwY2lfZGV2KTsKLQotCXJldHVybiBlcnJvcjsKLX0KLQogc3RhdGljIGludCBwY2lfcG1fcmVzdG9yZV9ub2lycShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYgPSB0b19wY2lfZGV2KGRldik7CiAJc3RydWN0IGRldmljZV9kcml2ZXIgKmRydiA9IGRldi0+ZHJpdmVyOwogCWludCBlcnJvciA9IDA7CiAKLQlwY2lfZml4dXBfZGV2aWNlKHBjaV9maXh1cF9yZXN1bWUsIHBjaV9kZXYpOworCWlmIChwY2lfaGFzX2xlZ2FjeV9wbV9zdXBwb3J0KHBjaV9kZXYpKQorCQlyZXR1cm4gcGNpX2xlZ2FjeV9yZXN1bWVfZWFybHkoZGV2KTsKIAotCWlmIChkcnYgJiYgZHJ2LT5wbSkgewotCQlpZiAoZHJ2LT5wbS0+cmVzdG9yZV9ub2lycSkKLQkJCWVycm9yID0gZHJ2LT5wbS0+cmVzdG9yZV9ub2lycShkZXYpOwotCX0gZWxzZSBpZiAocGNpX2hhc19sZWdhY3lfcG1fc3VwcG9ydChwY2lfZGV2KSkgewotCQllcnJvciA9IHBjaV9sZWdhY3lfcmVzdW1lX2Vhcmx5KGRldik7Ci0JfSBlbHNlIHsKLQkJcGNpX2RlZmF1bHRfcG1fcmVzdW1lX2Vhcmx5KHBjaV9kZXYpOwotCX0KLQlwY2lfZml4dXBfZGV2aWNlKHBjaV9maXh1cF9yZXN1bWVfZWFybHksIHBjaV9kZXYpOworCXBjaV9wbV9kZWZhdWx0X3Jlc3VtZV9ub2lycShwY2lfZGV2KTsKKworCWlmIChkcnYgJiYgZHJ2LT5wbSAmJiBkcnYtPnBtLT5yZXN0b3JlX25vaXJxKQorCQllcnJvciA9IGRydi0+cG0tPnJlc3RvcmVfbm9pcnEoZGV2KTsKKworCXJldHVybiBlcnJvcjsKK30KKworc3RhdGljIGludCBwY2lfcG1fcmVzdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYgPSB0b19wY2lfZGV2KGRldik7CisJc3RydWN0IGRldmljZV9kcml2ZXIgKmRydiA9IGRldi0+ZHJpdmVyOworCWludCBlcnJvciA9IDA7CisKKwlpZiAocGNpX2hhc19sZWdhY3lfcG1fc3VwcG9ydChwY2lfZGV2KSkKKwkJcmV0dXJuIHBjaV9sZWdhY3lfcmVzdW1lKGRldik7CisKKwllcnJvciA9IHBjaV9wbV9kZWZhdWx0X3Jlc3VtZShwY2lfZGV2KTsKKworCWlmICghZXJyb3IgJiYgZHJ2ICYmIGRydi0+cG0gJiYgZHJ2LT5wbS0+cmVzdG9yZSkKKwkJZXJyb3IgPSBkcnYtPnBtLT5yZXN0b3JlKGRldik7CiAKIAlyZXR1cm4gZXJyb3I7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9wY2ktc3R1Yi5jIGIvZHJpdmVycy9wY2kvcGNpLXN0dWIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NGZiZWMwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9wY2kvcGNpLXN0dWIuYwpAQCAtMCwwICsxLDQ3IEBACisvKiBwY2ktc3R1YiAtIHNpbXBsZSBzdHViIGRyaXZlciB0byByZXNlcnZlIGEgcGNpIGRldmljZQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBSZWQgSGF0LCBJbmMuCisgKiBBdXRob3I6CisgKiAJQ2hyaXMgV3JpZ2h0CisgKgorICogVGhpcyB3b3JrIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTCwgdmVyc2lvbiAyLgorICoKKyAqIFVzYWdlIGlzIHNpbXBsZSwgYWxsb2NhdGUgYSBuZXcgaWQgdG8gdGhlIHN0dWIgZHJpdmVyIGFuZCBiaW5kIHRoZQorICogZGV2aWNlIHRvIGl0LiAgRm9yIGV4YW1wbGU6CisgKiAKKyAqICMgZWNobyAiODA4NiAxMGY1IiA+IC9zeXMvYnVzL3BjaS9kcml2ZXJzL3BjaS1zdHViL25ld19pZAorICogIyBlY2hvIC1uIDAwMDA6MDA6MTkuMCA+IC9zeXMvYnVzL3BjaS9kcml2ZXJzL2UxMDAwZS91bmJpbmQKKyAqICMgZWNobyAtbiAwMDAwOjAwOjE5LjAgPiAvc3lzL2J1cy9wY2kvZHJpdmVycy9wY2ktc3R1Yi9iaW5kCisgKiAjIGxzIC1sIC9zeXMvYnVzL3BjaS9kZXZpY2VzLzAwMDA6MDA6MTkuMC9kcml2ZXIKKyAqIC4uLi8wMDAwOjAwOjE5LjAvZHJpdmVyIC0+IC4uLy4uLy4uL2J1cy9wY2kvZHJpdmVycy9wY2ktc3R1YgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKworc3RhdGljIGludCBwY2lfc3R1Yl9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBzdHViX2RyaXZlciA9IHsKKwkubmFtZQkJPSAicGNpLXN0dWIiLAorCS5pZF90YWJsZQk9IE5VTEwsCS8qIG9ubHkgZHluYW1pYyBpZCdzICovCisJLnByb2JlCQk9IHBjaV9zdHViX3Byb2JlLAorfTsKKworc3RhdGljIGludCBfX2luaXQgcGNpX3N0dWJfaW5pdCh2b2lkKQoreworCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZzdHViX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBwY2lfc3R1Yl9leGl0KHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZzdHViX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KHBjaV9zdHViX2luaXQpOworbW9kdWxlX2V4aXQocGNpX3N0dWJfZXhpdCk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BVVRIT1IoIkNocmlzIFdyaWdodCA8Y2hyaXN3QHNvdXMtc29sLm9yZz4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3BjaS1zeXNmcy5jIGIvZHJpdmVycy9wY2kvcGNpLXN5c2ZzLmMKaW5kZXggYzg4NDg1OC4uZGI3ZWMxNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvcGNpLXN5c2ZzLmMKKysrIGIvZHJpdmVycy9wY2kvcGNpLXN5c2ZzLmMKQEAgLTU4LDIzICs1OCwyNCBAQAogCQkJCQkgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQogewogCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdG9fcGNpX2RldihkZXYpOwotCXNzaXplX3QgY29uc3VtZWQgPSAtRUlOVkFMOworCXVuc2lnbmVkIGxvbmcgdmFsOwogCi0JaWYgKChjb3VudCA+IDApICYmICgqYnVmID09ICcwJyB8fCAqYnVmID09ICcxJykpIHsKLQkJcGRldi0+YnJva2VuX3Bhcml0eV9zdGF0dXMgPSAqYnVmID09ICcxJyA/IDEgOiAwOwotCQljb25zdW1lZCA9IGNvdW50OwotCX0KLQlyZXR1cm4gY29uc3VtZWQ7CisJaWYgKHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMCwgJnZhbCkgPCAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXBkZXYtPmJyb2tlbl9wYXJpdHlfc3RhdHVzID0gISF2YWw7CisKKwlyZXR1cm4gY291bnQ7CiB9CiAKIHN0YXRpYyBzc2l6ZV90IGxvY2FsX2NwdXNfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQogewkJCi0JY3B1bWFza190IG1hc2s7CisJY29uc3Qgc3RydWN0IGNwdW1hc2sgKm1hc2s7CiAJaW50IGxlbjsKIAotCW1hc2sgPSBwY2lidXNfdG9fY3B1bWFzayh0b19wY2lfZGV2KGRldiktPmJ1cyk7Ci0JbGVuID0gY3B1bWFza19zY25wcmludGYoYnVmLCBQQUdFX1NJWkUtMiwgJm1hc2spOworCW1hc2sgPSBjcHVtYXNrX29mX3BjaWJ1cyh0b19wY2lfZGV2KGRldiktPmJ1cyk7CisJbGVuID0gY3B1bWFza19zY25wcmludGYoYnVmLCBQQUdFX1NJWkUtMiwgbWFzayk7CiAJYnVmW2xlbisrXSA9ICdcbic7CiAJYnVmW2xlbl0gPSAnXDAnOwogCXJldHVybiBsZW47CkBAIC04NCwxMSArODUsMTEgQEAKIHN0YXRpYyBzc2l6ZV90IGxvY2FsX2NwdWxpc3Rfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQogewotCWNwdW1hc2tfdCBtYXNrOworCWNvbnN0IHN0cnVjdCBjcHVtYXNrICptYXNrOwogCWludCBsZW47CiAKLQltYXNrID0gcGNpYnVzX3RvX2NwdW1hc2sodG9fcGNpX2RldihkZXYpLT5idXMpOwotCWxlbiA9IGNwdWxpc3Rfc2NucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLTIsICZtYXNrKTsKKwltYXNrID0gY3B1bWFza19vZl9wY2lidXModG9fcGNpX2RldihkZXYpLT5idXMpOworCWxlbiA9IGNwdWxpc3Rfc2NucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLTIsIG1hc2spOwogCWJ1ZltsZW4rK10gPSAnXG4nOwogCWJ1ZltsZW5dID0gJ1wwJzsKIAlyZXR1cm4gbGVuOwpAQCAtMTAxLDExICsxMDIsMTMgQEAKIAlzdHJ1Y3QgcGNpX2RldiAqIHBjaV9kZXYgPSB0b19wY2lfZGV2KGRldik7CiAJY2hhciAqIHN0ciA9IGJ1ZjsKIAlpbnQgaTsKLQlpbnQgbWF4ID0gNzsKKwlpbnQgbWF4OwogCXJlc291cmNlX3NpemVfdCBzdGFydCwgZW5kOwogCiAJaWYgKHBjaV9kZXYtPnN1Ym9yZGluYXRlKQogCQltYXggPSBERVZJQ0VfQ09VTlRfUkVTT1VSQ0U7CisJZWxzZQorCQltYXggPSBQQ0lfQlJJREdFX1JFU09VUkNFUzsKIAogCWZvciAoaSA9IDA7IGkgPCBtYXg7IGkrKykgewogCQlzdHJ1Y3QgcmVzb3VyY2UgKnJlcyA9ICAmcGNpX2Rldi0+cmVzb3VyY2VbaV07CkBAIC0xMzMsMTkgKzEzNiwyMyBAQAogCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsCiAJCQkJc2l6ZV90IGNvdW50KQogewotCXNzaXplX3QgcmVzdWx0ID0gLUVJTlZBTDsKIAlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHRvX3BjaV9kZXYoZGV2KTsKKwl1bnNpZ25lZCBsb25nIHZhbDsKKwlzc2l6ZV90IHJlc3VsdCA9IHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMCwgJnZhbCk7CisKKwlpZiAocmVzdWx0IDwgMCkKKwkJcmV0dXJuIHJlc3VsdDsKIAogCS8qIHRoaXMgY2FuIGNyYXNoIHRoZSBtYWNoaW5lIHdoZW4gZG9uZSBvbiB0aGUgIndyb25nIiBkZXZpY2UgKi8KIAlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCi0JCXJldHVybiBjb3VudDsKKwkJcmV0dXJuIC1FUEVSTTsKIAotCWlmICgqYnVmID09ICcwJykgeworCWlmICghdmFsKSB7CiAJCWlmIChhdG9taWNfcmVhZCgmcGRldi0+ZW5hYmxlX2NudCkgIT0gMCkKIAkJCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKIAkJZWxzZQogCQkJcmVzdWx0ID0gLUVJTzsKLQl9IGVsc2UgaWYgKCpidWYgPT0gJzEnKQorCX0gZWxzZQogCQlyZXN1bHQgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKIAogCXJldHVybiByZXN1bHQgPCAwID8gcmVzdWx0IDogY291bnQ7CkBAIC0xODUsMjUgKzE5MiwyOCBAQAogCSAgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQogewogCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdG9fcGNpX2RldihkZXYpOworCXVuc2lnbmVkIGxvbmcgdmFsOworCisJaWYgKHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMCwgJnZhbCkgPCAwKQorCQlyZXR1cm4gLUVJTlZBTDsKIAogCS8qIGJhZCB0aGluZ3MgbWF5IGhhcHBlbiBpZiB0aGUgbm9fbXNpIGZsYWcgaXMgY2hhbmdlZAogCSAqIHdoaWxlIHNvbWUgZHJpdmVycyBhcmUgbG9hZGVkICovCiAJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQotCQlyZXR1cm4gY291bnQ7CisJCXJldHVybiAtRVBFUk07CiAKKwkvKiBNYXliZSBwY2kgZGV2aWNlcyB3aXRob3V0IHN1Ym9yZGluYXRlIGJ1c3NlcyBzaG91bGRuJ3QgZXZlbiBoYXZlIHRoaXMKKwkgKiBhdHRyaWJ1dGUgaW4gdGhlIGZpcnN0IHBsYWNlPyAgKi8KIAlpZiAoIXBkZXYtPnN1Ym9yZGluYXRlKQogCQlyZXR1cm4gY291bnQ7CiAKLQlpZiAoKmJ1ZiA9PSAnMCcpIHsKLQkJcGRldi0+c3Vib3JkaW5hdGUtPmJ1c19mbGFncyB8PSBQQ0lfQlVTX0ZMQUdTX05PX01TSTsKLQkJZGV2X3dhcm4oJnBkZXYtPmRldiwgImZvcmNlZCBzdWJvcmRpbmF0ZSBidXMgdG8gbm90IHN1cHBvcnQgTVNJLCIKLQkJCSAiIGJhZCB0aGluZ3MgY291bGQgaGFwcGVuLlxuIik7Ci0JfQorCS8qIElzIHRoZSBmbGFnIGdvaW5nIHRvIGNoYW5nZSwgb3Iga2VlcCB0aGUgdmFsdWUgaXQgYWxyZWFkeSBoYWQ/ICovCisJaWYgKCEocGRldi0+c3Vib3JkaW5hdGUtPmJ1c19mbGFncyAmIFBDSV9CVVNfRkxBR1NfTk9fTVNJKSBeCisJICAgICEhdmFsKSB7CisJCXBkZXYtPnN1Ym9yZGluYXRlLT5idXNfZmxhZ3MgXj0gUENJX0JVU19GTEFHU19OT19NU0k7CiAKLQlpZiAoKmJ1ZiA9PSAnMScpIHsKLQkJcGRldi0+c3Vib3JkaW5hdGUtPmJ1c19mbGFncyAmPSB+UENJX0JVU19GTEFHU19OT19NU0k7Ci0JCWRldl93YXJuKCZwZGV2LT5kZXYsICJmb3JjZWQgc3Vib3JkaW5hdGUgYnVzIHRvIHN1cHBvcnQgTVNJLCIKLQkJCSAiIGJhZCB0aGluZ3MgY291bGQgaGFwcGVuLlxuIik7CisJCWRldl93YXJuKCZwZGV2LT5kZXYsICJmb3JjZWQgc3Vib3JkaW5hdGUgYnVzIHRvJXMgc3VwcG9ydCBNU0ksIgorCQkJICIgYmFkIHRoaW5ncyBjb3VsZCBoYXBwZW5cbiIsIHZhbCA/ICIiIDogIiBub3QiKTsKIAl9CiAKIAlyZXR1cm4gY291bnQ7CkBAIC0zNjEsNTUgKzM3MSwzMyBAQAogfQogCiBzdGF0aWMgc3NpemVfdAotcGNpX3JlYWRfdnBkKHN0cnVjdCBrb2JqZWN0ICprb2JqLCBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSAqYmluX2F0dHIsCi0JICAgICBjaGFyICpidWYsIGxvZmZfdCBvZmYsIHNpemVfdCBjb3VudCkKLXsKLQlzdHJ1Y3QgcGNpX2RldiAqZGV2ID0KLQkJdG9fcGNpX2Rldihjb250YWluZXJfb2Yoa29iaiwgc3RydWN0IGRldmljZSwga29iaikpOwotCWludCBlbmQ7Ci0JaW50IHJldDsKLQotCWlmIChvZmYgPiBiaW5fYXR0ci0+c2l6ZSkKLQkJY291bnQgPSAwOwotCWVsc2UgaWYgKGNvdW50ID4gYmluX2F0dHItPnNpemUgLSBvZmYpCi0JCWNvdW50ID0gYmluX2F0dHItPnNpemUgLSBvZmY7Ci0JZW5kID0gb2ZmICsgY291bnQ7Ci0KLQl3aGlsZSAob2ZmIDwgZW5kKSB7Ci0JCXJldCA9IGRldi0+dnBkLT5vcHMtPnJlYWQoZGV2LCBvZmYsIGVuZCAtIG9mZiwgYnVmKTsKLQkJaWYgKHJldCA8IDApCi0JCQlyZXR1cm4gcmV0OwotCQlidWYgKz0gcmV0OwotCQlvZmYgKz0gcmV0OwotCX0KLQotCXJldHVybiBjb3VudDsKLX0KLQotc3RhdGljIHNzaXplX3QKLXBjaV93cml0ZV92cGQoc3RydWN0IGtvYmplY3QgKmtvYmosIHN0cnVjdCBiaW5fYXR0cmlidXRlICpiaW5fYXR0ciwKK3JlYWRfdnBkX2F0dHIoc3RydWN0IGtvYmplY3QgKmtvYmosIHN0cnVjdCBiaW5fYXR0cmlidXRlICpiaW5fYXR0ciwKIAkgICAgICBjaGFyICpidWYsIGxvZmZfdCBvZmYsIHNpemVfdCBjb3VudCkKIHsKIAlzdHJ1Y3QgcGNpX2RldiAqZGV2ID0KIAkJdG9fcGNpX2Rldihjb250YWluZXJfb2Yoa29iaiwgc3RydWN0IGRldmljZSwga29iaikpOwotCWludCBlbmQ7Ci0JaW50IHJldDsKIAogCWlmIChvZmYgPiBiaW5fYXR0ci0+c2l6ZSkKIAkJY291bnQgPSAwOwogCWVsc2UgaWYgKGNvdW50ID4gYmluX2F0dHItPnNpemUgLSBvZmYpCiAJCWNvdW50ID0gYmluX2F0dHItPnNpemUgLSBvZmY7Ci0JZW5kID0gb2ZmICsgY291bnQ7CiAKLQl3aGlsZSAob2ZmIDwgZW5kKSB7Ci0JCXJldCA9IGRldi0+dnBkLT5vcHMtPndyaXRlKGRldiwgb2ZmLCBlbmQgLSBvZmYsIGJ1Zik7Ci0JCWlmIChyZXQgPCAwKQotCQkJcmV0dXJuIHJldDsKLQkJYnVmICs9IHJldDsKLQkJb2ZmICs9IHJldDsKLQl9CisJcmV0dXJuIHBjaV9yZWFkX3ZwZChkZXYsIG9mZiwgY291bnQsIGJ1Zik7Cit9CiAKLQlyZXR1cm4gY291bnQ7CitzdGF0aWMgc3NpemVfdAord3JpdGVfdnBkX2F0dHIoc3RydWN0IGtvYmplY3QgKmtvYmosIHN0cnVjdCBiaW5fYXR0cmlidXRlICpiaW5fYXR0ciwKKwkgICAgICAgY2hhciAqYnVmLCBsb2ZmX3Qgb2ZmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IHBjaV9kZXYgKmRldiA9CisJCXRvX3BjaV9kZXYoY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBkZXZpY2UsIGtvYmopKTsKKworCWlmIChvZmYgPiBiaW5fYXR0ci0+c2l6ZSkKKwkJY291bnQgPSAwOworCWVsc2UgaWYgKGNvdW50ID4gYmluX2F0dHItPnNpemUgLSBvZmYpCisJCWNvdW50ID0gYmluX2F0dHItPnNpemUgLSBvZmY7CisKKwlyZXR1cm4gcGNpX3dyaXRlX3ZwZChkZXYsIG9mZiwgY291bnQsIGJ1Zik7CiB9CiAKICNpZmRlZiBIQVZFX1BDSV9MRUdBQ1kKQEAgLTU2OSw3ICs1NTcsNyBAQAogCiAjaWZkZWYgSEFWRV9QQ0lfTU1BUAogCi1zdGF0aWMgaW50IHBjaV9tbWFwX2ZpdHMoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGludCByZXNubywgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCitpbnQgcGNpX21tYXBfZml0cyhzdHJ1Y3QgcGNpX2RldiAqcGRldiwgaW50IHJlc25vLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKIHsKIAl1bnNpZ25lZCBsb25nIG5yLCBzdGFydCwgc2l6ZTsKIApAQCAtNjIwLDYgKzYwOCw5IEBACiAJdm1hLT52bV9wZ29mZiArPSBzdGFydCA+PiBQQUdFX1NISUZUOwogCW1tYXBfdHlwZSA9IHJlcy0+ZmxhZ3MgJiBJT1JFU09VUkNFX01FTSA/IHBjaV9tbWFwX21lbSA6IHBjaV9tbWFwX2lvOwogCisJaWYgKHJlcy0+ZmxhZ3MgJiBJT1JFU09VUkNFX01FTSAmJiBpb21lbV9pc19leGNsdXNpdmUoc3RhcnQpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwogCXJldHVybiBwY2lfbW1hcF9wYWdlX3JhbmdlKHBkZXYsIHZtYSwgbW1hcF90eXBlLCB3cml0ZV9jb21iaW5lKTsKIH0KIApAQCAtODMyLDggKzgyMyw4IEBACiAJCWF0dHItPnNpemUgPSBkZXYtPnZwZC0+bGVuOwogCQlhdHRyLT5hdHRyLm5hbWUgPSAidnBkIjsKIAkJYXR0ci0+YXR0ci5tb2RlID0gU19JUlVTUiB8IFNfSVdVU1I7Ci0JCWF0dHItPnJlYWQgPSBwY2lfcmVhZF92cGQ7Ci0JCWF0dHItPndyaXRlID0gcGNpX3dyaXRlX3ZwZDsKKwkJYXR0ci0+cmVhZCA9IHJlYWRfdnBkX2F0dHI7CisJCWF0dHItPndyaXRlID0gd3JpdGVfdnBkX2F0dHI7CiAJCXJldHZhbCA9IHN5c2ZzX2NyZWF0ZV9iaW5fZmlsZSgmZGV2LT5kZXYua29iaiwgYXR0cik7CiAJCWlmIChyZXR2YWwpIHsKIAkJCWtmcmVlKGRldi0+dnBkLT5hdHRyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3BjaS5jIGIvZHJpdmVycy9wY2kvcGNpLmMKaW5kZXggMDYxZDFlZS4uZTQ5MWZkZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvcGNpLmMKKysrIGIvZHJpdmVycy9wY2kvcGNpLmMKQEAgLTU2LDYgKzU2LDIyIEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChwY2lfYnVzX21heF9idXNucik7CiAKKyNpZmRlZiBDT05GSUdfSEFTX0lPTUVNCit2b2lkIF9faW9tZW0gKnBjaV9pb3JlbWFwX2JhcihzdHJ1Y3QgcGNpX2RldiAqcGRldiwgaW50IGJhcikKK3sKKwkvKgorCSAqIE1ha2Ugc3VyZSB0aGUgQkFSIGlzIGFjdHVhbGx5IGEgbWVtb3J5IHJlc291cmNlLCBub3QgYW4gSU8gcmVzb3VyY2UKKwkgKi8KKwlpZiAoIShwY2lfcmVzb3VyY2VfZmxhZ3MocGRldiwgYmFyKSAmIElPUkVTT1VSQ0VfTUVNKSkgeworCQlXQVJOX09OKDEpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJcmV0dXJuIGlvcmVtYXBfbm9jYWNoZShwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgYmFyKSwKKwkJCQkgICAgIHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgYmFyKSk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChwY2lfaW9yZW1hcF9iYXIpOworI2VuZGlmCisKICNpZiAwCiAvKioKICAqIHBjaV9tYXhfYnVzbnIgLSByZXR1cm5zIG1heGltdW0gUENJIGJ1cyBudW1iZXIKQEAgLTM2MCwyNSArMzc2LDEwIEBACiBzdGF0aWMgdm9pZAogcGNpX3Jlc3RvcmVfYmFycyhzdHJ1Y3QgcGNpX2RldiAqZGV2KQogewotCWludCBpLCBudW1yZXM7CisJaW50IGk7CiAKLQlzd2l0Y2ggKGRldi0+aGRyX3R5cGUpIHsKLQljYXNlIFBDSV9IRUFERVJfVFlQRV9OT1JNQUw6Ci0JCW51bXJlcyA9IDY7Ci0JCWJyZWFrOwotCWNhc2UgUENJX0hFQURFUl9UWVBFX0JSSURHRToKLQkJbnVtcmVzID0gMjsKLQkJYnJlYWs7Ci0JY2FzZSBQQ0lfSEVBREVSX1RZUEVfQ0FSREJVUzoKLQkJbnVtcmVzID0gMTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJLyogU2hvdWxkIG5ldmVyIGdldCBoZXJlLCBidXQganVzdCBpbiBjYXNlLi4uICovCi0JCXJldHVybjsKLQl9Ci0KLQlmb3IgKGkgPSAwOyBpIDwgbnVtcmVzOyBpICsrKQotCQlwY2lfdXBkYXRlX3Jlc291cmNlKGRldiwgJmRldi0+cmVzb3VyY2VbaV0sIGkpOworCWZvciAoaSA9IDA7IGkgPCBQQ0lfQlJJREdFX1JFU09VUkNFUzsgaSsrKQorCQlwY2lfdXBkYXRlX3Jlc291cmNlKGRldiwgaSk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgcGNpX3BsYXRmb3JtX3BtX29wcyAqcGNpX3BsYXRmb3JtX3BtOwpAQCAtNTI0LDE0ICs1MjUsMTcgQEAKICAqIHBjaV91cGRhdGVfY3VycmVudF9zdGF0ZSAtIFJlYWQgUENJIHBvd2VyIHN0YXRlIG9mIGdpdmVuIGRldmljZSBmcm9tIGl0cwogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgUENJIFBNIHJlZ2lzdGVycyBhbmQgY2FjaGUgaXQKICAqIEBkZXY6IFBDSSBkZXZpY2UgdG8gaGFuZGxlLgorICogQHN0YXRlOiBTdGF0ZSB0byBjYWNoZSBpbiBjYXNlIHRoZSBkZXZpY2UgZG9lc24ndCBoYXZlIHRoZSBQTSBjYXBhYmlsaXR5CiAgKi8KLXN0YXRpYyB2b2lkIHBjaV91cGRhdGVfY3VycmVudF9zdGF0ZShzdHJ1Y3QgcGNpX2RldiAqZGV2KQordm9pZCBwY2lfdXBkYXRlX2N1cnJlbnRfc3RhdGUoc3RydWN0IHBjaV9kZXYgKmRldiwgcGNpX3Bvd2VyX3Qgc3RhdGUpCiB7CiAJaWYgKGRldi0+cG1fY2FwKSB7CiAJCXUxNiBwbWNzcjsKIAogCQlwY2lfcmVhZF9jb25maWdfd29yZChkZXYsIGRldi0+cG1fY2FwICsgUENJX1BNX0NUUkwsICZwbWNzcik7CiAJCWRldi0+Y3VycmVudF9zdGF0ZSA9IChwbWNzciAmIFBDSV9QTV9DVFJMX1NUQVRFX01BU0spOworCX0gZWxzZSB7CisJCWRldi0+Y3VycmVudF9zdGF0ZSA9IHN0YXRlOwogCX0KIH0KIApAQCAtNTc0LDcgKzU3OCw3IEBACiAJCSAqLwogCQlpbnQgcmV0ID0gcGxhdGZvcm1fcGNpX3NldF9wb3dlcl9zdGF0ZShkZXYsIFBDSV9EMCk7CiAJCWlmICghcmV0KQotCQkJcGNpX3VwZGF0ZV9jdXJyZW50X3N0YXRlKGRldik7CisJCQlwY2lfdXBkYXRlX2N1cnJlbnRfc3RhdGUoZGV2LCBQQ0lfRDApOwogCX0KIAkvKiBUaGlzIGRldmljZSBpcyBxdWlya2VkIG5vdCB0byBiZSBwdXQgaW50byBEMywgc28KIAkgICBkb24ndCBwdXQgaXQgaW4gRDMgKi8KQEAgLTU4Nyw3ICs1OTEsNyBAQAogCQkvKiBBbGxvdyB0aGUgcGxhdGZvcm0gdG8gZmluYWxpemUgdGhlIHRyYW5zaXRpb24gKi8KIAkJaW50IHJldCA9IHBsYXRmb3JtX3BjaV9zZXRfcG93ZXJfc3RhdGUoZGV2LCBzdGF0ZSk7CiAJCWlmICghcmV0KSB7Ci0JCQlwY2lfdXBkYXRlX2N1cnJlbnRfc3RhdGUoZGV2KTsKKwkJCXBjaV91cGRhdGVfY3VycmVudF9zdGF0ZShkZXYsIHN0YXRlKTsKIAkJCWVycm9yID0gMDsKIAkJfQogCX0KQEAgLTY0MCwxOSArNjQ0LDE0IEBACiAJaW50IHBvcywgaSA9IDA7CiAJc3RydWN0IHBjaV9jYXBfc2F2ZWRfc3RhdGUgKnNhdmVfc3RhdGU7CiAJdTE2ICpjYXA7Ci0JaW50IGZvdW5kID0gMDsKIAogCXBvcyA9IHBjaV9maW5kX2NhcGFiaWxpdHkoZGV2LCBQQ0lfQ0FQX0lEX0VYUCk7CiAJaWYgKHBvcyA8PSAwKQogCQlyZXR1cm4gMDsKIAogCXNhdmVfc3RhdGUgPSBwY2lfZmluZF9zYXZlZF9jYXAoZGV2LCBQQ0lfQ0FQX0lEX0VYUCk7Ci0JaWYgKCFzYXZlX3N0YXRlKQotCQlzYXZlX3N0YXRlID0ga3phbGxvYyhzaXplb2YoKnNhdmVfc3RhdGUpICsgc2l6ZW9mKHUxNikgKiA0LCBHRlBfS0VSTkVMKTsKLQllbHNlCi0JCWZvdW5kID0gMTsKIAlpZiAoIXNhdmVfc3RhdGUpIHsKLQkJZGV2X2VycigmZGV2LT5kZXYsICJvdXQgb2YgbWVtb3J5IGluIHBjaV9zYXZlX3BjaWVfc3RhdGVcbiIpOworCQlkZXZfZXJyKCZkZXYtPmRldiwgImJ1ZmZlciBub3QgZm91bmQgaW4gJXNcbiIsIF9fRlVOQ1RJT05fXyk7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAljYXAgPSAodTE2ICopJnNhdmVfc3RhdGUtPmRhdGFbMF07CkBAIC02NjEsOSArNjYwLDcgQEAKIAlwY2lfcmVhZF9jb25maWdfd29yZChkZXYsIHBvcyArIFBDSV9FWFBfTE5LQ1RMLCAmY2FwW2krK10pOwogCXBjaV9yZWFkX2NvbmZpZ193b3JkKGRldiwgcG9zICsgUENJX0VYUF9TTFRDVEwsICZjYXBbaSsrXSk7CiAJcGNpX3JlYWRfY29uZmlnX3dvcmQoZGV2LCBwb3MgKyBQQ0lfRVhQX1JUQ1RMLCAmY2FwW2krK10pOwotCXNhdmVfc3RhdGUtPmNhcF9uciA9IFBDSV9DQVBfSURfRVhQOwotCWlmICghZm91bmQpCi0JCXBjaV9hZGRfc2F2ZWRfY2FwKGRldiwgc2F2ZV9zdGF0ZSk7CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtNjg4LDMwICs2ODUsMjEgQEAKIAogc3RhdGljIGludCBwY2lfc2F2ZV9wY2l4X3N0YXRlKHN0cnVjdCBwY2lfZGV2ICpkZXYpCiB7Ci0JaW50IHBvcywgaSA9IDA7CisJaW50IHBvczsKIAlzdHJ1Y3QgcGNpX2NhcF9zYXZlZF9zdGF0ZSAqc2F2ZV9zdGF0ZTsKLQl1MTYgKmNhcDsKLQlpbnQgZm91bmQgPSAwOwogCiAJcG9zID0gcGNpX2ZpbmRfY2FwYWJpbGl0eShkZXYsIFBDSV9DQVBfSURfUENJWCk7CiAJaWYgKHBvcyA8PSAwKQogCQlyZXR1cm4gMDsKIAogCXNhdmVfc3RhdGUgPSBwY2lfZmluZF9zYXZlZF9jYXAoZGV2LCBQQ0lfQ0FQX0lEX1BDSVgpOwotCWlmICghc2F2ZV9zdGF0ZSkKLQkJc2F2ZV9zdGF0ZSA9IGt6YWxsb2Moc2l6ZW9mKCpzYXZlX3N0YXRlKSArIHNpemVvZih1MTYpLCBHRlBfS0VSTkVMKTsKLQllbHNlCi0JCWZvdW5kID0gMTsKIAlpZiAoIXNhdmVfc3RhdGUpIHsKLQkJZGV2X2VycigmZGV2LT5kZXYsICJvdXQgb2YgbWVtb3J5IGluIHBjaV9zYXZlX3BjaWVfc3RhdGVcbiIpOworCQlkZXZfZXJyKCZkZXYtPmRldiwgImJ1ZmZlciBub3QgZm91bmQgaW4gJXNcbiIsIF9fRlVOQ1RJT05fXyk7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KLQljYXAgPSAodTE2ICopJnNhdmVfc3RhdGUtPmRhdGFbMF07CiAKLQlwY2lfcmVhZF9jb25maWdfd29yZChkZXYsIHBvcyArIFBDSV9YX0NNRCwgJmNhcFtpKytdKTsKLQlzYXZlX3N0YXRlLT5jYXBfbnIgPSBQQ0lfQ0FQX0lEX1BDSVg7Ci0JaWYgKCFmb3VuZCkKLQkJcGNpX2FkZF9zYXZlZF9jYXAoZGV2LCBzYXZlX3N0YXRlKTsKKwlwY2lfcmVhZF9jb25maWdfd29yZChkZXYsIHBvcyArIFBDSV9YX0NNRCwgKHUxNiAqKXNhdmVfc3RhdGUtPmRhdGEpOworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTk4Miw2ICs5NzAsMzIgQEAKICAqLwogdm9pZCBfX2F0dHJpYnV0ZV9fICgod2VhaykpIHBjaWJpb3NfZGlzYWJsZV9kZXZpY2UgKHN0cnVjdCBwY2lfZGV2ICpkZXYpIHt9CiAKK3N0YXRpYyB2b2lkIGRvX3BjaV9kaXNhYmxlX2RldmljZShzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCXUxNiBwY2lfY29tbWFuZDsKKworCXBjaV9yZWFkX2NvbmZpZ193b3JkKGRldiwgUENJX0NPTU1BTkQsICZwY2lfY29tbWFuZCk7CisJaWYgKHBjaV9jb21tYW5kICYgUENJX0NPTU1BTkRfTUFTVEVSKSB7CisJCXBjaV9jb21tYW5kICY9IH5QQ0lfQ09NTUFORF9NQVNURVI7CisJCXBjaV93cml0ZV9jb25maWdfd29yZChkZXYsIFBDSV9DT01NQU5ELCBwY2lfY29tbWFuZCk7CisJfQorCisJcGNpYmlvc19kaXNhYmxlX2RldmljZShkZXYpOworfQorCisvKioKKyAqIHBjaV9kaXNhYmxlX2VuYWJsZWRfZGV2aWNlIC0gRGlzYWJsZSBkZXZpY2Ugd2l0aG91dCB1cGRhdGluZyBlbmFibGVfY250CisgKiBAZGV2OiBQQ0kgZGV2aWNlIHRvIGRpc2FibGUKKyAqCisgKiBOT1RFOiBUaGlzIGZ1bmN0aW9uIGlzIGEgYmFja2VuZCBvZiBQQ0kgcG93ZXIgbWFuYWdlbWVudCByb3V0aW5lcyBhbmQgaXMKKyAqIG5vdCBzdXBwb3NlZCB0byBiZSBjYWxsZWQgZHJpdmVycy4KKyAqLwordm9pZCBwY2lfZGlzYWJsZV9lbmFibGVkX2RldmljZShzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCWlmIChhdG9taWNfcmVhZCgmZGV2LT5lbmFibGVfY250KSkKKwkJZG9fcGNpX2Rpc2FibGVfZGV2aWNlKGRldik7Cit9CisKIC8qKgogICogcGNpX2Rpc2FibGVfZGV2aWNlIC0gRGlzYWJsZSBQQ0kgZGV2aWNlIGFmdGVyIHVzZQogICogQGRldjogUENJIGRldmljZSB0byBiZSBkaXNhYmxlZApAQCAtOTk2LDcgKzEwMTAsNiBAQAogcGNpX2Rpc2FibGVfZGV2aWNlKHN0cnVjdCBwY2lfZGV2ICpkZXYpCiB7CiAJc3RydWN0IHBjaV9kZXZyZXMgKmRyOwotCXUxNiBwY2lfY29tbWFuZDsKIAogCWRyID0gZmluZF9wY2lfZHIoZGV2KTsKIAlpZiAoZHIpCkBAIC0xMDA1LDE0ICsxMDE4LDkgQEAKIAlpZiAoYXRvbWljX3N1Yl9yZXR1cm4oMSwgJmRldi0+ZW5hYmxlX2NudCkgIT0gMCkKIAkJcmV0dXJuOwogCi0JcGNpX3JlYWRfY29uZmlnX3dvcmQoZGV2LCBQQ0lfQ09NTUFORCwgJnBjaV9jb21tYW5kKTsKLQlpZiAocGNpX2NvbW1hbmQgJiBQQ0lfQ09NTUFORF9NQVNURVIpIHsKLQkJcGNpX2NvbW1hbmQgJj0gflBDSV9DT01NQU5EX01BU1RFUjsKLQkJcGNpX3dyaXRlX2NvbmZpZ193b3JkKGRldiwgUENJX0NPTU1BTkQsIHBjaV9jb21tYW5kKTsKLQl9Ci0JZGV2LT5pc19idXNtYXN0ZXIgPSAwOworCWRvX3BjaV9kaXNhYmxlX2RldmljZShkZXYpOwogCi0JcGNpYmlvc19kaXNhYmxlX2RldmljZShkZXYpOworCWRldi0+aXNfYnVzbWFzdGVyID0gMDsKIH0KIAogLyoqCkBAIC0xMTA3LDcgKzExMTUsNyBAQAogCWludCBlcnJvciA9IDA7CiAJYm9vbCBwbWVfZG9uZSA9IGZhbHNlOwogCi0JaWYgKCFkZXZpY2VfbWF5X3dha2V1cCgmZGV2LT5kZXYpKQorCWlmIChlbmFibGUgJiYgIWRldmljZV9tYXlfd2FrZXVwKCZkZXYtPmRldikpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJLyoKQEAgLTEzMDEsNiArMTMwOSw3MSBAQAogfQogCiAvKioKKyAqIHBsYXRmb3JtX3BjaV93YWtldXBfaW5pdCAtIGluaXQgcGxhdGZvcm0gd2FrZXVwIGlmIHByZXNlbnQKKyAqIEBkZXY6IFBDSSBkZXZpY2UKKyAqCisgKiBTb21lIGRldmljZXMgZG9uJ3QgaGF2ZSBQQ0kgUE0gY2FwcyBidXQgY2FuIHN0aWxsIGdlbmVyYXRlIHdha2V1cAorICogZXZlbnRzIHRocm91Z2ggcGxhdGZvcm0gbWV0aG9kcyAobGlrZSBBQ1BJIGV2ZW50cykuICBJZiBAZGV2IHN1cHBvcnRzCisgKiBwbGF0Zm9ybSB3YWtldXAgZXZlbnRzLCBzZXQgdGhlIGRldmljZSBmbGFnIHRvIGluZGljYXRlIGFzIG11Y2guICBUaGlzCisgKiBtYXkgYmUgcmVkdW5kYW50IGlmIHRoZSBkZXZpY2UgYWxzbyBzdXBwb3J0cyBQQ0kgUE0gY2FwcywgYnV0IGRvdWJsZQorICogaW5pdGlhbGl6YXRpb24gc2hvdWxkIGJlIHNhZmUgaW4gdGhhdCBjYXNlLgorICovCit2b2lkIHBsYXRmb3JtX3BjaV93YWtldXBfaW5pdChzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCWlmICghcGxhdGZvcm1fcGNpX2Nhbl93YWtldXAoZGV2KSkKKwkJcmV0dXJuOworCisJZGV2aWNlX3NldF93YWtldXBfY2FwYWJsZSgmZGV2LT5kZXYsIHRydWUpOworCWRldmljZV9zZXRfd2FrZXVwX2VuYWJsZSgmZGV2LT5kZXYsIGZhbHNlKTsKKwlwbGF0Zm9ybV9wY2lfc2xlZXBfd2FrZShkZXYsIGZhbHNlKTsKK30KKworLyoqCisgKiBwY2lfYWRkX3NhdmVfYnVmZmVyIC0gYWxsb2NhdGUgYnVmZmVyIGZvciBzYXZpbmcgZ2l2ZW4gY2FwYWJpbGl0eSByZWdpc3RlcnMKKyAqIEBkZXY6IHRoZSBQQ0kgZGV2aWNlCisgKiBAY2FwOiB0aGUgY2FwYWJpbGl0eSB0byBhbGxvY2F0ZSB0aGUgYnVmZmVyIGZvcgorICogQHNpemU6IHJlcXVlc3RlZCBzaXplIG9mIHRoZSBidWZmZXIKKyAqLworc3RhdGljIGludCBwY2lfYWRkX2NhcF9zYXZlX2J1ZmZlcigKKwlzdHJ1Y3QgcGNpX2RldiAqZGV2LCBjaGFyIGNhcCwgdW5zaWduZWQgaW50IHNpemUpCit7CisJaW50IHBvczsKKwlzdHJ1Y3QgcGNpX2NhcF9zYXZlZF9zdGF0ZSAqc2F2ZV9zdGF0ZTsKKworCXBvcyA9IHBjaV9maW5kX2NhcGFiaWxpdHkoZGV2LCBjYXApOworCWlmIChwb3MgPD0gMCkKKwkJcmV0dXJuIDA7CisKKwlzYXZlX3N0YXRlID0ga3phbGxvYyhzaXplb2YoKnNhdmVfc3RhdGUpICsgc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzYXZlX3N0YXRlKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXNhdmVfc3RhdGUtPmNhcF9uciA9IGNhcDsKKwlwY2lfYWRkX3NhdmVkX2NhcChkZXYsIHNhdmVfc3RhdGUpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogcGNpX2FsbG9jYXRlX2NhcF9zYXZlX2J1ZmZlcnMgLSBhbGxvY2F0ZSBidWZmZXJzIGZvciBzYXZpbmcgY2FwYWJpbGl0aWVzCisgKiBAZGV2OiB0aGUgUENJIGRldmljZQorICovCit2b2lkIHBjaV9hbGxvY2F0ZV9jYXBfc2F2ZV9idWZmZXJzKHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJaW50IGVycm9yOworCisJZXJyb3IgPSBwY2lfYWRkX2NhcF9zYXZlX2J1ZmZlcihkZXYsIFBDSV9DQVBfSURfRVhQLCA0ICogc2l6ZW9mKHUxNikpOworCWlmIChlcnJvcikKKwkJZGV2X2VycigmZGV2LT5kZXYsCisJCQkidW5hYmxlIHRvIHByZWFsbG9jYXRlIFBDSSBFeHByZXNzIHNhdmUgYnVmZmVyXG4iKTsKKworCWVycm9yID0gcGNpX2FkZF9jYXBfc2F2ZV9idWZmZXIoZGV2LCBQQ0lfQ0FQX0lEX1BDSVgsIHNpemVvZih1MTYpKTsKKwlpZiAoZXJyb3IpCisJCWRldl9lcnIoJmRldi0+ZGV2LAorCQkJInVuYWJsZSB0byBwcmVhbGxvY2F0ZSBQQ0ktWCBzYXZlIGJ1ZmZlclxuIik7Cit9CisKKy8qKgogICogcGNpX2VuYWJsZV9hcmkgLSBlbmFibGUgQVJJIGZvcndhcmRpbmcgaWYgaGFyZHdhcmUgc3VwcG9ydCBpdAogICogQGRldjogdGhlIFBDSSBkZXZpY2UKICAqLwpAQCAtMTMzNyw2ICsxNDEwLDIwIEBACiAJYnJpZGdlLT5hcmlfZW5hYmxlZCA9IDE7CiB9CiAKKy8qKgorICogcGNpX3N3aXp6bGVfaW50ZXJydXB0X3BpbiAtIHN3aXp6bGUgSU5UeCBmb3IgZGV2aWNlIGJlaGluZCBicmlkZ2UKKyAqIEBkZXY6IHRoZSBQQ0kgZGV2aWNlCisgKiBAcGluOiB0aGUgSU5UeCBwaW4gKDE9SU5UQSwgMj1JTlRCLCAzPUlOVEQsIDQ9SU5URCkKKyAqCisgKiBQZXJmb3JtIElOVHggc3dpenpsaW5nIGZvciBhIGRldmljZSBiZWhpbmQgb25lIGxldmVsIG9mIGJyaWRnZS4gIFRoaXMgaXMKKyAqIHJlcXVpcmVkIGJ5IHNlY3Rpb24gOS4xIG9mIHRoZSBQQ0ktdG8tUENJIGJyaWRnZSBzcGVjaWZpY2F0aW9uIGZvciBkZXZpY2VzCisgKiBiZWhpbmQgYnJpZGdlcyBvbiBhZGQtaW4gY2FyZHMuCisgKi8KK3U4IHBjaV9zd2l6emxlX2ludGVycnVwdF9waW4oc3RydWN0IHBjaV9kZXYgKmRldiwgdTggcGluKQoreworCXJldHVybiAoKChwaW4gLSAxKSArIFBDSV9TTE9UKGRldi0+ZGV2Zm4pKSAlIDQpICsgMTsKK30KKwogaW50CiBwY2lfZ2V0X2ludGVycnVwdF9waW4oc3RydWN0IHBjaV9kZXYgKmRldiwgc3RydWN0IHBjaV9kZXYgKipicmlkZ2UpCiB7CkBAIC0xMzQ1LDkgKzE0MzIsOSBAQAogCXBpbiA9IGRldi0+cGluOwogCWlmICghcGluKQogCQlyZXR1cm4gLTE7Ci0JcGluLS07CisKIAl3aGlsZSAoZGV2LT5idXMtPnNlbGYpIHsKLQkJcGluID0gKHBpbiArIFBDSV9TTE9UKGRldi0+ZGV2Zm4pKSAlIDQ7CisJCXBpbiA9IHBjaV9zd2l6emxlX2ludGVycnVwdF9waW4oZGV2LCBwaW4pOwogCQlkZXYgPSBkZXYtPmJ1cy0+c2VsZjsKIAl9CiAJKmJyaWRnZSA9IGRldjsKQEAgLTEzNTUsNiArMTQ0MiwyNiBAQAogfQogCiAvKioKKyAqIHBjaV9jb21tb25fc3dpenpsZSAtIHN3aXp6bGUgSU5UeCBhbGwgdGhlIHdheSB0byByb290IGJyaWRnZQorICogQGRldjogdGhlIFBDSSBkZXZpY2UKKyAqIEBwaW5wOiBwb2ludGVyIHRvIHRoZSBJTlR4IHBpbiB2YWx1ZSAoMT1JTlRBLCAyPUlOVEIsIDM9SU5URCwgND1JTlREKQorICoKKyAqIFBlcmZvcm0gSU5UeCBzd2l6emxpbmcgZm9yIGEgZGV2aWNlLiAgVGhpcyB0cmF2ZXJzZXMgdGhyb3VnaCBhbGwgUENJLXRvLVBDSQorICogYnJpZGdlcyBhbGwgdGhlIHdheSB1cCB0byBhIFBDSSByb290IGJ1cy4KKyAqLwordTggcGNpX2NvbW1vbl9zd2l6emxlKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4ICpwaW5wKQoreworCXU4IHBpbiA9ICpwaW5wOworCisJd2hpbGUgKGRldi0+YnVzLT5zZWxmKSB7CisJCXBpbiA9IHBjaV9zd2l6emxlX2ludGVycnVwdF9waW4oZGV2LCBwaW4pOworCQlkZXYgPSBkZXYtPmJ1cy0+c2VsZjsKKwl9CisJKnBpbnAgPSBwaW47CisJcmV0dXJuIFBDSV9TTE9UKGRldi0+ZGV2Zm4pOworfQorCisvKioKICAqCXBjaV9yZWxlYXNlX3JlZ2lvbiAtIFJlbGVhc2UgYSBQQ0kgYmFyCiAgKglAcGRldjogUENJIGRldmljZSB3aG9zZSByZXNvdXJjZXMgd2VyZSBwcmV2aW91c2x5IHJlc2VydmVkIGJ5IHBjaV9yZXF1ZXN0X3JlZ2lvbgogICoJQGJhcjogQkFSIHRvIHJlbGVhc2UKQEAgLTEzOTUsNyArMTUwMiw4IEBACiAgKglSZXR1cm5zIDAgb24gc3VjY2Vzcywgb3IgJUVCVVNZIG9uIGVycm9yLiAgQSB3YXJuaW5nCiAgKgltZXNzYWdlIGlzIGFsc28gcHJpbnRlZCBvbiBmYWlsdXJlLgogICovCi1pbnQgcGNpX3JlcXVlc3RfcmVnaW9uKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBpbnQgYmFyLCBjb25zdCBjaGFyICpyZXNfbmFtZSkKK3N0YXRpYyBpbnQgX19wY2lfcmVxdWVzdF9yZWdpb24oc3RydWN0IHBjaV9kZXYgKnBkZXYsIGludCBiYXIsIGNvbnN0IGNoYXIgKnJlc19uYW1lLAorCQkJCQkJCQkJaW50IGV4Y2x1c2l2ZSkKIHsKIAlzdHJ1Y3QgcGNpX2RldnJlcyAqZHI7CiAKQEAgLTE0MDgsOCArMTUxNiw5IEBACiAJCQlnb3RvIGVycl9vdXQ7CiAJfQogCWVsc2UgaWYgKHBjaV9yZXNvdXJjZV9mbGFncyhwZGV2LCBiYXIpICYgSU9SRVNPVVJDRV9NRU0pIHsKLQkJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24ocGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIGJhciksCi0JCQkJICAgICAgICBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIGJhciksIHJlc19uYW1lKSkKKwkJaWYgKCFfX3JlcXVlc3RfbWVtX3JlZ2lvbihwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgYmFyKSwKKwkJCQkJcGNpX3Jlc291cmNlX2xlbihwZGV2LCBiYXIpLCByZXNfbmFtZSwKKwkJCQkJZXhjbHVzaXZlKSkKIAkJCWdvdG8gZXJyX291dDsKIAl9CiAKQEAgLTE0MjgsNiArMTUzNyw0NyBAQAogfQogCiAvKioKKyAqCXBjaV9yZXF1ZXN0X3JlZ2lvbiAtIFJlc2VydmVkIFBDSSBJL08gYW5kIG1lbW9yeSByZXNvdXJjZQorICoJQHBkZXY6IFBDSSBkZXZpY2Ugd2hvc2UgcmVzb3VyY2VzIGFyZSB0byBiZSByZXNlcnZlZAorICoJQGJhcjogQkFSIHRvIGJlIHJlc2VydmVkCisgKglAcmVzX25hbWU6IE5hbWUgdG8gYmUgYXNzb2NpYXRlZCB3aXRoIHJlc291cmNlLgorICoKKyAqCU1hcmsgdGhlIFBDSSByZWdpb24gYXNzb2NpYXRlZCB3aXRoIFBDSSBkZXZpY2UgQHBkZXYgQlIgQGJhciBhcworICoJYmVpbmcgcmVzZXJ2ZWQgYnkgb3duZXIgQHJlc19uYW1lLiAgRG8gbm90IGFjY2VzcyBhbnkKKyAqCWFkZHJlc3MgaW5zaWRlIHRoZSBQQ0kgcmVnaW9ucyB1bmxlc3MgdGhpcyBjYWxsIHJldHVybnMKKyAqCXN1Y2Nlc3NmdWxseS4KKyAqCisgKglSZXR1cm5zIDAgb24gc3VjY2Vzcywgb3IgJUVCVVNZIG9uIGVycm9yLiAgQSB3YXJuaW5nCisgKgltZXNzYWdlIGlzIGFsc28gcHJpbnRlZCBvbiBmYWlsdXJlLgorICovCitpbnQgcGNpX3JlcXVlc3RfcmVnaW9uKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBpbnQgYmFyLCBjb25zdCBjaGFyICpyZXNfbmFtZSkKK3sKKwlyZXR1cm4gX19wY2lfcmVxdWVzdF9yZWdpb24ocGRldiwgYmFyLCByZXNfbmFtZSwgMCk7Cit9CisKKy8qKgorICoJcGNpX3JlcXVlc3RfcmVnaW9uX2V4Y2x1c2l2ZSAtIFJlc2VydmVkIFBDSSBJL08gYW5kIG1lbW9yeSByZXNvdXJjZQorICoJQHBkZXY6IFBDSSBkZXZpY2Ugd2hvc2UgcmVzb3VyY2VzIGFyZSB0byBiZSByZXNlcnZlZAorICoJQGJhcjogQkFSIHRvIGJlIHJlc2VydmVkCisgKglAcmVzX25hbWU6IE5hbWUgdG8gYmUgYXNzb2NpYXRlZCB3aXRoIHJlc291cmNlLgorICoKKyAqCU1hcmsgdGhlIFBDSSByZWdpb24gYXNzb2NpYXRlZCB3aXRoIFBDSSBkZXZpY2UgQHBkZXYgQlIgQGJhciBhcworICoJYmVpbmcgcmVzZXJ2ZWQgYnkgb3duZXIgQHJlc19uYW1lLiAgRG8gbm90IGFjY2VzcyBhbnkKKyAqCWFkZHJlc3MgaW5zaWRlIHRoZSBQQ0kgcmVnaW9ucyB1bmxlc3MgdGhpcyBjYWxsIHJldHVybnMKKyAqCXN1Y2Nlc3NmdWxseS4KKyAqCisgKglSZXR1cm5zIDAgb24gc3VjY2Vzcywgb3IgJUVCVVNZIG9uIGVycm9yLiAgQSB3YXJuaW5nCisgKgltZXNzYWdlIGlzIGFsc28gcHJpbnRlZCBvbiBmYWlsdXJlLgorICoKKyAqCVRoZSBrZXkgZGlmZmVyZW5jZSB0aGF0IF9leGNsdXNpdmUgbWFrZXMgaXQgdGhhdCB1c2Vyc3BhY2UgaXMKKyAqCWV4cGxpY2l0bHkgbm90IGFsbG93ZWQgdG8gbWFwIHRoZSByZXNvdXJjZSB2aWEgL2Rldi9tZW0gb3IKKyAqIAlzeXNmcy4KKyAqLworaW50IHBjaV9yZXF1ZXN0X3JlZ2lvbl9leGNsdXNpdmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGludCBiYXIsIGNvbnN0IGNoYXIgKnJlc19uYW1lKQoreworCXJldHVybiBfX3BjaV9yZXF1ZXN0X3JlZ2lvbihwZGV2LCBiYXIsIHJlc19uYW1lLCBJT1JFU09VUkNFX0VYQ0xVU0lWRSk7Cit9CisvKioKICAqIHBjaV9yZWxlYXNlX3NlbGVjdGVkX3JlZ2lvbnMgLSBSZWxlYXNlIHNlbGVjdGVkIFBDSSBJL08gYW5kIG1lbW9yeSByZXNvdXJjZXMKICAqIEBwZGV2OiBQQ0kgZGV2aWNlIHdob3NlIHJlc291cmNlcyB3ZXJlIHByZXZpb3VzbHkgcmVzZXJ2ZWQKICAqIEBiYXJzOiBCaXRtYXNrIG9mIEJBUnMgdG8gYmUgcmVsZWFzZWQKQEAgLTE0NDQsMjAgKzE1OTQsMTQgQEAKIAkJCXBjaV9yZWxlYXNlX3JlZ2lvbihwZGV2LCBpKTsKIH0KIAotLyoqCi0gKiBwY2lfcmVxdWVzdF9zZWxlY3RlZF9yZWdpb25zIC0gUmVzZXJ2ZSBzZWxlY3RlZCBQQ0kgSS9PIGFuZCBtZW1vcnkgcmVzb3VyY2VzCi0gKiBAcGRldjogUENJIGRldmljZSB3aG9zZSByZXNvdXJjZXMgYXJlIHRvIGJlIHJlc2VydmVkCi0gKiBAYmFyczogQml0bWFzayBvZiBCQVJzIHRvIGJlIHJlcXVlc3RlZAotICogQHJlc19uYW1lOiBOYW1lIHRvIGJlIGFzc29jaWF0ZWQgd2l0aCByZXNvdXJjZQotICovCi1pbnQgcGNpX3JlcXVlc3Rfc2VsZWN0ZWRfcmVnaW9ucyhzdHJ1Y3QgcGNpX2RldiAqcGRldiwgaW50IGJhcnMsCi0JCQkJIGNvbnN0IGNoYXIgKnJlc19uYW1lKQoraW50IF9fcGNpX3JlcXVlc3Rfc2VsZWN0ZWRfcmVnaW9ucyhzdHJ1Y3QgcGNpX2RldiAqcGRldiwgaW50IGJhcnMsCisJCQkJIGNvbnN0IGNoYXIgKnJlc19uYW1lLCBpbnQgZXhjbCkKIHsKIAlpbnQgaTsKIAogCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCiAJCWlmIChiYXJzICYgKDEgPDwgaSkpCi0JCQlpZihwY2lfcmVxdWVzdF9yZWdpb24ocGRldiwgaSwgcmVzX25hbWUpKQorCQkJaWYgKF9fcGNpX3JlcXVlc3RfcmVnaW9uKHBkZXYsIGksIHJlc19uYW1lLCBleGNsKSkKIAkJCQlnb3RvIGVycl9vdXQ7CiAJcmV0dXJuIDA7CiAKQEAgLTE0NjksNiArMTYxMywyNiBAQAogCXJldHVybiAtRUJVU1k7CiB9CiAKKworLyoqCisgKiBwY2lfcmVxdWVzdF9zZWxlY3RlZF9yZWdpb25zIC0gUmVzZXJ2ZSBzZWxlY3RlZCBQQ0kgSS9PIGFuZCBtZW1vcnkgcmVzb3VyY2VzCisgKiBAcGRldjogUENJIGRldmljZSB3aG9zZSByZXNvdXJjZXMgYXJlIHRvIGJlIHJlc2VydmVkCisgKiBAYmFyczogQml0bWFzayBvZiBCQVJzIHRvIGJlIHJlcXVlc3RlZAorICogQHJlc19uYW1lOiBOYW1lIHRvIGJlIGFzc29jaWF0ZWQgd2l0aCByZXNvdXJjZQorICovCitpbnQgcGNpX3JlcXVlc3Rfc2VsZWN0ZWRfcmVnaW9ucyhzdHJ1Y3QgcGNpX2RldiAqcGRldiwgaW50IGJhcnMsCisJCQkJIGNvbnN0IGNoYXIgKnJlc19uYW1lKQoreworCXJldHVybiBfX3BjaV9yZXF1ZXN0X3NlbGVjdGVkX3JlZ2lvbnMocGRldiwgYmFycywgcmVzX25hbWUsIDApOworfQorCitpbnQgcGNpX3JlcXVlc3Rfc2VsZWN0ZWRfcmVnaW9uc19leGNsdXNpdmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJCQkJIGludCBiYXJzLCBjb25zdCBjaGFyICpyZXNfbmFtZSkKK3sKKwlyZXR1cm4gX19wY2lfcmVxdWVzdF9zZWxlY3RlZF9yZWdpb25zKHBkZXYsIGJhcnMsIHJlc19uYW1lLAorCQkJSU9SRVNPVVJDRV9FWENMVVNJVkUpOworfQorCiAvKioKICAqCXBjaV9yZWxlYXNlX3JlZ2lvbnMgLSBSZWxlYXNlIHJlc2VydmVkIFBDSSBJL08gYW5kIG1lbW9yeSByZXNvdXJjZXMKICAqCUBwZGV2OiBQQ0kgZGV2aWNlIHdob3NlIHJlc291cmNlcyB3ZXJlIHByZXZpb3VzbHkgcmVzZXJ2ZWQgYnkgcGNpX3JlcXVlc3RfcmVnaW9ucwpAQCAtMTUwMiwyNyArMTY2Niw2NiBAQAogfQogCiAvKioKKyAqCXBjaV9yZXF1ZXN0X3JlZ2lvbnNfZXhjbHVzaXZlIC0gUmVzZXJ2ZWQgUENJIEkvTyBhbmQgbWVtb3J5IHJlc291cmNlcworICoJQHBkZXY6IFBDSSBkZXZpY2Ugd2hvc2UgcmVzb3VyY2VzIGFyZSB0byBiZSByZXNlcnZlZAorICoJQHJlc19uYW1lOiBOYW1lIHRvIGJlIGFzc29jaWF0ZWQgd2l0aCByZXNvdXJjZS4KKyAqCisgKglNYXJrIGFsbCBQQ0kgcmVnaW9ucyBhc3NvY2lhdGVkIHdpdGggUENJIGRldmljZSBAcGRldiBhcworICoJYmVpbmcgcmVzZXJ2ZWQgYnkgb3duZXIgQHJlc19uYW1lLiAgRG8gbm90IGFjY2VzcyBhbnkKKyAqCWFkZHJlc3MgaW5zaWRlIHRoZSBQQ0kgcmVnaW9ucyB1bmxlc3MgdGhpcyBjYWxsIHJldHVybnMKKyAqCXN1Y2Nlc3NmdWxseS4KKyAqCisgKglwY2lfcmVxdWVzdF9yZWdpb25zX2V4Y2x1c2l2ZSgpIHdpbGwgbWFyayB0aGUgcmVnaW9uIHNvIHRoYXQKKyAqIAkvZGV2L21lbSBhbmQgdGhlIHN5c2ZzIE1NSU8gYWNjZXNzIHdpbGwgbm90IGJlIGFsbG93ZWQuCisgKgorICoJUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIG9yICVFQlVTWSBvbiBlcnJvci4gIEEgd2FybmluZworICoJbWVzc2FnZSBpcyBhbHNvIHByaW50ZWQgb24gZmFpbHVyZS4KKyAqLworaW50IHBjaV9yZXF1ZXN0X3JlZ2lvbnNfZXhjbHVzaXZlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBjaGFyICpyZXNfbmFtZSkKK3sKKwlyZXR1cm4gcGNpX3JlcXVlc3Rfc2VsZWN0ZWRfcmVnaW9uc19leGNsdXNpdmUocGRldiwKKwkJCQkJKCgxIDw8IDYpIC0gMSksIHJlc19uYW1lKTsKK30KKworc3RhdGljIHZvaWQgX19wY2lfc2V0X21hc3RlcihzdHJ1Y3QgcGNpX2RldiAqZGV2LCBib29sIGVuYWJsZSkKK3sKKwl1MTYgb2xkX2NtZCwgY21kOworCisJcGNpX3JlYWRfY29uZmlnX3dvcmQoZGV2LCBQQ0lfQ09NTUFORCwgJm9sZF9jbWQpOworCWlmIChlbmFibGUpCisJCWNtZCA9IG9sZF9jbWQgfCBQQ0lfQ09NTUFORF9NQVNURVI7CisJZWxzZQorCQljbWQgPSBvbGRfY21kICYgflBDSV9DT01NQU5EX01BU1RFUjsKKwlpZiAoY21kICE9IG9sZF9jbWQpIHsKKwkJZGV2X2RiZygmZGV2LT5kZXYsICIlcyBidXMgbWFzdGVyaW5nXG4iLAorCQkJZW5hYmxlID8gImVuYWJsaW5nIiA6ICJkaXNhYmxpbmciKTsKKwkJcGNpX3dyaXRlX2NvbmZpZ193b3JkKGRldiwgUENJX0NPTU1BTkQsIGNtZCk7CisJfQorCWRldi0+aXNfYnVzbWFzdGVyID0gZW5hYmxlOworfQorCisvKioKICAqIHBjaV9zZXRfbWFzdGVyIC0gZW5hYmxlcyBidXMtbWFzdGVyaW5nIGZvciBkZXZpY2UgZGV2CiAgKiBAZGV2OiB0aGUgUENJIGRldmljZSB0byBlbmFibGUKICAqCiAgKiBFbmFibGVzIGJ1cy1tYXN0ZXJpbmcgb24gdGhlIGRldmljZSBhbmQgY2FsbHMgcGNpYmlvc19zZXRfbWFzdGVyKCkKICAqIHRvIGRvIHRoZSBuZWVkZWQgYXJjaCBzcGVjaWZpYyBzZXR0aW5ncy4KICAqLwotdm9pZAotcGNpX3NldF9tYXN0ZXIoc3RydWN0IHBjaV9kZXYgKmRldikKK3ZvaWQgcGNpX3NldF9tYXN0ZXIoc3RydWN0IHBjaV9kZXYgKmRldikKIHsKLQl1MTYgY21kOwotCi0JcGNpX3JlYWRfY29uZmlnX3dvcmQoZGV2LCBQQ0lfQ09NTUFORCwgJmNtZCk7Ci0JaWYgKCEgKGNtZCAmIFBDSV9DT01NQU5EX01BU1RFUikpIHsKLQkJZGV2X2RiZygmZGV2LT5kZXYsICJlbmFibGluZyBidXMgbWFzdGVyaW5nXG4iKTsKLQkJY21kIHw9IFBDSV9DT01NQU5EX01BU1RFUjsKLQkJcGNpX3dyaXRlX2NvbmZpZ193b3JkKGRldiwgUENJX0NPTU1BTkQsIGNtZCk7Ci0JfQotCWRldi0+aXNfYnVzbWFzdGVyID0gMTsKKwlfX3BjaV9zZXRfbWFzdGVyKGRldiwgdHJ1ZSk7CiAJcGNpYmlvc19zZXRfbWFzdGVyKGRldik7CiB9CiAKKy8qKgorICogcGNpX2NsZWFyX21hc3RlciAtIGRpc2FibGVzIGJ1cy1tYXN0ZXJpbmcgZm9yIGRldmljZSBkZXYKKyAqIEBkZXY6IHRoZSBQQ0kgZGV2aWNlIHRvIGRpc2FibGUKKyAqLwordm9pZCBwY2lfY2xlYXJfbWFzdGVyKHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJX19wY2lfc2V0X21hc3RlcihkZXYsIGZhbHNlKTsKK30KKwogI2lmZGVmIFBDSV9ESVNBQkxFX01XSQogaW50IHBjaV9zZXRfbXdpKHN0cnVjdCBwY2lfZGV2ICpkZXYpCiB7CkBAIC0xNzUxLDI0ICsxOTU0LDcgQEAKIEVYUE9SVF9TWU1CT0wocGNpX3NldF9kbWFfc2VnX2JvdW5kYXJ5KTsKICNlbmRpZgogCi0vKioKLSAqIHBjaV9leGVjdXRlX3Jlc2V0X2Z1bmN0aW9uKCkgLSBSZXNldCBhIFBDSSBkZXZpY2UgZnVuY3Rpb24KLSAqIEBkZXY6IERldmljZSBmdW5jdGlvbiB0byByZXNldAotICoKLSAqIFNvbWUgZGV2aWNlcyBhbGxvdyBhbiBpbmRpdmlkdWFsIGZ1bmN0aW9uIHRvIGJlIHJlc2V0IHdpdGhvdXQgYWZmZWN0aW5nCi0gKiBvdGhlciBmdW5jdGlvbnMgaW4gdGhlIHNhbWUgZGV2aWNlLiAgVGhlIFBDSSBkZXZpY2UgbXVzdCBiZSByZXNwb25zaXZlCi0gKiB0byBQQ0kgY29uZmlnIHNwYWNlIGluIG9yZGVyIHRvIHVzZSB0aGlzIGZ1bmN0aW9uLgotICoKLSAqIFRoZSBkZXZpY2UgZnVuY3Rpb24gaXMgcHJlc3VtZWQgdG8gYmUgdW51c2VkIHdoZW4gdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQuCi0gKiBSZXNldHRpbmcgdGhlIGRldmljZSB3aWxsIG1ha2UgdGhlIGNvbnRlbnRzIG9mIFBDSSBjb25maWd1cmF0aW9uIHNwYWNlCi0gKiByYW5kb20sIHNvIGFueSBjYWxsZXIgb2YgdGhpcyBtdXN0IGJlIHByZXBhcmVkIHRvIHJlaW5pdGlhbGlzZSB0aGUKLSAqIGRldmljZSBpbmNsdWRpbmcgTVNJLCBidXMgbWFzdGVyaW5nLCBCQVJzLCBkZWNvZGluZyBJTyBhbmQgbWVtb3J5IHNwYWNlcywKLSAqIGV0Yy4KLSAqCi0gKiBSZXR1cm5zIDAgaWYgdGhlIGRldmljZSBmdW5jdGlvbiB3YXMgc3VjY2Vzc2Z1bGx5IHJlc2V0IG9yIC1FTk9UVFkgaWYgdGhlCi0gKiBkZXZpY2UgZG9lc24ndCBzdXBwb3J0IHJlc2V0dGluZyBhIHNpbmdsZSBmdW5jdGlvbi4KLSAqLwotaW50IHBjaV9leGVjdXRlX3Jlc2V0X2Z1bmN0aW9uKHN0cnVjdCBwY2lfZGV2ICpkZXYpCitzdGF0aWMgaW50IF9fcGNpZV9mbHIoc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IHByb2JlKQogewogCXUxNiBzdGF0dXM7CiAJdTMyIGNhcDsKQEAgLTE3ODAsNiArMTk2Niw5IEBACiAJaWYgKCEoY2FwICYgUENJX0VYUF9ERVZDQVBfRkxSKSkKIAkJcmV0dXJuIC1FTk9UVFk7CiAKKwlpZiAocHJvYmUpCisJCXJldHVybiAwOworCiAJcGNpX2Jsb2NrX3VzZXJfY2ZnX2FjY2VzcyhkZXYpOwogCiAJLyogV2FpdCBmb3IgVHJhbnNhY3Rpb24gUGVuZGluZyBiaXQgY2xlYW4gKi8KQEAgLTE4MDIsNiArMTk5MSw4MCBAQAogCXBjaV91bmJsb2NrX3VzZXJfY2ZnX2FjY2VzcyhkZXYpOwogCXJldHVybiAwOwogfQorCitzdGF0aWMgaW50IF9fcGNpX2FmX2ZscihzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgcHJvYmUpCit7CisJaW50IGNhcHBvcyA9IHBjaV9maW5kX2NhcGFiaWxpdHkoZGV2LCBQQ0lfQ0FQX0lEX0FGKTsKKwl1OCBzdGF0dXM7CisJdTggY2FwOworCisJaWYgKCFjYXBwb3MpCisJCXJldHVybiAtRU5PVFRZOworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgY2FwcG9zICsgUENJX0FGX0NBUCwgJmNhcCk7CisJaWYgKCEoY2FwICYgUENJX0FGX0NBUF9UUCkgfHwgIShjYXAgJiBQQ0lfQUZfQ0FQX0ZMUikpCisJCXJldHVybiAtRU5PVFRZOworCisJaWYgKHByb2JlKQorCQlyZXR1cm4gMDsKKworCXBjaV9ibG9ja191c2VyX2NmZ19hY2Nlc3MoZGV2KTsKKworCS8qIFdhaXQgZm9yIFRyYW5zYWN0aW9uIFBlbmRpbmcgYml0IGNsZWFuICovCisJbXNsZWVwKDEwMCk7CisJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCBjYXBwb3MgKyBQQ0lfQUZfU1RBVFVTLCAmc3RhdHVzKTsKKwlpZiAoc3RhdHVzICYgUENJX0FGX1NUQVRVU19UUCkgeworCQlkZXZfaW5mbygmZGV2LT5kZXYsICJCdXN5IGFmdGVyIDEwMG1zIHdoaWxlIHRyeWluZyB0byIKKwkJCQkiIHJlc2V0OyBzbGVlcGluZyBmb3IgMSBzZWNvbmRcbiIpOworCQlzc2xlZXAoMSk7CisJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwKKwkJCQljYXBwb3MgKyBQQ0lfQUZfU1RBVFVTLCAmc3RhdHVzKTsKKwkJaWYgKHN0YXR1cyAmIFBDSV9BRl9TVEFUVVNfVFApCisJCQlkZXZfaW5mbygmZGV2LT5kZXYsICJTdGlsbCBidXN5IGFmdGVyIDFzOyAiCisJCQkJCSJwcm9jZWVkaW5nIHdpdGggcmVzZXQgYW55d2F5XG4iKTsKKwl9CisJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgY2FwcG9zICsgUENJX0FGX0NUUkwsIFBDSV9BRl9DVFJMX0ZMUik7CisJbWRlbGF5KDEwMCk7CisKKwlwY2lfdW5ibG9ja191c2VyX2NmZ19hY2Nlc3MoZGV2KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX3BjaV9yZXNldF9mdW5jdGlvbihzdHJ1Y3QgcGNpX2RldiAqcGRldiwgaW50IHByb2JlKQoreworCWludCByZXM7CisKKwlyZXMgPSBfX3BjaWVfZmxyKHBkZXYsIHByb2JlKTsKKwlpZiAocmVzICE9IC1FTk9UVFkpCisJCXJldHVybiByZXM7CisKKwlyZXMgPSBfX3BjaV9hZl9mbHIocGRldiwgcHJvYmUpOworCWlmIChyZXMgIT0gLUVOT1RUWSkKKwkJcmV0dXJuIHJlczsKKworCXJldHVybiByZXM7Cit9CisKKy8qKgorICogcGNpX2V4ZWN1dGVfcmVzZXRfZnVuY3Rpb24oKSAtIFJlc2V0IGEgUENJIGRldmljZSBmdW5jdGlvbgorICogQGRldjogRGV2aWNlIGZ1bmN0aW9uIHRvIHJlc2V0CisgKgorICogU29tZSBkZXZpY2VzIGFsbG93IGFuIGluZGl2aWR1YWwgZnVuY3Rpb24gdG8gYmUgcmVzZXQgd2l0aG91dCBhZmZlY3RpbmcKKyAqIG90aGVyIGZ1bmN0aW9ucyBpbiB0aGUgc2FtZSBkZXZpY2UuICBUaGUgUENJIGRldmljZSBtdXN0IGJlIHJlc3BvbnNpdmUKKyAqIHRvIFBDSSBjb25maWcgc3BhY2UgaW4gb3JkZXIgdG8gdXNlIHRoaXMgZnVuY3Rpb24uCisgKgorICogVGhlIGRldmljZSBmdW5jdGlvbiBpcyBwcmVzdW1lZCB0byBiZSB1bnVzZWQgd2hlbiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZC4KKyAqIFJlc2V0dGluZyB0aGUgZGV2aWNlIHdpbGwgbWFrZSB0aGUgY29udGVudHMgb2YgUENJIGNvbmZpZ3VyYXRpb24gc3BhY2UKKyAqIHJhbmRvbSwgc28gYW55IGNhbGxlciBvZiB0aGlzIG11c3QgYmUgcHJlcGFyZWQgdG8gcmVpbml0aWFsaXNlIHRoZQorICogZGV2aWNlIGluY2x1ZGluZyBNU0ksIGJ1cyBtYXN0ZXJpbmcsIEJBUnMsIGRlY29kaW5nIElPIGFuZCBtZW1vcnkgc3BhY2VzLAorICogZXRjLgorICoKKyAqIFJldHVybnMgMCBpZiB0aGUgZGV2aWNlIGZ1bmN0aW9uIHdhcyBzdWNjZXNzZnVsbHkgcmVzZXQgb3IgLUVOT1RUWSBpZiB0aGUKKyAqIGRldmljZSBkb2Vzbid0IHN1cHBvcnQgcmVzZXR0aW5nIGEgc2luZ2xlIGZ1bmN0aW9uLgorICovCitpbnQgcGNpX2V4ZWN1dGVfcmVzZXRfZnVuY3Rpb24oc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwlyZXR1cm4gX19wY2lfcmVzZXRfZnVuY3Rpb24oZGV2LCAwKTsKK30KIEVYUE9SVF9TWU1CT0xfR1BMKHBjaV9leGVjdXRlX3Jlc2V0X2Z1bmN0aW9uKTsKIAogLyoqCkBAIC0xODIyLDE1ICsyMDg1LDEwIEBACiAgKi8KIGludCBwY2lfcmVzZXRfZnVuY3Rpb24oc3RydWN0IHBjaV9kZXYgKmRldikKIHsKLQl1MzIgY2FwOwotCWludCBleHBwb3MgPSBwY2lfZmluZF9jYXBhYmlsaXR5KGRldiwgUENJX0NBUF9JRF9FWFApOwotCWludCByOworCWludCByID0gX19wY2lfcmVzZXRfZnVuY3Rpb24oZGV2LCAxKTsKIAotCWlmICghZXhwcG9zKQotCQlyZXR1cm4gLUVOT1RUWTsKLQlwY2lfcmVhZF9jb25maWdfZHdvcmQoZGV2LCBleHBwb3MgKyBQQ0lfRVhQX0RFVkNBUCwgJmNhcCk7Ci0JaWYgKCEoY2FwICYgUENJX0VYUF9ERVZDQVBfRkxSKSkKLQkJcmV0dXJuIC1FTk9UVFk7CisJaWYgKHIgPCAwKQorCQlyZXR1cm4gcjsKIAogCWlmICghZGV2LT5tc2lfZW5hYmxlZCAmJiAhZGV2LT5tc2l4X2VuYWJsZWQgJiYgZGV2LT5pcnEgIT0gMCkKIAkJZGlzYWJsZV9pcnEoZGV2LT5pcnEpOwpAQCAtMjAyMiw2ICsyMjgwLDI4IEBACiAJcmV0dXJuIGJhcnM7CiB9CiAKKy8qKgorICogcGNpX3Jlc291cmNlX2JhciAtIGdldCBwb3NpdGlvbiBvZiB0aGUgQkFSIGFzc29jaWF0ZWQgd2l0aCBhIHJlc291cmNlCisgKiBAZGV2OiB0aGUgUENJIGRldmljZQorICogQHJlc25vOiB0aGUgcmVzb3VyY2UgbnVtYmVyCisgKiBAdHlwZTogdGhlIEJBUiB0eXBlIHRvIGJlIGZpbGxlZCBpbgorICoKKyAqIFJldHVybnMgQkFSIHBvc2l0aW9uIGluIGNvbmZpZyBzcGFjZSwgb3IgMCBpZiB0aGUgQkFSIGlzIGludmFsaWQuCisgKi8KK2ludCBwY2lfcmVzb3VyY2VfYmFyKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCByZXNubywgZW51bSBwY2lfYmFyX3R5cGUgKnR5cGUpCit7CisJaWYgKHJlc25vIDwgUENJX1JPTV9SRVNPVVJDRSkgeworCQkqdHlwZSA9IHBjaV9iYXJfdW5rbm93bjsKKwkJcmV0dXJuIFBDSV9CQVNFX0FERFJFU1NfMCArIDQgKiByZXNubzsKKwl9IGVsc2UgaWYgKHJlc25vID09IFBDSV9ST01fUkVTT1VSQ0UpIHsKKwkJKnR5cGUgPSBwY2lfYmFyX21lbTMyOworCQlyZXR1cm4gZGV2LT5yb21fYmFzZV9yZWc7CisJfQorCisJZGV2X2VycigmZGV2LT5kZXYsICJCQVI6IGludmFsaWQgcmVzb3VyY2UgIyVkXG4iLCByZXNubyk7CisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyB2b2lkIF9fZGV2aW5pdCBwY2lfbm9fZG9tYWlucyh2b2lkKQogewogI2lmZGVmIENPTkZJR19QQ0lfRE9NQUlOUwpAQCAtMjAyOSw2ICsyMzA5LDE5IEBACiAjZW5kaWYKIH0KIAorLyoqCisgKiBwY2lfZXh0X2NmZ19lbmFibGVkIC0gY2FuIHdlIGFjY2VzcyBleHRlbmRlZCBQQ0kgY29uZmlnIHNwYWNlPworICogQGRldjogVGhlIFBDSSBkZXZpY2Ugb2YgdGhlIHJvb3QgYnJpZGdlLgorICoKKyAqIFJldHVybnMgMSBpZiB3ZSBjYW4gYWNjZXNzIFBDSSBleHRlbmRlZCBjb25maWcgc3BhY2UgKG9mZnNldHMKKyAqIGdyZWF0ZXIgdGhhbiAweGZmKS4gVGhpcyBpcyB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbi4gQXJjaGl0ZWN0dXJlCisgKiBpbXBsZW1lbnRhdGlvbnMgY2FuIG92ZXJyaWRlIHRoaXMuCisgKi8KK2ludCBfX2F0dHJpYnV0ZV9fICgod2VhaykpIHBjaV9leHRfY2ZnX2F2YWlsKHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJcmV0dXJuIDE7Cit9CisKIHN0YXRpYyBpbnQgX19kZXZpbml0IHBjaV9pbml0KHZvaWQpCiB7CiAJc3RydWN0IHBjaV9kZXYgKmRldiA9IE5VTEw7CkBAIC0yMDM3LDggKzIzMzAsNiBAQAogCQlwY2lfZml4dXBfZGV2aWNlKHBjaV9maXh1cF9maW5hbCwgZGV2KTsKIAl9CiAKLQltc2lfaW5pdCgpOwotCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTIwODMsMTEgKzIzNzQsMTUgQEAKIEVYUE9SVF9TWU1CT0wocGNpX2J1c19maW5kX2NhcGFiaWxpdHkpOwogRVhQT1JUX1NZTUJPTChwY2lfcmVsZWFzZV9yZWdpb25zKTsKIEVYUE9SVF9TWU1CT0wocGNpX3JlcXVlc3RfcmVnaW9ucyk7CitFWFBPUlRfU1lNQk9MKHBjaV9yZXF1ZXN0X3JlZ2lvbnNfZXhjbHVzaXZlKTsKIEVYUE9SVF9TWU1CT0wocGNpX3JlbGVhc2VfcmVnaW9uKTsKIEVYUE9SVF9TWU1CT0wocGNpX3JlcXVlc3RfcmVnaW9uKTsKK0VYUE9SVF9TWU1CT0wocGNpX3JlcXVlc3RfcmVnaW9uX2V4Y2x1c2l2ZSk7CiBFWFBPUlRfU1lNQk9MKHBjaV9yZWxlYXNlX3NlbGVjdGVkX3JlZ2lvbnMpOwogRVhQT1JUX1NZTUJPTChwY2lfcmVxdWVzdF9zZWxlY3RlZF9yZWdpb25zKTsKK0VYUE9SVF9TWU1CT0wocGNpX3JlcXVlc3Rfc2VsZWN0ZWRfcmVnaW9uc19leGNsdXNpdmUpOwogRVhQT1JUX1NZTUJPTChwY2lfc2V0X21hc3Rlcik7CitFWFBPUlRfU1lNQk9MKHBjaV9jbGVhcl9tYXN0ZXIpOwogRVhQT1JUX1NZTUJPTChwY2lfc2V0X213aSk7CiBFWFBPUlRfU1lNQk9MKHBjaV90cnlfc2V0X213aSk7CiBFWFBPUlRfU1lNQk9MKHBjaV9jbGVhcl9td2kpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvcGNpLmggYi9kcml2ZXJzL3BjaS9wY2kuaAppbmRleCA5ZGU4N2U5Li4xMzUxYmI0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9wY2kuaAorKysgYi9kcml2ZXJzL3BjaS9wY2kuaApAQCAtMTAsNiArMTAsMTAgQEAKIGV4dGVybiBpbnQgcGNpX2NyZWF0ZV9zeXNmc19kZXZfZmlsZXMoc3RydWN0IHBjaV9kZXYgKnBkZXYpOwogZXh0ZXJuIHZvaWQgcGNpX3JlbW92ZV9zeXNmc19kZXZfZmlsZXMoc3RydWN0IHBjaV9kZXYgKnBkZXYpOwogZXh0ZXJuIHZvaWQgcGNpX2NsZWFudXBfcm9tKHN0cnVjdCBwY2lfZGV2ICpkZXYpOworI2lmZGVmIEhBVkVfUENJX01NQVAKK2V4dGVybiBpbnQgcGNpX21tYXBfZml0cyhzdHJ1Y3QgcGNpX2RldiAqcGRldiwgaW50IHJlc25vLAorCQkJIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKTsKKyNlbmRpZgogCiAvKioKICAqIEZpcm13YXJlIFBNIGNhbGxiYWNrcwpAQCAtNDAsNyArNDQsMTEgQEAKIH07CiAKIGV4dGVybiBpbnQgcGNpX3NldF9wbGF0Zm9ybV9wbShzdHJ1Y3QgcGNpX3BsYXRmb3JtX3BtX29wcyAqb3BzKTsKK2V4dGVybiB2b2lkIHBjaV91cGRhdGVfY3VycmVudF9zdGF0ZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBwY2lfcG93ZXJfdCBzdGF0ZSk7CitleHRlcm4gdm9pZCBwY2lfZGlzYWJsZV9lbmFibGVkX2RldmljZShzdHJ1Y3QgcGNpX2RldiAqZGV2KTsKIGV4dGVybiB2b2lkIHBjaV9wbV9pbml0KHN0cnVjdCBwY2lfZGV2ICpkZXYpOworZXh0ZXJuIHZvaWQgcGxhdGZvcm1fcGNpX3dha2V1cF9pbml0KHN0cnVjdCBwY2lfZGV2ICpkZXYpOworZXh0ZXJuIHZvaWQgcGNpX2FsbG9jYXRlX2NhcF9zYXZlX2J1ZmZlcnMoc3RydWN0IHBjaV9kZXYgKmRldik7CiAKIGV4dGVybiBpbnQgcGNpX3VzZXJfcmVhZF9jb25maWdfYnl0ZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgd2hlcmUsIHU4ICp2YWwpOwogZXh0ZXJuIGludCBwY2lfdXNlcl9yZWFkX2NvbmZpZ193b3JkKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCB3aGVyZSwgdTE2ICp2YWwpOwpAQCAtNTAsMTQgKzU4LDE0IEBACiBleHRlcm4gaW50IHBjaV91c2VyX3dyaXRlX2NvbmZpZ19kd29yZChzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgd2hlcmUsIHUzMiB2YWwpOwogCiBzdHJ1Y3QgcGNpX3ZwZF9vcHMgewotCWludCAoKnJlYWQpKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCBwb3MsIGludCBzaXplLCBjaGFyICpidWYpOwotCWludCAoKndyaXRlKShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgcG9zLCBpbnQgc2l6ZSwgY29uc3QgY2hhciAqYnVmKTsKKwlzc2l6ZV90ICgqcmVhZCkoc3RydWN0IHBjaV9kZXYgKmRldiwgbG9mZl90IHBvcywgc2l6ZV90IGNvdW50LCB2b2lkICpidWYpOworCXNzaXplX3QgKCp3cml0ZSkoc3RydWN0IHBjaV9kZXYgKmRldiwgbG9mZl90IHBvcywgc2l6ZV90IGNvdW50LCBjb25zdCB2b2lkICpidWYpOwogCXZvaWQgKCpyZWxlYXNlKShzdHJ1Y3QgcGNpX2RldiAqZGV2KTsKIH07CiAKIHN0cnVjdCBwY2lfdnBkIHsKIAl1bnNpZ25lZCBpbnQgbGVuOwotCXN0cnVjdCBwY2lfdnBkX29wcyAqb3BzOworCWNvbnN0IHN0cnVjdCBwY2lfdnBkX29wcyAqb3BzOwogCXN0cnVjdCBiaW5fYXR0cmlidXRlICphdHRyOyAvKiBkZXNjcmlwdG9yIGZvciBzeXNmcyBWUEQgZW50cnkgKi8KIH07CiAKQEAgLTk4LDExICsxMDYsOSBAQAogI2lmZGVmIENPTkZJR19QQ0lfTVNJCiB2b2lkIHBjaV9ub19tc2kodm9pZCk7CiBleHRlcm4gdm9pZCBwY2lfbXNpX2luaXRfcGNpX2RldihzdHJ1Y3QgcGNpX2RldiAqZGV2KTsKLWV4dGVybiB2b2lkIF9fZGV2aW5pdCBtc2lfaW5pdCh2b2lkKTsKICNlbHNlCiBzdGF0aWMgaW5saW5lIHZvaWQgcGNpX25vX21zaSh2b2lkKSB7IH0KIHN0YXRpYyBpbmxpbmUgdm9pZCBwY2lfbXNpX2luaXRfcGNpX2RldihzdHJ1Y3QgcGNpX2RldiAqZGV2KSB7IH0KLXN0YXRpYyBpbmxpbmUgdm9pZCBtc2lfaW5pdCh2b2lkKSB7IH0KICNlbmRpZgogCiAjaWZkZWYgQ09ORklHX1BDSUVBRVIKQEAgLTE1OSwxNiArMTY1LDI4IEBACiB9OwogI2RlZmluZSB0b19wY2lfc2xvdF9hdHRyKHMpIGNvbnRhaW5lcl9vZihzLCBzdHJ1Y3QgcGNpX3Nsb3RfYXR0cmlidXRlLCBhdHRyKQogCitlbnVtIHBjaV9iYXJfdHlwZSB7CisJcGNpX2Jhcl91bmtub3duLAkvKiBTdGFuZGFyZCBQQ0kgQkFSIHByb2JlICovCisJcGNpX2Jhcl9pbywJCS8qIEFuIGlvIHBvcnQgQkFSICovCisJcGNpX2Jhcl9tZW0zMiwJCS8qIEEgMzItYml0IG1lbW9yeSBCQVIgKi8KKwlwY2lfYmFyX21lbTY0LAkJLyogQSA2NC1iaXQgbWVtb3J5IEJBUiAqLworfTsKKworZXh0ZXJuIGludCBfX3BjaV9yZWFkX2Jhc2Uoc3RydWN0IHBjaV9kZXYgKmRldiwgZW51bSBwY2lfYmFyX3R5cGUgdHlwZSwKKwkJCQlzdHJ1Y3QgcmVzb3VyY2UgKnJlcywgdW5zaWduZWQgaW50IHJlZyk7CitleHRlcm4gaW50IHBjaV9yZXNvdXJjZV9iYXIoc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IHJlc25vLAorCQkJICAgIGVudW0gcGNpX2Jhcl90eXBlICp0eXBlKTsKK2V4dGVybiBpbnQgcGNpX2J1c19hZGRfY2hpbGQoc3RydWN0IHBjaV9idXMgKmJ1cyk7CiBleHRlcm4gdm9pZCBwY2lfZW5hYmxlX2FyaShzdHJ1Y3QgcGNpX2RldiAqZGV2KTsKIC8qKgogICogcGNpX2FyaV9lbmFibGVkIC0gcXVlcnkgQVJJIGZvcndhcmRpbmcgc3RhdHVzCi0gKiBAZGV2OiB0aGUgUENJIGRldmljZQorICogQGJ1czogdGhlIFBDSSBidXMKICAqCiAgKiBSZXR1cm5zIDEgaWYgQVJJIGZvcndhcmRpbmcgaXMgZW5hYmxlZCwgb3IgMCBpZiBub3QgZW5hYmxlZDsKICAqLwotc3RhdGljIGlubGluZSBpbnQgcGNpX2FyaV9lbmFibGVkKHN0cnVjdCBwY2lfZGV2ICpkZXYpCitzdGF0aWMgaW5saW5lIGludCBwY2lfYXJpX2VuYWJsZWQoc3RydWN0IHBjaV9idXMgKmJ1cykKIHsKLQlyZXR1cm4gZGV2LT5hcmlfZW5hYmxlZDsKKwlyZXR1cm4gYnVzLT5zZWxmICYmIGJ1cy0+c2VsZi0+YXJpX2VuYWJsZWQ7CiB9CiAKICNlbmRpZiAvKiBEUklWRVJTX1BDSV9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9wY2llL2Flci9hZXJkcnZfYWNwaS5jIGIvZHJpdmVycy9wY2kvcGNpZS9hZXIvYWVyZHJ2X2FjcGkuYwppbmRleCA2ZGQ3YjEzLi5lYmNlMjZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9wY2llL2Flci9hZXJkcnZfYWNwaS5jCisrKyBiL2RyaXZlcnMvcGNpL3BjaWUvYWVyL2FlcmRydl9hY3BpLmMKQEAgLTM4LDcgKzM4LDYgQEAKIAogCWhhbmRsZSA9IGFjcGlfZmluZF9yb290X2JyaWRnZV9oYW5kbGUocGRldik7CiAJaWYgKGhhbmRsZSkgewotCQlwY2llX29zY19zdXBwb3J0X3NldChPU0NfRVhUX1BDSV9DT05GSUdfU1VQUE9SVCk7CiAJCXN0YXR1cyA9IHBjaV9vc2NfY29udHJvbF9zZXQoaGFuZGxlLAogCQkJCQlPU0NfUENJX0VYUFJFU1NfQUVSX0NPTlRST0wgfAogCQkJCQlPU0NfUENJX0VYUFJFU1NfQ0FQX1NUUlVDVFVSRV9DT05UUk9MKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3BjaWUvYWVyL2FlcmRydl9lcnJwcmludC5jIGIvZHJpdmVycy9wY2kvcGNpZS9hZXIvYWVyZHJ2X2VycnByaW50LmMKaW5kZXggMzkzM2Q0ZjMuLjBmYzI5YWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL3BjaWUvYWVyL2FlcmRydl9lcnJwcmludC5jCisrKyBiL2RyaXZlcnMvcGNpL3BjaWUvYWVyL2FlcmRydl9lcnJwcmludC5jCkBAIC0yMzMsNyArMjMzLDcgQEAKIAogCQlpZiAoaW5mby0+ZmxhZ3MgJiBBRVJfVExQX0hFQURFUl9WQUxJRF9GTEFHKSB7CiAJCQl1bnNpZ25lZCBjaGFyICp0bHAgPSAodW5zaWduZWQgY2hhciAqKSAmaW5mby0+dGxwOwotCQkJcHJpbnRrKCIlc1RMQiBIZWFkZXI6XG4iLCBsb2dsZXZlbCk7CisJCQlwcmludGsoIiVzVExQIEhlYWRlcjpcbiIsIGxvZ2xldmVsKTsKIAkJCXByaW50aygiJXMlMDJ4JTAyeCUwMnglMDJ4ICUwMnglMDJ4JTAyeCUwMngiCiAJCQkJIiAlMDJ4JTAyeCUwMnglMDJ4ICUwMnglMDJ4JTAyeCUwMnhcbiIsCiAJCQkJbG9nbGV2ZWwsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9wY2llL2FzcG0uYyBiL2RyaXZlcnMvcGNpL3BjaWUvYXNwbS5jCmluZGV4IDlhYWQ2MDguLjU4NmI2ZjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL3BjaWUvYXNwbS5jCisrKyBiL2RyaXZlcnMvcGNpL3BjaWUvYXNwbS5jCkBAIC0xNyw2ICsxNyw3IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9wY2ktYXNwbS5oPgogI2luY2x1ZGUgIi4uL3BjaS5oIgogCkBAIC0zMyw2ICszNCwxMSBAQAogc3RydWN0IHBjaWVfbGlua19zdGF0ZSB7CiAJc3RydWN0IGxpc3RfaGVhZCBzaWJpbGluZzsKIAlzdHJ1Y3QgcGNpX2RldiAqcGRldjsKKwlib29sIGRvd25zdHJlYW1faGFzX3N3aXRjaDsKKworCXN0cnVjdCBwY2llX2xpbmtfc3RhdGUgKnBhcmVudDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGNoaWxkcmVuOworCXN0cnVjdCBsaXN0X2hlYWQgbGluazsKIAogCS8qIEFTUE0gc3RhdGUgKi8KIAl1bnNpZ25lZCBpbnQgc3VwcG9ydF9zdGF0ZTsKQEAgLTcwLDYgKzc2LDggQEAKIAlbUE9MSUNZX1BPV0VSU0FWRV0gPSAicG93ZXJzYXZlIgogfTsKIAorI2RlZmluZSBMSU5LX1JFVFJBSU5fVElNRU9VVCBIWgorCiBzdGF0aWMgaW50IHBvbGljeV90b19hc3BtX3N0YXRlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQogewogCXN0cnVjdCBwY2llX2xpbmtfc3RhdGUgKmxpbmtfc3RhdGUgPSBwZGV2LT5saW5rX3N0YXRlOwpAQCAtMTI1LDcgKzEzMyw3IEBACiAJbGlua19zdGF0ZS0+Y2xrX3BtX2VuYWJsZWQgPSAhIWVuYWJsZTsKIH0KIAotc3RhdGljIHZvaWQgcGNpZV9jaGVja19jbG9ja19wbShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3N0YXRpYyB2b2lkIHBjaWVfY2hlY2tfY2xvY2tfcG0oc3RydWN0IHBjaV9kZXYgKnBkZXYsIGludCBibGFja2xpc3QpCiB7CiAJaW50IHBvczsKIAl1MzIgcmVnMzI7CkBAIC0xNDksMTAgKzE1NywyNiBAQAogCQlpZiAoIShyZWcxNiAmIFBDSV9FWFBfTE5LQ1RMX0NMS1JFUV9FTikpCiAJCQllbmFibGVkID0gMDsKIAl9Ci0JbGlua19zdGF0ZS0+Y2xrX3BtX2NhcGFibGUgPSBjYXBhYmxlOwogCWxpbmtfc3RhdGUtPmNsa19wbV9lbmFibGVkID0gZW5hYmxlZDsKIAlsaW5rX3N0YXRlLT5iaW9zX2Nsa19zdGF0ZSA9IGVuYWJsZWQ7Ci0JcGNpZV9zZXRfY2xvY2tfcG0ocGRldiwgcG9saWN5X3RvX2Nsa3BtX3N0YXRlKHBkZXYpKTsKKwlpZiAoIWJsYWNrbGlzdCkgeworCQlsaW5rX3N0YXRlLT5jbGtfcG1fY2FwYWJsZSA9IGNhcGFibGU7CisJCXBjaWVfc2V0X2Nsb2NrX3BtKHBkZXYsIHBvbGljeV90b19jbGtwbV9zdGF0ZShwZGV2KSk7CisJfSBlbHNlIHsKKwkJbGlua19zdGF0ZS0+Y2xrX3BtX2NhcGFibGUgPSAwOworCQlwY2llX3NldF9jbG9ja19wbShwZGV2LCAwKTsKKwl9Cit9CisKK3N0YXRpYyBib29sIHBjaWVfYXNwbV9kb3duc3RyZWFtX2hhc19zd2l0Y2goc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IHBjaV9kZXYgKmNoaWxkX2RldjsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoY2hpbGRfZGV2LCAmcGRldi0+c3Vib3JkaW5hdGUtPmRldmljZXMsIGJ1c19saXN0KSB7CisJCWlmIChjaGlsZF9kZXYtPnBjaWVfdHlwZSA9PSBQQ0lfRVhQX1RZUEVfVVBTVFJFQU0pCisJCQlyZXR1cm4gdHJ1ZTsKKwl9CisJcmV0dXJuIGZhbHNlOwogfQogCiAvKgpAQCAtMjE3LDE2ICsyNDEsMTggQEAKIAlwY2lfd3JpdGVfY29uZmlnX3dvcmQocGRldiwgcG9zICsgUENJX0VYUF9MTktDVEwsIHJlZzE2KTsKIAogCS8qIFdhaXQgZm9yIGxpbmsgdHJhaW5pbmcgZW5kICovCi0JLyogYnJlYWsgb3V0IGFmdGVyIHdhaXRpbmcgZm9yIDEgc2Vjb25kICovCisJLyogYnJlYWsgb3V0IGFmdGVyIHdhaXRpbmcgZm9yIHRpbWVvdXQgKi8KIAlzdGFydF9qaWZmaWVzID0gamlmZmllczsKLQl3aGlsZSAoKGppZmZpZXMgLSBzdGFydF9qaWZmaWVzKSA8IEhaKSB7CisJZm9yICg7OykgewogCQlwY2lfcmVhZF9jb25maWdfd29yZChwZGV2LCBwb3MgKyBQQ0lfRVhQX0xOS1NUQSwgJnJlZzE2KTsKIAkJaWYgKCEocmVnMTYgJiBQQ0lfRVhQX0xOS1NUQV9MVCkpCiAJCQlicmVhazsKLQkJY3B1X3JlbGF4KCk7CisJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHN0YXJ0X2ppZmZpZXMgKyBMSU5LX1JFVFJBSU5fVElNRU9VVCkpCisJCQlicmVhazsKKwkJbXNsZWVwKDEpOwogCX0KIAkvKiB0cmFpbmluZyBmYWlsZWQgLT4gcmVjb3ZlciAqLwotCWlmICgoamlmZmllcyAtIHN0YXJ0X2ppZmZpZXMpID49IEhaKSB7CisJaWYgKHJlZzE2ICYgUENJX0VYUF9MTktTVEFfTFQpIHsKIAkJZGV2X3ByaW50ayAoS0VSTl9FUlIsICZwZGV2LT5kZXYsICJBU1BNOiBDb3VsZCBub3QgY29uZmlndXJlIgogCQkJICAgICIgY29tbW9uIGNsb2NrXG4iKTsKIAkJaSA9IDA7CkBAIC00MTksOSArNDQ1LDkgQEAKIHsKIAlzdHJ1Y3QgcGNpX2RldiAqY2hpbGRfZGV2OwogCi0JLyogSWYgbm8gY2hpbGQsIGRpc2FibGUgdGhlIGxpbmsgKi8KKwkvKiBJZiBubyBjaGlsZCwgaWdub3JlIHRoZSBsaW5rICovCiAJaWYgKGxpc3RfZW1wdHkoJnBkZXYtPnN1Ym9yZGluYXRlLT5kZXZpY2VzKSkKLQkJcmV0dXJuIDA7CisJCXJldHVybiBzdGF0ZTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNoaWxkX2RldiwgJnBkZXYtPnN1Ym9yZGluYXRlLT5kZXZpY2VzLCBidXNfbGlzdCkgewogCQlpZiAoY2hpbGRfZGV2LT5wY2llX3R5cGUgPT0gUENJX0VYUF9UWVBFX1BDSV9CUklER0UpIHsKIAkJCS8qCkBAIC00NjIsNiArNDg4LDkgQEAKIAlpbnQgdmFsaWQgPSAxOwogCXN0cnVjdCBwY2llX2xpbmtfc3RhdGUgKmxpbmtfc3RhdGUgPSBwZGV2LT5saW5rX3N0YXRlOwogCisJLyogSWYgbm8gY2hpbGQsIGRpc2FibGUgdGhlIGxpbmsgKi8KKwlpZiAobGlzdF9lbXB0eSgmcGRldi0+c3Vib3JkaW5hdGUtPmRldmljZXMpKQorCQlzdGF0ZSA9IDA7CiAJLyoKIAkgKiBpZiB0aGUgZG93bnN0cmVhbSBjb21wb25lbnQgaGFzIHBjaSBicmlkZ2UgZnVuY3Rpb24sIGRvbid0IGRvIEFTUE0KIAkgKiBub3cKQEAgLTQ5MywyMCArNTIyLDUyIEBACiAJbGlua19zdGF0ZS0+ZW5hYmxlZF9zdGF0ZSA9IHN0YXRlOwogfQogCitzdGF0aWMgc3RydWN0IHBjaWVfbGlua19zdGF0ZSAqZ2V0X3Jvb3RfcG9ydF9saW5rKHN0cnVjdCBwY2llX2xpbmtfc3RhdGUgKmxpbmspCit7CisJc3RydWN0IHBjaWVfbGlua19zdGF0ZSAqcm9vdF9wb3J0X2xpbmsgPSBsaW5rOworCXdoaWxlIChyb290X3BvcnRfbGluay0+cGFyZW50KQorCQlyb290X3BvcnRfbGluayA9IHJvb3RfcG9ydF9saW5rLT5wYXJlbnQ7CisJcmV0dXJuIHJvb3RfcG9ydF9saW5rOworfQorCisvKiBjaGVjayB0aGUgd2hvbGUgaGllcmFyY2h5LCBhbmQgY29uZmlndXJlIGVhY2ggbGluayBpbiB0aGUgaGllcmFyY2h5ICovCiBzdGF0aWMgdm9pZCBfX3BjaWVfYXNwbV9jb25maWd1cmVfbGlua19zdGF0ZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwKIAl1bnNpZ25lZCBpbnQgc3RhdGUpCiB7CiAJc3RydWN0IHBjaWVfbGlua19zdGF0ZSAqbGlua19zdGF0ZSA9IHBkZXYtPmxpbmtfc3RhdGU7CisJc3RydWN0IHBjaWVfbGlua19zdGF0ZSAqcm9vdF9wb3J0X2xpbmsgPSBnZXRfcm9vdF9wb3J0X2xpbmsobGlua19zdGF0ZSk7CisJc3RydWN0IHBjaWVfbGlua19zdGF0ZSAqbGVhZjsKIAotCWlmIChsaW5rX3N0YXRlLT5zdXBwb3J0X3N0YXRlID09IDApCi0JCXJldHVybjsKIAlzdGF0ZSAmPSBQQ0lFX0xJTktfU1RBVEVfTDBTfFBDSUVfTElOS19TVEFURV9MMTsKIAotCS8qIHN0YXRlIDAgbWVhbnMgZGlzYWJsaW5nIGFzcG0gKi8KLQlzdGF0ZSA9IHBjaWVfYXNwbV9jaGVja19zdGF0ZShwZGV2LCBzdGF0ZSk7CisJLyogY2hlY2sgYWxsIGxpbmtzIHdobyBoYXZlIHNwZWNpZmljIHJvb3QgcG9ydCBsaW5rICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeShsZWFmLCAmbGlua19saXN0LCBzaWJpbGluZykgeworCQlpZiAoIWxpc3RfZW1wdHkoJmxlYWYtPmNoaWxkcmVuKSB8fAorCQkJZ2V0X3Jvb3RfcG9ydF9saW5rKGxlYWYpICE9IHJvb3RfcG9ydF9saW5rKQorCQkJY29udGludWU7CisJCXN0YXRlID0gcGNpZV9hc3BtX2NoZWNrX3N0YXRlKGxlYWYtPnBkZXYsIHN0YXRlKTsKKwl9CisJLyogY2hlY2sgcm9vdCBwb3J0IGxpbmsgdG9vIGluIGNhc2UgaXQgaGFzbid0IGNoaWxkcmVuICovCisJc3RhdGUgPSBwY2llX2FzcG1fY2hlY2tfc3RhdGUocm9vdF9wb3J0X2xpbmstPnBkZXYsIHN0YXRlKTsKKwogCWlmIChsaW5rX3N0YXRlLT5lbmFibGVkX3N0YXRlID09IHN0YXRlKQogCQlyZXR1cm47Ci0JX19wY2llX2FzcG1fY29uZmlnX2xpbmsocGRldiwgc3RhdGUpOworCisJLyoKKwkgKiB3ZSBtdXN0IGNoYW5nZSB0aGUgaGllcmFyY2h5LiBTZWUgY29tbWVudHMgaW4KKwkgKiBfX3BjaWVfYXNwbV9jb25maWdfbGluayBmb3IgdGhlIG9yZGVyCisJICoqLworCWlmIChzdGF0ZSAmIFBDSUVfTElOS19TVEFURV9MMSkgeworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGxlYWYsICZsaW5rX2xpc3QsIHNpYmlsaW5nKSB7CisJCQlpZiAoZ2V0X3Jvb3RfcG9ydF9saW5rKGxlYWYpID09IHJvb3RfcG9ydF9saW5rKQorCQkJCV9fcGNpZV9hc3BtX2NvbmZpZ19saW5rKGxlYWYtPnBkZXYsIHN0YXRlKTsKKwkJfQorCX0gZWxzZSB7CisJCWxpc3RfZm9yX2VhY2hfZW50cnlfcmV2ZXJzZShsZWFmLCAmbGlua19saXN0LCBzaWJpbGluZykgeworCQkJaWYgKGdldF9yb290X3BvcnRfbGluayhsZWFmKSA9PSByb290X3BvcnRfbGluaykKKwkJCQlfX3BjaWVfYXNwbV9jb25maWdfbGluayhsZWFmLT5wZGV2LCBzdGF0ZSk7CisJCX0KKwl9CiB9CiAKIC8qCkBAIC01NzAsNiArNjMxLDcgQEAKIAl1bnNpZ25lZCBpbnQgc3RhdGU7CiAJc3RydWN0IHBjaWVfbGlua19zdGF0ZSAqbGlua19zdGF0ZTsKIAlpbnQgZXJyb3IgPSAwOworCWludCBibGFja2xpc3Q7CiAKIAlpZiAoYXNwbV9kaXNhYmxlZCB8fCAhcGRldi0+aXNfcGNpZSB8fCBwZGV2LT5saW5rX3N0YXRlKQogCQlyZXR1cm47CkBAIC01ODAsMjkgKzY0Miw1OCBAQAogCWlmIChsaXN0X2VtcHR5KCZwZGV2LT5zdWJvcmRpbmF0ZS0+ZGV2aWNlcykpCiAJCWdvdG8gb3V0OwogCi0JaWYgKHBjaWVfYXNwbV9zYW5pdHlfY2hlY2socGRldikpCi0JCWdvdG8gb3V0OworCWJsYWNrbGlzdCA9ICEhcGNpZV9hc3BtX3Nhbml0eV9jaGVjayhwZGV2KTsKIAogCW11dGV4X2xvY2soJmFzcG1fbG9jayk7CiAKIAlsaW5rX3N0YXRlID0ga3phbGxvYyhzaXplb2YoKmxpbmtfc3RhdGUpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWxpbmtfc3RhdGUpCiAJCWdvdG8gdW5sb2NrX291dDsKKworCWxpbmtfc3RhdGUtPmRvd25zdHJlYW1faGFzX3N3aXRjaCA9IHBjaWVfYXNwbV9kb3duc3RyZWFtX2hhc19zd2l0Y2gocGRldik7CisJSU5JVF9MSVNUX0hFQUQoJmxpbmtfc3RhdGUtPmNoaWxkcmVuKTsKKwlJTklUX0xJU1RfSEVBRCgmbGlua19zdGF0ZS0+bGluayk7CisJaWYgKHBkZXYtPmJ1cy0+c2VsZikgey8qIHRoaXMgaXMgYSBzd2l0Y2ggKi8KKwkJc3RydWN0IHBjaWVfbGlua19zdGF0ZSAqcGFyZW50X2xpbmtfc3RhdGU7CisKKwkJcGFyZW50X2xpbmtfc3RhdGUgPSBwZGV2LT5idXMtPnBhcmVudC0+c2VsZi0+bGlua19zdGF0ZTsKKwkJaWYgKCFwYXJlbnRfbGlua19zdGF0ZSkgeworCQkJa2ZyZWUobGlua19zdGF0ZSk7CisJCQlnb3RvIHVubG9ja19vdXQ7CisJCX0KKwkJbGlzdF9hZGQoJmxpbmtfc3RhdGUtPmxpbmssICZwYXJlbnRfbGlua19zdGF0ZS0+Y2hpbGRyZW4pOworCQlsaW5rX3N0YXRlLT5wYXJlbnQgPSBwYXJlbnRfbGlua19zdGF0ZTsKKwl9CisKIAlwZGV2LT5saW5rX3N0YXRlID0gbGlua19zdGF0ZTsKIAotCXBjaWVfYXNwbV9jb25maWd1cmVfY29tbW9uX2Nsb2NrKHBkZXYpOwotCi0JcGNpZV9hc3BtX2NhcF9pbml0KHBkZXYpOwotCi0JLyogY29uZmlnIGxpbmsgc3RhdGUgdG8gYXZvaWQgQklPUyBlcnJvciAqLwotCXN0YXRlID0gcGNpZV9hc3BtX2NoZWNrX3N0YXRlKHBkZXYsIHBvbGljeV90b19hc3BtX3N0YXRlKHBkZXYpKTsKLQlfX3BjaWVfYXNwbV9jb25maWdfbGluayhwZGV2LCBzdGF0ZSk7Ci0KLQlwY2llX2NoZWNrX2Nsb2NrX3BtKHBkZXYpOworCWlmICghYmxhY2tsaXN0KSB7CisJCXBjaWVfYXNwbV9jb25maWd1cmVfY29tbW9uX2Nsb2NrKHBkZXYpOworCQlwY2llX2FzcG1fY2FwX2luaXQocGRldik7CisJfSBlbHNlIHsKKwkJbGlua19zdGF0ZS0+ZW5hYmxlZF9zdGF0ZSA9IFBDSUVfTElOS19TVEFURV9MMFN8UENJRV9MSU5LX1NUQVRFX0wxOworCQlsaW5rX3N0YXRlLT5iaW9zX2FzcG1fc3RhdGUgPSAwOworCQkvKiBTZXQgc3VwcG9ydCBzdGF0ZSB0byAwLCBzbyB3ZSB3aWxsIGRpc2FibGUgQVNQTSBsYXRlciAqLworCQlsaW5rX3N0YXRlLT5zdXBwb3J0X3N0YXRlID0gMDsKKwl9CiAKIAlsaW5rX3N0YXRlLT5wZGV2ID0gcGRldjsKIAlsaXN0X2FkZCgmbGlua19zdGF0ZS0+c2liaWxpbmcsICZsaW5rX2xpc3QpOwogCisJaWYgKGxpbmtfc3RhdGUtPmRvd25zdHJlYW1faGFzX3N3aXRjaCkgeworCQkvKgorCQkgKiBJZiBsaW5rIGhhcyBzd2l0Y2gsIGRlbGF5IHRoZSBsaW5rIGNvbmZpZy4gVGhlIGxlYWYgbGluaworCQkgKiBpbml0aWFsaXphdGlvbiB3aWxsIGNvbmZpZyB0aGUgd2hvbGUgaGllcmFyY2h5LiBidXQgd2UgbXVzdAorCQkgKiBtYWtlIHN1cmUgQklPUyBkb2Vzbid0IHNldCB1bnN1cHBvcnRlZCBsaW5rIHN0YXRlCisJCSAqKi8KKwkJc3RhdGUgPSBwY2llX2FzcG1fY2hlY2tfc3RhdGUocGRldiwgbGlua19zdGF0ZS0+Ymlvc19hc3BtX3N0YXRlKTsKKwkJX19wY2llX2FzcG1fY29uZmlnX2xpbmsocGRldiwgc3RhdGUpOworCX0gZWxzZQorCQlfX3BjaWVfYXNwbV9jb25maWd1cmVfbGlua19zdGF0ZShwZGV2LAorCQkJcG9saWN5X3RvX2FzcG1fc3RhdGUocGRldikpOworCisJcGNpZV9jaGVja19jbG9ja19wbShwZGV2LCBibGFja2xpc3QpOworCiB1bmxvY2tfb3V0OgogCWlmIChlcnJvcikKIAkJZnJlZV9saW5rX3N0YXRlKHBkZXYpOwpAQCAtNjM1LDYgKzcyNiw3IEBACiAJLyogQWxsIGZ1bmN0aW9ucyBhcmUgcmVtb3ZlZCwgc28ganVzdCBkaXNhYmxlIEFTUE0gZm9yIHRoZSBsaW5rICovCiAJX19wY2llX2FzcG1fY29uZmlnX29uZV9kZXYocGFyZW50LCAwKTsKIAlsaXN0X2RlbCgmbGlua19zdGF0ZS0+c2liaWxpbmcpOworCWxpc3RfZGVsKCZsaW5rX3N0YXRlLT5saW5rKTsKIAkvKiBDbG9jayBQTSBpcyBmb3IgZW5kcG9pbnQgZGV2aWNlICovCiAKIAlmcmVlX2xpbmtfc3RhdGUocGFyZW50KTsKQEAgLTg1NywyNCArOTQ5LDE1IEBACiAJCWFzcG1fZGlzYWJsZWQgPSAxOwogfQogCi0jaWZkZWYgQ09ORklHX0FDUEkKLSNpbmNsdWRlIDxhY3BpL2FjcGlfYnVzLmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpLWFjcGkuaD4KLXN0YXRpYyB2b2lkIHBjaWVfYXNwbV9wbGF0Zm9ybV9pbml0KHZvaWQpCisvKioKKyAqIHBjaWVfYXNwbV9lbmFibGVkIC0gaXMgUENJZSBBU1BNIGVuYWJsZWQ/CisgKgorICogUmV0dXJucyB0cnVlIGlmIEFTUE0gaGFzIG5vdCBiZWVuIGRpc2FibGVkIGJ5IHRoZSBjb21tYW5kLWxpbmUgb3B0aW9uCisgKiBwY2llX2FzcG09b2ZmLgorICoqLworaW50IHBjaWVfYXNwbV9lbmFibGVkKHZvaWQpCiB7Ci0JcGNpZV9vc2Nfc3VwcG9ydF9zZXQoT1NDX0FDVElWRV9TVEFURV9QV1JfU1VQUE9SVHwKLQkJT1NDX0NMT0NLX1BXUl9DQVBBQklMSVRZX1NVUFBPUlQpOworICAgICAgIHJldHVybiAhYXNwbV9kaXNhYmxlZDsKIH0KLSNlbHNlCi1zdGF0aWMgaW5saW5lIHZvaWQgcGNpZV9hc3BtX3BsYXRmb3JtX2luaXQodm9pZCkgeyB9Ci0jZW5kaWYKK0VYUE9SVF9TWU1CT0wocGNpZV9hc3BtX2VuYWJsZWQpOwogCi1zdGF0aWMgaW50IF9faW5pdCBwY2llX2FzcG1faW5pdCh2b2lkKQotewotCWlmIChhc3BtX2Rpc2FibGVkKQotCQlyZXR1cm4gMDsKLQlwY2llX2FzcG1fcGxhdGZvcm1faW5pdCgpOwotCXJldHVybiAwOwotfQotCi1mc19pbml0Y2FsbChwY2llX2FzcG1faW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9wY2llL3BvcnRkcnZfYnVzLmMgYi9kcml2ZXJzL3BjaS9wY2llL3BvcnRkcnZfYnVzLmMKaW5kZXggMzU5ZmU1NS4uZWVjODliNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvcGNpZS9wb3J0ZHJ2X2J1cy5jCisrKyBiL2RyaXZlcnMvcGNpL3BjaWUvcG9ydGRydl9idXMuYwpAQCAtMTYsMTQgKzE2LDEwIEBACiAjaW5jbHVkZSAicG9ydGRydi5oIgogCiBzdGF0aWMgaW50IHBjaWVfcG9ydF9idXNfbWF0Y2goc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2KTsKLXN0YXRpYyBpbnQgcGNpZV9wb3J0X2J1c19zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldiwgcG1fbWVzc2FnZV90IHN0YXRlKTsKLXN0YXRpYyBpbnQgcGNpZV9wb3J0X2J1c19yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KTsKIAogc3RydWN0IGJ1c190eXBlIHBjaWVfcG9ydF9idXNfdHlwZSA9IHsKIAkubmFtZSAJCT0gInBjaV9leHByZXNzIiwKIAkubWF0Y2ggCQk9IHBjaWVfcG9ydF9idXNfbWF0Y2gsCi0JLnN1c3BlbmQJPSBwY2llX3BvcnRfYnVzX3N1c3BlbmQsCi0JLnJlc3VtZQkJPSBwY2llX3BvcnRfYnVzX3Jlc3VtZSwgCiB9OwogRVhQT1JUX1NZTUJPTF9HUEwocGNpZV9wb3J0X2J1c190eXBlKTsKIApAQCAtNDksMzIgKzQ1LDEyIEBACiAJcmV0dXJuIDE7CiB9CiAKLXN0YXRpYyBpbnQgcGNpZV9wb3J0X2J1c19zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQoraW50IHBjaWVfcG9ydF9idXNfcmVnaXN0ZXIodm9pZCkKIHsKLQlzdHJ1Y3QgcGNpZV9kZXZpY2UgKnBjaWVkZXY7Ci0Jc3RydWN0IHBjaWVfcG9ydF9zZXJ2aWNlX2RyaXZlciAqZHJpdmVyOwotCi0JaWYgKCFkZXYgfHwgIWRldi0+ZHJpdmVyKQotCQlyZXR1cm4gMDsKLQotCXBjaWVkZXYgPSB0b19wY2llX2RldmljZShkZXYpOwotIAlkcml2ZXIgPSB0b19zZXJ2aWNlX2RyaXZlcihkZXYtPmRyaXZlcik7Ci0JaWYgKGRyaXZlciAmJiBkcml2ZXItPnN1c3BlbmQpCi0JCWRyaXZlci0+c3VzcGVuZChwY2llZGV2LCBzdGF0ZSk7Ci0JcmV0dXJuIDA7CisJcmV0dXJuIGJ1c19yZWdpc3RlcigmcGNpZV9wb3J0X2J1c190eXBlKTsKIH0KIAotc3RhdGljIGludCBwY2llX3BvcnRfYnVzX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit2b2lkIHBjaWVfcG9ydF9idXNfdW5yZWdpc3Rlcih2b2lkKQogewotCXN0cnVjdCBwY2llX2RldmljZSAqcGNpZWRldjsKLQlzdHJ1Y3QgcGNpZV9wb3J0X3NlcnZpY2VfZHJpdmVyICpkcml2ZXI7Ci0KLQlpZiAoIWRldiB8fCAhZGV2LT5kcml2ZXIpCi0JCXJldHVybiAwOwotCi0JcGNpZWRldiA9IHRvX3BjaWVfZGV2aWNlKGRldik7Ci0gCWRyaXZlciA9IHRvX3NlcnZpY2VfZHJpdmVyKGRldi0+ZHJpdmVyKTsKLQlpZiAoZHJpdmVyICYmIGRyaXZlci0+cmVzdW1lKQotCQlkcml2ZXItPnJlc3VtZShwY2llZGV2KTsKLQlyZXR1cm4gMDsKKwlidXNfdW5yZWdpc3RlcigmcGNpZV9wb3J0X2J1c190eXBlKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3BjaWUvcG9ydGRydl9jb3JlLmMgYi9kcml2ZXJzL3BjaS9wY2llL3BvcnRkcnZfY29yZS5jCmluZGV4IDJlMDkxZTAuLjhiM2Y4YzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL3BjaWUvcG9ydGRydl9jb3JlLmMKKysrIGIvZHJpdmVycy9wY2kvcGNpZS9wb3J0ZHJ2X2NvcmUuYwpAQCAtMTksOTEgKzE5LDE1IEBACiAKIGV4dGVybiBpbnQgcGNpZV9tY2hfcXVpcms7CS8qIE1TSS1xdWlyayBJbmRpY2F0b3IgKi8KIAotc3RhdGljIGludCBwY2llX3BvcnRfcHJvYmVfc2VydmljZShzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IHBjaWVfZGV2aWNlICpwY2llZGV2OwotCXN0cnVjdCBwY2llX3BvcnRfc2VydmljZV9kcml2ZXIgKmRyaXZlcjsKLQlpbnQgc3RhdHVzOwotCi0JaWYgKCFkZXYgfHwgIWRldi0+ZHJpdmVyKQotCQlyZXR1cm4gLUVOT0RFVjsKLQotIAlkcml2ZXIgPSB0b19zZXJ2aWNlX2RyaXZlcihkZXYtPmRyaXZlcik7Ci0JaWYgKCFkcml2ZXIgfHwgIWRyaXZlci0+cHJvYmUpCi0JCXJldHVybiAtRU5PREVWOwotCi0JcGNpZWRldiA9IHRvX3BjaWVfZGV2aWNlKGRldik7Ci0Jc3RhdHVzID0gZHJpdmVyLT5wcm9iZShwY2llZGV2LCBkcml2ZXItPmlkX3RhYmxlKTsKLQlpZiAoIXN0YXR1cykgewotCQlkZXZfcHJpbnRrKEtFUk5fREVCVUcsIGRldiwgInNlcnZpY2UgZHJpdmVyICVzIGxvYWRlZFxuIiwKLQkJCWRyaXZlci0+bmFtZSk7Ci0JCWdldF9kZXZpY2UoZGV2KTsKLQl9Ci0JcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdGljIGludCBwY2llX3BvcnRfcmVtb3ZlX3NlcnZpY2Uoc3RydWN0IGRldmljZSAqZGV2KQotewotCXN0cnVjdCBwY2llX2RldmljZSAqcGNpZWRldjsKLQlzdHJ1Y3QgcGNpZV9wb3J0X3NlcnZpY2VfZHJpdmVyICpkcml2ZXI7Ci0KLQlpZiAoIWRldiB8fCAhZGV2LT5kcml2ZXIpCi0JCXJldHVybiAwOwotCi0JcGNpZWRldiA9IHRvX3BjaWVfZGV2aWNlKGRldik7Ci0gCWRyaXZlciA9IHRvX3NlcnZpY2VfZHJpdmVyKGRldi0+ZHJpdmVyKTsKLQlpZiAoZHJpdmVyICYmIGRyaXZlci0+cmVtb3ZlKSB7IAotCQlkZXZfcHJpbnRrKEtFUk5fREVCVUcsIGRldiwgInVubG9hZGluZyBzZXJ2aWNlIGRyaXZlciAlc1xuIiwKLQkJCWRyaXZlci0+bmFtZSk7Ci0JCWRyaXZlci0+cmVtb3ZlKHBjaWVkZXYpOwotCQlwdXRfZGV2aWNlKGRldik7Ci0JfQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBwY2llX3BvcnRfc2h1dGRvd25fc2VydmljZShzdHJ1Y3QgZGV2aWNlICpkZXYpIHt9Ci0KLXN0YXRpYyBpbnQgcGNpZV9wb3J0X3N1c3BlbmRfc2VydmljZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKLXsKLQlzdHJ1Y3QgcGNpZV9kZXZpY2UgKnBjaWVkZXY7Ci0Jc3RydWN0IHBjaWVfcG9ydF9zZXJ2aWNlX2RyaXZlciAqZHJpdmVyOwotCi0JaWYgKCFkZXYgfHwgIWRldi0+ZHJpdmVyKQotCQlyZXR1cm4gMDsKLQotCXBjaWVkZXYgPSB0b19wY2llX2RldmljZShkZXYpOwotIAlkcml2ZXIgPSB0b19zZXJ2aWNlX2RyaXZlcihkZXYtPmRyaXZlcik7Ci0JaWYgKGRyaXZlciAmJiBkcml2ZXItPnN1c3BlbmQpCi0JCWRyaXZlci0+c3VzcGVuZChwY2llZGV2LCBzdGF0ZSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgcGNpZV9wb3J0X3Jlc3VtZV9zZXJ2aWNlKHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgcGNpZV9kZXZpY2UgKnBjaWVkZXY7Ci0Jc3RydWN0IHBjaWVfcG9ydF9zZXJ2aWNlX2RyaXZlciAqZHJpdmVyOwotCi0JaWYgKCFkZXYgfHwgIWRldi0+ZHJpdmVyKQotCQlyZXR1cm4gMDsKLQotCXBjaWVkZXYgPSB0b19wY2llX2RldmljZShkZXYpOwotIAlkcml2ZXIgPSB0b19zZXJ2aWNlX2RyaXZlcihkZXYtPmRyaXZlcik7Ci0KLQlpZiAoZHJpdmVyICYmIGRyaXZlci0+cmVzdW1lKQotCQlkcml2ZXItPnJlc3VtZShwY2llZGV2KTsKLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIHJlbGVhc2VfcGNpZV9kZXZpY2UKLSAqCQotICoJQmVpbmcgaW52b2tlZCBhdXRvbWF0aWNhbGx5IHdoZW4gZGV2aWNlIGlzIGJlaW5nIHJlbW92ZWQgCi0gKglpbiByZXNwb25zZSB0byBkZXZpY2VfdW5yZWdpc3RlcihkZXYpIGNhbGwuCi0gKglSZWxlYXNlIGFsbCByZXNvdXJjZXMgYmVpbmcgY2xhaW1lZC4KKy8qKgorICogcmVsZWFzZV9wY2llX2RldmljZSAtIGZyZWUgUENJIEV4cHJlc3MgcG9ydCBzZXJ2aWNlIGRldmljZSBzdHJ1Y3R1cmUKKyAqIEBkZXY6IFBvcnQgc2VydmljZSBkZXZpY2UgdG8gcmVsZWFzZQorICoKKyAqIEludm9rZWQgYXV0b21hdGljYWxseSB3aGVuIGRldmljZSBpcyBiZWluZyByZW1vdmVkIGluIHJlc3BvbnNlIHRvCisgKiBkZXZpY2VfdW5yZWdpc3RlcihkZXYpLiAgUmVsZWFzZSBhbGwgcmVzb3VyY2VzIGJlaW5nIGNsYWltZWQuCiAgKi8KIHN0YXRpYyB2b2lkIHJlbGVhc2VfcGNpZV9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2KQogewotCWRldl9wcmludGsoS0VSTl9ERUJVRywgZGV2LCAiZnJlZSBwb3J0IHNlcnZpY2VcbiIpOwogCWtmcmVlKHRvX3BjaWVfZGV2aWNlKGRldikpOwkJCQogfQogCkBAIC0xMjgsNyArNTIsMTYgQEAKIAl9CiAJcmV0dXJuIHF1aXJrOwogfQotCQorCisvKioKKyAqIGFzc2lnbl9pbnRlcnJ1cHRfbW9kZSAtIGNob29zZSBpbnRlcnJ1cHQgbW9kZSBmb3IgUENJIEV4cHJlc3MgcG9ydCBzZXJ2aWNlcworICogICAgICAgICAgICAgICAgICAgICAgICAgKElOVHgsIE1TSS1YLCBNU0kpIGFuZCBzZXQgdXAgdmVjdG9ycworICogQGRldjogUENJIEV4cHJlc3MgcG9ydCB0byBoYW5kbGUKKyAqIEB2ZWN0b3JzOiBBcnJheSBvZiBpbnRlcnJ1cHQgdmVjdG9ycyB0byBwb3B1bGF0ZQorICogQG1hc2s6IEJpdG1hc2sgb2YgcG9ydCBjYXBhYmlsaXRpZXMgcmV0dXJuZWQgYnkgZ2V0X3BvcnRfZGV2aWNlX2NhcGFiaWxpdHkoKQorICoKKyAqIFJldHVybiB2YWx1ZTogSW50ZXJydXB0IG1vZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBwb3J0CisgKi8KIHN0YXRpYyBpbnQgYXNzaWduX2ludGVycnVwdF9tb2RlKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCAqdmVjdG9ycywgaW50IG1hc2spCiB7CiAJaW50IGksIHBvcywgbnZlYywgc3RhdHVzID0gLUVJTlZBTDsKQEAgLTE1MCw3ICs4Myw2IEBACiAJaWYgKHBvcykgewogCQlzdHJ1Y3QgbXNpeF9lbnRyeSBtc2l4X2VudHJpZXNbUENJRV9QT1JUX0RFVklDRV9NQVhTRVJWSUNFU10gPSAKIAkJCXt7MCwgMH0sIHswLCAxfSwgezAsIDJ9LCB7MCwgM319OwotCQlkZXZfaW5mbygmZGV2LT5kZXYsICJmb3VuZCBNU0ktWCBjYXBhYmlsaXR5XG4iKTsKIAkJc3RhdHVzID0gcGNpX2VuYWJsZV9tc2l4KGRldiwgbXNpeF9lbnRyaWVzLCBudmVjKTsKIAkJaWYgKCFzdGF0dXMpIHsKIAkJCWludCBqID0gMDsKQEAgLTE2NSw3ICs5Nyw2IEBACiAJaWYgKHN0YXR1cykgewogCQlwb3MgPSBwY2lfZmluZF9jYXBhYmlsaXR5KGRldiwgUENJX0NBUF9JRF9NU0kpOwogCQlpZiAocG9zKSB7Ci0JCQlkZXZfaW5mbygmZGV2LT5kZXYsICJmb3VuZCBNU0kgY2FwYWJpbGl0eVxuIik7CiAJCQlzdGF0dXMgPSBwY2lfZW5hYmxlX21zaShkZXYpOwogCQkJaWYgKCFzdGF0dXMpIHsKIAkJCQlpbnRlcnJ1cHRfbW9kZSA9IFBDSUVfUE9SVF9NU0lfTU9ERTsKQEAgLTE3Nyw2ICsxMDgsMTYgQEAKIAlyZXR1cm4gaW50ZXJydXB0X21vZGU7CiB9CiAKKy8qKgorICogZ2V0X3BvcnRfZGV2aWNlX2NhcGFiaWxpdHkgLSBkaXNjb3ZlciBjYXBhYmlsaXRpZXMgb2YgYSBQQ0kgRXhwcmVzcyBwb3J0CisgKiBAZGV2OiBQQ0kgRXhwcmVzcyBwb3J0IHRvIGV4YW1pbmUKKyAqCisgKiBUaGUgY2FwYWJpbGl0aWVzIGFyZSByZWFkIGZyb20gdGhlIHBvcnQncyBQQ0kgRXhwcmVzcyBjb25maWd1cmF0aW9uIHJlZ2lzdGVycworICogYXMgZGVzY3JpYmVkIGluIFBDSSBFeHByZXNzIEJhc2UgU3BlY2lmaWNhdGlvbiAxLjBhIHNlY3Rpb25zIDcuOC4yLCA3LjguOSBhbmQKKyAqIDcuOSAtIDcuMTEuCisgKgorICogUmV0dXJuIHZhbHVlOiBCaXRtYXNrIG9mIGRpc2NvdmVyZWQgcG9ydCBjYXBhYmlsaXRpZXMKKyAqLwogc3RhdGljIGludCBnZXRfcG9ydF9kZXZpY2VfY2FwYWJpbGl0eShzdHJ1Y3QgcGNpX2RldiAqZGV2KQogewogCWludCBzZXJ2aWNlcyA9IDAsIHBvczsKQEAgLTIwNCw2ICsxNDUsMTUgQEAKIAlyZXR1cm4gc2VydmljZXM7CiB9CiAKKy8qKgorICogcGNpZV9kZXZpY2VfaW5pdCAtIGluaXRpYWxpemUgUENJIEV4cHJlc3MgcG9ydCBzZXJ2aWNlIGRldmljZQorICogQGRldjogUG9ydCBzZXJ2aWNlIGRldmljZSB0byBpbml0aWFsaXplCisgKiBAcGFyZW50OiBQQ0kgRXhwcmVzcyBwb3J0IHRvIGFzc29jaWF0ZSB0aGUgc2VydmljZSBkZXZpY2Ugd2l0aAorICogQHBvcnRfdHlwZTogVHlwZSBvZiB0aGUgcG9ydAorICogQHNlcnZpY2VfdHlwZTogVHlwZSBvZiBzZXJ2aWNlIHRvIGFzc29jaWF0ZSB3aXRoIHRoZSBzZXJ2aWNlIGRldmljZQorICogQGlycTogSW50ZXJydXB0IHZlY3RvciB0byBhc3NvY2lhdGUgd2l0aCB0aGUgc2VydmljZSBkZXZpY2UKKyAqIEBpcnFfbW9kZTogSW50ZXJydXB0IG1vZGUgb2YgdGhlIHNlcnZpY2UgKElOVHgsIE1TSS1YLCBNU0kpCisgKi8KIHN0YXRpYyB2b2lkIHBjaWVfZGV2aWNlX2luaXQoc3RydWN0IHBjaV9kZXYgKnBhcmVudCwgc3RydWN0IHBjaWVfZGV2aWNlICpkZXYsIAogCWludCBwb3J0X3R5cGUsIGludCBzZXJ2aWNlX3R5cGUsIGludCBpcnEsIGludCBpcnFfbW9kZSkKIHsKQEAgLTIyNCwxMSArMTc0LDE5IEBACiAJZGV2aWNlLT5kcml2ZXIgPSBOVUxMOwogCWRldmljZS0+ZHJpdmVyX2RhdGEgPSBOVUxMOwogCWRldmljZS0+cmVsZWFzZSA9IHJlbGVhc2VfcGNpZV9kZXZpY2U7CS8qIGNhbGxiYWNrIHRvIGZyZWUgcGNpZSBkZXYgKi8KLQlzbnByaW50ZihkZXZpY2UtPmJ1c19pZCwgc2l6ZW9mKGRldmljZS0+YnVzX2lkKSwgIiVzOnBjaWUlMDJ4IiwKKwlkZXZfc2V0X25hbWUoZGV2aWNlLCAiJXM6cGNpZSUwMngiLAogCQkgcGNpX25hbWUocGFyZW50KSwgZ2V0X2Rlc2NyaXB0b3JfaWQocG9ydF90eXBlLCBzZXJ2aWNlX3R5cGUpKTsKIAlkZXZpY2UtPnBhcmVudCA9ICZwYXJlbnQtPmRldjsKIH0KIAorLyoqCisgKiBhbGxvY19wY2llX2RldmljZSAtIGFsbG9jYXRlIFBDSSBFeHByZXNzIHBvcnQgc2VydmljZSBkZXZpY2Ugc3RydWN0dXJlCisgKiBAcGFyZW50OiBQQ0kgRXhwcmVzcyBwb3J0IHRvIGFzc29jaWF0ZSB0aGUgc2VydmljZSBkZXZpY2Ugd2l0aAorICogQHBvcnRfdHlwZTogVHlwZSBvZiB0aGUgcG9ydAorICogQHNlcnZpY2VfdHlwZTogVHlwZSBvZiBzZXJ2aWNlIHRvIGFzc29jaWF0ZSB3aXRoIHRoZSBzZXJ2aWNlIGRldmljZQorICogQGlycTogSW50ZXJydXB0IHZlY3RvciB0byBhc3NvY2lhdGUgd2l0aCB0aGUgc2VydmljZSBkZXZpY2UKKyAqIEBpcnFfbW9kZTogSW50ZXJydXB0IG1vZGUgb2YgdGhlIHNlcnZpY2UgKElOVHgsIE1TSS1YLCBNU0kpCisgKi8KIHN0YXRpYyBzdHJ1Y3QgcGNpZV9kZXZpY2UqIGFsbG9jX3BjaWVfZGV2aWNlKHN0cnVjdCBwY2lfZGV2ICpwYXJlbnQsCiAJaW50IHBvcnRfdHlwZSwgaW50IHNlcnZpY2VfdHlwZSwgaW50IGlycSwgaW50IGlycV9tb2RlKQogewpAQCAtMjM5LDEwICsxOTcsMTMgQEAKIAkJcmV0dXJuIE5VTEw7CiAKIAlwY2llX2RldmljZV9pbml0KHBhcmVudCwgZGV2aWNlLCBwb3J0X3R5cGUsIHNlcnZpY2VfdHlwZSwgaXJxLGlycV9tb2RlKTsKLQlkZXZfcHJpbnRrKEtFUk5fREVCVUcsICZkZXZpY2UtPmRldmljZSwgImFsbG9jYXRlIHBvcnQgc2VydmljZVxuIik7CiAJcmV0dXJuIGRldmljZTsKIH0KIAorLyoqCisgKiBwY2llX3BvcnRfZGV2aWNlX3Byb2JlIC0gY2hlY2sgaWYgZGV2aWNlIGlzIGEgUENJIEV4cHJlc3MgcG9ydAorICogQGRldjogRGV2aWNlIHRvIGNoZWNrCisgKi8KIGludCBwY2llX3BvcnRfZGV2aWNlX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpkZXYpCiB7CiAJaW50IHBvcywgdHlwZTsKQEAgLTI2MCw2ICsyMjEsMTMgQEAKIAlyZXR1cm4gLUVOT0RFVjsKIH0KIAorLyoqCisgKiBwY2llX3BvcnRfZGV2aWNlX3JlZ2lzdGVyIC0gcmVnaXN0ZXIgUENJIEV4cHJlc3MgcG9ydAorICogQGRldjogUENJIEV4cHJlc3MgcG9ydCB0byByZWdpc3RlcgorICoKKyAqIEFsbG9jYXRlIHRoZSBwb3J0IGV4dGVuc2lvbiBzdHJ1Y3R1cmUgYW5kIHJlZ2lzdGVyIHNlcnZpY2VzIGFzc29jaWF0ZWQgd2l0aAorICogdGhlIHBvcnQuCisgKi8KIGludCBwY2llX3BvcnRfZGV2aWNlX3JlZ2lzdGVyKHN0cnVjdCBwY2lfZGV2ICpkZXYpCiB7CiAJc3RydWN0IHBjaWVfcG9ydF9kZXZpY2VfZXh0ICpwX2V4dDsKQEAgLTMyMyw2ICsyOTEsMTEgQEAKIAlyZXR1cm4gMDsKIH0KIAorLyoqCisgKiBwY2llX3BvcnRfZGV2aWNlX3N1c3BlbmQgLSBzdXNwZW5kIHBvcnQgc2VydmljZXMgYXNzb2NpYXRlZCB3aXRoIGEgUENJZSBwb3J0CisgKiBAZGV2OiBQQ0kgRXhwcmVzcyBwb3J0IHRvIGhhbmRsZQorICogQHN0YXRlOiBSZXByZXNlbnRhdGlvbiBvZiBzeXN0ZW0gcG93ZXIgbWFuYWdlbWVudCB0cmFuc2l0aW9uIGluIHByb2dyZXNzCisgKi8KIGludCBwY2llX3BvcnRfZGV2aWNlX3N1c3BlbmQoc3RydWN0IHBjaV9kZXYgKmRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQogewogCXJldHVybiBkZXZpY2VfZm9yX2VhY2hfY2hpbGQoJmRldi0+ZGV2LCAmc3RhdGUsIHN1c3BlbmRfaXRlcik7CkBAIC0zNDEsNiArMzE0LDEwIEBACiAJcmV0dXJuIDA7CiB9CiAKKy8qKgorICogcGNpZV9wb3J0X2RldmljZV9zdXNwZW5kIC0gcmVzdW1lIHBvcnQgc2VydmljZXMgYXNzb2NpYXRlZCB3aXRoIGEgUENJZSBwb3J0CisgKiBAZGV2OiBQQ0kgRXhwcmVzcyBwb3J0IHRvIGhhbmRsZQorICovCiBpbnQgcGNpZV9wb3J0X2RldmljZV9yZXN1bWUoc3RydWN0IHBjaV9kZXYgKmRldikKIHsKIAlyZXR1cm4gZGV2aWNlX2Zvcl9lYWNoX2NoaWxkKCZkZXYtPmRldiwgTlVMTCwgcmVzdW1lX2l0ZXIpOwpAQCAtMzYzLDYgKzM0MCwxMyBAQAogCXJldHVybiAwOwogfQogCisvKioKKyAqIHBjaWVfcG9ydF9kZXZpY2VfcmVtb3ZlIC0gdW5yZWdpc3RlciBQQ0kgRXhwcmVzcyBwb3J0IHNlcnZpY2UgZGV2aWNlcworICogQGRldjogUENJIEV4cHJlc3MgcG9ydCB0aGUgc2VydmljZSBkZXZpY2VzIHRvIHVucmVnaXN0ZXIgYXJlIGFzc29jaWF0ZWQgd2l0aAorICoKKyAqIFJlbW92ZSBQQ0kgRXhwcmVzcyBwb3J0IHNlcnZpY2UgZGV2aWNlcyBhc3NvY2lhdGVkIHdpdGggZ2l2ZW4gcG9ydCBhbmQKKyAqIGRpc2FibGUgTVNJLVggb3IgTVNJIGZvciB0aGUgcG9ydC4KKyAqLwogdm9pZCBwY2llX3BvcnRfZGV2aWNlX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqZGV2KQogewogCXN0cnVjdCBkZXZpY2UgKmRldmljZTsKQEAgLTM4NiwxNiArMzcwLDgwIEBACiAJCXBjaV9kaXNhYmxlX21zaShkZXYpOwogfQogCi1pbnQgcGNpZV9wb3J0X2J1c19yZWdpc3Rlcih2b2lkKQorLyoqCisgKiBwY2llX3BvcnRfcHJvYmVfc2VydmljZSAtIHByb2JlIGRyaXZlciBmb3IgZ2l2ZW4gUENJIEV4cHJlc3MgcG9ydCBzZXJ2aWNlCisgKiBAZGV2OiBQQ0kgRXhwcmVzcyBwb3J0IHNlcnZpY2UgZGV2aWNlIHRvIHByb2JlIGFnYWluc3QKKyAqCisgKiBJZiBQQ0kgRXhwcmVzcyBwb3J0IHNlcnZpY2UgZHJpdmVyIGlzIHJlZ2lzdGVyZWQgd2l0aAorICogcGNpZV9wb3J0X3NlcnZpY2VfcmVnaXN0ZXIoKSwgdGhpcyBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCBieSB0aGUgZHJpdmVyIGNvcmUKKyAqIHdoZW5ldmVyIG1hdGNoIGlzIGZvdW5kIGJldHdlZW4gdGhlIGRyaXZlciBhbmQgYSBwb3J0IHNlcnZpY2UgZGV2aWNlLgorICovCitzdGF0aWMgaW50IHBjaWVfcG9ydF9wcm9iZV9zZXJ2aWNlKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKLQlyZXR1cm4gYnVzX3JlZ2lzdGVyKCZwY2llX3BvcnRfYnVzX3R5cGUpOworCXN0cnVjdCBwY2llX2RldmljZSAqcGNpZWRldjsKKwlzdHJ1Y3QgcGNpZV9wb3J0X3NlcnZpY2VfZHJpdmVyICpkcml2ZXI7CisJaW50IHN0YXR1czsKKworCWlmICghZGV2IHx8ICFkZXYtPmRyaXZlcikKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlkcml2ZXIgPSB0b19zZXJ2aWNlX2RyaXZlcihkZXYtPmRyaXZlcik7CisJaWYgKCFkcml2ZXIgfHwgIWRyaXZlci0+cHJvYmUpCisJCXJldHVybiAtRU5PREVWOworCisJcGNpZWRldiA9IHRvX3BjaWVfZGV2aWNlKGRldik7CisJc3RhdHVzID0gZHJpdmVyLT5wcm9iZShwY2llZGV2LCBkcml2ZXItPmlkX3RhYmxlKTsKKwlpZiAoIXN0YXR1cykgeworCQlkZXZfcHJpbnRrKEtFUk5fREVCVUcsIGRldiwgInNlcnZpY2UgZHJpdmVyICVzIGxvYWRlZFxuIiwKKwkJCWRyaXZlci0+bmFtZSk7CisJCWdldF9kZXZpY2UoZGV2KTsKKwl9CisJcmV0dXJuIHN0YXR1czsKIH0KIAotdm9pZCBwY2llX3BvcnRfYnVzX3VucmVnaXN0ZXIodm9pZCkKKy8qKgorICogcGNpZV9wb3J0X3JlbW92ZV9zZXJ2aWNlIC0gZGV0YWNoIGRyaXZlciBmcm9tIGdpdmVuIFBDSSBFeHByZXNzIHBvcnQgc2VydmljZQorICogQGRldjogUENJIEV4cHJlc3MgcG9ydCBzZXJ2aWNlIGRldmljZSB0byBoYW5kbGUKKyAqCisgKiBJZiBQQ0kgRXhwcmVzcyBwb3J0IHNlcnZpY2UgZHJpdmVyIGlzIHJlZ2lzdGVyZWQgd2l0aAorICogcGNpZV9wb3J0X3NlcnZpY2VfcmVnaXN0ZXIoKSwgdGhpcyBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCBieSB0aGUgZHJpdmVyIGNvcmUKKyAqIHdoZW4gZGV2aWNlX3VucmVnaXN0ZXIoKSBpcyBjYWxsZWQgZm9yIHRoZSBwb3J0IHNlcnZpY2UgZGV2aWNlIGFzc29jaWF0ZWQKKyAqIHdpdGggdGhlIGRyaXZlci4KKyAqLworc3RhdGljIGludCBwY2llX3BvcnRfcmVtb3ZlX3NlcnZpY2Uoc3RydWN0IGRldmljZSAqZGV2KQogewotCWJ1c191bnJlZ2lzdGVyKCZwY2llX3BvcnRfYnVzX3R5cGUpOworCXN0cnVjdCBwY2llX2RldmljZSAqcGNpZWRldjsKKwlzdHJ1Y3QgcGNpZV9wb3J0X3NlcnZpY2VfZHJpdmVyICpkcml2ZXI7CisKKwlpZiAoIWRldiB8fCAhZGV2LT5kcml2ZXIpCisJCXJldHVybiAwOworCisJcGNpZWRldiA9IHRvX3BjaWVfZGV2aWNlKGRldik7CisJZHJpdmVyID0gdG9fc2VydmljZV9kcml2ZXIoZGV2LT5kcml2ZXIpOworCWlmIChkcml2ZXIgJiYgZHJpdmVyLT5yZW1vdmUpIHsKKwkJZGV2X3ByaW50ayhLRVJOX0RFQlVHLCBkZXYsICJ1bmxvYWRpbmcgc2VydmljZSBkcml2ZXIgJXNcbiIsCisJCQlkcml2ZXItPm5hbWUpOworCQlkcml2ZXItPnJlbW92ZShwY2llZGV2KTsKKwkJcHV0X2RldmljZShkZXYpOworCX0KKwlyZXR1cm4gMDsKIH0KIAorLyoqCisgKiBwY2llX3BvcnRfc2h1dGRvd25fc2VydmljZSAtIHNodXQgZG93biBnaXZlbiBQQ0kgRXhwcmVzcyBwb3J0IHNlcnZpY2UKKyAqIEBkZXY6IFBDSSBFeHByZXNzIHBvcnQgc2VydmljZSBkZXZpY2UgdG8gaGFuZGxlCisgKgorICogSWYgUENJIEV4cHJlc3MgcG9ydCBzZXJ2aWNlIGRyaXZlciBpcyByZWdpc3RlcmVkIHdpdGgKKyAqIHBjaWVfcG9ydF9zZXJ2aWNlX3JlZ2lzdGVyKCksIHRoaXMgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgYnkgdGhlIGRyaXZlciBjb3JlCisgKiB3aGVuIGRldmljZV9zaHV0ZG93bigpIGlzIGNhbGxlZCBmb3IgdGhlIHBvcnQgc2VydmljZSBkZXZpY2UgYXNzb2NpYXRlZAorICogd2l0aCB0aGUgZHJpdmVyLgorICovCitzdGF0aWMgdm9pZCBwY2llX3BvcnRfc2h1dGRvd25fc2VydmljZShzdHJ1Y3QgZGV2aWNlICpkZXYpIHt9CisKKy8qKgorICogcGNpZV9wb3J0X3NlcnZpY2VfcmVnaXN0ZXIgLSByZWdpc3RlciBQQ0kgRXhwcmVzcyBwb3J0IHNlcnZpY2UgZHJpdmVyCisgKiBAbmV3OiBQQ0kgRXhwcmVzcyBwb3J0IHNlcnZpY2UgZHJpdmVyIHRvIHJlZ2lzdGVyCisgKi8KIGludCBwY2llX3BvcnRfc2VydmljZV9yZWdpc3RlcihzdHJ1Y3QgcGNpZV9wb3J0X3NlcnZpY2VfZHJpdmVyICpuZXcpCiB7CiAJbmV3LT5kcml2ZXIubmFtZSA9IChjaGFyICopbmV3LT5uYW1lOwpAQCAtNDAzLDE1ICs0NTEsMTcgQEAKIAluZXctPmRyaXZlci5wcm9iZSA9IHBjaWVfcG9ydF9wcm9iZV9zZXJ2aWNlOwogCW5ldy0+ZHJpdmVyLnJlbW92ZSA9IHBjaWVfcG9ydF9yZW1vdmVfc2VydmljZTsKIAluZXctPmRyaXZlci5zaHV0ZG93biA9IHBjaWVfcG9ydF9zaHV0ZG93bl9zZXJ2aWNlOwotCW5ldy0+ZHJpdmVyLnN1c3BlbmQgPSBwY2llX3BvcnRfc3VzcGVuZF9zZXJ2aWNlOwotCW5ldy0+ZHJpdmVyLnJlc3VtZSA9IHBjaWVfcG9ydF9yZXN1bWVfc2VydmljZTsKIAogCXJldHVybiBkcml2ZXJfcmVnaXN0ZXIoJm5ldy0+ZHJpdmVyKTsKIH0KIAotdm9pZCBwY2llX3BvcnRfc2VydmljZV91bnJlZ2lzdGVyKHN0cnVjdCBwY2llX3BvcnRfc2VydmljZV9kcml2ZXIgKm5ldykKKy8qKgorICogcGNpZV9wb3J0X3NlcnZpY2VfdW5yZWdpc3RlciAtIHVucmVnaXN0ZXIgUENJIEV4cHJlc3MgcG9ydCBzZXJ2aWNlIGRyaXZlcgorICogQGRydjogUENJIEV4cHJlc3MgcG9ydCBzZXJ2aWNlIGRyaXZlciB0byB1bnJlZ2lzdGVyCisgKi8KK3ZvaWQgcGNpZV9wb3J0X3NlcnZpY2VfdW5yZWdpc3RlcihzdHJ1Y3QgcGNpZV9wb3J0X3NlcnZpY2VfZHJpdmVyICpkcnYpCiB7Ci0JZHJpdmVyX3VucmVnaXN0ZXIoJm5ldy0+ZHJpdmVyKTsKKwlkcml2ZXJfdW5yZWdpc3RlcigmZHJ2LT5kcml2ZXIpOwogfQogCiBFWFBPUlRfU1lNQk9MKHBjaWVfcG9ydF9zZXJ2aWNlX3JlZ2lzdGVyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3BjaWUvcG9ydGRydl9wY2kuYyBiL2RyaXZlcnMvcGNpL3BjaWUvcG9ydGRydl9wY2kuYwppbmRleCA1ODQ0MjJkLi45OWE5MTRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9wY2llL3BvcnRkcnZfcGNpLmMKKysrIGIvZHJpdmVycy9wY2kvcGNpZS9wb3J0ZHJ2X3BjaS5jCkBAIC00MSw3ICs0MSw2IEBACiB7CiAJaW50IHJldHZhbDsKIAotCXBjaV9yZXN0b3JlX3N0YXRlKGRldik7CiAJcmV0dmFsID0gcGNpX2VuYWJsZV9kZXZpY2UoZGV2KTsKIAlpZiAocmV0dmFsKQogCQlyZXR1cm4gcmV0dmFsOwpAQCAtNTIsMTEgKzUxLDE4IEBACiAjaWZkZWYgQ09ORklHX1BNCiBzdGF0aWMgaW50IHBjaWVfcG9ydGRydl9zdXNwZW5kKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKIHsKLQlpbnQgcmV0ID0gcGNpZV9wb3J0X2RldmljZV9zdXNwZW5kKGRldiwgc3RhdGUpOworCXJldHVybiBwY2llX3BvcnRfZGV2aWNlX3N1c3BlbmQoZGV2LCBzdGF0ZSk7CiAKLQlpZiAoIXJldCkKLQkJcmV0ID0gcGNpZV9wb3J0ZHJ2X3NhdmVfY29uZmlnKGRldik7Ci0JcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBwY2llX3BvcnRkcnZfc3VzcGVuZF9sYXRlKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3sKKwlyZXR1cm4gcGNpX3NhdmVfc3RhdGUoZGV2KTsKK30KKworc3RhdGljIGludCBwY2llX3BvcnRkcnZfcmVzdW1lX2Vhcmx5KHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJcmV0dXJuIHBjaV9yZXN0b3JlX3N0YXRlKGRldik7CiB9CiAKIHN0YXRpYyBpbnQgcGNpZV9wb3J0ZHJ2X3Jlc3VtZShzdHJ1Y3QgcGNpX2RldiAqZGV2KQpAQCAtNjYsNiArNzIsOCBAQAogfQogI2Vsc2UKICNkZWZpbmUgcGNpZV9wb3J0ZHJ2X3N1c3BlbmQgTlVMTAorI2RlZmluZSBwY2llX3BvcnRkcnZfc3VzcGVuZF9sYXRlIE5VTEwKKyNkZWZpbmUgcGNpZV9wb3J0ZHJ2X3Jlc3VtZV9lYXJseSBOVUxMCiAjZGVmaW5lIHBjaWVfcG9ydGRydl9yZXN1bWUgTlVMTAogI2VuZGlmCiAKQEAgLTIyMSw2ICsyMjksNyBAQAogCiAJLyogSWYgZmF0YWwsIHJlc3RvcmUgY2ZnIHNwYWNlIGZvciBwb3NzaWJsZSBsaW5rIHJlc2V0IGF0IHVwc3RyZWFtICovCiAJaWYgKGRldi0+ZXJyb3Jfc3RhdGUgPT0gcGNpX2NoYW5uZWxfaW9fZnJvemVuKSB7CisJCXBjaV9yZXN0b3JlX3N0YXRlKGRldik7CiAJCXBjaWVfcG9ydGRydl9yZXN0b3JlX2NvbmZpZyhkZXYpOwogCQlwY2lfZW5hYmxlX3BjaWVfZXJyb3JfcmVwb3J0aW5nKGRldik7CiAJfQpAQCAtMjgzLDYgKzI5Miw4IEBACiAJLnJlbW92ZQkJPSBwY2llX3BvcnRkcnZfcmVtb3ZlLAogCiAJLnN1c3BlbmQJPSBwY2llX3BvcnRkcnZfc3VzcGVuZCwKKwkuc3VzcGVuZF9sYXRlCT0gcGNpZV9wb3J0ZHJ2X3N1c3BlbmRfbGF0ZSwKKwkucmVzdW1lX2Vhcmx5CT0gcGNpZV9wb3J0ZHJ2X3Jlc3VtZV9lYXJseSwKIAkucmVzdW1lCQk9IHBjaWVfcG9ydGRydl9yZXN1bWUsCiAKIAkuZXJyX2hhbmRsZXIgCT0gJnBjaWVfcG9ydGRydl9lcnJfaGFuZGxlciwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3Byb2JlLmMgYi9kcml2ZXJzL3BjaS9wcm9iZS5jCmluZGV4IDViM2Y1OTMuLjU1ZWM0NGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL3Byb2JlLmMKKysrIGIvZHJpdmVycy9wY2kvcHJvYmUuYwpAQCAtNTEsMTIgKzUxLDEyIEBACiAJCQkJCWNoYXIgKmJ1ZikKIHsKIAlpbnQgcmV0OwotCWNwdW1hc2tfdCBjcHVtYXNrOworCWNvbnN0IHN0cnVjdCBjcHVtYXNrICpjcHVtYXNrOwogCi0JY3B1bWFzayA9IHBjaWJ1c190b19jcHVtYXNrKHRvX3BjaV9idXMoZGV2KSk7CisJY3B1bWFzayA9IGNwdW1hc2tfb2ZfcGNpYnVzKHRvX3BjaV9idXMoZGV2KSk7CiAJcmV0ID0gdHlwZT8KLQkJY3B1bGlzdF9zY25wcmludGYoYnVmLCBQQUdFX1NJWkUtMiwgJmNwdW1hc2spIDoKLQkJY3B1bWFza19zY25wcmludGYoYnVmLCBQQUdFX1NJWkUtMiwgJmNwdW1hc2spOworCQljcHVsaXN0X3NjbnByaW50ZihidWYsIFBBR0VfU0laRS0yLCBjcHVtYXNrKSA6CisJCWNwdW1hc2tfc2NucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLTIsIGNwdW1hc2spOwogCWJ1ZltyZXQrK10gPSAnXG4nOwogCWJ1ZltyZXRdID0gJ1wwJzsKIAlyZXR1cm4gcmV0OwpAQCAtMTM1LDEzICsxMzUsNiBAQAogCXJldHVybiBzaXplOwogfQogCi1lbnVtIHBjaV9iYXJfdHlwZSB7Ci0JcGNpX2Jhcl91bmtub3duLAkvKiBTdGFuZGFyZCBQQ0kgQkFSIHByb2JlICovCi0JcGNpX2Jhcl9pbywJCS8qIEFuIGlvIHBvcnQgQkFSICovCi0JcGNpX2Jhcl9tZW0zMiwJCS8qIEEgMzItYml0IG1lbW9yeSBCQVIgKi8KLQlwY2lfYmFyX21lbTY0LAkJLyogQSA2NC1iaXQgbWVtb3J5IEJBUiAqLwotfTsKLQogc3RhdGljIGlubGluZSBlbnVtIHBjaV9iYXJfdHlwZSBkZWNvZGVfYmFyKHN0cnVjdCByZXNvdXJjZSAqcmVzLCB1MzIgYmFyKQogewogCWlmICgoYmFyICYgUENJX0JBU0VfQUREUkVTU19TUEFDRSkgPT0gUENJX0JBU0VfQUREUkVTU19TUEFDRV9JTykgewpAQCAtMTU2LDExICsxNDksMTYgQEAKIAlyZXR1cm4gcGNpX2Jhcl9tZW0zMjsKIH0KIAotLyoKLSAqIElmIHRoZSB0eXBlIGlzIG5vdCB1bmtub3duLCB3ZSBhc3N1bWUgdGhhdCB0aGUgbG93ZXN0IGJpdCBpcyAnZW5hYmxlJy4KLSAqIFJldHVybnMgMSBpZiB0aGUgQkFSIHdhcyA2NC1iaXQgYW5kIDAgaWYgaXQgd2FzIDMyLWJpdC4KKy8qKgorICogcGNpX3JlYWRfYmFzZSAtIHJlYWQgYSBQQ0kgQkFSCisgKiBAZGV2OiB0aGUgUENJIGRldmljZQorICogQHR5cGU6IHR5cGUgb2YgdGhlIEJBUgorICogQHJlczogcmVzb3VyY2UgYnVmZmVyIHRvIGJlIGZpbGxlZCBpbgorICogQHBvczogQkFSIHBvc2l0aW9uIGluIHRoZSBjb25maWcgc3BhY2UKKyAqCisgKiBSZXR1cm5zIDEgaWYgdGhlIEJBUiBpcyA2NC1iaXQsIG9yIDAgaWYgMzItYml0LgogICovCi1zdGF0aWMgaW50IF9fcGNpX3JlYWRfYmFzZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBlbnVtIHBjaV9iYXJfdHlwZSB0eXBlLAoraW50IF9fcGNpX3JlYWRfYmFzZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBlbnVtIHBjaV9iYXJfdHlwZSB0eXBlLAogCQkJc3RydWN0IHJlc291cmNlICpyZXMsIHVuc2lnbmVkIGludCBwb3MpCiB7CiAJdTMyIGwsIHN6LCBtYXNrOwpAQCAtNDAwLDE5ICszOTgsMTcgQEAKIAlpZiAoIWNoaWxkKQogCQlyZXR1cm4gTlVMTDsKIAotCWNoaWxkLT5zZWxmID0gYnJpZGdlOwogCWNoaWxkLT5wYXJlbnQgPSBwYXJlbnQ7CiAJY2hpbGQtPm9wcyA9IHBhcmVudC0+b3BzOwogCWNoaWxkLT5zeXNkYXRhID0gcGFyZW50LT5zeXNkYXRhOwogCWNoaWxkLT5idXNfZmxhZ3MgPSBwYXJlbnQtPmJ1c19mbGFnczsKLQljaGlsZC0+YnJpZGdlID0gZ2V0X2RldmljZSgmYnJpZGdlLT5kZXYpOwogCiAJLyogaW5pdGlhbGl6ZSBzb21lIHBvcnRpb25zIG9mIHRoZSBidXMgZGV2aWNlLCBidXQgZG9uJ3QgcmVnaXN0ZXIgaXQKIAkgKiBub3cgYXMgdGhlIHBhcmVudCBpcyBub3QgcHJvcGVybHkgc2V0IHVwIHlldC4gIFRoaXMgZGV2aWNlIHdpbGwgZ2V0CiAJICogcmVnaXN0ZXJlZCBsYXRlciBpbiBwY2lfYnVzX2FkZF9kZXZpY2VzKCkKIAkgKi8KIAljaGlsZC0+ZGV2LmNsYXNzID0gJnBjaWJ1c19jbGFzczsKLQlzcHJpbnRmKGNoaWxkLT5kZXYuYnVzX2lkLCAiJTA0eDolMDJ4IiwgcGNpX2RvbWFpbl9ucihjaGlsZCksIGJ1c25yKTsKKwlkZXZfc2V0X25hbWUoJmNoaWxkLT5kZXYsICIlMDR4OiUwMngiLCBwY2lfZG9tYWluX25yKGNoaWxkKSwgYnVzbnIpOwogCiAJLyoKIAkgKiBTZXQgdXAgdGhlIHByaW1hcnksIHNlY29uZGFyeSBhbmQgc3Vib3JkaW5hdGUKQEAgLTQyMiw4ICs0MTgsMTQgQEAKIAljaGlsZC0+cHJpbWFyeSA9IHBhcmVudC0+c2Vjb25kYXJ5OwogCWNoaWxkLT5zdWJvcmRpbmF0ZSA9IDB4ZmY7CiAKKwlpZiAoIWJyaWRnZSkKKwkJcmV0dXJuIGNoaWxkOworCisJY2hpbGQtPnNlbGYgPSBicmlkZ2U7CisJY2hpbGQtPmJyaWRnZSA9IGdldF9kZXZpY2UoJmJyaWRnZS0+ZGV2KTsKKwogCS8qIFNldCB1cCBkZWZhdWx0IHJlc291cmNlIHBvaW50ZXJzIGFuZCBuYW1lcy4uICovCi0JZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCBQQ0lfQlJJREdFX1JFU09VUkNFX05VTTsgaSsrKSB7CiAJCWNoaWxkLT5yZXNvdXJjZVtpXSA9ICZicmlkZ2UtPnJlc291cmNlW1BDSV9CUklER0VfUkVTT1VSQ0VTK2ldOwogCQljaGlsZC0+cmVzb3VyY2VbaV0tPm5hbWUgPSBjaGlsZC0+bmFtZTsKIAl9CkBAIC05NTgsOCArOTYwLDEyIEBACiAJLyogTVNJL01TSS1YIGxpc3QgKi8KIAlwY2lfbXNpX2luaXRfcGNpX2RldihkZXYpOwogCisJLyogQnVmZmVycyBmb3Igc2F2aW5nIFBDSWUgYW5kIFBDSS1YIGNhcGFiaWxpdGllcyAqLworCXBjaV9hbGxvY2F0ZV9jYXBfc2F2ZV9idWZmZXJzKGRldik7CisKIAkvKiBQb3dlciBNYW5hZ2VtZW50ICovCiAJcGNpX3BtX2luaXQoZGV2KTsKKwlwbGF0Zm9ybV9wY2lfd2FrZXVwX2luaXQoZGV2KTsKIAogCS8qIFZpdGFsIFByb2R1Y3QgRGF0YSAqLwogCXBjaV92cGRfcGNpMjJfaW5pdChkZXYpOwpAQCAtMTEzMCw3ICsxMTM2LDcgQEAKIAltZW1zZXQoZGV2LCAwLCBzaXplb2YoKmRldikpOwogCWRldi0+cGFyZW50ID0gcGFyZW50OwogCWRldi0+cmVsZWFzZSA9IHBjaV9yZWxlYXNlX2J1c19icmlkZ2VfZGV2OwotCXNwcmludGYoZGV2LT5idXNfaWQsICJwY2klMDR4OiUwMngiLCBwY2lfZG9tYWluX25yKGIpLCBidXMpOworCWRldl9zZXRfbmFtZShkZXYsICJwY2klMDR4OiUwMngiLCBwY2lfZG9tYWluX25yKGIpLCBidXMpOwogCWVycm9yID0gZGV2aWNlX3JlZ2lzdGVyKGRldik7CiAJaWYgKGVycm9yKQogCQlnb3RvIGRldl9yZWdfZXJyOwpAQCAtMTE0MSw3ICsxMTQ3LDcgQEAKIAogCWItPmRldi5jbGFzcyA9ICZwY2lidXNfY2xhc3M7CiAJYi0+ZGV2LnBhcmVudCA9IGItPmJyaWRnZTsKLQlzcHJpbnRmKGItPmRldi5idXNfaWQsICIlMDR4OiUwMngiLCBwY2lfZG9tYWluX25yKGIpLCBidXMpOworCWRldl9zZXRfbmFtZSgmYi0+ZGV2LCAiJTA0eDolMDJ4IiwgcGNpX2RvbWFpbl9ucihiKSwgYnVzKTsKIAllcnJvciA9IGRldmljZV9yZWdpc3RlcigmYi0+ZGV2KTsKIAlpZiAoZXJyb3IpCiAJCWdvdG8gY2xhc3NfZGV2X3JlZ19lcnI7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9wcm9jLmMgYi9kcml2ZXJzL3BjaS9wcm9jLmMKaW5kZXggZTEwOThjMy4uNTkzYmI4NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvcHJvYy5jCisrKyBiL2RyaXZlcnMvcGNpL3Byb2MuYwpAQCAtMjUyLDExICsyNTIsMjAgQEAKIAljb25zdCBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmRwID0gUERFKGlub2RlKTsKIAlzdHJ1Y3QgcGNpX2RldiAqZGV2ID0gZHAtPmRhdGE7CiAJc3RydWN0IHBjaV9maWxwX3ByaXZhdGUgKmZwcml2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCWludCByZXQ7CisJaW50IGksIHJldDsKIAogCWlmICghY2FwYWJsZShDQVBfU1lTX1JBV0lPKSkKIAkJcmV0dXJuIC1FUEVSTTsKIAorCS8qIE1ha2Ugc3VyZSB0aGUgY2FsbGVyIGlzIG1hcHBpbmcgYSByZWFsIHJlc291cmNlIGZvciB0aGlzIGRldmljZSAqLworCWZvciAoaSA9IDA7IGkgPCBQQ0lfUk9NX1JFU09VUkNFOyBpKyspIHsKKwkJaWYgKHBjaV9tbWFwX2ZpdHMoZGV2LCBpLCB2bWEpKQorCQkJYnJlYWs7CisJfQorCisJaWYgKGkgPj0gUENJX1JPTV9SRVNPVVJDRSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKIAlyZXQgPSBwY2lfbW1hcF9wYWdlX3JhbmdlKGRldiwgdm1hLAogCQkJCSAgZnByaXYtPm1tYXBfc3RhdGUsCiAJCQkJICBmcHJpdi0+d3JpdGVfY29tYmluZSk7CkBAIC0zNTIsMTUgKzM2MSwxNiBAQAogCQkJZGV2LT52ZW5kb3IsCiAJCQlkZXYtPmRldmljZSwKIAkJCWRldi0+aXJxKTsKLQkvKiBIZXJlIHNob3VsZCBiZSA3IGFuZCBub3QgUENJX05VTV9SRVNPVVJDRVMgYXMgd2UgbmVlZCB0byBwcmVzZXJ2ZSBjb21wYXRpYmlsaXR5ICovCi0JZm9yIChpPTA7IGk8NzsgaSsrKSB7CisKKwkvKiBvbmx5IHByaW50IHN0YW5kYXJkIGFuZCBST00gcmVzb3VyY2VzIHRvIHByZXNlcnZlIGNvbXBhdGliaWxpdHkgKi8KKwlmb3IgKGkgPSAwOyBpIDw9IFBDSV9ST01fUkVTT1VSQ0U7IGkrKykgewogCQlyZXNvdXJjZV9zaXplX3Qgc3RhcnQsIGVuZDsKIAkJcGNpX3Jlc291cmNlX3RvX3VzZXIoZGV2LCBpLCAmZGV2LT5yZXNvdXJjZVtpXSwgJnN0YXJ0LCAmZW5kKTsKIAkJc2VxX3ByaW50ZihtLCAiXHQlMTZsbHgiLAogCQkJKHVuc2lnbmVkIGxvbmcgbG9uZykoc3RhcnQgfAogCQkJKGRldi0+cmVzb3VyY2VbaV0uZmxhZ3MgJiBQQ0lfUkVHSU9OX0ZMQUdfTUFTSykpKTsKIAl9Ci0JZm9yIChpPTA7IGk8NzsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8PSBQQ0lfUk9NX1JFU09VUkNFOyBpKyspIHsKIAkJcmVzb3VyY2Vfc2l6ZV90IHN0YXJ0LCBlbmQ7CiAJCXBjaV9yZXNvdXJjZV90b191c2VyKGRldiwgaSwgJmRldi0+cmVzb3VyY2VbaV0sICZzdGFydCwgJmVuZCk7CiAJCXNlcV9wcmludGYobSwgIlx0JTE2bGx4IiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3F1aXJrcy5jIGIvZHJpdmVycy9wY2kvcXVpcmtzLmMKaW5kZXggY2UwOTg1Ni4uYmFhZDA5MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvcXVpcmtzLmMKKysrIGIvZHJpdmVycy9wY2kvcXVpcmtzLmMKQEAgLTU2LDcgKzU2LDcgQEAKIAl3aGlsZSAoKGQgPSBwY2lfZ2V0X2RldmljZShQQ0lfVkVORE9SX0lEX0lOVEVMLCBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyMzcxU0JfMCwgZCkpKSB7CiAJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGQsIDB4ODIsICZkbGMpOwogCQlpZiAoIShkbGMgJiAxPDwxKSkgewotCQkJZGV2X2VycigmZC0+ZGV2LCAiUElJWDM6IEVuYWJsaW5nIFBhc3NpdmUgUmVsZWFzZVxuIik7CisJCQlkZXZfaW5mbygmZC0+ZGV2LCAiUElJWDM6IEVuYWJsaW5nIFBhc3NpdmUgUmVsZWFzZVxuIik7CiAJCQlkbGMgfD0gMTw8MTsKIAkJCXBjaV93cml0ZV9jb25maWdfYnl0ZShkLCAweDgyLCBkbGMpOwogCQl9CkBAIC00NDksNyArNDQ5LDcgQEAKIERFQ0xBUkVfUENJX0ZJWFVQX0hFQURFUihQQ0lfVkVORE9SX0lEX0lOVEVMLCAgICBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODAxRUJfMCwJCXF1aXJrX2ljaDRfbHBjX2FjcGkpOwogREVDTEFSRV9QQ0lfRklYVVBfSEVBREVSKFBDSV9WRU5ET1JfSURfSU5URUwsICAgIFBDSV9ERVZJQ0VfSURfSU5URUxfRVNCXzEsCQlxdWlya19pY2g0X2xwY19hY3BpKTsKIAotc3RhdGljIHZvaWQgX19kZXZpbml0IHF1aXJrX2ljaDZfbHBjX2FjcGkoc3RydWN0IHBjaV9kZXYgKmRldikKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBpY2g2X2xwY19hY3BpX2dwaW8oc3RydWN0IHBjaV9kZXYgKmRldikKIHsKIAl1MzIgcmVnaW9uOwogCkBAIC00NTksMjAgKzQ1OSw5NSBAQAogCXBjaV9yZWFkX2NvbmZpZ19kd29yZChkZXYsIDB4NDgsICZyZWdpb24pOwogCXF1aXJrX2lvX3JlZ2lvbihkZXYsIHJlZ2lvbiwgNjQsIFBDSV9CUklER0VfUkVTT1VSQ0VTKzEsICJJQ0g2IEdQSU8iKTsKIH0KLURFQ0xBUkVfUENJX0ZJWFVQX0hFQURFUihQQ0lfVkVORE9SX0lEX0lOVEVMLAlQQ0lfREVWSUNFX0lEX0lOVEVMX0lDSDZfMCwgcXVpcmtfaWNoNl9scGNfYWNwaSk7Ci1ERUNMQVJFX1BDSV9GSVhVUF9IRUFERVIoUENJX1ZFTkRPUl9JRF9JTlRFTCwJUENJX0RFVklDRV9JRF9JTlRFTF9JQ0g2XzEsIHF1aXJrX2ljaDZfbHBjX2FjcGkpOwotREVDTEFSRV9QQ0lfRklYVVBfSEVBREVSKFBDSV9WRU5ET1JfSURfSU5URUwsCVBDSV9ERVZJQ0VfSURfSU5URUxfSUNIN18wLCBxdWlya19pY2g2X2xwY19hY3BpKTsKLURFQ0xBUkVfUENJX0ZJWFVQX0hFQURFUihQQ0lfVkVORE9SX0lEX0lOVEVMLAlQQ0lfREVWSUNFX0lEX0lOVEVMX0lDSDdfMSwgcXVpcmtfaWNoNl9scGNfYWNwaSk7Ci1ERUNMQVJFX1BDSV9GSVhVUF9IRUFERVIoUENJX1ZFTkRPUl9JRF9JTlRFTCwJUENJX0RFVklDRV9JRF9JTlRFTF9JQ0g3XzMxLCBxdWlya19pY2g2X2xwY19hY3BpKTsKLURFQ0xBUkVfUENJX0ZJWFVQX0hFQURFUihQQ0lfVkVORE9SX0lEX0lOVEVMLAlQQ0lfREVWSUNFX0lEX0lOVEVMX0lDSDhfMCwgcXVpcmtfaWNoNl9scGNfYWNwaSk7Ci1ERUNMQVJFX1BDSV9GSVhVUF9IRUFERVIoUENJX1ZFTkRPUl9JRF9JTlRFTCwJUENJX0RFVklDRV9JRF9JTlRFTF9JQ0g4XzIsIHF1aXJrX2ljaDZfbHBjX2FjcGkpOwotREVDTEFSRV9QQ0lfRklYVVBfSEVBREVSKFBDSV9WRU5ET1JfSURfSU5URUwsCVBDSV9ERVZJQ0VfSURfSU5URUxfSUNIOF8zLCBxdWlya19pY2g2X2xwY19hY3BpKTsKLURFQ0xBUkVfUENJX0ZJWFVQX0hFQURFUihQQ0lfVkVORE9SX0lEX0lOVEVMLAlQQ0lfREVWSUNFX0lEX0lOVEVMX0lDSDhfMSwgcXVpcmtfaWNoNl9scGNfYWNwaSk7Ci1ERUNMQVJFX1BDSV9GSVhVUF9IRUFERVIoUENJX1ZFTkRPUl9JRF9JTlRFTCwJUENJX0RFVklDRV9JRF9JTlRFTF9JQ0g4XzQsIHF1aXJrX2ljaDZfbHBjX2FjcGkpOwotREVDTEFSRV9QQ0lfRklYVVBfSEVBREVSKFBDSV9WRU5ET1JfSURfSU5URUwsCVBDSV9ERVZJQ0VfSURfSU5URUxfSUNIOV8yLCBxdWlya19pY2g2X2xwY19hY3BpKTsKLURFQ0xBUkVfUENJX0ZJWFVQX0hFQURFUihQQ0lfVkVORE9SX0lEX0lOVEVMLAlQQ0lfREVWSUNFX0lEX0lOVEVMX0lDSDlfNCwgcXVpcmtfaWNoNl9scGNfYWNwaSk7Ci1ERUNMQVJFX1BDSV9GSVhVUF9IRUFERVIoUENJX1ZFTkRPUl9JRF9JTlRFTCwJUENJX0RFVklDRV9JRF9JTlRFTF9JQ0g5XzcsIHF1aXJrX2ljaDZfbHBjX2FjcGkpOwotREVDTEFSRV9QQ0lfRklYVVBfSEVBREVSKFBDSV9WRU5ET1JfSURfSU5URUwsCVBDSV9ERVZJQ0VfSURfSU5URUxfSUNIOV84LCBxdWlya19pY2g2X2xwY19hY3BpKTsKKworc3RhdGljIHZvaWQgX19kZXZpbml0IGljaDZfbHBjX2dlbmVyaWNfZGVjb2RlKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHVuc2lnbmVkIHJlZywgY29uc3QgY2hhciAqbmFtZSwgaW50IGR5bnNpemUpCit7CisJdTMyIHZhbDsKKwl1MzIgc2l6ZSwgYmFzZTsKKworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChkZXYsIHJlZywgJnZhbCk7CisKKwkvKiBFbmFibGVkPyAqLworCWlmICghKHZhbCAmIDEpKQorCQlyZXR1cm47CisJYmFzZSA9IHZhbCAmIDB4ZmZmYzsKKwlpZiAoZHluc2l6ZSkgeworCQkvKgorCQkgKiBUaGlzIGlzIG5vdCBjb3JyZWN0LiBJdCBpcyAxNiwgMzIgb3IgNjQgYnl0ZXMgZGVwZW5kaW5nIG9uCisJCSAqIHJlZ2lzdGVyIEQzMTpGMDpBRGggYml0cyA1OjQuCisJCSAqCisJCSAqIEJ1dCB0aGlzIGdldHMgdXMgYXQgbGVhc3QgX3BhcnRfIG9mIGl0LgorCQkgKi8KKwkJc2l6ZSA9IDE2OworCX0gZWxzZSB7CisJCXNpemUgPSAxMjg7CisJfQorCWJhc2UgJj0gfihzaXplLTEpOworCisJLyogSnVzdCBwcmludCBpdCBvdXQgZm9yIG5vdy4gV2Ugc2hvdWxkIHJlc2VydmUgaXQgYWZ0ZXIgbW9yZSBkZWJ1Z2dpbmcgKi8KKwlkZXZfaW5mbygmZGV2LT5kZXYsICIlcyBQSU8gYXQgJTA0eC0lMDR4XG4iLCBuYW1lLCBiYXNlLCBiYXNlK3NpemUtMSk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBxdWlya19pY2g2X2xwYyhzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCS8qIFNoYXJlZCBBQ1BJL0dQSU8gZGVjb2RlIHdpdGggYWxsIElDSDYrICovCisJaWNoNl9scGNfYWNwaV9ncGlvKGRldik7CisKKwkvKiBJQ0g2LXNwZWNpZmljIGdlbmVyaWMgSU8gZGVjb2RlICovCisJaWNoNl9scGNfZ2VuZXJpY19kZWNvZGUoZGV2LCAweDg0LCAiTFBDIEdlbmVyaWMgSU8gZGVjb2RlIDEiLCAwKTsKKwlpY2g2X2xwY19nZW5lcmljX2RlY29kZShkZXYsIDB4ODgsICJMUEMgR2VuZXJpYyBJTyBkZWNvZGUgMiIsIDEpOworfQorREVDTEFSRV9QQ0lfRklYVVBfSEVBREVSKFBDSV9WRU5ET1JfSURfSU5URUwsCVBDSV9ERVZJQ0VfSURfSU5URUxfSUNINl8wLCBxdWlya19pY2g2X2xwYyk7CitERUNMQVJFX1BDSV9GSVhVUF9IRUFERVIoUENJX1ZFTkRPUl9JRF9JTlRFTCwJUENJX0RFVklDRV9JRF9JTlRFTF9JQ0g2XzEsIHF1aXJrX2ljaDZfbHBjKTsKKworc3RhdGljIHZvaWQgX19kZXZpbml0IGljaDdfbHBjX2dlbmVyaWNfZGVjb2RlKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHVuc2lnbmVkIHJlZywgY29uc3QgY2hhciAqbmFtZSkKK3sKKwl1MzIgdmFsOworCXUzMiBtYXNrLCBiYXNlOworCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGRldiwgcmVnLCAmdmFsKTsKKworCS8qIEVuYWJsZWQ/ICovCisJaWYgKCEodmFsICYgMSkpCisJCXJldHVybjsKKworCS8qCisJICogSU8gYmFzZSBpbiBiaXRzIDE1OjIsIG1hc2sgaW4gYml0cyAyMzoxOCwgYm90aAorCSAqIGFyZSBkd29yZC1iYXNlZAorCSAqLworCWJhc2UgPSB2YWwgJiAweGZmZmM7CisJbWFzayA9ICh2YWwgPj4gMTYpICYgMHhmYzsKKwltYXNrIHw9IDM7CisKKwkvKiBKdXN0IHByaW50IGl0IG91dCBmb3Igbm93LiBXZSBzaG91bGQgcmVzZXJ2ZSBpdCBhZnRlciBtb3JlIGRlYnVnZ2luZyAqLworCWRldl9pbmZvKCZkZXYtPmRldiwgIiVzIFBJTyBhdCAlMDR4IChtYXNrICUwNHgpXG4iLCBuYW1lLCBiYXNlLCBtYXNrKTsKK30KKworLyogSUNINy0xMCBoYXMgdGhlIHNhbWUgY29tbW9uIExQQyBnZW5lcmljIElPIGRlY29kZSByZWdpc3RlcnMgKi8KK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBxdWlya19pY2g3X2xwYyhzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCS8qIFdlIHNoYXJlIHRoZSBjb21tb24gQUNQSS9EUElPIGRlY29kZSB3aXRoIElDSDYgKi8KKwlpY2g2X2xwY19hY3BpX2dwaW8oZGV2KTsKKworCS8qIEFuZCBoYXZlIDQgSUNINysgZ2VuZXJpYyBkZWNvZGVzICovCisJaWNoN19scGNfZ2VuZXJpY19kZWNvZGUoZGV2LCAweDg0LCAiSUNINyBMUEMgR2VuZXJpYyBJTyBkZWNvZGUgMSIpOworCWljaDdfbHBjX2dlbmVyaWNfZGVjb2RlKGRldiwgMHg4OCwgIklDSDcgTFBDIEdlbmVyaWMgSU8gZGVjb2RlIDIiKTsKKwlpY2g3X2xwY19nZW5lcmljX2RlY29kZShkZXYsIDB4OGMsICJJQ0g3IExQQyBHZW5lcmljIElPIGRlY29kZSAzIik7CisJaWNoN19scGNfZ2VuZXJpY19kZWNvZGUoZGV2LCAweDkwLCAiSUNINyBMUEMgR2VuZXJpYyBJTyBkZWNvZGUgNCIpOworfQorREVDTEFSRV9QQ0lfRklYVVBfSEVBREVSKFBDSV9WRU5ET1JfSURfSU5URUwsCVBDSV9ERVZJQ0VfSURfSU5URUxfSUNIN18wLCBxdWlya19pY2g3X2xwYyk7CitERUNMQVJFX1BDSV9GSVhVUF9IRUFERVIoUENJX1ZFTkRPUl9JRF9JTlRFTCwJUENJX0RFVklDRV9JRF9JTlRFTF9JQ0g3XzEsIHF1aXJrX2ljaDdfbHBjKTsKK0RFQ0xBUkVfUENJX0ZJWFVQX0hFQURFUihQQ0lfVkVORE9SX0lEX0lOVEVMLAlQQ0lfREVWSUNFX0lEX0lOVEVMX0lDSDdfMzEsIHF1aXJrX2ljaDdfbHBjKTsKK0RFQ0xBUkVfUENJX0ZJWFVQX0hFQURFUihQQ0lfVkVORE9SX0lEX0lOVEVMLAlQQ0lfREVWSUNFX0lEX0lOVEVMX0lDSDhfMCwgcXVpcmtfaWNoN19scGMpOworREVDTEFSRV9QQ0lfRklYVVBfSEVBREVSKFBDSV9WRU5ET1JfSURfSU5URUwsCVBDSV9ERVZJQ0VfSURfSU5URUxfSUNIOF8yLCBxdWlya19pY2g3X2xwYyk7CitERUNMQVJFX1BDSV9GSVhVUF9IRUFERVIoUENJX1ZFTkRPUl9JRF9JTlRFTCwJUENJX0RFVklDRV9JRF9JTlRFTF9JQ0g4XzMsIHF1aXJrX2ljaDdfbHBjKTsKK0RFQ0xBUkVfUENJX0ZJWFVQX0hFQURFUihQQ0lfVkVORE9SX0lEX0lOVEVMLAlQQ0lfREVWSUNFX0lEX0lOVEVMX0lDSDhfMSwgcXVpcmtfaWNoN19scGMpOworREVDTEFSRV9QQ0lfRklYVVBfSEVBREVSKFBDSV9WRU5ET1JfSURfSU5URUwsCVBDSV9ERVZJQ0VfSURfSU5URUxfSUNIOF80LCBxdWlya19pY2g3X2xwYyk7CitERUNMQVJFX1BDSV9GSVhVUF9IRUFERVIoUENJX1ZFTkRPUl9JRF9JTlRFTCwJUENJX0RFVklDRV9JRF9JTlRFTF9JQ0g5XzIsIHF1aXJrX2ljaDdfbHBjKTsKK0RFQ0xBUkVfUENJX0ZJWFVQX0hFQURFUihQQ0lfVkVORE9SX0lEX0lOVEVMLAlQQ0lfREVWSUNFX0lEX0lOVEVMX0lDSDlfNCwgcXVpcmtfaWNoN19scGMpOworREVDTEFSRV9QQ0lfRklYVVBfSEVBREVSKFBDSV9WRU5ET1JfSURfSU5URUwsCVBDSV9ERVZJQ0VfSURfSU5URUxfSUNIOV83LCBxdWlya19pY2g3X2xwYyk7CitERUNMQVJFX1BDSV9GSVhVUF9IRUFERVIoUENJX1ZFTkRPUl9JRF9JTlRFTCwJUENJX0RFVklDRV9JRF9JTlRFTF9JQ0g5XzgsIHF1aXJrX2ljaDdfbHBjKTsKK0RFQ0xBUkVfUENJX0ZJWFVQX0hFQURFUihQQ0lfVkVORE9SX0lEX0lOVEVMLCAgIFBDSV9ERVZJQ0VfSURfSU5URUxfSUNIMTBfMSwgcXVpcmtfaWNoN19scGMpOwogCiAvKgogICogVklBIEFDUEk6IE9uZSBJTyByZWdpb24gcG9pbnRlZCB0byBieSBsb25nd29yZCBhdApAQCAtMjA3NCwxMSArMjE0OSwxMiBAQAogCiAjZW5kaWYgLyogQ09ORklHX1BDSV9NU0kgKi8KIAotc3RhdGljIHZvaWQgcGNpX2RvX2ZpeHVwcyhzdHJ1Y3QgcGNpX2RldiAqZGV2LCBzdHJ1Y3QgcGNpX2ZpeHVwICpmLCBzdHJ1Y3QgcGNpX2ZpeHVwICplbmQpCitzdGF0aWMgdm9pZCBwY2lfZG9fZml4dXBzKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHN0cnVjdCBwY2lfZml4dXAgKmYsCisJCQkgIHN0cnVjdCBwY2lfZml4dXAgKmVuZCkKIHsKIAl3aGlsZSAoZiA8IGVuZCkgewogCQlpZiAoKGYtPnZlbmRvciA9PSBkZXYtPnZlbmRvciB8fCBmLT52ZW5kb3IgPT0gKHUxNikgUENJX0FOWV9JRCkgJiYKLSAJCSAgICAoZi0+ZGV2aWNlID09IGRldi0+ZGV2aWNlIHx8IGYtPmRldmljZSA9PSAodTE2KSBQQ0lfQU5ZX0lEKSkgeworCQkgICAgKGYtPmRldmljZSA9PSBkZXYtPmRldmljZSB8fCBmLT5kZXZpY2UgPT0gKHUxNikgUENJX0FOWV9JRCkpIHsKIAkJCWRldl9kYmcoJmRldi0+ZGV2LCAiY2FsbGluZyAlcEZcbiIsIGYtPmhvb2spOwogCQkJZi0+aG9vayhkZXYpOwogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9zZXR1cC1idXMuYyBiL2RyaXZlcnMvcGNpL3NldHVwLWJ1cy5jCmluZGV4IGVhOTc5ZjIuLjcwNDYwODkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL3NldHVwLWJ1cy5jCisrKyBiL2RyaXZlcnMvcGNpL3NldHVwLWJ1cy5jCkBAIC01MzYsOSArNTM2LDggQEAKICAgICAgICAgICAgICAgICBpZiAoIXJlcykKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogCi0JCXByaW50ayhLRVJOX0lORk8gImJ1czogJTAyeCBpbmRleCAleCAlczogJXBSXG4iLAotCQkgICAgICAgYnVzLT5udW1iZXIsIGksCi0JCSAgICAgICAocmVzLT5mbGFncyAmIElPUkVTT1VSQ0VfSU8pID8gImlvIHBvcnQiIDogIm1taW8iLCByZXMpOworCQlkZXZfcHJpbnRrKEtFUk5fREVCVUcsICZidXMtPmRldiwgInJlc291cmNlICVkICVzICVwUlxuIiwgaSwKKwkJCSAgIChyZXMtPmZsYWdzICYgSU9SRVNPVVJDRV9JTykgPyAiaW86ICIgOiAibWVtOiIsIHJlcyk7CiAgICAgICAgIH0KIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvc2V0dXAtcmVzLmMgYi9kcml2ZXJzL3BjaS9zZXR1cC1yZXMuYwppbmRleCAyZGJkOTZjLi4zMmU4ZDg4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9zZXR1cC1yZXMuYworKysgYi9kcml2ZXJzL3BjaS9zZXR1cC1yZXMuYwpAQCAtMjYsMTEgKzI2LDEzIEBACiAjaW5jbHVkZSAicGNpLmgiCiAKIAotdm9pZCBwY2lfdXBkYXRlX3Jlc291cmNlKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHN0cnVjdCByZXNvdXJjZSAqcmVzLCBpbnQgcmVzbm8pCit2b2lkIHBjaV91cGRhdGVfcmVzb3VyY2Uoc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IHJlc25vKQogewogCXN0cnVjdCBwY2lfYnVzX3JlZ2lvbiByZWdpb247CiAJdTMyIG5ldywgY2hlY2ssIG1hc2s7CiAJaW50IHJlZzsKKwllbnVtIHBjaV9iYXJfdHlwZSB0eXBlOworCXN0cnVjdCByZXNvdXJjZSAqcmVzID0gZGV2LT5yZXNvdXJjZSArIHJlc25vOwogCiAJLyoKIAkgKiBJZ25vcmUgcmVzb3VyY2VzIGZvciB1bmltcGxlbWVudGVkIEJBUnMgYW5kIHVudXNlZCByZXNvdXJjZSBzbG90cwpAQCAtNjEsMTcgKzYzLDEzIEBACiAJZWxzZQogCQltYXNrID0gKHUzMilQQ0lfQkFTRV9BRERSRVNTX01FTV9NQVNLOwogCi0JaWYgKHJlc25vIDwgNikgewotCQlyZWcgPSBQQ0lfQkFTRV9BRERSRVNTXzAgKyA0ICogcmVzbm87Ci0JfSBlbHNlIGlmIChyZXNubyA9PSBQQ0lfUk9NX1JFU09VUkNFKSB7CisJcmVnID0gcGNpX3Jlc291cmNlX2JhcihkZXYsIHJlc25vLCAmdHlwZSk7CisJaWYgKCFyZWcpCisJCXJldHVybjsKKwlpZiAodHlwZSAhPSBwY2lfYmFyX3Vua25vd24pIHsKIAkJaWYgKCEocmVzLT5mbGFncyAmIElPUkVTT1VSQ0VfUk9NX0VOQUJMRSkpCiAJCQlyZXR1cm47CiAJCW5ldyB8PSBQQ0lfUk9NX0FERFJFU1NfRU5BQkxFOwotCQlyZWcgPSBkZXYtPnJvbV9iYXNlX3JlZzsKLQl9IGVsc2UgewotCQkvKiBIbW0sIG5vbi1zdGFuZGFyZCByZXNvdXJjZS4gKi8KLQkKLQkJcmV0dXJuOwkJLyoga2lsbCB1bmluaXRpYWxpc2VkIHZhciB3YXJuaW5nICovCiAJfQogCiAJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChkZXYsIHJlZywgbmV3KTsKQEAgLTEzNCw3ICsxMzIsNyBAQAogCiAJYWxpZ24gPSByZXNvdXJjZV9hbGlnbm1lbnQocmVzKTsKIAlpZiAoIWFsaWduKSB7Ci0JCWRldl9lcnIoJmRldi0+ZGV2LCAiQkFSICVkOiBjYW4ndCBhbGxvY2F0ZSByZXNvdXJjZSAoYm9ndXMgIgorCQlkZXZfaW5mbygmZGV2LT5kZXYsICJCQVIgJWQ6IGNhbid0IGFsbG9jYXRlIHJlc291cmNlIChib2d1cyAiCiAJCQkiYWxpZ25tZW50KSAlcFIgZmxhZ3MgJSNseFxuIiwKIAkJCXJlc25vLCByZXMsIHJlcy0+ZmxhZ3MpOwogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTE1NywxMiArMTU1LDEyIEBACiAJfQogCiAJaWYgKHJldCkgewotCQlkZXZfZXJyKCZkZXYtPmRldiwgIkJBUiAlZDogY2FuJ3QgYWxsb2NhdGUgJXMgcmVzb3VyY2UgJXBSXG4iLAorCQlkZXZfaW5mbygmZGV2LT5kZXYsICJCQVIgJWQ6IGNhbid0IGFsbG9jYXRlICVzIHJlc291cmNlICVwUlxuIiwKIAkJCXJlc25vLCByZXMtPmZsYWdzICYgSU9SRVNPVVJDRV9JTyA/ICJJL08iIDogIm1lbSIsIHJlcyk7CiAJfSBlbHNlIHsKIAkJcmVzLT5mbGFncyAmPSB+SU9SRVNPVVJDRV9TVEFSVEFMSUdOOwogCQlpZiAocmVzbm8gPCBQQ0lfQlJJREdFX1JFU09VUkNFUykKLQkJCXBjaV91cGRhdGVfcmVzb3VyY2UoZGV2LCByZXMsIHJlc25vKTsKKwkJCXBjaV91cGRhdGVfcmVzb3VyY2UoZGV2LCByZXNubyk7CiAJfQogCiAJcmV0dXJuIHJldDsKQEAgLTE5Nyw3ICsxOTUsNyBAQAogCQlkZXZfZXJyKCZkZXYtPmRldiwgIkJBUiAlZDogY2FuJ3QgYWxsb2NhdGUgJXMgcmVzb3VyY2UgJXBSXG4iLAogCQkJcmVzbm8sIHJlcy0+ZmxhZ3MgJiBJT1JFU09VUkNFX0lPID8gIkkvTyIgOiAibWVtIiwgcmVzKTsKIAl9IGVsc2UgaWYgKHJlc25vIDwgUENJX0JSSURHRV9SRVNPVVJDRVMpIHsKLQkJcGNpX3VwZGF0ZV9yZXNvdXJjZShkZXYsIHJlcywgcmVzbm8pOworCQlwY2lfdXBkYXRlX3Jlc291cmNlKGRldiwgcmVzbm8pOwogCX0KIAogCXJldHVybiByZXQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9zeXNjYWxsLmMgYi9kcml2ZXJzL3BjaS9zeXNjYWxsLmMKaW5kZXggNjQ1ZDdhNi4uZWMyMjI4NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvc3lzY2FsbC5jCisrKyBiL2RyaXZlcnMvcGNpL3N5c2NhbGwuYwpAQCAtMTQsMTAgKzE0LDggQEAKICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgInBjaS5oIgogCi1hc21saW5rYWdlIGxvbmcKLXN5c19wY2ljb25maWdfcmVhZCh1bnNpZ25lZCBsb25nIGJ1cywgdW5zaWduZWQgbG9uZyBkZm4sCi0JCSAgIHVuc2lnbmVkIGxvbmcgb2ZmLCB1bnNpZ25lZCBsb25nIGxlbiwKLQkJICAgdm9pZCBfX3VzZXIgKmJ1ZikKK1NZU0NBTExfREVGSU5FNShwY2ljb25maWdfcmVhZCwgdW5zaWduZWQgbG9uZywgYnVzLCB1bnNpZ25lZCBsb25nLCBkZm4sCisJCXVuc2lnbmVkIGxvbmcsIG9mZiwgdW5zaWduZWQgbG9uZywgbGVuLCB2b2lkIF9fdXNlciAqLCBidWYpCiB7CiAJc3RydWN0IHBjaV9kZXYgKmRldjsKIAl1OCBieXRlOwpAQCAtODYsMTAgKzg0LDggQEAKIAlyZXR1cm4gZXJyOwogfQogCi1hc21saW5rYWdlIGxvbmcKLXN5c19wY2ljb25maWdfd3JpdGUodW5zaWduZWQgbG9uZyBidXMsIHVuc2lnbmVkIGxvbmcgZGZuLAotCQkgICAgdW5zaWduZWQgbG9uZyBvZmYsIHVuc2lnbmVkIGxvbmcgbGVuLAotCQkgICAgdm9pZCBfX3VzZXIgKmJ1ZikKK1NZU0NBTExfREVGSU5FNShwY2ljb25maWdfd3JpdGUsIHVuc2lnbmVkIGxvbmcsIGJ1cywgdW5zaWduZWQgbG9uZywgZGZuLAorCQl1bnNpZ25lZCBsb25nLCBvZmYsIHVuc2lnbmVkIGxvbmcsIGxlbiwgdm9pZCBfX3VzZXIgKiwgYnVmKQogewogCXN0cnVjdCBwY2lfZGV2ICpkZXY7CiAJdTggYnl0ZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNtY2lhL2VsZWN0cmFfY2YuYyBiL2RyaXZlcnMvcGNtY2lhL2VsZWN0cmFfY2YuYwppbmRleCBhMzQyODRiMS4uZDE4N2JhNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY21jaWEvZWxlY3RyYV9jZi5jCisrKyBiL2RyaXZlcnMvcGNtY2lhL2VsZWN0cmFfY2YuYwpAQCAtMjk3LDcgKzI5Nyw3IEBACiAJCWdvdG8gZmFpbDM7CiAJfQogCi0JZGV2X2luZm8oZGV2aWNlLCAiYXQgbWVtIDB4JWx4IGlvIDB4JWx4IGlycSAlZFxuIiwKKwlkZXZfaW5mbyhkZXZpY2UsICJhdCBtZW0gMHglbHggaW8gMHglbGx4IGlycSAlZFxuIiwKIAkJIGNmLT5tZW1fcGh5cywgaW8uc3RhcnQsIGNmLT5pcnEpOwogCiAJY2YtPmFjdGl2ZSA9IDE7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BsYXRmb3JtL0tjb25maWcgYi9kcml2ZXJzL3BsYXRmb3JtL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTY1MmMzZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvcGxhdGZvcm0vS2NvbmZpZwpAQCAtMCwwICsxLDUgQEAKKyMgZHJpdmVycy9wbGF0Zm9ybS9LY29uZmlnCisKK2lmIFg4Ngorc291cmNlICJkcml2ZXJzL3BsYXRmb3JtL3g4Ni9LY29uZmlnIgorZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGxhdGZvcm0vTWFrZWZpbGUgYi9kcml2ZXJzL3BsYXRmb3JtL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4Mjk1M2EKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3BsYXRmb3JtL01ha2VmaWxlCkBAIC0wLDAgKzEsNSBAQAorIworIyBNYWtlZmlsZSBmb3IgbGludXgvZHJpdmVycy9wbGF0Zm9ybQorIworCitvYmotJChDT05GSUdfWDg2KQkJKz0geDg2LwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wbGF0Zm9ybS94ODYvS2NvbmZpZyBiL2RyaXZlcnMvcGxhdGZvcm0veDg2L0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWEyNjZkNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvcGxhdGZvcm0veDg2L0tjb25maWcKQEAgLTAsMCArMSwzOTggQEAKKyMKKyMgWDg2IFBsYXRmb3JtIFNwZWNpZmljIERyaXZlcnMKKyMKKworbWVudWNvbmZpZyBYODZfUExBVEZPUk1fREVWSUNFUworCWJvb2wgIlg4NiBQbGF0Zm9ybSBTcGVjaWZpYyBEZXZpY2UgRHJpdmVycyIKKwlkZWZhdWx0IHkKKwktLS1oZWxwLS0tCisJICBTYXkgWSBoZXJlIHRvIGdldCB0byBzZWUgb3B0aW9ucyBmb3IgZGV2aWNlIGRyaXZlcnMgZm9yIHZhcmlvdXMKKwkgIHg4NiBwbGF0Zm9ybXMsIGluY2x1ZGluZyB2ZW5kb3Itc3BlY2lmaWMgbGFwdG9wIGV4dGVuc2lvbiBkcml2ZXJzLgorCSAgVGhpcyBvcHRpb24gYWxvbmUgZG9lcyBub3QgYWRkIGFueSBrZXJuZWwgY29kZS4KKworCSAgSWYgeW91IHNheSBOLCBhbGwgb3B0aW9ucyBpbiB0aGlzIHN1Ym1lbnUgd2lsbCBiZSBza2lwcGVkIGFuZCBkaXNhYmxlZC4KKworaWYgWDg2X1BMQVRGT1JNX0RFVklDRVMKKworY29uZmlnIEFDRVJfV01JCisJdHJpc3RhdGUgIkFjZXIgV01JIExhcHRvcCBFeHRyYXMgKEVYUEVSSU1FTlRBTCkiCisJZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwKKwlkZXBlbmRzIG9uIEFDUEkKKwlkZXBlbmRzIG9uIExFRFNfQ0xBU1MKKwlkZXBlbmRzIG9uIE5FV19MRURTCisJZGVwZW5kcyBvbiBCQUNLTElHSFRfQ0xBU1NfREVWSUNFCisJZGVwZW5kcyBvbiBTRVJJT19JODA0MgorCWRlcGVuZHMgb24gUkZLSUxMCisJc2VsZWN0IEFDUElfV01JCisJLS0taGVscC0tLQorCSAgVGhpcyBpcyBhIGRyaXZlciBmb3IgbmV3ZXIgQWNlciAoYW5kIFdpc3Ryb24pIGxhcHRvcHMuIEl0IGFkZHMKKwkgIHdpcmVsZXNzIHJhZGlvIGFuZCBibHVldG9vdGggY29udHJvbCwgYW5kIG9uIHNvbWUgbGFwdG9wcywKKwkgIGV4cG9zZXMgdGhlIG1haWwgTEVEIGFuZCBMQ0QgYmFja2xpZ2h0LgorCisJICBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGRyaXZlciBzZWUKKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vbGFwdG9wcy9hY2VyLXdtaS50eHQ+CisKKwkgIElmIHlvdSBoYXZlIGFuIEFDUEktV01JIGNvbXBhdGlibGUgQWNlci8gV2lzdHJvbiBsYXB0b3AsIHNheSBZIG9yIE0KKwkgIGhlcmUuCisKK2NvbmZpZyBBU1VTX0xBUFRPUAorCXRyaXN0YXRlICJBc3VzIExhcHRvcCBFeHRyYXMgKEVYUEVSSU1FTlRBTCkiCisJZGVwZW5kcyBvbiBBQ1BJCisJZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwgJiYgIUFDUElfQVNVUworCWRlcGVuZHMgb24gTEVEU19DTEFTUworCWRlcGVuZHMgb24gTkVXX0xFRFMKKwlkZXBlbmRzIG9uIEJBQ0tMSUdIVF9DTEFTU19ERVZJQ0UKKwktLS1oZWxwLS0tCisJICBUaGlzIGlzIHRoZSBuZXcgTGludXggZHJpdmVyIGZvciBBc3VzIGxhcHRvcHMuIEl0IG1heSBhbHNvIHN1cHBvcnQgc29tZQorCSAgTUVESU9OLCBKVkMgb3IgVklDVE9SIGxhcHRvcHMuIEl0IG1ha2VzIGFsbCB0aGUgZXh0cmEgYnV0dG9ucyBnZW5lcmF0ZQorCSAgc3RhbmRhcmQgQUNQSSBldmVudHMgdGhhdCBnbyB0aHJvdWdoIC9wcm9jL2FjcGkvZXZlbnRzLiBJdCBhbHNvIGFkZHMKKwkgIHN1cHBvcnQgZm9yIHZpZGVvIG91dHB1dCBzd2l0Y2hpbmcsIExDRCBiYWNrbGlnaHQgY29udHJvbCwgQmx1ZXRvb3RoIGFuZAorCSAgV2xhbiBjb250cm9sLCBhbmQgbW9zdCBpbXBvcnRhbnRseSwgYWxsb3dzIHlvdSB0byBibGluayB0aG9zZSBmYW5jeSBMRURzLgorCisJICBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhbmQgYSB1c2Vyc3BhY2UgZGFlbW9uIGZvciBoYW5kbGluZyB0aGUgZXh0cmEKKwkgIGJ1dHRvbnMgc2VlIDxodHRwOi8vYWNwaTRhc3VzLnNmLm5ldC8+LgorCisJICBJZiB5b3UgaGF2ZSBhbiBBQ1BJLWNvbXBhdGlibGUgQVNVUyBsYXB0b3AsIHNheSBZIG9yIE0gaGVyZS4KKworY29uZmlnIERFTExfTEFQVE9QCisJdHJpc3RhdGUgIkRlbGwgTGFwdG9wIEV4dHJhcyAoRVhQRVJJTUVOVEFMKSIKKwlkZXBlbmRzIG9uIFg4NgorCWRlcGVuZHMgb24gRENEQkFTCisJZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwKKwlkZXBlbmRzIG9uIEJBQ0tMSUdIVF9DTEFTU19ERVZJQ0UKKwlkZXBlbmRzIG9uIFJGS0lMTAorCWRlZmF1bHQgbgorCS0tLWhlbHAtLS0KKwlUaGlzIGRyaXZlciBhZGRzIHN1cHBvcnQgZm9yIHJma2lsbCBhbmQgYmFja2xpZ2h0IGNvbnRyb2wgdG8gRGVsbAorCWxhcHRvcHMuCisKK2NvbmZpZyBGVUpJVFNVX0xBUFRPUAorCXRyaXN0YXRlICJGdWppdHN1IExhcHRvcCBFeHRyYXMiCisJZGVwZW5kcyBvbiBBQ1BJCisJZGVwZW5kcyBvbiBJTlBVVAorCWRlcGVuZHMgb24gQkFDS0xJR0hUX0NMQVNTX0RFVklDRQorCS0tLWhlbHAtLS0KKwkgIFRoaXMgaXMgYSBkcml2ZXIgZm9yIGxhcHRvcHMgYnVpbHQgYnkgRnVqaXRzdToKKworCSAgICAqIFAyeHh4L1A1eHh4L1M2eHh4L1M3eHh4IHNlcmllcyBMaWZlYm9va3MKKwkgICAgKiBQb3NzaWJseSBvdGhlciBGdWppdHN1IGxhcHRvcCBtb2RlbHMKKwkgICAgKiBUZXN0ZWQgd2l0aCBTNjQxMCBhbmQgUzcwMjAKKworCSAgSXQgYWRkcyBzdXBwb3J0IGZvciBMQ0QgYnJpZ2h0bmVzcyBjb250cm9sIGFuZCBzb21lIGhvdGtleXMuCisKKwkgIElmIHlvdSBoYXZlIGEgRnVqaXRzdSBsYXB0b3AsIHNheSBZIG9yIE0gaGVyZS4KKworY29uZmlnIEZVSklUU1VfTEFQVE9QX0RFQlVHCisJYm9vbCAiVmVyYm9zZSBkZWJ1ZyBtb2RlIGZvciBGdWppdHN1IExhcHRvcCBFeHRyYXMiCisJZGVwZW5kcyBvbiBGVUpJVFNVX0xBUFRPUAorCWRlZmF1bHQgbgorCS0tLWhlbHAtLS0KKwkgIEVuYWJsZXMgZXh0cmEgZGVidWcgb3V0cHV0IGZyb20gdGhlIGZ1aml0c3UgZXh0cmFzIGRyaXZlciwgYXQgdGhlCisJICBleHBlbnNlIG9mIGEgc2xpZ2h0IGluY3JlYXNlIGluIGRyaXZlciBzaXplLgorCisJICBJZiB5b3UgYXJlIG5vdCBzdXJlLCBzYXkgTiBoZXJlLgorCitjb25maWcgVEMxMTAwX1dNSQorCXRyaXN0YXRlICJIUCBDb21wYXEgVEMxMTAwIFRhYmxldCBXTUkgRXh0cmFzIChFWFBFUklNRU5UQUwpIgorCWRlcGVuZHMgb24gIVg4Nl82NAorCWRlcGVuZHMgb24gRVhQRVJJTUVOVEFMCisJZGVwZW5kcyBvbiBBQ1BJCisJc2VsZWN0IEFDUElfV01JCisJLS0taGVscC0tLQorCSAgVGhpcyBpcyBhIGRyaXZlciBmb3IgdGhlIFdNSSBleHRlbnNpb25zICh3aXJlbGVzcyBhbmQgYmx1ZXRvb3RoIHBvd2VyCisJICBjb250cm9sKSBvZiB0aGUgSFAgQ29tcGFxIFRDMTEwMCB0YWJsZXQuCisKK2NvbmZpZyBIUF9XTUkKKwl0cmlzdGF0ZSAiSFAgV01JIGV4dHJhcyIKKwlkZXBlbmRzIG9uIEFDUElfV01JCisJZGVwZW5kcyBvbiBJTlBVVAorCWRlcGVuZHMgb24gUkZLSUxMCisJaGVscAorCSBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIHN1cHBvcnQgV01JLWJhc2VkIGhvdGtleXMgb24gSFAgbGFwdG9wcyBhbmQKKwkgdG8gcmVhZCBkYXRhIGZyb20gV01JIHN1Y2ggYXMgZG9ja2luZyBvciBhbWJpZW50IGxpZ2h0IHNlbnNvciBzdGF0ZS4KKworCSBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlIHdpbGwKKwkgYmUgY2FsbGVkIGhwLXdtaS4KKworY29uZmlnIE1TSV9MQVBUT1AKKwl0cmlzdGF0ZSAiTVNJIExhcHRvcCBFeHRyYXMiCisJZGVwZW5kcyBvbiBBQ1BJCisJZGVwZW5kcyBvbiBCQUNLTElHSFRfQ0xBU1NfREVWSUNFCisJLS0taGVscC0tLQorCSAgVGhpcyBpcyBhIGRyaXZlciBmb3IgbGFwdG9wcyBidWlsdCBieSBNU0kgKE1JQ1JPLVNUQVIKKwkgIElOVEVSTkFUSU9OQUwpOgorCisJICBNU0kgTWVnYUJvb2sgUzI3MCAoTVMtMTAxMykKKwkgIEN5dHJvbi9UQ00vTWVkaW9uL1RjaGlibyBNRDk2MTAwL1NBTTIwMDAKKworCSAgSXQgYWRkcyBzdXBwb3J0IGZvciBCbHVldG9vdGgsIFdMQU4gYW5kIExDRCBicmlnaHRuZXNzIGNvbnRyb2wuCisKKwkgIE1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBkcml2ZXIgaXMgYXZhaWxhYmxlIGF0CisJICA8aHR0cDovLzBwb2ludGVyLmRlL2xlbm5hcnQvdGNoaWJvLmh0bWw+LgorCisJICBJZiB5b3UgaGF2ZSBhbiBNU0kgUzI3MCBsYXB0b3AsIHNheSBZIG9yIE0gaGVyZS4KKworY29uZmlnIFBBTkFTT05JQ19MQVBUT1AKKwl0cmlzdGF0ZSAiUGFuYXNvbmljIExhcHRvcCBFeHRyYXMiCisJZGVwZW5kcyBvbiBJTlBVVCAmJiBBQ1BJCisJZGVwZW5kcyBvbiBCQUNLTElHSFRfQ0xBU1NfREVWSUNFCisJLS0taGVscC0tLQorCSAgVGhpcyBkcml2ZXIgYWRkcyBzdXBwb3J0IGZvciBhY2Nlc3MgdG8gYmFja2xpZ2h0IGNvbnRyb2wgYW5kIGhvdGtleXMKKwkgIG9uIFBhbmFzb25pYyBMZXQncyBOb3RlIGxhcHRvcHMuCisKKwkgIElmIHlvdSBoYXZlIGEgUGFuYXNvbmljIExldCdzIG5vdGUgbGFwdG9wIChzdWNoIGFzIHRoZSBSMShOIHZhcmlhbnQpLAorCSAgUjIsIFIzLCBSNSwgVDIsIFcyIGFuZCBZMiBzZXJpZXMpLCBzYXkgWS4KKworY29uZmlnIENPTVBBTF9MQVBUT1AKKwl0cmlzdGF0ZSAiQ29tcGFsIExhcHRvcCBFeHRyYXMiCisJZGVwZW5kcyBvbiBBQ1BJCisJZGVwZW5kcyBvbiBCQUNLTElHSFRfQ0xBU1NfREVWSUNFCisJLS0taGVscC0tLQorCSAgVGhpcyBpcyBhIGRyaXZlciBmb3IgbGFwdG9wcyBidWlsdCBieSBDb21wYWw6CisKKwkgIENvbXBhbCBGTDkwL0lGTDkwCisJICBDb21wYWwgRkw5MS9JRkw5MQorCSAgQ29tcGFsIEZMOTIvSkZMOTIKKwkgIENvbXBhbCBGVDAwL0lGVDAwCisKKwkgIEl0IGFkZHMgc3VwcG9ydCBmb3IgQmx1ZXRvb3RoLCBXTEFOIGFuZCBMQ0QgYnJpZ2h0bmVzcyBjb250cm9sLgorCisJICBJZiB5b3UgaGF2ZSBhbiBDb21wYWwgRkw5eC9JRkw5eC9GVDAwIGxhcHRvcCwgc2F5IFkgb3IgTSBoZXJlLgorCitjb25maWcgU09OWV9MQVBUT1AKKwl0cmlzdGF0ZSAiU29ueSBMYXB0b3AgRXh0cmFzIgorCWRlcGVuZHMgb24gQUNQSQorCXNlbGVjdCBCQUNLTElHSFRfQ0xBU1NfREVWSUNFCisJZGVwZW5kcyBvbiBJTlBVVAorCSAgLS0taGVscC0tLQorCSAgVGhpcyBtaW5pLWRyaXZlciBkcml2ZXMgdGhlIFNOQyBhbmQgU1BJQyBkZXZpY2VzIHByZXNlbnQgaW4gdGhlIEFDUEkKKwkgIEJJT1Mgb2YgdGhlIFNvbnkgVmFpbyBsYXB0b3BzLgorCisJICBJdCBnaXZlcyBhY2Nlc3MgdG8gc29tZSBleHRyYSBsYXB0b3AgZnVuY3Rpb25hbGl0aWVzIGxpa2UgQmx1ZXRvb3RoLAorCSAgc2NyZWVuIGJyaWdodG5lc3MgY29udHJvbCwgRm4ga2V5cyBhbmQgYWxsb3dzIHBvd2VyaW5nIG9uL29mZiBzb21lCisJICBkZXZpY2VzLgorCisJICBSZWFkIDxmaWxlOkRvY3VtZW50YXRpb24vbGFwdG9wcy9zb255LWxhcHRvcC50eHQ+IGZvciBtb3JlIGluZm9ybWF0aW9uLgorCitjb25maWcgU09OWVBJX0NPTVBBVAorCWJvb2wgIlNvbnlwaSBjb21wYXRpYmlsaXR5IgorCWRlcGVuZHMgb24gU09OWV9MQVBUT1AKKwkgIC0tLWhlbHAtLS0KKwkgIEJ1aWxkIHRoZSBzb255cGkgZHJpdmVyIGNvbXBhdGliaWxpdHkgY29kZSBpbnRvIHRoZSBzb255LWxhcHRvcCBkcml2ZXIuCisKK2NvbmZpZyBUSElOS1BBRF9BQ1BJCisJdHJpc3RhdGUgIlRoaW5rUGFkIEFDUEkgTGFwdG9wIEV4dHJhcyIKKwlkZXBlbmRzIG9uIEFDUEkKKwlzZWxlY3QgQkFDS0xJR0hUX0xDRF9TVVBQT1JUCisJc2VsZWN0IEJBQ0tMSUdIVF9DTEFTU19ERVZJQ0UKKwlzZWxlY3QgSFdNT04KKwlzZWxlY3QgTlZSQU0KKwlzZWxlY3QgSU5QVVQKKwlzZWxlY3QgTkVXX0xFRFMKKwlzZWxlY3QgTEVEU19DTEFTUworCXNlbGVjdCBORVQKKwlzZWxlY3QgUkZLSUxMCisJLS0taGVscC0tLQorCSAgVGhpcyBpcyBhIGRyaXZlciBmb3IgdGhlIElCTSBhbmQgTGVub3ZvIFRoaW5rUGFkIGxhcHRvcHMuIEl0IGFkZHMKKwkgIHN1cHBvcnQgZm9yIEZuLUZ4IGtleSBjb21iaW5hdGlvbnMsIEJsdWV0b290aCBjb250cm9sLCB2aWRlbworCSAgb3V0cHV0IHN3aXRjaGluZywgVGhpbmtMaWdodCBjb250cm9sLCBVbHRyYUJheSBlamVjdCBhbmQgbW9yZS4KKwkgIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgZHJpdmVyIHNlZQorCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9sYXB0b3BzL3RoaW5rcGFkLWFjcGkudHh0PiBhbmQKKwkgIDxodHRwOi8vaWJtLWFjcGkuc2YubmV0Lz4gLgorCisJICBUaGlzIGRyaXZlciB3YXMgZm9ybWVybHkga25vd24gYXMgaWJtLWFjcGkuCisKKwkgIElmIHlvdSBoYXZlIGFuIElCTSBvciBMZW5vdm8gVGhpbmtQYWQgbGFwdG9wLCBzYXkgWSBvciBNIGhlcmUuCisKK2NvbmZpZyBUSElOS1BBRF9BQ1BJX0RFQlVHRkFDSUxJVElFUworCWJvb2wgIk1haW50YWluZXIgZGVidWcgZmFjaWxpdGllcyIKKwlkZXBlbmRzIG9uIFRISU5LUEFEX0FDUEkKKwlkZWZhdWx0IG4KKwktLS1oZWxwLS0tCisJICBFbmFibGVzIGV4dHJhIHN0dWZmIGluIHRoZSB0aGlua3BhZC1hY3BpIHdoaWNoIGlzIGNvbXBsZXRlbHkgdXNlbGVzcworCSAgZm9yIG5vcm1hbCB1c2UuICBSZWFkIHRoZSBkcml2ZXIgc291cmNlIHRvIGZpbmQgb3V0IHdoYXQgaXQgZG9lcy4KKworCSAgU2F5IE4gaGVyZSwgdW5sZXNzIHlvdSB3ZXJlIHRvbGQgYnkgYSBrZXJuZWwgbWFpbnRhaW5lciB0byBkbworCSAgb3RoZXJ3aXNlLgorCitjb25maWcgVEhJTktQQURfQUNQSV9ERUJVRworCWJvb2wgIlZlcmJvc2UgZGVidWcgbW9kZSIKKwlkZXBlbmRzIG9uIFRISU5LUEFEX0FDUEkKKwlkZWZhdWx0IG4KKwktLS1oZWxwLS0tCisJICBFbmFibGVzIGV4dHJhIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiwgYXQgdGhlIGV4cGVuc2Ugb2YgYSBzbGlnaHRseQorCSAgaW5jcmVhc2UgaW4gZHJpdmVyIHNpemUuCisKKwkgIElmIHlvdSBhcmUgbm90IHN1cmUsIHNheSBOIGhlcmUuCisKK2NvbmZpZyBUSElOS1BBRF9BQ1BJX0RPQ0sKKwlib29sICJMZWdhY3kgRG9ja2luZyBTdGF0aW9uIFN1cHBvcnQiCisJZGVwZW5kcyBvbiBUSElOS1BBRF9BQ1BJCisJZGVwZW5kcyBvbiBBQ1BJX0RPQ0s9bgorCWRlZmF1bHQgbgorCS0tLWhlbHAtLS0KKwkgIEFsbG93cyB0aGUgdGhpbmtwYWRfYWNwaSBkcml2ZXIgdG8gaGFuZGxlIGRvY2tpbmcgc3RhdGlvbiBldmVudHMuCisJICBUaGlzIHN1cHBvcnQgd2FzIG1hZGUgb2Jzb2xldGUgYnkgdGhlIGdlbmVyaWMgQUNQSSBkb2NraW5nIHN0YXRpb24KKwkgIHN1cHBvcnQgKENPTkZJR19BQ1BJX0RPQ0spLiAgSXQgd2lsbCBhbGxvdyBsb2NraW5nIGFuZCByZW1vdmluZyB0aGUKKwkgIGxhcHRvcCBmcm9tIHRoZSBkb2NraW5nIHN0YXRpb24sIGJ1dCB3aWxsIG5vdCBwcm9wZXJseSBjb25uZWN0IFBDSQorCSAgZGV2aWNlcy4KKworCSAgSWYgeW91IGFyZSBub3Qgc3VyZSwgc2F5IE4gaGVyZS4KKworY29uZmlnIFRISU5LUEFEX0FDUElfQkFZCisJYm9vbCAiTGVnYWN5IFJlbW92YWJsZSBCYXkgU3VwcG9ydCIKKwlkZXBlbmRzIG9uIFRISU5LUEFEX0FDUEkKKwlkZWZhdWx0IHkKKwktLS1oZWxwLS0tCisJICBBbGxvd3MgdGhlIHRoaW5rcGFkX2FjcGkgZHJpdmVyIHRvIGhhbmRsZSByZW1vdmFibGUgYmF5cy4gIEl0IHdpbGwKKwkgIGVsZWN0cmljYWxseSBkaXNhYmxlIHRoZSBkZXZpY2UgaW4gdGhlIGJheSwgYW5kIGFsc28gZ2VuZXJhdGUKKwkgIG5vdGlmaWNhdGlvbnMgd2hlbiB0aGUgYmF5IGxldmVyIGlzIGVqZWN0ZWQgb3IgaW5zZXJ0ZWQuCisKKwkgIElmIHlvdSBhcmUgbm90IHN1cmUsIHNheSBZIGhlcmUuCisKK2NvbmZpZyBUSElOS1BBRF9BQ1BJX1ZJREVPCisJYm9vbCAiVmlkZW8gb3V0cHV0IGNvbnRyb2wgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFRISU5LUEFEX0FDUEkKKwlkZWZhdWx0IHkKKwktLS1oZWxwLS0tCisJICBBbGxvd3MgdGhlIHRoaW5rcGFkX2FjcGkgZHJpdmVyIHRvIHByb3ZpZGUgYW4gaW50ZXJmYWNlIHRvIGNvbnRyb2wKKwkgIHRoZSB2YXJpb3VzIHZpZGVvIG91dHB1dCBwb3J0cy4KKworCSAgVGhpcyBmZWF0dXJlIG9mdGVuIHdvbid0IHdvcmsgd2VsbCwgZGVwZW5kaW5nIG9uIFRoaW5rUGFkIG1vZGVsLAorCSAgZGlzcGxheSBzdGF0ZSwgdmlkZW8gb3V0cHV0IGRldmljZXMgaW4gdXNlLCB3aGV0aGVyIHRoZXJlIGlzIGEgWAorCSAgc2VydmVyIHJ1bm5pbmcsIHBoYXNlIG9mIHRoZSBtb29uLCBhbmQgdGhlIGN1cnJlbnQgbW9vZCBvZgorCSAgU2Nocm9lZGluZ2VyJ3MgY2F0LiAgSWYgeW91IGNhbiB1c2UgWC5vcmcncyBSYW5kUiB0byBjb250cm9sCisJICB5b3VyIFRoaW5rUGFkJ3MgdmlkZW8gb3V0cHV0IHBvcnRzIGluc3RlYWQgb2YgdGhpcyBmZWF0dXJlLAorCSAgZG9uJ3QgdGhpbmsgdHdpY2U6IGRvIGl0IGFuZCBzYXkgTiBoZXJlIHRvIHNhdmUgc29tZSBtZW1vcnkuCisKKwkgIElmIHlvdSBhcmUgbm90IHN1cmUsIHNheSBZIGhlcmUuCisKK2NvbmZpZyBUSElOS1BBRF9BQ1BJX0hPVEtFWV9QT0xMCisJYm9vbCAiU3VwcG9ydCBOVlJBTSBwb2xsaW5nIGZvciBob3Qga2V5cyIKKwlkZXBlbmRzIG9uIFRISU5LUEFEX0FDUEkKKwlkZWZhdWx0IHkKKwktLS1oZWxwLS0tCisJICBTb21lIHRoaW5rcGFkIG1vZGVscyBiZW5lZml0IGZyb20gTlZSQU0gcG9sbGluZyB0byBkZXRlY3QgYSBmZXcgb2YKKwkgIHRoZSBob3Qga2V5IHByZXNzIGV2ZW50cy4gIElmIHlvdSBrbm93IHlvdXIgVGhpbmtQYWQgbW9kZWwgZG9lcyBub3QKKwkgIG5lZWQgdG8gZG8gTlZSQU0gcG9sbGluZyB0byBzdXBwb3J0IGFueSBvZiB0aGUgaG90IGtleXMgeW91IHVzZSwKKwkgIHVuc2VsZWN0aW5nIHRoaXMgb3B0aW9uIHdpbGwgc2F2ZSBhYm91dCAxa0Igb2YgbWVtb3J5LgorCisJICBUaGlua1BhZHMgVDQwIGFuZCBuZXdlciwgUjUyIGFuZCBuZXdlciwgYW5kIFgzMSBhbmQgbmV3ZXIgYXJlCisJICB1bmxpa2VseSB0byBuZWVkIE5WUkFNIHBvbGxpbmcgaW4gdGhlaXIgbGF0ZXN0IEJJT1MgdmVyc2lvbnMuCisKKwkgIE5WUkFNIHBvbGxpbmcgY2FuIGRldGVjdCBhdCBtb3N0IHRoZSBmb2xsb3dpbmcga2V5czogVGhpbmtQYWQvQWNjZXNzCisJICBJQk0sIFpvb20sIFN3aXRjaCBEaXNwbGF5IChmbitGNyksIFRoaW5rTGlnaHQsIFZvbHVtZSB1cC9kb3duL211dGUsCisJICBCcmlnaHRuZXNzIHVwL2Rvd24sIERpc3BsYXkgRXhwYW5kIChmbitGOCksIEhpYmVybmF0ZSAoZm4rRjEyKS4KKworCSAgSWYgeW91IGFyZSBub3Qgc3VyZSwgc2F5IFkgaGVyZS4gIFRoZSBkcml2ZXIgZW5hYmxlcyBwb2xsaW5nIG9ubHkgaWYKKwkgIGl0IGlzIHN0cmljdGx5IG5lY2Vzc2FyeSB0byBkbyBzby4KKworY29uZmlnIElOVEVMX01FTkxPVworCXRyaXN0YXRlICJUaGVybWFsIE1hbmFnZW1lbnQgZHJpdmVyIGZvciBJbnRlbCBtZW5sb3cgcGxhdGZvcm0iCisJZGVwZW5kcyBvbiBBQ1BJX1RIRVJNQUwKKwlzZWxlY3QgVEhFUk1BTAorCS0tLWhlbHAtLS0KKwkgIEFDUEkgdGhlcm1hbCBtYW5hZ2VtZW50IGVuaGFuY2VtZW50IGRyaXZlciBvbgorCSAgSW50ZWwgTWVubG93IHBsYXRmb3JtLgorCisJICBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgRUVFUENfTEFQVE9QCisJdHJpc3RhdGUgIkVlZSBQQyBIb3RrZXkgRHJpdmVyIChFWFBFUklNRU5UQUwpIgorCWRlcGVuZHMgb24gQUNQSQorCWRlcGVuZHMgb24gRVhQRVJJTUVOVEFMCisJc2VsZWN0IEJBQ0tMSUdIVF9DTEFTU19ERVZJQ0UKKwlzZWxlY3QgSFdNT04KKwlzZWxlY3QgUkZLSUxMCisJLS0taGVscC0tLQorCSAgVGhpcyBkcml2ZXIgc3VwcG9ydHMgdGhlIEZuLUZ4IGtleXMgb24gRWVlIFBDIGxhcHRvcHMuCisJICBJdCBhbHNvIGFkZHMgdGhlIGFiaWxpdHkgdG8gc3dpdGNoIGNhbWVyYS93bGFuIG9uL29mZi4KKworCSAgSWYgeW91IGhhdmUgYW4gRWVlIFBDIGxhcHRvcCwgc2F5IFkgb3IgTSBoZXJlLgorCisKK2NvbmZpZyBBQ1BJX1dNSQorCXRyaXN0YXRlICJXTUkgKEVYUEVSSU1FTlRBTCkiCisJZGVwZW5kcyBvbiBBQ1BJCisJZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwKKwloZWxwCisJICBUaGlzIGRyaXZlciBhZGRzIHN1cHBvcnQgZm9yIHRoZSBBQ1BJLVdNSSAoV2luZG93cyBNYW5hZ2VtZW50CisJICBJbnN0cnVtZW50YXRpb24pIG1hcHBlciBkZXZpY2UgKFBOUDBDMTQpIGZvdW5kIG9uIHNvbWUgc3lzdGVtcy4KKworCSAgQUNQSS1XTUkgaXMgYSBwcm9wcmlldGFyeSBleHRlbnNpb24gdG8gQUNQSSB0byBleHBvc2UgcGFydHMgb2YgdGhlCisJICBBQ1BJIGZpcm13YXJlIHRvIHVzZXJzcGFjZSAtIHRoaXMgaXMgZG9uZSB0aHJvdWdoIHZhcmlvdXMgdmVuZG9yCisJICBkZWZpbmVkIG1ldGhvZHMgYW5kIGRhdGEgYmxvY2tzIGluIGEgUE5QMEMxNCBkZXZpY2UsIHdoaWNoIGFyZSB0aGVuCisJICBtYWRlIGF2YWlsYWJsZSBmb3IgdXNlcnNwYWNlIHRvIGNhbGwuCisKKwkgIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGluIExpbnV4IGN1cnJlbnRseSBvbmx5IGV4cG9zZXMgdGhpcyB0bworCSAgb3RoZXIga2VybmVsIHNwYWNlIGRyaXZlcnMuCisKKwkgIFRoaXMgZHJpdmVyIGlzIGEgcmVxdWlyZWQgZGVwZW5kZW5jeSB0byBidWlsZCB0aGUgZmlybXdhcmUgc3BlY2lmaWMKKwkgIGRyaXZlcnMgbmVlZGVkIG9uIG1hbnkgbWFjaGluZXMsIGluY2x1ZGluZyBBY2VyIGFuZCBIUCBsYXB0b3BzLgorCisJICBJdCBpcyBzYWZlIHRvIGVuYWJsZSB0aGlzIGRyaXZlciBldmVuIGlmIHlvdXIgRFNEVCBkb2Vzbid0IGRlZmluZQorCSAgYW55IEFDUEktV01JIGRldmljZXMuCisKK2NvbmZpZyBBQ1BJX0FTVVMKKwl0cmlzdGF0ZSAiQVNVUy9NZWRpb24gTGFwdG9wIEV4dHJhcyIKKwlkZXBlbmRzIG9uIEFDUEkKKwlzZWxlY3QgQkFDS0xJR0hUX0NMQVNTX0RFVklDRQorCS0tLWhlbHAtLS0KKwkgIFRoaXMgZHJpdmVyIHByb3ZpZGVzIHN1cHBvcnQgZm9yIGV4dHJhIGZlYXR1cmVzIG9mIEFDUEktY29tcGF0aWJsZQorCSAgQVNVUyBsYXB0b3BzLiBBcyBzb21lIG9mIE1lZGlvbiBsYXB0b3BzIGFyZSBtYWRlIGJ5IEFTVVMsIGl0IG1heSBhbHNvCisJICBzdXBwb3J0IHNvbWUgTWVkaW9uIGxhcHRvcHMgKHN1Y2ggYXMgOTY3NSBmb3IgZXhhbXBsZSkuICBJdCBtYWtlcyBhbGwKKwkgIHRoZSBleHRyYSBidXR0b25zIGdlbmVyYXRlIHN0YW5kYXJkIEFDUEkgZXZlbnRzIHRoYXQgZ28gdGhyb3VnaAorCSAgL3Byb2MvYWNwaS9ldmVudHMsIGFuZCAob24gc29tZSBtb2RlbHMpIGFkZHMgc3VwcG9ydCBmb3IgY2hhbmdpbmcgdGhlCisJICBkaXNwbGF5IGJyaWdodG5lc3MgYW5kIG91dHB1dCwgc3dpdGNoaW5nIHRoZSBMQ0QgYmFja2xpZ2h0IG9uIGFuZCBvZmYsCisJICBhbmQgbW9zdCBpbXBvcnRhbnRseSwgYWxsb3dzIHlvdSB0byBibGluayB0aG9zZSBmYW5jeSBMRURzIGludGVuZGVkCisJICBmb3IgcmVwb3J0aW5nIG1haWwgYW5kIHdpcmVsZXNzIHN0YXR1cy4KKworCSAgTm90ZTogZGlzcGxheSBzd2l0Y2hpbmcgY29kZSBpcyBjdXJyZW50bHkgY29uc2lkZXJlZCBFWFBFUklNRU5UQUwsCisJICB0b3lpbmcgd2l0aCB0aGVzZSB2YWx1ZXMgbWF5IGV2ZW4gbG9jayB5b3VyIG1hY2hpbmUuCisKKwkgIEFsbCBzZXR0aW5ncyBhcmUgY2hhbmdlZCB2aWEgL3Byb2MvYWNwaS9hc3VzIGRpcmVjdG9yeSBlbnRyaWVzLiBPd25lcgorCSAgYW5kIGdyb3VwIGZvciB0aGVzZSBlbnRyaWVzIGNhbiBiZSBzZXQgd2l0aCBhc3VzX3VpZCBhbmQgYXN1c19naWQKKwkgIHBhcmFtZXRlcnMuCisKKwkgIE1vcmUgaW5mb3JtYXRpb24gYW5kIGEgdXNlcnNwYWNlIGRhZW1vbiBmb3IgaGFuZGxpbmcgdGhlIGV4dHJhIGJ1dHRvbnMKKwkgIGF0IDxodHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL2FjcGk0YXN1cy8+LgorCisJICBJZiB5b3UgaGF2ZSBhbiBBQ1BJLWNvbXBhdGlibGUgQVNVUyBsYXB0b3AsIHNheSBZIG9yIE0gaGVyZS4gVGhpcworCSAgZHJpdmVyIGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50LCBzbyBpZiB5b3VyIGxhcHRvcCBpcyB1bnN1cHBvcnRlZCBvcgorCSAgc29tZXRoaW5nIHdvcmtzIG5vdCBxdWl0ZSBhcyBleHBlY3RlZCwgcGxlYXNlIHVzZSB0aGUgbWFpbGluZyBsaXN0CisJICBhdmFpbGFibGUgb24gdGhlIGFib3ZlIHBhZ2UgKGFjcGk0YXN1cy11c2VyQGxpc3RzLnNvdXJjZWZvcmdlLm5ldCkuCisKKwkgIE5PVEU6IFRoaXMgZHJpdmVyIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgcHJvYmFibHkgYmUgcmVtb3ZlZCBzb29uLAorCSAgdXNlIGFzdXMtbGFwdG9wIGluc3RlYWQuCisKK2NvbmZpZyBBQ1BJX1RPU0hJQkEKKwl0cmlzdGF0ZSAiVG9zaGliYSBMYXB0b3AgRXh0cmFzIgorCWRlcGVuZHMgb24gQUNQSQorCWRlcGVuZHMgb24gSU5QVVQKKwlzZWxlY3QgSU5QVVRfUE9MTERFVgorCXNlbGVjdCBORVQKKwlzZWxlY3QgUkZLSUxMCisJc2VsZWN0IEJBQ0tMSUdIVF9DTEFTU19ERVZJQ0UKKwktLS1oZWxwLS0tCisJICBUaGlzIGRyaXZlciBhZGRzIHN1cHBvcnQgZm9yIGFjY2VzcyB0byBjZXJ0YWluIHN5c3RlbSBzZXR0aW5ncworCSAgb24gImxlZ2FjeSBmcmVlIiBUb3NoaWJhIGxhcHRvcHMuICBUaGVzZSBsYXB0b3BzIGNhbiBiZSByZWNvZ25pemVkIGJ5CisJICB0aGVpciBsYWNrIG9mIGEgQklPUyBzZXR1cCBtZW51IGFuZCBBUE0gc3VwcG9ydC4KKworCSAgT24gdGhlc2UgbWFjaGluZXMsIGFsbCBzeXN0ZW0gY29uZmlndXJhdGlvbiBpcyBoYW5kbGVkIHRocm91Z2ggdGhlCisJICBBQ1BJLiAgVGhpcyBkcml2ZXIgaXMgcmVxdWlyZWQgZm9yIGFjY2VzcyB0byBjb250cm9scyBub3QgY292ZXJlZAorCSAgYnkgdGhlIGdlbmVyYWwgQUNQSSBkcml2ZXJzLCBzdWNoIGFzIExDRCBicmlnaHRuZXNzLCB2aWRlbyBvdXRwdXQsCisJICBldGMuCisKKwkgIFRoaXMgZHJpdmVyIGRpZmZlcnMgZnJvbSB0aGUgbm9uLUFDUEkgVG9zaGliYSBsYXB0b3AgZHJpdmVyIChsb2NhdGVkCisJICB1bmRlciAiUHJvY2Vzc29yIHR5cGUgYW5kIGZlYXR1cmVzIikgaW4gc2V2ZXJhbCBhc3BlY3RzLgorCSAgQ29uZmlndXJhdGlvbiBpcyBhY2Nlc3NlZCBieSByZWFkaW5nIGFuZCB3cml0aW5nIHRleHQgZmlsZXMgaW4gdGhlCisJICAvcHJvYyB0cmVlIGluc3RlYWQgb2YgYnkgcHJvZ3JhbSBpbnRlcmZhY2UgdG8gL2Rldi4gIEZ1cnRoZXJtb3JlLCBubworCSAgcG93ZXIgbWFuYWdlbWVudCBmdW5jdGlvbnMgYXJlIGV4cG9zZWQsIGFzIHRob3NlIGFyZSBoYW5kbGVkIGJ5IHRoZQorCSAgZ2VuZXJhbCBBQ1BJIGRyaXZlcnMuCisKKwkgIE1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBkcml2ZXIgaXMgYXZhaWxhYmxlIGF0CisJICA8aHR0cDovL21lbWViZWFtLm9yZy90b3lzL1Rvc2hpYmFBY3BpRHJpdmVyPi4KKworCSAgSWYgeW91IGhhdmUgYSBsZWdhY3kgZnJlZSBUb3NoaWJhIGxhcHRvcCAoc3VjaCBhcyB0aGUgTGlicmV0dG8gTDEKKwkgIHNlcmllcyksIHNheSBZLgorZW5kaWYgIyBYODZfUExBVEZPUk1fREVWSUNFUwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wbGF0Zm9ybS94ODYvTWFrZWZpbGUgYi9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjkwNjUxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9wbGF0Zm9ybS94ODYvTWFrZWZpbGUKQEAgLTAsMCArMSwyMCBAQAorIworIyBNYWtlZmlsZSBmb3IgbGludXgvZHJpdmVycy9wbGF0Zm9ybS94ODYKKyMgeDg2IFBsYXRmb3JtLVNwZWNpZmljIERyaXZlcnMKKyMKK29iai0kKENPTkZJR19BU1VTX0xBUFRPUCkJKz0gYXN1cy1sYXB0b3Aubworb2JqLSQoQ09ORklHX0VFRVBDX0xBUFRPUCkJKz0gZWVlcGMtbGFwdG9wLm8KK29iai0kKENPTkZJR19NU0lfTEFQVE9QKQkrPSBtc2ktbGFwdG9wLm8KK29iai0kKENPTkZJR19DT01QQUxfTEFQVE9QKQkrPSBjb21wYWwtbGFwdG9wLm8KK29iai0kKENPTkZJR19ERUxMX0xBUFRPUCkJKz0gZGVsbC1sYXB0b3Aubworb2JqLSQoQ09ORklHX0FDRVJfV01JKQkJKz0gYWNlci13bWkubworb2JqLSQoQ09ORklHX0hQX1dNSSkJCSs9IGhwLXdtaS5vCitvYmotJChDT05GSUdfVEMxMTAwX1dNSSkJKz0gdGMxMTAwLXdtaS5vCitvYmotJChDT05GSUdfU09OWV9MQVBUT1ApCSs9IHNvbnktbGFwdG9wLm8KK29iai0kKENPTkZJR19USElOS1BBRF9BQ1BJKQkrPSB0aGlua3BhZF9hY3BpLm8KK29iai0kKENPTkZJR19GVUpJVFNVX0xBUFRPUCkJKz0gZnVqaXRzdS1sYXB0b3Aubworb2JqLSQoQ09ORklHX1BBTkFTT05JQ19MQVBUT1ApCSs9IHBhbmFzb25pYy1sYXB0b3Aubworb2JqLSQoQ09ORklHX0lOVEVMX01FTkxPVykJKz0gaW50ZWxfbWVubG93Lm8KK29iai0kKENPTkZJR19BQ1BJX1dNSSkJCSs9IHdtaS5vCitvYmotJChDT05GSUdfQUNQSV9BU1VTKQkJKz0gYXN1c19hY3BpLm8KK29iai0kKENPTkZJR19BQ1BJX1RPU0hJQkEpCSs9IHRvc2hpYmFfYWNwaS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvYWNlci13bWkuYyBiL2RyaXZlcnMvcGxhdGZvcm0veDg2L2FjZXItd21pLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvbWlzYy9hY2VyLXdtaS5jCnJlbmFtZSB0byBkcml2ZXJzL3BsYXRmb3JtL3g4Ni9hY2VyLXdtaS5jCmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvYXN1cy1sYXB0b3AuYyBiL2RyaXZlcnMvcGxhdGZvcm0veDg2L2FzdXMtbGFwdG9wLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvbWlzYy9hc3VzLWxhcHRvcC5jCnJlbmFtZSB0byBkcml2ZXJzL3BsYXRmb3JtL3g4Ni9hc3VzLWxhcHRvcC5jCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYXN1c19hY3BpLmMgYi9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9hc3VzX2FjcGkuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9hY3BpL2FzdXNfYWNwaS5jCnJlbmFtZSB0byBkcml2ZXJzL3BsYXRmb3JtL3g4Ni9hc3VzX2FjcGkuYwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL2NvbXBhbC1sYXB0b3AuYyBiL2RyaXZlcnMvcGxhdGZvcm0veDg2L2NvbXBhbC1sYXB0b3AuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9taXNjL2NvbXBhbC1sYXB0b3AuYwpyZW5hbWUgdG8gZHJpdmVycy9wbGF0Zm9ybS94ODYvY29tcGFsLWxhcHRvcC5jCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9kZWxsLWxhcHRvcC5jIGIvZHJpdmVycy9wbGF0Zm9ybS94ODYvZGVsbC1sYXB0b3AuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNmUxMWMyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9wbGF0Zm9ybS94ODYvZGVsbC1sYXB0b3AuYwpAQCAtMCwwICsxLDQzNiBAQAorLyoKKyAqICBEcml2ZXIgZm9yIERlbGwgbGFwdG9wIGV4dHJhcworICoKKyAqICBDb3B5cmlnaHQgKGMpIFJlZCBIYXQgPG1qZ0ByZWRoYXQuY29tPgorICoKKyAqICBCYXNlZCBvbiBkb2N1bWVudGF0aW9uIGluIHRoZSBsaWJzbWJpb3MgcGFja2FnZSwgQ29weXJpZ2h0IChDKSAyMDA1IERlbGwKKyAqICBJbmMuCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2JhY2tsaWdodC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L2RtaS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvcmZraWxsLmg+CisjaW5jbHVkZSA8bGludXgvcG93ZXJfc3VwcGx5Lmg+CisjaW5jbHVkZSA8bGludXgvYWNwaS5oPgorI2luY2x1ZGUgIi4uLy4uL2Zpcm13YXJlL2RjZGJhcy5oIgorCisjZGVmaW5lIEJSSUdIVE5FU1NfVE9LRU4gMHg3ZAorCisvKiBUaGlzIHN0cnVjdHVyZSB3aWxsIGJlIG1vZGlmaWVkIGJ5IHRoZSBmaXJtd2FyZSB3aGVuIHdlIGVudGVyCisgKiBzeXN0ZW0gbWFuYWdlbWVudCBtb2RlLCBoZW5jZSB0aGUgdm9sYXRpbGVzICovCisKK3N0cnVjdCBjYWxsaW5nX2ludGVyZmFjZV9idWZmZXIgeworCXUxNiBjbGFzczsKKwl1MTYgc2VsZWN0OworCXZvbGF0aWxlIHUzMiBpbnB1dFs0XTsKKwl2b2xhdGlsZSB1MzIgb3V0cHV0WzRdOworfSBfX3BhY2tlZDsKKworc3RydWN0IGNhbGxpbmdfaW50ZXJmYWNlX3Rva2VuIHsKKwl1MTYgdG9rZW5JRDsKKwl1MTYgbG9jYXRpb247CisJdW5pb24geworCQl1MTYgdmFsdWU7CisJCXUxNiBzdHJpbmdsZW5ndGg7CisJfTsKK307CisKK3N0cnVjdCBjYWxsaW5nX2ludGVyZmFjZV9zdHJ1Y3R1cmUgeworCXN0cnVjdCBkbWlfaGVhZGVyIGhlYWRlcjsKKwl1MTYgY21kSU9BZGRyZXNzOworCXU4IGNtZElPQ29kZTsKKwl1MzIgc3VwcG9ydGVkQ21kczsKKwlzdHJ1Y3QgY2FsbGluZ19pbnRlcmZhY2VfdG9rZW4gdG9rZW5zW107Cit9IF9fcGFja2VkOworCitzdGF0aWMgaW50IGRhX2NvbW1hbmRfYWRkcmVzczsKK3N0YXRpYyBpbnQgZGFfY29tbWFuZF9jb2RlOworc3RhdGljIGludCBkYV9udW1fdG9rZW5zOworc3RhdGljIHN0cnVjdCBjYWxsaW5nX2ludGVyZmFjZV90b2tlbiAqZGFfdG9rZW5zOworCitzdGF0aWMgc3RydWN0IGJhY2tsaWdodF9kZXZpY2UgKmRlbGxfYmFja2xpZ2h0X2RldmljZTsKK3N0YXRpYyBzdHJ1Y3QgcmZraWxsICp3aWZpX3Jma2lsbDsKK3N0YXRpYyBzdHJ1Y3QgcmZraWxsICpibHVldG9vdGhfcmZraWxsOworc3RhdGljIHN0cnVjdCByZmtpbGwgKnd3YW5fcmZraWxsOworCitzdGF0aWMgY29uc3Qgc3RydWN0IGRtaV9zeXN0ZW1faWQgX19pbml0ZGF0YSBkZWxsX2RldmljZV90YWJsZVtdID0geworCXsKKwkJLmlkZW50ID0gIkRlbGwgbGFwdG9wIiwKKwkJLm1hdGNoZXMgPSB7CisJCQlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJEZWxsIEluYy4iKSwKKwkJCURNSV9NQVRDSChETUlfQ0hBU1NJU19UWVBFLCAiOCIpLAorCQl9LAorCX0sCisJeyB9Cit9OworCitzdGF0aWMgdm9pZCBwYXJzZV9kYV90YWJsZShjb25zdCBzdHJ1Y3QgZG1pX2hlYWRlciAqZG0pCit7CisJLyogRmluYWwgdG9rZW4gaXMgYSB0ZXJtaW5hdG9yLCBzbyB3ZSBkb24ndCB3YW50IHRvIGNvcHkgaXQgKi8KKwlpbnQgdG9rZW5zID0gKGRtLT5sZW5ndGgtMTEpL3NpemVvZihzdHJ1Y3QgY2FsbGluZ19pbnRlcmZhY2VfdG9rZW4pLTE7CisJc3RydWN0IGNhbGxpbmdfaW50ZXJmYWNlX3N0cnVjdHVyZSAqdGFibGUgPQorCQljb250YWluZXJfb2YoZG0sIHN0cnVjdCBjYWxsaW5nX2ludGVyZmFjZV9zdHJ1Y3R1cmUsIGhlYWRlcik7CisKKwkvKiA0IGJ5dGVzIG9mIHRhYmxlIGhlYWRlciwgcGx1cyA3IGJ5dGVzIG9mIERlbGwgaGVhZGVyLCBwbHVzIGF0IGxlYXN0CisJICAgNiBieXRlcyBvZiBlbnRyeSAqLworCisJaWYgKGRtLT5sZW5ndGggPCAxNykKKwkJcmV0dXJuOworCisJZGFfY29tbWFuZF9hZGRyZXNzID0gdGFibGUtPmNtZElPQWRkcmVzczsKKwlkYV9jb21tYW5kX2NvZGUgPSB0YWJsZS0+Y21kSU9Db2RlOworCisJZGFfdG9rZW5zID0ga3JlYWxsb2MoZGFfdG9rZW5zLCAoZGFfbnVtX3Rva2VucyArIHRva2VucykgKgorCQkJICAgICBzaXplb2Yoc3RydWN0IGNhbGxpbmdfaW50ZXJmYWNlX3Rva2VuKSwKKwkJCSAgICAgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIWRhX3Rva2VucykKKwkJcmV0dXJuOworCisJbWVtY3B5KGRhX3Rva2VucytkYV9udW1fdG9rZW5zLCB0YWJsZS0+dG9rZW5zLAorCSAgICAgICBzaXplb2Yoc3RydWN0IGNhbGxpbmdfaW50ZXJmYWNlX3Rva2VuKSAqIHRva2Vucyk7CisKKwlkYV9udW1fdG9rZW5zICs9IHRva2VuczsKK30KKworc3RhdGljIHZvaWQgZmluZF90b2tlbnMoY29uc3Qgc3RydWN0IGRtaV9oZWFkZXIgKmRtKQoreworCXN3aXRjaCAoZG0tPnR5cGUpIHsKKwljYXNlIDB4ZDQ6IC8qIEluZGV4ZWQgSU8gKi8KKwkJYnJlYWs7CisJY2FzZSAweGQ1OiAvKiBQcm90ZWN0ZWQgQXJlYSBUeXBlIDEgKi8KKwkJYnJlYWs7CisJY2FzZSAweGQ2OiAvKiBQcm90ZWN0ZWQgQXJlYSBUeXBlIDIgKi8KKwkJYnJlYWs7CisJY2FzZSAweGRhOiAvKiBDYWxsaW5nIGludGVyZmFjZSAqLworCQlwYXJzZV9kYV90YWJsZShkbSk7CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIGludCBmaW5kX3Rva2VuX2xvY2F0aW9uKGludCB0b2tlbmlkKQoreworCWludCBpOworCWZvciAoaSA9IDA7IGkgPCBkYV9udW1fdG9rZW5zOyBpKyspIHsKKwkJaWYgKGRhX3Rva2Vuc1tpXS50b2tlbklEID09IHRva2VuaWQpCisJCQlyZXR1cm4gZGFfdG9rZW5zW2ldLmxvY2F0aW9uOworCX0KKworCXJldHVybiAtMTsKK30KKworc3RhdGljIHN0cnVjdCBjYWxsaW5nX2ludGVyZmFjZV9idWZmZXIgKgorZGVsbF9zZW5kX3JlcXVlc3Qoc3RydWN0IGNhbGxpbmdfaW50ZXJmYWNlX2J1ZmZlciAqYnVmZmVyLCBpbnQgY2xhc3MsCisJCSAgaW50IHNlbGVjdCkKK3sKKwlzdHJ1Y3Qgc21pX2NtZCBjb21tYW5kOworCisJY29tbWFuZC5tYWdpYyA9IFNNSV9DTURfTUFHSUM7CisJY29tbWFuZC5jb21tYW5kX2FkZHJlc3MgPSBkYV9jb21tYW5kX2FkZHJlc3M7CisJY29tbWFuZC5jb21tYW5kX2NvZGUgPSBkYV9jb21tYW5kX2NvZGU7CisJY29tbWFuZC5lYnggPSB2aXJ0X3RvX3BoeXMoYnVmZmVyKTsKKwljb21tYW5kLmVjeCA9IDB4NDI1MzQ5MzE7CisKKwlidWZmZXItPmNsYXNzID0gY2xhc3M7CisJYnVmZmVyLT5zZWxlY3QgPSBzZWxlY3Q7CisKKwlkY2RiYXNfc21pX3JlcXVlc3QoJmNvbW1hbmQpOworCisJcmV0dXJuIGJ1ZmZlcjsKK30KKworLyogRGVyaXZlZCBmcm9tIGluZm9ybWF0aW9uIGluIERlbGxXaXJlbGVzc0N0bC5jcHA6CisgICBDbGFzcyAxNywgc2VsZWN0IDExIGlzIHJhZGlvIGNvbnRyb2wuIEl0IHJldHVybnMgYW4gYXJyYXkgb2YgMzItYml0IHZhbHVlcy4KKworICAgcmVzdWx0WzBdOiByZXR1cm4gY29kZQorICAgcmVzdWx0WzFdOgorICAgICBCaXQgMDogICAgICBIYXJkd2FyZSBzd2l0Y2ggc3VwcG9ydGVkCisgICAgIEJpdCAxOiAgICAgIFdpZmkgbG9jYXRvciBzdXBwb3J0ZWQKKyAgICAgQml0IDI6ICAgICAgV2lmaSBpcyBzdXBwb3J0ZWQKKyAgICAgQml0IDM6ICAgICAgQmx1ZXRvb3RoIGlzIHN1cHBvcnRlZAorICAgICBCaXQgNDogICAgICBXV0FOIGlzIHN1cHBvcnRlZAorICAgICBCaXQgNTogICAgICBXaXJlbGVzcyBrZXlib2FyZCBzdXBwb3J0ZWQKKyAgICAgQml0cyA2LTc6ICAgUmVzZXJ2ZWQKKyAgICAgQml0IDg6ICAgICAgV2lmaSBpcyBpbnN0YWxsZWQKKyAgICAgQml0IDk6ICAgICAgQmx1ZXRvb3RoIGlzIGluc3RhbGxlZAorICAgICBCaXQgMTA6ICAgICBXV0FOIGlzIGluc3RhbGxlZAorICAgICBCaXRzIDExLTE1OiBSZXNlcnZlZAorICAgICBCaXQgMTY6ICAgICBIYXJkd2FyZSBzd2l0Y2ggaXMgb24KKyAgICAgQml0IDE3OiAgICAgV2lmaSBpcyBibG9ja2VkCisgICAgIEJpdCAxODogICAgIEJsdWV0b290aCBpcyBibG9ja2VkCisgICAgIEJpdCAxOTogICAgIFdXQU4gaXMgYmxvY2tlZAorICAgICBCaXRzIDIwLTMxOiBSZXNlcnZlZAorICAgcmVzdWx0WzJdOiBOVlJBTSBzaXplIGluIGJ5dGVzCisgICByZXN1bHRbM106IE5WUkFNIGZvcm1hdCB2ZXJzaW9uIG51bWJlcgorKi8KKworc3RhdGljIGludCBkZWxsX3Jma2lsbF9zZXQoaW50IHJhZGlvLCBlbnVtIHJma2lsbF9zdGF0ZSBzdGF0ZSkKK3sKKwlzdHJ1Y3QgY2FsbGluZ19pbnRlcmZhY2VfYnVmZmVyIGJ1ZmZlcjsKKwlpbnQgZGlzYWJsZSA9IChzdGF0ZSA9PSBSRktJTExfU1RBVEVfVU5CTE9DS0VEKSA/IDAgOiAxOworCisJbWVtc2V0KCZidWZmZXIsIDAsIHNpemVvZihzdHJ1Y3QgY2FsbGluZ19pbnRlcmZhY2VfYnVmZmVyKSk7CisJYnVmZmVyLmlucHV0WzBdID0gKDEgfCAocmFkaW88PDgpIHwgKGRpc2FibGUgPDwgMTYpKTsKKwlkZWxsX3NlbmRfcmVxdWVzdCgmYnVmZmVyLCAxNywgMTEpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGVsbF93aWZpX3NldCh2b2lkICpkYXRhLCBlbnVtIHJma2lsbF9zdGF0ZSBzdGF0ZSkKK3sKKwlyZXR1cm4gZGVsbF9yZmtpbGxfc2V0KDEsIHN0YXRlKTsKK30KKworc3RhdGljIGludCBkZWxsX2JsdWV0b290aF9zZXQodm9pZCAqZGF0YSwgZW51bSByZmtpbGxfc3RhdGUgc3RhdGUpCit7CisJcmV0dXJuIGRlbGxfcmZraWxsX3NldCgyLCBzdGF0ZSk7Cit9CisKK3N0YXRpYyBpbnQgZGVsbF93d2FuX3NldCh2b2lkICpkYXRhLCBlbnVtIHJma2lsbF9zdGF0ZSBzdGF0ZSkKK3sKKwlyZXR1cm4gZGVsbF9yZmtpbGxfc2V0KDMsIHN0YXRlKTsKK30KKworc3RhdGljIGludCBkZWxsX3Jma2lsbF9nZXQoaW50IGJpdCwgZW51bSByZmtpbGxfc3RhdGUgKnN0YXRlKQoreworCXN0cnVjdCBjYWxsaW5nX2ludGVyZmFjZV9idWZmZXIgYnVmZmVyOworCWludCBzdGF0dXM7CisJaW50IG5ld19zdGF0ZSA9IFJGS0lMTF9TVEFURV9IQVJEX0JMT0NLRUQ7CisKKwltZW1zZXQoJmJ1ZmZlciwgMCwgc2l6ZW9mKHN0cnVjdCBjYWxsaW5nX2ludGVyZmFjZV9idWZmZXIpKTsKKwlkZWxsX3NlbmRfcmVxdWVzdCgmYnVmZmVyLCAxNywgMTEpOworCXN0YXR1cyA9IGJ1ZmZlci5vdXRwdXRbMV07CisKKwlpZiAoc3RhdHVzICYgKDE8PDE2KSkKKwkJbmV3X3N0YXRlID0gUkZLSUxMX1NUQVRFX1NPRlRfQkxPQ0tFRDsKKworCWlmIChzdGF0dXMgJiAoMTw8Yml0KSkKKwkJKnN0YXRlID0gbmV3X3N0YXRlOworCWVsc2UKKwkJKnN0YXRlID0gUkZLSUxMX1NUQVRFX1VOQkxPQ0tFRDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRlbGxfd2lmaV9nZXQodm9pZCAqZGF0YSwgZW51bSByZmtpbGxfc3RhdGUgKnN0YXRlKQoreworCXJldHVybiBkZWxsX3Jma2lsbF9nZXQoMTcsIHN0YXRlKTsKK30KKworc3RhdGljIGludCBkZWxsX2JsdWV0b290aF9nZXQodm9pZCAqZGF0YSwgZW51bSByZmtpbGxfc3RhdGUgKnN0YXRlKQoreworCXJldHVybiBkZWxsX3Jma2lsbF9nZXQoMTgsIHN0YXRlKTsKK30KKworc3RhdGljIGludCBkZWxsX3d3YW5fZ2V0KHZvaWQgKmRhdGEsIGVudW0gcmZraWxsX3N0YXRlICpzdGF0ZSkKK3sKKwlyZXR1cm4gZGVsbF9yZmtpbGxfZ2V0KDE5LCBzdGF0ZSk7Cit9CisKK3N0YXRpYyBpbnQgZGVsbF9zZXR1cF9yZmtpbGwodm9pZCkKK3sKKwlzdHJ1Y3QgY2FsbGluZ19pbnRlcmZhY2VfYnVmZmVyIGJ1ZmZlcjsKKwlpbnQgc3RhdHVzOworCWludCByZXQ7CisKKwltZW1zZXQoJmJ1ZmZlciwgMCwgc2l6ZW9mKHN0cnVjdCBjYWxsaW5nX2ludGVyZmFjZV9idWZmZXIpKTsKKwlkZWxsX3NlbmRfcmVxdWVzdCgmYnVmZmVyLCAxNywgMTEpOworCXN0YXR1cyA9IGJ1ZmZlci5vdXRwdXRbMV07CisKKwlpZiAoKHN0YXR1cyAmICgxPDwyfDE8PDgpKSA9PSAoMTw8MnwxPDw4KSkgeworCQl3aWZpX3Jma2lsbCA9IHJma2lsbF9hbGxvY2F0ZShOVUxMLCBSRktJTExfVFlQRV9XTEFOKTsKKwkJaWYgKCF3aWZpX3Jma2lsbCkKKwkJCWdvdG8gZXJyX3dpZmk7CisJCXdpZmlfcmZraWxsLT5uYW1lID0gImRlbGwtd2lmaSI7CisJCXdpZmlfcmZraWxsLT50b2dnbGVfcmFkaW8gPSBkZWxsX3dpZmlfc2V0OworCQl3aWZpX3Jma2lsbC0+Z2V0X3N0YXRlID0gZGVsbF93aWZpX2dldDsKKwkJcmV0ID0gcmZraWxsX3JlZ2lzdGVyKHdpZmlfcmZraWxsKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZXJyX3dpZmk7CisJfQorCisJaWYgKChzdGF0dXMgJiAoMTw8M3wxPDw5KSkgPT0gKDE8PDN8MTw8OSkpIHsKKwkJYmx1ZXRvb3RoX3Jma2lsbCA9IHJma2lsbF9hbGxvY2F0ZShOVUxMLCBSRktJTExfVFlQRV9CTFVFVE9PVEgpOworCQlpZiAoIWJsdWV0b290aF9yZmtpbGwpCisJCQlnb3RvIGVycl9ibHVldG9vdGg7CisJCWJsdWV0b290aF9yZmtpbGwtPm5hbWUgPSAiZGVsbC1ibHVldG9vdGgiOworCQlibHVldG9vdGhfcmZraWxsLT50b2dnbGVfcmFkaW8gPSBkZWxsX2JsdWV0b290aF9zZXQ7CisJCWJsdWV0b290aF9yZmtpbGwtPmdldF9zdGF0ZSA9IGRlbGxfYmx1ZXRvb3RoX2dldDsKKwkJcmV0ID0gcmZraWxsX3JlZ2lzdGVyKGJsdWV0b290aF9yZmtpbGwpOworCQlpZiAocmV0KQorCQkJZ290byBlcnJfYmx1ZXRvb3RoOworCX0KKworCWlmICgoc3RhdHVzICYgKDE8PDR8MTw8MTApKSA9PSAoMTw8NHwxPDwxMCkpIHsKKwkJd3dhbl9yZmtpbGwgPSByZmtpbGxfYWxsb2NhdGUoTlVMTCwgUkZLSUxMX1RZUEVfV1dBTik7CisJCWlmICghd3dhbl9yZmtpbGwpCisJCQlnb3RvIGVycl93d2FuOworCQl3d2FuX3Jma2lsbC0+bmFtZSA9ICJkZWxsLXd3YW4iOworCQl3d2FuX3Jma2lsbC0+dG9nZ2xlX3JhZGlvID0gZGVsbF93d2FuX3NldDsKKwkJd3dhbl9yZmtpbGwtPmdldF9zdGF0ZSA9IGRlbGxfd3dhbl9nZXQ7CisJCXJldCA9IHJma2lsbF9yZWdpc3Rlcih3d2FuX3Jma2lsbCk7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycl93d2FuOworCX0KKworCXJldHVybiAwOworZXJyX3d3YW46CisJaWYgKHd3YW5fcmZraWxsKQorCQlyZmtpbGxfZnJlZSh3d2FuX3Jma2lsbCk7CisJaWYgKGJsdWV0b290aF9yZmtpbGwpIHsKKwkJcmZraWxsX3VucmVnaXN0ZXIoYmx1ZXRvb3RoX3Jma2lsbCk7CisJCWJsdWV0b290aF9yZmtpbGwgPSBOVUxMOworCX0KK2Vycl9ibHVldG9vdGg6CisJaWYgKGJsdWV0b290aF9yZmtpbGwpCisJCXJma2lsbF9mcmVlKGJsdWV0b290aF9yZmtpbGwpOworCWlmICh3aWZpX3Jma2lsbCkgeworCQlyZmtpbGxfdW5yZWdpc3Rlcih3aWZpX3Jma2lsbCk7CisJCXdpZmlfcmZraWxsID0gTlVMTDsKKwl9CitlcnJfd2lmaToKKwlpZiAod2lmaV9yZmtpbGwpCisJCXJma2lsbF9mcmVlKHdpZmlfcmZraWxsKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZGVsbF9zZW5kX2ludGVuc2l0eShzdHJ1Y3QgYmFja2xpZ2h0X2RldmljZSAqYmQpCit7CisJc3RydWN0IGNhbGxpbmdfaW50ZXJmYWNlX2J1ZmZlciBidWZmZXI7CisKKwltZW1zZXQoJmJ1ZmZlciwgMCwgc2l6ZW9mKHN0cnVjdCBjYWxsaW5nX2ludGVyZmFjZV9idWZmZXIpKTsKKwlidWZmZXIuaW5wdXRbMF0gPSBmaW5kX3Rva2VuX2xvY2F0aW9uKEJSSUdIVE5FU1NfVE9LRU4pOworCWJ1ZmZlci5pbnB1dFsxXSA9IGJkLT5wcm9wcy5icmlnaHRuZXNzOworCisJaWYgKGJ1ZmZlci5pbnB1dFswXSA9PSAtMSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZiAocG93ZXJfc3VwcGx5X2lzX3N5c3RlbV9zdXBwbGllZCgpID4gMCkKKwkJZGVsbF9zZW5kX3JlcXVlc3QoJmJ1ZmZlciwgMSwgMik7CisJZWxzZQorCQlkZWxsX3NlbmRfcmVxdWVzdCgmYnVmZmVyLCAxLCAxKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRlbGxfZ2V0X2ludGVuc2l0eShzdHJ1Y3QgYmFja2xpZ2h0X2RldmljZSAqYmQpCit7CisJc3RydWN0IGNhbGxpbmdfaW50ZXJmYWNlX2J1ZmZlciBidWZmZXI7CisKKwltZW1zZXQoJmJ1ZmZlciwgMCwgc2l6ZW9mKHN0cnVjdCBjYWxsaW5nX2ludGVyZmFjZV9idWZmZXIpKTsKKwlidWZmZXIuaW5wdXRbMF0gPSBmaW5kX3Rva2VuX2xvY2F0aW9uKEJSSUdIVE5FU1NfVE9LRU4pOworCisJaWYgKGJ1ZmZlci5pbnB1dFswXSA9PSAtMSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZiAocG93ZXJfc3VwcGx5X2lzX3N5c3RlbV9zdXBwbGllZCgpID4gMCkKKwkJZGVsbF9zZW5kX3JlcXVlc3QoJmJ1ZmZlciwgMCwgMik7CisJZWxzZQorCQlkZWxsX3NlbmRfcmVxdWVzdCgmYnVmZmVyLCAwLCAxKTsKKworCXJldHVybiBidWZmZXIub3V0cHV0WzFdOworfQorCitzdGF0aWMgc3RydWN0IGJhY2tsaWdodF9vcHMgZGVsbF9vcHMgPSB7CisJLmdldF9icmlnaHRuZXNzID0gZGVsbF9nZXRfaW50ZW5zaXR5LAorCS51cGRhdGVfc3RhdHVzICA9IGRlbGxfc2VuZF9pbnRlbnNpdHksCit9OworCitzdGF0aWMgaW50IF9faW5pdCBkZWxsX2luaXQodm9pZCkKK3sKKwlzdHJ1Y3QgY2FsbGluZ19pbnRlcmZhY2VfYnVmZmVyIGJ1ZmZlcjsKKwlpbnQgbWF4X2ludGVuc2l0eSA9IDA7CisJaW50IHJldDsKKworCWlmICghZG1pX2NoZWNrX3N5c3RlbShkZWxsX2RldmljZV90YWJsZSkpCisJCXJldHVybiAtRU5PREVWOworCisJZG1pX3dhbGsoZmluZF90b2tlbnMpOworCisJaWYgKCFkYV90b2tlbnMpICB7CisJCXByaW50ayhLRVJOX0lORk8gImRlbGwtbGFwdG9wOiBVbmFibGUgdG8gZmluZCBkbWkgdG9rZW5zXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJcmV0ID0gZGVsbF9zZXR1cF9yZmtpbGwoKTsKKworCWlmIChyZXQpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiZGVsbC1sYXB0b3A6IFVuYWJsZSB0byBzZXR1cCByZmtpbGxcbiIpOworCQlnb3RvIG91dDsKKwl9CisKKyNpZmRlZiBDT05GSUdfQUNQSQorCS8qIEluIHRoZSBldmVudCBvZiBhbiBBQ1BJIGJhY2tsaWdodCBiZWluZyBhdmFpbGFibGUsIGRvbid0CisJICogcmVnaXN0ZXIgdGhlIHBsYXRmb3JtIGNvbnRyb2xsZXIuCisJICovCisJaWYgKGFjcGlfdmlkZW9fYmFja2xpZ2h0X3N1cHBvcnQoKSkKKwkJcmV0dXJuIDA7CisjZW5kaWYKKworCW1lbXNldCgmYnVmZmVyLCAwLCBzaXplb2Yoc3RydWN0IGNhbGxpbmdfaW50ZXJmYWNlX2J1ZmZlcikpOworCWJ1ZmZlci5pbnB1dFswXSA9IGZpbmRfdG9rZW5fbG9jYXRpb24oQlJJR0hUTkVTU19UT0tFTik7CisKKwlpZiAoYnVmZmVyLmlucHV0WzBdICE9IC0xKSB7CisJCWRlbGxfc2VuZF9yZXF1ZXN0KCZidWZmZXIsIDAsIDIpOworCQltYXhfaW50ZW5zaXR5ID0gYnVmZmVyLm91dHB1dFszXTsKKwl9CisKKwlpZiAobWF4X2ludGVuc2l0eSkgeworCQlkZWxsX2JhY2tsaWdodF9kZXZpY2UgPSBiYWNrbGlnaHRfZGV2aWNlX3JlZ2lzdGVyKAorCQkJImRlbGxfYmFja2xpZ2h0IiwKKwkJCU5VTEwsIE5VTEwsCisJCQkmZGVsbF9vcHMpOworCisJCWlmIChJU19FUlIoZGVsbF9iYWNrbGlnaHRfZGV2aWNlKSkgeworCQkJcmV0ID0gUFRSX0VSUihkZWxsX2JhY2tsaWdodF9kZXZpY2UpOworCQkJZGVsbF9iYWNrbGlnaHRfZGV2aWNlID0gTlVMTDsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJZGVsbF9iYWNrbGlnaHRfZGV2aWNlLT5wcm9wcy5tYXhfYnJpZ2h0bmVzcyA9IG1heF9pbnRlbnNpdHk7CisJCWRlbGxfYmFja2xpZ2h0X2RldmljZS0+cHJvcHMuYnJpZ2h0bmVzcyA9CisJCQlkZWxsX2dldF9pbnRlbnNpdHkoZGVsbF9iYWNrbGlnaHRfZGV2aWNlKTsKKwkJYmFja2xpZ2h0X3VwZGF0ZV9zdGF0dXMoZGVsbF9iYWNrbGlnaHRfZGV2aWNlKTsKKwl9CisKKwlyZXR1cm4gMDsKK291dDoKKwlpZiAod2lmaV9yZmtpbGwpCisJCXJma2lsbF91bnJlZ2lzdGVyKHdpZmlfcmZraWxsKTsKKwlpZiAoYmx1ZXRvb3RoX3Jma2lsbCkKKwkJcmZraWxsX3VucmVnaXN0ZXIoYmx1ZXRvb3RoX3Jma2lsbCk7CisJaWYgKHd3YW5fcmZraWxsKQorCQlyZmtpbGxfdW5yZWdpc3Rlcih3d2FuX3Jma2lsbCk7CisJa2ZyZWUoZGFfdG9rZW5zKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZGVsbF9leGl0KHZvaWQpCit7CisJYmFja2xpZ2h0X2RldmljZV91bnJlZ2lzdGVyKGRlbGxfYmFja2xpZ2h0X2RldmljZSk7CisJaWYgKHdpZmlfcmZraWxsKQorCQlyZmtpbGxfdW5yZWdpc3Rlcih3aWZpX3Jma2lsbCk7CisJaWYgKGJsdWV0b290aF9yZmtpbGwpCisJCXJma2lsbF91bnJlZ2lzdGVyKGJsdWV0b290aF9yZmtpbGwpOworCWlmICh3d2FuX3Jma2lsbCkKKwkJcmZraWxsX3VucmVnaXN0ZXIod3dhbl9yZmtpbGwpOworfQorCittb2R1bGVfaW5pdChkZWxsX2luaXQpOworbW9kdWxlX2V4aXQoZGVsbF9leGl0KTsKKworTU9EVUxFX0FVVEhPUigiTWF0dGhldyBHYXJyZXR0IDxtamdAcmVkaGF0LmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiRGVsbCBsYXB0b3AgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQUxJQVMoImRtaToqc3ZuRGVsbEluYy46KjpjdDg6KiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wbGF0Zm9ybS94ODYvZWVlcGMtbGFwdG9wLmMgYi9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9lZWVwYy1sYXB0b3AuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDkzY2I5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9wbGF0Zm9ybS94ODYvZWVlcGMtbGFwdG9wLmMKQEAgLTAsMCArMSw4NzIgQEAKKy8qCisgKiAgZWVwYy1sYXB0b3AuYyAtIEFzdXMgRWVlIFBDIGV4dHJhcworICoKKyAqICBCYXNlZCBvbiBhc3VzX2FjcGkuYyBhcyBwYXRjaGVkIGZvciB0aGUgRWVlIFBDIGJ5IEFzdXM6CisgKiAgZnRwOi8vZnRwLmFzdXMuY29tL3B1Yi9BU1VTL0VlZVBDLzcwMS9BU1VTX0FDUElfMDcxMTI2LnJhcgorICogIEJhc2VkIG9uIGVlZS5jIGZyb20gZWVlcGMtbGludXgKKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvYmFja2xpZ2h0Lmg+CisjaW5jbHVkZSA8bGludXgvZmIuaD4KKyNpbmNsdWRlIDxsaW51eC9od21vbi5oPgorI2luY2x1ZGUgPGxpbnV4L2h3bW9uLXN5c2ZzLmg+CisjaW5jbHVkZSA8YWNwaS9hY3BpX2RyaXZlcnMuaD4KKyNpbmNsdWRlIDxhY3BpL2FjcGlfYnVzLmg+CisjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CisjaW5jbHVkZSA8bGludXgvcmZraWxsLmg+CisKKyNkZWZpbmUgRUVFUENfTEFQVE9QX1ZFUlNJT04JIjAuMSIKKworI2RlZmluZSBFRUVQQ19IT1RLX05BTUUJCSJFZWUgUEMgSG90a2V5IERyaXZlciIKKyNkZWZpbmUgRUVFUENfSE9US19GSUxFCQkiZWVlcGMiCisjZGVmaW5lIEVFRVBDX0hPVEtfQ0xBU1MJImhvdGtleSIKKyNkZWZpbmUgRUVFUENfSE9US19ERVZJQ0VfTkFNRQkiSG90a2V5IgorI2RlZmluZSBFRUVQQ19IT1RLX0hJRAkJIkFTVVMwMTAiCisKKyNkZWZpbmUgRUVFUENfTE9HCUVFRVBDX0hPVEtfRklMRSAiOiAiCisjZGVmaW5lIEVFRVBDX0VSUglLRVJOX0VSUglFRUVQQ19MT0cKKyNkZWZpbmUgRUVFUENfV0FSTklORwlLRVJOX1dBUk5JTkcJRUVFUENfTE9HCisjZGVmaW5lIEVFRVBDX05PVElDRQlLRVJOX05PVElDRQlFRUVQQ19MT0cKKyNkZWZpbmUgRUVFUENfSU5GTwlLRVJOX0lORk8JRUVFUENfTE9HCisKKy8qCisgKiBEZWZpbml0aW9ucyBmb3IgQXN1cyBFZWVQQworICovCisjZGVmaW5lCU5PVElGWV9XTEFOX09OCTB4MTAKKyNkZWZpbmUgTk9USUZZX0JSTl9NSU4JMHgyMAorI2RlZmluZSBOT1RJRllfQlJOX01BWAkweDJmCisKK2VudW0geworCURJU0FCTEVfQVNMX1dMQU4gPSAweDAwMDEsCisJRElTQUJMRV9BU0xfQkxVRVRPT1RIID0gMHgwMDAyLAorCURJU0FCTEVfQVNMX0lSREEgPSAweDAwMDQsCisJRElTQUJMRV9BU0xfQ0FNRVJBID0gMHgwMDA4LAorCURJU0FCTEVfQVNMX1RWID0gMHgwMDEwLAorCURJU0FCTEVfQVNMX0dQUyA9IDB4MDAyMCwKKwlESVNBQkxFX0FTTF9ESVNQTEFZU1dJVENIID0gMHgwMDQwLAorCURJU0FCTEVfQVNMX01PREVNID0gMHgwMDgwLAorCURJU0FCTEVfQVNMX0NBUkRSRUFERVIgPSAweDAxMDAKK307CisKK2VudW0geworCUNNX0FTTF9XTEFOID0gMCwKKwlDTV9BU0xfQkxVRVRPT1RILAorCUNNX0FTTF9JUkRBLAorCUNNX0FTTF8xMzk0LAorCUNNX0FTTF9DQU1FUkEsCisJQ01fQVNMX1RWLAorCUNNX0FTTF9HUFMsCisJQ01fQVNMX0RWRFJPTSwKKwlDTV9BU0xfRElTUExBWVNXSVRDSCwKKwlDTV9BU0xfUEFORUxCUklHSFQsCisJQ01fQVNMX0JJT1NGTEFTSCwKKwlDTV9BU0xfQUNQSUZMQVNILAorCUNNX0FTTF9DUFVGViwKKwlDTV9BU0xfQ1BVVEVNUEVSQVRVUkUsCisJQ01fQVNMX0ZBTkNQVSwKKwlDTV9BU0xfRkFOQ0hBU1NJUywKKwlDTV9BU0xfVVNCUE9SVDEsCisJQ01fQVNMX1VTQlBPUlQyLAorCUNNX0FTTF9VU0JQT1JUMywKKwlDTV9BU0xfTU9ERU0sCisJQ01fQVNMX0NBUkRSRUFERVIsCisJQ01fQVNMX0xJRAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmNtX2dldHZbXSA9IHsKKwkiV0xERyIsICJCVEhHIiwgTlVMTCwgTlVMTCwKKwkiQ0FNRyIsIE5VTEwsIE5VTEwsIE5VTEwsCisJTlVMTCwgIlBCTEciLCBOVUxMLCBOVUxMLAorCSJDRlZHIiwgTlVMTCwgTlVMTCwgTlVMTCwKKwkiVVNCRyIsIE5VTEwsIE5VTEwsICJNT0RHIiwKKwkiQ1JERyIsICJMSURHIgorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmNtX3NldHZbXSA9IHsKKwkiV0xEUyIsICJCVEhTIiwgTlVMTCwgTlVMTCwKKwkiQ0FNUyIsIE5VTEwsIE5VTEwsIE5VTEwsCisJIlNEU1AiLCAiUEJMUyIsICJIRFBTIiwgTlVMTCwKKwkiQ0ZWUyIsIE5VTEwsIE5VTEwsIE5VTEwsCisJIlVTQkciLCBOVUxMLCBOVUxMLCAiTU9EUyIsCisJIkNSRFMiLCBOVUxMCit9OworCisjZGVmaW5lIEVFRVBDX0VDCSJcXF9TQi5QQ0kwLlNCUkcuRUMwLiIKKworI2RlZmluZSBFRUVQQ19FQ19GQU5fUFdNCUVFRVBDX0VDICJTQzAyIiAvKiBGYW4gUFdNIGR1dHkgY3ljbGUgKCUpICovCisjZGVmaW5lIEVFRVBDX0VDX1NDMDIJCTB4NjMKKyNkZWZpbmUgRUVFUENfRUNfRkFOX0hSUE0JRUVFUENfRUMgIlNDMDUiIC8qIEhpZ2ggYnl0ZSwgZmFuIHNwZWVkIChSUE0pICovCisjZGVmaW5lIEVFRVBDX0VDX0ZBTl9MUlBNCUVFRVBDX0VDICJTQzA2IiAvKiBMb3cgYnl0ZSwgZmFuIHNwZWVkIChSUE0pICovCisjZGVmaW5lIEVFRVBDX0VDX0ZBTl9DVFJMCUVFRVBDX0VDICJTRkIzIiAvKiBCeXRlIGNvbnRhaW5pbmcgU0YyNSAgKi8KKyNkZWZpbmUgRUVFUENfRUNfU0ZCMwkJMHhEMworCisvKgorICogVGhpcyBpcyB0aGUgbWFpbiBzdHJ1Y3R1cmUsIHdlIGNhbiB1c2UgaXQgdG8gc3RvcmUgdXNlZnVsIGluZm9ybWF0aW9uCisgKiBhYm91dCB0aGUgaG90ayBkZXZpY2UKKyAqLworc3RydWN0IGVlZXBjX2hvdGsgeworCXN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlOwkvKiB0aGUgZGV2aWNlIHdlIGFyZSBpbiAqLworCWFjcGlfaGFuZGxlIGhhbmRsZTsJCS8qIHRoZSBoYW5kbGUgb2YgdGhlIGhvdGsgZGV2aWNlICovCisJdTMyIGNtX3N1cHBvcnRlZDsJCS8qIHRoZSBjb250cm9sIG1ldGhvZHMgc3VwcG9ydGVkCisJCQkJCSAgIGJ5IHRoaXMgQklPUyAqLworCXVpbnQgaW5pdF9mbGFnOwkJCS8qIEluaXQgZmxhZ3MgKi8KKwl1MTYgZXZlbnRfY291bnRbMTI4XTsJCS8qIGNvdW50IGZvciBlYWNoIGV2ZW50ICovCisJc3RydWN0IGlucHV0X2RldiAqaW5wdXRkZXY7CisJdTE2ICprZXljb2RlX21hcDsKKwlzdHJ1Y3QgcmZraWxsICplZWVwY193bGFuX3Jma2lsbDsKKwlzdHJ1Y3QgcmZraWxsICplZWVwY19ibHVldG9vdGhfcmZraWxsOworfTsKKworLyogVGhlIGFjdHVhbCBkZXZpY2UgdGhlIGRyaXZlciBiaW5kcyB0byAqLworc3RhdGljIHN0cnVjdCBlZWVwY19ob3RrICplaG90azsKKworLyogUGxhdGZvcm0gZGV2aWNlL2RyaXZlciAqLworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgcGxhdGZvcm1fZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gRUVFUENfSE9US19GSUxFLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwl9Cit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGxhdGZvcm1fZGV2aWNlOworCitzdHJ1Y3Qga2V5X2VudHJ5IHsKKwljaGFyIHR5cGU7CisJdTggY29kZTsKKwl1MTYga2V5Y29kZTsKK307CisKK2VudW0geyBLRV9LRVksIEtFX0VORCB9OworCitzdGF0aWMgc3RydWN0IGtleV9lbnRyeSBlZWVwY19rZXltYXBbXSA9IHsKKwkvKiBTbGVlcCBhbHJlYWR5IGhhbmRsZWQgdmlhIGdlbmVyaWMgQUNQSSBjb2RlICovCisJe0tFX0tFWSwgMHgxMCwgS0VZX1dMQU4gfSwKKwl7S0VfS0VZLCAweDEyLCBLRVlfUFJPRzEgfSwKKwl7S0VfS0VZLCAweDEzLCBLRVlfTVVURSB9LAorCXtLRV9LRVksIDB4MTQsIEtFWV9WT0xVTUVET1dOIH0sCisJe0tFX0tFWSwgMHgxNSwgS0VZX1ZPTFVNRVVQIH0sCisJe0tFX0tFWSwgMHgzMCwgS0VZX1NXSVRDSFZJREVPTU9ERSB9LAorCXtLRV9LRVksIDB4MzEsIEtFWV9TV0lUQ0hWSURFT01PREUgfSwKKwl7S0VfS0VZLCAweDMyLCBLRVlfU1dJVENIVklERU9NT0RFIH0sCisJe0tFX0VORCwgMH0sCit9OworCisvKgorICogVGhlIGhvdGtleSBkcml2ZXIgZGVjbGFyYXRpb24KKyAqLworc3RhdGljIGludCBlZWVwY19ob3RrX2FkZChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSk7CitzdGF0aWMgaW50IGVlZXBjX2hvdGtfcmVtb3ZlKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlLCBpbnQgdHlwZSk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYWNwaV9kZXZpY2VfaWQgZWVlcGNfZGV2aWNlX2lkc1tdID0geworCXtFRUVQQ19IT1RLX0hJRCwgMH0sCisJeyIiLCAwfSwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKGFjcGksIGVlZXBjX2RldmljZV9pZHMpOworCitzdGF0aWMgc3RydWN0IGFjcGlfZHJpdmVyIGVlZXBjX2hvdGtfZHJpdmVyID0geworCS5uYW1lID0gRUVFUENfSE9US19OQU1FLAorCS5jbGFzcyA9IEVFRVBDX0hPVEtfQ0xBU1MsCisJLmlkcyA9IGVlZXBjX2RldmljZV9pZHMsCisJLm9wcyA9IHsKKwkJLmFkZCA9IGVlZXBjX2hvdGtfYWRkLAorCQkucmVtb3ZlID0gZWVlcGNfaG90a19yZW1vdmUsCisJfSwKK307CisKKy8qIFRoZSBiYWNrbGlnaHQgZGV2aWNlIC9zeXMvY2xhc3MvYmFja2xpZ2h0ICovCitzdGF0aWMgc3RydWN0IGJhY2tsaWdodF9kZXZpY2UgKmVlZXBjX2JhY2tsaWdodF9kZXZpY2U7CisKKy8qIFRoZSBod21vbiBkZXZpY2UgKi8KK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlICplZWVwY19od21vbl9kZXZpY2U7CisKKy8qCisgKiBUaGUgYmFja2xpZ2h0IGNsYXNzIGRlY2xhcmF0aW9uCisgKi8KK3N0YXRpYyBpbnQgcmVhZF9icmlnaHRuZXNzKHN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICpiZCk7CitzdGF0aWMgaW50IHVwZGF0ZV9ibF9zdGF0dXMoc3RydWN0IGJhY2tsaWdodF9kZXZpY2UgKmJkKTsKK3N0YXRpYyBzdHJ1Y3QgYmFja2xpZ2h0X29wcyBlZWVwY2JsX29wcyA9IHsKKwkuZ2V0X2JyaWdodG5lc3MgPSByZWFkX2JyaWdodG5lc3MsCisJLnVwZGF0ZV9zdGF0dXMgPSB1cGRhdGVfYmxfc3RhdHVzLAorfTsKKworTU9EVUxFX0FVVEhPUigiQ29yZW50aW4gQ2hhcnksIEVyaWMgQ29vcGVyIik7CitNT0RVTEVfREVTQ1JJUFRJT04oRUVFUENfSE9US19OQU1FKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworLyoKKyAqIEFDUEkgSGVscGVycworICovCitzdGF0aWMgaW50IHdyaXRlX2FjcGlfaW50KGFjcGlfaGFuZGxlIGhhbmRsZSwgY29uc3QgY2hhciAqbWV0aG9kLCBpbnQgdmFsLAorCQkJICBzdHJ1Y3QgYWNwaV9idWZmZXIgKm91dHB1dCkKK3sKKwlzdHJ1Y3QgYWNwaV9vYmplY3RfbGlzdCBwYXJhbXM7CisJdW5pb24gYWNwaV9vYmplY3QgaW5fb2JqOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKworCXBhcmFtcy5jb3VudCA9IDE7CisJcGFyYW1zLnBvaW50ZXIgPSAmaW5fb2JqOworCWluX29iai50eXBlID0gQUNQSV9UWVBFX0lOVEVHRVI7CisJaW5fb2JqLmludGVnZXIudmFsdWUgPSB2YWw7CisKKwlzdGF0dXMgPSBhY3BpX2V2YWx1YXRlX29iamVjdChoYW5kbGUsIChjaGFyICopbWV0aG9kLCAmcGFyYW1zLCBvdXRwdXQpOworCXJldHVybiAoc3RhdHVzID09IEFFX09LID8gMCA6IC0xKTsKK30KKworc3RhdGljIGludCByZWFkX2FjcGlfaW50KGFjcGlfaGFuZGxlIGhhbmRsZSwgY29uc3QgY2hhciAqbWV0aG9kLCBpbnQgKnZhbCkKK3sKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJdW5zaWduZWQgbG9uZyBsb25nIHJlc3VsdDsKKworCXN0YXR1cyA9IGFjcGlfZXZhbHVhdGVfaW50ZWdlcihoYW5kbGUsIChjaGFyICopbWV0aG9kLCBOVUxMLCAmcmVzdWx0KTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJKnZhbCA9IC0xOworCQlyZXR1cm4gLTE7CisJfSBlbHNlIHsKKwkJKnZhbCA9IHJlc3VsdDsKKwkJcmV0dXJuIDA7CisJfQorfQorCitzdGF0aWMgaW50IHNldF9hY3BpKGludCBjbSwgaW50IHZhbHVlKQoreworCWlmIChlaG90ay0+Y21fc3VwcG9ydGVkICYgKDB4MSA8PCBjbSkpIHsKKwkJY29uc3QgY2hhciAqbWV0aG9kID0gY21fc2V0dltjbV07CisJCWlmIChtZXRob2QgPT0gTlVMTCkKKwkJCXJldHVybiAtRU5PREVWOworCQlpZiAod3JpdGVfYWNwaV9pbnQoZWhvdGstPmhhbmRsZSwgbWV0aG9kLCB2YWx1ZSwgTlVMTCkpCisJCQlwcmludGsoRUVFUENfV0FSTklORyAiRXJyb3Igd3JpdGluZyAlc1xuIiwgbWV0aG9kKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X2FjcGkoaW50IGNtKQoreworCWludCB2YWx1ZSA9IC0xOworCWlmICgoZWhvdGstPmNtX3N1cHBvcnRlZCAmICgweDEgPDwgY20pKSkgeworCQljb25zdCBjaGFyICptZXRob2QgPSBjbV9nZXR2W2NtXTsKKwkJaWYgKG1ldGhvZCA9PSBOVUxMKQorCQkJcmV0dXJuIC1FTk9ERVY7CisJCWlmIChyZWFkX2FjcGlfaW50KGVob3RrLT5oYW5kbGUsIG1ldGhvZCwgJnZhbHVlKSkKKwkJCXByaW50ayhFRUVQQ19XQVJOSU5HICJFcnJvciByZWFkaW5nICVzXG4iLCBtZXRob2QpOworCX0KKwlyZXR1cm4gdmFsdWU7Cit9CisKKy8qCisgKiBCYWNrbGlnaHQKKyAqLworc3RhdGljIGludCByZWFkX2JyaWdodG5lc3Moc3RydWN0IGJhY2tsaWdodF9kZXZpY2UgKmJkKQoreworCXJldHVybiBnZXRfYWNwaShDTV9BU0xfUEFORUxCUklHSFQpOworfQorCitzdGF0aWMgaW50IHNldF9icmlnaHRuZXNzKHN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICpiZCwgaW50IHZhbHVlKQoreworCXZhbHVlID0gbWF4KDAsIG1pbigxNSwgdmFsdWUpKTsKKwlyZXR1cm4gc2V0X2FjcGkoQ01fQVNMX1BBTkVMQlJJR0hULCB2YWx1ZSk7Cit9CisKK3N0YXRpYyBpbnQgdXBkYXRlX2JsX3N0YXR1cyhzdHJ1Y3QgYmFja2xpZ2h0X2RldmljZSAqYmQpCit7CisJcmV0dXJuIHNldF9icmlnaHRuZXNzKGJkLCBiZC0+cHJvcHMuYnJpZ2h0bmVzcyk7Cit9CisKKy8qCisgKiBSZmtpbGwgaGVscGVycworICovCisKK3N0YXRpYyBpbnQgZWVlcGNfd2xhbl9yZmtpbGxfc2V0KHZvaWQgKmRhdGEsIGVudW0gcmZraWxsX3N0YXRlIHN0YXRlKQoreworCWlmIChzdGF0ZSA9PSBSRktJTExfU1RBVEVfU09GVF9CTE9DS0VEKQorCQlyZXR1cm4gc2V0X2FjcGkoQ01fQVNMX1dMQU4sIDApOworCWVsc2UKKwkJcmV0dXJuIHNldF9hY3BpKENNX0FTTF9XTEFOLCAxKTsKK30KKworc3RhdGljIGludCBlZWVwY193bGFuX3Jma2lsbF9zdGF0ZSh2b2lkICpkYXRhLCBlbnVtIHJma2lsbF9zdGF0ZSAqc3RhdGUpCit7CisJaWYgKGdldF9hY3BpKENNX0FTTF9XTEFOKSA9PSAxKQorCQkqc3RhdGUgPSBSRktJTExfU1RBVEVfVU5CTE9DS0VEOworCWVsc2UKKwkJKnN0YXRlID0gUkZLSUxMX1NUQVRFX1NPRlRfQkxPQ0tFRDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBlZWVwY19ibHVldG9vdGhfcmZraWxsX3NldCh2b2lkICpkYXRhLCBlbnVtIHJma2lsbF9zdGF0ZSBzdGF0ZSkKK3sKKwlpZiAoc3RhdGUgPT0gUkZLSUxMX1NUQVRFX1NPRlRfQkxPQ0tFRCkKKwkJcmV0dXJuIHNldF9hY3BpKENNX0FTTF9CTFVFVE9PVEgsIDApOworCWVsc2UKKwkJcmV0dXJuIHNldF9hY3BpKENNX0FTTF9CTFVFVE9PVEgsIDEpOworfQorCitzdGF0aWMgaW50IGVlZXBjX2JsdWV0b290aF9yZmtpbGxfc3RhdGUodm9pZCAqZGF0YSwgZW51bSByZmtpbGxfc3RhdGUgKnN0YXRlKQoreworCWlmIChnZXRfYWNwaShDTV9BU0xfQkxVRVRPT1RIKSA9PSAxKQorCQkqc3RhdGUgPSBSRktJTExfU1RBVEVfVU5CTE9DS0VEOworCWVsc2UKKwkJKnN0YXRlID0gUkZLSUxMX1NUQVRFX1NPRlRfQkxPQ0tFRDsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFN5cyBoZWxwZXJzCisgKi8KK3N0YXRpYyBpbnQgcGFyc2VfYXJnKGNvbnN0IGNoYXIgKmJ1ZiwgdW5zaWduZWQgbG9uZyBjb3VudCwgaW50ICp2YWwpCit7CisJaWYgKCFjb3VudCkKKwkJcmV0dXJuIDA7CisJaWYgKHNzY2FuZihidWYsICIlaSIsIHZhbCkgIT0gMSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3NpemVfdCBzdG9yZV9zeXNfYWNwaShpbnQgY20sIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCWludCBydiwgdmFsdWU7CisKKwlydiA9IHBhcnNlX2FyZyhidWYsIGNvdW50LCAmdmFsdWUpOworCWlmIChydiA+IDApCisJCXNldF9hY3BpKGNtLCB2YWx1ZSk7CisJcmV0dXJuIHJ2OworfQorCitzdGF0aWMgc3NpemVfdCBzaG93X3N5c19hY3BpKGludCBjbSwgY2hhciAqYnVmKQoreworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBnZXRfYWNwaShjbSkpOworfQorCisjZGVmaW5lIEVFRVBDX0NSRUFURV9ERVZJQ0VfQVRUUihfbmFtZSwgX2NtKQkJCQlcCisJc3RhdGljIHNzaXplX3Qgc2hvd18jI19uYW1lKHN0cnVjdCBkZXZpY2UgKmRldiwJCQlcCisJCQkJICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAlcCisJCQkJICAgIGNoYXIgKmJ1ZikJCQkJXAorCXsJCQkJCQkJCVwKKwkJcmV0dXJuIHNob3dfc3lzX2FjcGkoX2NtLCBidWYpOwkJCQlcCisJfQkJCQkJCQkJXAorCXN0YXRpYyBzc2l6ZV90IHN0b3JlXyMjX25hbWUoc3RydWN0IGRldmljZSAqZGV2LAkJXAorCQkJCSAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCVwKKwkJCQkgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQlcCisJewkJCQkJCQkJXAorCQlyZXR1cm4gc3RvcmVfc3lzX2FjcGkoX2NtLCBidWYsIGNvdW50KTsJCQlcCisJfQkJCQkJCQkJXAorCXN0YXRpYyBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSBkZXZfYXR0cl8jI19uYW1lID0gewkJXAorCQkuYXR0ciA9IHsJCQkJCQlcCisJCQkubmFtZSA9IF9fc3RyaW5naWZ5KF9uYW1lKSwJCQlcCisJCQkubW9kZSA9IDA2NDQgfSwJCQkJCVwKKwkJLnNob3cgICA9IHNob3dfIyNfbmFtZSwJCQkJCVwKKwkJLnN0b3JlICA9IHN0b3JlXyMjX25hbWUsCQkJCVwKKwl9CisKK0VFRVBDX0NSRUFURV9ERVZJQ0VfQVRUUihjYW1lcmEsIENNX0FTTF9DQU1FUkEpOworRUVFUENfQ1JFQVRFX0RFVklDRV9BVFRSKGNhcmRyLCBDTV9BU0xfQ0FSRFJFQURFUik7CitFRUVQQ19DUkVBVEVfREVWSUNFX0FUVFIoZGlzcCwgQ01fQVNMX0RJU1BMQVlTV0lUQ0gpOworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqcGxhdGZvcm1fYXR0cmlidXRlc1tdID0geworCSZkZXZfYXR0cl9jYW1lcmEuYXR0ciwKKwkmZGV2X2F0dHJfY2FyZHIuYXR0ciwKKwkmZGV2X2F0dHJfZGlzcC5hdHRyLAorCU5VTEwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIHBsYXRmb3JtX2F0dHJpYnV0ZV9ncm91cCA9IHsKKwkuYXR0cnMgPSBwbGF0Zm9ybV9hdHRyaWJ1dGVzCit9OworCisvKgorICogSG90a2V5IGZ1bmN0aW9ucworICovCitzdGF0aWMgc3RydWN0IGtleV9lbnRyeSAqZWVwY19nZXRfZW50cnlfYnlfc2NhbmNvZGUoaW50IGNvZGUpCit7CisJc3RydWN0IGtleV9lbnRyeSAqa2V5OworCisJZm9yIChrZXkgPSBlZWVwY19rZXltYXA7IGtleS0+dHlwZSAhPSBLRV9FTkQ7IGtleSsrKQorCQlpZiAoY29kZSA9PSBrZXktPmNvZGUpCisJCQlyZXR1cm4ga2V5OworCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qga2V5X2VudHJ5ICplZXBjX2dldF9lbnRyeV9ieV9rZXljb2RlKGludCBjb2RlKQoreworCXN0cnVjdCBrZXlfZW50cnkgKmtleTsKKworCWZvciAoa2V5ID0gZWVlcGNfa2V5bWFwOyBrZXktPnR5cGUgIT0gS0VfRU5EOyBrZXkrKykKKwkJaWYgKGNvZGUgPT0ga2V5LT5rZXljb2RlICYmIGtleS0+dHlwZSA9PSBLRV9LRVkpCisJCQlyZXR1cm4ga2V5OworCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgZWVlcGNfZ2V0a2V5Y29kZShzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYsIGludCBzY2FuY29kZSwgaW50ICprZXljb2RlKQoreworCXN0cnVjdCBrZXlfZW50cnkgKmtleSA9IGVlcGNfZ2V0X2VudHJ5X2J5X3NjYW5jb2RlKHNjYW5jb2RlKTsKKworCWlmIChrZXkgJiYga2V5LT50eXBlID09IEtFX0tFWSkgeworCQkqa2V5Y29kZSA9IGtleS0+a2V5Y29kZTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbnQgZWVlcGNfc2V0a2V5Y29kZShzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYsIGludCBzY2FuY29kZSwgaW50IGtleWNvZGUpCit7CisJc3RydWN0IGtleV9lbnRyeSAqa2V5OworCWludCBvbGRfa2V5Y29kZTsKKworCWlmIChrZXljb2RlIDwgMCB8fCBrZXljb2RlID4gS0VZX01BWCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlrZXkgPSBlZXBjX2dldF9lbnRyeV9ieV9zY2FuY29kZShzY2FuY29kZSk7CisJaWYgKGtleSAmJiBrZXktPnR5cGUgPT0gS0VfS0VZKSB7CisJCW9sZF9rZXljb2RlID0ga2V5LT5rZXljb2RlOworCQlrZXktPmtleWNvZGUgPSBrZXljb2RlOworCQlzZXRfYml0KGtleWNvZGUsIGRldi0+a2V5Yml0KTsKKwkJaWYgKCFlZXBjX2dldF9lbnRyeV9ieV9rZXljb2RlKG9sZF9rZXljb2RlKSkKKwkJCWNsZWFyX2JpdChvbGRfa2V5Y29kZSwgZGV2LT5rZXliaXQpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGludCBlZWVwY19ob3RrX2NoZWNrKHZvaWQpCit7CisJY29uc3Qgc3RydWN0IGtleV9lbnRyeSAqa2V5OworCXN0cnVjdCBhY3BpX2J1ZmZlciBidWZmZXIgPSB7IEFDUElfQUxMT0NBVEVfQlVGRkVSLCBOVUxMIH07CisJaW50IHJlc3VsdDsKKworCXJlc3VsdCA9IGFjcGlfYnVzX2dldF9zdGF0dXMoZWhvdGstPmRldmljZSk7CisJaWYgKHJlc3VsdCkKKwkJcmV0dXJuIHJlc3VsdDsKKwlpZiAoZWhvdGstPmRldmljZS0+c3RhdHVzLnByZXNlbnQpIHsKKwkJaWYgKHdyaXRlX2FjcGlfaW50KGVob3RrLT5oYW5kbGUsICJJTklUIiwgZWhvdGstPmluaXRfZmxhZywKKwkJCQkgICAgJmJ1ZmZlcikpIHsKKwkJCXByaW50ayhFRUVQQ19FUlIgIkhvdGtleSBpbml0aWFsaXphdGlvbiBmYWlsZWRcbiIpOworCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0gZWxzZSB7CisJCQlwcmludGsoRUVFUENfTk9USUNFICJIb3RrZXkgaW5pdCBmbGFncyAweCV4XG4iLAorCQkJICAgICAgIGVob3RrLT5pbml0X2ZsYWcpOworCQl9CisJCS8qIGdldCBjb250cm9sIG1ldGhvZHMgc3VwcG9ydGVkICovCisJCWlmIChyZWFkX2FjcGlfaW50KGVob3RrLT5oYW5kbGUsICJDTVNHIgorCQkJCSAgICwgJmVob3RrLT5jbV9zdXBwb3J0ZWQpKSB7CisJCQlwcmludGsoRUVFUENfRVJSCisJCQkgICAgICAgIkdldCBjb250cm9sIG1ldGhvZHMgc3VwcG9ydGVkIGZhaWxlZFxuIik7CisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJfSBlbHNlIHsKKwkJCXByaW50ayhFRUVQQ19JTkZPCisJCQkgICAgICAgIkdldCBjb250cm9sIG1ldGhvZHMgc3VwcG9ydGVkOiAweCV4XG4iLAorCQkJICAgICAgIGVob3RrLT5jbV9zdXBwb3J0ZWQpOworCQl9CisJCWVob3RrLT5pbnB1dGRldiA9IGlucHV0X2FsbG9jYXRlX2RldmljZSgpOworCQlpZiAoIWVob3RrLT5pbnB1dGRldikgeworCQkJcHJpbnRrKEVFRVBDX0lORk8gIlVuYWJsZSB0byBhbGxvY2F0ZSBpbnB1dCBkZXZpY2VcbiIpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJZWhvdGstPmlucHV0ZGV2LT5uYW1lID0gIkFzdXMgRWVlUEMgZXh0cmEgYnV0dG9ucyI7CisJCWVob3RrLT5pbnB1dGRldi0+cGh5cyA9IEVFRVBDX0hPVEtfRklMRSAiL2lucHV0MCI7CisJCWVob3RrLT5pbnB1dGRldi0+aWQuYnVzdHlwZSA9IEJVU19IT1NUOworCQllaG90ay0+aW5wdXRkZXYtPmdldGtleWNvZGUgPSBlZWVwY19nZXRrZXljb2RlOworCQllaG90ay0+aW5wdXRkZXYtPnNldGtleWNvZGUgPSBlZWVwY19zZXRrZXljb2RlOworCisJCWZvciAoa2V5ID0gZWVlcGNfa2V5bWFwOyBrZXktPnR5cGUgIT0gS0VfRU5EOyBrZXkrKykgeworCQkJc3dpdGNoIChrZXktPnR5cGUpIHsKKwkJCWNhc2UgS0VfS0VZOgorCQkJCXNldF9iaXQoRVZfS0VZLCBlaG90ay0+aW5wdXRkZXYtPmV2Yml0KTsKKwkJCQlzZXRfYml0KGtleS0+a2V5Y29kZSwgZWhvdGstPmlucHV0ZGV2LT5rZXliaXQpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCXJlc3VsdCA9IGlucHV0X3JlZ2lzdGVyX2RldmljZShlaG90ay0+aW5wdXRkZXYpOworCQlpZiAocmVzdWx0KSB7CisJCQlwcmludGsoRUVFUENfSU5GTyAiVW5hYmxlIHRvIHJlZ2lzdGVyIGlucHV0IGRldmljZVxuIik7CisJCQlpbnB1dF9mcmVlX2RldmljZShlaG90ay0+aW5wdXRkZXYpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9IGVsc2UgeworCQlwcmludGsoRUVFUENfRVJSICJIb3RrZXkgZGV2aWNlIG5vdCBwcmVzZW50LCBhYm9ydGluZ1xuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbm90aWZ5X2Jybih2b2lkKQoreworCXN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICpiZCA9IGVlZXBjX2JhY2tsaWdodF9kZXZpY2U7CisJYmQtPnByb3BzLmJyaWdodG5lc3MgPSByZWFkX2JyaWdodG5lc3MoYmQpOworfQorCitzdGF0aWMgdm9pZCBlZWVwY19ob3RrX25vdGlmeShhY3BpX2hhbmRsZSBoYW5kbGUsIHUzMiBldmVudCwgdm9pZCAqZGF0YSkKK3sKKwlzdGF0aWMgc3RydWN0IGtleV9lbnRyeSAqa2V5OworCWlmICghZWhvdGspCisJCXJldHVybjsKKwlpZiAoZXZlbnQgPj0gTk9USUZZX0JSTl9NSU4gJiYgZXZlbnQgPD0gTk9USUZZX0JSTl9NQVgpCisJCW5vdGlmeV9icm4oKTsKKwlhY3BpX2J1c19nZW5lcmF0ZV9wcm9jX2V2ZW50KGVob3RrLT5kZXZpY2UsIGV2ZW50LAorCQkJCSAgICAgZWhvdGstPmV2ZW50X2NvdW50W2V2ZW50ICUgMTI4XSsrKTsKKwlpZiAoZWhvdGstPmlucHV0ZGV2KSB7CisJCWtleSA9IGVlcGNfZ2V0X2VudHJ5X2J5X3NjYW5jb2RlKGV2ZW50KTsKKwkJaWYgKGtleSkgeworCQkJc3dpdGNoIChrZXktPnR5cGUpIHsKKwkJCWNhc2UgS0VfS0VZOgorCQkJCWlucHV0X3JlcG9ydF9rZXkoZWhvdGstPmlucHV0ZGV2LCBrZXktPmtleWNvZGUsCisJCQkJCQkgMSk7CisJCQkJaW5wdXRfc3luYyhlaG90ay0+aW5wdXRkZXYpOworCQkJCWlucHV0X3JlcG9ydF9rZXkoZWhvdGstPmlucHV0ZGV2LCBrZXktPmtleWNvZGUsCisJCQkJCQkgMCk7CisJCQkJaW5wdXRfc3luYyhlaG90ay0+aW5wdXRkZXYpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorfQorCitzdGF0aWMgaW50IGVlZXBjX2hvdGtfYWRkKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKQoreworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOworCWludCByZXN1bHQ7CisKKwlpZiAoIWRldmljZSkKKwkJIHJldHVybiAtRUlOVkFMOworCXByaW50ayhFRUVQQ19OT1RJQ0UgRUVFUENfSE9US19OQU1FICJcbiIpOworCWVob3RrID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGVlZXBjX2hvdGspLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWVob3RrKQorCQlyZXR1cm4gLUVOT01FTTsKKwllaG90ay0+aW5pdF9mbGFnID0gRElTQUJMRV9BU0xfV0xBTiB8IERJU0FCTEVfQVNMX0RJU1BMQVlTV0lUQ0g7CisJZWhvdGstPmhhbmRsZSA9IGRldmljZS0+aGFuZGxlOworCXN0cmNweShhY3BpX2RldmljZV9uYW1lKGRldmljZSksIEVFRVBDX0hPVEtfREVWSUNFX05BTUUpOworCXN0cmNweShhY3BpX2RldmljZV9jbGFzcyhkZXZpY2UpLCBFRUVQQ19IT1RLX0NMQVNTKTsKKwlkZXZpY2UtPmRyaXZlcl9kYXRhID0gZWhvdGs7CisJZWhvdGstPmRldmljZSA9IGRldmljZTsKKwlyZXN1bHQgPSBlZWVwY19ob3RrX2NoZWNrKCk7CisJaWYgKHJlc3VsdCkKKwkJZ290byBlbmQ7CisJc3RhdHVzID0gYWNwaV9pbnN0YWxsX25vdGlmeV9oYW5kbGVyKGVob3RrLT5oYW5kbGUsIEFDUElfU1lTVEVNX05PVElGWSwKKwkJCQkJICAgICBlZWVwY19ob3RrX25vdGlmeSwgZWhvdGspOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkKKwkJcHJpbnRrKEVFRVBDX0VSUiAiRXJyb3IgaW5zdGFsbGluZyBub3RpZnkgaGFuZGxlclxuIik7CisKKwlpZiAoZ2V0X2FjcGkoQ01fQVNMX1dMQU4pICE9IC0xKSB7CisJCWVob3RrLT5lZWVwY193bGFuX3Jma2lsbCA9IHJma2lsbF9hbGxvY2F0ZSgmZGV2aWNlLT5kZXYsCisJCQkJCQkJICAgUkZLSUxMX1RZUEVfV0xBTik7CisKKwkJaWYgKCFlaG90ay0+ZWVlcGNfd2xhbl9yZmtpbGwpCisJCQlnb3RvIGVuZDsKKworCQllaG90ay0+ZWVlcGNfd2xhbl9yZmtpbGwtPm5hbWUgPSAiZWVlcGMtd2xhbiI7CisJCWVob3RrLT5lZWVwY193bGFuX3Jma2lsbC0+dG9nZ2xlX3JhZGlvID0gZWVlcGNfd2xhbl9yZmtpbGxfc2V0OworCQllaG90ay0+ZWVlcGNfd2xhbl9yZmtpbGwtPmdldF9zdGF0ZSA9IGVlZXBjX3dsYW5fcmZraWxsX3N0YXRlOworCQlpZiAoZ2V0X2FjcGkoQ01fQVNMX1dMQU4pID09IDEpCisJCQllaG90ay0+ZWVlcGNfd2xhbl9yZmtpbGwtPnN0YXRlID0KKwkJCQlSRktJTExfU1RBVEVfVU5CTE9DS0VEOworCQllbHNlCisJCQllaG90ay0+ZWVlcGNfd2xhbl9yZmtpbGwtPnN0YXRlID0KKwkJCQlSRktJTExfU1RBVEVfU09GVF9CTE9DS0VEOworCQlyZmtpbGxfcmVnaXN0ZXIoZWhvdGstPmVlZXBjX3dsYW5fcmZraWxsKTsKKwl9CisKKwlpZiAoZ2V0X2FjcGkoQ01fQVNMX0JMVUVUT09USCkgIT0gLTEpIHsKKwkJZWhvdGstPmVlZXBjX2JsdWV0b290aF9yZmtpbGwgPQorCQkJcmZraWxsX2FsbG9jYXRlKCZkZXZpY2UtPmRldiwgUkZLSUxMX1RZUEVfQkxVRVRPT1RIKTsKKworCQlpZiAoIWVob3RrLT5lZWVwY19ibHVldG9vdGhfcmZraWxsKQorCQkJZ290byBlbmQ7CisKKwkJZWhvdGstPmVlZXBjX2JsdWV0b290aF9yZmtpbGwtPm5hbWUgPSAiZWVlcGMtYmx1ZXRvb3RoIjsKKwkJZWhvdGstPmVlZXBjX2JsdWV0b290aF9yZmtpbGwtPnRvZ2dsZV9yYWRpbyA9CisJCQllZWVwY19ibHVldG9vdGhfcmZraWxsX3NldDsKKwkJZWhvdGstPmVlZXBjX2JsdWV0b290aF9yZmtpbGwtPmdldF9zdGF0ZSA9CisJCQllZWVwY19ibHVldG9vdGhfcmZraWxsX3N0YXRlOworCQlpZiAoZ2V0X2FjcGkoQ01fQVNMX0JMVUVUT09USCkgPT0gMSkKKwkJCWVob3RrLT5lZWVwY19ibHVldG9vdGhfcmZraWxsLT5zdGF0ZSA9CisJCQkJUkZLSUxMX1NUQVRFX1VOQkxPQ0tFRDsKKwkJZWxzZQorCQkJZWhvdGstPmVlZXBjX2JsdWV0b290aF9yZmtpbGwtPnN0YXRlID0KKwkJCQlSRktJTExfU1RBVEVfU09GVF9CTE9DS0VEOworCQlyZmtpbGxfcmVnaXN0ZXIoZWhvdGstPmVlZXBjX2JsdWV0b290aF9yZmtpbGwpOworCX0KKworIGVuZDoKKwlpZiAocmVzdWx0KSB7CisJCWtmcmVlKGVob3RrKTsKKwkJZWhvdGsgPSBOVUxMOworCX0KKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgaW50IGVlZXBjX2hvdGtfcmVtb3ZlKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlLCBpbnQgdHlwZSkKK3sKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSAwOworCisJaWYgKCFkZXZpY2UgfHwgIWFjcGlfZHJpdmVyX2RhdGEoZGV2aWNlKSkKKwkJIHJldHVybiAtRUlOVkFMOworCXN0YXR1cyA9IGFjcGlfcmVtb3ZlX25vdGlmeV9oYW5kbGVyKGVob3RrLT5oYW5kbGUsIEFDUElfU1lTVEVNX05PVElGWSwKKwkJCQkJICAgIGVlZXBjX2hvdGtfbm90aWZ5KTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpCisJCXByaW50ayhFRUVQQ19FUlIgIkVycm9yIHJlbW92aW5nIG5vdGlmeSBoYW5kbGVyXG4iKTsKKwlrZnJlZShlaG90ayk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBId21vbgorICovCitzdGF0aWMgaW50IGVlZXBjX2dldF9mYW5fcHdtKHZvaWQpCit7CisJaW50IHZhbHVlID0gMDsKKworCXJlYWRfYWNwaV9pbnQoTlVMTCwgRUVFUENfRUNfRkFOX1BXTSwgJnZhbHVlKTsKKwl2YWx1ZSA9IHZhbHVlICogMjU1IC8gMTAwOworCXJldHVybiAodmFsdWUpOworfQorCitzdGF0aWMgdm9pZCBlZWVwY19zZXRfZmFuX3B3bShpbnQgdmFsdWUpCit7CisJdmFsdWUgPSBTRU5TT1JTX0xJTUlUKHZhbHVlLCAwLCAyNTUpOworCXZhbHVlID0gdmFsdWUgKiAxMDAgLyAyNTU7CisJZWNfd3JpdGUoRUVFUENfRUNfU0MwMiwgdmFsdWUpOworfQorCitzdGF0aWMgaW50IGVlZXBjX2dldF9mYW5fcnBtKHZvaWQpCit7CisJaW50IGhpZ2ggPSAwOworCWludCBsb3cgPSAwOworCisJcmVhZF9hY3BpX2ludChOVUxMLCBFRUVQQ19FQ19GQU5fSFJQTSwgJmhpZ2gpOworCXJlYWRfYWNwaV9pbnQoTlVMTCwgRUVFUENfRUNfRkFOX0xSUE0sICZsb3cpOworCXJldHVybiAoaGlnaCA8PCA4IHwgbG93KTsKK30KKworc3RhdGljIGludCBlZWVwY19nZXRfZmFuX2N0cmwodm9pZCkKK3sKKwlpbnQgdmFsdWUgPSAwOworCisJcmVhZF9hY3BpX2ludChOVUxMLCBFRUVQQ19FQ19GQU5fQ1RSTCwgJnZhbHVlKTsKKwlyZXR1cm4gKCh2YWx1ZSAmIDB4MDIgPyAxIDogMCkpOworfQorCitzdGF0aWMgdm9pZCBlZWVwY19zZXRfZmFuX2N0cmwoaW50IG1hbnVhbCkKK3sKKwlpbnQgdmFsdWUgPSAwOworCisJcmVhZF9hY3BpX2ludChOVUxMLCBFRUVQQ19FQ19GQU5fQ1RSTCwgJnZhbHVlKTsKKwlpZiAobWFudWFsKQorCQl2YWx1ZSB8PSAweDAyOworCWVsc2UKKwkJdmFsdWUgJj0gfjB4MDI7CisJZWNfd3JpdGUoRUVFUENfRUNfU0ZCMywgdmFsdWUpOworfQorCitzdGF0aWMgc3NpemVfdCBzdG9yZV9zeXNfaHdtb24odm9pZCAoKnNldCkoaW50KSwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJaW50IHJ2LCB2YWx1ZTsKKworCXJ2ID0gcGFyc2VfYXJnKGJ1ZiwgY291bnQsICZ2YWx1ZSk7CisJaWYgKHJ2ID4gMCkKKwkJc2V0KHZhbHVlKTsKKwlyZXR1cm4gcnY7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfc3lzX2h3bW9uKGludCAoKmdldCkodm9pZCksIGNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgZ2V0KCkpOworfQorCisjZGVmaW5lIEVFRVBDX0NSRUFURV9TRU5TT1JfQVRUUihfbmFtZSwgX21vZGUsIF9zZXQsIF9nZXQpCQlcCisJc3RhdGljIHNzaXplX3Qgc2hvd18jI19uYW1lKHN0cnVjdCBkZXZpY2UgKmRldiwJCQlcCisJCQkJICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAlcCisJCQkJICAgIGNoYXIgKmJ1ZikJCQkJXAorCXsJCQkJCQkJCVwKKwkJcmV0dXJuIHNob3dfc3lzX2h3bW9uKF9zZXQsIGJ1Zik7CQkJXAorCX0JCQkJCQkJCVwKKwlzdGF0aWMgc3NpemVfdCBzdG9yZV8jI19uYW1lKHN0cnVjdCBkZXZpY2UgKmRldiwJCVwKKwkJCQkgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAlcCisJCQkJICAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkJXAorCXsJCQkJCQkJCVwKKwkJcmV0dXJuIHN0b3JlX3N5c19od21vbihfZ2V0LCBidWYsIGNvdW50KTsJCVwKKwl9CQkJCQkJCQlcCisJc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihfbmFtZSwgX21vZGUsIHNob3dfIyNfbmFtZSwgc3RvcmVfIyNfbmFtZSwgMCk7CisKK0VFRVBDX0NSRUFURV9TRU5TT1JfQVRUUihmYW4xX2lucHV0LCBTX0lSVUdPLCBlZWVwY19nZXRfZmFuX3JwbSwgTlVMTCk7CitFRUVQQ19DUkVBVEVfU0VOU09SX0FUVFIocHdtMSwgU19JUlVHTyB8IFNfSVdVU1IsCisJCQkgZWVlcGNfZ2V0X2Zhbl9wd20sIGVlZXBjX3NldF9mYW5fcHdtKTsKK0VFRVBDX0NSRUFURV9TRU5TT1JfQVRUUihwd20xX2VuYWJsZSwgU19JUlVHTyB8IFNfSVdVU1IsCisJCQkgZWVlcGNfZ2V0X2Zhbl9jdHJsLCBlZWVwY19zZXRfZmFuX2N0cmwpOworCitzdGF0aWMgc3NpemVfdAorc2hvd19uYW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gc3ByaW50ZihidWYsICJlZWVwY1xuIik7Cit9CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKG5hbWUsIFNfSVJVR08sIHNob3dfbmFtZSwgTlVMTCwgMCk7CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpod21vbl9hdHRyaWJ1dGVzW10gPSB7CisJJnNlbnNvcl9kZXZfYXR0cl9wd20xLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9mYW4xX2lucHV0LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9wd20xX2VuYWJsZS5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfbmFtZS5kZXZfYXR0ci5hdHRyLAorCU5VTEwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGh3bW9uX2F0dHJpYnV0ZV9ncm91cCA9IHsKKwkuYXR0cnMgPSBod21vbl9hdHRyaWJ1dGVzCit9OworCisvKgorICogZXhpdC9pbml0CisgKi8KK3N0YXRpYyB2b2lkIGVlZXBjX2JhY2tsaWdodF9leGl0KHZvaWQpCit7CisJaWYgKGVlZXBjX2JhY2tsaWdodF9kZXZpY2UpCisJCWJhY2tsaWdodF9kZXZpY2VfdW5yZWdpc3RlcihlZWVwY19iYWNrbGlnaHRfZGV2aWNlKTsKKwlpZiAoZWhvdGstPmlucHV0ZGV2KQorCQlpbnB1dF91bnJlZ2lzdGVyX2RldmljZShlaG90ay0+aW5wdXRkZXYpOworCWlmIChlaG90ay0+ZWVlcGNfd2xhbl9yZmtpbGwpCisJCXJma2lsbF91bnJlZ2lzdGVyKGVob3RrLT5lZWVwY193bGFuX3Jma2lsbCk7CisJaWYgKGVob3RrLT5lZWVwY19ibHVldG9vdGhfcmZraWxsKQorCQlyZmtpbGxfdW5yZWdpc3RlcihlaG90ay0+ZWVlcGNfYmx1ZXRvb3RoX3Jma2lsbCk7CisJZWVlcGNfYmFja2xpZ2h0X2RldmljZSA9IE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIGVlZXBjX2h3bW9uX2V4aXQodm9pZCkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpod21vbjsKKworCWh3bW9uID0gZWVlcGNfaHdtb25fZGV2aWNlOworCWlmICghaHdtb24pCisJCXJldHVybiA7CisJc3lzZnNfcmVtb3ZlX2dyb3VwKCZod21vbi0+a29iaiwKKwkJCSAgICZod21vbl9hdHRyaWJ1dGVfZ3JvdXApOworCWh3bW9uX2RldmljZV91bnJlZ2lzdGVyKGh3bW9uKTsKKwllZWVwY19od21vbl9kZXZpY2UgPSBOVUxMOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZWVlcGNfbGFwdG9wX2V4aXQodm9pZCkKK3sKKwllZWVwY19iYWNrbGlnaHRfZXhpdCgpOworCWVlZXBjX2h3bW9uX2V4aXQoKTsKKwlhY3BpX2J1c191bnJlZ2lzdGVyX2RyaXZlcigmZWVlcGNfaG90a19kcml2ZXIpOworCXN5c2ZzX3JlbW92ZV9ncm91cCgmcGxhdGZvcm1fZGV2aWNlLT5kZXYua29iaiwKKwkJCSAgICZwbGF0Zm9ybV9hdHRyaWJ1dGVfZ3JvdXApOworCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKHBsYXRmb3JtX2RldmljZSk7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnBsYXRmb3JtX2RyaXZlcik7Cit9CisKK3N0YXRpYyBpbnQgZWVlcGNfYmFja2xpZ2h0X2luaXQoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICpiZDsKKworCWJkID0gYmFja2xpZ2h0X2RldmljZV9yZWdpc3RlcihFRUVQQ19IT1RLX0ZJTEUsIGRldiwKKwkJCQkgICAgICAgTlVMTCwgJmVlZXBjYmxfb3BzKTsKKwlpZiAoSVNfRVJSKGJkKSkgeworCQlwcmludGsoRUVFUENfRVJSCisJCSAgICAgICAiQ291bGQgbm90IHJlZ2lzdGVyIGVlZXBjIGJhY2tsaWdodCBkZXZpY2VcbiIpOworCQllZWVwY19iYWNrbGlnaHRfZGV2aWNlID0gTlVMTDsKKwkJcmV0dXJuIFBUUl9FUlIoYmQpOworCX0KKwllZWVwY19iYWNrbGlnaHRfZGV2aWNlID0gYmQ7CisJYmQtPnByb3BzLm1heF9icmlnaHRuZXNzID0gMTU7CisJYmQtPnByb3BzLmJyaWdodG5lc3MgPSByZWFkX2JyaWdodG5lc3MoTlVMTCk7CisJYmQtPnByb3BzLnBvd2VyID0gRkJfQkxBTktfVU5CTEFOSzsKKwliYWNrbGlnaHRfdXBkYXRlX3N0YXR1cyhiZCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZWVlcGNfaHdtb25faW5pdChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRldmljZSAqaHdtb247CisJaW50IHJlc3VsdDsKKworCWh3bW9uID0gaHdtb25fZGV2aWNlX3JlZ2lzdGVyKGRldik7CisJaWYgKElTX0VSUihod21vbikpIHsKKwkJcHJpbnRrKEVFRVBDX0VSUgorCQkgICAgICAgIkNvdWxkIG5vdCByZWdpc3RlciBlZWVwYyBod21vbiBkZXZpY2VcbiIpOworCQllZWVwY19od21vbl9kZXZpY2UgPSBOVUxMOworCQlyZXR1cm4gUFRSX0VSUihod21vbik7CisJfQorCWVlZXBjX2h3bW9uX2RldmljZSA9IGh3bW9uOworCXJlc3VsdCA9IHN5c2ZzX2NyZWF0ZV9ncm91cCgmaHdtb24tPmtvYmosCisJCQkJICAgICZod21vbl9hdHRyaWJ1dGVfZ3JvdXApOworCWlmIChyZXN1bHQpCisJCWVlZXBjX2h3bW9uX2V4aXQoKTsKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgaW50IF9faW5pdCBlZWVwY19sYXB0b3BfaW5pdCh2b2lkKQoreworCXN0cnVjdCBkZXZpY2UgKmRldjsKKwlpbnQgcmVzdWx0OworCisJaWYgKGFjcGlfZGlzYWJsZWQpCisJCXJldHVybiAtRU5PREVWOworCXJlc3VsdCA9IGFjcGlfYnVzX3JlZ2lzdGVyX2RyaXZlcigmZWVlcGNfaG90a19kcml2ZXIpOworCWlmIChyZXN1bHQgPCAwKQorCQlyZXR1cm4gcmVzdWx0OworCWlmICghZWhvdGspIHsKKwkJYWNwaV9idXNfdW5yZWdpc3Rlcl9kcml2ZXIoJmVlZXBjX2hvdGtfZHJpdmVyKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCWRldiA9IGFjcGlfZ2V0X3BoeXNpY2FsX2RldmljZShlaG90ay0+ZGV2aWNlLT5oYW5kbGUpOworCisJaWYgKCFhY3BpX3ZpZGVvX2JhY2tsaWdodF9zdXBwb3J0KCkpIHsKKwkJcmVzdWx0ID0gZWVlcGNfYmFja2xpZ2h0X2luaXQoZGV2KTsKKwkJaWYgKHJlc3VsdCkKKwkJCWdvdG8gZmFpbF9iYWNrbGlnaHQ7CisJfSBlbHNlCisJCXByaW50ayhFRUVQQ19JTkZPICJCYWNrbGlnaHQgY29udHJvbGxlZCBieSBBQ1BJIHZpZGVvICIKKwkJICAgICAgICJkcml2ZXJcbiIpOworCisJcmVzdWx0ID0gZWVlcGNfaHdtb25faW5pdChkZXYpOworCWlmIChyZXN1bHQpCisJCWdvdG8gZmFpbF9od21vbjsKKwkvKiBSZWdpc3RlciBwbGF0Zm9ybSBzdHVmZiAqLworCXJlc3VsdCA9IHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmcGxhdGZvcm1fZHJpdmVyKTsKKwlpZiAocmVzdWx0KQorCQlnb3RvIGZhaWxfcGxhdGZvcm1fZHJpdmVyOworCXBsYXRmb3JtX2RldmljZSA9IHBsYXRmb3JtX2RldmljZV9hbGxvYyhFRUVQQ19IT1RLX0ZJTEUsIC0xKTsKKwlpZiAoIXBsYXRmb3JtX2RldmljZSkgeworCQlyZXN1bHQgPSAtRU5PTUVNOworCQlnb3RvIGZhaWxfcGxhdGZvcm1fZGV2aWNlMTsKKwl9CisJcmVzdWx0ID0gcGxhdGZvcm1fZGV2aWNlX2FkZChwbGF0Zm9ybV9kZXZpY2UpOworCWlmIChyZXN1bHQpCisJCWdvdG8gZmFpbF9wbGF0Zm9ybV9kZXZpY2UyOworCXJlc3VsdCA9IHN5c2ZzX2NyZWF0ZV9ncm91cCgmcGxhdGZvcm1fZGV2aWNlLT5kZXYua29iaiwKKwkJCQkgICAgJnBsYXRmb3JtX2F0dHJpYnV0ZV9ncm91cCk7CisJaWYgKHJlc3VsdCkKKwkJZ290byBmYWlsX3N5c2ZzOworCXJldHVybiAwOworZmFpbF9zeXNmczoKKwlwbGF0Zm9ybV9kZXZpY2VfZGVsKHBsYXRmb3JtX2RldmljZSk7CitmYWlsX3BsYXRmb3JtX2RldmljZTI6CisJcGxhdGZvcm1fZGV2aWNlX3B1dChwbGF0Zm9ybV9kZXZpY2UpOworZmFpbF9wbGF0Zm9ybV9kZXZpY2UxOgorCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZwbGF0Zm9ybV9kcml2ZXIpOworZmFpbF9wbGF0Zm9ybV9kcml2ZXI6CisJZWVlcGNfaHdtb25fZXhpdCgpOworZmFpbF9od21vbjoKKwllZWVwY19iYWNrbGlnaHRfZXhpdCgpOworZmFpbF9iYWNrbGlnaHQ6CisJcmV0dXJuIHJlc3VsdDsKK30KKworbW9kdWxlX2luaXQoZWVlcGNfbGFwdG9wX2luaXQpOworbW9kdWxlX2V4aXQoZWVlcGNfbGFwdG9wX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wbGF0Zm9ybS94ODYvZnVqaXRzdS1sYXB0b3AuYyBiL2RyaXZlcnMvcGxhdGZvcm0veDg2L2Z1aml0c3UtbGFwdG9wLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjVkYzQxNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvcGxhdGZvcm0veDg2L2Z1aml0c3UtbGFwdG9wLmMKQEAgLTAsMCArMSwxMjkzIEBACisvKi0qLWxpbnV4LWMtKi0qLworCisvKgorICBDb3B5cmlnaHQgKEMpIDIwMDcsMjAwOCBKb25hdGhhbiBXb2l0aGUgPGp3b2l0aGVAcGh5c2ljcy5hZGVsYWlkZS5lZHUuYXU+CisgIENvcHlyaWdodCAoQykgMjAwOCBQZXRlciBHcnViZXIgPG5va29zQGdteC5uZXQ+CisgIENvcHlyaWdodCAoQykgMjAwOCBUb255IFZyb29uIDx0b255QGxpbngubmV0PgorICBCYXNlZCBvbiBlYXJsaWVyIHdvcms6CisgICAgQ29weXJpZ2h0IChDKSAyMDAzIFNoYW5lIFNwZW5jZXIgPHNoYW5lQGJvZ29taXAuY29tPgorICAgIEFkcmlhbiBZZWUgPGJyZXd0LWZ1aml0c3VAYnJld3Qub3JnPgorCisgIFRlbXBsYXRlZCBmcm9tIG1zaS1sYXB0b3AuYyBhbmQgdGhpbmtwYWRfYWNwaS5jIHdoaWNoIGlzIGNvcHlyaWdodAorICBieSBpdHMgcmVzcGVjdGl2ZSBhdXRob3JzLgorCisgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisvKgorICogZnVqaXRzdS1sYXB0b3AuYyAtIEZ1aml0c3UgbGFwdG9wIHN1cHBvcnQsIHByb3ZpZGluZyBhY2Nlc3MgdG8gYWRkaXRpb25hbAorICogZmVhdHVyZXMgbWFkZSBhdmFpbGFibGUgb24gYSByYW5nZSBvZiBGdWppdHN1IGxhcHRvcHMgaW5jbHVkaW5nIHRoZQorICogUDJ4eHgvUDV4eHgvUzZ4eHgvUzd4eHggc2VyaWVzLgorICoKKyAqIFRoaXMgZHJpdmVyIGV4cG9ydHMgYSBmZXcgZmlsZXMgaW4gL3N5cy9kZXZpY2VzL3BsYXRmb3JtL2Z1aml0c3UtbGFwdG9wLzsKKyAqIG90aGVycyBtYXkgYmUgYWRkZWQgYXQgYSBsYXRlciBkYXRlLgorICoKKyAqICAgbGNkX2xldmVsIC0gU2NyZWVuIGJyaWdodG5lc3M6IGNvbnRhaW5zIGEgc2luZ2xlIGludGVnZXIgaW4gdGhlCisgKiAgIHJhbmdlIDAuLjcuIChydykKKyAqCisgKiBJbiBhZGRpdGlvbiB0byB0aGVzZSBwbGF0Zm9ybSBkZXZpY2UgYXR0cmlidXRlcyB0aGUgZHJpdmVyCisgKiByZWdpc3RlcnMgaXRzZWxmIGluIHRoZSBMaW51eCBiYWNrbGlnaHQgY29udHJvbCBzdWJzeXN0ZW0gYW5kIGlzCisgKiBhdmFpbGFibGUgdG8gdXNlcnNwYWNlIHVuZGVyIC9zeXMvY2xhc3MvYmFja2xpZ2h0L2Z1aml0c3UtbGFwdG9wLy4KKyAqCisgKiBIb3RrZXlzIHByZXNlbnQgb24gY2VydGFpbiBGdWppdHN1IGxhcHRvcHMgKGVnOiB0aGUgUzZ4eHggc2VyaWVzKSBhcmUKKyAqIGFsc28gc3VwcG9ydGVkIGJ5IHRoaXMgZHJpdmVyLgorICoKKyAqIFRoaXMgZHJpdmVyIGhhcyBiZWVuIHRlc3RlZCBvbiBhIEZ1aml0c3UgTGlmZWJvb2sgUzY0MTAsIFM3MDIwIGFuZAorICogUDgwMTAuICBJdCBzaG91bGQgd29yayBvbiBtb3N0IFAtc2VyaWVzIGFuZCBTLXNlcmllcyBMaWZlYm9va3MsIGJ1dAorICogWU1NVi4KKyAqCisgKiBUaGUgbW9kdWxlIHBhcmFtZXRlciB1c2VfYWx0X2xjZF9sZXZlbHMgc3dpdGNoZXMgYmV0d2VlbiBkaWZmZXJlbnQgQUNQSQorICogYnJpZ2h0bmVzcyBjb250cm9scyB3aGljaCBhcmUgdXNlZCBieSBkaWZmZXJlbnQgRnVqaXRzdSBsYXB0b3BzLiAgSW4gbW9zdAorICogY2FzZXMgdGhlIGNvcnJlY3QgbWV0aG9kIGlzIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQuICJ1c2VfYWx0X2xjZF9sZXZlbHM9MSIKKyAqIGlzIGFwcGxpY2FibGUgZm9yIGEgRnVqaXRzdSBMaWZlYm9vayBTNjQxMCBpZiBhdXRvZGV0ZWN0aW9uIGZhaWxzLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWkuaD4KKyNpbmNsdWRlIDxsaW51eC9iYWNrbGlnaHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgorI2luY2x1ZGUgPGxpbnV4L2tmaWZvLmg+CisjaW5jbHVkZSA8bGludXgvdmlkZW9fb3V0cHV0Lmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaWZkZWYgQ09ORklHX0xFRFNfQ0xBU1MKKyNpbmNsdWRlIDxsaW51eC9sZWRzLmg+CisjZW5kaWYKKworI2RlZmluZSBGVUpJVFNVX0RSSVZFUl9WRVJTSU9OICIwLjUuMCIKKworI2RlZmluZSBGVUpJVFNVX0xDRF9OX0xFVkVMUyA4CisKKyNkZWZpbmUgQUNQSV9GVUpJVFNVX0NMQVNTICAgICAgICAgICAgICAiZnVqaXRzdSIKKyNkZWZpbmUgQUNQSV9GVUpJVFNVX0hJRCAgICAgICAgICAgICAgICAiRlVKMDJCMSIKKyNkZWZpbmUgQUNQSV9GVUpJVFNVX0RSSVZFUl9OQU1FCSJGdWppdHN1IGxhcHRvcCBGVUowMkIxIEFDUEkgYnJpZ2h0bmVzcyBkcml2ZXIiCisjZGVmaW5lIEFDUElfRlVKSVRTVV9ERVZJQ0VfTkFNRSAgICAgICAgIkZ1aml0c3UgRlVKMDJCMSIKKyNkZWZpbmUgQUNQSV9GVUpJVFNVX0hPVEtFWV9ISUQgCSJGVUowMkUzIgorI2RlZmluZSBBQ1BJX0ZVSklUU1VfSE9US0VZX0RSSVZFUl9OQU1FICJGdWppdHN1IGxhcHRvcCBGVUowMkUzIEFDUEkgaG90a2V5cyBkcml2ZXIiCisjZGVmaW5lIEFDUElfRlVKSVRTVV9IT1RLRVlfREVWSUNFX05BTUUgIkZ1aml0c3UgRlVKMDJFMyIKKworI2RlZmluZSBBQ1BJX0ZVSklUU1VfTk9USUZZX0NPREUxICAgICAweDgwCisKKyNkZWZpbmUgQUNQSV9WSURFT19OT1RJRllfSU5DX0JSSUdIVE5FU1MgICAgIDB4ODYKKyNkZWZpbmUgQUNQSV9WSURFT19OT1RJRllfREVDX0JSSUdIVE5FU1MgICAgIDB4ODcKKworLyogRlVOQyBpbnRlcmZhY2UgLSBjb21tYW5kIHZhbHVlcyAqLworI2RlZmluZSBGVU5DX1JGS0lMTAkweDEwMDAKKyNkZWZpbmUgRlVOQ19MRURTCTB4MTAwMQorI2RlZmluZSBGVU5DX0JVVFRPTlMJMHgxMDAyCisjZGVmaW5lIEZVTkNfQkFDS0xJR0hUICAweDEwMDQKKworLyogRlVOQyBpbnRlcmZhY2UgLSByZXNwb25zZXMgKi8KKyNkZWZpbmUgVU5TVVBQT1JURURfQ01EIDB4ODAwMDAwMDAKKworI2lmZGVmIENPTkZJR19MRURTX0NMQVNTCisvKiBGVU5DIGludGVyZmFjZSAtIExFRCBjb250cm9sICovCisjZGVmaW5lIEZVTkNfTEVEX09GRgkweDEKKyNkZWZpbmUgRlVOQ19MRURfT04JMHgzMDAwMQorI2RlZmluZSBLRVlCT0FSRF9MQU1QUwkweDEwMAorI2RlZmluZSBMT0dPTEFNUF9QT1dFUk9OIDB4MjAwMAorI2RlZmluZSBMT0dPTEFNUF9BTFdBWVMgIDB4NDAwMAorI2VuZGlmCisKKy8qIEhvdGtleSBkZXRhaWxzICovCisjZGVmaW5lIEtFWTFfQ09ERQkweDQxMAkvKiBjb2RlcyBmb3IgdGhlIGtleXMgaW4gdGhlIEdJUkIgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgS0VZMl9DT0RFCTB4NDExCisjZGVmaW5lIEtFWTNfQ09ERQkweDQxMgorI2RlZmluZSBLRVk0X0NPREUJMHg0MTMKKworI2RlZmluZSBNQVhfSE9US0VZX1JJTkdCVUZGRVJfU0laRSAxMDAKKyNkZWZpbmUgUklOR0JVRkZFUlNJWkUgNDAKKworLyogRGVidWdnaW5nICovCisjZGVmaW5lIEZVSkxBUFRPUF9MT0cJICAgQUNQSV9GVUpJVFNVX0hJRCAiOiAiCisjZGVmaW5lIEZVSkxBUFRPUF9FUlIJICAgS0VSTl9FUlIgRlVKTEFQVE9QX0xPRworI2RlZmluZSBGVUpMQVBUT1BfTk9USUNFICAgS0VSTl9OT1RJQ0UgRlVKTEFQVE9QX0xPRworI2RlZmluZSBGVUpMQVBUT1BfSU5GTwkgICBLRVJOX0lORk8gRlVKTEFQVE9QX0xPRworI2RlZmluZSBGVUpMQVBUT1BfREVCVUcgICAgS0VSTl9ERUJVRyBGVUpMQVBUT1BfTE9HCisKKyNkZWZpbmUgRlVKTEFQVE9QX0RCR19BTEwJICAweGZmZmYKKyNkZWZpbmUgRlVKTEFQVE9QX0RCR19FUlJPUgkgIDB4MDAwMQorI2RlZmluZSBGVUpMQVBUT1BfREJHX1dBUk4JICAweDAwMDIKKyNkZWZpbmUgRlVKTEFQVE9QX0RCR19JTkZPCSAgMHgwMDA0CisjZGVmaW5lIEZVSkxBUFRPUF9EQkdfVFJBQ0UJICAweDAwMDgKKworI2RlZmluZSBkYmdfcHJpbnRrKGFfZGJnX2xldmVsLCBmb3JtYXQsIGFyZy4uLikgXAorCWRvIHsgaWYgKGRiZ19sZXZlbCAmIGFfZGJnX2xldmVsKSBcCisJCXByaW50ayhGVUpMQVBUT1BfREVCVUcgIiVzOiAiIGZvcm1hdCwgX19mdW5jX18gLCAjIyBhcmcpOyBcCisJfSB3aGlsZSAoMCkKKyNpZmRlZiBDT05GSUdfRlVKSVRTVV9MQVBUT1BfREVCVUcKKyNkZWZpbmUgdmRiZ19wcmludGsoYV9kYmdfbGV2ZWwsIGZvcm1hdCwgYXJnLi4uKSBcCisJZGJnX3ByaW50ayhhX2RiZ19sZXZlbCwgZm9ybWF0LCAjIyBhcmcpCisjZWxzZQorI2RlZmluZSB2ZGJnX3ByaW50ayhhX2RiZ19sZXZlbCwgZm9ybWF0LCBhcmcuLi4pCisjZW5kaWYKKworLyogRGV2aWNlIGNvbnRyb2xsaW5nIHRoZSBiYWNrbGlnaHQgYW5kIGFzc29jaWF0ZWQga2V5cyAqLworc3RydWN0IGZ1aml0c3VfdCB7CisJYWNwaV9oYW5kbGUgYWNwaV9oYW5kbGU7CisJc3RydWN0IGFjcGlfZGV2aWNlICpkZXY7CisJc3RydWN0IGlucHV0X2RldiAqaW5wdXQ7CisJY2hhciBwaHlzWzMyXTsKKwlzdHJ1Y3QgYmFja2xpZ2h0X2RldmljZSAqYmxfZGV2aWNlOworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBmX2RldmljZTsKKwlpbnQga2V5Y29kZTEsIGtleWNvZGUyLCBrZXljb2RlMywga2V5Y29kZTQ7CisKKwl1bnNpZ25lZCBpbnQgbWF4X2JyaWdodG5lc3M7CisJdW5zaWduZWQgaW50IGJyaWdodG5lc3NfY2hhbmdlZDsKKwl1bnNpZ25lZCBpbnQgYnJpZ2h0bmVzc19sZXZlbDsKK307CisKK3N0YXRpYyBzdHJ1Y3QgZnVqaXRzdV90ICpmdWppdHN1Oworc3RhdGljIGludCB1c2VfYWx0X2xjZF9sZXZlbHMgPSAtMTsKK3N0YXRpYyBpbnQgZGlzYWJsZV9icmlnaHRuZXNzX2FkanVzdCA9IC0xOworCisvKiBEZXZpY2UgdXNlZCB0byBhY2Nlc3Mgb3RoZXIgaG90a2V5cyBvbiB0aGUgbGFwdG9wICovCitzdHJ1Y3QgZnVqaXRzdV9ob3RrZXlfdCB7CisJYWNwaV9oYW5kbGUgYWNwaV9oYW5kbGU7CisJc3RydWN0IGFjcGlfZGV2aWNlICpkZXY7CisJc3RydWN0IGlucHV0X2RldiAqaW5wdXQ7CisJY2hhciBwaHlzWzMyXTsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZl9kZXZpY2U7CisJc3RydWN0IGtmaWZvICpmaWZvOworCXNwaW5sb2NrX3QgZmlmb19sb2NrOworCWludCByZmtpbGxfc3RhdGU7CisJaW50IGxvZ29sYW1wX3JlZ2lzdGVyZWQ7CisJaW50IGtibGFtcHNfcmVnaXN0ZXJlZDsKK307CisKK3N0YXRpYyBzdHJ1Y3QgZnVqaXRzdV9ob3RrZXlfdCAqZnVqaXRzdV9ob3RrZXk7CisKK3N0YXRpYyB2b2lkIGFjcGlfZnVqaXRzdV9ob3RrZXlfbm90aWZ5KGFjcGlfaGFuZGxlIGhhbmRsZSwgdTMyIGV2ZW50LAorCQkJCSAgICAgICB2b2lkICpkYXRhKTsKKworI2lmZGVmIENPTkZJR19MRURTX0NMQVNTCitzdGF0aWMgZW51bSBsZWRfYnJpZ2h0bmVzcyBsb2dvbGFtcF9nZXQoc3RydWN0IGxlZF9jbGFzc2RldiAqY2Rldik7CitzdGF0aWMgdm9pZCBsb2dvbGFtcF9zZXQoc3RydWN0IGxlZF9jbGFzc2RldiAqY2RldiwKKwkJCSAgICAgICBlbnVtIGxlZF9icmlnaHRuZXNzIGJyaWdodG5lc3MpOworCitzdHJ1Y3QgbGVkX2NsYXNzZGV2IGxvZ29sYW1wX2xlZCA9IHsKKyAubmFtZSA9ICJmdWppdHN1Ojpsb2dvbGFtcCIsCisgLmJyaWdodG5lc3NfZ2V0ID0gbG9nb2xhbXBfZ2V0LAorIC5icmlnaHRuZXNzX3NldCA9IGxvZ29sYW1wX3NldAorfTsKKworc3RhdGljIGVudW0gbGVkX2JyaWdodG5lc3Mga2JsYW1wc19nZXQoc3RydWN0IGxlZF9jbGFzc2RldiAqY2Rldik7CitzdGF0aWMgdm9pZCBrYmxhbXBzX3NldChzdHJ1Y3QgbGVkX2NsYXNzZGV2ICpjZGV2LAorCQkJICAgICAgIGVudW0gbGVkX2JyaWdodG5lc3MgYnJpZ2h0bmVzcyk7CisKK3N0cnVjdCBsZWRfY2xhc3NkZXYga2JsYW1wc19sZWQgPSB7CisgLm5hbWUgPSAiZnVqaXRzdTo6a2JsYW1wcyIsCisgLmJyaWdodG5lc3NfZ2V0ID0ga2JsYW1wc19nZXQsCisgLmJyaWdodG5lc3Nfc2V0ID0ga2JsYW1wc19zZXQKK307CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19GVUpJVFNVX0xBUFRPUF9ERUJVRworc3RhdGljIHUzMiBkYmdfbGV2ZWwgPSAweDAzOworI2VuZGlmCisKK3N0YXRpYyB2b2lkIGFjcGlfZnVqaXRzdV9ub3RpZnkoYWNwaV9oYW5kbGUgaGFuZGxlLCB1MzIgZXZlbnQsIHZvaWQgKmRhdGEpOworCisvKiBGdWppdHN1IEFDUEkgaW50ZXJmYWNlIGZ1bmN0aW9uICovCisKK3N0YXRpYyBpbnQgY2FsbF9mZXh0X2Z1bmMoaW50IGNtZCwgaW50IGFyZzAsIGludCBhcmcxLCBpbnQgYXJnMikKK3sKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKKwl1bmlvbiBhY3BpX29iamVjdCBwYXJhbXNbNF0gPSB7CisJeyAudHlwZSA9IEFDUElfVFlQRV9JTlRFR0VSIH0sCisJeyAudHlwZSA9IEFDUElfVFlQRV9JTlRFR0VSIH0sCisJeyAudHlwZSA9IEFDUElfVFlQRV9JTlRFR0VSIH0sCisJeyAudHlwZSA9IEFDUElfVFlQRV9JTlRFR0VSIH0KKwl9OworCXN0cnVjdCBhY3BpX29iamVjdF9saXN0IGFyZ19saXN0ID0geyA0LCAmcGFyYW1zWzBdIH07CisJc3RydWN0IGFjcGlfYnVmZmVyIG91dHB1dDsKKwl1bmlvbiBhY3BpX29iamVjdCBvdXRfb2JqOworCWFjcGlfaGFuZGxlIGhhbmRsZSA9IE5VTEw7CisKKwlzdGF0dXMgPSBhY3BpX2dldF9oYW5kbGUoZnVqaXRzdV9ob3RrZXktPmFjcGlfaGFuZGxlLCAiRlVOQyIsICZoYW5kbGUpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQl2ZGJnX3ByaW50ayhGVUpMQVBUT1BfREJHX0VSUk9SLAorCQkJCSJGVU5DIGludGVyZmFjZSBpcyBub3QgcHJlc2VudFxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXBhcmFtc1swXS5pbnRlZ2VyLnZhbHVlID0gY21kOworCXBhcmFtc1sxXS5pbnRlZ2VyLnZhbHVlID0gYXJnMDsKKwlwYXJhbXNbMl0uaW50ZWdlci52YWx1ZSA9IGFyZzE7CisJcGFyYW1zWzNdLmludGVnZXIudmFsdWUgPSBhcmcyOworCisJb3V0cHV0Lmxlbmd0aCA9IHNpemVvZihvdXRfb2JqKTsKKwlvdXRwdXQucG9pbnRlciA9ICZvdXRfb2JqOworCisJc3RhdHVzID0gYWNwaV9ldmFsdWF0ZV9vYmplY3QoaGFuZGxlLCBOVUxMLCAmYXJnX2xpc3QsICZvdXRwdXQpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQl2ZGJnX3ByaW50ayhGVUpMQVBUT1BfREJHX1dBUk4sCisJCQkiRlVOQyAweCV4IChhcmdzIDB4JXgsIDB4JXgsIDB4JXgpIGNhbGwgZmFpbGVkXG4iLAorCQkJCWNtZCwgYXJnMCwgYXJnMSwgYXJnMik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWlmIChvdXRfb2JqLnR5cGUgIT0gQUNQSV9UWVBFX0lOVEVHRVIpIHsKKwkJdmRiZ19wcmludGsoRlVKTEFQVE9QX0RCR19XQVJOLAorCQkJIkZVTkMgMHgleCAoYXJncyAweCV4LCAweCV4LCAweCV4KSBkaWQgbm90ICIKKwkJCSJyZXR1cm4gYW4gaW50ZWdlclxuIiwKKwkJCWNtZCwgYXJnMCwgYXJnMSwgYXJnMik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXZkYmdfcHJpbnRrKEZVSkxBUFRPUF9EQkdfVFJBQ0UsCisJCSJGVU5DIDB4JXggKGFyZ3MgMHgleCwgMHgleCwgMHgleCkgcmV0dXJuZWQgMHgleFxuIiwKKwkJCWNtZCwgYXJnMCwgYXJnMSwgYXJnMiwgKGludClvdXRfb2JqLmludGVnZXIudmFsdWUpOworCXJldHVybiBvdXRfb2JqLmludGVnZXIudmFsdWU7Cit9CisKKyNpZmRlZiBDT05GSUdfTEVEU19DTEFTUworLyogTEVEIGNsYXNzIGNhbGxiYWNrcyAqLworCitzdGF0aWMgdm9pZCBsb2dvbGFtcF9zZXQoc3RydWN0IGxlZF9jbGFzc2RldiAqY2RldiwKKwkJCSAgICAgICBlbnVtIGxlZF9icmlnaHRuZXNzIGJyaWdodG5lc3MpCit7CisJaWYgKGJyaWdodG5lc3MgPj0gTEVEX0ZVTEwpIHsKKwkJY2FsbF9mZXh0X2Z1bmMoRlVOQ19MRURTLCAweDEsIExPR09MQU1QX1BPV0VST04sIEZVTkNfTEVEX09OKTsKKwkJY2FsbF9mZXh0X2Z1bmMoRlVOQ19MRURTLCAweDEsIExPR09MQU1QX0FMV0FZUywgRlVOQ19MRURfT04pOworCX0gZWxzZSBpZiAoYnJpZ2h0bmVzcyA+PSBMRURfSEFMRikgeworCQljYWxsX2ZleHRfZnVuYyhGVU5DX0xFRFMsIDB4MSwgTE9HT0xBTVBfUE9XRVJPTiwgRlVOQ19MRURfT04pOworCQljYWxsX2ZleHRfZnVuYyhGVU5DX0xFRFMsIDB4MSwgTE9HT0xBTVBfQUxXQVlTLCBGVU5DX0xFRF9PRkYpOworCX0gZWxzZSB7CisJCWNhbGxfZmV4dF9mdW5jKEZVTkNfTEVEUywgMHgxLCBMT0dPTEFNUF9QT1dFUk9OLCBGVU5DX0xFRF9PRkYpOworCX0KK30KKworc3RhdGljIHZvaWQga2JsYW1wc19zZXQoc3RydWN0IGxlZF9jbGFzc2RldiAqY2RldiwKKwkJCSAgICAgICBlbnVtIGxlZF9icmlnaHRuZXNzIGJyaWdodG5lc3MpCit7CisJaWYgKGJyaWdodG5lc3MgPj0gTEVEX0ZVTEwpCisJCWNhbGxfZmV4dF9mdW5jKEZVTkNfTEVEUywgMHgxLCBLRVlCT0FSRF9MQU1QUywgRlVOQ19MRURfT04pOworCWVsc2UKKwkJY2FsbF9mZXh0X2Z1bmMoRlVOQ19MRURTLCAweDEsIEtFWUJPQVJEX0xBTVBTLCBGVU5DX0xFRF9PRkYpOworfQorCitzdGF0aWMgZW51bSBsZWRfYnJpZ2h0bmVzcyBsb2dvbGFtcF9nZXQoc3RydWN0IGxlZF9jbGFzc2RldiAqY2RldikKK3sKKwllbnVtIGxlZF9icmlnaHRuZXNzIGJyaWdodG5lc3MgPSBMRURfT0ZGOworCWludCBwb3dlcm9uLCBhbHdheXM7CisKKwlwb3dlcm9uID0gY2FsbF9mZXh0X2Z1bmMoRlVOQ19MRURTLCAweDIsIExPR09MQU1QX1BPV0VST04sIDB4MCk7CisJaWYgKHBvd2Vyb24gPT0gRlVOQ19MRURfT04pIHsKKwkJYnJpZ2h0bmVzcyA9IExFRF9IQUxGOworCQlhbHdheXMgPSBjYWxsX2ZleHRfZnVuYyhGVU5DX0xFRFMsIDB4MiwgTE9HT0xBTVBfQUxXQVlTLCAweDApOworCQlpZiAoYWx3YXlzID09IEZVTkNfTEVEX09OKQorCQkJYnJpZ2h0bmVzcyA9IExFRF9GVUxMOworCX0KKwlyZXR1cm4gYnJpZ2h0bmVzczsKK30KKworc3RhdGljIGVudW0gbGVkX2JyaWdodG5lc3Mga2JsYW1wc19nZXQoc3RydWN0IGxlZF9jbGFzc2RldiAqY2RldikKK3sKKwllbnVtIGxlZF9icmlnaHRuZXNzIGJyaWdodG5lc3MgPSBMRURfT0ZGOworCisJaWYgKGNhbGxfZmV4dF9mdW5jKEZVTkNfTEVEUywgMHgyLCBLRVlCT0FSRF9MQU1QUywgMHgwKSA9PSBGVU5DX0xFRF9PTikKKwkJYnJpZ2h0bmVzcyA9IExFRF9GVUxMOworCisJcmV0dXJuIGJyaWdodG5lc3M7Cit9CisjZW5kaWYKKworLyogSGFyZHdhcmUgYWNjZXNzIGZvciBMQ0QgYnJpZ2h0bmVzcyBjb250cm9sICovCisKK3N0YXRpYyBpbnQgc2V0X2xjZF9sZXZlbChpbnQgbGV2ZWwpCit7CisJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CisJdW5pb24gYWNwaV9vYmplY3QgYXJnMCA9IHsgQUNQSV9UWVBFX0lOVEVHRVIgfTsKKwlzdHJ1Y3QgYWNwaV9vYmplY3RfbGlzdCBhcmdfbGlzdCA9IHsgMSwgJmFyZzAgfTsKKwlhY3BpX2hhbmRsZSBoYW5kbGUgPSBOVUxMOworCisJdmRiZ19wcmludGsoRlVKTEFQVE9QX0RCR19UUkFDRSwgInNldCBsY2QgbGV2ZWwgdmlhIFNCTEwgWyVkXVxuIiwKKwkJICAgIGxldmVsKTsKKworCWlmIChsZXZlbCA8IDAgfHwgbGV2ZWwgPj0gZnVqaXRzdS0+bWF4X2JyaWdodG5lc3MpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCFmdWppdHN1KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXN0YXR1cyA9IGFjcGlfZ2V0X2hhbmRsZShmdWppdHN1LT5hY3BpX2hhbmRsZSwgIlNCTEwiLCAmaGFuZGxlKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJdmRiZ19wcmludGsoRlVKTEFQVE9QX0RCR19FUlJPUiwgIlNCTEwgbm90IHByZXNlbnRcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlhcmcwLmludGVnZXIudmFsdWUgPSBsZXZlbDsKKworCXN0YXR1cyA9IGFjcGlfZXZhbHVhdGVfb2JqZWN0KGhhbmRsZSwgTlVMTCwgJmFyZ19saXN0LCBOVUxMKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpCisJCXJldHVybiAtRU5PREVWOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2V0X2xjZF9sZXZlbF9hbHQoaW50IGxldmVsKQoreworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOworCXVuaW9uIGFjcGlfb2JqZWN0IGFyZzAgPSB7IEFDUElfVFlQRV9JTlRFR0VSIH07CisJc3RydWN0IGFjcGlfb2JqZWN0X2xpc3QgYXJnX2xpc3QgPSB7IDEsICZhcmcwIH07CisJYWNwaV9oYW5kbGUgaGFuZGxlID0gTlVMTDsKKworCXZkYmdfcHJpbnRrKEZVSkxBUFRPUF9EQkdfVFJBQ0UsICJzZXQgbGNkIGxldmVsIHZpYSBTQkwyIFslZF1cbiIsCisJCSAgICBsZXZlbCk7CisKKwlpZiAobGV2ZWwgPCAwIHx8IGxldmVsID49IGZ1aml0c3UtPm1heF9icmlnaHRuZXNzKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICghZnVqaXRzdSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzdGF0dXMgPSBhY3BpX2dldF9oYW5kbGUoZnVqaXRzdS0+YWNwaV9oYW5kbGUsICJTQkwyIiwgJmhhbmRsZSk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXZkYmdfcHJpbnRrKEZVSkxBUFRPUF9EQkdfRVJST1IsICJTQkwyIG5vdCBwcmVzZW50XG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJYXJnMC5pbnRlZ2VyLnZhbHVlID0gbGV2ZWw7CisKKwlzdGF0dXMgPSBhY3BpX2V2YWx1YXRlX29iamVjdChoYW5kbGUsIE5VTEwsICZhcmdfbGlzdCwgTlVMTCk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdldF9sY2RfbGV2ZWwodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGxvbmcgc3RhdGUgPSAwOworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOworCisJdmRiZ19wcmludGsoRlVKTEFQVE9QX0RCR19UUkFDRSwgImdldCBsY2QgbGV2ZWwgdmlhIEdCTExcbiIpOworCisJc3RhdHVzID0KKwkgICAgYWNwaV9ldmFsdWF0ZV9pbnRlZ2VyKGZ1aml0c3UtPmFjcGlfaGFuZGxlLCAiR0JMTCIsIE5VTEwsICZzdGF0ZSk7CisJaWYgKHN0YXR1cyA8IDApCisJCXJldHVybiBzdGF0dXM7CisKKwlmdWppdHN1LT5icmlnaHRuZXNzX2xldmVsID0gc3RhdGUgJiAweDBmZmZmZmZmOworCisJaWYgKHN0YXRlICYgMHg4MDAwMDAwMCkKKwkJZnVqaXRzdS0+YnJpZ2h0bmVzc19jaGFuZ2VkID0gMTsKKwllbHNlCisJCWZ1aml0c3UtPmJyaWdodG5lc3NfY2hhbmdlZCA9IDA7CisKKwlyZXR1cm4gZnVqaXRzdS0+YnJpZ2h0bmVzc19sZXZlbDsKK30KKworc3RhdGljIGludCBnZXRfbWF4X2JyaWdodG5lc3Modm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGxvbmcgc3RhdGUgPSAwOworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOworCisJdmRiZ19wcmludGsoRlVKTEFQVE9QX0RCR19UUkFDRSwgImdldCBtYXggbGNkIGxldmVsIHZpYSBSQkxMXG4iKTsKKworCXN0YXR1cyA9CisJICAgIGFjcGlfZXZhbHVhdGVfaW50ZWdlcihmdWppdHN1LT5hY3BpX2hhbmRsZSwgIlJCTEwiLCBOVUxMLCAmc3RhdGUpOworCWlmIChzdGF0dXMgPCAwKQorCQlyZXR1cm4gc3RhdHVzOworCisJZnVqaXRzdS0+bWF4X2JyaWdodG5lc3MgPSBzdGF0ZTsKKworCXJldHVybiBmdWppdHN1LT5tYXhfYnJpZ2h0bmVzczsKK30KKworLyogQmFja2xpZ2h0IGRldmljZSBzdHVmZiAqLworCitzdGF0aWMgaW50IGJsX2dldF9icmlnaHRuZXNzKHN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICpiKQoreworCXJldHVybiBnZXRfbGNkX2xldmVsKCk7Cit9CisKK3N0YXRpYyBpbnQgYmxfdXBkYXRlX3N0YXR1cyhzdHJ1Y3QgYmFja2xpZ2h0X2RldmljZSAqYikKK3sKKwlpbnQgcmV0OworCWlmIChiLT5wcm9wcy5wb3dlciA9PSA0KQorCQlyZXQgPSBjYWxsX2ZleHRfZnVuYyhGVU5DX0JBQ0tMSUdIVCwgMHgxLCAweDQsIDB4Myk7CisJZWxzZQorCQlyZXQgPSBjYWxsX2ZleHRfZnVuYyhGVU5DX0JBQ0tMSUdIVCwgMHgxLCAweDQsIDB4MCk7CisJaWYgKHJldCAhPSAwKQorCQl2ZGJnX3ByaW50ayhGVUpMQVBUT1BfREJHX0VSUk9SLAorCQkJIlVuYWJsZSB0byBhZGp1c3QgYmFja2xpZ2h0IHBvd2VyLCBlcnJvciBjb2RlICVpXG4iLAorCQkJcmV0KTsKKworCWlmICh1c2VfYWx0X2xjZF9sZXZlbHMpCisJCXJldCA9IHNldF9sY2RfbGV2ZWxfYWx0KGItPnByb3BzLmJyaWdodG5lc3MpOworCWVsc2UKKwkJcmV0ID0gc2V0X2xjZF9sZXZlbChiLT5wcm9wcy5icmlnaHRuZXNzKTsKKwlpZiAocmV0ICE9IDApCisJCXZkYmdfcHJpbnRrKEZVSkxBUFRPUF9EQkdfRVJST1IsCisJCQkiVW5hYmxlIHRvIGFkanVzdCBMQ0QgYnJpZ2h0bmVzcywgZXJyb3IgY29kZSAlaVxuIiwKKwkJCXJldCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0cnVjdCBiYWNrbGlnaHRfb3BzIGZ1aml0c3VibF9vcHMgPSB7CisJLmdldF9icmlnaHRuZXNzID0gYmxfZ2V0X2JyaWdodG5lc3MsCisJLnVwZGF0ZV9zdGF0dXMgPSBibF91cGRhdGVfc3RhdHVzLAorfTsKKworLyogUGxhdGZvcm0gTENEIGJyaWdodG5lc3MgZGV2aWNlICovCisKK3N0YXRpYyBzc2l6ZV90CitzaG93X21heF9icmlnaHRuZXNzKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisKKwlpbnQgcmV0OworCisJcmV0ID0gZ2V0X21heF9icmlnaHRuZXNzKCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlaVxuIiwgcmV0KTsKK30KKworc3RhdGljIHNzaXplX3QKK3Nob3dfYnJpZ2h0bmVzc19jaGFuZ2VkKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisKKwlpbnQgcmV0OworCisJcmV0ID0gZnVqaXRzdS0+YnJpZ2h0bmVzc19jaGFuZ2VkOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWlcbiIsIHJldCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfbGNkX2xldmVsKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCSAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisKKwlpbnQgcmV0OworCisJcmV0ID0gZ2V0X2xjZF9sZXZlbCgpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWlcbiIsIHJldCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHN0b3JlX2xjZF9sZXZlbChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1ZiwKKwkJCSAgICAgICBzaXplX3QgY291bnQpCit7CisKKwlpbnQgbGV2ZWwsIHJldDsKKworCWlmIChzc2NhbmYoYnVmLCAiJWkiLCAmbGV2ZWwpICE9IDEKKwkgICAgfHwgKGxldmVsIDwgMCB8fCBsZXZlbCA+PSBmdWppdHN1LT5tYXhfYnJpZ2h0bmVzcykpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHVzZV9hbHRfbGNkX2xldmVscykKKwkJcmV0ID0gc2V0X2xjZF9sZXZlbF9hbHQobGV2ZWwpOworCWVsc2UKKwkJcmV0ID0gc2V0X2xjZF9sZXZlbChsZXZlbCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBnZXRfbGNkX2xldmVsKCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90CitpZ25vcmVfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAorCSAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHNzaXplX3QKK3Nob3dfbGlkX3N0YXRlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJaWYgKGZ1aml0c3VfaG90a2V5LT5yZmtpbGxfc3RhdGUgPT0gVU5TVVBQT1JURURfQ01EKQorCQlyZXR1cm4gc3ByaW50ZihidWYsICJ1bmtub3duXG4iKTsKKwlpZiAoZnVqaXRzdV9ob3RrZXktPnJma2lsbF9zdGF0ZSAmIDB4MTAwKQorCQlyZXR1cm4gc3ByaW50ZihidWYsICJvcGVuXG4iKTsKKwllbHNlCisJCXJldHVybiBzcHJpbnRmKGJ1ZiwgImNsb3NlZFxuIik7Cit9CisKK3N0YXRpYyBzc2l6ZV90CitzaG93X2RvY2tfc3RhdGUoc3RydWN0IGRldmljZSAqZGV2LAorCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlpZiAoZnVqaXRzdV9ob3RrZXktPnJma2lsbF9zdGF0ZSA9PSBVTlNVUFBPUlRFRF9DTUQpCisJCXJldHVybiBzcHJpbnRmKGJ1ZiwgInVua25vd25cbiIpOworCWlmIChmdWppdHN1X2hvdGtleS0+cmZraWxsX3N0YXRlICYgMHgyMDApCisJCXJldHVybiBzcHJpbnRmKGJ1ZiwgImRvY2tlZFxuIik7CisJZWxzZQorCQlyZXR1cm4gc3ByaW50ZihidWYsICJ1bmRvY2tlZFxuIik7Cit9CisKK3N0YXRpYyBzc2l6ZV90CitzaG93X3JhZGlvc19zdGF0ZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCWlmIChmdWppdHN1X2hvdGtleS0+cmZraWxsX3N0YXRlID09IFVOU1VQUE9SVEVEX0NNRCkKKwkJcmV0dXJuIHNwcmludGYoYnVmLCAidW5rbm93blxuIik7CisJaWYgKGZ1aml0c3VfaG90a2V5LT5yZmtpbGxfc3RhdGUgJiAweDIwKQorCQlyZXR1cm4gc3ByaW50ZihidWYsICJvblxuIik7CisJZWxzZQorCQlyZXR1cm4gc3ByaW50ZihidWYsICJraWxsZWRcbiIpOworfQorCitzdGF0aWMgREVWSUNFX0FUVFIobWF4X2JyaWdodG5lc3MsIDA0NDQsIHNob3dfbWF4X2JyaWdodG5lc3MsIGlnbm9yZV9zdG9yZSk7CitzdGF0aWMgREVWSUNFX0FUVFIoYnJpZ2h0bmVzc19jaGFuZ2VkLCAwNDQ0LCBzaG93X2JyaWdodG5lc3NfY2hhbmdlZCwKKwkJICAgaWdub3JlX3N0b3JlKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihsY2RfbGV2ZWwsIDA2NDQsIHNob3dfbGNkX2xldmVsLCBzdG9yZV9sY2RfbGV2ZWwpOworc3RhdGljIERFVklDRV9BVFRSKGxpZCwgMDQ0NCwgc2hvd19saWRfc3RhdGUsIGlnbm9yZV9zdG9yZSk7CitzdGF0aWMgREVWSUNFX0FUVFIoZG9jaywgMDQ0NCwgc2hvd19kb2NrX3N0YXRlLCBpZ25vcmVfc3RvcmUpOworc3RhdGljIERFVklDRV9BVFRSKHJhZGlvcywgMDQ0NCwgc2hvd19yYWRpb3Nfc3RhdGUsIGlnbm9yZV9zdG9yZSk7CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpmdWppdHN1cGZfYXR0cmlidXRlc1tdID0geworCSZkZXZfYXR0cl9icmlnaHRuZXNzX2NoYW5nZWQuYXR0ciwKKwkmZGV2X2F0dHJfbWF4X2JyaWdodG5lc3MuYXR0ciwKKwkmZGV2X2F0dHJfbGNkX2xldmVsLmF0dHIsCisJJmRldl9hdHRyX2xpZC5hdHRyLAorCSZkZXZfYXR0cl9kb2NrLmF0dHIsCisJJmRldl9hdHRyX3JhZGlvcy5hdHRyLAorCU5VTEwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGZ1aml0c3VwZl9hdHRyaWJ1dGVfZ3JvdXAgPSB7CisJLmF0dHJzID0gZnVqaXRzdXBmX2F0dHJpYnV0ZXMKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGZ1aml0c3VwZl9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJICAgLm5hbWUgPSAiZnVqaXRzdS1sYXB0b3AiLAorCQkgICAub3duZXIgPSBUSElTX01PRFVMRSwKKwkJICAgfQorfTsKKworc3RhdGljIHZvaWQgZG1pX2NoZWNrX2NiX2NvbW1vbihjb25zdCBzdHJ1Y3QgZG1pX3N5c3RlbV9pZCAqaWQpCit7CisJYWNwaV9oYW5kbGUgaGFuZGxlOworCXByaW50ayhLRVJOX0lORk8gImZ1aml0c3UtbGFwdG9wOiBJZGVudGlmaWVkIGxhcHRvcCBtb2RlbCAnJXMnLlxuIiwKKwkgICAgICAgaWQtPmlkZW50KTsKKwlpZiAodXNlX2FsdF9sY2RfbGV2ZWxzID09IC0xKSB7CisJCWlmIChBQ1BJX1NVQ0NFU1MoYWNwaV9nZXRfaGFuZGxlKE5VTEwsCisJCQkJIlxcX1NCLlBDSTAuTFBDQi5GSkVYLlNCTDIiLCAmaGFuZGxlKSkpCisJCQl1c2VfYWx0X2xjZF9sZXZlbHMgPSAxOworCQllbHNlCisJCQl1c2VfYWx0X2xjZF9sZXZlbHMgPSAwOworCQl2ZGJnX3ByaW50ayhGVUpMQVBUT1BfREJHX1RSQUNFLCAiYXV0by1kZXRlY3RlZCB1c2VhbHQgYXMgIgorCQkJIiVpXG4iLCB1c2VfYWx0X2xjZF9sZXZlbHMpOworCX0KK30KKworc3RhdGljIGludCBkbWlfY2hlY2tfY2JfczY0MTAoY29uc3Qgc3RydWN0IGRtaV9zeXN0ZW1faWQgKmlkKQoreworCWRtaV9jaGVja19jYl9jb21tb24oaWQpOworCWZ1aml0c3UtPmtleWNvZGUxID0gS0VZX1NDUkVFTkxPQ0s7CS8qICJMb2NrIiAqLworCWZ1aml0c3UtPmtleWNvZGUyID0gS0VZX0hFTFA7CS8qICJNb2JpbGl0eSBDZW50ZXIiICovCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZG1pX2NoZWNrX2NiX3M2NDIwKGNvbnN0IHN0cnVjdCBkbWlfc3lzdGVtX2lkICppZCkKK3sKKwlkbWlfY2hlY2tfY2JfY29tbW9uKGlkKTsKKwlmdWppdHN1LT5rZXljb2RlMSA9IEtFWV9TQ1JFRU5MT0NLOwkvKiAiTG9jayIgKi8KKwlmdWppdHN1LT5rZXljb2RlMiA9IEtFWV9IRUxQOwkvKiAiTW9iaWxpdHkgQ2VudGVyIiAqLworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRtaV9jaGVja19jYl9wODAxMChjb25zdCBzdHJ1Y3QgZG1pX3N5c3RlbV9pZCAqaWQpCit7CisJZG1pX2NoZWNrX2NiX2NvbW1vbihpZCk7CisJZnVqaXRzdS0+a2V5Y29kZTEgPSBLRVlfSEVMUDsJLyogIlN1cHBvcnQiICovCisJZnVqaXRzdS0+a2V5Y29kZTMgPSBLRVlfU1dJVENIVklERU9NT0RFOwkvKiAiUHJlc2VudGF0aW9uIiAqLworCWZ1aml0c3UtPmtleWNvZGU0ID0gS0VZX1dXVzsJLyogIkludGVybmV0IiAqLworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGRtaV9zeXN0ZW1faWQgZnVqaXRzdV9kbWlfdGFibGVbXSA9IHsKKwl7CisJIC5pZGVudCA9ICJGdWppdHN1IFNpZW1lbnMgUzY0MTAiLAorCSAubWF0Y2hlcyA9IHsKKwkJICAgICBETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJGVUpJVFNVIFNJRU1FTlMiKSwKKwkJICAgICBETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIkxJRkVCT09LIFM2NDEwIiksCisJCSAgICAgfSwKKwkgLmNhbGxiYWNrID0gZG1pX2NoZWNrX2NiX3M2NDEwfSwKKwl7CisJIC5pZGVudCA9ICJGdWppdHN1IFNpZW1lbnMgUzY0MjAiLAorCSAubWF0Y2hlcyA9IHsKKwkJICAgICBETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJGVUpJVFNVIFNJRU1FTlMiKSwKKwkJICAgICBETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIkxJRkVCT09LIFM2NDIwIiksCisJCSAgICAgfSwKKwkgLmNhbGxiYWNrID0gZG1pX2NoZWNrX2NiX3M2NDIwfSwKKwl7CisJIC5pZGVudCA9ICJGdWppdHN1IExpZmVCb29rIFA4MDEwIiwKKwkgLm1hdGNoZXMgPSB7CisJCSAgICAgRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiRlVKSVRTVSIpLAorCQkgICAgIERNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiTGlmZUJvb2sgUDgwMTAiKSwKKwkJICAgICB9LAorCSAuY2FsbGJhY2sgPSBkbWlfY2hlY2tfY2JfcDgwMTB9LAorCXt9Cit9OworCisvKiBBQ1BJIGRldmljZSBmb3IgTENEIGJyaWdodG5lc3MgY29udHJvbCAqLworCitzdGF0aWMgaW50IGFjcGlfZnVqaXRzdV9hZGQoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpCit7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCWFjcGlfaGFuZGxlIGhhbmRsZTsKKwlpbnQgcmVzdWx0ID0gMDsKKwlpbnQgc3RhdGUgPSAwOworCXN0cnVjdCBpbnB1dF9kZXYgKmlucHV0OworCWludCBlcnJvcjsKKworCWlmICghZGV2aWNlKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWZ1aml0c3UtPmFjcGlfaGFuZGxlID0gZGV2aWNlLT5oYW5kbGU7CisJc3ByaW50ZihhY3BpX2RldmljZV9uYW1lKGRldmljZSksICIlcyIsIEFDUElfRlVKSVRTVV9ERVZJQ0VfTkFNRSk7CisJc3ByaW50ZihhY3BpX2RldmljZV9jbGFzcyhkZXZpY2UpLCAiJXMiLCBBQ1BJX0ZVSklUU1VfQ0xBU1MpOworCWRldmljZS0+ZHJpdmVyX2RhdGEgPSBmdWppdHN1OworCisJc3RhdHVzID0gYWNwaV9pbnN0YWxsX25vdGlmeV9oYW5kbGVyKGRldmljZS0+aGFuZGxlLAorCQkJCQkgICAgIEFDUElfREVWSUNFX05PVElGWSwKKwkJCQkJICAgICBhY3BpX2Z1aml0c3Vfbm90aWZ5LCBmdWppdHN1KTsKKworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlwcmludGsoS0VSTl9FUlIgIkVycm9yIGluc3RhbGxpbmcgbm90aWZ5IGhhbmRsZXJcbiIpOworCQllcnJvciA9IC1FTk9ERVY7CisJCWdvdG8gZXJyX3N0b3A7CisJfQorCisJZnVqaXRzdS0+aW5wdXQgPSBpbnB1dCA9IGlucHV0X2FsbG9jYXRlX2RldmljZSgpOworCWlmICghaW5wdXQpIHsKKwkJZXJyb3IgPSAtRU5PTUVNOworCQlnb3RvIGVycl91bmluc3RhbGxfbm90aWZ5OworCX0KKworCXNucHJpbnRmKGZ1aml0c3UtPnBoeXMsIHNpemVvZihmdWppdHN1LT5waHlzKSwKKwkJICIlcy92aWRlby9pbnB1dDAiLCBhY3BpX2RldmljZV9oaWQoZGV2aWNlKSk7CisKKwlpbnB1dC0+bmFtZSA9IGFjcGlfZGV2aWNlX25hbWUoZGV2aWNlKTsKKwlpbnB1dC0+cGh5cyA9IGZ1aml0c3UtPnBoeXM7CisJaW5wdXQtPmlkLmJ1c3R5cGUgPSBCVVNfSE9TVDsKKwlpbnB1dC0+aWQucHJvZHVjdCA9IDB4MDY7CisJaW5wdXQtPmRldi5wYXJlbnQgPSAmZGV2aWNlLT5kZXY7CisJaW5wdXQtPmV2Yml0WzBdID0gQklUKEVWX0tFWSk7CisJc2V0X2JpdChLRVlfQlJJR0hUTkVTU1VQLCBpbnB1dC0+a2V5Yml0KTsKKwlzZXRfYml0KEtFWV9CUklHSFRORVNTRE9XTiwgaW5wdXQtPmtleWJpdCk7CisJc2V0X2JpdChLRVlfVU5LTk9XTiwgaW5wdXQtPmtleWJpdCk7CisKKwllcnJvciA9IGlucHV0X3JlZ2lzdGVyX2RldmljZShpbnB1dCk7CisJaWYgKGVycm9yKQorCQlnb3RvIGVycl9mcmVlX2lucHV0X2RldjsKKworCXJlc3VsdCA9IGFjcGlfYnVzX2dldF9wb3dlcihmdWppdHN1LT5hY3BpX2hhbmRsZSwgJnN0YXRlKTsKKwlpZiAocmVzdWx0KSB7CisJCXByaW50ayhLRVJOX0VSUiAiRXJyb3IgcmVhZGluZyBwb3dlciBzdGF0ZVxuIik7CisJCWdvdG8gZW5kOworCX0KKworCXByaW50ayhLRVJOX0lORk8gUFJFRklYICIlcyBbJXNdICglcylcbiIsCisJICAgICAgIGFjcGlfZGV2aWNlX25hbWUoZGV2aWNlKSwgYWNwaV9kZXZpY2VfYmlkKGRldmljZSksCisJICAgICAgICFkZXZpY2UtPnBvd2VyLnN0YXRlID8gIm9uIiA6ICJvZmYiKTsKKworCWZ1aml0c3UtPmRldiA9IGRldmljZTsKKworCWlmIChBQ1BJX1NVQ0NFU1MKKwkgICAgKGFjcGlfZ2V0X2hhbmRsZShkZXZpY2UtPmhhbmRsZSwgTUVUSE9EX05BTUVfX0lOSSwgJmhhbmRsZSkpKSB7CisJCXZkYmdfcHJpbnRrKEZVSkxBUFRPUF9EQkdfSU5GTywgIkludm9raW5nIF9JTklcbiIpOworCQlpZiAoQUNQSV9GQUlMVVJFCisJCSAgICAoYWNwaV9ldmFsdWF0ZV9vYmplY3QKKwkJICAgICAoZGV2aWNlLT5oYW5kbGUsIE1FVEhPRF9OQU1FX19JTkksIE5VTEwsIE5VTEwpKSkKKwkJCXByaW50ayhLRVJOX0VSUiAiX0lOSSBNZXRob2QgZmFpbGVkXG4iKTsKKwl9CisKKwkvKiBkbyBjb25maWcgKGRldGVjdCBkZWZhdWx0cykgKi8KKwl1c2VfYWx0X2xjZF9sZXZlbHMgPSB1c2VfYWx0X2xjZF9sZXZlbHMgPT0gMSA/IDEgOiAwOworCWRpc2FibGVfYnJpZ2h0bmVzc19hZGp1c3QgPSBkaXNhYmxlX2JyaWdodG5lc3NfYWRqdXN0ID09IDEgPyAxIDogMDsKKwl2ZGJnX3ByaW50ayhGVUpMQVBUT1BfREJHX0lORk8sCisJCSAgICAiY29uZmlnOiBbYWx0IGludGVyZmFjZTogJWRdLCBbYWRqdXN0IGRpc2FibGU6ICVkXVxuIiwKKwkJICAgIHVzZV9hbHRfbGNkX2xldmVscywgZGlzYWJsZV9icmlnaHRuZXNzX2FkanVzdCk7CisKKwlpZiAoZ2V0X21heF9icmlnaHRuZXNzKCkgPD0gMCkKKwkJZnVqaXRzdS0+bWF4X2JyaWdodG5lc3MgPSBGVUpJVFNVX0xDRF9OX0xFVkVMUzsKKwlnZXRfbGNkX2xldmVsKCk7CisKKwlyZXR1cm4gcmVzdWx0OworCitlbmQ6CitlcnJfZnJlZV9pbnB1dF9kZXY6CisJaW5wdXRfZnJlZV9kZXZpY2UoaW5wdXQpOworZXJyX3VuaW5zdGFsbF9ub3RpZnk6CisJYWNwaV9yZW1vdmVfbm90aWZ5X2hhbmRsZXIoZGV2aWNlLT5oYW5kbGUsIEFDUElfREVWSUNFX05PVElGWSwKKwkJCQkgICBhY3BpX2Z1aml0c3Vfbm90aWZ5KTsKK2Vycl9zdG9wOgorCisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGludCBhY3BpX2Z1aml0c3VfcmVtb3ZlKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlLCBpbnQgdHlwZSkKK3sKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJc3RydWN0IGZ1aml0c3VfdCAqZnVqaXRzdSA9IE5VTEw7CisKKwlpZiAoIWRldmljZSB8fCAhYWNwaV9kcml2ZXJfZGF0YShkZXZpY2UpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWZ1aml0c3UgPSBhY3BpX2RyaXZlcl9kYXRhKGRldmljZSk7CisKKwlzdGF0dXMgPSBhY3BpX3JlbW92ZV9ub3RpZnlfaGFuZGxlcihmdWppdHN1LT5hY3BpX2hhbmRsZSwKKwkJCQkJICAgIEFDUElfREVWSUNFX05PVElGWSwKKwkJCQkJICAgIGFjcGlfZnVqaXRzdV9ub3RpZnkpOworCisJaWYgKCFkZXZpY2UgfHwgIWFjcGlfZHJpdmVyX2RhdGEoZGV2aWNlKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlmdWppdHN1LT5hY3BpX2hhbmRsZSA9IE5VTEw7CisKKwlyZXR1cm4gMDsKK30KKworLyogQnJpZ2h0bmVzcyBub3RpZnkgKi8KKworc3RhdGljIHZvaWQgYWNwaV9mdWppdHN1X25vdGlmeShhY3BpX2hhbmRsZSBoYW5kbGUsIHUzMiBldmVudCwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dDsKKwlpbnQga2V5Y29kZTsKKwlpbnQgb2xkYiwgbmV3YjsKKworCWlucHV0ID0gZnVqaXRzdS0+aW5wdXQ7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBBQ1BJX0ZVSklUU1VfTk9USUZZX0NPREUxOgorCQlrZXljb2RlID0gMDsKKwkJb2xkYiA9IGZ1aml0c3UtPmJyaWdodG5lc3NfbGV2ZWw7CisJCWdldF9sY2RfbGV2ZWwoKTsKKwkJbmV3YiA9IGZ1aml0c3UtPmJyaWdodG5lc3NfbGV2ZWw7CisKKwkJdmRiZ19wcmludGsoRlVKTEFQVE9QX0RCR19UUkFDRSwKKwkJCSAgICAiYnJpZ2h0bmVzcyBidXR0b24gZXZlbnQgWyVpIC0+ICVpICglaSldXG4iLAorCQkJICAgIG9sZGIsIG5ld2IsIGZ1aml0c3UtPmJyaWdodG5lc3NfY2hhbmdlZCk7CisKKwkJaWYgKG9sZGIgPCBuZXdiKSB7CisJCQlpZiAoZGlzYWJsZV9icmlnaHRuZXNzX2FkanVzdCAhPSAxKSB7CisJCQkJaWYgKHVzZV9hbHRfbGNkX2xldmVscykKKwkJCQkJc2V0X2xjZF9sZXZlbF9hbHQobmV3Yik7CisJCQkJZWxzZQorCQkJCQlzZXRfbGNkX2xldmVsKG5ld2IpOworCQkJfQorCQkJYWNwaV9idXNfZ2VuZXJhdGVfcHJvY19ldmVudChmdWppdHN1LT5kZXYsCisJCQkJQUNQSV9WSURFT19OT1RJRllfSU5DX0JSSUdIVE5FU1MsIDApOworCQkJa2V5Y29kZSA9IEtFWV9CUklHSFRORVNTVVA7CisJCX0gZWxzZSBpZiAob2xkYiA+IG5ld2IpIHsKKwkJCWlmIChkaXNhYmxlX2JyaWdodG5lc3NfYWRqdXN0ICE9IDEpIHsKKwkJCQlpZiAodXNlX2FsdF9sY2RfbGV2ZWxzKQorCQkJCQlzZXRfbGNkX2xldmVsX2FsdChuZXdiKTsKKwkJCQllbHNlCisJCQkJCXNldF9sY2RfbGV2ZWwobmV3Yik7CisJCQl9CisJCQlhY3BpX2J1c19nZW5lcmF0ZV9wcm9jX2V2ZW50KGZ1aml0c3UtPmRldiwKKwkJCQlBQ1BJX1ZJREVPX05PVElGWV9ERUNfQlJJR0hUTkVTUywgMCk7CisJCQlrZXljb2RlID0gS0VZX0JSSUdIVE5FU1NET1dOOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWtleWNvZGUgPSBLRVlfVU5LTk9XTjsKKwkJdmRiZ19wcmludGsoRlVKTEFQVE9QX0RCR19XQVJOLAorCQkJICAgICJ1bnN1cHBvcnRlZCBldmVudCBbMHgleF1cbiIsIGV2ZW50KTsKKwkJYnJlYWs7CisJfQorCisJaWYgKGtleWNvZGUgIT0gMCkgeworCQlpbnB1dF9yZXBvcnRfa2V5KGlucHV0LCBrZXljb2RlLCAxKTsKKwkJaW5wdXRfc3luYyhpbnB1dCk7CisJCWlucHV0X3JlcG9ydF9rZXkoaW5wdXQsIGtleWNvZGUsIDApOworCQlpbnB1dF9zeW5jKGlucHV0KTsKKwl9CisKKwlyZXR1cm47Cit9CisKKy8qIEFDUEkgZGV2aWNlIGZvciBob3RrZXkgaGFuZGxpbmcgKi8KKworc3RhdGljIGludCBhY3BpX2Z1aml0c3VfaG90a2V5X2FkZChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSkKK3sKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJYWNwaV9oYW5kbGUgaGFuZGxlOworCWludCByZXN1bHQgPSAwOworCWludCBzdGF0ZSA9IDA7CisJc3RydWN0IGlucHV0X2RldiAqaW5wdXQ7CisJaW50IGVycm9yOworCWludCBpOworCisJaWYgKCFkZXZpY2UpCisJCXJldHVybiAtRUlOVkFMOworCisJZnVqaXRzdV9ob3RrZXktPmFjcGlfaGFuZGxlID0gZGV2aWNlLT5oYW5kbGU7CisJc3ByaW50ZihhY3BpX2RldmljZV9uYW1lKGRldmljZSksICIlcyIsCisJCUFDUElfRlVKSVRTVV9IT1RLRVlfREVWSUNFX05BTUUpOworCXNwcmludGYoYWNwaV9kZXZpY2VfY2xhc3MoZGV2aWNlKSwgIiVzIiwgQUNQSV9GVUpJVFNVX0NMQVNTKTsKKwlkZXZpY2UtPmRyaXZlcl9kYXRhID0gZnVqaXRzdV9ob3RrZXk7CisKKwlzdGF0dXMgPSBhY3BpX2luc3RhbGxfbm90aWZ5X2hhbmRsZXIoZGV2aWNlLT5oYW5kbGUsCisJCQkJCSAgICAgQUNQSV9ERVZJQ0VfTk9USUZZLAorCQkJCQkgICAgIGFjcGlfZnVqaXRzdV9ob3RrZXlfbm90aWZ5LAorCQkJCQkgICAgIGZ1aml0c3VfaG90a2V5KTsKKworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlwcmludGsoS0VSTl9FUlIgIkVycm9yIGluc3RhbGxpbmcgbm90aWZ5IGhhbmRsZXJcbiIpOworCQllcnJvciA9IC1FTk9ERVY7CisJCWdvdG8gZXJyX3N0b3A7CisJfQorCisJLyoga2ZpZm8gKi8KKwlzcGluX2xvY2tfaW5pdCgmZnVqaXRzdV9ob3RrZXktPmZpZm9fbG9jayk7CisJZnVqaXRzdV9ob3RrZXktPmZpZm8gPQorCSAgICBrZmlmb19hbGxvYyhSSU5HQlVGRkVSU0laRSAqIHNpemVvZihpbnQpLCBHRlBfS0VSTkVMLAorCQkJJmZ1aml0c3VfaG90a2V5LT5maWZvX2xvY2spOworCWlmIChJU19FUlIoZnVqaXRzdV9ob3RrZXktPmZpZm8pKSB7CisJCXByaW50ayhLRVJOX0VSUiAia2ZpZm9fYWxsb2MgZmFpbGVkXG4iKTsKKwkJZXJyb3IgPSBQVFJfRVJSKGZ1aml0c3VfaG90a2V5LT5maWZvKTsKKwkJZ290byBlcnJfc3RvcDsKKwl9CisKKwlmdWppdHN1X2hvdGtleS0+aW5wdXQgPSBpbnB1dCA9IGlucHV0X2FsbG9jYXRlX2RldmljZSgpOworCWlmICghaW5wdXQpIHsKKwkJZXJyb3IgPSAtRU5PTUVNOworCQlnb3RvIGVycl91bmluc3RhbGxfbm90aWZ5OworCX0KKworCXNucHJpbnRmKGZ1aml0c3VfaG90a2V5LT5waHlzLCBzaXplb2YoZnVqaXRzdV9ob3RrZXktPnBoeXMpLAorCQkgIiVzL3ZpZGVvL2lucHV0MCIsIGFjcGlfZGV2aWNlX2hpZChkZXZpY2UpKTsKKworCWlucHV0LT5uYW1lID0gYWNwaV9kZXZpY2VfbmFtZShkZXZpY2UpOworCWlucHV0LT5waHlzID0gZnVqaXRzdV9ob3RrZXktPnBoeXM7CisJaW5wdXQtPmlkLmJ1c3R5cGUgPSBCVVNfSE9TVDsKKwlpbnB1dC0+aWQucHJvZHVjdCA9IDB4MDY7CisJaW5wdXQtPmRldi5wYXJlbnQgPSAmZGV2aWNlLT5kZXY7CisKKwlzZXRfYml0KEVWX0tFWSwgaW5wdXQtPmV2Yml0KTsKKwlzZXRfYml0KGZ1aml0c3UtPmtleWNvZGUxLCBpbnB1dC0+a2V5Yml0KTsKKwlzZXRfYml0KGZ1aml0c3UtPmtleWNvZGUyLCBpbnB1dC0+a2V5Yml0KTsKKwlzZXRfYml0KGZ1aml0c3UtPmtleWNvZGUzLCBpbnB1dC0+a2V5Yml0KTsKKwlzZXRfYml0KGZ1aml0c3UtPmtleWNvZGU0LCBpbnB1dC0+a2V5Yml0KTsKKwlzZXRfYml0KEtFWV9VTktOT1dOLCBpbnB1dC0+a2V5Yml0KTsKKworCWVycm9yID0gaW5wdXRfcmVnaXN0ZXJfZGV2aWNlKGlucHV0KTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gZXJyX2ZyZWVfaW5wdXRfZGV2OworCisJcmVzdWx0ID0gYWNwaV9idXNfZ2V0X3Bvd2VyKGZ1aml0c3VfaG90a2V5LT5hY3BpX2hhbmRsZSwgJnN0YXRlKTsKKwlpZiAocmVzdWx0KSB7CisJCXByaW50ayhLRVJOX0VSUiAiRXJyb3IgcmVhZGluZyBwb3dlciBzdGF0ZVxuIik7CisJCWdvdG8gZW5kOworCX0KKworCXByaW50ayhLRVJOX0lORk8gUFJFRklYICIlcyBbJXNdICglcylcbiIsCisJICAgICAgIGFjcGlfZGV2aWNlX25hbWUoZGV2aWNlKSwgYWNwaV9kZXZpY2VfYmlkKGRldmljZSksCisJICAgICAgICFkZXZpY2UtPnBvd2VyLnN0YXRlID8gIm9uIiA6ICJvZmYiKTsKKworCWZ1aml0c3VfaG90a2V5LT5kZXYgPSBkZXZpY2U7CisKKwlpZiAoQUNQSV9TVUNDRVNTCisJICAgIChhY3BpX2dldF9oYW5kbGUoZGV2aWNlLT5oYW5kbGUsIE1FVEhPRF9OQU1FX19JTkksICZoYW5kbGUpKSkgeworCQl2ZGJnX3ByaW50ayhGVUpMQVBUT1BfREJHX0lORk8sICJJbnZva2luZyBfSU5JXG4iKTsKKwkJaWYgKEFDUElfRkFJTFVSRQorCQkgICAgKGFjcGlfZXZhbHVhdGVfb2JqZWN0CisJCSAgICAgKGRldmljZS0+aGFuZGxlLCBNRVRIT0RfTkFNRV9fSU5JLCBOVUxMLCBOVUxMKSkpCisJCQlwcmludGsoS0VSTl9FUlIgIl9JTkkgTWV0aG9kIGZhaWxlZFxuIik7CisJfQorCisJaSA9IDA7CisJd2hpbGUgKGNhbGxfZmV4dF9mdW5jKEZVTkNfQlVUVE9OUywgMHgxLCAweDAsIDB4MCkgIT0gMAorCQkmJiAoaSsrKSA8IE1BWF9IT1RLRVlfUklOR0JVRkZFUl9TSVpFKQorCQk7IC8qIE5vIGFjdGlvbiwgcmVzdWx0IGlzIGRpc2NhcmRlZCAqLworCXZkYmdfcHJpbnRrKEZVSkxBUFRPUF9EQkdfSU5GTywgIkRpc2NhcmRlZCAlaSByaW5nYnVmZmVyIGVudHJpZXNcbiIsIGkpOworCisJZnVqaXRzdV9ob3RrZXktPnJma2lsbF9zdGF0ZSA9CisJCWNhbGxfZmV4dF9mdW5jKEZVTkNfUkZLSUxMLCAweDQsIDB4MCwgMHgwKTsKKworCS8qIFN1c3BlY3QgdGhpcyBpcyBhIGtleW1hcCBvZiB0aGUgYXBwbGljYXRpb24gcGFuZWwsIHByaW50IGl0ICovCisJcHJpbnRrKEtFUk5fSU5GTyAiZnVqaXRzdS1sYXB0b3A6IEJUTkk6IFsweCV4XVxuIiwKKwkJY2FsbF9mZXh0X2Z1bmMoRlVOQ19CVVRUT05TLCAweDAsIDB4MCwgMHgwKSk7CisKKwkjaWZkZWYgQ09ORklHX0xFRFNfQ0xBU1MKKwlpZiAoY2FsbF9mZXh0X2Z1bmMoRlVOQ19MRURTLCAweDAsIDB4MCwgMHgwKSAmIExPR09MQU1QX1BPV0VST04pIHsKKwkJcmVzdWx0ID0gbGVkX2NsYXNzZGV2X3JlZ2lzdGVyKCZmdWppdHN1LT5wZl9kZXZpY2UtPmRldiwKKwkJCQkJCSZsb2dvbGFtcF9sZWQpOworCQlpZiAocmVzdWx0ID09IDApIHsKKwkJCWZ1aml0c3VfaG90a2V5LT5sb2dvbGFtcF9yZWdpc3RlcmVkID0gMTsKKwkJfSBlbHNlIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiZnVqaXRzdS1sYXB0b3A6IENvdWxkIG5vdCByZWdpc3RlciAiCisJCQkiTEVEIGhhbmRsZXIgZm9yIGxvZ28gbGFtcCwgZXJyb3IgJWlcbiIsIHJlc3VsdCk7CisJCX0KKwl9CisKKwlpZiAoKGNhbGxfZmV4dF9mdW5jKEZVTkNfTEVEUywgMHgwLCAweDAsIDB4MCkgJiBLRVlCT0FSRF9MQU1QUykgJiYKKwkgICAoY2FsbF9mZXh0X2Z1bmMoRlVOQ19CVVRUT05TLCAweDAsIDB4MCwgMHgwKSA9PSAweDApKSB7CisJCXJlc3VsdCA9IGxlZF9jbGFzc2Rldl9yZWdpc3RlcigmZnVqaXRzdS0+cGZfZGV2aWNlLT5kZXYsCisJCQkJCQkma2JsYW1wc19sZWQpOworCQlpZiAocmVzdWx0ID09IDApIHsKKwkJCWZ1aml0c3VfaG90a2V5LT5rYmxhbXBzX3JlZ2lzdGVyZWQgPSAxOworCQl9IGVsc2UgeworCQkJcHJpbnRrKEtFUk5fRVJSICJmdWppdHN1LWxhcHRvcDogQ291bGQgbm90IHJlZ2lzdGVyICIKKwkJCSJMRUQgaGFuZGxlciBmb3Iga2V5Ym9hcmQgbGFtcHMsIGVycm9yICVpXG4iLCByZXN1bHQpOworCQl9CisJfQorCSNlbmRpZgorCisJcmV0dXJuIHJlc3VsdDsKKworZW5kOgorZXJyX2ZyZWVfaW5wdXRfZGV2OgorCWlucHV0X2ZyZWVfZGV2aWNlKGlucHV0KTsKK2Vycl91bmluc3RhbGxfbm90aWZ5OgorCWFjcGlfcmVtb3ZlX25vdGlmeV9oYW5kbGVyKGRldmljZS0+aGFuZGxlLCBBQ1BJX0RFVklDRV9OT1RJRlksCisJCQkJICAgYWNwaV9mdWppdHN1X2hvdGtleV9ub3RpZnkpOworCWtmaWZvX2ZyZWUoZnVqaXRzdV9ob3RrZXktPmZpZm8pOworZXJyX3N0b3A6CisKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgaW50IGFjcGlfZnVqaXRzdV9ob3RrZXlfcmVtb3ZlKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlLCBpbnQgdHlwZSkKK3sKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJc3RydWN0IGZ1aml0c3VfaG90a2V5X3QgKmZ1aml0c3VfaG90a2V5ID0gTlVMTDsKKworCWlmICghZGV2aWNlIHx8ICFhY3BpX2RyaXZlcl9kYXRhKGRldmljZSkpCisJCXJldHVybiAtRUlOVkFMOworCisJZnVqaXRzdV9ob3RrZXkgPSBhY3BpX2RyaXZlcl9kYXRhKGRldmljZSk7CisKKwlzdGF0dXMgPSBhY3BpX3JlbW92ZV9ub3RpZnlfaGFuZGxlcihmdWppdHN1X2hvdGtleS0+YWNwaV9oYW5kbGUsCisJCQkJCSAgICBBQ1BJX0RFVklDRV9OT1RJRlksCisJCQkJCSAgICBhY3BpX2Z1aml0c3VfaG90a2V5X25vdGlmeSk7CisKKwlmdWppdHN1X2hvdGtleS0+YWNwaV9oYW5kbGUgPSBOVUxMOworCisJa2ZpZm9fZnJlZShmdWppdHN1X2hvdGtleS0+Zmlmbyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYWNwaV9mdWppdHN1X2hvdGtleV9ub3RpZnkoYWNwaV9oYW5kbGUgaGFuZGxlLCB1MzIgZXZlbnQsCisJCQkJICAgICAgIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGlucHV0X2RldiAqaW5wdXQ7CisJaW50IGtleWNvZGUsIGtleWNvZGVfcjsKKwl1bnNpZ25lZCBpbnQgaXJiID0gMTsKKwlpbnQgaSwgc3RhdHVzOworCisJaW5wdXQgPSBmdWppdHN1X2hvdGtleS0+aW5wdXQ7CisKKwlmdWppdHN1X2hvdGtleS0+cmZraWxsX3N0YXRlID0KKwkJY2FsbF9mZXh0X2Z1bmMoRlVOQ19SRktJTEwsIDB4NCwgMHgwLCAweDApOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgQUNQSV9GVUpJVFNVX05PVElGWV9DT0RFMToKKwkJaSA9IDA7CisJCXdoaWxlICgoaXJiID0KKwkJCWNhbGxfZmV4dF9mdW5jKEZVTkNfQlVUVE9OUywgMHgxLCAweDAsIDB4MCkpICE9IDAKKwkJCQkmJiAoaSsrKSA8IE1BWF9IT1RLRVlfUklOR0JVRkZFUl9TSVpFKSB7CisJCQlzd2l0Y2ggKGlyYiAmIDB4NGZmKSB7CisJCQljYXNlIEtFWTFfQ09ERToKKwkJCQlrZXljb2RlID0gZnVqaXRzdS0+a2V5Y29kZTE7CisJCQkJYnJlYWs7CisJCQljYXNlIEtFWTJfQ09ERToKKwkJCQlrZXljb2RlID0gZnVqaXRzdS0+a2V5Y29kZTI7CisJCQkJYnJlYWs7CisJCQljYXNlIEtFWTNfQ09ERToKKwkJCQlrZXljb2RlID0gZnVqaXRzdS0+a2V5Y29kZTM7CisJCQkJYnJlYWs7CisJCQljYXNlIEtFWTRfQ09ERToKKwkJCQlrZXljb2RlID0gZnVqaXRzdS0+a2V5Y29kZTQ7CisJCQkJYnJlYWs7CisJCQljYXNlIDA6CisJCQkJa2V5Y29kZSA9IDA7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCXZkYmdfcHJpbnRrKEZVSkxBUFRPUF9EQkdfV0FSTiwKKwkJCQkJICAgICJVbmtub3duIEdJUkIgcmVzdWx0IFsleF1cbiIsIGlyYik7CisJCQkJa2V5Y29kZSA9IC0xOworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKGtleWNvZGUgPiAwKSB7CisJCQkJdmRiZ19wcmludGsoRlVKTEFQVE9QX0RCR19UUkFDRSwKKwkJCQkJIlB1c2gga2V5Y29kZSBpbnRvIHJpbmdidWZmZXIgWyVkXVxuIiwKKwkJCQkJa2V5Y29kZSk7CisJCQkJc3RhdHVzID0ga2ZpZm9fcHV0KGZ1aml0c3VfaG90a2V5LT5maWZvLAorCQkJCQkJICAgKHVuc2lnbmVkIGNoYXIgKikma2V5Y29kZSwKKwkJCQkJCSAgIHNpemVvZihrZXljb2RlKSk7CisJCQkJaWYgKHN0YXR1cyAhPSBzaXplb2Yoa2V5Y29kZSkpIHsKKwkJCQkJdmRiZ19wcmludGsoRlVKTEFQVE9QX0RCR19XQVJOLAorCQkJCQkgICAgIkNvdWxkIG5vdCBwdXNoIGtleWNvZGUgWzB4JXhdXG4iLAorCQkJCQkgICAga2V5Y29kZSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJaW5wdXRfcmVwb3J0X2tleShpbnB1dCwga2V5Y29kZSwgMSk7CisJCQkJCWlucHV0X3N5bmMoaW5wdXQpOworCQkJCX0KKwkJCX0gZWxzZSBpZiAoa2V5Y29kZSA9PSAwKSB7CisJCQkJd2hpbGUgKChzdGF0dXMgPQorCQkJCQlrZmlmb19nZXQKKwkJCQkJKGZ1aml0c3VfaG90a2V5LT5maWZvLCAodW5zaWduZWQgY2hhciAqKQorCQkJCQkgJmtleWNvZGVfciwKKwkJCQkJIHNpemVvZgorCQkJCQkgKGtleWNvZGVfcikpKSA9PSBzaXplb2Yoa2V5Y29kZV9yKSkgeworCQkJCQlpbnB1dF9yZXBvcnRfa2V5KGlucHV0LCBrZXljb2RlX3IsIDApOworCQkJCQlpbnB1dF9zeW5jKGlucHV0KTsKKwkJCQkJdmRiZ19wcmludGsoRlVKTEFQVE9QX0RCR19UUkFDRSwKKwkJCQkJICAiUG9wIGtleWNvZGUgZnJvbSByaW5nYnVmZmVyIFslZF1cbiIsCisJCQkJCSAga2V5Y29kZV9yKTsKKwkJCQl9CisJCQl9CisJCX0KKworCQlicmVhazsKKwlkZWZhdWx0OgorCQlrZXljb2RlID0gS0VZX1VOS05PV047CisJCXZkYmdfcHJpbnRrKEZVSkxBUFRPUF9EQkdfV0FSTiwKKwkJCSAgICAiVW5zdXBwb3J0ZWQgZXZlbnQgWzB4JXhdXG4iLCBldmVudCk7CisJCWlucHV0X3JlcG9ydF9rZXkoaW5wdXQsIGtleWNvZGUsIDEpOworCQlpbnB1dF9zeW5jKGlucHV0KTsKKwkJaW5wdXRfcmVwb3J0X2tleShpbnB1dCwga2V5Y29kZSwgMCk7CisJCWlucHV0X3N5bmMoaW5wdXQpOworCQlicmVhazsKKwl9CisKKwlyZXR1cm47Cit9CisKKy8qIEluaXRpYWxpemF0aW9uICovCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYWNwaV9kZXZpY2VfaWQgZnVqaXRzdV9kZXZpY2VfaWRzW10gPSB7CisJe0FDUElfRlVKSVRTVV9ISUQsIDB9LAorCXsiIiwgMH0sCit9OworCitzdGF0aWMgc3RydWN0IGFjcGlfZHJpdmVyIGFjcGlfZnVqaXRzdV9kcml2ZXIgPSB7CisJLm5hbWUgPSBBQ1BJX0ZVSklUU1VfRFJJVkVSX05BTUUsCisJLmNsYXNzID0gQUNQSV9GVUpJVFNVX0NMQVNTLAorCS5pZHMgPSBmdWppdHN1X2RldmljZV9pZHMsCisJLm9wcyA9IHsKKwkJLmFkZCA9IGFjcGlfZnVqaXRzdV9hZGQsCisJCS5yZW1vdmUgPSBhY3BpX2Z1aml0c3VfcmVtb3ZlLAorCQl9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBhY3BpX2RldmljZV9pZCBmdWppdHN1X2hvdGtleV9kZXZpY2VfaWRzW10gPSB7CisJe0FDUElfRlVKSVRTVV9IT1RLRVlfSElELCAwfSwKKwl7IiIsIDB9LAorfTsKKworc3RhdGljIHN0cnVjdCBhY3BpX2RyaXZlciBhY3BpX2Z1aml0c3VfaG90a2V5X2RyaXZlciA9IHsKKwkubmFtZSA9IEFDUElfRlVKSVRTVV9IT1RLRVlfRFJJVkVSX05BTUUsCisJLmNsYXNzID0gQUNQSV9GVUpJVFNVX0NMQVNTLAorCS5pZHMgPSBmdWppdHN1X2hvdGtleV9kZXZpY2VfaWRzLAorCS5vcHMgPSB7CisJCS5hZGQgPSBhY3BpX2Z1aml0c3VfaG90a2V5X2FkZCwKKwkJLnJlbW92ZSA9IGFjcGlfZnVqaXRzdV9ob3RrZXlfcmVtb3ZlLAorCQl9LAorfTsKKworc3RhdGljIGludCBfX2luaXQgZnVqaXRzdV9pbml0KHZvaWQpCit7CisJaW50IHJldCwgcmVzdWx0LCBtYXhfYnJpZ2h0bmVzczsKKworCWlmIChhY3BpX2Rpc2FibGVkKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWZ1aml0c3UgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgZnVqaXRzdV90KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFmdWppdHN1KQorCQlyZXR1cm4gLUVOT01FTTsKKwltZW1zZXQoZnVqaXRzdSwgMCwgc2l6ZW9mKHN0cnVjdCBmdWppdHN1X3QpKTsKKwlmdWppdHN1LT5rZXljb2RlMSA9IEtFWV9QUk9HMTsKKwlmdWppdHN1LT5rZXljb2RlMiA9IEtFWV9QUk9HMjsKKwlmdWppdHN1LT5rZXljb2RlMyA9IEtFWV9QUk9HMzsKKwlmdWppdHN1LT5rZXljb2RlNCA9IEtFWV9QUk9HNDsKKwlkbWlfY2hlY2tfc3lzdGVtKGZ1aml0c3VfZG1pX3RhYmxlKTsKKworCXJlc3VsdCA9IGFjcGlfYnVzX3JlZ2lzdGVyX2RyaXZlcigmYWNwaV9mdWppdHN1X2RyaXZlcik7CisJaWYgKHJlc3VsdCA8IDApIHsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBmYWlsX2FjcGk7CisJfQorCisJLyogUmVnaXN0ZXIgcGxhdGZvcm0gc3R1ZmYgKi8KKworCWZ1aml0c3UtPnBmX2RldmljZSA9IHBsYXRmb3JtX2RldmljZV9hbGxvYygiZnVqaXRzdS1sYXB0b3AiLCAtMSk7CisJaWYgKCFmdWppdHN1LT5wZl9kZXZpY2UpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBmYWlsX3BsYXRmb3JtX2RyaXZlcjsKKwl9CisKKwlyZXQgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkKGZ1aml0c3UtPnBmX2RldmljZSk7CisJaWYgKHJldCkKKwkJZ290byBmYWlsX3BsYXRmb3JtX2RldmljZTE7CisKKwlyZXQgPQorCSAgICBzeXNmc19jcmVhdGVfZ3JvdXAoJmZ1aml0c3UtPnBmX2RldmljZS0+ZGV2LmtvYmosCisJCQkgICAgICAgJmZ1aml0c3VwZl9hdHRyaWJ1dGVfZ3JvdXApOworCWlmIChyZXQpCisJCWdvdG8gZmFpbF9wbGF0Zm9ybV9kZXZpY2UyOworCisJLyogUmVnaXN0ZXIgYmFja2xpZ2h0IHN0dWZmICovCisKKwlpZiAoIWFjcGlfdmlkZW9fYmFja2xpZ2h0X3N1cHBvcnQoKSkgeworCQlmdWppdHN1LT5ibF9kZXZpY2UgPQorCQkJYmFja2xpZ2h0X2RldmljZV9yZWdpc3RlcigiZnVqaXRzdS1sYXB0b3AiLCBOVUxMLCBOVUxMLAorCQkJCQkJICAmZnVqaXRzdWJsX29wcyk7CisJCWlmIChJU19FUlIoZnVqaXRzdS0+YmxfZGV2aWNlKSkKKwkJCXJldHVybiBQVFJfRVJSKGZ1aml0c3UtPmJsX2RldmljZSk7CisJCW1heF9icmlnaHRuZXNzID0gZnVqaXRzdS0+bWF4X2JyaWdodG5lc3M7CisJCWZ1aml0c3UtPmJsX2RldmljZS0+cHJvcHMubWF4X2JyaWdodG5lc3MgPSBtYXhfYnJpZ2h0bmVzcyAtIDE7CisJCWZ1aml0c3UtPmJsX2RldmljZS0+cHJvcHMuYnJpZ2h0bmVzcyA9IGZ1aml0c3UtPmJyaWdodG5lc3NfbGV2ZWw7CisJfQorCisJcmV0ID0gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZmdWppdHN1cGZfZHJpdmVyKTsKKwlpZiAocmV0KQorCQlnb3RvIGZhaWxfYmFja2xpZ2h0OworCisJLyogUmVnaXN0ZXIgaG90a2V5IGRyaXZlciAqLworCisJZnVqaXRzdV9ob3RrZXkgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgZnVqaXRzdV9ob3RrZXlfdCksIEdGUF9LRVJORUwpOworCWlmICghZnVqaXRzdV9ob3RrZXkpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBmYWlsX2hvdGtleTsKKwl9CisJbWVtc2V0KGZ1aml0c3VfaG90a2V5LCAwLCBzaXplb2Yoc3RydWN0IGZ1aml0c3VfaG90a2V5X3QpKTsKKworCXJlc3VsdCA9IGFjcGlfYnVzX3JlZ2lzdGVyX2RyaXZlcigmYWNwaV9mdWppdHN1X2hvdGtleV9kcml2ZXIpOworCWlmIChyZXN1bHQgPCAwKSB7CisJCXJldCA9IC1FTk9ERVY7CisJCWdvdG8gZmFpbF9ob3RrZXkxOworCX0KKworCS8qIFN5bmMgYmFja2xpZ2h0IHBvd2VyIHN0YXR1cyAobmVlZHMgRlVKMDJFMyBkZXZpY2UsIGhlbmNlIGRlZmVycmVkKSAqLworCisJaWYgKCFhY3BpX3ZpZGVvX2JhY2tsaWdodF9zdXBwb3J0KCkpIHsKKwkJaWYgKGNhbGxfZmV4dF9mdW5jKEZVTkNfQkFDS0xJR0hULCAweDIsIDB4NCwgMHgwKSA9PSAzKQorCQkJZnVqaXRzdS0+YmxfZGV2aWNlLT5wcm9wcy5wb3dlciA9IDQ7CisJCWVsc2UKKwkJCWZ1aml0c3UtPmJsX2RldmljZS0+cHJvcHMucG93ZXIgPSAwOworCX0KKworCXByaW50ayhLRVJOX0lORk8gImZ1aml0c3UtbGFwdG9wOiBkcml2ZXIgIiBGVUpJVFNVX0RSSVZFUl9WRVJTSU9OCisJICAgICAgICIgc3VjY2Vzc2Z1bGx5IGxvYWRlZC5cbiIpOworCisJcmV0dXJuIDA7CisKK2ZhaWxfaG90a2V5MToKKworCWtmcmVlKGZ1aml0c3VfaG90a2V5KTsKKworZmFpbF9ob3RrZXk6CisKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmZnVqaXRzdXBmX2RyaXZlcik7CisKK2ZhaWxfYmFja2xpZ2h0OgorCisJaWYgKGZ1aml0c3UtPmJsX2RldmljZSkKKwkJYmFja2xpZ2h0X2RldmljZV91bnJlZ2lzdGVyKGZ1aml0c3UtPmJsX2RldmljZSk7CisKK2ZhaWxfcGxhdGZvcm1fZGV2aWNlMjoKKworCXBsYXRmb3JtX2RldmljZV9kZWwoZnVqaXRzdS0+cGZfZGV2aWNlKTsKKworZmFpbF9wbGF0Zm9ybV9kZXZpY2UxOgorCisJcGxhdGZvcm1fZGV2aWNlX3B1dChmdWppdHN1LT5wZl9kZXZpY2UpOworCitmYWlsX3BsYXRmb3JtX2RyaXZlcjoKKworCWFjcGlfYnVzX3VucmVnaXN0ZXJfZHJpdmVyKCZhY3BpX2Z1aml0c3VfZHJpdmVyKTsKKworZmFpbF9hY3BpOgorCisJa2ZyZWUoZnVqaXRzdSk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZnVqaXRzdV9jbGVhbnVwKHZvaWQpCit7CisJI2lmZGVmIENPTkZJR19MRURTX0NMQVNTCisJaWYgKGZ1aml0c3VfaG90a2V5LT5sb2dvbGFtcF9yZWdpc3RlcmVkICE9IDApCisJCWxlZF9jbGFzc2Rldl91bnJlZ2lzdGVyKCZsb2dvbGFtcF9sZWQpOworCisJaWYgKGZ1aml0c3VfaG90a2V5LT5rYmxhbXBzX3JlZ2lzdGVyZWQgIT0gMCkKKwkJbGVkX2NsYXNzZGV2X3VucmVnaXN0ZXIoJmtibGFtcHNfbGVkKTsKKwkjZW5kaWYKKworCXN5c2ZzX3JlbW92ZV9ncm91cCgmZnVqaXRzdS0+cGZfZGV2aWNlLT5kZXYua29iaiwKKwkJCSAgICZmdWppdHN1cGZfYXR0cmlidXRlX2dyb3VwKTsKKwlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlcihmdWppdHN1LT5wZl9kZXZpY2UpOworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZmdWppdHN1cGZfZHJpdmVyKTsKKwlpZiAoZnVqaXRzdS0+YmxfZGV2aWNlKQorCQliYWNrbGlnaHRfZGV2aWNlX3VucmVnaXN0ZXIoZnVqaXRzdS0+YmxfZGV2aWNlKTsKKworCWFjcGlfYnVzX3VucmVnaXN0ZXJfZHJpdmVyKCZhY3BpX2Z1aml0c3VfZHJpdmVyKTsKKworCWtmcmVlKGZ1aml0c3UpOworCisJYWNwaV9idXNfdW5yZWdpc3Rlcl9kcml2ZXIoJmFjcGlfZnVqaXRzdV9ob3RrZXlfZHJpdmVyKTsKKworCWtmcmVlKGZ1aml0c3VfaG90a2V5KTsKKworCXByaW50ayhLRVJOX0lORk8gImZ1aml0c3UtbGFwdG9wOiBkcml2ZXIgdW5sb2FkZWQuXG4iKTsKK30KKworbW9kdWxlX2luaXQoZnVqaXRzdV9pbml0KTsKK21vZHVsZV9leGl0KGZ1aml0c3VfY2xlYW51cCk7CisKK21vZHVsZV9wYXJhbSh1c2VfYWx0X2xjZF9sZXZlbHMsIHVpbnQsIDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyh1c2VfYWx0X2xjZF9sZXZlbHMsCisJCSAiVXNlIGFsdGVybmF0aXZlIGludGVyZmFjZSBmb3IgbGNkX2xldmVscyAobmVlZGVkIGZvciBMaWZlYm9vayBzNjQxMCkuIik7Cittb2R1bGVfcGFyYW0oZGlzYWJsZV9icmlnaHRuZXNzX2FkanVzdCwgdWludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGRpc2FibGVfYnJpZ2h0bmVzc19hZGp1c3QsICJEaXNhYmxlIGJyaWdodG5lc3MgYWRqdXN0bWVudCAuIik7CisjaWZkZWYgQ09ORklHX0ZVSklUU1VfTEFQVE9QX0RFQlVHCittb2R1bGVfcGFyYW1fbmFtZWQoZGVidWcsIGRiZ19sZXZlbCwgdWludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAiU2V0cyBkZWJ1ZyBsZXZlbCBiaXQtbWFzayIpOworI2VuZGlmCisKK01PRFVMRV9BVVRIT1IoIkpvbmF0aGFuIFdvaXRoZSwgUGV0ZXIgR3J1YmVyLCBUb255IFZyb29uIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkZ1aml0c3UgbGFwdG9wIGV4dHJhcyBzdXBwb3J0Iik7CitNT0RVTEVfVkVSU0lPTihGVUpJVFNVX0RSSVZFUl9WRVJTSU9OKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworTU9EVUxFX0FMSUFTKCJkbWk6Kjpzdm5GVUpJVFNVU0lFTUVOUzoqOnB2cjpydm5GVUpJVFNVOnJuRkpOQjFEMzoqOmN2clM2NDEwOioiKTsKK01PRFVMRV9BTElBUygiZG1pOio6c3ZuRlVKSVRTVVNJRU1FTlM6KjpwdnI6cnZuRlVKSVRTVTpybkZKTkIxRTY6KjpjdnJTNjQyMDoqIik7CitNT0RVTEVfQUxJQVMoImRtaToqOnN2bkZVSklUU1U6KjpwdnI6cnZuRlVKSVRTVTpybkZKTkIxOUM6KjpjdnJTNzAyMDoqIik7CisKK3N0YXRpYyBzdHJ1Y3QgcG5wX2RldmljZV9pZCBwbnBfaWRzW10gPSB7CisJey5pZCA9ICJGVUowMmJmIn0sCisJey5pZCA9ICJGVUowMkIxIn0sCisJey5pZCA9ICJGVUowMkUzIn0sCisJey5pZCA9ICIifQorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShwbnAsIHBucF9pZHMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wbGF0Zm9ybS94ODYvaHAtd21pLmMgYi9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9ocC13bWkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Yzc4OWYwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9wbGF0Zm9ybS94ODYvaHAtd21pLmMKQEAgLTAsMCArMSw1MjEgQEAKKy8qCisgKiBIUCBXTUkgaG90a2V5cworICoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBSZWQgSGF0IDxtamdAcmVkaGF0LmNvbT4KKyAqCisgKiBQb3J0aW9ucyBiYXNlZCBvbiB3aXN0cm9uX2J0bnMuYzoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBNaWxvc2xhdiBUcm1hYyA8bWl0ckB2b2xueS5jej4KKyAqIENvcHlyaWdodCAoQykgMjAwNSBCZXJuaGFyZCBSb3NlbmtyYWVuemVyIDxiZXJvQGFya2xpbnV4Lm9yZz4KKyAqIENvcHlyaWdodCAoQykgMjAwNSBEbWl0cnkgVG9yb2tob3YgPGR0b3JAbWFpbC5ydT4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KKyNpbmNsdWRlIDxhY3BpL2FjcGlfZHJpdmVycy5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9yZmtpbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKworTU9EVUxFX0FVVEhPUigiTWF0dGhldyBHYXJyZXR0IDxtamc1OUBzcmNmLnVjYW0ub3JnPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJIUCBsYXB0b3AgV01JIGhvdGtleXMgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK01PRFVMRV9BTElBUygid21pOjk1RjI0Mjc5LTREN0ItNDMzNC05Mzg3LUFDQ0RDNjdFRjYxQyIpOworTU9EVUxFX0FMSUFTKCJ3bWk6NUZCN0YwMzQtMkM2My00NWU5LUJFOTEtM0Q0NEUyQzcwN0U0Iik7CisKKyNkZWZpbmUgSFBXTUlfRVZFTlRfR1VJRCAiOTVGMjQyNzktNEQ3Qi00MzM0LTkzODctQUNDREM2N0VGNjFDIgorI2RlZmluZSBIUFdNSV9CSU9TX0dVSUQgIjVGQjdGMDM0LTJDNjMtNDVlOS1CRTkxLTNENDRFMkM3MDdFNCIKKworI2RlZmluZSBIUFdNSV9ESVNQTEFZX1FVRVJZIDB4MQorI2RlZmluZSBIUFdNSV9IRERURU1QX1FVRVJZIDB4MgorI2RlZmluZSBIUFdNSV9BTFNfUVVFUlkgMHgzCisjZGVmaW5lIEhQV01JX0RPQ0tfUVVFUlkgMHg0CisjZGVmaW5lIEhQV01JX1dJUkVMRVNTX1FVRVJZIDB4NQorI2RlZmluZSBIUFdNSV9IT1RLRVlfUVVFUlkgMHhjCisKK3N0YXRpYyBpbnQgX19pbml0IGhwX3dtaV9iaW9zX3NldHVwKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldmljZSk7CitzdGF0aWMgaW50IF9fZXhpdCBocF93bWlfYmlvc19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2aWNlKTsKKworc3RydWN0IGJpb3NfYXJncyB7CisJdTMyIHNpZ25hdHVyZTsKKwl1MzIgY29tbWFuZDsKKwl1MzIgY29tbWFuZHR5cGU7CisJdTMyIGRhdGFzaXplOworCXUzMiBkYXRhOworfTsKKworc3RydWN0IGJpb3NfcmV0dXJuIHsKKwl1MzIgc2lncGFzczsKKwl1MzIgcmV0dXJuX2NvZGU7CisJdTMyIHZhbHVlOworfTsKKworc3RydWN0IGtleV9lbnRyeSB7CisJY2hhciB0eXBlOwkJLyogU2VlIEtFXyogYmVsb3cgKi8KKwl1MTYgY29kZTsKKwl1MTYga2V5Y29kZTsKK307CisKK2VudW0geyBLRV9LRVksIEtFX1NXLCBLRV9FTkQgfTsKKworc3RhdGljIHN0cnVjdCBrZXlfZW50cnkgaHBfd21pX2tleW1hcFtdID0geworCXtLRV9TVywgMHgwMSwgU1dfRE9DS30sCisJe0tFX0tFWSwgMHgwMiwgS0VZX0JSSUdIVE5FU1NVUH0sCisJe0tFX0tFWSwgMHgwMywgS0VZX0JSSUdIVE5FU1NET1dOfSwKKwl7S0VfS0VZLCAweDIwZTYsIEtFWV9QUk9HMX0sCisJe0tFX0tFWSwgMHgyMTQyLCBLRVlfTUVESUF9LAorCXtLRV9LRVksIDB4MjEzYiwgS0VZX0lORk99LAorCXtLRV9LRVksIDB4MjMxYiwgS0VZX0hFTFB9LAorCXtLRV9FTkQsIDB9Cit9OworCitzdGF0aWMgc3RydWN0IGlucHV0X2RldiAqaHBfd21pX2lucHV0X2RldjsKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpocF93bWlfcGxhdGZvcm1fZGV2OworCitzdGF0aWMgc3RydWN0IHJma2lsbCAqd2lmaV9yZmtpbGw7CitzdGF0aWMgc3RydWN0IHJma2lsbCAqYmx1ZXRvb3RoX3Jma2lsbDsKK3N0YXRpYyBzdHJ1Y3QgcmZraWxsICp3d2FuX3Jma2lsbDsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgaHBfd21pX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkgICAubmFtZSA9ICJocC13bWkiLAorCQkgICAub3duZXIgPSBUSElTX01PRFVMRSwKKwl9LAorCS5wcm9iZSA9IGhwX3dtaV9iaW9zX3NldHVwLAorCS5yZW1vdmUgPSBocF93bWlfYmlvc19yZW1vdmUsCit9OworCitzdGF0aWMgaW50IGhwX3dtaV9wZXJmb3JtX3F1ZXJ5KGludCBxdWVyeSwgaW50IHdyaXRlLCBpbnQgdmFsdWUpCit7CisJc3RydWN0IGJpb3NfcmV0dXJuIGJpb3NfcmV0dXJuOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwl1bmlvbiBhY3BpX29iamVjdCAqb2JqOworCXN0cnVjdCBiaW9zX2FyZ3MgYXJncyA9IHsKKwkJLnNpZ25hdHVyZSA9IDB4NTU0MzQ1NTMsCisJCS5jb21tYW5kID0gd3JpdGUgPyAweDIgOiAweDEsCisJCS5jb21tYW5kdHlwZSA9IHF1ZXJ5LAorCQkuZGF0YXNpemUgPSB3cml0ZSA/IDB4NCA6IDAsCisJCS5kYXRhID0gdmFsdWUsCisJfTsKKwlzdHJ1Y3QgYWNwaV9idWZmZXIgaW5wdXQgPSB7IHNpemVvZihzdHJ1Y3QgYmlvc19hcmdzKSwgJmFyZ3MgfTsKKwlzdHJ1Y3QgYWNwaV9idWZmZXIgb3V0cHV0ID0geyBBQ1BJX0FMTE9DQVRFX0JVRkZFUiwgTlVMTCB9OworCisJc3RhdHVzID0gd21pX2V2YWx1YXRlX21ldGhvZChIUFdNSV9CSU9TX0dVSUQsIDAsIDB4MywgJmlucHV0LCAmb3V0cHV0KTsKKworCW9iaiA9IG91dHB1dC5wb2ludGVyOworCisJaWYgKCFvYmogfHwgb2JqLT50eXBlICE9IEFDUElfVFlQRV9CVUZGRVIpCisJCXJldHVybiAtRUlOVkFMOworCisJYmlvc19yZXR1cm4gPSAqKChzdHJ1Y3QgYmlvc19yZXR1cm4gKilvYmotPmJ1ZmZlci5wb2ludGVyKTsKKwlpZiAoYmlvc19yZXR1cm4ucmV0dXJuX2NvZGUgPiAwKQorCQlyZXR1cm4gYmlvc19yZXR1cm4ucmV0dXJuX2NvZGUgKiAtMTsKKwllbHNlCisJCXJldHVybiBiaW9zX3JldHVybi52YWx1ZTsKK30KKworc3RhdGljIGludCBocF93bWlfZGlzcGxheV9zdGF0ZSh2b2lkKQoreworCXJldHVybiBocF93bWlfcGVyZm9ybV9xdWVyeShIUFdNSV9ESVNQTEFZX1FVRVJZLCAwLCAwKTsKK30KKworc3RhdGljIGludCBocF93bWlfaGRkdGVtcF9zdGF0ZSh2b2lkKQoreworCXJldHVybiBocF93bWlfcGVyZm9ybV9xdWVyeShIUFdNSV9IRERURU1QX1FVRVJZLCAwLCAwKTsKK30KKworc3RhdGljIGludCBocF93bWlfYWxzX3N0YXRlKHZvaWQpCit7CisJcmV0dXJuIGhwX3dtaV9wZXJmb3JtX3F1ZXJ5KEhQV01JX0FMU19RVUVSWSwgMCwgMCk7Cit9CisKK3N0YXRpYyBpbnQgaHBfd21pX2RvY2tfc3RhdGUodm9pZCkKK3sKKwlyZXR1cm4gaHBfd21pX3BlcmZvcm1fcXVlcnkoSFBXTUlfRE9DS19RVUVSWSwgMCwgMCk7Cit9CisKK3N0YXRpYyBpbnQgaHBfd21pX3dpZmlfc2V0KHZvaWQgKmRhdGEsIGVudW0gcmZraWxsX3N0YXRlIHN0YXRlKQoreworCWlmIChzdGF0ZSkKKwkJcmV0dXJuIGhwX3dtaV9wZXJmb3JtX3F1ZXJ5KEhQV01JX1dJUkVMRVNTX1FVRVJZLCAxLCAweDEwMSk7CisJZWxzZQorCQlyZXR1cm4gaHBfd21pX3BlcmZvcm1fcXVlcnkoSFBXTUlfV0lSRUxFU1NfUVVFUlksIDEsIDB4MTAwKTsKK30KKworc3RhdGljIGludCBocF93bWlfYmx1ZXRvb3RoX3NldCh2b2lkICpkYXRhLCBlbnVtIHJma2lsbF9zdGF0ZSBzdGF0ZSkKK3sKKwlpZiAoc3RhdGUpCisJCXJldHVybiBocF93bWlfcGVyZm9ybV9xdWVyeShIUFdNSV9XSVJFTEVTU19RVUVSWSwgMSwgMHgyMDIpOworCWVsc2UKKwkJcmV0dXJuIGhwX3dtaV9wZXJmb3JtX3F1ZXJ5KEhQV01JX1dJUkVMRVNTX1FVRVJZLCAxLCAweDIwMCk7Cit9CisKK3N0YXRpYyBpbnQgaHBfd21pX3d3YW5fc2V0KHZvaWQgKmRhdGEsIGVudW0gcmZraWxsX3N0YXRlIHN0YXRlKQoreworCWlmIChzdGF0ZSkKKwkJcmV0dXJuIGhwX3dtaV9wZXJmb3JtX3F1ZXJ5KEhQV01JX1dJUkVMRVNTX1FVRVJZLCAxLCAweDQwNCk7CisJZWxzZQorCQlyZXR1cm4gaHBfd21pX3BlcmZvcm1fcXVlcnkoSFBXTUlfV0lSRUxFU1NfUVVFUlksIDEsIDB4NDAwKTsKK30KKworc3RhdGljIGludCBocF93bWlfd2lmaV9zdGF0ZSh2b2lkKQoreworCWludCB3aXJlbGVzcyA9IGhwX3dtaV9wZXJmb3JtX3F1ZXJ5KEhQV01JX1dJUkVMRVNTX1FVRVJZLCAwLCAwKTsKKworCWlmICh3aXJlbGVzcyAmIDB4MTAwKQorCQlyZXR1cm4gUkZLSUxMX1NUQVRFX1VOQkxPQ0tFRDsKKwllbHNlCisJCXJldHVybiBSRktJTExfU1RBVEVfU09GVF9CTE9DS0VEOworfQorCitzdGF0aWMgaW50IGhwX3dtaV9ibHVldG9vdGhfc3RhdGUodm9pZCkKK3sKKwlpbnQgd2lyZWxlc3MgPSBocF93bWlfcGVyZm9ybV9xdWVyeShIUFdNSV9XSVJFTEVTU19RVUVSWSwgMCwgMCk7CisKKwlpZiAod2lyZWxlc3MgJiAweDEwMDAwKQorCQlyZXR1cm4gUkZLSUxMX1NUQVRFX1VOQkxPQ0tFRDsKKwllbHNlCisJCXJldHVybiBSRktJTExfU1RBVEVfU09GVF9CTE9DS0VEOworfQorCitzdGF0aWMgaW50IGhwX3dtaV93d2FuX3N0YXRlKHZvaWQpCit7CisJaW50IHdpcmVsZXNzID0gaHBfd21pX3BlcmZvcm1fcXVlcnkoSFBXTUlfV0lSRUxFU1NfUVVFUlksIDAsIDApOworCisJaWYgKHdpcmVsZXNzICYgMHgxMDAwMDAwKQorCQlyZXR1cm4gUkZLSUxMX1NUQVRFX1VOQkxPQ0tFRDsKKwllbHNlCisJCXJldHVybiBSRktJTExfU1RBVEVfU09GVF9CTE9DS0VEOworfQorCitzdGF0aWMgc3NpemVfdCBzaG93X2Rpc3BsYXkoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgICBjaGFyICpidWYpCit7CisJaW50IHZhbHVlID0gaHBfd21pX2Rpc3BsYXlfc3RhdGUoKTsKKwlpZiAodmFsdWUgPCAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgdmFsdWUpOworfQorCitzdGF0aWMgc3NpemVfdCBzaG93X2hkZHRlbXAoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgICBjaGFyICpidWYpCit7CisJaW50IHZhbHVlID0gaHBfd21pX2hkZHRlbXBfc3RhdGUoKTsKKwlpZiAodmFsdWUgPCAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgdmFsdWUpOworfQorCitzdGF0aWMgc3NpemVfdCBzaG93X2FscyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJY2hhciAqYnVmKQoreworCWludCB2YWx1ZSA9IGhwX3dtaV9hbHNfc3RhdGUoKTsKKwlpZiAodmFsdWUgPCAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgdmFsdWUpOworfQorCitzdGF0aWMgc3NpemVfdCBzaG93X2RvY2soc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSBjaGFyICpidWYpCit7CisJaW50IHZhbHVlID0gaHBfd21pX2RvY2tfc3RhdGUoKTsKKwlpZiAodmFsdWUgPCAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgdmFsdWUpOworfQorCitzdGF0aWMgc3NpemVfdCBzZXRfYWxzKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCSAgICAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwl1MzIgdG1wID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCk7CisJaHBfd21pX3BlcmZvcm1fcXVlcnkoSFBXTUlfQUxTX1FVRVJZLCAxLCB0bXApOworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIERFVklDRV9BVFRSKGRpc3BsYXksIFNfSVJVR08sIHNob3dfZGlzcGxheSwgTlVMTCk7CitzdGF0aWMgREVWSUNFX0FUVFIoaGRkdGVtcCwgU19JUlVHTywgc2hvd19oZGR0ZW1wLCBOVUxMKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihhbHMsIFNfSVJVR08gfCBTX0lXVVNSLCBzaG93X2Fscywgc2V0X2Fscyk7CitzdGF0aWMgREVWSUNFX0FUVFIoZG9jaywgU19JUlVHTywgc2hvd19kb2NrLCBOVUxMKTsKKworc3RhdGljIHN0cnVjdCBrZXlfZW50cnkgKmhwX3dtaV9nZXRfZW50cnlfYnlfc2NhbmNvZGUoaW50IGNvZGUpCit7CisJc3RydWN0IGtleV9lbnRyeSAqa2V5OworCisJZm9yIChrZXkgPSBocF93bWlfa2V5bWFwOyBrZXktPnR5cGUgIT0gS0VfRU5EOyBrZXkrKykKKwkJaWYgKGNvZGUgPT0ga2V5LT5jb2RlKQorCQkJcmV0dXJuIGtleTsKKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgc3RydWN0IGtleV9lbnRyeSAqaHBfd21pX2dldF9lbnRyeV9ieV9rZXljb2RlKGludCBrZXljb2RlKQoreworCXN0cnVjdCBrZXlfZW50cnkgKmtleTsKKworCWZvciAoa2V5ID0gaHBfd21pX2tleW1hcDsga2V5LT50eXBlICE9IEtFX0VORDsga2V5KyspCisJCWlmIChrZXktPnR5cGUgPT0gS0VfS0VZICYmIGtleWNvZGUgPT0ga2V5LT5rZXljb2RlKQorCQkJcmV0dXJuIGtleTsKKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50IGhwX3dtaV9nZXRrZXljb2RlKHN0cnVjdCBpbnB1dF9kZXYgKmRldiwgaW50IHNjYW5jb2RlLCBpbnQgKmtleWNvZGUpCit7CisJc3RydWN0IGtleV9lbnRyeSAqa2V5ID0gaHBfd21pX2dldF9lbnRyeV9ieV9zY2FuY29kZShzY2FuY29kZSk7CisKKwlpZiAoa2V5ICYmIGtleS0+dHlwZSA9PSBLRV9LRVkpIHsKKwkJKmtleWNvZGUgPSBrZXktPmtleWNvZGU7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgaW50IGhwX3dtaV9zZXRrZXljb2RlKHN0cnVjdCBpbnB1dF9kZXYgKmRldiwgaW50IHNjYW5jb2RlLCBpbnQga2V5Y29kZSkKK3sKKwlzdHJ1Y3Qga2V5X2VudHJ5ICprZXk7CisJaW50IG9sZF9rZXljb2RlOworCisJaWYgKGtleWNvZGUgPCAwIHx8IGtleWNvZGUgPiBLRVlfTUFYKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWtleSA9IGhwX3dtaV9nZXRfZW50cnlfYnlfc2NhbmNvZGUoc2NhbmNvZGUpOworCWlmIChrZXkgJiYga2V5LT50eXBlID09IEtFX0tFWSkgeworCQlvbGRfa2V5Y29kZSA9IGtleS0+a2V5Y29kZTsKKwkJa2V5LT5rZXljb2RlID0ga2V5Y29kZTsKKwkJc2V0X2JpdChrZXljb2RlLCBkZXYtPmtleWJpdCk7CisJCWlmICghaHBfd21pX2dldF9lbnRyeV9ieV9rZXljb2RlKG9sZF9rZXljb2RlKSkKKwkJCWNsZWFyX2JpdChvbGRfa2V5Y29kZSwgZGV2LT5rZXliaXQpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIHZvaWQgaHBfd21pX25vdGlmeSh1MzIgdmFsdWUsIHZvaWQgKmNvbnRleHQpCit7CisJc3RydWN0IGFjcGlfYnVmZmVyIHJlc3BvbnNlID0geyBBQ1BJX0FMTE9DQVRFX0JVRkZFUiwgTlVMTCB9OworCXN0YXRpYyBzdHJ1Y3Qga2V5X2VudHJ5ICprZXk7CisJdW5pb24gYWNwaV9vYmplY3QgKm9iajsKKworCXdtaV9nZXRfZXZlbnRfZGF0YSh2YWx1ZSwgJnJlc3BvbnNlKTsKKworCW9iaiA9ICh1bmlvbiBhY3BpX29iamVjdCAqKXJlc3BvbnNlLnBvaW50ZXI7CisKKwlpZiAob2JqICYmIG9iai0+dHlwZSA9PSBBQ1BJX1RZUEVfQlVGRkVSICYmIG9iai0+YnVmZmVyLmxlbmd0aCA9PSA4KSB7CisJCWludCBldmVudGNvZGUgPSAqKCh1OCAqKSBvYmotPmJ1ZmZlci5wb2ludGVyKTsKKwkJaWYgKGV2ZW50Y29kZSA9PSAweDQpCisJCQlldmVudGNvZGUgPSBocF93bWlfcGVyZm9ybV9xdWVyeShIUFdNSV9IT1RLRVlfUVVFUlksIDAsCisJCQkJCQkJIDApOworCQlrZXkgPSBocF93bWlfZ2V0X2VudHJ5X2J5X3NjYW5jb2RlKGV2ZW50Y29kZSk7CisJCWlmIChrZXkpIHsKKwkJCXN3aXRjaCAoa2V5LT50eXBlKSB7CisJCQljYXNlIEtFX0tFWToKKwkJCQlpbnB1dF9yZXBvcnRfa2V5KGhwX3dtaV9pbnB1dF9kZXYsCisJCQkJCQkga2V5LT5rZXljb2RlLCAxKTsKKwkJCQlpbnB1dF9zeW5jKGhwX3dtaV9pbnB1dF9kZXYpOworCQkJCWlucHV0X3JlcG9ydF9rZXkoaHBfd21pX2lucHV0X2RldiwKKwkJCQkJCSBrZXktPmtleWNvZGUsIDApOworCQkJCWlucHV0X3N5bmMoaHBfd21pX2lucHV0X2Rldik7CisJCQkJYnJlYWs7CisJCQljYXNlIEtFX1NXOgorCQkJCWlucHV0X3JlcG9ydF9zd2l0Y2goaHBfd21pX2lucHV0X2RldiwKKwkJCQkJCSAgICBrZXktPmtleWNvZGUsCisJCQkJCQkgICAgaHBfd21pX2RvY2tfc3RhdGUoKSk7CisJCQkJaW5wdXRfc3luYyhocF93bWlfaW5wdXRfZGV2KTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfSBlbHNlIGlmIChldmVudGNvZGUgPT0gMHg1KSB7CisJCQlpZiAod2lmaV9yZmtpbGwpCisJCQkJcmZraWxsX2ZvcmNlX3N0YXRlKHdpZmlfcmZraWxsLAorCQkJCQkJICAgaHBfd21pX3dpZmlfc3RhdGUoKSk7CisJCQlpZiAoYmx1ZXRvb3RoX3Jma2lsbCkKKwkJCQlyZmtpbGxfZm9yY2Vfc3RhdGUoYmx1ZXRvb3RoX3Jma2lsbCwKKwkJCQkJCSAgIGhwX3dtaV9ibHVldG9vdGhfc3RhdGUoKSk7CisJCQlpZiAod3dhbl9yZmtpbGwpCisJCQkJcmZraWxsX2ZvcmNlX3N0YXRlKHd3YW5fcmZraWxsLAorCQkJCQkJICAgaHBfd21pX3d3YW5fc3RhdGUoKSk7CisJCX0gZWxzZQorCQkJcHJpbnRrKEtFUk5fSU5GTyAiSFAgV01JOiBVbmtub3duIGtleSBwcmVzc2VkIC0gJXhcbiIsCisJCQkgICAgICAgZXZlbnRjb2RlKTsKKwl9IGVsc2UKKwkJcHJpbnRrKEtFUk5fSU5GTyAiSFAgV01JOiBVbmtub3duIHJlc3BvbnNlIHJlY2VpdmVkXG4iKTsKK30KKworc3RhdGljIGludCBfX2luaXQgaHBfd21pX2lucHV0X3NldHVwKHZvaWQpCit7CisJc3RydWN0IGtleV9lbnRyeSAqa2V5OworCWludCBlcnI7CisKKwlocF93bWlfaW5wdXRfZGV2ID0gaW5wdXRfYWxsb2NhdGVfZGV2aWNlKCk7CisKKwlocF93bWlfaW5wdXRfZGV2LT5uYW1lID0gIkhQIFdNSSBob3RrZXlzIjsKKwlocF93bWlfaW5wdXRfZGV2LT5waHlzID0gIndtaS9pbnB1dDAiOworCWhwX3dtaV9pbnB1dF9kZXYtPmlkLmJ1c3R5cGUgPSBCVVNfSE9TVDsKKwlocF93bWlfaW5wdXRfZGV2LT5nZXRrZXljb2RlID0gaHBfd21pX2dldGtleWNvZGU7CisJaHBfd21pX2lucHV0X2Rldi0+c2V0a2V5Y29kZSA9IGhwX3dtaV9zZXRrZXljb2RlOworCisJZm9yIChrZXkgPSBocF93bWlfa2V5bWFwOyBrZXktPnR5cGUgIT0gS0VfRU5EOyBrZXkrKykgeworCQlzd2l0Y2ggKGtleS0+dHlwZSkgeworCQljYXNlIEtFX0tFWToKKwkJCXNldF9iaXQoRVZfS0VZLCBocF93bWlfaW5wdXRfZGV2LT5ldmJpdCk7CisJCQlzZXRfYml0KGtleS0+a2V5Y29kZSwgaHBfd21pX2lucHV0X2Rldi0+a2V5Yml0KTsKKwkJCWJyZWFrOworCQljYXNlIEtFX1NXOgorCQkJc2V0X2JpdChFVl9TVywgaHBfd21pX2lucHV0X2Rldi0+ZXZiaXQpOworCQkJc2V0X2JpdChrZXktPmtleWNvZGUsIGhwX3dtaV9pbnB1dF9kZXYtPnN3Yml0KTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJZXJyID0gaW5wdXRfcmVnaXN0ZXJfZGV2aWNlKGhwX3dtaV9pbnB1dF9kZXYpOworCisJaWYgKGVycikgeworCQlpbnB1dF9mcmVlX2RldmljZShocF93bWlfaW5wdXRfZGV2KTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgY2xlYW51cF9zeXNmcyhzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXZpY2UpCit7CisJZGV2aWNlX3JlbW92ZV9maWxlKCZkZXZpY2UtPmRldiwgJmRldl9hdHRyX2Rpc3BsYXkpOworCWRldmljZV9yZW1vdmVfZmlsZSgmZGV2aWNlLT5kZXYsICZkZXZfYXR0cl9oZGR0ZW1wKTsKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoJmRldmljZS0+ZGV2LCAmZGV2X2F0dHJfYWxzKTsKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoJmRldmljZS0+ZGV2LCAmZGV2X2F0dHJfZG9jayk7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGhwX3dtaV9iaW9zX3NldHVwKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldmljZSkKK3sKKwlpbnQgZXJyOworCWludCB3aXJlbGVzcyA9IGhwX3dtaV9wZXJmb3JtX3F1ZXJ5KEhQV01JX1dJUkVMRVNTX1FVRVJZLCAwLCAwKTsKKworCWVyciA9IGRldmljZV9jcmVhdGVfZmlsZSgmZGV2aWNlLT5kZXYsICZkZXZfYXR0cl9kaXNwbGF5KTsKKwlpZiAoZXJyKQorCQlnb3RvIGFkZF9zeXNmc19lcnJvcjsKKwllcnIgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJmRldmljZS0+ZGV2LCAmZGV2X2F0dHJfaGRkdGVtcCk7CisJaWYgKGVycikKKwkJZ290byBhZGRfc3lzZnNfZXJyb3I7CisJZXJyID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZkZXZpY2UtPmRldiwgJmRldl9hdHRyX2Fscyk7CisJaWYgKGVycikKKwkJZ290byBhZGRfc3lzZnNfZXJyb3I7CisJZXJyID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZkZXZpY2UtPmRldiwgJmRldl9hdHRyX2RvY2spOworCWlmIChlcnIpCisJCWdvdG8gYWRkX3N5c2ZzX2Vycm9yOworCisJaWYgKHdpcmVsZXNzICYgMHgxKSB7CisJCXdpZmlfcmZraWxsID0gcmZraWxsX2FsbG9jYXRlKCZkZXZpY2UtPmRldiwgUkZLSUxMX1RZUEVfV0xBTik7CisJCXdpZmlfcmZraWxsLT5uYW1lID0gImhwLXdpZmkiOworCQl3aWZpX3Jma2lsbC0+c3RhdGUgPSBocF93bWlfd2lmaV9zdGF0ZSgpOworCQl3aWZpX3Jma2lsbC0+dG9nZ2xlX3JhZGlvID0gaHBfd21pX3dpZmlfc2V0OworCQl3aWZpX3Jma2lsbC0+dXNlcl9jbGFpbV91bnN1cHBvcnRlZCA9IDE7CisJCWVyciA9IHJma2lsbF9yZWdpc3Rlcih3aWZpX3Jma2lsbCk7CisJCWlmIChlcnIpCisJCQlnb3RvIGFkZF9zeXNmc19lcnJvcjsKKwl9CisKKwlpZiAod2lyZWxlc3MgJiAweDIpIHsKKwkJYmx1ZXRvb3RoX3Jma2lsbCA9IHJma2lsbF9hbGxvY2F0ZSgmZGV2aWNlLT5kZXYsCisJCQkJCQkgICBSRktJTExfVFlQRV9CTFVFVE9PVEgpOworCQlibHVldG9vdGhfcmZraWxsLT5uYW1lID0gImhwLWJsdWV0b290aCI7CisJCWJsdWV0b290aF9yZmtpbGwtPnN0YXRlID0gaHBfd21pX2JsdWV0b290aF9zdGF0ZSgpOworCQlibHVldG9vdGhfcmZraWxsLT50b2dnbGVfcmFkaW8gPSBocF93bWlfYmx1ZXRvb3RoX3NldDsKKwkJYmx1ZXRvb3RoX3Jma2lsbC0+dXNlcl9jbGFpbV91bnN1cHBvcnRlZCA9IDE7CisJCWVyciA9IHJma2lsbF9yZWdpc3RlcihibHVldG9vdGhfcmZraWxsKTsKKwkJCWdvdG8gcmVnaXN0ZXJfYmx1ZXRvb3RoX2Vycm9yOworCX0KKworCWlmICh3aXJlbGVzcyAmIDB4NCkgeworCQl3d2FuX3Jma2lsbCA9IHJma2lsbF9hbGxvY2F0ZSgmZGV2aWNlLT5kZXYsIFJGS0lMTF9UWVBFX1dXQU4pOworCQl3d2FuX3Jma2lsbC0+bmFtZSA9ICJocC13d2FuIjsKKwkJd3dhbl9yZmtpbGwtPnN0YXRlID0gaHBfd21pX3d3YW5fc3RhdGUoKTsKKwkJd3dhbl9yZmtpbGwtPnRvZ2dsZV9yYWRpbyA9IGhwX3dtaV93d2FuX3NldDsKKwkJd3dhbl9yZmtpbGwtPnVzZXJfY2xhaW1fdW5zdXBwb3J0ZWQgPSAxOworCQllcnIgPSByZmtpbGxfcmVnaXN0ZXIod3dhbl9yZmtpbGwpOworCQlpZiAoZXJyKQorCQkJZ290byByZWdpc3Rlcl93d2FuX2VycjsKKwl9CisKKwlyZXR1cm4gMDsKK3JlZ2lzdGVyX3d3YW5fZXJyOgorCXJma2lsbF91bnJlZ2lzdGVyKGJsdWV0b290aF9yZmtpbGwpOworcmVnaXN0ZXJfYmx1ZXRvb3RoX2Vycm9yOgorCXJma2lsbF91bnJlZ2lzdGVyKHdpZmlfcmZraWxsKTsKK2FkZF9zeXNmc19lcnJvcjoKKwljbGVhbnVwX3N5c2ZzKGRldmljZSk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBfX2V4aXQgaHBfd21pX2Jpb3NfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldmljZSkKK3sKKwljbGVhbnVwX3N5c2ZzKGRldmljZSk7CisKKwlpZiAod2lmaV9yZmtpbGwpCisJCXJma2lsbF91bnJlZ2lzdGVyKHdpZmlfcmZraWxsKTsKKwlpZiAoYmx1ZXRvb3RoX3Jma2lsbCkKKwkJcmZraWxsX3VucmVnaXN0ZXIoYmx1ZXRvb3RoX3Jma2lsbCk7CisJaWYgKHd3YW5fcmZraWxsKQorCQlyZmtpbGxfdW5yZWdpc3Rlcih3d2FuX3Jma2lsbCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2luaXQgaHBfd21pX2luaXQodm9pZCkKK3sKKwlpbnQgZXJyOworCisJaWYgKHdtaV9oYXNfZ3VpZChIUFdNSV9FVkVOVF9HVUlEKSkgeworCQllcnIgPSB3bWlfaW5zdGFsbF9ub3RpZnlfaGFuZGxlcihIUFdNSV9FVkVOVF9HVUlELAorCQkJCQkJIGhwX3dtaV9ub3RpZnksIE5VTEwpOworCQlpZiAoIWVycikKKwkJCWhwX3dtaV9pbnB1dF9zZXR1cCgpOworCX0KKworCWlmICh3bWlfaGFzX2d1aWQoSFBXTUlfQklPU19HVUlEKSkgeworCQllcnIgPSBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmhwX3dtaV9kcml2ZXIpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIDA7CisJCWhwX3dtaV9wbGF0Zm9ybV9kZXYgPSBwbGF0Zm9ybV9kZXZpY2VfYWxsb2MoImhwLXdtaSIsIC0xKTsKKwkJaWYgKCFocF93bWlfcGxhdGZvcm1fZGV2KSB7CisJCQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmaHBfd21pX2RyaXZlcik7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlwbGF0Zm9ybV9kZXZpY2VfYWRkKGhwX3dtaV9wbGF0Zm9ybV9kZXYpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgaHBfd21pX2V4aXQodm9pZCkKK3sKKwlpZiAod21pX2hhc19ndWlkKEhQV01JX0VWRU5UX0dVSUQpKSB7CisJCXdtaV9yZW1vdmVfbm90aWZ5X2hhbmRsZXIoSFBXTUlfRVZFTlRfR1VJRCk7CisJCWlucHV0X3VucmVnaXN0ZXJfZGV2aWNlKGhwX3dtaV9pbnB1dF9kZXYpOworCX0KKwlpZiAoaHBfd21pX3BsYXRmb3JtX2RldikgeworCQlwbGF0Zm9ybV9kZXZpY2VfZGVsKGhwX3dtaV9wbGF0Zm9ybV9kZXYpOworCQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmaHBfd21pX2RyaXZlcik7CisJfQorfQorCittb2R1bGVfaW5pdChocF93bWlfaW5pdCk7Cittb2R1bGVfZXhpdChocF93bWlfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvaW50ZWxfbWVubG93LmMgYi9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9pbnRlbF9tZW5sb3cuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9taXNjL2ludGVsX21lbmxvdy5jCnJlbmFtZSB0byBkcml2ZXJzL3BsYXRmb3JtL3g4Ni9pbnRlbF9tZW5sb3cuYwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL21zaS1sYXB0b3AuYyBiL2RyaXZlcnMvcGxhdGZvcm0veDg2L21zaS1sYXB0b3AuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9taXNjL21zaS1sYXB0b3AuYwpyZW5hbWUgdG8gZHJpdmVycy9wbGF0Zm9ybS94ODYvbXNpLWxhcHRvcC5jCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9wYW5hc29uaWMtbGFwdG9wLmMgYi9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9wYW5hc29uaWMtbGFwdG9wLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjMwZGIzNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvcGxhdGZvcm0veDg2L3BhbmFzb25pYy1sYXB0b3AuYwpAQCAtMCwwICsxLDc0NCBAQAorLyoKKyAqICBQYW5hc29uaWMgSG90S2V5IGFuZCBMQ0QgYnJpZ2h0bmVzcyBjb250cm9sIGRyaXZlcgorICogIChDKSAyMDA0IEhpcm9zaGkgTWl1cmEgPG1pdXJhQGRhLWNoYS5vcmc+CisgKiAgKEMpIDIwMDQgTlRUIERBVEEgSW50ZWxsaWxpbmsgQ28uIGh0dHA6Ly93d3cuaW50ZWxsaWxpbmsuY28uanAvCisgKiAgKEMpIFlPS09UQSBIaXJvc2hpIDx5b2tvdGEgKGF0KSBuZXRsYWIuIGlzLiB0c3VrdWJhLiBhYy4ganA+CisgKiAgKEMpIDIwMDQgRGF2aWQgQnJvbmF1Z2ggPGRicm9uYXVnaD4KKyAqICAoQykgMjAwNi0yMDA4IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKgorICogIGRlcml2ZWQgZnJvbSB0b3NoaWJhX2FjcGkuYywgQ29weXJpZ2h0IChDKSAyMDAyLTIwMDQgSm9obiBCZWxtb250ZQorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiAgcHVibGljc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyAgVVNBCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBDaGFuZ2VMb2c6CisgKglTZXAuMjMsIDIwMDgJSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqCQktdjAuOTUJcmVuYW1lIGRyaXZlciBmcm9tIGRyaXZlcnMvYWNwaS9wY2NfYWNwaS5jIHRvCisgKgkJCWRyaXZlcnMvbWlzYy9wYW5hc29uaWMtbGFwdG9wLmMKKyAqCisgKiAJSnVsLjA0LCAyMDA4CUhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKiAJCS12MC45NAlyZXBsYWNlIC9wcm9jIGludGVyZmFjZSB3aXRoIGRldmljZSBhdHRyaWJ1dGVzCisgKiAJCQlzdXBwb3J0IHtzZXQsZ2V0fWtleWNvZGUgb24gdGggaW5wdXQgZGV2aWNlCisgKgorICogICAgICBKdW4uMjcsIDIwMDgJSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqICAgICAgCS12MC45MgltZXJnZSB3aXRoIDIuNi4yNi1yYzYgaW5wdXQgQVBJIGNoYW5nZXMKKyAqICAgICAgCQlyZW1vdmUgYnJva2VuIDw9IDIuNi4xNSBrZXJuZWwgc3VwcG9ydAorICogICAgICAJCXJlc29sdmUgYWxsIGNvbXBpbGVyIHdhcm5pbmdzCisgKiAgICAgIAkJdmFyaW91cyBjb2Rpbmcgc3R5bGUgZml4ZXMgKGNoZWNrcGF0Y2gucGwpCisgKiAgICAgIAkJYWRkIHN1cHBvcnQgZm9yIGJhY2tsaWdodCBhcGkKKyAqICAgICAgCQltYWpvciBjb2RlIHJlc3RydWN0dXJpbmcKKyAqCisgKiAJRGFjLjI4LCAyMDA3CUhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKiAJCS12MC45MQltZXJnZSB3aXRoIDIuNi4yNC1yYzYgQUNQSSBjaGFuZ2VzCisgKgorICogCU5vdi4wNCwgMjAwNglIaXJvc2hpIE1pdXJhIDxtaXVyYUBkYS1jaGEub3JnPgorICogCQktdjAuOQlyZW1vdmUgd2FybmluZyBhYm91dCBzZWN0aW9uIHJlZmVyZW5jZS4KKyAqIAkJCXJlbW92ZSBhY3BpX29zX2ZyZWUKKyAqIAkJCWFkZCAvcHJvYy9hY3BpL3BjYy9icmlnaHRuZXNzIGludGVyZmFjZSBmb3IgSEFMIGFjY2VzcworICogCQkJbWVyZ2UgZGJyb25hdWdoJ3MgZW5oYW5jZW1lbnQKKyAqIAkJCUF1Zy4xNywgMjAwNCBEYXZpZCBCcm9uYXVnaCAoZGJyb25hdWdoKQorICogIAkJCQktIEFkZGVkIHNjcmVlbiBicmlnaHRuZXNzIHNldHRpbmcgaW50ZXJmYWNlCisgKgkJCQkgIFRoYW5rcyB0byBGcmVlQlNEIGNyZXcgKGFjcGlfcGFuYXNvbmljLmMpCisgKiAJCQkJICBmb3IgdGhlIGlkZWFzIEkgbmVlZGVkIHRvIGFjY29tcGxpc2ggaXQKKyAqCisgKglNYXkuMjksIDIwMDYJSGlyb3NoaSBNaXVyYSA8bWl1cmFAZGEtY2hhLm9yZz4KKyAqCQktdjAuOC40IGZvbGxvdyB0byBjaGFuZ2Uga2V5aW5wdXQgc3RydWN0dXJlCisgKgkJCXRoYW5rcyBGYWJpYW4gWWFtYWd1Y2hpIDxmYWJzQGNzLnR1LWJlcmxpbi5kZT4sCisgKgkJCUphY29iIEJvd2VyIDxqYWNvYi5ib3dlckBpYy5hYy51az4gYW5kCisgKgkJCUhpcm9zaGkgWW9rb3RhIGZvciBwcm92aWRpbmcgc29sdXRpb25zLgorICoKKyAqCU9jdC4wMiwgMjAwNAlIaXJvc2hpIE1pdXJhIDxtaXVyYUBkYS1jaGEub3JnPgorICoJCS12MC44LjIJbWVyZ2UgY29kZSBvZiBZT0tPVEEgSGlyb3NoaQorICoJCQkJCTx5b2tvdGFAbmV0bGFiLmlzLnRzdWt1YmEuYWMuanA+LgorICoJCQlBZGQgc3RpY2t5IGtleSBtb2RlIGludGVyZmFjZS4KKyAqCQkJUmVmYWN0b3JpbmcgYWNwaV9wY2NfZ2VuZXJhdGVfa2V5aW5wdXQoKS4KKyAqCisgKglTZXAuMTUsIDIwMDQJSGlyb3NoaSBNaXVyYSA8bWl1cmFAZGEtY2hhLm9yZz4KKyAqCQktdjAuOAlHZW5lcmF0ZSBrZXkgaW5wdXQgZXZlbnQgb24gaW5wdXQgc3Vic3lzdGVtLgorICoJCQlUaGlzIGlzIGJhc2VkIG9uIHlldCBhbm90aGVyIGRyaXZlciB3cml0dGVuIGJ5CisgKgkJCQkJCQlSeXV0YSBOYWthbmlzaGkuCisgKgorICoJU2VwLjEwLCAyMDA0CUhpcm9zaGkgTWl1cmEgPG1pdXJhQGRhLWNoYS5vcmc+CisgKgkJLXYwLjcJQ2hhbmdlIHByb2MgaW50ZXJmYWNlIGZ1bmN0aW9ucyB1c2luZyBzZXFfZmlsZQorICoJCQlmYWNpbGl0eSBhcyBzYW1lIGFzIG90aGVyIEFDUEkgZHJpdmVycy4KKyAqCisgKglBdWcuMjgsIDIwMDQJSGlyb3NoaSBNaXVyYSA8bWl1cmFAZGEtY2hhLm9yZz4KKyAqCQktdjAuNi40IEZpeCBhIHNpbGx5IGVycm9yIHdpdGggc3RhdHVzIGNoZWNraW5nCisgKgorICoJQXVnLjI1LCAyMDA0CUhpcm9zaGkgTWl1cmEgPG1pdXJhQGRhLWNoYS5vcmc+CisgKgkJLXYwLjYuMyByZXBsYWNlIHJlYWRfYWNwaV9pbnQgYnkgc3RhbmRhcmQgZnVuY3Rpb24KKyAqCQkJCQkJCWFjcGlfZXZhbHVhdGVfaW50ZWdlcgorICoJCQlzb21lIGNsZWFuIHVwIGFuZCBtYWtlIHNtYXJ0IGNvcHlyaWdodCBub3RpY2UuCisgKgkJCWZpeCByZXR1cm4gdmFsdWUgb2YgcGNjX2FjcGlfZ2V0X2tleSgpCisgKgkJCWZpeCBjaGVja2luZyByZXR1cm4gdmFsdWUgb2YgYWNwaV9idXNfcmVnaXN0ZXJfZHJpdmVyKCkKKyAqCisgKiAgICAgIEF1Zy4yMiwgMjAwNCAgICBEYXZpZCBCcm9uYXVnaCA8ZGJyb25hdWdoQGxpbnV4Ym94ZW4ub3JnPgorICogICAgICAgICAgICAgIC12MC42LjIgQWRkIGNoZWNrIG9uIEFDUEkgZGF0YSAobnVtX3NpZnIpCisgKiAgICAgICAgICAgICAgICAgICAgICBDb2Rpbmcgc3R5bGUgY2xlYW51cHMsIGJldHRlciBlcnJvciBtZXNzYWdlcy9oYW5kbGluZworICoJCQlGaXhlZCBhbiBvZmYtYnktb25lIGVycm9yIGluIG1lbW9yeSBhbGxvY2F0aW9uCisgKgorICogICAgICBBdWcuMjEsIDIwMDQgICAgRGF2aWQgQnJvbmF1Z2ggPGRicm9uYXVnaEBsaW51eGJveGVuLm9yZz4KKyAqICAgICAgICAgICAgICAtdjAuNi4xIEZpeCBhIHNpbGx5IGVycm9yIHdpdGggc3RhdHVzIGNoZWNraW5nCisgKgorICogICAgICBBdWcuMjAsIDIwMDQgICAgRGF2aWQgQnJvbmF1Z2ggPGRicm9uYXVnaEBsaW51eGJveGVuLm9yZz4KKyAqICAgICAgICAgICAgICAtIHYwLjYgIENvcnJlY3QgYnJpZ2h0bmVzcyBjb250cm9scyB0byByZWZsZWN0IHJlYWxpdHkKKyAqICAgICAgICAgICAgICAgICAgICAgIGJhc2VkIG9uIGluZm9ybWF0aW9uIGdsZWFuZWQgYnkgSGlyb3NoaSBNaXVyYQorICogICAgICAgICAgICAgICAgICAgICAgYW5kIGRpc2N1c3Npb25zIHdpdGggSGlyb3NoaSBNaXVyYQorICoKKyAqCUF1Zy4xMCwgMjAwNAlIaXJvc2hpIE1pdXJhIDxtaXVyYUBkYS1jaGEub3JnPgorICoJCS0gdjAuNSAgc3VwcG9ydCBMQ0QgYnJpZ2h0bmVzcyBjb250cm9sCisgKgkJCWJhc2VkIG9uIHRoZSBkaXNjbG9zZWQgaW5mb3JtYXRpb24gYnkgTUVJLgorICoKKyAqCUp1bC4yNSwgMjAwNAlIaXJvc2hpIE1pdXJhIDxtaXVyYUBkYS1jaGEub3JnPgorICoJCS0gdjAuNCAgZmlyc3QgcG9zdCB2ZXJzaW9uCisgKgkJICAgICAgICBhZGQgZnVuY3Rpb24gdG8gcmV0cml2ZSBTSUZSCisgKgorICoJSnVsLjI0LCAyMDA0CUhpcm9zaGkgTWl1cmEgPG1pdXJhQGRhLWNoYS5vcmc+CisgKgkJLSB2MC4zICBnZXQgcHJvcGVyIHN0YXR1cyBvZiBob3RrZXkKKyAqCisgKiAgICAgIEp1bC4yMiwgMjAwNAlIaXJvc2hpIE1pdXJhIDxtaXVyYUBkYS1jaGEub3JnPgorICoJCS0gdjAuMiAgYWRkIEhvdEtleSBoYW5kbGVyCisgKgorICogICAgICBKdWwuMTcsIDIwMDQJSGlyb3NoaSBNaXVyYSA8bWl1cmFAZGEtY2hhLm9yZz4KKyAqCQktIHYwLjEgIHN0YXJ0IGZyb20gdG9zaGliYV9hY3BpIGRyaXZlciB3cml0dGVuIGJ5IEpvaG4gQmVsbW9udGUKKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2JhY2tsaWdodC5oPgorI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CisjaW5jbHVkZSA8YWNwaS9hY3BpX2J1cy5oPgorI2luY2x1ZGUgPGFjcGkvYWNwaV9kcml2ZXJzLmg+CisjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KKworCisjaWZuZGVmIEFDUElfSE9US0VZX0NPTVBPTkVOVAorI2RlZmluZSBBQ1BJX0hPVEtFWV9DT01QT05FTlQJMHgxMDAwMDAwMAorI2VuZGlmCisKKyNkZWZpbmUgX0NPTVBPTkVOVAkJQUNQSV9IT1RLRVlfQ09NUE9ORU5UCisKK01PRFVMRV9BVVRIT1IoIkhpcm9zaGkgTWl1cmEsIERhdmlkIEJyb25hdWdoIGFuZCBIYXJhbGQgV2VsdGUiKTsKK01PRFVMRV9ERVNDUklQVElPTigiQUNQSSBIb3RLZXkgZHJpdmVyIGZvciBQYW5hc29uaWMgTGV0J3MgTm90ZSBsYXB0b3BzIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKyNkZWZpbmUgTE9HUFJFRklYICJwY2NfYWNwaTogIgorCisvKiBEZWZpbmUgQUNQSSBQQVRIcyAqLworLyogTGV0cyBub3RlIGhvdGtleXMgKi8KKyNkZWZpbmUgTUVUSE9EX0hLRVlfUVVFUlkJIkhJTkYiCisjZGVmaW5lIE1FVEhPRF9IS0VZX1NRVFkJIlNRVFkiCisjZGVmaW5lIE1FVEhPRF9IS0VZX1NJTkYJIlNJTkYiCisjZGVmaW5lIE1FVEhPRF9IS0VZX1NTRVQJIlNTRVQiCisjZGVmaW5lIEhLRVlfTk9USUZZCQkgMHg4MAorCisjZGVmaW5lIEFDUElfUENDX0RSSVZFUl9OQU1FCSJQYW5hc29uaWMgTGFwdG9wIFN1cHBvcnQiCisjZGVmaW5lIEFDUElfUENDX0RFVklDRV9OQU1FCSJIb3RrZXkiCisjZGVmaW5lIEFDUElfUENDX0NMQVNTCQkicGNjIgorCisjZGVmaW5lIEFDUElfUENDX0lOUFVUX1BIWVMJInBhbmFzb25pYy9oa2V5MCIKKworLyogTENEX1RZUEVzOiAwID0gTm9ybWFsLCAxID0gU2VtaS10cmFuc3BhcmVudAorICAgRU5WX1NUQVRFczogTm9ybWFsIHRlbXA9MHgwMSwgSGlnaCB0ZW1wPTB4ODEsIE4vQT0weDAwCisqLworZW51bSBTSU5GX0JJVFMgeyBTSU5GX05VTV9CQVRURVJJRVMgPSAwLAorCQkgU0lORl9MQ0RfVFlQRSwKKwkJIFNJTkZfQUNfTUFYX0JSSUdIVCwKKwkJIFNJTkZfQUNfTUlOX0JSSUdIVCwKKwkJIFNJTkZfQUNfQ1VSX0JSSUdIVCwKKwkJIFNJTkZfRENfTUFYX0JSSUdIVCwKKwkJIFNJTkZfRENfTUlOX0JSSUdIVCwKKwkJIFNJTkZfRENfQ1VSX0JSSUdIVCwKKwkJIFNJTkZfTVVURSwKKwkJIFNJTkZfUkVTRVJWRUQsCisJCSBTSU5GX0VOVl9TVEFURSwKKwkJIFNJTkZfU1RJQ0tZX0tFWSA9IDB4ODAsCisJfTsKKy8qIFIxIGhhbmRsZXMgU0lORl9BQ19DVVJfQlJJR0hUIGFzIFNJTkZfQ1VSX0JSSUdIVCwgZG9lc24ndCBrbm93IEFDIHN0YXRlICovCisKK3N0YXRpYyBpbnQgYWNwaV9wY2NfaG90a2V5X2FkZChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSk7CitzdGF0aWMgaW50IGFjcGlfcGNjX2hvdGtleV9yZW1vdmUoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UsIGludCB0eXBlKTsKK3N0YXRpYyBpbnQgYWNwaV9wY2NfaG90a2V5X3Jlc3VtZShzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYWNwaV9kZXZpY2VfaWQgcGNjX2RldmljZV9pZHNbXSA9IHsKKwl7ICJNQVQwMDEyIiwgMH0sCisJeyAiTUFUMDAxMyIsIDB9LAorCXsgIk1BVDAwMTgiLCAwfSwKKwl7ICJNQVQwMDE5IiwgMH0sCisJeyAiIiwgMH0sCit9OworCitzdGF0aWMgc3RydWN0IGFjcGlfZHJpdmVyIGFjcGlfcGNjX2RyaXZlciA9IHsKKwkubmFtZSA9CQlBQ1BJX1BDQ19EUklWRVJfTkFNRSwKKwkuY2xhc3MgPQlBQ1BJX1BDQ19DTEFTUywKKwkuaWRzID0JCXBjY19kZXZpY2VfaWRzLAorCS5vcHMgPQkJeworCQkJCS5hZGQgPQkJYWNwaV9wY2NfaG90a2V5X2FkZCwKKwkJCQkucmVtb3ZlID0JYWNwaV9wY2NfaG90a2V5X3JlbW92ZSwKKwkJCQkucmVzdW1lID0gICAgICAgYWNwaV9wY2NfaG90a2V5X3Jlc3VtZSwKKwkJCX0sCit9OworCisjZGVmaW5lIEtFWU1BUF9TSVpFCQkxMQorc3RhdGljIGNvbnN0IGludCBpbml0aWFsX2tleW1hcFtLRVlNQVBfU0laRV0gPSB7CisJLyogIDAgKi8gS0VZX1JFU0VSVkVELAorCS8qICAxICovIEtFWV9CUklHSFRORVNTRE9XTiwKKwkvKiAgMiAqLyBLRVlfQlJJR0hUTkVTU1VQLAorCS8qICAzICovIEtFWV9ESVNQTEFZVE9HR0xFLAorCS8qICA0ICovIEtFWV9NVVRFLAorCS8qICA1ICovIEtFWV9WT0xVTUVET1dOLAorCS8qICA2ICovIEtFWV9WT0xVTUVVUCwKKwkvKiAgNyAqLyBLRVlfU0xFRVAsCisJLyogIDggKi8gS0VZX1BST0cxLCAvKiBDaGFuZ2UgQ1BVIGJvb3N0ICovCisJLyogIDkgKi8gS0VZX0JBVFRFUlksCisJLyogMTAgKi8gS0VZX1NVU1BFTkQsCit9OworCitzdHJ1Y3QgcGNjX2FjcGkgeworCWFjcGlfaGFuZGxlCQloYW5kbGU7CisJdW5zaWduZWQgbG9uZwkJbnVtX3NpZnI7CisJaW50CQkJc3RpY2t5X21vZGU7CisJdTMyIAkJCSpzaW5mOworCXN0cnVjdCBhY3BpX2RldmljZQkqZGV2aWNlOworCXN0cnVjdCBpbnB1dF9kZXYJKmlucHV0X2RldjsKKwlzdHJ1Y3QgYmFja2xpZ2h0X2RldmljZQkqYmFja2xpZ2h0OworCWludAkJCWtleW1hcFtLRVlNQVBfU0laRV07Cit9OworCitzdHJ1Y3QgcGNjX2tleWlucHV0IHsKKwlzdHJ1Y3QgYWNwaV9ob3RrZXkgICAgICAqaG90a2V5OworfTsKKworLyogbWV0aG9kIGFjY2VzcyBmdW5jdGlvbnMgKi8KK3N0YXRpYyBpbnQgYWNwaV9wY2Nfd3JpdGVfc3NldChzdHJ1Y3QgcGNjX2FjcGkgKnBjYywgaW50IGZ1bmMsIGludCB2YWwpCit7CisJdW5pb24gYWNwaV9vYmplY3QgaW5fb2Jqc1tdID0geworCQl7IC5pbnRlZ2VyLnR5cGUgID0gQUNQSV9UWVBFX0lOVEVHRVIsCisJCSAgLmludGVnZXIudmFsdWUgPSBmdW5jLCB9LAorCQl7IC5pbnRlZ2VyLnR5cGUgID0gQUNQSV9UWVBFX0lOVEVHRVIsCisJCSAgLmludGVnZXIudmFsdWUgPSB2YWwsIH0sCisJfTsKKwlzdHJ1Y3QgYWNwaV9vYmplY3RfbGlzdCBwYXJhbXMgPSB7CisJCS5jb3VudCAgID0gQVJSQVlfU0laRShpbl9vYmpzKSwKKwkJLnBvaW50ZXIgPSBpbl9vYmpzLAorCX07CisJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CisKKwlzdGF0dXMgPSBhY3BpX2V2YWx1YXRlX29iamVjdChwY2MtPmhhbmRsZSwgTUVUSE9EX0hLRVlfU1NFVCwKKwkJCQkgICAgICAmcGFyYW1zLCBOVUxMKTsKKworCXJldHVybiBzdGF0dXMgPT0gQUVfT0s7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGFjcGlfcGNjX2dldF9zcXR5KHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKQoreworCXVuc2lnbmVkIGxvbmcgbG9uZyBzOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKworCXN0YXR1cyA9IGFjcGlfZXZhbHVhdGVfaW50ZWdlcihkZXZpY2UtPmhhbmRsZSwgTUVUSE9EX0hLRVlfU1FUWSwKKwkJCQkgICAgICAgTlVMTCwgJnMpOworCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkKKwkJcmV0dXJuIHM7CisJZWxzZSB7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCisJCQkJICAiZXZhbHVhdGlvbiBlcnJvciBIS0VZLlNRVFlcbiIpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorfQorCitzdGF0aWMgaW50IGFjcGlfcGNjX3JldHJpZXZlX2Jpb3NkYXRhKHN0cnVjdCBwY2NfYWNwaSAqcGNjLCB1MzIgKnNpbmYpCit7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCXN0cnVjdCBhY3BpX2J1ZmZlciBidWZmZXIgPSB7QUNQSV9BTExPQ0FURV9CVUZGRVIsIE5VTEx9OworCXVuaW9uIGFjcGlfb2JqZWN0ICpoa2V5ID0gTlVMTDsKKwlpbnQgaTsKKworCXN0YXR1cyA9IGFjcGlfZXZhbHVhdGVfb2JqZWN0KHBjYy0+aGFuZGxlLCBNRVRIT0RfSEtFWV9TSU5GLCAwLAorCQkJCSAgICAgICZidWZmZXIpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAorCQkJCSAgImV2YWx1YXRpb24gZXJyb3IgSEtFWS5TSU5GXG4iKSk7CisJCXJldHVybiAwOworCX0KKworCWhrZXkgPSBidWZmZXIucG9pbnRlcjsKKwlpZiAoIWhrZXkgfHwgKGhrZXktPnR5cGUgIT0gQUNQSV9UWVBFX1BBQ0tBR0UpKSB7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsICJJbnZhbGlkIEhLRVkuU0lORlxuIikpOworCQlnb3RvIGVuZDsKKwl9CisKKwlpZiAocGNjLT5udW1fc2lmciA8IGhrZXktPnBhY2thZ2UuY291bnQpIHsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkgIlNRVFkgcmVwb3J0cyBiYWQgU0lORiBsZW5ndGhcbiIpKTsKKwkJc3RhdHVzID0gQUVfRVJST1I7CisJCWdvdG8gZW5kOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBoa2V5LT5wYWNrYWdlLmNvdW50OyBpKyspIHsKKwkJdW5pb24gYWNwaV9vYmplY3QgKmVsZW1lbnQgPSAmKGhrZXktPnBhY2thZ2UuZWxlbWVudHNbaV0pOworCQlpZiAobGlrZWx5KGVsZW1lbnQtPnR5cGUgPT0gQUNQSV9UWVBFX0lOVEVHRVIpKSB7CisJCQlzaW5mW2ldID0gZWxlbWVudC0+aW50ZWdlci52YWx1ZTsKKwkJfSBlbHNlCisJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAorCQkJCQkgIkludmFsaWQgSEtFWS5TSU5GIGRhdGFcbiIpKTsKKwl9CisJc2luZltoa2V5LT5wYWNrYWdlLmNvdW50XSA9IC0xOworCitlbmQ6CisJa2ZyZWUoYnVmZmVyLnBvaW50ZXIpOworCXJldHVybiBzdGF0dXMgPT0gQUVfT0s7Cit9CisKKy8qIGJhY2tsaWdodCBBUEkgaW50ZXJmYWNlIGZ1bmN0aW9ucyAqLworCisvKiBUaGlzIGRyaXZlciBjdXJyZW50bHkgdHJlYXRzIEFDIGFuZCBEQyBicmlnaHRuZXNzIGlkZW50aWNhbCwKKyAqIHNpbmNlIHdlIGRvbid0IG5lZWQgdG8gaW52ZW50IGFuIGludGVyZmFjZSB0byB0aGUgY29yZSBBQ1BJCisgKiBsb2dpYyB0byByZWNlaXZlIGV2ZW50cyBpbiBjYXNlIGEgcG93ZXIgc3VwcGx5IGlzIHBsdWdnZWQgaW4KKyAqIG9yIHJlbW92ZWQgKi8KKworc3RhdGljIGludCBibF9nZXQoc3RydWN0IGJhY2tsaWdodF9kZXZpY2UgKmJkKQoreworCXN0cnVjdCBwY2NfYWNwaSAqcGNjID0gYmxfZ2V0X2RhdGEoYmQpOworCisJaWYgKCFhY3BpX3BjY19yZXRyaWV2ZV9iaW9zZGF0YShwY2MsIHBjYy0+c2luZikpCisJCXJldHVybiAtRUlPOworCisJcmV0dXJuIHBjYy0+c2luZltTSU5GX0FDX0NVUl9CUklHSFRdOworfQorCitzdGF0aWMgaW50IGJsX3NldF9zdGF0dXMoc3RydWN0IGJhY2tsaWdodF9kZXZpY2UgKmJkKQoreworCXN0cnVjdCBwY2NfYWNwaSAqcGNjID0gYmxfZ2V0X2RhdGEoYmQpOworCWludCBicmlnaHQgPSBiZC0+cHJvcHMuYnJpZ2h0bmVzczsKKwlpbnQgcmM7CisKKwlpZiAoIWFjcGlfcGNjX3JldHJpZXZlX2Jpb3NkYXRhKHBjYywgcGNjLT5zaW5mKSkKKwkJcmV0dXJuIC1FSU87CisKKwlpZiAoYnJpZ2h0IDwgcGNjLT5zaW5mW1NJTkZfQUNfTUlOX0JSSUdIVF0pCisJCWJyaWdodCA9IHBjYy0+c2luZltTSU5GX0FDX01JTl9CUklHSFRdOworCisJaWYgKGJyaWdodCA8IHBjYy0+c2luZltTSU5GX0RDX01JTl9CUklHSFRdKQorCQlicmlnaHQgPSBwY2MtPnNpbmZbU0lORl9EQ19NSU5fQlJJR0hUXTsKKworCWlmIChicmlnaHQgPCBwY2MtPnNpbmZbU0lORl9BQ19NSU5fQlJJR0hUXSB8fAorCSAgICBicmlnaHQgPiBwY2MtPnNpbmZbU0lORl9BQ19NQVhfQlJJR0hUXSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyYyA9IGFjcGlfcGNjX3dyaXRlX3NzZXQocGNjLCBTSU5GX0FDX0NVUl9CUklHSFQsIGJyaWdodCk7CisJaWYgKHJjIDwgMCkKKwkJcmV0dXJuIHJjOworCisJcmV0dXJuIGFjcGlfcGNjX3dyaXRlX3NzZXQocGNjLCBTSU5GX0RDX0NVUl9CUklHSFQsIGJyaWdodCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYmFja2xpZ2h0X29wcyBwY2NfYmFja2xpZ2h0X29wcyA9IHsKKwkuZ2V0X2JyaWdodG5lc3MJPSBibF9nZXQsCisJLnVwZGF0ZV9zdGF0dXMJPSBibF9zZXRfc3RhdHVzLAorfTsKKworCisvKiBzeXNmcyB1c2VyIGludGVyZmFjZSBmdW5jdGlvbnMgKi8KKworc3RhdGljIHNzaXplX3Qgc2hvd19udW1iYXR0KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICAgY2hhciAqYnVmKQoreworCXN0cnVjdCBhY3BpX2RldmljZSAqYWNwaSA9IHRvX2FjcGlfZGV2aWNlKGRldik7CisJc3RydWN0IHBjY19hY3BpICpwY2MgPSBhY3BpX2RyaXZlcl9kYXRhKGFjcGkpOworCisJaWYgKCFhY3BpX3BjY19yZXRyaWV2ZV9iaW9zZGF0YShwY2MsIHBjYy0+c2luZikpCisJCXJldHVybiAtRUlPOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIHBjYy0+c2luZltTSU5GX05VTV9CQVRURVJJRVNdKTsKK30KKworc3RhdGljIHNzaXplX3Qgc2hvd19sY2R0eXBlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICAgY2hhciAqYnVmKQoreworCXN0cnVjdCBhY3BpX2RldmljZSAqYWNwaSA9IHRvX2FjcGlfZGV2aWNlKGRldik7CisJc3RydWN0IHBjY19hY3BpICpwY2MgPSBhY3BpX2RyaXZlcl9kYXRhKGFjcGkpOworCisJaWYgKCFhY3BpX3BjY19yZXRyaWV2ZV9iaW9zZGF0YShwY2MsIHBjYy0+c2luZikpCisJCXJldHVybiAtRUlPOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIHBjYy0+c2luZltTSU5GX0xDRF9UWVBFXSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfbXV0ZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgYWNwaV9kZXZpY2UgKmFjcGkgPSB0b19hY3BpX2RldmljZShkZXYpOworCXN0cnVjdCBwY2NfYWNwaSAqcGNjID0gYWNwaV9kcml2ZXJfZGF0YShhY3BpKTsKKworCWlmICghYWNwaV9wY2NfcmV0cmlldmVfYmlvc2RhdGEocGNjLCBwY2MtPnNpbmYpKQorCQlyZXR1cm4gLUVJTzsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCBwY2MtPnNpbmZbU0lORl9NVVRFXSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfc3RpY2t5KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICBjaGFyICpidWYpCit7CisJc3RydWN0IGFjcGlfZGV2aWNlICphY3BpID0gdG9fYWNwaV9kZXZpY2UoZGV2KTsKKwlzdHJ1Y3QgcGNjX2FjcGkgKnBjYyA9IGFjcGlfZHJpdmVyX2RhdGEoYWNwaSk7CisKKwlpZiAoIWFjcGlfcGNjX3JldHJpZXZlX2Jpb3NkYXRhKHBjYywgcGNjLT5zaW5mKSkKKwkJcmV0dXJuIC1FSU87CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgcGNjLT5zaW5mW1NJTkZfU1RJQ0tZX0tFWV0pOworfQorCitzdGF0aWMgc3NpemVfdCBzZXRfc3RpY2t5KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBhY3BpX2RldmljZSAqYWNwaSA9IHRvX2FjcGlfZGV2aWNlKGRldik7CisJc3RydWN0IHBjY19hY3BpICpwY2MgPSBhY3BpX2RyaXZlcl9kYXRhKGFjcGkpOworCWludCB2YWw7CisKKwlpZiAoY291bnQgJiYgc3NjYW5mKGJ1ZiwgIiVpIiwgJnZhbCkgPT0gMSAmJgorCSAgICAodmFsID09IDAgfHwgdmFsID09IDEpKSB7CisJCWFjcGlfcGNjX3dyaXRlX3NzZXQocGNjLCBTSU5GX1NUSUNLWV9LRVksIHZhbCk7CisJCXBjYy0+c3RpY2t5X21vZGUgPSB2YWw7CisJfQorCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgREVWSUNFX0FUVFIobnVtYmF0dCwgU19JUlVHTywgc2hvd19udW1iYXR0LCBOVUxMKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihsY2R0eXBlLCBTX0lSVUdPLCBzaG93X2xjZHR5cGUsIE5VTEwpOworc3RhdGljIERFVklDRV9BVFRSKG11dGUsIFNfSVJVR08sIHNob3dfbXV0ZSwgTlVMTCk7CitzdGF0aWMgREVWSUNFX0FUVFIoc3RpY2t5X2tleSwgU19JUlVHTyB8IFNfSVdVU1IsIHNob3dfc3RpY2t5LCBzZXRfc3RpY2t5KTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKnBjY19zeXNmc19lbnRyaWVzW10gPSB7CisJJmRldl9hdHRyX251bWJhdHQuYXR0ciwKKwkmZGV2X2F0dHJfbGNkdHlwZS5hdHRyLAorCSZkZXZfYXR0cl9tdXRlLmF0dHIsCisJJmRldl9hdHRyX3N0aWNreV9rZXkuYXR0ciwKKwlOVUxMLAorfTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgcGNjX2F0dHJfZ3JvdXAgPSB7CisJLm5hbWUJPSBOVUxMLAkJLyogcHV0IGluIGRldmljZSBkaXJlY3RvcnkgKi8KKwkuYXR0cnMJPSBwY2Nfc3lzZnNfZW50cmllcywKK307CisKKworLyogaG90a2V5IGlucHV0IGRldmljZSBkcml2ZXIgKi8KKworc3RhdGljIGludCBwY2NfZ2V0a2V5Y29kZShzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYsIGludCBzY2FuY29kZSwgaW50ICprZXljb2RlKQoreworCXN0cnVjdCBwY2NfYWNwaSAqcGNjID0gaW5wdXRfZ2V0X2RydmRhdGEoZGV2KTsKKworCWlmIChzY2FuY29kZSA+PSBBUlJBWV9TSVpFKHBjYy0+a2V5bWFwKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkqa2V5Y29kZSA9IHBjYy0+a2V5bWFwW3NjYW5jb2RlXTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGtleW1hcF9nZXRfYnlfa2V5Y29kZShzdHJ1Y3QgcGNjX2FjcGkgKnBjYywgaW50IGtleWNvZGUpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShwY2MtPmtleW1hcCk7IGkrKykgeworCQlpZiAocGNjLT5rZXltYXBbaV0gPT0ga2V5Y29kZSkKKwkJCXJldHVybiBpKzE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcGNjX3NldGtleWNvZGUoc3RydWN0IGlucHV0X2RldiAqZGV2LCBpbnQgc2NhbmNvZGUsIGludCBrZXljb2RlKQoreworCXN0cnVjdCBwY2NfYWNwaSAqcGNjID0gaW5wdXRfZ2V0X2RydmRhdGEoZGV2KTsKKwlpbnQgb2xka2V5Y29kZTsKKworCWlmIChzY2FuY29kZSA+PSBBUlJBWV9TSVpFKHBjYy0+a2V5bWFwKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoa2V5Y29kZSA8IDAgfHwga2V5Y29kZSA+IEtFWV9NQVgpCisJCXJldHVybiAtRUlOVkFMOworCisJb2xka2V5Y29kZSA9IHBjYy0+a2V5bWFwW3NjYW5jb2RlXTsKKwlwY2MtPmtleW1hcFtzY2FuY29kZV0gPSBrZXljb2RlOworCisJc2V0X2JpdChrZXljb2RlLCBkZXYtPmtleWJpdCk7CisKKwlpZiAoIWtleW1hcF9nZXRfYnlfa2V5Y29kZShwY2MsIG9sZGtleWNvZGUpKQorCQljbGVhcl9iaXQob2xka2V5Y29kZSwgZGV2LT5rZXliaXQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGFjcGlfcGNjX2dlbmVyYXRlX2tleWlucHV0KHN0cnVjdCBwY2NfYWNwaSAqcGNjKQoreworCXN0cnVjdCBpbnB1dF9kZXYgKmhvdGtfaW5wdXRfZGV2ID0gcGNjLT5pbnB1dF9kZXY7CisJaW50IHJjOworCWludCBrZXlfY29kZSwgaGtleV9udW07CisJdW5zaWduZWQgbG9uZyBsb25nIHJlc3VsdDsKKworCXJjID0gYWNwaV9ldmFsdWF0ZV9pbnRlZ2VyKHBjYy0+aGFuZGxlLCBNRVRIT0RfSEtFWV9RVUVSWSwKKwkJCQkgICBOVUxMLCAmcmVzdWx0KTsKKwlpZiAoIUFDUElfU1VDQ0VTUyhyYykpIHsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkgImVycm9yIGdldHRpbmcgaG90a2V5IHN0YXR1c1xuIikpOworCQlyZXR1cm47CisJfQorCisJYWNwaV9idXNfZ2VuZXJhdGVfcHJvY19ldmVudChwY2MtPmRldmljZSwgSEtFWV9OT1RJRlksIHJlc3VsdCk7CisKKwloa2V5X251bSA9IHJlc3VsdCAmIDB4ZjsKKworCWlmIChoa2V5X251bSA8IDAgfHwgaGtleV9udW0gPiBBUlJBWV9TSVpFKHBjYy0+a2V5bWFwKSkgeworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAorCQkJCSAgImhvdGtleSBudW1iZXIgb3V0IG9mIHJhbmdlOiAlZFxuIiwKKwkJCQkgIGhrZXlfbnVtKSk7CisJCXJldHVybjsKKwl9CisKKwlrZXlfY29kZSA9IHBjYy0+a2V5bWFwW2hrZXlfbnVtXTsKKworCWlmIChrZXlfY29kZSAhPSBLRVlfUkVTRVJWRUQpIHsKKwkJaW50IHB1c2hlZCA9IChyZXN1bHQgJiAweDgwKSA/IFRSVUUgOiBGQUxTRTsKKworCQlpbnB1dF9yZXBvcnRfa2V5KGhvdGtfaW5wdXRfZGV2LCBrZXlfY29kZSwgcHVzaGVkKTsKKwkJaW5wdXRfc3luYyhob3RrX2lucHV0X2Rldik7CisJfQorCisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCBhY3BpX3BjY19ob3RrZXlfbm90aWZ5KGFjcGlfaGFuZGxlIGhhbmRsZSwgdTMyIGV2ZW50LCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBwY2NfYWNwaSAqcGNjID0gKHN0cnVjdCBwY2NfYWNwaSAqKSBkYXRhOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgSEtFWV9OT1RJRlk6CisJCWFjcGlfcGNjX2dlbmVyYXRlX2tleWlucHV0KHBjYyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCS8qIG5vdGhpbmcgdG8gZG8gKi8KKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgaW50IGFjcGlfcGNjX2luaXRfaW5wdXQoc3RydWN0IHBjY19hY3BpICpwY2MpCit7CisJaW50IGksIHJjOworCisJcGNjLT5pbnB1dF9kZXYgPSBpbnB1dF9hbGxvY2F0ZV9kZXZpY2UoKTsKKwlpZiAoIXBjYy0+aW5wdXRfZGV2KSB7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCisJCQkJICAiQ291bGRuJ3QgYWxsb2NhdGUgaW5wdXQgZGV2aWNlIGZvciBob3RrZXkiKSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXBjYy0+aW5wdXRfZGV2LT5ldmJpdFswXSA9IEJJVChFVl9LRVkpOworCisJcGNjLT5pbnB1dF9kZXYtPm5hbWUgPSBBQ1BJX1BDQ19EUklWRVJfTkFNRTsKKwlwY2MtPmlucHV0X2Rldi0+cGh5cyA9IEFDUElfUENDX0lOUFVUX1BIWVM7CisJcGNjLT5pbnB1dF9kZXYtPmlkLmJ1c3R5cGUgPSBCVVNfSE9TVDsKKwlwY2MtPmlucHV0X2Rldi0+aWQudmVuZG9yID0gMHgwMDAxOworCXBjYy0+aW5wdXRfZGV2LT5pZC5wcm9kdWN0ID0gMHgwMDAxOworCXBjYy0+aW5wdXRfZGV2LT5pZC52ZXJzaW9uID0gMHgwMTAwOworCXBjYy0+aW5wdXRfZGV2LT5nZXRrZXljb2RlID0gcGNjX2dldGtleWNvZGU7CisJcGNjLT5pbnB1dF9kZXYtPnNldGtleWNvZGUgPSBwY2Nfc2V0a2V5Y29kZTsKKworCS8qIGxvYWQgaW5pdGlhbCBrZXltYXAgKi8KKwltZW1jcHkocGNjLT5rZXltYXAsIGluaXRpYWxfa2V5bWFwLCBzaXplb2YocGNjLT5rZXltYXApKTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHBjYy0+a2V5bWFwKTsgaSsrKQorCQlfX3NldF9iaXQocGNjLT5rZXltYXBbaV0sIHBjYy0+aW5wdXRfZGV2LT5rZXliaXQpOworCV9fY2xlYXJfYml0KEtFWV9SRVNFUlZFRCwgcGNjLT5pbnB1dF9kZXYtPmtleWJpdCk7CisKKwlpbnB1dF9zZXRfZHJ2ZGF0YShwY2MtPmlucHV0X2RldiwgcGNjKTsKKworCXJjID0gaW5wdXRfcmVnaXN0ZXJfZGV2aWNlKHBjYy0+aW5wdXRfZGV2KTsKKwlpZiAocmMgPCAwKQorCQlpbnB1dF9mcmVlX2RldmljZShwY2MtPmlucHV0X2Rldik7CisKKwlyZXR1cm4gcmM7Cit9CisKKy8qIGtlcm5lbCBtb2R1bGUgaW50ZXJmYWNlICovCisKK3N0YXRpYyBpbnQgYWNwaV9wY2NfaG90a2V5X3Jlc3VtZShzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSkKK3sKKwlzdHJ1Y3QgcGNjX2FjcGkgKnBjYyA9IGFjcGlfZHJpdmVyX2RhdGEoZGV2aWNlKTsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKKworCWlmIChkZXZpY2UgPT0gTlVMTCB8fCBwY2MgPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLCAiU3RpY2t5IG1vZGUgcmVzdG9yZTogJWRcbiIsCisJCQkgIHBjYy0+c3RpY2t5X21vZGUpKTsKKworCXN0YXR1cyA9IGFjcGlfcGNjX3dyaXRlX3NzZXQocGNjLCBTSU5GX1NUSUNLWV9LRVksIHBjYy0+c3RpY2t5X21vZGUpOworCisJcmV0dXJuIHN0YXR1cyA9PSBBRV9PSyA/IDAgOiAtRUlOVkFMOworfQorCitzdGF0aWMgaW50IGFjcGlfcGNjX2hvdGtleV9hZGQoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpCit7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCXN0cnVjdCBwY2NfYWNwaSAqcGNjOworCWludCBudW1fc2lmciwgcmVzdWx0OworCisJaWYgKCFkZXZpY2UpCisJCXJldHVybiAtRUlOVkFMOworCisJbnVtX3NpZnIgPSBhY3BpX3BjY19nZXRfc3F0eShkZXZpY2UpOworCisJaWYgKG51bV9zaWZyID4gMjU1KSB7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsICJudW1fc2lmciB0b28gbGFyZ2UiKSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXBjYyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBwY2NfYWNwaSksIEdGUF9LRVJORUwpOworCWlmICghcGNjKSB7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCisJCQkJICAiQ291bGRuJ3QgYWxsb2NhdGUgbWVtIGZvciBwY2MiKSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXBjYy0+c2luZiA9IGt6YWxsb2Moc2l6ZW9mKHUzMikgKiAobnVtX3NpZnIgKyAxKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwY2MtPnNpbmYpIHsKKwkJcmVzdWx0ID0gLUVOT01FTTsKKwkJZ290byBvdXRfaG90a2V5OworCX0KKworCXBjYy0+ZGV2aWNlID0gZGV2aWNlOworCXBjYy0+aGFuZGxlID0gZGV2aWNlLT5oYW5kbGU7CisJcGNjLT5udW1fc2lmciA9IG51bV9zaWZyOworCWRldmljZS0+ZHJpdmVyX2RhdGEgPSBwY2M7CisJc3RyY3B5KGFjcGlfZGV2aWNlX25hbWUoZGV2aWNlKSwgQUNQSV9QQ0NfREVWSUNFX05BTUUpOworCXN0cmNweShhY3BpX2RldmljZV9jbGFzcyhkZXZpY2UpLCBBQ1BJX1BDQ19DTEFTUyk7CisKKwlyZXN1bHQgPSBhY3BpX3BjY19pbml0X2lucHV0KHBjYyk7CisJaWYgKHJlc3VsdCkgeworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAorCQkJCSAgIkVycm9yIGluc3RhbGxpbmcga2V5aW5wdXQgaGFuZGxlclxuIikpOworCQlnb3RvIG91dF9zaW5mOworCX0KKworCS8qIGluaXRpYWxpemUgaG90a2V5IGlucHV0IGRldmljZSAqLworCXN0YXR1cyA9IGFjcGlfaW5zdGFsbF9ub3RpZnlfaGFuZGxlcihwY2MtPmhhbmRsZSwgQUNQSV9ERVZJQ0VfTk9USUZZLAorCQkJCQkgICAgIGFjcGlfcGNjX2hvdGtleV9ub3RpZnksIHBjYyk7CisKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkgICJFcnJvciBpbnN0YWxsaW5nIG5vdGlmeSBoYW5kbGVyXG4iKSk7CisJCXJlc3VsdCA9IC1FTk9ERVY7CisJCWdvdG8gb3V0X2lucHV0OworCX0KKworCS8qIGluaXRpYWxpemUgYmFja2xpZ2h0ICovCisJcGNjLT5iYWNrbGlnaHQgPSBiYWNrbGlnaHRfZGV2aWNlX3JlZ2lzdGVyKCJwYW5hc29uaWMiLCBOVUxMLCBwY2MsCisJCQkJCQkgICAmcGNjX2JhY2tsaWdodF9vcHMpOworCWlmIChJU19FUlIocGNjLT5iYWNrbGlnaHQpKQorCQlnb3RvIG91dF9ub3RpZnk7CisKKwlpZiAoIWFjcGlfcGNjX3JldHJpZXZlX2Jpb3NkYXRhKHBjYywgcGNjLT5zaW5mKSkgeworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAorCQkJCSAiQ291bGRuJ3QgcmV0cmlldmUgQklPUyBkYXRhXG4iKSk7CisJCWdvdG8gb3V0X2JhY2tsaWdodDsKKwl9CisKKwkvKiByZWFkIHRoZSBpbml0aWFsIGJyaWdodG5lc3Mgc2V0dGluZyBmcm9tIHRoZSBoYXJkd2FyZSAqLworCXBjYy0+YmFja2xpZ2h0LT5wcm9wcy5tYXhfYnJpZ2h0bmVzcyA9CisJCQkJCXBjYy0+c2luZltTSU5GX0FDX01BWF9CUklHSFRdOworCXBjYy0+YmFja2xpZ2h0LT5wcm9wcy5icmlnaHRuZXNzID0gcGNjLT5zaW5mW1NJTkZfQUNfQ1VSX0JSSUdIVF07CisKKwkvKiByZWFkIHRoZSBpbml0aWFsIHN0aWNreSBrZXkgbW9kZSBmcm9tIHRoZSBoYXJkd2FyZSAqLworCXBjYy0+c3RpY2t5X21vZGUgPSBwY2MtPnNpbmZbU0lORl9TVElDS1lfS0VZXTsKKworCS8qIGFkZCBzeXNmcyBhdHRyaWJ1dGVzICovCisJcmVzdWx0ID0gc3lzZnNfY3JlYXRlX2dyb3VwKCZkZXZpY2UtPmRldi5rb2JqLCAmcGNjX2F0dHJfZ3JvdXApOworCWlmIChyZXN1bHQpCisJCWdvdG8gb3V0X2JhY2tsaWdodDsKKworCXJldHVybiAwOworCitvdXRfYmFja2xpZ2h0OgorCWJhY2tsaWdodF9kZXZpY2VfdW5yZWdpc3RlcihwY2MtPmJhY2tsaWdodCk7CitvdXRfbm90aWZ5OgorCWFjcGlfcmVtb3ZlX25vdGlmeV9oYW5kbGVyKHBjYy0+aGFuZGxlLCBBQ1BJX0RFVklDRV9OT1RJRlksCisJCQkJICAgYWNwaV9wY2NfaG90a2V5X25vdGlmeSk7CitvdXRfaW5wdXQ6CisJaW5wdXRfdW5yZWdpc3Rlcl9kZXZpY2UocGNjLT5pbnB1dF9kZXYpOworCS8qIG5vIG5lZWQgdG8gaW5wdXRfZnJlZV9kZXZpY2UoKSBzaW5jZSBjb3JlIGlucHV0IEFQSSByZWZjb3VudCBhbmQKKwkgKiBmcmVlKClzIHRoZSBkZXZpY2UgKi8KK291dF9zaW5mOgorCWtmcmVlKHBjYy0+c2luZik7CitvdXRfaG90a2V5OgorCWtmcmVlKHBjYyk7CisKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgaW50IF9faW5pdCBhY3BpX3BjY19pbml0KHZvaWQpCit7CisJaW50IHJlc3VsdCA9IDA7CisKKwlpZiAoYWNwaV9kaXNhYmxlZCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlyZXN1bHQgPSBhY3BpX2J1c19yZWdpc3Rlcl9kcml2ZXIoJmFjcGlfcGNjX2RyaXZlcik7CisJaWYgKHJlc3VsdCA8IDApIHsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkgICJFcnJvciByZWdpc3RlcmluZyBob3RrZXkgZHJpdmVyXG4iKSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFjcGlfcGNjX2hvdGtleV9yZW1vdmUoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UsIGludCB0eXBlKQoreworCXN0cnVjdCBwY2NfYWNwaSAqcGNjID0gYWNwaV9kcml2ZXJfZGF0YShkZXZpY2UpOworCisJaWYgKCFkZXZpY2UgfHwgIXBjYykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzeXNmc19yZW1vdmVfZ3JvdXAoJmRldmljZS0+ZGV2LmtvYmosICZwY2NfYXR0cl9ncm91cCk7CisKKwliYWNrbGlnaHRfZGV2aWNlX3VucmVnaXN0ZXIocGNjLT5iYWNrbGlnaHQpOworCisJYWNwaV9yZW1vdmVfbm90aWZ5X2hhbmRsZXIocGNjLT5oYW5kbGUsIEFDUElfREVWSUNFX05PVElGWSwKKwkJCQkgICBhY3BpX3BjY19ob3RrZXlfbm90aWZ5KTsKKworCWlucHV0X3VucmVnaXN0ZXJfZGV2aWNlKHBjYy0+aW5wdXRfZGV2KTsKKwkvKiBubyBuZWVkIHRvIGlucHV0X2ZyZWVfZGV2aWNlKCkgc2luY2UgY29yZSBpbnB1dCBBUEkgcmVmY291bnQgYW5kCisJICogZnJlZSgpcyB0aGUgZGV2aWNlICovCisKKwlrZnJlZShwY2MtPnNpbmYpOworCWtmcmVlKHBjYyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGFjcGlfcGNjX2V4aXQodm9pZCkKK3sKKwlhY3BpX2J1c191bnJlZ2lzdGVyX2RyaXZlcigmYWNwaV9wY2NfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoYWNwaV9wY2NfaW5pdCk7Cittb2R1bGVfZXhpdChhY3BpX3BjY19leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGxhdGZvcm0veDg2L3NvbnktbGFwdG9wLmMgYi9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9zb255LWxhcHRvcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzNzk1OWQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9zb255LWxhcHRvcC5jCkBAIC0wLDAgKzEsMjc4NCBAQAorLyoKKyAqIEFDUEkgU29ueSBOb3RlYm9vayBDb250cm9sIERyaXZlciAoU05DIGFuZCBTUElDKQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDA1IFN0ZWxpYW4gUG9wIDxzdGVsaWFuQHBvcGllcy5uZXQ+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWF0dGlhIERvbmdpbGkgPG1hbGF0dGlhQGxpbnV4Lml0PgorICoKKyAqIFBhcnRzIG9mIHRoaXMgZHJpdmVyIGluc3BpcmVkIGZyb20gYXN1c19hY3BpLmMgYW5kIGlibV9hY3BpLmMKKyAqIHdoaWNoIGFyZSBjb3B5cmlnaHRlZCBieSB0aGVpciByZXNwZWN0aXZlIGF1dGhvcnMuCisgKgorICogVGhlIFNOWTYwMDEgZHJpdmVyIHBhcnQgaXMgYmFzZWQgb24gdGhlIHNvbnlwaSBkcml2ZXIgd2hpY2ggaW5jbHVkZXMKKyAqIG1hdGVyaWFsIGZyb206CisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDUgU3RlbGlhbiBQb3AgPHN0ZWxpYW5AcG9waWVzLm5ldD4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgTmFyYXlhbmFuIFIgUyA8bmFyc0BrYWRhbWJhLm9yZz4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwMiBBbGPDtHZlIDx3d3cuYWxjb3ZlLmNvbT4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEgTWljaGFlbCBBc2hsZXkgPG0uYXNobGV5QHVuc3cuZWR1LmF1PgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMSBKdW5pY2hpIE1vcml0YSA8anVuMW1AbWFycy5kdGkubmUuanA+CisgKgorICogQ29weXJpZ2h0IChDKSAyMDAwIFRha2F5YSBLaW5qbyA8dC1raW5qb0B0YzQuc28tbmV0Lm5lLmpwPgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMCBBbmRyZXcgVHJpZGdlbGwgPHRyaWRnZUB2YWxpbnV4LmNvbT4KKyAqCisgKiBFYXJsaWVyIHdvcmsgYnkgV2VybmVyIEFsbWVzYmVyZ2VyLCBQYXVsIGBSdXN0eScgUnVzc2VsbCBhbmQgUGF1bCBNYWNrZXJyYXMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvYmFja2xpZ2h0Lmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvZG1pLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgorI2luY2x1ZGUgPGxpbnV4L2tmaWZvLmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisjaW5jbHVkZSA8bGludXgvYWNwaS5oPgorI2luY2x1ZGUgPGFjcGkvYWNwaV9kcml2ZXJzLmg+CisjaW5jbHVkZSA8YWNwaS9hY3BpX2J1cy5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvc29ueXBpLmg+CisjaW5jbHVkZSA8bGludXgvc29ueS1sYXB0b3AuaD4KKyNpZmRlZiBDT05GSUdfU09OWVBJX0NPTVBBVAorI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CisjZW5kaWYKKworI2RlZmluZSBEUlZfUEZYCQkJInNvbnktbGFwdG9wOiAiCisjZGVmaW5lIGRwcmludGsobXNnLi4uKQkJZG8gewkJCVwKKwlpZiAoZGVidWcpIHByaW50ayhLRVJOX1dBUk5JTkcgRFJWX1BGWCAgbXNnKTsJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBTT05ZX0xBUFRPUF9EUklWRVJfVkVSU0lPTgkiMC42IgorCisjZGVmaW5lIFNPTllfTkNfQ0xBU1MJCSJzb255LW5jIgorI2RlZmluZSBTT05ZX05DX0hJRAkJIlNOWTUwMDEiCisjZGVmaW5lIFNPTllfTkNfRFJJVkVSX05BTUUJIlNvbnkgTm90ZWJvb2sgQ29udHJvbCBEcml2ZXIiCisKKyNkZWZpbmUgU09OWV9QSUNfQ0xBU1MJCSJzb255LXBpYyIKKyNkZWZpbmUgU09OWV9QSUNfSElECQkiU05ZNjAwMSIKKyNkZWZpbmUgU09OWV9QSUNfRFJJVkVSX05BTUUJIlNvbnkgUHJvZ3JhbW1hYmxlIElPIENvbnRyb2wgRHJpdmVyIgorCitNT0RVTEVfQVVUSE9SKCJTdGVsaWFuIFBvcCwgTWF0dGlhIERvbmdpbGkiKTsKK01PRFVMRV9ERVNDUklQVElPTigiU29ueSBsYXB0b3AgZXh0cmFzIGRyaXZlciAoU1BJQyBhbmQgU05DIEFDUEkgZGV2aWNlKSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX1ZFUlNJT04oU09OWV9MQVBUT1BfRFJJVkVSX1ZFUlNJT04pOworCitzdGF0aWMgaW50IGRlYnVnOworbW9kdWxlX3BhcmFtKGRlYnVnLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgInNldCB0aGlzIHRvIDEgKGFuZCBSVEZNKSBpZiB5b3Ugd2FudCB0byBoZWxwICIKKwkJICJ0aGUgZGV2ZWxvcG1lbnQgb2YgdGhpcyBkcml2ZXIiKTsKKworc3RhdGljIGludCBub19zcGljOwkJLyogPSAwICovCittb2R1bGVfcGFyYW0obm9fc3BpYywgaW50LCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0Mobm9fc3BpYywKKwkJICJzZXQgdGhpcyBpZiB5b3UgZG9uJ3Qgd2FudCB0byBlbmFibGUgdGhlIFNQSUMgZGV2aWNlIik7CisKK3N0YXRpYyBpbnQgY29tcGF0OwkJLyogPSAwICovCittb2R1bGVfcGFyYW0oY29tcGF0LCBpbnQsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhjb21wYXQsCisJCSAic2V0IHRoaXMgaWYgeW91IHdhbnQgdG8gZW5hYmxlIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgbW9kZSIpOworCitzdGF0aWMgdW5zaWduZWQgbG9uZyBtYXNrID0gMHhmZmZmZmZmZjsKK21vZHVsZV9wYXJhbShtYXNrLCB1bG9uZywgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKG1hc2ssCisJCSAic2V0IHRoaXMgdG8gdGhlIG1hc2sgb2YgZXZlbnQgeW91IHdhbnQgdG8gZW5hYmxlIChzZWUgZG9jKSIpOworCitzdGF0aWMgaW50IGNhbWVyYTsJCS8qID0gMCAqLworbW9kdWxlX3BhcmFtKGNhbWVyYSwgaW50LCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoY2FtZXJhLAorCQkgInNldCB0aGlzIHRvIDEgdG8gZW5hYmxlIE1vdGlvbiBFeWUgY2FtZXJhIGNvbnRyb2xzICIKKwkJICIob25seSB1c2UgaXQgaWYgeW91IGhhdmUgYSBDMVZFIG9yIEMxVk4gbW9kZWwpIik7CisKKyNpZmRlZiBDT05GSUdfU09OWVBJX0NPTVBBVAorc3RhdGljIGludCBtaW5vciA9IC0xOworbW9kdWxlX3BhcmFtKG1pbm9yLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhtaW5vciwKKwkJICJtaW5vciBudW1iZXIgb2YgdGhlIG1pc2MgZGV2aWNlIGZvciB0aGUgU1BJQyBjb21wYXRpYmlsaXR5IGNvZGUsICIKKwkJICJkZWZhdWx0IGlzIC0xIChhdXRvbWF0aWMpIik7CisjZW5kaWYKKworLyoqKioqKioqKioqIElucHV0IERldmljZXMgKioqKioqKioqKiovCisKKyNkZWZpbmUgU09OWV9MQVBUT1BfQlVGX1NJWkUJMTI4CitzdHJ1Y3Qgc29ueV9sYXB0b3BfaW5wdXRfcyB7CisJYXRvbWljX3QJCXVzZXJzOworCXN0cnVjdCBpbnB1dF9kZXYJKmpvZ19kZXY7CisJc3RydWN0IGlucHV0X2Rldgkqa2V5X2RldjsKKwlzdHJ1Y3Qga2ZpZm8JCSpmaWZvOworCXNwaW5sb2NrX3QJCWZpZm9fbG9jazsKKwlzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdAkqd3E7Cit9Oworc3RhdGljIHN0cnVjdCBzb255X2xhcHRvcF9pbnB1dF9zIHNvbnlfbGFwdG9wX2lucHV0ID0geworCS51c2VycyA9IEFUT01JQ19JTklUKDApLAorfTsKKworc3RydWN0IHNvbnlfbGFwdG9wX2tleXByZXNzIHsKKwlzdHJ1Y3QgaW5wdXRfZGV2ICpkZXY7CisJaW50IGtleTsKK307CisKKy8qIENvcnJlc3BvbmRhbmNlIHRhYmxlIGJldHdlZW4gc29ueXBpIGV2ZW50cworICogYW5kIGlucHV0IGxheWVyIGluZGV4ZXMgaW4gdGhlIGtleW1hcAorICovCitzdGF0aWMgaW50IHNvbnlfbGFwdG9wX2lucHV0X2luZGV4W10gPSB7CisJLTEsCS8qICAwIG5vIGV2ZW50ICovCisJLTEsCS8qICAxIFNPTllQSV9FVkVOVF9KT0dESUFMX0RPV04gKi8KKwktMSwJLyogIDIgU09OWVBJX0VWRU5UX0pPR0RJQUxfVVAgKi8KKwktMSwJLyogIDMgU09OWVBJX0VWRU5UX0pPR0RJQUxfRE9XTl9QUkVTU0VEICovCisJLTEsCS8qICA0IFNPTllQSV9FVkVOVF9KT0dESUFMX1VQX1BSRVNTRUQgKi8KKwktMSwJLyogIDUgU09OWVBJX0VWRU5UX0pPR0RJQUxfUFJFU1NFRCAqLworCS0xLAkvKiAgNiBTT05ZUElfRVZFTlRfSk9HRElBTF9SRUxFQVNFRCAqLworCSAwLAkvKiAgNyBTT05ZUElfRVZFTlRfQ0FQVFVSRV9QUkVTU0VEICovCisJIDEsCS8qICA4IFNPTllQSV9FVkVOVF9DQVBUVVJFX1JFTEVBU0VEICovCisJIDIsCS8qICA5IFNPTllQSV9FVkVOVF9DQVBUVVJFX1BBUlRJQUxQUkVTU0VEICovCisJIDMsCS8qIDEwIFNPTllQSV9FVkVOVF9DQVBUVVJFX1BBUlRJQUxSRUxFQVNFRCAqLworCSA0LAkvKiAxMSBTT05ZUElfRVZFTlRfRk5LRVlfRVNDICovCisJIDUsCS8qIDEyIFNPTllQSV9FVkVOVF9GTktFWV9GMSAqLworCSA2LAkvKiAxMyBTT05ZUElfRVZFTlRfRk5LRVlfRjIgKi8KKwkgNywJLyogMTQgU09OWVBJX0VWRU5UX0ZOS0VZX0YzICovCisJIDgsCS8qIDE1IFNPTllQSV9FVkVOVF9GTktFWV9GNCAqLworCSA5LAkvKiAxNiBTT05ZUElfRVZFTlRfRk5LRVlfRjUgKi8KKwkxMCwJLyogMTcgU09OWVBJX0VWRU5UX0ZOS0VZX0Y2ICovCisJMTEsCS8qIDE4IFNPTllQSV9FVkVOVF9GTktFWV9GNyAqLworCTEyLAkvKiAxOSBTT05ZUElfRVZFTlRfRk5LRVlfRjggKi8KKwkxMywJLyogMjAgU09OWVBJX0VWRU5UX0ZOS0VZX0Y5ICovCisJMTQsCS8qIDIxIFNPTllQSV9FVkVOVF9GTktFWV9GMTAgKi8KKwkxNSwJLyogMjIgU09OWVBJX0VWRU5UX0ZOS0VZX0YxMSAqLworCTE2LAkvKiAyMyBTT05ZUElfRVZFTlRfRk5LRVlfRjEyICovCisJMTcsCS8qIDI0IFNPTllQSV9FVkVOVF9GTktFWV8xICovCisJMTgsCS8qIDI1IFNPTllQSV9FVkVOVF9GTktFWV8yICovCisJMTksCS8qIDI2IFNPTllQSV9FVkVOVF9GTktFWV9EICovCisJMjAsCS8qIDI3IFNPTllQSV9FVkVOVF9GTktFWV9FICovCisJMjEsCS8qIDI4IFNPTllQSV9FVkVOVF9GTktFWV9GICovCisJMjIsCS8qIDI5IFNPTllQSV9FVkVOVF9GTktFWV9TICovCisJMjMsCS8qIDMwIFNPTllQSV9FVkVOVF9GTktFWV9CICovCisJMjQsCS8qIDMxIFNPTllQSV9FVkVOVF9CTFVFVE9PVEhfUFJFU1NFRCAqLworCTI1LAkvKiAzMiBTT05ZUElfRVZFTlRfUEtFWV9QMSAqLworCTI2LAkvKiAzMyBTT05ZUElfRVZFTlRfUEtFWV9QMiAqLworCTI3LAkvKiAzNCBTT05ZUElfRVZFTlRfUEtFWV9QMyAqLworCTI4LAkvKiAzNSBTT05ZUElfRVZFTlRfQkFDS19QUkVTU0VEICovCisJLTEsCS8qIDM2IFNPTllQSV9FVkVOVF9MSURfQ0xPU0VEICovCisJLTEsCS8qIDM3IFNPTllQSV9FVkVOVF9MSURfT1BFTkVEICovCisJMjksCS8qIDM4IFNPTllQSV9FVkVOVF9CTFVFVE9PVEhfT04gKi8KKwkzMCwJLyogMzkgU09OWVBJX0VWRU5UX0JMVUVUT09USF9PRkYgKi8KKwkzMSwJLyogNDAgU09OWVBJX0VWRU5UX0hFTFBfUFJFU1NFRCAqLworCTMyLAkvKiA0MSBTT05ZUElfRVZFTlRfRk5LRVlfT05MWSAqLworCTMzLAkvKiA0MiBTT05ZUElfRVZFTlRfSk9HRElBTF9GQVNUX0RPV04gKi8KKwkzNCwJLyogNDMgU09OWVBJX0VWRU5UX0pPR0RJQUxfRkFTVF9VUCAqLworCTM1LAkvKiA0NCBTT05ZUElfRVZFTlRfSk9HRElBTF9GQVNUX0RPV05fUFJFU1NFRCAqLworCTM2LAkvKiA0NSBTT05ZUElfRVZFTlRfSk9HRElBTF9GQVNUX1VQX1BSRVNTRUQgKi8KKwkzNywJLyogNDYgU09OWVBJX0VWRU5UX0pPR0RJQUxfVkZBU1RfRE9XTiAqLworCTM4LAkvKiA0NyBTT05ZUElfRVZFTlRfSk9HRElBTF9WRkFTVF9VUCAqLworCTM5LAkvKiA0OCBTT05ZUElfRVZFTlRfSk9HRElBTF9WRkFTVF9ET1dOX1BSRVNTRUQgKi8KKwk0MCwJLyogNDkgU09OWVBJX0VWRU5UX0pPR0RJQUxfVkZBU1RfVVBfUFJFU1NFRCAqLworCTQxLAkvKiA1MCBTT05ZUElfRVZFTlRfWk9PTV9QUkVTU0VEICovCisJNDIsCS8qIDUxIFNPTllQSV9FVkVOVF9USFVNQlBIUkFTRV9QUkVTU0VEICovCisJNDMsCS8qIDUyIFNPTllQSV9FVkVOVF9NRVlFX0ZBQ0UgKi8KKwk0NCwJLyogNTMgU09OWVBJX0VWRU5UX01FWUVfT1BQT1NJVEUgKi8KKwk0NSwJLyogNTQgU09OWVBJX0VWRU5UX01FTU9SWVNUSUNLX0lOU0VSVCAqLworCTQ2LAkvKiA1NSBTT05ZUElfRVZFTlRfTUVNT1JZU1RJQ0tfRUpFQ1QgKi8KKwktMSwJLyogNTYgU09OWVBJX0VWRU5UX0FOWUJVVFRPTl9SRUxFQVNFRCAqLworCS0xLAkvKiA1NyBTT05ZUElfRVZFTlRfQkFUVEVSWV9JTlNFUlQgKi8KKwktMSwJLyogNTggU09OWVBJX0VWRU5UX0JBVFRFUllfUkVNT1ZFICovCisJLTEsCS8qIDU5IFNPTllQSV9FVkVOVF9GTktFWV9SRUxFQVNFRCAqLworCTQ3LAkvKiA2MCBTT05ZUElfRVZFTlRfV0lSRUxFU1NfT04gKi8KKwk0OCwJLyogNjEgU09OWVBJX0VWRU5UX1dJUkVMRVNTX09GRiAqLworCTQ5LAkvKiA2MiBTT05ZUElfRVZFTlRfWk9PTV9JTl9QUkVTU0VEICovCisJNTAsCS8qIDYzIFNPTllQSV9FVkVOVF9aT09NX09VVF9QUkVTU0VEICovCit9OworCitzdGF0aWMgaW50IHNvbnlfbGFwdG9wX2lucHV0X2tleWNvZGVfbWFwW10gPSB7CisJS0VZX0NBTUVSQSwJLyogIDAgU09OWVBJX0VWRU5UX0NBUFRVUkVfUFJFU1NFRCAqLworCUtFWV9SRVNFUlZFRCwJLyogIDEgU09OWVBJX0VWRU5UX0NBUFRVUkVfUkVMRUFTRUQgKi8KKwlLRVlfUkVTRVJWRUQsCS8qICAyIFNPTllQSV9FVkVOVF9DQVBUVVJFX1BBUlRJQUxQUkVTU0VEICovCisJS0VZX1JFU0VSVkVELAkvKiAgMyBTT05ZUElfRVZFTlRfQ0FQVFVSRV9QQVJUSUFMUkVMRUFTRUQgKi8KKwlLRVlfRk5fRVNDLAkvKiAgNCBTT05ZUElfRVZFTlRfRk5LRVlfRVNDICovCisJS0VZX0ZOX0YxLAkvKiAgNSBTT05ZUElfRVZFTlRfRk5LRVlfRjEgKi8KKwlLRVlfRk5fRjIsCS8qICA2IFNPTllQSV9FVkVOVF9GTktFWV9GMiAqLworCUtFWV9GTl9GMywJLyogIDcgU09OWVBJX0VWRU5UX0ZOS0VZX0YzICovCisJS0VZX0ZOX0Y0LAkvKiAgOCBTT05ZUElfRVZFTlRfRk5LRVlfRjQgKi8KKwlLRVlfRk5fRjUsCS8qICA5IFNPTllQSV9FVkVOVF9GTktFWV9GNSAqLworCUtFWV9GTl9GNiwJLyogMTAgU09OWVBJX0VWRU5UX0ZOS0VZX0Y2ICovCisJS0VZX0ZOX0Y3LAkvKiAxMSBTT05ZUElfRVZFTlRfRk5LRVlfRjcgKi8KKwlLRVlfRk5fRjgsCS8qIDEyIFNPTllQSV9FVkVOVF9GTktFWV9GOCAqLworCUtFWV9GTl9GOSwJLyogMTMgU09OWVBJX0VWRU5UX0ZOS0VZX0Y5ICovCisJS0VZX0ZOX0YxMCwJLyogMTQgU09OWVBJX0VWRU5UX0ZOS0VZX0YxMCAqLworCUtFWV9GTl9GMTEsCS8qIDE1IFNPTllQSV9FVkVOVF9GTktFWV9GMTEgKi8KKwlLRVlfRk5fRjEyLAkvKiAxNiBTT05ZUElfRVZFTlRfRk5LRVlfRjEyICovCisJS0VZX0ZOX0YxLAkvKiAxNyBTT05ZUElfRVZFTlRfRk5LRVlfMSAqLworCUtFWV9GTl9GMiwJLyogMTggU09OWVBJX0VWRU5UX0ZOS0VZXzIgKi8KKwlLRVlfRk5fRCwJLyogMTkgU09OWVBJX0VWRU5UX0ZOS0VZX0QgKi8KKwlLRVlfRk5fRSwJLyogMjAgU09OWVBJX0VWRU5UX0ZOS0VZX0UgKi8KKwlLRVlfRk5fRiwJLyogMjEgU09OWVBJX0VWRU5UX0ZOS0VZX0YgKi8KKwlLRVlfRk5fUywJLyogMjIgU09OWVBJX0VWRU5UX0ZOS0VZX1MgKi8KKwlLRVlfRk5fQiwJLyogMjMgU09OWVBJX0VWRU5UX0ZOS0VZX0IgKi8KKwlLRVlfQkxVRVRPT1RILAkvKiAyNCBTT05ZUElfRVZFTlRfQkxVRVRPT1RIX1BSRVNTRUQgKi8KKwlLRVlfUFJPRzEsCS8qIDI1IFNPTllQSV9FVkVOVF9QS0VZX1AxICovCisJS0VZX1BST0cyLAkvKiAyNiBTT05ZUElfRVZFTlRfUEtFWV9QMiAqLworCUtFWV9QUk9HMywJLyogMjcgU09OWVBJX0VWRU5UX1BLRVlfUDMgKi8KKwlLRVlfQkFDSywJLyogMjggU09OWVBJX0VWRU5UX0JBQ0tfUFJFU1NFRCAqLworCUtFWV9CTFVFVE9PVEgsCS8qIDI5IFNPTllQSV9FVkVOVF9CTFVFVE9PVEhfT04gKi8KKwlLRVlfQkxVRVRPT1RILAkvKiAzMCBTT05ZUElfRVZFTlRfQkxVRVRPT1RIX09GRiAqLworCUtFWV9IRUxQLAkvKiAzMSBTT05ZUElfRVZFTlRfSEVMUF9QUkVTU0VEICovCisJS0VZX0ZOLAkJLyogMzIgU09OWVBJX0VWRU5UX0ZOS0VZX09OTFkgKi8KKwlLRVlfUkVTRVJWRUQsCS8qIDMzIFNPTllQSV9FVkVOVF9KT0dESUFMX0ZBU1RfRE9XTiAqLworCUtFWV9SRVNFUlZFRCwJLyogMzQgU09OWVBJX0VWRU5UX0pPR0RJQUxfRkFTVF9VUCAqLworCUtFWV9SRVNFUlZFRCwJLyogMzUgU09OWVBJX0VWRU5UX0pPR0RJQUxfRkFTVF9ET1dOX1BSRVNTRUQgKi8KKwlLRVlfUkVTRVJWRUQsCS8qIDM2IFNPTllQSV9FVkVOVF9KT0dESUFMX0ZBU1RfVVBfUFJFU1NFRCAqLworCUtFWV9SRVNFUlZFRCwJLyogMzcgU09OWVBJX0VWRU5UX0pPR0RJQUxfVkZBU1RfRE9XTiAqLworCUtFWV9SRVNFUlZFRCwJLyogMzggU09OWVBJX0VWRU5UX0pPR0RJQUxfVkZBU1RfVVAgKi8KKwlLRVlfUkVTRVJWRUQsCS8qIDM5IFNPTllQSV9FVkVOVF9KT0dESUFMX1ZGQVNUX0RPV05fUFJFU1NFRCAqLworCUtFWV9SRVNFUlZFRCwJLyogNDAgU09OWVBJX0VWRU5UX0pPR0RJQUxfVkZBU1RfVVBfUFJFU1NFRCAqLworCUtFWV9aT09NLAkvKiA0MSBTT05ZUElfRVZFTlRfWk9PTV9QUkVTU0VEICovCisJQlROX1RIVU1CLAkvKiA0MiBTT05ZUElfRVZFTlRfVEhVTUJQSFJBU0VfUFJFU1NFRCAqLworCUtFWV9SRVNFUlZFRCwJLyogNDMgU09OWVBJX0VWRU5UX01FWUVfRkFDRSAqLworCUtFWV9SRVNFUlZFRCwJLyogNDQgU09OWVBJX0VWRU5UX01FWUVfT1BQT1NJVEUgKi8KKwlLRVlfUkVTRVJWRUQsCS8qIDQ1IFNPTllQSV9FVkVOVF9NRU1PUllTVElDS19JTlNFUlQgKi8KKwlLRVlfUkVTRVJWRUQsCS8qIDQ2IFNPTllQSV9FVkVOVF9NRU1PUllTVElDS19FSkVDVCAqLworCUtFWV9XTEFOLAkvKiA0NyBTT05ZUElfRVZFTlRfV0lSRUxFU1NfT04gKi8KKwlLRVlfV0xBTiwJLyogNDggU09OWVBJX0VWRU5UX1dJUkVMRVNTX09GRiAqLworCUtFWV9aT09NSU4sCS8qIDQ5IFNPTllQSV9FVkVOVF9aT09NX0lOX1BSRVNTRUQgKi8KKwlLRVlfWk9PTU9VVAkvKiA1MCBTT05ZUElfRVZFTlRfWk9PTV9PVVRfUFJFU1NFRCAqLworfTsKKworLyogcmVsZWFzZSBidXR0b25zIGFmdGVyIGEgc2hvcnQgZGVsYXkgaWYgcHJlc3NlZCAqLworc3RhdGljIHZvaWQgZG9fc29ueV9sYXB0b3BfcmVsZWFzZV9rZXkoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBzb255X2xhcHRvcF9rZXlwcmVzcyBrcDsKKworCXdoaWxlIChrZmlmb19nZXQoc29ueV9sYXB0b3BfaW5wdXQuZmlmbywgKHVuc2lnbmVkIGNoYXIgKikma3AsCisJCQkgc2l6ZW9mKGtwKSkgPT0gc2l6ZW9mKGtwKSkgeworCQltc2xlZXAoMTApOworCQlpbnB1dF9yZXBvcnRfa2V5KGtwLmRldiwga3Aua2V5LCAwKTsKKwkJaW5wdXRfc3luYyhrcC5kZXYpOworCX0KK30KK3N0YXRpYyBERUNMQVJFX1dPUksoc29ueV9sYXB0b3BfcmVsZWFzZV9rZXlfd29yaywKKwkJZG9fc29ueV9sYXB0b3BfcmVsZWFzZV9rZXkpOworCisvKiBmb3J3YXJkIGV2ZW50IHRvIHRoZSBpbnB1dCBzdWJzeXN0ZW0gKi8KK3N0YXRpYyB2b2lkIHNvbnlfbGFwdG9wX3JlcG9ydF9pbnB1dF9ldmVudCh1OCBldmVudCkKK3sKKwlzdHJ1Y3QgaW5wdXRfZGV2ICpqb2dfZGV2ID0gc29ueV9sYXB0b3BfaW5wdXQuam9nX2RldjsKKwlzdHJ1Y3QgaW5wdXRfZGV2ICprZXlfZGV2ID0gc29ueV9sYXB0b3BfaW5wdXQua2V5X2RldjsKKwlzdHJ1Y3Qgc29ueV9sYXB0b3Bfa2V5cHJlc3Mga3AgPSB7IE5VTEwgfTsKKworCWlmIChldmVudCA9PSBTT05ZUElfRVZFTlRfRk5LRVlfUkVMRUFTRUQpIHsKKwkJLyogTm90aGluZywgbm90IGFsbCBWQUlPcyBnZW5lcmF0ZSB0aGlzIGV2ZW50ICovCisJCXJldHVybjsKKwl9CisKKwkvKiByZXBvcnQgZXZlbnRzICovCisJc3dpdGNoIChldmVudCkgeworCS8qIGpvZ19kZXYgZXZlbnRzICovCisJY2FzZSBTT05ZUElfRVZFTlRfSk9HRElBTF9VUDoKKwljYXNlIFNPTllQSV9FVkVOVF9KT0dESUFMX1VQX1BSRVNTRUQ6CisJCWlucHV0X3JlcG9ydF9yZWwoam9nX2RldiwgUkVMX1dIRUVMLCAxKTsKKwkJaW5wdXRfc3luYyhqb2dfZGV2KTsKKwkJcmV0dXJuOworCisJY2FzZSBTT05ZUElfRVZFTlRfSk9HRElBTF9ET1dOOgorCWNhc2UgU09OWVBJX0VWRU5UX0pPR0RJQUxfRE9XTl9QUkVTU0VEOgorCQlpbnB1dF9yZXBvcnRfcmVsKGpvZ19kZXYsIFJFTF9XSEVFTCwgLTEpOworCQlpbnB1dF9zeW5jKGpvZ19kZXYpOworCQlyZXR1cm47CisKKwkvKiBrZXlfZGV2IGV2ZW50cyAqLworCWNhc2UgU09OWVBJX0VWRU5UX0pPR0RJQUxfUFJFU1NFRDoKKwkJa3Aua2V5ID0gQlROX01JRERMRTsKKwkJa3AuZGV2ID0gam9nX2RldjsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlpZiAoZXZlbnQgPj0gQVJSQVlfU0laRShzb255X2xhcHRvcF9pbnB1dF9pbmRleCkpIHsKKwkJCWRwcmludGsoInNvbnlfbGFwdG9wX3JlcG9ydF9pbnB1dF9ldmVudCwgZXZlbnQgbm90IGtub3duOiAlZFxuIiwgZXZlbnQpOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKHNvbnlfbGFwdG9wX2lucHV0X2luZGV4W2V2ZW50XSAhPSAtMSkgeworCQkJa3Aua2V5ID0gc29ueV9sYXB0b3BfaW5wdXRfa2V5Y29kZV9tYXBbc29ueV9sYXB0b3BfaW5wdXRfaW5kZXhbZXZlbnRdXTsKKwkJCWlmIChrcC5rZXkgIT0gS0VZX1VOS05PV04pCisJCQkJa3AuZGV2ID0ga2V5X2RldjsKKwkJfQorCQlicmVhazsKKwl9CisKKwlpZiAoa3AuZGV2KSB7CisJCWlucHV0X3JlcG9ydF9rZXkoa3AuZGV2LCBrcC5rZXksIDEpOworCQkvKiB3ZSBlbWl0IHRoZSBzY2FuY29kZSBzbyB3ZSBjYW4gYWx3YXlzIHJlbWFwIHRoZSBrZXkgKi8KKwkJaW5wdXRfZXZlbnQoa3AuZGV2LCBFVl9NU0MsIE1TQ19TQ0FOLCBldmVudCk7CisJCWlucHV0X3N5bmMoa3AuZGV2KTsKKwkJa2ZpZm9fcHV0KHNvbnlfbGFwdG9wX2lucHV0LmZpZm8sCisJCQkgICh1bnNpZ25lZCBjaGFyICopJmtwLCBzaXplb2Yoa3ApKTsKKworCQlpZiAoIXdvcmtfcGVuZGluZygmc29ueV9sYXB0b3BfcmVsZWFzZV9rZXlfd29yaykpCisJCQlxdWV1ZV93b3JrKHNvbnlfbGFwdG9wX2lucHV0LndxLAorCQkJCQkmc29ueV9sYXB0b3BfcmVsZWFzZV9rZXlfd29yayk7CisJfSBlbHNlCisJCWRwcmludGsoInVua25vd24gaW5wdXQgZXZlbnQgJS4yeFxuIiwgZXZlbnQpOworfQorCitzdGF0aWMgaW50IHNvbnlfbGFwdG9wX3NldHVwX2lucHV0KHN0cnVjdCBhY3BpX2RldmljZSAqYWNwaV9kZXZpY2UpCit7CisJc3RydWN0IGlucHV0X2RldiAqam9nX2RldjsKKwlzdHJ1Y3QgaW5wdXRfZGV2ICprZXlfZGV2OworCWludCBpOworCWludCBlcnJvcjsKKworCS8qIGRvbid0IHJ1biBhZ2FpbiBpZiBhbHJlYWR5IGluaXRpYWxpemVkICovCisJaWYgKGF0b21pY19hZGRfcmV0dXJuKDEsICZzb255X2xhcHRvcF9pbnB1dC51c2VycykgPiAxKQorCQlyZXR1cm4gMDsKKworCS8qIGtmaWZvICovCisJc3Bpbl9sb2NrX2luaXQoJnNvbnlfbGFwdG9wX2lucHV0LmZpZm9fbG9jayk7CisJc29ueV9sYXB0b3BfaW5wdXQuZmlmbyA9CisJCWtmaWZvX2FsbG9jKFNPTllfTEFQVE9QX0JVRl9TSVpFLCBHRlBfS0VSTkVMLAorCQkJICAgICZzb255X2xhcHRvcF9pbnB1dC5maWZvX2xvY2spOworCWlmIChJU19FUlIoc29ueV9sYXB0b3BfaW5wdXQuZmlmbykpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIERSVl9QRlggImtmaWZvX2FsbG9jIGZhaWxlZFxuIik7CisJCWVycm9yID0gUFRSX0VSUihzb255X2xhcHRvcF9pbnB1dC5maWZvKTsKKwkJZ290byBlcnJfZGVjX3VzZXJzOworCX0KKworCS8qIGluaXQgd29ya3F1ZXVlICovCisJc29ueV9sYXB0b3BfaW5wdXQud3EgPSBjcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZSgic29ueS1sYXB0b3AiKTsKKwlpZiAoIXNvbnlfbGFwdG9wX2lucHV0LndxKSB7CisJCXByaW50ayhLRVJOX0VSUiBEUlZfUEZYCisJCQkJIlVuYWJlIHRvIGNyZWF0ZSB3b3JrcXVldWUuXG4iKTsKKwkJZXJyb3IgPSAtRU5YSU87CisJCWdvdG8gZXJyX2ZyZWVfa2ZpZm87CisJfQorCisJLyogaW5wdXQga2V5cyAqLworCWtleV9kZXYgPSBpbnB1dF9hbGxvY2F0ZV9kZXZpY2UoKTsKKwlpZiAoIWtleV9kZXYpIHsKKwkJZXJyb3IgPSAtRU5PTUVNOworCQlnb3RvIGVycl9kZXN0cm95X3dxOworCX0KKworCWtleV9kZXYtPm5hbWUgPSAiU29ueSBWYWlvIEtleXMiOworCWtleV9kZXYtPmlkLmJ1c3R5cGUgPSBCVVNfSVNBOworCWtleV9kZXYtPmlkLnZlbmRvciA9IFBDSV9WRU5ET1JfSURfU09OWTsKKwlrZXlfZGV2LT5kZXYucGFyZW50ID0gJmFjcGlfZGV2aWNlLT5kZXY7CisKKwkvKiBJbml0aWFsaXplIHRoZSBJbnB1dCBEcml2ZXJzOiBzcGVjaWFsIGtleXMgKi8KKwlzZXRfYml0KEVWX0tFWSwga2V5X2Rldi0+ZXZiaXQpOworCXNldF9iaXQoRVZfTVNDLCBrZXlfZGV2LT5ldmJpdCk7CisJc2V0X2JpdChNU0NfU0NBTiwga2V5X2Rldi0+bXNjYml0KTsKKwlrZXlfZGV2LT5rZXljb2Rlc2l6ZSA9IHNpemVvZihzb255X2xhcHRvcF9pbnB1dF9rZXljb2RlX21hcFswXSk7CisJa2V5X2Rldi0+a2V5Y29kZW1heCA9IEFSUkFZX1NJWkUoc29ueV9sYXB0b3BfaW5wdXRfa2V5Y29kZV9tYXApOworCWtleV9kZXYtPmtleWNvZGUgPSAmc29ueV9sYXB0b3BfaW5wdXRfa2V5Y29kZV9tYXA7CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoc29ueV9sYXB0b3BfaW5wdXRfa2V5Y29kZV9tYXApOyBpKyspIHsKKwkJaWYgKHNvbnlfbGFwdG9wX2lucHV0X2tleWNvZGVfbWFwW2ldICE9IEtFWV9SRVNFUlZFRCkgeworCQkJc2V0X2JpdChzb255X2xhcHRvcF9pbnB1dF9rZXljb2RlX21hcFtpXSwKKwkJCQlrZXlfZGV2LT5rZXliaXQpOworCQl9CisJfQorCisJZXJyb3IgPSBpbnB1dF9yZWdpc3Rlcl9kZXZpY2Uoa2V5X2Rldik7CisJaWYgKGVycm9yKQorCQlnb3RvIGVycl9mcmVlX2tleWRldjsKKworCXNvbnlfbGFwdG9wX2lucHV0LmtleV9kZXYgPSBrZXlfZGV2OworCisJLyogam9nZGlhbCAqLworCWpvZ19kZXYgPSBpbnB1dF9hbGxvY2F0ZV9kZXZpY2UoKTsKKwlpZiAoIWpvZ19kZXYpIHsKKwkJZXJyb3IgPSAtRU5PTUVNOworCQlnb3RvIGVycl91bnJlZ2lzdGVyX2tleWRldjsKKwl9CisKKwlqb2dfZGV2LT5uYW1lID0gIlNvbnkgVmFpbyBKb2dkaWFsIjsKKwlqb2dfZGV2LT5pZC5idXN0eXBlID0gQlVTX0lTQTsKKwlqb2dfZGV2LT5pZC52ZW5kb3IgPSBQQ0lfVkVORE9SX0lEX1NPTlk7CisJa2V5X2Rldi0+ZGV2LnBhcmVudCA9ICZhY3BpX2RldmljZS0+ZGV2OworCisJam9nX2Rldi0+ZXZiaXRbMF0gPSBCSVRfTUFTSyhFVl9LRVkpIHwgQklUX01BU0soRVZfUkVMKTsKKwlqb2dfZGV2LT5rZXliaXRbQklUX1dPUkQoQlROX01PVVNFKV0gPSBCSVRfTUFTSyhCVE5fTUlERExFKTsKKwlqb2dfZGV2LT5yZWxiaXRbMF0gPSBCSVRfTUFTSyhSRUxfV0hFRUwpOworCisJZXJyb3IgPSBpbnB1dF9yZWdpc3Rlcl9kZXZpY2Uoam9nX2Rldik7CisJaWYgKGVycm9yKQorCQlnb3RvIGVycl9mcmVlX2pvZ2RldjsKKworCXNvbnlfbGFwdG9wX2lucHV0LmpvZ19kZXYgPSBqb2dfZGV2OworCisJcmV0dXJuIDA7CisKK2Vycl9mcmVlX2pvZ2RldjoKKwlpbnB1dF9mcmVlX2RldmljZShqb2dfZGV2KTsKKworZXJyX3VucmVnaXN0ZXJfa2V5ZGV2OgorCWlucHV0X3VucmVnaXN0ZXJfZGV2aWNlKGtleV9kZXYpOworCS8qIHRvIGF2b2lkIGtyZWYgdW5kZXJmbG93IGJlbG93IGF0IGlucHV0X2ZyZWVfZGV2aWNlICovCisJa2V5X2RldiA9IE5VTEw7CisKK2Vycl9mcmVlX2tleWRldjoKKwlpbnB1dF9mcmVlX2RldmljZShrZXlfZGV2KTsKKworZXJyX2Rlc3Ryb3lfd3E6CisJZGVzdHJveV93b3JrcXVldWUoc29ueV9sYXB0b3BfaW5wdXQud3EpOworCitlcnJfZnJlZV9rZmlmbzoKKwlrZmlmb19mcmVlKHNvbnlfbGFwdG9wX2lucHV0LmZpZm8pOworCitlcnJfZGVjX3VzZXJzOgorCWF0b21pY19kZWMoJnNvbnlfbGFwdG9wX2lucHV0LnVzZXJzKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKK3N0YXRpYyB2b2lkIHNvbnlfbGFwdG9wX3JlbW92ZV9pbnB1dCh2b2lkKQoreworCS8qIGNsZWFudXAgb25seSBhZnRlciB0aGUgbGFzdCB1c2VyIGhhcyBnb25lICovCisJaWYgKCFhdG9taWNfZGVjX2FuZF90ZXN0KCZzb255X2xhcHRvcF9pbnB1dC51c2VycykpCisJCXJldHVybjsKKworCS8qIGZsdXNoIHdvcmtxdWV1ZSBmaXJzdCAqLworCWZsdXNoX3dvcmtxdWV1ZShzb255X2xhcHRvcF9pbnB1dC53cSk7CisKKwkvKiBkZXN0cm95IGlucHV0IGRldnMgKi8KKwlpbnB1dF91bnJlZ2lzdGVyX2RldmljZShzb255X2xhcHRvcF9pbnB1dC5rZXlfZGV2KTsKKwlzb255X2xhcHRvcF9pbnB1dC5rZXlfZGV2ID0gTlVMTDsKKworCWlmIChzb255X2xhcHRvcF9pbnB1dC5qb2dfZGV2KSB7CisJCWlucHV0X3VucmVnaXN0ZXJfZGV2aWNlKHNvbnlfbGFwdG9wX2lucHV0LmpvZ19kZXYpOworCQlzb255X2xhcHRvcF9pbnB1dC5qb2dfZGV2ID0gTlVMTDsKKwl9CisKKwlkZXN0cm95X3dvcmtxdWV1ZShzb255X2xhcHRvcF9pbnB1dC53cSk7CisJa2ZpZm9fZnJlZShzb255X2xhcHRvcF9pbnB1dC5maWZvKTsKK30KKworLyoqKioqKioqKioqIFBsYXRmb3JtIERldmljZSAqKioqKioqKioqKi8KKworc3RhdGljIGF0b21pY190IHNvbnlfcGZfdXNlcnMgPSBBVE9NSUNfSU5JVCgwKTsKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHNvbnlfcGZfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCSAgIC5uYW1lID0gInNvbnktbGFwdG9wIiwKKwkJICAgLm93bmVyID0gVEhJU19NT0RVTEUsCisJCSAgIH0KK307CitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqc29ueV9wZl9kZXZpY2U7CisKK3N0YXRpYyBpbnQgc29ueV9wZl9hZGQodm9pZCkKK3sKKwlpbnQgcmV0ID0gMDsKKworCS8qIGRvbid0IHJ1biBhZ2FpbiBpZiBhbHJlYWR5IGluaXRpYWxpemVkICovCisJaWYgKGF0b21pY19hZGRfcmV0dXJuKDEsICZzb255X3BmX3VzZXJzKSA+IDEpCisJCXJldHVybiAwOworCisJcmV0ID0gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZzb255X3BmX2RyaXZlcik7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisKKwlzb255X3BmX2RldmljZSA9IHBsYXRmb3JtX2RldmljZV9hbGxvYygic29ueS1sYXB0b3AiLCAtMSk7CisJaWYgKCFzb255X3BmX2RldmljZSkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIG91dF9wbGF0Zm9ybV9yZWdpc3RlcmVkOworCX0KKworCXJldCA9IHBsYXRmb3JtX2RldmljZV9hZGQoc29ueV9wZl9kZXZpY2UpOworCWlmIChyZXQpCisJCWdvdG8gb3V0X3BsYXRmb3JtX2FsbG9jZWQ7CisKKwlyZXR1cm4gMDsKKworICAgICAgb3V0X3BsYXRmb3JtX2FsbG9jZWQ6CisJcGxhdGZvcm1fZGV2aWNlX3B1dChzb255X3BmX2RldmljZSk7CisJc29ueV9wZl9kZXZpY2UgPSBOVUxMOworICAgICAgb3V0X3BsYXRmb3JtX3JlZ2lzdGVyZWQ6CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnNvbnlfcGZfZHJpdmVyKTsKKyAgICAgIG91dDoKKwlhdG9taWNfZGVjKCZzb255X3BmX3VzZXJzKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBzb255X3BmX3JlbW92ZSh2b2lkKQoreworCS8qIGRlcmVnaXN0ZXIgb25seSBhZnRlciB0aGUgbGFzdCB1c2VyIGhhcyBnb25lICovCisJaWYgKCFhdG9taWNfZGVjX2FuZF90ZXN0KCZzb255X3BmX3VzZXJzKSkKKwkJcmV0dXJuOworCisJcGxhdGZvcm1fZGV2aWNlX2RlbChzb255X3BmX2RldmljZSk7CisJcGxhdGZvcm1fZGV2aWNlX3B1dChzb255X3BmX2RldmljZSk7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnNvbnlfcGZfZHJpdmVyKTsKK30KKworLyoqKioqKioqKioqIFNOQyAoU05ZNTAwMSkgRGV2aWNlICoqKioqKioqKioqLworCisvKiB0aGUgZGV2aWNlIHVzZXMgMS1iYXNlZCB2YWx1ZXMsIHdoaWxlIHRoZSBiYWNrbGlnaHQgc3Vic3lzdGVtIHVzZXMKKyAgIDAtYmFzZWQgdmFsdWVzICovCisjZGVmaW5lIFNPTllfTUFYX0JSSUdIVE5FU1MJOAorCisjZGVmaW5lIFNOQ19WQUxJREFURV9JTgkJMAorI2RlZmluZSBTTkNfVkFMSURBVEVfT1VUCTEKKworc3RhdGljIHNzaXplX3Qgc29ueV9uY19zeXNmc19zaG93KHN0cnVjdCBkZXZpY2UgKiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKiwKKwkJCSAgICAgIGNoYXIgKik7CitzdGF0aWMgc3NpemVfdCBzb255X25jX3N5c2ZzX3N0b3JlKHN0cnVjdCBkZXZpY2UgKiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKiwKKwkJCSAgICAgICBjb25zdCBjaGFyICosIHNpemVfdCk7CitzdGF0aWMgaW50IGJvb2xlYW5fdmFsaWRhdGUoY29uc3QgaW50LCBjb25zdCBpbnQpOworc3RhdGljIGludCBicmlnaHRuZXNzX2RlZmF1bHRfdmFsaWRhdGUoY29uc3QgaW50LCBjb25zdCBpbnQpOworCitzdHJ1Y3Qgc29ueV9uY192YWx1ZSB7CisJY2hhciAqbmFtZTsJCS8qIG5hbWUgb2YgdGhlIGVudHJ5ICovCisJY2hhciAqKmFjcGlnZXQ7CQkvKiBuYW1lcyBvZiB0aGUgQUNQSSBnZXQgZnVuY3Rpb24gKi8KKwljaGFyICoqYWNwaXNldDsJCS8qIG5hbWVzIG9mIHRoZSBBQ1BJIHNldCBmdW5jdGlvbiAqLworCWludCAoKnZhbGlkYXRlKShjb25zdCBpbnQsIGNvbnN0IGludCk7CS8qIGlucHV0L291dHB1dCB2YWxpZGF0aW9uICovCisJaW50IHZhbHVlOwkJLyogY3VycmVudCBzZXR0aW5nICovCisJaW50IHZhbGlkOwkJLyogSGFzIGV2ZXIgYmVlbiBzZXQgKi8KKwlpbnQgZGVidWc7CQkvKiBhY3RpdmUgb25seSBpbiBkZWJ1ZyBtb2RlID8gKi8KKwlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSBkZXZhdHRyOwkvKiBzeXNmcyBhdHJpYnV0ZSAqLworfTsKKworI2RlZmluZSBTTkNfSEFORExFX05BTUVTKF9uYW1lLCBfdmFsdWVzLi4uKSBcCisJc3RhdGljIGNoYXIgKnNuY18jI19uYW1lW10gPSB7IF92YWx1ZXMsIE5VTEwgfQorCisjZGVmaW5lIFNOQ19IQU5ETEUoX25hbWUsIF9nZXR0ZXJzLCBfc2V0dGVycywgX3ZhbGlkYXRlLCBfZGVidWcpIFwKKwl7IFwKKwkJLm5hbWUJCT0gX19zdHJpbmdpZnkoX25hbWUpLCBcCisJCS5hY3BpZ2V0CT0gX2dldHRlcnMsIFwKKwkJLmFjcGlzZXQJPSBfc2V0dGVycywgXAorCQkudmFsaWRhdGUJPSBfdmFsaWRhdGUsIFwKKwkJLmRlYnVnCQk9IF9kZWJ1ZywgXAorCQkuZGV2YXR0cgk9IF9fQVRUUihfbmFtZSwgMCwgc29ueV9uY19zeXNmc19zaG93LCBzb255X25jX3N5c2ZzX3N0b3JlKSwgXAorCX0KKworI2RlZmluZSBTTkNfSEFORExFX05VTEwJeyAubmFtZSA9IE5VTEwgfQorCitTTkNfSEFORExFX05BTUVTKGZua2V5X2dldCwgIkdIS0UiKTsKKworU05DX0hBTkRMRV9OQU1FUyhicmlnaHRuZXNzX2RlZl9nZXQsICJHUEJSIik7CitTTkNfSEFORExFX05BTUVTKGJyaWdodG5lc3NfZGVmX3NldCwgIlNQQlIiKTsKKworU05DX0hBTkRMRV9OQU1FUyhjZHBvd2VyX2dldCwgIkdDRFAiKTsKK1NOQ19IQU5ETEVfTkFNRVMoY2Rwb3dlcl9zZXQsICJTQ0RQIiwgIkNEUFciKTsKKworU05DX0hBTkRMRV9OQU1FUyhhdWRpb3Bvd2VyX2dldCwgIkdBWlAiKTsKK1NOQ19IQU5ETEVfTkFNRVMoYXVkaW9wb3dlcl9zZXQsICJBWlBXIik7CisKK1NOQ19IQU5ETEVfTkFNRVMobGFucG93ZXJfZ2V0LCAiR0xOUCIpOworU05DX0hBTkRMRV9OQU1FUyhsYW5wb3dlcl9zZXQsICJMTlBXIik7CisKK1NOQ19IQU5ETEVfTkFNRVMobGlkc3RhdGVfZ2V0LCAiR0xJRCIpOworCitTTkNfSEFORExFX05BTUVTKGluZGljYXRvcmxhbXBfZ2V0LCAiR0lMUyIpOworU05DX0hBTkRMRV9OQU1FUyhpbmRpY2F0b3JsYW1wX3NldCwgIlNJTFMiKTsKKworU05DX0hBTkRMRV9OQU1FUyhnYWluYmFzc19nZXQsICJHTUdCIik7CitTTkNfSEFORExFX05BTUVTKGdhaW5iYXNzX3NldCwgIkNNR0IiKTsKKworU05DX0hBTkRMRV9OQU1FUyhQSURfZ2V0LCAiR1BJRCIpOworCitTTkNfSEFORExFX05BTUVTKENUUl9nZXQsICJHQ1RSIik7CitTTkNfSEFORExFX05BTUVTKENUUl9zZXQsICJTQ1RSIik7CisKK1NOQ19IQU5ETEVfTkFNRVMoUENSX2dldCwgIkdQQ1IiKTsKK1NOQ19IQU5ETEVfTkFNRVMoUENSX3NldCwgIlNQQ1IiKTsKKworU05DX0hBTkRMRV9OQU1FUyhDTUlfZ2V0LCAiR0NNSSIpOworU05DX0hBTkRMRV9OQU1FUyhDTUlfc2V0LCAiU0NNSSIpOworCitzdGF0aWMgc3RydWN0IHNvbnlfbmNfdmFsdWUgc29ueV9uY192YWx1ZXNbXSA9IHsKKwlTTkNfSEFORExFKGJyaWdodG5lc3NfZGVmYXVsdCwgc25jX2JyaWdodG5lc3NfZGVmX2dldCwKKwkJCXNuY19icmlnaHRuZXNzX2RlZl9zZXQsIGJyaWdodG5lc3NfZGVmYXVsdF92YWxpZGF0ZSwgMCksCisJU05DX0hBTkRMRShmbmtleSwgc25jX2Zua2V5X2dldCwgTlVMTCwgTlVMTCwgMCksCisJU05DX0hBTkRMRShjZHBvd2VyLCBzbmNfY2Rwb3dlcl9nZXQsIHNuY19jZHBvd2VyX3NldCwgYm9vbGVhbl92YWxpZGF0ZSwgMCksCisJU05DX0hBTkRMRShhdWRpb3Bvd2VyLCBzbmNfYXVkaW9wb3dlcl9nZXQsIHNuY19hdWRpb3Bvd2VyX3NldCwKKwkJCWJvb2xlYW5fdmFsaWRhdGUsIDApLAorCVNOQ19IQU5ETEUobGFucG93ZXIsIHNuY19sYW5wb3dlcl9nZXQsIHNuY19sYW5wb3dlcl9zZXQsCisJCQlib29sZWFuX3ZhbGlkYXRlLCAxKSwKKwlTTkNfSEFORExFKGxpZHN0YXRlLCBzbmNfbGlkc3RhdGVfZ2V0LCBOVUxMLAorCQkJYm9vbGVhbl92YWxpZGF0ZSwgMCksCisJU05DX0hBTkRMRShpbmRpY2F0b3JsYW1wLCBzbmNfaW5kaWNhdG9ybGFtcF9nZXQsIHNuY19pbmRpY2F0b3JsYW1wX3NldCwKKwkJCWJvb2xlYW5fdmFsaWRhdGUsIDApLAorCVNOQ19IQU5ETEUoZ2FpbmJhc3MsIHNuY19nYWluYmFzc19nZXQsIHNuY19nYWluYmFzc19zZXQsCisJCQlib29sZWFuX3ZhbGlkYXRlLCAwKSwKKwkvKiB1bmtub3duIG1ldGhvZHMgKi8KKwlTTkNfSEFORExFKFBJRCwgc25jX1BJRF9nZXQsIE5VTEwsIE5VTEwsIDEpLAorCVNOQ19IQU5ETEUoQ1RSLCBzbmNfQ1RSX2dldCwgc25jX0NUUl9zZXQsIE5VTEwsIDEpLAorCVNOQ19IQU5ETEUoUENSLCBzbmNfUENSX2dldCwgc25jX1BDUl9zZXQsIE5VTEwsIDEpLAorCVNOQ19IQU5ETEUoQ01JLCBzbmNfQ01JX2dldCwgc25jX0NNSV9zZXQsIE5VTEwsIDEpLAorCVNOQ19IQU5ETEVfTlVMTAorfTsKKworc3RhdGljIGFjcGlfaGFuZGxlIHNvbnlfbmNfYWNwaV9oYW5kbGU7CitzdGF0aWMgc3RydWN0IGFjcGlfZGV2aWNlICpzb255X25jX2FjcGlfZGV2aWNlID0gTlVMTDsKKworLyoKKyAqIGFjcGlfZXZhbHVhdGVfb2JqZWN0IHdyYXBwZXJzCisgKi8KK3N0YXRpYyBpbnQgYWNwaV9jYWxsZ2V0ZnVuYyhhY3BpX2hhbmRsZSBoYW5kbGUsIGNoYXIgKm5hbWUsIGludCAqcmVzdWx0KQoreworCXN0cnVjdCBhY3BpX2J1ZmZlciBvdXRwdXQ7CisJdW5pb24gYWNwaV9vYmplY3Qgb3V0X29iajsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisKKwlvdXRwdXQubGVuZ3RoID0gc2l6ZW9mKG91dF9vYmopOworCW91dHB1dC5wb2ludGVyID0gJm91dF9vYmo7CisKKwlzdGF0dXMgPSBhY3BpX2V2YWx1YXRlX29iamVjdChoYW5kbGUsIG5hbWUsIE5VTEwsICZvdXRwdXQpOworCWlmICgoc3RhdHVzID09IEFFX09LKSAmJiAob3V0X29iai50eXBlID09IEFDUElfVFlQRV9JTlRFR0VSKSkgeworCQkqcmVzdWx0ID0gb3V0X29iai5pbnRlZ2VyLnZhbHVlOworCQlyZXR1cm4gMDsKKwl9CisKKwlwcmludGsoS0VSTl9XQVJOSU5HIERSVl9QRlggImFjcGlfY2FsbHJlYWRmdW5jIGZhaWxlZFxuIik7CisKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgYWNwaV9jYWxsc2V0ZnVuYyhhY3BpX2hhbmRsZSBoYW5kbGUsIGNoYXIgKm5hbWUsIGludCB2YWx1ZSwKKwkJCSAgICBpbnQgKnJlc3VsdCkKK3sKKwlzdHJ1Y3QgYWNwaV9vYmplY3RfbGlzdCBwYXJhbXM7CisJdW5pb24gYWNwaV9vYmplY3QgaW5fb2JqOworCXN0cnVjdCBhY3BpX2J1ZmZlciBvdXRwdXQ7CisJdW5pb24gYWNwaV9vYmplY3Qgb3V0X29iajsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisKKwlwYXJhbXMuY291bnQgPSAxOworCXBhcmFtcy5wb2ludGVyID0gJmluX29iajsKKwlpbl9vYmoudHlwZSA9IEFDUElfVFlQRV9JTlRFR0VSOworCWluX29iai5pbnRlZ2VyLnZhbHVlID0gdmFsdWU7CisKKwlvdXRwdXQubGVuZ3RoID0gc2l6ZW9mKG91dF9vYmopOworCW91dHB1dC5wb2ludGVyID0gJm91dF9vYmo7CisKKwlzdGF0dXMgPSBhY3BpX2V2YWx1YXRlX29iamVjdChoYW5kbGUsIG5hbWUsICZwYXJhbXMsICZvdXRwdXQpOworCWlmIChzdGF0dXMgPT0gQUVfT0spIHsKKwkJaWYgKHJlc3VsdCAhPSBOVUxMKSB7CisJCQlpZiAob3V0X29iai50eXBlICE9IEFDUElfVFlQRV9JTlRFR0VSKSB7CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyBEUlZfUEZYICJhY3BpX2V2YWx1YXRlX29iamVjdCBiYWQgIgorCQkJCSAgICAgICAicmV0dXJuIHR5cGVcbiIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCSpyZXN1bHQgPSBvdXRfb2JqLmludGVnZXIudmFsdWU7CisJCX0KKwkJcmV0dXJuIDA7CisJfQorCisJcHJpbnRrKEtFUk5fV0FSTklORyBEUlZfUEZYICJhY3BpX2V2YWx1YXRlX29iamVjdCBmYWlsZWRcbiIpOworCisJcmV0dXJuIC0xOworfQorCisvKgorICogc29ueV9uY192YWx1ZXMgaW5wdXQvb3V0cHV0IHZhbGlkYXRlIGZ1bmN0aW9ucworICovCisKKy8qIGJyaWdodG5lc3NfZGVmYXVsdF92YWxpZGF0ZToKKyAqCisgKiBtYW5pcHVsYXRlIGlucHV0IG91dHB1dCB2YWx1ZXMgdG8ga2VlcCBjb25zaXN0ZW5jeSB3aXRoIHRoZQorICogYmFja2xpZ2h0IGZyYW1ld29yayBmb3Igd2hpY2ggYnJpZ2h0bmVzcyB2YWx1ZXMgYXJlIDAtYmFzZWQuCisgKi8KK3N0YXRpYyBpbnQgYnJpZ2h0bmVzc19kZWZhdWx0X3ZhbGlkYXRlKGNvbnN0IGludCBkaXJlY3Rpb24sIGNvbnN0IGludCB2YWx1ZSkKK3sKKwlzd2l0Y2ggKGRpcmVjdGlvbikgeworCQljYXNlIFNOQ19WQUxJREFURV9PVVQ6CisJCQlyZXR1cm4gdmFsdWUgLSAxOworCQljYXNlIFNOQ19WQUxJREFURV9JTjoKKwkJCWlmICh2YWx1ZSA+PSAwICYmIHZhbHVlIDwgU09OWV9NQVhfQlJJR0hUTkVTUykKKwkJCQlyZXR1cm4gdmFsdWUgKyAxOworCX0KKwlyZXR1cm4gLUVJTlZBTDsKK30KKworLyogYm9vbGVhbl92YWxpZGF0ZToKKyAqCisgKiBvbiBpbnB1dCB2YWxpZGF0ZSBib29sZWFuIHZhbHVlcyAwLzEsIG9uIG91dHB1dCBqdXN0IHBhc3MgdGhlCisgKiByZWNlaXZlZCB2YWx1ZS4KKyAqLworc3RhdGljIGludCBib29sZWFuX3ZhbGlkYXRlKGNvbnN0IGludCBkaXJlY3Rpb24sIGNvbnN0IGludCB2YWx1ZSkKK3sKKwlpZiAoZGlyZWN0aW9uID09IFNOQ19WQUxJREFURV9JTikgeworCQlpZiAodmFsdWUgIT0gMCAmJiB2YWx1ZSAhPSAxKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldHVybiB2YWx1ZTsKK30KKworLyoKKyAqIFN5c2ZzIHNob3cvc3RvcmUgY29tbW9uIHRvIGFsbCBzb255X25jX3ZhbHVlcworICovCitzdGF0aWMgc3NpemVfdCBzb255X25jX3N5c2ZzX3Nob3coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgICAgIGNoYXIgKmJ1ZmZlcikKK3sKKwlpbnQgdmFsdWU7CisJc3RydWN0IHNvbnlfbmNfdmFsdWUgKml0ZW0gPQorCSAgICBjb250YWluZXJfb2YoYXR0ciwgc3RydWN0IHNvbnlfbmNfdmFsdWUsIGRldmF0dHIpOworCisJaWYgKCEqaXRlbS0+YWNwaWdldCkKKwkJcmV0dXJuIC1FSU87CisKKwlpZiAoYWNwaV9jYWxsZ2V0ZnVuYyhzb255X25jX2FjcGlfaGFuZGxlLCAqaXRlbS0+YWNwaWdldCwgJnZhbHVlKSA8IDApCisJCXJldHVybiAtRUlPOworCisJaWYgKGl0ZW0tPnZhbGlkYXRlKQorCQl2YWx1ZSA9IGl0ZW0tPnZhbGlkYXRlKFNOQ19WQUxJREFURV9PVVQsIHZhbHVlKTsKKworCXJldHVybiBzbnByaW50ZihidWZmZXIsIFBBR0VfU0laRSwgIiVkXG4iLCB2YWx1ZSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNvbnlfbmNfc3lzZnNfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAorCQkJICAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJICAgICAgIGNvbnN0IGNoYXIgKmJ1ZmZlciwgc2l6ZV90IGNvdW50KQoreworCWludCB2YWx1ZTsKKwlzdHJ1Y3Qgc29ueV9uY192YWx1ZSAqaXRlbSA9CisJICAgIGNvbnRhaW5lcl9vZihhdHRyLCBzdHJ1Y3Qgc29ueV9uY192YWx1ZSwgZGV2YXR0cik7CisKKwlpZiAoIWl0ZW0tPmFjcGlzZXQpCisJCXJldHVybiAtRUlPOworCisJaWYgKGNvdW50ID4gMzEpCisJCXJldHVybiAtRUlOVkFMOworCisJdmFsdWUgPSBzaW1wbGVfc3RydG91bChidWZmZXIsIE5VTEwsIDEwKTsKKworCWlmIChpdGVtLT52YWxpZGF0ZSkKKwkJdmFsdWUgPSBpdGVtLT52YWxpZGF0ZShTTkNfVkFMSURBVEVfSU4sIHZhbHVlKTsKKworCWlmICh2YWx1ZSA8IDApCisJCXJldHVybiB2YWx1ZTsKKworCWlmIChhY3BpX2NhbGxzZXRmdW5jKHNvbnlfbmNfYWNwaV9oYW5kbGUsICppdGVtLT5hY3Bpc2V0LCB2YWx1ZSwgTlVMTCkgPCAwKQorCQlyZXR1cm4gLUVJTzsKKwlpdGVtLT52YWx1ZSA9IHZhbHVlOworCWl0ZW0tPnZhbGlkID0gMTsKKwlyZXR1cm4gY291bnQ7Cit9CisKKworLyoKKyAqIEJhY2tsaWdodCBkZXZpY2UKKyAqLworc3RhdGljIGludCBzb255X2JhY2tsaWdodF91cGRhdGVfc3RhdHVzKHN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICpiZCkKK3sKKwlyZXR1cm4gYWNwaV9jYWxsc2V0ZnVuYyhzb255X25jX2FjcGlfaGFuZGxlLCAiU0JSVCIsCisJCQkJYmQtPnByb3BzLmJyaWdodG5lc3MgKyAxLCBOVUxMKTsKK30KKworc3RhdGljIGludCBzb255X2JhY2tsaWdodF9nZXRfYnJpZ2h0bmVzcyhzdHJ1Y3QgYmFja2xpZ2h0X2RldmljZSAqYmQpCit7CisJaW50IHZhbHVlOworCisJaWYgKGFjcGlfY2FsbGdldGZ1bmMoc29ueV9uY19hY3BpX2hhbmRsZSwgIkdCUlQiLCAmdmFsdWUpKQorCQlyZXR1cm4gMDsKKwkvKiBicmlnaHRuZXNzIGxldmVscyBhcmUgMS1iYXNlZCwgd2hpbGUgYmFja2xpZ2h0IG9uZXMgYXJlIDAtYmFzZWQgKi8KKwlyZXR1cm4gdmFsdWUgLSAxOworfQorCitzdGF0aWMgc3RydWN0IGJhY2tsaWdodF9kZXZpY2UgKnNvbnlfYmFja2xpZ2h0X2RldmljZTsKK3N0YXRpYyBzdHJ1Y3QgYmFja2xpZ2h0X29wcyBzb255X2JhY2tsaWdodF9vcHMgPSB7CisJLnVwZGF0ZV9zdGF0dXMgPSBzb255X2JhY2tsaWdodF91cGRhdGVfc3RhdHVzLAorCS5nZXRfYnJpZ2h0bmVzcyA9IHNvbnlfYmFja2xpZ2h0X2dldF9icmlnaHRuZXNzLAorfTsKKworLyoKKyAqIE5ldyBTTkMtb25seSBWYWlvcyBldmVudCBtYXBwaW5nIHRvIGRyaXZlciBrbm93biBrZXlzCisgKi8KK3N0cnVjdCBzb255X25jX2V2ZW50IHsKKwl1OAlkYXRhOworCXU4CWV2ZW50OworfTsKKworc3RhdGljIHN0cnVjdCBzb255X25jX2V2ZW50ICpzb255X25jX2V2ZW50czsKKworLyogVmFpbyBDKiAtLW1heWJlIGFsc28gRkUqLCBOKiBhbmQgQVIqID8tLSBzcGVjaWFsIGluaXQgc2VxdWVuY2UKKyAqIGZvciBGbiBrZXlzCisgKi8KK3N0YXRpYyBpbnQgc29ueV9uY19DX2VuYWJsZShjb25zdCBzdHJ1Y3QgZG1pX3N5c3RlbV9pZCAqaWQpCit7CisJaW50IHJlc3VsdCA9IDA7CisKKwlwcmludGsoS0VSTl9OT1RJQ0UgRFJWX1BGWCAiZGV0ZWN0ZWQgJXNcbiIsIGlkLT5pZGVudCk7CisKKwlzb255X25jX2V2ZW50cyA9IGlkLT5kcml2ZXJfZGF0YTsKKworCWlmIChhY3BpX2NhbGxzZXRmdW5jKHNvbnlfbmNfYWNwaV9oYW5kbGUsICJTTjAyIiwgMHg0LCAmcmVzdWx0KSA8IDAKKwkJCXx8IGFjcGlfY2FsbHNldGZ1bmMoc29ueV9uY19hY3BpX2hhbmRsZSwgIlNOMDciLCAweDIsICZyZXN1bHQpIDwgMAorCQkJfHwgYWNwaV9jYWxsc2V0ZnVuYyhzb255X25jX2FjcGlfaGFuZGxlLCAiU04wMiIsIDB4MTAsICZyZXN1bHQpIDwgMAorCQkJfHwgYWNwaV9jYWxsc2V0ZnVuYyhzb255X25jX2FjcGlfaGFuZGxlLCAiU04wNyIsIDB4MCwgJnJlc3VsdCkgPCAwCisJCQl8fCBhY3BpX2NhbGxzZXRmdW5jKHNvbnlfbmNfYWNwaV9oYW5kbGUsICJTTjAzIiwgMHgyLCAmcmVzdWx0KSA8IDAKKwkJCXx8IGFjcGlfY2FsbHNldGZ1bmMoc29ueV9uY19hY3BpX2hhbmRsZSwgIlNOMDciLCAweDEwMSwgJnJlc3VsdCkgPCAwKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgRFJWX1BGWCAiZmFpbGVkIHRvIGluaXRpYWxpemUgU05DLCBzb21lICIKKwkJCQkiZnVuY3Rpb25hbGl0aWVzIG1heSBiZSBtaXNzaW5nXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHNvbnlfbmNfZXZlbnQgc29ueV9DX2V2ZW50c1tdID0geworCXsgMHg4MSwgU09OWVBJX0VWRU5UX0ZOS0VZX0YxIH0sCisJeyAweDAxLCBTT05ZUElfRVZFTlRfRk5LRVlfUkVMRUFTRUQgfSwKKwl7IDB4ODUsIFNPTllQSV9FVkVOVF9GTktFWV9GNSB9LAorCXsgMHgwNSwgU09OWVBJX0VWRU5UX0ZOS0VZX1JFTEVBU0VEIH0sCisJeyAweDg2LCBTT05ZUElfRVZFTlRfRk5LRVlfRjYgfSwKKwl7IDB4MDYsIFNPTllQSV9FVkVOVF9GTktFWV9SRUxFQVNFRCB9LAorCXsgMHg4NywgU09OWVBJX0VWRU5UX0ZOS0VZX0Y3IH0sCisJeyAweDA3LCBTT05ZUElfRVZFTlRfRk5LRVlfUkVMRUFTRUQgfSwKKwl7IDB4OEEsIFNPTllQSV9FVkVOVF9GTktFWV9GMTAgfSwKKwl7IDB4MEEsIFNPTllQSV9FVkVOVF9GTktFWV9SRUxFQVNFRCB9LAorCXsgMHg4QywgU09OWVBJX0VWRU5UX0ZOS0VZX0YxMiB9LAorCXsgMHgwQywgU09OWVBJX0VWRU5UX0ZOS0VZX1JFTEVBU0VEIH0sCisJeyAwLCAwIH0sCit9OworCisvKiBTTkMtb25seSBtb2RlbCBtYXAgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZG1pX3N5c3RlbV9pZCBzb255X25jX2lkc1tdID0geworCQl7CisJCQkuaWRlbnQgPSAiU29ueSBWYWlvIEZFIFNlcmllcyIsCisJCQkuY2FsbGJhY2sgPSBzb255X25jX0NfZW5hYmxlLAorCQkJLmRyaXZlcl9kYXRhID0gc29ueV9DX2V2ZW50cywKKwkJCS5tYXRjaGVzID0geworCQkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIlNvbnkgQ29ycG9yYXRpb24iKSwKKwkJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIlZHTi1GRSIpLAorCQkJfSwKKwkJfSwKKwkJeworCQkJLmlkZW50ID0gIlNvbnkgVmFpbyBGWiBTZXJpZXMiLAorCQkJLmNhbGxiYWNrID0gc29ueV9uY19DX2VuYWJsZSwKKwkJCS5kcml2ZXJfZGF0YSA9IHNvbnlfQ19ldmVudHMsCisJCQkubWF0Y2hlcyA9IHsKKwkJCQlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJTb255IENvcnBvcmF0aW9uIiksCisJCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJWR04tRloiKSwKKwkJCX0sCisJCX0sCisJCXsKKwkJCS5pZGVudCA9ICJTb255IFZhaW8gQyBTZXJpZXMiLAorCQkJLmNhbGxiYWNrID0gc29ueV9uY19DX2VuYWJsZSwKKwkJCS5kcml2ZXJfZGF0YSA9IHNvbnlfQ19ldmVudHMsCisJCQkubWF0Y2hlcyA9IHsKKwkJCQlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJTb255IENvcnBvcmF0aW9uIiksCisJCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJWR04tQyIpLAorCQkJfSwKKwkJfSwKKwkJeworCQkJLmlkZW50ID0gIlNvbnkgVmFpbyBOIFNlcmllcyIsCisJCQkuY2FsbGJhY2sgPSBzb255X25jX0NfZW5hYmxlLAorCQkJLmRyaXZlcl9kYXRhID0gc29ueV9DX2V2ZW50cywKKwkJCS5tYXRjaGVzID0geworCQkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIlNvbnkgQ29ycG9yYXRpb24iKSwKKwkJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIlZHTi1OIiksCisJCQl9LAorCQl9LAorCQl7IH0KK307CisKKy8qCisgKiBBQ1BJIGNhbGxiYWNrcworICovCitzdGF0aWMgdm9pZCBzb255X2FjcGlfbm90aWZ5KGFjcGlfaGFuZGxlIGhhbmRsZSwgdTMyIGV2ZW50LCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBzb255X25jX2V2ZW50ICpldm1hcDsKKwl1MzIgZXYgPSBldmVudDsKKwlpbnQgcmVzdWx0OworCisJaWYgKGV2ID09IDB4OTIpIHsKKwkJLyogcmVhZCB0aGUga2V5IHByZXNzZWQgZnJvbSBFQy5HRUNSCisJCSAqIEEgY2FsbCB0byBTTjA3IHdpdGggMHgwMjAyIHdpbGwgZG8gaXQgYXMgd2VsbCByZXNwZWN0aW5nCisJCSAqIHRoZSBjdXJyZW50IHByb3RvY29sIG9uIGRpZmZlcmVudCBPU2VzCisJCSAqCisJCSAqIE5vdGU6IHRoZSBwYXRoIGZvciBHRUNSIG1heSBiZQorCQkgKiAgIFxfU0IuUENJMC5MUENCLkVDIChDLCBGRSwgQVIsIE4gYW5kIGZyaWVuZHMpCisJCSAqICAgXF9TQi5QQ0kwLlBJQi5FQzAgKFZHTi1GUiBub3RpZmljYXRpb25zIGFyZSBzZW50IGRpcmVjdGx5LCBubyBHRUNSKQorCQkgKgorCQkgKiBUT0RPOiB3ZSBtYXkgd2FudCB0byBkbyB0aGUgc2FtZSBmb3IgdGhlIG9sZGVyIEdIS0UgLW5lZWQKKwkJICogICAgICAgZG1pIGxpc3QtIHNvIHRoaXMgc25pcHBldCBtYXkgYmVjb21lIG9uZSBtb3JlIGNhbGxiYWNrLgorCQkgKi8KKwkJaWYgKGFjcGlfY2FsbHNldGZ1bmMoaGFuZGxlLCAiU04wNyIsIDB4MDIwMiwgJnJlc3VsdCkgPCAwKQorCQkJZHByaW50aygic29ueV9hY3BpX25vdGlmeSwgdW5hYmxlIHRvIGRlY29kZSBldmVudCAweCUuMnhcbiIsIGV2KTsKKwkJZWxzZQorCQkJZXYgPSByZXN1bHQgJiAweEZGOworCX0KKworCWlmIChzb255X25jX2V2ZW50cykKKwkJZm9yIChldm1hcCA9IHNvbnlfbmNfZXZlbnRzOyBldm1hcC0+ZXZlbnQ7IGV2bWFwKyspIHsKKwkJCWlmIChldm1hcC0+ZGF0YSA9PSBldikgeworCQkJCWV2ID0gZXZtYXAtPmV2ZW50OworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwlkcHJpbnRrKCJzb255X2FjcGlfbm90aWZ5LCBldmVudDogMHglLjJ4XG4iLCBldik7CisJc29ueV9sYXB0b3BfcmVwb3J0X2lucHV0X2V2ZW50KGV2KTsKKwlhY3BpX2J1c19nZW5lcmF0ZV9wcm9jX2V2ZW50KHNvbnlfbmNfYWNwaV9kZXZpY2UsIDEsIGV2KTsKK30KKworc3RhdGljIGFjcGlfc3RhdHVzIHNvbnlfd2Fsa19jYWxsYmFjayhhY3BpX2hhbmRsZSBoYW5kbGUsIHUzMiBsZXZlbCwKKwkJCQkgICAgICB2b2lkICpjb250ZXh0LCB2b2lkICoqcmV0dXJuX3ZhbHVlKQoreworCXN0cnVjdCBhY3BpX2RldmljZV9pbmZvICppbmZvOworCXN0cnVjdCBhY3BpX2J1ZmZlciBidWZmZXIgPSB7QUNQSV9BTExPQ0FURV9CVUZGRVIsIE5VTEx9OworCisJaWYgKEFDUElfU1VDQ0VTUyhhY3BpX2dldF9vYmplY3RfaW5mbyhoYW5kbGUsICZidWZmZXIpKSkgeworCQlpbmZvID0gYnVmZmVyLnBvaW50ZXI7CisKKwkJcHJpbnRrKEtFUk5fV0FSTklORyBEUlZfUEZYICJtZXRob2Q6IG5hbWU6ICU0LjRzLCBhcmdzICVYXG4iLAorCQkJKGNoYXIgKikmaW5mby0+bmFtZSwgaW5mby0+cGFyYW1fY291bnQpOworCisJCWtmcmVlKGJ1ZmZlci5wb2ludGVyKTsKKwl9CisKKwlyZXR1cm4gQUVfT0s7Cit9CisKKy8qCisgKiBBQ1BJIGRldmljZQorICovCitzdGF0aWMgaW50IHNvbnlfbmNfcmVzdW1lKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKQoreworCXN0cnVjdCBzb255X25jX3ZhbHVlICppdGVtOworCisJZm9yIChpdGVtID0gc29ueV9uY192YWx1ZXM7IGl0ZW0tPm5hbWU7IGl0ZW0rKykgeworCQlpbnQgcmV0OworCisJCWlmICghaXRlbS0+dmFsaWQpCisJCQljb250aW51ZTsKKwkJcmV0ID0gYWNwaV9jYWxsc2V0ZnVuYyhzb255X25jX2FjcGlfaGFuZGxlLCAqaXRlbS0+YWNwaXNldCwKKwkJCQkgICAgICAgaXRlbS0+dmFsdWUsIE5VTEwpOworCQlpZiAocmV0IDwgMCkgeworCQkJcHJpbnRrKCIlczogJWRcbiIsIF9fZnVuY19fLCByZXQpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvKiBzZXQgdGhlIGxhc3QgcmVxdWVzdGVkIGJyaWdodG5lc3MgbGV2ZWwgKi8KKwlpZiAoc29ueV9iYWNrbGlnaHRfZGV2aWNlICYmCisJCQkhc29ueV9iYWNrbGlnaHRfdXBkYXRlX3N0YXR1cyhzb255X2JhY2tsaWdodF9kZXZpY2UpKQorCQlwcmludGsoS0VSTl9XQVJOSU5HIERSVl9QRlggInVuYWJsZSB0byByZXN0b3JlIGJyaWdodG5lc3MgbGV2ZWxcbiIpOworCisJLyogcmUtaW5pdGlhbGl6ZSBtb2RlbHMgd2l0aCBzcGVjaWZpYyByZXF1aXJlbWVudHMgKi8KKwlkbWlfY2hlY2tfc3lzdGVtKHNvbnlfbmNfaWRzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNvbnlfbmNfYWRkKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKQoreworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwlpbnQgcmVzdWx0ID0gMDsKKwlhY3BpX2hhbmRsZSBoYW5kbGU7CisJc3RydWN0IHNvbnlfbmNfdmFsdWUgKml0ZW07CisKKwlwcmludGsoS0VSTl9JTkZPIERSVl9QRlggIiVzIHYlcy5cbiIsCisJCVNPTllfTkNfRFJJVkVSX05BTUUsIFNPTllfTEFQVE9QX0RSSVZFUl9WRVJTSU9OKTsKKworCXNvbnlfbmNfYWNwaV9kZXZpY2UgPSBkZXZpY2U7CisJc3RyY3B5KGFjcGlfZGV2aWNlX2NsYXNzKGRldmljZSksICJzb255L2hvdGtleSIpOworCisJc29ueV9uY19hY3BpX2hhbmRsZSA9IGRldmljZS0+aGFuZGxlOworCisJLyogcmVhZCBkZXZpY2Ugc3RhdHVzICovCisJcmVzdWx0ID0gYWNwaV9idXNfZ2V0X3N0YXR1cyhkZXZpY2UpOworCS8qIGJhaWwgSUZGIHRoZSBhYm92ZSBjYWxsIHdhcyBzdWNjZXNzZnVsIGFuZCB0aGUgZGV2aWNlIGlzIG5vdCBwcmVzZW50ICovCisJaWYgKCFyZXN1bHQgJiYgIWRldmljZS0+c3RhdHVzLnByZXNlbnQpIHsKKwkJZHByaW50aygiRGV2aWNlIG5vdCBwcmVzZW50XG4iKTsKKwkJcmVzdWx0ID0gLUVOT0RFVjsKKwkJZ290byBvdXR3YWxrOworCX0KKworCWlmIChkZWJ1ZykgeworCQlzdGF0dXMgPSBhY3BpX3dhbGtfbmFtZXNwYWNlKEFDUElfVFlQRV9NRVRIT0QsIHNvbnlfbmNfYWNwaV9oYW5kbGUsCisJCQkJCSAgICAgMSwgc29ueV93YWxrX2NhbGxiYWNrLCBOVUxMLCBOVUxMKTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HIERSVl9QRlggInVuYWJsZSB0byB3YWxrIGFjcGkgcmVzb3VyY2VzXG4iKTsKKwkJCXJlc3VsdCA9IC1FTk9ERVY7CisJCQlnb3RvIG91dHdhbGs7CisJCX0KKwl9CisKKwkvKiB0cnkgdG8gX0lOSSB0aGUgZGV2aWNlIGlmIHN1Y2ggbWV0aG9kIGV4aXN0cyAoQUNQSSBzcGVjIDMuMC02LjUuMQorCSAqIHNob3VsZCBiZSByZXNwZWN0ZWQgYXMgd2UgYWxyZWFkeSBjaGVja2VkIGZvciB0aGUgZGV2aWNlIHByZXNlbmNlIGFib3ZlICovCisJaWYgKEFDUElfU1VDQ0VTUyhhY3BpX2dldF9oYW5kbGUoc29ueV9uY19hY3BpX2hhbmRsZSwgTUVUSE9EX05BTUVfX0lOSSwgJmhhbmRsZSkpKSB7CisJCWRwcmludGsoIkludm9raW5nIF9JTklcbiIpOworCQlpZiAoQUNQSV9GQUlMVVJFKGFjcGlfZXZhbHVhdGVfb2JqZWN0KHNvbnlfbmNfYWNwaV9oYW5kbGUsIE1FVEhPRF9OQU1FX19JTkksCisJCQkJCQlOVUxMLCBOVUxMKSkpCisJCQlkcHJpbnRrKCJfSU5JIE1ldGhvZCBmYWlsZWRcbiIpOworCX0KKworCS8qIHNldHVwIGlucHV0IGRldmljZXMgYW5kIGhlbHBlciBmaWZvICovCisJcmVzdWx0ID0gc29ueV9sYXB0b3Bfc2V0dXBfaW5wdXQoZGV2aWNlKTsKKwlpZiAocmVzdWx0KSB7CisJCXByaW50ayhLRVJOX0VSUiBEUlZfUEZYCisJCQkJIlVuYWJlIHRvIGNyZWF0ZSBpbnB1dCBkZXZpY2VzLlxuIik7CisJCWdvdG8gb3V0d2FsazsKKwl9CisKKwlzdGF0dXMgPSBhY3BpX2luc3RhbGxfbm90aWZ5X2hhbmRsZXIoc29ueV9uY19hY3BpX2hhbmRsZSwKKwkJCQkJICAgICBBQ1BJX0RFVklDRV9OT1RJRlksCisJCQkJCSAgICAgc29ueV9hY3BpX25vdGlmeSwgTlVMTCk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgRFJWX1BGWCAidW5hYmxlIHRvIGluc3RhbGwgbm90aWZ5IGhhbmRsZXIgKCV1KVxuIiwgc3RhdHVzKTsKKwkJcmVzdWx0ID0gLUVOT0RFVjsKKwkJZ290byBvdXRpbnB1dDsKKwl9CisKKwlpZiAoYWNwaV92aWRlb19iYWNrbGlnaHRfc3VwcG9ydCgpKSB7CisJCXByaW50ayhLRVJOX0lORk8gRFJWX1BGWCAiYnJpZ2h0bmVzcyBpZ25vcmVkLCBtdXN0IGJlICIKKwkJICAgICAgICJjb250cm9sbGVkIGJ5IEFDUEkgdmlkZW8gZHJpdmVyXG4iKTsKKwl9IGVsc2UgaWYgKEFDUElfU1VDQ0VTUyhhY3BpX2dldF9oYW5kbGUoc29ueV9uY19hY3BpX2hhbmRsZSwgIkdCUlQiLAorCQkJCQkJJmhhbmRsZSkpKSB7CisJCXNvbnlfYmFja2xpZ2h0X2RldmljZSA9IGJhY2tsaWdodF9kZXZpY2VfcmVnaXN0ZXIoInNvbnkiLCBOVUxMLAorCQkJCQkJCQkgIE5VTEwsCisJCQkJCQkJCSAgJnNvbnlfYmFja2xpZ2h0X29wcyk7CisKKwkJaWYgKElTX0VSUihzb255X2JhY2tsaWdodF9kZXZpY2UpKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HIERSVl9QRlggInVuYWJsZSB0byByZWdpc3RlciBiYWNrbGlnaHQgZGV2aWNlXG4iKTsKKwkJCXNvbnlfYmFja2xpZ2h0X2RldmljZSA9IE5VTEw7CisJCX0gZWxzZSB7CisJCQlzb255X2JhY2tsaWdodF9kZXZpY2UtPnByb3BzLmJyaWdodG5lc3MgPQorCQkJICAgIHNvbnlfYmFja2xpZ2h0X2dldF9icmlnaHRuZXNzCisJCQkgICAgKHNvbnlfYmFja2xpZ2h0X2RldmljZSk7CisJCQlzb255X2JhY2tsaWdodF9kZXZpY2UtPnByb3BzLm1heF9icmlnaHRuZXNzID0KKwkJCSAgICBTT05ZX01BWF9CUklHSFRORVNTIC0gMTsKKwkJfQorCisJfQorCisJLyogaW5pdGlhbGl6ZSBtb2RlbHMgd2l0aCBzcGVjaWZpYyByZXF1aXJlbWVudHMgKi8KKwlkbWlfY2hlY2tfc3lzdGVtKHNvbnlfbmNfaWRzKTsKKworCXJlc3VsdCA9IHNvbnlfcGZfYWRkKCk7CisJaWYgKHJlc3VsdCkKKwkJZ290byBvdXRiYWNrbGlnaHQ7CisKKwkvKiBjcmVhdGUgc29ueV9wZiBzeXNmcyBhdHRyaWJ1dGVzIHJlbGF0ZWQgdG8gdGhlIFNOQyBkZXZpY2UgKi8KKwlmb3IgKGl0ZW0gPSBzb255X25jX3ZhbHVlczsgaXRlbS0+bmFtZTsgKytpdGVtKSB7CisKKwkJaWYgKCFkZWJ1ZyAmJiBpdGVtLT5kZWJ1ZykKKwkJCWNvbnRpbnVlOworCisJCS8qIGZpbmQgdGhlIGF2YWlsYWJsZSBhY3BpZ2V0IGFzIGRlc2NyaWJlZCBpbiB0aGUgRFNEVCAqLworCQlmb3IgKDsgaXRlbS0+YWNwaWdldCAmJiAqaXRlbS0+YWNwaWdldDsgKytpdGVtLT5hY3BpZ2V0KSB7CisJCQlpZiAoQUNQSV9TVUNDRVNTKGFjcGlfZ2V0X2hhbmRsZShzb255X25jX2FjcGlfaGFuZGxlLAorCQkJCQkJCSAqaXRlbS0+YWNwaWdldCwKKwkJCQkJCQkgJmhhbmRsZSkpKSB7CisJCQkJZHByaW50aygiRm91bmQgJXMgZ2V0dGVyOiAlc1xuIiwKKwkJCQkJCWl0ZW0tPm5hbWUsICppdGVtLT5hY3BpZ2V0KTsKKwkJCQlpdGVtLT5kZXZhdHRyLmF0dHIubW9kZSB8PSBTX0lSVUdPOworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJLyogZmluZCB0aGUgYXZhaWxhYmxlIGFjcGlzZXQgYXMgZGVzY3JpYmVkIGluIHRoZSBEU0RUICovCisJCWZvciAoOyBpdGVtLT5hY3Bpc2V0ICYmICppdGVtLT5hY3Bpc2V0OyArK2l0ZW0tPmFjcGlzZXQpIHsKKwkJCWlmIChBQ1BJX1NVQ0NFU1MoYWNwaV9nZXRfaGFuZGxlKHNvbnlfbmNfYWNwaV9oYW5kbGUsCisJCQkJCQkJICppdGVtLT5hY3Bpc2V0LAorCQkJCQkJCSAmaGFuZGxlKSkpIHsKKwkJCQlkcHJpbnRrKCJGb3VuZCAlcyBzZXR0ZXI6ICVzXG4iLAorCQkJCQkJaXRlbS0+bmFtZSwgKml0ZW0tPmFjcGlzZXQpOworCQkJCWl0ZW0tPmRldmF0dHIuYXR0ci5tb2RlIHw9IFNfSVdVU1I7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQlpZiAoaXRlbS0+ZGV2YXR0ci5hdHRyLm1vZGUgIT0gMCkgeworCQkJcmVzdWx0ID0KKwkJCSAgICBkZXZpY2VfY3JlYXRlX2ZpbGUoJnNvbnlfcGZfZGV2aWNlLT5kZXYsCisJCQkJCSAgICAgICAmaXRlbS0+ZGV2YXR0cik7CisJCQlpZiAocmVzdWx0KQorCQkJCWdvdG8gb3V0X3N5c2ZzOworCQl9CisJfQorCisJcmV0dXJuIDA7CisKKyAgICAgIG91dF9zeXNmczoKKwlmb3IgKGl0ZW0gPSBzb255X25jX3ZhbHVlczsgaXRlbS0+bmFtZTsgKytpdGVtKSB7CisJCWRldmljZV9yZW1vdmVfZmlsZSgmc29ueV9wZl9kZXZpY2UtPmRldiwgJml0ZW0tPmRldmF0dHIpOworCX0KKwlzb255X3BmX3JlbW92ZSgpOworCisgICAgICBvdXRiYWNrbGlnaHQ6CisJaWYgKHNvbnlfYmFja2xpZ2h0X2RldmljZSkKKwkJYmFja2xpZ2h0X2RldmljZV91bnJlZ2lzdGVyKHNvbnlfYmFja2xpZ2h0X2RldmljZSk7CisKKwlzdGF0dXMgPSBhY3BpX3JlbW92ZV9ub3RpZnlfaGFuZGxlcihzb255X25jX2FjcGlfaGFuZGxlLAorCQkJCQkgICAgQUNQSV9ERVZJQ0VfTk9USUZZLAorCQkJCQkgICAgc29ueV9hY3BpX25vdGlmeSk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKQorCQlwcmludGsoS0VSTl9XQVJOSU5HIERSVl9QRlggInVuYWJsZSB0byByZW1vdmUgbm90aWZ5IGhhbmRsZXJcbiIpOworCisgICAgICBvdXRpbnB1dDoKKwlzb255X2xhcHRvcF9yZW1vdmVfaW5wdXQoKTsKKworICAgICAgb3V0d2FsazoKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgaW50IHNvbnlfbmNfcmVtb3ZlKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlLCBpbnQgdHlwZSkKK3sKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJc3RydWN0IHNvbnlfbmNfdmFsdWUgKml0ZW07CisKKwlpZiAoc29ueV9iYWNrbGlnaHRfZGV2aWNlKQorCQliYWNrbGlnaHRfZGV2aWNlX3VucmVnaXN0ZXIoc29ueV9iYWNrbGlnaHRfZGV2aWNlKTsKKworCXNvbnlfbmNfYWNwaV9kZXZpY2UgPSBOVUxMOworCisJc3RhdHVzID0gYWNwaV9yZW1vdmVfbm90aWZ5X2hhbmRsZXIoc29ueV9uY19hY3BpX2hhbmRsZSwKKwkJCQkJICAgIEFDUElfREVWSUNFX05PVElGWSwKKwkJCQkJICAgIHNvbnlfYWNwaV9ub3RpZnkpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkKKwkJcHJpbnRrKEtFUk5fV0FSTklORyBEUlZfUEZYICJ1bmFibGUgdG8gcmVtb3ZlIG5vdGlmeSBoYW5kbGVyXG4iKTsKKworCWZvciAoaXRlbSA9IHNvbnlfbmNfdmFsdWVzOyBpdGVtLT5uYW1lOyArK2l0ZW0pIHsKKwkJZGV2aWNlX3JlbW92ZV9maWxlKCZzb255X3BmX2RldmljZS0+ZGV2LCAmaXRlbS0+ZGV2YXR0cik7CisJfQorCisJc29ueV9wZl9yZW1vdmUoKTsKKwlzb255X2xhcHRvcF9yZW1vdmVfaW5wdXQoKTsKKwlkcHJpbnRrKFNPTllfTkNfRFJJVkVSX05BTUUgIiByZW1vdmVkLlxuIik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBhY3BpX2RldmljZV9pZCBzb255X2RldmljZV9pZHNbXSA9IHsKKwl7U09OWV9OQ19ISUQsIDB9LAorCXtTT05ZX1BJQ19ISUQsIDB9LAorCXsiIiwgMH0sCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShhY3BpLCBzb255X2RldmljZV9pZHMpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IGFjcGlfZGV2aWNlX2lkIHNvbnlfbmNfZGV2aWNlX2lkc1tdID0geworCXtTT05ZX05DX0hJRCwgMH0sCisJeyIiLCAwfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYWNwaV9kcml2ZXIgc29ueV9uY19kcml2ZXIgPSB7CisJLm5hbWUgPSBTT05ZX05DX0RSSVZFUl9OQU1FLAorCS5jbGFzcyA9IFNPTllfTkNfQ0xBU1MsCisJLmlkcyA9IHNvbnlfbmNfZGV2aWNlX2lkcywKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkub3BzID0geworCQkuYWRkID0gc29ueV9uY19hZGQsCisJCS5yZW1vdmUgPSBzb255X25jX3JlbW92ZSwKKwkJLnJlc3VtZSA9IHNvbnlfbmNfcmVzdW1lLAorCQl9LAorfTsKKworLyoqKioqKioqKioqIFNQSUMgKFNOWTYwMDEpIERldmljZSAqKioqKioqKioqKi8KKworI2RlZmluZSBTT05ZUElfREVWSUNFX1RZUEUxCTB4MDAwMDAwMDEKKyNkZWZpbmUgU09OWVBJX0RFVklDRV9UWVBFMgkweDAwMDAwMDAyCisjZGVmaW5lIFNPTllQSV9ERVZJQ0VfVFlQRTMJMHgwMDAwMDAwNAorI2RlZmluZSBTT05ZUElfREVWSUNFX1RZUEU0CTB4MDAwMDAwMDgKKworI2RlZmluZSBTT05ZUElfVFlQRTFfT0ZGU0VUCTB4MDQKKyNkZWZpbmUgU09OWVBJX1RZUEUyX09GRlNFVAkweDEyCisjZGVmaW5lIFNPTllQSV9UWVBFM19PRkZTRVQJMHgxMgorI2RlZmluZSBTT05ZUElfVFlQRTRfT0ZGU0VUCTB4MTIKKworc3RydWN0IHNvbnlfcGljX2lvcG9ydCB7CisJc3RydWN0IGFjcGlfcmVzb3VyY2VfaW8JaW8xOworCXN0cnVjdCBhY3BpX3Jlc291cmNlX2lvCWlvMjsKKwlzdHJ1Y3QgbGlzdF9oZWFkCWxpc3Q7Cit9OworCitzdHJ1Y3Qgc29ueV9waWNfaXJxIHsKKwlzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9pcnEJaXJxOworCXN0cnVjdCBsaXN0X2hlYWQJCWxpc3Q7Cit9OworCitzdHJ1Y3Qgc29ueXBpX2V2ZW50dHlwZXMgeworCXU4CQkJZGF0YTsKKwl1bnNpZ25lZCBsb25nCQltYXNrOworCXN0cnVjdCBzb255cGlfZXZlbnQJKmV2ZW50czsKK307CisKK3N0cnVjdCBkZXZpY2VfY3RybCB7CisJaW50CQkJCW1vZGVsOworCWludAkJCQkoKmhhbmRsZV9pcnEpKGNvbnN0IHU4LCBjb25zdCB1OCk7CisJdTE2CQkJCWV2cG9ydF9vZmZzZXQ7CisJdTgJCQkJaGFzX2NhbWVyYTsKKwl1OAkJCQloYXNfYmx1ZXRvb3RoOworCXU4CQkJCWhhc193d2FuOworCXN0cnVjdCBzb255cGlfZXZlbnR0eXBlcwkqZXZlbnRfdHlwZXM7Cit9OworCitzdHJ1Y3Qgc29ueV9waWNfZGV2IHsKKwlzdHJ1Y3QgZGV2aWNlX2N0cmwJKmNvbnRyb2w7CisJc3RydWN0IGFjcGlfZGV2aWNlCSphY3BpX2RldjsKKwlzdHJ1Y3Qgc29ueV9waWNfaXJxCSpjdXJfaXJxOworCXN0cnVjdCBzb255X3BpY19pb3BvcnQJKmN1cl9pb3BvcnQ7CisJc3RydWN0IGxpc3RfaGVhZAlpbnRlcnJ1cHRzOworCXN0cnVjdCBsaXN0X2hlYWQJaW9wb3J0czsKKwlzdHJ1Y3QgbXV0ZXgJCWxvY2s7CisJdTgJCQljYW1lcmFfcG93ZXI7CisJdTgJCQlibHVldG9vdGhfcG93ZXI7CisJdTgJCQl3d2FuX3Bvd2VyOworfTsKKworc3RhdGljIHN0cnVjdCBzb255X3BpY19kZXYgc3BpY19kZXYgPSB7CisJLmludGVycnVwdHMJPSBMSVNUX0hFQURfSU5JVChzcGljX2Rldi5pbnRlcnJ1cHRzKSwKKwkuaW9wb3J0cwk9IExJU1RfSEVBRF9JTklUKHNwaWNfZGV2LmlvcG9ydHMpLAorfTsKKworLyogRXZlbnQgbWFza3MgKi8KKyNkZWZpbmUgU09OWVBJX0pPR0dFUl9NQVNLCQkJMHgwMDAwMDAwMQorI2RlZmluZSBTT05ZUElfQ0FQVFVSRV9NQVNLCQkJMHgwMDAwMDAwMgorI2RlZmluZSBTT05ZUElfRk5LRVlfTUFTSwkJCTB4MDAwMDAwMDQKKyNkZWZpbmUgU09OWVBJX0JMVUVUT09USF9NQVNLCQkJMHgwMDAwMDAwOAorI2RlZmluZSBTT05ZUElfUEtFWV9NQVNLCQkJMHgwMDAwMDAxMAorI2RlZmluZSBTT05ZUElfQkFDS19NQVNLCQkJMHgwMDAwMDAyMAorI2RlZmluZSBTT05ZUElfSEVMUF9NQVNLCQkJMHgwMDAwMDA0MAorI2RlZmluZSBTT05ZUElfTElEX01BU0sJCQkJMHgwMDAwMDA4MAorI2RlZmluZSBTT05ZUElfWk9PTV9NQVNLCQkJMHgwMDAwMDEwMAorI2RlZmluZSBTT05ZUElfVEhVTUJQSFJBU0VfTUFTSwkJCTB4MDAwMDAyMDAKKyNkZWZpbmUgU09OWVBJX01FWUVfTUFTSwkJCTB4MDAwMDA0MDAKKyNkZWZpbmUgU09OWVBJX01FTU9SWVNUSUNLX01BU0sJCQkweDAwMDAwODAwCisjZGVmaW5lIFNPTllQSV9CQVRURVJZX01BU0sJCQkweDAwMDAxMDAwCisjZGVmaW5lIFNPTllQSV9XSVJFTEVTU19NQVNLCQkJMHgwMDAwMjAwMAorCitzdHJ1Y3Qgc29ueXBpX2V2ZW50IHsKKwl1OAlkYXRhOworCXU4CWV2ZW50OworfTsKKworLyogVGhlIHNldCBvZiBwb3NzaWJsZSBidXR0b24gcmVsZWFzZSBldmVudHMgKi8KK3N0YXRpYyBzdHJ1Y3Qgc29ueXBpX2V2ZW50IHNvbnlwaV9yZWxlYXNlZXZbXSA9IHsKKwl7IDB4MDAsIFNPTllQSV9FVkVOVF9BTllCVVRUT05fUkVMRUFTRUQgfSwKKwl7IDAsIDAgfQorfTsKKworLyogVGhlIHNldCBvZiBwb3NzaWJsZSBqb2dnZXIgZXZlbnRzICAqLworc3RhdGljIHN0cnVjdCBzb255cGlfZXZlbnQgc29ueXBpX2pvZ2dlcmV2W10gPSB7CisJeyAweDFmLCBTT05ZUElfRVZFTlRfSk9HRElBTF9VUCB9LAorCXsgMHgwMSwgU09OWVBJX0VWRU5UX0pPR0RJQUxfRE9XTiB9LAorCXsgMHg1ZiwgU09OWVBJX0VWRU5UX0pPR0RJQUxfVVBfUFJFU1NFRCB9LAorCXsgMHg0MSwgU09OWVBJX0VWRU5UX0pPR0RJQUxfRE9XTl9QUkVTU0VEIH0sCisJeyAweDFlLCBTT05ZUElfRVZFTlRfSk9HRElBTF9GQVNUX1VQIH0sCisJeyAweDAyLCBTT05ZUElfRVZFTlRfSk9HRElBTF9GQVNUX0RPV04gfSwKKwl7IDB4NWUsIFNPTllQSV9FVkVOVF9KT0dESUFMX0ZBU1RfVVBfUFJFU1NFRCB9LAorCXsgMHg0MiwgU09OWVBJX0VWRU5UX0pPR0RJQUxfRkFTVF9ET1dOX1BSRVNTRUQgfSwKKwl7IDB4MWQsIFNPTllQSV9FVkVOVF9KT0dESUFMX1ZGQVNUX1VQIH0sCisJeyAweDAzLCBTT05ZUElfRVZFTlRfSk9HRElBTF9WRkFTVF9ET1dOIH0sCisJeyAweDVkLCBTT05ZUElfRVZFTlRfSk9HRElBTF9WRkFTVF9VUF9QUkVTU0VEIH0sCisJeyAweDQzLCBTT05ZUElfRVZFTlRfSk9HRElBTF9WRkFTVF9ET1dOX1BSRVNTRUQgfSwKKwl7IDB4NDAsIFNPTllQSV9FVkVOVF9KT0dESUFMX1BSRVNTRUQgfSwKKwl7IDAsIDAgfQorfTsKKworLyogVGhlIHNldCBvZiBwb3NzaWJsZSBjYXB0dXJlIGJ1dHRvbiBldmVudHMgKi8KK3N0YXRpYyBzdHJ1Y3Qgc29ueXBpX2V2ZW50IHNvbnlwaV9jYXB0dXJlZXZbXSA9IHsKKwl7IDB4MDUsIFNPTllQSV9FVkVOVF9DQVBUVVJFX1BBUlRJQUxQUkVTU0VEIH0sCisJeyAweDA3LCBTT05ZUElfRVZFTlRfQ0FQVFVSRV9QUkVTU0VEIH0sCisJeyAweDQwLCBTT05ZUElfRVZFTlRfQ0FQVFVSRV9QUkVTU0VEIH0sCisJeyAweDAxLCBTT05ZUElfRVZFTlRfQ0FQVFVSRV9QQVJUSUFMUkVMRUFTRUQgfSwKKwl7IDAsIDAgfQorfTsKKworLyogVGhlIHNldCBvZiBwb3NzaWJsZSBmbmtleXMgZXZlbnRzICovCitzdGF0aWMgc3RydWN0IHNvbnlwaV9ldmVudCBzb255cGlfZm5rZXlldltdID0geworCXsgMHgxMCwgU09OWVBJX0VWRU5UX0ZOS0VZX0VTQyB9LAorCXsgMHgxMSwgU09OWVBJX0VWRU5UX0ZOS0VZX0YxIH0sCisJeyAweDEyLCBTT05ZUElfRVZFTlRfRk5LRVlfRjIgfSwKKwl7IDB4MTMsIFNPTllQSV9FVkVOVF9GTktFWV9GMyB9LAorCXsgMHgxNCwgU09OWVBJX0VWRU5UX0ZOS0VZX0Y0IH0sCisJeyAweDE1LCBTT05ZUElfRVZFTlRfRk5LRVlfRjUgfSwKKwl7IDB4MTYsIFNPTllQSV9FVkVOVF9GTktFWV9GNiB9LAorCXsgMHgxNywgU09OWVBJX0VWRU5UX0ZOS0VZX0Y3IH0sCisJeyAweDE4LCBTT05ZUElfRVZFTlRfRk5LRVlfRjggfSwKKwl7IDB4MTksIFNPTllQSV9FVkVOVF9GTktFWV9GOSB9LAorCXsgMHgxYSwgU09OWVBJX0VWRU5UX0ZOS0VZX0YxMCB9LAorCXsgMHgxYiwgU09OWVBJX0VWRU5UX0ZOS0VZX0YxMSB9LAorCXsgMHgxYywgU09OWVBJX0VWRU5UX0ZOS0VZX0YxMiB9LAorCXsgMHgxZiwgU09OWVBJX0VWRU5UX0ZOS0VZX1JFTEVBU0VEIH0sCisJeyAweDIxLCBTT05ZUElfRVZFTlRfRk5LRVlfMSB9LAorCXsgMHgyMiwgU09OWVBJX0VWRU5UX0ZOS0VZXzIgfSwKKwl7IDB4MzEsIFNPTllQSV9FVkVOVF9GTktFWV9EIH0sCisJeyAweDMyLCBTT05ZUElfRVZFTlRfRk5LRVlfRSB9LAorCXsgMHgzMywgU09OWVBJX0VWRU5UX0ZOS0VZX0YgfSwKKwl7IDB4MzQsIFNPTllQSV9FVkVOVF9GTktFWV9TIH0sCisJeyAweDM1LCBTT05ZUElfRVZFTlRfRk5LRVlfQiB9LAorCXsgMHgzNiwgU09OWVBJX0VWRU5UX0ZOS0VZX09OTFkgfSwKKwl7IDAsIDAgfQorfTsKKworLyogVGhlIHNldCBvZiBwb3NzaWJsZSBwcm9ncmFtIGtleSBldmVudHMgKi8KK3N0YXRpYyBzdHJ1Y3Qgc29ueXBpX2V2ZW50IHNvbnlwaV9wa2V5ZXZbXSA9IHsKKwl7IDB4MDEsIFNPTllQSV9FVkVOVF9QS0VZX1AxIH0sCisJeyAweDAyLCBTT05ZUElfRVZFTlRfUEtFWV9QMiB9LAorCXsgMHgwNCwgU09OWVBJX0VWRU5UX1BLRVlfUDMgfSwKKwl7IDAsIDAgfQorfTsKKworLyogVGhlIHNldCBvZiBwb3NzaWJsZSBibHVldG9vdGggZXZlbnRzICovCitzdGF0aWMgc3RydWN0IHNvbnlwaV9ldmVudCBzb255cGlfYmx1ZWV2W10gPSB7CisJeyAweDU1LCBTT05ZUElfRVZFTlRfQkxVRVRPT1RIX1BSRVNTRUQgfSwKKwl7IDB4NTksIFNPTllQSV9FVkVOVF9CTFVFVE9PVEhfT04gfSwKKwl7IDB4NWEsIFNPTllQSV9FVkVOVF9CTFVFVE9PVEhfT0ZGIH0sCisJeyAwLCAwIH0KK307CisKKy8qIFRoZSBzZXQgb2YgcG9zc2libGUgd2lyZWxlc3MgZXZlbnRzICovCitzdGF0aWMgc3RydWN0IHNvbnlwaV9ldmVudCBzb255cGlfd2xlc3NldltdID0geworCXsgMHg1OSwgU09OWVBJX0VWRU5UX1dJUkVMRVNTX09OIH0sCisJeyAweDVhLCBTT05ZUElfRVZFTlRfV0lSRUxFU1NfT0ZGIH0sCisJeyAwLCAwIH0KK307CisKKy8qIFRoZSBzZXQgb2YgcG9zc2libGUgYmFjayBidXR0b24gZXZlbnRzICovCitzdGF0aWMgc3RydWN0IHNvbnlwaV9ldmVudCBzb255cGlfYmFja2V2W10gPSB7CisJeyAweDIwLCBTT05ZUElfRVZFTlRfQkFDS19QUkVTU0VEIH0sCisJeyAwLCAwIH0KK307CisKKy8qIFRoZSBzZXQgb2YgcG9zc2libGUgaGVscCBidXR0b24gZXZlbnRzICovCitzdGF0aWMgc3RydWN0IHNvbnlwaV9ldmVudCBzb255cGlfaGVscGV2W10gPSB7CisJeyAweDNiLCBTT05ZUElfRVZFTlRfSEVMUF9QUkVTU0VEIH0sCisJeyAwLCAwIH0KK307CisKKworLyogVGhlIHNldCBvZiBwb3NzaWJsZSBsaWQgZXZlbnRzICovCitzdGF0aWMgc3RydWN0IHNvbnlwaV9ldmVudCBzb255cGlfbGlkZXZbXSA9IHsKKwl7IDB4NTEsIFNPTllQSV9FVkVOVF9MSURfQ0xPU0VEIH0sCisJeyAweDUwLCBTT05ZUElfRVZFTlRfTElEX09QRU5FRCB9LAorCXsgMCwgMCB9Cit9OworCisvKiBUaGUgc2V0IG9mIHBvc3NpYmxlIHpvb20gZXZlbnRzICovCitzdGF0aWMgc3RydWN0IHNvbnlwaV9ldmVudCBzb255cGlfem9vbWV2W10gPSB7CisJeyAweDM5LCBTT05ZUElfRVZFTlRfWk9PTV9QUkVTU0VEIH0sCisJeyAweDEwLCBTT05ZUElfRVZFTlRfWk9PTV9JTl9QUkVTU0VEIH0sCisJeyAweDIwLCBTT05ZUElfRVZFTlRfWk9PTV9PVVRfUFJFU1NFRCB9LAorCXsgMCwgMCB9Cit9OworCisvKiBUaGUgc2V0IG9mIHBvc3NpYmxlIHRodW1icGhyYXNlIGV2ZW50cyAqLworc3RhdGljIHN0cnVjdCBzb255cGlfZXZlbnQgc29ueXBpX3RodW1icGhyYXNlZXZbXSA9IHsKKwl7IDB4M2EsIFNPTllQSV9FVkVOVF9USFVNQlBIUkFTRV9QUkVTU0VEIH0sCisJeyAwLCAwIH0KK307CisKKy8qIFRoZSBzZXQgb2YgcG9zc2libGUgbW90aW9uZXllIGNhbWVyYSBldmVudHMgKi8KK3N0YXRpYyBzdHJ1Y3Qgc29ueXBpX2V2ZW50IHNvbnlwaV9tZXllZXZbXSA9IHsKKwl7IDB4MDAsIFNPTllQSV9FVkVOVF9NRVlFX0ZBQ0UgfSwKKwl7IDB4MDEsIFNPTllQSV9FVkVOVF9NRVlFX09QUE9TSVRFIH0sCisJeyAwLCAwIH0KK307CisKKy8qIFRoZSBzZXQgb2YgcG9zc2libGUgbWVtb3J5c3RpY2sgZXZlbnRzICovCitzdGF0aWMgc3RydWN0IHNvbnlwaV9ldmVudCBzb255cGlfbWVtb3J5c3RpY2tldltdID0geworCXsgMHg1MywgU09OWVBJX0VWRU5UX01FTU9SWVNUSUNLX0lOU0VSVCB9LAorCXsgMHg1NCwgU09OWVBJX0VWRU5UX01FTU9SWVNUSUNLX0VKRUNUIH0sCisJeyAwLCAwIH0KK307CisKKy8qIFRoZSBzZXQgb2YgcG9zc2libGUgYmF0dGVyeSBldmVudHMgKi8KK3N0YXRpYyBzdHJ1Y3Qgc29ueXBpX2V2ZW50IHNvbnlwaV9iYXR0ZXJ5ZXZbXSA9IHsKKwl7IDB4MjAsIFNPTllQSV9FVkVOVF9CQVRURVJZX0lOU0VSVCB9LAorCXsgMHgzMCwgU09OWVBJX0VWRU5UX0JBVFRFUllfUkVNT1ZFIH0sCisJeyAwLCAwIH0KK307CisKK3N0YXRpYyBzdHJ1Y3Qgc29ueXBpX2V2ZW50dHlwZXMgdHlwZTFfZXZlbnRzW10gPSB7CisJeyAwLCAweGZmZmZmZmZmLCBzb255cGlfcmVsZWFzZWV2IH0sCisJeyAweDcwLCBTT05ZUElfTUVZRV9NQVNLLCBzb255cGlfbWV5ZWV2IH0sCisJeyAweDMwLCBTT05ZUElfTElEX01BU0ssIHNvbnlwaV9saWRldiB9LAorCXsgMHg2MCwgU09OWVBJX0NBUFRVUkVfTUFTSywgc29ueXBpX2NhcHR1cmVldiB9LAorCXsgMHgxMCwgU09OWVBJX0pPR0dFUl9NQVNLLCBzb255cGlfam9nZ2VyZXYgfSwKKwl7IDB4MjAsIFNPTllQSV9GTktFWV9NQVNLLCBzb255cGlfZm5rZXlldiB9LAorCXsgMHgzMCwgU09OWVBJX0JMVUVUT09USF9NQVNLLCBzb255cGlfYmx1ZWV2IH0sCisJeyAweDQwLCBTT05ZUElfUEtFWV9NQVNLLCBzb255cGlfcGtleWV2IH0sCisJeyAweDMwLCBTT05ZUElfTUVNT1JZU1RJQ0tfTUFTSywgc29ueXBpX21lbW9yeXN0aWNrZXYgfSwKKwl7IDB4NDAsIFNPTllQSV9CQVRURVJZX01BU0ssIHNvbnlwaV9iYXR0ZXJ5ZXYgfSwKKwl7IDAgfSwKK307CitzdGF0aWMgc3RydWN0IHNvbnlwaV9ldmVudHR5cGVzIHR5cGUyX2V2ZW50c1tdID0geworCXsgMCwgMHhmZmZmZmZmZiwgc29ueXBpX3JlbGVhc2VldiB9LAorCXsgMHgzOCwgU09OWVBJX0xJRF9NQVNLLCBzb255cGlfbGlkZXYgfSwKKwl7IDB4MTEsIFNPTllQSV9KT0dHRVJfTUFTSywgc29ueXBpX2pvZ2dlcmV2IH0sCisJeyAweDYxLCBTT05ZUElfQ0FQVFVSRV9NQVNLLCBzb255cGlfY2FwdHVyZWV2IH0sCisJeyAweDIxLCBTT05ZUElfRk5LRVlfTUFTSywgc29ueXBpX2Zua2V5ZXYgfSwKKwl7IDB4MzEsIFNPTllQSV9CTFVFVE9PVEhfTUFTSywgc29ueXBpX2JsdWVldiB9LAorCXsgMHgwOCwgU09OWVBJX1BLRVlfTUFTSywgc29ueXBpX3BrZXlldiB9LAorCXsgMHgxMSwgU09OWVBJX0JBQ0tfTUFTSywgc29ueXBpX2JhY2tldiB9LAorCXsgMHgyMSwgU09OWVBJX0hFTFBfTUFTSywgc29ueXBpX2hlbHBldiB9LAorCXsgMHgyMSwgU09OWVBJX1pPT01fTUFTSywgc29ueXBpX3pvb21ldiB9LAorCXsgMHgyMCwgU09OWVBJX1RIVU1CUEhSQVNFX01BU0ssIHNvbnlwaV90aHVtYnBocmFzZWV2IH0sCisJeyAweDMxLCBTT05ZUElfTUVNT1JZU1RJQ0tfTUFTSywgc29ueXBpX21lbW9yeXN0aWNrZXYgfSwKKwl7IDB4NDEsIFNPTllQSV9CQVRURVJZX01BU0ssIHNvbnlwaV9iYXR0ZXJ5ZXYgfSwKKwl7IDB4MzEsIFNPTllQSV9QS0VZX01BU0ssIHNvbnlwaV9wa2V5ZXYgfSwKKwl7IDAgfSwKK307CitzdGF0aWMgc3RydWN0IHNvbnlwaV9ldmVudHR5cGVzIHR5cGUzX2V2ZW50c1tdID0geworCXsgMCwgMHhmZmZmZmZmZiwgc29ueXBpX3JlbGVhc2VldiB9LAorCXsgMHgyMSwgU09OWVBJX0ZOS0VZX01BU0ssIHNvbnlwaV9mbmtleWV2IH0sCisJeyAweDMxLCBTT05ZUElfV0lSRUxFU1NfTUFTSywgc29ueXBpX3dsZXNzZXYgfSwKKwl7IDB4MzEsIFNPTllQSV9NRU1PUllTVElDS19NQVNLLCBzb255cGlfbWVtb3J5c3RpY2tldiB9LAorCXsgMHg0MSwgU09OWVBJX0JBVFRFUllfTUFTSywgc29ueXBpX2JhdHRlcnlldiB9LAorCXsgMHgzMSwgU09OWVBJX1BLRVlfTUFTSywgc29ueXBpX3BrZXlldiB9LAorCXsgMCB9LAorfTsKK3N0YXRpYyBzdHJ1Y3Qgc29ueXBpX2V2ZW50dHlwZXMgdHlwZTRfZXZlbnRzW10gPSB7CisJeyAwLCAweGZmZmZmZmZmLCBzb255cGlfcmVsZWFzZWV2IH0sCisJeyAweDIxLCBTT05ZUElfRk5LRVlfTUFTSywgc29ueXBpX2Zua2V5ZXYgfSwKKwl7IDB4MzEsIFNPTllQSV9XSVJFTEVTU19NQVNLLCBzb255cGlfd2xlc3NldiB9LAorCXsgMHgzMSwgU09OWVBJX01FTU9SWVNUSUNLX01BU0ssIHNvbnlwaV9tZW1vcnlzdGlja2V2IH0sCisJeyAweDQxLCBTT05ZUElfQkFUVEVSWV9NQVNLLCBzb255cGlfYmF0dGVyeWV2IH0sCisJeyAweDA1LCBTT05ZUElfUEtFWV9NQVNLLCBzb255cGlfcGtleWV2IH0sCisJeyAweDA1LCBTT05ZUElfWk9PTV9NQVNLLCBzb255cGlfem9vbWV2IH0sCisJeyAweDA1LCBTT05ZUElfQ0FQVFVSRV9NQVNLLCBzb255cGlfY2FwdHVyZWV2IH0sCisJeyAwIH0sCit9OworCisvKiBsb3cgbGV2ZWwgc3BpYyBjYWxscyAqLworI2RlZmluZSBJVEVSQVRJT05TX0xPTkcJCTEwMDAwCisjZGVmaW5lIElURVJBVElPTlNfU0hPUlQJMTAKKyNkZWZpbmUgd2FpdF9vbl9jb21tYW5kKGNvbW1hbmQsIGl0ZXJhdGlvbnMpIHsJCQkJXAorCXVuc2lnbmVkIGludCBuID0gaXRlcmF0aW9uczsJCQkJCVwKKwl3aGlsZSAoLS1uICYmIChjb21tYW5kKSkJCQkJCVwKKwkJdWRlbGF5KDEpOwkJCQkJCVwKKwlpZiAoIW4pCQkJCQkJCQlcCisJCWRwcmludGsoImNvbW1hbmQgZmFpbGVkIGF0ICVzIDogJXMgKGxpbmUgJWQpXG4iLAlcCisJCQkJX19GSUxFX18sIF9fZnVuY19fLCBfX0xJTkVfXyk7CVwKK30KKworc3RhdGljIHU4IHNvbnlfcGljX2NhbGwxKHU4IGRldikKK3sKKwl1OCB2MSwgdjI7CisKKwl3YWl0X29uX2NvbW1hbmQoaW5iX3Aoc3BpY19kZXYuY3VyX2lvcG9ydC0+aW8xLm1pbmltdW0gKyA0KSAmIDIsCisJCQlJVEVSQVRJT05TX0xPTkcpOworCW91dGIoZGV2LCBzcGljX2Rldi5jdXJfaW9wb3J0LT5pbzEubWluaW11bSArIDQpOworCXYxID0gaW5iX3Aoc3BpY19kZXYuY3VyX2lvcG9ydC0+aW8xLm1pbmltdW0gKyA0KTsKKwl2MiA9IGluYl9wKHNwaWNfZGV2LmN1cl9pb3BvcnQtPmlvMS5taW5pbXVtKTsKKwlkcHJpbnRrKCJzb255X3BpY19jYWxsMSgweCUuMngpOiAweCUuNHhcbiIsIGRldiwgKHYyIDw8IDgpIHwgdjEpOworCXJldHVybiB2MjsKK30KKworc3RhdGljIHU4IHNvbnlfcGljX2NhbGwyKHU4IGRldiwgdTggZm4pCit7CisJdTggdjE7CisKKwl3YWl0X29uX2NvbW1hbmQoaW5iX3Aoc3BpY19kZXYuY3VyX2lvcG9ydC0+aW8xLm1pbmltdW0gKyA0KSAmIDIsCisJCQlJVEVSQVRJT05TX0xPTkcpOworCW91dGIoZGV2LCBzcGljX2Rldi5jdXJfaW9wb3J0LT5pbzEubWluaW11bSArIDQpOworCXdhaXRfb25fY29tbWFuZChpbmJfcChzcGljX2Rldi5jdXJfaW9wb3J0LT5pbzEubWluaW11bSArIDQpICYgMiwKKwkJCUlURVJBVElPTlNfTE9ORyk7CisJb3V0Yihmbiwgc3BpY19kZXYuY3VyX2lvcG9ydC0+aW8xLm1pbmltdW0pOworCXYxID0gaW5iX3Aoc3BpY19kZXYuY3VyX2lvcG9ydC0+aW8xLm1pbmltdW0pOworCWRwcmludGsoInNvbnlfcGljX2NhbGwyKDB4JS4yeCAtIDB4JS4yeCk6IDB4JS40eFxuIiwgZGV2LCBmbiwgdjEpOworCXJldHVybiB2MTsKK30KKworc3RhdGljIHU4IHNvbnlfcGljX2NhbGwzKHU4IGRldiwgdTggZm4sIHU4IHYpCit7CisJdTggdjE7CisKKwl3YWl0X29uX2NvbW1hbmQoaW5iX3Aoc3BpY19kZXYuY3VyX2lvcG9ydC0+aW8xLm1pbmltdW0gKyA0KSAmIDIsIElURVJBVElPTlNfTE9ORyk7CisJb3V0YihkZXYsIHNwaWNfZGV2LmN1cl9pb3BvcnQtPmlvMS5taW5pbXVtICsgNCk7CisJd2FpdF9vbl9jb21tYW5kKGluYl9wKHNwaWNfZGV2LmN1cl9pb3BvcnQtPmlvMS5taW5pbXVtICsgNCkgJiAyLCBJVEVSQVRJT05TX0xPTkcpOworCW91dGIoZm4sIHNwaWNfZGV2LmN1cl9pb3BvcnQtPmlvMS5taW5pbXVtKTsKKwl3YWl0X29uX2NvbW1hbmQoaW5iX3Aoc3BpY19kZXYuY3VyX2lvcG9ydC0+aW8xLm1pbmltdW0gKyA0KSAmIDIsIElURVJBVElPTlNfTE9ORyk7CisJb3V0Yih2LCBzcGljX2Rldi5jdXJfaW9wb3J0LT5pbzEubWluaW11bSk7CisJdjEgPSBpbmJfcChzcGljX2Rldi5jdXJfaW9wb3J0LT5pbzEubWluaW11bSk7CisJZHByaW50aygic29ueV9waWNfY2FsbDMoMHglLjJ4IC0gMHglLjJ4IC0gMHglLjJ4KTogMHglLjR4XG4iLAorCQkJZGV2LCBmbiwgdiwgdjEpOworCXJldHVybiB2MTsKK30KKworLyoKKyAqIG1pbmlkcml2ZXJzIGZvciBTUElDIG1vZGVscworICovCitzdGF0aWMgaW50IHR5cGU0X2hhbmRsZV9pcnEoY29uc3QgdTggZGF0YV9tYXNrLCBjb25zdCB1OCBldikKK3sKKwkvKgorCSAqIDB4MzEgY291bGQgbWVhbiB3ZSBoYXZlIHRvIHRha2Ugc29tZSBleHRyYSBhY3Rpb24gYW5kIHdhaXQgZm9yCisJICogdGhlIG5leHQgaXJxIGZvciBzb21lIFR5cGU0IG1vZGVscywgaXQgd2lsbCBnZW5lcmF0ZSBhIG5ldworCSAqIGlycSBhbmQgd2UgY2FuIHJlYWQgbmV3IGRhdGEgZnJvbSB0aGUgZGV2aWNlOgorCSAqICAtIDB4NWMgYW5kIDB4NWYgcmVxdWlyZXMgMHhBMAorCSAqICAtIDB4NjEgcmVxdWlyZXMgMHhCMworCSAqLworCWlmIChkYXRhX21hc2sgPT0gMHgzMSkgeworCQlpZiAoZXYgPT0gMHg1YyB8fCBldiA9PSAweDVmKQorCQkJc29ueV9waWNfY2FsbDEoMHhBMCk7CisJCWVsc2UgaWYgKGV2ID09IDB4NjEpCisJCQlzb255X3BpY19jYWxsMSgweEIzKTsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiAxOworfQorCitzdGF0aWMgc3RydWN0IGRldmljZV9jdHJsIHNwaWNfdHlwZXNbXSA9IHsKKwl7CisJCS5tb2RlbCA9IFNPTllQSV9ERVZJQ0VfVFlQRTEsCisJCS5oYW5kbGVfaXJxID0gTlVMTCwKKwkJLmV2cG9ydF9vZmZzZXQgPSBTT05ZUElfVFlQRTFfT0ZGU0VULAorCQkuZXZlbnRfdHlwZXMgPSB0eXBlMV9ldmVudHMsCisJfSwKKwl7CisJCS5tb2RlbCA9IFNPTllQSV9ERVZJQ0VfVFlQRTIsCisJCS5oYW5kbGVfaXJxID0gTlVMTCwKKwkJLmV2cG9ydF9vZmZzZXQgPSBTT05ZUElfVFlQRTJfT0ZGU0VULAorCQkuZXZlbnRfdHlwZXMgPSB0eXBlMl9ldmVudHMsCisJfSwKKwl7CisJCS5tb2RlbCA9IFNPTllQSV9ERVZJQ0VfVFlQRTMsCisJCS5oYW5kbGVfaXJxID0gTlVMTCwKKwkJLmV2cG9ydF9vZmZzZXQgPSBTT05ZUElfVFlQRTNfT0ZGU0VULAorCQkuZXZlbnRfdHlwZXMgPSB0eXBlM19ldmVudHMsCisJfSwKKwl7CisJCS5tb2RlbCA9IFNPTllQSV9ERVZJQ0VfVFlQRTQsCisJCS5oYW5kbGVfaXJxID0gdHlwZTRfaGFuZGxlX2lycSwKKwkJLmV2cG9ydF9vZmZzZXQgPSBTT05ZUElfVFlQRTRfT0ZGU0VULAorCQkuZXZlbnRfdHlwZXMgPSB0eXBlNF9ldmVudHMsCisJfSwKK307CisKK3N0YXRpYyB2b2lkIHNvbnlfcGljX2RldGVjdF9kZXZpY2VfdHlwZShzdHJ1Y3Qgc29ueV9waWNfZGV2ICpkZXYpCit7CisJc3RydWN0IHBjaV9kZXYgKnBjaWRldjsKKworCXBjaWRldiA9IHBjaV9nZXRfZGV2aWNlKFBDSV9WRU5ET1JfSURfSU5URUwsCisJCQlQQ0lfREVWSUNFX0lEX0lOVEVMXzgyMzcxQUJfMywgTlVMTCk7CisJaWYgKHBjaWRldikgeworCQlkZXYtPmNvbnRyb2wgPSAmc3BpY190eXBlc1swXTsKKwkJZ290byBvdXQ7CisJfQorCisJcGNpZGV2ID0gcGNpX2dldF9kZXZpY2UoUENJX1ZFTkRPUl9JRF9JTlRFTCwKKwkJCVBDSV9ERVZJQ0VfSURfSU5URUxfSUNINl8xLCBOVUxMKTsKKwlpZiAocGNpZGV2KSB7CisJCWRldi0+Y29udHJvbCA9ICZzcGljX3R5cGVzWzJdOworCQlnb3RvIG91dDsKKwl9CisKKwlwY2lkZXYgPSBwY2lfZ2V0X2RldmljZShQQ0lfVkVORE9SX0lEX0lOVEVMLAorCQkJUENJX0RFVklDRV9JRF9JTlRFTF9JQ0g3XzEsIE5VTEwpOworCWlmIChwY2lkZXYpIHsKKwkJZGV2LT5jb250cm9sID0gJnNwaWNfdHlwZXNbM107CisJCWdvdG8gb3V0OworCX0KKworCXBjaWRldiA9IHBjaV9nZXRfZGV2aWNlKFBDSV9WRU5ET1JfSURfSU5URUwsCisJCQlQQ0lfREVWSUNFX0lEX0lOVEVMX0lDSDhfNCwgTlVMTCk7CisJaWYgKHBjaWRldikgeworCQlkZXYtPmNvbnRyb2wgPSAmc3BpY190eXBlc1szXTsKKwkJZ290byBvdXQ7CisJfQorCisJLyogZGVmYXVsdCAqLworCWRldi0+Y29udHJvbCA9ICZzcGljX3R5cGVzWzFdOworCitvdXQ6CisJaWYgKHBjaWRldikKKwkJcGNpX2Rldl9wdXQocGNpZGV2KTsKKworCXByaW50ayhLRVJOX0lORk8gRFJWX1BGWCAiZGV0ZWN0ZWQgVHlwZSVkIG1vZGVsXG4iLAorCQkJZGV2LT5jb250cm9sLT5tb2RlbCA9PSBTT05ZUElfREVWSUNFX1RZUEUxID8gMSA6CisJCQlkZXYtPmNvbnRyb2wtPm1vZGVsID09IFNPTllQSV9ERVZJQ0VfVFlQRTIgPyAyIDoKKwkJCWRldi0+Y29udHJvbC0+bW9kZWwgPT0gU09OWVBJX0RFVklDRV9UWVBFMyA/IDMgOiA0KTsKK30KKworLyogY2FtZXJhIHRlc3RzIGFuZCBwb3dlcm9uL3Bvd2Vyb2ZmICovCisjZGVmaW5lIFNPTllQSV9DQU1FUkFfUElDVFVSRQkJNQorI2RlZmluZSBTT05ZUElfQ0FNRVJBX0NPTlRST0wJCTB4MTAKKworI2RlZmluZSBTT05ZUElfQ0FNRVJBX0JSSUdIVE5FU1MJCTAKKyNkZWZpbmUgU09OWVBJX0NBTUVSQV9DT05UUkFTVAkJCTEKKyNkZWZpbmUgU09OWVBJX0NBTUVSQV9IVUUJCQkyCisjZGVmaW5lIFNPTllQSV9DQU1FUkFfQ09MT1IJCQkzCisjZGVmaW5lIFNPTllQSV9DQU1FUkFfU0hBUlBORVNTCQkJNAorCisjZGVmaW5lIFNPTllQSV9DQU1FUkFfRVhQT1NVUkVfTUFTSwkJMHhDCisjZGVmaW5lIFNPTllQSV9DQU1FUkFfV0hJVEVfQkFMQU5DRV9NQVNLCTB4MworI2RlZmluZSBTT05ZUElfQ0FNRVJBX1BJQ1RVUkVfTU9ERV9NQVNLCQkweDMwCisjZGVmaW5lIFNPTllQSV9DQU1FUkFfTVVURV9NQVNLCQkJMHg0MAorCisvKiB0aGUgcmVzdCBkb24ndCBuZWVkIGEgbG9vcCB1bnRpbCBub3QgMHhmZiAqLworI2RlZmluZSBTT05ZUElfQ0FNRVJBX0FHQwkJCTYKKyNkZWZpbmUgU09OWVBJX0NBTUVSQV9BR0NfTUFTSwkJCTB4MzAKKyNkZWZpbmUgU09OWVBJX0NBTUVSQV9TSFVUVEVSX01BU0sgCQkweDcKKworI2RlZmluZSBTT05ZUElfQ0FNRVJBX1NIVVRET1dOX1JFUVVFU1QJCTcKKyNkZWZpbmUgU09OWVBJX0NBTUVSQV9DT05UUk9MCQkJMHgxMAorCisjZGVmaW5lIFNPTllQSV9DQU1FUkFfU1RBVFVTIAkJCTcKKyNkZWZpbmUgU09OWVBJX0NBTUVSQV9TVEFUVVNfUkVBRFkgCQkweDIKKyNkZWZpbmUgU09OWVBJX0NBTUVSQV9TVEFUVVNfUE9TSVRJT04JCTB4NAorCisjZGVmaW5lIFNPTllQSV9ESVJFQ1RJT05fQkFDS1dBUkRTIAkJMHg0CisKKyNkZWZpbmUgU09OWVBJX0NBTUVSQV9SRVZJU0lPTiAJCQk4CisjZGVmaW5lIFNPTllQSV9DQU1FUkFfUk9NVkVSU0lPTiAJCTkKKworc3RhdGljIGludCBfX3NvbnlfcGljX2NhbWVyYV9yZWFkeSh2b2lkKQoreworCXU4IHY7CisKKwl2ID0gc29ueV9waWNfY2FsbDIoMHg4ZiwgU09OWVBJX0NBTUVSQV9TVEFUVVMpOworCXJldHVybiAodiAhPSAweGZmICYmICh2ICYgU09OWVBJX0NBTUVSQV9TVEFUVVNfUkVBRFkpKTsKK30KKworc3RhdGljIGludCBfX3NvbnlfcGljX2NhbWVyYV9vZmYodm9pZCkKK3sKKwlpZiAoIWNhbWVyYSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HIERSVl9QRlggImNhbWVyYSBjb250cm9sIG5vdCBlbmFibGVkXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJd2FpdF9vbl9jb21tYW5kKHNvbnlfcGljX2NhbGwzKDB4OTAsIFNPTllQSV9DQU1FUkFfUElDVFVSRSwKKwkJCQlTT05ZUElfQ0FNRVJBX01VVEVfTUFTSyksCisJCQlJVEVSQVRJT05TX1NIT1JUKTsKKworCWlmIChzcGljX2Rldi5jYW1lcmFfcG93ZXIpIHsKKwkJc29ueV9waWNfY2FsbDIoMHg5MSwgMCk7CisJCXNwaWNfZGV2LmNhbWVyYV9wb3dlciA9IDA7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9fc29ueV9waWNfY2FtZXJhX29uKHZvaWQpCit7CisJaW50IGksIGosIHg7CisKKwlpZiAoIWNhbWVyYSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HIERSVl9QRlggImNhbWVyYSBjb250cm9sIG5vdCBlbmFibGVkXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJaWYgKHNwaWNfZGV2LmNhbWVyYV9wb3dlcikKKwkJcmV0dXJuIDA7CisKKwlmb3IgKGogPSA1OyBqID4gMDsgai0tKSB7CisKKwkJZm9yICh4ID0gMDsgeCA8IDEwMCAmJiBzb255X3BpY19jYWxsMigweDkxLCAweDEpOyB4KyspCisJCQltc2xlZXAoMTApOworCQlzb255X3BpY19jYWxsMSgweDkzKTsKKworCQlmb3IgKGkgPSA0MDA7IGkgPiAwOyBpLS0pIHsKKwkJCWlmIChfX3NvbnlfcGljX2NhbWVyYV9yZWFkeSgpKQorCQkJCWJyZWFrOworCQkJbXNsZWVwKDEwKTsKKwkJfQorCQlpZiAoaSkKKwkJCWJyZWFrOworCX0KKworCWlmIChqID09IDApIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyBEUlZfUEZYICJmYWlsZWQgdG8gcG93ZXIgb24gY2FtZXJhXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJd2FpdF9vbl9jb21tYW5kKHNvbnlfcGljX2NhbGwzKDB4OTAsIFNPTllQSV9DQU1FUkFfQ09OVFJPTCwKKwkJCQkweDVhKSwKKwkJCUlURVJBVElPTlNfU0hPUlQpOworCisJc3BpY19kZXYuY2FtZXJhX3Bvd2VyID0gMTsKKwlyZXR1cm4gMDsKK30KKworLyogRXh0ZXJuYWwgY2FtZXJhIGNvbW1hbmQgKGV4cG9ydGVkIHRvIHRoZSBtb3Rpb24gZXllIHY0bCBkcml2ZXIpICovCitpbnQgc29ueV9waWNfY2FtZXJhX2NvbW1hbmQoaW50IGNvbW1hbmQsIHU4IHZhbHVlKQoreworCWlmICghY2FtZXJhKQorCQlyZXR1cm4gLUVJTzsKKworCW11dGV4X2xvY2soJnNwaWNfZGV2LmxvY2spOworCisJc3dpdGNoIChjb21tYW5kKSB7CisJY2FzZSBTT05ZX1BJQ19DT01NQU5EX1NFVENBTUVSQToKKwkJaWYgKHZhbHVlKQorCQkJX19zb255X3BpY19jYW1lcmFfb24oKTsKKwkJZWxzZQorCQkJX19zb255X3BpY19jYW1lcmFfb2ZmKCk7CisJCWJyZWFrOworCWNhc2UgU09OWV9QSUNfQ09NTUFORF9TRVRDQU1FUkFCUklHSFRORVNTOgorCQl3YWl0X29uX2NvbW1hbmQoc29ueV9waWNfY2FsbDMoMHg5MCwgU09OWVBJX0NBTUVSQV9CUklHSFRORVNTLCB2YWx1ZSksCisJCQkJSVRFUkFUSU9OU19TSE9SVCk7CisJCWJyZWFrOworCWNhc2UgU09OWV9QSUNfQ09NTUFORF9TRVRDQU1FUkFDT05UUkFTVDoKKwkJd2FpdF9vbl9jb21tYW5kKHNvbnlfcGljX2NhbGwzKDB4OTAsIFNPTllQSV9DQU1FUkFfQ09OVFJBU1QsIHZhbHVlKSwKKwkJCQlJVEVSQVRJT05TX1NIT1JUKTsKKwkJYnJlYWs7CisJY2FzZSBTT05ZX1BJQ19DT01NQU5EX1NFVENBTUVSQUhVRToKKwkJd2FpdF9vbl9jb21tYW5kKHNvbnlfcGljX2NhbGwzKDB4OTAsIFNPTllQSV9DQU1FUkFfSFVFLCB2YWx1ZSksCisJCQkJSVRFUkFUSU9OU19TSE9SVCk7CisJCWJyZWFrOworCWNhc2UgU09OWV9QSUNfQ09NTUFORF9TRVRDQU1FUkFDT0xPUjoKKwkJd2FpdF9vbl9jb21tYW5kKHNvbnlfcGljX2NhbGwzKDB4OTAsIFNPTllQSV9DQU1FUkFfQ09MT1IsIHZhbHVlKSwKKwkJCQlJVEVSQVRJT05TX1NIT1JUKTsKKwkJYnJlYWs7CisJY2FzZSBTT05ZX1BJQ19DT01NQU5EX1NFVENBTUVSQVNIQVJQTkVTUzoKKwkJd2FpdF9vbl9jb21tYW5kKHNvbnlfcGljX2NhbGwzKDB4OTAsIFNPTllQSV9DQU1FUkFfU0hBUlBORVNTLCB2YWx1ZSksCisJCQkJSVRFUkFUSU9OU19TSE9SVCk7CisJCWJyZWFrOworCWNhc2UgU09OWV9QSUNfQ09NTUFORF9TRVRDQU1FUkFQSUNUVVJFOgorCQl3YWl0X29uX2NvbW1hbmQoc29ueV9waWNfY2FsbDMoMHg5MCwgU09OWVBJX0NBTUVSQV9QSUNUVVJFLCB2YWx1ZSksCisJCQkJSVRFUkFUSU9OU19TSE9SVCk7CisJCWJyZWFrOworCWNhc2UgU09OWV9QSUNfQ09NTUFORF9TRVRDQU1FUkFBR0M6CisJCXdhaXRfb25fY29tbWFuZChzb255X3BpY19jYWxsMygweDkwLCBTT05ZUElfQ0FNRVJBX0FHQywgdmFsdWUpLAorCQkJCUlURVJBVElPTlNfU0hPUlQpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcmludGsoS0VSTl9FUlIgRFJWX1BGWCAic29ueV9waWNfY2FtZXJhX2NvbW1hbmQgaW52YWxpZDogJWRcbiIsCisJCSAgICAgICBjb21tYW5kKTsKKwkJYnJlYWs7CisJfQorCW11dGV4X3VubG9jaygmc3BpY19kZXYubG9jayk7CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKHNvbnlfcGljX2NhbWVyYV9jb21tYW5kKTsKKworLyogZ3Bycy9lZGdlIG1vZGVtIChTWjQ2ME4gYW5kIFNaMjEwUCksIHRoYW5rcyB0byBKb3NodWEgV2lzZSAqLworc3RhdGljIHZvaWQgc29ueV9waWNfc2V0X3d3YW5wb3dlcih1OCBzdGF0ZSkKK3sKKwlzdGF0ZSA9ICEhc3RhdGU7CisJbXV0ZXhfbG9jaygmc3BpY19kZXYubG9jayk7CisJaWYgKHNwaWNfZGV2Lnd3YW5fcG93ZXIgPT0gc3RhdGUpIHsKKwkJbXV0ZXhfdW5sb2NrKCZzcGljX2Rldi5sb2NrKTsKKwkJcmV0dXJuOworCX0KKwlzb255X3BpY19jYWxsMigweEIwLCBzdGF0ZSk7CisJc3BpY19kZXYud3dhbl9wb3dlciA9IHN0YXRlOworCW11dGV4X3VubG9jaygmc3BpY19kZXYubG9jayk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNvbnlfcGljX3d3YW5wb3dlcl9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWZmZXIsIHNpemVfdCBjb3VudCkKK3sKKwl1bnNpZ25lZCBsb25nIHZhbHVlOworCWlmIChjb3VudCA+IDMxKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXZhbHVlID0gc2ltcGxlX3N0cnRvdWwoYnVmZmVyLCBOVUxMLCAxMCk7CisJc29ueV9waWNfc2V0X3d3YW5wb3dlcih2YWx1ZSk7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNvbnlfcGljX3d3YW5wb3dlcl9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZmZlcikKK3sKKwlzc2l6ZV90IGNvdW50OworCW11dGV4X2xvY2soJnNwaWNfZGV2LmxvY2spOworCWNvdW50ID0gc25wcmludGYoYnVmZmVyLCBQQUdFX1NJWkUsICIlZFxuIiwgc3BpY19kZXYud3dhbl9wb3dlcik7CisJbXV0ZXhfdW5sb2NrKCZzcGljX2Rldi5sb2NrKTsKKwlyZXR1cm4gY291bnQ7Cit9CisKKy8qIGJsdWV0b290aCBzdWJzeXN0ZW0gcG93ZXIgc3RhdGUgKi8KK3N0YXRpYyB2b2lkIF9fc29ueV9waWNfc2V0X2JsdWV0b290aHBvd2VyKHU4IHN0YXRlKQoreworCXN0YXRlID0gISFzdGF0ZTsKKwlpZiAoc3BpY19kZXYuYmx1ZXRvb3RoX3Bvd2VyID09IHN0YXRlKQorCQlyZXR1cm47CisJc29ueV9waWNfY2FsbDIoMHg5Niwgc3RhdGUpOworCXNvbnlfcGljX2NhbGwxKDB4ODIpOworCXNwaWNfZGV2LmJsdWV0b290aF9wb3dlciA9IHN0YXRlOworfQorCitzdGF0aWMgc3NpemVfdCBzb255X3BpY19ibHVldG9vdGhwb3dlcl9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWZmZXIsIHNpemVfdCBjb3VudCkKK3sKKwl1bnNpZ25lZCBsb25nIHZhbHVlOworCWlmIChjb3VudCA+IDMxKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXZhbHVlID0gc2ltcGxlX3N0cnRvdWwoYnVmZmVyLCBOVUxMLCAxMCk7CisJbXV0ZXhfbG9jaygmc3BpY19kZXYubG9jayk7CisJX19zb255X3BpY19zZXRfYmx1ZXRvb3RocG93ZXIodmFsdWUpOworCW11dGV4X3VubG9jaygmc3BpY19kZXYubG9jayk7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNvbnlfcGljX2JsdWV0b290aHBvd2VyX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmZmVyKQoreworCXNzaXplX3QgY291bnQgPSAwOworCW11dGV4X2xvY2soJnNwaWNfZGV2LmxvY2spOworCWNvdW50ID0gc25wcmludGYoYnVmZmVyLCBQQUdFX1NJWkUsICIlZFxuIiwgc3BpY19kZXYuYmx1ZXRvb3RoX3Bvd2VyKTsKKwltdXRleF91bmxvY2soJnNwaWNfZGV2LmxvY2spOworCXJldHVybiBjb3VudDsKK30KKworLyogZmFuIHNwZWVkICovCisvKiBGQU4wIGluZm9ybWF0aW9uIChyZXZlcnNlIGVuZ2luZWVyZWQgZnJvbSBBQ1BJIHRhYmxlcykgKi8KKyNkZWZpbmUgU09OWV9QSUNfRkFOMF9TVEFUVVMJMHg5Mworc3RhdGljIGludCBzb255X3BpY19zZXRfZmFuc3BlZWQodW5zaWduZWQgbG9uZyB2YWx1ZSkKK3sKKwlyZXR1cm4gZWNfd3JpdGUoU09OWV9QSUNfRkFOMF9TVEFUVVMsIHZhbHVlKTsKK30KKworc3RhdGljIGludCBzb255X3BpY19nZXRfZmFuc3BlZWQodTggKnZhbHVlKQoreworCXJldHVybiBlY19yZWFkKFNPTllfUElDX0ZBTjBfU1RBVFVTLCB2YWx1ZSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNvbnlfcGljX2ZhbnNwZWVkX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1ZmZlciwgc2l6ZV90IGNvdW50KQoreworCXVuc2lnbmVkIGxvbmcgdmFsdWU7CisJaWYgKGNvdW50ID4gMzEpCisJCXJldHVybiAtRUlOVkFMOworCisJdmFsdWUgPSBzaW1wbGVfc3RydG91bChidWZmZXIsIE5VTEwsIDEwKTsKKwlpZiAoc29ueV9waWNfc2V0X2ZhbnNwZWVkKHZhbHVlKSkKKwkJcmV0dXJuIC1FSU87CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNvbnlfcGljX2ZhbnNwZWVkX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmZmVyKQoreworCXU4IHZhbHVlID0gMDsKKwlpZiAoc29ueV9waWNfZ2V0X2ZhbnNwZWVkKCZ2YWx1ZSkpCisJCXJldHVybiAtRUlPOworCisJcmV0dXJuIHNucHJpbnRmKGJ1ZmZlciwgUEFHRV9TSVpFLCAiJWRcbiIsIHZhbHVlKTsKK30KKworI2RlZmluZSBTUElDX0FUVFIoX25hbWUsIF9tb2RlKQkJCQkJXAorc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgc3BpY19hdHRyXyMjX25hbWUgPSBfX0FUVFIoX25hbWUsCVwKKwkJX21vZGUsIHNvbnlfcGljXyMjIF9uYW1lICMjX3Nob3csCQlcCisJCXNvbnlfcGljXyMjIF9uYW1lICMjX3N0b3JlKQorCitzdGF0aWMgU1BJQ19BVFRSKGJsdWV0b290aHBvd2VyLCAwNjQ0KTsKK3N0YXRpYyBTUElDX0FUVFIod3dhbnBvd2VyLCAwNjQ0KTsKK3N0YXRpYyBTUElDX0FUVFIoZmFuc3BlZWQsIDA2NDQpOworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqc3BpY19hdHRyaWJ1dGVzW10gPSB7CisJJnNwaWNfYXR0cl9ibHVldG9vdGhwb3dlci5hdHRyLAorCSZzcGljX2F0dHJfd3dhbnBvd2VyLmF0dHIsCisJJnNwaWNfYXR0cl9mYW5zcGVlZC5hdHRyLAorCU5VTEwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIHNwaWNfYXR0cmlidXRlX2dyb3VwID0geworCS5hdHRycyA9IHNwaWNfYXR0cmlidXRlcworfTsKKworLyoqKioqKioqIFNPTllQSSBjb21wYXRpYmlsaXR5ICoqKioqKioqKiovCisjaWZkZWYgQ09ORklHX1NPTllQSV9DT01QQVQKKworLyogYmF0dGVyeSAvIGJyaWdodG5lc3MgLyB0ZW1wZXJhdHVyZSAgYWRkcmVzc2VzICovCisjZGVmaW5lIFNPTllQSV9CQVRfRkxBR1MJMHg4MQorI2RlZmluZSBTT05ZUElfTENEX0xJR0hUCTB4OTYKKyNkZWZpbmUgU09OWVBJX0JBVDFfUENUUk0JMHhhMAorI2RlZmluZSBTT05ZUElfQkFUMV9MRUZUCTB4YTIKKyNkZWZpbmUgU09OWVBJX0JBVDFfTUFYUlQJMHhhNAorI2RlZmluZSBTT05ZUElfQkFUMl9QQ1RSTQkweGE4CisjZGVmaW5lIFNPTllQSV9CQVQyX0xFRlQJMHhhYQorI2RlZmluZSBTT05ZUElfQkFUMl9NQVhSVAkweGFjCisjZGVmaW5lIFNPTllQSV9CQVQxX01BWFRLCTB4YjAKKyNkZWZpbmUgU09OWVBJX0JBVDFfRlVMTAkweGIyCisjZGVmaW5lIFNPTllQSV9CQVQyX01BWFRLCTB4YjgKKyNkZWZpbmUgU09OWVBJX0JBVDJfRlVMTAkweGJhCisjZGVmaW5lIFNPTllQSV9URU1QX1NUQVRVUwkweEMxCisKK3N0cnVjdCBzb255cGlfY29tcGF0X3MgeworCXN0cnVjdCBmYXN5bmNfc3RydWN0CSpmaWZvX2FzeW5jOworCXN0cnVjdCBrZmlmbwkJKmZpZm87CisJc3BpbmxvY2tfdAkJZmlmb19sb2NrOworCXdhaXRfcXVldWVfaGVhZF90CWZpZm9fcHJvY19saXN0OworCWF0b21pY190CQlvcGVuX2NvdW50OworfTsKK3N0YXRpYyBzdHJ1Y3Qgc29ueXBpX2NvbXBhdF9zIHNvbnlwaV9jb21wYXQgPSB7CisJLm9wZW5fY291bnQgPSBBVE9NSUNfSU5JVCgwKSwKK307CisKK3N0YXRpYyBpbnQgc29ueXBpX21pc2NfZmFzeW5jKGludCBmZCwgc3RydWN0IGZpbGUgKmZpbHAsIGludCBvbikKK3sKKwlpbnQgcmV0dmFsOworCisJcmV0dmFsID0gZmFzeW5jX2hlbHBlcihmZCwgZmlscCwgb24sICZzb255cGlfY29tcGF0LmZpZm9fYXN5bmMpOworCWlmIChyZXR2YWwgPCAwKQorCQlyZXR1cm4gcmV0dmFsOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNvbnlwaV9taXNjX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJYXRvbWljX2RlYygmc29ueXBpX2NvbXBhdC5vcGVuX2NvdW50KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzb255cGlfbWlzY19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCS8qIEZsdXNoIGlucHV0IHF1ZXVlIG9uIGZpcnN0IG9wZW4gKi8KKwlsb2NrX2tlcm5lbCgpOworCWlmIChhdG9taWNfaW5jX3JldHVybigmc29ueXBpX2NvbXBhdC5vcGVuX2NvdW50KSA9PSAxKQorCQlrZmlmb19yZXNldChzb255cGlfY29tcGF0LmZpZm8pOworCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHNzaXplX3Qgc29ueXBpX21pc2NfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcG9zKQoreworCXNzaXplX3QgcmV0OworCXVuc2lnbmVkIGNoYXIgYzsKKworCWlmICgoa2ZpZm9fbGVuKHNvbnlwaV9jb21wYXQuZmlmbykgPT0gMCkgJiYKKwkgICAgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSkKKwkJcmV0dXJuIC1FQUdBSU47CisKKwlyZXQgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoc29ueXBpX2NvbXBhdC5maWZvX3Byb2NfbGlzdCwKKwkJCQkgICAgICAga2ZpZm9fbGVuKHNvbnlwaV9jb21wYXQuZmlmbykgIT0gMCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXdoaWxlIChyZXQgPCBjb3VudCAmJgorCSAgICAgICAoa2ZpZm9fZ2V0KHNvbnlwaV9jb21wYXQuZmlmbywgJmMsIHNpemVvZihjKSkgPT0gc2l6ZW9mKGMpKSkgeworCQlpZiAocHV0X3VzZXIoYywgYnVmKyspKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldCsrOworCX0KKworCWlmIChyZXQgPiAwKSB7CisJCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOworCQlpbm9kZS0+aV9hdGltZSA9IGN1cnJlbnRfZnNfdGltZShpbm9kZS0+aV9zYik7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBzb255cGlfbWlzY19wb2xsKHN0cnVjdCBmaWxlICpmaWxlLCBwb2xsX3RhYmxlICp3YWl0KQoreworCXBvbGxfd2FpdChmaWxlLCAmc29ueXBpX2NvbXBhdC5maWZvX3Byb2NfbGlzdCwgd2FpdCk7CisJaWYgKGtmaWZvX2xlbihzb255cGlfY29tcGF0LmZpZm8pKQorCQlyZXR1cm4gUE9MTElOIHwgUE9MTFJETk9STTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBlY19yZWFkMTYodTggYWRkciwgdTE2ICp2YWx1ZSkKK3sKKwl1OCB2YWxfbGIsIHZhbF9oYjsKKwlpZiAoZWNfcmVhZChhZGRyLCAmdmFsX2xiKSkKKwkJcmV0dXJuIC0xOworCWlmIChlY19yZWFkKGFkZHIgKyAxLCAmdmFsX2hiKSkKKwkJcmV0dXJuIC0xOworCSp2YWx1ZSA9IHZhbF9sYiB8ICh2YWxfaGIgPDwgOCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc29ueXBpX21pc2NfaW9jdGwoc3RydWN0IGlub2RlICppcCwgc3RydWN0IGZpbGUgKmZwLAorCQkJICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlpbnQgcmV0ID0gMDsKKwl2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKwl1OCB2YWw4OworCXUxNiB2YWwxNjsKKwlpbnQgdmFsdWU7CisKKwltdXRleF9sb2NrKCZzcGljX2Rldi5sb2NrKTsKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgU09OWVBJX0lPQ0dCUlQ6CisJCWlmIChzb255X2JhY2tsaWdodF9kZXZpY2UgPT0gTlVMTCkgeworCQkJcmV0ID0gLUVJTzsKKwkJCWJyZWFrOworCQl9CisJCWlmIChhY3BpX2NhbGxnZXRmdW5jKHNvbnlfbmNfYWNwaV9oYW5kbGUsICJHQlJUIiwgJnZhbHVlKSkgeworCQkJcmV0ID0gLUVJTzsKKwkJCWJyZWFrOworCQl9CisJCXZhbDggPSAoKHZhbHVlICYgMHhmZikgLSAxKSA8PCA1OworCQlpZiAoY29weV90b191c2VyKGFyZ3AsICZ2YWw4LCBzaXplb2YodmFsOCkpKQorCQkJCXJldCA9IC1FRkFVTFQ7CisJCWJyZWFrOworCWNhc2UgU09OWVBJX0lPQ1NCUlQ6CisJCWlmIChzb255X2JhY2tsaWdodF9kZXZpY2UgPT0gTlVMTCkgeworCQkJcmV0ID0gLUVJTzsKKwkJCWJyZWFrOworCQl9CisJCWlmIChjb3B5X2Zyb21fdXNlcigmdmFsOCwgYXJncCwgc2l6ZW9mKHZhbDgpKSkgeworCQkJcmV0ID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisJCWlmIChhY3BpX2NhbGxzZXRmdW5jKHNvbnlfbmNfYWNwaV9oYW5kbGUsICJTQlJUIiwKKwkJCQkodmFsOCA+PiA1KSArIDEsIE5VTEwpKSB7CisJCQlyZXQgPSAtRUlPOworCQkJYnJlYWs7CisJCX0KKwkJLyogc3luYyB0aGUgYmFja2xpZ2h0IGRldmljZSBzdGF0dXMgKi8KKwkJc29ueV9iYWNrbGlnaHRfZGV2aWNlLT5wcm9wcy5icmlnaHRuZXNzID0KKwkJICAgIHNvbnlfYmFja2xpZ2h0X2dldF9icmlnaHRuZXNzKHNvbnlfYmFja2xpZ2h0X2RldmljZSk7CisJCWJyZWFrOworCWNhc2UgU09OWVBJX0lPQ0dCQVQxQ0FQOgorCQlpZiAoZWNfcmVhZDE2KFNPTllQSV9CQVQxX0ZVTEwsICZ2YWwxNikpIHsKKwkJCXJldCA9IC1FSU87CisJCQlicmVhazsKKwkJfQorCQlpZiAoY29weV90b191c2VyKGFyZ3AsICZ2YWwxNiwgc2l6ZW9mKHZhbDE2KSkpCisJCQlyZXQgPSAtRUZBVUxUOworCQlicmVhazsKKwljYXNlIFNPTllQSV9JT0NHQkFUMVJFTToKKwkJaWYgKGVjX3JlYWQxNihTT05ZUElfQkFUMV9MRUZULCAmdmFsMTYpKSB7CisJCQlyZXQgPSAtRUlPOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmdmFsMTYsIHNpemVvZih2YWwxNikpKQorCQkJcmV0ID0gLUVGQVVMVDsKKwkJYnJlYWs7CisJY2FzZSBTT05ZUElfSU9DR0JBVDJDQVA6CisJCWlmIChlY19yZWFkMTYoU09OWVBJX0JBVDJfRlVMTCwgJnZhbDE2KSkgeworCQkJcmV0ID0gLUVJTzsKKwkJCWJyZWFrOworCQl9CisJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJnZhbDE2LCBzaXplb2YodmFsMTYpKSkKKwkJCXJldCA9IC1FRkFVTFQ7CisJCWJyZWFrOworCWNhc2UgU09OWVBJX0lPQ0dCQVQyUkVNOgorCQlpZiAoZWNfcmVhZDE2KFNPTllQSV9CQVQyX0xFRlQsICZ2YWwxNikpIHsKKwkJCXJldCA9IC1FSU87CisJCQlicmVhazsKKwkJfQorCQlpZiAoY29weV90b191c2VyKGFyZ3AsICZ2YWwxNiwgc2l6ZW9mKHZhbDE2KSkpCisJCQlyZXQgPSAtRUZBVUxUOworCQlicmVhazsKKwljYXNlIFNPTllQSV9JT0NHQkFURkxBR1M6CisJCWlmIChlY19yZWFkKFNPTllQSV9CQVRfRkxBR1MsICZ2YWw4KSkgeworCQkJcmV0ID0gLUVJTzsKKwkJCWJyZWFrOworCQl9CisJCXZhbDggJj0gMHgwNzsKKwkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmdmFsOCwgc2l6ZW9mKHZhbDgpKSkKKwkJCXJldCA9IC1FRkFVTFQ7CisJCWJyZWFrOworCWNhc2UgU09OWVBJX0lPQ0dCTFVFOgorCQl2YWw4ID0gc3BpY19kZXYuYmx1ZXRvb3RoX3Bvd2VyOworCQlpZiAoY29weV90b191c2VyKGFyZ3AsICZ2YWw4LCBzaXplb2YodmFsOCkpKQorCQkJcmV0ID0gLUVGQVVMVDsKKwkJYnJlYWs7CisJY2FzZSBTT05ZUElfSU9DU0JMVUU6CisJCWlmIChjb3B5X2Zyb21fdXNlcigmdmFsOCwgYXJncCwgc2l6ZW9mKHZhbDgpKSkgeworCQkJcmV0ID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisJCV9fc29ueV9waWNfc2V0X2JsdWV0b290aHBvd2VyKHZhbDgpOworCQlicmVhazsKKwkvKiBGQU4gQ29udHJvbHMgKi8KKwljYXNlIFNPTllQSV9JT0NHRkFOOgorCQlpZiAoc29ueV9waWNfZ2V0X2ZhbnNwZWVkKCZ2YWw4KSkgeworCQkJcmV0ID0gLUVJTzsKKwkJCWJyZWFrOworCQl9CisJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJnZhbDgsIHNpemVvZih2YWw4KSkpCisJCQlyZXQgPSAtRUZBVUxUOworCQlicmVhazsKKwljYXNlIFNPTllQSV9JT0NTRkFOOgorCQlpZiAoY29weV9mcm9tX3VzZXIoJnZhbDgsIGFyZ3AsIHNpemVvZih2YWw4KSkpIHsKKwkJCXJldCA9IC1FRkFVTFQ7CisJCQlicmVhazsKKwkJfQorCQlpZiAoc29ueV9waWNfc2V0X2ZhbnNwZWVkKHZhbDgpKQorCQkJcmV0ID0gLUVJTzsKKwkJYnJlYWs7CisJLyogR0VUIFRlbXBlcmF0dXJlICh1c2VmdWwgdW5kZXIgQVBNKSAqLworCWNhc2UgU09OWVBJX0lPQ0dURU1QOgorCQlpZiAoZWNfcmVhZChTT05ZUElfVEVNUF9TVEFUVVMsICZ2YWw4KSkgeworCQkJcmV0ID0gLUVJTzsKKwkJCWJyZWFrOworCQl9CisJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJnZhbDgsIHNpemVvZih2YWw4KSkpCisJCQlyZXQgPSAtRUZBVUxUOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXQgPSAtRUlOVkFMOworCX0KKwltdXRleF91bmxvY2soJnNwaWNfZGV2LmxvY2spOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHNvbnlwaV9taXNjX2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5yZWFkCQk9IHNvbnlwaV9taXNjX3JlYWQsCisJLnBvbGwJCT0gc29ueXBpX21pc2NfcG9sbCwKKwkub3BlbgkJPSBzb255cGlfbWlzY19vcGVuLAorCS5yZWxlYXNlCT0gc29ueXBpX21pc2NfcmVsZWFzZSwKKwkuZmFzeW5jCQk9IHNvbnlwaV9taXNjX2Zhc3luYywKKwkuaW9jdGwJCT0gc29ueXBpX21pc2NfaW9jdGwsCit9OworCitzdGF0aWMgc3RydWN0IG1pc2NkZXZpY2Ugc29ueXBpX21pc2NfZGV2aWNlID0geworCS5taW5vcgkJPSBNSVNDX0RZTkFNSUNfTUlOT1IsCisJLm5hbWUJCT0gInNvbnlwaSIsCisJLmZvcHMJCT0gJnNvbnlwaV9taXNjX2ZvcHMsCit9OworCitzdGF0aWMgdm9pZCBzb255cGlfY29tcGF0X3JlcG9ydF9ldmVudCh1OCBldmVudCkKK3sKKwlrZmlmb19wdXQoc29ueXBpX2NvbXBhdC5maWZvLCAodW5zaWduZWQgY2hhciAqKSZldmVudCwgc2l6ZW9mKGV2ZW50KSk7CisJa2lsbF9mYXN5bmMoJnNvbnlwaV9jb21wYXQuZmlmb19hc3luYywgU0lHSU8sIFBPTExfSU4pOworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmc29ueXBpX2NvbXBhdC5maWZvX3Byb2NfbGlzdCk7Cit9CisKK3N0YXRpYyBpbnQgc29ueXBpX2NvbXBhdF9pbml0KHZvaWQpCit7CisJaW50IGVycm9yOworCisJc3Bpbl9sb2NrX2luaXQoJnNvbnlwaV9jb21wYXQuZmlmb19sb2NrKTsKKwlzb255cGlfY29tcGF0LmZpZm8gPSBrZmlmb19hbGxvYyhTT05ZX0xBUFRPUF9CVUZfU0laRSwgR0ZQX0tFUk5FTCwKKwkJCQkJICZzb255cGlfY29tcGF0LmZpZm9fbG9jayk7CisJaWYgKElTX0VSUihzb255cGlfY29tcGF0LmZpZm8pKSB7CisJCXByaW50ayhLRVJOX0VSUiBEUlZfUEZYICJrZmlmb19hbGxvYyBmYWlsZWRcbiIpOworCQlyZXR1cm4gUFRSX0VSUihzb255cGlfY29tcGF0LmZpZm8pOworCX0KKworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnNvbnlwaV9jb21wYXQuZmlmb19wcm9jX2xpc3QpOworCisJaWYgKG1pbm9yICE9IC0xKQorCQlzb255cGlfbWlzY19kZXZpY2UubWlub3IgPSBtaW5vcjsKKwllcnJvciA9IG1pc2NfcmVnaXN0ZXIoJnNvbnlwaV9taXNjX2RldmljZSk7CisJaWYgKGVycm9yKSB7CisJCXByaW50ayhLRVJOX0VSUiBEUlZfUEZYICJtaXNjX3JlZ2lzdGVyIGZhaWxlZFxuIik7CisJCWdvdG8gZXJyX2ZyZWVfa2ZpZm87CisJfQorCWlmIChtaW5vciA9PSAtMSkKKwkJcHJpbnRrKEtFUk5fSU5GTyBEUlZfUEZYICJkZXZpY2UgYWxsb2NhdGVkIG1pbm9yIGlzICVkXG4iLAorCQkgICAgICAgc29ueXBpX21pc2NfZGV2aWNlLm1pbm9yKTsKKworCXJldHVybiAwOworCitlcnJfZnJlZV9rZmlmbzoKKwlrZmlmb19mcmVlKHNvbnlwaV9jb21wYXQuZmlmbyk7CisJcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgdm9pZCBzb255cGlfY29tcGF0X2V4aXQodm9pZCkKK3sKKwltaXNjX2RlcmVnaXN0ZXIoJnNvbnlwaV9taXNjX2RldmljZSk7CisJa2ZpZm9fZnJlZShzb255cGlfY29tcGF0LmZpZm8pOworfQorI2Vsc2UKK3N0YXRpYyBpbnQgc29ueXBpX2NvbXBhdF9pbml0KHZvaWQpIHsgcmV0dXJuIDA7IH0KK3N0YXRpYyB2b2lkIHNvbnlwaV9jb21wYXRfZXhpdCh2b2lkKSB7IH0KK3N0YXRpYyB2b2lkIHNvbnlwaV9jb21wYXRfcmVwb3J0X2V2ZW50KHU4IGV2ZW50KSB7IH0KKyNlbmRpZiAvKiBDT05GSUdfU09OWVBJX0NPTVBBVCAqLworCisvKgorICogQUNQSSBjYWxsYmFja3MKKyAqLworc3RhdGljIGFjcGlfc3RhdHVzCitzb255X3BpY19yZWFkX3Bvc3NpYmxlX3Jlc291cmNlKHN0cnVjdCBhY3BpX3Jlc291cmNlICpyZXNvdXJjZSwgdm9pZCAqY29udGV4dCkKK3sKKwl1MzIgaTsKKwlzdHJ1Y3Qgc29ueV9waWNfZGV2ICpkZXYgPSAoc3RydWN0IHNvbnlfcGljX2RldiAqKWNvbnRleHQ7CisKKwlzd2l0Y2ggKHJlc291cmNlLT50eXBlKSB7CisJY2FzZSBBQ1BJX1JFU09VUkNFX1RZUEVfU1RBUlRfREVQRU5ERU5UOgorCQl7CisJCQkvKiBzdGFydCBJTyBlbnVtZXJhdGlvbiAqLworCQkJc3RydWN0IHNvbnlfcGljX2lvcG9ydCAqaW9wb3J0ID0ga3phbGxvYyhzaXplb2YoKmlvcG9ydCksIEdGUF9LRVJORUwpOworCQkJaWYgKCFpb3BvcnQpCisJCQkJcmV0dXJuIEFFX0VSUk9SOworCisJCQlsaXN0X2FkZCgmaW9wb3J0LT5saXN0LCAmZGV2LT5pb3BvcnRzKTsKKwkJCXJldHVybiBBRV9PSzsKKwkJfQorCisJY2FzZSBBQ1BJX1JFU09VUkNFX1RZUEVfRU5EX0RFUEVOREVOVDoKKwkJLyogZW5kIElPIGVudW1lcmF0aW9uICovCisJCXJldHVybiBBRV9PSzsKKworCWNhc2UgQUNQSV9SRVNPVVJDRV9UWVBFX0lSUToKKwkJeworCQkJc3RydWN0IGFjcGlfcmVzb3VyY2VfaXJxICpwID0gJnJlc291cmNlLT5kYXRhLmlycTsKKwkJCXN0cnVjdCBzb255X3BpY19pcnEgKmludGVycnVwdCA9IE5VTEw7CisJCQlpZiAoIXAgfHwgIXAtPmludGVycnVwdF9jb3VudCkgeworCQkJCS8qCisJCQkJICogSVJRIGRlc2NyaXB0b3JzIG1heSBoYXZlIG5vIElSUSMgYml0cyBzZXQsCisJCQkJICogcGFydGljdWxhcmx5IHRob3NlIHRob3NlIHcvIF9TVEEgZGlzYWJsZWQKKwkJCQkgKi8KKwkJCQlkcHJpbnRrKCJCbGFuayBJUlEgcmVzb3VyY2VcbiIpOworCQkJCXJldHVybiBBRV9PSzsKKwkJCX0KKwkJCWZvciAoaSA9IDA7IGkgPCBwLT5pbnRlcnJ1cHRfY291bnQ7IGkrKykgeworCQkJCWlmICghcC0+aW50ZXJydXB0c1tpXSkgeworCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HIERSVl9QRlgKKwkJCQkJCQkiSW52YWxpZCBJUlEgJWRcbiIsCisJCQkJCQkJcC0+aW50ZXJydXB0c1tpXSk7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCQlpbnRlcnJ1cHQgPSBremFsbG9jKHNpemVvZigqaW50ZXJydXB0KSwKKwkJCQkJCUdGUF9LRVJORUwpOworCQkJCWlmICghaW50ZXJydXB0KQorCQkJCQlyZXR1cm4gQUVfRVJST1I7CisKKwkJCQlsaXN0X2FkZCgmaW50ZXJydXB0LT5saXN0LCAmZGV2LT5pbnRlcnJ1cHRzKTsKKwkJCQlpbnRlcnJ1cHQtPmlycS50cmlnZ2VyaW5nID0gcC0+dHJpZ2dlcmluZzsKKwkJCQlpbnRlcnJ1cHQtPmlycS5wb2xhcml0eSA9IHAtPnBvbGFyaXR5OworCQkJCWludGVycnVwdC0+aXJxLnNoYXJhYmxlID0gcC0+c2hhcmFibGU7CisJCQkJaW50ZXJydXB0LT5pcnEuaW50ZXJydXB0X2NvdW50ID0gMTsKKwkJCQlpbnRlcnJ1cHQtPmlycS5pbnRlcnJ1cHRzWzBdID0gcC0+aW50ZXJydXB0c1tpXTsKKwkJCX0KKwkJCXJldHVybiBBRV9PSzsKKwkJfQorCWNhc2UgQUNQSV9SRVNPVVJDRV9UWVBFX0lPOgorCQl7CisJCQlzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9pbyAqaW8gPSAmcmVzb3VyY2UtPmRhdGEuaW87CisJCQlzdHJ1Y3Qgc29ueV9waWNfaW9wb3J0ICppb3BvcnQgPQorCQkJCWxpc3RfZmlyc3RfZW50cnkoJmRldi0+aW9wb3J0cywgc3RydWN0IHNvbnlfcGljX2lvcG9ydCwgbGlzdCk7CisJCQlpZiAoIWlvKSB7CisJCQkJZHByaW50aygiQmxhbmsgSU8gcmVzb3VyY2VcbiIpOworCQkJCXJldHVybiBBRV9PSzsKKwkJCX0KKworCQkJaWYgKCFpb3BvcnQtPmlvMS5taW5pbXVtKSB7CisJCQkJbWVtY3B5KCZpb3BvcnQtPmlvMSwgaW8sIHNpemVvZigqaW8pKTsKKwkJCQlkcHJpbnRrKCJJTzEgYXQgMHglLjR4ICgweCUuMngpXG4iLCBpb3BvcnQtPmlvMS5taW5pbXVtLAorCQkJCQkJaW9wb3J0LT5pbzEuYWRkcmVzc19sZW5ndGgpOworCQkJfQorCQkJZWxzZSBpZiAoIWlvcG9ydC0+aW8yLm1pbmltdW0pIHsKKwkJCQltZW1jcHkoJmlvcG9ydC0+aW8yLCBpbywgc2l6ZW9mKCppbykpOworCQkJCWRwcmludGsoIklPMiBhdCAweCUuNHggKDB4JS4yeClcbiIsIGlvcG9ydC0+aW8yLm1pbmltdW0sCisJCQkJCQlpb3BvcnQtPmlvMi5hZGRyZXNzX2xlbmd0aCk7CisJCQl9CisJCQllbHNlIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgRFJWX1BGWCAiVW5rbm93biBTUElDIFR5cGUsIG1vcmUgdGhhbiAyIElPIFBvcnRzXG4iKTsKKwkJCQlyZXR1cm4gQUVfRVJST1I7CisJCQl9CisJCQlyZXR1cm4gQUVfT0s7CisJCX0KKwlkZWZhdWx0OgorCQlkcHJpbnRrKCJSZXNvdXJjZSAlZCBpc24ndCBhbiBJUlEgbm9yIGFuIElPIHBvcnRcbiIsCisJCQkJcmVzb3VyY2UtPnR5cGUpOworCisJY2FzZSBBQ1BJX1JFU09VUkNFX1RZUEVfRU5EX1RBRzoKKwkJcmV0dXJuIEFFX09LOworCX0KKwlyZXR1cm4gQUVfQ1RSTF9URVJNSU5BVEU7Cit9CisKK3N0YXRpYyBpbnQgc29ueV9waWNfcG9zc2libGVfcmVzb3VyY2VzKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKQoreworCWludCByZXN1bHQgPSAwOworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOworCisJaWYgKCFkZXZpY2UpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogZ2V0IGRldmljZSBzdGF0dXMgKi8KKwkvKiBzZWUgYWNwaV9wY2lfbGlua19nZXRfY3VycmVudCBhY3BpX3BjaV9saW5rX2dldF9wb3NzaWJsZSAqLworCWRwcmludGsoIkV2YWx1YXRpbmcgX1NUQVxuIik7CisJcmVzdWx0ID0gYWNwaV9idXNfZ2V0X3N0YXR1cyhkZXZpY2UpOworCWlmIChyZXN1bHQpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyBEUlZfUEZYICJVbmFibGUgdG8gcmVhZCBzdGF0dXNcbiIpOworCQlnb3RvIGVuZDsKKwl9CisKKwlpZiAoIWRldmljZS0+c3RhdHVzLmVuYWJsZWQpCisJCWRwcmludGsoIkRldmljZSBkaXNhYmxlZFxuIik7CisJZWxzZQorCQlkcHJpbnRrKCJEZXZpY2UgZW5hYmxlZFxuIik7CisKKwkvKgorCSAqIFF1ZXJ5IGFuZCBwYXJzZSAnbWV0aG9kJworCSAqLworCWRwcmludGsoIkV2YWx1YXRpbmcgJXNcbiIsIE1FVEhPRF9OQU1FX19QUlMpOworCXN0YXR1cyA9IGFjcGlfd2Fsa19yZXNvdXJjZXMoZGV2aWNlLT5oYW5kbGUsIE1FVEhPRF9OQU1FX19QUlMsCisJCQlzb255X3BpY19yZWFkX3Bvc3NpYmxlX3Jlc291cmNlLCAmc3BpY19kZXYpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HIERSVl9QRlgKKwkJCQkiRmFpbHVyZSBldmFsdWF0aW5nICVzXG4iLAorCQkJCU1FVEhPRF9OQU1FX19QUlMpOworCQlyZXN1bHQgPSAtRU5PREVWOworCX0KK2VuZDoKKwlyZXR1cm4gcmVzdWx0OworfQorCisvKgorICogIERpc2FibGUgdGhlIHNwaWMgZGV2aWNlIGJ5IGNhbGxpbmcgaXRzIF9ESVMgbWV0aG9kCisgKi8KK3N0YXRpYyBpbnQgc29ueV9waWNfZGlzYWJsZShzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSkKK3sKKwlhY3BpX3N0YXR1cyByZXQgPSBhY3BpX2V2YWx1YXRlX29iamVjdChkZXZpY2UtPmhhbmRsZSwgIl9ESVMiLCBOVUxMLAorCQkJCQkgICAgICAgTlVMTCk7CisKKwlpZiAoQUNQSV9GQUlMVVJFKHJldCkgJiYgcmV0ICE9IEFFX05PVF9GT1VORCkKKwkJcmV0dXJuIC1FTlhJTzsKKworCWRwcmludGsoIkRldmljZSBkaXNhYmxlZFxuIik7CisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqICBCYXNlZCBvbiBkcml2ZXJzL2FjcGkvcGNpX2xpbmsuYzphY3BpX3BjaV9saW5rX3NldAorICoKKyAqICBDYWxsIF9TUlMgdG8gc2V0IGN1cnJlbnQgcmVzb3VyY2VzCisgKi8KK3N0YXRpYyBpbnQgc29ueV9waWNfZW5hYmxlKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlLAorCQlzdHJ1Y3Qgc29ueV9waWNfaW9wb3J0ICppb3BvcnQsIHN0cnVjdCBzb255X3BpY19pcnEgKmlycSkKK3sKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJaW50IHJlc3VsdCA9IDA7CisJLyogVHlwZSAxIHJlc291cmNlIGxheW91dCBpczoKKwkgKiAgICBJTworCSAqICAgIElPCisJICogICAgSVJRTm9GbGFncworCSAqICAgIEVuZAorCSAqCisJICogVHlwZSAyIGFuZCAzIHJlc291cmNlIGxheW91dCBpczoKKwkgKiAgICBJTworCSAqICAgIElSUU5vRmxhZ3MKKwkgKiAgICBFbmQKKwkgKi8KKwlzdHJ1Y3QgeworCQlzdHJ1Y3QgYWNwaV9yZXNvdXJjZSByZXMxOworCQlzdHJ1Y3QgYWNwaV9yZXNvdXJjZSByZXMyOworCQlzdHJ1Y3QgYWNwaV9yZXNvdXJjZSByZXMzOworCQlzdHJ1Y3QgYWNwaV9yZXNvdXJjZSByZXM0OworCX0gKnJlc291cmNlOworCXN0cnVjdCBhY3BpX2J1ZmZlciBidWZmZXIgPSB7IDAsIE5VTEwgfTsKKworCWlmICghaW9wb3J0IHx8ICFpcnEpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogaW5pdCBhY3BpX2J1ZmZlciAqLworCXJlc291cmNlID0ga3phbGxvYyhzaXplb2YoKnJlc291cmNlKSArIDEsIEdGUF9LRVJORUwpOworCWlmICghcmVzb3VyY2UpCisJCXJldHVybiAtRU5PTUVNOworCisJYnVmZmVyLmxlbmd0aCA9IHNpemVvZigqcmVzb3VyY2UpICsgMTsKKwlidWZmZXIucG9pbnRlciA9IHJlc291cmNlOworCisJLyogc2V0dXAgVHlwZSAxIHJlc291cmNlcyAqLworCWlmIChzcGljX2Rldi5jb250cm9sLT5tb2RlbCA9PSBTT05ZUElfREVWSUNFX1RZUEUxKSB7CisKKwkJLyogc2V0dXAgaW8gcmVzb3VyY2VzICovCisJCXJlc291cmNlLT5yZXMxLnR5cGUgPSBBQ1BJX1JFU09VUkNFX1RZUEVfSU87CisJCXJlc291cmNlLT5yZXMxLmxlbmd0aCA9IHNpemVvZihzdHJ1Y3QgYWNwaV9yZXNvdXJjZSk7CisJCW1lbWNweSgmcmVzb3VyY2UtPnJlczEuZGF0YS5pbywgJmlvcG9ydC0+aW8xLAorCQkJCXNpemVvZihzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9pbykpOworCisJCXJlc291cmNlLT5yZXMyLnR5cGUgPSBBQ1BJX1JFU09VUkNFX1RZUEVfSU87CisJCXJlc291cmNlLT5yZXMyLmxlbmd0aCA9IHNpemVvZihzdHJ1Y3QgYWNwaV9yZXNvdXJjZSk7CisJCW1lbWNweSgmcmVzb3VyY2UtPnJlczIuZGF0YS5pbywgJmlvcG9ydC0+aW8yLAorCQkJCXNpemVvZihzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9pbykpOworCisJCS8qIHNldHVwIGlycSByZXNvdXJjZSAqLworCQlyZXNvdXJjZS0+cmVzMy50eXBlID0gQUNQSV9SRVNPVVJDRV9UWVBFX0lSUTsKKwkJcmVzb3VyY2UtPnJlczMubGVuZ3RoID0gc2l6ZW9mKHN0cnVjdCBhY3BpX3Jlc291cmNlKTsKKwkJbWVtY3B5KCZyZXNvdXJjZS0+cmVzMy5kYXRhLmlycSwgJmlycS0+aXJxLAorCQkJCXNpemVvZihzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9pcnEpKTsKKwkJLyogd2UgcmVxdWVzdGVkIGEgc2hhcmVkIGlycSAqLworCQlyZXNvdXJjZS0+cmVzMy5kYXRhLmlycS5zaGFyYWJsZSA9IEFDUElfU0hBUkVEOworCisJCXJlc291cmNlLT5yZXM0LnR5cGUgPSBBQ1BJX1JFU09VUkNFX1RZUEVfRU5EX1RBRzsKKworCX0KKwkvKiBzZXR1cCBUeXBlIDIvMyByZXNvdXJjZXMgKi8KKwllbHNlIHsKKwkJLyogc2V0dXAgaW8gcmVzb3VyY2UgKi8KKwkJcmVzb3VyY2UtPnJlczEudHlwZSA9IEFDUElfUkVTT1VSQ0VfVFlQRV9JTzsKKwkJcmVzb3VyY2UtPnJlczEubGVuZ3RoID0gc2l6ZW9mKHN0cnVjdCBhY3BpX3Jlc291cmNlKTsKKwkJbWVtY3B5KCZyZXNvdXJjZS0+cmVzMS5kYXRhLmlvLCAmaW9wb3J0LT5pbzEsCisJCQkJc2l6ZW9mKHN0cnVjdCBhY3BpX3Jlc291cmNlX2lvKSk7CisKKwkJLyogc2V0dXAgaXJxIHJlc291cmNlICovCisJCXJlc291cmNlLT5yZXMyLnR5cGUgPSBBQ1BJX1JFU09VUkNFX1RZUEVfSVJROworCQlyZXNvdXJjZS0+cmVzMi5sZW5ndGggPSBzaXplb2Yoc3RydWN0IGFjcGlfcmVzb3VyY2UpOworCQltZW1jcHkoJnJlc291cmNlLT5yZXMyLmRhdGEuaXJxLCAmaXJxLT5pcnEsCisJCQkJc2l6ZW9mKHN0cnVjdCBhY3BpX3Jlc291cmNlX2lycSkpOworCQkvKiB3ZSByZXF1ZXN0ZWQgYSBzaGFyZWQgaXJxICovCisJCXJlc291cmNlLT5yZXMyLmRhdGEuaXJxLnNoYXJhYmxlID0gQUNQSV9TSEFSRUQ7CisKKwkJcmVzb3VyY2UtPnJlczMudHlwZSA9IEFDUElfUkVTT1VSQ0VfVFlQRV9FTkRfVEFHOworCX0KKworCS8qIEF0dGVtcHQgdG8gc2V0IHRoZSByZXNvdXJjZSAqLworCWRwcmludGsoIkV2YWx1YXRpbmcgX1NSU1xuIik7CisJc3RhdHVzID0gYWNwaV9zZXRfY3VycmVudF9yZXNvdXJjZXMoZGV2aWNlLT5oYW5kbGUsICZidWZmZXIpOworCisJLyogY2hlY2sgZm9yIHRvdGFsIGZhaWx1cmUgKi8KKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIERSVl9QRlggIkVycm9yIGV2YWx1YXRpbmcgX1NSU1xuIik7CisJCXJlc3VsdCA9IC1FTk9ERVY7CisJCWdvdG8gZW5kOworCX0KKworCS8qIE5lY2Vzc2FyeSBkZXZpY2UgaW5pdGlhbGl6YXRpb25zIGNhbGxzIChmcm9tIHNvbnlwaSkgKi8KKwlzb255X3BpY19jYWxsMSgweDgyKTsKKwlzb255X3BpY19jYWxsMigweDgxLCAweGZmKTsKKwlzb255X3BpY19jYWxsMShjb21wYXQgPyAweDkyIDogMHg4Mik7CisKK2VuZDoKKwlrZnJlZShyZXNvdXJjZSk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworLyoqKioqKioqKioqKioqKioqCisgKgorICogSVNSOiBzb21lIGV2ZW50IGlzIGF2YWlsYWJsZQorICoKKyAqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCBzb255X3BpY19pcnEoaW50IGlycSwgdm9pZCAqZGV2X2lkKQoreworCWludCBpLCBqOworCXU4IGV2ID0gMDsKKwl1OCBkYXRhX21hc2sgPSAwOworCXU4IGRldmljZV9ldmVudCA9IDA7CisKKwlzdHJ1Y3Qgc29ueV9waWNfZGV2ICpkZXYgPSAoc3RydWN0IHNvbnlfcGljX2RldiAqKSBkZXZfaWQ7CisKKwlldiA9IGluYl9wKGRldi0+Y3VyX2lvcG9ydC0+aW8xLm1pbmltdW0pOworCWlmIChkZXYtPmN1cl9pb3BvcnQtPmlvMi5taW5pbXVtKQorCQlkYXRhX21hc2sgPSBpbmJfcChkZXYtPmN1cl9pb3BvcnQtPmlvMi5taW5pbXVtKTsKKwllbHNlCisJCWRhdGFfbWFzayA9IGluYl9wKGRldi0+Y3VyX2lvcG9ydC0+aW8xLm1pbmltdW0gKworCQkJCWRldi0+Y29udHJvbC0+ZXZwb3J0X29mZnNldCk7CisKKwlkcHJpbnRrKCJldmVudCAoWyUuMnhdIFslLjJ4XSkgYXQgcG9ydCAweCUuNHgoKzB4JS4yeClcbiIsCisJCQlldiwgZGF0YV9tYXNrLCBkZXYtPmN1cl9pb3BvcnQtPmlvMS5taW5pbXVtLAorCQkJZGV2LT5jb250cm9sLT5ldnBvcnRfb2Zmc2V0KTsKKworCWlmIChldiA9PSAweDAwIHx8IGV2ID09IDB4ZmYpCisJCXJldHVybiBJUlFfSEFORExFRDsKKworCWZvciAoaSA9IDA7IGRldi0+Y29udHJvbC0+ZXZlbnRfdHlwZXNbaV0ubWFzazsgaSsrKSB7CisKKwkJaWYgKChkYXRhX21hc2sgJiBkZXYtPmNvbnRyb2wtPmV2ZW50X3R5cGVzW2ldLmRhdGEpICE9CisJCSAgICBkZXYtPmNvbnRyb2wtPmV2ZW50X3R5cGVzW2ldLmRhdGEpCisJCQljb250aW51ZTsKKworCQlpZiAoIShtYXNrICYgZGV2LT5jb250cm9sLT5ldmVudF90eXBlc1tpXS5tYXNrKSkKKwkJCWNvbnRpbnVlOworCisJCWZvciAoaiA9IDA7IGRldi0+Y29udHJvbC0+ZXZlbnRfdHlwZXNbaV0uZXZlbnRzW2pdLmV2ZW50OyBqKyspIHsKKwkJCWlmIChldiA9PSBkZXYtPmNvbnRyb2wtPmV2ZW50X3R5cGVzW2ldLmV2ZW50c1tqXS5kYXRhKSB7CisJCQkJZGV2aWNlX2V2ZW50ID0KKwkJCQkJZGV2LT5jb250cm9sLT4KKwkJCQkJCWV2ZW50X3R5cGVzW2ldLmV2ZW50c1tqXS5ldmVudDsKKwkJCQlnb3RvIGZvdW5kOworCQkJfQorCQl9CisJfQorCS8qIFN0aWxsIG5vdCBhYmxlIHRvIGRlY29kZSB0aGUgZXZlbnQgdHJ5IHRvIHBhc3MKKwkgKiBpdCBvdmVyIHRvIHRoZSBtaW5pZHJpdmVyCisJICovCisJaWYgKGRldi0+Y29udHJvbC0+aGFuZGxlX2lycSAmJgorCQkJZGV2LT5jb250cm9sLT5oYW5kbGVfaXJxKGRhdGFfbWFzaywgZXYpID09IDApCisJCXJldHVybiBJUlFfSEFORExFRDsKKworCWRwcmludGsoInVua25vd24gZXZlbnQgKFslLjJ4XSBbJS4yeF0pIGF0IHBvcnQgMHglLjR4KCsweCUuMngpXG4iLAorCQkJZXYsIGRhdGFfbWFzaywgZGV2LT5jdXJfaW9wb3J0LT5pbzEubWluaW11bSwKKwkJCWRldi0+Y29udHJvbC0+ZXZwb3J0X29mZnNldCk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworCitmb3VuZDoKKwlzb255X2xhcHRvcF9yZXBvcnRfaW5wdXRfZXZlbnQoZGV2aWNlX2V2ZW50KTsKKwlhY3BpX2J1c19nZW5lcmF0ZV9wcm9jX2V2ZW50KGRldi0+YWNwaV9kZXYsIDEsIGRldmljZV9ldmVudCk7CisJc29ueXBpX2NvbXBhdF9yZXBvcnRfZXZlbnQoZGV2aWNlX2V2ZW50KTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworLyoqKioqKioqKioqKioqKioqCisgKgorICogIEFDUEkgZHJpdmVyCisgKgorICoqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBzb255X3BpY19yZW1vdmUoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UsIGludCB0eXBlKQoreworCXN0cnVjdCBzb255X3BpY19pb3BvcnQgKmlvLCAqdG1wX2lvOworCXN0cnVjdCBzb255X3BpY19pcnEgKmlycSwgKnRtcF9pcnE7CisKKwlpZiAoc29ueV9waWNfZGlzYWJsZShkZXZpY2UpKSB7CisJCXByaW50ayhLRVJOX0VSUiBEUlZfUEZYICJDb3VsZG4ndCBkaXNhYmxlIGRldmljZS5cbiIpOworCQlyZXR1cm4gLUVOWElPOworCX0KKworCWZyZWVfaXJxKHNwaWNfZGV2LmN1cl9pcnEtPmlycS5pbnRlcnJ1cHRzWzBdLCAmc3BpY19kZXYpOworCXJlbGVhc2VfcmVnaW9uKHNwaWNfZGV2LmN1cl9pb3BvcnQtPmlvMS5taW5pbXVtLAorCQkJc3BpY19kZXYuY3VyX2lvcG9ydC0+aW8xLmFkZHJlc3NfbGVuZ3RoKTsKKwlpZiAoc3BpY19kZXYuY3VyX2lvcG9ydC0+aW8yLm1pbmltdW0pCisJCXJlbGVhc2VfcmVnaW9uKHNwaWNfZGV2LmN1cl9pb3BvcnQtPmlvMi5taW5pbXVtLAorCQkJCXNwaWNfZGV2LmN1cl9pb3BvcnQtPmlvMi5hZGRyZXNzX2xlbmd0aCk7CisKKwlzb255cGlfY29tcGF0X2V4aXQoKTsKKworCXNvbnlfbGFwdG9wX3JlbW92ZV9pbnB1dCgpOworCisJLyogcGYgYXR0cnMgKi8KKwlzeXNmc19yZW1vdmVfZ3JvdXAoJnNvbnlfcGZfZGV2aWNlLT5kZXYua29iaiwgJnNwaWNfYXR0cmlidXRlX2dyb3VwKTsKKwlzb255X3BmX3JlbW92ZSgpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGlvLCB0bXBfaW8sICZzcGljX2Rldi5pb3BvcnRzLCBsaXN0KSB7CisJCWxpc3RfZGVsKCZpby0+bGlzdCk7CisJCWtmcmVlKGlvKTsKKwl9CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGlycSwgdG1wX2lycSwgJnNwaWNfZGV2LmludGVycnVwdHMsIGxpc3QpIHsKKwkJbGlzdF9kZWwoJmlycS0+bGlzdCk7CisJCWtmcmVlKGlycSk7CisJfQorCXNwaWNfZGV2LmN1cl9pb3BvcnQgPSBOVUxMOworCXNwaWNfZGV2LmN1cl9pcnEgPSBOVUxMOworCisJZHByaW50ayhTT05ZX1BJQ19EUklWRVJfTkFNRSAiIHJlbW92ZWQuXG4iKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzb255X3BpY19hZGQoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpCit7CisJaW50IHJlc3VsdDsKKwlzdHJ1Y3Qgc29ueV9waWNfaW9wb3J0ICppbywgKnRtcF9pbzsKKwlzdHJ1Y3Qgc29ueV9waWNfaXJxICppcnEsICp0bXBfaXJxOworCisJcHJpbnRrKEtFUk5fSU5GTyBEUlZfUEZYICIlcyB2JXMuXG4iLAorCQlTT05ZX1BJQ19EUklWRVJfTkFNRSwgU09OWV9MQVBUT1BfRFJJVkVSX1ZFUlNJT04pOworCisJc3BpY19kZXYuYWNwaV9kZXYgPSBkZXZpY2U7CisJc3RyY3B5KGFjcGlfZGV2aWNlX2NsYXNzKGRldmljZSksICJzb255L2hvdGtleSIpOworCXNvbnlfcGljX2RldGVjdF9kZXZpY2VfdHlwZSgmc3BpY19kZXYpOworCW11dGV4X2luaXQoJnNwaWNfZGV2LmxvY2spOworCisJLyogcmVhZCBfUFJTIHJlc291cmNlcyAqLworCXJlc3VsdCA9IHNvbnlfcGljX3Bvc3NpYmxlX3Jlc291cmNlcyhkZXZpY2UpOworCWlmIChyZXN1bHQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIERSVl9QRlgKKwkJCQkiVW5hYmUgdG8gcmVhZCBwb3NzaWJsZSByZXNvdXJjZXMuXG4iKTsKKwkJZ290byBlcnJfZnJlZV9yZXNvdXJjZXM7CisJfQorCisJLyogc2V0dXAgaW5wdXQgZGV2aWNlcyBhbmQgaGVscGVyIGZpZm8gKi8KKwlyZXN1bHQgPSBzb255X2xhcHRvcF9zZXR1cF9pbnB1dChkZXZpY2UpOworCWlmIChyZXN1bHQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIERSVl9QRlgKKwkJCQkiVW5hYmUgdG8gY3JlYXRlIGlucHV0IGRldmljZXMuXG4iKTsKKwkJZ290byBlcnJfZnJlZV9yZXNvdXJjZXM7CisJfQorCisJaWYgKHNvbnlwaV9jb21wYXRfaW5pdCgpKQorCQlnb3RvIGVycl9yZW1vdmVfaW5wdXQ7CisKKwkvKiByZXF1ZXN0IGlvIHBvcnQgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JldmVyc2UoaW8sICZzcGljX2Rldi5pb3BvcnRzLCBsaXN0KSB7CisJCWlmIChyZXF1ZXN0X3JlZ2lvbihpby0+aW8xLm1pbmltdW0sIGlvLT5pbzEuYWRkcmVzc19sZW5ndGgsCisJCQkJCSJTb255IFByb2dyYW1hYmxlIEkvTyBEZXZpY2UiKSkgeworCQkJZHByaW50aygiSS9PIHBvcnQxOiAweCUuNHggKDB4JS40eCkgKyAweCUuMnhcbiIsCisJCQkJCWlvLT5pbzEubWluaW11bSwgaW8tPmlvMS5tYXhpbXVtLAorCQkJCQlpby0+aW8xLmFkZHJlc3NfbGVuZ3RoKTsKKwkJCS8qIFR5cGUgMSBoYXZlIDIgaW9wb3J0cyAqLworCQkJaWYgKGlvLT5pbzIubWluaW11bSkgeworCQkJCWlmIChyZXF1ZXN0X3JlZ2lvbihpby0+aW8yLm1pbmltdW0sCisJCQkJCQlpby0+aW8yLmFkZHJlc3NfbGVuZ3RoLAorCQkJCQkJIlNvbnkgUHJvZ3JhbWFibGUgSS9PIERldmljZSIpKSB7CisJCQkJCWRwcmludGsoIkkvTyBwb3J0MjogMHglLjR4ICgweCUuNHgpICsgMHglLjJ4XG4iLAorCQkJCQkJCWlvLT5pbzIubWluaW11bSwgaW8tPmlvMi5tYXhpbXVtLAorCQkJCQkJCWlvLT5pbzIuYWRkcmVzc19sZW5ndGgpOworCQkJCQlzcGljX2Rldi5jdXJfaW9wb3J0ID0gaW87CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQllbHNlIHsKKwkJCQkJZHByaW50aygiVW5hYmxlIHRvIGdldCBJL08gcG9ydDI6ICIKKwkJCQkJCQkiMHglLjR4ICgweCUuNHgpICsgMHglLjJ4XG4iLAorCQkJCQkJCWlvLT5pbzIubWluaW11bSwgaW8tPmlvMi5tYXhpbXVtLAorCQkJCQkJCWlvLT5pbzIuYWRkcmVzc19sZW5ndGgpOworCQkJCQlyZWxlYXNlX3JlZ2lvbihpby0+aW8xLm1pbmltdW0sCisJCQkJCQkJaW8tPmlvMS5hZGRyZXNzX2xlbmd0aCk7CisJCQkJfQorCQkJfQorCQkJZWxzZSB7CisJCQkJc3BpY19kZXYuY3VyX2lvcG9ydCA9IGlvOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCWlmICghc3BpY19kZXYuY3VyX2lvcG9ydCkgeworCQlwcmludGsoS0VSTl9FUlIgRFJWX1BGWCAiRmFpbGVkIHRvIHJlcXVlc3RfcmVnaW9uLlxuIik7CisJCXJlc3VsdCA9IC1FTk9ERVY7CisJCWdvdG8gZXJyX3JlbW92ZV9jb21wYXQ7CisJfQorCisJLyogcmVxdWVzdCBJUlEgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JldmVyc2UoaXJxLCAmc3BpY19kZXYuaW50ZXJydXB0cywgbGlzdCkgeworCQlpZiAoIXJlcXVlc3RfaXJxKGlycS0+aXJxLmludGVycnVwdHNbMF0sIHNvbnlfcGljX2lycSwKKwkJCQkJSVJRRl9TSEFSRUQsICJzb255LWxhcHRvcCIsICZzcGljX2RldikpIHsKKwkJCWRwcmludGsoIklSUTogJWQgLSB0cmlnZ2VyaW5nOiAlZCAtICIKKwkJCQkJInBvbGFyaXR5OiAlZCAtIHNocjogJWRcbiIsCisJCQkJCWlycS0+aXJxLmludGVycnVwdHNbMF0sCisJCQkJCWlycS0+aXJxLnRyaWdnZXJpbmcsCisJCQkJCWlycS0+aXJxLnBvbGFyaXR5LAorCQkJCQlpcnEtPmlycS5zaGFyYWJsZSk7CisJCQlzcGljX2Rldi5jdXJfaXJxID0gaXJxOworCQkJYnJlYWs7CisJCX0KKwl9CisJaWYgKCFzcGljX2Rldi5jdXJfaXJxKSB7CisJCXByaW50ayhLRVJOX0VSUiBEUlZfUEZYICJGYWlsZWQgdG8gcmVxdWVzdF9pcnEuXG4iKTsKKwkJcmVzdWx0ID0gLUVOT0RFVjsKKwkJZ290byBlcnJfcmVsZWFzZV9yZWdpb247CisJfQorCisJLyogc2V0IHJlc291cmNlIHN0YXR1cyBfU1JTICovCisJcmVzdWx0ID0gc29ueV9waWNfZW5hYmxlKGRldmljZSwgc3BpY19kZXYuY3VyX2lvcG9ydCwgc3BpY19kZXYuY3VyX2lycSk7CisJaWYgKHJlc3VsdCkgeworCQlwcmludGsoS0VSTl9FUlIgRFJWX1BGWCAiQ291bGRuJ3QgZW5hYmxlIGRldmljZS5cbiIpOworCQlnb3RvIGVycl9mcmVlX2lycTsKKwl9CisKKwlzcGljX2Rldi5ibHVldG9vdGhfcG93ZXIgPSAtMTsKKwkvKiBjcmVhdGUgZGV2aWNlIGF0dHJpYnV0ZXMgKi8KKwlyZXN1bHQgPSBzb255X3BmX2FkZCgpOworCWlmIChyZXN1bHQpCisJCWdvdG8gZXJyX2Rpc2FibGVfZGV2aWNlOworCisJcmVzdWx0ID0gc3lzZnNfY3JlYXRlX2dyb3VwKCZzb255X3BmX2RldmljZS0+ZGV2LmtvYmosICZzcGljX2F0dHJpYnV0ZV9ncm91cCk7CisJaWYgKHJlc3VsdCkKKwkJZ290byBlcnJfcmVtb3ZlX3BmOworCisJcmV0dXJuIDA7CisKK2Vycl9yZW1vdmVfcGY6CisJc29ueV9wZl9yZW1vdmUoKTsKKworZXJyX2Rpc2FibGVfZGV2aWNlOgorCXNvbnlfcGljX2Rpc2FibGUoZGV2aWNlKTsKKworZXJyX2ZyZWVfaXJxOgorCWZyZWVfaXJxKHNwaWNfZGV2LmN1cl9pcnEtPmlycS5pbnRlcnJ1cHRzWzBdLCAmc3BpY19kZXYpOworCitlcnJfcmVsZWFzZV9yZWdpb246CisJcmVsZWFzZV9yZWdpb24oc3BpY19kZXYuY3VyX2lvcG9ydC0+aW8xLm1pbmltdW0sCisJCQlzcGljX2Rldi5jdXJfaW9wb3J0LT5pbzEuYWRkcmVzc19sZW5ndGgpOworCWlmIChzcGljX2Rldi5jdXJfaW9wb3J0LT5pbzIubWluaW11bSkKKwkJcmVsZWFzZV9yZWdpb24oc3BpY19kZXYuY3VyX2lvcG9ydC0+aW8yLm1pbmltdW0sCisJCQkJc3BpY19kZXYuY3VyX2lvcG9ydC0+aW8yLmFkZHJlc3NfbGVuZ3RoKTsKKworZXJyX3JlbW92ZV9jb21wYXQ6CisJc29ueXBpX2NvbXBhdF9leGl0KCk7CisKK2Vycl9yZW1vdmVfaW5wdXQ6CisJc29ueV9sYXB0b3BfcmVtb3ZlX2lucHV0KCk7CisKK2Vycl9mcmVlX3Jlc291cmNlczoKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoaW8sIHRtcF9pbywgJnNwaWNfZGV2LmlvcG9ydHMsIGxpc3QpIHsKKwkJbGlzdF9kZWwoJmlvLT5saXN0KTsKKwkJa2ZyZWUoaW8pOworCX0KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoaXJxLCB0bXBfaXJxLCAmc3BpY19kZXYuaW50ZXJydXB0cywgbGlzdCkgeworCQlsaXN0X2RlbCgmaXJxLT5saXN0KTsKKwkJa2ZyZWUoaXJxKTsKKwl9CisJc3BpY19kZXYuY3VyX2lvcG9ydCA9IE5VTEw7CisJc3BpY19kZXYuY3VyX2lycSA9IE5VTEw7CisKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgaW50IHNvbnlfcGljX3N1c3BlbmQoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3sKKwlpZiAoc29ueV9waWNfZGlzYWJsZShkZXZpY2UpKQorCQlyZXR1cm4gLUVOWElPOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNvbnlfcGljX3Jlc3VtZShzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSkKK3sKKwlzb255X3BpY19lbmFibGUoZGV2aWNlLCBzcGljX2Rldi5jdXJfaW9wb3J0LCBzcGljX2Rldi5jdXJfaXJxKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBhY3BpX2RldmljZV9pZCBzb255X3BpY19kZXZpY2VfaWRzW10gPSB7CisJe1NPTllfUElDX0hJRCwgMH0sCisJeyIiLCAwfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYWNwaV9kcml2ZXIgc29ueV9waWNfZHJpdmVyID0geworCS5uYW1lID0gU09OWV9QSUNfRFJJVkVSX05BTUUsCisJLmNsYXNzID0gU09OWV9QSUNfQ0xBU1MsCisJLmlkcyA9IHNvbnlfcGljX2RldmljZV9pZHMsCisJLm93bmVyID0gVEhJU19NT0RVTEUsCisJLm9wcyA9IHsKKwkJLmFkZCA9IHNvbnlfcGljX2FkZCwKKwkJLnJlbW92ZSA9IHNvbnlfcGljX3JlbW92ZSwKKwkJLnN1c3BlbmQgPSBzb255X3BpY19zdXNwZW5kLAorCQkucmVzdW1lID0gc29ueV9waWNfcmVzdW1lLAorCQl9LAorfTsKKworc3RhdGljIHN0cnVjdCBkbWlfc3lzdGVtX2lkIF9faW5pdGRhdGEgc29ueXBpX2RtaV90YWJsZVtdID0geworCXsKKwkJLmlkZW50ID0gIlNvbnkgVmFpbyIsCisJCS5tYXRjaGVzID0geworCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiU29ueSBDb3Jwb3JhdGlvbiIpLAorCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJQQ0ctIiksCisJCX0sCisJfSwKKwl7CisJCS5pZGVudCA9ICJTb255IFZhaW8iLAorCQkubWF0Y2hlcyA9IHsKKwkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIlNvbnkgQ29ycG9yYXRpb24iKSwKKwkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiVkdOLSIpLAorCQl9LAorCX0sCisJeyB9Cit9OworCitzdGF0aWMgaW50IF9faW5pdCBzb255X2xhcHRvcF9pbml0KHZvaWQpCit7CisJaW50IHJlc3VsdDsKKworCWlmICghbm9fc3BpYyAmJiBkbWlfY2hlY2tfc3lzdGVtKHNvbnlwaV9kbWlfdGFibGUpKSB7CisJCXJlc3VsdCA9IGFjcGlfYnVzX3JlZ2lzdGVyX2RyaXZlcigmc29ueV9waWNfZHJpdmVyKTsKKwkJaWYgKHJlc3VsdCkgeworCQkJcHJpbnRrKEtFUk5fRVJSIERSVl9QRlgKKwkJCQkJIlVuYWJsZSB0byByZWdpc3RlciBTUElDIGRyaXZlci4iKTsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCisJcmVzdWx0ID0gYWNwaV9idXNfcmVnaXN0ZXJfZHJpdmVyKCZzb255X25jX2RyaXZlcik7CisJaWYgKHJlc3VsdCkgeworCQlwcmludGsoS0VSTl9FUlIgRFJWX1BGWCAiVW5hYmxlIHRvIHJlZ2lzdGVyIFNOQyBkcml2ZXIuIik7CisJCWdvdG8gb3V0X3VucmVnaXN0ZXJfcGljOworCX0KKworCXJldHVybiAwOworCitvdXRfdW5yZWdpc3Rlcl9waWM6CisJaWYgKCFub19zcGljKQorCQlhY3BpX2J1c191bnJlZ2lzdGVyX2RyaXZlcigmc29ueV9waWNfZHJpdmVyKTsKK291dDoKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgc29ueV9sYXB0b3BfZXhpdCh2b2lkKQoreworCWFjcGlfYnVzX3VucmVnaXN0ZXJfZHJpdmVyKCZzb255X25jX2RyaXZlcik7CisJaWYgKCFub19zcGljKQorCQlhY3BpX2J1c191bnJlZ2lzdGVyX2RyaXZlcigmc29ueV9waWNfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoc29ueV9sYXB0b3BfaW5pdCk7Cittb2R1bGVfZXhpdChzb255X2xhcHRvcF9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGxhdGZvcm0veDg2L3RjMTEwMC13bWkuYyBiL2RyaXZlcnMvcGxhdGZvcm0veDg2L3RjMTEwMC13bWkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNGE0YWE5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9wbGF0Zm9ybS94ODYvdGMxMTAwLXdtaS5jCkBAIC0wLDAgKzEsMjg5IEBACisvKgorICogIEhQIENvbXBhcSBUQzExMDAgVGFibGV0IFdNSSBFeHRyYXMgRHJpdmVyCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNyBDYXJsb3MgQ29yYmFjaG8gPGNhcmxvc0BzdHJhbmdld29ybGRzLmNvLnVrPgorICogIENvcHlyaWdodCAoQykgMjAwNCBKYW1leSBIaWNrcyA8amFtZXkuaGlja3NAaHAuY29tPgorICogIENvcHlyaWdodCAoQykgMjAwMSwgMjAwMiBBbmR5IEdyb3ZlciA8YW5kcmV3Lmdyb3ZlckBpbnRlbC5jb20+CisgKiAgQ29weXJpZ2h0IChDKSAyMDAxLCAyMDAyIFBhdWwgRGllZmVuYmF1Z2ggPHBhdWwucy5kaWVmZW5iYXVnaEBpbnRlbC5jb20+CisgKgorICogfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAorICogIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBLgorICoKKyAqIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgorI2luY2x1ZGUgPGFjcGkvYWNwaV9idXMuaD4KKyNpbmNsdWRlIDxhY3BpL2FjcGlfZHJpdmVycy5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorCisjZGVmaW5lIEdVSUQgIkMzNjRBQzcxLTM2REItNDk1QS04NDk0LUI0MzlENDcyQTUwNSIKKworI2RlZmluZSBUQzExMDBfSU5TVEFOQ0VfV0lSRUxFU1MJCTEKKyNkZWZpbmUgVEMxMTAwX0lOU1RBTkNFX0pPR0RJQUwJCTIKKworI2RlZmluZSBUQzExMDBfTE9HUFJFRklYICJ0YzExMDAtd21pOiAiCisjZGVmaW5lIFRDMTEwMF9JTkZPIEtFUk5fSU5GTyBUQzExMDBfTE9HUFJFRklYCisKK01PRFVMRV9BVVRIT1IoIkphbWV5IEhpY2tzLCBDYXJsb3MgQ29yYmFjaG8iKTsKK01PRFVMRV9ERVNDUklQVElPTigiSFAgQ29tcGFxIFRDMTEwMCBUYWJsZXQgV01JIEV4dHJhcyIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTKCJ3bWk6QzM2NEFDNzEtMzZEQi00OTVBLTg0OTQtQjQzOUQ0NzJBNTA1Iik7CisKK3N0YXRpYyBpbnQgdGMxMTAwX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldmljZSk7CitzdGF0aWMgaW50IHRjMTEwMF9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2aWNlKTsKK3N0YXRpYyBpbnQgdGMxMTAwX3N1c3BlbmQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2aWNlLCBwbV9tZXNzYWdlX3Qgc3RhdGUpOworc3RhdGljIGludCB0YzExMDBfcmVzdW1lKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldmljZSk7CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHRjMTEwMF9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAidGMxMTAwLXdtaSIsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCX0sCisJLnByb2JlID0gdGMxMTAwX3Byb2JlLAorCS5yZW1vdmUgPSB0YzExMDBfcmVtb3ZlLAorCS5zdXNwZW5kID0gdGMxMTAwX3N1c3BlbmQsCisJLnJlc3VtZSA9IHRjMTEwMF9yZXN1bWUsCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqdGMxMTAwX2RldmljZTsKKworc3RydWN0IHRjMTEwMF9kYXRhIHsKKwl1MzIgd2lyZWxlc3M7CisJdTMyIGpvZ2RpYWw7Cit9OworCitzdGF0aWMgc3RydWN0IHRjMTEwMF9kYXRhIHN1c3BlbmRfZGF0YTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJCQlEZXZpY2UgTWFuYWdlbWVudAorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGludCBnZXRfc3RhdGUodTMyICpvdXQsIHU4IGluc3RhbmNlKQoreworCXUzMiB0bXA7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCXN0cnVjdCBhY3BpX2J1ZmZlciByZXN1bHQgPSB7IEFDUElfQUxMT0NBVEVfQlVGRkVSLCBOVUxMIH07CisJdW5pb24gYWNwaV9vYmplY3QgKm9iajsKKworCWlmICghb3V0KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChpbnN0YW5jZSA+IDIpCisJCXJldHVybiAtRU5PREVWOworCisJc3RhdHVzID0gd21pX3F1ZXJ5X2Jsb2NrKEdVSUQsIGluc3RhbmNlLCAmcmVzdWx0KTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpCisJCXJldHVybiAtRU5PREVWOworCisJb2JqID0gKHVuaW9uIGFjcGlfb2JqZWN0ICopIHJlc3VsdC5wb2ludGVyOworCWlmIChvYmogJiYgb2JqLT50eXBlID09IEFDUElfVFlQRV9CVUZGRVIgJiYKKwkJb2JqLT5idWZmZXIubGVuZ3RoID09IHNpemVvZih1MzIpKSB7CisJCXRtcCA9ICooKHUzMiAqKSBvYmotPmJ1ZmZlci5wb2ludGVyKTsKKwl9IGVsc2UgeworCQl0bXAgPSAwOworCX0KKworCWlmIChyZXN1bHQubGVuZ3RoID4gMCAmJiByZXN1bHQucG9pbnRlcikKKwkJa2ZyZWUocmVzdWx0LnBvaW50ZXIpOworCisJc3dpdGNoIChpbnN0YW5jZSkgeworCWNhc2UgVEMxMTAwX0lOU1RBTkNFX1dJUkVMRVNTOgorCQkqb3V0ID0gKHRtcCA9PSAzKSA/IDEgOiAwOworCQlyZXR1cm4gMDsKKwljYXNlIFRDMTEwMF9JTlNUQU5DRV9KT0dESUFMOgorCQkqb3V0ID0gKHRtcCA9PSAxKSA/IDEgOiAwOworCQlyZXR1cm4gMDsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVOT0RFVjsKKwl9Cit9CisKK3N0YXRpYyBpbnQgc2V0X3N0YXRlKHUzMiAqaW4sIHU4IGluc3RhbmNlKQoreworCXUzMiB2YWx1ZTsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJc3RydWN0IGFjcGlfYnVmZmVyIGlucHV0OworCisJaWYgKCFpbikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoaW5zdGFuY2UgPiAyKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXN3aXRjaCAoaW5zdGFuY2UpIHsKKwljYXNlIFRDMTEwMF9JTlNUQU5DRV9XSVJFTEVTUzoKKwkJdmFsdWUgPSAoKmluKSA/IDEgOiAyOworCQlicmVhazsKKwljYXNlIFRDMTEwMF9JTlNUQU5DRV9KT0dESUFMOgorCQl2YWx1ZSA9ICgqaW4pID8gMCA6IDE7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWlucHV0Lmxlbmd0aCA9IHNpemVvZih1MzIpOworCWlucHV0LnBvaW50ZXIgPSAmdmFsdWU7CisKKwlzdGF0dXMgPSB3bWlfc2V0X2Jsb2NrKEdVSUQsIGluc3RhbmNlLCAmaW5wdXQpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlyZXR1cm4gMDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJCQlGUyBJbnRlcmZhY2UgKC9zeXMpCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogUmVhZC8gd3JpdGUgYm9vbCBzeXNmcyBtYWNybworICovCisjZGVmaW5lIHNob3dfc2V0X2Jvb2wodmFsdWUsIGluc3RhbmNlKSBcCitzdGF0aWMgc3NpemVfdCBcCitzaG93X2Jvb2xfIyN2YWx1ZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBcCisJY2hhciAqYnVmKSBcCit7IFwKKwl1MzIgcmVzdWx0OyBcCisJYWNwaV9zdGF0dXMgc3RhdHVzID0gZ2V0X3N0YXRlKCZyZXN1bHQsIGluc3RhbmNlKTsgXAorCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkgXAorCQlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgcmVzdWx0KTsgXAorCXJldHVybiBzcHJpbnRmKGJ1ZiwgIlJlYWQgZXJyb3JcbiIpOyBcCit9IFwKK1wKK3N0YXRpYyBzc2l6ZV90IFwKK3NldF9ib29sXyMjdmFsdWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgXAorCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KSBcCit7IFwKKwl1MzIgdG1wID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCk7IFwKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBzZXRfc3RhdGUoJnRtcCwgaW5zdGFuY2UpOyBcCisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgXAorCQkJcmV0dXJuIC1FSU5WQUw7IFwKKwlyZXR1cm4gY291bnQ7IFwKK30gXAorc3RhdGljIERFVklDRV9BVFRSKHZhbHVlLCBTX0lXVUdPIHwgU19JUlVHTyB8IFNfSVdVU1IsIFwKKwlzaG93X2Jvb2xfIyN2YWx1ZSwgc2V0X2Jvb2xfIyN2YWx1ZSk7CisKK3Nob3dfc2V0X2Jvb2wod2lyZWxlc3MsIFRDMTEwMF9JTlNUQU5DRV9XSVJFTEVTUyk7CitzaG93X3NldF9ib29sKGpvZ2RpYWwsIFRDMTEwMF9JTlNUQU5DRV9KT0dESUFMKTsKKworc3RhdGljIHZvaWQgcmVtb3ZlX2ZzKHZvaWQpCit7CisJZGV2aWNlX3JlbW92ZV9maWxlKCZ0YzExMDBfZGV2aWNlLT5kZXYsICZkZXZfYXR0cl93aXJlbGVzcyk7CisJZGV2aWNlX3JlbW92ZV9maWxlKCZ0YzExMDBfZGV2aWNlLT5kZXYsICZkZXZfYXR0cl9qb2dkaWFsKTsKK30KKworc3RhdGljIGludCBhZGRfZnModm9pZCkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZ0YzExMDBfZGV2aWNlLT5kZXYsICZkZXZfYXR0cl93aXJlbGVzcyk7CisJaWYgKHJldCkKKwkJZ290byBhZGRfc3lzZnNfZXJyb3I7CisKKwlyZXQgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJnRjMTEwMF9kZXZpY2UtPmRldiwgJmRldl9hdHRyX2pvZ2RpYWwpOworCWlmIChyZXQpCisJCWdvdG8gYWRkX3N5c2ZzX2Vycm9yOworCisJcmV0dXJuIHJldDsKKworYWRkX3N5c2ZzX2Vycm9yOgorCXJlbW92ZV9mcygpOworCXJldHVybiByZXQ7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCQkJRHJpdmVyIE1vZGVsCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgaW50IHRjMTEwMF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXZpY2UpCit7CisJaW50IHJlc3VsdCA9IDA7CisKKwlyZXN1bHQgPSBhZGRfZnMoKTsKKwlyZXR1cm4gcmVzdWx0OworfQorCisKK3N0YXRpYyBpbnQgdGMxMTAwX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXZpY2UpCit7CisJcmVtb3ZlX2ZzKCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGMxMTAwX3N1c3BlbmQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCit7CisJaW50IHJldDsKKworCXJldCA9IGdldF9zdGF0ZSgmc3VzcGVuZF9kYXRhLndpcmVsZXNzLCBUQzExMDBfSU5TVEFOQ0VfV0lSRUxFU1MpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBnZXRfc3RhdGUoJnN1c3BlbmRfZGF0YS5qb2dkaWFsLCBUQzExMDBfSU5TVEFOQ0VfSk9HRElBTCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdGMxMTAwX3Jlc3VtZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCit7CisJaW50IHJldDsKKworCXJldCA9IHNldF9zdGF0ZSgmc3VzcGVuZF9kYXRhLndpcmVsZXNzLCBUQzExMDBfSU5TVEFOQ0VfV0lSRUxFU1MpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBzZXRfc3RhdGUoJnN1c3BlbmRfZGF0YS5qb2dkaWFsLCBUQzExMDBfSU5TVEFOQ0VfSk9HRElBTCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHRjMTEwMF9pbml0KHZvaWQpCit7CisJaW50IHJlc3VsdCA9IDA7CisKKwlpZiAoIXdtaV9oYXNfZ3VpZChHVUlEKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlyZXN1bHQgPSBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnRjMTEwMF9kcml2ZXIpOworCWlmIChyZXN1bHQpCisJCXJldHVybiByZXN1bHQ7CisKKwl0YzExMDBfZGV2aWNlID0gcGxhdGZvcm1fZGV2aWNlX2FsbG9jKCJ0YzExMDAtd21pIiwgLTEpOworCXBsYXRmb3JtX2RldmljZV9hZGQodGMxMTAwX2RldmljZSk7CisKKwlwcmludGsoVEMxMTAwX0lORk8gIkhQIENvbXBhcSBUQzExMDAgVGFibGV0IFdNSSBFeHRyYXMgbG9hZGVkXG4iKTsKKworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB0YzExMDBfZXhpdCh2b2lkKQoreworCXBsYXRmb3JtX2RldmljZV9kZWwodGMxMTAwX2RldmljZSk7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnRjMTEwMF9kcml2ZXIpOworCisJcHJpbnRrKFRDMTEwMF9JTkZPICJIUCBDb21wYXEgVEMxMTAwIFRhYmxldCBXTUkgRXh0cmFzIHVubG9hZGVkXG4iKTsKK30KKworbW9kdWxlX2luaXQodGMxMTAwX2luaXQpOworbW9kdWxlX2V4aXQodGMxMTAwX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wbGF0Zm9ybS94ODYvdGhpbmtwYWRfYWNwaS5jIGIvZHJpdmVycy9wbGF0Zm9ybS94ODYvdGhpbmtwYWRfYWNwaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjYmMwNTEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3BsYXRmb3JtL3g4Ni90aGlua3BhZF9hY3BpLmMKQEAgLTAsMCArMSw3NTU0IEBACisvKgorICogIHRoaW5rcGFkX2FjcGkuYyAtIFRoaW5rUGFkIEFDUEkgRXh0cmFzCisgKgorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNSBCb3Jpc2xhdiBEZWlhbm92IDxib3Jpc2xhdkB1c2Vycy5zZi5uZXQ+CisgKiAgQ29weXJpZ2h0IChDKSAyMDA2LTIwMDggSGVucmlxdWUgZGUgTW9yYWVzIEhvbHNjaHVoIDxobWhAaG1oLmVuZy5icj4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqICAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2RlZmluZSBUUEFDUElfVkVSU0lPTiAiMC4yMiIKKyNkZWZpbmUgVFBBQ1BJX1NZU0ZTX1ZFUlNJT04gMHgwMjAyMDAKKworLyoKKyAqICBDaGFuZ2Vsb2c6CisgKiAgMjAwNy0xMC0yMAkJY2hhbmdlbG9nIHRyaW1tZWQgZG93bgorICoKKyAqICAyMDA3LTAzLTI3ICAwLjE0CXJlbmFtZWQgdG8gdGhpbmtwYWRfYWNwaSBhbmQgbW92ZWQgdG8KKyAqICAJCQlkcml2ZXJzL21pc2MuCisgKgorICogIDIwMDYtMTEtMjIJMC4xMwluZXcgbWFpbnRhaW5lcgorICogIAkJCWNoYW5nZWxvZyBub3cgbGl2ZXMgaW4gZ2l0IGNvbW1pdCBoaXN0b3J5LCBhbmQgd2lsbAorICogIAkJCW5vdCBiZSB1cGRhdGVkIGZ1cnRoZXIgaW4tZmlsZS4KKyAqCisgKiAgMjAwNS0wMy0xNwkwLjExCXN1cHBvcnQgZm9yIDYwMGUsIDc3MHgKKyAqCQkJICAgIHRoYW5rcyB0byBKYW1pZSBMZW50aW4gPGxlbnRpbmpAZGlhbC5waXBleC5jb20+CisgKgorICogIDIwMDUtMDEtMTYJMC45CXVzZSBNT0RVTEVfVkVSU0lPTgorICoJCQkgICAgdGhhbmtzIHRvIEhlbnJpayBCcml4IEFuZGVyc2VuIDxicml4QGdlbnRvby5vcmc+CisgKgkJCWZpeCBwYXJhbWV0ZXIgcGFzc2luZyBvbiBtb2R1bGUgbG9hZGluZworICoJCQkgICAgdGhhbmtzIHRvIFJ1c3R5IFJ1c3NlbGwgPHJ1c3R5QHJ1c3Rjb3JwLmNvbS5hdT4KKyAqCQkJICAgIHRoYW5rcyB0byBKaW0gUmFkZm9yZCA8cmFkZm9yZEBibGFja2JlYW4ub3JnPgorICogIDIwMDQtMTEtMDgJMC44CWZpeCBpbml0IGVycm9yIGNhc2UsIGRvbid0IHJldHVybiBmcm9tIGEgbWFjcm8KKyAqCQkJICAgIHRoYW5rcyB0byBDaHJpcyBXcmlnaHQgPGNocmlzd0Bvc2RsLm9yZz4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZyZWV6ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorCisjaW5jbHVkZSA8bGludXgvbnZyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9iYWNrbGlnaHQuaD4KKyNpbmNsdWRlIDxsaW51eC9mYi5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2h3bW9uLmg+CisjaW5jbHVkZSA8bGludXgvaHdtb24tc3lzZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgorI2luY2x1ZGUgPGxpbnV4L2xlZHMuaD4KKyNpbmNsdWRlIDxsaW51eC9yZmtpbGwuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjaW5jbHVkZSA8bGludXgvZG1pLmg+CisjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorCisjaW5jbHVkZSA8YWNwaS9hY3BpX2RyaXZlcnMuaD4KKworI2luY2x1ZGUgPGxpbnV4L3BjaV9pZHMuaD4KKworCisvKiBUaGlua1BhZCBDTU9TIGNvbW1hbmRzICovCisjZGVmaW5lIFRQX0NNT1NfVk9MVU1FX0RPV04JMAorI2RlZmluZSBUUF9DTU9TX1ZPTFVNRV9VUAkxCisjZGVmaW5lIFRQX0NNT1NfVk9MVU1FX01VVEUJMgorI2RlZmluZSBUUF9DTU9TX0JSSUdIVE5FU1NfVVAJNAorI2RlZmluZSBUUF9DTU9TX0JSSUdIVE5FU1NfRE9XTgk1CisjZGVmaW5lIFRQX0NNT1NfVEhJTktMSUdIVF9PTgkxMgorI2RlZmluZSBUUF9DTU9TX1RISU5LTElHSFRfT0ZGCTEzCisKKy8qIE5WUkFNIEFkZHJlc3NlcyAqLworZW51bSB0cF9udnJhbV9hZGRyIHsKKwlUUF9OVlJBTV9BRERSX0hLMgkJPSAweDU3LAorCVRQX05WUkFNX0FERFJfVEhJTktMSUdIVAk9IDB4NTgsCisJVFBfTlZSQU1fQUREUl9WSURFTwkJPSAweDU5LAorCVRQX05WUkFNX0FERFJfQlJJR0hUTkVTUwk9IDB4NWUsCisJVFBfTlZSQU1fQUREUl9NSVhFUgkJPSAweDYwLAorfTsKKworLyogTlZSQU0gYml0IG1hc2tzICovCitlbnVtIHsKKwlUUF9OVlJBTV9NQVNLX0hLVF9USElOS1BBRAk9IDB4MDgsCisJVFBfTlZSQU1fTUFTS19IS1RfWk9PTQkJPSAweDIwLAorCVRQX05WUkFNX01BU0tfSEtUX0RJU1BMQVkJPSAweDQwLAorCVRQX05WUkFNX01BU0tfSEtUX0hJQkVSTkFURQk9IDB4ODAsCisJVFBfTlZSQU1fTUFTS19USElOS0xJR0hUCT0gMHgxMCwKKwlUUF9OVlJBTV9NQVNLX0hLVF9ESVNQRVhQTkQJPSAweDMwLAorCVRQX05WUkFNX01BU0tfSEtUX0JSSUdIVE5FU1MJPSAweDIwLAorCVRQX05WUkFNX01BU0tfTEVWRUxfQlJJR0hUTkVTUwk9IDB4MGYsCisJVFBfTlZSQU1fUE9TX0xFVkVMX0JSSUdIVE5FU1MJPSAwLAorCVRQX05WUkFNX01BU0tfTVVURQkJPSAweDQwLAorCVRQX05WUkFNX01BU0tfSEtUX1ZPTFVNRQk9IDB4ODAsCisJVFBfTlZSQU1fTUFTS19MRVZFTF9WT0xVTUUJPSAweDBmLAorCVRQX05WUkFNX1BPU19MRVZFTF9WT0xVTUUJPSAwLAorfTsKKworLyogQUNQSSBISURzICovCisjZGVmaW5lIFRQQUNQSV9BQ1BJX0hLRVlfSElECQkiSUJNMDA2OCIKKworLyogSW5wdXQgSURzICovCisjZGVmaW5lIFRQQUNQSV9IS0VZX0lOUFVUX1BST0RVQ1QJMHg1MDU0IC8qICJUUCIgKi8KKyNkZWZpbmUgVFBBQ1BJX0hLRVlfSU5QVVRfVkVSU0lPTgkweDQxMDEKKworLyogQUNQSSBcV0dTViBjb21tYW5kcyAqLworZW51bSB7CisJVFBfQUNQSV9XR1NWX0dFVF9TVEFURQkJPSAweDAxLCAvKiBHZXQgc3RhdGUgaW5mb3JtYXRpb24gKi8KKwlUUF9BQ1BJX1dHU1ZfUFdSX09OX09OX1JFU1VNRQk9IDB4MDIsIC8qIFJlc3VtZSBXV0FOIHBvd2VyZWQgb24gKi8KKwlUUF9BQ1BJX1dHU1ZfUFdSX09GRl9PTl9SRVNVTUUJPSAweDAzLAkvKiBSZXN1bWUgV1dBTiBwb3dlcmVkIG9mZiAqLworCVRQX0FDUElfV0dTVl9TQVZFX1NUQVRFCQk9IDB4MDQsIC8qIFNhdmUgc3RhdGUgZm9yIFM0L1M1ICovCit9OworCisvKiBUUF9BQ1BJX1dHU1ZfR0VUX1NUQVRFIGJpdHMgKi8KK2VudW0geworCVRQX0FDUElfV0dTVl9TVEFURV9XV0FORVhJU1QJPSAweDAwMDEsIC8qIFdXQU4gaHcgYXZhaWxhYmxlICovCisJVFBfQUNQSV9XR1NWX1NUQVRFX1dXQU5QV1IJPSAweDAwMDIsIC8qIFdXQU4gcmFkaW8gZW5hYmxlZCAqLworCVRQX0FDUElfV0dTVl9TVEFURV9XV0FOUFdSUkVTCT0gMHgwMDA0LCAvKiBXV0FOIHN0YXRlIGF0IHJlc3VtZSAqLworCVRQX0FDUElfV0dTVl9TVEFURV9XV0FOQklPU09GRgk9IDB4MDAwOCwgLyogV1dBTiBkaXNhYmxlZCBpbiBCSU9TICovCisJVFBfQUNQSV9XR1NWX1NUQVRFX0JMVEhFWElTVAk9IDB4MDAwMSwgLyogQkxUSCBodyBhdmFpbGFibGUgKi8KKwlUUF9BQ1BJX1dHU1ZfU1RBVEVfQkxUSFBXUgk9IDB4MDAwMiwgLyogQkxUSCByYWRpbyBlbmFibGVkICovCisJVFBfQUNQSV9XR1NWX1NUQVRFX0JMVEhQV1JSRVMJPSAweDAwMDQsIC8qIEJMVEggc3RhdGUgYXQgcmVzdW1lICovCisJVFBfQUNQSV9XR1NWX1NUQVRFX0JMVEhCSU9TT0ZGCT0gMHgwMDA4LCAvKiBCTFRIIGRpc2FibGVkIGluIEJJT1MgKi8KKwlUUF9BQ1BJX1dHU1ZfU1RBVEVfVVdCRVhJU1QJPSAweDAwMTAsIC8qIFVXQiBodyBhdmFpbGFibGUgKi8KKwlUUF9BQ1BJX1dHU1ZfU1RBVEVfVVdCUFdSCT0gMHgwMDIwLCAvKiBVV0IgcmFkaW8gZW5hYmxlZCAqLworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE1haW4gZHJpdmVyCisgKi8KKworI2RlZmluZSBUUEFDUElfTkFNRSAidGhpbmtwYWQiCisjZGVmaW5lIFRQQUNQSV9ERVNDICJUaGlua1BhZCBBQ1BJIEV4dHJhcyIKKyNkZWZpbmUgVFBBQ1BJX0ZJTEUgVFBBQ1BJX05BTUUgIl9hY3BpIgorI2RlZmluZSBUUEFDUElfVVJMICJodHRwOi8vaWJtLWFjcGkuc2YubmV0LyIKKyNkZWZpbmUgVFBBQ1BJX01BSUwgImlibS1hY3BpLWRldmVsQGxpc3RzLnNvdXJjZWZvcmdlLm5ldCIKKworI2RlZmluZSBUUEFDUElfUFJPQ19ESVIgImlibSIKKyNkZWZpbmUgVFBBQ1BJX0FDUElfRVZFTlRfUFJFRklYICJpYm0iCisjZGVmaW5lIFRQQUNQSV9EUlZSX05BTUUgVFBBQ1BJX0ZJTEUKKyNkZWZpbmUgVFBBQ1BJX0RSVlJfU0hPUlROQU1FICJ0cGFjcGkiCisjZGVmaW5lIFRQQUNQSV9IV01PTl9EUlZSX05BTUUgVFBBQ1BJX05BTUUgIl9od21vbiIKKworI2RlZmluZSBUUEFDUElfTlZSQU1fS1RIUkVBRF9OQU1FICJrdHBhY3BpX252cmFtZCIKKyNkZWZpbmUgVFBBQ1BJX1dPUktRVUVVRV9OQU1FICJrdHBhY3BpZCIKKworI2RlZmluZSBUUEFDUElfTUFYX0FDUElfQVJHUyAzCisKKy8qIHJma2lsbCBzd2l0Y2hlcyAqLworZW51bSB7CisJVFBBQ1BJX1JGS19CTFVFVE9PVEhfU1dfSUQgPSAwLAorCVRQQUNQSV9SRktfV1dBTl9TV19JRCwKKwlUUEFDUElfUkZLX1VXQl9TV19JRCwKK307CisKKy8qIERlYnVnZ2luZyAqLworI2RlZmluZSBUUEFDUElfTE9HIFRQQUNQSV9GSUxFICI6ICIKKyNkZWZpbmUgVFBBQ1BJX0FMRVJUCUtFUk5fQUxFUlQgIFRQQUNQSV9MT0cKKyNkZWZpbmUgVFBBQ1BJX0NSSVQJS0VSTl9DUklUICAgVFBBQ1BJX0xPRworI2RlZmluZSBUUEFDUElfRVJSCUtFUk5fRVJSICAgIFRQQUNQSV9MT0cKKyNkZWZpbmUgVFBBQ1BJX05PVElDRQlLRVJOX05PVElDRSBUUEFDUElfTE9HCisjZGVmaW5lIFRQQUNQSV9JTkZPCUtFUk5fSU5GTyAgIFRQQUNQSV9MT0cKKyNkZWZpbmUgVFBBQ1BJX0RFQlVHCUtFUk5fREVCVUcgIFRQQUNQSV9MT0cKKworI2RlZmluZSBUUEFDUElfREJHX0FMTAkJMHhmZmZmCisjZGVmaW5lIFRQQUNQSV9EQkdfSU5JVAkJMHgwMDAxCisjZGVmaW5lIFRQQUNQSV9EQkdfRVhJVAkJMHgwMDAyCisjZGVmaW5lIGRiZ19wcmludGsoYV9kYmdfbGV2ZWwsIGZvcm1hdCwgYXJnLi4uKSBcCisJZG8geyBpZiAoZGJnX2xldmVsICYgYV9kYmdfbGV2ZWwpIFwKKwkJcHJpbnRrKFRQQUNQSV9ERUJVRyAiJXM6ICIgZm9ybWF0LCBfX2Z1bmNfXyAsICMjIGFyZyk7IFwKKwl9IHdoaWxlICgwKQorI2lmZGVmIENPTkZJR19USElOS1BBRF9BQ1BJX0RFQlVHCisjZGVmaW5lIHZkYmdfcHJpbnRrKGFfZGJnX2xldmVsLCBmb3JtYXQsIGFyZy4uLikgXAorCWRiZ19wcmludGsoYV9kYmdfbGV2ZWwsIGZvcm1hdCwgIyMgYXJnKQorc3RhdGljIGNvbnN0IGNoYXIgKnN0cl9zdXBwb3J0ZWQoaW50IGlzX3N1cHBvcnRlZCk7CisjZWxzZQorI2RlZmluZSB2ZGJnX3ByaW50ayhhX2RiZ19sZXZlbCwgZm9ybWF0LCBhcmcuLi4pCisjZW5kaWYKKworI2RlZmluZSBvbm9mZihzdGF0dXMsIGJpdCkgKChzdGF0dXMpICYgKDEgPDwgKGJpdCkpID8gIm9uIiA6ICJvZmYiKQorI2RlZmluZSBlbmFibGVkKHN0YXR1cywgYml0KSAoKHN0YXR1cykgJiAoMSA8PCAoYml0KSkgPyAiZW5hYmxlZCIgOiAiZGlzYWJsZWQiKQorI2RlZmluZSBzdHJsZW5jbXAoYSwgYikgKHN0cm5jbXAoKGEpLCAoYiksIHN0cmxlbihiKSkpCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIERyaXZlci13aWRlIHN0cnVjdHMgYW5kIG1pc2MuIHZhcmlhYmxlcworICovCisKK3N0cnVjdCBpYm1fc3RydWN0OworCitzdHJ1Y3QgdHBfYWNwaV9kcnZfc3RydWN0IHsKKwljb25zdCBzdHJ1Y3QgYWNwaV9kZXZpY2VfaWQgKmhpZDsKKwlzdHJ1Y3QgYWNwaV9kcml2ZXIgKmRyaXZlcjsKKworCXZvaWQgKCpub3RpZnkpIChzdHJ1Y3QgaWJtX3N0cnVjdCAqLCB1MzIpOworCWFjcGlfaGFuZGxlICpoYW5kbGU7CisJdTMyIHR5cGU7CisJc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2U7Cit9OworCitzdHJ1Y3QgaWJtX3N0cnVjdCB7CisJY2hhciAqbmFtZTsKKworCWludCAoKnJlYWQpIChjaGFyICopOworCWludCAoKndyaXRlKSAoY2hhciAqKTsKKwl2b2lkICgqZXhpdCkgKHZvaWQpOworCXZvaWQgKCpyZXN1bWUpICh2b2lkKTsKKwl2b2lkICgqc3VzcGVuZCkgKHBtX21lc3NhZ2VfdCBzdGF0ZSk7CisJdm9pZCAoKnNodXRkb3duKSAodm9pZCk7CisKKwlzdHJ1Y3QgbGlzdF9oZWFkIGFsbF9kcml2ZXJzOworCisJc3RydWN0IHRwX2FjcGlfZHJ2X3N0cnVjdCAqYWNwaTsKKworCXN0cnVjdCB7CisJCXU4IGFjcGlfZHJpdmVyX3JlZ2lzdGVyZWQ6MTsKKwkJdTggYWNwaV9ub3RpZnlfaW5zdGFsbGVkOjE7CisJCXU4IHByb2NfY3JlYXRlZDoxOworCQl1OCBpbml0X2NhbGxlZDoxOworCQl1OCBleHBlcmltZW50YWw6MTsKKwl9IGZsYWdzOworfTsKKworc3RydWN0IGlibV9pbml0X3N0cnVjdCB7CisJY2hhciBwYXJhbVszMl07CisKKwlpbnQgKCppbml0KSAoc3RydWN0IGlibV9pbml0X3N0cnVjdCAqKTsKKwlzdHJ1Y3QgaWJtX3N0cnVjdCAqZGF0YTsKK307CisKK3N0YXRpYyBzdHJ1Y3QgeworI2lmZGVmIENPTkZJR19USElOS1BBRF9BQ1BJX0JBWQorCXUzMiBiYXlfc3RhdHVzOjE7CisJdTMyIGJheV9lamVjdDoxOworCXUzMiBiYXlfc3RhdHVzMjoxOworCXUzMiBiYXlfZWplY3QyOjE7CisjZW5kaWYKKwl1MzIgYmx1ZXRvb3RoOjE7CisJdTMyIGhvdGtleToxOworCXUzMiBob3RrZXlfbWFzazoxOworCXUzMiBob3RrZXlfd2xzdzoxOworCXUzMiBob3RrZXlfdGFibGV0OjE7CisJdTMyIGxpZ2h0OjE7CisJdTMyIGxpZ2h0X3N0YXR1czoxOworCXUzMiBicmlnaHRfMTZsZXZlbHM6MTsKKwl1MzIgYnJpZ2h0X2FjcGltb2RlOjE7CisJdTMyIHdhbjoxOworCXUzMiB1d2I6MTsKKwl1MzIgZmFuX2N0cmxfc3RhdHVzX3VuZGVmOjE7CisJdTMyIGlucHV0X2RldmljZV9yZWdpc3RlcmVkOjE7CisJdTMyIHBsYXRmb3JtX2Rydl9yZWdpc3RlcmVkOjE7CisJdTMyIHBsYXRmb3JtX2Rydl9hdHRyc19yZWdpc3RlcmVkOjE7CisJdTMyIHNlbnNvcnNfcGRydl9yZWdpc3RlcmVkOjE7CisJdTMyIHNlbnNvcnNfcGRydl9hdHRyc19yZWdpc3RlcmVkOjE7CisJdTMyIHNlbnNvcnNfcGRldl9hdHRyc19yZWdpc3RlcmVkOjE7CisJdTMyIGhvdGtleV9wb2xsX2FjdGl2ZToxOworfSB0cF9mZWF0dXJlczsKKworc3RhdGljIHN0cnVjdCB7CisJdTE2IGhvdGtleV9tYXNrX2ZmOjE7CisJdTE2IGJyaWdodF9jbW9zX2VjX3Vuc3luYzoxOworfSB0cF93YXJuZWQ7CisKK3N0cnVjdCB0aGlua3BhZF9pZF9kYXRhIHsKKwl1bnNpZ25lZCBpbnQgdmVuZG9yOwkvKiBUaGlua1BhZCB2ZW5kb3I6CisJCQkJICogUENJX1ZFTkRPUl9JRF9JQk0vUENJX1ZFTkRPUl9JRF9MRU5PVk8gKi8KKworCWNoYXIgKmJpb3NfdmVyc2lvbl9zdHI7CS8qIFNvbWV0aGluZyBsaWtlIDFaRVQ1MVdXICgxLjAzeikgKi8KKwljaGFyICplY192ZXJzaW9uX3N0cjsJLyogU29tZXRoaW5nIGxpa2UgMVpIVDUxV1ctMS4wNGEgKi8KKworCXUxNiBiaW9zX21vZGVsOwkJLyogQmlnIEVuZGlhbiwgVFAtMVkgPSAweDU5MzEsIDAgPSB1bmtub3duICovCisJdTE2IGVjX21vZGVsOworCisJY2hhciAqbW9kZWxfc3RyOwkvKiBUaGlua1BhZCBUNDMgKi8KKwljaGFyICpudW1tb2RlbF9zdHI7CS8qIDkzODRBOUMgZm9yIGEgOTM4NC1BOUMgbW9kZWwgKi8KK307CitzdGF0aWMgc3RydWN0IHRoaW5rcGFkX2lkX2RhdGEgdGhpbmtwYWRfaWQ7CisKK3N0YXRpYyBlbnVtIHsKKwlUUEFDUElfTElGRV9JTklUID0gMCwKKwlUUEFDUElfTElGRV9SVU5OSU5HLAorCVRQQUNQSV9MSUZFX0VYSVRJTkcsCit9IHRwYWNwaV9saWZlY3ljbGU7CisKK3N0YXRpYyBpbnQgZXhwZXJpbWVudGFsOworc3RhdGljIHUzMiBkYmdfbGV2ZWw7CisKK3N0YXRpYyBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqdHBhY3BpX3dxOworCisvKiBTcGVjaWFsIExFRCBjbGFzcyB0aGF0IGNhbiBkZWZlciB3b3JrICovCitzdHJ1Y3QgdHBhY3BpX2xlZF9jbGFzc2RldiB7CisJc3RydWN0IGxlZF9jbGFzc2RldiBsZWRfY2xhc3NkZXY7CisJc3RydWN0IHdvcmtfc3RydWN0IHdvcms7CisJZW51bSBsZWRfYnJpZ2h0bmVzcyBuZXdfYnJpZ2h0bmVzczsKKwl1bnNpZ25lZCBpbnQgbGVkOworfTsKKworI2lmZGVmIENPTkZJR19USElOS1BBRF9BQ1BJX0RFQlVHRkFDSUxJVElFUworc3RhdGljIGludCBkYmdfd2xzd2VtdWw7CitzdGF0aWMgaW50IHRwYWNwaV93bHN3X2VtdWxzdGF0ZTsKK3N0YXRpYyBpbnQgZGJnX2JsdWV0b290aGVtdWw7CitzdGF0aWMgaW50IHRwYWNwaV9ibHVldG9vdGhfZW11bHN0YXRlOworc3RhdGljIGludCBkYmdfd3dhbmVtdWw7CitzdGF0aWMgaW50IHRwYWNwaV93d2FuX2VtdWxzdGF0ZTsKK3N0YXRpYyBpbnQgZGJnX3V3YmVtdWw7CitzdGF0aWMgaW50IHRwYWNwaV91d2JfZW11bHN0YXRlOworI2VuZGlmCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQUNQSSBIZWxwZXJzIGFuZCBkZXZpY2UgbW9kZWwKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBBQ1BJIGJhc2ljIGhhbmRsZXMKKyAqLworCitzdGF0aWMgYWNwaV9oYW5kbGUgcm9vdF9oYW5kbGU7CisKKyNkZWZpbmUgVFBBQ1BJX0hBTkRMRShvYmplY3QsIHBhcmVudCwgcGF0aHMuLi4pCQkJXAorCXN0YXRpYyBhY3BpX2hhbmRsZSAgb2JqZWN0IyNfaGFuZGxlOwkJCVwKKwlzdGF0aWMgYWNwaV9oYW5kbGUgKm9iamVjdCMjX3BhcmVudCA9ICZwYXJlbnQjI19oYW5kbGU7CVwKKwlzdGF0aWMgY2hhciAgICAgICAgKm9iamVjdCMjX3BhdGg7CQkJXAorCXN0YXRpYyBjaGFyICAgICAgICAqb2JqZWN0IyNfcGF0aHNbXSA9IHsgcGF0aHMgfQorCitUUEFDUElfSEFORExFKGVjLCByb290LCAiXFxfU0IuUENJMC5JU0EuRUMwIiwJLyogMjQwLCAyNDB4ICovCisJICAgIlxcX1NCLlBDSS5JU0EuRUMiLAkvKiA1NzAgKi8KKwkgICAiXFxfU0IuUENJMC5JU0EwLkVDMCIsCS8qIDYwMGUveCwgNzcwZSwgNzcweCAqLworCSAgICJcXF9TQi5QQ0kwLklTQS5FQyIsCS8qIEEyMWUsIEEyeG0vcCwgVDIwLTIyLCBYMjAtMjEgKi8KKwkgICAiXFxfU0IuUENJMC5BRDRTLkVDMCIsCS8qIGkxNDAwLCBSMzAgKi8KKwkgICAiXFxfU0IuUENJMC5JQ0gzLkVDMCIsCS8qIFIzMSAqLworCSAgICJcXF9TQi5QQ0kwLkxQQy5FQyIsCS8qIGFsbCBvdGhlcnMgKi8KKwkgICApOworCitUUEFDUElfSEFORExFKGVjcmQsIGVjLCAiRUNSRCIpOwkvKiA1NzAgKi8KK1RQQUNQSV9IQU5ETEUoZWN3ciwgZWMsICJFQ1dSIik7CS8qIDU3MCAqLworCitUUEFDUElfSEFORExFKGNtb3MsIHJvb3QsICJcXFVDTVMiLAkvKiBSNTAsIFI1MGUsIFI1MHAsIFI1MSwgKi8KKwkJCQkJLyogVDR4LCBYMzEsIFg0MCAqLworCSAgICJcXENNT1MiLAkJLyogQTN4LCBHNHgsIFIzMiwgVDIzLCBUMzAsIFgyMi0yNCwgWDMwICovCisJICAgIlxcQ01TIiwJCS8qIFI0MCwgUjQwZSAqLworCSAgICk7CQkJLyogYWxsIG90aGVycyAqLworCitUUEFDUElfSEFORExFKGhrZXksIGVjLCAiXFxfU0IuSEtFWSIsCS8qIDYwMGUveCwgNzcwZSwgNzcweCAqLworCSAgICJeSEtFWSIsCQkvKiBSMzAsIFIzMSAqLworCSAgICJIS0VZIiwJCS8qIGFsbCBvdGhlcnMgKi8KKwkgICApOwkJCS8qIDU3MCAqLworCitUUEFDUElfSEFORExFKHZpZCwgcm9vdCwgIlxcX1NCLlBDSS5BR1AuVkdBIiwJLyogNTcwICovCisJICAgIlxcX1NCLlBDSTAuQUdQMC5WSUQwIiwJLyogNjAwZS94LCA3NzB4ICovCisJICAgIlxcX1NCLlBDSTAuVklEMCIsCS8qIDc3MGUgKi8KKwkgICAiXFxfU0IuUENJMC5WSUQiLAkvKiBBMjFlLCBHNHgsIFI1MGUsIFgzMCwgWDQwICovCisJICAgIlxcX1NCLlBDSTAuQUdQLlZJRCIsCS8qIGFsbCBvdGhlcnMgKi8KKwkgICApOwkJCQkvKiBSMzAsIFIzMSAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBBQ1BJIGhlbHBlcnMKKyAqLworCitzdGF0aWMgaW50IGFjcGlfZXZhbGYoYWNwaV9oYW5kbGUgaGFuZGxlLAorCQkgICAgICB2b2lkICpyZXMsIGNoYXIgKm1ldGhvZCwgY2hhciAqZm10LCAuLi4pCit7CisJY2hhciAqZm10MCA9IGZtdDsKKwlzdHJ1Y3QgYWNwaV9vYmplY3RfbGlzdCBwYXJhbXM7CisJdW5pb24gYWNwaV9vYmplY3QgaW5fb2Jqc1tUUEFDUElfTUFYX0FDUElfQVJHU107CisJc3RydWN0IGFjcGlfYnVmZmVyIHJlc3VsdCwgKnJlc3VsdHA7CisJdW5pb24gYWNwaV9vYmplY3Qgb3V0X29iajsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJdmFfbGlzdCBhcDsKKwljaGFyIHJlc190eXBlOworCWludCBzdWNjZXNzOworCWludCBxdWlldDsKKworCWlmICghKmZtdCkgeworCQlwcmludGsoVFBBQ1BJX0VSUiAiYWNwaV9ldmFsZigpIGNhbGxlZCB3aXRoIGVtcHR5IGZvcm1hdFxuIik7CisJCXJldHVybiAwOworCX0KKworCWlmICgqZm10ID09ICdxJykgeworCQlxdWlldCA9IDE7CisJCWZtdCsrOworCX0gZWxzZQorCQlxdWlldCA9IDA7CisKKwlyZXNfdHlwZSA9ICooZm10KyspOworCisJcGFyYW1zLmNvdW50ID0gMDsKKwlwYXJhbXMucG9pbnRlciA9ICZpbl9vYmpzWzBdOworCisJdmFfc3RhcnQoYXAsIGZtdCk7CisJd2hpbGUgKCpmbXQpIHsKKwkJY2hhciBjID0gKihmbXQrKyk7CisJCXN3aXRjaCAoYykgeworCQljYXNlICdkJzoJLyogaW50ICovCisJCQlpbl9vYmpzW3BhcmFtcy5jb3VudF0uaW50ZWdlci52YWx1ZSA9IHZhX2FyZyhhcCwgaW50KTsKKwkJCWluX29ianNbcGFyYW1zLmNvdW50KytdLnR5cGUgPSBBQ1BJX1RZUEVfSU5URUdFUjsKKwkJCWJyZWFrOworCQkJLyogYWRkIG1vcmUgdHlwZXMgYXMgbmVlZGVkICovCisJCWRlZmF1bHQ6CisJCQlwcmludGsoVFBBQ1BJX0VSUiAiYWNwaV9ldmFsZigpIGNhbGxlZCAiCisJCQkgICAgICAgIndpdGggaW52YWxpZCBmb3JtYXQgY2hhcmFjdGVyICclYydcbiIsIGMpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisJdmFfZW5kKGFwKTsKKworCWlmIChyZXNfdHlwZSAhPSAndicpIHsKKwkJcmVzdWx0Lmxlbmd0aCA9IHNpemVvZihvdXRfb2JqKTsKKwkJcmVzdWx0LnBvaW50ZXIgPSAmb3V0X29iajsKKwkJcmVzdWx0cCA9ICZyZXN1bHQ7CisJfSBlbHNlCisJCXJlc3VsdHAgPSBOVUxMOworCisJc3RhdHVzID0gYWNwaV9ldmFsdWF0ZV9vYmplY3QoaGFuZGxlLCBtZXRob2QsICZwYXJhbXMsIHJlc3VsdHApOworCisJc3dpdGNoIChyZXNfdHlwZSkgeworCWNhc2UgJ2QnOgkJLyogaW50ICovCisJCWlmIChyZXMpCisJCQkqKGludCAqKXJlcyA9IG91dF9vYmouaW50ZWdlci52YWx1ZTsKKwkJc3VjY2VzcyA9IHN0YXR1cyA9PSBBRV9PSyAmJiBvdXRfb2JqLnR5cGUgPT0gQUNQSV9UWVBFX0lOVEVHRVI7CisJCWJyZWFrOworCWNhc2UgJ3YnOgkJLyogdm9pZCAqLworCQlzdWNjZXNzID0gc3RhdHVzID09IEFFX09LOworCQlicmVhazsKKwkJLyogYWRkIG1vcmUgdHlwZXMgYXMgbmVlZGVkICovCisJZGVmYXVsdDoKKwkJcHJpbnRrKFRQQUNQSV9FUlIgImFjcGlfZXZhbGYoKSBjYWxsZWQgIgorCQkgICAgICAgIndpdGggaW52YWxpZCBmb3JtYXQgY2hhcmFjdGVyICclYydcbiIsIHJlc190eXBlKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCFzdWNjZXNzICYmICFxdWlldCkKKwkJcHJpbnRrKFRQQUNQSV9FUlIgImFjcGlfZXZhbGYoJXMsICVzLCAuLi4pIGZhaWxlZDogJWRcbiIsCisJCSAgICAgICBtZXRob2QsIGZtdDAsIHN0YXR1cyk7CisKKwlyZXR1cm4gc3VjY2VzczsKK30KKworc3RhdGljIGludCBhY3BpX2VjX3JlYWQoaW50IGksIHU4ICpwKQoreworCWludCB2OworCisJaWYgKGVjcmRfaGFuZGxlKSB7CisJCWlmICghYWNwaV9ldmFsZihlY3JkX2hhbmRsZSwgJnYsIE5VTEwsICJkZCIsIGkpKQorCQkJcmV0dXJuIDA7CisJCSpwID0gdjsKKwl9IGVsc2UgeworCQlpZiAoZWNfcmVhZChpLCBwKSA8IDApCisJCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBhY3BpX2VjX3dyaXRlKGludCBpLCB1OCB2KQoreworCWlmIChlY3dyX2hhbmRsZSkgeworCQlpZiAoIWFjcGlfZXZhbGYoZWN3cl9oYW5kbGUsIE5VTEwsIE5VTEwsICJ2ZGQiLCBpLCB2KSkKKwkJCXJldHVybiAwOworCX0gZWxzZSB7CisJCWlmIChlY193cml0ZShpLCB2KSA8IDApCisJCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworI2lmIGRlZmluZWQoQ09ORklHX1RISU5LUEFEX0FDUElfRE9DSykgfHwgZGVmaW5lZChDT05GSUdfVEhJTktQQURfQUNQSV9CQVkpCitzdGF0aWMgaW50IF9zdGEoYWNwaV9oYW5kbGUgaGFuZGxlKQoreworCWludCBzdGF0dXM7CisKKwlpZiAoIWhhbmRsZSB8fCAhYWNwaV9ldmFsZihoYW5kbGUsICZzdGF0dXMsICJfU1RBIiwgImQiKSkKKwkJc3RhdHVzID0gMDsKKworCXJldHVybiBzdGF0dXM7Cit9CisjZW5kaWYKKworc3RhdGljIGludCBpc3N1ZV90aGlua3BhZF9jbW9zX2NvbW1hbmQoaW50IGNtb3NfY21kKQoreworCWlmICghY21vc19oYW5kbGUpCisJCXJldHVybiAtRU5YSU87CisKKwlpZiAoIWFjcGlfZXZhbGYoY21vc19oYW5kbGUsIE5VTEwsIE5VTEwsICJ2ZCIsIGNtb3NfY21kKSkKKwkJcmV0dXJuIC1FSU87CisKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEFDUEkgZGV2aWNlIG1vZGVsCisgKi8KKworI2RlZmluZSBUUEFDUElfQUNQSUhBTkRMRV9JTklUKG9iamVjdCkgXAorCWRydl9hY3BpX2hhbmRsZV9pbml0KCNvYmplY3QsICZvYmplY3QjI19oYW5kbGUsICpvYmplY3QjI19wYXJlbnQsIFwKKwkJb2JqZWN0IyNfcGF0aHMsIEFSUkFZX1NJWkUob2JqZWN0IyNfcGF0aHMpLCAmb2JqZWN0IyNfcGF0aCkKKworc3RhdGljIHZvaWQgZHJ2X2FjcGlfaGFuZGxlX2luaXQoY2hhciAqbmFtZSwKKwkJCSAgIGFjcGlfaGFuZGxlICpoYW5kbGUsIGFjcGlfaGFuZGxlIHBhcmVudCwKKwkJCSAgIGNoYXIgKipwYXRocywgaW50IG51bV9wYXRocywgY2hhciAqKnBhdGgpCit7CisJaW50IGk7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCisJdmRiZ19wcmludGsoVFBBQ1BJX0RCR19JTklULCAidHJ5aW5nIHRvIGxvY2F0ZSBBQ1BJIGhhbmRsZSBmb3IgJXNcbiIsCisJCW5hbWUpOworCisJZm9yIChpID0gMDsgaSA8IG51bV9wYXRoczsgaSsrKSB7CisJCXN0YXR1cyA9IGFjcGlfZ2V0X2hhbmRsZShwYXJlbnQsIHBhdGhzW2ldLCBoYW5kbGUpOworCQlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpIHsKKwkJCSpwYXRoID0gcGF0aHNbaV07CisJCQlkYmdfcHJpbnRrKFRQQUNQSV9EQkdfSU5JVCwKKwkJCQkgICAiRm91bmQgQUNQSSBoYW5kbGUgJXMgZm9yICVzXG4iLAorCQkJCSAgICpwYXRoLCBuYW1lKTsKKwkJCXJldHVybjsKKwkJfQorCX0KKworCXZkYmdfcHJpbnRrKFRQQUNQSV9EQkdfSU5JVCwgIkFDUEkgaGFuZGxlIGZvciAlcyBub3QgZm91bmRcbiIsCisJCSAgICBuYW1lKTsKKwkqaGFuZGxlID0gTlVMTDsKK30KKworc3RhdGljIHZvaWQgZGlzcGF0Y2hfYWNwaV9ub3RpZnkoYWNwaV9oYW5kbGUgaGFuZGxlLCB1MzIgZXZlbnQsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGlibV9zdHJ1Y3QgKmlibSA9IGRhdGE7CisKKwlpZiAodHBhY3BpX2xpZmVjeWNsZSAhPSBUUEFDUElfTElGRV9SVU5OSU5HKQorCQlyZXR1cm47CisKKwlpZiAoIWlibSB8fCAhaWJtLT5hY3BpIHx8ICFpYm0tPmFjcGktPm5vdGlmeSkKKwkJcmV0dXJuOworCisJaWJtLT5hY3BpLT5ub3RpZnkoaWJtLCBldmVudCk7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHNldHVwX2FjcGlfbm90aWZ5KHN0cnVjdCBpYm1fc3RydWN0ICppYm0pCit7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCWludCByYzsKKworCUJVR19PTighaWJtLT5hY3BpKTsKKworCWlmICghKmlibS0+YWNwaS0+aGFuZGxlKQorCQlyZXR1cm4gMDsKKworCXZkYmdfcHJpbnRrKFRQQUNQSV9EQkdfSU5JVCwKKwkJInNldHRpbmcgdXAgQUNQSSBub3RpZnkgZm9yICVzXG4iLCBpYm0tPm5hbWUpOworCisJcmMgPSBhY3BpX2J1c19nZXRfZGV2aWNlKCppYm0tPmFjcGktPmhhbmRsZSwgJmlibS0+YWNwaS0+ZGV2aWNlKTsKKwlpZiAocmMgPCAwKSB7CisJCXByaW50ayhUUEFDUElfRVJSICJhY3BpX2J1c19nZXRfZGV2aWNlKCVzKSBmYWlsZWQ6ICVkXG4iLAorCQkJaWJtLT5uYW1lLCByYyk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWlibS0+YWNwaS0+ZGV2aWNlLT5kcml2ZXJfZGF0YSA9IGlibTsKKwlzcHJpbnRmKGFjcGlfZGV2aWNlX2NsYXNzKGlibS0+YWNwaS0+ZGV2aWNlKSwgIiVzLyVzIiwKKwkJVFBBQ1BJX0FDUElfRVZFTlRfUFJFRklYLAorCQlpYm0tPm5hbWUpOworCisJc3RhdHVzID0gYWNwaV9pbnN0YWxsX25vdGlmeV9oYW5kbGVyKCppYm0tPmFjcGktPmhhbmRsZSwKKwkJCWlibS0+YWNwaS0+dHlwZSwgZGlzcGF0Y2hfYWNwaV9ub3RpZnksIGlibSk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCWlmIChzdGF0dXMgPT0gQUVfQUxSRUFEWV9FWElTVFMpIHsKKwkJCXByaW50ayhUUEFDUElfTk9USUNFCisJCQkgICAgICAgImFub3RoZXIgZGV2aWNlIGRyaXZlciBpcyBhbHJlYWR5ICIKKwkJCSAgICAgICAiaGFuZGxpbmcgJXMgZXZlbnRzXG4iLCBpYm0tPm5hbWUpOworCQl9IGVsc2UgeworCQkJcHJpbnRrKFRQQUNQSV9FUlIKKwkJCSAgICAgICAiYWNwaV9pbnN0YWxsX25vdGlmeV9oYW5kbGVyKCVzKSBmYWlsZWQ6ICVkXG4iLAorCQkJICAgICAgIGlibS0+bmFtZSwgc3RhdHVzKTsKKwkJfQorCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJaWJtLT5mbGFncy5hY3BpX25vdGlmeV9pbnN0YWxsZWQgPSAxOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9faW5pdCB0cGFjcGlfZGV2aWNlX2FkZChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2luaXQgcmVnaXN0ZXJfdHBhY3BpX3N1YmRyaXZlcihzdHJ1Y3QgaWJtX3N0cnVjdCAqaWJtKQoreworCWludCByYzsKKworCWRiZ19wcmludGsoVFBBQ1BJX0RCR19JTklULAorCQkicmVnaXN0ZXJpbmcgJXMgYXMgYW4gQUNQSSBkcml2ZXJcbiIsIGlibS0+bmFtZSk7CisKKwlCVUdfT04oIWlibS0+YWNwaSk7CisKKwlpYm0tPmFjcGktPmRyaXZlciA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBhY3BpX2RyaXZlciksIEdGUF9LRVJORUwpOworCWlmICghaWJtLT5hY3BpLT5kcml2ZXIpIHsKKwkJcHJpbnRrKFRQQUNQSV9FUlIKKwkJICAgICAgICJmYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBpYm0tPmFjcGktPmRyaXZlclxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXNwcmludGYoaWJtLT5hY3BpLT5kcml2ZXItPm5hbWUsICIlc18lcyIsIFRQQUNQSV9OQU1FLCBpYm0tPm5hbWUpOworCWlibS0+YWNwaS0+ZHJpdmVyLT5pZHMgPSBpYm0tPmFjcGktPmhpZDsKKworCWlibS0+YWNwaS0+ZHJpdmVyLT5vcHMuYWRkID0gJnRwYWNwaV9kZXZpY2VfYWRkOworCisJcmMgPSBhY3BpX2J1c19yZWdpc3Rlcl9kcml2ZXIoaWJtLT5hY3BpLT5kcml2ZXIpOworCWlmIChyYyA8IDApIHsKKwkJcHJpbnRrKFRQQUNQSV9FUlIgImFjcGlfYnVzX3JlZ2lzdGVyX2RyaXZlciglcykgZmFpbGVkOiAlZFxuIiwKKwkJICAgICAgIGlibS0+bmFtZSwgcmMpOworCQlrZnJlZShpYm0tPmFjcGktPmRyaXZlcik7CisJCWlibS0+YWNwaS0+ZHJpdmVyID0gTlVMTDsKKwl9IGVsc2UgaWYgKCFyYykKKwkJaWJtLT5mbGFncy5hY3BpX2RyaXZlcl9yZWdpc3RlcmVkID0gMTsKKworCXJldHVybiByYzsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBQcm9jZnMgSGVscGVycworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGludCBkaXNwYXRjaF9wcm9jZnNfcmVhZChjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZiwKKwkJCWludCBjb3VudCwgaW50ICplb2YsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGlibV9zdHJ1Y3QgKmlibSA9IGRhdGE7CisJaW50IGxlbjsKKworCWlmICghaWJtIHx8ICFpYm0tPnJlYWQpCisJCXJldHVybiAtRUlOVkFMOworCisJbGVuID0gaWJtLT5yZWFkKHBhZ2UpOworCWlmIChsZW4gPCAwKQorCQlyZXR1cm4gbGVuOworCisJaWYgKGxlbiA8PSBvZmYgKyBjb3VudCkKKwkJKmVvZiA9IDE7CisJKnN0YXJ0ID0gcGFnZSArIG9mZjsKKwlsZW4gLT0gb2ZmOworCWlmIChsZW4gPiBjb3VudCkKKwkJbGVuID0gY291bnQ7CisJaWYgKGxlbiA8IDApCisJCWxlbiA9IDA7CisKKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgaW50IGRpc3BhdGNoX3Byb2Nmc193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCWNvbnN0IGNoYXIgX191c2VyICp1c2VyYnVmLAorCQkJdW5zaWduZWQgbG9uZyBjb3VudCwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgaWJtX3N0cnVjdCAqaWJtID0gZGF0YTsKKwljaGFyICprZXJuYnVmOworCWludCByZXQ7CisKKwlpZiAoIWlibSB8fCAhaWJtLT53cml0ZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlrZXJuYnVmID0ga21hbGxvYyhjb3VudCArIDIsIEdGUF9LRVJORUwpOworCWlmICgha2VybmJ1ZikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpZiAoY29weV9mcm9tX3VzZXIoa2VybmJ1ZiwgdXNlcmJ1ZiwgY291bnQpKSB7CisJCWtmcmVlKGtlcm5idWYpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlrZXJuYnVmW2NvdW50XSA9IDA7CisJc3RyY2F0KGtlcm5idWYsICIsIik7CisJcmV0ID0gaWJtLT53cml0ZShrZXJuYnVmKTsKKwlpZiAocmV0ID09IDApCisJCXJldCA9IGNvdW50OworCisJa2ZyZWUoa2VybmJ1Zik7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgY2hhciAqbmV4dF9jbWQoY2hhciAqKmNtZHMpCit7CisJY2hhciAqc3RhcnQgPSAqY21kczsKKwljaGFyICplbmQ7CisKKwl3aGlsZSAoKGVuZCA9IHN0cmNocihzdGFydCwgJywnKSkgJiYgZW5kID09IHN0YXJ0KQorCQlzdGFydCA9IGVuZCArIDE7CisKKwlpZiAoIWVuZCkKKwkJcmV0dXJuIE5VTEw7CisKKwkqZW5kID0gMDsKKwkqY21kcyA9IGVuZCArIDE7CisJcmV0dXJuIHN0YXJ0OworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIERldmljZSBtb2RlbDogaW5wdXQsIGh3bW9uIGFuZCBwbGF0Zm9ybQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnRwYWNwaV9wZGV2Oworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnRwYWNwaV9zZW5zb3JzX3BkZXY7CitzdGF0aWMgc3RydWN0IGRldmljZSAqdHBhY3BpX2h3bW9uOworc3RhdGljIHN0cnVjdCBpbnB1dF9kZXYgKnRwYWNwaV9pbnB1dGRldjsKK3N0YXRpYyBzdHJ1Y3QgbXV0ZXggdHBhY3BpX2lucHV0ZGV2X3NlbmRfbXV0ZXg7CitzdGF0aWMgTElTVF9IRUFEKHRwYWNwaV9hbGxfZHJpdmVycyk7CisKK3N0YXRpYyBpbnQgdHBhY3BpX3N1c3BlbmRfaGFuZGxlcihzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LAorCQkJCSAgcG1fbWVzc2FnZV90IHN0YXRlKQoreworCXN0cnVjdCBpYm1fc3RydWN0ICppYm0sICppdG1wOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGlibSwgaXRtcCwKKwkJCQkgJnRwYWNwaV9hbGxfZHJpdmVycywKKwkJCQkgYWxsX2RyaXZlcnMpIHsKKwkJaWYgKGlibS0+c3VzcGVuZCkKKwkJCShpYm0tPnN1c3BlbmQpKHN0YXRlKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0cGFjcGlfcmVzdW1lX2hhbmRsZXIoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgaWJtX3N0cnVjdCAqaWJtLCAqaXRtcDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShpYm0sIGl0bXAsCisJCQkJICZ0cGFjcGlfYWxsX2RyaXZlcnMsCisJCQkJIGFsbF9kcml2ZXJzKSB7CisJCWlmIChpYm0tPnJlc3VtZSkKKwkJCShpYm0tPnJlc3VtZSkoKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgdHBhY3BpX3NodXRkb3duX2hhbmRsZXIoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgaWJtX3N0cnVjdCAqaWJtLCAqaXRtcDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShpYm0sIGl0bXAsCisJCQkJICZ0cGFjcGlfYWxsX2RyaXZlcnMsCisJCQkJIGFsbF9kcml2ZXJzKSB7CisJCWlmIChpYm0tPnNodXRkb3duKQorCQkJKGlibS0+c2h1dGRvd24pKCk7CisJfQorfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciB0cGFjcGlfcGRyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9IFRQQUNQSV9EUlZSX05BTUUsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCX0sCisJLnN1c3BlbmQgPSB0cGFjcGlfc3VzcGVuZF9oYW5kbGVyLAorCS5yZXN1bWUgPSB0cGFjcGlfcmVzdW1lX2hhbmRsZXIsCisJLnNodXRkb3duID0gdHBhY3BpX3NodXRkb3duX2hhbmRsZXIsCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciB0cGFjcGlfaHdtb25fcGRyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9IFRQQUNQSV9IV01PTl9EUlZSX05BTUUsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCX0sCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogc3lzZnMgc3VwcG9ydCBoZWxwZXJzCisgKi8KKworc3RydWN0IGF0dHJpYnV0ZV9zZXQgeworCXVuc2lnbmVkIGludCBtZW1iZXJzLCBtYXhfbWVtYmVyczsKKwlzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGdyb3VwOworfTsKKworc3RydWN0IGF0dHJpYnV0ZV9zZXRfb2JqIHsKKwlzdHJ1Y3QgYXR0cmlidXRlX3NldCBzOworCXN0cnVjdCBhdHRyaWJ1dGUgKmE7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9zZXQgKmNyZWF0ZV9hdHRyX3NldCh1bnNpZ25lZCBpbnQgbWF4X21lbWJlcnMsCisJCQkJCQljb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCBhdHRyaWJ1dGVfc2V0X29iaiAqc29iajsKKworCWlmIChtYXhfbWVtYmVycyA9PSAwKQorCQlyZXR1cm4gTlVMTDsKKworCS8qIEFsbG9jYXRlcyBzcGFjZSBmb3IgaW1wbGljaXQgTlVMTCBhdCB0aGUgZW5kIHRvbyAqLworCXNvYmogPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYXR0cmlidXRlX3NldF9vYmopICsKKwkJICAgIG1heF9tZW1iZXJzICogc2l6ZW9mKHN0cnVjdCBhdHRyaWJ1dGUgKiksCisJCSAgICBHRlBfS0VSTkVMKTsKKwlpZiAoIXNvYmopCisJCXJldHVybiBOVUxMOworCXNvYmotPnMubWF4X21lbWJlcnMgPSBtYXhfbWVtYmVyczsKKwlzb2JqLT5zLmdyb3VwLmF0dHJzID0gJnNvYmotPmE7CisJc29iai0+cy5ncm91cC5uYW1lID0gbmFtZTsKKworCXJldHVybiAmc29iai0+czsKK30KKworI2RlZmluZSBkZXN0cm95X2F0dHJfc2V0KF9zZXQpIFwKKwlrZnJlZShfc2V0KTsKKworLyogbm90IG11bHRpLXRocmVhZGVkIHNhZmUsIHVzZSBpdCBpbiBhIHNpbmdsZSB0aHJlYWQgcGVyIHNldCAqLworc3RhdGljIGludCBhZGRfdG9fYXR0cl9zZXQoc3RydWN0IGF0dHJpYnV0ZV9zZXQgKnMsIHN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIpCit7CisJaWYgKCFzIHx8ICFhdHRyKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChzLT5tZW1iZXJzID49IHMtPm1heF9tZW1iZXJzKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXMtPmdyb3VwLmF0dHJzW3MtPm1lbWJlcnNdID0gYXR0cjsKKwlzLT5tZW1iZXJzKys7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhZGRfbWFueV90b19hdHRyX3NldChzdHJ1Y3QgYXR0cmlidXRlX3NldCAqcywKKwkJCXN0cnVjdCBhdHRyaWJ1dGUgKiphdHRyLAorCQkJdW5zaWduZWQgaW50IGNvdW50KQoreworCWludCBpLCByZXM7CisKKwlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworCQlyZXMgPSBhZGRfdG9fYXR0cl9zZXQocywgYXR0cltpXSk7CisJCWlmIChyZXMpCisJCQlyZXR1cm4gcmVzOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBkZWxldGVfYXR0cl9zZXQoc3RydWN0IGF0dHJpYnV0ZV9zZXQgKnMsIHN0cnVjdCBrb2JqZWN0ICprb2JqKQoreworCXN5c2ZzX3JlbW92ZV9ncm91cChrb2JqLCAmcy0+Z3JvdXApOworCWRlc3Ryb3lfYXR0cl9zZXQocyk7Cit9CisKKyNkZWZpbmUgcmVnaXN0ZXJfYXR0cl9zZXRfd2l0aF9zeXNmcyhfYXR0cl9zZXQsIF9rb2JqKSBcCisJc3lzZnNfY3JlYXRlX2dyb3VwKF9rb2JqLCAmX2F0dHJfc2V0LT5ncm91cCkKKworc3RhdGljIGludCBwYXJzZV9zdHJ0b3VsKGNvbnN0IGNoYXIgKmJ1ZiwKKwkJdW5zaWduZWQgbG9uZyBtYXgsIHVuc2lnbmVkIGxvbmcgKnZhbHVlKQoreworCWNoYXIgKmVuZHA7CisKKwl3aGlsZSAoKmJ1ZiAmJiBpc3NwYWNlKCpidWYpKQorCQlidWYrKzsKKwkqdmFsdWUgPSBzaW1wbGVfc3RydG91bChidWYsICZlbmRwLCAwKTsKKwl3aGlsZSAoKmVuZHAgJiYgaXNzcGFjZSgqZW5kcCkpCisJCWVuZHArKzsKKwlpZiAoKmVuZHAgfHwgKnZhbHVlID4gbWF4KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB0cGFjcGlfZGlzYWJsZV9icmlnaHRuZXNzX2RlbGF5KHZvaWQpCit7CisJaWYgKGFjcGlfZXZhbGYoaGtleV9oYW5kbGUsIE5VTEwsICJQV01TIiwgInF2ZCIsIDApKQorCQlwcmludGsoVFBBQ1BJX05PVElDRQorCQkJIkFDUEkgYmFja2xpZ2h0IGNvbnRyb2wgZGVsYXkgZGlzYWJsZWRcbiIpOworfQorCitzdGF0aWMgaW50IF9faW5pdCB0cGFjcGlfcXVlcnlfYmNsX2xldmVscyhhY3BpX2hhbmRsZSBoYW5kbGUpCit7CisJc3RydWN0IGFjcGlfYnVmZmVyIGJ1ZmZlciA9IHsgQUNQSV9BTExPQ0FURV9CVUZGRVIsIE5VTEwgfTsKKwl1bmlvbiBhY3BpX29iamVjdCAqb2JqOworCWludCByYzsKKworCWlmIChBQ1BJX1NVQ0NFU1MoYWNwaV9ldmFsdWF0ZV9vYmplY3QoaGFuZGxlLCBOVUxMLCBOVUxMLCAmYnVmZmVyKSkpIHsKKwkJb2JqID0gKHVuaW9uIGFjcGlfb2JqZWN0ICopYnVmZmVyLnBvaW50ZXI7CisJCWlmICghb2JqIHx8IChvYmotPnR5cGUgIT0gQUNQSV9UWVBFX1BBQ0tBR0UpKSB7CisJCQlwcmludGsoVFBBQ1BJX0VSUiAiVW5rbm93biBfQkNMIGRhdGEsICIKKwkJCSAgICAgICAicGxlYXNlIHJlcG9ydCB0aGlzIHRvICVzXG4iLCBUUEFDUElfTUFJTCk7CisJCQlyYyA9IDA7CisJCX0gZWxzZSB7CisJCQlyYyA9IG9iai0+cGFja2FnZS5jb3VudDsKKwkJfQorCX0gZWxzZSB7CisJCXJldHVybiAwOworCX0KKworCWtmcmVlKGJ1ZmZlci5wb2ludGVyKTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBhY3BpX3N0YXR1cyBfX2luaXQgdHBhY3BpX2FjcGlfd2Fsa19maW5kX2JjbChhY3BpX2hhbmRsZSBoYW5kbGUsCisJCQkJCXUzMiBsdmwsIHZvaWQgKmNvbnRleHQsIHZvaWQgKipydikKK3sKKwljaGFyIG5hbWVbQUNQSV9QQVRIX1NFR01FTlRfTEVOR1RIXTsKKwlzdHJ1Y3QgYWNwaV9idWZmZXIgYnVmZmVyID0geyBzaXplb2YobmFtZSksICZuYW1lIH07CisKKwlpZiAoQUNQSV9TVUNDRVNTKGFjcGlfZ2V0X25hbWUoaGFuZGxlLCBBQ1BJX1NJTkdMRV9OQU1FLCAmYnVmZmVyKSkgJiYKKwkgICAgIXN0cm5jbXAoIl9CQ0wiLCBuYW1lLCBzaXplb2YobmFtZSkgLSAxKSkgeworCQlCVUdfT04oIXJ2IHx8ICEqcnYpOworCQkqKihpbnQgKiopcnYgPSB0cGFjcGlfcXVlcnlfYmNsX2xldmVscyhoYW5kbGUpOworCQlyZXR1cm4gQUVfQ1RSTF9URVJNSU5BVEU7CisJfSBlbHNlIHsKKwkJcmV0dXJuIEFFX09LOworCX0KK30KKworLyoKKyAqIFJldHVybnMgMCAobm8gQUNQSSBfQkNMIG9yIF9CQ0wgaW52YWxpZCksIG9yIHNpemUgb2YgYnJpZ2h0bmVzcyBtYXAKKyAqLworc3RhdGljIGludCBfX2luaXQgdHBhY3BpX2NoZWNrX3N0ZF9hY3BpX2JyaWdodG5lc3Nfc3VwcG9ydCh2b2lkKQoreworCWludCBzdGF0dXM7CisJaW50IGJjbF9sZXZlbHMgPSAwOworCXZvaWQgKmJjbF9wdHIgPSAmYmNsX2xldmVsczsKKworCWlmICghdmlkX2hhbmRsZSkgeworCQlUUEFDUElfQUNQSUhBTkRMRV9JTklUKHZpZCk7CisJfQorCWlmICghdmlkX2hhbmRsZSkKKwkJcmV0dXJuIDA7CisKKwkvKgorCSAqIFNlYXJjaCBmb3IgYSBfQkNMIG1ldGhvZCwgYW5kIGV4ZWN1dGUgaXQuICBUaGlzIGlzIHNhZmUgb24gYWxsCisJICogVGhpbmtQYWRzLCBhbmQgYXMgYSBzaWRlLWVmZmVjdCwgX0JDTCB3aWxsIHBsYWNlIGEgTGVub3ZvIFZpc3RhCisJICogQklPUyBpbiBBQ1BJIGJhY2tsaWdodCBjb250cm9sIG1vZGUuICBXZSBkbyBOT1QgaGF2ZSB0byBjYXJlCisJICogYWJvdXQgY2FsbGluZyB0aGUgX0JDTCBtZXRob2QgaW4gYW4gZW5hYmxlZCB2aWRlbyBkZXZpY2UsIGFueQorCSAqIHdpbGwgZG8gZm9yIG91ciBwdXJwb3Nlcy4KKwkgKi8KKworCXN0YXR1cyA9IGFjcGlfd2Fsa19uYW1lc3BhY2UoQUNQSV9UWVBFX01FVEhPRCwgdmlkX2hhbmRsZSwgMywKKwkJCQkgICAgIHRwYWNwaV9hY3BpX3dhbGtfZmluZF9iY2wsIE5VTEwsCisJCQkJICAgICAmYmNsX3B0cik7CisKKwlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykgJiYgYmNsX2xldmVscyA+IDIpIHsKKwkJdHBfZmVhdHVyZXMuYnJpZ2h0X2FjcGltb2RlID0gMTsKKwkJcmV0dXJuIChiY2xfbGV2ZWxzIC0gMik7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHRwYWNwaV9uZXdfcmZraWxsKGNvbnN0IHVuc2lnbmVkIGludCBpZCwKKwkJCXN0cnVjdCByZmtpbGwgKipyZmssCisJCQljb25zdCBlbnVtIHJma2lsbF90eXBlIHJma3R5cGUsCisJCQljb25zdCBjaGFyICpuYW1lLAorCQkJY29uc3QgYm9vbCBzZXRfZGVmYXVsdCwKKwkJCWludCAoKnRvZ2dsZV9yYWRpbykodm9pZCAqLCBlbnVtIHJma2lsbF9zdGF0ZSksCisJCQlpbnQgKCpnZXRfc3RhdGUpKHZvaWQgKiwgZW51bSByZmtpbGxfc3RhdGUgKikpCit7CisJaW50IHJlczsKKwllbnVtIHJma2lsbF9zdGF0ZSBpbml0aWFsX3N0YXRlID0gUkZLSUxMX1NUQVRFX1NPRlRfQkxPQ0tFRDsKKworCXJlcyA9IGdldF9zdGF0ZShOVUxMLCAmaW5pdGlhbF9zdGF0ZSk7CisJaWYgKHJlcyA8IDApIHsKKwkJcHJpbnRrKFRQQUNQSV9FUlIKKwkJCSJmYWlsZWQgdG8gcmVhZCBpbml0aWFsIHN0YXRlIGZvciAlcywgZXJyb3IgJWQ7ICIKKwkJCSJ3aWxsIHR1cm4gcmFkaW8gb2ZmXG4iLCBuYW1lLCByZXMpOworCX0gZWxzZSBpZiAoc2V0X2RlZmF1bHQpIHsKKwkJLyogdHJ5IHRvIHNldCB0aGUgaW5pdGlhbCBzdGF0ZSBhcyB0aGUgZGVmYXVsdCBmb3IgdGhlIHJma2lsbAorCQkgKiB0eXBlLCBzaW5jZSB3ZSBhc2sgdGhlIGZpcm13YXJlIHRvIHByZXNlcnZlIGl0IGFjcm9zcyBTNSBpbgorCQkgKiBOVlJBTSAqLworCQlyZmtpbGxfc2V0X2RlZmF1bHQocmZrdHlwZSwKKwkJCQkoaW5pdGlhbF9zdGF0ZSA9PSBSRktJTExfU1RBVEVfVU5CTE9DS0VEKSA/CisJCQkJCVJGS0lMTF9TVEFURV9VTkJMT0NLRUQgOgorCQkJCQlSRktJTExfU1RBVEVfU09GVF9CTE9DS0VEKTsKKwl9CisKKwkqcmZrID0gcmZraWxsX2FsbG9jYXRlKCZ0cGFjcGlfcGRldi0+ZGV2LCByZmt0eXBlKTsKKwlpZiAoISpyZmspIHsKKwkJcHJpbnRrKFRQQUNQSV9FUlIKKwkJCSJmYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciByZmtpbGwgY2xhc3NcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwkoKnJmayktPm5hbWUgPSBuYW1lOworCSgqcmZrKS0+Z2V0X3N0YXRlID0gZ2V0X3N0YXRlOworCSgqcmZrKS0+dG9nZ2xlX3JhZGlvID0gdG9nZ2xlX3JhZGlvOworCSgqcmZrKS0+c3RhdGUgPSBpbml0aWFsX3N0YXRlOworCisJcmVzID0gcmZraWxsX3JlZ2lzdGVyKCpyZmspOworCWlmIChyZXMgPCAwKSB7CisJCXByaW50ayhUUEFDUElfRVJSCisJCQkiZmFpbGVkIHRvIHJlZ2lzdGVyICVzIHJma2lsbCBzd2l0Y2g6ICVkXG4iLAorCQkJbmFtZSwgcmVzKTsKKwkJcmZraWxsX2ZyZWUoKnJmayk7CisJCSpyZmsgPSBOVUxMOworCQlyZXR1cm4gcmVzOworCX0KKworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogdGhpbmtwYWQtYWNwaSBkcml2ZXIgYXR0cmlidXRlcworICovCisKKy8qIGludGVyZmFjZV92ZXJzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworc3RhdGljIHNzaXplX3QgdHBhY3BpX2RyaXZlcl9pbnRlcmZhY2VfdmVyc2lvbl9zaG93KAorCQkJCXN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcnYsCisJCQkJY2hhciAqYnVmKQoreworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIjB4JTA4eFxuIiwgVFBBQ1BJX1NZU0ZTX1ZFUlNJT04pOworfQorCitzdGF0aWMgRFJJVkVSX0FUVFIoaW50ZXJmYWNlX3ZlcnNpb24sIFNfSVJVR08sCisJCXRwYWNwaV9kcml2ZXJfaW50ZXJmYWNlX3ZlcnNpb25fc2hvdywgTlVMTCk7CisKKy8qIGRlYnVnX2xldmVsIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworc3RhdGljIHNzaXplX3QgdHBhY3BpX2RyaXZlcl9kZWJ1Z19zaG93KHN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcnYsCisJCQkJCQljaGFyICpidWYpCit7CisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiMHglMDR4XG4iLCBkYmdfbGV2ZWwpOworfQorCitzdGF0aWMgc3NpemVfdCB0cGFjcGlfZHJpdmVyX2RlYnVnX3N0b3JlKHN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcnYsCisJCQkJCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwl1bnNpZ25lZCBsb25nIHQ7CisKKwlpZiAocGFyc2Vfc3RydG91bChidWYsIDB4ZmZmZiwgJnQpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWRiZ19sZXZlbCA9IHQ7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBEUklWRVJfQVRUUihkZWJ1Z19sZXZlbCwgU19JV1VTUiB8IFNfSVJVR08sCisJCXRwYWNwaV9kcml2ZXJfZGVidWdfc2hvdywgdHBhY3BpX2RyaXZlcl9kZWJ1Z19zdG9yZSk7CisKKy8qIHZlcnNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworc3RhdGljIHNzaXplX3QgdHBhY3BpX2RyaXZlcl92ZXJzaW9uX3Nob3coc3RydWN0IGRldmljZV9kcml2ZXIgKmRydiwKKwkJCQkJCWNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlcyB2JXNcbiIsCisJCQlUUEFDUElfREVTQywgVFBBQ1BJX1ZFUlNJT04pOworfQorCitzdGF0aWMgRFJJVkVSX0FUVFIodmVyc2lvbiwgU19JUlVHTywKKwkJdHBhY3BpX2RyaXZlcl92ZXJzaW9uX3Nob3csIE5VTEwpOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmZGVmIENPTkZJR19USElOS1BBRF9BQ1BJX0RFQlVHRkFDSUxJVElFUworCitzdGF0aWMgdm9pZCB0cGFjcGlfc2VuZF9yYWRpb3N3X3VwZGF0ZSh2b2lkKTsKKworLyogd2xzd19lbXVsc3RhdGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitzdGF0aWMgc3NpemVfdCB0cGFjcGlfZHJpdmVyX3dsc3dfZW11bHN0YXRlX3Nob3coc3RydWN0IGRldmljZV9kcml2ZXIgKmRydiwKKwkJCQkJCWNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZFxuIiwgISF0cGFjcGlfd2xzd19lbXVsc3RhdGUpOworfQorCitzdGF0aWMgc3NpemVfdCB0cGFjcGlfZHJpdmVyX3dsc3dfZW11bHN0YXRlX3N0b3JlKHN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcnYsCisJCQkJCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwl1bnNpZ25lZCBsb25nIHQ7CisKKwlpZiAocGFyc2Vfc3RydG91bChidWYsIDEsICZ0KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAodHBhY3BpX3dsc3dfZW11bHN0YXRlICE9IHQpIHsKKwkJdHBhY3BpX3dsc3dfZW11bHN0YXRlID0gISF0OworCQl0cGFjcGlfc2VuZF9yYWRpb3N3X3VwZGF0ZSgpOworCX0gZWxzZQorCQl0cGFjcGlfd2xzd19lbXVsc3RhdGUgPSAhIXQ7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBEUklWRVJfQVRUUih3bHN3X2VtdWxzdGF0ZSwgU19JV1VTUiB8IFNfSVJVR08sCisJCXRwYWNwaV9kcml2ZXJfd2xzd19lbXVsc3RhdGVfc2hvdywKKwkJdHBhY3BpX2RyaXZlcl93bHN3X2VtdWxzdGF0ZV9zdG9yZSk7CisKKy8qIGJsdWV0b290aF9lbXVsc3RhdGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworc3RhdGljIHNzaXplX3QgdHBhY3BpX2RyaXZlcl9ibHVldG9vdGhfZW11bHN0YXRlX3Nob3coCisJCQkJCXN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcnYsCisJCQkJCWNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZFxuIiwgISF0cGFjcGlfYmx1ZXRvb3RoX2VtdWxzdGF0ZSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHRwYWNwaV9kcml2ZXJfYmx1ZXRvb3RoX2VtdWxzdGF0ZV9zdG9yZSgKKwkJCQkJc3RydWN0IGRldmljZV9kcml2ZXIgKmRydiwKKwkJCQkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJdW5zaWduZWQgbG9uZyB0OworCisJaWYgKHBhcnNlX3N0cnRvdWwoYnVmLCAxLCAmdCkpCisJCXJldHVybiAtRUlOVkFMOworCisJdHBhY3BpX2JsdWV0b290aF9lbXVsc3RhdGUgPSAhIXQ7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBEUklWRVJfQVRUUihibHVldG9vdGhfZW11bHN0YXRlLCBTX0lXVVNSIHwgU19JUlVHTywKKwkJdHBhY3BpX2RyaXZlcl9ibHVldG9vdGhfZW11bHN0YXRlX3Nob3csCisJCXRwYWNwaV9kcml2ZXJfYmx1ZXRvb3RoX2VtdWxzdGF0ZV9zdG9yZSk7CisKKy8qIHd3YW5fZW11bHN0YXRlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3N0YXRpYyBzc2l6ZV90IHRwYWNwaV9kcml2ZXJfd3dhbl9lbXVsc3RhdGVfc2hvdygKKwkJCQkJc3RydWN0IGRldmljZV9kcml2ZXIgKmRydiwKKwkJCQkJY2hhciAqYnVmKQoreworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkXG4iLCAhIXRwYWNwaV93d2FuX2VtdWxzdGF0ZSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHRwYWNwaV9kcml2ZXJfd3dhbl9lbXVsc3RhdGVfc3RvcmUoCisJCQkJCXN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcnYsCisJCQkJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXVuc2lnbmVkIGxvbmcgdDsKKworCWlmIChwYXJzZV9zdHJ0b3VsKGJ1ZiwgMSwgJnQpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXRwYWNwaV93d2FuX2VtdWxzdGF0ZSA9ICEhdDsKKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIERSSVZFUl9BVFRSKHd3YW5fZW11bHN0YXRlLCBTX0lXVVNSIHwgU19JUlVHTywKKwkJdHBhY3BpX2RyaXZlcl93d2FuX2VtdWxzdGF0ZV9zaG93LAorCQl0cGFjcGlfZHJpdmVyX3d3YW5fZW11bHN0YXRlX3N0b3JlKTsKKworLyogdXdiX2VtdWxzdGF0ZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitzdGF0aWMgc3NpemVfdCB0cGFjcGlfZHJpdmVyX3V3Yl9lbXVsc3RhdGVfc2hvdygKKwkJCQkJc3RydWN0IGRldmljZV9kcml2ZXIgKmRydiwKKwkJCQkJY2hhciAqYnVmKQoreworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkXG4iLCAhIXRwYWNwaV91d2JfZW11bHN0YXRlKTsKK30KKworc3RhdGljIHNzaXplX3QgdHBhY3BpX2RyaXZlcl91d2JfZW11bHN0YXRlX3N0b3JlKAorCQkJCQlzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2LAorCQkJCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwl1bnNpZ25lZCBsb25nIHQ7CisKKwlpZiAocGFyc2Vfc3RydG91bChidWYsIDEsICZ0KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl0cGFjcGlfdXdiX2VtdWxzdGF0ZSA9ICEhdDsKKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIERSSVZFUl9BVFRSKHV3Yl9lbXVsc3RhdGUsIFNfSVdVU1IgfCBTX0lSVUdPLAorCQl0cGFjcGlfZHJpdmVyX3V3Yl9lbXVsc3RhdGVfc2hvdywKKwkJdHBhY3BpX2RyaXZlcl91d2JfZW11bHN0YXRlX3N0b3JlKTsKKyNlbmRpZgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHN0cnVjdCBkcml2ZXJfYXR0cmlidXRlICp0cGFjcGlfZHJpdmVyX2F0dHJpYnV0ZXNbXSA9IHsKKwkmZHJpdmVyX2F0dHJfZGVidWdfbGV2ZWwsICZkcml2ZXJfYXR0cl92ZXJzaW9uLAorCSZkcml2ZXJfYXR0cl9pbnRlcmZhY2VfdmVyc2lvbiwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHRwYWNwaV9jcmVhdGVfZHJpdmVyX2F0dHJpYnV0ZXMoc3RydWN0IGRldmljZV9kcml2ZXIgKmRydikKK3sKKwlpbnQgaSwgcmVzOworCisJaSA9IDA7CisJcmVzID0gMDsKKwl3aGlsZSAoIXJlcyAmJiBpIDwgQVJSQVlfU0laRSh0cGFjcGlfZHJpdmVyX2F0dHJpYnV0ZXMpKSB7CisJCXJlcyA9IGRyaXZlcl9jcmVhdGVfZmlsZShkcnYsIHRwYWNwaV9kcml2ZXJfYXR0cmlidXRlc1tpXSk7CisJCWkrKzsKKwl9CisKKyNpZmRlZiBDT05GSUdfVEhJTktQQURfQUNQSV9ERUJVR0ZBQ0lMSVRJRVMKKwlpZiAoIXJlcyAmJiBkYmdfd2xzd2VtdWwpCisJCXJlcyA9IGRyaXZlcl9jcmVhdGVfZmlsZShkcnYsICZkcml2ZXJfYXR0cl93bHN3X2VtdWxzdGF0ZSk7CisJaWYgKCFyZXMgJiYgZGJnX2JsdWV0b290aGVtdWwpCisJCXJlcyA9IGRyaXZlcl9jcmVhdGVfZmlsZShkcnYsICZkcml2ZXJfYXR0cl9ibHVldG9vdGhfZW11bHN0YXRlKTsKKwlpZiAoIXJlcyAmJiBkYmdfd3dhbmVtdWwpCisJCXJlcyA9IGRyaXZlcl9jcmVhdGVfZmlsZShkcnYsICZkcml2ZXJfYXR0cl93d2FuX2VtdWxzdGF0ZSk7CisJaWYgKCFyZXMgJiYgZGJnX3V3YmVtdWwpCisJCXJlcyA9IGRyaXZlcl9jcmVhdGVfZmlsZShkcnYsICZkcml2ZXJfYXR0cl91d2JfZW11bHN0YXRlKTsKKyNlbmRpZgorCisJcmV0dXJuIHJlczsKK30KKworc3RhdGljIHZvaWQgdHBhY3BpX3JlbW92ZV9kcml2ZXJfYXR0cmlidXRlcyhzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2KQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUodHBhY3BpX2RyaXZlcl9hdHRyaWJ1dGVzKTsgaSsrKQorCQlkcml2ZXJfcmVtb3ZlX2ZpbGUoZHJ2LCB0cGFjcGlfZHJpdmVyX2F0dHJpYnV0ZXNbaV0pOworCisjaWZkZWYgVEhJTktQQURfQUNQSV9ERUJVR0ZBQ0lMSVRJRVMKKwlkcml2ZXJfcmVtb3ZlX2ZpbGUoZHJ2LCAmZHJpdmVyX2F0dHJfd2xzd19lbXVsc3RhdGUpOworCWRyaXZlcl9yZW1vdmVfZmlsZShkcnYsICZkcml2ZXJfYXR0cl9ibHVldG9vdGhfZW11bHN0YXRlKTsKKwlkcml2ZXJfcmVtb3ZlX2ZpbGUoZHJ2LCAmZHJpdmVyX2F0dHJfd3dhbl9lbXVsc3RhdGUpOworCWRyaXZlcl9yZW1vdmVfZmlsZShkcnYsICZkcml2ZXJfYXR0cl91d2JfZW11bHN0YXRlKTsKKyNlbmRpZgorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBTdWJkcml2ZXJzCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogdGhpbmtwYWQtYWNwaSBpbml0IHN1YmRyaXZlcgorICovCisKK3N0YXRpYyBpbnQgX19pbml0IHRoaW5rcGFkX2FjcGlfZHJpdmVyX2luaXQoc3RydWN0IGlibV9pbml0X3N0cnVjdCAqaWlibSkKK3sKKwlwcmludGsoVFBBQ1BJX0lORk8gIiVzIHYlc1xuIiwgVFBBQ1BJX0RFU0MsIFRQQUNQSV9WRVJTSU9OKTsKKwlwcmludGsoVFBBQ1BJX0lORk8gIiVzXG4iLCBUUEFDUElfVVJMKTsKKworCXByaW50ayhUUEFDUElfSU5GTyAiVGhpbmtQYWQgQklPUyAlcywgRUMgJXNcbiIsCisJCSh0aGlua3BhZF9pZC5iaW9zX3ZlcnNpb25fc3RyKSA/CisJCQl0aGlua3BhZF9pZC5iaW9zX3ZlcnNpb25fc3RyIDogInVua25vd24iLAorCQkodGhpbmtwYWRfaWQuZWNfdmVyc2lvbl9zdHIpID8KKwkJCXRoaW5rcGFkX2lkLmVjX3ZlcnNpb25fc3RyIDogInVua25vd24iKTsKKworCWlmICh0aGlua3BhZF9pZC52ZW5kb3IgJiYgdGhpbmtwYWRfaWQubW9kZWxfc3RyKQorCQlwcmludGsoVFBBQ1BJX0lORk8gIiVzICVzLCBtb2RlbCAlc1xuIiwKKwkJCSh0aGlua3BhZF9pZC52ZW5kb3IgPT0gUENJX1ZFTkRPUl9JRF9JQk0pID8KKwkJCQkiSUJNIiA6ICgodGhpbmtwYWRfaWQudmVuZG9yID09CisJCQkJCQlQQ0lfVkVORE9SX0lEX0xFTk9WTykgPworCQkJCQkiTGVub3ZvIiA6ICJVbmtub3duIHZlbmRvciIpLAorCQkJdGhpbmtwYWRfaWQubW9kZWxfc3RyLAorCQkJKHRoaW5rcGFkX2lkLm51bW1vZGVsX3N0cikgPworCQkJCXRoaW5rcGFkX2lkLm51bW1vZGVsX3N0ciA6ICJ1bmtub3duIik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0aGlua3BhZF9hY3BpX2RyaXZlcl9yZWFkKGNoYXIgKnApCit7CisJaW50IGxlbiA9IDA7CisKKwlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAiZHJpdmVyOlx0XHQlc1xuIiwgVFBBQ1BJX0RFU0MpOworCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICJ2ZXJzaW9uOlx0JXNcbiIsIFRQQUNQSV9WRVJTSU9OKTsKKworCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaWJtX3N0cnVjdCB0aGlua3BhZF9hY3BpX2RyaXZlcl9kYXRhID0geworCS5uYW1lID0gImRyaXZlciIsCisJLnJlYWQgPSB0aGlua3BhZF9hY3BpX2RyaXZlcl9yZWFkLAorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEhvdGtleSBzdWJkcml2ZXIKKyAqLworCitlbnVtIHsJLyogaG90IGtleSBzY2FuIGNvZGVzIChkZXJpdmVkIGZyb20gQUNQSSBEU0RUKSAqLworCVRQX0FDUElfSE9US0VZU0NBTl9GTkYxCQk9IDAsCisJVFBfQUNQSV9IT1RLRVlTQ0FOX0ZORjIsCisJVFBfQUNQSV9IT1RLRVlTQ0FOX0ZORjMsCisJVFBfQUNQSV9IT1RLRVlTQ0FOX0ZORjQsCisJVFBfQUNQSV9IT1RLRVlTQ0FOX0ZORjUsCisJVFBfQUNQSV9IT1RLRVlTQ0FOX0ZORjYsCisJVFBfQUNQSV9IT1RLRVlTQ0FOX0ZORjcsCisJVFBfQUNQSV9IT1RLRVlTQ0FOX0ZORjgsCisJVFBfQUNQSV9IT1RLRVlTQ0FOX0ZORjksCisJVFBfQUNQSV9IT1RLRVlTQ0FOX0ZORjEwLAorCVRQX0FDUElfSE9US0VZU0NBTl9GTkYxMSwKKwlUUF9BQ1BJX0hPVEtFWVNDQU5fRk5GMTIsCisJVFBfQUNQSV9IT1RLRVlTQ0FOX0ZOQkFDS1NQQUNFLAorCVRQX0FDUElfSE9US0VZU0NBTl9GTklOU0VSVCwKKwlUUF9BQ1BJX0hPVEtFWVNDQU5fRk5ERUxFVEUsCisJVFBfQUNQSV9IT1RLRVlTQ0FOX0ZOSE9NRSwKKwlUUF9BQ1BJX0hPVEtFWVNDQU5fRk5FTkQsCisJVFBfQUNQSV9IT1RLRVlTQ0FOX0ZOUEFHRVVQLAorCVRQX0FDUElfSE9US0VZU0NBTl9GTlBBR0VET1dOLAorCVRQX0FDUElfSE9US0VZU0NBTl9GTlNQQUNFLAorCVRQX0FDUElfSE9US0VZU0NBTl9WT0xVTUVVUCwKKwlUUF9BQ1BJX0hPVEtFWVNDQU5fVk9MVU1FRE9XTiwKKwlUUF9BQ1BJX0hPVEtFWVNDQU5fTVVURSwKKwlUUF9BQ1BJX0hPVEtFWVNDQU5fVEhJTktQQUQsCit9OworCitlbnVtIHsJLyogS2V5cyBhdmFpbGFibGUgdGhyb3VnaCBOVlJBTSBwb2xsaW5nICovCisJVFBBQ1BJX0hLRVlfTlZSQU1fS05PV05fTUFTSyA9IDB4MDBmYjg4YzBVLAorCVRQQUNQSV9IS0VZX05WUkFNX0dPT0RfTUFTSyAgPSAweDAwZmI4MDAwVSwKK307CisKK2VudW0gewkvKiBQb3NpdGlvbnMgb2Ygc29tZSBvZiB0aGUga2V5cyBpbiBob3RrZXkgbWFza3MgKi8KKwlUUF9BQ1BJX0hLRVlfRElTUFNXVENIX01BU0sJPSAxIDw8IFRQX0FDUElfSE9US0VZU0NBTl9GTkY3LAorCVRQX0FDUElfSEtFWV9ESVNQWFBBTkRfTUFTSwk9IDEgPDwgVFBfQUNQSV9IT1RLRVlTQ0FOX0ZORjgsCisJVFBfQUNQSV9IS0VZX0hJQkVSTkFURV9NQVNLCT0gMSA8PCBUUF9BQ1BJX0hPVEtFWVNDQU5fRk5GMTIsCisJVFBfQUNQSV9IS0VZX0JSR0hUVVBfTUFTSwk9IDEgPDwgVFBfQUNQSV9IT1RLRVlTQ0FOX0ZOSE9NRSwKKwlUUF9BQ1BJX0hLRVlfQlJHSFREV05fTUFTSwk9IDEgPDwgVFBfQUNQSV9IT1RLRVlTQ0FOX0ZORU5ELAorCVRQX0FDUElfSEtFWV9USE5LTEdIVF9NQVNLCT0gMSA8PCBUUF9BQ1BJX0hPVEtFWVNDQU5fRk5QQUdFVVAsCisJVFBfQUNQSV9IS0VZX1pPT01fTUFTSwkJPSAxIDw8IFRQX0FDUElfSE9US0VZU0NBTl9GTlNQQUNFLAorCVRQX0FDUElfSEtFWV9WT0xVUF9NQVNLCQk9IDEgPDwgVFBfQUNQSV9IT1RLRVlTQ0FOX1ZPTFVNRVVQLAorCVRQX0FDUElfSEtFWV9WT0xEV05fTUFTSwk9IDEgPDwgVFBfQUNQSV9IT1RLRVlTQ0FOX1ZPTFVNRURPV04sCisJVFBfQUNQSV9IS0VZX01VVEVfTUFTSwkJPSAxIDw8IFRQX0FDUElfSE9US0VZU0NBTl9NVVRFLAorCVRQX0FDUElfSEtFWV9USElOS1BBRF9NQVNLCT0gMSA8PCBUUF9BQ1BJX0hPVEtFWVNDQU5fVEhJTktQQUQsCit9OworCitlbnVtIHsJLyogTlZSQU0gdG8gQUNQSSBIS0VZIGdyb3VwIG1hcCAqLworCVRQX05WUkFNX0hLRVlfR1JPVVBfSEsyCQk9IFRQX0FDUElfSEtFWV9USElOS1BBRF9NQVNLIHwKKwkJCQkJICBUUF9BQ1BJX0hLRVlfWk9PTV9NQVNLIHwKKwkJCQkJICBUUF9BQ1BJX0hLRVlfRElTUFNXVENIX01BU0sgfAorCQkJCQkgIFRQX0FDUElfSEtFWV9ISUJFUk5BVEVfTUFTSywKKwlUUF9OVlJBTV9IS0VZX0dST1VQX0JSSUdIVE5FU1MJPSBUUF9BQ1BJX0hLRVlfQlJHSFRVUF9NQVNLIHwKKwkJCQkJICBUUF9BQ1BJX0hLRVlfQlJHSFREV05fTUFTSywKKwlUUF9OVlJBTV9IS0VZX0dST1VQX1ZPTFVNRQk9IFRQX0FDUElfSEtFWV9WT0xVUF9NQVNLIHwKKwkJCQkJICBUUF9BQ1BJX0hLRVlfVk9MRFdOX01BU0sgfAorCQkJCQkgIFRQX0FDUElfSEtFWV9NVVRFX01BU0ssCit9OworCisjaWZkZWYgQ09ORklHX1RISU5LUEFEX0FDUElfSE9US0VZX1BPTEwKK3N0cnVjdCB0cF9udnJhbV9zdGF0ZSB7CisgICAgICAgdTE2IHRoaW5rcGFkX3RvZ2dsZToxOworICAgICAgIHUxNiB6b29tX3RvZ2dsZToxOworICAgICAgIHUxNiBkaXNwbGF5X3RvZ2dsZToxOworICAgICAgIHUxNiB0aGlua2xpZ2h0X3RvZ2dsZToxOworICAgICAgIHUxNiBoaWJlcm5hdGVfdG9nZ2xlOjE7CisgICAgICAgdTE2IGRpc3BsYXlleHBfdG9nZ2xlOjE7CisgICAgICAgdTE2IGRpc3BsYXlfc3RhdGU6MTsKKyAgICAgICB1MTYgYnJpZ2h0bmVzc190b2dnbGU6MTsKKyAgICAgICB1MTYgdm9sdW1lX3RvZ2dsZToxOworICAgICAgIHUxNiBtdXRlOjE7CisKKyAgICAgICB1OCBicmlnaHRuZXNzX2xldmVsOworICAgICAgIHU4IHZvbHVtZV9sZXZlbDsKK307CisKK3N0YXRpYyBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRwYWNwaV9ob3RrZXlfdGFzazsKK3N0YXRpYyB1MzIgaG90a2V5X3NvdXJjZV9tYXNrOwkJLyogYml0IG1hc2sgMD1BQ1BJLDE9TlZSQU0gKi8KK3N0YXRpYyBpbnQgaG90a2V5X3BvbGxfZnJlcSA9IDEwOwkvKiBIeiAqLworc3RhdGljIHN0cnVjdCBtdXRleCBob3RrZXlfdGhyZWFkX211dGV4Oworc3RhdGljIHN0cnVjdCBtdXRleCBob3RrZXlfdGhyZWFkX2RhdGFfbXV0ZXg7CitzdGF0aWMgdW5zaWduZWQgaW50IGhvdGtleV9jb25maWdfY2hhbmdlOworCisjZWxzZSAvKiBDT05GSUdfVEhJTktQQURfQUNQSV9IT1RLRVlfUE9MTCAqLworCisjZGVmaW5lIGhvdGtleV9zb3VyY2VfbWFzayAwVQorCisjZW5kaWYgLyogQ09ORklHX1RISU5LUEFEX0FDUElfSE9US0VZX1BPTEwgKi8KKworc3RhdGljIHN0cnVjdCBtdXRleCBob3RrZXlfbXV0ZXg7CisKK3N0YXRpYyBlbnVtIHsJLyogUmVhc29ucyBmb3Igd2FraW5nIHVwICovCisJVFBfQUNQSV9XQUtFVVBfTk9ORSA9IDAsCS8qIE5vbmUgb3IgdW5rbm93biAqLworCVRQX0FDUElfV0FLRVVQX0JBWUVKLAkJLyogQmF5IGVqZWN0aW9uIHJlcXVlc3QgKi8KKwlUUF9BQ1BJX1dBS0VVUF9VTkRPQ0ssCQkvKiBVbmRvY2sgcmVxdWVzdCAqLworfSBob3RrZXlfd2FrZXVwX3JlYXNvbjsKKworc3RhdGljIGludCBob3RrZXlfYXV0b3NsZWVwX2FjazsKKworc3RhdGljIGludCBob3RrZXlfb3JpZ19zdGF0dXM7CitzdGF0aWMgdTMyIGhvdGtleV9vcmlnX21hc2s7CitzdGF0aWMgdTMyIGhvdGtleV9hbGxfbWFzazsKK3N0YXRpYyB1MzIgaG90a2V5X3Jlc2VydmVkX21hc2s7CitzdGF0aWMgdTMyIGhvdGtleV9tYXNrOworCitzdGF0aWMgdW5zaWduZWQgaW50IGhvdGtleV9yZXBvcnRfbW9kZTsKKworc3RhdGljIHUxNiAqaG90a2V5X2tleWNvZGVfbWFwOworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9zZXQgKmhvdGtleV9kZXZfYXR0cmlidXRlczsKKworI2lmZGVmIENPTkZJR19USElOS1BBRF9BQ1BJX0hPVEtFWV9QT0xMCisjZGVmaW5lIEhPVEtFWV9DT05GSUdfQ1JJVElDQUxfU1RBUlQgXAorCWRvIHsgXAorCQltdXRleF9sb2NrKCZob3RrZXlfdGhyZWFkX2RhdGFfbXV0ZXgpOyBcCisJCWhvdGtleV9jb25maWdfY2hhbmdlKys7IFwKKwl9IHdoaWxlICgwKTsKKyNkZWZpbmUgSE9US0VZX0NPTkZJR19DUklUSUNBTF9FTkQgXAorCW11dGV4X3VubG9jaygmaG90a2V5X3RocmVhZF9kYXRhX211dGV4KTsKKyNlbHNlCisjZGVmaW5lIEhPVEtFWV9DT05GSUdfQ1JJVElDQUxfU1RBUlQKKyNkZWZpbmUgSE9US0VZX0NPTkZJR19DUklUSUNBTF9FTkQKKyNlbmRpZiAvKiBDT05GSUdfVEhJTktQQURfQUNQSV9IT1RLRVlfUE9MTCAqLworCisvKiBIS0VZLk1IS0coKSByZXR1cm4gYml0cyAqLworI2RlZmluZSBUUF9IT1RLRVlfVEFCTEVUX01BU0sgKDEgPDwgMykKKworc3RhdGljIGludCBob3RrZXlfZ2V0X3dsc3coaW50ICpzdGF0dXMpCit7CisjaWZkZWYgQ09ORklHX1RISU5LUEFEX0FDUElfREVCVUdGQUNJTElUSUVTCisJaWYgKGRiZ193bHN3ZW11bCkgeworCQkqc3RhdHVzID0gISF0cGFjcGlfd2xzd19lbXVsc3RhdGU7CisJCXJldHVybiAwOworCX0KKyNlbmRpZgorCWlmICghYWNwaV9ldmFsZihoa2V5X2hhbmRsZSwgc3RhdHVzLCAiV0xTVyIsICJkIikpCisJCXJldHVybiAtRUlPOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGhvdGtleV9nZXRfdGFibGV0X21vZGUoaW50ICpzdGF0dXMpCit7CisJaW50IHM7CisKKwlpZiAoIWFjcGlfZXZhbGYoaGtleV9oYW5kbGUsICZzLCAiTUhLRyIsICJkIikpCisJCXJldHVybiAtRUlPOworCisJKnN0YXR1cyA9ICgocyAmIFRQX0hPVEtFWV9UQUJMRVRfTUFTSykgIT0gMCk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBDYWxsIHdpdGggaG90a2V5X211dGV4IGhlbGQKKyAqLworc3RhdGljIGludCBob3RrZXlfbWFza19nZXQodm9pZCkKK3sKKwl1MzIgbSA9IDA7CisKKwlpZiAodHBfZmVhdHVyZXMuaG90a2V5X21hc2spIHsKKwkJaWYgKCFhY3BpX2V2YWxmKGhrZXlfaGFuZGxlLCAmbSwgIkRIS04iLCAiZCIpKQorCQkJcmV0dXJuIC1FSU87CisJfQorCWhvdGtleV9tYXNrID0gbSB8IChob3RrZXlfc291cmNlX21hc2sgJiBob3RrZXlfbWFzayk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIENhbGwgd2l0aCBob3RrZXlfbXV0ZXggaGVsZAorICovCitzdGF0aWMgaW50IGhvdGtleV9tYXNrX3NldCh1MzIgbWFzaykKK3sKKwlpbnQgaTsKKwlpbnQgcmMgPSAwOworCisJaWYgKHRwX2ZlYXR1cmVzLmhvdGtleV9tYXNrKSB7CisJCWlmICghdHBfd2FybmVkLmhvdGtleV9tYXNrX2ZmICYmCisJCSAgICAobWFzayA9PSAweGZmZmYgfHwgbWFzayA9PSAweGZmZmZmZiB8fAorCQkgICAgIG1hc2sgPT0gMHhmZmZmZmZmZikpIHsKKwkJCXRwX3dhcm5lZC5ob3RrZXlfbWFza19mZiA9IDE7CisJCQlwcmludGsoVFBBQ1BJX05PVElDRQorCQkJICAgICAgICJzZXR0aW5nIHRoZSBob3RrZXkgbWFzayB0byAweCUwOHggaXMgbGlrZWx5ICIKKwkJCSAgICAgICAibm90IHRoZSBiZXN0IHdheSB0byBnbyBhYm91dCBpdFxuIiwgbWFzayk7CisJCQlwcmludGsoVFBBQ1BJX05PVElDRQorCQkJICAgICAgICJwbGVhc2UgY29uc2lkZXIgdXNpbmcgdGhlIGRyaXZlciBkZWZhdWx0cywgIgorCQkJICAgICAgICJhbmQgcmVmZXIgdG8gdXAtdG8tZGF0ZSB0aGlua3BhZC1hY3BpICIKKwkJCSAgICAgICAiZG9jdW1lbnRhdGlvblxuIik7CisJCX0KKworCQlIT1RLRVlfQ09ORklHX0NSSVRJQ0FMX1NUQVJUCisJCWZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKSB7CisJCQl1MzIgbSA9IDEgPDwgaTsKKwkJCS8qIGVuYWJsZSBpbiBmaXJtd2FyZSBtYXNrIG9ubHkga2V5cyBub3QgaW4gTlZSQU0KKwkJCSAqIG1vZGUsIGJ1dCBlbmFibGUgdGhlIGtleSBpbiB0aGUgY2FjaGVkIGhvdGtleV9tYXNrCisJCQkgKiByZWdhcmRsZXNzIG9mIG1vZGUsIG9yIHRoZSBrZXkgd2lsbCBlbmQgdXAKKwkJCSAqIGRpc2FibGVkIGJ5IGhvdGtleV9tYXNrX2dldCgpICovCisJCQlpZiAoIWFjcGlfZXZhbGYoaGtleV9oYW5kbGUsCisJCQkJCU5VTEwsICJNSEtNIiwgInZkZCIsIGkgKyAxLAorCQkJCQkhISgobWFzayAmIH5ob3RrZXlfc291cmNlX21hc2spICYgbSkpKSB7CisJCQkJcmMgPSAtRUlPOworCQkJCWJyZWFrOworCQkJfSBlbHNlIHsKKwkJCQlob3RrZXlfbWFzayA9IChob3RrZXlfbWFzayAmIH5tKSB8IChtYXNrICYgbSk7CisJCQl9CisJCX0KKwkJSE9US0VZX0NPTkZJR19DUklUSUNBTF9FTkQKKworCQkvKiBob3RrZXlfbWFza19nZXQgbXVzdCBiZSBjYWxsZWQgdW5jb25kaXRpb25hbGx5IGJlbG93ICovCisJCWlmICghaG90a2V5X21hc2tfZ2V0KCkgJiYgIXJjICYmCisJCSAgICAoaG90a2V5X21hc2sgJiB+aG90a2V5X3NvdXJjZV9tYXNrKSAhPQorCQkgICAgIChtYXNrICYgfmhvdGtleV9zb3VyY2VfbWFzaykpIHsKKwkJCXByaW50ayhUUEFDUElfTk9USUNFCisJCQkgICAgICAgInJlcXVlc3RlZCBob3Qga2V5IG1hc2sgMHglMDh4LCBidXQgIgorCQkJICAgICAgICJmaXJtd2FyZSBmb3JjZWQgaXQgdG8gMHglMDh4XG4iLAorCQkJICAgICAgIG1hc2ssIGhvdGtleV9tYXNrKTsKKwkJfQorCX0gZWxzZSB7CisjaWZkZWYgQ09ORklHX1RISU5LUEFEX0FDUElfSE9US0VZX1BPTEwKKwkJSE9US0VZX0NPTkZJR19DUklUSUNBTF9TVEFSVAorCQlob3RrZXlfbWFzayA9IG1hc2sgJiBob3RrZXlfc291cmNlX21hc2s7CisJCUhPVEtFWV9DT05GSUdfQ1JJVElDQUxfRU5ECisJCWhvdGtleV9tYXNrX2dldCgpOworCQlpZiAoaG90a2V5X21hc2sgIT0gbWFzaykgeworCQkJcHJpbnRrKFRQQUNQSV9OT1RJQ0UKKwkJCSAgICAgICAicmVxdWVzdGVkIGhvdCBrZXkgbWFzayAweCUwOHgsICIKKwkJCSAgICAgICAiZm9yY2VkIHRvIDB4JTA4eCAoTlZSQU0gcG9sbCBtYXNrIGlzICIKKwkJCSAgICAgICAiMHglMDh4KTogbm8gZmlybXdhcmUgbWFzayBzdXBwb3J0XG4iLAorCQkJICAgICAgIG1hc2ssIGhvdGtleV9tYXNrLCBob3RrZXlfc291cmNlX21hc2spOworCQl9CisjZWxzZQorCQlob3RrZXlfbWFza19nZXQoKTsKKwkJcmMgPSAtRU5YSU87CisjZW5kaWYgLyogQ09ORklHX1RISU5LUEFEX0FDUElfSE9US0VZX1BPTEwgKi8KKwl9CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgaG90a2V5X3N0YXR1c19nZXQoaW50ICpzdGF0dXMpCit7CisJaWYgKCFhY3BpX2V2YWxmKGhrZXlfaGFuZGxlLCBzdGF0dXMsICJESEtDIiwgImQiKSkKKwkJcmV0dXJuIC1FSU87CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBob3RrZXlfc3RhdHVzX3NldChpbnQgc3RhdHVzKQoreworCWlmICghYWNwaV9ldmFsZihoa2V5X2hhbmRsZSwgTlVMTCwgIk1IS0MiLCAidmQiLCBzdGF0dXMpKQorCQlyZXR1cm4gLUVJTzsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB0cGFjcGlfaW5wdXRfc2VuZF90YWJsZXRzdyh2b2lkKQoreworCWludCBzdGF0ZTsKKworCWlmICh0cF9mZWF0dXJlcy5ob3RrZXlfdGFibGV0ICYmCisJICAgICFob3RrZXlfZ2V0X3RhYmxldF9tb2RlKCZzdGF0ZSkpIHsKKwkJbXV0ZXhfbG9jaygmdHBhY3BpX2lucHV0ZGV2X3NlbmRfbXV0ZXgpOworCisJCWlucHV0X3JlcG9ydF9zd2l0Y2godHBhY3BpX2lucHV0ZGV2LAorCQkJCSAgICBTV19UQUJMRVRfTU9ERSwgISFzdGF0ZSk7CisJCWlucHV0X3N5bmModHBhY3BpX2lucHV0ZGV2KTsKKworCQltdXRleF91bmxvY2soJnRwYWNwaV9pbnB1dGRldl9zZW5kX211dGV4KTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHRwYWNwaV9pbnB1dF9zZW5kX2tleSh1bnNpZ25lZCBpbnQgc2NhbmNvZGUpCit7CisJdW5zaWduZWQgaW50IGtleWNvZGU7CisKKwlrZXljb2RlID0gaG90a2V5X2tleWNvZGVfbWFwW3NjYW5jb2RlXTsKKworCWlmIChrZXljb2RlICE9IEtFWV9SRVNFUlZFRCkgeworCQltdXRleF9sb2NrKCZ0cGFjcGlfaW5wdXRkZXZfc2VuZF9tdXRleCk7CisKKwkJaW5wdXRfcmVwb3J0X2tleSh0cGFjcGlfaW5wdXRkZXYsIGtleWNvZGUsIDEpOworCQlpZiAoa2V5Y29kZSA9PSBLRVlfVU5LTk9XTikKKwkJCWlucHV0X2V2ZW50KHRwYWNwaV9pbnB1dGRldiwgRVZfTVNDLCBNU0NfU0NBTiwKKwkJCQkgICAgc2NhbmNvZGUpOworCQlpbnB1dF9zeW5jKHRwYWNwaV9pbnB1dGRldik7CisKKwkJaW5wdXRfcmVwb3J0X2tleSh0cGFjcGlfaW5wdXRkZXYsIGtleWNvZGUsIDApOworCQlpZiAoa2V5Y29kZSA9PSBLRVlfVU5LTk9XTikKKwkJCWlucHV0X2V2ZW50KHRwYWNwaV9pbnB1dGRldiwgRVZfTVNDLCBNU0NfU0NBTiwKKwkJCQkgICAgc2NhbmNvZGUpOworCQlpbnB1dF9zeW5jKHRwYWNwaV9pbnB1dGRldik7CisKKwkJbXV0ZXhfdW5sb2NrKCZ0cGFjcGlfaW5wdXRkZXZfc2VuZF9tdXRleCk7CisJfQorfQorCisjaWZkZWYgQ09ORklHX1RISU5LUEFEX0FDUElfSE9US0VZX1BPTEwKK3N0YXRpYyBzdHJ1Y3QgdHBfYWNwaV9kcnZfc3RydWN0IGlibV9ob3RrZXlfYWNwaWRyaXZlcjsKKworc3RhdGljIHZvaWQgdHBhY3BpX2hvdGtleV9zZW5kX2tleSh1bnNpZ25lZCBpbnQgc2NhbmNvZGUpCit7CisJdHBhY3BpX2lucHV0X3NlbmRfa2V5KHNjYW5jb2RlKTsKKwlpZiAoaG90a2V5X3JlcG9ydF9tb2RlIDwgMikgeworCQlhY3BpX2J1c19nZW5lcmF0ZV9wcm9jX2V2ZW50KGlibV9ob3RrZXlfYWNwaWRyaXZlci5kZXZpY2UsCisJCQkJCQkweDgwLCAweDEwMDEgKyBzY2FuY29kZSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBob3RrZXlfcmVhZF9udnJhbShzdHJ1Y3QgdHBfbnZyYW1fc3RhdGUgKm4sIHUzMiBtKQoreworCXU4IGQ7CisKKwlpZiAobSAmIFRQX05WUkFNX0hLRVlfR1JPVVBfSEsyKSB7CisJCWQgPSBudnJhbV9yZWFkX2J5dGUoVFBfTlZSQU1fQUREUl9ISzIpOworCQluLT50aGlua3BhZF90b2dnbGUgPSAhIShkICYgVFBfTlZSQU1fTUFTS19IS1RfVEhJTktQQUQpOworCQluLT56b29tX3RvZ2dsZSA9ICEhKGQgJiBUUF9OVlJBTV9NQVNLX0hLVF9aT09NKTsKKwkJbi0+ZGlzcGxheV90b2dnbGUgPSAhIShkICYgVFBfTlZSQU1fTUFTS19IS1RfRElTUExBWSk7CisJCW4tPmhpYmVybmF0ZV90b2dnbGUgPSAhIShkICYgVFBfTlZSQU1fTUFTS19IS1RfSElCRVJOQVRFKTsKKwl9CisJaWYgKG0gJiBUUF9BQ1BJX0hLRVlfVEhOS0xHSFRfTUFTSykgeworCQlkID0gbnZyYW1fcmVhZF9ieXRlKFRQX05WUkFNX0FERFJfVEhJTktMSUdIVCk7CisJCW4tPnRoaW5rbGlnaHRfdG9nZ2xlID0gISEoZCAmIFRQX05WUkFNX01BU0tfVEhJTktMSUdIVCk7CisJfQorCWlmIChtICYgVFBfQUNQSV9IS0VZX0RJU1BYUEFORF9NQVNLKSB7CisJCWQgPSBudnJhbV9yZWFkX2J5dGUoVFBfTlZSQU1fQUREUl9WSURFTyk7CisJCW4tPmRpc3BsYXlleHBfdG9nZ2xlID0KKwkJCQkhIShkICYgVFBfTlZSQU1fTUFTS19IS1RfRElTUEVYUE5EKTsKKwl9CisJaWYgKG0gJiBUUF9OVlJBTV9IS0VZX0dST1VQX0JSSUdIVE5FU1MpIHsKKwkJZCA9IG52cmFtX3JlYWRfYnl0ZShUUF9OVlJBTV9BRERSX0JSSUdIVE5FU1MpOworCQluLT5icmlnaHRuZXNzX2xldmVsID0gKGQgJiBUUF9OVlJBTV9NQVNLX0xFVkVMX0JSSUdIVE5FU1MpCisJCQkJPj4gVFBfTlZSQU1fUE9TX0xFVkVMX0JSSUdIVE5FU1M7CisJCW4tPmJyaWdodG5lc3NfdG9nZ2xlID0KKwkJCQkhIShkICYgVFBfTlZSQU1fTUFTS19IS1RfQlJJR0hUTkVTUyk7CisJfQorCWlmIChtICYgVFBfTlZSQU1fSEtFWV9HUk9VUF9WT0xVTUUpIHsKKwkJZCA9IG52cmFtX3JlYWRfYnl0ZShUUF9OVlJBTV9BRERSX01JWEVSKTsKKwkJbi0+dm9sdW1lX2xldmVsID0gKGQgJiBUUF9OVlJBTV9NQVNLX0xFVkVMX1ZPTFVNRSkKKwkJCQk+PiBUUF9OVlJBTV9QT1NfTEVWRUxfVk9MVU1FOworCQluLT5tdXRlID0gISEoZCAmIFRQX05WUkFNX01BU0tfTVVURSk7CisJCW4tPnZvbHVtZV90b2dnbGUgPSAhIShkICYgVFBfTlZSQU1fTUFTS19IS1RfVk9MVU1FKTsKKwl9Cit9CisKKyNkZWZpbmUgVFBBQ1BJX0NPTVBBUkVfS0VZKF9fc2NhbmNvZGUsIF9fbWVtYmVyKSBcCisJZG8geyBcCisJCWlmICgobWFzayAmICgxIDw8IF9fc2NhbmNvZGUpKSAmJiBcCisJCSAgICBvbGRuLT5fX21lbWJlciAhPSBuZXduLT5fX21lbWJlcikgXAorCQl0cGFjcGlfaG90a2V5X3NlbmRfa2V5KF9fc2NhbmNvZGUpOyBcCisJfSB3aGlsZSAoMCkKKworI2RlZmluZSBUUEFDUElfTUFZX1NFTkRfS0VZKF9fc2NhbmNvZGUpIFwKKwlkbyB7IGlmIChtYXNrICYgKDEgPDwgX19zY2FuY29kZSkpIFwKKwkJdHBhY3BpX2hvdGtleV9zZW5kX2tleShfX3NjYW5jb2RlKTsgfSB3aGlsZSAoMCkKKworc3RhdGljIHZvaWQgaG90a2V5X2NvbXBhcmVfYW5kX2lzc3VlX2V2ZW50KHN0cnVjdCB0cF9udnJhbV9zdGF0ZSAqb2xkbiwKKwkJCQkJICAgc3RydWN0IHRwX252cmFtX3N0YXRlICpuZXduLAorCQkJCQkgICB1MzIgbWFzaykKK3sKKwlUUEFDUElfQ09NUEFSRV9LRVkoVFBfQUNQSV9IT1RLRVlTQ0FOX1RISU5LUEFELCB0aGlua3BhZF90b2dnbGUpOworCVRQQUNQSV9DT01QQVJFX0tFWShUUF9BQ1BJX0hPVEtFWVNDQU5fRk5TUEFDRSwgem9vbV90b2dnbGUpOworCVRQQUNQSV9DT01QQVJFX0tFWShUUF9BQ1BJX0hPVEtFWVNDQU5fRk5GNywgZGlzcGxheV90b2dnbGUpOworCVRQQUNQSV9DT01QQVJFX0tFWShUUF9BQ1BJX0hPVEtFWVNDQU5fRk5GMTIsIGhpYmVybmF0ZV90b2dnbGUpOworCisJVFBBQ1BJX0NPTVBBUkVfS0VZKFRQX0FDUElfSE9US0VZU0NBTl9GTlBBR0VVUCwgdGhpbmtsaWdodF90b2dnbGUpOworCisJVFBBQ1BJX0NPTVBBUkVfS0VZKFRQX0FDUElfSE9US0VZU0NBTl9GTkY4LCBkaXNwbGF5ZXhwX3RvZ2dsZSk7CisKKwkvKiBoYW5kbGUgdm9sdW1lICovCisJaWYgKG9sZG4tPnZvbHVtZV90b2dnbGUgIT0gbmV3bi0+dm9sdW1lX3RvZ2dsZSkgeworCQlpZiAob2xkbi0+bXV0ZSAhPSBuZXduLT5tdXRlKSB7CisJCQlUUEFDUElfTUFZX1NFTkRfS0VZKFRQX0FDUElfSE9US0VZU0NBTl9NVVRFKTsKKwkJfQorCQlpZiAob2xkbi0+dm9sdW1lX2xldmVsID4gbmV3bi0+dm9sdW1lX2xldmVsKSB7CisJCQlUUEFDUElfTUFZX1NFTkRfS0VZKFRQX0FDUElfSE9US0VZU0NBTl9WT0xVTUVET1dOKTsKKwkJfSBlbHNlIGlmIChvbGRuLT52b2x1bWVfbGV2ZWwgPCBuZXduLT52b2x1bWVfbGV2ZWwpIHsKKwkJCVRQQUNQSV9NQVlfU0VORF9LRVkoVFBfQUNQSV9IT1RLRVlTQ0FOX1ZPTFVNRVVQKTsKKwkJfSBlbHNlIGlmIChvbGRuLT5tdXRlID09IG5ld24tPm11dGUpIHsKKwkJCS8qIHJlcGVhdGVkIGtleSBwcmVzc2VzIHRoYXQgZGlkbid0IGNoYW5nZSBzdGF0ZSAqLworCQkJaWYgKG5ld24tPm11dGUpIHsKKwkJCQlUUEFDUElfTUFZX1NFTkRfS0VZKFRQX0FDUElfSE9US0VZU0NBTl9NVVRFKTsKKwkJCX0gZWxzZSBpZiAobmV3bi0+dm9sdW1lX2xldmVsICE9IDApIHsKKwkJCQlUUEFDUElfTUFZX1NFTkRfS0VZKFRQX0FDUElfSE9US0VZU0NBTl9WT0xVTUVVUCk7CisJCQl9IGVsc2UgeworCQkJCVRQQUNQSV9NQVlfU0VORF9LRVkoVFBfQUNQSV9IT1RLRVlTQ0FOX1ZPTFVNRURPV04pOworCQkJfQorCQl9CisJfQorCisJLyogaGFuZGxlIGJyaWdodG5lc3MgKi8KKwlpZiAob2xkbi0+YnJpZ2h0bmVzc190b2dnbGUgIT0gbmV3bi0+YnJpZ2h0bmVzc190b2dnbGUpIHsKKwkJaWYgKG9sZG4tPmJyaWdodG5lc3NfbGV2ZWwgPCBuZXduLT5icmlnaHRuZXNzX2xldmVsKSB7CisJCQlUUEFDUElfTUFZX1NFTkRfS0VZKFRQX0FDUElfSE9US0VZU0NBTl9GTkhPTUUpOworCQl9IGVsc2UgaWYgKG9sZG4tPmJyaWdodG5lc3NfbGV2ZWwgPiBuZXduLT5icmlnaHRuZXNzX2xldmVsKSB7CisJCQlUUEFDUElfTUFZX1NFTkRfS0VZKFRQX0FDUElfSE9US0VZU0NBTl9GTkVORCk7CisJCX0gZWxzZSB7CisJCQkvKiByZXBlYXRlZCBrZXkgcHJlc3NlcyB0aGF0IGRpZG4ndCBjaGFuZ2Ugc3RhdGUgKi8KKwkJCWlmIChuZXduLT5icmlnaHRuZXNzX2xldmVsICE9IDApIHsKKwkJCQlUUEFDUElfTUFZX1NFTkRfS0VZKFRQX0FDUElfSE9US0VZU0NBTl9GTkhPTUUpOworCQkJfSBlbHNlIHsKKwkJCQlUUEFDUElfTUFZX1NFTkRfS0VZKFRQX0FDUElfSE9US0VZU0NBTl9GTkVORCk7CisJCQl9CisJCX0KKwl9Cit9CisKKyN1bmRlZiBUUEFDUElfQ09NUEFSRV9LRVkKKyN1bmRlZiBUUEFDUElfTUFZX1NFTkRfS0VZCisKK3N0YXRpYyBpbnQgaG90a2V5X2t0aHJlYWQodm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgdHBfbnZyYW1fc3RhdGUgc1syXTsKKwl1MzIgbWFzazsKKwl1bnNpZ25lZCBpbnQgc2ksIHNvOworCXVuc2lnbmVkIGxvbmcgdDsKKwl1bnNpZ25lZCBpbnQgY2hhbmdlX2RldGVjdG9yLCBtdXN0X3Jlc2V0OworCisJbXV0ZXhfbG9jaygmaG90a2V5X3RocmVhZF9tdXRleCk7CisKKwlpZiAodHBhY3BpX2xpZmVjeWNsZSA9PSBUUEFDUElfTElGRV9FWElUSU5HKQorCQlnb3RvIGV4aXQ7CisKKwlzZXRfZnJlZXphYmxlKCk7CisKKwlzbyA9IDA7CisJc2kgPSAxOworCXQgPSAwOworCisJLyogSW5pdGlhbCBzdGF0ZSBmb3IgY29tcGFyZXMgKi8KKwltdXRleF9sb2NrKCZob3RrZXlfdGhyZWFkX2RhdGFfbXV0ZXgpOworCWNoYW5nZV9kZXRlY3RvciA9IGhvdGtleV9jb25maWdfY2hhbmdlOworCW1hc2sgPSBob3RrZXlfc291cmNlX21hc2sgJiBob3RrZXlfbWFzazsKKwltdXRleF91bmxvY2soJmhvdGtleV90aHJlYWRfZGF0YV9tdXRleCk7CisJaG90a2V5X3JlYWRfbnZyYW0oJnNbc29dLCBtYXNrKTsKKworCXdoaWxlICgha3RocmVhZF9zaG91bGRfc3RvcCgpICYmIGhvdGtleV9wb2xsX2ZyZXEpIHsKKwkJaWYgKHQgPT0gMCkKKwkJCXQgPSAxMDAwL2hvdGtleV9wb2xsX2ZyZXE7CisJCXQgPSBtc2xlZXBfaW50ZXJydXB0aWJsZSh0KTsKKwkJaWYgKHVubGlrZWx5KGt0aHJlYWRfc2hvdWxkX3N0b3AoKSkpCisJCQlicmVhazsKKwkJbXVzdF9yZXNldCA9IHRyeV90b19mcmVlemUoKTsKKwkJaWYgKHQgPiAwICYmICFtdXN0X3Jlc2V0KQorCQkJY29udGludWU7CisKKwkJbXV0ZXhfbG9jaygmaG90a2V5X3RocmVhZF9kYXRhX211dGV4KTsKKwkJaWYgKG11c3RfcmVzZXQgfHwgaG90a2V5X2NvbmZpZ19jaGFuZ2UgIT0gY2hhbmdlX2RldGVjdG9yKSB7CisJCQkvKiBmb3JnZXQgb2xkIHN0YXRlIG9uIHRoYXcgb3IgY29uZmlnIGNoYW5nZSAqLworCQkJc2kgPSBzbzsKKwkJCXQgPSAwOworCQkJY2hhbmdlX2RldGVjdG9yID0gaG90a2V5X2NvbmZpZ19jaGFuZ2U7CisJCX0KKwkJbWFzayA9IGhvdGtleV9zb3VyY2VfbWFzayAmIGhvdGtleV9tYXNrOworCQltdXRleF91bmxvY2soJmhvdGtleV90aHJlYWRfZGF0YV9tdXRleCk7CisKKwkJaWYgKGxpa2VseShtYXNrKSkgeworCQkJaG90a2V5X3JlYWRfbnZyYW0oJnNbc2ldLCBtYXNrKTsKKwkJCWlmIChsaWtlbHkoc2kgIT0gc28pKSB7CisJCQkJaG90a2V5X2NvbXBhcmVfYW5kX2lzc3VlX2V2ZW50KCZzW3NvXSwgJnNbc2ldLAorCQkJCQkJCQltYXNrKTsKKwkJCX0KKwkJfQorCisJCXNvID0gc2k7CisJCXNpIF49IDE7CisJfQorCitleGl0OgorCW11dGV4X3VubG9jaygmaG90a2V5X3RocmVhZF9tdXRleCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGhvdGtleV9wb2xsX3N0b3Bfc3luYyh2b2lkKQoreworCWlmICh0cGFjcGlfaG90a2V5X3Rhc2spIHsKKwkJaWYgKGZyb3plbih0cGFjcGlfaG90a2V5X3Rhc2spIHx8CisJCSAgICBmcmVlemluZyh0cGFjcGlfaG90a2V5X3Rhc2spKQorCQkJdGhhd19wcm9jZXNzKHRwYWNwaV9ob3RrZXlfdGFzayk7CisKKwkJa3RocmVhZF9zdG9wKHRwYWNwaV9ob3RrZXlfdGFzayk7CisJCXRwYWNwaV9ob3RrZXlfdGFzayA9IE5VTEw7CisJCW11dGV4X2xvY2soJmhvdGtleV90aHJlYWRfbXV0ZXgpOworCQkvKiBhdCB0aGlzIHBvaW50LCB0aGUgdGhyZWFkIGRpZCBleGl0ICovCisJCW11dGV4X3VubG9jaygmaG90a2V5X3RocmVhZF9tdXRleCk7CisJfQorfQorCisvKiBjYWxsIHdpdGggaG90a2V5X211dGV4IGhlbGQgKi8KK3N0YXRpYyB2b2lkIGhvdGtleV9wb2xsX3NldHVwKGludCBtYXlfd2FybikKK3sKKwlpZiAoKGhvdGtleV9zb3VyY2VfbWFzayAmIGhvdGtleV9tYXNrKSAhPSAwICYmCisJICAgIGhvdGtleV9wb2xsX2ZyZXEgPiAwICYmCisJICAgICh0cGFjcGlfaW5wdXRkZXYtPnVzZXJzID4gMCB8fCBob3RrZXlfcmVwb3J0X21vZGUgPCAyKSkgeworCQlpZiAoIXRwYWNwaV9ob3RrZXlfdGFzaykgeworCQkJdHBhY3BpX2hvdGtleV90YXNrID0ga3RocmVhZF9ydW4oaG90a2V5X2t0aHJlYWQsCisJCQkJCU5VTEwsIFRQQUNQSV9OVlJBTV9LVEhSRUFEX05BTUUpOworCQkJaWYgKElTX0VSUih0cGFjcGlfaG90a2V5X3Rhc2spKSB7CisJCQkJdHBhY3BpX2hvdGtleV90YXNrID0gTlVMTDsKKwkJCQlwcmludGsoVFBBQ1BJX0VSUgorCQkJCSAgICAgICAiY291bGQgbm90IGNyZWF0ZSBrZXJuZWwgdGhyZWFkICIKKwkJCQkgICAgICAgImZvciBob3RrZXkgcG9sbGluZ1xuIik7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQlob3RrZXlfcG9sbF9zdG9wX3N5bmMoKTsKKwkJaWYgKG1heV93YXJuICYmCisJCSAgICBob3RrZXlfc291cmNlX21hc2sgIT0gMCAmJiBob3RrZXlfcG9sbF9mcmVxID09IDApIHsKKwkJCXByaW50ayhUUEFDUElfTk9USUNFCisJCQkJImhvdCBrZXlzIDB4JTA4eCByZXF1aXJlIHBvbGxpbmcsICIKKwkJCQkid2hpY2ggaXMgY3VycmVudGx5IGRpc2FibGVkXG4iLAorCQkJCWhvdGtleV9zb3VyY2VfbWFzayk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIGhvdGtleV9wb2xsX3NldHVwX3NhZmUoaW50IG1heV93YXJuKQoreworCW11dGV4X2xvY2soJmhvdGtleV9tdXRleCk7CisJaG90a2V5X3BvbGxfc2V0dXAobWF5X3dhcm4pOworCW11dGV4X3VubG9jaygmaG90a2V5X211dGV4KTsKK30KKworI2Vsc2UgLyogQ09ORklHX1RISU5LUEFEX0FDUElfSE9US0VZX1BPTEwgKi8KKworc3RhdGljIHZvaWQgaG90a2V5X3BvbGxfc2V0dXBfc2FmZShpbnQgX191bnVzZWQpCit7Cit9CisKKyNlbmRpZiAvKiBDT05GSUdfVEhJTktQQURfQUNQSV9IT1RLRVlfUE9MTCAqLworCitzdGF0aWMgaW50IGhvdGtleV9pbnB1dGRldl9vcGVuKHN0cnVjdCBpbnB1dF9kZXYgKmRldikKK3sKKwlzd2l0Y2ggKHRwYWNwaV9saWZlY3ljbGUpIHsKKwljYXNlIFRQQUNQSV9MSUZFX0lOSVQ6CisJCS8qCisJCSAqIGhvdGtleV9pbml0IHdpbGwgY2FsbCBob3RrZXlfcG9sbF9zZXR1cF9zYWZlCisJCSAqIGF0IHRoZSBhcHByb3ByaWF0ZSBtb21lbnQKKwkJICovCisJCXJldHVybiAwOworCWNhc2UgVFBBQ1BJX0xJRkVfRVhJVElORzoKKwkJcmV0dXJuIC1FQlVTWTsKKwljYXNlIFRQQUNQSV9MSUZFX1JVTk5JTkc6CisJCWhvdGtleV9wb2xsX3NldHVwX3NhZmUoMCk7CisJCXJldHVybiAwOworCX0KKworCS8qIFNob3VsZCBvbmx5IGhhcHBlbiBpZiB0cGFjcGlfbGlmZWN5Y2xlIGlzIGNvcnJ1cHQgKi8KKwlCVUcoKTsKKwlyZXR1cm4gLUVCVVNZOworfQorCitzdGF0aWMgdm9pZCBob3RrZXlfaW5wdXRkZXZfY2xvc2Uoc3RydWN0IGlucHV0X2RldiAqZGV2KQoreworCS8qIGRpc2FibGUgaG90a2V5IHBvbGxpbmcgd2hlbiBwb3NzaWJsZSAqLworCWlmICh0cGFjcGlfbGlmZWN5Y2xlID09IFRQQUNQSV9MSUZFX1JVTk5JTkcpCisJCWhvdGtleV9wb2xsX3NldHVwX3NhZmUoMCk7Cit9CisKKy8qIHN5c2ZzIGhvdGtleSBlbmFibGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworc3RhdGljIHNzaXplX3QgaG90a2V5X2VuYWJsZV9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCSAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJICAgY2hhciAqYnVmKQoreworCWludCByZXMsIHN0YXR1czsKKworCXJlcyA9IGhvdGtleV9zdGF0dXNfZ2V0KCZzdGF0dXMpOworCWlmIChyZXMpCisJCXJldHVybiByZXM7CisKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZFxuIiwgc3RhdHVzKTsKK30KKworc3RhdGljIHNzaXplX3QgaG90a2V5X2VuYWJsZV9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJdW5zaWduZWQgbG9uZyB0OworCWludCByZXM7CisKKwlpZiAocGFyc2Vfc3RydG91bChidWYsIDEsICZ0KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXMgPSBob3RrZXlfc3RhdHVzX3NldCh0KTsKKworCXJldHVybiAocmVzKSA/IHJlcyA6IGNvdW50OworfQorCitzdGF0aWMgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgZGV2X2F0dHJfaG90a2V5X2VuYWJsZSA9CisJX19BVFRSKGhvdGtleV9lbmFibGUsIFNfSVdVU1IgfCBTX0lSVUdPLAorCQlob3RrZXlfZW5hYmxlX3Nob3csIGhvdGtleV9lbmFibGVfc3RvcmUpOworCisvKiBzeXNmcyBob3RrZXkgbWFzayAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3N0YXRpYyBzc2l6ZV90IGhvdGtleV9tYXNrX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAorCQkJICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICBjaGFyICpidWYpCit7CisJaW50IHJlczsKKworCWlmIChtdXRleF9sb2NrX2tpbGxhYmxlKCZob3RrZXlfbXV0ZXgpKQorCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCXJlcyA9IGhvdGtleV9tYXNrX2dldCgpOworCW11dGV4X3VubG9jaygmaG90a2V5X211dGV4KTsKKworCXJldHVybiAocmVzKT8KKwkJcmVzIDogc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIweCUwOHhcbiIsIGhvdGtleV9tYXNrKTsKK30KKworc3RhdGljIHNzaXplX3QgaG90a2V5X21hc2tfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAorCQkJICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXVuc2lnbmVkIGxvbmcgdDsKKwlpbnQgcmVzOworCisJaWYgKHBhcnNlX3N0cnRvdWwoYnVmLCAweGZmZmZmZmZmVUwsICZ0KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAobXV0ZXhfbG9ja19raWxsYWJsZSgmaG90a2V5X211dGV4KSkKKwkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKworCXJlcyA9IGhvdGtleV9tYXNrX3NldCh0KTsKKworI2lmZGVmIENPTkZJR19USElOS1BBRF9BQ1BJX0hPVEtFWV9QT0xMCisJaG90a2V5X3BvbGxfc2V0dXAoMSk7CisjZW5kaWYKKworCW11dGV4X3VubG9jaygmaG90a2V5X211dGV4KTsKKworCXJldHVybiAocmVzKSA/IHJlcyA6IGNvdW50OworfQorCitzdGF0aWMgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgZGV2X2F0dHJfaG90a2V5X21hc2sgPQorCV9fQVRUUihob3RrZXlfbWFzaywgU19JV1VTUiB8IFNfSVJVR08sCisJCWhvdGtleV9tYXNrX3Nob3csIGhvdGtleV9tYXNrX3N0b3JlKTsKKworLyogc3lzZnMgaG90a2V5IGJpb3NfZW5hYmxlZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitzdGF0aWMgc3NpemVfdCBob3RrZXlfYmlvc19lbmFibGVkX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAorCQkJICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICBjaGFyICpidWYpCit7CisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWRcbiIsIGhvdGtleV9vcmlnX3N0YXR1cyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSBkZXZfYXR0cl9ob3RrZXlfYmlvc19lbmFibGVkID0KKwlfX0FUVFIoaG90a2V5X2Jpb3NfZW5hYmxlZCwgU19JUlVHTywgaG90a2V5X2Jpb3NfZW5hYmxlZF9zaG93LCBOVUxMKTsKKworLyogc3lzZnMgaG90a2V5IGJpb3NfbWFzayAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitzdGF0aWMgc3NpemVfdCBob3RrZXlfYmlvc19tYXNrX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAorCQkJICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICBjaGFyICpidWYpCit7CisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiMHglMDh4XG4iLCBob3RrZXlfb3JpZ19tYXNrKTsKK30KKworc3RhdGljIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlIGRldl9hdHRyX2hvdGtleV9iaW9zX21hc2sgPQorCV9fQVRUUihob3RrZXlfYmlvc19tYXNrLCBTX0lSVUdPLCBob3RrZXlfYmlvc19tYXNrX3Nob3csIE5VTEwpOworCisvKiBzeXNmcyBob3RrZXkgYWxsX21hc2sgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3N0YXRpYyBzc2l6ZV90IGhvdGtleV9hbGxfbWFza19zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCSAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJICAgY2hhciAqYnVmKQoreworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIjB4JTA4eFxuIiwKKwkJCQlob3RrZXlfYWxsX21hc2sgfCBob3RrZXlfc291cmNlX21hc2spOworfQorCitzdGF0aWMgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgZGV2X2F0dHJfaG90a2V5X2FsbF9tYXNrID0KKwlfX0FUVFIoaG90a2V5X2FsbF9tYXNrLCBTX0lSVUdPLCBob3RrZXlfYWxsX21hc2tfc2hvdywgTlVMTCk7CisKKy8qIHN5c2ZzIGhvdGtleSByZWNvbW1lbmRlZF9tYXNrIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworc3RhdGljIHNzaXplX3QgaG90a2V5X3JlY29tbWVuZGVkX21hc2tfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJCSAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkJICAgIGNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIweCUwOHhcbiIsCisJCQkoaG90a2V5X2FsbF9tYXNrIHwgaG90a2V5X3NvdXJjZV9tYXNrKQorCQkJJiB+aG90a2V5X3Jlc2VydmVkX21hc2spOworfQorCitzdGF0aWMgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgZGV2X2F0dHJfaG90a2V5X3JlY29tbWVuZGVkX21hc2sgPQorCV9fQVRUUihob3RrZXlfcmVjb21tZW5kZWRfbWFzaywgU19JUlVHTywKKwkJaG90a2V5X3JlY29tbWVuZGVkX21hc2tfc2hvdywgTlVMTCk7CisKKyNpZmRlZiBDT05GSUdfVEhJTktQQURfQUNQSV9IT1RLRVlfUE9MTAorCisvKiBzeXNmcyBob3RrZXkgaG90a2V5X3NvdXJjZV9tYXNrIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3N0YXRpYyBzc2l6ZV90IGhvdGtleV9zb3VyY2VfbWFza19zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCSAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJICAgY2hhciAqYnVmKQoreworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIjB4JTA4eFxuIiwgaG90a2V5X3NvdXJjZV9tYXNrKTsKK30KKworc3RhdGljIHNzaXplX3QgaG90a2V5X3NvdXJjZV9tYXNrX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCSAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwl1bnNpZ25lZCBsb25nIHQ7CisKKwlpZiAocGFyc2Vfc3RydG91bChidWYsIDB4ZmZmZmZmZmZVTCwgJnQpIHx8CisJCSgodCAmIH5UUEFDUElfSEtFWV9OVlJBTV9LTk9XTl9NQVNLKSAhPSAwKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAobXV0ZXhfbG9ja19raWxsYWJsZSgmaG90a2V5X211dGV4KSkKKwkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKworCUhPVEtFWV9DT05GSUdfQ1JJVElDQUxfU1RBUlQKKwlob3RrZXlfc291cmNlX21hc2sgPSB0OworCUhPVEtFWV9DT05GSUdfQ1JJVElDQUxfRU5ECisKKwlob3RrZXlfcG9sbF9zZXR1cCgxKTsKKworCW11dGV4X3VubG9jaygmaG90a2V5X211dGV4KTsKKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlIGRldl9hdHRyX2hvdGtleV9zb3VyY2VfbWFzayA9CisJX19BVFRSKGhvdGtleV9zb3VyY2VfbWFzaywgU19JV1VTUiB8IFNfSVJVR08sCisJCWhvdGtleV9zb3VyY2VfbWFza19zaG93LCBob3RrZXlfc291cmNlX21hc2tfc3RvcmUpOworCisvKiBzeXNmcyBob3RrZXkgaG90a2V5X3BvbGxfZnJlcSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3N0YXRpYyBzc2l6ZV90IGhvdGtleV9wb2xsX2ZyZXFfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgIGNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZFxuIiwgaG90a2V5X3BvbGxfZnJlcSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGhvdGtleV9wb2xsX2ZyZXFfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAorCQkJICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXVuc2lnbmVkIGxvbmcgdDsKKworCWlmIChwYXJzZV9zdHJ0b3VsKGJ1ZiwgMjUsICZ0KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAobXV0ZXhfbG9ja19raWxsYWJsZSgmaG90a2V5X211dGV4KSkKKwkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKworCWhvdGtleV9wb2xsX2ZyZXEgPSB0OworCisJaG90a2V5X3BvbGxfc2V0dXAoMSk7CisJbXV0ZXhfdW5sb2NrKCZob3RrZXlfbXV0ZXgpOworCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgZGV2X2F0dHJfaG90a2V5X3BvbGxfZnJlcSA9CisJX19BVFRSKGhvdGtleV9wb2xsX2ZyZXEsIFNfSVdVU1IgfCBTX0lSVUdPLAorCQlob3RrZXlfcG9sbF9mcmVxX3Nob3csIGhvdGtleV9wb2xsX2ZyZXFfc3RvcmUpOworCisjZW5kaWYgLyogQ09ORklHX1RISU5LUEFEX0FDUElfSE9US0VZX1BPTEwgKi8KKworLyogc3lzZnMgaG90a2V5IHJhZGlvX3N3IChwb2xsYWJsZSkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitzdGF0aWMgc3NpemVfdCBob3RrZXlfcmFkaW9fc3dfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgIGNoYXIgKmJ1ZikKK3sKKwlpbnQgcmVzLCBzOworCXJlcyA9IGhvdGtleV9nZXRfd2xzdygmcyk7CisJaWYgKHJlcyA8IDApCisJCXJldHVybiByZXM7CisKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZFxuIiwgISFzKTsKK30KKworc3RhdGljIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlIGRldl9hdHRyX2hvdGtleV9yYWRpb19zdyA9CisJX19BVFRSKGhvdGtleV9yYWRpb19zdywgU19JUlVHTywgaG90a2V5X3JhZGlvX3N3X3Nob3csIE5VTEwpOworCitzdGF0aWMgdm9pZCBob3RrZXlfcmFkaW9fc3dfbm90aWZ5X2NoYW5nZSh2b2lkKQoreworCWlmICh0cF9mZWF0dXJlcy5ob3RrZXlfd2xzdykKKwkJc3lzZnNfbm90aWZ5KCZ0cGFjcGlfcGRldi0+ZGV2LmtvYmosIE5VTEwsCisJCQkgICAgICJob3RrZXlfcmFkaW9fc3ciKTsKK30KKworLyogc3lzZnMgaG90a2V5IHRhYmxldCBtb2RlIChwb2xsYWJsZSkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitzdGF0aWMgc3NpemVfdCBob3RrZXlfdGFibGV0X21vZGVfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgIGNoYXIgKmJ1ZikKK3sKKwlpbnQgcmVzLCBzOworCXJlcyA9IGhvdGtleV9nZXRfdGFibGV0X21vZGUoJnMpOworCWlmIChyZXMgPCAwKQorCQlyZXR1cm4gcmVzOworCisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWRcbiIsICEhcyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSBkZXZfYXR0cl9ob3RrZXlfdGFibGV0X21vZGUgPQorCV9fQVRUUihob3RrZXlfdGFibGV0X21vZGUsIFNfSVJVR08sIGhvdGtleV90YWJsZXRfbW9kZV9zaG93LCBOVUxMKTsKKworc3RhdGljIHZvaWQgaG90a2V5X3RhYmxldF9tb2RlX25vdGlmeV9jaGFuZ2Uodm9pZCkKK3sKKwlpZiAodHBfZmVhdHVyZXMuaG90a2V5X3RhYmxldCkKKwkJc3lzZnNfbm90aWZ5KCZ0cGFjcGlfcGRldi0+ZGV2LmtvYmosIE5VTEwsCisJCQkgICAgICJob3RrZXlfdGFibGV0X21vZGUiKTsKK30KKworLyogc3lzZnMgaG90a2V5IHJlcG9ydF9tb2RlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitzdGF0aWMgc3NpemVfdCBob3RrZXlfcmVwb3J0X21vZGVfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgIGNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZFxuIiwKKwkJKGhvdGtleV9yZXBvcnRfbW9kZSAhPSAwKSA/IGhvdGtleV9yZXBvcnRfbW9kZSA6IDEpOworfQorCitzdGF0aWMgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgZGV2X2F0dHJfaG90a2V5X3JlcG9ydF9tb2RlID0KKwlfX0FUVFIoaG90a2V5X3JlcG9ydF9tb2RlLCBTX0lSVUdPLCBob3RrZXlfcmVwb3J0X21vZGVfc2hvdywgTlVMTCk7CisKKy8qIHN5c2ZzIHdha2V1cCByZWFzb24gKHBvbGxhYmxlKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworc3RhdGljIHNzaXplX3QgaG90a2V5X3dha2V1cF9yZWFzb25fc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgIGNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZFxuIiwgaG90a2V5X3dha2V1cF9yZWFzb24pOworfQorCitzdGF0aWMgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgZGV2X2F0dHJfaG90a2V5X3dha2V1cF9yZWFzb24gPQorCV9fQVRUUih3YWtldXBfcmVhc29uLCBTX0lSVUdPLCBob3RrZXlfd2FrZXVwX3JlYXNvbl9zaG93LCBOVUxMKTsKKworc3RhdGljIHZvaWQgaG90a2V5X3dha2V1cF9yZWFzb25fbm90aWZ5X2NoYW5nZSh2b2lkKQoreworCWlmICh0cF9mZWF0dXJlcy5ob3RrZXlfbWFzaykKKwkJc3lzZnNfbm90aWZ5KCZ0cGFjcGlfcGRldi0+ZGV2LmtvYmosIE5VTEwsCisJCQkgICAgICJ3YWtldXBfcmVhc29uIik7Cit9CisKKy8qIHN5c2ZzIHdha2V1cCBob3R1bnBsdWdfY29tcGxldGUgKHBvbGxhYmxlKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworc3RhdGljIHNzaXplX3QgaG90a2V5X3dha2V1cF9ob3R1bnBsdWdfY29tcGxldGVfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgIGNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZFxuIiwgaG90a2V5X2F1dG9zbGVlcF9hY2spOworfQorCitzdGF0aWMgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgZGV2X2F0dHJfaG90a2V5X3dha2V1cF9ob3R1bnBsdWdfY29tcGxldGUgPQorCV9fQVRUUih3YWtldXBfaG90dW5wbHVnX2NvbXBsZXRlLCBTX0lSVUdPLAorCSAgICAgICBob3RrZXlfd2FrZXVwX2hvdHVucGx1Z19jb21wbGV0ZV9zaG93LCBOVUxMKTsKKworc3RhdGljIHZvaWQgaG90a2V5X3dha2V1cF9ob3R1bnBsdWdfY29tcGxldGVfbm90aWZ5X2NoYW5nZSh2b2lkKQoreworCWlmICh0cF9mZWF0dXJlcy5ob3RrZXlfbWFzaykKKwkJc3lzZnNfbm90aWZ5KCZ0cGFjcGlfcGRldi0+ZGV2LmtvYmosIE5VTEwsCisJCQkgICAgICJ3YWtldXBfaG90dW5wbHVnX2NvbXBsZXRlIik7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqaG90a2V5X2F0dHJpYnV0ZXNbXSBfX2luaXRkYXRhID0geworCSZkZXZfYXR0cl9ob3RrZXlfZW5hYmxlLmF0dHIsCisJJmRldl9hdHRyX2hvdGtleV9iaW9zX2VuYWJsZWQuYXR0ciwKKwkmZGV2X2F0dHJfaG90a2V5X3JlcG9ydF9tb2RlLmF0dHIsCisjaWZkZWYgQ09ORklHX1RISU5LUEFEX0FDUElfSE9US0VZX1BPTEwKKwkmZGV2X2F0dHJfaG90a2V5X21hc2suYXR0ciwKKwkmZGV2X2F0dHJfaG90a2V5X2FsbF9tYXNrLmF0dHIsCisJJmRldl9hdHRyX2hvdGtleV9yZWNvbW1lbmRlZF9tYXNrLmF0dHIsCisJJmRldl9hdHRyX2hvdGtleV9zb3VyY2VfbWFzay5hdHRyLAorCSZkZXZfYXR0cl9ob3RrZXlfcG9sbF9mcmVxLmF0dHIsCisjZW5kaWYKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpob3RrZXlfbWFza19hdHRyaWJ1dGVzW10gX19pbml0ZGF0YSA9IHsKKwkmZGV2X2F0dHJfaG90a2V5X2Jpb3NfbWFzay5hdHRyLAorI2lmbmRlZiBDT05GSUdfVEhJTktQQURfQUNQSV9IT1RLRVlfUE9MTAorCSZkZXZfYXR0cl9ob3RrZXlfbWFzay5hdHRyLAorCSZkZXZfYXR0cl9ob3RrZXlfYWxsX21hc2suYXR0ciwKKwkmZGV2X2F0dHJfaG90a2V5X3JlY29tbWVuZGVkX21hc2suYXR0ciwKKyNlbmRpZgorCSZkZXZfYXR0cl9ob3RrZXlfd2FrZXVwX3JlYXNvbi5hdHRyLAorCSZkZXZfYXR0cl9ob3RrZXlfd2FrZXVwX2hvdHVucGx1Z19jb21wbGV0ZS5hdHRyLAorfTsKKworc3RhdGljIHZvaWQgYmx1ZXRvb3RoX3VwZGF0ZV9yZmsodm9pZCk7CitzdGF0aWMgdm9pZCB3YW5fdXBkYXRlX3Jmayh2b2lkKTsKK3N0YXRpYyB2b2lkIHV3Yl91cGRhdGVfcmZrKHZvaWQpOworc3RhdGljIHZvaWQgdHBhY3BpX3NlbmRfcmFkaW9zd191cGRhdGUodm9pZCkKK3sKKwlpbnQgd2xzdzsKKworCS8qIFN5bmMgdGhlc2UgQkVGT1JFIHNlbmRpbmcgYW55IHJma2lsbCBldmVudHMgKi8KKwlpZiAodHBfZmVhdHVyZXMuYmx1ZXRvb3RoKQorCQlibHVldG9vdGhfdXBkYXRlX3JmaygpOworCWlmICh0cF9mZWF0dXJlcy53YW4pCisJCXdhbl91cGRhdGVfcmZrKCk7CisJaWYgKHRwX2ZlYXR1cmVzLnV3YikKKwkJdXdiX3VwZGF0ZV9yZmsoKTsKKworCWlmICh0cF9mZWF0dXJlcy5ob3RrZXlfd2xzdyAmJiAhaG90a2V5X2dldF93bHN3KCZ3bHN3KSkgeworCQltdXRleF9sb2NrKCZ0cGFjcGlfaW5wdXRkZXZfc2VuZF9tdXRleCk7CisKKwkJaW5wdXRfcmVwb3J0X3N3aXRjaCh0cGFjcGlfaW5wdXRkZXYsCisJCQkJICAgIFNXX1JGS0lMTF9BTEwsICEhd2xzdyk7CisJCWlucHV0X3N5bmModHBhY3BpX2lucHV0ZGV2KTsKKworCQltdXRleF91bmxvY2soJnRwYWNwaV9pbnB1dGRldl9zZW5kX211dGV4KTsKKwl9CisJaG90a2V5X3JhZGlvX3N3X25vdGlmeV9jaGFuZ2UoKTsKK30KKworc3RhdGljIHZvaWQgaG90a2V5X2V4aXQodm9pZCkKK3sKKyNpZmRlZiBDT05GSUdfVEhJTktQQURfQUNQSV9IT1RLRVlfUE9MTAorCWhvdGtleV9wb2xsX3N0b3Bfc3luYygpOworI2VuZGlmCisKKwlpZiAoaG90a2V5X2Rldl9hdHRyaWJ1dGVzKQorCQlkZWxldGVfYXR0cl9zZXQoaG90a2V5X2Rldl9hdHRyaWJ1dGVzLCAmdHBhY3BpX3BkZXYtPmRldi5rb2JqKTsKKworCWtmcmVlKGhvdGtleV9rZXljb2RlX21hcCk7CisKKwlpZiAodHBfZmVhdHVyZXMuaG90a2V5KSB7CisJCWRiZ19wcmludGsoVFBBQ1BJX0RCR19FWElULAorCQkJICAgInJlc3RvcmluZyBvcmlnaW5hbCBob3Qga2V5IG1hc2tcbiIpOworCQkvKiBubyBzaG9ydC1jaXJjdWl0IGJvb2xlYW4gb3BlcmF0b3IgYmVsb3chICovCisJCWlmICgoaG90a2V5X21hc2tfc2V0KGhvdGtleV9vcmlnX21hc2spIHwKKwkJICAgICBob3RrZXlfc3RhdHVzX3NldChob3RrZXlfb3JpZ19zdGF0dXMpKSAhPSAwKQorCQkJcHJpbnRrKFRQQUNQSV9FUlIKKwkJCSAgICAgICAiZmFpbGVkIHRvIHJlc3RvcmUgaG90IGtleSBtYXNrICIKKwkJCSAgICAgICAidG8gQklPUyBkZWZhdWx0c1xuIik7CisJfQorfQorCitzdGF0aWMgaW50IF9faW5pdCBob3RrZXlfaW5pdChzdHJ1Y3QgaWJtX2luaXRfc3RydWN0ICppaWJtKQoreworCS8qIFJlcXVpcmVtZW50cyBmb3IgY2hhbmdpbmcgdGhlIGRlZmF1bHQga2V5bWFwczoKKwkgKgorCSAqIDEuIE1hbnkgb2YgdGhlIGtleXMgYXJlIG1hcHBlZCB0byBLRVlfUkVTRVJWRUQgZm9yIHZlcnkKKwkgKiAgICBnb29kIHJlYXNvbnMuICBEbyBub3QgY2hhbmdlIHRoZW0gdW5sZXNzIHlvdSBoYXZlIGRlZXAKKwkgKiAgICBrbm93bGVkZ2Ugb24gdGhlIElCTSBhbmQgTGVub3ZvIFRoaW5rUGFkIGZpcm13YXJlIGZvcgorCSAqICAgIHRoZSB2YXJpb3VzIFRoaW5rUGFkIG1vZGVscy4gIFRoZSBkcml2ZXIgYmVoYXZlcworCSAqICAgIGRpZmZlcmVudGx5IGZvciBLRVlfUkVTRVJWRUQ6IHN1Y2gga2V5cyBoYXZlIHRoZWlyCisJICogICAgaG90IGtleSBtYXNrICp1bnNldCogaW4gbWFza19yZWNvbW1lbmRlZCwgYW5kIGFsc28KKwkgKiAgICBpbiB0aGUgaW5pdGlhbCBob3Qga2V5IG1hc2sgcHJvZ3JhbW1lZCBpbnRvIHRoZQorCSAqICAgIGZpcm13YXJlIGF0IGRyaXZlciBsb2FkIHRpbWUsIHdoaWNoIG1lYW5zIHRoZSBmaXJtLQorCSAqICAgIHdhcmUgbWF5IHJlYWN0IHZlcnkgZGlmZmVyZW50bHkgaWYgeW91IGNoYW5nZSB0aGVtIHRvCisJICogICAgc29tZXRoaW5nIGVsc2U7CisJICoKKwkgKiAyLiBZb3UgbXVzdCBiZSBzdWJzY3JpYmVkIHRvIHRoZSBsaW51eC10aGlua3BhZCBhbmQKKwkgKiAgICBpYm0tYWNwaS1kZXZlbCBtYWlsaW5nIGxpc3RzLCBhbmQgeW91IHNob3VsZCByZWFkIHRoZQorCSAqICAgIGxpc3QgYXJjaGl2ZXMgc2luY2UgMjAwNyBpZiB5b3Ugd2FudCB0byBjaGFuZ2UgdGhlCisJICogICAga2V5bWFwcy4gIFRoaXMgcmVxdWlyZW1lbnQgZXhpc3RzIHNvIHRoYXQgeW91IHdpbGwKKwkgKiAgICBrbm93IHRoZSBwYXN0IGhpc3Rvcnkgb2YgcHJvYmxlbXMgd2l0aCB0aGUgdGhpbmtwYWQtCisJICogICAgYWNwaSBkcml2ZXIga2V5bWFwcywgYW5kIGFsc28gdGhhdCB5b3Ugd2lsbCBiZQorCSAqICAgIGxpc3RlbmluZyB0byBhbnkgYnVnIHJlcG9ydHM7CisJICoKKwkgKiAzLiBEbyBub3Qgc2VuZCB0aGlua3BhZC1hY3BpIHNwZWNpZmljIHBhdGNoZXMgZGlyZWN0bHkgdG8KKwkgKiAgICBmb3IgbWVyZ2luZywgKmV2ZXIqLiAgU2VuZCB0aGVtIHRvIHRoZSBsaW51eC1hY3BpCisJICogICAgbWFpbGluZ2xpc3QgZm9yIGNvbW1lbnRzLiAgTWVyZ2luZyBpcyB0byBiZSBkb25lIG9ubHkKKwkgKiAgICB0aHJvdWdoIGFjcGktdGVzdCBhbmQgdGhlIEFDUEkgbWFpbnRhaW5lci4KKwkgKgorCSAqIElmIHRoZSBhYm92ZSBpcyB0b28gbXVjaCB0byBhc2ssIGRvbid0IGNoYW5nZSB0aGUga2V5bWFwLgorCSAqIEFzayB0aGUgdGhpbmtwYWQtYWNwaSBtYWludGFpbmVyIHRvIGRvIGl0LCBpbnN0ZWFkLgorCSAqLworCXN0YXRpYyB1MTYgaWJtX2tleWNvZGVfbWFwW10gX19pbml0ZGF0YSA9IHsKKwkJLyogU2NhbiBDb2RlcyAweDAwIHRvIDB4MEI6IEFDUEkgSEtFWSBGTitGMS4uRjEyICovCisJCUtFWV9GTl9GMSwJS0VZX0ZOX0YyLAlLRVlfQ09GRkVFLAlLRVlfU0xFRVAsCisJCUtFWV9XTEFOLAlLRVlfRk5fRjYsIEtFWV9TV0lUQ0hWSURFT01PREUsIEtFWV9GTl9GOCwKKwkJS0VZX0ZOX0Y5LAlLRVlfRk5fRjEwLAlLRVlfRk5fRjExLAlLRVlfU1VTUEVORCwKKworCQkvKiBTY2FuIGNvZGVzIDB4MEMgdG8gMHgxRjogT3RoZXIgQUNQSSBIS0VZIGhvdCBrZXlzICovCisJCUtFWV9VTktOT1dOLAkvKiAweDBDOiBGTitCQUNLU1BBQ0UgKi8KKwkJS0VZX1VOS05PV04sCS8qIDB4MEQ6IEZOK0lOU0VSVCAqLworCQlLRVlfVU5LTk9XTiwJLyogMHgwRTogRk4rREVMRVRFICovCisKKwkJLyogYnJpZ2h0bmVzczogZmlybXdhcmUgYWx3YXlzIHJlYWN0cyB0byB0aGVtLCB1bmxlc3MKKwkJICogWC5vcmcgZGlkIHNvbWUgdHJpY2tzIGluIHRoZSByYWRlb24gQklPUyBzY3JhdGNoCisJCSAqIHJlZ2lzdGVycyBvZiAqc29tZSogbW9kZWxzICovCisJCUtFWV9SRVNFUlZFRCwJLyogMHgwRjogRk4rSE9NRSAoYnJpZ2h0bmVzcyB1cCkgKi8KKwkJS0VZX1JFU0VSVkVELAkvKiAweDEwOiBGTitFTkQgKGJyaWdodG5lc3MgZG93bikgKi8KKworCQkvKiBUaGlua2xpZ2h0OiBmaXJtd2FyZSBhbHdheXMgcmVhY3QgdG8gaXQgKi8KKwkJS0VZX1JFU0VSVkVELAkvKiAweDExOiBGTitQR1VQICh0aGlua2xpZ2h0IHRvZ2dsZSkgKi8KKworCQlLRVlfVU5LTk9XTiwJLyogMHgxMjogRk4rUEdET1dOICovCisJCUtFWV9aT09NLAkvKiAweDEzOiBGTitTUEFDRSAoem9vbSkgKi8KKworCQkvKiBWb2x1bWU6IGZpcm13YXJlIGFsd2F5cyByZWFjdCB0byBpdCBhbmQgcmVwcm9ncmFtcworCQkgKiB0aGUgYnVpbHQtaW4gKmV4dHJhKiBtaXhlci4gIE5ldmVyIG1hcCBpdCB0byBjb250cm9sCisJCSAqIGFub3RoZXIgbWl4ZXIgYnkgZGVmYXVsdC4gKi8KKwkJS0VZX1JFU0VSVkVELAkvKiAweDE0OiBWT0xVTUUgVVAgKi8KKwkJS0VZX1JFU0VSVkVELAkvKiAweDE1OiBWT0xVTUUgRE9XTiAqLworCQlLRVlfUkVTRVJWRUQsCS8qIDB4MTY6IE1VVEUgKi8KKworCQlLRVlfVkVORE9SLAkvKiAweDE3OiBUaGlua3BhZC9BY2Nlc3NJQk0vTGVub3ZvICovCisKKwkJLyogKGFzc2lnbm1lbnRzIHVua25vd24sIHBsZWFzZSByZXBvcnQgaWYgZm91bmQpICovCisJCUtFWV9VTktOT1dOLCBLRVlfVU5LTk9XTiwgS0VZX1VOS05PV04sIEtFWV9VTktOT1dOLAorCQlLRVlfVU5LTk9XTiwgS0VZX1VOS05PV04sIEtFWV9VTktOT1dOLCBLRVlfVU5LTk9XTiwKKwl9OworCXN0YXRpYyB1MTYgbGVub3ZvX2tleWNvZGVfbWFwW10gX19pbml0ZGF0YSA9IHsKKwkJLyogU2NhbiBDb2RlcyAweDAwIHRvIDB4MEI6IEFDUEkgSEtFWSBGTitGMS4uRjEyICovCisJCUtFWV9GTl9GMSwJS0VZX0NPRkZFRSwJS0VZX0JBVFRFUlksCUtFWV9TTEVFUCwKKwkJS0VZX1dMQU4sCUtFWV9GTl9GNiwgS0VZX1NXSVRDSFZJREVPTU9ERSwgS0VZX0ZOX0Y4LAorCQlLRVlfRk5fRjksCUtFWV9GTl9GMTAsCUtFWV9GTl9GMTEsCUtFWV9TVVNQRU5ELAorCisJCS8qIFNjYW4gY29kZXMgMHgwQyB0byAweDFGOiBPdGhlciBBQ1BJIEhLRVkgaG90IGtleXMgKi8KKwkJS0VZX1VOS05PV04sCS8qIDB4MEM6IEZOK0JBQ0tTUEFDRSAqLworCQlLRVlfVU5LTk9XTiwJLyogMHgwRDogRk4rSU5TRVJUICovCisJCUtFWV9VTktOT1dOLAkvKiAweDBFOiBGTitERUxFVEUgKi8KKworCQkvKiBUaGVzZSBlaXRoZXIgaGF2ZSB0byBnbyB0aHJvdWdoIEFDUEkgdmlkZW8sIG9yCisJCSAqIGFjdCBsaWtlIGluIHRoZSBJQk0gVGhpbmtQYWRzLCBzbyBkb24ndCBldmVyCisJCSAqIGVuYWJsZSB0aGVtIGJ5IGRlZmF1bHQgKi8KKwkJS0VZX1JFU0VSVkVELAkvKiAweDBGOiBGTitIT01FIChicmlnaHRuZXNzIHVwKSAqLworCQlLRVlfUkVTRVJWRUQsCS8qIDB4MTA6IEZOK0VORCAoYnJpZ2h0bmVzcyBkb3duKSAqLworCisJCUtFWV9SRVNFUlZFRCwJLyogMHgxMTogRk4rUEdVUCAodGhpbmtsaWdodCB0b2dnbGUpICovCisKKwkJS0VZX1VOS05PV04sCS8qIDB4MTI6IEZOK1BHRE9XTiAqLworCQlLRVlfWk9PTSwJLyogMHgxMzogRk4rU1BBQ0UgKHpvb20pICovCisKKwkJLyogVm9sdW1lOiB6NjAvejYxLCBUNjAgKEJJT1MgdmVyc2lvbj8pOiBmaXJtd2FyZSBhbHdheXMKKwkJICogcmVhY3QgdG8gaXQgYW5kIHJlcHJvZ3JhbXMgdGhlIGJ1aWx0LWluICpleHRyYSogbWl4ZXIuCisJCSAqIE5ldmVyIG1hcCBpdCB0byBjb250cm9sIGFub3RoZXIgbWl4ZXIgYnkgZGVmYXVsdC4KKwkJICoKKwkJICogVDYwPywgVDYxLCBSNjA/LCBSNjE6IGZpcm13YXJlIGFuZCBFQyB0cmllcyB0byBzZW5kCisJCSAqIHRoZXNlIG92ZXIgdGhlIHJlZ3VsYXIga2V5Ym9hcmQsIHNvIHRoZXNlIGFyZSBuby1vcHMsCisJCSAqIGJ1dCB0aGVyZSBhcmUgc3RpbGwgd2VpcmQgYnVncyByZS4gTVVURSwgc28gZG8gbm90CisJCSAqIGNoYW5nZSB1bmxlc3MgeW91IGdldCB0ZXN0IHJlcG9ydHMgZnJvbSBhbGwgTGVub3ZvCisJCSAqIG1vZGVscy4gIE1heSBjYXVzZSB0aGUgQklPUyB0byBpbnRlcmZlcmUgd2l0aCB0aGUKKwkJICogSERBIG1peGVyLgorCQkgKi8KKwkJS0VZX1JFU0VSVkVELAkvKiAweDE0OiBWT0xVTUUgVVAgKi8KKwkJS0VZX1JFU0VSVkVELAkvKiAweDE1OiBWT0xVTUUgRE9XTiAqLworCQlLRVlfUkVTRVJWRUQsCS8qIDB4MTY6IE1VVEUgKi8KKworCQlLRVlfVkVORE9SLAkvKiAweDE3OiBUaGlua3BhZC9BY2Nlc3NJQk0vTGVub3ZvICovCisKKwkJLyogKGFzc2lnbm1lbnRzIHVua25vd24sIHBsZWFzZSByZXBvcnQgaWYgZm91bmQpICovCisJCUtFWV9VTktOT1dOLCBLRVlfVU5LTk9XTiwgS0VZX1VOS05PV04sIEtFWV9VTktOT1dOLAorCQlLRVlfVU5LTk9XTiwgS0VZX1VOS05PV04sIEtFWV9VTktOT1dOLCBLRVlfVU5LTk9XTiwKKwl9OworCisjZGVmaW5lIFRQQUNQSV9IT1RLRVlfTUFQX0xFTgkJQVJSQVlfU0laRShpYm1fa2V5Y29kZV9tYXApCisjZGVmaW5lIFRQQUNQSV9IT1RLRVlfTUFQX1NJWkUJCXNpemVvZihpYm1fa2V5Y29kZV9tYXApCisjZGVmaW5lIFRQQUNQSV9IT1RLRVlfTUFQX1RZUEVTSVpFCXNpemVvZihpYm1fa2V5Y29kZV9tYXBbMF0pCisKKwlpbnQgcmVzLCBpOworCWludCBzdGF0dXM7CisJaW50IGhrZXl2OworCisJdmRiZ19wcmludGsoVFBBQ1BJX0RCR19JTklULCAiaW5pdGlhbGl6aW5nIGhvdGtleSBzdWJkcml2ZXJcbiIpOworCisJQlVHX09OKCF0cGFjcGlfaW5wdXRkZXYpOworCUJVR19PTih0cGFjcGlfaW5wdXRkZXYtPm9wZW4gIT0gTlVMTCB8fAorCSAgICAgICB0cGFjcGlfaW5wdXRkZXYtPmNsb3NlICE9IE5VTEwpOworCisJVFBBQ1BJX0FDUElIQU5ETEVfSU5JVChoa2V5KTsKKwltdXRleF9pbml0KCZob3RrZXlfbXV0ZXgpOworCisjaWZkZWYgQ09ORklHX1RISU5LUEFEX0FDUElfSE9US0VZX1BPTEwKKwltdXRleF9pbml0KCZob3RrZXlfdGhyZWFkX211dGV4KTsKKwltdXRleF9pbml0KCZob3RrZXlfdGhyZWFkX2RhdGFfbXV0ZXgpOworI2VuZGlmCisKKwkvKiBob3RrZXkgbm90IHN1cHBvcnRlZCBvbiA1NzAgKi8KKwl0cF9mZWF0dXJlcy5ob3RrZXkgPSBoa2V5X2hhbmRsZSAhPSBOVUxMOworCisJdmRiZ19wcmludGsoVFBBQ1BJX0RCR19JTklULCAiaG90a2V5cyBhcmUgJXNcbiIsCisJCXN0cl9zdXBwb3J0ZWQodHBfZmVhdHVyZXMuaG90a2V5KSk7CisKKwlpZiAoIXRwX2ZlYXR1cmVzLmhvdGtleSkKKwkJcmV0dXJuIDE7CisKKwl0cGFjcGlfZGlzYWJsZV9icmlnaHRuZXNzX2RlbGF5KCk7CisKKwlob3RrZXlfZGV2X2F0dHJpYnV0ZXMgPSBjcmVhdGVfYXR0cl9zZXQoMTMsIE5VTEwpOworCWlmICghaG90a2V5X2Rldl9hdHRyaWJ1dGVzKQorCQlyZXR1cm4gLUVOT01FTTsKKwlyZXMgPSBhZGRfbWFueV90b19hdHRyX3NldChob3RrZXlfZGV2X2F0dHJpYnV0ZXMsCisJCQlob3RrZXlfYXR0cmlidXRlcywKKwkJCUFSUkFZX1NJWkUoaG90a2V5X2F0dHJpYnV0ZXMpKTsKKwlpZiAocmVzKQorCQlnb3RvIGVycl9leGl0OworCisJLyogbWFzayBub3Qgc3VwcG9ydGVkIG9uIDU3MCwgNjAwZS94LCA3NzBlLCA3NzB4LCBBMjFlLCBBMnhtL3AsCisJICAgQTMwLCBSMzAsIFIzMSwgVDIwLTIyLCBYMjAtMjEsIFgyMi0yNC4gIERldGVjdGVkIGJ5IGNoZWNraW5nCisJICAgZm9yIEhLRVkgaW50ZXJmYWNlIHZlcnNpb24gMHgxMDAgKi8KKwlpZiAoYWNwaV9ldmFsZihoa2V5X2hhbmRsZSwgJmhrZXl2LCAiTUhLViIsICJxZCIpKSB7CisJCWlmICgoaGtleXYgPj4gOCkgIT0gMSkgeworCQkJcHJpbnRrKFRQQUNQSV9FUlIgInVua25vd24gdmVyc2lvbiBvZiB0aGUgIgorCQkJICAgICAgICJIS0VZIGludGVyZmFjZTogMHgleFxuIiwgaGtleXYpOworCQkJcHJpbnRrKFRQQUNQSV9FUlIgInBsZWFzZSByZXBvcnQgdGhpcyB0byAlc1xuIiwKKwkJCSAgICAgICBUUEFDUElfTUFJTCk7CisJCX0gZWxzZSB7CisJCQkvKgorCQkJICogTUhLViAweDEwMCBpbiBBMzEsIFI0MCwgUjQwZSwKKwkJCSAqIFQ0eCwgWDMxLCBhbmQgbGF0ZXIKKwkJCSAqLworCQkJdHBfZmVhdHVyZXMuaG90a2V5X21hc2sgPSAxOworCQl9CisJfQorCisJdmRiZ19wcmludGsoVFBBQ1BJX0RCR19JTklULCAiaG90a2V5IG1hc2tzIGFyZSAlc1xuIiwKKwkJc3RyX3N1cHBvcnRlZCh0cF9mZWF0dXJlcy5ob3RrZXlfbWFzaykpOworCisJaWYgKHRwX2ZlYXR1cmVzLmhvdGtleV9tYXNrKSB7CisJCWlmICghYWNwaV9ldmFsZihoa2V5X2hhbmRsZSwgJmhvdGtleV9hbGxfbWFzaywKKwkJCQkiTUhLQSIsICJxZCIpKSB7CisJCQlwcmludGsoVFBBQ1BJX0VSUgorCQkJICAgICAgICJtaXNzaW5nIE1IS0EgaGFuZGxlciwgIgorCQkJICAgICAgICJwbGVhc2UgcmVwb3J0IHRoaXMgdG8gJXNcbiIsCisJCQkgICAgICAgVFBBQ1BJX01BSUwpOworCQkJLyogRk4rRjEyLCBGTitGNCwgRk4rRjMgKi8KKwkJCWhvdGtleV9hbGxfbWFzayA9IDB4MDgwY1U7CisJCX0KKwl9CisKKwkvKiBob3RrZXlfc291cmNlX21hc2sgKm11c3QqIGJlIHplcm8gZm9yCisJICogdGhlIGZpcnN0IGhvdGtleV9tYXNrX2dldCAqLworCXJlcyA9IGhvdGtleV9zdGF0dXNfZ2V0KCZob3RrZXlfb3JpZ19zdGF0dXMpOworCWlmIChyZXMpCisJCWdvdG8gZXJyX2V4aXQ7CisKKwlpZiAodHBfZmVhdHVyZXMuaG90a2V5X21hc2spIHsKKwkJcmVzID0gaG90a2V5X21hc2tfZ2V0KCk7CisJCWlmIChyZXMpCisJCQlnb3RvIGVycl9leGl0OworCisJCWhvdGtleV9vcmlnX21hc2sgPSBob3RrZXlfbWFzazsKKwkJcmVzID0gYWRkX21hbnlfdG9fYXR0cl9zZXQoCisJCQkJaG90a2V5X2Rldl9hdHRyaWJ1dGVzLAorCQkJCWhvdGtleV9tYXNrX2F0dHJpYnV0ZXMsCisJCQkJQVJSQVlfU0laRShob3RrZXlfbWFza19hdHRyaWJ1dGVzKSk7CisJCWlmIChyZXMpCisJCQlnb3RvIGVycl9leGl0OworCX0KKworI2lmZGVmIENPTkZJR19USElOS1BBRF9BQ1BJX0hPVEtFWV9QT0xMCisJaWYgKHRwX2ZlYXR1cmVzLmhvdGtleV9tYXNrKSB7CisJCWhvdGtleV9zb3VyY2VfbWFzayA9IFRQQUNQSV9IS0VZX05WUkFNX0dPT0RfTUFTSworCQkJCQkmIH5ob3RrZXlfYWxsX21hc2s7CisJfSBlbHNlIHsKKwkJaG90a2V5X3NvdXJjZV9tYXNrID0gVFBBQ1BJX0hLRVlfTlZSQU1fR09PRF9NQVNLOworCX0KKworCXZkYmdfcHJpbnRrKFRQQUNQSV9EQkdfSU5JVCwKKwkJICAgICJob3RrZXkgc291cmNlIG1hc2sgMHglMDh4LCBwb2xsaW5nIGZyZXEgJWRcbiIsCisJCSAgICBob3RrZXlfc291cmNlX21hc2ssIGhvdGtleV9wb2xsX2ZyZXEpOworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfVEhJTktQQURfQUNQSV9ERUJVR0ZBQ0lMSVRJRVMKKwlpZiAoZGJnX3dsc3dlbXVsKSB7CisJCXRwX2ZlYXR1cmVzLmhvdGtleV93bHN3ID0gMTsKKwkJcHJpbnRrKFRQQUNQSV9JTkZPCisJCQkicmFkaW8gc3dpdGNoIGVtdWxhdGlvbiBlbmFibGVkXG4iKTsKKwl9IGVsc2UKKyNlbmRpZgorCS8qIE5vdCBhbGwgdGhpbmtwYWRzIGhhdmUgYSBoYXJkd2FyZSByYWRpbyBzd2l0Y2ggKi8KKwlpZiAoYWNwaV9ldmFsZihoa2V5X2hhbmRsZSwgJnN0YXR1cywgIldMU1ciLCAicWQiKSkgeworCQl0cF9mZWF0dXJlcy5ob3RrZXlfd2xzdyA9IDE7CisJCXByaW50ayhUUEFDUElfSU5GTworCQkJInJhZGlvIHN3aXRjaCBmb3VuZDsgcmFkaW9zIGFyZSAlc1xuIiwKKwkJCWVuYWJsZWQoc3RhdHVzLCAwKSk7CisJfQorCWlmICh0cF9mZWF0dXJlcy5ob3RrZXlfd2xzdykKKwkJcmVzID0gYWRkX3RvX2F0dHJfc2V0KGhvdGtleV9kZXZfYXR0cmlidXRlcywKKwkJCQkmZGV2X2F0dHJfaG90a2V5X3JhZGlvX3N3LmF0dHIpOworCisJLyogRm9yIFg0MXQsIFg2MHQsIFg2MXQgVGFibGV0cy4uLiAqLworCWlmICghcmVzICYmIGFjcGlfZXZhbGYoaGtleV9oYW5kbGUsICZzdGF0dXMsICJNSEtHIiwgInFkIikpIHsKKwkJdHBfZmVhdHVyZXMuaG90a2V5X3RhYmxldCA9IDE7CisJCXByaW50ayhUUEFDUElfSU5GTworCQkJInBvc3NpYmxlIHRhYmxldCBtb2RlIHN3aXRjaCBmb3VuZDsgIgorCQkJIlRoaW5rUGFkIGluICVzIG1vZGVcbiIsCisJCQkoc3RhdHVzICYgVFBfSE9US0VZX1RBQkxFVF9NQVNLKT8KKwkJCQkidGFibGV0IiA6ICJsYXB0b3AiKTsKKwkJcmVzID0gYWRkX3RvX2F0dHJfc2V0KGhvdGtleV9kZXZfYXR0cmlidXRlcywKKwkJCQkmZGV2X2F0dHJfaG90a2V5X3RhYmxldF9tb2RlLmF0dHIpOworCX0KKworCWlmICghcmVzKQorCQlyZXMgPSByZWdpc3Rlcl9hdHRyX3NldF93aXRoX3N5c2ZzKAorCQkJCWhvdGtleV9kZXZfYXR0cmlidXRlcywKKwkJCQkmdHBhY3BpX3BkZXYtPmRldi5rb2JqKTsKKwlpZiAocmVzKQorCQlnb3RvIGVycl9leGl0OworCisJLyogU2V0IHVwIGtleSBtYXAgKi8KKworCWhvdGtleV9rZXljb2RlX21hcCA9IGttYWxsb2MoVFBBQ1BJX0hPVEtFWV9NQVBfU0laRSwKKwkJCQkJR0ZQX0tFUk5FTCk7CisJaWYgKCFob3RrZXlfa2V5Y29kZV9tYXApIHsKKwkJcHJpbnRrKFRQQUNQSV9FUlIKKwkJCSJmYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBrZXkgbWFwXG4iKTsKKwkJcmVzID0gLUVOT01FTTsKKwkJZ290byBlcnJfZXhpdDsKKwl9CisKKwlpZiAodGhpbmtwYWRfaWQudmVuZG9yID09IFBDSV9WRU5ET1JfSURfTEVOT1ZPKSB7CisJCWRiZ19wcmludGsoVFBBQ1BJX0RCR19JTklULAorCQkJICAgInVzaW5nIExlbm92byBkZWZhdWx0IGhvdCBrZXkgbWFwXG4iKTsKKwkJbWVtY3B5KGhvdGtleV9rZXljb2RlX21hcCwgJmxlbm92b19rZXljb2RlX21hcCwKKwkJCVRQQUNQSV9IT1RLRVlfTUFQX1NJWkUpOworCX0gZWxzZSB7CisJCWRiZ19wcmludGsoVFBBQ1BJX0RCR19JTklULAorCQkJICAgInVzaW5nIElCTSBkZWZhdWx0IGhvdCBrZXkgbWFwXG4iKTsKKwkJbWVtY3B5KGhvdGtleV9rZXljb2RlX21hcCwgJmlibV9rZXljb2RlX21hcCwKKwkJCVRQQUNQSV9IT1RLRVlfTUFQX1NJWkUpOworCX0KKworCXNldF9iaXQoRVZfS0VZLCB0cGFjcGlfaW5wdXRkZXYtPmV2Yml0KTsKKwlzZXRfYml0KEVWX01TQywgdHBhY3BpX2lucHV0ZGV2LT5ldmJpdCk7CisJc2V0X2JpdChNU0NfU0NBTiwgdHBhY3BpX2lucHV0ZGV2LT5tc2NiaXQpOworCXRwYWNwaV9pbnB1dGRldi0+a2V5Y29kZXNpemUgPSBUUEFDUElfSE9US0VZX01BUF9UWVBFU0laRTsKKwl0cGFjcGlfaW5wdXRkZXYtPmtleWNvZGVtYXggPSBUUEFDUElfSE9US0VZX01BUF9MRU47CisJdHBhY3BpX2lucHV0ZGV2LT5rZXljb2RlID0gaG90a2V5X2tleWNvZGVfbWFwOworCWZvciAoaSA9IDA7IGkgPCBUUEFDUElfSE9US0VZX01BUF9MRU47IGkrKykgeworCQlpZiAoaG90a2V5X2tleWNvZGVfbWFwW2ldICE9IEtFWV9SRVNFUlZFRCkgeworCQkJc2V0X2JpdChob3RrZXlfa2V5Y29kZV9tYXBbaV0sCisJCQkJdHBhY3BpX2lucHV0ZGV2LT5rZXliaXQpOworCQl9IGVsc2UgeworCQkJaWYgKGkgPCBzaXplb2YoaG90a2V5X3Jlc2VydmVkX21hc2spKjgpCisJCQkJaG90a2V5X3Jlc2VydmVkX21hc2sgfD0gMSA8PCBpOworCQl9CisJfQorCisJaWYgKHRwX2ZlYXR1cmVzLmhvdGtleV93bHN3KSB7CisJCXNldF9iaXQoRVZfU1csIHRwYWNwaV9pbnB1dGRldi0+ZXZiaXQpOworCQlzZXRfYml0KFNXX1JGS0lMTF9BTEwsIHRwYWNwaV9pbnB1dGRldi0+c3diaXQpOworCX0KKwlpZiAodHBfZmVhdHVyZXMuaG90a2V5X3RhYmxldCkgeworCQlzZXRfYml0KEVWX1NXLCB0cGFjcGlfaW5wdXRkZXYtPmV2Yml0KTsKKwkJc2V0X2JpdChTV19UQUJMRVRfTU9ERSwgdHBhY3BpX2lucHV0ZGV2LT5zd2JpdCk7CisJfQorCisJLyogRG8gbm90IGlzc3VlIGR1cGxpY2F0ZSBicmlnaHRuZXNzIGNoYW5nZSBldmVudHMgdG8KKwkgKiB1c2Vyc3BhY2UgKi8KKwlpZiAoIXRwX2ZlYXR1cmVzLmJyaWdodF9hY3BpbW9kZSkKKwkJLyogdXBkYXRlIGJyaWdodF9hY3BpbW9kZS4uLiAqLworCQl0cGFjcGlfY2hlY2tfc3RkX2FjcGlfYnJpZ2h0bmVzc19zdXBwb3J0KCk7CisKKwlpZiAodHBfZmVhdHVyZXMuYnJpZ2h0X2FjcGltb2RlKSB7CisJCXByaW50ayhUUEFDUElfSU5GTworCQkgICAgICAgIlRoaXMgVGhpbmtQYWQgaGFzIHN0YW5kYXJkIEFDUEkgYmFja2xpZ2h0ICIKKwkJICAgICAgICJicmlnaHRuZXNzIGNvbnRyb2wsIHN1cHBvcnRlZCBieSB0aGUgQUNQSSAiCisJCSAgICAgICAidmlkZW8gZHJpdmVyXG4iKTsKKwkJcHJpbnRrKFRQQUNQSV9OT1RJQ0UKKwkJICAgICAgICJEaXNhYmxpbmcgdGhpbmtwYWQtYWNwaSBicmlnaHRuZXNzIGV2ZW50cyAiCisJCSAgICAgICAiYnkgZGVmYXVsdC4uLlxuIik7CisKKwkJLyogVGhlIGhvdGtleV9yZXNlcnZlZF9tYXNrIGNoYW5nZSBiZWxvdyBpcyBub3QKKwkJICogbmVjZXNzYXJ5IHdoaWxlIHRoZSBrZXlzIGFyZSBhdCBLRVlfUkVTRVJWRUQgaW4gdGhlCisJCSAqIGRlZmF1bHQgbWFwLCBidXQgYmV0dGVyIHNhZmUgdGhhbiBzb3JyeSwgbGVhdmUgaXQKKwkJICogaGVyZSBhcyBhIG1hcmtlciBvZiB3aGF0IHdlIGhhdmUgdG8gZG8sIGVzcGVjaWFsbHkKKwkJICogd2hlbiB3ZSBmaW5hbGx5IGJlY29tZSBhYmxlIHRvIHNldCB0aGlzIGF0IHJ1bnRpbWUKKwkJICogb24gcmVzcG9uc2UgdG8gWC5vcmcgcmVxdWVzdHMgKi8KKwkJaG90a2V5X3Jlc2VydmVkX21hc2sgfD0KKwkJCSgxIDw8IFRQX0FDUElfSE9US0VZU0NBTl9GTkhPTUUpCisJCQl8ICgxIDw8IFRQX0FDUElfSE9US0VZU0NBTl9GTkVORCk7CisJfQorCisJZGJnX3ByaW50ayhUUEFDUElfREJHX0lOSVQsICJlbmFibGluZyBob3Qga2V5IGhhbmRsaW5nXG4iKTsKKwlyZXMgPSBob3RrZXlfc3RhdHVzX3NldCgxKTsKKwlpZiAocmVzKSB7CisJCWhvdGtleV9leGl0KCk7CisJCXJldHVybiByZXM7CisJfQorCXJlcyA9IGhvdGtleV9tYXNrX3NldCgoKGhvdGtleV9hbGxfbWFzayB8IGhvdGtleV9zb3VyY2VfbWFzaykKKwkJCQkmIH5ob3RrZXlfcmVzZXJ2ZWRfbWFzaykKKwkJCQl8IGhvdGtleV9vcmlnX21hc2spOworCWlmIChyZXMgPCAwICYmIHJlcyAhPSAtRU5YSU8pIHsKKwkJaG90a2V5X2V4aXQoKTsKKwkJcmV0dXJuIHJlczsKKwl9CisKKwlkYmdfcHJpbnRrKFRQQUNQSV9EQkdfSU5JVCwKKwkJCSJsZWdhY3kgaG90IGtleSByZXBvcnRpbmcgb3ZlciBwcm9jZnMgJXNcbiIsCisJCQkoaG90a2V5X3JlcG9ydF9tb2RlIDwgMikgPworCQkJCSJlbmFibGVkIiA6ICJkaXNhYmxlZCIpOworCisJdHBhY3BpX2lucHV0ZGV2LT5vcGVuID0gJmhvdGtleV9pbnB1dGRldl9vcGVuOworCXRwYWNwaV9pbnB1dGRldi0+Y2xvc2UgPSAmaG90a2V5X2lucHV0ZGV2X2Nsb3NlOworCisJaG90a2V5X3BvbGxfc2V0dXBfc2FmZSgxKTsKKwl0cGFjcGlfc2VuZF9yYWRpb3N3X3VwZGF0ZSgpOworCXRwYWNwaV9pbnB1dF9zZW5kX3RhYmxldHN3KCk7CisKKwlyZXR1cm4gMDsKKworZXJyX2V4aXQ6CisJZGVsZXRlX2F0dHJfc2V0KGhvdGtleV9kZXZfYXR0cmlidXRlcywgJnRwYWNwaV9wZGV2LT5kZXYua29iaik7CisJaG90a2V5X2Rldl9hdHRyaWJ1dGVzID0gTlVMTDsKKworCXJldHVybiAocmVzIDwgMCk/IHJlcyA6IDE7Cit9CisKK3N0YXRpYyBib29sIGhvdGtleV9ub3RpZnlfaG90a2V5KGNvbnN0IHUzMiBoa2V5LAorCQkJCSBib29sICpzZW5kX2FjcGlfZXYsCisJCQkJIGJvb2wgKmlnbm9yZV9hY3BpX2V2KQoreworCS8qIDB4MTAwMC0weDFGRkY6IGtleSBwcmVzc2VzICovCisJdW5zaWduZWQgaW50IHNjYW5jb2RlID0gaGtleSAmIDB4ZmZmOworCSpzZW5kX2FjcGlfZXYgPSB0cnVlOworCSppZ25vcmVfYWNwaV9ldiA9IGZhbHNlOworCisJaWYgKHNjYW5jb2RlID4gMCAmJiBzY2FuY29kZSA8IDB4MjEpIHsKKwkJc2NhbmNvZGUtLTsKKwkJaWYgKCEoaG90a2V5X3NvdXJjZV9tYXNrICYgKDEgPDwgc2NhbmNvZGUpKSkgeworCQkJdHBhY3BpX2lucHV0X3NlbmRfa2V5KHNjYW5jb2RlKTsKKwkJCSpzZW5kX2FjcGlfZXYgPSBmYWxzZTsKKwkJfSBlbHNlIHsKKwkJCSppZ25vcmVfYWNwaV9ldiA9IHRydWU7CisJCX0KKwkJcmV0dXJuIHRydWU7CisJfQorCXJldHVybiBmYWxzZTsKK30KKworc3RhdGljIGJvb2wgaG90a2V5X25vdGlmeV93YWtldXAoY29uc3QgdTMyIGhrZXksCisJCQkJIGJvb2wgKnNlbmRfYWNwaV9ldiwKKwkJCQkgYm9vbCAqaWdub3JlX2FjcGlfZXYpCit7CisJLyogMHgyMDAwLTB4MkZGRjogV2FrZXVwIHJlYXNvbiAqLworCSpzZW5kX2FjcGlfZXYgPSB0cnVlOworCSppZ25vcmVfYWNwaV9ldiA9IGZhbHNlOworCisJc3dpdGNoIChoa2V5KSB7CisJY2FzZSAweDIzMDQ6IC8qIHN1c3BlbmQsIHVuZG9jayAqLworCWNhc2UgMHgyNDA0OiAvKiBoaWJlcm5hdGlvbiwgdW5kb2NrICovCisJCWhvdGtleV93YWtldXBfcmVhc29uID0gVFBfQUNQSV9XQUtFVVBfVU5ET0NLOworCQkqaWdub3JlX2FjcGlfZXYgPSB0cnVlOworCQlicmVhazsKKworCWNhc2UgMHgyMzA1OiAvKiBzdXNwZW5kLCBiYXkgZWplY3QgKi8KKwljYXNlIDB4MjQwNTogLyogaGliZXJuYXRpb24sIGJheSBlamVjdCAqLworCQlob3RrZXlfd2FrZXVwX3JlYXNvbiA9IFRQX0FDUElfV0FLRVVQX0JBWUVKOworCQkqaWdub3JlX2FjcGlfZXYgPSB0cnVlOworCQlicmVhazsKKworCWNhc2UgMHgyMzEzOiAvKiBCYXR0ZXJ5IG9uIGNyaXRpY2FsIGxvdyBsZXZlbCAoUzMpICovCisJY2FzZSAweDI0MTM6IC8qIEJhdHRlcnkgb24gY3JpdGljYWwgbG93IGxldmVsIChTNCkgKi8KKwkJcHJpbnRrKFRQQUNQSV9BTEVSVAorCQkJIkVNRVJHRU5DWSBXQUtFVVA6IGJhdHRlcnkgYWxtb3N0IGVtcHR5XG4iKTsKKwkJLyogaG93IHRvIGF1dG8taGVhbDogKi8KKwkJLyogMjMxMzogd29rZSB1cCBmcm9tIFMzLCBnbyB0byBTNC9TNSAqLworCQkvKiAyNDEzOiB3b2tlIHVwIGZyb20gUzQsIGdvIHRvIFM1ICovCisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCWlmIChob3RrZXlfd2FrZXVwX3JlYXNvbiAhPSBUUF9BQ1BJX1dBS0VVUF9OT05FKSB7CisJCXByaW50ayhUUEFDUElfSU5GTworCQkgICAgICAgIndva2UgdXAgZHVlIHRvIGEgaG90LXVucGx1ZyAiCisJCSAgICAgICAicmVxdWVzdC4uLlxuIik7CisJCWhvdGtleV93YWtldXBfcmVhc29uX25vdGlmeV9jaGFuZ2UoKTsKKwl9CisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sIGhvdGtleV9ub3RpZnlfdXNyZXZlbnQoY29uc3QgdTMyIGhrZXksCisJCQkJIGJvb2wgKnNlbmRfYWNwaV9ldiwKKwkJCQkgYm9vbCAqaWdub3JlX2FjcGlfZXYpCit7CisJLyogMHg1MDAwLTB4NUZGRjogaHVtYW4gaW50ZXJmYWNlIGhlbHBlcnMgKi8KKwkqc2VuZF9hY3BpX2V2ID0gdHJ1ZTsKKwkqaWdub3JlX2FjcGlfZXYgPSBmYWxzZTsKKworCXN3aXRjaCAoaGtleSkgeworCWNhc2UgMHg1MDEwOiAvKiBMZW5vdm8gbmV3IEJJT1M6IGJyaWdodG5lc3MgY2hhbmdlZCAqLworCWNhc2UgMHg1MDBiOiAvKiBYNjF0OiB0YWJsZXQgcGVuIGluc2VydGVkIGludG8gYmF5ICovCisJY2FzZSAweDUwMGM6IC8qIFg2MXQ6IHRhYmxldCBwZW4gcmVtb3ZlZCBmcm9tIGJheSAqLworCQlyZXR1cm4gdHJ1ZTsKKworCWNhc2UgMHg1MDA5OiAvKiBYNDF0LVg2MXQ6IHN3aXZlbCB1cCAodGFibGV0IG1vZGUpICovCisJY2FzZSAweDUwMGE6IC8qIFg0MXQtWDYxdDogc3dpdmVsIGRvd24gKG5vcm1hbCBtb2RlKSAqLworCQl0cGFjcGlfaW5wdXRfc2VuZF90YWJsZXRzdygpOworCQlob3RrZXlfdGFibGV0X21vZGVfbm90aWZ5X2NoYW5nZSgpOworCQkqc2VuZF9hY3BpX2V2ID0gZmFsc2U7CisJCXJldHVybiB0cnVlOworCisJY2FzZSAweDUwMDE6CisJY2FzZSAweDUwMDI6CisJCS8qIExJRCBzd2l0Y2ggZXZlbnRzLiAgRG8gbm90IHByb3BhZ2F0ZSAqLworCQkqaWdub3JlX2FjcGlfZXYgPSB0cnVlOworCQlyZXR1cm4gdHJ1ZTsKKworCWRlZmF1bHQ6CisJCXJldHVybiBmYWxzZTsKKwl9Cit9CisKK3N0YXRpYyBib29sIGhvdGtleV9ub3RpZnlfdGhlcm1hbChjb25zdCB1MzIgaGtleSwKKwkJCQkgYm9vbCAqc2VuZF9hY3BpX2V2LAorCQkJCSBib29sICppZ25vcmVfYWNwaV9ldikKK3sKKwkvKiAweDYwMDAtMHg2RkZGOiB0aGVybWFsIGFsYXJtcyAqLworCSpzZW5kX2FjcGlfZXYgPSB0cnVlOworCSppZ25vcmVfYWNwaV9ldiA9IGZhbHNlOworCisJc3dpdGNoIChoa2V5KSB7CisJY2FzZSAweDYwMTE6CisJCXByaW50ayhUUEFDUElfQ1JJVAorCQkJIlRIRVJNQUwgQUxBUk06IGJhdHRlcnkgaXMgdG9vIGhvdCFcbiIpOworCQkvKiByZWNvbW1lbmRlZCBhY3Rpb246IHdhcm4gdXNlciB0aHJvdWdoIGd1aSAqLworCQlyZXR1cm4gdHJ1ZTsKKwljYXNlIDB4NjAxMjoKKwkJcHJpbnRrKFRQQUNQSV9BTEVSVAorCQkJIlRIRVJNQUwgRU1FUkdFTkNZOiBiYXR0ZXJ5IGlzIGV4dHJlbWVseSBob3QhXG4iKTsKKwkJLyogcmVjb21tZW5kZWQgYWN0aW9uOiBpbW1lZGlhdGUgc2xlZXAvaGliZXJuYXRlICovCisJCXJldHVybiB0cnVlOworCWNhc2UgMHg2MDIxOgorCQlwcmludGsoVFBBQ1BJX0NSSVQKKwkJCSJUSEVSTUFMIEFMQVJNOiAiCisJCQkiYSBzZW5zb3IgcmVwb3J0cyBzb21ldGhpbmcgaXMgdG9vIGhvdCFcbiIpOworCQkvKiByZWNvbW1lbmRlZCBhY3Rpb246IHdhcm4gdXNlciB0aHJvdWdoIGd1aSwgdGhhdCAqLworCQkvKiBzb21lIGludGVybmFsIGNvbXBvbmVudCBpcyB0b28gaG90ICovCisJCXJldHVybiB0cnVlOworCWNhc2UgMHg2MDIyOgorCQlwcmludGsoVFBBQ1BJX0FMRVJUCisJCQkiVEhFUk1BTCBFTUVSR0VOQ1k6ICIKKwkJCSJhIHNlbnNvciByZXBvcnRzIHNvbWV0aGluZyBpcyBleHRyZW1lbHkgaG90IVxuIik7CisJCS8qIHJlY29tbWVuZGVkIGFjdGlvbjogaW1tZWRpYXRlIHNsZWVwL2hpYmVybmF0ZSAqLworCQlyZXR1cm4gdHJ1ZTsKKwljYXNlIDB4NjAzMDoKKwkJcHJpbnRrKFRQQUNQSV9JTkZPCisJCQkiRUMgcmVwb3J0cyB0aGF0IFRoZXJtYWwgVGFibGUgaGFzIGNoYW5nZWRcbiIpOworCQkvKiByZWNvbW1lbmRlZCBhY3Rpb246IGRvIG5vdGhpbmcsIHdlIGRvbid0IGhhdmUKKwkJICogTGVub3ZvIEFUTSBpbmZvcm1hdGlvbiAqLworCQlyZXR1cm4gdHJ1ZTsKKwlkZWZhdWx0OgorCQlwcmludGsoVFBBQ1BJX0FMRVJUCisJCQkgIlRIRVJNQUwgQUxFUlQ6IHVua25vd24gdGhlcm1hbCBhbGFybSByZWNlaXZlZFxuIik7CisJCXJldHVybiBmYWxzZTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGhvdGtleV9ub3RpZnkoc3RydWN0IGlibV9zdHJ1Y3QgKmlibSwgdTMyIGV2ZW50KQoreworCXUzMiBoa2V5OworCWJvb2wgc2VuZF9hY3BpX2V2OworCWJvb2wgaWdub3JlX2FjcGlfZXY7CisJYm9vbCBrbm93bl9ldjsKKworCWlmIChldmVudCAhPSAweDgwKSB7CisJCXByaW50ayhUUEFDUElfRVJSCisJCSAgICAgICAidW5rbm93biBIS0VZIG5vdGlmaWNhdGlvbiBldmVudCAlZFxuIiwgZXZlbnQpOworCQkvKiBmb3J3YXJkIGl0IHRvIHVzZXJzcGFjZSwgbWF5YmUgaXQga25vd3MgaG93IHRvIGhhbmRsZSBpdCAqLworCQlhY3BpX2J1c19nZW5lcmF0ZV9uZXRsaW5rX2V2ZW50KAorCQkJCQlpYm0tPmFjcGktPmRldmljZS0+cG5wLmRldmljZV9jbGFzcywKKwkJCQkJZGV2X25hbWUoJmlibS0+YWNwaS0+ZGV2aWNlLT5kZXYpLAorCQkJCQlldmVudCwgMCk7CisJCXJldHVybjsKKwl9CisKKwl3aGlsZSAoMSkgeworCQlpZiAoIWFjcGlfZXZhbGYoaGtleV9oYW5kbGUsICZoa2V5LCAiTUhLUCIsICJkIikpIHsKKwkJCXByaW50ayhUUEFDUElfRVJSICJmYWlsZWQgdG8gcmV0cmlldmUgSEtFWSBldmVudFxuIik7CisJCQlyZXR1cm47CisJCX0KKworCQlpZiAoaGtleSA9PSAwKSB7CisJCQkvKiBxdWV1ZSBlbXB0eSAqLworCQkJcmV0dXJuOworCQl9CisKKwkJc2VuZF9hY3BpX2V2ID0gdHJ1ZTsKKwkJaWdub3JlX2FjcGlfZXYgPSBmYWxzZTsKKworCQlzd2l0Y2ggKGhrZXkgPj4gMTIpIHsKKwkJY2FzZSAxOgorCQkJLyogMHgxMDAwLTB4MUZGRjoga2V5IHByZXNzZXMgKi8KKwkJCWtub3duX2V2ID0gaG90a2V5X25vdGlmeV9ob3RrZXkoaGtleSwgJnNlbmRfYWNwaV9ldiwKKwkJCQkJCSAmaWdub3JlX2FjcGlfZXYpOworCQkJYnJlYWs7CisJCWNhc2UgMjoKKwkJCS8qIDB4MjAwMC0weDJGRkY6IFdha2V1cCByZWFzb24gKi8KKwkJCWtub3duX2V2ID0gaG90a2V5X25vdGlmeV93YWtldXAoaGtleSwgJnNlbmRfYWNwaV9ldiwKKwkJCQkJCSAmaWdub3JlX2FjcGlfZXYpOworCQkJYnJlYWs7CisJCWNhc2UgMzoKKwkJCS8qIDB4MzAwMC0weDNGRkY6IGJheS1yZWxhdGVkIHdha2V1cHMgKi8KKwkJCWlmIChoa2V5ID09IDB4MzAwMykgeworCQkJCWhvdGtleV9hdXRvc2xlZXBfYWNrID0gMTsKKwkJCQlwcmludGsoVFBBQ1BJX0lORk8KKwkJCQkgICAgICAgImJheSBlamVjdGVkXG4iKTsKKwkJCQlob3RrZXlfd2FrZXVwX2hvdHVucGx1Z19jb21wbGV0ZV9ub3RpZnlfY2hhbmdlKCk7CisJCQkJa25vd25fZXYgPSB0cnVlOworCQkJfSBlbHNlIHsKKwkJCQlrbm93bl9ldiA9IGZhbHNlOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgNDoKKwkJCS8qIDB4NDAwMC0weDRGRkY6IGRvY2stcmVsYXRlZCB3YWtldXBzICovCisJCQlpZiAoaGtleSA9PSAweDQwMDMpIHsKKwkJCQlob3RrZXlfYXV0b3NsZWVwX2FjayA9IDE7CisJCQkJcHJpbnRrKFRQQUNQSV9JTkZPCisJCQkJICAgICAgICJ1bmRvY2tlZFxuIik7CisJCQkJaG90a2V5X3dha2V1cF9ob3R1bnBsdWdfY29tcGxldGVfbm90aWZ5X2NoYW5nZSgpOworCQkJCWtub3duX2V2ID0gdHJ1ZTsKKwkJCX0gZWxzZSB7CisJCQkJa25vd25fZXYgPSBmYWxzZTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIDU6CisJCQkvKiAweDUwMDAtMHg1RkZGOiBodW1hbiBpbnRlcmZhY2UgaGVscGVycyAqLworCQkJa25vd25fZXYgPSBob3RrZXlfbm90aWZ5X3VzcmV2ZW50KGhrZXksICZzZW5kX2FjcGlfZXYsCisJCQkJCQkgJmlnbm9yZV9hY3BpX2V2KTsKKwkJCWJyZWFrOworCQljYXNlIDY6CisJCQkvKiAweDYwMDAtMHg2RkZGOiB0aGVybWFsIGFsYXJtcyAqLworCQkJa25vd25fZXYgPSBob3RrZXlfbm90aWZ5X3RoZXJtYWwoaGtleSwgJnNlbmRfYWNwaV9ldiwKKwkJCQkJCSAmaWdub3JlX2FjcGlfZXYpOworCQkJYnJlYWs7CisJCWNhc2UgNzoKKwkJCS8qIDB4NzAwMC0weDdGRkY6IG1pc2MgKi8KKwkJCWlmICh0cF9mZWF0dXJlcy5ob3RrZXlfd2xzdyAmJiBoa2V5ID09IDB4NzAwMCkgeworCQkJCXRwYWNwaV9zZW5kX3JhZGlvc3dfdXBkYXRlKCk7CisJCQkJc2VuZF9hY3BpX2V2ID0gMDsKKwkJCQlrbm93bl9ldiA9IHRydWU7CisJCQkJYnJlYWs7CisJCQl9CisJCQkvKiBmYWxsdGhyb3VnaCB0byBkZWZhdWx0ICovCisJCWRlZmF1bHQ6CisJCQlrbm93bl9ldiA9IGZhbHNlOworCQl9CisJCWlmICgha25vd25fZXYpIHsKKwkJCXByaW50ayhUUEFDUElfTk9USUNFCisJCQkgICAgICAgInVuaGFuZGxlZCBIS0VZIGV2ZW50IDB4JTA0eFxuIiwgaGtleSk7CisJCQlwcmludGsoVFBBQ1BJX05PVElDRQorCQkJICAgICAgICJwbGVhc2UgcmVwb3J0IHRoZSBjb25kaXRpb25zIHdoZW4gdGhpcyAiCisJCQkgICAgICAgImV2ZW50IGhhcHBlbmVkIHRvICVzXG4iLCBUUEFDUElfTUFJTCk7CisJCX0KKworCQkvKiBMZWdhY3kgZXZlbnRzICovCisJCWlmICghaWdub3JlX2FjcGlfZXYgJiYKKwkJICAgIChzZW5kX2FjcGlfZXYgfHwgaG90a2V5X3JlcG9ydF9tb2RlIDwgMikpIHsKKwkJCWFjcGlfYnVzX2dlbmVyYXRlX3Byb2NfZXZlbnQoaWJtLT5hY3BpLT5kZXZpY2UsCisJCQkJCQkgICAgIGV2ZW50LCBoa2V5KTsKKwkJfQorCisJCS8qIG5ldGxpbmsgZXZlbnRzICovCisJCWlmICghaWdub3JlX2FjcGlfZXYgJiYgc2VuZF9hY3BpX2V2KSB7CisJCQlhY3BpX2J1c19nZW5lcmF0ZV9uZXRsaW5rX2V2ZW50KAorCQkJCQlpYm0tPmFjcGktPmRldmljZS0+cG5wLmRldmljZV9jbGFzcywKKwkJCQkJZGV2X25hbWUoJmlibS0+YWNwaS0+ZGV2aWNlLT5kZXYpLAorCQkJCQlldmVudCwgaGtleSk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIGhvdGtleV9zdXNwZW5kKHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3sKKwkvKiBEbyB0aGVzZSBvbiBzdXNwZW5kLCB3ZSBnZXQgdGhlIGV2ZW50cyBvbiBlYXJseSByZXN1bWUhICovCisJaG90a2V5X3dha2V1cF9yZWFzb24gPSBUUF9BQ1BJX1dBS0VVUF9OT05FOworCWhvdGtleV9hdXRvc2xlZXBfYWNrID0gMDsKK30KKworc3RhdGljIHZvaWQgaG90a2V5X3Jlc3VtZSh2b2lkKQoreworCXRwYWNwaV9kaXNhYmxlX2JyaWdodG5lc3NfZGVsYXkoKTsKKworCWlmIChob3RrZXlfbWFza19nZXQoKSkKKwkJcHJpbnRrKFRQQUNQSV9FUlIKKwkJICAgICAgICJlcnJvciB3aGlsZSB0cnlpbmcgdG8gcmVhZCBob3Qga2V5IG1hc2sgIgorCQkgICAgICAgImZyb20gZmlybXdhcmVcbiIpOworCXRwYWNwaV9zZW5kX3JhZGlvc3dfdXBkYXRlKCk7CisJaG90a2V5X3RhYmxldF9tb2RlX25vdGlmeV9jaGFuZ2UoKTsKKwlob3RrZXlfd2FrZXVwX3JlYXNvbl9ub3RpZnlfY2hhbmdlKCk7CisJaG90a2V5X3dha2V1cF9ob3R1bnBsdWdfY29tcGxldGVfbm90aWZ5X2NoYW5nZSgpOworCWhvdGtleV9wb2xsX3NldHVwX3NhZmUoMCk7Cit9CisKKy8qIHByb2NmcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworc3RhdGljIGludCBob3RrZXlfcmVhZChjaGFyICpwKQoreworCWludCByZXMsIHN0YXR1czsKKwlpbnQgbGVuID0gMDsKKworCWlmICghdHBfZmVhdHVyZXMuaG90a2V5KSB7CisJCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICJzdGF0dXM6XHRcdG5vdCBzdXBwb3J0ZWRcbiIpOworCQlyZXR1cm4gbGVuOworCX0KKworCWlmIChtdXRleF9sb2NrX2tpbGxhYmxlKCZob3RrZXlfbXV0ZXgpKQorCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCXJlcyA9IGhvdGtleV9zdGF0dXNfZ2V0KCZzdGF0dXMpOworCWlmICghcmVzKQorCQlyZXMgPSBob3RrZXlfbWFza19nZXQoKTsKKwltdXRleF91bmxvY2soJmhvdGtleV9tdXRleCk7CisJaWYgKHJlcykKKwkJcmV0dXJuIHJlczsKKworCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICJzdGF0dXM6XHRcdCVzXG4iLCBlbmFibGVkKHN0YXR1cywgMCkpOworCWlmICh0cF9mZWF0dXJlcy5ob3RrZXlfbWFzaykgeworCQlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAibWFzazpcdFx0MHglMDh4XG4iLCBob3RrZXlfbWFzayk7CisJCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sCisJCQkgICAgICAgImNvbW1hbmRzOlx0ZW5hYmxlLCBkaXNhYmxlLCByZXNldCwgPG1hc2s+XG4iKTsKKwl9IGVsc2UgeworCQlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAibWFzazpcdFx0bm90IHN1cHBvcnRlZFxuIik7CisJCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICJjb21tYW5kczpcdGVuYWJsZSwgZGlzYWJsZSwgcmVzZXRcbiIpOworCX0KKworCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyBpbnQgaG90a2V5X3dyaXRlKGNoYXIgKmJ1ZikKK3sKKwlpbnQgcmVzLCBzdGF0dXM7CisJdTMyIG1hc2s7CisJY2hhciAqY21kOworCisJaWYgKCF0cF9mZWF0dXJlcy5ob3RrZXkpCisJCXJldHVybiAtRU5PREVWOworCisJaWYgKG11dGV4X2xvY2tfa2lsbGFibGUoJmhvdGtleV9tdXRleCkpCisJCXJldHVybiAtRVJFU1RBUlRTWVM7CisKKwlzdGF0dXMgPSAtMTsKKwltYXNrID0gaG90a2V5X21hc2s7CisKKwlyZXMgPSAwOworCXdoaWxlICgoY21kID0gbmV4dF9jbWQoJmJ1ZikpKSB7CisJCWlmIChzdHJsZW5jbXAoY21kLCAiZW5hYmxlIikgPT0gMCkgeworCQkJc3RhdHVzID0gMTsKKwkJfSBlbHNlIGlmIChzdHJsZW5jbXAoY21kLCAiZGlzYWJsZSIpID09IDApIHsKKwkJCXN0YXR1cyA9IDA7CisJCX0gZWxzZSBpZiAoc3RybGVuY21wKGNtZCwgInJlc2V0IikgPT0gMCkgeworCQkJc3RhdHVzID0gaG90a2V5X29yaWdfc3RhdHVzOworCQkJbWFzayA9IGhvdGtleV9vcmlnX21hc2s7CisJCX0gZWxzZSBpZiAoc3NjYW5mKGNtZCwgIjB4JXgiLCAmbWFzaykgPT0gMSkgeworCQkJLyogbWFzayBzZXQgKi8KKwkJfSBlbHNlIGlmIChzc2NhbmYoY21kLCAiJXgiLCAmbWFzaykgPT0gMSkgeworCQkJLyogbWFzayBzZXQgKi8KKwkJfSBlbHNlIHsKKwkJCXJlcyA9IC1FSU5WQUw7CisJCQlnb3RvIGVycmV4aXQ7CisJCX0KKwl9CisJaWYgKHN0YXR1cyAhPSAtMSkKKwkJcmVzID0gaG90a2V5X3N0YXR1c19zZXQoc3RhdHVzKTsKKworCWlmICghcmVzICYmIG1hc2sgIT0gaG90a2V5X21hc2spCisJCXJlcyA9IGhvdGtleV9tYXNrX3NldChtYXNrKTsKKworZXJyZXhpdDoKKwltdXRleF91bmxvY2soJmhvdGtleV9tdXRleCk7CisJcmV0dXJuIHJlczsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBhY3BpX2RldmljZV9pZCBpYm1faHRrX2RldmljZV9pZHNbXSA9IHsKKwl7VFBBQ1BJX0FDUElfSEtFWV9ISUQsIDB9LAorCXsiIiwgMH0sCit9OworCitzdGF0aWMgc3RydWN0IHRwX2FjcGlfZHJ2X3N0cnVjdCBpYm1faG90a2V5X2FjcGlkcml2ZXIgPSB7CisJLmhpZCA9IGlibV9odGtfZGV2aWNlX2lkcywKKwkubm90aWZ5ID0gaG90a2V5X25vdGlmeSwKKwkuaGFuZGxlID0gJmhrZXlfaGFuZGxlLAorCS50eXBlID0gQUNQSV9ERVZJQ0VfTk9USUZZLAorfTsKKworc3RhdGljIHN0cnVjdCBpYm1fc3RydWN0IGhvdGtleV9kcml2ZXJfZGF0YSA9IHsKKwkubmFtZSA9ICJob3RrZXkiLAorCS5yZWFkID0gaG90a2V5X3JlYWQsCisJLndyaXRlID0gaG90a2V5X3dyaXRlLAorCS5leGl0ID0gaG90a2V5X2V4aXQsCisJLnJlc3VtZSA9IGhvdGtleV9yZXN1bWUsCisJLnN1c3BlbmQgPSBob3RrZXlfc3VzcGVuZCwKKwkuYWNwaSA9ICZpYm1faG90a2V5X2FjcGlkcml2ZXIsCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQmx1ZXRvb3RoIHN1YmRyaXZlcgorICovCisKK2VudW0geworCS8qIEFDUEkgR0JEQy9TQkRDIGJpdHMgKi8KKwlUUF9BQ1BJX0JMVUVUT09USF9IV1BSRVNFTlQJPSAweDAxLAkvKiBCbHVldG9vdGggaHcgYXZhaWxhYmxlICovCisJVFBfQUNQSV9CTFVFVE9PVEhfUkFESU9TU1cJPSAweDAyLAkvKiBCbHVldG9vdGggcmFkaW8gZW5hYmxlZCAqLworCVRQX0FDUElfQkxVRVRPT1RIX1JFU1VNRUNUUkwJPSAweDA0LAkvKiBCbHVldG9vdGggc3RhdGUgYXQgcmVzdW1lOgorCQkJCQkJICAgb2ZmIC8gbGFzdCBzdGF0ZSAqLworfTsKKworZW51bSB7CisJLyogQUNQSSBcQkxUSCBjb21tYW5kcyAqLworCVRQX0FDUElfQkxUSF9HRVRfVUxUUkFQT1JUX0lECT0gMHgwMCwgLyogR2V0IFVsdHJhcG9ydCBCVCBJRCAqLworCVRQX0FDUElfQkxUSF9HRVRfUFdSX09OX1JFU1VNRQk9IDB4MDEsIC8qIEdldCBwb3dlci1vbi1yZXN1bWUgc3RhdGUgKi8KKwlUUF9BQ1BJX0JMVEhfUFdSX09OX09OX1JFU1VNRQk9IDB4MDIsIC8qIFJlc3VtZSBwb3dlcmVkIG9uICovCisJVFBfQUNQSV9CTFRIX1BXUl9PRkZfT05fUkVTVU1FCT0gMHgwMywJLyogUmVzdW1lIHBvd2VyZWQgb2ZmICovCisJVFBfQUNQSV9CTFRIX1NBVkVfU1RBVEUJCT0gMHgwNSwgLyogU2F2ZSBzdGF0ZSBmb3IgUzQvUzUgKi8KK307CisKK3N0YXRpYyBzdHJ1Y3QgcmZraWxsICp0cGFjcGlfYmx1ZXRvb3RoX3Jma2lsbDsKKworc3RhdGljIHZvaWQgYmx1ZXRvb3RoX3N1c3BlbmQocG1fbWVzc2FnZV90IHN0YXRlKQoreworCS8qIFRyeSB0byBtYWtlIHN1cmUgcmFkaW8gd2lsbCByZXN1bWUgcG93ZXJlZCBvZmYgKi8KKwlhY3BpX2V2YWxmKE5VTEwsIE5VTEwsICJcXEJMVEgiLCAidmQiLAorCQkgICBUUF9BQ1BJX0JMVEhfUFdSX09GRl9PTl9SRVNVTUUpOworfQorCitzdGF0aWMgaW50IGJsdWV0b290aF9nZXRfcmFkaW9zdyh2b2lkKQoreworCWludCBzdGF0dXM7CisKKwlpZiAoIXRwX2ZlYXR1cmVzLmJsdWV0b290aCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwkvKiBXTFNXIG92ZXJyaWRlcyBibHVldG9vdGggaW4gZmlybXdhcmUvaGFyZHdhcmUsIHJlZmxlY3QgdGhhdCAqLworCWlmICh0cF9mZWF0dXJlcy5ob3RrZXlfd2xzdyAmJiAhaG90a2V5X2dldF93bHN3KCZzdGF0dXMpICYmICFzdGF0dXMpCisJCXJldHVybiBSRktJTExfU1RBVEVfSEFSRF9CTE9DS0VEOworCisjaWZkZWYgQ09ORklHX1RISU5LUEFEX0FDUElfREVCVUdGQUNJTElUSUVTCisJaWYgKGRiZ19ibHVldG9vdGhlbXVsKQorCQlyZXR1cm4gKHRwYWNwaV9ibHVldG9vdGhfZW11bHN0YXRlKSA/CisJCQlSRktJTExfU1RBVEVfVU5CTE9DS0VEIDogUkZLSUxMX1NUQVRFX1NPRlRfQkxPQ0tFRDsKKyNlbmRpZgorCisJaWYgKCFhY3BpX2V2YWxmKGhrZXlfaGFuZGxlLCAmc3RhdHVzLCAiR0JEQyIsICJkIikpCisJCXJldHVybiAtRUlPOworCisJcmV0dXJuICgoc3RhdHVzICYgVFBfQUNQSV9CTFVFVE9PVEhfUkFESU9TU1cpICE9IDApID8KKwkJUkZLSUxMX1NUQVRFX1VOQkxPQ0tFRCA6IFJGS0lMTF9TVEFURV9TT0ZUX0JMT0NLRUQ7Cit9CisKK3N0YXRpYyB2b2lkIGJsdWV0b290aF91cGRhdGVfcmZrKHZvaWQpCit7CisJaW50IHN0YXR1czsKKworCWlmICghdHBhY3BpX2JsdWV0b290aF9yZmtpbGwpCisJCXJldHVybjsKKworCXN0YXR1cyA9IGJsdWV0b290aF9nZXRfcmFkaW9zdygpOworCWlmIChzdGF0dXMgPCAwKQorCQlyZXR1cm47CisJcmZraWxsX2ZvcmNlX3N0YXRlKHRwYWNwaV9ibHVldG9vdGhfcmZraWxsLCBzdGF0dXMpOworfQorCitzdGF0aWMgaW50IGJsdWV0b290aF9zZXRfcmFkaW9zdyhpbnQgcmFkaW9fb24sIGludCB1cGRhdGVfcmZrKQoreworCWludCBzdGF0dXM7CisKKwlpZiAoIXRwX2ZlYXR1cmVzLmJsdWV0b290aCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwkvKiBXTFNXIG92ZXJyaWRlcyBibHVldG9vdGggaW4gZmlybXdhcmUvaGFyZHdhcmUsIGJ1dCB0aGVyZSBpcyBubworCSAqIHJlYXNvbiB0byByaXNrIHdlaXJkIGJlaGF2aW91ci4gKi8KKwlpZiAodHBfZmVhdHVyZXMuaG90a2V5X3dsc3cgJiYgIWhvdGtleV9nZXRfd2xzdygmc3RhdHVzKSAmJiAhc3RhdHVzCisJICAgICYmIHJhZGlvX29uKQorCQlyZXR1cm4gLUVQRVJNOworCisjaWZkZWYgQ09ORklHX1RISU5LUEFEX0FDUElfREVCVUdGQUNJTElUSUVTCisJaWYgKGRiZ19ibHVldG9vdGhlbXVsKSB7CisJCXRwYWNwaV9ibHVldG9vdGhfZW11bHN0YXRlID0gISFyYWRpb19vbjsKKwkJaWYgKHVwZGF0ZV9yZmspCisJCQlibHVldG9vdGhfdXBkYXRlX3JmaygpOworCQlyZXR1cm4gMDsKKwl9CisjZW5kaWYKKworCS8qIFdlIG1ha2Ugc3VyZSB0byBrZWVwIFRQX0FDUElfQkxVRVRPT1RIX1JFU1VNRUNUUkwgb2ZmICovCisJaWYgKHJhZGlvX29uKQorCQlzdGF0dXMgPSBUUF9BQ1BJX0JMVUVUT09USF9SQURJT1NTVzsKKwllbHNlCisJCXN0YXR1cyA9IDA7CisJaWYgKCFhY3BpX2V2YWxmKGhrZXlfaGFuZGxlLCBOVUxMLCAiU0JEQyIsICJ2ZCIsIHN0YXR1cykpCisJCXJldHVybiAtRUlPOworCisJaWYgKHVwZGF0ZV9yZmspCisJCWJsdWV0b290aF91cGRhdGVfcmZrKCk7CisKKwlyZXR1cm4gMDsKK30KKworLyogc3lzZnMgYmx1ZXRvb3RoIGVuYWJsZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitzdGF0aWMgc3NpemVfdCBibHVldG9vdGhfZW5hYmxlX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAorCQkJICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICBjaGFyICpidWYpCit7CisJaW50IHN0YXR1czsKKworCXN0YXR1cyA9IGJsdWV0b290aF9nZXRfcmFkaW9zdygpOworCWlmIChzdGF0dXMgPCAwKQorCQlyZXR1cm4gc3RhdHVzOworCisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWRcbiIsCisJCQkoc3RhdHVzID09IFJGS0lMTF9TVEFURV9VTkJMT0NLRUQpID8gMSA6IDApOworfQorCitzdGF0aWMgc3NpemVfdCBibHVldG9vdGhfZW5hYmxlX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCSAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwl1bnNpZ25lZCBsb25nIHQ7CisJaW50IHJlczsKKworCWlmIChwYXJzZV9zdHJ0b3VsKGJ1ZiwgMSwgJnQpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJlcyA9IGJsdWV0b290aF9zZXRfcmFkaW9zdyh0LCAxKTsKKworCXJldHVybiAocmVzKSA/IHJlcyA6IGNvdW50OworfQorCitzdGF0aWMgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgZGV2X2F0dHJfYmx1ZXRvb3RoX2VuYWJsZSA9CisJX19BVFRSKGJsdWV0b290aF9lbmFibGUsIFNfSVdVU1IgfCBTX0lSVUdPLAorCQlibHVldG9vdGhfZW5hYmxlX3Nob3csIGJsdWV0b290aF9lbmFibGVfc3RvcmUpOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmJsdWV0b290aF9hdHRyaWJ1dGVzW10gPSB7CisJJmRldl9hdHRyX2JsdWV0b290aF9lbmFibGUuYXR0ciwKKwlOVUxMCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBibHVldG9vdGhfYXR0cl9ncm91cCA9IHsKKwkuYXR0cnMgPSBibHVldG9vdGhfYXR0cmlidXRlcywKK307CisKK3N0YXRpYyBpbnQgdHBhY3BpX2JsdWV0b290aF9yZmtfZ2V0KHZvaWQgKmRhdGEsIGVudW0gcmZraWxsX3N0YXRlICpzdGF0ZSkKK3sKKwlpbnQgYnRzID0gYmx1ZXRvb3RoX2dldF9yYWRpb3N3KCk7CisKKwlpZiAoYnRzIDwgMCkKKwkJcmV0dXJuIGJ0czsKKworCSpzdGF0ZSA9IGJ0czsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0cGFjcGlfYmx1ZXRvb3RoX3Jma19zZXQodm9pZCAqZGF0YSwgZW51bSByZmtpbGxfc3RhdGUgc3RhdGUpCit7CisJcmV0dXJuIGJsdWV0b290aF9zZXRfcmFkaW9zdygoc3RhdGUgPT0gUkZLSUxMX1NUQVRFX1VOQkxPQ0tFRCksIDApOworfQorCitzdGF0aWMgdm9pZCBibHVldG9vdGhfc2h1dGRvd24odm9pZCkKK3sKKwkvKiBPcmRlciBmaXJtd2FyZSB0byBzYXZlIGN1cnJlbnQgc3RhdGUgdG8gTlZSQU0gKi8KKwlpZiAoIWFjcGlfZXZhbGYoTlVMTCwgTlVMTCwgIlxcQkxUSCIsICJ2ZCIsCisJCQlUUF9BQ1BJX0JMVEhfU0FWRV9TVEFURSkpCisJCXByaW50ayhUUEFDUElfTk9USUNFCisJCQkiZmFpbGVkIHRvIHNhdmUgYmx1ZXRvb3RoIHN0YXRlIHRvIE5WUkFNXG4iKTsKK30KKworc3RhdGljIHZvaWQgYmx1ZXRvb3RoX2V4aXQodm9pZCkKK3sKKwlibHVldG9vdGhfc2h1dGRvd24oKTsKKworCWlmICh0cGFjcGlfYmx1ZXRvb3RoX3Jma2lsbCkKKwkJcmZraWxsX3VucmVnaXN0ZXIodHBhY3BpX2JsdWV0b290aF9yZmtpbGwpOworCisJc3lzZnNfcmVtb3ZlX2dyb3VwKCZ0cGFjcGlfcGRldi0+ZGV2LmtvYmosCisJCQkmYmx1ZXRvb3RoX2F0dHJfZ3JvdXApOworfQorCitzdGF0aWMgaW50IF9faW5pdCBibHVldG9vdGhfaW5pdChzdHJ1Y3QgaWJtX2luaXRfc3RydWN0ICppaWJtKQoreworCWludCByZXM7CisJaW50IHN0YXR1cyA9IDA7CisKKwl2ZGJnX3ByaW50ayhUUEFDUElfREJHX0lOSVQsICJpbml0aWFsaXppbmcgYmx1ZXRvb3RoIHN1YmRyaXZlclxuIik7CisKKwlUUEFDUElfQUNQSUhBTkRMRV9JTklUKGhrZXkpOworCisJLyogYmx1ZXRvb3RoIG5vdCBzdXBwb3J0ZWQgb24gNTcwLCA2MDBlL3gsIDc3MGUsIDc3MHgsIEEyMWUsIEEyeG0vcCwKKwkgICBHNHgsIFIzMCwgUjMxLCBSNDBlLCBSNTBlLCBUMjAtMjIsIFgyMC0yMSAqLworCXRwX2ZlYXR1cmVzLmJsdWV0b290aCA9IGhrZXlfaGFuZGxlICYmCisJICAgIGFjcGlfZXZhbGYoaGtleV9oYW5kbGUsICZzdGF0dXMsICJHQkRDIiwgInFkIik7CisKKwl2ZGJnX3ByaW50ayhUUEFDUElfREJHX0lOSVQsICJibHVldG9vdGggaXMgJXMsIHN0YXR1cyAweCUwMnhcbiIsCisJCXN0cl9zdXBwb3J0ZWQodHBfZmVhdHVyZXMuYmx1ZXRvb3RoKSwKKwkJc3RhdHVzKTsKKworI2lmZGVmIENPTkZJR19USElOS1BBRF9BQ1BJX0RFQlVHRkFDSUxJVElFUworCWlmIChkYmdfYmx1ZXRvb3RoZW11bCkgeworCQl0cF9mZWF0dXJlcy5ibHVldG9vdGggPSAxOworCQlwcmludGsoVFBBQ1BJX0lORk8KKwkJCSJibHVldG9vdGggc3dpdGNoIGVtdWxhdGlvbiBlbmFibGVkXG4iKTsKKwl9IGVsc2UKKyNlbmRpZgorCWlmICh0cF9mZWF0dXJlcy5ibHVldG9vdGggJiYKKwkgICAgIShzdGF0dXMgJiBUUF9BQ1BJX0JMVUVUT09USF9IV1BSRVNFTlQpKSB7CisJCS8qIG5vIGJsdWV0b290aCBoYXJkd2FyZSBwcmVzZW50IGluIHN5c3RlbSAqLworCQl0cF9mZWF0dXJlcy5ibHVldG9vdGggPSAwOworCQlkYmdfcHJpbnRrKFRQQUNQSV9EQkdfSU5JVCwKKwkJCSAgICJibHVldG9vdGggaGFyZHdhcmUgbm90IGluc3RhbGxlZFxuIik7CisJfQorCisJaWYgKCF0cF9mZWF0dXJlcy5ibHVldG9vdGgpCisJCXJldHVybiAxOworCisJcmVzID0gc3lzZnNfY3JlYXRlX2dyb3VwKCZ0cGFjcGlfcGRldi0+ZGV2LmtvYmosCisJCQkJJmJsdWV0b290aF9hdHRyX2dyb3VwKTsKKwlpZiAocmVzKQorCQlyZXR1cm4gcmVzOworCisJcmVzID0gdHBhY3BpX25ld19yZmtpbGwoVFBBQ1BJX1JGS19CTFVFVE9PVEhfU1dfSUQsCisJCQkJJnRwYWNwaV9ibHVldG9vdGhfcmZraWxsLAorCQkJCVJGS0lMTF9UWVBFX0JMVUVUT09USCwKKwkJCQkidHBhY3BpX2JsdWV0b290aF9zdyIsCisJCQkJdHJ1ZSwKKwkJCQl0cGFjcGlfYmx1ZXRvb3RoX3Jma19zZXQsCisJCQkJdHBhY3BpX2JsdWV0b290aF9yZmtfZ2V0KTsKKwlpZiAocmVzKSB7CisJCWJsdWV0b290aF9leGl0KCk7CisJCXJldHVybiByZXM7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIHByb2NmcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworc3RhdGljIGludCBibHVldG9vdGhfcmVhZChjaGFyICpwKQoreworCWludCBsZW4gPSAwOworCWludCBzdGF0dXMgPSBibHVldG9vdGhfZ2V0X3JhZGlvc3coKTsKKworCWlmICghdHBfZmVhdHVyZXMuYmx1ZXRvb3RoKQorCQlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAic3RhdHVzOlx0XHRub3Qgc3VwcG9ydGVkXG4iKTsKKwllbHNlIHsKKwkJbGVuICs9IHNwcmludGYocCArIGxlbiwgInN0YXR1czpcdFx0JXNcbiIsCisJCQkJKHN0YXR1cyA9PSBSRktJTExfU1RBVEVfVU5CTE9DS0VEKSA/CisJCQkJCSJlbmFibGVkIiA6ICJkaXNhYmxlZCIpOworCQlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAiY29tbWFuZHM6XHRlbmFibGUsIGRpc2FibGVcbiIpOworCX0KKworCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyBpbnQgYmx1ZXRvb3RoX3dyaXRlKGNoYXIgKmJ1ZikKK3sKKwljaGFyICpjbWQ7CisKKwlpZiAoIXRwX2ZlYXR1cmVzLmJsdWV0b290aCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwl3aGlsZSAoKGNtZCA9IG5leHRfY21kKCZidWYpKSkgeworCQlpZiAoc3RybGVuY21wKGNtZCwgImVuYWJsZSIpID09IDApIHsKKwkJCWJsdWV0b290aF9zZXRfcmFkaW9zdygxLCAxKTsKKwkJfSBlbHNlIGlmIChzdHJsZW5jbXAoY21kLCAiZGlzYWJsZSIpID09IDApIHsKKwkJCWJsdWV0b290aF9zZXRfcmFkaW9zdygwLCAxKTsKKwkJfSBlbHNlCisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBpYm1fc3RydWN0IGJsdWV0b290aF9kcml2ZXJfZGF0YSA9IHsKKwkubmFtZSA9ICJibHVldG9vdGgiLAorCS5yZWFkID0gYmx1ZXRvb3RoX3JlYWQsCisJLndyaXRlID0gYmx1ZXRvb3RoX3dyaXRlLAorCS5leGl0ID0gYmx1ZXRvb3RoX2V4aXQsCisJLnN1c3BlbmQgPSBibHVldG9vdGhfc3VzcGVuZCwKKwkuc2h1dGRvd24gPSBibHVldG9vdGhfc2h1dGRvd24sCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogV2FuIHN1YmRyaXZlcgorICovCisKK2VudW0geworCS8qIEFDUEkgR1dBTi9TV0FOIGJpdHMgKi8KKwlUUF9BQ1BJX1dBTkNBUkRfSFdQUkVTRU5UCT0gMHgwMSwJLyogV2FuIGh3IGF2YWlsYWJsZSAqLworCVRQX0FDUElfV0FOQ0FSRF9SQURJT1NTVwk9IDB4MDIsCS8qIFdhbiByYWRpbyBlbmFibGVkICovCisJVFBfQUNQSV9XQU5DQVJEX1JFU1VNRUNUUkwJPSAweDA0LAkvKiBXYW4gc3RhdGUgYXQgcmVzdW1lOgorCQkJCQkJICAgb2ZmIC8gbGFzdCBzdGF0ZSAqLworfTsKKworc3RhdGljIHN0cnVjdCByZmtpbGwgKnRwYWNwaV93YW5fcmZraWxsOworCitzdGF0aWMgdm9pZCB3YW5fc3VzcGVuZChwbV9tZXNzYWdlX3Qgc3RhdGUpCit7CisJLyogVHJ5IHRvIG1ha2Ugc3VyZSByYWRpbyB3aWxsIHJlc3VtZSBwb3dlcmVkIG9mZiAqLworCWFjcGlfZXZhbGYoTlVMTCwgTlVMTCwgIlxcV0dTViIsICJxdmQiLAorCQkgICBUUF9BQ1BJX1dHU1ZfUFdSX09GRl9PTl9SRVNVTUUpOworfQorCitzdGF0aWMgaW50IHdhbl9nZXRfcmFkaW9zdyh2b2lkKQoreworCWludCBzdGF0dXM7CisKKwlpZiAoIXRwX2ZlYXR1cmVzLndhbikKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwkvKiBXTFNXIG92ZXJyaWRlcyBXV0FOIGluIGZpcm13YXJlL2hhcmR3YXJlLCByZWZsZWN0IHRoYXQgKi8KKwlpZiAodHBfZmVhdHVyZXMuaG90a2V5X3dsc3cgJiYgIWhvdGtleV9nZXRfd2xzdygmc3RhdHVzKSAmJiAhc3RhdHVzKQorCQlyZXR1cm4gUkZLSUxMX1NUQVRFX0hBUkRfQkxPQ0tFRDsKKworI2lmZGVmIENPTkZJR19USElOS1BBRF9BQ1BJX0RFQlVHRkFDSUxJVElFUworCWlmIChkYmdfd3dhbmVtdWwpCisJCXJldHVybiAodHBhY3BpX3d3YW5fZW11bHN0YXRlKSA/CisJCQlSRktJTExfU1RBVEVfVU5CTE9DS0VEIDogUkZLSUxMX1NUQVRFX1NPRlRfQkxPQ0tFRDsKKyNlbmRpZgorCisJaWYgKCFhY3BpX2V2YWxmKGhrZXlfaGFuZGxlLCAmc3RhdHVzLCAiR1dBTiIsICJkIikpCisJCXJldHVybiAtRUlPOworCisJcmV0dXJuICgoc3RhdHVzICYgVFBfQUNQSV9XQU5DQVJEX1JBRElPU1NXKSAhPSAwKSA/CisJCVJGS0lMTF9TVEFURV9VTkJMT0NLRUQgOiBSRktJTExfU1RBVEVfU09GVF9CTE9DS0VEOworfQorCitzdGF0aWMgdm9pZCB3YW5fdXBkYXRlX3Jmayh2b2lkKQoreworCWludCBzdGF0dXM7CisKKwlpZiAoIXRwYWNwaV93YW5fcmZraWxsKQorCQlyZXR1cm47CisKKwlzdGF0dXMgPSB3YW5fZ2V0X3JhZGlvc3coKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJcmV0dXJuOworCXJma2lsbF9mb3JjZV9zdGF0ZSh0cGFjcGlfd2FuX3Jma2lsbCwgc3RhdHVzKTsKK30KKworc3RhdGljIGludCB3YW5fc2V0X3JhZGlvc3coaW50IHJhZGlvX29uLCBpbnQgdXBkYXRlX3JmaykKK3sKKwlpbnQgc3RhdHVzOworCisJaWYgKCF0cF9mZWF0dXJlcy53YW4pCisJCXJldHVybiAtRU5PREVWOworCisJLyogV0xTVyBvdmVycmlkZXMgYmx1ZXRvb3RoIGluIGZpcm13YXJlL2hhcmR3YXJlLCBidXQgdGhlcmUgaXMgbm8KKwkgKiByZWFzb24gdG8gcmlzayB3ZWlyZCBiZWhhdmlvdXIuICovCisJaWYgKHRwX2ZlYXR1cmVzLmhvdGtleV93bHN3ICYmICFob3RrZXlfZ2V0X3dsc3coJnN0YXR1cykgJiYgIXN0YXR1cworCSAgICAmJiByYWRpb19vbikKKwkJcmV0dXJuIC1FUEVSTTsKKworI2lmZGVmIENPTkZJR19USElOS1BBRF9BQ1BJX0RFQlVHRkFDSUxJVElFUworCWlmIChkYmdfd3dhbmVtdWwpIHsKKwkJdHBhY3BpX3d3YW5fZW11bHN0YXRlID0gISFyYWRpb19vbjsKKwkJaWYgKHVwZGF0ZV9yZmspCisJCQl3YW5fdXBkYXRlX3JmaygpOworCQlyZXR1cm4gMDsKKwl9CisjZW5kaWYKKworCS8qIFdlIG1ha2Ugc3VyZSB0byBrZWVwIFRQX0FDUElfV0FOQ0FSRF9SRVNVTUVDVFJMIG9mZiAqLworCWlmIChyYWRpb19vbikKKwkJc3RhdHVzID0gVFBfQUNQSV9XQU5DQVJEX1JBRElPU1NXOworCWVsc2UKKwkJc3RhdHVzID0gMDsKKwlpZiAoIWFjcGlfZXZhbGYoaGtleV9oYW5kbGUsIE5VTEwsICJTV0FOIiwgInZkIiwgc3RhdHVzKSkKKwkJcmV0dXJuIC1FSU87CisKKwlpZiAodXBkYXRlX3JmaykKKwkJd2FuX3VwZGF0ZV9yZmsoKTsKKworCXJldHVybiAwOworfQorCisvKiBzeXNmcyB3YW4gZW5hYmxlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3N0YXRpYyBzc2l6ZV90IHdhbl9lbmFibGVfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgIGNoYXIgKmJ1ZikKK3sKKwlpbnQgc3RhdHVzOworCisJc3RhdHVzID0gd2FuX2dldF9yYWRpb3N3KCk7CisJaWYgKHN0YXR1cyA8IDApCisJCXJldHVybiBzdGF0dXM7CisKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZFxuIiwKKwkJCShzdGF0dXMgPT0gUkZLSUxMX1NUQVRFX1VOQkxPQ0tFRCkgPyAxIDogMCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHdhbl9lbmFibGVfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAorCQkJICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXVuc2lnbmVkIGxvbmcgdDsKKwlpbnQgcmVzOworCisJaWYgKHBhcnNlX3N0cnRvdWwoYnVmLCAxLCAmdCkpCisJCXJldHVybiAtRUlOVkFMOworCisJcmVzID0gd2FuX3NldF9yYWRpb3N3KHQsIDEpOworCisJcmV0dXJuIChyZXMpID8gcmVzIDogY291bnQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSBkZXZfYXR0cl93YW5fZW5hYmxlID0KKwlfX0FUVFIod3dhbl9lbmFibGUsIFNfSVdVU1IgfCBTX0lSVUdPLAorCQl3YW5fZW5hYmxlX3Nob3csIHdhbl9lbmFibGVfc3RvcmUpOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKndhbl9hdHRyaWJ1dGVzW10gPSB7CisJJmRldl9hdHRyX3dhbl9lbmFibGUuYXR0ciwKKwlOVUxMCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCB3YW5fYXR0cl9ncm91cCA9IHsKKwkuYXR0cnMgPSB3YW5fYXR0cmlidXRlcywKK307CisKK3N0YXRpYyBpbnQgdHBhY3BpX3dhbl9yZmtfZ2V0KHZvaWQgKmRhdGEsIGVudW0gcmZraWxsX3N0YXRlICpzdGF0ZSkKK3sKKwlpbnQgd2FucyA9IHdhbl9nZXRfcmFkaW9zdygpOworCisJaWYgKHdhbnMgPCAwKQorCQlyZXR1cm4gd2FuczsKKworCSpzdGF0ZSA9IHdhbnM7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdHBhY3BpX3dhbl9yZmtfc2V0KHZvaWQgKmRhdGEsIGVudW0gcmZraWxsX3N0YXRlIHN0YXRlKQoreworCXJldHVybiB3YW5fc2V0X3JhZGlvc3coKHN0YXRlID09IFJGS0lMTF9TVEFURV9VTkJMT0NLRUQpLCAwKTsKK30KKworc3RhdGljIHZvaWQgd2FuX3NodXRkb3duKHZvaWQpCit7CisJLyogT3JkZXIgZmlybXdhcmUgdG8gc2F2ZSBjdXJyZW50IHN0YXRlIHRvIE5WUkFNICovCisJaWYgKCFhY3BpX2V2YWxmKE5VTEwsIE5VTEwsICJcXFdHU1YiLCAidmQiLAorCQkJVFBfQUNQSV9XR1NWX1NBVkVfU1RBVEUpKQorCQlwcmludGsoVFBBQ1BJX05PVElDRQorCQkJImZhaWxlZCB0byBzYXZlIFdXQU4gc3RhdGUgdG8gTlZSQU1cbiIpOworfQorCitzdGF0aWMgdm9pZCB3YW5fZXhpdCh2b2lkKQoreworCXdhbl9zaHV0ZG93bigpOworCisJaWYgKHRwYWNwaV93YW5fcmZraWxsKQorCQlyZmtpbGxfdW5yZWdpc3Rlcih0cGFjcGlfd2FuX3Jma2lsbCk7CisKKwlzeXNmc19yZW1vdmVfZ3JvdXAoJnRwYWNwaV9wZGV2LT5kZXYua29iaiwKKwkJJndhbl9hdHRyX2dyb3VwKTsKK30KKworc3RhdGljIGludCBfX2luaXQgd2FuX2luaXQoc3RydWN0IGlibV9pbml0X3N0cnVjdCAqaWlibSkKK3sKKwlpbnQgcmVzOworCWludCBzdGF0dXMgPSAwOworCisJdmRiZ19wcmludGsoVFBBQ1BJX0RCR19JTklULCAiaW5pdGlhbGl6aW5nIHdhbiBzdWJkcml2ZXJcbiIpOworCisJVFBBQ1BJX0FDUElIQU5ETEVfSU5JVChoa2V5KTsKKworCXRwX2ZlYXR1cmVzLndhbiA9IGhrZXlfaGFuZGxlICYmCisJICAgIGFjcGlfZXZhbGYoaGtleV9oYW5kbGUsICZzdGF0dXMsICJHV0FOIiwgInFkIik7CisKKwl2ZGJnX3ByaW50ayhUUEFDUElfREJHX0lOSVQsICJ3YW4gaXMgJXMsIHN0YXR1cyAweCUwMnhcbiIsCisJCXN0cl9zdXBwb3J0ZWQodHBfZmVhdHVyZXMud2FuKSwKKwkJc3RhdHVzKTsKKworI2lmZGVmIENPTkZJR19USElOS1BBRF9BQ1BJX0RFQlVHRkFDSUxJVElFUworCWlmIChkYmdfd3dhbmVtdWwpIHsKKwkJdHBfZmVhdHVyZXMud2FuID0gMTsKKwkJcHJpbnRrKFRQQUNQSV9JTkZPCisJCQkid3dhbiBzd2l0Y2ggZW11bGF0aW9uIGVuYWJsZWRcbiIpOworCX0gZWxzZQorI2VuZGlmCisJaWYgKHRwX2ZlYXR1cmVzLndhbiAmJgorCSAgICAhKHN0YXR1cyAmIFRQX0FDUElfV0FOQ0FSRF9IV1BSRVNFTlQpKSB7CisJCS8qIG5vIHdhbiBoYXJkd2FyZSBwcmVzZW50IGluIHN5c3RlbSAqLworCQl0cF9mZWF0dXJlcy53YW4gPSAwOworCQlkYmdfcHJpbnRrKFRQQUNQSV9EQkdfSU5JVCwKKwkJCSAgICJ3YW4gaGFyZHdhcmUgbm90IGluc3RhbGxlZFxuIik7CisJfQorCisJaWYgKCF0cF9mZWF0dXJlcy53YW4pCisJCXJldHVybiAxOworCisJcmVzID0gc3lzZnNfY3JlYXRlX2dyb3VwKCZ0cGFjcGlfcGRldi0+ZGV2LmtvYmosCisJCQkJJndhbl9hdHRyX2dyb3VwKTsKKwlpZiAocmVzKQorCQlyZXR1cm4gcmVzOworCisJcmVzID0gdHBhY3BpX25ld19yZmtpbGwoVFBBQ1BJX1JGS19XV0FOX1NXX0lELAorCQkJCSZ0cGFjcGlfd2FuX3Jma2lsbCwKKwkJCQlSRktJTExfVFlQRV9XV0FOLAorCQkJCSJ0cGFjcGlfd3dhbl9zdyIsCisJCQkJdHJ1ZSwKKwkJCQl0cGFjcGlfd2FuX3Jma19zZXQsCisJCQkJdHBhY3BpX3dhbl9yZmtfZ2V0KTsKKwlpZiAocmVzKSB7CisJCXdhbl9leGl0KCk7CisJCXJldHVybiByZXM7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIHByb2NmcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworc3RhdGljIGludCB3YW5fcmVhZChjaGFyICpwKQoreworCWludCBsZW4gPSAwOworCWludCBzdGF0dXMgPSB3YW5fZ2V0X3JhZGlvc3coKTsKKworCWlmICghdHBfZmVhdHVyZXMud2FuKQorCQlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAic3RhdHVzOlx0XHRub3Qgc3VwcG9ydGVkXG4iKTsKKwllbHNlIHsKKwkJbGVuICs9IHNwcmludGYocCArIGxlbiwgInN0YXR1czpcdFx0JXNcbiIsCisJCQkJKHN0YXR1cyA9PSBSRktJTExfU1RBVEVfVU5CTE9DS0VEKSA/CisJCQkJCSJlbmFibGVkIiA6ICJkaXNhYmxlZCIpOworCQlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAiY29tbWFuZHM6XHRlbmFibGUsIGRpc2FibGVcbiIpOworCX0KKworCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyBpbnQgd2FuX3dyaXRlKGNoYXIgKmJ1ZikKK3sKKwljaGFyICpjbWQ7CisKKwlpZiAoIXRwX2ZlYXR1cmVzLndhbikKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwl3aGlsZSAoKGNtZCA9IG5leHRfY21kKCZidWYpKSkgeworCQlpZiAoc3RybGVuY21wKGNtZCwgImVuYWJsZSIpID09IDApIHsKKwkJCXdhbl9zZXRfcmFkaW9zdygxLCAxKTsKKwkJfSBlbHNlIGlmIChzdHJsZW5jbXAoY21kLCAiZGlzYWJsZSIpID09IDApIHsKKwkJCXdhbl9zZXRfcmFkaW9zdygwLCAxKTsKKwkJfSBlbHNlCisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBpYm1fc3RydWN0IHdhbl9kcml2ZXJfZGF0YSA9IHsKKwkubmFtZSA9ICJ3YW4iLAorCS5yZWFkID0gd2FuX3JlYWQsCisJLndyaXRlID0gd2FuX3dyaXRlLAorCS5leGl0ID0gd2FuX2V4aXQsCisJLnN1c3BlbmQgPSB3YW5fc3VzcGVuZCwKKwkuc2h1dGRvd24gPSB3YW5fc2h1dGRvd24sCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogVVdCIHN1YmRyaXZlcgorICovCisKK2VudW0geworCS8qIEFDUEkgR1VXQi9TVVdCIGJpdHMgKi8KKwlUUF9BQ1BJX1VXQl9IV1BSRVNFTlQJPSAweDAxLAkvKiBVV0IgaHcgYXZhaWxhYmxlICovCisJVFBfQUNQSV9VV0JfUkFESU9TU1cJPSAweDAyLAkvKiBVV0IgcmFkaW8gZW5hYmxlZCAqLworfTsKKworc3RhdGljIHN0cnVjdCByZmtpbGwgKnRwYWNwaV91d2JfcmZraWxsOworCitzdGF0aWMgaW50IHV3Yl9nZXRfcmFkaW9zdyh2b2lkKQoreworCWludCBzdGF0dXM7CisKKwlpZiAoIXRwX2ZlYXR1cmVzLnV3YikKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwkvKiBXTFNXIG92ZXJyaWRlcyBVV0IgaW4gZmlybXdhcmUvaGFyZHdhcmUsIHJlZmxlY3QgdGhhdCAqLworCWlmICh0cF9mZWF0dXJlcy5ob3RrZXlfd2xzdyAmJiAhaG90a2V5X2dldF93bHN3KCZzdGF0dXMpICYmICFzdGF0dXMpCisJCXJldHVybiBSRktJTExfU1RBVEVfSEFSRF9CTE9DS0VEOworCisjaWZkZWYgQ09ORklHX1RISU5LUEFEX0FDUElfREVCVUdGQUNJTElUSUVTCisJaWYgKGRiZ191d2JlbXVsKQorCQlyZXR1cm4gKHRwYWNwaV91d2JfZW11bHN0YXRlKSA/CisJCQlSRktJTExfU1RBVEVfVU5CTE9DS0VEIDogUkZLSUxMX1NUQVRFX1NPRlRfQkxPQ0tFRDsKKyNlbmRpZgorCisJaWYgKCFhY3BpX2V2YWxmKGhrZXlfaGFuZGxlLCAmc3RhdHVzLCAiR1VXQiIsICJkIikpCisJCXJldHVybiAtRUlPOworCisJcmV0dXJuICgoc3RhdHVzICYgVFBfQUNQSV9VV0JfUkFESU9TU1cpICE9IDApID8KKwkJUkZLSUxMX1NUQVRFX1VOQkxPQ0tFRCA6IFJGS0lMTF9TVEFURV9TT0ZUX0JMT0NLRUQ7Cit9CisKK3N0YXRpYyB2b2lkIHV3Yl91cGRhdGVfcmZrKHZvaWQpCit7CisJaW50IHN0YXR1czsKKworCWlmICghdHBhY3BpX3V3Yl9yZmtpbGwpCisJCXJldHVybjsKKworCXN0YXR1cyA9IHV3Yl9nZXRfcmFkaW9zdygpOworCWlmIChzdGF0dXMgPCAwKQorCQlyZXR1cm47CisJcmZraWxsX2ZvcmNlX3N0YXRlKHRwYWNwaV91d2JfcmZraWxsLCBzdGF0dXMpOworfQorCitzdGF0aWMgaW50IHV3Yl9zZXRfcmFkaW9zdyhpbnQgcmFkaW9fb24sIGludCB1cGRhdGVfcmZrKQoreworCWludCBzdGF0dXM7CisKKwlpZiAoIXRwX2ZlYXR1cmVzLnV3YikKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwkvKiBXTFNXIG92ZXJyaWRlcyBVV0IgaW4gZmlybXdhcmUvaGFyZHdhcmUsIGJ1dCB0aGVyZSBpcyBubworCSAqIHJlYXNvbiB0byByaXNrIHdlaXJkIGJlaGF2aW91ci4gKi8KKwlpZiAodHBfZmVhdHVyZXMuaG90a2V5X3dsc3cgJiYgIWhvdGtleV9nZXRfd2xzdygmc3RhdHVzKSAmJiAhc3RhdHVzCisJICAgICYmIHJhZGlvX29uKQorCQlyZXR1cm4gLUVQRVJNOworCisjaWZkZWYgQ09ORklHX1RISU5LUEFEX0FDUElfREVCVUdGQUNJTElUSUVTCisJaWYgKGRiZ191d2JlbXVsKSB7CisJCXRwYWNwaV91d2JfZW11bHN0YXRlID0gISFyYWRpb19vbjsKKwkJaWYgKHVwZGF0ZV9yZmspCisJCQl1d2JfdXBkYXRlX3JmaygpOworCQlyZXR1cm4gMDsKKwl9CisjZW5kaWYKKworCXN0YXR1cyA9IChyYWRpb19vbikgPyBUUF9BQ1BJX1VXQl9SQURJT1NTVyA6IDA7CisJaWYgKCFhY3BpX2V2YWxmKGhrZXlfaGFuZGxlLCBOVUxMLCAiU1VXQiIsICJ2ZCIsIHN0YXR1cykpCisJCXJldHVybiAtRUlPOworCisJaWYgKHVwZGF0ZV9yZmspCisJCXV3Yl91cGRhdGVfcmZrKCk7CisKKwlyZXR1cm4gMDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBpbnQgdHBhY3BpX3V3Yl9yZmtfZ2V0KHZvaWQgKmRhdGEsIGVudW0gcmZraWxsX3N0YXRlICpzdGF0ZSkKK3sKKwlpbnQgdXdicyA9IHV3Yl9nZXRfcmFkaW9zdygpOworCisJaWYgKHV3YnMgPCAwKQorCQlyZXR1cm4gdXdiczsKKworCSpzdGF0ZSA9IHV3YnM7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdHBhY3BpX3V3Yl9yZmtfc2V0KHZvaWQgKmRhdGEsIGVudW0gcmZraWxsX3N0YXRlIHN0YXRlKQoreworCXJldHVybiB1d2Jfc2V0X3JhZGlvc3coKHN0YXRlID09IFJGS0lMTF9TVEFURV9VTkJMT0NLRUQpLCAwKTsKK30KKworc3RhdGljIHZvaWQgdXdiX2V4aXQodm9pZCkKK3sKKwlpZiAodHBhY3BpX3V3Yl9yZmtpbGwpCisJCXJma2lsbF91bnJlZ2lzdGVyKHRwYWNwaV91d2JfcmZraWxsKTsKK30KKworc3RhdGljIGludCBfX2luaXQgdXdiX2luaXQoc3RydWN0IGlibV9pbml0X3N0cnVjdCAqaWlibSkKK3sKKwlpbnQgcmVzOworCWludCBzdGF0dXMgPSAwOworCisJdmRiZ19wcmludGsoVFBBQ1BJX0RCR19JTklULCAiaW5pdGlhbGl6aW5nIHV3YiBzdWJkcml2ZXJcbiIpOworCisJVFBBQ1BJX0FDUElIQU5ETEVfSU5JVChoa2V5KTsKKworCXRwX2ZlYXR1cmVzLnV3YiA9IGhrZXlfaGFuZGxlICYmCisJICAgIGFjcGlfZXZhbGYoaGtleV9oYW5kbGUsICZzdGF0dXMsICJHVVdCIiwgInFkIik7CisKKwl2ZGJnX3ByaW50ayhUUEFDUElfREJHX0lOSVQsICJ1d2IgaXMgJXMsIHN0YXR1cyAweCUwMnhcbiIsCisJCXN0cl9zdXBwb3J0ZWQodHBfZmVhdHVyZXMudXdiKSwKKwkJc3RhdHVzKTsKKworI2lmZGVmIENPTkZJR19USElOS1BBRF9BQ1BJX0RFQlVHRkFDSUxJVElFUworCWlmIChkYmdfdXdiZW11bCkgeworCQl0cF9mZWF0dXJlcy51d2IgPSAxOworCQlwcmludGsoVFBBQ1BJX0lORk8KKwkJCSJ1d2Igc3dpdGNoIGVtdWxhdGlvbiBlbmFibGVkXG4iKTsKKwl9IGVsc2UKKyNlbmRpZgorCWlmICh0cF9mZWF0dXJlcy51d2IgJiYKKwkgICAgIShzdGF0dXMgJiBUUF9BQ1BJX1VXQl9IV1BSRVNFTlQpKSB7CisJCS8qIG5vIHV3YiBoYXJkd2FyZSBwcmVzZW50IGluIHN5c3RlbSAqLworCQl0cF9mZWF0dXJlcy51d2IgPSAwOworCQlkYmdfcHJpbnRrKFRQQUNQSV9EQkdfSU5JVCwKKwkJCSAgICJ1d2IgaGFyZHdhcmUgbm90IGluc3RhbGxlZFxuIik7CisJfQorCisJaWYgKCF0cF9mZWF0dXJlcy51d2IpCisJCXJldHVybiAxOworCisJcmVzID0gdHBhY3BpX25ld19yZmtpbGwoVFBBQ1BJX1JGS19VV0JfU1dfSUQsCisJCQkJJnRwYWNwaV91d2JfcmZraWxsLAorCQkJCVJGS0lMTF9UWVBFX1VXQiwKKwkJCQkidHBhY3BpX3V3Yl9zdyIsCisJCQkJZmFsc2UsCisJCQkJdHBhY3BpX3V3Yl9yZmtfc2V0LAorCQkJCXRwYWNwaV91d2JfcmZrX2dldCk7CisKKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgc3RydWN0IGlibV9zdHJ1Y3QgdXdiX2RyaXZlcl9kYXRhID0geworCS5uYW1lID0gInV3YiIsCisJLmV4aXQgPSB1d2JfZXhpdCwKKwkuZmxhZ3MuZXhwZXJpbWVudGFsID0gMSwKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBWaWRlbyBzdWJkcml2ZXIKKyAqLworCisjaWZkZWYgQ09ORklHX1RISU5LUEFEX0FDUElfVklERU8KKworZW51bSB2aWRlb19hY2Nlc3NfbW9kZSB7CisJVFBBQ1BJX1ZJREVPX05PTkUgPSAwLAorCVRQQUNQSV9WSURFT181NzAsCS8qIDU3MCAqLworCVRQQUNQSV9WSURFT183NzAsCS8qIDYwMGUveCwgNzcwZSwgNzcweCAqLworCVRQQUNQSV9WSURFT19ORVcsCS8qIGFsbCBvdGhlcnMgKi8KK307CisKK2VudW0gewkvKiB2aWRlbyBzdGF0dXMgZmxhZ3MsIGJhc2VkIG9uIFZJREVPXzU3MCAqLworCVRQX0FDUElfVklERU9fU19MQ0QgPSAweDAxLAkvKiBMQ0Qgb3V0cHV0IGVuYWJsZWQgKi8KKwlUUF9BQ1BJX1ZJREVPX1NfQ1JUID0gMHgwMiwJLyogQ1JUIG91dHB1dCBlbmFibGVkICovCisJVFBfQUNQSV9WSURFT19TX0RWSSA9IDB4MDgsCS8qIERWSSBvdXRwdXQgZW5hYmxlZCAqLworfTsKKworZW51bSB7ICAvKiBUUEFDUElfVklERU9fNTcwIGNvbnN0YW50cyAqLworCVRQX0FDUElfVklERU9fNTcwX1BIU0NNRCA9IDB4ODcsCS8qIHVua25vd24gbWFnaWMgY29uc3RhbnQgOiggKi8KKwlUUF9BQ1BJX1ZJREVPXzU3MF9QSFNNQVNLID0gMHgwMywJLyogUEhTIGJpdHMgdGhhdCBtYXAgdG8KKwkJCQkJCSAqIHZpZGVvX3N0YXR1c19mbGFncyAqLworCVRQX0FDUElfVklERU9fNTcwX1BIUzJDTUQgPSAweDhiLAkvKiB1bmtub3duIG1hZ2ljIGNvbnN0YW50IDooICovCisJVFBfQUNQSV9WSURFT181NzBfUEhTMlNFVCA9IDB4ODAsCS8qIHVua25vd24gbWFnaWMgY29uc3RhbnQgOiggKi8KK307CisKK3N0YXRpYyBlbnVtIHZpZGVvX2FjY2Vzc19tb2RlIHZpZGVvX3N1cHBvcnRlZDsKK3N0YXRpYyBpbnQgdmlkZW9fb3JpZ19hdXRvc3c7CisKK3N0YXRpYyBpbnQgdmlkZW9fYXV0b3N3X2dldCh2b2lkKTsKK3N0YXRpYyBpbnQgdmlkZW9fYXV0b3N3X3NldChpbnQgZW5hYmxlKTsKKworVFBBQ1BJX0hBTkRMRSh2aWQyLCByb290LCAiXFxfU0IuUENJMC5BR1BCLlZJRCIpOwkvKiBHNDEgKi8KKworc3RhdGljIGludCBfX2luaXQgdmlkZW9faW5pdChzdHJ1Y3QgaWJtX2luaXRfc3RydWN0ICppaWJtKQoreworCWludCBpdmdhOworCisJdmRiZ19wcmludGsoVFBBQ1BJX0RCR19JTklULCAiaW5pdGlhbGl6aW5nIHZpZGVvIHN1YmRyaXZlclxuIik7CisKKwlUUEFDUElfQUNQSUhBTkRMRV9JTklUKHZpZCk7CisJVFBBQ1BJX0FDUElIQU5ETEVfSU5JVCh2aWQyKTsKKworCWlmICh2aWQyX2hhbmRsZSAmJiBhY3BpX2V2YWxmKE5VTEwsICZpdmdhLCAiXFxJVkdBIiwgImQiKSAmJiBpdmdhKQorCQkvKiBHNDEsIGFzc3VtZSBJVkdBIGRvZXNuJ3QgY2hhbmdlICovCisJCXZpZF9oYW5kbGUgPSB2aWQyX2hhbmRsZTsKKworCWlmICghdmlkX2hhbmRsZSkKKwkJLyogdmlkZW8gc3dpdGNoaW5nIG5vdCBzdXBwb3J0ZWQgb24gUjMwLCBSMzEgKi8KKwkJdmlkZW9fc3VwcG9ydGVkID0gVFBBQ1BJX1ZJREVPX05PTkU7CisJZWxzZSBpZiAoYWNwaV9ldmFsZih2aWRfaGFuZGxlLCAmdmlkZW9fb3JpZ19hdXRvc3csICJTV0lUIiwgInFkIikpCisJCS8qIDU3MCAqLworCQl2aWRlb19zdXBwb3J0ZWQgPSBUUEFDUElfVklERU9fNTcwOworCWVsc2UgaWYgKGFjcGlfZXZhbGYodmlkX2hhbmRsZSwgJnZpZGVvX29yaWdfYXV0b3N3LCAiXlZBREwiLCAicWQiKSkKKwkJLyogNjAwZS94LCA3NzBlLCA3NzB4ICovCisJCXZpZGVvX3N1cHBvcnRlZCA9IFRQQUNQSV9WSURFT183NzA7CisJZWxzZQorCQkvKiBhbGwgb3RoZXJzICovCisJCXZpZGVvX3N1cHBvcnRlZCA9IFRQQUNQSV9WSURFT19ORVc7CisKKwl2ZGJnX3ByaW50ayhUUEFDUElfREJHX0lOSVQsICJ2aWRlbyBpcyAlcywgbW9kZSAlZFxuIiwKKwkJc3RyX3N1cHBvcnRlZCh2aWRlb19zdXBwb3J0ZWQgIT0gVFBBQ1BJX1ZJREVPX05PTkUpLAorCQl2aWRlb19zdXBwb3J0ZWQpOworCisJcmV0dXJuICh2aWRlb19zdXBwb3J0ZWQgIT0gVFBBQ1BJX1ZJREVPX05PTkUpPyAwIDogMTsKK30KKworc3RhdGljIHZvaWQgdmlkZW9fZXhpdCh2b2lkKQoreworCWRiZ19wcmludGsoVFBBQ1BJX0RCR19FWElULAorCQkgICAicmVzdG9yaW5nIG9yaWdpbmFsIHZpZGVvIGF1dG9zd2l0Y2ggbW9kZVxuIik7CisJaWYgKHZpZGVvX2F1dG9zd19zZXQodmlkZW9fb3JpZ19hdXRvc3cpKQorCQlwcmludGsoVFBBQ1BJX0VSUiAiZXJyb3Igd2hpbGUgdHJ5aW5nIHRvIHJlc3RvcmUgb3JpZ2luYWwgIgorCQkJInZpZGVvIGF1dG9zd2l0Y2ggbW9kZVxuIik7Cit9CisKK3N0YXRpYyBpbnQgdmlkZW9fb3V0cHV0c3dfZ2V0KHZvaWQpCit7CisJaW50IHN0YXR1cyA9IDA7CisJaW50IGk7CisKKwlzd2l0Y2ggKHZpZGVvX3N1cHBvcnRlZCkgeworCWNhc2UgVFBBQ1BJX1ZJREVPXzU3MDoKKwkJaWYgKCFhY3BpX2V2YWxmKE5VTEwsICZpLCAiXFxfU0IuUEhTIiwgImRkIiwKKwkJCQkgVFBfQUNQSV9WSURFT181NzBfUEhTQ01EKSkKKwkJCXJldHVybiAtRUlPOworCQlzdGF0dXMgPSBpICYgVFBfQUNQSV9WSURFT181NzBfUEhTTUFTSzsKKwkJYnJlYWs7CisJY2FzZSBUUEFDUElfVklERU9fNzcwOgorCQlpZiAoIWFjcGlfZXZhbGYoTlVMTCwgJmksICJcXFZDREwiLCAiZCIpKQorCQkJcmV0dXJuIC1FSU87CisJCWlmIChpKQorCQkJc3RhdHVzIHw9IFRQX0FDUElfVklERU9fU19MQ0Q7CisJCWlmICghYWNwaV9ldmFsZihOVUxMLCAmaSwgIlxcVkNEQyIsICJkIikpCisJCQlyZXR1cm4gLUVJTzsKKwkJaWYgKGkpCisJCQlzdGF0dXMgfD0gVFBfQUNQSV9WSURFT19TX0NSVDsKKwkJYnJlYWs7CisJY2FzZSBUUEFDUElfVklERU9fTkVXOgorCQlpZiAoIWFjcGlfZXZhbGYoTlVMTCwgTlVMTCwgIlxcVlVQUyIsICJ2ZCIsIDEpIHx8CisJCSAgICAhYWNwaV9ldmFsZihOVUxMLCAmaSwgIlxcVkNEQyIsICJkIikpCisJCQlyZXR1cm4gLUVJTzsKKwkJaWYgKGkpCisJCQlzdGF0dXMgfD0gVFBfQUNQSV9WSURFT19TX0NSVDsKKworCQlpZiAoIWFjcGlfZXZhbGYoTlVMTCwgTlVMTCwgIlxcVlVQUyIsICJ2ZCIsIDApIHx8CisJCSAgICAhYWNwaV9ldmFsZihOVUxMLCAmaSwgIlxcVkNETCIsICJkIikpCisJCQlyZXR1cm4gLUVJTzsKKwkJaWYgKGkpCisJCQlzdGF0dXMgfD0gVFBfQUNQSV9WSURFT19TX0xDRDsKKwkJaWYgKCFhY3BpX2V2YWxmKE5VTEwsICZpLCAiXFxWQ0REIiwgImQiKSkKKwkJCXJldHVybiAtRUlPOworCQlpZiAoaSkKKwkJCXN0YXR1cyB8PSBUUF9BQ1BJX1ZJREVPX1NfRFZJOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVOT1NZUzsKKwl9CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IHZpZGVvX291dHB1dHN3X3NldChpbnQgc3RhdHVzKQoreworCWludCBhdXRvc3c7CisJaW50IHJlcyA9IDA7CisKKwlzd2l0Y2ggKHZpZGVvX3N1cHBvcnRlZCkgeworCWNhc2UgVFBBQ1BJX1ZJREVPXzU3MDoKKwkJcmVzID0gYWNwaV9ldmFsZihOVUxMLCBOVUxMLAorCQkJCSAiXFxfU0IuUEhTMiIsICJ2ZGQiLAorCQkJCSBUUF9BQ1BJX1ZJREVPXzU3MF9QSFMyQ01ELAorCQkJCSBzdGF0dXMgfCBUUF9BQ1BJX1ZJREVPXzU3MF9QSFMyU0VUKTsKKwkJYnJlYWs7CisJY2FzZSBUUEFDUElfVklERU9fNzcwOgorCQlhdXRvc3cgPSB2aWRlb19hdXRvc3dfZ2V0KCk7CisJCWlmIChhdXRvc3cgPCAwKQorCQkJcmV0dXJuIGF1dG9zdzsKKworCQlyZXMgPSB2aWRlb19hdXRvc3dfc2V0KDEpOworCQlpZiAocmVzKQorCQkJcmV0dXJuIHJlczsKKwkJcmVzID0gYWNwaV9ldmFsZih2aWRfaGFuZGxlLCBOVUxMLAorCQkJCSAiQVNXVCIsICJ2ZGQiLCBzdGF0dXMgKiAweDEwMCwgMCk7CisJCWlmICghYXV0b3N3ICYmIHZpZGVvX2F1dG9zd19zZXQoYXV0b3N3KSkgeworCQkJcHJpbnRrKFRQQUNQSV9FUlIKKwkJCSAgICAgICAidmlkZW8gYXV0by1zd2l0Y2ggbGVmdCBlbmFibGVkIGR1ZSB0byBlcnJvclxuIik7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCQlicmVhazsKKwljYXNlIFRQQUNQSV9WSURFT19ORVc6CisJCXJlcyA9IGFjcGlfZXZhbGYoTlVMTCwgTlVMTCwgIlxcVlVQUyIsICJ2ZCIsIDB4ODApICYmCisJCSAgICAgIGFjcGlfZXZhbGYoTlVMTCwgTlVMTCwgIlxcVlNEUyIsICJ2ZGQiLCBzdGF0dXMsIDEpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVOT1NZUzsKKwl9CisKKwlyZXR1cm4gKHJlcyk/IDAgOiAtRUlPOworfQorCitzdGF0aWMgaW50IHZpZGVvX2F1dG9zd19nZXQodm9pZCkKK3sKKwlpbnQgYXV0b3N3ID0gMDsKKworCXN3aXRjaCAodmlkZW9fc3VwcG9ydGVkKSB7CisJY2FzZSBUUEFDUElfVklERU9fNTcwOgorCQlpZiAoIWFjcGlfZXZhbGYodmlkX2hhbmRsZSwgJmF1dG9zdywgIlNXSVQiLCAiZCIpKQorCQkJcmV0dXJuIC1FSU87CisJCWJyZWFrOworCWNhc2UgVFBBQ1BJX1ZJREVPXzc3MDoKKwljYXNlIFRQQUNQSV9WSURFT19ORVc6CisJCWlmICghYWNwaV9ldmFsZih2aWRfaGFuZGxlLCAmYXV0b3N3LCAiXlZERUUiLCAiZCIpKQorCQkJcmV0dXJuIC1FSU87CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRU5PU1lTOworCX0KKworCXJldHVybiBhdXRvc3cgJiAxOworfQorCitzdGF0aWMgaW50IHZpZGVvX2F1dG9zd19zZXQoaW50IGVuYWJsZSkKK3sKKwlpZiAoIWFjcGlfZXZhbGYodmlkX2hhbmRsZSwgTlVMTCwgIl9ET1MiLCAidmQiLCAoZW5hYmxlKT8gMSA6IDApKQorCQlyZXR1cm4gLUVJTzsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2aWRlb19vdXRwdXRzd19jeWNsZSh2b2lkKQoreworCWludCBhdXRvc3cgPSB2aWRlb19hdXRvc3dfZ2V0KCk7CisJaW50IHJlczsKKworCWlmIChhdXRvc3cgPCAwKQorCQlyZXR1cm4gYXV0b3N3OworCisJc3dpdGNoICh2aWRlb19zdXBwb3J0ZWQpIHsKKwljYXNlIFRQQUNQSV9WSURFT181NzA6CisJCXJlcyA9IHZpZGVvX2F1dG9zd19zZXQoMSk7CisJCWlmIChyZXMpCisJCQlyZXR1cm4gcmVzOworCQlyZXMgPSBhY3BpX2V2YWxmKGVjX2hhbmRsZSwgTlVMTCwgIl9RMTYiLCAidiIpOworCQlicmVhazsKKwljYXNlIFRQQUNQSV9WSURFT183NzA6CisJY2FzZSBUUEFDUElfVklERU9fTkVXOgorCQlyZXMgPSB2aWRlb19hdXRvc3dfc2V0KDEpOworCQlpZiAocmVzKQorCQkJcmV0dXJuIHJlczsKKwkJcmVzID0gYWNwaV9ldmFsZih2aWRfaGFuZGxlLCBOVUxMLCAiVlNXVCIsICJ2Iik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRU5PU1lTOworCX0KKwlpZiAoIWF1dG9zdyAmJiB2aWRlb19hdXRvc3dfc2V0KGF1dG9zdykpIHsKKwkJcHJpbnRrKFRQQUNQSV9FUlIKKwkJICAgICAgICJ2aWRlbyBhdXRvLXN3aXRjaCBsZWZ0IGVuYWJsZWQgZHVlIHRvIGVycm9yXG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJcmV0dXJuIChyZXMpPyAwIDogLUVJTzsKK30KKworc3RhdGljIGludCB2aWRlb19leHBhbmRfdG9nZ2xlKHZvaWQpCit7CisJc3dpdGNoICh2aWRlb19zdXBwb3J0ZWQpIHsKKwljYXNlIFRQQUNQSV9WSURFT181NzA6CisJCXJldHVybiBhY3BpX2V2YWxmKGVjX2hhbmRsZSwgTlVMTCwgIl9RMTciLCAidiIpPworCQkJMCA6IC1FSU87CisJY2FzZSBUUEFDUElfVklERU9fNzcwOgorCQlyZXR1cm4gYWNwaV9ldmFsZih2aWRfaGFuZGxlLCBOVUxMLCAiVkVYUCIsICJ2Iik/CisJCQkwIDogLUVJTzsKKwljYXNlIFRQQUNQSV9WSURFT19ORVc6CisJCXJldHVybiBhY3BpX2V2YWxmKE5VTEwsIE5VTEwsICJcXFZFWFAiLCAidiIpPworCQkJMCA6IC1FSU87CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FTk9TWVM7CisJfQorCS8qIG5vdCByZWFjaGVkICovCit9CisKK3N0YXRpYyBpbnQgdmlkZW9fcmVhZChjaGFyICpwKQoreworCWludCBzdGF0dXMsIGF1dG9zdzsKKwlpbnQgbGVuID0gMDsKKworCWlmICh2aWRlb19zdXBwb3J0ZWQgPT0gVFBBQ1BJX1ZJREVPX05PTkUpIHsKKwkJbGVuICs9IHNwcmludGYocCArIGxlbiwgInN0YXR1czpcdFx0bm90IHN1cHBvcnRlZFxuIik7CisJCXJldHVybiBsZW47CisJfQorCisJc3RhdHVzID0gdmlkZW9fb3V0cHV0c3dfZ2V0KCk7CisJaWYgKHN0YXR1cyA8IDApCisJCXJldHVybiBzdGF0dXM7CisKKwlhdXRvc3cgPSB2aWRlb19hdXRvc3dfZ2V0KCk7CisJaWYgKGF1dG9zdyA8IDApCisJCXJldHVybiBhdXRvc3c7CisKKwlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAic3RhdHVzOlx0XHRzdXBwb3J0ZWRcbiIpOworCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICJsY2Q6XHRcdCVzXG4iLCBlbmFibGVkKHN0YXR1cywgMCkpOworCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICJjcnQ6XHRcdCVzXG4iLCBlbmFibGVkKHN0YXR1cywgMSkpOworCWlmICh2aWRlb19zdXBwb3J0ZWQgPT0gVFBBQ1BJX1ZJREVPX05FVykKKwkJbGVuICs9IHNwcmludGYocCArIGxlbiwgImR2aTpcdFx0JXNcbiIsIGVuYWJsZWQoc3RhdHVzLCAzKSk7CisJbGVuICs9IHNwcmludGYocCArIGxlbiwgImF1dG86XHRcdCVzXG4iLCBlbmFibGVkKGF1dG9zdywgMCkpOworCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICJjb21tYW5kczpcdGxjZF9lbmFibGUsIGxjZF9kaXNhYmxlXG4iKTsKKwlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAiY29tbWFuZHM6XHRjcnRfZW5hYmxlLCBjcnRfZGlzYWJsZVxuIik7CisJaWYgKHZpZGVvX3N1cHBvcnRlZCA9PSBUUEFDUElfVklERU9fTkVXKQorCQlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAiY29tbWFuZHM6XHRkdmlfZW5hYmxlLCBkdmlfZGlzYWJsZVxuIik7CisJbGVuICs9IHNwcmludGYocCArIGxlbiwgImNvbW1hbmRzOlx0YXV0b19lbmFibGUsIGF1dG9fZGlzYWJsZVxuIik7CisJbGVuICs9IHNwcmludGYocCArIGxlbiwgImNvbW1hbmRzOlx0dmlkZW9fc3dpdGNoLCBleHBhbmRfdG9nZ2xlXG4iKTsKKworCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyBpbnQgdmlkZW9fd3JpdGUoY2hhciAqYnVmKQoreworCWNoYXIgKmNtZDsKKwlpbnQgZW5hYmxlLCBkaXNhYmxlLCBzdGF0dXM7CisJaW50IHJlczsKKworCWlmICh2aWRlb19zdXBwb3J0ZWQgPT0gVFBBQ1BJX1ZJREVPX05PTkUpCisJCXJldHVybiAtRU5PREVWOworCisJZW5hYmxlID0gMDsKKwlkaXNhYmxlID0gMDsKKworCXdoaWxlICgoY21kID0gbmV4dF9jbWQoJmJ1ZikpKSB7CisJCWlmIChzdHJsZW5jbXAoY21kLCAibGNkX2VuYWJsZSIpID09IDApIHsKKwkJCWVuYWJsZSB8PSBUUF9BQ1BJX1ZJREVPX1NfTENEOworCQl9IGVsc2UgaWYgKHN0cmxlbmNtcChjbWQsICJsY2RfZGlzYWJsZSIpID09IDApIHsKKwkJCWRpc2FibGUgfD0gVFBfQUNQSV9WSURFT19TX0xDRDsKKwkJfSBlbHNlIGlmIChzdHJsZW5jbXAoY21kLCAiY3J0X2VuYWJsZSIpID09IDApIHsKKwkJCWVuYWJsZSB8PSBUUF9BQ1BJX1ZJREVPX1NfQ1JUOworCQl9IGVsc2UgaWYgKHN0cmxlbmNtcChjbWQsICJjcnRfZGlzYWJsZSIpID09IDApIHsKKwkJCWRpc2FibGUgfD0gVFBfQUNQSV9WSURFT19TX0NSVDsKKwkJfSBlbHNlIGlmICh2aWRlb19zdXBwb3J0ZWQgPT0gVFBBQ1BJX1ZJREVPX05FVyAmJgorCQkJICAgc3RybGVuY21wKGNtZCwgImR2aV9lbmFibGUiKSA9PSAwKSB7CisJCQllbmFibGUgfD0gVFBfQUNQSV9WSURFT19TX0RWSTsKKwkJfSBlbHNlIGlmICh2aWRlb19zdXBwb3J0ZWQgPT0gVFBBQ1BJX1ZJREVPX05FVyAmJgorCQkJICAgc3RybGVuY21wKGNtZCwgImR2aV9kaXNhYmxlIikgPT0gMCkgeworCQkJZGlzYWJsZSB8PSBUUF9BQ1BJX1ZJREVPX1NfRFZJOworCQl9IGVsc2UgaWYgKHN0cmxlbmNtcChjbWQsICJhdXRvX2VuYWJsZSIpID09IDApIHsKKwkJCXJlcyA9IHZpZGVvX2F1dG9zd19zZXQoMSk7CisJCQlpZiAocmVzKQorCQkJCXJldHVybiByZXM7CisJCX0gZWxzZSBpZiAoc3RybGVuY21wKGNtZCwgImF1dG9fZGlzYWJsZSIpID09IDApIHsKKwkJCXJlcyA9IHZpZGVvX2F1dG9zd19zZXQoMCk7CisJCQlpZiAocmVzKQorCQkJCXJldHVybiByZXM7CisJCX0gZWxzZSBpZiAoc3RybGVuY21wKGNtZCwgInZpZGVvX3N3aXRjaCIpID09IDApIHsKKwkJCXJlcyA9IHZpZGVvX291dHB1dHN3X2N5Y2xlKCk7CisJCQlpZiAocmVzKQorCQkJCXJldHVybiByZXM7CisJCX0gZWxzZSBpZiAoc3RybGVuY21wKGNtZCwgImV4cGFuZF90b2dnbGUiKSA9PSAwKSB7CisJCQlyZXMgPSB2aWRlb19leHBhbmRfdG9nZ2xlKCk7CisJCQlpZiAocmVzKQorCQkJCXJldHVybiByZXM7CisJCX0gZWxzZQorCQkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKGVuYWJsZSB8fCBkaXNhYmxlKSB7CisJCXN0YXR1cyA9IHZpZGVvX291dHB1dHN3X2dldCgpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCXJldHVybiBzdGF0dXM7CisJCXJlcyA9IHZpZGVvX291dHB1dHN3X3NldCgoc3RhdHVzICYgfmRpc2FibGUpIHwgZW5hYmxlKTsKKwkJaWYgKHJlcykKKwkJCXJldHVybiByZXM7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaWJtX3N0cnVjdCB2aWRlb19kcml2ZXJfZGF0YSA9IHsKKwkubmFtZSA9ICJ2aWRlbyIsCisJLnJlYWQgPSB2aWRlb19yZWFkLAorCS53cml0ZSA9IHZpZGVvX3dyaXRlLAorCS5leGl0ID0gdmlkZW9fZXhpdCwKK307CisKKyNlbmRpZiAvKiBDT05GSUdfVEhJTktQQURfQUNQSV9WSURFTyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTGlnaHQgKHRoaW5rbGlnaHQpIHN1YmRyaXZlcgorICovCisKK1RQQUNQSV9IQU5ETEUobGdodCwgcm9vdCwgIlxcTEdIVCIpOwkvKiBBMjFlLCBBMnhtL3AsIFQyMC0yMiwgWDIwLTIxICovCitUUEFDUElfSEFORExFKGxlZGIsIGVjLCAiTEVEQiIpOwkJLyogRzR4ICovCisKK3N0YXRpYyBpbnQgbGlnaHRfZ2V0X3N0YXR1cyh2b2lkKQoreworCWludCBzdGF0dXMgPSAwOworCisJaWYgKHRwX2ZlYXR1cmVzLmxpZ2h0X3N0YXR1cykgeworCQlpZiAoIWFjcGlfZXZhbGYoZWNfaGFuZGxlLCAmc3RhdHVzLCAiS0JMVCIsICJkIikpCisJCQlyZXR1cm4gLUVJTzsKKwkJcmV0dXJuICghIXN0YXR1cyk7CisJfQorCisJcmV0dXJuIC1FTlhJTzsKK30KKworc3RhdGljIGludCBsaWdodF9zZXRfc3RhdHVzKGludCBzdGF0dXMpCit7CisJaW50IHJjOworCisJaWYgKHRwX2ZlYXR1cmVzLmxpZ2h0KSB7CisJCWlmIChjbW9zX2hhbmRsZSkgeworCQkJcmMgPSBhY3BpX2V2YWxmKGNtb3NfaGFuZGxlLCBOVUxMLCBOVUxMLCAidmQiLAorCQkJCQkoc3RhdHVzKT8KKwkJCQkJCVRQX0NNT1NfVEhJTktMSUdIVF9PTiA6CisJCQkJCQlUUF9DTU9TX1RISU5LTElHSFRfT0ZGKTsKKwkJfSBlbHNlIHsKKwkJCXJjID0gYWNwaV9ldmFsZihsZ2h0X2hhbmRsZSwgTlVMTCwgTlVMTCwgInZkIiwKKwkJCQkJKHN0YXR1cyk/IDEgOiAwKTsKKwkJfQorCQlyZXR1cm4gKHJjKT8gMCA6IC1FSU87CisJfQorCisJcmV0dXJuIC1FTlhJTzsKK30KKworc3RhdGljIHZvaWQgbGlnaHRfc2V0X3N0YXR1c193b3JrZXIoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCB0cGFjcGlfbGVkX2NsYXNzZGV2ICpkYXRhID0KKwkJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgdHBhY3BpX2xlZF9jbGFzc2Rldiwgd29yayk7CisKKwlpZiAobGlrZWx5KHRwYWNwaV9saWZlY3ljbGUgPT0gVFBBQ1BJX0xJRkVfUlVOTklORykpCisJCWxpZ2h0X3NldF9zdGF0dXMoKGRhdGEtPm5ld19icmlnaHRuZXNzICE9IExFRF9PRkYpKTsKK30KKworc3RhdGljIHZvaWQgbGlnaHRfc3lzZnNfc2V0KHN0cnVjdCBsZWRfY2xhc3NkZXYgKmxlZF9jZGV2LAorCQkJZW51bSBsZWRfYnJpZ2h0bmVzcyBicmlnaHRuZXNzKQoreworCXN0cnVjdCB0cGFjcGlfbGVkX2NsYXNzZGV2ICpkYXRhID0KKwkJY29udGFpbmVyX29mKGxlZF9jZGV2LAorCQkJICAgICBzdHJ1Y3QgdHBhY3BpX2xlZF9jbGFzc2RldiwKKwkJCSAgICAgbGVkX2NsYXNzZGV2KTsKKwlkYXRhLT5uZXdfYnJpZ2h0bmVzcyA9IGJyaWdodG5lc3M7CisJcXVldWVfd29yayh0cGFjcGlfd3EsICZkYXRhLT53b3JrKTsKK30KKworc3RhdGljIGVudW0gbGVkX2JyaWdodG5lc3MgbGlnaHRfc3lzZnNfZ2V0KHN0cnVjdCBsZWRfY2xhc3NkZXYgKmxlZF9jZGV2KQoreworCXJldHVybiAobGlnaHRfZ2V0X3N0YXR1cygpID09IDEpPyBMRURfRlVMTCA6IExFRF9PRkY7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdHBhY3BpX2xlZF9jbGFzc2RldiB0cGFjcGlfbGVkX3RoaW5rbGlnaHQgPSB7CisJLmxlZF9jbGFzc2RldiA9IHsKKwkJLm5hbWUJCT0gInRwYWNwaTo6dGhpbmtsaWdodCIsCisJCS5icmlnaHRuZXNzX3NldAk9ICZsaWdodF9zeXNmc19zZXQsCisJCS5icmlnaHRuZXNzX2dldAk9ICZsaWdodF9zeXNmc19nZXQsCisJfQorfTsKKworc3RhdGljIGludCBfX2luaXQgbGlnaHRfaW5pdChzdHJ1Y3QgaWJtX2luaXRfc3RydWN0ICppaWJtKQoreworCWludCByYzsKKworCXZkYmdfcHJpbnRrKFRQQUNQSV9EQkdfSU5JVCwgImluaXRpYWxpemluZyBsaWdodCBzdWJkcml2ZXJcbiIpOworCisJVFBBQ1BJX0FDUElIQU5ETEVfSU5JVChsZWRiKTsKKwlUUEFDUElfQUNQSUhBTkRMRV9JTklUKGxnaHQpOworCVRQQUNQSV9BQ1BJSEFORExFX0lOSVQoY21vcyk7CisJSU5JVF9XT1JLKCZ0cGFjcGlfbGVkX3RoaW5rbGlnaHQud29yaywgbGlnaHRfc2V0X3N0YXR1c193b3JrZXIpOworCisJLyogbGlnaHQgbm90IHN1cHBvcnRlZCBvbiA1NzAsIDYwMGUveCwgNzcwZSwgNzcweCwgRzR4LCBSMzAsIFIzMSAqLworCXRwX2ZlYXR1cmVzLmxpZ2h0ID0gKGNtb3NfaGFuZGxlIHx8IGxnaHRfaGFuZGxlKSAmJiAhbGVkYl9oYW5kbGU7CisKKwlpZiAodHBfZmVhdHVyZXMubGlnaHQpCisJCS8qIGxpZ2h0IHN0YXR1cyBub3Qgc3VwcG9ydGVkIG9uCisJCSAgIDU3MCwgNjAwZS94LCA3NzBlLCA3NzB4LCBHNHgsIFIzMCwgUjMxLCBSMzIsIFgyMCAqLworCQl0cF9mZWF0dXJlcy5saWdodF9zdGF0dXMgPQorCQkJYWNwaV9ldmFsZihlY19oYW5kbGUsIE5VTEwsICJLQkxUIiwgInF2Iik7CisKKwl2ZGJnX3ByaW50ayhUUEFDUElfREJHX0lOSVQsICJsaWdodCBpcyAlcywgbGlnaHQgc3RhdHVzIGlzICVzXG4iLAorCQlzdHJfc3VwcG9ydGVkKHRwX2ZlYXR1cmVzLmxpZ2h0KSwKKwkJc3RyX3N1cHBvcnRlZCh0cF9mZWF0dXJlcy5saWdodF9zdGF0dXMpKTsKKworCWlmICghdHBfZmVhdHVyZXMubGlnaHQpCisJCXJldHVybiAxOworCisJcmMgPSBsZWRfY2xhc3NkZXZfcmVnaXN0ZXIoJnRwYWNwaV9wZGV2LT5kZXYsCisJCQkJICAgJnRwYWNwaV9sZWRfdGhpbmtsaWdodC5sZWRfY2xhc3NkZXYpOworCisJaWYgKHJjIDwgMCkgeworCQl0cF9mZWF0dXJlcy5saWdodCA9IDA7CisJCXRwX2ZlYXR1cmVzLmxpZ2h0X3N0YXR1cyA9IDA7CisJfSBlbHNlICB7CisJCXJjID0gMDsKKwl9CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyB2b2lkIGxpZ2h0X2V4aXQodm9pZCkKK3sKKwlsZWRfY2xhc3NkZXZfdW5yZWdpc3RlcigmdHBhY3BpX2xlZF90aGlua2xpZ2h0LmxlZF9jbGFzc2Rldik7CisJaWYgKHdvcmtfcGVuZGluZygmdHBhY3BpX2xlZF90aGlua2xpZ2h0LndvcmspKQorCQlmbHVzaF93b3JrcXVldWUodHBhY3BpX3dxKTsKK30KKworc3RhdGljIGludCBsaWdodF9yZWFkKGNoYXIgKnApCit7CisJaW50IGxlbiA9IDA7CisJaW50IHN0YXR1czsKKworCWlmICghdHBfZmVhdHVyZXMubGlnaHQpIHsKKwkJbGVuICs9IHNwcmludGYocCArIGxlbiwgInN0YXR1czpcdFx0bm90IHN1cHBvcnRlZFxuIik7CisJfSBlbHNlIGlmICghdHBfZmVhdHVyZXMubGlnaHRfc3RhdHVzKSB7CisJCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICJzdGF0dXM6XHRcdHVua25vd25cbiIpOworCQlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAiY29tbWFuZHM6XHRvbiwgb2ZmXG4iKTsKKwl9IGVsc2UgeworCQlzdGF0dXMgPSBsaWdodF9nZXRfc3RhdHVzKCk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJcmV0dXJuIHN0YXR1czsKKwkJbGVuICs9IHNwcmludGYocCArIGxlbiwgInN0YXR1czpcdFx0JXNcbiIsIG9ub2ZmKHN0YXR1cywgMCkpOworCQlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAiY29tbWFuZHM6XHRvbiwgb2ZmXG4iKTsKKwl9CisKKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgaW50IGxpZ2h0X3dyaXRlKGNoYXIgKmJ1ZikKK3sKKwljaGFyICpjbWQ7CisJaW50IG5ld3N0YXR1cyA9IDA7CisKKwlpZiAoIXRwX2ZlYXR1cmVzLmxpZ2h0KQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXdoaWxlICgoY21kID0gbmV4dF9jbWQoJmJ1ZikpKSB7CisJCWlmIChzdHJsZW5jbXAoY21kLCAib24iKSA9PSAwKSB7CisJCQluZXdzdGF0dXMgPSAxOworCQl9IGVsc2UgaWYgKHN0cmxlbmNtcChjbWQsICJvZmYiKSA9PSAwKSB7CisJCQluZXdzdGF0dXMgPSAwOworCQl9IGVsc2UKKwkJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiBsaWdodF9zZXRfc3RhdHVzKG5ld3N0YXR1cyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaWJtX3N0cnVjdCBsaWdodF9kcml2ZXJfZGF0YSA9IHsKKwkubmFtZSA9ICJsaWdodCIsCisJLnJlYWQgPSBsaWdodF9yZWFkLAorCS53cml0ZSA9IGxpZ2h0X3dyaXRlLAorCS5leGl0ID0gbGlnaHRfZXhpdCwKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBEb2NrIHN1YmRyaXZlcgorICovCisKKyNpZmRlZiBDT05GSUdfVEhJTktQQURfQUNQSV9ET0NLCisKK3N0YXRpYyB2b2lkIGRvY2tfbm90aWZ5KHN0cnVjdCBpYm1fc3RydWN0ICppYm0sIHUzMiBldmVudCk7CitzdGF0aWMgaW50IGRvY2tfcmVhZChjaGFyICpwKTsKK3N0YXRpYyBpbnQgZG9ja193cml0ZShjaGFyICpidWYpOworCitUUEFDUElfSEFORExFKGRvY2ssIHJvb3QsICJcXF9TQi5HRENLIiwJLyogWDMwLCBYMzEsIFg0MCAqLworCSAgICJcXF9TQi5QQ0kwLkRPQ0siLAkvKiA2MDBlL3gsNzcwZSw3NzB4LEEyeG0vcCxUMjAtMjIsWDIwLTIxICovCisJICAgIlxcX1NCLlBDSTAuUENJMS5ET0NLIiwJLyogYWxsIG90aGVycyAqLworCSAgICJcXF9TQi5QQ0kuSVNBLlNMQ0UiLAkvKiA1NzAgKi8KKyAgICApOwkJCQkvKiBBMjFlLEc0eCxSMzAsUjMxLFIzMixSNDAsUjQwZSxSNTBlICovCisKKy8qIGRvbid0IGxpc3Qgb3RoZXIgYWx0ZXJuYXRpdmVzIGFzIHdlIGluc3RhbGwgYSBub3RpZnkgaGFuZGxlciBvbiB0aGUgNTcwICovCitUUEFDUElfSEFORExFKHBjaSwgcm9vdCwgIlxcX1NCLlBDSSIpOwkvKiA1NzAgKi8KKworc3RhdGljIGNvbnN0IHN0cnVjdCBhY3BpX2RldmljZV9pZCBpYm1fcGNpX2RldmljZV9pZHNbXSA9IHsKKwl7UENJX1JPT1RfSElEX1NUUklORywgMH0sCisJeyIiLCAwfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgdHBfYWNwaV9kcnZfc3RydWN0IGlibV9kb2NrX2FjcGlkcml2ZXJbMl0gPSB7CisJeworCSAubm90aWZ5ID0gZG9ja19ub3RpZnksCisJIC5oYW5kbGUgPSAmZG9ja19oYW5kbGUsCisJIC50eXBlID0gQUNQSV9TWVNURU1fTk9USUZZLAorCX0sCisJeworCS8qIFRISVMgT05FIE1VU1QgTkVWRVIgQkUgVVNFRCBGT1IgRFJJVkVSIEFVVE9MT0FESU5HLgorCSAqIFdlIGp1c3QgdXNlIGl0IHRvIGdldCBub3RpZmljYXRpb25zIG9mIGRvY2sgaG90cGx1ZworCSAqIGluIHZlcnkgb2xkIHRoaW5rcGFkcyAqLworCSAuaGlkID0gaWJtX3BjaV9kZXZpY2VfaWRzLAorCSAubm90aWZ5ID0gZG9ja19ub3RpZnksCisJIC5oYW5kbGUgPSAmcGNpX2hhbmRsZSwKKwkgLnR5cGUgPSBBQ1BJX1NZU1RFTV9OT1RJRlksCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgaWJtX3N0cnVjdCBkb2NrX2RyaXZlcl9kYXRhWzJdID0geworCXsKKwkgLm5hbWUgPSAiZG9jayIsCisJIC5yZWFkID0gZG9ja19yZWFkLAorCSAud3JpdGUgPSBkb2NrX3dyaXRlLAorCSAuYWNwaSA9ICZpYm1fZG9ja19hY3BpZHJpdmVyWzBdLAorCX0sCisJeworCSAubmFtZSA9ICJkb2NrIiwKKwkgLmFjcGkgPSAmaWJtX2RvY2tfYWNwaWRyaXZlclsxXSwKKwl9LAorfTsKKworI2RlZmluZSBkb2NrX2RvY2tlZCgpIChfc3RhKGRvY2tfaGFuZGxlKSAmIDEpCisKK3N0YXRpYyBpbnQgX19pbml0IGRvY2tfaW5pdChzdHJ1Y3QgaWJtX2luaXRfc3RydWN0ICppaWJtKQoreworCXZkYmdfcHJpbnRrKFRQQUNQSV9EQkdfSU5JVCwgImluaXRpYWxpemluZyBkb2NrIHN1YmRyaXZlclxuIik7CisKKwlUUEFDUElfQUNQSUhBTkRMRV9JTklUKGRvY2spOworCisJdmRiZ19wcmludGsoVFBBQ1BJX0RCR19JTklULCAiZG9jayBpcyAlc1xuIiwKKwkJc3RyX3N1cHBvcnRlZChkb2NrX2hhbmRsZSAhPSBOVUxMKSk7CisKKwlyZXR1cm4gKGRvY2tfaGFuZGxlKT8gMCA6IDE7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGRvY2tfaW5pdDIoc3RydWN0IGlibV9pbml0X3N0cnVjdCAqaWlibSkKK3sKKwlpbnQgZG9jazJfbmVlZGVkOworCisJdmRiZ19wcmludGsoVFBBQ1BJX0RCR19JTklULCAiaW5pdGlhbGl6aW5nIGRvY2sgc3ViZHJpdmVyIHBhcnQgMlxuIik7CisKKwlpZiAoZG9ja19kcml2ZXJfZGF0YVswXS5mbGFncy5hY3BpX2RyaXZlcl9yZWdpc3RlcmVkICYmCisJICAgIGRvY2tfZHJpdmVyX2RhdGFbMF0uZmxhZ3MuYWNwaV9ub3RpZnlfaW5zdGFsbGVkKSB7CisJCVRQQUNQSV9BQ1BJSEFORExFX0lOSVQocGNpKTsKKwkJZG9jazJfbmVlZGVkID0gKHBjaV9oYW5kbGUgIT0gTlVMTCk7CisJCXZkYmdfcHJpbnRrKFRQQUNQSV9EQkdfSU5JVCwKKwkJCSAgICAiZG9jayBQQ0kgaGFuZGxlciBmb3IgdGhlIFRQIDU3MCBpcyAlc1xuIiwKKwkJCSAgICBzdHJfc3VwcG9ydGVkKGRvY2syX25lZWRlZCkpOworCX0gZWxzZSB7CisJCXZkYmdfcHJpbnRrKFRQQUNQSV9EQkdfSU5JVCwKKwkJImRvY2sgc3ViZHJpdmVyIHBhcnQgMiBub3QgcmVxdWlyZWRcbiIpOworCQlkb2NrMl9uZWVkZWQgPSAwOworCX0KKworCXJldHVybiAoZG9jazJfbmVlZGVkKT8gMCA6IDE7Cit9CisKK3N0YXRpYyB2b2lkIGRvY2tfbm90aWZ5KHN0cnVjdCBpYm1fc3RydWN0ICppYm0sIHUzMiBldmVudCkKK3sKKwlpbnQgZG9ja2VkID0gZG9ja19kb2NrZWQoKTsKKwlpbnQgcGNpID0gaWJtLT5hY3BpLT5oaWQgJiYgaWJtLT5hY3BpLT5kZXZpY2UgJiYKKwkJYWNwaV9tYXRjaF9kZXZpY2VfaWRzKGlibS0+YWNwaS0+ZGV2aWNlLCBpYm1fcGNpX2RldmljZV9pZHMpOworCWludCBkYXRhOworCisJaWYgKGV2ZW50ID09IDEgJiYgIXBjaSkJLyogNTcwICovCisJCWRhdGEgPSAxOwkvKiBidXR0b24gKi8KKwllbHNlIGlmIChldmVudCA9PSAxICYmIHBjaSkJLyogNTcwICovCisJCWRhdGEgPSAzOwkvKiBkb2NrICovCisJZWxzZSBpZiAoZXZlbnQgPT0gMyAmJiBkb2NrZWQpCisJCWRhdGEgPSAxOwkvKiBidXR0b24gKi8KKwllbHNlIGlmIChldmVudCA9PSAzICYmICFkb2NrZWQpCisJCWRhdGEgPSAyOwkvKiB1bmRvY2sgKi8KKwllbHNlIGlmIChldmVudCA9PSAwICYmIGRvY2tlZCkKKwkJZGF0YSA9IDM7CS8qIGRvY2sgKi8KKwllbHNlIHsKKwkJcHJpbnRrKFRQQUNQSV9FUlIgInVua25vd24gZG9jayBldmVudCAlZCwgc3RhdHVzICVkXG4iLAorCQkgICAgICAgZXZlbnQsIF9zdGEoZG9ja19oYW5kbGUpKTsKKwkJZGF0YSA9IDA7CS8qIHVua25vd24gKi8KKwl9CisJYWNwaV9idXNfZ2VuZXJhdGVfcHJvY19ldmVudChpYm0tPmFjcGktPmRldmljZSwgZXZlbnQsIGRhdGEpOworCWFjcGlfYnVzX2dlbmVyYXRlX25ldGxpbmtfZXZlbnQoaWJtLT5hY3BpLT5kZXZpY2UtPnBucC5kZXZpY2VfY2xhc3MsCisJCQkJCSAgZGV2X25hbWUoJmlibS0+YWNwaS0+ZGV2aWNlLT5kZXYpLAorCQkJCQkgIGV2ZW50LCBkYXRhKTsKK30KKworc3RhdGljIGludCBkb2NrX3JlYWQoY2hhciAqcCkKK3sKKwlpbnQgbGVuID0gMDsKKwlpbnQgZG9ja2VkID0gZG9ja19kb2NrZWQoKTsKKworCWlmICghZG9ja19oYW5kbGUpCisJCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICJzdGF0dXM6XHRcdG5vdCBzdXBwb3J0ZWRcbiIpOworCWVsc2UgaWYgKCFkb2NrZWQpCisJCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICJzdGF0dXM6XHRcdHVuZG9ja2VkXG4iKTsKKwllbHNlIHsKKwkJbGVuICs9IHNwcmludGYocCArIGxlbiwgInN0YXR1czpcdFx0ZG9ja2VkXG4iKTsKKwkJbGVuICs9IHNwcmludGYocCArIGxlbiwgImNvbW1hbmRzOlx0ZG9jaywgdW5kb2NrXG4iKTsKKwl9CisKKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgaW50IGRvY2tfd3JpdGUoY2hhciAqYnVmKQoreworCWNoYXIgKmNtZDsKKworCWlmICghZG9ja19kb2NrZWQoKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwl3aGlsZSAoKGNtZCA9IG5leHRfY21kKCZidWYpKSkgeworCQlpZiAoc3RybGVuY21wKGNtZCwgInVuZG9jayIpID09IDApIHsKKwkJCWlmICghYWNwaV9ldmFsZihkb2NrX2hhbmRsZSwgTlVMTCwgIl9EQ0siLCAidmQiLCAwKSB8fAorCQkJICAgICFhY3BpX2V2YWxmKGRvY2tfaGFuZGxlLCBOVUxMLCAiX0VKMCIsICJ2ZCIsIDEpKQorCQkJCXJldHVybiAtRUlPOworCQl9IGVsc2UgaWYgKHN0cmxlbmNtcChjbWQsICJkb2NrIikgPT0gMCkgeworCQkJaWYgKCFhY3BpX2V2YWxmKGRvY2tfaGFuZGxlLCBOVUxMLCAiX0RDSyIsICJ2ZCIsIDEpKQorCQkJCXJldHVybiAtRUlPOworCQl9IGVsc2UKKwkJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCisjZW5kaWYgLyogQ09ORklHX1RISU5LUEFEX0FDUElfRE9DSyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQmF5IHN1YmRyaXZlcgorICovCisKKyNpZmRlZiBDT05GSUdfVEhJTktQQURfQUNQSV9CQVkKKworVFBBQ1BJX0hBTkRMRShiYXksIHJvb3QsICJcXF9TQi5QQ0kuSURFLlNFQ04uTUFTVCIsCS8qIDU3MCAqLworCSAgICJcXF9TQi5QQ0kwLklERTAuSURFUy5JRFNNIiwJLyogNjAwZS94LCA3NzBlLCA3NzB4ICovCisJICAgIlxcX1NCLlBDSTAuU0FUQS5TQ05ELk1TVFIiLAkvKiBUNjAsIFg2MCwgWjYwICovCisJICAgIlxcX1NCLlBDSTAuSURFMC5TQ05ELk1TVFIiLAkvKiBhbGwgb3RoZXJzICovCisJICAgKTsJCQkJLyogQTIxZSwgUjMwLCBSMzEgKi8KK1RQQUNQSV9IQU5ETEUoYmF5X2VqLCBiYXksICJfRUozIiwJLyogNjAwZS94LCBBMnhtL3AsIEEzeCAqLworCSAgICJfRUowIiwJCS8qIGFsbCBvdGhlcnMgKi8KKwkgICApOwkJCS8qIDU3MCxBMjFlLEc0eCxSMzAsUjMxLFIzMixSNDBlLFI1MGUgKi8KK1RQQUNQSV9IQU5ETEUoYmF5Miwgcm9vdCwgIlxcX1NCLlBDSTAuSURFMC5QUklNLlNMQVYiLAkvKiBBM3gsIFIzMiAqLworCSAgICJcXF9TQi5QQ0kwLklERTAuSURFUC5JRFBTIiwJLyogNjAwZS94LCA3NzBlLCA3NzB4ICovCisJICAgKTsJCQkJLyogYWxsIG90aGVycyAqLworVFBBQ1BJX0hBTkRMRShiYXkyX2VqLCBiYXkyLCAiX0VKMyIsCS8qIDYwMGUveCwgNzcwZSwgQTN4ICovCisJICAgIl9FSjAiLAkJCS8qIDc3MHggKi8KKwkgICApOwkJCQkvKiBhbGwgb3RoZXJzICovCisKK3N0YXRpYyBpbnQgX19pbml0IGJheV9pbml0KHN0cnVjdCBpYm1faW5pdF9zdHJ1Y3QgKmlpYm0pCit7CisJdmRiZ19wcmludGsoVFBBQ1BJX0RCR19JTklULCAiaW5pdGlhbGl6aW5nIGJheSBzdWJkcml2ZXJcbiIpOworCisJVFBBQ1BJX0FDUElIQU5ETEVfSU5JVChiYXkpOworCWlmIChiYXlfaGFuZGxlKQorCQlUUEFDUElfQUNQSUhBTkRMRV9JTklUKGJheV9laik7CisJVFBBQ1BJX0FDUElIQU5ETEVfSU5JVChiYXkyKTsKKwlpZiAoYmF5Ml9oYW5kbGUpCisJCVRQQUNQSV9BQ1BJSEFORExFX0lOSVQoYmF5Ml9laik7CisKKwl0cF9mZWF0dXJlcy5iYXlfc3RhdHVzID0gYmF5X2hhbmRsZSAmJgorCQlhY3BpX2V2YWxmKGJheV9oYW5kbGUsIE5VTEwsICJfU1RBIiwgInF2Iik7CisJdHBfZmVhdHVyZXMuYmF5X3N0YXR1czIgPSBiYXkyX2hhbmRsZSAmJgorCQlhY3BpX2V2YWxmKGJheTJfaGFuZGxlLCBOVUxMLCAiX1NUQSIsICJxdiIpOworCisJdHBfZmVhdHVyZXMuYmF5X2VqZWN0ID0gYmF5X2hhbmRsZSAmJiBiYXlfZWpfaGFuZGxlICYmCisJCShzdHJsZW5jbXAoYmF5X2VqX3BhdGgsICJfRUowIikgPT0gMCB8fCBleHBlcmltZW50YWwpOworCXRwX2ZlYXR1cmVzLmJheV9lamVjdDIgPSBiYXkyX2hhbmRsZSAmJiBiYXkyX2VqX2hhbmRsZSAmJgorCQkoc3RybGVuY21wKGJheTJfZWpfcGF0aCwgIl9FSjAiKSA9PSAwIHx8IGV4cGVyaW1lbnRhbCk7CisKKwl2ZGJnX3ByaW50ayhUUEFDUElfREJHX0lOSVQsCisJCSJiYXkgMTogc3RhdHVzICVzLCBlamVjdCAlczsgYmF5IDI6IHN0YXR1cyAlcywgZWplY3QgJXNcbiIsCisJCXN0cl9zdXBwb3J0ZWQodHBfZmVhdHVyZXMuYmF5X3N0YXR1cyksCisJCXN0cl9zdXBwb3J0ZWQodHBfZmVhdHVyZXMuYmF5X2VqZWN0KSwKKwkJc3RyX3N1cHBvcnRlZCh0cF9mZWF0dXJlcy5iYXlfc3RhdHVzMiksCisJCXN0cl9zdXBwb3J0ZWQodHBfZmVhdHVyZXMuYmF5X2VqZWN0MikpOworCisJcmV0dXJuICh0cF9mZWF0dXJlcy5iYXlfc3RhdHVzIHx8IHRwX2ZlYXR1cmVzLmJheV9lamVjdCB8fAorCQl0cF9mZWF0dXJlcy5iYXlfc3RhdHVzMiB8fCB0cF9mZWF0dXJlcy5iYXlfZWplY3QyKT8gMCA6IDE7Cit9CisKK3N0YXRpYyB2b2lkIGJheV9ub3RpZnkoc3RydWN0IGlibV9zdHJ1Y3QgKmlibSwgdTMyIGV2ZW50KQoreworCWFjcGlfYnVzX2dlbmVyYXRlX3Byb2NfZXZlbnQoaWJtLT5hY3BpLT5kZXZpY2UsIGV2ZW50LCAwKTsKKwlhY3BpX2J1c19nZW5lcmF0ZV9uZXRsaW5rX2V2ZW50KGlibS0+YWNwaS0+ZGV2aWNlLT5wbnAuZGV2aWNlX2NsYXNzLAorCQkJCQkgIGRldl9uYW1lKCZpYm0tPmFjcGktPmRldmljZS0+ZGV2KSwKKwkJCQkJICBldmVudCwgMCk7Cit9CisKKyNkZWZpbmUgYmF5X29jY3VwaWVkKGIpIChfc3RhKGIjI19oYW5kbGUpICYgMSkKKworc3RhdGljIGludCBiYXlfcmVhZChjaGFyICpwKQoreworCWludCBsZW4gPSAwOworCWludCBvY2N1cGllZCA9IGJheV9vY2N1cGllZChiYXkpOworCWludCBvY2N1cGllZDIgPSBiYXlfb2NjdXBpZWQoYmF5Mik7CisJaW50IGVqZWN0LCBlamVjdDI7CisKKwlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAic3RhdHVzOlx0XHQlc1xuIiwKKwkJdHBfZmVhdHVyZXMuYmF5X3N0YXR1cyA/CisJCQkob2NjdXBpZWQgPyAib2NjdXBpZWQiIDogInVub2NjdXBpZWQiKSA6CisJCQkJIm5vdCBzdXBwb3J0ZWQiKTsKKwlpZiAodHBfZmVhdHVyZXMuYmF5X3N0YXR1czIpCisJCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICJzdGF0dXMyOlx0JXNcbiIsIG9jY3VwaWVkMiA/CisJCQkgICAgICAgIm9jY3VwaWVkIiA6ICJ1bm9jY3VwaWVkIik7CisKKwllamVjdCA9IHRwX2ZlYXR1cmVzLmJheV9lamVjdCAmJiBvY2N1cGllZDsKKwllamVjdDIgPSB0cF9mZWF0dXJlcy5iYXlfZWplY3QyICYmIG9jY3VwaWVkMjsKKworCWlmIChlamVjdCAmJiBlamVjdDIpCisJCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICJjb21tYW5kczpcdGVqZWN0LCBlamVjdDJcbiIpOworCWVsc2UgaWYgKGVqZWN0KQorCQlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAiY29tbWFuZHM6XHRlamVjdFxuIik7CisJZWxzZSBpZiAoZWplY3QyKQorCQlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAiY29tbWFuZHM6XHRlamVjdDJcbiIpOworCisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIGludCBiYXlfd3JpdGUoY2hhciAqYnVmKQoreworCWNoYXIgKmNtZDsKKworCWlmICghdHBfZmVhdHVyZXMuYmF5X2VqZWN0ICYmICF0cF9mZWF0dXJlcy5iYXlfZWplY3QyKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXdoaWxlICgoY21kID0gbmV4dF9jbWQoJmJ1ZikpKSB7CisJCWlmICh0cF9mZWF0dXJlcy5iYXlfZWplY3QgJiYgc3RybGVuY21wKGNtZCwgImVqZWN0IikgPT0gMCkgeworCQkJaWYgKCFhY3BpX2V2YWxmKGJheV9lal9oYW5kbGUsIE5VTEwsIE5VTEwsICJ2ZCIsIDEpKQorCQkJCXJldHVybiAtRUlPOworCQl9IGVsc2UgaWYgKHRwX2ZlYXR1cmVzLmJheV9lamVjdDIgJiYKKwkJCSAgIHN0cmxlbmNtcChjbWQsICJlamVjdDIiKSA9PSAwKSB7CisJCQlpZiAoIWFjcGlfZXZhbGYoYmF5Ml9lal9oYW5kbGUsIE5VTEwsIE5VTEwsICJ2ZCIsIDEpKQorCQkJCXJldHVybiAtRUlPOworCQl9IGVsc2UKKwkJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHRwX2FjcGlfZHJ2X3N0cnVjdCBpYm1fYmF5X2FjcGlkcml2ZXIgPSB7CisJLm5vdGlmeSA9IGJheV9ub3RpZnksCisJLmhhbmRsZSA9ICZiYXlfaGFuZGxlLAorCS50eXBlID0gQUNQSV9TWVNURU1fTk9USUZZLAorfTsKKworc3RhdGljIHN0cnVjdCBpYm1fc3RydWN0IGJheV9kcml2ZXJfZGF0YSA9IHsKKwkubmFtZSA9ICJiYXkiLAorCS5yZWFkID0gYmF5X3JlYWQsCisJLndyaXRlID0gYmF5X3dyaXRlLAorCS5hY3BpID0gJmlibV9iYXlfYWNwaWRyaXZlciwKK307CisKKyNlbmRpZiAvKiBDT05GSUdfVEhJTktQQURfQUNQSV9CQVkgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENNT1Mgc3ViZHJpdmVyCisgKi8KKworLyogc3lzZnMgY21vc19jb21tYW5kIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitzdGF0aWMgc3NpemVfdCBjbW9zX2NvbW1hbmRfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAorCQkJICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXVuc2lnbmVkIGxvbmcgY21vc19jbWQ7CisJaW50IHJlczsKKworCWlmIChwYXJzZV9zdHJ0b3VsKGJ1ZiwgMjEsICZjbW9zX2NtZCkpCisJCXJldHVybiAtRUlOVkFMOworCisJcmVzID0gaXNzdWVfdGhpbmtwYWRfY21vc19jb21tYW5kKGNtb3NfY21kKTsKKwlyZXR1cm4gKHJlcyk/IHJlcyA6IGNvdW50OworfQorCitzdGF0aWMgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgZGV2X2F0dHJfY21vc19jb21tYW5kID0KKwlfX0FUVFIoY21vc19jb21tYW5kLCBTX0lXVVNSLCBOVUxMLCBjbW9zX2NvbW1hbmRfc3RvcmUpOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGludCBfX2luaXQgY21vc19pbml0KHN0cnVjdCBpYm1faW5pdF9zdHJ1Y3QgKmlpYm0pCit7CisJaW50IHJlczsKKworCXZkYmdfcHJpbnRrKFRQQUNQSV9EQkdfSU5JVCwKKwkJImluaXRpYWxpemluZyBjbW9zIGNvbW1hbmRzIHN1YmRyaXZlclxuIik7CisKKwlUUEFDUElfQUNQSUhBTkRMRV9JTklUKGNtb3MpOworCisJdmRiZ19wcmludGsoVFBBQ1BJX0RCR19JTklULCAiY21vcyBjb21tYW5kcyBhcmUgJXNcbiIsCisJCXN0cl9zdXBwb3J0ZWQoY21vc19oYW5kbGUgIT0gTlVMTCkpOworCisJcmVzID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZ0cGFjcGlfcGRldi0+ZGV2LCAmZGV2X2F0dHJfY21vc19jb21tYW5kKTsKKwlpZiAocmVzKQorCQlyZXR1cm4gcmVzOworCisJcmV0dXJuIChjbW9zX2hhbmRsZSk/IDAgOiAxOworfQorCitzdGF0aWMgdm9pZCBjbW9zX2V4aXQodm9pZCkKK3sKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoJnRwYWNwaV9wZGV2LT5kZXYsICZkZXZfYXR0cl9jbW9zX2NvbW1hbmQpOworfQorCitzdGF0aWMgaW50IGNtb3NfcmVhZChjaGFyICpwKQoreworCWludCBsZW4gPSAwOworCisJLyogY21vcyBub3Qgc3VwcG9ydGVkIG9uIDU3MCwgNjAwZS94LCA3NzBlLCA3NzB4LCBBMjFlLCBBMnhtL3AsCisJICAgUjMwLCBSMzEsIFQyMC0yMiwgWDIwLTIxICovCisJaWYgKCFjbW9zX2hhbmRsZSkKKwkJbGVuICs9IHNwcmludGYocCArIGxlbiwgInN0YXR1czpcdFx0bm90IHN1cHBvcnRlZFxuIik7CisJZWxzZSB7CisJCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICJzdGF0dXM6XHRcdHN1cHBvcnRlZFxuIik7CisJCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICJjb21tYW5kczpcdDxjbWQ+ICg8Y21kPiBpcyAwLTIxKVxuIik7CisJfQorCisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIGludCBjbW9zX3dyaXRlKGNoYXIgKmJ1ZikKK3sKKwljaGFyICpjbWQ7CisJaW50IGNtb3NfY21kLCByZXM7CisKKwl3aGlsZSAoKGNtZCA9IG5leHRfY21kKCZidWYpKSkgeworCQlpZiAoc3NjYW5mKGNtZCwgIiV1IiwgJmNtb3NfY21kKSA9PSAxICYmCisJCSAgICBjbW9zX2NtZCA+PSAwICYmIGNtb3NfY21kIDw9IDIxKSB7CisJCQkvKiBjbW9zX2NtZCBzZXQgKi8KKwkJfSBlbHNlCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlyZXMgPSBpc3N1ZV90aGlua3BhZF9jbW9zX2NvbW1hbmQoY21vc19jbWQpOworCQlpZiAocmVzKQorCQkJcmV0dXJuIHJlczsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBpYm1fc3RydWN0IGNtb3NfZHJpdmVyX2RhdGEgPSB7CisJLm5hbWUgPSAiY21vcyIsCisJLnJlYWQgPSBjbW9zX3JlYWQsCisJLndyaXRlID0gY21vc193cml0ZSwKKwkuZXhpdCA9IGNtb3NfZXhpdCwKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBMRUQgc3ViZHJpdmVyCisgKi8KKworZW51bSBsZWRfYWNjZXNzX21vZGUgeworCVRQQUNQSV9MRURfTk9ORSA9IDAsCisJVFBBQ1BJX0xFRF81NzAsCS8qIDU3MCAqLworCVRQQUNQSV9MRURfT0xELAkvKiA2MDBlL3gsIDc3MGUsIDc3MHgsIEEyMWUsIEEyeG0vcCwgVDIwLTIyLCBYMjAtMjEgKi8KKwlUUEFDUElfTEVEX05FVywJLyogYWxsIG90aGVycyAqLworfTsKKworZW51bSB7CS8qIEZvciBUUEFDUElfTEVEX09MRCAqLworCVRQQUNQSV9MRURfRUNfSExDTCA9IDB4MGMsCS8qIEVDIHJlZyB0byBnZXQgbGVkIHRvIHBvd2VyIG9uICovCisJVFBBQ1BJX0xFRF9FQ19ITEJMID0gMHgwZCwJLyogRUMgcmVnIHRvIGJsaW5rIGEgbGl0IGxlZCAqLworCVRQQUNQSV9MRURfRUNfSExNUyA9IDB4MGUsCS8qIEVDIHJlZyB0byBzZWxlY3QgbGVkIHRvIGNvbW1hbmQgKi8KK307CisKK2VudW0gbGVkX3N0YXR1c190IHsKKwlUUEFDUElfTEVEX09GRiA9IDAsCisJVFBBQ1BJX0xFRF9PTiwKKwlUUEFDUElfTEVEX0JMSU5LLAorfTsKKworc3RhdGljIGVudW0gbGVkX2FjY2Vzc19tb2RlIGxlZF9zdXBwb3J0ZWQ7CisKK1RQQUNQSV9IQU5ETEUobGVkLCBlYywgIlNMRUQiLAkvKiA1NzAgKi8KKwkgICAiU1lTTCIsCQkvKiA2MDBlL3gsIDc3MGUsIDc3MHgsIEEyMWUsIEEyeG0vcCwgKi8KKwkJCQkvKiBUMjAtMjIsIFgyMC0yMSAqLworCSAgICJMRUQiLAkJLyogYWxsIG90aGVycyAqLworCSAgICk7CQkJLyogUjMwLCBSMzEgKi8KKworI2RlZmluZSBUUEFDUElfTEVEX05VTUxFRFMgOAorc3RhdGljIHN0cnVjdCB0cGFjcGlfbGVkX2NsYXNzZGV2ICp0cGFjcGlfbGVkczsKK3N0YXRpYyBlbnVtIGxlZF9zdGF0dXNfdCB0cGFjcGlfbGVkX3N0YXRlX2NhY2hlW1RQQUNQSV9MRURfTlVNTEVEU107CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHRwYWNwaV9sZWRfbmFtZXNbVFBBQ1BJX0xFRF9OVU1MRURTXSA9IHsKKwkvKiB0aGVyZSdzIGEgbGltaXQgb2YgMTkgY2hhcnMgKyBOVUxMIGJlZm9yZSAyLjYuMjYgKi8KKwkidHBhY3BpOjpwb3dlciIsCisJInRwYWNwaTpvcmFuZ2U6YmF0dCIsCisJInRwYWNwaTpncmVlbjpiYXR0IiwKKwkidHBhY3BpOjpkb2NrX2FjdGl2ZSIsCisJInRwYWNwaTo6YmF5X2FjdGl2ZSIsCisJInRwYWNwaTo6ZG9ja19iYXR0IiwKKwkidHBhY3BpOjp1bmtub3duX2xlZCIsCisJInRwYWNwaTo6c3RhbmRieSIsCit9OworCitzdGF0aWMgaW50IGxlZF9nZXRfc3RhdHVzKGNvbnN0IHVuc2lnbmVkIGludCBsZWQpCit7CisJaW50IHN0YXR1czsKKwllbnVtIGxlZF9zdGF0dXNfdCBsZWRfczsKKworCXN3aXRjaCAobGVkX3N1cHBvcnRlZCkgeworCWNhc2UgVFBBQ1BJX0xFRF81NzA6CisJCWlmICghYWNwaV9ldmFsZihlY19oYW5kbGUsCisJCQkJJnN0YXR1cywgIkdMRUQiLCAiZGQiLCAxIDw8IGxlZCkpCisJCQlyZXR1cm4gLUVJTzsKKwkJbGVkX3MgPSAoc3RhdHVzID09IDApPworCQkJCVRQQUNQSV9MRURfT0ZGIDoKKwkJCQkoKHN0YXR1cyA9PSAxKT8KKwkJCQkJVFBBQ1BJX0xFRF9PTiA6CisJCQkJCVRQQUNQSV9MRURfQkxJTkspOworCQl0cGFjcGlfbGVkX3N0YXRlX2NhY2hlW2xlZF0gPSBsZWRfczsKKwkJcmV0dXJuIGxlZF9zOworCWRlZmF1bHQ6CisJCXJldHVybiAtRU5YSU87CisJfQorCisJLyogbm90IHJlYWNoZWQgKi8KK30KKworc3RhdGljIGludCBsZWRfc2V0X3N0YXR1cyhjb25zdCB1bnNpZ25lZCBpbnQgbGVkLAorCQkJICBjb25zdCBlbnVtIGxlZF9zdGF0dXNfdCBsZWRzdGF0dXMpCit7CisJLyogb2ZmLCBvbiwgYmxpbmsuIEluZGV4IGlzIGxlZF9zdGF0dXNfdCAqLworCXN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbGVkX3NsZWRfYXJnMVtdID0geyAwLCAxLCAzIH07CisJc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBsZWRfbGVkX2FyZzFbXSA9IHsgMCwgMHg4MCwgMHhjMCB9OworCisJaW50IHJjID0gMDsKKworCXN3aXRjaCAobGVkX3N1cHBvcnRlZCkgeworCWNhc2UgVFBBQ1BJX0xFRF81NzA6CisJCS8qIDU3MCAqLworCQlpZiAobGVkID4gNykKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZiAoIWFjcGlfZXZhbGYobGVkX2hhbmRsZSwgTlVMTCwgTlVMTCwgInZkZCIsCisJCQkJKDEgPDwgbGVkKSwgbGVkX3NsZWRfYXJnMVtsZWRzdGF0dXNdKSkKKwkJCXJjID0gLUVJTzsKKwkJYnJlYWs7CisJY2FzZSBUUEFDUElfTEVEX09MRDoKKwkJLyogNjAwZS94LCA3NzBlLCA3NzB4LCBBMjFlLCBBMnhtL3AsIFQyMC0yMiwgWDIwICovCisJCWlmIChsZWQgPiA3KQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCXJjID0gZWNfd3JpdGUoVFBBQ1BJX0xFRF9FQ19ITE1TLCAoMSA8PCBsZWQpKTsKKwkJaWYgKHJjID49IDApCisJCQlyYyA9IGVjX3dyaXRlKFRQQUNQSV9MRURfRUNfSExCTCwKKwkJCQkgICAgICAobGVkc3RhdHVzID09IFRQQUNQSV9MRURfQkxJTkspIDw8IGxlZCk7CisJCWlmIChyYyA+PSAwKQorCQkJcmMgPSBlY193cml0ZShUUEFDUElfTEVEX0VDX0hMQ0wsCisJCQkJICAgICAgKGxlZHN0YXR1cyAhPSBUUEFDUElfTEVEX09GRikgPDwgbGVkKTsKKwkJYnJlYWs7CisJY2FzZSBUUEFDUElfTEVEX05FVzoKKwkJLyogYWxsIG90aGVycyAqLworCQlpZiAoIWFjcGlfZXZhbGYobGVkX2hhbmRsZSwgTlVMTCwgTlVMTCwgInZkZCIsCisJCQkJbGVkLCBsZWRfbGVkX2FyZzFbbGVkc3RhdHVzXSkpCisJCQlyYyA9IC1FSU87CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJjID0gLUVOWElPOworCX0KKworCWlmICghcmMpCisJCXRwYWNwaV9sZWRfc3RhdGVfY2FjaGVbbGVkXSA9IGxlZHN0YXR1czsKKworCXJldHVybiByYzsKK30KKworc3RhdGljIHZvaWQgbGVkX3N5c2ZzX3NldF9zdGF0dXModW5zaWduZWQgaW50IGxlZCwKKwkJCQkgZW51bSBsZWRfYnJpZ2h0bmVzcyBicmlnaHRuZXNzKQoreworCWxlZF9zZXRfc3RhdHVzKGxlZCwKKwkJCShicmlnaHRuZXNzID09IExFRF9PRkYpID8KKwkJCVRQQUNQSV9MRURfT0ZGIDoKKwkJCSh0cGFjcGlfbGVkX3N0YXRlX2NhY2hlW2xlZF0gPT0gVFBBQ1BJX0xFRF9CTElOSykgPworCQkJCVRQQUNQSV9MRURfQkxJTksgOiBUUEFDUElfTEVEX09OKTsKK30KKworc3RhdGljIHZvaWQgbGVkX3NldF9zdGF0dXNfd29ya2VyKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgdHBhY3BpX2xlZF9jbGFzc2RldiAqZGF0YSA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgdHBhY3BpX2xlZF9jbGFzc2Rldiwgd29yayk7CisKKwlpZiAobGlrZWx5KHRwYWNwaV9saWZlY3ljbGUgPT0gVFBBQ1BJX0xJRkVfUlVOTklORykpCisJCWxlZF9zeXNmc19zZXRfc3RhdHVzKGRhdGEtPmxlZCwgZGF0YS0+bmV3X2JyaWdodG5lc3MpOworfQorCitzdGF0aWMgdm9pZCBsZWRfc3lzZnNfc2V0KHN0cnVjdCBsZWRfY2xhc3NkZXYgKmxlZF9jZGV2LAorCQkJZW51bSBsZWRfYnJpZ2h0bmVzcyBicmlnaHRuZXNzKQoreworCXN0cnVjdCB0cGFjcGlfbGVkX2NsYXNzZGV2ICpkYXRhID0gY29udGFpbmVyX29mKGxlZF9jZGV2LAorCQkJICAgICBzdHJ1Y3QgdHBhY3BpX2xlZF9jbGFzc2RldiwgbGVkX2NsYXNzZGV2KTsKKworCWRhdGEtPm5ld19icmlnaHRuZXNzID0gYnJpZ2h0bmVzczsKKwlxdWV1ZV93b3JrKHRwYWNwaV93cSwgJmRhdGEtPndvcmspOworfQorCitzdGF0aWMgaW50IGxlZF9zeXNmc19ibGlua19zZXQoc3RydWN0IGxlZF9jbGFzc2RldiAqbGVkX2NkZXYsCisJCQl1bnNpZ25lZCBsb25nICpkZWxheV9vbiwgdW5zaWduZWQgbG9uZyAqZGVsYXlfb2ZmKQoreworCXN0cnVjdCB0cGFjcGlfbGVkX2NsYXNzZGV2ICpkYXRhID0gY29udGFpbmVyX29mKGxlZF9jZGV2LAorCQkJICAgICBzdHJ1Y3QgdHBhY3BpX2xlZF9jbGFzc2RldiwgbGVkX2NsYXNzZGV2KTsKKworCS8qIENhbiB3ZSBjaG9vc2UgdGhlIGZsYXNoIHJhdGU/ICovCisJaWYgKCpkZWxheV9vbiA9PSAwICYmICpkZWxheV9vZmYgPT0gMCkgeworCQkvKiB5ZXMuIHNldCB0aGVtIHRvIHRoZSBoYXJkd2FyZSBibGluayByYXRlICgxIEh6KSAqLworCQkqZGVsYXlfb24gPSA1MDA7IC8qIG1zICovCisJCSpkZWxheV9vZmYgPSA1MDA7IC8qIG1zICovCisJfSBlbHNlIGlmICgoKmRlbGF5X29uICE9IDUwMCkgfHwgKCpkZWxheV9vZmYgIT0gNTAwKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlkYXRhLT5uZXdfYnJpZ2h0bmVzcyA9IFRQQUNQSV9MRURfQkxJTks7CisJcXVldWVfd29yayh0cGFjcGlfd3EsICZkYXRhLT53b3JrKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgZW51bSBsZWRfYnJpZ2h0bmVzcyBsZWRfc3lzZnNfZ2V0KHN0cnVjdCBsZWRfY2xhc3NkZXYgKmxlZF9jZGV2KQoreworCWludCByYzsKKworCXN0cnVjdCB0cGFjcGlfbGVkX2NsYXNzZGV2ICpkYXRhID0gY29udGFpbmVyX29mKGxlZF9jZGV2LAorCQkJICAgICBzdHJ1Y3QgdHBhY3BpX2xlZF9jbGFzc2RldiwgbGVkX2NsYXNzZGV2KTsKKworCXJjID0gbGVkX2dldF9zdGF0dXMoZGF0YS0+bGVkKTsKKworCWlmIChyYyA9PSBUUEFDUElfTEVEX09GRiB8fCByYyA8IDApCisJCXJjID0gTEVEX09GRjsJLyogbm8gZXJyb3IgaGFuZGxpbmcgaW4gbGVkIGNsYXNzIDooICovCisJZWxzZQorCQlyYyA9IExFRF9GVUxMOworCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgdm9pZCBsZWRfZXhpdCh2b2lkKQoreworCXVuc2lnbmVkIGludCBpOworCisJZm9yIChpID0gMDsgaSA8IFRQQUNQSV9MRURfTlVNTEVEUzsgaSsrKSB7CisJCWlmICh0cGFjcGlfbGVkc1tpXS5sZWRfY2xhc3NkZXYubmFtZSkKKwkJCWxlZF9jbGFzc2Rldl91bnJlZ2lzdGVyKCZ0cGFjcGlfbGVkc1tpXS5sZWRfY2xhc3NkZXYpOworCX0KKworCWtmcmVlKHRwYWNwaV9sZWRzKTsKK30KKworc3RhdGljIGludCBfX2luaXQgbGVkX2luaXQoc3RydWN0IGlibV9pbml0X3N0cnVjdCAqaWlibSkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwlpbnQgcmM7CisKKwl2ZGJnX3ByaW50ayhUUEFDUElfREJHX0lOSVQsICJpbml0aWFsaXppbmcgTEVEIHN1YmRyaXZlclxuIik7CisKKwlUUEFDUElfQUNQSUhBTkRMRV9JTklUKGxlZCk7CisKKwlpZiAoIWxlZF9oYW5kbGUpCisJCS8qIGxlZCBub3Qgc3VwcG9ydGVkIG9uIFIzMCwgUjMxICovCisJCWxlZF9zdXBwb3J0ZWQgPSBUUEFDUElfTEVEX05PTkU7CisJZWxzZSBpZiAoc3RybGVuY21wKGxlZF9wYXRoLCAiU0xFRCIpID09IDApCisJCS8qIDU3MCAqLworCQlsZWRfc3VwcG9ydGVkID0gVFBBQ1BJX0xFRF81NzA7CisJZWxzZSBpZiAoc3RybGVuY21wKGxlZF9wYXRoLCAiU1lTTCIpID09IDApCisJCS8qIDYwMGUveCwgNzcwZSwgNzcweCwgQTIxZSwgQTJ4bS9wLCBUMjAtMjIsIFgyMC0yMSAqLworCQlsZWRfc3VwcG9ydGVkID0gVFBBQ1BJX0xFRF9PTEQ7CisJZWxzZQorCQkvKiBhbGwgb3RoZXJzICovCisJCWxlZF9zdXBwb3J0ZWQgPSBUUEFDUElfTEVEX05FVzsKKworCXZkYmdfcHJpbnRrKFRQQUNQSV9EQkdfSU5JVCwgIkxFRCBjb21tYW5kcyBhcmUgJXMsIG1vZGUgJWRcbiIsCisJCXN0cl9zdXBwb3J0ZWQobGVkX3N1cHBvcnRlZCksIGxlZF9zdXBwb3J0ZWQpOworCisJdHBhY3BpX2xlZHMgPSBremFsbG9jKHNpemVvZigqdHBhY3BpX2xlZHMpICogVFBBQ1BJX0xFRF9OVU1MRURTLAorCQkJICAgICAgR0ZQX0tFUk5FTCk7CisJaWYgKCF0cGFjcGlfbGVkcykgeworCQlwcmludGsoVFBBQ1BJX0VSUiAiT3V0IG9mIG1lbW9yeSBmb3IgTEVEIGRhdGFcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgVFBBQ1BJX0xFRF9OVU1MRURTOyBpKyspIHsKKwkJdHBhY3BpX2xlZHNbaV0ubGVkID0gaTsKKworCQl0cGFjcGlfbGVkc1tpXS5sZWRfY2xhc3NkZXYuYnJpZ2h0bmVzc19zZXQgPSAmbGVkX3N5c2ZzX3NldDsKKwkJdHBhY3BpX2xlZHNbaV0ubGVkX2NsYXNzZGV2LmJsaW5rX3NldCA9ICZsZWRfc3lzZnNfYmxpbmtfc2V0OworCQlpZiAobGVkX3N1cHBvcnRlZCA9PSBUUEFDUElfTEVEXzU3MCkKKwkJCXRwYWNwaV9sZWRzW2ldLmxlZF9jbGFzc2Rldi5icmlnaHRuZXNzX2dldCA9CisJCQkJCQkJJmxlZF9zeXNmc19nZXQ7CisKKwkJdHBhY3BpX2xlZHNbaV0ubGVkX2NsYXNzZGV2Lm5hbWUgPSB0cGFjcGlfbGVkX25hbWVzW2ldOworCisJCUlOSVRfV09SSygmdHBhY3BpX2xlZHNbaV0ud29yaywgbGVkX3NldF9zdGF0dXNfd29ya2VyKTsKKworCQlyYyA9IGxlZF9jbGFzc2Rldl9yZWdpc3RlcigmdHBhY3BpX3BkZXYtPmRldiwKKwkJCQkJICAgJnRwYWNwaV9sZWRzW2ldLmxlZF9jbGFzc2Rldik7CisJCWlmIChyYyA8IDApIHsKKwkJCXRwYWNwaV9sZWRzW2ldLmxlZF9jbGFzc2Rldi5uYW1lID0gTlVMTDsKKwkJCWxlZF9leGl0KCk7CisJCQlyZXR1cm4gcmM7CisJCX0KKwl9CisKKwlyZXR1cm4gKGxlZF9zdXBwb3J0ZWQgIT0gVFBBQ1BJX0xFRF9OT05FKT8gMCA6IDE7Cit9CisKKyNkZWZpbmUgc3RyX2xlZF9zdGF0dXMocykgXAorCSgocykgPT0gVFBBQ1BJX0xFRF9PRkYgPyAib2ZmIiA6IFwKKwkJKChzKSA9PSBUUEFDUElfTEVEX09OID8gIm9uIiA6ICJibGlua2luZyIpKQorCitzdGF0aWMgaW50IGxlZF9yZWFkKGNoYXIgKnApCit7CisJaW50IGxlbiA9IDA7CisKKwlpZiAoIWxlZF9zdXBwb3J0ZWQpIHsKKwkJbGVuICs9IHNwcmludGYocCArIGxlbiwgInN0YXR1czpcdFx0bm90IHN1cHBvcnRlZFxuIik7CisJCXJldHVybiBsZW47CisJfQorCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICJzdGF0dXM6XHRcdHN1cHBvcnRlZFxuIik7CisKKwlpZiAobGVkX3N1cHBvcnRlZCA9PSBUUEFDUElfTEVEXzU3MCkgeworCQkvKiA1NzAgKi8KKwkJaW50IGksIHN0YXR1czsKKwkJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworCQkJc3RhdHVzID0gbGVkX2dldF9zdGF0dXMoaSk7CisJCQlpZiAoc3RhdHVzIDwgMCkKKwkJCQlyZXR1cm4gLUVJTzsKKwkJCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICIlZDpcdFx0JXNcbiIsCisJCQkJICAgICAgIGksIHN0cl9sZWRfc3RhdHVzKHN0YXR1cykpOworCQl9CisJfQorCisJbGVuICs9IHNwcmludGYocCArIGxlbiwgImNvbW1hbmRzOlx0IgorCQkgICAgICAgIjxsZWQ+IG9uLCA8bGVkPiBvZmYsIDxsZWQ+IGJsaW5rICg8bGVkPiBpcyAwLTcpXG4iKTsKKworCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyBpbnQgbGVkX3dyaXRlKGNoYXIgKmJ1ZikKK3sKKwljaGFyICpjbWQ7CisJaW50IGxlZCwgcmM7CisJZW51bSBsZWRfc3RhdHVzX3QgczsKKworCWlmICghbGVkX3N1cHBvcnRlZCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwl3aGlsZSAoKGNtZCA9IG5leHRfY21kKCZidWYpKSkgeworCQlpZiAoc3NjYW5mKGNtZCwgIiVkIiwgJmxlZCkgIT0gMSB8fCBsZWQgPCAwIHx8IGxlZCA+IDcpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlpZiAoc3Ryc3RyKGNtZCwgIm9mZiIpKSB7CisJCQlzID0gVFBBQ1BJX0xFRF9PRkY7CisJCX0gZWxzZSBpZiAoc3Ryc3RyKGNtZCwgIm9uIikpIHsKKwkJCXMgPSBUUEFDUElfTEVEX09OOworCQl9IGVsc2UgaWYgKHN0cnN0cihjbWQsICJibGluayIpKSB7CisJCQlzID0gVFBBQ1BJX0xFRF9CTElOSzsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJcmMgPSBsZWRfc2V0X3N0YXR1cyhsZWQsIHMpOworCQlpZiAocmMgPCAwKQorCQkJcmV0dXJuIHJjOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGlibV9zdHJ1Y3QgbGVkX2RyaXZlcl9kYXRhID0geworCS5uYW1lID0gImxlZCIsCisJLnJlYWQgPSBsZWRfcmVhZCwKKwkud3JpdGUgPSBsZWRfd3JpdGUsCisJLmV4aXQgPSBsZWRfZXhpdCwKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBCZWVwIHN1YmRyaXZlcgorICovCisKK1RQQUNQSV9IQU5ETEUoYmVlcCwgZWMsICJCRUVQIik7CS8qIGFsbCBleGNlcHQgUjMwLCBSMzEgKi8KKworc3RhdGljIGludCBfX2luaXQgYmVlcF9pbml0KHN0cnVjdCBpYm1faW5pdF9zdHJ1Y3QgKmlpYm0pCit7CisJdmRiZ19wcmludGsoVFBBQ1BJX0RCR19JTklULCAiaW5pdGlhbGl6aW5nIGJlZXAgc3ViZHJpdmVyXG4iKTsKKworCVRQQUNQSV9BQ1BJSEFORExFX0lOSVQoYmVlcCk7CisKKwl2ZGJnX3ByaW50ayhUUEFDUElfREJHX0lOSVQsICJiZWVwIGlzICVzXG4iLAorCQlzdHJfc3VwcG9ydGVkKGJlZXBfaGFuZGxlICE9IE5VTEwpKTsKKworCXJldHVybiAoYmVlcF9oYW5kbGUpPyAwIDogMTsKK30KKworc3RhdGljIGludCBiZWVwX3JlYWQoY2hhciAqcCkKK3sKKwlpbnQgbGVuID0gMDsKKworCWlmICghYmVlcF9oYW5kbGUpCisJCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICJzdGF0dXM6XHRcdG5vdCBzdXBwb3J0ZWRcbiIpOworCWVsc2UgeworCQlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAic3RhdHVzOlx0XHRzdXBwb3J0ZWRcbiIpOworCQlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAiY29tbWFuZHM6XHQ8Y21kPiAoPGNtZD4gaXMgMC0xNylcbiIpOworCX0KKworCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyBpbnQgYmVlcF93cml0ZShjaGFyICpidWYpCit7CisJY2hhciAqY21kOworCWludCBiZWVwX2NtZDsKKworCWlmICghYmVlcF9oYW5kbGUpCisJCXJldHVybiAtRU5PREVWOworCisJd2hpbGUgKChjbWQgPSBuZXh0X2NtZCgmYnVmKSkpIHsKKwkJaWYgKHNzY2FuZihjbWQsICIldSIsICZiZWVwX2NtZCkgPT0gMSAmJgorCQkgICAgYmVlcF9jbWQgPj0gMCAmJiBiZWVwX2NtZCA8PSAxNykgeworCQkJLyogYmVlcF9jbWQgc2V0ICovCisJCX0gZWxzZQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmICghYWNwaV9ldmFsZihiZWVwX2hhbmRsZSwgTlVMTCwgTlVMTCwgInZkZCIsIGJlZXBfY21kLCAwKSkKKwkJCXJldHVybiAtRUlPOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGlibV9zdHJ1Y3QgYmVlcF9kcml2ZXJfZGF0YSA9IHsKKwkubmFtZSA9ICJiZWVwIiwKKwkucmVhZCA9IGJlZXBfcmVhZCwKKwkud3JpdGUgPSBiZWVwX3dyaXRlLAorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFRoZXJtYWwgc3ViZHJpdmVyCisgKi8KKworZW51bSB0aGVybWFsX2FjY2Vzc19tb2RlIHsKKwlUUEFDUElfVEhFUk1BTF9OT05FID0gMCwJLyogTm8gdGhlcm1hbCBzdXBwb3J0ICovCisJVFBBQ1BJX1RIRVJNQUxfQUNQSV9UTVAwNywJLyogVXNlIEFDUEkgVE1QMC03ICovCisJVFBBQ1BJX1RIRVJNQUxfQUNQSV9VUERULAkvKiBVc2UgQUNQSSBUTVAwLTcgd2l0aCBVUERUICovCisJVFBBQ1BJX1RIRVJNQUxfVFBFQ184LAkJLyogVXNlIEFDUEkgRUMgcmVncywgOCBzZW5zb3JzICovCisJVFBBQ1BJX1RIRVJNQUxfVFBFQ18xNiwJCS8qIFVzZSBBQ1BJIEVDIHJlZ3MsIDE2IHNlbnNvcnMgKi8KK307CisKK2VudW0geyAvKiBUUEFDUElfVEhFUk1BTF9UUEVDXyogKi8KKwlUUF9FQ19USEVSTUFMX1RNUDAgPSAweDc4LAkvKiBBQ1BJIEVDIHJlZ3MgVE1QIDAuLjcgKi8KKwlUUF9FQ19USEVSTUFMX1RNUDggPSAweEMwLAkvKiBBQ1BJIEVDIHJlZ3MgVE1QIDguLjE1ICovCisJVFBfRUNfVEhFUk1BTF9UTVBfTkEgPSAtMTI4LAkvKiBBQ1BJIEVDIHNlbnNvciBub3QgYXZhaWxhYmxlICovCit9OworCisjZGVmaW5lIFRQQUNQSV9NQVhfVEhFUk1BTF9TRU5TT1JTIDE2CS8qIE1heCB0aGVybWFsIHNlbnNvcnMgc3VwcG9ydGVkICovCitzdHJ1Y3QgaWJtX3RoZXJtYWxfc2Vuc29yc19zdHJ1Y3QgeworCXMzMiB0ZW1wW1RQQUNQSV9NQVhfVEhFUk1BTF9TRU5TT1JTXTsKK307CisKK3N0YXRpYyBlbnVtIHRoZXJtYWxfYWNjZXNzX21vZGUgdGhlcm1hbF9yZWFkX21vZGU7CisKKy8qIGlkeCBpcyB6ZXJvLWJhc2VkICovCitzdGF0aWMgaW50IHRoZXJtYWxfZ2V0X3NlbnNvcihpbnQgaWR4LCBzMzIgKnZhbHVlKQoreworCWludCB0OworCXM4IHRtcDsKKwljaGFyIHRtcGlbNV07CisKKwl0ID0gVFBfRUNfVEhFUk1BTF9UTVAwOworCisJc3dpdGNoICh0aGVybWFsX3JlYWRfbW9kZSkgeworI2lmIFRQQUNQSV9NQVhfVEhFUk1BTF9TRU5TT1JTID49IDE2CisJY2FzZSBUUEFDUElfVEhFUk1BTF9UUEVDXzE2OgorCQlpZiAoaWR4ID49IDggJiYgaWR4IDw9IDE1KSB7CisJCQl0ID0gVFBfRUNfVEhFUk1BTF9UTVA4OworCQkJaWR4IC09IDg7CisJCX0KKwkJLyogZmFsbHRocm91Z2ggKi8KKyNlbmRpZgorCWNhc2UgVFBBQ1BJX1RIRVJNQUxfVFBFQ184OgorCQlpZiAoaWR4IDw9IDcpIHsKKwkJCWlmICghYWNwaV9lY19yZWFkKHQgKyBpZHgsICZ0bXApKQorCQkJCXJldHVybiAtRUlPOworCQkJKnZhbHVlID0gdG1wICogMTAwMDsKKwkJCXJldHVybiAwOworCQl9CisJCWJyZWFrOworCisJY2FzZSBUUEFDUElfVEhFUk1BTF9BQ1BJX1VQRFQ6CisJCWlmIChpZHggPD0gNykgeworCQkJc25wcmludGYodG1waSwgc2l6ZW9mKHRtcGkpLCAiVE1QJWMiLCAnMCcgKyBpZHgpOworCQkJaWYgKCFhY3BpX2V2YWxmKGVjX2hhbmRsZSwgTlVMTCwgIlVQRFQiLCAidiIpKQorCQkJCXJldHVybiAtRUlPOworCQkJaWYgKCFhY3BpX2V2YWxmKGVjX2hhbmRsZSwgJnQsIHRtcGksICJkIikpCisJCQkJcmV0dXJuIC1FSU87CisJCQkqdmFsdWUgPSAodCAtIDI3MzIpICogMTAwOworCQkJcmV0dXJuIDA7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFRQQUNQSV9USEVSTUFMX0FDUElfVE1QMDc6CisJCWlmIChpZHggPD0gNykgeworCQkJc25wcmludGYodG1waSwgc2l6ZW9mKHRtcGkpLCAiVE1QJWMiLCAnMCcgKyBpZHgpOworCQkJaWYgKCFhY3BpX2V2YWxmKGVjX2hhbmRsZSwgJnQsIHRtcGksICJkIikpCisJCQkJcmV0dXJuIC1FSU87CisJCQlpZiAodCA+IDEyNyB8fCB0IDwgLTEyNykKKwkJCQl0ID0gVFBfRUNfVEhFUk1BTF9UTVBfTkE7CisJCQkqdmFsdWUgPSB0ICogMTAwMDsKKwkJCXJldHVybiAwOworCQl9CisJCWJyZWFrOworCisJY2FzZSBUUEFDUElfVEhFUk1BTF9OT05FOgorCWRlZmF1bHQ6CisJCXJldHVybiAtRU5PU1lTOworCX0KKworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgaW50IHRoZXJtYWxfZ2V0X3NlbnNvcnMoc3RydWN0IGlibV90aGVybWFsX3NlbnNvcnNfc3RydWN0ICpzKQoreworCWludCByZXMsIGk7CisJaW50IG47CisKKwluID0gODsKKwlpID0gMDsKKworCWlmICghcykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAodGhlcm1hbF9yZWFkX21vZGUgPT0gVFBBQ1BJX1RIRVJNQUxfVFBFQ18xNikKKwkJbiA9IDE2OworCisJZm9yIChpID0gMCA7IGkgPCBuOyBpKyspIHsKKwkJcmVzID0gdGhlcm1hbF9nZXRfc2Vuc29yKGksICZzLT50ZW1wW2ldKTsKKwkJaWYgKHJlcykKKwkJCXJldHVybiByZXM7CisJfQorCisJcmV0dXJuIG47Cit9CisKKy8qIHN5c2ZzIHRlbXAjI19pbnB1dCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgc3NpemVfdCB0aGVybWFsX3RlbXBfaW5wdXRfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGUgKnNlbnNvcl9hdHRyID0KKwkJCQkJdG9fc2Vuc29yX2Rldl9hdHRyKGF0dHIpOworCWludCBpZHggPSBzZW5zb3JfYXR0ci0+aW5kZXg7CisJczMyIHZhbHVlOworCWludCByZXM7CisKKwlyZXMgPSB0aGVybWFsX2dldF9zZW5zb3IoaWR4LCAmdmFsdWUpOworCWlmIChyZXMpCisJCXJldHVybiByZXM7CisJaWYgKHZhbHVlID09IFRQX0VDX1RIRVJNQUxfVE1QX05BICogMTAwMCkKKwkJcmV0dXJuIC1FTlhJTzsKKworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkXG4iLCB2YWx1ZSk7Cit9CisKKyNkZWZpbmUgVEhFUk1BTF9TRU5TT1JfQVRUUl9URU1QKF9pZHhBLCBfaWR4QikgXAorCSBTRU5TT1JfQVRUUih0ZW1wIyNfaWR4QSMjX2lucHV0LCBTX0lSVUdPLCBcCisJCSAgICAgdGhlcm1hbF90ZW1wX2lucHV0X3Nob3csIE5VTEwsIF9pZHhCKQorCitzdGF0aWMgc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlIHNlbnNvcl9kZXZfYXR0cl90aGVybWFsX3RlbXBfaW5wdXRbXSA9IHsKKwlUSEVSTUFMX1NFTlNPUl9BVFRSX1RFTVAoMSwgMCksCisJVEhFUk1BTF9TRU5TT1JfQVRUUl9URU1QKDIsIDEpLAorCVRIRVJNQUxfU0VOU09SX0FUVFJfVEVNUCgzLCAyKSwKKwlUSEVSTUFMX1NFTlNPUl9BVFRSX1RFTVAoNCwgMyksCisJVEhFUk1BTF9TRU5TT1JfQVRUUl9URU1QKDUsIDQpLAorCVRIRVJNQUxfU0VOU09SX0FUVFJfVEVNUCg2LCA1KSwKKwlUSEVSTUFMX1NFTlNPUl9BVFRSX1RFTVAoNywgNiksCisJVEhFUk1BTF9TRU5TT1JfQVRUUl9URU1QKDgsIDcpLAorCVRIRVJNQUxfU0VOU09SX0FUVFJfVEVNUCg5LCA4KSwKKwlUSEVSTUFMX1NFTlNPUl9BVFRSX1RFTVAoMTAsIDkpLAorCVRIRVJNQUxfU0VOU09SX0FUVFJfVEVNUCgxMSwgMTApLAorCVRIRVJNQUxfU0VOU09SX0FUVFJfVEVNUCgxMiwgMTEpLAorCVRIRVJNQUxfU0VOU09SX0FUVFJfVEVNUCgxMywgMTIpLAorCVRIRVJNQUxfU0VOU09SX0FUVFJfVEVNUCgxNCwgMTMpLAorCVRIRVJNQUxfU0VOU09SX0FUVFJfVEVNUCgxNSwgMTQpLAorCVRIRVJNQUxfU0VOU09SX0FUVFJfVEVNUCgxNiwgMTUpLAorfTsKKworI2RlZmluZSBUSEVSTUFMX0FUVFJTKFgpIFwKKwkmc2Vuc29yX2Rldl9hdHRyX3RoZXJtYWxfdGVtcF9pbnB1dFtYXS5kZXZfYXR0ci5hdHRyCisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICp0aGVybWFsX3RlbXBfaW5wdXRfYXR0cltdID0geworCVRIRVJNQUxfQVRUUlMoOCksCisJVEhFUk1BTF9BVFRSUyg5KSwKKwlUSEVSTUFMX0FUVFJTKDEwKSwKKwlUSEVSTUFMX0FUVFJTKDExKSwKKwlUSEVSTUFMX0FUVFJTKDEyKSwKKwlUSEVSTUFMX0FUVFJTKDEzKSwKKwlUSEVSTUFMX0FUVFJTKDE0KSwKKwlUSEVSTUFMX0FUVFJTKDE1KSwKKwlUSEVSTUFMX0FUVFJTKDApLAorCVRIRVJNQUxfQVRUUlMoMSksCisJVEhFUk1BTF9BVFRSUygyKSwKKwlUSEVSTUFMX0FUVFJTKDMpLAorCVRIRVJNQUxfQVRUUlMoNCksCisJVEhFUk1BTF9BVFRSUyg1KSwKKwlUSEVSTUFMX0FUVFJTKDYpLAorCVRIRVJNQUxfQVRUUlMoNyksCisJTlVMTAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgdGhlcm1hbF90ZW1wX2lucHV0MTZfZ3JvdXAgPSB7CisJLmF0dHJzID0gdGhlcm1hbF90ZW1wX2lucHV0X2F0dHIKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIHRoZXJtYWxfdGVtcF9pbnB1dDhfZ3JvdXAgPSB7CisJLmF0dHJzID0gJnRoZXJtYWxfdGVtcF9pbnB1dF9hdHRyWzhdCit9OworCisjdW5kZWYgVEhFUk1BTF9TRU5TT1JfQVRUUl9URU1QCisjdW5kZWYgVEhFUk1BTF9BVFRSUworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGludCBfX2luaXQgdGhlcm1hbF9pbml0KHN0cnVjdCBpYm1faW5pdF9zdHJ1Y3QgKmlpYm0pCit7CisJdTggdCwgdGExLCB0YTI7CisJaW50IGk7CisJaW50IGFjcGlfdG1wNzsKKwlpbnQgcmVzOworCisJdmRiZ19wcmludGsoVFBBQ1BJX0RCR19JTklULCAiaW5pdGlhbGl6aW5nIHRoZXJtYWwgc3ViZHJpdmVyXG4iKTsKKworCWFjcGlfdG1wNyA9IGFjcGlfZXZhbGYoZWNfaGFuZGxlLCBOVUxMLCAiVE1QNyIsICJxdiIpOworCisJaWYgKHRoaW5rcGFkX2lkLmVjX21vZGVsKSB7CisJCS8qCisJCSAqIERpcmVjdCBFQyBhY2Nlc3MgbW9kZTogc2Vuc29ycyBhdCByZWdpc3RlcnMKKwkJICogMHg3OC0weDdGLCAweEMwLTB4QzcuICBSZWdpc3RlcnMgcmV0dXJuIDB4MDAgZm9yCisJCSAqIG5vbi1pbXBsZW1lbnRlZCwgdGhlcm1hbCBzZW5zb3JzIHJldHVybiAweDgwIHdoZW4KKwkJICogbm90IGF2YWlsYWJsZQorCQkgKi8KKworCQl0YTEgPSB0YTIgPSAwOworCQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisJCQlpZiAoYWNwaV9lY19yZWFkKFRQX0VDX1RIRVJNQUxfVE1QMCArIGksICZ0KSkgeworCQkJCXRhMSB8PSB0OworCQkJfSBlbHNlIHsKKwkJCQl0YTEgPSAwOworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKGFjcGlfZWNfcmVhZChUUF9FQ19USEVSTUFMX1RNUDggKyBpLCAmdCkpIHsKKwkJCQl0YTIgfD0gdDsKKwkJCX0gZWxzZSB7CisJCQkJdGExID0gMDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpZiAodGExID09IDApIHsKKwkJCS8qIFRoaXMgaXMgc2hlZXIgcGFyYW5vaWEsIGJ1dCB3ZSBoYW5kbGUgaXQgYW55d2F5ICovCisJCQlpZiAoYWNwaV90bXA3KSB7CisJCQkJcHJpbnRrKFRQQUNQSV9FUlIKKwkJCQkgICAgICAgIlRoaW5rUGFkIEFDUEkgRUMgYWNjZXNzIG1pc2JlaGF2aW5nLCAiCisJCQkJICAgICAgICJmYWxsaW5nIGJhY2sgdG8gQUNQSSBUTVB4IGFjY2VzcyAiCisJCQkJICAgICAgICJtb2RlXG4iKTsKKwkJCQl0aGVybWFsX3JlYWRfbW9kZSA9IFRQQUNQSV9USEVSTUFMX0FDUElfVE1QMDc7CisJCQl9IGVsc2UgeworCQkJCXByaW50ayhUUEFDUElfRVJSCisJCQkJICAgICAgICJUaGlua1BhZCBBQ1BJIEVDIGFjY2VzcyBtaXNiZWhhdmluZywgIgorCQkJCSAgICAgICAiZGlzYWJsaW5nIHRoZXJtYWwgc2Vuc29ycyBhY2Nlc3NcbiIpOworCQkJCXRoZXJtYWxfcmVhZF9tb2RlID0gVFBBQ1BJX1RIRVJNQUxfTk9ORTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXRoZXJtYWxfcmVhZF9tb2RlID0KKwkJCSAgICAodGEyICE9IDApID8KKwkJCSAgICBUUEFDUElfVEhFUk1BTF9UUEVDXzE2IDogVFBBQ1BJX1RIRVJNQUxfVFBFQ184OworCQl9CisJfSBlbHNlIGlmIChhY3BpX3RtcDcpIHsKKwkJaWYgKGFjcGlfZXZhbGYoZWNfaGFuZGxlLCBOVUxMLCAiVVBEVCIsICJxdiIpKSB7CisJCQkvKiA2MDBlL3gsIDc3MGUsIDc3MHggKi8KKwkJCXRoZXJtYWxfcmVhZF9tb2RlID0gVFBBQ1BJX1RIRVJNQUxfQUNQSV9VUERUOworCQl9IGVsc2UgeworCQkJLyogU3RhbmRhcmQgQUNQSSBUTVB4IGFjY2VzcywgbWF4IDggc2Vuc29ycyAqLworCQkJdGhlcm1hbF9yZWFkX21vZGUgPSBUUEFDUElfVEhFUk1BTF9BQ1BJX1RNUDA3OworCQl9CisJfSBlbHNlIHsKKwkJLyogdGVtcGVyYXR1cmVzIG5vdCBzdXBwb3J0ZWQgb24gNTcwLCBHNHgsIFIzMCwgUjMxLCBSMzIgKi8KKwkJdGhlcm1hbF9yZWFkX21vZGUgPSBUUEFDUElfVEhFUk1BTF9OT05FOworCX0KKworCXZkYmdfcHJpbnRrKFRQQUNQSV9EQkdfSU5JVCwgInRoZXJtYWwgaXMgJXMsIG1vZGUgJWRcbiIsCisJCXN0cl9zdXBwb3J0ZWQodGhlcm1hbF9yZWFkX21vZGUgIT0gVFBBQ1BJX1RIRVJNQUxfTk9ORSksCisJCXRoZXJtYWxfcmVhZF9tb2RlKTsKKworCXN3aXRjaCAodGhlcm1hbF9yZWFkX21vZGUpIHsKKwljYXNlIFRQQUNQSV9USEVSTUFMX1RQRUNfMTY6CisJCXJlcyA9IHN5c2ZzX2NyZWF0ZV9ncm91cCgmdHBhY3BpX3NlbnNvcnNfcGRldi0+ZGV2LmtvYmosCisJCQkJJnRoZXJtYWxfdGVtcF9pbnB1dDE2X2dyb3VwKTsKKwkJaWYgKHJlcykKKwkJCXJldHVybiByZXM7CisJCWJyZWFrOworCWNhc2UgVFBBQ1BJX1RIRVJNQUxfVFBFQ184OgorCWNhc2UgVFBBQ1BJX1RIRVJNQUxfQUNQSV9UTVAwNzoKKwljYXNlIFRQQUNQSV9USEVSTUFMX0FDUElfVVBEVDoKKwkJcmVzID0gc3lzZnNfY3JlYXRlX2dyb3VwKCZ0cGFjcGlfc2Vuc29yc19wZGV2LT5kZXYua29iaiwKKwkJCQkmdGhlcm1hbF90ZW1wX2lucHV0OF9ncm91cCk7CisJCWlmIChyZXMpCisJCQlyZXR1cm4gcmVzOworCQlicmVhazsKKwljYXNlIFRQQUNQSV9USEVSTUFMX05PTkU6CisJZGVmYXVsdDoKKwkJcmV0dXJuIDE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHRoZXJtYWxfZXhpdCh2b2lkKQoreworCXN3aXRjaCAodGhlcm1hbF9yZWFkX21vZGUpIHsKKwljYXNlIFRQQUNQSV9USEVSTUFMX1RQRUNfMTY6CisJCXN5c2ZzX3JlbW92ZV9ncm91cCgmdHBhY3BpX3NlbnNvcnNfcGRldi0+ZGV2LmtvYmosCisJCQkJICAgJnRoZXJtYWxfdGVtcF9pbnB1dDE2X2dyb3VwKTsKKwkJYnJlYWs7CisJY2FzZSBUUEFDUElfVEhFUk1BTF9UUEVDXzg6CisJY2FzZSBUUEFDUElfVEhFUk1BTF9BQ1BJX1RNUDA3OgorCWNhc2UgVFBBQ1BJX1RIRVJNQUxfQUNQSV9VUERUOgorCQlzeXNmc19yZW1vdmVfZ3JvdXAoJnRwYWNwaV9zZW5zb3JzX3BkZXYtPmRldi5rb2JqLAorCQkJCSAgICZ0aGVybWFsX3RlbXBfaW5wdXQxNl9ncm91cCk7CisJCWJyZWFrOworCWNhc2UgVFBBQ1BJX1RIRVJNQUxfTk9ORToKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyBpbnQgdGhlcm1hbF9yZWFkKGNoYXIgKnApCit7CisJaW50IGxlbiA9IDA7CisJaW50IG4sIGk7CisJc3RydWN0IGlibV90aGVybWFsX3NlbnNvcnNfc3RydWN0IHQ7CisKKwluID0gdGhlcm1hbF9nZXRfc2Vuc29ycygmdCk7CisJaWYgKHVubGlrZWx5KG4gPCAwKSkKKwkJcmV0dXJuIG47CisKKwlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAidGVtcGVyYXR1cmVzOlx0Iik7CisKKwlpZiAobiA+IDApIHsKKwkJZm9yIChpID0gMDsgaSA8IChuIC0gMSk7IGkrKykKKwkJCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICIlZCAiLCB0LnRlbXBbaV0gLyAxMDAwKTsKKwkJbGVuICs9IHNwcmludGYocCArIGxlbiwgIiVkXG4iLCB0LnRlbXBbaV0gLyAxMDAwKTsKKwl9IGVsc2UKKwkJbGVuICs9IHNwcmludGYocCArIGxlbiwgIm5vdCBzdXBwb3J0ZWRcbiIpOworCisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIHN0cnVjdCBpYm1fc3RydWN0IHRoZXJtYWxfZHJpdmVyX2RhdGEgPSB7CisJLm5hbWUgPSAidGhlcm1hbCIsCisJLnJlYWQgPSB0aGVybWFsX3JlYWQsCisJLmV4aXQgPSB0aGVybWFsX2V4aXQsCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRUMgRHVtcCBzdWJkcml2ZXIKKyAqLworCitzdGF0aWMgdTggZWNkdW1wX3JlZ3NbMjU2XTsKKworc3RhdGljIGludCBlY2R1bXBfcmVhZChjaGFyICpwKQoreworCWludCBsZW4gPSAwOworCWludCBpLCBqOworCXU4IHY7CisKKwlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAiRUMgICAgICAiCisJCSAgICAgICAiICswMCArMDEgKzAyICswMyArMDQgKzA1ICswNiArMDciCisJCSAgICAgICAiICswOCArMDkgKzBhICswYiArMGMgKzBkICswZSArMGZcbiIpOworCWZvciAoaSA9IDA7IGkgPCAyNTY7IGkgKz0gMTYpIHsKKwkJbGVuICs9IHNwcmludGYocCArIGxlbiwgIkVDIDB4JTAyeDoiLCBpKTsKKwkJZm9yIChqID0gMDsgaiA8IDE2OyBqKyspIHsKKwkJCWlmICghYWNwaV9lY19yZWFkKGkgKyBqLCAmdikpCisJCQkJYnJlYWs7CisJCQlpZiAodiAhPSBlY2R1bXBfcmVnc1tpICsgal0pCisJCQkJbGVuICs9IHNwcmludGYocCArIGxlbiwgIiAqJTAyeCIsIHYpOworCQkJZWxzZQorCQkJCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICIgICUwMngiLCB2KTsKKwkJCWVjZHVtcF9yZWdzW2kgKyBqXSA9IHY7CisJCX0KKwkJbGVuICs9IHNwcmludGYocCArIGxlbiwgIlxuIik7CisJCWlmIChqICE9IDE2KQorCQkJYnJlYWs7CisJfQorCisJLyogVGhlc2UgYXJlIHdheSB0b28gZGFuZ2Vyb3VzIHRvIGFkdmVydGlzZSBvcGVubHkuLi4gKi8KKyNpZiAwCisJbGVuICs9IHNwcmludGYocCArIGxlbiwgImNvbW1hbmRzOlx0MHg8b2Zmc2V0PiAweDx2YWx1ZT4iCisJCSAgICAgICAiICg8b2Zmc2V0PiBpcyAwMC1mZiwgPHZhbHVlPiBpcyAwMC1mZilcbiIpOworCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICJjb21tYW5kczpcdDB4PG9mZnNldD4gPHZhbHVlPiAgIgorCQkgICAgICAgIiAoPG9mZnNldD4gaXMgMDAtZmYsIDx2YWx1ZT4gaXMgMC0yNTUpXG4iKTsKKyNlbmRpZgorCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyBpbnQgZWNkdW1wX3dyaXRlKGNoYXIgKmJ1ZikKK3sKKwljaGFyICpjbWQ7CisJaW50IGksIHY7CisKKwl3aGlsZSAoKGNtZCA9IG5leHRfY21kKCZidWYpKSkgeworCQlpZiAoc3NjYW5mKGNtZCwgIjB4JXggMHgleCIsICZpLCAmdikgPT0gMikgeworCQkJLyogaSBhbmQgdiBzZXQgKi8KKwkJfSBlbHNlIGlmIChzc2NhbmYoY21kLCAiMHgleCAldSIsICZpLCAmdikgPT0gMikgeworCQkJLyogaSBhbmQgdiBzZXQgKi8KKwkJfSBlbHNlCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKGkgPj0gMCAmJiBpIDwgMjU2ICYmIHYgPj0gMCAmJiB2IDwgMjU2KSB7CisJCQlpZiAoIWFjcGlfZWNfd3JpdGUoaSwgdikpCisJCQkJcmV0dXJuIC1FSU87CisJCX0gZWxzZQorCQkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaWJtX3N0cnVjdCBlY2R1bXBfZHJpdmVyX2RhdGEgPSB7CisJLm5hbWUgPSAiZWNkdW1wIiwKKwkucmVhZCA9IGVjZHVtcF9yZWFkLAorCS53cml0ZSA9IGVjZHVtcF93cml0ZSwKKwkuZmxhZ3MuZXhwZXJpbWVudGFsID0gMSwKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBCYWNrbGlnaHQvYnJpZ2h0bmVzcyBzdWJkcml2ZXIKKyAqLworCisjZGVmaW5lIFRQQUNQSV9CQUNLTElHSFRfREVWX05BTUUgInRoaW5rcGFkX3NjcmVlbiIKKworZW51bSB7CisJVFBfRUNfQkFDS0xJR0hUID0gMHgzMSwKKworCS8qIFRQX0VDX0JBQ0tMSUdIVCBiaXRtYXNrcyAqLworCVRQX0VDX0JBQ0tMSUdIVF9MVkxNU0sgPSAweDFGLAorCVRQX0VDX0JBQ0tMSUdIVF9DTURNU0sgPSAweEUwLAorCVRQX0VDX0JBQ0tMSUdIVF9NQVBTVyA9IDB4MjAsCit9OworCitzdGF0aWMgc3RydWN0IGJhY2tsaWdodF9kZXZpY2UgKmlibV9iYWNrbGlnaHRfZGV2aWNlOworc3RhdGljIGludCBicmlnaHRuZXNzX21vZGU7CitzdGF0aWMgdW5zaWduZWQgaW50IGJyaWdodG5lc3NfZW5hYmxlID0gMjsgLyogMiA9IGF1dG8sIDAgPSBubywgMSA9IHllcyAqLworCitzdGF0aWMgc3RydWN0IG11dGV4IGJyaWdodG5lc3NfbXV0ZXg7CisKKy8qCisgKiBUaGlua1BhZHMgY2FuIHJlYWQgYnJpZ2h0bmVzcyBmcm9tIHR3byBwbGFjZXM6IEVDIDB4MzEsIG9yCisgKiBDTU9TIE5WUkFNIGJ5dGUgMHg1RSwgYml0cyAwLTMuCisgKgorICogRUMgMHgzMSBoYXMgdGhlIGZvbGxvd2luZyBsYXlvdXQKKyAqICAgQml0IDc6IHVua25vd24gZnVuY3Rpb24KKyAqICAgQml0IDY6IHVua25vd24gZnVuY3Rpb24KKyAqICAgQml0IDU6IFo6IGhvbm91ciBzY2FsZSBjaGFuZ2VzLCBOWjogaWdub3JlIHNjYWxlIGNoYW5nZXMKKyAqICAgQml0IDQ6IG11c3QgYmUgc2V0IHRvIHplcm8gdG8gYXZvaWQgcHJvYmxlbXMKKyAqICAgQml0IDMtMDogYmFja2xpZ2h0IGJyaWdodG5lc3MgbGV2ZWwKKyAqCisgKiBicmlnaHRuZXNzX2dldF9yYXcgcmV0dXJucyBzdGF0dXMgZGF0YSBpbiB0aGUgRUMgMHgzMSBsYXlvdXQKKyAqLworc3RhdGljIGludCBicmlnaHRuZXNzX2dldF9yYXcoaW50ICpzdGF0dXMpCit7CisJdTggbGVjID0gMCwgbGNtb3MgPSAwLCBsZXZlbCA9IDA7CisKKwlpZiAoYnJpZ2h0bmVzc19tb2RlICYgMSkgeworCQlpZiAoIWFjcGlfZWNfcmVhZChUUF9FQ19CQUNLTElHSFQsICZsZWMpKQorCQkJcmV0dXJuIC1FSU87CisJCWxldmVsID0gbGVjICYgVFBfRUNfQkFDS0xJR0hUX0xWTE1TSzsKKwl9OworCWlmIChicmlnaHRuZXNzX21vZGUgJiAyKSB7CisJCWxjbW9zID0gKG52cmFtX3JlYWRfYnl0ZShUUF9OVlJBTV9BRERSX0JSSUdIVE5FU1MpCisJCQkgJiBUUF9OVlJBTV9NQVNLX0xFVkVMX0JSSUdIVE5FU1MpCisJCQk+PiBUUF9OVlJBTV9QT1NfTEVWRUxfQlJJR0hUTkVTUzsKKwkJbGNtb3MgJj0gKHRwX2ZlYXR1cmVzLmJyaWdodF8xNmxldmVscyk/IDB4MGYgOiAweDA3OworCQlsZXZlbCA9IGxjbW9zOworCX0KKworCWlmIChicmlnaHRuZXNzX21vZGUgPT0gMykgeworCQkqc3RhdHVzID0gbGVjOwkvKiBQcmVmZXIgRUMsIENNT1MgaXMganVzdCBhIGJhY2tpbmcgc3RvcmUgKi8KKwkJbGVjICY9IFRQX0VDX0JBQ0tMSUdIVF9MVkxNU0s7CisJCWlmIChsZWMgPT0gbGNtb3MpCisJCQl0cF93YXJuZWQuYnJpZ2h0X2Ntb3NfZWNfdW5zeW5jID0gMDsKKwkJZWxzZSB7CisJCQlpZiAoIXRwX3dhcm5lZC5icmlnaHRfY21vc19lY191bnN5bmMpIHsKKwkJCQlwcmludGsoVFBBQ1BJX0VSUgorCQkJCQkiQ01PUyBOVlJBTSAoJXUpIGFuZCBFQyAoJXUpIGRvIG5vdCAiCisJCQkJCSJhZ3JlZSBvbiBkaXNwbGF5IGJyaWdodG5lc3MgbGV2ZWxcbiIsCisJCQkJCSh1bnNpZ25lZCBpbnQpIGxjbW9zLAorCQkJCQkodW5zaWduZWQgaW50KSBsZWMpOworCQkJCXRwX3dhcm5lZC5icmlnaHRfY21vc19lY191bnN5bmMgPSAxOworCQkJfQorCQkJcmV0dXJuIC1FSU87CisJCX0KKwl9IGVsc2UgeworCQkqc3RhdHVzID0gbGV2ZWw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIE1heSByZXR1cm4gRUlOVFIgd2hpY2ggY2FuIGFsd2F5cyBiZSBtYXBwZWQgdG8gRVJFU1RBUlRTWVMgKi8KK3N0YXRpYyBpbnQgYnJpZ2h0bmVzc19zZXQoaW50IHZhbHVlKQoreworCWludCBjbW9zX2NtZCwgaW5jLCBpLCByZXM7CisJaW50IGN1cnJlbnRfdmFsdWU7CisJaW50IGNvbW1hbmRfYml0czsKKworCWlmICh2YWx1ZSA+ICgodHBfZmVhdHVyZXMuYnJpZ2h0XzE2bGV2ZWxzKT8gMTUgOiA3KSB8fAorCSAgICB2YWx1ZSA8IDApCisJCXJldHVybiAtRUlOVkFMOworCisJcmVzID0gbXV0ZXhfbG9ja19raWxsYWJsZSgmYnJpZ2h0bmVzc19tdXRleCk7CisJaWYgKHJlcyA8IDApCisJCXJldHVybiByZXM7CisKKwlyZXMgPSBicmlnaHRuZXNzX2dldF9yYXcoJmN1cnJlbnRfdmFsdWUpOworCWlmIChyZXMgPCAwKQorCQlnb3RvIGVycm91dDsKKworCWNvbW1hbmRfYml0cyA9IGN1cnJlbnRfdmFsdWUgJiBUUF9FQ19CQUNLTElHSFRfQ01ETVNLOworCWN1cnJlbnRfdmFsdWUgJj0gVFBfRUNfQkFDS0xJR0hUX0xWTE1TSzsKKworCWNtb3NfY21kID0gdmFsdWUgPiBjdXJyZW50X3ZhbHVlID8KKwkJCVRQX0NNT1NfQlJJR0hUTkVTU19VUCA6CisJCQlUUF9DTU9TX0JSSUdIVE5FU1NfRE9XTjsKKwlpbmMgPSAodmFsdWUgPiBjdXJyZW50X3ZhbHVlKT8gMSA6IC0xOworCisJcmVzID0gMDsKKwlmb3IgKGkgPSBjdXJyZW50X3ZhbHVlOyBpICE9IHZhbHVlOyBpICs9IGluYykgeworCQlpZiAoKGJyaWdodG5lc3NfbW9kZSAmIDIpICYmCisJCSAgICBpc3N1ZV90aGlua3BhZF9jbW9zX2NvbW1hbmQoY21vc19jbWQpKSB7CisJCQlyZXMgPSAtRUlPOworCQkJZ290byBlcnJvdXQ7CisJCX0KKwkJaWYgKChicmlnaHRuZXNzX21vZGUgJiAxKSAmJgorCQkgICAgIWFjcGlfZWNfd3JpdGUoVFBfRUNfQkFDS0xJR0hULAorCQkJCSAgIChpICsgaW5jKSB8IGNvbW1hbmRfYml0cykpIHsKKwkJCXJlcyA9IC1FSU87CisJCQlnb3RvIGVycm91dDs7CisJCX0KKwl9CisKK2Vycm91dDoKKwltdXRleF91bmxvY2soJmJyaWdodG5lc3NfbXV0ZXgpOworCXJldHVybiByZXM7Cit9CisKKy8qIHN5c2ZzIGJhY2tsaWdodCBjbGFzcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgaW50IGJyaWdodG5lc3NfdXBkYXRlX3N0YXR1cyhzdHJ1Y3QgYmFja2xpZ2h0X2RldmljZSAqYmQpCit7CisJLyogaXQgaXMgdGhlIGJhY2tsaWdodCBjbGFzcydzIGpvYiAoY2FsbGVyKSB0byBoYW5kbGUKKwkgKiBFSU5UUiBhbmQgb3RoZXIgZXJyb3JzIHByb3Blcmx5ICovCisJcmV0dXJuIGJyaWdodG5lc3Nfc2V0KAorCQkoYmQtPnByb3BzLmZiX2JsYW5rID09IEZCX0JMQU5LX1VOQkxBTksgJiYKKwkJIGJkLT5wcm9wcy5wb3dlciA9PSBGQl9CTEFOS19VTkJMQU5LKSA/CisJCQkJYmQtPnByb3BzLmJyaWdodG5lc3MgOiAwKTsKK30KKworc3RhdGljIGludCBicmlnaHRuZXNzX2dldChzdHJ1Y3QgYmFja2xpZ2h0X2RldmljZSAqYmQpCit7CisJaW50IHN0YXR1cywgcmVzOworCisJcmVzID0gYnJpZ2h0bmVzc19nZXRfcmF3KCZzdGF0dXMpOworCWlmIChyZXMgPCAwKQorCQlyZXR1cm4gMDsgLyogRklYTUU6IHRlYWNoIGJhY2tsaWdodCBhYm91dCBlcnJvciBoYW5kbGluZyAqLworCisJcmV0dXJuIHN0YXR1cyAmIFRQX0VDX0JBQ0tMSUdIVF9MVkxNU0s7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYmFja2xpZ2h0X29wcyBpYm1fYmFja2xpZ2h0X2RhdGEgPSB7CisJLmdldF9icmlnaHRuZXNzID0gYnJpZ2h0bmVzc19nZXQsCisJLnVwZGF0ZV9zdGF0dXMgID0gYnJpZ2h0bmVzc191cGRhdGVfc3RhdHVzLAorfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBpbnQgX19pbml0IGJyaWdodG5lc3NfaW5pdChzdHJ1Y3QgaWJtX2luaXRfc3RydWN0ICppaWJtKQoreworCWludCBiOworCisJdmRiZ19wcmludGsoVFBBQ1BJX0RCR19JTklULCAiaW5pdGlhbGl6aW5nIGJyaWdodG5lc3Mgc3ViZHJpdmVyXG4iKTsKKworCW11dGV4X2luaXQoJmJyaWdodG5lc3NfbXV0ZXgpOworCisJLyoKKwkgKiBXZSBhbHdheXMgYXR0ZW1wdCB0byBkZXRlY3QgYWNwaSBzdXBwb3J0LCBzbyBhcyB0byBzd2l0Y2gKKwkgKiBMZW5vdm8gVmlzdGEgQklPUyB0byBBQ1BJIGJyaWdodG5lc3MgbW9kZSBldmVuIGlmIHdlIGFyZSBub3QKKwkgKiBnb2luZyB0byBwdWJsaXNoIGEgYmFja2xpZ2h0IGludGVyZmFjZQorCSAqLworCWIgPSB0cGFjcGlfY2hlY2tfc3RkX2FjcGlfYnJpZ2h0bmVzc19zdXBwb3J0KCk7CisJaWYgKGIgPiAwKSB7CisKKwkJaWYgKGFjcGlfdmlkZW9fYmFja2xpZ2h0X3N1cHBvcnQoKSkgeworCQkJaWYgKGJyaWdodG5lc3NfZW5hYmxlID4gMSkgeworCQkJCXByaW50ayhUUEFDUElfTk9USUNFCisJCQkJICAgICAgICJTdGFuZGFyZCBBQ1BJIGJhY2tsaWdodCBpbnRlcmZhY2UgIgorCQkJCSAgICAgICAiYXZhaWxhYmxlLCBub3QgbG9hZGluZyBuYXRpdmUgb25lLlxuIik7CisJCQkJcmV0dXJuIDE7CisJCQl9IGVsc2UgaWYgKGJyaWdodG5lc3NfZW5hYmxlID09IDEpIHsKKwkJCQlwcmludGsoVFBBQ1BJX05PVElDRQorCQkJCSAgICAgICAiQmFja2xpZ2h0IGNvbnRyb2wgZm9yY2UgZW5hYmxlZCwgZXZlbiBpZiBzdGFuZGFyZCAiCisJCQkJICAgICAgICJBQ1BJIGJhY2tsaWdodCBpbnRlcmZhY2UgaXMgYXZhaWxhYmxlXG4iKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmIChicmlnaHRuZXNzX2VuYWJsZSA+IDEpIHsKKwkJCQlwcmludGsoVFBBQ1BJX05PVElDRQorCQkJCSAgICAgICAiU3RhbmRhcmQgQUNQSSBiYWNrbGlnaHQgaW50ZXJmYWNlIG5vdCAiCisJCQkJICAgICAgICJhdmFpbGFibGUsIHRoaW5rcGFkX2FjcGkgbmF0aXZlICIKKwkJCQkgICAgICAgImJyaWdodG5lc3MgY29udHJvbCBlbmFibGVkXG4iKTsKKwkJCX0KKwkJfQorCX0KKworCWlmICghYnJpZ2h0bmVzc19lbmFibGUpIHsKKwkJZGJnX3ByaW50ayhUUEFDUElfREJHX0lOSVQsCisJCQkgICAiYnJpZ2h0bmVzcyBzdXBwb3J0IGRpc2FibGVkIGJ5ICIKKwkJCSAgICJtb2R1bGUgcGFyYW1ldGVyXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCisJaWYgKGIgPiAxNikgeworCQlwcmludGsoVFBBQ1BJX0VSUgorCQkgICAgICAgIlVuc3VwcG9ydGVkIGJyaWdodG5lc3MgaW50ZXJmYWNlLCAiCisJCSAgICAgICAicGxlYXNlIGNvbnRhY3QgJXNcbiIsIFRQQUNQSV9NQUlMKTsKKwkJcmV0dXJuIDE7CisJfQorCWlmIChiID09IDE2KQorCQl0cF9mZWF0dXJlcy5icmlnaHRfMTZsZXZlbHMgPSAxOworCisJaWYgKCFicmlnaHRuZXNzX21vZGUpIHsKKwkJaWYgKHRoaW5rcGFkX2lkLnZlbmRvciA9PSBQQ0lfVkVORE9SX0lEX0xFTk9WTykKKwkJCWJyaWdodG5lc3NfbW9kZSA9IDI7CisJCWVsc2UKKwkJCWJyaWdodG5lc3NfbW9kZSA9IDM7CisKKwkJZGJnX3ByaW50ayhUUEFDUElfREJHX0lOSVQsICJzZWxlY3RlZCBicmlnaHRuZXNzX21vZGU9JWRcbiIsCisJCQlicmlnaHRuZXNzX21vZGUpOworCX0KKworCWlmIChicmlnaHRuZXNzX21vZGUgPiAzKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChicmlnaHRuZXNzX2dldF9yYXcoJmIpIDwgMCkKKwkJcmV0dXJuIDE7CisKKwlpZiAodHBfZmVhdHVyZXMuYnJpZ2h0XzE2bGV2ZWxzKQorCQlwcmludGsoVFBBQ1BJX0lORk8KKwkJICAgICAgICJkZXRlY3RlZCBhIDE2LWxldmVsIGJyaWdodG5lc3MgY2FwYWJsZSBUaGlua1BhZFxuIik7CisKKwlpYm1fYmFja2xpZ2h0X2RldmljZSA9IGJhY2tsaWdodF9kZXZpY2VfcmVnaXN0ZXIoCisJCQkJCVRQQUNQSV9CQUNLTElHSFRfREVWX05BTUUsIE5VTEwsIE5VTEwsCisJCQkJCSZpYm1fYmFja2xpZ2h0X2RhdGEpOworCWlmIChJU19FUlIoaWJtX2JhY2tsaWdodF9kZXZpY2UpKSB7CisJCXByaW50ayhUUEFDUElfRVJSICJDb3VsZCBub3QgcmVnaXN0ZXIgYmFja2xpZ2h0IGRldmljZVxuIik7CisJCXJldHVybiBQVFJfRVJSKGlibV9iYWNrbGlnaHRfZGV2aWNlKTsKKwl9CisJdmRiZ19wcmludGsoVFBBQ1BJX0RCR19JTklULCAiYnJpZ2h0bmVzcyBpcyBzdXBwb3J0ZWRcbiIpOworCisJaWJtX2JhY2tsaWdodF9kZXZpY2UtPnByb3BzLm1heF9icmlnaHRuZXNzID0KKwkJCQkodHBfZmVhdHVyZXMuYnJpZ2h0XzE2bGV2ZWxzKT8gMTUgOiA3OworCWlibV9iYWNrbGlnaHRfZGV2aWNlLT5wcm9wcy5icmlnaHRuZXNzID0gYiAmIFRQX0VDX0JBQ0tMSUdIVF9MVkxNU0s7CisJYmFja2xpZ2h0X3VwZGF0ZV9zdGF0dXMoaWJtX2JhY2tsaWdodF9kZXZpY2UpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGJyaWdodG5lc3NfZXhpdCh2b2lkKQoreworCWlmIChpYm1fYmFja2xpZ2h0X2RldmljZSkgeworCQl2ZGJnX3ByaW50ayhUUEFDUElfREJHX0VYSVQsCisJCQkgICAgImNhbGxpbmcgYmFja2xpZ2h0X2RldmljZV91bnJlZ2lzdGVyKClcbiIpOworCQliYWNrbGlnaHRfZGV2aWNlX3VucmVnaXN0ZXIoaWJtX2JhY2tsaWdodF9kZXZpY2UpOworCX0KK30KKworc3RhdGljIGludCBicmlnaHRuZXNzX3JlYWQoY2hhciAqcCkKK3sKKwlpbnQgbGVuID0gMDsKKwlpbnQgbGV2ZWw7CisKKwlsZXZlbCA9IGJyaWdodG5lc3NfZ2V0KE5VTEwpOworCWlmIChsZXZlbCA8IDApIHsKKwkJbGVuICs9IHNwcmludGYocCArIGxlbiwgImxldmVsOlx0XHR1bnJlYWRhYmxlXG4iKTsKKwl9IGVsc2UgeworCQlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAibGV2ZWw6XHRcdCVkXG4iLCBsZXZlbCk7CisJCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICJjb21tYW5kczpcdHVwLCBkb3duXG4iKTsKKwkJbGVuICs9IHNwcmludGYocCArIGxlbiwgImNvbW1hbmRzOlx0bGV2ZWwgPGxldmVsPiIKKwkJCSAgICAgICAiICg8bGV2ZWw+IGlzIDAtJWQpXG4iLAorCQkJICAgICAgICh0cF9mZWF0dXJlcy5icmlnaHRfMTZsZXZlbHMpID8gMTUgOiA3KTsKKwl9CisKKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgaW50IGJyaWdodG5lc3Nfd3JpdGUoY2hhciAqYnVmKQoreworCWludCBsZXZlbDsKKwlpbnQgcmM7CisJY2hhciAqY21kOworCWludCBtYXhfbGV2ZWwgPSAodHBfZmVhdHVyZXMuYnJpZ2h0XzE2bGV2ZWxzKSA/IDE1IDogNzsKKworCWxldmVsID0gYnJpZ2h0bmVzc19nZXQoTlVMTCk7CisJaWYgKGxldmVsIDwgMCkKKwkJcmV0dXJuIGxldmVsOworCisJd2hpbGUgKChjbWQgPSBuZXh0X2NtZCgmYnVmKSkpIHsKKwkJaWYgKHN0cmxlbmNtcChjbWQsICJ1cCIpID09IDApIHsKKwkJCWlmIChsZXZlbCA8IG1heF9sZXZlbCkKKwkJCQlsZXZlbCsrOworCQl9IGVsc2UgaWYgKHN0cmxlbmNtcChjbWQsICJkb3duIikgPT0gMCkgeworCQkJaWYgKGxldmVsID4gMCkKKwkJCQlsZXZlbC0tOworCQl9IGVsc2UgaWYgKHNzY2FuZihjbWQsICJsZXZlbCAlZCIsICZsZXZlbCkgPT0gMSAmJgorCQkJICAgbGV2ZWwgPj0gMCAmJiBsZXZlbCA8PSBtYXhfbGV2ZWwpIHsKKwkJCS8qIG5ldyBsZXZlbCBzZXQgKi8KKwkJfSBlbHNlCisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKgorCSAqIE5vdyB3ZSBrbm93IHdoYXQgdGhlIGZpbmFsIGxldmVsIHNob3VsZCBiZSwgc28gd2UgdHJ5IHRvIHNldCBpdC4KKwkgKiBEb2luZyBpdCB0aGlzIHdheSBtYWtlcyB0aGUgc3lzY2FsbCByZXN0YXJ0YWJsZSBpbiBjYXNlIG9mIEVJTlRSCisJICovCisJcmMgPSBicmlnaHRuZXNzX3NldChsZXZlbCk7CisJcmV0dXJuIChyYyA9PSAtRUlOVFIpPyBFUkVTVEFSVFNZUyA6IHJjOworfQorCitzdGF0aWMgc3RydWN0IGlibV9zdHJ1Y3QgYnJpZ2h0bmVzc19kcml2ZXJfZGF0YSA9IHsKKwkubmFtZSA9ICJicmlnaHRuZXNzIiwKKwkucmVhZCA9IGJyaWdodG5lc3NfcmVhZCwKKwkud3JpdGUgPSBicmlnaHRuZXNzX3dyaXRlLAorCS5leGl0ID0gYnJpZ2h0bmVzc19leGl0LAorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFZvbHVtZSBzdWJkcml2ZXIKKyAqLworCitzdGF0aWMgaW50IHZvbHVtZV9vZmZzZXQgPSAweDMwOworCitzdGF0aWMgaW50IHZvbHVtZV9yZWFkKGNoYXIgKnApCit7CisJaW50IGxlbiA9IDA7CisJdTggbGV2ZWw7CisKKwlpZiAoIWFjcGlfZWNfcmVhZCh2b2x1bWVfb2Zmc2V0LCAmbGV2ZWwpKSB7CisJCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICJsZXZlbDpcdFx0dW5yZWFkYWJsZVxuIik7CisJfSBlbHNlIHsKKwkJbGVuICs9IHNwcmludGYocCArIGxlbiwgImxldmVsOlx0XHQlZFxuIiwgbGV2ZWwgJiAweGYpOworCQlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAibXV0ZTpcdFx0JXNcbiIsIG9ub2ZmKGxldmVsLCA2KSk7CisJCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICJjb21tYW5kczpcdHVwLCBkb3duLCBtdXRlXG4iKTsKKwkJbGVuICs9IHNwcmludGYocCArIGxlbiwgImNvbW1hbmRzOlx0bGV2ZWwgPGxldmVsPiIKKwkJCSAgICAgICAiICg8bGV2ZWw+IGlzIDAtMTUpXG4iKTsKKwl9CisKKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgaW50IHZvbHVtZV93cml0ZShjaGFyICpidWYpCit7CisJaW50IGNtb3NfY21kLCBpbmMsIGk7CisJdTggbGV2ZWwsIG11dGU7CisJaW50IG5ld19sZXZlbCwgbmV3X211dGU7CisJY2hhciAqY21kOworCisJd2hpbGUgKChjbWQgPSBuZXh0X2NtZCgmYnVmKSkpIHsKKwkJaWYgKCFhY3BpX2VjX3JlYWQodm9sdW1lX29mZnNldCwgJmxldmVsKSkKKwkJCXJldHVybiAtRUlPOworCQluZXdfbXV0ZSA9IG11dGUgPSBsZXZlbCAmIDB4NDA7CisJCW5ld19sZXZlbCA9IGxldmVsID0gbGV2ZWwgJiAweGY7CisKKwkJaWYgKHN0cmxlbmNtcChjbWQsICJ1cCIpID09IDApIHsKKwkJCWlmIChtdXRlKQorCQkJCW5ld19tdXRlID0gMDsKKwkJCWVsc2UKKwkJCQluZXdfbGV2ZWwgPSBsZXZlbCA9PSAxNSA/IDE1IDogbGV2ZWwgKyAxOworCQl9IGVsc2UgaWYgKHN0cmxlbmNtcChjbWQsICJkb3duIikgPT0gMCkgeworCQkJaWYgKG11dGUpCisJCQkJbmV3X211dGUgPSAwOworCQkJZWxzZQorCQkJCW5ld19sZXZlbCA9IGxldmVsID09IDAgPyAwIDogbGV2ZWwgLSAxOworCQl9IGVsc2UgaWYgKHNzY2FuZihjbWQsICJsZXZlbCAlZCIsICZuZXdfbGV2ZWwpID09IDEgJiYKKwkJCSAgIG5ld19sZXZlbCA+PSAwICYmIG5ld19sZXZlbCA8PSAxNSkgeworCQkJLyogbmV3X2xldmVsIHNldCAqLworCQl9IGVsc2UgaWYgKHN0cmxlbmNtcChjbWQsICJtdXRlIikgPT0gMCkgeworCQkJbmV3X211dGUgPSAweDQwOworCQl9IGVsc2UKKwkJCXJldHVybiAtRUlOVkFMOworCisJCWlmIChuZXdfbGV2ZWwgIT0gbGV2ZWwpIHsKKwkJCS8qIG11dGUgZG9lc24ndCBjaGFuZ2UgKi8KKworCQkJY21vc19jbWQgPSAobmV3X2xldmVsID4gbGV2ZWwpID8KKwkJCQkJVFBfQ01PU19WT0xVTUVfVVAgOiBUUF9DTU9TX1ZPTFVNRV9ET1dOOworCQkJaW5jID0gbmV3X2xldmVsID4gbGV2ZWwgPyAxIDogLTE7CisKKwkJCWlmIChtdXRlICYmIChpc3N1ZV90aGlua3BhZF9jbW9zX2NvbW1hbmQoY21vc19jbWQpIHx8CisJCQkJICAgICAhYWNwaV9lY193cml0ZSh2b2x1bWVfb2Zmc2V0LCBsZXZlbCkpKQorCQkJCXJldHVybiAtRUlPOworCisJCQlmb3IgKGkgPSBsZXZlbDsgaSAhPSBuZXdfbGV2ZWw7IGkgKz0gaW5jKQorCQkJCWlmIChpc3N1ZV90aGlua3BhZF9jbW9zX2NvbW1hbmQoY21vc19jbWQpIHx8CisJCQkJICAgICFhY3BpX2VjX3dyaXRlKHZvbHVtZV9vZmZzZXQsIGkgKyBpbmMpKQorCQkJCQlyZXR1cm4gLUVJTzsKKworCQkJaWYgKG11dGUgJiYKKwkJCSAgICAoaXNzdWVfdGhpbmtwYWRfY21vc19jb21tYW5kKFRQX0NNT1NfVk9MVU1FX01VVEUpIHx8CisJCQkgICAgICFhY3BpX2VjX3dyaXRlKHZvbHVtZV9vZmZzZXQsIG5ld19sZXZlbCArIG11dGUpKSkgeworCQkJCXJldHVybiAtRUlPOworCQkJfQorCQl9CisKKwkJaWYgKG5ld19tdXRlICE9IG11dGUpIHsKKwkJCS8qIGxldmVsIGRvZXNuJ3QgY2hhbmdlICovCisKKwkJCWNtb3NfY21kID0gKG5ld19tdXRlKSA/CisJCQkJICAgVFBfQ01PU19WT0xVTUVfTVVURSA6IFRQX0NNT1NfVk9MVU1FX1VQOworCisJCQlpZiAoaXNzdWVfdGhpbmtwYWRfY21vc19jb21tYW5kKGNtb3NfY21kKSB8fAorCQkJICAgICFhY3BpX2VjX3dyaXRlKHZvbHVtZV9vZmZzZXQsIGxldmVsICsgbmV3X211dGUpKQorCQkJCXJldHVybiAtRUlPOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaWJtX3N0cnVjdCB2b2x1bWVfZHJpdmVyX2RhdGEgPSB7CisJLm5hbWUgPSAidm9sdW1lIiwKKwkucmVhZCA9IHZvbHVtZV9yZWFkLAorCS53cml0ZSA9IHZvbHVtZV93cml0ZSwKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGYW4gc3ViZHJpdmVyCisgKi8KKworLyoKKyAqIEZBTiBBQ0NFU1MgTU9ERVMKKyAqCisgKiBUUEFDUElfRkFOX1JEX0FDUElfR0ZBTjoKKyAqIAlBQ1BJIEdGQU4gbWV0aG9kOiByZXR1cm5zIGZhbiBsZXZlbAorICoKKyAqIAlzZWUgVFBBQ1BJX0ZBTl9XUl9BQ1BJX1NGQU4KKyAqIAlFQyAweDJmIChIRlNQKSBub3QgYXZhaWxhYmxlIGlmIEdGQU4gZXhpc3RzCisgKgorICogVFBBQ1BJX0ZBTl9XUl9BQ1BJX1NGQU46CisgKiAJQUNQSSBTRkFOIG1ldGhvZDogc2V0cyBmYW4gbGV2ZWwsIDAgKHN0b3ApIHRvIDcgKG1heCkKKyAqCisgKiAJRUMgMHgyZiAoSEZTUCkgbWlnaHQgYmUgYXZhaWxhYmxlICpmb3IgcmVhZGluZyosIGJ1dCBkbyBub3QgdXNlCisgKiAJaXQgZm9yIHdyaXRpbmcuCisgKgorICogVFBBQ1BJX0ZBTl9XUl9UUEVDOgorICogCVRoaW5rUGFkIEVDIHJlZ2lzdGVyIDB4MmYgKEhGU1ApOiBmYW4gY29udHJvbCBsb29wIG1vZGUKKyAqIAlTdXBwb3J0ZWQgb24gYWxtb3N0IGFsbCBUaGlua1BhZHMKKyAqCisgKiAJRmFuIHNwZWVkIGNoYW5nZXMgb2YgYW55IHNvcnQgKGluY2x1ZGluZyB0aG9zZSBjYXVzZWQgYnkgdGhlCisgKiAJZGlzZW5nYWdlZCBtb2RlKSBhcmUgdXN1YWxseSBkb25lIHNsb3dseSBieSB0aGUgZmlybXdhcmUgYXMgdGhlCisgKiAJbWF4aW11bSBhbW1vdW50IG9mIGZhbiBkdXR5IGN5Y2xlIGNoYW5nZSBwZXIgc2Vjb25kIHNlZW1zIHRvIGJlCisgKiAJbGltaXRlZC4KKyAqCisgKiAJUmVhZGluZyBpcyBub3QgYXZhaWxhYmxlIGlmIEdGQU4gZXhpc3RzLgorICogCVdyaXRpbmcgaXMgbm90IGF2YWlsYWJsZSBpZiBTRkFOIGV4aXN0cy4KKyAqCisgKiAJQml0cworICoJIDcJYXV0b21hdGljIG1vZGUgZW5nYWdlZDsKKyAqICAJCShkZWZhdWx0IG9wZXJhdGlvbiBtb2RlIG9mIHRoZSBUaGlua1BhZCkKKyAqIAkJZmFuIGxldmVsIGlzIGlnbm9yZWQgaW4gdGhpcyBtb2RlLgorICoJIDYJZnVsbCBzcGVlZCBtb2RlICh0YWtlcyBwcmVjZWRlbmNlIG92ZXIgYml0IDcpOworICoJCW5vdCBhdmFpbGFibGUgb24gYWxsIHRoaW5rcGFkcy4gIE1heSBkaXNhYmxlCisgKgkJdGhlIHRhY2hvbWV0ZXIgd2hpbGUgdGhlIGZhbiBjb250cm9sbGVyIHJhbXBzIHVwCisgKgkJdGhlIHNwZWVkICh3aGljaCBjYW4gdGFrZSB1cCB0byBhIGZldyAqbWludXRlcyopLgorICoJCVNwZWVkcyB1cCBmYW4gdG8gMTAwJSBkdXR5LWN5Y2xlLCB3aGljaCBpcyBmYXIgYWJvdmUKKyAqCQl0aGUgc3RhbmRhcmQgUlBNIGxldmVscy4gIEl0IGlzIG5vdCBpbXBvc3NpYmxlIHRoYXQKKyAqCQlpdCBjb3VsZCBjYXVzZSBoYXJkd2FyZSBkYW1hZ2UuCisgKgk1LTMJdW51c2VkIGluIHNvbWUgbW9kZWxzLiAgRXh0cmEgYml0cyBmb3IgZmFuIGxldmVsCisgKgkJaW4gb3RoZXJzLCBidXQgc3RpbGwgdXNlbGVzcyBhcyBhbGwgdmFsdWVzIGFib3ZlCisgKgkJNyBtYXAgdG8gdGhlIHNhbWUgc3BlZWQgYXMgbGV2ZWwgNyBpbiB0aGVzZSBtb2RlbHMuCisgKgkyLTAJZmFuIGxldmVsICgwLi43IHVzdWFsbHkpCisgKgkJCTB4MDAgPSBzdG9wCisgKiAJCQkweDA3ID0gbWF4IChzZXQgd2hlbiB0ZW1wZXJhdHVyZXMgY3JpdGljYWwpCisgKiAJCVNvbWUgVGhpbmtQYWRzIG1heSBoYXZlIG90aGVyIGxldmVscywgc2VlCisgKiAJCVRQQUNQSV9GQU5fV1JfQUNQSV9GQU5TIChYMzEvWDQwL1g0MSkKKyAqCisgKglGSVJNV0FSRSBCVUc6IG9uIHNvbWUgbW9kZWxzLCBFQyAweDJmIG1pZ2h0IG5vdCBiZSBpbml0aWFsaXplZCBhdAorICoJYm9vdC4gQXBwYXJlbnRseSB0aGUgRUMgZG9lcyBub3QgaW50aWFsaXplIGl0LCBzbyB1bmxlc3MgQUNQSSBEU0RUCisgKglkb2VzIHNvLCBpdHMgaW5pdGlhbCB2YWx1ZSBpcyBtZWFuaW5nbGVzcyAoMHgwNykuCisgKgorICoJRm9yIGZpcm13YXJlIGJ1Z3MsIHJlZmVyIHRvOgorICoJaHR0cDovL3RoaW5rd2lraS5vcmcvd2lraS9FbWJlZGRlZF9Db250cm9sbGVyX0Zpcm13YXJlI0Zpcm13YXJlX0lzc3VlcworICoKKyAqIAktLS0tCisgKgorICoJVGhpbmtQYWQgRUMgcmVnaXN0ZXIgMHg4NCAoTFNCKSwgMHg4NSAoTVNCKToKKyAqCU1haW4gZmFuIHRhY2hvbWV0ZXIgcmVhZGluZyAoaW4gUlBNKQorICoKKyAqCVRoaXMgcmVnaXN0ZXIgaXMgcHJlc2VudCBvbiBhbGwgVGhpbmtQYWRzIHdpdGggYSBuZXctc3R5bGUgRUMsIGFuZAorICoJaXQgaXMga25vd24gbm90IHRvIGJlIHByZXNlbnQgb24gdGhlIEEyMW0vZSwgYW5kIFQyMiwgYXMgdGhlcmUgaXMKKyAqCXNvbWV0aGluZyBlbHNlIGluIG9mZnNldCAweDg0IGFjY29yZGluZyB0byB0aGUgQUNQSSBEU0RULiAgT3RoZXIKKyAqCVRoaW5rUGFkcyBmcm9tIHRoaXMgc2FtZSB0aW1lIHBlcmlvZCAoYW5kIGVhcmxpZXIpIHByb2JhYmx5IGxhY2sgdGhlCisgKgl0YWNob21ldGVyIGFzIHdlbGwuCisgKgorICoJVW5mb3J0dW5hdGVseSBhIGxvdCBvZiBUaGlua1BhZHMgd2l0aCBuZXctc3R5bGUgRUNzIGJ1dCB3aG9zZSBmaXJ3bWFyZQorICoJd2FzIG5ldmVyIGZpeGVkIGJ5IElCTSB0byByZXBvcnQgdGhlIEVDIGZpcm13YXJlIHZlcnNpb24gc3RyaW5nCisgKglwcm9iYWJseSBzdXBwb3J0IHRoZSB0YWNob21ldGVyIChsaWtlIHRoZSBlYXJseSBYIG1vZGVscyksIHNvCisgKglkZXRlY3RpbmcgaXQgaXMgcXVpdGUgaGFyZC4gIFdlIG5lZWQgbW9yZSBkYXRhIHRvIGtub3cgZm9yIHN1cmUuCisgKgorICoJRklSTVdBUkUgQlVHOiBhbHdheXMgcmVhZCAweDg0IGZpcnN0LCBvdGhlcndpc2UgaW5jb3JyZWN0IHJlYWRpbmdzCisgKgltaWdodCByZXN1bHQuCisgKgorICoJRklSTVdBUkUgQlVHOiBtYXkgZ28gc3RhbGUgd2hpbGUgdGhlIEVDIGlzIHN3aXRjaGluZyB0byBmdWxsIHNwZWVkCisgKgltb2RlLgorICoKKyAqCUZvciBmaXJtd2FyZSBidWdzLCByZWZlciB0bzoKKyAqCWh0dHA6Ly90aGlua3dpa2kub3JnL3dpa2kvRW1iZWRkZWRfQ29udHJvbGxlcl9GaXJtd2FyZSNGaXJtd2FyZV9Jc3N1ZXMKKyAqCisgKiBUUEFDUElfRkFOX1dSX0FDUElfRkFOUzoKKyAqCVRoaW5rUGFkIFgzMSwgWDQwLCBYNDEuICBOb3QgYXZhaWxhYmxlIGluIHRoZSBYNjAuCisgKgorICoJRkFOUyBBQ1BJIGhhbmRsZTogdGFrZXMgdGhyZWUgYXJndW1lbnRzOiBsb3cgc3BlZWQsIG1lZGl1bSBzcGVlZCwKKyAqCWhpZ2ggc3BlZWQuICBBQ1BJIERTRFQgc2VlbXMgdG8gbWFwIHRoZXNlIHRocmVlIHNwZWVkcyB0byBsZXZlbHMKKyAqCWFzIGZvbGxvd3M6IFNUT1AgTE9XIExPVyBNRUQgTUVEIEhJR0ggSElHSCBISUdIIEhJR0gKKyAqCSh0aGlzIG1hcCBpcyBzdG9yZWQgb24gRkFOMC4uRkFOOCBhcyAiMCwxLDEsMiwyLDMsMywzLDMiKQorICoKKyAqIAlUaGUgc3BlZWRzIGFyZSBzdG9yZWQgb24gaGFuZGxlcworICogCShGQU5BOkZBTjkpLCAoRkFOQzpGQU5CKSwgKEZBTkU6RkFORCkuCisgKgorICogCVRoZXJlIGFyZSB0aHJlZSBkZWZhdWx0IHNwZWVkIHNldHMsIGFjZXNzaWJsZSBhcyBoYW5kbGVzOgorICogCUZTMUwsRlMxTSxGUzFIOyBGUzJMLEZTMk0sRlMySDsgRlMzTCxGUzNNLEZTM0gKKyAqCisgKiAJQUNQSSBEU0RUIHN3aXRjaGVzIHdoaWNoIHNldCBpcyBpbiB1c2UgZGVwZW5kaW5nIG9uIHZhcmlvdXMKKyAqIAlmYWN0b3JzLgorICoKKyAqIAlUUEFDUElfRkFOX1dSX1RQRUMgaXMgYWxzbyBhdmFpbGFibGUgYW5kIHNob3VsZCBiZSB1c2VkIHRvCisgKiAJY29tbWFuZCB0aGUgZmFuLiAgVGhlIFgzMS9YNDAvWDQxIHNlZW1zIHRvIGhhdmUgOCBmYW4gbGV2ZWxzLAorICogCWJ1dCB0aGUgQUNQSSB0YWJsZXMganVzdCBtZW50aW9uIGxldmVsIDcuCisgKi8KKworZW51bSB7CQkJCQkvKiBGYW4gY29udHJvbCBjb25zdGFudHMgKi8KKwlmYW5fc3RhdHVzX29mZnNldCA9IDB4MmYsCS8qIEVDIHJlZ2lzdGVyIDB4MmYgKi8KKwlmYW5fcnBtX29mZnNldCA9IDB4ODQsCQkvKiBFQyByZWdpc3RlciAweDg0OiBMU0IsIDB4ODUgTVNCIChSUE0pCisJCQkJCSAqIDB4ODQgbXVzdCBiZSByZWFkIGJlZm9yZSAweDg1ICovCisKKwlUUF9FQ19GQU5fRlVMTFNQRUVEID0gMHg0MCwJLyogRUMgZmFuIG1vZGU6IGZ1bGwgc3BlZWQgKi8KKwlUUF9FQ19GQU5fQVVUTwkgICAgPSAweDgwLAkvKiBFQyBmYW4gbW9kZTogYXV0byBmYW4gY29udHJvbCAqLworCisJVFBBQ1BJX0ZBTl9MQVNUX0xFVkVMID0gMHgxMDAsCS8qIFVzZSBjYWNoZWQgbGFzdC1zZWVuIGZhbiBsZXZlbCAqLworfTsKKworZW51bSBmYW5fc3RhdHVzX2FjY2Vzc19tb2RlIHsKKwlUUEFDUElfRkFOX05PTkUgPSAwLAkJLyogTm8gZmFuIHN0YXR1cyBvciBjb250cm9sICovCisJVFBBQ1BJX0ZBTl9SRF9BQ1BJX0dGQU4sCS8qIFVzZSBBQ1BJIEdGQU4gKi8KKwlUUEFDUElfRkFOX1JEX1RQRUMsCQkvKiBVc2UgQUNQSSBFQyByZWdzIDB4MmYsIDB4ODQtMHg4NSAqLworfTsKKworZW51bSBmYW5fY29udHJvbF9hY2Nlc3NfbW9kZSB7CisJVFBBQ1BJX0ZBTl9XUl9OT05FID0gMCwJCS8qIE5vIGZhbiBjb250cm9sICovCisJVFBBQ1BJX0ZBTl9XUl9BQ1BJX1NGQU4sCS8qIFVzZSBBQ1BJIFNGQU4gKi8KKwlUUEFDUElfRkFOX1dSX1RQRUMsCQkvKiBVc2UgQUNQSSBFQyByZWcgMHgyZiAqLworCVRQQUNQSV9GQU5fV1JfQUNQSV9GQU5TLAkvKiBVc2UgQUNQSSBGQU5TIGFuZCBFQyByZWcgMHgyZiAqLworfTsKKworZW51bSBmYW5fY29udHJvbF9jb21tYW5kcyB7CisJVFBBQ1BJX0ZBTl9DTURfU1BFRUQgCT0gMHgwMDAxLAkvKiBzcGVlZCBjb21tYW5kICovCisJVFBBQ1BJX0ZBTl9DTURfTEVWRUwgCT0gMHgwMDAyLAkvKiBsZXZlbCBjb21tYW5kICAqLworCVRQQUNQSV9GQU5fQ01EX0VOQUJMRQk9IDB4MDAwNCwJLyogZW5hYmxlL2Rpc2FibGUgY21kLAorCQkJCQkJICogYW5kIGFsc28gd2F0Y2hkb2cgY21kICovCit9OworCitzdGF0aWMgaW50IGZhbl9jb250cm9sX2FsbG93ZWQ7CisKK3N0YXRpYyBlbnVtIGZhbl9zdGF0dXNfYWNjZXNzX21vZGUgZmFuX3N0YXR1c19hY2Nlc3NfbW9kZTsKK3N0YXRpYyBlbnVtIGZhbl9jb250cm9sX2FjY2Vzc19tb2RlIGZhbl9jb250cm9sX2FjY2Vzc19tb2RlOworc3RhdGljIGVudW0gZmFuX2NvbnRyb2xfY29tbWFuZHMgZmFuX2NvbnRyb2xfY29tbWFuZHM7CisKK3N0YXRpYyB1OCBmYW5fY29udHJvbF9pbml0aWFsX3N0YXR1czsKK3N0YXRpYyB1OCBmYW5fY29udHJvbF9kZXNpcmVkX2xldmVsOworc3RhdGljIHU4IGZhbl9jb250cm9sX3Jlc3VtZV9sZXZlbDsKK3N0YXRpYyBpbnQgZmFuX3dhdGNoZG9nX21heGludGVydmFsOworCitzdGF0aWMgc3RydWN0IG11dGV4IGZhbl9tdXRleDsKKworc3RhdGljIHZvaWQgZmFuX3dhdGNoZG9nX2ZpcmUoc3RydWN0IHdvcmtfc3RydWN0ICppZ25vcmVkKTsKK3N0YXRpYyBERUNMQVJFX0RFTEFZRURfV09SSyhmYW5fd2F0Y2hkb2dfdGFzaywgZmFuX3dhdGNoZG9nX2ZpcmUpOworCitUUEFDUElfSEFORExFKGZhbnMsIGVjLCAiRkFOUyIpOwkvKiBYMzEsIFg0MCwgWDQxICovCitUUEFDUElfSEFORExFKGdmYW4sIGVjLCAiR0ZBTiIsCS8qIDU3MCAqLworCSAgICJcXEZTUEQiLAkJLyogNjAwZS94LCA3NzBlLCA3NzB4ICovCisJICAgKTsJCQkvKiBhbGwgb3RoZXJzICovCitUUEFDUElfSEFORExFKHNmYW4sIGVjLCAiU0ZBTiIsCS8qIDU3MCAqLworCSAgICJKRk5TIiwJCS8qIDc3MHgtSkwgKi8KKwkgICApOwkJCS8qIGFsbCBvdGhlcnMgKi8KKworLyoKKyAqIFVuaXRpYWxpemVkIEhGU1AgcXVpcms6IEFDUEkgRFNEVCBhbmQgRUMgZmFpbCB0byBpbml0aWFsaXplIHRoZQorICogSEZTUCByZWdpc3RlciBhdCBib290LCBzbyBpdCBjb250YWlucyAweDA3IGJ1dCB0aGUgVGhpbmtwYWQgY291bGQKKyAqIGJlIGluIGF1dG8gbW9kZSAoMHg4MCkuCisgKgorICogVGhpcyBpcyBjb3JyZWN0ZWQgYnkgYW55IHdyaXRlIHRvIEhGU1AgZWl0aGVyIGJ5IHRoZSBkcml2ZXIsIG9yCisgKiBieSB0aGUgZmlybXdhcmUuCisgKgorICogV2UgYXNzdW1lIDB4MDcgcmVhbGx5IG1lYW5zIGF1dG8gbW9kZSB3aGlsZSB0aGlzIHF1aXJrIGlzIGFjdGl2ZSwKKyAqIGFzIHRoaXMgaXMgZmFyIG1vcmUgbGlrZWx5IHRoYW4gdGhlIFRoaW5rUGFkIGJlaW5nIGluIGxldmVsIDcsCisgKiB3aGljaCBpcyBvbmx5IHVzZWQgYnkgdGhlIGZpcm13YXJlIGR1cmluZyB0aGVybWFsIGVtZXJnZW5jaWVzLgorICovCisKK3N0YXRpYyB2b2lkIGZhbl9xdWlyazFfZGV0ZWN0KHZvaWQpCit7CisJLyogSW4gc29tZSBUaGlua1BhZHMsIG5laXRoZXIgdGhlIEVDIG5vciB0aGUgQUNQSQorCSAqIERTRFQgaW5pdGlhbGl6ZSB0aGUgSEZTUCByZWdpc3RlciwgYW5kIGl0IGVuZHMgdXAKKwkgKiBiZWluZyBpbml0aWFsbHkgc2V0IHRvIDB4MDcgd2hlbiBpdCAqY291bGQqIGJlCisJICogZWl0aGVyIDB4MDcgb3IgMHg4MC4KKwkgKgorCSAqIEVuYWJsZSBmb3IgVFAtMVkgKFQ0MyksIFRQLTc4IChSNTFlKSwKKwkgKiBUUC03NiAoUjUyKSwgVFAtNzAgKFQ0MywgUjUyKSwgd2hpY2ggYXJlIGtub3duCisJICogdG8gYmUgYnVnZ3kuICovCisJaWYgKGZhbl9jb250cm9sX2luaXRpYWxfc3RhdHVzID09IDB4MDcpIHsKKwkJc3dpdGNoICh0aGlua3BhZF9pZC5lY19tb2RlbCkgeworCQljYXNlIDB4NTkzMTogLyogVFAtMVkgKi8KKwkJY2FzZSAweDM4Mzc6IC8qIFRQLTc4ICovCisJCWNhc2UgMHgzNjM3OiAvKiBUUC03NiAqLworCQljYXNlIDB4MzAzNzogLyogVFAtNzAgKi8KKwkJCXByaW50ayhUUEFDUElfTk9USUNFCisJCQkgICAgICAgImZhbl9pbml0OiBpbml0aWFsIGZhbiBzdGF0dXMgaXMgdW5rbm93biwgIgorCQkJICAgICAgICJhc3N1bWluZyBpdCBpcyBpbiBhdXRvIG1vZGVcbiIpOworCQkJdHBfZmVhdHVyZXMuZmFuX2N0cmxfc3RhdHVzX3VuZGVmID0gMTsKKwkJCTs7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIGZhbl9xdWlyazFfaGFuZGxlKHU4ICpmYW5fc3RhdHVzKQoreworCWlmICh1bmxpa2VseSh0cF9mZWF0dXJlcy5mYW5fY3RybF9zdGF0dXNfdW5kZWYpKSB7CisJCWlmICgqZmFuX3N0YXR1cyAhPSBmYW5fY29udHJvbF9pbml0aWFsX3N0YXR1cykgeworCQkJLyogc29tZXRoaW5nIGNoYW5nZWQgdGhlIEhGU1AgcmVnaXNudGVyIHNpbmNlCisJCQkgKiBkcml2ZXIgaW5pdCB0aW1lLCBzbyBpdCBpcyBub3QgdW5kZWZpbmVkCisJCQkgKiBhbnltb3JlICovCisJCQl0cF9mZWF0dXJlcy5mYW5fY3RybF9zdGF0dXNfdW5kZWYgPSAwOworCQl9IGVsc2UgeworCQkJLyogUmV0dXJuIG1vc3QgbGlrZWx5IHN0YXR1cy4gSW4gZmFjdCwgaXQKKwkJCSAqIG1pZ2h0IGJlIHRoZSBvbmx5IHBvc3NpYmxlIHN0YXR1cyAqLworCQkJKmZhbl9zdGF0dXMgPSBUUF9FQ19GQU5fQVVUTzsKKwkJfQorCX0KK30KKworLyoKKyAqIENhbGwgd2l0aCBmYW5fbXV0ZXggaGVsZAorICovCitzdGF0aWMgdm9pZCBmYW5fdXBkYXRlX2Rlc2lyZWRfbGV2ZWwodTggc3RhdHVzKQoreworCWlmICgoc3RhdHVzICYKKwkgICAgIChUUF9FQ19GQU5fQVVUTyB8IFRQX0VDX0ZBTl9GVUxMU1BFRUQpKSA9PSAwKSB7CisJCWlmIChzdGF0dXMgPiA3KQorCQkJZmFuX2NvbnRyb2xfZGVzaXJlZF9sZXZlbCA9IDc7CisJCWVsc2UKKwkJCWZhbl9jb250cm9sX2Rlc2lyZWRfbGV2ZWwgPSBzdGF0dXM7CisJfQorfQorCitzdGF0aWMgaW50IGZhbl9nZXRfc3RhdHVzKHU4ICpzdGF0dXMpCit7CisJdTggczsKKworCS8qIFRPRE86CisJICogQWRkIFRQQUNQSV9GQU5fUkRfQUNQSV9GQU5TID8gKi8KKworCXN3aXRjaCAoZmFuX3N0YXR1c19hY2Nlc3NfbW9kZSkgeworCWNhc2UgVFBBQ1BJX0ZBTl9SRF9BQ1BJX0dGQU46CisJCS8qIDU3MCwgNjAwZS94LCA3NzBlLCA3NzB4ICovCisKKwkJaWYgKHVubGlrZWx5KCFhY3BpX2V2YWxmKGdmYW5faGFuZGxlLCAmcywgTlVMTCwgImQiKSkpCisJCQlyZXR1cm4gLUVJTzsKKworCQlpZiAobGlrZWx5KHN0YXR1cykpCisJCQkqc3RhdHVzID0gcyAmIDB4MDc7CisKKwkJYnJlYWs7CisKKwljYXNlIFRQQUNQSV9GQU5fUkRfVFBFQzoKKwkJLyogYWxsIGV4Y2VwdCA1NzAsIDYwMGUveCwgNzcwZSwgNzcweCAqLworCQlpZiAodW5saWtlbHkoIWFjcGlfZWNfcmVhZChmYW5fc3RhdHVzX29mZnNldCwgJnMpKSkKKwkJCXJldHVybiAtRUlPOworCisJCWlmIChsaWtlbHkoc3RhdHVzKSkgeworCQkJKnN0YXR1cyA9IHM7CisJCQlmYW5fcXVpcmsxX2hhbmRsZShzdGF0dXMpOworCQl9CisKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVOWElPOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGZhbl9nZXRfc3RhdHVzX3NhZmUodTggKnN0YXR1cykKK3sKKwlpbnQgcmM7CisJdTggczsKKworCWlmIChtdXRleF9sb2NrX2tpbGxhYmxlKCZmYW5fbXV0ZXgpKQorCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCXJjID0gZmFuX2dldF9zdGF0dXMoJnMpOworCWlmICghcmMpCisJCWZhbl91cGRhdGVfZGVzaXJlZF9sZXZlbChzKTsKKwltdXRleF91bmxvY2soJmZhbl9tdXRleCk7CisKKwlpZiAoc3RhdHVzKQorCQkqc3RhdHVzID0gczsKKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBmYW5fZ2V0X3NwZWVkKHVuc2lnbmVkIGludCAqc3BlZWQpCit7CisJdTggaGksIGxvOworCisJc3dpdGNoIChmYW5fc3RhdHVzX2FjY2Vzc19tb2RlKSB7CisJY2FzZSBUUEFDUElfRkFOX1JEX1RQRUM6CisJCS8qIGFsbCBleGNlcHQgNTcwLCA2MDBlL3gsIDc3MGUsIDc3MHggKi8KKwkJaWYgKHVubGlrZWx5KCFhY3BpX2VjX3JlYWQoZmFuX3JwbV9vZmZzZXQsICZsbykgfHwKKwkJCSAgICAgIWFjcGlfZWNfcmVhZChmYW5fcnBtX29mZnNldCArIDEsICZoaSkpKQorCQkJcmV0dXJuIC1FSU87CisKKwkJaWYgKGxpa2VseShzcGVlZCkpCisJCQkqc3BlZWQgPSAoaGkgPDwgOCkgfCBsbzsKKworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJldHVybiAtRU5YSU87CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZmFuX3NldF9sZXZlbChpbnQgbGV2ZWwpCit7CisJaWYgKCFmYW5fY29udHJvbF9hbGxvd2VkKQorCQlyZXR1cm4gLUVQRVJNOworCisJc3dpdGNoIChmYW5fY29udHJvbF9hY2Nlc3NfbW9kZSkgeworCWNhc2UgVFBBQ1BJX0ZBTl9XUl9BQ1BJX1NGQU46CisJCWlmIChsZXZlbCA+PSAwICYmIGxldmVsIDw9IDcpIHsKKwkJCWlmICghYWNwaV9ldmFsZihzZmFuX2hhbmRsZSwgTlVMTCwgTlVMTCwgInZkIiwgbGV2ZWwpKQorCQkJCXJldHVybiAtRUlPOworCQl9IGVsc2UKKwkJCXJldHVybiAtRUlOVkFMOworCQlicmVhazsKKworCWNhc2UgVFBBQ1BJX0ZBTl9XUl9BQ1BJX0ZBTlM6CisJY2FzZSBUUEFDUElfRkFOX1dSX1RQRUM6CisJCWlmICghKGxldmVsICYgVFBfRUNfRkFOX0FVVE8pICYmCisJCSAgICAhKGxldmVsICYgVFBfRUNfRkFOX0ZVTExTUEVFRCkgJiYKKwkJICAgICgobGV2ZWwgPCAwKSB8fCAobGV2ZWwgPiA3KSkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQkvKiBzYWZldHkgbmV0IHNob3VsZCB0aGUgRUMgbm90IHN1cHBvcnQgQVVUTworCQkgKiBvciBGVUxMU1BFRUQgbW9kZSBiaXRzIGFuZCBqdXN0IGlnbm9yZSB0aGVtICovCisJCWlmIChsZXZlbCAmIFRQX0VDX0ZBTl9GVUxMU1BFRUQpCisJCQlsZXZlbCB8PSA3OwkvKiBzYWZldHkgbWluIHNwZWVkIDcgKi8KKwkJZWxzZSBpZiAobGV2ZWwgJiBUUF9FQ19GQU5fQVVUTykKKwkJCWxldmVsIHw9IDQ7CS8qIHNhZmV0eSBtaW4gc3BlZWQgNCAqLworCisJCWlmICghYWNwaV9lY193cml0ZShmYW5fc3RhdHVzX29mZnNldCwgbGV2ZWwpKQorCQkJcmV0dXJuIC1FSU87CisJCWVsc2UKKwkJCXRwX2ZlYXR1cmVzLmZhbl9jdHJsX3N0YXR1c191bmRlZiA9IDA7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FTlhJTzsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZmFuX3NldF9sZXZlbF9zYWZlKGludCBsZXZlbCkKK3sKKwlpbnQgcmM7CisKKwlpZiAoIWZhbl9jb250cm9sX2FsbG93ZWQpCisJCXJldHVybiAtRVBFUk07CisKKwlpZiAobXV0ZXhfbG9ja19raWxsYWJsZSgmZmFuX211dGV4KSkKKwkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKworCWlmIChsZXZlbCA9PSBUUEFDUElfRkFOX0xBU1RfTEVWRUwpCisJCWxldmVsID0gZmFuX2NvbnRyb2xfZGVzaXJlZF9sZXZlbDsKKworCXJjID0gZmFuX3NldF9sZXZlbChsZXZlbCk7CisJaWYgKCFyYykKKwkJZmFuX3VwZGF0ZV9kZXNpcmVkX2xldmVsKGxldmVsKTsKKworCW11dGV4X3VubG9jaygmZmFuX211dGV4KTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgZmFuX3NldF9lbmFibGUodm9pZCkKK3sKKwl1OCBzOworCWludCByYzsKKworCWlmICghZmFuX2NvbnRyb2xfYWxsb3dlZCkKKwkJcmV0dXJuIC1FUEVSTTsKKworCWlmIChtdXRleF9sb2NrX2tpbGxhYmxlKCZmYW5fbXV0ZXgpKQorCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCisJc3dpdGNoIChmYW5fY29udHJvbF9hY2Nlc3NfbW9kZSkgeworCWNhc2UgVFBBQ1BJX0ZBTl9XUl9BQ1BJX0ZBTlM6CisJY2FzZSBUUEFDUElfRkFOX1dSX1RQRUM6CisJCXJjID0gZmFuX2dldF9zdGF0dXMoJnMpOworCQlpZiAocmMgPCAwKQorCQkJYnJlYWs7CisKKwkJLyogRG9uJ3QgZ28gb3V0IG9mIGVtZXJnZW5jeSBmYW4gbW9kZSAqLworCQlpZiAocyAhPSA3KSB7CisJCQlzICY9IDB4MDc7CisJCQlzIHw9IFRQX0VDX0ZBTl9BVVRPIHwgNDsgLyogbWluIGZhbiBzcGVlZCA0ICovCisJCX0KKworCQlpZiAoIWFjcGlfZWNfd3JpdGUoZmFuX3N0YXR1c19vZmZzZXQsIHMpKQorCQkJcmMgPSAtRUlPOworCQllbHNlIHsKKwkJCXRwX2ZlYXR1cmVzLmZhbl9jdHJsX3N0YXR1c191bmRlZiA9IDA7CisJCQlyYyA9IDA7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFRQQUNQSV9GQU5fV1JfQUNQSV9TRkFOOgorCQlyYyA9IGZhbl9nZXRfc3RhdHVzKCZzKTsKKwkJaWYgKHJjIDwgMCkKKwkJCWJyZWFrOworCisJCXMgJj0gMHgwNzsKKworCQkvKiBTZXQgZmFuIHRvIGF0IGxlYXN0IGxldmVsIDQgKi8KKwkJcyB8PSA0OworCisJCWlmICghYWNwaV9ldmFsZihzZmFuX2hhbmRsZSwgTlVMTCwgTlVMTCwgInZkIiwgcykpCisJCQlyYyA9IC1FSU87CisJCWVsc2UKKwkJCXJjID0gMDsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyYyA9IC1FTlhJTzsKKwl9CisKKwltdXRleF91bmxvY2soJmZhbl9tdXRleCk7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IGZhbl9zZXRfZGlzYWJsZSh2b2lkKQoreworCWludCByYzsKKworCWlmICghZmFuX2NvbnRyb2xfYWxsb3dlZCkKKwkJcmV0dXJuIC1FUEVSTTsKKworCWlmIChtdXRleF9sb2NrX2tpbGxhYmxlKCZmYW5fbXV0ZXgpKQorCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCisJcmMgPSAwOworCXN3aXRjaCAoZmFuX2NvbnRyb2xfYWNjZXNzX21vZGUpIHsKKwljYXNlIFRQQUNQSV9GQU5fV1JfQUNQSV9GQU5TOgorCWNhc2UgVFBBQ1BJX0ZBTl9XUl9UUEVDOgorCQlpZiAoIWFjcGlfZWNfd3JpdGUoZmFuX3N0YXR1c19vZmZzZXQsIDB4MDApKQorCQkJcmMgPSAtRUlPOworCQllbHNlIHsKKwkJCWZhbl9jb250cm9sX2Rlc2lyZWRfbGV2ZWwgPSAwOworCQkJdHBfZmVhdHVyZXMuZmFuX2N0cmxfc3RhdHVzX3VuZGVmID0gMDsKKwkJfQorCQlicmVhazsKKworCWNhc2UgVFBBQ1BJX0ZBTl9XUl9BQ1BJX1NGQU46CisJCWlmICghYWNwaV9ldmFsZihzZmFuX2hhbmRsZSwgTlVMTCwgTlVMTCwgInZkIiwgMHgwMCkpCisJCQlyYyA9IC1FSU87CisJCWVsc2UKKwkJCWZhbl9jb250cm9sX2Rlc2lyZWRfbGV2ZWwgPSAwOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJjID0gLUVOWElPOworCX0KKworCisJbXV0ZXhfdW5sb2NrKCZmYW5fbXV0ZXgpOworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBmYW5fc2V0X3NwZWVkKGludCBzcGVlZCkKK3sKKwlpbnQgcmM7CisKKwlpZiAoIWZhbl9jb250cm9sX2FsbG93ZWQpCisJCXJldHVybiAtRVBFUk07CisKKwlpZiAobXV0ZXhfbG9ja19raWxsYWJsZSgmZmFuX211dGV4KSkKKwkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKworCXJjID0gMDsKKwlzd2l0Y2ggKGZhbl9jb250cm9sX2FjY2Vzc19tb2RlKSB7CisJY2FzZSBUUEFDUElfRkFOX1dSX0FDUElfRkFOUzoKKwkJaWYgKHNwZWVkID49IDAgJiYgc3BlZWQgPD0gNjU1MzUpIHsKKwkJCWlmICghYWNwaV9ldmFsZihmYW5zX2hhbmRsZSwgTlVMTCwgTlVMTCwgInZkZGQiLAorCQkJCQlzcGVlZCwgc3BlZWQsIHNwZWVkKSkKKwkJCQlyYyA9IC1FSU87CisJCX0gZWxzZQorCQkJcmMgPSAtRUlOVkFMOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJjID0gLUVOWElPOworCX0KKworCW11dGV4X3VubG9jaygmZmFuX211dGV4KTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyB2b2lkIGZhbl93YXRjaGRvZ19yZXNldCh2b2lkKQoreworCXN0YXRpYyBpbnQgZmFuX3dhdGNoZG9nX2FjdGl2ZTsKKworCWlmIChmYW5fY29udHJvbF9hY2Nlc3NfbW9kZSA9PSBUUEFDUElfRkFOX1dSX05PTkUpCisJCXJldHVybjsKKworCWlmIChmYW5fd2F0Y2hkb2dfYWN0aXZlKQorCQljYW5jZWxfZGVsYXllZF93b3JrKCZmYW5fd2F0Y2hkb2dfdGFzayk7CisKKwlpZiAoZmFuX3dhdGNoZG9nX21heGludGVydmFsID4gMCAmJgorCSAgICB0cGFjcGlfbGlmZWN5Y2xlICE9IFRQQUNQSV9MSUZFX0VYSVRJTkcpIHsKKwkJZmFuX3dhdGNoZG9nX2FjdGl2ZSA9IDE7CisJCWlmICghcXVldWVfZGVsYXllZF93b3JrKHRwYWNwaV93cSwgJmZhbl93YXRjaGRvZ190YXNrLAorCQkJCW1zZWNzX3RvX2ppZmZpZXMoZmFuX3dhdGNoZG9nX21heGludGVydmFsCisJCQkJCQkgKiAxMDAwKSkpIHsKKwkJCXByaW50ayhUUEFDUElfRVJSCisJCQkgICAgICAgImZhaWxlZCB0byBxdWV1ZSB0aGUgZmFuIHdhdGNoZG9nLCAiCisJCQkgICAgICAgIndhdGNoZG9nIHdpbGwgbm90IHRyaWdnZXJcbiIpOworCQl9CisJfSBlbHNlCisJCWZhbl93YXRjaGRvZ19hY3RpdmUgPSAwOworfQorCitzdGF0aWMgdm9pZCBmYW5fd2F0Y2hkb2dfZmlyZShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKmlnbm9yZWQpCit7CisJaW50IHJjOworCisJaWYgKHRwYWNwaV9saWZlY3ljbGUgIT0gVFBBQ1BJX0xJRkVfUlVOTklORykKKwkJcmV0dXJuOworCisJcHJpbnRrKFRQQUNQSV9OT1RJQ0UgImZhbiB3YXRjaGRvZzogZW5hYmxpbmcgZmFuXG4iKTsKKwlyYyA9IGZhbl9zZXRfZW5hYmxlKCk7CisJaWYgKHJjIDwgMCkgeworCQlwcmludGsoVFBBQ1BJX0VSUiAiZmFuIHdhdGNoZG9nOiBlcnJvciAlZCB3aGlsZSBlbmFibGluZyBmYW4sICIKKwkJCSJ3aWxsIHRyeSBhZ2FpbiBsYXRlci4uLlxuIiwgLXJjKTsKKwkJLyogcmVzY2hlZHVsZSBmb3IgbGF0ZXIgKi8KKwkJZmFuX3dhdGNoZG9nX3Jlc2V0KCk7CisJfQorfQorCisvKgorICogU1lTRlMgZmFuIGxheW91dDogaHdtb24gY29tcGF0aWJsZSAoZGV2aWNlKQorICoKKyAqIHB3bSpfZW5hYmxlOgorICogCTA6ICJkaXNlbmdhZ2VkIiBtb2RlCisgKiAJMTogbWFudWFsIG1vZGUKKyAqIAkyOiBuYXRpdmUgRUMgImF1dG8iIG1vZGUgKHJlY29tbWVuZGVkLCBoYXJkd2FyZSBkZWZhdWx0KQorICoKKyAqIHB3bSo6IHNldCBzcGVlZCBpbiBtYW51YWwgbW9kZSwgaWdub3JlZCBvdGhlcndpc2UuCisgKiAJMCBpcyBsZXZlbCAwOyAyNTUgaXMgbGV2ZWwgNy4gSW50ZXJtZWRpYXRlIHBvaW50cyBkb25lIHdpdGggbGluZWFyCisgKiAJaW50ZXJwb2xhdGlvbi4KKyAqCisgKiBmYW4qX2lucHV0OiB0YWNob21ldGVyIHJlYWRpbmcsIFJQTQorICoKKyAqCisgKiBTWVNGUyBmYW4gbGF5b3V0OiBleHRlbnNpb25zCisgKgorICogZmFuX3dhdGNoZG9nIChkcml2ZXIpOgorICogCWZhbiB3YXRjaGRvZyBpbnRlcnZhbCBpbiBzZWNvbmRzLCAwIGRpc2FibGVzIChkZWZhdWx0KSwgbWF4IDEyMAorICovCisKKy8qIHN5c2ZzIGZhbiBwd20xX2VuYWJsZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworc3RhdGljIHNzaXplX3QgZmFuX3B3bTFfZW5hYmxlX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkgICAgY2hhciAqYnVmKQoreworCWludCByZXMsIG1vZGU7CisJdTggc3RhdHVzOworCisJcmVzID0gZmFuX2dldF9zdGF0dXNfc2FmZSgmc3RhdHVzKTsKKwlpZiAocmVzKQorCQlyZXR1cm4gcmVzOworCisJaWYgKHN0YXR1cyAmIFRQX0VDX0ZBTl9GVUxMU1BFRUQpIHsKKwkJbW9kZSA9IDA7CisJfSBlbHNlIGlmIChzdGF0dXMgJiBUUF9FQ19GQU5fQVVUTykgeworCQltb2RlID0gMjsKKwl9IGVsc2UKKwkJbW9kZSA9IDE7CisKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZFxuIiwgbW9kZSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGZhbl9wd20xX2VuYWJsZV9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXVuc2lnbmVkIGxvbmcgdDsKKwlpbnQgcmVzLCBsZXZlbDsKKworCWlmIChwYXJzZV9zdHJ0b3VsKGJ1ZiwgMiwgJnQpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXN3aXRjaCAodCkgeworCWNhc2UgMDoKKwkJbGV2ZWwgPSBUUF9FQ19GQU5fRlVMTFNQRUVEOworCQlicmVhazsKKwljYXNlIDE6CisJCWxldmVsID0gVFBBQ1BJX0ZBTl9MQVNUX0xFVkVMOworCQlicmVhazsKKwljYXNlIDI6CisJCWxldmVsID0gVFBfRUNfRkFOX0FVVE87CisJCWJyZWFrOworCWNhc2UgMzoKKwkJLyogcmVzZXJ2ZWQgZm9yIHNvZnR3YXJlLWNvbnRyb2xsZWQgYXV0byBtb2RlICovCisJCXJldHVybiAtRU5PU1lTOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJlcyA9IGZhbl9zZXRfbGV2ZWxfc2FmZShsZXZlbCk7CisJaWYgKHJlcyA9PSAtRU5YSU8pCisJCXJldHVybiAtRUlOVkFMOworCWVsc2UgaWYgKHJlcyA8IDApCisJCXJldHVybiByZXM7CisKKwlmYW5fd2F0Y2hkb2dfcmVzZXQoKTsKKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlIGRldl9hdHRyX2Zhbl9wd20xX2VuYWJsZSA9CisJX19BVFRSKHB3bTFfZW5hYmxlLCBTX0lXVVNSIHwgU19JUlVHTywKKwkJZmFuX3B3bTFfZW5hYmxlX3Nob3csIGZhbl9wd20xX2VuYWJsZV9zdG9yZSk7CisKKy8qIHN5c2ZzIGZhbiBwd20xIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworc3RhdGljIHNzaXplX3QgZmFuX3B3bTFfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJICAgICBjaGFyICpidWYpCit7CisJaW50IHJlczsKKwl1OCBzdGF0dXM7CisKKwlyZXMgPSBmYW5fZ2V0X3N0YXR1c19zYWZlKCZzdGF0dXMpOworCWlmIChyZXMpCisJCXJldHVybiByZXM7CisKKwlpZiAoKHN0YXR1cyAmCisJICAgICAoVFBfRUNfRkFOX0FVVE8gfCBUUF9FQ19GQU5fRlVMTFNQRUVEKSkgIT0gMCkKKwkJc3RhdHVzID0gZmFuX2NvbnRyb2xfZGVzaXJlZF9sZXZlbDsKKworCWlmIChzdGF0dXMgPiA3KQorCQlzdGF0dXMgPSA3OworCisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJXVcbiIsIChzdGF0dXMgKiAyNTUpIC8gNyk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGZhbl9wd20xX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCSAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJICAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJdW5zaWduZWQgbG9uZyBzOworCWludCByYzsKKwl1OCBzdGF0dXMsIG5ld2xldmVsOworCisJaWYgKHBhcnNlX3N0cnRvdWwoYnVmLCAyNTUsICZzKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBzY2FsZSBkb3duIGZyb20gMC0yNTUgdG8gMC03ICovCisJbmV3bGV2ZWwgPSAocyA+PiA1KSAmIDB4MDc7CisKKwlpZiAobXV0ZXhfbG9ja19raWxsYWJsZSgmZmFuX211dGV4KSkKKwkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKworCXJjID0gZmFuX2dldF9zdGF0dXMoJnN0YXR1cyk7CisJaWYgKCFyYyAmJiAoc3RhdHVzICYKKwkJICAgIChUUF9FQ19GQU5fQVVUTyB8IFRQX0VDX0ZBTl9GVUxMU1BFRUQpKSA9PSAwKSB7CisJCXJjID0gZmFuX3NldF9sZXZlbChuZXdsZXZlbCk7CisJCWlmIChyYyA9PSAtRU5YSU8pCisJCQlyYyA9IC1FSU5WQUw7CisJCWVsc2UgaWYgKCFyYykgeworCQkJZmFuX3VwZGF0ZV9kZXNpcmVkX2xldmVsKG5ld2xldmVsKTsKKwkJCWZhbl93YXRjaGRvZ19yZXNldCgpOworCQl9CisJfQorCisJbXV0ZXhfdW5sb2NrKCZmYW5fbXV0ZXgpOworCXJldHVybiAocmMpPyByYyA6IGNvdW50OworfQorCitzdGF0aWMgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgZGV2X2F0dHJfZmFuX3B3bTEgPQorCV9fQVRUUihwd20xLCBTX0lXVVNSIHwgU19JUlVHTywKKwkJZmFuX3B3bTFfc2hvdywgZmFuX3B3bTFfc3RvcmUpOworCisvKiBzeXNmcyBmYW4gZmFuMV9pbnB1dCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3N0YXRpYyBzc2l6ZV90IGZhbl9mYW4xX2lucHV0X3Nob3coc3RydWN0IGRldmljZSAqZGV2LAorCQkJICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICBjaGFyICpidWYpCit7CisJaW50IHJlczsKKwl1bnNpZ25lZCBpbnQgc3BlZWQ7CisKKwlyZXMgPSBmYW5fZ2V0X3NwZWVkKCZzcGVlZCk7CisJaWYgKHJlcyA8IDApCisJCXJldHVybiByZXM7CisKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIldVxuIiwgc3BlZWQpOworfQorCitzdGF0aWMgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgZGV2X2F0dHJfZmFuX2ZhbjFfaW5wdXQgPQorCV9fQVRUUihmYW4xX2lucHV0LCBTX0lSVUdPLAorCQlmYW5fZmFuMV9pbnB1dF9zaG93LCBOVUxMKTsKKworLyogc3lzZnMgZmFuIGZhbl93YXRjaGRvZyAoaHdtb24gZHJpdmVyKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitzdGF0aWMgc3NpemVfdCBmYW5fZmFuX3dhdGNoZG9nX3Nob3coc3RydWN0IGRldmljZV9kcml2ZXIgKmRydiwKKwkJCQkgICAgIGNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIldVxuIiwgZmFuX3dhdGNoZG9nX21heGludGVydmFsKTsKK30KKworc3RhdGljIHNzaXplX3QgZmFuX2Zhbl93YXRjaGRvZ19zdG9yZShzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2LAorCQkJCSAgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXVuc2lnbmVkIGxvbmcgdDsKKworCWlmIChwYXJzZV9zdHJ0b3VsKGJ1ZiwgMTIwLCAmdCkpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCFmYW5fY29udHJvbF9hbGxvd2VkKQorCQlyZXR1cm4gLUVQRVJNOworCisJZmFuX3dhdGNoZG9nX21heGludGVydmFsID0gdDsKKwlmYW5fd2F0Y2hkb2dfcmVzZXQoKTsKKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIERSSVZFUl9BVFRSKGZhbl93YXRjaGRvZywgU19JV1VTUiB8IFNfSVJVR08sCisJCWZhbl9mYW5fd2F0Y2hkb2dfc2hvdywgZmFuX2Zhbl93YXRjaGRvZ19zdG9yZSk7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmZhbl9hdHRyaWJ1dGVzW10gPSB7CisJJmRldl9hdHRyX2Zhbl9wd20xX2VuYWJsZS5hdHRyLCAmZGV2X2F0dHJfZmFuX3B3bTEuYXR0ciwKKwkmZGV2X2F0dHJfZmFuX2ZhbjFfaW5wdXQuYXR0ciwKKwlOVUxMCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBmYW5fYXR0cl9ncm91cCA9IHsKKwkuYXR0cnMgPSBmYW5fYXR0cmlidXRlcywKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGZhbl9pbml0KHN0cnVjdCBpYm1faW5pdF9zdHJ1Y3QgKmlpYm0pCit7CisJaW50IHJjOworCisJdmRiZ19wcmludGsoVFBBQ1BJX0RCR19JTklULCAiaW5pdGlhbGl6aW5nIGZhbiBzdWJkcml2ZXJcbiIpOworCisJbXV0ZXhfaW5pdCgmZmFuX211dGV4KTsKKwlmYW5fc3RhdHVzX2FjY2Vzc19tb2RlID0gVFBBQ1BJX0ZBTl9OT05FOworCWZhbl9jb250cm9sX2FjY2Vzc19tb2RlID0gVFBBQ1BJX0ZBTl9XUl9OT05FOworCWZhbl9jb250cm9sX2NvbW1hbmRzID0gMDsKKwlmYW5fd2F0Y2hkb2dfbWF4aW50ZXJ2YWwgPSAwOworCXRwX2ZlYXR1cmVzLmZhbl9jdHJsX3N0YXR1c191bmRlZiA9IDA7CisJZmFuX2NvbnRyb2xfZGVzaXJlZF9sZXZlbCA9IDc7CisKKwlUUEFDUElfQUNQSUhBTkRMRV9JTklUKGZhbnMpOworCVRQQUNQSV9BQ1BJSEFORExFX0lOSVQoZ2Zhbik7CisJVFBBQ1BJX0FDUElIQU5ETEVfSU5JVChzZmFuKTsKKworCWlmIChnZmFuX2hhbmRsZSkgeworCQkvKiA1NzAsIDYwMGUveCwgNzcwZSwgNzcweCAqLworCQlmYW5fc3RhdHVzX2FjY2Vzc19tb2RlID0gVFBBQ1BJX0ZBTl9SRF9BQ1BJX0dGQU47CisJfSBlbHNlIHsKKwkJLyogYWxsIG90aGVyIFRoaW5rUGFkczogbm90ZSB0aGF0IGV2ZW4gb2xkLXN0eWxlCisJCSAqIFRoaW5rUGFkIEVDcyBzdXBwb3J0cyB0aGUgZmFuIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKwkJaWYgKGxpa2VseShhY3BpX2VjX3JlYWQoZmFuX3N0YXR1c19vZmZzZXQsCisJCQkJCSZmYW5fY29udHJvbF9pbml0aWFsX3N0YXR1cykpKSB7CisJCQlmYW5fc3RhdHVzX2FjY2Vzc19tb2RlID0gVFBBQ1BJX0ZBTl9SRF9UUEVDOworCQkJZmFuX3F1aXJrMV9kZXRlY3QoKTsKKwkJfSBlbHNlIHsKKwkJCXByaW50ayhUUEFDUElfRVJSCisJCQkgICAgICAgIlRoaW5rUGFkIEFDUEkgRUMgYWNjZXNzIG1pc2JlaGF2aW5nLCAiCisJCQkgICAgICAgImZhbiBzdGF0dXMgYW5kIGNvbnRyb2wgdW5hdmFpbGFibGVcbiIpOworCQkJcmV0dXJuIDE7CisJCX0KKwl9CisKKwlpZiAoc2Zhbl9oYW5kbGUpIHsKKwkJLyogNTcwLCA3NzB4LUpMICovCisJCWZhbl9jb250cm9sX2FjY2Vzc19tb2RlID0gVFBBQ1BJX0ZBTl9XUl9BQ1BJX1NGQU47CisJCWZhbl9jb250cm9sX2NvbW1hbmRzIHw9CisJCSAgICBUUEFDUElfRkFOX0NNRF9MRVZFTCB8IFRQQUNQSV9GQU5fQ01EX0VOQUJMRTsKKwl9IGVsc2UgeworCQlpZiAoIWdmYW5faGFuZGxlKSB7CisJCQkvKiBnZmFuIHdpdGhvdXQgc2ZhbiBtZWFucyBubyBmYW4gY29udHJvbCAqLworCQkJLyogYWxsIG90aGVyIG1vZGVscyBpbXBsZW1lbnQgVFAgRUMgMHgyZiBjb250cm9sICovCisKKwkJCWlmIChmYW5zX2hhbmRsZSkgeworCQkJCS8qIFgzMSwgWDQwLCBYNDEgKi8KKwkJCQlmYW5fY29udHJvbF9hY2Nlc3NfbW9kZSA9CisJCQkJICAgIFRQQUNQSV9GQU5fV1JfQUNQSV9GQU5TOworCQkJCWZhbl9jb250cm9sX2NvbW1hbmRzIHw9CisJCQkJICAgIFRQQUNQSV9GQU5fQ01EX1NQRUVEIHwKKwkJCQkgICAgVFBBQ1BJX0ZBTl9DTURfTEVWRUwgfAorCQkJCSAgICBUUEFDUElfRkFOX0NNRF9FTkFCTEU7CisJCQl9IGVsc2UgeworCQkJCWZhbl9jb250cm9sX2FjY2Vzc19tb2RlID0gVFBBQ1BJX0ZBTl9XUl9UUEVDOworCQkJCWZhbl9jb250cm9sX2NvbW1hbmRzIHw9CisJCQkJICAgIFRQQUNQSV9GQU5fQ01EX0xFVkVMIHwKKwkJCQkgICAgVFBBQ1BJX0ZBTl9DTURfRU5BQkxFOworCQkJfQorCQl9CisJfQorCisJdmRiZ19wcmludGsoVFBBQ1BJX0RCR19JTklULCAiZmFuIGlzICVzLCBtb2RlcyAlZCwgJWRcbiIsCisJCXN0cl9zdXBwb3J0ZWQoZmFuX3N0YXR1c19hY2Nlc3NfbW9kZSAhPSBUUEFDUElfRkFOX05PTkUgfHwKKwkJICBmYW5fY29udHJvbF9hY2Nlc3NfbW9kZSAhPSBUUEFDUElfRkFOX1dSX05PTkUpLAorCQlmYW5fc3RhdHVzX2FjY2Vzc19tb2RlLCBmYW5fY29udHJvbF9hY2Nlc3NfbW9kZSk7CisKKwkvKiBmYW4gY29udHJvbCBtYXN0ZXIgc3dpdGNoICovCisJaWYgKCFmYW5fY29udHJvbF9hbGxvd2VkKSB7CisJCWZhbl9jb250cm9sX2FjY2Vzc19tb2RlID0gVFBBQ1BJX0ZBTl9XUl9OT05FOworCQlmYW5fY29udHJvbF9jb21tYW5kcyA9IDA7CisJCWRiZ19wcmludGsoVFBBQ1BJX0RCR19JTklULAorCQkJICAgImZhbiBjb250cm9sIGZlYXR1cmVzIGRpc2FibGVkIGJ5IHBhcmFtZXRlclxuIik7CisJfQorCisJLyogdXBkYXRlIGZhbl9jb250cm9sX2Rlc2lyZWRfbGV2ZWwgKi8KKwlpZiAoZmFuX3N0YXR1c19hY2Nlc3NfbW9kZSAhPSBUUEFDUElfRkFOX05PTkUpCisJCWZhbl9nZXRfc3RhdHVzX3NhZmUoTlVMTCk7CisKKwlpZiAoZmFuX3N0YXR1c19hY2Nlc3NfbW9kZSAhPSBUUEFDUElfRkFOX05PTkUgfHwKKwkgICAgZmFuX2NvbnRyb2xfYWNjZXNzX21vZGUgIT0gVFBBQ1BJX0ZBTl9XUl9OT05FKSB7CisJCXJjID0gc3lzZnNfY3JlYXRlX2dyb3VwKCZ0cGFjcGlfc2Vuc29yc19wZGV2LT5kZXYua29iaiwKKwkJCQkJICZmYW5fYXR0cl9ncm91cCk7CisJCWlmIChyYyA8IDApCisJCQlyZXR1cm4gcmM7CisKKwkJcmMgPSBkcml2ZXJfY3JlYXRlX2ZpbGUoJnRwYWNwaV9od21vbl9wZHJpdmVyLmRyaXZlciwKKwkJCQkJJmRyaXZlcl9hdHRyX2Zhbl93YXRjaGRvZyk7CisJCWlmIChyYyA8IDApIHsKKwkJCXN5c2ZzX3JlbW92ZV9ncm91cCgmdHBhY3BpX3NlbnNvcnNfcGRldi0+ZGV2LmtvYmosCisJCQkJCSZmYW5fYXR0cl9ncm91cCk7CisJCQlyZXR1cm4gcmM7CisJCX0KKwkJcmV0dXJuIDA7CisJfSBlbHNlCisJCXJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCBmYW5fZXhpdCh2b2lkKQoreworCXZkYmdfcHJpbnRrKFRQQUNQSV9EQkdfRVhJVCwKKwkJICAgICJjYW5jZWxsaW5nIGFueSBwZW5kaW5nIGZhbiB3YXRjaGRvZyB0YXNrc1xuIik7CisKKwkvKiBGSVhNRTogY2FuIHdlIHJlYWxseSBkbyB0aGlzIHVuY29uZGl0aW9uYWxseT8gKi8KKwlzeXNmc19yZW1vdmVfZ3JvdXAoJnRwYWNwaV9zZW5zb3JzX3BkZXYtPmRldi5rb2JqLCAmZmFuX2F0dHJfZ3JvdXApOworCWRyaXZlcl9yZW1vdmVfZmlsZSgmdHBhY3BpX2h3bW9uX3Bkcml2ZXIuZHJpdmVyLAorCQkJICAgJmRyaXZlcl9hdHRyX2Zhbl93YXRjaGRvZyk7CisKKwljYW5jZWxfZGVsYXllZF93b3JrKCZmYW5fd2F0Y2hkb2dfdGFzayk7CisJZmx1c2hfd29ya3F1ZXVlKHRwYWNwaV93cSk7Cit9CisKK3N0YXRpYyB2b2lkIGZhbl9zdXNwZW5kKHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3sKKwlpbnQgcmM7CisKKwlpZiAoIWZhbl9jb250cm9sX2FsbG93ZWQpCisJCXJldHVybjsKKworCS8qIFN0b3JlIGZhbiBzdGF0dXMgaW4gY2FjaGUgKi8KKwlmYW5fY29udHJvbF9yZXN1bWVfbGV2ZWwgPSAwOworCXJjID0gZmFuX2dldF9zdGF0dXNfc2FmZSgmZmFuX2NvbnRyb2xfcmVzdW1lX2xldmVsKTsKKwlpZiAocmMgPCAwKQorCQlwcmludGsoVFBBQ1BJX05PVElDRQorCQkJImZhaWxlZCB0byByZWFkIGZhbiBsZXZlbCBmb3IgbGF0ZXIgIgorCQkJInJlc3RvcmUgZHVyaW5nIHJlc3VtZTogJWRcbiIsIHJjKTsKKworCS8qIGlmIGl0IGlzIHVuZGVmaW5lZCwgZG9uJ3QgYXR0ZW1wdCB0byByZXN0b3JlIGl0LgorCSAqIEtFRVAgVEhJUyBMQVNUICovCisJaWYgKHRwX2ZlYXR1cmVzLmZhbl9jdHJsX3N0YXR1c191bmRlZikKKwkJZmFuX2NvbnRyb2xfcmVzdW1lX2xldmVsID0gMDsKK30KKworc3RhdGljIHZvaWQgZmFuX3Jlc3VtZSh2b2lkKQoreworCXU4IGN1cnJlbnRfbGV2ZWwgPSA3OworCWJvb2wgZG9fc2V0ID0gZmFsc2U7CisJaW50IHJjOworCisJLyogRFNEVCAqYWx3YXlzKiB1cGRhdGVzIHN0YXR1cyBvbiByZXN1bWUgKi8KKwl0cF9mZWF0dXJlcy5mYW5fY3RybF9zdGF0dXNfdW5kZWYgPSAwOworCisJaWYgKCFmYW5fY29udHJvbF9hbGxvd2VkIHx8CisJICAgICFmYW5fY29udHJvbF9yZXN1bWVfbGV2ZWwgfHwKKwkgICAgKGZhbl9nZXRfc3RhdHVzX3NhZmUoJmN1cnJlbnRfbGV2ZWwpIDwgMCkpCisJCXJldHVybjsKKworCXN3aXRjaCAoZmFuX2NvbnRyb2xfYWNjZXNzX21vZGUpIHsKKwljYXNlIFRQQUNQSV9GQU5fV1JfQUNQSV9TRkFOOgorCQkvKiBuZXZlciBkZWNyZWFzZSBmYW4gbGV2ZWwgKi8KKwkJZG9fc2V0ID0gKGZhbl9jb250cm9sX3Jlc3VtZV9sZXZlbCA+IGN1cnJlbnRfbGV2ZWwpOworCQlicmVhazsKKwljYXNlIFRQQUNQSV9GQU5fV1JfQUNQSV9GQU5TOgorCWNhc2UgVFBBQ1BJX0ZBTl9XUl9UUEVDOgorCQkvKiBuZXZlciBkZWNyZWFzZSBmYW4gbGV2ZWwsIHNjYWxlIGlzOgorCQkgKiBUUF9FQ19GQU5fRlVMTFNQRUVEID4gNyA+PSBUUF9FQ19GQU5fQVVUTworCQkgKgorCQkgKiBXZSBleHBlY3QgdGhlIGZpcm13YXJlIHRvIHNldCBlaXRoZXIgNyBvciBBVVRPLCBidXQgd2UKKwkJICogaGFuZGxlIEZVTExTUEVFRCBvdXQgb2YgcGFyYW5vaWEuCisJCSAqCisJCSAqIFNvLCB3ZSBjYW4gc2FmZWx5IG9ubHkgcmVzdG9yZSBGVUxMU1BFRUQgb3IgNywgYW55dGhpbmcKKwkJICogZWxzZSBjb3VsZCBzbG93IHRoZSBmYW4uICBSZXN0b3JpbmcgQVVUTyBpcyB1c2VsZXNzLCBhdAorCQkgKiBiZXN0IHRoYXQncyBleGFjdGx5IHdoYXQgdGhlIERTRFQgYWxyZWFkeSBzZXQgKGl0IGlzIHRoZQorCQkgKiBzbG93ZXIgaXQgdXNlcykuCisJCSAqCisJCSAqIEFsd2F5cyBrZWVwIGluIG1pbmQgdGhhdCB0aGUgRFNEVCAqd2lsbCogaGF2ZSBzZXQgdGhlCisJCSAqIGZhbnMgdG8gd2hhdCB0aGUgdmVuZG9yIHN1cHBvc2VzIGlzIHRoZSBiZXN0IGxldmVsLiAgV2UKKwkJICogbXVjayB3aXRoIGl0IG9ubHkgdG8gc3BlZWQgdGhlIGZhbiB1cC4KKwkJICovCisJCWlmIChmYW5fY29udHJvbF9yZXN1bWVfbGV2ZWwgIT0gNyAmJgorCQkgICAgIShmYW5fY29udHJvbF9yZXN1bWVfbGV2ZWwgJiBUUF9FQ19GQU5fRlVMTFNQRUVEKSkKKwkJCXJldHVybjsKKwkJZWxzZQorCQkJZG9fc2V0ID0gIShjdXJyZW50X2xldmVsICYgVFBfRUNfRkFOX0ZVTExTUEVFRCkgJiYKKwkJCQkgKGN1cnJlbnRfbGV2ZWwgIT0gZmFuX2NvbnRyb2xfcmVzdW1lX2xldmVsKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuOworCX0KKwlpZiAoZG9fc2V0KSB7CisJCXByaW50ayhUUEFDUElfTk9USUNFCisJCQkicmVzdG9yaW5nIGZhbiBsZXZlbCB0byAweCUwMnhcbiIsCisJCQlmYW5fY29udHJvbF9yZXN1bWVfbGV2ZWwpOworCQlyYyA9IGZhbl9zZXRfbGV2ZWxfc2FmZShmYW5fY29udHJvbF9yZXN1bWVfbGV2ZWwpOworCQlpZiAocmMgPCAwKQorCQkJcHJpbnRrKFRQQUNQSV9OT1RJQ0UKKwkJCQkiZmFpbGVkIHRvIHJlc3RvcmUgZmFuIGxldmVsOiAlZFxuIiwgcmMpOworCX0KK30KKworc3RhdGljIGludCBmYW5fcmVhZChjaGFyICpwKQoreworCWludCBsZW4gPSAwOworCWludCByYzsKKwl1OCBzdGF0dXM7CisJdW5zaWduZWQgaW50IHNwZWVkID0gMDsKKworCXN3aXRjaCAoZmFuX3N0YXR1c19hY2Nlc3NfbW9kZSkgeworCWNhc2UgVFBBQ1BJX0ZBTl9SRF9BQ1BJX0dGQU46CisJCS8qIDU3MCwgNjAwZS94LCA3NzBlLCA3NzB4ICovCisJCXJjID0gZmFuX2dldF9zdGF0dXNfc2FmZSgmc3RhdHVzKTsKKwkJaWYgKHJjIDwgMCkKKwkJCXJldHVybiByYzsKKworCQlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAic3RhdHVzOlx0XHQlc1xuIgorCQkJICAgICAgICJsZXZlbDpcdFx0JWRcbiIsCisJCQkgICAgICAgKHN0YXR1cyAhPSAwKSA/ICJlbmFibGVkIiA6ICJkaXNhYmxlZCIsIHN0YXR1cyk7CisJCWJyZWFrOworCisJY2FzZSBUUEFDUElfRkFOX1JEX1RQRUM6CisJCS8qIGFsbCBleGNlcHQgNTcwLCA2MDBlL3gsIDc3MGUsIDc3MHggKi8KKwkJcmMgPSBmYW5fZ2V0X3N0YXR1c19zYWZlKCZzdGF0dXMpOworCQlpZiAocmMgPCAwKQorCQkJcmV0dXJuIHJjOworCisJCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICJzdGF0dXM6XHRcdCVzXG4iLAorCQkJICAgICAgIChzdGF0dXMgIT0gMCkgPyAiZW5hYmxlZCIgOiAiZGlzYWJsZWQiKTsKKworCQlyYyA9IGZhbl9nZXRfc3BlZWQoJnNwZWVkKTsKKwkJaWYgKHJjIDwgMCkKKwkJCXJldHVybiByYzsKKworCQlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAic3BlZWQ6XHRcdCVkXG4iLCBzcGVlZCk7CisKKwkJaWYgKHN0YXR1cyAmIFRQX0VDX0ZBTl9GVUxMU1BFRUQpCisJCQkvKiBEaXNlbmdhZ2VkIG1vZGUgdGFrZXMgcHJlY2VkZW5jZSAqLworCQkJbGVuICs9IHNwcmludGYocCArIGxlbiwgImxldmVsOlx0XHRkaXNlbmdhZ2VkXG4iKTsKKwkJZWxzZSBpZiAoc3RhdHVzICYgVFBfRUNfRkFOX0FVVE8pCisJCQlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAibGV2ZWw6XHRcdGF1dG9cbiIpOworCQllbHNlCisJCQlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAibGV2ZWw6XHRcdCVkXG4iLCBzdGF0dXMpOworCQlicmVhazsKKworCWNhc2UgVFBBQ1BJX0ZBTl9OT05FOgorCWRlZmF1bHQ6CisJCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICJzdGF0dXM6XHRcdG5vdCBzdXBwb3J0ZWRcbiIpOworCX0KKworCWlmIChmYW5fY29udHJvbF9jb21tYW5kcyAmIFRQQUNQSV9GQU5fQ01EX0xFVkVMKSB7CisJCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICJjb21tYW5kczpcdGxldmVsIDxsZXZlbD4iKTsKKworCQlzd2l0Y2ggKGZhbl9jb250cm9sX2FjY2Vzc19tb2RlKSB7CisJCWNhc2UgVFBBQ1BJX0ZBTl9XUl9BQ1BJX1NGQU46CisJCQlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAiICg8bGV2ZWw+IGlzIDAtNylcbiIpOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICIgKDxsZXZlbD4gaXMgMC03LCAiCisJCQkJICAgICAgICJhdXRvLCBkaXNlbmdhZ2VkLCBmdWxsLXNwZWVkKVxuIik7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmIChmYW5fY29udHJvbF9jb21tYW5kcyAmIFRQQUNQSV9GQU5fQ01EX0VOQUJMRSkKKwkJbGVuICs9IHNwcmludGYocCArIGxlbiwgImNvbW1hbmRzOlx0ZW5hYmxlLCBkaXNhYmxlXG4iCisJCQkgICAgICAgImNvbW1hbmRzOlx0d2F0Y2hkb2cgPHRpbWVvdXQ+ICg8dGltZW91dD4gIgorCQkJICAgICAgICJpcyAwIChvZmYpLCAxLTEyMCAoc2Vjb25kcykpXG4iKTsKKworCWlmIChmYW5fY29udHJvbF9jb21tYW5kcyAmIFRQQUNQSV9GQU5fQ01EX1NQRUVEKQorCQlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAiY29tbWFuZHM6XHRzcGVlZCA8c3BlZWQ+IgorCQkJICAgICAgICIgKDxzcGVlZD4gaXMgMC02NTUzNSlcbiIpOworCisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIGludCBmYW5fd3JpdGVfY21kX2xldmVsKGNvbnN0IGNoYXIgKmNtZCwgaW50ICpyYykKK3sKKwlpbnQgbGV2ZWw7CisKKwlpZiAoc3RybGVuY21wKGNtZCwgImxldmVsIGF1dG8iKSA9PSAwKQorCQlsZXZlbCA9IFRQX0VDX0ZBTl9BVVRPOworCWVsc2UgaWYgKChzdHJsZW5jbXAoY21kLCAibGV2ZWwgZGlzZW5nYWdlZCIpID09IDApIHwKKwkJCShzdHJsZW5jbXAoY21kLCAibGV2ZWwgZnVsbC1zcGVlZCIpID09IDApKQorCQlsZXZlbCA9IFRQX0VDX0ZBTl9GVUxMU1BFRUQ7CisJZWxzZSBpZiAoc3NjYW5mKGNtZCwgImxldmVsICVkIiwgJmxldmVsKSAhPSAxKQorCQlyZXR1cm4gMDsKKworCSpyYyA9IGZhbl9zZXRfbGV2ZWxfc2FmZShsZXZlbCk7CisJaWYgKCpyYyA9PSAtRU5YSU8pCisJCXByaW50ayhUUEFDUElfRVJSICJsZXZlbCBjb21tYW5kIGFjY2VwdGVkIGZvciB1bnN1cHBvcnRlZCAiCisJCSAgICAgICAiYWNjZXNzIG1vZGUgJWQiLCBmYW5fY29udHJvbF9hY2Nlc3NfbW9kZSk7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBmYW5fd3JpdGVfY21kX2VuYWJsZShjb25zdCBjaGFyICpjbWQsIGludCAqcmMpCit7CisJaWYgKHN0cmxlbmNtcChjbWQsICJlbmFibGUiKSAhPSAwKQorCQlyZXR1cm4gMDsKKworCSpyYyA9IGZhbl9zZXRfZW5hYmxlKCk7CisJaWYgKCpyYyA9PSAtRU5YSU8pCisJCXByaW50ayhUUEFDUElfRVJSICJlbmFibGUgY29tbWFuZCBhY2NlcHRlZCBmb3IgdW5zdXBwb3J0ZWQgIgorCQkgICAgICAgImFjY2VzcyBtb2RlICVkIiwgZmFuX2NvbnRyb2xfYWNjZXNzX21vZGUpOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgZmFuX3dyaXRlX2NtZF9kaXNhYmxlKGNvbnN0IGNoYXIgKmNtZCwgaW50ICpyYykKK3sKKwlpZiAoc3RybGVuY21wKGNtZCwgImRpc2FibGUiKSAhPSAwKQorCQlyZXR1cm4gMDsKKworCSpyYyA9IGZhbl9zZXRfZGlzYWJsZSgpOworCWlmICgqcmMgPT0gLUVOWElPKQorCQlwcmludGsoVFBBQ1BJX0VSUiAiZGlzYWJsZSBjb21tYW5kIGFjY2VwdGVkIGZvciB1bnN1cHBvcnRlZCAiCisJCSAgICAgICAiYWNjZXNzIG1vZGUgJWQiLCBmYW5fY29udHJvbF9hY2Nlc3NfbW9kZSk7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBmYW5fd3JpdGVfY21kX3NwZWVkKGNvbnN0IGNoYXIgKmNtZCwgaW50ICpyYykKK3sKKwlpbnQgc3BlZWQ7CisKKwkvKiBUT0RPOgorCSAqIFN1cHBvcnQgc3BlZWQgPGxvdz4gPG1lZGl1bT4gPGhpZ2g+ID8gKi8KKworCWlmIChzc2NhbmYoY21kLCAic3BlZWQgJWQiLCAmc3BlZWQpICE9IDEpCisJCXJldHVybiAwOworCisJKnJjID0gZmFuX3NldF9zcGVlZChzcGVlZCk7CisJaWYgKCpyYyA9PSAtRU5YSU8pCisJCXByaW50ayhUUEFDUElfRVJSICJzcGVlZCBjb21tYW5kIGFjY2VwdGVkIGZvciB1bnN1cHBvcnRlZCAiCisJCSAgICAgICAiYWNjZXNzIG1vZGUgJWQiLCBmYW5fY29udHJvbF9hY2Nlc3NfbW9kZSk7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBmYW5fd3JpdGVfY21kX3dhdGNoZG9nKGNvbnN0IGNoYXIgKmNtZCwgaW50ICpyYykKK3sKKwlpbnQgaW50ZXJ2YWw7CisKKwlpZiAoc3NjYW5mKGNtZCwgIndhdGNoZG9nICVkIiwgJmludGVydmFsKSAhPSAxKQorCQlyZXR1cm4gMDsKKworCWlmIChpbnRlcnZhbCA8IDAgfHwgaW50ZXJ2YWwgPiAxMjApCisJCSpyYyA9IC1FSU5WQUw7CisJZWxzZQorCQlmYW5fd2F0Y2hkb2dfbWF4aW50ZXJ2YWwgPSBpbnRlcnZhbDsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IGZhbl93cml0ZShjaGFyICpidWYpCit7CisJY2hhciAqY21kOworCWludCByYyA9IDA7CisKKwl3aGlsZSAoIXJjICYmIChjbWQgPSBuZXh0X2NtZCgmYnVmKSkpIHsKKwkJaWYgKCEoKGZhbl9jb250cm9sX2NvbW1hbmRzICYgVFBBQ1BJX0ZBTl9DTURfTEVWRUwpICYmCisJCSAgICAgIGZhbl93cml0ZV9jbWRfbGV2ZWwoY21kLCAmcmMpKSAmJgorCQkgICAgISgoZmFuX2NvbnRyb2xfY29tbWFuZHMgJiBUUEFDUElfRkFOX0NNRF9FTkFCTEUpICYmCisJCSAgICAgIChmYW5fd3JpdGVfY21kX2VuYWJsZShjbWQsICZyYykgfHwKKwkJICAgICAgIGZhbl93cml0ZV9jbWRfZGlzYWJsZShjbWQsICZyYykgfHwKKwkJICAgICAgIGZhbl93cml0ZV9jbWRfd2F0Y2hkb2coY21kLCAmcmMpKSkgJiYKKwkJICAgICEoKGZhbl9jb250cm9sX2NvbW1hbmRzICYgVFBBQ1BJX0ZBTl9DTURfU1BFRUQpICYmCisJCSAgICAgIGZhbl93cml0ZV9jbWRfc3BlZWQoY21kLCAmcmMpKQorCQkgICAgKQorCQkJcmMgPSAtRUlOVkFMOworCQllbHNlIGlmICghcmMpCisJCQlmYW5fd2F0Y2hkb2dfcmVzZXQoKTsKKwl9CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaWJtX3N0cnVjdCBmYW5fZHJpdmVyX2RhdGEgPSB7CisJLm5hbWUgPSAiZmFuIiwKKwkucmVhZCA9IGZhbl9yZWFkLAorCS53cml0ZSA9IGZhbl93cml0ZSwKKwkuZXhpdCA9IGZhbl9leGl0LAorCS5zdXNwZW5kID0gZmFuX3N1c3BlbmQsCisJLnJlc3VtZSA9IGZhbl9yZXN1bWUsCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBJbmZyYXN0cnVjdHVyZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogc3lzZnMgbmFtZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitzdGF0aWMgc3NpemVfdCB0aGlua3BhZF9hY3BpX3BkZXZfbmFtZV9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCSAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJICAgY2hhciAqYnVmKQoreworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVzXG4iLCBUUEFDUElfTkFNRSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSBkZXZfYXR0cl90aGlua3BhZF9hY3BpX3BkZXZfbmFtZSA9CisJX19BVFRSKG5hbWUsIFNfSVJVR08sIHRoaW5rcGFkX2FjcGlfcGRldl9uYW1lX3Nob3csIE5VTEwpOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogL3Byb2Mgc3VwcG9ydCAqLworc3RhdGljIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcHJvY19kaXI7CisKKy8qCisgKiBNb2R1bGUgYW5kIGluZnJhc3RydWN0dXJlIHByb2JsZSwgaW5pdCBhbmQgZXhpdCBoYW5kbGluZworICovCisKK3N0YXRpYyBpbnQgZm9yY2VfbG9hZDsKKworI2lmZGVmIENPTkZJR19USElOS1BBRF9BQ1BJX0RFQlVHCitzdGF0aWMgY29uc3QgY2hhciAqIF9faW5pdCBzdHJfc3VwcG9ydGVkKGludCBpc19zdXBwb3J0ZWQpCit7CisJc3RhdGljIGNoYXIgdGV4dF91bnN1cHBvcnRlZFtdIF9faW5pdGRhdGEgPSAibm90IHN1cHBvcnRlZCI7CisKKwlyZXR1cm4gKGlzX3N1cHBvcnRlZCk/ICZ0ZXh0X3Vuc3VwcG9ydGVkWzRdIDogJnRleHRfdW5zdXBwb3J0ZWRbMF07Cit9CisjZW5kaWYgLyogQ09ORklHX1RISU5LUEFEX0FDUElfREVCVUcgKi8KKworc3RhdGljIHZvaWQgaWJtX2V4aXQoc3RydWN0IGlibV9zdHJ1Y3QgKmlibSkKK3sKKwlkYmdfcHJpbnRrKFRQQUNQSV9EQkdfRVhJVCwgInJlbW92aW5nICVzXG4iLCBpYm0tPm5hbWUpOworCisJbGlzdF9kZWxfaW5pdCgmaWJtLT5hbGxfZHJpdmVycyk7CisKKwlpZiAoaWJtLT5mbGFncy5hY3BpX25vdGlmeV9pbnN0YWxsZWQpIHsKKwkJZGJnX3ByaW50ayhUUEFDUElfREJHX0VYSVQsCisJCQkiJXM6IGFjcGlfcmVtb3ZlX25vdGlmeV9oYW5kbGVyXG4iLCBpYm0tPm5hbWUpOworCQlCVUdfT04oIWlibS0+YWNwaSk7CisJCWFjcGlfcmVtb3ZlX25vdGlmeV9oYW5kbGVyKCppYm0tPmFjcGktPmhhbmRsZSwKKwkJCQkJICAgaWJtLT5hY3BpLT50eXBlLAorCQkJCQkgICBkaXNwYXRjaF9hY3BpX25vdGlmeSk7CisJCWlibS0+ZmxhZ3MuYWNwaV9ub3RpZnlfaW5zdGFsbGVkID0gMDsKKwkJaWJtLT5mbGFncy5hY3BpX25vdGlmeV9pbnN0YWxsZWQgPSAwOworCX0KKworCWlmIChpYm0tPmZsYWdzLnByb2NfY3JlYXRlZCkgeworCQlkYmdfcHJpbnRrKFRQQUNQSV9EQkdfRVhJVCwKKwkJCSIlczogcmVtb3ZlX3Byb2NfZW50cnlcbiIsIGlibS0+bmFtZSk7CisJCXJlbW92ZV9wcm9jX2VudHJ5KGlibS0+bmFtZSwgcHJvY19kaXIpOworCQlpYm0tPmZsYWdzLnByb2NfY3JlYXRlZCA9IDA7CisJfQorCisJaWYgKGlibS0+ZmxhZ3MuYWNwaV9kcml2ZXJfcmVnaXN0ZXJlZCkgeworCQlkYmdfcHJpbnRrKFRQQUNQSV9EQkdfRVhJVCwKKwkJCSIlczogYWNwaV9idXNfdW5yZWdpc3Rlcl9kcml2ZXJcbiIsIGlibS0+bmFtZSk7CisJCUJVR19PTighaWJtLT5hY3BpKTsKKwkJYWNwaV9idXNfdW5yZWdpc3Rlcl9kcml2ZXIoaWJtLT5hY3BpLT5kcml2ZXIpOworCQlrZnJlZShpYm0tPmFjcGktPmRyaXZlcik7CisJCWlibS0+YWNwaS0+ZHJpdmVyID0gTlVMTDsKKwkJaWJtLT5mbGFncy5hY3BpX2RyaXZlcl9yZWdpc3RlcmVkID0gMDsKKwl9CisKKwlpZiAoaWJtLT5mbGFncy5pbml0X2NhbGxlZCAmJiBpYm0tPmV4aXQpIHsKKwkJaWJtLT5leGl0KCk7CisJCWlibS0+ZmxhZ3MuaW5pdF9jYWxsZWQgPSAwOworCX0KKworCWRiZ19wcmludGsoVFBBQ1BJX0RCR19JTklULCAiZmluaXNoZWQgcmVtb3ZpbmcgJXNcbiIsIGlibS0+bmFtZSk7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGlibV9pbml0KHN0cnVjdCBpYm1faW5pdF9zdHJ1Y3QgKmlpYm0pCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgaWJtX3N0cnVjdCAqaWJtID0gaWlibS0+ZGF0YTsKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmVudHJ5OworCisJQlVHX09OKGlibSA9PSBOVUxMKTsKKworCUlOSVRfTElTVF9IRUFEKCZpYm0tPmFsbF9kcml2ZXJzKTsKKworCWlmIChpYm0tPmZsYWdzLmV4cGVyaW1lbnRhbCAmJiAhZXhwZXJpbWVudGFsKQorCQlyZXR1cm4gMDsKKworCWRiZ19wcmludGsoVFBBQ1BJX0RCR19JTklULAorCQkicHJvYmluZyBmb3IgJXNcbiIsIGlibS0+bmFtZSk7CisKKwlpZiAoaWlibS0+aW5pdCkgeworCQlyZXQgPSBpaWJtLT5pbml0KGlpYm0pOworCQlpZiAocmV0ID4gMCkKKwkJCXJldHVybiAwOwkvKiBwcm9iZSBmYWlsZWQgKi8KKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisKKwkJaWJtLT5mbGFncy5pbml0X2NhbGxlZCA9IDE7CisJfQorCisJaWYgKGlibS0+YWNwaSkgeworCQlpZiAoaWJtLT5hY3BpLT5oaWQpIHsKKwkJCXJldCA9IHJlZ2lzdGVyX3RwYWNwaV9zdWJkcml2ZXIoaWJtKTsKKwkJCWlmIChyZXQpCisJCQkJZ290byBlcnJfb3V0OworCQl9CisKKwkJaWYgKGlibS0+YWNwaS0+bm90aWZ5KSB7CisJCQlyZXQgPSBzZXR1cF9hY3BpX25vdGlmeShpYm0pOworCQkJaWYgKHJldCA9PSAtRU5PREVWKSB7CisJCQkJcHJpbnRrKFRQQUNQSV9OT1RJQ0UgImRpc2FibGluZyBzdWJkcml2ZXIgJXNcbiIsCisJCQkJCWlibS0+bmFtZSk7CisJCQkJcmV0ID0gMDsKKwkJCQlnb3RvIGVycl9vdXQ7CisJCQl9CisJCQlpZiAocmV0IDwgMCkKKwkJCQlnb3RvIGVycl9vdXQ7CisJCX0KKwl9CisKKwlkYmdfcHJpbnRrKFRQQUNQSV9EQkdfSU5JVCwKKwkJIiVzIGluc3RhbGxlZFxuIiwgaWJtLT5uYW1lKTsKKworCWlmIChpYm0tPnJlYWQpIHsKKwkJZW50cnkgPSBjcmVhdGVfcHJvY19lbnRyeShpYm0tPm5hbWUsCisJCQkJCSAgU19JRlJFRyB8IFNfSVJVR08gfCBTX0lXVVNSLAorCQkJCQkgIHByb2NfZGlyKTsKKwkJaWYgKCFlbnRyeSkgeworCQkJcHJpbnRrKFRQQUNQSV9FUlIgInVuYWJsZSB0byBjcmVhdGUgcHJvYyBlbnRyeSAlc1xuIiwKKwkJCSAgICAgICBpYm0tPm5hbWUpOworCQkJcmV0ID0gLUVOT0RFVjsKKwkJCWdvdG8gZXJyX291dDsKKwkJfQorCQllbnRyeS0+b3duZXIgPSBUSElTX01PRFVMRTsKKwkJZW50cnktPmRhdGEgPSBpYm07CisJCWVudHJ5LT5yZWFkX3Byb2MgPSAmZGlzcGF0Y2hfcHJvY2ZzX3JlYWQ7CisJCWlmIChpYm0tPndyaXRlKQorCQkJZW50cnktPndyaXRlX3Byb2MgPSAmZGlzcGF0Y2hfcHJvY2ZzX3dyaXRlOworCQlpYm0tPmZsYWdzLnByb2NfY3JlYXRlZCA9IDE7CisJfQorCisJbGlzdF9hZGRfdGFpbCgmaWJtLT5hbGxfZHJpdmVycywgJnRwYWNwaV9hbGxfZHJpdmVycyk7CisKKwlyZXR1cm4gMDsKKworZXJyX291dDoKKwlkYmdfcHJpbnRrKFRQQUNQSV9EQkdfSU5JVCwKKwkJIiVzOiBhdCBlcnJvciBleGl0IHBhdGggd2l0aCByZXN1bHQgJWRcbiIsCisJCWlibS0+bmFtZSwgcmV0KTsKKworCWlibV9leGl0KGlibSk7CisJcmV0dXJuIChyZXQgPCAwKT8gcmV0IDogMDsKK30KKworLyogUHJvYmluZyAqLworCisvKiByZXR1cm5zIDAgLSBwcm9iZSBvaywgb3IgPCAwIC0gcHJvYmUgZXJyb3IuCisgKiBQcm9iZSBvayBkb2Vzbid0IG1lYW4gdGhpbmtwYWQgZm91bmQuCisgKiBPbiBlcnJvciwga2ZyZWUoKSBjbGVhbnVwIG9uIHRwLT4qIGlzIG5vdCBwZXJmb3JtZWQsIGNhbGxlciBtdXN0IGRvIGl0ICovCitzdGF0aWMgaW50IF9fbXVzdF9jaGVjayBfX2luaXQgZ2V0X3RoaW5rcGFkX21vZGVsX2RhdGEoCisJCQkJCQlzdHJ1Y3QgdGhpbmtwYWRfaWRfZGF0YSAqdHApCit7CisJY29uc3Qgc3RydWN0IGRtaV9kZXZpY2UgKmRldiA9IE5VTEw7CisJY2hhciBlY19md19zdHJpbmdbMThdOworCWNoYXIgY29uc3QgKnM7CisKKwlpZiAoIXRwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW1lbXNldCh0cCwgMCwgc2l6ZW9mKCp0cCkpOworCisJaWYgKGRtaV9uYW1lX2luX3ZlbmRvcnMoIklCTSIpKQorCQl0cC0+dmVuZG9yID0gUENJX1ZFTkRPUl9JRF9JQk07CisJZWxzZSBpZiAoZG1pX25hbWVfaW5fdmVuZG9ycygiTEVOT1ZPIikpCisJCXRwLT52ZW5kb3IgPSBQQ0lfVkVORE9SX0lEX0xFTk9WTzsKKwllbHNlCisJCXJldHVybiAwOworCisJcyA9IGRtaV9nZXRfc3lzdGVtX2luZm8oRE1JX0JJT1NfVkVSU0lPTik7CisJdHAtPmJpb3NfdmVyc2lvbl9zdHIgPSBrc3RyZHVwKHMsIEdGUF9LRVJORUwpOworCWlmIChzICYmICF0cC0+Ymlvc192ZXJzaW9uX3N0cikKKwkJcmV0dXJuIC1FTk9NRU07CisJaWYgKCF0cC0+Ymlvc192ZXJzaW9uX3N0cikKKwkJcmV0dXJuIDA7CisJdHAtPmJpb3NfbW9kZWwgPSB0cC0+Ymlvc192ZXJzaW9uX3N0clswXQorCQkJIHwgKHRwLT5iaW9zX3ZlcnNpb25fc3RyWzFdIDw8IDgpOworCisJLyoKKwkgKiBUaGlua1BhZCBUMjMgb3IgbmV3ZXIsIEEzMSBvciBuZXdlciwgUjUwZSBvciBuZXdlciwKKwkgKiBYMzIgb3IgbmV3ZXIsIGFsbCBaIHNlcmllczsgIFNvbWUgbW9kZWxzIG11c3QgaGF2ZSBhbgorCSAqIHVwLXRvLWRhdGUgQklPUyBvciB0aGV5IHdpbGwgbm90IGJlIGRldGVjdGVkLgorCSAqCisJICogU2VlIGh0dHA6Ly90aGlua3dpa2kub3JnL3dpa2kvTGlzdF9vZl9ETUlfSURzCisJICovCisJd2hpbGUgKChkZXYgPSBkbWlfZmluZF9kZXZpY2UoRE1JX0RFVl9UWVBFX09FTV9TVFJJTkcsIE5VTEwsIGRldikpKSB7CisJCWlmIChzc2NhbmYoZGV2LT5uYW1lLAorCQkJICAgIklCTSBUaGlua1BhZCBFbWJlZGRlZCBDb250cm9sbGVyIC1bJTE3YyIsCisJCQkgICBlY19md19zdHJpbmcpID09IDEpIHsKKwkJCWVjX2Z3X3N0cmluZ1tzaXplb2YoZWNfZndfc3RyaW5nKSAtIDFdID0gMDsKKwkJCWVjX2Z3X3N0cmluZ1tzdHJjc3BuKGVjX2Z3X3N0cmluZywgIiBdIildID0gMDsKKworCQkJdHAtPmVjX3ZlcnNpb25fc3RyID0ga3N0cmR1cChlY19md19zdHJpbmcsIEdGUF9LRVJORUwpOworCQkJaWYgKCF0cC0+ZWNfdmVyc2lvbl9zdHIpCisJCQkJcmV0dXJuIC1FTk9NRU07CisJCQl0cC0+ZWNfbW9kZWwgPSBlY19md19zdHJpbmdbMF0KKwkJCQkJfCAoZWNfZndfc3RyaW5nWzFdIDw8IDgpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlzID0gZG1pX2dldF9zeXN0ZW1faW5mbyhETUlfUFJPRFVDVF9WRVJTSU9OKTsKKwlpZiAocyAmJiAhc3RybmljbXAocywgIlRoaW5rUGFkIiwgOCkpIHsKKwkJdHAtPm1vZGVsX3N0ciA9IGtzdHJkdXAocywgR0ZQX0tFUk5FTCk7CisJCWlmICghdHAtPm1vZGVsX3N0cikKKwkJCXJldHVybiAtRU5PTUVNOworCX0KKworCXMgPSBkbWlfZ2V0X3N5c3RlbV9pbmZvKERNSV9QUk9EVUNUX05BTUUpOworCXRwLT5udW1tb2RlbF9zdHIgPSBrc3RyZHVwKHMsIEdGUF9LRVJORUwpOworCWlmIChzICYmICF0cC0+bnVtbW9kZWxfc3RyKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9faW5pdCBwcm9iZV9mb3JfdGhpbmtwYWQodm9pZCkKK3sKKwlpbnQgaXNfdGhpbmtwYWQ7CisKKwlpZiAoYWNwaV9kaXNhYmxlZCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwkvKgorCSAqIE5vbi1hbmNpZW50IG1vZGVscyBoYXZlIGJldHRlciBETUkgdGFnZ2luZywgYnV0IHZlcnkgb2xkIG1vZGVscworCSAqIGRvbid0LgorCSAqLworCWlzX3RoaW5rcGFkID0gKHRoaW5rcGFkX2lkLm1vZGVsX3N0ciAhPSBOVUxMKTsKKworCS8qIGVjIGlzIHJlcXVpcmVkIGJlY2F1c2UgbWFueSBvdGhlciBoYW5kbGVzIGFyZSByZWxhdGl2ZSB0byBpdCAqLworCVRQQUNQSV9BQ1BJSEFORExFX0lOSVQoZWMpOworCWlmICghZWNfaGFuZGxlKSB7CisJCWlmIChpc190aGlua3BhZCkKKwkJCXByaW50ayhUUEFDUElfRVJSCisJCQkJIk5vdCB5ZXQgc3VwcG9ydGVkIFRoaW5rUGFkIGRldGVjdGVkIVxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCS8qCisJICogUmlza3MgYSByZWdyZXNzaW9uIG9uIHZlcnkgb2xkIG1hY2hpbmVzLCBidXQgcmVkdWNlcyBwb3RlbnRpYWwKKwkgKiBmYWxzZSBwb3NpdGl2ZXMgYSBkYW1uIGdyZWF0IGRlYWwKKwkgKi8KKwlpZiAoIWlzX3RoaW5rcGFkKQorCQlpc190aGlua3BhZCA9ICh0aGlua3BhZF9pZC52ZW5kb3IgPT0gUENJX1ZFTkRPUl9JRF9JQk0pOworCisJaWYgKCFpc190aGlua3BhZCAmJiAhZm9yY2VfbG9hZCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlyZXR1cm4gMDsKK30KKworCisvKiBNb2R1bGUgaW5pdCwgZXhpdCwgcGFyYW1ldGVycyAqLworCitzdGF0aWMgc3RydWN0IGlibV9pbml0X3N0cnVjdCBpYm1zX2luaXRbXSBfX2luaXRkYXRhID0geworCXsKKwkJLmluaXQgPSB0aGlua3BhZF9hY3BpX2RyaXZlcl9pbml0LAorCQkuZGF0YSA9ICZ0aGlua3BhZF9hY3BpX2RyaXZlcl9kYXRhLAorCX0sCisJeworCQkuaW5pdCA9IGhvdGtleV9pbml0LAorCQkuZGF0YSA9ICZob3RrZXlfZHJpdmVyX2RhdGEsCisJfSwKKwl7CisJCS5pbml0ID0gYmx1ZXRvb3RoX2luaXQsCisJCS5kYXRhID0gJmJsdWV0b290aF9kcml2ZXJfZGF0YSwKKwl9LAorCXsKKwkJLmluaXQgPSB3YW5faW5pdCwKKwkJLmRhdGEgPSAmd2FuX2RyaXZlcl9kYXRhLAorCX0sCisJeworCQkuaW5pdCA9IHV3Yl9pbml0LAorCQkuZGF0YSA9ICZ1d2JfZHJpdmVyX2RhdGEsCisJfSwKKyNpZmRlZiBDT05GSUdfVEhJTktQQURfQUNQSV9WSURFTworCXsKKwkJLmluaXQgPSB2aWRlb19pbml0LAorCQkuZGF0YSA9ICZ2aWRlb19kcml2ZXJfZGF0YSwKKwl9LAorI2VuZGlmCisJeworCQkuaW5pdCA9IGxpZ2h0X2luaXQsCisJCS5kYXRhID0gJmxpZ2h0X2RyaXZlcl9kYXRhLAorCX0sCisjaWZkZWYgQ09ORklHX1RISU5LUEFEX0FDUElfRE9DSworCXsKKwkJLmluaXQgPSBkb2NrX2luaXQsCisJCS5kYXRhID0gJmRvY2tfZHJpdmVyX2RhdGFbMF0sCisJfSwKKwl7CisJCS5pbml0ID0gZG9ja19pbml0MiwKKwkJLmRhdGEgPSAmZG9ja19kcml2ZXJfZGF0YVsxXSwKKwl9LAorI2VuZGlmCisjaWZkZWYgQ09ORklHX1RISU5LUEFEX0FDUElfQkFZCisJeworCQkuaW5pdCA9IGJheV9pbml0LAorCQkuZGF0YSA9ICZiYXlfZHJpdmVyX2RhdGEsCisJfSwKKyNlbmRpZgorCXsKKwkJLmluaXQgPSBjbW9zX2luaXQsCisJCS5kYXRhID0gJmNtb3NfZHJpdmVyX2RhdGEsCisJfSwKKwl7CisJCS5pbml0ID0gbGVkX2luaXQsCisJCS5kYXRhID0gJmxlZF9kcml2ZXJfZGF0YSwKKwl9LAorCXsKKwkJLmluaXQgPSBiZWVwX2luaXQsCisJCS5kYXRhID0gJmJlZXBfZHJpdmVyX2RhdGEsCisJfSwKKwl7CisJCS5pbml0ID0gdGhlcm1hbF9pbml0LAorCQkuZGF0YSA9ICZ0aGVybWFsX2RyaXZlcl9kYXRhLAorCX0sCisJeworCQkuZGF0YSA9ICZlY2R1bXBfZHJpdmVyX2RhdGEsCisJfSwKKwl7CisJCS5pbml0ID0gYnJpZ2h0bmVzc19pbml0LAorCQkuZGF0YSA9ICZicmlnaHRuZXNzX2RyaXZlcl9kYXRhLAorCX0sCisJeworCQkuZGF0YSA9ICZ2b2x1bWVfZHJpdmVyX2RhdGEsCisJfSwKKwl7CisJCS5pbml0ID0gZmFuX2luaXQsCisJCS5kYXRhID0gJmZhbl9kcml2ZXJfZGF0YSwKKwl9LAorfTsKKworc3RhdGljIGludCBfX2luaXQgc2V0X2libV9wYXJhbShjb25zdCBjaGFyICp2YWwsIHN0cnVjdCBrZXJuZWxfcGFyYW0gKmtwKQoreworCXVuc2lnbmVkIGludCBpOworCXN0cnVjdCBpYm1fc3RydWN0ICppYm07CisKKwlpZiAoIWtwIHx8ICFrcC0+bmFtZSB8fCAhdmFsKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGlibXNfaW5pdCk7IGkrKykgeworCQlpYm0gPSBpYm1zX2luaXRbaV0uZGF0YTsKKwkJV0FSTl9PTihpYm0gPT0gTlVMTCk7CisKKwkJaWYgKCFpYm0gfHwgIWlibS0+bmFtZSkKKwkJCWNvbnRpbnVlOworCisJCWlmIChzdHJjbXAoaWJtLT5uYW1lLCBrcC0+bmFtZSkgPT0gMCAmJiBpYm0tPndyaXRlKSB7CisJCQlpZiAoc3RybGVuKHZhbCkgPiBzaXplb2YoaWJtc19pbml0W2ldLnBhcmFtKSAtIDIpCisJCQkJcmV0dXJuIC1FTk9TUEM7CisJCQlzdHJjcHkoaWJtc19pbml0W2ldLnBhcmFtLCB2YWwpOworCQkJc3RyY2F0KGlibXNfaW5pdFtpXS5wYXJhbSwgIiwiKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK21vZHVsZV9wYXJhbShleHBlcmltZW50YWwsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGV4cGVyaW1lbnRhbCwKKwkJICJFbmFibGVzIGV4cGVyaW1lbnRhbCBmZWF0dXJlcyB3aGVuIG5vbi16ZXJvIik7CisKK21vZHVsZV9wYXJhbV9uYW1lZChkZWJ1ZywgZGJnX2xldmVsLCB1aW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJTZXRzIGRlYnVnIGxldmVsIGJpdC1tYXNrIik7CisKK21vZHVsZV9wYXJhbShmb3JjZV9sb2FkLCBib29sLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoZm9yY2VfbG9hZCwKKwkJICJBdHRlbXB0cyB0byBsb2FkIHRoZSBkcml2ZXIgZXZlbiBvbiBhICIKKwkJICJtaXMtaWRlbnRpZmllZCBUaGlua1BhZCB3aGVuIHRydWUiKTsKKworbW9kdWxlX3BhcmFtX25hbWVkKGZhbl9jb250cm9sLCBmYW5fY29udHJvbF9hbGxvd2VkLCBib29sLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoZmFuX2NvbnRyb2wsCisJCSAiRW5hYmxlcyBzZXR0aW5nIGZhbiBwYXJhbWV0ZXJzIGZlYXR1cmVzIHdoZW4gdHJ1ZSIpOworCittb2R1bGVfcGFyYW1fbmFtZWQoYnJpZ2h0bmVzc19tb2RlLCBicmlnaHRuZXNzX21vZGUsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGJyaWdodG5lc3NfbW9kZSwKKwkJICJTZWxlY3RzIGJyaWdodG5lc3MgY29udHJvbCBzdHJhdGVneTogIgorCQkgIjA9YXV0bywgMT1FQywgMj1DTU9TLCAzPWJvdGgiKTsKKworbW9kdWxlX3BhcmFtKGJyaWdodG5lc3NfZW5hYmxlLCB1aW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoYnJpZ2h0bmVzc19lbmFibGUsCisJCSAiRW5hYmxlcyBiYWNrbGlnaHQgY29udHJvbCB3aGVuIDEsIGRpc2FibGVzIHdoZW4gMCIpOworCittb2R1bGVfcGFyYW0oaG90a2V5X3JlcG9ydF9tb2RlLCB1aW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoaG90a2V5X3JlcG9ydF9tb2RlLAorCQkgInVzZWQgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHdpdGggdXNlcnNwYWNlLCAiCisJCSAic2VlIGRvY3VtZW50YXRpb24iKTsKKworI2RlZmluZSBUUEFDUElfUEFSQU0oZmVhdHVyZSkgXAorCW1vZHVsZV9wYXJhbV9jYWxsKGZlYXR1cmUsIHNldF9pYm1fcGFyYW0sIE5VTEwsIE5VTEwsIDApOyBcCisJTU9EVUxFX1BBUk1fREVTQyhmZWF0dXJlLCAiU2ltdWxhdGVzIHRoaW5rcGFkLWFjcGkgcHJvY2ZzIGNvbW1hbmQgIiBcCisJCQkgImF0IG1vZHVsZSBsb2FkLCBzZWUgZG9jdW1lbnRhdGlvbiIpCisKK1RQQUNQSV9QQVJBTShob3RrZXkpOworVFBBQ1BJX1BBUkFNKGJsdWV0b290aCk7CitUUEFDUElfUEFSQU0odmlkZW8pOworVFBBQ1BJX1BBUkFNKGxpZ2h0KTsKKyNpZmRlZiBDT05GSUdfVEhJTktQQURfQUNQSV9ET0NLCitUUEFDUElfUEFSQU0oZG9jayk7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfVEhJTktQQURfQUNQSV9CQVkKK1RQQUNQSV9QQVJBTShiYXkpOworI2VuZGlmIC8qIENPTkZJR19USElOS1BBRF9BQ1BJX0JBWSAqLworVFBBQ1BJX1BBUkFNKGNtb3MpOworVFBBQ1BJX1BBUkFNKGxlZCk7CitUUEFDUElfUEFSQU0oYmVlcCk7CitUUEFDUElfUEFSQU0oZWNkdW1wKTsKK1RQQUNQSV9QQVJBTShicmlnaHRuZXNzKTsKK1RQQUNQSV9QQVJBTSh2b2x1bWUpOworVFBBQ1BJX1BBUkFNKGZhbik7CisKKyNpZmRlZiBDT05GSUdfVEhJTktQQURfQUNQSV9ERUJVR0ZBQ0lMSVRJRVMKK21vZHVsZV9wYXJhbShkYmdfd2xzd2VtdWwsIHVpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhkYmdfd2xzd2VtdWwsICJFbmFibGVzIFdMU1cgZW11bGF0aW9uIik7Cittb2R1bGVfcGFyYW1fbmFtZWQod2xzd19zdGF0ZSwgdHBhY3BpX3dsc3dfZW11bHN0YXRlLCBib29sLCAwKTsKK01PRFVMRV9QQVJNX0RFU0Mod2xzd19zdGF0ZSwKKwkJICJJbml0aWFsIHN0YXRlIG9mIHRoZSBlbXVsYXRlZCBXTFNXIHN3aXRjaCIpOworCittb2R1bGVfcGFyYW0oZGJnX2JsdWV0b290aGVtdWwsIHVpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhkYmdfYmx1ZXRvb3RoZW11bCwgIkVuYWJsZXMgYmx1ZXRvb3RoIHN3aXRjaCBlbXVsYXRpb24iKTsKK21vZHVsZV9wYXJhbV9uYW1lZChibHVldG9vdGhfc3RhdGUsIHRwYWNwaV9ibHVldG9vdGhfZW11bHN0YXRlLCBib29sLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoYmx1ZXRvb3RoX3N0YXRlLAorCQkgIkluaXRpYWwgc3RhdGUgb2YgdGhlIGVtdWxhdGVkIGJsdWV0b290aCBzd2l0Y2giKTsKKworbW9kdWxlX3BhcmFtKGRiZ193d2FuZW11bCwgdWludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGRiZ193d2FuZW11bCwgIkVuYWJsZXMgV1dBTiBzd2l0Y2ggZW11bGF0aW9uIik7Cittb2R1bGVfcGFyYW1fbmFtZWQod3dhbl9zdGF0ZSwgdHBhY3BpX3d3YW5fZW11bHN0YXRlLCBib29sLCAwKTsKK01PRFVMRV9QQVJNX0RFU0Mod3dhbl9zdGF0ZSwKKwkJICJJbml0aWFsIHN0YXRlIG9mIHRoZSBlbXVsYXRlZCBXV0FOIHN3aXRjaCIpOworCittb2R1bGVfcGFyYW0oZGJnX3V3YmVtdWwsIHVpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhkYmdfdXdiZW11bCwgIkVuYWJsZXMgVVdCIHN3aXRjaCBlbXVsYXRpb24iKTsKK21vZHVsZV9wYXJhbV9uYW1lZCh1d2Jfc3RhdGUsIHRwYWNwaV91d2JfZW11bHN0YXRlLCBib29sLCAwKTsKK01PRFVMRV9QQVJNX0RFU0ModXdiX3N0YXRlLAorCQkgIkluaXRpYWwgc3RhdGUgb2YgdGhlIGVtdWxhdGVkIFVXQiBzd2l0Y2giKTsKKyNlbmRpZgorCitzdGF0aWMgdm9pZCB0aGlua3BhZF9hY3BpX21vZHVsZV9leGl0KHZvaWQpCit7CisJc3RydWN0IGlibV9zdHJ1Y3QgKmlibSwgKml0bXA7CisKKwl0cGFjcGlfbGlmZWN5Y2xlID0gVFBBQ1BJX0xJRkVfRVhJVElORzsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZV9yZXZlcnNlKGlibSwgaXRtcCwKKwkJCQkJICZ0cGFjcGlfYWxsX2RyaXZlcnMsCisJCQkJCSBhbGxfZHJpdmVycykgeworCQlpYm1fZXhpdChpYm0pOworCX0KKworCWRiZ19wcmludGsoVFBBQ1BJX0RCR19JTklULCAiZmluaXNoZWQgc3ViZHJpdmVyIGV4aXQgcGF0aC4uLlxuIik7CisKKwlpZiAodHBhY3BpX2lucHV0ZGV2KSB7CisJCWlmICh0cF9mZWF0dXJlcy5pbnB1dF9kZXZpY2VfcmVnaXN0ZXJlZCkKKwkJCWlucHV0X3VucmVnaXN0ZXJfZGV2aWNlKHRwYWNwaV9pbnB1dGRldik7CisJCWVsc2UKKwkJCWlucHV0X2ZyZWVfZGV2aWNlKHRwYWNwaV9pbnB1dGRldik7CisJfQorCisJaWYgKHRwYWNwaV9od21vbikKKwkJaHdtb25fZGV2aWNlX3VucmVnaXN0ZXIodHBhY3BpX2h3bW9uKTsKKworCWlmICh0cF9mZWF0dXJlcy5zZW5zb3JzX3BkZXZfYXR0cnNfcmVnaXN0ZXJlZCkKKwkJZGV2aWNlX3JlbW92ZV9maWxlKCZ0cGFjcGlfc2Vuc29yc19wZGV2LT5kZXYsCisJCQkJICAgJmRldl9hdHRyX3RoaW5rcGFkX2FjcGlfcGRldl9uYW1lKTsKKwlpZiAodHBhY3BpX3NlbnNvcnNfcGRldikKKwkJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIodHBhY3BpX3NlbnNvcnNfcGRldik7CisJaWYgKHRwYWNwaV9wZGV2KQorCQlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3Rlcih0cGFjcGlfcGRldik7CisKKwlpZiAodHBfZmVhdHVyZXMuc2Vuc29yc19wZHJ2X2F0dHJzX3JlZ2lzdGVyZWQpCisJCXRwYWNwaV9yZW1vdmVfZHJpdmVyX2F0dHJpYnV0ZXMoJnRwYWNwaV9od21vbl9wZHJpdmVyLmRyaXZlcik7CisJaWYgKHRwX2ZlYXR1cmVzLnBsYXRmb3JtX2Rydl9hdHRyc19yZWdpc3RlcmVkKQorCQl0cGFjcGlfcmVtb3ZlX2RyaXZlcl9hdHRyaWJ1dGVzKCZ0cGFjcGlfcGRyaXZlci5kcml2ZXIpOworCisJaWYgKHRwX2ZlYXR1cmVzLnNlbnNvcnNfcGRydl9yZWdpc3RlcmVkKQorCQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmdHBhY3BpX2h3bW9uX3Bkcml2ZXIpOworCisJaWYgKHRwX2ZlYXR1cmVzLnBsYXRmb3JtX2Rydl9yZWdpc3RlcmVkKQorCQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmdHBhY3BpX3Bkcml2ZXIpOworCisJaWYgKHByb2NfZGlyKQorCQlyZW1vdmVfcHJvY19lbnRyeShUUEFDUElfUFJPQ19ESVIsIGFjcGlfcm9vdF9kaXIpOworCisJaWYgKHRwYWNwaV93cSkKKwkJZGVzdHJveV93b3JrcXVldWUodHBhY3BpX3dxKTsKKworCWtmcmVlKHRoaW5rcGFkX2lkLmJpb3NfdmVyc2lvbl9zdHIpOworCWtmcmVlKHRoaW5rcGFkX2lkLmVjX3ZlcnNpb25fc3RyKTsKKwlrZnJlZSh0aGlua3BhZF9pZC5tb2RlbF9zdHIpOworfQorCisKK3N0YXRpYyBpbnQgX19pbml0IHRoaW5rcGFkX2FjcGlfbW9kdWxlX2luaXQodm9pZCkKK3sKKwlpbnQgcmV0LCBpOworCisJdHBhY3BpX2xpZmVjeWNsZSA9IFRQQUNQSV9MSUZFX0lOSVQ7CisKKwkvKiBQYXJhbWV0ZXIgY2hlY2tpbmcgKi8KKwlpZiAoaG90a2V5X3JlcG9ydF9tb2RlID4gMikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBEcml2ZXItbGV2ZWwgcHJvYmUgKi8KKworCXJldCA9IGdldF90aGlua3BhZF9tb2RlbF9kYXRhKCZ0aGlua3BhZF9pZCk7CisJaWYgKHJldCkgeworCQlwcmludGsoVFBBQ1BJX0VSUgorCQkJInVuYWJsZSB0byBnZXQgRE1JIGRhdGE6ICVkXG4iLCByZXQpOworCQl0aGlua3BhZF9hY3BpX21vZHVsZV9leGl0KCk7CisJCXJldHVybiByZXQ7CisJfQorCXJldCA9IHByb2JlX2Zvcl90aGlua3BhZCgpOworCWlmIChyZXQpIHsKKwkJdGhpbmtwYWRfYWNwaV9tb2R1bGVfZXhpdCgpOworCQlyZXR1cm4gcmV0OworCX0KKworCS8qIERyaXZlciBpbml0aWFsaXphdGlvbiAqLworCisJVFBBQ1BJX0FDUElIQU5ETEVfSU5JVChlY3JkKTsKKwlUUEFDUElfQUNQSUhBTkRMRV9JTklUKGVjd3IpOworCisJdHBhY3BpX3dxID0gY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoVFBBQ1BJX1dPUktRVUVVRV9OQU1FKTsKKwlpZiAoIXRwYWNwaV93cSkgeworCQl0aGlua3BhZF9hY3BpX21vZHVsZV9leGl0KCk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXByb2NfZGlyID0gcHJvY19ta2RpcihUUEFDUElfUFJPQ19ESVIsIGFjcGlfcm9vdF9kaXIpOworCWlmICghcHJvY19kaXIpIHsKKwkJcHJpbnRrKFRQQUNQSV9FUlIKKwkJICAgICAgICJ1bmFibGUgdG8gY3JlYXRlIHByb2MgZGlyICIgVFBBQ1BJX1BST0NfRElSKTsKKwkJdGhpbmtwYWRfYWNwaV9tb2R1bGVfZXhpdCgpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJcHJvY19kaXItPm93bmVyID0gVEhJU19NT0RVTEU7CisKKwlyZXQgPSBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnRwYWNwaV9wZHJpdmVyKTsKKwlpZiAocmV0KSB7CisJCXByaW50ayhUUEFDUElfRVJSCisJCSAgICAgICAidW5hYmxlIHRvIHJlZ2lzdGVyIG1haW4gcGxhdGZvcm0gZHJpdmVyXG4iKTsKKwkJdGhpbmtwYWRfYWNwaV9tb2R1bGVfZXhpdCgpOworCQlyZXR1cm4gcmV0OworCX0KKwl0cF9mZWF0dXJlcy5wbGF0Zm9ybV9kcnZfcmVnaXN0ZXJlZCA9IDE7CisKKwlyZXQgPSBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnRwYWNwaV9od21vbl9wZHJpdmVyKTsKKwlpZiAocmV0KSB7CisJCXByaW50ayhUUEFDUElfRVJSCisJCSAgICAgICAidW5hYmxlIHRvIHJlZ2lzdGVyIGh3bW9uIHBsYXRmb3JtIGRyaXZlclxuIik7CisJCXRoaW5rcGFkX2FjcGlfbW9kdWxlX2V4aXQoKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJdHBfZmVhdHVyZXMuc2Vuc29yc19wZHJ2X3JlZ2lzdGVyZWQgPSAxOworCisJcmV0ID0gdHBhY3BpX2NyZWF0ZV9kcml2ZXJfYXR0cmlidXRlcygmdHBhY3BpX3Bkcml2ZXIuZHJpdmVyKTsKKwlpZiAoIXJldCkgeworCQl0cF9mZWF0dXJlcy5wbGF0Zm9ybV9kcnZfYXR0cnNfcmVnaXN0ZXJlZCA9IDE7CisJCXJldCA9IHRwYWNwaV9jcmVhdGVfZHJpdmVyX2F0dHJpYnV0ZXMoCisJCQkJCSZ0cGFjcGlfaHdtb25fcGRyaXZlci5kcml2ZXIpOworCX0KKwlpZiAocmV0KSB7CisJCXByaW50ayhUUEFDUElfRVJSCisJCSAgICAgICAidW5hYmxlIHRvIGNyZWF0ZSBzeXNmcyBkcml2ZXIgYXR0cmlidXRlc1xuIik7CisJCXRoaW5rcGFkX2FjcGlfbW9kdWxlX2V4aXQoKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJdHBfZmVhdHVyZXMuc2Vuc29yc19wZHJ2X2F0dHJzX3JlZ2lzdGVyZWQgPSAxOworCisKKwkvKiBEZXZpY2UgaW5pdGlhbGl6YXRpb24gKi8KKwl0cGFjcGlfcGRldiA9IHBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcl9zaW1wbGUoVFBBQ1BJX0RSVlJfTkFNRSwgLTEsCisJCQkJCQkJTlVMTCwgMCk7CisJaWYgKElTX0VSUih0cGFjcGlfcGRldikpIHsKKwkJcmV0ID0gUFRSX0VSUih0cGFjcGlfcGRldik7CisJCXRwYWNwaV9wZGV2ID0gTlVMTDsKKwkJcHJpbnRrKFRQQUNQSV9FUlIgInVuYWJsZSB0byByZWdpc3RlciBwbGF0Zm9ybSBkZXZpY2VcbiIpOworCQl0aGlua3BhZF9hY3BpX21vZHVsZV9leGl0KCk7CisJCXJldHVybiByZXQ7CisJfQorCXRwYWNwaV9zZW5zb3JzX3BkZXYgPSBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXJfc2ltcGxlKAorCQkJCQkJVFBBQ1BJX0hXTU9OX0RSVlJfTkFNRSwKKwkJCQkJCS0xLCBOVUxMLCAwKTsKKwlpZiAoSVNfRVJSKHRwYWNwaV9zZW5zb3JzX3BkZXYpKSB7CisJCXJldCA9IFBUUl9FUlIodHBhY3BpX3NlbnNvcnNfcGRldik7CisJCXRwYWNwaV9zZW5zb3JzX3BkZXYgPSBOVUxMOworCQlwcmludGsoVFBBQ1BJX0VSUgorCQkgICAgICAgInVuYWJsZSB0byByZWdpc3RlciBod21vbiBwbGF0Zm9ybSBkZXZpY2VcbiIpOworCQl0aGlua3BhZF9hY3BpX21vZHVsZV9leGl0KCk7CisJCXJldHVybiByZXQ7CisJfQorCXJldCA9IGRldmljZV9jcmVhdGVfZmlsZSgmdHBhY3BpX3NlbnNvcnNfcGRldi0+ZGV2LAorCQkJCSAmZGV2X2F0dHJfdGhpbmtwYWRfYWNwaV9wZGV2X25hbWUpOworCWlmIChyZXQpIHsKKwkJcHJpbnRrKFRQQUNQSV9FUlIKKwkJICAgICAgICJ1bmFibGUgdG8gY3JlYXRlIHN5c2ZzIGh3bW9uIGRldmljZSBhdHRyaWJ1dGVzXG4iKTsKKwkJdGhpbmtwYWRfYWNwaV9tb2R1bGVfZXhpdCgpOworCQlyZXR1cm4gcmV0OworCX0KKwl0cF9mZWF0dXJlcy5zZW5zb3JzX3BkZXZfYXR0cnNfcmVnaXN0ZXJlZCA9IDE7CisJdHBhY3BpX2h3bW9uID0gaHdtb25fZGV2aWNlX3JlZ2lzdGVyKCZ0cGFjcGlfc2Vuc29yc19wZGV2LT5kZXYpOworCWlmIChJU19FUlIodHBhY3BpX2h3bW9uKSkgeworCQlyZXQgPSBQVFJfRVJSKHRwYWNwaV9od21vbik7CisJCXRwYWNwaV9od21vbiA9IE5VTEw7CisJCXByaW50ayhUUEFDUElfRVJSICJ1bmFibGUgdG8gcmVnaXN0ZXIgaHdtb24gZGV2aWNlXG4iKTsKKwkJdGhpbmtwYWRfYWNwaV9tb2R1bGVfZXhpdCgpOworCQlyZXR1cm4gcmV0OworCX0KKwltdXRleF9pbml0KCZ0cGFjcGlfaW5wdXRkZXZfc2VuZF9tdXRleCk7CisJdHBhY3BpX2lucHV0ZGV2ID0gaW5wdXRfYWxsb2NhdGVfZGV2aWNlKCk7CisJaWYgKCF0cGFjcGlfaW5wdXRkZXYpIHsKKwkJcHJpbnRrKFRQQUNQSV9FUlIgInVuYWJsZSB0byBhbGxvY2F0ZSBpbnB1dCBkZXZpY2VcbiIpOworCQl0aGlua3BhZF9hY3BpX21vZHVsZV9leGl0KCk7CisJCXJldHVybiAtRU5PTUVNOworCX0gZWxzZSB7CisJCS8qIFByZXBhcmUgaW5wdXQgZGV2aWNlLCBidXQgZG9uJ3QgcmVnaXN0ZXIgKi8KKwkJdHBhY3BpX2lucHV0ZGV2LT5uYW1lID0gIlRoaW5rUGFkIEV4dHJhIEJ1dHRvbnMiOworCQl0cGFjcGlfaW5wdXRkZXYtPnBoeXMgPSBUUEFDUElfRFJWUl9OQU1FICIvaW5wdXQwIjsKKwkJdHBhY3BpX2lucHV0ZGV2LT5pZC5idXN0eXBlID0gQlVTX0hPU1Q7CisJCXRwYWNwaV9pbnB1dGRldi0+aWQudmVuZG9yID0gKHRoaW5rcGFkX2lkLnZlbmRvcikgPworCQkJCQkJdGhpbmtwYWRfaWQudmVuZG9yIDoKKwkJCQkJCVBDSV9WRU5ET1JfSURfSUJNOworCQl0cGFjcGlfaW5wdXRkZXYtPmlkLnByb2R1Y3QgPSBUUEFDUElfSEtFWV9JTlBVVF9QUk9EVUNUOworCQl0cGFjcGlfaW5wdXRkZXYtPmlkLnZlcnNpb24gPSBUUEFDUElfSEtFWV9JTlBVVF9WRVJTSU9OOworCX0KKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShpYm1zX2luaXQpOyBpKyspIHsKKwkJcmV0ID0gaWJtX2luaXQoJmlibXNfaW5pdFtpXSk7CisJCWlmIChyZXQgPj0gMCAmJiAqaWJtc19pbml0W2ldLnBhcmFtKQorCQkJcmV0ID0gaWJtc19pbml0W2ldLmRhdGEtPndyaXRlKGlibXNfaW5pdFtpXS5wYXJhbSk7CisJCWlmIChyZXQgPCAwKSB7CisJCQl0aGlua3BhZF9hY3BpX21vZHVsZV9leGl0KCk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCXJldCA9IGlucHV0X3JlZ2lzdGVyX2RldmljZSh0cGFjcGlfaW5wdXRkZXYpOworCWlmIChyZXQgPCAwKSB7CisJCXByaW50ayhUUEFDUElfRVJSICJ1bmFibGUgdG8gcmVnaXN0ZXIgaW5wdXQgZGV2aWNlXG4iKTsKKwkJdGhpbmtwYWRfYWNwaV9tb2R1bGVfZXhpdCgpOworCQlyZXR1cm4gcmV0OworCX0gZWxzZSB7CisJCXRwX2ZlYXR1cmVzLmlucHV0X2RldmljZV9yZWdpc3RlcmVkID0gMTsKKwl9CisKKwl0cGFjcGlfbGlmZWN5Y2xlID0gVFBBQ1BJX0xJRkVfUlVOTklORzsKKwlyZXR1cm4gMDsKK30KKworLyogUGxlYXNlIHJlbW92ZSB0aGlzIGluIHllYXIgMjAwOSAqLworTU9EVUxFX0FMSUFTKCJpYm1fYWNwaSIpOworCitNT0RVTEVfQUxJQVMoVFBBQ1BJX0RSVlJfU0hPUlROQU1FKTsKKworLyoKKyAqIERNSSBtYXRjaGluZyBmb3IgbW9kdWxlIGF1dG9sb2FkaW5nCisgKgorICogU2VlIGh0dHA6Ly90aGlua3dpa2kub3JnL3dpa2kvTGlzdF9vZl9ETUlfSURzCisgKiBTZWUgaHR0cDovL3RoaW5rd2lraS5vcmcvd2lraS9CSU9TX1VwZ3JhZGVfRG93bmxvYWRzCisgKgorICogT25seSBtb2RlbHMgbGlzdGVkIGluIHRoaW5rd2lraSB3aWxsIGJlIHN1cHBvcnRlZCwgc28gYWRkIHlvdXJzCisgKiBpZiBpdCBpcyBub3QgdGhlcmUgeWV0LgorICovCisjZGVmaW5lIElCTV9CSU9TX01PRFVMRV9BTElBUyhfX3R5cGUpIFwKKwlNT0RVTEVfQUxJQVMoImRtaTpidm5JQk06YnZyIiBfX3R5cGUgIkVUPz9XVyIpCisKKy8qIE5vbi1hbmNpZW50IHRoaW5rcGFkcyAqLworTU9EVUxFX0FMSUFTKCJkbWk6YnZuSUJNOio6c3ZuSUJNOio6cHZyVGhpbmtQYWQqOnJ2bklCTToqIik7CitNT0RVTEVfQUxJQVMoImRtaTpidm5MRU5PVk86Kjpzdm5MRU5PVk86KjpwdnJUaGlua1BhZCo6cnZuTEVOT1ZPOioiKTsKKworLyogQW5jaWVudCB0aGlua3BhZCBCSU9TZXMgaGF2ZSB0byBiZSBpZGVudGlmaWVkIGJ5CisgKiBCSU9TIHR5cGUgb3IgbW9kZWwgbnVtYmVyLCBhbmQgdGhlcmUgYXJlIGZhciBsZXNzCisgKiBCSU9TIHR5cGVzIHRoYW4gbW9kZWwgbnVtYmVycy4uLiAqLworSUJNX0JJT1NfTU9EVUxFX0FMSUFTKCJJW0IsRCxILEksTSxOLE8sVCxXLFYsWSxaXSIpOworSUJNX0JJT1NfTU9EVUxFX0FMSUFTKCIxWzAsMyw2LDgsQS1HLEksSyxNLVAsUyxUXSIpOworSUJNX0JJT1NfTU9EVUxFX0FMSUFTKCJLW1UsWC1aXSIpOworCitNT0RVTEVfQVVUSE9SKCJCb3Jpc2xhdiBEZWlhbm92LCBIZW5yaXF1ZSBkZSBNb3JhZXMgSG9sc2NodWgiKTsKK01PRFVMRV9ERVNDUklQVElPTihUUEFDUElfREVTQyk7CitNT0RVTEVfVkVSU0lPTihUUEFDUElfVkVSU0lPTik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK21vZHVsZV9pbml0KHRoaW5rcGFkX2FjcGlfbW9kdWxlX2luaXQpOworbW9kdWxlX2V4aXQodGhpbmtwYWRfYWNwaV9tb2R1bGVfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvdG9zaGliYV9hY3BpLmMgYi9kcml2ZXJzL3BsYXRmb3JtL3g4Ni90b3NoaWJhX2FjcGkuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9hY3BpL3Rvc2hpYmFfYWNwaS5jCnJlbmFtZSB0byBkcml2ZXJzL3BsYXRmb3JtL3g4Ni90b3NoaWJhX2FjcGkuYwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3dtaS5jIGIvZHJpdmVycy9wbGF0Zm9ybS94ODYvd21pLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvYWNwaS93bWkuYwpyZW5hbWUgdG8gZHJpdmVycy9wbGF0Zm9ybS94ODYvd21pLmMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG5wL3BucGFjcGkvY29yZS5jIGIvZHJpdmVycy9wbnAvcG5wYWNwaS9jb3JlLmMKaW5kZXggMzgzZTQ3Yy4uMjgzNDg0NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wbnAvcG5wYWNwaS9jb3JlLmMKKysrIGIvZHJpdmVycy9wbnAvcG5wYWNwaS9jb3JlLmMKQEAgLTIzLDcgKzIzLDYgQEAKICNpbmNsdWRlIDxsaW51eC9wbnAuaD4KICNpbmNsdWRlIDxsaW51eC9tb2RfZGV2aWNldGFibGUuaD4KICNpbmNsdWRlIDxhY3BpL2FjcGlfYnVzLmg+Ci0jaW5jbHVkZSA8YWNwaS9hY3R5cGVzLmg+CiAKICNpbmNsdWRlICIuLi9iYXNlLmgiCiAjaW5jbHVkZSAicG5wYWNwaS5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wb3dlci9LY29uZmlnIGIvZHJpdmVycy9wb3dlci9LY29uZmlnCmluZGV4IDY2ODQ3MjQuLjMzZGExMTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcG93ZXIvS2NvbmZpZworKysgYi9kcml2ZXJzL3Bvd2VyL0tjb25maWcKQEAgLTgyLDQgKzgyLDEwIEBACiAJICBTYXkgWSBoZXJlIHRvIGVuYWJsZSBzdXBwb3J0IGZvciBiYXR0ZXJpZXMgY2hhcmdlciBpbnRlZ3JhdGVkIGludG8KIAkgIERBOTAzMCBQTUlDLgogCitjb25maWcgQ0hBUkdFUl9QQ0Y1MDYzMworCXRyaXN0YXRlICJOWFAgUENGNTA2MzMgTUJDIgorCWRlcGVuZHMgb24gTUZEX1BDRjUwNjMzCisJaGVscAorCSBTYXkgWSB0byBpbmNsdWRlIHN1cHBvcnQgZm9yIE5YUCBQQ0Y1MDYzMyBNYWluIEJhdHRlcnkgQ2hhcmdlci4KKwogZW5kaWYgIyBQT1dFUl9TVVBQTFkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG93ZXIvTWFrZWZpbGUgYi9kcml2ZXJzL3Bvd2VyL01ha2VmaWxlCmluZGV4IGVlYmIxNTUuLjJmY2Y0MWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcG93ZXIvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9wb3dlci9NYWtlZmlsZQpAQCAtMjUsMyArMjUsNCBAQAogb2JqLSQoQ09ORklHX0JBVFRFUllfV005N1hYKQkrPSB3bTk3eHhfYmF0dGVyeS5vCiBvYmotJChDT05GSUdfQkFUVEVSWV9CUTI3eDAwKQkrPSBicTI3eDAwX2JhdHRlcnkubwogb2JqLSQoQ09ORklHX0JBVFRFUllfREE5MDMwKQkrPSBkYTkwMzBfYmF0dGVyeS5vCitvYmotJChDT05GSUdfQ0hBUkdFUl9QQ0Y1MDYzMykJKz0gcGNmNTA2MzMtY2hhcmdlci5vClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wb3dlci9wY2Y1MDYzMy1jaGFyZ2VyLmMgYi9kcml2ZXJzL3Bvd2VyL3BjZjUwNjMzLWNoYXJnZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTg4ZWMxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9wb3dlci9wY2Y1MDYzMy1jaGFyZ2VyLmMKQEAgLTAsMCArMSwzNTggQEAKKy8qIE5YUCBQQ0Y1MDYzMyBNYWluIEJhdHRlcnkgQ2hhcmdlciBEcml2ZXIKKyAqCisgKiAoQykgMjAwNi0yMDA4IGJ5IE9wZW5tb2tvLCBJbmMuCisgKiBBdXRob3I6IEJhbGFqaSBSYW8gPGJhbGFqaXJyYW9Ab3Blbm1va28ub3JnPgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBCcm9rZW4gZG93biBmcm9tIG1vbnN0cm91cyBQQ0Y1MDYzMyBkcml2ZXIgbWFpbmx5IGJ5CisgKiBIYXJhbGQgV2VsdGUsIEFuZHkgR3JlZW4gYW5kIFdlcm5lciBBbG1lc2JlcmdlcgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqICB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9wb3dlcl9zdXBwbHkuaD4KKworI2luY2x1ZGUgPGxpbnV4L21mZC9wY2Y1MDYzMy9jb3JlLmg+CisjaW5jbHVkZSA8bGludXgvbWZkL3BjZjUwNjMzL21iYy5oPgorCitzdHJ1Y3QgcGNmNTA2MzNfbWJjIHsKKwlzdHJ1Y3QgcGNmNTA2MzMgKnBjZjsKKworCWludCBhZGFwdGVyX2FjdGl2ZTsKKwlpbnQgYWRhcHRlcl9vbmxpbmU7CisJaW50IHVzYl9hY3RpdmU7CisJaW50IHVzYl9vbmxpbmU7CisKKwlzdHJ1Y3QgcG93ZXJfc3VwcGx5IHVzYjsKKwlzdHJ1Y3QgcG93ZXJfc3VwcGx5IGFkYXB0ZXI7Cit9OworCitpbnQgcGNmNTA2MzNfbWJjX3VzYl9jdXJsaW1fc2V0KHN0cnVjdCBwY2Y1MDYzMyAqcGNmLCBpbnQgbWEpCit7CisJc3RydWN0IHBjZjUwNjMzX21iYyAqbWJjID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGNmLT5tYmNfcGRldik7CisJaW50IHJldCA9IDA7CisJdTggYml0czsKKworCWlmIChtYSA+PSAxMDAwKQorCQliaXRzID0gUENGNTA2MzNfTUJDQzdfVVNCXzEwMDBtQTsKKwllbHNlIGlmIChtYSA+PSA1MDApCisJCWJpdHMgPSBQQ0Y1MDYzM19NQkNDN19VU0JfNTAwbUE7CisJZWxzZSBpZiAobWEgPj0gMTAwKQorCQliaXRzID0gUENGNTA2MzNfTUJDQzdfVVNCXzEwMG1BOworCWVsc2UKKwkJYml0cyA9IFBDRjUwNjMzX01CQ0M3X1VTQl9TVVNQRU5EOworCisJcmV0ID0gcGNmNTA2MzNfcmVnX3NldF9iaXRfbWFzayhwY2YsIFBDRjUwNjMzX1JFR19NQkNDNywKKwkJCQkJUENGNTA2MzNfTUJDQzdfVVNCX01BU0ssIGJpdHMpOworCWlmIChyZXQpCisJCWRldl9lcnIocGNmLT5kZXYsICJlcnJvciBzZXR0aW5nIHVzYiBjdXJsaW0gdG8gJWQgbUFcbiIsIG1hKTsKKwllbHNlCisJCWRldl9pbmZvKHBjZi0+ZGV2LCAidXNiIGN1cmxpbSB0byAlZCBtQVxuIiwgbWEpOworCisJcG93ZXJfc3VwcGx5X2NoYW5nZWQoJm1iYy0+dXNiKTsKKworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChwY2Y1MDYzM19tYmNfdXNiX2N1cmxpbV9zZXQpOworCitpbnQgcGNmNTA2MzNfbWJjX2dldF9zdGF0dXMoc3RydWN0IHBjZjUwNjMzICpwY2YpCit7CisJc3RydWN0IHBjZjUwNjMzX21iYyAqbWJjICA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBjZi0+bWJjX3BkZXYpOworCWludCBzdGF0dXMgPSAwOworCisJaWYgKG1iYy0+dXNiX29ubGluZSkKKwkJc3RhdHVzIHw9IFBDRjUwNjMzX01CQ19VU0JfT05MSU5FOworCWlmIChtYmMtPnVzYl9hY3RpdmUpCisJCXN0YXR1cyB8PSBQQ0Y1MDYzM19NQkNfVVNCX0FDVElWRTsKKwlpZiAobWJjLT5hZGFwdGVyX29ubGluZSkKKwkJc3RhdHVzIHw9IFBDRjUwNjMzX01CQ19BREFQVEVSX09OTElORTsKKwlpZiAobWJjLT5hZGFwdGVyX2FjdGl2ZSkKKwkJc3RhdHVzIHw9IFBDRjUwNjMzX01CQ19BREFQVEVSX0FDVElWRTsKKworCXJldHVybiBzdGF0dXM7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChwY2Y1MDYzM19tYmNfZ2V0X3N0YXR1cyk7CisKK3ZvaWQgcGNmNTA2MzNfbWJjX3NldF9zdGF0dXMoc3RydWN0IHBjZjUwNjMzICpwY2YsIGludCB3aGF0LCBpbnQgc3RhdHVzKQoreworCXN0cnVjdCBwY2Y1MDYzM19tYmMgKm1iYyA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBjZi0+bWJjX3BkZXYpOworCisJaWYgKHdoYXQgJiBQQ0Y1MDYzM19NQkNfVVNCX09OTElORSkKKwkJbWJjLT51c2Jfb25saW5lID0gISFzdGF0dXM7CisJaWYgKHdoYXQgJiBQQ0Y1MDYzM19NQkNfVVNCX0FDVElWRSkKKwkJbWJjLT51c2JfYWN0aXZlID0gISFzdGF0dXM7CisJaWYgKHdoYXQgJiBQQ0Y1MDYzM19NQkNfQURBUFRFUl9PTkxJTkUpCisJCW1iYy0+YWRhcHRlcl9vbmxpbmUgPSAhIXN0YXR1czsKKwlpZiAod2hhdCAmIFBDRjUwNjMzX01CQ19BREFQVEVSX0FDVElWRSkKKwkJbWJjLT5hZGFwdGVyX2FjdGl2ZSA9ICEhc3RhdHVzOworfQorRVhQT1JUX1NZTUJPTF9HUEwocGNmNTA2MzNfbWJjX3NldF9zdGF0dXMpOworCitzdGF0aWMgc3NpemVfdAorc2hvd19jaGdtb2RlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgcGNmNTA2MzNfbWJjICptYmMgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKworCXU4IG1iY3MyID0gcGNmNTA2MzNfcmVnX3JlYWQobWJjLT5wY2YsIFBDRjUwNjMzX1JFR19NQkNTMik7CisJdTggY2hnbW9kID0gKG1iY3MyICYgUENGNTA2MzNfTUJDUzJfTUJDX01BU0spOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIGNoZ21vZCk7Cit9CitzdGF0aWMgREVWSUNFX0FUVFIoY2hnbW9kZSwgU19JUlVHTywgc2hvd19jaGdtb2RlLCBOVUxMKTsKKworc3RhdGljIHNzaXplX3QKK3Nob3dfdXNibGltKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgcGNmNTA2MzNfbWJjICptYmMgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwl1OCB1c2JsaW0gPSBwY2Y1MDYzM19yZWdfcmVhZChtYmMtPnBjZiwgUENGNTA2MzNfUkVHX01CQ0M3KSAmCisJCQkJCQlQQ0Y1MDYzM19NQkNDN19VU0JfTUFTSzsKKwl1bnNpZ25lZCBpbnQgbWE7CisKKwlpZiAodXNibGltID09IFBDRjUwNjMzX01CQ0M3X1VTQl8xMDAwbUEpCisJCW1hID0gMTAwMDsKKwllbHNlIGlmICh1c2JsaW0gPT0gUENGNTA2MzNfTUJDQzdfVVNCXzUwMG1BKQorCQltYSA9IDUwMDsKKwllbHNlIGlmICh1c2JsaW0gPT0gUENGNTA2MzNfTUJDQzdfVVNCXzEwMG1BKQorCQltYSA9IDEwMDsKKwllbHNlCisJCW1hID0gMDsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCBtYSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNldF91c2JsaW0oc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IHBjZjUwNjMzX21iYyAqbWJjID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJdW5zaWduZWQgbG9uZyBtYTsKKwlpbnQgcmV0OworCisJcmV0ID0gc3RyaWN0X3N0cnRvdWwoYnVmLCAxMCwgJm1hKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXBjZjUwNjMzX21iY191c2JfY3VybGltX3NldChtYmMtPnBjZiwgbWEpOworCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgREVWSUNFX0FUVFIodXNiX2N1cmxpbSwgU19JUlVHTyB8IFNfSVdVU1IsIHNob3dfdXNibGltLCBzZXRfdXNibGltKTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKnBjZjUwNjMzX21iY19zeXNmc19lbnRyaWVzW10gPSB7CisJJmRldl9hdHRyX2NoZ21vZGUuYXR0ciwKKwkmZGV2X2F0dHJfdXNiX2N1cmxpbS5hdHRyLAorCU5VTEwsCit9OworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBtYmNfYXR0cl9ncm91cCA9IHsKKwkubmFtZQk9IE5VTEwsCQkJLyogcHV0IGluIGRldmljZSBkaXJlY3RvcnkgKi8KKwkuYXR0cnMJPSBwY2Y1MDYzM19tYmNfc3lzZnNfZW50cmllcywKK307CisKK3N0YXRpYyB2b2lkCitwY2Y1MDYzM19tYmNfaXJxX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgcGNmNTA2MzNfbWJjICptYmMgPSBkYXRhOworCisJLyogVVNCICovCisJaWYgKGlycSA9PSBQQ0Y1MDYzM19JUlFfVVNCSU5TKSB7CisJCW1iYy0+dXNiX29ubGluZSA9IDE7CisJfSBlbHNlIGlmIChpcnEgPT0gUENGNTA2MzNfSVJRX1VTQlJFTSkgeworCQltYmMtPnVzYl9vbmxpbmUgPSAwOworCQltYmMtPnVzYl9hY3RpdmUgPSAwOworCQlwY2Y1MDYzM19tYmNfdXNiX2N1cmxpbV9zZXQobWJjLT5wY2YsIDApOworCX0KKworCS8qIEFkYXB0ZXIgKi8KKwlpZiAoaXJxID09IFBDRjUwNjMzX0lSUV9BRFBJTlMpIHsKKwkJbWJjLT5hZGFwdGVyX29ubGluZSA9IDE7CisJCW1iYy0+YWRhcHRlcl9hY3RpdmUgPSAxOworCX0gZWxzZSBpZiAoaXJxID09IFBDRjUwNjMzX0lSUV9BRFBSRU0pIHsKKwkJbWJjLT5hZGFwdGVyX29ubGluZSA9IDA7CisJCW1iYy0+YWRhcHRlcl9hY3RpdmUgPSAwOworCX0KKworCWlmIChpcnEgPT0gUENGNTA2MzNfSVJRX0JBVEZVTEwpIHsKKwkJbWJjLT51c2JfYWN0aXZlID0gMDsKKwkJbWJjLT5hZGFwdGVyX2FjdGl2ZSA9IDA7CisJfQorCisJcG93ZXJfc3VwcGx5X2NoYW5nZWQoJm1iYy0+dXNiKTsKKwlwb3dlcl9zdXBwbHlfY2hhbmdlZCgmbWJjLT5hZGFwdGVyKTsKKworCWlmIChtYmMtPnBjZi0+cGRhdGEtPm1iY19ldmVudF9jYWxsYmFjaykKKwkJbWJjLT5wY2YtPnBkYXRhLT5tYmNfZXZlbnRfY2FsbGJhY2sobWJjLT5wY2YsIGlycSk7Cit9CisKK3N0YXRpYyBpbnQgYWRhcHRlcl9nZXRfcHJvcGVydHkoc3RydWN0IHBvd2VyX3N1cHBseSAqcHN5LAorCQkJZW51bSBwb3dlcl9zdXBwbHlfcHJvcGVydHkgcHNwLAorCQkJdW5pb24gcG93ZXJfc3VwcGx5X3Byb3B2YWwgKnZhbCkKK3sKKwlzdHJ1Y3QgcGNmNTA2MzNfbWJjICptYmMgPSBjb250YWluZXJfb2YocHN5LCBzdHJ1Y3QgcGNmNTA2MzNfbWJjLCB1c2IpOworCWludCByZXQgPSAwOworCisJc3dpdGNoIChwc3ApIHsKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX09OTElORToKKwkJdmFsLT5pbnR2YWwgPSAgbWJjLT5hZGFwdGVyX29ubGluZTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0ID0gLUVJTlZBTDsKKwkJYnJlYWs7CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdXNiX2dldF9wcm9wZXJ0eShzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpwc3ksCisJCQllbnVtIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSBwc3AsCisJCQl1bmlvbiBwb3dlcl9zdXBwbHlfcHJvcHZhbCAqdmFsKQoreworCXN0cnVjdCBwY2Y1MDYzM19tYmMgKm1iYyA9IGNvbnRhaW5lcl9vZihwc3ksIHN0cnVjdCBwY2Y1MDYzM19tYmMsIHVzYik7CisJaW50IHJldCA9IDA7CisKKwlzd2l0Y2ggKHBzcCkgeworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfT05MSU5FOgorCQl2YWwtPmludHZhbCA9IG1iYy0+dXNiX29ubGluZTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0ID0gLUVJTlZBTDsKKwkJYnJlYWs7CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBlbnVtIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSBwb3dlcl9wcm9wc1tdID0geworCVBPV0VSX1NVUFBMWV9QUk9QX09OTElORSwKK307CisKK3N0YXRpYyBjb25zdCB1OCBtYmNfaXJxX2hhbmRsZXJzW10gPSB7CisJUENGNTA2MzNfSVJRX0FEUElOUywKKwlQQ0Y1MDYzM19JUlFfQURQUkVNLAorCVBDRjUwNjMzX0lSUV9VU0JJTlMsCisJUENGNTA2MzNfSVJRX1VTQlJFTSwKKwlQQ0Y1MDYzM19JUlFfQkFURlVMTCwKKwlQQ0Y1MDYzM19JUlFfQ0hHSEFMVCwKKwlQQ0Y1MDYzM19JUlFfVEhMSU1PTiwKKwlQQ0Y1MDYzM19JUlFfVEhMSU1PRkYsCisJUENGNTA2MzNfSVJRX1VTQkxJTU9OLAorCVBDRjUwNjMzX0lSUV9VU0JMSU1PRkYsCisJUENGNTA2MzNfSVJRX0xPV1NZUywKKwlQQ0Y1MDYzM19JUlFfTE9XQkFULAorfTsKKworc3RhdGljIGludCBfX2RldmluaXQgcGNmNTA2MzNfbWJjX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHBjZjUwNjMzX21iYyAqbWJjOworCXN0cnVjdCBwY2Y1MDYzM19zdWJkZXZfcGRhdGEgKnBkYXRhID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJaW50IHJldDsKKwlpbnQgaTsKKwl1OCBtYmNzMTsKKworCW1iYyA9IGt6YWxsb2Moc2l6ZW9mKCptYmMpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW1iYykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBtYmMpOworCW1iYy0+cGNmID0gcGRhdGEtPnBjZjsKKworCS8qIFNldCB1cCBJUlEgaGFuZGxlcnMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShtYmNfaXJxX2hhbmRsZXJzKTsgaSsrKQorCQlwY2Y1MDYzM19yZWdpc3Rlcl9pcnEobWJjLT5wY2YsIG1iY19pcnFfaGFuZGxlcnNbaV0sCisJCQkJCXBjZjUwNjMzX21iY19pcnFfaGFuZGxlciwgbWJjKTsKKworCS8qIENyZWF0ZSBwb3dlciBzdXBwbGllcyAqLworCW1iYy0+YWRhcHRlci5uYW1lCQk9ICJhZGFwdGVyIjsKKwltYmMtPmFkYXB0ZXIudHlwZQkJPSBQT1dFUl9TVVBQTFlfVFlQRV9NQUlOUzsKKwltYmMtPmFkYXB0ZXIucHJvcGVydGllcwkJPSBwb3dlcl9wcm9wczsKKwltYmMtPmFkYXB0ZXIubnVtX3Byb3BlcnRpZXMJPSBBUlJBWV9TSVpFKHBvd2VyX3Byb3BzKTsKKwltYmMtPmFkYXB0ZXIuZ2V0X3Byb3BlcnR5CT0gJmFkYXB0ZXJfZ2V0X3Byb3BlcnR5OworCW1iYy0+YWRhcHRlci5zdXBwbGllZF90bwk9IG1iYy0+cGNmLT5wZGF0YS0+YmF0dGVyaWVzOworCW1iYy0+YWRhcHRlci5udW1fc3VwcGxpY2FudHMJPSBtYmMtPnBjZi0+cGRhdGEtPm51bV9iYXR0ZXJpZXM7CisKKwltYmMtPnVzYi5uYW1lCQkJPSAidXNiIjsKKwltYmMtPnVzYi50eXBlCQkJPSBQT1dFUl9TVVBQTFlfVFlQRV9VU0I7CisJbWJjLT51c2IucHJvcGVydGllcwkJPSBwb3dlcl9wcm9wczsKKwltYmMtPnVzYi5udW1fcHJvcGVydGllcwkJPSBBUlJBWV9TSVpFKHBvd2VyX3Byb3BzKTsKKwltYmMtPnVzYi5nZXRfcHJvcGVydHkJCT0gdXNiX2dldF9wcm9wZXJ0eTsKKwltYmMtPnVzYi5zdXBwbGllZF90bwkJPSBtYmMtPnBjZi0+cGRhdGEtPmJhdHRlcmllczsKKwltYmMtPnVzYi5udW1fc3VwcGxpY2FudHMJPSBtYmMtPnBjZi0+cGRhdGEtPm51bV9iYXR0ZXJpZXM7CisKKwlyZXQgPSBwb3dlcl9zdXBwbHlfcmVnaXN0ZXIoJnBkZXYtPmRldiwgJm1iYy0+YWRhcHRlcik7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKG1iYy0+cGNmLT5kZXYsICJmYWlsZWQgdG8gcmVnaXN0ZXIgYWRhcHRlclxuIik7CisJCWtmcmVlKG1iYyk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gcG93ZXJfc3VwcGx5X3JlZ2lzdGVyKCZwZGV2LT5kZXYsICZtYmMtPnVzYik7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKG1iYy0+cGNmLT5kZXYsICJmYWlsZWQgdG8gcmVnaXN0ZXIgdXNiXG4iKTsKKwkJcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIoJm1iYy0+YWRhcHRlcik7CisJCWtmcmVlKG1iYyk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gc3lzZnNfY3JlYXRlX2dyb3VwKCZwZGV2LT5kZXYua29iaiwgJm1iY19hdHRyX2dyb3VwKTsKKwlpZiAocmV0KQorCQlkZXZfZXJyKG1iYy0+cGNmLT5kZXYsICJmYWlsZWQgdG8gY3JlYXRlIHN5c2ZzIGVudHJpZXNcbiIpOworCisJbWJjczEgPSBwY2Y1MDYzM19yZWdfcmVhZChtYmMtPnBjZiwgUENGNTA2MzNfUkVHX01CQ1MxKTsKKwlpZiAobWJjczEgJiBQQ0Y1MDYzM19NQkNTMV9VU0JQUkVTKQorCQlwY2Y1MDYzM19tYmNfaXJxX2hhbmRsZXIoUENGNTA2MzNfSVJRX1VTQklOUywgbWJjKTsKKwlpZiAobWJjczEgJiBQQ0Y1MDYzM19NQkNTMV9BREFQVFBSRVMpCisJCXBjZjUwNjMzX21iY19pcnFfaGFuZGxlcihQQ0Y1MDYzM19JUlFfQURQSU5TLCBtYmMpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IHBjZjUwNjMzX21iY19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgcGNmNTA2MzNfbWJjICptYmMgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlpbnQgaTsKKworCS8qIFJlbW92ZSBJUlEgaGFuZGxlcnMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShtYmNfaXJxX2hhbmRsZXJzKTsgaSsrKQorCQlwY2Y1MDYzM19mcmVlX2lycShtYmMtPnBjZiwgbWJjX2lycV9oYW5kbGVyc1tpXSk7CisKKwlwb3dlcl9zdXBwbHlfdW5yZWdpc3RlcigmbWJjLT51c2IpOworCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKCZtYmMtPmFkYXB0ZXIpOworCisJa2ZyZWUobWJjKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBwY2Y1MDYzM19tYmNfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gInBjZjUwNjMzLW1iYyIsCisJfSwKKwkucHJvYmUgPSBwY2Y1MDYzM19tYmNfcHJvYmUsCisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKHBjZjUwNjMzX21iY19yZW1vdmUpLAorfTsKKworc3RhdGljIGludCBfX2luaXQgcGNmNTA2MzNfbWJjX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZwY2Y1MDYzM19tYmNfZHJpdmVyKTsKK30KK21vZHVsZV9pbml0KHBjZjUwNjMzX21iY19pbml0KTsKKworc3RhdGljIHZvaWQgX19leGl0IHBjZjUwNjMzX21iY19leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnBjZjUwNjMzX21iY19kcml2ZXIpOworfQorbW9kdWxlX2V4aXQocGNmNTA2MzNfbWJjX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJCYWxhamkgUmFvIDxiYWxhamlycmFvQG9wZW5tb2tvLm9yZz4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiUENGNTA2MzMgbWJjIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTpwY2Y1MDYzMy1tYmMiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcHMzL3BzMy1scG0uYyBiL2RyaXZlcnMvcHMzL3BzMy1scG0uYwppbmRleCAyMDQxNThjLi5mZTk2NzkzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BzMy9wczMtbHBtLmMKKysrIGIvZHJpdmVycy9wczMvcHMzLWxwbS5jCkBAIC03MzIsNyArNzMyLDcgQEAKIAljYXNlIDg6CiAJCXJldHVybiBwbV90cmFuc2xhdGVfc2lnbmFsX2dyb3VwX251bWJlcl9vbl9pc2xhbmQ4KHN1Ymdyb3VwKTsKIAlkZWZhdWx0OgotCQlkZXZfZGJnKHNiZF9jb3JlKCksICIlczoldTogaXNsYW5kIG5vdCBmb3VuZDogJWx1XG4iLCBfX2Z1bmNfXywKKwkJZGV2X2RiZyhzYmRfY29yZSgpLCAiJXM6JXU6IGlzbGFuZCBub3QgZm91bmQ6ICVsbHVcbiIsIF9fZnVuY19fLAogCQkJX19MSU5FX18sIGdyb3VwKTsKIAkJQlVHKCk7CiAJCWJyZWFrOwpAQCAtNzY1LDcgKzc2NSw3IEBACiAJCQkJIHNpZ25hbF9zZWxlY3QsIGF0dHIxLCBhdHRyMiwgYXR0cjMpOwogCWlmIChyZXQpCiAJCWRldl9lcnIoc2JkX2NvcmUoKSwKLQkJCSIlczoldTogZXJyb3I6JWQgMHglbHggMHglbHggMHglbHggMHglbHggMHglbHggMHglbHhcbiIsCisJCQkiJXM6JXU6IGVycm9yOiVkIDB4JWxseCAweCVsbHggMHglbGx4IDB4JWxseCAweCVsbHggMHglbGx4XG4iLAogCQkJX19mdW5jX18sIF9fTElORV9fLCByZXQsIGx2MV9zaWduYWxfZ3JvdXAsIGJ1c19zZWxlY3QsCiAJCQlzaWduYWxfc2VsZWN0LCBhdHRyMSwgYXR0cjIsIGF0dHIzKTsKIApAQCAtOTA4LDcgKzkwOCw3IEBACiAKIAlscG1fcHJpdi0+dGJfY291bnQgPSB0bXA7CiAKLQlkZXZfZGJnKHNiZF9jb3JlKCksICIlczoldTogdGJfY291bnQgJWx1ICglbHhoKVxuIiwgX19mdW5jX18sIF9fTElORV9fLAorCWRldl9kYmcoc2JkX2NvcmUoKSwgIiVzOiV1OiB0Yl9jb3VudCAlbGx1ICglbGx4aClcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywKIAkJbHBtX3ByaXYtPnRiX2NvdW50LCBscG1fcHJpdi0+dGJfY291bnQpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwocHMzX2Rpc2FibGVfcG0pOwpAQCAtOTM4LDcgKzkzOCw3IEBACiAJaWYgKG9mZnNldCA+PSBscG1fcHJpdi0+dGJfY291bnQpCiAJCXJldHVybiAwOwogCi0JY291bnQgPSBtaW4oY291bnQsIGxwbV9wcml2LT50Yl9jb3VudCAtIG9mZnNldCk7CisJY291bnQgPSBtaW5fdCh1NjQsIGNvdW50LCBscG1fcHJpdi0+dGJfY291bnQgLSBvZmZzZXQpOwogCiAJd2hpbGUgKCpieXRlc19jb3BpZWQgPCBjb3VudCkgewogCQljb25zdCB1bnNpZ25lZCBsb25nIHJlcXVlc3QgPSBjb3VudCAtICpieXRlc19jb3BpZWQ7CkBAIC05OTMsNyArOTkzLDcgQEAKIAlpZiAob2Zmc2V0ID49IGxwbV9wcml2LT50Yl9jb3VudCkKIAkJcmV0dXJuIDA7CiAKLQljb3VudCA9IG1pbihjb3VudCwgbHBtX3ByaXYtPnRiX2NvdW50IC0gb2Zmc2V0KTsKKwljb3VudCA9IG1pbl90KHU2NCwgY291bnQsIGxwbV9wcml2LT50Yl9jb3VudCAtIG9mZnNldCk7CiAKIAl3aGlsZSAoKmJ5dGVzX2NvcGllZCA8IGNvdW50KSB7CiAJCWNvbnN0IHVuc2lnbmVkIGxvbmcgcmVxdWVzdCA9IGNvdW50IC0gKmJ5dGVzX2NvcGllZDsKQEAgLTEwMTMsNyArMTAxMyw3IEBACiAJCXJlc3VsdCA9IGNvcHlfdG9fdXNlcihidWYsIGxwbV9wcml2LT50Yl9jYWNoZSwgdG1wKTsKIAogCQlpZiAocmVzdWx0KSB7Ci0JCQlkZXZfZGJnKHNiZF9jb3JlKCksICIlczoldTogMHglbHggYnl0ZXMgYXQgMHglcFxuIiwKKwkJCWRldl9kYmcoc2JkX2NvcmUoKSwgIiVzOiV1OiAweCVsbHggYnl0ZXMgYXQgMHglcFxuIiwKIAkJCQlfX2Z1bmNfXywgX19MSU5FX18sIHRtcCwgYnVmKTsKIAkJCWRldl9lcnIoc2JkX2NvcmUoKSwgIiVzOiV1OiBjb3B5X3RvX3VzZXIgZmFpbGVkOiAlZFxuIiwKIAkJCQlfX2Z1bmNfXywgX19MSU5FX18sIHJlc3VsdCk7CkBAIC0xMTQ4LDggKzExNDgsOCBAQAogCWxwbV9wcml2LT5zaGFkb3cuZ3JvdXBfY29udHJvbCA9IFBTM19MUE1fU0hBRE9XX1JFR19JTklUOwogCWxwbV9wcml2LT5zaGFkb3cuZGVidWdfYnVzX2NvbnRyb2wgPSBQUzNfTFBNX1NIQURPV19SRUdfSU5JVDsKIAotCWRldl9kYmcoc2JkX2NvcmUoKSwgIiVzOiV1OiBscG1faWQgMHglbHgsIG91dGxldF9pZCAweCVseCwgIgotCQkidGJfc2l6ZSAweCVseFxuIiwgX19mdW5jX18sIF9fTElORV9fLCBscG1fcHJpdi0+bHBtX2lkLAorCWRldl9kYmcoc2JkX2NvcmUoKSwgIiVzOiV1OiBscG1faWQgMHglbGx4LCBvdXRsZXRfaWQgMHglbGx4LCAiCisJCSJ0Yl9zaXplIDB4JWxseFxuIiwgX19mdW5jX18sIF9fTElORV9fLCBscG1fcHJpdi0+bHBtX2lkLAogCQlscG1fcHJpdi0+b3V0bGV0X2lkLCB0Yl9zaXplKTsKIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wczMvcHMzLXZ1YXJ0LmMgYi9kcml2ZXJzL3BzMy9wczMtdnVhcnQuYwppbmRleCA5MGMwOTdhLi5lNGFkNWJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BzMy9wczMtdnVhcnQuYworKysgYi9kcml2ZXJzL3BzMy9wczMtdnVhcnQuYwpAQCAtMTE0LDcgKzExNCw3IEBACiBzdGF0aWMgdm9pZCBfX21heWJlX3VudXNlZCBfZHVtcF9wb3J0c19ibXAoCiAJY29uc3Qgc3RydWN0IHBvcnRzX2JtcCAqYm1wLCBjb25zdCBjaGFyICpmdW5jLCBpbnQgbGluZSkKIHsKLQlwcl9kZWJ1ZygiJXM6JWQ6IHBvcnRzX2JtcDogJTAxNmx4aFxuIiwgZnVuYywgbGluZSwgYm1wLT5zdGF0dXMpOworCXByX2RlYnVnKCIlczolZDogcG9ydHNfYm1wOiAlMDE2bGx4aFxuIiwgZnVuYywgbGluZSwgYm1wLT5zdGF0dXMpOwogfQogCiAjZGVmaW5lIGR1bXBfcG9ydF9wYXJhbXMoX2IpIF9kdW1wX3BvcnRfcGFyYW1zKF9iLCBfX2Z1bmNfXywgX19MSU5FX18pCkBAIC0xNTksMTEgKzE1OSwxMyBAQAogCXN0cnVjdCB2dWFydF90cmlnZ2VycyAqdHJpZykKIHsKIAlpbnQgcmVzdWx0OwotCXVuc2lnbmVkIGxvbmcgc2l6ZTsKLQl1bnNpZ25lZCBsb25nIHZhbDsKKwl1NjQgc2l6ZTsKKwl1NjQgdmFsOworCXU2NCB0eDsKIAogCXJlc3VsdCA9IGx2MV9nZXRfdmlydHVhbF91YXJ0X3BhcmFtKGRldi0+cG9ydF9udW1iZXIsCi0JCVBBUkFNX1RYX1RSSUdHRVIsICZ0cmlnLT50eCk7CisJCVBBUkFNX1RYX1RSSUdHRVIsICZ0eCk7CisJdHJpZy0+dHggPSB0eDsKIAogCWlmIChyZXN1bHQpIHsKIAkJZGV2X2RiZygmZGV2LT5jb3JlLCAiJXM6JWQ6IHR4X3RyaWdnZXIgZmFpbGVkOiAlc1xuIiwKQEAgLTIwMSw3ICsyMDMsNyBAQAogCXVuc2lnbmVkIGludCByeCkKIHsKIAlpbnQgcmVzdWx0OwotCXVuc2lnbmVkIGxvbmcgc2l6ZTsKKwl1NjQgc2l6ZTsKIAogCXJlc3VsdCA9IGx2MV9zZXRfdmlydHVhbF91YXJ0X3BhcmFtKGRldi0+cG9ydF9udW1iZXIsCiAJCVBBUkFNX1RYX1RSSUdHRVIsIHR4KTsKQEAgLTI0OCw3ICsyNTAsNyBAQAogCQlkZXZfZGJnKCZkZXYtPmNvcmUsICIlczolZDogcnhfYnl0ZXMgZmFpbGVkOiAlc1xuIiwKIAkJCV9fZnVuY19fLCBfX0xJTkVfXywgcHMzX3Jlc3VsdChyZXN1bHQpKTsKIAotCWRldl9kYmcoJmRldi0+Y29yZSwgIiVzOiVkOiAlbHhoXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sCisJZGV2X2RiZygmZGV2LT5jb3JlLCAiJXM6JWQ6ICVsbHhoXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sCiAJCSpieXRlc193YWl0aW5nKTsKIAlyZXR1cm4gcmVzdWx0OwogfQpAQCAtMjk1LDcgKzI5Nyw3IEBACiAKIAkqc3RhdHVzID0gdG1wICYgcHJpdi0+aW50ZXJydXB0X21hc2s7CiAKLQlkZXZfZGJnKCZkZXYtPmNvcmUsICIlczolZDogbSAlbHhoLCBzICVseGgsIG0mcyAlbHhoXG4iLAorCWRldl9kYmcoJmRldi0+Y29yZSwgIiVzOiVkOiBtICVsbHhoLCBzICVsbHhoLCBtJnMgJWx4aFxuIiwKIAkJX19mdW5jX18sIF9fTElORV9fLCBwcml2LT5pbnRlcnJ1cHRfbWFzaywgdG1wLCAqc3RhdHVzKTsKIAogCXJldHVybiByZXN1bHQ7CkBAIC0zNjMsNyArMzY1LDcgQEAKICAqLwogCiBzdGF0aWMgaW50IHBzM192dWFydF9yYXdfd3JpdGUoc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2LAotCWNvbnN0IHZvaWQgKmJ1ZiwgdW5zaWduZWQgaW50IGJ5dGVzLCB1bnNpZ25lZCBsb25nICpieXRlc193cml0dGVuKQorCWNvbnN0IHZvaWQgKmJ1ZiwgdW5zaWduZWQgaW50IGJ5dGVzLCB1NjQgKmJ5dGVzX3dyaXR0ZW4pCiB7CiAJaW50IHJlc3VsdDsKIAlzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfcHJpdiAqcHJpdiA9IHRvX3BvcnRfcHJpdihkZXYpOwpAQCAtMzc5LDcgKzM4MSw3IEBACiAKIAlwcml2LT5zdGF0cy5ieXRlc193cml0dGVuICs9ICpieXRlc193cml0dGVuOwogCi0JZGV2X2RiZygmZGV2LT5jb3JlLCAiJXM6JWQ6IHdyb3RlICVseGgvJXhoPT4lbHhoXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sCisJZGV2X2RiZygmZGV2LT5jb3JlLCAiJXM6JWQ6IHdyb3RlICVsbHhoLyV4aD0+JWx4aFxuIiwgX19mdW5jX18sIF9fTElORV9fLAogCQkqYnl0ZXNfd3JpdHRlbiwgYnl0ZXMsIHByaXYtPnN0YXRzLmJ5dGVzX3dyaXR0ZW4pOwogCiAJcmV0dXJuIHJlc3VsdDsKQEAgLTM5Myw3ICszOTUsNyBAQAogICovCiAKIHN0YXRpYyBpbnQgcHMzX3Z1YXJ0X3Jhd19yZWFkKHN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldiwgdm9pZCAqYnVmLAotCXVuc2lnbmVkIGludCBieXRlcywgdW5zaWduZWQgbG9uZyAqYnl0ZXNfcmVhZCkKKwl1bnNpZ25lZCBpbnQgYnl0ZXMsIHU2NCAqYnl0ZXNfcmVhZCkKIHsKIAlpbnQgcmVzdWx0OwogCXN0cnVjdCBwczNfdnVhcnRfcG9ydF9wcml2ICpwcml2ID0gdG9fcG9ydF9wcml2KGRldik7CkBAIC00MTEsNyArNDEzLDcgQEAKIAogCXByaXYtPnN0YXRzLmJ5dGVzX3JlYWQgKz0gKmJ5dGVzX3JlYWQ7CiAKLQlkZXZfZGJnKCZkZXYtPmNvcmUsICIlczolZDogcmVhZCAlbHhoLyV4aD0+JWx4aFxuIiwgX19mdW5jX18sIF9fTElORV9fLAorCWRldl9kYmcoJmRldi0+Y29yZSwgIiVzOiVkOiByZWFkICVsbHhoLyV4aD0+JWx4aFxuIiwgX19mdW5jX18sIF9fTElORV9fLAogCQkqYnl0ZXNfcmVhZCwgYnl0ZXMsIHByaXYtPnN0YXRzLmJ5dGVzX3JlYWQpOwogCiAJcmV0dXJuIHJlc3VsdDsKQEAgLTUwMCw3ICs1MDIsNyBAQAogCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT50eF9saXN0LmxvY2ssIGZsYWdzKTsKIAogCWlmIChsaXN0X2VtcHR5KCZwcml2LT50eF9saXN0LmhlYWQpKSB7Ci0JCXVuc2lnbmVkIGxvbmcgYnl0ZXNfd3JpdHRlbjsKKwkJdTY0IGJ5dGVzX3dyaXR0ZW47CiAKIAkJcmVzdWx0ID0gcHMzX3Z1YXJ0X3Jhd193cml0ZShkZXYsIGJ1ZiwgYnl0ZXMsICZieXRlc193cml0dGVuKTsKIApAQCAtNTkyLDcgKzU5NCw3IEBACiAJbGlzdF9hZGRfdGFpbCgmbGItPmxpbmssICZwcml2LT5yeF9saXN0LmhlYWQpOwogCXByaXYtPnJ4X2xpc3QuYnl0ZXNfaGVsZCArPSBieXRlczsKIAotCWRldl9kYmcoJmRldi0+Y29yZSwgIiVzOiVkOiBidWZfJWx1OiBxdWV1ZWQgJWx4aCBieXRlc1xuIiwKKwlkZXZfZGJnKCZkZXYtPmNvcmUsICIlczolZDogYnVmXyVsdTogcXVldWVkICVsbHhoIGJ5dGVzXG4iLAogCQlfX2Z1bmNfXywgX19MSU5FX18sIGxiLT5kYmdfbnVtYmVyLCBieXRlcyk7CiAKIAkqYnl0ZXNfcXVldWVkID0gYnl0ZXM7CkBAIC03NDUsNyArNzQ3LDcgQEAKIAogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShsYiwgbiwgJnByaXYtPnR4X2xpc3QuaGVhZCwgbGluaykgewogCi0JCXVuc2lnbmVkIGxvbmcgYnl0ZXNfd3JpdHRlbjsKKwkJdTY0IGJ5dGVzX3dyaXR0ZW47CiAKIAkJcmVzdWx0ID0gcHMzX3Z1YXJ0X3Jhd193cml0ZShkZXYsIGxiLT5oZWFkLCBsYi0+dGFpbCAtIGxiLT5oZWFkLAogCQkJJmJ5dGVzX3dyaXR0ZW4pOwpAQCAtNzYyLDcgKzc2NCw3IEBACiAJCWlmIChieXRlc193cml0dGVuIDwgbGItPnRhaWwgLSBsYi0+aGVhZCkgewogCQkJbGItPmhlYWQgKz0gYnl0ZXNfd3JpdHRlbjsKIAkJCWRldl9kYmcoJmRldi0+Y29yZSwKLQkJCQkiJXM6JWQgY2xlYXJlZCBidWZfJWx1LCAlbHhoIGJ5dGVzXG4iLAorCQkJCSIlczolZCBjbGVhcmVkIGJ1Zl8lbHUsICVsbHhoIGJ5dGVzXG4iLAogCQkJCV9fZnVuY19fLCBfX0xJTkVfXywgbGItPmRiZ19udW1iZXIsCiAJCQkJYnl0ZXNfd3JpdHRlbik7CiAJCQlnb3RvIHBvcnRfZnVsbDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcHMzL3BzM3N0b3JfbGliLmMgYi9kcml2ZXJzL3BzMy9wczNzdG9yX2xpYi5jCmluZGV4IDU1OTU1ZjEuLjE4MDY2ZDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcHMzL3BzM3N0b3JfbGliLmMKKysrIGIvZHJpdmVycy9wczMvcHMzc3Rvcl9saWIuYwpAQCAtNzAsNyArNzAsNyBAQAogCQkJIF9fZnVuY19fLCBfX0xJTkVfXywgbik7CiAJZGV2LT5yZWdpb25faWR4ID0gX19mZnMoZGV2LT5hY2Nlc3NpYmxlX3JlZ2lvbnMpOwogCWRldl9pbmZvKCZkZXYtPnNiZC5jb3JlLAotCQkgIkZpcnN0IGFjY2Vzc2libGUgcmVnaW9uIGhhcyBpbmRleCAldSBzdGFydCAlbHUgc2l6ZSAlbHVcbiIsCisJCSAiRmlyc3QgYWNjZXNzaWJsZSByZWdpb24gaGFzIGluZGV4ICV1IHN0YXJ0ICVsbHUgc2l6ZSAlbGx1XG4iLAogCQkgZGV2LT5yZWdpb25faWR4LCBkZXYtPnJlZ2lvbnNbZGV2LT5yZWdpb25faWR4XS5zdGFydCwKIAkJIGRldi0+cmVnaW9uc1tkZXYtPnJlZ2lvbl9pZHhdLnNpemUpOwogCkBAIC0yMjAsNyArMjIwLDcgQEAKIAljb25zdCBjaGFyICpvcCA9IHdyaXRlID8gIndyaXRlIiA6ICJyZWFkIjsKIAlpbnQgcmVzOwogCi0JZGV2X2RiZygmZGV2LT5zYmQuY29yZSwgIiVzOiV1OiAlcyAlbHUgc2VjdG9ycyBzdGFydGluZyBhdCAlbHVcbiIsCisJZGV2X2RiZygmZGV2LT5zYmQuY29yZSwgIiVzOiV1OiAlcyAlbGx1IHNlY3RvcnMgc3RhcnRpbmcgYXQgJWxsdVxuIiwKIAkJX19mdW5jX18sIF9fTElORV9fLCBvcCwgc2VjdG9ycywgc3RhcnRfc2VjdG9yKTsKIAogCWluaXRfY29tcGxldGlvbigmZGV2LT5kb25lKTsKQEAgLTIzOCw3ICsyMzgsNyBAQAogCiAJd2FpdF9mb3JfY29tcGxldGlvbigmZGV2LT5kb25lKTsKIAlpZiAoZGV2LT5sdjFfc3RhdHVzKSB7Ci0JCWRldl9kYmcoJmRldi0+c2JkLmNvcmUsICIlczoldTogJXMgZmFpbGVkIDB4JWx4XG4iLCBfX2Z1bmNfXywKKwkJZGV2X2RiZygmZGV2LT5zYmQuY29yZSwgIiVzOiV1OiAlcyBmYWlsZWQgMHglbGx4XG4iLCBfX2Z1bmNfXywKIAkJCV9fTElORV9fLCBvcCwgZGV2LT5sdjFfc3RhdHVzKTsKIAkJcmV0dXJuIGRldi0+bHYxX3N0YXR1czsKIAl9CkBAIC0yNjgsNyArMjY4LDcgQEAKIHsKIAlpbnQgcmVzOwogCi0JZGV2X2RiZygmZGV2LT5zYmQuY29yZSwgIiVzOiV1OiBzZW5kIGRldmljZSBjb21tYW5kIDB4JWx4XG4iLCBfX2Z1bmNfXywKKwlkZXZfZGJnKCZkZXYtPnNiZC5jb3JlLCAiJXM6JXU6IHNlbmQgZGV2aWNlIGNvbW1hbmQgMHglbGx4XG4iLCBfX2Z1bmNfXywKIAkJX19MSU5FX18sIGNtZCk7CiAKIAlpbml0X2NvbXBsZXRpb24oJmRldi0+ZG9uZSk7CkBAIC0yNzcsMTkgKzI3NywxOSBAQAogCQkJCQkgICAgICBhcmcyLCBhcmczLCBhcmc0LCAmZGV2LT50YWcpOwogCWlmIChyZXMpIHsKIAkJZGV2X2VycigmZGV2LT5zYmQuY29yZSwKLQkJCSIlczoldTogc2VuZF9kZXZpY2VfY29tbWFuZCAweCVseCBmYWlsZWQgJWRcbiIsCisJCQkiJXM6JXU6IHNlbmRfZGV2aWNlX2NvbW1hbmQgMHglbGx4IGZhaWxlZCAlZFxuIiwKIAkJCV9fZnVuY19fLCBfX0xJTkVfXywgY21kLCByZXMpOwogCQlyZXR1cm4gLTE7CiAJfQogCiAJd2FpdF9mb3JfY29tcGxldGlvbigmZGV2LT5kb25lKTsKIAlpZiAoZGV2LT5sdjFfc3RhdHVzKSB7Ci0JCWRldl9kYmcoJmRldi0+c2JkLmNvcmUsICIlczoldTogY29tbWFuZCAweCVseCBmYWlsZWQgMHglbHhcbiIsCisJCWRldl9kYmcoJmRldi0+c2JkLmNvcmUsICIlczoldTogY29tbWFuZCAweCVsbHggZmFpbGVkIDB4JWxseFxuIiwKIAkJCV9fZnVuY19fLCBfX0xJTkVfXywgY21kLCBkZXYtPmx2MV9zdGF0dXMpOwogCQlyZXR1cm4gZGV2LT5sdjFfc3RhdHVzOwogCX0KIAotCWRldl9kYmcoJmRldi0+c2JkLmNvcmUsICIlczoldTogY29tbWFuZCAweCVseCBjb21wbGV0ZWRcbiIsIF9fZnVuY19fLAorCWRldl9kYmcoJmRldi0+c2JkLmNvcmUsICIlczoldTogY29tbWFuZCAweCVsbHggY29tcGxldGVkXG4iLCBfX2Z1bmNfXywKIAkJX19MSU5FX18sIGNtZCk7CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmVndWxhdG9yL0tjb25maWcgYi9kcml2ZXJzL3JlZ3VsYXRvci9LY29uZmlnCmluZGV4IDM5MzYwZTIuLmU3ZTBjZjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcmVndWxhdG9yL0tjb25maWcKKysrIGIvZHJpdmVycy9yZWd1bGF0b3IvS2NvbmZpZwpAQCAtNzMsNCArNzMsMTEgQEAKIAkgIFNheSB5IGhlcmUgdG8gc3VwcG9ydCB0aGUgQlVDS3MgYW5kIExET3MgcmVndWxhdG9ycyBmb3VuZCBvbgogCSAgRGlhbG9nIFNlbWljb25kdWN0b3IgREE5MDMwL0RBOTAzNCBQTUlDLgogCitjb25maWcgUkVHVUxBVE9SX1BDRjUwNjMzCisJdHJpc3RhdGUgIlBDRjUwNjMzIHJlZ3VsYXRvciBkcml2ZXIiCisgICAgICAgIGRlcGVuZHMgb24gTUZEX1BDRjUwNjMzCisJaGVscAorCSBTYXkgWSBoZXJlIHRvIHN1cHBvcnQgdGhlIHZvbHRhZ2UgcmVndWxhdG9ycyBhbmQgY29udmVydG9ycworCSBvbiBQQ0Y1MDYzMworCiBlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZWd1bGF0b3IvTWFrZWZpbGUgYi9kcml2ZXJzL3JlZ3VsYXRvci9NYWtlZmlsZQppbmRleCAyNTRkNDBjLi42MWIzMGM2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3JlZ3VsYXRvci9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3JlZ3VsYXRvci9NYWtlZmlsZQpAQCAtMTEsNSArMTEsNiBAQAogb2JqLSQoQ09ORklHX1JFR1VMQVRPUl9XTTgzNTApICs9IHdtODM1MC1yZWd1bGF0b3Iubwogb2JqLSQoQ09ORklHX1JFR1VMQVRPUl9XTTg0MDApICs9IHdtODQwMC1yZWd1bGF0b3Iubwogb2JqLSQoQ09ORklHX1JFR1VMQVRPUl9EQTkwM1gpCSs9IGRhOTAzeC5vCitvYmotJChDT05GSUdfUkVHVUxBVE9SX1BDRjUwNjMzKSArPSBwY2Y1MDYzMy1yZWd1bGF0b3IubwogCiBjY2ZsYWdzLSQoQ09ORklHX1JFR1VMQVRPUl9ERUJVRykgKz0gLURERUJVRwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZWd1bGF0b3IvY29yZS5jIGIvZHJpdmVycy9yZWd1bGF0b3IvY29yZS5jCmluZGV4IDAyYTc3NDQuLmY1MTFhNDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcmVndWxhdG9yL2NvcmUuYworKysgYi9kcml2ZXJzL3JlZ3VsYXRvci9jb3JlLmMKQEAgLTI5LDcgKzI5LDcgQEAKIHN0YXRpYyBMSVNUX0hFQUQocmVndWxhdG9yX2xpc3QpOwogc3RhdGljIExJU1RfSEVBRChyZWd1bGF0b3JfbWFwX2xpc3QpOwogCi0vKioKKy8qCiAgKiBzdHJ1Y3QgcmVndWxhdG9yX2RldgogICoKICAqIFZvbHRhZ2UgLyBDdXJyZW50IHJlZ3VsYXRvciBjbGFzcyBkZXZpY2UuIE9uZSBmb3IgZWFjaCByZWd1bGF0b3IuCkBAIC01Niw3ICs1Niw3IEBACiAJdm9pZCAqcmVnX2RhdGE7CQkvKiByZWd1bGF0b3JfZGV2IGRhdGEgKi8KIH07CiAKLS8qKgorLyoKICAqIHN0cnVjdCByZWd1bGF0b3JfbWFwCiAgKgogICogVXNlZCB0byBwcm92aWRlIHN5bWJvbGljIHN1cHBseSBuYW1lcyB0byBkZXZpY2VzLgpAQCAtNzksNyArNzksNyBAQAogCWludCB1QV9sb2FkOwogCWludCBtaW5fdVY7CiAJaW50IG1heF91VjsKLQlpbnQgZW5hYmxlZDsgLyogY2xpZW50IGhhcyBjYWxsZWQgZW5hYmxlZCAqLworCWludCBlbmFibGVkOyAvKiBjb3VudCBvZiBjbGllbnQgZW5hYmxlcyAqLwogCWNoYXIgKnN1cHBseV9uYW1lOwogCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlIGRldl9hdHRyOwogCXN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2OwpAQCAtMTc0LDYgKzE3NCwxNiBAQAogLyogb3BlcmF0aW5nIG1vZGUgY29uc3RyYWludCBjaGVjayAqLwogc3RhdGljIGludCByZWd1bGF0b3JfY2hlY2tfbW9kZShzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldiwgaW50IG1vZGUpCiB7CisJc3dpdGNoIChtb2RlKSB7CisJY2FzZSBSRUdVTEFUT1JfTU9ERV9GQVNUOgorCWNhc2UgUkVHVUxBVE9SX01PREVfTk9STUFMOgorCWNhc2UgUkVHVUxBVE9SX01PREVfSURMRToKKwljYXNlIFJFR1VMQVRPUl9NT0RFX1NUQU5EQlk6CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKwogCWlmICghcmRldi0+Y29uc3RyYWludHMpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICIlczogbm8gY29uc3RyYWludHMgZm9yICVzXG4iLCBfX2Z1bmNfXywKIAkJICAgICAgIHJkZXYtPmRlc2MtPm5hbWUpOwpAQCAtMjMyLDYgKzI0Miw3IEBACiAKIAlyZXR1cm4gcmV0OwogfQorc3RhdGljIERFVklDRV9BVFRSKG1pY3Jvdm9sdHMsIDA0NDQsIHJlZ3VsYXRvcl91Vl9zaG93LCBOVUxMKTsKIAogc3RhdGljIHNzaXplX3QgcmVndWxhdG9yX3VBX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAogCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCkBAIC0yNDAsNiArMjUxLDcgQEAKIAogCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBfcmVndWxhdG9yX2dldF9jdXJyZW50X2xpbWl0KHJkZXYpKTsKIH0KK3N0YXRpYyBERVZJQ0VfQVRUUihtaWNyb2FtcHMsIDA0NDQsIHJlZ3VsYXRvcl91QV9zaG93LCBOVUxMKTsKIAogc3RhdGljIHNzaXplX3QgcmVndWxhdG9yX25hbWVfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJCQkgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCkBAIC0yNTcsMTIgKzI2OSw4IEBACiAJcmV0dXJuIHNwcmludGYoYnVmLCAiJXNcbiIsIG5hbWUpOwogfQogCi1zdGF0aWMgc3NpemVfdCByZWd1bGF0b3Jfb3Btb2RlX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAotCQkJCSAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQorc3RhdGljIHNzaXplX3QgcmVndWxhdG9yX3ByaW50X29wbW9kZShjaGFyICpidWYsIGludCBtb2RlKQogewotCXN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0JaW50IG1vZGUgPSBfcmVndWxhdG9yX2dldF9tb2RlKHJkZXYpOwotCiAJc3dpdGNoIChtb2RlKSB7CiAJY2FzZSBSRUdVTEFUT1JfTU9ERV9GQVNUOgogCQlyZXR1cm4gc3ByaW50ZihidWYsICJmYXN0XG4iKTsKQEAgLTI3NiwxMiArMjg0LDE3IEBACiAJcmV0dXJuIHNwcmludGYoYnVmLCAidW5rbm93blxuIik7CiB9CiAKLXN0YXRpYyBzc2l6ZV90IHJlZ3VsYXRvcl9zdGF0ZV9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCQkgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQorc3RhdGljIHNzaXplX3QgcmVndWxhdG9yX29wbW9kZV9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKIAlzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCWludCBzdGF0ZSA9IF9yZWd1bGF0b3JfaXNfZW5hYmxlZChyZGV2KTsKIAorCXJldHVybiByZWd1bGF0b3JfcHJpbnRfb3Btb2RlKGJ1ZiwgX3JlZ3VsYXRvcl9nZXRfbW9kZShyZGV2KSk7Cit9CitzdGF0aWMgREVWSUNFX0FUVFIob3Btb2RlLCAwNDQ0LCByZWd1bGF0b3Jfb3Btb2RlX3Nob3csIE5VTEwpOworCitzdGF0aWMgc3NpemVfdCByZWd1bGF0b3JfcHJpbnRfc3RhdGUoY2hhciAqYnVmLCBpbnQgc3RhdGUpCit7CiAJaWYgKHN0YXRlID4gMCkKIAkJcmV0dXJuIHNwcmludGYoYnVmLCAiZW5hYmxlZFxuIik7CiAJZWxzZSBpZiAoc3RhdGUgPT0gMCkKQEAgLTI5MCw2ICszMDMsMTUgQEAKIAkJcmV0dXJuIHNwcmludGYoYnVmLCAidW5rbm93blxuIik7CiB9CiAKK3N0YXRpYyBzc2l6ZV90IHJlZ3VsYXRvcl9zdGF0ZV9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisKKwlyZXR1cm4gcmVndWxhdG9yX3ByaW50X3N0YXRlKGJ1ZiwgX3JlZ3VsYXRvcl9pc19lbmFibGVkKHJkZXYpKTsKK30KK3N0YXRpYyBERVZJQ0VfQVRUUihzdGF0ZSwgMDQ0NCwgcmVndWxhdG9yX3N0YXRlX3Nob3csIE5VTEwpOworCiBzdGF0aWMgc3NpemVfdCByZWd1bGF0b3JfbWluX3VBX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAogCQkJCSAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQogewpAQCAtMzAwLDYgKzMyMiw3IEBACiAKIAlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgcmRldi0+Y29uc3RyYWludHMtPm1pbl91QSk7CiB9CitzdGF0aWMgREVWSUNFX0FUVFIobWluX21pY3JvYW1wcywgMDQ0NCwgcmVndWxhdG9yX21pbl91QV9zaG93LCBOVUxMKTsKIAogc3RhdGljIHNzaXplX3QgcmVndWxhdG9yX21heF91QV9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJCQkgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKQEAgLTMxMSw2ICszMzQsNyBAQAogCiAJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHJkZXYtPmNvbnN0cmFpbnRzLT5tYXhfdUEpOwogfQorc3RhdGljIERFVklDRV9BVFRSKG1heF9taWNyb2FtcHMsIDA0NDQsIHJlZ3VsYXRvcl9tYXhfdUFfc2hvdywgTlVMTCk7CiAKIHN0YXRpYyBzc2l6ZV90IHJlZ3VsYXRvcl9taW5fdVZfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJCQkJICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCkBAIC0zMjIsNiArMzQ2LDcgQEAKIAogCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCByZGV2LT5jb25zdHJhaW50cy0+bWluX3VWKTsKIH0KK3N0YXRpYyBERVZJQ0VfQVRUUihtaW5fbWljcm92b2x0cywgMDQ0NCwgcmVndWxhdG9yX21pbl91Vl9zaG93LCBOVUxMKTsKIAogc3RhdGljIHNzaXplX3QgcmVndWxhdG9yX21heF91Vl9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJCQkgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKQEAgLTMzMyw2ICszNTgsNyBAQAogCiAJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHJkZXYtPmNvbnN0cmFpbnRzLT5tYXhfdVYpOwogfQorc3RhdGljIERFVklDRV9BVFRSKG1heF9taWNyb3ZvbHRzLCAwNDQ0LCByZWd1bGF0b3JfbWF4X3VWX3Nob3csIE5VTEwpOwogCiBzdGF0aWMgc3NpemVfdCByZWd1bGF0b3JfdG90YWxfdUFfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJCQkJICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKQEAgLTM0Nyw2ICszNzMsNyBAQAogCW11dGV4X3VubG9jaygmcmRldi0+bXV0ZXgpOwogCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCB1QSk7CiB9CitzdGF0aWMgREVWSUNFX0FUVFIocmVxdWVzdGVkX21pY3JvYW1wcywgMDQ0NCwgcmVndWxhdG9yX3RvdGFsX3VBX3Nob3csIE5VTEwpOwogCiBzdGF0aWMgc3NpemVfdCByZWd1bGF0b3JfbnVtX3VzZXJzX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAogCQkJCSAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCkBAIC0zNzQsMTUzICs0MDEsMTA2IEBACiB7CiAJc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAotCWlmICghcmRldi0+Y29uc3RyYWludHMpCi0JCXJldHVybiBzcHJpbnRmKGJ1ZiwgIm5vdCBkZWZpbmVkXG4iKTsKIAlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgcmRldi0+Y29uc3RyYWludHMtPnN0YXRlX21lbS51Vik7CiB9CitzdGF0aWMgREVWSUNFX0FUVFIoc3VzcGVuZF9tZW1fbWljcm92b2x0cywgMDQ0NCwKKwkJcmVndWxhdG9yX3N1c3BlbmRfbWVtX3VWX3Nob3csIE5VTEwpOwogCiBzdGF0aWMgc3NpemVfdCByZWd1bGF0b3Jfc3VzcGVuZF9kaXNrX3VWX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAogCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCiB7CiAJc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAotCWlmICghcmRldi0+Y29uc3RyYWludHMpCi0JCXJldHVybiBzcHJpbnRmKGJ1ZiwgIm5vdCBkZWZpbmVkXG4iKTsKIAlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgcmRldi0+Y29uc3RyYWludHMtPnN0YXRlX2Rpc2sudVYpOwogfQorc3RhdGljIERFVklDRV9BVFRSKHN1c3BlbmRfZGlza19taWNyb3ZvbHRzLCAwNDQ0LAorCQlyZWd1bGF0b3Jfc3VzcGVuZF9kaXNrX3VWX3Nob3csIE5VTEwpOwogCiBzdGF0aWMgc3NpemVfdCByZWd1bGF0b3Jfc3VzcGVuZF9zdGFuZGJ5X3VWX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAogCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCiB7CiAJc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAotCWlmICghcmRldi0+Y29uc3RyYWludHMpCi0JCXJldHVybiBzcHJpbnRmKGJ1ZiwgIm5vdCBkZWZpbmVkXG4iKTsKIAlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgcmRldi0+Y29uc3RyYWludHMtPnN0YXRlX3N0YW5kYnkudVYpOwogfQotCi1zdGF0aWMgc3NpemVfdCBzdXNwZW5kX29wbW9kZV9zaG93KHN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2LAotCXVuc2lnbmVkIGludCBtb2RlLCBjaGFyICpidWYpCi17Ci0Jc3dpdGNoIChtb2RlKSB7Ci0JY2FzZSBSRUdVTEFUT1JfTU9ERV9GQVNUOgotCQlyZXR1cm4gc3ByaW50ZihidWYsICJmYXN0XG4iKTsKLQljYXNlIFJFR1VMQVRPUl9NT0RFX05PUk1BTDoKLQkJcmV0dXJuIHNwcmludGYoYnVmLCAibm9ybWFsXG4iKTsKLQljYXNlIFJFR1VMQVRPUl9NT0RFX0lETEU6Ci0JCXJldHVybiBzcHJpbnRmKGJ1ZiwgImlkbGVcbiIpOwotCWNhc2UgUkVHVUxBVE9SX01PREVfU1RBTkRCWToKLQkJcmV0dXJuIHNwcmludGYoYnVmLCAic3RhbmRieVxuIik7Ci0JfQotCXJldHVybiBzcHJpbnRmKGJ1ZiwgInVua25vd25cbiIpOwotfQorc3RhdGljIERFVklDRV9BVFRSKHN1c3BlbmRfc3RhbmRieV9taWNyb3ZvbHRzLCAwNDQ0LAorCQlyZWd1bGF0b3Jfc3VzcGVuZF9zdGFuZGJ5X3VWX3Nob3csIE5VTEwpOwogCiBzdGF0aWMgc3NpemVfdCByZWd1bGF0b3Jfc3VzcGVuZF9tZW1fbW9kZV9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQogewogCXN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CiAKLQlpZiAoIXJkZXYtPmNvbnN0cmFpbnRzKQotCQlyZXR1cm4gc3ByaW50ZihidWYsICJub3QgZGVmaW5lZFxuIik7Ci0JcmV0dXJuIHN1c3BlbmRfb3Btb2RlX3Nob3cocmRldiwKLQkJcmRldi0+Y29uc3RyYWludHMtPnN0YXRlX21lbS5tb2RlLCBidWYpOworCXJldHVybiByZWd1bGF0b3JfcHJpbnRfb3Btb2RlKGJ1ZiwKKwkJcmRldi0+Y29uc3RyYWludHMtPnN0YXRlX21lbS5tb2RlKTsKIH0KK3N0YXRpYyBERVZJQ0VfQVRUUihzdXNwZW5kX21lbV9tb2RlLCAwNDQ0LAorCQlyZWd1bGF0b3Jfc3VzcGVuZF9tZW1fbW9kZV9zaG93LCBOVUxMKTsKIAogc3RhdGljIHNzaXplX3QgcmVndWxhdG9yX3N1c3BlbmRfZGlza19tb2RlX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAogCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCiB7CiAJc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAotCWlmICghcmRldi0+Y29uc3RyYWludHMpCi0JCXJldHVybiBzcHJpbnRmKGJ1ZiwgIm5vdCBkZWZpbmVkXG4iKTsKLQlyZXR1cm4gc3VzcGVuZF9vcG1vZGVfc2hvdyhyZGV2LAotCQlyZGV2LT5jb25zdHJhaW50cy0+c3RhdGVfZGlzay5tb2RlLCBidWYpOworCXJldHVybiByZWd1bGF0b3JfcHJpbnRfb3Btb2RlKGJ1ZiwKKwkJcmRldi0+Y29uc3RyYWludHMtPnN0YXRlX2Rpc2subW9kZSk7CiB9CitzdGF0aWMgREVWSUNFX0FUVFIoc3VzcGVuZF9kaXNrX21vZGUsIDA0NDQsCisJCXJlZ3VsYXRvcl9zdXNwZW5kX2Rpc2tfbW9kZV9zaG93LCBOVUxMKTsKIAogc3RhdGljIHNzaXplX3QgcmVndWxhdG9yX3N1c3BlbmRfc3RhbmRieV9tb2RlX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAogCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCiB7CiAJc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAotCWlmICghcmRldi0+Y29uc3RyYWludHMpCi0JCXJldHVybiBzcHJpbnRmKGJ1ZiwgIm5vdCBkZWZpbmVkXG4iKTsKLQlyZXR1cm4gc3VzcGVuZF9vcG1vZGVfc2hvdyhyZGV2LAotCQlyZGV2LT5jb25zdHJhaW50cy0+c3RhdGVfc3RhbmRieS5tb2RlLCBidWYpOworCXJldHVybiByZWd1bGF0b3JfcHJpbnRfb3Btb2RlKGJ1ZiwKKwkJcmRldi0+Y29uc3RyYWludHMtPnN0YXRlX3N0YW5kYnkubW9kZSk7CiB9CitzdGF0aWMgREVWSUNFX0FUVFIoc3VzcGVuZF9zdGFuZGJ5X21vZGUsIDA0NDQsCisJCXJlZ3VsYXRvcl9zdXNwZW5kX3N0YW5kYnlfbW9kZV9zaG93LCBOVUxMKTsKIAogc3RhdGljIHNzaXplX3QgcmVndWxhdG9yX3N1c3BlbmRfbWVtX3N0YXRlX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAogCQkJCSAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCiB7CiAJc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAotCWlmICghcmRldi0+Y29uc3RyYWludHMpCi0JCXJldHVybiBzcHJpbnRmKGJ1ZiwgIm5vdCBkZWZpbmVkXG4iKTsKLQotCWlmIChyZGV2LT5jb25zdHJhaW50cy0+c3RhdGVfbWVtLmVuYWJsZWQpCi0JCXJldHVybiBzcHJpbnRmKGJ1ZiwgImVuYWJsZWRcbiIpOwotCWVsc2UKLQkJcmV0dXJuIHNwcmludGYoYnVmLCAiZGlzYWJsZWRcbiIpOworCXJldHVybiByZWd1bGF0b3JfcHJpbnRfc3RhdGUoYnVmLAorCQkJcmRldi0+Y29uc3RyYWludHMtPnN0YXRlX21lbS5lbmFibGVkKTsKIH0KK3N0YXRpYyBERVZJQ0VfQVRUUihzdXNwZW5kX21lbV9zdGF0ZSwgMDQ0NCwKKwkJcmVndWxhdG9yX3N1c3BlbmRfbWVtX3N0YXRlX3Nob3csIE5VTEwpOwogCiBzdGF0aWMgc3NpemVfdCByZWd1bGF0b3Jfc3VzcGVuZF9kaXNrX3N0YXRlX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAogCQkJCSAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCiB7CiAJc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAotCWlmICghcmRldi0+Y29uc3RyYWludHMpCi0JCXJldHVybiBzcHJpbnRmKGJ1ZiwgIm5vdCBkZWZpbmVkXG4iKTsKLQotCWlmIChyZGV2LT5jb25zdHJhaW50cy0+c3RhdGVfZGlzay5lbmFibGVkKQotCQlyZXR1cm4gc3ByaW50ZihidWYsICJlbmFibGVkXG4iKTsKLQllbHNlCi0JCXJldHVybiBzcHJpbnRmKGJ1ZiwgImRpc2FibGVkXG4iKTsKKwlyZXR1cm4gcmVndWxhdG9yX3ByaW50X3N0YXRlKGJ1ZiwKKwkJCXJkZXYtPmNvbnN0cmFpbnRzLT5zdGF0ZV9kaXNrLmVuYWJsZWQpOwogfQorc3RhdGljIERFVklDRV9BVFRSKHN1c3BlbmRfZGlza19zdGF0ZSwgMDQ0NCwKKwkJcmVndWxhdG9yX3N1c3BlbmRfZGlza19zdGF0ZV9zaG93LCBOVUxMKTsKIAogc3RhdGljIHNzaXplX3QgcmVndWxhdG9yX3N1c3BlbmRfc3RhbmRieV9zdGF0ZV9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJCQkgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQogewogCXN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CiAKLQlpZiAoIXJkZXYtPmNvbnN0cmFpbnRzKQotCQlyZXR1cm4gc3ByaW50ZihidWYsICJub3QgZGVmaW5lZFxuIik7Ci0KLQlpZiAocmRldi0+Y29uc3RyYWludHMtPnN0YXRlX3N0YW5kYnkuZW5hYmxlZCkKLQkJcmV0dXJuIHNwcmludGYoYnVmLCAiZW5hYmxlZFxuIik7Ci0JZWxzZQotCQlyZXR1cm4gc3ByaW50ZihidWYsICJkaXNhYmxlZFxuIik7CisJcmV0dXJuIHJlZ3VsYXRvcl9wcmludF9zdGF0ZShidWYsCisJCQlyZGV2LT5jb25zdHJhaW50cy0+c3RhdGVfc3RhbmRieS5lbmFibGVkKTsKIH0KK3N0YXRpYyBERVZJQ0VfQVRUUihzdXNwZW5kX3N0YW5kYnlfc3RhdGUsIDA0NDQsCisJCXJlZ3VsYXRvcl9zdXNwZW5kX3N0YW5kYnlfc3RhdGVfc2hvdywgTlVMTCk7CiAKKworLyoKKyAqIFRoZXNlIGFyZSB0aGUgb25seSBhdHRyaWJ1dGVzIGFyZSBwcmVzZW50IGZvciBhbGwgcmVndWxhdG9ycy4KKyAqIE90aGVyIGF0dHJpYnV0ZXMgYXJlIGEgZnVuY3Rpb24gb2YgcmVndWxhdG9yIGZ1bmN0aW9uYWxpdHkuCisgKi8KIHN0YXRpYyBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSByZWd1bGF0b3JfZGV2X2F0dHJzW10gPSB7CiAJX19BVFRSKG5hbWUsIDA0NDQsIHJlZ3VsYXRvcl9uYW1lX3Nob3csIE5VTEwpLAotCV9fQVRUUihtaWNyb3ZvbHRzLCAwNDQ0LCByZWd1bGF0b3JfdVZfc2hvdywgTlVMTCksCi0JX19BVFRSKG1pY3JvYW1wcywgMDQ0NCwgcmVndWxhdG9yX3VBX3Nob3csIE5VTEwpLAotCV9fQVRUUihvcG1vZGUsIDA0NDQsIHJlZ3VsYXRvcl9vcG1vZGVfc2hvdywgTlVMTCksCi0JX19BVFRSKHN0YXRlLCAwNDQ0LCByZWd1bGF0b3Jfc3RhdGVfc2hvdywgTlVMTCksCi0JX19BVFRSKG1pbl9taWNyb3ZvbHRzLCAwNDQ0LCByZWd1bGF0b3JfbWluX3VWX3Nob3csIE5VTEwpLAotCV9fQVRUUihtaW5fbWljcm9hbXBzLCAwNDQ0LCByZWd1bGF0b3JfbWluX3VBX3Nob3csIE5VTEwpLAotCV9fQVRUUihtYXhfbWljcm92b2x0cywgMDQ0NCwgcmVndWxhdG9yX21heF91Vl9zaG93LCBOVUxMKSwKLQlfX0FUVFIobWF4X21pY3JvYW1wcywgMDQ0NCwgcmVndWxhdG9yX21heF91QV9zaG93LCBOVUxMKSwKLQlfX0FUVFIocmVxdWVzdGVkX21pY3JvYW1wcywgMDQ0NCwgcmVndWxhdG9yX3RvdGFsX3VBX3Nob3csIE5VTEwpLAogCV9fQVRUUihudW1fdXNlcnMsIDA0NDQsIHJlZ3VsYXRvcl9udW1fdXNlcnNfc2hvdywgTlVMTCksCiAJX19BVFRSKHR5cGUsIDA0NDQsIHJlZ3VsYXRvcl90eXBlX3Nob3csIE5VTEwpLAotCV9fQVRUUihzdXNwZW5kX21lbV9taWNyb3ZvbHRzLCAwNDQ0LAotCQlyZWd1bGF0b3Jfc3VzcGVuZF9tZW1fdVZfc2hvdywgTlVMTCksCi0JX19BVFRSKHN1c3BlbmRfZGlza19taWNyb3ZvbHRzLCAwNDQ0LAotCQlyZWd1bGF0b3Jfc3VzcGVuZF9kaXNrX3VWX3Nob3csIE5VTEwpLAotCV9fQVRUUihzdXNwZW5kX3N0YW5kYnlfbWljcm92b2x0cywgMDQ0NCwKLQkJcmVndWxhdG9yX3N1c3BlbmRfc3RhbmRieV91Vl9zaG93LCBOVUxMKSwKLQlfX0FUVFIoc3VzcGVuZF9tZW1fbW9kZSwgMDQ0NCwKLQkJcmVndWxhdG9yX3N1c3BlbmRfbWVtX21vZGVfc2hvdywgTlVMTCksCi0JX19BVFRSKHN1c3BlbmRfZGlza19tb2RlLCAwNDQ0LAotCQlyZWd1bGF0b3Jfc3VzcGVuZF9kaXNrX21vZGVfc2hvdywgTlVMTCksCi0JX19BVFRSKHN1c3BlbmRfc3RhbmRieV9tb2RlLCAwNDQ0LAotCQlyZWd1bGF0b3Jfc3VzcGVuZF9zdGFuZGJ5X21vZGVfc2hvdywgTlVMTCksCi0JX19BVFRSKHN1c3BlbmRfbWVtX3N0YXRlLCAwNDQ0LAotCQlyZWd1bGF0b3Jfc3VzcGVuZF9tZW1fc3RhdGVfc2hvdywgTlVMTCksCi0JX19BVFRSKHN1c3BlbmRfZGlza19zdGF0ZSwgMDQ0NCwKLQkJcmVndWxhdG9yX3N1c3BlbmRfZGlza19zdGF0ZV9zaG93LCBOVUxMKSwKLQlfX0FUVFIoc3VzcGVuZF9zdGFuZGJ5X3N0YXRlLCAwNDQ0LAotCQlyZWd1bGF0b3Jfc3VzcGVuZF9zdGFuZGJ5X3N0YXRlX3Nob3csIE5VTEwpLAogCV9fQVRUUl9OVUxMLAogfTsKIApAQCAtNjc1LDcgKzY1NSw4IEBACiAKIC8qKgogICogc2V0X21hY2hpbmVfY29uc3RyYWludHMgLSBzZXRzIHJlZ3VsYXRvciBjb25zdHJhaW50cwotICogQHJlZ3VsYXRvcjogcmVndWxhdG9yIHNvdXJjZQorICogQHJkZXY6IHJlZ3VsYXRvciBzb3VyY2UKKyAqIEBjb25zdHJhaW50czogY29uc3RyYWludHMgdG8gYXBwbHkKICAqCiAgKiBBbGxvd3MgcGxhdGZvcm0gaW5pdGlhbGlzYXRpb24gY29kZSB0byBkZWZpbmUgYW5kIGNvbnN0cmFpbgogICogcmVndWxhdG9yIGNpcmN1aXRzIGUuZy4gdmFsaWQgdm9sdGFnZS9jdXJyZW50IHJhbmdlcywgZXRjLiAgTk9URToKQEAgLTc1MCw4ICs3MzEsOCBAQAogCiAvKioKICAqIHNldF9zdXBwbHkgLSBzZXQgcmVndWxhdG9yIHN1cHBseSByZWd1bGF0b3IKLSAqIEByZWd1bGF0b3I6IHJlZ3VsYXRvciBuYW1lCi0gKiBAc3VwcGx5OiBzdXBwbHkgcmVndWxhdG9yIG5hbWUKKyAqIEByZGV2OiByZWd1bGF0b3IgbmFtZQorICogQHN1cHBseV9yZGV2OiBzdXBwbHkgcmVndWxhdG9yIG5hbWUKICAqCiAgKiBDYWxsZWQgYnkgcGxhdGZvcm0gaW5pdGlhbGlzYXRpb24gY29kZSB0byBzZXQgdGhlIHN1cHBseSByZWd1bGF0b3IgZm9yIHRoaXMKICAqIHJlZ3VsYXRvci4gVGhpcyBlbnN1cmVzIHRoYXQgYSByZWd1bGF0b3JzIHN1cHBseSB3aWxsIGFsc28gYmUgZW5hYmxlZCBieSB0aGUKQEAgLTc3OCw5ICs3NTksOSBAQAogCiAvKioKICAqIHNldF9jb25zdW1lcl9kZXZpY2Vfc3VwcGx5OiBCaW5kIGEgcmVndWxhdG9yIHRvIGEgc3ltYm9saWMgc3VwcGx5Ci0gKiBAcmVndWxhdG9yOiByZWd1bGF0b3Igc291cmNlCi0gKiBAZGV2OiAgICAgICBkZXZpY2UgdGhlIHN1cHBseSBhcHBsaWVzIHRvCi0gKiBAc3VwcGx5OiAgICBzeW1ib2xpYyBuYW1lIGZvciBzdXBwbHkKKyAqIEByZGV2OiAgICAgICAgIHJlZ3VsYXRvciBzb3VyY2UKKyAqIEBjb25zdW1lcl9kZXY6IGRldmljZSB0aGUgc3VwcGx5IGFwcGxpZXMgdG8KKyAqIEBzdXBwbHk6ICAgICAgIHN5bWJvbGljIG5hbWUgZm9yIHN1cHBseQogICoKICAqIEFsbG93cyBwbGF0Zm9ybSBpbml0aWFsaXNhdGlvbiBjb2RlIHRvIG1hcCBwaHlzaWNhbCByZWd1bGF0b3IKICAqIHNvdXJjZXMgdG8gc3ltYm9saWMgbmFtZXMgZm9yIHN1cHBsaWVzIGZvciB1c2UgYnkgZGV2aWNlcy4gIERldmljZXMKQEAgLTc5NSw2ICs3NzYsMjAgQEAKIAlpZiAoc3VwcGx5ID09IE5VTEwpCiAJCXJldHVybiAtRUlOVkFMOwogCisJbGlzdF9mb3JfZWFjaF9lbnRyeShub2RlLCAmcmVndWxhdG9yX21hcF9saXN0LCBsaXN0KSB7CisJCWlmIChjb25zdW1lcl9kZXYgIT0gbm9kZS0+ZGV2KQorCQkJY29udGludWU7CisJCWlmIChzdHJjbXAobm9kZS0+c3VwcGx5LCBzdXBwbHkpICE9IDApCisJCQljb250aW51ZTsKKworCQlkZXZfZGJnKGNvbnN1bWVyX2RldiwgIiVzLyVzIGlzICclcycgc3VwcGx5OyBmYWlsICVzLyVzXG4iLAorCQkJCWRldl9uYW1lKCZub2RlLT5yZWd1bGF0b3ItPmRldiksCisJCQkJbm9kZS0+cmVndWxhdG9yLT5kZXNjLT5uYW1lLAorCQkJCXN1cHBseSwKKwkJCQlkZXZfbmFtZSgmcmRldi0+ZGV2KSwgcmRldi0+ZGVzYy0+bmFtZSk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCiAJbm9kZSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCByZWd1bGF0b3JfbWFwKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKG5vZGUgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9NRU07CkBAIC05NjMsMTYgKzk1OCwxMyBAQAogCWlmIChyZWd1bGF0b3IgPT0gTlVMTCB8fCBJU19FUlIocmVndWxhdG9yKSkKIAkJcmV0dXJuOwogCi0JaWYgKHJlZ3VsYXRvci0+ZW5hYmxlZCkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJSZWxlYXNpbmcgc3VwcGx5ICVzIHdoaWxlIGVuYWJsZWRcbiIsCi0JCSAgICAgICByZWd1bGF0b3ItPnN1cHBseV9uYW1lKTsKLQkJV0FSTl9PTihyZWd1bGF0b3ItPmVuYWJsZWQpOwotCQlyZWd1bGF0b3JfZGlzYWJsZShyZWd1bGF0b3IpOwotCX0KLQogCW11dGV4X2xvY2soJnJlZ3VsYXRvcl9saXN0X211dGV4KTsKIAlyZGV2ID0gcmVndWxhdG9yLT5yZGV2OwogCisJaWYgKFdBUk4ocmVndWxhdG9yLT5lbmFibGVkLCAiUmVsZWFzaW5nIHN1cHBseSAlcyB3aGlsZSBlbmFibGVkXG4iLAorCQkJICAgICAgIHJlZ3VsYXRvci0+c3VwcGx5X25hbWUpKQorCQlfcmVndWxhdG9yX2Rpc2FibGUocmRldik7CisKIAkvKiByZW1vdmUgYW55IHN5c2ZzIGVudHJpZXMgKi8KIAlpZiAocmVndWxhdG9yLT5kZXYpIHsKIAkJc3lzZnNfcmVtb3ZlX2xpbmsoJnJkZXYtPmRldi5rb2JqLCByZWd1bGF0b3ItPnN1cHBseV9uYW1lKTsKQEAgLTEwMzQsMjkgKzEwMjYsMjYgQEAKICAqIHJlZ3VsYXRvcl9lbmFibGUgLSBlbmFibGUgcmVndWxhdG9yIG91dHB1dAogICogQHJlZ3VsYXRvcjogcmVndWxhdG9yIHNvdXJjZQogICoKLSAqIEVuYWJsZSB0aGUgcmVndWxhdG9yIG91dHB1dCBhdCB0aGUgcHJlZGVmaW5lZCB2b2x0YWdlIG9yIGN1cnJlbnQgdmFsdWUuCisgKiBSZXF1ZXN0IHRoYXQgdGhlIHJlZ3VsYXRvciBiZSBlbmFibGVkIHdpdGggdGhlIHJlZ3VsYXRvciBvdXRwdXQgYXQKKyAqIHRoZSBwcmVkZWZpbmVkIHZvbHRhZ2Ugb3IgY3VycmVudCB2YWx1ZS4gIENhbGxzIHRvIHJlZ3VsYXRvcl9lbmFibGUoKQorICogbXVzdCBiZSBiYWxhbmNlZCB3aXRoIGNhbGxzIHRvIHJlZ3VsYXRvcl9kaXNhYmxlKCkuCisgKgogICogTk9URTogdGhlIG91dHB1dCB2YWx1ZSBjYW4gYmUgc2V0IGJ5IG90aGVyIGRyaXZlcnMsIGJvb3QgbG9hZGVyIG9yIG1heSBiZQogICogaGFyZHdpcmVkIGluIHRoZSByZWd1bGF0b3IuCi0gKiBOT1RFOiBjYWxscyB0byByZWd1bGF0b3JfZW5hYmxlKCkgbXVzdCBiZSBiYWxhbmNlZCB3aXRoIGNhbGxzIHRvCi0gKiByZWd1bGF0b3JfZGlzYWJsZSgpLgogICovCiBpbnQgcmVndWxhdG9yX2VuYWJsZShzdHJ1Y3QgcmVndWxhdG9yICpyZWd1bGF0b3IpCiB7Ci0JaW50IHJldDsKKwlzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldiA9IHJlZ3VsYXRvci0+cmRldjsKKwlpbnQgcmV0ID0gMDsKIAotCWlmIChyZWd1bGF0b3ItPmVuYWJsZWQpIHsKLQkJcHJpbnRrKEtFUk5fQ1JJVCAiUmVndWxhdG9yICVzIGFscmVhZHkgZW5hYmxlZFxuIiwKLQkJICAgICAgIHJlZ3VsYXRvci0+c3VwcGx5X25hbWUpOwotCQlXQVJOX09OKHJlZ3VsYXRvci0+ZW5hYmxlZCk7Ci0JCXJldHVybiAwOwotCX0KLQotCW11dGV4X2xvY2soJnJlZ3VsYXRvci0+cmRldi0+bXV0ZXgpOwotCXJlZ3VsYXRvci0+ZW5hYmxlZCA9IDE7Ci0JcmV0ID0gX3JlZ3VsYXRvcl9lbmFibGUocmVndWxhdG9yLT5yZGV2KTsKLQlpZiAocmV0ICE9IDApCi0JCXJlZ3VsYXRvci0+ZW5hYmxlZCA9IDA7Ci0JbXV0ZXhfdW5sb2NrKCZyZWd1bGF0b3ItPnJkZXYtPm11dGV4KTsKKwltdXRleF9sb2NrKCZyZGV2LT5tdXRleCk7CisJaWYgKHJlZ3VsYXRvci0+ZW5hYmxlZCA9PSAwKQorCQlyZXQgPSBfcmVndWxhdG9yX2VuYWJsZShyZGV2KTsKKwllbHNlIGlmIChyZWd1bGF0b3ItPmVuYWJsZWQgPCAwKQorCQlyZXQgPSAtRUlPOworCWlmIChyZXQgPT0gMCkKKwkJcmVndWxhdG9yLT5lbmFibGVkKys7CisJbXV0ZXhfdW5sb2NrKCZyZGV2LT5tdXRleCk7CiAJcmV0dXJuIHJldDsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHJlZ3VsYXRvcl9lbmFibGUpOwpAQCAtMTEwMCwyNyArMTA4OSwzMSBAQAogICogcmVndWxhdG9yX2Rpc2FibGUgLSBkaXNhYmxlIHJlZ3VsYXRvciBvdXRwdXQKICAqIEByZWd1bGF0b3I6IHJlZ3VsYXRvciBzb3VyY2UKICAqCi0gKiBEaXNhYmxlIHRoZSByZWd1bGF0b3Igb3V0cHV0IHZvbHRhZ2Ugb3IgY3VycmVudC4KLSAqIE5PVEU6IHRoaXMgd2lsbCBvbmx5IGRpc2FibGUgdGhlIHJlZ3VsYXRvciBvdXRwdXQgaWYgbm8gb3RoZXIgY29uc3VtZXIKLSAqIGRldmljZXMgaGF2ZSBpdCBlbmFibGVkLgotICogTk9URTogY2FsbHMgdG8gcmVndWxhdG9yX2VuYWJsZSgpIG11c3QgYmUgYmFsYW5jZWQgd2l0aCBjYWxscyB0bworICogRGlzYWJsZSB0aGUgcmVndWxhdG9yIG91dHB1dCB2b2x0YWdlIG9yIGN1cnJlbnQuICBDYWxscyB0bworICogcmVndWxhdG9yX2VuYWJsZSgpIG11c3QgYmUgYmFsYW5jZWQgd2l0aCBjYWxscyB0bwogICogcmVndWxhdG9yX2Rpc2FibGUoKS4KKyAqCisgKiBOT1RFOiB0aGlzIHdpbGwgb25seSBkaXNhYmxlIHRoZSByZWd1bGF0b3Igb3V0cHV0IGlmIG5vIG90aGVyIGNvbnN1bWVyCisgKiBkZXZpY2VzIGhhdmUgaXQgZW5hYmxlZCwgdGhlIHJlZ3VsYXRvciBkZXZpY2Ugc3VwcG9ydHMgZGlzYWJsaW5nIGFuZAorICogbWFjaGluZSBjb25zdHJhaW50cyBwZXJtaXQgdGhpcyBvcGVyYXRpb24uCiAgKi8KIGludCByZWd1bGF0b3JfZGlzYWJsZShzdHJ1Y3QgcmVndWxhdG9yICpyZWd1bGF0b3IpCiB7Ci0JaW50IHJldDsKKwlzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldiA9IHJlZ3VsYXRvci0+cmRldjsKKwlpbnQgcmV0ID0gMDsKIAotCWlmICghcmVndWxhdG9yLT5lbmFibGVkKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IG5vdCBpbiB1c2UgYnkgdGhpcyBjb25zdW1lclxuIiwKLQkJCV9fZnVuY19fKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JbXV0ZXhfbG9jaygmcmVndWxhdG9yLT5yZGV2LT5tdXRleCk7Ci0JcmVndWxhdG9yLT5lbmFibGVkID0gMDsKLQlyZWd1bGF0b3ItPnVBX2xvYWQgPSAwOwotCXJldCA9IF9yZWd1bGF0b3JfZGlzYWJsZShyZWd1bGF0b3ItPnJkZXYpOwotCW11dGV4X3VubG9jaygmcmVndWxhdG9yLT5yZGV2LT5tdXRleCk7CisJbXV0ZXhfbG9jaygmcmRldi0+bXV0ZXgpOworCWlmIChyZWd1bGF0b3ItPmVuYWJsZWQgPT0gMSkgeworCQlyZXQgPSBfcmVndWxhdG9yX2Rpc2FibGUocmRldik7CisJCWlmIChyZXQgPT0gMCkKKwkJCXJlZ3VsYXRvci0+dUFfbG9hZCA9IDA7CisJfSBlbHNlIGlmIChXQVJOKHJlZ3VsYXRvci0+ZW5hYmxlZCA8PSAwLAorCQkJInVuYmFsYW5jZWQgZGlzYWJsZXMgZm9yIHN1cHBseSAlc1xuIiwKKwkJCXJlZ3VsYXRvci0+c3VwcGx5X25hbWUpKQorCQlyZXQgPSAtRUlPOworCWlmIChyZXQgPT0gMCkKKwkJcmVndWxhdG9yLT5lbmFibGVkLS07CisJbXV0ZXhfdW5sb2NrKCZyZGV2LT5tdXRleCk7CiAJcmV0dXJuIHJldDsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHJlZ3VsYXRvcl9kaXNhYmxlKTsKQEAgLTExOTYsNyArMTE4OSwxMyBAQAogICogcmVndWxhdG9yX2lzX2VuYWJsZWQgLSBpcyB0aGUgcmVndWxhdG9yIG91dHB1dCBlbmFibGVkCiAgKiBAcmVndWxhdG9yOiByZWd1bGF0b3Igc291cmNlCiAgKgotICogUmV0dXJucyB6ZXJvIGZvciBkaXNhYmxlZCBvdGhlcndpc2UgcmV0dXJuIG51bWJlciBvZiBlbmFibGUgcmVxdWVzdHMuCisgKiBSZXR1cm5zIHBvc2l0aXZlIGlmIHRoZSByZWd1bGF0b3IgZHJpdmVyIGJhY2tpbmcgdGhlIHNvdXJjZS9jbGllbnQKKyAqIGhhcyByZXF1ZXN0ZWQgdGhhdCB0aGUgZGV2aWNlIGJlIGVuYWJsZWQsIHplcm8gaWYgaXQgaGFzbid0LCBlbHNlIGEKKyAqIG5lZ2F0aXZlIGVycm5vIGNvZGUuCisgKgorICogTm90ZSB0aGF0IHRoZSBkZXZpY2UgYmFja2luZyB0aGlzIHJlZ3VsYXRvciBoYW5kbGUgY2FuIGhhdmUgbXVsdGlwbGUKKyAqIHVzZXJzLCBzbyBpdCBtaWdodCBiZSBlbmFibGVkIGV2ZW4gaWYgcmVndWxhdG9yX2VuYWJsZSgpIHdhcyBuZXZlcgorICogY2FsbGVkIGZvciB0aGlzIHBhcnRpY3VsYXIgc291cmNlLgogICovCiBpbnQgcmVndWxhdG9yX2lzX2VuYWJsZWQoc3RydWN0IHJlZ3VsYXRvciAqcmVndWxhdG9yKQogewpAQCAtMTIxOSw3ICsxMjE4LDcgQEAKICAqCiAgKiBOT1RFOiBJZiB0aGUgcmVndWxhdG9yIGlzIHNoYXJlZCBiZXR3ZWVuIHNldmVyYWwgZGV2aWNlcyB0aGVuIHRoZSBsb3dlc3QKICAqIHJlcXVlc3Qgdm9sdGFnZSB0aGF0IG1lZXRzIHRoZSBzeXN0ZW0gY29uc3RyYWludHMgd2lsbCBiZSB1c2VkLgotICogTk9URTogUmVndWxhdG9yIHN5c3RlbSBjb25zdHJhaW50cyBtdXN0IGJlIHNldCBmb3IgdGhpcyByZWd1bGF0b3IgYmVmb3JlCisgKiBSZWd1bGF0b3Igc3lzdGVtIGNvbnN0cmFpbnRzIG11c3QgYmUgc2V0IGZvciB0aGlzIHJlZ3VsYXRvciBiZWZvcmUKICAqIGNhbGxpbmcgdGhpcyBmdW5jdGlvbiBvdGhlcndpc2UgdGhpcyBjYWxsIHdpbGwgZmFpbC4KICAqLwogaW50IHJlZ3VsYXRvcl9zZXRfdm9sdGFnZShzdHJ1Y3QgcmVndWxhdG9yICpyZWd1bGF0b3IsIGludCBtaW5fdVYsIGludCBtYXhfdVYpCkBAIC0xNDkzLDcgKzE0OTIsOCBAQAogCW1vZGUgPSByZGV2LT5kZXNjLT5vcHMtPmdldF9vcHRpbXVtX21vZGUocmRldiwKIAkJCQkJCSBpbnB1dF91Viwgb3V0cHV0X3VWLAogCQkJCQkJIHRvdGFsX3VBX2xvYWQpOwotCWlmIChyZXQgPD0gMCkgeworCXJldCA9IHJlZ3VsYXRvcl9jaGVja19tb2RlKHJkZXYsIG1vZGUpOworCWlmIChyZXQgPCAwKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiJXM6IGZhaWxlZCB0byBnZXQgb3B0aW11bSBtb2RlIGZvciAlcyBAIgogCQkJIiAlZCB1QSAlZCAtPiAlZCB1VlxuIiwgX19mdW5jX18sIHJkZXYtPmRlc2MtPm5hbWUsCiAJCQl0b3RhbF91QV9sb2FkLCBpbnB1dF91Viwgb3V0cHV0X3VWKTsKQEAgLTE1MDEsNyArMTUwMSw3IEBACiAJfQogCiAJcmV0ID0gcmRldi0+ZGVzYy0+b3BzLT5zZXRfbW9kZShyZGV2LCBtb2RlKTsKLQlpZiAocmV0IDw9IDApIHsKKwlpZiAocmV0IDwgMCkgewogCQlwcmludGsoS0VSTl9FUlIgIiVzOiBmYWlsZWQgdG8gc2V0IG9wdGltdW0gbW9kZSAleCBmb3IgJXNcbiIsCiAJCQlfX2Z1bmNfXywgbW9kZSwgcmRldi0+ZGVzYy0+bmFtZSk7CiAJCWdvdG8gb3V0OwpAQCAtMTUxNiw3ICsxNTE2LDcgQEAKIC8qKgogICogcmVndWxhdG9yX3JlZ2lzdGVyX25vdGlmaWVyIC0gcmVnaXN0ZXIgcmVndWxhdG9yIGV2ZW50IG5vdGlmaWVyCiAgKiBAcmVndWxhdG9yOiByZWd1bGF0b3Igc291cmNlCi0gKiBAbm90aWZpZXJfYmxvY2s6IG5vdGlmaWVyIGJsb2NrCisgKiBAbmI6IG5vdGlmaWVyIGJsb2NrCiAgKgogICogUmVnaXN0ZXIgbm90aWZpZXIgYmxvY2sgdG8gcmVjZWl2ZSByZWd1bGF0b3IgZXZlbnRzLgogICovCkBAIC0xNTMxLDcgKzE1MzEsNyBAQAogLyoqCiAgKiByZWd1bGF0b3JfdW5yZWdpc3Rlcl9ub3RpZmllciAtIHVucmVnaXN0ZXIgcmVndWxhdG9yIGV2ZW50IG5vdGlmaWVyCiAgKiBAcmVndWxhdG9yOiByZWd1bGF0b3Igc291cmNlCi0gKiBAbm90aWZpZXJfYmxvY2s6IG5vdGlmaWVyIGJsb2NrCisgKiBAbmI6IG5vdGlmaWVyIGJsb2NrCiAgKgogICogVW5yZWdpc3RlciByZWd1bGF0b3IgZXZlbnQgbm90aWZpZXIgYmxvY2suCiAgKi8KQEAgLTE2OTcsOSArMTY5Nyw5IEBACiAKIC8qKgogICogcmVndWxhdG9yX25vdGlmaWVyX2NhbGxfY2hhaW4gLSBjYWxsIHJlZ3VsYXRvciBldmVudCBub3RpZmllcgotICogQHJlZ3VsYXRvcjogcmVndWxhdG9yIHNvdXJjZQorICogQHJkZXY6IHJlZ3VsYXRvciBzb3VyY2UKICAqIEBldmVudDogbm90aWZpZXIgYmxvY2sKLSAqIEBkYXRhOgorICogQGRhdGE6IGNhbGxiYWNrLXNwZWNpZmljIGRhdGEuCiAgKgogICogQ2FsbGVkIGJ5IHJlZ3VsYXRvciBkcml2ZXJzIHRvIG5vdGlmeSBjbGllbnRzIGEgcmVndWxhdG9yIGV2ZW50IGhhcwogICogb2NjdXJyZWQuIFdlIGFsc28gbm90aWZ5IHJlZ3VsYXRvciBjbGllbnRzIGRvd25zdHJlYW0uCkBAIC0xNzEzLDEwICsxNzEzLDEyMiBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwocmVndWxhdG9yX25vdGlmaWVyX2NhbGxfY2hhaW4pOwogCisvKgorICogVG8gYXZvaWQgY2x1dHRlcmluZyBzeXNmcyAoYW5kIG1lbW9yeSkgd2l0aCB1c2VsZXNzIHN0YXRlLCBvbmx5CisgKiBjcmVhdGUgYXR0cmlidXRlcyB0aGF0IGNhbiBiZSBtZWFuaW5nZnVsbHkgZGlzcGxheWVkLgorICovCitzdGF0aWMgaW50IGFkZF9yZWd1bGF0b3JfYXR0cmlidXRlcyhzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldikKK3sKKwlzdHJ1Y3QgZGV2aWNlCQkqZGV2ID0gJnJkZXYtPmRldjsKKwlzdHJ1Y3QgcmVndWxhdG9yX29wcwkqb3BzID0gcmRldi0+ZGVzYy0+b3BzOworCWludAkJCXN0YXR1cyA9IDA7CisKKwkvKiBzb21lIGF0dHJpYnV0ZXMgbmVlZCBzcGVjaWZpYyBtZXRob2RzIHRvIGJlIGRpc3BsYXllZCAqLworCWlmIChvcHMtPmdldF92b2x0YWdlKSB7CisJCXN0YXR1cyA9IGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl9taWNyb3ZvbHRzKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlyZXR1cm4gc3RhdHVzOworCX0KKwlpZiAob3BzLT5nZXRfY3VycmVudF9saW1pdCkgeworCQlzdGF0dXMgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfbWljcm9hbXBzKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlyZXR1cm4gc3RhdHVzOworCX0KKwlpZiAob3BzLT5nZXRfbW9kZSkgeworCQlzdGF0dXMgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfb3Btb2RlKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlyZXR1cm4gc3RhdHVzOworCX0KKwlpZiAob3BzLT5pc19lbmFibGVkKSB7CisJCXN0YXR1cyA9IGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl9zdGF0ZSk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJcmV0dXJuIHN0YXR1czsKKwl9CisKKwkvKiBzb21lIGF0dHJpYnV0ZXMgYXJlIHR5cGUtc3BlY2lmaWMgKi8KKwlpZiAocmRldi0+ZGVzYy0+dHlwZSA9PSBSRUdVTEFUT1JfQ1VSUkVOVCkgeworCQlzdGF0dXMgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfcmVxdWVzdGVkX21pY3JvYW1wcyk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJcmV0dXJuIHN0YXR1czsKKwl9CisKKwkvKiBhbGwgdGhlIG90aGVyIGF0dHJpYnV0ZXMgZXhpc3QgdG8gc3VwcG9ydCBjb25zdHJhaW50czsKKwkgKiBkb24ndCBzaG93IHRoZW0gaWYgdGhlcmUgYXJlIG5vIGNvbnN0cmFpbnRzLCBvciBpZiB0aGUKKwkgKiByZWxldmFudCBzdXBwb3J0aW5nIG1ldGhvZHMgYXJlIG1pc3NpbmcuCisJICovCisJaWYgKCFyZGV2LT5jb25zdHJhaW50cykKKwkJcmV0dXJuIHN0YXR1czsKKworCS8qIGNvbnN0cmFpbnRzIG5lZWQgc3BlY2lmaWMgc3VwcG9ydGluZyBtZXRob2RzICovCisJaWYgKG9wcy0+c2V0X3ZvbHRhZ2UpIHsKKwkJc3RhdHVzID0gZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJmRldl9hdHRyX21pbl9taWNyb3ZvbHRzKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlyZXR1cm4gc3RhdHVzOworCQlzdGF0dXMgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfbWF4X21pY3Jvdm9sdHMpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCXJldHVybiBzdGF0dXM7CisJfQorCWlmIChvcHMtPnNldF9jdXJyZW50X2xpbWl0KSB7CisJCXN0YXR1cyA9IGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl9taW5fbWljcm9hbXBzKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlyZXR1cm4gc3RhdHVzOworCQlzdGF0dXMgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfbWF4X21pY3JvYW1wcyk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJcmV0dXJuIHN0YXR1czsKKwl9CisKKwkvKiBzdXNwZW5kIG1vZGUgY29uc3RyYWludHMgbmVlZCBtdWx0aXBsZSBzdXBwb3J0aW5nIG1ldGhvZHMgKi8KKwlpZiAoIShvcHMtPnNldF9zdXNwZW5kX2VuYWJsZSAmJiBvcHMtPnNldF9zdXNwZW5kX2Rpc2FibGUpKQorCQlyZXR1cm4gc3RhdHVzOworCisJc3RhdHVzID0gZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJmRldl9hdHRyX3N1c3BlbmRfc3RhbmRieV9zdGF0ZSk7CisJaWYgKHN0YXR1cyA8IDApCisJCXJldHVybiBzdGF0dXM7CisJc3RhdHVzID0gZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJmRldl9hdHRyX3N1c3BlbmRfbWVtX3N0YXRlKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJcmV0dXJuIHN0YXR1czsKKwlzdGF0dXMgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfc3VzcGVuZF9kaXNrX3N0YXRlKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJcmV0dXJuIHN0YXR1czsKKworCWlmIChvcHMtPnNldF9zdXNwZW5kX3ZvbHRhZ2UpIHsKKwkJc3RhdHVzID0gZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwKKwkJCQkmZGV2X2F0dHJfc3VzcGVuZF9zdGFuZGJ5X21pY3Jvdm9sdHMpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCXJldHVybiBzdGF0dXM7CisJCXN0YXR1cyA9IGRldmljZV9jcmVhdGVfZmlsZShkZXYsCisJCQkJJmRldl9hdHRyX3N1c3BlbmRfbWVtX21pY3Jvdm9sdHMpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCXJldHVybiBzdGF0dXM7CisJCXN0YXR1cyA9IGRldmljZV9jcmVhdGVfZmlsZShkZXYsCisJCQkJJmRldl9hdHRyX3N1c3BlbmRfZGlza19taWNyb3ZvbHRzKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlyZXR1cm4gc3RhdHVzOworCX0KKworCWlmIChvcHMtPnNldF9zdXNwZW5kX21vZGUpIHsKKwkJc3RhdHVzID0gZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwKKwkJCQkmZGV2X2F0dHJfc3VzcGVuZF9zdGFuZGJ5X21vZGUpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCXJldHVybiBzdGF0dXM7CisJCXN0YXR1cyA9IGRldmljZV9jcmVhdGVfZmlsZShkZXYsCisJCQkJJmRldl9hdHRyX3N1c3BlbmRfbWVtX21vZGUpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCXJldHVybiBzdGF0dXM7CisJCXN0YXR1cyA9IGRldmljZV9jcmVhdGVfZmlsZShkZXYsCisJCQkJJmRldl9hdHRyX3N1c3BlbmRfZGlza19tb2RlKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlyZXR1cm4gc3RhdHVzOworCX0KKworCXJldHVybiBzdGF0dXM7Cit9CisKIC8qKgogICogcmVndWxhdG9yX3JlZ2lzdGVyIC0gcmVnaXN0ZXIgcmVndWxhdG9yCi0gKiBAcmVndWxhdG9yOiByZWd1bGF0b3Igc291cmNlCi0gKiBAcmVnX2RhdGE6IHByaXZhdGUgcmVndWxhdG9yIGRhdGEKKyAqIEByZWd1bGF0b3JfZGVzYzogcmVndWxhdG9yIHRvIHJlZ2lzdGVyCisgKiBAZGV2OiBzdHJ1Y3QgZGV2aWNlIGZvciB0aGUgcmVndWxhdG9yCisgKiBAZHJpdmVyX2RhdGE6IHByaXZhdGUgcmVndWxhdG9yIGRhdGEKICAqCiAgKiBDYWxsZWQgYnkgcmVndWxhdG9yIGRyaXZlcnMgdG8gcmVnaXN0ZXIgYSByZWd1bGF0b3IuCiAgKiBSZXR1cm5zIDAgb24gc3VjY2Vzcy4KQEAgLTE3NjEsNDUgKzE4NzMsMzcgQEAKIAkvKiBwcmVmb3JtIGFueSByZWd1bGF0b3Igc3BlY2lmaWMgaW5pdCAqLwogCWlmIChpbml0X2RhdGEtPnJlZ3VsYXRvcl9pbml0KSB7CiAJCXJldCA9IGluaXRfZGF0YS0+cmVndWxhdG9yX2luaXQocmRldi0+cmVnX2RhdGEpOwotCQlpZiAocmV0IDwgMCkgewotCQkJa2ZyZWUocmRldik7Ci0JCQlyZGV2ID0gRVJSX1BUUihyZXQpOwotCQkJZ290byBvdXQ7Ci0JCX0KLQl9Ci0KLQkvKiBzZXQgcmVndWxhdG9yIGNvbnN0cmFpbnRzICovCi0JcmV0ID0gc2V0X21hY2hpbmVfY29uc3RyYWludHMocmRldiwgJmluaXRfZGF0YS0+Y29uc3RyYWludHMpOwotCWlmIChyZXQgPCAwKSB7Ci0JCWtmcmVlKHJkZXYpOwotCQlyZGV2ID0gRVJSX1BUUihyZXQpOwotCQlnb3RvIG91dDsKKwkJaWYgKHJldCA8IDApCisJCQlnb3RvIGNsZWFuOwogCX0KIAogCS8qIHJlZ2lzdGVyIHdpdGggc3lzZnMgKi8KIAlyZGV2LT5kZXYuY2xhc3MgPSAmcmVndWxhdG9yX2NsYXNzOwogCXJkZXYtPmRldi5wYXJlbnQgPSBkZXY7Ci0Jc25wcmludGYocmRldi0+ZGV2LmJ1c19pZCwgc2l6ZW9mKHJkZXYtPmRldi5idXNfaWQpLAotCQkgInJlZ3VsYXRvci4lZCIsIGF0b21pY19pbmNfcmV0dXJuKCZyZWd1bGF0b3Jfbm8pIC0gMSk7CisJZGV2X3NldF9uYW1lKCZyZGV2LT5kZXYsICJyZWd1bGF0b3IuJWQiLAorCQkgICAgIGF0b21pY19pbmNfcmV0dXJuKCZyZWd1bGF0b3Jfbm8pIC0gMSk7CiAJcmV0ID0gZGV2aWNlX3JlZ2lzdGVyKCZyZGV2LT5kZXYpOwotCWlmIChyZXQgIT0gMCkgewotCQlrZnJlZShyZGV2KTsKLQkJcmRldiA9IEVSUl9QVFIocmV0KTsKLQkJZ290byBvdXQ7Ci0JfQorCWlmIChyZXQgIT0gMCkKKwkJZ290byBjbGVhbjsKIAogCWRldl9zZXRfZHJ2ZGF0YSgmcmRldi0+ZGV2LCByZGV2KTsKIAorCS8qIHNldCByZWd1bGF0b3IgY29uc3RyYWludHMgKi8KKwlyZXQgPSBzZXRfbWFjaGluZV9jb25zdHJhaW50cyhyZGV2LCAmaW5pdF9kYXRhLT5jb25zdHJhaW50cyk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gc2NydWI7CisKKwkvKiBhZGQgYXR0cmlidXRlcyBzdXBwb3J0ZWQgYnkgdGhpcyByZWd1bGF0b3IgKi8KKwlyZXQgPSBhZGRfcmVndWxhdG9yX2F0dHJpYnV0ZXMocmRldik7CisJaWYgKHJldCA8IDApCisJCWdvdG8gc2NydWI7CisKIAkvKiBzZXQgc3VwcGx5IHJlZ3VsYXRvciBpZiBpdCBleGlzdHMgKi8KIAlpZiAoaW5pdF9kYXRhLT5zdXBwbHlfcmVndWxhdG9yX2RldikgewogCQlyZXQgPSBzZXRfc3VwcGx5KHJkZXYsCiAJCQlkZXZfZ2V0X2RydmRhdGEoaW5pdF9kYXRhLT5zdXBwbHlfcmVndWxhdG9yX2RldikpOwotCQlpZiAocmV0IDwgMCkgewotCQkJZGV2aWNlX3VucmVnaXN0ZXIoJnJkZXYtPmRldik7Ci0JCQlrZnJlZShyZGV2KTsKLQkJCXJkZXYgPSBFUlJfUFRSKHJldCk7Ci0JCQlnb3RvIG91dDsKLQkJfQorCQlpZiAocmV0IDwgMCkKKwkJCWdvdG8gc2NydWI7CiAJfQogCiAJLyogYWRkIGNvbnN1bWVycyBkZXZpY2VzICovCkBAIC0xODExLDEwICsxOTE1LDcgQEAKIAkJCWZvciAoLS1pOyBpID49IDA7IGktLSkKIAkJCQl1bnNldF9jb25zdW1lcl9kZXZpY2Vfc3VwcGx5KHJkZXYsCiAJCQkJCWluaXRfZGF0YS0+Y29uc3VtZXJfc3VwcGxpZXNbaV0uZGV2KTsKLQkJCWRldmljZV91bnJlZ2lzdGVyKCZyZGV2LT5kZXYpOwotCQkJa2ZyZWUocmRldik7Ci0JCQlyZGV2ID0gRVJSX1BUUihyZXQpOwotCQkJZ290byBvdXQ7CisJCQlnb3RvIHNjcnViOwogCQl9CiAJfQogCkBAIC0xODIyLDEyICsxOTIzLDE5IEBACiBvdXQ6CiAJbXV0ZXhfdW5sb2NrKCZyZWd1bGF0b3JfbGlzdF9tdXRleCk7CiAJcmV0dXJuIHJkZXY7CisKK3NjcnViOgorCWRldmljZV91bnJlZ2lzdGVyKCZyZGV2LT5kZXYpOworY2xlYW46CisJa2ZyZWUocmRldik7CisJcmRldiA9IEVSUl9QVFIocmV0KTsKKwlnb3RvIG91dDsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHJlZ3VsYXRvcl9yZWdpc3Rlcik7CiAKIC8qKgogICogcmVndWxhdG9yX3VucmVnaXN0ZXIgLSB1bnJlZ2lzdGVyIHJlZ3VsYXRvcgotICogQHJlZ3VsYXRvcjogcmVndWxhdG9yIHNvdXJjZQorICogQHJkZXY6IHJlZ3VsYXRvciB0byB1bnJlZ2lzdGVyCiAgKgogICogQ2FsbGVkIGJ5IHJlZ3VsYXRvciBkcml2ZXJzIHRvIHVucmVnaXN0ZXIgYSByZWd1bGF0b3IuCiAgKi8KQEAgLTE4NDYsNyArMTk1NCw3IEBACiBFWFBPUlRfU1lNQk9MX0dQTChyZWd1bGF0b3JfdW5yZWdpc3Rlcik7CiAKIC8qKgotICogcmVndWxhdG9yX3N1c3BlbmRfcHJlcGFyZTogcHJlcGFyZSByZWd1bGF0b3JzIGZvciBzeXN0ZW0gd2lkZSBzdXNwZW5kCisgKiByZWd1bGF0b3Jfc3VzcGVuZF9wcmVwYXJlIC0gcHJlcGFyZSByZWd1bGF0b3JzIGZvciBzeXN0ZW0gd2lkZSBzdXNwZW5kCiAgKiBAc3RhdGU6IHN5c3RlbSBzdXNwZW5kIHN0YXRlCiAgKgogICogQ29uZmlndXJlIGVhY2ggcmVndWxhdG9yIHdpdGggaXQncyBzdXNwZW5kIG9wZXJhdGluZyBwYXJhbWV0ZXJzIGZvciBzdGF0ZS4KQEAgLTE4ODIsNyArMTk5MCw3IEBACiAKIC8qKgogICogcmRldl9nZXRfZHJ2ZGF0YSAtIGdldCByZGV2IHJlZ3VsYXRvciBkcml2ZXIgZGF0YQotICogQHJlZ3VsYXRvcjogcmVndWxhdG9yCisgKiBAcmRldjogcmVndWxhdG9yCiAgKgogICogR2V0IHJkZXYgcmVndWxhdG9yIGRyaXZlciBwcml2YXRlIGRhdGEuIFRoaXMgY2FsbCBjYW4gYmUgdXNlZCBpbiB0aGUKICAqIHJlZ3VsYXRvciBkcml2ZXIgY29udGV4dC4KQEAgLTE5MTksNyArMjAyNyw3IEBACiAKIC8qKgogICogcmVndWxhdG9yX2dldF9pZCAtIGdldCByZWd1bGF0b3IgSUQKLSAqIEByZWd1bGF0b3I6IHJlZ3VsYXRvcgorICogQHJkZXY6IHJlZ3VsYXRvcgogICovCiBpbnQgcmRldl9nZXRfaWQoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYpCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlZ3VsYXRvci9kYTkwM3guYyBiL2RyaXZlcnMvcmVndWxhdG9yL2RhOTAzeC5jCmluZGV4IDc3M2IyOWMuLmZlNzc3MzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcmVndWxhdG9yL2RhOTAzeC5jCisrKyBiL2RyaXZlcnMvcmVndWxhdG9yL2RhOTAzeC5jCkBAIC0xMDIsNyArMTAyLDcgQEAKIAl1aW50OF90IHZhbCwgbWFzazsKIAogCWlmIChjaGVja19yYW5nZShpbmZvLCBtaW5fdVYsIG1heF91VikpIHsKLQkJcHJfZXJyKCJpbnZhbGlkIHZvbHRhZ2UgcmFuZ2UgKCVkLCAlZCkgdVYiLCBtaW5fdVYsIG1heF91Vik7CisJCXByX2VycigiaW52YWxpZCB2b2x0YWdlIHJhbmdlICglZCwgJWQpIHVWXG4iLCBtaW5fdVYsIG1heF91Vik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtMTU5LDcgKzE1OSw3IEBACiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAotCXJldHVybiByZWdfdmFsICYgKDEgPDwgaW5mby0+ZW5hYmxlX2JpdCk7CisJcmV0dXJuICEhKHJlZ192YWwgJiAoMSA8PCBpbmZvLT5lbmFibGVfYml0KSk7CiB9CiAKIC8qIERBOTAzMCBzcGVjaWZpYyBvcGVyYXRpb25zICovCkBAIC0xNzIsNyArMTcyLDcgQEAKIAlpbnQgcmV0OwogCiAJaWYgKGNoZWNrX3JhbmdlKGluZm8sIG1pbl91ViwgbWF4X3VWKSkgewotCQlwcl9lcnIoImludmFsaWQgdm9sdGFnZSByYW5nZSAoJWQsICVkKSB1ViIsIG1pbl91ViwgbWF4X3VWKTsKKwkJcHJfZXJyKCJpbnZhbGlkIHZvbHRhZ2UgcmFuZ2UgKCVkLCAlZCkgdVZcbiIsIG1pbl91ViwgbWF4X3VWKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC0xOTksNyArMTk5LDcgQEAKIAlpbnQgdGhyZXNoOwogCiAJaWYgKGNoZWNrX3JhbmdlKGluZm8sIG1pbl91ViwgbWF4X3VWKSkgewotCQlwcl9lcnIoImludmFsaWQgdm9sdGFnZSByYW5nZSAoJWQsICVkKSB1ViIsIG1pbl91ViwgbWF4X3VWKTsKKwkJcHJfZXJyKCJpbnZhbGlkIHZvbHRhZ2UgcmFuZ2UgKCVkLCAlZCkgdVZcbiIsIG1pbl91ViwgbWF4X3VWKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC0yNDgsNyArMjQ4LDcgQEAKIAlpbnQgcmV0OwogCiAJaWYgKGNoZWNrX3JhbmdlKGluZm8sIG1pbl91ViwgbWF4X3VWKSkgewotCQlwcl9lcnIoImludmFsaWQgdm9sdGFnZSByYW5nZSAoJWQsICVkKSB1ViIsIG1pbl91ViwgbWF4X3VWKTsKKwkJcHJfZXJyKCJpbnZhbGlkIHZvbHRhZ2UgcmFuZ2UgKCVkLCAlZCkgdVZcbiIsIG1pbl91ViwgbWF4X3VWKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC0yNzMsNyArMjczLDcgQEAKIAl1aW50OF90IHZhbCwgbWFzazsKIAogCWlmIChjaGVja19yYW5nZShpbmZvLCBtaW5fdVYsIG1heF91VikpIHsKLQkJcHJfZXJyKCJpbnZhbGlkIHZvbHRhZ2UgcmFuZ2UgKCVkLCAlZCkgdVYiLCBtaW5fdVYsIG1heF91Vik7CisJCXByX2VycigiaW52YWxpZCB2b2x0YWdlIHJhbmdlICglZCwgJWQpIHVWXG4iLCBtaW5fdVYsIG1heF91Vik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZWd1bGF0b3IvcGNmNTA2MzMtcmVndWxhdG9yLmMgYi9kcml2ZXJzL3JlZ3VsYXRvci9wY2Y1MDYzMy1yZWd1bGF0b3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Y2M4NWVjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9yZWd1bGF0b3IvcGNmNTA2MzMtcmVndWxhdG9yLmMKQEAgLTAsMCArMSwzMjkgQEAKKy8qIE5YUCBQQ0Y1MDYzMyBQTUlDIERyaXZlcgorICoKKyAqIChDKSAyMDA2LTIwMDggYnkgT3Blbm1va28sIEluYy4KKyAqIEF1dGhvcjogQmFsYWppIFJhbyA8YmFsYWppcnJhb0BvcGVubW9rby5vcmc+CisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIEJyb2tlbiBkb3duIGZyb20gbW9uc3Ryb3VzIFBDRjUwNjMzIGRyaXZlciBtYWlubHkgYnkKKyAqIEhhcmFsZCBXZWx0ZSBhbmQgQW5keSBHcmVlbiBhbmQgV2VybmVyIEFsbWVzYmVyZ2VyCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAorICogIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgorICogIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisKKyNpbmNsdWRlIDxsaW51eC9tZmQvcGNmNTA2MzMvY29yZS5oPgorI2luY2x1ZGUgPGxpbnV4L21mZC9wY2Y1MDYzMy9wbWljLmg+CisKKyNkZWZpbmUgUENGNTA2MzNfUkVHVUxBVE9SKF9uYW1lLCBfaWQpIAkJXAorCXsJCQkJCVwKKwkJLm5hbWUgPSBfbmFtZSwgCQkJXAorCQkuaWQgPSBfaWQsCQkJXAorCQkub3BzID0gJnBjZjUwNjMzX3JlZ3VsYXRvcl9vcHMsCVwKKwkJLnR5cGUgPSBSRUdVTEFUT1JfVk9MVEFHRSwgCVwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsIAkJXAorCX0KKworc3RhdGljIGNvbnN0IHU4IHBjZjUwNjMzX3JlZ3VsYXRvcl9yZWdpc3RlcnNbUENGNTA2MzNfTlVNX1JFR1VMQVRPUlNdID0geworCVtQQ0Y1MDYzM19SRUdVTEFUT1JfQVVUT10JPSBQQ0Y1MDYzM19SRUdfQVVUT09VVCwKKwlbUENGNTA2MzNfUkVHVUxBVE9SX0RPV04xXQk9IFBDRjUwNjMzX1JFR19ET1dOMU9VVCwKKwlbUENGNTA2MzNfUkVHVUxBVE9SX0RPV04yXQk9IFBDRjUwNjMzX1JFR19ET1dOMk9VVCwKKwlbUENGNTA2MzNfUkVHVUxBVE9SX01FTUxET10JPSBQQ0Y1MDYzM19SRUdfTUVNTERPT1VULAorCVtQQ0Y1MDYzM19SRUdVTEFUT1JfTERPMV0JPSBQQ0Y1MDYzM19SRUdfTERPMU9VVCwKKwlbUENGNTA2MzNfUkVHVUxBVE9SX0xETzJdCT0gUENGNTA2MzNfUkVHX0xETzJPVVQsCisJW1BDRjUwNjMzX1JFR1VMQVRPUl9MRE8zXQk9IFBDRjUwNjMzX1JFR19MRE8zT1VULAorCVtQQ0Y1MDYzM19SRUdVTEFUT1JfTERPNF0JPSBQQ0Y1MDYzM19SRUdfTERPNE9VVCwKKwlbUENGNTA2MzNfUkVHVUxBVE9SX0xETzVdCT0gUENGNTA2MzNfUkVHX0xETzVPVVQsCisJW1BDRjUwNjMzX1JFR1VMQVRPUl9MRE82XQk9IFBDRjUwNjMzX1JFR19MRE82T1VULAorCVtQQ0Y1MDYzM19SRUdVTEFUT1JfSENMRE9dCT0gUENGNTA2MzNfUkVHX0hDTERPT1VULAorfTsKKworLyogQml0cyBmcm9tIHZvbHRhZ2UgdmFsdWUgKi8KK3N0YXRpYyB1OCBhdXRvX3ZvbHRhZ2VfYml0cyh1bnNpZ25lZCBpbnQgbWlsbGl2b2x0cykKK3sKKwlpZiAobWlsbGl2b2x0cyA8IDE4MDApCisJCXJldHVybiAwOworCWlmIChtaWxsaXZvbHRzID4gMzgwMCkKKwkJcmV0dXJuIDB4ZmY7CisKKwltaWxsaXZvbHRzIC09IDYyNTsKKworCXJldHVybiBtaWxsaXZvbHRzIC8gMjU7Cit9CisKK3N0YXRpYyB1OCBkb3duX3ZvbHRhZ2VfYml0cyh1bnNpZ25lZCBpbnQgbWlsbGl2b2x0cykKK3sKKwlpZiAobWlsbGl2b2x0cyA8IDYyNSkKKwkJcmV0dXJuIDA7CisJZWxzZSBpZiAobWlsbGl2b2x0cyA+IDMwMDApCisJCXJldHVybiAweGZmOworCisJbWlsbGl2b2x0cyAtPSA2MjU7CisKKwlyZXR1cm4gbWlsbGl2b2x0cyAvIDI1OworfQorCitzdGF0aWMgdTggbGRvX3ZvbHRhZ2VfYml0cyh1bnNpZ25lZCBpbnQgbWlsbGl2b2x0cykKK3sKKwlpZiAobWlsbGl2b2x0cyA8IDkwMCkKKwkJcmV0dXJuIDA7CisJZWxzZSBpZiAobWlsbGl2b2x0cyA+IDM2MDApCisJCXJldHVybiAweDFmOworCisJbWlsbGl2b2x0cyAtPSA5MDA7CisJcmV0dXJuIG1pbGxpdm9sdHMgLyAxMDA7Cit9CisKKy8qIE9idGFpbiB2b2x0YWdlIHZhbHVlIGZyb20gYml0cyAqLworc3RhdGljIHVuc2lnbmVkIGludCBhdXRvX3ZvbHRhZ2VfdmFsdWUodTggYml0cykKK3sKKwlpZiAoYml0cyA8IDB4MmYpCisJCXJldHVybiAwOworCisJcmV0dXJuIDYyNSArIChiaXRzICogMjUpOworfQorCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZG93bl92b2x0YWdlX3ZhbHVlKHU4IGJpdHMpCit7CisJcmV0dXJuIDYyNSArIChiaXRzICogMjUpOworfQorCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbGRvX3ZvbHRhZ2VfdmFsdWUodTggYml0cykKK3sKKwliaXRzICY9IDB4MWY7CisKKwlyZXR1cm4gOTAwICsgKGJpdHMgKiAxMDApOworfQorCitzdGF0aWMgaW50IHBjZjUwNjMzX3JlZ3VsYXRvcl9zZXRfdm9sdGFnZShzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldiwKKwkJCQkJCWludCBtaW5fdVYsIGludCBtYXhfdVYpCit7CisJc3RydWN0IHBjZjUwNjMzICpwY2Y7CisJaW50IHJlZ3VsYXRvcl9pZCwgbWlsbGl2b2x0czsKKwl1OCB2b2x0X2JpdHMsIHJlZ25yOworCisJcGNmID0gcmRldl9nZXRfZHJ2ZGF0YShyZGV2KTsKKworCXJlZ3VsYXRvcl9pZCA9IHJkZXZfZ2V0X2lkKHJkZXYpOworCWlmIChyZWd1bGF0b3JfaWQgPj0gUENGNTA2MzNfTlVNX1JFR1VMQVRPUlMpCisJCXJldHVybiAtRUlOVkFMOworCisJbWlsbGl2b2x0cyA9IG1pbl91ViAvIDEwMDA7CisKKwlyZWduciA9IHBjZjUwNjMzX3JlZ3VsYXRvcl9yZWdpc3RlcnNbcmVndWxhdG9yX2lkXTsKKworCXN3aXRjaCAocmVndWxhdG9yX2lkKSB7CisJY2FzZSBQQ0Y1MDYzM19SRUdVTEFUT1JfQVVUTzoKKwkJdm9sdF9iaXRzID0gYXV0b192b2x0YWdlX2JpdHMobWlsbGl2b2x0cyk7CisJCWJyZWFrOworCWNhc2UgUENGNTA2MzNfUkVHVUxBVE9SX0RPV04xOgorCQl2b2x0X2JpdHMgPSBkb3duX3ZvbHRhZ2VfYml0cyhtaWxsaXZvbHRzKTsKKwkJYnJlYWs7CisJY2FzZSBQQ0Y1MDYzM19SRUdVTEFUT1JfRE9XTjI6CisJCXZvbHRfYml0cyA9IGRvd25fdm9sdGFnZV9iaXRzKG1pbGxpdm9sdHMpOworCQlicmVhazsKKwljYXNlIFBDRjUwNjMzX1JFR1VMQVRPUl9MRE8xOgorCWNhc2UgUENGNTA2MzNfUkVHVUxBVE9SX0xETzI6CisJY2FzZSBQQ0Y1MDYzM19SRUdVTEFUT1JfTERPMzoKKwljYXNlIFBDRjUwNjMzX1JFR1VMQVRPUl9MRE80OgorCWNhc2UgUENGNTA2MzNfUkVHVUxBVE9SX0xETzU6CisJY2FzZSBQQ0Y1MDYzM19SRUdVTEFUT1JfTERPNjoKKwljYXNlIFBDRjUwNjMzX1JFR1VMQVRPUl9IQ0xETzoKKwkJdm9sdF9iaXRzID0gbGRvX3ZvbHRhZ2VfYml0cyhtaWxsaXZvbHRzKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIHBjZjUwNjMzX3JlZ193cml0ZShwY2YsIHJlZ25yLCB2b2x0X2JpdHMpOworfQorCitzdGF0aWMgaW50IHBjZjUwNjMzX3JlZ3VsYXRvcl9nZXRfdm9sdGFnZShzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldikKK3sKKwlzdHJ1Y3QgcGNmNTA2MzMgKnBjZjsKKwlpbnQgcmVndWxhdG9yX2lkLCBtaWxsaXZvbHRzLCB2b2x0X2JpdHM7CisJdTggcmVnbnI7CisKKwlwY2YgPSByZGV2X2dldF9kcnZkYXRhKHJkZXYpOzsKKworCXJlZ3VsYXRvcl9pZCA9IHJkZXZfZ2V0X2lkKHJkZXYpOworCWlmIChyZWd1bGF0b3JfaWQgPj0gUENGNTA2MzNfTlVNX1JFR1VMQVRPUlMpCisJCXJldHVybiAtRUlOVkFMOworCisJcmVnbnIgPSBwY2Y1MDYzM19yZWd1bGF0b3JfcmVnaXN0ZXJzW3JlZ3VsYXRvcl9pZF07CisKKwl2b2x0X2JpdHMgPSBwY2Y1MDYzM19yZWdfcmVhZChwY2YsIHJlZ25yKTsKKwlpZiAodm9sdF9iaXRzIDwgMCkKKwkJcmV0dXJuIC0xOworCisJc3dpdGNoIChyZWd1bGF0b3JfaWQpIHsKKwljYXNlIFBDRjUwNjMzX1JFR1VMQVRPUl9BVVRPOgorCQltaWxsaXZvbHRzID0gYXV0b192b2x0YWdlX3ZhbHVlKHZvbHRfYml0cyk7CisJCWJyZWFrOworCWNhc2UgUENGNTA2MzNfUkVHVUxBVE9SX0RPV04xOgorCQltaWxsaXZvbHRzID0gZG93bl92b2x0YWdlX3ZhbHVlKHZvbHRfYml0cyk7CisJCWJyZWFrOworCWNhc2UgUENGNTA2MzNfUkVHVUxBVE9SX0RPV04yOgorCQltaWxsaXZvbHRzID0gZG93bl92b2x0YWdlX3ZhbHVlKHZvbHRfYml0cyk7CisJCWJyZWFrOworCWNhc2UgUENGNTA2MzNfUkVHVUxBVE9SX0xETzE6CisJY2FzZSBQQ0Y1MDYzM19SRUdVTEFUT1JfTERPMjoKKwljYXNlIFBDRjUwNjMzX1JFR1VMQVRPUl9MRE8zOgorCWNhc2UgUENGNTA2MzNfUkVHVUxBVE9SX0xETzQ6CisJY2FzZSBQQ0Y1MDYzM19SRUdVTEFUT1JfTERPNToKKwljYXNlIFBDRjUwNjMzX1JFR1VMQVRPUl9MRE82OgorCWNhc2UgUENGNTA2MzNfUkVHVUxBVE9SX0hDTERPOgorCQltaWxsaXZvbHRzID0gbGRvX3ZvbHRhZ2VfdmFsdWUodm9sdF9iaXRzKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIG1pbGxpdm9sdHMgKiAxMDAwOworfQorCitzdGF0aWMgaW50IHBjZjUwNjMzX3JlZ3VsYXRvcl9lbmFibGUoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYpCit7CisJc3RydWN0IHBjZjUwNjMzICpwY2YgPSByZGV2X2dldF9kcnZkYXRhKHJkZXYpOworCWludCByZWd1bGF0b3JfaWQ7CisJdTggcmVnbnI7CisKKwlyZWd1bGF0b3JfaWQgPSByZGV2X2dldF9pZChyZGV2KTsKKwlpZiAocmVndWxhdG9yX2lkID49IFBDRjUwNjMzX05VTV9SRUdVTEFUT1JTKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIFRoZSAqRU5BIHJlZ2lzdGVyIGlzIGFsd2F5cyBvbmUgYWZ0ZXIgdGhlICpPVVQgcmVnaXN0ZXIgKi8KKwlyZWduciA9IHBjZjUwNjMzX3JlZ3VsYXRvcl9yZWdpc3RlcnNbcmVndWxhdG9yX2lkXSArIDE7CisKKwlyZXR1cm4gcGNmNTA2MzNfcmVnX3NldF9iaXRfbWFzayhwY2YsIHJlZ25yLCBQQ0Y1MDYzM19SRUdVTEFUT1JfT04sCisJCQkJCQkgICAgICAgUENGNTA2MzNfUkVHVUxBVE9SX09OKTsKK30KKworc3RhdGljIGludCBwY2Y1MDYzM19yZWd1bGF0b3JfZGlzYWJsZShzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldikKK3sKKwlzdHJ1Y3QgcGNmNTA2MzMgKnBjZiA9IHJkZXZfZ2V0X2RydmRhdGEocmRldik7CisJaW50IHJlZ3VsYXRvcl9pZDsKKwl1OCByZWducjsKKworCXJlZ3VsYXRvcl9pZCA9IHJkZXZfZ2V0X2lkKHJkZXYpOworCWlmIChyZWd1bGF0b3JfaWQgPj0gUENGNTA2MzNfTlVNX1JFR1VMQVRPUlMpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogdGhlICpFTkEgcmVnaXN0ZXIgaXMgYWx3YXlzIG9uZSBhZnRlciB0aGUgKk9VVCByZWdpc3RlciAqLworCXJlZ25yID0gcGNmNTA2MzNfcmVndWxhdG9yX3JlZ2lzdGVyc1tyZWd1bGF0b3JfaWRdICsgMTsKKworCXJldHVybiBwY2Y1MDYzM19yZWdfc2V0X2JpdF9tYXNrKHBjZiwgcmVnbnIsCisJCQkJCVBDRjUwNjMzX1JFR1VMQVRPUl9PTiwgMCk7Cit9CisKK3N0YXRpYyBpbnQgcGNmNTA2MzNfcmVndWxhdG9yX2lzX2VuYWJsZWQoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYpCit7CisJc3RydWN0IHBjZjUwNjMzICpwY2YgPSByZGV2X2dldF9kcnZkYXRhKHJkZXYpOworCWludCByZWd1bGF0b3JfaWQgPSByZGV2X2dldF9pZChyZGV2KTsKKwl1OCByZWducjsKKworCXJlZ3VsYXRvcl9pZCA9IHJkZXZfZ2V0X2lkKHJkZXYpOworCWlmIChyZWd1bGF0b3JfaWQgPj0gUENGNTA2MzNfTlVNX1JFR1VMQVRPUlMpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogdGhlICpFTkEgcmVnaXN0ZXIgaXMgYWx3YXlzIG9uZSBhZnRlciB0aGUgKk9VVCByZWdpc3RlciAqLworCXJlZ25yID0gcGNmNTA2MzNfcmVndWxhdG9yX3JlZ2lzdGVyc1tyZWd1bGF0b3JfaWRdICsgMTsKKworCXJldHVybiBwY2Y1MDYzM19yZWdfcmVhZChwY2YsIHJlZ25yKSAmIFBDRjUwNjMzX1JFR1VMQVRPUl9PTjsKK30KKworc3RhdGljIHN0cnVjdCByZWd1bGF0b3Jfb3BzIHBjZjUwNjMzX3JlZ3VsYXRvcl9vcHMgPSB7CisJLnNldF92b2x0YWdlID0gcGNmNTA2MzNfcmVndWxhdG9yX3NldF92b2x0YWdlLAorCS5nZXRfdm9sdGFnZSA9IHBjZjUwNjMzX3JlZ3VsYXRvcl9nZXRfdm9sdGFnZSwKKwkuZW5hYmxlID0gcGNmNTA2MzNfcmVndWxhdG9yX2VuYWJsZSwKKwkuZGlzYWJsZSA9IHBjZjUwNjMzX3JlZ3VsYXRvcl9kaXNhYmxlLAorCS5pc19lbmFibGVkID0gcGNmNTA2MzNfcmVndWxhdG9yX2lzX2VuYWJsZWQsCit9OworCitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9kZXNjIHJlZ3VsYXRvcnNbXSA9IHsKKwlbUENGNTA2MzNfUkVHVUxBVE9SX0FVVE9dID0KKwkJUENGNTA2MzNfUkVHVUxBVE9SKCJhdXRvIiwgUENGNTA2MzNfUkVHVUxBVE9SX0FVVE8pLAorCVtQQ0Y1MDYzM19SRUdVTEFUT1JfRE9XTjFdID0KKwkJUENGNTA2MzNfUkVHVUxBVE9SKCJkb3duMSIsIFBDRjUwNjMzX1JFR1VMQVRPUl9ET1dOMSksCisJW1BDRjUwNjMzX1JFR1VMQVRPUl9ET1dOMl0gPQorCQlQQ0Y1MDYzM19SRUdVTEFUT1IoImRvd24yIiwgUENGNTA2MzNfUkVHVUxBVE9SX0RPV04yKSwKKwlbUENGNTA2MzNfUkVHVUxBVE9SX0xETzFdID0KKwkJUENGNTA2MzNfUkVHVUxBVE9SKCJsZG8xIiwgUENGNTA2MzNfUkVHVUxBVE9SX0xETzEpLAorCVtQQ0Y1MDYzM19SRUdVTEFUT1JfTERPMl0gPQorCQlQQ0Y1MDYzM19SRUdVTEFUT1IoImxkbzIiLCBQQ0Y1MDYzM19SRUdVTEFUT1JfTERPMiksCisJW1BDRjUwNjMzX1JFR1VMQVRPUl9MRE8zXSA9CisJCVBDRjUwNjMzX1JFR1VMQVRPUigibGRvMyIsIFBDRjUwNjMzX1JFR1VMQVRPUl9MRE8zKSwKKwlbUENGNTA2MzNfUkVHVUxBVE9SX0xETzRdID0KKwkJUENGNTA2MzNfUkVHVUxBVE9SKCJsZG80IiwgUENGNTA2MzNfUkVHVUxBVE9SX0xETzQpLAorCVtQQ0Y1MDYzM19SRUdVTEFUT1JfTERPNV0gPQorCQlQQ0Y1MDYzM19SRUdVTEFUT1IoImxkbzUiLCBQQ0Y1MDYzM19SRUdVTEFUT1JfTERPNSksCisJW1BDRjUwNjMzX1JFR1VMQVRPUl9MRE82XSA9CisJCVBDRjUwNjMzX1JFR1VMQVRPUigibGRvNiIsIFBDRjUwNjMzX1JFR1VMQVRPUl9MRE82KSwKKwlbUENGNTA2MzNfUkVHVUxBVE9SX0hDTERPXSA9CisJCVBDRjUwNjMzX1JFR1VMQVRPUigiaGNsZG8iLCBQQ0Y1MDYzM19SRUdVTEFUT1JfSENMRE8pLAorCVtQQ0Y1MDYzM19SRUdVTEFUT1JfTUVNTERPXSA9CisJCVBDRjUwNjMzX1JFR1VMQVRPUigibWVtbGRvIiwgUENGNTA2MzNfUkVHVUxBVE9SX01FTUxETyksCit9OworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBwY2Y1MDYzM19yZWd1bGF0b3JfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldjsKKwlzdHJ1Y3QgcGNmNTA2MzMgKnBjZjsKKworCS8qIEFscmVhZHkgc2V0IGJ5IGNvcmUgZHJpdmVyICovCisJcGNmID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwlyZGV2ID0gcmVndWxhdG9yX3JlZ2lzdGVyKCZyZWd1bGF0b3JzW3BkZXYtPmlkXSwgJnBkZXYtPmRldiwgcGNmKTsKKwlpZiAoSVNfRVJSKHJkZXYpKQorCQlyZXR1cm4gUFRSX0VSUihyZGV2KTsKKworCWlmIChwY2YtPnBkYXRhLT5yZWd1bGF0b3JfcmVnaXN0ZXJlZCkKKwkJcGNmLT5wZGF0YS0+cmVndWxhdG9yX3JlZ2lzdGVyZWQocGNmLCBwZGV2LT5pZCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgcGNmNTA2MzNfcmVndWxhdG9yX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwlyZWd1bGF0b3JfdW5yZWdpc3RlcihyZGV2KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBwY2Y1MDYzM19yZWd1bGF0b3JfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gInBjZjUwNjMzLXJlZ2x0ciIsCisJfSwKKwkucHJvYmUgPSBwY2Y1MDYzM19yZWd1bGF0b3JfcHJvYmUsCisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKHBjZjUwNjMzX3JlZ3VsYXRvcl9yZW1vdmUpLAorfTsKKworc3RhdGljIGludCBfX2luaXQgcGNmNTA2MzNfcmVndWxhdG9yX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZwY2Y1MDYzM19yZWd1bGF0b3JfZHJpdmVyKTsKK30KK21vZHVsZV9pbml0KHBjZjUwNjMzX3JlZ3VsYXRvcl9pbml0KTsKKworc3RhdGljIHZvaWQgX19leGl0IHBjZjUwNjMzX3JlZ3VsYXRvcl9leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnBjZjUwNjMzX3JlZ3VsYXRvcl9kcml2ZXIpOworfQorbW9kdWxlX2V4aXQocGNmNTA2MzNfcmVndWxhdG9yX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJCYWxhamkgUmFvIDxiYWxhamlycmFvQG9wZW5tb2tvLm9yZz4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiUENGNTA2MzMgcmVndWxhdG9yIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTpwY2Y1MDYzMy1yZWd1bGF0b3IiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmVndWxhdG9yL3dtODM1MC1yZWd1bGF0b3IuYyBiL2RyaXZlcnMvcmVndWxhdG9yL3dtODM1MC1yZWd1bGF0b3IuYwppbmRleCBjNjhjNDk2Li43YWEzNTI0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3JlZ3VsYXRvci93bTgzNTAtcmVndWxhdG9yLmMKKysrIGIvZHJpdmVycy9yZWd1bGF0b3Ivd204MzUwLXJlZ3VsYXRvci5jCkBAIC0xNDEyLDYgKzE0MTIsOTcgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHdtODM1MF9yZWdpc3Rlcl9yZWd1bGF0b3IpOwogCisvKioKKyAqIHdtODM1MF9yZWdpc3Rlcl9sZWQgLSBSZWdpc3RlciBhIFdNODM1MCBMRUQgb3V0cHV0CisgKgorICogQHBhcmFtIHdtODM1MCBUaGUgV004MzUwIGRldmljZSB0byBjb25maWd1cmUuCisgKiBAcGFyYW0gbGVkbnVtIExFRCBkZXZpY2UgaW5kZXggdG8gY3JlYXRlLgorICogQHBhcmFtIGRjZGMgVGhlIERDREMgdG8gdXNlIGZvciB0aGUgTEVELgorICogQHBhcmFtIGlzaW5rIFRoZSBJU0lOSyB0byB1c2UgZm9yIHRoZSBMRUQuCisgKiBAcGFyYW0gcGRhdGEgQ29uZmlndXJhdGlvbiBmb3IgdGhlIExFRC4KKyAqCisgKiBUaGUgV004MzUwIHN1cHBvcnRzIHRoZSB1c2Ugb2YgYW4gSVNJTksgdG9nZXRoZXIgd2l0aCBhIERDREMgdG8KKyAqIHByb3ZpZGUgYSBwb3dlci1lZmZpY2llbnQgTEVEIGRyaXZlci4gIFRoaXMgZnVuY3Rpb24gcmVnaXN0ZXJzIHRoZQorICogcmVndWxhdG9ycyBhbmQgaW5zdGFudGlhdGVzIHRoZSBwbGF0Zm9ybSBkZXZpY2UgZm9yIGEgTEVELiAgVGhlCisgKiBvcGVyYXRpbmcgbW9kZXMgZm9yIHRoZSBMRUQgcmVndWxhdG9ycyBtdXN0IGJlIGNvbmZpZ3VyZWQgdXNpbmcKKyAqIHdtODM1MF9pc2lua19zZXRfZmxhc2goKSwgd204MzUwX2RjZGMyNV9zZXRfbW9kZSgpIGFuZAorICogd204MzUwX2RjZGNfc2V0X3Nsb3QoKSBwcmlvciB0byBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uCisgKi8KK2ludCB3bTgzNTBfcmVnaXN0ZXJfbGVkKHN0cnVjdCB3bTgzNTAgKndtODM1MCwgaW50IGxlZG51bSwgaW50IGRjZGMsIGludCBpc2luaywKKwkJCXN0cnVjdCB3bTgzNTBfbGVkX3BsYXRmb3JtX2RhdGEgKnBkYXRhKQoreworCXN0cnVjdCB3bTgzNTBfbGVkICpsZWQ7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldjsKKwlpbnQgcmV0OworCisJaWYgKGxlZG51bSA+IEFSUkFZX1NJWkUod204MzUwLT5wbWljLmxlZCkgfHwgbGVkbnVtIDwgMCkgeworCQlkZXZfZXJyKHdtODM1MC0+ZGV2LCAiSW52YWxpZCBMRUQgaW5kZXggJWRcbiIsIGxlZG51bSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWxlZCA9ICZ3bTgzNTAtPnBtaWMubGVkW2xlZG51bV07CisKKwlpZiAobGVkLT5wZGV2KSB7CisJCWRldl9lcnIod204MzUwLT5kZXYsICJMRUQgJWQgYWxyZWFkeSBhbGxvY2F0ZWRcbiIsIGxlZG51bSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXBkZXYgPSBwbGF0Zm9ybV9kZXZpY2VfYWxsb2MoIndtODM1MC1sZWQiLCBsZWRudW0pOworCWlmIChwZGV2ID09IE5VTEwpIHsKKwkJZGV2X2Vycih3bTgzNTAtPmRldiwgIkZhaWxlZCB0byBhbGxvY2F0ZSBMRUQgJWRcbiIsIGxlZG51bSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWxlZC0+aXNpbmtfY29uc3VtZXIuZGV2ID0gJnBkZXYtPmRldjsKKwlsZWQtPmlzaW5rX2NvbnN1bWVyLnN1cHBseSA9ICJsZWRfaXNpbmsiOworCWxlZC0+aXNpbmtfaW5pdC5udW1fY29uc3VtZXJfc3VwcGxpZXMgPSAxOworCWxlZC0+aXNpbmtfaW5pdC5jb25zdW1lcl9zdXBwbGllcyA9ICZsZWQtPmlzaW5rX2NvbnN1bWVyOworCWxlZC0+aXNpbmtfaW5pdC5jb25zdHJhaW50cy5taW5fdUEgPSAwOworCWxlZC0+aXNpbmtfaW5pdC5jb25zdHJhaW50cy5tYXhfdUEgPSBwZGF0YS0+bWF4X3VBOworCWxlZC0+aXNpbmtfaW5pdC5jb25zdHJhaW50cy52YWxpZF9vcHNfbWFzayA9IFJFR1VMQVRPUl9DSEFOR0VfQ1VSUkVOVDsKKwlsZWQtPmlzaW5rX2luaXQuY29uc3RyYWludHMudmFsaWRfbW9kZXNfbWFzayA9IFJFR1VMQVRPUl9NT0RFX05PUk1BTDsKKwlyZXQgPSB3bTgzNTBfcmVnaXN0ZXJfcmVndWxhdG9yKHdtODM1MCwgaXNpbmssICZsZWQtPmlzaW5rX2luaXQpOworCWlmIChyZXQgIT0gMCkgeworCQlwbGF0Zm9ybV9kZXZpY2VfcHV0KHBkZXYpOworCQlyZXR1cm4gcmV0OworCX0KKworCWxlZC0+ZGNkY19jb25zdW1lci5kZXYgPSAmcGRldi0+ZGV2OworCWxlZC0+ZGNkY19jb25zdW1lci5zdXBwbHkgPSAibGVkX3ZjYyI7CisJbGVkLT5kY2RjX2luaXQubnVtX2NvbnN1bWVyX3N1cHBsaWVzID0gMTsKKwlsZWQtPmRjZGNfaW5pdC5jb25zdW1lcl9zdXBwbGllcyA9ICZsZWQtPmRjZGNfY29uc3VtZXI7CisJbGVkLT5kY2RjX2luaXQuY29uc3RyYWludHMudmFsaWRfbW9kZXNfbWFzayA9IFJFR1VMQVRPUl9NT0RFX05PUk1BTDsKKwlyZXQgPSB3bTgzNTBfcmVnaXN0ZXJfcmVndWxhdG9yKHdtODM1MCwgZGNkYywgJmxlZC0+ZGNkY19pbml0KTsKKwlpZiAocmV0ICE9IDApIHsKKwkJcGxhdGZvcm1fZGV2aWNlX3B1dChwZGV2KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlzd2l0Y2ggKGlzaW5rKSB7CisJY2FzZSBXTTgzNTBfSVNJTktfQToKKwkJd204MzUwLT5wbWljLmlzaW5rX0FfZGNkYyA9IGRjZGM7CisJCWJyZWFrOworCWNhc2UgV004MzUwX0lTSU5LX0I6CisJCXdtODM1MC0+cG1pYy5pc2lua19CX2RjZGMgPSBkY2RjOworCQlicmVhazsKKwl9CisKKwlwZGV2LT5kZXYucGxhdGZvcm1fZGF0YSA9IHBkYXRhOworCXBkZXYtPmRldi5wYXJlbnQgPSB3bTgzNTAtPmRldjsKKwlyZXQgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkKHBkZXYpOworCWlmIChyZXQgIT0gMCkgeworCQlkZXZfZXJyKHdtODM1MC0+ZGV2LCAiRmFpbGVkIHRvIHJlZ2lzdGVyIExFRCAlZDogJWRcbiIsCisJCQlsZWRudW0sIHJldCk7CisJCXBsYXRmb3JtX2RldmljZV9wdXQocGRldik7CisJCXJldHVybiByZXQ7CisJfQorCisJbGVkLT5wZGV2ID0gcGRldjsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwod204MzUwX3JlZ2lzdGVyX2xlZCk7CisKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHdtODM1MF9yZWd1bGF0b3JfZHJpdmVyID0gewogCS5wcm9iZSA9IHdtODM1MF9yZWd1bGF0b3JfcHJvYmUsCiAJLnJlbW92ZSA9IHdtODM1MF9yZWd1bGF0b3JfcmVtb3ZlLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZWd1bGF0b3Ivd204NDAwLXJlZ3VsYXRvci5jIGIvZHJpdmVycy9yZWd1bGF0b3Ivd204NDAwLXJlZ3VsYXRvci5jCmluZGV4IDQ4YjM3MmUuLjU2ZTIzZDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcmVndWxhdG9yL3dtODQwMC1yZWd1bGF0b3IuYworKysgYi9kcml2ZXJzL3JlZ3VsYXRvci93bTg0MDAtcmVndWxhdG9yLmMKQEAgLTI4OSw3ICsyODksNyBAQAogCX0sCiB9OwogCi1zdGF0aWMgaW50IF9faW5pdCB3bTg0MDBfcmVndWxhdG9yX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCitzdGF0aWMgaW50IF9fZGV2aW5pdCB3bTg0MDBfcmVndWxhdG9yX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXY7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnRjL0tjb25maWcgYi9kcml2ZXJzL3J0Yy9LY29uZmlnCmluZGV4IDRhZDgzMWQuLmNjZWQ0ZDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcnRjL0tjb25maWcKKysrIGIvZHJpdmVycy9ydGMvS2NvbmZpZwpAQCAtNTAyLDYgKzUwMiwxMyBAQAogCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuIElmIHNvLCB0aGUgbW9kdWxlCiAJICB3aWxsIGJlIGNhbGxlZCAicnRjLXdtODM1MCIuCiAKK2NvbmZpZyBSVENfRFJWX1BDRjUwNjMzCisJZGVwZW5kcyBvbiBNRkRfUENGNTA2MzMKKwl0cmlzdGF0ZSAiTlhQIFBDRjUwNjMzIFJUQyIKKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgdGhlIFJUQyBzdWJzeXN0ZW0gb2YgdGhlCisJICBOWFAgUENGNTA2MzMgdXNlZCBpbiBlbWJlZGRlZCBzeXN0ZW1zLgorCiBjb21tZW50ICJvbi1DUFUgUlRDIGRyaXZlcnMiCiAKIGNvbmZpZyBSVENfRFJWX09NQVAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnRjL01ha2VmaWxlIGIvZHJpdmVycy9ydGMvTWFrZWZpbGUKaW5kZXggOWE0MzQwZC4uNmUyODAyMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ydGMvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9ydGMvTWFrZWZpbGUKQEAgLTc0LDMgKzc0LDQgQEAKIG9iai0kKENPTkZJR19SVENfRFJWX1ZSNDFYWCkJKz0gcnRjLXZyNDF4eC5vCiBvYmotJChDT05GSUdfUlRDX0RSVl9XTTgzNTApCSs9IHJ0Yy13bTgzNTAubwogb2JqLSQoQ09ORklHX1JUQ19EUlZfWDEyMDUpCSs9IHJ0Yy14MTIwNS5vCitvYmotJChDT05GSUdfUlRDX0RSVl9QQ0Y1MDYzMykJKz0gcnRjLXBjZjUwNjMzLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnRjL3J0Yy1kczEzMDcuYyBiL2RyaXZlcnMvcnRjL3J0Yy1kczEzMDcuYwppbmRleCAxNjIzMzBiLi43ZTUxNTVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3J0Yy9ydGMtZHMxMzA3LmMKKysrIGIvZHJpdmVycy9ydGMvcnRjLWRzMTMwNy5jCkBAIC04NiwxMyArODYsMTEgQEAKIAogCiBzdHJ1Y3QgZHMxMzA3IHsKLQl1OAkJCXJlZ19hZGRyOwogCXU4CQkJcmVnc1sxMV07CiAJZW51bSBkc190eXBlCQl0eXBlOwogCXVuc2lnbmVkIGxvbmcJCWZsYWdzOwogI2RlZmluZSBIQVNfTlZSQU0JMAkJLyogYml0IDAgPT0gc3lzZnMgZmlsZSBhY3RpdmUgKi8KICNkZWZpbmUgSEFTX0FMQVJNCTEJCS8qIGJpdCAxID09IGlycSBjbGFpbWVkICovCi0Jc3RydWN0IGkyY19tc2cJCW1zZ1syXTsKIAlzdHJ1Y3QgaTJjX2NsaWVudAkqY2xpZW50OwogCXN0cnVjdCBydGNfZGV2aWNlCSpydGM7CiAJc3RydWN0IHdvcmtfc3RydWN0CXdvcms7CkBAIC0yMDQsMTMgKzIwMiw5IEBACiAJaW50CQl0bXA7CiAKIAkvKiByZWFkIHRoZSBSVEMgZGF0ZSBhbmQgdGltZSByZWdpc3RlcnMgYWxsIGF0IG9uY2UgKi8KLQlkczEzMDctPnJlZ19hZGRyID0gMDsKLQlkczEzMDctPm1zZ1sxXS5mbGFncyA9IEkyQ19NX1JEOwotCWRzMTMwNy0+bXNnWzFdLmxlbiA9IDc7Ci0KLQl0bXAgPSBpMmNfdHJhbnNmZXIodG9faTJjX2FkYXB0ZXIoZHMxMzA3LT5jbGllbnQtPmRldi5wYXJlbnQpLAotCQkJZHMxMzA3LT5tc2csIDIpOwotCWlmICh0bXAgIT0gMikgeworCXRtcCA9IGkyY19zbWJ1c19yZWFkX2kyY19ibG9ja19kYXRhKGRzMTMwNy0+Y2xpZW50LAorCQlEUzEzMDdfUkVHX1NFQ1MsIDcsIGRzMTMwNy0+cmVncyk7CisJaWYgKHRtcCAhPSA3KSB7CiAJCWRldl9lcnIoZGV2LCAiJXMgZXJyb3IgJWRcbiIsICJyZWFkIiwgdG1wKTsKIAkJcmV0dXJuIC1FSU87CiAJfQpAQCAtMjU3LDcgKzI1MSw2IEBACiAJCXQtPnRtX2hvdXIsIHQtPnRtX21kYXksCiAJCXQtPnRtX21vbiwgdC0+dG1feWVhciwgdC0+dG1fd2RheSk7CiAKLQkqYnVmKysgPSAwOwkJLyogZmlyc3QgcmVnaXN0ZXIgYWRkciAqLwogCWJ1ZltEUzEzMDdfUkVHX1NFQ1NdID0gYmluMmJjZCh0LT50bV9zZWMpOwogCWJ1ZltEUzEzMDdfUkVHX01JTl0gPSBiaW4yYmNkKHQtPnRtX21pbik7CiAJYnVmW0RTMTMwN19SRUdfSE9VUl0gPSBiaW4yYmNkKHQtPnRtX2hvdXIpOwpAQCAtMjgyLDIzICsyNzUsMTkgQEAKIAkJYnJlYWs7CiAJfQogCi0JZHMxMzA3LT5tc2dbMV0uZmxhZ3MgPSAwOwotCWRzMTMwNy0+bXNnWzFdLmxlbiA9IDg7Ci0KIAlkZXZfZGJnKGRldiwgIiVzOiAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4XG4iLAogCQkid3JpdGUiLCBidWZbMF0sIGJ1ZlsxXSwgYnVmWzJdLCBidWZbM10sCiAJCWJ1Zls0XSwgYnVmWzVdLCBidWZbNl0pOwogCi0JcmVzdWx0ID0gaTJjX3RyYW5zZmVyKHRvX2kyY19hZGFwdGVyKGRzMTMwNy0+Y2xpZW50LT5kZXYucGFyZW50KSwKLQkJCSZkczEzMDctPm1zZ1sxXSwgMSk7Ci0JaWYgKHJlc3VsdCAhPSAxKSB7Ci0JCWRldl9lcnIoZGV2LCAiJXMgZXJyb3IgJWRcbiIsICJ3cml0ZSIsIHRtcCk7Ci0JCXJldHVybiAtRUlPOworCXJlc3VsdCA9IGkyY19zbWJ1c193cml0ZV9pMmNfYmxvY2tfZGF0YShkczEzMDctPmNsaWVudCwgMCwgNywgYnVmKTsKKwlpZiAocmVzdWx0IDwgMCkgeworCQlkZXZfZXJyKGRldiwgIiVzIGVycm9yICVkXG4iLCAid3JpdGUiLCByZXN1bHQpOworCQlyZXR1cm4gcmVzdWx0OwogCX0KIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBkczEzMDdfcmVhZF9hbGFybShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfd2thbHJtICp0KQorc3RhdGljIGludCBkczEzMzdfcmVhZF9hbGFybShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfd2thbHJtICp0KQogewogCXN0cnVjdCBpMmNfY2xpZW50ICAgICAgICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CiAJc3RydWN0IGRzMTMwNwkJKmRzMTMwNyA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwpAQCAtMzA4LDEzICsyOTcsOSBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAogCS8qIHJlYWQgYWxsIEFMQVJNMSwgQUxBUk0yLCBhbmQgc3RhdHVzIHJlZ2lzdGVycyBhdCBvbmNlICovCi0JZHMxMzA3LT5yZWdfYWRkciA9IERTMTMzOV9SRUdfQUxBUk0xX1NFQ1M7Ci0JZHMxMzA3LT5tc2dbMV0uZmxhZ3MgPSBJMkNfTV9SRDsKLQlkczEzMDctPm1zZ1sxXS5sZW4gPSA5OwotCi0JcmV0ID0gaTJjX3RyYW5zZmVyKHRvX2kyY19hZGFwdGVyKGNsaWVudC0+ZGV2LnBhcmVudCksCi0JCQlkczEzMDctPm1zZywgMik7Ci0JaWYgKHJldCAhPSAyKSB7CisJcmV0ID0gaTJjX3NtYnVzX3JlYWRfaTJjX2Jsb2NrX2RhdGEoY2xpZW50LAorCQkJRFMxMzM5X1JFR19BTEFSTTFfU0VDUywgOSwgZHMxMzA3LT5yZWdzKTsKKwlpZiAocmV0ICE9IDkpIHsKIAkJZGV2X2VycihkZXYsICIlcyBlcnJvciAlZFxuIiwgImFsYXJtIHJlYWQiLCByZXQpOwogCQlyZXR1cm4gLUVJTzsKIAl9CkBAIC0zNTMsNyArMzM4LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBkczEzMDdfc2V0X2FsYXJtKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y193a2Fscm0gKnQpCitzdGF0aWMgaW50IGRzMTMzN19zZXRfYWxhcm0oc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3drYWxybSAqdCkKIHsKIAlzdHJ1Y3QgaTJjX2NsaWVudCAgICAgICAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOwogCXN0cnVjdCBkczEzMDcJCSpkczEzMDcgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKQEAgLTM3MSwxMyArMzU2LDkgQEAKIAkJdC0+ZW5hYmxlZCwgdC0+cGVuZGluZyk7CiAKIAkvKiByZWFkIGN1cnJlbnQgc3RhdHVzIG9mIGJvdGggYWxhcm1zIGFuZCB0aGUgY2hpcCAqLwotCWRzMTMwNy0+cmVnX2FkZHIgPSBEUzEzMzlfUkVHX0FMQVJNMV9TRUNTOwotCWRzMTMwNy0+bXNnWzFdLmZsYWdzID0gSTJDX01fUkQ7Ci0JZHMxMzA3LT5tc2dbMV0ubGVuID0gOTsKLQotCXJldCA9IGkyY190cmFuc2Zlcih0b19pMmNfYWRhcHRlcihjbGllbnQtPmRldi5wYXJlbnQpLAotCQkJZHMxMzA3LT5tc2csIDIpOwotCWlmIChyZXQgIT0gMikgeworCXJldCA9IGkyY19zbWJ1c19yZWFkX2kyY19ibG9ja19kYXRhKGNsaWVudCwKKwkJCURTMTMzOV9SRUdfQUxBUk0xX1NFQ1MsIDksIGJ1Zik7CisJaWYgKHJldCAhPSA5KSB7CiAJCWRldl9lcnIoZGV2LCAiJXMgZXJyb3IgJWRcbiIsICJhbGFybSB3cml0ZSIsIHJldCk7CiAJCXJldHVybiAtRUlPOwogCX0KQEAgLTM5Miw3ICszNzMsNiBAQAogCQkJZHMxMzA3LT5yZWdzWzZdLCBjb250cm9sLCBzdGF0dXMpOwogCiAJLyogc2V0IEFMQVJNMSwgdXNpbmcgMjQgaG91ciBhbmQgZGF5LW9mLW1vbnRoIG1vZGVzICovCi0JKmJ1ZisrID0gRFMxMzM5X1JFR19BTEFSTTFfU0VDUzsJLyogZmlyc3QgcmVnaXN0ZXIgYWRkciAqLwogCWJ1ZlswXSA9IGJpbjJiY2QodC0+dGltZS50bV9zZWMpOwogCWJ1ZlsxXSA9IGJpbjJiY2QodC0+dGltZS50bV9taW4pOwogCWJ1ZlsyXSA9IGJpbjJiY2QodC0+dGltZS50bV9ob3VyKTsKQEAgLTQxMSwxNCArMzkxLDExIEBACiAJfQogCWJ1Zls4XSA9IHN0YXR1cyAmIH4oRFMxMzM3X0JJVF9BMUkgfCBEUzEzMzdfQklUX0EySSk7CiAKLQlkczEzMDctPm1zZ1sxXS5mbGFncyA9IDA7Ci0JZHMxMzA3LT5tc2dbMV0ubGVuID0gMTA7Ci0KLQlyZXQgPSBpMmNfdHJhbnNmZXIodG9faTJjX2FkYXB0ZXIoY2xpZW50LT5kZXYucGFyZW50KSwKLQkJCSZkczEzMDctPm1zZ1sxXSwgMSk7Ci0JaWYgKHJldCAhPSAxKSB7CisJcmV0ID0gaTJjX3NtYnVzX3dyaXRlX2kyY19ibG9ja19kYXRhKGNsaWVudCwKKwkJCURTMTMzOV9SRUdfQUxBUk0xX1NFQ1MsIDksIGJ1Zik7CisJaWYgKHJldCA8IDApIHsKIAkJZGV2X2VycihkZXYsICJjYW4ndCBzZXQgYWxhcm0gdGltZVxuIik7Ci0JCXJldHVybiAtRUlPOworCQlyZXR1cm4gcmV0OwogCX0KIAogCXJldHVybiAwOwpAQCAtNDc1LDggKzQ1Miw4IEBACiBzdGF0aWMgY29uc3Qgc3RydWN0IHJ0Y19jbGFzc19vcHMgZHMxM3h4X3J0Y19vcHMgPSB7CiAJLnJlYWRfdGltZQk9IGRzMTMwN19nZXRfdGltZSwKIAkuc2V0X3RpbWUJPSBkczEzMDdfc2V0X3RpbWUsCi0JLnJlYWRfYWxhcm0JPSBkczEzMDdfcmVhZF9hbGFybSwKLQkuc2V0X2FsYXJtCT0gZHMxMzA3X3NldF9hbGFybSwKKwkucmVhZF9hbGFybQk9IGRzMTMzN19yZWFkX2FsYXJtLAorCS5zZXRfYWxhcm0JPSBkczEzMzdfc2V0X2FsYXJtLAogCS5pb2N0bAkJPSBkczEzMDdfaW9jdGwsCiB9OwogCkBAIC00OTAsNyArNDY3LDYgQEAKIHsKIAlzdHJ1Y3QgaTJjX2NsaWVudAkqY2xpZW50OwogCXN0cnVjdCBkczEzMDcJCSpkczEzMDc7Ci0Jc3RydWN0IGkyY19tc2cJCW1zZ1syXTsKIAlpbnQJCQlyZXN1bHQ7CiAKIAljbGllbnQgPSBrb2JqX3RvX2kyY19jbGllbnQoa29iaik7CkBAIC01MDMsMjQgKzQ3OSwxMCBAQAogCWlmICh1bmxpa2VseSghY291bnQpKQogCQlyZXR1cm4gY291bnQ7CiAKLQltc2dbMF0uYWRkciA9IGNsaWVudC0+YWRkcjsKLQltc2dbMF0uZmxhZ3MgPSAwOwotCW1zZ1swXS5sZW4gPSAxOwotCW1zZ1swXS5idWYgPSBidWY7Ci0KLQlidWZbMF0gPSA4ICsgb2ZmOwotCi0JbXNnWzFdLmFkZHIgPSBjbGllbnQtPmFkZHI7Ci0JbXNnWzFdLmZsYWdzID0gSTJDX01fUkQ7Ci0JbXNnWzFdLmxlbiA9IGNvdW50OwotCW1zZ1sxXS5idWYgPSBidWY7Ci0KLQlyZXN1bHQgPSBpMmNfdHJhbnNmZXIodG9faTJjX2FkYXB0ZXIoY2xpZW50LT5kZXYucGFyZW50KSwgbXNnLCAyKTsKLQlpZiAocmVzdWx0ICE9IDIpIHsKKwlyZXN1bHQgPSBpMmNfc21idXNfcmVhZF9pMmNfYmxvY2tfZGF0YShjbGllbnQsIDggKyBvZmYsIGNvdW50LCBidWYpOworCWlmIChyZXN1bHQgPCAwKQogCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIiVzIGVycm9yICVkXG4iLCAibnZyYW0gcmVhZCIsIHJlc3VsdCk7Ci0JCXJldHVybiAtRUlPOwotCX0KLQlyZXR1cm4gY291bnQ7CisJcmV0dXJuIHJlc3VsdDsKIH0KIAogc3RhdGljIHNzaXplX3QKQEAgLTUyOCw4ICs0OTAsNyBAQAogCQljaGFyICpidWYsIGxvZmZfdCBvZmYsIHNpemVfdCBjb3VudCkKIHsKIAlzdHJ1Y3QgaTJjX2NsaWVudAkqY2xpZW50OwotCXU4CQkJYnVmZmVyW05WUkFNX1NJWkUgKyAxXTsKLQlpbnQJCQlyZXQ7CisJaW50CQkJcmVzdWx0OwogCiAJY2xpZW50ID0ga29ial90b19pMmNfY2xpZW50KGtvYmopOwogCkBAIC01NDAsMTEgKzUwMSwxMiBAQAogCWlmICh1bmxpa2VseSghY291bnQpKQogCQlyZXR1cm4gY291bnQ7CiAKLQlidWZmZXJbMF0gPSA4ICsgb2ZmOwotCW1lbWNweShidWZmZXIgKyAxLCBidWYsIGNvdW50KTsKLQotCXJldCA9IGkyY19tYXN0ZXJfc2VuZChjbGllbnQsIGJ1ZmZlciwgY291bnQgKyAxKTsKLQlyZXR1cm4gKHJldCA8IDApID8gcmV0IDogKHJldCAtIDEpOworCXJlc3VsdCA9IGkyY19zbWJ1c193cml0ZV9pMmNfYmxvY2tfZGF0YShjbGllbnQsIDggKyBvZmYsIGNvdW50LCBidWYpOworCWlmIChyZXN1bHQgPCAwKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiJXMgZXJyb3IgJWRcbiIsICJudnJhbSB3cml0ZSIsIHJlc3VsdCk7CisJCXJldHVybiByZXN1bHQ7CisJfQorCXJldHVybiBjb3VudDsKIH0KIAogc3RhdGljIHN0cnVjdCBiaW5fYXR0cmlidXRlIG52cmFtID0gewpAQCAtNTcxLDkgKzUzMywxMSBAQAogCWNvbnN0IHN0cnVjdCBjaGlwX2Rlc2MJKmNoaXAgPSAmY2hpcHNbaWQtPmRyaXZlcl9kYXRhXTsKIAlzdHJ1Y3QgaTJjX2FkYXB0ZXIJKmFkYXB0ZXIgPSB0b19pMmNfYWRhcHRlcihjbGllbnQtPmRldi5wYXJlbnQpOwogCWludAkJCXdhbnRfaXJxID0gZmFsc2U7CisJdW5zaWduZWQgY2hhcgkJKmJ1ZjsKIAogCWlmICghaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoYWRhcHRlciwKLQkJCUkyQ19GVU5DX0kyQyB8IEkyQ19GVU5DX1NNQlVTX1dSSVRFX0JZVEVfREFUQSkpCisJCQlJMkNfRlVOQ19TTUJVU19XUklURV9CWVRFX0RBVEEgfAorCQkJSTJDX0ZVTkNfU01CVVNfSTJDX0JMT0NLKSkKIAkJcmV0dXJuIC1FSU87CiAKIAlpZiAoIShkczEzMDcgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZHMxMzA3KSwgR0ZQX0tFUk5FTCkpKQpAQCAtNTgxLDE4ICs1NDUsOCBAQAogCiAJZHMxMzA3LT5jbGllbnQgPSBjbGllbnQ7CiAJaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgZHMxMzA3KTsKLQotCWRzMTMwNy0+bXNnWzBdLmFkZHIgPSBjbGllbnQtPmFkZHI7Ci0JZHMxMzA3LT5tc2dbMF0uZmxhZ3MgPSAwOwotCWRzMTMwNy0+bXNnWzBdLmxlbiA9IDE7Ci0JZHMxMzA3LT5tc2dbMF0uYnVmID0gJmRzMTMwNy0+cmVnX2FkZHI7Ci0KLQlkczEzMDctPm1zZ1sxXS5hZGRyID0gY2xpZW50LT5hZGRyOwotCWRzMTMwNy0+bXNnWzFdLmZsYWdzID0gSTJDX01fUkQ7Ci0JZHMxMzA3LT5tc2dbMV0ubGVuID0gc2l6ZW9mKGRzMTMwNy0+cmVncyk7Ci0JZHMxMzA3LT5tc2dbMV0uYnVmID0gZHMxMzA3LT5yZWdzOwotCiAJZHMxMzA3LT50eXBlID0gaWQtPmRyaXZlcl9kYXRhOworCWJ1ZiA9IGRzMTMwNy0+cmVnczsKIAogCXN3aXRjaCAoZHMxMzA3LT50eXBlKSB7CiAJY2FzZSBkc18xMzM3OgpAQCAtNjAyLDIxICs1NTYsMTUgQEAKIAkJCUlOSVRfV09SSygmZHMxMzA3LT53b3JrLCBkczEzMDdfd29yayk7CiAJCQl3YW50X2lycSA9IHRydWU7CiAJCX0KLQotCQlkczEzMDctPnJlZ19hZGRyID0gRFMxMzM3X1JFR19DT05UUk9MOwotCQlkczEzMDctPm1zZ1sxXS5sZW4gPSAyOwotCiAJCS8qIGdldCByZWdpc3RlcnMgdGhhdCB0aGUgInJ0YyIgcmVhZCBiZWxvdyB3b24ndCByZWFkLi4uICovCi0JCXRtcCA9IGkyY190cmFuc2ZlcihhZGFwdGVyLCBkczEzMDctPm1zZywgMik7CisJCXRtcCA9IGkyY19zbWJ1c19yZWFkX2kyY19ibG9ja19kYXRhKGRzMTMwNy0+Y2xpZW50LAorCQkJCURTMTMzN19SRUdfQ09OVFJPTCwgMiwgYnVmKTsKIAkJaWYgKHRtcCAhPSAyKSB7CiAJCQlwcl9kZWJ1ZygicmVhZCBlcnJvciAlZFxuIiwgdG1wKTsKIAkJCWVyciA9IC1FSU87CiAJCQlnb3RvIGV4aXRfZnJlZTsKIAkJfQogCi0JCWRzMTMwNy0+cmVnX2FkZHIgPSAwOwotCQlkczEzMDctPm1zZ1sxXS5sZW4gPSBzaXplb2YoZHMxMzA3LT5yZWdzKTsKLQogCQkvKiBvc2NpbGxhdG9yIG9mZj8gIHR1cm4gaXQgb24sIHNvIGNsb2NrIGNhbiB0aWNrLiAqLwogCQlpZiAoZHMxMzA3LT5yZWdzWzBdICYgRFMxMzM3X0JJVF9uRU9TQykKIAkJCWRzMTMwNy0+cmVnc1swXSAmPSB+RFMxMzM3X0JJVF9uRU9TQzsKQEAgLTY0Nyw5ICs1OTUsOCBAQAogCiByZWFkX3J0YzoKIAkvKiByZWFkIFJUQyByZWdpc3RlcnMgKi8KLQotCXRtcCA9IGkyY190cmFuc2ZlcihhZGFwdGVyLCBkczEzMDctPm1zZywgMik7Ci0JaWYgKHRtcCAhPSAyKSB7CisJdG1wID0gaTJjX3NtYnVzX3JlYWRfaTJjX2Jsb2NrX2RhdGEoZHMxMzA3LT5jbGllbnQsIDAsIDgsIGJ1Zik7CisJaWYgKHRtcCAhPSA4KSB7CiAJCXByX2RlYnVnKCJyZWFkIGVycm9yICVkXG4iLCB0bXApOwogCQllcnIgPSAtRUlPOwogCQlnb3RvIGV4aXRfZnJlZTsKQEAgLTcwNywyMiArNjU0LDYgQEAKIAkJYnJlYWs7CiAJfQogCi0JdG1wID0gZHMxMzA3LT5yZWdzW0RTMTMwN19SRUdfU0VDU107Ci0JdG1wID0gYmNkMmJpbih0bXAgJiAweDdmKTsKLQlpZiAodG1wID4gNjApCi0JCWdvdG8gZXhpdF9iYWQ7Ci0JdG1wID0gYmNkMmJpbihkczEzMDctPnJlZ3NbRFMxMzA3X1JFR19NSU5dICYgMHg3Zik7Ci0JaWYgKHRtcCA+IDYwKQotCQlnb3RvIGV4aXRfYmFkOwotCi0JdG1wID0gYmNkMmJpbihkczEzMDctPnJlZ3NbRFMxMzA3X1JFR19NREFZXSAmIDB4M2YpOwotCWlmICh0bXAgPT0gMCB8fCB0bXAgPiAzMSkKLQkJZ290byBleGl0X2JhZDsKLQotCXRtcCA9IGJjZDJiaW4oZHMxMzA3LT5yZWdzW0RTMTMwN19SRUdfTU9OVEhdICYgMHgxZik7Ci0JaWYgKHRtcCA9PSAwIHx8IHRtcCA+IDEyKQotCQlnb3RvIGV4aXRfYmFkOwotCiAJdG1wID0gZHMxMzA3LT5yZWdzW0RTMTMwN19SRUdfSE9VUl07CiAJc3dpdGNoIChkczEzMDctPnR5cGUpIHsKIAljYXNlIGRzXzEzNDA6CkBAIC03NzksMTMgKzcxMCw2IEBACiAKIAlyZXR1cm4gMDsKIAotZXhpdF9iYWQ6Ci0JZGV2X2RiZygmY2xpZW50LT5kZXYsICIlczogJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeFxuIiwKLQkJCSJib2d1cyByZWdpc3RlciIsCi0JCQlkczEzMDctPnJlZ3NbMF0sIGRzMTMwNy0+cmVnc1sxXSwKLQkJCWRzMTMwNy0+cmVnc1syXSwgZHMxMzA3LT5yZWdzWzNdLAotCQkJZHMxMzA3LT5yZWdzWzRdLCBkczEzMDctPnJlZ3NbNV0sCi0JCQlkczEzMDctPnJlZ3NbNl0pOwogZXhpdF9pcnE6CiAJaWYgKGRzMTMwNy0+cnRjKQogCQlydGNfZGV2aWNlX3VucmVnaXN0ZXIoZHMxMzA3LT5ydGMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ydGMvcnRjLWRzMTUxMS5jIGIvZHJpdmVycy9ydGMvcnRjLWRzMTUxMS5jCmluZGV4IDIzYTA3ZmUuLjBiNmI3NzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcnRjL3J0Yy1kczE1MTEuYworKysgYi9kcml2ZXJzL3J0Yy9ydGMtZHMxNTExLmMKQEAgLTYzMCw3ICs2MzAsNyBAQAogIHN0YXRpYyB2b2lkIF9fZXhpdAogZHMxNTExX3J0Y19leGl0KHZvaWQpCiB7Ci0JcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZkczE1MTFfcnRjX2RyaXZlcik7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmRzMTUxMV9ydGNfZHJpdmVyKTsKIH0KIAogbW9kdWxlX2luaXQoZHMxNTExX3J0Y19pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnRjL3J0Yy1wYXJpc2MuYyBiL2RyaXZlcnMvcnRjL3J0Yy1wYXJpc2MuYwppbmRleCAzNDZkNjMzLi5jNmJmYTZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3J0Yy9ydGMtcGFyaXNjLmMKKysrIGIvZHJpdmVycy9ydGMvcnRjLXBhcmlzYy5jCkBAIC0zNCw3ICszNCw4IEBACiBzdGF0aWMgaW50IHBhcmlzY19zZXRfdGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqdG0pCiB7CiAJc3RydWN0IHBhcmlzY19ydGMgKnAgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzLCByZXQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0OwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnAtPmxvY2ssIGZsYWdzKTsKIAlyZXQgPSBzZXRfcnRjX3RpbWUodG0pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ydGMvcnRjLXBjZjUwNjMzLmMgYi9kcml2ZXJzL3J0Yy9ydGMtcGNmNTA2MzMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNGRkODdlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ydGMvcnRjLXBjZjUwNjMzLmMKQEAgLTAsMCArMSwzNDQgQEAKKy8qIE5YUCBQQ0Y1MDYzMyBSVEMgRHJpdmVyCisgKgorICogKEMpIDIwMDYtMjAwOCBieSBPcGVubW9rbywgSW5jLgorICogQXV0aG9yOiBCYWxhamkgUmFvIDxiYWxhamlycmFvQG9wZW5tb2tvLm9yZz4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogQnJva2VuIGRvd24gZnJvbSBtb25zdHJvdXMgUENGNTA2MzMgZHJpdmVyIG1haW5seSBieQorICogSGFyYWxkIFdlbHRlLCBBbmR5IEdyZWVuIGFuZCBXZXJuZXIgQWxtZXNiZXJnZXIKKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ydGMuaD4KKyNpbmNsdWRlIDxsaW51eC9iY2QuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKworI2luY2x1ZGUgPGxpbnV4L21mZC9wY2Y1MDYzMy9jb3JlLmg+CisKKyNkZWZpbmUgUENGNTA2MzNfUkVHX1JUQ1NDCTB4NTkgLyogU2Vjb25kICovCisjZGVmaW5lIFBDRjUwNjMzX1JFR19SVENNTgkweDVhIC8qIE1pbnV0ZSAqLworI2RlZmluZSBQQ0Y1MDYzM19SRUdfUlRDSFIJMHg1YiAvKiBIb3VyICovCisjZGVmaW5lIFBDRjUwNjMzX1JFR19SVENXRAkweDVjIC8qIFdlZWtkYXkgKi8KKyNkZWZpbmUgUENGNTA2MzNfUkVHX1JUQ0RUCTB4NWQgLyogRGF5ICovCisjZGVmaW5lIFBDRjUwNjMzX1JFR19SVENNVAkweDVlIC8qIE1vbnRoICovCisjZGVmaW5lIFBDRjUwNjMzX1JFR19SVENZUgkweDVmIC8qIFllYXIgKi8KKyNkZWZpbmUgUENGNTA2MzNfUkVHX1JUQ1NDQQkweDYwIC8qIEFsYXJtIFNlY29uZCAqLworI2RlZmluZSBQQ0Y1MDYzM19SRUdfUlRDTU5BCTB4NjEgLyogQWxhcm0gTWludXRlICovCisjZGVmaW5lIFBDRjUwNjMzX1JFR19SVENIUkEJMHg2MiAvKiBBbGFybSBIb3VyICovCisjZGVmaW5lIFBDRjUwNjMzX1JFR19SVENXREEJMHg2MyAvKiBBbGFybSBXZWVrZGF5ICovCisjZGVmaW5lIFBDRjUwNjMzX1JFR19SVENEVEEJMHg2NCAvKiBBbGFybSBEYXkgKi8KKyNkZWZpbmUgUENGNTA2MzNfUkVHX1JUQ01UQQkweDY1IC8qIEFsYXJtIE1vbnRoICovCisjZGVmaW5lIFBDRjUwNjMzX1JFR19SVENZUkEJMHg2NiAvKiBBbGFybSBZZWFyICovCisKK2VudW0gcGNmNTA2MzNfdGltZV9pbmRleGVzIHsKKwlQQ0Y1MDYzM19USV9TRUMsCisJUENGNTA2MzNfVElfTUlOLAorCVBDRjUwNjMzX1RJX0hPVVIsCisJUENGNTA2MzNfVElfV0tEQVksCisJUENGNTA2MzNfVElfREFZLAorCVBDRjUwNjMzX1RJX01PTlRILAorCVBDRjUwNjMzX1RJX1lFQVIsCisJUENGNTA2MzNfVElfRVhURU5UIC8qIGFsd2F5cyBsYXN0ICovCit9OworCitzdHJ1Y3QgcGNmNTA2MzNfdGltZSB7CisJdV9pbnQ4X3QgdGltZVtQQ0Y1MDYzM19USV9FWFRFTlRdOworfTsKKworc3RydWN0IHBjZjUwNjMzX3J0YyB7CisJaW50IGFsYXJtX2VuYWJsZWQ7CisJaW50IHNlY29uZF9lbmFibGVkOworCisJc3RydWN0IHBjZjUwNjMzICpwY2Y7CisJc3RydWN0IHJ0Y19kZXZpY2UgKnJ0Y19kZXY7Cit9OworCitzdGF0aWMgdm9pZCBwY2YycnRjX3RpbWUoc3RydWN0IHJ0Y190aW1lICpydGMsIHN0cnVjdCBwY2Y1MDYzM190aW1lICpwY2YpCit7CisJcnRjLT50bV9zZWMgPSBiY2QyYmluKHBjZi0+dGltZVtQQ0Y1MDYzM19USV9TRUNdKTsKKwlydGMtPnRtX21pbiA9IGJjZDJiaW4ocGNmLT50aW1lW1BDRjUwNjMzX1RJX01JTl0pOworCXJ0Yy0+dG1faG91ciA9IGJjZDJiaW4ocGNmLT50aW1lW1BDRjUwNjMzX1RJX0hPVVJdKTsKKwlydGMtPnRtX3dkYXkgPSBiY2QyYmluKHBjZi0+dGltZVtQQ0Y1MDYzM19USV9XS0RBWV0pOworCXJ0Yy0+dG1fbWRheSA9IGJjZDJiaW4ocGNmLT50aW1lW1BDRjUwNjMzX1RJX0RBWV0pOworCXJ0Yy0+dG1fbW9uID0gYmNkMmJpbihwY2YtPnRpbWVbUENGNTA2MzNfVElfTU9OVEhdKTsKKwlydGMtPnRtX3llYXIgPSBiY2QyYmluKHBjZi0+dGltZVtQQ0Y1MDYzM19USV9ZRUFSXSkgKyAxMDA7Cit9CisKK3N0YXRpYyB2b2lkIHJ0YzJwY2ZfdGltZShzdHJ1Y3QgcGNmNTA2MzNfdGltZSAqcGNmLCBzdHJ1Y3QgcnRjX3RpbWUgKnJ0YykKK3sKKwlwY2YtPnRpbWVbUENGNTA2MzNfVElfU0VDXSA9IGJpbjJiY2QocnRjLT50bV9zZWMpOworCXBjZi0+dGltZVtQQ0Y1MDYzM19USV9NSU5dID0gYmluMmJjZChydGMtPnRtX21pbik7CisJcGNmLT50aW1lW1BDRjUwNjMzX1RJX0hPVVJdID0gYmluMmJjZChydGMtPnRtX2hvdXIpOworCXBjZi0+dGltZVtQQ0Y1MDYzM19USV9XS0RBWV0gPSBiaW4yYmNkKHJ0Yy0+dG1fd2RheSk7CisJcGNmLT50aW1lW1BDRjUwNjMzX1RJX0RBWV0gPSBiaW4yYmNkKHJ0Yy0+dG1fbWRheSk7CisJcGNmLT50aW1lW1BDRjUwNjMzX1RJX01PTlRIXSA9IGJpbjJiY2QocnRjLT50bV9tb24pOworCXBjZi0+dGltZVtQQ0Y1MDYzM19USV9ZRUFSXSA9IGJpbjJiY2QocnRjLT50bV95ZWFyICUgMTAwKTsKK30KKworc3RhdGljIGludAorcGNmNTA2MzNfcnRjX2FsYXJtX2lycV9lbmFibGUoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgZW5hYmxlZCkKK3sKKwlzdHJ1Y3QgcGNmNTA2MzNfcnRjICpydGMgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlpbnQgZXJyOworCisJaWYgKGVuYWJsZWQpCisJCWVyciA9IHBjZjUwNjMzX2lycV91bm1hc2socnRjLT5wY2YsIFBDRjUwNjMzX0lSUV9BTEFSTSk7CisJZWxzZQorCQllcnIgPSBwY2Y1MDYzM19pcnFfbWFzayhydGMtPnBjZiwgUENGNTA2MzNfSVJRX0FMQVJNKTsKKworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJcnRjLT5hbGFybV9lbmFibGVkID0gZW5hYmxlZDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitwY2Y1MDYzM19ydGNfdXBkYXRlX2lycV9lbmFibGUoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgZW5hYmxlZCkKK3sKKwlzdHJ1Y3QgcGNmNTA2MzNfcnRjICpydGMgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlpbnQgZXJyOworCisJaWYgKGVuYWJsZWQpCisJCWVyciA9IHBjZjUwNjMzX2lycV91bm1hc2socnRjLT5wY2YsIFBDRjUwNjMzX0lSUV9TRUNPTkQpOworCWVsc2UKKwkJZXJyID0gcGNmNTA2MzNfaXJxX21hc2socnRjLT5wY2YsIFBDRjUwNjMzX0lSUV9TRUNPTkQpOworCisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisKKwlydGMtPnNlY29uZF9lbmFibGVkID0gZW5hYmxlZDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBjZjUwNjMzX3J0Y19yZWFkX3RpbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3RpbWUgKnRtKQoreworCXN0cnVjdCBwY2Y1MDYzM19ydGMgKnJ0YzsKKwlzdHJ1Y3QgcGNmNTA2MzNfdGltZSBwY2ZfdG07CisJaW50IHJldDsKKworCXJ0YyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCisJcmV0ID0gcGNmNTA2MzNfcmVhZF9ibG9jayhydGMtPnBjZiwgUENGNTA2MzNfUkVHX1JUQ1NDLAorCQkJCQkgICAgUENGNTA2MzNfVElfRVhURU5ULAorCQkJCQkgICAgJnBjZl90bS50aW1lWzBdKTsKKwlpZiAocmV0ICE9IFBDRjUwNjMzX1RJX0VYVEVOVCkgeworCQlkZXZfZXJyKGRldiwgIkZhaWxlZCB0byByZWFkIHRpbWVcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlkZXZfZGJnKGRldiwgIlBDRl9USU1FOiAlMDJ4LiUwMnguJTAyeCAlMDJ4OiUwMng6JTAyeFxuIiwKKwkJcGNmX3RtLnRpbWVbUENGNTA2MzNfVElfREFZXSwKKwkJcGNmX3RtLnRpbWVbUENGNTA2MzNfVElfTU9OVEhdLAorCQlwY2ZfdG0udGltZVtQQ0Y1MDYzM19USV9ZRUFSXSwKKwkJcGNmX3RtLnRpbWVbUENGNTA2MzNfVElfSE9VUl0sCisJCXBjZl90bS50aW1lW1BDRjUwNjMzX1RJX01JTl0sCisJCXBjZl90bS50aW1lW1BDRjUwNjMzX1RJX1NFQ10pOworCisJcGNmMnJ0Y190aW1lKHRtLCAmcGNmX3RtKTsKKworCWRldl9kYmcoZGV2LCAiUlRDX1RJTUU6ICV1LiV1LiV1ICV1OiV1OiV1XG4iLAorCQl0bS0+dG1fbWRheSwgdG0tPnRtX21vbiwgdG0tPnRtX3llYXIsCisJCXRtLT50bV9ob3VyLCB0bS0+dG1fbWluLCB0bS0+dG1fc2VjKTsKKworCXJldHVybiBydGNfdmFsaWRfdG0odG0pOworfQorCitzdGF0aWMgaW50IHBjZjUwNjMzX3J0Y19zZXRfdGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqdG0pCit7CisJc3RydWN0IHBjZjUwNjMzX3J0YyAqcnRjOworCXN0cnVjdCBwY2Y1MDYzM190aW1lIHBjZl90bTsKKwlpbnQgc2Vjb25kX21hc2tlZCwgYWxhcm1fbWFza2VkLCByZXQgPSAwOworCisJcnRjID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisKKwlkZXZfZGJnKGRldiwgIlJUQ19USU1FOiAldS4ldS4ldSAldToldToldVxuIiwKKwkJdG0tPnRtX21kYXksIHRtLT50bV9tb24sIHRtLT50bV95ZWFyLAorCQl0bS0+dG1faG91ciwgdG0tPnRtX21pbiwgdG0tPnRtX3NlYyk7CisKKwlydGMycGNmX3RpbWUoJnBjZl90bSwgdG0pOworCisJZGV2X2RiZyhkZXYsICJQQ0ZfVElNRTogJTAyeC4lMDJ4LiUwMnggJTAyeDolMDJ4OiUwMnhcbiIsCisJCXBjZl90bS50aW1lW1BDRjUwNjMzX1RJX0RBWV0sCisJCXBjZl90bS50aW1lW1BDRjUwNjMzX1RJX01PTlRIXSwKKwkJcGNmX3RtLnRpbWVbUENGNTA2MzNfVElfWUVBUl0sCisJCXBjZl90bS50aW1lW1BDRjUwNjMzX1RJX0hPVVJdLAorCQlwY2ZfdG0udGltZVtQQ0Y1MDYzM19USV9NSU5dLAorCQlwY2ZfdG0udGltZVtQQ0Y1MDYzM19USV9TRUNdKTsKKworCisJc2Vjb25kX21hc2tlZCA9IHBjZjUwNjMzX2lycV9tYXNrX2dldChydGMtPnBjZiwgUENGNTA2MzNfSVJRX1NFQ09ORCk7CisJYWxhcm1fbWFza2VkID0gcGNmNTA2MzNfaXJxX21hc2tfZ2V0KHJ0Yy0+cGNmLCBQQ0Y1MDYzM19JUlFfQUxBUk0pOworCisJaWYgKCFzZWNvbmRfbWFza2VkKQorCQlwY2Y1MDYzM19pcnFfbWFzayhydGMtPnBjZiwgUENGNTA2MzNfSVJRX1NFQ09ORCk7CisJaWYgKCFhbGFybV9tYXNrZWQpCisJCXBjZjUwNjMzX2lycV9tYXNrKHJ0Yy0+cGNmLCBQQ0Y1MDYzM19JUlFfQUxBUk0pOworCisJLyogUmV0dXJucyAwIG9uIHN1Y2Nlc3MgKi8KKwlyZXQgPSBwY2Y1MDYzM193cml0ZV9ibG9jayhydGMtPnBjZiwgUENGNTA2MzNfUkVHX1JUQ1NDLAorCQkJCQkgICAgIFBDRjUwNjMzX1RJX0VYVEVOVCwKKwkJCQkJICAgICAmcGNmX3RtLnRpbWVbMF0pOworCisJaWYgKCFzZWNvbmRfbWFza2VkKQorCQlwY2Y1MDYzM19pcnFfdW5tYXNrKHJ0Yy0+cGNmLCBQQ0Y1MDYzM19JUlFfU0VDT05EKTsKKwlpZiAoIWFsYXJtX21hc2tlZCkKKwkJcGNmNTA2MzNfaXJxX3VubWFzayhydGMtPnBjZiwgUENGNTA2MzNfSVJRX0FMQVJNKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcGNmNTA2MzNfcnRjX3JlYWRfYWxhcm0oc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3drYWxybSAqYWxybSkKK3sKKwlzdHJ1Y3QgcGNmNTA2MzNfcnRjICpydGM7CisJc3RydWN0IHBjZjUwNjMzX3RpbWUgcGNmX3RtOworCWludCByZXQgPSAwOworCisJcnRjID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisKKwlhbHJtLT5lbmFibGVkID0gcnRjLT5hbGFybV9lbmFibGVkOworCisJcmV0ID0gcGNmNTA2MzNfcmVhZF9ibG9jayhydGMtPnBjZiwgUENGNTA2MzNfUkVHX1JUQ1NDQSwKKwkJCQlQQ0Y1MDYzM19USV9FWFRFTlQsICZwY2ZfdG0udGltZVswXSk7CisJaWYgKHJldCAhPSBQQ0Y1MDYzM19USV9FWFRFTlQpIHsKKwkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gcmVhZCB0aW1lXG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJcGNmMnJ0Y190aW1lKCZhbHJtLT50aW1lLCAmcGNmX3RtKTsKKworCXJldHVybiBydGNfdmFsaWRfdG0oJmFscm0tPnRpbWUpOworfQorCitzdGF0aWMgaW50IHBjZjUwNjMzX3J0Y19zZXRfYWxhcm0oc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3drYWxybSAqYWxybSkKK3sKKwlzdHJ1Y3QgcGNmNTA2MzNfcnRjICpydGM7CisJc3RydWN0IHBjZjUwNjMzX3RpbWUgcGNmX3RtOworCWludCBhbGFybV9tYXNrZWQsIHJldCA9IDA7CisKKwlydGMgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKworCXJ0YzJwY2ZfdGltZSgmcGNmX3RtLCAmYWxybS0+dGltZSk7CisKKwkvKiBkbyBsaWtlIG1rdGltZSBkb2VzIGFuZCBpZ25vcmUgdG1fd2RheSAqLworCXBjZl90bS50aW1lW1BDRjUwNjMzX1RJX1dLREFZXSA9IDc7CisKKwlhbGFybV9tYXNrZWQgPSBwY2Y1MDYzM19pcnFfbWFza19nZXQocnRjLT5wY2YsIFBDRjUwNjMzX0lSUV9BTEFSTSk7CisKKwkvKiBkaXNhYmxlIGFsYXJtIGludGVycnVwdCAqLworCWlmICghYWxhcm1fbWFza2VkKQorCQlwY2Y1MDYzM19pcnFfbWFzayhydGMtPnBjZiwgUENGNTA2MzNfSVJRX0FMQVJNKTsKKworCS8qIFJldHVybnMgMCBvbiBzdWNjZXNzICovCisJcmV0ID0gcGNmNTA2MzNfd3JpdGVfYmxvY2socnRjLT5wY2YsIFBDRjUwNjMzX1JFR19SVENTQ0EsCisJCQkJUENGNTA2MzNfVElfRVhURU5ULCAmcGNmX3RtLnRpbWVbMF0pOworCisJaWYgKCFhbGFybV9tYXNrZWQpCisJCXBjZjUwNjMzX2lycV91bm1hc2socnRjLT5wY2YsIFBDRjUwNjMzX0lSUV9BTEFSTSk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3RydWN0IHJ0Y19jbGFzc19vcHMgcGNmNTA2MzNfcnRjX29wcyA9IHsKKwkucmVhZF90aW1lCQk9IHBjZjUwNjMzX3J0Y19yZWFkX3RpbWUsCisJLnNldF90aW1lCQk9IHBjZjUwNjMzX3J0Y19zZXRfdGltZSwKKwkucmVhZF9hbGFybQkJPSBwY2Y1MDYzM19ydGNfcmVhZF9hbGFybSwKKwkuc2V0X2FsYXJtCQk9IHBjZjUwNjMzX3J0Y19zZXRfYWxhcm0sCisJLmFsYXJtX2lycV9lbmFibGUgCT0gcGNmNTA2MzNfcnRjX2FsYXJtX2lycV9lbmFibGUsCisJLnVwZGF0ZV9pcnFfZW5hYmxlIAk9IHBjZjUwNjMzX3J0Y191cGRhdGVfaXJxX2VuYWJsZSwKK307CisKK3N0YXRpYyB2b2lkIHBjZjUwNjMzX3J0Y19pcnEoaW50IGlycSwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgcGNmNTA2MzNfcnRjICpydGMgPSBkYXRhOworCisJc3dpdGNoIChpcnEpIHsKKwljYXNlIFBDRjUwNjMzX0lSUV9BTEFSTToKKwkJcnRjX3VwZGF0ZV9pcnEocnRjLT5ydGNfZGV2LCAxLCBSVENfQUYgfCBSVENfSVJRRik7CisJCWJyZWFrOworCWNhc2UgUENGNTA2MzNfSVJRX1NFQ09ORDoKKwkJcnRjX3VwZGF0ZV9pcnEocnRjLT5ydGNfZGV2LCAxLCBSVENfVUYgfCBSVENfSVJRRik7CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIGludCBfX2RldmluaXQgcGNmNTA2MzNfcnRjX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHBjZjUwNjMzX3N1YmRldl9wZGF0YSAqcGRhdGE7CisJc3RydWN0IHBjZjUwNjMzX3J0YyAqcnRjOworCisKKwlydGMgPSBremFsbG9jKHNpemVvZigqcnRjKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFydGMpCisJCXJldHVybiAtRU5PTUVNOworCisJcGRhdGEgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlydGMtPnBjZiA9IHBkYXRhLT5wY2Y7CisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgcnRjKTsKKwlydGMtPnJ0Y19kZXYgPSBydGNfZGV2aWNlX3JlZ2lzdGVyKCJwY2Y1MDYzMy1ydGMiLCAmcGRldi0+ZGV2LAorCQkJCSZwY2Y1MDYzM19ydGNfb3BzLCBUSElTX01PRFVMRSk7CisKKwlpZiAoSVNfRVJSKHJ0Yy0+cnRjX2RldikpIHsKKwkJa2ZyZWUocnRjKTsKKwkJcmV0dXJuIFBUUl9FUlIocnRjLT5ydGNfZGV2KTsKKwl9CisKKwlwY2Y1MDYzM19yZWdpc3Rlcl9pcnEocnRjLT5wY2YsIFBDRjUwNjMzX0lSUV9BTEFSTSwKKwkJCQkJcGNmNTA2MzNfcnRjX2lycSwgcnRjKTsKKwlwY2Y1MDYzM19yZWdpc3Rlcl9pcnEocnRjLT5wY2YsIFBDRjUwNjMzX0lSUV9TRUNPTkQsCisJCQkJCXBjZjUwNjMzX3J0Y19pcnEsIHJ0Yyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgcGNmNTA2MzNfcnRjX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBwY2Y1MDYzM19ydGMgKnJ0YzsKKworCXJ0YyA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCisJcGNmNTA2MzNfZnJlZV9pcnEocnRjLT5wY2YsIFBDRjUwNjMzX0lSUV9BTEFSTSk7CisJcGNmNTA2MzNfZnJlZV9pcnEocnRjLT5wY2YsIFBDRjUwNjMzX0lSUV9TRUNPTkQpOworCisJcnRjX2RldmljZV91bnJlZ2lzdGVyKHJ0Yy0+cnRjX2Rldik7CisJa2ZyZWUocnRjKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBwY2Y1MDYzM19ydGNfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gInBjZjUwNjMzLXJ0YyIsCisJfSwKKwkucHJvYmUgPSBwY2Y1MDYzM19ydGNfcHJvYmUsCisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKHBjZjUwNjMzX3J0Y19yZW1vdmUpLAorfTsKKworc3RhdGljIGludCBfX2luaXQgcGNmNTA2MzNfcnRjX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZwY2Y1MDYzM19ydGNfZHJpdmVyKTsKK30KK21vZHVsZV9pbml0KHBjZjUwNjMzX3J0Y19pbml0KTsKKworc3RhdGljIHZvaWQgX19leGl0IHBjZjUwNjMzX3J0Y19leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnBjZjUwNjMzX3J0Y19kcml2ZXIpOworfQorbW9kdWxlX2V4aXQocGNmNTA2MzNfcnRjX2V4aXQpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIlBDRjUwNjMzIFJUQyBkcml2ZXIiKTsKK01PRFVMRV9BVVRIT1IoIkJhbGFqaSBSYW8gPGJhbGFqaXJyYW9Ab3Blbm1va28ub3JnPiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3J0Yy9ydGMtcHhhLmMgYi9kcml2ZXJzL3J0Yy9ydGMtcHhhLmMKaW5kZXggY2M3ZWI4Ny4uYmQ1NmEwMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ydGMvcnRjLXB4YS5jCisrKyBiL2RyaXZlcnMvcnRjL3J0Yy1weGEuYwpAQCAtMjcsNiArMjcsOCBAQAogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAKKyNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CisKICNkZWZpbmUgVElNRVJfRlJFUQkJQ0xPQ0tfVElDS19SQVRFCiAjZGVmaW5lIFJUQ19ERUZfRElWSURFUgkJKDMyNzY4IC0gMSkKICNkZWZpbmUgUlRDX0RFRl9UUklNCQkwCmRpZmYgLS1naXQgYS9kcml2ZXJzL3J0Yy9ydGMtc3RrMTd0YTguYyBiL2RyaXZlcnMvcnRjL3J0Yy1zdGsxN3RhOC5jCmluZGV4IGRjMGI2MjIuLjdkMTU0N2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcnRjL3J0Yy1zdGsxN3RhOC5jCisrKyBiL2RyaXZlcnMvcnRjL3J0Yy1zdGsxN3RhOC5jCkBAIC0zOTksNyArMzk5LDcgQEAKIAogc3RhdGljIF9fZXhpdCB2b2lkIHN0azE3dGE4X2V4aXQodm9pZCkKIHsKLQlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnN0azE3dGE4X3J0Y19kcml2ZXIpOworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZzdGsxN3RhOF9ydGNfZHJpdmVyKTsKIH0KIAogbW9kdWxlX2luaXQoc3RrMTd0YThfaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3J0Yy9ydGMtdHdsNDAzMC5jIGIvZHJpdmVycy9ydGMvcnRjLXR3bDQwMzAuYwppbmRleCA4Y2U1Zjc0Li5hZDM1Zjc2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3J0Yy9ydGMtdHdsNDAzMC5jCisrKyBiL2RyaXZlcnMvcnRjL3J0Yy10d2w0MDMwLmMKQEAgLTEyMCw3ICsxMjAsNyBAQAogc3RhdGljIHVuc2lnbmVkIGNoYXIgcnRjX2lycV9iaXRzOwogCiAvKgotICogRW5hYmxlIHRpbWVyIGFuZC9vciBhbGFybSBpbnRlcnJ1cHRzLgorICogRW5hYmxlIDEvc2Vjb25kIHVwZGF0ZSBhbmQvb3IgYWxhcm0gaW50ZXJydXB0cy4KICAqLwogc3RhdGljIGludCBzZXRfcnRjX2lycV9iaXQodW5zaWduZWQgY2hhciBiaXQpCiB7CkBAIC0xMjgsNiArMTI4LDcgQEAKIAlpbnQgcmV0OwogCiAJdmFsID0gcnRjX2lycV9iaXRzIHwgYml0OworCXZhbCAmPSB+QklUX1JUQ19JTlRFUlJVUFRTX1JFR19FVkVSWV9NOwogCXJldCA9IHR3bDQwMzBfcnRjX3dyaXRlX3U4KHZhbCwgUkVHX1JUQ19JTlRFUlJVUFRTX1JFRyk7CiAJaWYgKHJldCA9PSAwKQogCQlydGNfaXJxX2JpdHMgPSB2YWw7CkBAIC0xMzYsNyArMTM3LDcgQEAKIH0KIAogLyoKLSAqIERpc2FibGUgdGltZXIgYW5kL29yIGFsYXJtIGludGVycnVwdHMuCisgKiBEaXNhYmxlIHVwZGF0ZSBhbmQvb3IgYWxhcm0gaW50ZXJydXB0cy4KICAqLwogc3RhdGljIGludCBtYXNrX3J0Y19pcnFfYml0KHVuc2lnbmVkIGNoYXIgYml0KQogewpAQCAtMTUxLDcgKzE1Miw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgdHdsNDAzMF9ydGNfYWxhcm1faXJxX3NldF9zdGF0ZShpbnQgZW5hYmxlZCkKK3N0YXRpYyBpbnQgdHdsNDAzMF9ydGNfYWxhcm1faXJxX2VuYWJsZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGVuYWJsZWQpCiB7CiAJaW50IHJldDsKIApAQCAtMTYzLDcgKzE2NCw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgdHdsNDAzMF9ydGNfaXJxX3NldF9zdGF0ZShpbnQgZW5hYmxlZCkKK3N0YXRpYyBpbnQgdHdsNDAzMF9ydGNfdXBkYXRlX2lycV9lbmFibGUoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBlbmFibGVkKQogewogCWludCByZXQ7CiAKQEAgLTI5Miw3ICsyOTMsNyBAQAogCXVuc2lnbmVkIGNoYXIgYWxhcm1fZGF0YVtBTExfVElNRV9SRUdTICsgMV07CiAJaW50IHJldDsKIAotCXJldCA9IHR3bDQwMzBfcnRjX2FsYXJtX2lycV9zZXRfc3RhdGUoMCk7CisJcmV0ID0gdHdsNDAzMF9ydGNfYWxhcm1faXJxX2VuYWJsZShkZXYsIDApOwogCWlmIChyZXQpCiAJCWdvdG8gb3V0OwogCkBAIC0zMTIsMzUgKzMxMywxMSBAQAogCX0KIAogCWlmIChhbG0tPmVuYWJsZWQpCi0JCXJldCA9IHR3bDQwMzBfcnRjX2FsYXJtX2lycV9zZXRfc3RhdGUoMSk7CisJCXJldCA9IHR3bDQwMzBfcnRjX2FsYXJtX2lycV9lbmFibGUoZGV2LCAxKTsKIG91dDoKIAlyZXR1cm4gcmV0OwogfQogCi0jaWZkZWYJQ09ORklHX1JUQ19JTlRGX0RFVgotCi1zdGF0aWMgaW50IHR3bDQwMzBfcnRjX2lvY3RsKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IGNtZCwKLQkJCSAgICAgdW5zaWduZWQgbG9uZyBhcmcpCi17Ci0Jc3dpdGNoIChjbWQpIHsKLQljYXNlIFJUQ19BSUVfT0ZGOgotCQlyZXR1cm4gdHdsNDAzMF9ydGNfYWxhcm1faXJxX3NldF9zdGF0ZSgwKTsKLQljYXNlIFJUQ19BSUVfT046Ci0JCXJldHVybiB0d2w0MDMwX3J0Y19hbGFybV9pcnFfc2V0X3N0YXRlKDEpOwotCWNhc2UgUlRDX1VJRV9PRkY6Ci0JCXJldHVybiB0d2w0MDMwX3J0Y19pcnFfc2V0X3N0YXRlKDApOwotCWNhc2UgUlRDX1VJRV9PTjoKLQkJcmV0dXJuIHR3bDQwMzBfcnRjX2lycV9zZXRfc3RhdGUoMSk7Ci0KLQlkZWZhdWx0OgotCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOwotCX0KLX0KLQotI2Vsc2UKLSNkZWZpbmUJdHdsNDAzMF9ydGNfaW9jdGwJTlVMTAotI2VuZGlmCi0KIHN0YXRpYyBpcnFyZXR1cm5fdCB0d2w0MDMwX3J0Y19pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqcnRjKQogewogCXVuc2lnbmVkIGxvbmcgZXZlbnRzID0gMDsKQEAgLTQwMCwxMSArMzc3LDEyIEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgcnRjX2NsYXNzX29wcyB0d2w0MDMwX3J0Y19vcHMgPSB7Ci0JLmlvY3RsCQk9IHR3bDQwMzBfcnRjX2lvY3RsLAogCS5yZWFkX3RpbWUJPSB0d2w0MDMwX3J0Y19yZWFkX3RpbWUsCiAJLnNldF90aW1lCT0gdHdsNDAzMF9ydGNfc2V0X3RpbWUsCiAJLnJlYWRfYWxhcm0JPSB0d2w0MDMwX3J0Y19yZWFkX2FsYXJtLAogCS5zZXRfYWxhcm0JPSB0d2w0MDMwX3J0Y19zZXRfYWxhcm0sCisJLmFsYXJtX2lycV9lbmFibGUgPSB0d2w0MDMwX3J0Y19hbGFybV9pcnFfZW5hYmxlLAorCS51cGRhdGVfaXJxX2VuYWJsZSA9IHR3bDQwMzBfcnRjX3VwZGF0ZV9pcnFfZW5hYmxlLAogfTsKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KQEAgLTQyMiw3ICs0MDAsNyBAQAogCXJ0YyA9IHJ0Y19kZXZpY2VfcmVnaXN0ZXIocGRldi0+bmFtZSwKIAkJCQkgICZwZGV2LT5kZXYsICZ0d2w0MDMwX3J0Y19vcHMsIFRISVNfTU9EVUxFKTsKIAlpZiAoSVNfRVJSKHJ0YykpIHsKLQkJcmV0ID0gLUVJTlZBTDsKKwkJcmV0ID0gUFRSX0VSUihydGMpOwogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjYW4ndCByZWdpc3RlciBSVEMgZGV2aWNlLCBlcnIgJWxkXG4iLAogCQkJUFRSX0VSUihydGMpKTsKIAkJZ290byBvdXQwOwpAQCAtNDMyLDcgKzQxMCw2IEBACiAJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgcnRjKTsKIAogCXJldCA9IHR3bDQwMzBfcnRjX3JlYWRfdTgoJnJkX3JlZywgUkVHX1JUQ19TVEFUVVNfUkVHKTsKLQogCWlmIChyZXQgPCAwKQogCQlnb3RvIG91dDE7CiAKQEAgLTQ3NSw3ICs0NTIsNiBAQAogCiAJcmV0dXJuIHJldDsKIAotCiBvdXQyOgogCWZyZWVfaXJxKGlycSwgcnRjKTsKIG91dDE6CkBAIC01MDYsOCArNDgyLDkgQEAKIAogc3RhdGljIHZvaWQgdHdsNDAzMF9ydGNfc2h1dGRvd24oc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKLQltYXNrX3J0Y19pcnFfYml0KEJJVF9SVENfSU5URVJSVVBUU19SRUdfSVRfVElNRVJfTSB8Ci0JCQkgQklUX1JUQ19JTlRFUlJVUFRTX1JFR19JVF9BTEFSTV9NKTsKKwkvKiBtYXNrIHRpbWVyIGludGVycnVwdHMsIGJ1dCBsZWF2ZSBhbGFybSBpbnRlcnJ1cHRzIG9uIHRvIGVuYWJsZQorCSAgIHBvd2VyLW9uIHdoZW4gYWxhcm0gaXMgdHJpZ2dlcmVkICovCisJbWFza19ydGNfaXJxX2JpdChCSVRfUlRDX0lOVEVSUlVQVFNfUkVHX0lUX1RJTUVSX00pOwogfQogCiAjaWZkZWYgQ09ORklHX1BNCmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZC5jIGIvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2QuYwppbmRleCA1NzBhZTU5Li5iZDU5MTQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZC5jCisrKyBiL2RyaXZlcnMvczM5MC9ibG9jay9kYXNkLmMKQEAgLTMzNiw2ICszMzYsOSBAQAogZGFzZF9zdGF0ZV9yZWFkeV90b19vbmxpbmUoc3RydWN0IGRhc2RfZGV2aWNlICogZGV2aWNlKQogewogCWludCByYzsKKwlzdHJ1Y3QgZ2VuZGlzayAqZGlzazsKKwlzdHJ1Y3QgZGlza19wYXJ0X2l0ZXIgcGl0ZXI7CisJc3RydWN0IGhkX3N0cnVjdCAqcGFydDsKIAogCWlmIChkZXZpY2UtPmRpc2NpcGxpbmUtPnJlYWR5X3RvX29ubGluZSkgewogCQlyYyA9IGRldmljZS0+ZGlzY2lwbGluZS0+cmVhZHlfdG9fb25saW5lKGRldmljZSk7CkBAIC0zNDMsOCArMzQ2LDE0IEBACiAJCQlyZXR1cm4gcmM7CiAJfQogCWRldmljZS0+c3RhdGUgPSBEQVNEX1NUQVRFX09OTElORTsKLQlpZiAoZGV2aWNlLT5ibG9jaykKKwlpZiAoZGV2aWNlLT5ibG9jaykgewogCQlkYXNkX3NjaGVkdWxlX2Jsb2NrX2JoKGRldmljZS0+YmxvY2spOworCQlkaXNrID0gZGV2aWNlLT5ibG9jay0+YmRldi0+YmRfZGlzazsKKwkJZGlza19wYXJ0X2l0ZXJfaW5pdCgmcGl0ZXIsIGRpc2ssIERJU0tfUElURVJfSU5DTF9QQVJUMCk7CisJCXdoaWxlICgocGFydCA9IGRpc2tfcGFydF9pdGVyX25leHQoJnBpdGVyKSkpCisJCQlrb2JqZWN0X3VldmVudCgmcGFydF90b19kZXYocGFydCktPmtvYmosIEtPQkpfQ0hBTkdFKTsKKwkJZGlza19wYXJ0X2l0ZXJfZXhpdCgmcGl0ZXIpOworCX0KIAlyZXR1cm4gMDsKIH0KIApAQCAtMzU0LDYgKzM2Myw5IEBACiBzdGF0aWMgaW50IGRhc2Rfc3RhdGVfb25saW5lX3RvX3JlYWR5KHN0cnVjdCBkYXNkX2RldmljZSAqZGV2aWNlKQogewogCWludCByYzsKKwlzdHJ1Y3QgZ2VuZGlzayAqZGlzazsKKwlzdHJ1Y3QgZGlza19wYXJ0X2l0ZXIgcGl0ZXI7CisJc3RydWN0IGhkX3N0cnVjdCAqcGFydDsKIAogCWlmIChkZXZpY2UtPmRpc2NpcGxpbmUtPm9ubGluZV90b19yZWFkeSkgewogCQlyYyA9IGRldmljZS0+ZGlzY2lwbGluZS0+b25saW5lX3RvX3JlYWR5KGRldmljZSk7CkBAIC0zNjEsNiArMzczLDEzIEBACiAJCQlyZXR1cm4gcmM7CiAJfQogCWRldmljZS0+c3RhdGUgPSBEQVNEX1NUQVRFX1JFQURZOworCWlmIChkZXZpY2UtPmJsb2NrKSB7CisJCWRpc2sgPSBkZXZpY2UtPmJsb2NrLT5iZGV2LT5iZF9kaXNrOworCQlkaXNrX3BhcnRfaXRlcl9pbml0KCZwaXRlciwgZGlzaywgRElTS19QSVRFUl9JTkNMX1BBUlQwKTsKKwkJd2hpbGUgKChwYXJ0ID0gZGlza19wYXJ0X2l0ZXJfbmV4dCgmcGl0ZXIpKSkKKwkJCWtvYmplY3RfdWV2ZW50KCZwYXJ0X3RvX2RldihwYXJ0KS0+a29iaiwgS09CSl9DSEFOR0UpOworCQlkaXNrX3BhcnRfaXRlcl9leGl0KCZwaXRlcik7CisJfQogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZF8zOTkwX2VycC5jIGIvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2RfMzk5MF9lcnAuYwppbmRleCBiOGY5YzAwLi5kODJhYWQ1MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2RfMzk5MF9lcnAuYworKysgYi9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZF8zOTkwX2VycC5jCkBAIC0yNjIxLDcgKzI2MjEsNyBAQAogCQl9CiAJfQogCi0JLyogZG91YmxlLWNoZWNrIGlmIGN1cnJlbnQgZXJwL2NxciB3YXMgc3VjY2Vzc2Z1bGwgKi8KKwkvKiBkb3VibGUtY2hlY2sgaWYgY3VycmVudCBlcnAvY3FyIHdhcyBzdWNjZXNzZnVsICovCiAJaWYgKChjcXItPmlyYi5zY3N3LmNtZC5jc3RhdCA9PSAweDAwKSAmJgogCSAgICAoY3FyLT5pcmIuc2Nzdy5jbWQuZHN0YXQgPT0KIAkgICAgIChERVZfU1RBVF9DSE5fRU5EIHwgREVWX1NUQVRfREVWX0VORCkpKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZF9kZXZtYXAuYyBiL2RyaXZlcnMvczM5MC9ibG9jay9kYXNkX2Rldm1hcC5jCmluZGV4IDJlZjI1NzMuLjMwMGUyOGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9ibG9jay9kYXNkX2Rldm1hcC5jCisrKyBiL2RyaXZlcnMvczM5MC9ibG9jay9kYXNkX2Rldm1hcC5jCkBAIC0yMDYsNiArMjA2LDggQEAKIAkJCWZlYXR1cmVzIHw9IERBU0RfRkVBVFVSRV9VU0VESUFHOwogCQllbHNlIGlmIChsZW4gPT0gNiAmJiAhc3RybmNtcChzdHIsICJlcnBsb2ciLCA2KSkKIAkJCWZlYXR1cmVzIHw9IERBU0RfRkVBVFVSRV9FUlBMT0c7CisJCWVsc2UgaWYgKGxlbiA9PSA4ICYmICFzdHJuY21wKHN0ciwgImZhaWxmYXN0IiwgOCkpCisJCQlmZWF0dXJlcyB8PSBEQVNEX0ZFQVRVUkVfRkFJTEZBU1Q7CiAJCWVsc2UgewogCQkJTUVTU0FHRShLRVJOX1dBUk5JTkcsCiAJCQkJInVuc3VwcG9ydGVkIGZlYXR1cmU6ICUqcywgIgpAQCAtNjY3LDYgKzY2OSw1MSBAQAogICovCiAKIC8qCisgKiBmYWlsZmFzdCBjb250cm9scyB0aGUgYmVoYXZpb3VyLCBpZiBubyBwYXRoIGlzIGF2YWlsYWJsZQorICovCitzdGF0aWMgc3NpemVfdCBkYXNkX2ZmX3Nob3coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgICBjaGFyICpidWYpCit7CisJc3RydWN0IGRhc2RfZGV2bWFwICpkZXZtYXA7CisJaW50IGZmX2ZsYWc7CisKKwlkZXZtYXAgPSBkYXNkX2ZpbmRfYnVzaWQoZGV2LT5idXNfaWQpOworCWlmICghSVNfRVJSKGRldm1hcCkpCisJCWZmX2ZsYWcgPSAoZGV2bWFwLT5mZWF0dXJlcyAmIERBU0RfRkVBVFVSRV9GQUlMRkFTVCkgIT0gMDsKKwllbHNlCisJCWZmX2ZsYWcgPSAoREFTRF9GRUFUVVJFX0RFRkFVTFQgJiBEQVNEX0ZFQVRVUkVfRkFJTEZBU1QpICE9IDA7CisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCBmZl9mbGFnID8gIjFcbiIgOiAiMFxuIik7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGRhc2RfZmZfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkgICAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgZGFzZF9kZXZtYXAgKmRldm1hcDsKKwlpbnQgdmFsOworCWNoYXIgKmVuZHA7CisKKwlkZXZtYXAgPSBkYXNkX2Rldm1hcF9mcm9tX2NkZXYodG9fY2N3ZGV2KGRldikpOworCWlmIChJU19FUlIoZGV2bWFwKSkKKwkJcmV0dXJuIFBUUl9FUlIoZGV2bWFwKTsKKworCXZhbCA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgJmVuZHAsIDApOworCWlmICgoKGVuZHAgKyAxKSA8IChidWYgKyBjb3VudCkpIHx8ICh2YWwgPiAxKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzcGluX2xvY2soJmRhc2RfZGV2bWFwX2xvY2spOworCWlmICh2YWwpCisJCWRldm1hcC0+ZmVhdHVyZXMgfD0gREFTRF9GRUFUVVJFX0ZBSUxGQVNUOworCWVsc2UKKwkJZGV2bWFwLT5mZWF0dXJlcyAmPSB+REFTRF9GRUFUVVJFX0ZBSUxGQVNUOworCWlmIChkZXZtYXAtPmRldmljZSkKKwkJZGV2bWFwLT5kZXZpY2UtPmZlYXR1cmVzID0gZGV2bWFwLT5mZWF0dXJlczsKKwlzcGluX3VubG9jaygmZGFzZF9kZXZtYXBfbG9jayk7CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgREVWSUNFX0FUVFIoZmFpbGZhc3QsIDA2NDQsIGRhc2RfZmZfc2hvdywgZGFzZF9mZl9zdG9yZSk7CisKKy8qCiAgKiByZWFkb25seSBjb250cm9scyB0aGUgcmVhZG9ubHkgc3RhdHVzIG9mIGEgZGFzZAogICovCiBzdGF0aWMgc3NpemVfdApAQCAtMTAyMCw2ICsxMDY3LDcgQEAKIAkmZGV2X2F0dHJfdXNlX2RpYWcuYXR0ciwKIAkmZGV2X2F0dHJfZWVyX2VuYWJsZWQuYXR0ciwKIAkmZGV2X2F0dHJfZXJwbG9nLmF0dHIsCisJJmRldl9hdHRyX2ZhaWxmYXN0LmF0dHIsCiAJTlVMTCwKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9ibG9jay9kYXNkX2RpYWcuYyBiL2RyaXZlcnMvczM5MC9ibG9jay9kYXNkX2RpYWcuYwppbmRleCA3ODQ0NDYxLi5lZjJhNTY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZF9kaWFnLmMKKysrIGIvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2RfZGlhZy5jCkBAIC01NDQsNyArNTQ0LDggQEAKIAl9CiAJY3FyLT5yZXRyaWVzID0gRElBR19NQVhfUkVUUklFUzsKIAljcXItPmJ1aWxkY2xrID0gZ2V0X2Nsb2NrKCk7Ci0JaWYgKGJsa19ub3JldHJ5X3JlcXVlc3QocmVxKSkKKwlpZiAoYmxrX25vcmV0cnlfcmVxdWVzdChyZXEpIHx8CisJICAgIGJsb2NrLT5iYXNlLT5mZWF0dXJlcyAmIERBU0RfRkVBVFVSRV9GQUlMRkFTVCkKIAkJc2V0X2JpdChEQVNEX0NRUl9GTEFHU19GQUlMRkFTVCwgJmNxci0+ZmxhZ3MpOwogCWNxci0+c3RhcnRkZXYgPSBtZW1kZXY7CiAJY3FyLT5tZW1kZXYgPSBtZW1kZXY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZF9lY2tkLmMgYi9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZF9lY2tkLmMKaW5kZXggYmQyYzUyZS4uYmRiODc5OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2RfZWNrZC5jCisrKyBiL2RyaXZlcnMvczM5MC9ibG9jay9kYXNkX2Vja2QuYwpAQCAtMTcwMCw3ICsxNzAwLDggQEAKIAkJCXJlY2lkKys7CiAJCX0KIAl9Ci0JaWYgKGJsa19ub3JldHJ5X3JlcXVlc3QocmVxKSkKKwlpZiAoYmxrX25vcmV0cnlfcmVxdWVzdChyZXEpIHx8CisJICAgIGJsb2NrLT5iYXNlLT5mZWF0dXJlcyAmIERBU0RfRkVBVFVSRV9GQUlMRkFTVCkKIAkJc2V0X2JpdChEQVNEX0NRUl9GTEFHU19GQUlMRkFTVCwgJmNxci0+ZmxhZ3MpOwogCWNxci0+c3RhcnRkZXYgPSBzdGFydGRldjsKIAljcXItPm1lbWRldiA9IHN0YXJ0ZGV2OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2RfZWVyLmMgYi9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZF9lZXIuYwppbmRleCA4OTJlMjg3Li5mOGUwNWNlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZF9lZXIuYworKysgYi9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZF9lZXIuYwpAQCAtNTM1LDggKzUzNSw4IEBACiAJICAgIGVlcmItPmJ1ZmZlcl9wYWdlX2NvdW50ID4gSU5UX01BWCAvIFBBR0VfU0laRSkgewogCQlrZnJlZShlZXJiKTsKIAkJTUVTU0FHRShLRVJOX1dBUk5JTkcsICJjYW4ndCBvcGVuIGRldmljZSBzaW5jZSBtb2R1bGUgIgotCQkJInBhcmFtZXRlciBlZXJfcGFnZXMgaXMgc21hbGxlciB0aGVuIDEgb3IiCi0JCQkiIGJpZ2dlciB0aGVuICVkIiwgKGludCkoSU5UX01BWCAvIFBBR0VfU0laRSkpOworCQkJInBhcmFtZXRlciBlZXJfcGFnZXMgaXMgc21hbGxlciB0aGFuIDEgb3IiCisJCQkiIGJpZ2dlciB0aGFuICVkIiwgKGludCkoSU5UX01BWCAvIFBBR0VfU0laRSkpOwogCQl1bmxvY2tfa2VybmVsKCk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9ibG9jay9kYXNkX2ZiYS5jIGIvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2RfZmJhLmMKaW5kZXggN2Q0NDJhZS4uZjFkMTc2MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2RfZmJhLmMKKysrIGIvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2RfZmJhLmMKQEAgLTM1NSw3ICszNTUsOCBAQAogCQkJcmVjaWQrKzsKIAkJfQogCX0KLQlpZiAoYmxrX25vcmV0cnlfcmVxdWVzdChyZXEpKQorCWlmIChibGtfbm9yZXRyeV9yZXF1ZXN0KHJlcSkgfHwKKwkgICAgYmxvY2stPmJhc2UtPmZlYXR1cmVzICYgREFTRF9GRUFUVVJFX0ZBSUxGQVNUKQogCQlzZXRfYml0KERBU0RfQ1FSX0ZMQUdTX0ZBSUxGQVNULCAmY3FyLT5mbGFncyk7CiAJY3FyLT5zdGFydGRldiA9IG1lbWRldjsKIAljcXItPm1lbWRldiA9IG1lbWRldjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9ibG9jay9kYXNkX2ludC5oIGIvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2RfaW50LmgKaW5kZXggMDVhMTQ1My4uNGEzOTA4NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2RfaW50LmgKKysrIGIvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2RfaW50LmgKQEAgLTE5OSw3ICsxOTksNyBAQAogI2RlZmluZSBEQVNEX0NRUl9FUlJPUgkJMHg4MgkvKiByZXF1ZXN0IGlzIGNvbXBsZXRlZCB3aXRoIGVycm9yICovCiAjZGVmaW5lIERBU0RfQ1FSX0NMRUFSX1BFTkRJTkcJMHg4MwkvKiByZXF1ZXN0IGlzIGNsZWFyIHBlbmRpbmcgKi8KICNkZWZpbmUgREFTRF9DUVJfQ0xFQVJFRAkweDg0CS8qIHJlcXVlc3Qgd2FzIGNsZWFyZWQgKi8KLSNkZWZpbmUgREFTRF9DUVJfU1VDQ0VTUwkweDg1CS8qIHJlcXVlc3Qgd2FzIHN1Y2Nlc3NmdWxsICovCisjZGVmaW5lIERBU0RfQ1FSX1NVQ0NFU1MJMHg4NQkvKiByZXF1ZXN0IHdhcyBzdWNjZXNzZnVsICovCiAKIAogLyogcGVyIGRhc2RfY2N3X3JlcSBmbGFncyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2NoYXIvS2NvbmZpZyBiL2RyaXZlcnMvczM5MC9jaGFyL0tjb25maWcKaW5kZXggNjQzMDMzOC4uMDc2OWNlZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2NoYXIvS2NvbmZpZworKysgYi9kcml2ZXJzL3MzOTAvY2hhci9LY29uZmlnCkBAIC0xMDAsNyArMTAwLDcgQEAKIAogY29uZmlnIFMzOTBfVEFQRV9CTE9DSwogCWJvb2wgIlN1cHBvcnQgZm9yIHRhcGUgYmxvY2sgZGV2aWNlcyIKLQlkZXBlbmRzIG9uIFMzOTBfVEFQRQorCWRlcGVuZHMgb24gUzM5MF9UQVBFICYmIEJMT0NLCiAJaGVscAogCSAgU2VsZWN0IHRoaXMgb3B0aW9uIGlmIHlvdSB3YW50IHRvIGFjY2VzcyB5b3VyIGNoYW5uZWwtYXR0YWNoZWQgdGFwZQogCSAgZGV2aWNlcyB1c2luZyB0aGUgYmxvY2sgZGV2aWNlIGludGVyZmFjZS4gIFRoaXMgaW50ZXJmYWNlIGlzIHNpbWlsYXIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaGFyL3RhcGVfMzU5MC5jIGIvZHJpdmVycy9zMzkwL2NoYXIvdGFwZV8zNTkwLmMKaW5kZXggNDAwNWM0NC4uNzE2MDVhMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2NoYXIvdGFwZV8zNTkwLmMKKysrIGIvZHJpdmVycy9zMzkwL2NoYXIvdGFwZV8zNTkwLmMKQEAgLTgwMSw3ICs4MDEsNyBAQAogc3RhdGljIGlubGluZSBpbnQKIHRhcGVfMzU5MF9lcnBfc3VjY2VkZWQoc3RydWN0IHRhcGVfZGV2aWNlICpkZXZpY2UsIHN0cnVjdCB0YXBlX3JlcXVlc3QgKnJlcXVlc3QpCiB7Ci0JREJGX0VWRU5UKDMsICJFcnJvciBSZWNvdmVyeSBzdWNjZXNzZnVsbCBmb3IgJXNcbiIsCisJREJGX0VWRU5UKDMsICJFcnJvciBSZWNvdmVyeSBzdWNjZXNzZnVsIGZvciAlc1xuIiwKIAkJICB0YXBlX29wX3ZlcmJvc2VbcmVxdWVzdC0+b3BdKTsKIAlyZXR1cm4gdGFwZV8zNTkwX2RvbmUoZGV2aWNlLCByZXF1ZXN0KTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaGFyL3ZtbG9ncmRyLmMgYi9kcml2ZXJzL3MzOTAvY2hhci92bWxvZ3Jkci5jCmluZGV4IGFhYmJlYjkuLmQ4YTIyODkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9jaGFyL3ZtbG9ncmRyLmMKKysrIGIvZHJpdmVycy9zMzkwL2NoYXIvdm1sb2dyZHIuYwpAQCAtNDI3LDcgKzQyNyw3IEBACiAJCQlidWZmZXIgPSBwcml2LT5idWZmZXIgKyBzaXplb2YoaW50KTsKIAkJfQogCQkvKgotCQkgKiBJZiB0aGUgcmVjb3JkIGlzIGJpZ2dlciB0aGVuIG91ciBidWZmZXIsIHdlIHJlY2VpdmUgb25seQorCQkgKiBJZiB0aGUgcmVjb3JkIGlzIGJpZ2dlciB0aGFuIG91ciBidWZmZXIsIHdlIHJlY2VpdmUgb25seQogCQkgKiBhIHBhcnQgb2YgaXQuIFdlIGNhbiBnZXQgdGhlIHJlc3QgbGF0ZXIuCiAJCSAqLwogCQlpZiAoaXVjdl9kYXRhX2NvdW50ID4gTkVUX0JVRkZFUl9TSVpFKQpAQCAtNDM3LDcgKzQzNyw3IEBACiAJCQkJCSAgMCwgYnVmZmVyLCBpdWN2X2RhdGFfY291bnQsCiAJCQkJCSAgJnByaXYtPnJlc2lkdWFsX2xlbmd0aCk7CiAJCXNwaW5fdW5sb2NrX2JoKCZwcml2LT5wcml2X2xvY2spOwotCQkvKiBBbiByYyBvZiA1IGluZGljYXRlcyB0aGF0IHRoZSByZWNvcmQgd2FzIGJpZ2dlciB0aGVuCisJCS8qIEFuIHJjIG9mIDUgaW5kaWNhdGVzIHRoYXQgdGhlIHJlY29yZCB3YXMgYmlnZ2VyIHRoYW4KIAkJICogdGhlIGJ1ZmZlciwgd2hpY2ggaXMgT0sgZm9yIHVzLiBBIDkgaW5kaWNhdGVzIHRoYXQgdGhlCiAJCSAqIHJlY29yZCB3YXMgcHVyZ2VkIGJlZm9yIHdlIGNvdWxkIHJlY2VpdmUgaXQuCiAJCSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2Npby9jaW8uYyBiL2RyaXZlcnMvczM5MC9jaW8vY2lvLmMKaW5kZXggMDZiNzE4Mi4uNjU5ZjhhNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2Npby9jaW8uYworKysgYi9kcml2ZXJzL3MzOTAvY2lvL2Npby5jCkBAIC0zNzksNyArMzc5LDcgQEAKIAkJaWYgKGNjb2RlIDwgMCkgLyogLUVJTyBpZiBtc2NoIGdldHMgYSBwcm9ncmFtIGNoZWNrLiAqLwogCQkJcmV0dXJuIGNjb2RlOwogCQlzd2l0Y2ggKGNjb2RlKSB7Ci0JCWNhc2UgMDogLyogc3VjY2Vzc2Z1bGwgKi8KKwkJY2FzZSAwOiAvKiBzdWNjZXNzZnVsICovCiAJCQlpZiAoc3RzY2goc2NoLT5zY2hpZCwgJnNjaGliKSB8fAogCQkJICAgICFjc3Nfc2NoX2lzX3ZhbGlkKCZzY2hpYikpCiAJCQkJcmV0dXJuIC1FTk9ERVY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY2lvL3FkaW9fZGVidWcuYyBiL2RyaXZlcnMvczM5MC9jaW8vcWRpb19kZWJ1Zy5jCmluZGV4IGY4YTNiNjkuLmRhN2FmYjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9jaW8vcWRpb19kZWJ1Zy5jCisrKyBiL2RyaXZlcnMvczM5MC9jaW8vcWRpb19kZWJ1Zy5jCkBAIC0xNjksNiArMTY5LDggQEAKIAkJIHEtPm5yKTsKIAlkZWJ1Z2ZzX3F1ZXVlc1tpXSA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUobmFtZSwgU19JRlJFRyB8IFNfSVJVR08gfCBTX0lXVVNSLAogCQkJCQkJZGVidWdmc19yb290LCBxLCAmZGVidWdmc19mb3BzKTsKKwlpZiAoSVNfRVJSKGRlYnVnZnNfcXVldWVzW2ldKSkKKwkJZGVidWdmc19xdWV1ZXNbaV0gPSBOVUxMOwogfQogCiB2b2lkIHFkaW9fc2V0dXBfZGVidWdfZW50cmllcyhzdHJ1Y3QgcWRpb19pcnEgKmlycV9wdHIsIHN0cnVjdCBjY3dfZGV2aWNlICpjZGV2KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2Npby9xZGlvX21haW4uYyBiL2RyaXZlcnMvczM5MC9jaW8vcWRpb19tYWluLmMKaW5kZXggNzQ0ZjkyOC4uMTBjYjBmOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2Npby9xZGlvX21haW4uYworKysgYi9kcml2ZXJzL3MzOTAvY2lvL3FkaW9fbWFpbi5jCkBAIC0xMTQsNyArMTE0LDcgQEAKICAqIEBjb3VudDogY291bnQgb2YgYnVmZmVycyB0byBleGFtaW5lCiAgKiBAYXV0b19hY2s6IGF1dG9tYXRpY2FsbHkgYWNrbm93bGVkZ2UgYnVmZmVycwogICoKLSAqIFJldHVybnMgdGhlIG51bWJlciBvZiBzdWNjZXNzZnVsbCBleHRyYWN0ZWQgZXF1YWwgYnVmZmVyIHN0YXRlcy4KKyAqIFJldHVybnMgdGhlIG51bWJlciBvZiBzdWNjZXNzZnVsbHkgZXh0cmFjdGVkIGVxdWFsIGJ1ZmZlciBzdGF0ZXMuCiAgKiBTdG9wcyBwcm9jZXNzaW5nIGlmIGEgc3RhdGUgaXMgZGlmZmVyZW50IGZyb20gdGhlIGxhc3QgYnVmZmVycyBzdGF0ZS4KICAqLwogc3RhdGljIGludCBxZGlvX2RvX2VxYnMoc3RydWN0IHFkaW9fcSAqcSwgdW5zaWduZWQgY2hhciAqc3RhdGUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvbmV0L3FldGhfbDJfbWFpbi5jIGIvZHJpdmVycy9zMzkwL25ldC9xZXRoX2wyX21haW4uYwppbmRleCA1OTFhMmIzLi4wN2FiOGE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvbmV0L3FldGhfbDJfbWFpbi5jCisrKyBiL2RyaXZlcnMvczM5MC9uZXQvcWV0aF9sMl9tYWluLmMKQEAgLTkxNiw2ICs5MTYsMjEgQEAKIAkuZ2V0X2RydmluZm8gPSBxZXRoX2NvcmVfZ2V0X2RydmluZm8sCiB9OwogCitzdGF0aWMgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzIHFldGhfbDJfbmV0ZGV2X29wcyA9IHsKKwkubmRvX29wZW4JCT0gcWV0aF9sMl9vcGVuLAorCS5uZG9fc3RvcAkJPSBxZXRoX2wyX3N0b3AsCisJLm5kb19nZXRfc3RhdHMJCT0gcWV0aF9nZXRfc3RhdHMsCisJLm5kb19zdGFydF94bWl0CQk9IHFldGhfbDJfaGFyZF9zdGFydF94bWl0LAorCS5uZG9fdmFsaWRhdGVfYWRkcgk9IGV0aF92YWxpZGF0ZV9hZGRyLAorCS5uZG9fc2V0X211bHRpY2FzdF9saXN0ID0gcWV0aF9sMl9zZXRfbXVsdGljYXN0X2xpc3QsCisJLm5kb19kb19pb2N0bAkgICAJPSBxZXRoX2wyX2RvX2lvY3RsLAorCS5uZG9fc2V0X21hY19hZGRyZXNzICAgID0gcWV0aF9sMl9zZXRfbWFjX2FkZHJlc3MsCisJLm5kb19jaGFuZ2VfbXR1CSAgIAk9IHFldGhfY2hhbmdlX210dSwKKwkubmRvX3ZsYW5fcnhfYWRkX3ZpZAk9IHFldGhfbDJfdmxhbl9yeF9hZGRfdmlkLAorCS5uZG9fdmxhbl9yeF9raWxsX3ZpZCAgID0gcWV0aF9sMl92bGFuX3J4X2tpbGxfdmlkLAorCS5uZG9fdHhfdGltZW91dAkgICAJPSBxZXRoX3R4X3RpbWVvdXQsCit9OworCiBzdGF0aWMgaW50IHFldGhfbDJfc2V0dXBfbmV0ZGV2KHN0cnVjdCBxZXRoX2NhcmQgKmNhcmQpCiB7CiAJc3dpdGNoIChjYXJkLT5pbmZvLnR5cGUpIHsKQEAgLTkzNywxOSArOTUyLDkgQEAKIAkJcmV0dXJuIC1FTk9ERVY7CiAKIAljYXJkLT5kZXYtPm1sX3ByaXYgPSBjYXJkOwotCWNhcmQtPmRldi0+dHhfdGltZW91dCA9ICZxZXRoX3R4X3RpbWVvdXQ7CiAJY2FyZC0+ZGV2LT53YXRjaGRvZ190aW1lbyA9IFFFVEhfVFhfVElNRU9VVDsKLQljYXJkLT5kZXYtPm9wZW4gPSBxZXRoX2wyX29wZW47Ci0JY2FyZC0+ZGV2LT5zdG9wID0gcWV0aF9sMl9zdG9wOwotCWNhcmQtPmRldi0+aGFyZF9zdGFydF94bWl0ID0gcWV0aF9sMl9oYXJkX3N0YXJ0X3htaXQ7Ci0JY2FyZC0+ZGV2LT5kb19pb2N0bCA9IHFldGhfbDJfZG9faW9jdGw7Ci0JY2FyZC0+ZGV2LT5nZXRfc3RhdHMgPSBxZXRoX2dldF9zdGF0czsKLQljYXJkLT5kZXYtPmNoYW5nZV9tdHUgPSBxZXRoX2NoYW5nZV9tdHU7Ci0JY2FyZC0+ZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSBxZXRoX2wyX3NldF9tdWx0aWNhc3RfbGlzdDsKLQljYXJkLT5kZXYtPnZsYW5fcnhfa2lsbF92aWQgPSBxZXRoX2wyX3ZsYW5fcnhfa2lsbF92aWQ7Ci0JY2FyZC0+ZGV2LT52bGFuX3J4X2FkZF92aWQgPSBxZXRoX2wyX3ZsYW5fcnhfYWRkX3ZpZDsKLQljYXJkLT5kZXYtPnNldF9tYWNfYWRkcmVzcyA9IHFldGhfbDJfc2V0X21hY19hZGRyZXNzOwogCWNhcmQtPmRldi0+bXR1ID0gY2FyZC0+aW5mby5pbml0aWFsX210dTsKKwljYXJkLT5kZXYtPm5ldGRldl9vcHMgPSAmcWV0aF9sMl9uZXRkZXZfb3BzOwogCWlmIChjYXJkLT5pbmZvLnR5cGUgIT0gUUVUSF9DQVJEX1RZUEVfT1NOKQogCQlTRVRfRVRIVE9PTF9PUFMoY2FyZC0+ZGV2LCAmcWV0aF9sMl9ldGh0b29sX29wcyk7CiAJZWxzZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL25ldC9xZXRoX2wzX21haW4uYyBiL2RyaXZlcnMvczM5MC9uZXQvcWV0aF9sM19tYWluLmMKaW5kZXggNDY5M2VlNGUuLjNkMDQ5MjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9uZXQvcWV0aF9sM19tYWluLmMKKysrIGIvZHJpdmVycy9zMzkwL25ldC9xZXRoX2wzX21haW4uYwpAQCAtMTgyOSwyOCArMTgyOSw2IEBACiAKIHN0YXRpYyB2b2lkIHFldGhfbDNfdmxhbl9yeF9hZGRfdmlkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIHNob3J0IHZpZCkKIHsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqdmxhbmRldjsKLQlzdHJ1Y3QgcWV0aF9jYXJkICpjYXJkID0gZGV2LT5tbF9wcml2OwotCXN0cnVjdCBpbl9kZXZpY2UgKmluX2RldjsKLQotCWlmIChjYXJkLT5pbmZvLnR5cGUgPT0gUUVUSF9DQVJEX1RZUEVfSVFEKQotCQlyZXR1cm47Ci0KLQl2bGFuZGV2ID0gdmxhbl9ncm91cF9nZXRfZGV2aWNlKGNhcmQtPnZsYW5ncnAsIHZpZCk7Ci0JdmxhbmRldi0+bmVpZ2hfc2V0dXAgPSBxZXRoX2wzX25laWdoX3NldHVwOwotCi0JaW5fZGV2ID0gaW5fZGV2X2dldCh2bGFuZGV2KTsKLSNpZmRlZiBDT05GSUdfU1lTQ1RMCi0JbmVpZ2hfc3lzY3RsX3VucmVnaXN0ZXIoaW5fZGV2LT5hcnBfcGFybXMpOwotI2VuZGlmCi0JbmVpZ2hfcGFybXNfcmVsZWFzZSgmYXJwX3RibCwgaW5fZGV2LT5hcnBfcGFybXMpOwotCi0JaW5fZGV2LT5hcnBfcGFybXMgPSBuZWlnaF9wYXJtc19hbGxvYyh2bGFuZGV2LCAmYXJwX3RibCk7Ci0jaWZkZWYgQ09ORklHX1NZU0NUTAotCW5laWdoX3N5c2N0bF9yZWdpc3Rlcih2bGFuZGV2LCBpbl9kZXYtPmFycF9wYXJtcywgTkVUX0lQVjQsCi0JCQkgICAgICBORVRfSVBWNF9ORUlHSCwgImlwdjQiLCBOVUxMLCBOVUxMKTsKLSNlbmRpZgotCWluX2Rldl9wdXQoaW5fZGV2KTsKIAlyZXR1cm47CiB9CiAKQEAgLTI5MTYsNiArMjg5NCwzNyBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzIHFldGhfbDNfbmV0ZGV2X29wcyA9IHsKKwkubmRvX29wZW4JCT0gcWV0aF9sM19vcGVuLAorCS5uZG9fc3RvcAkJPSBxZXRoX2wzX3N0b3AsCisJLm5kb19nZXRfc3RhdHMJCT0gcWV0aF9nZXRfc3RhdHMsCisJLm5kb19zdGFydF94bWl0CQk9IHFldGhfbDNfaGFyZF9zdGFydF94bWl0LAorCS5uZG9fdmFsaWRhdGVfYWRkcgk9IGV0aF92YWxpZGF0ZV9hZGRyLAorCS5uZG9fc2V0X211bHRpY2FzdF9saXN0ID0gcWV0aF9sM19zZXRfbXVsdGljYXN0X2xpc3QsCisJLm5kb19kb19pb2N0bAkgICAJPSBxZXRoX2wzX2RvX2lvY3RsLAorCS5uZG9fY2hhbmdlX210dQkgICAJPSBxZXRoX2NoYW5nZV9tdHUsCisJLm5kb192bGFuX3J4X3JlZ2lzdGVyCT0gcWV0aF9sM192bGFuX3J4X3JlZ2lzdGVyLAorCS5uZG9fdmxhbl9yeF9hZGRfdmlkCT0gcWV0aF9sM192bGFuX3J4X2FkZF92aWQsCisJLm5kb192bGFuX3J4X2tpbGxfdmlkICAgPSBxZXRoX2wzX3ZsYW5fcnhfa2lsbF92aWQsCisJLm5kb190eF90aW1lb3V0CSAgIAk9IHFldGhfdHhfdGltZW91dCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgcWV0aF9sM19vc2FfbmV0ZGV2X29wcyA9IHsKKwkubmRvX29wZW4JCT0gcWV0aF9sM19vcGVuLAorCS5uZG9fc3RvcAkJPSBxZXRoX2wzX3N0b3AsCisJLm5kb19nZXRfc3RhdHMJCT0gcWV0aF9nZXRfc3RhdHMsCisJLm5kb19zdGFydF94bWl0CQk9IHFldGhfbDNfaGFyZF9zdGFydF94bWl0LAorCS5uZG9fdmFsaWRhdGVfYWRkcgk9IGV0aF92YWxpZGF0ZV9hZGRyLAorCS5uZG9fc2V0X211bHRpY2FzdF9saXN0ID0gcWV0aF9sM19zZXRfbXVsdGljYXN0X2xpc3QsCisJLm5kb19kb19pb2N0bAkgICAJPSBxZXRoX2wzX2RvX2lvY3RsLAorCS5uZG9fY2hhbmdlX210dQkgICAJPSBxZXRoX2NoYW5nZV9tdHUsCisJLm5kb192bGFuX3J4X3JlZ2lzdGVyCT0gcWV0aF9sM192bGFuX3J4X3JlZ2lzdGVyLAorCS5uZG9fdmxhbl9yeF9hZGRfdmlkCT0gcWV0aF9sM192bGFuX3J4X2FkZF92aWQsCisJLm5kb192bGFuX3J4X2tpbGxfdmlkICAgPSBxZXRoX2wzX3ZsYW5fcnhfa2lsbF92aWQsCisJLm5kb190eF90aW1lb3V0CSAgIAk9IHFldGhfdHhfdGltZW91dCwKKwkubmRvX25laWdoX3NldHVwCT0gcWV0aF9sM19uZWlnaF9zZXR1cCwKK307CisKIHN0YXRpYyBpbnQgcWV0aF9sM19zZXR1cF9uZXRkZXYoc3RydWN0IHFldGhfY2FyZCAqY2FyZCkKIHsKIAlpZiAoY2FyZC0+aW5mby50eXBlID09IFFFVEhfQ0FSRF9UWVBFX09TQUUpIHsKQEAgLTI5MjYsMTEgKzI5MzUsMTIgQEAKICNlbmRpZgogCQkJaWYgKCFjYXJkLT5kZXYpCiAJCQkJcmV0dXJuIC1FTk9ERVY7CisJCQljYXJkLT5kZXYtPm5ldGRldl9vcHMgPSAmcWV0aF9sM19uZXRkZXZfb3BzOwogCQl9IGVsc2UgewogCQkJY2FyZC0+ZGV2ID0gYWxsb2NfZXRoZXJkZXYoMCk7CiAJCQlpZiAoIWNhcmQtPmRldikKIAkJCQlyZXR1cm4gLUVOT0RFVjsKLQkJCWNhcmQtPmRldi0+bmVpZ2hfc2V0dXAgPSBxZXRoX2wzX25laWdoX3NldHVwOworCQkJY2FyZC0+ZGV2LT5uZXRkZXZfb3BzID0gJnFldGhfbDNfb3NhX25ldGRldl9vcHM7CiAKIAkJCS8qSVB2NiBhZGRyZXNzIGF1dG9jb25maWd1cmF0aW9uIHN0dWZmKi8KIAkJCXFldGhfbDNfZ2V0X3VuaXF1ZV9pZChjYXJkKTsKQEAgLTI5NDMsMjUgKzI5NTMsMTQgQEAKIAkJaWYgKCFjYXJkLT5kZXYpCiAJCQlyZXR1cm4gLUVOT0RFVjsKIAkJY2FyZC0+ZGV2LT5mbGFncyB8PSBJRkZfTk9BUlA7CisJCWNhcmQtPmRldi0+bmV0ZGV2X29wcyA9ICZxZXRoX2wzX25ldGRldl9vcHM7CiAJCXFldGhfbDNfaXFkX3JlYWRfaW5pdGlhbF9tYWMoY2FyZCk7CiAJfSBlbHNlCiAJCXJldHVybiAtRU5PREVWOwogCi0JY2FyZC0+ZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSBxZXRoX2wzX2hhcmRfc3RhcnRfeG1pdDsKIAljYXJkLT5kZXYtPm1sX3ByaXYgPSBjYXJkOwotCWNhcmQtPmRldi0+dHhfdGltZW91dCA9ICZxZXRoX3R4X3RpbWVvdXQ7CiAJY2FyZC0+ZGV2LT53YXRjaGRvZ190aW1lbyA9IFFFVEhfVFhfVElNRU9VVDsKLQljYXJkLT5kZXYtPm9wZW4gPSBxZXRoX2wzX29wZW47Ci0JY2FyZC0+ZGV2LT5zdG9wID0gcWV0aF9sM19zdG9wOwotCWNhcmQtPmRldi0+ZG9faW9jdGwgPSBxZXRoX2wzX2RvX2lvY3RsOwotCWNhcmQtPmRldi0+Z2V0X3N0YXRzID0gcWV0aF9nZXRfc3RhdHM7Ci0JY2FyZC0+ZGV2LT5jaGFuZ2VfbXR1ID0gcWV0aF9jaGFuZ2VfbXR1OwotCWNhcmQtPmRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gcWV0aF9sM19zZXRfbXVsdGljYXN0X2xpc3Q7Ci0JY2FyZC0+ZGV2LT52bGFuX3J4X3JlZ2lzdGVyID0gcWV0aF9sM192bGFuX3J4X3JlZ2lzdGVyOwotCWNhcmQtPmRldi0+dmxhbl9yeF9hZGRfdmlkID0gcWV0aF9sM192bGFuX3J4X2FkZF92aWQ7Ci0JY2FyZC0+ZGV2LT52bGFuX3J4X2tpbGxfdmlkID0gcWV0aF9sM192bGFuX3J4X2tpbGxfdmlkOwogCWNhcmQtPmRldi0+bXR1ID0gY2FyZC0+aW5mby5pbml0aWFsX210dTsKLQljYXJkLT5kZXYtPnNldF9tYWNfYWRkcmVzcyA9IE5VTEw7CiAJU0VUX0VUSFRPT0xfT1BTKGNhcmQtPmRldiwgJnFldGhfbDNfZXRodG9vbF9vcHMpOwogCWNhcmQtPmRldi0+ZmVhdHVyZXMgfD0JTkVUSUZfRl9IV19WTEFOX1RYIHwKIAkJCQlORVRJRl9GX0hXX1ZMQU5fUlggfApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zYnVzL2NoYXIvZGlzcGxheTdzZWcuYyBiL2RyaXZlcnMvc2J1cy9jaGFyL2Rpc3BsYXk3c2VnLmMKaW5kZXggMjU1MGFmNC4uNDQzMTU3OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zYnVzL2NoYXIvZGlzcGxheTdzZWcuYworKysgYi9kcml2ZXJzL3NidXMvY2hhci9kaXNwbGF5N3NlZy5jCkBAIC0yMTQsNyArMjE0LDcgQEAKIAogCXdyaXRlYihyZWdzLCAgcC0+cmVncyk7CiAKLQlwcmludGsoS0VSTl9JTkZPIFBGWCAiNy1TZWdtZW50IERpc3BsYXklcyBhdCBbJXM6MHglbHhdICVzXG4iLCAKKwlwcmludGsoS0VSTl9JTkZPIFBGWCAiNy1TZWdtZW50IERpc3BsYXklcyBhdCBbJXM6MHglbGx4XSAlc1xuIiwKIAkgICAgICAgb3AtPm5vZGUtPmZ1bGxfbmFtZSwKIAkgICAgICAgKHJlZ3MgJiBEN1NfRkxJUCkgPyAiIChGTElQUEVEKSIgOiAiIiwKIAkgICAgICAgb3AtPnJlc291cmNlWzBdLnN0YXJ0LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL0tjb25maWcgYi9kcml2ZXJzL3Njc2kvS2NvbmZpZwppbmRleCBiNzMyMjk3Li4yNTZjN2JlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvS2NvbmZpZworKysgYi9kcml2ZXJzL3Njc2kvS2NvbmZpZwpAQCAtODg0LDYgKzg4NCw3IEBACiAJdHJpc3RhdGUgIklCTSBWaXJ0dWFsIFNDU0kgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIFBQQ19QU0VSSUVTIHx8IFBQQ19JU0VSSUVTCiAJc2VsZWN0IFNDU0lfU1JQX0FUVFJTCisJc2VsZWN0IFZJT1BBVEggaWYgUFBDX0lTRVJJRVMKIAloZWxwCiAJICBUaGlzIGlzIHRoZSBJQk0gUE9XRVIgVmlydHVhbCBTQ1NJIENsaWVudAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvTkNSX0Q3MDAuYyBiL2RyaXZlcnMvc2NzaS9OQ1JfRDcwMC5jCmluZGV4IDllNjRiMjEuLmM4ODlkODQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9OQ1JfRDcwMC5jCisrKyBiL2RyaXZlcnMvc2NzaS9OQ1JfRDcwMC5jCkBAIC0zMTgsNyArMzE4LDcgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAlwLT5kZXYgPSBkZXY7Ci0Jc25wcmludGYocC0+bmFtZSwgc2l6ZW9mKHAtPm5hbWUpLCAiRDcwMCglcykiLCBkZXYtPmJ1c19pZCk7CisJc25wcmludGYocC0+bmFtZSwgc2l6ZW9mKHAtPm5hbWUpLCAiRDcwMCglcykiLCBkZXZfbmFtZShkZXYpKTsKIAlpZiAocmVxdWVzdF9pcnEoaXJxLCBOQ1JfRDcwMF9pbnRyLCBJUlFGX1NIQVJFRCwgcC0+bmFtZSwgcCkpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJENzAwOiByZXF1ZXN0X2lycSBmYWlsZWRcbiIpOwogCQlrZnJlZShwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9hMTAwdTJ3LmMgYi9kcml2ZXJzL3Njc2kvYTEwMHUydy5jCmluZGV4IDNjMjk4YzcuLjk2NDc2OWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9hMTAwdTJ3LmMKKysrIGIvZHJpdmVycy9zY3NpL2ExMDB1MncuYwpAQCAtNjMzLDcgKzYzMyw3IEBACiAJCXJldHVybiBGQUlMRUQ7CiAJfQogCi0JLyogUmVzZXQgZGV2aWNlIGlzIGhhbmRsZWQgYnkgdGhlIGZpcm1hcmUsIHdlIGZpbGwgaW4gYW4gU0NCIGFuZAorCS8qIFJlc2V0IGRldmljZSBpcyBoYW5kbGVkIGJ5IHRoZSBmaXJtd2FyZSwgd2UgZmlsbCBpbiBhbiBTQ0IgYW5kCiAJICAgZmlyZSBpdCBhdCB0aGUgY29udHJvbGxlciwgaXQgZG9lcyB0aGUgcmVzdCAqLwogCXNjYi0+b3Bjb2RlID0gT1JDX0JVU0RFVlJTVDsKIAlzY2ItPnRhcmdldCA9IHRhcmdldDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9hMjA5MS5jIGIvZHJpdmVycy9zY3NpL2EyMDkxLmMKaW5kZXggMDdkNTcyZi4uMzdkZDQ3MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2EyMDkxLmMKKysrIGIvZHJpdmVycy9zY3NpL2EyMDkxLmMKQEAgLTE2OSwxMCArMTY5LDggQEAKIAkgICAgY29udGludWU7CiAKIAlpbnN0YW5jZSA9IHNjc2lfcmVnaXN0ZXIgKHRwbnQsIHNpemVvZiAoc3RydWN0IFdEMzNDOTNfaG9zdGRhdGEpKTsKLQlpZiAoaW5zdGFuY2UgPT0gTlVMTCkgewotCSAgICByZWxlYXNlX21lbV9yZWdpb24oYWRkcmVzcywgMjU2KTsKLQkgICAgY29udGludWU7Ci0JfQorCWlmIChpbnN0YW5jZSA9PSBOVUxMKQorCSAgICBnb3RvIHJlbGVhc2U7CiAJaW5zdGFuY2UtPmJhc2UgPSBaVFdPX1ZBRERSKGFkZHJlc3MpOwogCWluc3RhbmNlLT5pcnEgPSBJUlFfQU1JR0FfUE9SVFM7CiAJaW5zdGFuY2UtPnVuaXF1ZV9pZCA9IHotPnNsb3RhZGRyOwpAQCAtMTgzLDEwICsxODEsMTggQEAKIAlIREFUQShpbnN0YW5jZSktPmZhc3QgPSAwOwogCUhEQVRBKGluc3RhbmNlKS0+ZG1hX21vZGUgPSBDVFJMX0RNQTsKIAl3ZDMzYzkzX2luaXQoaW5zdGFuY2UsIHJlZ3MsIGRtYV9zZXR1cCwgZG1hX3N0b3AsIFdEMzNDOTNfRlNfOF8xMCk7Ci0JcmVxdWVzdF9pcnEoSVJRX0FNSUdBX1BPUlRTLCBhMjA5MV9pbnRyLCBJUlFGX1NIQVJFRCwgIkEyMDkxIFNDU0kiLAotCQkgICAgaW5zdGFuY2UpOworCWlmIChyZXF1ZXN0X2lycShJUlFfQU1JR0FfUE9SVFMsIGEyMDkxX2ludHIsIElSUUZfU0hBUkVELCAiQTIwOTEgU0NTSSIsCisJCQlpbnN0YW5jZSkpCisJICAgIGdvdG8gdW5yZWdpc3RlcjsKIAlETUEoaW5zdGFuY2UpLT5DTlRSID0gQ05UUl9QRE1EIHwgQ05UUl9JTlRFTjsKIAludW1fYTIwOTErKzsKKwljb250aW51ZTsKKwordW5yZWdpc3RlcjoKKwlzY3NpX3VucmVnaXN0ZXIoaW5zdGFuY2UpOworCXdkMzNjOTNfcmVsZWFzZSgpOworcmVsZWFzZToKKwlyZWxlYXNlX21lbV9yZWdpb24oYWRkcmVzcywgMjU2KTsKICAgICB9CiAKICAgICByZXR1cm4gbnVtX2EyMDkxOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FkdmFuc3lzLmMgYi9kcml2ZXJzL3Njc2kvYWR2YW5zeXMuYwppbmRleCAyZjYwMjcyLi43NTA3ZDhiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYWR2YW5zeXMuYworKysgYi9kcml2ZXJzL3Njc2kvYWR2YW5zeXMuYwpAQCAtMjUyNyw3ICsyNTI3LDcgQEAKIHsKIAlzdHJ1Y3QgYXNjX2JvYXJkICpib2FyZHAgPSBzaG9zdF9wcml2KHMpOwogCi0JcHJpbnRrKCJTY3NpX0hvc3QgYXQgYWRkciAweCVwLCBkZXZpY2UgJXNcbiIsIHMsIGJvYXJkcC0+ZGV2LT5idXNfaWQpOworCXByaW50aygiU2NzaV9Ib3N0IGF0IGFkZHIgMHglcCwgZGV2aWNlICVzXG4iLCBzLCBkZXZfbmFtZShib2FyZHAtPmRldikpOwogCXByaW50aygiIGhvc3RfYnVzeSAldSwgaG9zdF9ubyAlZCwgbGFzdF9yZXNldCAlZCxcbiIsCiAJICAgICAgIHMtPmhvc3RfYnVzeSwgcy0+aG9zdF9ubywgKHVuc2lnbmVkKXMtPmxhc3RfcmVzZXQpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYWljOTR4eC9haWM5NHh4X3RtZi5jIGIvZHJpdmVycy9zY3NpL2FpYzk0eHgvYWljOTR4eF90bWYuYwppbmRleCBkNDY0MGVmLi43OGViODZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYWljOTR4eC9haWM5NHh4X3RtZi5jCisrKyBiL2RyaXZlcnMvc2NzaS9haWM5NHh4L2FpYzk0eHhfdG1mLmMKQEAgLTE4OSw3ICsxODksNyBAQAogCWFzZF9jbGVhcl9uZXh1c19JX1QoZGV2LCBORVhVU19QSEFTRV9QUkUpOwogCS8qIHNlbmQgYSBoYXJkIHJlc2V0ICovCiAJQVNEX0RQUklOVEsoInNlbmRpbmcgJXMgcmVzZXQgdG8gJXNcbiIsCi0JCSAgICByZXNldF90eXBlID8gImhhcmQiIDogInNvZnQiLCBwaHktPmRldi5idXNfaWQpOworCQkgICAgcmVzZXRfdHlwZSA/ICJoYXJkIiA6ICJzb2Z0IiwgZGV2X25hbWUoJnBoeS0+ZGV2KSk7CiAJcmVzID0gc2FzX3BoeV9yZXNldChwaHksIHJlc2V0X3R5cGUpOwogCWlmIChyZXMgPT0gVE1GX1JFU1BfRlVOQ19DT01QTEVURSkgewogCQkvKiB3YWl0IGZvciB0aGUgbWF4aW11bSBzZXR0bGUgdGltZSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2N4Z2IzaS9jeGdiM2lfZGRwLmMgYi9kcml2ZXJzL3Njc2kvY3hnYjNpL2N4Z2IzaV9kZHAuYwppbmRleCAxYTQxZjA0Li4wOGYzYTA5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvY3hnYjNpL2N4Z2IzaV9kZHAuYworKysgYi9kcml2ZXJzL3Njc2kvY3hnYjNpL2N4Z2IzaV9kZHAuYwpAQCAtMTEsNiArMTEsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2F0dGVybGlzdC5oPgogCiAvKiBmcm9tIGN4Z2IzIExMRCAqLwogI2luY2x1ZGUgImNvbW1vbi5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2d2cDExLmMgYi9kcml2ZXJzL3Njc2kvZ3ZwMTEuYwppbmRleCBjYTczNjM3Li41ZDFiZjdlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvZ3ZwMTEuYworKysgYi9kcml2ZXJzL3Njc2kvZ3ZwMTEuYwpAQCAtMzI5LDEyICszMjksMTYgQEAKIAkJICAgICAoZXBjICYgR1ZQX1NDU0lDTEtNQVNLKSA/IFdEMzNDOTNfRlNfOF8xMAogCQkJCQkgICAgIDogV0QzM0M5M19GU18xMl8xNSk7CiAKLQlyZXF1ZXN0X2lycShJUlFfQU1JR0FfUE9SVFMsIGd2cDExX2ludHIsIElSUUZfU0hBUkVELCAiR1ZQMTEgU0NTSSIsCi0JCSAgICBpbnN0YW5jZSk7CisJaWYgKHJlcXVlc3RfaXJxKElSUV9BTUlHQV9QT1JUUywgZ3ZwMTFfaW50ciwgSVJRRl9TSEFSRUQsICJHVlAxMSBTQ1NJIiwKKwkJCWluc3RhbmNlKSkKKwkJZ290byB1bnJlZ2lzdGVyOwogCURNQShpbnN0YW5jZSktPkNOVFIgPSBHVlAxMV9ETUFDX0lOVF9FTkFCTEU7CiAJbnVtX2d2cDExKys7CiAJY29udGludWU7CiAKK3VucmVnaXN0ZXI6CisJc2NzaV91bnJlZ2lzdGVyKGluc3RhbmNlKTsKKwl3ZDMzYzkzX3JlbGVhc2UoKTsKIHJlbGVhc2U6CiAJcmVsZWFzZV9tZW1fcmVnaW9uKGFkZHJlc3MsIDI1Nik7CiAgICAgfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2hvc3RzLmMgYi9kcml2ZXJzL3Njc2kvaG9zdHMuYwppbmRleCAzZmRiYjEzLi5hYTY3MGExIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvaG9zdHMuYworKysgYi9kcml2ZXJzL3Njc2kvaG9zdHMuYwpAQCAtMzg4LDggKzM4OCw3IEBACiAJCXNob3N0LT5kbWFfYm91bmRhcnkgPSAweGZmZmZmZmZmOwogCiAJZGV2aWNlX2luaXRpYWxpemUoJnNob3N0LT5zaG9zdF9nZW5kZXYpOwotCXNucHJpbnRmKHNob3N0LT5zaG9zdF9nZW5kZXYuYnVzX2lkLCBCVVNfSURfU0laRSwgImhvc3QlZCIsCi0JCXNob3N0LT5ob3N0X25vKTsKKwlkZXZfc2V0X25hbWUoJnNob3N0LT5zaG9zdF9nZW5kZXYsICJob3N0JWQiLCBzaG9zdC0+aG9zdF9ubyk7CiAjaWZuZGVmIENPTkZJR19TWVNGU19ERVBSRUNBVEVECiAJc2hvc3QtPnNob3N0X2dlbmRldi5idXMgPSAmc2NzaV9idXNfdHlwZTsKICNlbmRpZgpAQCAtMzk4LDggKzM5Nyw3IEBACiAJZGV2aWNlX2luaXRpYWxpemUoJnNob3N0LT5zaG9zdF9kZXYpOwogCXNob3N0LT5zaG9zdF9kZXYucGFyZW50ID0gJnNob3N0LT5zaG9zdF9nZW5kZXY7CiAJc2hvc3QtPnNob3N0X2Rldi5jbGFzcyA9ICZzaG9zdF9jbGFzczsKLQlzbnByaW50ZihzaG9zdC0+c2hvc3RfZGV2LmJ1c19pZCwgQlVTX0lEX1NJWkUsICJob3N0JWQiLAotCQkgc2hvc3QtPmhvc3Rfbm8pOworCWRldl9zZXRfbmFtZSgmc2hvc3QtPnNob3N0X2RldiwgImhvc3QlZCIsIHNob3N0LT5ob3N0X25vKTsKIAlzaG9zdC0+c2hvc3RfZGV2Lmdyb3VwcyA9IHNjc2lfc3lzZnNfc2hvc3RfYXR0cl9ncm91cHM7CiAKIAlzaG9zdC0+ZWhhbmRsZXIgPSBrdGhyZWFkX3J1bihzY3NpX2Vycm9yX2hhbmRsZXIsIHNob3N0LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2libXZzY3NpL2libXZmYy5jIGIvZHJpdmVycy9zY3NpL2libXZzY3NpL2libXZmYy5jCmluZGV4IDQ0ZjIwMmYuLjkxZWY2NjlkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvaWJtdnNjc2kvaWJtdmZjLmMKKysrIGIvZHJpdmVycy9zY3NpL2libXZzY3NpL2libXZmYy5jCkBAIC0xMDEsNyArMTAxLDcgQEAKIAl7IElCTVZGQ19GQUJSSUNfTUFQUEVELCBJQk1WRkNfVU5BQkxFX1RPX0VTVEFCTElTSCwgRElEX0VSUk9SLCAxLCAxLCAidW5hYmxlIHRvIGVzdGFibGlzaCIgfSwKIAl7IElCTVZGQ19GQUJSSUNfTUFQUEVELCBJQk1WRkNfWFBPUlRfRkFVTFQsIERJRF9PSywgMSwgMCwgInRyYW5zcG9ydCBmYXVsdCIgfSwKIAl7IElCTVZGQ19GQUJSSUNfTUFQUEVELCBJQk1WRkNfQ01EX1RJTUVPVVQsIERJRF9USU1FX09VVCwgMSwgMSwgImNvbW1hbmQgdGltZW91dCIgfSwKLQl7IElCTVZGQ19GQUJSSUNfTUFQUEVELCBJQk1WRkNfRU5FVERPV04sIERJRF9OT19DT05ORUNULCAxLCAxLCAibmV0d29yayBkb3duIiB9LAorCXsgSUJNVkZDX0ZBQlJJQ19NQVBQRUQsIElCTVZGQ19FTkVURE9XTiwgRElEX1RSQU5TUE9SVF9ESVNSVVBURUQsIDEsIDEsICJuZXR3b3JrIGRvd24iIH0sCiAJeyBJQk1WRkNfRkFCUklDX01BUFBFRCwgSUJNVkZDX0hXX0ZBSUxVUkUsIERJRF9FUlJPUiwgMSwgMSwgImhhcmR3YXJlIGZhaWx1cmUiIH0sCiAJeyBJQk1WRkNfRkFCUklDX01BUFBFRCwgSUJNVkZDX0xJTktfRE9XTl9FUlIsIERJRF9SRVFVRVVFLCAwLCAwLCAibGluayBkb3duIiB9LAogCXsgSUJNVkZDX0ZBQlJJQ19NQVBQRUQsIElCTVZGQ19MSU5LX0RFQURfRVJSLCBESURfRVJST1IsIDAsIDAsICJsaW5rIGRlYWQiIH0sCkBAIC0xMTUsMTEgKzExNSwxMSBAQAogCiAJeyBJQk1WRkNfVklPU19GQUlMVVJFLCBJQk1WRkNfQ1JRX0ZBSUxVUkUsIERJRF9SRVFVRVVFLCAxLCAxLCAiQ1JRIGZhaWx1cmUiIH0sCiAJeyBJQk1WRkNfVklPU19GQUlMVVJFLCBJQk1WRkNfU1dfRkFJTFVSRSwgRElEX0VSUk9SLCAwLCAxLCAic29mdHdhcmUgZmFpbHVyZSIgfSwKLQl7IElCTVZGQ19WSU9TX0ZBSUxVUkUsIElCTVZGQ19JTlZBTElEX1BBUkFNRVRFUiwgRElEX0FCT1JULCAwLCAxLCAiaW52YWxpZCBwYXJhbWV0ZXIiIH0sCi0JeyBJQk1WRkNfVklPU19GQUlMVVJFLCBJQk1WRkNfTUlTU0lOR19QQVJBTUVURVIsIERJRF9BQk9SVCwgMCwgMSwgIm1pc3NpbmcgcGFyYW1ldGVyIiB9LAorCXsgSUJNVkZDX1ZJT1NfRkFJTFVSRSwgSUJNVkZDX0lOVkFMSURfUEFSQU1FVEVSLCBESURfRVJST1IsIDAsIDEsICJpbnZhbGlkIHBhcmFtZXRlciIgfSwKKwl7IElCTVZGQ19WSU9TX0ZBSUxVUkUsIElCTVZGQ19NSVNTSU5HX1BBUkFNRVRFUiwgRElEX0VSUk9SLCAwLCAxLCAibWlzc2luZyBwYXJhbWV0ZXIiIH0sCiAJeyBJQk1WRkNfVklPU19GQUlMVVJFLCBJQk1WRkNfSE9TVF9JT19CVVMsIERJRF9FUlJPUiwgMSwgMSwgImhvc3QgSS9PIGJ1cyBmYWlsdXJlIiB9LAotCXsgSUJNVkZDX1ZJT1NfRkFJTFVSRSwgSUJNVkZDX1RSQU5TX0NBTkNFTExFRCwgRElEX0FCT1JULCAwLCAxLCAidHJhbnNhY3Rpb24gY2FuY2VsbGVkIiB9LAotCXsgSUJNVkZDX1ZJT1NfRkFJTFVSRSwgSUJNVkZDX1RSQU5TX0NBTkNFTExFRF9JTVBMSUNJVCwgRElEX0FCT1JULCAwLCAxLCAidHJhbnNhY3Rpb24gY2FuY2VsbGVkIGltcGxpY2l0IiB9LAorCXsgSUJNVkZDX1ZJT1NfRkFJTFVSRSwgSUJNVkZDX1RSQU5TX0NBTkNFTExFRCwgRElEX0VSUk9SLCAwLCAxLCAidHJhbnNhY3Rpb24gY2FuY2VsbGVkIiB9LAorCXsgSUJNVkZDX1ZJT1NfRkFJTFVSRSwgSUJNVkZDX1RSQU5TX0NBTkNFTExFRF9JTVBMSUNJVCwgRElEX0VSUk9SLCAwLCAxLCAidHJhbnNhY3Rpb24gY2FuY2VsbGVkIGltcGxpY2l0IiB9LAogCXsgSUJNVkZDX1ZJT1NfRkFJTFVSRSwgSUJNVkZDX0lOU1VGRklDSUVOVF9SRVNPVVJDRSwgRElEX1JFUVVFVUUsIDEsIDEsICJpbnN1ZmZpY2llbnQgcmVzb3VyY2VzIiB9LAogCXsgSUJNVkZDX1ZJT1NfRkFJTFVSRSwgSUJNVkZDX1BMT0dJX1JFUVVJUkVELCBESURfRVJST1IsIDAsIDEsICJwb3J0IGxvZ2luIHJlcXVpcmVkIiB9LAogCXsgSUJNVkZDX1ZJT1NfRkFJTFVSRSwgSUJNVkZDX0NPTU1BTkRfRkFJTEVELCBESURfRVJST1IsIDEsIDEsICJjb21tYW5kIGZhaWxlZCIgfSwKQEAgLTkzMyw3ICs5MzMsNyBAQAogCQkJZmNfaG9zdF9zcGVlZChzaG9zdCkgPSBGQ19QT1JUU1BFRURfMTZHQklUOwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6Ci0JCQlpYm12ZmNfbG9nKHZob3N0LCAzLCAiVW5rbm93biBwb3J0IHNwZWVkOiAlbGQgR2JpdFxuIiwKKwkJCWlibXZmY19sb2codmhvc3QsIDMsICJVbmtub3duIHBvcnQgc3BlZWQ6ICVsbGQgR2JpdFxuIiwKIAkJCQkgICB2aG9zdC0+bG9naW5fYnVmLT5yZXNwLmxpbmtfc3BlZWQgLyAxMDApOwogCQkJZmNfaG9zdF9zcGVlZChzaG9zdCkgPSBGQ19QT1JUU1BFRURfVU5LTk9XTjsKIAkJCWJyZWFrOwpAQCAtMTE0NSwxMCArMTE0NSwxMCBAQAogCWxvZ2luX2luZm8tPmFzeW5jLmxlbiA9IHZob3N0LT5hc3luY19jcnEuc2l6ZSAqIHNpemVvZigqdmhvc3QtPmFzeW5jX2NycS5tc2dzKTsKIAlzdHJuY3B5KGxvZ2luX2luZm8tPnBhcnRpdGlvbl9uYW1lLCB2aG9zdC0+cGFydGl0aW9uX25hbWUsIElCTVZGQ19NQVhfTkFNRSk7CiAJc3RybmNweShsb2dpbl9pbmZvLT5kZXZpY2VfbmFtZSwKLQkJdmhvc3QtPmhvc3QtPnNob3N0X2dlbmRldi5idXNfaWQsIElCTVZGQ19NQVhfTkFNRSk7CisJCWRldl9uYW1lKCZ2aG9zdC0+aG9zdC0+c2hvc3RfZ2VuZGV2KSwgSUJNVkZDX01BWF9OQU1FKTsKIAogCWxvY2F0aW9uID0gb2ZfZ2V0X3Byb3BlcnR5KG9mX25vZGUsICJpYm0sbG9jLWNvZGUiLCBOVUxMKTsKLQlsb2NhdGlvbiA9IGxvY2F0aW9uID8gbG9jYXRpb24gOiB2aG9zdC0+ZGV2LT5idXNfaWQ7CisJbG9jYXRpb24gPSBsb2NhdGlvbiA/IGxvY2F0aW9uIDogZGV2X25hbWUodmhvc3QtPmRldik7CiAJc3RybmNweShsb2dpbl9pbmZvLT5kcmNfbmFtZSwgbG9jYXRpb24sIElCTVZGQ19NQVhfTkFNRSk7CiB9CiAKQEAgLTIxNDksOCArMjE0OSw4IEBACiB7CiAJY29uc3QgY2hhciAqZGVzYyA9IGlibXZmY19nZXRfYWVfZGVzYyhjcnEtPmV2ZW50KTsKIAotCWlibXZmY19sb2codmhvc3QsIDMsICIlcyBldmVudCByZWNlaXZlZC4gc2NzaV9pZDogJWx4LCB3d3BuOiAlbHgsIgotCQkgICAiIG5vZGVfbmFtZTogJWx4XG4iLCBkZXNjLCBjcnEtPnNjc2lfaWQsIGNycS0+d3dwbiwgY3JxLT5ub2RlX25hbWUpOworCWlibXZmY19sb2codmhvc3QsIDMsICIlcyBldmVudCByZWNlaXZlZC4gc2NzaV9pZDogJWxseCwgd3dwbjogJWxseCwiCisJCSAgICIgbm9kZV9uYW1lOiAlbGx4XG4iLCBkZXNjLCBjcnEtPnNjc2lfaWQsIGNycS0+d3dwbiwgY3JxLT5ub2RlX25hbWUpOwogCiAJc3dpdGNoIChjcnEtPmV2ZW50KSB7CiAJY2FzZSBJQk1WRkNfQUVfTElOS19VUDoKQEAgLTIxODQsNyArMjE4NCw3IEBACiAJCWlibXZmY19saW5rX2Rvd24odmhvc3QsIElCTVZGQ19IQUxURUQpOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlkZXZfZXJyKHZob3N0LT5kZXYsICJVbmtub3duIGFzeW5jIGV2ZW50IHJlY2VpdmVkOiAlbGRcbiIsIGNycS0+ZXZlbnQpOworCQlkZXZfZXJyKHZob3N0LT5kZXYsICJVbmtub3duIGFzeW5jIGV2ZW50IHJlY2VpdmVkOiAlbGxkXG4iLCBjcnEtPmV2ZW50KTsKIAkJYnJlYWs7CiAJfTsKIH0KQEAgLTIyNjEsMTMgKzIyNjEsMTMgQEAKIAkgKiBhY3R1YWxseSBzZW50CiAJICovCiAJaWYgKHVubGlrZWx5KCFpYm12ZmNfdmFsaWRfZXZlbnQoJnZob3N0LT5wb29sLCBldnQpKSkgewotCQlkZXZfZXJyKHZob3N0LT5kZXYsICJSZXR1cm5lZCBjb3JyZWxhdGlvbl90b2tlbiAweCUwOGx4IGlzIGludmFsaWQhXG4iLAorCQlkZXZfZXJyKHZob3N0LT5kZXYsICJSZXR1cm5lZCBjb3JyZWxhdGlvbl90b2tlbiAweCUwOGxseCBpcyBpbnZhbGlkIVxuIiwKIAkJCWNycS0+aW9iYSk7CiAJCXJldHVybjsKIAl9CiAKIAlpZiAodW5saWtlbHkoYXRvbWljX3JlYWQoJmV2dC0+ZnJlZSkpKSB7Ci0JCWRldl9lcnIodmhvc3QtPmRldiwgIlJlY2VpdmVkIGR1cGxpY2F0ZSBjb3JyZWxhdGlvbl90b2tlbiAweCUwOGx4IVxuIiwKKwkJZGV2X2Vycih2aG9zdC0+ZGV2LCAiUmVjZWl2ZWQgZHVwbGljYXRlIGNvcnJlbGF0aW9uX3Rva2VuIDB4JTA4bGx4IVxuIiwKIAkJCWNycS0+aW9iYSk7CiAJCXJldHVybjsKIAl9CkBAIC0zMjU5LDcgKzMyNTksNyBAQAogCiAJdGd0ID0gbWVtcG9vbF9hbGxvYyh2aG9zdC0+dGd0X3Bvb2wsIEdGUF9LRVJORUwpOwogCWlmICghdGd0KSB7Ci0JCWRldl9lcnIodmhvc3QtPmRldiwgIlRhcmdldCBhbGxvY2F0aW9uIGZhaWx1cmUgZm9yIHNjc2kgaWQgJTA4bHhcbiIsCisJCWRldl9lcnIodmhvc3QtPmRldiwgIlRhcmdldCBhbGxvY2F0aW9uIGZhaWx1cmUgZm9yIHNjc2kgaWQgJTA4bGx4XG4iLAogCQkJc2NzaV9pZCk7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9pYm12c2NzaS9pYm12ZmMuaCBiL2RyaXZlcnMvc2NzaS9pYm12c2NzaS9pYm12ZmMuaAppbmRleCBiYWJkZjNkLi44N2RhZmQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvaWJtdnNjc2kvaWJtdmZjLmgKKysrIGIvZHJpdmVycy9zY3NpL2libXZzY3NpL2libXZmYy5oCkBAIC02OTEsMTMgKzY5MSwxMyBAQAogI2RlZmluZSBEQkdfQ01EKENNRCkgZG8geyBpZiAoaWJtdmZjX2RlYnVnKSBDTUQ7IH0gd2hpbGUgKDApCiAKICNkZWZpbmUgdGd0X2RiZyh0LCBmbXQsIC4uLikJCQlcCi0JREJHX0NNRChkZXZfaW5mbygodCktPnZob3N0LT5kZXYsICIlbFg6ICIgZm10LCAodCktPnNjc2lfaWQsICMjX19WQV9BUkdTX18pKQorCURCR19DTUQoZGV2X2luZm8oKHQpLT52aG9zdC0+ZGV2LCAiJWxsWDogIiBmbXQsICh0KS0+c2NzaV9pZCwgIyNfX1ZBX0FSR1NfXykpCiAKICNkZWZpbmUgdGd0X2luZm8odCwgZm10LCAuLi4pCQlcCi0JZGV2X2luZm8oKHQpLT52aG9zdC0+ZGV2LCAiJWxYOiAiIGZtdCwgKHQpLT5zY3NpX2lkLCAjI19fVkFfQVJHU19fKQorCWRldl9pbmZvKCh0KS0+dmhvc3QtPmRldiwgIiVsbFg6ICIgZm10LCAodCktPnNjc2lfaWQsICMjX19WQV9BUkdTX18pCiAKICNkZWZpbmUgdGd0X2Vycih0LCBmbXQsIC4uLikJCVwKLQlkZXZfZXJyKCh0KS0+dmhvc3QtPmRldiwgIiVsWDogIiBmbXQsICh0KS0+c2NzaV9pZCwgIyNfX1ZBX0FSR1NfXykKKwlkZXZfZXJyKCh0KS0+dmhvc3QtPmRldiwgIiVsbFg6ICIgZm10LCAodCktPnNjc2lfaWQsICMjX19WQV9BUkdTX18pCiAKICNkZWZpbmUgaWJtdmZjX2RiZyh2aG9zdCwgLi4uKSBcCiAJREJHX0NNRChkZXZfaW5mbygodmhvc3QpLT5kZXYsICMjX19WQV9BUkdTX18pKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2libXZzY3NpL2libXZzY3NpLmMgYi9kcml2ZXJzL3Njc2kvaWJtdnNjc2kvaWJtdnNjc2kuYwppbmRleCA4NjhkMzVlLi43NGQwN2QxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvaWJtdnNjc2kvaWJtdnNjc2kuYworKysgYi9kcml2ZXJzL3Njc2kvaWJtdnNjc2kvaWJtdnNjc2kuYwpAQCAtODksNiArODksNyBAQAogc3RhdGljIGludCBtYXhfY2hhbm5lbCA9IDM7CiBzdGF0aWMgaW50IGluaXRfdGltZW91dCA9IDU7CiBzdGF0aWMgaW50IG1heF9yZXF1ZXN0cyA9IElCTVZTQ1NJX01BWF9SRVFVRVNUU19ERUZBVUxUOworc3RhdGljIGludCBtYXhfZXZlbnRzID0gSUJNVlNDU0lfTUFYX1JFUVVFU1RTX0RFRkFVTFQgKyAyOwogCiBzdGF0aWMgc3RydWN0IHNjc2lfdHJhbnNwb3J0X3RlbXBsYXRlICppYm12c2NzaV90cmFuc3BvcnRfdGVtcGxhdGU7CiAKQEAgLTEwNjAsNyArMTA2MSw3IEBACiAJfQogCiAJc2Rldl9wcmludGsoS0VSTl9JTkZPLCBjbWQtPmRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgImFib3J0aW5nIGNvbW1hbmQuIGx1biAweCVseCwgdGFnIDB4JWx4XG4iLAorICAgICAgICAgICAgICAgICAgICAiYWJvcnRpbmcgY29tbWFuZC4gbHVuIDB4JWxseCwgdGFnIDB4JWxseFxuIiwKIAkJICAgICgoKHU2NCkgbHVuKSA8PCA0OCksICh1NjQpIGZvdW5kX2V2dCk7CiAKIAl3YWl0X2Zvcl9jb21wbGV0aW9uKCZldnQtPmNvbXApOwpAQCAtMTA4MSw3ICsxMDgyLDcgQEAKIAlpZiAocnNwX3JjKSB7CiAJCWlmIChwcmludGtfcmF0ZWxpbWl0KCkpCiAJCQlzZGV2X3ByaW50ayhLRVJOX1dBUk5JTkcsIGNtZC0+ZGV2aWNlLAotCQkJCSAgICAiYWJvcnQgY29kZSAlZCBmb3IgdGFzayB0YWcgMHglbHhcbiIsCisJCQkJICAgICJhYm9ydCBjb2RlICVkIGZvciB0YXNrIHRhZyAweCVsbHhcbiIsCiAJCQkJICAgIHJzcF9yYywgdHNrX21nbXQtPnRhc2tfdGFnKTsKIAkJcmV0dXJuIEZBSUxFRDsKIAl9CkBAIC0xMTAxLDEyICsxMTAyLDEyIEBACiAKIAlpZiAoZm91bmRfZXZ0ID09IE5VTEwpIHsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShob3N0ZGF0YS0+aG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7Ci0JCXNkZXZfcHJpbnRrKEtFUk5fSU5GTywgY21kLT5kZXZpY2UsICJhYm9ydGVkIHRhc2sgdGFnIDB4JWx4IGNvbXBsZXRlZFxuIiwKKwkJc2Rldl9wcmludGsoS0VSTl9JTkZPLCBjbWQtPmRldmljZSwgImFib3J0ZWQgdGFzayB0YWcgMHglbGx4IGNvbXBsZXRlZFxuIiwKIAkJCSAgICB0c2tfbWdtdC0+dGFza190YWcpOwogCQlyZXR1cm4gU1VDQ0VTUzsKIAl9CiAKLQlzZGV2X3ByaW50ayhLRVJOX0lORk8sIGNtZC0+ZGV2aWNlLCAic3VjY2Vzc2Z1bGx5IGFib3J0ZWQgdGFzayB0YWcgMHglbHhcbiIsCisJc2Rldl9wcmludGsoS0VSTl9JTkZPLCBjbWQtPmRldmljZSwgInN1Y2Nlc3NmdWxseSBhYm9ydGVkIHRhc2sgdGFnIDB4JWxseFxuIiwKIAkJICAgIHRza19tZ210LT50YXNrX3RhZyk7CiAKIAljbWQtPnJlc3VsdCA9IChESURfQUJPUlQgPDwgMTYpOwpAQCAtMTE4MSw3ICsxMTgyLDcgQEAKIAkJcmV0dXJuIEZBSUxFRDsKIAl9CiAKLQlzZGV2X3ByaW50ayhLRVJOX0lORk8sIGNtZC0+ZGV2aWNlLCAicmVzZXR0aW5nIGRldmljZS4gbHVuIDB4JWx4XG4iLAorCXNkZXZfcHJpbnRrKEtFUk5fSU5GTywgY21kLT5kZXZpY2UsICJyZXNldHRpbmcgZGV2aWNlLiBsdW4gMHglbGx4XG4iLAogCQkgICAgKCgodTY0KSBsdW4pIDw8IDQ4KSk7CiAKIAl3YWl0X2Zvcl9jb21wbGV0aW9uKCZldnQtPmNvbXApOwpAQCAtMTIwMiw3ICsxMjAzLDcgQEAKIAlpZiAocnNwX3JjKSB7CiAJCWlmIChwcmludGtfcmF0ZWxpbWl0KCkpCiAJCQlzZGV2X3ByaW50ayhLRVJOX1dBUk5JTkcsIGNtZC0+ZGV2aWNlLAotCQkJCSAgICAicmVzZXQgY29kZSAlZCBmb3IgdGFzayB0YWcgMHglbHhcbiIsCisJCQkJICAgICJyZXNldCBjb2RlICVkIGZvciB0YXNrIHRhZyAweCVsbHhcbiIsCiAJCQkJICAgIHJzcF9yYywgdHNrX21nbXQtPnRhc2tfdGFnKTsKIAkJcmV0dXJuIEZBSUxFRDsKIAl9CkBAIC0xNjMzLDcgKzE2MzQsNyBAQAogc3RhdGljIHVuc2lnbmVkIGxvbmcgaWJtdnNjc2lfZ2V0X2Rlc2lyZWRfZG1hKHN0cnVjdCB2aW9fZGV2ICp2ZGV2KQogewogCS8qIGl1X3N0b3JhZ2UgZGF0YSBhbGxvY2F0ZWQgaW4gaW5pdGlhbGl6ZV9ldmVudF9wb29sICovCi0JdW5zaWduZWQgbG9uZyBkZXNpcmVkX2lvID0gbWF4X3JlcXVlc3RzICogc2l6ZW9mKHVuaW9uIHZpb3NycF9pdSk7CisJdW5zaWduZWQgbG9uZyBkZXNpcmVkX2lvID0gbWF4X2V2ZW50cyAqIHNpemVvZih1bmlvbiB2aW9zcnBfaXUpOwogCiAJLyogYWRkIGlvIHNwYWNlIGZvciBzZyBkYXRhICovCiAJZGVzaXJlZF9pbyArPSAoSUJNVlNDU0lfTUFYX1NFQ1RPUlNfREVGQVVMVCAqIDUxMiAqCkBAIC0xNjU3LDcgKzE2NTgsNiBAQAogCiAJdmRldi0+ZGV2LmRyaXZlcl9kYXRhID0gTlVMTDsKIAotCWRyaXZlcl90ZW1wbGF0ZS5jYW5fcXVldWUgPSBtYXhfcmVxdWVzdHMgLSAyOwogCWhvc3QgPSBzY3NpX2hvc3RfYWxsb2MoJmRyaXZlcl90ZW1wbGF0ZSwgc2l6ZW9mKCpob3N0ZGF0YSkpOwogCWlmICghaG9zdCkgewogCQlkZXZfZXJyKCZ2ZGV2LT5kZXYsICJjb3VsZG4ndCBhbGxvY2F0ZSBob3N0IGRhdGFcbiIpOwpAQCAtMTY3MywxMiArMTY3MywxMiBAQAogCWF0b21pY19zZXQoJmhvc3RkYXRhLT5yZXF1ZXN0X2xpbWl0LCAtMSk7CiAJaG9zdGRhdGEtPmhvc3QtPm1heF9zZWN0b3JzID0gSUJNVlNDU0lfTUFYX1NFQ1RPUlNfREVGQVVMVDsKIAotCXJjID0gaWJtdnNjc2lfb3BzLT5pbml0X2NycV9xdWV1ZSgmaG9zdGRhdGEtPnF1ZXVlLCBob3N0ZGF0YSwgbWF4X3JlcXVlc3RzKTsKKwlyYyA9IGlibXZzY3NpX29wcy0+aW5pdF9jcnFfcXVldWUoJmhvc3RkYXRhLT5xdWV1ZSwgaG9zdGRhdGEsIG1heF9ldmVudHMpOwogCWlmIChyYyAhPSAwICYmIHJjICE9IEhfUkVTT1VSQ0UpIHsKIAkJZGV2X2VycigmdmRldi0+ZGV2LCAiY291bGRuJ3QgaW5pdGlhbGl6ZSBjcnEuIHJjPSVkXG4iLCByYyk7CiAJCWdvdG8gaW5pdF9jcnFfZmFpbGVkOwogCX0KLQlpZiAoaW5pdGlhbGl6ZV9ldmVudF9wb29sKCZob3N0ZGF0YS0+cG9vbCwgbWF4X3JlcXVlc3RzLCBob3N0ZGF0YSkgIT0gMCkgeworCWlmIChpbml0aWFsaXplX2V2ZW50X3Bvb2woJmhvc3RkYXRhLT5wb29sLCBtYXhfZXZlbnRzLCBob3N0ZGF0YSkgIT0gMCkgewogCQlkZXZfZXJyKCZ2ZGV2LT5kZXYsICJjb3VsZG4ndCBpbml0aWFsaXplIGV2ZW50IHBvb2xcbiIpOwogCQlnb3RvIGluaXRfcG9vbF9mYWlsZWQ7CiAJfQpAQCAtMTczMCw3ICsxNzMwLDcgQEAKICAgICAgIGFkZF9ob3N0X2ZhaWxlZDoKIAlyZWxlYXNlX2V2ZW50X3Bvb2woJmhvc3RkYXRhLT5wb29sLCBob3N0ZGF0YSk7CiAgICAgICBpbml0X3Bvb2xfZmFpbGVkOgotCWlibXZzY3NpX29wcy0+cmVsZWFzZV9jcnFfcXVldWUoJmhvc3RkYXRhLT5xdWV1ZSwgaG9zdGRhdGEsIG1heF9yZXF1ZXN0cyk7CisJaWJtdnNjc2lfb3BzLT5yZWxlYXNlX2NycV9xdWV1ZSgmaG9zdGRhdGEtPnF1ZXVlLCBob3N0ZGF0YSwgbWF4X2V2ZW50cyk7CiAgICAgICBpbml0X2NycV9mYWlsZWQ6CiAJc2NzaV9ob3N0X3B1dChob3N0KTsKICAgICAgIHNjc2lfaG9zdF9hbGxvY19mYWlsZWQ6CkBAIC0xNzQyLDcgKzE3NDIsNyBAQAogCXN0cnVjdCBpYm12c2NzaV9ob3N0X2RhdGEgKmhvc3RkYXRhID0gdmRldi0+ZGV2LmRyaXZlcl9kYXRhOwogCXJlbGVhc2VfZXZlbnRfcG9vbCgmaG9zdGRhdGEtPnBvb2wsIGhvc3RkYXRhKTsKIAlpYm12c2NzaV9vcHMtPnJlbGVhc2VfY3JxX3F1ZXVlKCZob3N0ZGF0YS0+cXVldWUsIGhvc3RkYXRhLAotCQkJCQltYXhfcmVxdWVzdHMpOworCQkJCQltYXhfZXZlbnRzKTsKIAogCXNycF9yZW1vdmVfaG9zdChob3N0ZGF0YS0+aG9zdCk7CiAJc2NzaV9yZW1vdmVfaG9zdChob3N0ZGF0YS0+aG9zdCk7CkBAIC0xNzc5LDYgKzE3NzksMTAgQEAKIHsKIAlpbnQgcmV0OwogCisJLyogRW5zdXJlIHdlIGhhdmUgdHdvIHJlcXVlc3RzIHRvIGRvIGVycm9yIHJlY292ZXJ5ICovCisJZHJpdmVyX3RlbXBsYXRlLmNhbl9xdWV1ZSA9IG1heF9yZXF1ZXN0czsKKwltYXhfZXZlbnRzID0gbWF4X3JlcXVlc3RzICsgMjsKKwogCWlmIChmaXJtd2FyZV9oYXNfZmVhdHVyZShGV19GRUFUVVJFX0lTRVJJRVMpKQogCQlpYm12c2NzaV9vcHMgPSAmaXNlcmllc3ZzY3NpX29wczsKIAllbHNlIGlmIChmaXJtd2FyZV9oYXNfZmVhdHVyZShGV19GRUFUVVJFX1ZJTykpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvaXByLmMgYi9kcml2ZXJzL3Njc2kvaXByLmMKaW5kZXggMGVkZmIxZi4uMDc4MjkwMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2lwci5jCisrKyBiL2RyaXZlcnMvc2NzaS9pcHIuYwpAQCAtMjE4NCw3ICsyMTg0LDcgQEAKIAkJc2l6ZW9mKHN0cnVjdCBpcHJfZHVtcF9lbnRyeV9oZWFkZXIpOwogCWRyaXZlcl9kdW1wLT5sb2NhdGlvbl9lbnRyeS5oZHIuZGF0YV90eXBlID0gSVBSX0RVTVBfREFUQV9UWVBFX0FTQ0lJOwogCWRyaXZlcl9kdW1wLT5sb2NhdGlvbl9lbnRyeS5oZHIuaWQgPSBJUFJfRFVNUF9MT0NBVElPTl9JRDsKLQlzdHJjcHkoZHJpdmVyX2R1bXAtPmxvY2F0aW9uX2VudHJ5LmxvY2F0aW9uLCBpb2FfY2ZnLT5wZGV2LT5kZXYuYnVzX2lkKTsKKwlzdHJjcHkoZHJpdmVyX2R1bXAtPmxvY2F0aW9uX2VudHJ5LmxvY2F0aW9uLCBkZXZfbmFtZSgmaW9hX2NmZy0+cGRldi0+ZGV2KSk7CiAJZHJpdmVyX2R1bXAtPmhkci5udW1fZW50cmllcysrOwogfQogCkBAIC00OTEyLDcgKzQ5MTIsNyBAQAogCWlmIChyZXMgJiYgaXByX2lzX2dhdGEocmVzKSkgewogCQlpZiAoY21kID09IEhESU9fR0VUX0lERU5USVRZKQogCQkJcmV0dXJuIC1FTk9UVFk7Ci0JCXJldHVybiBhdGFfc2NzaV9pb2N0bChzZGV2LCBjbWQsIGFyZyk7CisJCXJldHVybiBhdGFfc2FzX3Njc2lfaW9jdGwocmVzLT5zYXRhX3BvcnQtPmFwLCBzZGV2LCBjbWQsIGFyZyk7CiAJfQogCiAJcmV0dXJuIC1FSU5WQUw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvaXByLmggYi9kcml2ZXJzL3Njc2kvaXByLmgKaW5kZXggNTk0NTkxNC4uOGY4NzJmOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2lwci5oCisrKyBiL2RyaXZlcnMvc2NzaS9pcHIuaApAQCAtMTI3Miw3ICsxMjcyLDcgQEAKIAogc3RydWN0IGlwcl9kdW1wX2xvY2F0aW9uX2VudHJ5IHsKIAlzdHJ1Y3QgaXByX2R1bXBfZW50cnlfaGVhZGVyIGhkcjsKLQl1OCBsb2NhdGlvbltCVVNfSURfU0laRV07CisJdTggbG9jYXRpb25bMjBdOwogfV9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCiBzdHJ1Y3QgaXByX2R1bXBfdHJhY2VfZW50cnkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2xhc2k3MDAuYyBiL2RyaXZlcnMvc2NzaS9sYXNpNzAwLmMKaW5kZXggMzEyNjgyNC4uNGE0ZTY5NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2xhc2k3MDAuYworKysgYi9kcml2ZXJzL3Njc2kvbGFzaTcwMC5jCkBAIC0xMDMsOCArMTAzLDcgQEAKIAogCWhvc3RkYXRhID0ga3phbGxvYyhzaXplb2YoKmhvc3RkYXRhKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFob3N0ZGF0YSkgewotCQlwcmludGsoS0VSTl9FUlIgIiVzOiBGYWlsZWQgdG8gYWxsb2NhdGUgaG9zdCBkYXRhXG4iLAotCQkgICAgICAgZGV2LT5kZXYuYnVzX2lkKTsKKwkJZGV2X3ByaW50ayhLRVJOX0VSUiwgZGV2LCAiRmFpbGVkIHRvIGFsbG9jYXRlIGhvc3QgZGF0YVxuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2xpYmlzY3NpX3RjcC5jIGIvZHJpdmVycy9zY3NpL2xpYmlzY3NpX3RjcC5jCmluZGV4IGE3NDVmOTEuLmU3NzA1ZDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9saWJpc2NzaV90Y3AuYworKysgYi9kcml2ZXJzL3Njc2kvbGliaXNjc2lfdGNwLmMKQEAgLTE3Nyw3ICsxNzcsNiBAQAogCQkJICAgc3RydWN0IGlzY3NpX3NlZ21lbnQgKnNlZ21lbnQsIGludCByZWN2LAogCQkJICAgdW5zaWduZWQgY29waWVkKQogewotCXN0YXRpYyB1bnNpZ25lZCBjaGFyIHBhZGJ1ZltJU0NTSV9QQURfTEVOXTsKIAlzdHJ1Y3Qgc2NhdHRlcmxpc3Qgc2c7CiAJdW5zaWduZWQgaW50IHBhZDsKIApAQCAtMjMzLDcgKzIzMiw3IEBACiAJCQlkZWJ1Z190Y3AoImNvbnN1bWUgJWQgcGFkIGJ5dGVzXG4iLCBwYWQpOwogCQkJc2VnbWVudC0+dG90YWxfc2l6ZSArPSBwYWQ7CiAJCQlzZWdtZW50LT5zaXplID0gcGFkOwotCQkJc2VnbWVudC0+ZGF0YSA9IHBhZGJ1ZjsKKwkJCXNlZ21lbnQtPmRhdGEgPSBzZWdtZW50LT5wYWRidWY7CiAJCQlyZXR1cm4gMDsKIAkJfQogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9saWJzYXMvc2FzX2Rpc2NvdmVyLmMgYi9kcml2ZXJzL3Njc2kvbGlic2FzL3Nhc19kaXNjb3Zlci5jCmluZGV4IDcwOWE2ZjcuLmZhY2M1YmZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbGlic2FzL3Nhc19kaXNjb3Zlci5jCisrKyBiL2RyaXZlcnMvc2NzaS9saWJzYXMvc2FzX2Rpc2NvdmVyLmMKQEAgLTE2OSw3ICsxNjksNyBAQAogCQlpZiAocmVzKSB7CiAJCQlwcmludGsoInNhczogZHJpdmVyIG9uIHBjaWRldiAlcyBjYW5ub3QgaGFuZGxlICIKIAkJCSAgICAgICAiZGV2aWNlICVsbHgsIGVycm9yOiVkXG4iLAotCQkJICAgICAgIHNhc19oYS0+ZGV2LT5idXNfaWQsCisJCQkgICAgICAgZGV2X25hbWUoc2FzX2hhLT5kZXYpLAogCQkJICAgICAgIFNBU19BRERSKGRldi0+c2FzX2FkZHIpLCByZXMpOwogCQl9CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2xpYnNhcy9zYXNfZHVtcC5jIGIvZHJpdmVycy9zY3NpL2xpYnNhcy9zYXNfZHVtcC5jCmluZGV4IGJmMzRhMjMuLmMxN2MyNTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9saWJzYXMvc2FzX2R1bXAuYworKysgYi9kcml2ZXJzL3Njc2kvbGlic2FzL3Nhc19kdW1wLmMKQEAgLTU2LDcgKzU2LDcgQEAKIAogdm9pZCBzYXNfZHByaW50X2hhZShzdHJ1Y3Qgc2FzX2hhX3N0cnVjdCAqc2FzX2hhLCBlbnVtIGhhX2V2ZW50IGhlKQogewotCVNBU19EUFJJTlRLKCJoYSAlczogJXMgZXZlbnRcbiIsIHNhc19oYS0+ZGV2LT5idXNfaWQsCisJU0FTX0RQUklOVEsoImhhICVzOiAlcyBldmVudFxuIiwgZGV2X25hbWUoc2FzX2hhLT5kZXYpLAogCQkgICAgc2FzX2hhZV9zdHJbaGVdKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2xpYnNhcy9zYXNfaG9zdF9zbXAuYyBiL2RyaXZlcnMvc2NzaS9saWJzYXMvc2FzX2hvc3Rfc21wLmMKaW5kZXggMTZmOTMxMi4uZDExMGEzNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2xpYnNhcy9zYXNfaG9zdF9zbXAuYworKysgYi9kcml2ZXJzL3Njc2kvbGlic2FzL3Nhc19ob3N0X3NtcC5jCkBAIC0xOTksOCArMTk5LDggQEAKIAkJYnJlYWs7CiAKIAljYXNlIFNNUF9ESVNDT1ZFUjoKLQkJcmVxLT5kYXRhX2xlbiA9LSAxNjsKLQkJaWYgKHJlcS0+ZGF0YV9sZW4gPCAwKSB7CisJCXJlcS0+ZGF0YV9sZW4gLT0gMTY7CisJCWlmICgoaW50KXJlcS0+ZGF0YV9sZW4gPCAwKSB7CiAJCQlyZXEtPmRhdGFfbGVuID0gMDsKIAkJCWVycm9yID0gLUVJTlZBTDsKIAkJCWdvdG8gb3V0OwpAQCAtMjE1LDggKzIxNSw4IEBACiAJCWJyZWFrOwogCiAJY2FzZSBTTVBfUkVQT1JUX1BIWV9TQVRBOgotCQlyZXEtPmRhdGFfbGVuID0tIDE2OwotCQlpZiAocmVxLT5kYXRhX2xlbiA8IDApIHsKKwkJcmVxLT5kYXRhX2xlbiAtPSAxNjsKKwkJaWYgKChpbnQpcmVxLT5kYXRhX2xlbiA8IDApIHsKIAkJCXJlcS0+ZGF0YV9sZW4gPSAwOwogCQkJZXJyb3IgPSAtRUlOVkFMOwogCQkJZ290byBvdXQ7CkBAIC0yMzgsOCArMjM4LDggQEAKIAkJYnJlYWs7CiAKIAljYXNlIFNNUF9QSFlfQ09OVFJPTDoKLQkJcmVxLT5kYXRhX2xlbiA9LSA0NDsKLQkJaWYgKHJlcS0+ZGF0YV9sZW4gPCAwKSB7CisJCXJlcS0+ZGF0YV9sZW4gLT0gNDQ7CisJCWlmICgoaW50KXJlcS0+ZGF0YV9sZW4gPCAwKSB7CiAJCQlyZXEtPmRhdGFfbGVuID0gMDsKIAkJCWVycm9yID0gLUVJTlZBTDsKIAkJCWdvdG8gb3V0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2xpYnNhcy9zYXNfcG9ydC5jIGIvZHJpdmVycy9zY3NpL2xpYnNhcy9zYXNfcG9ydC5jCmluZGV4IDEzOTkzNWEuLmU2YWM1OWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9saWJzYXMvc2FzX3BvcnQuYworKysgYi9kcml2ZXJzL3Njc2kvbGlic2FzL3Nhc19wb3J0LmMKQEAgLTExMyw3ICsxMTMsNyBAQAogCXNhc19wb3J0X2FkZF9waHkocG9ydC0+cG9ydCwgcGh5LT5waHkpOwogCiAJU0FTX0RQUklOVEsoIiVzIGFkZGVkIHRvICVzLCBwaHlfbWFzazoweCV4ICglMTZsbHgpXG4iLAotCQkgICAgcGh5LT5waHktPmRldi5idXNfaWQscG9ydC0+cG9ydC0+ZGV2LmJ1c19pZCwKKwkJICAgIGRldl9uYW1lKCZwaHktPnBoeS0+ZGV2KSwgZGV2X25hbWUoJnBvcnQtPnBvcnQtPmRldiksCiAJCSAgICBwb3J0LT5waHlfbWFzaywKIAkJICAgIFNBU19BRERSKHBvcnQtPmF0dGFjaGVkX3Nhc19hZGRyKSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9saWJzYXMvc2FzX3Njc2lfaG9zdC5jIGIvZHJpdmVycy9zY3NpL2xpYnNhcy9zYXNfc2NzaV9ob3N0LmMKaW5kZXggNzQ0ODM4Ny4uMWM1NThkMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2xpYnNhcy9zYXNfc2NzaV9ob3N0LmMKKysrIGIvZHJpdmVycy9zY3NpL2xpYnNhcy9zYXNfc2NzaV9ob3N0LmMKQEAgLTcxNyw3ICs3MTcsNyBAQAogCXN0cnVjdCBkb21haW5fZGV2aWNlICpkZXYgPSBzZGV2X3RvX2RvbWFpbl9kZXYoc2Rldik7CiAKIAlpZiAoZGV2X2lzX3NhdGEoZGV2KSkKLQkJcmV0dXJuIGF0YV9zY3NpX2lvY3RsKHNkZXYsIGNtZCwgYXJnKTsKKwkJcmV0dXJuIGF0YV9zYXNfc2NzaV9pb2N0bChkZXYtPnNhdGFfZGV2LmFwLCBzZGV2LCBjbWQsIGFyZyk7CiAKIAlyZXR1cm4gLUVJTlZBTDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfaGJhZGlzYy5jIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19oYmFkaXNjLmMKaW5kZXggOGM2NDQ5NC4uMzExZWQ2ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19oYmFkaXNjLmMKKysrIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19oYmFkaXNjLmMKQEAgLTE5NjQsMTAgKzE5NjQsMTAgQEAKIAl1aW50MzJfdCB0bW87CiAKIAlpZiAodnBvcnQtPnBvcnRfc3RhdGUgPT0gTFBGQ19MT0NBTF9DRkdfTElOSykgewotCQkvKiBGb3IgRkFOLCB0aW1lb3V0IHNob3VsZCBiZSBncmVhdGVyIHRoZW4gZWR0b3YgKi8KKwkJLyogRm9yIEZBTiwgdGltZW91dCBzaG91bGQgYmUgZ3JlYXRlciB0aGFuIGVkdG92ICovCiAJCXRtbyA9ICgoKHBoYmEtPmZjX2VkdG92ICsgOTk5KSAvIDEwMDApICsgMSk7CiAJfSBlbHNlIHsKLQkJLyogTm9ybWFsIGRpc2NvdmVyeSB0aW1lb3V0IHNob3VsZCBiZSA+IHRoZW4gRUxTL0NUIHRpbWVvdXQKKwkJLyogTm9ybWFsIGRpc2NvdmVyeSB0aW1lb3V0IHNob3VsZCBiZSA+IHRoYW4gRUxTL0NUIHRpbWVvdXQKIAkJICogRkMgc3BlYyBzdGF0ZXMgd2UgbmVlZCAzICogcmF0b3YgZm9yIENUIHJlcXVlc3RzCiAJCSAqLwogCQl0bW8gPSAoKHBoYmEtPmZjX3JhdG92ICogMykgKyAzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfaW5pdC5jIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19pbml0LmMKaW5kZXggNGM3NzAzOC4uNmM4NjczMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19pbml0LmMKKysrIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19pbml0LmMKQEAgLTE3OTUsMTIgKzE3OTUsMTMgQEAKIGludAogbHBmY19vbmxpbmUoc3RydWN0IGxwZmNfaGJhICpwaGJhKQogewotCXN0cnVjdCBscGZjX3Zwb3J0ICp2cG9ydCA9IHBoYmEtPnBwb3J0OworCXN0cnVjdCBscGZjX3Zwb3J0ICp2cG9ydDsKIAlzdHJ1Y3QgbHBmY192cG9ydCAqKnZwb3J0czsKIAlpbnQgaTsKIAogCWlmICghcGhiYSkKIAkJcmV0dXJuIDA7CisJdnBvcnQgPSBwaGJhLT5wcG9ydDsKIAogCWlmICghKHZwb3J0LT5mY19mbGFnICYgRkNfT0ZGTElORV9NT0RFKSkKIAkJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX3NsaS5jIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19zbGkuYwppbmRleCAwMWRmZGM4Li5hMzZhMTIwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX3NsaS5jCisrKyBiL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfc2xpLmMKQEAgLTQyMCw3ICs0MjAsNyBAQAogCQlpZiAodW5saWtlbHkocHJpbmctPmxvY2FsX2dldGlkeCA+PSBtYXhfY21kX2lkeCkpIHsKIAkJCWxwZmNfcHJpbnRmX2xvZyhwaGJhLCBLRVJOX0VSUiwgTE9HX1NMSSwKIAkJCQkJIjAzMTUgUmluZyAlZCBpc3N1ZTogcG9ydENtZEdldCAlZCAiCi0JCQkJCSJpcyBiaWdnZXIgdGhlbiBjbWQgcmluZyAlZFxuIiwKKwkJCQkJImlzIGJpZ2dlciB0aGFuIGNtZCByaW5nICVkXG4iLAogCQkJCQlwcmluZy0+cmluZ25vLAogCQkJCQlwcmluZy0+bG9jYWxfZ2V0aWR4LCBtYXhfY21kX2lkeCk7CiAKQEAgLTE2MjgsMTIgKzE2MjgsMTIgQEAKIHsKIAlzdHJ1Y3QgbHBmY19wZ3AgKnBncCA9ICZwaGJhLT5wb3J0X2dwW3ByaW5nLT5yaW5nbm9dOwogCS8qCi0JICogUmluZyA8cmluZ25vPiBoYW5kbGVyOiBwb3J0UnNwUHV0IDxwb3J0UnNwUHV0PiBpcyBiaWdnZXIgdGhlbgorCSAqIFJpbmcgPHJpbmdubz4gaGFuZGxlcjogcG9ydFJzcFB1dCA8cG9ydFJzcFB1dD4gaXMgYmlnZ2VyIHRoYW4KIAkgKiByc3AgcmluZyA8cG9ydFJzcE1heD4KIAkgKi8KIAlscGZjX3ByaW50Zl9sb2cocGhiYSwgS0VSTl9FUlIsIExPR19TTEksCiAJCQkiMDMxMiBSaW5nICVkIGhhbmRsZXI6IHBvcnRSc3BQdXQgJWQgIgotCQkJImlzIGJpZ2dlciB0aGVuIHJzcCByaW5nICVkXG4iLAorCQkJImlzIGJpZ2dlciB0aGFuIHJzcCByaW5nICVkXG4iLAogCQkJcHJpbmctPnJpbmdubywgbGUzMl90b19jcHUocGdwLT5yc3BQdXRJbngpLAogCQkJcHJpbmctPm51bVJpb2NiKTsKIApAQCAtMjA4MywxMiArMjA4MywxMiBAQAogCXBvcnRSc3BQdXQgPSBsZTMyX3RvX2NwdShwZ3AtPnJzcFB1dElueCk7CiAJaWYgKHBvcnRSc3BQdXQgPj0gcG9ydFJzcE1heCkgewogCQkvKgotCQkgKiBSaW5nIDxyaW5nbm8+IGhhbmRsZXI6IHBvcnRSc3BQdXQgPHBvcnRSc3BQdXQ+IGlzIGJpZ2dlciB0aGVuCisJCSAqIFJpbmcgPHJpbmdubz4gaGFuZGxlcjogcG9ydFJzcFB1dCA8cG9ydFJzcFB1dD4gaXMgYmlnZ2VyIHRoYW4KIAkJICogcnNwIHJpbmcgPHBvcnRSc3BNYXg+CiAJCSAqLwogCQlscGZjX3ByaW50Zl9sb2cocGhiYSwgS0VSTl9FUlIsIExPR19TTEksCiAJCQkJIjAzMDMgUmluZyAlZCBoYW5kbGVyOiBwb3J0UnNwUHV0ICVkICIKLQkJCQkiaXMgYmlnZ2VyIHRoZW4gcnNwIHJpbmcgJWRcbiIsCisJCQkJImlzIGJpZ2dlciB0aGFuIHJzcCByaW5nICVkXG4iLAogCQkJCXByaW5nLT5yaW5nbm8sIHBvcnRSc3BQdXQsIHBvcnRSc3BNYXgpOwogCiAJCXBoYmEtPmxpbmtfc3RhdGUgPSBMUEZDX0hCQV9FUlJPUjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9tZWdhcmFpZC5jIGIvZHJpdmVycy9zY3NpL21lZ2FyYWlkLmMKaW5kZXggN2RjNjJkZS4uOWZkY2Q2MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL21lZ2FyYWlkLmMKKysrIGIvZHJpdmVycy9zY3NpL21lZ2FyYWlkLmMKQEAgLTE5NjcsOCArMTk2Nyw4IEBACiAJCQlzY2ItPnN0YXRlIHw9IGFvcjsKIAogCQkJLyoKLQkJCSAqIENoZWNrIGlmIHRoaXMgY29tbWFuZCBoYXMgZmlybWFyZSBvd2VuZXJzaGlwLiBJZgotCQkJICogeWVzLCB3ZSBjYW5ub3QgcmVzZXQgdGhpcyBjb21tYW5kLiBXaGVuZXZlciwgZi93CisJCQkgKiBDaGVjayBpZiB0aGlzIGNvbW1hbmQgaGFzIGZpcm13YXJlIG93bmVyc2hpcC4gSWYKKwkJCSAqIHllcywgd2UgY2Fubm90IHJlc2V0IHRoaXMgY29tbWFuZC4gV2hlbmV2ZXIgZi93CiAJCQkgKiBjb21wbGV0ZXMgdGhpcyBjb21tYW5kLCB3ZSB3aWxsIHJldHVybiBhcHByb3ByaWF0ZQogCQkJICogc3RhdHVzIGZyb20gSVNSLgogCQkJICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbXZzYXMuYyBiL2RyaXZlcnMvc2NzaS9tdnNhcy5jCmluZGV4IDFkZDcwZDcuLjIzZTVhODcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9tdnNhcy5jCisrKyBiL2RyaXZlcnMvc2NzaS9tdnNhcy5jCkBAIC0yOTU5LDcgKzI5NTksNyBAQAogCiAJLyogZW5hYmxlIGF1dG8gcG9ydCBkZXRlY3Rpb24gKi8KIAltdzMyKEdCTF9QT1JUX1RZUEUsIE1PREVfQVVUT19ERVRfRU4pOwotCW1zbGVlcCgxMDApOworCW1zbGVlcCgxMTAwKTsKIAkvKiBpbml0IGFuZCByZXNldCBwaHlzICovCiAJZm9yIChpID0gMDsgaSA8IG12aS0+Y2hpcC0+bl9waHk7IGkrKykgewogCQl1MzIgbG8gPSBiZTMyX3RvX2NwdSgqKHUzMiAqKSZtdmktPnNhc19hZGRyWzRdKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9wY21jaWEvYWhhMTUyeF9zdHViLmMgYi9kcml2ZXJzL3Njc2kvcGNtY2lhL2FoYTE1Mnhfc3R1Yi5jCmluZGV4IDE2NWZmODguLjY3Y2RlMDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9wY21jaWEvYWhhMTUyeF9zdHViLmMKKysrIGIvZHJpdmVycy9zY3NpL3BjbWNpYS9haGExNTJ4X3N0dWIuYwpAQCAtMTE0LDcgKzExNCw3IEBACiAgICAgbGluay0+aW8uTnVtUG9ydHMxID0gMHgyMDsKICAgICBsaW5rLT5pby5BdHRyaWJ1dGVzMSA9IElPX0RBVEFfUEFUSF9XSURUSF9BVVRPOwogICAgIGxpbmstPmlvLklPQWRkckxpbmVzID0gMTA7Ci0gICAgbGluay0+aXJxLkF0dHJpYnV0ZXMgPSBJUlFfVFlQRV9FWENMVVNJVkU7CisgICAgbGluay0+aXJxLkF0dHJpYnV0ZXMgPSBJUlFfVFlQRV9EWU5BTUlDX1NIQVJJTkc7CiAgICAgbGluay0+aXJxLklSUUluZm8xID0gSVJRX0xFVkVMX0lEOwogICAgIGxpbmstPmNvbmYuQXR0cmlidXRlcyA9IENPTkZfRU5BQkxFX0lSUTsKICAgICBsaW5rLT5jb25mLkludFR5cGUgPSBJTlRfTUVNT1JZX0FORF9JTzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9wczNyb20uYyBiL2RyaXZlcnMvc2NzaS9wczNyb20uYwppbmRleCBjZTQ4ZTJkLi5jYTBkZDMzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcHMzcm9tLmMKKysrIGIvZHJpdmVycy9zY3NpL3BzM3JvbS5jCkBAIC0yOTAsMTEgKzI5MCwxMSBAQAogCiAJaWYgKHRhZyAhPSBkZXYtPnRhZykKIAkJZGV2X2VycigmZGV2LT5zYmQuY29yZSwKLQkJCSIlczoldTogdGFnIG1pc21hdGNoLCBnb3QgJWx4LCBleHBlY3RlZCAlbHhcbiIsCisJCQkiJXM6JXU6IHRhZyBtaXNtYXRjaCwgZ290ICVsbHgsIGV4cGVjdGVkICVsbHhcbiIsCiAJCQlfX2Z1bmNfXywgX19MSU5FX18sIHRhZywgZGV2LT50YWcpOwogCiAJaWYgKHJlcykgewotCQlkZXZfZXJyKCZkZXYtPnNiZC5jb3JlLCAiJXM6JXU6IHJlcz0lZCBzdGF0dXM9MHglbHhcbiIsCisJCWRldl9lcnIoJmRldi0+c2JkLmNvcmUsICIlczoldTogcmVzPSVkIHN0YXR1cz0weCVsbHhcbiIsCiAJCQlfX2Z1bmNfXywgX19MSU5FX18sIHJlcywgc3RhdHVzKTsKIAkJcmV0dXJuIElSUV9IQU5ETEVEOwogCX0KQEAgLTM2NCw3ICszNjQsNyBAQAogCiAJaWYgKGRldi0+YmxrX3NpemUgIT0gQ0RfRlJBTUVTSVpFKSB7CiAJCWRldl9lcnIoJmRldi0+c2JkLmNvcmUsCi0JCQkiJXM6JXU6IGNhbm5vdCBoYW5kbGUgYmxvY2sgc2l6ZSAlbHVcbiIsIF9fZnVuY19fLAorCQkJIiVzOiV1OiBjYW5ub3QgaGFuZGxlIGJsb2NrIHNpemUgJWxsdVxuIiwgX19mdW5jX18sCiAJCQlfX0xJTkVfXywgZGV2LT5ibGtfc2l6ZSk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGExMjgwLmMgYi9kcml2ZXJzL3Njc2kvcWxhMTI4MC5jCmluZGV4IDhjYjkyNDAuLmRmMDk4MjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGExMjgwLmMKKysrIGIvZHJpdmVycy9zY3NpL3FsYTEyODAuYwpAQCAtMTI4LDcgKzEyOCw3IEBACiAJLSBJbnRlZ3JhdGUgcWwxMjE2MF9zZXRfdGFyZ2V0X3BhcmFtZXRlcnMoKSB3aXRoIDEyODAgdmVyc2lvbgogCS0gTWFrZSBxbGExMjgwX3NldHVwKCkgbm9uIHN0YXRpYwogCS0gRG8gbm90IGNhbGwgcWxhMTI4MF9jaGVja19mb3JfZGVhZF9zY3NpX2J1cygpIG9uIGV2ZXJ5IEkvTyByZXF1ZXN0Ci0JICBzZW50IHRvIHRoZSBjYXJkIC0gdGhpcyBjb21tYW5kIHBhdXNlcyB0aGUgZmlybWFyZSEhIQorCSAgc2VudCB0byB0aGUgY2FyZCAtIHRoaXMgY29tbWFuZCBwYXVzZXMgdGhlIGZpcm13YXJlISEhCiAgICAgUmV2ICAzLjIzLjE1IEJldGEgTWFyY2ggMTksIDIwMDIsIEplcyBTb3JlbnNlbgogCS0gQ2xlYW4gdXAgcWxhMTI4MC5oIC0gcmVtb3ZlIG9ic29sZXRlIFFMX0RFQlVHX0xFVkVMX3ggZGVmaW5pdGlvbnMKIAktIFJlbW92ZSBhIHBpbGUgb2YgcG9pbnRsZXNzIGFuZCBjb25mdXNpbmcgKHNyYl90ICoqKSBhbmQKQEAgLTY1OSw3ICs2NTksNyBAQAogCS8qIFRoZSBmaXJtd2FyZSBpbnRlcmZhY2UgaXMsIHVtLCBpbnRlcmVzdGluZywgaW4gdGhhdCB0aGUKIAkgKiBhY3R1YWwgZmlybXdhcmUgaW1hZ2Ugb24gdGhlIGNoaXAgaXMgbGl0dGxlIGVuZGlhbiwgdGh1cywKIAkgKiB0aGUgcHJvY2VzcyBvZiB0YWtpbmcgdGhhdCBpbWFnZSB0byB0aGUgQ1BVIHdvdWxkIGVuZCB1cAotCSAqIGxpdHRsZSBlbmRpYW4uICBIb3dldmVyLCB0aGUgZmlybWFyZSBpbnRlcmZhY2UgcmVxdWlyZXMgaXQKKwkgKiBsaXR0bGUgZW5kaWFuLiAgSG93ZXZlciwgdGhlIGZpcm13YXJlIGludGVyZmFjZSByZXF1aXJlcyBpdAogCSAqIHRvIGJlIHJlYWQgYSB3b3JkICh0d28gYnl0ZXMpIGF0IGEgdGltZS4KIAkgKgogCSAqIFRoZSBuZXQgcmVzdWx0IG9mIHRoaXMgd291bGQgYmUgdGhhdCB0aGUgd29yZCAoYW5kCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfYXR0ci5jIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2F0dHIuYwppbmRleCBjZDUzNjI3Li5jN2FjZWY1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfYXR0ci5jCisrKyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9hdHRyLmMKQEAgLTMwMyw3ICszMDMsNyBAQAogCQllbHNlIGlmIChzdGFydCA9PSAoaGEtPmZsdF9yZWdpb25fYm9vdCAqIDQpIHx8CiAJCSAgICBzdGFydCA9PSAoaGEtPmZsdF9yZWdpb25fZncgKiA0KSkKIAkJCXZhbGlkID0gMTsKLQkJZWxzZSBpZiAoSVNfUUxBMjVYWChoYSkgJiYKKwkJZWxzZSBpZiAoKElTX1FMQTI1WFgoaGEpIHx8IElTX1FMQTgxWFgoaGEpKSAmJgogCQkgICAgc3RhcnQgPT0gKGhhLT5mbHRfcmVnaW9uX3ZwZF9udnJhbSAqIDQpKQogCQkgICAgdmFsaWQgPSAxOwogCQlpZiAoIXZhbGlkKSB7CkBAIC04MTUsNiArODE1LDIxIEBACiAJICAgIGhhLT5xbGFfc3RhdHMudG90YWxfaXNwX2Fib3J0cyk7CiB9CiAKK3N0YXRpYyBzc2l6ZV90CitxbGEyeDAwX21waV92ZXJzaW9uX3Nob3coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKyAgICBjaGFyICpidWYpCit7CisJc2NzaV9xbGFfaG9zdF90ICp2aGEgPSBzaG9zdF9wcml2KGNsYXNzX3RvX3Nob3N0KGRldikpOworCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OworCisJaWYgKCFJU19RTEE4MVhYKGhhKSkKKwkJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiXG4iKTsKKworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiUwMnguJTAyeC4lMDJ4LiUwMnggKCV4KVxuIiwKKwkgICAgaGEtPm1waV92ZXJzaW9uWzBdLCBoYS0+bXBpX3ZlcnNpb25bMV0sIGhhLT5tcGlfdmVyc2lvblsyXSwKKwkgICAgaGEtPm1waV92ZXJzaW9uWzNdLCBoYS0+bXBpX2NhcGFiaWxpdGllcyk7Cit9CisKIHN0YXRpYyBERVZJQ0VfQVRUUihkcml2ZXJfdmVyc2lvbiwgU19JUlVHTywgcWxhMngwMF9kcnZyX3ZlcnNpb25fc2hvdywgTlVMTCk7CiBzdGF0aWMgREVWSUNFX0FUVFIoZndfdmVyc2lvbiwgU19JUlVHTywgcWxhMngwMF9md192ZXJzaW9uX3Nob3csIE5VTEwpOwogc3RhdGljIERFVklDRV9BVFRSKHNlcmlhbF9udW0sIFNfSVJVR08sIHFsYTJ4MDBfc2VyaWFsX251bV9zaG93LCBOVUxMKTsKQEAgLTgzOSw2ICs4NTQsNyBAQAogCQkgICBOVUxMKTsKIHN0YXRpYyBERVZJQ0VfQVRUUih0b3RhbF9pc3BfYWJvcnRzLCBTX0lSVUdPLCBxbGEyeDAwX3RvdGFsX2lzcF9hYm9ydHNfc2hvdywKIAkJICAgTlVMTCk7CitzdGF0aWMgREVWSUNFX0FUVFIobXBpX3ZlcnNpb24sIFNfSVJVR08sIHFsYTJ4MDBfbXBpX3ZlcnNpb25fc2hvdywgTlVMTCk7CiAKIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpxbGEyeDAwX2hvc3RfYXR0cnNbXSA9IHsKIAkmZGV2X2F0dHJfZHJpdmVyX3ZlcnNpb24sCkBAIC04NTgsNiArODc0LDcgQEAKIAkmZGV2X2F0dHJfb3B0cm9tX2Zjb2RlX3ZlcnNpb24sCiAJJmRldl9hdHRyX29wdHJvbV9md192ZXJzaW9uLAogCSZkZXZfYXR0cl90b3RhbF9pc3BfYWJvcnRzLAorCSZkZXZfYXR0cl9tcGlfdmVyc2lvbiwKIAlOVUxMLAogfTsKIApAQCAtODkyLDYgKzkwOSw5IEBACiAJY2FzZSBQT1JUX1NQRUVEXzhHQjoKIAkJc3BlZWQgPSBGQ19QT1JUU1BFRURfOEdCSVQ7CiAJCWJyZWFrOworCWNhc2UgUE9SVF9TUEVFRF8xMEdCOgorCQlzcGVlZCA9IEZDX1BPUlRTUEVFRF8xMEdCSVQ7CisJCWJyZWFrOwogCX0KIAlmY19ob3N0X3NwZWVkKHNob3N0KSA9IHNwZWVkOwogfQpAQCAtMTM4Miw3ICsxNDAyLDkgQEAKIAlmY19ob3N0X21heF9ucGl2X3Zwb3J0cyh2aGEtPmhvc3QpID0gaGEtPm1heF9ucGl2X3Zwb3J0czsKIAlmY19ob3N0X25waXZfdnBvcnRzX2ludXNlKHZoYS0+aG9zdCkgPSBoYS0+Y3VyX3Zwb3J0X2NvdW50OwogCi0JaWYgKElTX1FMQTI1WFgoaGEpKQorCWlmIChJU19RTEE4MVhYKGhhKSkKKwkJc3BlZWQgPSBGQ19QT1JUU1BFRURfMTBHQklUOworCWVsc2UgaWYgKElTX1FMQTI1WFgoaGEpKQogCQlzcGVlZCA9IEZDX1BPUlRTUEVFRF84R0JJVCB8IEZDX1BPUlRTUEVFRF80R0JJVCB8CiAJCSAgICBGQ19QT1JUU1BFRURfMkdCSVQgfCBGQ19QT1JUU1BFRURfMUdCSVQ7CiAJZWxzZSBpZiAoSVNfUUxBMjRYWF9UWVBFKGhhKSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9kYmcuYyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9kYmcuYwppbmRleCAxY2Y3Nzc3Li4zNDc2MGY4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZGJnLmMKKysrIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2RiZy5jCkBAIC0zMTAsNiArMzEwLDc2IEBACiAJCSpidWYrKyA9IGh0b25zKFJEX1JFR19XT1JEKGRtcF9yZWcrKykpOwogfQogCitzdGF0aWMgaW5saW5lIHZvaWQgKgorcWxhMjR4eF9jb3B5X2VmdChzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhLCB2b2lkICpwdHIpCit7CisJaWYgKCFoYS0+ZWZ0KQorCQlyZXR1cm4gcHRyOworCisJbWVtY3B5KHB0ciwgaGEtPmVmdCwgbnRvaGwoaGEtPmZ3X2R1bXAtPmVmdF9zaXplKSk7CisJcmV0dXJuIHB0ciArIG50b2hsKGhhLT5md19kdW1wLT5lZnRfc2l6ZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCAqCitxbGEyNXh4X2NvcHlfZmNlKHN0cnVjdCBxbGFfaHdfZGF0YSAqaGEsIHZvaWQgKnB0ciwgdWludDMyX3QgKipsYXN0X2NoYWluKQoreworCXVpbnQzMl90IGNudDsKKwl1aW50MzJfdCAqaXRlcl9yZWc7CisJc3RydWN0IHFsYTJ4eHhfZmNlX2NoYWluICpmY2VjID0gcHRyOworCisJaWYgKCFoYS0+ZmNlKQorCQlyZXR1cm4gcHRyOworCisJKmxhc3RfY2hhaW4gPSAmZmNlYy0+dHlwZTsKKwlmY2VjLT50eXBlID0gX19jb25zdGFudF9odG9ubChEVU1QX0NIQUlOX0ZDRSk7CisJZmNlYy0+Y2hhaW5fc2l6ZSA9IGh0b25sKHNpemVvZihzdHJ1Y3QgcWxhMnh4eF9mY2VfY2hhaW4pICsKKwkgICAgZmNlX2NhbGNfc2l6ZShoYS0+ZmNlX2J1ZnMpKTsKKwlmY2VjLT5zaXplID0gaHRvbmwoZmNlX2NhbGNfc2l6ZShoYS0+ZmNlX2J1ZnMpKTsKKwlmY2VjLT5hZGRyX2wgPSBodG9ubChMU0QoaGEtPmZjZV9kbWEpKTsKKwlmY2VjLT5hZGRyX2ggPSBodG9ubChNU0QoaGEtPmZjZV9kbWEpKTsKKworCWl0ZXJfcmVnID0gZmNlYy0+ZXJlZ3M7CisJZm9yIChjbnQgPSAwOyBjbnQgPCA4OyBjbnQrKykKKwkJKml0ZXJfcmVnKysgPSBodG9ubChoYS0+ZmNlX21iW2NudF0pOworCisJbWVtY3B5KGl0ZXJfcmVnLCBoYS0+ZmNlLCBudG9obChmY2VjLT5zaXplKSk7CisKKwlyZXR1cm4gaXRlcl9yZWc7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCAqCitxbGEyNXh4X2NvcHlfbXEoc3RydWN0IHFsYV9od19kYXRhICpoYSwgdm9pZCAqcHRyLCB1aW50MzJfdCAqKmxhc3RfY2hhaW4pCit7CisJdWludDMyX3QgY250LCBxdWVfaWR4OworCXVpbnQ4X3QgcmVxX2NudCwgcnNwX2NudCwgcXVlX2NudDsKKwlzdHJ1Y3QgcWxhMnh4eF9tcV9jaGFpbiAqbXEgPSBwdHI7CisJc3RydWN0IGRldmljZV9yZWdfMjV4eG1xIF9faW9tZW0gKnJlZzsKKworCWlmICghaGEtPm1xZW5hYmxlKQorCQlyZXR1cm4gcHRyOworCisJbXEgPSBwdHI7CisJKmxhc3RfY2hhaW4gPSAmbXEtPnR5cGU7CisJbXEtPnR5cGUgPSBfX2NvbnN0YW50X2h0b25sKERVTVBfQ0hBSU5fTVEpOworCW1xLT5jaGFpbl9zaXplID0gX19jb25zdGFudF9odG9ubChzaXplb2Yoc3RydWN0IHFsYTJ4eHhfbXFfY2hhaW4pKTsKKworCXJlcV9jbnQgPSBmaW5kX2ZpcnN0X3plcm9fYml0KGhhLT5yZXFfcWlkX21hcCwgaGEtPm1heF9xdWV1ZXMpOworCXJzcF9jbnQgPSBmaW5kX2ZpcnN0X3plcm9fYml0KGhhLT5yc3BfcWlkX21hcCwgaGEtPm1heF9xdWV1ZXMpOworCXF1ZV9jbnQgPSByZXFfY250ID4gcnNwX2NudCA/IHJlcV9jbnQgOiByc3BfY250OworCW1xLT5jb3VudCA9IGh0b25sKHF1ZV9jbnQpOworCWZvciAoY250ID0gMDsgY250IDwgcXVlX2NudDsgY250KyspIHsKKwkJcmVnID0gKHN0cnVjdCBkZXZpY2VfcmVnXzI1eHhtcSAqKSAoKHZvaWQgKikKKwkJCWhhLT5tcWlvYmFzZSArIGNudCAqIFFMQV9RVUVfUEFHRSk7CisJCXF1ZV9pZHggPSBjbnQgKiA0OworCQltcS0+cXJlZ3NbcXVlX2lkeF0gPSBodG9ubChSRF9SRUdfRFdPUkQoJnJlZy0+cmVxX3FfaW4pKTsKKwkJbXEtPnFyZWdzW3F1ZV9pZHgrMV0gPSBodG9ubChSRF9SRUdfRFdPUkQoJnJlZy0+cmVxX3Ffb3V0KSk7CisJCW1xLT5xcmVnc1txdWVfaWR4KzJdID0gaHRvbmwoUkRfUkVHX0RXT1JEKCZyZWctPnJzcF9xX2luKSk7CisJCW1xLT5xcmVnc1txdWVfaWR4KzNdID0gaHRvbmwoUkRfUkVHX0RXT1JEKCZyZWctPnJzcF9xX291dCkpOworCX0KKworCXJldHVybiBwdHIgKyBzaXplb2Yoc3RydWN0IHFsYTJ4eHhfbXFfY2hhaW4pOworfQorCiAvKioKICAqIHFsYTIzMDBfZndfZHVtcCgpIC0gRHVtcHMgYmluYXJ5IGRhdGEgZnJvbSB0aGUgMjMwMCBmaXJtd2FyZS4KICAqIEBoYTogSEEgY29udGV4dApAQCAtOTEzLDggKzk4Myw4IEBACiAJCWdvdG8gcWxhMjR4eF9md19kdW1wX2ZhaWxlZF8wOwogCiAJbnh0ID0gcWxhMnh4eF9jb3B5X3F1ZXVlcyhoYSwgbnh0KTsKLQlpZiAoaGEtPmVmdCkKLQkJbWVtY3B5KG54dCwgaGEtPmVmdCwgbnRvaGwoaGEtPmZ3X2R1bXAtPmVmdF9zaXplKSk7CisKKwlxbGEyNHh4X2NvcHlfZWZ0KGhhLCBueHQpOwogCiBxbGEyNHh4X2Z3X2R1bXBfZmFpbGVkXzA6CiAJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKQEAgLTk0MiwxOSArMTAxMiwxNCBAQAogCXVpbnQzMl90CXJpc2NfYWRkcmVzczsKIAlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKIAlzdHJ1Y3QgZGV2aWNlX3JlZ18yNHh4IF9faW9tZW0gKnJlZyA9ICZoYS0+aW9iYXNlLT5pc3AyNDsKLQlzdHJ1Y3QgZGV2aWNlX3JlZ18yNXh4bXEgX19pb21lbSAqcmVnMjU7CiAJdWludDMyX3QgX19pb21lbSAqZG1wX3JlZzsKIAl1aW50MzJfdAkqaXRlcl9yZWc7CiAJdWludDE2X3QgX19pb21lbSAqbWJ4X3JlZzsKIAl1bnNpZ25lZCBsb25nCWZsYWdzOwogCXN0cnVjdCBxbGEyNXh4X2Z3X2R1bXAgKmZ3OwogCXVpbnQzMl90CWV4dF9tZW1fY250OwotCXZvaWQJCSpueHQ7Ci0Jc3RydWN0IHFsYTJ4eHhfZmNlX2NoYWluICpmY2VjOwotCXN0cnVjdCBxbGEyeHh4X21xX2NoYWluICptcSA9IE5VTEw7Ci0JdWludDMyX3QJcXJlZ19zaXplOwotCXVpbnQ4X3QJCXJlcV9jbnQsIHJzcF9jbnQsIHF1ZV9jbnQ7Ci0JdWludDMyX3QJcXVlX2lkeDsKKwl2b2lkCQkqbnh0LCAqbnh0X2NoYWluOworCXVpbnQzMl90CSpsYXN0X2NoYWluID0gTlVMTDsKIAlzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqYmFzZV92aGEgPSBwY2lfZ2V0X2RydmRhdGEoaGEtPnBkZXYpOwogCiAJcmlzY19hZGRyZXNzID0gZXh0X21lbV9jbnQgPSAwOwpAQCAtMTAwMSwyOCArMTA2Niw2IEBACiAJZnctPnBjaWVfcmVnc1syXSA9IGh0b25sKFJEX1JFR19EV09SRChkbXBfcmVnKSk7CiAJZnctPnBjaWVfcmVnc1szXSA9IGh0b25sKFJEX1JFR19EV09SRCgmcmVnLT5pb2Jhc2Vfd2luZG93KSk7CiAKLQkvKiBNdWx0aSBxdWV1ZSByZWdpc3RlcnMgKi8KLQlpZiAoaGEtPm1xZW5hYmxlKSB7Ci0JCXFyZWdfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgcWxhMnh4eF9tcV9jaGFpbik7Ci0JCW1xID0ga3phbGxvYyhxcmVnX3NpemUsIEdGUF9LRVJORUwpOwotCQlpZiAoIW1xKQotCQkJZ290byBxbGEyNXh4X2Z3X2R1bXBfZmFpbGVkXzA7Ci0JCXJlcV9jbnQgPSBmaW5kX2ZpcnN0X3plcm9fYml0KGhhLT5yZXFfcWlkX21hcCwgaGEtPm1heF9xdWV1ZXMpOwotCQlyc3BfY250ID0gZmluZF9maXJzdF96ZXJvX2JpdChoYS0+cnNwX3FpZF9tYXAsIGhhLT5tYXhfcXVldWVzKTsKLQkJcXVlX2NudCA9IHJlcV9jbnQgPiByc3BfY250ID8gcmVxX2NudCA6IHJzcF9jbnQ7Ci0JCW1xLT5jb3VudCA9IGh0b25sKHF1ZV9jbnQpOwotCQltcS0+Y2hhaW5fc2l6ZSA9IGh0b25sKHFyZWdfc2l6ZSk7Ci0JCW1xLT50eXBlID0gX19jb25zdGFudF9odG9ubChEVU1QX0NIQUlOX01RKTsKLQkJZm9yIChjbnQgPSAwOyBjbnQgPCBxdWVfY250OyBjbnQrKykgewotCQkJcmVnMjUgPSAoc3RydWN0IGRldmljZV9yZWdfMjV4eG1xICopICgodm9pZCAqKQotCQkJCWhhLT5tcWlvYmFzZSArIGNudCAqIFFMQV9RVUVfUEFHRSk7Ci0JCQlxdWVfaWR4ID0gY250ICogNDsKLQkJCW1xLT5xcmVnc1txdWVfaWR4XSA9IGh0b25sKHJlZzI1LT5yZXFfcV9pbik7Ci0JCQltcS0+cXJlZ3NbcXVlX2lkeCsxXSA9IGh0b25sKHJlZzI1LT5yZXFfcV9vdXQpOwotCQkJbXEtPnFyZWdzW3F1ZV9pZHgrMl0gPSBodG9ubChyZWcyNS0+cnNwX3FfaW4pOwotCQkJbXEtPnFyZWdzW3F1ZV9pZHgrM10gPSBodG9ubChyZWcyNS0+cnNwX3Ffb3V0KTsKLQkJfQotCX0KIAlXUlRfUkVHX0RXT1JEKCZyZWctPmlvYmFzZV93aW5kb3csIDB4MDApOwogCVJEX1JFR19EV09SRCgmcmVnLT5pb2Jhc2Vfd2luZG93KTsKIApAQCAtMTI0MCw2ICsxMjgzLDEwIEBACiAJaXRlcl9yZWcgPSBxbGEyNHh4X3JlYWRfd2luZG93KHJlZywgMHg2MUIwLCAxNiwgaXRlcl9yZWcpOwogCXFsYTI0eHhfcmVhZF93aW5kb3cocmVnLCAweDZGMDAsIDE2LCBpdGVyX3JlZyk7CiAKKwkvKiBNdWx0aSBxdWV1ZSByZWdpc3RlcnMgKi8KKwlueHRfY2hhaW4gPSBxbGEyNXh4X2NvcHlfbXEoaGEsICh2b2lkICopaGEtPmZ3X2R1bXAgKyBoYS0+Y2hhaW5fb2Zmc2V0LAorCSAgICAmbGFzdF9jaGFpbik7CisKIAlydmFsID0gcWxhMjR4eF9zb2Z0X3Jlc2V0KGhhKTsKIAlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykKIAkJZ290byBxbGEyNXh4X2Z3X2R1bXBfZmFpbGVkXzA7CkBAIC0xMjQ5LDM3ICsxMjk2LDE2IEBACiAJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpCiAJCWdvdG8gcWxhMjV4eF9md19kdW1wX2ZhaWxlZF8wOwogCi0JLyogRmlicmUgQ2hhbm5lbCBUcmFjZSBCdWZmZXIuICovCiAJbnh0ID0gcWxhMnh4eF9jb3B5X3F1ZXVlcyhoYSwgbnh0KTsKLQlpZiAoaGEtPmVmdCkKLQkJbWVtY3B5KG54dCwgaGEtPmVmdCwgbnRvaGwoaGEtPmZ3X2R1bXAtPmVmdF9zaXplKSk7CiAKLQkvKiBGaWJyZSBDaGFubmVsIEV2ZW50IEJ1ZmZlci4gKi8KLQlpZiAoIWhhLT5mY2UpCi0JCWdvdG8gcWxhMjV4eF9md19kdW1wX2ZhaWxlZF8wOworCW54dCA9IHFsYTI0eHhfY29weV9lZnQoaGEsIG54dCk7CiAKLQloYS0+ZndfZHVtcC0+dmVyc2lvbiB8PSBfX2NvbnN0YW50X2h0b25sKERVTVBfQ0hBSU5fVkFSSUFOVCk7Ci0KLQlpZiAoaGEtPm1xZW5hYmxlKSB7Ci0JCW54dCA9IG54dCArIG50b2hsKGhhLT5md19kdW1wLT5lZnRfc2l6ZSk7Ci0JCW1lbWNweShueHQsIG1xLCBxcmVnX3NpemUpOwotCQlrZnJlZShtcSk7Ci0JCWZjZWMgPSBueHQgKyBxcmVnX3NpemU7Ci0JfSBlbHNlIHsKLQkJZmNlYyA9IG54dCArIG50b2hsKGhhLT5md19kdW1wLT5lZnRfc2l6ZSk7CisJLyogQ2hhaW4gZW50cmllcyAtLSBzdGFydGVkIHdpdGggTVEuICovCisJcWxhMjV4eF9jb3B5X2ZjZShoYSwgbnh0X2NoYWluLCAmbGFzdF9jaGFpbik7CisJaWYgKGxhc3RfY2hhaW4pIHsKKwkJaGEtPmZ3X2R1bXAtPnZlcnNpb24gfD0gX19jb25zdGFudF9odG9ubChEVU1QX0NIQUlOX1ZBUklBTlQpOworCQkqbGFzdF9jaGFpbiB8PSBfX2NvbnN0YW50X2h0b25sKERVTVBfQ0hBSU5fTEFTVCk7CiAJfQotCWZjZWMtPnR5cGUgPSBfX2NvbnN0YW50X2h0b25sKERVTVBfQ0hBSU5fRkNFIHwgRFVNUF9DSEFJTl9MQVNUKTsKLQlmY2VjLT5jaGFpbl9zaXplID0gaHRvbmwoc2l6ZW9mKHN0cnVjdCBxbGEyeHh4X2ZjZV9jaGFpbikgKwotCSAgICBmY2VfY2FsY19zaXplKGhhLT5mY2VfYnVmcykpOwotCWZjZWMtPnNpemUgPSBodG9ubChmY2VfY2FsY19zaXplKGhhLT5mY2VfYnVmcykpOwotCWZjZWMtPmFkZHJfbCA9IGh0b25sKExTRChoYS0+ZmNlX2RtYSkpOwotCWZjZWMtPmFkZHJfaCA9IGh0b25sKE1TRChoYS0+ZmNlX2RtYSkpOwotCi0JaXRlcl9yZWcgPSBmY2VjLT5lcmVnczsKLQlmb3IgKGNudCA9IDA7IGNudCA8IDg7IGNudCsrKQotCQkqaXRlcl9yZWcrKyA9IGh0b25sKGhhLT5mY2VfbWJbY250XSk7Ci0KLQltZW1jcHkoaXRlcl9yZWcsIGhhLT5mY2UsIG50b2hsKGZjZWMtPnNpemUpKTsKIAogcWxhMjV4eF9md19kdW1wX2ZhaWxlZF8wOgogCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7CkBAIC0xMjk4LDYgKzEzMjQsMzMwIEBACiAJaWYgKCFoYXJkd2FyZV9sb2NrZWQpCiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhhLT5oYXJkd2FyZV9sb2NrLCBmbGFncyk7CiB9CisKK3ZvaWQKK3FsYTgxeHhfZndfZHVtcChzY3NpX3FsYV9ob3N0X3QgKnZoYSwgaW50IGhhcmR3YXJlX2xvY2tlZCkKK3sKKwlpbnQJCXJ2YWw7CisJdWludDMyX3QJY250OworCXVpbnQzMl90CXJpc2NfYWRkcmVzczsKKwlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKKwlzdHJ1Y3QgZGV2aWNlX3JlZ18yNHh4IF9faW9tZW0gKnJlZyA9ICZoYS0+aW9iYXNlLT5pc3AyNDsKKwl1aW50MzJfdCBfX2lvbWVtICpkbXBfcmVnOworCXVpbnQzMl90CSppdGVyX3JlZzsKKwl1aW50MTZfdCBfX2lvbWVtICptYnhfcmVnOworCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisJc3RydWN0IHFsYTgxeHhfZndfZHVtcCAqZnc7CisJdWludDMyX3QJZXh0X21lbV9jbnQ7CisJdm9pZAkJKm54dCwgKm54dF9jaGFpbjsKKwl1aW50MzJfdAkqbGFzdF9jaGFpbiA9IE5VTEw7CisJc3RydWN0IHNjc2lfcWxhX2hvc3QgKmJhc2VfdmhhID0gcGNpX2dldF9kcnZkYXRhKGhhLT5wZGV2KTsKKworCXJpc2NfYWRkcmVzcyA9IGV4dF9tZW1fY250ID0gMDsKKwlmbGFncyA9IDA7CisKKwlpZiAoIWhhcmR3YXJlX2xvY2tlZCkKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmhhLT5oYXJkd2FyZV9sb2NrLCBmbGFncyk7CisKKwlpZiAoIWhhLT5md19kdW1wKSB7CisJCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKKwkJICAgICJObyBidWZmZXIgYXZhaWxhYmxlIGZvciBkdW1wISEhXG4iKTsKKwkJZ290byBxbGE4MXh4X2Z3X2R1bXBfZmFpbGVkOworCX0KKworCWlmIChoYS0+ZndfZHVtcGVkKSB7CisJCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKKwkJICAgICJGaXJtd2FyZSBoYXMgYmVlbiBwcmV2aW91c2x5IGR1bXBlZCAoJXApIC0tIGlnbm9yaW5nICIKKwkJICAgICJyZXF1ZXN0Li4uXG4iLCBoYS0+ZndfZHVtcCk7CisJCWdvdG8gcWxhODF4eF9md19kdW1wX2ZhaWxlZDsKKwl9CisJZncgPSAmaGEtPmZ3X2R1bXAtPmlzcC5pc3A4MTsKKwlxbGEyeHh4X3ByZXBfZHVtcChoYSwgaGEtPmZ3X2R1bXApOworCisJZnctPmhvc3Rfc3RhdHVzID0gaHRvbmwoUkRfUkVHX0RXT1JEKCZyZWctPmhvc3Rfc3RhdHVzKSk7CisKKwkvKiBQYXVzZSBSSVNDLiAqLworCXJ2YWwgPSBxbGEyNHh4X3BhdXNlX3Jpc2MocmVnKTsKKwlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykKKwkJZ290byBxbGE4MXh4X2Z3X2R1bXBfZmFpbGVkXzA7CisKKwkvKiBIb3N0L1Jpc2MgcmVnaXN0ZXJzLiAqLworCWl0ZXJfcmVnID0gZnctPmhvc3RfcmlzY19yZWc7CisJaXRlcl9yZWcgPSBxbGEyNHh4X3JlYWRfd2luZG93KHJlZywgMHg3MDAwLCAxNiwgaXRlcl9yZWcpOworCXFsYTI0eHhfcmVhZF93aW5kb3cocmVnLCAweDcwMTAsIDE2LCBpdGVyX3JlZyk7CisKKwkvKiBQQ0llIHJlZ2lzdGVycy4gKi8KKwlXUlRfUkVHX0RXT1JEKCZyZWctPmlvYmFzZV9hZGRyLCAweDdDMDApOworCVJEX1JFR19EV09SRCgmcmVnLT5pb2Jhc2VfYWRkcik7CisJV1JUX1JFR19EV09SRCgmcmVnLT5pb2Jhc2Vfd2luZG93LCAweDAxKTsKKwlkbXBfcmVnID0gJnJlZy0+aW9iYXNlX2M0OworCWZ3LT5wY2llX3JlZ3NbMF0gPSBodG9ubChSRF9SRUdfRFdPUkQoZG1wX3JlZysrKSk7CisJZnctPnBjaWVfcmVnc1sxXSA9IGh0b25sKFJEX1JFR19EV09SRChkbXBfcmVnKyspKTsKKwlmdy0+cGNpZV9yZWdzWzJdID0gaHRvbmwoUkRfUkVHX0RXT1JEKGRtcF9yZWcpKTsKKwlmdy0+cGNpZV9yZWdzWzNdID0gaHRvbmwoUkRfUkVHX0RXT1JEKCZyZWctPmlvYmFzZV93aW5kb3cpKTsKKworCVdSVF9SRUdfRFdPUkQoJnJlZy0+aW9iYXNlX3dpbmRvdywgMHgwMCk7CisJUkRfUkVHX0RXT1JEKCZyZWctPmlvYmFzZV93aW5kb3cpOworCisJLyogSG9zdCBpbnRlcmZhY2UgcmVnaXN0ZXJzLiAqLworCWRtcF9yZWcgPSAmcmVnLT5mbGFzaF9hZGRyOworCWZvciAoY250ID0gMDsgY250IDwgc2l6ZW9mKGZ3LT5ob3N0X3JlZykgLyA0OyBjbnQrKykKKwkJZnctPmhvc3RfcmVnW2NudF0gPSBodG9ubChSRF9SRUdfRFdPUkQoZG1wX3JlZysrKSk7CisKKwkvKiBEaXNhYmxlIGludGVycnVwdHMuICovCisJV1JUX1JFR19EV09SRCgmcmVnLT5pY3RybCwgMCk7CisJUkRfUkVHX0RXT1JEKCZyZWctPmljdHJsKTsKKworCS8qIFNoYWRvdyByZWdpc3RlcnMuICovCisJV1JUX1JFR19EV09SRCgmcmVnLT5pb2Jhc2VfYWRkciwgMHgwRjcwKTsKKwlSRF9SRUdfRFdPUkQoJnJlZy0+aW9iYXNlX2FkZHIpOworCVdSVF9SRUdfRFdPUkQoJnJlZy0+aW9iYXNlX3NlbGVjdCwgMHhCMDAwMDAwMCk7CisJZnctPnNoYWRvd19yZWdbMF0gPSBodG9ubChSRF9SRUdfRFdPUkQoJnJlZy0+aW9iYXNlX3NkYXRhKSk7CisKKwlXUlRfUkVHX0RXT1JEKCZyZWctPmlvYmFzZV9zZWxlY3QsIDB4QjAxMDAwMDApOworCWZ3LT5zaGFkb3dfcmVnWzFdID0gaHRvbmwoUkRfUkVHX0RXT1JEKCZyZWctPmlvYmFzZV9zZGF0YSkpOworCisJV1JUX1JFR19EV09SRCgmcmVnLT5pb2Jhc2Vfc2VsZWN0LCAweEIwMjAwMDAwKTsKKwlmdy0+c2hhZG93X3JlZ1syXSA9IGh0b25sKFJEX1JFR19EV09SRCgmcmVnLT5pb2Jhc2Vfc2RhdGEpKTsKKworCVdSVF9SRUdfRFdPUkQoJnJlZy0+aW9iYXNlX3NlbGVjdCwgMHhCMDMwMDAwMCk7CisJZnctPnNoYWRvd19yZWdbM10gPSBodG9ubChSRF9SRUdfRFdPUkQoJnJlZy0+aW9iYXNlX3NkYXRhKSk7CisKKwlXUlRfUkVHX0RXT1JEKCZyZWctPmlvYmFzZV9zZWxlY3QsIDB4QjA0MDAwMDApOworCWZ3LT5zaGFkb3dfcmVnWzRdID0gaHRvbmwoUkRfUkVHX0RXT1JEKCZyZWctPmlvYmFzZV9zZGF0YSkpOworCisJV1JUX1JFR19EV09SRCgmcmVnLT5pb2Jhc2Vfc2VsZWN0LCAweEIwNTAwMDAwKTsKKwlmdy0+c2hhZG93X3JlZ1s1XSA9IGh0b25sKFJEX1JFR19EV09SRCgmcmVnLT5pb2Jhc2Vfc2RhdGEpKTsKKworCVdSVF9SRUdfRFdPUkQoJnJlZy0+aW9iYXNlX3NlbGVjdCwgMHhCMDYwMDAwMCk7CisJZnctPnNoYWRvd19yZWdbNl0gPSBodG9ubChSRF9SRUdfRFdPUkQoJnJlZy0+aW9iYXNlX3NkYXRhKSk7CisKKwlXUlRfUkVHX0RXT1JEKCZyZWctPmlvYmFzZV9zZWxlY3QsIDB4QjA3MDAwMDApOworCWZ3LT5zaGFkb3dfcmVnWzddID0gaHRvbmwoUkRfUkVHX0RXT1JEKCZyZWctPmlvYmFzZV9zZGF0YSkpOworCisJV1JUX1JFR19EV09SRCgmcmVnLT5pb2Jhc2Vfc2VsZWN0LCAweEIwODAwMDAwKTsKKwlmdy0+c2hhZG93X3JlZ1s4XSA9IGh0b25sKFJEX1JFR19EV09SRCgmcmVnLT5pb2Jhc2Vfc2RhdGEpKTsKKworCVdSVF9SRUdfRFdPUkQoJnJlZy0+aW9iYXNlX3NlbGVjdCwgMHhCMDkwMDAwMCk7CisJZnctPnNoYWRvd19yZWdbOV0gPSBodG9ubChSRF9SRUdfRFdPUkQoJnJlZy0+aW9iYXNlX3NkYXRhKSk7CisKKwlXUlRfUkVHX0RXT1JEKCZyZWctPmlvYmFzZV9zZWxlY3QsIDB4QjBBMDAwMDApOworCWZ3LT5zaGFkb3dfcmVnWzEwXSA9IGh0b25sKFJEX1JFR19EV09SRCgmcmVnLT5pb2Jhc2Vfc2RhdGEpKTsKKworCS8qIFJJU0MgSS9PIHJlZ2lzdGVyLiAqLworCVdSVF9SRUdfRFdPUkQoJnJlZy0+aW9iYXNlX2FkZHIsIDB4MDAxMCk7CisJZnctPnJpc2NfaW9fcmVnID0gaHRvbmwoUkRfUkVHX0RXT1JEKCZyZWctPmlvYmFzZV93aW5kb3cpKTsKKworCS8qIE1haWxib3ggcmVnaXN0ZXJzLiAqLworCW1ieF9yZWcgPSAmcmVnLT5tYWlsYm94MDsKKwlmb3IgKGNudCA9IDA7IGNudCA8IHNpemVvZihmdy0+bWFpbGJveF9yZWcpIC8gMjsgY250KyspCisJCWZ3LT5tYWlsYm94X3JlZ1tjbnRdID0gaHRvbnMoUkRfUkVHX1dPUkQobWJ4X3JlZysrKSk7CisKKwkvKiBUcmFuc2ZlciBzZXF1ZW5jZSByZWdpc3RlcnMuICovCisJaXRlcl9yZWcgPSBmdy0+eHNlcV9ncF9yZWc7CisJaXRlcl9yZWcgPSBxbGEyNHh4X3JlYWRfd2luZG93KHJlZywgMHhCRjAwLCAxNiwgaXRlcl9yZWcpOworCWl0ZXJfcmVnID0gcWxhMjR4eF9yZWFkX3dpbmRvdyhyZWcsIDB4QkYxMCwgMTYsIGl0ZXJfcmVnKTsKKwlpdGVyX3JlZyA9IHFsYTI0eHhfcmVhZF93aW5kb3cocmVnLCAweEJGMjAsIDE2LCBpdGVyX3JlZyk7CisJaXRlcl9yZWcgPSBxbGEyNHh4X3JlYWRfd2luZG93KHJlZywgMHhCRjMwLCAxNiwgaXRlcl9yZWcpOworCWl0ZXJfcmVnID0gcWxhMjR4eF9yZWFkX3dpbmRvdyhyZWcsIDB4QkY0MCwgMTYsIGl0ZXJfcmVnKTsKKwlpdGVyX3JlZyA9IHFsYTI0eHhfcmVhZF93aW5kb3cocmVnLCAweEJGNTAsIDE2LCBpdGVyX3JlZyk7CisJaXRlcl9yZWcgPSBxbGEyNHh4X3JlYWRfd2luZG93KHJlZywgMHhCRjYwLCAxNiwgaXRlcl9yZWcpOworCXFsYTI0eHhfcmVhZF93aW5kb3cocmVnLCAweEJGNzAsIDE2LCBpdGVyX3JlZyk7CisKKwlpdGVyX3JlZyA9IGZ3LT54c2VxXzBfcmVnOworCWl0ZXJfcmVnID0gcWxhMjR4eF9yZWFkX3dpbmRvdyhyZWcsIDB4QkZDMCwgMTYsIGl0ZXJfcmVnKTsKKwlpdGVyX3JlZyA9IHFsYTI0eHhfcmVhZF93aW5kb3cocmVnLCAweEJGRDAsIDE2LCBpdGVyX3JlZyk7CisJcWxhMjR4eF9yZWFkX3dpbmRvdyhyZWcsIDB4QkZFMCwgMTYsIGl0ZXJfcmVnKTsKKworCXFsYTI0eHhfcmVhZF93aW5kb3cocmVnLCAweEJGRjAsIDE2LCBmdy0+eHNlcV8xX3JlZyk7CisKKwkvKiBSZWNlaXZlIHNlcXVlbmNlIHJlZ2lzdGVycy4gKi8KKwlpdGVyX3JlZyA9IGZ3LT5yc2VxX2dwX3JlZzsKKwlpdGVyX3JlZyA9IHFsYTI0eHhfcmVhZF93aW5kb3cocmVnLCAweEZGMDAsIDE2LCBpdGVyX3JlZyk7CisJaXRlcl9yZWcgPSBxbGEyNHh4X3JlYWRfd2luZG93KHJlZywgMHhGRjEwLCAxNiwgaXRlcl9yZWcpOworCWl0ZXJfcmVnID0gcWxhMjR4eF9yZWFkX3dpbmRvdyhyZWcsIDB4RkYyMCwgMTYsIGl0ZXJfcmVnKTsKKwlpdGVyX3JlZyA9IHFsYTI0eHhfcmVhZF93aW5kb3cocmVnLCAweEZGMzAsIDE2LCBpdGVyX3JlZyk7CisJaXRlcl9yZWcgPSBxbGEyNHh4X3JlYWRfd2luZG93KHJlZywgMHhGRjQwLCAxNiwgaXRlcl9yZWcpOworCWl0ZXJfcmVnID0gcWxhMjR4eF9yZWFkX3dpbmRvdyhyZWcsIDB4RkY1MCwgMTYsIGl0ZXJfcmVnKTsKKwlpdGVyX3JlZyA9IHFsYTI0eHhfcmVhZF93aW5kb3cocmVnLCAweEZGNjAsIDE2LCBpdGVyX3JlZyk7CisJcWxhMjR4eF9yZWFkX3dpbmRvdyhyZWcsIDB4RkY3MCwgMTYsIGl0ZXJfcmVnKTsKKworCWl0ZXJfcmVnID0gZnctPnJzZXFfMF9yZWc7CisJaXRlcl9yZWcgPSBxbGEyNHh4X3JlYWRfd2luZG93KHJlZywgMHhGRkMwLCAxNiwgaXRlcl9yZWcpOworCXFsYTI0eHhfcmVhZF93aW5kb3cocmVnLCAweEZGRDAsIDE2LCBpdGVyX3JlZyk7CisKKwlxbGEyNHh4X3JlYWRfd2luZG93KHJlZywgMHhGRkUwLCAxNiwgZnctPnJzZXFfMV9yZWcpOworCXFsYTI0eHhfcmVhZF93aW5kb3cocmVnLCAweEZGRjAsIDE2LCBmdy0+cnNlcV8yX3JlZyk7CisKKwkvKiBBdXhpbGlhcnkgc2VxdWVuY2UgcmVnaXN0ZXJzLiAqLworCWl0ZXJfcmVnID0gZnctPmFzZXFfZ3BfcmVnOworCWl0ZXJfcmVnID0gcWxhMjR4eF9yZWFkX3dpbmRvdyhyZWcsIDB4QjAwMCwgMTYsIGl0ZXJfcmVnKTsKKwlpdGVyX3JlZyA9IHFsYTI0eHhfcmVhZF93aW5kb3cocmVnLCAweEIwMTAsIDE2LCBpdGVyX3JlZyk7CisJaXRlcl9yZWcgPSBxbGEyNHh4X3JlYWRfd2luZG93KHJlZywgMHhCMDIwLCAxNiwgaXRlcl9yZWcpOworCWl0ZXJfcmVnID0gcWxhMjR4eF9yZWFkX3dpbmRvdyhyZWcsIDB4QjAzMCwgMTYsIGl0ZXJfcmVnKTsKKwlpdGVyX3JlZyA9IHFsYTI0eHhfcmVhZF93aW5kb3cocmVnLCAweEIwNDAsIDE2LCBpdGVyX3JlZyk7CisJaXRlcl9yZWcgPSBxbGEyNHh4X3JlYWRfd2luZG93KHJlZywgMHhCMDUwLCAxNiwgaXRlcl9yZWcpOworCWl0ZXJfcmVnID0gcWxhMjR4eF9yZWFkX3dpbmRvdyhyZWcsIDB4QjA2MCwgMTYsIGl0ZXJfcmVnKTsKKwlxbGEyNHh4X3JlYWRfd2luZG93KHJlZywgMHhCMDcwLCAxNiwgaXRlcl9yZWcpOworCisJaXRlcl9yZWcgPSBmdy0+YXNlcV8wX3JlZzsKKwlpdGVyX3JlZyA9IHFsYTI0eHhfcmVhZF93aW5kb3cocmVnLCAweEIwQzAsIDE2LCBpdGVyX3JlZyk7CisJcWxhMjR4eF9yZWFkX3dpbmRvdyhyZWcsIDB4QjBEMCwgMTYsIGl0ZXJfcmVnKTsKKworCXFsYTI0eHhfcmVhZF93aW5kb3cocmVnLCAweEIwRTAsIDE2LCBmdy0+YXNlcV8xX3JlZyk7CisJcWxhMjR4eF9yZWFkX3dpbmRvdyhyZWcsIDB4QjBGMCwgMTYsIGZ3LT5hc2VxXzJfcmVnKTsKKworCS8qIENvbW1hbmQgRE1BIHJlZ2lzdGVycy4gKi8KKwlxbGEyNHh4X3JlYWRfd2luZG93KHJlZywgMHg3MTAwLCAxNiwgZnctPmNtZF9kbWFfcmVnKTsKKworCS8qIFF1ZXVlcy4gKi8KKwlpdGVyX3JlZyA9IGZ3LT5yZXEwX2RtYV9yZWc7CisJaXRlcl9yZWcgPSBxbGEyNHh4X3JlYWRfd2luZG93KHJlZywgMHg3MjAwLCA4LCBpdGVyX3JlZyk7CisJZG1wX3JlZyA9ICZyZWctPmlvYmFzZV9xOworCWZvciAoY250ID0gMDsgY250IDwgNzsgY250KyspCisJCSppdGVyX3JlZysrID0gaHRvbmwoUkRfUkVHX0RXT1JEKGRtcF9yZWcrKykpOworCisJaXRlcl9yZWcgPSBmdy0+cmVzcDBfZG1hX3JlZzsKKwlpdGVyX3JlZyA9IHFsYTI0eHhfcmVhZF93aW5kb3cocmVnLCAweDczMDAsIDgsIGl0ZXJfcmVnKTsKKwlkbXBfcmVnID0gJnJlZy0+aW9iYXNlX3E7CisJZm9yIChjbnQgPSAwOyBjbnQgPCA3OyBjbnQrKykKKwkJKml0ZXJfcmVnKysgPSBodG9ubChSRF9SRUdfRFdPUkQoZG1wX3JlZysrKSk7CisKKwlpdGVyX3JlZyA9IGZ3LT5yZXExX2RtYV9yZWc7CisJaXRlcl9yZWcgPSBxbGEyNHh4X3JlYWRfd2luZG93KHJlZywgMHg3NDAwLCA4LCBpdGVyX3JlZyk7CisJZG1wX3JlZyA9ICZyZWctPmlvYmFzZV9xOworCWZvciAoY250ID0gMDsgY250IDwgNzsgY250KyspCisJCSppdGVyX3JlZysrID0gaHRvbmwoUkRfUkVHX0RXT1JEKGRtcF9yZWcrKykpOworCisJLyogVHJhbnNtaXQgRE1BIHJlZ2lzdGVycy4gKi8KKwlpdGVyX3JlZyA9IGZ3LT54bXQwX2RtYV9yZWc7CisJaXRlcl9yZWcgPSBxbGEyNHh4X3JlYWRfd2luZG93KHJlZywgMHg3NjAwLCAxNiwgaXRlcl9yZWcpOworCXFsYTI0eHhfcmVhZF93aW5kb3cocmVnLCAweDc2MTAsIDE2LCBpdGVyX3JlZyk7CisKKwlpdGVyX3JlZyA9IGZ3LT54bXQxX2RtYV9yZWc7CisJaXRlcl9yZWcgPSBxbGEyNHh4X3JlYWRfd2luZG93KHJlZywgMHg3NjIwLCAxNiwgaXRlcl9yZWcpOworCXFsYTI0eHhfcmVhZF93aW5kb3cocmVnLCAweDc2MzAsIDE2LCBpdGVyX3JlZyk7CisKKwlpdGVyX3JlZyA9IGZ3LT54bXQyX2RtYV9yZWc7CisJaXRlcl9yZWcgPSBxbGEyNHh4X3JlYWRfd2luZG93KHJlZywgMHg3NjQwLCAxNiwgaXRlcl9yZWcpOworCXFsYTI0eHhfcmVhZF93aW5kb3cocmVnLCAweDc2NTAsIDE2LCBpdGVyX3JlZyk7CisKKwlpdGVyX3JlZyA9IGZ3LT54bXQzX2RtYV9yZWc7CisJaXRlcl9yZWcgPSBxbGEyNHh4X3JlYWRfd2luZG93KHJlZywgMHg3NjYwLCAxNiwgaXRlcl9yZWcpOworCXFsYTI0eHhfcmVhZF93aW5kb3cocmVnLCAweDc2NzAsIDE2LCBpdGVyX3JlZyk7CisKKwlpdGVyX3JlZyA9IGZ3LT54bXQ0X2RtYV9yZWc7CisJaXRlcl9yZWcgPSBxbGEyNHh4X3JlYWRfd2luZG93KHJlZywgMHg3NjgwLCAxNiwgaXRlcl9yZWcpOworCXFsYTI0eHhfcmVhZF93aW5kb3cocmVnLCAweDc2OTAsIDE2LCBpdGVyX3JlZyk7CisKKwlxbGEyNHh4X3JlYWRfd2luZG93KHJlZywgMHg3NkEwLCAxNiwgZnctPnhtdF9kYXRhX2RtYV9yZWcpOworCisJLyogUmVjZWl2ZSBETUEgcmVnaXN0ZXJzLiAqLworCWl0ZXJfcmVnID0gZnctPnJjdnQwX2RhdGFfZG1hX3JlZzsKKwlpdGVyX3JlZyA9IHFsYTI0eHhfcmVhZF93aW5kb3cocmVnLCAweDc3MDAsIDE2LCBpdGVyX3JlZyk7CisJcWxhMjR4eF9yZWFkX3dpbmRvdyhyZWcsIDB4NzcxMCwgMTYsIGl0ZXJfcmVnKTsKKworCWl0ZXJfcmVnID0gZnctPnJjdnQxX2RhdGFfZG1hX3JlZzsKKwlpdGVyX3JlZyA9IHFsYTI0eHhfcmVhZF93aW5kb3cocmVnLCAweDc3MjAsIDE2LCBpdGVyX3JlZyk7CisJcWxhMjR4eF9yZWFkX3dpbmRvdyhyZWcsIDB4NzczMCwgMTYsIGl0ZXJfcmVnKTsKKworCS8qIFJJU0MgcmVnaXN0ZXJzLiAqLworCWl0ZXJfcmVnID0gZnctPnJpc2NfZ3BfcmVnOworCWl0ZXJfcmVnID0gcWxhMjR4eF9yZWFkX3dpbmRvdyhyZWcsIDB4MEYwMCwgMTYsIGl0ZXJfcmVnKTsKKwlpdGVyX3JlZyA9IHFsYTI0eHhfcmVhZF93aW5kb3cocmVnLCAweDBGMTAsIDE2LCBpdGVyX3JlZyk7CisJaXRlcl9yZWcgPSBxbGEyNHh4X3JlYWRfd2luZG93KHJlZywgMHgwRjIwLCAxNiwgaXRlcl9yZWcpOworCWl0ZXJfcmVnID0gcWxhMjR4eF9yZWFkX3dpbmRvdyhyZWcsIDB4MEYzMCwgMTYsIGl0ZXJfcmVnKTsKKwlpdGVyX3JlZyA9IHFsYTI0eHhfcmVhZF93aW5kb3cocmVnLCAweDBGNDAsIDE2LCBpdGVyX3JlZyk7CisJaXRlcl9yZWcgPSBxbGEyNHh4X3JlYWRfd2luZG93KHJlZywgMHgwRjUwLCAxNiwgaXRlcl9yZWcpOworCWl0ZXJfcmVnID0gcWxhMjR4eF9yZWFkX3dpbmRvdyhyZWcsIDB4MEY2MCwgMTYsIGl0ZXJfcmVnKTsKKwlxbGEyNHh4X3JlYWRfd2luZG93KHJlZywgMHgwRjcwLCAxNiwgaXRlcl9yZWcpOworCisJLyogTG9jYWwgbWVtb3J5IGNvbnRyb2xsZXIgcmVnaXN0ZXJzLiAqLworCWl0ZXJfcmVnID0gZnctPmxtY19yZWc7CisJaXRlcl9yZWcgPSBxbGEyNHh4X3JlYWRfd2luZG93KHJlZywgMHgzMDAwLCAxNiwgaXRlcl9yZWcpOworCWl0ZXJfcmVnID0gcWxhMjR4eF9yZWFkX3dpbmRvdyhyZWcsIDB4MzAxMCwgMTYsIGl0ZXJfcmVnKTsKKwlpdGVyX3JlZyA9IHFsYTI0eHhfcmVhZF93aW5kb3cocmVnLCAweDMwMjAsIDE2LCBpdGVyX3JlZyk7CisJaXRlcl9yZWcgPSBxbGEyNHh4X3JlYWRfd2luZG93KHJlZywgMHgzMDMwLCAxNiwgaXRlcl9yZWcpOworCWl0ZXJfcmVnID0gcWxhMjR4eF9yZWFkX3dpbmRvdyhyZWcsIDB4MzA0MCwgMTYsIGl0ZXJfcmVnKTsKKwlpdGVyX3JlZyA9IHFsYTI0eHhfcmVhZF93aW5kb3cocmVnLCAweDMwNTAsIDE2LCBpdGVyX3JlZyk7CisJaXRlcl9yZWcgPSBxbGEyNHh4X3JlYWRfd2luZG93KHJlZywgMHgzMDYwLCAxNiwgaXRlcl9yZWcpOworCXFsYTI0eHhfcmVhZF93aW5kb3cocmVnLCAweDMwNzAsIDE2LCBpdGVyX3JlZyk7CisKKwkvKiBGaWJyZSBQcm90b2NvbCBNb2R1bGUgcmVnaXN0ZXJzLiAqLworCWl0ZXJfcmVnID0gZnctPmZwbV9oZHdfcmVnOworCWl0ZXJfcmVnID0gcWxhMjR4eF9yZWFkX3dpbmRvdyhyZWcsIDB4NDAwMCwgMTYsIGl0ZXJfcmVnKTsKKwlpdGVyX3JlZyA9IHFsYTI0eHhfcmVhZF93aW5kb3cocmVnLCAweDQwMTAsIDE2LCBpdGVyX3JlZyk7CisJaXRlcl9yZWcgPSBxbGEyNHh4X3JlYWRfd2luZG93KHJlZywgMHg0MDIwLCAxNiwgaXRlcl9yZWcpOworCWl0ZXJfcmVnID0gcWxhMjR4eF9yZWFkX3dpbmRvdyhyZWcsIDB4NDAzMCwgMTYsIGl0ZXJfcmVnKTsKKwlpdGVyX3JlZyA9IHFsYTI0eHhfcmVhZF93aW5kb3cocmVnLCAweDQwNDAsIDE2LCBpdGVyX3JlZyk7CisJaXRlcl9yZWcgPSBxbGEyNHh4X3JlYWRfd2luZG93KHJlZywgMHg0MDUwLCAxNiwgaXRlcl9yZWcpOworCWl0ZXJfcmVnID0gcWxhMjR4eF9yZWFkX3dpbmRvdyhyZWcsIDB4NDA2MCwgMTYsIGl0ZXJfcmVnKTsKKwlpdGVyX3JlZyA9IHFsYTI0eHhfcmVhZF93aW5kb3cocmVnLCAweDQwNzAsIDE2LCBpdGVyX3JlZyk7CisJaXRlcl9yZWcgPSBxbGEyNHh4X3JlYWRfd2luZG93KHJlZywgMHg0MDgwLCAxNiwgaXRlcl9yZWcpOworCWl0ZXJfcmVnID0gcWxhMjR4eF9yZWFkX3dpbmRvdyhyZWcsIDB4NDA5MCwgMTYsIGl0ZXJfcmVnKTsKKwlpdGVyX3JlZyA9IHFsYTI0eHhfcmVhZF93aW5kb3cocmVnLCAweDQwQTAsIDE2LCBpdGVyX3JlZyk7CisJaXRlcl9yZWcgPSBxbGEyNHh4X3JlYWRfd2luZG93KHJlZywgMHg0MEIwLCAxNiwgaXRlcl9yZWcpOworCWl0ZXJfcmVnID0gcWxhMjR4eF9yZWFkX3dpbmRvdyhyZWcsIDB4NDBDMCwgMTYsIGl0ZXJfcmVnKTsKKwlxbGEyNHh4X3JlYWRfd2luZG93KHJlZywgMHg0MEQwLCAxNiwgaXRlcl9yZWcpOworCisJLyogRnJhbWUgQnVmZmVyIHJlZ2lzdGVycy4gKi8KKwlpdGVyX3JlZyA9IGZ3LT5mYl9oZHdfcmVnOworCWl0ZXJfcmVnID0gcWxhMjR4eF9yZWFkX3dpbmRvdyhyZWcsIDB4NjAwMCwgMTYsIGl0ZXJfcmVnKTsKKwlpdGVyX3JlZyA9IHFsYTI0eHhfcmVhZF93aW5kb3cocmVnLCAweDYwMTAsIDE2LCBpdGVyX3JlZyk7CisJaXRlcl9yZWcgPSBxbGEyNHh4X3JlYWRfd2luZG93KHJlZywgMHg2MDIwLCAxNiwgaXRlcl9yZWcpOworCWl0ZXJfcmVnID0gcWxhMjR4eF9yZWFkX3dpbmRvdyhyZWcsIDB4NjAzMCwgMTYsIGl0ZXJfcmVnKTsKKwlpdGVyX3JlZyA9IHFsYTI0eHhfcmVhZF93aW5kb3cocmVnLCAweDYwNDAsIDE2LCBpdGVyX3JlZyk7CisJaXRlcl9yZWcgPSBxbGEyNHh4X3JlYWRfd2luZG93KHJlZywgMHg2MTAwLCAxNiwgaXRlcl9yZWcpOworCWl0ZXJfcmVnID0gcWxhMjR4eF9yZWFkX3dpbmRvdyhyZWcsIDB4NjEzMCwgMTYsIGl0ZXJfcmVnKTsKKwlpdGVyX3JlZyA9IHFsYTI0eHhfcmVhZF93aW5kb3cocmVnLCAweDYxNTAsIDE2LCBpdGVyX3JlZyk7CisJaXRlcl9yZWcgPSBxbGEyNHh4X3JlYWRfd2luZG93KHJlZywgMHg2MTcwLCAxNiwgaXRlcl9yZWcpOworCWl0ZXJfcmVnID0gcWxhMjR4eF9yZWFkX3dpbmRvdyhyZWcsIDB4NjE5MCwgMTYsIGl0ZXJfcmVnKTsKKwlpdGVyX3JlZyA9IHFsYTI0eHhfcmVhZF93aW5kb3cocmVnLCAweDYxQjAsIDE2LCBpdGVyX3JlZyk7CisJaXRlcl9yZWcgPSBxbGEyNHh4X3JlYWRfd2luZG93KHJlZywgMHg2MUMwLCAxNiwgaXRlcl9yZWcpOworCXFsYTI0eHhfcmVhZF93aW5kb3cocmVnLCAweDZGMDAsIDE2LCBpdGVyX3JlZyk7CisKKwkvKiBNdWx0aSBxdWV1ZSByZWdpc3RlcnMgKi8KKwlueHRfY2hhaW4gPSBxbGEyNXh4X2NvcHlfbXEoaGEsICh2b2lkICopaGEtPmZ3X2R1bXAgKyBoYS0+Y2hhaW5fb2Zmc2V0LAorCSAgICAmbGFzdF9jaGFpbik7CisKKwlydmFsID0gcWxhMjR4eF9zb2Z0X3Jlc2V0KGhhKTsKKwlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykKKwkJZ290byBxbGE4MXh4X2Z3X2R1bXBfZmFpbGVkXzA7CisKKwlydmFsID0gcWxhMjR4eF9kdW1wX21lbW9yeShoYSwgZnctPmNvZGVfcmFtLCBzaXplb2YoZnctPmNvZGVfcmFtKSwKKwkgICAgJm54dCk7CisJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpCisJCWdvdG8gcWxhODF4eF9md19kdW1wX2ZhaWxlZF8wOworCisJbnh0ID0gcWxhMnh4eF9jb3B5X3F1ZXVlcyhoYSwgbnh0KTsKKworCW54dCA9IHFsYTI0eHhfY29weV9lZnQoaGEsIG54dCk7CisKKwkvKiBDaGFpbiBlbnRyaWVzIC0tIHN0YXJ0ZWQgd2l0aCBNUS4gKi8KKwlxbGEyNXh4X2NvcHlfZmNlKGhhLCBueHRfY2hhaW4sICZsYXN0X2NoYWluKTsKKwlpZiAobGFzdF9jaGFpbikgeworCQloYS0+ZndfZHVtcC0+dmVyc2lvbiB8PSBfX2NvbnN0YW50X2h0b25sKERVTVBfQ0hBSU5fVkFSSUFOVCk7CisJCSpsYXN0X2NoYWluIHw9IF9fY29uc3RhbnRfaHRvbmwoRFVNUF9DSEFJTl9MQVNUKTsKKwl9CisKK3FsYTgxeHhfZndfZHVtcF9mYWlsZWRfMDoKKwlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgeworCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCisJCSAgICAiRmFpbGVkIHRvIGR1bXAgZmlybXdhcmUgKCV4KSEhIVxuIiwgcnZhbCk7CisJCWhhLT5md19kdW1wZWQgPSAwOworCisJfSBlbHNlIHsKKwkJcWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLAorCQkgICAgIkZpcm13YXJlIGR1bXAgc2F2ZWQgdG8gdGVtcCBidWZmZXIgKCVsZC8lcCkuXG4iLAorCQkgICAgYmFzZV92aGEtPmhvc3Rfbm8sIGhhLT5md19kdW1wKTsKKwkJaGEtPmZ3X2R1bXBlZCA9IDE7CisJfQorCitxbGE4MXh4X2Z3X2R1bXBfZmFpbGVkOgorCWlmICghaGFyZHdhcmVfbG9ja2VkKQorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOworfQorCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgIERyaXZlciBEZWJ1ZyBGdW5jdGlvbnMuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZGJnLmggYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZGJnLmgKaW5kZXggYzE3OTRhNy4uZjY2MGRkNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2RiZy5oCisrKyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9kYmcuaApAQCAtMjUxLDYgKzI1MSw0NSBAQAogCXVpbnQzMl90IGV4dF9tZW1bMV07CiB9OwogCitzdHJ1Y3QgcWxhODF4eF9md19kdW1wIHsKKwl1aW50MzJfdCBob3N0X3N0YXR1czsKKwl1aW50MzJfdCBob3N0X3Jpc2NfcmVnWzMyXTsKKwl1aW50MzJfdCBwY2llX3JlZ3NbNF07CisJdWludDMyX3QgaG9zdF9yZWdbMzJdOworCXVpbnQzMl90IHNoYWRvd19yZWdbMTFdOworCXVpbnQzMl90IHJpc2NfaW9fcmVnOworCXVpbnQxNl90IG1haWxib3hfcmVnWzMyXTsKKwl1aW50MzJfdCB4c2VxX2dwX3JlZ1sxMjhdOworCXVpbnQzMl90IHhzZXFfMF9yZWdbNDhdOworCXVpbnQzMl90IHhzZXFfMV9yZWdbMTZdOworCXVpbnQzMl90IHJzZXFfZ3BfcmVnWzEyOF07CisJdWludDMyX3QgcnNlcV8wX3JlZ1szMl07CisJdWludDMyX3QgcnNlcV8xX3JlZ1sxNl07CisJdWludDMyX3QgcnNlcV8yX3JlZ1sxNl07CisJdWludDMyX3QgYXNlcV9ncF9yZWdbMTI4XTsKKwl1aW50MzJfdCBhc2VxXzBfcmVnWzMyXTsKKwl1aW50MzJfdCBhc2VxXzFfcmVnWzE2XTsKKwl1aW50MzJfdCBhc2VxXzJfcmVnWzE2XTsKKwl1aW50MzJfdCBjbWRfZG1hX3JlZ1sxNl07CisJdWludDMyX3QgcmVxMF9kbWFfcmVnWzE1XTsKKwl1aW50MzJfdCByZXNwMF9kbWFfcmVnWzE1XTsKKwl1aW50MzJfdCByZXExX2RtYV9yZWdbMTVdOworCXVpbnQzMl90IHhtdDBfZG1hX3JlZ1szMl07CisJdWludDMyX3QgeG10MV9kbWFfcmVnWzMyXTsKKwl1aW50MzJfdCB4bXQyX2RtYV9yZWdbMzJdOworCXVpbnQzMl90IHhtdDNfZG1hX3JlZ1szMl07CisJdWludDMyX3QgeG10NF9kbWFfcmVnWzMyXTsKKwl1aW50MzJfdCB4bXRfZGF0YV9kbWFfcmVnWzE2XTsKKwl1aW50MzJfdCByY3Z0MF9kYXRhX2RtYV9yZWdbMzJdOworCXVpbnQzMl90IHJjdnQxX2RhdGFfZG1hX3JlZ1szMl07CisJdWludDMyX3QgcmlzY19ncF9yZWdbMTI4XTsKKwl1aW50MzJfdCBsbWNfcmVnWzEyOF07CisJdWludDMyX3QgZnBtX2hkd19yZWdbMjI0XTsKKwl1aW50MzJfdCBmYl9oZHdfcmVnWzIwOF07CisJdWludDMyX3QgY29kZV9yYW1bMHgyMDAwXTsKKwl1aW50MzJfdCBleHRfbWVtWzFdOworfTsKKwogI2RlZmluZSBFRlRfTlVNX0JVRkZFUlMJCTQKICNkZWZpbmUgRUZUX0JZVEVTX1BFUl9CVUZGRVIJMHg0MDAwCiAjZGVmaW5lIEVGVF9TSVpFCQkoKEVGVF9CWVRFU19QRVJfQlVGRkVSKSAqIChFRlRfTlVNX0JVRkZFUlMpKQpAQCAtMzEzLDUgKzM1Miw2IEBACiAJCXN0cnVjdCBxbGEyMzAwX2Z3X2R1bXAgaXNwMjM7CiAJCXN0cnVjdCBxbGEyNHh4X2Z3X2R1bXAgaXNwMjQ7CiAJCXN0cnVjdCBxbGEyNXh4X2Z3X2R1bXAgaXNwMjU7CisJCXN0cnVjdCBxbGE4MXh4X2Z3X2R1bXAgaXNwODE7CiAJfSBpc3A7CiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2RlZi5oIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2RlZi5oCmluZGV4IGEyOWM5NTIuLjAyM2VlNzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9kZWYuaAorKysgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZGVmLmgKQEAgLTE4Nyw3ICsxODcsNiBAQAogICogU0NTSSBSZXF1ZXN0IEJsb2NrCiAgKi8KIHR5cGVkZWYgc3RydWN0IHNyYiB7Ci0Jc3RydWN0IHNjc2lfcWxhX2hvc3QgKnZoYTsJLyogSEEgdGhlIFNQIGlzIHF1ZXVlZCBvbiAqLwogCXN0cnVjdCByZXFfcXVlICpxdWU7CiAJc3RydWN0IGZjX3BvcnQgKmZjcG9ydDsKIApAQCAtMjEzNiw3ICsyMTM1LDYgQEAKIC8qIFdvcmsgZXZlbnRzLiAgKi8KIGVudW0gcWxhX3dvcmtfdHlwZSB7CiAJUUxBX0VWVF9BRU4sCi0JUUxBX0VWVF9IV0VfTE9HLAogfTsKIAogCkBAIC0yMTUxLDEwICsyMTQ5LDYgQEAKIAkJCWVudW0gZmNfaG9zdF9ldmVudF9jb2RlIGNvZGU7CiAJCQl1MzIgZGF0YTsKIAkJfSBhZW47Ci0JCXN0cnVjdCB7Ci0JCQl1aW50MTZfdCBjb2RlOwotCQkJdWludDE2X3QgZDEsIGQyLCBkMzsKLQkJfSBod2U7CiAJfSB1OwogfTsKIApAQCAtMjMwOSw2ICsyMzAzLDcgQEAKICNkZWZpbmUgUE9SVF9TUEVFRF8yR0IgIDB4MDEKICNkZWZpbmUgUE9SVF9TUEVFRF80R0IgIDB4MDMKICNkZWZpbmUgUE9SVF9TUEVFRF84R0IgIDB4MDQKKyNkZWZpbmUgUE9SVF9TUEVFRF8xMEdCCTB4MTMKIAl1aW50MTZfdAlsaW5rX2RhdGFfcmF0ZTsgICAgICAgICAvKiBGL1cgb3BlcmF0aW5nIHNwZWVkICovCiAKIAl1aW50OF90CQljdXJyZW50X3RvcG9sb2d5OwpAQCAtMjMyOCw2ICsyMzIzLDcgQEAKIAogI2RlZmluZSBQQ0lfREVWSUNFX0lEX1FMT0dJQ19JU1AyNTMyICAgIDB4MjUzMgogI2RlZmluZSBQQ0lfREVWSUNFX0lEX1FMT0dJQ19JU1A4NDMyICAgIDB4ODQzMgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1FMT0dJQ19JU1A4MDAxCTB4ODAwMQogCXVpbnQzMl90CWRldmljZV90eXBlOwogI2RlZmluZSBEVF9JU1AyMTAwICAgICAgICAgICAgICAgICAgICAgIEJJVF8wCiAjZGVmaW5lIERUX0lTUDIyMDAgICAgICAgICAgICAgICAgICAgICAgQklUXzEKQEAgLTIzNDIsNyArMjMzOCw4IEBACiAjZGVmaW5lIERUX0lTUDU0MzIgICAgICAgICAgICAgICAgICAgICAgQklUXzEwCiAjZGVmaW5lIERUX0lTUDI1MzIgICAgICAgICAgICAgICAgICAgICAgQklUXzExCiAjZGVmaW5lIERUX0lTUDg0MzIgICAgICAgICAgICAgICAgICAgICAgQklUXzEyCi0jZGVmaW5lIERUX0lTUF9MQVNUICAgICAgICAgICAgICAgICAgICAgKERUX0lTUDg0MzIgPDwgMSkKKyNkZWZpbmUgRFRfSVNQODAwMQkJCUJJVF8xMworI2RlZmluZSBEVF9JU1BfTEFTVAkJCShEVF9JU1A4MDAxIDw8IDEpCiAKICNkZWZpbmUgRFRfSUlETUEgICAgICAgICAgICAgICAgICAgICAgICBCSVRfMjYKICNkZWZpbmUgRFRfRldJMiAgICAgICAgICAgICAgICAgICAgICAgICBCSVRfMjcKQEAgLTIzNjQsNiArMjM2MSw3IEBACiAjZGVmaW5lIElTX1FMQTU0MzIoaGEpICAoRFRfTUFTSyhoYSkgJiBEVF9JU1A1NDMyKQogI2RlZmluZSBJU19RTEEyNTMyKGhhKSAgKERUX01BU0soaGEpICYgRFRfSVNQMjUzMikKICNkZWZpbmUgSVNfUUxBODQzMihoYSkgIChEVF9NQVNLKGhhKSAmIERUX0lTUDg0MzIpCisjZGVmaW5lIElTX1FMQTgwMDEoaGEpCShEVF9NQVNLKGhhKSAmIERUX0lTUDgwMDEpCiAKICNkZWZpbmUgSVNfUUxBMjNYWChoYSkgIChJU19RTEEyMzAwKGhhKSB8fCBJU19RTEEyMzEyKGhhKSB8fCBJU19RTEEyMzIyKGhhKSB8fCBcCiAJCQlJU19RTEE2MzEyKGhhKSB8fCBJU19RTEE2MzIyKGhhKSkKQEAgLTIzNzMsOCArMjM3MSwxMSBAQAogI2RlZmluZSBJU19RTEE4NFhYKGhhKSAgKElTX1FMQTg0MzIoaGEpKQogI2RlZmluZSBJU19RTEEyNFhYX1RZUEUoaGEpICAgICAoSVNfUUxBMjRYWChoYSkgfHwgSVNfUUxBNTRYWChoYSkgfHwgXAogCQkJCUlTX1FMQTg0WFgoaGEpKQorI2RlZmluZSBJU19RTEE4MVhYKGhhKQkJKElTX1FMQTgwMDEoaGEpKQogI2RlZmluZSBJU19RTEEyWFhYX01JRFRZUEUoaGEpCShJU19RTEEyNFhYKGhhKSB8fCBJU19RTEE4NFhYKGhhKSB8fCBcCi0JCQkJSVNfUUxBMjVYWChoYSkpCisJCQkJSVNfUUxBMjVYWChoYSkgfHwgSVNfUUxBODFYWChoYSkpCisjZGVmaW5lIElTX05PUE9MTElOR19UWVBFKGhhKQkoKElTX1FMQTI1WFgoaGEpIHx8IElTX1FMQTgxWFgoaGEpKSAmJiBcCisJCQkJKGhhKS0+ZmxhZ3MubXNpeF9lbmFibGVkKQogCiAjZGVmaW5lIElTX0lJRE1BX0NBUEFCTEUoaGEpICAgICgoaGEpLT5kZXZpY2VfdHlwZSAmIERUX0lJRE1BKQogI2RlZmluZSBJU19GV0kyX0NBUEFCTEUoaGEpICAgICAoKGhhKS0+ZGV2aWNlX3R5cGUgJiBEVF9GV0kyKQpAQCAtMjQ3Miw2ICsyNDczLDkgQEAKIAl1aW50OF90CQlmd19zZXJpYWxsaW5rX29wdGlvbnNbNF07CiAJdWludDE2X3QJZndfc2VyaWFsbGlua19vcHRpb25zMjRbNF07CiAKKwl1aW50OF90CQltcGlfdmVyc2lvbls0XTsKKwl1aW50MzJfdAltcGlfY2FwYWJpbGl0aWVzOworCiAJLyogRmlybXdhcmUgZHVtcCBpbmZvcm1hdGlvbi4gKi8KIAlzdHJ1Y3QgcWxhMnh4eF9md19kdW1wICpmd19kdW1wOwogCXVpbnQzMl90CWZ3X2R1bXBfbGVuOwpAQCAtMjQ4MCw2ICsyNDg0LDcgQEAKIAlkbWFfYWRkcl90CWVmdF9kbWE7CiAJdm9pZAkJKmVmdDsKIAorCXVpbnQzMl90CWNoYWluX29mZnNldDsKIAlzdHJ1Y3QgZGVudHJ5ICpkZnNfZGlyOwogCXN0cnVjdCBkZW50cnkgKmRmc19mY2U7CiAJZG1hX2FkZHJfdAlmY2VfZG1hOwpAQCAtMjQ4OSwxMCArMjQ5NCw2IEBACiAJdWludDY0X3QJZmNlX3dyLCBmY2VfcmQ7CiAJc3RydWN0IG11dGV4CWZjZV9tdXRleDsKIAotCXVpbnQzMl90CWh3X2V2ZW50X3N0YXJ0OwotCXVpbnQzMl90CWh3X2V2ZW50X3B0cjsKLQl1aW50MzJfdAlod19ldmVudF9wYXVzZV9lcnJvcnM7Ci0KIAl1aW50MzJfdAlwY2lfYXR0cjsKIAl1aW50MTZfdAljaGlwX3JldmlzaW9uOwogCkBAIC0yNTIyLDYgKzI1MjMsMTIgQEAKIAl1aW50OF90IAlmY29kZV9yZXZpc2lvblsxNl07CiAJdWludDMyX3QJZndfcmV2aXNpb25bNF07CiAKKwkvKiBPZmZzZXRzIGZvciBmbGFzaC9udnJhbSBhY2Nlc3MgKHNldCB0byB+MCBpZiBub3QgdXNlZCkuICovCisJdWludDMyX3QJZmxhc2hfY29uZl9vZmY7CisJdWludDMyX3QJZmxhc2hfZGF0YV9vZmY7CisJdWludDMyX3QJbnZyYW1fY29uZl9vZmY7CisJdWludDMyX3QJbnZyYW1fZGF0YV9vZmY7CisKIAl1aW50MzJfdAlmZHRfd3J0X2Rpc2FibGU7CiAJdWludDMyX3QJZmR0X2VyYXNlX2NtZDsKIAl1aW50MzJfdAlmZHRfYmxvY2tfc2l6ZTsKQEAgLTI1MzMsNyArMjU0MCw2IEBACiAJdWludDMyX3QgICAgICAgIGZsdF9yZWdpb25fYm9vdDsKIAl1aW50MzJfdCAgICAgICAgZmx0X3JlZ2lvbl9mdzsKIAl1aW50MzJfdCAgICAgICAgZmx0X3JlZ2lvbl92cGRfbnZyYW07Ci0JdWludDMyX3QgICAgICAgIGZsdF9yZWdpb25faHdfZXZlbnQ7CiAJdWludDMyX3QgICAgICAgIGZsdF9yZWdpb25fbnBpdl9jb25mOwogCiAJLyogTmVlZGVkIGZvciBCRUFDT04gKi8KQEAgLTI3MzcsNiArMjc0Myw3IEBACiAjZGVmaW5lIE9QVFJPTV9TSVpFXzIzMjIJMHgxMDAwMDAKICNkZWZpbmUgT1BUUk9NX1NJWkVfMjRYWAkweDEwMDAwMAogI2RlZmluZSBPUFRST01fU0laRV8yNVhYCTB4MjAwMDAwCisjZGVmaW5lIE9QVFJPTV9TSVpFXzgxWFgJMHg0MDAwMDAKIAogI2luY2x1ZGUgInFsYV9nYmwuaCIKICNpbmNsdWRlICJxbGFfZGJnLmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZGZzLmMgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZGZzLmMKaW5kZXggMGUzNjZhMS4uYzY2MDM2ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2Rmcy5jCisrKyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9kZnMuYwpAQCAtMTEzLDcgKzExMyw4IEBACiBxbGEyeDAwX2Rmc19zZXR1cChzY3NpX3FsYV9ob3N0X3QgKnZoYSkKIHsKIAlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKLQlpZiAoIUlTX1FMQTI1WFgoaGEpKQorCisJaWYgKCFJU19RTEEyNVhYKGhhKSAmJiAhSVNfUUxBODFYWChoYSkpCiAJCWdvdG8gb3V0OwogCWlmICghaGEtPmZjZSkKIAkJZ290byBvdXQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZncuaCBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9mdy5oCmluZGV4IGVlMWYxZTcuLjdhYmIwNDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9mdy5oCisrKyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9mdy5oCkBAIC0xMjE1LDkgKzEyMTUsMTAgQEAKIAogc3RydWN0IHFsYV9mbHRfbG9jYXRpb24gewogCXVpbnQ4X3Qgc2lnWzRdOwotCXVpbnQzMl90IHN0YXJ0X2xvOwotCXVpbnQzMl90IHN0YXJ0X2hpOwotCXVpbnQxNl90IHVudXNlZDsKKwl1aW50MTZfdCBzdGFydF9sbzsKKwl1aW50MTZfdCBzdGFydF9oaTsKKwl1aW50OF90IHZlcnNpb247CisJdWludDhfdCB1bnVzZWRbNV07CiAJdWludDE2X3QgY2hlY2tzdW07CiB9OwogCkBAIC0xMzkwLDQgKzEzOTEsMjkxIEBACiAKIAl1aW50MzJfdCByZXNlcnZlZFsxMl07CiB9OworCisvKiA4MVhYIFN1cHBvcnQgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgTUJBX0RDQlhfU1RBUlQJCTB4ODAxNgorI2RlZmluZSBNQkFfRENCWF9DT01QTEVURQkweDgwMzAKKyNkZWZpbmUgTUJBX0ZDRl9DT05GX0VSUgkweDgwMzEKKyNkZWZpbmUgTUJBX0RDQlhfUEFSQU1fVVBEQVRFCTB4ODAzMgorI2RlZmluZSBNQkFfSURDX0NPTVBMRVRFCTB4ODEwMAorI2RlZmluZSBNQkFfSURDX05PVElGWQkJMHg4MTAxCisjZGVmaW5lIE1CQV9JRENfVElNRV9FWFQJMHg4MTAyCisKK3N0cnVjdCBudnJhbV84MXh4IHsKKwkvKiBOVlJBTSBoZWFkZXIuICovCisJdWludDhfdCBpZFs0XTsKKwl1aW50MTZfdCBudnJhbV92ZXJzaW9uOworCXVpbnQxNl90IHJlc2VydmVkXzA7CisKKwkvKiBGaXJtd2FyZSBJbml0aWFsaXphdGlvbiBDb250cm9sIEJsb2NrLiAqLworCXVpbnQxNl90IHZlcnNpb247CisJdWludDE2X3QgcmVzZXJ2ZWRfMTsKKwl1aW50MTZfdCBmcmFtZV9wYXlsb2FkX3NpemU7CisJdWludDE2X3QgZXhlY3V0aW9uX3Rocm90dGxlOworCXVpbnQxNl90IGV4Y2hhbmdlX2NvdW50OworCXVpbnQxNl90IHJlc2VydmVkXzI7CisKKwl1aW50OF90IHBvcnRfbmFtZVtXV05fU0laRV07CisJdWludDhfdCBub2RlX25hbWVbV1dOX1NJWkVdOworCisJdWludDE2X3QgbG9naW5fcmV0cnlfY291bnQ7CisJdWludDE2X3QgcmVzZXJ2ZWRfMzsKKwl1aW50MTZfdCBpbnRlcnJ1cHRfZGVsYXlfdGltZXI7CisJdWludDE2X3QgbG9naW5fdGltZW91dDsKKworCXVpbnQzMl90IGZpcm13YXJlX29wdGlvbnNfMTsKKwl1aW50MzJfdCBmaXJtd2FyZV9vcHRpb25zXzI7CisJdWludDMyX3QgZmlybXdhcmVfb3B0aW9uc18zOworCisJdWludDE2X3QgcmVzZXJ2ZWRfNFs0XTsKKworCS8qIE9mZnNldCA2NC4gKi8KKwl1aW50OF90IGVub2RlX21hY1s2XTsKKwl1aW50MTZfdCByZXNlcnZlZF81WzVdOworCisJLyogT2Zmc2V0IDgwLiAqLworCXVpbnQxNl90IHJlc2VydmVkXzZbMjRdOworCisJLyogT2Zmc2V0IDEyOC4gKi8KKwl1aW50MTZfdCByZXNlcnZlZF83WzY0XTsKKworCS8qCisJICogQklUIDAgID0gRW5hYmxlIHNwaW51cCBkZWxheQorCSAqIEJJVCAxICA9IERpc2FibGUgQklPUworCSAqIEJJVCAyICA9IEVuYWJsZSBNZW1vcnkgTWFwIEJJT1MKKwkgKiBCSVQgMyAgPSBFbmFibGUgU2VsZWN0YWJsZSBCb290CisJICogQklUIDQgID0gRGlzYWJsZSBSSVNDIGNvZGUgbG9hZAorCSAqIEJJVCA1ICA9IERpc2FibGUgU2VyZGVzCisJICogQklUIDYgID0gT3B0IGJvb3QgbW9kZQorCSAqIEJJVCA3ICA9IEludGVycnVwdCBlbmFibGUKKwkgKgorCSAqIEJJVCA4ICA9IEVWIENvbnRyb2wgZW5hYmxlCisJICogQklUIDkgID0gRW5hYmxlIGxpcCByZXNldAorCSAqIEJJVCAxMCA9IEVuYWJsZSBsaXAgZnVsbCBsb2dpbgorCSAqIEJJVCAxMSA9IEVuYWJsZSB0YXJnZXQgcmVzZXQKKwkgKiBCSVQgMTIgPSBTdG9wIGZpcm13YXJlCisJICogQklUIDEzID0gRW5hYmxlIG5vZGVuYW1lIG9wdGlvbgorCSAqIEJJVCAxNCA9IERlZmF1bHQgV1dQTiB2YWxpZAorCSAqIEJJVCAxNSA9IEVuYWJsZSBhbHRlcm5hdGUgV1dOCisJICoKKwkgKiBCSVQgMTYgPSBDTFAgTFVOIHN0cmluZworCSAqIEJJVCAxNyA9IENMUCBUYXJnZXQgc3RyaW5nCisJICogQklUIDE4ID0gQ0xQIEJJT1MgZW5hYmxlIHN0cmluZworCSAqIEJJVCAxOSA9IENMUCBTZXJkZXMgc3RyaW5nCisJICogQklUIDIwID0gQ0xQIFdXUE4gc3RyaW5nCisJICogQklUIDIxID0gQ0xQIFdXTk4gc3RyaW5nCisJICogQklUIDIyID0KKwkgKiBCSVQgMjMgPQorCSAqIEJJVCAyNCA9IEtlZXAgV1dQTgorCSAqIEJJVCAyNSA9IFRlbXAgV1dQTgorCSAqIEJJVCAyNi0zMSA9CisJICovCisJdWludDMyX3QgaG9zdF9wOworCisJdWludDhfdCBhbHRlcm5hdGVfcG9ydF9uYW1lW1dXTl9TSVpFXTsKKwl1aW50OF90IGFsdGVybmF0ZV9ub2RlX25hbWVbV1dOX1NJWkVdOworCisJdWludDhfdCBib290X3BvcnRfbmFtZVtXV05fU0laRV07CisJdWludDE2X3QgYm9vdF9sdW5fbnVtYmVyOworCXVpbnQxNl90IHJlc2VydmVkXzg7CisKKwl1aW50OF90IGFsdDFfYm9vdF9wb3J0X25hbWVbV1dOX1NJWkVdOworCXVpbnQxNl90IGFsdDFfYm9vdF9sdW5fbnVtYmVyOworCXVpbnQxNl90IHJlc2VydmVkXzk7CisKKwl1aW50OF90IGFsdDJfYm9vdF9wb3J0X25hbWVbV1dOX1NJWkVdOworCXVpbnQxNl90IGFsdDJfYm9vdF9sdW5fbnVtYmVyOworCXVpbnQxNl90IHJlc2VydmVkXzEwOworCisJdWludDhfdCBhbHQzX2Jvb3RfcG9ydF9uYW1lW1dXTl9TSVpFXTsKKwl1aW50MTZfdCBhbHQzX2Jvb3RfbHVuX251bWJlcjsKKwl1aW50MTZfdCByZXNlcnZlZF8xMTsKKworCS8qCisJICogQklUIDAgPSBTZWxlY3RpdmUgTG9naW4KKwkgKiBCSVQgMSA9IEFsdC1Cb290IEVuYWJsZQorCSAqIEJJVCAyID0gUmVzZXJ2ZWQKKwkgKiBCSVQgMyA9IEJvb3QgT3JkZXIgTGlzdAorCSAqIEJJVCA0ID0gUmVzZXJ2ZWQKKwkgKiBCSVQgNSA9IFNlbGVjdGl2ZSBMVU4KKwkgKiBCSVQgNiA9IFJlc2VydmVkCisJICogQklUIDctMzEgPQorCSAqLworCXVpbnQzMl90IGVmaV9wYXJhbWV0ZXJzOworCisJdWludDhfdCByZXNldF9kZWxheTsKKwl1aW50OF90IHJlc2VydmVkXzEyOworCXVpbnQxNl90IHJlc2VydmVkXzEzOworCisJdWludDE2X3QgYm9vdF9pZF9udW1iZXI7CisJdWludDE2X3QgcmVzZXJ2ZWRfMTQ7CisKKwl1aW50MTZfdCBtYXhfbHVuc19wZXJfdGFyZ2V0OworCXVpbnQxNl90IHJlc2VydmVkXzE1OworCisJdWludDE2X3QgcG9ydF9kb3duX3JldHJ5X2NvdW50OworCXVpbnQxNl90IGxpbmtfZG93bl90aW1lb3V0OworCisJLyogRkNvZGUgcGFyYW1ldGVycy4gKi8KKwl1aW50MTZfdCBmY29kZV9wYXJhbWV0ZXI7CisKKwl1aW50MTZfdCByZXNlcnZlZF8xNlszXTsKKworCS8qIE9mZnNldCAzNTIuICovCisJdWludDhfdCByZXNlcnZlZF8xN1s0XTsKKwl1aW50MTZfdCByZXNlcnZlZF8xOFs1XTsKKwl1aW50OF90IHJlc2VydmVkXzE5WzJdOworCXVpbnQxNl90IHJlc2VydmVkXzIwWzhdOworCisJLyogT2Zmc2V0IDM4NC4gKi8KKwl1aW50OF90IHJlc2VydmVkXzIxWzE2XTsKKwl1aW50MTZfdCByZXNlcnZlZF8yMls4XTsKKworCS8qIE9mZnNldCA0MTYuICovCisJdWludDE2X3QgcmVzZXJ2ZWRfMjNbMzJdOworCisJLyogT2Zmc2V0IDQ4MC4gKi8KKwl1aW50OF90IG1vZGVsX25hbWVbMTZdOworCisJLyogT2Zmc2V0IDQ5Ni4gKi8KKwl1aW50MTZfdCBmZWF0dXJlX21hc2tfbDsKKwl1aW50MTZfdCBmZWF0dXJlX21hc2tfaDsKKwl1aW50MTZfdCByZXNlcnZlZF8yNFsyXTsKKworCXVpbnQxNl90IHN1YnN5c3RlbV92ZW5kb3JfaWQ7CisJdWludDE2X3Qgc3Vic3lzdGVtX2RldmljZV9pZDsKKworCXVpbnQzMl90IGNoZWNrc3VtOworfTsKKworLyoKKyAqIElTUCBJbml0aWFsaXphdGlvbiBDb250cm9sIEJsb2NrLgorICogTGl0dGxlIGVuZGlhbiBleGNlcHQgd2hlcmUgbm90ZWQuCisgKi8KKyNkZWZpbmUJSUNCX1ZFUlNJT04gMQorc3RydWN0IGluaXRfY2JfODF4eCB7CisJdWludDE2X3QgdmVyc2lvbjsKKwl1aW50MTZfdCByZXNlcnZlZF8xOworCisJdWludDE2X3QgZnJhbWVfcGF5bG9hZF9zaXplOworCXVpbnQxNl90IGV4ZWN1dGlvbl90aHJvdHRsZTsKKwl1aW50MTZfdCBleGNoYW5nZV9jb3VudDsKKworCXVpbnQxNl90IHJlc2VydmVkXzI7CisKKwl1aW50OF90IHBvcnRfbmFtZVtXV05fU0laRV07CQkvKiBCaWcgZW5kaWFuLiAqLworCXVpbnQ4X3Qgbm9kZV9uYW1lW1dXTl9TSVpFXTsJCS8qIEJpZyBlbmRpYW4uICovCisKKwl1aW50MTZfdCByZXNwb25zZV9xX2lucG9pbnRlcjsKKwl1aW50MTZfdCByZXF1ZXN0X3Ffb3V0cG9pbnRlcjsKKworCXVpbnQxNl90IGxvZ2luX3JldHJ5X2NvdW50OworCisJdWludDE2X3QgcHJpb19yZXF1ZXN0X3Ffb3V0cG9pbnRlcjsKKworCXVpbnQxNl90IHJlc3BvbnNlX3FfbGVuZ3RoOworCXVpbnQxNl90IHJlcXVlc3RfcV9sZW5ndGg7CisKKwl1aW50MTZfdCByZXNlcnZlZF8zOworCisJdWludDE2X3QgcHJpb19yZXF1ZXN0X3FfbGVuZ3RoOworCisJdWludDMyX3QgcmVxdWVzdF9xX2FkZHJlc3NbMl07CisJdWludDMyX3QgcmVzcG9uc2VfcV9hZGRyZXNzWzJdOworCXVpbnQzMl90IHByaW9fcmVxdWVzdF9xX2FkZHJlc3NbMl07CisKKwl1aW50OF90IHJlc2VydmVkXzRbOF07CisKKwl1aW50MTZfdCBhdGlvX3FfaW5wb2ludGVyOworCXVpbnQxNl90IGF0aW9fcV9sZW5ndGg7CisJdWludDMyX3QgYXRpb19xX2FkZHJlc3NbMl07CisKKwl1aW50MTZfdCBpbnRlcnJ1cHRfZGVsYXlfdGltZXI7CQkvKiAxMDB1cyBpbmNyZW1lbnRzLiAqLworCXVpbnQxNl90IGxvZ2luX3RpbWVvdXQ7CisKKwkvKgorCSAqIEJJVCAwLTMgPSBSZXNlcnZlZAorCSAqIEJJVCA0ICA9IEVuYWJsZSBUYXJnZXQgTW9kZQorCSAqIEJJVCA1ICA9IERpc2FibGUgSW5pdGlhdG9yIE1vZGUKKwkgKiBCSVQgNiAgPSBSZXNlcnZlZAorCSAqIEJJVCA3ICA9IFJlc2VydmVkCisJICoKKwkgKiBCSVQgOC0xMyA9IFJlc2VydmVkCisJICogQklUIDE0ID0gTm9kZSBOYW1lIE9wdGlvbgorCSAqIEJJVCAxNS0zMSA9IFJlc2VydmVkCisJICovCisJdWludDMyX3QgZmlybXdhcmVfb3B0aW9uc18xOworCisJLyoKKwkgKiBCSVQgMCAgPSBPcGVyYXRpb24gTW9kZSBiaXQgMAorCSAqIEJJVCAxICA9IE9wZXJhdGlvbiBNb2RlIGJpdCAxCisJICogQklUIDIgID0gT3BlcmF0aW9uIE1vZGUgYml0IDIKKwkgKiBCSVQgMyAgPSBPcGVyYXRpb24gTW9kZSBiaXQgMworCSAqIEJJVCA0LTcgPSBSZXNlcnZlZAorCSAqCisJICogQklUIDggID0gRW5hYmxlIENsYXNzIDIKKwkgKiBCSVQgOSAgPSBFbmFibGUgQUNLMAorCSAqIEJJVCAxMCA9IFJlc2VydmVkCisJICogQklUIDExID0gRW5hYmxlIEZDLVNQIFNlY3VyaXR5CisJICogQklUIDEyID0gRkMgVGFwZSBFbmFibGUKKwkgKiBCSVQgMTMgPSBSZXNlcnZlZAorCSAqIEJJVCAxNCA9IEVuYWJsZSBUYXJnZXQgUFJMSSBDb250cm9sCisJICogQklUIDE1LTMxID0gUmVzZXJ2ZWQKKwkgKi8KKwl1aW50MzJfdCBmaXJtd2FyZV9vcHRpb25zXzI7CisKKwkvKgorCSAqIEJJVCAwLTMgPSBSZXNlcnZlZAorCSAqIEJJVCA0ICA9IEZDUCBSU1AgUGF5bG9hZCBiaXQgMAorCSAqIEJJVCA1ICA9IEZDUCBSU1AgUGF5bG9hZCBiaXQgMQorCSAqIEJJVCA2ICA9IEVuYWJsZSBSZWNlaXZlIE91dC1vZi1PcmRlciBkYXRhIGZyYW1lIGhhbmRsaW5nCisJICogQklUIDcgID0gUmVzZXJ2ZWQKKwkgKgorCSAqIEJJVCA4ICA9IFJlc2VydmVkCisJICogQklUIDkgID0gRW5hYmxlIE91dC1vZi1PcmRlciBGQ1BfWEZFUl9SRFkgcmVsYXRpdmUgb2Zmc2V0IGhhbmRsaW5nCisJICogQklUIDEwLTE2ID0gUmVzZXJ2ZWQKKwkgKiBCSVQgMTcgPSBFbmFibGUgbXVsdGlwbGUgRkNGcworCSAqIEJJVCAxOC0yMCA9IE1BQyBhZGRyZXNzaW5nIG1vZGUKKwkgKiBCSVQgMjEtMjUgPSBFdGhlcm5ldCBkYXRhIHJhdGUKKwkgKiBCSVQgMjYgPSBFbmFibGUgZXRoZXJuZXQgaGVhZGVyIHJ4IElPQ0IgZm9yIEFUSU8gcQorCSAqIEJJVCAyNyA9IEVuYWJsZSBldGhlcm5ldCBoZWFkZXIgcnggSU9DQiBmb3IgcmVzcG9uc2UgcQorCSAqIEJJVCAyOCA9IFNQTUEgc2VsZWN0aW9uIGJpdCAwCisJICogQklUIDI4ID0gU1BNQSBzZWxlY3Rpb24gYml0IDEKKwkgKiBCSVQgMzAtMzEgPSBSZXNlcnZlZAorCSAqLworCXVpbnQzMl90IGZpcm13YXJlX29wdGlvbnNfMzsKKworCXVpbnQ4X3QgIHJlc2VydmVkXzVbOF07CisKKwl1aW50OF90IGVub2RlX21hY1s2XTsKKworCXVpbnQ4X3QgcmVzZXJ2ZWRfNlsxMF07Cit9OworCitzdHJ1Y3QgbWlkX2luaXRfY2JfODF4eCB7CisJc3RydWN0IGluaXRfY2JfODF4eCBpbml0X2NiOworCisJdWludDE2X3QgY291bnQ7CisJdWludDE2X3Qgb3B0aW9uczsKKworCXN0cnVjdCBtaWRfY29uZl9lbnRyeV8yNHh4IGVudHJpZXNbTUFYX01VTFRJX0lEX0ZBQlJJQ107Cit9OworCisjZGVmaW5lIEZBUlhfQUNDRVNTX0ZMQVNIX0NPTkZfODFYWAkweDdGRkQwMDAwCisjZGVmaW5lIEZBUlhfQUNDRVNTX0ZMQVNIX0RBVEFfODFYWAkweDdGODAwMDAwCisKKy8qIDgxWFggRmxhc2ggbG9jYXRpb25zIC0tIG9jY3VwaWVzIHNlY29uZCAyTUIgcmVnaW9uLiAqLworI2RlZmluZSBGQV9CT09UX0NPREVfQUREUl84MQkweDgwMDAwCisjZGVmaW5lIEZBX1JJU0NfQ09ERV9BRERSXzgxCTB4QTAwMDAKKyNkZWZpbmUgRkFfRldfQVJFQV9BRERSXzgxCTB4QzAwMDAKKyNkZWZpbmUgRkFfVlBEX05WUkFNX0FERFJfODEJMHhEMDAwMAorI2RlZmluZSBGQV9GRUFUVVJFX0FERFJfODEJMHhENDAwMAorI2RlZmluZSBGQV9GTEFTSF9ERVNDUl9BRERSXzgxCTB4RDgwMDAKKyNkZWZpbmUgRkFfRkxBU0hfTEFZT1VUX0FERFJfODEJMHhEODQwMAorI2RlZmluZSBGQV9IV19FVkVOVDBfQUREUl84MQkweERDMDAwCisjZGVmaW5lIEZBX0hXX0VWRU5UMV9BRERSXzgxCTB4REM0MDAKKyNkZWZpbmUgRkFfTlBJVl9DT05GMF9BRERSXzgxCTB4RDEwMDAKKyNkZWZpbmUgRkFfTlBJVl9DT05GMV9BRERSXzgxCTB4RDIwMDAKKwogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZ2JsLmggYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZ2JsLmgKaW5kZXggMDAxMWUzMS4uYmE0OTEzMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2dibC5oCisrKyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9nYmwuaApAQCAtMjgsOCArMjgsMTAgQEAKIGV4dGVybiB2b2lkIHFsYTI0eHhfcmVzZXRfYWRhcHRlcihzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqKTsKIGV4dGVybiBpbnQgcWxhMngwMF9udnJhbV9jb25maWcoc3RydWN0IHNjc2lfcWxhX2hvc3QgKik7CiBleHRlcm4gaW50IHFsYTI0eHhfbnZyYW1fY29uZmlnKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICopOworZXh0ZXJuIGludCBxbGE4MXh4X252cmFtX2NvbmZpZyhzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqKTsKIGV4dGVybiB2b2lkIHFsYTJ4MDBfdXBkYXRlX2Z3X29wdGlvbnMoc3RydWN0IHNjc2lfcWxhX2hvc3QgKik7CiBleHRlcm4gdm9pZCBxbGEyNHh4X3VwZGF0ZV9md19vcHRpb25zKHNjc2lfcWxhX2hvc3RfdCAqKTsKK2V4dGVybiB2b2lkIHFsYTgxeHhfdXBkYXRlX2Z3X29wdGlvbnMoc2NzaV9xbGFfaG9zdF90ICopOwogZXh0ZXJuIGludCBxbGEyeDAwX2xvYWRfcmlzYyhzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqLCB1aW50MzJfdCAqKTsKIGV4dGVybiBpbnQgcWxhMjR4eF9sb2FkX3Jpc2Moc2NzaV9xbGFfaG9zdF90ICosIHVpbnQzMl90ICopOwogCkBAIC02OSw4ICs3MSw2IEBACiBleHRlcm4gdm9pZCBxbGEyeDAwX2Fib3J0X2FsbF9jbWRzKHNjc2lfcWxhX2hvc3RfdCAqLCBpbnQpOwogZXh0ZXJuIGludCBxbGEyeDAwX3Bvc3RfYWVuX3dvcmsoc3RydWN0IHNjc2lfcWxhX2hvc3QgKiwgZW51bQogICAgIGZjX2hvc3RfZXZlbnRfY29kZSwgdTMyKTsKLWV4dGVybiBpbnQgcWxhMngwMF9wb3N0X2h3ZV93b3JrKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICosIHVpbnQxNl90ICwgdWludDE2X3QsCi0gICAgdWludDE2X3QsIHVpbnQxNl90KTsKIAogZXh0ZXJuIHZvaWQgcWxhMngwMF9hYm9ydF9mY3BvcnRfY21kcyhmY19wb3J0X3QgKik7CiBleHRlcm4gc3RydWN0IHNjc2lfcWxhX2hvc3QgKnFsYTJ4MDBfY3JlYXRlX2hvc3Qoc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSAqLApAQCAtMTQzLDcgKzE0Myw3IEBACiAKIGV4dGVybiB2b2lkCiBxbGEyeDAwX2dldF9md192ZXJzaW9uKHNjc2lfcWxhX2hvc3RfdCAqLCB1aW50MTZfdCAqLAotICAgIHVpbnQxNl90ICosIHVpbnQxNl90ICosIHVpbnQxNl90ICosIHVpbnQzMl90ICopOworICAgIHVpbnQxNl90ICosIHVpbnQxNl90ICosIHVpbnQxNl90ICosIHVpbnQzMl90ICosIHVpbnQ4X3QgKiwgdWludDMyX3QgKik7CiAKIGV4dGVybiBpbnQKIHFsYTJ4MDBfZ2V0X2Z3X29wdGlvbnMoc2NzaV9xbGFfaG9zdF90ICosIHVpbnQxNl90ICopOwpAQCAtMzE3LDkgKzMxNyw2IEBACiBleHRlcm4gaW50IHFsYTJ4MDBfZ2V0X2ZsYXNoX3ZlcnNpb24oc2NzaV9xbGFfaG9zdF90ICosIHZvaWQgKik7CiBleHRlcm4gaW50IHFsYTI0eHhfZ2V0X2ZsYXNoX3ZlcnNpb24oc2NzaV9xbGFfaG9zdF90ICosIHZvaWQgKik7CiAKLWV4dGVybiBpbnQgcWxhMnh4eF9od19ldmVudF9sb2coc2NzaV9xbGFfaG9zdF90ICosIHVpbnQxNl90ICwgdWludDE2X3QsCi0gICAgdWludDE2X3QsIHVpbnQxNl90KTsKLQogZXh0ZXJuIGludCBxbGEyeHh4X2dldF9mbGFzaF9pbmZvKHNjc2lfcWxhX2hvc3RfdCAqKTsKIGV4dGVybiBpbnQgcWxhMnh4eF9nZXRfdnBkX2ZpZWxkKHNjc2lfcWxhX2hvc3RfdCAqLCBjaGFyICosIGNoYXIgKiwgc2l6ZV90KTsKIApAQCAtMzMyLDYgKzMyOSw3IEBACiBleHRlcm4gdm9pZCBxbGEyMzAwX2Z3X2R1bXAoc2NzaV9xbGFfaG9zdF90ICosIGludCk7CiBleHRlcm4gdm9pZCBxbGEyNHh4X2Z3X2R1bXAoc2NzaV9xbGFfaG9zdF90ICosIGludCk7CiBleHRlcm4gdm9pZCBxbGEyNXh4X2Z3X2R1bXAoc2NzaV9xbGFfaG9zdF90ICosIGludCk7CitleHRlcm4gdm9pZCBxbGE4MXh4X2Z3X2R1bXAoc2NzaV9xbGFfaG9zdF90ICosIGludCk7CiBleHRlcm4gdm9pZCBxbGEyeDAwX2R1bXBfcmVncyhzY3NpX3FsYV9ob3N0X3QgKik7CiBleHRlcm4gdm9pZCBxbGEyeDAwX2R1bXBfYnVmZmVyKHVpbnQ4X3QgKiwgdWludDMyX3QpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZ3MuYyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9ncy5jCmluZGV4IDBhNmY3Mjk3Li41NTdmNThkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZ3MuYworKysgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZ3MuYwpAQCAtMTUzNSw3ICsxNTM1LDEwIEBACiAJZWl0ZXIgPSAoc3RydWN0IGN0X2ZkbWlfcG9ydF9hdHRyICopIChlbnRyaWVzICsgc2l6ZSk7CiAJZWl0ZXItPnR5cGUgPSBfX2NvbnN0YW50X2NwdV90b19iZTE2KEZETUlfUE9SVF9TVVBQT1JUX1NQRUVEKTsKIAllaXRlci0+bGVuID0gX19jb25zdGFudF9jcHVfdG9fYmUxNig0ICsgNCk7Ci0JaWYgKElTX1FMQTI1WFgoaGEpKQorCWlmIChJU19RTEE4MVhYKGhhKSkKKwkJZWl0ZXItPmEuc3VwX3NwZWVkID0gX19jb25zdGFudF9jcHVfdG9fYmUzMigKKwkJICAgIEZETUlfUE9SVF9TUEVFRF8xMEdCKTsKKwllbHNlIGlmIChJU19RTEEyNVhYKGhhKSkKIAkJZWl0ZXItPmEuc3VwX3NwZWVkID0gX19jb25zdGFudF9jcHVfdG9fYmUzMigKIAkJICAgIEZETUlfUE9SVF9TUEVFRF8xR0J8RkRNSV9QT1JUX1NQRUVEXzJHQnwKIAkJICAgIEZETUlfUE9SVF9TUEVFRF80R0J8RkRNSV9QT1JUX1NQRUVEXzhHQik7CkBAIC0xNTc1LDYgKzE1NzgsMTAgQEAKIAkJZWl0ZXItPmEuY3VyX3NwZWVkID0KIAkJICAgIF9fY29uc3RhbnRfY3B1X3RvX2JlMzIoRkRNSV9QT1JUX1NQRUVEXzhHQik7CiAJCWJyZWFrOworCWNhc2UgUE9SVF9TUEVFRF8xMEdCOgorCQllaXRlci0+YS5jdXJfc3BlZWQgPQorCQkgICAgX19jb25zdGFudF9jcHVfdG9fYmUzMihGRE1JX1BPUlRfU1BFRURfMTBHQik7CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCWVpdGVyLT5hLmN1cl9zcGVlZCA9CiAJCSAgICBfX2NvbnN0YW50X2NwdV90b19iZTMyKEZETUlfUE9SVF9TUEVFRF9VTktOT1dOKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9pbml0LmMgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfaW5pdC5jCmluZGV4IDUyZWQ1NmUuLjlhZDRkMDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9pbml0LmMKKysrIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2luaXQuYwpAQCAtNTUyLDEwICs1NTIsNiBAQAogCQlkMiA9IFJEX1JFR19EV09SRCgmcmVnLT5jdHJsX3N0YXR1cyk7CiAJCWJhcnJpZXIoKTsKIAl9Ci0JaWYgKGNudCA9PSAwIHx8IGh3X2V2dCkKLQkJcWxhMnh4eF9od19ldmVudF9sb2codmhhLCBIV19FVkVOVF9SRVNFVF9FUlIsCi0JCSAgICBSRF9SRUdfV09SRCgmcmVnLT5tYWlsYm94MSksIFJEX1JFR19XT1JEKCZyZWctPm1haWxib3gyKSwKLQkJICAgIFJEX1JFR19XT1JEKCZyZWctPm1haWxib3gzKSk7CiAKIAlXUlRfUkVHX0RXT1JEKCZyZWctPmhjY3IsIEhDQ1JYX1NFVF9SSVNDX1JFU0VUKTsKIAlSRF9SRUdfRFdPUkQoJnJlZy0+aGNjcik7CkBAIC01NzQsNiArNTcwLDkgQEAKIAl9CiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOworCisJaWYgKElTX05PUE9MTElOR19UWVBFKGhhKSkKKwkJaGEtPmlzcF9vcHMtPmVuYWJsZV9pbnRycyhoYSk7CiB9CiAKIC8qKgpAQCAtNzc5LDE2ICs3NzgsMTkgQEAKIAkJbWVtX3NpemUgPSAoaGEtPmZ3X21lbW9yeV9zaXplIC0gMHgxMTAwMCArIDEpICoKIAkJICAgIHNpemVvZih1aW50MTZfdCk7CiAJfSBlbHNlIGlmIChJU19GV0kyX0NBUEFCTEUoaGEpKSB7Ci0JCWZpeGVkX3NpemUgPSBJU19RTEEyNVhYKGhhKSA/Ci0JCQlvZmZzZXRvZihzdHJ1Y3QgcWxhMjV4eF9md19kdW1wLCBleHRfbWVtKSA6Ci0JCQlvZmZzZXRvZihzdHJ1Y3QgcWxhMjR4eF9md19kdW1wLCBleHRfbWVtKTsKKwkJaWYgKElTX1FMQTgxWFgoaGEpKQorCQkJZml4ZWRfc2l6ZSA9IG9mZnNldG9mKHN0cnVjdCBxbGE4MXh4X2Z3X2R1bXAsIGV4dF9tZW0pOworCQllbHNlIGlmIChJU19RTEEyNVhYKGhhKSkKKwkJCWZpeGVkX3NpemUgPSBvZmZzZXRvZihzdHJ1Y3QgcWxhMjV4eF9md19kdW1wLCBleHRfbWVtKTsKKwkJZWxzZQorCQkJZml4ZWRfc2l6ZSA9IG9mZnNldG9mKHN0cnVjdCBxbGEyNHh4X2Z3X2R1bXAsIGV4dF9tZW0pOwogCQltZW1fc2l6ZSA9IChoYS0+ZndfbWVtb3J5X3NpemUgLSAweDEwMDAwMCArIDEpICoKIAkJICAgIHNpemVvZih1aW50MzJfdCk7CiAJCWlmIChoYS0+bXFlbmFibGUpCiAJCQltcV9zaXplID0gc2l6ZW9mKHN0cnVjdCBxbGEyeHh4X21xX2NoYWluKTsKIAogCQkvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIEZpYnJlIENoYW5uZWwgRXZlbnQgQnVmZmVyLiAqLwotCQlpZiAoIUlTX1FMQTI1WFgoaGEpKQorCQlpZiAoIUlTX1FMQTI1WFgoaGEpICYmICFJU19RTEE4MVhYKGhhKSkKIAkJCWdvdG8gdHJ5X2VmdDsKIAogCQl0YyA9IGRtYV9hbGxvY19jb2hlcmVudCgmaGEtPnBkZXYtPmRldiwgRkNFX1NJWkUsICZ0Y19kbWEsCkBAIC04NTEsNyArODUzLDkgQEAKIAogCWR1bXBfc2l6ZSA9IG9mZnNldG9mKHN0cnVjdCBxbGEyeHh4X2Z3X2R1bXAsIGlzcCk7CiAJZHVtcF9zaXplICs9IGZpeGVkX3NpemUgKyBtZW1fc2l6ZSArIHJlcV9xX3NpemUgKyByc3BfcV9zaXplICsKLQkgICAgbXFfc2l6ZSArIGVmdF9zaXplICsgZmNlX3NpemU7CisJICAgIGVmdF9zaXplOworCWhhLT5jaGFpbl9vZmZzZXQgPSBkdW1wX3NpemU7CisJZHVtcF9zaXplICs9IG1xX3NpemUgKyBmY2Vfc2l6ZTsKIAogCWhhLT5md19kdW1wID0gdm1hbGxvYyhkdW1wX3NpemUpOwogCWlmICghaGEtPmZ3X2R1bXApIHsKQEAgLTk4Nyw3ICs5OTEsOCBAQAogCQkJCSAgICAmaGEtPmZ3X21ham9yX3ZlcnNpb24sCiAJCQkJICAgICZoYS0+ZndfbWlub3JfdmVyc2lvbiwKIAkJCQkgICAgJmhhLT5md19zdWJtaW5vcl92ZXJzaW9uLAotCQkJCSAgICAmaGEtPmZ3X2F0dHJpYnV0ZXMsICZoYS0+ZndfbWVtb3J5X3NpemUpOworCQkJCSAgICAmaGEtPmZ3X2F0dHJpYnV0ZXMsICZoYS0+ZndfbWVtb3J5X3NpemUsCisJCQkJICAgIGhhLT5tcGlfdmVyc2lvbiwgJmhhLT5tcGlfY2FwYWJpbGl0aWVzKTsKIAkJCQloYS0+ZmxhZ3MubnBpdl9zdXBwb3J0ZWQgPSAwOwogCQkJCWlmIChJU19RTEEyWFhYX01JRFRZUEUoaGEpICYmCiAJCQkJCSAoaGEtPmZ3X2F0dHJpYnV0ZXMgJiBCSVRfMikpIHsKQEAgLTEyNTMsMzUgKzEyNTgsNDggQEAKIHsKIAlpbnQJcnZhbDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzID0gMDsKLQlpbnQgY250OworCWludCBjbnQsIHF1ZTsKIAlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKLQlzdHJ1Y3QgcmVxX3F1ZSAqcmVxID0gaGEtPnJlcV9xX21hcFswXTsKLQlzdHJ1Y3QgcnNwX3F1ZSAqcnNwID0gaGEtPnJzcF9xX21hcFswXTsKKwlzdHJ1Y3QgcmVxX3F1ZSAqcmVxOworCXN0cnVjdCByc3BfcXVlICpyc3A7CisJc3RydWN0IHNjc2lfcWxhX2hvc3QgKnZwOwogCXN0cnVjdCBtaWRfaW5pdF9jYl8yNHh4ICptaWRfaW5pdF9jYiA9CiAJICAgIChzdHJ1Y3QgbWlkX2luaXRfY2JfMjR4eCAqKSBoYS0+aW5pdF9jYjsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOwogCiAJLyogQ2xlYXIgb3V0c3RhbmRpbmcgY29tbWFuZHMgYXJyYXkuICovCi0JZm9yIChjbnQgPSAwOyBjbnQgPCBNQVhfT1VUU1RBTkRJTkdfQ09NTUFORFM7IGNudCsrKQotCQlyZXEtPm91dHN0YW5kaW5nX2NtZHNbY250XSA9IE5VTEw7CisJZm9yIChxdWUgPSAwOyBxdWUgPCBoYS0+bWF4X3F1ZXVlczsgcXVlKyspIHsKKwkJcmVxID0gaGEtPnJlcV9xX21hcFtxdWVdOworCQlpZiAoIXJlcSkKKwkJCWNvbnRpbnVlOworCQlmb3IgKGNudCA9IDA7IGNudCA8IE1BWF9PVVRTVEFORElOR19DT01NQU5EUzsgY250KyspCisJCQlyZXEtPm91dHN0YW5kaW5nX2NtZHNbY250XSA9IE5VTEw7CiAKLQlyZXEtPmN1cnJlbnRfb3V0c3RhbmRpbmdfY21kID0gMDsKKwkJcmVxLT5jdXJyZW50X291dHN0YW5kaW5nX2NtZCA9IDA7CisKKwkJLyogSW5pdGlhbGl6ZSBmaXJtd2FyZS4gKi8KKwkJcmVxLT5yaW5nX3B0ciAgPSByZXEtPnJpbmc7CisJCXJlcS0+cmluZ19pbmRleCAgICA9IDA7CisJCXJlcS0+Y250ICAgICAgPSByZXEtPmxlbmd0aDsKKwl9CisKKwlmb3IgKHF1ZSA9IDA7IHF1ZSA8IGhhLT5tYXhfcXVldWVzOyBxdWUrKykgeworCQlyc3AgPSBoYS0+cnNwX3FfbWFwW3F1ZV07CisJCWlmICghcnNwKQorCQkJY29udGludWU7CisJCXJzcC0+cmluZ19wdHIgPSByc3AtPnJpbmc7CisJCXJzcC0+cmluZ19pbmRleCAgICA9IDA7CisKKwkJLyogSW5pdGlhbGl6ZSByZXNwb25zZSBxdWV1ZSBlbnRyaWVzICovCisJCXFsYTJ4MDBfaW5pdF9yZXNwb25zZV9xX2VudHJpZXMocnNwKTsKKwl9CiAKIAkvKiBDbGVhciBSU0NOIHF1ZXVlLiAqLwotCXZoYS0+cnNjbl9pbl9wdHIgPSAwOwotCXZoYS0+cnNjbl9vdXRfcHRyID0gMDsKLQotCS8qIEluaXRpYWxpemUgZmlybXdhcmUuICovCi0JcmVxLT5yaW5nX3B0ciAgPSByZXEtPnJpbmc7Ci0JcmVxLT5yaW5nX2luZGV4ICAgID0gMDsKLQlyZXEtPmNudCAgICAgID0gcmVxLT5sZW5ndGg7Ci0JcnNwLT5yaW5nX3B0ciA9IHJzcC0+cmluZzsKLQlyc3AtPnJpbmdfaW5kZXggICAgPSAwOwotCi0JLyogSW5pdGlhbGl6ZSByZXNwb25zZSBxdWV1ZSBlbnRyaWVzICovCi0JcWxhMngwMF9pbml0X3Jlc3BvbnNlX3FfZW50cmllcyhyc3ApOwotCisJbGlzdF9mb3JfZWFjaF9lbnRyeSh2cCwgJmhhLT52cF9saXN0LCBsaXN0KSB7CisJCXZwLT5yc2NuX2luX3B0ciA9IDA7CisJCXZwLT5yc2NuX291dF9wdHIgPSAwOworCX0KIAloYS0+aXNwX29wcy0+Y29uZmlnX3JpbmdzKHZoYSk7CiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOwpAQCAtMTY2NSwxMCArMTY4Myw2IEBACiAJCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwgIkZhbGxpbmcgYmFjayB0byBmdW5jdGlvbmluZyAoeWV0ICIKIAkJICAgICJpbnZhbGlkIC0tIFdXUE4pIGRlZmF1bHRzLlxuIik7CiAKLQkJaWYgKGNoa3N1bSkKLQkJCXFsYTJ4eHhfaHdfZXZlbnRfbG9nKHZoYSwgSFdfRVZFTlRfTlZSQU1fQ0hLU1VNX0VSUiwgMCwKLQkJCSAgICBNU1coY2hrc3VtKSwgTFNXKGNoa3N1bSkpOwotCiAJCS8qCiAJCSAqIFNldCBkZWZhdWx0IGluaXRpYWxpemF0aW9uIGNvbnRyb2wgYmxvY2suCiAJCSAqLwpAQCAtMzIxMSw4ICszMjI1LDggQEAKIAlpbnQgcnZhbCA9IFFMQV9TVUNDRVNTOwogCXVpbnQzMl90IHdhaXRfdGltZTsKIAlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKLQlzdHJ1Y3QgcmVxX3F1ZSAqcmVxID0gaGEtPnJlcV9xX21hcFswXTsKLQlzdHJ1Y3QgcnNwX3F1ZSAqcnNwID0gaGEtPnJzcF9xX21hcFswXTsKKwlzdHJ1Y3QgcmVxX3F1ZSAqcmVxID0gaGEtPnJlcV9xX21hcFt2aGEtPnJlcV9xdWVzWzBdXTsKKwlzdHJ1Y3QgcnNwX3F1ZSAqcnNwID0gcmVxLT5yc3A7CiAKIAlhdG9taWNfc2V0KCZ2aGEtPmxvb3Bfc3RhdGUsIExPT1BfVVBEQVRFKTsKIAljbGVhcl9iaXQoSVNQX0FCT1JUX1JFVFJZLCAmdmhhLT5kcGNfZmxhZ3MpOwpAQCAtMzQ5MSw2ICszNTA1LDcgQEAKIAkJfQogCQlyZXEgPSBoYS0+cmVxX3FfbWFwW2ldOwogCQlpZiAocmVxKSB7CisJCS8qIENsZWFyIG91dHN0YW5kaW5nIGNvbW1hbmRzIGFycmF5LiAqLwogCQkJcmVxLT5vcHRpb25zICY9IH5CSVRfMDsKIAkJCXJldCA9IHFsYTI1eHhfaW5pdF9yZXFfcXVlKGJhc2VfdmhhLCByZXEsIHJlcS0+b3B0aW9ucyk7CiAJCQlpZiAocmV0ICE9IFFMQV9TVUNDRVNTKQpAQCAtMzQ5OSw3ICszNTE0LDcgQEAKIAkJCQkJCXJlcS0+aWQpKTsKIAkJCWVsc2UKIAkJCQlERUJVRzJfMTcocHJpbnRrKEtFUk5fV0FSTklORwotCQkJCQkiJXMgUnNwIHF1ZTolZCBpbml0ZWRcbiIsIF9fZnVuY19fLAorCQkJCQkiJXMgUmVxIHF1ZTolZCBpbml0ZWRcbiIsIF9fZnVuY19fLAogCQkJCQkJcmVxLT5pZCkpOwogCQl9CiAJfQpAQCAtNDE1MCw4ICs0MTY1LDggQEAKIAl1aW50MTZfdCBtYltNQUlMQk9YX1JFR0lTVEVSX0NPVU5UXTsKIAlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKIAlzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqYmFzZV92aGEgPSBwY2lfZ2V0X2RydmRhdGEoaGEtPnBkZXYpOwotCXN0cnVjdCByZXFfcXVlICpyZXEgPSBoYS0+cmVxX3FfbWFwWzBdOwotCXN0cnVjdCByc3BfcXVlICpyc3AgPSBoYS0+cnNwX3FfbWFwWzBdOworCXN0cnVjdCByZXFfcXVlICpyZXEgPSBoYS0+cmVxX3FfbWFwW3ZoYS0+cmVxX3F1ZXNbMF1dOworCXN0cnVjdCByc3BfcXVlICpyc3AgPSByZXEtPnJzcDsKIAogCWlmICghdmhhLT52cF9pZHgpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtNDI1NSwzICs0MjcwLDI2OSBAQAogCXJldHVybiBydmFsICE9IFFMQV9TVUNDRVNTIHx8IHN0YXR1c1swXSA/IFFMQV9GVU5DVElPTl9GQUlMRUQ6CiAJICAgIFFMQV9TVUNDRVNTOwogfQorCisvKiA4MVhYIFN1cHBvcnQgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ludAorcWxhODF4eF9udnJhbV9jb25maWcoc2NzaV9xbGFfaG9zdF90ICp2aGEpCit7CisJaW50ICAgcnZhbDsKKwlzdHJ1Y3QgaW5pdF9jYl84MXh4ICppY2I7CisJc3RydWN0IG52cmFtXzgxeHggKm52OworCXVpbnQzMl90ICpkcHRyOworCXVpbnQ4X3QgICpkcHRyMSwgKmRwdHIyOworCXVpbnQzMl90IGNoa3N1bTsKKwl1aW50MTZfdCBjbnQ7CisJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CisKKwlydmFsID0gUUxBX1NVQ0NFU1M7CisJaWNiID0gKHN0cnVjdCBpbml0X2NiXzgxeHggKiloYS0+aW5pdF9jYjsKKwludiA9IGhhLT5udnJhbTsKKworCS8qIERldGVybWluZSBOVlJBTSBzdGFydGluZyBhZGRyZXNzLiAqLworCWhhLT5udnJhbV9zaXplID0gc2l6ZW9mKHN0cnVjdCBudnJhbV84MXh4KTsKKwloYS0+bnZyYW1fYmFzZSA9IEZBX05WUkFNX0ZVTkMwX0FERFI7CisJaGEtPnZwZF9zaXplID0gRkFfTlZSQU1fVlBEX1NJWkU7CisJaGEtPnZwZF9iYXNlID0gRkFfTlZSQU1fVlBEMF9BRERSOworCWlmIChQQ0lfRlVOQyhoYS0+cGRldi0+ZGV2Zm4pICYgMSkgeworCQloYS0+bnZyYW1fYmFzZSA9IEZBX05WUkFNX0ZVTkMxX0FERFI7CisJCWhhLT52cGRfYmFzZSA9IEZBX05WUkFNX1ZQRDFfQUREUjsKKwl9CisKKwkvKiBHZXQgVlBEIGRhdGEgaW50byBjYWNoZSAqLworCWhhLT52cGQgPSBoYS0+bnZyYW0gKyBWUERfT0ZGU0VUOworCWhhLT5pc3Bfb3BzLT5yZWFkX252cmFtKHZoYSwgKHVpbnQ4X3QgKiloYS0+dnBkLAorCSAgICBoYS0+bnZyYW1fYmFzZSAtIEZBX05WUkFNX0ZVTkMwX0FERFIsIEZBX05WUkFNX1ZQRF9TSVpFICogNCk7CisKKwkvKiBHZXQgTlZSQU0gZGF0YSBpbnRvIGNhY2hlIGFuZCBjYWxjdWxhdGUgY2hlY2tzdW0uICovCisJZHB0ciA9ICh1aW50MzJfdCAqKW52OworCWhhLT5pc3Bfb3BzLT5yZWFkX252cmFtKHZoYSwgKHVpbnQ4X3QgKilkcHRyLCBoYS0+bnZyYW1fYmFzZSwKKwkgICAgaGEtPm52cmFtX3NpemUpOworCWZvciAoY250ID0gMCwgY2hrc3VtID0gMDsgY250IDwgaGEtPm52cmFtX3NpemUgPj4gMjsgY250KyspCisJCWNoa3N1bSArPSBsZTMyX3RvX2NwdSgqZHB0cisrKTsKKworCURFQlVHNShwcmludGsoInNjc2koJWxkKTogQ29udGVudHMgb2YgTlZSQU1cbiIsIGhhLT5ob3N0X25vKSk7CisJREVCVUc1KHFsYTJ4MDBfZHVtcF9idWZmZXIoKHVpbnQ4X3QgKiludiwgaGEtPm52cmFtX3NpemUpKTsKKworCS8qIEJhZCBOVlJBTSBkYXRhLCBzZXQgZGVmYXVsdHMgcGFyYW1ldGVycy4gKi8KKwlpZiAoY2hrc3VtIHx8IG52LT5pZFswXSAhPSAnSScgfHwgbnYtPmlkWzFdICE9ICdTJyB8fCBudi0+aWRbMl0gIT0gJ1AnCisJICAgIHx8IG52LT5pZFszXSAhPSAnICcgfHwKKwkgICAgbnYtPm52cmFtX3ZlcnNpb24gPCBfX2NvbnN0YW50X2NwdV90b19sZTE2KElDQl9WRVJTSU9OKSkgeworCQkvKiBSZXNldCBOVlJBTSBkYXRhLiAqLworCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsICJJbmNvbnNpc3RlbnQgTlZSQU0gZGV0ZWN0ZWQ6ICIKKwkJICAgICJjaGVja3N1bT0weCV4IGlkPSVjIHZlcnNpb249MHgleC5cbiIsIGNoa3N1bSwgbnYtPmlkWzBdLAorCQkgICAgbGUxNl90b19jcHUobnYtPm52cmFtX3ZlcnNpb24pKTsKKwkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLCAiRmFsbGluZyBiYWNrIHRvIGZ1bmN0aW9uaW5nICh5ZXQgIgorCQkgICAgImludmFsaWQgLS0gV1dQTikgZGVmYXVsdHMuXG4iKTsKKworCQkvKgorCQkgKiBTZXQgZGVmYXVsdCBpbml0aWFsaXphdGlvbiBjb250cm9sIGJsb2NrLgorCQkgKi8KKwkJbWVtc2V0KG52LCAwLCBoYS0+bnZyYW1fc2l6ZSk7CisJCW52LT5udnJhbV92ZXJzaW9uID0gX19jb25zdGFudF9jcHVfdG9fbGUxNihJQ0JfVkVSU0lPTik7CisJCW52LT52ZXJzaW9uID0gX19jb25zdGFudF9jcHVfdG9fbGUxNihJQ0JfVkVSU0lPTik7CisJCW52LT5mcmFtZV9wYXlsb2FkX3NpemUgPSBfX2NvbnN0YW50X2NwdV90b19sZTE2KDIwNDgpOworCQludi0+ZXhlY3V0aW9uX3Rocm90dGxlID0gX19jb25zdGFudF9jcHVfdG9fbGUxNigweEZGRkYpOworCQludi0+ZXhjaGFuZ2VfY291bnQgPSBfX2NvbnN0YW50X2NwdV90b19sZTE2KDApOworCQludi0+cG9ydF9uYW1lWzBdID0gMHgyMTsKKwkJbnYtPnBvcnRfbmFtZVsxXSA9IDB4MDAgKyBQQ0lfRlVOQyhoYS0+cGRldi0+ZGV2Zm4pOworCQludi0+cG9ydF9uYW1lWzJdID0gMHgwMDsKKwkJbnYtPnBvcnRfbmFtZVszXSA9IDB4ZTA7CisJCW52LT5wb3J0X25hbWVbNF0gPSAweDhiOworCQludi0+cG9ydF9uYW1lWzVdID0gMHgxYzsKKwkJbnYtPnBvcnRfbmFtZVs2XSA9IDB4NTU7CisJCW52LT5wb3J0X25hbWVbN10gPSAweDg2OworCQludi0+bm9kZV9uYW1lWzBdID0gMHgyMDsKKwkJbnYtPm5vZGVfbmFtZVsxXSA9IDB4MDA7CisJCW52LT5ub2RlX25hbWVbMl0gPSAweDAwOworCQludi0+bm9kZV9uYW1lWzNdID0gMHhlMDsKKwkJbnYtPm5vZGVfbmFtZVs0XSA9IDB4OGI7CisJCW52LT5ub2RlX25hbWVbNV0gPSAweDFjOworCQludi0+bm9kZV9uYW1lWzZdID0gMHg1NTsKKwkJbnYtPm5vZGVfbmFtZVs3XSA9IDB4ODY7CisJCW52LT5sb2dpbl9yZXRyeV9jb3VudCA9IF9fY29uc3RhbnRfY3B1X3RvX2xlMTYoOCk7CisJCW52LT5pbnRlcnJ1cHRfZGVsYXlfdGltZXIgPSBfX2NvbnN0YW50X2NwdV90b19sZTE2KDApOworCQludi0+bG9naW5fdGltZW91dCA9IF9fY29uc3RhbnRfY3B1X3RvX2xlMTYoMCk7CisJCW52LT5maXJtd2FyZV9vcHRpb25zXzEgPQorCQkgICAgX19jb25zdGFudF9jcHVfdG9fbGUzMihCSVRfMTR8QklUXzEzfEJJVF8yfEJJVF8xKTsKKwkJbnYtPmZpcm13YXJlX29wdGlvbnNfMiA9IF9fY29uc3RhbnRfY3B1X3RvX2xlMzIoMiA8PCA0KTsKKwkJbnYtPmZpcm13YXJlX29wdGlvbnNfMiB8PSBfX2NvbnN0YW50X2NwdV90b19sZTMyKEJJVF8xMik7CisJCW52LT5maXJtd2FyZV9vcHRpb25zXzMgPSBfX2NvbnN0YW50X2NwdV90b19sZTMyKDIgPDwgMTMpOworCQludi0+aG9zdF9wID0gX19jb25zdGFudF9jcHVfdG9fbGUzMihCSVRfMTF8QklUXzEwKTsKKwkJbnYtPmVmaV9wYXJhbWV0ZXJzID0gX19jb25zdGFudF9jcHVfdG9fbGUzMigwKTsKKwkJbnYtPnJlc2V0X2RlbGF5ID0gNTsKKwkJbnYtPm1heF9sdW5zX3Blcl90YXJnZXQgPSBfX2NvbnN0YW50X2NwdV90b19sZTE2KDEyOCk7CisJCW52LT5wb3J0X2Rvd25fcmV0cnlfY291bnQgPSBfX2NvbnN0YW50X2NwdV90b19sZTE2KDMwKTsKKwkJbnYtPmxpbmtfZG93bl90aW1lb3V0ID0gX19jb25zdGFudF9jcHVfdG9fbGUxNigzMCk7CisJCW52LT5lbm9kZV9tYWNbMF0gPSAweDAxOworCQludi0+ZW5vZGVfbWFjWzFdID0gMHgwMjsKKwkJbnYtPmVub2RlX21hY1syXSA9IDB4MDM7CisJCW52LT5lbm9kZV9tYWNbM10gPSAweDA0OworCQludi0+ZW5vZGVfbWFjWzRdID0gMHgwNTsKKwkJbnYtPmVub2RlX21hY1s1XSA9IDB4MDYgKyBQQ0lfRlVOQyhoYS0+cGRldi0+ZGV2Zm4pOworCisJCXJ2YWwgPSAxOworCX0KKworCS8qIFJlc2V0IEluaXRpYWxpemF0aW9uIGNvbnRyb2wgYmxvY2sgKi8KKwltZW1zZXQoaWNiLCAwLCBzaXplb2Yoc3RydWN0IGluaXRfY2JfODF4eCkpOworCisJLyogQ29weSAxc3Qgc2VnbWVudC4gKi8KKwlkcHRyMSA9ICh1aW50OF90ICopaWNiOworCWRwdHIyID0gKHVpbnQ4X3QgKikmbnYtPnZlcnNpb247CisJY250ID0gKHVpbnQ4X3QgKikmaWNiLT5yZXNwb25zZV9xX2lucG9pbnRlciAtICh1aW50OF90ICopJmljYi0+dmVyc2lvbjsKKwl3aGlsZSAoY250LS0pCisJCSpkcHRyMSsrID0gKmRwdHIyKys7CisKKwlpY2ItPmxvZ2luX3JldHJ5X2NvdW50ID0gbnYtPmxvZ2luX3JldHJ5X2NvdW50OworCisJLyogQ29weSAybmQgc2VnbWVudC4gKi8KKwlkcHRyMSA9ICh1aW50OF90ICopJmljYi0+aW50ZXJydXB0X2RlbGF5X3RpbWVyOworCWRwdHIyID0gKHVpbnQ4X3QgKikmbnYtPmludGVycnVwdF9kZWxheV90aW1lcjsKKwljbnQgPSAodWludDhfdCAqKSZpY2ItPnJlc2VydmVkXzUgLQorCSAgICAodWludDhfdCAqKSZpY2ItPmludGVycnVwdF9kZWxheV90aW1lcjsKKwl3aGlsZSAoY250LS0pCisJCSpkcHRyMSsrID0gKmRwdHIyKys7CisKKwltZW1jcHkoaWNiLT5lbm9kZV9tYWMsIG52LT5lbm9kZV9tYWMsIHNpemVvZihpY2ItPmVub2RlX21hYykpOworCS8qIFNvbWUgYm9hcmRzICh3aXRoIHZhbGlkIE5WUkFNcykgc3RpbGwgaGF2ZSBOVUxMIGVub2RlX21hYyEhICovCisJaWYgKCFtZW1jbXAoaWNiLT5lbm9kZV9tYWMsICJcMFwwXDBcMFwwXDAiLCBzaXplb2YoaWNiLT5lbm9kZV9tYWMpKSkgeworCQlpY2ItPmVub2RlX21hY1swXSA9IDB4MDE7CisJCWljYi0+ZW5vZGVfbWFjWzFdID0gMHgwMjsKKwkJaWNiLT5lbm9kZV9tYWNbMl0gPSAweDAzOworCQlpY2ItPmVub2RlX21hY1szXSA9IDB4MDQ7CisJCWljYi0+ZW5vZGVfbWFjWzRdID0gMHgwNTsKKwkJaWNiLT5lbm9kZV9tYWNbNV0gPSAweDA2ICsgUENJX0ZVTkMoaGEtPnBkZXYtPmRldmZuKTsKKwl9CisKKwkvKgorCSAqIFNldHVwIGRyaXZlciBOVlJBTSBvcHRpb25zLgorCSAqLworCXFsYTJ4MDBfc2V0X21vZGVsX2luZm8odmhhLCBudi0+bW9kZWxfbmFtZSwgc2l6ZW9mKG52LT5tb2RlbF9uYW1lKSwKKwkgICAgIlFMRTgxWFgiKTsKKworCS8qIFVzZSBhbHRlcm5hdGUgV1dOPyAqLworCWlmIChudi0+aG9zdF9wICYgX19jb25zdGFudF9jcHVfdG9fbGUzMihCSVRfMTUpKSB7CisJCW1lbWNweShpY2ItPm5vZGVfbmFtZSwgbnYtPmFsdGVybmF0ZV9ub2RlX25hbWUsIFdXTl9TSVpFKTsKKwkJbWVtY3B5KGljYi0+cG9ydF9uYW1lLCBudi0+YWx0ZXJuYXRlX3BvcnRfbmFtZSwgV1dOX1NJWkUpOworCX0KKworCS8qIFByZXBhcmUgbm9kZW5hbWUgKi8KKwlpZiAoKGljYi0+ZmlybXdhcmVfb3B0aW9uc18xICYgX19jb25zdGFudF9jcHVfdG9fbGUzMihCSVRfMTQpKSA9PSAwKSB7CisJCS8qCisJCSAqIEZpcm13YXJlIHdpbGwgYXBwbHkgdGhlIGZvbGxvd2luZyBtYXNrIGlmIHRoZSBub2RlbmFtZSB3YXMKKwkJICogbm90IHByb3ZpZGVkLgorCQkgKi8KKwkJbWVtY3B5KGljYi0+bm9kZV9uYW1lLCBpY2ItPnBvcnRfbmFtZSwgV1dOX1NJWkUpOworCQlpY2ItPm5vZGVfbmFtZVswXSAmPSAweEYwOworCX0KKworCS8qIFNldCBob3N0IGFkYXB0ZXIgcGFyYW1ldGVycy4gKi8KKwloYS0+ZmxhZ3MuZGlzYWJsZV9yaXNjX2NvZGVfbG9hZCA9IDA7CisJaGEtPmZsYWdzLmVuYWJsZV9saXBfcmVzZXQgPSAwOworCWhhLT5mbGFncy5lbmFibGVfbGlwX2Z1bGxfbG9naW4gPQorCSAgICBsZTMyX3RvX2NwdShudi0+aG9zdF9wKSAmIEJJVF8xMCA/IDE6IDA7CisJaGEtPmZsYWdzLmVuYWJsZV90YXJnZXRfcmVzZXQgPQorCSAgICBsZTMyX3RvX2NwdShudi0+aG9zdF9wKSAmIEJJVF8xMSA/IDE6IDA7CisJaGEtPmZsYWdzLmVuYWJsZV9sZWRfc2NoZW1lID0gMDsKKwloYS0+ZmxhZ3MuZGlzYWJsZV9zZXJkZXMgPSBsZTMyX3RvX2NwdShudi0+aG9zdF9wKSAmIEJJVF81ID8gMTogMDsKKworCWhhLT5vcGVyYXRpbmdfbW9kZSA9IChsZTMyX3RvX2NwdShpY2ItPmZpcm13YXJlX29wdGlvbnNfMikgJgorCSAgICAoQklUXzYgfCBCSVRfNSB8IEJJVF80KSkgPj4gNDsKKworCS8qIHNhdmUgSEJBIHNlcmlhbCBudW1iZXIgKi8KKwloYS0+c2VyaWFsMCA9IGljYi0+cG9ydF9uYW1lWzVdOworCWhhLT5zZXJpYWwxID0gaWNiLT5wb3J0X25hbWVbNl07CisJaGEtPnNlcmlhbDIgPSBpY2ItPnBvcnRfbmFtZVs3XTsKKwltZW1jcHkodmhhLT5ub2RlX25hbWUsIGljYi0+bm9kZV9uYW1lLCBXV05fU0laRSk7CisJbWVtY3B5KHZoYS0+cG9ydF9uYW1lLCBpY2ItPnBvcnRfbmFtZSwgV1dOX1NJWkUpOworCisJaWNiLT5leGVjdXRpb25fdGhyb3R0bGUgPSBfX2NvbnN0YW50X2NwdV90b19sZTE2KDB4RkZGRik7CisKKwloYS0+cmV0cnlfY291bnQgPSBsZTE2X3RvX2NwdShudi0+bG9naW5fcmV0cnlfY291bnQpOworCisJLyogU2V0IG1pbmltdW0gbG9naW5fdGltZW91dCB0byA0IHNlY29uZHMuICovCisJaWYgKGxlMTZfdG9fY3B1KG52LT5sb2dpbl90aW1lb3V0KSA8IHFsMnhsb2dpbnRpbWVvdXQpCisJCW52LT5sb2dpbl90aW1lb3V0ID0gY3B1X3RvX2xlMTYocWwyeGxvZ2ludGltZW91dCk7CisJaWYgKGxlMTZfdG9fY3B1KG52LT5sb2dpbl90aW1lb3V0KSA8IDQpCisJCW52LT5sb2dpbl90aW1lb3V0ID0gX19jb25zdGFudF9jcHVfdG9fbGUxNig0KTsKKwloYS0+bG9naW5fdGltZW91dCA9IGxlMTZfdG9fY3B1KG52LT5sb2dpbl90aW1lb3V0KTsKKwlpY2ItPmxvZ2luX3RpbWVvdXQgPSBudi0+bG9naW5fdGltZW91dDsKKworCS8qIFNldCBtaW5pbXVtIFJBVE9WIHRvIDEwMCB0ZW50aHMgb2YgYSBzZWNvbmQuICovCisJaGEtPnJfYV90b3YgPSAxMDA7CisKKwloYS0+bG9vcF9yZXNldF9kZWxheSA9IG52LT5yZXNldF9kZWxheTsKKworCS8qIExpbmsgRG93biBUaW1lb3V0ID0gMDoKKwkgKgorCSAqIAlXaGVuIFBvcnQgRG93biB0aW1lciBleHBpcmVzIHdlIHdpbGwgc3RhcnQgcmV0dXJuaW5nCisJICoJSS9PJ3MgdG8gT1Mgd2l0aCAiRElEX05PX0NPTk5FQ1QiLgorCSAqCisJICogTGluayBEb3duIFRpbWVvdXQgIT0gMDoKKwkgKgorCSAqCSBUaGUgZHJpdmVyIHdhaXRzIGZvciB0aGUgbGluayB0byBjb21lIHVwIGFmdGVyIGxpbmsgZG93bgorCSAqCSBiZWZvcmUgcmV0dXJuaW5nIEkvT3MgdG8gT1Mgd2l0aCAiRElEX05PX0NPTk5FQ1QiLgorCSAqLworCWlmIChsZTE2X3RvX2NwdShudi0+bGlua19kb3duX3RpbWVvdXQpID09IDApIHsKKwkJaGEtPmxvb3BfZG93bl9hYm9ydF90aW1lID0KKwkJICAgIChMT09QX0RPV05fVElNRSAtIExPT1BfRE9XTl9USU1FT1VUKTsKKwl9IGVsc2UgeworCQloYS0+bGlua19kb3duX3RpbWVvdXQgPQlsZTE2X3RvX2NwdShudi0+bGlua19kb3duX3RpbWVvdXQpOworCQloYS0+bG9vcF9kb3duX2Fib3J0X3RpbWUgPQorCQkgICAgKExPT1BfRE9XTl9USU1FIC0gaGEtPmxpbmtfZG93bl90aW1lb3V0KTsKKwl9CisKKwkvKiBOZWVkIGVub3VnaCB0aW1lIHRvIHRyeSBhbmQgZ2V0IHRoZSBwb3J0IGJhY2suICovCisJaGEtPnBvcnRfZG93bl9yZXRyeV9jb3VudCA9IGxlMTZfdG9fY3B1KG52LT5wb3J0X2Rvd25fcmV0cnlfY291bnQpOworCWlmIChxbHBvcnRfZG93bl9yZXRyeSkKKwkJaGEtPnBvcnRfZG93bl9yZXRyeV9jb3VudCA9IHFscG9ydF9kb3duX3JldHJ5OworCisJLyogU2V0IGxvZ2luX3JldHJ5X2NvdW50ICovCisJaGEtPmxvZ2luX3JldHJ5X2NvdW50ICA9IGxlMTZfdG9fY3B1KG52LT5sb2dpbl9yZXRyeV9jb3VudCk7CisJaWYgKGhhLT5wb3J0X2Rvd25fcmV0cnlfY291bnQgPT0KKwkgICAgbGUxNl90b19jcHUobnYtPnBvcnRfZG93bl9yZXRyeV9jb3VudCkgJiYKKwkgICAgaGEtPnBvcnRfZG93bl9yZXRyeV9jb3VudCA+IDMpCisJCWhhLT5sb2dpbl9yZXRyeV9jb3VudCA9IGhhLT5wb3J0X2Rvd25fcmV0cnlfY291bnQ7CisJZWxzZSBpZiAoaGEtPnBvcnRfZG93bl9yZXRyeV9jb3VudCA+IChpbnQpaGEtPmxvZ2luX3JldHJ5X2NvdW50KQorCQloYS0+bG9naW5fcmV0cnlfY291bnQgPSBoYS0+cG9ydF9kb3duX3JldHJ5X2NvdW50OworCWlmIChxbDJ4bG9naW5yZXRyeWNvdW50KQorCQloYS0+bG9naW5fcmV0cnlfY291bnQgPSBxbDJ4bG9naW5yZXRyeWNvdW50OworCisJLyogRW5hYmxlIFpJTy4gKi8KKwlpZiAoIXZoYS0+ZmxhZ3MuaW5pdF9kb25lKSB7CisJCWhhLT56aW9fbW9kZSA9IGxlMzJfdG9fY3B1KGljYi0+ZmlybXdhcmVfb3B0aW9uc18yKSAmCisJCSAgICAoQklUXzMgfCBCSVRfMiB8IEJJVF8xIHwgQklUXzApOworCQloYS0+emlvX3RpbWVyID0gbGUxNl90b19jcHUoaWNiLT5pbnRlcnJ1cHRfZGVsYXlfdGltZXIpID8KKwkJICAgIGxlMTZfdG9fY3B1KGljYi0+aW50ZXJydXB0X2RlbGF5X3RpbWVyKTogMjsKKwl9CisJaWNiLT5maXJtd2FyZV9vcHRpb25zXzIgJj0gX19jb25zdGFudF9jcHVfdG9fbGUzMigKKwkgICAgfihCSVRfMyB8IEJJVF8yIHwgQklUXzEgfCBCSVRfMCkpOworCXZoYS0+ZmxhZ3MucHJvY2Vzc19yZXNwb25zZV9xdWV1ZSA9IDA7CisJaWYgKGhhLT56aW9fbW9kZSAhPSBRTEFfWklPX0RJU0FCTEVEKSB7CisJCWhhLT56aW9fbW9kZSA9IFFMQV9aSU9fTU9ERV82OworCisJCURFQlVHMihwcmludGsoInNjc2koJWxkKTogWklPIG1vZGUgJWQgZW5hYmxlZDsgdGltZXIgZGVsYXkgIgorCQkgICAgIiglZCB1cykuXG4iLCB2aGEtPmhvc3Rfbm8sIGhhLT56aW9fbW9kZSwKKwkJICAgIGhhLT56aW9fdGltZXIgKiAxMDApKTsKKwkJcWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLAorCQkgICAgIlpJTyBtb2RlICVkIGVuYWJsZWQ7IHRpbWVyIGRlbGF5ICglZCB1cykuXG4iLAorCQkgICAgaGEtPnppb19tb2RlLCBoYS0+emlvX3RpbWVyICogMTAwKTsKKworCQlpY2ItPmZpcm13YXJlX29wdGlvbnNfMiB8PSBjcHVfdG9fbGUzMigKKwkJICAgICh1aW50MzJfdCloYS0+emlvX21vZGUpOworCQlpY2ItPmludGVycnVwdF9kZWxheV90aW1lciA9IGNwdV90b19sZTE2KGhhLT56aW9fdGltZXIpOworCQl2aGEtPmZsYWdzLnByb2Nlc3NfcmVzcG9uc2VfcXVldWUgPSAxOworCX0KKworCWlmIChydmFsKSB7CisJCURFQlVHMl8zKHByaW50ayhLRVJOX1dBUk5JTkcKKwkJICAgICJzY3NpKCVsZCk6IE5WUkFNIGNvbmZpZ3VyYXRpb24gZmFpbGVkIVxuIiwgdmhhLT5ob3N0X25vKSk7CisJfQorCXJldHVybiAocnZhbCk7Cit9CisKK3ZvaWQKK3FsYTgxeHhfdXBkYXRlX2Z3X29wdGlvbnMoc2NzaV9xbGFfaG9zdF90ICpoYSkKK3sKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9pb2NiLmMgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfaW9jYi5jCmluZGV4IDViZWRjOWQuLjIyNTgxNTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9pb2NiLmMKKysrIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2lvY2IuYwpAQCAtMTczLDcgKzE3Myw3IEBACiAJCXJldHVybjsKIAl9CiAKLQl2aGEgPSBzcC0+dmhhOworCXZoYSA9IHNwLT5mY3BvcnQtPnZoYTsKIAlyZXEgPSBzcC0+cXVlOwogCiAJY21kX3BrdC0+Y29udHJvbF9mbGFncyB8PSBjcHVfdG9fbGUxNihxbGEyeDAwX2dldF9jbWRfZGlyZWN0aW9uKHNwKSk7CkBAIC0yMzQsNyArMjM0LDcgQEAKIAkJcmV0dXJuOwogCX0KIAotCXZoYSA9IHNwLT52aGE7CisJdmhhID0gc3AtPmZjcG9ydC0+dmhhOwogCXJlcSA9IHNwLT5xdWU7CiAKIAljbWRfcGt0LT5jb250cm9sX2ZsYWdzIHw9IGNwdV90b19sZTE2KHFsYTJ4MDBfZ2V0X2NtZF9kaXJlY3Rpb24oc3ApKTsKQEAgLTI5NCw3ICsyOTQsNyBAQAogCiAJLyogU2V0dXAgZGV2aWNlIHBvaW50ZXJzLiAqLwogCXJldCA9IDA7Ci0JdmhhID0gc3AtPnZoYTsKKwl2aGEgPSBzcC0+ZmNwb3J0LT52aGE7CiAJaGEgPSB2aGEtPmh3OwogCXJlZyA9ICZoYS0+aW9iYXNlLT5pc3A7CiAJY21kID0gc3AtPmNtZDsKQEAgLTM1Myw3ICszNTMsNiBAQAogCS8qIEJ1aWxkIGNvbW1hbmQgcGFja2V0ICovCiAJcmVxLT5jdXJyZW50X291dHN0YW5kaW5nX2NtZCA9IGhhbmRsZTsKIAlyZXEtPm91dHN0YW5kaW5nX2NtZHNbaGFuZGxlXSA9IHNwOwotCXNwLT52aGEgPSB2aGE7CiAJc3AtPnF1ZSA9IHJlcTsKIAlzcC0+Y21kLT5ob3N0X3NjcmliYmxlID0gKHVuc2lnbmVkIGNoYXIgKikodW5zaWduZWQgbG9uZyloYW5kbGU7CiAJcmVxLT5jbnQgLT0gcmVxX2NudDsKQEAgLTY1Niw3ICs2NTUsNyBAQAogCQlyZXR1cm47CiAJfQogCi0JdmhhID0gc3AtPnZoYTsKKwl2aGEgPSBzcC0+ZmNwb3J0LT52aGE7CiAJcmVxID0gc3AtPnF1ZTsKIAogCS8qIFNldCB0cmFuc2ZlciBkaXJlY3Rpb24gKi8KQEAgLTcyMyw3ICs3MjIsNyBAQAogCXN0cnVjdCByZXFfcXVlICpyZXEgPSBOVUxMOwogCXN0cnVjdCByc3BfcXVlICpyc3AgPSBOVUxMOwogCXN0cnVjdCBzY3NpX2NtbmQgKmNtZCA9IHNwLT5jbWQ7Ci0Jc3RydWN0IHNjc2lfcWxhX2hvc3QgKnZoYSA9IHNwLT52aGE7CisJc3RydWN0IHNjc2lfcWxhX2hvc3QgKnZoYSA9IHNwLT5mY3BvcnQtPnZoYTsKIAlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKIAl1aW50MTZfdCBxdWVfaWQ7CiAKQEAgLTc5MSw3ICs3OTAsNiBAQAogCS8qIEJ1aWxkIGNvbW1hbmQgcGFja2V0LiAqLwogCXJlcS0+Y3VycmVudF9vdXRzdGFuZGluZ19jbWQgPSBoYW5kbGU7CiAJcmVxLT5vdXRzdGFuZGluZ19jbWRzW2hhbmRsZV0gPSBzcDsKLQlzcC0+dmhhID0gdmhhOwogCXNwLT5jbWQtPmhvc3Rfc2NyaWJibGUgPSAodW5zaWduZWQgY2hhciAqKSh1bnNpZ25lZCBsb25nKWhhbmRsZTsKIAlyZXEtPmNudCAtPSByZXFfY250OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfaXNyLmMgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfaXNyLmMKaW5kZXggZDVmYjc5YS4uNzg5ZmM1NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2lzci5jCisrKyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9pc3IuYwpAQCAtMjc1LDcgKzI3NSw3IEBACiBxbGEyeDAwX2FzeW5jX2V2ZW50KHNjc2lfcWxhX2hvc3RfdCAqdmhhLCBzdHJ1Y3QgcnNwX3F1ZSAqcnNwLCB1aW50MTZfdCAqbWIpCiB7CiAjZGVmaW5lIExTX1VOS05PV04JMgotCXN0YXRpYyBjaGFyCSpsaW5rX3NwZWVkc1s1XSA9IHsgIjEiLCAiMiIsICI/IiwgIjQiLCAiOCIgfTsKKwlzdGF0aWMgY2hhcgkqbGlua19zcGVlZHNbXSA9IHsgIjEiLCAiMiIsICI/IiwgIjQiLCAiOCIsICIxMCIgfTsKIAljaGFyCQkqbGlua19zcGVlZDsKIAl1aW50MTZfdAloYW5kbGVfY250OwogCXVpbnQxNl90CWNudDsKQEAgLTI4OCw2ICsyODgsOCBAQAogCiAJLyogU2V0dXAgdG8gcHJvY2VzcyBSSU8gY29tcGxldGlvbi4gKi8KIAloYW5kbGVfY250ID0gMDsKKwlpZiAoSVNfUUxBODFYWChoYSkpCisJCWdvdG8gc2tpcF9yaW87CiAJc3dpdGNoIChtYlswXSkgewogCWNhc2UgTUJBX1NDU0lfQ09NUExFVElPTjoKIAkJaGFuZGxlc1swXSA9IGxlMzJfdG9fY3B1KCh1aW50MzJfdCkoKG1iWzJdIDw8IDE2KSB8IG1iWzFdKSk7CkBAIC0zMzksNyArMzQxLDcgQEAKIAlkZWZhdWx0OgogCQlicmVhazsKIAl9Ci0KK3NraXBfcmlvOgogCXN3aXRjaCAobWJbMF0pIHsKIAljYXNlIE1CQV9TQ1NJX0NPTVBMRVRJT046CS8qIEZhc3QgUG9zdCAqLwogCQlpZiAoIXZoYS0+ZmxhZ3Mub25saW5lKQpAQCAtMzYyLDcgKzM2NCw2IEBACiAJCSAgICAiSVNQIFN5c3RlbSBFcnJvciAtIG1ieDE9JXhoIG1ieDI9JXhoIG1ieDM9JXhoLlxuIiwKIAkJICAgIG1iWzFdLCBtYlsyXSwgbWJbM10pOwogCi0JCXFsYTJ4MDBfcG9zdF9od2Vfd29yayh2aGEsIG1iWzBdLCBtYlsxXSwgbWJbMl0sIG1iWzNdKTsKIAkJaGEtPmlzcF9vcHMtPmZ3X2R1bXAodmhhLCAxKTsKIAogCQlpZiAoSVNfRldJMl9DQVBBQkxFKGhhKSkgewpAQCAtMzg3LDcgKzM4OCw2IEBACiAJCSAgICB2aGEtPmhvc3Rfbm8pKTsKIAkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLCAiSVNQIFJlcXVlc3QgVHJhbnNmZXIgRXJyb3IuXG4iKTsKIAotCQlxbGEyeDAwX3Bvc3RfaHdlX3dvcmsodmhhLCBtYlswXSwgbWJbMV0sIG1iWzJdLCBtYlszXSk7CiAJCXNldF9iaXQoSVNQX0FCT1JUX05FRURFRCwgJnZoYS0+ZHBjX2ZsYWdzKTsKIAkJYnJlYWs7CiAKQEAgLTM5Niw3ICszOTYsNiBAQAogCQkgICAgdmhhLT5ob3N0X25vKSk7CiAJCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwgIklTUCBSZXNwb25zZSBUcmFuc2ZlciBFcnJvci5cbiIpOwogCi0JCXFsYTJ4MDBfcG9zdF9od2Vfd29yayh2aGEsIG1iWzBdLCBtYlsxXSwgbWJbMl0sIG1iWzNdKTsKIAkJc2V0X2JpdChJU1BfQUJPUlRfTkVFREVELCAmdmhhLT5kcGNfZmxhZ3MpOwogCQlicmVhazsKIApAQCAtNDM2LDYgKzQzNSw4IEBACiAJCQlsaW5rX3NwZWVkID0gbGlua19zcGVlZHNbTFNfVU5LTk9XTl07CiAJCQlpZiAobWJbMV0gPCA1KQogCQkJCWxpbmtfc3BlZWQgPSBsaW5rX3NwZWVkc1ttYlsxXV07CisJCQllbHNlIGlmIChtYlsxXSA9PSAweDEzKQorCQkJCWxpbmtfc3BlZWQgPSBsaW5rX3NwZWVkc1s1XTsKIAkJCWhhLT5saW5rX2RhdGFfcmF0ZSA9IG1iWzFdOwogCQl9CiAKQEAgLTQ5NSwxMiArNDk2LDE3IEBACiAJCXFsYTJ4MDBfcG9zdF9hZW5fd29yayh2aGEsIEZDSF9FVlRfTElQUkVTRVQsIG1iWzFdKTsKIAkJYnJlYWs7CiAKKwkvKiBjYXNlIE1CQV9EQ0JYX0NPTVBMRVRFOiAqLwogCWNhc2UgTUJBX1BPSU5UX1RPX1BPSU5UOgkvKiBQb2ludC10by1Qb2ludCAqLwogCQlpZiAoSVNfUUxBMjEwMChoYSkpCiAJCQlicmVhazsKIAotCQlERUJVRzIocHJpbnRrKCJzY3NpKCVsZCk6IEFzeW5jaHJvbm91cyBQMlAgTU9ERSByZWNlaXZlZC5cbiIsCi0JCSAgICB2aGEtPmhvc3Rfbm8pKTsKKwkJaWYgKElTX1FMQTgxWFgoaGEpKQorCQkJREVCVUcyKHByaW50aygic2NzaSglbGQpOiBEQ0JYIENvbXBsZXRlZCAtLSAlMDR4ICUwNHggIgorCQkJICAgICIlMDR4XG4iLCB2aGEtPmhvc3Rfbm8sIG1iWzFdLCBtYlsyXSwgbWJbM10pKTsKKwkJZWxzZQorCQkJREVCVUcyKHByaW50aygic2NzaSglbGQpOiBBc3luY2hyb25vdXMgUDJQIE1PREUgIgorCQkJICAgICJyZWNlaXZlZC5cbiIsIHZoYS0+aG9zdF9ubykpOwogCiAJCS8qCiAJCSAqIFVudGlsIHRoZXJlJ3MgYSB0cmFuc2l0aW9uIGZyb20gbG9vcCBkb3duIHRvIGxvb3AgdXAsIHRyZWF0CkBAIC02NDEsMTAgKzY0Nyw3IEBACiAKIAkvKiBjYXNlIE1CQV9SSU9fUkVTUE9OU0U6ICovCiAJY2FzZSBNQkFfWklPX1JFU1BPTlNFOgotCQlERUJVRzIocHJpbnRrKCJzY3NpKCVsZCk6IFtSfFpdSU8gdXBkYXRlIGNvbXBsZXRpb24uXG4iLAotCQkgICAgdmhhLT5ob3N0X25vKSk7Ci0JCURFQlVHKHByaW50ayhLRVJOX0lORk8KLQkJICAgICJzY3NpKCVsZCk6IFtSfFpdSU8gdXBkYXRlIGNvbXBsZXRpb24uXG4iLAorCQlERUJVRzMocHJpbnRrKCJzY3NpKCVsZCk6IFtSfFpdSU8gdXBkYXRlIGNvbXBsZXRpb24uXG4iLAogCQkgICAgdmhhLT5ob3N0X25vKSk7CiAKIAkJaWYgKElTX0ZXSTJfQ0FQQUJMRShoYSkpCkBAIC02OTgsNiArNzAxLDM1IEBACiAJCX0KIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGEtPmNzODR4eC0+YWNjZXNzX2xvY2ssIGZsYWdzKTsKIAkJYnJlYWs7CisJY2FzZSBNQkFfRENCWF9TVEFSVDoKKwkJREVCVUcyKHByaW50aygic2NzaSglbGQpOiBEQ0JYIFN0YXJ0ZWQgLS0gJTA0eCAlMDR4ICUwNHhcbiIsCisJCSAgICB2aGEtPmhvc3Rfbm8sIG1iWzFdLCBtYlsyXSwgbWJbM10pKTsKKwkJYnJlYWs7CisJY2FzZSBNQkFfRENCWF9QQVJBTV9VUERBVEU6CisJCURFQlVHMihwcmludGsoInNjc2koJWxkKTogRENCWCBQYXJhbWV0ZXJzIFVwZGF0ZWQgLS0gIgorCQkgICAgIiUwNHggJTA0eCAlMDR4XG4iLCB2aGEtPmhvc3Rfbm8sIG1iWzFdLCBtYlsyXSwgbWJbM10pKTsKKwkJYnJlYWs7CisJY2FzZSBNQkFfRkNGX0NPTkZfRVJSOgorCQlERUJVRzIocHJpbnRrKCJzY3NpKCVsZCk6IEZDRiBDb25maWd1cmF0aW9uIEVycm9yIC0tICIKKwkJICAgICIlMDR4ICUwNHggJTA0eFxuIiwgdmhhLT5ob3N0X25vLCBtYlsxXSwgbWJbMl0sIG1iWzNdKSk7CisJCWJyZWFrOworCWNhc2UgTUJBX0lEQ19DT01QTEVURToKKwkJREVCVUcyKHByaW50aygic2NzaSglbGQpOiBJbnRlci1Ecml2ZXIgQ29tbXVjYXRpb24gIgorCQkgICAgIkNvbXBsZXRlIC0tICUwNHggJTA0eCAlMDR4XG4iLCB2aGEtPmhvc3Rfbm8sIG1iWzFdLCBtYlsyXSwKKwkJICAgIG1iWzNdKSk7CisJCWJyZWFrOworCWNhc2UgTUJBX0lEQ19OT1RJRlk6CisJCURFQlVHMihwcmludGsoInNjc2koJWxkKTogSW50ZXItRHJpdmVyIENvbW11Y2F0aW9uICIKKwkJICAgICJSZXF1ZXN0IE5vdGlmaWNhdGlvbiAtLSAlMDR4ICUwNHggJTA0eFxuIiwgdmhhLT5ob3N0X25vLAorCQkgICAgbWJbMV0sIG1iWzJdLCBtYlszXSkpOworCQkvKioqKiBNYWlsYm94IHJlZ2lzdGVycyA0IC0gNyB2YWxpZCEhISAqLworCQlicmVhazsKKwljYXNlIE1CQV9JRENfVElNRV9FWFQ6CisJCURFQlVHMihwcmludGsoInNjc2koJWxkKTogSW50ZXItRHJpdmVyIENvbW11Y2F0aW9uICIKKwkJICAgICJUaW1lIEV4dGVuc2lvbiAtLSAlMDR4ICUwNHggJTA0eFxuIiwgdmhhLT5ob3N0X25vLCBtYlsxXSwKKwkJICAgIG1iWzJdLCBtYlszXSkpOworCQkvKioqKiBNYWlsYm94IHJlZ2lzdGVycyA0IC0gNyB2YWxpZCEhISAqLworCQlicmVhazsKIAl9CiAKIAlpZiAoIXZoYS0+dnBfaWR4ICYmIGhhLT5udW1fdmhvc3RzKQpAQCAtMTUxMCw3ICsxNTQyLDcgQEAKIAlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKIAlzdHJ1Y3QgZGV2aWNlX3JlZ18yNHh4IF9faW9tZW0gKnJlZyA9ICZoYS0+aW9iYXNlLT5pc3AyNDsKIAotCWlmICghSVNfUUxBMjVYWChoYSkpCisJaWYgKCFJU19RTEEyNVhYKGhhKSAmJiAhSVNfUUxBODFYWChoYSkpCiAJCXJldHVybjsKIAogCXJ2YWwgPSBRTEFfU1VDQ0VTUzsKQEAgLTE1OTAsMTIgKzE2MjIsNiBAQAogCQkJaWYgKHBjaV9jaGFubmVsX29mZmxpbmUoaGEtPnBkZXYpKQogCQkJCWJyZWFrOwogCi0JCQlpZiAoaGEtPmh3X2V2ZW50X3BhdXNlX2Vycm9ycyA9PSAwKQotCQkJCXFsYTJ4MDBfcG9zdF9od2Vfd29yayh2aGEsIEhXX0VWRU5UX1BBUklUWV9FUlIsCi0JCQkJICAgIDAsIE1TVyhzdGF0KSwgTFNXKHN0YXQpKTsKLQkJCWVsc2UgaWYgKGhhLT5od19ldmVudF9wYXVzZV9lcnJvcnMgPCAweGZmZmZmZmZmKQotCQkJCWhhLT5od19ldmVudF9wYXVzZV9lcnJvcnMrKzsKLQogCQkJaGNjciA9IFJEX1JFR19EV09SRCgmcmVnLT5oY2NyKTsKIAogCQkJcWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLCAiUklTQyBwYXVzZWQgLS0gSENDUj0leCwgIgpAQCAtMTc0MCwxMiArMTc2Niw2IEBACiAJCQlpZiAocGNpX2NoYW5uZWxfb2ZmbGluZShoYS0+cGRldikpCiAJCQkJYnJlYWs7CiAKLQkJCWlmIChoYS0+aHdfZXZlbnRfcGF1c2VfZXJyb3JzID09IDApCi0JCQkJcWxhMngwMF9wb3N0X2h3ZV93b3JrKHZoYSwgSFdfRVZFTlRfUEFSSVRZX0VSUiwKLQkJCQkgICAgMCwgTVNXKHN0YXQpLCBMU1coc3RhdCkpOwotCQkJZWxzZSBpZiAoaGEtPmh3X2V2ZW50X3BhdXNlX2Vycm9ycyA8IDB4ZmZmZmZmZmYpCi0JCQkJaGEtPmh3X2V2ZW50X3BhdXNlX2Vycm9ycysrOwotCiAJCQloY2NyID0gUkRfUkVHX0RXT1JEKCZyZWctPmhjY3IpOwogCiAJCQlxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsICJSSVNDIHBhdXNlZCAtLSBIQ0NSPSV4LCAiCkBAIC0xOTQ0LDcgKzE5NjQsOCBAQAogCWRldmljZV9yZWdfdCBfX2lvbWVtICpyZWcgPSBoYS0+aW9iYXNlOwogCiAJLyogSWYgcG9zc2libGUsIGVuYWJsZSBNU0ktWC4gKi8KLQlpZiAoIUlTX1FMQTI0MzIoaGEpICYmICFJU19RTEEyNTMyKGhhKSAmJiAhSVNfUUxBODQzMihoYSkpCisJaWYgKCFJU19RTEEyNDMyKGhhKSAmJiAhSVNfUUxBMjUzMihoYSkgJiYKKwkgICAgIUlTX1FMQTg0MzIoaGEpICYmICFJU19RTEE4MDAxKGhhKSkKIAkJZ290byBza2lwX21zaXg7CiAKIAlpZiAoSVNfUUxBMjQzMihoYSkgJiYgKGhhLT5wZGV2LT5yZXZpc2lvbiA8IFFMQV9NU0lYX0NISVBfUkVWXzI0WFggfHwKQEAgLTE5NzksNyArMjAwMCw4IEBACiAJICAgICJNU0ktWDogRmFsbGluZyBiYWNrLXRvIElOVGEgbW9kZSAtLSAlZC5cbiIsIHJldCk7CiBza2lwX21zaXg6CiAKLQlpZiAoIUlTX1FMQTI0WFgoaGEpICYmICFJU19RTEEyNTMyKGhhKSAmJiAhSVNfUUxBODQzMihoYSkpCisJaWYgKCFJU19RTEEyNFhYKGhhKSAmJiAhSVNfUUxBMjUzMihoYSkgJiYgIUlTX1FMQTg0MzIoaGEpICYmCisJICAgICFJU19RTEE4MDAxKGhhKSkKIAkJZ290byBza2lwX21zaTsKIAogCXJldCA9IHBjaV9lbmFibGVfbXNpKGhhLT5wZGV2KTsKQEAgLTIwMDAsNiArMjAyMiwxMiBAQAogCWhhLT5mbGFncy5pbnRhX2VuYWJsZWQgPSAxOwogY2xlYXJfcmlzY19pbnRzOgogCisJLyoKKwkgKiBGSVhNRTogTm90ZWQgdGhhdCA4MDE0cyB3ZXJlIGJlaW5nIGRyb3BwZWQgZHVyaW5nIE5LIHRlc3RpbmcuCisJICogVGltaW5nIGRlbHRhcyBkdXJpbmcgTVNJLVgvSU5UYSB0cmFuc2l0aW9ucz8KKwkgKi8KKwlpZiAoSVNfUUxBODFYWChoYSkpCisJCWdvdG8gZmFpbDsKIAlzcGluX2xvY2tfaXJxKCZoYS0+aGFyZHdhcmVfbG9jayk7CiAJaWYgKElTX0ZXSTJfQ0FQQUJMRShoYSkpIHsKIAkJV1JUX1JFR19EV09SRCgmcmVnLT5pc3AyNC5oY2NyLCBIQ0NSWF9DTFJfSE9TVF9JTlQpOwpAQCAtMjA0NCw3ICsyMDcyLDcgQEAKIAkJaWYgKHBrdCAmJiBwa3QtPmhhbmRsZSA8IE1BWF9PVVRTVEFORElOR19DT01NQU5EUykgewogCQkJc3AgPSByZXEtPm91dHN0YW5kaW5nX2NtZHNbcGt0LT5oYW5kbGVdOwogCQkJaWYgKHNwKQotCQkJCXZoYSA9IHNwLT52aGE7CisJCQkJdmhhID0gc3AtPmZjcG9ydC0+dmhhOwogCQl9CiAJfQogCWlmICghdmhhKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX21ieC5jIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX21ieC5jCmluZGV4IGE5OTk3NmYuLmRiNGRmNDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9tYnguYworKysgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfbWJ4LmMKQEAgLTEyMyw4ICsxMjMsNyBAQAogCiAJLyogV2FpdCBmb3IgbWJ4IGNtZCBjb21wbGV0aW9uIHVudGlsIHRpbWVvdXQgKi8KIAotCWlmICghYWJvcnRfYWN0aXZlICYmIGlvX2xvY2tfb24pIHsKLQorCWlmICgoIWFib3J0X2FjdGl2ZSAmJiBpb19sb2NrX29uKSB8fCBJU19OT1BPTExJTkdfVFlQRShoYSkpIHsKIAkJc2V0X2JpdChNQlhfSU5UUl9XQUlULCAmaGEtPm1ieF9jbWRfZmxhZ3MpOwogCiAJCWlmIChJU19GV0kyX0NBUEFCTEUoaGEpKQpAQCAtMjE4LDcgKzIxNyw3IEBACiAJLyogQ2xlYW4gdXAgKi8KIAloYS0+bWNwID0gTlVMTDsKIAotCWlmIChhYm9ydF9hY3RpdmUgfHwgIWlvX2xvY2tfb24pIHsKKwlpZiAoKGFib3J0X2FjdGl2ZSB8fCAhaW9fbG9ja19vbikgJiYgIUlTX05PUE9MTElOR19UWVBFKGhhKSkgewogCQlERUJVRzExKHByaW50aygiJXMoJWxkKTogY2hlY2tpbmcgZm9yIGFkZGl0aW9uYWwgcmVzcCAiCiAJCSAgICAiaW50ZXJydXB0LlxuIiwgX19mdW5jX18sIGJhc2VfdmhhLT5ob3N0X25vKSk7CiAKQEAgLTQxMiw3ICs0MTEsOCBAQAogICovCiB2b2lkCiBxbGEyeDAwX2dldF9md192ZXJzaW9uKHNjc2lfcWxhX2hvc3RfdCAqdmhhLCB1aW50MTZfdCAqbWFqb3IsIHVpbnQxNl90ICptaW5vciwKLSAgICB1aW50MTZfdCAqc3VibWlub3IsIHVpbnQxNl90ICphdHRyaWJ1dGVzLCB1aW50MzJfdCAqbWVtb3J5KQorICAgIHVpbnQxNl90ICpzdWJtaW5vciwgdWludDE2X3QgKmF0dHJpYnV0ZXMsIHVpbnQzMl90ICptZW1vcnksIHVpbnQ4X3QgKm1waSwKKyAgICB1aW50MzJfdCAqbXBpX2NhcHMpCiB7CiAJaW50CQlydmFsOwogCW1ieF9jbWRfdAltYzsKQEAgLTQyMyw2ICs0MjMsOCBAQAogCW1jcC0+bWJbMF0gPSBNQkNfR0VUX0ZJUk1XQVJFX1ZFUlNJT047CiAJbWNwLT5vdXRfbWIgPSBNQlhfMDsKIAltY3AtPmluX21iID0gTUJYXzZ8TUJYXzV8TUJYXzR8TUJYXzN8TUJYXzJ8TUJYXzF8TUJYXzA7CisJaWYgKElTX1FMQTgxWFgodmhhLT5odykpCisJCW1jcC0+aW5fbWIgfD0gTUJYXzEzfE1CWF8xMnxNQlhfMTF8TUJYXzEwOwogCW1jcC0+ZmxhZ3MgPSAwOwogCW1jcC0+dG92ID0gTUJYX1RPVl9TRUNPTkRTOwogCXJ2YWwgPSBxbGEyeDAwX21haWxib3hfY29tbWFuZCh2aGEsIG1jcCk7CkBAIC00MzYsNiArNDM4LDEzIEBACiAJCSptZW1vcnkgPSAweDFGRkZGOwkJCS8qIERlZmF1bHRzIHRvIDEyOEtCLiAqLwogCWVsc2UKIAkJKm1lbW9yeSA9IChtY3AtPm1iWzVdIDw8IDE2KSB8IG1jcC0+bWJbNF07CisJaWYgKElTX1FMQTgxWFgodmhhLT5odykpIHsKKwkJbXBpWzBdID0gbWNwLT5tYlsxMF0gPj4gODsKKwkJbXBpWzFdID0gbWNwLT5tYlsxMF0gJiAweGZmOworCQltcGlbMl0gPSBtY3AtPm1iWzExXSA+PiA4OworCQltcGlbM10gPSBtY3AtPm1iWzExXSAmIDB4ZmY7CisJCSptcGlfY2FwcyA9IChtY3AtPm1iWzEyXSA8PCAxNikgfCBtY3AtPm1iWzEzXTsKKwl9CiAKIAlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgewogCQkvKkVNUFRZKi8KQEAgLTU2OCw3ICs1NzcsNiBAQAogcWxhMngwMF9tYnhfcmVnX3Rlc3Qoc2NzaV9xbGFfaG9zdF90ICp2aGEpCiB7CiAJaW50IHJ2YWw7Ci0Jc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CiAJbWJ4X2NtZF90IG1jOwogCW1ieF9jbWRfdCAqbWNwID0gJm1jOwogCkBAIC01OTUsMTQgKzYwMyw2IEBACiAJCWlmIChtY3AtPm1iWzVdICE9IDB4QTVBNSB8fCBtY3AtPm1iWzZdICE9IDB4NUE1QSB8fAogCQkgICAgbWNwLT5tYls3XSAhPSAweDI1MjUpCiAJCQlydmFsID0gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKLQkJaWYgKHJ2YWwgPT0gUUxBX0ZVTkNUSU9OX0ZBSUxFRCkgewotCQkJc3RydWN0IGRldmljZV9yZWdfMjR4eCBfX2lvbWVtICpyZWcgPQotCQkJICAgICZoYS0+aW9iYXNlLT5pc3AyNDsKLQotCQkJcWxhMnh4eF9od19ldmVudF9sb2codmhhLCBIV19FVkVOVF9JU1BfRVJSLCAwLAotCQkJICAgIExTVyhSRF9SRUdfRFdPUkQoJnJlZy0+aGNjcikpLAotCQkJICAgIExTVyhSRF9SRUdfRFdPUkQoJnJlZy0+aXN0YXR1cykpKTsKLQkJfQogCX0KIAogCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7CkBAIC0xMzYzLDcgKzEzNjMsMTMgQEAKIAogCURFQlVHMTEocHJpbnRrKCIlcyglbGQpOiBlbnRlcmVkLlxuIiwgX19mdW5jX18sIHZoYS0+aG9zdF9ubykpOwogCi0JaWYgKElTX0ZXSTJfQ0FQQUJMRSh2aGEtPmh3KSkgeworCWlmIChJU19RTEE4MVhYKHZoYS0+aHcpKSB7CisJCS8qIExvZ291dCBhY3Jvc3MgYWxsIEZDRnMuICovCisJCW1jcC0+bWJbMF0gPSBNQkNfTElQX0ZVTExfTE9HSU47CisJCW1jcC0+bWJbMV0gPSBCSVRfMTsKKwkJbWNwLT5tYlsyXSA9IDA7CisJCW1jcC0+b3V0X21iID0gTUJYXzJ8TUJYXzF8TUJYXzA7CisJfSBlbHNlIGlmIChJU19GV0kyX0NBUEFCTEUodmhhLT5odykpIHsKIAkJbWNwLT5tYlswXSA9IE1CQ19MSVBfRlVMTF9MT0dJTjsKIAkJbWNwLT5tYlsxXSA9IEJJVF82OwogCQltY3AtPm1iWzJdID0gMDsKQEAgLTE4NTMsNiArMTg1OSw5IEBACiAJbWJ4X2NtZF90IG1jOwogCW1ieF9jbWRfdCAqbWNwID0gJm1jOwogCisJaWYgKElTX1FMQTgxWFgodmhhLT5odykpCisJICAgIHJldHVybiBRTEFfU1VDQ0VTUzsKKwogCURFQlVHMTEocHJpbnRrKCJxbGEyeDAwX2Z1bGxfbG9naW5fbGlwKCVsZCk6IGVudGVyZWQuXG4iLAogCSAgICB2aGEtPmhvc3Rfbm8pKTsKIApAQCAtMjUxMiw3ICsyNTIxLDcgQEAKIAltYnhfY21kX3QgbWM7CiAJbWJ4X2NtZF90ICptY3AgPSAmbWM7CiAKLQlpZiAoIUlTX1FMQTI1WFgodmhhLT5odykpCisJaWYgKCFJU19RTEEyNVhYKHZoYS0+aHcpICYmICFJU19RTEE4MVhYKHZoYS0+aHcpKQogCQlyZXR1cm4gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKIAogCURFQlVHMTEocHJpbnRrKCIlcyglbGQpOiBlbnRlcmVkLlxuIiwgX19mdW5jX18sIHZoYS0+aG9zdF9ubykpOwpAQCAtMzE1NSw3ICszMTY0LDcgQEAKIAltY3AtPm1iWzddID0gTFNXKE1TRChyc3AtPmRtYSkpOwogCW1jcC0+bWJbNV0gPSByc3AtPmxlbmd0aDsKIAltY3AtPm1iWzExXSA9IHJzcC0+dnBfaWR4OwotCW1jcC0+bWJbMTRdID0gcnNwLT5tc2l4LT52ZWN0b3I7CisJbWNwLT5tYlsxNF0gPSByc3AtPm1zaXgtPmVudHJ5OwogCW1jcC0+bWJbMTNdID0gcnNwLT5yaWQ7CiAKIAlyZWcgPSAoc3RydWN0IGRldmljZV9yZWdfMjV4eG1xICopKCh2b2lkICopKGhhLT5tcWlvYmFzZSkgKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX21pZC5jIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX21pZC5jCmluZGV4IDM4NmZmZWEuLmY1MzE3OWM0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfbWlkLmMKKysrIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX21pZC5jCkBAIC02MTQsOCArNjE0LDEwIEBACiAJcmVxLT52cF9pZHggPSB2cF9pZHg7CiAJcmVxLT5xb3MgPSBxb3M7CiAKLQlpZiAoaGEtPnJzcF9xX21hcFtyc3BfcXVlXSkKKwlpZiAoaGEtPnJzcF9xX21hcFtyc3BfcXVlXSkgewogCQlyZXEtPnJzcCA9IGhhLT5yc3BfcV9tYXBbcnNwX3F1ZV07CisJCXJlcS0+cnNwLT5yZXEgPSByZXE7CisJfQogCS8qIFVzZSBhbHRlcm5hdGUgUENJIGJ1cyBudW1iZXIgKi8KIAlpZiAoTVNCKHJlcS0+cmlkKSkKIAkJb3B0aW9ucyB8PSBCSVRfNDsKQEAgLTYyNyw2ICs2MjksNyBAQAogCXJlcS0+cmluZ19pbmRleCA9IDA7CiAJcmVxLT5jbnQgPSByZXEtPmxlbmd0aDsKIAlyZXEtPmlkID0gcXVlX2lkOworCXJlcS0+bWF4X3FfZGVwdGggPSBoYS0+cmVxX3FfbWFwWzBdLT5tYXhfcV9kZXB0aDsKIAltdXRleF91bmxvY2soJmhhLT52cG9ydF9sb2NrKTsKIAogCXJldCA9IHFsYTI1eHhfaW5pdF9yZXFfcXVlKGJhc2VfdmhhLCByZXEsIG9wdGlvbnMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX29zLmMgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfb3MuYwppbmRleCA4ZWE5Mjc3Li5jZjMyNjUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfb3MuYworKysgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfb3MuYwpAQCAtNDA0LDI2ICs0MDQsOSBAQAogcWxhMjR4eF9md192ZXJzaW9uX3N0cihzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqdmhhLCBjaGFyICpzdHIpCiB7CiAJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7Ci0Jc3ByaW50ZihzdHIsICIlZC4lMDJkLiUwMmQgIiwgaGEtPmZ3X21ham9yX3ZlcnNpb24sCi0JICAgIGhhLT5md19taW5vcl92ZXJzaW9uLAotCSAgICBoYS0+Zndfc3VibWlub3JfdmVyc2lvbik7CiAKLQlpZiAoaGEtPmZ3X2F0dHJpYnV0ZXMgJiBCSVRfMCkKLQkJc3RyY2F0KHN0ciwgIltDbGFzcyAyXSAiKTsKLQlpZiAoaGEtPmZ3X2F0dHJpYnV0ZXMgJiBCSVRfMSkKLQkJc3RyY2F0KHN0ciwgIltJUF0gIik7Ci0JaWYgKGhhLT5md19hdHRyaWJ1dGVzICYgQklUXzIpCi0JCXN0cmNhdChzdHIsICJbTXVsdGktSURdICIpOwotCWlmIChoYS0+ZndfYXR0cmlidXRlcyAmIEJJVF8zKQotCQlzdHJjYXQoc3RyLCAiW1NCLTJdICIpOwotCWlmIChoYS0+ZndfYXR0cmlidXRlcyAmIEJJVF80KQotCQlzdHJjYXQoc3RyLCAiW1QxMCBDUkNdICIpOwotCWlmIChoYS0+ZndfYXR0cmlidXRlcyAmIEJJVF81KQotCQlzdHJjYXQoc3RyLCAiW1ZJXSAiKTsKLQlpZiAoaGEtPmZ3X2F0dHJpYnV0ZXMgJiBCSVRfMTApCi0JCXN0cmNhdChzdHIsICJbODRYWF0gIik7Ci0JaWYgKGhhLT5md19hdHRyaWJ1dGVzICYgQklUXzEzKQotCQlzdHJjYXQoc3RyLCAiW0V4cGVyaW1lbnRhbF0iKTsKKwlzcHJpbnRmKHN0ciwgIiVkLiUwMmQuJTAyZCAoJXgpIiwgaGEtPmZ3X21ham9yX3ZlcnNpb24sCisJICAgIGhhLT5md19taW5vcl92ZXJzaW9uLCBoYS0+Zndfc3VibWlub3JfdmVyc2lvbiwgaGEtPmZ3X2F0dHJpYnV0ZXMpOwogCXJldHVybiBzdHI7CiB9CiAKQEAgLTQzOCw3ICs0MjEsNiBAQAogCWlmICghc3ApCiAJCXJldHVybiBzcDsKIAotCXNwLT52aGEgPSB2aGE7CiAJc3AtPmZjcG9ydCA9IGZjcG9ydDsKIAlzcC0+Y21kID0gY21kOwogCXNwLT5xdWUgPSBoYS0+cmVxX3FfbWFwWzBdOwpAQCAtMTE3NiwxMyArMTE1OCwxMyBAQAogCXN0cnVjdCByZXFfcXVlICpyZXE7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmaGEtPmhhcmR3YXJlX2xvY2ssIGZsYWdzKTsKLQlmb3IgKHF1ZSA9IDA7IHF1ZSA8IFFMQV9NQVhfSE9TVF9RVUVTOyBxdWUrKykgewotCQlyZXEgPSBoYS0+cmVxX3FfbWFwW3ZoYS0+cmVxX3F1ZXNbcXVlXV07CisJZm9yIChxdWUgPSAwOyBxdWUgPCBoYS0+bWF4X3F1ZXVlczsgcXVlKyspIHsKKwkJcmVxID0gaGEtPnJlcV9xX21hcFtxdWVdOwogCQlpZiAoIXJlcSkKIAkJCWNvbnRpbnVlOwogCQlmb3IgKGNudCA9IDE7IGNudCA8IE1BWF9PVVRTVEFORElOR19DT01NQU5EUzsgY250KyspIHsKIAkJCXNwID0gcmVxLT5vdXRzdGFuZGluZ19jbWRzW2NudF07Ci0JCQlpZiAoc3AgJiYgc3AtPnZoYSA9PSB2aGEpIHsKKwkJCWlmIChzcCAmJiBzcC0+ZmNwb3J0LT52aGEgPT0gdmhhKSB7CiAJCQkJcmVxLT5vdXRzdGFuZGluZ19jbWRzW2NudF0gPSBOVUxMOwogCQkJCXNwLT5jbWQtPnJlc3VsdCA9IHJlczsKIAkJCQlxbGEyeDAwX3NwX2NvbXBsKGhhLCBzcCk7CkBAIC0xMjExLDcgKzExOTMsNyBAQAogCXNjc2lfcWxhX2hvc3RfdCAqdmhhID0gc2hvc3RfcHJpdihzZGV2LT5ob3N0KTsKIAlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKIAlzdHJ1Y3QgZmNfcnBvcnQgKnJwb3J0ID0gc3RhcmdldF90b19ycG9ydChzZGV2LT5zZGV2X3RhcmdldCk7Ci0Jc3RydWN0IHJlcV9xdWUgKnJlcSA9IGhhLT5yZXFfcV9tYXBbMF07CisJc3RydWN0IHJlcV9xdWUgKnJlcSA9IGhhLT5yZXFfcV9tYXBbdmhhLT5yZXFfcXVlc1swXV07CiAKIAlpZiAoc2Rldi0+dGFnZ2VkX3N1cHBvcnRlZCkKIAkJc2NzaV9hY3RpdmF0ZV90Y3Eoc2RldiwgcmVxLT5tYXhfcV9kZXB0aCk7CkBAIC0xMzI5LDYgKzEzMTEsOCBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAwOwogCXN0cnVjdCBkZXZpY2VfcmVnXzI0eHggX19pb21lbSAqcmVnID0gJmhhLT5pb2Jhc2UtPmlzcDI0OwogCisJaWYgKElTX05PUE9MTElOR19UWVBFKGhhKSkKKwkJcmV0dXJuOwogCXNwaW5fbG9ja19pcnFzYXZlKCZoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOwogCWhhLT5pbnRlcnJ1cHRzX29uID0gMDsKIAlXUlRfUkVHX0RXT1JEKCZyZWctPmljdHJsLCAwKTsKQEAgLTE0ODgsNiArMTQ3Miw0NCBAQAogCS5yZF9yZXFfcmVnCQk9IHFsYTI0eHhfcmRfcmVxX3JlZywKIH07CiAKK3N0YXRpYyBzdHJ1Y3QgaXNwX29wZXJhdGlvbnMgcWxhODF4eF9pc3Bfb3BzID0geworCS5wY2lfY29uZmlnCQk9IHFsYTI1eHhfcGNpX2NvbmZpZywKKwkucmVzZXRfY2hpcAkJPSBxbGEyNHh4X3Jlc2V0X2NoaXAsCisJLmNoaXBfZGlhZwkJPSBxbGEyNHh4X2NoaXBfZGlhZywKKwkuY29uZmlnX3JpbmdzCQk9IHFsYTI0eHhfY29uZmlnX3JpbmdzLAorCS5yZXNldF9hZGFwdGVyCQk9IHFsYTI0eHhfcmVzZXRfYWRhcHRlciwKKwkubnZyYW1fY29uZmlnCQk9IHFsYTgxeHhfbnZyYW1fY29uZmlnLAorCS51cGRhdGVfZndfb3B0aW9ucwk9IHFsYTgxeHhfdXBkYXRlX2Z3X29wdGlvbnMsCisJLmxvYWRfcmlzYwkJPSBxbGEyNHh4X2xvYWRfcmlzYywKKwkucGNpX2luZm9fc3RyCQk9IHFsYTI0eHhfcGNpX2luZm9fc3RyLAorCS5md192ZXJzaW9uX3N0cgkJPSBxbGEyNHh4X2Z3X3ZlcnNpb25fc3RyLAorCS5pbnRyX2hhbmRsZXIJCT0gcWxhMjR4eF9pbnRyX2hhbmRsZXIsCisJLmVuYWJsZV9pbnRycwkJPSBxbGEyNHh4X2VuYWJsZV9pbnRycywKKwkuZGlzYWJsZV9pbnRycwkJPSBxbGEyNHh4X2Rpc2FibGVfaW50cnMsCisJLmFib3J0X2NvbW1hbmQJCT0gcWxhMjR4eF9hYm9ydF9jb21tYW5kLAorCS50YXJnZXRfcmVzZXQJCT0gcWxhMjR4eF9hYm9ydF90YXJnZXQsCisJLmx1bl9yZXNldAkJPSBxbGEyNHh4X2x1bl9yZXNldCwKKwkuZmFicmljX2xvZ2luCQk9IHFsYTI0eHhfbG9naW5fZmFicmljLAorCS5mYWJyaWNfbG9nb3V0CQk9IHFsYTI0eHhfZmFicmljX2xvZ291dCwKKwkuY2FsY19yZXFfZW50cmllcwk9IE5VTEwsCisJLmJ1aWxkX2lvY2JzCQk9IE5VTEwsCisJLnByZXBfbXNfaW9jYgkJPSBxbGEyNHh4X3ByZXBfbXNfaW9jYiwKKwkucHJlcF9tc19mZG1pX2lvY2IJPSBxbGEyNHh4X3ByZXBfbXNfZmRtaV9pb2NiLAorCS5yZWFkX252cmFtCQk9IHFsYTI1eHhfcmVhZF9udnJhbV9kYXRhLAorCS53cml0ZV9udnJhbQkJPSBxbGEyNXh4X3dyaXRlX252cmFtX2RhdGEsCisJLmZ3X2R1bXAJCT0gcWxhODF4eF9md19kdW1wLAorCS5iZWFjb25fb24JCT0gcWxhMjR4eF9iZWFjb25fb24sCisJLmJlYWNvbl9vZmYJCT0gcWxhMjR4eF9iZWFjb25fb2ZmLAorCS5iZWFjb25fYmxpbmsJCT0gcWxhMjR4eF9iZWFjb25fYmxpbmssCisJLnJlYWRfb3B0cm9tCQk9IHFsYTI1eHhfcmVhZF9vcHRyb21fZGF0YSwKKwkud3JpdGVfb3B0cm9tCQk9IHFsYTI0eHhfd3JpdGVfb3B0cm9tX2RhdGEsCisJLmdldF9mbGFzaF92ZXJzaW9uCT0gcWxhMjR4eF9nZXRfZmxhc2hfdmVyc2lvbiwKKwkuc3RhcnRfc2NzaQkJPSBxbGEyNHh4X3N0YXJ0X3Njc2ksCisJLndydF9yZXFfcmVnCQk9IHFsYTI0eHhfd3J0X3JlcV9yZWcsCisJLndydF9yc3BfcmVnCQk9IHFsYTI0eHhfd3J0X3JzcF9yZWcsCisJLnJkX3JlcV9yZWcJCT0gcWxhMjR4eF9yZF9yZXFfcmVnLAorfTsKKwogc3RhdGljIGlubGluZSB2b2lkCiBxbGEyeDAwX3NldF9pc3BfZmxhZ3Moc3RydWN0IHFsYV9od19kYXRhICpoYSkKIHsKQEAgLTE1NjcsNiArMTU4OSwxMyBAQAogCQloYS0+ZGV2aWNlX3R5cGUgfD0gRFRfSUlETUE7CiAJCWhhLT5md19zcmlzY19hZGRyZXNzID0gUklTQ19TVEFSVF9BRERSRVNTXzI0MDA7CiAJCWJyZWFrOworCWNhc2UgUENJX0RFVklDRV9JRF9RTE9HSUNfSVNQODAwMToKKwkJaGEtPmRldmljZV90eXBlIHw9IERUX0lTUDgwMDE7CisJCWhhLT5kZXZpY2VfdHlwZSB8PSBEVF9aSU9fU1VQUE9SVEVEOworCQloYS0+ZGV2aWNlX3R5cGUgfD0gRFRfRldJMjsKKwkJaGEtPmRldmljZV90eXBlIHw9IERUX0lJRE1BOworCQloYS0+Zndfc3Jpc2NfYWRkcmVzcyA9IFJJU0NfU1RBUlRfQUREUkVTU18yNDAwOworCQlicmVhazsKIAl9CiB9CiAKQEAgLTE2MjksNyArMTY1OCw3IEBACiAKIAkvKiBEZXRlcm1pbmUgcXVldWUgcmVzb3VyY2VzICovCiAJaGEtPm1heF9xdWV1ZXMgPSAxOwotCWlmIChxbDJ4bWF4cXVldWVzIDw9IDEgfHwgIUlTX1FMQTI1WFgoaGEpKQorCWlmIChxbDJ4bWF4cXVldWVzIDw9IDEgfHwgKCFJU19RTEEyNVhYKGhhKSAmJiAhSVNfUUxBODFYWChoYSkpKQogCQlnb3RvIG1xaW9iYXNlX2V4aXQ7CiAJaGEtPm1xaW9iYXNlID0gaW9yZW1hcChwY2lfcmVzb3VyY2Vfc3RhcnQoaGEtPnBkZXYsIDMpLAogCQkJcGNpX3Jlc291cmNlX2xlbihoYS0+cGRldiwgMykpOwpAQCAtMTcwNiw3ICsxNzM1LDggQEAKIAkgICAgcGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfUUxPR0lDX0lTUDg0MzIgfHwKIAkgICAgcGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfUUxPR0lDX0lTUDU0MjIgfHwKIAkgICAgcGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfUUxPR0lDX0lTUDU0MzIgfHwKLQkgICAgcGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfUUxPR0lDX0lTUDI1MzIpIHsKKwkgICAgcGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfUUxPR0lDX0lTUDI1MzIgfHwKKwkgICAgcGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfUUxPR0lDX0lTUDgwMDEpIHsKIAkJYmFycyA9IHBjaV9zZWxlY3RfYmFycyhwZGV2LCBJT1JFU09VUkNFX01FTSk7CiAJCXNodCA9ICZxbGEyNHh4X2RyaXZlcl90ZW1wbGF0ZTsKIAkJbWVtX29ubHkgPSAxOwpAQCAtMTc2MCw2ICsxNzkwLDEwIEBACiAJCXJzcF9sZW5ndGggPSBSRVNQT05TRV9FTlRSWV9DTlRfMjEwMDsKIAkJaGEtPm1heF9sb29wX2lkID0gU05TX0xBU1RfTE9PUF9JRF8yMTAwOwogCQloYS0+Z2lkX2xpc3RfaW5mb19zaXplID0gNDsKKwkJaGEtPmZsYXNoX2NvbmZfb2ZmID0gfjA7CisJCWhhLT5mbGFzaF9kYXRhX29mZiA9IH4wOworCQloYS0+bnZyYW1fY29uZl9vZmYgPSB+MDsKKwkJaGEtPm52cmFtX2RhdGFfb2ZmID0gfjA7CiAJCWhhLT5pc3Bfb3BzID0gJnFsYTIxMDBfaXNwX29wczsKIAl9IGVsc2UgaWYgKElTX1FMQTIyMDAoaGEpKSB7CiAJCWhhLT5tYnhfY291bnQgPSBNQUlMQk9YX1JFR0lTVEVSX0NPVU5UOwpAQCAtMTc2Nyw2ICsxODAxLDEwIEBACiAJCXJzcF9sZW5ndGggPSBSRVNQT05TRV9FTlRSWV9DTlRfMjEwMDsKIAkJaGEtPm1heF9sb29wX2lkID0gU05TX0xBU1RfTE9PUF9JRF8yMTAwOwogCQloYS0+Z2lkX2xpc3RfaW5mb19zaXplID0gNDsKKwkJaGEtPmZsYXNoX2NvbmZfb2ZmID0gfjA7CisJCWhhLT5mbGFzaF9kYXRhX29mZiA9IH4wOworCQloYS0+bnZyYW1fY29uZl9vZmYgPSB+MDsKKwkJaGEtPm52cmFtX2RhdGFfb2ZmID0gfjA7CiAJCWhhLT5pc3Bfb3BzID0gJnFsYTIxMDBfaXNwX29wczsKIAl9IGVsc2UgaWYgKElTX1FMQTIzWFgoaGEpKSB7CiAJCWhhLT5tYnhfY291bnQgPSBNQUlMQk9YX1JFR0lTVEVSX0NPVU5UOwpAQCAtMTc3Niw2ICsxODE0LDEwIEBACiAJCWhhLT5naWRfbGlzdF9pbmZvX3NpemUgPSA2OwogCQlpZiAoSVNfUUxBMjMyMihoYSkgfHwgSVNfUUxBNjMyMihoYSkpCiAJCQloYS0+b3B0cm9tX3NpemUgPSBPUFRST01fU0laRV8yMzIyOworCQloYS0+Zmxhc2hfY29uZl9vZmYgPSB+MDsKKwkJaGEtPmZsYXNoX2RhdGFfb2ZmID0gfjA7CisJCWhhLT5udnJhbV9jb25mX29mZiA9IH4wOworCQloYS0+bnZyYW1fZGF0YV9vZmYgPSB+MDsKIAkJaGEtPmlzcF9vcHMgPSAmcWxhMjMwMF9pc3Bfb3BzOwogCX0gZWxzZSBpZiAoSVNfUUxBMjRYWF9UWVBFKGhhKSkgewogCQloYS0+bWJ4X2NvdW50ID0gTUFJTEJPWF9SRUdJU1RFUl9DT1VOVDsKQEAgLTE3ODcsNiArMTgyOSwxMCBAQAogCQloYS0+b3B0cm9tX3NpemUgPSBPUFRST01fU0laRV8yNFhYOwogCQloYS0+bnZyYW1fbnBpdl9zaXplID0gUUxBX01BWF9WUE9SVFNfUUxBMjRYWDsKIAkJaGEtPmlzcF9vcHMgPSAmcWxhMjR4eF9pc3Bfb3BzOworCQloYS0+Zmxhc2hfY29uZl9vZmYgPSBGQVJYX0FDQ0VTU19GTEFTSF9DT05GOworCQloYS0+Zmxhc2hfZGF0YV9vZmYgPSBGQVJYX0FDQ0VTU19GTEFTSF9EQVRBOworCQloYS0+bnZyYW1fY29uZl9vZmYgPSBGQVJYX0FDQ0VTU19OVlJBTV9DT05GOworCQloYS0+bnZyYW1fZGF0YV9vZmYgPSBGQVJYX0FDQ0VTU19OVlJBTV9EQVRBOwogCX0gZWxzZSBpZiAoSVNfUUxBMjVYWChoYSkpIHsKIAkJaGEtPm1ieF9jb3VudCA9IE1BSUxCT1hfUkVHSVNURVJfQ09VTlQ7CiAJCXJlcV9sZW5ndGggPSBSRVFVRVNUX0VOVFJZX0NOVF8yNFhYOwpAQCAtMTc5Nyw2ICsxODQzLDIzIEBACiAJCWhhLT5vcHRyb21fc2l6ZSA9IE9QVFJPTV9TSVpFXzI1WFg7CiAJCWhhLT5udnJhbV9ucGl2X3NpemUgPSBRTEFfTUFYX1ZQT1JUU19RTEEyNVhYOwogCQloYS0+aXNwX29wcyA9ICZxbGEyNXh4X2lzcF9vcHM7CisJCWhhLT5mbGFzaF9jb25mX29mZiA9IEZBUlhfQUNDRVNTX0ZMQVNIX0NPTkY7CisJCWhhLT5mbGFzaF9kYXRhX29mZiA9IEZBUlhfQUNDRVNTX0ZMQVNIX0RBVEE7CisJCWhhLT5udnJhbV9jb25mX29mZiA9IEZBUlhfQUNDRVNTX05WUkFNX0NPTkY7CisJCWhhLT5udnJhbV9kYXRhX29mZiA9IEZBUlhfQUNDRVNTX05WUkFNX0RBVEE7CisJfSBlbHNlIGlmIChJU19RTEE4MVhYKGhhKSkgeworCQloYS0+bWJ4X2NvdW50ID0gTUFJTEJPWF9SRUdJU1RFUl9DT1VOVDsKKwkJcmVxX2xlbmd0aCA9IFJFUVVFU1RfRU5UUllfQ05UXzI0WFg7CisJCXJzcF9sZW5ndGggPSBSRVNQT05TRV9FTlRSWV9DTlRfMjMwMDsKKwkJaGEtPm1heF9sb29wX2lkID0gU05TX0xBU1RfTE9PUF9JRF8yMzAwOworCQloYS0+aW5pdF9jYl9zaXplID0gc2l6ZW9mKHN0cnVjdCBtaWRfaW5pdF9jYl84MXh4KTsKKwkJaGEtPmdpZF9saXN0X2luZm9fc2l6ZSA9IDg7CisJCWhhLT5vcHRyb21fc2l6ZSA9IE9QVFJPTV9TSVpFXzgxWFg7CisJCWhhLT5pc3Bfb3BzID0gJnFsYTgxeHhfaXNwX29wczsKKwkJaGEtPmZsYXNoX2NvbmZfb2ZmID0gRkFSWF9BQ0NFU1NfRkxBU0hfQ09ORl84MVhYOworCQloYS0+Zmxhc2hfZGF0YV9vZmYgPSBGQVJYX0FDQ0VTU19GTEFTSF9EQVRBXzgxWFg7CisJCWhhLT5udnJhbV9jb25mX29mZiA9IH4wOworCQloYS0+bnZyYW1fZGF0YV9vZmYgPSB+MDsKIAl9CiAKIAltdXRleF9pbml0KCZoYS0+dnBvcnRfbG9jayk7CkBAIC0xOTM1LDcgKzE5OTgsNiBAQAogCXJldHVybiAwOwogCiBwcm9iZV9mYWlsZWQ6Ci0JcWxhMngwMF9mcmVlX3F1ZShoYSwgcmVxLCByc3ApOwogCXFsYTJ4MDBfZnJlZV9kZXZpY2UoYmFzZV92aGEpOwogCiAJc2NzaV9ob3N0X3B1dChiYXNlX3ZoYS0+aG9zdCk7CkBAIC0yNDU4LDIzICsyNTIwLDYgQEAKIAlyZXR1cm4gcWxhMngwMF9wb3N0X3dvcmsodmhhLCBlLCAxKTsKIH0KIAotaW50Ci1xbGEyeDAwX3Bvc3RfaHdlX3dvcmsoc3RydWN0IHNjc2lfcWxhX2hvc3QgKnZoYSwgdWludDE2X3QgY29kZSwgdWludDE2X3QgZDEsCi0gICAgdWludDE2X3QgZDIsIHVpbnQxNl90IGQzKQotewotCXN0cnVjdCBxbGFfd29ya19ldnQgKmU7Ci0KLQllID0gcWxhMngwMF9hbGxvY193b3JrKHZoYSwgUUxBX0VWVF9IV0VfTE9HLCAxKTsKLQlpZiAoIWUpCi0JCXJldHVybiBRTEFfRlVOQ1RJT05fRkFJTEVEOwotCi0JZS0+dS5od2UuY29kZSA9IGNvZGU7Ci0JZS0+dS5od2UuZDEgPSBkMTsKLQllLT51Lmh3ZS5kMiA9IGQyOwotCWUtPnUuaHdlLmQzID0gZDM7Ci0JcmV0dXJuIHFsYTJ4MDBfcG9zdF93b3JrKHZoYSwgZSwgMSk7Ci19Ci0KIHN0YXRpYyB2b2lkCiBxbGEyeDAwX2RvX3dvcmsoc3RydWN0IHNjc2lfcWxhX2hvc3QgKnZoYSkKIHsKQEAgLTI0OTIsMTAgKzI1MzcsNiBAQAogCQkJZmNfaG9zdF9wb3N0X2V2ZW50KHZoYS0+aG9zdCwgZmNfZ2V0X2V2ZW50X251bWJlcigpLAogCQkJICAgIGUtPnUuYWVuLmNvZGUsIGUtPnUuYWVuLmRhdGEpOwogCQkJYnJlYWs7Ci0JCWNhc2UgUUxBX0VWVF9IV0VfTE9HOgotCQkJcWxhMnh4eF9od19ldmVudF9sb2codmhhLCBlLT51Lmh3ZS5jb2RlLCBlLT51Lmh3ZS5kMSwKLQkJCSAgICBlLT51Lmh3ZS5kMiwgZS0+dS5od2UuZDMpOwotCQkJYnJlYWs7CiAJCX0KIAkJaWYgKGUtPmZsYWdzICYgUUxBX0VWVF9GTEFHX0ZSRUUpCiAJCQlrZnJlZShlKTsKQEAgLTI5MTQsMTMgKzI5NTUsMTQgQEAKIAogLyogRmlybXdhcmUgaW50ZXJmYWNlIHJvdXRpbmVzLiAqLwogCi0jZGVmaW5lIEZXX0JMT0JTCTYKKyNkZWZpbmUgRldfQkxPQlMJNwogI2RlZmluZSBGV19JU1AyMVhYCTAKICNkZWZpbmUgRldfSVNQMjJYWAkxCiAjZGVmaW5lIEZXX0lTUDIzMDAJMgogI2RlZmluZSBGV19JU1AyMzIyCTMKICNkZWZpbmUgRldfSVNQMjRYWAk0CiAjZGVmaW5lIEZXX0lTUDI1WFgJNQorI2RlZmluZSBGV19JU1A4MVhYCTYKIAogI2RlZmluZSBGV19GSUxFX0lTUDIxWFgJInFsMjEwMF9mdy5iaW4iCiAjZGVmaW5lIEZXX0ZJTEVfSVNQMjJYWAkicWwyMjAwX2Z3LmJpbiIKQEAgLTI5MjgsNiArMjk3MCw3IEBACiAjZGVmaW5lIEZXX0ZJTEVfSVNQMjMyMgkicWwyMzIyX2Z3LmJpbiIKICNkZWZpbmUgRldfRklMRV9JU1AyNFhYCSJxbDI0MDBfZncuYmluIgogI2RlZmluZSBGV19GSUxFX0lTUDI1WFgJInFsMjUwMF9mdy5iaW4iCisjZGVmaW5lIEZXX0ZJTEVfSVNQODFYWAkicWw4MTAwX2Z3LmJpbiIKIAogc3RhdGljIERFRklORV9NVVRFWChxbGFfZndfbG9jayk7CiAKQEAgLTI5MzgsNiArMjk4MSw3IEBACiAJeyAubmFtZSA9IEZXX0ZJTEVfSVNQMjMyMiwgLnNlZ3MgPSB7IDB4ODAwLCAweDFjMDAwLCAweDFlMDAwLCAwIH0sIH0sCiAJeyAubmFtZSA9IEZXX0ZJTEVfSVNQMjRYWCwgfSwKIAl7IC5uYW1lID0gRldfRklMRV9JU1AyNVhYLCB9LAorCXsgLm5hbWUgPSBGV19GSUxFX0lTUDgxWFgsIH0sCiB9OwogCiBzdHJ1Y3QgZndfYmxvYiAqCkBAIC0yOTU5LDYgKzMwMDMsOCBAQAogCQlibG9iID0gJnFsYV9md19ibG9ic1tGV19JU1AyNFhYXTsKIAl9IGVsc2UgaWYgKElTX1FMQTI1WFgoaGEpKSB7CiAJCWJsb2IgPSAmcWxhX2Z3X2Jsb2JzW0ZXX0lTUDI1WFhdOworCX0gZWxzZSBpZiAoSVNfUUxBODFYWChoYSkpIHsKKwkJYmxvYiA9ICZxbGFfZndfYmxvYnNbRldfSVNQODFYWF07CiAJfQogCiAJbXV0ZXhfbG9jaygmcWxhX2Z3X2xvY2spOwpAQCAtMzExMiw2ICszMTU4LDcgQEAKIAl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9RTE9HSUMsIFBDSV9ERVZJQ0VfSURfUUxPR0lDX0lTUDU0MjIpIH0sCiAJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfUUxPR0lDLCBQQ0lfREVWSUNFX0lEX1FMT0dJQ19JU1A1NDMyKSB9LAogCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX1FMT0dJQywgUENJX0RFVklDRV9JRF9RTE9HSUNfSVNQMjUzMikgfSwKKwl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9RTE9HSUMsIFBDSV9ERVZJQ0VfSURfUUxPR0lDX0lTUDgwMDEpIH0sCiAJeyAwIH0sCiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHFsYTJ4eHhfcGNpX3RibCk7CkBAIC0zMjAwLDMgKzMyNDcsNCBAQAogTU9EVUxFX0ZJUk1XQVJFKEZXX0ZJTEVfSVNQMjMyMik7CiBNT0RVTEVfRklSTVdBUkUoRldfRklMRV9JU1AyNFhYKTsKIE1PRFVMRV9GSVJNV0FSRShGV19GSUxFX0lTUDI1WFgpOworTU9EVUxFX0ZJUk1XQVJFKEZXX0ZJTEVfSVNQODFYWCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfc3VwLmMgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfc3VwLmMKaW5kZXggYzUzOGVlMS4uMzAzZjhlZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX3N1cC5jCisrKyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9zdXAuYwpAQCAtNDI1LDI3ICs0MjUsMjcgQEAKICNkZWZpbmUgT1BUUk9NX0JVUlNUX0RXT1JEUwkoT1BUUk9NX0JVUlNUX1NJWkUgLyA0KQogCiBzdGF0aWMgaW5saW5lIHVpbnQzMl90Ci1mbGFzaF9jb25mX3RvX2FjY2Vzc19hZGRyKHVpbnQzMl90IGZhZGRyKQorZmxhc2hfY29uZl9hZGRyKHN0cnVjdCBxbGFfaHdfZGF0YSAqaGEsIHVpbnQzMl90IGZhZGRyKQogewotCXJldHVybiBGQVJYX0FDQ0VTU19GTEFTSF9DT05GIHwgZmFkZHI7CisJcmV0dXJuIGhhLT5mbGFzaF9jb25mX29mZiB8IGZhZGRyOwogfQogCiBzdGF0aWMgaW5saW5lIHVpbnQzMl90Ci1mbGFzaF9kYXRhX3RvX2FjY2Vzc19hZGRyKHVpbnQzMl90IGZhZGRyKQorZmxhc2hfZGF0YV9hZGRyKHN0cnVjdCBxbGFfaHdfZGF0YSAqaGEsIHVpbnQzMl90IGZhZGRyKQogewotCXJldHVybiBGQVJYX0FDQ0VTU19GTEFTSF9EQVRBIHwgZmFkZHI7CisJcmV0dXJuIGhhLT5mbGFzaF9kYXRhX29mZiB8IGZhZGRyOwogfQogCiBzdGF0aWMgaW5saW5lIHVpbnQzMl90Ci1udnJhbV9jb25mX3RvX2FjY2Vzc19hZGRyKHVpbnQzMl90IG5hZGRyKQorbnZyYW1fY29uZl9hZGRyKHN0cnVjdCBxbGFfaHdfZGF0YSAqaGEsIHVpbnQzMl90IG5hZGRyKQogewotCXJldHVybiBGQVJYX0FDQ0VTU19OVlJBTV9DT05GIHwgbmFkZHI7CisJcmV0dXJuIGhhLT5udnJhbV9jb25mX29mZiB8IG5hZGRyOwogfQogCiBzdGF0aWMgaW5saW5lIHVpbnQzMl90Ci1udnJhbV9kYXRhX3RvX2FjY2Vzc19hZGRyKHVpbnQzMl90IG5hZGRyKQorbnZyYW1fZGF0YV9hZGRyKHN0cnVjdCBxbGFfaHdfZGF0YSAqaGEsIHVpbnQzMl90IG5hZGRyKQogewotCXJldHVybiBGQVJYX0FDQ0VTU19OVlJBTV9EQVRBIHwgbmFkZHI7CisJcmV0dXJuIGhhLT5udnJhbV9kYXRhX29mZiB8IG5hZGRyOwogfQogCiBzdGF0aWMgdWludDMyX3QKQEAgLTQ4MSwxMCArNDgxLDEyIEBACiAgICAgdWludDMyX3QgZHdvcmRzKQogewogCXVpbnQzMl90IGk7CisJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CisKIAkvKiBEd29yZCByZWFkcyB0byBmbGFzaC4gKi8KIAlmb3IgKGkgPSAwOyBpIDwgZHdvcmRzOyBpKyssIGZhZGRyKyspCi0JCWR3cHRyW2ldID0gY3B1X3RvX2xlMzIocWxhMjR4eF9yZWFkX2ZsYXNoX2R3b3JkKHZoYS0+aHcsCi0JCSAgICBmbGFzaF9kYXRhX3RvX2FjY2Vzc19hZGRyKGZhZGRyKSkpOworCQlkd3B0cltpXSA9IGNwdV90b19sZTMyKHFsYTI0eHhfcmVhZF9mbGFzaF9kd29yZChoYSwKKwkJICAgIGZsYXNoX2RhdGFfYWRkcihoYSwgZmFkZHIpKSk7CiAKIAlyZXR1cm4gZHdwdHI7CiB9CkBAIC01MTgsNyArNTIwLDcgQEAKIHsKIAl1aW50MzJfdCBpZHM7CiAKLQlpZHMgPSBxbGEyNHh4X3JlYWRfZmxhc2hfZHdvcmQoaGEsIGZsYXNoX2RhdGFfdG9fYWNjZXNzX2FkZHIoMHhkMDNhYikpOworCWlkcyA9IHFsYTI0eHhfcmVhZF9mbGFzaF9kd29yZChoYSwgZmxhc2hfY29uZl9hZGRyKGhhLCAweDAzYWIpKTsKIAkqbWFuX2lkID0gTFNCKGlkcyk7CiAJKmZsYXNoX2lkID0gTVNCKGlkcyk7CiAKQEAgLTUzMCw4ICs1MzIsNyBAQAogCQkgKiBFeGFtcGxlOiBBVE1FTCAweDAwIDAxIDQ1IDFGCiAJCSAqIEV4dHJhY3QgTUZHIGFuZCBEZXYgSUQgZnJvbSBsYXN0IHR3byBieXRlcy4KIAkJICovCi0JCWlkcyA9IHFsYTI0eHhfcmVhZF9mbGFzaF9kd29yZChoYSwKLQkJICAgIGZsYXNoX2RhdGFfdG9fYWNjZXNzX2FkZHIoMHhkMDA5ZikpOworCQlpZHMgPSBxbGEyNHh4X3JlYWRfZmxhc2hfZHdvcmQoaGEsIGZsYXNoX2NvbmZfYWRkcihoYSwgMHgwMDlmKSk7CiAJCSptYW5faWQgPSBMU0IoaWRzKTsKIAkJKmZsYXNoX2lkID0gTVNCKGlkcyk7CiAJfQpAQCAtNTU1LDkgKzU1NiwxMyBAQAogCiAJLyogQmVnaW4gd2l0aCBzYW5lIGRlZmF1bHRzLiAqLwogCWxvYyA9IGxvY2F0aW9uc1swXTsKLQkqc3RhcnQgPSBJU19RTEEyNFhYX1RZUEUoaGEpID8gRkFfRkxBU0hfTEFZT1VUX0FERFJfMjQ6Ci0JICAgIEZBX0ZMQVNIX0xBWU9VVF9BRERSOwotCisJKnN0YXJ0ID0gMDsKKwlpZiAoSVNfUUxBMjRYWF9UWVBFKGhhKSkKKwkJKnN0YXJ0ID0gRkFfRkxBU0hfTEFZT1VUX0FERFJfMjQ7CisJZWxzZSBpZiAoSVNfUUxBMjVYWChoYSkpCisJCSpzdGFydCA9IEZBX0ZMQVNIX0xBWU9VVF9BRERSOworCWVsc2UgaWYgKElTX1FMQTgxWFgoaGEpKQorCQkqc3RhcnQgPSBGQV9GTEFTSF9MQVlPVVRfQUREUl84MTsKIAkvKiBCZWdpbiB3aXRoIGZpcnN0IFBDSSBleHBhbnNpb24gUk9NIGhlYWRlci4gKi8KIAlidWYgPSAodWludDhfdCAqKXJlcS0+cmluZzsKIAlkY29kZSA9ICh1aW50MzJfdCAqKXJlcS0+cmluZzsKQEAgLTYxOCw2ICs2MjMsMjIgQEAKIHFsYTJ4eHhfZ2V0X2ZsdF9pbmZvKHNjc2lfcWxhX2hvc3RfdCAqdmhhLCB1aW50MzJfdCBmbHRfYWRkcikKIHsKIAljb25zdCBjaGFyICpsb2MsICpsb2NhdGlvbnNbXSA9IHsgIkRFRiIsICJGTFQiIH07CisJY29uc3QgdWludDMyX3QgZGVmX2Z3W10gPQorCQl7IEZBX1JJU0NfQ09ERV9BRERSLCBGQV9SSVNDX0NPREVfQUREUiwgRkFfUklTQ19DT0RFX0FERFJfODEgfTsKKwljb25zdCB1aW50MzJfdCBkZWZfYm9vdFtdID0KKwkJeyBGQV9CT09UX0NPREVfQUREUiwgRkFfQk9PVF9DT0RFX0FERFIsIEZBX0JPT1RfQ09ERV9BRERSXzgxIH07CisJY29uc3QgdWludDMyX3QgZGVmX3ZwZF9udnJhbVtdID0KKwkJeyBGQV9WUERfTlZSQU1fQUREUiwgRkFfVlBEX05WUkFNX0FERFIsIEZBX1ZQRF9OVlJBTV9BRERSXzgxIH07CisJY29uc3QgdWludDMyX3QgZGVmX2ZkdFtdID0KKwkJeyBGQV9GTEFTSF9ERVNDUl9BRERSXzI0LCBGQV9GTEFTSF9ERVNDUl9BRERSLAorCQkJRkFfRkxBU0hfREVTQ1JfQUREUl84MSB9OworCWNvbnN0IHVpbnQzMl90IGRlZl9ucGl2X2NvbmYwW10gPQorCQl7IEZBX05QSVZfQ09ORjBfQUREUl8yNCwgRkFfTlBJVl9DT05GMF9BRERSLAorCQkJRkFfTlBJVl9DT05GMF9BRERSXzgxIH07CisJY29uc3QgdWludDMyX3QgZGVmX25waXZfY29uZjFbXSA9CisJCXsgRkFfTlBJVl9DT05GMV9BRERSXzI0LCBGQV9OUElWX0NPTkYxX0FERFIsCisJCQlGQV9OUElWX0NPTkYxX0FERFJfODEgfTsKKwl1aW50MzJfdCBkZWY7CiAJdWludDE2X3QgKndwdHI7CiAJdWludDE2X3QgY250LCBjaGtzdW07CiAJdWludDMyX3Qgc3RhcnQ7CkBAIC02NzYsMjAgKzY5NywxMiBAQAogCQljYXNlIEZMVF9SRUdfRkRUOgogCQkJaGEtPmZsdF9yZWdpb25fZmR0ID0gc3RhcnQ7CiAJCQlicmVhazsKLQkJY2FzZSBGTFRfUkVHX0hXX0VWRU5UXzA6Ci0JCQlpZiAoIVBDSV9GVU5DKGhhLT5wZGV2LT5kZXZmbikpCi0JCQkJaGEtPmZsdF9yZWdpb25faHdfZXZlbnQgPSBzdGFydDsKLQkJCWJyZWFrOwotCQljYXNlIEZMVF9SRUdfSFdfRVZFTlRfMToKLQkJCWlmIChQQ0lfRlVOQyhoYS0+cGRldi0+ZGV2Zm4pKQotCQkJCWhhLT5mbHRfcmVnaW9uX2h3X2V2ZW50ID0gc3RhcnQ7Ci0JCQlicmVhazsKIAkJY2FzZSBGTFRfUkVHX05QSVZfQ09ORl8wOgotCQkJaWYgKCFQQ0lfRlVOQyhoYS0+cGRldi0+ZGV2Zm4pKQorCQkJaWYgKCEoUENJX0ZVTkMoaGEtPnBkZXYtPmRldmZuKSAmIDEpKQogCQkJCWhhLT5mbHRfcmVnaW9uX25waXZfY29uZiA9IHN0YXJ0OwogCQkJYnJlYWs7CiAJCWNhc2UgRkxUX1JFR19OUElWX0NPTkZfMToKLQkJCWlmIChQQ0lfRlVOQyhoYS0+cGRldi0+ZGV2Zm4pKQorCQkJaWYgKFBDSV9GVU5DKGhhLT5wZGV2LT5kZXZmbikgJiAxKQogCQkJCWhhLT5mbHRfcmVnaW9uX25waXZfY29uZiA9IHN0YXJ0OwogCQkJYnJlYWs7CiAJCX0KQEAgLTY5OSwyMiArNzEyLDI0IEBACiBub19mbGFzaF9kYXRhOgogCS8qIFVzZSBoYXJkY29kZWQgZGVmYXVsdHMuICovCiAJbG9jID0gbG9jYXRpb25zWzBdOwotCWhhLT5mbHRfcmVnaW9uX2Z3ID0gRkFfUklTQ19DT0RFX0FERFI7Ci0JaGEtPmZsdF9yZWdpb25fYm9vdCA9IEZBX0JPT1RfQ09ERV9BRERSOwotCWhhLT5mbHRfcmVnaW9uX3ZwZF9udnJhbSA9IEZBX1ZQRF9OVlJBTV9BRERSOwotCWhhLT5mbHRfcmVnaW9uX2ZkdCA9IElTX1FMQTI0WFhfVFlQRShoYSkgPyBGQV9GTEFTSF9ERVNDUl9BRERSXzI0OgotCSAgICBGQV9GTEFTSF9ERVNDUl9BRERSOwotCWhhLT5mbHRfcmVnaW9uX2h3X2V2ZW50ID0gIVBDSV9GVU5DKGhhLT5wZGV2LT5kZXZmbikgPwotCSAgICBGQV9IV19FVkVOVDBfQUREUjogRkFfSFdfRVZFTlQxX0FERFI7Ci0JaGEtPmZsdF9yZWdpb25fbnBpdl9jb25mID0gIVBDSV9GVU5DKGhhLT5wZGV2LT5kZXZmbikgPwotCSAgICAoSVNfUUxBMjRYWF9UWVBFKGhhKSA/IEZBX05QSVZfQ09ORjBfQUREUl8yNDogRkFfTlBJVl9DT05GMF9BRERSKToKLQkgICAgKElTX1FMQTI0WFhfVFlQRShoYSkgPyBGQV9OUElWX0NPTkYxX0FERFJfMjQ6IEZBX05QSVZfQ09ORjFfQUREUik7CisJZGVmID0gMDsKKwlpZiAoSVNfUUxBMjRYWF9UWVBFKGhhKSkKKwkJZGVmID0gMDsKKwllbHNlIGlmIChJU19RTEEyNVhYKGhhKSkKKwkJZGVmID0gMTsKKwllbHNlIGlmIChJU19RTEE4MVhYKGhhKSkKKwkJZGVmID0gMjsKKwloYS0+Zmx0X3JlZ2lvbl9mdyA9IGRlZl9md1tkZWZdOworCWhhLT5mbHRfcmVnaW9uX2Jvb3QgPSBkZWZfYm9vdFtkZWZdOworCWhhLT5mbHRfcmVnaW9uX3ZwZF9udnJhbSA9IGRlZl92cGRfbnZyYW1bZGVmXTsKKwloYS0+Zmx0X3JlZ2lvbl9mZHQgPSBkZWZfZmR0W2RlZl07CisJaGEtPmZsdF9yZWdpb25fbnBpdl9jb25mID0gIShQQ0lfRlVOQyhoYS0+cGRldi0+ZGV2Zm4pICYgMSkgPworCSAgICBkZWZfbnBpdl9jb25mMFtkZWZdOiBkZWZfbnBpdl9jb25mMVtkZWZdOwogZG9uZToKIAlERUJVRzIocWxhX3ByaW50ayhLRVJOX0RFQlVHLCBoYSwgIkZMVFslc106IGJvb3Q9MHgleCBmdz0weCV4ICIKLQkgICAgInZwZF9udnJhbT0weCV4IGZkdD0weCV4IGZsdD0weCV4IGh3ZT0weCV4IG5waXY9MHgleC5cbiIsIGxvYywKKwkgICAgInZwZF9udnJhbT0weCV4IGZkdD0weCV4IGZsdD0weCV4IG5waXY9MHgleC5cbiIsIGxvYywKIAkgICAgaGEtPmZsdF9yZWdpb25fYm9vdCwgaGEtPmZsdF9yZWdpb25fZncsIGhhLT5mbHRfcmVnaW9uX3ZwZF9udnJhbSwKLQkgICAgaGEtPmZsdF9yZWdpb25fZmR0LCBoYS0+Zmx0X3JlZ2lvbl9mbHQsIGhhLT5mbHRfcmVnaW9uX2h3X2V2ZW50LAotCSAgICBoYS0+Zmx0X3JlZ2lvbl9ucGl2X2NvbmYpKTsKKwkgICAgaGEtPmZsdF9yZWdpb25fZmR0LCBoYS0+Zmx0X3JlZ2lvbl9mbHQsIGhhLT5mbHRfcmVnaW9uX25waXZfY29uZikpOwogfQogCiBzdGF0aWMgdm9pZApAQCAtNzU3LDE0ICs3NzIsMTQgQEAKIAltaWQgPSBsZTE2X3RvX2NwdShmZHQtPm1hbl9pZCk7CiAJZmlkID0gbGUxNl90b19jcHUoZmR0LT5pZCk7CiAJaGEtPmZkdF93cnRfZGlzYWJsZSA9IGZkdC0+d3J0X2Rpc2FibGVfYml0czsKLQloYS0+ZmR0X2VyYXNlX2NtZCA9IGZsYXNoX2NvbmZfdG9fYWNjZXNzX2FkZHIoMHgwMzAwIHwgZmR0LT5lcmFzZV9jbWQpOworCWhhLT5mZHRfZXJhc2VfY21kID0gZmxhc2hfY29uZl9hZGRyKGhhLCAweDAzMDAgfCBmZHQtPmVyYXNlX2NtZCk7CiAJaGEtPmZkdF9ibG9ja19zaXplID0gbGUzMl90b19jcHUoZmR0LT5ibG9ja19zaXplKTsKIAlpZiAoZmR0LT51bnByb3RlY3Rfc2VjX2NtZCkgewotCQloYS0+ZmR0X3VucHJvdGVjdF9zZWNfY21kID0gZmxhc2hfY29uZl90b19hY2Nlc3NfYWRkcigweDAzMDAgfAorCQloYS0+ZmR0X3VucHJvdGVjdF9zZWNfY21kID0gZmxhc2hfY29uZl9hZGRyKGhhLCAweDAzMDAgfAogCQkgICAgZmR0LT51bnByb3RlY3Rfc2VjX2NtZCk7CiAJCWhhLT5mZHRfcHJvdGVjdF9zZWNfY21kID0gZmR0LT5wcm90ZWN0X3NlY19jbWQgPwotCQkgICAgZmxhc2hfY29uZl90b19hY2Nlc3NfYWRkcigweDAzMDAgfCBmZHQtPnByb3RlY3Rfc2VjX2NtZCk6Ci0JCSAgICBmbGFzaF9jb25mX3RvX2FjY2Vzc19hZGRyKDB4MDMzNik7CisJCSAgICBmbGFzaF9jb25mX2FkZHIoaGEsIDB4MDMwMCB8IGZkdC0+cHJvdGVjdF9zZWNfY21kKToKKwkJICAgIGZsYXNoX2NvbmZfYWRkcihoYSwgMHgwMzM2KTsKIAl9CiAJZ290byBkb25lOwogbm9fZmxhc2hfZGF0YToKQEAgLTc3Myw3ICs3ODgsNyBAQAogCW1pZCA9IG1hbl9pZDsKIAlmaWQgPSBmbGFzaF9pZDsKIAloYS0+ZmR0X3dydF9kaXNhYmxlID0gMHg5YzsKLQloYS0+ZmR0X2VyYXNlX2NtZCA9IGZsYXNoX2NvbmZfdG9fYWNjZXNzX2FkZHIoMHgwM2Q4KTsKKwloYS0+ZmR0X2VyYXNlX2NtZCA9IGZsYXNoX2NvbmZfYWRkcihoYSwgMHgwM2Q4KTsKIAlzd2l0Y2ggKG1hbl9pZCkgewogCWNhc2UgMHhiZjogLyogU1RUIGZsYXNoLiAqLwogCQlpZiAoZmxhc2hfaWQgPT0gMHg4ZSkKQEAgLTc4MiwxNiArNzk3LDE2IEBACiAJCQloYS0+ZmR0X2Jsb2NrX3NpemUgPSBGTEFTSF9CTEtfU0laRV8zMks7CiAKIAkJaWYgKGZsYXNoX2lkID09IDB4ODApCi0JCQloYS0+ZmR0X2VyYXNlX2NtZCA9IGZsYXNoX2NvbmZfdG9fYWNjZXNzX2FkZHIoMHgwMzUyKTsKKwkJCWhhLT5mZHRfZXJhc2VfY21kID0gZmxhc2hfY29uZl9hZGRyKGhhLCAweDAzNTIpOwogCQlicmVhazsKIAljYXNlIDB4MTM6IC8qIFNUIE0yNVA4MC4gKi8KIAkJaGEtPmZkdF9ibG9ja19zaXplID0gRkxBU0hfQkxLX1NJWkVfNjRLOwogCQlicmVhazsKIAljYXNlIDB4MWY6IC8qIEF0bWVsIDI2REYwODFBLiAqLwogCQloYS0+ZmR0X2Jsb2NrX3NpemUgPSBGTEFTSF9CTEtfU0laRV80SzsKLQkJaGEtPmZkdF9lcmFzZV9jbWQgPSBmbGFzaF9jb25mX3RvX2FjY2Vzc19hZGRyKDB4MDMyMCk7Ci0JCWhhLT5mZHRfdW5wcm90ZWN0X3NlY19jbWQgPSBmbGFzaF9jb25mX3RvX2FjY2Vzc19hZGRyKDB4MDMzOSk7Ci0JCWhhLT5mZHRfcHJvdGVjdF9zZWNfY21kID0gZmxhc2hfY29uZl90b19hY2Nlc3NfYWRkcigweDAzMzYpOworCQloYS0+ZmR0X2VyYXNlX2NtZCA9IGZsYXNoX2NvbmZfYWRkcihoYSwgMHgwMzIwKTsKKwkJaGEtPmZkdF91bnByb3RlY3Rfc2VjX2NtZCA9IGZsYXNoX2NvbmZfYWRkcihoYSwgMHgwMzM5KTsKKwkJaGEtPmZkdF9wcm90ZWN0X3NlY19jbWQgPSBmbGFzaF9jb25mX2FkZHIoaGEsIDB4MDMzNik7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCS8qIERlZmF1bHQgdG8gNjQga2Igc2VjdG9yIHNpemUuICovCkBAIC04MTMsNyArODI4LDcgQEAKIAl1aW50MzJfdCBmbHRfYWRkcjsKIAlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKIAotCWlmICghSVNfUUxBMjRYWF9UWVBFKGhhKSAmJiAhSVNfUUxBMjVYWChoYSkpCisJaWYgKCFJU19RTEEyNFhYX1RZUEUoaGEpICYmICFJU19RTEEyNVhYKGhhKSAmJiAhSVNfUUxBODFYWChoYSkpCiAJCXJldHVybiBRTEFfU1VDQ0VTUzsKIAogCXJldCA9IHFsYTJ4eHhfZmluZF9mbHRfc3RhcnQodmhhLCAmZmx0X2FkZHIpOwpAQCAtODM4LDcgKzg1Myw3IEBACiAJc3RydWN0IHFsYV9ucGl2X2VudHJ5ICplbnRyeTsKIAlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKIAotCWlmICghSVNfUUxBMjRYWF9UWVBFKGhhKSAmJiAhSVNfUUxBMjVYWChoYSkpCisJaWYgKCFJU19RTEEyNFhYX1RZUEUoaGEpICYmICFJU19RTEEyNVhYKGhhKSAmJiAhSVNfUUxBODFYWChoYSkpCiAJCXJldHVybjsKIAogCWhhLT5pc3Bfb3BzLT5yZWFkX29wdHJvbSh2aGEsICh1aW50OF90ICopJmhkciwKQEAgLTkzMCw5ICs5NDUsOSBAQAogCQlyZXR1cm47CiAKIAkvKiBEaXNhYmxlIGZsYXNoIHdyaXRlLXByb3RlY3Rpb24uICovCi0JcWxhMjR4eF93cml0ZV9mbGFzaF9kd29yZChoYSwgZmxhc2hfY29uZl90b19hY2Nlc3NfYWRkcigweDEwMSksIDApOworCXFsYTI0eHhfd3JpdGVfZmxhc2hfZHdvcmQoaGEsIGZsYXNoX2NvbmZfYWRkcihoYSwgMHgxMDEpLCAwKTsKIAkvKiBTb21lIGZsYXNoIHBhcnRzIG5lZWQgYW4gYWRkaXRpb25hbCB6ZXJvLXdyaXRlIHRvIGNsZWFyIGJpdHMuKi8KLQlxbGEyNHh4X3dyaXRlX2ZsYXNoX2R3b3JkKGhhLCBmbGFzaF9jb25mX3RvX2FjY2Vzc19hZGRyKDB4MTAxKSwgMCk7CisJcWxhMjR4eF93cml0ZV9mbGFzaF9kd29yZChoYSwgZmxhc2hfY29uZl9hZGRyKGhhLCAweDEwMSksIDApOwogfQogCiBzdGF0aWMgdm9pZApAQCAtOTQ1LDExICs5NjAsMTAgQEAKIAkJZ290byBza2lwX3dydF9wcm90ZWN0OwogCiAJLyogRW5hYmxlIGZsYXNoIHdyaXRlLXByb3RlY3Rpb24gYW5kIHdhaXQgZm9yIGNvbXBsZXRpb24uICovCi0JcWxhMjR4eF93cml0ZV9mbGFzaF9kd29yZChoYSwgZmxhc2hfY29uZl90b19hY2Nlc3NfYWRkcigweDEwMSksCisJcWxhMjR4eF93cml0ZV9mbGFzaF9kd29yZChoYSwgZmxhc2hfY29uZl9hZGRyKGhhLCAweDEwMSksCiAJICAgIGhhLT5mZHRfd3J0X2Rpc2FibGUpOwogCWZvciAoY250ID0gMzAwOyBjbnQgJiYKLQkgICAgcWxhMjR4eF9yZWFkX2ZsYXNoX2R3b3JkKGhhLAotCQkgICAgZmxhc2hfY29uZl90b19hY2Nlc3NfYWRkcigweDAwNSkpICYgQklUXzA7CisJICAgIHFsYTI0eHhfcmVhZF9mbGFzaF9kd29yZChoYSwgZmxhc2hfY29uZl9hZGRyKGhhLCAweDAwNSkpICYgQklUXzA7CiAJICAgIGNudC0tKSB7CiAJCXVkZWxheSgxMCk7CiAJfQpAQCAtOTc3LDcgKzk5MSw3IEBACiAJcmV0ID0gUUxBX1NVQ0NFU1M7CiAKIAkvKiBQcmVwYXJlIGJ1cnN0LWNhcGFibGUgd3JpdGUgb24gc3VwcG9ydGVkIElTUHMuICovCi0JaWYgKElTX1FMQTI1WFgoaGEpICYmICEoZmFkZHIgJiAweGZmZikgJiYKKwlpZiAoKElTX1FMQTI1WFgoaGEpIHx8IElTX1FMQTgxWFgoaGEpKSAmJiAhKGZhZGRyICYgMHhmZmYpICYmCiAJICAgIGR3b3JkcyA+IE9QVFJPTV9CVVJTVF9EV09SRFMpIHsKIAkJb3B0cm9tID0gZG1hX2FsbG9jX2NvaGVyZW50KCZoYS0+cGRldi0+ZGV2LCBPUFRST01fQlVSU1RfU0laRSwKIAkJICAgICZvcHRyb21fZG1hLCBHRlBfS0VSTkVMKTsKQEAgLTk4OSw3ICsxMDAzLDcgQEAKIAl9CiAKIAlyZXN0X2FkZHIgPSAoaGEtPmZkdF9ibG9ja19zaXplID4+IDIpIC0gMTsKLQlzZWNfbWFzayA9IDB4ODAwMDAgLSAoaGEtPmZkdF9ibG9ja19zaXplID4+IDIpOworCXNlY19tYXNrID0gKGhhLT5vcHRyb21fc2l6ZSA+PiAyKSAtIChoYS0+ZmR0X2Jsb2NrX3NpemUgPj4gMik7CiAKIAlxbGEyNHh4X3VucHJvdGVjdF9mbGFzaChoYSk7CiAKQEAgLTEwMjQsMTMgKzEwMzgsMTMgQEAKIAkJCQkqcyA9IGNwdV90b19sZTMyKCpkKTsKIAogCQkJcmV0ID0gcWxhMngwMF9sb2FkX3JhbSh2aGEsIG9wdHJvbV9kbWEsCi0JCQkgICAgZmxhc2hfZGF0YV90b19hY2Nlc3NfYWRkcihmYWRkciksCisJCQkgICAgZmxhc2hfZGF0YV9hZGRyKGhhLCBmYWRkciksCiAJCQkgICAgT1BUUk9NX0JVUlNUX0RXT1JEUyk7CiAJCQlpZiAocmV0ICE9IFFMQV9TVUNDRVNTKSB7CiAJCQkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAogCQkJCSAgICAiVW5hYmxlIHRvIGJ1cnN0LXdyaXRlIG9wdHJvbSBzZWdtZW50ICIKIAkJCQkgICAgIigleC8leC8lbGx4KS5cbiIsIHJldCwKLQkJCQkgICAgZmxhc2hfZGF0YV90b19hY2Nlc3NfYWRkcihmYWRkciksCisJCQkJICAgIGZsYXNoX2RhdGFfYWRkcihoYSwgZmFkZHIpLAogCQkJCSAgICAodW5zaWduZWQgbG9uZyBsb25nKW9wdHJvbV9kbWEpOwogCQkJCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKIAkJCQkgICAgIlJldmVydGluZyB0byBzbG93LXdyaXRlLlxuIik7CkBAIC0xMDQ3LDcgKzEwNjEsNyBAQAogCQl9CiAKIAkJcmV0ID0gcWxhMjR4eF93cml0ZV9mbGFzaF9kd29yZChoYSwKLQkJICAgIGZsYXNoX2RhdGFfdG9fYWNjZXNzX2FkZHIoZmFkZHIpLCBjcHVfdG9fbGUzMigqZHdwdHIpKTsKKwkJICAgIGZsYXNoX2RhdGFfYWRkcihoYSwgZmFkZHIpLCBjcHVfdG9fbGUzMigqZHdwdHIpKTsKIAkJaWYgKHJldCAhPSBRTEFfU1VDQ0VTUykgewogCQkJREVCVUc5KHByaW50aygiJXMoJWxkKSBVbmFibGUgdG8gcHJvZ3JhbSBmbGFzaCAiCiAJCQkgICAgImFkZHJlc3M9JXggZGF0YT0leC5cbiIsIF9fZnVuY19fLApAQCAtMTA5OCwxMiArMTExMiwxMyBAQAogewogCXVpbnQzMl90IGk7CiAJdWludDMyX3QgKmR3cHRyOworCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OwogCiAJLyogRHdvcmQgcmVhZHMgdG8gZmxhc2guICovCiAJZHdwdHIgPSAodWludDMyX3QgKilidWY7CiAJZm9yIChpID0gMDsgaSA8IGJ5dGVzID4+IDI7IGkrKywgbmFkZHIrKykKLQkJZHdwdHJbaV0gPSBjcHVfdG9fbGUzMihxbGEyNHh4X3JlYWRfZmxhc2hfZHdvcmQodmhhLT5odywKLQkJICAgIG52cmFtX2RhdGFfdG9fYWNjZXNzX2FkZHIobmFkZHIpKSk7CisJCWR3cHRyW2ldID0gY3B1X3RvX2xlMzIocWxhMjR4eF9yZWFkX2ZsYXNoX2R3b3JkKGhhLAorCQkgICAgbnZyYW1fZGF0YV9hZGRyKGhhLCBuYWRkcikpKTsKIAogCXJldHVybiBidWY7CiB9CkBAIC0xMTYwLDE3ICsxMTc1LDE0IEBACiAJUkRfUkVHX0RXT1JEKCZyZWctPmN0cmxfc3RhdHVzKTsJLyogUENJIFBvc3RpbmcuICovCiAKIAkvKiBEaXNhYmxlIE5WUkFNIHdyaXRlLXByb3RlY3Rpb24uICovCi0JcWxhMjR4eF93cml0ZV9mbGFzaF9kd29yZChoYSwgbnZyYW1fY29uZl90b19hY2Nlc3NfYWRkcigweDEwMSksCi0JICAgIDApOwotCXFsYTI0eHhfd3JpdGVfZmxhc2hfZHdvcmQoaGEsIG52cmFtX2NvbmZfdG9fYWNjZXNzX2FkZHIoMHgxMDEpLAotCSAgICAwKTsKKwlxbGEyNHh4X3dyaXRlX2ZsYXNoX2R3b3JkKGhhLCBudnJhbV9jb25mX2FkZHIoaGEsIDB4MTAxKSwgMCk7CisJcWxhMjR4eF93cml0ZV9mbGFzaF9kd29yZChoYSwgbnZyYW1fY29uZl9hZGRyKGhhLCAweDEwMSksIDApOwogCiAJLyogRHdvcmQgd3JpdGVzIHRvIGZsYXNoLiAqLwogCWR3cHRyID0gKHVpbnQzMl90ICopYnVmOwogCWZvciAoaSA9IDA7IGkgPCBieXRlcyA+PiAyOyBpKyssIG5hZGRyKyssIGR3cHRyKyspIHsKIAkJcmV0ID0gcWxhMjR4eF93cml0ZV9mbGFzaF9kd29yZChoYSwKLQkJICAgIG52cmFtX2RhdGFfdG9fYWNjZXNzX2FkZHIobmFkZHIpLAotCQkgICAgY3B1X3RvX2xlMzIoKmR3cHRyKSk7CisJCSAgICBudnJhbV9kYXRhX2FkZHIoaGEsIG5hZGRyKSwgY3B1X3RvX2xlMzIoKmR3cHRyKSk7CiAJCWlmIChyZXQgIT0gUUxBX1NVQ0NFU1MpIHsKIAkJCURFQlVHOShxbGFfcHJpbnRrKCJVbmFibGUgdG8gcHJvZ3JhbSBudnJhbSBhZGRyZXNzPSV4ICIKIAkJCSAgICAiZGF0YT0leC5cbiIsIG5hZGRyLCAqZHdwdHIpKTsKQEAgLTExNzksOCArMTE5MSw3IEBACiAJfQogCiAJLyogRW5hYmxlIE5WUkFNIHdyaXRlLXByb3RlY3Rpb24uICovCi0JcWxhMjR4eF93cml0ZV9mbGFzaF9kd29yZChoYSwgbnZyYW1fY29uZl90b19hY2Nlc3NfYWRkcigweDEwMSksCi0JICAgIDB4OGMpOworCXFsYTI0eHhfd3JpdGVfZmxhc2hfZHdvcmQoaGEsIG52cmFtX2NvbmZfYWRkcihoYSwgMHgxMDEpLCAweDhjKTsKIAogCS8qIERpc2FibGUgZmxhc2ggd3JpdGUuICovCiAJV1JUX1JFR19EV09SRCgmcmVnLT5jdHJsX3N0YXR1cywKQEAgLTEyMDIsOCArMTIxMyw3IEBACiAJZHdwdHIgPSAodWludDMyX3QgKilidWY7CiAJZm9yIChpID0gMDsgaSA8IGJ5dGVzID4+IDI7IGkrKywgbmFkZHIrKykKIAkJZHdwdHJbaV0gPSBjcHVfdG9fbGUzMihxbGEyNHh4X3JlYWRfZmxhc2hfZHdvcmQoaGEsCi0JCSAgICBmbGFzaF9kYXRhX3RvX2FjY2Vzc19hZGRyKGhhLT5mbHRfcmVnaW9uX3ZwZF9udnJhbSB8Ci0JCSAgICBuYWRkcikpKTsKKwkJICAgIGZsYXNoX2RhdGFfYWRkcihoYSwgaGEtPmZsdF9yZWdpb25fdnBkX252cmFtIHwgbmFkZHIpKSk7CiAKIAlyZXR1cm4gYnVmOwogfQpAQCAtMjI0NiwxMiArMjI1NiwxMiBAQAogCQkJYnVyc3QgPSBsZWZ0OwogCiAJCXJ2YWwgPSBxbGEyeDAwX2R1bXBfcmFtKHZoYSwgb3B0cm9tX2RtYSwKLQkJICAgIGZsYXNoX2RhdGFfdG9fYWNjZXNzX2FkZHIoZmFkZHIpLCBidXJzdCk7CisJCSAgICBmbGFzaF9kYXRhX2FkZHIoaGEsIGZhZGRyKSwgYnVyc3QpOwogCQlpZiAocnZhbCkgewogCQkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAogCQkJICAgICJVbmFibGUgdG8gYnVyc3QtcmVhZCBvcHRyb20gc2VnbWVudCAiCiAJCQkgICAgIigleC8leC8lbGx4KS5cbiIsIHJ2YWwsCi0JCQkgICAgZmxhc2hfZGF0YV90b19hY2Nlc3NfYWRkcihmYWRkciksCisJCQkgICAgZmxhc2hfZGF0YV9hZGRyKGhhLCBmYWRkciksCiAJCQkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylvcHRyb21fZG1hKTsKIAkJCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKIAkJCSAgICAiUmV2ZXJ0aW5nIHRvIHNsb3ctcmVhZC5cbiIpOwpAQCAtMjY0OCwxMDggKzI2NTgsMyBAQAogCiAJcmV0dXJuIDA7CiB9Ci0KLXN0YXRpYyBpbnQKLXFsYTJ4eHhfaHdfZXZlbnRfc3RvcmUoc2NzaV9xbGFfaG9zdF90ICp2aGEsIHVpbnQzMl90ICpmZGF0YSkKLXsKLQl1aW50MzJfdCBkWzJdLCBmYWRkcjsKLQlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKLQotCS8qIExvY2F0ZSBmaXJzdCBlbXB0eSBlbnRyeS4gKi8KLQlmb3IgKDs7KSB7Ci0JCWlmIChoYS0+aHdfZXZlbnRfcHRyID49Ci0JCSAgICBoYS0+Zmx0X3JlZ2lvbl9od19ldmVudCArIEZBX0hXX0VWRU5UX1NJWkUpIHsKLQkJCURFQlVHMihxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCi0JCQkgICAgIkhXIGV2ZW50IC0tIExvZyBGdWxsIVxuIikpOwotCQkJcmV0dXJuIFFMQV9NRU1PUllfQUxMT0NfRkFJTEVEOwotCQl9Ci0KLQkJcWxhMjR4eF9yZWFkX2ZsYXNoX2RhdGEodmhhLCBkLCBoYS0+aHdfZXZlbnRfcHRyLCAyKTsKLQkJZmFkZHIgPSBmbGFzaF9kYXRhX3RvX2FjY2Vzc19hZGRyKGhhLT5od19ldmVudF9wdHIpOwotCQloYS0+aHdfZXZlbnRfcHRyICs9IEZBX0hXX0VWRU5UX0VOVFJZX1NJWkU7Ci0JCWlmIChkWzBdID09IF9fY29uc3RhbnRfY3B1X3RvX2xlMzIoMHhmZmZmZmZmZikgJiYKLQkJICAgIGRbMV0gPT0gX19jb25zdGFudF9jcHVfdG9fbGUzMigweGZmZmZmZmZmKSkgewotCQkJcWxhMjR4eF91bnByb3RlY3RfZmxhc2goaGEpOwotCi0JCQlxbGEyNHh4X3dyaXRlX2ZsYXNoX2R3b3JkKGhhLCBmYWRkcisrLAotCQkJICAgIGNwdV90b19sZTMyKGppZmZpZXMpKTsKLQkJCXFsYTI0eHhfd3JpdGVfZmxhc2hfZHdvcmQoaGEsIGZhZGRyKyssIDApOwotCQkJcWxhMjR4eF93cml0ZV9mbGFzaF9kd29yZChoYSwgZmFkZHIrKywgKmZkYXRhKyspOwotCQkJcWxhMjR4eF93cml0ZV9mbGFzaF9kd29yZChoYSwgZmFkZHIrKywgKmZkYXRhKTsKLQotCQkJcWxhMjR4eF9wcm90ZWN0X2ZsYXNoKGhhKTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCXJldHVybiBRTEFfU1VDQ0VTUzsKLX0KLQotaW50Ci1xbGEyeHh4X2h3X2V2ZW50X2xvZyhzY3NpX3FsYV9ob3N0X3QgKnZoYSwgdWludDE2X3QgY29kZSwgdWludDE2X3QgZDEsCi0gICAgdWludDE2X3QgZDIsIHVpbnQxNl90IGQzKQotewotI2RlZmluZSBRTUFSSyhhLCBiLCBjLCBkKSBcCi0gICAgY3B1X3RvX2xlMzIoTFNCKGEpIDw8IDI0IHwgTFNCKGIpIDw8IDE2IHwgTFNCKGMpIDw8IDggfCBMU0IoZCkpCi0Jc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7Ci0JaW50IHJ2YWw7Ci0JdWludDMyX3QgbWFya2VyWzJdLCBmZGF0YVs0XTsKLQotCWlmIChoYS0+Zmx0X3JlZ2lvbl9od19ldmVudCA9PSAwKQotCQlyZXR1cm4gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKLQotCURFQlVHMihxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCi0JICAgICJIVyBldmVudCAtLSBjb2RlPSV4LCBkMT0leCwgZDI9JXgsIGQzPSV4LlxuIiwgY29kZSwgZDEsIGQyLCBkMykpOwotCi0JLyogSWYgbWFya2VyIG5vdCBhbHJlYWR5IGZvdW5kLCBsb2NhdGUgb3Igd3JpdGUuICAqLwotCWlmICghaGEtPmZsYWdzLmh3X2V2ZW50X21hcmtlcl9mb3VuZCkgewotCQkvKiBDcmVhdGUgbWFya2VyLiAqLwotCQltYXJrZXJbMF0gPSBRTUFSSygnTCcsIGhhLT5md19tYWpvcl92ZXJzaW9uLAotCQkgICAgaGEtPmZ3X21pbm9yX3ZlcnNpb24sIGhhLT5md19zdWJtaW5vcl92ZXJzaW9uKTsKLQkJbWFya2VyWzFdID0gUU1BUksoUUxBX0RSSVZFUl9NQUpPUl9WRVIsIFFMQV9EUklWRVJfTUlOT1JfVkVSLAotCQkgICAgUUxBX0RSSVZFUl9QQVRDSF9WRVIsIFFMQV9EUklWRVJfQkVUQV9WRVIpOwotCi0JCS8qIExvY2F0ZSBtYXJrZXIuICovCi0JCWhhLT5od19ldmVudF9wdHIgPSBoYS0+Zmx0X3JlZ2lvbl9od19ldmVudDsKLQkJZm9yICg7OykgewotCQkJcWxhMjR4eF9yZWFkX2ZsYXNoX2RhdGEodmhhLCBmZGF0YSwgaGEtPmh3X2V2ZW50X3B0ciwKLQkJCSAgICA0KTsKLQkJCWlmIChmZGF0YVswXSA9PSBfX2NvbnN0YW50X2NwdV90b19sZTMyKDB4ZmZmZmZmZmYpICYmCi0JCQkgICAgZmRhdGFbMV0gPT0gX19jb25zdGFudF9jcHVfdG9fbGUzMigweGZmZmZmZmZmKSkKLQkJCQlicmVhazsKLQkJCWhhLT5od19ldmVudF9wdHIgKz0gRkFfSFdfRVZFTlRfRU5UUllfU0laRTsKLQkJCWlmIChoYS0+aHdfZXZlbnRfcHRyID49Ci0JCQkgICAgaGEtPmZsdF9yZWdpb25faHdfZXZlbnQgKyBGQV9IV19FVkVOVF9TSVpFKSB7Ci0JCQkJREVCVUcyKHFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKLQkJCQkgICAgIkhXIGV2ZW50IC0tIExvZyBGdWxsIVxuIikpOwotCQkJCXJldHVybiBRTEFfTUVNT1JZX0FMTE9DX0ZBSUxFRDsKLQkJCX0KLQkJCWlmIChmZGF0YVsyXSA9PSBtYXJrZXJbMF0gJiYgZmRhdGFbM10gPT0gbWFya2VyWzFdKSB7Ci0JCQkJaGEtPmZsYWdzLmh3X2V2ZW50X21hcmtlcl9mb3VuZCA9IDE7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJLyogTm8gbWFya2VyLCB3cml0ZSBpdC4gKi8KLQkJaWYgKCFoYS0+ZmxhZ3MuaHdfZXZlbnRfbWFya2VyX2ZvdW5kKSB7Ci0JCQlydmFsID0gcWxhMnh4eF9od19ldmVudF9zdG9yZSh2aGEsIG1hcmtlcik7Ci0JCQlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgewotCQkJCURFQlVHMihxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCi0JCQkJICAgICJIVyBldmVudCAtLSBGYWlsZWQgbWFya2VyIHdyaXRlPSV4LiFcbiIsCi0JCQkJICAgIHJ2YWwpKTsKLQkJCQlyZXR1cm4gcnZhbDsKLQkJCX0KLQkJCWhhLT5mbGFncy5od19ldmVudF9tYXJrZXJfZm91bmQgPSAxOwotCQl9Ci0JfQotCi0JLyogU3RvcmUgZXJyb3IuICAqLwotCWZkYXRhWzBdID0gY3B1X3RvX2xlMzIoY29kZSA8PCAxNiB8IGQxKTsKLQlmZGF0YVsxXSA9IGNwdV90b19sZTMyKGQyIDw8IDE2IHwgZDMpOwotCXJ2YWwgPSBxbGEyeHh4X2h3X2V2ZW50X3N0b3JlKHZoYSwgZmRhdGEpOwotCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7Ci0JCURFQlVHMihxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCi0JCSAgICAiSFcgZXZlbnQgLS0gRmFpbGVkIGVycm9yIHdyaXRlPSV4LiFcbiIsCi0JCSAgICBydmFsKSk7Ci0JfQotCi0JcmV0dXJuIHJ2YWw7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfdmVyc2lvbi5oIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX3ZlcnNpb24uaAppbmRleCBiZTIyZjNhLi44MDhiYWI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfdmVyc2lvbi5oCisrKyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV92ZXJzaW9uLmgKQEAgLTcsOSArNyw5IEBACiAvKgogICogRHJpdmVyIHZlcnNpb24KICAqLwotI2RlZmluZSBRTEEyWFhYX1ZFUlNJT04gICAgICAiOC4wMi4wMy1rMSIKKyNkZWZpbmUgUUxBMlhYWF9WRVJTSU9OICAgICAgIjguMDMuMDAtazEiCiAKICNkZWZpbmUgUUxBX0RSSVZFUl9NQUpPUl9WRVIJOAotI2RlZmluZSBRTEFfRFJJVkVSX01JTk9SX1ZFUgkyCi0jZGVmaW5lIFFMQV9EUklWRVJfUEFUQ0hfVkVSCTMKKyNkZWZpbmUgUUxBX0RSSVZFUl9NSU5PUl9WRVIJMworI2RlZmluZSBRTEFfRFJJVkVSX1BBVENIX1ZFUgkwCiAjZGVmaW5lIFFMQV9EUklWRVJfQkVUQV9WRVIJMApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTR4eHgvcWw0X21ieC5jIGIvZHJpdmVycy9zY3NpL3FsYTR4eHgvcWw0X21ieC5jCmluZGV4IGM1NzdkNzkuLjA1MWIwZjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGE0eHh4L3FsNF9tYnguYworKysgYi9kcml2ZXJzL3Njc2kvcWxhNHh4eC9xbDRfbWJ4LmMKQEAgLTM5Miw3ICszOTIsNyBAQAogCQloYS0+aW9jYl9oaXdhdCAtPSBJT0NCX0hJV0FUX0NVU0hJT047CiAJZWxzZQogCQlkZXZfaW5mbygmaGEtPnBkZXYtPmRldiwgIldBUk5JTkchISEgIFlvdSBoYXZlIGxlc3MgdGhhbiAlZCAiCi0JCQkgICAiZmlybWFyZSBJT0NCcyBhdmFpbGFibGUgKCVkKS5cbiIsCisJCQkgICAiZmlybXdhcmUgSU9DQnMgYXZhaWxhYmxlICglZCkuXG4iLAogCQkJICAgSU9DQl9ISVdBVF9DVVNISU9OLCBoYS0+aW9jYl9oaXdhdCk7CiAKIAlyZXR1cm4gUUxBX1NVQ0NFU1M7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcmFpZF9jbGFzcy5jIGIvZHJpdmVycy9zY3NpL3JhaWRfY2xhc3MuYwppbmRleCA5MTNhOTMxLi44ZTVjMTY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcmFpZF9jbGFzcy5jCisrKyBiL2RyaXZlcnMvc2NzaS9yYWlkX2NsYXNzLmMKQEAgLTIzNyw4ICsyMzcsNyBAQAogCXJjLT5kZXYucGFyZW50ID0gZ2V0X2RldmljZShjb21wb25lbnRfZGV2KTsKIAlyYy0+bnVtID0gcmQtPmNvbXBvbmVudF9jb3VudCsrOwogCi0Jc25wcmludGYocmMtPmRldi5idXNfaWQsIHNpemVvZihyYy0+ZGV2LmJ1c19pZCksCi0JCSAiY29tcG9uZW50LSVkIiwgcmMtPm51bSk7CisJZGV2X3NldF9uYW1lKCZyYy0+ZGV2LCAiY29tcG9uZW50LSVkIiwgcmMtPm51bSk7CiAJbGlzdF9hZGRfdGFpbCgmcmMtPm5vZGUsICZyZC0+Y29tcG9uZW50X2xpc3QpOwogCXJjLT5kZXYuY2xhc3MgPSAmcmFpZF9jbGFzcy5jbGFzczsKIAllcnIgPSBkZXZpY2VfYWRkKCZyYy0+ZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zY3NpLmMgYi9kcml2ZXJzL3Njc2kvc2NzaS5jCmluZGV4IGY4Yjc5ZDQuLmNiY2QzZjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9zY3NpLmMKKysrIGIvZHJpdmVycy9zY3NpL3Njc2kuYwpAQCAtNjUxLDEwICs2NTEsNiBAQAogCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKIAlpbnQgcnRuID0gMDsKIAotCS8qCi0JICogV2Ugd2lsbCB1c2UgYSBxdWV1ZWQgY29tbWFuZCBpZiBwb3NzaWJsZSwgb3RoZXJ3aXNlIHdlIHdpbGwKLQkgKiBlbXVsYXRlIHRoZSBxdWV1aW5nIGFuZCBjYWxsaW5nIG9mIGNvbXBsZXRpb24gZnVuY3Rpb24gb3Vyc2VsdmVzLgotCSAqLwogCWF0b21pY19pbmMoJmNtZC0+ZGV2aWNlLT5pb3JlcXVlc3RfY250KTsKIAogCS8qIGNoZWNrIGlmIHRoZSBkZXZpY2UgaXMgc3RpbGwgdXNhYmxlICovCkBAIC0xMDk5LDcgKzEwOTUsOCBAQAogICogRGVzY3JpcHRpb246IExvb2tzIHVwIHRoZSBzY3NpX2RldmljZSB3aXRoIHRoZSBzcGVjaWZpZWQgQGx1biBmb3IgYSBnaXZlbgogICogQHN0YXJnZXQuICBUaGUgcmV0dXJuZWQgc2NzaV9kZXZpY2UgZG9lcyBub3QgaGF2ZSBhbiBhZGRpdGlvbmFsCiAgKiByZWZlcmVuY2UuICBZb3UgbXVzdCBob2xkIHRoZSBob3N0J3MgaG9zdF9sb2NrIG92ZXIgdGhpcyBjYWxsIGFuZAotICogYW55IGFjY2VzcyB0byB0aGUgcmV0dXJuZWQgc2NzaV9kZXZpY2UuCisgKiBhbnkgYWNjZXNzIHRvIHRoZSByZXR1cm5lZCBzY3NpX2RldmljZS4gQSBzY3NpX2RldmljZSBpbiBzdGF0ZQorICogU0RFVl9ERUwgaXMgc2tpcHBlZC4KICAqCiAgKiBOb3RlOiAgVGhlIG9ubHkgcmVhc29uIHdoeSBkcml2ZXJzIHNob3VsZCB1c2UgdGhpcyBpcyBiZWNhdXNlCiAgKiB0aGV5IG5lZWQgdG8gYWNjZXNzIHRoZSBkZXZpY2UgbGlzdCBpbiBpcnEgY29udGV4dC4gIE90aGVyd2lzZSB5b3UKQEAgLTExMTEsNiArMTEwOCw4IEBACiAJc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2OwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShzZGV2LCAmc3RhcmdldC0+ZGV2aWNlcywgc2FtZV90YXJnZXRfc2libGluZ3MpIHsKKwkJaWYgKHNkZXYtPnNkZXZfc3RhdGUgPT0gU0RFVl9ERUwpCisJCQljb250aW51ZTsKIAkJaWYgKHNkZXYtPmx1biA9PWx1bikKIAkJCXJldHVybiBzZGV2OwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zY3NpX2RlYnVnLmMgYi9kcml2ZXJzL3Njc2kvc2NzaV9kZWJ1Zy5jCmluZGV4IDI3YzYzM2YuLjZlZWJkMGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9zY3NpX2RlYnVnLmMKKysrIGIvZHJpdmVycy9zY3NpL3Njc2lfZGVidWcuYwpAQCAtMjUwOCw3ICsyNTA4LDcgQEAKIH0KIAogc3RhdGljIHN0cnVjdCBkZXZpY2UgcHNldWRvX3ByaW1hcnkgPSB7Ci0JLmJ1c19pZAkJPSAicHNldWRvXzAiLAorCS5pbml0X25hbWUJPSAicHNldWRvXzAiLAogCS5yZWxlYXNlCT0gcHNldWRvXzBfcmVsZWFzZSwKIH07CiAKQEAgLTI2ODAsNyArMjY4MCw3IEBACiAgICAgICAgIHNkYmdfaG9zdC0+ZGV2LmJ1cyA9ICZwc2V1ZG9fbGxkX2J1czsKICAgICAgICAgc2RiZ19ob3N0LT5kZXYucGFyZW50ID0gJnBzZXVkb19wcmltYXJ5OwogICAgICAgICBzZGJnX2hvc3QtPmRldi5yZWxlYXNlID0gJnNkZWJ1Z19yZWxlYXNlX2FkYXB0ZXI7Ci0gICAgICAgIHNwcmludGYoc2RiZ19ob3N0LT5kZXYuYnVzX2lkLCAiYWRhcHRlciVkIiwgc2NzaV9kZWJ1Z19hZGRfaG9zdCk7CisgICAgICAgIGRldl9zZXRfbmFtZSgmc2RiZ19ob3N0LT5kZXYsICJhZGFwdGVyJWQiLCBzY3NpX2RlYnVnX2FkZF9ob3N0KTsKIAogICAgICAgICBlcnJvciA9IGRldmljZV9yZWdpc3Rlcigmc2RiZ19ob3N0LT5kZXYpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc2NzaV9kZXZpbmZvLmMgYi9kcml2ZXJzL3Njc2kvc2NzaV9kZXZpbmZvLmMKaW5kZXggNDk2OWU0ZS4uMDk5YjU0NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3Njc2lfZGV2aW5mby5jCisrKyBiL2RyaXZlcnMvc2NzaS9zY3NpX2RldmluZm8uYwpAQCAtMjI0LDYgKzIyNCw3IEBACiAJeyJTR0kiLCAiVFA5MTAwIiwgIioiLCBCTElTVF9SRVBPUlRMVU4yfSwKIAl7IlNHSSIsICJVbml2ZXJzYWwgWHBvcnQiLCAiKiIsIEJMSVNUX05PX1VMRF9BVFRBQ0h9LAogCXsiSUJNIiwgIlVuaXZlcnNhbCBYcG9ydCIsICIqIiwgQkxJU1RfTk9fVUxEX0FUVEFDSH0sCisJeyJTVU4iLCAiVW5pdmVyc2FsIFhwb3J0IiwgIioiLCBCTElTVF9OT19VTERfQVRUQUNIfSwKIAl7IlNNU0MiLCAiVVNCIDIgSFMtQ0YiLCBOVUxMLCBCTElTVF9TUEFSU0VMVU4gfCBCTElTVF9JTlFVSVJZXzM2fSwKIAl7IlNPTlkiLCAiQ0QtUk9NIENEVS04MDAxIiwgTlVMTCwgQkxJU1RfQk9SS0VOfSwKIAl7IlNPTlkiLCAiVFNMIiwgTlVMTCwgQkxJU1RfRk9SQ0VMVU59LAkJLyogRERTMyAmIEREUzQgYXV0b2xvYWRlcnMgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zY3NpX2Vycm9yLmMgYi9kcml2ZXJzL3Njc2kvc2NzaV9lcnJvci5jCmluZGV4IDM4MTgzOGUuLmFkNmExMzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9zY3NpX2Vycm9yLmMKKysrIGIvZHJpdmVycy9zY3NpL3Njc2lfZXJyb3IuYwpAQCAtMTI0LDM0ICsxMjQsMjIgQEAKIGVudW0gYmxrX2VoX3RpbWVyX3JldHVybiBzY3NpX3RpbWVzX291dChzdHJ1Y3QgcmVxdWVzdCAqcmVxKQogewogCXN0cnVjdCBzY3NpX2NtbmQgKnNjbWQgPSByZXEtPnNwZWNpYWw7Ci0JZW51bSBibGtfZWhfdGltZXJfcmV0dXJuICgqZWhfdGltZWRfb3V0KShzdHJ1Y3Qgc2NzaV9jbW5kICopOwogCWVudW0gYmxrX2VoX3RpbWVyX3JldHVybiBydG4gPSBCTEtfRUhfTk9UX0hBTkRMRUQ7CiAKIAlzY3NpX2xvZ19jb21wbGV0aW9uKHNjbWQsIFRJTUVPVVRfRVJST1IpOwogCiAJaWYgKHNjbWQtPmRldmljZS0+aG9zdC0+dHJhbnNwb3J0dC0+ZWhfdGltZWRfb3V0KQotCQllaF90aW1lZF9vdXQgPSBzY21kLT5kZXZpY2UtPmhvc3QtPnRyYW5zcG9ydHQtPmVoX3RpbWVkX291dDsKKwkJcnRuID0gc2NtZC0+ZGV2aWNlLT5ob3N0LT50cmFuc3BvcnR0LT5laF90aW1lZF9vdXQoc2NtZCk7CiAJZWxzZSBpZiAoc2NtZC0+ZGV2aWNlLT5ob3N0LT5ob3N0dC0+ZWhfdGltZWRfb3V0KQotCQllaF90aW1lZF9vdXQgPSBzY21kLT5kZXZpY2UtPmhvc3QtPmhvc3R0LT5laF90aW1lZF9vdXQ7Ci0JZWxzZQotCQllaF90aW1lZF9vdXQgPSBOVUxMOworCQlydG4gPSBzY21kLT5kZXZpY2UtPmhvc3QtPmhvc3R0LT5laF90aW1lZF9vdXQoc2NtZCk7CiAKLQlpZiAoZWhfdGltZWRfb3V0KSB7Ci0JCXJ0biA9IGVoX3RpbWVkX291dChzY21kKTsKLQkJc3dpdGNoIChydG4pIHsKLQkJY2FzZSBCTEtfRUhfTk9UX0hBTkRMRUQ6Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXJldHVybiBydG47Ci0JCX0KLQl9Ci0KLQlpZiAodW5saWtlbHkoIXNjc2lfZWhfc2NtZF9hZGQoc2NtZCwgU0NTSV9FSF9DQU5DRUxfQ01EKSkpIHsKKwlpZiAodW5saWtlbHkocnRuID09IEJMS19FSF9OT1RfSEFORExFRCAmJgorCQkgICAgICFzY3NpX2VoX3NjbWRfYWRkKHNjbWQsIFNDU0lfRUhfQ0FOQ0VMX0NNRCkpKSB7CiAJCXNjbWQtPnJlc3VsdCB8PSBESURfVElNRV9PVVQgPDwgMTY7Ci0JCXJldHVybiBCTEtfRUhfSEFORExFRDsKKwkJcnRuID0gQkxLX0VIX0hBTkRMRUQ7CiAJfQogCi0JcmV0dXJuIEJMS19FSF9OT1RfSEFORExFRDsKKwlyZXR1cm4gcnRuOwogfQogCiAvKioKQEAgLTE2NTAsNyArMTYzOCw3IEBACiAJICogV2UgdXNlIFRBU0tfSU5URVJSVVBUSUJMRSBzbyB0aGF0IHRoZSB0aHJlYWQgaXMgbm90CiAJICogY291bnRlZCBhZ2FpbnN0IHRoZSBsb2FkIGF2ZXJhZ2UgYXMgYSBydW5uaW5nIHByb2Nlc3MuCiAJICogV2UgbmV2ZXIgYWN0dWFsbHkgZ2V0IGludGVycnVwdGVkIGJlY2F1c2Uga3RocmVhZF9ydW4KLQkgKiBkaXNhYmxlcyBzaW5nYWwgZGVsaXZlcnkgZm9yIHRoZSBjcmVhdGVkIHRocmVhZC4KKwkgKiBkaXNhYmxlcyBzaWduYWwgZGVsaXZlcnkgZm9yIHRoZSBjcmVhdGVkIHRocmVhZC4KIAkgKi8KIAlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwogCXdoaWxlICgha3RocmVhZF9zaG91bGRfc3RvcCgpKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc2NzaV9pb2N0bC5jIGIvZHJpdmVycy9zY3NpL3Njc2lfaW9jdGwuYwppbmRleCAyYWU0ZjhmLi5iOThmNzYzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvc2NzaV9pb2N0bC5jCisrKyBiL2RyaXZlcnMvc2NzaS9zY3NpX2lvY3RsLmMKQEAgLTE2NywxMCArMTY3LDE3IEBACiBzdGF0aWMgaW50IHNjc2lfaW9jdGxfZ2V0X3BjaShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYsIHZvaWQgX191c2VyICphcmcpCiB7CiAJc3RydWN0IGRldmljZSAqZGV2ID0gc2NzaV9nZXRfZGV2aWNlKHNkZXYtPmhvc3QpOworCWNvbnN0IGNoYXIgKm5hbWU7CiAKICAgICAgICAgaWYgKCFkZXYpCiAJCXJldHVybiAtRU5YSU87Ci0gICAgICAgIHJldHVybiBjb3B5X3RvX3VzZXIoYXJnLCBkZXYtPmJ1c19pZCwgc2l6ZW9mKGRldi0+YnVzX2lkKSk/IC1FRkFVTFQ6IDA7CisKKwluYW1lID0gZGV2X25hbWUoZGV2KTsKKworCS8qIGNvbXBhdGliaWxpdHkgd2l0aCBvbGQgaW9jdGwgd2hpY2ggb25seSByZXR1cm5lZAorCSAqIDIwIGNoYXJhY3RlcnMgKi8KKyAgICAgICAgcmV0dXJuIGNvcHlfdG9fdXNlcihhcmcsIG5hbWUsIG1pbihzdHJsZW4obmFtZSksIChzaXplX3QpMjApKQorCQk/IC1FRkFVTFQ6IDA7CiB9CiAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3Njc2lfbGliLmMgYi9kcml2ZXJzL3Njc2kvc2NzaV9saWIuYwppbmRleCBmMmY1MWUwLi45NDBkYzMyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvc2NzaV9saWIuYworKysgYi9kcml2ZXJzL3Njc2kvc2NzaV9saWIuYwpAQCAtOTEsMjYgKzkxLDE5IEBACiAJc2NzaV9wdXRfY29tbWFuZChjbWQpOwogfQogCi0vKgotICogRnVuY3Rpb246ICAgIHNjc2lfcXVldWVfaW5zZXJ0KCkKKy8qKgorICogX19zY3NpX3F1ZXVlX2luc2VydCAtIHByaXZhdGUgcXVldWUgaW5zZXJ0aW9uCisgKiBAY21kOiBUaGUgU0NTSSBjb21tYW5kIGJlaW5nIHJlcXVldWVkCisgKiBAcmVhc29uOiAgVGhlIHJlYXNvbiBmb3IgdGhlIHJlcXVldWUKKyAqIEB1bmJ1c3k6IFdoZXRoZXIgdGhlIHF1ZXVlIHNob3VsZCBiZSB1bmJ1c2llZAogICoKLSAqIFB1cnBvc2U6ICAgICBJbnNlcnQgYSBjb21tYW5kIGluIHRoZSBtaWRsZXZlbCBxdWV1ZS4KLSAqCi0gKiBBcmd1bWVudHM6ICAgY21kICAgIC0gY29tbWFuZCB0aGF0IHdlIGFyZSBhZGRpbmcgdG8gcXVldWUuCi0gKiAgICAgICAgICAgICAgcmVhc29uIC0gd2h5IHdlIGFyZSBpbnNlcnRpbmcgY29tbWFuZCB0byBxdWV1ZS4KLSAqCi0gKiBMb2NrIHN0YXR1czogQXNzdW1lZCB0aGF0IGxvY2sgaXMgbm90IGhlbGQgdXBvbiBlbnRyeS4KLSAqCi0gKiBSZXR1cm5zOiAgICAgTm90aGluZy4KLSAqCi0gKiBOb3RlczogICAgICAgV2UgZG8gdGhpcyBmb3Igb25lIG9mIHR3byBjYXNlcy4gIEVpdGhlciB0aGUgaG9zdCBpcyBidXN5Ci0gKiAgICAgICAgICAgICAgYW5kIGl0IGNhbm5vdCBhY2NlcHQgYW55IG1vcmUgY29tbWFuZHMgZm9yIHRoZSB0aW1lIGJlaW5nLAotICogICAgICAgICAgICAgIG9yIHRoZSBkZXZpY2UgcmV0dXJuZWQgUVVFVUVfRlVMTCBhbmQgY2FuIGFjY2VwdCBubyBtb3JlCi0gKiAgICAgICAgICAgICAgY29tbWFuZHMuCi0gKiBOb3RlczogICAgICAgVGhpcyBjb3VsZCBiZSBjYWxsZWQgZWl0aGVyIGZyb20gYW4gaW50ZXJydXB0IGNvbnRleHQgb3IgYQotICogICAgICAgICAgICAgIG5vcm1hbCBwcm9jZXNzIGNvbnRleHQuCisgKiBUaGlzIGlzIGEgcHJpdmF0ZSBxdWV1ZSBpbnNlcnRpb24uICBUaGUgcHVibGljIGludGVyZmFjZQorICogc2NzaV9xdWV1ZV9pbnNlcnQoKSBhbHdheXMgYXNzdW1lcyB0aGUgcXVldWUgc2hvdWxkIGJlIHVuYnVzaWVkCisgKiBiZWNhdXNlIGl0J3MgYWx3YXlzIGNhbGxlZCBiZWZvcmUgdGhlIGNvbXBsZXRpb24uICBUaGlzIGZ1bmN0aW9uIGlzCisgKiBmb3IgYSByZXF1ZXVlIGFmdGVyIGNvbXBsZXRpb24sIHdoaWNoIHNob3VsZCBvbmx5IG9jY3VyIGluIHRoaXMKKyAqIGZpbGUuCiAgKi8KLWludCBzY3NpX3F1ZXVlX2luc2VydChzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQsIGludCByZWFzb24pCitzdGF0aWMgaW50IF9fc2NzaV9xdWV1ZV9pbnNlcnQoc3RydWN0IHNjc2lfY21uZCAqY21kLCBpbnQgcmVhc29uLCBpbnQgdW5idXN5KQogewogCXN0cnVjdCBTY3NpX0hvc3QgKmhvc3QgPSBjbWQtPmRldmljZS0+aG9zdDsKIAlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKmRldmljZSA9IGNtZC0+ZGV2aWNlOwpAQCAtMTUwLDcgKzE0Myw4IEBACiAJICogRGVjcmVtZW50IHRoZSBjb3VudGVycywgc2luY2UgdGhlc2UgY29tbWFuZHMgYXJlIG5vIGxvbmdlcgogCSAqIGFjdGl2ZSBvbiB0aGUgaG9zdC9kZXZpY2UuCiAJICovCi0Jc2NzaV9kZXZpY2VfdW5idXN5KGRldmljZSk7CisJaWYgKHVuYnVzeSkKKwkJc2NzaV9kZXZpY2VfdW5idXN5KGRldmljZSk7CiAKIAkvKgogCSAqIFJlcXVldWUgdGhpcyBjb21tYW5kLiAgSXQgd2lsbCBnbyBiZWZvcmUgYWxsIG90aGVyIGNvbW1hbmRzCkBAIC0xNzIsNiArMTY2LDI5IEBACiAJcmV0dXJuIDA7CiB9CiAKKy8qCisgKiBGdW5jdGlvbjogICAgc2NzaV9xdWV1ZV9pbnNlcnQoKQorICoKKyAqIFB1cnBvc2U6ICAgICBJbnNlcnQgYSBjb21tYW5kIGluIHRoZSBtaWRsZXZlbCBxdWV1ZS4KKyAqCisgKiBBcmd1bWVudHM6ICAgY21kICAgIC0gY29tbWFuZCB0aGF0IHdlIGFyZSBhZGRpbmcgdG8gcXVldWUuCisgKiAgICAgICAgICAgICAgcmVhc29uIC0gd2h5IHdlIGFyZSBpbnNlcnRpbmcgY29tbWFuZCB0byBxdWV1ZS4KKyAqCisgKiBMb2NrIHN0YXR1czogQXNzdW1lZCB0aGF0IGxvY2sgaXMgbm90IGhlbGQgdXBvbiBlbnRyeS4KKyAqCisgKiBSZXR1cm5zOiAgICAgTm90aGluZy4KKyAqCisgKiBOb3RlczogICAgICAgV2UgZG8gdGhpcyBmb3Igb25lIG9mIHR3byBjYXNlcy4gIEVpdGhlciB0aGUgaG9zdCBpcyBidXN5CisgKiAgICAgICAgICAgICAgYW5kIGl0IGNhbm5vdCBhY2NlcHQgYW55IG1vcmUgY29tbWFuZHMgZm9yIHRoZSB0aW1lIGJlaW5nLAorICogICAgICAgICAgICAgIG9yIHRoZSBkZXZpY2UgcmV0dXJuZWQgUVVFVUVfRlVMTCBhbmQgY2FuIGFjY2VwdCBubyBtb3JlCisgKiAgICAgICAgICAgICAgY29tbWFuZHMuCisgKiBOb3RlczogICAgICAgVGhpcyBjb3VsZCBiZSBjYWxsZWQgZWl0aGVyIGZyb20gYW4gaW50ZXJydXB0IGNvbnRleHQgb3IgYQorICogICAgICAgICAgICAgIG5vcm1hbCBwcm9jZXNzIGNvbnRleHQuCisgKi8KK2ludCBzY3NpX3F1ZXVlX2luc2VydChzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQsIGludCByZWFzb24pCit7CisJcmV0dXJuIF9fc2NzaV9xdWV1ZV9pbnNlcnQoY21kLCByZWFzb24sIDEpOworfQogLyoqCiAgKiBzY3NpX2V4ZWN1dGUgLSBpbnNlcnQgcmVxdWVzdCBhbmQgd2FpdCBmb3IgdGhlIHJlc3VsdAogICogQHNkZXY6CXNjc2kgZGV2aWNlCkBAIC02ODQsNiArNzAxLDggQEAKIAkJc2NzaV9ydW5fcXVldWUoc2Rldi0+cmVxdWVzdF9xdWV1ZSk7CiB9CiAKK3N0YXRpYyB2b2lkIF9fc2NzaV9yZWxlYXNlX2J1ZmZlcnMoc3RydWN0IHNjc2lfY21uZCAqLCBpbnQpOworCiAvKgogICogRnVuY3Rpb246ICAgIHNjc2lfZW5kX3JlcXVlc3QoKQogICoKQEAgLTczMiw2ICs3NTEsNyBAQAogCQkJCSAqIGxlZnRvdmVycyBpbiB0aGUgZnJvbnQgb2YgdGhlCiAJCQkJICogcXVldWUsIGFuZCBnb29zZSB0aGUgcXVldWUgYWdhaW4uCiAJCQkJICovCisJCQkJc2NzaV9yZWxlYXNlX2J1ZmZlcnMoY21kKTsKIAkJCQlzY3NpX3JlcXVldWVfY29tbWFuZChxLCBjbWQpOwogCQkJCWNtZCA9IE5VTEw7CiAJCQl9CkBAIC03NDMsNiArNzYzLDcgQEAKIAkgKiBUaGlzIHdpbGwgZ29vc2UgdGhlIHF1ZXVlIHJlcXVlc3QgZnVuY3Rpb24gYXQgdGhlIGVuZCwgc28gd2UgZG9uJ3QKIAkgKiBuZWVkIHRvIHdvcnJ5IGFib3V0IGxhdW5jaGluZyBhbm90aGVyIGNvbW1hbmQuCiAJICovCisJX19zY3NpX3JlbGVhc2VfYnVmZmVycyhjbWQsIDApOwogCXNjc2lfbmV4dF9jb21tYW5kKGNtZCk7CiAJcmV0dXJuIE5VTEw7CiB9CkBAIC03OTgsNiArODE5LDI2IEBACiAJX19zZ19mcmVlX3RhYmxlKCZzZGItPnRhYmxlLCBTQ1NJX01BWF9TR19TRUdNRU5UUywgc2NzaV9zZ19mcmVlKTsKIH0KIAorc3RhdGljIHZvaWQgX19zY3NpX3JlbGVhc2VfYnVmZmVycyhzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQsIGludCBkb19iaWRpX2NoZWNrKQoreworCisJaWYgKGNtZC0+c2RiLnRhYmxlLm5lbnRzKQorCQlzY3NpX2ZyZWVfc2d0YWJsZSgmY21kLT5zZGIpOworCisJbWVtc2V0KCZjbWQtPnNkYiwgMCwgc2l6ZW9mKGNtZC0+c2RiKSk7CisKKwlpZiAoZG9fYmlkaV9jaGVjayAmJiBzY3NpX2JpZGlfY21uZChjbWQpKSB7CisJCXN0cnVjdCBzY3NpX2RhdGFfYnVmZmVyICpiaWRpX3NkYiA9CisJCQljbWQtPnJlcXVlc3QtPm5leHRfcnEtPnNwZWNpYWw7CisJCXNjc2lfZnJlZV9zZ3RhYmxlKGJpZGlfc2RiKTsKKwkJa21lbV9jYWNoZV9mcmVlKHNjc2lfc2RiX2NhY2hlLCBiaWRpX3NkYik7CisJCWNtZC0+cmVxdWVzdC0+bmV4dF9ycS0+c3BlY2lhbCA9IE5VTEw7CisJfQorCisJaWYgKHNjc2lfcHJvdF9zZ19jb3VudChjbWQpKQorCQlzY3NpX2ZyZWVfc2d0YWJsZShjbWQtPnByb3Rfc2RiKTsKK30KKwogLyoKICAqIEZ1bmN0aW9uOiAgICBzY3NpX3JlbGVhc2VfYnVmZmVycygpCiAgKgpAQCAtODE3LDIxICs4NTgsNyBAQAogICovCiB2b2lkIHNjc2lfcmVsZWFzZV9idWZmZXJzKHN0cnVjdCBzY3NpX2NtbmQgKmNtZCkKIHsKLQlpZiAoY21kLT5zZGIudGFibGUubmVudHMpCi0JCXNjc2lfZnJlZV9zZ3RhYmxlKCZjbWQtPnNkYik7Ci0KLQltZW1zZXQoJmNtZC0+c2RiLCAwLCBzaXplb2YoY21kLT5zZGIpKTsKLQotCWlmIChzY3NpX2JpZGlfY21uZChjbWQpKSB7Ci0JCXN0cnVjdCBzY3NpX2RhdGFfYnVmZmVyICpiaWRpX3NkYiA9Ci0JCQljbWQtPnJlcXVlc3QtPm5leHRfcnEtPnNwZWNpYWw7Ci0JCXNjc2lfZnJlZV9zZ3RhYmxlKGJpZGlfc2RiKTsKLQkJa21lbV9jYWNoZV9mcmVlKHNjc2lfc2RiX2NhY2hlLCBiaWRpX3NkYik7Ci0JCWNtZC0+cmVxdWVzdC0+bmV4dF9ycS0+c3BlY2lhbCA9IE5VTEw7Ci0JfQotCi0JaWYgKHNjc2lfcHJvdF9zZ19jb3VudChjbWQpKQotCQlzY3NpX2ZyZWVfc2d0YWJsZShjbWQtPnByb3Rfc2RiKTsKKwlfX3Njc2lfcmVsZWFzZV9idWZmZXJzKGNtZCwgMSk7CiB9CiBFWFBPUlRfU1lNQk9MKHNjc2lfcmVsZWFzZV9idWZmZXJzKTsKIApAQCAtOTQ1LDcgKzk3Miw2IEBACiAJfQogCiAJQlVHX09OKGJsa19iaWRpX3JxKHJlcSkpOyAvKiBiaWRpIG5vdCBzdXBwb3J0IGZvciAhYmxrX3BjX3JlcXVlc3QgeWV0ICovCi0Jc2NzaV9yZWxlYXNlX2J1ZmZlcnMoY21kKTsKIAogCS8qCiAJICogTmV4dCBkZWFsIHdpdGggYW55IHNlY3RvcnMgd2hpY2ggd2Ugd2VyZSBhYmxlIHRvIGNvcnJlY3RseQpAQCAtOTYzLDYgKzk4OSw4IEBACiAJCXJldHVybjsKIAl0aGlzX2NvdW50ID0gYmxrX3JxX2J5dGVzKHJlcSk7CiAKKwllcnJvciA9IC1FSU87CisKIAlpZiAoaG9zdF9ieXRlKHJlc3VsdCkgPT0gRElEX1JFU0VUKSB7CiAJCS8qIFRoaXJkIHBhcnR5IGJ1cyByZXNldCBvciByZXNldCBmb3IgZXJyb3IgcmVjb3ZlcnkKIAkJICogcmVhc29ucy4gIEp1c3QgcmV0cnkgdGhlIGNvbW1hbmQgYW5kIHNlZSB3aGF0CkBAIC0xMDA0LDEzICsxMDMyLDE4IEBACiAJCQkJLyogVGhpcyB3aWxsIGlzc3VlIGEgbmV3IDYtYnl0ZSBjb21tYW5kLiAqLwogCQkJCWNtZC0+ZGV2aWNlLT51c2VfMTBfZm9yX3J3ID0gMDsKIAkJCQlhY3Rpb24gPSBBQ1RJT05fUkVQUkVQOworCQkJfSBlbHNlIGlmIChzc2hkci5hc2MgPT0gMHgxMCkgLyogRElYICovIHsKKwkJCQlkZXNjcmlwdGlvbiA9ICJIb3N0IERhdGEgSW50ZWdyaXR5IEZhaWx1cmUiOworCQkJCWFjdGlvbiA9IEFDVElPTl9GQUlMOworCQkJCWVycm9yID0gLUVJTFNFUTsKIAkJCX0gZWxzZQogCQkJCWFjdGlvbiA9IEFDVElPTl9GQUlMOwogCQkJYnJlYWs7CiAJCWNhc2UgQUJPUlRFRF9DT01NQU5EOgogCQkJaWYgKHNzaGRyLmFzYyA9PSAweDEwKSB7IC8qIERJRiAqLworCQkJCWRlc2NyaXB0aW9uID0gIlRhcmdldCBEYXRhIEludGVncml0eSBGYWlsdXJlIjsKIAkJCQlhY3Rpb24gPSBBQ1RJT05fRkFJTDsKLQkJCQlkZXNjcmlwdGlvbiA9ICJEYXRhIEludGVncml0eSBGYWlsdXJlIjsKKwkJCQllcnJvciA9IC1FSUxTRVE7CiAJCQl9IGVsc2UKIAkJCQlhY3Rpb24gPSBBQ1RJT05fUkVUUlk7CiAJCQlicmVhazsKQEAgLTEwMjksNiArMTA2MiwxMCBAQAogCQkJCWNhc2UgMHgwOTogLyogc2VsZiB0ZXN0IGluIHByb2dyZXNzICovCiAJCQkJCWFjdGlvbiA9IEFDVElPTl9ERUxBWUVEX1JFVFJZOwogCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0OgorCQkJCQlkZXNjcmlwdGlvbiA9ICJEZXZpY2Ugbm90IHJlYWR5IjsKKwkJCQkJYWN0aW9uID0gQUNUSU9OX0ZBSUw7CisJCQkJCWJyZWFrOwogCQkJCX0KIAkJCX0gZWxzZSB7CiAJCQkJZGVzY3JpcHRpb24gPSAiRGV2aWNlIG5vdCByZWFkeSI7CkBAIC0xMDUyLDkgKzEwODksMTAgQEAKIAlzd2l0Y2ggKGFjdGlvbikgewogCWNhc2UgQUNUSU9OX0ZBSUw6CiAJCS8qIEdpdmUgdXAgYW5kIGZhaWwgdGhlIHJlbWFpbmRlciBvZiB0aGUgcmVxdWVzdCAqLworCQlzY3NpX3JlbGVhc2VfYnVmZmVycyhjbWQpOwogCQlpZiAoIShyZXEtPmNtZF9mbGFncyAmIFJFUV9RVUlFVCkpIHsKIAkJCWlmIChkZXNjcmlwdGlvbikKLQkJCQlzY21kX3ByaW50ayhLRVJOX0lORk8sIGNtZCwgIiVzIiwKKwkJCQlzY21kX3ByaW50ayhLRVJOX0lORk8sIGNtZCwgIiVzXG4iLAogCQkJCQkgICAgZGVzY3JpcHRpb24pOwogCQkJc2NzaV9wcmludF9yZXN1bHQoY21kKTsKIAkJCWlmIChkcml2ZXJfYnl0ZShyZXN1bHQpICYgRFJJVkVSX1NFTlNFKQpAQCAtMTA2NywxNSArMTEwNSwxNiBAQAogCQkvKiBVbnByZXAgdGhlIHJlcXVlc3QgYW5kIHB1dCBpdCBiYWNrIGF0IHRoZSBoZWFkIG9mIHRoZSBxdWV1ZS4KIAkJICogQSBuZXcgY29tbWFuZCB3aWxsIGJlIHByZXBhcmVkIGFuZCBpc3N1ZWQuCiAJCSAqLworCQlzY3NpX3JlbGVhc2VfYnVmZmVycyhjbWQpOwogCQlzY3NpX3JlcXVldWVfY29tbWFuZChxLCBjbWQpOwogCQlicmVhazsKIAljYXNlIEFDVElPTl9SRVRSWToKIAkJLyogUmV0cnkgdGhlIHNhbWUgY29tbWFuZCBpbW1lZGlhdGVseSAqLwotCQlzY3NpX3F1ZXVlX2luc2VydChjbWQsIFNDU0lfTUxRVUVVRV9FSF9SRVRSWSk7CisJCV9fc2NzaV9xdWV1ZV9pbnNlcnQoY21kLCBTQ1NJX01MUVVFVUVfRUhfUkVUUlksIDApOwogCQlicmVhazsKIAljYXNlIEFDVElPTl9ERUxBWUVEX1JFVFJZOgogCQkvKiBSZXRyeSB0aGUgc2FtZSBjb21tYW5kIGFmdGVyIGEgZGVsYXkgKi8KLQkJc2NzaV9xdWV1ZV9pbnNlcnQoY21kLCBTQ1NJX01MUVVFVUVfREVWSUNFX0JVU1kpOworCQlfX3Njc2lfcXVldWVfaW5zZXJ0KGNtZCwgU0NTSV9NTFFVRVVFX0RFVklDRV9CVVNZLCAwKTsKIAkJYnJlYWs7CiAJfQogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3Njc2lfc2Nhbi5jIGIvZHJpdmVycy9zY3NpL3Njc2lfc2Nhbi5jCmluZGV4IDE4NDg2YjUuLjY2NTA1YmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9zY3NpX3NjYW4uYworKysgYi9kcml2ZXJzL3Njc2kvc2NzaV9zY2FuLmMKQEAgLTMyLDYgKzMyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2FzeW5jLmg+CiAKICNpbmNsdWRlIDxzY3NpL3Njc2kuaD4KICNpbmNsdWRlIDxzY3NpL3Njc2lfY21uZC5oPgpAQCAtMTc5LDYgKzE4MCw4IEBACiAJc3Bpbl91bmxvY2soJmFzeW5jX3NjYW5fbG9jayk7CiAKIAlrZnJlZShkYXRhKTsKKwkvKiBTeW5jaHJvbml6ZSBhc3luYyBvcGVyYXRpb25zIGdsb2JhbGx5ICovCisJYXN5bmNfc3luY2hyb25pemVfZnVsbCgpOwogCXJldHVybiAwOwogfQogCkBAIC00MTEsOCArNDE0LDcgQEAKIAlkZXZpY2VfaW5pdGlhbGl6ZShkZXYpOwogCXN0YXJnZXQtPnJlYXBfcmVmID0gMTsKIAlkZXYtPnBhcmVudCA9IGdldF9kZXZpY2UocGFyZW50KTsKLQlzcHJpbnRmKGRldi0+YnVzX2lkLCAidGFyZ2V0JWQ6JWQ6JWQiLAotCQlzaG9zdC0+aG9zdF9ubywgY2hhbm5lbCwgaWQpOworCWRldl9zZXRfbmFtZShkZXYsICJ0YXJnZXQlZDolZDolZCIsIHNob3N0LT5ob3N0X25vLCBjaGFubmVsLCBpZCk7CiAjaWZuZGVmIENPTkZJR19TWVNGU19ERVBSRUNBVEVECiAJZGV2LT5idXMgPSAmc2NzaV9idXNfdHlwZTsKICNlbmRpZgpAQCAtMTAyMSw3ICsxMDIzLDcgQEAKIAkJaWYgKHJlc2NhbiB8fCAhc2NzaV9kZXZpY2VfY3JlYXRlZChzZGV2KSkgewogCQkJU0NTSV9MT0dfU0NBTl9CVVMoMywgcHJpbnRrKEtFUk5fSU5GTwogCQkJCSJzY3NpIHNjYW46IGRldmljZSBleGlzdHMgb24gJXNcbiIsCi0JCQkJc2Rldi0+c2Rldl9nZW5kZXYuYnVzX2lkKSk7CisJCQkJZGV2X25hbWUoJnNkZXYtPnNkZXZfZ2VuZGV2KSkpOwogCQkJaWYgKHNkZXZwKQogCQkJCSpzZGV2cCA9IHNkZXY7CiAJCQllbHNlCkBAIC0xMTYwLDcgKzExNjIsNyBAQAogCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gZGV2X3RvX3Nob3N0KHN0YXJnZXQtPmRldi5wYXJlbnQpOwogCiAJU0NTSV9MT0dfU0NBTl9CVVMoMywgcHJpbnRrKEtFUk5fSU5GTyAic2NzaSBzY2FuOiBTZXF1ZW50aWFsIHNjYW4gb2YiCi0JCQkJICAgICIlc1xuIiwgc3RhcmdldC0+ZGV2LmJ1c19pZCkpOworCQkJCSAgICAiJXNcbiIsIGRldl9uYW1lKCZzdGFyZ2V0LT5kZXYpKSk7CiAKIAltYXhfZGV2X2x1biA9IG1pbihtYXhfc2NzaV9sdW5zLCBzaG9zdC0+bWF4X2x1bik7CiAJLyoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zY3NpX3N5c2ZzLmMgYi9kcml2ZXJzL3Njc2kvc2NzaV9zeXNmcy5jCmluZGV4IDkzYzI4ZjMuLmRhNjM4MDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9zY3NpX3N5c2ZzLmMKKysrIGIvZHJpdmVycy9zY3NpL3Njc2lfc3lzZnMuYwpAQCAtMTA3OSwxNiArMTA3OSwxNCBAQAogCWRldmljZV9pbml0aWFsaXplKCZzZGV2LT5zZGV2X2dlbmRldik7CiAJc2Rldi0+c2Rldl9nZW5kZXYuYnVzID0gJnNjc2lfYnVzX3R5cGU7CiAJc2Rldi0+c2Rldl9nZW5kZXYudHlwZSA9ICZzY3NpX2Rldl90eXBlOwotCXNwcmludGYoc2Rldi0+c2Rldl9nZW5kZXYuYnVzX2lkLCIlZDolZDolZDolZCIsCi0JCXNkZXYtPmhvc3QtPmhvc3Rfbm8sIHNkZXYtPmNoYW5uZWwsIHNkZXYtPmlkLAotCQlzZGV2LT5sdW4pOwotCQorCWRldl9zZXRfbmFtZSgmc2Rldi0+c2Rldl9nZW5kZXYsICIlZDolZDolZDolZCIsCisJCSAgICAgc2Rldi0+aG9zdC0+aG9zdF9ubywgc2Rldi0+Y2hhbm5lbCwgc2Rldi0+aWQsIHNkZXYtPmx1bik7CisKIAlkZXZpY2VfaW5pdGlhbGl6ZSgmc2Rldi0+c2Rldl9kZXYpOwogCXNkZXYtPnNkZXZfZGV2LnBhcmVudCA9ICZzZGV2LT5zZGV2X2dlbmRldjsKIAlzZGV2LT5zZGV2X2Rldi5jbGFzcyA9ICZzZGV2X2NsYXNzOwotCXNucHJpbnRmKHNkZXYtPnNkZXZfZGV2LmJ1c19pZCwgQlVTX0lEX1NJWkUsCi0JCSAiJWQ6JWQ6JWQ6JWQiLCBzZGV2LT5ob3N0LT5ob3N0X25vLAotCQkgc2Rldi0+Y2hhbm5lbCwgc2Rldi0+aWQsIHNkZXYtPmx1bik7CisJZGV2X3NldF9uYW1lKCZzZGV2LT5zZGV2X2RldiwgIiVkOiVkOiVkOiVkIiwKKwkJICAgICBzZGV2LT5ob3N0LT5ob3N0X25vLCBzZGV2LT5jaGFubmVsLCBzZGV2LT5pZCwgc2Rldi0+bHVuKTsKIAlzZGV2LT5zY3NpX2xldmVsID0gc3RhcmdldC0+c2NzaV9sZXZlbDsKIAl0cmFuc3BvcnRfc2V0dXBfZGV2aWNlKCZzZGV2LT5zZGV2X2dlbmRldik7CiAJc3Bpbl9sb2NrX2lycXNhdmUoc2hvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3Njc2lfdHJhbnNwb3J0X2ZjLmMgYi9kcml2ZXJzL3Njc2kvc2NzaV90cmFuc3BvcnRfZmMuYwppbmRleCAwNjIzMDRkLi41Zjc3NDE3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvc2NzaV90cmFuc3BvcnRfZmMuYworKysgYi9kcml2ZXJzL3Njc2kvc2NzaV90cmFuc3BvcnRfZmMuYwpAQCAtMjQwNyw4ICsyNDA3LDEyIEBACiAJLyoKIAkgKiBOb3RpZnkgdGhlIGRyaXZlciB0aGF0IHRoZSBycG9ydCBpcyBub3cgZGVhZC4gVGhlIExMREQgd2lsbAogCSAqIGFsc28gZ3VhcmFudGVlIHRoYXQgYW55IGNvbW11bmljYXRpb24gdG8gdGhlIHJwb3J0IGlzIHRlcm1pbmF0ZWQKKwkgKgorCSAqIEF2b2lkIHRoaXMgY2FsbCBpZiB3ZSBhbHJlYWR5IGNhbGxlZCBpdCB3aGVuIHdlIHByZXNlcnZlZCB0aGUKKwkgKiBycG9ydCBmb3IgdGhlIGJpbmRpbmcuCiAJICovCi0JaWYgKGktPmYtPmRldl9sb3NzX3Rtb19jYWxsYmspCisJaWYgKCEocnBvcnQtPmZsYWdzICYgRkNfUlBPUlRfREVWTE9TU19DQUxMQktfRE9ORSkgJiYKKwkgICAgKGktPmYtPmRldl9sb3NzX3Rtb19jYWxsYmspKQogCQlpLT5mLT5kZXZfbG9zc190bW9fY2FsbGJrKHJwb3J0KTsKIAogCXRyYW5zcG9ydF9yZW1vdmVfZGV2aWNlKGRldik7CkBAIC0yNDg2LDggKzI0OTAsOCBAQAogCWRldmljZV9pbml0aWFsaXplKGRldik7CQkJLyogdGFrZXMgc2VsZiByZWZlcmVuY2UgKi8KIAlkZXYtPnBhcmVudCA9IGdldF9kZXZpY2UoJnNob3N0LT5zaG9zdF9nZW5kZXYpOyAvKiBwYXJlbnQgcmVmZXJlbmNlICovCiAJZGV2LT5yZWxlYXNlID0gZmNfcnBvcnRfZGV2X3JlbGVhc2U7Ci0Jc3ByaW50ZihkZXYtPmJ1c19pZCwgInJwb3J0LSVkOiVkLSVkIiwKLQkJc2hvc3QtPmhvc3Rfbm8sIGNoYW5uZWwsIHJwb3J0LT5udW1iZXIpOworCWRldl9zZXRfbmFtZShkZXYsICJycG9ydC0lZDolZC0lZCIsCisJCSAgICAgc2hvc3QtPmhvc3Rfbm8sIGNoYW5uZWwsIHJwb3J0LT5udW1iZXIpOwogCXRyYW5zcG9ydF9zZXR1cF9kZXZpY2UoZGV2KTsKIAogCWVycm9yID0gZGV2aWNlX2FkZChkZXYpOwpAQCAtMjY0Nyw3ICsyNjUxLDggQEAKIAkJCQlzcGluX2xvY2tfaXJxc2F2ZShzaG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CiAKIAkJCQlycG9ydC0+ZmxhZ3MgJj0gfihGQ19SUE9SVF9GQVNUX0ZBSUxfVElNRURPVVQgfAotCQkJCQkJICBGQ19SUE9SVF9ERVZMT1NTX1BFTkRJTkcpOworCQkJCQkJICBGQ19SUE9SVF9ERVZMT1NTX1BFTkRJTkcgfAorCQkJCQkJICBGQ19SUE9SVF9ERVZMT1NTX0NBTExCS19ET05FKTsKIAogCQkJCS8qIGlmIHRhcmdldCwgaW5pdGlhdGUgYSBzY2FuICovCiAJCQkJaWYgKHJwb3J0LT5zY3NpX3RhcmdldF9pZCAhPSAtMSkgewpAQCAtMjk0NCw2ICsyOTQ5LDcgQEAKIAlzdHJ1Y3QgZmNfcnBvcnQgKnJwb3J0ID0KIAkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBmY19ycG9ydCwgZGV2X2xvc3Nfd29yay53b3JrKTsKIAlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IHJwb3J0X3RvX3Nob3N0KHJwb3J0KTsKKwlzdHJ1Y3QgZmNfaW50ZXJuYWwgKmkgPSB0b19mY19pbnRlcm5hbChzaG9zdC0+dHJhbnNwb3J0dCk7CiAJc3RydWN0IGZjX2hvc3RfYXR0cnMgKmZjX2hvc3QgPSBzaG9zdF90b19mY19ob3N0KHNob3N0KTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCkBAIC0zMDExLDYgKzMwMTcsNyBAQAogCXJwb3J0LT5yb2xlcyA9IEZDX1BPUlRfUk9MRV9VTktOT1dOOwogCXJwb3J0LT5wb3J0X3N0YXRlID0gRkNfUE9SVFNUQVRFX05PVFBSRVNFTlQ7CiAJcnBvcnQtPmZsYWdzICY9IH5GQ19SUE9SVF9GQVNUX0ZBSUxfVElNRURPVVQ7CisJcnBvcnQtPmZsYWdzIHw9IEZDX1JQT1JUX0RFVkxPU1NfQ0FMTEJLX0RPTkU7CiAKIAkvKgogCSAqIFByZS1lbXB0aXZlbHkga2lsbCBJL08gcmF0aGVyIHRoYW4gd2FpdGluZyBmb3IgdGhlIHdvcmsgcXVldWUKQEAgLTMwNDYsOCArMzA1MywxOCBAQAogCSAqIGFsbCBhdHRhY2hlZCBzY3NpIGRldmljZXMuCiAJICovCiAJZmNfcXVldWVfd29yayhzaG9zdCwgJnJwb3J0LT5zdGd0X2RlbGV0ZV93b3JrKTsKKworCS8qCisJICogTm90aWZ5IHRoZSBkcml2ZXIgdGhhdCB0aGUgcnBvcnQgaXMgbm93IGRlYWQuIFRoZSBMTEREIHdpbGwKKwkgKiBhbHNvIGd1YXJhbnRlZSB0aGF0IGFueSBjb21tdW5pY2F0aW9uIHRvIHRoZSBycG9ydCBpcyB0ZXJtaW5hdGVkCisJICoKKwkgKiBOb3RlOiB3ZSBzZXQgdGhlIENBTExCS19ET05FIGZsYWcgYWJvdmUgdG8gY29ycmVzcG9uZAorCSAqLworCWlmIChpLT5mLT5kZXZfbG9zc190bW9fY2FsbGJrKQorCQlpLT5mLT5kZXZfbG9zc190bW9fY2FsbGJrKHJwb3J0KTsKIH0KIAorCiAvKioKICAqIGZjX3RpbWVvdXRfZmFpbF9ycG9ydF9pbyAtIFRpbWVvdXQgaGFuZGxlciBmb3IgYSBmYXN0IGlvIGZhaWxpbmcgb24gYSBkaXNjb25uZWN0ZWQgU0NTSSB0YXJnZXQuCiAgKiBAd29yazoJcnBvcnQgdG8gdGVybWluYXRlIGlvIG9uLgpAQCAtMzE2NCw4ICszMTgxLDggQEAKIAlkZXZpY2VfaW5pdGlhbGl6ZShkZXYpOwkJCS8qIHRha2VzIHNlbGYgcmVmZXJlbmNlICovCiAJZGV2LT5wYXJlbnQgPSBnZXRfZGV2aWNlKHBkZXYpOwkJLyogdGFrZXMgcGFyZW50IHJlZmVyZW5jZSAqLwogCWRldi0+cmVsZWFzZSA9IGZjX3Zwb3J0X2Rldl9yZWxlYXNlOwotCXNwcmludGYoZGV2LT5idXNfaWQsICJ2cG9ydC0lZDolZC0lZCIsCi0JCXNob3N0LT5ob3N0X25vLCBjaGFubmVsLCB2cG9ydC0+bnVtYmVyKTsKKwlkZXZfc2V0X25hbWUoZGV2LCAidnBvcnQtJWQ6JWQtJWQiLAorCQkgICAgIHNob3N0LT5ob3N0X25vLCBjaGFubmVsLCB2cG9ydC0+bnVtYmVyKTsKIAl0cmFuc3BvcnRfc2V0dXBfZGV2aWNlKGRldik7CiAKIAllcnJvciA9IGRldmljZV9hZGQoZGV2KTsKQEAgLTMxODgsMTkgKzMyMDUsMTkgQEAKIAkgKi8KIAlpZiAocGRldiAhPSAmc2hvc3QtPnNob3N0X2dlbmRldikgewogCQllcnJvciA9IHN5c2ZzX2NyZWF0ZV9saW5rKCZzaG9zdC0+c2hvc3RfZ2VuZGV2LmtvYmosCi0JCQkJICZkZXYtPmtvYmosIGRldi0+YnVzX2lkKTsKKwkJCQkgJmRldi0+a29iaiwgZGV2X25hbWUoZGV2KSk7CiAJCWlmIChlcnJvcikKIAkJCXByaW50ayhLRVJOX0VSUgogCQkJCSIlczogQ2Fubm90IGNyZWF0ZSB2cG9ydCBzeW1saW5rcyBmb3IgIgogCQkJCSIlcywgZXJyPSVkXG4iLAotCQkJCV9fZnVuY19fLCBkZXYtPmJ1c19pZCwgZXJyb3IpOworCQkJCV9fZnVuY19fLCBkZXZfbmFtZShkZXYpLCBlcnJvcik7CiAJfQogCXNwaW5fbG9ja19pcnFzYXZlKHNob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKIAl2cG9ydC0+ZmxhZ3MgJj0gfkZDX1ZQT1JUX0NSRUFUSU5HOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoc2hvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOwogCiAJZGV2X3ByaW50ayhLRVJOX05PVElDRSwgcGRldiwKLQkJCSIlcyBjcmVhdGVkIHZpYSBzaG9zdCVkIGNoYW5uZWwgJWRcbiIsIGRldi0+YnVzX2lkLAorCQkJIiVzIGNyZWF0ZWQgdmlhIHNob3N0JWQgY2hhbm5lbCAlZFxuIiwgZGV2X25hbWUoZGV2KSwKIAkJCXNob3N0LT5ob3N0X25vLCBjaGFubmVsKTsKIAogCSpyZXRfdnBvcnQgPSB2cG9ydDsKQEAgLTMyOTcsNyArMzMxNCw3IEBACiAJCXJldHVybiBzdGF0OwogCiAJaWYgKGRldi0+cGFyZW50ICE9ICZzaG9zdC0+c2hvc3RfZ2VuZGV2KQotCQlzeXNmc19yZW1vdmVfbGluaygmc2hvc3QtPnNob3N0X2dlbmRldi5rb2JqLCBkZXYtPmJ1c19pZCk7CisJCXN5c2ZzX3JlbW92ZV9saW5rKCZzaG9zdC0+c2hvc3RfZ2VuZGV2LmtvYmosIGRldl9uYW1lKGRldikpOwogCXRyYW5zcG9ydF9yZW1vdmVfZGV2aWNlKGRldik7CiAJZGV2aWNlX2RlbChkZXYpOwogCXRyYW5zcG9ydF9kZXN0cm95X2RldmljZShkZXYpOwpAQCAtMzMyOSw3ICszMzQ2LDcgQEAKIAkJZGV2X3ByaW50ayhLRVJOX0VSUiwgdnBvcnQtPmRldi5wYXJlbnQsCiAJCQkiJXM6ICVzIGNvdWxkIG5vdCBiZSBkZWxldGVkIGNyZWF0ZWQgdmlhICIKIAkJCSJzaG9zdCVkIGNoYW5uZWwgJWQgLSBlcnJvciAlZFxuIiwgX19mdW5jX18sCi0JCQl2cG9ydC0+ZGV2LmJ1c19pZCwgdnBvcnQtPnNob3N0LT5ob3N0X25vLAorCQkJZGV2X25hbWUoJnZwb3J0LT5kZXYpLCB2cG9ydC0+c2hvc3QtPmhvc3Rfbm8sCiAJCQl2cG9ydC0+Y2hhbm5lbCwgc3RhdCk7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zY3NpX3RyYW5zcG9ydF9pc2NzaS5jIGIvZHJpdmVycy9zY3NpL3Njc2lfdHJhbnNwb3J0X2lzY3NpLmMKaW5kZXggNGE4MDNlYi4uNzVjOTI5NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3Njc2lfdHJhbnNwb3J0X2lzY3NpLmMKKysrIGIvZHJpdmVycy9zY3NpL3Njc2lfdHJhbnNwb3J0X2lzY3NpLmMKQEAgLTE4Nyw4ICsxODcsNyBAQAogCiAJZXAtPmlkID0gaWQ7CiAJZXAtPmRldi5jbGFzcyA9ICZpc2NzaV9lbmRwb2ludF9jbGFzczsKLQlzbnByaW50ZihlcC0+ZGV2LmJ1c19pZCwgQlVTX0lEX1NJWkUsICJlcC0lbGx1IiwKLQkJICh1bnNpZ25lZCBsb25nIGxvbmcpIGlkKTsKKwlkZXZfc2V0X25hbWUoJmVwLT5kZXYsICJlcC0lbGx1IiwgKHVuc2lnbmVkIGxvbmcgbG9uZykgaWQpOwogCWVyciA9IGRldmljZV9yZWdpc3RlcigmZXAtPmRldik7CiAgICAgICAgIGlmIChlcnIpCiAgICAgICAgICAgICAgICAgZ290byBmcmVlX2VwOwpAQCAtNzI0LDggKzcyMyw3IEBACiAJfQogCXNlc3Npb24tPnRhcmdldF9pZCA9IGlkOwogCi0Jc25wcmludGYoc2Vzc2lvbi0+ZGV2LmJ1c19pZCwgQlVTX0lEX1NJWkUsICJzZXNzaW9uJXUiLAotCQkgc2Vzc2lvbi0+c2lkKTsKKwlkZXZfc2V0X25hbWUoJnNlc3Npb24tPmRldiwgInNlc3Npb24ldSIsIHNlc3Npb24tPnNpZCk7CiAJZXJyID0gZGV2aWNlX2FkZCgmc2Vzc2lvbi0+ZGV2KTsKIAlpZiAoZXJyKSB7CiAJCWlzY3NpX2Nsc19zZXNzaW9uX3ByaW50ayhLRVJOX0VSUiwgc2Vzc2lvbiwKQEAgLTg5OCw4ICs4OTYsNyBAQAogCWlmICghZ2V0X2RldmljZSgmc2Vzc2lvbi0+ZGV2KSkKIAkJZ290byBmcmVlX2Nvbm47CiAKLQlzbnByaW50Zihjb25uLT5kZXYuYnVzX2lkLCBCVVNfSURfU0laRSwgImNvbm5lY3Rpb24lZDoldSIsCi0JCSBzZXNzaW9uLT5zaWQsIGNpZCk7CisJZGV2X3NldF9uYW1lKCZjb25uLT5kZXYsICJjb25uZWN0aW9uJWQ6JXUiLCBzZXNzaW9uLT5zaWQsIGNpZCk7CiAJY29ubi0+ZGV2LnBhcmVudCA9ICZzZXNzaW9uLT5kZXY7CiAJY29ubi0+ZGV2LnJlbGVhc2UgPSBpc2NzaV9jb25uX3JlbGVhc2U7CiAJZXJyID0gZGV2aWNlX3JlZ2lzdGVyKCZjb25uLT5kZXYpOwpAQCAtMTgxNiw3ICsxODEzLDcgQEAKIAkJcHJpdi0+dC5jcmVhdGVfd29ya19xdWV1ZSA9IDE7CiAKIAlwcml2LT5kZXYuY2xhc3MgPSAmaXNjc2lfdHJhbnNwb3J0X2NsYXNzOwotCXNucHJpbnRmKHByaXYtPmRldi5idXNfaWQsIEJVU19JRF9TSVpFLCAiJXMiLCB0dC0+bmFtZSk7CisJZGV2X3NldF9uYW1lKCZwcml2LT5kZXYsICIlcyIsIHR0LT5uYW1lKTsKIAllcnIgPSBkZXZpY2VfcmVnaXN0ZXIoJnByaXYtPmRldik7CiAJaWYgKGVycikKIAkJZ290byBmcmVlX3ByaXY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc2NzaV90cmFuc3BvcnRfc2FzLmMgYi9kcml2ZXJzL3Njc2kvc2NzaV90cmFuc3BvcnRfc2FzLmMKaW5kZXggMzY2NjA5My4uNTA5ODhjYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3Njc2lfdHJhbnNwb3J0X3Nhcy5jCisrKyBiL2RyaXZlcnMvc2NzaS9zY3NpX3RyYW5zcG9ydF9zYXMuYwpAQCAtMjA3LDcgKzIwNyw3IEBACiAJc3RydWN0IHJlcXVlc3RfcXVldWUgKnE7CiAJaW50IGVycm9yOwogCXN0cnVjdCBkZXZpY2UgKmRldjsKLQljaGFyIG5hbWVidWZbQlVTX0lEX1NJWkVdOworCWNoYXIgbmFtZWJ1ZlsyMF07CiAJY29uc3QgY2hhciAqbmFtZTsKIAl2b2lkICgqcmVsZWFzZSkoc3RydWN0IGRldmljZSAqKTsKIApAQCAtMjE5LDcgKzIxOSw3IEBACiAJaWYgKHJwaHkpIHsKIAkJcSA9IGJsa19pbml0X3F1ZXVlKHNhc19ub25faG9zdF9zbXBfcmVxdWVzdCwgTlVMTCk7CiAJCWRldiA9ICZycGh5LT5kZXY7Ci0JCW5hbWUgPSBkZXYtPmJ1c19pZDsKKwkJbmFtZSA9IGRldl9uYW1lKGRldik7CiAJCXJlbGVhc2UgPSBOVUxMOwogCX0gZWxzZSB7CiAJCXEgPSBibGtfaW5pdF9xdWV1ZShzYXNfaG9zdF9zbXBfcmVxdWVzdCwgTlVMTCk7CkBAIC02MjksMTAgKzYyOSwxMCBAQAogCUlOSVRfTElTVF9IRUFEKCZwaHktPnBvcnRfc2libGluZ3MpOwogCWlmIChzY3NpX2lzX3Nhc19leHBhbmRlcl9kZXZpY2UocGFyZW50KSkgewogCQlzdHJ1Y3Qgc2FzX3JwaHkgKnJwaHkgPSBkZXZfdG9fcnBoeShwYXJlbnQpOwotCQlzcHJpbnRmKHBoeS0+ZGV2LmJ1c19pZCwgInBoeS0lZDolZDolZCIsIHNob3N0LT5ob3N0X25vLAorCQlkZXZfc2V0X25hbWUoJnBoeS0+ZGV2LCAicGh5LSVkOiVkOiVkIiwgc2hvc3QtPmhvc3Rfbm8sCiAJCQlycGh5LT5zY3NpX3RhcmdldF9pZCwgbnVtYmVyKTsKIAl9IGVsc2UKLQkJc3ByaW50ZihwaHktPmRldi5idXNfaWQsICJwaHktJWQ6JWQiLCBzaG9zdC0+aG9zdF9ubywgbnVtYmVyKTsKKwkJZGV2X3NldF9uYW1lKCZwaHktPmRldiwgInBoeS0lZDolZCIsIHNob3N0LT5ob3N0X25vLCBudW1iZXIpOwogCiAJdHJhbnNwb3J0X3NldHVwX2RldmljZSgmcGh5LT5kZXYpOwogCkBAIC03NzAsNyArNzcwLDcgQEAKIAlpbnQgcmVzOwogCiAJcmVzID0gc3lzZnNfY3JlYXRlX2xpbmsoJnBvcnQtPmRldi5rb2JqLCAmcGh5LT5kZXYua29iaiwKLQkJCQlwaHktPmRldi5idXNfaWQpOworCQkJCWRldl9uYW1lKCZwaHktPmRldikpOwogCWlmIChyZXMpCiAJCWdvdG8gZXJyOwogCXJlcyA9IHN5c2ZzX2NyZWF0ZV9saW5rKCZwaHktPmRldi5rb2JqLCAmcG9ydC0+ZGV2LmtvYmosICJwb3J0Iik7CkBAIC03ODUsNyArNzg1LDcgQEAKIHN0YXRpYyB2b2lkIHNhc19wb3J0X2RlbGV0ZV9saW5rKHN0cnVjdCBzYXNfcG9ydCAqcG9ydCwKIAkJCQkgc3RydWN0IHNhc19waHkgKnBoeSkKIHsKLQlzeXNmc19yZW1vdmVfbGluaygmcG9ydC0+ZGV2LmtvYmosIHBoeS0+ZGV2LmJ1c19pZCk7CisJc3lzZnNfcmVtb3ZlX2xpbmsoJnBvcnQtPmRldi5rb2JqLCBkZXZfbmFtZSgmcGh5LT5kZXYpKTsKIAlzeXNmc19yZW1vdmVfbGluaygmcGh5LT5kZXYua29iaiwgInBvcnQiKTsKIH0KIApAQCAtODIxLDExICs4MjEsMTEgQEAKIAogCWlmIChzY3NpX2lzX3Nhc19leHBhbmRlcl9kZXZpY2UocGFyZW50KSkgewogCQlzdHJ1Y3Qgc2FzX3JwaHkgKnJwaHkgPSBkZXZfdG9fcnBoeShwYXJlbnQpOwotCQlzcHJpbnRmKHBvcnQtPmRldi5idXNfaWQsICJwb3J0LSVkOiVkOiVkIiwgc2hvc3QtPmhvc3Rfbm8sCi0JCQlycGh5LT5zY3NpX3RhcmdldF9pZCwgcG9ydC0+cG9ydF9pZGVudGlmaWVyKTsKKwkJZGV2X3NldF9uYW1lKCZwb3J0LT5kZXYsICJwb3J0LSVkOiVkOiVkIiwgc2hvc3QtPmhvc3Rfbm8sCisJCQkgICAgIHJwaHktPnNjc2lfdGFyZ2V0X2lkLCBwb3J0LT5wb3J0X2lkZW50aWZpZXIpOwogCX0gZWxzZQotCQlzcHJpbnRmKHBvcnQtPmRldi5idXNfaWQsICJwb3J0LSVkOiVkIiwgc2hvc3QtPmhvc3Rfbm8sCi0JCQlwb3J0LT5wb3J0X2lkZW50aWZpZXIpOworCQlkZXZfc2V0X25hbWUoJnBvcnQtPmRldiwgInBvcnQtJWQ6JWQiLCBzaG9zdC0+aG9zdF9ubywKKwkJCSAgICAgcG9ydC0+cG9ydF9pZGVudGlmaWVyKTsKIAogCXRyYW5zcG9ydF9zZXR1cF9kZXZpY2UoJnBvcnQtPmRldik7CiAKQEAgLTkzNSw3ICs5MzUsNyBAQAogCWlmIChwb3J0LT5pc19iYWNrbGluaykgewogCQlzdHJ1Y3QgZGV2aWNlICpwYXJlbnQgPSBwb3J0LT5kZXYucGFyZW50OwogCi0JCXN5c2ZzX3JlbW92ZV9saW5rKCZwb3J0LT5kZXYua29iaiwgcGFyZW50LT5idXNfaWQpOworCQlzeXNmc19yZW1vdmVfbGluaygmcG9ydC0+ZGV2LmtvYmosIGRldl9uYW1lKHBhcmVudCkpOwogCQlwb3J0LT5pc19iYWNrbGluayA9IDA7CiAJfQogCkBAIC05ODQsNyArOTg0LDggQEAKIAkJLyogSWYgdGhpcyB0cmlwcywgeW91IGFkZGVkIGEgcGh5IHRoYXQgd2FzIGFscmVhZHkKIAkJICogcGFydCBvZiBhIGRpZmZlcmVudCBwb3J0ICovCiAJCWlmICh1bmxpa2VseSh0bXAgIT0gcGh5KSkgewotCQkJZGV2X3ByaW50ayhLRVJOX0VSUiwgJnBvcnQtPmRldiwgInRyeWluZyB0byBhZGQgcGh5ICVzIGZhaWxzOiBpdCdzIGFscmVhZHkgcGFydCBvZiBhbm90aGVyIHBvcnRcbiIsIHBoeS0+ZGV2LmJ1c19pZCk7CisJCQlkZXZfcHJpbnRrKEtFUk5fRVJSLCAmcG9ydC0+ZGV2LCAidHJ5aW5nIHRvIGFkZCBwaHkgJXMgZmFpbHM6IGl0J3MgYWxyZWFkeSBwYXJ0IG9mIGFub3RoZXIgcG9ydFxuIiwKKwkJCQkgICBkZXZfbmFtZSgmcGh5LT5kZXYpKTsKIAkJCUJVRygpOwogCQl9CiAJfSBlbHNlIHsKQEAgLTEwMjMsNyArMTAyNCw3IEBACiAJCXJldHVybjsKIAlwb3J0LT5pc19iYWNrbGluayA9IDE7CiAJcmVzID0gc3lzZnNfY3JlYXRlX2xpbmsoJnBvcnQtPmRldi5rb2JqLCAmcGFyZW50LT5rb2JqLAotCQkJCXBhcmVudC0+YnVzX2lkKTsKKwkJCQlkZXZfbmFtZShwYXJlbnQpKTsKIAlpZiAocmVzKQogCQlnb3RvIGVycjsKIAlyZXR1cm47CkBAIC0xMzY3LDExICsxMzY4LDEyIEBACiAJcmRldi0+cnBoeS5kZXYucmVsZWFzZSA9IHNhc19lbmRfZGV2aWNlX3JlbGVhc2U7CiAJaWYgKHNjc2lfaXNfc2FzX2V4cGFuZGVyX2RldmljZShwYXJlbnQtPmRldi5wYXJlbnQpKSB7CiAJCXN0cnVjdCBzYXNfcnBoeSAqcnBoeSA9IGRldl90b19ycGh5KHBhcmVudC0+ZGV2LnBhcmVudCk7Ci0JCXNwcmludGYocmRldi0+cnBoeS5kZXYuYnVzX2lkLCAiZW5kX2RldmljZS0lZDolZDolZCIsCi0JCQlzaG9zdC0+aG9zdF9ubywgcnBoeS0+c2NzaV90YXJnZXRfaWQsIHBhcmVudC0+cG9ydF9pZGVudGlmaWVyKTsKKwkJZGV2X3NldF9uYW1lKCZyZGV2LT5ycGh5LmRldiwgImVuZF9kZXZpY2UtJWQ6JWQ6JWQiLAorCQkJICAgICBzaG9zdC0+aG9zdF9ubywgcnBoeS0+c2NzaV90YXJnZXRfaWQsCisJCQkgICAgIHBhcmVudC0+cG9ydF9pZGVudGlmaWVyKTsKIAl9IGVsc2UKLQkJc3ByaW50ZihyZGV2LT5ycGh5LmRldi5idXNfaWQsICJlbmRfZGV2aWNlLSVkOiVkIiwKLQkJCXNob3N0LT5ob3N0X25vLCBwYXJlbnQtPnBvcnRfaWRlbnRpZmllcik7CisJCWRldl9zZXRfbmFtZSgmcmRldi0+cnBoeS5kZXYsICJlbmRfZGV2aWNlLSVkOiVkIiwKKwkJCSAgICAgc2hvc3QtPmhvc3Rfbm8sIHBhcmVudC0+cG9ydF9pZGVudGlmaWVyKTsKIAlyZGV2LT5ycGh5LmlkZW50aWZ5LmRldmljZV90eXBlID0gU0FTX0VORF9ERVZJQ0U7CiAJc2FzX3JwaHlfaW5pdGlhbGl6ZSgmcmRldi0+cnBoeSk7CiAJdHJhbnNwb3J0X3NldHVwX2RldmljZSgmcmRldi0+cnBoeS5kZXYpOwpAQCAtMTQxMSw4ICsxNDEzLDggQEAKIAltdXRleF9sb2NrKCZzYXNfaG9zdC0+bG9jayk7CiAJcmRldi0+cnBoeS5zY3NpX3RhcmdldF9pZCA9IHNhc19ob3N0LT5uZXh0X2V4cGFuZGVyX2lkKys7CiAJbXV0ZXhfdW5sb2NrKCZzYXNfaG9zdC0+bG9jayk7Ci0Jc3ByaW50ZihyZGV2LT5ycGh5LmRldi5idXNfaWQsICJleHBhbmRlci0lZDolZCIsCi0JCXNob3N0LT5ob3N0X25vLCByZGV2LT5ycGh5LnNjc2lfdGFyZ2V0X2lkKTsKKwlkZXZfc2V0X25hbWUoJnJkZXYtPnJwaHkuZGV2LCAiZXhwYW5kZXItJWQ6JWQiLAorCQkgICAgIHNob3N0LT5ob3N0X25vLCByZGV2LT5ycGh5LnNjc2lfdGFyZ2V0X2lkKTsKIAlyZGV2LT5ycGh5LmlkZW50aWZ5LmRldmljZV90eXBlID0gdHlwZTsKIAlzYXNfcnBoeV9pbml0aWFsaXplKCZyZGV2LT5ycGh5KTsKIAl0cmFuc3BvcnRfc2V0dXBfZGV2aWNlKCZyZGV2LT5ycGh5LmRldik7CkBAIC0xNDQ1LDcgKzE0NDcsNyBAQAogCXRyYW5zcG9ydF9hZGRfZGV2aWNlKCZycGh5LT5kZXYpOwogCXRyYW5zcG9ydF9jb25maWd1cmVfZGV2aWNlKCZycGh5LT5kZXYpOwogCWlmIChzYXNfYnNnX2luaXRpYWxpemUoc2hvc3QsIHJwaHkpKQotCQlwcmludGsoImZhaWwgdG8gYSBic2cgZGV2aWNlICVzXG4iLCBycGh5LT5kZXYuYnVzX2lkKTsKKwkJcHJpbnRrKCJmYWlsIHRvIGEgYnNnIGRldmljZSAlc1xuIiwgZGV2X25hbWUoJnJwaHktPmRldikpOwogCiAKIAltdXRleF9sb2NrKCZzYXNfaG9zdC0+bG9jayk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc2NzaV90cmFuc3BvcnRfc3JwLmMgYi9kcml2ZXJzL3Njc2kvc2NzaV90cmFuc3BvcnRfc3JwLmMKaW5kZXggOGE3YWY5NS4uMjFhMDQ1ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3Njc2lfdHJhbnNwb3J0X3NycC5jCisrKyBiL2RyaXZlcnMvc2NzaS9zY3NpX3RyYW5zcG9ydF9zcnAuYwpAQCAtMjEyLDcgKzIxMiw3IEBACiAJcnBvcnQtPnJvbGVzID0gaWRzLT5yb2xlczsKIAogCWlkID0gYXRvbWljX2luY19yZXR1cm4oJnRvX3NycF9ob3N0X2F0dHJzKHNob3N0KS0+bmV4dF9wb3J0X2lkKTsKLQlzcHJpbnRmKHJwb3J0LT5kZXYuYnVzX2lkLCAicG9ydC0lZDolZCIsIHNob3N0LT5ob3N0X25vLCBpZCk7CisJZGV2X3NldF9uYW1lKCZycG9ydC0+ZGV2LCAicG9ydC0lZDolZCIsIHNob3N0LT5ob3N0X25vLCBpZCk7CiAKIAl0cmFuc3BvcnRfc2V0dXBfZGV2aWNlKCZycG9ydC0+ZGV2KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3NkLmMgYi9kcml2ZXJzL3Njc2kvc2QuYwppbmRleCA2MmIyOGQ1Li5kNTc1NjZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvc2QuYworKysgYi9kcml2ZXJzL3Njc2kvc2QuYwpAQCAtNDgsNiArNDgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmdfaGVscGVycy5oPgorI2luY2x1ZGUgPGxpbnV4L2FzeW5jLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KIAogI2luY2x1ZGUgPHNjc2kvc2NzaS5oPgpAQCAtMTgwMiw2ICsxODAzLDcxIEBACiAJcmV0dXJuIDA7CiB9CiAKKy8qCisgKiBUaGUgYXN5bmNocm9ub3VzIHBhcnQgb2Ygc2RfcHJvYmUKKyAqLworc3RhdGljIHZvaWQgc2RfcHJvYmVfYXN5bmModm9pZCAqZGF0YSwgYXN5bmNfY29va2llX3QgY29va2llKQoreworCXN0cnVjdCBzY3NpX2Rpc2sgKnNka3AgPSBkYXRhOworCXN0cnVjdCBzY3NpX2RldmljZSAqc2RwOworCXN0cnVjdCBnZW5kaXNrICpnZDsKKwl1MzIgaW5kZXg7CisJc3RydWN0IGRldmljZSAqZGV2OworCisJc2RwID0gc2RrcC0+ZGV2aWNlOworCWdkID0gc2RrcC0+ZGlzazsKKwlpbmRleCA9IHNka3AtPmluZGV4OworCWRldiA9ICZzZHAtPnNkZXZfZ2VuZGV2OworCisJaWYgKCFzZHAtPnJlcXVlc3RfcXVldWUtPnJxX3RpbWVvdXQpIHsKKwkJaWYgKHNkcC0+dHlwZSAhPSBUWVBFX01PRCkKKwkJCWJsa19xdWV1ZV9ycV90aW1lb3V0KHNkcC0+cmVxdWVzdF9xdWV1ZSwgU0RfVElNRU9VVCk7CisJCWVsc2UKKwkJCWJsa19xdWV1ZV9ycV90aW1lb3V0KHNkcC0+cmVxdWVzdF9xdWV1ZSwKKwkJCQkJICAgICBTRF9NT0RfVElNRU9VVCk7CisJfQorCisJZGV2aWNlX2luaXRpYWxpemUoJnNka3AtPmRldik7CisJc2RrcC0+ZGV2LnBhcmVudCA9ICZzZHAtPnNkZXZfZ2VuZGV2OworCXNka3AtPmRldi5jbGFzcyA9ICZzZF9kaXNrX2NsYXNzOworCWRldl9zZXRfbmFtZSgmc2RrcC0+ZGV2LCBkZXZfbmFtZSgmc2RwLT5zZGV2X2dlbmRldikpOworCisJaWYgKGRldmljZV9hZGQoJnNka3AtPmRldikpCisJCWdvdG8gb3V0X2ZyZWVfaW5kZXg7CisKKwlnZXRfZGV2aWNlKCZzZHAtPnNkZXZfZ2VuZGV2KTsKKworCWlmIChpbmRleCA8IFNEX01BWF9ESVNLUykgeworCQlnZC0+bWFqb3IgPSBzZF9tYWpvcigoaW5kZXggJiAweGYwKSA+PiA0KTsKKwkJZ2QtPmZpcnN0X21pbm9yID0gKChpbmRleCAmIDB4ZikgPDwgNCkgfCAoaW5kZXggJiAweGZmZjAwKTsKKwkJZ2QtPm1pbm9ycyA9IFNEX01JTk9SUzsKKwl9CisJZ2QtPmZvcHMgPSAmc2RfZm9wczsKKwlnZC0+cHJpdmF0ZV9kYXRhID0gJnNka3AtPmRyaXZlcjsKKwlnZC0+cXVldWUgPSBzZGtwLT5kZXZpY2UtPnJlcXVlc3RfcXVldWU7CisKKwlzZF9yZXZhbGlkYXRlX2Rpc2soZ2QpOworCisJYmxrX3F1ZXVlX3ByZXBfcnEoc2RwLT5yZXF1ZXN0X3F1ZXVlLCBzZF9wcmVwX2ZuKTsKKworCWdkLT5kcml2ZXJmc19kZXYgPSAmc2RwLT5zZGV2X2dlbmRldjsKKwlnZC0+ZmxhZ3MgPSBHRU5IRF9GTF9FWFRfREVWVCB8IEdFTkhEX0ZMX0RSSVZFUkZTOworCWlmIChzZHAtPnJlbW92YWJsZSkKKwkJZ2QtPmZsYWdzIHw9IEdFTkhEX0ZMX1JFTU9WQUJMRTsKKworCWRldl9zZXRfZHJ2ZGF0YShkZXYsIHNka3ApOworCWFkZF9kaXNrKGdkKTsKKwlzZF9kaWZfY29uZmlnX2hvc3Qoc2RrcCk7CisKKwlzZF9wcmludGsoS0VSTl9OT1RJQ0UsIHNka3AsICJBdHRhY2hlZCBTQ1NJICVzZGlza1xuIiwKKwkJICBzZHAtPnJlbW92YWJsZSA/ICJyZW1vdmFibGUgIiA6ICIiKTsKKworCXJldHVybjsKKworIG91dF9mcmVlX2luZGV4OgorCWlkYV9yZW1vdmUoJnNkX2luZGV4X2lkYSwgaW5kZXgpOworfQorCiAvKioKICAqCXNkX3Byb2JlIC0gY2FsbGVkIGR1cmluZyBkcml2ZXIgaW5pdGlhbGl6YXRpb24gYW5kIHdoZW5ldmVyIGEKICAqCW5ldyBzY3NpIGRldmljZSBpcyBhdHRhY2hlZCB0byB0aGUgc3lzdGVtLiBJdCBpcyBjYWxsZWQgb25jZQpAQCAtMTg2NSw0OCArMTkzMSw3IEBACiAJc2RrcC0+b3BlbmVycyA9IDA7CiAJc2RrcC0+cHJldmlvdXNfc3RhdGUgPSAxOwogCi0JaWYgKCFzZHAtPnJlcXVlc3RfcXVldWUtPnJxX3RpbWVvdXQpIHsKLQkJaWYgKHNkcC0+dHlwZSAhPSBUWVBFX01PRCkKLQkJCWJsa19xdWV1ZV9ycV90aW1lb3V0KHNkcC0+cmVxdWVzdF9xdWV1ZSwgU0RfVElNRU9VVCk7Ci0JCWVsc2UKLQkJCWJsa19xdWV1ZV9ycV90aW1lb3V0KHNkcC0+cmVxdWVzdF9xdWV1ZSwKLQkJCQkJICAgICBTRF9NT0RfVElNRU9VVCk7Ci0JfQotCi0JZGV2aWNlX2luaXRpYWxpemUoJnNka3AtPmRldik7Ci0Jc2RrcC0+ZGV2LnBhcmVudCA9ICZzZHAtPnNkZXZfZ2VuZGV2OwotCXNka3AtPmRldi5jbGFzcyA9ICZzZF9kaXNrX2NsYXNzOwotCXN0cm5jcHkoc2RrcC0+ZGV2LmJ1c19pZCwgc2RwLT5zZGV2X2dlbmRldi5idXNfaWQsIEJVU19JRF9TSVpFKTsKLQotCWlmIChkZXZpY2VfYWRkKCZzZGtwLT5kZXYpKQotCQlnb3RvIG91dF9mcmVlX2luZGV4OwotCi0JZ2V0X2RldmljZSgmc2RwLT5zZGV2X2dlbmRldik7Ci0KLQlpZiAoaW5kZXggPCBTRF9NQVhfRElTS1MpIHsKLQkJZ2QtPm1ham9yID0gc2RfbWFqb3IoKGluZGV4ICYgMHhmMCkgPj4gNCk7Ci0JCWdkLT5maXJzdF9taW5vciA9ICgoaW5kZXggJiAweGYpIDw8IDQpIHwgKGluZGV4ICYgMHhmZmYwMCk7Ci0JCWdkLT5taW5vcnMgPSBTRF9NSU5PUlM7Ci0JfQotCWdkLT5mb3BzID0gJnNkX2ZvcHM7Ci0JZ2QtPnByaXZhdGVfZGF0YSA9ICZzZGtwLT5kcml2ZXI7Ci0JZ2QtPnF1ZXVlID0gc2RrcC0+ZGV2aWNlLT5yZXF1ZXN0X3F1ZXVlOwotCi0Jc2RfcmV2YWxpZGF0ZV9kaXNrKGdkKTsKLQotCWJsa19xdWV1ZV9wcmVwX3JxKHNkcC0+cmVxdWVzdF9xdWV1ZSwgc2RfcHJlcF9mbik7Ci0KLQlnZC0+ZHJpdmVyZnNfZGV2ID0gJnNkcC0+c2Rldl9nZW5kZXY7Ci0JZ2QtPmZsYWdzID0gR0VOSERfRkxfRVhUX0RFVlQgfCBHRU5IRF9GTF9EUklWRVJGUzsKLQlpZiAoc2RwLT5yZW1vdmFibGUpCi0JCWdkLT5mbGFncyB8PSBHRU5IRF9GTF9SRU1PVkFCTEU7Ci0KLQlkZXZfc2V0X2RydmRhdGEoZGV2LCBzZGtwKTsKLQlhZGRfZGlzayhnZCk7Ci0Jc2RfZGlmX2NvbmZpZ19ob3N0KHNka3ApOwotCi0Jc2RfcHJpbnRrKEtFUk5fTk9USUNFLCBzZGtwLCAiQXR0YWNoZWQgU0NTSSAlc2Rpc2tcbiIsCi0JCSAgc2RwLT5yZW1vdmFibGUgPyAicmVtb3ZhYmxlICIgOiAiIik7CisJYXN5bmNfc2NoZWR1bGUoc2RfcHJvYmVfYXN5bmMsIHNka3ApOwogCiAJcmV0dXJuIDA7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zZF9kaWYuYyBiL2RyaXZlcnMvc2NzaS9zZF9kaWYuYwppbmRleCAzZWJiMWYyLi4xODRkZmY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvc2RfZGlmLmMKKysrIGIvZHJpdmVycy9zY3NpL3NkX2RpZi5jCkBAIC0xNDIsNyArMTQyLDcgQEAKIHN0YXRpYyB2b2lkIHNkX2RpZl90eXBlMV9zZXRfdGFnKHZvaWQgKnByb3QsIHZvaWQgKnRhZ19idWYsIHVuc2lnbmVkIGludCBzZWN0b3JzKQogewogCXN0cnVjdCBzZF9kaWZfdHVwbGUgKnNkdCA9IHByb3Q7Ci0JY2hhciAqdGFnID0gdGFnX2J1ZjsKKwl1OCAqdGFnID0gdGFnX2J1ZjsKIAl1bnNpZ25lZCBpbnQgaSwgajsKIAogCWZvciAoaSA9IDAsIGogPSAwIDsgaSA8IHNlY3RvcnMgOyBpKyssIGogKz0gMiwgc2R0KyspIHsKQEAgLTE1NCw3ICsxNTQsNyBAQAogc3RhdGljIHZvaWQgc2RfZGlmX3R5cGUxX2dldF90YWcodm9pZCAqcHJvdCwgdm9pZCAqdGFnX2J1ZiwgdW5zaWduZWQgaW50IHNlY3RvcnMpCiB7CiAJc3RydWN0IHNkX2RpZl90dXBsZSAqc2R0ID0gcHJvdDsKLQljaGFyICp0YWcgPSB0YWdfYnVmOworCXU4ICp0YWcgPSB0YWdfYnVmOwogCXVuc2lnbmVkIGludCBpLCBqOwogCiAJZm9yIChpID0gMCwgaiA9IDAgOyBpIDwgc2VjdG9ycyA7IGkrKywgaiArPSAyLCBzZHQrKykgewpAQCAtMjU2LDcgKzI1Niw3IEBACiBzdGF0aWMgdm9pZCBzZF9kaWZfdHlwZTNfc2V0X3RhZyh2b2lkICpwcm90LCB2b2lkICp0YWdfYnVmLCB1bnNpZ25lZCBpbnQgc2VjdG9ycykKIHsKIAlzdHJ1Y3Qgc2RfZGlmX3R1cGxlICpzZHQgPSBwcm90OwotCWNoYXIgKnRhZyA9IHRhZ19idWY7CisJdTggKnRhZyA9IHRhZ19idWY7CiAJdW5zaWduZWQgaW50IGksIGo7CiAKIAlmb3IgKGkgPSAwLCBqID0gMCA7IGkgPCBzZWN0b3JzIDsgaSsrLCBqICs9IDYsIHNkdCsrKSB7CkBAIC0yNjksNyArMjY5LDcgQEAKIHN0YXRpYyB2b2lkIHNkX2RpZl90eXBlM19nZXRfdGFnKHZvaWQgKnByb3QsIHZvaWQgKnRhZ19idWYsIHVuc2lnbmVkIGludCBzZWN0b3JzKQogewogCXN0cnVjdCBzZF9kaWZfdHVwbGUgKnNkdCA9IHByb3Q7Ci0JY2hhciAqdGFnID0gdGFnX2J1ZjsKKwl1OCAqdGFnID0gdGFnX2J1ZjsKIAl1bnNpZ25lZCBpbnQgaSwgajsKIAogCWZvciAoaSA9IDAsIGogPSAwIDsgaSA8IHNlY3RvcnMgOyBpKyssIGogKz0gMiwgc2R0KyspIHsKQEAgLTM3NCw3ICszNzQsMTAgQEAKIAllbHNlCiAJCWNzdW1fY29udmVydCA9IDA7CiAKKwlCVUdfT04oZGlmICYmIChzY21kLT5jbW5kWzBdID09IFJFQURfNiB8fCBzY21kLT5jbW5kWzBdID09IFdSSVRFXzYpKTsKKwogCXN3aXRjaCAoc2NtZC0+Y21uZFswXSkgeworCWNhc2UgUkVBRF82OgogCWNhc2UgUkVBRF8xMDoKIAljYXNlIFJFQURfMTI6CiAJY2FzZSBSRUFEXzE2OgpAQCAtMzkwLDYgKzM5Myw3IEBACiAKIAkJYnJlYWs7CiAKKwljYXNlIFdSSVRFXzY6CiAJY2FzZSBXUklURV8xMDoKIAljYXNlIFdSSVRFXzEyOgogCWNhc2UgV1JJVEVfMTY6CkBAIC00NzUsOCArNDc5LDkgQEAKIAogZXJyb3I6CiAJa3VubWFwX2F0b21pYyhzZHQsIEtNX1VTRVIwKTsKLQlzZF9wcmludGsoS0VSTl9FUlIsIHNka3AsICIlczogdmlydCAldSwgcGh5cyAldSwgcmVmICV1XG4iLAotCQkgIF9fZnVuY19fLCB2aXJ0LCBwaHlzLCBiZTMyX3RvX2NwdShzZHQtPnJlZl90YWcpKTsKKwlzZF9wcmludGsoS0VSTl9FUlIsIHNka3AsICIlczogdmlydCAldSwgcGh5cyAldSwgcmVmICV1LCBhcHAgJTR4XG4iLAorCQkgIF9fZnVuY19fLCB2aXJ0LCBwaHlzLCBiZTMyX3RvX2NwdShzZHQtPnJlZl90YWcpLAorCQkgIGJlMTZfdG9fY3B1KHNkdC0+YXBwX3RhZykpOwogCiAJcmV0dXJuIC1FSU87CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc2VzLmMgYi9kcml2ZXJzL3Njc2kvc2VzLmMKaW5kZXggN2YwZGYyOS4uZTk0NmUwNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3Nlcy5jCisrKyBiL2RyaXZlcnMvc2NzaS9zZXMuYwpAQCAtNTI2LDcgKzUyNiw3IEBACiAJaWYgKCFzY29tcCkKIAkJZ290byBlcnJfZnJlZTsKIAotCWVkZXYgPSBlbmNsb3N1cmVfcmVnaXN0ZXIoY2Rldi0+cGFyZW50LCBzZGV2LT5zZGV2X2dlbmRldi5idXNfaWQsCisJZWRldiA9IGVuY2xvc3VyZV9yZWdpc3RlcihjZGV2LT5wYXJlbnQsIGRldl9uYW1lKCZzZGV2LT5zZGV2X2dlbmRldiksCiAJCQkJICBjb21wb25lbnRzLCAmc2VzX2VuY2xvc3VyZV9jYWxsYmFja3MpOwogCWlmIChJU19FUlIoZWRldikpIHsKIAkJZXJyID0gUFRSX0VSUihlZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zZy5jIGIvZHJpdmVycy9zY3NpL3NnLmMKaW5kZXggNTEwMzg1NS4uOGYwYmQzZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3NnLmMKKysrIGIvZHJpdmVycy9zY3NpL3NnLmMKQEAgLTE2NjksNiArMTY2OSw4IEBACiAJCW1kLT5wYWdlcyA9IHJlcV9zY2hwLT5wYWdlczsKIAkJbWQtPnBhZ2Vfb3JkZXIgPSByZXFfc2NocC0+cGFnZV9vcmRlcjsKIAkJbWQtPm5yX2VudHJpZXMgPSByZXFfc2NocC0+a191c2Vfc2c7CisJCW1kLT5vZmZzZXQgPSAwOworCQltZC0+bnVsbF9tYXBwZWQgPSBocC0+ZHhmZXJwID8gMCA6IDE7CiAJfQogCiAJaWYgKGlvdl9jb3VudCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zZ2l3ZDkzLmMgYi9kcml2ZXJzL3Njc2kvc2dpd2Q5My5jCmluZGV4IDMxZmU2MDUuLjA4MDdiMjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9zZ2l3ZDkzLmMKKysrIGIvZHJpdmVycy9zY3NpL3NnaXdkOTMuYwpAQCAtMjk3LDcgKzI5Nyw3IEBACiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIHZvaWQgX19leGl0IHNnaXdkOTNfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCitzdGF0aWMgaW50IF9fZXhpdCBzZ2l3ZDkzX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCXN0cnVjdCBTY3NpX0hvc3QgKmhvc3QgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKIAlzdHJ1Y3QgaXAyMl9ob3N0ZGF0YSAqaGRhdGEgPSAoc3RydWN0IGlwMjJfaG9zdGRhdGEgKikgaG9zdC0+aG9zdGRhdGE7CkBAIC0zMDcsNiArMzA3LDcgQEAKIAlmcmVlX2lycShwZC0+aXJxLCBob3N0KTsKIAlkbWFfZnJlZV9ub25jb2hlcmVudCgmcGRldi0+ZGV2LCBIUENfRE1BX1NJWkUsIGhkYXRhLT5jcHUsIGhkYXRhLT5kbWEpOwogCXNjc2lfaG9zdF9wdXQoaG9zdCk7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHNnaXdkOTNfZHJpdmVyID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3NpbTcxMC5jIGIvZHJpdmVycy9zY3NpL3NpbTcxMC5jCmluZGV4IGQ2M2QyMjkuLjZkYzhiODQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9zaW03MTAuYworKysgYi9kcml2ZXJzL3Njc2kvc2ltNzEwLmMKQEAgLTEwMiw3ICsxMDIsNyBAQAogCXN0cnVjdCBOQ1JfNzAwX0hvc3RfUGFyYW1ldGVycyAqaG9zdGRhdGEgPQogCQlremFsbG9jKHNpemVvZihzdHJ1Y3QgTkNSXzcwMF9Ib3N0X1BhcmFtZXRlcnMpLAlHRlBfS0VSTkVMKTsKIAotCXByaW50ayhLRVJOX05PVElDRSAic2ltNzEwOiAlc1xuIiwgZGV2LT5idXNfaWQpOworCXByaW50ayhLRVJOX05PVElDRSAic2ltNzEwOiAlc1xuIiwgZGV2X25hbWUoZGV2KSk7CiAJcHJpbnRrKEtFUk5fTk9USUNFICJzaW03MTA6IGlycSA9ICVkLCBjbG9jayA9ICVkLCBiYXNlID0gMHglbHgsIHNjc2lfaWQgPSAlZFxuIiwKIAkgICAgICAgaXJxLCBjbG9jaywgYmFzZV9hZGRyLCBzY3NpX2lkKTsKIApAQCAtMzA1LDcgKzMwNSw3IEBACiAJCXNjc2lfaWQgPSBmZnModmFsKSAtIDE7CiAKIAkJaWYoc2NzaV9pZCA+IDcgfHwgKHZhbCAmIH4oMTw8c2NzaV9pZCkpICE9IDApIHsKLQkJCXByaW50ayhLRVJOX0VSUiAic2ltNzEwLmMsIEVJU0EgY2FyZCAlcyBoYXMgaW5jb3JyZWN0IHNjc2lfaWQsIHNldHRpbmcgdG8gN1xuIiwgZGV2LT5idXNfaWQpOworCQkJcHJpbnRrKEtFUk5fRVJSICJzaW03MTAuYywgRUlTQSBjYXJkICVzIGhhcyBpbmNvcnJlY3Qgc2NzaV9pZCwgc2V0dGluZyB0byA3XG4iLCBkZXZfbmFtZShkZXYpKTsKIAkJCXNjc2lfaWQgPSA3OwogCQl9CiAJfSBlbHNlIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zbmlfNTNjNzEwLmMgYi9kcml2ZXJzL3Njc2kvc25pXzUzYzcxMC5jCmluZGV4IDJiYmVmNGMuLjc3ZjBiMmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9zbmlfNTNjNzEwLmMKKysrIGIvZHJpdmVycy9zY3NpL3NuaV81M2M3MTAuYwpAQCAtNzgsOCArNzgsNyBAQAogCWJhc2UgPSByZXMtPnN0YXJ0OwogCWhvc3RkYXRhID0ga3phbGxvYyhzaXplb2YoKmhvc3RkYXRhKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFob3N0ZGF0YSkgewotCQlwcmludGsoS0VSTl9FUlIgIiVzOiBGYWlsZWQgdG8gYWxsb2NhdGUgaG9zdCBkYXRhXG4iLAotCQkgICAgICAgZGV2LT5kZXYuYnVzX2lkKTsKKwkJZGV2X3ByaW50ayhLRVJOX0VSUiwgZGV2LCAiRmFpbGVkIHRvIGFsbG9jYXRlIGhvc3QgZGF0YVxuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3N0LmMgYi9kcml2ZXJzL3Njc2kvc3QuYwppbmRleCA3ZjNmMzE3Li5jNmYxOWVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvc3QuYworKysgYi9kcml2ZXJzL3Njc2kvc3QuYwpAQCAtMTcsNyArMTcsNyBAQAogICAgTGFzdCBtb2RpZmllZDogMTgtSkFOLTE5OTggUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+IERldmZzIHN1cHBvcnQKICAqLwogCi1zdGF0aWMgY29uc3QgY2hhciAqdmVyc3RyID0gIjIwMDgwNTA0IjsKK3N0YXRpYyBjb25zdCBjaGFyICp2ZXJzdHIgPSAiMjAwODEyMTUiOwogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKQEAgLTE4MiwxOCArMTgyLDE2IEBACiAKIHN0YXRpYyBpbnQgbW9kZXNfZGVmaW5lZDsKIAotc3RhdGljIHN0cnVjdCBzdF9idWZmZXIgKm5ld190YXBlX2J1ZmZlcihpbnQsIGludCwgaW50KTsKIHN0YXRpYyBpbnQgZW5sYXJnZV9idWZmZXIoc3RydWN0IHN0X2J1ZmZlciAqLCBpbnQsIGludCk7CiBzdGF0aWMgdm9pZCBjbGVhcl9idWZmZXIoc3RydWN0IHN0X2J1ZmZlciAqKTsKIHN0YXRpYyB2b2lkIG5vcm1hbGl6ZV9idWZmZXIoc3RydWN0IHN0X2J1ZmZlciAqKTsKIHN0YXRpYyBpbnQgYXBwZW5kX3RvX2J1ZmZlcihjb25zdCBjaGFyIF9fdXNlciAqLCBzdHJ1Y3Qgc3RfYnVmZmVyICosIGludCk7CiBzdGF0aWMgaW50IGZyb21fYnVmZmVyKHN0cnVjdCBzdF9idWZmZXIgKiwgY2hhciBfX3VzZXIgKiwgaW50KTsKIHN0YXRpYyB2b2lkIG1vdmVfYnVmZmVyX2RhdGEoc3RydWN0IHN0X2J1ZmZlciAqLCBpbnQpOwotc3RhdGljIHZvaWQgYnVmX3RvX3NnKHN0cnVjdCBzdF9idWZmZXIgKiwgdW5zaWduZWQgaW50KTsKIAotc3RhdGljIGludCBzZ2xfbWFwX3VzZXJfcGFnZXMoc3RydWN0IHNjYXR0ZXJsaXN0ICosIGNvbnN0IHVuc2lnbmVkIGludCwgCitzdGF0aWMgaW50IHNnbF9tYXBfdXNlcl9wYWdlcyhzdHJ1Y3Qgc3RfYnVmZmVyICosIGNvbnN0IHVuc2lnbmVkIGludCwKIAkJCSAgICAgIHVuc2lnbmVkIGxvbmcsIHNpemVfdCwgaW50KTsKLXN0YXRpYyBpbnQgc2dsX3VubWFwX3VzZXJfcGFnZXMoc3RydWN0IHNjYXR0ZXJsaXN0ICosIGNvbnN0IHVuc2lnbmVkIGludCwgaW50KTsKK3N0YXRpYyBpbnQgc2dsX3VubWFwX3VzZXJfcGFnZXMoc3RydWN0IHN0X2J1ZmZlciAqLCBjb25zdCB1bnNpZ25lZCBpbnQsIGludCk7CiAKIHN0YXRpYyBpbnQgc3RfcHJvYmUoc3RydWN0IGRldmljZSAqKTsKIHN0YXRpYyBpbnQgc3RfcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKik7CkBAIC00MzUsMjIgKzQzMyw2IEBACiAJcmV0dXJuICgtRUlPKTsKIH0KIAotCi0vKiBXYWtldXAgZnJvbSBpbnRlcnJ1cHQgKi8KLXN0YXRpYyB2b2lkIHN0X3NsZWVwX2RvbmUodm9pZCAqZGF0YSwgY2hhciAqc2Vuc2UsIGludCByZXN1bHQsIGludCByZXNpZCkKLXsKLQlzdHJ1Y3Qgc3RfcmVxdWVzdCAqU1JwbnQgPSBkYXRhOwotCXN0cnVjdCBzY3NpX3RhcGUgKlNUcCA9IFNScG50LT5zdHA7Ci0KLQltZW1jcHkoU1JwbnQtPnNlbnNlLCBzZW5zZSwgU0NTSV9TRU5TRV9CVUZGRVJTSVpFKTsKLQkoU1RwLT5idWZmZXIpLT5jbWRzdGF0Lm1pZGxldmVsX3Jlc3VsdCA9IFNScG50LT5yZXN1bHQgPSByZXN1bHQ7Ci0JKFNUcC0+YnVmZmVyKS0+Y21kc3RhdC5yZXNpZHVhbCA9IHJlc2lkOwotCURFQiggU1RwLT53cml0ZV9wZW5kaW5nID0gMDsgKQotCi0JaWYgKFNScG50LT53YWl0aW5nKQotCQljb21wbGV0ZShTUnBudC0+d2FpdGluZyk7Ci19Ci0KIHN0YXRpYyBzdHJ1Y3Qgc3RfcmVxdWVzdCAqc3RfYWxsb2NhdGVfcmVxdWVzdChzdHJ1Y3Qgc2NzaV90YXBlICpzdHApCiB7CiAJc3RydWN0IHN0X3JlcXVlc3QgKnN0cmVxOwpAQCAtNDc1LDYgKzQ1Nyw2MyBAQAogCWtmcmVlKHN0cmVxKTsKIH0KIAorc3RhdGljIHZvaWQgc3Rfc2NzaV9leGVjdXRlX2VuZChzdHJ1Y3QgcmVxdWVzdCAqcmVxLCBpbnQgdXB0b2RhdGUpCit7CisJc3RydWN0IHN0X3JlcXVlc3QgKlNScG50ID0gcmVxLT5lbmRfaW9fZGF0YTsKKwlzdHJ1Y3Qgc2NzaV90YXBlICpTVHAgPSBTUnBudC0+c3RwOworCisJU1RwLT5idWZmZXItPmNtZHN0YXQubWlkbGV2ZWxfcmVzdWx0ID0gU1JwbnQtPnJlc3VsdCA9IHJlcS0+ZXJyb3JzOworCVNUcC0+YnVmZmVyLT5jbWRzdGF0LnJlc2lkdWFsID0gcmVxLT5kYXRhX2xlbjsKKworCWlmIChTUnBudC0+d2FpdGluZykKKwkJY29tcGxldGUoU1JwbnQtPndhaXRpbmcpOworCisJYmxrX3JxX3VubWFwX3VzZXIoU1JwbnQtPmJpbyk7CisJX19ibGtfcHV0X3JlcXVlc3QocmVxLT5xLCByZXEpOworfQorCitzdGF0aWMgaW50IHN0X3Njc2lfZXhlY3V0ZShzdHJ1Y3Qgc3RfcmVxdWVzdCAqU1JwbnQsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmNtZCwKKwkJCSAgIGludCBkYXRhX2RpcmVjdGlvbiwgdm9pZCAqYnVmZmVyLCB1bnNpZ25lZCBidWZmbGVuLAorCQkJICAgaW50IHRpbWVvdXQsIGludCByZXRyaWVzKQoreworCXN0cnVjdCByZXF1ZXN0ICpyZXE7CisJc3RydWN0IHJxX21hcF9kYXRhICptZGF0YSA9ICZTUnBudC0+c3RwLT5idWZmZXItPm1hcF9kYXRhOworCWludCBlcnIgPSAwOworCWludCB3cml0ZSA9IChkYXRhX2RpcmVjdGlvbiA9PSBETUFfVE9fREVWSUNFKTsKKworCXJlcSA9IGJsa19nZXRfcmVxdWVzdChTUnBudC0+c3RwLT5kZXZpY2UtPnJlcXVlc3RfcXVldWUsIHdyaXRlLAorCQkJICAgICAgR0ZQX0tFUk5FTCk7CisJaWYgKCFyZXEpCisJCXJldHVybiBEUklWRVJfRVJST1IgPDwgMjQ7CisKKwlyZXEtPmNtZF90eXBlID0gUkVRX1RZUEVfQkxPQ0tfUEM7CisJcmVxLT5jbWRfZmxhZ3MgfD0gUkVRX1FVSUVUOworCisJbWRhdGEtPm51bGxfbWFwcGVkID0gMTsKKworCWlmIChidWZmbGVuKSB7CisJCWVyciA9IGJsa19ycV9tYXBfdXNlcihyZXEtPnEsIHJlcSwgbWRhdGEsIE5VTEwsIGJ1ZmZsZW4sCisJCQkJICAgICAgR0ZQX0tFUk5FTCk7CisJCWlmIChlcnIpIHsKKwkJCWJsa19wdXRfcmVxdWVzdChyZXEpOworCQkJcmV0dXJuIERSSVZFUl9FUlJPUiA8PCAyNDsKKwkJfQorCX0KKworCVNScG50LT5iaW8gPSByZXEtPmJpbzsKKwlyZXEtPmNtZF9sZW4gPSBDT01NQU5EX1NJWkUoY21kWzBdKTsKKwltZW1zZXQocmVxLT5jbWQsIDAsIEJMS19NQVhfQ0RCKTsKKwltZW1jcHkocmVxLT5jbWQsIGNtZCwgcmVxLT5jbWRfbGVuKTsKKwlyZXEtPnNlbnNlID0gU1JwbnQtPnNlbnNlOworCXJlcS0+c2Vuc2VfbGVuID0gMDsKKwlyZXEtPnRpbWVvdXQgPSB0aW1lb3V0OworCXJlcS0+cmV0cmllcyA9IHJldHJpZXM7CisJcmVxLT5lbmRfaW9fZGF0YSA9IFNScG50OworCisJYmxrX2V4ZWN1dGVfcnFfbm93YWl0KHJlcS0+cSwgTlVMTCwgcmVxLCAxLCBzdF9zY3NpX2V4ZWN1dGVfZW5kKTsKKwlyZXR1cm4gMDsKK30KKwogLyogRG8gdGhlIHNjc2kgY29tbWFuZC4gV2FpdHMgdW50aWwgY29tbWFuZCBwZXJmb3JtZWQgaWYgZG9fd2FpdCBpcyB0cnVlLgogICAgT3RoZXJ3aXNlIHdyaXRlX2JlaGluZF9jaGVjaygpIGlzIHVzZWQgdG8gY2hlY2sgdGhhdCB0aGUgY29tbWFuZAogICAgaGFzIGZpbmlzaGVkLiAqLwpAQCAtNDgzLDYgKzUyMiw4IEBACiAJICAgaW50IGJ5dGVzLCBpbnQgZGlyZWN0aW9uLCBpbnQgdGltZW91dCwgaW50IHJldHJpZXMsIGludCBkb193YWl0KQogewogCXN0cnVjdCBjb21wbGV0aW9uICp3YWl0aW5nOworCXN0cnVjdCBycV9tYXBfZGF0YSAqbWRhdGEgPSAmU1RwLT5idWZmZXItPm1hcF9kYXRhOworCWludCByZXQ7CiAKIAkvKiBpZiBhc3luYywgbWFrZSBzdXJlIHRoZXJlJ3Mgbm8gY29tbWFuZCBvdXRzdGFuZGluZyAqLwogCWlmICghZG9fd2FpdCAmJiAoKFNUcC0+YnVmZmVyKS0+bGFzdF9TUnBudCkpIHsKQEAgLTUxMCwyMSArNTUxLDI3IEBACiAJaW5pdF9jb21wbGV0aW9uKHdhaXRpbmcpOwogCVNScG50LT53YWl0aW5nID0gd2FpdGluZzsKIAotCWlmICghU1RwLT5idWZmZXItPmRvX2RpbykKLQkJYnVmX3RvX3NnKFNUcC0+YnVmZmVyLCBieXRlcyk7CisJaWYgKFNUcC0+YnVmZmVyLT5kb19kaW8pIHsKKwkJbWRhdGEtPm5yX2VudHJpZXMgPSBTVHAtPmJ1ZmZlci0+c2dfc2VnczsKKwkJbWRhdGEtPnBhZ2VzID0gU1RwLT5idWZmZXItPm1hcHBlZF9wYWdlczsKKwl9IGVsc2UgeworCQltZGF0YS0+bnJfZW50cmllcyA9CisJCQlESVZfUk9VTkRfVVAoYnl0ZXMsIFBBR0VfU0laRSA8PCBtZGF0YS0+cGFnZV9vcmRlcik7CisJCVNUcC0+YnVmZmVyLT5tYXBfZGF0YS5wYWdlcyA9IFNUcC0+YnVmZmVyLT5yZXNlcnZlZF9wYWdlczsKKwkJU1RwLT5idWZmZXItPm1hcF9kYXRhLm9mZnNldCA9IDA7CisJfQogCiAJbWVtY3B5KFNScG50LT5jbWQsIGNtZCwgc2l6ZW9mKFNScG50LT5jbWQpKTsKIAlTVHAtPmJ1ZmZlci0+Y21kc3RhdC5oYXZlX3NlbnNlID0gMDsKIAlTVHAtPmJ1ZmZlci0+c3lzY2FsbF9yZXN1bHQgPSAwOwogCi0JaWYgKHNjc2lfZXhlY3V0ZV9hc3luYyhTVHAtPmRldmljZSwgY21kLCBDT01NQU5EX1NJWkUoY21kWzBdKSwgZGlyZWN0aW9uLAotCQkJJigoU1RwLT5idWZmZXIpLT5zZ1swXSksIGJ5dGVzLCAoU1RwLT5idWZmZXIpLT5zZ19zZWdzLAotCQkJICAgICAgIHRpbWVvdXQsIHJldHJpZXMsIFNScG50LCBzdF9zbGVlcF9kb25lLCBHRlBfS0VSTkVMKSkgeworCXJldCA9IHN0X3Njc2lfZXhlY3V0ZShTUnBudCwgY21kLCBkaXJlY3Rpb24sIE5VTEwsIGJ5dGVzLCB0aW1lb3V0LAorCQkJICAgICAgcmV0cmllcyk7CisJaWYgKHJldCkgewogCQkvKiBjb3VsZCBub3QgYWxsb2NhdGUgdGhlIGJ1ZmZlciBvciByZXF1ZXN0IHdhcyB0b28gbGFyZ2UgKi8KIAkJKFNUcC0+YnVmZmVyKS0+c3lzY2FsbF9yZXN1bHQgPSAoLUVCVVNZKTsKIAkJKFNUcC0+YnVmZmVyKS0+bGFzdF9TUnBudCA9IE5VTEw7Ci0JfQotCWVsc2UgaWYgKGRvX3dhaXQpIHsKKwl9IGVsc2UgaWYgKGRvX3dhaXQpIHsKIAkJd2FpdF9mb3JfY29tcGxldGlvbih3YWl0aW5nKTsKIAkJU1JwbnQtPndhaXRpbmcgPSBOVUxMOwogCQkoU1RwLT5idWZmZXIpLT5zeXNjYWxsX3Jlc3VsdCA9IHN0X2Noa19yZXN1bHQoU1RwLCBTUnBudCk7CkBAIC01MzMsMjggKzU4MCw2IEBACiAJcmV0dXJuIFNScG50OwogfQogCi1zdGF0aWMgaW50IHN0X3Njc2lfa2Vybl9leGVjdXRlKHN0cnVjdCBzdF9yZXF1ZXN0ICpzdHJlcSwKLQkJCQljb25zdCB1bnNpZ25lZCBjaGFyICpjbWQsIGludCBkYXRhX2RpcmVjdGlvbiwKLQkJCQl2b2lkICpidWZmZXIsIHVuc2lnbmVkIGJ1ZmZsZW4sIGludCB0aW1lb3V0LAotCQkJCWludCByZXRyaWVzKQotewotCXN0cnVjdCBzY3NpX3RhcGUgKnN0cCA9IHN0cmVxLT5zdHA7Ci0JaW50IHJldCwgcmVzaWQ7Ci0KLQlzdHAtPmJ1ZmZlci0+Y21kc3RhdC5oYXZlX3NlbnNlID0gMDsKLQltZW1jcHkoc3RyZXEtPmNtZCwgY21kLCBzaXplb2Yoc3RyZXEtPmNtZCkpOwotCi0JcmV0ID0gc2NzaV9leGVjdXRlKHN0cC0+ZGV2aWNlLCBjbWQsIGRhdGFfZGlyZWN0aW9uLCBidWZmZXIsIGJ1ZmZsZW4sCi0JCQkgICBzdHJlcS0+c2Vuc2UsIHRpbWVvdXQsIHJldHJpZXMsIDAsICZyZXNpZCk7Ci0JaWYgKGRyaXZlcl9ieXRlKHJldCkgJiBEUklWRVJfRVJST1IpCi0JCXJldHVybiAtRUJVU1k7Ci0KLQlzdHAtPmJ1ZmZlci0+Y21kc3RhdC5taWRsZXZlbF9yZXN1bHQgPSBzdHJlcS0+cmVzdWx0ID0gcmV0OwotCXN0cC0+YnVmZmVyLT5jbWRzdGF0LnJlc2lkdWFsID0gcmVzaWQ7Ci0Jc3RwLT5idWZmZXItPnN5c2NhbGxfcmVzdWx0ID0gc3RfY2hrX3Jlc3VsdChzdHAsIHN0cmVxKTsKLQotCXJldHVybiAwOwotfQogCiAvKiBIYW5kbGUgdGhlIHdyaXRlLWJlaGluZCBjaGVja2luZyAod2FpdHMgZm9yIGNvbXBsZXRpb24pLiBSZXR1cm5zIC1FTk9TUEMgaWYKICAgIHdyaXRlIGhhcyBiZWVuIGNvcnJlY3QgYnV0IEVPTSBlYXJseSB3YXJuaW5nIHJlYWNoZWQsIC1FSU8gaWYgd3JpdGUgZW5kZWQgaW4KQEAgLTYyNyw3ICs2NTIsNiBAQAogewogCXN0cnVjdCBzdF9yZXF1ZXN0ICpTUnBudDsKIAl1bnNpZ25lZCBjaGFyIGNtZFtNQVhfQ09NTUFORF9TSVpFXTsKLQlpbnQgcmV0OwogCiAJY21kWzBdID0gU1BBQ0U7CiAJY21kWzFdID0gMHgwMTsJCS8qIFNwYWNlIEZpbGVNYXJrcyAqLwpAQCAtNjQxLDI2ICs2NjUsMjAgQEAKICAgICAgICAgREVCQyhwcmludGsoU1RfREVCX01TRyAiJXM6IFN0ZXBwaW5nIG92ZXIgZmlsZW1hcmsgJXMuXG4iLAogCQkgICB0YXBlX25hbWUoU1RwKSwgZm9yd2FyZCA/ICJmb3J3YXJkIiA6ICJiYWNrd2FyZCIpKTsKIAotCVNScG50ID0gc3RfYWxsb2NhdGVfcmVxdWVzdChTVHApOworCVNScG50ID0gc3RfZG9fc2NzaShOVUxMLCBTVHAsIGNtZCwgMCwgRE1BX05PTkUsCisJCQkgICBTVHAtPmRldmljZS0+cmVxdWVzdF9xdWV1ZS0+cnFfdGltZW91dCwKKwkJCSAgIE1BWF9SRVRSSUVTLCAxKTsKIAlpZiAoIVNScG50KQotCQlyZXR1cm4gU1RwLT5idWZmZXItPnN5c2NhbGxfcmVzdWx0OworCQlyZXR1cm4gKFNUcC0+YnVmZmVyKS0+c3lzY2FsbF9yZXN1bHQ7CiAKLQlyZXQgPSBzdF9zY3NpX2tlcm5fZXhlY3V0ZShTUnBudCwgY21kLCBETUFfTk9ORSwgTlVMTCwgMCwKLQkJCQkgICBTVHAtPmRldmljZS0+cmVxdWVzdF9xdWV1ZS0+cnFfdGltZW91dCwKLQkJCQkgICBNQVhfUkVUUklFUyk7Ci0JaWYgKHJldCkKLQkJZ290byBvdXQ7Ci0KLQlyZXQgPSBTVHAtPmJ1ZmZlci0+c3lzY2FsbF9yZXN1bHQ7CisJc3RfcmVsZWFzZV9yZXF1ZXN0KFNScG50KTsKKwlTUnBudCA9IE5VTEw7CiAKIAlpZiAoKFNUcC0+YnVmZmVyKS0+Y21kc3RhdC5taWRsZXZlbF9yZXN1bHQgIT0gMCkKIAkJcHJpbnRrKEtFUk5fRVJSICIlczogU3RlcHBpbmcgb3ZlciBmaWxlbWFyayAlcyBmYWlsZWQuXG4iLAogCQkgICB0YXBlX25hbWUoU1RwKSwgZm9yd2FyZCA/ICJmb3J3YXJkIiA6ICJiYWNrd2FyZCIpOwogCi1vdXQ6Ci0Jc3RfcmVsZWFzZV9yZXF1ZXN0KFNScG50KTsKLQotCXJldHVybiByZXQ7CisJcmV0dXJuIChTVHAtPmJ1ZmZlciktPnN5c2NhbGxfcmVzdWx0OwogfQogCiAKQEAgLTg4MSwyNCArODk5LDIxIEBACiAJaW50IGF0dGVudGlvbnMsIHdhaXRzLCBtYXhfd2FpdCwgc2NvZGU7CiAJaW50IHJldHZhbCA9IENIS1JFU19SRUFEWSwgbmV3X3Nlc3Npb24gPSAwOwogCXVuc2lnbmVkIGNoYXIgY21kW01BWF9DT01NQU5EX1NJWkVdOwotCXN0cnVjdCBzdF9yZXF1ZXN0ICpTUnBudDsKKwlzdHJ1Y3Qgc3RfcmVxdWVzdCAqU1JwbnQgPSBOVUxMOwogCXN0cnVjdCBzdF9jbWRzdGF0dXMgKmNtZHN0YXRwID0gJlNUcC0+YnVmZmVyLT5jbWRzdGF0OwogCi0JU1JwbnQgPSBzdF9hbGxvY2F0ZV9yZXF1ZXN0KFNUcCk7Ci0JaWYgKCFTUnBudCkKLQkJcmV0dXJuIFNUcC0+YnVmZmVyLT5zeXNjYWxsX3Jlc3VsdDsKLQogCW1heF93YWl0ID0gZG9fd2FpdCA/IFNUX0JMT0NLX1NFQ09ORFMgOiAwOwogCiAJZm9yIChhdHRlbnRpb25zPXdhaXRzPTA7IDsgKSB7CiAJCW1lbXNldCgodm9pZCAqKSAmY21kWzBdLCAwLCBNQVhfQ09NTUFORF9TSVpFKTsKIAkJY21kWzBdID0gVEVTVF9VTklUX1JFQURZOworCQlTUnBudCA9IHN0X2RvX3Njc2koU1JwbnQsIFNUcCwgY21kLCAwLCBETUFfTk9ORSwKKwkJCQkgICBTVHAtPmxvbmdfdGltZW91dCwgTUFYX1JFQURZX1JFVFJJRVMsIDEpOwogCi0JCXJldHZhbCA9IHN0X3Njc2lfa2Vybl9leGVjdXRlKFNScG50LCBjbWQsIERNQV9OT05FLCBOVUxMLCAwLAotCQkJCQkgICAgICBTVHAtPmxvbmdfdGltZW91dCwKLQkJCQkJICAgICAgTUFYX1JFQURZX1JFVFJJRVMpOwotCQlpZiAocmV0dmFsKQorCQlpZiAoIVNScG50KSB7CisJCQlyZXR2YWwgPSAoU1RwLT5idWZmZXIpLT5zeXNjYWxsX3Jlc3VsdDsKIAkJCWJyZWFrOworCQl9CiAKIAkJaWYgKGNtZHN0YXRwLT5oYXZlX3NlbnNlKSB7CiAKQEAgLTk0Miw4ICs5NTcsOCBAQAogCQlicmVhazsKIAl9CiAKLQlzdF9yZWxlYXNlX3JlcXVlc3QoU1JwbnQpOwotCisJaWYgKFNScG50ICE9IE5VTEwpCisJCXN0X3JlbGVhc2VfcmVxdWVzdChTUnBudCk7CiAJcmV0dXJuIHJldHZhbDsKIH0KIApAQCAtMTAyMCwyNCArMTAzNSwxNyBAQAogCQl9CiAJfQogCi0JU1JwbnQgPSBzdF9hbGxvY2F0ZV9yZXF1ZXN0KFNUcCk7Ci0JaWYgKCFTUnBudCkgewotCQlyZXR2YWwgPSBTVHAtPmJ1ZmZlci0+c3lzY2FsbF9yZXN1bHQ7Ci0JCWdvdG8gZXJyX291dDsKLQl9Ci0KIAlpZiAoU1RwLT5vbWl0X2Jsa2xpbXMpCiAJCVNUcC0+bWluX2Jsb2NrID0gU1RwLT5tYXhfYmxvY2sgPSAoLTEpOwogCWVsc2UgewogCQltZW1zZXQoKHZvaWQgKikgJmNtZFswXSwgMCwgTUFYX0NPTU1BTkRfU0laRSk7CiAJCWNtZFswXSA9IFJFQURfQkxPQ0tfTElNSVRTOwogCi0JCXJldHZhbCA9IHN0X3Njc2lfa2Vybl9leGVjdXRlKFNScG50LCBjbWQsIERNQV9GUk9NX0RFVklDRSwKLQkJCQkJICAgICAgU1RwLT5idWZmZXItPmJfZGF0YSwgNiwKLQkJCQkJICAgICAgU1RwLT5kZXZpY2UtPnJlcXVlc3RfcXVldWUtPnJxX3RpbWVvdXQsCi0JCQkJCSAgICAgIE1BWF9SRUFEWV9SRVRSSUVTKTsKLQkJaWYgKHJldHZhbCkgewotCQkJc3RfcmVsZWFzZV9yZXF1ZXN0KFNScG50KTsKKwkJU1JwbnQgPSBzdF9kb19zY3NpKFNScG50LCBTVHAsIGNtZCwgNiwgRE1BX0ZST01fREVWSUNFLAorCQkJCSAgIFNUcC0+ZGV2aWNlLT5yZXF1ZXN0X3F1ZXVlLT5ycV90aW1lb3V0LAorCQkJCSAgIE1BWF9SRUFEWV9SRVRSSUVTLCAxKTsKKwkJaWYgKCFTUnBudCkgeworCQkJcmV0dmFsID0gKFNUcC0+YnVmZmVyKS0+c3lzY2FsbF9yZXN1bHQ7CiAJCQlnb3RvIGVycl9vdXQ7CiAJCX0KIApAQCAtMTA2MSwxMiArMTA2OSwxMSBAQAogCWNtZFswXSA9IE1PREVfU0VOU0U7CiAJY21kWzRdID0gMTI7CiAKLQlyZXR2YWwgPSBzdF9zY3NpX2tlcm5fZXhlY3V0ZShTUnBudCwgY21kLCBETUFfRlJPTV9ERVZJQ0UsCi0JCQkJICAgICAgU1RwLT5idWZmZXItPmJfZGF0YSwgMTIsCi0JCQkJICAgICAgU1RwLT5kZXZpY2UtPnJlcXVlc3RfcXVldWUtPnJxX3RpbWVvdXQsCi0JCQkJICAgICAgTUFYX1JFQURZX1JFVFJJRVMpOwotCWlmIChyZXR2YWwpIHsKLQkJc3RfcmVsZWFzZV9yZXF1ZXN0KFNScG50KTsKKwlTUnBudCA9IHN0X2RvX3Njc2koU1JwbnQsIFNUcCwgY21kLCAxMiwgRE1BX0ZST01fREVWSUNFLAorCQkJICAgU1RwLT5kZXZpY2UtPnJlcXVlc3RfcXVldWUtPnJxX3RpbWVvdXQsCisJCQkgICBNQVhfUkVBRFlfUkVUUklFUywgMSk7CisJaWYgKCFTUnBudCkgeworCQlyZXR2YWwgPSAoU1RwLT5idWZmZXIpLT5zeXNjYWxsX3Jlc3VsdDsKIAkJZ290byBlcnJfb3V0OwogCX0KIApAQCAtMTI5NiwxNyArMTMwMywxMSBAQAogCQljbWRbMF0gPSBXUklURV9GSUxFTUFSS1M7CiAJCWNtZFs0XSA9IDEgKyBTVHAtPnR3b19mbTsKIAotCQlTUnBudCA9IHN0X2FsbG9jYXRlX3JlcXVlc3QoU1RwKTsKKwkJU1JwbnQgPSBzdF9kb19zY3NpKE5VTEwsIFNUcCwgY21kLCAwLCBETUFfTk9ORSwKKwkJCQkgICBTVHAtPmRldmljZS0+cmVxdWVzdF9xdWV1ZS0+cnFfdGltZW91dCwKKwkJCQkgICBNQVhfV1JJVEVfUkVUUklFUywgMSk7CiAJCWlmICghU1JwbnQpIHsKLQkJCXJlc3VsdCA9IFNUcC0+YnVmZmVyLT5zeXNjYWxsX3Jlc3VsdDsKLQkJCWdvdG8gb3V0OwotCQl9Ci0KLQkJcmVzdWx0ID0gc3Rfc2NzaV9rZXJuX2V4ZWN1dGUoU1JwbnQsIGNtZCwgRE1BX05PTkUsIE5VTEwsIDAsCi0JCQkJCSAgICAgIFNUcC0+ZGV2aWNlLT5yZXF1ZXN0X3F1ZXVlLT5ycV90aW1lb3V0LAotCQkJCQkgICAgICBNQVhfV1JJVEVfUkVUUklFUyk7Ci0JCWlmIChyZXN1bHQpIHsKLQkJCXN0X3JlbGVhc2VfcmVxdWVzdChTUnBudCk7CisJCQlyZXN1bHQgPSAoU1RwLT5idWZmZXIpLT5zeXNjYWxsX3Jlc3VsdDsKIAkJCWdvdG8gb3V0OwogCQl9CiAKQEAgLTE0NzEsOCArMTQ3Miw4IEBACiAKIAlpZiAoaSAmJiAoKHVuc2lnbmVkIGxvbmcpYnVmICYgcXVldWVfZG1hX2FsaWdubWVudCgKIAkJCQkJU1RwLT5kZXZpY2UtPnJlcXVlc3RfcXVldWUpKSA9PSAwKSB7Ci0JCWkgPSBzZ2xfbWFwX3VzZXJfcGFnZXMoJihTVGJwLT5zZ1swXSksIFNUYnAtPnVzZV9zZywKLQkJCQkgICAgICAodW5zaWduZWQgbG9uZylidWYsIGNvdW50LCAoaXNfcmVhZCA/IFJFQUQgOiBXUklURSkpOworCQlpID0gc2dsX21hcF91c2VyX3BhZ2VzKFNUYnAsIFNUYnAtPnVzZV9zZywgKHVuc2lnbmVkIGxvbmcpYnVmLAorCQkJCSAgICAgICBjb3VudCwgKGlzX3JlYWQgPyBSRUFEIDogV1JJVEUpKTsKIAkJaWYgKGkgPiAwKSB7CiAJCQlTVGJwLT5kb19kaW8gPSBpOwogCQkJU1RicC0+YnVmZmVyX2J5dGVzID0gMDsgICAvKiBjYW4gYmUgdXNlZCBhcyB0cmFuc2ZlciBjb3VudGVyICovCkBAIC0xNDgwLDcgKzE0ODEsNiBAQAogCQllbHNlCiAJCQlTVGJwLT5kb19kaW8gPSAwOyAgLyogZmFsbCBiYWNrIHRvIGJ1ZmZlcmluZyB3aXRoIGFueSBlcnJvciAqLwogCQlTVGJwLT5zZ19zZWdzID0gU1RicC0+ZG9fZGlvOwotCQlTVGJwLT5mcnBfc2dfY3VycmVudCA9IDA7CiAJCURFQigKIAkJICAgICBpZiAoU1RicC0+ZG9fZGlvKSB7CiAJCQlTVHAtPm5icl9kaW8rKzsKQEAgLTE1MjYsNyArMTUyNiw3IEBACiAKIAlTVGJwID0gU1RwLT5idWZmZXI7CiAJaWYgKFNUYnAtPmRvX2RpbykgewotCQlzZ2xfdW5tYXBfdXNlcl9wYWdlcygmKFNUYnAtPnNnWzBdKSwgU1RicC0+ZG9fZGlvLCBpc19yZWFkKTsKKwkJc2dsX3VubWFwX3VzZXJfcGFnZXMoU1RicCwgU1RicC0+ZG9fZGlvLCBpc19yZWFkKTsKIAkJU1RicC0+ZG9fZGlvID0gMDsKIAkJU1RicC0+c2dfc2VncyA9IDA7CiAJfQpAQCAtMjM3Miw3ICsyMzcyLDYgQEAKIHsKIAl1bnNpZ25lZCBjaGFyIGNtZFtNQVhfQ09NTUFORF9TSVpFXTsKIAlzdHJ1Y3Qgc3RfcmVxdWVzdCAqU1JwbnQ7Ci0JaW50IHJldDsKIAogCW1lbXNldChjbWQsIDAsIE1BWF9DT01NQU5EX1NJWkUpOwogCWNtZFswXSA9IE1PREVfU0VOU0U7CkBAIC0yMzgxLDE3ICsyMzgwLDE0IEBACiAJY21kWzJdID0gcGFnZTsKIAljbWRbNF0gPSAyNTU7CiAKLQlTUnBudCA9IHN0X2FsbG9jYXRlX3JlcXVlc3QoU1RwKTsKLQlpZiAoIVNScG50KQotCQlyZXR1cm4gU1RwLT5idWZmZXItPnN5c2NhbGxfcmVzdWx0OworCVNScG50ID0gc3RfZG9fc2NzaShOVUxMLCBTVHAsIGNtZCwgY21kWzRdLCBETUFfRlJPTV9ERVZJQ0UsCisJCQkgICBTVHAtPmRldmljZS0+cmVxdWVzdF9xdWV1ZS0+cnFfdGltZW91dCwgMCwgMSk7CisJaWYgKFNScG50ID09IE5VTEwpCisJCXJldHVybiAoU1RwLT5idWZmZXIpLT5zeXNjYWxsX3Jlc3VsdDsKIAotCXJldCA9IHN0X3Njc2lfa2Vybl9leGVjdXRlKFNScG50LCBjbWQsIERNQV9GUk9NX0RFVklDRSwKLQkJCQkgICBTVHAtPmJ1ZmZlci0+Yl9kYXRhLCBjbWRbNF0sCi0JCQkJICAgU1RwLT5kZXZpY2UtPnJlcXVlc3RfcXVldWUtPnJxX3RpbWVvdXQsCi0JCQkJICAgTUFYX1JFVFJJRVMpOwogCXN0X3JlbGVhc2VfcmVxdWVzdChTUnBudCk7CiAKLQlyZXR1cm4gcmV0ID8gOiBTVHAtPmJ1ZmZlci0+c3lzY2FsbF9yZXN1bHQ7CisJcmV0dXJuIFNUcC0+YnVmZmVyLT5zeXNjYWxsX3Jlc3VsdDsKIH0KIAogCkBAIC0yMzk5LDkgKzIzOTUsMTAgQEAKICAgIGluIHRoZSBidWZmZXIgaXMgY29ycmVjdGx5IGZvcm1hdHRlZC4gVGhlIGxvbmcgdGltZW91dCBpcyB1c2VkIGlmIHNsb3cgaXMgbm9uLXplcm8uICovCiBzdGF0aWMgaW50IHdyaXRlX21vZGVfcGFnZShzdHJ1Y3Qgc2NzaV90YXBlICpTVHAsIGludCBwYWdlLCBpbnQgc2xvdykKIHsKLQlpbnQgcGdvLCB0aW1lb3V0LCByZXQgPSAwOworCWludCBwZ287CiAJdW5zaWduZWQgY2hhciBjbWRbTUFYX0NPTU1BTkRfU0laRV07CiAJc3RydWN0IHN0X3JlcXVlc3QgKlNScG50OworCWludCB0aW1lb3V0OwogCiAJbWVtc2V0KGNtZCwgMCwgTUFYX0NPTU1BTkRfU0laRSk7CiAJY21kWzBdID0gTU9ERV9TRUxFQ1Q7CkBAIC0yNDE1LDIxICsyNDEyLDE2IEBACiAJKFNUcC0+YnVmZmVyKS0+Yl9kYXRhW01IX09GRl9ERVZfU1BFQ0lGSUNdICY9IH5NSF9CSVRfV1A7CiAJKFNUcC0+YnVmZmVyKS0+Yl9kYXRhW3BnbyArIE1QX09GRl9QQUdFX05CUl0gJj0gTVBfTVNLX1BBR0VfTkJSOwogCi0JU1JwbnQgPSBzdF9hbGxvY2F0ZV9yZXF1ZXN0KFNUcCk7Ci0JaWYgKCFTUnBudCkKLQkJcmV0dXJuIHJldDsKLQotCXRpbWVvdXQgPSBzbG93ID8gU1RwLT5sb25nX3RpbWVvdXQgOgotCQlTVHAtPmRldmljZS0+cmVxdWVzdF9xdWV1ZS0+cnFfdGltZW91dDsKLQotCXJldCA9IHN0X3Njc2lfa2Vybl9leGVjdXRlKFNScG50LCBjbWQsIERNQV9UT19ERVZJQ0UsCi0JCQkJICAgU1RwLT5idWZmZXItPmJfZGF0YSwgY21kWzRdLCB0aW1lb3V0LCAwKTsKLQlpZiAoIXJldCkKLQkJcmV0ID0gU1RwLT5idWZmZXItPnN5c2NhbGxfcmVzdWx0OworCXRpbWVvdXQgPSBzbG93ID8KKwkJU1RwLT5sb25nX3RpbWVvdXQgOiBTVHAtPmRldmljZS0+cmVxdWVzdF9xdWV1ZS0+cnFfdGltZW91dDsKKwlTUnBudCA9IHN0X2RvX3Njc2koTlVMTCwgU1RwLCBjbWQsIGNtZFs0XSwgRE1BX1RPX0RFVklDRSwKKwkJCSAgIHRpbWVvdXQsIDAsIDEpOworCWlmIChTUnBudCA9PSBOVUxMKQorCQlyZXR1cm4gKFNUcC0+YnVmZmVyKS0+c3lzY2FsbF9yZXN1bHQ7CiAKIAlzdF9yZWxlYXNlX3JlcXVlc3QoU1JwbnQpOwogCi0JcmV0dXJuIHJldDsKKwlyZXR1cm4gU1RwLT5idWZmZXItPnN5c2NhbGxfcmVzdWx0OwogfQogCiAKQEAgLTI1NDcsMTYgKzI1MzksMTMgQEAKIAkJcHJpbnRrKFNUX0RFQl9NU0cgIiVzOiBMb2FkaW5nIHRhcGUuXG4iLCBuYW1lKTsKIAkJKTsKIAotCVNScG50ID0gc3RfYWxsb2NhdGVfcmVxdWVzdChTVHApOworCVNScG50ID0gc3RfZG9fc2NzaShOVUxMLCBTVHAsIGNtZCwgMCwgRE1BX05PTkUsCisJCQkgICB0aW1lb3V0LCBNQVhfUkVUUklFUywgMSk7CiAJaWYgKCFTUnBudCkKLQkJcmV0dXJuIFNUcC0+YnVmZmVyLT5zeXNjYWxsX3Jlc3VsdDsKLQotCXJldHZhbCA9IHN0X3Njc2lfa2Vybl9leGVjdXRlKFNScG50LCBjbWQsIERNQV9OT05FLCBOVUxMLCAwLCB0aW1lb3V0LAotCQkJCSAgICAgIE1BWF9SRVRSSUVTKTsKLQlpZiAocmV0dmFsKQotCQlnb3RvIG91dDsKKwkJcmV0dXJuIChTVHAtPmJ1ZmZlciktPnN5c2NhbGxfcmVzdWx0OwogCiAJcmV0dmFsID0gKFNUcC0+YnVmZmVyKS0+c3lzY2FsbF9yZXN1bHQ7CisJc3RfcmVsZWFzZV9yZXF1ZXN0KFNScG50KTsKIAogCWlmICghcmV0dmFsKSB7CS8qIFNDU0kgY29tbWFuZCBzdWNjZXNzZnVsICovCiAKQEAgLTI1NzUsOCArMjU2NCw2IEBACiAJCVNUcHMgPSAmKFNUcC0+cHNbU1RwLT5wYXJ0aXRpb25dKTsKIAkJU1Rwcy0+ZHJ2X2ZpbGUgPSBTVHBzLT5kcnZfYmxvY2sgPSAoLTEpOwogCX0KLW91dDoKLQlzdF9yZWxlYXNlX3JlcXVlc3QoU1JwbnQpOwogCiAJcmV0dXJuIHJldHZhbDsKIH0KQEAgLTI4NTIsMTUgKzI4MzksMTIgQEAKIAkJcmV0dXJuICgtRU5PU1lTKTsKIAl9CiAKLQlTUnBudCA9IHN0X2FsbG9jYXRlX3JlcXVlc3QoU1RwKTsKKwlTUnBudCA9IHN0X2RvX3Njc2koTlVMTCwgU1RwLCBjbWQsIGRhdGFsZW4sIGRpcmVjdGlvbiwKKwkJCSAgIHRpbWVvdXQsIE1BWF9SRVRSSUVTLCAxKTsKIAlpZiAoIVNScG50KQogCQlyZXR1cm4gKFNUcC0+YnVmZmVyKS0+c3lzY2FsbF9yZXN1bHQ7CiAKLQlpb2N0bF9yZXN1bHQgPSBzdF9zY3NpX2tlcm5fZXhlY3V0ZShTUnBudCwgY21kLCBkaXJlY3Rpb24sCi0JCQkJCSAgICBTVHAtPmJ1ZmZlci0+Yl9kYXRhLCBkYXRhbGVuLAotCQkJCQkgICAgdGltZW91dCwgTUFYX1JFVFJJRVMpOwotCWlmICghaW9jdGxfcmVzdWx0KQotCQlpb2N0bF9yZXN1bHQgPSAoU1RwLT5idWZmZXIpLT5zeXNjYWxsX3Jlc3VsdDsKKwlpb2N0bF9yZXN1bHQgPSAoU1RwLT5idWZmZXIpLT5zeXNjYWxsX3Jlc3VsdDsKIAogCWlmICghaW9jdGxfcmVzdWx0KSB7CS8qIFNDU0kgY29tbWFuZCBzdWNjZXNzZnVsICovCiAJCXN0X3JlbGVhc2VfcmVxdWVzdChTUnBudCk7CkBAIC0zMDIyLDE3ICszMDA2LDExIEBACiAJCWlmICghbG9naWNhbCAmJiAhU1RwLT5zY3NpMl9sb2dpY2FsKQogCQkJc2NtZFsxXSA9IDE7CiAJfQotCi0JU1JwbnQgPSBzdF9hbGxvY2F0ZV9yZXF1ZXN0KFNUcCk7CisJU1JwbnQgPSBzdF9kb19zY3NpKE5VTEwsIFNUcCwgc2NtZCwgMjAsIERNQV9GUk9NX0RFVklDRSwKKwkJCSAgIFNUcC0+ZGV2aWNlLT5yZXF1ZXN0X3F1ZXVlLT5ycV90aW1lb3V0LAorCQkJICAgTUFYX1JFQURZX1JFVFJJRVMsIDEpOwogCWlmICghU1JwbnQpCi0JCXJldHVybiBTVHAtPmJ1ZmZlci0+c3lzY2FsbF9yZXN1bHQ7Ci0KLQlyZXN1bHQgPSBzdF9zY3NpX2tlcm5fZXhlY3V0ZShTUnBudCwgc2NtZCwgRE1BX0ZST01fREVWSUNFLAotCQkJCSAgICAgIFNUcC0+YnVmZmVyLT5iX2RhdGEsIDIwLAotCQkJCSAgICAgIFNUcC0+ZGV2aWNlLT5yZXF1ZXN0X3F1ZXVlLT5ycV90aW1lb3V0LAotCQkJCSAgICAgIE1BWF9SRUFEWV9SRVRSSUVTKTsKLQlpZiAocmVzdWx0KQotCQlnb3RvIG91dDsKKwkJcmV0dXJuIChTVHAtPmJ1ZmZlciktPnN5c2NhbGxfcmVzdWx0OwogCiAJaWYgKChTVHAtPmJ1ZmZlciktPnN5c2NhbGxfcmVzdWx0ICE9IDAgfHwKIAkgICAgKFNUcC0+ZGV2aWNlLT5zY3NpX2xldmVsID49IFNDU0lfMiAmJgpAQCAtMzA2MCw3ICszMDM4LDYgQEAKICAgICAgICAgICAgICAgICBERUJDKHByaW50ayhTVF9ERUJfTVNHICIlczogR290IHRhcGUgcG9zLiBibGsgJWQgcGFydCAlZC5cbiIsIG5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmJsb2NrLCAqcGFydGl0aW9uKSk7CiAJfQotb3V0OgogCXN0X3JlbGVhc2VfcmVxdWVzdChTUnBudCk7CiAJU1JwbnQgPSBOVUxMOwogCkBAIC0zMTM1LDE0ICszMTEyLDEwIEBACiAJCXRpbWVvdXQgPSBTVHAtPmRldmljZS0+cmVxdWVzdF9xdWV1ZS0+cnFfdGltZW91dDsKIAl9CiAKLQlTUnBudCA9IHN0X2FsbG9jYXRlX3JlcXVlc3QoU1RwKTsKKwlTUnBudCA9IHN0X2RvX3Njc2koTlVMTCwgU1RwLCBzY21kLCAwLCBETUFfTk9ORSwKKwkJCSAgIHRpbWVvdXQsIE1BWF9SRUFEWV9SRVRSSUVTLCAxKTsKIAlpZiAoIVNScG50KQotCQlyZXR1cm4gU1RwLT5idWZmZXItPnN5c2NhbGxfcmVzdWx0OwotCi0JcmVzdWx0ID0gc3Rfc2NzaV9rZXJuX2V4ZWN1dGUoU1JwbnQsIHNjbWQsIERNQV9OT05FLCBOVUxMLCAwLAotCQkJCSAgICAgIHRpbWVvdXQsIE1BWF9SRUFEWV9SRVRSSUVTKTsKLQlpZiAocmVzdWx0KQotCQlnb3RvIG91dDsKKwkJcmV0dXJuIChTVHAtPmJ1ZmZlciktPnN5c2NhbGxfcmVzdWx0OwogCiAJU1Rwcy0+ZHJ2X2Jsb2NrID0gU1Rwcy0+ZHJ2X2ZpbGUgPSAoLTEpOwogCVNUcHMtPmVvZiA9IFNUX05PRU9GOwpAQCAtMzE2Nyw3ICszMTQwLDcgQEAKIAkJCVNUcHMtPmRydl9ibG9jayA9IFNUcHMtPmRydl9maWxlID0gMDsKIAkJcmVzdWx0ID0gMDsKIAl9Ci1vdXQ6CisKIAlzdF9yZWxlYXNlX3JlcXVlc3QoU1JwbnQpOwogCVNScG50ID0gTlVMTDsKIApAQCAtMzY5NiwzOCArMzY2OSwzNCBAQAogCiAvKiBUcnkgdG8gYWxsb2NhdGUgYSBuZXcgdGFwZSBidWZmZXIuIENhbGxpbmcgZnVuY3Rpb24gbXVzdCBub3QgaG9sZAogICAgZGV2X2Fycl9sb2NrLiAqLwotc3RhdGljIHN0cnVjdCBzdF9idWZmZXIgKgotIG5ld190YXBlX2J1ZmZlcihpbnQgZnJvbV9pbml0aWFsaXphdGlvbiwgaW50IG5lZWRfZG1hLCBpbnQgbWF4X3NnKQorc3RhdGljIHN0cnVjdCBzdF9idWZmZXIgKm5ld190YXBlX2J1ZmZlcihpbnQgbmVlZF9kbWEsIGludCBtYXhfc2cpCiB7Ci0JaW50IGksIGdvdCA9IDA7Ci0JZ2ZwX3QgcHJpb3JpdHk7CiAJc3RydWN0IHN0X2J1ZmZlciAqdGI7CiAKLQlpZiAoZnJvbV9pbml0aWFsaXphdGlvbikKLQkJcHJpb3JpdHkgPSBHRlBfQVRPTUlDOwotCWVsc2UKLQkJcHJpb3JpdHkgPSBHRlBfS0VSTkVMOwotCi0JaSA9IHNpemVvZihzdHJ1Y3Qgc3RfYnVmZmVyKSArIChtYXhfc2cgLSAxKSAqIHNpemVvZihzdHJ1Y3Qgc2NhdHRlcmxpc3QpICsKLQkJbWF4X3NnICogc2l6ZW9mKHN0cnVjdCBzdF9idWZfZnJhZ21lbnQpOwotCXRiID0ga3phbGxvYyhpLCBwcmlvcml0eSk7CisJdGIgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgc3RfYnVmZmVyKSwgR0ZQX0FUT01JQyk7CiAJaWYgKCF0YikgewogCQlwcmludGsoS0VSTl9OT1RJQ0UgInN0OiBDYW4ndCBhbGxvY2F0ZSBuZXcgdGFwZSBidWZmZXIuXG4iKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQotCXRiLT5mcnBfc2VncyA9IHRiLT5vcmlnX2ZycF9zZWdzID0gMDsKKwl0Yi0+ZnJwX3NlZ3MgPSAwOwogCXRiLT51c2Vfc2cgPSBtYXhfc2c7Ci0JdGItPmZycCA9IChzdHJ1Y3Qgc3RfYnVmX2ZyYWdtZW50ICopKCYodGItPnNnWzBdKSArIG1heF9zZyk7Ci0KIAl0Yi0+ZG1hID0gbmVlZF9kbWE7Ci0JdGItPmJ1ZmZlcl9zaXplID0gZ290OwotCXNnX2luaXRfdGFibGUodGItPnNnLCBtYXhfc2cpOworCXRiLT5idWZmZXJfc2l6ZSA9IDA7CisKKwl0Yi0+cmVzZXJ2ZWRfcGFnZXMgPSBremFsbG9jKG1heF9zZyAqIHNpemVvZihzdHJ1Y3QgcGFnZSAqKSwKKwkJCQkgICAgIEdGUF9BVE9NSUMpOworCWlmICghdGItPnJlc2VydmVkX3BhZ2VzKSB7CisJCWtmcmVlKHRiKTsKKwkJcmV0dXJuIE5VTEw7CisJfQogCiAJcmV0dXJuIHRiOwogfQogCiAKIC8qIFRyeSB0byBhbGxvY2F0ZSBlbm91Z2ggc3BhY2UgaW4gdGhlIHRhcGUgYnVmZmVyICovCisjZGVmaW5lIFNUX01BWF9PUkRFUiA2CisKIHN0YXRpYyBpbnQgZW5sYXJnZV9idWZmZXIoc3RydWN0IHN0X2J1ZmZlciAqIFNUYnVmZmVyLCBpbnQgbmV3X3NpemUsIGludCBuZWVkX2RtYSkKIHsKIAlpbnQgc2VncywgbmJyLCBtYXhfc2VncywgYl9zaXplLCBvcmRlciwgZ290OwpAQCAtMzc0NywzMyArMzcxNiw0NSBAQAogCXByaW9yaXR5ID0gR0ZQX0tFUk5FTCB8IF9fR0ZQX05PV0FSTjsKIAlpZiAobmVlZF9kbWEpCiAJCXByaW9yaXR5IHw9IEdGUF9ETUE7Ci0JZm9yIChiX3NpemUgPSBQQUdFX1NJWkUsIG9yZGVyPTA7IG9yZGVyIDw9IDYgJiYKLQkgICAgIGJfc2l6ZSA8IG5ld19zaXplIC0gU1RidWZmZXItPmJ1ZmZlcl9zaXplOwotCSAgICAgb3JkZXIrKywgYl9zaXplICo9IDIpCi0JCTsgIC8qIGVtcHR5ICovCisKKwlpZiAoU1RidWZmZXItPmNsZWFyZWQpCisJCXByaW9yaXR5IHw9IF9fR0ZQX1pFUk87CisKKwlpZiAoU1RidWZmZXItPmZycF9zZWdzKSB7CisJCW9yZGVyID0gU1RidWZmZXItPm1hcF9kYXRhLnBhZ2Vfb3JkZXI7CisJCWJfc2l6ZSA9IFBBR0VfU0laRSA8PCBvcmRlcjsKKwl9IGVsc2UgeworCQlmb3IgKGJfc2l6ZSA9IFBBR0VfU0laRSwgb3JkZXIgPSAwOworCQkgICAgIG9yZGVyIDwgU1RfTUFYX09SREVSICYmIGJfc2l6ZSA8IG5ld19zaXplOworCQkgICAgIG9yZGVyKyssIGJfc2l6ZSAqPSAyKQorCQkJOyAgLyogZW1wdHkgKi8KKwl9CisJaWYgKG1heF9zZWdzICogKFBBR0VfU0laRSA8PCBvcmRlcikgPCBuZXdfc2l6ZSkgeworCQlpZiAob3JkZXIgPT0gU1RfTUFYX09SREVSKQorCQkJcmV0dXJuIDA7CisJCW5vcm1hbGl6ZV9idWZmZXIoU1RidWZmZXIpOworCQlyZXR1cm4gZW5sYXJnZV9idWZmZXIoU1RidWZmZXIsIG5ld19zaXplLCBuZWVkX2RtYSk7CisJfQogCiAJZm9yIChzZWdzID0gU1RidWZmZXItPmZycF9zZWdzLCBnb3QgPSBTVGJ1ZmZlci0+YnVmZmVyX3NpemU7CiAJICAgICBzZWdzIDwgbWF4X3NlZ3MgJiYgZ290IDwgbmV3X3NpemU7KSB7Ci0JCVNUYnVmZmVyLT5mcnBbc2Vnc10ucGFnZSA9IGFsbG9jX3BhZ2VzKHByaW9yaXR5LCBvcmRlcik7Ci0JCWlmIChTVGJ1ZmZlci0+ZnJwW3NlZ3NdLnBhZ2UgPT0gTlVMTCkgewotCQkJaWYgKG5ld19zaXplIC0gZ290IDw9IChtYXhfc2VncyAtIHNlZ3MpICogYl9zaXplIC8gMikgewotCQkJCWJfc2l6ZSAvPSAyOyAvKiBMYXJnZSBlbm91Z2ggZm9yIHRoZSByZXN0IG9mIHRoZSBidWZmZXJzICovCi0JCQkJb3JkZXItLTsKLQkJCQljb250aW51ZTsKLQkJCX0KKwkJc3RydWN0IHBhZ2UgKnBhZ2U7CisKKwkJcGFnZSA9IGFsbG9jX3BhZ2VzKHByaW9yaXR5LCBvcmRlcik7CisJCWlmICghcGFnZSkgewogCQkJREVCKFNUYnVmZmVyLT5idWZmZXJfc2l6ZSA9IGdvdCk7CiAJCQlub3JtYWxpemVfYnVmZmVyKFNUYnVmZmVyKTsKIAkJCXJldHVybiAwOwogCQl9Ci0JCVNUYnVmZmVyLT5mcnBbc2Vnc10ubGVuZ3RoID0gYl9zaXplOworCiAJCVNUYnVmZmVyLT5mcnBfc2VncyArPSAxOwogCQlnb3QgKz0gYl9zaXplOwogCQlTVGJ1ZmZlci0+YnVmZmVyX3NpemUgPSBnb3Q7Ci0JCWlmIChTVGJ1ZmZlci0+Y2xlYXJlZCkKLQkJCW1lbXNldChwYWdlX2FkZHJlc3MoU1RidWZmZXItPmZycFtzZWdzXS5wYWdlKSwgMCwgYl9zaXplKTsKKwkJU1RidWZmZXItPnJlc2VydmVkX3BhZ2VzW3NlZ3NdID0gcGFnZTsKIAkJc2VncysrOwogCX0KLQlTVGJ1ZmZlci0+Yl9kYXRhID0gcGFnZV9hZGRyZXNzKFNUYnVmZmVyLT5mcnBbMF0ucGFnZSk7CisJU1RidWZmZXItPmJfZGF0YSA9IHBhZ2VfYWRkcmVzcyhTVGJ1ZmZlci0+cmVzZXJ2ZWRfcGFnZXNbMF0pOworCVNUYnVmZmVyLT5tYXBfZGF0YS5wYWdlX29yZGVyID0gb3JkZXI7CiAKIAlyZXR1cm4gMTsKIH0KQEAgLTM3ODUsNyArMzc2Niw4IEBACiAJaW50IGk7CiAKIAlmb3IgKGk9MDsgaSA8IHN0X2JwLT5mcnBfc2VnczsgaSsrKQotCQltZW1zZXQocGFnZV9hZGRyZXNzKHN0X2JwLT5mcnBbaV0ucGFnZSksIDAsIHN0X2JwLT5mcnBbaV0ubGVuZ3RoKTsKKwkJbWVtc2V0KHBhZ2VfYWRkcmVzcyhzdF9icC0+cmVzZXJ2ZWRfcGFnZXNbaV0pLCAwLAorCQkgICAgICAgUEFHRV9TSVpFIDw8IHN0X2JwLT5tYXBfZGF0YS5wYWdlX29yZGVyKTsKIAlzdF9icC0+Y2xlYXJlZCA9IDE7CiB9CiAKQEAgLTM3OTMsMTYgKzM3NzUsMTYgQEAKIC8qIFJlbGVhc2UgdGhlIGV4dHJhIGJ1ZmZlciAqLwogc3RhdGljIHZvaWQgbm9ybWFsaXplX2J1ZmZlcihzdHJ1Y3Qgc3RfYnVmZmVyICogU1RidWZmZXIpCiB7Ci0JaW50IGksIG9yZGVyOworCWludCBpLCBvcmRlciA9IFNUYnVmZmVyLT5tYXBfZGF0YS5wYWdlX29yZGVyOwogCi0JZm9yIChpID0gU1RidWZmZXItPm9yaWdfZnJwX3NlZ3M7IGkgPCBTVGJ1ZmZlci0+ZnJwX3NlZ3M7IGkrKykgewotCQlvcmRlciA9IGdldF9vcmRlcihTVGJ1ZmZlci0+ZnJwW2ldLmxlbmd0aCk7Ci0JCV9fZnJlZV9wYWdlcyhTVGJ1ZmZlci0+ZnJwW2ldLnBhZ2UsIG9yZGVyKTsKLQkJU1RidWZmZXItPmJ1ZmZlcl9zaXplIC09IFNUYnVmZmVyLT5mcnBbaV0ubGVuZ3RoOworCWZvciAoaSA9IDA7IGkgPCBTVGJ1ZmZlci0+ZnJwX3NlZ3M7IGkrKykgeworCQlfX2ZyZWVfcGFnZXMoU1RidWZmZXItPnJlc2VydmVkX3BhZ2VzW2ldLCBvcmRlcik7CisJCVNUYnVmZmVyLT5idWZmZXJfc2l6ZSAtPSAoUEFHRV9TSVpFIDw8IG9yZGVyKTsKIAl9Ci0JU1RidWZmZXItPmZycF9zZWdzID0gU1RidWZmZXItPm9yaWdfZnJwX3NlZ3M7Ci0JU1RidWZmZXItPmZycF9zZ19jdXJyZW50ID0gMDsKKwlTVGJ1ZmZlci0+ZnJwX3NlZ3MgPSAwOwogCVNUYnVmZmVyLT5zZ19zZWdzID0gMDsKKwlTVGJ1ZmZlci0+bWFwX2RhdGEucGFnZV9vcmRlciA9IDA7CisJU1RidWZmZXItPm1hcF9kYXRhLm9mZnNldCA9IDA7CiB9CiAKIApAQCAtMzgxMSwxOCArMzc5MywxOSBAQAogc3RhdGljIGludCBhcHBlbmRfdG9fYnVmZmVyKGNvbnN0IGNoYXIgX191c2VyICp1YnAsIHN0cnVjdCBzdF9idWZmZXIgKiBzdF9icCwgaW50IGRvX2NvdW50KQogewogCWludCBpLCBjbnQsIHJlcywgb2Zmc2V0OworCWludCBsZW5ndGggPSBQQUdFX1NJWkUgPDwgc3RfYnAtPm1hcF9kYXRhLnBhZ2Vfb3JkZXI7CiAKIAlmb3IgKGkgPSAwLCBvZmZzZXQgPSBzdF9icC0+YnVmZmVyX2J5dGVzOwotCSAgICAgaSA8IHN0X2JwLT5mcnBfc2VncyAmJiBvZmZzZXQgPj0gc3RfYnAtPmZycFtpXS5sZW5ndGg7IGkrKykKLQkJb2Zmc2V0IC09IHN0X2JwLT5mcnBbaV0ubGVuZ3RoOworCSAgICAgaSA8IHN0X2JwLT5mcnBfc2VncyAmJiBvZmZzZXQgPj0gbGVuZ3RoOyBpKyspCisJCW9mZnNldCAtPSBsZW5ndGg7CiAJaWYgKGkgPT0gc3RfYnAtPmZycF9zZWdzKSB7CS8qIFNob3VsZCBuZXZlciBoYXBwZW4gKi8KIAkJcHJpbnRrKEtFUk5fV0FSTklORyAic3Q6IGFwcGVuZF90b19idWZmZXIgb2Zmc2V0IG92ZXJmbG93LlxuIik7CiAJCXJldHVybiAoLUVJTyk7CiAJfQogCWZvciAoOyBpIDwgc3RfYnAtPmZycF9zZWdzICYmIGRvX2NvdW50ID4gMDsgaSsrKSB7Ci0JCWNudCA9IHN0X2JwLT5mcnBbaV0ubGVuZ3RoIC0gb2Zmc2V0IDwgZG9fY291bnQgPwotCQkgICAgc3RfYnAtPmZycFtpXS5sZW5ndGggLSBvZmZzZXQgOiBkb19jb3VudDsKLQkJcmVzID0gY29weV9mcm9tX3VzZXIocGFnZV9hZGRyZXNzKHN0X2JwLT5mcnBbaV0ucGFnZSkgKyBvZmZzZXQsIHVicCwgY250KTsKKwkJc3RydWN0IHBhZ2UgKnBhZ2UgPSBzdF9icC0+cmVzZXJ2ZWRfcGFnZXNbaV07CisJCWNudCA9IGxlbmd0aCAtIG9mZnNldCA8IGRvX2NvdW50ID8gbGVuZ3RoIC0gb2Zmc2V0IDogZG9fY291bnQ7CisJCXJlcyA9IGNvcHlfZnJvbV91c2VyKHBhZ2VfYWRkcmVzcyhwYWdlKSArIG9mZnNldCwgdWJwLCBjbnQpOwogCQlpZiAocmVzKQogCQkJcmV0dXJuICgtRUZBVUxUKTsKIAkJZG9fY291bnQgLT0gY250OwpAQCAtMzg0MiwxOCArMzgyNSwxOSBAQAogc3RhdGljIGludCBmcm9tX2J1ZmZlcihzdHJ1Y3Qgc3RfYnVmZmVyICogc3RfYnAsIGNoYXIgX191c2VyICp1YnAsIGludCBkb19jb3VudCkKIHsKIAlpbnQgaSwgY250LCByZXMsIG9mZnNldDsKKwlpbnQgbGVuZ3RoID0gUEFHRV9TSVpFIDw8IHN0X2JwLT5tYXBfZGF0YS5wYWdlX29yZGVyOwogCiAJZm9yIChpID0gMCwgb2Zmc2V0ID0gc3RfYnAtPnJlYWRfcG9pbnRlcjsKLQkgICAgIGkgPCBzdF9icC0+ZnJwX3NlZ3MgJiYgb2Zmc2V0ID49IHN0X2JwLT5mcnBbaV0ubGVuZ3RoOyBpKyspCi0JCW9mZnNldCAtPSBzdF9icC0+ZnJwW2ldLmxlbmd0aDsKKwkgICAgIGkgPCBzdF9icC0+ZnJwX3NlZ3MgJiYgb2Zmc2V0ID49IGxlbmd0aDsgaSsrKQorCQlvZmZzZXQgLT0gbGVuZ3RoOwogCWlmIChpID09IHN0X2JwLT5mcnBfc2VncykgewkvKiBTaG91bGQgbmV2ZXIgaGFwcGVuICovCiAJCXByaW50ayhLRVJOX1dBUk5JTkcgInN0OiBmcm9tX2J1ZmZlciBvZmZzZXQgb3ZlcmZsb3cuXG4iKTsKIAkJcmV0dXJuICgtRUlPKTsKIAl9CiAJZm9yICg7IGkgPCBzdF9icC0+ZnJwX3NlZ3MgJiYgZG9fY291bnQgPiAwOyBpKyspIHsKLQkJY250ID0gc3RfYnAtPmZycFtpXS5sZW5ndGggLSBvZmZzZXQgPCBkb19jb3VudCA/Ci0JCSAgICBzdF9icC0+ZnJwW2ldLmxlbmd0aCAtIG9mZnNldCA6IGRvX2NvdW50OwotCQlyZXMgPSBjb3B5X3RvX3VzZXIodWJwLCBwYWdlX2FkZHJlc3Moc3RfYnAtPmZycFtpXS5wYWdlKSArIG9mZnNldCwgY250KTsKKwkJc3RydWN0IHBhZ2UgKnBhZ2UgPSBzdF9icC0+cmVzZXJ2ZWRfcGFnZXNbaV07CisJCWNudCA9IGxlbmd0aCAtIG9mZnNldCA8IGRvX2NvdW50ID8gbGVuZ3RoIC0gb2Zmc2V0IDogZG9fY291bnQ7CisJCXJlcyA9IGNvcHlfdG9fdXNlcih1YnAsIHBhZ2VfYWRkcmVzcyhwYWdlKSArIG9mZnNldCwgY250KTsKIAkJaWYgKHJlcykKIAkJCXJldHVybiAoLUVGQVVMVCk7CiAJCWRvX2NvdW50IC09IGNudDsKQEAgLTM4NzQsNiArMzg1OCw3IEBACiB7CiAJaW50IHNyY19zZWcsIGRzdF9zZWcsIHNyY19vZmZzZXQgPSAwLCBkc3Rfb2Zmc2V0OwogCWludCBjb3VudCwgdG90YWw7CisJaW50IGxlbmd0aCA9IFBBR0VfU0laRSA8PCBzdF9icC0+bWFwX2RhdGEucGFnZV9vcmRlcjsKIAogCWlmIChvZmZzZXQgPT0gMCkKIAkJcmV0dXJuOwpAQCAtMzg4MSwyNCArMzg2NiwyNiBAQAogCXRvdGFsPXN0X2JwLT5idWZmZXJfYnl0ZXMgLSBvZmZzZXQ7CiAJZm9yIChzcmNfc2VnPTA7IHNyY19zZWcgPCBzdF9icC0+ZnJwX3NlZ3M7IHNyY19zZWcrKykgewogCQlzcmNfb2Zmc2V0ID0gb2Zmc2V0OwotCQlpZiAoc3JjX29mZnNldCA8IHN0X2JwLT5mcnBbc3JjX3NlZ10ubGVuZ3RoKQorCQlpZiAoc3JjX29mZnNldCA8IGxlbmd0aCkKIAkJCWJyZWFrOwotCQlvZmZzZXQgLT0gc3RfYnAtPmZycFtzcmNfc2VnXS5sZW5ndGg7CisJCW9mZnNldCAtPSBsZW5ndGg7CiAJfQogCiAJc3RfYnAtPmJ1ZmZlcl9ieXRlcyA9IHN0X2JwLT5yZWFkX3BvaW50ZXIgPSB0b3RhbDsKIAlmb3IgKGRzdF9zZWc9ZHN0X29mZnNldD0wOyB0b3RhbCA+IDA7ICkgewotCQljb3VudCA9IG1pbihzdF9icC0+ZnJwW2RzdF9zZWddLmxlbmd0aCAtIGRzdF9vZmZzZXQsCi0JCQkgICAgc3RfYnAtPmZycFtzcmNfc2VnXS5sZW5ndGggLSBzcmNfb2Zmc2V0KTsKLQkJbWVtbW92ZShwYWdlX2FkZHJlc3Moc3RfYnAtPmZycFtkc3Rfc2VnXS5wYWdlKSArIGRzdF9vZmZzZXQsCi0JCQlwYWdlX2FkZHJlc3Moc3RfYnAtPmZycFtzcmNfc2VnXS5wYWdlKSArIHNyY19vZmZzZXQsIGNvdW50KTsKKwkJc3RydWN0IHBhZ2UgKmRwYWdlID0gc3RfYnAtPnJlc2VydmVkX3BhZ2VzW2RzdF9zZWddOworCQlzdHJ1Y3QgcGFnZSAqc3BhZ2UgPSBzdF9icC0+cmVzZXJ2ZWRfcGFnZXNbc3JjX3NlZ107CisKKwkJY291bnQgPSBtaW4obGVuZ3RoIC0gZHN0X29mZnNldCwgbGVuZ3RoIC0gc3JjX29mZnNldCk7CisJCW1lbW1vdmUocGFnZV9hZGRyZXNzKGRwYWdlKSArIGRzdF9vZmZzZXQsCisJCQlwYWdlX2FkZHJlc3Moc3BhZ2UpICsgc3JjX29mZnNldCwgY291bnQpOwogCQlzcmNfb2Zmc2V0ICs9IGNvdW50OwotCQlpZiAoc3JjX29mZnNldCA+PSBzdF9icC0+ZnJwW3NyY19zZWddLmxlbmd0aCkgeworCQlpZiAoc3JjX29mZnNldCA+PSBsZW5ndGgpIHsKIAkJCXNyY19zZWcrKzsKIAkJCXNyY19vZmZzZXQgPSAwOwogCQl9CiAJCWRzdF9vZmZzZXQgKz0gY291bnQ7Ci0JCWlmIChkc3Rfb2Zmc2V0ID49IHN0X2JwLT5mcnBbZHN0X3NlZ10ubGVuZ3RoKSB7CisJCWlmIChkc3Rfb2Zmc2V0ID49IGxlbmd0aCkgewogCQkJZHN0X3NlZysrOwogCQkJZHN0X29mZnNldCA9IDA7CiAJCX0KQEAgLTM5MDYsMzIgKzM4OTMsNiBAQAogCX0KIH0KIAotCi0vKiBGaWxsIHRoZSBzL2cgbGlzdCB1cCB0byB0aGUgbGVuZ3RoIHJlcXVpcmVkIGZvciB0aGlzIHRyYW5zZmVyICovCi1zdGF0aWMgdm9pZCBidWZfdG9fc2coc3RydWN0IHN0X2J1ZmZlciAqU1RicCwgdW5zaWduZWQgaW50IGxlbmd0aCkKLXsKLQlpbnQgaTsKLQl1bnNpZ25lZCBpbnQgY291bnQ7Ci0Jc3RydWN0IHNjYXR0ZXJsaXN0ICpzZzsKLQlzdHJ1Y3Qgc3RfYnVmX2ZyYWdtZW50ICpmcnA7Ci0KLQlpZiAobGVuZ3RoID09IFNUYnAtPmZycF9zZ19jdXJyZW50KQotCQlyZXR1cm47ICAgLyogd29yayBhbHJlYWR5IGRvbmUgKi8KLQotCXNnID0gJihTVGJwLT5zZ1swXSk7Ci0JZnJwID0gU1RicC0+ZnJwOwotCWZvciAoaT1jb3VudD0wOyBjb3VudCA8IGxlbmd0aDsgaSsrKSB7Ci0JCWlmIChsZW5ndGggLSBjb3VudCA+IGZycFtpXS5sZW5ndGgpCi0JCQlzZ19zZXRfcGFnZSgmc2dbaV0sIGZycFtpXS5wYWdlLCBmcnBbaV0ubGVuZ3RoLCAwKTsKLQkJZWxzZQotCQkJc2dfc2V0X3BhZ2UoJnNnW2ldLCBmcnBbaV0ucGFnZSwgbGVuZ3RoIC0gY291bnQsIDApOwotCQljb3VudCArPSBzZ1tpXS5sZW5ndGg7Ci0JfQotCVNUYnAtPnNnX3NlZ3MgPSBpOwotCVNUYnAtPmZycF9zZ19jdXJyZW50ID0gbGVuZ3RoOwotfQotCi0KIC8qIFZhbGlkYXRlIHRoZSBvcHRpb25zIGZyb20gY29tbWFuZCBsaW5lIG9yIG1vZHVsZSBwYXJhbWV0ZXJzICovCiBzdGF0aWMgdm9pZCB2YWxpZGF0ZV9vcHRpb25zKHZvaWQpCiB7CkBAIC00MDI2LDcgKzM5ODcsNyBAQAogCQlTRHAtPnJlcXVlc3RfcXVldWUtPm1heF9waHlzX3NlZ21lbnRzKTsKIAlpZiAoc3RfbWF4X3NnX3NlZ3MgPCBpKQogCQlpID0gc3RfbWF4X3NnX3NlZ3M7Ci0JYnVmZmVyID0gbmV3X3RhcGVfYnVmZmVyKDEsIChTRHAtPmhvc3QpLT51bmNoZWNrZWRfaXNhX2RtYSwgaSk7CisJYnVmZmVyID0gbmV3X3RhcGVfYnVmZmVyKChTRHAtPmhvc3QpLT51bmNoZWNrZWRfaXNhX2RtYSwgaSk7CiAJaWYgKGJ1ZmZlciA9PSBOVUxMKSB7CiAJCXByaW50ayhLRVJOX0VSUgogCQkgICAgICAgInN0OiBDYW4ndCBhbGxvY2F0ZSBuZXcgdGFwZSBidWZmZXIuIERldmljZSBub3QgYXR0YWNoZWQuXG4iKTsKQEAgLTQyODAsOCArNDI0MSw4IEBACiAJdHBudC0+ZGV2aWNlID0gTlVMTDsKIAogCWlmICh0cG50LT5idWZmZXIpIHsKLQkJdHBudC0+YnVmZmVyLT5vcmlnX2ZycF9zZWdzID0gMDsKIAkJbm9ybWFsaXplX2J1ZmZlcih0cG50LT5idWZmZXIpOworCQlrZnJlZSh0cG50LT5idWZmZXItPnJlc2VydmVkX3BhZ2VzKTsKIAkJa2ZyZWUodHBudC0+YnVmZmVyKTsKIAl9CiAKQEAgLTQ1NjcsMTQgKzQ1MjgsMTYgQEAKIH0KIAogLyogVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgbWF5IGJlIHVzZWZ1bCBmb3IgYSBsYXJnZXIgYXVkaWVuY2UuICovCi1zdGF0aWMgaW50IHNnbF9tYXBfdXNlcl9wYWdlcyhzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnbCwgY29uc3QgdW5zaWduZWQgaW50IG1heF9wYWdlcywgCi0JCQkgICAgICB1bnNpZ25lZCBsb25nIHVhZGRyLCBzaXplX3QgY291bnQsIGludCBydykKK3N0YXRpYyBpbnQgc2dsX21hcF91c2VyX3BhZ2VzKHN0cnVjdCBzdF9idWZmZXIgKlNUYnAsCisJCQkgICAgICBjb25zdCB1bnNpZ25lZCBpbnQgbWF4X3BhZ2VzLCB1bnNpZ25lZCBsb25nIHVhZGRyLAorCQkJICAgICAgc2l6ZV90IGNvdW50LCBpbnQgcncpCiB7CiAJdW5zaWduZWQgbG9uZyBlbmQgPSAodWFkZHIgKyBjb3VudCArIFBBR0VfU0laRSAtIDEpID4+IFBBR0VfU0hJRlQ7CiAJdW5zaWduZWQgbG9uZyBzdGFydCA9IHVhZGRyID4+IFBBR0VfU0hJRlQ7CiAJY29uc3QgaW50IG5yX3BhZ2VzID0gZW5kIC0gc3RhcnQ7CiAJaW50IHJlcywgaSwgajsKIAlzdHJ1Y3QgcGFnZSAqKnBhZ2VzOworCXN0cnVjdCBycV9tYXBfZGF0YSAqbWRhdGEgPSAmU1RicC0+bWFwX2RhdGE7CiAKIAkvKiBVc2VyIGF0dGVtcHRlZCBPdmVyZmxvdyEgKi8KIAlpZiAoKHVhZGRyICsgY291bnQpIDwgdWFkZHIpCkBAIC00NjE2LDI0ICs0NTc5LDExIEBACiAJCWZsdXNoX2RjYWNoZV9wYWdlKHBhZ2VzW2ldKTsKICAgICAgICAgfQogCi0JLyogUG9wdWxhdGUgdGhlIHNjYXR0ZXIvZ2F0aGVyIGxpc3QgKi8KLQlzZ19zZXRfcGFnZSgmc2dsWzBdLCBwYWdlc1swXSwgMCwgdWFkZHIgJiB+UEFHRV9NQVNLKTsKLQlpZiAobnJfcGFnZXMgPiAxKSB7Ci0JCXNnbFswXS5sZW5ndGggPSBQQUdFX1NJWkUgLSBzZ2xbMF0ub2Zmc2V0OwotCQljb3VudCAtPSBzZ2xbMF0ubGVuZ3RoOwotCQlmb3IgKGk9MTsgaSA8IG5yX3BhZ2VzIDsgaSsrKSB7Ci0JCQlzZ19zZXRfcGFnZSgmc2dsW2ldLCBwYWdlc1tpXSwKLQkJCQkgICAgY291bnQgPCBQQUdFX1NJWkUgPyBjb3VudCA6IFBBR0VfU0laRSwgMCk7OwotCQkJY291bnQgLT0gUEFHRV9TSVpFOwotCQl9Ci0JfQotCWVsc2UgewotCQlzZ2xbMF0ubGVuZ3RoID0gY291bnQ7Ci0JfQorCW1kYXRhLT5vZmZzZXQgPSB1YWRkciAmIH5QQUdFX01BU0s7CisJbWRhdGEtPnBhZ2Vfb3JkZXIgPSAwOworCVNUYnAtPm1hcHBlZF9wYWdlcyA9IHBhZ2VzOwogCi0Ja2ZyZWUocGFnZXMpOwogCXJldHVybiBucl9wYWdlczsKLQogIG91dF91bm1hcDoKIAlpZiAocmVzID4gMCkgewogCQlmb3IgKGo9MDsgaiA8IHJlczsgaisrKQpAQCAtNDY0NiwxMyArNDU5NiwxMyBAQAogCiAKIC8qIEFuZCB1bm1hcCB0aGVtLi4uICovCi1zdGF0aWMgaW50IHNnbF91bm1hcF91c2VyX3BhZ2VzKHN0cnVjdCBzY2F0dGVybGlzdCAqc2dsLCBjb25zdCB1bnNpZ25lZCBpbnQgbnJfcGFnZXMsCi0JCQkJaW50IGRpcnRpZWQpCitzdGF0aWMgaW50IHNnbF91bm1hcF91c2VyX3BhZ2VzKHN0cnVjdCBzdF9idWZmZXIgKlNUYnAsCisJCQkJY29uc3QgdW5zaWduZWQgaW50IG5yX3BhZ2VzLCBpbnQgZGlydGllZCkKIHsKIAlpbnQgaTsKIAogCWZvciAoaT0wOyBpIDwgbnJfcGFnZXM7IGkrKykgewotCQlzdHJ1Y3QgcGFnZSAqcGFnZSA9IHNnX3BhZ2UoJnNnbFtpXSk7CisJCXN0cnVjdCBwYWdlICpwYWdlID0gU1RicC0+bWFwcGVkX3BhZ2VzW2ldOwogCiAJCWlmIChkaXJ0aWVkKQogCQkJU2V0UGFnZURpcnR5KHBhZ2UpOwpAQCAtNDY2MSw2ICs0NjExLDggQEAKIAkJICovCiAJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKIAl9CisJa2ZyZWUoU1RicC0+bWFwcGVkX3BhZ2VzKTsKKwlTVGJwLT5tYXBwZWRfcGFnZXMgPSBOVUxMOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc3QuaCBiL2RyaXZlcnMvc2NzaS9zdC5oCmluZGV4IGI5MjcxMmYuLjU0NGRjNmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9zdC5oCisrKyBiL2RyaXZlcnMvc2NzaS9zdC5oCkBAIC0yOSw2ICsyOSw3IEBACiAJaW50IHJlc3VsdDsKIAlzdHJ1Y3Qgc2NzaV90YXBlICpzdHA7CiAJc3RydWN0IGNvbXBsZXRpb24gKndhaXRpbmc7CisJc3RydWN0IGJpbyAqYmlvOwogfTsKIAogLyogVGhlIHRhcGUgYnVmZmVyIGRlc2NyaXB0b3IuICovCkBAIC00NCwyMCArNDUsMTMgQEAKIAlpbnQgc3lzY2FsbF9yZXN1bHQ7CiAJc3RydWN0IHN0X3JlcXVlc3QgKmxhc3RfU1JwbnQ7CiAJc3RydWN0IHN0X2NtZHN0YXR1cyBjbWRzdGF0OworCXN0cnVjdCBwYWdlICoqcmVzZXJ2ZWRfcGFnZXM7CisJc3RydWN0IHBhZ2UgKiptYXBwZWRfcGFnZXM7CisJc3RydWN0IHJxX21hcF9kYXRhIG1hcF9kYXRhOwogCXVuc2lnbmVkIGNoYXIgKmJfZGF0YTsKIAl1bnNpZ25lZCBzaG9ydCB1c2Vfc2c7CS8qIHplcm8gb3IgbWF4IG51bWJlciBvZiBzL2cgc2VnbWVudHMgZm9yIHRoaXMgYWRhcHRlciAqLwogCXVuc2lnbmVkIHNob3J0IHNnX3NlZ3M7CQkvKiBudW1iZXIgb2Ygc2VnbWVudHMgaW4gcy9nIGxpc3QgKi8KLQl1bnNpZ25lZCBzaG9ydCBvcmlnX2ZycF9zZWdzOwkvKiBudW1iZXIgb2Ygc2VnbWVudHMgYWxsb2NhdGVkIGF0IGZpcnN0IHRyeSAqLwogCXVuc2lnbmVkIHNob3J0IGZycF9zZWdzOwkvKiBudW1iZXIgb2YgYnVmZmVyIHNlZ21lbnRzICovCi0JdW5zaWduZWQgaW50IGZycF9zZ19jdXJyZW50OwkvKiBkcml2ZXIgYnVmZmVyIGxlbmd0aCBjdXJyZW50bHkgaW4gcy9nIGxpc3QgKi8KLQlzdHJ1Y3Qgc3RfYnVmX2ZyYWdtZW50ICpmcnA7CS8qIHRoZSBhbGxvY2F0ZWQgYnVmZmVyIGZyYWdtZW50IGxpc3QgKi8KLQlzdHJ1Y3Qgc2NhdHRlcmxpc3Qgc2dbMV07CS8qIE1VU1QgQkUgbGFzdCBpdGVtICovCi19OwotCi0vKiBUaGUgdGFwZSBidWZmZXIgZnJhZ21lbnQgZGVzY3JpcHRvciAqLwotc3RydWN0IHN0X2J1Zl9mcmFnbWVudCB7Ci0Jc3RydWN0IHBhZ2UgKnBhZ2U7Ci0JdW5zaWduZWQgaW50IGxlbmd0aDsKIH07CiAKIC8qIFRoZSB0YXBlIG1vZGUgZGVmaW5pdGlvbiAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3phbG9uLmMgYi9kcml2ZXJzL3Njc2kvemFsb24uYwppbmRleCAzYzRhMzAwLi5hOGQ2MWE2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvemFsb24uYworKysgYi9kcml2ZXJzL3Njc2kvemFsb24uYwpAQCAtMTM3LDggKzEzNyw4IEBACiAJCWdvdG8gZmFpbDsKIAogCWlmIChyZXF1ZXN0X2lycShkZXYtPmlycSwgbmNyNTNjOHh4X2ludHIsIElSUUZfU0hBUkVELCAiemFsb24iLCBob3N0KSkgewotCQlwcmludGsoS0VSTl9FUlIgIiVzOiBpcnEgcHJvYmxlbSB3aXRoICVkLCBkZXRhY2hpbmdcbiAiLAotCQkJZGV2LT5kZXYuYnVzX2lkLCBkZXYtPmlycSk7CisJICBkZXZfcHJpbnRrKEtFUk5fRVJSLCBkZXYsICJpcnEgcHJvYmxlbSB3aXRoICVkLCBkZXRhY2hpbmdcbiAiLAorCQkgICAgIGRldi0+aXJxKTsKIAkJZ290byBmYWlsOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvODI1MC5jIGIvZHJpdmVycy9zZXJpYWwvODI1MC5jCmluZGV4IGRhYTAwNTYuLjBkOTM0YmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsLzgyNTAuYworKysgYi9kcml2ZXJzL3NlcmlhbC84MjUwLmMKQEAgLTI4MzksNiArMjgzOSw4IEBACiAJcC0+ZmxhZ3MgICAgICAgID0gcG9ydC0+ZmxhZ3M7CiAJcC0+bWFwYmFzZSAgICAgID0gcG9ydC0+bWFwYmFzZTsKIAlwLT5wcml2YXRlX2RhdGEgPSBwb3J0LT5wcml2YXRlX2RhdGE7CisJcC0+dHlwZQkJPSBwb3J0LT50eXBlOworCXAtPmxpbmUJCT0gcG9ydC0+bGluZTsKIAogCXNldF9pb19mcm9tX3VwaW8ocCk7CiAJaWYgKHBvcnQtPnNlcmlhbF9pbikKQEAgLTMxMjMsNyArMzEyNSw3IEBACiAJaWYgKG5yX3VhcnRzID4gVUFSVF9OUikKIAkJbnJfdWFydHMgPSBVQVJUX05SOwogCi0JcHJpbnRrKEtFUk5fSU5GTyAiU2VyaWFsOiA4MjUwLzE2NTUwIGRyaXZlciIKKwlwcmludGsoS0VSTl9JTkZPICJTZXJpYWw6IDgyNTAvMTY1NTAgZHJpdmVyLCAiCiAJCSIlZCBwb3J0cywgSVJRIHNoYXJpbmcgJXNhYmxlZFxuIiwgbnJfdWFydHMsCiAJCXNoYXJlX2lycXMgPyAiZW4iIDogImRpcyIpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC84MjUwX3BjaS5jIGIvZHJpdmVycy9zZXJpYWwvODI1MF9wY2kuYwppbmRleCBjMDg4MTQ2Li4yYTM2NzEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC84MjUwX3BjaS5jCisrKyBiL2RyaXZlcnMvc2VyaWFsLzgyNTBfcGNpLmMKQEAgLTYwMiw2ICs2MDIsMTAgQEAKIAkvKiBzdWJkZXZpY2UgMHgwMFBTIG1lYW5zIDxQPiBwYXJhbGxlbCwgPFM+IHNlcmlhbCAqLwogCXVuc2lnbmVkIGludCBudW1fc2VyaWFsID0gZGV2LT5zdWJzeXN0ZW1fZGV2aWNlICYgMHhmOwogCisJaWYgKGRldi0+c3Vic3lzdGVtX3ZlbmRvciA9PSBQQ0lfVkVORE9SX0lEX0lCTSAmJgorCQkJZGV2LT5zdWJzeXN0ZW1fZGV2aWNlID09IDB4MDI5OSkKKwkJcmV0dXJuIDA7CisKIAlpZiAobnVtX3NlcmlhbCA9PSAwKQogCQlyZXR1cm4gLUVOT0RFVjsKIAlyZXR1cm4gbnVtX3NlcmlhbDsKQEAgLTMwOTYsNiArMzEwMCwxMCBAQAogCQkwLAogCQlwYm5fYjBfOF8xMTUyMDAgfSwKIAorCXsJUENJX1ZFTkRPUl9JRF9ORVRNT1MsIFBDSV9ERVZJQ0VfSURfTkVUTU9TXzk4MzUsCisJCVBDSV9WRU5ET1JfSURfSUJNLCAweDAyOTksCisJCTAsIDAsIHBibl9iMF9idF8yXzExNTIwMCB9LAorCiAJLyoKIAkgKiBUaGVzZSBlbnRyaWVzIG1hdGNoIGRldmljZXMgd2l0aCBjbGFzcyBDT01NVU5JQ0FUSU9OX1NFUklBTCwKIAkgKiBDT01NVU5JQ0FUSU9OX01PREVNIG9yIENPTU1VTklDQVRJT05fTVVMVElTRVJJQUwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsLzgyNTBfcG5wLmMgYi9kcml2ZXJzL3NlcmlhbC84MjUwX3BucC5jCmluZGV4IGZkZTdmOWMuLmJiY2ZjMjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsLzgyNTBfcG5wLmMKKysrIGIvZHJpdmVycy9zZXJpYWwvODI1MF9wbnAuYwpAQCAtMjcwLDYgKzI3MCw4IEBACiAJeyAgICAgICAiUlNTMDI1MCIsICAgICAgICAgICAgICAwICAgICAgIH0sCiAJLyogU3VwcmFFeHByZXNzIDI4LjggRGF0YS9GYXggUG5QIG1vZGVtICovCiAJewkiU1VQMTMxMCIsCQkwCX0sCisJLyogU3VwcmFFeHByZXNzIDMzNmkgUG5QIFZvaWNlIE1vZGVtICovCisJewkiU1VQMTM4MSIsCQkwCX0sCiAJLyogU3VwcmFFeHByZXNzIDMzLjYgRGF0YS9GYXggUG5QIG1vZGVtICovCiAJewkiU1VQMTQyMSIsCQkwCX0sCiAJLyogU3VwcmFFeHByZXNzIDMzLjYgRGF0YS9GYXggUG5QIG1vZGVtICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC9LY29uZmlnIGIvZHJpdmVycy9zZXJpYWwvS2NvbmZpZwppbmRleCBiNjk1YWIzLi4zZTUyNWUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC9LY29uZmlnCisrKyBiL2RyaXZlcnMvc2VyaWFsL0tjb25maWcKQEAgLTQ1Nyw3ICs0NTcsNyBAQAogCiBjb25maWcgU0VSSUFMX1NBTVNVTkdfVUFSVFMKIAlpbnQKLQlkZXBlbmRzIG9uIFNFUklBTF9TQU1TVU5HCisJZGVwZW5kcyBvbiBBUk0gJiYgUExBVF9TM0MKIAlkZWZhdWx0IDIgaWYgQVJDSF9TM0MyNDAwCiAJZGVmYXVsdCA0IGlmIEFSQ0hfUzNDNjRYWCB8fCBDUFVfUzNDMjQ0MwogCWRlZmF1bHQgMwpAQCAtMTMyMCwxMyArMTMyMCwzMCBAQAogY29uZmlnIFNFUklBTF9PRl9QTEFURk9STQogCXRyaXN0YXRlICJTZXJpYWwgcG9ydCBvbiBPcGVuIEZpcm13YXJlIHBsYXRmb3JtIGJ1cyIKIAlkZXBlbmRzIG9uIFBQQ19PRgotCWRlcGVuZHMgb24gU0VSSUFMXzgyNTAKKwlkZXBlbmRzIG9uIFNFUklBTF84MjUwIHx8IFNFUklBTF9PRl9QTEFURk9STV9OV1BTRVJJQUwKIAloZWxwCiAJICBJZiB5b3UgaGF2ZSBhIFBvd2VyUEMgYmFzZWQgc3lzdGVtIHRoYXQgaGFzIHNlcmlhbCBwb3J0cwogCSAgb24gYSBwbGF0Zm9ybSBzcGVjaWZpYyBidXMsIHlvdSBzaG91bGQgZW5hYmxlIHRoaXMgb3B0aW9uLgogCSAgQ3VycmVudGx5LCBvbmx5IDgyNTAgY29tcGF0aWJsZSBwb3J0cyBhcmUgc3VwcG9ydGVkLCBidXQKIAkgIG90aGVycyBjYW4gZWFzaWx5IGJlIGFkZGVkLgogCitjb25maWcgU0VSSUFMX09GX1BMQVRGT1JNX05XUFNFUklBTAorCXRyaXN0YXRlICJOV1Agc2VyaWFsIHBvcnQgZHJpdmVyIgorCWRlcGVuZHMgb24gUFBDX09GICYmIFBQQ19EQ1IKKwlzZWxlY3QgU0VSSUFMX09GX1BMQVRGT1JNCisJc2VsZWN0IFNFUklBTF9DT1JFX0NPTlNPTEUKKwlzZWxlY3QgU0VSSUFMX0NPUkUKKwloZWxwCisJICBUaGlzIGRyaXZlciBzdXBwb3J0cyB0aGUgY2VsbCBuZXR3b3JrIHByb2Nlc3NvciBud3Agc2VyaWFsCisJICBkZXZpY2UuCisKK2NvbmZpZyBTRVJJQUxfT0ZfUExBVEZPUk1fTldQU0VSSUFMX0NPTlNPTEUKKwlib29sICJDb25zb2xlIG9uIE5XUCBzZXJpYWwgcG9ydCIKKwlkZXBlbmRzIG9uIFNFUklBTF9PRl9QTEFURk9STV9OV1BTRVJJQUw9eQorCXNlbGVjdCBTRVJJQUxfQ09SRV9DT05TT0xFCisJaGVscAorCSAgU3VwcG9ydCBmb3IgQ29uc29sZSBvbiB0aGUgTldQIHNlcmlhbCBwb3J0cy4KKwogY29uZmlnIFNFUklBTF9RRQogCXRyaXN0YXRlICJGcmVlc2NhbGUgUVVJQ0MgRW5naW5lIHNlcmlhbCBwb3J0IHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBRVUlDQ19FTkdJTkUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsL01ha2VmaWxlIGIvZHJpdmVycy9zZXJpYWwvTWFrZWZpbGUKaW5kZXggZGZlNzc1YS4uODg0NGMwYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9zZXJpYWwvTWFrZWZpbGUKQEAgLTcyLDYgKzcyLDcgQEAKIG9iai0kKENPTkZJR19TRVJJQUxfVUFSVExJVEUpICs9IHVhcnRsaXRlLm8KIG9iai0kKENPTkZJR19TRVJJQUxfTkVUWCkgKz0gbmV0eC1zZXJpYWwubwogb2JqLSQoQ09ORklHX1NFUklBTF9PRl9QTEFURk9STSkgKz0gb2Zfc2VyaWFsLm8KK29iai0kKENPTkZJR19TRVJJQUxfT0ZfUExBVEZPUk1fTldQU0VSSUFMKSArPSBud3BzZXJpYWwubwogb2JqLSQoQ09ORklHX1NFUklBTF9LUzg2OTUpICs9IHNlcmlhbF9rczg2OTUubwogb2JqLSQoQ09ORklHX0tHREJfU0VSSUFMX0NPTlNPTEUpICs9IGtnZGJvYy5vCiBvYmotJChDT05GSUdfU0VSSUFMX1FFKSArPSB1Y2NfdWFydC5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC9hdG1lbF9zZXJpYWwuYyBiL2RyaXZlcnMvc2VyaWFsL2F0bWVsX3NlcmlhbC5jCmluZGV4IGQ1ZWZkNmMuLjg5MzYyZDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsL2F0bWVsX3NlcmlhbC5jCisrKyBiL2RyaXZlcnMvc2VyaWFsL2F0bWVsX3NlcmlhbC5jCkBAIC01NzksNyArNTc5LDcgQEAKIAkvKiBkaXNhYmxlIFBEQyB0cmFuc21pdCAqLwogCVVBUlRfUFVUX1BUQ1IocG9ydCwgQVRNRUxfUERDX1RYVERJUyk7CiAKLQlpZiAoIXVhcnRfY2lyY19lbXB0eSh4bWl0KSkgeworCWlmICghdWFydF9jaXJjX2VtcHR5KHhtaXQpICYmICF1YXJ0X3R4X3N0b3BwZWQocG9ydCkpIHsKIAkJZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2UocG9ydC0+ZGV2LAogCQkJCQkgICBwZGMtPmRtYV9hZGRyLAogCQkJCQkgICBwZGMtPmRtYV9zaXplLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvY3Jpc3YxMC5jIGIvZHJpdmVycy9zZXJpYWwvY3Jpc3YxMC5jCmluZGV4IDhiMmM2MTkuLmU2NDJjMjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsL2NyaXN2MTAuYworKysgYi9kcml2ZXJzL3NlcmlhbC9jcmlzdjEwLmMKQEAgLTEyMDMsNyArMTIwMyw3IEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCS8qIERpc2FibGUgb3V0cHV0IERNQSBjaGFubmVsIGZvciB0aGUgc2VyaWFsIHBvcnQgaW4gcXVlc3Rpb24KLQkgKiAoIHNldCB0byBzb21ldGhpbmcgb3RoZXIgdGhlbiBzZXJpYWxYKQorCSAqICggc2V0IHRvIHNvbWV0aGluZyBvdGhlciB0aGFuIHNlcmlhbFgpCiAJICovCiAJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwogCURGTE9XKERFQlVHX0xPRyhpbmZvLT5saW5lLCAiZGlzYWJsZV90eGRtYV9jaGFubmVsICVpXG4iLCBpbmZvLT5saW5lKSk7CkBAIC0xMjY2LDcgKzEyNjYsNyBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAkvKiBEaXNhYmxlIGlucHV0IERNQSBjaGFubmVsIGZvciB0aGUgc2VyaWFsIHBvcnQgaW4gcXVlc3Rpb24KLQkgKiAoIHNldCB0byBzb21ldGhpbmcgb3RoZXIgdGhlbiBzZXJpYWxYKQorCSAqICggc2V0IHRvIHNvbWV0aGluZyBvdGhlciB0aGFuIHNlcmlhbFgpCiAJICovCiAJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwogCWlmIChpbmZvLT5saW5lID09IDApIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsL2pzbS9qc21fbmVvLmMgYi9kcml2ZXJzL3NlcmlhbC9qc20vanNtX25lby5jCmluZGV4IGI3NTg0Y2EuLmU2MzkwZDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsL2pzbS9qc21fbmVvLmMKKysrIGIvZHJpdmVycy9zZXJpYWwvanNtL2pzbV9uZW8uYwpAQCAtNTc3LDkgKzU3Nyw2IEBACiAJanNtX3ByaW50ayhNU0lHUywgSU5GTywgJmNoLT5jaF9iZC0+cGNpX2RldiwKIAkJCSJuZW9fcGFyc2VfbW9kZW06IHBvcnQ6ICVkIG1zaWduYWxzOiAleFxuIiwgY2gtPmNoX3BvcnRudW0sIG1zaWduYWxzKTsKIAotCWlmICghY2gpCi0JCXJldHVybjsKLQogCS8qIFNjcnViIG9mZiBsb3dlciBiaXRzLiBUaGV5IHNpZ25pZnkgZGVsdGEncywgd2hpY2ggSSBkb24ndCBjYXJlIGFib3V0ICovCiAJLyogS2VlcCBERENEIGFuZCBERFNSIHRob3VnaCAqLwogCW1zaWduYWxzICY9IDB4Zjg7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC9ud3BzZXJpYWwuYyBiL2RyaXZlcnMvc2VyaWFsL253cHNlcmlhbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyZjNlYWYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3NlcmlhbC9ud3BzZXJpYWwuYwpAQCAtMCwwICsxLDQ3NSBAQAorLyoKKyAqICBTZXJpYWwgUG9ydCBkcml2ZXIgZm9yIGEgTldQIHVhcnQgZGV2aWNlCisgKgorICogICAgQ29weXJpZ2h0IChDKSAyMDA4IElCTSBDb3JwLiwgQmVuamFtaW4gS3JpbGwgPGJlbkBjb2RpZXJ0Lm9yZz4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAgMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKi8KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvY29uc29sZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcmlhbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF9yZWcuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWxfY29yZS5oPgorI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgorI2luY2x1ZGUgPGxpbnV4L2lycXJldHVybi5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvb2ZfcGxhdGZvcm0uaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ud3BzZXJpYWwuaD4KKyNpbmNsdWRlIDxhc20vcHJvbS5oPgorI2luY2x1ZGUgPGFzbS9kY3IuaD4KKworI2RlZmluZSBOV1BTRVJJQUxfTlIgICAgICAgICAgICAgICAyCisKKyNkZWZpbmUgTldQU0VSSUFMX1NUQVRVU19SWFZBTElEIDB4MQorI2RlZmluZSBOV1BTRVJJQUxfU1RBVFVTX1RYRlVMTCAgMHgyCisKK3N0cnVjdCBud3BzZXJpYWxfcG9ydCB7CisJc3RydWN0IHVhcnRfcG9ydCBwb3J0OworCWRjcl9ob3N0X3QgZGNyX2hvc3Q7CisJdW5zaWduZWQgaW50IGllcjsKKwl1bnNpZ25lZCBpbnQgbWNyOworfTsKKworc3RhdGljIERFRklORV9NVVRFWChud3BzZXJpYWxfbXV0ZXgpOworc3RhdGljIHN0cnVjdCBud3BzZXJpYWxfcG9ydCBud3BzZXJpYWxfcG9ydHNbTldQU0VSSUFMX05SXTsKKworc3RhdGljIHZvaWQgd2FpdF9mb3JfYml0cyhzdHJ1Y3Qgbndwc2VyaWFsX3BvcnQgKnVwLCBpbnQgYml0cykKK3sKKwl1bnNpZ25lZCBpbnQgc3RhdHVzLCB0bW91dCA9IDEwMDAwOworCisJLyogV2FpdCB1cCB0byAxMG1zIGZvciB0aGUgY2hhcmFjdGVyKHMpIHRvIGJlIHNlbnQuICovCisJZG8geworCQlzdGF0dXMgPSBkY3JfcmVhZCh1cC0+ZGNyX2hvc3QsIFVBUlRfTFNSKTsKKworCQlpZiAoLS10bW91dCA9PSAwKQorCQkJYnJlYWs7CisJCXVkZWxheSgxKTsKKwl9IHdoaWxlICgoc3RhdHVzICYgYml0cykgIT0gYml0cyk7Cit9CisKKyNpZmRlZiBDT05GSUdfU0VSSUFMX09GX1BMQVRGT1JNX05XUFNFUklBTF9DT05TT0xFCitzdGF0aWMgdm9pZCBud3BzZXJpYWxfY29uc29sZV9wdXRjaGFyKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsIGludCBjKQoreworCXN0cnVjdCBud3BzZXJpYWxfcG9ydCAqdXA7CisJdXAgPSBjb250YWluZXJfb2YocG9ydCwgc3RydWN0IG53cHNlcmlhbF9wb3J0LCBwb3J0KTsKKwkvKiBjaGVjayBpZiB0eCBidWZmZXIgaXMgZnVsbCAqLworCXdhaXRfZm9yX2JpdHModXAsIFVBUlRfTFNSX1RIUkUpOworCWRjcl93cml0ZSh1cC0+ZGNyX2hvc3QsIFVBUlRfVFgsIGMpOworCXVwLT5wb3J0Lmljb3VudC50eCsrOworfQorCitzdGF0aWMgdm9pZAorbndwc2VyaWFsX2NvbnNvbGVfd3JpdGUoc3RydWN0IGNvbnNvbGUgKmNvLCBjb25zdCBjaGFyICpzLCB1bnNpZ25lZCBpbnQgY291bnQpCit7CisJc3RydWN0IG53cHNlcmlhbF9wb3J0ICp1cCA9ICZud3BzZXJpYWxfcG9ydHNbY28tPmluZGV4XTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBsb2NrZWQgPSAxOworCisJaWYgKG9vcHNfaW5fcHJvZ3Jlc3MpCisJCWxvY2tlZCA9IHNwaW5fdHJ5bG9ja19pcnFzYXZlKCZ1cC0+cG9ydC5sb2NrLCBmbGFncyk7CisJZWxzZQorCQlzcGluX2xvY2tfaXJxc2F2ZSgmdXAtPnBvcnQubG9jaywgZmxhZ3MpOworCisJLyogc2F2ZSBhbmQgZGlzYWJsZSBpbnRlcnJ1cHQgKi8KKwl1cC0+aWVyID0gZGNyX3JlYWQodXAtPmRjcl9ob3N0LCBVQVJUX0lFUik7CisJZGNyX3dyaXRlKHVwLT5kY3JfaG9zdCwgVUFSVF9JRVIsIHVwLT5pZXIgJiB+VUFSVF9JRVJfUkRJKTsKKworCXVhcnRfY29uc29sZV93cml0ZSgmdXAtPnBvcnQsIHMsIGNvdW50LCBud3BzZXJpYWxfY29uc29sZV9wdXRjaGFyKTsKKworCS8qIHdhaXQgZm9yIHRyYW5zbWl0dGVyIHRvIGJlY29tZSBlbXRweSAqLworCXdoaWxlICgoZGNyX3JlYWQodXAtPmRjcl9ob3N0LCBVQVJUX0xTUikgJiBVQVJUX0xTUl9USFJFKSA9PSAwKQorCQljcHVfcmVsYXgoKTsKKworCS8qIHJlc3RvcmUgaW50ZXJydXB0IHN0YXRlICovCisJZGNyX3dyaXRlKHVwLT5kY3JfaG9zdCwgVUFSVF9JRVIsIHVwLT5pZXIpOworCisJaWYgKGxvY2tlZCkKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdXAtPnBvcnQubG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgc3RydWN0IHVhcnRfZHJpdmVyIG53cHNlcmlhbF9yZWc7CitzdGF0aWMgc3RydWN0IGNvbnNvbGUgbndwc2VyaWFsX2NvbnNvbGUgPSB7CisJLm5hbWUJCT0gInR0eVNRIiwKKwkud3JpdGUJCT0gbndwc2VyaWFsX2NvbnNvbGVfd3JpdGUsCisJLmRldmljZQkJPSB1YXJ0X2NvbnNvbGVfZGV2aWNlLAorCS5mbGFncwkJPSBDT05fUFJJTlRCVUZGRVIsCisJLmluZGV4CQk9IC0xLAorCS5kYXRhCQk9ICZud3BzZXJpYWxfcmVnLAorfTsKKyNkZWZpbmUgTldQU0VSSUFMX0NPTlNPTEUJKCZud3BzZXJpYWxfY29uc29sZSkKKyNlbHNlCisjZGVmaW5lIE5XUFNFUklBTF9DT05TT0xFCU5VTEwKKyNlbmRpZiAvKiBDT05GSUdfU0VSSUFMX09GX1BMQVRGT1JNX05XUFNFUklBTF9DT05TT0xFICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGludCBud3BzZXJpYWxfcmVxdWVzdF9wb3J0KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIG53cHNlcmlhbF9yZWxlYXNlX3BvcnQoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKK3sKKwkvKiBOL0EgKi8KK30KKworc3RhdGljIHZvaWQgbndwc2VyaWFsX2NvbmZpZ19wb3J0KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsIGludCBmbGFncykKK3sKKwlwb3J0LT50eXBlID0gUE9SVF9OV1BTRVJJQUw7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBud3BzZXJpYWxfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwlzdHJ1Y3Qgbndwc2VyaWFsX3BvcnQgKnVwID0gZGV2X2lkOworCXN0cnVjdCB0dHlfc3RydWN0ICp0dHkgPSB1cC0+cG9ydC5pbmZvLT5wb3J0LnR0eTsKKwlpcnFyZXR1cm5fdCByZXQ7CisJdW5zaWduZWQgaW50IGlpcjsKKwl1bnNpZ25lZCBjaGFyIGNoOworCisJc3Bpbl9sb2NrKCZ1cC0+cG9ydC5sb2NrKTsKKworCS8qIGNoZWNrIGlmIHRoZSB1YXJ0IHdhcyB0aGUgaW50ZXJydXB0IHNvdXJjZS4gKi8KKwlpaXIgPSBkY3JfcmVhZCh1cC0+ZGNyX2hvc3QsIFVBUlRfSUlSKTsKKwlpZiAoIWlpcikgeworCQlyZXQgPSBJUlFfTk9ORTsKKwkJZ290byBvdXQ7CisJfQorCisJZG8geworCQl1cC0+cG9ydC5pY291bnQucngrKzsKKwkJY2ggPSBkY3JfcmVhZCh1cC0+ZGNyX2hvc3QsIFVBUlRfUlgpOworCQlpZiAodXAtPnBvcnQuaWdub3JlX3N0YXR1c19tYXNrICE9IE5XUFNFUklBTF9TVEFUVVNfUlhWQUxJRCkKKwkJCXR0eV9pbnNlcnRfZmxpcF9jaGFyKHR0eSwgY2gsIFRUWV9OT1JNQUwpOworCX0gd2hpbGUgKGRjcl9yZWFkKHVwLT5kY3JfaG9zdCwgVUFSVF9SWCkgJiBVQVJUX0xTUl9EUik7CisKKwl0dHlfZmxpcF9idWZmZXJfcHVzaCh0dHkpOworCXJldCA9IElSUV9IQU5ETEVEOworCitvdXQ6CisJc3Bpbl91bmxvY2soJnVwLT5wb3J0LmxvY2spOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbndwc2VyaWFsX3N0YXJ0dXAoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKK3sKKwlzdHJ1Y3Qgbndwc2VyaWFsX3BvcnQgKnVwOworCWludCBlcnI7CisKKwl1cCA9IGNvbnRhaW5lcl9vZihwb3J0LCBzdHJ1Y3Qgbndwc2VyaWFsX3BvcnQsIHBvcnQpOworCisJLyogZGlzYWJsZSBmbG93IGNvbnRyb2wgYnkgZGVmYXVsdCAqLworCXVwLT5tY3IgPSBkY3JfcmVhZCh1cC0+ZGNyX2hvc3QsIFVBUlRfTUNSKSAmIH5VQVJUX01DUl9BRkU7CisJZGNyX3dyaXRlKHVwLT5kY3JfaG9zdCwgVUFSVF9NQ1IsIHVwLT5tY3IpOworCisJLyogcmVnaXN0ZXIgaW50ZXJydXB0IGhhbmRsZXIgKi8KKwllcnIgPSByZXF1ZXN0X2lycSh1cC0+cG9ydC5pcnEsIG53cHNlcmlhbF9pbnRlcnJ1cHQsCisJCQlJUlFGX1NIQVJFRCwgIm53cHNlcmlhbCIsIHVwKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJLyogZW5hYmxlIGludGVycnVwdHMgKi8KKwl1cC0+aWVyID0gVUFSVF9JRVJfUkRJOworCWRjcl93cml0ZSh1cC0+ZGNyX2hvc3QsIFVBUlRfSUVSLCB1cC0+aWVyKTsKKworCS8qIGVuYWJsZSByZWNlaXZpbmcgKi8KKwl1cC0+cG9ydC5pZ25vcmVfc3RhdHVzX21hc2sgJj0gfk5XUFNFUklBTF9TVEFUVVNfUlhWQUxJRDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBud3BzZXJpYWxfc2h1dGRvd24oc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKK3sKKwlzdHJ1Y3Qgbndwc2VyaWFsX3BvcnQgKnVwOworCXVwID0gY29udGFpbmVyX29mKHBvcnQsIHN0cnVjdCBud3BzZXJpYWxfcG9ydCwgcG9ydCk7CisKKwkvKiBkaXNhYmxlIHJlY2VpdmluZyAqLworCXVwLT5wb3J0Lmlnbm9yZV9zdGF0dXNfbWFzayB8PSBOV1BTRVJJQUxfU1RBVFVTX1JYVkFMSUQ7CisKKwkvKiBkaXNhYmxlIGludGVycnVwdHMgZnJvbSB0aGlzIHBvcnQgKi8KKwl1cC0+aWVyID0gMDsKKwlkY3Jfd3JpdGUodXAtPmRjcl9ob3N0LCBVQVJUX0lFUiwgdXAtPmllcik7CisKKwkvKiBmcmVlIGlycSAqLworCWZyZWVfaXJxKHVwLT5wb3J0LmlycSwgcG9ydCk7Cit9CisKK3N0YXRpYyBpbnQgbndwc2VyaWFsX3ZlcmlmeV9wb3J0KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsCisJCQlzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCAqc2VyKQoreworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqbndwc2VyaWFsX3R5cGUoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKK3sKKwlyZXR1cm4gcG9ydC0+dHlwZSA9PSBQT1JUX05XUFNFUklBTCA/ICJud3BzZXJpYWwiIDogTlVMTDsKK30KKworc3RhdGljIHZvaWQgbndwc2VyaWFsX3NldF90ZXJtaW9zKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsCisJCQlzdHJ1Y3Qga3Rlcm1pb3MgKnRlcm1pb3MsIHN0cnVjdCBrdGVybWlvcyAqb2xkKQoreworCXN0cnVjdCBud3BzZXJpYWxfcG9ydCAqdXA7CisJdXAgPSBjb250YWluZXJfb2YocG9ydCwgc3RydWN0IG53cHNlcmlhbF9wb3J0LCBwb3J0KTsKKworCXVwLT5wb3J0LnJlYWRfc3RhdHVzX21hc2sgPSBOV1BTRVJJQUxfU1RBVFVTX1JYVkFMSUQKKwkJCQl8IE5XUFNFUklBTF9TVEFUVVNfVFhGVUxMOworCisJdXAtPnBvcnQuaWdub3JlX3N0YXR1c19tYXNrID0gMDsKKwkvKiBpZ25vcmUgYWxsIGNoYXJhY3RlcnMgaWYgQ1JFQUQgaXMgbm90IHNldCAqLworCWlmICgodGVybWlvcy0+Y19jZmxhZyAmIENSRUFEKSA9PSAwKQorCQl1cC0+cG9ydC5pZ25vcmVfc3RhdHVzX21hc2sgfD0gTldQU0VSSUFMX1NUQVRVU19SWFZBTElEOworCisJLyogQ29weSBiYWNrIHRoZSBvbGQgaGFyZHdhcmUgc2V0dGluZ3MgKi8KKwlpZiAob2xkKQorCQl0dHlfdGVybWlvc19jb3B5X2h3KHRlcm1pb3MsIG9sZCk7Cit9CisKK3N0YXRpYyB2b2lkIG53cHNlcmlhbF9icmVha19jdGwoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwgaW50IGN0bCkKK3sKKwkvKiBOL0EgKi8KK30KKworc3RhdGljIHZvaWQgbndwc2VyaWFsX2VuYWJsZV9tcyhzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQoreworCS8qIE4vQSAqLworfQorCitzdGF0aWMgdm9pZCBud3BzZXJpYWxfc3RvcF9yeChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQoreworCXN0cnVjdCBud3BzZXJpYWxfcG9ydCAqdXA7CisJdXAgPSBjb250YWluZXJfb2YocG9ydCwgc3RydWN0IG53cHNlcmlhbF9wb3J0LCBwb3J0KTsKKwkvKiBkb24ndCBmb3J3YXJkIGFueSBtb3JlIGRhdGEgKGxpa2UgIUNSRUFEKSAqLworCXVwLT5wb3J0Lmlnbm9yZV9zdGF0dXNfbWFzayA9IE5XUFNFUklBTF9TVEFUVVNfUlhWQUxJRDsKK30KKworc3RhdGljIHZvaWQgbndwc2VyaWFsX3B1dGNoYXIoc3RydWN0IG53cHNlcmlhbF9wb3J0ICp1cCwgdW5zaWduZWQgY2hhciBjKQoreworCS8qIGNoZWNrIGlmIHR4IGJ1ZmZlciBpcyBmdWxsICovCisJd2FpdF9mb3JfYml0cyh1cCwgVUFSVF9MU1JfVEhSRSk7CisJZGNyX3dyaXRlKHVwLT5kY3JfaG9zdCwgVUFSVF9UWCwgYyk7CisJdXAtPnBvcnQuaWNvdW50LnR4Kys7Cit9CisKK3N0YXRpYyB2b2lkIG53cHNlcmlhbF9zdGFydF90eChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQoreworCXN0cnVjdCBud3BzZXJpYWxfcG9ydCAqdXA7CisJc3RydWN0IGNpcmNfYnVmICp4bWl0OworCXVwID0gY29udGFpbmVyX29mKHBvcnQsIHN0cnVjdCBud3BzZXJpYWxfcG9ydCwgcG9ydCk7CisJeG1pdCAgPSAmdXAtPnBvcnQuaW5mby0+eG1pdDsKKworCWlmIChwb3J0LT54X2NoYXIpIHsKKwkJbndwc2VyaWFsX3B1dGNoYXIodXAsIHVwLT5wb3J0LnhfY2hhcik7CisJCXBvcnQtPnhfY2hhciA9IDA7CisJfQorCisJd2hpbGUgKCEodWFydF9jaXJjX2VtcHR5KHhtaXQpIHx8IHVhcnRfdHhfc3RvcHBlZCgmdXAtPnBvcnQpKSkgeworCQlud3BzZXJpYWxfcHV0Y2hhcih1cCwgeG1pdC0+YnVmW3htaXQtPnRhaWxdKTsKKwkJeG1pdC0+dGFpbCA9ICh4bWl0LT50YWlsICsgMSkgJiAoVUFSVF9YTUlUX1NJWkUtMSk7CisJfQorfQorCitzdGF0aWMgdW5zaWduZWQgaW50IG53cHNlcmlhbF9nZXRfbWN0cmwoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbndwc2VyaWFsX3NldF9tY3RybChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LCB1bnNpZ25lZCBpbnQgbWN0cmwpCit7CisJLyogTi9BICovCit9CisKK3N0YXRpYyB2b2lkIG53cHNlcmlhbF9zdG9wX3R4KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCit7CisJLyogTi9BICovCit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbndwc2VyaWFsX3R4X2VtcHR5KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCit7CisJc3RydWN0IG53cHNlcmlhbF9wb3J0ICp1cDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQ7CisJdXAgPSBjb250YWluZXJfb2YocG9ydCwgc3RydWN0IG53cHNlcmlhbF9wb3J0LCBwb3J0KTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ1cC0+cG9ydC5sb2NrLCBmbGFncyk7CisJcmV0ID0gZGNyX3JlYWQodXAtPmRjcl9ob3N0LCBVQVJUX0xTUik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdXAtPnBvcnQubG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHJldCAmIFVBUlRfTFNSX1RFTVQgPyBUSU9DU0VSX1RFTVQgOiAwOworfQorCitzdGF0aWMgc3RydWN0IHVhcnRfb3BzIG53cHNlcmlhbF9wb3BzID0geworCS50eF9lbXB0eSAgICAgPSBud3BzZXJpYWxfdHhfZW1wdHksCisJLnNldF9tY3RybCAgICA9IG53cHNlcmlhbF9zZXRfbWN0cmwsCisJLmdldF9tY3RybCAgICA9IG53cHNlcmlhbF9nZXRfbWN0cmwsCisJLnN0b3BfdHggICAgICA9IG53cHNlcmlhbF9zdG9wX3R4LAorCS5zdGFydF90eCAgICAgPSBud3BzZXJpYWxfc3RhcnRfdHgsCisJLnN0b3BfcnggICAgICA9IG53cHNlcmlhbF9zdG9wX3J4LAorCS5lbmFibGVfbXMgICAgPSBud3BzZXJpYWxfZW5hYmxlX21zLAorCS5icmVha19jdGwgICAgPSBud3BzZXJpYWxfYnJlYWtfY3RsLAorCS5zdGFydHVwICAgICAgPSBud3BzZXJpYWxfc3RhcnR1cCwKKwkuc2h1dGRvd24gICAgID0gbndwc2VyaWFsX3NodXRkb3duLAorCS5zZXRfdGVybWlvcyAgPSBud3BzZXJpYWxfc2V0X3Rlcm1pb3MsCisJLnR5cGUgICAgICAgICA9IG53cHNlcmlhbF90eXBlLAorCS5yZWxlYXNlX3BvcnQgPSBud3BzZXJpYWxfcmVsZWFzZV9wb3J0LAorCS5yZXF1ZXN0X3BvcnQgPSBud3BzZXJpYWxfcmVxdWVzdF9wb3J0LAorCS5jb25maWdfcG9ydCAgPSBud3BzZXJpYWxfY29uZmlnX3BvcnQsCisJLnZlcmlmeV9wb3J0ICA9IG53cHNlcmlhbF92ZXJpZnlfcG9ydCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgdWFydF9kcml2ZXIgbndwc2VyaWFsX3JlZyA9IHsKKwkub3duZXIgICAgICAgPSBUSElTX01PRFVMRSwKKwkuZHJpdmVyX25hbWUgPSAibndwc2VyaWFsIiwKKwkuZGV2X25hbWUgICAgPSAidHR5U1EiLAorCS5tYWpvciAgICAgICA9IFRUWV9NQUpPUiwKKwkubWlub3IgICAgICAgPSA2OCwKKwkubnIgICAgICAgICAgPSBOV1BTRVJJQUxfTlIsCisJLmNvbnMgICAgICAgID0gTldQU0VSSUFMX0NPTlNPTEUsCit9OworCitpbnQgbndwc2VyaWFsX3JlZ2lzdGVyX3BvcnQoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKK3sKKwlzdHJ1Y3Qgbndwc2VyaWFsX3BvcnQgKnVwID0gTlVMTDsKKwlpbnQgcmV0ID0gLTE7CisJaW50IGk7CisJc3RhdGljIGludCBmaXJzdCA9IDE7CisJaW50IGRjcl9sZW47CisJaW50IGRjcl9iYXNlOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZG47CisKKwltdXRleF9sb2NrKCZud3BzZXJpYWxfbXV0ZXgpOworCisJZG4gPSB0b19vZl9kZXZpY2UocG9ydC0+ZGV2KS0+bm9kZTsKKwlpZiAoZG4gPT0gTlVMTCkKKwkJZ290byBvdXQ7CisKKwkvKiBnZXQgZGNyIGJhc2UuICovCisJZGNyX2Jhc2UgPSBkY3JfcmVzb3VyY2Vfc3RhcnQoZG4sIDApOworCisJLyogZmluZCBtYXRjaGluZyBlbnRyeSAqLworCWZvciAoaSA9IDA7IGkgPCBOV1BTRVJJQUxfTlI7IGkrKykKKwkJaWYgKG53cHNlcmlhbF9wb3J0c1tpXS5wb3J0LmlvYmFzZSA9PSBkY3JfYmFzZSkgeworCQkJdXAgPSAmbndwc2VyaWFsX3BvcnRzW2ldOworCQkJYnJlYWs7CisJCX0KKworCS8qIHdlIGRpZG4ndCBmaW5kIGEgbXRjaGluZyBlbnRyeSwgc2VhcmNoIGZvciBhIGZyZWUgcG9ydCAqLworCWlmICh1cCA9PSBOVUxMKQorCQlmb3IgKGkgPSAwOyBpIDwgTldQU0VSSUFMX05SOyBpKyspCisJCQlpZiAobndwc2VyaWFsX3BvcnRzW2ldLnBvcnQudHlwZSA9PSBQT1JUX1VOS05PV04gJiYKKwkJCQlud3BzZXJpYWxfcG9ydHNbaV0ucG9ydC5pb2Jhc2UgPT0gMCkgeworCQkJCXVwID0gJm53cHNlcmlhbF9wb3J0c1tpXTsKKwkJCQlicmVhazsKKwkJCX0KKworCWlmICh1cCA9PSBOVUxMKSB7CisJCXJldCA9IC1FQlVTWTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKGZpcnN0KQorCQl1YXJ0X3JlZ2lzdGVyX2RyaXZlcigmbndwc2VyaWFsX3JlZyk7CisJZmlyc3QgPSAwOworCisJdXAtPnBvcnQubWVtYmFzZSAgICAgID0gcG9ydC0+bWVtYmFzZTsKKwl1cC0+cG9ydC5pcnEgICAgICAgICAgPSBwb3J0LT5pcnE7CisJdXAtPnBvcnQudWFydGNsayAgICAgID0gcG9ydC0+dWFydGNsazsKKwl1cC0+cG9ydC5maWZvc2l6ZSAgICAgPSBwb3J0LT5maWZvc2l6ZTsKKwl1cC0+cG9ydC5yZWdzaGlmdCAgICAgPSBwb3J0LT5yZWdzaGlmdDsKKwl1cC0+cG9ydC5pb3R5cGUgICAgICAgPSBwb3J0LT5pb3R5cGU7CisJdXAtPnBvcnQuZmxhZ3MgICAgICAgID0gcG9ydC0+ZmxhZ3M7CisJdXAtPnBvcnQubWFwYmFzZSAgICAgID0gcG9ydC0+bWFwYmFzZTsKKwl1cC0+cG9ydC5wcml2YXRlX2RhdGEgPSBwb3J0LT5wcml2YXRlX2RhdGE7CisKKwlpZiAocG9ydC0+ZGV2KQorCQl1cC0+cG9ydC5kZXYgPSBwb3J0LT5kZXY7CisKKwlpZiAodXAtPnBvcnQuaW9iYXNlICE9IGRjcl9iYXNlKSB7CisJCXVwLT5wb3J0Lm9wcyAgICAgICAgICA9ICZud3BzZXJpYWxfcG9wczsKKwkJdXAtPnBvcnQuZmlmb3NpemUgICAgID0gMTY7CisKKwkJc3Bpbl9sb2NrX2luaXQoJnVwLT5wb3J0LmxvY2spOworCisJCXVwLT5wb3J0LmlvYmFzZSA9IGRjcl9iYXNlOworCQlkY3JfbGVuID0gZGNyX3Jlc291cmNlX2xlbihkbiwgMCk7CisKKwkJdXAtPmRjcl9ob3N0ID0gZGNyX21hcChkbiwgZGNyX2Jhc2UsIGRjcl9sZW4pOworCQlpZiAoIURDUl9NQVBfT0sodXAtPmRjcl9ob3N0KSkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJDYW5ub3QgbWFwIERDUiByZXNvdXJjZXMgZm9yIE5XUFNFUklBTCIpOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisKKwlyZXQgPSB1YXJ0X2FkZF9vbmVfcG9ydCgmbndwc2VyaWFsX3JlZywgJnVwLT5wb3J0KTsKKwlpZiAocmV0ID09IDApCisJCXJldCA9IHVwLT5wb3J0LmxpbmU7CisKK291dDoKKwltdXRleF91bmxvY2soJm53cHNlcmlhbF9tdXRleCk7CisKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTChud3BzZXJpYWxfcmVnaXN0ZXJfcG9ydCk7CisKK3ZvaWQgbndwc2VyaWFsX3VucmVnaXN0ZXJfcG9ydChpbnQgbGluZSkKK3sKKwlzdHJ1Y3Qgbndwc2VyaWFsX3BvcnQgKnVwID0gJm53cHNlcmlhbF9wb3J0c1tsaW5lXTsKKwltdXRleF9sb2NrKCZud3BzZXJpYWxfbXV0ZXgpOworCXVhcnRfcmVtb3ZlX29uZV9wb3J0KCZud3BzZXJpYWxfcmVnLCAmdXAtPnBvcnQpOworCisJdXAtPnBvcnQudHlwZSA9IFBPUlRfVU5LTk9XTjsKKworCW11dGV4X3VubG9jaygmbndwc2VyaWFsX211dGV4KTsKK30KK0VYUE9SVF9TWU1CT0wobndwc2VyaWFsX3VucmVnaXN0ZXJfcG9ydCk7CisKKyNpZmRlZiBDT05GSUdfU0VSSUFMX09GX1BMQVRGT1JNX05XUFNFUklBTF9DT05TT0xFCitzdGF0aWMgaW50IF9faW5pdCBud3BzZXJpYWxfY29uc29sZV9pbml0KHZvaWQpCit7CisJc3RydWN0IG53cHNlcmlhbF9wb3J0ICp1cCA9IE5VTEw7CisJc3RydWN0IGRldmljZV9ub2RlICpkbjsKKwljb25zdCBjaGFyICpuYW1lOworCWludCBkY3JfYmFzZTsKKwlpbnQgZGNyX2xlbjsKKwlpbnQgaTsKKworCS8qIHNlYXJjaCBmb3IgYSBmcmVlIHBvcnQgKi8KKwlmb3IgKGkgPSAwOyBpIDwgTldQU0VSSUFMX05SOyBpKyspCisJCWlmIChud3BzZXJpYWxfcG9ydHNbaV0ucG9ydC50eXBlID09IFBPUlRfVU5LTk9XTikgeworCQkJdXAgPSAmbndwc2VyaWFsX3BvcnRzW2ldOworCQkJYnJlYWs7CisJCX0KKworCWlmICh1cCA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisKKwluYW1lID0gb2ZfZ2V0X3Byb3BlcnR5KG9mX2Nob3NlbiwgImxpbnV4LHN0ZG91dC1wYXRoIiwgTlVMTCk7CisJaWYgKG5hbWUgPT0gTlVMTCkKKwkJcmV0dXJuIC0xOworCisJZG4gPSBvZl9maW5kX25vZGVfYnlfcGF0aChuYW1lKTsKKwlpZiAoIWRuKQorCQlyZXR1cm4gLTE7CisKKwlzcGluX2xvY2tfaW5pdCgmdXAtPnBvcnQubG9jayk7CisJdXAtPnBvcnQub3BzID0gJm53cHNlcmlhbF9wb3BzOworCXVwLT5wb3J0LnR5cGUgPSBQT1JUX05XUFNFUklBTDsKKwl1cC0+cG9ydC5maWZvc2l6ZSA9IDE2OworCisJZGNyX2Jhc2UgPSBkY3JfcmVzb3VyY2Vfc3RhcnQoZG4sIDApOworCWRjcl9sZW4gPSBkY3JfcmVzb3VyY2VfbGVuKGRuLCAwKTsKKwl1cC0+cG9ydC5pb2Jhc2UgPSBkY3JfYmFzZTsKKworCXVwLT5kY3JfaG9zdCA9IGRjcl9tYXAoZG4sIGRjcl9iYXNlLCBkY3JfbGVuKTsKKwlpZiAoIURDUl9NQVBfT0sodXAtPmRjcl9ob3N0KSkgeworCQlwcmludGsoIkNhbm5vdCBtYXAgRENSIHJlc291cmNlcyBmb3IgU0VSSUFMIik7CisJCXJldHVybiAtMTsKKwl9CisJcmVnaXN0ZXJfY29uc29sZSgmbndwc2VyaWFsX2NvbnNvbGUpOworCXJldHVybiAwOworfQorY29uc29sZV9pbml0Y2FsbChud3BzZXJpYWxfY29uc29sZV9pbml0KTsKKyNlbmRpZiAvKiBDT05GSUdfU0VSSUFMX09GX1BMQVRGT1JNX05XUFNFUklBTF9DT05TT0xFICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC9vZl9zZXJpYWwuYyBiL2RyaXZlcnMvc2VyaWFsL29mX3NlcmlhbC5jCmluZGV4IDhmYTBmZjUuLjE0ZjhmYTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsL29mX3NlcmlhbC5jCisrKyBiL2RyaXZlcnMvc2VyaWFsL29mX3NlcmlhbC5jCkBAIC0xNCw2ICsxNCw3IEBACiAjaW5jbHVkZSA8bGludXgvc2VyaWFsX2NvcmUuaD4KICNpbmNsdWRlIDxsaW51eC9zZXJpYWxfODI1MC5oPgogI2luY2x1ZGUgPGxpbnV4L29mX3BsYXRmb3JtLmg+CisjaW5jbHVkZSA8bGludXgvbndwc2VyaWFsLmg+CiAKICNpbmNsdWRlIDxhc20vcHJvbS5oPgogCkBAIC05OSw5ICsxMDAsMTYgQEAKIAkJZ290byBvdXQ7CiAKIAlzd2l0Y2ggKHBvcnRfdHlwZSkgeworI2lmZGVmIENPTkZJR19TRVJJQUxfODI1MAogCWNhc2UgUE9SVF84MjUwIC4uLiBQT1JUX01BWF84MjUwOgogCQlyZXQgPSBzZXJpYWw4MjUwX3JlZ2lzdGVyX3BvcnQoJnBvcnQpOwogCQlicmVhazsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19TRVJJQUxfT0ZfUExBVEZPUk1fTldQU0VSSUFMCisJY2FzZSBQT1JUX05XUFNFUklBTDoKKwkJcmV0ID0gbndwc2VyaWFsX3JlZ2lzdGVyX3BvcnQoJnBvcnQpOworCQlicmVhazsKKyNlbmRpZgogCWRlZmF1bHQ6CiAJCS8qIG5lZWQgdG8gYWRkIGNvZGUgZm9yIHRoZXNlICovCiAJY2FzZSBQT1JUX1VOS05PV046CkBAIC0xMjksOSArMTM3LDE2IEBACiB7CiAJc3RydWN0IG9mX3NlcmlhbF9pbmZvICppbmZvID0gb2ZkZXYtPmRldi5kcml2ZXJfZGF0YTsKIAlzd2l0Y2ggKGluZm8tPnR5cGUpIHsKKyNpZmRlZiBDT05GSUdfU0VSSUFMXzgyNTAKIAljYXNlIFBPUlRfODI1MCAuLi4gUE9SVF9NQVhfODI1MDoKIAkJc2VyaWFsODI1MF91bnJlZ2lzdGVyX3BvcnQoaW5mby0+bGluZSk7CiAJCWJyZWFrOworI2VuZGlmCisjaWZkZWYgQ09ORklHX1NFUklBTF9PRl9QTEFURk9STV9OV1BTRVJJQUwKKwljYXNlIFBPUlRfTldQU0VSSUFMOgorCQlud3BzZXJpYWxfdW5yZWdpc3Rlcl9wb3J0KGluZm8tPmxpbmUpOworCQlicmVhazsKKyNlbmRpZgogCWRlZmF1bHQ6CiAJCS8qIG5lZWQgdG8gYWRkIGNvZGUgZm9yIHRoZXNlICovCiAJCWJyZWFrOwpAQCAtMTQ4LDYgKzE2MywxMSBAQAogCXsgLnR5cGUgPSAic2VyaWFsIiwgLmNvbXBhdGlibGUgPSAibnMxNjQ1MCIsICAuZGF0YSA9ICh2b2lkICopUE9SVF8xNjQ1MCwgfSwKIAl7IC50eXBlID0gInNlcmlhbCIsIC5jb21wYXRpYmxlID0gIm5zMTY1NTAiLCAgLmRhdGEgPSAodm9pZCAqKVBPUlRfMTY1NTAsIH0sCiAJeyAudHlwZSA9ICJzZXJpYWwiLCAuY29tcGF0aWJsZSA9ICJuczE2NzUwIiwgIC5kYXRhID0gKHZvaWQgKilQT1JUXzE2NzUwLCB9LAorCXsgLnR5cGUgPSAic2VyaWFsIiwgLmNvbXBhdGlibGUgPSAibnMxNjg1MCIsICAuZGF0YSA9ICh2b2lkICopUE9SVF8xNjg1MCwgfSwKKyNpZmRlZiBDT05GSUdfU0VSSUFMX09GX1BMQVRGT1JNX05XUFNFUklBTAorCXsgLnR5cGUgPSAic2VyaWFsIiwgLmNvbXBhdGlibGUgPSAiaWJtLHFwYWNlLW53cC1zZXJpYWwiLAorCQkJCQkuZGF0YSA9ICh2b2lkICopUE9SVF9OV1BTRVJJQUwsIH0sCisjZW5kaWYKIAl7IC50eXBlID0gInNlcmlhbCIsCQkJICAgICAgLmRhdGEgPSAodm9pZCAqKVBPUlRfVU5LTk9XTiwgfSwKIAl7IC8qIGVuZCBvZiBsaXN0ICovIH0sCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvcG54OHh4eF91YXJ0LmMgYi9kcml2ZXJzL3NlcmlhbC9wbng4eHh4X3VhcnQuYwppbmRleCAyMmUzMGQyLi4xYmI4ZjFiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC9wbng4eHh4X3VhcnQuYworKysgYi9kcml2ZXJzL3NlcmlhbC9wbng4eHh4X3VhcnQuYwpAQCAtMTg3LDcgKzE4Nyw3IEBACiAJc3RhdHVzID0gRklGT19UT19TTShzZXJpYWxfaW4oc3BvcnQsIFBOWDhYWFhfRklGTykpIHwKIAkJIElTVEFUX1RPX1NNKHNlcmlhbF9pbihzcG9ydCwgUE5YOFhYWF9JU1RBVCkpOwogCXdoaWxlIChzdGF0dXMgJiBGSUZPX1RPX1NNKFBOWDhYWFhfVUFSVF9GSUZPX1JYRklGTykpIHsKLQkJY2ggPSBzZXJpYWxfaW4oc3BvcnQsIFBOWDhYWFhfRklGTyk7CisJCWNoID0gc2VyaWFsX2luKHNwb3J0LCBQTlg4WFhYX0ZJRk8pICYgMHhmZjsKIAogCQlzcG9ydC0+cG9ydC5pY291bnQucngrKzsKIApAQCAtMTk4LDkgKzE5OCwxNiBAQAogCQkgKiBvdXQgb2YgdGhlIG1haW4gZXhlY3V0aW9uIHBhdGgKIAkJICovCiAJCWlmIChzdGF0dXMgJiAoRklGT19UT19TTShQTlg4WFhYX1VBUlRfRklGT19SWEZFIHwKLQkJCQkJUE5YOFhYWF9VQVJUX0ZJRk9fUlhQQVIpIHwKKwkJCQkJUE5YOFhYWF9VQVJUX0ZJRk9fUlhQQVIgfAorCQkJCQlQTlg4WFhYX1VBUlRfRklGT19SWEJSSykgfAogCQkJICAgICAgSVNUQVRfVE9fU00oUE5YOFhYWF9VQVJUX0lOVF9SWE9WUk4pKSkgewotCQkJaWYgKHN0YXR1cyAmIEZJRk9fVE9fU00oUE5YOFhYWF9VQVJUX0ZJRk9fUlhQQVIpKQorCQkJaWYgKHN0YXR1cyAmIEZJRk9fVE9fU00oUE5YOFhYWF9VQVJUX0ZJRk9fUlhCUkspKSB7CisJCQkJc3RhdHVzICY9IH4oRklGT19UT19TTShQTlg4WFhYX1VBUlRfRklGT19SWEZFKSB8CisJCQkJCUZJRk9fVE9fU00oUE5YOFhYWF9VQVJUX0ZJRk9fUlhQQVIpKTsKKwkJCQlzcG9ydC0+cG9ydC5pY291bnQuYnJrKys7CisJCQkJaWYgKHVhcnRfaGFuZGxlX2JyZWFrKCZzcG9ydC0+cG9ydCkpCisJCQkJCWdvdG8gaWdub3JlX2NoYXI7CisJCQl9IGVsc2UgaWYgKHN0YXR1cyAmIEZJRk9fVE9fU00oUE5YOFhYWF9VQVJUX0ZJRk9fUlhQQVIpKQogCQkJCXNwb3J0LT5wb3J0Lmljb3VudC5wYXJpdHkrKzsKIAkJCWVsc2UgaWYgKHN0YXR1cyAmIEZJRk9fVE9fU00oUE5YOFhYWF9VQVJUX0ZJRk9fUlhGRSkpCiAJCQkJc3BvcnQtPnBvcnQuaWNvdW50LmZyYW1lKys7CkBAIC0yODQsMTQgKzI5MSw4IEBACiAJLyogR2V0IHRoZSBpbnRlcnJ1cHRzICovCiAJc3RhdHVzICA9IHNlcmlhbF9pbihzcG9ydCwgUE5YOFhYWF9JU1RBVCkgJiBzZXJpYWxfaW4oc3BvcnQsIFBOWDhYWFhfSUVOKTsKIAotCS8qIEJyZWFrIHNpZ25hbCByZWNlaXZlZCAqLwotCWlmIChzdGF0dXMgJiBQTlg4WFhYX1VBUlRfSU5UX0JSRUFLKSB7Ci0JCXNwb3J0LT5wb3J0Lmljb3VudC5icmsrKzsKLQkJdWFydF9oYW5kbGVfYnJlYWsoJnNwb3J0LT5wb3J0KTsKLQl9Ci0KLQkvKiBCeXRlIHJlY2VpdmVkICovCi0JaWYgKHN0YXR1cyAmIFBOWDhYWFhfVUFSVF9JTlRfUlgpCisJLyogQnl0ZSBvciBicmVhayBzaWduYWwgcmVjZWl2ZWQgKi8KKwlpZiAoc3RhdHVzICYgKFBOWDhYWFhfVUFSVF9JTlRfUlggfCBQTlg4WFhYX1VBUlRfSU5UX0JSRUFLKSkKIAkJcG54OHh4eF9yeF9jaGFycyhzcG9ydCk7CiAKIAkvKiBUWCBob2xkaW5nIHJlZ2lzdGVyIGVtcHR5IC0gdHJhbnNtaXQgYSBieXRlICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9hdG1lbF9zcGkuYyBiL2RyaXZlcnMvc3BpL2F0bWVsX3NwaS5jCmluZGV4IDVlMzliYWMuLjU2ZmYzZTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL2F0bWVsX3NwaS5jCisrKyBiL2RyaXZlcnMvc3BpL2F0bWVsX3NwaS5jCkBAIC02NzAsOCArNjcwLDcgQEAKIAlkZXZfZGJnKGNvbnRyb2xsZXIsICJuZXcgbWVzc2FnZSAlcCBzdWJtaXR0ZWQgZm9yICVzXG4iLAogCQkJbXNnLCBzcGktPmRldi5idXNfaWQpOwogCi0JaWYgKHVubGlrZWx5KGxpc3RfZW1wdHkoJm1zZy0+dHJhbnNmZXJzKQotCQkJfHwgIXNwaS0+bWF4X3NwZWVkX2h6KSkKKwlpZiAodW5saWtlbHkobGlzdF9lbXB0eSgmbXNnLT50cmFuc2ZlcnMpKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlpZiAoYXMtPnN0b3BwaW5nKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpX2xtNzBsbHAuYyBiL2RyaXZlcnMvc3BpL3NwaV9sbTcwbGxwLmMKaW5kZXggYWY2NTI2Ny4uNTY4Yzc4MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvc3BpX2xtNzBsbHAuYworKysgYi9kcml2ZXJzL3NwaS9zcGlfbG03MGxscC5jCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIHNwaV9sbTcwbGxwLmMgLSBkcml2ZXIgZm9yIGxtNzBsbHAgZXZhbCBib2FyZCBmb3IgdGhlIExNNzAgc2Vuc29yCisgKiBzcGlfbG03MGxscC5jIC0gZHJpdmVyIGZvciBMTTcwRVZBTC1MTFAgYm9hcmQgZm9yIHRoZSBMTTcwIHNlbnNvcgogICoKICAqIENvcHlyaWdodCAoQykgMjAwNiBLYWl3YW4gTiBCaWxsaW1vcmlhIDxrYWl3YW5AZGVzaWduZXJncmFwaGl4LmNvbT4KICAqCkBAIC00MCw4ICs0MCwxMiBAQAogICogbWFzdGVyIGNvbnRyb2xsZXIgZHJpdmVyLiAgVGhlIGh3bW9uL2xtNzAgZHJpdmVyIGlzIGEgIlNQSSBwcm90b2NvbAogICogZHJpdmVyIiwgbGF5ZXJlZCBvbiB0b3Agb2YgdGhpcyBvbmUgYW5kIHVzYWJsZSB3aXRob3V0IHRoZSBsbTcwbGxwLgogICoKKyAqIERhdGFzaGVldCBhbmQgU2NoZW1hdGljOgogICogVGhlIExNNzAgaXMgYSB0ZW1wZXJhdHVyZSBzZW5zb3IgY2hpcCBmcm9tIE5hdGlvbmFsIFNlbWljb25kdWN0b3I7IGl0cwogICogZGF0YXNoZWV0IGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm5hdGlvbmFsLmNvbS9wZi9MTS9MTTcwLmh0bWwKKyAqIFRoZSBzY2hlbWF0aWMgZm9yIHRoaXMgcGFydGljdWxhciBib2FyZCAodGhlIExNNzBFVkFMLUxMUCkgaXMKKyAqIGF2YWlsYWJsZSAob24gcGFnZSA0KSBoZXJlOgorICogIGh0dHA6Ly93d3cubmF0aW9uYWwuY29tL2FwcGluZm8vdGVtcHNlbnNvcnMvZmlsZXMvTE03MExMUEVWQUxtYW51YWwucGRmCiAgKgogICogQWxzbyBzZWUgRG9jdW1lbnRhdGlvbi9zcGkvc3BpLWxtNzBsbHAuICBUaGUgU1BJPC0+cGFycG9ydCBjb2RlIGhlcmUgaXMKICAqIChoZWF2aWx5KSBiYXNlZCBvbiBzcGktYnV0dGVyZmx5IGJ5IERhdmlkIEJyb3duZWxsLgpAQCAtNjQsNyArNjgsNyBAQAogICoKICAqIE5vdGUgdGhhdCBwYXJwb3J0IHBpbiAxMyBhY3R1YWxseSBnZXRzIGludmVydGVkIGJ5IHRoZSB0cmFuc2lzdG9yCiAgKiBhcnJhbmdlbWVudCB3aGljaCBsZXRzIGVpdGhlciB0aGUgcGFycG9ydCBvciB0aGUgTE03MCBkcml2ZSB0aGUKLSAqIFNJL1NPIHNpZ25hbC4KKyAqIFNJL1NPIHNpZ25hbCAoc2VlIHRoZSBzY2hlbWF0aWMgZm9yIGRldGFpbHMpLgogICovCiAKICNkZWZpbmUgRFJWTkFNRQkJInNwaS1sbTcwbGxwIgpAQCAtMTA2LDEyICsxMTAsMTYgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBkZWFzc2VydENTKHN0cnVjdCBzcGlfbG03MGxscCAqcHApCiB7CiAJdTggZGF0YSA9IHBhcnBvcnRfcmVhZF9kYXRhKHBwLT5wb3J0KTsKKworCWRhdGEgJj0gfjB4ODA7CQkvKiBwdWxsIEQ3L1NJLW91dCBsb3cgd2hpbGUgZGUtYXNzZXJ0ZWQgKi8KIAlwYXJwb3J0X3dyaXRlX2RhdGEocHAtPnBvcnQsIGRhdGEgfCBuQ1MpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgYXNzZXJ0Q1Moc3RydWN0IHNwaV9sbTcwbGxwICpwcCkKIHsKIAl1OCBkYXRhID0gcGFycG9ydF9yZWFkX2RhdGEocHAtPnBvcnQpOworCisJZGF0YSB8PSAweDgwOwkJLyogcHVsbCBENy9TSS1vdXQgaGlnaCBzbyBsbTcwIGRyaXZlcyBTTy1pbiAqLwogCXBhcnBvcnRfd3JpdGVfZGF0YShwcC0+cG9ydCwgZGF0YSAmIH5uQ1MpOwogfQogCkBAIC0xODQsMjIgKzE5Miw3IEBACiAgKi8KIHN0YXRpYyB1MzIgbG03MF90eHJ4KHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIHVuc2lnbmVkIG5zZWNzLCB1MzIgd29yZCwgdTggYml0cykKIHsKLQlzdGF0aWMgdTMyIHNpbz0wOwotCXN0YXRpYyBpbnQgZmlyc3RfdGltZT0xOwotCi0JLyogRmlyc3QgdGltZTogcGVyZm9ybSBTUEkgYml0YmFuZyBhbmQgcmV0dXJuIHRoZSBMU0Igb2YKLQkgKiB0aGUgcmVzdWx0IG9mIHRoZSBTUEkgY2FsbC4KLQkgKi8KLQlpZiAoZmlyc3RfdGltZSkgewotCQlzaW8gPSBiaXRiYW5nX3R4cnhfYmVfY3BoYTAoc3BpLCBuc2VjcywgMCwgd29yZCwgYml0cyk7Ci0JCWZpcnN0X3RpbWU9MDsKLQkJcmV0dXJuIChzaW8gJiAweDAwZmYpOwotCX0KLQkvKiBSZXR1cm4gdGhlIE1TQiBvZiB0aGUgcmVzdWx0IG9mIHRoZSBTUEkgY2FsbCAqLwotCWVsc2UgewotCQlmaXJzdF90aW1lPTE7Ci0JCXJldHVybiAoc2lvID4+IDgpOwotCX0KKwlyZXR1cm4gYml0YmFuZ190eHJ4X2JlX2NwaGEwKHNwaSwgbnNlY3MsIDAsIHdvcmQsIGJpdHMpOwogfQogCiBzdGF0aWMgdm9pZCBzcGlfbG03MGxscF9hdHRhY2goc3RydWN0IHBhcnBvcnQgKnApCkBAIC0yOTMsMTAgKzI4Niw5IEBACiAJCXN0YXR1cyA9IC1FTk9ERVY7CiAJCWdvdG8gb3V0X2JpdGJhbmdfc3RvcDsKIAl9Ci0JcHAtPnNwaWRldl9sbTcwLT5iaXRzX3Blcl93b3JkID0gMTY7CisJcHAtPnNwaWRldl9sbTcwLT5iaXRzX3Blcl93b3JkID0gODsKIAogCWxtNzBsbHAgPSBwcDsKLQogCXJldHVybjsKIAogb3V0X2JpdGJhbmdfc3RvcDoKQEAgLTMyNiw3ICszMTgsNiBAQAogCiAJLyogcG93ZXIgZG93biAqLwogCXBhcnBvcnRfd3JpdGVfZGF0YShwcC0+cG9ydCwgMCk7Ci0JbXNsZWVwKDEwKTsKIAogCXBhcnBvcnRfcmVsZWFzZShwcC0+cGQpOwogCXBhcnBvcnRfdW5yZWdpc3Rlcl9kZXZpY2UocHAtPnBkKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3hpbGlueF9zcGkuYyBiL2RyaXZlcnMvc3BpL3hpbGlueF9zcGkuYwppbmRleCA2OGQ2ZjQ5Li5mZTdlNWYzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS94aWxpbnhfc3BpLmMKKysrIGIvZHJpdmVycy9zcGkveGlsaW54X3NwaS5jCkBAIC0xNSwxMiArMTUsMTUgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisKKyNpbmNsdWRlIDxsaW51eC9vZl9wbGF0Zm9ybS5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L29mX3NwaS5oPgorCiAjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGlfYml0YmFuZy5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAKLSNpbmNsdWRlIDxzeXNsaWIvdmlydGV4X2RldmljZXMuaD4KLQogI2RlZmluZSBYSUxJTlhfU1BJX05BTUUgInhpbGlueF9zcGkiCiAKIC8qIFJlZ2lzdGVyIGRlZmluaXRpb25zIGFzIHBlciAiT1BCIFNlcmlhbCBQZXJpcGhlcmFsIEludGVyZmFjZSAoU1BJKSAodjEuMDBlKQpAQCAtMTQ0LDIzICsxNDcsMTQgQEAKIAkJc3RydWN0IHNwaV90cmFuc2ZlciAqdCkKIHsKIAl1OCBiaXRzX3Blcl93b3JkOwotCXUzMiBoejsKLQlzdHJ1Y3QgeGlsaW54X3NwaSAqeHNwaSA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEoc3BpLT5tYXN0ZXIpOwogCiAJYml0c19wZXJfd29yZCA9ICh0KSA/IHQtPmJpdHNfcGVyX3dvcmQgOiBzcGktPmJpdHNfcGVyX3dvcmQ7Ci0JaHogPSAodCkgPyB0LT5zcGVlZF9oeiA6IHNwaS0+bWF4X3NwZWVkX2h6OwogCWlmIChiaXRzX3Blcl93b3JkICE9IDgpIHsKIAkJZGV2X2Vycigmc3BpLT5kZXYsICIlcywgdW5zdXBwb3J0ZWQgYml0c19wZXJfd29yZD0lZFxuIiwKIAkJCV9fZnVuY19fLCBiaXRzX3Blcl93b3JkKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JaWYgKGh6ICYmIHhzcGktPnNwZWVkX2h6ID4gaHopIHsKLQkJZGV2X2Vycigmc3BpLT5kZXYsICIlcywgdW5zdXBwb3J0ZWQgY2xvY2sgcmF0ZSAldUh6XG4iLAotCQkJX19mdW5jX18sIGh6KTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTMwNCwzMiArMjk4LDM4IEBACiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCi1zdGF0aWMgaW50IF9faW5pdCB4aWxpbnhfc3BpX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKK3N0YXRpYyBpbnQgX19pbml0IHhpbGlueF9zcGlfb2ZfcHJvYmUoc3RydWN0IG9mX2RldmljZSAqb2ZkZXYsCisJCQkJCWNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoKQogewotCWludCByZXQgPSAwOwogCXN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXI7CiAJc3RydWN0IHhpbGlueF9zcGkgKnhzcGk7Ci0Jc3RydWN0IHhzcGlfcGxhdGZvcm1fZGF0YSAqcGRhdGE7Ci0Jc3RydWN0IHJlc291cmNlICpyOworCXN0cnVjdCByZXNvdXJjZSByX2lycV9zdHJ1Y3Q7CisJc3RydWN0IHJlc291cmNlIHJfbWVtX3N0cnVjdDsKKworCXN0cnVjdCByZXNvdXJjZSAqcl9pcnEgPSAmcl9pcnFfc3RydWN0OworCXN0cnVjdCByZXNvdXJjZSAqcl9tZW0gPSAmcl9tZW1fc3RydWN0OworCWludCByYyA9IDA7CisJY29uc3QgdTMyICpwcm9wOworCWludCBsZW47CiAKIAkvKiBHZXQgcmVzb3VyY2VzKG1lbW9yeSwgSVJRKSBhc3NvY2lhdGVkIHdpdGggdGhlIGRldmljZSAqLwotCW1hc3RlciA9IHNwaV9hbGxvY19tYXN0ZXIoJmRldi0+ZGV2LCBzaXplb2Yoc3RydWN0IHhpbGlueF9zcGkpKTsKKwltYXN0ZXIgPSBzcGlfYWxsb2NfbWFzdGVyKCZvZmRldi0+ZGV2LCBzaXplb2Yoc3RydWN0IHhpbGlueF9zcGkpKTsKIAogCWlmIChtYXN0ZXIgPT0gTlVMTCkgewogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKLQlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShkZXYsIG1hc3Rlcik7Ci0JcGRhdGEgPSBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCWRldl9zZXRfZHJ2ZGF0YSgmb2ZkZXYtPmRldiwgbWFzdGVyKTsKIAotCWlmIChwZGF0YSA9PSBOVUxMKSB7Ci0JCXJldCA9IC1FTk9ERVY7CisJcmMgPSBvZl9hZGRyZXNzX3RvX3Jlc291cmNlKG9mZGV2LT5ub2RlLCAwLCByX21lbSk7CisJaWYgKHJjKSB7CisJCWRldl93YXJuKCZvZmRldi0+ZGV2LCAiaW52YWxpZCBhZGRyZXNzXG4iKTsKIAkJZ290byBwdXRfbWFzdGVyOwogCX0KIAotCXIgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UoZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7Ci0JaWYgKHIgPT0gTlVMTCkgewotCQlyZXQgPSAtRU5PREVWOworCXJjID0gb2ZfaXJxX3RvX3Jlc291cmNlKG9mZGV2LT5ub2RlLCAwLCByX2lycSk7CisJaWYgKHJjID09IE5PX0lSUSkgeworCQlkZXZfd2Fybigmb2ZkZXYtPmRldiwgIm5vIElSUSBmb3VuZFxuIik7CiAJCWdvdG8gcHV0X21hc3RlcjsKIAl9CiAKQEAgLTM0MSw0NyArMzQxLDU3IEBACiAJeHNwaS0+Yml0YmFuZy5tYXN0ZXItPnNldHVwID0geGlsaW54X3NwaV9zZXR1cDsKIAlpbml0X2NvbXBsZXRpb24oJnhzcGktPmRvbmUpOwogCi0JaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24oci0+c3RhcnQsCi0JCQlyLT5lbmQgLSByLT5zdGFydCArIDEsIFhJTElOWF9TUElfTkFNRSkpIHsKLQkJcmV0ID0gLUVOWElPOworCXhzcGktPmlycSA9IHJfaXJxLT5zdGFydDsKKworCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKHJfbWVtLT5zdGFydCwKKwkJCXJfbWVtLT5lbmQgLSByX21lbS0+c3RhcnQgKyAxLCBYSUxJTlhfU1BJX05BTUUpKSB7CisJCXJjID0gLUVOWElPOworCQlkZXZfd2Fybigmb2ZkZXYtPmRldiwgIm1lbW9yeSByZXF1ZXN0IGZhaWx1cmVcbiIpOwogCQlnb3RvIHB1dF9tYXN0ZXI7CiAJfQogCi0JeHNwaS0+cmVncyA9IGlvcmVtYXAoci0+c3RhcnQsIHItPmVuZCAtIHItPnN0YXJ0ICsgMSk7CisJeHNwaS0+cmVncyA9IGlvcmVtYXAocl9tZW0tPnN0YXJ0LCByX21lbS0+ZW5kIC0gcl9tZW0tPnN0YXJ0ICsgMSk7CiAJaWYgKHhzcGktPnJlZ3MgPT0gTlVMTCkgewotCQlyZXQgPSAtRU5PTUVNOworCQlyYyA9IC1FTk9NRU07CisJCWRldl93YXJuKCZvZmRldi0+ZGV2LCAiaW9yZW1hcCBmYWlsdXJlXG4iKTsKIAkJZ290byBwdXRfbWFzdGVyOwogCX0KKwl4c3BpLT5pcnEgPSByX2lycS0+c3RhcnQ7CiAKLQlyZXQgPSBwbGF0Zm9ybV9nZXRfaXJxKGRldiwgMCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJcmV0ID0gLUVOWElPOwotCQlnb3RvIHVubWFwX2lvOworCS8qIGR5bmFtaWMgYnVzIGFzc2lnbm1lbnQgKi8KKwltYXN0ZXItPmJ1c19udW0gPSAtMTsKKworCS8qIG51bWJlciBvZiBzbGF2ZSBzZWxlY3QgYml0cyBpcyByZXF1aXJlZCAqLworCXByb3AgPSBvZl9nZXRfcHJvcGVydHkob2ZkZXYtPm5vZGUsICJ4bG54LG51bS1zcy1iaXRzIiwgJmxlbik7CisJaWYgKCFwcm9wIHx8IGxlbiA8IHNpemVvZigqcHJvcCkpIHsKKwkJZGV2X3dhcm4oJm9mZGV2LT5kZXYsICJubyAneGxueCxudW0tc3MtYml0cycgcHJvcGVydHlcbiIpOworCQlnb3RvIHB1dF9tYXN0ZXI7CiAJfQotCXhzcGktPmlycSA9IHJldDsKLQotCW1hc3Rlci0+YnVzX251bSA9IHBkYXRhLT5idXNfbnVtOwotCW1hc3Rlci0+bnVtX2NoaXBzZWxlY3QgPSBwZGF0YS0+bnVtX2NoaXBzZWxlY3Q7Ci0JeHNwaS0+c3BlZWRfaHogPSBwZGF0YS0+c3BlZWRfaHo7CisJbWFzdGVyLT5udW1fY2hpcHNlbGVjdCA9ICpwcm9wOwogCiAJLyogU1BJIGNvbnRyb2xsZXIgaW5pdGlhbGl6YXRpb25zICovCiAJeHNwaV9pbml0X2h3KHhzcGktPnJlZ3MpOwogCiAJLyogUmVnaXN0ZXIgZm9yIFNQSSBJbnRlcnJ1cHQgKi8KLQlyZXQgPSByZXF1ZXN0X2lycSh4c3BpLT5pcnEsIHhpbGlueF9zcGlfaXJxLCAwLCBYSUxJTlhfU1BJX05BTUUsIHhzcGkpOwotCWlmIChyZXQgIT0gMCkKKwlyYyA9IHJlcXVlc3RfaXJxKHhzcGktPmlycSwgeGlsaW54X3NwaV9pcnEsIDAsIFhJTElOWF9TUElfTkFNRSwgeHNwaSk7CisJaWYgKHJjICE9IDApIHsKKwkJZGV2X3dhcm4oJm9mZGV2LT5kZXYsICJpcnEgcmVxdWVzdCBmYWlsdXJlOiAlZFxuIiwgeHNwaS0+aXJxKTsKIAkJZ290byB1bm1hcF9pbzsKKwl9CiAKLQlyZXQgPSBzcGlfYml0YmFuZ19zdGFydCgmeHNwaS0+Yml0YmFuZyk7Ci0JaWYgKHJldCAhPSAwKSB7Ci0JCWRldl9lcnIoJmRldi0+ZGV2LCAic3BpX2JpdGJhbmdfc3RhcnQgRkFJTEVEXG4iKTsKKwlyYyA9IHNwaV9iaXRiYW5nX3N0YXJ0KCZ4c3BpLT5iaXRiYW5nKTsKKwlpZiAocmMgIT0gMCkgeworCQlkZXZfZXJyKCZvZmRldi0+ZGV2LCAic3BpX2JpdGJhbmdfc3RhcnQgRkFJTEVEXG4iKTsKIAkJZ290byBmcmVlX2lycTsKIAl9CiAKLQlkZXZfaW5mbygmZGV2LT5kZXYsICJhdCAweCUwOFggbWFwcGVkIHRvIDB4JTA4WCwgaXJxPSVkXG4iLAotCQkJci0+c3RhcnQsICh1MzIpeHNwaS0+cmVncywgeHNwaS0+aXJxKTsKKwlkZXZfaW5mbygmb2ZkZXYtPmRldiwgImF0IDB4JTA4WCBtYXBwZWQgdG8gMHglMDhYLCBpcnE9JWRcbiIsCisJCQkodW5zaWduZWQgaW50KXJfbWVtLT5zdGFydCwgKHUzMil4c3BpLT5yZWdzLCB4c3BpLT5pcnEpOwogCi0JcmV0dXJuIHJldDsKKwkvKiBBZGQgYW55IHN1Ym5vZGVzIG9uIHRoZSBTUEkgYnVzICovCisJb2ZfcmVnaXN0ZXJfc3BpX2RldmljZXMobWFzdGVyLCBvZmRldi0+bm9kZSk7CisKKwlyZXR1cm4gcmM7CiAKIGZyZWVfaXJxOgogCWZyZWVfaXJxKHhzcGktPmlycSwgeHNwaSk7CkBAIC0zODksMjEgKzM5OSwyMSBAQAogCWlvdW5tYXAoeHNwaS0+cmVncyk7CiBwdXRfbWFzdGVyOgogCXNwaV9tYXN0ZXJfcHV0KG1hc3Rlcik7Ci0JcmV0dXJuIHJldDsKKwlyZXR1cm4gcmM7CiB9CiAKLXN0YXRpYyBpbnQgX19kZXZleGl0IHhpbGlueF9zcGlfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKK3N0YXRpYyBpbnQgX19kZXZleGl0IHhpbGlueF9zcGlfcmVtb3ZlKHN0cnVjdCBvZl9kZXZpY2UgKm9mZGV2KQogewogCXN0cnVjdCB4aWxpbnhfc3BpICp4c3BpOwogCXN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXI7CiAKLQltYXN0ZXIgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShkZXYpOworCW1hc3RlciA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKG9mZGV2KTsKIAl4c3BpID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShtYXN0ZXIpOwogCiAJc3BpX2JpdGJhbmdfc3RvcCgmeHNwaS0+Yml0YmFuZyk7CiAJZnJlZV9pcnEoeHNwaS0+aXJxLCB4c3BpKTsKIAlpb3VubWFwKHhzcGktPnJlZ3MpOwotCXBsYXRmb3JtX3NldF9kcnZkYXRhKGRldiwgMCk7CisJZGV2X3NldF9kcnZkYXRhKCZvZmRldi0+ZGV2LCAwKTsKIAlzcGlfbWFzdGVyX3B1dCh4c3BpLT5iaXRiYW5nLm1hc3Rlcik7CiAKIAlyZXR1cm4gMDsKQEAgLTQxMiwyNyArNDIyLDQyIEBACiAvKiB3b3JrIHdpdGggaG90cGx1ZyBhbmQgY29sZHBsdWcgKi8KIE1PRFVMRV9BTElBUygicGxhdGZvcm06IiBYSUxJTlhfU1BJX05BTUUpOwogCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciB4aWxpbnhfc3BpX2RyaXZlciA9IHsKLQkucHJvYmUJPSB4aWxpbnhfc3BpX3Byb2JlLAotCS5yZW1vdmUJPSBfX2RldmV4aXRfcCh4aWxpbnhfc3BpX3JlbW92ZSksCitzdGF0aWMgaW50IF9fZXhpdCB4aWxpbnhfc3BpX29mX3JlbW92ZShzdHJ1Y3Qgb2ZfZGV2aWNlICpvcCkKK3sKKwlyZXR1cm4geGlsaW54X3NwaV9yZW1vdmUob3ApOworfQorCitzdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCB4aWxpbnhfc3BpX29mX21hdGNoW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJ4bG54LHhwcy1zcGktMi4wMC5hIiwgfSwKKwl7IC5jb21wYXRpYmxlID0gInhsbngseHBzLXNwaS0yLjAwLmIiLCB9LAorCXt9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCB4aWxpbnhfc3BpX29mX21hdGNoKTsKKworc3RhdGljIHN0cnVjdCBvZl9wbGF0Zm9ybV9kcml2ZXIgeGlsaW54X3NwaV9vZl9kcml2ZXIgPSB7CisJLm93bmVyID0gVEhJU19NT0RVTEUsCisJLm5hbWUgPSAieGlsaW54LXhwcy1zcGkiLAorCS5tYXRjaF90YWJsZSA9IHhpbGlueF9zcGlfb2ZfbWF0Y2gsCisJLnByb2JlID0geGlsaW54X3NwaV9vZl9wcm9iZSwKKwkucmVtb3ZlID0gX19leGl0X3AoeGlsaW54X3NwaV9vZl9yZW1vdmUpLAogCS5kcml2ZXIgPSB7Ci0JCS5uYW1lID0gWElMSU5YX1NQSV9OQU1FLAorCQkubmFtZSA9ICJ4aWxpbngteHBzLXNwaSIsCiAJCS5vd25lciA9IFRISVNfTU9EVUxFLAogCX0sCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCB4aWxpbnhfc3BpX2luaXQodm9pZCkKIHsKLQlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZ4aWxpbnhfc3BpX2RyaXZlcik7CisJcmV0dXJuIG9mX3JlZ2lzdGVyX3BsYXRmb3JtX2RyaXZlcigmeGlsaW54X3NwaV9vZl9kcml2ZXIpOwogfQogbW9kdWxlX2luaXQoeGlsaW54X3NwaV9pbml0KTsKIAogc3RhdGljIHZvaWQgX19leGl0IHhpbGlueF9zcGlfZXhpdCh2b2lkKQogewotCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZ4aWxpbnhfc3BpX2RyaXZlcik7CisJb2ZfdW5yZWdpc3Rlcl9wbGF0Zm9ybV9kcml2ZXIoJnhpbGlueF9zcGlfb2ZfZHJpdmVyKTsKIH0KIG1vZHVsZV9leGl0KHhpbGlueF9zcGlfZXhpdCk7Ci0KIE1PRFVMRV9BVVRIT1IoIk1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4gPHNvdXJjZUBtdmlzdGEuY29tPiIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJYaWxpbnggU1BJIGRyaXZlciIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMuYwppbmRleCAwNjM3MmIyLi4zNmE5M2I5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMuYwpAQCAtNTU3LDcgKzU1Nyw3IEBACiAJCWJsb2NrX3NpemUgPSBudW1fYnl0ZXMgLSBjb3VudDsKIAkJaWYgKGJsb2NrX3NpemUgPCAwKSB7CiAJCQlydF9wcmludGsoIiVzOiAlczogYnVnISBibG9ja19zaXplIGlzIG5lZ2F0aXZlXG4iLAotCQkJCV9fRklMRV9fLCBfX0ZVTkNUSU9OX18pOworCQkJCV9fRklMRV9fLCBfX2Z1bmNfXyk7CiAJCQlicmVhazsKIAkJfQogCQlpZiAoKGludCkoYXN5bmMtPm11bmdlX3B0ciArIGJsb2NrX3NpemUgLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VwbC9FZHJ2ODEzOS5jIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9FZHJ2ODEzOS5jCmluZGV4IDg4YWI0YTQuLjI5NjM1NGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9lcGwvRWRydjgxMzkuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZXBsL0VkcnY4MTM5LmMKQEAgLTM5MSwxOSArMzkxLDE5IEBACiAJLy8gcmVnaXN0ZXIgUENJIGRyaXZlcgogCWlSZXN1bHQgPSBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZFZHJ2RHJpdmVyKTsKIAlpZiAoaVJlc3VsdCAhPSAwKSB7Ci0JCXByaW50aygiJXMgcGNpX3JlZ2lzdGVyX2RyaXZlciBmYWlsZWQgd2l0aCAlZFxuIiwgX19GVU5DVElPTl9fLAorCQlwcmludGsoIiVzIHBjaV9yZWdpc3Rlcl9kcml2ZXIgZmFpbGVkIHdpdGggJWRcbiIsIF9fZnVuY19fLAogCQkgICAgICAgaVJlc3VsdCk7CiAJCVJldCA9IGtFcGxOb1Jlc291cmNlOwogCQlnb3RvIEV4aXQ7CiAJfQogCiAJaWYgKEVkcnZJbnN0YW5jZV9sLm1fcFBjaURldiA9PSBOVUxMKSB7Ci0JCXByaW50aygiJXMgbV9wUGNpRGV2PU5VTExcbiIsIF9fRlVOQ1RJT05fXyk7CisJCXByaW50aygiJXMgbV9wUGNpRGV2PU5VTExcbiIsIF9fZnVuY19fKTsKIAkJUmV0ID0ga0VwbE5vUmVzb3VyY2U7CiAJCWdvdG8gRXhpdDsKIAl9CiAJLy8gcmVhZCBNQUMgYWRkcmVzcyBmcm9tIGNvbnRyb2xsZXIKLQlwcmludGsoIiVzIGxvY2FsIE1BQyA9ICIsIF9fRlVOQ1RJT05fXyk7CisJcHJpbnRrKCIlcyBsb2NhbCBNQUMgPSAiLCBfX2Z1bmNfXyk7CiAJZm9yIChpUmVzdWx0ID0gMDsgaVJlc3VsdCA8IDY7IGlSZXN1bHQrKykgewogCQlwRWRydkluaXRQYXJhbV9wLT5tX2FiTXlNYWNBZGRyW2lSZXN1bHRdID0KIAkJICAgIEVEUlZfUkVHQl9SRUFEKChFRFJWX1JFR0RXX0lEUjAgKyBpUmVzdWx0KSk7CkBAIC00MzQsNyArNDM0LDcgQEAKIHsKIAogCS8vIHVucmVnaXN0ZXIgUENJIGRyaXZlcgotCXByaW50aygiJXMgY2FsbGluZyBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoKVxuIiwgX19GVU5DVElPTl9fKTsKKwlwcmludGsoIiVzIGNhbGxpbmcgcGNpX3VucmVnaXN0ZXJfZHJpdmVyKClcbiIsIF9fZnVuY19fKTsKIAlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJkVkcnZEcml2ZXIpOwogCiAJcmV0dXJuIGtFcGxTdWNjZXNzZnVsOwpAQCAtNjIxLDcgKzYyMSw3IEBACiAJCSAgICBFRFJWX1JFR0RXX1JFQUQoKEVEUlZfUkVHRFdfVFNEMCArCiAJCQkJICAgICAoRWRydkluc3RhbmNlX2wubV91aUN1clR4RGVzYyAqCiAJCQkJICAgICAgc2l6ZW9mKERXT1JEKSkpKTsKLQkJcHJpbnRrKCIlcyBJbnZPcCBUU0QldSA9IDB4JTA4bFgiLCBfX0ZVTkNUSU9OX18sCisJCXByaW50aygiJXMgSW52T3AgVFNEJXUgPSAweCUwOGxYIiwgX19mdW5jX18sCiAJCSAgICAgICBFZHJ2SW5zdGFuY2VfbC5tX3VpQ3VyVHhEZXNjLCBkd1RlbXApOwogCQlwcmludGsoIiAgQ21kID0gMHglMDJYXG4iLAogCQkgICAgICAgKFdPUkQpIEVEUlZfUkVHQl9SRUFEKEVEUlZfUkVHQl9DT01NQU5EKSk7CkBAIC02NDYsNyArNjQ2LDcgQEAKIAlkd1RlbXAgPQogCSAgICBFRFJWX1JFR0RXX1JFQUQoKEVEUlZfUkVHRFdfVFNBRDAgKwogCQkJICAgICAoRWRydkluc3RhbmNlX2wubV91aUN1clR4RGVzYyAqIHNpemVvZihEV09SRCkpKSk7Ci0vLyAgICBwcmludGsoIiVzIFRTQUQldSA9IDB4JTA4bFgiLCBfX0ZVTkNUSU9OX18sIEVkcnZJbnN0YW5jZV9sLm1fdWlDdXJUeERlc2MsIGR3VGVtcCk7CisvLyAgICBwcmludGsoIiVzIFRTQUQldSA9IDB4JTA4bFgiLCBfX2Z1bmNfXywgRWRydkluc3RhbmNlX2wubV91aUN1clR4RGVzYywgZHdUZW1wKTsKIAogCS8vIHN0YXJ0IHRyYW5zbWlzc2lvbgogCUVEUlZfUkVHRFdfV1JJVEUoKEVEUlZfUkVHRFdfVFNEMCArCkBAIC03ODYsNyArNzg2LDcgQEAKIAogCQlpZiAoRWRydkluc3RhbmNlX2wubV9wYlR4QnVmID09IE5VTEwpIHsKIAkJCXByaW50aygiJXMgVHggYnVmZmVycyBjdXJyZW50bHkgbm90IGFsbG9jYXRlZFxuIiwKLQkJCSAgICAgICBfX0ZVTkNUSU9OX18pOworCQkJICAgICAgIF9fZnVuY19fKTsKIAkJCWdvdG8gRXhpdDsKIAkJfQogCQkvLyByZWFkIHRyYW5zbWl0IHN0YXR1cwpAQCAtODQyLDcgKzg0Miw3IEBACiAKIAkJaWYgKEVkcnZJbnN0YW5jZV9sLm1fcGJSeEJ1ZiA9PSBOVUxMKSB7CiAJCQlwcmludGsoIiVzIFJ4IGJ1ZmZlcnMgY3VycmVudGx5IG5vdCBhbGxvY2F0ZWRcbiIsCi0JCQkgICAgICAgX19GVU5DVElPTl9fKTsKKwkJCSAgICAgICBfX2Z1bmNfXyk7CiAJCQlnb3RvIEV4aXQ7CiAJCX0KIAkJLy8gcmVhZCBjdXJyZW50IG9mZnNldCBpbiByZWNlaXZlIGJ1ZmZlcgpAQCAtOTQ0LDcgKzk0NCw3IEBACiAJRFdPUkQgZHdUZW1wOwogCiAJaWYgKEVkcnZJbnN0YW5jZV9sLm1fcFBjaURldiAhPSBOVUxMKSB7CS8vIEVkcnYgaXMgYWxyZWFkeSBjb25uZWN0ZWQgdG8gYSBQQ0kgZGV2aWNlCi0JCXByaW50aygiJXMgZGV2aWNlICVzIGRpc2NhcmRlZFxuIiwgX19GVU5DVElPTl9fLAorCQlwcmludGsoIiVzIGRldmljZSAlcyBkaXNjYXJkZWRcbiIsIF9fZnVuY19fLAogCQkgICAgICAgcGNpX25hbWUocFBjaURldikpOwogCQlpUmVzdWx0ID0gLUVOT0RFVjsKIAkJZ290byBFeGl0OwpAQCAtOTUzLDcgKzk1Myw3IEBACiAJaWYgKHBQY2lEZXYtPnJldmlzaW9uID49IDB4MjApIHsKIAkJcHJpbnRrCiAJCSAgICAoIiVzIGRldmljZSAlcyBpcyBhbiBlbmhhbmNlZCA4MTM5QysgdmVyc2lvbiwgd2hpY2ggaXMgbm90IHN1cHBvcnRlZFxuIiwKLQkJICAgICBfX0ZVTkNUSU9OX18sIHBjaV9uYW1lKHBQY2lEZXYpKTsKKwkJICAgICBfX2Z1bmNfXywgcGNpX25hbWUocFBjaURldikpOwogCQlpUmVzdWx0ID0gLUVOT0RFVjsKIAkJZ290byBFeGl0OwogCX0KQEAgLTk2MSw3ICs5NjEsNyBAQAogCUVkcnZJbnN0YW5jZV9sLm1fcFBjaURldiA9IHBQY2lEZXY7CiAKIAkvLyBlbmFibGUgZGV2aWNlCi0JcHJpbnRrKCIlcyBlbmFibGUgZGV2aWNlXG4iLCBfX0ZVTkNUSU9OX18pOworCXByaW50aygiJXMgZW5hYmxlIGRldmljZVxuIiwgX19mdW5jX18pOwogCWlSZXN1bHQgPSBwY2lfZW5hYmxlX2RldmljZShwUGNpRGV2KTsKIAlpZiAoaVJlc3VsdCAhPSAwKSB7CiAJCWdvdG8gRXhpdDsKQEAgLTk3MiwxMyArOTcyLDEzIEBACiAJCWdvdG8gRXhpdDsKIAl9CiAKLQlwcmludGsoIiVzIHJlcXVlc3QgcmVnaW9uc1xuIiwgX19GVU5DVElPTl9fKTsKKwlwcmludGsoIiVzIHJlcXVlc3QgcmVnaW9uc1xuIiwgX19mdW5jX18pOwogCWlSZXN1bHQgPSBwY2lfcmVxdWVzdF9yZWdpb25zKHBQY2lEZXYsIERSVl9OQU1FKTsKIAlpZiAoaVJlc3VsdCAhPSAwKSB7CiAJCWdvdG8gRXhpdDsKIAl9CiAKLQlwcmludGsoIiVzIGlvcmVtYXBcbiIsIF9fRlVOQ1RJT05fXyk7CisJcHJpbnRrKCIlcyBpb3JlbWFwXG4iLCBfX2Z1bmNfXyk7CiAJRWRydkluc3RhbmNlX2wubV9wSW9BZGRyID0KIAkgICAgaW9yZW1hcChwY2lfcmVzb3VyY2Vfc3RhcnQocFBjaURldiwgMSksCiAJCSAgICBwY2lfcmVzb3VyY2VfbGVuKHBQY2lEZXYsIDEpKTsKQEAgLTk4NywxMSArOTg3LDExIEBACiAJCWdvdG8gRXhpdDsKIAl9CiAJLy8gZW5hYmxlIFBDSSBidXNtYXN0ZXIKLQlwcmludGsoIiVzIGVuYWJsZSBidXNtYXN0ZXJcbiIsIF9fRlVOQ1RJT05fXyk7CisJcHJpbnRrKCIlcyBlbmFibGUgYnVzbWFzdGVyXG4iLCBfX2Z1bmNfXyk7CiAJcGNpX3NldF9tYXN0ZXIocFBjaURldik7CiAKIAkvLyByZXNldCBjb250cm9sbGVyCi0JcHJpbnRrKCIlcyByZXNldCBjb250cm9sbGVyXG4iLCBfX0ZVTkNUSU9OX18pOworCXByaW50aygiJXMgcmVzZXQgY29udHJvbGxlclxuIiwgX19mdW5jX18pOwogCUVEUlZfUkVHQl9XUklURShFRFJWX1JFR0JfQ09NTUFORCwgRURSVl9SRUdCX0NPTU1BTkRfUlNUKTsKIAogCS8vIHdhaXQgdW50aWwgcmVzZXQgaGFzIGZpbmlzaGVkCkBAIC0xMDA4LDIwICsxMDA4LDIwIEBACiAJZHdUZW1wID0gRURSVl9SRUdEV19SRUFEKEVEUlZfUkVHRFdfVENSKTsKIAlpZiAoKChkd1RlbXAgJiBFRFJWX1JFR0RXX1RDUl9WRVJfTUFTSykgIT0gRURSVl9SRUdEV19UQ1JfVkVSX0MpCiAJICAgICYmICgoZHdUZW1wICYgRURSVl9SRUdEV19UQ1JfVkVSX01BU0spICE9IEVEUlZfUkVHRFdfVENSX1ZFUl9EKSkgewkvLyB1bnN1cHBvcnRlZCBjaGlwCi0JCXByaW50aygiJXMgVW5zdXBwb3J0ZWQgY2hpcCEgVENSID0gMHglMDhsWFxuIiwgX19GVU5DVElPTl9fLAorCQlwcmludGsoIiVzIFVuc3VwcG9ydGVkIGNoaXAhIFRDUiA9IDB4JTA4bFhcbiIsIF9fZnVuY19fLAogCQkgICAgICAgZHdUZW1wKTsKIAkJaVJlc3VsdCA9IC1FTk9ERVY7CiAJCWdvdG8gRXhpdDsKIAl9CiAJLy8gZGlzYWJsZSBpbnRlcnJ1cHRzCi0JcHJpbnRrKCIlcyBkaXNhYmxlIGludGVycnVwdHNcbiIsIF9fRlVOQ1RJT05fXyk7CisJcHJpbnRrKCIlcyBkaXNhYmxlIGludGVycnVwdHNcbiIsIF9fZnVuY19fKTsKIAlFRFJWX1JFR1dfV1JJVEUoRURSVl9SRUdXX0lOVF9NQVNLLCAwKTsKIAkvLyBhY2tub3dsZWRnZSBhbGwgcGVuZGluZyBpbnRlcnJ1cHRzCiAJRURSVl9SRUdXX1dSSVRFKEVEUlZfUkVHV19JTlRfU1RBVFVTLAogCQkJRURSVl9SRUdXX1JFQUQoRURSVl9SRUdXX0lOVF9TVEFUVVMpKTsKIAogCS8vIGluc3RhbGwgaW50ZXJydXB0IGhhbmRsZXIKLQlwcmludGsoIiVzIGluc3RhbGwgaW50ZXJydXB0IGhhbmRsZXJcbiIsIF9fRlVOQ1RJT05fXyk7CisJcHJpbnRrKCIlcyBpbnN0YWxsIGludGVycnVwdCBoYW5kbGVyXG4iLCBfX2Z1bmNfXyk7CiAJaVJlc3VsdCA9CiAJICAgIHJlcXVlc3RfaXJxKHBQY2lEZXYtPmlycSwgVGd0RXRoSXNyLCBJUlFGX1NIQVJFRCwKIAkJCURSVl9OQU1FIC8qcFBjaURldi0+ZGV2Lm5hbWUgKi8gLCBwUGNpRGV2KTsKQEAgLTEwMzEsMTYgKzEwMzEsMTYgQEAKIAogLyoKICAgICAvLyB1bmxvY2sgY29uZmlndXJhdGlvbiByZWdpc3RlcnMKLSAgICBwcmludGsoIiVzIHVubG9jayBjb25maWd1cmF0aW9uIHJlZ2lzdGVyc1xuIiwgX19GVU5DVElPTl9fKTsKKyAgICBwcmludGsoIiVzIHVubG9jayBjb25maWd1cmF0aW9uIHJlZ2lzdGVyc1xuIiwgX19mdW5jX18pOwogICAgIEVEUlZfUkVHQl9XUklURShFRFJWX1JFR0JfQ01EOTM0NiwgRURSVl9SRUdCX0NNRDkzNDZfVU5MT0NLKTsKIAogICAgIC8vIGNoZWNrIGlmIHVzZXIgc3BlY2lmaWVkIGEgTUFDIGFkZHJlc3MKLSAgICBwcmludGsoIiVzIGNoZWNrIHNwZWNpZmllZCBNQUMgYWRkcmVzc1xuIiwgX19GVU5DVElPTl9fKTsKKyAgICBwcmludGsoIiVzIGNoZWNrIHNwZWNpZmllZCBNQUMgYWRkcmVzc1xuIiwgX19mdW5jX18pOwogICAgIGZvciAoaVJlc3VsdCA9IDA7IGlSZXN1bHQgPCA2OyBpUmVzdWx0KyspCiAgICAgewogICAgICAgICBpZiAoRWRydkluc3RhbmNlX2wubV9Jbml0UGFyYW0ubV9hYk15TWFjQWRkcltpUmVzdWx0XSAhPSAwKQogICAgICAgICB7Ci0gICAgICAgICAgICBwcmludGsoIiVzIHNldCBsb2NhbCBNQUMgYWRkcmVzc1xuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIHByaW50aygiJXMgc2V0IGxvY2FsIE1BQyBhZGRyZXNzXG4iLCBfX2Z1bmNfXyk7CiAgICAgICAgICAgICAvLyB3cml0ZSB0aGlzIE1BQyBhZGRyZXNzIHRvIGNvbnRyb2xsZXIKICAgICAgICAgICAgIEVEUlZfUkVHRFdfV1JJVEUoRURSVl9SRUdEV19JRFIwLAogICAgICAgICAgICAgICAgIGxlMzJfdG9fY3B1KCooKERXT1JEKikmRWRydkluc3RhbmNlX2wubV9Jbml0UGFyYW0ubV9hYk15TWFjQWRkclswXSkpKTsKQEAgLTEwNTksNyArMTA1OSw3IEBACiAqLwogCiAJLy8gYWxsb2NhdGUgYnVmZmVycwotCXByaW50aygiJXMgYWxsb2NhdGUgYnVmZmVyc1xuIiwgX19GVU5DVElPTl9fKTsKKwlwcmludGsoIiVzIGFsbG9jYXRlIGJ1ZmZlcnNcbiIsIF9fZnVuY19fKTsKIAlFZHJ2SW5zdGFuY2VfbC5tX3BiVHhCdWYgPQogCSAgICBwY2lfYWxsb2NfY29uc2lzdGVudChwUGNpRGV2LCBFRFJWX1RYX0JVRkZFUl9TSVpFLAogCQkJCSAmRWRydkluc3RhbmNlX2wubV9wVHhCdWZEbWEpOwpAQCAtMTA3Niw3ICsxMDc2LDcgQEAKIAkJZ290byBFeGl0OwogCX0KIAkvLyByZXNldCBwb2ludGVycyBmb3IgVHggYnVmZmVycwotCXByaW50aygiJXMgcmVzZXQgcG9pbnRlcnMgZm8gVHggYnVmZmVyc1xuIiwgX19GVU5DVElPTl9fKTsKKwlwcmludGsoIiVzIHJlc2V0IHBvaW50ZXJzIGZvIFR4IGJ1ZmZlcnNcbiIsIF9fZnVuY19fKTsKIAlFRFJWX1JFR0RXX1dSSVRFKEVEUlZfUkVHRFdfVFNBRDAsIDApOwogCWR3VGVtcCA9IEVEUlZfUkVHRFdfUkVBRChFRFJWX1JFR0RXX1RTQUQwKTsKIAlFRFJWX1JFR0RXX1dSSVRFKEVEUlZfUkVHRFdfVFNBRDEsIDApOwpAQCAtMTA5MCwxMSArMTA5MCwxMSBAQAogCSAgICAgICAoV09SRCkgRURSVl9SRUdCX1JFQUQoRURSVl9SRUdCX0NPTU1BTkQpKTsKIAogCS8vIHNldCBwb2ludGVyIGZvciByZWNlaXZlIGJ1ZmZlciBpbiBjb250cm9sbGVyCi0JcHJpbnRrKCIlcyBzZXQgcG9pbnRlciB0byBSeCBidWZmZXJcbiIsIF9fRlVOQ1RJT05fXyk7CisJcHJpbnRrKCIlcyBzZXQgcG9pbnRlciB0byBSeCBidWZmZXJcbiIsIF9fZnVuY19fKTsKIAlFRFJWX1JFR0RXX1dSSVRFKEVEUlZfUkVHRFdfUkJTVEFSVCwgRWRydkluc3RhbmNlX2wubV9wUnhCdWZEbWEpOwogCiAJLy8gZW5hYmxlIHRyYW5zbWl0dGVyIGFuZCByZWNlaXZlcgotCXByaW50aygiJXMgZW5hYmxlIFR4IGFuZCBSeCIsIF9fRlVOQ1RJT05fXyk7CisJcHJpbnRrKCIlcyBlbmFibGUgVHggYW5kIFJ4IiwgX19mdW5jX18pOwogCUVEUlZfUkVHQl9XUklURShFRFJWX1JFR0JfQ09NTUFORCwKIAkJCShFRFJWX1JFR0JfQ09NTUFORF9SRSB8IEVEUlZfUkVHQl9DT01NQU5EX1RFKSk7CiAJcHJpbnRrKCIgIENvbW1hbmQgPSAweCUwMlhcbiIsCkBAIC0xMTA0LDEyICsxMTA0LDEyIEBACiAJRURSVl9SRUdEV19XUklURShFRFJWX1JFR0RXX01QQywgMCk7CiAKIAkvLyBzZXQgdHJhbnNtaXQgY29uZmlndXJhdGlvbiByZWdpc3RlcgotCXByaW50aygiJXMgc2V0IFR4IGNvbmYgcmVnaXN0ZXIiLCBfX0ZVTkNUSU9OX18pOworCXByaW50aygiJXMgc2V0IFR4IGNvbmYgcmVnaXN0ZXIiLCBfX2Z1bmNfXyk7CiAJRURSVl9SRUdEV19XUklURShFRFJWX1JFR0RXX1RDUiwgRURSVl9SRUdEV19UQ1JfREVGKTsKIAlwcmludGsoIiA9IDB4JTA4WFxuIiwgRURSVl9SRUdEV19SRUFEKEVEUlZfUkVHRFdfVENSKSk7CiAKIAkvLyBzZXQgcmVjZWl2ZSBjb25maWd1cmF0aW9uIHJlZ2lzdGVyCi0JcHJpbnRrKCIlcyBzZXQgUnggY29uZiByZWdpc3RlciIsIF9fRlVOQ1RJT05fXyk7CisJcHJpbnRrKCIlcyBzZXQgUnggY29uZiByZWdpc3RlciIsIF9fZnVuY19fKTsKIAlFRFJWX1JFR0RXX1dSSVRFKEVEUlZfUkVHRFdfUkNSLCBFRFJWX1JFR0RXX1JDUl9ERUYpOwogCXByaW50aygiID0gMHglMDhYXG4iLCBFRFJWX1JFR0RXX1JFQUQoRURSVl9SRUdEV19SQ1IpKTsKIApAQCAtMTEyMSw3ICsxMTIxLDcgQEAKIAogLyoKICAgICAvLyBlbmFibGUgdHJhbnNtaXR0ZXIgYW5kIHJlY2VpdmVyCi0gICAgcHJpbnRrKCIlcyBlbmFibGUgVHggYW5kIFJ4IiwgX19GVU5DVElPTl9fKTsKKyAgICBwcmludGsoIiVzIGVuYWJsZSBUeCBhbmQgUngiLCBfX2Z1bmNfXyk7CiAgICAgRURSVl9SRUdCX1dSSVRFKEVEUlZfUkVHQl9DT01NQU5ELCAoRURSVl9SRUdCX0NPTU1BTkRfUkUgfCBFRFJWX1JFR0JfQ09NTUFORF9URSkpOwogICAgIHByaW50aygiICBDb21tYW5kID0gMHglMDJYXG4iLCAoV09SRCkgRURSVl9SRUdCX1JFQUQoRURSVl9SRUdCX0NPTU1BTkQpKTsKICovCkBAIC0xMTI5LDExICsxMTI5LDExIEBACiAJRURSVl9SRUdXX1dSSVRFKEVEUlZfUkVHV19NVUxJTlQsIDApOwogCiAJLy8gZW5hYmxlIGludGVycnVwdHMKLQlwcmludGsoIiVzIGVuYWJsZSBpbnRlcnJ1cHRzXG4iLCBfX0ZVTkNUSU9OX18pOworCXByaW50aygiJXMgZW5hYmxlIGludGVycnVwdHNcbiIsIF9fZnVuY19fKTsKIAlFRFJWX1JFR1dfV1JJVEUoRURSVl9SRUdXX0lOVF9NQVNLLCBFRFJWX1JFR1dfSU5UX01BU0tfREVGKTsKIAogICAgICAgRXhpdDoKLQlwcmludGsoIiVzIGZpbmlzaGVkIHdpdGggJWRcbiIsIF9fRlVOQ1RJT05fXywgaVJlc3VsdCk7CisJcHJpbnRrKCIlcyBmaW5pc2hlZCB3aXRoICVkXG4iLCBfX2Z1bmNfXywgaVJlc3VsdCk7CiAJcmV0dXJuIGlSZXN1bHQ7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lcGwvRXBsU2RvQXN5U2VxdS5jIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxTZG9Bc3lTZXF1LmMKaW5kZXggOTkxYzZiZS4uNmI2YTk5NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxTZG9Bc3lTZXF1LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2VwbC9FcGxTZG9Bc3lTZXF1LmMKQEAgLTg3Niw3ICs4NzYsNyBAQAogCQkJCXsKIC8qCiAgICAgICAgICAgICAgICAgICAgIFBSSU5URjMoIiVzIHNjb249JXUgcmNvbj0ldVxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJlY0ZyYW1lX3AtPm1fbGVfYlNlbmRTZXFOdW1Db24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJlY0ZyYW1lX3AtPm1fbGVfYlJlY1NlcU51bUNvbik7CiAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2Zyb250aWVyL2FscGhhdHJhY2suYyBiL2RyaXZlcnMvc3RhZ2luZy9mcm9udGllci9hbHBoYXRyYWNrLmMKaW5kZXggNjFkN2M1ZC4uNjEzNmUzZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2Zyb250aWVyL2FscGhhdHJhY2suYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZnJvbnRpZXIvYWxwaGF0cmFjay5jCkBAIC0yMzksNyArMjM5LDcgQEAKIAkJCWdvdG8gZXhpdDsKIAkJfSBlbHNlIHsKIAkJCWRiZ19pbmZvKCZkZXYtPmludGYtPmRldiwgIiVzOiBub256ZXJvIHN0YXR1cyByZWNlaXZlZDogJWRcbiIsCi0JCQkJIF9fRlVOQ1RJT05fXywgdXJiLT5zdGF0dXMpOworCQkJCSBfX2Z1bmNfXywgdXJiLT5zdGF0dXMpOwogCQkJZ290byByZXN1Ym1pdDsgLyogbWF5YmUgd2UgY2FuIHJlY292ZXIgKi8KIAkJfQogCX0KQEAgLTI2MSw3ICsyNjEsNyBAQAogCQlpZihkZXYtPm9mZmxpbmUgPiAwICYmIGRldi0+aW50ZXJydXB0X2luX2J1ZmZlclsxXSAhPSAweGZmKSB7IGRldi0+b2ZmbGluZSA9IDA7IH0KIAkJaWYoZGV2LT5vZmZsaW5lID09IDAgJiYgZGV2LT5pbnRlcnJ1cHRfaW5fYnVmZmVyWzFdID09IDB4ZmYpIHsgZGV2LT5vZmZsaW5lID0gMTsgfQogI2VuZGlmCi0JCWRiZ19pbmZvKCZkZXYtPmludGYtPmRldiwgIiVzOiBoZWFkLCB0YWlsIGFyZSAleCwgJXhcbiIsIF9fRlVOQ1RJT05fXyxkZXYtPnJpbmdfaGVhZCxkZXYtPnJpbmdfdGFpbCk7CisJCWRiZ19pbmZvKCZkZXYtPmludGYtPmRldiwgIiVzOiBoZWFkLCB0YWlsIGFyZSAleCwgJXhcbiIsIF9fZnVuY19fLGRldi0+cmluZ19oZWFkLGRldi0+cmluZ190YWlsKTsKIAkJbmV4dF9yaW5nX2hlYWQgPSAoZGV2LT5yaW5nX2hlYWQrMSkgJSByaW5nX2J1ZmZlcl9zaXplOwogCiAJCWlmIChuZXh0X3JpbmdfaGVhZCAhPSBkZXYtPnJpbmdfdGFpbCkgewpAQCAtMzA1LDcgKzMwNSw3IEBACiAJCQkgICAgIHVyYi0+c3RhdHVzID09IC1FU0hVVERPV04pKQogCQlkYmdfaW5mbygmZGV2LT5pbnRmLT5kZXYsCiAJCQkgIiVzIC0gbm9uemVybyB3cml0ZSBpbnRlcnJ1cHQgc3RhdHVzIHJlY2VpdmVkOiAlZFxuIiwKLQkJCSBfX0ZVTkNUSU9OX18sIHVyYi0+c3RhdHVzKTsKKwkJCSBfX2Z1bmNfXywgdXJiLT5zdGF0dXMpOwogCWF0b21pY19kZWMoJmRldi0+d3JpdGVzX3BlbmRpbmcpOwogCWRldi0+aW50ZXJydXB0X291dF9idXN5ID0gMDsKIAl3YWtlX3VwX2ludGVycnVwdGlibGUoJmRldi0+d3JpdGVfd2FpdCk7CkBAIC0zMzAsNyArMzMwLDcgQEAKIAogCWlmICghaW50ZXJmYWNlKSB7CiAJCWVycigiJXMgLSBlcnJvciwgY2FuJ3QgZmluZCBkZXZpY2UgZm9yIG1pbm9yICVkXG4iLAotCQkgICAgIF9fRlVOQ1RJT05fXywgc3VibWlub3IpOworCQkgICAgIF9fZnVuY19fLCBzdWJtaW5vcik7CiAJCXJldHZhbCA9IC1FTk9ERVY7CiAJCWdvdG8gdW5sb2NrX2Rpc2Nvbm5lY3RfZXhpdDsKIAl9CkBAIC01MTQsNyArNTE0LDcgQEAKIAkJCQkJCSB9CiAJCQkJCQkgZGV2LT5yaW5nX3RhaWwgPSAoZGV2LT5yaW5nX3RhaWwrMSkgJSByaW5nX2J1ZmZlcl9zaXplOwogCQkJCQkJIGMrPUlOUFVUX0NNRF9TSVpFOwotCQkJCQkJIGRiZ19pbmZvKCZkZXYtPmludGYtPmRldiwgIiVzOiBoZWFkLCB0YWlsIGFyZSAleCwgJXhcbiIsIF9fRlVOQ1RJT05fXyxkZXYtPnJpbmdfaGVhZCxkZXYtPnJpbmdfdGFpbCk7CisJCQkJCQkgZGJnX2luZm8oJmRldi0+aW50Zi0+ZGV2LCAiJXM6IGhlYWQsIHRhaWwgYXJlICV4LCAleFxuIiwgX19mdW5jX18sZGV2LT5yaW5nX2hlYWQsZGV2LT5yaW5nX3RhaWwpOwogCSAgIH0KIAkgICByZXR2YWwgPSBjOwogCkBAIC01NzMsNyArNTczLDcgQEAKIAlpZiAoYnl0ZXNfdG9fd3JpdGUgPCBjb3VudCkKIAkJZGV2X3dhcm4oJmRldi0+aW50Zi0+ZGV2LCAiV3JpdGUgYnVmZmVyIG92ZXJmbG93LCAlemQgYnl0ZXMgZHJvcHBlZFxuIixjb3VudC1ieXRlc190b193cml0ZSk7CiAKLQlkYmdfaW5mbygmZGV2LT5pbnRmLT5kZXYsICIlczogY291bnQgPSAlemQsIGJ5dGVzX3RvX3dyaXRlID0gJXpkXG4iLCBfX0ZVTkNUSU9OX18sIGNvdW50LCBieXRlc190b193cml0ZSk7CisJZGJnX2luZm8oJmRldi0+aW50Zi0+ZGV2LCAiJXM6IGNvdW50ID0gJXpkLCBieXRlc190b193cml0ZSA9ICV6ZFxuIiwgX19mdW5jX18sIGNvdW50LCBieXRlc190b193cml0ZSk7CiAKIAlpZiAoY29weV9mcm9tX3VzZXIoZGV2LT5pbnRlcnJ1cHRfb3V0X2J1ZmZlciwgYnVmZmVyLCBieXRlc190b193cml0ZSkpIHsKIAkJcmV0dmFsID0gLUVGQVVMVDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9mcm9udGllci90cmFuenBvcnQuYyBiL2RyaXZlcnMvc3RhZ2luZy9mcm9udGllci90cmFuenBvcnQuYwppbmRleCAyNzVmYWE3Li43OWFiYjZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZnJvbnRpZXIvdHJhbnpwb3J0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2Zyb250aWVyL3RyYW56cG9ydC5jCkBAIC0zMzUsNyArMzM1LDcgQEAKIAkJCWdvdG8gZXhpdDsKIAkJfSBlbHNlIHsKIAkJCWRiZ19pbmZvKCZkZXYtPmludGYtPmRldiwgIiVzOiBub256ZXJvIHN0YXR1cyByZWNlaXZlZDogJWRcbiIsCi0JCQkJIF9fRlVOQ1RJT05fXywgdXJiLT5zdGF0dXMpOworCQkJCSBfX2Z1bmNfXywgdXJiLT5zdGF0dXMpOwogCQkJZ290byByZXN1Ym1pdDsgLyogbWF5YmUgd2UgY2FuIHJlY292ZXIgKi8KIAkJfQogCX0KQEAgLTM0NSw3ICszNDUsNyBAQAogCQkJICJVcmIgbGVuZ3RoIHdhcyAlZCBieXRlcyEhIERvIHNvbWV0aGluZyBpbnRlbGxpZ2VudCBcbiIsIHVyYi0+YWN0dWFsX2xlbmd0aCk7CiAJfSBlbHNlIHsKIAkJZGJnX2luZm8oJmRldi0+aW50Zi0+ZGV2LCAiJXM6IHJlY2VpdmVkOiAlMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeFxuIiwKLQkJCSBfX0ZVTkNUSU9OX18sIGRldi0+aW50ZXJydXB0X2luX2J1ZmZlclswXSxkZXYtPmludGVycnVwdF9pbl9idWZmZXJbMV0sZGV2LT5pbnRlcnJ1cHRfaW5fYnVmZmVyWzJdLGRldi0+aW50ZXJydXB0X2luX2J1ZmZlclszXSxkZXYtPmludGVycnVwdF9pbl9idWZmZXJbNF0sZGV2LT5pbnRlcnJ1cHRfaW5fYnVmZmVyWzVdLGRldi0+aW50ZXJydXB0X2luX2J1ZmZlcls2XSxkZXYtPmludGVycnVwdF9pbl9idWZmZXJbN10pOworCQkJIF9fZnVuY19fLCBkZXYtPmludGVycnVwdF9pbl9idWZmZXJbMF0sZGV2LT5pbnRlcnJ1cHRfaW5fYnVmZmVyWzFdLGRldi0+aW50ZXJydXB0X2luX2J1ZmZlclsyXSxkZXYtPmludGVycnVwdF9pbl9idWZmZXJbM10sZGV2LT5pbnRlcnJ1cHRfaW5fYnVmZmVyWzRdLGRldi0+aW50ZXJydXB0X2luX2J1ZmZlcls1XSxkZXYtPmludGVycnVwdF9pbl9idWZmZXJbNl0sZGV2LT5pbnRlcnJ1cHRfaW5fYnVmZmVyWzddKTsKICNpZiBTVVBQUkVTU19FWFRSQV9PRkZMSU5FX0VWRU5UUwogCQlpZihkZXYtPm9mZmxpbmUgPT0gMiAmJiBkZXYtPmludGVycnVwdF9pbl9idWZmZXJbMV0gPT0gMHhmZikgeyBnb3RvIHJlc3VibWl0OyB9CiAJCWlmKGRldi0+b2ZmbGluZSA9PSAxICYmIGRldi0+aW50ZXJydXB0X2luX2J1ZmZlclsxXSA9PSAweGZmKSB7IGRldi0+b2ZmbGluZSA9IDI7IGdvdG8gcmVzdWJtaXQ7IH0KQEAgLTM1NSw3ICszNTUsNyBAQAogCQlpZihkZXYtPm9mZmxpbmUgPT0gMCAmJiBkZXYtPmludGVycnVwdF9pbl9idWZmZXJbMV0gPT0gMHhmZikgeyBkZXYtPm9mZmxpbmUgPSAxOyB9CiAKICNlbmRpZgotCQlkYmdfaW5mbygmZGV2LT5pbnRmLT5kZXYsICIlczogaGVhZCwgdGFpbCBhcmUgJXgsICV4XG4iLCBfX0ZVTkNUSU9OX18sZGV2LT5yaW5nX2hlYWQsZGV2LT5yaW5nX3RhaWwpOworCQlkYmdfaW5mbygmZGV2LT5pbnRmLT5kZXYsICIlczogaGVhZCwgdGFpbCBhcmUgJXgsICV4XG4iLCBfX2Z1bmNfXyxkZXYtPnJpbmdfaGVhZCxkZXYtPnJpbmdfdGFpbCk7CiAKIAkJbmV4dF9yaW5nX2hlYWQgPSAoZGV2LT5yaW5nX2hlYWQrMSkgJSByaW5nX2J1ZmZlcl9zaXplOwogCkBAIC0zOTksNyArMzk5LDcgQEAKIAkJCSAgICAgdXJiLT5zdGF0dXMgPT0gLUVTSFVURE9XTikpCiAJCWRiZ19pbmZvKCZkZXYtPmludGYtPmRldiwKIAkJCSAiJXMgLSBub256ZXJvIHdyaXRlIGludGVycnVwdCBzdGF0dXMgcmVjZWl2ZWQ6ICVkXG4iLAotCQkJIF9fRlVOQ1RJT05fXywgdXJiLT5zdGF0dXMpOworCQkJIF9fZnVuY19fLCB1cmItPnN0YXR1cyk7CiAKIAlkZXYtPmludGVycnVwdF9vdXRfYnVzeSA9IDA7CiAJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZkZXYtPndyaXRlX3dhaXQpOwpAQCAtNDI0LDcgKzQyNCw3IEBACiAKIAlpZiAoIWludGVyZmFjZSkgewogCQllcnIoIiVzIC0gZXJyb3IsIGNhbid0IGZpbmQgZGV2aWNlIGZvciBtaW5vciAlZFxuIiwKLQkJICAgICBfX0ZVTkNUSU9OX18sIHN1Ym1pbm9yKTsKKwkJICAgICBfX2Z1bmNfXywgc3VibWlub3IpOwogCQlyZXR2YWwgPSAtRU5PREVWOwogCQlnb3RvIHVubG9ja19kaXNjb25uZWN0X2V4aXQ7CiAJfQpAQCAtNjEzLDcgKzYxMyw3IEBACiAJfQogCiAJZGJnX2luZm8oJmRldi0+aW50Zi0+ZGV2LCAiJXM6IGNvcHlpbmcgdG8gdXNlcnNwYWNlOiAlMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeFxuIiwKLQkJCSBfX0ZVTkNUSU9OX18sICgqZGV2LT5yaW5nX2J1ZmZlcilbZGV2LT5yaW5nX3RhaWxdLmNtZFswXSwoKmRldi0+cmluZ19idWZmZXIpW2Rldi0+cmluZ190YWlsXS5jbWRbMV0sKCpkZXYtPnJpbmdfYnVmZmVyKVtkZXYtPnJpbmdfdGFpbF0uY21kWzJdLCgqZGV2LT5yaW5nX2J1ZmZlcilbZGV2LT5yaW5nX3RhaWxdLmNtZFszXSwoKmRldi0+cmluZ19idWZmZXIpW2Rldi0+cmluZ190YWlsXS5jbWRbNF0sKCpkZXYtPnJpbmdfYnVmZmVyKVtkZXYtPnJpbmdfdGFpbF0uY21kWzVdLCgqZGV2LT5yaW5nX2J1ZmZlcilbZGV2LT5yaW5nX3RhaWxdLmNtZFs2XSwoKmRldi0+cmluZ19idWZmZXIpW2Rldi0+cmluZ190YWlsXS5jbWRbN10pOworCQkJIF9fZnVuY19fLCAoKmRldi0+cmluZ19idWZmZXIpW2Rldi0+cmluZ190YWlsXS5jbWRbMF0sKCpkZXYtPnJpbmdfYnVmZmVyKVtkZXYtPnJpbmdfdGFpbF0uY21kWzFdLCgqZGV2LT5yaW5nX2J1ZmZlcilbZGV2LT5yaW5nX3RhaWxdLmNtZFsyXSwoKmRldi0+cmluZ19idWZmZXIpW2Rldi0+cmluZ190YWlsXS5jbWRbM10sKCpkZXYtPnJpbmdfYnVmZmVyKVtkZXYtPnJpbmdfdGFpbF0uY21kWzRdLCgqZGV2LT5yaW5nX2J1ZmZlcilbZGV2LT5yaW5nX3RhaWxdLmNtZFs1XSwoKmRldi0+cmluZ19idWZmZXIpW2Rldi0+cmluZ190YWlsXS5jbWRbNl0sKCpkZXYtPnJpbmdfYnVmZmVyKVtkZXYtPnJpbmdfdGFpbF0uY21kWzddKTsKIAogI2lmIEJVRkZFUkVEX1JFQURTCiAJICAgYyA9IDA7CkBAIC02MzIsNyArNjMyLDcgQEAKIAkJCS8vIEZJWE1FIHRoZSBtYXRoIGlzIHdyb25nIGZvciBnb2luZyBpbiByZXZlcnNlLCBhY3R1YWxseSwgYXMgdGhlIG1pZGkgc3BlYyBkb2Vzbid0IGFsbG93IHNpZ25lZCBjaGFycwogCiAJZGJnX2luZm8oJmRldi0+aW50Zi0+ZGV2LCAiJXM6IHRyeWluZyB0byBjb21wcmVzczogJTAyeCUwMnglMDJ4JTAyeCUwMnggJTAyeCAlMDJ4ICUwMnhcbiIsCi0JCQkgX19GVU5DVElPTl9fLCAoKmRldi0+cmluZ19idWZmZXIpW2Rldi0+cmluZ190YWlsXS5jbWRbMF0sKCpkZXYtPnJpbmdfYnVmZmVyKVtkZXYtPnJpbmdfdGFpbF0uY21kWzFdLCgqZGV2LT5yaW5nX2J1ZmZlcilbZGV2LT5yaW5nX3RhaWxdLmNtZFsyXSwoKmRldi0+cmluZ19idWZmZXIpW2Rldi0+cmluZ190YWlsXS5jbWRbM10sKCpkZXYtPnJpbmdfYnVmZmVyKVtkZXYtPnJpbmdfdGFpbF0uY21kWzRdLCgqZGV2LT5yaW5nX2J1ZmZlcilbZGV2LT5yaW5nX3RhaWxdLmNtZFs1XSwoKmRldi0+cmluZ19idWZmZXIpW2Rldi0+cmluZ190YWlsXS5jbWRbNl0sKCpkZXYtPnJpbmdfYnVmZmVyKVtkZXYtPnJpbmdfdGFpbF0uY21kWzddKTsKKwkJCSBfX2Z1bmNfXywgKCpkZXYtPnJpbmdfYnVmZmVyKVtkZXYtPnJpbmdfdGFpbF0uY21kWzBdLCgqZGV2LT5yaW5nX2J1ZmZlcilbZGV2LT5yaW5nX3RhaWxdLmNtZFsxXSwoKmRldi0+cmluZ19idWZmZXIpW2Rldi0+cmluZ190YWlsXS5jbWRbMl0sKCpkZXYtPnJpbmdfYnVmZmVyKVtkZXYtPnJpbmdfdGFpbF0uY21kWzNdLCgqZGV2LT5yaW5nX2J1ZmZlcilbZGV2LT5yaW5nX3RhaWxdLmNtZFs0XSwoKmRldi0+cmluZ19idWZmZXIpW2Rldi0+cmluZ190YWlsXS5jbWRbNV0sKCpkZXYtPnJpbmdfYnVmZmVyKVtkZXYtPnJpbmdfdGFpbF0uY21kWzZdLCgqZGV2LT5yaW5nX2J1ZmZlcilbZGV2LT5yaW5nX3RhaWxdLmNtZFs3XSk7CiAKIAogCQkJaWYoKCgqZGV2LT5yaW5nX2J1ZmZlcilbZGV2LT5yaW5nX3RhaWxdLmNtZFs2XSAhPSAwICYmCkBAIC02NDUsNyArNjQ1LDcgQEAKIAkJCQkoKCpkZXYtPnJpbmdfYnVmZmVyKVtkZXYtPnJpbmdfdGFpbF0uY21kWzVdID09ICgqZGV2LT5yaW5nX2J1ZmZlcilbbmV4dF90YWlsXS5jbWRbNV0pKQogIHsKIAlkYmdfaW5mbygmZGV2LT5pbnRmLT5kZXYsICIlczogc2hvdWxkIGNvbXByZXNzOiAlMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeFxuIiwKLQkJCSBfX0ZVTkNUSU9OX18sICgqZGV2LT5yaW5nX2J1ZmZlcilbZGV2LT5yaW5nX3RhaWxdLmNtZFswXSwoKmRldi0+cmluZ19idWZmZXIpW2Rldi0+cmluZ190YWlsXS5jbWRbMV0sKCpkZXYtPnJpbmdfYnVmZmVyKVtkZXYtPnJpbmdfdGFpbF0uY21kWzJdLCgqZGV2LT5yaW5nX2J1ZmZlcilbZGV2LT5yaW5nX3RhaWxdLmNtZFszXSwoKmRldi0+cmluZ19idWZmZXIpW2Rldi0+cmluZ190YWlsXS5jbWRbNF0sKCpkZXYtPnJpbmdfYnVmZmVyKVtkZXYtPnJpbmdfdGFpbF0uY21kWzVdLCgqZGV2LT5yaW5nX2J1ZmZlcilbZGV2LT5yaW5nX3RhaWxdLmNtZFs2XSwoKmRldi0+cmluZ19idWZmZXIpW2Rldi0+cmluZ190YWlsXS5jbWRbN10pOworCQkJIF9fZnVuY19fLCAoKmRldi0+cmluZ19idWZmZXIpW2Rldi0+cmluZ190YWlsXS5jbWRbMF0sKCpkZXYtPnJpbmdfYnVmZmVyKVtkZXYtPnJpbmdfdGFpbF0uY21kWzFdLCgqZGV2LT5yaW5nX2J1ZmZlcilbZGV2LT5yaW5nX3RhaWxdLmNtZFsyXSwoKmRldi0+cmluZ19idWZmZXIpW2Rldi0+cmluZ190YWlsXS5jbWRbM10sKCpkZXYtPnJpbmdfYnVmZmVyKVtkZXYtPnJpbmdfdGFpbF0uY21kWzRdLCgqZGV2LT5yaW5nX2J1ZmZlcilbZGV2LT5yaW5nX3RhaWxdLmNtZFs1XSwoKmRldi0+cmluZ19idWZmZXIpW2Rldi0+cmluZ190YWlsXS5jbWRbNl0sKCpkZXYtPnJpbmdfYnVmZmVyKVtkZXYtPnJpbmdfdGFpbF0uY21kWzddKTsKIAogCQkJCW5ld3doZWVsICs9IG9sZHdoZWVsOwogCQkJCWlmKG9sZHdoZWVsID4gMCAmJiAhKG5ld3doZWVsID4gMCkpIHsKQEAgLTY3Myw3ICs2NzMsNyBAQAogCiAJCWRldi0+cmluZ190YWlsID0gKGRldi0+cmluZ190YWlsKzEpICUgcmluZ19idWZmZXJfc2l6ZTsKIAkJYys9ODsKLQkJZGJnX2luZm8oJmRldi0+aW50Zi0+ZGV2LCAiJXM6IGhlYWQsIHRhaWwgYXJlICV4LCAleFxuIiwgX19GVU5DVElPTl9fLGRldi0+cmluZ19oZWFkLGRldi0+cmluZ190YWlsKTsKKwkJZGJnX2luZm8oJmRldi0+aW50Zi0+ZGV2LCAiJXM6IGhlYWQsIHRhaWwgYXJlICV4LCAleFxuIiwgX19mdW5jX18sZGV2LT5yaW5nX2hlYWQsZGV2LT5yaW5nX3RhaWwpOwogCSAgIH0KIAkgICByZXR2YWwgPSBjOwogCkBAIC02ODQsNyArNjg0LDcgQEAKIAl9CiAKIAlkZXYtPnJpbmdfdGFpbCA9IChkZXYtPnJpbmdfdGFpbCsxKSAlIHJpbmdfYnVmZmVyX3NpemU7Ci0JZGJnX2luZm8oJmRldi0+aW50Zi0+ZGV2LCAiJXM6IGhlYWQsIHRhaWwgYXJlICV4LCAleFxuIiwgX19GVU5DVElPTl9fLGRldi0+cmluZ19oZWFkLGRldi0+cmluZ190YWlsKTsKKwlkYmdfaW5mbygmZGV2LT5pbnRmLT5kZXYsICIlczogaGVhZCwgdGFpbCBhcmUgJXgsICV4XG4iLCBfX2Z1bmNfXyxkZXYtPnJpbmdfaGVhZCxkZXYtPnJpbmdfdGFpbCk7CiAKIAlyZXR2YWwgPSA4OwogI2VuZGlmIC8qIEJVRkZFUkVEX1JFQURTICovCkBAIC03NDMsNyArNzQzLDcgQEAKIAlpZiAoYnl0ZXNfdG9fd3JpdGUgPCBjb3VudCkKIAkJZGV2X3dhcm4oJmRldi0+aW50Zi0+ZGV2LCAiV3JpdGUgYnVmZmVyIG92ZXJmbG93LCAlemQgYnl0ZXMgZHJvcHBlZFxuIixjb3VudC1ieXRlc190b193cml0ZSk7CiAKLQlkYmdfaW5mbygmZGV2LT5pbnRmLT5kZXYsICIlczogY291bnQgPSAlemQsIGJ5dGVzX3RvX3dyaXRlID0gJXpkXG4iLCBfX0ZVTkNUSU9OX18sIGNvdW50LCBieXRlc190b193cml0ZSk7CisJZGJnX2luZm8oJmRldi0+aW50Zi0+ZGV2LCAiJXM6IGNvdW50ID0gJXpkLCBieXRlc190b193cml0ZSA9ICV6ZFxuIiwgX19mdW5jX18sIGNvdW50LCBieXRlc190b193cml0ZSk7CiAKIAlpZiAoY29weV9mcm9tX3VzZXIoZGV2LT5pbnRlcnJ1cHRfb3V0X2J1ZmZlciwgYnVmZmVyLCBieXRlc190b193cml0ZSkpIHsKIAkJcmV0dmFsID0gLUVGQVVMVDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9nbzcwMDcvZ283MDA3LXY0bDIuYyBiL2RyaXZlcnMvc3RhZ2luZy9nbzcwMDcvZ283MDA3LXY0bDIuYwppbmRleCA0ZjcyMzdhLi44NjhlZGI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZ283MDA3L2dvNzAwNy12NGwyLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2dvNzAwNy9nbzcwMDctdjRsMi5jCkBAIC0xNzEyLDggKzE3MTIsNyBAQAogCXBhZ2UgPSBhbGxvY19wYWdlKEdGUF9VU0VSIHwgX19HRlBfRE1BMzIpOwogCWlmICghcGFnZSkKIAkJcmV0dXJuIFZNX0ZBVUxUX09PTTsKLQljbGVhcl91c2VyX3BhZ2UocGFnZV9hZGRyZXNzKHBhZ2UpLCAodW5zaWduZWQgbG9uZyl2bWYtPnZpcnR1YWxfYWRkcmVzcywKLQkJCXBhZ2UpOworCWNsZWFyX3VzZXJfaGlnaHBhZ2UocGFnZSwgKHVuc2lnbmVkIGxvbmcpdm1mLT52aXJ0dWFsX2FkZHJlc3MpOwogCXZtZi0+cGFnZSA9IHBhZ2U7CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWUwNjAwX2V4dF9pcnEuYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTA2MDBfZXh0X2lycS5jCmluZGV4IGE0NDlhYjIuLmViYTE4YWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTA2MDBfZXh0X2lycS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTA2MDBfZXh0X2lycS5jCkBAIC0zNjAsNyArMzYwLDcgQEAKIAlpZiAoaW5zdGFuY2UtPmxpbnRubyA+IDEpIHsKIAkJUEVSUk9SX0NSSVRJQ0FMCiAJCSAgICAoIiVzKCk6V3Jvbmcgc3ViZGV2aWNlIGluZGV4PSVkIHBseDppcnFfc3RhdHVzX3JlZz0weCUwNFguXG4iLAotCQkgICAgIF9fRlVOQ1RJT05fXywgaW5zdGFuY2UtPmxpbnRubywgaW5sKGluc3RhbmNlLT5pbnRjc3IpKTsKKwkJICAgICBfX2Z1bmNfXywgaW5zdGFuY2UtPmxpbnRubywgaW5sKGluc3RhbmNlLT5pbnRjc3IpKTsKIAkJcmV0dXJuIElSUV9OT05FOwogCX0KIApAQCAtMzg0LDcgKzM4NCw3IEBACiAJfSBlbHNlIHsKIAkJUElORk8KIAkJICAgICgiJWxkIFNoYXJlZCBpbnRlcnJ1cHQuICVzKCk6IGlkeD0wIHBseDppcnFfc3RhdHVzX3JlZz0weCUwNFhcbiIsCi0JCSAgICAgamlmZmllcywgX19GVU5DVElPTl9fLCBzdGF0dXMpOworCQkgICAgIGppZmZpZXMsIF9fZnVuY19fLCBzdGF0dXMpOwogCQlyZXQgPSBJUlFfTk9ORTsKIAl9CiAJc3Bpbl91bmxvY2soaW5zdGFuY2UtPmludGNzcl9sb2NrKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTE0MDBfZXh0X2lycS5jIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMTQwMF9leHRfaXJxLmMKaW5kZXggYjhjMjY5Ni4uYjRkZjdjYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMTQwMF9leHRfaXJxLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMTQwMF9leHRfaXJxLmMKQEAgLTM0OSw3ICszNDksNyBAQAogCSAgICAoUExYX0xPQ0FMX0lOVDFfU1RBVEUgfCBQTFhfTE9DQUxfSU5UMV9FTiB8IFBMWF9QQ0lfSU5UX0VOKSkgewogCQlzcGluX3VubG9jaygmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrKTsKIAkJUElORk8oIiVsZCBTaGFyZWQgaW50ZXJydXB0LiAlcygpOiBpcnFfc3RhdHVzX3JlZz0weCUwNFhcbiIsCi0JCSAgICAgIGppZmZpZXMsIF9fRlVOQ1RJT05fXywgc3RhdHVzKTsKKwkJICAgICAgamlmZmllcywgX19mdW5jX18sIHN0YXR1cyk7CiAJCXJldHVybiBJUlFfTk9ORTsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTE2MDBfYW8uYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTE2MDBfYW8uYwppbmRleCA2ZjI2NjY1Li5kMTI3YzZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWUxNjAwX2FvLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lMTYwMF9hby5jCkBAIC05NzcsNyArOTc3LDcgQEAKIAkgICAgY29udGFpbmVyX29mKCh2b2lkICopd29yaywgbWUxNjAwX2FvX3N1YmRldmljZV90LCBhb19jb250cm9sX3Rhc2spOwogI2VuZGlmCiAKLQlQSU5GTygiPCVzOiAlbGQ+IGV4ZWN1dGVkLiBpZHg9JWRcbiIsIF9fRlVOQ1RJT05fXywgamlmZmllcywKKwlQSU5GTygiPCVzOiAlbGQ+IGV4ZWN1dGVkLiBpZHg9JWRcbiIsIF9fZnVuY19fLCBqaWZmaWVzLAogCSAgICAgIGluc3RhbmNlLT5hb19pZHgpOwogCiAJaWYgKCEoKGluc3RhbmNlLT5hb19yZWdzX3NoYWRvd3MpLT50cmlnZ2VyICYgaW5zdGFuY2UtPmFvX2lkeCkpIHsJLy8gT3V0cHV0IHdhcyB0cmlnZ2VyZC4KQEAgLTEwMjcsNyArMTAyNyw3IEBACiAJCXF1ZXVlX2RlbGF5ZWRfd29yayhpbnN0YW5jZS0+bWUxNjAwX3dvcmtxdWV1ZSwKIAkJCQkgICAmaW5zdGFuY2UtPmFvX2NvbnRyb2xfdGFzaywgMSk7CiAJfSBlbHNlIHsKLQkJUElORk8oIjwlcz4gRW5kaW5nIGNvbnRyb2wgdGFzay5cbiIsIF9fRlVOQ1RJT05fXyk7CisJCVBJTkZPKCI8JXM+IEVuZGluZyBjb250cm9sIHRhc2suXG4iLCBfX2Z1bmNfXyk7CiAJfQogCiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU0NjAwX2FpLmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU0NjAwX2FpLmMKaW5kZXggMWEwZGU1ZC4uMGE4YzlkNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lNDYwMF9haS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTQ2MDBfYWkuYwpAQCAtMjYyOSwxMSArMjYyOSwxMSBAQAogCQlpZiAoKGlycV9zdGF0dXMgJiAoTUU0NjAwX0lSUV9TVEFUVVNfQklUX0FJX0hGIHwgTUU0NjAwX0lSUV9TVEFUVVNfQklUX1NDIHwgTUU0NjAwX0lSUV9TVEFUVVNfQklUX0xFKSkgPT0gTUU0NjAwX0lSUV9TVEFUVVNfQklUX0xFKSB7CS8vVGhpcyBpcyBzZWN1cml0eSBjaGVjayBjYXNlLiBMRSBpcyB1bnVzZWQuIFRoaXMgc2hvdWxkIG5ldmVyIGV2ZXIgaGFwcGVuZC4KIAkJCVBJTkZPCiAJCQkgICAgKCIlbGQgU2hhcmVkIGludGVycnVwdC4gJXMoKTogaXJxX3N0YXR1c19yZWc9TEVfSVJRXG4iLAotCQkJICAgICBqaWZmaWVzLCBfX0ZVTkNUSU9OX18pOworCQkJICAgICBqaWZmaWVzLCBfX2Z1bmNfXyk7CiAJCX0gZWxzZSB7CiAJCQlQSU5GTwogCQkJICAgICgiJWxkIFNoYXJlZCBpbnRlcnJ1cHQuICVzKCk6IGlycV9zdGF0dXNfcmVnPTB4JTA0WFxuIiwKLQkJCSAgICAgamlmZmllcywgX19GVU5DVElPTl9fLCBpcnFfc3RhdHVzKTsKKwkJCSAgICAgamlmZmllcywgX19mdW5jX18sIGlycV9zdGF0dXMpOwogCQl9CiAjZW5kaWYKIAkJcmV0dXJuIElSUV9OT05FOwpAQCAtMzMyOSw3ICszMzI5LDcgQEAKIAlpbnN0YW5jZSA9CiAJICAgIGNvbnRhaW5lcl9vZigodm9pZCAqKXdvcmssIG1lNDYwMF9haV9zdWJkZXZpY2VfdCwgYWlfY29udHJvbF90YXNrKTsKICNlbmRpZgotCVBJTkZPKCI8JXM6ICVsZD4gZXhlY3V0ZWQuXG4iLCBfX0ZVTkNUSU9OX18sIGppZmZpZXMpOworCVBJTkZPKCI8JXM6ICVsZD4gZXhlY3V0ZWQuXG4iLCBfX2Z1bmNfXywgamlmZmllcyk7CiAKIAlzdGF0dXMgPSBpbmwoaW5zdGFuY2UtPnN0YXR1c19yZWcpOwogCVBERUJVR19SRUcoInN0YXR1c19yZWcgaW5sKDB4JWxYKzB4JWxYKT0weCV4XG4iLCBpbnN0YW5jZS0+cmVnX2Jhc2UsCkBAIC0zNDI4LDcgKzM0MjgsNyBAQAogCQlxdWV1ZV9kZWxheWVkX3dvcmsoaW5zdGFuY2UtPm1lNDYwMF93b3JrcXVldWUsCiAJCQkJICAgJmluc3RhbmNlLT5haV9jb250cm9sX3Rhc2ssIDEpOwogCX0gZWxzZSB7Ci0JCVBJTkZPKCI8JXM+IEVuZGluZyBjb250cm9sIHRhc2suXG4iLCBfX0ZVTkNUSU9OX18pOworCQlQSU5GTygiPCVzPiBFbmRpbmcgY29udHJvbCB0YXNrLlxuIiwgX19mdW5jX18pOwogCX0KIAogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lNDYwMF9hby5jIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lNDYwMF9hby5jCmluZGV4IDJjOTJlNjUuLmUyYmVjODIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTQ2MDBfYW8uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU0NjAwX2FvLmMKQEAgLTIyOTQsNyArMjI5NCw3IEBACiAJaXJxX3N0YXR1cyA9IGlubChpbnN0YW5jZS0+aXJxX3N0YXR1c19yZWcpOwogCWlmICghKGlycV9zdGF0dXMgJiAoTUU0NjAwX0lSUV9TVEFUVVNfQklUX0FPX0hGIDw8IGluc3RhbmNlLT5hb19pZHgpKSkgewogCQlQSU5GTygiJWxkIFNoYXJlZCBpbnRlcnJ1cHQuICVzKCk6IElEPSVkOiBzdGF0dXNfcmVnPTB4JTA0WFxuIiwKLQkJICAgICAgamlmZmllcywgX19GVU5DVElPTl9fLCBpbnN0YW5jZS0+YW9faWR4LCBpcnFfc3RhdHVzKTsKKwkJICAgICAgamlmZmllcywgX19mdW5jX18sIGluc3RhbmNlLT5hb19pZHgsIGlycV9zdGF0dXMpOwogCQlyZXR1cm4gSVJRX05PTkU7CiAJfQogCkBAIC0zMDA5LDcgKzMwMDksNyBAQAogCWluc3RhbmNlID0KIAkgICAgY29udGFpbmVyX29mKCh2b2lkICopd29yaywgbWU0NjAwX2FvX3N1YmRldmljZV90LCBhb19jb250cm9sX3Rhc2spOwogI2VuZGlmCi0JUElORk8oIjwlczogJWxkPiBleGVjdXRlZC4gaWR4PSVkXG4iLCBfX0ZVTkNUSU9OX18sIGppZmZpZXMsCisJUElORk8oIjwlczogJWxkPiBleGVjdXRlZC4gaWR4PSVkXG4iLCBfX2Z1bmNfXywgamlmZmllcywKIAkgICAgICBpbnN0YW5jZS0+YW9faWR4KTsKIAogCXN0YXR1cyA9IGlubChpbnN0YW5jZS0+c3RhdHVzX3JlZyk7CkBAIC0zMzE2LDcgKzMzMTYsNyBAQAogCQlxdWV1ZV9kZWxheWVkX3dvcmsoaW5zdGFuY2UtPm1lNDYwMF93b3JrcXVldWUsCiAJCQkJICAgJmluc3RhbmNlLT5hb19jb250cm9sX3Rhc2ssIDEpOwogCX0gZWxzZSB7Ci0JCVBJTkZPKCI8JXM+IEVuZGluZyBjb250cm9sIHRhc2suXG4iLCBfX0ZVTkNUSU9OX18pOworCQlQSU5GTygiPCVzPiBFbmRpbmcgY29udHJvbCB0YXNrLlxuIiwgX19mdW5jX18pOwogCX0KIAogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lNDYwMF9leHRfaXJxLmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU0NjAwX2V4dF9pcnEuYwppbmRleCA4YTEwZGNlLi5hZGMxZTFiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU0NjAwX2V4dF9pcnEuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU0NjAwX2V4dF9pcnEuYwpAQCAtMzU2LDcgKzM1Niw3IEBACiAJaXJxX3N0YXR1cyA9IGlubChpbnN0YW5jZS0+aXJxX3N0YXR1c19yZWcpOwogCWlmICghKGlycV9zdGF0dXMgJiBNRTQ2MDBfSVJRX1NUQVRVU19CSVRfRVgpKSB7CiAJCVBJTkZPKCIlbGQgU2hhcmVkIGludGVycnVwdC4gJXMoKTogaXJxX3N0YXR1c19yZWc9MHglMDRYXG4iLAotCQkgICAgICBqaWZmaWVzLCBfX0ZVTkNUSU9OX18sIGlycV9zdGF0dXMpOworCQkgICAgICBqaWZmaWVzLCBfX2Z1bmNfXywgaXJxX3N0YXR1cyk7CiAJCXJldHVybiBJUlFfTk9ORTsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTYwMDBfYW8uYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTYwMDBfYW8uYwppbmRleCAzZjVmZjZkLi45NGYwMTIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU2MDAwX2FvLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lNjAwMF9hby5jCkBAIC04NjMsNyArODYzLDcgQEAKIAogLy8vIEBub3RlIFdoZW4gZmxhZyAnTUVfSU9fU0lOR0xFX1RZUEVfVFJJR19TWU5DSFJPTk9VUycgaXMgc2V0IHRoYW4gb3V0cHV0IGlzIHRyaWdnZXJlZC4gQUxXQVlTIQogCi0JUElORk8oIjwlcz4gc3RhcnQgbW9kZT0gMHglMDh4ICVzXG4iLCBfX0ZVTkNUSU9OX18sIG1vZGUsCisJUElORk8oIjwlcz4gc3RhcnQgbW9kZT0gMHglMDh4ICVzXG4iLCBfX2Z1bmNfXywgbW9kZSwKIAkgICAgICAoZmxhZ3MgJiBNRV9JT19TSU5HTEVfVFlQRV9UUklHX1NZTkNIUk9OT1VTKSA/ICJTWU5DSFJPTk9VUyIgOgogCSAgICAgICIiKTsKIAlpZiAoaW5zdGFuY2UtPmZpZm8gJiBNRTYwMDBfQU9fSEFTX0ZJRk8pIHsJLy8gRklGTyAtIENvbnRpbm91cyBtb2RlCkBAIC0xNjYzLDcgKzE2NjMsNyBAQAogCiAJc3RhdHVzID0gaW5sKGluc3RhbmNlLT5zdGF0dXNfcmVnKTsKIAkvL1N0YXJ0IHN0YXRlIG1hY2hpbmUgYW5kIGludGVycnVwdHMKLQlQSU5GTygiPCVzOiVkPiBTdGFydCBzdGF0ZSBtYWNoaW5lLlxuIiwgX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7CisJUElORk8oIjwlczolZD4gU3RhcnQgc3RhdGUgbWFjaGluZS5cbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CiAJY3RybCAmPSB+KE1FNjAwMF9BT19DVFJMX0JJVF9TVE9QIHwgTUU2MDAwX0FPX0NUUkxfQklUX0lNTUVESUFURV9TVE9QKTsKIAlpZiAoaW5zdGFuY2UtPnN0YXJ0X21vZGUgPT0gTUU2MDAwX0FPX0VYVF9UUklHKSB7CiAJCVBERUJVRygiRElHSVRBTCBUUklHR0VSXG4iKTsKQEAgLTE2NzEsNyArMTY3MSw3IEBACiAJfQogCWlmICghKHN0YXR1cyAmIE1FNjAwMF9BT19TVEFUVVNfQklUX0hGKSkgewkvL01vcmUgdGhhbiBoYWxmIQogCQlpZiAoKGN0cmwgJiBNRTYwMDBfQU9fQ1RSTF9NT0RFX01BU0spID09IE1FNjAwMF9BT19NT0RFX0NPTlRJTlVPVVMpIHsJLy9FbmFibGUgSVJRIG9ubHkgd2hlbiBoYXJkd2FyZV9jb250aW5vdXMgaXMgc2V0IGFuZCBGSUZPIGlzIG1vcmUgdGhhbiBoYWxmCi0JCQlQSU5GTygiPCVzOiVkPiBTdGFydCBpbnRlcnJ1cHRzLlxuIiwgX19GVU5DVElPTl9fLAorCQkJUElORk8oIjwlczolZD4gU3RhcnQgaW50ZXJydXB0cy5cbiIsIF9fZnVuY19fLAogCQkJICAgICAgX19MSU5FX18pOwogCQkJY3RybCB8PSBNRTYwMDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0lSUTsKIAkJfQpAQCAtMTY4Miw3ICsxNjgyLDcgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssIGNwdV9mbGFncyk7CiAKIAkvL1RyaWdnZXIgb3V0cHV0Ci0JUElORk8oIjwlcz4gc3RhcnQgbW9kZT0gMHgleCAlc1xuIiwgX19GVU5DVElPTl9fLCBpbnN0YW5jZS0+c3RhcnRfbW9kZSwKKwlQSU5GTygiPCVzPiBzdGFydCBtb2RlPSAweCV4ICVzXG4iLCBfX2Z1bmNfXywgaW5zdGFuY2UtPnN0YXJ0X21vZGUsCiAJICAgICAgKGZsYWdzICYgTUVfSU9fU0lOR0xFX1RZUEVfVFJJR19TWU5DSFJPTk9VUykgPyAiU1lOQ0hST05PVVMiIDoKIAkgICAgICAiIik7CiAJaWYgKGZsYWdzICYgTUVfSU9fU0lOR0xFX1RZUEVfVFJJR19TWU5DSFJPTk9VUykgewkvL1RyaWdnZXIgb3V0cHV0cwpAQCAtMTc3Nyw3ICsxNzc3LDcgQEAKIAkJc3RhdHVzID0gaW5sKGluc3RhbmNlLT5zdGF0dXNfcmVnKTsKIAkJaWYgKCEoc3RhdHVzICYgTUU2MDAwX0FPX1NUQVRVU19CSVRfSEYpKSB7CS8vTW9yZSB0aGFuIGhhbGYhCiAJCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5zdGFuY2UtPnN1YmRldmljZV9sb2NrLCBjcHVfZmxhZ3MpOwotCQkJUElORk8oIjwlczolZD4gU3RhcnQgaW50ZXJydXB0cy5cbiIsIF9fRlVOQ1RJT05fXywKKwkJCVBJTkZPKCI8JXM6JWQ+IFN0YXJ0IGludGVycnVwdHMuXG4iLCBfX2Z1bmNfXywKIAkJCSAgICAgIF9fTElORV9fKTsKIAkJCWN0cmwgPSBpbmwoaW5zdGFuY2UtPmN0cmxfcmVnKTsKIAkJCWN0cmwgfD0gTUU2MDAwX0FPX0NUUkxfQklUX0VOQUJMRV9JUlE7CkBAIC0xODE5LDcgKzE4MTksNyBAQAogCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZpbnN0YW5jZS0+c3ViZGV2aWNlX2xvY2ssCiAJCQkJCQkgIGNwdV9mbGFncyk7CiAJCQkJUElORk8oIjwlczolZD4gU3RhcnQgaW50ZXJydXB0cy5cbiIsCi0JCQkJICAgICAgX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7CisJCQkJICAgICAgX19mdW5jX18sIF9fTElORV9fKTsKIAkJCQljdHJsID0gaW5sKGluc3RhbmNlLT5jdHJsX3JlZyk7CiAJCQkJY3RybCB8PSBNRTYwMDBfQU9fQ1RSTF9CSVRfRU5BQkxFX0lSUTsKIAkJCQlvdXRsKGN0cmwsIGluc3RhbmNlLT5jdHJsX3JlZyk7CkBAIC0yMzQ2LDcgKzIzNDYsNyBAQAogCWlycV9zdGF0dXMgPSBpbmwoaW5zdGFuY2UtPmlycV9zdGF0dXNfcmVnKTsKIAlpZiAoIShpcnFfc3RhdHVzICYgKE1FNjAwMF9JUlFfU1RBVFVTX0JJVF9BT19IRiA8PCBpbnN0YW5jZS0+YW9faWR4KSkpIHsKIAkJUElORk8oIiVsZCBTaGFyZWQgaW50ZXJydXB0LiAlcygpOiBJRD0lZDogc3RhdHVzX3JlZz0weCUwNFhcbiIsCi0JCSAgICAgIGppZmZpZXMsIF9fRlVOQ1RJT05fXywgaW5zdGFuY2UtPmFvX2lkeCwgaXJxX3N0YXR1cyk7CisJCSAgICAgIGppZmZpZXMsIF9fZnVuY19fLCBpbnN0YW5jZS0+YW9faWR4LCBpcnFfc3RhdHVzKTsKIAkJcmV0dXJuIElSUV9OT05FOwogCX0KIApAQCAtMjg2MSw3ICsyODYxLDcgQEAKIAkJCX0KIAkJfQogCi0JCVBJTkZPKCI8JXM+IFdhaXQgZm9yIHN0b3A6ICVkXG4iLCBfX0ZVTkNUSU9OX18sIGkpOworCQlQSU5GTygiPCVzPiBXYWl0IGZvciBzdG9wOiAlZFxuIiwgX19mdW5jX18sIGkpOwogCiAJCS8vU3RpbGwgd29ya2luZyEKIAkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKQEAgLTMxMzIsNyArMzEzMiw3IEBACiAJaW5zdGFuY2UgPQogCSAgICBjb250YWluZXJfb2YoKHZvaWQgKil3b3JrLCBtZTYwMDBfYW9fc3ViZGV2aWNlX3QsIGFvX2NvbnRyb2xfdGFzayk7CiAjZW5kaWYKLQlQSU5GTygiPCVzOiAlbGQ+IGV4ZWN1dGVkLiBpZHg9JWRcbiIsIF9fRlVOQ1RJT05fXywgamlmZmllcywKKwlQSU5GTygiPCVzOiAlbGQ+IGV4ZWN1dGVkLiBpZHg9JWRcbiIsIF9fZnVuY19fLCBqaWZmaWVzLAogCSAgICAgIGluc3RhbmNlLT5hb19pZHgpOwogCiAJc3RhdHVzID0gaW5sKGluc3RhbmNlLT5zdGF0dXNfcmVnKTsKQEAgLTM1NTAsNyArMzU1MCw3IEBACiAJCXF1ZXVlX2RlbGF5ZWRfd29yayhpbnN0YW5jZS0+bWU2MDAwX3dvcmtxdWV1ZSwKIAkJCQkgICAmaW5zdGFuY2UtPmFvX2NvbnRyb2xfdGFzaywgMSk7CiAJfSBlbHNlIHsKLQkJUElORk8oIjwlcz4gRW5kaW5nIGNvbnRyb2wgdGFzay5cbiIsIF9fRlVOQ1RJT05fXyk7CisJCVBJTkZPKCI8JXM+IEVuZGluZyBjb250cm9sIHRhc2suXG4iLCBfX2Z1bmNfXyk7CiAJfQogCiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU4MTAwX2RpLmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU4MTAwX2RpLmMKaW5kZXggMGYxNDYzNy4uOTcxNzI3YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lODEwMF9kaS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTgxMDBfZGkuYwpAQCAtNTM2LDcgKzUzNiw3IEBACiAJCSAgICAgUExYX0lOVENTUl9MT0NBTF9JTlQxX0VOKSkgewogCQkJUElORk8KIAkJCSAgICAoIiVsZCBTaGFyZWQgaW50ZXJydXB0LiAlcygpOiBpZHg9MCBwbHg6aXJxX3N0YXR1c19yZWc9MHglMDRYXG4iLAotCQkJICAgICBqaWZmaWVzLCBfX0ZVTkNUSU9OX18sIGljc3IpOworCQkJICAgICBqaWZmaWVzLCBfX2Z1bmNfXywgaWNzcik7CiAJCQlyZXR1cm4gSVJRX05PTkU7CiAJCX0KIAl9IGVsc2UgaWYgKGluc3RhbmNlLT5kaV9pZHggPT0gMSkgewpAQCAtNTQ3LDExICs1NDcsMTEgQEAKIAkJICAgICBQTFhfSU5UQ1NSX0xPQ0FMX0lOVDJfRU4pKSB7CiAJCQlQSU5GTwogCQkJICAgICgiJWxkIFNoYXJlZCBpbnRlcnJ1cHQuICVzKCk6IGlkeD0xIHBseDppcnFfc3RhdHVzX3JlZz0weCUwNFhcbiIsCi0JCQkgICAgIGppZmZpZXMsIF9fRlVOQ1RJT05fXywgaWNzcik7CisJCQkgICAgIGppZmZpZXMsIF9fZnVuY19fLCBpY3NyKTsKIAkJCXJldHVybiBJUlFfTk9ORTsKIAkJfQogCX0gZWxzZSB7Ci0JCVBFUlJPUigiJXMoKTpXcm9uZyBpbnRlcnJ1cHQgaWR4PSVkIGNzcj0weCVYLlxuIiwgX19GVU5DVElPTl9fLAorCQlQRVJST1IoIiVzKCk6V3JvbmcgaW50ZXJydXB0IGlkeD0lZCBjc3I9MHglWC5cbiIsIF9fZnVuY19fLAogCQkgICAgICAgaW5zdGFuY2UtPmRpX2lkeCwgaWNzcik7CiAJCXJldHVybiBJUlFfTk9ORTsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU4MjAwX2RpLmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU4MjAwX2RpLmMKaW5kZXggMGJiNDU2Ny4uMjc1MjViYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lODIwMF9kaS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTgyMDBfZGkuYwpAQCAtNTcwLDcgKzU3MCw3IEBACiAJaWYgKCFpcnFfc3RhdHVzKSB7CiAJCVBJTkZPCiAJCSAgICAoIiVsZCBTaGFyZWQgaW50ZXJydXB0LiAlcygpOiBpZHg9JWQgaXJxX3N0YXR1c19yZWc9MHglMDRYXG4iLAotCQkgICAgIGppZmZpZXMsIF9fRlVOQ1RJT05fXywgaW5zdGFuY2UtPmRpX2lkeCwgaXJxX3N0YXR1cyk7CisJCSAgICAgamlmZmllcywgX19mdW5jX18sIGluc3RhbmNlLT5kaV9pZHgsIGlycV9zdGF0dXMpOwogCQlyZXR1cm4gSVJRX05PTkU7CiAJfQogCkBAIC02NTgsNyArNjU4LDcgQEAKIAlpZiAoIWlycV9zdGF0dXMpIHsKIAkJUElORk8KIAkJICAgICgiJWxkIFNoYXJlZCBpbnRlcnJ1cHQuICVzKCk6IGlkeD0lZCBpcnFfc3RhdHVzX3JlZz0weCUwNFhcbiIsCi0JCSAgICAgamlmZmllcywgX19GVU5DVElPTl9fLCBpbnN0YW5jZS0+ZGlfaWR4LCBpcnFfc3RhdHVzKTsKKwkJICAgICBqaWZmaWVzLCBfX2Z1bmNfXywgaW5zdGFuY2UtPmRpX2lkeCwgaXJxX3N0YXR1cyk7CiAJCXJldHVybiBJUlFfTk9ORTsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTgyMDBfZG8uYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZTgyMDBfZG8uYwppbmRleCA1ZjRiYTVkLi5kMmJlYmQxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWU4MjAwX2RvLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lODIwMF9kby5jCkBAIC00NzUsNyArNDc1LDcgQEAKIAkgICAgIChNRTgyMDBfRE9fSVJRX1NUQVRVU19CSVRfQUNUSVZFIDw8IGluc3RhbmNlLT5kb19pZHgpKSkgewogCQlQSU5GTwogCQkgICAgKCIlbGQgU2hhcmVkIGludGVycnVwdC4gJXMoKTogaWR4PSVkIGlycV9zdGF0dXNfcmVnPTB4JTA0WFxuIiwKLQkJICAgICBqaWZmaWVzLCBfX0ZVTkNUSU9OX18sIGluc3RhbmNlLT5kb19pZHgsIGlycV9zdGF0dXMpOworCQkgICAgIGppZmZpZXMsIF9fZnVuY19fLCBpbnN0YW5jZS0+ZG9faWR4LCBpcnFfc3RhdHVzKTsKIAkJcmV0dXJuIElSUV9OT05FOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lZGVidWcuaCBiL2RyaXZlcnMvc3RhZ2luZy9tZWlsaGF1cy9tZWRlYnVnLmgKaW5kZXggMzgyZDAwZi4uZGNmYjk3YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL21laWxoYXVzL21lZGVidWcuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVpbGhhdXMvbWVkZWJ1Zy5oCkBAIC02NiwyMSArNjYsMjEgQEAKIAogI2lmZGVmIE1FREVCVUdfREVCVUcKICMgZGVmaW5lIFBERUJVRyhmbXQsIGFyZ3MuLi4pIFwKLQlwcmludGsoS0VSTl9ERUJVRyJNRV9EUlYgRDogPCVzPiAiIGZtdCwgX19GVU5DVElPTl9fLCAjI2FyZ3MpCisJcHJpbnRrKEtFUk5fREVCVUciTUVfRFJWIEQ6IDwlcz4gIiBmbXQsIF9fZnVuY19fLCAjI2FyZ3MpCiAjZWxzZQogIyBkZWZpbmUgUERFQlVHKGZtdCwgYXJncy4uLikKICNlbmRpZgogCiAjaWZkZWYgTUVERUJVR19ERUJVR19MT0NLUwogIyBkZWZpbmUgUERFQlVHX0xPQ0tTKGZtdCwgYXJncy4uLikgXAotCXByaW50ayhLRVJOX0RFQlVHIk1FX0RSViBMOiA8JXM+ICIgZm10LCBfX0ZVTkNUSU9OX18sICMjYXJncykKKwlwcmludGsoS0VSTl9ERUJVRyJNRV9EUlYgTDogPCVzPiAiIGZtdCwgX19mdW5jX18sICMjYXJncykKICNlbHNlCiAjIGRlZmluZSBQREVCVUdfTE9DS1MoZm10LCBhcmdzLi4uKQogI2VuZGlmCiAKICNpZmRlZiBNRURFQlVHX0RFQlVHX1JFRwogIyBkZWZpbmUgUERFQlVHX1JFRyhmbXQsIGFyZ3MuLi4pIFwKLQlwcmludGsoS0VSTl9ERUJVRyJNRV9EUlYgUjogPCVzOiVkPiBSRUc6IiBmbXQsIF9fRlVOQ1RJT05fXywgX19MSU5FX18sICMjYXJncykKKwlwcmludGsoS0VSTl9ERUJVRyJNRV9EUlYgUjogPCVzOiVkPiBSRUc6IiBmbXQsIF9fZnVuY19fLCBfX0xJTkVfXywgIyNhcmdzKQogI2Vsc2UKICMgZGVmaW5lIFBERUJVR19SRUcoZm10LCBhcmdzLi4uKQogI2VuZGlmCkBAIC0xMDgsNyArMTA4LDcgQEAKIAogLy9UaGlzIGRlYnVnIGlzIG9ubHkgdG8gZGV0ZWN0IGxvZ2ljYWwgZXJyb3JzIQogIyBkZWZpbmUgUFNFQ1VSSVRZKGZtdCwgYXJncy4uLikgXAotCXByaW50ayhLRVJOX0NSSVQiTUVfRFJWIFNFQ1VSSVRZOiA8JXM6JXM6JWk+ICIgZm10LCBfX0ZJTEVfXywgX19GVU5DVElPTl9fLCBfX0xJTkVfXywgIyNhcmdzKQorCXByaW50ayhLRVJOX0NSSVQiTUVfRFJWIFNFQ1VSSVRZOiA8JXM6JXM6JWk+ICIgZm10LCBfX0ZJTEVfXywgX19mdW5jX18sIF9fTElORV9fLCAjI2FyZ3MpCiAvL1RoaXMgZGVidWcgaXMgdG8ga2VlcCB0cmFjayBpbiBjdXN0b21lcnMnIHN5c3RlbQogIyBkZWZpbmUgUExPRyhmbXQsIGFyZ3MuLi4pIFwKIAlwcmludGsoS0VSTl9JTkZPIk1FX0RSVjogIiBmbXQsICMjYXJncykKQEAgLTExNiw3ICsxMTYsNyBAQAogLy9UaGlzIGRlYnVnIGlzIHRvIGNoZWNrIG5ldyBwYXJ0cyBkdXJpbmcgZGV2ZWxvcG1lbnQKICNpZmRlZiBNRURFQlVHX0RFVkVMT1AKICMgZGVmaW5lIFBERVZFTE9QKGZtdCwgYXJncy4uLikgXAotCXByaW50ayhLRVJOX0NSSVQiTUVfRFJWOiA8JXM6JXM6JWk+ICIgZm10LCBfX0ZJTEVfXywgX19GVU5DVElPTl9fLCBfX0xJTkVfXywgIyNhcmdzKQorCXByaW50ayhLRVJOX0NSSVQiTUVfRFJWOiA8JXM6JXM6JWk+ICIgZm10LCBfX0ZJTEVfXywgX19mdW5jX18sIF9fTElORV9fLCAjI2FyZ3MpCiAjZWxzZQogIyBkZWZpbmUgUERFVkVMT1AoZm10LCBhcmdzLi4uKQogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvb3R1cy84MDIxMWNvcmUvY2FnZy5jIGIvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL2NhZ2cuYwppbmRleCBmY2ZkMDFhLi40OTQyMTkwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvb3R1cy84MDIxMWNvcmUvY2FnZy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzLzgwMjExY29yZS9jYWdnLmMKQEAgLTE5MzMsNyArMTkzMyw3IEBACiAgICAgICovCiAKICAgICAvKiB6bV9tc2cyX2FnZyhaTV9MVl8wLCAicXVldWUgc2VxID0gIiwgc2VxX25vKTsKLSAgICAgKiBEYmdQcmludCgiJXM6JXMlbHhoICVzJWx4aFxuIiwgX19GVU5DVElPTl9fLCAicXVldWUgc2VxPSIsIHNlcV9ubywKKyAgICAgKiBEYmdQcmludCgiJXM6JXMlbHhoICVzJWx4aFxuIiwgX19mdW5jX18sICJxdWV1ZSBzZXE9Iiwgc2VxX25vLAogICAgICAqICAgIjsgc2VxX3N0YXJ0PSIsIHRpZF9yeC0+c2VxX3N0YXJ0KTsKICAgICAgKi8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL3B1Yl96ZncuaCBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzLzgwMjExY29yZS9wdWJfemZ3LmgKaW5kZXggMDFhMjI3Mi4uMjQ3NGJiNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL3B1Yl96ZncuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy84MDIxMWNvcmUvcHViX3pmdy5oCkBAIC0yMyw3ICsyMyw3IEBACiAvKiBCdWZmZXIgbWFuYWdlbWVudCAqLwogI2lmZGVmIFpNX0VOQUJMRV9CVUZGRVJfREVCVUcKIGV4dGVybiB6YnVmX3QqIHpmd0J1ZkFsbG9jYXRlV2l0aENvbnRleHQoemRldl90KiBkZXYsIHUxNl90IGxlbiwgdThfdCAqZnVuY3Rpb25OYW1lLCBVTE9ORyBsaW5lKTsKLSNkZWZpbmUgemZ3QnVmQWxsb2NhdGUoZGV2LCBsZW4pICB6ZndCdWZBbGxvY2F0ZVdpdGhDb250ZXh0KGRldiwgbGVuLCAodThfdCAqKV9fRlVOQ1RJT05fXywgX19MSU5FX18pCisjZGVmaW5lIHpmd0J1ZkFsbG9jYXRlKGRldiwgbGVuKSAgemZ3QnVmQWxsb2NhdGVXaXRoQ29udGV4dChkZXYsIGxlbiwgKHU4X3QgKilfX2Z1bmNfXywgX19MSU5FX18pCiAjZWxzZQogZXh0ZXJuIHpidWZfdCogemZ3QnVmQWxsb2NhdGUoemRldl90KiBkZXYsIHUxNl90IGxlbik7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzLzgwMjExY29yZS9zdHJ1Y3QuaCBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzLzgwMjExY29yZS9zdHJ1Y3QuaAppbmRleCA0MzYzMWM2Li4xN2I1Y2UzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvb3R1cy84MDIxMWNvcmUvc3RydWN0LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL3N0cnVjdC5oCkBAIC0xMzcsNyArMTM3LDcgQEAKIAogI2lmZGVmIFpNX0VOQUJMRV9CVUZGRVJfVFJBQ0UKIGV4dGVybiB2b2lkIHpmd0J1ZlRyYWNlKHpkZXZfdCogZGV2LCB6YnVmX3QgKmJ1ZiwgdThfdCAqZnVuY3Rpb25OYW1lKTsKLSNkZWZpbmUgWk1fQlVGRkVSX1RSQUNFKGRldiwgYnVmKSAgICAgICB6ZndCdWZUcmFjZShkZXYsIGJ1ZiwgX19GVU5DVElPTl9fKTsKKyNkZWZpbmUgWk1fQlVGRkVSX1RSQUNFKGRldiwgYnVmKSAgICAgICB6ZndCdWZUcmFjZShkZXYsIGJ1ZiwgX19mdW5jX18pOwogI2Vsc2UKICNkZWZpbmUgWk1fQlVGRkVSX1RSQUNFKGRldiwgYnVmKQogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvb3R1cy9vYWxfbWFyYy5oIGIvZHJpdmVycy9zdGFnaW5nL290dXMvb2FsX21hcmMuaAppbmRleCA0MzhlNGJjLi4yMDYxMTE2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvb3R1cy9vYWxfbWFyYy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzL29hbF9tYXJjLmgKQEAgLTEwNiwxNCArMTA2LDE0IEBACiAKIC8qKioqKiBEZWJ1ZyBtZXNzYWdlICoqKioqLwogI2lmIDAKLSNkZWZpbmUgem1fZGVidWdfbXNnMChtc2cpIHByaW50aygiJXM6JXNcbiIsIF9fRlVOQ1RJT05fXywgbXNnKTsKLSNkZWZpbmUgem1fZGVidWdfbXNnMShtc2csIHZhbCkgcHJpbnRrKCIlczolcyVsZFxuIiwgX19GVU5DVElPTl9fLCBcCisjZGVmaW5lIHptX2RlYnVnX21zZzAobXNnKSBwcmludGsoIiVzOiVzXG4iLCBfX2Z1bmNfXywgbXNnKTsKKyNkZWZpbmUgem1fZGVidWdfbXNnMShtc2csIHZhbCkgcHJpbnRrKCIlczolcyVsZFxuIiwgX19mdW5jX18sIFwKICAgICAgICAgbXNnLCAodTMyX3QpdmFsKTsKLSNkZWZpbmUgem1fZGVidWdfbXNnMihtc2csIHZhbCkgcHJpbnRrKCIlczolcyVseGhcbiIsIF9fRlVOQ1RJT05fXywgXAorI2RlZmluZSB6bV9kZWJ1Z19tc2cyKG1zZywgdmFsKSBwcmludGsoIiVzOiVzJWx4aFxuIiwgX19mdW5jX18sIFwKICAgICAgICAgbXNnLCAodTMyX3QpdmFsKTsKLSNkZWZpbmUgem1fZGVidWdfbXNnX3MobXNnLCB2YWwpIHByaW50aygiJXM6JXMlc1xuIiwgX19GVU5DVElPTl9fLCBcCisjZGVmaW5lIHptX2RlYnVnX21zZ19zKG1zZywgdmFsKSBwcmludGsoIiVzOiVzJXNcbiIsIF9fZnVuY19fLCBcCiAgICAgICAgIG1zZywgdmFsKTsKLSNkZWZpbmUgem1fZGVidWdfbXNnX3AobXNnLCB2YWwxLCB2YWwyKSBwcmludGsoIiVzOiVzJTAxbGQuJTAybGRcbiIsIF9fRlVOQ1RJT05fXywgXAorI2RlZmluZSB6bV9kZWJ1Z19tc2dfcChtc2csIHZhbDEsIHZhbDIpIHByaW50aygiJXM6JXMlMDFsZC4lMDJsZFxuIiwgX19mdW5jX18sIFwKICAgICAgICAgbXNnLCAodmFsMS92YWwyKSwgKCgodmFsMSoxMDApL3ZhbDIpJTEwMCkpOwogI2RlZmluZSB6bV9kYmcoUykgcHJpbnRrIFMKICNlbHNlCkBAIC0xMjcsNyArMTI3LDcgQEAKIAogI2RlZmluZSB6bV9hc3NlcnQoZXhwcikgaWYoIShleHByKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgcHJpbnRrKCAiQXRoZW9ycyBBc3NlcnRpb24gZmFpbGVkISAlcywlcywlcyxsaW5lPSVkXG4iLCAgIFwKLSAgICAgICAgI2V4cHIsX19GSUxFX18sX19GVU5DVElPTl9fLF9fTElORV9fKTsgICAgICAgICAgICAgICAgICBcCisgICAgICAgICNleHByLF9fRklMRV9fLF9fZnVuY19fLF9fTElORV9fKTsgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIH0KIAogI2RlZmluZSBEYmdQcmludCBwcmludGsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvMjg2MF9tYWluX2Rldi5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC8yODYwX21haW5fZGV2LmMKaW5kZXggMWUzOGYyZC4uMDhjYTgxZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC8yODYwX21haW5fZGV2LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC8yODYwX21haW5fZGV2LmMKQEAgLTEyMDIsNyArMTIwMiw3IEBACiAJVUNIQVIJCQliY25faWR4ID0gMDsKIAogCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXMoKSA6IE5vIHZhbGlkIEludGVyZmFjZSBiZSBmb3VuZC5cbiIsIF9fRlVOQ1RJT05fXykpOworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlcygpIDogTm8gdmFsaWQgSW50ZXJmYWNlIGJlIGZvdW5kLlxuIiwgX19mdW5jX18pKTsKIAkJcmV0dXJuOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vYmFfYWN0aW9uLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9iYV9hY3Rpb24uYwppbmRleCA4MjQ3YWViLi41OTFkMWUyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9iYV9hY3Rpb24uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9iYV9hY3Rpb24uYwpAQCAtNTk5LDcgKzU5OSw3IEBACiAKIAkJcEJBRW50cnktPk9SSUJBVGltZXIuVGltZXJWYWx1ZSA9IDA7CS8vcEZyYW1lLT5UaW1lT3V0VmFsdWU7CiAKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCIlcyA6IFRYQkFiaXRtYXAgPSAleCwgQkFXaW5TaXplID0gJWQsIFRpbWVPdXQgPSAlbGRcbiIsIF9fRlVOQ1RJT05fXywgcEVudHJ5LT5UWEJBYml0bWFwLAorCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIiVzIDogVFhCQWJpdG1hcCA9ICV4LCBCQVdpblNpemUgPSAlZCwgVGltZU91dCA9ICVsZFxuIiwgX19mdW5jX18sIHBFbnRyeS0+VFhCQWJpdG1hcCwKIAkJCQkJCQkJIHBCQUVudHJ5LT5CQVdpblNpemUsIHBCQUVudHJ5LT5PUklCQVRpbWVyLlRpbWVyVmFsdWUpKTsKIAogCQkvLyBTRU5EIEJBUiA7CkBAIC02NzMsNyArNjczLDcgQEAKIAkJYmFfcmVmcmVzaF9yZW9yZGVyaW5nX21wZHVzKHBBZCwgcEJBRW50cnkpOwogCX0KIAotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiJXMoJWxkKTogSWR4ID0gJWQsIEJBV2luU2l6ZShyZXEgJWQpID0gJWRcbiIsIF9fRlVOQ1RJT05fXywgcEFkLT5CQVRhYmxlLm51bUFzUmVjaXBpZW50LCBJZHgsCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCIlcyglbGQpOiBJZHggPSAlZCwgQkFXaW5TaXplKHJlcSAlZCkgPSAlZFxuIiwgX19mdW5jX18sIHBBZC0+QkFUYWJsZS5udW1Bc1JlY2lwaWVudCwgSWR4LAogCQkJCQkJCSBwRnJhbWUtPkJhUGFybS5CdWZTaXplLCBCQVdpblNpemUpKTsKIAogCS8vIFN0YXJ0IGZpbGwgaW4gcGFyYW1ldGVycy4KQEAgLTkxNSw3ICs5MTUsNyBAQAogCQlyZXR1cm47CiAJfQogCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCIlcz09PT5XY2lkPSVkLlRJRD0lZCBcbiIsIF9fRlVOQ1RJT05fXywgV2NpZCwgVElEKSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCIlcz09PT5XY2lkPSVkLlRJRD0lZCBcbiIsIF9fZnVuY19fLCBXY2lkLCBUSUQpKTsKIAogCXBCQUVudHJ5ID0gJnBBZC0+QkFUYWJsZS5CQU9yaUVudHJ5W0lkeF07CiAJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJcdD09PT5JZHggPSAlbGQsIFdjaWQ9JWQuVElEPSVkLCBPUklfQkFfU3RhdHVzID0gJWQgXG4iLCBJZHgsIFdjaWQsIFRJRCwgcEJBRW50cnktPk9SSV9CQV9TdGF0dXMpKTsKQEAgLTk3NCw3ICs5NzQsNyBAQAogCWlmIChJZHggPT0gMCkKIAkJcmV0dXJuOwogCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCIlcz09PT5XY2lkPSVkLlRJRD0lZCBcbiIsIF9fRlVOQ1RJT05fXywgV2NpZCwgVElEKSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCIlcz09PT5XY2lkPSVkLlRJRD0lZCBcbiIsIF9fZnVuY19fLCBXY2lkLCBUSUQpKTsKIAogCiAJcEJBRW50cnkgPSAmcEFkLT5CQVRhYmxlLkJBUmVjRW50cnlbSWR4XTsKQEAgLTExODUsNyArMTE4NSw3IEBACiAJUFVMT05HICAgICAgcHRlbXA7CiAJUE1BQ19UQUJMRV9FTlRSWQlwTWFjRW50cnk7CiAKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlcyA9PT4gKFdjaWQgPSAlZClcbiIsIF9fRlVOQ1RJT05fXywgRWxlbS0+V2NpZCkpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzID09PiAoV2NpZCA9ICVkKVxuIiwgX19mdW5jX18sIEVsZW0tPldjaWQpKTsKIAogCS8vaGV4X2R1bXAoIkFkZEJBUmVxIiwgRWxlbS0+TXNnLCBFbGVtLT5Nc2dMZW4pOwogCkBAIC0xMjY5LDcgKzEyNjksNyBAQAogCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgUUlEX0FDX0JFLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7CiAJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKIAotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzKCVkKTogVElEKCVkKSwgQnVmU2l6ZSglZCkgPD09IFxuIiwgX19GVU5DVElPTl9fLCBFbGVtLT5XY2lkLCBBRERmcmFtZS5CYVBhcm0uVElELAorCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzKCVkKTogVElEKCVkKSwgQnVmU2l6ZSglZCkgPD09IFxuIiwgX19mdW5jX18sIEVsZW0tPldjaWQsIEFERGZyYW1lLkJhUGFybS5USUQsCiAJCQkJCQkJICBBRERmcmFtZS5CYVBhcm0uQnVmU2l6ZSkpOwogfQogCkBAIC0xMjg4LDcgKzEyODgsNyBAQAogCWlmIChFbGVtLT5XY2lkID49IE1BWF9MRU5fT0ZfTUFDX1RBQkxFKQogCQlyZXR1cm47CiAKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlcyA9PT4gV2NpZCglZClcbiIsIF9fRlVOQ1RJT05fXywgRWxlbS0+V2NpZCkpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzID09PiBXY2lkKCVkKVxuIiwgX19mdW5jX18sIEVsZW0tPldjaWQpKTsKIAogCS8vaGV4X2R1bXAoIlBlZXJBZGRCQVJzcEFjdGlvbigpIiwgRWxlbS0+TXNnLCBFbGVtLT5Nc2dMZW4pOwogCkBAIC0xMzI5LDcgKzEzMjksNyBAQAogCS8vUFVDSEFSCQkJCXBPdXRCdWZmZXIgPSBOVUxMOwogCVBGUkFNRV9ERUxCQV9SRVEgICAgcERlbEZyYW1lID0gTlVMTDsKIAotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiJXMgPT0+XG4iLCBfX0ZVTkNUSU9OX18pKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIiVzID09PlxuIiwgX19mdW5jX18pKTsKIAkvL0RFTEJBIFJlcXVlc3QgZnJvbSB1bmtub3duIHBlZXIsIGlnbm9yZSB0aGlzLgogCWlmIChQZWVyRGVsQkFBY3Rpb25TYW5pdHkocEFkLCBFbGVtLT5XY2lkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbikpCiAJewpAQCAtMTM2Niw3ICsxMzY2LDcgQEAKIAogCVRJRCA9IChVQ0hBUilwRnJhbWUtPkJBUkNvbnRyb2wuVElEOwogCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXMoKTogQkFSLVdjaWQoJWxkKSwgVGlkICglZClcbiIsIF9fRlVOQ1RJT05fXywgV2NpZCwgVElEKSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXMoKTogQkFSLVdjaWQoJWxkKSwgVGlkICglZClcbiIsIF9fZnVuY19fLCBXY2lkLCBUSUQpKTsKIAkvL2hleF9kdW1wKCJCQVIiLCAoUENIQVIpIHBGcmFtZSwgTXNnTGVuKTsKIAkvLyBEbyBub3RoaW5nIGlmIHRoZSBkcml2ZXIgaXMgc3RhcnRpbmcgaGFsdCBzdGF0ZS4KIAkvLyBUaGlzIG1pZ2h0IGhhcHBlbiB3aGVuIHRpbWVyIGFscmVhZHkgYmVlbiBmaXJlZCBiZWZvcmUgY2FuY2VsIHRpbWVyIHdpdGggbWxtZWhhbHQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2NtbV9kYXRhLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9jbW1fZGF0YS5jCmluZGV4IGFjNTQ5MDEuLmI2N2I5ZWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2NtbV9kYXRhLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vY21tX2RhdGEuYwpAQCAtMjc4Nyw3ICsyNzg3LDcgQEAKIAkJfQogCQllbHNlCiAJCXsKLQkJCXByaW50aygiXG4lczogSW1wb3NzaWJsZSBXY2lkID0gJWQgISEhISFcbiIsIF9fRlVOQ1RJT05fXywgd2NpZCk7CisJCQlwcmludGsoIlxuJXM6IEltcG9zc2libGUgV2NpZCA9ICVkICEhISEhXG4iLCBfX2Z1bmNfXywgd2NpZCk7CiAJCX0KIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2NtbV9kYXRhXzI4NjAuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2NtbV9kYXRhXzI4NjAuYwppbmRleCA0ZjQxNGVkLi40MTllNTBjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9jbW1fZGF0YV8yODYwLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vY21tX2RhdGFfMjg2MC5jCkBAIC0xMDAyLDcgKzEwMDIsNyBAQAogICAgICAgICBBdXRvV2FrZXVwQ2ZnLmZpZWxkLkF1dG9MZWFkVGltZSA9IDU7CiAgICAgICAgIFJUTVBfSU9fV1JJVEUzMihwQWQsIEFVVE9fV0FLRVVQX0NGRywgQXV0b1dha2V1cENmZy53b3JkKTsKICAgICAgICAgQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDMwLCAweGZmLCAweGZmLCAweDAwKTsgICAvLyBzZW5kIFBPV0VSLVNBVkUgY29tbWFuZCB0byBNQ1UuIFRpbWVvdXQgNDB1cy4KLSAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPC0tICVzLCBUYnR0TnVtVG9OZXh0V2FrZVVwPSVkIFxuIiwgX19GVU5DVElPTl9fLCBUYnR0TnVtVG9OZXh0V2FrZVVwKSk7CisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjwtLSAlcywgVGJ0dE51bVRvTmV4dFdha2VVcD0lZCBcbiIsIF9fZnVuY19fLCBUYnR0TnVtVG9OZXh0V2FrZVVwKSk7CiAgICAgfQogICAgIE9QU1RBVFVTX1NFVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKTsKIH0KQEAgLTExMTUsNyArMTExNSw3IEBACiAgICAgaWYgKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkFESU9fT0ZGKSkKICAgIAkJcmV0dXJuOwogCi0gICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCIlcz09PT5cbiIsIF9fRlVOQ1RJT05fXykpOworICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiJXM9PT0+XG4iLCBfX2Z1bmNfXykpOwogCiAgICAgaWYgKChwQWQtPk9wTW9kZSA9PSBPUE1PREVfQVApIHx8CiAgICAgICAgICgocEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkgJiYgKCFPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0FEVkFOQ0VfUE9XRVJfU0FWRV9QQ0lFX0RFVklDRSkpKSkKQEAgLTExNjUsNyArMTE2NSw3IEBACiAgICAgaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SQURJT19PRkYpKQogICAgIAlyZXR1cm47CiAKLSAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIiVzPT09PlxuIiwgX19GVU5DVElPTl9fKSk7CisgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCIlcz09PT5cbiIsIF9fZnVuY19fKSk7CiAKIAkvLyBTZXQgTEVECiAJUlRNUFNldExFRChwQWQsIExFRF9SQURJT19PRkYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vY21tX2luZm8uYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2NtbV9pbmZvLmMKaW5kZXggMGFhZGY4YS4uZGQ5MmFjNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vY21tX2luZm8uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9jbW1faW5mby5jCkBAIC0yMDM5LDcgKzIwMzksNyBAQAogCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihSVF84MDJfMTFfTUFDX1RBQkxFKTsKIAlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZNYWNUYWIsIHdycS0+dS5kYXRhLmxlbmd0aCkpCiAJewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczogY29weV90b191c2VyKCkgZmFpbFxuIiwgX19GVU5DVElPTl9fKSk7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOiBjb3B5X3RvX3VzZXIoKSBmYWlsXG4iLCBfX2Z1bmNfXykpOwogCX0KIAogCW1zZyA9IChDSEFSICopIGttYWxsb2Moc2l6ZW9mKENIQVIpKihNQVhfTEVOX09GX01BQ19UQUJMRSpNQUNfTElORV9MRU4pLCBNRU1fQUxMT0NfRkxBRyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9kZnMuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2Rmcy5jCmluZGV4IDIzY2YxNTEuLmIwOWJiYTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2Rmcy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2Rmcy5jCkBAIC00MjgsNyArNDI4LDcgQEAKIAogCXBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LkNoTW92aW5nVGltZSA9IFZhbHVlOwogCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OiAlZFxuIiwgX19GVU5DVElPTl9fLAorCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjogJWRcbiIsIF9fZnVuY19fLAogCQlwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5DaE1vdmluZ1RpbWUpKTsKIAogCXJldHVybiBUUlVFOwpAQCAtNDQ0LDcgKzQ0NCw3IEBACiAKIAlwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5Mb25nUHVsc2VSYWRhclRoID0gVmFsdWU7CiAKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6ICVkXG4iLCBfX0ZVTkNUSU9OX18sCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OiAlZFxuIiwgX19mdW5jX18sCiAJCXBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LkxvbmdQdWxzZVJhZGFyVGgpKTsKIAogCXJldHVybiBUUlVFOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vcnRtcF9pbml0LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9ydG1wX2luaXQuYwppbmRleCA4NGVkZmE1Li41NjNmMmM1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9ydG1wX2luaXQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9ydG1wX2luaXQuYwpAQCAtMjU0Miw3ICsyNTQyLDcgQEAKICNpZmRlZiBCSU5fSU5fRklMRQogI2RlZmluZSBOSUNMRl9ERUZBVUxUX1VTRSgpCVwKIAlmbGdfZGVmYXVsdF9maXJtX3VzZSA9IFRSVUU7IFwKLQlwcmludGsoIiVzIC0gVXNlIGRlZmF1bHQgZmlybXdhcmUhXG4iLCBfX0ZVTkNUSU9OX18pOworCXByaW50aygiJXMgLSBVc2UgZGVmYXVsdCBmaXJtd2FyZSFcbiIsIF9fZnVuY19fKTsKIAogCU5ESVNfU1RBVFVTCQlTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOwogCVBVQ0hBUgkJCXNyYzsKQEAgLTI1NTcsNyArMjU1Nyw3IEBACiAJQk9PTEVBTgkJCWZsZ19kZWZhdWx0X2Zpcm1fdXNlID0gRkFMU0U7CiAKIAotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT4gJXNcbiIsIF9fRlVOQ1RJT05fXykpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT4gJXNcbiIsIF9fZnVuY19fKSk7CiAKIAkvKiBpbml0ICovCiAJcEZpcm13YXJlSW1hZ2UgPSBOVUxMOwpAQCAtMjU4MCw3ICsyNTgwLDcgQEAKICAgICBpZiAocEZpcm13YXJlSW1hZ2UgPT0gTlVMTCkKIAl7CiAJCS8qIGFsbG9jYXRlIGZhaWwsIHVzZSBkZWZhdWx0IGZpcm13YXJlIGFycmF5IGluIGZpcm13YXJlLmggKi8KLQkJcHJpbnRrKCIlcyAtIEFsbG9jYXRlIG1lbW9yeSBmYWlsIVxuIiwgX19GVU5DVElPTl9fKTsKKwkJcHJpbnRrKCIlcyAtIEFsbG9jYXRlIG1lbW9yeSBmYWlsIVxuIiwgX19mdW5jX18pOwogCQlOSUNMRl9ERUZBVUxUX1VTRSgpOwogICAgIH0KIAllbHNlCkBAIC0yNjAxLDcgKzI2MDEsNyBAQAogCQkJaWYgKElTX0VSUihzcmNmKSkKIAkJCXsKIAkJCQlwcmludGsoIiVzIC0gRXJyb3IgJWxkIG9wZW5pbmcgJXNcbiIsCi0JCQkJCSAgIF9fRlVOQ1RJT05fXywgLVBUUl9FUlIoc3JjZiksIHNyYyk7CisJCQkJCSAgIF9fZnVuY19fLCAtUFRSX0VSUihzcmNmKSwgc3JjKTsKIAkJCQlOSUNMRl9ERUZBVUxUX1VTRSgpOwogCQkJCWJyZWFrOwogCQkJfSAvKiBFbmQgb2YgaWYgKi8KQEAgLTI2MDksNyArMjYwOSw3IEBACiAJCQkvKiB0aGUgb2JqZWN0IG11c3QgaGF2ZSBhIHJlYWQgbWV0aG9kICovCiAJCQlpZiAoKHNyY2YtPmZfb3AgPT0gTlVMTCkgfHwgKHNyY2YtPmZfb3AtPnJlYWQgPT0gTlVMTCkpCiAJCQl7Ci0JCQkJcHJpbnRrKCIlcyAtICVzIGRvZXMgbm90IGhhdmUgYSB3cml0ZSBtZXRob2RcbiIsIF9fRlVOQ1RJT05fXywgc3JjKTsKKwkJCQlwcmludGsoIiVzIC0gJXMgZG9lcyBub3QgaGF2ZSBhIHdyaXRlIG1ldGhvZFxuIiwgX19mdW5jX18sIHNyYyk7CiAJCQkJTklDTEZfREVGQVVMVF9VU0UoKTsKIAkJCQlicmVhazsKIAkJCX0gLyogRW5kIG9mIGlmICovCkBAIC0yNjIzLDcgKzI2MjMsNyBAQAogCQkJaWYgKEZpbGVMZW5ndGggIT0gTUFYX0ZJUk1XQVJFX0lNQUdFX1NJWkUpCiAJCQl7CiAJCQkJcHJpbnRrKCIlczogZXJyb3IgZmlsZSBsZW5ndGggKD0lZCkgaW4gUlQyODYwQVAuQklOXG4iLAotCQkJCQkgICBfX0ZVTkNUSU9OX18sIEZpbGVMZW5ndGgpOworCQkJCQkgICBfX2Z1bmNfXywgRmlsZUxlbmd0aCk7CiAJCQkJTklDTEZfREVGQVVMVF9VU0UoKTsKIAkJCQlicmVhazsKIAkJCX0KQEAgLTI2NDYsNyArMjY0Niw3IEBACiAJCQkJCS8qIENSQyBmYWlsICovCiAJCQkJCXByaW50aygiJXM6IENSQyA9IDB4JTAyeCAweCUwMnggIgogCQkJCQkJICAgImVycm9yLCBzaG91bGQgYmUgMHglMDJ4IDB4JTAyeFxuIiwKLQkJCQkJCSAgIF9fRlVOQ1RJT05fXywKKwkJCQkJCSAgIF9fZnVuY19fLAogCQkJCQkJICAgcEZpcm13YXJlSW1hZ2VbTUFYX0ZJUk1XQVJFX0lNQUdFX1NJWkUtMl0sCiAJCQkJCQkgICBwRmlybXdhcmVJbWFnZVtNQVhfRklSTVdBUkVfSU1BR0VfU0laRS0xXSwKIAkJCQkJCSAgIChVQ0hBUikoY3JjPj44KSwgKFVDSEFSKShjcmMpKTsKQEAgLTI2NjUsNyArMjY2NSw3IEBACiAJCQkJCQkJCQkJCSgoRklSTVdBUkVfTUFKT1JfVkVSU0lPTiA8PCA4KSArCiAJCQkJCQkJCQkgIAkgCSBGSVJNV0FSRV9NSU5PUl9WRVJTSU9OKSkKIAkJCQkJewotCQkJCQkJcHJpbnRrKCIlczogZmlybXdhcmUgdmVyc2lvbiB0b28gb2xkIVxuIiwgX19GVU5DVElPTl9fKTsKKwkJCQkJCXByaW50aygiJXM6IGZpcm13YXJlIHZlcnNpb24gdG9vIG9sZCFcbiIsIF9fZnVuY19fKTsKIAkJCQkJCU5JQ0xGX0RFRkFVTFRfVVNFKCk7CiAJCQkJCQlicmVhazsKIAkJCQkJfSAvKiBFbmQgb2YgaWYgKi8KQEAgLTI3NzAsNyArMjc3MCw3IEBACiAJfSAvKiBFbmQgb2YgaWYgKi8KIAogICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAotCQkJICgiPD09PSAlcyAoc3RhdHVzPSVkKVxuIiwgX19GVU5DVElPTl9fLCBTdGF0dXMpKTsKKwkJCSAoIjw9PT0gJXMgKHN0YXR1cz0lZClcbiIsIF9fZnVuY19fLCBTdGF0dXMpKTsKICAgICByZXR1cm4gU3RhdHVzOwogfSAvKiBFbmQgb2YgTklDTG9hZEZpcm13YXJlICovCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL3NwZWN0cnVtLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9zcGVjdHJ1bS5jCmluZGV4IDg1ZTYzNmEuLjAyNjVhNmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL3NwZWN0cnVtLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vc3BlY3RydW0uYwpAQCAtNDksNyArNDksNyBAQAogCWlmIChwQWQtPkNvbW1vbkNmZy5wTWVhc3VyZVJlcVRhYikKIAkJTmRpc1plcm9NZW1vcnkocEFkLT5Db21tb25DZmcucE1lYXN1cmVSZXFUYWIsIHNpemVvZihNRUFTVVJFX1JFUV9UQUIpKTsKIAllbHNlCi0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzIEZhaWwgdG8gYWxsb2MgbWVtb3J5IGZvciBwQWQtPkNvbW1vbkNmZy5wTWVhc3VyZVJlcVRhYi5cbiIsIF9fRlVOQ1RJT05fXykpOworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlcyBGYWlsIHRvIGFsbG9jIG1lbW9yeSBmb3IgcEFkLT5Db21tb25DZmcucE1lYXN1cmVSZXFUYWIuXG4iLCBfX2Z1bmNfXykpOwogCiAJcmV0dXJuOwogfQpAQCAtNzcsNyArNzcsNyBAQAogCiAJaWYgKHBUYWIgPT0gTlVMTCkKIAl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzOiBwTWVhc3VyZVJlcVRhYiBkb2Vzbid0IGV4aXN0LlxuIiwgX19GVU5DVElPTl9fKSk7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzOiBwTWVhc3VyZVJlcVRhYiBkb2Vzbid0IGV4aXN0LlxuIiwgX19mdW5jX18pKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQogCkBAIC0xMTQsNyArMTE0LDcgQEAKIAogCWlmKHBUYWIgPT0gTlVMTCkKIAl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzOiBwTWVhc3VyZVJlcVRhYiBkb2Vzbid0IGV4aXN0LlxuIiwgX19GVU5DVElPTl9fKSk7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzOiBwTWVhc3VyZVJlcVRhYiBkb2Vzbid0IGV4aXN0LlxuIiwgX19mdW5jX18pKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQogCkBAIC0xNzUsNyArMTc1LDcgQEAKIAkJZWxzZQogCQl7CiAJCQlwRW50cnkgPSBOVUxMOwotCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXM6IHBNZWFzdXJlUmVxVGFiIHRhYiBmdWxsLlxuIiwgX19GVU5DVElPTl9fKSk7CisJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlczogcE1lYXN1cmVSZXFUYWIgdGFiIGZ1bGwuXG4iLCBfX2Z1bmNfXykpOwogCQl9CiAKIAkJLy8gYWRkIHRoaXMgTmVpZ2hib3IgZW50cnkgaW50byBIQVNIIHRhYmxlCkBAIC0yMTAsNyArMjEwLDcgQEAKIAogCWlmKHBUYWIgPT0gTlVMTCkKIAl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzOiBwTWVhc3VyZVJlcVRhYiBkb2Vzbid0IGV4aXN0LlxuIiwgX19GVU5DVElPTl9fKSk7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzOiBwTWVhc3VyZVJlcVRhYiBkb2Vzbid0IGV4aXN0LlxuIiwgX19mdW5jX18pKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtMjY3LDcgKzI2Nyw3IEBACiAJaWYgKHBBZC0+Q29tbW9uQ2ZnLnBUcGNSZXFUYWIpCiAJCU5kaXNaZXJvTWVtb3J5KHBBZC0+Q29tbW9uQ2ZnLnBUcGNSZXFUYWIsIHNpemVvZihUUENfUkVRX1RBQikpOwogCWVsc2UKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXMgRmFpbCB0byBhbGxvYyBtZW1vcnkgZm9yIHBBZC0+Q29tbW9uQ2ZnLnBUcGNSZXFUYWIuXG4iLCBfX0ZVTkNUSU9OX18pKTsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXMgRmFpbCB0byBhbGxvYyBtZW1vcnkgZm9yIHBBZC0+Q29tbW9uQ2ZnLnBUcGNSZXFUYWIuXG4iLCBfX2Z1bmNfXykpOwogCiAJcmV0dXJuOwogfQpAQCAtMjk1LDcgKzI5NSw3IEBACiAKIAlpZiAocFRhYiA9PSBOVUxMKQogCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXM6IHBUcGNSZXFUYWIgZG9lc24ndCBleGlzdC5cbiIsIF9fRlVOQ1RJT05fXykpOworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlczogcFRwY1JlcVRhYiBkb2Vzbid0IGV4aXN0LlxuIiwgX19mdW5jX18pKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQogCkBAIC0zMzMsNyArMzMzLDcgQEAKIAogCWlmKHBUYWIgPT0gTlVMTCkKIAl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzOiBwVHBjUmVxVGFiIGRvZXNuJ3QgZXhpc3QuXG4iLCBfX0ZVTkNUSU9OX18pKTsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXM6IHBUcGNSZXFUYWIgZG9lc24ndCBleGlzdC5cbiIsIF9fZnVuY19fKSk7CiAJCXJldHVybiBOVUxMOwogCX0KIApAQCAtMzk0LDcgKzM5NCw3IEBACiAJCWVsc2UKIAkJewogCQkJcEVudHJ5ID0gTlVMTDsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzOiBwVHBjUmVxVGFiIHRhYiBmdWxsLlxuIiwgX19GVU5DVElPTl9fKSk7CisJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlczogcFRwY1JlcVRhYiB0YWIgZnVsbC5cbiIsIF9fZnVuY19fKSk7CiAJCX0KIAogCQkvLyBhZGQgdGhpcyBOZWlnaGJvciBlbnRyeSBpbnRvIEhBU0ggdGFibGUKQEAgLTQyOSw3ICs0MjksNyBAQAogCiAJaWYocFRhYiA9PSBOVUxMKQogCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXM6IHBUcGNSZXFUYWIgZG9lc24ndCBleGlzdC5cbiIsIF9fRlVOQ1RJT05fXykpOworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlczogcFRwY1JlcVRhYiBkb2Vzbid0IGV4aXN0LlxuIiwgX19mdW5jX18pKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtNzgyLDcgKzc4Miw3IEBACiAJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsIChQVk9JRCkmcE91dEJ1ZmZlcik7ICAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5CiAJaWYoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQogCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXMoKSBhbGxvY2F0ZSBtZW1vcnkgZmFpbGVkIFxuIiwgX19GVU5DVElPTl9fKSk7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzKCkgYWxsb2NhdGUgbWVtb3J5IGZhaWxlZCBcbiIsIF9fZnVuY19fKSk7CiAJCXJldHVybjsKIAl9CiAJTmRpc01vdmVNZW1vcnkocE91dEJ1ZmZlciwgKFBDSEFSKSZBY3RIZHIsIHNpemVvZihIRUFERVJfODAyXzExKSk7CkBAIC04NDQsNyArODQ0LDcgQEAKIAlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgKFBWT0lEKSZwT3V0QnVmZmVyKTsgIC8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKIAlpZihOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCiAJewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlcygpIGFsbG9jYXRlIG1lbW9yeSBmYWlsZWQgXG4iLCBfX0ZVTkNUSU9OX18pKTsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXMoKSBhbGxvY2F0ZSBtZW1vcnkgZmFpbGVkIFxuIiwgX19mdW5jX18pKTsKIAkJcmV0dXJuOwogCX0KIAlOZGlzTW92ZU1lbW9yeShwT3V0QnVmZmVyLCAoUENIQVIpJkFjdEhkciwgc2l6ZW9mKEhFQURFUl84MDJfMTEpKTsKQEAgLTg5OCw3ICs4OTgsNyBAQAogCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAoUFZPSUQpJnBPdXRCdWZmZXIpOyAgLy9HZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeQogCWlmKE5TdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKIAl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzKCkgYWxsb2NhdGUgbWVtb3J5IGZhaWxlZCBcbiIsIF9fRlVOQ1RJT05fXykpOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlcygpIGFsbG9jYXRlIG1lbW9yeSBmYWlsZWQgXG4iLCBfX2Z1bmNfXykpOwogCQlyZXR1cm47CiAJfQogCU5kaXNNb3ZlTWVtb3J5KHBPdXRCdWZmZXIsIChQQ0hBUikmQWN0SGRyLCBzaXplb2YoSEVBREVSXzgwMl8xMSkpOwpAQCAtOTUwLDcgKzk1MCw3IEBACiAJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsIChQVk9JRCkmcE91dEJ1ZmZlcik7ICAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5CiAJaWYoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQogCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXMoKSBhbGxvY2F0ZSBtZW1vcnkgZmFpbGVkIFxuIiwgX19GVU5DVElPTl9fKSk7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzKCkgYWxsb2NhdGUgbWVtb3J5IGZhaWxlZCBcbiIsIF9fZnVuY19fKSk7CiAJCXJldHVybjsKIAl9CiAJTmRpc01vdmVNZW1vcnkocE91dEJ1ZmZlciwgKFBDSEFSKSZBY3RIZHIsIHNpemVvZihIRUFERVJfODAyXzExKSk7CkBAIC0xMDAzLDcgKzEwMDMsNyBAQAogCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAoUFZPSUQpJnBPdXRCdWZmZXIpOyAgLy9HZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeQogCWlmKE5TdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKIAl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzKCkgYWxsb2NhdGUgbWVtb3J5IGZhaWxlZCBcbiIsIF9fRlVOQ1RJT05fXykpOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlcygpIGFsbG9jYXRlIG1lbW9yeSBmYWlsZWQgXG4iLCBfX2Z1bmNfXykpOwogCQlyZXR1cm47CiAJfQogCU5kaXNNb3ZlTWVtb3J5KHBPdXRCdWZmZXIsIChQQ0hBUikmQWN0SGRyLCBzaXplb2YoSEVBREVSXzgwMl8xMSkpOwpAQCAtMTU5Niw3ICsxNTk2LDcgQEAKIAogCWlmICgocE1lYXN1cmVSZXBvcnRJbmZvID0ga21hbGxvYyhzaXplb2YoTUVBU1VSRV9SUElfUkVQT1JUKSwgR0ZQX0FUT01JQykpID09IE5VTEwpCiAJewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlcyB1bmFibGUgdG8gYWxsb2MgbWVtb3J5IGZvciBtZWFzdXJlIHJlcG9ydCBidWZmZXIgKHNpemU9JWQpLlxuIiwgX19GVU5DVElPTl9fLCBzaXplb2YoTUVBU1VSRV9SUElfUkVQT1JUKSkpOworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlcyB1bmFibGUgdG8gYWxsb2MgbWVtb3J5IGZvciBtZWFzdXJlIHJlcG9ydCBidWZmZXIgKHNpemU9JWQpLlxuIiwgX19mdW5jX18sIHNpemVvZihNRUFTVVJFX1JQSV9SRVBPUlQpKSk7CiAJCXJldHVybjsKIAl9CiAKQEAgLTE3MDUsNyArMTcwNSw3IEBACiAJCXsKIAkJCVRwY1JlcURlbGV0ZShwQWQsIHBFbnRyeS0+RGlhbG9nVG9rZW4pOwogCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6IERpYWxvZ1Rva2VuPSV4LCBUeFB3cj0lZCwgTGlua01hcmdpbj0lZFxuIiwKLQkJCQlfX0ZVTkNUSU9OX18sIERpYWxvZ1Rva2VuLCBUcGNSZXBJbmZvLlR4UHdyLCBUcGNSZXBJbmZvLkxpbmtNYXJnaW4pKTsKKwkJCQlfX2Z1bmNfXywgRGlhbG9nVG9rZW4sIFRwY1JlcEluZm8uVHhQd3IsIFRwY1JlcEluZm8uTGlua01hcmdpbikpOwogCQl9CiAJfQogCkBAIC0xODIxLDcgKzE4MjEsNyBAQAogCQkJCU1lYXN1cmVSZXFUeXBlID0gc2ltcGxlX3N0cnRvbCh0aGlzQ2hhciwgMCwgMTYpOwogCQkJCWlmIChNZWFzdXJlUmVxVHlwZSA+IDMpCiAJCQkJewotCQkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlczogdW5rbm93IE1lYXN1cmVSZXFUeXBlKCVkKVxuIiwgX19GVU5DVElPTl9fLCBNZWFzdXJlUmVxVHlwZSkpOworCQkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlczogdW5rbm93IE1lYXN1cmVSZXFUeXBlKCVkKVxuIiwgX19mdW5jX18sIE1lYXN1cmVSZXFUeXBlKSk7CiAJCQkJCXJldHVybiBUUlVFOwogCQkJCX0KIAkJCQlicmVhazsKQEAgLTE4MzMsMTAgKzE4MzMsMTAgQEAKIAkJQXJnSWR4Kys7CiAJfQogCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OkFpZCA9ICVkLCBNZWFzdXJlUmVxVHlwZT0lZCBNZWFzdXJlQ2g9JWRcbiIsIF9fRlVOQ1RJT05fXywgQWlkLCBNZWFzdXJlUmVxVHlwZSwgTWVhc3VyZUNoKSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OkFpZCA9ICVkLCBNZWFzdXJlUmVxVHlwZT0lZCBNZWFzdXJlQ2g9JWRcbiIsIF9fZnVuY19fLCBBaWQsIE1lYXN1cmVSZXFUeXBlLCBNZWFzdXJlQ2gpKTsKIAlpZiAoIVZBTElEX1dDSUQoQWlkKSkKIAl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzOiB1bmtub3cgc3RhIG9mIEFpZCglZClcbiIsIF9fRlVOQ1RJT05fXywgQWlkKSk7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzOiB1bmtub3cgc3RhIG9mIEFpZCglZClcbiIsIF9fZnVuY19fLCBBaWQpKTsKIAkJcmV0dXJuIFRSVUU7CiAJfQogCkBAIC0xODYxLDEwICsxODYxLDEwIEBACiAKIAlBaWQgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTYpOwogCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OkFpZCA9ICVkXG4iLCBfX0ZVTkNUSU9OX18sIEFpZCkpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjpBaWQgPSAlZFxuIiwgX19mdW5jX18sIEFpZCkpOwogCWlmICghVkFMSURfV0NJRChBaWQpKQogCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXM6IHVua25vdyBzdGEgb2YgQWlkKCVkKVxuIiwgX19GVU5DVElPTl9fLCBBaWQpKTsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXM6IHVua25vdyBzdGEgb2YgQWlkKCVkKVxuIiwgX19mdW5jX18sIEFpZCkpOwogCQlyZXR1cm4gVFJVRTsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnRfYXRlLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0X2F0ZS5jCmluZGV4IDJmMDdkYjUuLmYzMzE2ZWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnRfYXRlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydF9hdGUuYwpAQCAtMjkxLDcgKzI5MSw3IEBACiAJCQkJQmJwOTQgPSBCQlBSOTRfREVGQVVMVDsKIAkJCX0KIAotCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXMgKFR4UG93ZXI9JWQsIFI9JWxkLCBCQlBfUjk0PSVkKVxuIiwgX19GVU5DVElPTl9fLCBUeFBvd2VyLCBSLCBCYnA5NCkpOworCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXMgKFR4UG93ZXI9JWQsIFI9JWxkLCBCQlBfUjk0PSVkKVxuIiwgX19mdW5jX18sIFR4UG93ZXIsIFIsIEJicDk0KSk7CiAJCX0KIAkJZWxzZS8vIDUuNSBHSHoKIAkJewpAQCAtMzE4LDcgKzMxOCw3IEBACiAJCQkJUiA9IChVTE9ORykgVHhQb3dlcjsKIAkJCX0KIAotCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXMgKFR4UG93ZXI9JWQsIFI9JWx1KVxuIiwgX19GVU5DVElPTl9fLCBUeFBvd2VyLCBSKSk7CisJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlcyAoVHhQb3dlcj0lZCwgUj0lbHUpXG4iLCBfX2Z1bmNfXywgVHhQb3dlciwgUikpOwogCQl9CiAKIAkJaWYgKHBBZC0+YXRlLkNoYW5uZWwgPD0gMTQpCkBAIC00MzEsNyArNDMxLDcgQEAKIAkJQmJwOTQgPSBCQlBSOTRfREVGQVVMVDsKIAl9CiAKLQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlcyAoVHhQb3dlcj0lZCwgUjM9JWxkLCBCQlBfUjk0PSVkKVxuIiwgX19GVU5DVElPTl9fLCBUeFBvd2VyLCBSLCBCYnA5NCkpOworCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzIChUeFBvd2VyPSVkLCBSMz0lbGQsIEJCUF9SOTQ9JWQpXG4iLCBfX2Z1bmNfXywgVHhQb3dlciwgUiwgQmJwOTQpKTsKIAogCQlpZiAocEFkLT5hdGUuQ2hhbm5lbCA8PSAxNCkKIAkJewpAQCAtMjA5OCw3ICsyMDk4LDcgQEAKIAlVSU5UMzIJCQlGaWxlTGVuZ3RoID0gMDsKIAlVSU5UMzIgCQkJdmFsdWUgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOwogCi0JQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiPT09PiAlcyAodmFsdWU9JWQpXG5cbiIsIF9fRlVOQ1RJT05fXywgdmFsdWUpKTsKKwlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCI9PT0+ICVzICh2YWx1ZT0lZClcblxuIiwgX19mdW5jX18sIHZhbHVlKSk7CiAKIAlpZiAodmFsdWUgPiAwKQogCXsKQEAgLTIxMjIsMTQgKzIxMjIsMTQgQEAKIAogCQkJaWYgKElTX0VSUihzcmNmKSkKIAkJCXsKLQkJCQlhdGVfcHJpbnQoIiVzIC0gRXJyb3IgJWxkIG9wZW5pbmcgJXNcbiIsIF9fRlVOQ1RJT05fXywgLVBUUl9FUlIoc3JjZiksIHNyYyk7CisJCQkJYXRlX3ByaW50KCIlcyAtIEVycm9yICVsZCBvcGVuaW5nICVzXG4iLCBfX2Z1bmNfXywgLVBUUl9FUlIoc3JjZiksIHNyYyk7CiAJCQkJYnJlYWs7CiAJCQl9CiAKIAkJCS8qIHRoZSBvYmplY3QgbXVzdCBoYXZlIGEgcmVhZCBtZXRob2QgKi8KIAkJCWlmICgoc3JjZi0+Zl9vcCA9PSBOVUxMKSB8fCAoc3JjZi0+Zl9vcC0+cmVhZCA9PSBOVUxMKSkKIAkJCXsKLQkJCQlhdGVfcHJpbnQoIiVzIC0gJXMgZG9lcyBub3QgaGF2ZSBhIHJlYWQgbWV0aG9kXG4iLCBfX0ZVTkNUSU9OX18sIHNyYyk7CisJCQkJYXRlX3ByaW50KCIlcyAtICVzIGRvZXMgbm90IGhhdmUgYSByZWFkIG1ldGhvZFxuIiwgX19mdW5jX18sIHNyYyk7CiAJCQkJYnJlYWs7CiAJCQl9CiAKQEAgLTIxNDIsNyArMjE0Miw3IEBACiAJCQlpZiAoRmlsZUxlbmd0aCAhPSBFRVBST01fU0laRSkKIAkJCXsKIAkJCQlhdGVfcHJpbnQoIiVzOiBlcnJvciBmaWxlIGxlbmd0aCAoPSVkKSBpbiBlMnAuYmluXG4iLAotCQkJCQkgICBfX0ZVTkNUSU9OX18sIEZpbGVMZW5ndGgpOworCQkJCQkgICBfX2Z1bmNfXywgRmlsZUxlbmd0aCk7CiAJCQkJYnJlYWs7CiAJCQl9CiAJCQllbHNlCkBAIC0yMTc0LDcgKzIxNzQsNyBAQAogCQljdXJyZW50LT5mc3VpZCA9IG9yZ2ZzdWlkOwogCQljdXJyZW50LT5mc2dpZCA9IG9yZ2ZzZ2lkOwogCX0KLSAgICBBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCI8PT09ICVzIChyZXQ9JWQpXG4iLCBfX0ZVTkNUSU9OX18sIHJldCkpOworICAgIEFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIjw9PT0gJXMgKHJldD0lZClcbiIsIF9fZnVuY19fLCByZXQpKTsKIAogICAgIHJldHVybiByZXQ7CiAKQEAgLTIxODcsMTIgKzIxODcsMTIgQEAKIAlVU0hPUlQgCQkJV3JpdGVFRVBST01bKEVFUFJPTV9TSVpFLzIpXTsKIAlzdHJ1Y3QgaXdyZXEJKndycSA9IChzdHJ1Y3QgaXdyZXEgKilhcmc7CiAKLQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT0+ICVzICh3cnEtPnUuZGF0YS5sZW5ndGggPSAlZClcblxuIiwgX19GVU5DVElPTl9fLCB3cnEtPnUuZGF0YS5sZW5ndGgpKTsKKwlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT0+ICVzICh3cnEtPnUuZGF0YS5sZW5ndGggPSAlZClcblxuIiwgX19mdW5jX18sIHdycS0+dS5kYXRhLmxlbmd0aCkpOwogCiAJaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBFRVBST01fU0laRSkKIAl7CiAJCWF0ZV9wcmludCgiJXM6IGVycm9yIGxlbmd0aCAoPSVkKSBmcm9tIGhvc3RcbiIsCi0JCQkgICBfX0ZVTkNUSU9OX18sIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQkgICBfX2Z1bmNfXywgd3JxLT51LmRhdGEubGVuZ3RoKTsKIAkJcmV0dXJuIEZBTFNFOwogCX0KIAllbHNlLyogKHdycS0+dS5kYXRhLmxlbmd0aCA9PSBFRVBST01fU0laRSkgKi8KQEAgLTIyMTEsNyArMjIxMSw3IEBACiAJCX0gd2hpbGUoRkFMU0UpOwogCQl9CiAKLSAgICBBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8PT09ICVzXG4iLCBfX0ZVTkNUSU9OX18pKTsKKyAgICBBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8PT09ICVzXG4iLCBfX2Z1bmNfXykpOwogCiAgICAgcmV0dXJuIFRSVUU7CiAKQEAgLTMzNTMsNyArMzM1Myw3IEBACiAJaWYgKHBQYWNrZXQgPT0gTlVMTCkKIAl7CiAJCXBBZC0+YXRlLlR4Q291bnQgPSAwOwotCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlcyBmYWlsIHRvIGFsbG9jIHBhY2tldCBzcGFjZS5cbiIsIF9fRlVOQ1RJT05fXykpOworCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlcyBmYWlsIHRvIGFsbG9jIHBhY2tldCBzcGFjZS5cbiIsIF9fZnVuY19fKSk7CiAJCXJldHVybiAtMTsKIAl9CiAJcFR4UmluZy0+Q2VsbFtUeElkeF0ucE5leHROZGlzUGFja2V0ID0gcFBhY2tldDsKQEAgLTM2NDYsNyArMzY0Niw3IEBACiAKIAlDb21tYW5kX0lkID0gbnRvaHMocFJhQ2ZnLT5jb21tYW5kX2lkKTsKIAotCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiXG4lczogQ29tbWFuZF9JZCA9IDB4JTA0eCAhXG4iLCBfX0ZVTkNUSU9OX18sIENvbW1hbmRfSWQpKTsKKwlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlxuJXM6IENvbW1hbmRfSWQgPSAweCUwNHggIVxuIiwgX19mdW5jX18sIENvbW1hbmRfSWQpKTsKIAogCXN3aXRjaCAoQ29tbWFuZF9JZCkKIAl7CkBAIC01NjkwLDcgKzU2OTAsNyBAQAogCQkJCQlwQWQtPmF0ZS5UeEFudGVubmFTZWwgPSAyOwogCQkgICAgICAgICAgICBicmVhazsKIAkJICAgICAgICBkZWZhdWx0OgotCQkgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlcyAtLSBTdGguIHdyb25nISAgOiByZXR1cm4gRkFMU0U7IFxuIiwgX19GVU5DVElPTl9fKSk7CisJCSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzIC0tIFN0aC4gd3JvbmchICA6IHJldHVybiBGQUxTRTsgXG4iLCBfX2Z1bmNfXykpOwogCQkgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAJCSAgICB9CiAJCQlicmVhazsvKiBjYXNlIEJCUF9SMSAqLwpAQCAtNTcyOCwxMyArNTcyOCwxMyBAQAogCQkJCQlwQWQtPmF0ZS5SeEFudGVubmFTZWwgPSAzOwogCQkgICAgICAgICAgICBicmVhazsKIAkJICAgICAgICBkZWZhdWx0OgotCQkgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlcyAtLSBJbXBvc3NpYmxlISAgOiByZXR1cm4gRkFMU0U7IFxuIiwgX19GVU5DVElPTl9fKSk7CisJCSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzIC0tIEltcG9zc2libGUhICA6IHJldHVybiBGQUxTRTsgXG4iLCBfX2Z1bmNfXykpOwogCQkgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAJCSAgICB9CiAJCQlicmVhazsvKiBjYXNlIEJCUF9SMyAqLwogCiAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlcyAtLSBTdGguIHdyb25nISAgOiByZXR1cm4gRkFMU0U7IFxuIiwgX19GVU5DVElPTl9fKSk7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlcyAtLSBTdGguIHdyb25nISAgOiByZXR1cm4gRkFMU0U7IFxuIiwgX19mdW5jX18pKTsKICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKIAogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnRfbGludXguYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnRfbGludXguYwppbmRleCAzNzRjMTc0Li5mMTQ1MDA5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0X2xpbnV4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydF9saW51eC5jCkBAIC00MDYsNyArNDA2LDcgQEAKICAJc2tiX3B1dChHRVRfT1NfUEtUX1RZUEUocFBhY2tldCksIEhlYWRlckxlbitEYXRhTGVuKTsKIAogCVJUTVBfU0VUX1BBQ0tFVF9TT1VSQ0UocFBhY2tldCwgUEtUU1JDX05ESVMpOwotLy8JcHJpbnRrKCIlcyA6IHBQYWNrZXQgPSAlcCwgbGVuID0gJWRcbiIsIF9fRlVOQ1RJT05fXywgcFBhY2tldCwgR0VUX09TX1BLVF9MRU4ocFBhY2tldCkpOworLy8JcHJpbnRrKCIlcyA6IHBQYWNrZXQgPSAlcCwgbGVuID0gJWRcbiIsIF9fZnVuY19fLCBwUGFja2V0LCBHRVRfT1NfUEtUX0xFTihwUGFja2V0KSk7CiAJKnBwUGFja2V0ID0gcFBhY2tldDsKIAlyZXR1cm4gTkRJU19TVEFUVVNfU1VDQ0VTUzsKIH0KQEAgLTc3MywxMyArNzczLDEzIEBACiAKIAlpZiAoZXZlbnRfdGFibGVfbGVuID09IDApCiAJewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlcyA6IFRoZSB0eXBlKCUweDAyeCkgaXMgbm90IHZhbGlkLlxuIiwgX19GVU5DVElPTl9fLCB0eXBlKSk7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzIDogVGhlIHR5cGUoJTB4MDJ4KSBpcyBub3QgdmFsaWQuXG4iLCBfX2Z1bmNfXywgdHlwZSkpOwogCQlyZXR1cm47CiAJfQogCiAJaWYgKGV2ZW50ID49IGV2ZW50X3RhYmxlX2xlbikKIAl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzIDogVGhlIGV2ZW50KCUweDAyeCkgaXMgbm90IHZhbGlkLlxuIiwgX19GVU5DVElPTl9fLCBldmVudCkpOworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlcyA6IFRoZSBldmVudCglMHgwMngpIGlzIG5vdCB2YWxpZC5cbiIsIF9fZnVuY19fLCBldmVudCkpOwogCQlyZXR1cm47CiAJfQogCkBAIC04MTcsMTQgKzgxNywxNCBAQAogCQkvL3NlbmQgd2lyZWxlc3MgZXZlbnQKIAkgICAgd2lyZWxlc3Nfc2VuZF9ldmVudChwQWQtPm5ldF9kZXYsIElXRVZDVVNUT00sICZ3cnF1LCBwQnVmKTsKIAotCQkvL0RCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzIDogJXNcbiIsIF9fRlVOQ1RJT05fXywgcEJ1ZikpOworCQkvL0RCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzIDogJXNcbiIsIF9fZnVuY19fLCBwQnVmKSk7CiAKIAkJa2ZyZWUocEJ1Zik7CiAJfQogCWVsc2UKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXMgOiBDYW4ndCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHdpcmVsZXNzIGV2ZW50LlxuIiwgX19GVU5DVElPTl9fKSk7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzIDogQ2FuJ3QgYWxsb2NhdGUgbWVtb3J5IGZvciB3aXJlbGVzcyBldmVudC5cbiIsIF9fZnVuY19fKSk7CiAjZWxzZQotCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzIDogVGhlIFdpcmVsZXNzIEV4dGVuc2lvbiBNVVNUIGJlIHYxNSBvciBuZXdlci5cbiIsIF9fRlVOQ1RJT05fXykpOworCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzIDogVGhlIFdpcmVsZXNzIEV4dGVuc2lvbiBNVVNUIGJlIHYxNSBvciBuZXdlci5cbiIsIF9fZnVuY19fKSk7CiAjZW5kaWYgIC8qIFdJUkVMRVNTX0VYVCA+PSAxNSAqLwogfQogCkBAIC04NDgsMTMgKzg0OCwxMyBAQAogICAgIEFTU0VSVChwUnhCbGstPnBSeFBhY2tldCk7CiAgICAgaWYgKHBSeEJsay0+RGF0YVNpemUgPCAxMCkKICAgICB7Ci0gICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzIDogU2l6ZSBpcyB0b28gc21hbGwhICglZClcbiIsIF9fRlVOQ1RJT05fXywgcFJ4QmxrLT5EYXRhU2l6ZSkpOworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlcyA6IFNpemUgaXMgdG9vIHNtYWxsISAoJWQpXG4iLCBfX2Z1bmNfXywgcFJ4QmxrLT5EYXRhU2l6ZSkpOwogCQlnb3RvIGVycl9mcmVlX3NrX2J1ZmY7CiAgICAgfQogCiAgICAgaWYgKHBSeEJsay0+RGF0YVNpemUgKyBzaXplb2Yod2xhbl9uZ19wcmlzbTJfaGVhZGVyKSA+IFJYX0JVRkZFUl9BR0dSRVNJWkUpCiAgICAgewotICAgICAgICBEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlcyA6IFNpemUgaXMgdG9vIGxhcmdlISAoJWQpXG4iLCBfX0ZVTkNUSU9OX18sIHBSeEJsay0+RGF0YVNpemUgKyBzaXplb2Yod2xhbl9uZ19wcmlzbTJfaGVhZGVyKSkpOworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlcyA6IFNpemUgaXMgdG9vIGxhcmdlISAoJWQpXG4iLCBfX2Z1bmNfXywgcFJ4QmxrLT5EYXRhU2l6ZSArIHNpemVvZih3bGFuX25nX3ByaXNtMl9oZWFkZXIpKSk7CiAJCWdvdG8gZXJyX2ZyZWVfc2tfYnVmZjsKICAgICB9CiAKQEAgLTkxMCw3ICs5MTAsNyBAQAogCiAgICAgaWYgKHNrYl9oZWFkcm9vbShwT1NQa3QpIDwgKHNpemVvZih3bGFuX25nX3ByaXNtMl9oZWFkZXIpKyBoZWFkZXJfbGVuKSkgewogICAgICAgICBpZiAocHNrYl9leHBhbmRfaGVhZChwT1NQa3QsIChzaXplb2Yod2xhbl9uZ19wcmlzbTJfaGVhZGVyKSArIGhlYWRlcl9sZW4pLCAwLCBHRlBfQVRPTUlDKSkgewotCSAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXMgOiBSZWFsbG9jYXRlIGhlYWRlciBzaXplIG9mIHNrX2J1ZmYgZmFpbCFcbiIsIF9fRlVOQ1RJT05fXykpOworCSAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXMgOiBSZWFsbG9jYXRlIGhlYWRlciBzaXplIG9mIHNrX2J1ZmYgZmFpbCFcbiIsIF9fZnVuY19fKSk7CiAJCQlnb3RvIGVycl9mcmVlX3NrX2J1ZmY7CiAJICAgIH0gLy9lbmQgaWYKICAgICB9IC8vZW5kIGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0X2xpbnV4LmggYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0X2xpbnV4LmgKaW5kZXggMGNjN2NmMi4uMGZkNThmNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydF9saW51eC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnRfbGludXguaApAQCAtMTMxLDcgKzEzMSw3IEBACiAjZGVmaW5lIFJUX01PRF9JTkNfVVNFX0NPVU5UKCkgXAogCWlmICghdHJ5X21vZHVsZV9nZXQoVEhJU19NT0RVTEUpKSBcCiAJeyBcCi0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzOiBjYW5ub3QgcmVzZXJ2ZSBtb2R1bGVcbiIsIF9fRlVOQ1RJT05fXykpOyBcCisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzOiBjYW5ub3QgcmVzZXJ2ZSBtb2R1bGVcbiIsIF9fZnVuY19fKSk7IFwKIAkJcmV0dXJuIC0xOyBcCiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0X3Byb2ZpbGUuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnRfcHJvZmlsZS5jCmluZGV4IGNkN2ZmYzguLjMyNmEzY2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnRfcHJvZmlsZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnRfcHJvZmlsZS5jCkBAIC0xMDI0LDcgKzEwMjQsNyBAQAogCQkJCQkJCQlwQWQtPk1sbWVBdXguU3NpZExlbiA9IHBBZC0+Q29tbW9uQ2ZnLlNzaWRMZW47CiAJCQkJCQkJCU5kaXNaZXJvTWVtb3J5KHBBZC0+TWxtZUF1eC5Tc2lkLCBORElTXzgwMl8xMV9MRU5HVEhfU1NJRCk7CiAJCQkJCQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+TWxtZUF1eC5Tc2lkLCB0bXBidWYsIHBBZC0+TWxtZUF1eC5Tc2lkTGVuKTsKLQkJCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OihTU0lEPSVzKVxuIiwgX19GVU5DVElPTl9fLCB0bXBidWYpKTsKKwkJCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OihTU0lEPSVzKVxuIiwgX19mdW5jX18sIHRtcGJ1ZikpOwogCQkJCQkJCX0KIAkJCQkJCX0KIAkJCQkJfQpAQCAtMTA0Myw3ICsxMDQzLDcgQEAKIAkJCQkJCQkJcEFkLT5TdGFDZmcuQnNzVHlwZSA9IEJTU19JTkZSQTsKIAkJCQkJCQkvLyBSZXNldCBSYWxpbmsgc3VwcGxpY2FudCB0byBub3QgdXNlLCBpdCB3aWxsIGJlIHNldCB0byBzdGFydCB3aGVuIFVJIHNldCBQTUsga2V5CiAJCQkJCQkJcEFkLT5TdGFDZmcuV3BhU3RhdGUgPSBTU19OT1RVU0U7Ci0JCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OihOZXR3b3JrVHlwZT0lZClcbiIsIF9fRlVOQ1RJT05fXywgcEFkLT5TdGFDZmcuQnNzVHlwZSkpOworCQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjooTmV0d29ya1R5cGU9JWQpXG4iLCBfX2Z1bmNfXywgcEFkLT5TdGFDZmcuQnNzVHlwZSkpOwogCQkJCQkJfQogCQkJCQl9CiAjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCkBAIC0xMzM3LDcgKzEzMzcsNyBAQAogCiAJCQkJICAgICAgICAgICAgICAgICAgICAgICAgcEFkLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfTk9UX1NFQ1VSRUQ7CiAKLQkJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6KEVuY3J5cFR5cGU9JWQpXG4iLCBfX0ZVTkNUSU9OX18sIHBBZC0+U3RhQ2ZnLldlcFN0YXR1cykpOworCQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjooRW5jcnlwVHlwZT0lZClcbiIsIF9fZnVuY19fLCBwQWQtPlN0YUNmZy5XZXBTdGF0dXMpKTsKIAkJCQkJCX0KICNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KIAkJCQkJfQpAQCAtMTM2Myw3ICsxMzYzLDcgQEAKIAkJCQkJCQlwQWQtPlN0YUNmZy5PcmlnV2VwU3RhdHVzIAk9IHBBZC0+U3RhQ2ZnLldlcFN0YXR1czsKIAkJCQkJCQlwQWQtPlN0YUNmZy5iTWl4Q2lwaGVyIAkJPSBGQUxTRTsKIAotCQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjooRW5jcnlwVHlwZT0lZClcbiIsIF9fRlVOQ1RJT05fXywgcEFkLT5TdGFDZmcuV2VwU3RhdHVzKSk7CisJCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OihFbmNyeXBUeXBlPSVkKVxuIiwgX19mdW5jX18sIHBBZC0+U3RhQ2ZnLldlcFN0YXR1cykpOwogCQkJCQkJfQogI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwogCQkJCQl9CkBAIC0xNDAwLDcgKzE0MDAsNyBAQAogCQkJCQkJCWVsc2UKIAkJCQkJCQl7CiAJCQkJCQkJCWVyciA9IDE7Ci0JCQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzOjooV1BBUFNLIGtleS1zdHJpbmcgcmVxdWlyZWQgOCB+IDY0IGNoYXJhY3RlcnMhKVxuIiwgX19GVU5DVElPTl9fKSk7CisJCQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzOjooV1BBUFNLIGtleS1zdHJpbmcgcmVxdWlyZWQgOCB+IDY0IGNoYXJhY3RlcnMhKVxuIiwgX19mdW5jX18pKTsKIAkJCQkJCQl9CiAKIAkJCQkJCQlpZiAoZXJyID09IDApCkBAIC0xNDE2LDcgKzE0MTYsNyBAQAogCQkJCQkJCQkJcEFkLT5TdGFDZmcuV3BhU3RhdGUgPSBTU19OT1RVU0U7CiAJCQkJCQkJCX0KIAotCQkJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6KFdQQVBTSz0lcylcbiIsIF9fRlVOQ1RJT05fXywgdG1wYnVmKSk7CisJCQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjooV1BBUFNLPSVzKVxuIiwgX19mdW5jX18sIHRtcGJ1ZikpOwogCQkJCQkJCX0KIAkJCQkJCX0KIAkJCQkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydG1wX2RlZi5oIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydG1wX2RlZi5oCmluZGV4IGJiNmYzN2IuLmJlOTgyMTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnRtcF9kZWYuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0bXBfZGVmLmgKQEAgLTMzMyw3ICszMzMsNyBAQAogLyogc2FuaXR5IGNoZWNrIGZvciBhcGlkeCAqLwogI2RlZmluZSBNQlNTX01SX0FQSURYX1NBTklUWV9DSEVDSyhhcGlkeCkgXAogICAgIHsgaWYgKGFwaWR4ID4gTUFYX01CU1NJRF9OVU0pIHsgXAotICAgICAgICAgIHByaW50aygiJXM+IEVycm9yISBhcGlkeCA9ICVkID4gTUFYX01CU1NJRF9OVU0hXG4iLCBfX0ZVTkNUSU9OX18sIGFwaWR4KTsgXAorICAgICAgICAgIHByaW50aygiJXM+IEVycm9yISBhcGlkeCA9ICVkID4gTUFYX01CU1NJRF9OVU0hXG4iLCBfX2Z1bmNfXywgYXBpZHgpOyBcCiAJICBhcGlkeCA9IE1BSU5fTUJTU0lEOyB9IH0KIAogI2RlZmluZSBWQUxJRF9XQ0lEKF93Y2lkKQkoKF93Y2lkKSA+IDAgJiYgKF93Y2lkKSA8IE1BWF9MRU5fT0ZfTUFDX1RBQkxFICkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvc3RhX2lvY3RsLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3N0YV9pb2N0bC5jCmluZGV4IDkzNDdkMTEuLjNlYTJiMmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvc3RhX2lvY3RsLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9zdGFfaW9jdGwuYwpAQCAtMjIwMCw3ICsyMjAwLDcgQEAKIAkJCX0KIAkJCWJyZWFrOwogICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXMgLSB1bmtub3cgc3ViY21kID0gJWRcbiIsIF9fRlVOQ1RJT05fXywgc3ViY21kKSk7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlcyAtIHVua25vdyBzdWJjbWQgPSAlZFxuIiwgX19mdW5jX18sIHN1YmNtZCkpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgfQogCkBAIC0yMjE5LDcgKzIyMTksNyBAQAogCU1MTUVfRElTQVNTT0NfUkVRX1NUUlVDVAlEaXNBc3NvY1JlcTsKIAlNTE1FX0RFQVVUSF9SRVFfU1RSVUNUICAgICAgRGVBdXRoUmVxOwogCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PT4gJXNcbiIsIF9fRlVOQ1RJT05fXykpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT0+ICVzXG4iLCBfX2Z1bmNfXykpOwogCiAJaWYgKHBNbG1lID09IE5VTEwpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMjIyOCw3ICsyMjI4LDcgQEAKIAl7CiAjaWZkZWYgSVdfTUxNRV9ERUFVVEgKIAkJY2FzZSBJV19NTE1FX0RFQVVUSDoKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT0+ICVzIC0gSVdfTUxNRV9ERUFVVEhcbiIsIF9fRlVOQ1RJT05fXykpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PT4gJXMgLSBJV19NTE1FX0RFQVVUSFxuIiwgX19mdW5jX18pKTsKIAkJCUNPUFlfTUFDX0FERFIoRGVBdXRoUmVxLkFkZHIsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKIAkJCURlQXV0aFJlcS5SZWFzb24gPSBwTWxtZS0+cmVhc29uX2NvZGU7CiAJCQlNc2dFbGVtLk1zZ0xlbiA9IHNpemVvZihNTE1FX0RFQVVUSF9SRVFfU1RSVUNUKTsKQEAgLTIyNDMsNyArMjI0Myw3IEBACiAjZW5kaWYgLy8gSVdfTUxNRV9ERUFVVEggLy8KICNpZmRlZiBJV19NTE1FX0RJU0FTU09DCiAJCWNhc2UgSVdfTUxNRV9ESVNBU1NPQzoKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT0+ICVzIC0gSVdfTUxNRV9ESVNBU1NPQ1xuIiwgX19GVU5DVElPTl9fKSk7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT09PiAlcyAtIElXX01MTUVfRElTQVNTT0NcbiIsIF9fZnVuY19fKSk7CiAJCQlDT1BZX01BQ19BRERSKERpc0Fzc29jUmVxLkFkZHIsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKIAkJCURpc0Fzc29jUmVxLlJlYXNvbiA9ICBwTWxtZS0+cmVhc29uX2NvZGU7CiAKQEAgLTIyNTcsNyArMjI1Nyw3IEBACiAJCQlicmVhazsKICNlbmRpZiAvLyBJV19NTE1FX0RJU0FTU09DIC8vCiAJCWRlZmF1bHQ6Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT09PiAlcyAtIFVua25vdyBDb21tYW5kXG4iLCBfX0ZVTkNUSU9OX18pKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT0+ICVzIC0gVW5rbm93IENvbW1hbmRcbiIsIF9fZnVuY19fKSk7CiAJCQlicmVhazsKIAl9CiAKQEAgLTIyOTAsNyArMjI5MCw3IEBACiAgICAgICAgICAgICBlbHNlIGlmIChwYXJhbS0+dmFsdWUgPT0gSVdfQVVUSF9XUEFfVkVSU0lPTl9XUEEyKQogICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLOwogCi0gICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6SVdfQVVUSF9XUEFfVkVSU0lPTiAtIHBhcmFtLT52YWx1ZSA9ICVkIVxuIiwgX19GVU5DVElPTl9fLCBwYXJhbS0+dmFsdWUpKTsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjpJV19BVVRIX1dQQV9WRVJTSU9OIC0gcGFyYW0tPnZhbHVlID0gJWQhXG4iLCBfX2Z1bmNfXywgcGFyYW0tPnZhbHVlKSk7CiAgICAgICAgICAgICBicmVhazsKICAgICAJY2FzZSBJV19BVVRIX0NJUEhFUl9QQUlSV0lTRToKICAgICAgICAgICAgIGlmIChwYXJhbS0+dmFsdWUgPT0gSVdfQVVUSF9DSVBIRVJfTk9ORSkKQEAgLTIzMjEsNyArMjMyMSw3IEBACiAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5PcmlnV2VwU3RhdHVzID0gcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXM7CiAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5QYWlyQ2lwaGVyID0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZDsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjpJV19BVVRIX0NJUEhFUl9QQUlSV0lTRSAtIHBhcmFtLT52YWx1ZSA9ICVkIVxuIiwgX19GVU5DVElPTl9fLCBwYXJhbS0+dmFsdWUpKTsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjpJV19BVVRIX0NJUEhFUl9QQUlSV0lTRSAtIHBhcmFtLT52YWx1ZSA9ICVkIVxuIiwgX19mdW5jX18sIHBhcmFtLT52YWx1ZSkpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgCWNhc2UgSVdfQVVUSF9DSVBIRVJfR1JPVVA6CiAgICAgICAgICAgICBpZiAocGFyYW0tPnZhbHVlID09IElXX0FVVEhfQ0lQSEVSX05PTkUpCkBAIC0yMzQxLDcgKzIzNDEsNyBAQAogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuR3JvdXBDaXBoZXIgPSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OklXX0FVVEhfQ0lQSEVSX0dST1VQIC0gcGFyYW0tPnZhbHVlID0gJWQhXG4iLCBfX0ZVTkNUSU9OX18sIHBhcmFtLT52YWx1ZSkpOworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OklXX0FVVEhfQ0lQSEVSX0dST1VQIC0gcGFyYW0tPnZhbHVlID0gJWQhXG4iLCBfX2Z1bmNfXywgcGFyYW0tPnZhbHVlKSk7CiAgICAgICAgICAgICBicmVhazsKICAgICAJY2FzZSBJV19BVVRIX0tFWV9NR01UOgogICAgICAgICAgICAgaWYgKHBhcmFtLT52YWx1ZSA9PSBJV19BVVRIX0tFWV9NR01UXzgwMl8xWCkKQEAgLTIzNzAsMTIgKzIzNzAsMTIgQEAKICAgICAgICAgICAgIHsKIAkJCQlTVEFfUE9SVF9TRUNVUkVEKHBBZGFwdGVyKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjpJV19BVVRIX0tFWV9NR01UIC0gcGFyYW0tPnZhbHVlID0gJWQhXG4iLCBfX0ZVTkNUSU9OX18sIHBhcmFtLT52YWx1ZSkpOworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OklXX0FVVEhfS0VZX01HTVQgLSBwYXJhbS0+dmFsdWUgPSAlZCFcbiIsIF9fZnVuY19fLCBwYXJhbS0+dmFsdWUpKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgIAljYXNlIElXX0FVVEhfUlhfVU5FTkNSWVBURURfRUFQT0w6CiAgICAgICAgICAgICBicmVhazsKICAgICAJY2FzZSBJV19BVVRIX1BSSVZBQ1lfSU5WT0tFRDoKLSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjpJV19BVVRIX1BSSVZBQ1lfSU5WT0tFRCAtIHBhcmFtLT52YWx1ZSA9ICVkIVxuIiwgX19GVU5DVElPTl9fLCBwYXJhbS0+dmFsdWUpKTsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjpJV19BVVRIX1BSSVZBQ1lfSU5WT0tFRCAtIHBhcmFtLT52YWx1ZSA9ICVkIVxuIiwgX19mdW5jX18sIHBhcmFtLT52YWx1ZSkpOwogICAgIAkJYnJlYWs7CiAgICAgCWNhc2UgSVdfQVVUSF9EUk9QX1VORU5DUllQVEVEOgogICAgICAgICAgICAgaWYgKHBhcmFtLT52YWx1ZSAhPSAwKQpAQCAtMjM4NCw3ICsyMzg0LDcgQEAKIAkJCXsKIAkJCQlTVEFfUE9SVF9TRUNVUkVEKHBBZGFwdGVyKTsKIAkJCX0KLSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjpJV19BVVRIX1dQQV9WRVJTSU9OIC0gcGFyYW0tPnZhbHVlID0gJWQhXG4iLCBfX0ZVTkNUSU9OX18sIHBhcmFtLT52YWx1ZSkpOworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OklXX0FVVEhfV1BBX1ZFUlNJT04gLSBwYXJhbS0+dmFsdWUgPSAlZCFcbiIsIF9fZnVuY19fLCBwYXJhbS0+dmFsdWUpKTsKICAgICAJCWJyZWFrOwogICAgIAljYXNlIElXX0FVVEhfODAyMTFfQVVUSF9BTEc6CiAJCQlpZiAocGFyYW0tPnZhbHVlICYgSVdfQVVUSF9BTEdfU0hBUkVEX0tFWSkKQEAgLTIzOTcsMTAgKzIzOTcsMTAgQEAKIAkJCX0KICAgICAgICAgICAgIGVsc2UKIAkJCQlyZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjpJV19BVVRIXzgwMjExX0FVVEhfQUxHIC0gcGFyYW0tPnZhbHVlID0gJWQhXG4iLCBfX0ZVTkNUSU9OX18sIHBhcmFtLT52YWx1ZSkpOworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OklXX0FVVEhfODAyMTFfQVVUSF9BTEcgLSBwYXJhbS0+dmFsdWUgPSAlZCFcbiIsIF9fZnVuY19fLCBwYXJhbS0+dmFsdWUpKTsKIAkJCWJyZWFrOwogICAgIAljYXNlIElXX0FVVEhfV1BBX0VOQUJMRUQ6Ci0gICAgCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6SVdfQVVUSF9XUEFfRU5BQkxFRCAtIERyaXZlciBzdXBwb3J0cyBXUEEhKHBhcmFtLT52YWx1ZSA9ICVkKVxuIiwgX19GVU5DVElPTl9fLCBwYXJhbS0+dmFsdWUpKTsKKyAgICAJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjpJV19BVVRIX1dQQV9FTkFCTEVEIC0gRHJpdmVyIHN1cHBvcnRzIFdQQSEocGFyYW0tPnZhbHVlID0gJWQpXG4iLCBfX2Z1bmNfXywgcGFyYW0tPnZhbHVlKSk7CiAgICAgCQlicmVhazsKICAgICAJZGVmYXVsdDoKICAgICAJCXJldHVybiAtRU9QTk9UU1VQUDsKQEAgLTI1MDgsNyArMjUwOCw3IEBACiAJCXBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5DaXBoZXJBbGcgPSBDSVBIRVJfTk9ORTsKIAkJQXNpY1JlbW92ZVNoYXJlZEtleUVudHJ5KHBBZGFwdGVyLCAwLCAoVUNIQVIpa2V5SWR4KTsKICAgICAgICAgTmRpc1plcm9NZW1vcnkoJnBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XSwgc2l6ZW9mKENJUEhFUl9LRVkpKTsKLSAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OlJlbW92ZSBhbGwga2V5cyEoZW5jb2RpbmctPmZsYWdzID0gJXgpXG4iLCBfX0ZVTkNUSU9OX18sIGVuY29kaW5nLT5mbGFncykpOworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6UmVtb3ZlIGFsbCBrZXlzIShlbmNvZGluZy0+ZmxhZ3MgPSAleClcbiIsIF9fZnVuY19fLCBlbmNvZGluZy0+ZmxhZ3MpKTsKICAgICB9CiAJCQkJCWVsc2UKICAgICB7CkBAIC0yNTIwLDE1ICsyNTIwLDE1IEBACiAgICAgICAgIGlmIChleHQtPmV4dF9mbGFncyAmIElXX0VOQ09ERV9FWFRfU0VUX1RYX0tFWSkKICAgICAgICAgewogICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWQgPSBrZXlJZHg7Ci0gICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6RGVmYXVsdEtleUlkID0gJWRcbiIsIF9fRlVOQ1RJT05fXywgcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWQpKTsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjpEZWZhdWx0S2V5SWQgPSAlZFxuIiwgX19mdW5jX18sIHBBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkKSk7CiAgICAgICAgIH0KIAogICAgICAgICBzd2l0Y2ggKGFsZykgewogICAgIAkJY2FzZSBJV19FTkNPREVfQUxHX05PTkU6Ci0gICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OklXX0VOQ09ERV9BTEdfTk9ORVxuIiwgX19GVU5DVElPTl9fKSk7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OklXX0VOQ09ERV9BTEdfTk9ORVxuIiwgX19mdW5jX18pKTsKICAgICAJCQlicmVhazsKICAgICAJCWNhc2UgSVdfRU5DT0RFX0FMR19XRVA6Ci0gICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OklXX0VOQ09ERV9BTEdfV0VQIC0gZXh0LT5rZXlfbGVuID0gJWQsIGtleUlkeCA9ICVkXG4iLCBfX0ZVTkNUSU9OX18sIGV4dC0+a2V5X2xlbiwga2V5SWR4KSk7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OklXX0VOQ09ERV9BTEdfV0VQIC0gZXh0LT5rZXlfbGVuID0gJWQsIGtleUlkeCA9ICVkXG4iLCBfX2Z1bmNfXywgZXh0LT5rZXlfbGVuLCBrZXlJZHgpKTsKICAgICAJCQlpZiAoZXh0LT5rZXlfbGVuID09IE1BWF9XRVBfS0VZX1NJWkUpCiAgICAgICAgICAgICAgICAgewogICAgICAgICAJCQlwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uS2V5TGVuID0gTUFYX1dFUF9LRVlfU0laRTsKQEAgLTI1NDYsNyArMjU0Niw3IEBACiAJCQkgICAgTmRpc01vdmVNZW1vcnkocEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLktleSwgZXh0LT5rZXksIGV4dC0+a2V5X2xlbik7CiAgICAgCQkJYnJlYWs7CiAgICAgICAgICAgICBjYXNlIElXX0VOQ09ERV9BTEdfVEtJUDoKLSAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6SVdfRU5DT0RFX0FMR19US0lQIC0ga2V5SWR4ID0gJWQsIGV4dC0+a2V5X2xlbiA9ICVkXG4iLCBfX0ZVTkNUSU9OX18sIGtleUlkeCwgZXh0LT5rZXlfbGVuKSk7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OklXX0VOQ09ERV9BTEdfVEtJUCAtIGtleUlkeCA9ICVkLCBleHQtPmtleV9sZW4gPSAlZFxuIiwgX19mdW5jX18sIGtleUlkeCwgZXh0LT5rZXlfbGVuKSk7CiAgICAgICAgICAgICAgICAgaWYgKGV4dC0+a2V5X2xlbiA9PSAzMikKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChleHQtPmV4dF9mbGFncyAmIElXX0VOQ09ERV9FWFRfU0VUX1RYX0tFWSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvMjg3MF9tYWluX2Rldi5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC8yODcwX21haW5fZGV2LmMKaW5kZXggOTFkYTRlMi4uMDRjNzY0ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC8yODcwX21haW5fZGV2LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC8yODcwX21haW5fZGV2LmMKQEAgLTI2Myw3ICsyNjMsNyBAQAogCSAqIFRoaXMgaXMgaW1wb3J0YW50IGluIHByZWVtcHRpb24ga2VybmVscywgd2hpY2ggdHJhbnNmZXIgdGhlIGZsb3cKIAkgKiBvZiBleGVjdXRpb24gaW1tZWRpYXRlbHkgdXBvbiBhIGNvbXBsZXRlKCkuCiAJICovCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCAiPC0tLSVzXG4iLF9fRlVOQ1RJT05fXykpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCggIjwtLS0lc1xuIixfX2Z1bmNfXykpOwogCiAJcE9iai0+TUxNRVRocl9waWQgPSBUSFJFQURfUElEX0lOSVRfVkFMVUU7CiAKQEAgLTQ2NSw3ICs0NjUsNyBAQAogCSAqIFRoaXMgaXMgaW1wb3J0YW50IGluIHByZWVtcHRpb24ga2VybmVscywgd2hpY2ggdHJhbnNmZXIgdGhlIGZsb3cKIAkgKiBvZiBleGVjdXRpb24gaW1tZWRpYXRlbHkgdXBvbiBhIGNvbXBsZXRlKCkuCiAJICovCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCAiPC0tLSVzXG4iLF9fRlVOQ1RJT05fXykpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCggIjwtLS0lc1xuIixfX2Z1bmNfXykpOwogCiAJcE9iai0+VGltZXJRVGhyX3BpZCA9IFRIUkVBRF9QSURfSU5JVF9WQUxVRTsKIApAQCAtMTI1OCw3ICsxMjU4LDcgQEAKIAogCWlmICghKHBBZC0+QnVsa0luRXBBZGRyICYmIHBBZC0+QnVsa091dEVwQWRkclswXSkpCiAJewotCQlwcmludGsoIiVzOiBDb3VsZCBub3QgZmluZCBib3RoIGJ1bGstaW4gYW5kIGJ1bGstb3V0IGVuZHBvaW50c1xuIiwgX19GVU5DVElPTl9fKTsKKwkJcHJpbnRrKCIlczogQ291bGQgbm90IGZpbmQgYm90aCBidWxrLWluIGFuZCBidWxrLW91dCBlbmRwb2ludHNcbiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuIEZBTFNFOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vMjg3MF9ydG1wX2luaXQuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uLzI4NzBfcnRtcF9pbml0LmMKaW5kZXggNWQ4OWEzMS4uOWY1MTQzYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vMjg3MF9ydG1wX2luaXQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi8yODcwX3J0bXBfaW5pdC5jCkBAIC0xMDg3LDcgKzEwODcsNyBAQAogCWlmIChwUnhXSS0+TVBEVXRvdGFsQnl0ZUNvdW50ID4gVGhpc0ZyYW1lTGVuKQogCXsKIAkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXMoKTpwUnhXSU1QRFV0b3RhbEJ5dGVDb3VudCglZCkgbGFyZ2UgdGhhbiBSeERNQUxlbiglbGQpXG4iLAotCQkJCQkJCQkJX19GVU5DVElPTl9fLCBwUnhXSS0+TVBEVXRvdGFsQnl0ZUNvdW50LCBUaGlzRnJhbWVMZW4pKTsKKwkJCQkJCQkJCV9fZnVuY19fLCBwUnhXSS0+TVBEVXRvdGFsQnl0ZUNvdW50LCBUaGlzRnJhbWVMZW4pKTsKIAkJZ290byBsYWJlbF9udWxsOwogCX0KICNpZmRlZiBSVF9CSUdfRU5ESUFOCkBAIC0xMDk4LDcgKzEwOTgsNyBAQAogCXBTa2IgPSBkZXZfYWxsb2Nfc2tiKFRoaXNGcmFtZUxlbik7CiAJaWYgKHBTa2IgPT0gTlVMTCkKIAl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiJXMoKTpDYW5ub3QgQWxsb2NhdGUgc2sgYnVmZmVyIGZvciB0aGlzIEJ1bGstSW4gYnVmZmVyIVxuIiwgX19GVU5DVElPTl9fKSk7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiJXMoKTpDYW5ub3QgQWxsb2NhdGUgc2sgYnVmZmVyIGZvciB0aGlzIEJ1bGstSW4gYnVmZmVyIVxuIiwgX19mdW5jX18pKTsKIAkJZ290byBsYWJlbF9udWxsOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vYmFfYWN0aW9uLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9iYV9hY3Rpb24uYwppbmRleCA5NWFkZGIyMGIuLmQ5ZjczODEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uL2JhX2FjdGlvbi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uL2JhX2FjdGlvbi5jCkBAIC01OTUsNyArNTk1LDcgQEAKIAogCQlwQkFFbnRyeS0+T1JJQkFUaW1lci5UaW1lclZhbHVlID0gMDsJLy9wRnJhbWUtPlRpbWVPdXRWYWx1ZTsKIAotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIiVzIDogVFhCQWJpdG1hcCA9ICV4LCBCQVdpblNpemUgPSAlZCwgVGltZU91dCA9ICVsZFxuIiwgX19GVU5DVElPTl9fLCBwRW50cnktPlRYQkFiaXRtYXAsCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiJXMgOiBUWEJBYml0bWFwID0gJXgsIEJBV2luU2l6ZSA9ICVkLCBUaW1lT3V0ID0gJWxkXG4iLCBfX2Z1bmNfXywgcEVudHJ5LT5UWEJBYml0bWFwLAogCQkJCQkJCQkgcEJBRW50cnktPkJBV2luU2l6ZSwgcEJBRW50cnktPk9SSUJBVGltZXIuVGltZXJWYWx1ZSkpOwogCiAJCS8vIFNFTkQgQkFSIDsKQEAgLTY2OSw3ICs2NjksNyBAQAogCQliYV9yZWZyZXNoX3Jlb3JkZXJpbmdfbXBkdXMocEFkLCBwQkFFbnRyeSk7CiAJfQogCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCIlcyglbGQpOiBJZHggPSAlZCwgQkFXaW5TaXplKHJlcSAlZCkgPSAlZFxuIiwgX19GVU5DVElPTl9fLCBwQWQtPkJBVGFibGUubnVtQXNSZWNpcGllbnQsIElkeCwKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIiVzKCVsZCk6IElkeCA9ICVkLCBCQVdpblNpemUocmVxICVkKSA9ICVkXG4iLCBfX2Z1bmNfXywgcEFkLT5CQVRhYmxlLm51bUFzUmVjaXBpZW50LCBJZHgsCiAJCQkJCQkJIHBGcmFtZS0+QmFQYXJtLkJ1ZlNpemUsIEJBV2luU2l6ZSkpOwogCiAJLy8gU3RhcnQgZmlsbCBpbiBwYXJhbWV0ZXJzLgpAQCAtOTExLDcgKzkxMSw3IEBACiAJCXJldHVybjsKIAl9CiAKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIiVzPT09PldjaWQ9JWQuVElEPSVkIFxuIiwgX19GVU5DVElPTl9fLCBXY2lkLCBUSUQpKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIiVzPT09PldjaWQ9JWQuVElEPSVkIFxuIiwgX19mdW5jX18sIFdjaWQsIFRJRCkpOwogCiAJcEJBRW50cnkgPSAmcEFkLT5CQVRhYmxlLkJBT3JpRW50cnlbSWR4XTsKIAlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlx0PT09PklkeCA9ICVsZCwgV2NpZD0lZC5USUQ9JWQsIE9SSV9CQV9TdGF0dXMgPSAlZCBcbiIsIElkeCwgV2NpZCwgVElELCBwQkFFbnRyeS0+T1JJX0JBX1N0YXR1cykpOwpAQCAtOTcwLDcgKzk3MCw3IEBACiAJaWYgKElkeCA9PSAwKQogCQlyZXR1cm47CiAKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIiVzPT09PldjaWQ9JWQuVElEPSVkIFxuIiwgX19GVU5DVElPTl9fLCBXY2lkLCBUSUQpKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIiVzPT09PldjaWQ9JWQuVElEPSVkIFxuIiwgX19mdW5jX18sIFdjaWQsIFRJRCkpOwogCiAKIAlwQkFFbnRyeSA9ICZwQWQtPkJBVGFibGUuQkFSZWNFbnRyeVtJZHhdOwpAQCAtMTE4MSw3ICsxMTgxLDcgQEAKIAlQVUxPTkcgICAgICBwdGVtcDsKIAlQTUFDX1RBQkxFX0VOVFJZCXBNYWNFbnRyeTsKIAotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzID09PiAoV2NpZCA9ICVkKVxuIiwgX19GVU5DVElPTl9fLCBFbGVtLT5XY2lkKSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXMgPT0+IChXY2lkID0gJWQpXG4iLCBfX2Z1bmNfXywgRWxlbS0+V2NpZCkpOwogCiAJLy9oZXhfZHVtcCgiQWRkQkFSZXEiLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbik7CiAKQEAgLTEyNjUsNyArMTI2NSw3IEBACiAJTWluaXBvcnRNTVJlcXVlc3QocEFkLCBRSURfQUNfQkUsIHBPdXRCdWZmZXIsIEZyYW1lTGVuKTsKIAlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOwogCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXMoJWQpOiBUSUQoJWQpLCBCdWZTaXplKCVkKSA8PT0gXG4iLCBfX0ZVTkNUSU9OX18sIEVsZW0tPldjaWQsIEFERGZyYW1lLkJhUGFybS5USUQsCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXMoJWQpOiBUSUQoJWQpLCBCdWZTaXplKCVkKSA8PT0gXG4iLCBfX2Z1bmNfXywgRWxlbS0+V2NpZCwgQUREZnJhbWUuQmFQYXJtLlRJRCwKIAkJCQkJCQkgIEFERGZyYW1lLkJhUGFybS5CdWZTaXplKSk7CiB9CiAKQEAgLTEyODQsNyArMTI4NCw3IEBACiAJaWYgKEVsZW0tPldjaWQgPj0gTUFYX0xFTl9PRl9NQUNfVEFCTEUpCiAJCXJldHVybjsKIAotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzID09PiBXY2lkKCVkKVxuIiwgX19GVU5DVElPTl9fLCBFbGVtLT5XY2lkKSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXMgPT0+IFdjaWQoJWQpXG4iLCBfX2Z1bmNfXywgRWxlbS0+V2NpZCkpOwogCiAJLy9oZXhfZHVtcCgiUGVlckFkZEJBUnNwQWN0aW9uKCkiLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbik7CiAKQEAgLTEzMjUsNyArMTMyNSw3IEBACiAJLy9QVUNIQVIJCQkJcE91dEJ1ZmZlciA9IE5VTEw7CiAJUEZSQU1FX0RFTEJBX1JFUSAgICBwRGVsRnJhbWUgPSBOVUxMOwogCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCIlcyA9PT5cbiIsIF9fRlVOQ1RJT05fXykpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiJXMgPT0+XG4iLCBfX2Z1bmNfXykpOwogCS8vREVMQkEgUmVxdWVzdCBmcm9tIHVua25vd24gcGVlciwgaWdub3JlIHRoaXMuCiAJaWYgKFBlZXJEZWxCQUFjdGlvblNhbml0eShwQWQsIEVsZW0tPldjaWQsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuKSkKIAl7CkBAIC0xMzYyLDcgKzEzNjIsNyBAQAogCiAJVElEID0gKFVDSEFSKXBGcmFtZS0+QkFSQ29udHJvbC5USUQ7CiAKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlcygpOiBCQVItV2NpZCglbGQpLCBUaWQgKCVkKVxuIiwgX19GVU5DVElPTl9fLCBXY2lkLCBUSUQpKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlcygpOiBCQVItV2NpZCglbGQpLCBUaWQgKCVkKVxuIiwgX19mdW5jX18sIFdjaWQsIFRJRCkpOwogCS8vaGV4X2R1bXAoIkJBUiIsIChQQ0hBUikgcEZyYW1lLCBNc2dMZW4pOwogCS8vIERvIG5vdGhpbmcgaWYgdGhlIGRyaXZlciBpcyBzdGFydGluZyBoYWx0IHN0YXRlLgogCS8vIFRoaXMgbWlnaHQgaGFwcGVuIHdoZW4gdGltZXIgYWxyZWFkeSBiZWVuIGZpcmVkIGJlZm9yZSBjYW5jZWwgdGltZXIgd2l0aCBtbG1laGFsdApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vY21tX2RhdGEuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uL2NtbV9kYXRhLmMKaW5kZXggNDQ3N2E4ZS4uZmQ4MDlhYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vY21tX2RhdGEuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9jbW1fZGF0YS5jCkBAIC0yMDA5LDcgKzIwMDksNyBAQAogCQl9CiAJCWVsc2UKIAkJewotCQkJcHJpbnRrKCJcbiVzOiBJbXBvc3NpYmxlIFdjaWQgPSAlZCAhISEhIVxuIiwgX19GVU5DVElPTl9fLCB3Y2lkKTsKKwkJCXByaW50aygiXG4lczogSW1wb3NzaWJsZSBXY2lkID0gJWQgISEhISFcbiIsIF9fZnVuY19fLCB3Y2lkKTsKIAkJfQogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vY21tX2luZm8uYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uL2NtbV9pbmZvLmMKaW5kZXggNDA3OTJlMS4uNDdhMWIxYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vY21tX2luZm8uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9jbW1faW5mby5jCkBAIC0yMzMxLDcgKzIzMzEsNyBAQAogCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihSVF84MDJfMTFfTUFDX1RBQkxFKTsKIAlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZNYWNUYWIsIHdycS0+dS5kYXRhLmxlbmd0aCkpCiAJewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczogY29weV90b191c2VyKCkgZmFpbFxuIiwgX19GVU5DVElPTl9fKSk7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOiBjb3B5X3RvX3VzZXIoKSBmYWlsXG4iLCBfX2Z1bmNfXykpOwogCX0KIAogCW1zZyA9IChDSEFSICopIGttYWxsb2Moc2l6ZW9mKENIQVIpKihNQVhfTEVOX09GX01BQ19UQUJMRSpNQUNfTElORV9MRU4pLCBNRU1fQUxMT0NfRkxBRyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9kZnMuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uL2Rmcy5jCmluZGV4IDIzY2YxNTEuLmIwOWJiYTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uL2Rmcy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uL2Rmcy5jCkBAIC00MjgsNyArNDI4LDcgQEAKIAogCXBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LkNoTW92aW5nVGltZSA9IFZhbHVlOwogCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OiAlZFxuIiwgX19GVU5DVElPTl9fLAorCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjogJWRcbiIsIF9fZnVuY19fLAogCQlwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5DaE1vdmluZ1RpbWUpKTsKIAogCXJldHVybiBUUlVFOwpAQCAtNDQ0LDcgKzQ0NCw3IEBACiAKIAlwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5Mb25nUHVsc2VSYWRhclRoID0gVmFsdWU7CiAKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6ICVkXG4iLCBfX0ZVTkNUSU9OX18sCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OiAlZFxuIiwgX19mdW5jX18sCiAJCXBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LkxvbmdQdWxzZVJhZGFyVGgpKTsKIAogCXJldHVybiBUUlVFOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vcnRtcF9pbml0LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9ydG1wX2luaXQuYwppbmRleCA4NzAyOGZkLi44NzBhMDBkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9ydG1wX2luaXQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9ydG1wX2luaXQuYwpAQCAtMjc0Niw3ICsyNzQ2LDcgQEAKICNpZmRlZiBCSU5fSU5fRklMRQogI2RlZmluZSBOSUNMRl9ERUZBVUxUX1VTRSgpCVwKIAlmbGdfZGVmYXVsdF9maXJtX3VzZSA9IFRSVUU7IFwKLQlwcmludGsoIiVzIC0gVXNlIGRlZmF1bHQgZmlybXdhcmUhXG4iLCBfX0ZVTkNUSU9OX18pOworCXByaW50aygiJXMgLSBVc2UgZGVmYXVsdCBmaXJtd2FyZSFcbiIsIF9fZnVuY19fKTsKIAogCU5ESVNfU1RBVFVTCQlTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOwogCVBVQ0hBUgkJCXNyYzsKQEAgLTI3NjEsNyArMjc2MSw3IEBACiAJQk9PTEVBTgkJCWZsZ19kZWZhdWx0X2Zpcm1fdXNlID0gRkFMU0U7CiAKIAotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT4gJXNcbiIsIF9fRlVOQ1RJT05fXykpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT4gJXNcbiIsIF9fZnVuY19fKSk7CiAKIAkvKiBpbml0ICovCiAJcEZpcm13YXJlSW1hZ2UgPSBOVUxMOwpAQCAtMjc4NCw3ICsyNzg0LDcgQEAKICAgICBpZiAocEZpcm13YXJlSW1hZ2UgPT0gTlVMTCkKIAl7CiAJCS8qIGFsbG9jYXRlIGZhaWwsIHVzZSBkZWZhdWx0IGZpcm13YXJlIGFycmF5IGluIGZpcm13YXJlLmggKi8KLQkJcHJpbnRrKCIlcyAtIEFsbG9jYXRlIG1lbW9yeSBmYWlsIVxuIiwgX19GVU5DVElPTl9fKTsKKwkJcHJpbnRrKCIlcyAtIEFsbG9jYXRlIG1lbW9yeSBmYWlsIVxuIiwgX19mdW5jX18pOwogCQlOSUNMRl9ERUZBVUxUX1VTRSgpOwogICAgIH0KIAllbHNlCkBAIC0yODA1LDcgKzI4MDUsNyBAQAogCQkJaWYgKElTX0VSUihzcmNmKSkKIAkJCXsKIAkJCQlwcmludGsoIiVzIC0gRXJyb3IgJWxkIG9wZW5pbmcgJXNcbiIsCi0JCQkJCSAgIF9fRlVOQ1RJT05fXywgLVBUUl9FUlIoc3JjZiksIHNyYyk7CisJCQkJCSAgIF9fZnVuY19fLCAtUFRSX0VSUihzcmNmKSwgc3JjKTsKIAkJCQlOSUNMRl9ERUZBVUxUX1VTRSgpOwogCQkJCWJyZWFrOwogCQkJfSAvKiBFbmQgb2YgaWYgKi8KQEAgLTI4MTMsNyArMjgxMyw3IEBACiAJCQkvKiB0aGUgb2JqZWN0IG11c3QgaGF2ZSBhIHJlYWQgbWV0aG9kICovCiAJCQlpZiAoKHNyY2YtPmZfb3AgPT0gTlVMTCkgfHwgKHNyY2YtPmZfb3AtPnJlYWQgPT0gTlVMTCkpCiAJCQl7Ci0JCQkJcHJpbnRrKCIlcyAtICVzIGRvZXMgbm90IGhhdmUgYSB3cml0ZSBtZXRob2RcbiIsIF9fRlVOQ1RJT05fXywgc3JjKTsKKwkJCQlwcmludGsoIiVzIC0gJXMgZG9lcyBub3QgaGF2ZSBhIHdyaXRlIG1ldGhvZFxuIiwgX19mdW5jX18sIHNyYyk7CiAJCQkJTklDTEZfREVGQVVMVF9VU0UoKTsKIAkJCQlicmVhazsKIAkJCX0gLyogRW5kIG9mIGlmICovCkBAIC0yODI3LDcgKzI4MjcsNyBAQAogCQkJaWYgKEZpbGVMZW5ndGggIT0gTUFYX0ZJUk1XQVJFX0lNQUdFX1NJWkUpCiAJCQl7CiAJCQkJcHJpbnRrKCIlczogZXJyb3IgZmlsZSBsZW5ndGggKD0lZCkgaW4gUlQyODYwQVAuQklOXG4iLAotCQkJCQkgICBfX0ZVTkNUSU9OX18sIEZpbGVMZW5ndGgpOworCQkJCQkgICBfX2Z1bmNfXywgRmlsZUxlbmd0aCk7CiAJCQkJTklDTEZfREVGQVVMVF9VU0UoKTsKIAkJCQlicmVhazsKIAkJCX0KQEAgLTI4NTAsNyArMjg1MCw3IEBACiAJCQkJCS8qIENSQyBmYWlsICovCiAJCQkJCXByaW50aygiJXM6IENSQyA9IDB4JTAyeCAweCUwMnggIgogCQkJCQkJICAgImVycm9yLCBzaG91bGQgYmUgMHglMDJ4IDB4JTAyeFxuIiwKLQkJCQkJCSAgIF9fRlVOQ1RJT05fXywKKwkJCQkJCSAgIF9fZnVuY19fLAogCQkJCQkJICAgcEZpcm13YXJlSW1hZ2VbTUFYX0ZJUk1XQVJFX0lNQUdFX1NJWkUtMl0sCiAJCQkJCQkgICBwRmlybXdhcmVJbWFnZVtNQVhfRklSTVdBUkVfSU1BR0VfU0laRS0xXSwKIAkJCQkJCSAgIChVQ0hBUikoY3JjPj44KSwgKFVDSEFSKShjcmMpKTsKQEAgLTI4NjksNyArMjg2OSw3IEBACiAJCQkJCQkJCQkJCSgoRklSTVdBUkVfTUFKT1JfVkVSU0lPTiA8PCA4KSArCiAJCQkJCQkJCQkgIAkgCSBGSVJNV0FSRV9NSU5PUl9WRVJTSU9OKSkKIAkJCQkJewotCQkJCQkJcHJpbnRrKCIlczogZmlybXdhcmUgdmVyc2lvbiB0b28gb2xkIVxuIiwgX19GVU5DVElPTl9fKTsKKwkJCQkJCXByaW50aygiJXM6IGZpcm13YXJlIHZlcnNpb24gdG9vIG9sZCFcbiIsIF9fZnVuY19fKTsKIAkJCQkJCU5JQ0xGX0RFRkFVTFRfVVNFKCk7CiAJCQkJCQlicmVhazsKIAkJCQkJfSAvKiBFbmQgb2YgaWYgKi8KQEAgLTMwMjQsMTAgKzMwMjQsMTAgQEAKIAogI2lmIDAKICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKLQkJCSAoIjw9PT0gJXMgKHNyYz0lcywgc3RhdHVzPSVkKVxuIiwgX19GVU5DVElPTl9fLCBzcmMsIFN0YXR1cykpOworCQkJICgiPD09PSAlcyAoc3JjPSVzLCBzdGF0dXM9JWQpXG4iLCBfX2Z1bmNfXywgc3JjLCBTdGF0dXMpKTsKICNlbHNlCiAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCi0JCQkgKCI8PT09ICVzIChzdGF0dXM9JWQpXG4iLCBfX0ZVTkNUSU9OX18sIFN0YXR1cykpOworCQkJICgiPD09PSAlcyAoc3RhdHVzPSVkKVxuIiwgX19mdW5jX18sIFN0YXR1cykpOwogI2VuZGlmCiAgICAgcmV0dXJuIFN0YXR1czsKIH0gLyogRW5kIG9mIE5JQ0xvYWRGaXJtd2FyZSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vcnR1c2JfYnVsay5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vcnR1c2JfYnVsay5jCmluZGV4IDNjNmJhMWIuLmM0NmQ5MTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uL3J0dXNiX2J1bGsuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9ydHVzYl9idWxrLmMKQEAgLTMyOSw3ICszMjksNyBAQAogCiAJCWlmIChwVHhJbmZvLT5RU0VMICE9IEZJRk9fRURDQSkKIAkJewotCQkJcHJpbnRrKCIlcygpOiA9PT09PiBwVHhJbmZvLT5RdWV1ZVNlbCglZCkhPSBGSUZPX0VEQ0EhISEhXG4iLCBfX0ZVTkNUSU9OX18sIHBUeEluZm8tPlFTRUwpOworCQkJcHJpbnRrKCIlcygpOiA9PT09PiBwVHhJbmZvLT5RdWV1ZVNlbCglZCkhPSBGSUZPX0VEQ0EhISEhXG4iLCBfX2Z1bmNfXywgcFR4SW5mby0+UVNFTCk7CiAJCQlwcmludGsoIlx0Q1dQb3M9JWxkLCBOQlBvcz0lbGQsIEVOQlBvcz0lbGQsIGJDb3B5PSVkIVxuIiwgcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uLCBwSFRUWENvbnRleHQtPk5leHRCdWxrT3V0UG9zaXRpb24sIHBIVFRYQ29udGV4dC0+RU5leHRCdWxrT3V0UG9zaXRpb24sIHBIVFRYQ29udGV4dC0+YkNvcHlTYXZlUGFkKTsKIAkJCWhleF9kdW1wKCJXcm9uZyBRU2VsIFBrdDoiLCAoUFVDSEFSKSZwV2lyZWxlc3NQa3RbVG1wQnVsa0VuZFBvc10sIChwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24gLSBwSFRUWENvbnRleHQtPk5leHRCdWxrT3V0UG9zaXRpb24pKTsKIAkJfQpAQCAtOTQyLDcgKzk0Miw3IEBACiAJcFR4SW5mbyA9IChQVFhJTkZPX1NUUlVDKXBNTE1FQ29udGV4dC0+VHJhbnNmZXJCdWZmZXI7CiAJaWYgKHBUeEluZm8tPlFTRUwgIT0gRklGT19FRENBKQogCXsKLQkJCXByaW50aygiJXMoKTogPT09PT4gcFR4SW5mby0+UXVldWVTZWwoJWQpIT0gRklGT19FRENBISEhIVxuIiwgX19GVU5DVElPTl9fLCBwVHhJbmZvLT5RU0VMKTsKKwkJCXByaW50aygiJXMoKTogPT09PT4gcFR4SW5mby0+UXVldWVTZWwoJWQpIT0gRklGT19FRENBISEhIVxuIiwgX19mdW5jX18sIHBUeEluZm8tPlFTRUwpOwogCQkJcHJpbnRrKCJcdE1MTUVfSW5kZXg9JWQhXG4iLCBJbmRleCk7CiAJCQloZXhfZHVtcCgiV3JvbmcgUVNlbCBQa3Q6IiwgKFBVQ0hBUilwTUxNRUNvbnRleHQtPlRyYW5zZmVyQnVmZmVyLCBwVHhJbmZvLT5VU0JETUFUeFBrdExlbik7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vc3BlY3RydW0uYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uL3NwZWN0cnVtLmMKaW5kZXggYWJiYTg0MC4uNDM3ODJjZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vc3BlY3RydW0uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9zcGVjdHJ1bS5jCkBAIC00OCw3ICs0OCw3IEBACiAJaWYgKHBBZC0+Q29tbW9uQ2ZnLnBNZWFzdXJlUmVxVGFiKQogCQlOZGlzWmVyb01lbW9yeShwQWQtPkNvbW1vbkNmZy5wTWVhc3VyZVJlcVRhYiwgc2l6ZW9mKE1FQVNVUkVfUkVRX1RBQikpOwogCWVsc2UKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXMgRmFpbCB0byBhbGxvYyBtZW1vcnkgZm9yIHBBZC0+Q29tbW9uQ2ZnLnBNZWFzdXJlUmVxVGFiLlxuIiwgX19GVU5DVElPTl9fKSk7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzIEZhaWwgdG8gYWxsb2MgbWVtb3J5IGZvciBwQWQtPkNvbW1vbkNmZy5wTWVhc3VyZVJlcVRhYi5cbiIsIF9fZnVuY19fKSk7CiAKIAlyZXR1cm47CiB9CkBAIC03Niw3ICs3Niw3IEBACiAKIAlpZiAocFRhYiA9PSBOVUxMKQogCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXM6IHBNZWFzdXJlUmVxVGFiIGRvZXNuJ3QgZXhpc3QuXG4iLCBfX0ZVTkNUSU9OX18pKTsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXM6IHBNZWFzdXJlUmVxVGFiIGRvZXNuJ3QgZXhpc3QuXG4iLCBfX2Z1bmNfXykpOwogCQlyZXR1cm4gTlVMTDsKIAl9CiAKQEAgLTExMyw3ICsxMTMsNyBAQAogCiAJaWYocFRhYiA9PSBOVUxMKQogCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXM6IHBNZWFzdXJlUmVxVGFiIGRvZXNuJ3QgZXhpc3QuXG4iLCBfX0ZVTkNUSU9OX18pKTsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXM6IHBNZWFzdXJlUmVxVGFiIGRvZXNuJ3QgZXhpc3QuXG4iLCBfX2Z1bmNfXykpOwogCQlyZXR1cm4gTlVMTDsKIAl9CiAKQEAgLTE3NCw3ICsxNzQsNyBAQAogCQllbHNlCiAJCXsKIAkJCXBFbnRyeSA9IE5VTEw7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlczogcE1lYXN1cmVSZXFUYWIgdGFiIGZ1bGwuXG4iLCBfX0ZVTkNUSU9OX18pKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzOiBwTWVhc3VyZVJlcVRhYiB0YWIgZnVsbC5cbiIsIF9fZnVuY19fKSk7CiAJCX0KIAogCQkvLyBhZGQgdGhpcyBOZWlnaGJvciBlbnRyeSBpbnRvIEhBU0ggdGFibGUKQEAgLTIwOSw3ICsyMDksNyBAQAogCiAJaWYocFRhYiA9PSBOVUxMKQogCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXM6IHBNZWFzdXJlUmVxVGFiIGRvZXNuJ3QgZXhpc3QuXG4iLCBfX0ZVTkNUSU9OX18pKTsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXM6IHBNZWFzdXJlUmVxVGFiIGRvZXNuJ3QgZXhpc3QuXG4iLCBfX2Z1bmNfXykpOwogCQlyZXR1cm47CiAJfQogCkBAIC0yNjYsNyArMjY2LDcgQEAKIAlpZiAocEFkLT5Db21tb25DZmcucFRwY1JlcVRhYikKIAkJTmRpc1plcm9NZW1vcnkocEFkLT5Db21tb25DZmcucFRwY1JlcVRhYiwgc2l6ZW9mKFRQQ19SRVFfVEFCKSk7CiAJZWxzZQotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlcyBGYWlsIHRvIGFsbG9jIG1lbW9yeSBmb3IgcEFkLT5Db21tb25DZmcucFRwY1JlcVRhYi5cbiIsIF9fRlVOQ1RJT05fXykpOworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlcyBGYWlsIHRvIGFsbG9jIG1lbW9yeSBmb3IgcEFkLT5Db21tb25DZmcucFRwY1JlcVRhYi5cbiIsIF9fZnVuY19fKSk7CiAKIAlyZXR1cm47CiB9CkBAIC0yOTQsNyArMjk0LDcgQEAKIAogCWlmIChwVGFiID09IE5VTEwpCiAJewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlczogcFRwY1JlcVRhYiBkb2Vzbid0IGV4aXN0LlxuIiwgX19GVU5DVElPTl9fKSk7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzOiBwVHBjUmVxVGFiIGRvZXNuJ3QgZXhpc3QuXG4iLCBfX2Z1bmNfXykpOwogCQlyZXR1cm4gTlVMTDsKIAl9CiAKQEAgLTMzMiw3ICszMzIsNyBAQAogCiAJaWYocFRhYiA9PSBOVUxMKQogCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXM6IHBUcGNSZXFUYWIgZG9lc24ndCBleGlzdC5cbiIsIF9fRlVOQ1RJT05fXykpOworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlczogcFRwY1JlcVRhYiBkb2Vzbid0IGV4aXN0LlxuIiwgX19mdW5jX18pKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQogCkBAIC0zOTMsNyArMzkzLDcgQEAKIAkJZWxzZQogCQl7CiAJCQlwRW50cnkgPSBOVUxMOwotCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXM6IHBUcGNSZXFUYWIgdGFiIGZ1bGwuXG4iLCBfX0ZVTkNUSU9OX18pKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzOiBwVHBjUmVxVGFiIHRhYiBmdWxsLlxuIiwgX19mdW5jX18pKTsKIAkJfQogCiAJCS8vIGFkZCB0aGlzIE5laWdoYm9yIGVudHJ5IGludG8gSEFTSCB0YWJsZQpAQCAtNDI4LDcgKzQyOCw3IEBACiAKIAlpZihwVGFiID09IE5VTEwpCiAJewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlczogcFRwY1JlcVRhYiBkb2Vzbid0IGV4aXN0LlxuIiwgX19GVU5DVElPTl9fKSk7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzOiBwVHBjUmVxVGFiIGRvZXNuJ3QgZXhpc3QuXG4iLCBfX2Z1bmNfXykpOwogCQlyZXR1cm47CiAJfQogCkBAIC03ODEsNyArNzgxLDcgQEAKIAlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgKFBWT0lEKSZwT3V0QnVmZmVyKTsgIC8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKIAlpZihOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCiAJewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlcygpIGFsbG9jYXRlIG1lbW9yeSBmYWlsZWQgXG4iLCBfX0ZVTkNUSU9OX18pKTsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXMoKSBhbGxvY2F0ZSBtZW1vcnkgZmFpbGVkIFxuIiwgX19mdW5jX18pKTsKIAkJcmV0dXJuOwogCX0KIAlOZGlzTW92ZU1lbW9yeShwT3V0QnVmZmVyLCAoUENIQVIpJkFjdEhkciwgc2l6ZW9mKEhFQURFUl84MDJfMTEpKTsKQEAgLTg0Myw3ICs4NDMsNyBAQAogCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAoUFZPSUQpJnBPdXRCdWZmZXIpOyAgLy9HZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeQogCWlmKE5TdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKIAl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzKCkgYWxsb2NhdGUgbWVtb3J5IGZhaWxlZCBcbiIsIF9fRlVOQ1RJT05fXykpOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlcygpIGFsbG9jYXRlIG1lbW9yeSBmYWlsZWQgXG4iLCBfX2Z1bmNfXykpOwogCQlyZXR1cm47CiAJfQogCU5kaXNNb3ZlTWVtb3J5KHBPdXRCdWZmZXIsIChQQ0hBUikmQWN0SGRyLCBzaXplb2YoSEVBREVSXzgwMl8xMSkpOwpAQCAtODk3LDcgKzg5Nyw3IEBACiAJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsIChQVk9JRCkmcE91dEJ1ZmZlcik7ICAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5CiAJaWYoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQogCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXMoKSBhbGxvY2F0ZSBtZW1vcnkgZmFpbGVkIFxuIiwgX19GVU5DVElPTl9fKSk7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzKCkgYWxsb2NhdGUgbWVtb3J5IGZhaWxlZCBcbiIsIF9fZnVuY19fKSk7CiAJCXJldHVybjsKIAl9CiAJTmRpc01vdmVNZW1vcnkocE91dEJ1ZmZlciwgKFBDSEFSKSZBY3RIZHIsIHNpemVvZihIRUFERVJfODAyXzExKSk7CkBAIC05NDksNyArOTQ5LDcgQEAKIAlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgKFBWT0lEKSZwT3V0QnVmZmVyKTsgIC8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKIAlpZihOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCiAJewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlcygpIGFsbG9jYXRlIG1lbW9yeSBmYWlsZWQgXG4iLCBfX0ZVTkNUSU9OX18pKTsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXMoKSBhbGxvY2F0ZSBtZW1vcnkgZmFpbGVkIFxuIiwgX19mdW5jX18pKTsKIAkJcmV0dXJuOwogCX0KIAlOZGlzTW92ZU1lbW9yeShwT3V0QnVmZmVyLCAoUENIQVIpJkFjdEhkciwgc2l6ZW9mKEhFQURFUl84MDJfMTEpKTsKQEAgLTEwMDIsNyArMTAwMiw3IEBACiAJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsIChQVk9JRCkmcE91dEJ1ZmZlcik7ICAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5CiAJaWYoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQogCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXMoKSBhbGxvY2F0ZSBtZW1vcnkgZmFpbGVkIFxuIiwgX19GVU5DVElPTl9fKSk7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzKCkgYWxsb2NhdGUgbWVtb3J5IGZhaWxlZCBcbiIsIF9fZnVuY19fKSk7CiAJCXJldHVybjsKIAl9CiAJTmRpc01vdmVNZW1vcnkocE91dEJ1ZmZlciwgKFBDSEFSKSZBY3RIZHIsIHNpemVvZihIRUFERVJfODAyXzExKSk7CkBAIC0xNTk1LDcgKzE1OTUsNyBAQAogCiAJaWYgKChwTWVhc3VyZVJlcG9ydEluZm8gPSBrbWFsbG9jKHNpemVvZihNRUFTVVJFX1JQSV9SRVBPUlQpLCBHRlBfQVRPTUlDKSkgPT0gTlVMTCkKIAl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzIHVuYWJsZSB0byBhbGxvYyBtZW1vcnkgZm9yIG1lYXN1cmUgcmVwb3J0IGJ1ZmZlciAoc2l6ZT0lZCkuXG4iLCBfX0ZVTkNUSU9OX18sIHNpemVvZihNRUFTVVJFX1JQSV9SRVBPUlQpKSk7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzIHVuYWJsZSB0byBhbGxvYyBtZW1vcnkgZm9yIG1lYXN1cmUgcmVwb3J0IGJ1ZmZlciAoc2l6ZT0lZCkuXG4iLCBfX2Z1bmNfXywgc2l6ZW9mKE1FQVNVUkVfUlBJX1JFUE9SVCkpKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtMTcwNCw3ICsxNzA0LDcgQEAKIAkJewogCQkJVHBjUmVxRGVsZXRlKHBBZCwgcEVudHJ5LT5EaWFsb2dUb2tlbik7CiAJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczogRGlhbG9nVG9rZW49JXgsIFR4UHdyPSVkLCBMaW5rTWFyZ2luPSVkXG4iLAotCQkJCV9fRlVOQ1RJT05fXywgRGlhbG9nVG9rZW4sIFRwY1JlcEluZm8uVHhQd3IsIFRwY1JlcEluZm8uTGlua01hcmdpbikpOworCQkJCV9fZnVuY19fLCBEaWFsb2dUb2tlbiwgVHBjUmVwSW5mby5UeFB3ciwgVHBjUmVwSW5mby5MaW5rTWFyZ2luKSk7CiAJCX0KIAl9CiAKQEAgLTE4MjAsNyArMTgyMCw3IEBACiAJCQkJTWVhc3VyZVJlcVR5cGUgPSBzaW1wbGVfc3RydG9sKHRoaXNDaGFyLCAwLCAxNik7CiAJCQkJaWYgKE1lYXN1cmVSZXFUeXBlID4gMykKIAkJCQl7Ci0JCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzOiB1bmtub3cgTWVhc3VyZVJlcVR5cGUoJWQpXG4iLCBfX0ZVTkNUSU9OX18sIE1lYXN1cmVSZXFUeXBlKSk7CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzOiB1bmtub3cgTWVhc3VyZVJlcVR5cGUoJWQpXG4iLCBfX2Z1bmNfXywgTWVhc3VyZVJlcVR5cGUpKTsKIAkJCQkJcmV0dXJuIFRSVUU7CiAJCQkJfQogCQkJCWJyZWFrOwpAQCAtMTgzMiwxMCArMTgzMiwxMCBAQAogCQlBcmdJZHgrKzsKIAl9CiAKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6QWlkID0gJWQsIE1lYXN1cmVSZXFUeXBlPSVkIE1lYXN1cmVDaD0lZFxuIiwgX19GVU5DVElPTl9fLCBBaWQsIE1lYXN1cmVSZXFUeXBlLCBNZWFzdXJlQ2gpKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6QWlkID0gJWQsIE1lYXN1cmVSZXFUeXBlPSVkIE1lYXN1cmVDaD0lZFxuIiwgX19mdW5jX18sIEFpZCwgTWVhc3VyZVJlcVR5cGUsIE1lYXN1cmVDaCkpOwogCWlmICghVkFMSURfV0NJRChBaWQpKQogCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXM6IHVua25vdyBzdGEgb2YgQWlkKCVkKVxuIiwgX19GVU5DVElPTl9fLCBBaWQpKTsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXM6IHVua25vdyBzdGEgb2YgQWlkKCVkKVxuIiwgX19mdW5jX18sIEFpZCkpOwogCQlyZXR1cm4gVFJVRTsKIAl9CiAKQEAgLTE4NjAsMTAgKzE4NjAsMTAgQEAKIAogCUFpZCA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxNik7CiAKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6QWlkID0gJWRcbiIsIF9fRlVOQ1RJT05fXywgQWlkKSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OkFpZCA9ICVkXG4iLCBfX2Z1bmNfXywgQWlkKSk7CiAJaWYgKCFWQUxJRF9XQ0lEKEFpZCkpCiAJewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlczogdW5rbm93IHN0YSBvZiBBaWQoJWQpXG4iLCBfX0ZVTkNUSU9OX18sIEFpZCkpOworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlczogdW5rbm93IHN0YSBvZiBBaWQoJWQpXG4iLCBfX2Z1bmNfXywgQWlkKSk7CiAJCXJldHVybiBUUlVFOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9ydF9hdGUuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvcnRfYXRlLmMKaW5kZXggZTk5YjNkYS4uMjdjNzYzZWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvcnRfYXRlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9ydF9hdGUuYwpAQCAtMzE0LDcgKzMxNCw3IEBACiAJCQkJQmJwOTQgPSBCQlBSOTRfREVGQVVMVDsKIAkJCX0KIAotCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXMgKFR4UG93ZXI9JWQsIFI9JWxkLCBCQlBfUjk0PSVkKVxuIiwgX19GVU5DVElPTl9fLCBUeFBvd2VyLCBSLCBCYnA5NCkpOworCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXMgKFR4UG93ZXI9JWQsIFI9JWxkLCBCQlBfUjk0PSVkKVxuIiwgX19mdW5jX18sIFR4UG93ZXIsIFIsIEJicDk0KSk7CiAJCX0KIAkJZWxzZS8vIDUuNSBHSHoKIAkJewpAQCAtMzQxLDcgKzM0MSw3IEBACiAJCQkJUiA9IChVTE9ORykgVHhQb3dlcjsKIAkJCX0KIAotCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXMgKFR4UG93ZXI9JWQsIFI9JWx1KVxuIiwgX19GVU5DVElPTl9fLCBUeFBvd2VyLCBSKSk7CisJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlcyAoVHhQb3dlcj0lZCwgUj0lbHUpXG4iLCBfX2Z1bmNfXywgVHhQb3dlciwgUikpOwogCQl9CiAKIAkJaWYgKHBBZC0+YXRlLkNoYW5uZWwgPD0gMTQpCkBAIC00NTQsNyArNDU0LDcgQEAKIAkJQmJwOTQgPSBCQlBSOTRfREVGQVVMVDsKIAl9CiAKLQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlcyAoVHhQb3dlcj0lZCwgUjM9JWxkLCBCQlBfUjk0PSVkKVxuIiwgX19GVU5DVElPTl9fLCBUeFBvd2VyLCBSLCBCYnA5NCkpOworCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzIChUeFBvd2VyPSVkLCBSMz0lbGQsIEJCUF9SOTQ9JWQpXG4iLCBfX2Z1bmNfXywgVHhQb3dlciwgUiwgQmJwOTQpKTsKIAogCQlpZiAocEFkLT5hdGUuQ2hhbm5lbCA8PSAxNCkKIAkJewpAQCAtMjI2MSw3ICsyMjYxLDcgQEAKIAlVSU5UMzIJCQlGaWxlTGVuZ3RoID0gMDsKIAlVSU5UMzIgCQkJdmFsdWUgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOwogCi0JQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiPT09PiAlcyAodmFsdWU9JWQpXG5cbiIsIF9fRlVOQ1RJT05fXywgdmFsdWUpKTsKKwlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCI9PT0+ICVzICh2YWx1ZT0lZClcblxuIiwgX19mdW5jX18sIHZhbHVlKSk7CiAKIAlpZiAodmFsdWUgPiAwKQogCXsKQEAgLTIyODUsMTQgKzIyODUsMTQgQEAKIAogCQkJaWYgKElTX0VSUihzcmNmKSkKIAkJCXsKLQkJCQlhdGVfcHJpbnQoIiVzIC0gRXJyb3IgJWxkIG9wZW5pbmcgJXNcbiIsIF9fRlVOQ1RJT05fXywgLVBUUl9FUlIoc3JjZiksIHNyYyk7CisJCQkJYXRlX3ByaW50KCIlcyAtIEVycm9yICVsZCBvcGVuaW5nICVzXG4iLCBfX2Z1bmNfXywgLVBUUl9FUlIoc3JjZiksIHNyYyk7CiAJCQkJYnJlYWs7CiAJCQl9CiAKIAkJCS8qIHRoZSBvYmplY3QgbXVzdCBoYXZlIGEgcmVhZCBtZXRob2QgKi8KIAkJCWlmICgoc3JjZi0+Zl9vcCA9PSBOVUxMKSB8fCAoc3JjZi0+Zl9vcC0+cmVhZCA9PSBOVUxMKSkKIAkJCXsKLQkJCQlhdGVfcHJpbnQoIiVzIC0gJXMgZG9lcyBub3QgaGF2ZSBhIHJlYWQgbWV0aG9kXG4iLCBfX0ZVTkNUSU9OX18sIHNyYyk7CisJCQkJYXRlX3ByaW50KCIlcyAtICVzIGRvZXMgbm90IGhhdmUgYSByZWFkIG1ldGhvZFxuIiwgX19mdW5jX18sIHNyYyk7CiAJCQkJYnJlYWs7CiAJCQl9CiAKQEAgLTIzMDUsNyArMjMwNSw3IEBACiAJCQlpZiAoRmlsZUxlbmd0aCAhPSBFRVBST01fU0laRSkKIAkJCXsKIAkJCQlhdGVfcHJpbnQoIiVzOiBlcnJvciBmaWxlIGxlbmd0aCAoPSVkKSBpbiBlMnAuYmluXG4iLAotCQkJCQkgICBfX0ZVTkNUSU9OX18sIEZpbGVMZW5ndGgpOworCQkJCQkgICBfX2Z1bmNfXywgRmlsZUxlbmd0aCk7CiAJCQkJYnJlYWs7CiAJCQl9CiAJCQllbHNlCkBAIC0yMzM3LDcgKzIzMzcsNyBAQAogCQljdXJyZW50LT5mc3VpZCA9IG9yZ2ZzdWlkOwogCQljdXJyZW50LT5mc2dpZCA9IG9yZ2ZzZ2lkOwogCX0KLSAgICBBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCI8PT09ICVzIChyZXQ9JWQpXG4iLCBfX0ZVTkNUSU9OX18sIHJldCkpOworICAgIEFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIjw9PT0gJXMgKHJldD0lZClcbiIsIF9fZnVuY19fLCByZXQpKTsKIAogICAgIHJldHVybiByZXQ7CiAKQEAgLTIzNTAsMTIgKzIzNTAsMTIgQEAKIAlVU0hPUlQgCQkJV3JpdGVFRVBST01bKEVFUFJPTV9TSVpFLzIpXTsKIAlzdHJ1Y3QgaXdyZXEJKndycSA9IChzdHJ1Y3QgaXdyZXEgKilhcmc7CiAKLQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT0+ICVzICh3cnEtPnUuZGF0YS5sZW5ndGggPSAlZClcblxuIiwgX19GVU5DVElPTl9fLCB3cnEtPnUuZGF0YS5sZW5ndGgpKTsKKwlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT0+ICVzICh3cnEtPnUuZGF0YS5sZW5ndGggPSAlZClcblxuIiwgX19mdW5jX18sIHdycS0+dS5kYXRhLmxlbmd0aCkpOwogCiAJaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBFRVBST01fU0laRSkKIAl7CiAJCWF0ZV9wcmludCgiJXM6IGVycm9yIGxlbmd0aCAoPSVkKSBmcm9tIGhvc3RcbiIsCi0JCQkgICBfX0ZVTkNUSU9OX18sIHdycS0+dS5kYXRhLmxlbmd0aCk7CisJCQkgICBfX2Z1bmNfXywgd3JxLT51LmRhdGEubGVuZ3RoKTsKIAkJcmV0dXJuIEZBTFNFOwogCX0KIAllbHNlLyogKHdycS0+dS5kYXRhLmxlbmd0aCA9PSBFRVBST01fU0laRSkgKi8KQEAgLTIzNzQsNyArMjM3NCw3IEBACiAJCX0gd2hpbGUoRkFMU0UpOwogCQl9CiAKLSAgICBBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8PT09ICVzXG4iLCBfX0ZVTkNUSU9OX18pKTsKKyAgICBBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8PT09ICVzXG4iLCBfX2Z1bmNfXykpOwogCiAgICAgcmV0dXJuIFRSVUU7CiAKQEAgLTQwODMsNyArNDA4Myw3IEBACiAKIAlDb21tYW5kX0lkID0gbnRvaHMocFJhQ2ZnLT5jb21tYW5kX2lkKTsKIAotCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiXG4lczogQ29tbWFuZF9JZCA9IDB4JTA0eCAhXG4iLCBfX0ZVTkNUSU9OX18sIENvbW1hbmRfSWQpKTsKKwlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlxuJXM6IENvbW1hbmRfSWQgPSAweCUwNHggIVxuIiwgX19mdW5jX18sIENvbW1hbmRfSWQpKTsKIAogCXN3aXRjaCAoQ29tbWFuZF9JZCkKIAl7CkBAIC02MTE3LDcgKzYxMTcsNyBAQAogCQkJCQlwQWQtPmF0ZS5UeEFudGVubmFTZWwgPSAyOwogCQkgICAgICAgICAgICBicmVhazsKIAkJICAgICAgICBkZWZhdWx0OgotCQkgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlcyAtLSBTdGguIHdyb25nISAgOiByZXR1cm4gRkFMU0U7IFxuIiwgX19GVU5DVElPTl9fKSk7CisJCSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzIC0tIFN0aC4gd3JvbmchICA6IHJldHVybiBGQUxTRTsgXG4iLCBfX2Z1bmNfXykpOwogCQkgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAJCSAgICB9CiAJCQlicmVhazsvKiBjYXNlIEJCUF9SMSAqLwpAQCAtNjE1NSwxMyArNjE1NSwxMyBAQAogCQkJCQlwQWQtPmF0ZS5SeEFudGVubmFTZWwgPSAzOwogCQkgICAgICAgICAgICBicmVhazsKIAkJICAgICAgICBkZWZhdWx0OgotCQkgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlcyAtLSBJbXBvc3NpYmxlISAgOiByZXR1cm4gRkFMU0U7IFxuIiwgX19GVU5DVElPTl9fKSk7CisJCSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzIC0tIEltcG9zc2libGUhICA6IHJldHVybiBGQUxTRTsgXG4iLCBfX2Z1bmNfXykpOwogCQkgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAJCSAgICB9CiAJCQlicmVhazsvKiBjYXNlIEJCUF9SMyAqLwogCiAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlcyAtLSBTdGguIHdyb25nISAgOiByZXR1cm4gRkFMU0U7IFxuIiwgX19GVU5DVElPTl9fKSk7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlcyAtLSBTdGguIHdyb25nISAgOiByZXR1cm4gRkFMU0U7IFxuIiwgX19mdW5jX18pKTsKICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKIAogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvcnRfbGludXguYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvcnRfbGludXguYwppbmRleCBmMmVhOGViLi45OTJlM2QxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL3J0X2xpbnV4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9ydF9saW51eC5jCkBAIC00MDQsNyArNDA0LDcgQEAKICAJc2tiX3B1dChHRVRfT1NfUEtUX1RZUEUocFBhY2tldCksIEhlYWRlckxlbitEYXRhTGVuKTsKIAogCVJUTVBfU0VUX1BBQ0tFVF9TT1VSQ0UocFBhY2tldCwgUEtUU1JDX05ESVMpOwotLy8JcHJpbnRrKCIlcyA6IHBQYWNrZXQgPSAlcCwgbGVuID0gJWRcbiIsIF9fRlVOQ1RJT05fXywgcFBhY2tldCwgR0VUX09TX1BLVF9MRU4ocFBhY2tldCkpOworLy8JcHJpbnRrKCIlcyA6IHBQYWNrZXQgPSAlcCwgbGVuID0gJWRcbiIsIF9fZnVuY19fLCBwUGFja2V0LCBHRVRfT1NfUEtUX0xFTihwUGFja2V0KSk7CiAJKnBwUGFja2V0ID0gcFBhY2tldDsKIAlyZXR1cm4gTkRJU19TVEFUVVNfU1VDQ0VTUzsKIH0KQEAgLTgxNCwxMyArODE0LDEzIEBACiAKIAlpZiAoZXZlbnRfdGFibGVfbGVuID09IDApCiAJewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlcyA6IFRoZSB0eXBlKCUweDAyeCkgaXMgbm90IHZhbGlkLlxuIiwgX19GVU5DVElPTl9fLCB0eXBlKSk7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzIDogVGhlIHR5cGUoJTB4MDJ4KSBpcyBub3QgdmFsaWQuXG4iLCBfX2Z1bmNfXywgdHlwZSkpOwogCQlyZXR1cm47CiAJfQogCiAJaWYgKGV2ZW50ID49IGV2ZW50X3RhYmxlX2xlbikKIAl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzIDogVGhlIGV2ZW50KCUweDAyeCkgaXMgbm90IHZhbGlkLlxuIiwgX19GVU5DVElPTl9fLCBldmVudCkpOworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlcyA6IFRoZSBldmVudCglMHgwMngpIGlzIG5vdCB2YWxpZC5cbiIsIF9fZnVuY19fLCBldmVudCkpOwogCQlyZXR1cm47CiAJfQogCkBAIC04NTgsMTQgKzg1OCwxNCBAQAogCQkvL3NlbmQgd2lyZWxlc3MgZXZlbnQKIAkgICAgd2lyZWxlc3Nfc2VuZF9ldmVudChwQWQtPm5ldF9kZXYsIElXRVZDVVNUT00sICZ3cnF1LCBwQnVmKTsKIAotCQkvL0RCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzIDogJXNcbiIsIF9fRlVOQ1RJT05fXywgcEJ1ZikpOworCQkvL0RCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzIDogJXNcbiIsIF9fZnVuY19fLCBwQnVmKSk7CiAKIAkJa2ZyZWUocEJ1Zik7CiAJfQogCWVsc2UKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXMgOiBDYW4ndCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHdpcmVsZXNzIGV2ZW50LlxuIiwgX19GVU5DVElPTl9fKSk7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzIDogQ2FuJ3QgYWxsb2NhdGUgbWVtb3J5IGZvciB3aXJlbGVzcyBldmVudC5cbiIsIF9fZnVuY19fKSk7CiAjZWxzZQotCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzIDogVGhlIFdpcmVsZXNzIEV4dGVuc2lvbiBNVVNUIGJlIHYxNSBvciBuZXdlci5cbiIsIF9fRlVOQ1RJT05fXykpOworCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzIDogVGhlIFdpcmVsZXNzIEV4dGVuc2lvbiBNVVNUIGJlIHYxNSBvciBuZXdlci5cbiIsIF9fZnVuY19fKSk7CiAjZW5kaWYgIC8qIFdJUkVMRVNTX0VYVCA+PSAxNSAqLwogfQogCkBAIC04ODksMTMgKzg4OSwxMyBAQAogICAgIEFTU0VSVChwUnhCbGstPnBSeFBhY2tldCk7CiAgICAgaWYgKHBSeEJsay0+RGF0YVNpemUgPCAxMCkKICAgICB7Ci0gICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzIDogU2l6ZSBpcyB0b28gc21hbGwhICglZClcbiIsIF9fRlVOQ1RJT05fXywgcFJ4QmxrLT5EYXRhU2l6ZSkpOworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlcyA6IFNpemUgaXMgdG9vIHNtYWxsISAoJWQpXG4iLCBfX2Z1bmNfXywgcFJ4QmxrLT5EYXRhU2l6ZSkpOwogCQlnb3RvIGVycl9mcmVlX3NrX2J1ZmY7CiAgICAgfQogCiAgICAgaWYgKHBSeEJsay0+RGF0YVNpemUgKyBzaXplb2Yod2xhbl9uZ19wcmlzbTJfaGVhZGVyKSA+IFJYX0JVRkZFUl9BR0dSRVNJWkUpCiAgICAgewotICAgICAgICBEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlcyA6IFNpemUgaXMgdG9vIGxhcmdlISAoJWQpXG4iLCBfX0ZVTkNUSU9OX18sIHBSeEJsay0+RGF0YVNpemUgKyBzaXplb2Yod2xhbl9uZ19wcmlzbTJfaGVhZGVyKSkpOworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlcyA6IFNpemUgaXMgdG9vIGxhcmdlISAoJWQpXG4iLCBfX2Z1bmNfXywgcFJ4QmxrLT5EYXRhU2l6ZSArIHNpemVvZih3bGFuX25nX3ByaXNtMl9oZWFkZXIpKSk7CiAJCWdvdG8gZXJyX2ZyZWVfc2tfYnVmZjsKICAgICB9CiAKQEAgLTk1MSw3ICs5NTEsNyBAQAogCiAgICAgaWYgKHNrYl9oZWFkcm9vbShwT1NQa3QpIDwgKHNpemVvZih3bGFuX25nX3ByaXNtMl9oZWFkZXIpKyBoZWFkZXJfbGVuKSkgewogICAgICAgICBpZiAocHNrYl9leHBhbmRfaGVhZChwT1NQa3QsIChzaXplb2Yod2xhbl9uZ19wcmlzbTJfaGVhZGVyKSArIGhlYWRlcl9sZW4pLCAwLCBHRlBfQVRPTUlDKSkgewotCSAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXMgOiBSZWFsbG9jYXRlIGhlYWRlciBzaXplIG9mIHNrX2J1ZmYgZmFpbCFcbiIsIF9fRlVOQ1RJT05fXykpOworCSAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXMgOiBSZWFsbG9jYXRlIGhlYWRlciBzaXplIG9mIHNrX2J1ZmYgZmFpbCFcbiIsIF9fZnVuY19fKSk7CiAJCQlnb3RvIGVycl9mcmVlX3NrX2J1ZmY7CiAJICAgIH0gLy9lbmQgaWYKICAgICB9IC8vZW5kIGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL3J0X2xpbnV4LmggYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL3J0X2xpbnV4LmgKaW5kZXggODE0Mjk3NS4uODU5ZjljZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9ydF9saW51eC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvcnRfbGludXguaApAQCAtMTI0LDcgKzEyNCw3IEBACiAjZGVmaW5lIFJUX01PRF9JTkNfVVNFX0NPVU5UKCkgXAogCWlmICghdHJ5X21vZHVsZV9nZXQoVEhJU19NT0RVTEUpKSBcCiAJeyBcCi0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzOiBjYW5ub3QgcmVzZXJ2ZSBtb2R1bGVcbiIsIF9fRlVOQ1RJT05fXykpOyBcCisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzOiBjYW5ub3QgcmVzZXJ2ZSBtb2R1bGVcbiIsIF9fZnVuY19fKSk7IFwKIAkJcmV0dXJuIC0xOyBcCiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL3J0X21haW5fZGV2LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL3J0X21haW5fZGV2LmMKaW5kZXggYjk5MGY4YS4uMzEzZWNlYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9ydF9tYWluX2Rldi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvcnRfbWFpbl9kZXYuYwpAQCAtMTU1NCw3ICsxNTU0LDcgQEAKICNpZiAwCiAvLwlpZiAoKHBrdC0+ZGF0YVswXSAmIDB4MSkgPT0gMCkKIAl7Ci0JCS8vaGV4X2R1bXAoX19GVU5DVElPTl9fLCBwa3QtPmRhdGEsIHBrdC0+bGVuKTsKKwkJLy9oZXhfZHVtcChfX2Z1bmNfXywgcGt0LT5kYXRhLCBwa3QtPmxlbik7CiAJCXByaW50aygicFBhY2tldCA9ICV4XG4iLCBwUGFja2V0KTsKIAl9CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvcnRfcHJvZmlsZS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9ydF9wcm9maWxlLmMKaW5kZXggYzQ0NzRhNi4uNDY3ZmVhMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9ydF9wcm9maWxlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9ydF9wcm9maWxlLmMKQEAgLTEwMjQsNyArMTAyNCw3IEBACiAJCQkJCQkJCXBBZC0+TWxtZUF1eC5Tc2lkTGVuID0gcEFkLT5Db21tb25DZmcuU3NpZExlbjsKIAkJCQkJCQkJTmRpc1plcm9NZW1vcnkocEFkLT5NbG1lQXV4LlNzaWQsIE5ESVNfODAyXzExX0xFTkdUSF9TU0lEKTsKIAkJCQkJCQkJTmRpc01vdmVNZW1vcnkocEFkLT5NbG1lQXV4LlNzaWQsIHRtcGJ1ZiwgcEFkLT5NbG1lQXV4LlNzaWRMZW4pOwotCQkJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6KFNTSUQ9JXMpXG4iLCBfX0ZVTkNUSU9OX18sIHRtcGJ1ZikpOworCQkJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6KFNTSUQ9JXMpXG4iLCBfX2Z1bmNfXywgdG1wYnVmKSk7CiAJCQkJCQkJfQogCQkJCQkJfQogCQkJCQl9CkBAIC0xMDQzLDcgKzEwNDMsNyBAQAogCQkJCQkJCQlwQWQtPlN0YUNmZy5Cc3NUeXBlID0gQlNTX0lORlJBOwogCQkJCQkJCS8vIFJlc2V0IFJhbGluayBzdXBwbGljYW50IHRvIG5vdCB1c2UsIGl0IHdpbGwgYmUgc2V0IHRvIHN0YXJ0IHdoZW4gVUkgc2V0IFBNSyBrZXkKIAkJCQkJCQlwQWQtPlN0YUNmZy5XcGFTdGF0ZSA9IFNTX05PVFVTRTsKLQkJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6KE5ldHdvcmtUeXBlPSVkKVxuIiwgX19GVU5DVElPTl9fLCBwQWQtPlN0YUNmZy5Cc3NUeXBlKSk7CisJCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OihOZXR3b3JrVHlwZT0lZClcbiIsIF9fZnVuY19fLCBwQWQtPlN0YUNmZy5Cc3NUeXBlKSk7CiAJCQkJCQl9CiAJCQkJCX0KICNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KQEAgLTEzNDEsNyArMTM0MSw3IEBACiAKIAkJCQkgICAgICAgICAgICAgICAgICAgICAgICBwQWQtPlN0YUNmZy5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9OT1RfU0VDVVJFRDsKIAotCQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjooRW5jcnlwVHlwZT0lZClcbiIsIF9fRlVOQ1RJT05fXywgcEFkLT5TdGFDZmcuV2VwU3RhdHVzKSk7CisJCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OihFbmNyeXBUeXBlPSVkKVxuIiwgX19mdW5jX18sIHBBZC0+U3RhQ2ZnLldlcFN0YXR1cykpOwogCQkJCQkJfQogI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwogCQkJCQl9CkBAIC0xMzY4LDcgKzEzNjgsNyBAQAogCQkJCQkJCXBBZC0+U3RhQ2ZnLmJNaXhDaXBoZXIgCQk9IEZBTFNFOwogCiAJCQkJCQkJLy9SVE1QTWFrZVJTTklFKHBBZCwgcEFkLT5TdGFDZmcuQXV0aE1vZGUsIHBBZC0+U3RhQ2ZnLldlcFN0YXR1cywgMCk7Ci0JCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OihFbmNyeXBUeXBlPSVkKVxuIiwgX19GVU5DVElPTl9fLCBwQWQtPlN0YUNmZy5XZXBTdGF0dXMpKTsKKwkJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6KEVuY3J5cFR5cGU9JWQpXG4iLCBfX2Z1bmNfXywgcEFkLT5TdGFDZmcuV2VwU3RhdHVzKSk7CiAJCQkJCQl9CiAjZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCiAJCQkJCX0KQEAgLTE0MDUsNyArMTQwNSw3IEBACiAJCQkJCQkJZWxzZQogCQkJCQkJCXsKIAkJCQkJCQkJZXJyID0gMTsKLQkJCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXM6OihXUEFQU0sga2V5LXN0cmluZyByZXF1aXJlZCA4IH4gNjQgY2hhcmFjdGVycyEpXG4iLCBfX0ZVTkNUSU9OX18pKTsKKwkJCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXM6OihXUEFQU0sga2V5LXN0cmluZyByZXF1aXJlZCA4IH4gNjQgY2hhcmFjdGVycyEpXG4iLCBfX2Z1bmNfXykpOwogCQkJCQkJCX0KIAogCQkJCQkJCWlmIChlcnIgPT0gMCkKQEAgLTE0MzYsNyArMTQzNiw3IEBACiAJCQkJCQkJCQlwQWQtPlN0YUNmZy5XcGFTdGF0ZSA9IFNTX05PVFVTRTsKIAkJCQkJCQkJfQogCi0JCQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjooV1BBUFNLPSVzKVxuIiwgX19GVU5DVElPTl9fLCB0bXBidWYpKTsKKwkJCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OihXUEFQU0s9JXMpXG4iLCBfX2Z1bmNfXywgdG1wYnVmKSk7CiAJCQkJCQkJfQogCQkJCQkJfQogCQkJCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL3J0bXBfZGVmLmggYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL3J0bXBfZGVmLmgKaW5kZXggOWI4NjMyNS4uYzBmNzU2MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9ydG1wX2RlZi5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvcnRtcF9kZWYuaApAQCAtMzQyLDcgKzM0Miw3IEBACiAvKiBzYW5pdHkgY2hlY2sgZm9yIGFwaWR4ICovCiAjZGVmaW5lIE1CU1NfTVJfQVBJRFhfU0FOSVRZX0NIRUNLKGFwaWR4KSBcCiAgICAgeyBpZiAoYXBpZHggPiBNQVhfTUJTU0lEX05VTSkgeyBcCi0gICAgICAgICAgcHJpbnRrKCIlcz4gRXJyb3IhIGFwaWR4ID0gJWQgPiBNQVhfTUJTU0lEX05VTSFcbiIsIF9fRlVOQ1RJT05fXywgYXBpZHgpOyBcCisgICAgICAgICAgcHJpbnRrKCIlcz4gRXJyb3IhIGFwaWR4ID0gJWQgPiBNQVhfTUJTU0lEX05VTSFcbiIsIF9fZnVuY19fLCBhcGlkeCk7IFwKIAkgIGFwaWR4ID0gTUFJTl9NQlNTSUQ7IH0gfQogCiAjZGVmaW5lIFZBTElEX1dDSUQoX3djaWQpCSgoX3djaWQpID4gMCAmJiAoX3djaWQpIDwgTUFYX0xFTl9PRl9NQUNfVEFCTEUgKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9zdGFfaW9jdGwuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvc3RhX2lvY3RsLmMKaW5kZXggNDIyZjM5Zi4uOTFmMGZhYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9zdGFfaW9jdGwuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL3N0YV9pb2N0bC5jCkBAIC0yMjI0LDcgKzIyMjQsNyBAQAogCQkJd3JxLT5sZW5ndGggPSBzdHJsZW4oZXh0cmEpICsgMTsgLy8gMTogc2l6ZSBvZiAnXDAnCiAJCQlicmVhazsKICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzIC0gdW5rbm93IHN1YmNtZCA9ICVkXG4iLCBfX0ZVTkNUSU9OX18sIHN1YmNtZCkpOworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXMgLSB1bmtub3cgc3ViY21kID0gJWRcbiIsIF9fZnVuY19fLCBzdWJjbWQpKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgIH0KIApAQCAtMjI0Myw3ICsyMjQzLDcgQEAKIAlNTE1FX0RJU0FTU09DX1JFUV9TVFJVQ1QJRGlzQXNzb2NSZXE7CiAJTUxNRV9ERUFVVEhfUkVRX1NUUlVDVCAgICAgIERlQXV0aFJlcTsKIAotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT0+ICVzXG4iLCBfX0ZVTkNUSU9OX18pKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT09PiAlc1xuIiwgX19mdW5jX18pKTsKIAogCWlmIChwTWxtZSA9PSBOVUxMKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTIyNTIsNyArMjI1Miw3IEBACiAJewogI2lmZGVmIElXX01MTUVfREVBVVRICiAJCWNhc2UgSVdfTUxNRV9ERUFVVEg6Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT09PiAlcyAtIElXX01MTUVfREVBVVRIXG4iLCBfX0ZVTkNUSU9OX18pKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT0+ICVzIC0gSVdfTUxNRV9ERUFVVEhcbiIsIF9fZnVuY19fKSk7CiAJCQlDT1BZX01BQ19BRERSKERlQXV0aFJlcS5BZGRyLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CiAJCQlEZUF1dGhSZXEuUmVhc29uID0gcE1sbWUtPnJlYXNvbl9jb2RlOwogCQkJTXNnRWxlbS5Nc2dMZW4gPSBzaXplb2YoTUxNRV9ERUFVVEhfUkVRX1NUUlVDVCk7CkBAIC0yMjY3LDcgKzIyNjcsNyBAQAogI2VuZGlmIC8vIElXX01MTUVfREVBVVRIIC8vCiAjaWZkZWYgSVdfTUxNRV9ESVNBU1NPQwogCQljYXNlIElXX01MTUVfRElTQVNTT0M6Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT09PiAlcyAtIElXX01MTUVfRElTQVNTT0NcbiIsIF9fRlVOQ1RJT05fXykpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PT4gJXMgLSBJV19NTE1FX0RJU0FTU09DXG4iLCBfX2Z1bmNfXykpOwogCQkJQ09QWV9NQUNfQUREUihEaXNBc3NvY1JlcS5BZGRyLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CiAJCQlEaXNBc3NvY1JlcS5SZWFzb24gPSAgcE1sbWUtPnJlYXNvbl9jb2RlOwogCkBAIC0yMjgxLDcgKzIyODEsNyBAQAogCQkJYnJlYWs7CiAjZW5kaWYgLy8gSVdfTUxNRV9ESVNBU1NPQyAvLwogCQlkZWZhdWx0OgotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PT4gJXMgLSBVbmtub3cgQ29tbWFuZFxuIiwgX19GVU5DVElPTl9fKSk7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT09PiAlcyAtIFVua25vdyBDb21tYW5kXG4iLCBfX2Z1bmNfXykpOwogCQkJYnJlYWs7CiAJfQogCkBAIC0yMzE0LDcgKzIzMTQsNyBAQAogICAgICAgICAgICAgZWxzZSBpZiAocGFyYW0tPnZhbHVlID09IElXX0FVVEhfV1BBX1ZFUlNJT05fV1BBMikKICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSzsKIAotICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OklXX0FVVEhfV1BBX1ZFUlNJT04gLSBwYXJhbS0+dmFsdWUgPSAlZCFcbiIsIF9fRlVOQ1RJT05fXywgcGFyYW0tPnZhbHVlKSk7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6SVdfQVVUSF9XUEFfVkVSU0lPTiAtIHBhcmFtLT52YWx1ZSA9ICVkIVxuIiwgX19mdW5jX18sIHBhcmFtLT52YWx1ZSkpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgCWNhc2UgSVdfQVVUSF9DSVBIRVJfUEFJUldJU0U6CiAgICAgICAgICAgICBpZiAocGFyYW0tPnZhbHVlID09IElXX0FVVEhfQ0lQSEVSX05PTkUpCkBAIC0yMzQ1LDcgKzIzNDUsNyBAQAogICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuT3JpZ1dlcFN0YXR1cyA9IHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzOwogICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuUGFpckNpcGhlciA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQ7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6SVdfQVVUSF9DSVBIRVJfUEFJUldJU0UgLSBwYXJhbS0+dmFsdWUgPSAlZCFcbiIsIF9fRlVOQ1RJT05fXywgcGFyYW0tPnZhbHVlKSk7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6SVdfQVVUSF9DSVBIRVJfUEFJUldJU0UgLSBwYXJhbS0+dmFsdWUgPSAlZCFcbiIsIF9fZnVuY19fLCBwYXJhbS0+dmFsdWUpKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgIAljYXNlIElXX0FVVEhfQ0lQSEVSX0dST1VQOgogICAgICAgICAgICAgaWYgKHBhcmFtLT52YWx1ZSA9PSBJV19BVVRIX0NJUEhFUl9OT05FKQpAQCAtMjM2NSw3ICsyMzY1LDcgQEAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZDsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjpJV19BVVRIX0NJUEhFUl9HUk9VUCAtIHBhcmFtLT52YWx1ZSA9ICVkIVxuIiwgX19GVU5DVElPTl9fLCBwYXJhbS0+dmFsdWUpKTsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjpJV19BVVRIX0NJUEhFUl9HUk9VUCAtIHBhcmFtLT52YWx1ZSA9ICVkIVxuIiwgX19mdW5jX18sIHBhcmFtLT52YWx1ZSkpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgCWNhc2UgSVdfQVVUSF9LRVlfTUdNVDoKICAgICAgICAgICAgIGlmIChwYXJhbS0+dmFsdWUgPT0gSVdfQVVUSF9LRVlfTUdNVF84MDJfMVgpCkBAIC0yMzk1LDcgKzIzOTUsNyBAQAogICAgICAgICAgICAgICAgIC8vcEFkYXB0ZXItPlN0YUNmZy5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEOwogCQkJCVNUQV9QT1JUX1NFQ1VSRUQocEFkYXB0ZXIpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OklXX0FVVEhfS0VZX01HTVQgLSBwYXJhbS0+dmFsdWUgPSAlZCFcbiIsIF9fRlVOQ1RJT05fXywgcGFyYW0tPnZhbHVlKSk7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6SVdfQVVUSF9LRVlfTUdNVCAtIHBhcmFtLT52YWx1ZSA9ICVkIVxuIiwgX19mdW5jX18sIHBhcmFtLT52YWx1ZSkpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgCWNhc2UgSVdfQVVUSF9SWF9VTkVOQ1JZUFRFRF9FQVBPTDoKICAgICAgICAgICAgIGJyZWFrOwpAQCAtMjQwOCw3ICsyNDA4LDcgQEAKICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLlBhaXJDaXBoZXIgPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7CiAgICAgICAgIAkgICAgcEFkYXB0ZXItPlN0YUNmZy5Hcm91cENpcGhlciA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKICAgICAgICAgICAgIH0qLwotICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OklXX0FVVEhfUFJJVkFDWV9JTlZPS0VEIC0gcGFyYW0tPnZhbHVlID0gJWQhXG4iLCBfX0ZVTkNUSU9OX18sIHBhcmFtLT52YWx1ZSkpOworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OklXX0FVVEhfUFJJVkFDWV9JTlZPS0VEIC0gcGFyYW0tPnZhbHVlID0gJWQhXG4iLCBfX2Z1bmNfXywgcGFyYW0tPnZhbHVlKSk7CiAgICAgCQlicmVhazsKICAgICAJY2FzZSBJV19BVVRIX0RST1BfVU5FTkNSWVBURUQ6CiAgICAgICAgICAgICBpZiAocGFyYW0tPnZhbHVlICE9IDApCkBAIC0yNDE4LDcgKzI0MTgsNyBAQAogICAgICAgICAgICAgICAgIC8vcEFkYXB0ZXItPlN0YUNmZy5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEOwogCQkJCVNUQV9QT1JUX1NFQ1VSRUQocEFkYXB0ZXIpOwogCQkJfQotICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OklXX0FVVEhfV1BBX1ZFUlNJT04gLSBwYXJhbS0+dmFsdWUgPSAlZCFcbiIsIF9fRlVOQ1RJT05fXywgcGFyYW0tPnZhbHVlKSk7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6SVdfQVVUSF9XUEFfVkVSU0lPTiAtIHBhcmFtLT52YWx1ZSA9ICVkIVxuIiwgX19mdW5jX18sIHBhcmFtLT52YWx1ZSkpOwogICAgIAkJYnJlYWs7CiAgICAgCWNhc2UgSVdfQVVUSF84MDIxMV9BVVRIX0FMRzoKIAkJCWlmIChwYXJhbS0+dmFsdWUgJiBJV19BVVRIX0FMR19TSEFSRURfS0VZKQpAQCAtMjQzMSwxMCArMjQzMSwxMCBAQAogCQkJfQogICAgICAgICAgICAgZWxzZQogCQkJCXJldHVybiAtRUlOVkFMOwotICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OklXX0FVVEhfODAyMTFfQVVUSF9BTEcgLSBwYXJhbS0+dmFsdWUgPSAlZCFcbiIsIF9fRlVOQ1RJT05fXywgcGFyYW0tPnZhbHVlKSk7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6SVdfQVVUSF84MDIxMV9BVVRIX0FMRyAtIHBhcmFtLT52YWx1ZSA9ICVkIVxuIiwgX19mdW5jX18sIHBhcmFtLT52YWx1ZSkpOwogCQkJYnJlYWs7CiAgICAgCWNhc2UgSVdfQVVUSF9XUEFfRU5BQkxFRDoKLSAgICAJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjpJV19BVVRIX1dQQV9FTkFCTEVEIC0gRHJpdmVyIHN1cHBvcnRzIFdQQSEocGFyYW0tPnZhbHVlID0gJWQpXG4iLCBfX0ZVTkNUSU9OX18sIHBhcmFtLT52YWx1ZSkpOworICAgIAkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OklXX0FVVEhfV1BBX0VOQUJMRUQgLSBEcml2ZXIgc3VwcG9ydHMgV1BBIShwYXJhbS0+dmFsdWUgPSAlZClcbiIsIF9fZnVuY19fLCBwYXJhbS0+dmFsdWUpKTsKICAgICAJCWJyZWFrOwogICAgIAlkZWZhdWx0OgogICAgIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwpAQCAtMjU0Miw3ICsyNTQyLDcgQEAKIAkJcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLkNpcGhlckFsZyA9IENJUEhFUl9OT05FOwogCQlBc2ljUmVtb3ZlU2hhcmVkS2V5RW50cnkocEFkYXB0ZXIsIDAsIChVQ0hBUilrZXlJZHgpOwogICAgICAgICBOZGlzWmVyb01lbW9yeSgmcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLCBzaXplb2YoQ0lQSEVSX0tFWSkpOwotICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6UmVtb3ZlIGFsbCBrZXlzIShlbmNvZGluZy0+ZmxhZ3MgPSAleClcbiIsIF9fRlVOQ1RJT05fXywgZW5jb2RpbmctPmZsYWdzKSk7CisgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjpSZW1vdmUgYWxsIGtleXMhKGVuY29kaW5nLT5mbGFncyA9ICV4KVxuIiwgX19mdW5jX18sIGVuY29kaW5nLT5mbGFncykpOwogICAgIH0KIAkJCQkJZWxzZQogICAgIHsKQEAgLTI1NTQsMTUgKzI1NTQsMTUgQEAKICAgICAgICAgaWYgKGV4dC0+ZXh0X2ZsYWdzICYgSVdfRU5DT0RFX0VYVF9TRVRfVFhfS0VZKQogICAgICAgICB7CiAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCA9IGtleUlkeDsKLSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjpEZWZhdWx0S2V5SWQgPSAlZFxuIiwgX19GVU5DVElPTl9fLCBwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCkpOworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OkRlZmF1bHRLZXlJZCA9ICVkXG4iLCBfX2Z1bmNfXywgcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWQpKTsKICAgICAgICAgfQogCiAgICAgICAgIHN3aXRjaCAoYWxnKSB7CiAgICAgCQljYXNlIElXX0VOQ09ERV9BTEdfTk9ORToKLSAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6SVdfRU5DT0RFX0FMR19OT05FXG4iLCBfX0ZVTkNUSU9OX18pKTsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6SVdfRU5DT0RFX0FMR19OT05FXG4iLCBfX2Z1bmNfXykpOwogICAgIAkJCWJyZWFrOwogICAgIAkJY2FzZSBJV19FTkNPREVfQUxHX1dFUDoKLSAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6SVdfRU5DT0RFX0FMR19XRVAgLSBleHQtPmtleV9sZW4gPSAlZCwga2V5SWR4ID0gJWRcbiIsIF9fRlVOQ1RJT05fXywgZXh0LT5rZXlfbGVuLCBrZXlJZHgpKTsKKyAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6SVdfRU5DT0RFX0FMR19XRVAgLSBleHQtPmtleV9sZW4gPSAlZCwga2V5SWR4ID0gJWRcbiIsIF9fZnVuY19fLCBleHQtPmtleV9sZW4sIGtleUlkeCkpOwogICAgIAkJCWlmIChleHQtPmtleV9sZW4gPT0gTUFYX1dFUF9LRVlfU0laRSkKICAgICAgICAgICAgICAgICB7CiAgICAgICAgIAkJCXBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5LZXlMZW4gPSBNQVhfV0VQX0tFWV9TSVpFOwpAQCAtMjU5NSw3ICsyNTk1LDcgQEAKIAkJCQl9CiAgICAgCQkJYnJlYWs7CiAgICAgICAgICAgICBjYXNlIElXX0VOQ09ERV9BTEdfVEtJUDoKLSAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6SVdfRU5DT0RFX0FMR19US0lQIC0ga2V5SWR4ID0gJWQsIGV4dC0+a2V5X2xlbiA9ICVkXG4iLCBfX0ZVTkNUSU9OX18sIGtleUlkeCwgZXh0LT5rZXlfbGVuKSk7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OklXX0VOQ09ERV9BTEdfVEtJUCAtIGtleUlkeCA9ICVkLCBleHQtPmtleV9sZW4gPSAlZFxuIiwgX19mdW5jX18sIGtleUlkeCwgZXh0LT5rZXlfbGVuKSk7CiAgICAgICAgICAgICAgICAgaWYgKGV4dC0+a2V5X2xlbiA9PSAzMikKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChleHQtPmV4dF9mbGFncyAmIElXX0VOQ09ERV9FWFRfU0VUX1RYX0tFWSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvdG1wNjAgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL3RtcDYwCmluZGV4IDk5MjA5NmEuLjk3NWU0NDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvdG1wNjAKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC90bXA2MApAQCAtMjIyNCw3ICsyMjI0LDcgQEAKIAkJCXdycS0+bGVuZ3RoID0gc3RybGVuKGV4dHJhKSArIDE7IC8vIDE6IHNpemUgb2YgJ1wwJwogCQkJYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlcyAtIHVua25vdyBzdWJjbWQgPSAlZFxuIiwgX19GVU5DVElPTl9fLCBzdWJjbWQpKTsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzIC0gdW5rbm93IHN1YmNtZCA9ICVkXG4iLCBfX2Z1bmNfXywgc3ViY21kKSk7CiAgICAgICAgICAgICBicmVhazsKICAgICB9CiAKQEAgLTIyNDMsNyArMjI0Myw3IEBACiAJTUxNRV9ESVNBU1NPQ19SRVFfU1RSVUNUCURpc0Fzc29jUmVxOwogCU1MTUVfREVBVVRIX1JFUV9TVFJVQ1QgICAgICBEZUF1dGhSZXE7CiAKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT09PiAlc1xuIiwgX19GVU5DVElPTl9fKSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PT4gJXNcbiIsIF9fZnVuY19fKSk7CiAKIAlpZiAocE1sbWUgPT0gTlVMTCkKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0yMjUyLDcgKzIyNTIsNyBAQAogCXsKICNpZmRlZiBJV19NTE1FX0RFQVVUSAogCQljYXNlIElXX01MTUVfREVBVVRIOgotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PT4gJXMgLSBJV19NTE1FX0RFQVVUSFxuIiwgX19GVU5DVElPTl9fKSk7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT09PiAlcyAtIElXX01MTUVfREVBVVRIXG4iLCBfX2Z1bmNfXykpOwogCQkJQ09QWV9NQUNfQUREUihEZUF1dGhSZXEuQWRkciwgcEFkLT5Db21tb25DZmcuQnNzaWQpOwogCQkJRGVBdXRoUmVxLlJlYXNvbiA9IHBNbG1lLT5yZWFzb25fY29kZTsKIAkJCU1zZ0VsZW0uTXNnTGVuID0gc2l6ZW9mKE1MTUVfREVBVVRIX1JFUV9TVFJVQ1QpOwpAQCAtMjI2Nyw3ICsyMjY3LDcgQEAKICNlbmRpZiAvLyBJV19NTE1FX0RFQVVUSCAvLwogI2lmZGVmIElXX01MTUVfRElTQVNTT0MKIAkJY2FzZSBJV19NTE1FX0RJU0FTU09DOgotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PT4gJXMgLSBJV19NTE1FX0RJU0FTU09DXG4iLCBfX0ZVTkNUSU9OX18pKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT0+ICVzIC0gSVdfTUxNRV9ESVNBU1NPQ1xuIiwgX19mdW5jX18pKTsKIAkJCUNPUFlfTUFDX0FERFIoRGlzQXNzb2NSZXEuQWRkciwgcEFkLT5Db21tb25DZmcuQnNzaWQpOwogCQkJRGlzQXNzb2NSZXEuUmVhc29uID0gIHBNbG1lLT5yZWFzb25fY29kZTsKIApAQCAtMjI4MSw3ICsyMjgxLDcgQEAKIAkJCWJyZWFrOwogI2VuZGlmIC8vIElXX01MTUVfRElTQVNTT0MgLy8KIAkJZGVmYXVsdDoKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT0+ICVzIC0gVW5rbm93IENvbW1hbmRcbiIsIF9fRlVOQ1RJT05fXykpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PT4gJXMgLSBVbmtub3cgQ29tbWFuZFxuIiwgX19mdW5jX18pKTsKIAkJCWJyZWFrOwogCX0KIApAQCAtMjMxNCw3ICsyMzE0LDcgQEAKICAgICAgICAgICAgIGVsc2UgaWYgKHBhcmFtLT52YWx1ZSA9PSBJV19BVVRIX1dQQV9WRVJTSU9OX1dQQTIpCiAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0s7CiAKLSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjpJV19BVVRIX1dQQV9WRVJTSU9OIC0gcGFyYW0tPnZhbHVlID0gJWQhXG4iLCBfX0ZVTkNUSU9OX18sIHBhcmFtLT52YWx1ZSkpOworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OklXX0FVVEhfV1BBX1ZFUlNJT04gLSBwYXJhbS0+dmFsdWUgPSAlZCFcbiIsIF9fZnVuY19fLCBwYXJhbS0+dmFsdWUpKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgIAljYXNlIElXX0FVVEhfQ0lQSEVSX1BBSVJXSVNFOgogICAgICAgICAgICAgaWYgKHBhcmFtLT52YWx1ZSA9PSBJV19BVVRIX0NJUEhFUl9OT05FKQpAQCAtMjM0NSw3ICsyMzQ1LDcgQEAKICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLk9yaWdXZXBTdGF0dXMgPSBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1czsKICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLlBhaXJDaXBoZXIgPSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OklXX0FVVEhfQ0lQSEVSX1BBSVJXSVNFIC0gcGFyYW0tPnZhbHVlID0gJWQhXG4iLCBfX0ZVTkNUSU9OX18sIHBhcmFtLT52YWx1ZSkpOworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OklXX0FVVEhfQ0lQSEVSX1BBSVJXSVNFIC0gcGFyYW0tPnZhbHVlID0gJWQhXG4iLCBfX2Z1bmNfXywgcGFyYW0tPnZhbHVlKSk7CiAgICAgICAgICAgICBicmVhazsKICAgICAJY2FzZSBJV19BVVRIX0NJUEhFUl9HUk9VUDoKICAgICAgICAgICAgIGlmIChwYXJhbS0+dmFsdWUgPT0gSVdfQVVUSF9DSVBIRVJfTk9ORSkKQEAgLTIzNjUsNyArMjM2NSw3IEBACiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5Hcm91cENpcGhlciA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQ7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6SVdfQVVUSF9DSVBIRVJfR1JPVVAgLSBwYXJhbS0+dmFsdWUgPSAlZCFcbiIsIF9fRlVOQ1RJT05fXywgcGFyYW0tPnZhbHVlKSk7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6SVdfQVVUSF9DSVBIRVJfR1JPVVAgLSBwYXJhbS0+dmFsdWUgPSAlZCFcbiIsIF9fZnVuY19fLCBwYXJhbS0+dmFsdWUpKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgIAljYXNlIElXX0FVVEhfS0VZX01HTVQ6CiAgICAgICAgICAgICBpZiAocGFyYW0tPnZhbHVlID09IElXX0FVVEhfS0VZX01HTVRfODAyXzFYKQpAQCAtMjM5NSw3ICsyMzk1LDcgQEAKICAgICAgICAgICAgICAgICAvL3BBZGFwdGVyLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRDsKIAkJCQlTVEFfUE9SVF9TRUNVUkVEKHBBZGFwdGVyKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjpJV19BVVRIX0tFWV9NR01UIC0gcGFyYW0tPnZhbHVlID0gJWQhXG4iLCBfX0ZVTkNUSU9OX18sIHBhcmFtLT52YWx1ZSkpOworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OklXX0FVVEhfS0VZX01HTVQgLSBwYXJhbS0+dmFsdWUgPSAlZCFcbiIsIF9fZnVuY19fLCBwYXJhbS0+dmFsdWUpKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgIAljYXNlIElXX0FVVEhfUlhfVU5FTkNSWVBURURfRUFQT0w6CiAgICAgICAgICAgICBicmVhazsKQEAgLTI0MDgsNyArMjQwOCw3IEBACiAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5QYWlyQ2lwaGVyID0gTmRpczgwMl8xMVdFUERpc2FibGVkOwogICAgICAgICAJICAgIHBBZGFwdGVyLT5TdGFDZmcuR3JvdXBDaXBoZXIgPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7CiAgICAgICAgICAgICB9Ki8KLSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjpJV19BVVRIX1BSSVZBQ1lfSU5WT0tFRCAtIHBhcmFtLT52YWx1ZSA9ICVkIVxuIiwgX19GVU5DVElPTl9fLCBwYXJhbS0+dmFsdWUpKTsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjpJV19BVVRIX1BSSVZBQ1lfSU5WT0tFRCAtIHBhcmFtLT52YWx1ZSA9ICVkIVxuIiwgX19mdW5jX18sIHBhcmFtLT52YWx1ZSkpOwogICAgIAkJYnJlYWs7CiAgICAgCWNhc2UgSVdfQVVUSF9EUk9QX1VORU5DUllQVEVEOgogICAgICAgICAgICAgaWYgKHBhcmFtLT52YWx1ZSAhPSAwKQpAQCAtMjQxOCw3ICsyNDE4LDcgQEAKICAgICAgICAgICAgICAgICAvL3BBZGFwdGVyLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRDsKIAkJCQlTVEFfUE9SVF9TRUNVUkVEKHBBZGFwdGVyKTsKIAkJCX0KLSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjpJV19BVVRIX1dQQV9WRVJTSU9OIC0gcGFyYW0tPnZhbHVlID0gJWQhXG4iLCBfX0ZVTkNUSU9OX18sIHBhcmFtLT52YWx1ZSkpOworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OklXX0FVVEhfV1BBX1ZFUlNJT04gLSBwYXJhbS0+dmFsdWUgPSAlZCFcbiIsIF9fZnVuY19fLCBwYXJhbS0+dmFsdWUpKTsKICAgICAJCWJyZWFrOwogICAgIAljYXNlIElXX0FVVEhfODAyMTFfQVVUSF9BTEc6CiAJCQlpZiAocGFyYW0tPnZhbHVlICYgSVdfQVVUSF9BTEdfU0hBUkVEX0tFWSkKQEAgLTI0MzEsMTAgKzI0MzEsMTAgQEAKIAkJCX0KICAgICAgICAgICAgIGVsc2UKIAkJCQlyZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjpJV19BVVRIXzgwMjExX0FVVEhfQUxHIC0gcGFyYW0tPnZhbHVlID0gJWQhXG4iLCBfX0ZVTkNUSU9OX18sIHBhcmFtLT52YWx1ZSkpOworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OklXX0FVVEhfODAyMTFfQVVUSF9BTEcgLSBwYXJhbS0+dmFsdWUgPSAlZCFcbiIsIF9fZnVuY19fLCBwYXJhbS0+dmFsdWUpKTsKIAkJCWJyZWFrOwogICAgIAljYXNlIElXX0FVVEhfV1BBX0VOQUJMRUQ6Ci0gICAgCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6SVdfQVVUSF9XUEFfRU5BQkxFRCAtIERyaXZlciBzdXBwb3J0cyBXUEEhKHBhcmFtLT52YWx1ZSA9ICVkKVxuIiwgX19GVU5DVElPTl9fLCBwYXJhbS0+dmFsdWUpKTsKKyAgICAJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjpJV19BVVRIX1dQQV9FTkFCTEVEIC0gRHJpdmVyIHN1cHBvcnRzIFdQQSEocGFyYW0tPnZhbHVlID0gJWQpXG4iLCBfX2Z1bmNfXywgcGFyYW0tPnZhbHVlKSk7CiAgICAgCQlicmVhazsKICAgICAJZGVmYXVsdDoKICAgICAJCXJldHVybiAtRU9QTk9UU1VQUDsKQEAgLTI1NDIsNyArMjU0Miw3IEBACiAJCXBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5DaXBoZXJBbGcgPSBDSVBIRVJfTk9ORTsKIAkJQXNpY1JlbW92ZVNoYXJlZEtleUVudHJ5KHBBZGFwdGVyLCAwLCAoVUNIQVIpa2V5SWR4KTsKICAgICAgICAgTmRpc1plcm9NZW1vcnkoJnBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XSwgc2l6ZW9mKENJUEhFUl9LRVkpKTsKLSAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OlJlbW92ZSBhbGwga2V5cyEoZW5jb2RpbmctPmZsYWdzID0gJXgpXG4iLCBfX0ZVTkNUSU9OX18sIGVuY29kaW5nLT5mbGFncykpOworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6UmVtb3ZlIGFsbCBrZXlzIShlbmNvZGluZy0+ZmxhZ3MgPSAleClcbiIsIF9fZnVuY19fLCBlbmNvZGluZy0+ZmxhZ3MpKTsKICAgICB9CiAJCQkJCWVsc2UKICAgICB7CkBAIC0yNTU0LDE1ICsyNTU0LDE1IEBACiAgICAgICAgIGlmIChleHQtPmV4dF9mbGFncyAmIElXX0VOQ09ERV9FWFRfU0VUX1RYX0tFWSkKICAgICAgICAgewogICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWQgPSBrZXlJZHg7Ci0gICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6RGVmYXVsdEtleUlkID0gJWRcbiIsIF9fRlVOQ1RJT05fXywgcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWQpKTsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjpEZWZhdWx0S2V5SWQgPSAlZFxuIiwgX19mdW5jX18sIHBBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkKSk7CiAgICAgICAgIH0KIAogICAgICAgICBzd2l0Y2ggKGFsZykgewogICAgIAkJY2FzZSBJV19FTkNPREVfQUxHX05PTkU6Ci0gICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OklXX0VOQ09ERV9BTEdfTk9ORVxuIiwgX19GVU5DVElPTl9fKSk7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OklXX0VOQ09ERV9BTEdfTk9ORVxuIiwgX19mdW5jX18pKTsKICAgICAJCQlicmVhazsKICAgICAJCWNhc2UgSVdfRU5DT0RFX0FMR19XRVA6Ci0gICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OklXX0VOQ09ERV9BTEdfV0VQIC0gZXh0LT5rZXlfbGVuID0gJWQsIGtleUlkeCA9ICVkXG4iLCBfX0ZVTkNUSU9OX18sIGV4dC0+a2V5X2xlbiwga2V5SWR4KSk7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OklXX0VOQ09ERV9BTEdfV0VQIC0gZXh0LT5rZXlfbGVuID0gJWQsIGtleUlkeCA9ICVkXG4iLCBfX2Z1bmNfXywgZXh0LT5rZXlfbGVuLCBrZXlJZHgpKTsKICAgICAJCQlpZiAoZXh0LT5rZXlfbGVuID09IE1BWF9XRVBfS0VZX1NJWkUpCiAgICAgICAgICAgICAgICAgewogICAgICAgICAJCQlwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uS2V5TGVuID0gTUFYX1dFUF9LRVlfU0laRTsKQEAgLTI1ODAsNyArMjU4MCw3IEBACiAJCQkgICAgTmRpc01vdmVNZW1vcnkocEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLktleSwgZXh0LT5rZXksIGV4dC0+a2V5X2xlbik7CiAgICAgCQkJYnJlYWs7CiAgICAgICAgICAgICBjYXNlIElXX0VOQ09ERV9BTEdfVEtJUDoKLSAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6SVdfRU5DT0RFX0FMR19US0lQIC0ga2V5SWR4ID0gJWQsIGV4dC0+a2V5X2xlbiA9ICVkXG4iLCBfX0ZVTkNUSU9OX18sIGtleUlkeCwgZXh0LT5rZXlfbGVuKSk7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OklXX0VOQ09ERV9BTEdfVEtJUCAtIGtleUlkeCA9ICVkLCBleHQtPmtleV9sZW4gPSAlZFxuIiwgX19mdW5jX18sIGtleUlkeCwgZXh0LT5rZXlfbGVuKSk7CiAgICAgICAgICAgICAgICAgaWYgKGV4dC0+a2V5X2xlbiA9PSAzMikKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChleHQtPmV4dF9mbGFncyAmIElXX0VOQ09ERV9FWFRfU0VUX1RYX0tFWSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvdG1wNjEgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL3RtcDYxCmluZGV4IDk5MjA5NmEuLjk3NWU0NDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvdG1wNjEKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC90bXA2MQpAQCAtMjIyNCw3ICsyMjI0LDcgQEAKIAkJCXdycS0+bGVuZ3RoID0gc3RybGVuKGV4dHJhKSArIDE7IC8vIDE6IHNpemUgb2YgJ1wwJwogCQkJYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlcyAtIHVua25vdyBzdWJjbWQgPSAlZFxuIiwgX19GVU5DVElPTl9fLCBzdWJjbWQpKTsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzIC0gdW5rbm93IHN1YmNtZCA9ICVkXG4iLCBfX2Z1bmNfXywgc3ViY21kKSk7CiAgICAgICAgICAgICBicmVhazsKICAgICB9CiAKQEAgLTIyNDMsNyArMjI0Myw3IEBACiAJTUxNRV9ESVNBU1NPQ19SRVFfU1RSVUNUCURpc0Fzc29jUmVxOwogCU1MTUVfREVBVVRIX1JFUV9TVFJVQ1QgICAgICBEZUF1dGhSZXE7CiAKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT09PiAlc1xuIiwgX19GVU5DVElPTl9fKSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PT4gJXNcbiIsIF9fZnVuY19fKSk7CiAKIAlpZiAocE1sbWUgPT0gTlVMTCkKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0yMjUyLDcgKzIyNTIsNyBAQAogCXsKICNpZmRlZiBJV19NTE1FX0RFQVVUSAogCQljYXNlIElXX01MTUVfREVBVVRIOgotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PT4gJXMgLSBJV19NTE1FX0RFQVVUSFxuIiwgX19GVU5DVElPTl9fKSk7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT09PiAlcyAtIElXX01MTUVfREVBVVRIXG4iLCBfX2Z1bmNfXykpOwogCQkJQ09QWV9NQUNfQUREUihEZUF1dGhSZXEuQWRkciwgcEFkLT5Db21tb25DZmcuQnNzaWQpOwogCQkJRGVBdXRoUmVxLlJlYXNvbiA9IHBNbG1lLT5yZWFzb25fY29kZTsKIAkJCU1zZ0VsZW0uTXNnTGVuID0gc2l6ZW9mKE1MTUVfREVBVVRIX1JFUV9TVFJVQ1QpOwpAQCAtMjI2Nyw3ICsyMjY3LDcgQEAKICNlbmRpZiAvLyBJV19NTE1FX0RFQVVUSCAvLwogI2lmZGVmIElXX01MTUVfRElTQVNTT0MKIAkJY2FzZSBJV19NTE1FX0RJU0FTU09DOgotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PT4gJXMgLSBJV19NTE1FX0RJU0FTU09DXG4iLCBfX0ZVTkNUSU9OX18pKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT0+ICVzIC0gSVdfTUxNRV9ESVNBU1NPQ1xuIiwgX19mdW5jX18pKTsKIAkJCUNPUFlfTUFDX0FERFIoRGlzQXNzb2NSZXEuQWRkciwgcEFkLT5Db21tb25DZmcuQnNzaWQpOwogCQkJRGlzQXNzb2NSZXEuUmVhc29uID0gIHBNbG1lLT5yZWFzb25fY29kZTsKIApAQCAtMjI4MSw3ICsyMjgxLDcgQEAKIAkJCWJyZWFrOwogI2VuZGlmIC8vIElXX01MTUVfRElTQVNTT0MgLy8KIAkJZGVmYXVsdDoKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT0+ICVzIC0gVW5rbm93IENvbW1hbmRcbiIsIF9fRlVOQ1RJT05fXykpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PT4gJXMgLSBVbmtub3cgQ29tbWFuZFxuIiwgX19mdW5jX18pKTsKIAkJCWJyZWFrOwogCX0KIApAQCAtMjMxNCw3ICsyMzE0LDcgQEAKICAgICAgICAgICAgIGVsc2UgaWYgKHBhcmFtLT52YWx1ZSA9PSBJV19BVVRIX1dQQV9WRVJTSU9OX1dQQTIpCiAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0s7CiAKLSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjpJV19BVVRIX1dQQV9WRVJTSU9OIC0gcGFyYW0tPnZhbHVlID0gJWQhXG4iLCBfX0ZVTkNUSU9OX18sIHBhcmFtLT52YWx1ZSkpOworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OklXX0FVVEhfV1BBX1ZFUlNJT04gLSBwYXJhbS0+dmFsdWUgPSAlZCFcbiIsIF9fZnVuY19fLCBwYXJhbS0+dmFsdWUpKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgIAljYXNlIElXX0FVVEhfQ0lQSEVSX1BBSVJXSVNFOgogICAgICAgICAgICAgaWYgKHBhcmFtLT52YWx1ZSA9PSBJV19BVVRIX0NJUEhFUl9OT05FKQpAQCAtMjM0NSw3ICsyMzQ1LDcgQEAKICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLk9yaWdXZXBTdGF0dXMgPSBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1czsKICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLlBhaXJDaXBoZXIgPSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OklXX0FVVEhfQ0lQSEVSX1BBSVJXSVNFIC0gcGFyYW0tPnZhbHVlID0gJWQhXG4iLCBfX0ZVTkNUSU9OX18sIHBhcmFtLT52YWx1ZSkpOworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OklXX0FVVEhfQ0lQSEVSX1BBSVJXSVNFIC0gcGFyYW0tPnZhbHVlID0gJWQhXG4iLCBfX2Z1bmNfXywgcGFyYW0tPnZhbHVlKSk7CiAgICAgICAgICAgICBicmVhazsKICAgICAJY2FzZSBJV19BVVRIX0NJUEhFUl9HUk9VUDoKICAgICAgICAgICAgIGlmIChwYXJhbS0+dmFsdWUgPT0gSVdfQVVUSF9DSVBIRVJfTk9ORSkKQEAgLTIzNjUsNyArMjM2NSw3IEBACiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5Hcm91cENpcGhlciA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQ7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6SVdfQVVUSF9DSVBIRVJfR1JPVVAgLSBwYXJhbS0+dmFsdWUgPSAlZCFcbiIsIF9fRlVOQ1RJT05fXywgcGFyYW0tPnZhbHVlKSk7CisgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6SVdfQVVUSF9DSVBIRVJfR1JPVVAgLSBwYXJhbS0+dmFsdWUgPSAlZCFcbiIsIF9fZnVuY19fLCBwYXJhbS0+dmFsdWUpKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgIAljYXNlIElXX0FVVEhfS0VZX01HTVQ6CiAgICAgICAgICAgICBpZiAocGFyYW0tPnZhbHVlID09IElXX0FVVEhfS0VZX01HTVRfODAyXzFYKQpAQCAtMjM5NSw3ICsyMzk1LDcgQEAKICAgICAgICAgICAgICAgICAvL3BBZGFwdGVyLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRDsKIAkJCQlTVEFfUE9SVF9TRUNVUkVEKHBBZGFwdGVyKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjpJV19BVVRIX0tFWV9NR01UIC0gcGFyYW0tPnZhbHVlID0gJWQhXG4iLCBfX0ZVTkNUSU9OX18sIHBhcmFtLT52YWx1ZSkpOworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OklXX0FVVEhfS0VZX01HTVQgLSBwYXJhbS0+dmFsdWUgPSAlZCFcbiIsIF9fZnVuY19fLCBwYXJhbS0+dmFsdWUpKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgIAljYXNlIElXX0FVVEhfUlhfVU5FTkNSWVBURURfRUFQT0w6CiAgICAgICAgICAgICBicmVhazsKQEAgLTI0MDgsNyArMjQwOCw3IEBACiAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5QYWlyQ2lwaGVyID0gTmRpczgwMl8xMVdFUERpc2FibGVkOwogICAgICAgICAJICAgIHBBZGFwdGVyLT5TdGFDZmcuR3JvdXBDaXBoZXIgPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7CiAgICAgICAgICAgICB9Ki8KLSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjpJV19BVVRIX1BSSVZBQ1lfSU5WT0tFRCAtIHBhcmFtLT52YWx1ZSA9ICVkIVxuIiwgX19GVU5DVElPTl9fLCBwYXJhbS0+dmFsdWUpKTsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjpJV19BVVRIX1BSSVZBQ1lfSU5WT0tFRCAtIHBhcmFtLT52YWx1ZSA9ICVkIVxuIiwgX19mdW5jX18sIHBhcmFtLT52YWx1ZSkpOwogICAgIAkJYnJlYWs7CiAgICAgCWNhc2UgSVdfQVVUSF9EUk9QX1VORU5DUllQVEVEOgogICAgICAgICAgICAgaWYgKHBhcmFtLT52YWx1ZSAhPSAwKQpAQCAtMjQxOCw3ICsyNDE4LDcgQEAKICAgICAgICAgICAgICAgICAvL3BBZGFwdGVyLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRDsKIAkJCQlTVEFfUE9SVF9TRUNVUkVEKHBBZGFwdGVyKTsKIAkJCX0KLSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjpJV19BVVRIX1dQQV9WRVJTSU9OIC0gcGFyYW0tPnZhbHVlID0gJWQhXG4iLCBfX0ZVTkNUSU9OX18sIHBhcmFtLT52YWx1ZSkpOworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OklXX0FVVEhfV1BBX1ZFUlNJT04gLSBwYXJhbS0+dmFsdWUgPSAlZCFcbiIsIF9fZnVuY19fLCBwYXJhbS0+dmFsdWUpKTsKICAgICAJCWJyZWFrOwogICAgIAljYXNlIElXX0FVVEhfODAyMTFfQVVUSF9BTEc6CiAJCQlpZiAocGFyYW0tPnZhbHVlICYgSVdfQVVUSF9BTEdfU0hBUkVEX0tFWSkKQEAgLTI0MzEsMTAgKzI0MzEsMTAgQEAKIAkJCX0KICAgICAgICAgICAgIGVsc2UKIAkJCQlyZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjpJV19BVVRIXzgwMjExX0FVVEhfQUxHIC0gcGFyYW0tPnZhbHVlID0gJWQhXG4iLCBfX0ZVTkNUSU9OX18sIHBhcmFtLT52YWx1ZSkpOworICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OklXX0FVVEhfODAyMTFfQVVUSF9BTEcgLSBwYXJhbS0+dmFsdWUgPSAlZCFcbiIsIF9fZnVuY19fLCBwYXJhbS0+dmFsdWUpKTsKIAkJCWJyZWFrOwogICAgIAljYXNlIElXX0FVVEhfV1BBX0VOQUJMRUQ6Ci0gICAgCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6SVdfQVVUSF9XUEFfRU5BQkxFRCAtIERyaXZlciBzdXBwb3J0cyBXUEEhKHBhcmFtLT52YWx1ZSA9ICVkKVxuIiwgX19GVU5DVElPTl9fLCBwYXJhbS0+dmFsdWUpKTsKKyAgICAJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjpJV19BVVRIX1dQQV9FTkFCTEVEIC0gRHJpdmVyIHN1cHBvcnRzIFdQQSEocGFyYW0tPnZhbHVlID0gJWQpXG4iLCBfX2Z1bmNfXywgcGFyYW0tPnZhbHVlKSk7CiAgICAgCQlicmVhazsKICAgICAJZGVmYXVsdDoKICAgICAJCXJldHVybiAtRU9QTk9UU1VQUDsKQEAgLTI1NDIsNyArMjU0Miw3IEBACiAJCXBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5DaXBoZXJBbGcgPSBDSVBIRVJfTk9ORTsKIAkJQXNpY1JlbW92ZVNoYXJlZEtleUVudHJ5KHBBZGFwdGVyLCAwLCAoVUNIQVIpa2V5SWR4KTsKICAgICAgICAgTmRpc1plcm9NZW1vcnkoJnBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XSwgc2l6ZW9mKENJUEhFUl9LRVkpKTsKLSAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OlJlbW92ZSBhbGwga2V5cyEoZW5jb2RpbmctPmZsYWdzID0gJXgpXG4iLCBfX0ZVTkNUSU9OX18sIGVuY29kaW5nLT5mbGFncykpOworICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6UmVtb3ZlIGFsbCBrZXlzIShlbmNvZGluZy0+ZmxhZ3MgPSAleClcbiIsIF9fZnVuY19fLCBlbmNvZGluZy0+ZmxhZ3MpKTsKICAgICB9CiAJCQkJCWVsc2UKICAgICB7CkBAIC0yNTU0LDE1ICsyNTU0LDE1IEBACiAgICAgICAgIGlmIChleHQtPmV4dF9mbGFncyAmIElXX0VOQ09ERV9FWFRfU0VUX1RYX0tFWSkKICAgICAgICAgewogICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWQgPSBrZXlJZHg7Ci0gICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6RGVmYXVsdEtleUlkID0gJWRcbiIsIF9fRlVOQ1RJT05fXywgcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWQpKTsKKyAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjpEZWZhdWx0S2V5SWQgPSAlZFxuIiwgX19mdW5jX18sIHBBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkKSk7CiAgICAgICAgIH0KIAogICAgICAgICBzd2l0Y2ggKGFsZykgewogICAgIAkJY2FzZSBJV19FTkNPREVfQUxHX05PTkU6Ci0gICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OklXX0VOQ09ERV9BTEdfTk9ORVxuIiwgX19GVU5DVElPTl9fKSk7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OklXX0VOQ09ERV9BTEdfTk9ORVxuIiwgX19mdW5jX18pKTsKICAgICAJCQlicmVhazsKICAgICAJCWNhc2UgSVdfRU5DT0RFX0FMR19XRVA6Ci0gICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OklXX0VOQ09ERV9BTEdfV0VQIC0gZXh0LT5rZXlfbGVuID0gJWQsIGtleUlkeCA9ICVkXG4iLCBfX0ZVTkNUSU9OX18sIGV4dC0+a2V5X2xlbiwga2V5SWR4KSk7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OklXX0VOQ09ERV9BTEdfV0VQIC0gZXh0LT5rZXlfbGVuID0gJWQsIGtleUlkeCA9ICVkXG4iLCBfX2Z1bmNfXywgZXh0LT5rZXlfbGVuLCBrZXlJZHgpKTsKICAgICAJCQlpZiAoZXh0LT5rZXlfbGVuID09IE1BWF9XRVBfS0VZX1NJWkUpCiAgICAgICAgICAgICAgICAgewogICAgICAgICAJCQlwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uS2V5TGVuID0gTUFYX1dFUF9LRVlfU0laRTsKQEAgLTI1ODAsNyArMjU4MCw3IEBACiAJCQkgICAgTmRpc01vdmVNZW1vcnkocEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLktleSwgZXh0LT5rZXksIGV4dC0+a2V5X2xlbik7CiAgICAgCQkJYnJlYWs7CiAgICAgICAgICAgICBjYXNlIElXX0VOQ09ERV9BTEdfVEtJUDoKLSAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6SVdfRU5DT0RFX0FMR19US0lQIC0ga2V5SWR4ID0gJWQsIGV4dC0+a2V5X2xlbiA9ICVkXG4iLCBfX0ZVTkNUSU9OX18sIGtleUlkeCwgZXh0LT5rZXlfbGVuKSk7CisgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OklXX0VOQ09ERV9BTEdfVEtJUCAtIGtleUlkeCA9ICVkLCBleHQtPmtleV9sZW4gPSAlZFxuIiwgX19mdW5jX18sIGtleUlkeCwgZXh0LT5rZXlfbGVuKSk7CiAgICAgICAgICAgICAgICAgaWYgKGV4dC0+a2V5X2xlbiA9PSAzMikKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChleHQtPmV4dF9mbGFncyAmIElXX0VOQ09ERV9FWFRfU0VUX1RYX0tFWSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL2llZWU4MDIxMS5oCmluZGV4IGJmMDZhYmUuLjU4MzM2MDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9pZWVlODAyMTEuaApAQCAtMzk2LDcgKzM5Niw3IEBACiAjZGVmaW5lIElFRUU4MDIxMV9ERUJVRyhsZXZlbCwgZm10LCBhcmdzLi4uKSBcCiBkbyB7IGlmIChpZWVlODAyMTFfZGVidWdfbGV2ZWwgJiAobGV2ZWwpKSBcCiAgIHByaW50ayhLRVJOX0RFQlVHICJpZWVlODAyMTE6ICVjICVzICIgZm10LCBcCi0gICAgICAgICBpbl9pbnRlcnJ1cHQoKSA/ICdJJyA6ICdVJywgX19GVU5DVElPTl9fICwgIyMgYXJncyk7IH0gd2hpbGUgKDApCisgICAgICAgICBpbl9pbnRlcnJ1cHQoKSA/ICdJJyA6ICdVJywgX19mdW5jX18gLCAjIyBhcmdzKTsgfSB3aGlsZSAoMCkKICNlbHNlCiAjZGVmaW5lIElFRUU4MDIxMV9ERUJVRyhsZXZlbCwgZm10LCBhcmdzLi4uKSBkbyB7fSB3aGlsZSAoMCkKICNlbmRpZgkvKiBDT05GSUdfSUVFRTgwMjExX0RFQlVHICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL2llZWU4MDIxMS9pZWVlODAyMTEuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExL2llZWU4MDIxMS5oCmluZGV4IGJmMDZhYmUuLjU4MzM2MDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExL2llZWU4MDIxMS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExL2llZWU4MDIxMS5oCkBAIC0zOTYsNyArMzk2LDcgQEAKICNkZWZpbmUgSUVFRTgwMjExX0RFQlVHKGxldmVsLCBmbXQsIGFyZ3MuLi4pIFwKIGRvIHsgaWYgKGllZWU4MDIxMV9kZWJ1Z19sZXZlbCAmIChsZXZlbCkpIFwKICAgcHJpbnRrKEtFUk5fREVCVUcgImllZWU4MDIxMTogJWMgJXMgIiBmbXQsIFwKLSAgICAgICAgIGluX2ludGVycnVwdCgpID8gJ0knIDogJ1UnLCBfX0ZVTkNUSU9OX18gLCAjIyBhcmdzKTsgfSB3aGlsZSAoMCkKKyAgICAgICAgIGluX2ludGVycnVwdCgpID8gJ0knIDogJ1UnLCBfX2Z1bmNfXyAsICMjIGFyZ3MpOyB9IHdoaWxlICgwKQogI2Vsc2UKICNkZWZpbmUgSUVFRTgwMjExX0RFQlVHKGxldmVsLCBmbXQsIGFyZ3MuLi4pIGRvIHt9IHdoaWxlICgwKQogI2VuZGlmCS8qIENPTkZJR19JRUVFODAyMTFfREVCVUcgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExL2llZWU4MDIxMV9jcnlwdF9jY21wLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL2llZWU4MDIxMS9pZWVlODAyMTFfY3J5cHRfY2NtcC5jCmluZGV4IDdkODkwYzMuLjA4YWRkMzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExL2llZWU4MDIxMV9jcnlwdF9jY21wLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9pZWVlODAyMTEvaWVlZTgwMjExX2NyeXB0X2NjbXAuYwpAQCAtNDkwLDcgKzQ5MCw3IEBACiAKIHZvaWQgaWVlZTgwMjExX2NjbXBfbnVsbCh2b2lkKQogewotLy8gICAgcHJpbnRrKCI9PT09PT09PT09PT0+JXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKy8vICAgIHByaW50aygiPT09PT09PT09PT09PiVzKClcbiIsIF9fZnVuY19fKTsKIAlyZXR1cm47CiB9CiBzdGF0aWMgc3RydWN0IGllZWU4MDIxMV9jcnlwdG9fb3BzIGllZWU4MDIxMV9jcnlwdF9jY21wID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9pZWVlODAyMTEvaWVlZTgwMjExX2NyeXB0X3RraXAuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExL2llZWU4MDIxMV9jcnlwdF90a2lwLmMKaW5kZXggZTU2MGIxZS4uZGU5N2JiZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9pZWVlODAyMTEvaWVlZTgwMjExX2NyeXB0X3RraXAuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL2llZWU4MDIxMS9pZWVlODAyMTFfY3J5cHRfdGtpcC5jCkBAIC05ODQsNyArOTg0LDcgQEAKIAogdm9pZCBpZWVlODAyMTFfdGtpcF9udWxsKHZvaWQpCiB7Ci0vLyAgICBwcmludGsoIj09PT09PT09PT09PT4lcygpXG4iLCBfX0ZVTkNUSU9OX18pOworLy8gICAgcHJpbnRrKCI9PT09PT09PT09PT0+JXMoKVxuIiwgX19mdW5jX18pOwogICAgICAgICByZXR1cm47CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExL2llZWU4MDIxMV9jcnlwdF93ZXAuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExL2llZWU4MDIxMV9jcnlwdF93ZXAuYwppbmRleCBmOTczZGFlLi42OGEyMmIzMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9pZWVlODAyMTEvaWVlZTgwMjExX2NyeXB0X3dlcC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExL2llZWU4MDIxMV9jcnlwdF93ZXAuYwpAQCAtMzgwLDcgKzM4MCw3IEBACiAKIHZvaWQgaWVlZTgwMjExX3dlcF9udWxsKHZvaWQpCiB7Ci0vLwlwcmludGsoIj09PT09PT09PT09PT4lcygpXG4iLCBfX0ZVTkNUSU9OX18pOworLy8JcHJpbnRrKCI9PT09PT09PT09PT0+JXMoKVxuIiwgX19mdW5jX18pOwogICAgICAgICByZXR1cm47CiB9CiAjaWYgMApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9pZWVlODAyMTEvaWVlZTgwMjExX3J4LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL2llZWU4MDIxMS9pZWVlODAyMTFfcnguYwppbmRleCA3OWVjNjQ5Li4yMzUxOWIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL2llZWU4MDIxMS9pZWVlODAyMTFfcnguYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL2llZWU4MDIxMS9pZWVlODAyMTFfcnguYwpAQCAtMTYzNSw3ICsxNjM1LDcgQEAKIAltZW1jcHkoZHN0LT5yYXRlc19leCwgc3JjLT5yYXRlc19leCwgc3JjLT5yYXRlc19leF9sZW4pOwogCWRzdC0+cmF0ZXNfZXhfbGVuID0gc3JjLT5yYXRlc19leF9sZW47CiAJZHN0LT5IaWdoZXN0T3BlcmFSYXRlPSBzcmMtPkhpZ2hlc3RPcGVyYVJhdGU7Ci0JLy9wcmludGsoIj09PT09PT09PT0+aW4gJXM6IHNyYy0+c3NpZCBpcyAlcyxjaGFuIGlzICVkXG4iLF9fRlVOQ1RJT05fXyxzcmMtPnNzaWQsc3JjLT5jaGFubmVsKTsKKwkvL3ByaW50aygiPT09PT09PT09PT5pbiAlczogc3JjLT5zc2lkIGlzICVzLGNoYW4gaXMgJWRcbiIsX19mdW5jX18sc3JjLT5zc2lkLHNyYy0+Y2hhbm5lbCk7CiAKIAkvL1lKLGFkZCwwODA4MTksZm9yIGhpZGRlbiBhcAogCWlmKHNyYy0+c3NpZF9sZW4gPiAwKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9pZWVlODAyMTEvaWVlZTgwMjExX3NvZnRtYWMuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExL2llZWU4MDIxMV9zb2Z0bWFjLmMKaW5kZXggZmNmZmVlNS4uZTU3NTJmNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9pZWVlODAyMTEvaWVlZTgwMjExX3NvZnRtYWMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL2llZWU4MDIxMS9pZWVlODAyMTFfc29mdG1hYy5jCkBAIC03MzEsNyArNzMxLDcgQEAKIAltZW1jcHkoY2hhbm5lbF9tYXAsIEdFVF9ET1QxMURfSU5GTyhpZWVlKS0+Y2hhbm5lbF9tYXAsIE1BWF9DSEFOTkVMX05VTUJFUisxKTsKICNlbmRpZgogLy8JcHJpbnRrKCJpZWVlODAyMTFfc29mdG1hY19zY2FuX3dxIEVOQUJMRV9JUFNcbiIpOwotLy8JcHJpbnRrKCJpbiAlc1xuIixfX0ZVTkNUSU9OX18pOworLy8JcHJpbnRrKCJpbiAlc1xuIixfX2Z1bmNfXyk7CiAJZG93bigmaWVlZS0+c2Nhbl9zZW0pOwogCiAJZG97CkBAIC0xNzg1LDcgKzE3ODUsNyBAQAogCQkvL0lmIGNhbGwgZGV2X2tmcmVlX3NrYl9hbnksYSB3YXJuaW5nIHdpbGwgb2N1ci4uLi4KIAkJLy9LRVJORUw6IGFzc2VydGlvbiAoIWF0b21pY19yZWFkKCZza2ItPnVzZXJzKSkgZmFpbGVkIGF0IG5ldC9jb3JlL2Rldi5jICgxNzA4KQogCQkvL1NvIC4uLiAxMjA0IGJ5IGxhd3JlbmNlLgotCQkvL3ByaW50aygiXG5JbiAlcyxsaW5lICVkIGNhbGwga2ZyZWUgc2tiLiIsX19GVU5DVElPTl9fLF9fTElORV9fKTsKKwkJLy9wcmludGsoIlxuSW4gJXMsbGluZSAlZCBjYWxsIGtmcmVlIHNrYi4iLF9fZnVuY19fLF9fTElORV9fKTsKIAkJLy9kZXZfa2ZyZWVfc2tiX2FueShza2IpOy8vZWRpdCBieSB0aG9tYXMKIAl9CiB9CkBAIC0yNDMyLDcgKzI0MzIsNyBAQAogCX0KIAogCXNsZWVwID0gaWVlZTgwMjExX3N0YV9wc19zbGVlcChpZWVlLCZ0aCwgJnRsKTsKLS8vCXByaW50aygiPT09PiVzLCVkWzIgd2FrZSwgMSBzbGVlcCwgMCBkbyBub3RoaW5nXSwgaWVlZS0+c3RhX3NsZWVwID0gJWRcbiIsX19GVU5DVElPTl9fLCBzbGVlcCxpZWVlLT5zdGFfc2xlZXApOworLy8JcHJpbnRrKCI9PT0+JXMsJWRbMiB3YWtlLCAxIHNsZWVwLCAwIGRvIG5vdGhpbmddLCBpZWVlLT5zdGFfc2xlZXAgPSAlZFxuIixfX2Z1bmNfXywgc2xlZXAsaWVlZS0+c3RhX3NsZWVwKTsKIAkvKiAyIHdha2UsIDEgc2xlZXAsIDAgZG8gbm90aGluZyAqLwogCWlmKHNsZWVwID09IDApCiAJCWdvdG8gb3V0OwpAQCAtMjUxMCw3ICsyNTEwLDcgQEAKIAkJLyogTnVsbCBmcmFtZSB3aXRoIFBTIGJpdCBzZXQgKi8KIAkJaWYoc3VjY2Vzcyl7CiAKLQkJLy8JcHJpbnRrKCI9PT09PT09PT09PT09PT09PT0+ICVzOjplbnRlciBzbGVlcCBzdGF0ZVxuIixfX0ZVTkNUSU9OX18pOworCQkvLwlwcmludGsoIj09PT09PT09PT09PT09PT09PT4gJXM6OmVudGVyIHNsZWVwIHN0YXRlXG4iLF9fZnVuY19fKTsKIAkJCWllZWUtPnN0YV9zbGVlcCA9IDE7CiAJCQlpZWVlLT5lbnRlcl9zbGVlcF9zdGF0ZShpZWVlLT5kZXYsaWVlZS0+cHNfdGgsaWVlZS0+cHNfdGwpOwogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL2llZWU4MDIxMS9pZWVlODAyMTFfc29mdG1hY193eC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9pZWVlODAyMTEvaWVlZTgwMjExX3NvZnRtYWNfd3guYwppbmRleCA0M2I4YWVjLi45M2FmMzdlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL2llZWU4MDIxMS9pZWVlODAyMTFfc29mdG1hY193eC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExL2llZWU4MDIxMV9zb2Z0bWFjX3d4LmMKQEAgLTMxLDcgKzMxLDcgQEAKIHsKIAlpbnQgcmV0OwogCXN0cnVjdCBpd19mcmVxICpmd3JxID0gJiB3cnF1LT5mcmVxOwotLy8JcHJpbnRrKCJpbiAlc1xuIixfX0ZVTkNUSU9OX18pOworLy8JcHJpbnRrKCJpbiAlc1xuIixfX2Z1bmNfXyk7CiAJZG93bigmaWVlZS0+d3hfc2VtKTsKIAogCWlmKGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9JTkZSQSl7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL2llZWU4MDIxMS9pZWVlODAyMTFfd3guYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExL2llZWU4MDIxMV93eC5jCmluZGV4IGM3ZDlmNGYuLjZhYWQ2MWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExL2llZWU4MDIxMV93eC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExL2llZWU4MDIxMV93eC5jCkBAIC02NjMsNyArNjYzLDcgQEAKICAgICAgICAgICAgICAgICByZXQgPSAtRUlOVkFMOwogICAgICAgICAgICAgICAgIGdvdG8gZG9uZTsKICAgICAgICAgfQotLy8JcHJpbnRrKCI4LTA5LTA4LTk9PT09PT4lcywgYWxnIG5hbWU6JXNcbiIsX19GVU5DVElPTl9fLCBhbGcpOworLy8JcHJpbnRrKCI4LTA5LTA4LTk9PT09PT4lcywgYWxnIG5hbWU6JXNcbiIsX19mdW5jX18sIGFsZyk7CiAKIAkgb3BzID0gaWVlZTgwMjExX2dldF9jcnlwdG9fb3BzKGFsZyk7CiAgICAgICAgIGlmIChvcHMgPT0gTlVMTCkgewpAQCAtNzU3LDcgKzc1Nyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCiB7CiAJc3RydWN0IGl3X21sbWUgKm1sbWUgPSAoc3RydWN0IGl3X21sbWUgKikgZXh0cmE7Ci0vLwlwcmludGsoIlxuZGtnYWRmc2xrZGpnYWxza2RmPT09PT09PT09PT09PT09PiVzKCksIGNtZDoleFxuIiwgX19GVU5DVElPTl9fLCBtbG1lLT5jbWQpOworLy8JcHJpbnRrKCJcbmRrZ2FkZnNsa2RqZ2Fsc2tkZj09PT09PT09PT09PT09PT4lcygpLCBjbWQ6JXhcbiIsIF9fZnVuY19fLCBtbG1lLT5jbWQpOwogI2lmIDEKIAlzd2l0Y2ggKG1sbWUtPmNtZCkgewogICAgICAgICBjYXNlIElXX01MTUVfREVBVVRIOgpAQCAtODMwLDcgKzgzMCw3IEBACiBpbnQgaWVlZTgwMjExX3d4X3NldF9nZW5faWUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHU4ICppZSwgc2l6ZV90IGxlbikKIHsKICNpZiAwCi0JcHJpbnRrKCI9PT09PiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisJcHJpbnRrKCI9PT09PiVzKClcbiIsIF9fZnVuY19fKTsKIAl7CiAJCWludCBpOwogCQlmb3IgKGk9MDsgaTxsZW47IGkrKykKQEAgLTg2Niw3ICs4NjYsNyBAQAogCQlpZWVlLT53cGFfaWUgPSBOVUxMOwogCQlpZWVlLT53cGFfaWVfbGVuID0gMDsKIAl9Ci0vLwlwcmludGsoIjw9PT09PW91dCAlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworLy8JcHJpbnRrKCI8PT09PT1vdXQgJXMoKVxuIiwgX19mdW5jX18pOwogCiAJcmV0dXJuIDA7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODBfY29yZS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9yODE4MF9jb3JlLmMKaW5kZXggMDBmNGRmNDkuLjk0NTM0OTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODBfY29yZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODBfY29yZS5jCkBAIC0xNDA3LDEyICsxNDA3LDEyIEBACiAKIAlpZigoY2ggPiAxNCkgfHwgKGNoIDwgMSkpCiAJewotCQlwcmludGsoIkluICVzOiBJbnZhbGlkIGNobmFuZWwgJWRcbiIsIF9fRlVOQ1RJT05fXywgY2gpOworCQlwcmludGsoIkluICVzOiBJbnZhbGlkIGNobmFuZWwgJWRcbiIsIF9fZnVuY19fLCBjaCk7CiAJCXJldHVybjsKIAl9CiAKIAlwcml2LT5jaGFuPWNoOwotCS8vcHJpbnRrKCJpbiAlczpjaGFubmVsIGlzICVkXG4iLF9fRlVOQ1RJT05fXyxjaCk7CisJLy9wcmludGsoImluICVzOmNoYW5uZWwgaXMgJWRcbiIsX19mdW5jX18sY2gpOwogCXByaXYtPnJmX3NldF9jaGFuKGRldixwcml2LT5jaGFuKTsKIAogfQpAQCAtMzY1Niw3ICszNjU2LDcgQEAKIHZvaWQgcnRsODE4MF9ycV90eF9hY2soc3RydWN0IG5ldF9kZXZpY2UgKmRldil7CiAKIAlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7Ci0vLwlwcmludGsoIj09PT09PT09PT09PT09PT09PT09PiVzXG4iLF9fRlVOQ1RJT05fXyk7CisvLwlwcmludGsoIj09PT09PT09PT09PT09PT09PT09PiVzXG4iLF9fZnVuY19fKTsKIAl3cml0ZV9uaWNfYnl0ZShkZXYsQ09ORklHNCxyZWFkX25pY19ieXRlKGRldixDT05GSUc0KXxDT05GSUc0X1BXUk1HVCk7CiAJcHJpdi0+YWNrX3R4X3RvX2llZWUgPSAxOwogfQpAQCAtNTQ0OCw3ICs1NDQ4LDcgQEAKICNlbmRpZgogCiAvLwlwcmludGsoImRldiBpcyAlZFxuIixkZXYpOwotLy8JcHJpbnRrKCImKiYoXiooJigmPT09PT09PT09PiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisvLwlwcmludGsoIiYqJiheKigmKCY9PT09PT09PT0+JXMoKVxuIiwgX19mdW5jX18pOwogCXJ0bDgxODBfaHdfd2FrZXVwKGRldik7CiAKIH0KQEAgLTYzMTgsMTIgKzYzMTgsMTIgQEAKIC8vCQkJCXByaW50aygiTnVtVHhPa1RvdGFsIGlzICVkXG4iLHByaXYtPk51bVR4T2tUb3RhbCsrKTsKIAkJCX0KICNlbmRpZgotCQkJLy8JcHJpbnRrKCJpbiBmdW5jdGlvbiAlczpjdXJyX3JldHJ5X2NvdW50IGlzICVkXG4iLF9fRlVOQ1RJT05fXywoKCpoZWFkKSAmICgweDAwMDAwMGZmKSkpOworCQkJLy8JcHJpbnRrKCJpbiBmdW5jdGlvbiAlczpjdXJyX3JldHJ5X2NvdW50IGlzICVkXG4iLF9fZnVuY19fLCgoKmhlYWQpICYgKDB4MDAwMDAwZmYpKSk7CiAJCX0KIAkJaWYoIWVycm9yKXsKIAkJCXByaXYtPk51bVR4T2tCeXRlc1RvdGFsICs9ICgqKGhlYWQrMykpICYgKDB4MDAwMDBmZmYpOwogCQl9Ci0vLwkJcHJpbnRrKCJpbiBmdW5jdGlvbiAlczpjdXJyX3R4b2tieXRlX2NvdW50IGlzICVkXG4iLF9fRlVOQ1RJT05fXywoKihoZWFkKzMpKSAmICgweDAwMDAwZmZmKSk7CisvLwkJcHJpbnRrKCJpbiBmdW5jdGlvbiAlczpjdXJyX3R4b2tieXRlX2NvdW50IGlzICVkXG4iLF9fZnVuY19fLCgqKGhlYWQrMykpICYgKDB4MDAwMDBmZmYpKTsKIAkJKmhlYWQgPSAqaGVhZCAmfiAoMTw8MzEpOwogCiAJCWlmKChoZWFkIC0gYmVnaW4pLzggPT0gcHJpdi0+dHhyaW5nY291bnQtMSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODBfcnRsODIyNXoyLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL3I4MTgwX3J0bDgyMjV6Mi5jCmluZGV4IDkwYTU3NGQuLjQxMzZiOTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODBfcnRsODIyNXoyLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9yODE4MF9ydGw4MjI1ejIuYwpAQCAtMTU3MSw3ICsxNTcxLDcgQEAKIAkvLwogCS8vIFR1cm4gb2ZmIFJGIHBvd2VyLgogCS8vCi0JLy9wcmludGsoIj09PT09PT09PT4lcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCS8vcHJpbnRrKCI9PT09PT09PT0+JXMoKVxuIiwgX19mdW5jX18pOwogCU1nbnRBY3RTZXRfUkZfU3RhdGUoZGV2LCBlUmZTbGVlcCwgUkZfQ0hBTkdFX0JZX1BTKTsKIAkvL21kZWxheSgyKTsJLy9GSVhNRQogfQpAQCAtMTU4MCw3ICsxNTgwLDcgQEAKIAkvLwogCS8vIFR1cm4gb24gUkYgcG93ZXIuCiAJLy8KLQkvL3ByaW50aygiPT09PT09PT09PiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisJLy9wcmludGsoIj09PT09PT09PT4lcygpXG4iLCBfX2Z1bmNfXyk7CiAJTWdudEFjdFNldF9SRl9TdGF0ZShkZXYsIGVSZk9uLCBSRl9DSEFOR0VfQllfUFMpOwogfQogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL3I4MTgwX3d4LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL3I4MTgwX3d4LmMKaW5kZXggYzc3YWJlNS4uOGIzOTAxZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9yODE4MF93eC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODBfd3guYwpAQCAtMTE3Nyw3ICsxMTc3LDcgQEAKIAkvL3N0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlpbnQgKnZhbCA9IChpbnQgKilleHRyYTsKIAlpbnQgaTsKLQlwcmludGsoIi0tLS0taW4gZnVuICVzXG4iLCBfX0ZVTkNUSU9OX18pOworCXByaW50aygiLS0tLS1pbiBmdW4gJXNcbiIsIF9fZnVuY19fKTsKIAogCWlmKHByaXYtPmllZWU4MDIxMS0+Ykh3UmFkaW9PZmYpCiAJCXJldHVybiAwOwpAQCAtMTIzNSw3ICsxMjM1LDcgQEAKIAogCWRvd24oJnByaXYtPnd4X3NlbSk7CiAKLQlwcmludGsoIj09PT09PT09PT09PT09PiVzKCk6IGZvcmNlcmF0ZSBpcyAlZFxuIixfX0ZVTkNUSU9OX18sZm9yY2VyYXRlKTsKKwlwcmludGsoIj09PT09PT09PT09PT09PiVzKCk6IGZvcmNlcmF0ZSBpcyAlZFxuIixfX2Z1bmNfXyxmb3JjZXJhdGUpOwogCWlmKChmb3JjZXJhdGUgPT0gMikgfHwgKGZvcmNlcmF0ZSA9PSA0KSB8fCAoZm9yY2VyYXRlID09IDExKSB8fCAoZm9yY2VyYXRlID09IDIyKSB8fCAoZm9yY2VyYXRlID09IDEyKSB8fAogCQkoZm9yY2VyYXRlID09IDE4KSB8fCAoZm9yY2VyYXRlID09IDI0KSB8fCAoZm9yY2VyYXRlID09IDM2KSB8fCAoZm9yY2VyYXRlID09IDQ4KSB8fCAoZm9yY2VyYXRlID09IDcyKSB8fAogCQkoZm9yY2VyYXRlID09IDk2KSB8fCAoZm9yY2VyYXRlID09IDEwOCkpCkBAIC0xMjYwLDcgKzEyNjAsNyBAQAogewogCiAJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOwotCS8vcHJpbnRrKCI9PT0+JXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKwkvL3ByaW50aygiPT09PiVzKClcbiIsIF9fZnVuY19fKTsKIAogCWludCByZXQ9MDsKIApAQCAtMTI3Nyw3ICsxMjc3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpd19wYXJhbSAqZGF0YSwgY2hhciAqZXh0cmEpCiB7Ci0JLy9wcmludGsoIj09PT0+JXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKwkvL3ByaW50aygiPT09PT4lcygpXG4iLCBfX2Z1bmNfXyk7CiAJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOwogCWludCByZXQ9MDsKIApAQCAtMTI5NCw3ICsxMjk0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQogewotCS8vcHJpbnRrKCI9PT09PiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisJLy9wcmludGsoIj09PT0+JXMoKVxuIiwgX19mdW5jX18pOwogCiAJaW50IHJldD0wOwogCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKQEAgLTEzMTUsNyArMTMxNSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaXdfcG9pbnQgKmRhdGEsIGNoYXIgKmV4dHJhKQogewotLy8JcHJpbnRrKCI9PT09PiVzKCksIGxlbjolZFxuIiwgX19GVU5DVElPTl9fLCBkYXRhLT5sZW5ndGgpOworLy8JcHJpbnRrKCI9PT09PiVzKCksIGxlbjolZFxuIiwgX19mdW5jX18sIGRhdGEtPmxlbmd0aCk7CiAJaW50IHJldD0wOwogICAgICAgICBzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CiAKQEAgLTEzMjgsNyArMTMyOCw3IEBACiAgICAgICAgIHJldCA9IGllZWU4MDIxMV93eF9zZXRfZ2VuX2llKHByaXYtPmllZWU4MDIxMSwgZXh0cmEsIGRhdGEtPmxlbmd0aCk7CiAjZW5kaWYKICAgICAgICAgdXAoJnByaXYtPnd4X3NlbSk7Ci0JLy9wcmludGsoIjw9PT09PT0lcygpLCByZXQ6JWRcbiIsIF9fRlVOQ1RJT05fXywgcmV0KTsKKwkvL3ByaW50aygiPD09PT09PSVzKCksIHJldDolZFxuIiwgX19mdW5jX18sIHJldCk7CiAgICAgICAgIHJldHVybiByZXQ7CiAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvS2NvbmZpZyBiL2RyaXZlcnMvdXNiL0tjb25maWcKaW5kZXggMjg5ZDgxYS4uODNiYWJiMCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvS2NvbmZpZworKysgYi9kcml2ZXJzL3VzYi9LY29uZmlnCkBAIC0xNTAsNCArMTUwLDYgQEAKIAogc291cmNlICJkcml2ZXJzL3VzYi9nYWRnZXQvS2NvbmZpZyIKIAorc291cmNlICJkcml2ZXJzL3VzYi9vdGcvS2NvbmZpZyIKKwogZW5kaWYgIyBVU0JfU1VQUE9SVApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvY2xhc3MvY2RjLWFjbS5jIGIvZHJpdmVycy91c2IvY2xhc3MvY2RjLWFjbS5jCmluZGV4IGQ1MGE5OWYuLjAwYjQ3ZWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2NsYXNzL2NkYy1hY20uYworKysgYi9kcml2ZXJzL3VzYi9jbGFzcy9jZGMtYWNtLmMKQEAgLTEyNzUsNyArMTI3NSw3IEBACiAJc3RydWN0IGFjbSAqYWNtID0gdXNiX2dldF9pbnRmZGF0YShpbnRmKTsKIAlpbnQgY250OwogCi0JaWYgKGFjbS0+ZGV2LT5hdXRvX3BtKSB7CisJaWYgKG1lc3NhZ2UuZXZlbnQgJiBQTV9FVkVOVF9BVVRPKSB7CiAJCWludCBiOwogCiAJCXNwaW5fbG9ja19pcnEoJmFjbS0+cmVhZF9sb2NrKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NsYXNzL2NkYy13ZG0uYyBiL2RyaXZlcnMvdXNiL2NsYXNzL2NkYy13ZG0uYwppbmRleCA1YThlY2MwLi4zNzcxZDZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jbGFzcy9jZGMtd2RtLmMKKysrIGIvZHJpdmVycy91c2IvY2xhc3MvY2RjLXdkbS5jCkBAIC03NjQsNyArNzY0LDggQEAKIAogCW11dGV4X2xvY2soJmRlc2MtPnBsb2NrKTsKICNpZmRlZiBDT05GSUdfUE0KLQlpZiAoaW50ZXJmYWNlX3RvX3VzYmRldihkZXNjLT5pbnRmKS0+YXV0b19wbSAmJiB0ZXN0X2JpdChXRE1fSU5fVVNFLCAmZGVzYy0+ZmxhZ3MpKSB7CisJaWYgKChtZXNzYWdlLmV2ZW50ICYgUE1fRVZFTlRfQVVUTykgJiYKKwkJCXRlc3RfYml0KFdETV9JTl9VU0UsICZkZXNjLT5mbGFncykpIHsKIAkJcnYgPSAtRUJVU1k7CiAJfSBlbHNlIHsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvY2xhc3MvdXNidG1jLmMgYi9kcml2ZXJzL3VzYi9jbGFzcy91c2J0bWMuYwppbmRleCA0M2E4NjNjLi4wZjVjMDVmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jbGFzcy91c2J0bWMuYworKysgYi9kcml2ZXJzL3VzYi9jbGFzcy91c2J0bWMuYwpAQCAtMjEsNiArMjEsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGxpbnV4L2tyZWYuaD4KQEAgLTQ4Miw3ICs0ODMsNiBAQAogCWludCByZXR2YWw7CiAJaW50IGFjdHVhbDsKIAl1bnNpZ25lZCBsb25nIGludCBuX2J5dGVzOwotCWludCBuOwogCWludCByZW1haW5pbmc7CiAJaW50IGRvbmU7CiAJaW50IHRoaXNfcGFydDsKQEAgLTUyNiwxMSArNTI2LDggQEAKIAkJCWdvdG8gZXhpdDsKIAkJfQogCi0JCW5fYnl0ZXMgPSAxMiArIHRoaXNfcGFydDsKLQkJaWYgKHRoaXNfcGFydCAlIDQpCi0JCQluX2J5dGVzICs9IDQgLSB0aGlzX3BhcnQgJSA0OwotCQkJZm9yIChuID0gMTIgKyB0aGlzX3BhcnQ7IG4gPCBuX2J5dGVzOyBuKyspCi0JCQkJYnVmZmVyW25dID0gMDsKKwkJbl9ieXRlcyA9IHJvdW5kdXAoMTIgKyB0aGlzX3BhcnQsIDQpOworCQltZW1zZXQoYnVmZmVyICsgMTIgKyB0aGlzX3BhcnQsIDAsIG5fYnl0ZXMgLSAoMTIgKyB0aGlzX3BhcnQpKTsKIAogCQlyZXR2YWwgPSB1c2JfYnVsa19tc2coZGF0YS0+dXNiX2RldiwKIAkJCQkgICAgICB1c2Jfc25kYnVsa3BpcGUoZGF0YS0+dXNiX2RldiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NvcmUvZGV2aW8uYyBiL2RyaXZlcnMvdXNiL2NvcmUvZGV2aW8uYwppbmRleCBhYTc5MjgwLi4yNmZlY2UxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jb3JlL2RldmlvLmMKKysrIGIvZHJpdmVycy91c2IvY29yZS9kZXZpby5jCkBAIC05ODEsOSArOTgxLDYgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJaWYgKCF1dXJiLT5idWZmZXIpCiAJCXJldHVybiAtRUlOVkFMOwotCWlmICh1dXJiLT5zaWduciAhPSAwICYmICh1dXJiLT5zaWduciA8IFNJR1JUTUlOIHx8Ci0JCQkJIHV1cmItPnNpZ25yID4gU0lHUlRNQVgpKQotCQlyZXR1cm4gLUVJTlZBTDsKIAlpZiAoISh1dXJiLT50eXBlID09IFVTQkRFVkZTX1VSQl9UWVBFX0NPTlRST0wgJiYKIAkgICAgKHV1cmItPmVuZHBvaW50ICYgflVTQl9FTkRQT0lOVF9ESVJfTUFTSykgPT0gMCkpIHsKIAkJaWZudW0gPSBmaW5kaW50ZmVwKHBzLT5kZXYsIHV1cmItPmVuZHBvaW50KTsKQEAgLTEzMjAsNyArMTMxNyw3IEBACiAJaWYgKF9fZ2V0X3VzZXIodXB0ciwgJnV1cmItPmJ1ZmZlcikpCiAJCXJldHVybiAtRUZBVUxUOwogCWt1cmItPmJ1ZmZlciA9IGNvbXBhdF9wdHIodXB0cik7Ci0JaWYgKF9fZ2V0X3VzZXIodXB0ciwgJnV1cmItPmJ1ZmZlcikpCisJaWYgKF9fZ2V0X3VzZXIodXB0ciwgJnV1cmItPnVzZXJjb250ZXh0KSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJa3VyYi0+dXNlcmNvbnRleHQgPSBjb21wYXRfcHRyKHVwdHIpOwogCkBAIC0xNDAxLDggKzEzOTgsNiBAQAogCiAJaWYgKGNvcHlfZnJvbV91c2VyKCZkcywgYXJnLCBzaXplb2YoZHMpKSkKIAkJcmV0dXJuIC1FRkFVTFQ7Ci0JaWYgKGRzLnNpZ25yICE9IDAgJiYgKGRzLnNpZ25yIDwgU0lHUlRNSU4gfHwgZHMuc2lnbnIgPiBTSUdSVE1BWCkpCi0JCXJldHVybiAtRUlOVkFMOwogCXBzLT5kaXNjc2lnbnIgPSBkcy5zaWducjsKIAlwcy0+ZGlzY2NvbnRleHQgPSBkcy5jb250ZXh0OwogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvY29yZS9kcml2ZXIuYyBiL2RyaXZlcnMvdXNiL2NvcmUvZHJpdmVyLmMKaW5kZXggOGMwODEzMC4uOTg3NjA1NSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvY29yZS9kcml2ZXIuYworKysgYi9kcml2ZXJzL3VzYi9jb3JlL2RyaXZlci5jCkBAIC0xODQsNiArMTg0LDIwIEBACiAJcmV0dXJuIDA7CiB9CiAKKy8qCisgKiBDYW5jZWwgYW55IHBlbmRpbmcgc2NoZWR1bGVkIHJlc2V0cworICoKKyAqIFtzZWUgdXNiX3F1ZXVlX3Jlc2V0X2RldmljZSgpXQorICoKKyAqIENhbGxlZCBhZnRlciB1bmNvbmZpZ3VyaW5nIC8gd2hlbiByZWxlYXNpbmcgaW50ZXJmYWNlcy4gU2VlCisgKiBjb21tZW50cyBpbiBfX3VzYl9xdWV1ZV9yZXNldF9kZXZpY2UoKSByZWdhcmRpbmcKKyAqIHVkZXYtPnJlc2V0X3J1bm5pbmcuCisgKi8KK3N0YXRpYyB2b2lkIHVzYl9jYW5jZWxfcXVldWVkX3Jlc2V0KHN0cnVjdCB1c2JfaW50ZXJmYWNlICppZmFjZSkKK3sKKwlpZiAoaWZhY2UtPnJlc2V0X3J1bm5pbmcgPT0gMCkKKwkJY2FuY2VsX3dvcmtfc3luYygmaWZhY2UtPnJlc2V0X3dzKTsKK30KIAogLyogY2FsbGVkIGZyb20gZHJpdmVyIGNvcmUgd2l0aCBkZXYgbG9ja2VkICovCiBzdGF0aWMgaW50IHVzYl9wcm9iZV9pbnRlcmZhY2Uoc3RydWN0IGRldmljZSAqZGV2KQpAQCAtMjQyLDYgKzI1Niw3IEBACiAJCQltYXJrX3F1aWVzY2VkKGludGYpOwogCQkJaW50Zi0+bmVlZHNfcmVtb3RlX3dha2V1cCA9IDA7CiAJCQlpbnRmLT5jb25kaXRpb24gPSBVU0JfSU5URVJGQUNFX1VOQk9VTkQ7CisJCQl1c2JfY2FuY2VsX3F1ZXVlZF9yZXNldChpbnRmKTsKIAkJfSBlbHNlCiAJCQlpbnRmLT5jb25kaXRpb24gPSBVU0JfSU5URVJGQUNFX0JPVU5EOwogCkBAIC0yNzIsNiArMjg3LDcgQEAKIAkJdXNiX2Rpc2FibGVfaW50ZXJmYWNlKHVkZXYsIGludGYpOwogCiAJZHJpdmVyLT5kaXNjb25uZWN0KGludGYpOworCXVzYl9jYW5jZWxfcXVldWVkX3Jlc2V0KGludGYpOwogCiAJLyogUmVzZXQgb3RoZXIgaW50ZXJmYWNlIHN0YXRlLgogCSAqIFdlIGNhbm5vdCBkbyBhIFNldC1JbnRlcmZhY2UgaWYgdGhlIGRldmljZSBpcyBzdXNwZW5kZWQgb3IKQEAgLTI3OSw5ICsyOTUsMTIgQEAKIAkgKiBhbHRzZXR0aW5nIG1lYW5zIGNyZWF0aW5nIG5ldyBlbmRwb2ludCBkZXZpY2UgZW50cmllcykuCiAJICogV2hlbiBlaXRoZXIgb2YgdGhlc2UgaGFwcGVucywgZGVmZXIgdGhlIFNldC1JbnRlcmZhY2UuCiAJICovCi0JaWYgKGludGYtPmN1cl9hbHRzZXR0aW5nLT5kZXNjLmJBbHRlcm5hdGVTZXR0aW5nID09IDApCi0JCTsJLyogQWxyZWFkeSBpbiBhbHRzZXR0aW5nIDAgc28gc2tpcCBTZXQtSW50ZXJmYWNlICovCi0JZWxzZSBpZiAoIWVycm9yICYmIGludGYtPmRldi5wb3dlci5zdGF0dXMgPT0gRFBNX09OKQorCWlmIChpbnRmLT5jdXJfYWx0c2V0dGluZy0+ZGVzYy5iQWx0ZXJuYXRlU2V0dGluZyA9PSAwKSB7CisJCS8qIEFscmVhZHkgaW4gYWx0c2V0dGluZyAwIHNvIHNraXAgU2V0LUludGVyZmFjZS4KKwkJICogSnVzdCByZS1lbmFibGUgaXQgd2l0aG91dCBhZmZlY3RpbmcgdGhlIGVuZHBvaW50IHRvZ2dsZXMuCisJCSAqLworCQl1c2JfZW5hYmxlX2ludGVyZmFjZSh1ZGV2LCBpbnRmLCBmYWxzZSk7CisJfSBlbHNlIGlmICghZXJyb3IgJiYgaW50Zi0+ZGV2LnBvd2VyLnN0YXR1cyA9PSBEUE1fT04pCiAJCXVzYl9zZXRfaW50ZXJmYWNlKHVkZXYsIGludGYtPmFsdHNldHRpbmdbMF0uCiAJCQkJZGVzYy5iSW50ZXJmYWNlTnVtYmVyLCAwKTsKIAllbHNlCkBAIC0zODAsOCArMzk5LDEwIEBACiAJaWYgKGRldmljZV9pc19yZWdpc3RlcmVkKGRldikpIHsKIAkJaWZhY2UtPmNvbmRpdGlvbiA9IFVTQl9JTlRFUkZBQ0VfVU5CSU5ESU5HOwogCQlkZXZpY2VfcmVsZWFzZV9kcml2ZXIoZGV2KTsKKwl9IGVsc2UgeworCQlpZmFjZS0+Y29uZGl0aW9uID0gVVNCX0lOVEVSRkFDRV9VTkJPVU5EOworCQl1c2JfY2FuY2VsX3F1ZXVlZF9yZXNldChpZmFjZSk7CiAJfQotCiAJZGV2LT5kcml2ZXIgPSBOVUxMOwogCXVzYl9zZXRfaW50ZmRhdGEoaWZhY2UsIE5VTEwpOwogCkBAIC05MDQsNyArOTI1LDcgQEAKIH0KIAogLyogQ2FsbGVyIGhhcyBsb2NrZWQgdWRldidzIHBtX211dGV4ICovCi1zdGF0aWMgaW50IHVzYl9yZXN1bWVfZGV2aWNlKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2KQorc3RhdGljIGludCB1c2JfcmVzdW1lX2RldmljZShzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiwgcG1fbWVzc2FnZV90IG1zZykKIHsKIAlzdHJ1Y3QgdXNiX2RldmljZV9kcml2ZXIJKnVkcml2ZXI7CiAJaW50CQkJCXN0YXR1cyA9IDA7CkBAIC05MjIsNyArOTQzLDcgQEAKIAkJdWRldi0+cmVzZXRfcmVzdW1lID0gMTsKIAogCXVkcml2ZXIgPSB0b191c2JfZGV2aWNlX2RyaXZlcih1ZGV2LT5kZXYuZHJpdmVyKTsKLQlzdGF0dXMgPSB1ZHJpdmVyLT5yZXN1bWUodWRldik7CisJc3RhdHVzID0gdWRyaXZlci0+cmVzdW1lKHVkZXYsIG1zZyk7CiAKICBkb25lOgogCWRldl92ZGJnKCZ1ZGV2LT5kZXYsICIlczogc3RhdHVzICVkXG4iLCBfX2Z1bmNfXywgc3RhdHVzKTsKQEAgLTk0Miw3ICs5NjMsOCBAQAogCWlmICh1ZGV2LT5zdGF0ZSA9PSBVU0JfU1RBVEVfTk9UQVRUQUNIRUQgfHwgIWlzX2FjdGl2ZShpbnRmKSkKIAkJZ290byBkb25lOwogCi0JaWYgKGludGYtPmNvbmRpdGlvbiA9PSBVU0JfSU5URVJGQUNFX1VOQk9VTkQpCS8qIFRoaXMgY2FuJ3QgaGFwcGVuICovCisJLyogVGhpcyBjYW4gaGFwcGVuOyBzZWUgdXNiX2RyaXZlcl9yZWxlYXNlX2ludGVyZmFjZSgpICovCisJaWYgKGludGYtPmNvbmRpdGlvbiA9PSBVU0JfSU5URVJGQUNFX1VOQk9VTkQpCiAJCWdvdG8gZG9uZTsKIAlkcml2ZXIgPSB0b191c2JfZHJpdmVyKGludGYtPmRldi5kcml2ZXIpOwogCkBAIC05NTAsNyArOTcyLDcgQEAKIAkJc3RhdHVzID0gZHJpdmVyLT5zdXNwZW5kKGludGYsIG1zZyk7CiAJCWlmIChzdGF0dXMgPT0gMCkKIAkJCW1hcmtfcXVpZXNjZWQoaW50Zik7Ci0JCWVsc2UgaWYgKCF1ZGV2LT5hdXRvX3BtKQorCQllbHNlIGlmICghKG1zZy5ldmVudCAmIFBNX0VWRU5UX0FVVE8pKQogCQkJZGV2X2VycigmaW50Zi0+ZGV2LCAiJXMgZXJyb3IgJWRcbiIsCiAJCQkJCSJzdXNwZW5kIiwgc3RhdHVzKTsKIAl9IGVsc2UgewpAQCAtOTY4LDcgKzk5MCw3IEBACiAKIC8qIENhbGxlciBoYXMgbG9ja2VkIGludGYncyB1c2JfZGV2aWNlJ3MgcG1fbXV0ZXggKi8KIHN0YXRpYyBpbnQgdXNiX3Jlc3VtZV9pbnRlcmZhY2Uoc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYsCi0JCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLCBpbnQgcmVzZXRfcmVzdW1lKQorCQlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwgcG1fbWVzc2FnZV90IG1zZywgaW50IHJlc2V0X3Jlc3VtZSkKIHsKIAlzdHJ1Y3QgdXNiX2RyaXZlcgkqZHJpdmVyOwogCWludAkJCXN0YXR1cyA9IDA7CkBAIC0xMDkyLDcgKzExMTQsNyBAQAogCWlmIChyZXNjaGVkdWxlKSB7CiAJCWlmICghdGltZXJfcGVuZGluZygmdWRldi0+YXV0b3N1c3BlbmQudGltZXIpKSB7CiAJCQlxdWV1ZV9kZWxheWVkX3dvcmsoa3N1c3BlbmRfdXNiX3dxLCAmdWRldi0+YXV0b3N1c3BlbmQsCi0JCQkJcm91bmRfamlmZmllc19yZWxhdGl2ZShzdXNwZW5kX3RpbWUgLSBqKSk7CisJCQkJcm91bmRfamlmZmllc191cF9yZWxhdGl2ZShzdXNwZW5kX3RpbWUgLSBqKSk7CiAJCX0KIAkJcmV0dXJuIC1FQUdBSU47CiAJfQpAQCAtMTExOSwxMCArMTE0MSw5IEBACiAgKiBhbGwgdGhlIGludGVyZmFjZXMgd2hpY2ggd2VyZSBzdXNwZW5kZWQgYXJlIHJlc3VtZWQgc28gdGhhdCB0aGV5IHJlbWFpbgogICogaW4gdGhlIHNhbWUgc3RhdGUgYXMgdGhlIGRldmljZS4KICAqCi0gKiBJZiBhbiBhdXRvc3VzcGVuZCBpcyBpbiBwcm9ncmVzcyAoQHVkZXYtPmF1dG9fcG0gaXMgc2V0KSwgdGhlIHJvdXRpbmUKLSAqIGNoZWNrcyBmaXJzdCB0byBtYWtlIHN1cmUgdGhhdCBuZWl0aGVyIHRoZSBkZXZpY2UgaXRzZWxmIG9yIGFueSBvZiBpdHMKLSAqIGFjdGl2ZSBpbnRlcmZhY2VzIGlzIGluIHVzZSAocG1fdXNhZ2VfY250IGlzIGdyZWF0ZXIgdGhhbiAwKS4gIElmIHRoZXkKLSAqIGFyZSwgdGhlIGF1dG9zdXNwZW5kIGZhaWxzLgorICogSWYgYW4gYXV0b3N1c3BlbmQgaXMgaW4gcHJvZ3Jlc3MgdGhlIHJvdXRpbmUgY2hlY2tzIGZpcnN0IHRvIG1ha2Ugc3VyZQorICogdGhhdCBuZWl0aGVyIHRoZSBkZXZpY2UgaXRzZWxmIG9yIGFueSBvZiBpdHMgYWN0aXZlIGludGVyZmFjZXMgaXMgaW4gdXNlCisgKiAocG1fdXNhZ2VfY250IGlzIGdyZWF0ZXIgdGhhbiAwKS4gIElmIHRoZXkgYXJlLCB0aGUgYXV0b3N1c3BlbmQgZmFpbHMuCiAgKgogICogSWYgdGhlIHN1c3BlbmQgc3VjY2VlZHMsIHRoZSByb3V0aW5lIHJlY3Vyc2l2ZWx5IHF1ZXVlcyBhbiBhdXRvc3VzcGVuZAogICogcmVxdWVzdCBmb3IgQHVkZXYncyBwYXJlbnQgZGV2aWNlLCB0aGVyZWJ5IHByb3BhZ2F0aW5nIHRoZSBjaGFuZ2UgdXAKQEAgLTExNTcsNyArMTE3OCw3IEBACiAKIAl1ZGV2LT5kb19yZW1vdGVfd2FrZXVwID0gZGV2aWNlX21heV93YWtldXAoJnVkZXYtPmRldik7CiAKLQlpZiAodWRldi0+YXV0b19wbSkgeworCWlmIChtc2cuZXZlbnQgJiBQTV9FVkVOVF9BVVRPKSB7CiAJCXN0YXR1cyA9IGF1dG9zdXNwZW5kX2NoZWNrKHVkZXYsIDApOwogCQlpZiAoc3RhdHVzIDwgMCkKIAkJCWdvdG8gZG9uZTsKQEAgLTExNzcsMTMgKzExOTgsMTYgQEAKIAogCS8qIElmIHRoZSBzdXNwZW5kIGZhaWxlZCwgcmVzdW1lIGludGVyZmFjZXMgdGhhdCBkaWQgZ2V0IHN1c3BlbmRlZCAqLwogCWlmIChzdGF0dXMgIT0gMCkgeworCQlwbV9tZXNzYWdlX3QgbXNnMjsKKworCQltc2cyLmV2ZW50ID0gbXNnLmV2ZW50IF4gKFBNX0VWRU5UX1NVU1BFTkQgfCBQTV9FVkVOVF9SRVNVTUUpOwogCQl3aGlsZSAoLS1pID49IDApIHsKIAkJCWludGYgPSB1ZGV2LT5hY3Rjb25maWctPmludGVyZmFjZVtpXTsKLQkJCXVzYl9yZXN1bWVfaW50ZXJmYWNlKHVkZXYsIGludGYsIDApOworCQkJdXNiX3Jlc3VtZV9pbnRlcmZhY2UodWRldiwgaW50ZiwgbXNnMiwgMCk7CiAJCX0KIAogCQkvKiBUcnkgYW5vdGhlciBhdXRvc3VzcGVuZCB3aGVuIHRoZSBpbnRlcmZhY2VzIGFyZW4ndCBidXN5ICovCi0JCWlmICh1ZGV2LT5hdXRvX3BtKQorCQlpZiAobXNnLmV2ZW50ICYgUE1fRVZFTlRfQVVUTykKIAkJCWF1dG9zdXNwZW5kX2NoZWNrKHVkZXYsIHN0YXR1cyA9PSAtRUJVU1kpOwogCiAJLyogSWYgdGhlIHN1c3BlbmQgc3VjY2VlZGVkIHRoZW4gcHJldmVudCBhbnkgbW9yZSBVUkIgc3VibWlzc2lvbnMsCkBAIC0xMjEzLDYgKzEyMzcsNyBAQAogLyoqCiAgKiB1c2JfcmVzdW1lX2JvdGggLSByZXN1bWUgYSBVU0IgZGV2aWNlIGFuZCBpdHMgaW50ZXJmYWNlcwogICogQHVkZXY6IHRoZSB1c2JfZGV2aWNlIHRvIHJlc3VtZQorICogQG1zZzogUG93ZXIgTWFuYWdlbWVudCBtZXNzYWdlIGRlc2NyaWJpbmcgdGhpcyBzdGF0ZSB0cmFuc2l0aW9uCiAgKgogICogVGhpcyBpcyB0aGUgY2VudHJhbCByb3V0aW5lIGZvciByZXN1bWluZyBVU0IgZGV2aWNlcy4gIEl0IGNhbGxzIHRoZQogICogdGhlIHJlc3VtZSBtZXRob2QgZm9yIEB1ZGV2IGFuZCB0aGVuIGNhbGxzIHRoZSByZXN1bWUgbWV0aG9kcyBmb3IgYWxsCkBAIC0xMjM4LDcgKzEyNjMsNyBAQAogICoKICAqIFRoaXMgcm91dGluZSBjYW4gcnVuIG9ubHkgaW4gcHJvY2VzcyBjb250ZXh0LgogICovCi1zdGF0aWMgaW50IHVzYl9yZXN1bWVfYm90aChzdHJ1Y3QgdXNiX2RldmljZSAqdWRldikKK3N0YXRpYyBpbnQgdXNiX3Jlc3VtZV9ib3RoKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2LCBwbV9tZXNzYWdlX3QgbXNnKQogewogCWludAkJCXN0YXR1cyA9IDA7CiAJaW50CQkJaTsKQEAgLTEyNTQsMTQgKzEyNzksMTUgQEAKIAogCS8qIFByb3BhZ2F0ZSB0aGUgcmVzdW1lIHVwIHRoZSB0cmVlLCBpZiBuZWNlc3NhcnkgKi8KIAlpZiAodWRldi0+c3RhdGUgPT0gVVNCX1NUQVRFX1NVU1BFTkRFRCkgewotCQlpZiAodWRldi0+YXV0b19wbSAmJiB1ZGV2LT5hdXRvcmVzdW1lX2Rpc2FibGVkKSB7CisJCWlmICgobXNnLmV2ZW50ICYgUE1fRVZFTlRfQVVUTykgJiYKKwkJCQl1ZGV2LT5hdXRvcmVzdW1lX2Rpc2FibGVkKSB7CiAJCQlzdGF0dXMgPSAtRVBFUk07CiAJCQlnb3RvIGRvbmU7CiAJCX0KIAkJaWYgKHBhcmVudCkgewogCQkJc3RhdHVzID0gdXNiX2F1dG9yZXN1bWVfZGV2aWNlKHBhcmVudCk7CiAJCQlpZiAoc3RhdHVzID09IDApIHsKLQkJCQlzdGF0dXMgPSB1c2JfcmVzdW1lX2RldmljZSh1ZGV2KTsKKwkJCQlzdGF0dXMgPSB1c2JfcmVzdW1lX2RldmljZSh1ZGV2LCBtc2cpOwogCQkJCWlmIChzdGF0dXMgfHwgdWRldi0+c3RhdGUgPT0KIAkJCQkJCVVTQl9TVEFURV9OT1RBVFRBQ0hFRCkgewogCQkJCQl1c2JfYXV0b3N1c3BlbmRfZGV2aWNlKHBhcmVudCk7CkBAIC0xMjg0LDE1ICsxMzEwLDE2IEBACiAJCQkvKiBXZSBjYW4ndCBwcm9nYWdhdGUgYmV5b25kIHRoZSBVU0Igc3Vic3lzdGVtLAogCQkJICogc28gaWYgYSByb290IGh1YidzIGNvbnRyb2xsZXIgaXMgc3VzcGVuZGVkCiAJCQkgKiB0aGVuIHdlJ3JlIHN0dWNrLiAqLwotCQkJc3RhdHVzID0gdXNiX3Jlc3VtZV9kZXZpY2UodWRldik7CisJCQlzdGF0dXMgPSB1c2JfcmVzdW1lX2RldmljZSh1ZGV2LCBtc2cpOwogCQl9CiAJfSBlbHNlIGlmICh1ZGV2LT5yZXNldF9yZXN1bWUpCi0JCXN0YXR1cyA9IHVzYl9yZXN1bWVfZGV2aWNlKHVkZXYpOworCQlzdGF0dXMgPSB1c2JfcmVzdW1lX2RldmljZSh1ZGV2LCBtc2cpOwogCiAJaWYgKHN0YXR1cyA9PSAwICYmIHVkZXYtPmFjdGNvbmZpZykgewogCQlmb3IgKGkgPSAwOyBpIDwgdWRldi0+YWN0Y29uZmlnLT5kZXNjLmJOdW1JbnRlcmZhY2VzOyBpKyspIHsKIAkJCWludGYgPSB1ZGV2LT5hY3Rjb25maWctPmludGVyZmFjZVtpXTsKLQkJCXVzYl9yZXN1bWVfaW50ZXJmYWNlKHVkZXYsIGludGYsIHVkZXYtPnJlc2V0X3Jlc3VtZSk7CisJCQl1c2JfcmVzdW1lX2ludGVyZmFjZSh1ZGV2LCBpbnRmLCBtc2csCisJCQkJCXVkZXYtPnJlc2V0X3Jlc3VtZSk7CiAJCX0KIAl9CiAKQEAgLTEzMjAsMTMgKzEzNDcsMTMgQEAKIAkJdWRldi0+bGFzdF9idXN5ID0gamlmZmllczsKIAlpZiAoaW5jX3VzYWdlX2NudCA+PSAwICYmIHVkZXYtPnBtX3VzYWdlX2NudCA+IDApIHsKIAkJaWYgKHVkZXYtPnN0YXRlID09IFVTQl9TVEFURV9TVVNQRU5ERUQpCi0JCQlzdGF0dXMgPSB1c2JfcmVzdW1lX2JvdGgodWRldik7CisJCQlzdGF0dXMgPSB1c2JfcmVzdW1lX2JvdGgodWRldiwgUE1TR19BVVRPX1JFU1VNRSk7CiAJCWlmIChzdGF0dXMgIT0gMCkKIAkJCXVkZXYtPnBtX3VzYWdlX2NudCAtPSBpbmNfdXNhZ2VfY250OwogCQllbHNlIGlmIChpbmNfdXNhZ2VfY250KQogCQkJdWRldi0+bGFzdF9idXN5ID0gamlmZmllczsKIAl9IGVsc2UgaWYgKGluY191c2FnZV9jbnQgPD0gMCAmJiB1ZGV2LT5wbV91c2FnZV9jbnQgPD0gMCkgewotCQlzdGF0dXMgPSB1c2Jfc3VzcGVuZF9ib3RoKHVkZXYsIFBNU0dfU1VTUEVORCk7CisJCXN0YXR1cyA9IHVzYl9zdXNwZW5kX2JvdGgodWRldiwgUE1TR19BVVRPX1NVU1BFTkQpOwogCX0KIAl1c2JfcG1fdW5sb2NrKHVkZXYpOwogCXJldHVybiBzdGF0dXM7CkBAIC0xMzQxLDYgKzEzNjgsMTkgQEAKIAl1c2JfYXV0b3BtX2RvX2RldmljZSh1ZGV2LCAwKTsKIH0KIAorLyogdXNiX2F1dG9yZXN1bWVfd29yayAtIGNhbGxiYWNrIHJvdXRpbmUgdG8gYXV0b3Jlc3VtZSBhIFVTQiBkZXZpY2UgKi8KK3ZvaWQgdXNiX2F1dG9yZXN1bWVfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYgPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IHVzYl9kZXZpY2UsIGF1dG9yZXN1bWUpOworCisJLyogV2FrZSBpdCB1cCwgbGV0IHRoZSBkcml2ZXJzIGRvIHRoZWlyIHRoaW5nLCBhbmQgdGhlbiBwdXQgaXQKKwkgKiBiYWNrIHRvIHNsZWVwLgorCSAqLworCWlmICh1c2JfYXV0b3BtX2RvX2RldmljZSh1ZGV2LCAxKSA9PSAwKQorCQl1c2JfYXV0b3BtX2RvX2RldmljZSh1ZGV2LCAtMSk7Cit9CisKIC8qKgogICogdXNiX2F1dG9zdXNwZW5kX2RldmljZSAtIGRlbGF5ZWQgYXV0b3N1c3BlbmQgb2YgYSBVU0IgZGV2aWNlIGFuZCBpdHMgaW50ZXJmYWNlcwogICogQHVkZXY6IHRoZSB1c2JfZGV2aWNlIHRvIGF1dG9zdXNwZW5kCkBAIC0xNDM3LDEzICsxNDc3LDE0IEBACiAJCXVkZXYtPmxhc3RfYnVzeSA9IGppZmZpZXM7CiAJCWlmIChpbmNfdXNhZ2VfY250ID49IDAgJiYgaW50Zi0+cG1fdXNhZ2VfY250ID4gMCkgewogCQkJaWYgKHVkZXYtPnN0YXRlID09IFVTQl9TVEFURV9TVVNQRU5ERUQpCi0JCQkJc3RhdHVzID0gdXNiX3Jlc3VtZV9ib3RoKHVkZXYpOworCQkJCXN0YXR1cyA9IHVzYl9yZXN1bWVfYm90aCh1ZGV2LAorCQkJCQkJUE1TR19BVVRPX1JFU1VNRSk7CiAJCQlpZiAoc3RhdHVzICE9IDApCiAJCQkJaW50Zi0+cG1fdXNhZ2VfY250IC09IGluY191c2FnZV9jbnQ7CiAJCQllbHNlCiAJCQkJdWRldi0+bGFzdF9idXN5ID0gamlmZmllczsKIAkJfSBlbHNlIGlmIChpbmNfdXNhZ2VfY250IDw9IDAgJiYgaW50Zi0+cG1fdXNhZ2VfY250IDw9IDApIHsKLQkJCXN0YXR1cyA9IHVzYl9zdXNwZW5kX2JvdGgodWRldiwgUE1TR19TVVNQRU5EKTsKKwkJCXN0YXR1cyA9IHVzYl9zdXNwZW5kX2JvdGgodWRldiwgUE1TR19BVVRPX1NVU1BFTkQpOwogCQl9CiAJfQogCXVzYl9wbV91bmxvY2sodWRldik7CkBAIC0xNDkyLDYgKzE1MzMsNDUgQEAKIEVYUE9SVF9TWU1CT0xfR1BMKHVzYl9hdXRvcG1fcHV0X2ludGVyZmFjZSk7CiAKIC8qKgorICogdXNiX2F1dG9wbV9wdXRfaW50ZXJmYWNlX2FzeW5jIC0gZGVjcmVtZW50IGEgVVNCIGludGVyZmFjZSdzIFBNLXVzYWdlIGNvdW50ZXIKKyAqIEBpbnRmOiB0aGUgdXNiX2ludGVyZmFjZSB3aG9zZSBjb3VudGVyIHNob3VsZCBiZSBkZWNyZW1lbnRlZAorICoKKyAqIFRoaXMgcm91dGluZSBkb2VzIGVzc2VudGlhbGx5IHRoZSBzYW1lIHRoaW5nIGFzCisgKiB1c2JfYXV0b3BtX3B1dF9pbnRlcmZhY2UoKTogaXQgZGVjcmVtZW50cyBAaW50ZidzIHVzYWdlIGNvdW50ZXIgYW5kCisgKiBxdWV1ZXMgYSBkZWxheWVkIGF1dG9zdXNwZW5kIHJlcXVlc3QgaWYgdGhlIGNvdW50ZXIgaXMgPD0gMC4gIFRoZQorICogZGlmZmVyZW5jZSBpcyB0aGF0IGl0IGRvZXMgbm90IGFjcXVpcmUgdGhlIGRldmljZSdzIHBtX211dGV4OworICogY2FsbGVycyBtdXN0IGhhbmRsZSBhbGwgc3luY2hyb25pemF0aW9uIGlzc3VlcyB0aGVtc2VsdmVzLgorICoKKyAqIFR5cGljYWxseSBhIGRyaXZlciB3b3VsZCBjYWxsIHRoaXMgcm91dGluZSBkdXJpbmcgYW4gVVJCJ3MgY29tcGxldGlvbgorICogaGFuZGxlciwgaWYgbm8gbW9yZSBVUkJzIHdlcmUgcGVuZGluZy4KKyAqCisgKiBUaGlzIHJvdXRpbmUgY2FuIHJ1biBpbiBhdG9taWMgY29udGV4dC4KKyAqLwordm9pZCB1c2JfYXV0b3BtX3B1dF9pbnRlcmZhY2VfYXN5bmMoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCit7CisJc3RydWN0IHVzYl9kZXZpY2UJKnVkZXYgPSBpbnRlcmZhY2VfdG9fdXNiZGV2KGludGYpOworCWludAkJCXN0YXR1cyA9IDA7CisKKwlpZiAoaW50Zi0+Y29uZGl0aW9uID09IFVTQl9JTlRFUkZBQ0VfVU5CT1VORCkgeworCQlzdGF0dXMgPSAtRU5PREVWOworCX0gZWxzZSB7CisJCXVkZXYtPmxhc3RfYnVzeSA9IGppZmZpZXM7CisJCS0taW50Zi0+cG1fdXNhZ2VfY250OworCQlpZiAodWRldi0+YXV0b3N1c3BlbmRfZGlzYWJsZWQgfHwgdWRldi0+YXV0b3N1c3BlbmRfZGVsYXkgPCAwKQorCQkJc3RhdHVzID0gLUVQRVJNOworCQllbHNlIGlmIChpbnRmLT5wbV91c2FnZV9jbnQgPD0gMCAmJgorCQkJCSF0aW1lcl9wZW5kaW5nKCZ1ZGV2LT5hdXRvc3VzcGVuZC50aW1lcikpIHsKKwkJCXF1ZXVlX2RlbGF5ZWRfd29yayhrc3VzcGVuZF91c2Jfd3EsICZ1ZGV2LT5hdXRvc3VzcGVuZCwKKwkJCQkJcm91bmRfamlmZmllc191cF9yZWxhdGl2ZSgKKwkJCQkJCXVkZXYtPmF1dG9zdXNwZW5kX2RlbGF5KSk7CisJCX0KKwl9CisJZGV2X3ZkYmcoJmludGYtPmRldiwgIiVzOiBzdGF0dXMgJWQgY250ICVkXG4iLAorCQkJX19mdW5jX18sIHN0YXR1cywgaW50Zi0+cG1fdXNhZ2VfY250KTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHVzYl9hdXRvcG1fcHV0X2ludGVyZmFjZV9hc3luYyk7CisKKy8qKgogICogdXNiX2F1dG9wbV9nZXRfaW50ZXJmYWNlIC0gaW5jcmVtZW50IGEgVVNCIGludGVyZmFjZSdzIFBNLXVzYWdlIGNvdW50ZXIKICAqIEBpbnRmOiB0aGUgdXNiX2ludGVyZmFjZSB3aG9zZSBjb3VudGVyIHNob3VsZCBiZSBpbmNyZW1lbnRlZAogICoKQEAgLTE1MzcsNiArMTYxNywzNyBAQAogRVhQT1JUX1NZTUJPTF9HUEwodXNiX2F1dG9wbV9nZXRfaW50ZXJmYWNlKTsKIAogLyoqCisgKiB1c2JfYXV0b3BtX2dldF9pbnRlcmZhY2VfYXN5bmMgLSBpbmNyZW1lbnQgYSBVU0IgaW50ZXJmYWNlJ3MgUE0tdXNhZ2UgY291bnRlcgorICogQGludGY6IHRoZSB1c2JfaW50ZXJmYWNlIHdob3NlIGNvdW50ZXIgc2hvdWxkIGJlIGluY3JlbWVudGVkCisgKgorICogVGhpcyByb3V0aW5lIGRvZXMgbXVjaCB0aGUgc2FtZSB0aGluZyBhcworICogdXNiX2F1dG9wbV9nZXRfaW50ZXJmYWNlKCk6IGl0IGluY3JlbWVudHMgQGludGYncyB1c2FnZSBjb3VudGVyIGFuZAorICogcXVldWVzIGFuIGF1dG9yZXN1bWUgcmVxdWVzdCBpZiB0aGUgcmVzdWx0IGlzID4gMC4gIFRoZSBkaWZmZXJlbmNlcworICogYXJlIHRoYXQgaXQgZG9lcyBub3QgYWNxdWlyZSB0aGUgZGV2aWNlJ3MgcG1fbXV0ZXggKGNhbGxlcnMgbXVzdAorICogaGFuZGxlIGFsbCBzeW5jaHJvbml6YXRpb24gaXNzdWVzIHRoZW1zZWx2ZXMpLCBhbmQgaXQgZG9lcyBub3QKKyAqIGF1dG9yZXN1bWUgdGhlIGRldmljZSBkaXJlY3RseSAoaXQgb25seSBxdWV1ZXMgYSByZXF1ZXN0KS4gIEFmdGVyIGEKKyAqIHN1Y2Nlc3NmdWwgY2FsbCwgdGhlIGRldmljZSB3aWxsIGdlbmVyYWxseSBub3QgeWV0IGJlIHJlc3VtZWQuCisgKgorICogVGhpcyByb3V0aW5lIGNhbiBydW4gaW4gYXRvbWljIGNvbnRleHQuCisgKi8KK2ludCB1c2JfYXV0b3BtX2dldF9pbnRlcmZhY2VfYXN5bmMoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCit7CisJc3RydWN0IHVzYl9kZXZpY2UJKnVkZXYgPSBpbnRlcmZhY2VfdG9fdXNiZGV2KGludGYpOworCWludAkJCXN0YXR1cyA9IDA7CisKKwlpZiAoaW50Zi0+Y29uZGl0aW9uID09IFVTQl9JTlRFUkZBQ0VfVU5CT1VORCkKKwkJc3RhdHVzID0gLUVOT0RFVjsKKwllbHNlIGlmICh1ZGV2LT5hdXRvcmVzdW1lX2Rpc2FibGVkKQorCQlzdGF0dXMgPSAtRVBFUk07CisJZWxzZSBpZiAoKytpbnRmLT5wbV91c2FnZV9jbnQgPiAwICYmIHVkZXYtPnN0YXRlID09IFVTQl9TVEFURV9TVVNQRU5ERUQpCisJCXF1ZXVlX3dvcmsoa3N1c3BlbmRfdXNiX3dxLCAmdWRldi0+YXV0b3Jlc3VtZSk7CisJZGV2X3ZkYmcoJmludGYtPmRldiwgIiVzOiBzdGF0dXMgJWQgY250ICVkXG4iLAorCQkJX19mdW5jX18sIHN0YXR1cywgaW50Zi0+cG1fdXNhZ2VfY250KTsKKwlyZXR1cm4gc3RhdHVzOworfQorRVhQT1JUX1NZTUJPTF9HUEwodXNiX2F1dG9wbV9nZXRfaW50ZXJmYWNlX2FzeW5jKTsKKworLyoqCiAgKiB1c2JfYXV0b3BtX3NldF9pbnRlcmZhY2UgLSBzZXQgYSBVU0IgaW50ZXJmYWNlJ3MgYXV0b3N1c3BlbmQgc3RhdGUKICAqIEBpbnRmOiB0aGUgdXNiX2ludGVyZmFjZSB3aG9zZSBzdGF0ZSBzaG91bGQgYmUgc2V0CiAgKgpAQCAtMTU2Myw2ICsxNjc0LDkgQEAKIHZvaWQgdXNiX2F1dG9zdXNwZW5kX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoge30KIAordm9pZCB1c2JfYXV0b3Jlc3VtZV93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3t9CisKICNlbmRpZiAvKiBDT05GSUdfVVNCX1NVU1BFTkQgKi8KIAogLyoqCkBAIC0xNTk1LDYgKzE3MDksNyBAQAogLyoqCiAgKiB1c2JfZXh0ZXJuYWxfcmVzdW1lX2RldmljZSAtIGV4dGVybmFsIHJlc3VtZSBvZiBhIFVTQiBkZXZpY2UgYW5kIGl0cyBpbnRlcmZhY2VzCiAgKiBAdWRldjogdGhlIHVzYl9kZXZpY2UgdG8gcmVzdW1lCisgKiBAbXNnOiBQb3dlciBNYW5hZ2VtZW50IG1lc3NhZ2UgZGVzY3JpYmluZyB0aGlzIHN0YXRlIHRyYW5zaXRpb24KICAqCiAgKiBUaGlzIHJvdXRpbmUgaGFuZGxlcyBleHRlcm5hbCByZXN1bWUgcmVxdWVzdHM6IG9uZXMgbm90IGdlbmVyYXRlZAogICogaW50ZXJuYWxseSBieSBhIFVTQiBkcml2ZXIgKGF1dG9yZXN1bWUpIGJ1dCByYXRoZXIgY29taW5nIGZyb20gdGhlIHVzZXIKQEAgLTE2MDMsMTMgKzE3MTgsMTMgQEAKICAqCiAgKiBUaGUgY2FsbGVyIG11c3QgaG9sZCBAdWRldidzIGRldmljZSBsb2NrLgogICovCi1pbnQgdXNiX2V4dGVybmFsX3Jlc3VtZV9kZXZpY2Uoc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYpCitpbnQgdXNiX2V4dGVybmFsX3Jlc3VtZV9kZXZpY2Uoc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYsIHBtX21lc3NhZ2VfdCBtc2cpCiB7CiAJaW50CXN0YXR1czsKIAogCXVzYl9wbV9sb2NrKHVkZXYpOwogCXVkZXYtPmF1dG9fcG0gPSAwOwotCXN0YXR1cyA9IHVzYl9yZXN1bWVfYm90aCh1ZGV2KTsKKwlzdGF0dXMgPSB1c2JfcmVzdW1lX2JvdGgodWRldiwgbXNnKTsKIAl1ZGV2LT5sYXN0X2J1c3kgPSBqaWZmaWVzOwogCXVzYl9wbV91bmxvY2sodWRldik7CiAJaWYgKHN0YXR1cyA9PSAwKQpAQCAtMTYyMiw3ICsxNzM3LDcgQEAKIAlyZXR1cm4gc3RhdHVzOwogfQogCi1pbnQgdXNiX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2LCBwbV9tZXNzYWdlX3QgbWVzc2FnZSkKK2ludCB1c2Jfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHBtX21lc3NhZ2VfdCBtc2cpCiB7CiAJc3RydWN0IHVzYl9kZXZpY2UJKnVkZXY7CiAKQEAgLTE2NDEsMTAgKzE3NTYsMTAgQEAKIAl9CiAKIAl1ZGV2LT5za2lwX3N5c19yZXN1bWUgPSAwOwotCXJldHVybiB1c2JfZXh0ZXJuYWxfc3VzcGVuZF9kZXZpY2UodWRldiwgbWVzc2FnZSk7CisJcmV0dXJuIHVzYl9leHRlcm5hbF9zdXNwZW5kX2RldmljZSh1ZGV2LCBtc2cpOwogfQogCi1pbnQgdXNiX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCitpbnQgdXNiX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHBtX21lc3NhZ2VfdCBtc2cpCiB7CiAJc3RydWN0IHVzYl9kZXZpY2UJKnVkZXY7CiAKQEAgLTE2NTYsNyArMTc3MSw3IEBACiAJICovCiAJaWYgKHVkZXYtPnNraXBfc3lzX3Jlc3VtZSkKIAkJcmV0dXJuIDA7Ci0JcmV0dXJuIHVzYl9leHRlcm5hbF9yZXN1bWVfZGV2aWNlKHVkZXYpOworCXJldHVybiB1c2JfZXh0ZXJuYWxfcmVzdW1lX2RldmljZSh1ZGV2LCBtc2cpOwogfQogCiAjZW5kaWYgLyogQ09ORklHX1BNICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jb3JlL2VuZHBvaW50LmMgYi9kcml2ZXJzL3VzYi9jb3JlL2VuZHBvaW50LmMKaW5kZXggOTQ2ZmFlNC4uZTE3MTBmMiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvY29yZS9lbmRwb2ludC5jCisrKyBiL2RyaXZlcnMvdXNiL2NvcmUvZW5kcG9pbnQuYwpAQCAtMjc2LDcgKzI3Niw3IEBACiAJa2ZyZWUoZXBfZGV2KTsKIH0KIAotaW50IHVzYl9jcmVhdGVfZXBfZmlsZXMoc3RydWN0IGRldmljZSAqcGFyZW50LAoraW50IHVzYl9jcmVhdGVfZXBfZGV2cyhzdHJ1Y3QgZGV2aWNlICpwYXJlbnQsCiAJCQlzdHJ1Y3QgdXNiX2hvc3RfZW5kcG9pbnQgKmVuZHBvaW50LAogCQkJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYpCiB7CkBAIC0zNDAsNyArMzQwLDcgQEAKIAlyZXR1cm4gcmV0dmFsOwogfQogCi12b2lkIHVzYl9yZW1vdmVfZXBfZmlsZXMoc3RydWN0IHVzYl9ob3N0X2VuZHBvaW50ICplbmRwb2ludCkKK3ZvaWQgdXNiX3JlbW92ZV9lcF9kZXZzKHN0cnVjdCB1c2JfaG9zdF9lbmRwb2ludCAqZW5kcG9pbnQpCiB7CiAJc3RydWN0IGVwX2RldmljZSAqZXBfZGV2ID0gZW5kcG9pbnQtPmVwX2RldjsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvY29yZS9nZW5lcmljLmMgYi9kcml2ZXJzL3VzYi9jb3JlL2dlbmVyaWMuYwppbmRleCA3ZTkxMmYyLi4zMGVjYWMzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jb3JlL2dlbmVyaWMuYworKysgYi9kcml2ZXJzL3VzYi9jb3JlL2dlbmVyaWMuYwpAQCAtMjAwLDE4ICsyMDAsMTggQEAKIAkgKiBpbnRlcmZhY2VzIG1hbnVhbGx5IGJ5IGRvaW5nIGEgYnVzIChvciAiZ2xvYmFsIikgc3VzcGVuZC4KIAkgKi8KIAlpZiAoIXVkZXYtPnBhcmVudCkKLQkJcmMgPSBoY2RfYnVzX3N1c3BlbmQodWRldik7CisJCXJjID0gaGNkX2J1c19zdXNwZW5kKHVkZXYsIG1zZyk7CiAKIAkvKiBOb24tcm9vdCBkZXZpY2VzIGRvbid0IG5lZWQgdG8gZG8gYW55dGhpbmcgZm9yIEZSRUVaRSBvciBQUkVUSEFXICovCiAJZWxzZSBpZiAobXNnLmV2ZW50ID09IFBNX0VWRU5UX0ZSRUVaRSB8fCBtc2cuZXZlbnQgPT0gUE1fRVZFTlRfUFJFVEhBVykKIAkJcmMgPSAwOwogCWVsc2UKLQkJcmMgPSB1c2JfcG9ydF9zdXNwZW5kKHVkZXYpOworCQlyYyA9IHVzYl9wb3J0X3N1c3BlbmQodWRldiwgbXNnKTsKIAogCXJldHVybiByYzsKIH0KIAotc3RhdGljIGludCBnZW5lcmljX3Jlc3VtZShzdHJ1Y3QgdXNiX2RldmljZSAqdWRldikKK3N0YXRpYyBpbnQgZ2VuZXJpY19yZXN1bWUoc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYsIHBtX21lc3NhZ2VfdCBtc2cpCiB7CiAJaW50IHJjOwogCkBAIC0yMjEsOSArMjIxLDkgQEAKIAkgKiBpbnRlcmZhY2VzIG1hbnVhbGx5IGJ5IGRvaW5nIGEgYnVzIChvciAiZ2xvYmFsIikgcmVzdW1lLgogCSAqLwogCWlmICghdWRldi0+cGFyZW50KQotCQlyYyA9IGhjZF9idXNfcmVzdW1lKHVkZXYpOworCQlyYyA9IGhjZF9idXNfcmVzdW1lKHVkZXYsIG1zZyk7CiAJZWxzZQotCQlyYyA9IHVzYl9wb3J0X3Jlc3VtZSh1ZGV2KTsKKwkJcmMgPSB1c2JfcG9ydF9yZXN1bWUodWRldiwgbXNnKTsKIAlyZXR1cm4gcmM7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NvcmUvaGNkLXBjaS5jIGIvZHJpdmVycy91c2IvY29yZS9oY2QtcGNpLmMKaW5kZXggNWI4N2FlNy4uNTA3NzQxZSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvY29yZS9oY2QtcGNpLmMKKysrIGIvZHJpdmVycy91c2IvY29yZS9oY2QtcGNpLmMKQEAgLTEyOCw2ICsxMjgsNyBAQAogCX0KIAogCXBjaV9zZXRfbWFzdGVyKGRldik7CisJZGV2aWNlX3NldF93YWtldXBfZW5hYmxlKCZkZXYtPmRldiwgMSk7CiAKIAlyZXR2YWwgPSB1c2JfYWRkX2hjZChoY2QsIGRldi0+aXJxLCBJUlFGX0RJU0FCTEVEIHwgSVJRRl9TSEFSRUQpOwogCWlmIChyZXR2YWwgIT0gMCkKQEAgLTE5MSwxNyArMTkyLDE1IEBACiAvKioKICAqIHVzYl9oY2RfcGNpX3N1c3BlbmQgLSBwb3dlciBtYW5hZ2VtZW50IHN1c3BlbmQgb2YgYSBQQ0ktYmFzZWQgSENECiAgKiBAZGV2OiBVU0IgSG9zdCBDb250cm9sbGVyIGJlaW5nIHN1c3BlbmRlZAotICogQG1lc3NhZ2U6IHNlbWFudGljcyBpbiBmbHV4CisgKiBAbWVzc2FnZTogUG93ZXIgTWFuYWdlbWVudCBtZXNzYWdlIGRlc2NyaWJpbmcgdGhpcyBzdGF0ZSB0cmFuc2l0aW9uCiAgKgotICogU3RvcmUgdGhpcyBmdW5jdGlvbiBpbiB0aGUgSENEJ3Mgc3RydWN0IHBjaV9kcml2ZXIgYXMgc3VzcGVuZCgpLgorICogU3RvcmUgdGhpcyBmdW5jdGlvbiBpbiB0aGUgSENEJ3Mgc3RydWN0IHBjaV9kcml2ZXIgYXMgLnN1c3BlbmQuCiAgKi8KIGludCB1c2JfaGNkX3BjaV9zdXNwZW5kKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHBtX21lc3NhZ2VfdCBtZXNzYWdlKQogewotCXN0cnVjdCB1c2JfaGNkCQkqaGNkOworCXN0cnVjdCB1c2JfaGNkCQkqaGNkID0gcGNpX2dldF9kcnZkYXRhKGRldik7CiAJaW50CQkJcmV0dmFsID0gMDsKLQlpbnQJCQloYXNfcGNpX3BtOwotCi0JaGNkID0gcGNpX2dldF9kcnZkYXRhKGRldik7CisJaW50CQkJd2FrZSwgdzsKIAogCS8qIFJvb3QgaHViIHN1c3BlbmQgc2hvdWxkIGhhdmUgc3RvcHBlZCBhbGwgZG93bnN0cmVhbSB0cmFmZmljLAogCSAqIGFuZCBhbGwgYnVzIG1hc3RlciB0cmFmZmljLiAgQW5kIGRvbmUgc28gZm9yIGJvdGggdGhlIGludGVyZmFjZQpAQCAtMjEyLDggKzIxMSwxNSBAQAogCSAqIG90aGVyd2lzZSB0aGUgc3dzdXNwIHdpbGwgc2F2ZSAoYW5kIHJlc3RvcmUpIGdhcmJhZ2Ugc3RhdGUuCiAJICovCiAJaWYgKCEoaGNkLT5zdGF0ZSA9PSBIQ19TVEFURV9TVVNQRU5ERUQgfHwKLQkJCWhjZC0+c3RhdGUgPT0gSENfU1RBVEVfSEFMVCkpCi0JCXJldHVybiAtRUJVU1k7CisJCQloY2QtPnN0YXRlID09IEhDX1NUQVRFX0hBTFQpKSB7CisJCWRldl93YXJuKCZkZXYtPmRldiwgIlJvb3QgaHViIGlzIG5vdCBzdXNwZW5kZWRcbiIpOworCQlyZXR2YWwgPSAtRUJVU1k7CisJCWdvdG8gZG9uZTsKKwl9CisKKwkvKiBXZSBtaWdodCBhbHJlYWR5IGJlIHN1c3BlbmRlZCAocnVudGltZSBQTSAtLSBub3QgeWV0IHdyaXR0ZW4pICovCisJaWYgKGRldi0+Y3VycmVudF9zdGF0ZSAhPSBQQ0lfRDApCisJCWdvdG8gZG9uZTsKIAogCWlmIChoY2QtPmRyaXZlci0+cGNpX3N1c3BlbmQpIHsKIAkJcmV0dmFsID0gaGNkLT5kcml2ZXItPnBjaV9zdXNwZW5kKGhjZCwgbWVzc2FnZSk7CkBAIC0yMjEsNDkgKzIyNyw2MCBAQAogCQlpZiAocmV0dmFsKQogCQkJZ290byBkb25lOwogCX0KKwogCXN5bmNocm9uaXplX2lycShkZXYtPmlycSk7CiAKLQkvKiBGSVhNRSB1bnRpbCB0aGUgZ2VuZXJpYyBQTSBpbnRlcmZhY2VzIGNoYW5nZSBhIGxvdCBtb3JlLCB0aGlzCi0JICogY2FuJ3QgdXNlIFBDSSBEMSBhbmQgRDIgc3RhdGVzLiAgRm9yIGV4YW1wbGUsIHRoZSBjb25mdXNpb24KLQkgKiBiZXR3ZWVuIG1lc3NhZ2VzIGFuZCBzdGF0ZXMgd2lsbCBuZWVkIHRvIHZhbmlzaCwgYW5kIG1lc3NhZ2VzCi0JICogd2lsbCBuZWVkIHRvIHByb3ZpZGUgYSB0YXJnZXQgc3lzdGVtIHN0YXRlIGFnYWluLgotCSAqCi0JICogSXQnbGwgYmUgaW1wb3J0YW50IHRvIGxlYXJuIGNoYXJhY3RlcmlzdGljcyBvZiB0aGUgdGFyZ2V0IHN0YXRlLAotCSAqIGVzcGVjaWFsbHkgb24gZW1iZWRkZWQgaGFyZHdhcmUgd2hlcmUgdGhlIEhDRCB3aWxsIG9mdGVuIGJlIGluCi0JICogY2hhcmdlIG9mIGFuIGV4dGVybmFsIFZCVVMgcG93ZXIgc3VwcGx5IGFuZCBvbmUgb3IgbW9yZSBjbG9ja3MuCi0JICogU29tZSB0YXJnZXQgc3lzdGVtIHN0YXRlcyB3aWxsIGxlYXZlIHRoZW0gYWN0aXZlOyBvdGhlcnMgd29uJ3QuCi0JICogKFdpdGggUENJLCB0aGF0J3Mgb2Z0ZW4gaGFuZGxlZCBieSBwbGF0Zm9ybSBCSU9TIGNvZGUuKQorCS8qIERvbid0IGZhaWwgb24gZXJyb3IgdG8gZW5hYmxlIHdha2V1cC4gIFdlIHJlbHkgb24gcGNpIGNvZGUKKwkgKiB0byByZWplY3QgcmVxdWVzdHMgdGhlIGhhcmR3YXJlIGNhbid0IGltcGxlbWVudCwgcmF0aGVyCisJICogdGhhbiBjb2RpbmcgdGhlIHNhbWUgdGhpbmcuCiAJICovCi0KLQkvKiBldmVuIHdoZW4gdGhlIFBDSSBsYXllciByZWplY3RzIHNvbWUgb2YgdGhlIFBDSSBjYWxscwotCSAqIGJlbG93LCBIQ3MgY2FuIHRyeSBnbG9iYWwgc3VzcGVuZCBhbmQgcmVkdWNlIERNQSB0cmFmZmljLgotCSAqIFBNLXNlbnNpdGl2ZSBIQ0RzIG1heSBhbHJlYWR5IGhhdmUgZG9uZSB0aGlzLgotCSAqLwotCWhhc19wY2lfcG0gPSBwY2lfZmluZF9jYXBhYmlsaXR5KGRldiwgUENJX0NBUF9JRF9QTSk7CisJd2FrZSA9IChoY2QtPnN0YXRlID09IEhDX1NUQVRFX1NVU1BFTkRFRCAmJgorCQkJZGV2aWNlX21heV93YWtldXAoJmRldi0+ZGV2KSk7CisJdyA9IHBjaV93YWtlX2Zyb21fZDMoZGV2LCB3YWtlKTsKKwlpZiAodyA8IDApCisJCXdha2UgPSB3OworCWRldl9kYmcoJmRldi0+ZGV2LCAid2FrZXVwOiAlZFxuIiwgd2FrZSk7CiAKIAkvKiBEb3duc3RyZWFtIHBvcnRzIGZyb20gdGhpcyByb290IGh1YiBzaG91bGQgYWxyZWFkeSBiZSBxdWllc2NlZCwgc28KIAkgKiB0aGVyZSB3aWxsIGJlIG5vIERNQSBhY3Rpdml0eS4gIE5vdyB3ZSBjYW4gc2h1dCBkb3duIHRoZSB1cHN0cmVhbQogCSAqIGxpbmsgKGV4Y2VwdCBtYXliZSBmb3IgUE1FIyByZXN1bWUgc2lnbmFsaW5nKSBhbmQgZW50ZXIgc29tZSBQQ0kKIAkgKiBsb3cgcG93ZXIgc3RhdGUsIGlmIHRoZSBoYXJkd2FyZSBhbGxvd3MuCiAJICovCi0JaWYgKGhjZC0+c3RhdGUgPT0gSENfU1RBVEVfU1VTUEVOREVEKSB7CisJcGNpX2Rpc2FibGVfZGV2aWNlKGRldik7CisgZG9uZToKKwlyZXR1cm4gcmV0dmFsOworfQorRVhQT1JUX1NZTUJPTF9HUEwodXNiX2hjZF9wY2lfc3VzcGVuZCk7CiAKLQkJLyogbm8gRE1BIG9yIElSUXMgZXhjZXB0IHdoZW4gSEMgaXMgYWN0aXZlICovCi0JCWlmIChkZXYtPmN1cnJlbnRfc3RhdGUgPT0gUENJX0QwKSB7Ci0JCQlwY2lfc2F2ZV9zdGF0ZShkZXYpOwotCQkJcGNpX2Rpc2FibGVfZGV2aWNlKGRldik7Ci0JCX0KKy8qKgorICogdXNiX2hjZF9wY2lfc3VzcGVuZF9sYXRlIC0gc3VzcGVuZCBhIFBDSS1iYXNlZCBIQ0QgYWZ0ZXIgSVJRcyBhcmUgZGlzYWJsZWQKKyAqIEBkZXY6IFVTQiBIb3N0IENvbnRyb2xsZXIgYmVpbmcgc3VzcGVuZGVkCisgKiBAbWVzc2FnZTogUG93ZXIgTWFuYWdlbWVudCBtZXNzYWdlIGRlc2NyaWJpbmcgdGhpcyBzdGF0ZSB0cmFuc2l0aW9uCisgKgorICogU3RvcmUgdGhpcyBmdW5jdGlvbiBpbiB0aGUgSENEJ3Mgc3RydWN0IHBjaV9kcml2ZXIgYXMgLnN1c3BlbmRfbGF0ZS4KKyAqLworaW50IHVzYl9oY2RfcGNpX3N1c3BlbmRfbGF0ZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBwbV9tZXNzYWdlX3QgbWVzc2FnZSkKK3sKKwlpbnQJCQlyZXR2YWwgPSAwOworCWludAkJCWhhc19wY2lfcG07CiAKLQkJaWYgKG1lc3NhZ2UuZXZlbnQgPT0gUE1fRVZFTlRfRlJFRVpFIHx8Ci0JCQkJbWVzc2FnZS5ldmVudCA9PSBQTV9FVkVOVF9QUkVUSEFXKSB7Ci0JCQlkZXZfZGJnKGhjZC0+c2VsZi5jb250cm9sbGVyLCAiLS0+IG5vIHN0YXRlIGNoYW5nZVxuIik7Ci0JCQlnb3RvIGRvbmU7Ci0JCX0KKwkvKiBXZSBtaWdodCBhbHJlYWR5IGJlIHN1c3BlbmRlZCAocnVudGltZSBQTSAtLSBub3QgeWV0IHdyaXR0ZW4pICovCisJaWYgKGRldi0+Y3VycmVudF9zdGF0ZSAhPSBQQ0lfRDApCisJCWdvdG8gZG9uZTsKIAotCQlpZiAoIWhhc19wY2lfcG0pIHsKLQkJCWRldl9kYmcoaGNkLT5zZWxmLmNvbnRyb2xsZXIsICItLT4gUENJIEQwL2xlZ2FjeVxuIik7Ci0JCQlnb3RvIGRvbmU7Ci0JCX0KKwlwY2lfc2F2ZV9zdGF0ZShkZXYpOworCisJLyogRG9uJ3QgY2hhbmdlIHN0YXRlIGlmIHdlIGRvbid0IG5lZWQgdG8gKi8KKwlpZiAobWVzc2FnZS5ldmVudCA9PSBQTV9FVkVOVF9GUkVFWkUgfHwKKwkJCW1lc3NhZ2UuZXZlbnQgPT0gUE1fRVZFTlRfUFJFVEhBVykgeworCQlkZXZfZGJnKCZkZXYtPmRldiwgIi0tPiBubyBzdGF0ZSBjaGFuZ2VcbiIpOworCQlnb3RvIGRvbmU7CisJfQorCisJaGFzX3BjaV9wbSA9IHBjaV9maW5kX2NhcGFiaWxpdHkoZGV2LCBQQ0lfQ0FQX0lEX1BNKTsKKwlpZiAoIWhhc19wY2lfcG0pIHsKKwkJZGV2X2RiZygmZGV2LT5kZXYsICItLT4gUENJIEQwIGxlZ2FjeVxuIik7CisJfSBlbHNlIHsKIAogCQkvKiBOT1RFOiAgZGV2LT5jdXJyZW50X3N0YXRlIGJlY29tZXMgbm9uemVybyBvbmx5IGhlcmUsIGFuZAogCQkgKiBvbmx5IGZvciBkZXZpY2VzIHRoYXQgc3VwcG9ydCBQQ0kgUE0uICBBbHNvLCBleGl0aW5nCkBAIC0yNzMsMzUgKzI5MCwxNiBAQAogCQlyZXR2YWwgPSBwY2lfc2V0X3Bvd2VyX3N0YXRlKGRldiwgUENJX0QzaG90KTsKIAkJc3VzcGVuZF9yZXBvcnRfcmVzdWx0KHBjaV9zZXRfcG93ZXJfc3RhdGUsIHJldHZhbCk7CiAJCWlmIChyZXR2YWwgPT0gMCkgewotCQkJaW50IHdha2UgPSBkZXZpY2VfY2FuX3dha2V1cCgmaGNkLT5zZWxmLnJvb3RfaHViLT5kZXYpOwotCi0JCQl3YWtlID0gd2FrZSAmJiBkZXZpY2VfbWF5X3dha2V1cChoY2QtPnNlbGYuY29udHJvbGxlcik7Ci0KLQkJCWRldl9kYmcoaGNkLT5zZWxmLmNvbnRyb2xsZXIsICItLT4gUENJIEQzJXNcbiIsCi0JCQkJCXdha2UgPyAiL3dha2V1cCIgOiAiIik7Ci0KLQkJCS8qIElnbm9yZSB0aGVzZSByZXR1cm4gdmFsdWVzLiAgV2UgcmVseSBvbiBwY2kgY29kZSB0bwotCQkJICogcmVqZWN0IHJlcXVlc3RzIHRoZSBoYXJkd2FyZSBjYW4ndCBpbXBsZW1lbnQsIHJhdGhlcgotCQkJICogdGhhbiBjb2RpbmcgdGhlIHNhbWUgdGhpbmcuCi0JCQkgKi8KLQkJCSh2b2lkKSBwY2lfZW5hYmxlX3dha2UoZGV2LCBQQ0lfRDNob3QsIHdha2UpOwotCQkJKHZvaWQpIHBjaV9lbmFibGVfd2FrZShkZXYsIFBDSV9EM2NvbGQsIHdha2UpOworCQkJZGV2X2RiZygmZGV2LT5kZXYsICItLT4gUENJIEQzXG4iKTsKIAkJfSBlbHNlIHsKIAkJCWRldl9kYmcoJmRldi0+ZGV2LCAiUENJIEQzIHN1c3BlbmQgZmFpbCwgJWRcbiIsCiAJCQkJCXJldHZhbCk7Ci0JCQkodm9pZCkgdXNiX2hjZF9wY2lfcmVzdW1lKGRldik7CisJCQlwY2lfcmVzdG9yZV9zdGF0ZShkZXYpOwogCQl9Ci0KLQl9IGVsc2UgaWYgKGhjZC0+c3RhdGUgIT0gSENfU1RBVEVfSEFMVCkgewotCQlkZXZfZGJnKGhjZC0+c2VsZi5jb250cm9sbGVyLCAiaGNkIHN0YXRlICVkOyBub3Qgc3VzcGVuZGVkXG4iLAotCQkJaGNkLT5zdGF0ZSk7Ci0JCVdBUk5fT04oMSk7Ci0JCXJldHZhbCA9IC1FSU5WQUw7CiAJfQogCi1kb25lOgotCWlmIChyZXR2YWwgPT0gMCkgewogI2lmZGVmIENPTkZJR19QUENfUE1BQworCWlmIChyZXR2YWwgPT0gMCkgewogCQkvKiBEaXNhYmxlIEFTSUMgY2xvY2tzIGZvciBVU0IgKi8KIAkJaWYgKG1hY2hpbmVfaXMocG93ZXJtYWMpKSB7CiAJCQlzdHJ1Y3QgZGV2aWNlX25vZGUJKm9mX25vZGU7CkBAIC0zMTEsMzAgKzMwOSwyNCBAQAogCQkJCXBtYWNfY2FsbF9mZWF0dXJlKFBNQUNfRlRSX1VTQl9FTkFCTEUsCiAJCQkJCQkJb2Zfbm9kZSwgMCwgMCk7CiAJCX0KLSNlbmRpZgogCX0KKyNlbmRpZgogCisgZG9uZToKIAlyZXR1cm4gcmV0dmFsOwogfQotRVhQT1JUX1NZTUJPTF9HUEwodXNiX2hjZF9wY2lfc3VzcGVuZCk7CitFWFBPUlRfU1lNQk9MX0dQTCh1c2JfaGNkX3BjaV9zdXNwZW5kX2xhdGUpOwogCiAvKioKLSAqIHVzYl9oY2RfcGNpX3Jlc3VtZSAtIHBvd2VyIG1hbmFnZW1lbnQgcmVzdW1lIG9mIGEgUENJLWJhc2VkIEhDRAorICogdXNiX2hjZF9wY2lfcmVzdW1lX2Vhcmx5IC0gcmVzdW1lIGEgUENJLWJhc2VkIEhDRCBiZWZvcmUgSVJRcyBhcmUgZW5hYmxlZAogICogQGRldjogVVNCIEhvc3QgQ29udHJvbGxlciBiZWluZyByZXN1bWVkCiAgKgotICogU3RvcmUgdGhpcyBmdW5jdGlvbiBpbiB0aGUgSENEJ3Mgc3RydWN0IHBjaV9kcml2ZXIgYXMgcmVzdW1lKCkuCisgKiBTdG9yZSB0aGlzIGZ1bmN0aW9uIGluIHRoZSBIQ0QncyBzdHJ1Y3QgcGNpX2RyaXZlciBhcyAucmVzdW1lX2Vhcmx5LgogICovCi1pbnQgdXNiX2hjZF9wY2lfcmVzdW1lKHN0cnVjdCBwY2lfZGV2ICpkZXYpCitpbnQgdXNiX2hjZF9wY2lfcmVzdW1lX2Vhcmx5KHN0cnVjdCBwY2lfZGV2ICpkZXYpCiB7Ci0Jc3RydWN0IHVzYl9oY2QJCSpoY2Q7Ci0JaW50CQkJcmV0dmFsOwotCi0JaGNkID0gcGNpX2dldF9kcnZkYXRhKGRldik7Ci0JaWYgKGhjZC0+c3RhdGUgIT0gSENfU1RBVEVfU1VTUEVOREVEKSB7Ci0JCWRldl9kYmcoaGNkLT5zZWxmLmNvbnRyb2xsZXIsCi0JCQkJImNhbid0IHJlc3VtZSwgbm90IHN1c3BlbmRlZCFcbiIpOwotCQlyZXR1cm4gMDsKLQl9CisJaW50CQlyZXR2YWwgPSAwOworCXBjaV9wb3dlcl90CXN0YXRlID0gZGV2LT5jdXJyZW50X3N0YXRlOwogCiAjaWZkZWYgQ09ORklHX1BQQ19QTUFDCiAJLyogUmVlbmFibGUgQVNJQyBjbG9ja3MgZm9yIFVTQiAqLwpAQCAtMzUyLDcgKzM0NCw3IEBACiAJICogY2FsbHMgInN0YW5kYnkiLCAic3VzcGVuZCB0byBSQU0iLCBhbmQgc28gb24pLiAgVGhlcmUgYXJlIGFsc28KIAkgKiBkaXJ0eSBjYXNlcyB3aGVuIHN3c3VzcCBmYWtlcyBhIHN1c3BlbmQgaW4gInNodXRkb3duIiBtb2RlLgogCSAqLwotCWlmIChkZXYtPmN1cnJlbnRfc3RhdGUgIT0gUENJX0QwKSB7CisJaWYgKHN0YXRlICE9IFBDSV9EMCkgewogI2lmZGVmCURFQlVHCiAJCWludAlwY2lfcG07CiAJCXUxNglwbWNyOwpAQCAtMzY0LDggKzM1Niw3IEBACiAJCQkvKiBDbGVhbiBjYXNlOiAgcG93ZXIgdG8gVVNCIGFuZCB0byBIQyByZWdpc3RlcnMgd2FzCiAJCQkgKiBtYWludGFpbmVkOyByZW1vdGUgd2FrZXVwIGlzIGVhc3kuCiAJCQkgKi8KLQkJCWRldl9kYmcoaGNkLT5zZWxmLmNvbnRyb2xsZXIsICJyZXN1bWUgZnJvbSBQQ0kgRCVkXG4iLAotCQkJCQlwbWNyKTsKKwkJCWRldl9kYmcoJmRldi0+ZGV2LCAicmVzdW1lIGZyb20gUENJIEQlZFxuIiwgcG1jcik7CiAJCX0gZWxzZSB7CiAJCQkvKiBDbGVhbjogIEhDIGxvc3QgVmNjIHBvd2VyLCBEMCB1bmluaXRpYWxpemVkCiAJCQkgKiAgICsgVmF1eCBtYXkgaGF2ZSBwcmVzZXJ2ZWQgcG9ydCBhbmQgdHJhbnNjZWl2ZXIKQEAgLTM3NiwzMiArMzY3LDU1IEBACiAJCQkgKiAgICsgYWZ0ZXIgQklPUyBpbml0CiAJCQkgKiAgICsgYWZ0ZXIgTGludXggaW5pdCAoSENEIHN0YXRpY2FsbHkgbGlua2VkKQogCQkJICovCi0JCQlkZXZfZGJnKGhjZC0+c2VsZi5jb250cm9sbGVyLAotCQkJCSJQQ0kgRDAsIGZyb20gcHJldmlvdXMgUENJIEQlZFxuIiwKLQkJCQlkZXYtPmN1cnJlbnRfc3RhdGUpOworCQkJZGV2X2RiZygmZGV2LT5kZXYsICJyZXN1bWUgZnJvbSBwcmV2aW91cyBQQ0kgRCVkXG4iLAorCQkJCQlzdGF0ZSk7CiAJCX0KICNlbmRpZgotCQkvKiB5ZXMsIGlnbm9yZSB0aGVzZSByZXN1bHRzIHRvby4uLiAqLwotCQkodm9pZCkgcGNpX2VuYWJsZV93YWtlKGRldiwgZGV2LT5jdXJyZW50X3N0YXRlLCAwKTsKLQkJKHZvaWQpIHBjaV9lbmFibGVfd2FrZShkZXYsIFBDSV9EM2NvbGQsIDApOworCisJCXJldHZhbCA9IHBjaV9zZXRfcG93ZXJfc3RhdGUoZGV2LCBQQ0lfRDApOwogCX0gZWxzZSB7CiAJCS8qIFNhbWUgYmFzaWMgY2FzZXM6IGNsZWFuIChwb3dlcmVkL25vdCksIGRpcnR5ICovCi0JCWRldl9kYmcoaGNkLT5zZWxmLmNvbnRyb2xsZXIsICJQQ0kgbGVnYWN5IHJlc3VtZVxuIik7CisJCWRldl9kYmcoJmRldi0+ZGV2LCAiUENJIGxlZ2FjeSByZXN1bWVcbiIpOwogCX0KIAotCS8qIE5PVEU6ICB0aGUgUENJIEFQSSBpdHNlbGYgaXMgYXN5bW1ldHJpYyBoZXJlLiAgV2UgZG9uJ3QgbmVlZCB0bwotCSAqIHBjaV9zZXRfcG93ZXJfc3RhdGUoUENJX0QwKSBzaW5jZSB0aGF0J3MgcGFydCBvZiByZS1lbmFibGluZzsKLQkgKiBidXQgdGhhdCB3b24ndCByZS1lbmFibGUgYnVzIG1hc3RlcmluZy4gIFlldCBwY2lfZGlzYWJsZV9kZXZpY2UoKQotCSAqIGV4cGxpY2l0bHkgZGlzYWJsZXMgYnVzIG1hc3RlcmluZy4uLgotCSAqLworCWlmIChyZXR2YWwgPCAwKQorCQlkZXZfZXJyKCZkZXYtPmRldiwgImNhbid0IHJlc3VtZTogJWRcbiIsIHJldHZhbCk7CisJZWxzZQorCQlwY2lfcmVzdG9yZV9zdGF0ZShkZXYpOworCisJcmV0dXJuIHJldHZhbDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHVzYl9oY2RfcGNpX3Jlc3VtZV9lYXJseSk7CisKKy8qKgorICogdXNiX2hjZF9wY2lfcmVzdW1lIC0gcG93ZXIgbWFuYWdlbWVudCByZXN1bWUgb2YgYSBQQ0ktYmFzZWQgSENECisgKiBAZGV2OiBVU0IgSG9zdCBDb250cm9sbGVyIGJlaW5nIHJlc3VtZWQKKyAqCisgKiBTdG9yZSB0aGlzIGZ1bmN0aW9uIGluIHRoZSBIQ0QncyBzdHJ1Y3QgcGNpX2RyaXZlciBhcyAucmVzdW1lLgorICovCitpbnQgdXNiX2hjZF9wY2lfcmVzdW1lKHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJc3RydWN0IHVzYl9oY2QJCSpoY2Q7CisJaW50CQkJcmV0dmFsOworCisJaGNkID0gcGNpX2dldF9kcnZkYXRhKGRldik7CisJaWYgKGhjZC0+c3RhdGUgIT0gSENfU1RBVEVfU1VTUEVOREVEKSB7CisJCWRldl9kYmcoaGNkLT5zZWxmLmNvbnRyb2xsZXIsCisJCQkJImNhbid0IHJlc3VtZSwgbm90IHN1c3BlbmRlZCFcbiIpOworCQlyZXR1cm4gMDsKKwl9CisKIAlyZXR2YWwgPSBwY2lfZW5hYmxlX2RldmljZShkZXYpOwogCWlmIChyZXR2YWwgPCAwKSB7Ci0JCWRldl9lcnIoaGNkLT5zZWxmLmNvbnRyb2xsZXIsCi0JCQkiY2FuJ3QgcmUtZW5hYmxlIGFmdGVyIHJlc3VtZSwgJWQhXG4iLCByZXR2YWwpOworCQlkZXZfZXJyKCZkZXYtPmRldiwgImNhbid0IHJlLWVuYWJsZSBhZnRlciByZXN1bWUsICVkIVxuIiwKKwkJCQlyZXR2YWwpOwogCQlyZXR1cm4gcmV0dmFsOwogCX0KKwogCXBjaV9zZXRfbWFzdGVyKGRldik7Ci0JcGNpX3Jlc3RvcmVfc3RhdGUoZGV2KTsKKworCS8qIHllcywgaWdub3JlIHRoaXMgcmVzdWx0IHRvby4uLiAqLworCSh2b2lkKSBwY2lfd2FrZV9mcm9tX2QzKGRldiwgMCk7CiAKIAljbGVhcl9iaXQoSENEX0ZMQUdfU0FXX0lSUSwgJmhjZC0+ZmxhZ3MpOwogCkBAIC00MTMsNyArNDI3LDYgQEAKIAkJCXVzYl9oY19kaWVkKGhjZCk7CiAJCX0KIAl9Ci0KIAlyZXR1cm4gcmV0dmFsOwogfQogRVhQT1JUX1NZTUJPTF9HUEwodXNiX2hjZF9wY2lfcmVzdW1lKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NvcmUvaGNkLmMgYi9kcml2ZXJzL3VzYi9jb3JlL2hjZC5jCmluZGV4IGUxYjQyNjIuLjNjNzExZGI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jb3JlL2hjZC5jCisrKyBiL2RyaXZlcnMvdXNiL2NvcmUvaGNkLmMKQEAgLTEwMTAsNyArMTAxMCw3IEBACiAJc3Bpbl9sb2NrKCZoY2RfdXJiX2xpc3RfbG9jayk7CiAKIAkvKiBDaGVjayB0aGF0IHRoZSBVUkIgaXNuJ3QgYmVpbmcga2lsbGVkICovCi0JaWYgKHVubGlrZWx5KHVyYi0+cmVqZWN0KSkgeworCWlmICh1bmxpa2VseShhdG9taWNfcmVhZCgmdXJiLT5yZWplY3QpKSkgewogCQlyYyA9IC1FUEVSTTsKIAkJZ290byBkb25lOwogCX0KQEAgLTEzNDAsNyArMTM0MCw3IEBACiAJCUlOSVRfTElTVF9IRUFEKCZ1cmItPnVyYl9saXN0KTsKIAkJYXRvbWljX2RlYygmdXJiLT51c2VfY291bnQpOwogCQlhdG9taWNfZGVjKCZ1cmItPmRldi0+dXJibnVtKTsKLQkJaWYgKHVyYi0+cmVqZWN0KQorCQlpZiAoYXRvbWljX3JlYWQoJnVyYi0+cmVqZWN0KSkKIAkJCXdha2VfdXAoJnVzYl9raWxsX3VyYl9xdWV1ZSk7CiAJCXVzYl9wdXRfdXJiKHVyYik7CiAJfQpAQCAtMTQ0NCw3ICsxNDQ0LDcgQEAKIAl1cmItPnN0YXR1cyA9IHN0YXR1czsKIAl1cmItPmNvbXBsZXRlICh1cmIpOwogCWF0b21pY19kZWMgKCZ1cmItPnVzZV9jb3VudCk7Ci0JaWYgKHVubGlrZWx5ICh1cmItPnJlamVjdCkpCisJaWYgKHVubGlrZWx5KGF0b21pY19yZWFkKCZ1cmItPnJlamVjdCkpKQogCQl3YWtlX3VwICgmdXNiX2tpbGxfdXJiX3F1ZXVlKTsKIAl1c2JfcHV0X3VyYiAodXJiKTsKIH0KQEAgLTE1NzMsMTQgKzE1NzMsMTQgQEAKIAogI2lmZGVmCUNPTkZJR19QTQogCi1pbnQgaGNkX2J1c19zdXNwZW5kKHN0cnVjdCB1c2JfZGV2aWNlICpyaGRldikKK2ludCBoY2RfYnVzX3N1c3BlbmQoc3RydWN0IHVzYl9kZXZpY2UgKnJoZGV2LCBwbV9tZXNzYWdlX3QgbXNnKQogewogCXN0cnVjdCB1c2JfaGNkCSpoY2QgPSBjb250YWluZXJfb2YocmhkZXYtPmJ1cywgc3RydWN0IHVzYl9oY2QsIHNlbGYpOwogCWludAkJc3RhdHVzOwogCWludAkJb2xkX3N0YXRlID0gaGNkLT5zdGF0ZTsKIAogCWRldl9kYmcoJnJoZGV2LT5kZXYsICJidXMgJXMlc1xuIiwKLQkJCXJoZGV2LT5hdXRvX3BtID8gImF1dG8tIiA6ICIiLCAic3VzcGVuZCIpOworCQkJKG1zZy5ldmVudCAmIFBNX0VWRU5UX0FVVE8gPyAiYXV0by0iIDogIiIpLCAic3VzcGVuZCIpOwogCWlmICghaGNkLT5kcml2ZXItPmJ1c19zdXNwZW5kKSB7CiAJCXN0YXR1cyA9IC1FTk9FTlQ7CiAJfSBlbHNlIHsKQEAgLTE1OTgsMTQgKzE1OTgsMTQgQEAKIAlyZXR1cm4gc3RhdHVzOwogfQogCi1pbnQgaGNkX2J1c19yZXN1bWUoc3RydWN0IHVzYl9kZXZpY2UgKnJoZGV2KQoraW50IGhjZF9idXNfcmVzdW1lKHN0cnVjdCB1c2JfZGV2aWNlICpyaGRldiwgcG1fbWVzc2FnZV90IG1zZykKIHsKIAlzdHJ1Y3QgdXNiX2hjZAkqaGNkID0gY29udGFpbmVyX29mKHJoZGV2LT5idXMsIHN0cnVjdCB1c2JfaGNkLCBzZWxmKTsKIAlpbnQJCXN0YXR1czsKIAlpbnQJCW9sZF9zdGF0ZSA9IGhjZC0+c3RhdGU7CiAKIAlkZXZfZGJnKCZyaGRldi0+ZGV2LCAidXNiICVzJXNcbiIsCi0JCQlyaGRldi0+YXV0b19wbSA/ICJhdXRvLSIgOiAiIiwgInJlc3VtZSIpOworCQkJKG1zZy5ldmVudCAmIFBNX0VWRU5UX0FVVE8gPyAiYXV0by0iIDogIiIpLCAicmVzdW1lIik7CiAJaWYgKCFoY2QtPmRyaXZlci0+YnVzX3Jlc3VtZSkKIAkJcmV0dXJuIC1FTk9FTlQ7CiAJaWYgKGhjZC0+c3RhdGUgPT0gSENfU1RBVEVfUlVOTklORykKQEAgLTE2MzgsNyArMTYzOCw3IEBACiAKIAl1c2JfbG9ja19kZXZpY2UodWRldik7CiAJdXNiX21hcmtfbGFzdF9idXN5KHVkZXYpOwotCXVzYl9leHRlcm5hbF9yZXN1bWVfZGV2aWNlKHVkZXYpOworCXVzYl9leHRlcm5hbF9yZXN1bWVfZGV2aWNlKHVkZXYsIFBNU0dfUkVNT1RFX1JFU1VNRSk7CiAJdXNiX3VubG9ja19kZXZpY2UodWRldik7CiB9CiAKQEAgLTIwMjgsNyArMjAyOCw3IEBACiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKLSNpZiBkZWZpbmVkKENPTkZJR19VU0JfTU9OKQorI2lmIGRlZmluZWQoQ09ORklHX1VTQl9NT04pIHx8IGRlZmluZWQoQ09ORklHX1VTQl9NT05fTU9EVUxFKQogCiBzdHJ1Y3QgdXNiX21vbl9vcGVyYXRpb25zICptb25fb3BzOwogCkBAIC0yMDY0LDQgKzIwNjQsNCBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwgKHVzYl9tb25fZGVyZWdpc3Rlcik7CiAKLSNlbmRpZiAvKiBDT05GSUdfVVNCX01PTiAqLworI2VuZGlmIC8qIENPTkZJR19VU0JfTU9OIHx8IENPTkZJR19VU0JfTU9OX01PRFVMRSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvY29yZS9oY2QuaCBiL2RyaXZlcnMvdXNiL2NvcmUvaGNkLmgKaW5kZXggOTQ2NWU3MC4uNTcyZDJjZiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvY29yZS9oY2QuaAorKysgYi9kcml2ZXJzL3VzYi9jb3JlL2hjZC5oCkBAIC0xNiw2ICsxNiw4IEBACiAgKiBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KICAqLwogCisjaWZuZGVmIF9fVVNCX0NPUkVfSENEX0gKKyNkZWZpbmUgX19VU0JfQ09SRV9IQ0RfSAogCiAjaWZkZWYgX19LRVJORUxfXwogCkBAIC0yNTQsNyArMjU2LDkgQEAKIGV4dGVybiB2b2lkIHVzYl9oY2RfcGNpX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqZGV2KTsKIAogI2lmZGVmIENPTkZJR19QTQotZXh0ZXJuIGludCB1c2JfaGNkX3BjaV9zdXNwZW5kKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSk7CitleHRlcm4gaW50IHVzYl9oY2RfcGNpX3N1c3BlbmQoc3RydWN0IHBjaV9kZXYgKmRldiwgcG1fbWVzc2FnZV90IG1zZyk7CitleHRlcm4gaW50IHVzYl9oY2RfcGNpX3N1c3BlbmRfbGF0ZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBwbV9tZXNzYWdlX3QgbXNnKTsKK2V4dGVybiBpbnQgdXNiX2hjZF9wY2lfcmVzdW1lX2Vhcmx5KHN0cnVjdCBwY2lfZGV2ICpkZXYpOwogZXh0ZXJuIGludCB1c2JfaGNkX3BjaV9yZXN1bWUoc3RydWN0IHBjaV9kZXYgKmRldik7CiAjZW5kaWYgLyogQ09ORklHX1BNICovCiAKQEAgLTM4Niw4ICszOTAsOCBAQAogI2lmZGVmIENPTkZJR19QTQogZXh0ZXJuIHZvaWQgdXNiX2hjZF9yZXN1bWVfcm9vdF9odWIoc3RydWN0IHVzYl9oY2QgKmhjZCk7CiBleHRlcm4gdm9pZCB1c2Jfcm9vdF9odWJfbG9zdF9wb3dlcihzdHJ1Y3QgdXNiX2RldmljZSAqcmhkZXYpOwotZXh0ZXJuIGludCBoY2RfYnVzX3N1c3BlbmQoc3RydWN0IHVzYl9kZXZpY2UgKnJoZGV2KTsKLWV4dGVybiBpbnQgaGNkX2J1c19yZXN1bWUoc3RydWN0IHVzYl9kZXZpY2UgKnJoZGV2KTsKK2V4dGVybiBpbnQgaGNkX2J1c19zdXNwZW5kKHN0cnVjdCB1c2JfZGV2aWNlICpyaGRldiwgcG1fbWVzc2FnZV90IG1zZyk7CitleHRlcm4gaW50IGhjZF9idXNfcmVzdW1lKHN0cnVjdCB1c2JfZGV2aWNlICpyaGRldiwgcG1fbWVzc2FnZV90IG1zZyk7CiAjZWxzZQogc3RhdGljIGlubGluZSB2b2lkIHVzYl9oY2RfcmVzdW1lX3Jvb3RfaHViKHN0cnVjdCB1c2JfaGNkICpoY2QpCiB7CkBAIC00MTksNyArNDIzLDcgQEAKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAotI2lmIGRlZmluZWQoQ09ORklHX1VTQl9NT04pCisjaWYgZGVmaW5lZChDT05GSUdfVVNCX01PTikgfHwgZGVmaW5lZChDT05GSUdfVVNCX01PTl9NT0RVTEUpCiAKIHN0cnVjdCB1c2JfbW9uX29wZXJhdGlvbnMgewogCXZvaWQgKCp1cmJfc3VibWl0KShzdHJ1Y3QgdXNiX2J1cyAqYnVzLCBzdHJ1Y3QgdXJiICp1cmIpOwpAQCAtNDYxLDcgKzQ2NSw3IEBACiBzdGF0aWMgaW5saW5lIHZvaWQgdXNibW9uX3VyYl9jb21wbGV0ZShzdHJ1Y3QgdXNiX2J1cyAqYnVzLCBzdHJ1Y3QgdXJiICp1cmIsCiAJCWludCBzdGF0dXMpIHt9CiAKLSNlbmRpZiAvKiBDT05GSUdfVVNCX01PTiAqLworI2VuZGlmIC8qIENPTkZJR19VU0JfTU9OIHx8IENPTkZJR19VU0JfTU9OX01PRFVMRSAqLwogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCkBAIC00OTAsMyArNDk0LDUgQEAKIGV4dGVybiB1bnNpZ25lZCBsb25nIHVzYl9oY2RzX2xvYWRlZDsKIAogI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KKworI2VuZGlmIC8qIF9fVVNCX0NPUkVfSENEX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NvcmUvaHViLmMgYi9kcml2ZXJzL3VzYi9jb3JlL2h1Yi5jCmluZGV4IGIxOWNiZmMuLjk0ZDVlZTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2NvcmUvaHViLmMKKysrIGIvZHJpdmVycy91c2IvY29yZS9odWIuYwpAQCAtMTA3LDcgKzEwNyw5IEBACiAvKiBkZWZpbmUgaW5pdGlhbCA2NC1ieXRlIGRlc2NyaXB0b3IgcmVxdWVzdCB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcyAqLwogc3RhdGljIGludCBpbml0aWFsX2Rlc2NyaXB0b3JfdGltZW91dCA9IFVTQl9DVFJMX0dFVF9USU1FT1VUOwogbW9kdWxlX3BhcmFtKGluaXRpYWxfZGVzY3JpcHRvcl90aW1lb3V0LCBpbnQsIFNfSVJVR098U19JV1VTUik7Ci1NT0RVTEVfUEFSTV9ERVNDKGluaXRpYWxfZGVzY3JpcHRvcl90aW1lb3V0LCAiaW5pdGlhbCA2NC1ieXRlIGRlc2NyaXB0b3IgcmVxdWVzdCB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcyAoZGVmYXVsdCA1MDAwIC0gNS4wIHNlY29uZHMpIik7CitNT0RVTEVfUEFSTV9ERVNDKGluaXRpYWxfZGVzY3JpcHRvcl90aW1lb3V0LAorCQkiaW5pdGlhbCA2NC1ieXRlIGRlc2NyaXB0b3IgcmVxdWVzdCB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcyAiCisJCSIoZGVmYXVsdCA1MDAwIC0gNS4wIHNlY29uZHMpIik7CiAKIC8qCiAgKiBBcyBvZiAyLjYuMTAgd2UgaW50cm9kdWNlIGEgbmV3IFVTQiBkZXZpY2UgaW5pdGlhbGl6YXRpb24gc2NoZW1lIHdoaWNoCkBAIC0xMTM2LDggKzExMzgsOCBAQAogCWhkZXYgPSBpbnRlcmZhY2VfdG9fdXNiZGV2KGludGYpOwogCiAJaWYgKGhkZXYtPmxldmVsID09IE1BWF9UT1BPX0xFVkVMKSB7Ci0JCWRldl9lcnIoJmludGYtPmRldiwgIlVuc3VwcG9ydGVkIGJ1cyB0b3BvbG9neTogIgotCQkJCSJodWIgbmVzdGVkIHRvbyBkZWVwXG4iKTsKKwkJZGV2X2VycigmaW50Zi0+ZGV2LAorCQkJIlVuc3VwcG9ydGVkIGJ1cyB0b3BvbG9neTogaHViIG5lc3RlZCB0b28gZGVlcFxuIik7CiAJCXJldHVybiAtRTJCSUc7CiAJfQogCkBAIC0xMzc0LDggKzEzNzYsOSBAQAogCQl1c2JfYXV0b3N1c3BlbmRfZGV2aWNlKHVkZXYtPnBhcmVudCk7CiAJdXNiX3BtX3VubG9jayh1ZGV2KTsKIAotCS8qIFN0b3AgYW55IGF1dG9zdXNwZW5kIHJlcXVlc3RzIGFscmVhZHkgc3VibWl0dGVkICovCi0JY2FuY2VsX3JlYXJtaW5nX2RlbGF5ZWRfd29yaygmdWRldi0+YXV0b3N1c3BlbmQpOworCS8qIFN0b3AgYW55IGF1dG9zdXNwZW5kIG9yIGF1dG9yZXN1bWUgcmVxdWVzdHMgYWxyZWFkeSBzdWJtaXR0ZWQgKi8KKwljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJnVkZXYtPmF1dG9zdXNwZW5kKTsKKwljYW5jZWxfd29ya19zeW5jKCZ1ZGV2LT5hdXRvcmVzdW1lKTsKIH0KIAogI2Vsc2UKQEAgLTE0MzQsMTcgKzE0MzcsMTIgQEAKIAl1c2JfZGlzYWJsZV9kZXZpY2UodWRldiwgMCk7CiAJdXNiX2hjZF9zeW5jaHJvbml6ZV91bmxpbmtzKHVkZXYpOwogCisJdXNiX3JlbW92ZV9lcF9kZXZzKCZ1ZGV2LT5lcDApOwogCXVzYl91bmxvY2tfZGV2aWNlKHVkZXYpOwogCi0JLyogUmVtb3ZlIHRoZSBkZXZpY2Utc3BlY2lmaWMgZmlsZXMgZnJvbSBzeXNmcy4gIFRoaXMgbXVzdCBiZQotCSAqIGRvbmUgd2l0aCB1ZGV2IHVubG9ja2VkLCBiZWNhdXNlIHNvbWUgb2YgdGhlIGF0dHJpYnV0ZQotCSAqIHJvdXRpbmVzIHRyeSB0byBhY3F1aXJlIHRoZSBkZXZpY2UgbG9jay4KLQkgKi8KLQl1c2JfcmVtb3ZlX3N5c2ZzX2Rldl9maWxlcyh1ZGV2KTsKLQogCS8qIFVucmVnaXN0ZXIgdGhlIGRldmljZS4gIFRoZSBkZXZpY2UgZHJpdmVyIGlzIHJlc3BvbnNpYmxlCi0JICogZm9yIHJlbW92aW5nIHRoZSBkZXZpY2UgZmlsZXMgZnJvbSB1c2JmcyBhbmQgc3lzZnMgYW5kIGZvcgotCSAqIGRlLWNvbmZpZ3VyaW5nIHRoZSBkZXZpY2UuCisJICogZm9yIGRlLWNvbmZpZ3VyaW5nIHRoZSBkZXZpY2UgYW5kIGludm9raW5nIHRoZSByZW1vdmUtZGV2aWNlCisJICogbm90aWZpZXIgY2hhaW4gKHVzZWQgYnkgdXNiZnMgYW5kIHBvc3NpYmx5IG90aGVycykuCiAJICovCiAJZGV2aWNlX2RlbCgmdWRldi0+ZGV2KTsKIApAQCAtMTQ3Niw4ICsxNDc0LDggQEAKIAlkZXZfaW5mbygmdWRldi0+ZGV2LCAiTmV3IFVTQiBkZXZpY2UgZm91bmQsIGlkVmVuZG9yPSUwNHgsIGlkUHJvZHVjdD0lMDR4XG4iLAogCQlsZTE2X3RvX2NwdSh1ZGV2LT5kZXNjcmlwdG9yLmlkVmVuZG9yKSwKIAkJbGUxNl90b19jcHUodWRldi0+ZGVzY3JpcHRvci5pZFByb2R1Y3QpKTsKLQlkZXZfaW5mbygmdWRldi0+ZGV2LCAiTmV3IFVTQiBkZXZpY2Ugc3RyaW5nczogTWZyPSVkLCBQcm9kdWN0PSVkLCAiCi0JCSJTZXJpYWxOdW1iZXI9JWRcbiIsCisJZGV2X2luZm8oJnVkZXYtPmRldiwKKwkJIk5ldyBVU0IgZGV2aWNlIHN0cmluZ3M6IE1mcj0lZCwgUHJvZHVjdD0lZCwgU2VyaWFsTnVtYmVyPSVkXG4iLAogCQl1ZGV2LT5kZXNjcmlwdG9yLmlNYW51ZmFjdHVyZXIsCiAJCXVkZXYtPmRlc2NyaXB0b3IuaVByb2R1Y3QsCiAJCXVkZXYtPmRlc2NyaXB0b3IuaVNlcmlhbE51bWJlcik7CkBAIC0xNTQyLDcgKzE1NDAsNyBAQAogCQkJCQkgKiBjdXN0b21pemUgdG8gbWF0Y2ggeW91ciBwcm9kdWN0LgogCQkJCQkgKi8KIAkJCQkJZGV2X2luZm8oJnVkZXYtPmRldiwKLQkJCQkJCSJjYW4ndCBzZXQgSE5QIG1vZGU7ICVkXG4iLAorCQkJCQkJImNhbid0IHNldCBITlAgbW9kZTogJWRcbiIsCiAJCQkJCQllcnIpOwogCQkJCQlidXMtPmJfaG5wX2VuYWJsZSA9IDA7CiAJCQkJfQpAQCAtMTU1Niw3ICsxNTU0LDcgQEAKIAkJICogKEluY2x1ZGVzIEhOUCB0ZXN0IGRldmljZS4pCiAJCSAqLwogCQlpZiAodWRldi0+YnVzLT5iX2hucF9lbmFibGUgfHwgdWRldi0+YnVzLT5pc19iX2hvc3QpIHsKLQkJCWVyciA9IHVzYl9wb3J0X3N1c3BlbmQodWRldik7CisJCQllcnIgPSB1c2JfcG9ydF9zdXNwZW5kKHVkZXYsIFBNU0dfU1VTUEVORCk7CiAJCQlpZiAoZXJyIDwgMCkKIAkJCQlkZXZfZGJnKCZ1ZGV2LT5kZXYsICJITlAgZmFpbCwgJWRcbiIsIGVycik7CiAJCX0KQEAgLTE2MzUsNiArMTYzMywxMCBAQAogewogCWludCBlcnI7CiAKKwkvKiBJbmNyZW1lbnQgdGhlIHBhcmVudCdzIGNvdW50IG9mIHVuc3VzcGVuZGVkIGNoaWxkcmVuICovCisJaWYgKHVkZXYtPnBhcmVudCkKKwkJdXNiX2F1dG9yZXN1bWVfZGV2aWNlKHVkZXYtPnBhcmVudCk7CisKIAl1c2JfZGV0ZWN0X3F1aXJrcyh1ZGV2KTsJCS8qIERldGVybWluZSBxdWlya3MgKi8KIAllcnIgPSB1c2JfY29uZmlndXJlX2RldmljZSh1ZGV2KTsJLyogZGV0ZWN0ICYgcHJvYmUgZGV2L2ludGZzICovCiAJaWYgKGVyciA8IDApCkBAIC0xNjQzLDEzICsxNjQ1LDEyIEBACiAJdWRldi0+ZGV2LmRldnQgPSBNS0RFVihVU0JfREVWSUNFX01BSk9SLAogCQkJKCgodWRldi0+YnVzLT5idXNudW0tMSkgKiAxMjgpICsgKHVkZXYtPmRldm51bS0xKSkpOwogCi0JLyogSW5jcmVtZW50IHRoZSBwYXJlbnQncyBjb3VudCBvZiB1bnN1c3BlbmRlZCBjaGlsZHJlbiAqLwotCWlmICh1ZGV2LT5wYXJlbnQpCi0JCXVzYl9hdXRvcmVzdW1lX2RldmljZSh1ZGV2LT5wYXJlbnQpOworCS8qIFRlbGwgdGhlIHdvcmxkISAqLworCWFubm91bmNlX2RldmljZSh1ZGV2KTsKIAogCS8qIFJlZ2lzdGVyIHRoZSBkZXZpY2UuICBUaGUgZGV2aWNlIGRyaXZlciBpcyByZXNwb25zaWJsZQotCSAqIGZvciBhZGRpbmcgdGhlIGRldmljZSBmaWxlcyB0byBzeXNmcyBhbmQgZm9yIGNvbmZpZ3VyaW5nCi0JICogdGhlIGRldmljZS4KKwkgKiBmb3IgY29uZmlndXJpbmcgdGhlIGRldmljZSBhbmQgaW52b2tpbmcgdGhlIGFkZC1kZXZpY2UKKwkgKiBub3RpZmllciBjaGFpbiAodXNlZCBieSB1c2JmcyBhbmQgcG9zc2libHkgb3RoZXJzKS4KIAkgKi8KIAllcnIgPSBkZXZpY2VfYWRkKCZ1ZGV2LT5kZXYpOwogCWlmIChlcnIpIHsKQEAgLTE2NTcsMTUgKzE2NTgsMTIgQEAKIAkJZ290byBmYWlsOwogCX0KIAotCS8qIHB1dCBkZXZpY2Utc3BlY2lmaWMgZmlsZXMgaW50byBzeXNmcyAqLwotCXVzYl9jcmVhdGVfc3lzZnNfZGV2X2ZpbGVzKHVkZXYpOwotCi0JLyogVGVsbCB0aGUgd29ybGQhICovCi0JYW5ub3VuY2VfZGV2aWNlKHVkZXYpOworCSh2b2lkKSB1c2JfY3JlYXRlX2VwX2RldnMoJnVkZXYtPmRldiwgJnVkZXYtPmVwMCwgdWRldik7CiAJcmV0dXJuIGVycjsKIAogZmFpbDoKIAl1c2Jfc2V0X2RldmljZV9zdGF0ZSh1ZGV2LCBVU0JfU1RBVEVfTk9UQVRUQUNIRUQpOworCXVzYl9zdG9wX3BtKHVkZXYpOwogCXJldHVybiBlcnI7CiB9CiAKQEAgLTE5ODIsNyArMTk4MCw3IEBACiAgKgogICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIGVsc2UgbmVnYXRpdmUgZXJybm8uCiAgKi8KLWludCB1c2JfcG9ydF9zdXNwZW5kKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2KQoraW50IHVzYl9wb3J0X3N1c3BlbmQoc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYsIHBtX21lc3NhZ2VfdCBtc2cpCiB7CiAJc3RydWN0IHVzYl9odWIJKmh1YiA9IGhkZXZfdG9faHViKHVkZXYtPnBhcmVudCk7CiAJaW50CQlwb3J0MSA9IHVkZXYtPnBvcnRudW07CkBAIC0yMDIxLDcgKzIwMTksNyBAQAogCX0gZWxzZSB7CiAJCS8qIGRldmljZSBoYXMgdXAgdG8gMTAgbXNlYyB0byBmdWxseSBzdXNwZW5kICovCiAJCWRldl9kYmcoJnVkZXYtPmRldiwgInVzYiAlc3N1c3BlbmRcbiIsCi0JCQkJdWRldi0+YXV0b19wbSA/ICJhdXRvLSIgOiAiIik7CisJCQkJKG1zZy5ldmVudCAmIFBNX0VWRU5UX0FVVE8gPyAiYXV0by0iIDogIiIpKTsKIAkJdXNiX3NldF9kZXZpY2Vfc3RhdGUodWRldiwgVVNCX1NUQVRFX1NVU1BFTkRFRCk7CiAJCW1zbGVlcCgxMCk7CiAJfQpAQCAtMjA0NSw4ICsyMDQzLDggQEAKIAl1MTYJZGV2c3RhdHVzOwogCiAJLyogY2FsbGVyIG93bnMgdGhlIHVkZXYgZGV2aWNlIGxvY2sgKi8KLQlkZXZfZGJnKCZ1ZGV2LT5kZXYsICJmaW5pc2ggJXNyZXN1bWVcbiIsCi0JCQl1ZGV2LT5yZXNldF9yZXN1bWUgPyAicmVzZXQtIiA6ICIiKTsKKwlkZXZfZGJnKCZ1ZGV2LT5kZXYsICIlc1xuIiwKKwkJdWRldi0+cmVzZXRfcmVzdW1lID8gImZpbmlzaCByZXNldC1yZXN1bWUiIDogImZpbmlzaCByZXN1bWUiKTsKIAogCS8qIHVzYiBjaDkgaWRlbnRpZmllcyBmb3VyIHZhcmlhbnRzIG9mIFNVU1BFTkRFRCwgYmFzZWQgb24gd2hhdAogCSAqIHN0YXRlIHRoZSBkZXZpY2UgcmVzdW1lcyB0by4gIExpbnV4IGN1cnJlbnRseSB3b24ndCBzZWUgdGhlCkBAIC0yMDk4LDggKzIwOTYsOSBAQAogCQkJCQlOVUxMLCAwLAogCQkJCQlVU0JfQ1RSTF9TRVRfVElNRU9VVCk7CiAJCQlpZiAoc3RhdHVzKQotCQkJCWRldl9kYmcoJnVkZXYtPmRldiwgImRpc2FibGUgcmVtb3RlICIKLQkJCQkJIndha2V1cCwgc3RhdHVzICVkXG4iLCBzdGF0dXMpOworCQkJCWRldl9kYmcoJnVkZXYtPmRldiwKKwkJCQkJImRpc2FibGUgcmVtb3RlIHdha2V1cCwgc3RhdHVzICVkXG4iLAorCQkJCQlzdGF0dXMpOwogCQl9CiAJCXN0YXR1cyA9IDA7CiAJfQpAQCAtMjE0MCw3ICsyMTM5LDcgQEAKICAqCiAgKiBSZXR1cm5zIDAgb24gc3VjY2VzcywgZWxzZSBuZWdhdGl2ZSBlcnJuby4KICAqLwotaW50IHVzYl9wb3J0X3Jlc3VtZShzdHJ1Y3QgdXNiX2RldmljZSAqdWRldikKK2ludCB1c2JfcG9ydF9yZXN1bWUoc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYsIHBtX21lc3NhZ2VfdCBtc2cpCiB7CiAJc3RydWN0IHVzYl9odWIJKmh1YiA9IGhkZXZfdG9faHViKHVkZXYtPnBhcmVudCk7CiAJaW50CQlwb3J0MSA9IHVkZXYtPnBvcnRudW07CkBAIC0yMTY1LDcgKzIxNjQsNyBAQAogCX0gZWxzZSB7CiAJCS8qIGRyaXZlIHJlc3VtZSBmb3IgYXQgbGVhc3QgMjAgbXNlYyAqLwogCQlkZXZfZGJnKCZ1ZGV2LT5kZXYsICJ1c2IgJXNyZXN1bWVcbiIsCi0JCQkJdWRldi0+YXV0b19wbSA/ICJhdXRvLSIgOiAiIik7CisJCQkJKG1zZy5ldmVudCAmIFBNX0VWRU5UX0FVVE8gPyAiYXV0by0iIDogIiIpKTsKIAkJbXNsZWVwKDI1KTsKIAogCQkvKiBWaXJ0dWFsIHJvb3QgaHVicyBjYW4gdHJpZ2dlciBvbiBHRVRfUE9SVF9TVEFUVVMgdG8KQEAgLTIyMDYsNyArMjIwNSw3IEBACiAJaWYgKHVkZXYtPnN0YXRlID09IFVTQl9TVEFURV9TVVNQRU5ERUQpIHsKIAkJZGV2X2RiZygmdWRldi0+ZGV2LCAidXNiICVzcmVzdW1lXG4iLCAid2FrZXVwLSIpOwogCQl1c2JfbWFya19sYXN0X2J1c3kodWRldik7Ci0JCXN0YXR1cyA9IHVzYl9leHRlcm5hbF9yZXN1bWVfZGV2aWNlKHVkZXYpOworCQlzdGF0dXMgPSB1c2JfZXh0ZXJuYWxfcmVzdW1lX2RldmljZSh1ZGV2LCBQTVNHX1JFTU9URV9SRVNVTUUpOwogCX0KIAlyZXR1cm4gc3RhdHVzOwogfQpAQCAtMjIxNSwxNCArMjIxNCwxNCBAQAogCiAvKiBXaGVuIENPTkZJR19VU0JfU1VTUEVORCBpc24ndCBzZXQsIHdlIG5ldmVyIHN1c3BlbmQgb3IgcmVzdW1lIGFueSBwb3J0cy4gKi8KIAotaW50IHVzYl9wb3J0X3N1c3BlbmQoc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYpCitpbnQgdXNiX3BvcnRfc3VzcGVuZChzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiwgcG1fbWVzc2FnZV90IG1zZykKIHsKIAlyZXR1cm4gMDsKIH0KIAogLyogSG93ZXZlciB3ZSBtYXkgbmVlZCB0byBkbyBhIHJlc2V0LXJlc3VtZSAqLwogCi1pbnQgdXNiX3BvcnRfcmVzdW1lKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2KQoraW50IHVzYl9wb3J0X3Jlc3VtZShzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiwgcG1fbWVzc2FnZV90IG1zZykKIHsKIAlzdHJ1Y3QgdXNiX2h1YgkqaHViID0gaGRldl90b19odWIodWRldi0+cGFyZW50KTsKIAlpbnQJCXBvcnQxID0gdWRldi0+cG9ydG51bTsKQEAgLTIyNjIsNyArMjI2MSw3IEBACiAKIAkJdWRldiA9IGhkZXYtPmNoaWxkcmVuIFtwb3J0MS0xXTsKIAkJaWYgKHVkZXYgJiYgdWRldi0+Y2FuX3N1Ym1pdCkgewotCQkJaWYgKCFoZGV2LT5hdXRvX3BtKQorCQkJaWYgKCEobXNnLmV2ZW50ICYgUE1fRVZFTlRfQVVUTykpCiAJCQkJZGV2X2RiZygmaW50Zi0+ZGV2LCAicG9ydCAlZCBueWV0IHN1c3BlbmRlZFxuIiwKIAkJCQkJCXBvcnQxKTsKIAkJCXJldHVybiAtRUJVU1k7CkBAIC0yMzg1LDcgKzIzODQsNyBAQAogewogCXVzYl9kaXNhYmxlX2VuZHBvaW50KHVkZXYsIDAgKyBVU0JfRElSX0lOKTsKIAl1c2JfZGlzYWJsZV9lbmRwb2ludCh1ZGV2LCAwICsgVVNCX0RJUl9PVVQpOwotCXVzYl9lbmFibGVfZW5kcG9pbnQodWRldiwgJnVkZXYtPmVwMCk7CisJdXNiX2VuYWJsZV9lbmRwb2ludCh1ZGV2LCAmdWRldi0+ZXAwLCB0cnVlKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHVzYl9lcDBfcmVpbml0KTsKIApAQCAtMjU4Miw5ICsyNTgxLDkgQEAKIAkJCQlnb3RvIGZhaWw7CiAJCQl9CiAJCQlpZiAocikgewotCQkJCWRldl9lcnIoJnVkZXYtPmRldiwgImRldmljZSBkZXNjcmlwdG9yICIKLQkJCQkJCSJyZWFkLyVzLCBlcnJvciAlZFxuIiwKLQkJCQkJCSI2NCIsIHIpOworCQkJCWRldl9lcnIoJnVkZXYtPmRldiwKKwkJCQkJImRldmljZSBkZXNjcmlwdG9yIHJlYWQvNjQsIGVycm9yICVkXG4iLAorCQkJCQlyKTsKIAkJCQlyZXR2YWwgPSAtRU1TR1NJWkU7CiAJCQkJY29udGludWU7CiAJCQl9CkBAIC0yNjIxLDkgKzI2MjAsOSBAQAogCiAJCXJldHZhbCA9IHVzYl9nZXRfZGV2aWNlX2Rlc2NyaXB0b3IodWRldiwgOCk7CiAJCWlmIChyZXR2YWwgPCA4KSB7Ci0JCQlkZXZfZXJyKCZ1ZGV2LT5kZXYsICJkZXZpY2UgZGVzY3JpcHRvciAiCi0JCQkJCSJyZWFkLyVzLCBlcnJvciAlZFxuIiwKLQkJCQkJIjgiLCByZXR2YWwpOworCQkJZGV2X2VycigmdWRldi0+ZGV2LAorCQkJCQkiZGV2aWNlIGRlc2NyaXB0b3IgcmVhZC84LCBlcnJvciAlZFxuIiwKKwkJCQkJcmV0dmFsKTsKIAkJCWlmIChyZXR2YWwgPj0gMCkKIAkJCQlyZXR2YWwgPSAtRU1TR1NJWkU7CiAJCX0gZWxzZSB7CkBAIC0yNjUwLDggKzI2NDksOCBAQAogICAKIAlyZXR2YWwgPSB1c2JfZ2V0X2RldmljZV9kZXNjcmlwdG9yKHVkZXYsIFVTQl9EVF9ERVZJQ0VfU0laRSk7CiAJaWYgKHJldHZhbCA8IChzaWduZWQpc2l6ZW9mKHVkZXYtPmRlc2NyaXB0b3IpKSB7Ci0JCWRldl9lcnIoJnVkZXYtPmRldiwgImRldmljZSBkZXNjcmlwdG9yIHJlYWQvJXMsIGVycm9yICVkXG4iLAotCQkJImFsbCIsIHJldHZhbCk7CisJCWRldl9lcnIoJnVkZXYtPmRldiwgImRldmljZSBkZXNjcmlwdG9yIHJlYWQvYWxsLCBlcnJvciAlZFxuIiwKKwkJCXJldHZhbCk7CiAJCWlmIChyZXR2YWwgPj0gMCkKIAkJCXJldHZhbCA9IC1FTk9NU0c7CiAJCWdvdG8gZmFpbDsKQEAgLTI3MTksOSArMjcxOCw5IEBACiAJCWVsc2UKIAkJCWRlbHRhID0gODsKIAkJaWYgKGRlbHRhID4gaHViLT5tQV9wZXJfcG9ydCkKLQkJCWRldl93YXJuKCZ1ZGV2LT5kZXYsICIlZG1BIGlzIG92ZXIgJXVtQSBidWRnZXQgIgotCQkJCQkiZm9yIHBvcnQgJWQhXG4iLAotCQkJCQlkZWx0YSwgaHViLT5tQV9wZXJfcG9ydCwgcG9ydDEpOworCQkJZGV2X3dhcm4oJnVkZXYtPmRldiwKKwkJCQkgIiVkbUEgaXMgb3ZlciAldW1BIGJ1ZGdldCBmb3IgcG9ydCAlZCFcbiIsCisJCQkJIGRlbHRhLCBodWItPm1BX3Blcl9wb3J0LCBwb3J0MSk7CiAJCXJlbWFpbmluZyAtPSBkZWx0YTsKIAl9CiAJaWYgKHJlbWFpbmluZyA8IDApIHsKQEAgLTM1MTcsMyArMzUxNiw0NiBAQAogCXJldHVybiByZXQ7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTCh1c2JfcmVzZXRfZGV2aWNlKTsKKworCisvKioKKyAqIHVzYl9xdWV1ZV9yZXNldF9kZXZpY2UgLSBSZXNldCBhIFVTQiBkZXZpY2UgZnJvbSBhbiBhdG9taWMgY29udGV4dAorICogQGlmYWNlOiBVU0IgaW50ZXJmYWNlIGJlbG9uZ2luZyB0byB0aGUgZGV2aWNlIHRvIHJlc2V0CisgKgorICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byByZXNldCBhIFVTQiBkZXZpY2UgZnJvbSBhbiBhdG9taWMKKyAqIGNvbnRleHQsIHdoZXJlIHVzYl9yZXNldF9kZXZpY2UoKSB3b24ndCB3b3JrIChhcyBpdCBibG9ja3MpLgorICoKKyAqIERvaW5nIGEgcmVzZXQgdmlhIHRoaXMgbWV0aG9kIGlzIGZ1bmN0aW9uYWxseSBlcXVpdmFsZW50IHRvIGNhbGxpbmcKKyAqIHVzYl9yZXNldF9kZXZpY2UoKSwgZXhjZXB0IGZvciB0aGUgZmFjdCB0aGF0IGl0IGlzIGRlbGF5ZWQgdG8gYQorICogd29ya3F1ZXVlLiBUaGlzIG1lYW5zIHRoYXQgYW55IGRyaXZlcnMgYm91bmQgdG8gb3RoZXIgaW50ZXJmYWNlcworICogbWlnaHQgYmUgdW5ib3VuZCwgYXMgd2VsbCBhcyB1c2VycyBmcm9tIHVzYmZzIGluIHVzZXIgc3BhY2UuCisgKgorICogQ29ybmVyIGNhc2VzOgorICoKKyAqIC0gU2NoZWR1bGluZyB0d28gcmVzZXRzIGF0IHRoZSBzYW1lIHRpbWUgZnJvbSB0d28gZGlmZmVyZW50IGRyaXZlcnMKKyAqICAgYXR0YWNoZWQgdG8gdHdvIGRpZmZlcmVudCBpbnRlcmZhY2VzIG9mIHRoZSBzYW1lIGRldmljZSBpcworICogICBwb3NzaWJsZTsgZGVwZW5kaW5nIG9uIGhvdyB0aGUgZHJpdmVyIGF0dGFjaGVkIHRvIGVhY2ggaW50ZXJmYWNlCisgKiAgIGhhbmRsZXMgLT5wcmVfcmVzZXQoKSwgdGhlIHNlY29uZCByZXNldCBtaWdodCBoYXBwZW4gb3Igbm90LgorICoKKyAqIC0gSWYgYSBkcml2ZXIgaXMgdW5ib3VuZCBhbmQgaXQgaGFkIGEgcGVuZGluZyByZXNldCwgdGhlIHJlc2V0IHdpbGwKKyAqICAgYmUgY2FuY2VsbGVkLgorICoKKyAqIC0gVGhpcyBmdW5jdGlvbiBjYW4gYmUgY2FsbGVkIGR1cmluZyAucHJvYmUoKSBvciAuZGlzY29ubmVjdCgpCisgKiAgIHRpbWVzLiBPbiByZXR1cm4gZnJvbSAuZGlzY29ubmVjdCgpLCBhbnkgcGVuZGluZyByZXNldHMgd2lsbCBiZQorICogICBjYW5jZWxsZWQuCisgKgorICogVGhlcmUgaXMgbm8gbm8gbmVlZCB0byBsb2NrL3VubG9jayB0aGUgQHJlc2V0X3dzIGFzIHNjaGVkdWxlX3dvcmsoKQorICogZG9lcyBpdHMgb3duLgorICoKKyAqIE5PVEU6IFdlIGRvbid0IGRvIGFueSByZWZlcmVuY2UgY291bnQgdHJhY2tpbmcgYmVjYXVzZSBpdCBpcyBub3QKKyAqICAgICBuZWVkZWQuIFRoZSBsaWZlY3ljbGUgb2YgdGhlIHdvcmtfc3RydWN0IGlzIHRpZWQgdG8gdGhlCisgKiAgICAgdXNiX2ludGVyZmFjZS4gQmVmb3JlIGRlc3Ryb3lpbmcgdGhlIGludGVyZmFjZSB3ZSBjYW5jZWwgdGhlCisgKiAgICAgd29ya19zdHJ1Y3QsIHNvIHRoZSBmYWN0IHRoYXQgd29ya19zdHJ1Y3QgaXMgcXVldWVkIGFuZCBvcgorICogICAgIHJ1bm5pbmcgbWVhbnMgdGhlIGludGVyZmFjZSAoYW5kIHRodXMsIHRoZSBkZXZpY2UpIGV4aXN0IGFuZAorICogICAgIGFyZSByZWZlcmVuY2VkLgorICovCit2b2lkIHVzYl9xdWV1ZV9yZXNldF9kZXZpY2Uoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmlmYWNlKQoreworCXNjaGVkdWxlX3dvcmsoJmlmYWNlLT5yZXNldF93cyk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh1c2JfcXVldWVfcmVzZXRfZGV2aWNlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NvcmUvbWVzc2FnZS5jIGIvZHJpdmVycy91c2IvY29yZS9tZXNzYWdlLmMKaW5kZXggNmQxMDQ4Zi4uZGU1MTY2NyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvY29yZS9tZXNzYWdlLmMKKysrIGIvZHJpdmVycy91c2IvY29yZS9tZXNzYWdlLmMKQEAgLTE4LDYgKzE4LDggQEAKICNpbmNsdWRlICJoY2QuaCIJLyogZm9yIHVzYmNvcmUgaW50ZXJuYWxzICovCiAjaW5jbHVkZSAidXNiLmgiCiAKK3N0YXRpYyB2b2lkIGNhbmNlbF9hc3luY19zZXRfY29uZmlnKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2KTsKKwogc3RydWN0IGFwaV9jb250ZXh0IHsKIAlzdHJ1Y3QgY29tcGxldGlvbglkb25lOwogCWludAkJCXN0YXR1czsKQEAgLTEzOSw5ICsxNDEsOSBAQAogCiAJZHItPmJSZXF1ZXN0VHlwZSA9IHJlcXVlc3R0eXBlOwogCWRyLT5iUmVxdWVzdCA9IHJlcXVlc3Q7Ci0JZHItPndWYWx1ZSA9IGNwdV90b19sZTE2cCgmdmFsdWUpOwotCWRyLT53SW5kZXggPSBjcHVfdG9fbGUxNnAoJmluZGV4KTsKLQlkci0+d0xlbmd0aCA9IGNwdV90b19sZTE2cCgmc2l6ZSk7CisJZHItPndWYWx1ZSA9IGNwdV90b19sZTE2KHZhbHVlKTsKKwlkci0+d0luZGV4ID0gY3B1X3RvX2xlMTYoaW5kZXgpOworCWRyLT53TGVuZ3RoID0gY3B1X3RvX2xlMTYoc2l6ZSk7CiAKIAkvKiBkYmcoInVzYl9jb250cm9sX21zZyIpOyAqLwogCkBAIC0xMDA0LDYgKzEwMDYsMzQgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHVzYl9jbGVhcl9oYWx0KTsKIAorc3RhdGljIGludCBjcmVhdGVfaW50Zl9lcF9kZXZzKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQoreworCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2ID0gaW50ZXJmYWNlX3RvX3VzYmRldihpbnRmKTsKKwlzdHJ1Y3QgdXNiX2hvc3RfaW50ZXJmYWNlICphbHQgPSBpbnRmLT5jdXJfYWx0c2V0dGluZzsKKwlpbnQgaTsKKworCWlmIChpbnRmLT5lcF9kZXZzX2NyZWF0ZWQgfHwgaW50Zi0+dW5yZWdpc3RlcmluZykKKwkJcmV0dXJuIDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgYWx0LT5kZXNjLmJOdW1FbmRwb2ludHM7ICsraSkKKwkJKHZvaWQpIHVzYl9jcmVhdGVfZXBfZGV2cygmaW50Zi0+ZGV2LCAmYWx0LT5lbmRwb2ludFtpXSwgdWRldik7CisJaW50Zi0+ZXBfZGV2c19jcmVhdGVkID0gMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcmVtb3ZlX2ludGZfZXBfZGV2cyhzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKK3sKKwlzdHJ1Y3QgdXNiX2hvc3RfaW50ZXJmYWNlICphbHQgPSBpbnRmLT5jdXJfYWx0c2V0dGluZzsKKwlpbnQgaTsKKworCWlmICghaW50Zi0+ZXBfZGV2c19jcmVhdGVkKQorCQlyZXR1cm47CisKKwlmb3IgKGkgPSAwOyBpIDwgYWx0LT5kZXNjLmJOdW1FbmRwb2ludHM7ICsraSkKKwkJdXNiX3JlbW92ZV9lcF9kZXZzKCZhbHQtPmVuZHBvaW50W2ldKTsKKwlpbnRmLT5lcF9kZXZzX2NyZWF0ZWQgPSAwOworfQorCiAvKioKICAqIHVzYl9kaXNhYmxlX2VuZHBvaW50IC0tIERpc2FibGUgYW4gZW5kcG9pbnQgYnkgYWRkcmVzcwogICogQGRldjogdGhlIGRldmljZSB3aG9zZSBlbmRwb2ludCBpcyBiZWluZyBkaXNhYmxlZApAQCAtMTA5Miw3ICsxMTIyLDcgQEAKIAkJCWRldl9kYmcoJmRldi0+ZGV2LCAidW5yZWdpc3RlcmluZyBpbnRlcmZhY2UgJXNcbiIsCiAJCQkJZGV2X25hbWUoJmludGVyZmFjZS0+ZGV2KSk7CiAJCQlpbnRlcmZhY2UtPnVucmVnaXN0ZXJpbmcgPSAxOwotCQkJdXNiX3JlbW92ZV9zeXNmc19pbnRmX2ZpbGVzKGludGVyZmFjZSk7CisJCQlyZW1vdmVfaW50Zl9lcF9kZXZzKGludGVyZmFjZSk7CiAJCQlkZXZpY2VfZGVsKCZpbnRlcmZhY2UtPmRldik7CiAJCX0KIApAQCAtMTExMywyMiArMTE0MywyNiBAQAogICogdXNiX2VuYWJsZV9lbmRwb2ludCAtIEVuYWJsZSBhbiBlbmRwb2ludCBmb3IgVVNCIGNvbW11bmljYXRpb25zCiAgKiBAZGV2OiB0aGUgZGV2aWNlIHdob3NlIGludGVyZmFjZSBpcyBiZWluZyBlbmFibGVkCiAgKiBAZXA6IHRoZSBlbmRwb2ludAorICogQHJlc2V0X3RvZ2dsZTogZmxhZyB0byBzZXQgdGhlIGVuZHBvaW50J3MgdG9nZ2xlIGJhY2sgdG8gMAogICoKLSAqIFJlc2V0cyB0aGUgZW5kcG9pbnQgdG9nZ2xlLCBhbmQgc2V0cyBkZXYtPmVwX3tpbixvdXR9IHBvaW50ZXJzLgorICogUmVzZXRzIHRoZSBlbmRwb2ludCB0b2dnbGUgaWYgYXNrZWQsIGFuZCBzZXRzIGRldi0+ZXBfe2luLG91dH0gcG9pbnRlcnMuCiAgKiBGb3IgY29udHJvbCBlbmRwb2ludHMsIGJvdGggdGhlIGlucHV0IGFuZCBvdXRwdXQgc2lkZXMgYXJlIGhhbmRsZWQuCiAgKi8KLXZvaWQgdXNiX2VuYWJsZV9lbmRwb2ludChzdHJ1Y3QgdXNiX2RldmljZSAqZGV2LCBzdHJ1Y3QgdXNiX2hvc3RfZW5kcG9pbnQgKmVwKQordm9pZCB1c2JfZW5hYmxlX2VuZHBvaW50KHN0cnVjdCB1c2JfZGV2aWNlICpkZXYsIHN0cnVjdCB1c2JfaG9zdF9lbmRwb2ludCAqZXAsCisJCWJvb2wgcmVzZXRfdG9nZ2xlKQogewogCWludCBlcG51bSA9IHVzYl9lbmRwb2ludF9udW0oJmVwLT5kZXNjKTsKIAlpbnQgaXNfb3V0ID0gdXNiX2VuZHBvaW50X2Rpcl9vdXQoJmVwLT5kZXNjKTsKIAlpbnQgaXNfY29udHJvbCA9IHVzYl9lbmRwb2ludF94ZmVyX2NvbnRyb2woJmVwLT5kZXNjKTsKIAogCWlmIChpc19vdXQgfHwgaXNfY29udHJvbCkgewotCQl1c2Jfc2V0dG9nZ2xlKGRldiwgZXBudW0sIDEsIDApOworCQlpZiAocmVzZXRfdG9nZ2xlKQorCQkJdXNiX3NldHRvZ2dsZShkZXYsIGVwbnVtLCAxLCAwKTsKIAkJZGV2LT5lcF9vdXRbZXBudW1dID0gZXA7CiAJfQogCWlmICghaXNfb3V0IHx8IGlzX2NvbnRyb2wpIHsKLQkJdXNiX3NldHRvZ2dsZShkZXYsIGVwbnVtLCAwLCAwKTsKKwkJaWYgKHJlc2V0X3RvZ2dsZSkKKwkJCXVzYl9zZXR0b2dnbGUoZGV2LCBlcG51bSwgMCwgMCk7CiAJCWRldi0+ZXBfaW5bZXBudW1dID0gZXA7CiAJfQogCWVwLT5lbmFibGVkID0gMTsKQEAgLTExMzgsMTcgKzExNzIsMTggQEAKICAqIHVzYl9lbmFibGVfaW50ZXJmYWNlIC0gRW5hYmxlIGFsbCB0aGUgZW5kcG9pbnRzIGZvciBhbiBpbnRlcmZhY2UKICAqIEBkZXY6IHRoZSBkZXZpY2Ugd2hvc2UgaW50ZXJmYWNlIGlzIGJlaW5nIGVuYWJsZWQKICAqIEBpbnRmOiBwb2ludGVyIHRvIHRoZSBpbnRlcmZhY2UgZGVzY3JpcHRvcgorICogQHJlc2V0X3RvZ2dsZXM6IGZsYWcgdG8gc2V0IHRoZSBlbmRwb2ludHMnIHRvZ2dsZXMgYmFjayB0byAwCiAgKgogICogRW5hYmxlcyBhbGwgdGhlIGVuZHBvaW50cyBmb3IgdGhlIGludGVyZmFjZSdzIGN1cnJlbnQgYWx0c2V0dGluZy4KICAqLwotc3RhdGljIHZvaWQgdXNiX2VuYWJsZV9pbnRlcmZhY2Uoc3RydWN0IHVzYl9kZXZpY2UgKmRldiwKLQkJCQkgc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCit2b2lkIHVzYl9lbmFibGVfaW50ZXJmYWNlKHN0cnVjdCB1c2JfZGV2aWNlICpkZXYsCisJCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLCBib29sIHJlc2V0X3RvZ2dsZXMpCiB7CiAJc3RydWN0IHVzYl9ob3N0X2ludGVyZmFjZSAqYWx0ID0gaW50Zi0+Y3VyX2FsdHNldHRpbmc7CiAJaW50IGk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgYWx0LT5kZXNjLmJOdW1FbmRwb2ludHM7ICsraSkKLQkJdXNiX2VuYWJsZV9lbmRwb2ludChkZXYsICZhbHQtPmVuZHBvaW50W2ldKTsKKwkJdXNiX2VuYWJsZV9lbmRwb2ludChkZXYsICZhbHQtPmVuZHBvaW50W2ldLCByZXNldF90b2dnbGVzKTsKIH0KIAogLyoqCkBAIC0xMjM1LDggKzEyNzAsMTAgQEAKIAkgKi8KIAogCS8qIHByZXZlbnQgc3VibWlzc2lvbnMgdXNpbmcgcHJldmlvdXMgZW5kcG9pbnQgc2V0dGluZ3MgKi8KLQlpZiAoaWZhY2UtPmN1cl9hbHRzZXR0aW5nICE9IGFsdCkKKwlpZiAoaWZhY2UtPmN1cl9hbHRzZXR0aW5nICE9IGFsdCkgeworCQlyZW1vdmVfaW50Zl9lcF9kZXZzKGlmYWNlKTsKIAkJdXNiX3JlbW92ZV9zeXNmc19pbnRmX2ZpbGVzKGlmYWNlKTsKKwl9CiAJdXNiX2Rpc2FibGVfaW50ZXJmYWNlKGRldiwgaWZhY2UpOwogCiAJaWZhY2UtPmN1cl9hbHRzZXR0aW5nID0gYWx0OwpAQCAtMTI3MSwxMCArMTMwOCwxMSBAQAogCSAqIGR1cmluZyB0aGUgU0VUVVAgc3RhZ2UgLSBoZW5jZSBFUDAgdG9nZ2xlcyBhcmUgImRvbid0IGNhcmUiIGhlcmUuCiAJICogKExpa2V3aXNlLCBFUDAgbmV2ZXIgImhhbHRzIiBvbiB3ZWxsIGRlc2lnbmVkIGRldmljZXMuKQogCSAqLwotCXVzYl9lbmFibGVfaW50ZXJmYWNlKGRldiwgaWZhY2UpOwotCWlmIChkZXZpY2VfaXNfcmVnaXN0ZXJlZCgmaWZhY2UtPmRldikpCisJdXNiX2VuYWJsZV9pbnRlcmZhY2UoZGV2LCBpZmFjZSwgdHJ1ZSk7CisJaWYgKGRldmljZV9pc19yZWdpc3RlcmVkKCZpZmFjZS0+ZGV2KSkgewogCQl1c2JfY3JlYXRlX3N5c2ZzX2ludGZfZmlsZXMoaWZhY2UpOwotCisJCWNyZWF0ZV9pbnRmX2VwX2RldnMoaWZhY2UpOworCX0KIAlyZXR1cm4gMDsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHVzYl9zZXRfaW50ZXJmYWNlKTsKQEAgLTEzMzQsNyArMTM3Miw2IEBACiAJCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmID0gY29uZmlnLT5pbnRlcmZhY2VbaV07CiAJCXN0cnVjdCB1c2JfaG9zdF9pbnRlcmZhY2UgKmFsdDsKIAotCQl1c2JfcmVtb3ZlX3N5c2ZzX2ludGZfZmlsZXMoaW50Zik7CiAJCWFsdCA9IHVzYl9hbHRudW1fdG9fYWx0c2V0dGluZyhpbnRmLCAwKTsKIAogCQkvKiBObyBhbHRzZXR0aW5nIDA/ICBXZSdsbCBhc3N1bWUgdGhlIGZpcnN0IGFsdHNldHRpbmcuCkBAIC0xMzQ1LDEwICsxMzgyLDE2IEBACiAJCWlmICghYWx0KQogCQkJYWx0ID0gJmludGYtPmFsdHNldHRpbmdbMF07CiAKKwkJaWYgKGFsdCAhPSBpbnRmLT5jdXJfYWx0c2V0dGluZykgeworCQkJcmVtb3ZlX2ludGZfZXBfZGV2cyhpbnRmKTsKKwkJCXVzYl9yZW1vdmVfc3lzZnNfaW50Zl9maWxlcyhpbnRmKTsKKwkJfQogCQlpbnRmLT5jdXJfYWx0c2V0dGluZyA9IGFsdDsKLQkJdXNiX2VuYWJsZV9pbnRlcmZhY2UoZGV2LCBpbnRmKTsKLQkJaWYgKGRldmljZV9pc19yZWdpc3RlcmVkKCZpbnRmLT5kZXYpKQorCQl1c2JfZW5hYmxlX2ludGVyZmFjZShkZXYsIGludGYsIHRydWUpOworCQlpZiAoZGV2aWNlX2lzX3JlZ2lzdGVyZWQoJmludGYtPmRldikpIHsKIAkJCXVzYl9jcmVhdGVfc3lzZnNfaW50Zl9maWxlcyhpbnRmKTsKKwkJCWNyZWF0ZV9pbnRmX2VwX2RldnMoaW50Zik7CisJCX0KIAl9CiAJcmV0dXJuIDA7CiB9CkBAIC0xNDQxLDYgKzE0ODQsNDYgQEAKIAlyZXR1cm4gcmV0dmFsOwogfQogCisKKy8qCisgKiBJbnRlcm5hbCBmdW5jdGlvbiB0byBxdWV1ZSBhIGRldmljZSByZXNldAorICoKKyAqIFRoaXMgaXMgaW5pdGlhbGl6ZWQgaW50byB0aGUgd29ya3N0cnVjdCBpbiAnc3RydWN0CisgKiB1c2JfZGV2aWNlLT5yZXNldF93cycgdGhhdCBpcyBsYXVuY2hlZCBieQorICogbWVzc2FnZS5jOnVzYl9zZXRfY29uZmlndXJhdGlvbigpIHdoZW4gaW5pdGlhbGl6aW5nIGVhY2ggJ3N0cnVjdAorICogdXNiX2ludGVyZmFjZScuCisgKgorICogSXQgaXMgc2FmZSB0byBnZXQgdGhlIFVTQiBkZXZpY2Ugd2l0aG91dCByZWZlcmVuY2UgY291bnRzIGJlY2F1c2UKKyAqIHRoZSBsaWZlIGN5Y2xlIG9mIEBpZmFjZSBpcyBib3VuZCB0byB0aGUgbGlmZSBjeWNsZSBvZiBAdWRldi4gVGhlbiwKKyAqIHRoaXMgZnVuY3Rpb24gd2lsbCBiZSByYW4gb25seSBpZiBAaWZhY2UgaXMgYWxpdmUgKGFuZCBiZWZvcmUKKyAqIGZyZWVpbmcgaXQgYW55IHNjaGVkdWxlZCBpbnN0YW5jZXMgb2YgaXQgd2lsbCBoYXZlIGJlZW4gY2FuY2VsbGVkKS4KKyAqCisgKiBXZSBuZWVkIHRvIHNldCBhIGZsYWcgKHVzYl9kZXYtPnJlc2V0X3J1bm5pbmcpIGJlY2F1c2Ugd2hlbiB3ZSBjYWxsCisgKiB0aGUgcmVzZXQsIHRoZSBpbnRlcmZhY2VzIG1pZ2h0IGJlIHVuYm91bmQuIFRoZSBjdXJyZW50IGludGVyZmFjZQorICogY2Fubm90IHRyeSB0byByZW1vdmUgdGhlIHF1ZXVlZCB3b3JrIGFzIGl0IHdvdWxkIGNhdXNlIGEgZGVhZGxvY2sKKyAqICh5b3UgY2Fubm90IHJlbW92ZSB5b3VyIHdvcmsgZnJvbSB3aXRoaW4geW91ciBleGVjdXRpbmcKKyAqIHdvcmtxdWV1ZSkuIFRoaXMgZmxhZyBsZXRzIGl0IGtub3csIHNvIHRoYXQKKyAqIHVzYl9jYW5jZWxfcXVldWVkX3Jlc2V0KCkgZG9lc24ndCB0cnkgdG8gZG8gaXQuCisgKgorICogU2VlIHVzYl9xdWV1ZV9yZXNldF9kZXZpY2UoKSBmb3IgbW9yZSBkZXRhaWxzCisgKi8KK3ZvaWQgX191c2JfcXVldWVfcmVzZXRfZGV2aWNlKHN0cnVjdCB3b3JrX3N0cnVjdCAqd3MpCit7CisJaW50IHJjOworCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppZmFjZSA9CisJCWNvbnRhaW5lcl9vZih3cywgc3RydWN0IHVzYl9pbnRlcmZhY2UsIHJlc2V0X3dzKTsKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiA9IGludGVyZmFjZV90b191c2JkZXYoaWZhY2UpOworCisJcmMgPSB1c2JfbG9ja19kZXZpY2VfZm9yX3Jlc2V0KHVkZXYsIGlmYWNlKTsKKwlpZiAocmMgPj0gMCkgeworCQlpZmFjZS0+cmVzZXRfcnVubmluZyA9IDE7CisJCXVzYl9yZXNldF9kZXZpY2UodWRldik7CisJCWlmYWNlLT5yZXNldF9ydW5uaW5nID0gMDsKKwkJdXNiX3VubG9ja19kZXZpY2UodWRldik7CisJfQorfQorCisKIC8qCiAgKiB1c2Jfc2V0X2NvbmZpZ3VyYXRpb24gLSBNYWtlcyBhIHBhcnRpY3VsYXIgZGV2aWNlIHNldHRpbmcgYmUgY3VycmVudAogICogQGRldjogdGhlIGRldmljZSB3aG9zZSBjb25maWd1cmF0aW9uIGlzIGJlaW5nIHVwZGF0ZWQKQEAgLTE1NjAsNiArMTY0Myw5IEBACiAJaWYgKGRldi0+c3RhdGUgIT0gVVNCX1NUQVRFX0FERFJFU1MpCiAJCXVzYl9kaXNhYmxlX2RldmljZShkZXYsIDEpOwkvKiBTa2lwIGVwMCAqLwogCisJLyogR2V0IHJpZCBvZiBwZW5kaW5nIGFzeW5jIFNldC1Db25maWcgcmVxdWVzdHMgZm9yIHRoaXMgZGV2aWNlICovCisJY2FuY2VsX2FzeW5jX3NldF9jb25maWcoZGV2KTsKKwogCXJldCA9IHVzYl9jb250cm9sX21zZyhkZXYsIHVzYl9zbmRjdHJscGlwZShkZXYsIDApLAogCQkJICAgICAgVVNCX1JFUV9TRVRfQ09ORklHVVJBVElPTiwgMCwgY29uZmlndXJhdGlvbiwgMCwKIAkJCSAgICAgIE5VTEwsIDAsIFVTQl9DVFJMX1NFVF9USU1FT1VUKTsKQEAgLTE2MDQsMTMgKzE2OTAsMTQgQEAKIAkJCWFsdCA9ICZpbnRmLT5hbHRzZXR0aW5nWzBdOwogCiAJCWludGYtPmN1cl9hbHRzZXR0aW5nID0gYWx0OwotCQl1c2JfZW5hYmxlX2ludGVyZmFjZShkZXYsIGludGYpOworCQl1c2JfZW5hYmxlX2ludGVyZmFjZShkZXYsIGludGYsIHRydWUpOwogCQlpbnRmLT5kZXYucGFyZW50ID0gJmRldi0+ZGV2OwogCQlpbnRmLT5kZXYuZHJpdmVyID0gTlVMTDsKIAkJaW50Zi0+ZGV2LmJ1cyA9ICZ1c2JfYnVzX3R5cGU7CiAJCWludGYtPmRldi50eXBlID0gJnVzYl9pZl9kZXZpY2VfdHlwZTsKIAkJaW50Zi0+ZGV2Lmdyb3VwcyA9IHVzYl9pbnRlcmZhY2VfZ3JvdXBzOwogCQlpbnRmLT5kZXYuZG1hX21hc2sgPSBkZXYtPmRldi5kbWFfbWFzazsKKwkJSU5JVF9XT1JLKCZpbnRmLT5yZXNldF93cywgX191c2JfcXVldWVfcmVzZXRfZGV2aWNlKTsKIAkJZGV2aWNlX2luaXRpYWxpemUoJmludGYtPmRldik7CiAJCW1hcmtfcXVpZXNjZWQoaW50Zik7CiAJCWRldl9zZXRfbmFtZSgmaW50Zi0+ZGV2LCAiJWQtJXM6JWQuJWQiLApAQCAtMTY0MSwxNyArMTcyOCwyMSBAQAogCQkJCWRldl9uYW1lKCZpbnRmLT5kZXYpLCByZXQpOwogCQkJY29udGludWU7CiAJCX0KLQkJdXNiX2NyZWF0ZV9zeXNmc19pbnRmX2ZpbGVzKGludGYpOworCQljcmVhdGVfaW50Zl9lcF9kZXZzKGludGYpOwogCX0KIAogCXVzYl9hdXRvc3VzcGVuZF9kZXZpY2UoZGV2KTsKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIExJU1RfSEVBRChzZXRfY29uZmlnX2xpc3QpOworc3RhdGljIERFRklORV9TUElOTE9DSyhzZXRfY29uZmlnX2xvY2spOworCiBzdHJ1Y3Qgc2V0X2NvbmZpZ19yZXF1ZXN0IHsKIAlzdHJ1Y3QgdXNiX2RldmljZQkqdWRldjsKIAlpbnQJCQljb25maWc7CiAJc3RydWN0IHdvcmtfc3RydWN0CXdvcms7CisJc3RydWN0IGxpc3RfaGVhZAlub2RlOwogfTsKIAogLyogV29ya2VyIHJvdXRpbmUgZm9yIHVzYl9kcml2ZXJfc2V0X2NvbmZpZ3VyYXRpb24oKSAqLwpAQCAtMTY1OSwxNCArMTc1MCwzNSBAQAogewogCXN0cnVjdCBzZXRfY29uZmlnX3JlcXVlc3QgKnJlcSA9CiAJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3Qgc2V0X2NvbmZpZ19yZXF1ZXN0LCB3b3JrKTsKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiA9IHJlcS0+dWRldjsKIAotCXVzYl9sb2NrX2RldmljZShyZXEtPnVkZXYpOwotCXVzYl9zZXRfY29uZmlndXJhdGlvbihyZXEtPnVkZXYsIHJlcS0+Y29uZmlnKTsKLQl1c2JfdW5sb2NrX2RldmljZShyZXEtPnVkZXYpOwotCXVzYl9wdXRfZGV2KHJlcS0+dWRldik7CisJdXNiX2xvY2tfZGV2aWNlKHVkZXYpOworCXNwaW5fbG9jaygmc2V0X2NvbmZpZ19sb2NrKTsKKwlsaXN0X2RlbCgmcmVxLT5ub2RlKTsKKwlzcGluX3VubG9jaygmc2V0X2NvbmZpZ19sb2NrKTsKKworCWlmIChyZXEtPmNvbmZpZyA+PSAtMSkJCS8qIElzIHJlcSBzdGlsbCB2YWxpZD8gKi8KKwkJdXNiX3NldF9jb25maWd1cmF0aW9uKHVkZXYsIHJlcS0+Y29uZmlnKTsKKwl1c2JfdW5sb2NrX2RldmljZSh1ZGV2KTsKKwl1c2JfcHV0X2Rldih1ZGV2KTsKIAlrZnJlZShyZXEpOwogfQogCisvKiBDYW5jZWwgcGVuZGluZyBTZXQtQ29uZmlnIHJlcXVlc3RzIGZvciBhIGRldmljZSB3aG9zZSBjb25maWd1cmF0aW9uCisgKiB3YXMganVzdCBjaGFuZ2VkCisgKi8KK3N0YXRpYyB2b2lkIGNhbmNlbF9hc3luY19zZXRfY29uZmlnKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2KQoreworCXN0cnVjdCBzZXRfY29uZmlnX3JlcXVlc3QgKnJlcTsKKworCXNwaW5fbG9jaygmc2V0X2NvbmZpZ19sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJlcSwgJnNldF9jb25maWdfbGlzdCwgbm9kZSkgeworCQlpZiAocmVxLT51ZGV2ID09IHVkZXYpCisJCQlyZXEtPmNvbmZpZyA9IC05OTk7CS8qIE1hcmsgYXMgY2FuY2VsbGVkICovCisJfQorCXNwaW5fdW5sb2NrKCZzZXRfY29uZmlnX2xvY2spOworfQorCiAvKioKICAqIHVzYl9kcml2ZXJfc2V0X2NvbmZpZ3VyYXRpb24gLSBQcm92aWRlIGEgd2F5IGZvciBkcml2ZXJzIHRvIGNoYW5nZSBkZXZpY2UgY29uZmlndXJhdGlvbnMKICAqIEB1ZGV2OiB0aGUgZGV2aWNlIHdob3NlIGNvbmZpZ3VyYXRpb24gaXMgYmVpbmcgdXBkYXRlZApAQCAtMTY5OCw2ICsxODEwLDEwIEBACiAJcmVxLT5jb25maWcgPSBjb25maWc7CiAJSU5JVF9XT1JLKCZyZXEtPndvcmssIGRyaXZlcl9zZXRfY29uZmlnX3dvcmspOwogCisJc3Bpbl9sb2NrKCZzZXRfY29uZmlnX2xvY2spOworCWxpc3RfYWRkKCZyZXEtPm5vZGUsICZzZXRfY29uZmlnX2xpc3QpOworCXNwaW5fdW5sb2NrKCZzZXRfY29uZmlnX2xvY2spOworCiAJdXNiX2dldF9kZXYodWRldik7CiAJc2NoZWR1bGVfd29yaygmcmVxLT53b3JrKTsKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NvcmUvc3lzZnMuYyBiL2RyaXZlcnMvdXNiL2NvcmUvc3lzZnMuYwppbmRleCA0ZmI2NWZkLi40Y2MyNDU2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jb3JlL3N5c2ZzLmMKKysrIGIvZHJpdmVycy91c2IvY29yZS9zeXNmcy5jCkBAIC0zNTksMTkgKzM1OSwxOSBAQAogCQkJc3RybmNtcChidWYsIG9uX3N0cmluZywgbGVuKSA9PSAwKSB7CiAJCXVkZXYtPmF1dG9zdXNwZW5kX2Rpc2FibGVkID0gMTsKIAkJdWRldi0+YXV0b3Jlc3VtZV9kaXNhYmxlZCA9IDA7Ci0JCXJjID0gdXNiX2V4dGVybmFsX3Jlc3VtZV9kZXZpY2UodWRldik7CisJCXJjID0gdXNiX2V4dGVybmFsX3Jlc3VtZV9kZXZpY2UodWRldiwgUE1TR19VU0VSX1JFU1VNRSk7CiAKIAl9IGVsc2UgaWYgKGxlbiA9PSBzaXplb2YgYXV0b19zdHJpbmcgLSAxICYmCiAJCQlzdHJuY21wKGJ1ZiwgYXV0b19zdHJpbmcsIGxlbikgPT0gMCkgewogCQl1ZGV2LT5hdXRvc3VzcGVuZF9kaXNhYmxlZCA9IDA7CiAJCXVkZXYtPmF1dG9yZXN1bWVfZGlzYWJsZWQgPSAwOwotCQlyYyA9IHVzYl9leHRlcm5hbF9yZXN1bWVfZGV2aWNlKHVkZXYpOworCQlyYyA9IHVzYl9leHRlcm5hbF9yZXN1bWVfZGV2aWNlKHVkZXYsIFBNU0dfVVNFUl9SRVNVTUUpOwogCiAJfSBlbHNlIGlmIChsZW4gPT0gc2l6ZW9mIHN1c3BlbmRfc3RyaW5nIC0gMSAmJgogCQkJc3RybmNtcChidWYsIHN1c3BlbmRfc3RyaW5nLCBsZW4pID09IDApIHsKIAkJdWRldi0+YXV0b3N1c3BlbmRfZGlzYWJsZWQgPSAwOwogCQl1ZGV2LT5hdXRvcmVzdW1lX2Rpc2FibGVkID0gMTsKLQkJcmMgPSB1c2JfZXh0ZXJuYWxfc3VzcGVuZF9kZXZpY2UodWRldiwgUE1TR19TVVNQRU5EKTsKKwkJcmMgPSB1c2JfZXh0ZXJuYWxfc3VzcGVuZF9kZXZpY2UodWRldiwgUE1TR19VU0VSX1NVU1BFTkQpOwogCiAJfSBlbHNlCiAJCXJjID0gLUVJTlZBTDsKQEAgLTYyOSw5ICs2MjksNiBAQAogCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZ1ZGV2LT5kZXY7CiAJaW50IHJldHZhbDsKIAotCS8qIFVuZm9ydW5hdGVseSB0aGVzZSBhdHRyaWJ1dGVzIGNhbm5vdCBiZSBjcmVhdGVkIGJlZm9yZQotCSAqIHRoZSB1ZXZlbnQgaXMgYnJvYWRjYXN0LgotCSAqLwogCXJldHZhbCA9IGRldmljZV9jcmVhdGVfYmluX2ZpbGUoZGV2LCAmZGV2X2Jpbl9hdHRyX2Rlc2NyaXB0b3JzKTsKIAlpZiAocmV0dmFsKQogCQlnb3RvIGVycm9yOwpAQCAtNjQzLDExICs2NDAsNyBAQAogCXJldHZhbCA9IGFkZF9wb3dlcl9hdHRyaWJ1dGVzKGRldik7CiAJaWYgKHJldHZhbCkKIAkJZ290byBlcnJvcjsKLQotCXJldHZhbCA9IHVzYl9jcmVhdGVfZXBfZmlsZXMoZGV2LCAmdWRldi0+ZXAwLCB1ZGV2KTsKLQlpZiAocmV0dmFsKQotCQlnb3RvIGVycm9yOwotCXJldHVybiAwOworCXJldHVybiByZXR2YWw7CiBlcnJvcjoKIAl1c2JfcmVtb3ZlX3N5c2ZzX2Rldl9maWxlcyh1ZGV2KTsKIAlyZXR1cm4gcmV0dmFsOwpAQCAtNjU3LDcgKzY1MCw2IEBACiB7CiAJc3RydWN0IGRldmljZSAqZGV2ID0gJnVkZXYtPmRldjsKIAotCXVzYl9yZW1vdmVfZXBfZmlsZXMoJnVkZXYtPmVwMCk7CiAJcmVtb3ZlX3Bvd2VyX2F0dHJpYnV0ZXMoZGV2KTsKIAlyZW1vdmVfcGVyc2lzdF9hdHRyaWJ1dGVzKGRldik7CiAJZGV2aWNlX3JlbW92ZV9iaW5fZmlsZShkZXYsICZkZXZfYmluX2F0dHJfZGVzY3JpcHRvcnMpOwpAQCAtODEyLDI4ICs4MDQsNiBAQAogCU5VTEwKIH07CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCB1c2JfY3JlYXRlX2ludGZfZXBfZmlsZXMoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsCi0JCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2KQotewotCXN0cnVjdCB1c2JfaG9zdF9pbnRlcmZhY2UgKmlmYWNlX2Rlc2M7Ci0JaW50IGk7Ci0KLQlpZmFjZV9kZXNjID0gaW50Zi0+Y3VyX2FsdHNldHRpbmc7Ci0JZm9yIChpID0gMDsgaSA8IGlmYWNlX2Rlc2MtPmRlc2MuYk51bUVuZHBvaW50czsgKytpKQotCQl1c2JfY3JlYXRlX2VwX2ZpbGVzKCZpbnRmLT5kZXYsICZpZmFjZV9kZXNjLT5lbmRwb2ludFtpXSwKLQkJCQl1ZGV2KTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHVzYl9yZW1vdmVfaW50Zl9lcF9maWxlcyhzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKLXsKLQlzdHJ1Y3QgdXNiX2hvc3RfaW50ZXJmYWNlICppZmFjZV9kZXNjOwotCWludCBpOwotCi0JaWZhY2VfZGVzYyA9IGludGYtPmN1cl9hbHRzZXR0aW5nOwotCWZvciAoaSA9IDA7IGkgPCBpZmFjZV9kZXNjLT5kZXNjLmJOdW1FbmRwb2ludHM7ICsraSkKLQkJdXNiX3JlbW92ZV9lcF9maWxlcygmaWZhY2VfZGVzYy0+ZW5kcG9pbnRbaV0pOwotfQotCiBpbnQgdXNiX2NyZWF0ZV9zeXNmc19pbnRmX2ZpbGVzKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQogewogCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2ID0gaW50ZXJmYWNlX3RvX3VzYmRldihpbnRmKTsKQEAgLTg0MywyNiArODEzLDE5IEBACiAJaWYgKGludGYtPnN5c2ZzX2ZpbGVzX2NyZWF0ZWQgfHwgaW50Zi0+dW5yZWdpc3RlcmluZykKIAkJcmV0dXJuIDA7CiAKLQkvKiBUaGUgaW50ZXJmYWNlIHN0cmluZyBtYXkgYmUgcHJlc2VudCBpbiBzb21lIGFsdHNldHRpbmdzCi0JICogYW5kIG1pc3NpbmcgaW4gb3RoZXJzLiAgSGVuY2UgaXRzIGF0dHJpYnV0ZSBjYW5ub3QgYmUgY3JlYXRlZAotCSAqIGJlZm9yZSB0aGUgdWV2ZW50IGlzIGJyb2FkY2FzdC4KLQkgKi8KIAlpZiAoYWx0LT5zdHJpbmcgPT0gTlVMTCkKIAkJYWx0LT5zdHJpbmcgPSB1c2JfY2FjaGVfc3RyaW5nKHVkZXYsIGFsdC0+ZGVzYy5pSW50ZXJmYWNlKTsKIAlpZiAoYWx0LT5zdHJpbmcpCiAJCXJldHZhbCA9IGRldmljZV9jcmVhdGVfZmlsZSgmaW50Zi0+ZGV2LCAmZGV2X2F0dHJfaW50ZXJmYWNlKTsKLQl1c2JfY3JlYXRlX2ludGZfZXBfZmlsZXMoaW50ZiwgdWRldik7CiAJaW50Zi0+c3lzZnNfZmlsZXNfY3JlYXRlZCA9IDE7CiAJcmV0dXJuIDA7CiB9CiAKIHZvaWQgdXNiX3JlbW92ZV9zeXNmc19pbnRmX2ZpbGVzKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQogewotCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZpbnRmLT5kZXY7Ci0KIAlpZiAoIWludGYtPnN5c2ZzX2ZpbGVzX2NyZWF0ZWQpCiAJCXJldHVybjsKLQl1c2JfcmVtb3ZlX2ludGZfZXBfZmlsZXMoaW50Zik7Ci0JZGV2aWNlX3JlbW92ZV9maWxlKGRldiwgJmRldl9hdHRyX2ludGVyZmFjZSk7CisKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoJmludGYtPmRldiwgJmRldl9hdHRyX2ludGVyZmFjZSk7CiAJaW50Zi0+c3lzZnNfZmlsZXNfY3JlYXRlZCA9IDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jb3JlL3VyYi5jIGIvZHJpdmVycy91c2IvY29yZS91cmIuYwppbmRleCAxZjY4YWY5Li41OGJjNWUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jb3JlL3VyYi5jCisrKyBiL2RyaXZlcnMvdXNiL2NvcmUvdXJiLmMKQEAgLTEwLDcgKzEwLDYgQEAKIAogI2RlZmluZSB0b191cmIoZCkgY29udGFpbmVyX29mKGQsIHN0cnVjdCB1cmIsIGtyZWYpCiAKLXN0YXRpYyBERUZJTkVfU1BJTkxPQ0sodXNiX3JlamVjdF9sb2NrKTsKIAogc3RhdGljIHZvaWQgdXJiX2Rlc3Ryb3koc3RydWN0IGtyZWYgKmtyZWYpCiB7CkBAIC0xMzEsOSArMTMwLDcgQEAKIAl1cmItPmFuY2hvciA9IGFuY2hvcjsKIAogCWlmICh1bmxpa2VseShhbmNob3ItPnBvaXNvbmVkKSkgewotCQlzcGluX2xvY2soJnVzYl9yZWplY3RfbG9jayk7Ci0JCXVyYi0+cmVqZWN0Kys7Ci0JCXNwaW5fdW5sb2NrKCZ1c2JfcmVqZWN0X2xvY2spOworCQlhdG9taWNfaW5jKCZ1cmItPnJlamVjdCk7CiAJfQogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYW5jaG9yLT5sb2NrLCBmbGFncyk7CkBAIC01NjUsMTYgKzU2MiwxMiBAQAogCW1pZ2h0X3NsZWVwKCk7CiAJaWYgKCEodXJiICYmIHVyYi0+ZGV2ICYmIHVyYi0+ZXApKQogCQlyZXR1cm47Ci0Jc3Bpbl9sb2NrX2lycSgmdXNiX3JlamVjdF9sb2NrKTsKLQkrK3VyYi0+cmVqZWN0OwotCXNwaW5fdW5sb2NrX2lycSgmdXNiX3JlamVjdF9sb2NrKTsKKwlhdG9taWNfaW5jKCZ1cmItPnJlamVjdCk7CiAKIAl1c2JfaGNkX3VubGlua191cmIodXJiLCAtRU5PRU5UKTsKIAl3YWl0X2V2ZW50KHVzYl9raWxsX3VyYl9xdWV1ZSwgYXRvbWljX3JlYWQoJnVyYi0+dXNlX2NvdW50KSA9PSAwKTsKIAotCXNwaW5fbG9ja19pcnEoJnVzYl9yZWplY3RfbG9jayk7Ci0JLS11cmItPnJlamVjdDsKLQlzcGluX3VubG9ja19pcnEoJnVzYl9yZWplY3RfbG9jayk7CisJYXRvbWljX2RlYygmdXJiLT5yZWplY3QpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwodXNiX2tpbGxfdXJiKTsKIApAQCAtNjA2LDkgKzU5OSw3IEBACiAJbWlnaHRfc2xlZXAoKTsKIAlpZiAoISh1cmIgJiYgdXJiLT5kZXYgJiYgdXJiLT5lcCkpCiAJCXJldHVybjsKLQlzcGluX2xvY2tfaXJxKCZ1c2JfcmVqZWN0X2xvY2spOwotCSsrdXJiLT5yZWplY3Q7Ci0Jc3Bpbl91bmxvY2tfaXJxKCZ1c2JfcmVqZWN0X2xvY2spOworCWF0b21pY19pbmMoJnVyYi0+cmVqZWN0KTsKIAogCXVzYl9oY2RfdW5saW5rX3VyYih1cmIsIC1FTk9FTlQpOwogCXdhaXRfZXZlbnQodXNiX2tpbGxfdXJiX3F1ZXVlLCBhdG9taWNfcmVhZCgmdXJiLT51c2VfY291bnQpID09IDApOwpAQCAtNjE3LDE0ICs2MDgsMTAgQEAKIAogdm9pZCB1c2JfdW5wb2lzb25fdXJiKHN0cnVjdCB1cmIgKnVyYikKIHsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCiAJaWYgKCF1cmIpCiAJCXJldHVybjsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZ1c2JfcmVqZWN0X2xvY2ssIGZsYWdzKTsKLQktLXVyYi0+cmVqZWN0OwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnVzYl9yZWplY3RfbG9jaywgZmxhZ3MpOworCWF0b21pY19kZWMoJnVyYi0+cmVqZWN0KTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHVzYl91bnBvaXNvbl91cmIpOwogCkBAIC02OTIsNiArNjc5LDI2IEBACiBFWFBPUlRfU1lNQk9MX0dQTCh1c2JfcG9pc29uX2FuY2hvcmVkX3VyYnMpOwogCiAvKioKKyAqIHVzYl91bnBvaXNvbl9hbmNob3JlZF91cmJzIC0gbGV0IGFuIGFuY2hvciBiZSB1c2VkIHN1Y2Nlc3NmdWxseSBhZ2FpbgorICogQGFuY2hvcjogYW5jaG9yIHRoZSByZXF1ZXN0cyBhcmUgYm91bmQgdG8KKyAqCisgKiBSZXZlcnNlcyB0aGUgZWZmZWN0IG9mIHVzYl9wb2lzb25fYW5jaG9yZWRfdXJicworICogdGhlIGFuY2hvciBjYW4gYmUgdXNlZCBub3JtYWxseSBhZnRlciBpdCByZXR1cm5zCisgKi8KK3ZvaWQgdXNiX3VucG9pc29uX2FuY2hvcmVkX3VyYnMoc3RydWN0IHVzYl9hbmNob3IgKmFuY2hvcikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCB1cmIgKmxhemFydXM7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYW5jaG9yLT5sb2NrLCBmbGFncyk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShsYXphcnVzLCAmYW5jaG9yLT51cmJfbGlzdCwgYW5jaG9yX2xpc3QpIHsKKwkJdXNiX3VucG9pc29uX3VyYihsYXphcnVzKTsKKwl9CisJYW5jaG9yLT5wb2lzb25lZCA9IDA7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYW5jaG9yLT5sb2NrLCBmbGFncyk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh1c2JfdW5wb2lzb25fYW5jaG9yZWRfdXJicyk7CisvKioKICAqIHVzYl91bmxpbmtfYW5jaG9yZWRfdXJicyAtIGFzeW5jaHJvbm91c2x5IGNhbmNlbCB0cmFuc2ZlciByZXF1ZXN0cyBlbiBtYXNzZQogICogQGFuY2hvcjogYW5jaG9yIHRoZSByZXF1ZXN0cyBhcmUgYm91bmQgdG8KICAqCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jb3JlL3VzYi5jIGIvZHJpdmVycy91c2IvY29yZS91c2IuYwppbmRleCAzOTllMTVmLi5kY2ZjMDcyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jb3JlL3VzYi5jCisrKyBiL2RyaXZlcnMvdXNiL2NvcmUvdXNiLmMKQEAgLTI1Myw3ICsyNTMsNyBAQAogc3RhdGljIHZvaWQgdXNiX2Rldl9jb21wbGV0ZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJLyogQ3VycmVudGx5IHVzZWQgb25seSBmb3IgcmViaW5kaW5nIGludGVyZmFjZXMgKi8KLQl1c2JfcmVzdW1lKGRldik7CS8qIEltcGxlbWVudCBldmVudHVhbGx5PyAqLworCXVzYl9yZXN1bWUoZGV2LCBQTVNHX1JFU1VNRSk7CS8qIE1lc3NhZ2UgZXZlbnQgaXMgbWVhbmluZ2xlc3MgKi8KIH0KIAogc3RhdGljIGludCB1c2JfZGV2X3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQpAQCAtMjYzLDcgKzI2Myw3IEBACiAKIHN0YXRpYyBpbnQgdXNiX2Rldl9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQogewotCXJldHVybiB1c2JfcmVzdW1lKGRldik7CisJcmV0dXJuIHVzYl9yZXN1bWUoZGV2LCBQTVNHX1JFU1VNRSk7CiB9CiAKIHN0YXRpYyBpbnQgdXNiX2Rldl9mcmVlemUoc3RydWN0IGRldmljZSAqZGV2KQpAQCAtMjczLDcgKzI3Myw3IEBACiAKIHN0YXRpYyBpbnQgdXNiX2Rldl90aGF3KHN0cnVjdCBkZXZpY2UgKmRldikKIHsKLQlyZXR1cm4gdXNiX3Jlc3VtZShkZXYpOworCXJldHVybiB1c2JfcmVzdW1lKGRldiwgUE1TR19USEFXKTsKIH0KIAogc3RhdGljIGludCB1c2JfZGV2X3Bvd2Vyb2ZmKHN0cnVjdCBkZXZpY2UgKmRldikKQEAgLTI4Myw3ICsyODMsNyBAQAogCiBzdGF0aWMgaW50IHVzYl9kZXZfcmVzdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7Ci0JcmV0dXJuIHVzYl9yZXN1bWUoZGV2KTsKKwlyZXR1cm4gdXNiX3Jlc3VtZShkZXYsIFBNU0dfUkVTVE9SRSk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgZGV2X3BtX29wcyB1c2JfZGV2aWNlX3BtX29wcyA9IHsKQEAgLTM2Miw3ICszNjIsNyBAQAogCWRldi0+ZXAwLmRlc2MuYkxlbmd0aCA9IFVTQl9EVF9FTkRQT0lOVF9TSVpFOwogCWRldi0+ZXAwLmRlc2MuYkRlc2NyaXB0b3JUeXBlID0gVVNCX0RUX0VORFBPSU5UOwogCS8qIGVwMCBtYXhwYWNrZXQgY29tZXMgbGF0ZXIsIGZyb20gZGV2aWNlIGRlc2NyaXB0b3IgKi8KLQl1c2JfZW5hYmxlX2VuZHBvaW50KGRldiwgJmRldi0+ZXAwKTsKKwl1c2JfZW5hYmxlX2VuZHBvaW50KGRldiwgJmRldi0+ZXAwLCB0cnVlKTsKIAlkZXYtPmNhbl9zdWJtaXQgPSAxOwogCiAJLyogU2F2ZSByZWFkYWJsZSBhbmQgc3RhYmxlIHRvcG9sb2d5IGlkLCBkaXN0aW5ndWlzaGluZyBkZXZpY2VzCkBAIC00MDIsNiArNDAyLDcgQEAKICNpZmRlZglDT05GSUdfUE0KIAltdXRleF9pbml0KCZkZXYtPnBtX211dGV4KTsKIAlJTklUX0RFTEFZRURfV09SSygmZGV2LT5hdXRvc3VzcGVuZCwgdXNiX2F1dG9zdXNwZW5kX3dvcmspOworCUlOSVRfV09SSygmZGV2LT5hdXRvcmVzdW1lLCB1c2JfYXV0b3Jlc3VtZV93b3JrKTsKIAlkZXYtPmF1dG9zdXNwZW5kX2RlbGF5ID0gdXNiX2F1dG9zdXNwZW5kX2RlbGF5ICogSFo7CiAJZGV2LT5jb25uZWN0X3RpbWUgPSBqaWZmaWVzOwogCWRldi0+YWN0aXZlX2R1cmF0aW9uID0gLWppZmZpZXM7CkBAIC01MTMsMTAgKzUxNCw3IEBACiAgKiBkaXNjb25uZWN0OyBpbiBzb21lIGRyaXZlcnMgKHN1Y2ggYXMgdXNiLXN0b3JhZ2UpIHRoZSBkaXNjb25uZWN0KCkKICAqIG9yIHN1c3BlbmQoKSBtZXRob2Qgd2lsbCBibG9jayB3YWl0aW5nIGZvciBhIGRldmljZSByZXNldCB0byBjb21wbGV0ZS4KICAqCi0gKiBSZXR1cm5zIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBmb3IgZmFpbHVyZSwgb3RoZXJ3aXNlIDEgb3IgMCB0byBpbmRpY2F0ZQotICogdGhhdCB0aGUgZGV2aWNlIHdpbGwgb3Igd2lsbCBub3QgaGF2ZSB0byBiZSB1bmxvY2tlZC4gICgwIGNhbiBiZQotICogcmV0dXJuZWQgd2hlbiBhbiBpbnRlcmZhY2UgaXMgZ2l2ZW4gYW5kIGlzIEJJTkRJTkcsIGJlY2F1c2UgaW4gdGhhdAotICogY2FzZSB0aGUgZHJpdmVyIGFscmVhZHkgb3ducyB0aGUgZGV2aWNlIGxvY2suKQorICogUmV0dXJucyBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgZm9yIGZhaWx1cmUsIG90aGVyd2lzZSAwLgogICovCiBpbnQgdXNiX2xvY2tfZGV2aWNlX2Zvcl9yZXNldChzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiwKIAkJCSAgICAgIGNvbnN0IHN0cnVjdCB1c2JfaW50ZXJmYWNlICppZmFjZSkKQEAgLTUyNywxNiArNTI1LDkgQEAKIAkJcmV0dXJuIC1FTk9ERVY7CiAJaWYgKHVkZXYtPnN0YXRlID09IFVTQl9TVEFURV9TVVNQRU5ERUQpCiAJCXJldHVybiAtRUhPU1RVTlJFQUNIOwotCWlmIChpZmFjZSkgewotCQlzd2l0Y2ggKGlmYWNlLT5jb25kaXRpb24pIHsKLQkJY2FzZSBVU0JfSU5URVJGQUNFX0JJTkRJTkc6Ci0JCQlyZXR1cm4gMDsKLQkJY2FzZSBVU0JfSU5URVJGQUNFX0JPVU5EOgotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlyZXR1cm4gLUVJTlRSOwotCQl9Ci0JfQorCWlmIChpZmFjZSAmJiAoaWZhY2UtPmNvbmRpdGlvbiA9PSBVU0JfSU5URVJGQUNFX1VOQklORElORyB8fAorCQkJaWZhY2UtPmNvbmRpdGlvbiA9PSBVU0JfSU5URVJGQUNFX1VOQk9VTkQpKQorCQlyZXR1cm4gLUVJTlRSOwogCiAJd2hpbGUgKHVzYl90cnlsb2NrX2RldmljZSh1ZGV2KSAhPSAwKSB7CiAKQEAgLTU1MCwxMCArNTQxLDExIEBACiAJCQlyZXR1cm4gLUVOT0RFVjsKIAkJaWYgKHVkZXYtPnN0YXRlID09IFVTQl9TVEFURV9TVVNQRU5ERUQpCiAJCQlyZXR1cm4gLUVIT1NUVU5SRUFDSDsKLQkJaWYgKGlmYWNlICYmIGlmYWNlLT5jb25kaXRpb24gIT0gVVNCX0lOVEVSRkFDRV9CT1VORCkKKwkJaWYgKGlmYWNlICYmIChpZmFjZS0+Y29uZGl0aW9uID09IFVTQl9JTlRFUkZBQ0VfVU5CSU5ESU5HIHx8CisJCQkJaWZhY2UtPmNvbmRpdGlvbiA9PSBVU0JfSU5URVJGQUNFX1VOQk9VTkQpKQogCQkJcmV0dXJuIC1FSU5UUjsKIAl9Ci0JcmV0dXJuIDE7CisJcmV0dXJuIDA7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTCh1c2JfbG9ja19kZXZpY2VfZm9yX3Jlc2V0KTsKIApAQCAtOTYyLDggKzk1NCwxMiBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwodXNiX2J1ZmZlcl91bm1hcF9zZyk7CiAKLS8qIGZvcm1hdCB0byBkaXNhYmxlIFVTQiBvbiBrZXJuZWwgY29tbWFuZCBsaW5lIGlzOiBub3VzYiAqLwotX19tb2R1bGVfcGFyYW1fY2FsbCgiIiwgbm91c2IsIHBhcmFtX3NldF9ib29sLCBwYXJhbV9nZXRfYm9vbCwgJm5vdXNiLCAwNDQ0KTsKKy8qIFRvIGRpc2FibGUgVVNCLCBrZXJuZWwgY29tbWFuZCBsaW5lIGlzICdub3VzYicgbm90ICd1c2Jjb3JlLm5vdXNiJyAqLworI2lmZGVmIE1PRFVMRQorbW9kdWxlX3BhcmFtKG5vdXNiLCBib29sLCAwNDQ0KTsKKyNlbHNlCitjb3JlX3BhcmFtKG5vdXNiLCBub3VzYiwgYm9vbCwgMDQ0NCk7CisjZW5kaWYKIAogLyoKICAqIGZvciBleHRlcm5hbCByZWFkIGFjY2VzcyB0byA8bm91c2I+CkBAIC05NzUsNiArOTcxLDM3IEBACiBFWFBPUlRfU1lNQk9MX0dQTCh1c2JfZGlzYWJsZWQpOwogCiAvKgorICogTm90aWZpY2F0aW9ucyBvZiBkZXZpY2UgYW5kIGludGVyZmFjZSByZWdpc3RyYXRpb24KKyAqLworc3RhdGljIGludCB1c2JfYnVzX25vdGlmeShzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iLCB1bnNpZ25lZCBsb25nIGFjdGlvbiwKKwkJdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBkYXRhOworCisJc3dpdGNoIChhY3Rpb24pIHsKKwljYXNlIEJVU19OT1RJRllfQUREX0RFVklDRToKKwkJaWYgKGRldi0+dHlwZSA9PSAmdXNiX2RldmljZV90eXBlKQorCQkJKHZvaWQpIHVzYl9jcmVhdGVfc3lzZnNfZGV2X2ZpbGVzKHRvX3VzYl9kZXZpY2UoZGV2KSk7CisJCWVsc2UgaWYgKGRldi0+dHlwZSA9PSAmdXNiX2lmX2RldmljZV90eXBlKQorCQkJKHZvaWQpIHVzYl9jcmVhdGVfc3lzZnNfaW50Zl9maWxlcygKKwkJCQkJdG9fdXNiX2ludGVyZmFjZShkZXYpKTsKKwkJYnJlYWs7CisKKwljYXNlIEJVU19OT1RJRllfREVMX0RFVklDRToKKwkJaWYgKGRldi0+dHlwZSA9PSAmdXNiX2RldmljZV90eXBlKQorCQkJdXNiX3JlbW92ZV9zeXNmc19kZXZfZmlsZXModG9fdXNiX2RldmljZShkZXYpKTsKKwkJZWxzZSBpZiAoZGV2LT50eXBlID09ICZ1c2JfaWZfZGV2aWNlX3R5cGUpCisJCQl1c2JfcmVtb3ZlX3N5c2ZzX2ludGZfZmlsZXModG9fdXNiX2ludGVyZmFjZShkZXYpKTsKKwkJYnJlYWs7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIHVzYl9idXNfbmIgPSB7CisJLm5vdGlmaWVyX2NhbGwgPSB1c2JfYnVzX25vdGlmeSwKK307CisKKy8qCiAgKiBJbml0CiAgKi8KIHN0YXRpYyBpbnQgX19pbml0IHVzYl9pbml0KHZvaWQpCkBAIC05OTEsNiArMTAxOCw5IEBACiAJcmV0dmFsID0gYnVzX3JlZ2lzdGVyKCZ1c2JfYnVzX3R5cGUpOwogCWlmIChyZXR2YWwpCiAJCWdvdG8gYnVzX3JlZ2lzdGVyX2ZhaWxlZDsKKwlyZXR2YWwgPSBidXNfcmVnaXN0ZXJfbm90aWZpZXIoJnVzYl9idXNfdHlwZSwgJnVzYl9idXNfbmIpOworCWlmIChyZXR2YWwpCisJCWdvdG8gYnVzX25vdGlmaWVyX2ZhaWxlZDsKIAlyZXR2YWwgPSB1c2JfaG9zdF9pbml0KCk7CiAJaWYgKHJldHZhbCkKIAkJZ290byBob3N0X2luaXRfZmFpbGVkOwpAQCAtMTAyNSw2ICsxMDU1LDggQEAKIG1ham9yX2luaXRfZmFpbGVkOgogCXVzYl9ob3N0X2NsZWFudXAoKTsKIGhvc3RfaW5pdF9mYWlsZWQ6CisJYnVzX3VucmVnaXN0ZXJfbm90aWZpZXIoJnVzYl9idXNfdHlwZSwgJnVzYl9idXNfbmIpOworYnVzX25vdGlmaWVyX2ZhaWxlZDoKIAlidXNfdW5yZWdpc3RlcigmdXNiX2J1c190eXBlKTsKIGJ1c19yZWdpc3Rlcl9mYWlsZWQ6CiAJa3N1c3BlbmRfdXNiX2NsZWFudXAoKTsKQEAgLTEwNDgsNiArMTA4MCw3IEBACiAJdXNiX2RldmlvX2NsZWFudXAoKTsKIAl1c2JfaHViX2NsZWFudXAoKTsKIAl1c2JfaG9zdF9jbGVhbnVwKCk7CisJYnVzX3VucmVnaXN0ZXJfbm90aWZpZXIoJnVzYl9idXNfdHlwZSwgJnVzYl9idXNfbmIpOwogCWJ1c191bnJlZ2lzdGVyKCZ1c2JfYnVzX3R5cGUpOwogCWtzdXNwZW5kX3VzYl9jbGVhbnVwKCk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jb3JlL3VzYi5oIGIvZHJpdmVycy91c2IvY29yZS91c2IuaAppbmRleCA5YTFhNDVhLi4zODYxNzc4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jb3JlL3VzYi5oCisrKyBiL2RyaXZlcnMvdXNiL2NvcmUvdXNiLmgKQEAgLTEsMTYgKzEsMjAgQEAKKyNpbmNsdWRlIDxsaW51eC9wbS5oPgorCiAvKiBGdW5jdGlvbnMgbG9jYWwgdG8gZHJpdmVycy91c2IvY29yZS8gKi8KIAogZXh0ZXJuIGludCB1c2JfY3JlYXRlX3N5c2ZzX2Rldl9maWxlcyhzdHJ1Y3QgdXNiX2RldmljZSAqZGV2KTsKIGV4dGVybiB2b2lkIHVzYl9yZW1vdmVfc3lzZnNfZGV2X2ZpbGVzKHN0cnVjdCB1c2JfZGV2aWNlICpkZXYpOwogZXh0ZXJuIGludCB1c2JfY3JlYXRlX3N5c2ZzX2ludGZfZmlsZXMoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpOwogZXh0ZXJuIHZvaWQgdXNiX3JlbW92ZV9zeXNmc19pbnRmX2ZpbGVzKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKTsKLWV4dGVybiBpbnQgdXNiX2NyZWF0ZV9lcF9maWxlcyhzdHJ1Y3QgZGV2aWNlICpwYXJlbnQsCitleHRlcm4gaW50IHVzYl9jcmVhdGVfZXBfZGV2cyhzdHJ1Y3QgZGV2aWNlICpwYXJlbnQsCiAJCQkJc3RydWN0IHVzYl9ob3N0X2VuZHBvaW50ICplbmRwb2ludCwKIAkJCQlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldik7Ci1leHRlcm4gdm9pZCB1c2JfcmVtb3ZlX2VwX2ZpbGVzKHN0cnVjdCB1c2JfaG9zdF9lbmRwb2ludCAqZW5kcG9pbnQpOworZXh0ZXJuIHZvaWQgdXNiX3JlbW92ZV9lcF9kZXZzKHN0cnVjdCB1c2JfaG9zdF9lbmRwb2ludCAqZW5kcG9pbnQpOwogCiBleHRlcm4gdm9pZCB1c2JfZW5hYmxlX2VuZHBvaW50KHN0cnVjdCB1c2JfZGV2aWNlICpkZXYsCi0JCXN0cnVjdCB1c2JfaG9zdF9lbmRwb2ludCAqZXApOworCQlzdHJ1Y3QgdXNiX2hvc3RfZW5kcG9pbnQgKmVwLCBib29sIHJlc2V0X3RvZ2dsZSk7CitleHRlcm4gdm9pZCB1c2JfZW5hYmxlX2ludGVyZmFjZShzdHJ1Y3QgdXNiX2RldmljZSAqZGV2LAorCQlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwgYm9vbCByZXNldF90b2dnbGVzKTsKIGV4dGVybiB2b2lkIHVzYl9kaXNhYmxlX2VuZHBvaW50KHN0cnVjdCB1c2JfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBlcGFkZHIpOwogZXh0ZXJuIHZvaWQgdXNiX2Rpc2FibGVfaW50ZXJmYWNlKHN0cnVjdCB1c2JfZGV2aWNlICpkZXYsCiAJCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKTsKQEAgLTQyLDE0ICs0NiwxNiBAQAogI2lmZGVmCUNPTkZJR19QTQogCiBleHRlcm4gaW50IHVzYl9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldiwgcG1fbWVzc2FnZV90IG1zZyk7Ci1leHRlcm4gaW50IHVzYl9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KTsKK2V4dGVybiBpbnQgdXNiX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHBtX21lc3NhZ2VfdCBtc2cpOwogCiBleHRlcm4gdm9pZCB1c2JfYXV0b3N1c3BlbmRfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOwotZXh0ZXJuIGludCB1c2JfcG9ydF9zdXNwZW5kKHN0cnVjdCB1c2JfZGV2aWNlICpkZXYpOwotZXh0ZXJuIGludCB1c2JfcG9ydF9yZXN1bWUoc3RydWN0IHVzYl9kZXZpY2UgKmRldik7CitleHRlcm4gdm9pZCB1c2JfYXV0b3Jlc3VtZV93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CitleHRlcm4gaW50IHVzYl9wb3J0X3N1c3BlbmQoc3RydWN0IHVzYl9kZXZpY2UgKmRldiwgcG1fbWVzc2FnZV90IG1zZyk7CitleHRlcm4gaW50IHVzYl9wb3J0X3Jlc3VtZShzdHJ1Y3QgdXNiX2RldmljZSAqZGV2LCBwbV9tZXNzYWdlX3QgbXNnKTsKIGV4dGVybiBpbnQgdXNiX2V4dGVybmFsX3N1c3BlbmRfZGV2aWNlKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2LAogCQlwbV9tZXNzYWdlX3QgbXNnKTsKLWV4dGVybiBpbnQgdXNiX2V4dGVybmFsX3Jlc3VtZV9kZXZpY2Uoc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYpOworZXh0ZXJuIGludCB1c2JfZXh0ZXJuYWxfcmVzdW1lX2RldmljZShzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiwKKwkJcG1fbWVzc2FnZV90IG1zZyk7CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCB1c2JfcG1fbG9jayhzdHJ1Y3QgdXNiX2RldmljZSAqdWRldikKIHsKQEAgLTYzLDEyICs2OSwxMiBAQAogCiAjZWxzZQogCi1zdGF0aWMgaW5saW5lIGludCB1c2JfcG9ydF9zdXNwZW5kKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2KQorc3RhdGljIGlubGluZSBpbnQgdXNiX3BvcnRfc3VzcGVuZChzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiwgcG1fbWVzc2FnZV90IG1zZykKIHsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgdXNiX3BvcnRfcmVzdW1lKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2KQorc3RhdGljIGlubGluZSBpbnQgdXNiX3BvcnRfcmVzdW1lKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2LCBwbV9tZXNzYWdlX3QgbXNnKQogewogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L0tjb25maWcgYi9kcml2ZXJzL3VzYi9nYWRnZXQvS2NvbmZpZwppbmRleCBkZDRjZDVhLi4zMjE5ZDEzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvS2NvbmZpZworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvS2NvbmZpZwpAQCAtMjk3LDEzICsyOTcsMzQgQEAKIAogIyBtdXNiIGJ1aWxkcyBpbiAuLi9tdXNiIGFsb25nIHdpdGggaG9zdCBzdXBwb3J0CiBjb25maWcgVVNCX0dBREdFVF9NVVNCX0hEUkMKLQlib29sZWFuICJJbnZlbnRyYSBIRFJDIFVTQiBQZXJpcGhlcmFsIChUSSwgLi4uKSIKKwlib29sZWFuICJJbnZlbnRyYSBIRFJDIFVTQiBQZXJpcGhlcmFsIChUSSwgQURJLCAuLi4pIgogCWRlcGVuZHMgb24gVVNCX01VU0JfSERSQyAmJiAoVVNCX01VU0JfUEVSSVBIRVJBTCB8fCBVU0JfTVVTQl9PVEcpCiAJc2VsZWN0IFVTQl9HQURHRVRfRFVBTFNQRUVECiAJc2VsZWN0IFVTQl9HQURHRVRfU0VMRUNURUQKIAloZWxwCiAJICBUaGlzIE9URy1jYXBhYmxlIHNpbGljb24gSVAgaXMgdXNlZCBpbiBkdWFsIGRlc2lnbnMgaW5jbHVkaW5nCi0JICB0aGUgVEkgRGFWaW5jaSwgT01BUCAyNDN4LCBPTUFQIDM0M3gsIGFuZCBUVVNCIDYwMTAuCisJICB0aGUgVEkgRGFWaW5jaSwgT01BUCAyNDN4LCBPTUFQIDM0M3gsIFRVU0IgNjAxMCwgYW5kIEFESSBCbGFja2ZpbgorCitjb25maWcgVVNCX0dBREdFVF9JTVgKKwlib29sZWFuICJGcmVlc2NhbGUgSU1YIFVTQiBQZXJpcGhlcmFsIENvbnRyb2xsZXIiCisJZGVwZW5kcyBvbiBBUkNIX01YMQorCWhlbHAKKwkgICBGcmVlc2NhbGUncyBJTVggc2VyaWVzIGluY2x1ZGUgYW4gaW50ZWdyYXRlZCBmdWxsIHNwZWVkCisJICAgVVNCIDEuMSBkZXZpY2UgY29udHJvbGxlci4gIFRoZSBjb250cm9sbGVyIGluIHRoZSBJTVggc2VyaWVzCisJICAgaXMgcmVnaXN0ZXItY29tcGF0aWJsZS4KKworCSAgIEl0IGhhcyBTaXggZml4ZWQtZnVuY3Rpb24gZW5kcG9pbnRzLCBhcyB3ZWxsIGFzIGVuZHBvaW50CisJICAgemVybyAoZm9yIGNvbnRyb2wgdHJhbnNmZXJzKS4KKworCSAgIFNheSAieSIgdG8gbGluayB0aGUgZHJpdmVyIHN0YXRpY2FsbHksIG9yICJtIiB0byBidWlsZCBhCisJICAgZHluYW1pY2FsbHkgbGlua2VkIG1vZHVsZSBjYWxsZWQgImlteF91ZGMiIGFuZCBmb3JjZSBhbGwKKwkgICBnYWRnZXQgZHJpdmVycyB0byBhbHNvIGJlIGR5bmFtaWNhbGx5IGxpbmtlZC4KKworY29uZmlnIFVTQl9JTVgKKwl0cmlzdGF0ZQorCWRlcGVuZHMgb24gVVNCX0dBREdFVF9JTVgKKwlkZWZhdWx0IFVTQl9HQURHRVQKKwlzZWxlY3QgVVNCX0dBREdFVF9TRUxFQ1RFRAogCiBjb25maWcgVVNCX0dBREdFVF9NNjY1OTIKIAlib29sZWFuICJSZW5lc2FzIE02NjU5MiBVU0IgUGVyaXBoZXJhbCBDb250cm9sbGVyIgpAQCAtMzc3LDYgKzM5OCwyNCBAQAogCWRlZmF1bHQgVVNCX0dBREdFVAogCXNlbGVjdCBVU0JfR0FER0VUX1NFTEVDVEVECiAKK2NvbmZpZyBVU0JfR0FER0VUX0NJMTNYWFgKKwlib29sZWFuICJNSVBTIFVTQiBDSTEzeHh4IgorCWRlcGVuZHMgb24gUENJCisJc2VsZWN0IFVTQl9HQURHRVRfRFVBTFNQRUVECisJaGVscAorCSAgTUlQUyBVU0IgSVAgY29yZSBmYW1pbHkgZGV2aWNlIGNvbnRyb2xsZXIKKwkgIEN1cnJlbnRseSBpdCBvbmx5IHN1cHBvcnRzIElQIHBhcnQgbnVtYmVyIENJMTM0MTIKKworCSAgU2F5ICJ5IiB0byBsaW5rIHRoZSBkcml2ZXIgc3RhdGljYWxseSwgb3IgIm0iIHRvIGJ1aWxkIGEKKwkgIGR5bmFtaWNhbGx5IGxpbmtlZCBtb2R1bGUgY2FsbGVkICJjaTEzeHh4X3VkYyIgYW5kIGZvcmNlIGFsbAorCSAgZ2FkZ2V0IGRyaXZlcnMgdG8gYWxzbyBiZSBkeW5hbWljYWxseSBsaW5rZWQuCisKK2NvbmZpZyBVU0JfQ0kxM1hYWAorCXRyaXN0YXRlCisJZGVwZW5kcyBvbiBVU0JfR0FER0VUX0NJMTNYWFgKKwlkZWZhdWx0IFVTQl9HQURHRVQKKwlzZWxlY3QgVVNCX0dBREdFVF9TRUxFQ1RFRAorCiBjb25maWcgVVNCX0dBREdFVF9ORVQyMjgwCiAJYm9vbGVhbiAiTmV0Q2hpcCAyMjh4IgogCWRlcGVuZHMgb24gUENJCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvTWFrZWZpbGUgYi9kcml2ZXJzL3VzYi9nYWRnZXQvTWFrZWZpbGUKaW5kZXggYmQ0MDQxYi4uMzlhNTFkNyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L01ha2VmaWxlCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9NYWtlZmlsZQpAQCAtMTAsNiArMTAsNyBAQAogb2JqLSQoQ09ORklHX1VTQl9BTUQ1NTM2VURDKQkrPSBhbWQ1NTM2dWRjLm8KIG9iai0kKENPTkZJR19VU0JfUFhBMjVYKQkrPSBweGEyNXhfdWRjLm8KIG9iai0kKENPTkZJR19VU0JfUFhBMjdYKQkrPSBweGEyN3hfdWRjLm8KK29iai0kKENPTkZJR19VU0JfSU1YKQkJKz0gaW14X3VkYy5vCiBvYmotJChDT05GSUdfVVNCX0dPS1UpCQkrPSBnb2t1X3VkYy5vCiBvYmotJChDT05GSUdfVVNCX09NQVApCQkrPSBvbWFwX3VkYy5vCiBvYmotJChDT05GSUdfVVNCX0xIN0E0MFgpCSs9IGxoN2E0MHhfdWRjLm8KQEAgLTE5LDYgKzIwLDcgQEAKIG9iai0kKENPTkZJR19VU0JfRlNMX1VTQjIpCSs9IGZzbF91c2IyX3VkYy5vCiBvYmotJChDT05GSUdfVVNCX002NjU5MikJKz0gbTY2NTkyLXVkYy5vCiBvYmotJChDT05GSUdfVVNCX0ZTTF9RRSkJKz0gZnNsX3FlX3VkYy5vCitvYmotJChDT05GSUdfVVNCX0NJMTNYWFgpCSs9IGNpMTN4eHhfdWRjLm8KIAogIwogIyBVU0IgZ2FkZ2V0IGRyaXZlcnMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9jaTEzeHh4X3VkYy5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2NpMTN4eHhfdWRjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmViZjkxMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9jaTEzeHh4X3VkYy5jCkBAIC0wLDAgKzEsMjgzMCBAQAorLyoKKyAqIGNpMTN4eHhfdWRjLmMgLSBNSVBTIFVTQiBJUCBjb3JlIGZhbWlseSBkZXZpY2UgY29udHJvbGxlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBDaGlwaWRlYSAtIE1JUFMgVGVjaG5vbG9naWVzLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogQXV0aG9yOiBEYXZpZCBMb3BvCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisvKgorICogRGVzY3JpcHRpb246IE1JUFMgVVNCIElQIGNvcmUgZmFtaWx5IGRldmljZSBjb250cm9sbGVyCisgKiAgICAgICAgICAgICAgQ3VycmVudGx5IGl0IG9ubHkgc3VwcG9ydHMgSVAgcGFydCBudW1iZXIgQ0kxMzQxMgorICoKKyAqIFRoaXMgZHJpdmVyIGlzIGNvbXBvc2VkIG9mIHNldmVyYWwgYmxvY2tzOgorICogLSBIVzogICAgIGhhcmR3YXJlIGludGVyZmFjZQorICogLSBEQkc6ICAgIGRlYnVnIGZhY2lsaXRpZXMgKG9wdGlvbmFsKQorICogLSBVVElMOiAgIHV0aWxpdGllcworICogLSBJU1I6ICAgIGludGVycnVwdHMgaGFuZGxpbmcKKyAqIC0gRU5EUFQ6ICBlbmRwb2ludCBvcGVyYXRpb25zIChHYWRnZXQgQVBJKQorICogLSBHQURHRVQ6IGdhZGdldCBvcGVyYXRpb25zIChHYWRnZXQgQVBJKQorICogLSBCVVM6ICAgIGJ1cyBnbHVlIGNvZGUsIGJ1cyBhYnN0cmFjdGlvbiBsYXllcgorICogLSBQQ0k6ICAgIFBDSSBjb3JlIGludGVyZmFjZSBhbmQgUENJIHJlc291cmNlcyAoaW50ZXJydXB0cywgbWVtb3J5Li4uKQorICoKKyAqIENvbXBpbGUgT3B0aW9ucworICogLSBDT05GSUdfVVNCX0dBREdFVF9ERUJVR19GSUxFUzogZW5hYmxlIGRlYnVnIGZhY2lsaXRpZXMKKyAqIC0gU1RBTExfSU46ICBub24tZW1wdHkgYnVsay1pbiBwaXBlcyBjYW5ub3QgYmUgaGFsdGVkCisgKiAgICAgICAgICAgICAgaWYgZGVmaW5lZCBtYXNzIHN0b3JhZ2UgY29tcGxpYW5jZSBzdWNjZWVkcyBidXQgd2l0aCB3YXJuaW5ncworICogICAgICAgICAgICAgID0+IGNhc2UgNDogSGkgPiAgRG4KKyAqICAgICAgICAgICAgICA9PiBjYXNlIDU6IEhpID4gIERpCisgKiAgICAgICAgICAgICAgPT4gY2FzZSA4OiBIaSA8PiBEbworICogICAgICAgICAgICAgIGlmIHVuZGVmaW5lZCB1c2J0ZXN0IDEzIGZhaWxzCisgKiAtIFRSQUNFOiAgICAgZW5hYmxlIGZ1bmN0aW9uIHRyYWNpbmcgKGRlcGVuZHMgb24gREVCVUcpCisgKgorICogTWFpbiBGZWF0dXJlcworICogLSBDaGFwdGVyIDkgJiBNYXNzIFN0b3JhZ2UgQ29tcGxpYW5jZSB3aXRoIEdhZGdldCBGaWxlIFN0b3JhZ2UKKyAqIC0gQ2hhcHRlciA5IENvbXBsaWFuY2Ugd2l0aCBHYWRnZXQgWmVybyAoU1RBTExfSU4gdW5kZWZpbmVkKQorICogLSBOb3JtYWwgJiBMUE0gc3VwcG9ydAorICoKKyAqIFVTQlRFU1QgUmVwb3J0CisgKiAtIE9LOiAwLTEyLCAxMyAoU1RBTExfSU4gZGVmaW5lZCkgJiAxNAorICogLSBOb3QgU3VwcG9ydGVkOiAxNSAmIDE2IChJU08pCisgKgorICogVE9ETyBMaXN0CisgKiAtIE9URworICogLSBJc29jaHJvbm91cyAmIEludGVycnVwdCBUcmFmZmljCisgKiAtIEhhbmRsZSByZXF1ZXN0cyB3aGljaCBzcGF3bnMgaW50byBzZXZlcmFsIFREcworICogLSBHRVRfU1RBVFVTKGRldmljZSkgLSBhbHdheXMgcmVwb3J0cyAwCisgKiAtIEdhZGdldCBBUEkgKG1ham9yaXR5IG9mIG9wdGlvbmFsIGZlYXR1cmVzKQorICogLSBTdXNwZW5kICYgUmVtb3RlIFdha2V1cAorICovCisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZG1hcG9vbC5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvdXNiL2NoOS5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi9nYWRnZXQuaD4KKworI2luY2x1ZGUgImNpMTN4eHhfdWRjLmgiCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogREVGSU5FCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBjdHJsIHJlZ2lzdGVyIGJhbmsgYWNjZXNzICovCitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHVkY19sb2NrKTsKKworLyogZHJpdmVyIG5hbWUgKi8KKyNkZWZpbmUgVURDX0RSSVZFUl9OQU1FICAgImNpMTN4eHhfdWRjIgorCisvKiBjb250cm9sIGVuZHBvaW50IGRlc2NyaXB0aW9uICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yCitjdHJsX2VuZHB0X2Rlc2MgPSB7CisJLmJMZW5ndGggICAgICAgICA9IFVTQl9EVF9FTkRQT0lOVF9TSVpFLAorCS5iRGVzY3JpcHRvclR5cGUgPSBVU0JfRFRfRU5EUE9JTlQsCisKKwkuYm1BdHRyaWJ1dGVzICAgID0gVVNCX0VORFBPSU5UX1hGRVJfQ09OVFJPTCwKKwkud01heFBhY2tldFNpemUgID0gY3B1X3RvX2xlMTYoQ1RSTF9QQVlMT0FEX01BWCksCit9OworCisvKiBVREMgZGVzY3JpcHRvciAqLworc3RhdGljIHN0cnVjdCBjaTEzeHh4ICpfdWRjOworCisvKiBJbnRlcnJ1cHQgc3RhdGlzdGljcyAqLworI2RlZmluZSBJU1JfTUFTSyAgIDB4MUYKK3N0YXRpYyBzdHJ1Y3QgeworCXUzMiB0ZXN0OworCXUzMiB1aTsKKwl1MzIgdWVpOworCXUzMiBwY2k7CisJdTMyIHVyaTsKKwl1MzIgc2xpOworCXUzMiBub25lOworCXN0cnVjdCB7CisJCXUzMiBjbnQ7CisJCXUzMiBidWZbSVNSX01BU0srMV07CisJCXUzMiBpZHg7CisJfSBobmRsOworfSBpc3Jfc3RhdGlzdGljczsKKworLyoqCisgKiBmZnNfbnI6IGZpbmQgZmlyc3QgKGxlYXN0IHNpZ25pZmljYW50KSBiaXQgc2V0CisgKiBAeDogdGhlIHdvcmQgdG8gc2VhcmNoCisgKgorICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIGJpdCBudW1iZXIgKGluc3RlYWQgb2YgcG9zaXRpb24pCisgKi8KK3N0YXRpYyBpbnQgZmZzX25yKHUzMiB4KQoreworCWludCBuID0gZmZzKHgpOworCisJcmV0dXJuIG4gPyBuLTEgOiAzMjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSFcgYmxvY2sKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIHJlZ2lzdGVyIGJhbmsgZGVzY3JpcHRvciAqLworc3RhdGljIHN0cnVjdCB7CisJdW5zaWduZWQgICAgICBscG07ICAgIC8qIGlzIExQTT8gKi8KKwl2b2lkIF9faW9tZW0gKmFiczsgICAgLyogYnVzIG1hcCBvZmZzZXQgKi8KKwl2b2lkIF9faW9tZW0gKmNhcDsgICAgLyogYnVzIG1hcCBvZmZzZXQgKyBDQVAgb2Zmc2V0ICsgQ0FQIGRhdGEgKi8KKwlzaXplX3QgICAgICAgIHNpemU7ICAgLyogYmFuayBzaXplICovCit9IGh3X2Jhbms7CisKKy8qIFVEQyByZWdpc3RlciBtYXAgKi8KKyNkZWZpbmUgQUJTX0NBUExFTkdUSCAgICAgICAoMHgxMDBVTCkKKyNkZWZpbmUgQUJTX0hDQ1BBUkFNUyAgICAgICAoMHgxMDhVTCkKKyNkZWZpbmUgQUJTX0RDQ1BBUkFNUyAgICAgICAoMHgxMjRVTCkKKyNkZWZpbmUgQUJTX1RFU1RNT0RFICAgICAgICAoaHdfYmFuay5scG0gPyAweDBGQ1VMIDogMHgxMzhVTCkKKy8qIG9mZnNldCB0byBDQVBMRU5UR0ggKGFkZHIgKyBkYXRhKSAqLworI2RlZmluZSBDQVBfVVNCQ01EICAgICAgICAgICgweDAwMFVMKQorI2RlZmluZSBDQVBfVVNCU1RTICAgICAgICAgICgweDAwNFVMKQorI2RlZmluZSBDQVBfVVNCSU5UUiAgICAgICAgICgweDAwOFVMKQorI2RlZmluZSBDQVBfREVWSUNFQUREUiAgICAgICgweDAxNFVMKQorI2RlZmluZSBDQVBfRU5EUFRMSVNUQUREUiAgICgweDAxOFVMKQorI2RlZmluZSBDQVBfUE9SVFNDICAgICAgICAgICgweDA0NFVMKQorI2RlZmluZSBDQVBfREVWTEMgICAgICAgICAgICgweDBCNFVMKQorI2RlZmluZSBDQVBfVVNCTU9ERSAgICAgICAgIChod19iYW5rLmxwbSA/IDB4MEM4VUwgOiAweDA2OFVMKQorI2RlZmluZSBDQVBfRU5EUFRTRVRVUFNUQVQgIChod19iYW5rLmxwbSA/IDB4MEQ4VUwgOiAweDA2Q1VMKQorI2RlZmluZSBDQVBfRU5EUFRQUklNRSAgICAgIChod19iYW5rLmxwbSA/IDB4MERDVUwgOiAweDA3MFVMKQorI2RlZmluZSBDQVBfRU5EUFRGTFVTSCAgICAgIChod19iYW5rLmxwbSA/IDB4MEUwVUwgOiAweDA3NFVMKQorI2RlZmluZSBDQVBfRU5EUFRTVEFUICAgICAgIChod19iYW5rLmxwbSA/IDB4MEU0VUwgOiAweDA3OFVMKQorI2RlZmluZSBDQVBfRU5EUFRDT01QTEVURSAgIChod19iYW5rLmxwbSA/IDB4MEU4VUwgOiAweDA3Q1VMKQorI2RlZmluZSBDQVBfRU5EUFRDVFJMICAgICAgIChod19iYW5rLmxwbSA/IDB4MEVDVUwgOiAweDA4MFVMKQorI2RlZmluZSBDQVBfTEFTVCAgICAgICAgICAgIChod19iYW5rLmxwbSA/IDB4MTJDVUwgOiAweDBDMFVMKQorCisvKiBtYXhpbXVtIG51bWJlciBvZiBlbnBvaW50czogdmFsaWQgb25seSBhZnRlciBod19kZXZpY2VfcmVzZXQoKSAqLworc3RhdGljIHVuc2lnbmVkIGh3X2VwX21heDsKKworLyoqCisgKiBod19lcF9iaXQ6IGNhbGN1bGF0ZXMgdGhlIGJpdCBudW1iZXIKKyAqIEBudW06IGVuZHBvaW50IG51bWJlcgorICogQGRpcjogZW5kcG9pbnQgZGlyZWN0aW9uCisgKgorICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIGJpdCBudW1iZXIKKyAqLworc3RhdGljIGlubGluZSBpbnQgaHdfZXBfYml0KGludCBudW0sIGludCBkaXIpCit7CisJcmV0dXJuIG51bSArIChkaXIgPyAxNiA6IDApOworfQorCisvKioKKyAqIGh3X2FyZWFkOiByZWFkcyBmcm9tIHJlZ2lzdGVyIGJpdGZpZWxkCisgKiBAYWRkcjogYWRkcmVzcyByZWxhdGl2ZSB0byBidXMgbWFwCisgKiBAbWFzazogYml0ZmllbGQgbWFzaworICoKKyAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyByZWdpc3RlciBiaXRmaWVsZCBkYXRhCisgKi8KK3N0YXRpYyB1MzIgaHdfYXJlYWQodTMyIGFkZHIsIHUzMiBtYXNrKQoreworCXJldHVybiBpb3JlYWQzMihhZGRyICsgaHdfYmFuay5hYnMpICYgbWFzazsKK30KKworLyoqCisgKiBod19hd3JpdGU6IHdyaXRlcyB0byByZWdpc3RlciBiaXRmaWVsZAorICogQGFkZHI6IGFkZHJlc3MgcmVsYXRpdmUgdG8gYnVzIG1hcAorICogQG1hc2s6IGJpdGZpZWxkIG1hc2sKKyAqIEBkYXRhOiBuZXcgZGF0YQorICovCitzdGF0aWMgdm9pZCBod19hd3JpdGUodTMyIGFkZHIsIHUzMiBtYXNrLCB1MzIgZGF0YSkKK3sKKwlpb3dyaXRlMzIoaHdfYXJlYWQoYWRkciwgfm1hc2spIHwgKGRhdGEgJiBtYXNrKSwKKwkJICBhZGRyICsgaHdfYmFuay5hYnMpOworfQorCisvKioKKyAqIGh3X2NyZWFkOiByZWFkcyBmcm9tIHJlZ2lzdGVyIGJpdGZpZWxkCisgKiBAYWRkcjogYWRkcmVzcyByZWxhdGl2ZSB0byBDQVAgb2Zmc2V0IHBsdXMgY29udGVudAorICogQG1hc2s6IGJpdGZpZWxkIG1hc2sKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgcmVnaXN0ZXIgYml0ZmllbGQgZGF0YQorICovCitzdGF0aWMgdTMyIGh3X2NyZWFkKHUzMiBhZGRyLCB1MzIgbWFzaykKK3sKKwlyZXR1cm4gaW9yZWFkMzIoYWRkciArIGh3X2JhbmsuY2FwKSAmIG1hc2s7Cit9CisKKy8qKgorICogaHdfY3dyaXRlOiB3cml0ZXMgdG8gcmVnaXN0ZXIgYml0ZmllbGQKKyAqIEBhZGRyOiBhZGRyZXNzIHJlbGF0aXZlIHRvIENBUCBvZmZzZXQgcGx1cyBjb250ZW50CisgKiBAbWFzazogYml0ZmllbGQgbWFzaworICogQGRhdGE6IG5ldyBkYXRhCisgKi8KK3N0YXRpYyB2b2lkIGh3X2N3cml0ZSh1MzIgYWRkciwgdTMyIG1hc2ssIHUzMiBkYXRhKQoreworCWlvd3JpdGUzMihod19jcmVhZChhZGRyLCB+bWFzaykgfCAoZGF0YSAmIG1hc2spLAorCQkgIGFkZHIgKyBod19iYW5rLmNhcCk7Cit9CisKKy8qKgorICogaHdfY3Rlc3RfYW5kX2NsZWFyOiB0ZXN0cyAmIGNsZWFycyByZWdpc3RlciBiaXRmaWVsZAorICogQGFkZHI6IGFkZHJlc3MgcmVsYXRpdmUgdG8gQ0FQIG9mZnNldCBwbHVzIGNvbnRlbnQKKyAqIEBtYXNrOiBiaXRmaWVsZCBtYXNrCisgKgorICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHJlZ2lzdGVyIGJpdGZpZWxkIGRhdGEKKyAqLworc3RhdGljIHUzMiBod19jdGVzdF9hbmRfY2xlYXIodTMyIGFkZHIsIHUzMiBtYXNrKQoreworCXUzMiByZWcgPSBod19jcmVhZChhZGRyLCBtYXNrKTsKKworCWlvd3JpdGUzMihyZWcsIGFkZHIgKyBod19iYW5rLmNhcCk7CisJcmV0dXJuIHJlZzsKK30KKworLyoqCisgKiBod19jdGVzdF9hbmRfd3JpdGU6IHRlc3RzICYgd3JpdGVzIHJlZ2lzdGVyIGJpdGZpZWxkCisgKiBAYWRkcjogYWRkcmVzcyByZWxhdGl2ZSB0byBDQVAgb2Zmc2V0IHBsdXMgY29udGVudAorICogQG1hc2s6IGJpdGZpZWxkIG1hc2sKKyAqIEBkYXRhOiBuZXcgZGF0YQorICoKKyAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyByZWdpc3RlciBiaXRmaWVsZCBkYXRhCisgKi8KK3N0YXRpYyB1MzIgaHdfY3Rlc3RfYW5kX3dyaXRlKHUzMiBhZGRyLCB1MzIgbWFzaywgdTMyIGRhdGEpCit7CisJdTMyIHJlZyA9IGh3X2NyZWFkKGFkZHIsIH4wKTsKKworCWlvd3JpdGUzMigocmVnICYgfm1hc2spIHwgKGRhdGEgJiBtYXNrKSwgYWRkciArIGh3X2JhbmsuY2FwKTsKKwlyZXR1cm4gKHJlZyAmIG1hc2spID4+IGZmc19ucihtYXNrKTsKK30KKworLyoqCisgKiBod19kZXZpY2VfcmVzZXQ6IHJlc2V0cyBjaGlwIChleGVjdXRlIHdpdGhvdXQgaW50ZXJydXB0aW9uKQorICogQGJhc2U6IHJlZ2lzdGVyIGJhc2UgYWRkcmVzcworICoKKyAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhbiBlcnJvciBjb2RlCisgKi8KK3N0YXRpYyBpbnQgaHdfZGV2aWNlX3Jlc2V0KHZvaWQgX19pb21lbSAqYmFzZSkKK3sKKwl1MzIgcmVnOworCisJLyogYmFuayBpcyBhIG1vZHVsZSB2YXJpYWJsZSAqLworCWh3X2JhbmsuYWJzID0gYmFzZTsKKworCWh3X2JhbmsuY2FwID0gaHdfYmFuay5hYnM7CisJaHdfYmFuay5jYXAgKz0gQUJTX0NBUExFTkdUSDsKKwlod19iYW5rLmNhcCArPSBpb3JlYWQ4KGh3X2JhbmsuY2FwKTsKKworCXJlZyA9IGh3X2FyZWFkKEFCU19IQ0NQQVJBTVMsIEhDQ1BBUkFNU19MRU4pID4+IGZmc19ucihIQ0NQQVJBTVNfTEVOKTsKKwlod19iYW5rLmxwbSAgPSByZWc7CisJaHdfYmFuay5zaXplID0gaHdfYmFuay5jYXAgLSBod19iYW5rLmFiczsKKwlod19iYW5rLnNpemUgKz0gQ0FQX0xBU1Q7CisJaHdfYmFuay5zaXplIC89IHNpemVvZih1MzIpOworCisJLyogc2hvdWxkIGZsdXNoICYgc3RvcCBiZWZvcmUgcmVzZXQgKi8KKwlod19jd3JpdGUoQ0FQX0VORFBURkxVU0gsIH4wLCB+MCk7CisJaHdfY3dyaXRlKENBUF9VU0JDTUQsIFVTQkNNRF9SUywgMCk7CisKKwlod19jd3JpdGUoQ0FQX1VTQkNNRCwgVVNCQ01EX1JTVCwgVVNCQ01EX1JTVCk7CisJd2hpbGUgKGh3X2NyZWFkKENBUF9VU0JDTUQsIFVTQkNNRF9SU1QpKQorCQl1ZGVsYXkoMTApOyAgICAgICAgICAgICAvKiBub3QgUlRPUyBmcmllbmRseSAqLworCisJLyogVVNCTU9ERSBzaG91bGQgYmUgY29uZmlndXJlZCBzdGVwIGJ5IHN0ZXAgKi8KKwlod19jd3JpdGUoQ0FQX1VTQk1PREUsIFVTQk1PREVfQ00sIFVTQk1PREVfQ01fSURMRSk7CisJaHdfY3dyaXRlKENBUF9VU0JNT0RFLCBVU0JNT0RFX0NNLCBVU0JNT0RFX0NNX0RFVklDRSk7CisJaHdfY3dyaXRlKENBUF9VU0JNT0RFLCBVU0JNT0RFX1NMT00sIFVTQk1PREVfU0xPTSk7ICAvKiBIVyA+PSAyLjMgKi8KKworCWlmIChod19jcmVhZChDQVBfVVNCTU9ERSwgVVNCTU9ERV9DTSkgIT0gVVNCTU9ERV9DTV9ERVZJQ0UpIHsKKwkJcHJfZXJyKCJjYW5ub3QgZW50ZXIgaW4gZGV2aWNlIG1vZGUiKTsKKwkJcHJfZXJyKCJscG0gPSAlaSIsIGh3X2JhbmsubHBtKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJcmVnID0gaHdfYXJlYWQoQUJTX0RDQ1BBUkFNUywgRENDUEFSQU1TX0RFTikgPj4gZmZzX25yKERDQ1BBUkFNU19ERU4pOworCWlmIChyZWcgPT0gMCB8fCByZWcgPiBFTkRQVF9NQVgpCisJCXJldHVybiAtRU5PREVWOworCisJaHdfZXBfbWF4ID0gcmVnOyAgIC8qIGNhY2hlIGh3IEVORFBUX01BWCAqLworCisJLyogc2V0dXAgbG9jayBtb2RlID8gKi8KKworCS8qIEVORFBUU0VUVVBTVEFUIGlzICcwJyBieSBkZWZhdWx0ICovCisKKwkvKiBIQ1NQQVJBTVMuYmYucHBjIFNIT1VMRCBCRSB6ZXJvIGZvciBkZXZpY2UgKi8KKworCXJldHVybiAwOworfQorCisvKioKKyAqIGh3X2RldmljZV9zdGF0ZTogZW5hYmxlcy9kaXNhYmxlcyBpbnRlcnJ1cHRzICYgc3RhcnRzL3N0b3BzIGRldmljZSAoZXhlY3V0ZQorICogICAgICAgICAgICAgICAgICB3aXRob3V0IGludGVycnVwdGlvbikKKyAqIEBkbWE6IDAgPT4gZGlzYWJsZSwgITAgPT4gZW5hYmxlIGFuZCBzZXQgZG1hIGVuZ2luZQorICoKKyAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhbiBlcnJvciBjb2RlCisgKi8KK3N0YXRpYyBpbnQgaHdfZGV2aWNlX3N0YXRlKHUzMiBkbWEpCit7CisJaWYgKGRtYSkgeworCQlod19jd3JpdGUoQ0FQX0VORFBUTElTVEFERFIsIH4wLCBkbWEpOworCQkvKiBpbnRlcnJ1cHQsIGVycm9yLCBwb3J0IGNoYW5nZSwgcmVzZXQsIHNsZWVwL3N1c3BlbmQgKi8KKwkJaHdfY3dyaXRlKENBUF9VU0JJTlRSLCB+MCwKKwkJCSAgICAgVVNCaV9VSXxVU0JpX1VFSXxVU0JpX1BDSXxVU0JpX1VSSXxVU0JpX1NMSSk7CisJCWh3X2N3cml0ZShDQVBfVVNCQ01ELCBVU0JDTURfUlMsIFVTQkNNRF9SUyk7CisJfSBlbHNlIHsKKwkJaHdfY3dyaXRlKENBUF9VU0JDTUQsIFVTQkNNRF9SUywgMCk7CisJCWh3X2N3cml0ZShDQVBfVVNCSU5UUiwgfjAsIDApOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBod19lcF9mbHVzaDogZmx1c2ggZW5kcG9pbnQgZmlmbyAoZXhlY3V0ZSB3aXRob3V0IGludGVycnVwdGlvbikKKyAqIEBudW06IGVuZHBvaW50IG51bWJlcgorICogQGRpcjogZW5kcG9pbnQgZGlyZWN0aW9uCisgKgorICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIGFuIGVycm9yIGNvZGUKKyAqLworc3RhdGljIGludCBod19lcF9mbHVzaChpbnQgbnVtLCBpbnQgZGlyKQoreworCWludCBuID0gaHdfZXBfYml0KG51bSwgZGlyKTsKKworCWRvIHsKKwkJLyogZmx1c2ggYW55IHBlbmRpbmcgdHJhbnNmZXIgKi8KKwkJaHdfY3dyaXRlKENBUF9FTkRQVEZMVVNILCBCSVQobiksIEJJVChuKSk7CisJCXdoaWxlIChod19jcmVhZChDQVBfRU5EUFRGTFVTSCwgQklUKG4pKSkKKwkJCWNwdV9yZWxheCgpOworCX0gd2hpbGUgKGh3X2NyZWFkKENBUF9FTkRQVFNUQVQsIEJJVChuKSkpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogaHdfZXBfZGlzYWJsZTogZGlzYWJsZXMgZW5kcG9pbnQgKGV4ZWN1dGUgd2l0aG91dCBpbnRlcnJ1cHRpb24pCisgKiBAbnVtOiBlbmRwb2ludCBudW1iZXIKKyAqIEBkaXI6IGVuZHBvaW50IGRpcmVjdGlvbgorICoKKyAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhbiBlcnJvciBjb2RlCisgKi8KK3N0YXRpYyBpbnQgaHdfZXBfZGlzYWJsZShpbnQgbnVtLCBpbnQgZGlyKQoreworCWh3X2VwX2ZsdXNoKG51bSwgZGlyKTsKKwlod19jd3JpdGUoQ0FQX0VORFBUQ1RSTCArIG51bSAqIHNpemVvZih1MzIpLAorCQkgIGRpciA/IEVORFBUQ1RSTF9UWEUgOiBFTkRQVENUUkxfUlhFLCAwKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBod19lcF9lbmFibGU6IGVuYWJsZXMgZW5kcG9pbnQgKGV4ZWN1dGUgd2l0aG91dCBpbnRlcnJ1cHRpb24pCisgKiBAbnVtOiAgZW5kcG9pbnQgbnVtYmVyCisgKiBAZGlyOiAgZW5kcG9pbnQgZGlyZWN0aW9uCisgKiBAdHlwZTogZW5kcG9pbnQgdHlwZQorICoKKyAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhbiBlcnJvciBjb2RlCisgKi8KK3N0YXRpYyBpbnQgaHdfZXBfZW5hYmxlKGludCBudW0sIGludCBkaXIsIGludCB0eXBlKQoreworCXUzMiBtYXNrLCBkYXRhOworCisJaWYgKGRpcikgeworCQltYXNrICA9IEVORFBUQ1RSTF9UWFQ7ICAvKiB0eXBlICAgICovCisJCWRhdGEgID0gdHlwZSA8PCBmZnNfbnIobWFzayk7CisKKwkJbWFzayB8PSBFTkRQVENUUkxfVFhTOyAgLyogdW5zdGFsbCAqLworCQltYXNrIHw9IEVORFBUQ1RSTF9UWFI7ICAvKiByZXNldCBkYXRhIHRvZ2dsZSAqLworCQlkYXRhIHw9IEVORFBUQ1RSTF9UWFI7CisJCW1hc2sgfD0gRU5EUFRDVFJMX1RYRTsgIC8qIGVuYWJsZSAgKi8KKwkJZGF0YSB8PSBFTkRQVENUUkxfVFhFOworCX0gZWxzZSB7CisJCW1hc2sgID0gRU5EUFRDVFJMX1JYVDsgIC8qIHR5cGUgICAgKi8KKwkJZGF0YSAgPSB0eXBlIDw8IGZmc19ucihtYXNrKTsKKworCQltYXNrIHw9IEVORFBUQ1RSTF9SWFM7ICAvKiB1bnN0YWxsICovCisJCW1hc2sgfD0gRU5EUFRDVFJMX1JYUjsgIC8qIHJlc2V0IGRhdGEgdG9nZ2xlICovCisJCWRhdGEgfD0gRU5EUFRDVFJMX1JYUjsKKwkJbWFzayB8PSBFTkRQVENUUkxfUlhFOyAgLyogZW5hYmxlICAqLworCQlkYXRhIHw9IEVORFBUQ1RSTF9SWEU7CisJfQorCWh3X2N3cml0ZShDQVBfRU5EUFRDVFJMICsgbnVtICogc2l6ZW9mKHUzMiksIG1hc2ssIGRhdGEpOworCXJldHVybiAwOworfQorCisvKioKKyAqIGh3X2VwX2dldF9oYWx0OiByZXR1cm4gZW5kcG9pbnQgaGFsdCBzdGF0dXMKKyAqIEBudW06IGVuZHBvaW50IG51bWJlcgorICogQGRpcjogZW5kcG9pbnQgZGlyZWN0aW9uCisgKgorICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIDEgaWYgZW5kcG9pbnQgaGFsdGVkCisgKi8KK3N0YXRpYyBpbnQgaHdfZXBfZ2V0X2hhbHQoaW50IG51bSwgaW50IGRpcikKK3sKKwl1MzIgbWFzayA9IGRpciA/IEVORFBUQ1RSTF9UWFMgOiBFTkRQVENUUkxfUlhTOworCisJcmV0dXJuIGh3X2NyZWFkKENBUF9FTkRQVENUUkwgKyBudW0gKiBzaXplb2YodTMyKSwgbWFzaykgPyAxIDogMDsKK30KKworLyoqCisgKiBod19lcF9pc19wcmltZWQ6IHRlc3QgaWYgZW5kcG9pbnQgaXMgcHJpbWVkIChleGVjdXRlIHdpdGhvdXQgaW50ZXJydXB0aW9uKQorICogQG51bTogICBlbmRwb2ludCBudW1iZXIKKyAqIEBkaXI6ICAgZW5kcG9pbnQgZGlyZWN0aW9uCisgKgorICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRydWUgaWYgZW5kcG9pbnQgcHJpbWVkCisgKi8KK3N0YXRpYyBpbnQgaHdfZXBfaXNfcHJpbWVkKGludCBudW0sIGludCBkaXIpCit7CisJdTMyIHJlZyA9IGh3X2NyZWFkKENBUF9FTkRQVFBSSU1FLCB+MCkgfCBod19jcmVhZChDQVBfRU5EUFRTVEFULCB+MCk7CisKKwlyZXR1cm4gdGVzdF9iaXQoaHdfZXBfYml0KG51bSwgZGlyKSwgKHZvaWQgKikmcmVnKTsKK30KKworLyoqCisgKiBod190ZXN0X2FuZF9jbGVhcl9zZXR1cF9zdGF0dXM6IHRlc3QgJiBjbGVhciBzZXR1cCBzdGF0dXMgKGV4ZWN1dGUgd2l0aG91dAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnJ1cHRpb24pCisgKiBAbjogYml0IG51bWJlciAoZW5kcG9pbnQpCisgKgorICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHNldHVwIHN0YXR1cworICovCitzdGF0aWMgaW50IGh3X3Rlc3RfYW5kX2NsZWFyX3NldHVwX3N0YXR1cyhpbnQgbikKK3sKKwlyZXR1cm4gaHdfY3Rlc3RfYW5kX2NsZWFyKENBUF9FTkRQVFNFVFVQU1RBVCwgQklUKG4pKTsKK30KKworLyoqCisgKiBod19lcF9wcmltZTogcHJpbWVzIGVuZHBvaW50IChleGVjdXRlIHdpdGhvdXQgaW50ZXJydXB0aW9uKQorICogQG51bTogICAgIGVuZHBvaW50IG51bWJlcgorICogQGRpcjogICAgIGVuZHBvaW50IGRpcmVjdGlvbgorICogQGlzX2N0cmw6IHRydWUgaWYgY29udHJvbCBlbmRwb2ludAorICoKKyAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhbiBlcnJvciBjb2RlCisgKi8KK3N0YXRpYyBpbnQgaHdfZXBfcHJpbWUoaW50IG51bSwgaW50IGRpciwgaW50IGlzX2N0cmwpCit7CisJaW50IG4gPSBod19lcF9iaXQobnVtLCBkaXIpOworCisJLyogdGhlIGNhbGxlciBzaG91bGQgZmx1c2ggZmlyc3QgKi8KKwlpZiAoaHdfZXBfaXNfcHJpbWVkKG51bSwgZGlyKSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCWlmIChpc19jdHJsICYmIGRpciA9PSBSWCAmJiBod19jcmVhZChDQVBfRU5EUFRTRVRVUFNUQVQsIEJJVChudW0pKSkKKwkJcmV0dXJuIC1FQUdBSU47CisKKwlod19jd3JpdGUoQ0FQX0VORFBUUFJJTUUsIEJJVChuKSwgQklUKG4pKTsKKworCXdoaWxlIChod19jcmVhZChDQVBfRU5EUFRQUklNRSwgQklUKG4pKSkKKwkJY3B1X3JlbGF4KCk7CisJaWYgKGlzX2N0cmwgJiYgZGlyID09IFJYICAmJiBod19jcmVhZChDQVBfRU5EUFRTRVRVUFNUQVQsIEJJVChudW0pKSkKKwkJcmV0dXJuIC1FQUdBSU47CisKKwkvKiBzdGF0dXMgc2hvdWx0IGJlIHRlc3RlZCBhY2NvcmRpbmcgd2l0aCBtYW51YWwgYnV0IGl0IGRvZXNuJ3Qgd29yayAqLworCXJldHVybiAwOworfQorCisvKioKKyAqIGh3X2VwX3NldF9oYWx0OiBjb25maWd1cmVzIGVwIGhhbHQgJiByZXNldHMgZGF0YSB0b2dnbGUgYWZ0ZXIgY2xlYXIgKGV4ZWN1dGUKKyAqICAgICAgICAgICAgICAgICB3aXRob3V0IGludGVycnVwdGlvbikKKyAqIEBudW06ICAgZW5kcG9pbnQgbnVtYmVyCisgKiBAZGlyOiAgIGVuZHBvaW50IGRpcmVjdGlvbgorICogQHZhbHVlOiB0cnVlID0+IHN0YWxsLCBmYWxzZSA9PiB1bnN0YWxsCisgKgorICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIGFuIGVycm9yIGNvZGUKKyAqLworc3RhdGljIGludCBod19lcF9zZXRfaGFsdChpbnQgbnVtLCBpbnQgZGlyLCBpbnQgdmFsdWUpCit7CisJaWYgKHZhbHVlICE9IDAgJiYgdmFsdWUgIT0gMSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlkbyB7CisJCXUzMiBhZGRyID0gQ0FQX0VORFBUQ1RSTCArIG51bSAqIHNpemVvZih1MzIpOworCQl1MzIgbWFza194cyA9IGRpciA/IEVORFBUQ1RSTF9UWFMgOiBFTkRQVENUUkxfUlhTOworCQl1MzIgbWFza194ciA9IGRpciA/IEVORFBUQ1RSTF9UWFIgOiBFTkRQVENUUkxfUlhSOworCisJCS8qIGRhdGEgdG9nZ2xlIC0gcmVzZXJ2ZWQgZm9yIEVQMCBidXQgaXQncyBpbiBFU1MgKi8KKwkJaHdfY3dyaXRlKGFkZHIsIG1hc2tfeHN8bWFza194ciwgdmFsdWUgPyBtYXNrX3hzIDogbWFza194cik7CisKKwl9IHdoaWxlICh2YWx1ZSAhPSBod19lcF9nZXRfaGFsdChudW0sIGRpcikpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogaHdfaW50cl9jbGVhcjogZGlzYWJsZXMgaW50ZXJydXB0ICYgY2xlYXJzIGludGVycnVwdCBzdGF0dXMgKGV4ZWN1dGUgd2l0aG91dAorICogICAgICAgICAgICAgICAgaW50ZXJydXB0aW9uKQorICogQG46IGludGVycnVwdCBiaXQKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYW4gZXJyb3IgY29kZQorICovCitzdGF0aWMgaW50IGh3X2ludHJfY2xlYXIoaW50IG4pCit7CisJaWYgKG4gPj0gUkVHX0JJVFMpCisJCXJldHVybiAtRUlOVkFMOworCisJaHdfY3dyaXRlKENBUF9VU0JJTlRSLCBCSVQobiksIDApOworCWh3X2N3cml0ZShDQVBfVVNCU1RTLCAgQklUKG4pLCBCSVQobikpOworCXJldHVybiAwOworfQorCisvKioKKyAqIGh3X2ludHJfZm9yY2U6IGVuYWJsZXMgaW50ZXJydXB0ICYgZm9yY2VzIGludGVycnVwdCBzdGF0dXMgKGV4ZWN1dGUgd2l0aG91dAorICogICAgICAgICAgICAgICAgaW50ZXJydXB0aW9uKQorICogQG46IGludGVycnVwdCBiaXQKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYW4gZXJyb3IgY29kZQorICovCitzdGF0aWMgaW50IGh3X2ludHJfZm9yY2UoaW50IG4pCit7CisJaWYgKG4gPj0gUkVHX0JJVFMpCisJCXJldHVybiAtRUlOVkFMOworCisJaHdfYXdyaXRlKEFCU19URVNUTU9ERSwgVEVTVE1PREVfRk9SQ0UsIFRFU1RNT0RFX0ZPUkNFKTsKKwlod19jd3JpdGUoQ0FQX1VTQklOVFIsICBCSVQobiksIEJJVChuKSk7CisJaHdfY3dyaXRlKENBUF9VU0JTVFMsICAgQklUKG4pLCBCSVQobikpOworCWh3X2F3cml0ZShBQlNfVEVTVE1PREUsIFRFU1RNT0RFX0ZPUkNFLCAwKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBod19pc19wb3J0X2hpZ2hfc3BlZWQ6IHRlc3QgaWYgcG9ydCBpcyBoaWdoIHNwZWVkCisgKgorICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRydWUgaWYgaGlnaCBzcGVlZCBwb3J0CisgKi8KK3N0YXRpYyBpbnQgaHdfcG9ydF9pc19oaWdoX3NwZWVkKHZvaWQpCit7CisJcmV0dXJuIGh3X2JhbmsubHBtID8gaHdfY3JlYWQoQ0FQX0RFVkxDLCBERVZMQ19QU1BEKSA6CisJCWh3X2NyZWFkKENBUF9QT1JUU0MsIFBPUlRTQ19IU1ApOworfQorCisvKioKKyAqIGh3X3BvcnRfdGVzdF9nZXQ6IHJlYWRzIHBvcnQgdGVzdCBtb2RlIHZhbHVlCisgKgorICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHBvcnQgdGVzdCBtb2RlIHZhbHVlCisgKi8KK3N0YXRpYyB1OCBod19wb3J0X3Rlc3RfZ2V0KHZvaWQpCit7CisJcmV0dXJuIGh3X2NyZWFkKENBUF9QT1JUU0MsIFBPUlRTQ19QVEMpID4+IGZmc19ucihQT1JUU0NfUFRDKTsKK30KKworLyoqCisgKiBod19wb3J0X3Rlc3Rfc2V0OiB3cml0ZXMgcG9ydCB0ZXN0IG1vZGUgKGV4ZWN1dGUgd2l0aG91dCBpbnRlcnJ1cHRpb24pCisgKiBAbW9kZTogbmV3IHZhbHVlCisgKgorICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIGFuIGVycm9yIGNvZGUKKyAqLworc3RhdGljIGludCBod19wb3J0X3Rlc3Rfc2V0KHU4IG1vZGUpCit7CisJY29uc3QgdTggVEVTVF9NT0RFX01BWCA9IDc7CisKKwlpZiAobW9kZSA+IFRFU1RfTU9ERV9NQVgpCisJCXJldHVybiAtRUlOVkFMOworCisJaHdfY3dyaXRlKENBUF9QT1JUU0MsIFBPUlRTQ19QVEMsIG1vZGUgPDwgZmZzX25yKFBPUlRTQ19QVEMpKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBod19yZWFkX2ludHJfZW5hYmxlOiByZXR1cm5zIGludGVycnVwdCBlbmFibGUgcmVnaXN0ZXIKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgcmVnaXN0ZXIgZGF0YQorICovCitzdGF0aWMgdTMyIGh3X3JlYWRfaW50cl9lbmFibGUodm9pZCkKK3sKKwlyZXR1cm4gaHdfY3JlYWQoQ0FQX1VTQklOVFIsIH4wKTsKK30KKworLyoqCisgKiBod19yZWFkX2ludHJfc3RhdHVzOiByZXR1cm5zIGludGVycnVwdCBzdGF0dXMgcmVnaXN0ZXIKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgcmVnaXN0ZXIgZGF0YQorICovCitzdGF0aWMgdTMyIGh3X3JlYWRfaW50cl9zdGF0dXModm9pZCkKK3sKKwlyZXR1cm4gaHdfY3JlYWQoQ0FQX1VTQlNUUywgfjApOworfQorCisvKioKKyAqIGh3X3JlZ2lzdGVyX3JlYWQ6IHJlYWRzIGFsbCBkZXZpY2UgcmVnaXN0ZXJzIChleGVjdXRlIHdpdGhvdXQgaW50ZXJydXB0aW9uKQorICogQGJ1ZjogIGRlc3RpbmF0aW9uIGJ1ZmZlcgorICogQHNpemU6IGJ1ZmZlciBzaXplCisgKgorICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIG51bWJlciBvZiByZWdpc3RlcnMgcmVhZAorICovCitzdGF0aWMgc2l6ZV90IGh3X3JlZ2lzdGVyX3JlYWQodTMyICpidWYsIHNpemVfdCBzaXplKQoreworCXVuc2lnbmVkIGk7CisKKwlpZiAoc2l6ZSA+IGh3X2Jhbmsuc2l6ZSkKKwkJc2l6ZSA9IGh3X2Jhbmsuc2l6ZTsKKworCWZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspCisJCWJ1ZltpXSA9IGh3X2FyZWFkKGkgKiBzaXplb2YodTMyKSwgfjApOworCisJcmV0dXJuIHNpemU7Cit9CisKKy8qKgorICogaHdfcmVnaXN0ZXJfd3JpdGU6IHdyaXRlcyB0byByZWdpc3RlcgorICogQGFkZHI6IHJlZ2lzdGVyIGFkZHJlc3MKKyAqIEBkYXRhOiByZWdpc3RlciB2YWx1ZQorICoKKyAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhbiBlcnJvciBjb2RlCisgKi8KK3N0YXRpYyBpbnQgaHdfcmVnaXN0ZXJfd3JpdGUodTE2IGFkZHIsIHUzMiBkYXRhKQoreworCS8qIGFsaWduICovCisJYWRkciAvPSBzaXplb2YodTMyKTsKKworCWlmIChhZGRyID49IGh3X2Jhbmsuc2l6ZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBhbGlnbiAqLworCWFkZHIgKj0gc2l6ZW9mKHUzMik7CisKKwlod19hd3JpdGUoYWRkciwgfjAsIGRhdGEpOworCXJldHVybiAwOworfQorCisvKioKKyAqIGh3X3Rlc3RfYW5kX2NsZWFyX2NvbXBsZXRlOiB0ZXN0ICYgY2xlYXIgY29tcGxldGUgc3RhdHVzIChleGVjdXRlIHdpdGhvdXQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnJ1cHRpb24pCisgKiBAbjogYml0IG51bWJlciAoZW5kcG9pbnQpCisgKgorICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIGNvbXBsZXRlIHN0YXR1cworICovCitzdGF0aWMgaW50IGh3X3Rlc3RfYW5kX2NsZWFyX2NvbXBsZXRlKGludCBuKQoreworCXJldHVybiBod19jdGVzdF9hbmRfY2xlYXIoQ0FQX0VORFBUQ09NUExFVEUsIEJJVChuKSk7Cit9CisKKy8qKgorICogaHdfdGVzdF9hbmRfY2xlYXJfaW50cl9hY3RpdmU6IHRlc3QgJiBjbGVhciBhY3RpdmUgaW50ZXJydXB0cyAoZXhlY3V0ZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGhvdXQgaW50ZXJydXB0aW9uKQorICoKKyAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhY3RpdmUgaW50ZXJydXRwcworICovCitzdGF0aWMgdTMyIGh3X3Rlc3RfYW5kX2NsZWFyX2ludHJfYWN0aXZlKHZvaWQpCit7CisJdTMyIHJlZyA9IGh3X3JlYWRfaW50cl9zdGF0dXMoKSAmIGh3X3JlYWRfaW50cl9lbmFibGUoKTsKKworCWh3X2N3cml0ZShDQVBfVVNCU1RTLCB+MCwgcmVnKTsKKwlyZXR1cm4gcmVnOworfQorCisvKioKKyAqIGh3X3Rlc3RfYW5kX2NsZWFyX3NldHVwX2d1YXJkOiB0ZXN0ICYgY2xlYXIgc2V0dXAgZ3VhcmQgKGV4ZWN1dGUgd2l0aG91dAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVycnVwdGlvbikKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgZ3VhcmQgdmFsdWUKKyAqLworc3RhdGljIGludCBod190ZXN0X2FuZF9jbGVhcl9zZXR1cF9ndWFyZCh2b2lkKQoreworCXJldHVybiBod19jdGVzdF9hbmRfd3JpdGUoQ0FQX1VTQkNNRCwgVVNCQ01EX1NVVFcsIDApOworfQorCisvKioKKyAqIGh3X3Rlc3RfYW5kX3NldF9zZXR1cF9ndWFyZDogdGVzdCAmIHNldCBzZXR1cCBndWFyZCAoZXhlY3V0ZSB3aXRob3V0CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVycnVwdGlvbikKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgZ3VhcmQgdmFsdWUKKyAqLworc3RhdGljIGludCBod190ZXN0X2FuZF9zZXRfc2V0dXBfZ3VhcmQodm9pZCkKK3sKKwlyZXR1cm4gaHdfY3Rlc3RfYW5kX3dyaXRlKENBUF9VU0JDTUQsIFVTQkNNRF9TVVRXLCBVU0JDTURfU1VUVyk7Cit9CisKKy8qKgorICogaHdfdXNiX3NldF9hZGRyZXNzOiBjb25maWd1cmVzIFVTQiBhZGRyZXNzIChleGVjdXRlIHdpdGhvdXQgaW50ZXJydXB0aW9uKQorICogQHZhbHVlOiBuZXcgVVNCIGFkZHJlc3MKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYW4gZXJyb3IgY29kZQorICovCitzdGF0aWMgaW50IGh3X3VzYl9zZXRfYWRkcmVzcyh1OCB2YWx1ZSkKK3sKKwkvKiBhZHZhbmNlICovCisJaHdfY3dyaXRlKENBUF9ERVZJQ0VBRERSLCBERVZJQ0VBRERSX1VTQkFEUiB8IERFVklDRUFERFJfVVNCQURSQSwKKwkJICB2YWx1ZSA8PCBmZnNfbnIoREVWSUNFQUREUl9VU0JBRFIpIHwgREVWSUNFQUREUl9VU0JBRFJBKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBod191c2JfcmVzZXQ6IHJlc3RhcnQgZGV2aWNlIGFmdGVyIGEgYnVzIHJlc2V0IChleGVjdXRlIHdpdGhvdXQKKyAqICAgICAgICAgICAgICAgaW50ZXJydXB0aW9uKQorICoKKyAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhbiBlcnJvciBjb2RlCisgKi8KK3N0YXRpYyBpbnQgaHdfdXNiX3Jlc2V0KHZvaWQpCit7CisJaHdfdXNiX3NldF9hZGRyZXNzKDApOworCisJLyogRVNTIGZsdXNoZXMgb25seSBhdCBlbmQ/IT8gKi8KKwlod19jd3JpdGUoQ0FQX0VORFBURkxVU0gsICAgIH4wLCB+MCk7ICAgLyogZmx1c2ggYWxsIEVQcyAqLworCisJLyogY2xlYXIgc2V0dXAgdG9rZW4gc2VtYXBob3JlcyAqLworCWh3X2N3cml0ZShDQVBfRU5EUFRTRVRVUFNUQVQsIDAsICAwKTsgICAvKiB3cml0ZXMgaXRzIGNvbnRlbnQgKi8KKworCS8qIGNsZWFyIGNvbXBsZXRlIHN0YXR1cyAqLworCWh3X2N3cml0ZShDQVBfRU5EUFRDT01QTEVURSwgIDAsICAwKTsgICAvKiB3cml0ZXMgaXRzIGNvbnRlbnQgKi8KKworCS8qIHdhaXQgdW50aWwgYWxsIGJpdHMgY2xlYXJlZCAqLworCXdoaWxlIChod19jcmVhZChDQVBfRU5EUFRQUklNRSwgfjApKQorCQl1ZGVsYXkoMTApOyAgICAgICAgICAgICAvKiBub3QgUlRPUyBmcmllbmRseSAqLworCisJLyogcmVzZXQgYWxsIGVuZHBvaW50cyA/ICovCisKKwkvKiByZXNldCBpbnRlcm5hbCBzdGF0dXMgYW5kIHdhaXQgZm9yIGZ1cnRoZXIgaW5zdHJ1Y3Rpb25zCisJICAgbm8gbmVlZCB0byB2ZXJpZnkgdGhlIHBvcnQgcmVzZXQgc3RhdHVzIChFU1MgZG9lcyBpdCkgKi8KKworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBEQkcgYmxvY2sKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKgorICogc2hvd19kZXZpY2U6IHByaW50cyBpbmZvcm1hdGlvbiBhYm91dCBkZXZpY2UgY2FwYWJpbGl0aWVzIGFuZCBzdGF0dXMKKyAqCisgKiBDaGVjayAiZGV2aWNlLmgiIGZvciBkZXRhaWxzCisgKi8KK3N0YXRpYyBzc2l6ZV90IHNob3dfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICBjaGFyICpidWYpCit7CisJc3RydWN0IGNpMTN4eHggKnVkYyA9IGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCBjaTEzeHh4LCBnYWRnZXQuZGV2KTsKKwlzdHJ1Y3QgdXNiX2dhZGdldCAqZ2FkZ2V0ID0gJnVkYy0+Z2FkZ2V0OworCWludCBuID0gMDsKKworCWRiZ190cmFjZSgiWyVzXSAlcFxuIiwgX19mdW5jX18sIGJ1Zik7CisJaWYgKGF0dHIgPT0gTlVMTCB8fCBidWYgPT0gTlVMTCkgeworCQlkZXZfZXJyKGRldiwgIlslc10gRUlOVkFMXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAwOworCX0KKworCW4gKz0gc2NucHJpbnRmKGJ1ZiArIG4sIFBBR0VfU0laRSAtIG4sICJzcGVlZCAgICAgICAgICAgICA9ICVkXG4iLAorCQkgICAgICAgZ2FkZ2V0LT5zcGVlZCk7CisJbiArPSBzY25wcmludGYoYnVmICsgbiwgUEFHRV9TSVpFIC0gbiwgImlzX2R1YWxzcGVlZCAgICAgID0gJWRcbiIsCisJCSAgICAgICBnYWRnZXQtPmlzX2R1YWxzcGVlZCk7CisJbiArPSBzY25wcmludGYoYnVmICsgbiwgUEFHRV9TSVpFIC0gbiwgImlzX290ZyAgICAgICAgICAgID0gJWRcbiIsCisJCSAgICAgICBnYWRnZXQtPmlzX290Zyk7CisJbiArPSBzY25wcmludGYoYnVmICsgbiwgUEFHRV9TSVpFIC0gbiwgImlzX2FfcGVyaXBoZXJhbCAgID0gJWRcbiIsCisJCSAgICAgICBnYWRnZXQtPmlzX2FfcGVyaXBoZXJhbCk7CisJbiArPSBzY25wcmludGYoYnVmICsgbiwgUEFHRV9TSVpFIC0gbiwgImJfaG5wX2VuYWJsZSAgICAgID0gJWRcbiIsCisJCSAgICAgICBnYWRnZXQtPmJfaG5wX2VuYWJsZSk7CisJbiArPSBzY25wcmludGYoYnVmICsgbiwgUEFHRV9TSVpFIC0gbiwgImFfaG5wX3N1cHBvcnQgICAgID0gJWRcbiIsCisJCSAgICAgICBnYWRnZXQtPmFfaG5wX3N1cHBvcnQpOworCW4gKz0gc2NucHJpbnRmKGJ1ZiArIG4sIFBBR0VfU0laRSAtIG4sICJhX2FsdF9obnBfc3VwcG9ydCA9ICVkXG4iLAorCQkgICAgICAgZ2FkZ2V0LT5hX2FsdF9obnBfc3VwcG9ydCk7CisJbiArPSBzY25wcmludGYoYnVmICsgbiwgUEFHRV9TSVpFIC0gbiwgIm5hbWUgICAgICAgICAgICAgID0gJXNcbiIsCisJCSAgICAgICAoZ2FkZ2V0LT5uYW1lID8gZ2FkZ2V0LT5uYW1lIDogIiIpKTsKKworCXJldHVybiBuOworfQorc3RhdGljIERFVklDRV9BVFRSKGRldmljZSwgU19JUlVTUiwgc2hvd19kZXZpY2UsIE5VTEwpOworCisvKioKKyAqIHNob3dfZHJpdmVyOiBwcmludHMgaW5mb3JtYXRpb24gYWJvdXQgYXR0YWNoZWQgZ2FkZ2V0IChpZiBhbnkpCisgKgorICogQ2hlY2sgImRldmljZS5oIiBmb3IgZGV0YWlscworICovCitzdGF0aWMgc3NpemVfdCBzaG93X2RyaXZlcihzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJICAgY2hhciAqYnVmKQoreworCXN0cnVjdCBjaTEzeHh4ICp1ZGMgPSBjb250YWluZXJfb2YoZGV2LCBzdHJ1Y3QgY2kxM3h4eCwgZ2FkZ2V0LmRldik7CisJc3RydWN0IHVzYl9nYWRnZXRfZHJpdmVyICpkcml2ZXIgPSB1ZGMtPmRyaXZlcjsKKwlpbnQgbiA9IDA7CisKKwlkYmdfdHJhY2UoIlslc10gJXBcbiIsIF9fZnVuY19fLCBidWYpOworCWlmIChhdHRyID09IE5VTEwgfHwgYnVmID09IE5VTEwpIHsKKwkJZGV2X2VycihkZXYsICJbJXNdIEVJTlZBTFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoZHJpdmVyID09IE5VTEwpCisJCXJldHVybiBzY25wcmludGYoYnVmLCBQQUdFX1NJWkUsCisJCQkJICJUaGVyZSBpcyBubyBnYWRnZXQgYXR0YWNoZWQhXG4iKTsKKworCW4gKz0gc2NucHJpbnRmKGJ1ZiArIG4sIFBBR0VfU0laRSAtIG4sICJmdW5jdGlvbiAgPSAlc1xuIiwKKwkJICAgICAgIChkcml2ZXItPmZ1bmN0aW9uID8gZHJpdmVyLT5mdW5jdGlvbiA6ICIiKSk7CisJbiArPSBzY25wcmludGYoYnVmICsgbiwgUEFHRV9TSVpFIC0gbiwgIm1heCBzcGVlZCA9ICVkXG4iLAorCQkgICAgICAgZHJpdmVyLT5zcGVlZCk7CisKKwlyZXR1cm4gbjsKK30KK3N0YXRpYyBERVZJQ0VfQVRUUihkcml2ZXIsIFNfSVJVU1IsIHNob3dfZHJpdmVyLCBOVUxMKTsKKworLyogTWF4aW11bSBldmVudCBtZXNzYWdlIGxlbmd0aCAqLworI2RlZmluZSBEQkdfREFUQV9NU0cgICA2NFVMCisKKy8qIE1heGltdW0gZXZlbnQgbWVzc2FnZXMgKi8KKyNkZWZpbmUgREJHX0RBVEFfTUFYICAgMTI4VUwKKworLyogRXZlbnQgYnVmZmVyIGRlc2NyaXB0b3IgKi8KK3N0YXRpYyBzdHJ1Y3QgeworCWNoYXIgICAgIChidWZbREJHX0RBVEFfTUFYXSlbREJHX0RBVEFfTVNHXTsgICAvKiBidWZmZXIgKi8KKwl1bnNpZ25lZCBpZHg7ICAgLyogaW5kZXggKi8KKwl1bnNpZ25lZCB0dHk7ICAgLyogcHJpbnQgdG8gY29uc29sZT8gKi8KKwlyd2xvY2tfdCBsY2s7ICAgLyogbG9jayAqLworfSBkYmdfZGF0YSA9IHsKKwkuaWR4ID0gMCwKKwkudHR5ID0gMCwKKwkubGNrID0gX19SV19MT0NLX1VOTE9DS0VEKGxjaykKK307CisKKy8qKgorICogZGJnX2RlYzogZGVjcmVtZW50cyBkZWJ1ZyBldmVudCBpbmRleAorICogQGlkeDogYnVmZmVyIGluZGV4CisgKi8KK3N0YXRpYyB2b2lkIGRiZ19kZWModW5zaWduZWQgKmlkeCkKK3sKKwkqaWR4ID0gKCppZHggLSAxKSAmIChEQkdfREFUQV9NQVgtMSk7Cit9CisKKy8qKgorICogZGJnX2luYzogaW5jcmVtZW50cyBkZWJ1ZyBldmVudCBpbmRleAorICogQGlkeDogYnVmZmVyIGluZGV4CisgKi8KK3N0YXRpYyB2b2lkIGRiZ19pbmModW5zaWduZWQgKmlkeCkKK3sKKwkqaWR4ID0gKCppZHggKyAxKSAmIChEQkdfREFUQV9NQVgtMSk7Cit9CisKKy8qKgorICogZGJnX3ByaW50OiAgcHJpbnRzIHRoZSBjb21tb24gcGFydCBvZiB0aGUgZXZlbnQKKyAqIEBhZGRyOiAgIGVuZHBvaW50IGFkZHJlc3MKKyAqIEBuYW1lOiAgIGV2ZW50IG5hbWUKKyAqIEBzdGF0dXM6IHN0YXR1cworICogQGV4dHJhOiAgZXh0cmEgaW5mb3JtYXRpb24KKyAqLworc3RhdGljIHZvaWQgZGJnX3ByaW50KHU4IGFkZHIsIGNvbnN0IGNoYXIgKm5hbWUsIGludCBzdGF0dXMsIGNvbnN0IGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCB0aW1ldmFsIHR2YWw7CisJdW5zaWduZWQgaW50IHN0YW1wOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwl3cml0ZV9sb2NrX2lycXNhdmUoJmRiZ19kYXRhLmxjaywgZmxhZ3MpOworCisJZG9fZ2V0dGltZW9mZGF5KCZ0dmFsKTsKKwlzdGFtcCA9IHR2YWwudHZfc2VjICYgMHhGRkZGOwkvKiAyXjMyID0gNDI5NDk2NzI5Ni4gTGltaXQgdG8gNDA5NnMgKi8KKwlzdGFtcCA9IHN0YW1wICogMTAwMDAwMCArIHR2YWwudHZfdXNlYzsKKworCXNjbnByaW50ZihkYmdfZGF0YS5idWZbZGJnX2RhdGEuaWR4XSwgREJHX0RBVEFfTVNHLAorCQkgICIlMDRYXHS7ICUwMlggJS03LjdzICU0aSCrXHQlc1xuIiwKKwkJICBzdGFtcCwgYWRkciwgbmFtZSwgc3RhdHVzLCBleHRyYSk7CisKKwlkYmdfaW5jKCZkYmdfZGF0YS5pZHgpOworCisJd3JpdGVfdW5sb2NrX2lycXJlc3RvcmUoJmRiZ19kYXRhLmxjaywgZmxhZ3MpOworCisJaWYgKGRiZ19kYXRhLnR0eSAhPSAwKQorCQlwcl9ub3RpY2UoIiUwNFhcdLsgJTAyWCAlLTcuN3MgJTRpIKtcdCVzXG4iLAorCQkJICBzdGFtcCwgYWRkciwgbmFtZSwgc3RhdHVzLCBleHRyYSk7Cit9CisKKy8qKgorICogZGJnX2RvbmU6IHByaW50cyBhIERPTkUgZXZlbnQKKyAqIEBhZGRyOiAgIGVuZHBvaW50IGFkZHJlc3MKKyAqIEB0ZDogICAgIHRyYW5zZmVyIGRlc2NyaXB0b3IKKyAqIEBzdGF0dXM6IHN0YXR1cworICovCitzdGF0aWMgdm9pZCBkYmdfZG9uZSh1OCBhZGRyLCBjb25zdCB1MzIgdG9rZW4sIGludCBzdGF0dXMpCit7CisJY2hhciBtc2dbREJHX0RBVEFfTVNHXTsKKworCXNjbnByaW50Zihtc2csIHNpemVvZihtc2cpLCAiJWQgJTAyWCIsCisJCSAgKGludCkodG9rZW4gJiBURF9UT1RBTF9CWVRFUykgPj4gZmZzX25yKFREX1RPVEFMX0JZVEVTKSwKKwkJICAoaW50KSh0b2tlbiAmIFREX1NUQVRVUykgICAgICA+PiBmZnNfbnIoVERfU1RBVFVTKSk7CisJZGJnX3ByaW50KGFkZHIsICJET05FIiwgc3RhdHVzLCBtc2cpOworfQorCisvKioKKyAqIGRiZ19ldmVudDogcHJpbnRzIGEgZ2VuZXJpYyBldmVudAorICogQGFkZHI6ICAgZW5kcG9pbnQgYWRkcmVzcworICogQG5hbWU6ICAgZXZlbnQgbmFtZQorICogQHN0YXR1czogc3RhdHVzCisgKi8KK3N0YXRpYyB2b2lkIGRiZ19ldmVudCh1OCBhZGRyLCBjb25zdCBjaGFyICpuYW1lLCBpbnQgc3RhdHVzKQoreworCWlmIChuYW1lICE9IE5VTEwpCisJCWRiZ19wcmludChhZGRyLCBuYW1lLCBzdGF0dXMsICIiKTsKK30KKworLyoKKyAqIGRiZ19xdWV1ZTogcHJpbnRzIGEgUVVFVUUgZXZlbnQKKyAqIEBhZGRyOiAgIGVuZHBvaW50IGFkZHJlc3MKKyAqIEByZXE6ICAgIFVTQiByZXF1ZXN0CisgKiBAc3RhdHVzOiBzdGF0dXMKKyAqLworc3RhdGljIHZvaWQgZGJnX3F1ZXVlKHU4IGFkZHIsIGNvbnN0IHN0cnVjdCB1c2JfcmVxdWVzdCAqcmVxLCBpbnQgc3RhdHVzKQoreworCWNoYXIgbXNnW0RCR19EQVRBX01TR107CisKKwlpZiAocmVxICE9IE5VTEwpIHsKKwkJc2NucHJpbnRmKG1zZywgc2l6ZW9mKG1zZyksCisJCQkgICIlZCAlZCIsICFyZXEtPm5vX2ludGVycnVwdCwgcmVxLT5sZW5ndGgpOworCQlkYmdfcHJpbnQoYWRkciwgIlFVRVVFIiwgc3RhdHVzLCBtc2cpOworCX0KK30KKworLyoqCisgKiBkYmdfc2V0dXA6IHByaW50cyBhIFNFVFVQIGV2ZW50CisgKiBAYWRkcjogZW5kcG9pbnQgYWRkcmVzcworICogQHJlcTogIHNldHVwIHJlcXVlc3QKKyAqLworc3RhdGljIHZvaWQgZGJnX3NldHVwKHU4IGFkZHIsIGNvbnN0IHN0cnVjdCB1c2JfY3RybHJlcXVlc3QgKnJlcSkKK3sKKwljaGFyIG1zZ1tEQkdfREFUQV9NU0ddOworCisJaWYgKHJlcSAhPSBOVUxMKSB7CisJCXNjbnByaW50Zihtc2csIHNpemVvZihtc2cpLAorCQkJICAiJTAyWCAlMDJYICUwNFggJTA0WCAlZCIsIHJlcS0+YlJlcXVlc3RUeXBlLAorCQkJICByZXEtPmJSZXF1ZXN0LCBsZTE2X3RvX2NwdShyZXEtPndWYWx1ZSksCisJCQkgIGxlMTZfdG9fY3B1KHJlcS0+d0luZGV4KSwgbGUxNl90b19jcHUocmVxLT53TGVuZ3RoKSk7CisJCWRiZ19wcmludChhZGRyLCAiU0VUVVAiLCAwLCBtc2cpOworCX0KK30KKworLyoqCisgKiBzaG93X2V2ZW50czogZGlzcGxheXMgdGhlIGV2ZW50IGJ1ZmZlcgorICoKKyAqIENoZWNrICJkZXZpY2UuaCIgZm9yIGRldGFpbHMKKyAqLworc3RhdGljIHNzaXplX3Qgc2hvd19ldmVudHMoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgIGNoYXIgKmJ1ZikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGksIGosIG4gPSAwOworCisJZGJnX3RyYWNlKCJbJXNdICVwXG4iLCBfX2Z1bmNfXywgYnVmKTsKKwlpZiAoYXR0ciA9PSBOVUxMIHx8IGJ1ZiA9PSBOVUxMKSB7CisJCWRldl9lcnIoZGV2LCAiWyVzXSBFSU5WQUxcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmVhZF9sb2NrX2lycXNhdmUoJmRiZ19kYXRhLmxjaywgZmxhZ3MpOworCisJaSA9IGRiZ19kYXRhLmlkeDsKKwlmb3IgKGRiZ19kZWMoJmkpOyBpICE9IGRiZ19kYXRhLmlkeDsgZGJnX2RlYygmaSkpIHsKKwkJbiArPSBzdHJsZW4oZGJnX2RhdGEuYnVmW2ldKTsKKwkJaWYgKG4gPj0gUEFHRV9TSVpFKSB7CisJCQluIC09IHN0cmxlbihkYmdfZGF0YS5idWZbaV0pOworCQkJYnJlYWs7CisJCX0KKwl9CisJZm9yIChqID0gMCwgZGJnX2luYygmaSk7IGogPCBuOyBkYmdfaW5jKCZpKSkKKwkJaiArPSBzY25wcmludGYoYnVmICsgaiwgUEFHRV9TSVpFIC0gaiwKKwkJCSAgICAgICAiJXMiLCBkYmdfZGF0YS5idWZbaV0pOworCisJcmVhZF91bmxvY2tfaXJxcmVzdG9yZSgmZGJnX2RhdGEubGNrLCBmbGFncyk7CisKKwlyZXR1cm4gbjsKK30KKworLyoqCisgKiBzdG9yZV9ldmVudHM6IGNvbmZpZ3VyZSBpZiBldmVudHMgYXJlIGdvaW5nIHRvIGJlIGFsc28gcHJpbnRlZCB0byBjb25zb2xlCisgKgorICogQ2hlY2sgImRldmljZS5oIiBmb3IgZGV0YWlscworICovCitzdGF0aWMgc3NpemVfdCBzdG9yZV9ldmVudHMoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwl1bnNpZ25lZCB0dHk7CisKKwlkYmdfdHJhY2UoIlslc10gJXAsICVkXG4iLCBfX2Z1bmNfXywgYnVmLCBjb3VudCk7CisJaWYgKGF0dHIgPT0gTlVMTCB8fCBidWYgPT0gTlVMTCkgeworCQlkZXZfZXJyKGRldiwgIlslc10gRUlOVkFMXG4iLCBfX2Z1bmNfXyk7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlpZiAoc3NjYW5mKGJ1ZiwgIiV1IiwgJnR0eSkgIT0gMSB8fCB0dHkgPiAxKSB7CisJCWRldl9lcnIoZGV2LCAiPDF8MD46IGVuYWJsZXxkaXNhYmxlIGNvbnNvbGUgbG9nXG4iKTsKKwkJZ290byBkb25lOworCX0KKworCWRiZ19kYXRhLnR0eSA9IHR0eTsKKwlkZXZfaW5mbyhkZXYsICJ0dHkgPSAldSIsIGRiZ19kYXRhLnR0eSk7CisKKyBkb25lOgorCXJldHVybiBjb3VudDsKK30KK3N0YXRpYyBERVZJQ0VfQVRUUihldmVudHMsIFNfSVJVU1IgfCBTX0lXVVNSLCBzaG93X2V2ZW50cywgc3RvcmVfZXZlbnRzKTsKKworLyoqCisgKiBzaG93X2ludGVyczogaW50ZXJydXB0IHN0YXR1cywgZW5hYmxlIHN0YXR1cyBhbmQgaGlzdG9yaWMKKyAqCisgKiBDaGVjayAiZGV2aWNlLmgiIGZvciBkZXRhaWxzCisgKi8KK3N0YXRpYyBzc2l6ZV90IHNob3dfaW50ZXJzKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICBjaGFyICpidWYpCit7CisJc3RydWN0IGNpMTN4eHggKnVkYyA9IGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCBjaTEzeHh4LCBnYWRnZXQuZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXUzMiBpbnRyOworCXVuc2lnbmVkIGksIGosIG4gPSAwOworCisJZGJnX3RyYWNlKCJbJXNdICVwXG4iLCBfX2Z1bmNfXywgYnVmKTsKKwlpZiAoYXR0ciA9PSBOVUxMIHx8IGJ1ZiA9PSBOVUxMKSB7CisJCWRldl9lcnIoZGV2LCAiWyVzXSBFSU5WQUxcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIDA7CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUodWRjLT5sb2NrLCBmbGFncyk7CisKKwluICs9IHNjbnByaW50ZihidWYgKyBuLCBQQUdFX1NJWkUgLSBuLAorCQkgICAgICAgInN0YXR1cyA9ICUwOHhcbiIsIGh3X3JlYWRfaW50cl9zdGF0dXMoKSk7CisJbiArPSBzY25wcmludGYoYnVmICsgbiwgUEFHRV9TSVpFIC0gbiwKKwkJICAgICAgICJlbmFibGUgPSAlMDh4XG4iLCBod19yZWFkX2ludHJfZW5hYmxlKCkpOworCisJbiArPSBzY25wcmludGYoYnVmICsgbiwgUEFHRV9TSVpFIC0gbiwgIip0ZXN0ID0gJWRcbiIsCisJCSAgICAgICBpc3Jfc3RhdGlzdGljcy50ZXN0KTsKKwluICs9IHNjbnByaW50ZihidWYgKyBuLCBQQUdFX1NJWkUgLSBuLCAiuyB1aSAgPSAlZFxuIiwKKwkJICAgICAgIGlzcl9zdGF0aXN0aWNzLnVpKTsKKwluICs9IHNjbnByaW50ZihidWYgKyBuLCBQQUdFX1NJWkUgLSBuLCAiuyB1ZWkgPSAlZFxuIiwKKwkJICAgICAgIGlzcl9zdGF0aXN0aWNzLnVlaSk7CisJbiArPSBzY25wcmludGYoYnVmICsgbiwgUEFHRV9TSVpFIC0gbiwgIrsgcGNpID0gJWRcbiIsCisJCSAgICAgICBpc3Jfc3RhdGlzdGljcy5wY2kpOworCW4gKz0gc2NucHJpbnRmKGJ1ZiArIG4sIFBBR0VfU0laRSAtIG4sICK7IHVyaSA9ICVkXG4iLAorCQkgICAgICAgaXNyX3N0YXRpc3RpY3MudXJpKTsKKwluICs9IHNjbnByaW50ZihidWYgKyBuLCBQQUdFX1NJWkUgLSBuLCAiuyBzbGkgPSAlZFxuIiwKKwkJICAgICAgIGlzcl9zdGF0aXN0aWNzLnNsaSk7CisJbiArPSBzY25wcmludGYoYnVmICsgbiwgUEFHRV9TSVpFIC0gbiwgIipub25lID0gJWRcbiIsCisJCSAgICAgICBpc3Jfc3RhdGlzdGljcy5ub25lKTsKKwluICs9IHNjbnByaW50ZihidWYgKyBuLCBQQUdFX1NJWkUgLSBuLCAiKmhuZGwgPSAlZFxuIiwKKwkJICAgICAgIGlzcl9zdGF0aXN0aWNzLmhuZGwuY250KTsKKworCWZvciAoaSA9IGlzcl9zdGF0aXN0aWNzLmhuZGwuaWR4LCBqID0gMDsgaiA8PSBJU1JfTUFTSzsgaisrLCBpKyspIHsKKwkJaSAgICY9IElTUl9NQVNLOworCQlpbnRyID0gaXNyX3N0YXRpc3RpY3MuaG5kbC5idWZbaV07CisKKwkJaWYgKFVTQmlfVUkgICYgaW50cikKKwkJCW4gKz0gc2NucHJpbnRmKGJ1ZiArIG4sIFBBR0VfU0laRSAtIG4sICJ1aSAgIik7CisJCWludHIgJj0gflVTQmlfVUk7CisJCWlmIChVU0JpX1VFSSAmIGludHIpCisJCQluICs9IHNjbnByaW50ZihidWYgKyBuLCBQQUdFX1NJWkUgLSBuLCAidWVpICIpOworCQlpbnRyICY9IH5VU0JpX1VFSTsKKwkJaWYgKFVTQmlfUENJICYgaW50cikKKwkJCW4gKz0gc2NucHJpbnRmKGJ1ZiArIG4sIFBBR0VfU0laRSAtIG4sICJwY2kgIik7CisJCWludHIgJj0gflVTQmlfUENJOworCQlpZiAoVVNCaV9VUkkgJiBpbnRyKQorCQkJbiArPSBzY25wcmludGYoYnVmICsgbiwgUEFHRV9TSVpFIC0gbiwgInVyaSAiKTsKKwkJaW50ciAmPSB+VVNCaV9VUkk7CisJCWlmIChVU0JpX1NMSSAmIGludHIpCisJCQluICs9IHNjbnByaW50ZihidWYgKyBuLCBQQUdFX1NJWkUgLSBuLCAic2xpICIpOworCQlpbnRyICY9IH5VU0JpX1NMSTsKKwkJaWYgKGludHIpCisJCQluICs9IHNjbnByaW50ZihidWYgKyBuLCBQQUdFX1NJWkUgLSBuLCAiPz8/ICIpOworCQlpZiAoaXNyX3N0YXRpc3RpY3MuaG5kbC5idWZbaV0pCisJCQluICs9IHNjbnByaW50ZihidWYgKyBuLCBQQUdFX1NJWkUgLSBuLCAiXG4iKTsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKHVkYy0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIG47Cit9CisKKy8qKgorICogc3RvcmVfaW50ZXJzOiBlbmFibGUgJiBmb3JjZSBvciBkaXNhYmxlIGFuIGluZGl2aWR1YWwgaW50ZXJydXRwcworICogICAgICAgICAgICAgICAgICAgKHRvIGJlIHVzZWQgZm9yIHRlc3QgcHVycG9zZXMgb25seSkKKyAqCisgKiBDaGVjayAiZGV2aWNlLmgiIGZvciBkZXRhaWxzCisgKi8KK3N0YXRpYyBzc2l6ZV90IHN0b3JlX2ludGVycyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBjaTEzeHh4ICp1ZGMgPSBjb250YWluZXJfb2YoZGV2LCBzdHJ1Y3QgY2kxM3h4eCwgZ2FkZ2V0LmRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBlbiwgYml0OworCisJZGJnX3RyYWNlKCJbJXNdICVwLCAlZFxuIiwgX19mdW5jX18sIGJ1ZiwgY291bnQpOworCWlmIChhdHRyID09IE5VTEwgfHwgYnVmID09IE5VTEwpIHsKKwkJZGV2X2VycihkZXYsICJbJXNdIEVJTlZBTFxuIiwgX19mdW5jX18pOworCQlnb3RvIGRvbmU7CisJfQorCisJaWYgKHNzY2FuZihidWYsICIldSAldSIsICZlbiwgJmJpdCkgIT0gMiB8fCBlbiA+IDEpIHsKKwkJZGV2X2VycihkZXYsICI8MXwwPiA8Yml0PjogZW5hYmxlfGRpc2FibGUgaW50ZXJydXB0Iik7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSh1ZGMtPmxvY2ssIGZsYWdzKTsKKwlpZiAoZW4pIHsKKwkJaWYgKGh3X2ludHJfZm9yY2UoYml0KSkKKwkJCWRldl9lcnIoZGV2LCAiaW52YWxpZCBiaXQgbnVtYmVyXG4iKTsKKwkJZWxzZQorCQkJaXNyX3N0YXRpc3RpY3MudGVzdCsrOworCX0gZWxzZSB7CisJCWlmIChod19pbnRyX2NsZWFyKGJpdCkpCisJCQlkZXZfZXJyKGRldiwgImludmFsaWQgYml0IG51bWJlclxuIik7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUodWRjLT5sb2NrLCBmbGFncyk7CisKKyBkb25lOgorCXJldHVybiBjb3VudDsKK30KK3N0YXRpYyBERVZJQ0VfQVRUUihpbnRlcnMsIFNfSVJVU1IgfCBTX0lXVVNSLCBzaG93X2ludGVycywgc3RvcmVfaW50ZXJzKTsKKworLyoqCisgKiBzaG93X3BvcnRfdGVzdDogcmVhZHMgcG9ydCB0ZXN0IG1vZGUKKyAqCisgKiBDaGVjayAiZGV2aWNlLmgiIGZvciBkZXRhaWxzCisgKi8KK3N0YXRpYyBzc2l6ZV90IHNob3dfcG9ydF90ZXN0KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCSAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IGNpMTN4eHggKnVkYyA9IGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCBjaTEzeHh4LCBnYWRnZXQuZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIG1vZGU7CisKKwlkYmdfdHJhY2UoIlslc10gJXBcbiIsIF9fZnVuY19fLCBidWYpOworCWlmIChhdHRyID09IE5VTEwgfHwgYnVmID09IE5VTEwpIHsKKwkJZGV2X2VycihkZXYsICJbJXNdIEVJTlZBTFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gMDsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSh1ZGMtPmxvY2ssIGZsYWdzKTsKKwltb2RlID0gaHdfcG9ydF90ZXN0X2dldCgpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUodWRjLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gc2NucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAibW9kZSA9ICV1XG4iLCBtb2RlKTsKK30KKworLyoqCisgKiBzdG9yZV9wb3J0X3Rlc3Q6IHdyaXRlcyBwb3J0IHRlc3QgbW9kZQorICoKKyAqIENoZWNrICJkZXZpY2UuaCIgZm9yIGRldGFpbHMKKyAqLworc3RhdGljIHNzaXplX3Qgc3RvcmVfcG9ydF90ZXN0KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCSAgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgICAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgY2kxM3h4eCAqdWRjID0gY29udGFpbmVyX29mKGRldiwgc3RydWN0IGNpMTN4eHgsIGdhZGdldC5kZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgbW9kZTsKKworCWRiZ190cmFjZSgiWyVzXSAlcCwgJWRcbiIsIF9fZnVuY19fLCBidWYsIGNvdW50KTsKKwlpZiAoYXR0ciA9PSBOVUxMIHx8IGJ1ZiA9PSBOVUxMKSB7CisJCWRldl9lcnIoZGV2LCAiWyVzXSBFSU5WQUxcbiIsIF9fZnVuY19fKTsKKwkJZ290byBkb25lOworCX0KKworCWlmIChzc2NhbmYoYnVmLCAiJXUiLCAmbW9kZSkgIT0gMSkgeworCQlkZXZfZXJyKGRldiwgIjxtb2RlPjogc2V0IHBvcnQgdGVzdCBtb2RlIik7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSh1ZGMtPmxvY2ssIGZsYWdzKTsKKwlpZiAoaHdfcG9ydF90ZXN0X3NldChtb2RlKSkKKwkJZGV2X2VycihkZXYsICJpbnZhbGlkIG1vZGVcbiIpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUodWRjLT5sb2NrLCBmbGFncyk7CisKKyBkb25lOgorCXJldHVybiBjb3VudDsKK30KK3N0YXRpYyBERVZJQ0VfQVRUUihwb3J0X3Rlc3QsIFNfSVJVU1IgfCBTX0lXVVNSLAorCQkgICBzaG93X3BvcnRfdGVzdCwgc3RvcmVfcG9ydF90ZXN0KTsKKworLyoqCisgKiBzaG93X3FoZWFkczogRE1BIGNvbnRlbnRzIG9mIGFsbCBxdWV1ZSBoZWFkcworICoKKyAqIENoZWNrICJkZXZpY2UuaCIgZm9yIGRldGFpbHMKKyAqLworc3RhdGljIHNzaXplX3Qgc2hvd19xaGVhZHMoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgY2kxM3h4eCAqdWRjID0gY29udGFpbmVyX29mKGRldiwgc3RydWN0IGNpMTN4eHgsIGdhZGdldC5kZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgaSwgaiwgbiA9IDA7CisKKwlkYmdfdHJhY2UoIlslc10gJXBcbiIsIF9fZnVuY19fLCBidWYpOworCWlmIChhdHRyID09IE5VTEwgfHwgYnVmID09IE5VTEwpIHsKKwkJZGV2X2VycihkZXYsICJbJXNdIEVJTlZBTFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gMDsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSh1ZGMtPmxvY2ssIGZsYWdzKTsKKwlmb3IgKGkgPSAwOyBpIDwgaHdfZXBfbWF4OyBpKyspIHsKKwkJc3RydWN0IGNpMTN4eHhfZXAgKm1FcCA9ICZ1ZGMtPmNpMTN4eHhfZXBbaV07CisJCW4gKz0gc2NucHJpbnRmKGJ1ZiArIG4sIFBBR0VfU0laRSAtIG4sCisJCQkgICAgICAgIkVQPSUwMmk6IFJYPSUwOFggVFg9JTA4WFxuIiwKKwkJCSAgICAgICBpLCAodTMyKW1FcC0+cWhbUlhdLmRtYSwgKHUzMiltRXAtPnFoW1RYXS5kbWEpOworCQlmb3IgKGogPSAwOyBqIDwgKHNpemVvZihzdHJ1Y3QgY2kxM3h4eF9xaCkvc2l6ZW9mKHUzMikpOyBqKyspIHsKKwkJCW4gKz0gc2NucHJpbnRmKGJ1ZiArIG4sIFBBR0VfU0laRSAtIG4sCisJCQkJICAgICAgICIgJTA0WDogICAgJTA4WCAgICAlMDhYXG4iLCBqLAorCQkJCSAgICAgICAqKCh1MzIgKiltRXAtPnFoW1JYXS5wdHIgKyBqKSwKKwkJCQkgICAgICAgKigodTMyICopbUVwLT5xaFtUWF0ucHRyICsgaikpOworCQl9CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUodWRjLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gbjsKK30KK3N0YXRpYyBERVZJQ0VfQVRUUihxaGVhZHMsIFNfSVJVU1IsIHNob3dfcWhlYWRzLCBOVUxMKTsKKworLyoqCisgKiBzaG93X3JlZ2lzdGVyczogZHVtcHMgYWxsIHJlZ2lzdGVycworICoKKyAqIENoZWNrICJkZXZpY2UuaCIgZm9yIGRldGFpbHMKKyAqLworc3RhdGljIHNzaXplX3Qgc2hvd19yZWdpc3RlcnMoc3RydWN0IGRldmljZSAqZGV2LAorCQkJICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgY2kxM3h4eCAqdWRjID0gY29udGFpbmVyX29mKGRldiwgc3RydWN0IGNpMTN4eHgsIGdhZGdldC5kZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdTMyIGR1bXBbNTEyXTsKKwl1bnNpZ25lZCBpLCBrLCBuID0gMDsKKworCWRiZ190cmFjZSgiWyVzXSAlcFxuIiwgX19mdW5jX18sIGJ1Zik7CisJaWYgKGF0dHIgPT0gTlVMTCB8fCBidWYgPT0gTlVMTCkgeworCQlkZXZfZXJyKGRldiwgIlslc10gRUlOVkFMXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAwOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKHVkYy0+bG9jaywgZmxhZ3MpOworCWsgPSBod19yZWdpc3Rlcl9yZWFkKGR1bXAsIHNpemVvZihkdW1wKS9zaXplb2YodTMyKSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSh1ZGMtPmxvY2ssIGZsYWdzKTsKKworCWZvciAoaSA9IDA7IGkgPCBrOyBpKyspIHsKKwkJbiArPSBzY25wcmludGYoYnVmICsgbiwgUEFHRV9TSVpFIC0gbiwKKwkJCSAgICAgICAicmVnWzB4JTA0WF0gPSAweCUwOFhcbiIsCisJCQkgICAgICAgaSAqICh1bnNpZ25lZClzaXplb2YodTMyKSwgZHVtcFtpXSk7CisJfQorCisJcmV0dXJuIG47Cit9CisKKy8qKgorICogc3RvcmVfcmVnaXN0ZXJzOiB3cml0ZXMgdmFsdWUgdG8gcmVnaXN0ZXIgYWRkcmVzcworICoKKyAqIENoZWNrICJkZXZpY2UuaCIgZm9yIGRldGFpbHMKKyAqLworc3RhdGljIHNzaXplX3Qgc3RvcmVfcmVnaXN0ZXJzKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCSAgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgICAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgY2kxM3h4eCAqdWRjID0gY29udGFpbmVyX29mKGRldiwgc3RydWN0IGNpMTN4eHgsIGdhZGdldC5kZXYpOworCXVuc2lnbmVkIGxvbmcgYWRkciwgZGF0YSwgZmxhZ3M7CisKKwlkYmdfdHJhY2UoIlslc10gJXAsICVkXG4iLCBfX2Z1bmNfXywgYnVmLCBjb3VudCk7CisJaWYgKGF0dHIgPT0gTlVMTCB8fCBidWYgPT0gTlVMTCkgeworCQlkZXZfZXJyKGRldiwgIlslc10gRUlOVkFMXG4iLCBfX2Z1bmNfXyk7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlpZiAoc3NjYW5mKGJ1ZiwgIiVsaSAlbGkiLCAmYWRkciwgJmRhdGEpICE9IDIpIHsKKwkJZGV2X2VycihkZXYsICI8YWRkcj4gPGRhdGE+OiB3cml0ZSBkYXRhIHRvIHJlZ2lzdGVyIGFkZHJlc3MiKTsKKwkJZ290byBkb25lOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKHVkYy0+bG9jaywgZmxhZ3MpOworCWlmIChod19yZWdpc3Rlcl93cml0ZShhZGRyLCBkYXRhKSkKKwkJZGV2X2VycihkZXYsICJpbnZhbGlkIGFkZHJlc3MgcmFuZ2VcbiIpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUodWRjLT5sb2NrLCBmbGFncyk7CisKKyBkb25lOgorCXJldHVybiBjb3VudDsKK30KK3N0YXRpYyBERVZJQ0VfQVRUUihyZWdpc3RlcnMsIFNfSVJVU1IgfCBTX0lXVVNSLAorCQkgICBzaG93X3JlZ2lzdGVycywgc3RvcmVfcmVnaXN0ZXJzKTsKKworLyoqCisgKiBzaG93X3JlcXVlc3RzOiBETUEgY29udGVudHMgb2YgYWxsIHJlcXVlc3RzIGN1cnJlbnRseSBxdWV1ZWQgKGFsbCBlbmRwdHMpCisgKgorICogQ2hlY2sgImRldmljZS5oIiBmb3IgZGV0YWlscworICovCitzdGF0aWMgc3NpemVfdCBzaG93X3JlcXVlc3RzKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICAgIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgY2kxM3h4eCAqdWRjID0gY29udGFpbmVyX29mKGRldiwgc3RydWN0IGNpMTN4eHgsIGdhZGdldC5kZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGxpc3RfaGVhZCAgICpwdHIgPSBOVUxMOworCXN0cnVjdCBjaTEzeHh4X3JlcSAqcmVxID0gTlVMTDsKKwl1bnNpZ25lZCBpLCBqLCBrLCBuID0gMCwgcVNpemUgPSBzaXplb2Yoc3RydWN0IGNpMTN4eHhfdGQpL3NpemVvZih1MzIpOworCisJZGJnX3RyYWNlKCJbJXNdICVwXG4iLCBfX2Z1bmNfXywgYnVmKTsKKwlpZiAoYXR0ciA9PSBOVUxMIHx8IGJ1ZiA9PSBOVUxMKSB7CisJCWRldl9lcnIoZGV2LCAiWyVzXSBFSU5WQUxcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIDA7CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUodWRjLT5sb2NrLCBmbGFncyk7CisJZm9yIChpID0gMDsgaSA8IGh3X2VwX21heDsgaSsrKQorCQlmb3IgKGsgPSBSWDsgayA8PSBUWDsgaysrKQorCQkJbGlzdF9mb3JfZWFjaChwdHIsICZ1ZGMtPmNpMTN4eHhfZXBbaV0ucWhba10ucXVldWUpCisJCQl7CisJCQkJcmVxID0gbGlzdF9lbnRyeShwdHIsCisJCQkJCQkgc3RydWN0IGNpMTN4eHhfcmVxLCBxdWV1ZSk7CisKKwkJCQluICs9IHNjbnByaW50ZihidWYgKyBuLCBQQUdFX1NJWkUgLSBuLAorCQkJCQkgICAgICAgIkVQPSUwMmk6IFREPSUwOFggJXNcbiIsCisJCQkJCSAgICAgICBpLCAodTMyKXJlcS0+ZG1hLAorCQkJCQkgICAgICAgKChrID09IFJYKSA/ICJSWCIgOiAiVFgiKSk7CisKKwkJCQlmb3IgKGogPSAwOyBqIDwgcVNpemU7IGorKykKKwkJCQkJbiArPSBzY25wcmludGYoYnVmICsgbiwgUEFHRV9TSVpFIC0gbiwKKwkJCQkJCSAgICAgICAiICUwNFg6ICAgICUwOFhcbiIsIGosCisJCQkJCQkgICAgICAgKigodTMyICopcmVxLT5wdHIgKyBqKSk7CisJCQl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSh1ZGMtPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiBuOworfQorc3RhdGljIERFVklDRV9BVFRSKHJlcXVlc3RzLCBTX0lSVVNSLCBzaG93X3JlcXVlc3RzLCBOVUxMKTsKKworLyoqCisgKiBkYmdfY3JlYXRlX2ZpbGVzOiBpbml0aWFsaXplcyB0aGUgYXR0cmlidXRlIGludGVyZmFjZQorICogQGRldjogZGV2aWNlCisgKgorICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIGFuIGVycm9yIGNvZGUKKyAqLworX19tYXliZV91bnVzZWQgc3RhdGljIGludCBkYmdfY3JlYXRlX2ZpbGVzKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlpbnQgcmV0dmFsID0gMDsKKworCWlmIChkZXYgPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dmFsID0gZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJmRldl9hdHRyX2RldmljZSk7CisJaWYgKHJldHZhbCkKKwkJZ290byBkb25lOworCXJldHZhbCA9IGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl9kcml2ZXIpOworCWlmIChyZXR2YWwpCisJCWdvdG8gcm1fZGV2aWNlOworCXJldHZhbCA9IGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl9ldmVudHMpOworCWlmIChyZXR2YWwpCisJCWdvdG8gcm1fZHJpdmVyOworCXJldHZhbCA9IGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl9pbnRlcnMpOworCWlmIChyZXR2YWwpCisJCWdvdG8gcm1fZXZlbnRzOworCXJldHZhbCA9IGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl9wb3J0X3Rlc3QpOworCWlmIChyZXR2YWwpCisJCWdvdG8gcm1faW50ZXJzOworCXJldHZhbCA9IGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl9xaGVhZHMpOworCWlmIChyZXR2YWwpCisJCWdvdG8gcm1fcG9ydF90ZXN0OworCXJldHZhbCA9IGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl9yZWdpc3RlcnMpOworCWlmIChyZXR2YWwpCisJCWdvdG8gcm1fcWhlYWRzOworCXJldHZhbCA9IGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl9yZXF1ZXN0cyk7CisJaWYgKHJldHZhbCkKKwkJZ290byBybV9yZWdpc3RlcnM7CisJcmV0dXJuIDA7CisKKyBybV9yZWdpc3RlcnM6CisJZGV2aWNlX3JlbW92ZV9maWxlKGRldiwgJmRldl9hdHRyX3JlZ2lzdGVycyk7Cisgcm1fcWhlYWRzOgorCWRldmljZV9yZW1vdmVfZmlsZShkZXYsICZkZXZfYXR0cl9xaGVhZHMpOworIHJtX3BvcnRfdGVzdDoKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfcG9ydF90ZXN0KTsKKyBybV9pbnRlcnM6CisJZGV2aWNlX3JlbW92ZV9maWxlKGRldiwgJmRldl9hdHRyX2ludGVycyk7Cisgcm1fZXZlbnRzOgorCWRldmljZV9yZW1vdmVfZmlsZShkZXYsICZkZXZfYXR0cl9ldmVudHMpOworIHJtX2RyaXZlcjoKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfZHJpdmVyKTsKKyBybV9kZXZpY2U6CisJZGV2aWNlX3JlbW92ZV9maWxlKGRldiwgJmRldl9hdHRyX2RldmljZSk7CisgZG9uZToKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKioKKyAqIGRiZ19yZW1vdmVfZmlsZXM6IGRlc3Ryb3lzIHRoZSBhdHRyaWJ1dGUgaW50ZXJmYWNlCisgKiBAZGV2OiBkZXZpY2UKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYW4gZXJyb3IgY29kZQorICovCitfX21heWJlX3VudXNlZCBzdGF0aWMgaW50IGRiZ19yZW1vdmVfZmlsZXMoc3RydWN0IGRldmljZSAqZGV2KQoreworCWlmIChkZXYgPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJZGV2aWNlX3JlbW92ZV9maWxlKGRldiwgJmRldl9hdHRyX3JlcXVlc3RzKTsKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfcmVnaXN0ZXJzKTsKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfcWhlYWRzKTsKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfcG9ydF90ZXN0KTsKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfaW50ZXJzKTsKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfZXZlbnRzKTsKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfZHJpdmVyKTsKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfZGV2aWNlKTsKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogVVRJTCBibG9jaworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgKiBfdXNiX2FkZHI6IGNhbGN1bGF0ZXMgZW5kcG9pbnQgYWRkcmVzcyBmcm9tIGRpcmVjdGlvbiAmIG51bWJlcgorICogQGVwOiAgZW5kcG9pbnQKKyAqLworc3RhdGljIGlubGluZSB1OCBfdXNiX2FkZHIoc3RydWN0IGNpMTN4eHhfZXAgKmVwKQoreworCXJldHVybiAoKGVwLT5kaXIgPT0gVFgpID8gVVNCX0VORFBPSU5UX0RJUl9NQVNLIDogMCkgfCBlcC0+bnVtOworfQorCisvKioKKyAqIF9oYXJkd2FyZV9xdWV1ZTogY29uZmlndXJlcyBhIHJlcXVlc3QgYXQgaGFyZHdhcmUgbGV2ZWwKKyAqIEBnYWRnZXQ6IGdhZGdldAorICogQG1FcDogICAgZW5kcG9pbnQKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYW4gZXJyb3IgY29kZQorICovCitzdGF0aWMgaW50IF9oYXJkd2FyZV9lbnF1ZXVlKHN0cnVjdCBjaTEzeHh4X2VwICptRXAsIHN0cnVjdCBjaTEzeHh4X3JlcSAqbVJlcSkKK3sKKwl1bnNpZ25lZCBpOworCisJdHJhY2UoIiVwLCAlcCIsIG1FcCwgbVJlcSk7CisKKwkvKiBkb24ndCBxdWV1ZSB0d2ljZSAqLworCWlmIChtUmVxLT5yZXEuc3RhdHVzID09IC1FQUxSRUFEWSkKKwkJcmV0dXJuIC1FQUxSRUFEWTsKKworCWlmIChod19lcF9pc19wcmltZWQobUVwLT5udW0sIG1FcC0+ZGlyKSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCW1SZXEtPnJlcS5zdGF0dXMgPSAtRUFMUkVBRFk7CisKKwlpZiAobVJlcS0+cmVxLmxlbmd0aCAmJiAhbVJlcS0+cmVxLmRtYSkgeworCQltUmVxLT5yZXEuZG1hID0gXAorCQkJZG1hX21hcF9zaW5nbGUobUVwLT5kZXZpY2UsIG1SZXEtPnJlcS5idWYsCisJCQkJICAgICAgIG1SZXEtPnJlcS5sZW5ndGgsIG1FcC0+ZGlyID8KKwkJCQkgICAgICAgRE1BX1RPX0RFVklDRSA6IERNQV9GUk9NX0RFVklDRSk7CisJCWlmIChtUmVxLT5yZXEuZG1hID09IDApCisJCQlyZXR1cm4gLUVOT01FTTsKKworCQltUmVxLT5tYXAgPSAxOworCX0KKworCS8qCisJICogVEQgY29uZmlndXJhdGlvbgorCSAqIFRPRE8gLSBoYW5kbGUgcmVxdWVzdHMgd2hpY2ggc3Bhd25zIGludG8gc2V2ZXJhbCBURHMKKwkgKi8KKwltZW1zZXQobVJlcS0+cHRyLCAwLCBzaXplb2YoKm1SZXEtPnB0cikpOworCW1SZXEtPnB0ci0+bmV4dCAgICB8PSBURF9URVJNSU5BVEU7CisJbVJlcS0+cHRyLT50b2tlbiAgICA9IG1SZXEtPnJlcS5sZW5ndGggPDwgZmZzX25yKFREX1RPVEFMX0JZVEVTKTsKKwltUmVxLT5wdHItPnRva2VuICAgJj0gVERfVE9UQUxfQllURVM7CisJbVJlcS0+cHRyLT50b2tlbiAgIHw9IFREX0lPQzsKKwltUmVxLT5wdHItPnRva2VuICAgfD0gVERfU1RBVFVTX0FDVElWRTsKKwltUmVxLT5wdHItPnBhZ2VbMF0gID0gbVJlcS0+cmVxLmRtYTsKKwlmb3IgKGkgPSAxOyBpIDwgNTsgaSsrKQorCQltUmVxLT5wdHItPnBhZ2VbaV0gPQorCQkJKG1SZXEtPnJlcS5kbWEgKyBpICogUEFHRV9TSVpFKSAmIH5URF9SRVNFUlZFRF9NQVNLOworCisJLyoKKwkgKiAgUUggY29uZmlndXJhdGlvbgorCSAqICBBdCB0aGlzIHBvaW50IGl0J3MgZ3VhcmFudGVlZCBleGNsdXNpdmUgYWNjZXNzIHRvIHFoZWFkCisJICogIChlbmRwdCBpcyBub3QgcHJpbWVkKSBzbyBpdCdzIG5vIG5lZWQgdG8gdXNlIHRyaXB3aXJlCisJICovCisJbUVwLT5xaFttRXAtPmRpcl0ucHRyLT50ZC5uZXh0ICAgPSBtUmVxLT5kbWE7ICAgIC8qIFRFUk1JTkFURSA9IDAgKi8KKwltRXAtPnFoW21FcC0+ZGlyXS5wdHItPnRkLnRva2VuICY9IH5URF9TVEFUVVM7ICAgLyogY2xlYXIgc3RhdHVzICovCisJaWYgKG1SZXEtPnJlcS56ZXJvID09IDApCisJCW1FcC0+cWhbbUVwLT5kaXJdLnB0ci0+Y2FwIHw9ICBRSF9aTFQ7CisJZWxzZQorCQltRXAtPnFoW21FcC0+ZGlyXS5wdHItPmNhcCAmPSB+UUhfWkxUOworCisJd21iKCk7ICAgLyogc3luY2hyb25pemUgYmVmb3JlIGVwIHByaW1lICovCisKKwlyZXR1cm4gaHdfZXBfcHJpbWUobUVwLT5udW0sIG1FcC0+ZGlyLAorCQkJICAgbUVwLT50eXBlID09IFVTQl9FTkRQT0lOVF9YRkVSX0NPTlRST0wpOworfQorCisvKioKKyAqIF9oYXJkd2FyZV9kZXF1ZXVlOiBoYW5kbGVzIGEgcmVxdWVzdCBhdCBoYXJkd2FyZSBsZXZlbAorICogQGdhZGdldDogZ2FkZ2V0CisgKiBAbUVwOiAgICBlbmRwb2ludAorICoKKyAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhbiBlcnJvciBjb2RlCisgKi8KK3N0YXRpYyBpbnQgX2hhcmR3YXJlX2RlcXVldWUoc3RydWN0IGNpMTN4eHhfZXAgKm1FcCwgc3RydWN0IGNpMTN4eHhfcmVxICptUmVxKQoreworCXRyYWNlKCIlcCwgJXAiLCBtRXAsIG1SZXEpOworCisJaWYgKG1SZXEtPnJlcS5zdGF0dXMgIT0gLUVBTFJFQURZKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChod19lcF9pc19wcmltZWQobUVwLT5udW0sIG1FcC0+ZGlyKSkKKwkJaHdfZXBfZmx1c2gobUVwLT5udW0sIG1FcC0+ZGlyKTsKKworCW1SZXEtPnJlcS5zdGF0dXMgPSAwOworCisJaWYgKG1SZXEtPm1hcCkgeworCQlkbWFfdW5tYXBfc2luZ2xlKG1FcC0+ZGV2aWNlLCBtUmVxLT5yZXEuZG1hLCBtUmVxLT5yZXEubGVuZ3RoLAorCQkJCSBtRXAtPmRpciA/IERNQV9UT19ERVZJQ0UgOiBETUFfRlJPTV9ERVZJQ0UpOworCQltUmVxLT5yZXEuZG1hID0gMDsKKwkJbVJlcS0+bWFwICAgICA9IDA7CisJfQorCisJbVJlcS0+cmVxLnN0YXR1cyA9IG1SZXEtPnB0ci0+dG9rZW4gJiBURF9TVEFUVVM7CisJaWYgICAgICAoKFREX1NUQVRVU19BQ1RJVkUgJiBtUmVxLT5yZXEuc3RhdHVzKSAhPSAwKQorCQltUmVxLT5yZXEuc3RhdHVzID0gLUVDT05OUkVTRVQ7CisJZWxzZSBpZiAoKFREX1NUQVRVU19IQUxURUQgJiBtUmVxLT5yZXEuc3RhdHVzKSAhPSAwKQorCQltUmVxLT5yZXEuc3RhdHVzID0gLTE7CisJZWxzZSBpZiAoKFREX1NUQVRVU19EVF9FUlIgJiBtUmVxLT5yZXEuc3RhdHVzKSAhPSAwKQorCQltUmVxLT5yZXEuc3RhdHVzID0gLTE7CisJZWxzZSBpZiAoKFREX1NUQVRVU19UUl9FUlIgJiBtUmVxLT5yZXEuc3RhdHVzKSAhPSAwKQorCQltUmVxLT5yZXEuc3RhdHVzID0gLTE7CisKKwltUmVxLT5yZXEuYWN0dWFsICAgPSBtUmVxLT5wdHItPnRva2VuICYgVERfVE9UQUxfQllURVM7CisJbVJlcS0+cmVxLmFjdHVhbCA+Pj0gZmZzX25yKFREX1RPVEFMX0JZVEVTKTsKKwltUmVxLT5yZXEuYWN0dWFsICAgPSBtUmVxLT5yZXEubGVuZ3RoIC0gbVJlcS0+cmVxLmFjdHVhbDsKKwltUmVxLT5yZXEuYWN0dWFsICAgPSBtUmVxLT5yZXEuc3RhdHVzID8gMCA6IG1SZXEtPnJlcS5hY3R1YWw7CisKKwlyZXR1cm4gbVJlcS0+cmVxLmFjdHVhbDsKK30KKworLyoqCisgKiBfZXBfbnVrZTogZGVxdWV1ZXMgYWxsIGVuZHBvaW50IHJlcXVlc3RzCisgKiBAbUVwOiBlbmRwb2ludAorICoKKyAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhbiBlcnJvciBjb2RlCisgKiBDYWxsZXIgbXVzdCBob2xkIGxvY2sKKyAqLworc3RhdGljIGludCBfZXBfbnVrZShzdHJ1Y3QgY2kxM3h4eF9lcCAqbUVwKQorX19yZWxlYXNlcyhtRXAtPmxvY2spCitfX2FjcXVpcmVzKG1FcC0+bG9jaykKK3sKKwl0cmFjZSgiJXAiLCBtRXApOworCisJaWYgKG1FcCA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWh3X2VwX2ZsdXNoKG1FcC0+bnVtLCBtRXAtPmRpcik7CisKKwl3aGlsZSAoIWxpc3RfZW1wdHkoJm1FcC0+cWhbbUVwLT5kaXJdLnF1ZXVlKSkgeworCisJCS8qIHBvcCBvbGRlc3QgcmVxdWVzdCAqLworCQlzdHJ1Y3QgY2kxM3h4eF9yZXEgKm1SZXEgPSBcCisJCQlsaXN0X2VudHJ5KG1FcC0+cWhbbUVwLT5kaXJdLnF1ZXVlLm5leHQsCisJCQkJICAgc3RydWN0IGNpMTN4eHhfcmVxLCBxdWV1ZSk7CisJCWxpc3RfZGVsX2luaXQoJm1SZXEtPnF1ZXVlKTsKKwkJbVJlcS0+cmVxLnN0YXR1cyA9IC1FU0hVVERPV047CisKKwkJaWYgKCFtUmVxLT5yZXEubm9faW50ZXJydXB0ICYmIG1SZXEtPnJlcS5jb21wbGV0ZSAhPSBOVUxMKSB7CisJCQlzcGluX3VubG9jayhtRXAtPmxvY2spOworCQkJbVJlcS0+cmVxLmNvbXBsZXRlKCZtRXAtPmVwLCAmbVJlcS0+cmVxKTsKKwkJCXNwaW5fbG9jayhtRXAtPmxvY2spOworCQl9CisJfQorCXJldHVybiAwOworfQorCisvKioKKyAqIF9nYWRnZXRfc3RvcF9hY3Rpdml0eTogc3RvcHMgYWxsIFVTQiBhY3Rpdml0eSwgZmx1c2hlcyAmIGRpc2FibGVzIGFsbCBlbmRwdHMKKyAqIEBnYWRnZXQ6IGdhZGdldAorICoKKyAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhbiBlcnJvciBjb2RlCisgKiBDYWxsZXIgbXVzdCBob2xkIGxvY2sKKyAqLworc3RhdGljIGludCBfZ2FkZ2V0X3N0b3BfYWN0aXZpdHkoc3RydWN0IHVzYl9nYWRnZXQgKmdhZGdldCkKK19fcmVsZWFzZXModWRjLT5sb2NrKQorX19hY3F1aXJlcyh1ZGMtPmxvY2spCit7CisJc3RydWN0IHVzYl9lcCAqZXA7CisJc3RydWN0IGNpMTN4eHggICAgKnVkYyA9IGNvbnRhaW5lcl9vZihnYWRnZXQsIHN0cnVjdCBjaTEzeHh4LCBnYWRnZXQpOworCXN0cnVjdCBjaTEzeHh4X2VwICptRXAgPSBjb250YWluZXJfb2YoZ2FkZ2V0LT5lcDAsCisJCQkJCSAgICAgIHN0cnVjdCBjaTEzeHh4X2VwLCBlcCk7CisKKwl0cmFjZSgiJXAiLCBnYWRnZXQpOworCisJaWYgKGdhZGdldCA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXNwaW5fdW5sb2NrKHVkYy0+bG9jayk7CisKKwkvKiBmbHVzaCBhbGwgZW5kcG9pbnRzICovCisJZ2FkZ2V0X2Zvcl9lYWNoX2VwKGVwLCBnYWRnZXQpIHsKKwkJdXNiX2VwX2ZpZm9fZmx1c2goZXApOworCX0KKwl1c2JfZXBfZmlmb19mbHVzaChnYWRnZXQtPmVwMCk7CisKKwl1ZGMtPmRyaXZlci0+ZGlzY29ubmVjdChnYWRnZXQpOworCisJLyogbWFrZSBzdXJlIHRvIGRpc2FibGUgYWxsIGVuZHBvaW50cyAqLworCWdhZGdldF9mb3JfZWFjaF9lcChlcCwgZ2FkZ2V0KSB7CisJCXVzYl9lcF9kaXNhYmxlKGVwKTsKKwl9CisJdXNiX2VwX2Rpc2FibGUoZ2FkZ2V0LT5lcDApOworCisJaWYgKG1FcC0+c3RhdHVzICE9IE5VTEwpIHsKKwkJdXNiX2VwX2ZyZWVfcmVxdWVzdChnYWRnZXQtPmVwMCwgbUVwLT5zdGF0dXMpOworCQltRXAtPnN0YXR1cyA9IE5VTEw7CisJfQorCisJc3Bpbl9sb2NrKHVkYy0+bG9jayk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSVNSIGJsb2NrCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioKKyAqIGlzcl9yZXNldF9oYW5kbGVyOiBVU0IgcmVzZXQgaW50ZXJydXB0IGhhbmRsZXIKKyAqIEB1ZGM6IFVEQyBkZXZpY2UKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJlc2V0cyBVU0IgZW5naW5lIGFmdGVyIGEgYnVzIHJlc2V0IG9jY3VycmVkCisgKi8KK3N0YXRpYyB2b2lkIGlzcl9yZXNldF9oYW5kbGVyKHN0cnVjdCBjaTEzeHh4ICp1ZGMpCitfX3JlbGVhc2VzKHVkYy0+bG9jaykKK19fYWNxdWlyZXModWRjLT5sb2NrKQoreworCXN0cnVjdCBjaTEzeHh4X2VwICptRXAgPSAmdWRjLT5jaTEzeHh4X2VwWzBdOworCWludCByZXR2YWw7CisKKwl0cmFjZSgiJXAiLCB1ZGMpOworCisJaWYgKHVkYyA9PSBOVUxMKSB7CisJCWVycigiRUlOVkFMIik7CisJCXJldHVybjsKKwl9CisKKwlkYmdfZXZlbnQoMHhGRiwgIkJVUyBSU1QiLCAwKTsKKworCXJldHZhbCA9IF9nYWRnZXRfc3RvcF9hY3Rpdml0eSgmdWRjLT5nYWRnZXQpOworCWlmIChyZXR2YWwpCisJCWdvdG8gZG9uZTsKKworCXJldHZhbCA9IGh3X3VzYl9yZXNldCgpOworCWlmIChyZXR2YWwpCisJCWdvdG8gZG9uZTsKKworCXNwaW5fdW5sb2NrKHVkYy0+bG9jayk7CisJcmV0dmFsID0gdXNiX2VwX2VuYWJsZSgmbUVwLT5lcCwgJmN0cmxfZW5kcHRfZGVzYyk7CisJaWYgKCFyZXR2YWwpIHsKKwkJbUVwLT5zdGF0dXMgPSB1c2JfZXBfYWxsb2NfcmVxdWVzdCgmbUVwLT5lcCwgR0ZQX0tFUk5FTCk7CisJCWlmIChtRXAtPnN0YXR1cyA9PSBOVUxMKSB7CisJCQl1c2JfZXBfZGlzYWJsZSgmbUVwLT5lcCk7CisJCQlyZXR2YWwgPSAtRU5PTUVNOworCQl9CisJfQorCXNwaW5fbG9jayh1ZGMtPmxvY2spOworCisgZG9uZToKKwlpZiAocmV0dmFsKQorCQllcnIoImVycm9yOiAlaSIsIHJldHZhbCk7Cit9CisKKy8qKgorICogaXNyX2dldF9zdGF0dXNfY29tcGxldGU6IGdldF9zdGF0dXMgcmVxdWVzdCBjb21wbGV0ZSBmdW5jdGlvbgorICogQGVwOiAgZW5kcG9pbnQKKyAqIEByZXE6IHJlcXVlc3QgaGFuZGxlZAorICoKKyAqIENhbGxlciBtdXN0IHJlbGVhc2UgbG9jaworICovCitzdGF0aWMgdm9pZCBpc3JfZ2V0X3N0YXR1c19jb21wbGV0ZShzdHJ1Y3QgdXNiX2VwICplcCwgc3RydWN0IHVzYl9yZXF1ZXN0ICpyZXEpCit7CisJdHJhY2UoIiVwLCAlcCIsIGVwLCByZXEpOworCisJaWYgKGVwID09IE5VTEwgfHwgcmVxID09IE5VTEwpIHsKKwkJZXJyKCJFSU5WQUwiKTsKKwkJcmV0dXJuOworCX0KKworCWtmcmVlKHJlcS0+YnVmKTsKKwl1c2JfZXBfZnJlZV9yZXF1ZXN0KGVwLCByZXEpOworfQorCisvKioKKyAqIGlzcl9nZXRfc3RhdHVzX3Jlc3BvbnNlOiBnZXRfc3RhdHVzIHJlcXVlc3QgcmVzcG9uc2UKKyAqIEBlcDogICAgZW5kcG9pbnQKKyAqIEBzZXR1cDogc2V0dXAgcmVxdWVzdCBwYWNrZXQKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYW4gZXJyb3IgY29kZQorICovCitzdGF0aWMgaW50IGlzcl9nZXRfc3RhdHVzX3Jlc3BvbnNlKHN0cnVjdCBjaTEzeHh4X2VwICptRXAsCisJCQkJICAgc3RydWN0IHVzYl9jdHJscmVxdWVzdCAqc2V0dXApCitfX3JlbGVhc2VzKG1FcC0+bG9jaykKK19fYWNxdWlyZXMobUVwLT5sb2NrKQoreworCXN0cnVjdCB1c2JfcmVxdWVzdCAqcmVxID0gTlVMTDsKKwlnZnBfdCBnZnBfZmxhZ3MgPSBHRlBfQVRPTUlDOworCWludCBkaXIsIG51bSwgcmV0dmFsOworCisJdHJhY2UoIiVwLCAlcCIsIG1FcCwgc2V0dXApOworCisJaWYgKG1FcCA9PSBOVUxMIHx8IHNldHVwID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCisJc3Bpbl91bmxvY2sobUVwLT5sb2NrKTsKKwlyZXEgPSB1c2JfZXBfYWxsb2NfcmVxdWVzdCgmbUVwLT5lcCwgZ2ZwX2ZsYWdzKTsKKwlzcGluX2xvY2sobUVwLT5sb2NrKTsKKwlpZiAocmVxID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJcmVxLT5jb21wbGV0ZSA9IGlzcl9nZXRfc3RhdHVzX2NvbXBsZXRlOworCXJlcS0+bGVuZ3RoICAgPSAyOworCXJlcS0+YnVmICAgICAgPSBremFsbG9jKHJlcS0+bGVuZ3RoLCBnZnBfZmxhZ3MpOworCWlmIChyZXEtPmJ1ZiA9PSBOVUxMKSB7CisJCXJldHZhbCA9IC1FTk9NRU07CisJCWdvdG8gZXJyX2ZyZWVfcmVxOworCX0KKworCWlmICgoc2V0dXAtPmJSZXF1ZXN0VHlwZSAmIFVTQl9SRUNJUF9NQVNLKSA9PSBVU0JfUkVDSVBfREVWSUNFKSB7CisJCS8qIFRPRE86IEQxIC0gUmVtb3RlIFdha2V1cDsgRDAgLSBTZWxmIFBvd2VyZWQgKi8KKwkJcmV0dmFsID0gMDsKKwl9IGVsc2UgaWYgKChzZXR1cC0+YlJlcXVlc3RUeXBlICYgVVNCX1JFQ0lQX01BU0spIFwKKwkJICAgPT0gVVNCX1JFQ0lQX0VORFBPSU5UKSB7CisJCWRpciA9IChsZTE2X3RvX2NwdShzZXR1cC0+d0luZGV4KSAmIFVTQl9FTkRQT0lOVF9ESVJfTUFTSykgPworCQkJVFggOiBSWDsKKwkJbnVtID0gIGxlMTZfdG9fY3B1KHNldHVwLT53SW5kZXgpICYgVVNCX0VORFBPSU5UX05VTUJFUl9NQVNLOworCQkqKCh1MTYgKilyZXEtPmJ1ZikgPSBod19lcF9nZXRfaGFsdChudW0sIGRpcik7CisJfQorCS8qIGVsc2UgZG8gbm90aGluZzsgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UgKi8KKworCXNwaW5fdW5sb2NrKG1FcC0+bG9jayk7CisJcmV0dmFsID0gdXNiX2VwX3F1ZXVlKCZtRXAtPmVwLCByZXEsIGdmcF9mbGFncyk7CisJc3Bpbl9sb2NrKG1FcC0+bG9jayk7CisJaWYgKHJldHZhbCkKKwkJZ290byBlcnJfZnJlZV9idWY7CisKKwlyZXR1cm4gMDsKKworIGVycl9mcmVlX2J1ZjoKKwlrZnJlZShyZXEtPmJ1Zik7CisgZXJyX2ZyZWVfcmVxOgorCXNwaW5fdW5sb2NrKG1FcC0+bG9jayk7CisJdXNiX2VwX2ZyZWVfcmVxdWVzdCgmbUVwLT5lcCwgcmVxKTsKKwlzcGluX2xvY2sobUVwLT5sb2NrKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKioKKyAqIGlzcl9zZXR1cF9zdGF0dXNfcGhhc2U6IHF1ZXVlcyB0aGUgc3RhdHVzIHBoYXNlIG9mIGEgc2V0dXAgdHJhbnNhdGlvbgorICogQG1FcDogZW5kcG9pbnQKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYW4gZXJyb3IgY29kZQorICovCitzdGF0aWMgaW50IGlzcl9zZXR1cF9zdGF0dXNfcGhhc2Uoc3RydWN0IGNpMTN4eHhfZXAgKm1FcCkKK19fcmVsZWFzZXMobUVwLT5sb2NrKQorX19hY3F1aXJlcyhtRXAtPmxvY2spCit7CisJaW50IHJldHZhbDsKKworCXRyYWNlKCIlcCIsIG1FcCk7CisKKwkvKiBtRXAgaXMgYWx3YXlzIHZhbGlkICYgY29uZmlndXJlZCAqLworCisJaWYgKG1FcC0+dHlwZSA9PSBVU0JfRU5EUE9JTlRfWEZFUl9DT05UUk9MKQorCQltRXAtPmRpciA9IChtRXAtPmRpciA9PSBUWCkgPyBSWCA6IFRYOworCisJbUVwLT5zdGF0dXMtPm5vX2ludGVycnVwdCA9IDE7CisKKwlzcGluX3VubG9jayhtRXAtPmxvY2spOworCXJldHZhbCA9IHVzYl9lcF9xdWV1ZSgmbUVwLT5lcCwgbUVwLT5zdGF0dXMsIEdGUF9BVE9NSUMpOworCXNwaW5fbG9jayhtRXAtPmxvY2spOworCisJcmV0dXJuIHJldHZhbDsKK30KKworLyoqCisgKiBpc3JfdHJfY29tcGxldGVfbG93OiB0cmFuc2FjdGlvbiBjb21wbGV0ZSBsb3cgbGV2ZWwgaGFuZGxlcgorICogQG1FcDogZW5kcG9pbnQKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYW4gZXJyb3IgY29kZQorICogQ2FsbGVyIG11c3QgaG9sZCBsb2NrCisgKi8KK3N0YXRpYyBpbnQgaXNyX3RyX2NvbXBsZXRlX2xvdyhzdHJ1Y3QgY2kxM3h4eF9lcCAqbUVwKQorX19yZWxlYXNlcyhtRXAtPmxvY2spCitfX2FjcXVpcmVzKG1FcC0+bG9jaykKK3sKKwlzdHJ1Y3QgY2kxM3h4eF9yZXEgKm1SZXE7CisJaW50IHJldHZhbDsKKworCXRyYWNlKCIlcCIsIG1FcCk7CisKKwlpZiAobGlzdF9lbXB0eSgmbUVwLT5xaFttRXAtPmRpcl0ucXVldWUpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIHBvcCBvbGRlc3QgcmVxdWVzdCAqLworCW1SZXEgPSBsaXN0X2VudHJ5KG1FcC0+cWhbbUVwLT5kaXJdLnF1ZXVlLm5leHQsCisJCQkgIHN0cnVjdCBjaTEzeHh4X3JlcSwgcXVldWUpOworCWxpc3RfZGVsX2luaXQoJm1SZXEtPnF1ZXVlKTsKKworCXJldHZhbCA9IF9oYXJkd2FyZV9kZXF1ZXVlKG1FcCwgbVJlcSk7CisJaWYgKHJldHZhbCA8IDApIHsKKwkJZGJnX2V2ZW50KF91c2JfYWRkcihtRXApLCAiRE9ORSIsIHJldHZhbCk7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlkYmdfZG9uZShfdXNiX2FkZHIobUVwKSwgbVJlcS0+cHRyLT50b2tlbiwgcmV0dmFsKTsKKworCWlmICghbVJlcS0+cmVxLm5vX2ludGVycnVwdCAmJiBtUmVxLT5yZXEuY29tcGxldGUgIT0gTlVMTCkgeworCQlzcGluX3VubG9jayhtRXAtPmxvY2spOworCQltUmVxLT5yZXEuY29tcGxldGUoJm1FcC0+ZXAsICZtUmVxLT5yZXEpOworCQlzcGluX2xvY2sobUVwLT5sb2NrKTsKKwl9CisKKwlpZiAoIWxpc3RfZW1wdHkoJm1FcC0+cWhbbUVwLT5kaXJdLnF1ZXVlKSkgeworCQltUmVxID0gbGlzdF9lbnRyeShtRXAtPnFoW21FcC0+ZGlyXS5xdWV1ZS5uZXh0LAorCQkJCSAgc3RydWN0IGNpMTN4eHhfcmVxLCBxdWV1ZSk7CisJCV9oYXJkd2FyZV9lbnF1ZXVlKG1FcCwgbVJlcSk7CisJfQorCisgZG9uZToKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKioKKyAqIGlzcl90cl9jb21wbGV0ZV9oYW5kbGVyOiB0cmFuc2FjdGlvbiBjb21wbGV0ZSBpbnRlcnJ1cHQgaGFuZGxlcgorICogQHVkYzogVURDIGRlc2NyaXB0b3IKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgdHJhZmZpYyBldmVudHMKKyAqLworc3RhdGljIHZvaWQgaXNyX3RyX2NvbXBsZXRlX2hhbmRsZXIoc3RydWN0IGNpMTN4eHggKnVkYykKK19fcmVsZWFzZXModWRjLT5sb2NrKQorX19hY3F1aXJlcyh1ZGMtPmxvY2spCit7CisJdW5zaWduZWQgaTsKKworCXRyYWNlKCIlcCIsIHVkYyk7CisKKwlpZiAodWRjID09IE5VTEwpIHsKKwkJZXJyKCJFSU5WQUwiKTsKKwkJcmV0dXJuOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBod19lcF9tYXg7IGkrKykgeworCQlzdHJ1Y3QgY2kxM3h4eF9lcCAqbUVwICA9ICZ1ZGMtPmNpMTN4eHhfZXBbaV07CisJCWludCB0eXBlLCBudW0sIGVyciA9IC1FSU5WQUw7CisJCXN0cnVjdCB1c2JfY3RybHJlcXVlc3QgcmVxOworCisKKwkJaWYgKG1FcC0+ZGVzYyA9PSBOVUxMKQorCQkJY29udGludWU7ICAgLyogbm90IGNvbmZpZ3VyZWQgKi8KKworCQlpZiAoKG1FcC0+ZGlyID09IFJYICYmIGh3X3Rlc3RfYW5kX2NsZWFyX2NvbXBsZXRlKGkpKSB8fAorCQkgICAgKG1FcC0+ZGlyID09IFRYICYmIGh3X3Rlc3RfYW5kX2NsZWFyX2NvbXBsZXRlKGkgKyAxNikpKSB7CisJCQllcnIgPSBpc3JfdHJfY29tcGxldGVfbG93KG1FcCk7CisJCQlpZiAobUVwLT50eXBlID09IFVTQl9FTkRQT0lOVF9YRkVSX0NPTlRST0wpIHsKKwkJCQlpZiAoZXJyID4gMCkgICAvKiBuZWVkcyBzdGF0dXMgcGhhc2UgKi8KKwkJCQkJZXJyID0gaXNyX3NldHVwX3N0YXR1c19waGFzZShtRXApOworCQkJCWlmIChlcnIgPCAwKSB7CisJCQkJCWRiZ19ldmVudChfdXNiX2FkZHIobUVwKSwKKwkJCQkJCSAgIkVSUk9SIiwgZXJyKTsKKwkJCQkJc3Bpbl91bmxvY2sodWRjLT5sb2NrKTsKKwkJCQkJaWYgKHVzYl9lcF9zZXRfaGFsdCgmbUVwLT5lcCkpCisJCQkJCQllcnIoImVycm9yOiBlcF9zZXRfaGFsdCIpOworCQkJCQlzcGluX2xvY2sodWRjLT5sb2NrKTsKKwkJCQl9CisJCQl9CisJCX0KKworCQlpZiAobUVwLT50eXBlICE9IFVTQl9FTkRQT0lOVF9YRkVSX0NPTlRST0wgfHwKKwkJICAgICFod190ZXN0X2FuZF9jbGVhcl9zZXR1cF9zdGF0dXMoaSkpCisJCQljb250aW51ZTsKKworCQlpZiAoaSAhPSAwKSB7CisJCQl3YXJuKCJjdHJsIHRyYWZmaWMgcmVjZWl2ZWQgYXQgZW5kcG9pbnQiKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogcmVhZF9zZXR1cF9wYWNrZXQgKi8KKwkJZG8geworCQkJaHdfdGVzdF9hbmRfc2V0X3NldHVwX2d1YXJkKCk7CisJCQltZW1jcHkoJnJlcSwgJm1FcC0+cWhbUlhdLnB0ci0+c2V0dXAsIHNpemVvZihyZXEpKTsKKwkJfSB3aGlsZSAoIWh3X3Rlc3RfYW5kX2NsZWFyX3NldHVwX2d1YXJkKCkpOworCisJCXR5cGUgPSByZXEuYlJlcXVlc3RUeXBlOworCisJCW1FcC0+ZGlyID0gKHR5cGUgJiBVU0JfRElSX0lOKSA/IFRYIDogUlg7CisKKwkJZGJnX3NldHVwKF91c2JfYWRkcihtRXApLCAmcmVxKTsKKworCQlzd2l0Y2ggKHJlcS5iUmVxdWVzdCkgeworCQljYXNlIFVTQl9SRVFfQ0xFQVJfRkVBVFVSRToKKwkJCWlmICh0eXBlICE9IChVU0JfRElSX09VVHxVU0JfUkVDSVBfRU5EUE9JTlQpICYmCisJCQkgICAgbGUxNl90b19jcHUocmVxLndWYWx1ZSkgIT0gVVNCX0VORFBPSU5UX0hBTFQpCisJCQkJZ290byBkZWxlZ2F0ZTsKKwkJCWlmIChyZXEud0xlbmd0aCAhPSAwKQorCQkJCWJyZWFrOworCQkJbnVtICA9IGxlMTZfdG9fY3B1KHJlcS53SW5kZXgpOworCQkJbnVtICY9IFVTQl9FTkRQT0lOVF9OVU1CRVJfTUFTSzsKKwkJCWlmICghdWRjLT5jaTEzeHh4X2VwW251bV0ud2VkZ2UpIHsKKwkJCQlzcGluX3VubG9jayh1ZGMtPmxvY2spOworCQkJCWVyciA9IHVzYl9lcF9jbGVhcl9oYWx0KAorCQkJCQkmdWRjLT5jaTEzeHh4X2VwW251bV0uZXApOworCQkJCXNwaW5fbG9jayh1ZGMtPmxvY2spOworCQkJCWlmIChlcnIpCisJCQkJCWJyZWFrOworCQkJfQorCQkJZXJyID0gaXNyX3NldHVwX3N0YXR1c19waGFzZShtRXApOworCQkJYnJlYWs7CisJCWNhc2UgVVNCX1JFUV9HRVRfU1RBVFVTOgorCQkJaWYgKHR5cGUgIT0gKFVTQl9ESVJfSU58VVNCX1JFQ0lQX0RFVklDRSkgICAmJgorCQkJICAgIHR5cGUgIT0gKFVTQl9ESVJfSU58VVNCX1JFQ0lQX0VORFBPSU5UKSAmJgorCQkJICAgIHR5cGUgIT0gKFVTQl9ESVJfSU58VVNCX1JFQ0lQX0lOVEVSRkFDRSkpCisJCQkJZ290byBkZWxlZ2F0ZTsKKwkJCWlmIChsZTE2X3RvX2NwdShyZXEud0xlbmd0aCkgIT0gMiB8fAorCQkJICAgIGxlMTZfdG9fY3B1KHJlcS53VmFsdWUpICAhPSAwKQorCQkJCWJyZWFrOworCQkJZXJyID0gaXNyX2dldF9zdGF0dXNfcmVzcG9uc2UobUVwLCAmcmVxKTsKKwkJCWJyZWFrOworCQljYXNlIFVTQl9SRVFfU0VUX0FERFJFU1M6CisJCQlpZiAodHlwZSAhPSAoVVNCX0RJUl9PVVR8VVNCX1JFQ0lQX0RFVklDRSkpCisJCQkJZ290byBkZWxlZ2F0ZTsKKwkJCWlmIChsZTE2X3RvX2NwdShyZXEud0xlbmd0aCkgIT0gMCB8fAorCQkJICAgIGxlMTZfdG9fY3B1KHJlcS53SW5kZXgpICAhPSAwKQorCQkJCWJyZWFrOworCQkJZXJyID0gaHdfdXNiX3NldF9hZGRyZXNzKCh1OClsZTE2X3RvX2NwdShyZXEud1ZhbHVlKSk7CisJCQlpZiAoZXJyKQorCQkJCWJyZWFrOworCQkJZXJyID0gaXNyX3NldHVwX3N0YXR1c19waGFzZShtRXApOworCQkJYnJlYWs7CisJCWNhc2UgVVNCX1JFUV9TRVRfRkVBVFVSRToKKwkJCWlmICh0eXBlICE9IChVU0JfRElSX09VVHxVU0JfUkVDSVBfRU5EUE9JTlQpICYmCisJCQkgICAgbGUxNl90b19jcHUocmVxLndWYWx1ZSkgIT0gVVNCX0VORFBPSU5UX0hBTFQpCisJCQkJZ290byBkZWxlZ2F0ZTsKKwkJCWlmIChyZXEud0xlbmd0aCAhPSAwKQorCQkJCWJyZWFrOworCQkJbnVtICA9IGxlMTZfdG9fY3B1KHJlcS53SW5kZXgpOworCQkJbnVtICY9IFVTQl9FTkRQT0lOVF9OVU1CRVJfTUFTSzsKKworCQkJc3Bpbl91bmxvY2sodWRjLT5sb2NrKTsKKwkJCWVyciA9IHVzYl9lcF9zZXRfaGFsdCgmdWRjLT5jaTEzeHh4X2VwW251bV0uZXApOworCQkJc3Bpbl9sb2NrKHVkYy0+bG9jayk7CisJCQlpZiAoZXJyKQorCQkJCWJyZWFrOworCQkJZXJyID0gaXNyX3NldHVwX3N0YXR1c19waGFzZShtRXApOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CitkZWxlZ2F0ZToKKwkJCWlmIChyZXEud0xlbmd0aCA9PSAwKSAgIC8qIG5vIGRhdGEgcGhhc2UgKi8KKwkJCQltRXAtPmRpciA9IFRYOworCisJCQlzcGluX3VubG9jayh1ZGMtPmxvY2spOworCQkJZXJyID0gdWRjLT5kcml2ZXItPnNldHVwKCZ1ZGMtPmdhZGdldCwgJnJlcSk7CisJCQlzcGluX2xvY2sodWRjLT5sb2NrKTsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKGVyciA8IDApIHsKKwkJCWRiZ19ldmVudChfdXNiX2FkZHIobUVwKSwgIkVSUk9SIiwgZXJyKTsKKworCQkJc3Bpbl91bmxvY2sodWRjLT5sb2NrKTsKKwkJCWlmICh1c2JfZXBfc2V0X2hhbHQoJm1FcC0+ZXApKQorCQkJCWVycigiZXJyb3I6IGVwX3NldF9oYWx0Iik7CisJCQlzcGluX2xvY2sodWRjLT5sb2NrKTsKKwkJfQorCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRU5EUFQgYmxvY2sKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKgorICogZXBfZW5hYmxlOiBjb25maWd1cmUgZW5kcG9pbnQsIG1ha2luZyBpdCB1c2FibGUKKyAqCisgKiBDaGVjayB1c2JfZXBfZW5hYmxlKCkgYXQgInVzYl9nYWRnZXQuaCIgZm9yIGRldGFpbHMKKyAqLworc3RhdGljIGludCBlcF9lbmFibGUoc3RydWN0IHVzYl9lcCAqZXAsCisJCSAgICAgY29uc3Qgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICpkZXNjKQoreworCXN0cnVjdCBjaTEzeHh4X2VwICptRXAgPSBjb250YWluZXJfb2YoZXAsIHN0cnVjdCBjaTEzeHh4X2VwLCBlcCk7CisJaW50IGRpcmVjdGlvbiwgcmV0dmFsID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJdHJhY2UoIiVwLCAlcCIsIGVwLCBkZXNjKTsKKworCWlmIChlcCA9PSBOVUxMIHx8IGRlc2MgPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzcGluX2xvY2tfaXJxc2F2ZShtRXAtPmxvY2ssIGZsYWdzKTsKKworCS8qIG9ubHkgaW50ZXJuYWwgU1cgc2hvdWxkIGVuYWJsZSBjdHJsIGVuZHB0cyAqLworCisJbUVwLT5kZXNjID0gZGVzYzsKKworCWlmICghbGlzdF9lbXB0eSgmbUVwLT5xaFttRXAtPmRpcl0ucXVldWUpKQorCQl3YXJuKCJlbmFibGluZyBhIG5vbi1lbXB0eSBlbmRwb2ludCEiKTsKKworCW1FcC0+ZGlyICA9IChkZXNjLT5iRW5kcG9pbnRBZGRyZXNzICYgVVNCX0VORFBPSU5UX0RJUl9NQVNLKSA/IFRYIDogUlg7CisJbUVwLT5udW0gID0gIGRlc2MtPmJFbmRwb2ludEFkZHJlc3MgJiBVU0JfRU5EUE9JTlRfTlVNQkVSX01BU0s7CisJbUVwLT50eXBlID0gIGRlc2MtPmJtQXR0cmlidXRlcyAmIFVTQl9FTkRQT0lOVF9YRkVSVFlQRV9NQVNLOworCisJbUVwLT5lcC5tYXhwYWNrZXQgPSBfX2NvbnN0YW50X2xlMTZfdG9fY3B1KGRlc2MtPndNYXhQYWNrZXRTaXplKTsKKworCWRpcmVjdGlvbiA9IG1FcC0+ZGlyOworCWRvIHsKKwkJZGJnX2V2ZW50KF91c2JfYWRkcihtRXApLCAiRU5BQkxFIiwgMCk7CisKKwkJaWYgKG1FcC0+dHlwZSA9PSBVU0JfRU5EUE9JTlRfWEZFUl9DT05UUk9MKQorCQkJbUVwLT5xaFttRXAtPmRpcl0ucHRyLT5jYXAgfD0gIFFIX0lPUzsKKwkJZWxzZSBpZiAobUVwLT50eXBlID09IFVTQl9FTkRQT0lOVF9YRkVSX0lTT0MpCisJCQltRXAtPnFoW21FcC0+ZGlyXS5wdHItPmNhcCAmPSB+UUhfTVVMVDsKKwkJZWxzZQorCQkJbUVwLT5xaFttRXAtPmRpcl0ucHRyLT5jYXAgJj0gflFIX1pMVDsKKworCQltRXAtPnFoW21FcC0+ZGlyXS5wdHItPmNhcCB8PQorCQkJKG1FcC0+ZXAubWF4cGFja2V0IDw8IGZmc19ucihRSF9NQVhfUEtUKSkgJiBRSF9NQVhfUEtUOworCQltRXAtPnFoW21FcC0+ZGlyXS5wdHItPnRkLm5leHQgfD0gVERfVEVSTUlOQVRFOyAgIC8qIG5lZWRlZD8gKi8KKworCQlyZXR2YWwgfD0gaHdfZXBfZW5hYmxlKG1FcC0+bnVtLCBtRXAtPmRpciwgbUVwLT50eXBlKTsKKworCQlpZiAobUVwLT50eXBlID09IFVTQl9FTkRQT0lOVF9YRkVSX0NPTlRST0wpCisJCQltRXAtPmRpciA9IChtRXAtPmRpciA9PSBUWCkgPyBSWCA6IFRYOworCisJfSB3aGlsZSAobUVwLT5kaXIgIT0gZGlyZWN0aW9uKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUobUVwLT5sb2NrLCBmbGFncyk7CisJcmV0dXJuIHJldHZhbDsKK30KKworLyoqCisgKiBlcF9kaXNhYmxlOiBlbmRwb2ludCBpcyBubyBsb25nZXIgdXNhYmxlCisgKgorICogQ2hlY2sgdXNiX2VwX2Rpc2FibGUoKSBhdCAidXNiX2dhZGdldC5oIiBmb3IgZGV0YWlscworICovCitzdGF0aWMgaW50IGVwX2Rpc2FibGUoc3RydWN0IHVzYl9lcCAqZXApCit7CisJc3RydWN0IGNpMTN4eHhfZXAgKm1FcCA9IGNvbnRhaW5lcl9vZihlcCwgc3RydWN0IGNpMTN4eHhfZXAsIGVwKTsKKwlpbnQgZGlyZWN0aW9uLCByZXR2YWwgPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwl0cmFjZSgiJXAiLCBlcCk7CisKKwlpZiAoZXAgPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJZWxzZSBpZiAobUVwLT5kZXNjID09IE5VTEwpCisJCXJldHVybiAtRUJVU1k7CisKKwlzcGluX2xvY2tfaXJxc2F2ZShtRXAtPmxvY2ssIGZsYWdzKTsKKworCS8qIG9ubHkgaW50ZXJuYWwgU1cgc2hvdWxkIGRpc2FibGUgY3RybCBlbmRwdHMgKi8KKworCWRpcmVjdGlvbiA9IG1FcC0+ZGlyOworCWRvIHsKKwkJZGJnX2V2ZW50KF91c2JfYWRkcihtRXApLCAiRElTQUJMRSIsIDApOworCisJCXJldHZhbCB8PSBfZXBfbnVrZShtRXApOworCQlyZXR2YWwgfD0gaHdfZXBfZGlzYWJsZShtRXAtPm51bSwgbUVwLT5kaXIpOworCisJCWlmIChtRXAtPnR5cGUgPT0gVVNCX0VORFBPSU5UX1hGRVJfQ09OVFJPTCkKKwkJCW1FcC0+ZGlyID0gKG1FcC0+ZGlyID09IFRYKSA/IFJYIDogVFg7CisKKwl9IHdoaWxlIChtRXAtPmRpciAhPSBkaXJlY3Rpb24pOworCisJbUVwLT5kZXNjID0gTlVMTDsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUobUVwLT5sb2NrLCBmbGFncyk7CisJcmV0dXJuIHJldHZhbDsKK30KKworLyoqCisgKiBlcF9hbGxvY19yZXF1ZXN0OiBhbGxvY2F0ZSBhIHJlcXVlc3Qgb2JqZWN0IHRvIHVzZSB3aXRoIHRoaXMgZW5kcG9pbnQKKyAqCisgKiBDaGVjayB1c2JfZXBfYWxsb2NfcmVxdWVzdCgpIGF0ICJ1c2JfZ2FkZ2V0LmgiIGZvciBkZXRhaWxzCisgKi8KK3N0YXRpYyBzdHJ1Y3QgdXNiX3JlcXVlc3QgKmVwX2FsbG9jX3JlcXVlc3Qoc3RydWN0IHVzYl9lcCAqZXAsIGdmcF90IGdmcF9mbGFncykKK3sKKwlzdHJ1Y3QgY2kxM3h4eF9lcCAgKm1FcCAgPSBjb250YWluZXJfb2YoZXAsIHN0cnVjdCBjaTEzeHh4X2VwLCBlcCk7CisJc3RydWN0IGNpMTN4eHhfcmVxICptUmVxID0gTlVMTDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJdHJhY2UoIiVwLCAlaSIsIGVwLCBnZnBfZmxhZ3MpOworCisJaWYgKGVwID09IE5VTEwpIHsKKwkJZXJyKCJFSU5WQUwiKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUobUVwLT5sb2NrLCBmbGFncyk7CisKKwltUmVxID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGNpMTN4eHhfcmVxKSwgZ2ZwX2ZsYWdzKTsKKwlpZiAobVJlcSAhPSBOVUxMKSB7CisJCUlOSVRfTElTVF9IRUFEKCZtUmVxLT5xdWV1ZSk7CisKKwkJbVJlcS0+cHRyID0gZG1hX3Bvb2xfYWxsb2MobUVwLT50ZF9wb29sLCBnZnBfZmxhZ3MsCisJCQkJCSAgICZtUmVxLT5kbWEpOworCQlpZiAobVJlcS0+cHRyID09IE5VTEwpIHsKKwkJCWtmcmVlKG1SZXEpOworCQkJbVJlcSA9IE5VTEw7CisJCX0KKwl9CisKKwlkYmdfZXZlbnQoX3VzYl9hZGRyKG1FcCksICJBTExPQyIsIG1SZXEgPT0gTlVMTCk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKG1FcC0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIChtUmVxID09IE5VTEwpID8gTlVMTCA6ICZtUmVxLT5yZXE7Cit9CisKKy8qKgorICogZXBfZnJlZV9yZXF1ZXN0OiBmcmVlcyBhIHJlcXVlc3Qgb2JqZWN0CisgKgorICogQ2hlY2sgdXNiX2VwX2ZyZWVfcmVxdWVzdCgpIGF0ICJ1c2JfZ2FkZ2V0LmgiIGZvciBkZXRhaWxzCisgKi8KK3N0YXRpYyB2b2lkIGVwX2ZyZWVfcmVxdWVzdChzdHJ1Y3QgdXNiX2VwICplcCwgc3RydWN0IHVzYl9yZXF1ZXN0ICpyZXEpCit7CisJc3RydWN0IGNpMTN4eHhfZXAgICptRXAgID0gY29udGFpbmVyX29mKGVwLCAgc3RydWN0IGNpMTN4eHhfZXAsIGVwKTsKKwlzdHJ1Y3QgY2kxM3h4eF9yZXEgKm1SZXEgPSBjb250YWluZXJfb2YocmVxLCBzdHJ1Y3QgY2kxM3h4eF9yZXEsIHJlcSk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXRyYWNlKCIlcCwgJXAiLCBlcCwgcmVxKTsKKworCWlmIChlcCA9PSBOVUxMIHx8IHJlcSA9PSBOVUxMKSB7CisJCWVycigiRUlOVkFMIik7CisJCXJldHVybjsKKwl9IGVsc2UgaWYgKCFsaXN0X2VtcHR5KCZtUmVxLT5xdWV1ZSkpIHsKKwkJZXJyKCJFQlVTWSIpOworCQlyZXR1cm47CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUobUVwLT5sb2NrLCBmbGFncyk7CisKKwlpZiAobVJlcS0+cHRyKQorCQlkbWFfcG9vbF9mcmVlKG1FcC0+dGRfcG9vbCwgbVJlcS0+cHRyLCBtUmVxLT5kbWEpOworCWtmcmVlKG1SZXEpOworCisJZGJnX2V2ZW50KF91c2JfYWRkcihtRXApLCAiRlJFRSIsIDApOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShtRXAtPmxvY2ssIGZsYWdzKTsKK30KKworLyoqCisgKiBlcF9xdWV1ZTogcXVldWVzIChzdWJtaXRzKSBhbiBJL08gcmVxdWVzdCB0byBhbiBlbmRwb2ludAorICoKKyAqIENoZWNrIHVzYl9lcF9xdWV1ZSgpKiBhdCB1c2JfZ2FkZ2V0LmgiIGZvciBkZXRhaWxzCisgKi8KK3N0YXRpYyBpbnQgZXBfcXVldWUoc3RydWN0IHVzYl9lcCAqZXAsIHN0cnVjdCB1c2JfcmVxdWVzdCAqcmVxLAorCQkgICAgZ2ZwX3QgX19tYXliZV91bnVzZWQgZ2ZwX2ZsYWdzKQoreworCXN0cnVjdCBjaTEzeHh4X2VwICAqbUVwICA9IGNvbnRhaW5lcl9vZihlcCwgIHN0cnVjdCBjaTEzeHh4X2VwLCBlcCk7CisJc3RydWN0IGNpMTN4eHhfcmVxICptUmVxID0gY29udGFpbmVyX29mKHJlcSwgc3RydWN0IGNpMTN4eHhfcmVxLCByZXEpOworCWludCByZXR2YWwgPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwl0cmFjZSgiJXAsICVwLCAlWCIsIGVwLCByZXEsIGdmcF9mbGFncyk7CisKKwlpZiAoZXAgPT0gTlVMTCB8fCByZXEgPT0gTlVMTCB8fCBtRXAtPmRlc2MgPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzcGluX2xvY2tfaXJxc2F2ZShtRXAtPmxvY2ssIGZsYWdzKTsKKworCWlmIChtRXAtPnR5cGUgPT0gVVNCX0VORFBPSU5UX1hGRVJfQ09OVFJPTCAmJgorCSAgICAhbGlzdF9lbXB0eSgmbUVwLT5xaFttRXAtPmRpcl0ucXVldWUpKSB7CisJCV9lcF9udWtlKG1FcCk7CisJCXJldHZhbCA9IC1FT1ZFUkZMT1c7CisJCXdhcm4oImVuZHBvaW50IGN0cmwgJVggbnVrZWQiLCBfdXNiX2FkZHIobUVwKSk7CisJfQorCisJLyogZmlyc3QgbnVrZSB0aGVuIHRlc3QgbGluaywgZS5nLiBwcmV2aW91cyBzdGF0dXMgaGFzIG5vdCBzZW50ICovCisJaWYgKCFsaXN0X2VtcHR5KCZtUmVxLT5xdWV1ZSkpIHsKKwkJcmV0dmFsID0gLUVCVVNZOworCQllcnIoInJlcXVlc3QgYWxyZWFkeSBpbiBxdWV1ZSIpOworCQlnb3RvIGRvbmU7CisJfQorCisJaWYgKHJlcS0+bGVuZ3RoID4gKDQgKiBQQUdFX1NJWkUpKSB7CisJCXJlcS0+bGVuZ3RoID0gKDQgKiBQQUdFX1NJWkUpOworCQlyZXR2YWwgPSAtRU1TR1NJWkU7CisJCXdhcm4oInJlcXVlc3QgbGVuZ3RoIHRydW5jYXRlZCIpOworCX0KKworCWRiZ19xdWV1ZShfdXNiX2FkZHIobUVwKSwgcmVxLCByZXR2YWwpOworCisJLyogcHVzaCByZXF1ZXN0ICovCisJbVJlcS0+cmVxLnN0YXR1cyA9IC1FSU5QUk9HUkVTUzsKKwltUmVxLT5yZXEuYWN0dWFsID0gMDsKKwlsaXN0X2FkZF90YWlsKCZtUmVxLT5xdWV1ZSwgJm1FcC0+cWhbbUVwLT5kaXJdLnF1ZXVlKTsKKworCXJldHZhbCA9IF9oYXJkd2FyZV9lbnF1ZXVlKG1FcCwgbVJlcSk7CisJaWYgKHJldHZhbCA9PSAtRUFMUkVBRFkgfHwgcmV0dmFsID09IC1FQlVTWSkgeworCQlkYmdfZXZlbnQoX3VzYl9hZGRyKG1FcCksICJRVUVVRSIsIHJldHZhbCk7CisJCXJldHZhbCA9IDA7CisJfQorCisgZG9uZToKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKG1FcC0+bG9jaywgZmxhZ3MpOworCXJldHVybiByZXR2YWw7Cit9CisKKy8qKgorICogZXBfZGVxdWV1ZTogZGVxdWV1ZXMgKGNhbmNlbHMsIHVubGlua3MpIGFuIEkvTyByZXF1ZXN0IGZyb20gYW4gZW5kcG9pbnQKKyAqCisgKiBDaGVjayB1c2JfZXBfZGVxdWV1ZSgpIGF0ICJ1c2JfZ2FkZ2V0LmgiIGZvciBkZXRhaWxzCisgKi8KK3N0YXRpYyBpbnQgZXBfZGVxdWV1ZShzdHJ1Y3QgdXNiX2VwICplcCwgc3RydWN0IHVzYl9yZXF1ZXN0ICpyZXEpCit7CisJc3RydWN0IGNpMTN4eHhfZXAgICptRXAgID0gY29udGFpbmVyX29mKGVwLCAgc3RydWN0IGNpMTN4eHhfZXAsIGVwKTsKKwlzdHJ1Y3QgY2kxM3h4eF9yZXEgKm1SZXEgPSBjb250YWluZXJfb2YocmVxLCBzdHJ1Y3QgY2kxM3h4eF9yZXEsIHJlcSk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXRyYWNlKCIlcCwgJXAiLCBlcCwgcmVxKTsKKworCWlmIChlcCA9PSBOVUxMIHx8IHJlcSA9PSBOVUxMIHx8IG1FcC0+ZGVzYyA9PSBOVUxMIHx8CisJICAgIGxpc3RfZW1wdHkoJm1SZXEtPnF1ZXVlKSAgfHwgbGlzdF9lbXB0eSgmbUVwLT5xaFttRXAtPmRpcl0ucXVldWUpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXNwaW5fbG9ja19pcnFzYXZlKG1FcC0+bG9jaywgZmxhZ3MpOworCisJZGJnX2V2ZW50KF91c2JfYWRkcihtRXApLCAiREVRVUVVRSIsIDApOworCisJaWYgKG1SZXEtPnJlcS5zdGF0dXMgPT0gLUVBTFJFQURZKQorCQlfaGFyZHdhcmVfZGVxdWV1ZShtRXAsIG1SZXEpOworCisJLyogcG9wIHJlcXVlc3QgKi8KKwlsaXN0X2RlbF9pbml0KCZtUmVxLT5xdWV1ZSk7CisJcmVxLT5zdGF0dXMgPSAtRUNPTk5SRVNFVDsKKworCWlmICghbVJlcS0+cmVxLm5vX2ludGVycnVwdCAmJiBtUmVxLT5yZXEuY29tcGxldGUgIT0gTlVMTCkgeworCQlzcGluX3VubG9jayhtRXAtPmxvY2spOworCQltUmVxLT5yZXEuY29tcGxldGUoJm1FcC0+ZXAsICZtUmVxLT5yZXEpOworCQlzcGluX2xvY2sobUVwLT5sb2NrKTsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKG1FcC0+bG9jaywgZmxhZ3MpOworCXJldHVybiAwOworfQorCisvKioKKyAqIGVwX3NldF9oYWx0OiBzZXRzIHRoZSBlbmRwb2ludCBoYWx0IGZlYXR1cmUKKyAqCisgKiBDaGVjayB1c2JfZXBfc2V0X2hhbHQoKSBhdCAidXNiX2dhZGdldC5oIiBmb3IgZGV0YWlscworICovCitzdGF0aWMgaW50IGVwX3NldF9oYWx0KHN0cnVjdCB1c2JfZXAgKmVwLCBpbnQgdmFsdWUpCit7CisJc3RydWN0IGNpMTN4eHhfZXAgKm1FcCA9IGNvbnRhaW5lcl9vZihlcCwgc3RydWN0IGNpMTN4eHhfZXAsIGVwKTsKKwlpbnQgZGlyZWN0aW9uLCByZXR2YWwgPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwl0cmFjZSgiJXAsICVpIiwgZXAsIHZhbHVlKTsKKworCWlmIChlcCA9PSBOVUxMIHx8IG1FcC0+ZGVzYyA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXNwaW5fbG9ja19pcnFzYXZlKG1FcC0+bG9jaywgZmxhZ3MpOworCisjaWZuZGVmIFNUQUxMX0lOCisJLyogZ19maWxlX3N0b3JhZ2UgTVMgY29tcGxpYW50IGJ1dCBnX3plcm8gZmFpbHMgY2hhcHRlciA5IGNvbXBsaWFuY2UgKi8KKwlpZiAodmFsdWUgJiYgbUVwLT50eXBlID09IFVTQl9FTkRQT0lOVF9YRkVSX0JVTEsgJiYgbUVwLT5kaXIgPT0gVFggJiYKKwkgICAgIWxpc3RfZW1wdHkoJm1FcC0+cWhbbUVwLT5kaXJdLnF1ZXVlKSkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKG1FcC0+bG9jaywgZmxhZ3MpOworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisjZW5kaWYKKworCWRpcmVjdGlvbiA9IG1FcC0+ZGlyOworCWRvIHsKKwkJZGJnX2V2ZW50KF91c2JfYWRkcihtRXApLCAiSEFMVCIsIHZhbHVlKTsKKwkJcmV0dmFsIHw9IGh3X2VwX3NldF9oYWx0KG1FcC0+bnVtLCBtRXAtPmRpciwgdmFsdWUpOworCisJCWlmICghdmFsdWUpCisJCQltRXAtPndlZGdlID0gMDsKKworCQlpZiAobUVwLT50eXBlID09IFVTQl9FTkRQT0lOVF9YRkVSX0NPTlRST0wpCisJCQltRXAtPmRpciA9IChtRXAtPmRpciA9PSBUWCkgPyBSWCA6IFRYOworCisJfSB3aGlsZSAobUVwLT5kaXIgIT0gZGlyZWN0aW9uKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUobUVwLT5sb2NrLCBmbGFncyk7CisJcmV0dXJuIHJldHZhbDsKK30KKworLyoqCisgKiBlcF9zZXRfd2VkZ2U6IHNldHMgdGhlIGhhbHQgZmVhdHVyZSBhbmQgaWdub3JlcyBjbGVhciByZXF1ZXN0cworICoKKyAqIENoZWNrIHVzYl9lcF9zZXRfd2VkZ2UoKSBhdCAidXNiX2dhZGdldC5oIiBmb3IgZGV0YWlscworICovCitzdGF0aWMgaW50IGVwX3NldF93ZWRnZShzdHJ1Y3QgdXNiX2VwICplcCkKK3sKKwlzdHJ1Y3QgY2kxM3h4eF9lcCAqbUVwID0gY29udGFpbmVyX29mKGVwLCBzdHJ1Y3QgY2kxM3h4eF9lcCwgZXApOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwl0cmFjZSgiJXAiLCBlcCk7CisKKwlpZiAoZXAgPT0gTlVMTCB8fCBtRXAtPmRlc2MgPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzcGluX2xvY2tfaXJxc2F2ZShtRXAtPmxvY2ssIGZsYWdzKTsKKworCWRiZ19ldmVudChfdXNiX2FkZHIobUVwKSwgIldFREdFIiwgMCk7CisJbUVwLT53ZWRnZSA9IDE7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKG1FcC0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHVzYl9lcF9zZXRfaGFsdChlcCk7Cit9CisKKy8qKgorICogZXBfZmlmb19mbHVzaDogZmx1c2hlcyBjb250ZW50cyBvZiBhIGZpZm8KKyAqCisgKiBDaGVjayB1c2JfZXBfZmlmb19mbHVzaCgpIGF0ICJ1c2JfZ2FkZ2V0LmgiIGZvciBkZXRhaWxzCisgKi8KK3N0YXRpYyB2b2lkIGVwX2ZpZm9fZmx1c2goc3RydWN0IHVzYl9lcCAqZXApCit7CisJc3RydWN0IGNpMTN4eHhfZXAgKm1FcCA9IGNvbnRhaW5lcl9vZihlcCwgc3RydWN0IGNpMTN4eHhfZXAsIGVwKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJdHJhY2UoIiVwIiwgZXApOworCisJaWYgKGVwID09IE5VTEwpIHsKKwkJZXJyKCIlMDJYOiAtRUlOVkFMIiwgX3VzYl9hZGRyKG1FcCkpOworCQlyZXR1cm47CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUobUVwLT5sb2NrLCBmbGFncyk7CisKKwlkYmdfZXZlbnQoX3VzYl9hZGRyKG1FcCksICJGRkxVU0giLCAwKTsKKwlod19lcF9mbHVzaChtRXAtPm51bSwgbUVwLT5kaXIpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShtRXAtPmxvY2ssIGZsYWdzKTsKK30KKworLyoqCisgKiBFbmRwb2ludC1zcGVjaWZpYyBwYXJ0IG9mIHRoZSBBUEkgdG8gdGhlIFVTQiBjb250cm9sbGVyIGhhcmR3YXJlCisgKiBDaGVjayAidXNiX2dhZGdldC5oIiBmb3IgZGV0YWlscworICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHVzYl9lcF9vcHMgdXNiX2VwX29wcyA9IHsKKwkuZW5hYmxlCSAgICAgICA9IGVwX2VuYWJsZSwKKwkuZGlzYWJsZSAgICAgICA9IGVwX2Rpc2FibGUsCisJLmFsbG9jX3JlcXVlc3QgPSBlcF9hbGxvY19yZXF1ZXN0LAorCS5mcmVlX3JlcXVlc3QgID0gZXBfZnJlZV9yZXF1ZXN0LAorCS5xdWV1ZQkgICAgICAgPSBlcF9xdWV1ZSwKKwkuZGVxdWV1ZSAgICAgICA9IGVwX2RlcXVldWUsCisJLnNldF9oYWx0ICAgICAgPSBlcF9zZXRfaGFsdCwKKwkuc2V0X3dlZGdlICAgICA9IGVwX3NldF93ZWRnZSwKKwkuZmlmb19mbHVzaCAgICA9IGVwX2ZpZm9fZmx1c2gsCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBHQURHRVQgYmxvY2sKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKgorICogRGV2aWNlIG9wZXJhdGlvbnMgcGFydCBvZiB0aGUgQVBJIHRvIHRoZSBVU0IgY29udHJvbGxlciBoYXJkd2FyZSwKKyAqIHdoaWNoIGRvbid0IGludm9sdmUgZW5kcG9pbnRzIChvciBpL28pCisgKiBDaGVjayAgInVzYl9nYWRnZXQuaCIgZm9yIGRldGFpbHMKKyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCB1c2JfZ2FkZ2V0X29wcyB1c2JfZ2FkZ2V0X29wczsKKworLyoqCisgKiB1c2JfZ2FkZ2V0X3JlZ2lzdGVyX2RyaXZlcjogcmVnaXN0ZXIgYSBnYWRnZXQgZHJpdmVyCisgKgorICogQ2hlY2sgdXNiX2dhZGdldF9yZWdpc3Rlcl9kcml2ZXIoKSBhdCAidXNiX2dhZGdldC5oIiBmb3IgZGV0YWlscworICogSW50ZXJydXB0cyBhcmUgZW5hYmxlZCBoZXJlCisgKi8KK2ludCB1c2JfZ2FkZ2V0X3JlZ2lzdGVyX2RyaXZlcihzdHJ1Y3QgdXNiX2dhZGdldF9kcml2ZXIgKmRyaXZlcikKK3sKKwlzdHJ1Y3QgY2kxM3h4eCAqdWRjID0gX3VkYzsKKwl1bnNpZ25lZCBsb25nIGksIGssIGZsYWdzOworCWludCByZXR2YWwgPSAtRU5PTUVNOworCisJdHJhY2UoIiVwIiwgZHJpdmVyKTsKKworCWlmIChkcml2ZXIgICAgICAgICAgICAgPT0gTlVMTCB8fAorCSAgICBkcml2ZXItPmJpbmQgICAgICAgPT0gTlVMTCB8fAorCSAgICBkcml2ZXItPnVuYmluZCAgICAgPT0gTlVMTCB8fAorCSAgICBkcml2ZXItPnNldHVwICAgICAgPT0gTlVMTCB8fAorCSAgICBkcml2ZXItPmRpc2Nvbm5lY3QgPT0gTlVMTCB8fAorCSAgICBkcml2ZXItPnN1c3BlbmQgICAgPT0gTlVMTCB8fAorCSAgICBkcml2ZXItPnJlc3VtZSAgICAgPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJZWxzZSBpZiAodWRjICAgICAgICAgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9ERVY7CisJZWxzZSBpZiAodWRjLT5kcml2ZXIgIT0gTlVMTCkKKwkJcmV0dXJuIC1FQlVTWTsKKworCS8qIGFsbG9jIHJlc291cmNlcyAqLworCXVkYy0+cWhfcG9vbCA9IGRtYV9wb29sX2NyZWF0ZSgiY2kxM3h4eF9xaCIsICZ1ZGMtPmdhZGdldC5kZXYsCisJCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgY2kxM3h4eF9xaCksCisJCQkJICAgICAgIDY0LCBQQUdFX1NJWkUpOworCWlmICh1ZGMtPnFoX3Bvb2wgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwl1ZGMtPnRkX3Bvb2wgPSBkbWFfcG9vbF9jcmVhdGUoImNpMTN4eHhfdGQiLCAmdWRjLT5nYWRnZXQuZGV2LAorCQkJCSAgICAgICBzaXplb2Yoc3RydWN0IGNpMTN4eHhfdGQpLAorCQkJCSAgICAgICA2NCwgUEFHRV9TSVpFKTsKKwlpZiAodWRjLT50ZF9wb29sID09IE5VTEwpIHsKKwkJZG1hX3Bvb2xfZGVzdHJveSh1ZGMtPnFoX3Bvb2wpOworCQl1ZGMtPnFoX3Bvb2wgPSBOVUxMOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSh1ZGMtPmxvY2ssIGZsYWdzKTsKKworCWluZm8oImh3X2VwX21heCA9ICVkIiwgaHdfZXBfbWF4KTsKKworCXVkYy0+ZHJpdmVyID0gZHJpdmVyOworCXVkYy0+Z2FkZ2V0Lm9wcyAgICAgICAgPSBOVUxMOworCXVkYy0+Z2FkZ2V0LmRldi5kcml2ZXIgPSBOVUxMOworCisJcmV0dmFsID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgaHdfZXBfbWF4OyBpKyspIHsKKwkJc3RydWN0IGNpMTN4eHhfZXAgKm1FcCA9ICZ1ZGMtPmNpMTN4eHhfZXBbaV07CisKKwkJc2NucHJpbnRmKG1FcC0+bmFtZSwgc2l6ZW9mKG1FcC0+bmFtZSksICJlcCVpIiwgKGludClpKTsKKworCQltRXAtPmxvY2sgICAgICAgICA9IHVkYy0+bG9jazsKKwkJbUVwLT5kZXZpY2UgICAgICAgPSAmdWRjLT5nYWRnZXQuZGV2OworCQltRXAtPnRkX3Bvb2wgICAgICA9IHVkYy0+dGRfcG9vbDsKKworCQltRXAtPmVwLm5hbWUgICAgICA9IG1FcC0+bmFtZTsKKwkJbUVwLT5lcC5vcHMgICAgICAgPSAmdXNiX2VwX29wczsKKwkJbUVwLT5lcC5tYXhwYWNrZXQgPSBDVFJMX1BBWUxPQURfTUFYOworCisJCS8qIHRoaXMgYWxsb2NhdGlvbiBjYW5ub3QgYmUgcmFuZG9tICovCisJCWZvciAoayA9IFJYOyBrIDw9IFRYOyBrKyspIHsKKwkJCUlOSVRfTElTVF9IRUFEKCZtRXAtPnFoW2tdLnF1ZXVlKTsKKwkJCW1FcC0+cWhba10ucHRyID0gZG1hX3Bvb2xfYWxsb2ModWRjLT5xaF9wb29sLAorCQkJCQkJCUdGUF9LRVJORUwsCisJCQkJCQkJJm1FcC0+cWhba10uZG1hKTsKKwkJCWlmIChtRXAtPnFoW2tdLnB0ciA9PSBOVUxMKQorCQkJCXJldHZhbCA9IC1FTk9NRU07CisJCQllbHNlCisJCQkJbWVtc2V0KG1FcC0+cWhba10ucHRyLCAwLAorCQkJCSAgICAgICBzaXplb2YoKm1FcC0+cWhba10ucHRyKSk7CisJCX0KKwkJaWYgKGkgPT0gMCkKKwkJCXVkYy0+Z2FkZ2V0LmVwMCA9ICZtRXAtPmVwOworCQllbHNlCisJCQlsaXN0X2FkZF90YWlsKCZtRXAtPmVwLmVwX2xpc3QsICZ1ZGMtPmdhZGdldC5lcF9saXN0KTsKKwl9CisJaWYgKHJldHZhbCkKKwkJZ290byBkb25lOworCisJLyogYmluZCBnYWRnZXQgKi8KKwlkcml2ZXItPmRyaXZlci5idXMgICAgID0gTlVMTDsKKwl1ZGMtPmdhZGdldC5vcHMgICAgICAgID0gJnVzYl9nYWRnZXRfb3BzOworCXVkYy0+Z2FkZ2V0LmRldi5kcml2ZXIgPSAmZHJpdmVyLT5kcml2ZXI7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKHVkYy0+bG9jaywgZmxhZ3MpOworCXJldHZhbCA9IGRyaXZlci0+YmluZCgmdWRjLT5nYWRnZXQpOyAgICAgICAgICAgICAgICAvKiBNQVkgU0xFRVAgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSh1ZGMtPmxvY2ssIGZsYWdzKTsKKworCWlmIChyZXR2YWwpIHsKKwkJdWRjLT5nYWRnZXQub3BzICAgICAgICA9IE5VTEw7CisJCXVkYy0+Z2FkZ2V0LmRldi5kcml2ZXIgPSBOVUxMOworCQlnb3RvIGRvbmU7CisJfQorCisJcmV0dmFsID0gaHdfZGV2aWNlX3N0YXRlKHVkYy0+Y2kxM3h4eF9lcFswXS5xaFtSWF0uZG1hKTsKKworIGRvbmU6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSh1ZGMtPmxvY2ssIGZsYWdzKTsKKwlpZiAocmV0dmFsKQorCQl1c2JfZ2FkZ2V0X3VucmVnaXN0ZXJfZHJpdmVyKGRyaXZlcik7CisJcmV0dXJuIHJldHZhbDsKK30KK0VYUE9SVF9TWU1CT0wodXNiX2dhZGdldF9yZWdpc3Rlcl9kcml2ZXIpOworCisvKioKKyAqIHVzYl9nYWRnZXRfdW5yZWdpc3Rlcl9kcml2ZXI6IHVucmVnaXN0ZXIgYSBnYWRnZXQgZHJpdmVyCisgKgorICogQ2hlY2sgdXNiX2dhZGdldF91bnJlZ2lzdGVyX2RyaXZlcigpIGF0ICJ1c2JfZ2FkZ2V0LmgiIGZvciBkZXRhaWxzCisgKi8KK2ludCB1c2JfZ2FkZ2V0X3VucmVnaXN0ZXJfZHJpdmVyKHN0cnVjdCB1c2JfZ2FkZ2V0X2RyaXZlciAqZHJpdmVyKQoreworCXN0cnVjdCBjaTEzeHh4ICp1ZGMgPSBfdWRjOworCXVuc2lnbmVkIGxvbmcgaSwgaywgZmxhZ3M7CisKKwl0cmFjZSgiJXAiLCBkcml2ZXIpOworCisJaWYgKGRyaXZlciAgICAgICAgICAgICA9PSBOVUxMIHx8CisJICAgIGRyaXZlci0+YmluZCAgICAgICA9PSBOVUxMIHx8CisJICAgIGRyaXZlci0+dW5iaW5kICAgICA9PSBOVUxMIHx8CisJICAgIGRyaXZlci0+c2V0dXAgICAgICA9PSBOVUxMIHx8CisJICAgIGRyaXZlci0+ZGlzY29ubmVjdCA9PSBOVUxMIHx8CisJICAgIGRyaXZlci0+c3VzcGVuZCAgICA9PSBOVUxMIHx8CisJICAgIGRyaXZlci0+cmVzdW1lICAgICA9PSBOVUxMIHx8CisJICAgIGRyaXZlciAgICAgICAgICAgICAhPSB1ZGMtPmRyaXZlcikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSh1ZGMtPmxvY2ssIGZsYWdzKTsKKworCWh3X2RldmljZV9zdGF0ZSgwKTsKKworCS8qIHVuYmluZCBnYWRnZXQgKi8KKwlpZiAodWRjLT5nYWRnZXQub3BzICE9IE5VTEwpIHsKKwkJX2dhZGdldF9zdG9wX2FjdGl2aXR5KCZ1ZGMtPmdhZGdldCk7CisKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSh1ZGMtPmxvY2ssIGZsYWdzKTsKKwkJZHJpdmVyLT51bmJpbmQoJnVkYy0+Z2FkZ2V0KTsgICAgICAgICAgICAgICAvKiBNQVkgU0xFRVAgKi8KKwkJc3Bpbl9sb2NrX2lycXNhdmUodWRjLT5sb2NrLCBmbGFncyk7CisKKwkJdWRjLT5nYWRnZXQub3BzICAgICAgICA9IE5VTEw7CisJCXVkYy0+Z2FkZ2V0LmRldi5kcml2ZXIgPSBOVUxMOworCX0KKworCS8qIGZyZWUgcmVzb3VyY2VzICovCisJZm9yIChpID0gMDsgaSA8IGh3X2VwX21heDsgaSsrKSB7CisJCXN0cnVjdCBjaTEzeHh4X2VwICptRXAgPSAmdWRjLT5jaTEzeHh4X2VwW2ldOworCisJCWlmIChpID09IDApCisJCQl1ZGMtPmdhZGdldC5lcDAgPSBOVUxMOworCQllbHNlIGlmICghbGlzdF9lbXB0eSgmbUVwLT5lcC5lcF9saXN0KSkKKwkJCWxpc3RfZGVsX2luaXQoJm1FcC0+ZXAuZXBfbGlzdCk7CisKKwkJZm9yIChrID0gUlg7IGsgPD0gVFg7IGsrKykKKwkJCWlmIChtRXAtPnFoW2tdLnB0ciAhPSBOVUxMKQorCQkJCWRtYV9wb29sX2ZyZWUodWRjLT5xaF9wb29sLAorCQkJCQkgICAgICBtRXAtPnFoW2tdLnB0ciwgbUVwLT5xaFtrXS5kbWEpOworCX0KKworCXVkYy0+ZHJpdmVyID0gTlVMTDsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUodWRjLT5sb2NrLCBmbGFncyk7CisKKwlpZiAodWRjLT50ZF9wb29sICE9IE5VTEwpIHsKKwkJZG1hX3Bvb2xfZGVzdHJveSh1ZGMtPnRkX3Bvb2wpOworCQl1ZGMtPnRkX3Bvb2wgPSBOVUxMOworCX0KKwlpZiAodWRjLT5xaF9wb29sICE9IE5VTEwpIHsKKwkJZG1hX3Bvb2xfZGVzdHJveSh1ZGMtPnFoX3Bvb2wpOworCQl1ZGMtPnFoX3Bvb2wgPSBOVUxMOworCX0KKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTCh1c2JfZ2FkZ2V0X3VucmVnaXN0ZXJfZHJpdmVyKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQlVTIGJsb2NrCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioKKyAqIHVkY19pcnE6IGdsb2JhbCBpbnRlcnJ1cHQgaGFuZGxlcgorICoKKyAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBJUlFfSEFORExFRCBpZiB0aGUgSVJRIGhhcyBiZWVuIGhhbmRsZWQKKyAqIEl0IGxvY2tzIGFjY2VzcyB0byByZWdpc3RlcnMKKyAqLworc3RhdGljIGlycXJldHVybl90IHVkY19pcnEodm9pZCkKK3sKKwlzdHJ1Y3QgY2kxM3h4eCAqdWRjID0gX3VkYzsKKwlpcnFyZXR1cm5fdCByZXR2YWw7CisJdTMyIGludHI7CisKKwl0cmFjZSgpOworCisJaWYgKHVkYyA9PSBOVUxMKSB7CisJCWVycigiRU5PREVWIik7CisJCXJldHVybiBJUlFfSEFORExFRDsKKwl9CisKKwlzcGluX2xvY2sodWRjLT5sb2NrKTsKKwlpbnRyID0gaHdfdGVzdF9hbmRfY2xlYXJfaW50cl9hY3RpdmUoKTsKKwlpZiAoaW50cikgeworCQlpc3Jfc3RhdGlzdGljcy5obmRsLmJ1Zltpc3Jfc3RhdGlzdGljcy5obmRsLmlkeCsrXSA9IGludHI7CisJCWlzcl9zdGF0aXN0aWNzLmhuZGwuaWR4ICY9IElTUl9NQVNLOworCQlpc3Jfc3RhdGlzdGljcy5obmRsLmNudCsrOworCisJCS8qIG9yZGVyIGRlZmluZXMgcHJpb3JpdHkgLSBkbyBOT1QgY2hhbmdlIGl0ICovCisJCWlmIChVU0JpX1VSSSAmIGludHIpIHsKKwkJCWlzcl9zdGF0aXN0aWNzLnVyaSsrOworCQkJaXNyX3Jlc2V0X2hhbmRsZXIodWRjKTsKKwkJfQorCQlpZiAoVVNCaV9QQ0kgJiBpbnRyKSB7CisJCQlpc3Jfc3RhdGlzdGljcy5wY2krKzsKKwkJCXVkYy0+Z2FkZ2V0LnNwZWVkID0gaHdfcG9ydF9pc19oaWdoX3NwZWVkKCkgPworCQkJCVVTQl9TUEVFRF9ISUdIIDogVVNCX1NQRUVEX0ZVTEw7CisJCX0KKwkJaWYgKFVTQmlfVUVJICYgaW50cikKKwkJCWlzcl9zdGF0aXN0aWNzLnVlaSsrOworCQlpZiAoVVNCaV9VSSAgJiBpbnRyKSB7CisJCQlpc3Jfc3RhdGlzdGljcy51aSsrOworCQkJaXNyX3RyX2NvbXBsZXRlX2hhbmRsZXIodWRjKTsKKwkJfQorCQlpZiAoVVNCaV9TTEkgJiBpbnRyKQorCQkJaXNyX3N0YXRpc3RpY3Muc2xpKys7CisJCXJldHZhbCA9IElSUV9IQU5ETEVEOworCX0gZWxzZSB7CisJCWlzcl9zdGF0aXN0aWNzLm5vbmUrKzsKKwkJcmV0dmFsID0gSVJRX05PTkU7CisJfQorCXNwaW5fdW5sb2NrKHVkYy0+bG9jayk7CisKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKioKKyAqIHVkY19yZWxlYXNlOiBkcml2ZXIgcmVsZWFzZSBmdW5jdGlvbgorICogQGRldjogZGV2aWNlCisgKgorICogQ3VycmVudGx5IGRvZXMgbm90aGluZworICovCitzdGF0aWMgdm9pZCB1ZGNfcmVsZWFzZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJdHJhY2UoIiVwIiwgZGV2KTsKKworCWlmIChkZXYgPT0gTlVMTCkKKwkJZXJyKCJFSU5WQUwiKTsKK30KKworLyoqCisgKiB1ZGNfcHJvYmU6IHBhcmVudCBwcm9iZSBtdXN0IGNhbGwgdGhpcyB0byBpbml0aWFsaXplIFVEQworICogQGRldjogIHBhcmVudCBkZXZpY2UKKyAqIEByZWdzOiByZWdpc3RlcnMgYmFzZSBhZGRyZXNzCisgKiBAbmFtZTogZHJpdmVyIG5hbWUKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYW4gZXJyb3IgY29kZQorICogTm8gaW50ZXJydXB0cyBhY3RpdmUsIHRoZSBJUlEgaGFzIG5vdCBiZWVuIHJlcXVlc3RlZCB5ZXQKKyAqIEtlcm5lbCBhc3N1bWVzIDMyLWJpdCBETUEgb3BlcmF0aW9ucyBieSBkZWZhdWx0LCBubyBuZWVkIHRvIGRtYV9zZXRfbWFzaworICovCitzdGF0aWMgaW50IHVkY19wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgX19pb21lbSAqcmVncywgY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3QgY2kxM3h4eCAqdWRjOworCWludCByZXR2YWwgPSAwOworCisJdHJhY2UoIiVwLCAlcCwgJXAiLCBkZXYsIHJlZ3MsIG5hbWUpOworCisJaWYgKGRldiA9PSBOVUxMIHx8IHJlZ3MgPT0gTlVMTCB8fCBuYW1lID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCisJdWRjID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGNpMTN4eHgpLCBHRlBfS0VSTkVMKTsKKwlpZiAodWRjID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJdWRjLT5sb2NrID0gJnVkY19sb2NrOworCisJcmV0dmFsID0gaHdfZGV2aWNlX3Jlc2V0KHJlZ3MpOworCWlmIChyZXR2YWwpCisJCWdvdG8gZG9uZTsKKworCXVkYy0+Z2FkZ2V0Lm9wcyAgICAgICAgICA9IE5VTEw7CisJdWRjLT5nYWRnZXQuc3BlZWQgICAgICAgID0gVVNCX1NQRUVEX1VOS05PV047CisJdWRjLT5nYWRnZXQuaXNfZHVhbHNwZWVkID0gMTsKKwl1ZGMtPmdhZGdldC5pc19vdGcgICAgICAgPSAwOworCXVkYy0+Z2FkZ2V0Lm5hbWUgICAgICAgICA9IG5hbWU7CisKKwlJTklUX0xJU1RfSEVBRCgmdWRjLT5nYWRnZXQuZXBfbGlzdCk7CisJdWRjLT5nYWRnZXQuZXAwID0gTlVMTDsKKworCXN0cmNweSh1ZGMtPmdhZGdldC5kZXYuYnVzX2lkLCAiZ2FkZ2V0Iik7CisJdWRjLT5nYWRnZXQuZGV2LmRtYV9tYXNrID0gZGV2LT5kbWFfbWFzazsKKwl1ZGMtPmdhZGdldC5kZXYucGFyZW50ICAgPSBkZXY7CisJdWRjLT5nYWRnZXQuZGV2LnJlbGVhc2UgID0gdWRjX3JlbGVhc2U7CisKKwlyZXR2YWwgPSBkZXZpY2VfcmVnaXN0ZXIoJnVkYy0+Z2FkZ2V0LmRldik7CisJaWYgKHJldHZhbCkKKwkJZ290byBkb25lOworCisjaWZkZWYgQ09ORklHX1VTQl9HQURHRVRfREVCVUdfRklMRVMKKwlyZXR2YWwgPSBkYmdfY3JlYXRlX2ZpbGVzKCZ1ZGMtPmdhZGdldC5kZXYpOworI2VuZGlmCisJaWYgKHJldHZhbCkgeworCQlkZXZpY2VfdW5yZWdpc3RlcigmdWRjLT5nYWRnZXQuZGV2KTsKKwkJZ290byBkb25lOworCX0KKworCV91ZGMgPSB1ZGM7CisJcmV0dXJuIHJldHZhbDsKKworIGRvbmU6CisJZXJyKCJlcnJvciA9ICVpIiwgcmV0dmFsKTsKKwlrZnJlZSh1ZGMpOworCV91ZGMgPSBOVUxMOworCXJldHVybiByZXR2YWw7Cit9CisKKy8qKgorICogdWRjX3JlbW92ZTogcGFyZW50IHJlbW92ZSBtdXN0IGNhbGwgdGhpcyB0byByZW1vdmUgVURDCisgKgorICogTm8gaW50ZXJydXB0cyBhY3RpdmUsIHRoZSBJUlEgaGFzIGJlZW4gcmVsZWFzZWQKKyAqLworc3RhdGljIHZvaWQgdWRjX3JlbW92ZSh2b2lkKQoreworCXN0cnVjdCBjaTEzeHh4ICp1ZGMgPSBfdWRjOworCisJaWYgKHVkYyA9PSBOVUxMKSB7CisJCWVycigiRUlOVkFMIik7CisJCXJldHVybjsKKwl9CisKKyNpZmRlZiBDT05GSUdfVVNCX0dBREdFVF9ERUJVR19GSUxFUworCWRiZ19yZW1vdmVfZmlsZXMoJnVkYy0+Z2FkZ2V0LmRldik7CisjZW5kaWYKKwlkZXZpY2VfdW5yZWdpc3RlcigmdWRjLT5nYWRnZXQuZGV2KTsKKworCWtmcmVlKHVkYyk7CisJX3VkYyA9IE5VTEw7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFBDSSBibG9jaworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgKiBjaTEzeHh4X3BjaV9pcnE6IGludGVycnV0IGhhbmRsZXIKKyAqIEBpcnE6ICBpcnEgbnVtYmVyCisgKiBAcGRldjogVVNCIERldmljZSBDb250cm9sbGVyIGludGVycnVwdCBzb3VyY2UKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgSVJRX0hBTkRMRUQgaWYgdGhlIElSUSBoYXMgYmVlbiBoYW5kbGVkCisgKiBUaGlzIGlzIGFuIElTUiBkb24ndCB0cmFjZSwgdXNlIGF0dHJpYnV0ZSBpbnRlcmZhY2UgaW5zdGVhZAorICovCitzdGF0aWMgaXJxcmV0dXJuX3QgY2kxM3h4eF9wY2lfaXJxKGludCBpcnEsIHZvaWQgKnBkZXYpCit7CisJaWYgKGlycSA9PSAwKSB7CisJCWRldl9lcnIoJigoc3RydWN0IHBjaV9kZXYgKilwZGV2KS0+ZGV2LCAiSW52YWxpZCBJUlEwIHVzYWdlISIpOworCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJfQorCXJldHVybiB1ZGNfaXJxKCk7Cit9CisKKy8qKgorICogY2kxM3h4eF9wY2lfcHJvYmU6IFBDSSBwcm9iZQorICogQHBkZXY6IFVTQiBkZXZpY2UgY29udHJvbGxlciBiZWluZyBwcm9iZWQKKyAqIEBpZDogICBQQ0kgaG90cGx1ZyBJRCBjb25uZWN0aW5nIGNvbnRyb2xsZXIgdG8gVURDIGZyYW1ld29yaworICoKKyAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhbiBlcnJvciBjb2RlCisgKiBBbGxvY2F0ZXMgYmFzaWMgUENJIHJlc291cmNlcyBmb3IgdGhpcyBVU0IgZGV2aWNlIGNvbnRyb2xsZXIsIGFuZCB0aGVuCisgKiBpbnZva2VzIHRoZSB1ZGNfcHJvYmUoKSBtZXRob2QgdG8gc3RhcnQgdGhlIFVEQyBhc3NvY2lhdGVkIHdpdGggaXQKKyAqLworc3RhdGljIGludCBfX2RldmluaXQgY2kxM3h4eF9wY2lfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJCQkJICAgICAgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCkKK3sKKwl2b2lkIF9faW9tZW0gKnJlZ3MgPSBOVUxMOworCWludCByZXR2YWwgPSAwOworCisJaWYgKGlkID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dmFsID0gcGNpX2VuYWJsZV9kZXZpY2UocGRldik7CisJaWYgKHJldHZhbCkKKwkJZ290byBkb25lOworCisJaWYgKCFwZGV2LT5pcnEpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiTm8gSVJRLCBjaGVjayBCSU9TL1BDSSBzZXR1cCEiKTsKKwkJcmV0dmFsID0gLUVOT0RFVjsKKwkJZ290byBkaXNhYmxlX2RldmljZTsKKwl9CisKKwlyZXR2YWwgPSBwY2lfcmVxdWVzdF9yZWdpb25zKHBkZXYsIFVEQ19EUklWRVJfTkFNRSk7CisJaWYgKHJldHZhbCkKKwkJZ290byBkaXNhYmxlX2RldmljZTsKKworCS8qIEJBUiAwIGhvbGRzIGFsbCB0aGUgcmVnaXN0ZXJzICovCisJcmVncyA9IHBjaV9pb21hcChwZGV2LCAwLCAwKTsKKwlpZiAoIXJlZ3MpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiRXJyb3IgbWFwcGluZyBtZW1vcnkhIik7CisJCXJldHZhbCA9IC1FRkFVTFQ7CisJCWdvdG8gcmVsZWFzZV9yZWdpb25zOworCX0KKwlwY2lfc2V0X2RydmRhdGEocGRldiwgKF9fZm9yY2Ugdm9pZCAqKXJlZ3MpOworCisJcGNpX3NldF9tYXN0ZXIocGRldik7CisJcGNpX3RyeV9zZXRfbXdpKHBkZXYpOworCisJcmV0dmFsID0gdWRjX3Byb2JlKCZwZGV2LT5kZXYsIHJlZ3MsIFVEQ19EUklWRVJfTkFNRSk7CisJaWYgKHJldHZhbCkKKwkJZ290byBpb3VubWFwOworCisJLyogb3VyIGRldmljZSBkb2VzIG5vdCBoYXZlIE1TSSBjYXBhYmlsaXR5ICovCisKKwlyZXR2YWwgPSByZXF1ZXN0X2lycShwZGV2LT5pcnEsIGNpMTN4eHhfcGNpX2lycSwgSVJRRl9TSEFSRUQsCisJCQkgICAgIFVEQ19EUklWRVJfTkFNRSwgcGRldik7CisJaWYgKHJldHZhbCkKKwkJZ290byBnYWRnZXRfcmVtb3ZlOworCisJcmV0dXJuIDA7CisKKyBnYWRnZXRfcmVtb3ZlOgorCXVkY19yZW1vdmUoKTsKKyBpb3VubWFwOgorCXBjaV9pb3VubWFwKHBkZXYsIHJlZ3MpOworIHJlbGVhc2VfcmVnaW9uczoKKwlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOworIGRpc2FibGVfZGV2aWNlOgorCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKyBkb25lOgorCXJldHVybiByZXR2YWw7Cit9CisKKy8qKgorICogY2kxM3h4eF9wY2lfcmVtb3ZlOiBQQ0kgcmVtb3ZlCisgKiBAcGRldjogVVNCIERldmljZSBDb250cm9sbGVyIGJlaW5nIHJlbW92ZWQKKyAqCisgKiBSZXZlcnNlcyB0aGUgZWZmZWN0IG9mIGNpMTN4eHhfcGNpX3Byb2JlKCksCisgKiBmaXJzdCBpbnZva2luZyB0aGUgdWRjX3JlbW92ZSgpIGFuZCB0aGVuIHJlbGVhc2VzCisgKiBhbGwgUENJIHJlc291cmNlcyBhbGxvY2F0ZWQgZm9yIHRoaXMgVVNCIGRldmljZSBjb250cm9sbGVyCisgKi8KK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBjaTEzeHh4X3BjaV9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJZnJlZV9pcnEocGRldi0+aXJxLCBwZGV2KTsKKwl1ZGNfcmVtb3ZlKCk7CisJcGNpX2lvdW5tYXAocGRldiwgKF9fZm9yY2Ugdm9pZCBfX2lvbWVtICopcGNpX2dldF9kcnZkYXRhKHBkZXYpKTsKKwlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOworCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKK30KKworLyoqCisgKiBQQ0kgZGV2aWNlIHRhYmxlCisgKiBQQ0kgZGV2aWNlIHN0cnVjdHVyZQorICoKKyAqIENoZWNrICJwY2kuaCIgZm9yIGRldGFpbHMKKyAqLworc3RhdGljIERFRklORV9QQ0lfREVWSUNFX1RBQkxFKGNpMTN4eHhfcGNpX2lkX3RhYmxlKSA9IHsKKwl7IFBDSV9ERVZJQ0UoMHgxNTNGLCAweDEwMDQpIH0sCisJeyBQQ0lfREVWSUNFKDB4MTUzRiwgMHgxMDA2KSB9LAorCXsgMCwgMCwgMCwgMCwgMCwgMCwgMCAvKiBlbmQ6IGFsbCB6ZXJvZXMgKi8gfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBjaTEzeHh4X3BjaV9pZF90YWJsZSk7CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBjaTEzeHh4X3BjaV9kcml2ZXIgPSB7CisJLm5hbWUgICAgICAgICA9CVVEQ19EUklWRVJfTkFNRSwKKwkuaWRfdGFibGUgICAgID0JY2kxM3h4eF9wY2lfaWRfdGFibGUsCisJLnByb2JlICAgICAgICA9CWNpMTN4eHhfcGNpX3Byb2JlLAorCS5yZW1vdmUgICAgICAgPQlfX2RldmV4aXRfcChjaTEzeHh4X3BjaV9yZW1vdmUpLAorfTsKKworLyoqCisgKiBjaTEzeHh4X3BjaV9pbml0OiBtb2R1bGUgaW5pdAorICoKKyAqIERyaXZlciBsb2FkCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IGNpMTN4eHhfcGNpX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmY2kxM3h4eF9wY2lfZHJpdmVyKTsKK30KK21vZHVsZV9pbml0KGNpMTN4eHhfcGNpX2luaXQpOworCisvKioKKyAqIGNpMTN4eHhfcGNpX2V4aXQ6IG1vZHVsZSBleGl0CisgKgorICogRHJpdmVyIHVubG9hZAorICovCitzdGF0aWMgdm9pZCBfX2V4aXQgY2kxM3h4eF9wY2lfZXhpdCh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmY2kxM3h4eF9wY2lfZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KGNpMTN4eHhfcGNpX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJNSVBTIC0gRGF2aWQgTG9wbyA8ZGxvcG9AY2hpcGlkZWEubWlwcy5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIk1JUFMgQ0kxM1hYWCBVU0IgUGVyaXBoZXJhbCBDb250cm9sbGVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfVkVSU0lPTigiSnVuZSAyMDA4Iik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvY2kxM3h4eF91ZGMuaCBiL2RyaXZlcnMvdXNiL2dhZGdldC9jaTEzeHh4X3VkYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwMjZlOWMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvY2kxM3h4eF91ZGMuaApAQCAtMCwwICsxLDE5NSBAQAorLyoKKyAqIGNpMTN4eHhfdWRjLmggLSBzdHJ1Y3R1cmVzLCByZWdpc3RlcnMsIGFuZCBtYWNyb3MgTUlQUyBVU0IgSVAgY29yZQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBDaGlwaWRlYSAtIE1JUFMgVGVjaG5vbG9naWVzLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogQXV0aG9yOiBEYXZpZCBMb3BvCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBEZXNjcmlwdGlvbjogTUlQUyBVU0IgSVAgY29yZSBmYW1pbHkgZGV2aWNlIGNvbnRyb2xsZXIKKyAqICAgICAgICAgICAgICBTdHJ1Y3R1cmVzLCByZWdpc3RlcnMgYW5kIGxvZ2dpbmcgbWFjcm9zCisgKi8KKworI2lmbmRlZiBfQ0kxM1hYWF9oXworI2RlZmluZSBfQ0kxM1hYWF9oXworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBERUZJTkUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgRU5EUFRfTUFYICAgICAgICAgICgxNikKKyNkZWZpbmUgQ1RSTF9QQVlMT0FEX01BWCAgICg2NCkKKyNkZWZpbmUgUlggICAgICAgICgwKSAgLyogc2ltaWxhciB0byBVU0JfRElSX09VVCBidXQgY2FuIGJlIHVzZWQgYXMgYW4gaW5kZXggKi8KKyNkZWZpbmUgVFggICAgICAgICgxKSAgLyogc2ltaWxhciB0byBVU0JfRElSX0lOICBidXQgY2FuIGJlIHVzZWQgYXMgYW4gaW5kZXggKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogU1RSVUNUVVJFUworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogRE1BIGxheW91dCBvZiB0cmFuc2ZlciBkZXNjcmlwdG9ycyAqLworc3RydWN0IGNpMTN4eHhfdGQgeworCS8qIDAgKi8KKwl1MzIgbmV4dDsKKyNkZWZpbmUgVERfVEVSTUlOQVRFICAgICAgICAgIEJJVCgwKQorCS8qIDEgKi8KKwl1MzIgdG9rZW47CisjZGVmaW5lIFREX1NUQVRVUyAgICAgICAgICAgICAoMHgwMEZGVUwgPDwgIDApCisjZGVmaW5lIFREX1NUQVRVU19UUl9FUlIgICAgICBCSVQoMykKKyNkZWZpbmUgVERfU1RBVFVTX0RUX0VSUiAgICAgIEJJVCg1KQorI2RlZmluZSBURF9TVEFUVVNfSEFMVEVEICAgICAgQklUKDYpCisjZGVmaW5lIFREX1NUQVRVU19BQ1RJVkUgICAgICBCSVQoNykKKyNkZWZpbmUgVERfTVVMVE8gICAgICAgICAgICAgICgweDAwMDNVTCA8PCAxMCkKKyNkZWZpbmUgVERfSU9DICAgICAgICAgICAgICAgIEJJVCgxNSkKKyNkZWZpbmUgVERfVE9UQUxfQllURVMgICAgICAgICgweDdGRkZVTCA8PCAxNikKKwkvKiAyICovCisJdTMyIHBhZ2VbNV07CisjZGVmaW5lIFREX0NVUlJfT0ZGU0VUICAgICAgICAoMHgwRkZGVUwgPDwgIDApCisjZGVmaW5lIFREX0ZSQU1FX05VTSAgICAgICAgICAoMHgwN0ZGVUwgPDwgIDApCisjZGVmaW5lIFREX1JFU0VSVkVEX01BU0sgICAgICAoMHgwRkZGVUwgPDwgIDApCit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyogRE1BIGxheW91dCBvZiBxdWV1ZSBoZWFkcyAqLworc3RydWN0IGNpMTN4eHhfcWggeworCS8qIDAgKi8KKwl1MzIgY2FwOworI2RlZmluZSBRSF9JT1MgICAgICAgICAgICAgICAgQklUKDE1KQorI2RlZmluZSBRSF9NQVhfUEtUICAgICAgICAgICAgKDB4MDdGRlVMIDw8IDE2KQorI2RlZmluZSBRSF9aTFQgICAgICAgICAgICAgICAgQklUKDI5KQorI2RlZmluZSBRSF9NVUxUICAgICAgICAgICAgICAgKDB4MDAwM1VMIDw8IDMwKQorCS8qIDEgKi8KKwl1MzIgY3VycjsKKwkvKiAyIC0gOCAqLworCXN0cnVjdCBjaTEzeHh4X3RkICAgICAgICB0ZDsKKwkvKiA5ICovCisJdTMyIFJFU0VSVkVEOworCXN0cnVjdCB1c2JfY3RybHJlcXVlc3QgICBzZXR1cDsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKiBFeHRlbnNpb24gb2YgdXNiX3JlcXVlc3QgKi8KK3N0cnVjdCBjaTEzeHh4X3JlcSB7CisJc3RydWN0IHVzYl9yZXF1ZXN0ICAgcmVxOworCXVuc2lnbmVkICAgICAgICAgICAgIG1hcDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICAgICBxdWV1ZTsKKwlzdHJ1Y3QgY2kxM3h4eF90ZCAgICpwdHI7CisJZG1hX2FkZHJfdCAgICAgICAgICAgZG1hOworfTsKKworLyogRXh0ZW5zaW9uIG9mIHVzYl9lcCAqLworc3RydWN0IGNpMTN4eHhfZXAgeworCXN0cnVjdCB1c2JfZXAgICAgICAgICAgICAgICAgICAgICAgICAgIGVwOworCWNvbnN0IHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAgKmRlc2M7CisJdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyOworCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bTsKKwl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOworCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVbMTZdOworCXN0cnVjdCB7CisJCXN0cnVjdCBsaXN0X2hlYWQgICBxdWV1ZTsKKwkJc3RydWN0IGNpMTN4eHhfcWggKnB0cjsKKwkJZG1hX2FkZHJfdCAgICAgICAgIGRtYTsKKwl9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxaFsyXTsKKwlzdHJ1Y3QgdXNiX3JlcXVlc3QgICAgICAgICAgICAgICAgICAgICpzdGF0dXM7CisJaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2VkZ2U7CisKKwkvKiBnbG9iYWwgcmVzb3VyY2VzICovCisJc3BpbmxvY2tfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbG9jazsKKwlzdHJ1Y3QgZGV2aWNlICAgICAgICAgICAgICAgICAgICAgICAgICpkZXZpY2U7CisJc3RydWN0IGRtYV9wb29sICAgICAgICAgICAgICAgICAgICAgICAqdGRfcG9vbDsKK307CisKKy8qIENJMTNYWFggVURDIGRlc2NyaXB0b3IgJiBnbG9iYWwgcmVzb3VyY2VzICovCitzdHJ1Y3QgY2kxM3h4eCB7CisJc3BpbmxvY2tfdAkJICAqbG9jazsgICAgICAvKiBjdHJsIHJlZ2lzdGVyIGJhbmsgYWNjZXNzICovCisKKwlzdHJ1Y3QgZG1hX3Bvb2wgICAgICAgICAgICpxaF9wb29sOyAgIC8qIERNQSBwb29sIGZvciBxdWV1ZSBoZWFkcyAqLworCXN0cnVjdCBkbWFfcG9vbCAgICAgICAgICAgKnRkX3Bvb2w7ICAgLyogRE1BIHBvb2wgZm9yIHRyYW5zZmVyIGRlc2NzICovCisKKwlzdHJ1Y3QgdXNiX2dhZGdldCAgICAgICAgICBnYWRnZXQ7ICAgICAvKiBVU0Igc2xhdmUgZGV2aWNlICovCisJc3RydWN0IGNpMTN4eHhfZXAgICAgICAgICAgY2kxM3h4eF9lcFtFTkRQVF9NQVhdOyAvKiBleHRlbmRlZCBlbmRwdHMgKi8KKworCXN0cnVjdCB1c2JfZ2FkZ2V0X2RyaXZlciAgKmRyaXZlcjsgICAgIC8qIDNyZCBwYXJ0eSBnYWRnZXQgZHJpdmVyICovCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSRUdJU1RFUlMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIHJlZ2lzdGVyIHNpemUgKi8KKyNkZWZpbmUgUkVHX0JJVFMgICAoMzIpCisKKy8qIEhDQ1BBUkFNUyAqLworI2RlZmluZSBIQ0NQQVJBTVNfTEVOICAgICAgICAgQklUKDE3KQorCisvKiBEQ0NQQVJBTVMgKi8KKyNkZWZpbmUgRENDUEFSQU1TX0RFTiAgICAgICAgICgweDFGIDw8IDApCisjZGVmaW5lIERDQ1BBUkFNU19EQyAgICAgICAgICBCSVQoNykKKworLyogVEVTVE1PREUgKi8KKyNkZWZpbmUgVEVTVE1PREVfRk9SQ0UgICAgICAgIEJJVCgwKQorCisvKiBVU0JDTUQgKi8KKyNkZWZpbmUgVVNCQ01EX1JTICAgICAgICAgICAgIEJJVCgwKQorI2RlZmluZSBVU0JDTURfUlNUICAgICAgICAgICAgQklUKDEpCisjZGVmaW5lIFVTQkNNRF9TVVRXICAgICAgICAgICBCSVQoMTMpCisKKy8qIFVTQlNUUyAmIFVTQklOVFIgKi8KKyNkZWZpbmUgVVNCaV9VSSAgICAgICAgICAgICAgIEJJVCgwKQorI2RlZmluZSBVU0JpX1VFSSAgICAgICAgICAgICAgQklUKDEpCisjZGVmaW5lIFVTQmlfUENJICAgICAgICAgICAgICBCSVQoMikKKyNkZWZpbmUgVVNCaV9VUkkgICAgICAgICAgICAgIEJJVCg2KQorI2RlZmluZSBVU0JpX1NMSSAgICAgICAgICAgICAgQklUKDgpCisKKy8qIERFVklDRUFERFIgKi8KKyNkZWZpbmUgREVWSUNFQUREUl9VU0JBRFJBICAgIEJJVCgyNCkKKyNkZWZpbmUgREVWSUNFQUREUl9VU0JBRFIgICAgICgweDdGVUwgPDwgMjUpCisKKy8qIFBPUlRTQyAqLworI2RlZmluZSBQT1JUU0NfU1VTUCAgICAgICAgICAgQklUKDcpCisjZGVmaW5lIFBPUlRTQ19IU1AgICAgICAgICAgICBCSVQoOSkKKyNkZWZpbmUgUE9SVFNDX1BUQyAgICAgICAgICAgICgweDBGVUwgPDwgMTYpCisKKy8qIERFVkxDICovCisjZGVmaW5lIERFVkxDX1BTUEQgICAgICAgICAgICAoMHgwM1VMIDw8IDI1KQorI2RlZmluZSAgICBERVZMQ19QU1BEX0hTICAgICAgKDB4MDJVTCA8PCAyNSkKKworLyogVVNCTU9ERSAqLworI2RlZmluZSBVU0JNT0RFX0NNICAgICAgICAgICAgKDB4MDNVTCA8PCAgMCkKKyNkZWZpbmUgICAgVVNCTU9ERV9DTV9JRExFICAgICgweDAwVUwgPDwgIDApCisjZGVmaW5lICAgIFVTQk1PREVfQ01fREVWSUNFICAoMHgwMlVMIDw8ICAwKQorI2RlZmluZSAgICBVU0JNT0RFX0NNX0hPU1QgICAgKDB4MDNVTCA8PCAgMCkKKyNkZWZpbmUgVVNCTU9ERV9TTE9NICAgICAgICAgIEJJVCgzKQorCisvKiBFTkRQVENUUkwgKi8KKyNkZWZpbmUgRU5EUFRDVFJMX1JYUyAgICAgICAgIEJJVCgwKQorI2RlZmluZSBFTkRQVENUUkxfUlhUICAgICAgICAgKDB4MDNVTCA8PCAgMikKKyNkZWZpbmUgRU5EUFRDVFJMX1JYUiAgICAgICAgIEJJVCg2KSAgICAgICAgIC8qIHJlc2VydmVkIGZvciBwb3J0IDAgKi8KKyNkZWZpbmUgRU5EUFRDVFJMX1JYRSAgICAgICAgIEJJVCg3KQorI2RlZmluZSBFTkRQVENUUkxfVFhTICAgICAgICAgQklUKDE2KQorI2RlZmluZSBFTkRQVENUUkxfVFhUICAgICAgICAgKDB4MDNVTCA8PCAxOCkKKyNkZWZpbmUgRU5EUFRDVFJMX1RYUiAgICAgICAgIEJJVCgyMikgICAgICAgIC8qIHJlc2VydmVkIGZvciBwb3J0IDAgKi8KKyNkZWZpbmUgRU5EUFRDVFJMX1RYRSAgICAgICAgIEJJVCgyMykKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTE9HR0lORworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBjaTEzeHh4X3ByaW50ayhsZXZlbCwgZm9ybWF0LCBhcmdzLi4uKSBcCitkbyB7IFwKKwlpZiAoX3VkYyA9PSBOVUxMKSBcCisJCXByaW50ayhsZXZlbCAiWyVzXSAiIGZvcm1hdCAiXG4iLCBfX2Z1bmNfXywgIyMgYXJncyk7IFwKKwllbHNlIFwKKwkJZGV2X3ByaW50ayhsZXZlbCwgX3VkYy0+Z2FkZ2V0LmRldi5wYXJlbnQsIFwKKwkJCSAgICJbJXNdICIgZm9ybWF0ICJcbiIsIF9fZnVuY19fLCAjIyBhcmdzKTsgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBlcnIoZm9ybWF0LCBhcmdzLi4uKSAgICBjaTEzeHh4X3ByaW50ayhLRVJOX0VSUiwgZm9ybWF0LCAjIyBhcmdzKQorI2RlZmluZSB3YXJuKGZvcm1hdCwgYXJncy4uLikgICBjaTEzeHh4X3ByaW50ayhLRVJOX1dBUk5JTkcsIGZvcm1hdCwgIyMgYXJncykKKyNkZWZpbmUgaW5mbyhmb3JtYXQsIGFyZ3MuLi4pICAgY2kxM3h4eF9wcmludGsoS0VSTl9JTkZPLCBmb3JtYXQsICMjIGFyZ3MpCisKKyNpZmRlZiBUUkFDRQorI2RlZmluZSB0cmFjZShmb3JtYXQsIGFyZ3MuLi4pICAgICAgY2kxM3h4eF9wcmludGsoS0VSTl9ERUJVRywgZm9ybWF0LCAjIyBhcmdzKQorI2RlZmluZSBkYmdfdHJhY2UoZm9ybWF0LCBhcmdzLi4uKSAgZGV2X2RiZyhkZXYsIGZvcm1hdCwgIyNhcmdzKQorI2Vsc2UKKyNkZWZpbmUgdHJhY2UoZm9ybWF0LCBhcmdzLi4uKSAgICAgIGRvIHt9IHdoaWxlICgwKQorI2RlZmluZSBkYmdfdHJhY2UoZm9ybWF0LCBhcmdzLi4uKSAgZG8ge30gd2hpbGUgKDApCisjZW5kaWYKKworI2VuZGlmCS8qIF9DSTEzWFhYX2hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvZXBhdXRvY29uZi5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2VwYXV0b2NvbmYuYwppbmRleCA5NDYyZTMwLi5hMzZiMTE3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvZXBhdXRvY29uZi5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9lcGF1dG9jb25mLmMKQEAgLTE2MSw3ICsxNjEsNyBAQAogCS8qIHJlcG9ydCBhZGRyZXNzICovCiAJZGVzYy0+YkVuZHBvaW50QWRkcmVzcyAmPSBVU0JfRElSX0lOOwogCWlmIChpc2RpZ2l0IChlcC0+bmFtZSBbMl0pKSB7Ci0JCXU4CW51bSA9IHNpbXBsZV9zdHJ0b2wgKCZlcC0+bmFtZSBbMl0sIE5VTEwsIDEwKTsKKwkJdTgJbnVtID0gc2ltcGxlX3N0cnRvdWwgKCZlcC0+bmFtZSBbMl0sIE5VTEwsIDEwKTsKIAkJZGVzYy0+YkVuZHBvaW50QWRkcmVzcyB8PSBudW07CiAjaWZkZWYJTUFOWV9FTkRQT0lOVFMKIAl9IGVsc2UgaWYgKGRlc2MtPmJFbmRwb2ludEFkZHJlc3MgJiBVU0JfRElSX0lOKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvZl9waG9uZXQuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9mX3Bob25ldC5jCmluZGV4IGQ4ZmM5YjMuLmMwOTE2YzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9mX3Bob25ldC5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9mX3Bob25ldC5jCkBAIC0yNzksNiArMjc5LDEzIEBACiAJcmV0dXJuIGVycjsKIH0KIAorc3RhdGljIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyBwbl9uZXRkZXZfb3BzID0geworCS5uZG9fb3Blbgk9IHBuX25ldF9vcGVuLAorCS5uZG9fc3RvcAk9IHBuX25ldF9jbG9zZSwKKwkubmRvX3N0YXJ0X3htaXQJPSBwbl9uZXRfeG1pdCwKKwkubmRvX2NoYW5nZV9tdHUJPSBwbl9uZXRfbXR1LAorfTsKKwogc3RhdGljIHZvaWQgcG5fbmV0X3NldHVwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJZGV2LT5mZWF0dXJlcwkJPSAwOwpAQCAtMjkwLDEyICsyOTcsOSBAQAogCWRldi0+YWRkcl9sZW4JCT0gMTsKIAlkZXYtPnR4X3F1ZXVlX2xlbgk9IDE7CiAKKwlkZXYtPm5ldGRldl9vcHMJCT0gJnBuX25ldGRldl9vcHM7CiAJZGV2LT5kZXN0cnVjdG9yCQk9IGZyZWVfbmV0ZGV2OwogCWRldi0+aGVhZGVyX29wcwkJPSAmcGhvbmV0X2hlYWRlcl9vcHM7Ci0JZGV2LT5vcGVuCQk9IHBuX25ldF9vcGVuOwotCWRldi0+c3RvcAkJPSBwbl9uZXRfY2xvc2U7Ci0JZGV2LT5oYXJkX3N0YXJ0X3htaXQJPSBwbl9uZXRfeG1pdDsgLyogbWFuZGF0b3J5ICovCi0JZGV2LT5jaGFuZ2VfbXR1CQk9IHBuX25ldF9tdHU7CiB9CiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvZmlsZV9zdG9yYWdlLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZmlsZV9zdG9yYWdlLmMKaW5kZXggMmU3MTM2OC4uYjEwZmEzMSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L2ZpbGVfc3RvcmFnZS5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9maWxlX3N0b3JhZ2UuYwpAQCAtMSw3ICsxLDcgQEAKIC8qCiAgKiBmaWxlX3N0b3JhZ2UuYyAtLSBGaWxlLWJhY2tlZCBVU0IgU3RvcmFnZSBHYWRnZXQsIGZvciBVU0IgZGV2ZWxvcG1lbnQKICAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwNyBBbGFuIFN0ZXJuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwOCBBbGFuIFN0ZXJuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApAQCAtMzgsMTYgKzM4LDE3IEBACiAKIC8qCiAgKiBUaGUgRmlsZS1iYWNrZWQgU3RvcmFnZSBHYWRnZXQgYWN0cyBhcyBhIFVTQiBNYXNzIFN0b3JhZ2UgZGV2aWNlLAotICogYXBwZWFyaW5nIHRvIHRoZSBob3N0IGFzIGEgZGlzayBkcml2ZS4gIEluIGFkZGl0aW9uIHRvIHByb3ZpZGluZyBhbgotICogZXhhbXBsZSBvZiBhIGdlbnVpbmVseSB1c2VmdWwgZ2FkZ2V0IGRyaXZlciBmb3IgYSBVU0IgZGV2aWNlLCBpdCBhbHNvCi0gKiBpbGx1c3RyYXRlcyBhIHRlY2huaXF1ZSBvZiBkb3VibGUtYnVmZmVyaW5nIGZvciBpbmNyZWFzZWQgdGhyb3VnaHB1dC4KLSAqIExhc3QgYnV0IG5vdCBsZWFzdCwgaXQgZ2l2ZXMgYW4gZWFzeSB3YXkgdG8gcHJvYmUgdGhlIGJlaGF2aW9yIG9mIHRoZQotICogTWFzcyBTdG9yYWdlIGRyaXZlcnMgaW4gYSBVU0IgaG9zdC4KKyAqIGFwcGVhcmluZyB0byB0aGUgaG9zdCBhcyBhIGRpc2sgZHJpdmUgb3IgYXMgYSBDRC1ST00gZHJpdmUuICBJbiBhZGRpdGlvbgorICogdG8gcHJvdmlkaW5nIGFuIGV4YW1wbGUgb2YgYSBnZW51aW5lbHkgdXNlZnVsIGdhZGdldCBkcml2ZXIgZm9yIGEgVVNCCisgKiBkZXZpY2UsIGl0IGFsc28gaWxsdXN0cmF0ZXMgYSB0ZWNobmlxdWUgb2YgZG91YmxlLWJ1ZmZlcmluZyBmb3IgaW5jcmVhc2VkCisgKiB0aHJvdWdocHV0LiAgTGFzdCBidXQgbm90IGxlYXN0LCBpdCBnaXZlcyBhbiBlYXN5IHdheSB0byBwcm9iZSB0aGUKKyAqIGJlaGF2aW9yIG9mIHRoZSBNYXNzIFN0b3JhZ2UgZHJpdmVycyBpbiBhIFVTQiBob3N0LgogICoKICAqIEJhY2tpbmcgc3RvcmFnZSBpcyBwcm92aWRlZCBieSBhIHJlZ3VsYXIgZmlsZSBvciBhIGJsb2NrIGRldmljZSwgc3BlY2lmaWVkCiAgKiBieSB0aGUgImZpbGUiIG1vZHVsZSBwYXJhbWV0ZXIuICBBY2Nlc3MgY2FuIGJlIGxpbWl0ZWQgdG8gcmVhZC1vbmx5IGJ5Ci0gKiBzZXR0aW5nIHRoZSBvcHRpb25hbCAicm8iIG1vZHVsZSBwYXJhbWV0ZXIuICBUaGUgZ2FkZ2V0IHdpbGwgaW5kaWNhdGUgdGhhdAotICogaXQgaGFzIHJlbW92YWJsZSBtZWRpYSBpZiB0aGUgb3B0aW9uYWwgInJlbW92YWJsZSIgbW9kdWxlIHBhcmFtZXRlciBpcyBzZXQuCisgKiBzZXR0aW5nIHRoZSBvcHRpb25hbCAicm8iIG1vZHVsZSBwYXJhbWV0ZXIuICAoRm9yIENELVJPTSBlbXVsYXRpb24sCisgKiBhY2Nlc3MgaXMgYWx3YXlzIHJlYWQtb25seS4pICBUaGUgZ2FkZ2V0IHdpbGwgaW5kaWNhdGUgdGhhdCBpdCBoYXMKKyAqIHJlbW92YWJsZSBtZWRpYSBpZiB0aGUgb3B0aW9uYWwgInJlbW92YWJsZSIgbW9kdWxlIHBhcmFtZXRlciBpcyBzZXQuCiAgKgogICogVGhlIGdhZGdldCBzdXBwb3J0cyB0aGUgQ29udHJvbC1CdWxrIChDQiksIENvbnRyb2wtQnVsay1JbnRlcnJ1cHQgKENCSSksCiAgKiBhbmQgQnVsay1Pbmx5IChhbHNvIGtub3duIGFzIEJ1bGstQnVsay1CdWxrIG9yIEJCQikgdHJhbnNwb3J0cywgc2VsZWN0ZWQKQEAgLTY0LDcgKzY1LDEyIEBACiAgKiBUaGUgZGVmYXVsdCBudW1iZXIgb2YgTFVOcyBpcyB0YWtlbiBmcm9tIHRoZSBudW1iZXIgb2YgImZpbGUiIGVsZW1lbnRzOwogICogaXQgaXMgMSBpZiAiZmlsZSIgaXMgbm90IGdpdmVuLiAgSWYgInJlbW92YWJsZSIgaXMgbm90IHNldCB0aGVuIGEgYmFja2luZwogICogZmlsZSBtdXN0IGJlIHNwZWNpZmllZCBmb3IgZWFjaCBMVU4uICBJZiBpdCBpcyBzZXQsIHRoZW4gYW4gdW5zcGVjaWZpZWQKLSAqIG9yIGVtcHR5IGJhY2tpbmcgZmlsZW5hbWUgbWVhbnMgdGhlIExVTidzIG1lZGl1bSBpcyBub3QgbG9hZGVkLgorICogb3IgZW1wdHkgYmFja2luZyBmaWxlbmFtZSBtZWFucyB0aGUgTFVOJ3MgbWVkaXVtIGlzIG5vdCBsb2FkZWQuICBJZGVhbGx5CisgKiBlYWNoIExVTiB3b3VsZCBiZSBzZXR0YWJsZSBpbmRlcGVuZGVudGx5IGFzIGEgZGlzayBkcml2ZSBvciBhIENELVJPTQorICogZHJpdmUsIGJ1dCBjdXJyZW50bHkgYWxsIExVTnMgaGF2ZSB0byBiZSB0aGUgc2FtZSB0eXBlLiAgVGhlIENELVJPTQorICogZW11bGF0aW9uIGluY2x1ZGVzIGEgc2luZ2xlIGRhdGEgdHJhY2sgYW5kIG5vIGF1ZGlvIHRyYWNrczsgaGVuY2UgdGhlcmUKKyAqIG5lZWQgYmUgb25seSBvbmUgYmFja2luZyBmaWxlIHBlciBMVU4uICBOb3RlIGFsc28gdGhhdCB0aGUgQ0QtUk9NIGJsb2NrCisgKiBsZW5ndGggaXMgc2V0IHRvIDUxMiByYXRoZXIgdGhhbiB0aGUgbW9yZSBjb21tb24gdmFsdWUgMjA0OC4KICAqCiAgKiBSZXF1aXJlbWVudHMgYXJlIG1vZGVzdDsgb25seSBhIGJ1bGstaW4gYW5kIGEgYnVsay1vdXQgZW5kcG9pbnQgYXJlCiAgKiBuZWVkZWQgKGFuIGludGVycnVwdC1vdXQgZW5kcG9pbnQgaXMgYWxzbyBuZWVkZWQgZm9yIENCSSkuICBUaGUgbWVtb3J5CkBAIC05MSw2ICs5Nyw4IEBACiAgKgkJCQkJVVNCIGRldmljZSBjb250cm9sbGVyICh1c3VhbGx5IHRydWUpLAogICoJCQkJCWJvb2xlYW4gdG8gcGVybWl0IHRoZSBkcml2ZXIgdG8gaGFsdAogICoJCQkJCWJ1bGsgZW5kcG9pbnRzCisgKgljZHJvbQkJCURlZmF1bHQgZmFsc2UsIGJvb2xlYW4gZm9yIHdoZXRoZXIgdG8gZW11bGF0ZQorICoJCQkJCWEgQ0QtUk9NIGRyaXZlCiAgKgl0cmFuc3BvcnQ9WFhYCQlEZWZhdWx0IEJCQiwgdHJhbnNwb3J0IG5hbWUgKENCLCBDQkksIG9yIEJCQikKICAqCXByb3RvY29sPVlZWQkJRGVmYXVsdCBTQ1NJLCBwcm90b2NvbCBuYW1lIChSQkMsIDgwMjAgb3IKICAqCQkJCQlBVEFQSSwgUUlDLCBVRkksIDgwNzAsIG9yIFNDU0k7CkBAIC0xMDMsMTUgKzExMSwxNiBAQAogICoJCQkJCVBBR0VfQ0FDSEVfU0laRSkKICAqCiAgKiBJZiBDT05GSUdfVVNCX0ZJTEVfU1RPUkFHRV9URVNUIGlzIG5vdCBzZXQsIG9ubHkgdGhlICJmaWxlIiwgInJvIiwKLSAqICJyZW1vdmFibGUiLCAibHVucyIsIGFuZCAic3RhbGwiIG9wdGlvbnMgYXJlIGF2YWlsYWJsZTsgZGVmYXVsdCB2YWx1ZXMKLSAqIGFyZSB1c2VkIGZvciBldmVyeXRoaW5nIGVsc2UuCisgKiAicmVtb3ZhYmxlIiwgImx1bnMiLCAic3RhbGwiLCBhbmQgImNkcm9tIiBvcHRpb25zIGFyZSBhdmFpbGFibGU7IGRlZmF1bHQKKyAqIHZhbHVlcyBhcmUgdXNlZCBmb3IgZXZlcnl0aGluZyBlbHNlLgogICoKICAqIFRoZSBwYXRobmFtZXMgb2YgdGhlIGJhY2tpbmcgZmlsZXMgYW5kIHRoZSBybyBzZXR0aW5ncyBhcmUgYXZhaWxhYmxlIGluCiAgKiB0aGUgYXR0cmlidXRlIGZpbGVzICJmaWxlIiBhbmQgInJvIiBpbiB0aGUgbHVuPG4+IHN1YmRpcmVjdG9yeSBvZiB0aGUKICAqIGdhZGdldCdzIHN5c2ZzIGRpcmVjdG9yeS4gIElmIHRoZSAicmVtb3ZhYmxlIiBvcHRpb24gaXMgc2V0LCB3cml0aW5nIHRvCiAgKiB0aGVzZSBmaWxlcyB3aWxsIHNpbXVsYXRlIGVqZWN0aW5nL2xvYWRpbmcgdGhlIG1lZGl1bSAod3JpdGluZyBhbiBlbXB0eQogICogbGluZSBtZWFucyBlamVjdCkgYW5kIGFkanVzdGluZyBhIHdyaXRlLWVuYWJsZSB0YWIuICBDaGFuZ2VzIHRvIHRoZSBybwotICogc2V0dGluZyBhcmUgbm90IGFsbG93ZWQgd2hlbiB0aGUgbWVkaXVtIGlzIGxvYWRlZC4KKyAqIHNldHRpbmcgYXJlIG5vdCBhbGxvd2VkIHdoZW4gdGhlIG1lZGl1bSBpcyBsb2FkZWQgb3IgaWYgQ0QtUk9NIGVtdWxhdGlvbgorICogaXMgYmVpbmcgdXNlZC4KICAqCiAgKiBUaGlzIGdhZGdldCBkcml2ZXIgaXMgaGVhdmlseSBiYXNlZCBvbiAiR2FkZ2V0IFplcm8iIGJ5IERhdmlkIEJyb3duZWxsLgogICogVGhlIGRyaXZlcidzIFNDU0kgY29tbWFuZCBpbnRlcmZhY2Ugd2FzIGJhc2VkIG9uIHRoZSAiSW5mb3JtYXRpb24KQEAgLTI2MSw3ICsyNzAsNyBAQAogCiAjZGVmaW5lIERSSVZFUl9ERVNDCQkiRmlsZS1iYWNrZWQgU3RvcmFnZSBHYWRnZXQiCiAjZGVmaW5lIERSSVZFUl9OQU1FCQkiZ19maWxlX3N0b3JhZ2UiCi0jZGVmaW5lIERSSVZFUl9WRVJTSU9OCQkiNyBBdWd1c3QgMjAwNyIKKyNkZWZpbmUgRFJJVkVSX1ZFUlNJT04JCSIyMCBOb3ZlbWJlciAyMDA4IgogCiBzdGF0aWMgY29uc3QgY2hhciBsb25nbmFtZVtdID0gRFJJVkVSX0RFU0M7CiBzdGF0aWMgY29uc3QgY2hhciBzaG9ydG5hbWVbXSA9IERSSVZFUl9OQU1FOwpAQCAtMzQxLDYgKzM1MCw3IEBACiAKIAlpbnQJCXJlbW92YWJsZTsKIAlpbnQJCWNhbl9zdGFsbDsKKwlpbnQJCWNkcm9tOwogCiAJY2hhcgkJKnRyYW5zcG9ydF9wYXJtOwogCWNoYXIJCSpwcm90b2NvbF9wYXJtOwpAQCAtMzU5LDYgKzM2OSw3IEBACiAJLnByb3RvY29sX3Bhcm0JCT0gIlNDU0kiLAogCS5yZW1vdmFibGUJCT0gMCwKIAkuY2FuX3N0YWxsCQk9IDEsCisJLmNkcm9tCQkJPSAwLAogCS52ZW5kb3IJCQk9IERSSVZFUl9WRU5ET1JfSUQsCiAJLnByb2R1Y3QJCT0gRFJJVkVSX1BST0RVQ1RfSUQsCiAJLnJlbGVhc2UJCT0gMHhmZmZmLAkvLyBVc2UgY29udHJvbGxlciBjaGlwIHR5cGUKQEAgLTM4Miw2ICszOTMsOSBAQAogbW9kdWxlX3BhcmFtX25hbWVkKHN0YWxsLCBtb2RfZGF0YS5jYW5fc3RhbGwsIGJvb2wsIFNfSVJVR08pOwogTU9EVUxFX1BBUk1fREVTQyhzdGFsbCwgImZhbHNlIHRvIHByZXZlbnQgYnVsayBzdGFsbHMiKTsKIAorbW9kdWxlX3BhcmFtX25hbWVkKGNkcm9tLCBtb2RfZGF0YS5jZHJvbSwgYm9vbCwgU19JUlVHTyk7CitNT0RVTEVfUEFSTV9ERVNDKGNkcm9tLCAidHJ1ZSB0byBlbXVsYXRlIGNkcm9tIGluc3RlYWQgb2YgZGlzayIpOworCiAKIC8qIEluIHRoZSBub24tVEVTVCB2ZXJzaW9uLCBvbmx5IHRoZSBtb2R1bGUgcGFyYW1ldGVycyBsaXN0ZWQgYWJvdmUKICAqIGFyZSBhdmFpbGFibGUuICovCkBAIC00MTEsNiArNDI1LDEwIEBACiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKKy8qIFNDU0kgZGV2aWNlIHR5cGVzICovCisjZGVmaW5lIFRZUEVfRElTSwkweDAwCisjZGVmaW5lIFRZUEVfQ0RST00JMHgwNQorCiAvKiBVU0IgcHJvdG9jb2wgdmFsdWUgPSB0aGUgdHJhbnNwb3J0IG1ldGhvZCAqLwogI2RlZmluZSBVU0JfUFJfQ0JJCTB4MDAJCS8vIENvbnRyb2wvQnVsay9JbnRlcnJ1cHQKICNkZWZpbmUgVVNCX1BSX0NCCTB4MDEJCS8vIENvbnRyb2wvQnVsayB3L28gaW50ZXJydXB0CkBAIC00ODcsNiArNTA1LDggQEAKICNkZWZpbmUgU0NfUkVBRF8xMgkJCTB4YTgKICNkZWZpbmUgU0NfUkVBRF9DQVBBQ0lUWQkJMHgyNQogI2RlZmluZSBTQ19SRUFEX0ZPUk1BVF9DQVBBQ0lUSUVTCTB4MjMKKyNkZWZpbmUgU0NfUkVBRF9IRUFERVIJCQkweDQ0CisjZGVmaW5lIFNDX1JFQURfVE9DCQkJMHg0MwogI2RlZmluZSBTQ19SRUxFQVNFCQkJMHgxNwogI2RlZmluZSBTQ19SRVFVRVNUX1NFTlNFCQkweDAzCiAjZGVmaW5lIFNDX1JFU0VSVkUJCQkweDE2CkBAIC0yMDA2LDIzICsyMDI2LDI4IEBACiAJdTgJKmJ1ZiA9ICh1OCAqKSBiaC0+YnVmOwogCiAJc3RhdGljIGNoYXIgdmVuZG9yX2lkW10gPSAiTGludXggICAiOwotCXN0YXRpYyBjaGFyIHByb2R1Y3RfaWRbXSA9ICJGaWxlLVN0b3IgR2FkZ2V0IjsKKwlzdGF0aWMgY2hhciBwcm9kdWN0X2Rpc2tfaWRbXSA9ICJGaWxlLVN0b3IgR2FkZ2V0IjsKKwlzdGF0aWMgY2hhciBwcm9kdWN0X2Nkcm9tX2lkW10gPSAiRmlsZS1DRCBHYWRnZXQgICI7CiAKIAlpZiAoIWZzZy0+Y3VybHVuKSB7CQkvLyBVbnN1cHBvcnRlZCBMVU5zIGFyZSBva2F5CiAJCWZzZy0+YmFkX2x1bl9va2F5ID0gMTsKIAkJbWVtc2V0KGJ1ZiwgMCwgMzYpOwogCQlidWZbMF0gPSAweDdmOwkJLy8gVW5zdXBwb3J0ZWQsIG5vIGRldmljZS10eXBlCisJCWJ1Zls0XSA9IDMxOwkJLy8gQWRkaXRpb25hbCBsZW5ndGgKIAkJcmV0dXJuIDM2OwogCX0KIAotCW1lbXNldChidWYsIDAsIDgpOwkvLyBOb24tcmVtb3ZhYmxlLCBkaXJlY3QtYWNjZXNzIGRldmljZQorCW1lbXNldChidWYsIDAsIDgpOworCWJ1ZlswXSA9IChtb2RfZGF0YS5jZHJvbSA/IFRZUEVfQ0RST00gOiBUWVBFX0RJU0spOwogCWlmIChtb2RfZGF0YS5yZW1vdmFibGUpCiAJCWJ1ZlsxXSA9IDB4ODA7CiAJYnVmWzJdID0gMjsJCS8vIEFOU0kgU0NTSSBsZXZlbCAyCiAJYnVmWzNdID0gMjsJCS8vIFNDU0ktMiBJTlFVSVJZIGRhdGEgZm9ybWF0CiAJYnVmWzRdID0gMzE7CQkvLyBBZGRpdGlvbmFsIGxlbmd0aAogCQkJCS8vIE5vIHNwZWNpYWwgb3B0aW9ucwotCXNwcmludGYoYnVmICsgOCwgIiUtOHMlLTE2cyUwNHgiLCB2ZW5kb3JfaWQsIHByb2R1Y3RfaWQsCisJc3ByaW50ZihidWYgKyA4LCAiJS04cyUtMTZzJTA0eCIsIHZlbmRvcl9pZCwKKwkJCShtb2RfZGF0YS5jZHJvbSA/IHByb2R1Y3RfY2Ryb21faWQgOgorCQkJCXByb2R1Y3RfZGlza19pZCksCiAJCQltb2RfZGF0YS5yZWxlYXNlKTsKIAlyZXR1cm4gMzY7CiB9CkBAIC0yMTAxLDYgKzIxMjYsNzUgQEAKIH0KIAogCitzdGF0aWMgdm9pZCBzdG9yZV9jZHJvbV9hZGRyZXNzKHU4ICpkZXN0LCBpbnQgbXNmLCB1MzIgYWRkcikKK3sKKwlpZiAobXNmKSB7CisJCS8qIENvbnZlcnQgdG8gTWludXRlcy1TZWNvbmRzLUZyYW1lcyAqLworCQlhZGRyID4+PSAyOwkJLyogQ29udmVydCB0byAyMDQ4LWJ5dGUgZnJhbWVzICovCisJCWFkZHIgKz0gMio3NTsJCS8qIExlYWQtaW4gb2NjdXBpZXMgMiBzZWNvbmRzICovCisJCWRlc3RbM10gPSBhZGRyICUgNzU7CS8qIEZyYW1lcyAqLworCQlhZGRyIC89IDc1OworCQlkZXN0WzJdID0gYWRkciAlIDYwOwkvKiBTZWNvbmRzICovCisJCWFkZHIgLz0gNjA7CisJCWRlc3RbMV0gPSBhZGRyOwkJLyogTWludXRlcyAqLworCQlkZXN0WzBdID0gMDsJCS8qIFJlc2VydmVkICovCisJfSBlbHNlIHsKKwkJLyogQWJzb2x1dGUgc2VjdG9yICovCisJCXB1dF9iZTMyKGRlc3QsIGFkZHIpOworCX0KK30KKworc3RhdGljIGludCBkb19yZWFkX2hlYWRlcihzdHJ1Y3QgZnNnX2RldiAqZnNnLCBzdHJ1Y3QgZnNnX2J1ZmZoZCAqYmgpCit7CisJc3RydWN0IGx1bgkqY3VybHVuID0gZnNnLT5jdXJsdW47CisJaW50CQltc2YgPSBmc2ctPmNtbmRbMV0gJiAweDAyOworCXUzMgkJbGJhID0gZ2V0X2JlMzIoJmZzZy0+Y21uZFsyXSk7CisJdTgJCSpidWYgPSAodTggKikgYmgtPmJ1ZjsKKworCWlmICgoZnNnLT5jbW5kWzFdICYgfjB4MDIpICE9IDApIHsJCS8qIE1hc2sgYXdheSBNU0YgKi8KKwkJY3VybHVuLT5zZW5zZV9kYXRhID0gU1NfSU5WQUxJRF9GSUVMRF9JTl9DREI7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAobGJhID49IGN1cmx1bi0+bnVtX3NlY3RvcnMpIHsKKwkJY3VybHVuLT5zZW5zZV9kYXRhID0gU1NfTE9HSUNBTF9CTE9DS19BRERSRVNTX09VVF9PRl9SQU5HRTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJbWVtc2V0KGJ1ZiwgMCwgOCk7CisJYnVmWzBdID0gMHgwMTsJCS8qIDIwNDggYnl0ZXMgb2YgdXNlciBkYXRhLCByZXN0IGlzIEVDICovCisJc3RvcmVfY2Ryb21fYWRkcmVzcygmYnVmWzRdLCBtc2YsIGxiYSk7CisJcmV0dXJuIDg7Cit9CisKKworc3RhdGljIGludCBkb19yZWFkX3RvYyhzdHJ1Y3QgZnNnX2RldiAqZnNnLCBzdHJ1Y3QgZnNnX2J1ZmZoZCAqYmgpCit7CisJc3RydWN0IGx1bgkqY3VybHVuID0gZnNnLT5jdXJsdW47CisJaW50CQltc2YgPSBmc2ctPmNtbmRbMV0gJiAweDAyOworCWludAkJc3RhcnRfdHJhY2sgPSBmc2ctPmNtbmRbNl07CisJdTgJCSpidWYgPSAodTggKikgYmgtPmJ1ZjsKKworCWlmICgoZnNnLT5jbW5kWzFdICYgfjB4MDIpICE9IDAgfHwJCS8qIE1hc2sgYXdheSBNU0YgKi8KKwkJCXN0YXJ0X3RyYWNrID4gMSkgeworCQljdXJsdW4tPnNlbnNlX2RhdGEgPSBTU19JTlZBTElEX0ZJRUxEX0lOX0NEQjsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJbWVtc2V0KGJ1ZiwgMCwgMjApOworCWJ1ZlsxXSA9ICgyMC0yKTsJCS8qIFRPQyBkYXRhIGxlbmd0aCAqLworCWJ1ZlsyXSA9IDE7CQkJLyogRmlyc3QgdHJhY2sgbnVtYmVyICovCisJYnVmWzNdID0gMTsJCQkvKiBMYXN0IHRyYWNrIG51bWJlciAqLworCWJ1Zls1XSA9IDB4MTY7CQkJLyogRGF0YSB0cmFjaywgY29weWluZyBhbGxvd2VkICovCisJYnVmWzZdID0gMHgwMTsJCQkvKiBPbmx5IHRyYWNrIGlzIG51bWJlciAxICovCisJc3RvcmVfY2Ryb21fYWRkcmVzcygmYnVmWzhdLCBtc2YsIDApOworCisJYnVmWzEzXSA9IDB4MTY7CQkJLyogTGVhZC1vdXQgdHJhY2sgaXMgZGF0YSAqLworCWJ1ZlsxNF0gPSAweEFBOwkJCS8qIExlYWQtb3V0IHRyYWNrIG51bWJlciAqLworCXN0b3JlX2Nkcm9tX2FkZHJlc3MoJmJ1ZlsxNl0sIG1zZiwgY3VybHVuLT5udW1fc2VjdG9ycyk7CisJcmV0dXJuIDIwOworfQorCisKIHN0YXRpYyBpbnQgZG9fbW9kZV9zZW5zZShzdHJ1Y3QgZnNnX2RldiAqZnNnLCBzdHJ1Y3QgZnNnX2J1ZmZoZCAqYmgpCiB7CiAJc3RydWN0IGx1bgkqY3VybHVuID0gZnNnLT5jdXJsdW47CkBAIC0yODQ4LDYgKzI5NDIsMjYgQEAKIAkJCXJlcGx5ID0gZG9fcmVhZF9jYXBhY2l0eShmc2csIGJoKTsKIAkJYnJlYWs7CiAKKwljYXNlIFNDX1JFQURfSEVBREVSOgorCQlpZiAoIW1vZF9kYXRhLmNkcm9tKQorCQkJZ290byB1bmtub3duX2NtbmQ7CisJCWZzZy0+ZGF0YV9zaXplX2Zyb21fY21uZCA9IGdldF9iZTE2KCZmc2ctPmNtbmRbN10pOworCQlpZiAoKHJlcGx5ID0gY2hlY2tfY29tbWFuZChmc2csIDEwLCBEQVRBX0RJUl9UT19IT1NULAorCQkJCSgzPDw3KSB8ICgweDFmPDwxKSwgMSwKKwkJCQkiUkVBRCBIRUFERVIiKSkgPT0gMCkKKwkJCXJlcGx5ID0gZG9fcmVhZF9oZWFkZXIoZnNnLCBiaCk7CisJCWJyZWFrOworCisJY2FzZSBTQ19SRUFEX1RPQzoKKwkJaWYgKCFtb2RfZGF0YS5jZHJvbSkKKwkJCWdvdG8gdW5rbm93bl9jbW5kOworCQlmc2ctPmRhdGFfc2l6ZV9mcm9tX2NtbmQgPSBnZXRfYmUxNigmZnNnLT5jbW5kWzddKTsKKwkJaWYgKChyZXBseSA9IGNoZWNrX2NvbW1hbmQoZnNnLCAxMCwgREFUQV9ESVJfVE9fSE9TVCwKKwkJCQkoNzw8NikgfCAoMTw8MSksIDEsCisJCQkJIlJFQUQgVE9DIikpID09IDApCisJCQlyZXBseSA9IGRvX3JlYWRfdG9jKGZzZywgYmgpOworCQlicmVhazsKKwogCWNhc2UgU0NfUkVBRF9GT1JNQVRfQ0FQQUNJVElFUzoKIAkJZnNnLT5kYXRhX3NpemVfZnJvbV9jbW5kID0gZ2V0X2JlMTYoJmZzZy0+Y21uZFs3XSk7CiAJCWlmICgocmVwbHkgPSBjaGVja19jb21tYW5kKGZzZywgMTAsIERBVEFfRElSX1RPX0hPU1QsCkBAIC0yOTMzLDYgKzMwNDcsNyBAQAogCQkvLyBGYWxsIHRocm91Z2gKIAogCWRlZmF1bHQ6CisgdW5rbm93bl9jbW5kOgogCQlmc2ctPmRhdGFfc2l6ZV9mcm9tX2NtbmQgPSAwOwogCQlzcHJpbnRmKHVua25vd24sICJVbmtub3duIHglMDJ4IiwgZnNnLT5jbW5kWzBdKTsKIAkJaWYgKChyZXBseSA9IGNoZWNrX2NvbW1hbmQoZnNnLCBmc2ctPmNtbmRfc2l6ZSwKQEAgLTM0OTgsNiArMzYxMyw3IEBACiAJc3RydWN0IGlub2RlCQkJKmlub2RlID0gTlVMTDsKIAlsb2ZmX3QJCQkJc2l6ZTsKIAlsb2ZmX3QJCQkJbnVtX3NlY3RvcnM7CisJbG9mZl90CQkJCW1pbl9zZWN0b3JzOwogCiAJLyogUi9XIGlmIHdlIGNhbiwgUi9PIGlmIHdlIG11c3QgKi8KIAlybyA9IGN1cmx1bi0+cm87CkBAIC0zNTQxLDggKzM2NTcsMTkgQEAKIAkJcmMgPSAoaW50KSBzaXplOwogCQlnb3RvIG91dDsKIAl9Ci0JbnVtX3NlY3RvcnMgPSBzaXplID4+IDk7CS8vIEZpbGUgc2l6ZSBpbiA1MTItYnl0ZSBzZWN0b3JzCi0JaWYgKG51bV9zZWN0b3JzID09IDApIHsKKwludW1fc2VjdG9ycyA9IHNpemUgPj4gOTsJLy8gRmlsZSBzaXplIGluIDUxMi1ieXRlIGJsb2NrcworCW1pbl9zZWN0b3JzID0gMTsKKwlpZiAobW9kX2RhdGEuY2Ryb20pIHsKKwkJbnVtX3NlY3RvcnMgJj0gfjM7CS8vIFJlZHVjZSB0byBhIG11bHRpcGxlIG9mIDIwNDgKKwkJbWluX3NlY3RvcnMgPSAzMDAqNDsJLy8gU21hbGxlc3QgdHJhY2sgaXMgMzAwIGZyYW1lcworCQlpZiAobnVtX3NlY3RvcnMgPj0gMjU2KjYwKjc1KjQpIHsKKwkJCW51bV9zZWN0b3JzID0gKDI1Nio2MCo3NSAtIDEpICogNDsKKwkJCUxJTkZPKGN1cmx1biwgImZpbGUgdG9vIGJpZzogJXNcbiIsIGZpbGVuYW1lKTsKKwkJCUxJTkZPKGN1cmx1biwgInVzaW5nIG9ubHkgZmlyc3QgJWQgYmxvY2tzXG4iLAorCQkJCQkoaW50KSBudW1fc2VjdG9ycyk7CisJCX0KKwl9CisJaWYgKG51bV9zZWN0b3JzIDwgbWluX3NlY3RvcnMpIHsKIAkJTElORk8oY3VybHVuLCAiZmlsZSB0b28gc21hbGw6ICVzXG4iLCBmaWxlbmFtZSk7CiAJCXJjID0gLUVUT09TTUFMTDsKIAkJZ290byBvdXQ7CkBAIC0zODQ1LDkgKzM5NzIsMTIgQEAKIAkJZ290byBvdXQ7CiAKIAlpZiAobW9kX2RhdGEucmVtb3ZhYmxlKSB7CS8vIEVuYWJsZSB0aGUgc3RvcmVfeHh4IGF0dHJpYnV0ZXMKLQkJZGV2X2F0dHJfcm8uYXR0ci5tb2RlID0gZGV2X2F0dHJfZmlsZS5hdHRyLm1vZGUgPSAwNjQ0OwotCQlkZXZfYXR0cl9yby5zdG9yZSA9IHN0b3JlX3JvOworCQlkZXZfYXR0cl9maWxlLmF0dHIubW9kZSA9IDA2NDQ7CiAJCWRldl9hdHRyX2ZpbGUuc3RvcmUgPSBzdG9yZV9maWxlOworCQlpZiAoIW1vZF9kYXRhLmNkcm9tKSB7CisJCQlkZXZfYXR0cl9yby5hdHRyLm1vZGUgPSAwNjQ0OworCQkJZGV2X2F0dHJfcm8uc3RvcmUgPSBzdG9yZV9ybzsKKwkJfQogCX0KIAogCS8qIEZpbmQgb3V0IGhvdyBtYW55IExVTnMgdGhlcmUgc2hvdWxkIGJlICovCkBAIC0zODcyLDYgKzQwMDIsOCBAQAogCWZvciAoaSA9IDA7IGkgPCBmc2ctPm5sdW5zOyArK2kpIHsKIAkJY3VybHVuID0gJmZzZy0+bHVuc1tpXTsKIAkJY3VybHVuLT5ybyA9IG1vZF9kYXRhLnJvW2ldOworCQlpZiAobW9kX2RhdGEuY2Ryb20pCisJCQljdXJsdW4tPnJvID0gMTsKIAkJY3VybHVuLT5kZXYucmVsZWFzZSA9IGx1bl9yZWxlYXNlOwogCQljdXJsdW4tPmRldi5wYXJlbnQgPSAmZ2FkZ2V0LT5kZXY7CiAJCWN1cmx1bi0+ZGV2LmRyaXZlciA9ICZmc2dfZHJpdmVyLmRyaXZlcjsKQEAgLTQwMzEsOSArNDE2Myw5IEBACiAJCQltb2RfZGF0YS5wcm90b2NvbF9uYW1lLCBtb2RfZGF0YS5wcm90b2NvbF90eXBlKTsKIAlEQkcoZnNnLCAiVmVuZG9ySUQ9eCUwNHgsIFByb2R1Y3RJRD14JTA0eCwgUmVsZWFzZT14JTA0eFxuIiwKIAkJCW1vZF9kYXRhLnZlbmRvciwgbW9kX2RhdGEucHJvZHVjdCwgbW9kX2RhdGEucmVsZWFzZSk7Ci0JREJHKGZzZywgInJlbW92YWJsZT0lZCwgc3RhbGw9JWQsIGJ1Zmxlbj0ldVxuIiwKKwlEQkcoZnNnLCAicmVtb3ZhYmxlPSVkLCBzdGFsbD0lZCwgY2Ryb209JWQsIGJ1Zmxlbj0ldVxuIiwKIAkJCW1vZF9kYXRhLnJlbW92YWJsZSwgbW9kX2RhdGEuY2FuX3N0YWxsLAotCQkJbW9kX2RhdGEuYnVmbGVuKTsKKwkJCW1vZF9kYXRhLmNkcm9tLCBtb2RfZGF0YS5idWZsZW4pOwogCURCRyhmc2csICJJL08gdGhyZWFkIHBpZDogJWRcbiIsIHRhc2tfcGlkX25yKGZzZy0+dGhyZWFkX3Rhc2spKTsKIAogCXNldF9iaXQoUkVHSVNURVJFRCwgJmZzZy0+YXRvbWljX2JpdGZsYWdzKTsKQEAgLTQwNTAsNiArNDE4Miw3IEBACiAJZnNnLT5zdGF0ZSA9IEZTR19TVEFURV9URVJNSU5BVEVEOwkvLyBUaGUgdGhyZWFkIGlzIGRlYWQKIAlmc2dfdW5iaW5kKGdhZGdldCk7CiAJY2xvc2VfYWxsX2JhY2tpbmdfZmlsZXMoZnNnKTsKKwljb21wbGV0ZSgmZnNnLT50aHJlYWRfbm90aWZpZXIpOwogCXJldHVybiByYzsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L2ZzbF9xZV91ZGMuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9mc2xfcWVfdWRjLmMKaW5kZXggZjQwMjcyNS4uZDZjNWJjZCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L2ZzbF9xZV91ZGMuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZnNsX3FlX3VkYy5jCkBAIC0yNiw2ICsyNiw3IEBACiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CkBAIC0zNzAsNiArMzcxLDkgQEAKIAkvKiBhbGxvYyBtdWx0aS1yYW0gZm9yIEJEIHJpbmdzIGFuZCBzZXQgdGhlIGVwIHBhcmFtZXRlcnMgKi8KIAl0bXBfYWRkciA9IGNwbV9tdXJhbV9hbGxvYyhzaXplb2Yoc3RydWN0IHFlX2JkKSAqIChiZHJpbmdfbGVuICsKIAkJCQlVU0JfQkRSSU5HX0xFTl9UWCksIFFFX0FMSUdOTUVOVF9PRl9CRCk7CisJaWYgKElTX0VSUl9WQUxVRSh0bXBfYWRkcikpCisJCXJldHVybiAtRU5PTUVNOworCiAJb3V0X2JlMTYoJmVwcGFyYW0tPnJiYXNlLCAodTE2KXRtcF9hZGRyKTsKIAlvdXRfYmUxNigmZXBwYXJhbS0+dGJhc2UsICh1MTYpKHRtcF9hZGRyICsKIAkJCQkoc2l6ZW9mKHN0cnVjdCBxZV9iZCkgKiBiZHJpbmdfbGVuKSkpOwpAQCAtNjg5LDcgKzY5Myw3IEBACiBlbl9kb25lMToKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ1ZGMtPmxvY2ssIGZsYWdzKTsKIGVuX2RvbmU6Ci0JZGV2X2RiZyh1ZGMtPmRldiwgImZhaWxlZCB0byBpbml0aWFsaXplICVzXG4iLCBlcC0+ZXAubmFtZSk7CisJZGV2X2Vycih1ZGMtPmRldiwgImZhaWxlZCB0byBpbml0aWFsaXplICVzXG4iLCBlcC0+ZXAubmFtZSk7CiAJcmV0dXJuIC1FTk9ERVY7CiB9CiAKQEAgLTI0MDgsNiArMjQxMiw4IEBACiAJdG1wX2FkZHIgPSBjcG1fbXVyYW1fYWxsb2MoKFVTQl9NQVhfRU5EUE9JTlRTICoKIAkJCQkJc2l6ZW9mKHN0cnVjdCB1c2JfZXBfcGFyYSkpLAogCQkJCQkgICBVU0JfRVBfUEFSQV9BTElHTk1FTlQpOworCWlmIChJU19FUlJfVkFMVUUodG1wX2FkZHIpKQorCQlnb3RvIGNsZWFudXA7CiAKIAlmb3IgKGkgPSAwOyBpIDwgVVNCX01BWF9FTkRQT0lOVFM7IGkrKykgewogCQlvdXRfYmUxNigmdXNicHJhbS0+ZXBwdHJbaV0sICh1MTYpdG1wX2FkZHIpOwpAQCAtMjUxMyw3ICsyNTE5LDcgQEAKIAkvKiBJbml0aWFsaXplIHRoZSB1ZGMgc3RydWN0dXJlIGluY2x1ZGluZyBRSCBtZW1iZXIgYW5kIG90aGVyIG1lbWJlciAqLwogCXVkY19jb250cm9sbGVyID0gcWVfdWRjX2NvbmZpZyhvZmRldik7CiAJaWYgKCF1ZGNfY29udHJvbGxlcikgewotCQlkZXZfZGJnKCZvZmRldi0+ZGV2LCAidWRjX2NvbnRyb2xsIGlzIE5VTExcbiIpOworCQlkZXZfZXJyKCZvZmRldi0+ZGV2LCAiZmFpbGVkIHRvIGluaXRpYWxpemVcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKQEAgLTI1NjgsNyArMjU3NCw3IEBACiAJLyogY3JlYXRlIGEgYnVmIGZvciBaTFAgc2VuZCwgbmVlZCB0byByZW1haW4gemVyb2VkICovCiAJdWRjX2NvbnRyb2xsZXItPm51bGxidWYgPSBremFsbG9jKDI1NiwgR0ZQX0tFUk5FTCk7CiAJaWYgKHVkY19jb250cm9sbGVyLT5udWxsYnVmID09IE5VTEwpIHsKLQkJZGV2X2RiZyh1ZGNfY29udHJvbGxlci0+ZGV2LCAiY2Fubm90IGFsbG9jIG51bGxidWZcbiIpOworCQlkZXZfZXJyKHVkY19jb250cm9sbGVyLT5kZXYsICJjYW5ub3QgYWxsb2MgbnVsbGJ1ZlxuIik7CiAJCXJldCA9IC1FTk9NRU07CiAJCWdvdG8gZXJyMzsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvZ2FkZ2V0X2NoaXBzLmggYi9kcml2ZXJzL3VzYi9nYWRnZXQvZ2FkZ2V0X2NoaXBzLmgKaW5kZXggNGUzMTA3ZC4uZWM2ZDQzOSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L2dhZGdldF9jaGlwcy5oCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9nYWRnZXRfY2hpcHMuaApAQCAtMTEwLDcgKzExMCw2IEBACiAjZGVmaW5lIGdhZGdldF9pc19hdDkxKGcpCTAKICNlbmRpZgogCi0vKiBzdGF0dXMgdW5jbGVhciAqLwogI2lmZGVmIENPTkZJR19VU0JfR0FER0VUX0lNWAogI2RlZmluZSBnYWRnZXRfaXNfaW14KGcpCSFzdHJjbXAoImlteF91ZGMiLCAoZyktPm5hbWUpCiAjZWxzZQpAQCAtMTU4LDYgKzE1NywxMSBAQAogI2RlZmluZSBnYWRnZXRfaXNfZnNsX3FlKGcpCTAKICNlbmRpZgogCisjaWZkZWYgQ09ORklHX1VTQl9HQURHRVRfQ0kxM1hYWAorI2RlZmluZSBnYWRnZXRfaXNfY2kxM3h4eChnKQkoIXN0cmNtcCgiY2kxM3h4eF91ZGMiLCAoZyktPm5hbWUpKQorI2Vsc2UKKyNkZWZpbmUgZ2FkZ2V0X2lzX2NpMTN4eHgoZykJMAorI2VuZGlmCiAKIC8vIENPTkZJR19VU0JfR0FER0VUX1NYMgogLy8gQ09ORklHX1VTQl9HQURHRVRfQVUxWDAwCkBAIC0yMjUsNiArMjI5LDggQEAKIAkJcmV0dXJuIDB4MjE7CiAJZWxzZSBpZiAoZ2FkZ2V0X2lzX2ZzbF9xZShnYWRnZXQpKQogCQlyZXR1cm4gMHgyMjsKKwllbHNlIGlmIChnYWRnZXRfaXNfY2kxM3h4eChnYWRnZXQpKQorCQlyZXR1cm4gMHgyMzsKIAlyZXR1cm4gLUVOT0VOVDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L2dva3VfdWRjLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZ29rdV91ZGMuYwppbmRleCA2MGFhMDQ4Li42MzQxOWM0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvZ29rdV91ZGMuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZ29rdV91ZGMuYwpAQCAtMTM0OSw3ICsxMzQ5LDcgQEAKIAlpbnQJCQlyZXR2YWw7CiAKIAlpZiAoIWRyaXZlcgotCQkJfHwgZHJpdmVyLT5zcGVlZCAhPSBVU0JfU1BFRURfRlVMTAorCQkJfHwgZHJpdmVyLT5zcGVlZCA8IFVTQl9TUEVFRF9GVUxMCiAJCQl8fCAhZHJpdmVyLT5iaW5kCiAJCQl8fCAhZHJpdmVyLT5kaXNjb25uZWN0CiAJCQl8fCAhZHJpdmVyLT5zZXR1cCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9pbXhfdWRjLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvaW14X3VkYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkZThmZGYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvaW14X3VkYy5jCkBAIC0wLDAgKzEsMTUxNiBAQAorLyoKKyAqCWRyaXZlci91c2IvZ2FkZ2V0L2lteF91ZGMuYworICoKKyAqCUNvcHlyaWdodCAoQykgMjAwNSBNaWtlIExlZShlZW1pa2VAZ21haWwuY29tKQorICoJQ29weXJpZ2h0IChDKSAyMDA4IERhcml1cyBBdWd1bGlzIDxhdWd1bGlzLmRhcml1c0BnbWFpbC5jb20+CisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqCWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKgl0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICoJKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqCWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKglNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKglHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisKKyNpbmNsdWRlIDxsaW51eC91c2IvY2g5Lmg+CisjaW5jbHVkZSA8bGludXgvdXNiL2dhZGdldC5oPgorCisjaW5jbHVkZSA8bWFjaC91c2IuaD4KKyNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CisKKyNpbmNsdWRlICJpbXhfdWRjLmgiCisKK3N0YXRpYyBjb25zdCBjaGFyIGRyaXZlcl9uYW1lW10gPSAiaW14X3VkYyI7CitzdGF0aWMgY29uc3QgY2hhciBlcDBuYW1lW10gPSAiZXAwIjsKKwordm9pZCBlcDBfY2hnX3N0YXQoY29uc3QgY2hhciAqbGFiZWwsIHN0cnVjdCBpbXhfdWRjX3N0cnVjdCAqaW14X3VzYiwKKwkJCQkJCQllbnVtIGVwMF9zdGF0ZSBzdGF0KTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElNWCBVREMgaGFyZHdhcmUgcmVsYXRlZCBmdW5jdGlvbnMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKwordm9pZCBpbXhfdWRjX2VuYWJsZShzdHJ1Y3QgaW14X3VkY19zdHJ1Y3QgKmlteF91c2IpCit7CisJaW50IHRlbXAgPSBfX3Jhd19yZWFkbChpbXhfdXNiLT5iYXNlICsgVVNCX0NUUkwpOworCV9fcmF3X3dyaXRlbCh0ZW1wIHwgQ1RSTF9GRV9FTkEgfCBDVFJMX0FGRV9FTkEsIGlteF91c2ItPmJhc2UgKyBVU0JfQ1RSTCk7CisJaW14X3VzYi0+Z2FkZ2V0LnNwZWVkID0gVVNCX1NQRUVEX0ZVTEw7Cit9CisKK3ZvaWQgaW14X3VkY19kaXNhYmxlKHN0cnVjdCBpbXhfdWRjX3N0cnVjdCAqaW14X3VzYikKK3sKKwlpbnQgdGVtcCA9IF9fcmF3X3JlYWRsKGlteF91c2ItPmJhc2UgKyBVU0JfQ1RSTCk7CisKKwlfX3Jhd193cml0ZWwodGVtcCAmIH4oQ1RSTF9GRV9FTkEgfCBDVFJMX0FGRV9FTkEpLAorCQkgaW14X3VzYi0+YmFzZSArIFVTQl9DVFJMKTsKKworCWVwMF9jaGdfc3RhdChfX2Z1bmNfXywgaW14X3VzYiwgRVAwX0lETEUpOworCWlteF91c2ItPmdhZGdldC5zcGVlZCA9IFVTQl9TUEVFRF9VTktOT1dOOworfQorCit2b2lkIGlteF91ZGNfcmVzZXQoc3RydWN0IGlteF91ZGNfc3RydWN0ICppbXhfdXNiKQoreworCWludCB0ZW1wID0gX19yYXdfcmVhZGwoaW14X3VzYi0+YmFzZSArIFVTQl9FTkFCKTsKKworCS8qIHNldCBSU1QgYml0ICovCisJX19yYXdfd3JpdGVsKHRlbXAgfCBFTkFCX1JTVCwgaW14X3VzYi0+YmFzZSArIFVTQl9FTkFCKTsKKworCS8qIHdhaXQgUlNUIGJpdCB0byBjbGVhciAqLworCWRvIHt9IHdoaWxlIChfX3Jhd19yZWFkbChpbXhfdXNiLT5iYXNlICsgVVNCX0VOQUIpICYgRU5BQl9SU1QpOworCisJLyogd2FpdCBDRkcgYml0IHRvIGFzc2VydCAqLworCWRvIHt9IHdoaWxlICghKF9fcmF3X3JlYWRsKGlteF91c2ItPmJhc2UgKyBVU0JfREFEUikgJiBEQURSX0NGRykpOworCisJLyogdWRjIG1vZHVsZSBpcyBub3cgcmVhZHkgKi8KK30KKwordm9pZCBpbXhfdWRjX2NvbmZpZyhzdHJ1Y3QgaW14X3VkY19zdHJ1Y3QgKmlteF91c2IpCit7CisJdTggZXBfY29uZls1XTsKKwl1OCBpLCBqLCBjZmc7CisJc3RydWN0IGlteF9lcF9zdHJ1Y3QgKmlteF9lcDsKKworCS8qIHdhaXQgQ0ZHIGJpdCB0byBhc3NlcnQgKi8KKwlkbyB7fSB3aGlsZSAoIShfX3Jhd19yZWFkbChpbXhfdXNiLT5iYXNlICsgVVNCX0RBRFIpICYgREFEUl9DRkcpKTsKKworCS8qIERvd25sb2FkIHRoZSBlbmRwb2ludCBidWZmZXIgZm9yIGVuZHBvaW50IDAuICovCisJZm9yIChqID0gMDsgaiA8IDU7IGorKykgeworCQlpID0gKGogPT0gMiA/IGlteF91c2ItPmlteF9lcFswXS5maWZvc2l6ZSA6IDB4MDApOworCQlfX3Jhd193cml0ZWIoaSwgaW14X3VzYi0+YmFzZSArIFVTQl9EREFUKTsKKwkJZG8ge30gd2hpbGUgKF9fcmF3X3JlYWRsKGlteF91c2ItPmJhc2UgKyBVU0JfREFEUikgJiBEQURSX0JTWSk7CisJfQorCisJLyogRG93bmxvYWQgdGhlIGVuZHBvaW50IGJ1ZmZlcnMgZm9yIGVuZHBvaW50cyAxLTUuCisJICogV2Ugc3BlY2lmeSB0d28gY29uZmlndXJhdGlvbnMsIG9uZSBpbnRlcmZhY2UKKwkgKi8KKwlmb3IgKGNmZyA9IDE7IGNmZyA8IDM7IGNmZysrKSB7CisJCWZvciAoaSA9IDE7IGkgPCBJTVhfVVNCX05CX0VQOyBpKyspIHsKKwkJCWlteF9lcCA9ICZpbXhfdXNiLT5pbXhfZXBbaV07CisJCQkvKiBFUCBubyB8IENvbmZpZyBubyAqLworCQkJZXBfY29uZlswXSA9IChpIDw8IDQpIHwgKGNmZyA8PCAyKTsKKwkJCS8qIFR5cGUgfCBEaXJlY3Rpb24gKi8KKwkJCWVwX2NvbmZbMV0gPSAoaW14X2VwLT5ibUF0dHJpYnV0ZXMgPDwgMykgfAorCQkJCQkoRVBfRElSKGlteF9lcCkgPDwgMik7CisJCQkvKiBNYXggcGFja2V0IHNpemUgKi8KKwkJCWVwX2NvbmZbMl0gPSBpbXhfZXAtPmZpZm9zaXplOworCQkJLyogVFJYVFlQICovCisJCQllcF9jb25mWzNdID0gMHhDMDsKKwkJCS8qIEZJRk8gbm8gKi8KKwkJCWVwX2NvbmZbNF0gPSBpOworCisJCQlEX0lOSShpbXhfdXNiLT5kZXYsCisJCQkJIjwlcz4gZXAlZF9jb25mWyVkXToiCisJCQkJIlslMDJ4LSUwMngtJTAyeC0lMDJ4LSUwMnhdXG4iLAorCQkJCV9fZnVuY19fLCBpLCBjZmcsCisJCQkJZXBfY29uZlswXSwgZXBfY29uZlsxXSwgZXBfY29uZlsyXSwKKwkJCQllcF9jb25mWzNdLCBlcF9jb25mWzRdKTsKKworCQkJZm9yIChqID0gMDsgaiA8IDU7IGorKykgeworCQkJCV9fcmF3X3dyaXRlYihlcF9jb25mW2pdLAorCQkJCQlpbXhfdXNiLT5iYXNlICsgVVNCX0REQVQpOworCQkJCWRvIHt9IHdoaWxlIChfX3Jhd19yZWFkbChpbXhfdXNiLT5iYXNlICsgVVNCX0RBRFIpCisJCQkJCSYgREFEUl9CU1kpOworCQkJfQorCQl9CisJfQorCisJLyogd2FpdCBDRkcgYml0IHRvIGNsZWFyICovCisJZG8ge30gd2hpbGUgKF9fcmF3X3JlYWRsKGlteF91c2ItPmJhc2UgKyBVU0JfREFEUikgJiBEQURSX0NGRyk7Cit9CisKK3ZvaWQgaW14X3VkY19pbml0X2lycShzdHJ1Y3QgaW14X3VkY19zdHJ1Y3QgKmlteF91c2IpCit7CisJaW50IGk7CisKKwkvKiBNYXNrIGFuZCBjbGVhciBhbGwgaXJxcyAqLworCV9fcmF3X3dyaXRlbCgweEZGRkZGRkZGLCBpbXhfdXNiLT5iYXNlICsgVVNCX01BU0spOworCV9fcmF3X3dyaXRlbCgweEZGRkZGRkZGLCBpbXhfdXNiLT5iYXNlICsgVVNCX0lOVFIpOworCWZvciAoaSA9IDA7IGkgPCBJTVhfVVNCX05CX0VQOyBpKyspIHsKKwkJX19yYXdfd3JpdGVsKDB4MUZGLCBpbXhfdXNiLT5iYXNlICsgVVNCX0VQX01BU0soaSkpOworCQlfX3Jhd193cml0ZWwoMHgxRkYsIGlteF91c2ItPmJhc2UgKyBVU0JfRVBfSU5UUihpKSk7CisJfQorCisJLyogRW5hYmxlIFVTQiBpcnFzICovCisJX19yYXdfd3JpdGVsKElOVFJfTVNPRiB8IElOVFJfRlJBTUVfTUFUQ0gsIGlteF91c2ItPmJhc2UgKyBVU0JfTUFTSyk7CisKKwkvKiBFbmFibGUgRVAwIGlycXMgKi8KKwlfX3Jhd193cml0ZWwoMHgxRkYgJiB+KEVQSU5UUl9ERVZSRVEgfCBFUElOVFJfTURFVlJFUSB8IEVQSU5UUl9FT1QKKwkJfCBFUElOVFJfRU9GIHwgRVBJTlRSX0ZJRk9fRU1QVFkgfCBFUElOVFJfRklGT19GVUxMKSwKKwkJaW14X3VzYi0+YmFzZSArIFVTQl9FUF9NQVNLKDApKTsKK30KKwordm9pZCBpbXhfdWRjX2luaXRfZXAoc3RydWN0IGlteF91ZGNfc3RydWN0ICppbXhfdXNiKQoreworCWludCBpLCBtYXgsIHRlbXA7CisJc3RydWN0IGlteF9lcF9zdHJ1Y3QgKmlteF9lcDsKKwlmb3IgKGkgPSAwOyBpIDwgSU1YX1VTQl9OQl9FUDsgaSsrKSB7CisJCWlteF9lcCA9ICZpbXhfdXNiLT5pbXhfZXBbaV07CisJCXN3aXRjaCAoaW14X2VwLT5maWZvc2l6ZSkgeworCQljYXNlIDg6CisJCQltYXggPSAwOworCQkJYnJlYWs7CisJCWNhc2UgMTY6CisJCQltYXggPSAxOworCQkJYnJlYWs7CisJCWNhc2UgMzI6CisJCQltYXggPSAyOworCQkJYnJlYWs7CisJCWNhc2UgNjQ6CisJCQltYXggPSAzOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQltYXggPSAxOworCQkJYnJlYWs7CisJCX0KKwkJdGVtcCA9IChFUF9ESVIoaW14X2VwKSA8PCA3KSB8IChtYXggPDwgNSkKKwkJCXwgKGlteF9lcC0+Ym1BdHRyaWJ1dGVzIDw8IDMpOworCQlfX3Jhd193cml0ZWwodGVtcCwgaW14X3VzYi0+YmFzZSArIFVTQl9FUF9TVEFUKGkpKTsKKwkJX19yYXdfd3JpdGVsKHRlbXAgfCBFUFNUQVRfRkxVU0gsIGlteF91c2ItPmJhc2UgKyBVU0JfRVBfU1RBVChpKSk7CisJCURfSU5JKGlteF91c2ItPmRldiwgIjwlcz4gZXAlZF9zdGF0ICUwOHhcbiIsIF9fZnVuY19fLCBpLAorCQkJX19yYXdfcmVhZGwoaW14X3VzYi0+YmFzZSArIFVTQl9FUF9TVEFUKGkpKSk7CisJfQorfQorCit2b2lkIGlteF91ZGNfaW5pdF9maWZvKHN0cnVjdCBpbXhfdWRjX3N0cnVjdCAqaW14X3VzYikKK3sKKwlpbnQgaSwgdGVtcDsKKwlzdHJ1Y3QgaW14X2VwX3N0cnVjdCAqaW14X2VwOworCWZvciAoaSA9IDA7IGkgPCBJTVhfVVNCX05CX0VQOyBpKyspIHsKKwkJaW14X2VwID0gJmlteF91c2ItPmlteF9lcFtpXTsKKworCQkvKiBGaWZvIGNvbnRyb2wgKi8KKwkJdGVtcCA9IEVQX0RJUihpbXhfZXApID8gMHgwQjAwMDAwMCA6IDB4MEYwMDAwMDA7CisJCV9fcmF3X3dyaXRlbCh0ZW1wLCBpbXhfdXNiLT5iYXNlICsgVVNCX0VQX0ZDVFJMKGkpKTsKKwkJRF9JTkkoaW14X3VzYi0+ZGV2LCAiPCVzPiBlcCVkX2ZjdHJsICUwOHhcbiIsIF9fZnVuY19fLCBpLAorCQkJX19yYXdfcmVhZGwoaW14X3VzYi0+YmFzZSArIFVTQl9FUF9GQ1RSTChpKSkpOworCisJCS8qIEZpZm8gYWxhcm0gKi8KKwkJdGVtcCA9IChpID8gaW14X2VwLT5maWZvc2l6ZSAvIDIgOiAwKTsKKwkJX19yYXdfd3JpdGVsKHRlbXAsIGlteF91c2ItPmJhc2UgKyBVU0JfRVBfRkFMUk0oaSkpOworCQlEX0lOSShpbXhfdXNiLT5kZXYsICI8JXM+IGVwJWRfZmFscm0gJTA4eFxuIiwgX19mdW5jX18sIGksCisJCQlfX3Jhd19yZWFkbChpbXhfdXNiLT5iYXNlICsgVVNCX0VQX0ZBTFJNKGkpKSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBpbXhfdWRjX2luaXQoc3RydWN0IGlteF91ZGNfc3RydWN0ICppbXhfdXNiKQoreworCS8qIFJlc2V0IFVEQyAqLworCWlteF91ZGNfcmVzZXQoaW14X3VzYik7CisKKwkvKiBEb3dubG9hZCBjb25maWcgdG8gZW5wb2ludCBidWZmZXIgKi8KKwlpbXhfdWRjX2NvbmZpZyhpbXhfdXNiKTsKKworCS8qIFNldHVwIGludGVycnVwcyAqLworCWlteF91ZGNfaW5pdF9pcnEoaW14X3VzYik7CisKKwkvKiBTZXR1cCBlbmRwb2ludHMgKi8KKwlpbXhfdWRjX2luaXRfZXAoaW14X3VzYik7CisKKwkvKiBTZXR1cCBmaWZvcyAqLworCWlteF91ZGNfaW5pdF9maWZvKGlteF91c2IpOworfQorCit2b2lkIGlteF9lcF9pcnFfZW5hYmxlKHN0cnVjdCBpbXhfZXBfc3RydWN0ICppbXhfZXApCit7CisKKwlpbnQgaSA9IEVQX05PKGlteF9lcCk7CisKKwlfX3Jhd193cml0ZWwoMHgxRkYsIGlteF9lcC0+aW14X3VzYi0+YmFzZSArIFVTQl9FUF9NQVNLKGkpKTsKKwlfX3Jhd193cml0ZWwoMHgxRkYsIGlteF9lcC0+aW14X3VzYi0+YmFzZSArIFVTQl9FUF9JTlRSKGkpKTsKKwlfX3Jhd193cml0ZWwoMHgxRkYgJiB+KEVQSU5UUl9FT1QgfCBFUElOVFJfRU9GKSwKKwkJaW14X2VwLT5pbXhfdXNiLT5iYXNlICsgVVNCX0VQX01BU0soaSkpOworfQorCit2b2lkIGlteF9lcF9pcnFfZGlzYWJsZShzdHJ1Y3QgaW14X2VwX3N0cnVjdCAqaW14X2VwKQoreworCisJaW50IGkgPSBFUF9OTyhpbXhfZXApOworCisJX19yYXdfd3JpdGVsKDB4MUZGLCBpbXhfZXAtPmlteF91c2ItPmJhc2UgKyBVU0JfRVBfTUFTSyhpKSk7CisJX19yYXdfd3JpdGVsKDB4MUZGLCBpbXhfZXAtPmlteF91c2ItPmJhc2UgKyBVU0JfRVBfSU5UUihpKSk7Cit9CisKK2ludCBpbXhfZXBfZW1wdHkoc3RydWN0IGlteF9lcF9zdHJ1Y3QgKmlteF9lcCkKK3sKKwlzdHJ1Y3QgaW14X3VkY19zdHJ1Y3QgKmlteF91c2IgPSBpbXhfZXAtPmlteF91c2I7CisKKwlyZXR1cm4gX19yYXdfcmVhZGwoaW14X3VzYi0+YmFzZSArIFVTQl9FUF9GU1RBVChFUF9OTyhpbXhfZXApKSkKKwkJCSYgRlNUQVRfRU1QVFk7Cit9CisKK3Vuc2lnbmVkIGlteF9maWZvX2Jjb3VudChzdHJ1Y3QgaW14X2VwX3N0cnVjdCAqaW14X2VwKQoreworCXN0cnVjdCBpbXhfdWRjX3N0cnVjdCAqaW14X3VzYiA9IGlteF9lcC0+aW14X3VzYjsKKworCXJldHVybiAoX19yYXdfcmVhZGwoaW14X3VzYi0+YmFzZSArIFVTQl9FUF9TVEFUKEVQX05PKGlteF9lcCkpKQorCQkJJiBFUFNUQVRfQkNPVU5UKSA+PiAxNjsKK30KKwordm9pZCBpbXhfZmx1c2goc3RydWN0IGlteF9lcF9zdHJ1Y3QgKmlteF9lcCkKK3sKKwlzdHJ1Y3QgaW14X3VkY19zdHJ1Y3QgKmlteF91c2IgPSBpbXhfZXAtPmlteF91c2I7CisKKwlpbnQgdGVtcCA9IF9fcmF3X3JlYWRsKGlteF91c2ItPmJhc2UgKyBVU0JfRVBfU1RBVChFUF9OTyhpbXhfZXApKSk7CisJX19yYXdfd3JpdGVsKHRlbXAgfCBFUFNUQVRfRkxVU0gsCisJCWlteF91c2ItPmJhc2UgKyBVU0JfRVBfU1RBVChFUF9OTyhpbXhfZXApKSk7Cit9CisKK3ZvaWQgaW14X2VwX3N0YWxsKHN0cnVjdCBpbXhfZXBfc3RydWN0ICppbXhfZXApCit7CisJc3RydWN0IGlteF91ZGNfc3RydWN0ICppbXhfdXNiID0gaW14X2VwLT5pbXhfdXNiOworCWludCB0ZW1wLCBpOworCisJRF9FUlIoaW14X3VzYi0+ZGV2LCAiPCVzPiBGb3JjZWQgc3RhbGwgb24gJXNcbiIsIF9fZnVuY19fLCBpbXhfZXAtPmVwLm5hbWUpOworCisJaW14X2ZsdXNoKGlteF9lcCk7CisKKwkvKiBTcGVjaWFsIGNhcmUgZm9yIGVwMCAqLworCWlmIChFUF9OTyhpbXhfZXApKSB7CisJCXRlbXAgPSBfX3Jhd19yZWFkbChpbXhfdXNiLT5iYXNlICsgVVNCX0NUUkwpOworCQlfX3Jhd193cml0ZWwodGVtcCB8IENUUkxfQ01ET1ZFUiB8IENUUkxfQ01ERVJST1IsIGlteF91c2ItPmJhc2UgKyBVU0JfQ1RSTCk7CisJCWRvIHsgfSB3aGlsZSAoX19yYXdfcmVhZGwoaW14X3VzYi0+YmFzZSArIFVTQl9DVFJMKSAmIENUUkxfQ01ET1ZFUik7CisJCXRlbXAgPSBfX3Jhd19yZWFkbChpbXhfdXNiLT5iYXNlICsgVVNCX0NUUkwpOworCQlfX3Jhd193cml0ZWwodGVtcCAmIH5DVFJMX0NNREVSUk9SLCBpbXhfdXNiLT5iYXNlICsgVVNCX0NUUkwpOworCX0KKwllbHNlIHsKKwkJdGVtcCA9IF9fcmF3X3JlYWRsKGlteF91c2ItPmJhc2UgKyBVU0JfRVBfU1RBVChFUF9OTyhpbXhfZXApKSk7CisJCV9fcmF3X3dyaXRlbCh0ZW1wIHwgRVBTVEFUX1NUQUxMLAorCQkJaW14X3VzYi0+YmFzZSArIFVTQl9FUF9TVEFUKEVQX05PKGlteF9lcCkpKTsKKworCQlmb3IgKGkgPSAwOyBpIDwgMTAwOyBpICsrKSB7CisJCQl0ZW1wID0gX19yYXdfcmVhZGwoaW14X3VzYi0+YmFzZSArIFVTQl9FUF9TVEFUKEVQX05PKGlteF9lcCkpKTsKKwkgCQlpZiAoIXRlbXAgJiBFUFNUQVRfU1RBTEwpCisJIAkJCWJyZWFrOworCSAJCXVkZWxheSgyMCk7CisJIAl9CisJCWlmIChpID09IDUwKQorCQkJRF9FUlIoaW14X3VzYi0+ZGV2LCAiPCVzPiBOb24gZmluaXNoZWQgc3RhbGwgb24gJXNcbiIsCisJCQkJX19mdW5jX18sIGlteF9lcC0+ZXAubmFtZSk7CisJfQorfQorCitzdGF0aWMgaW50IGlteF91ZGNfZ2V0X2ZyYW1lKHN0cnVjdCB1c2JfZ2FkZ2V0ICpfZ2FkZ2V0KQoreworCXN0cnVjdCBpbXhfdWRjX3N0cnVjdCAqaW14X3VzYiA9IGNvbnRhaW5lcl9vZihfZ2FkZ2V0LAorCQkJc3RydWN0IGlteF91ZGNfc3RydWN0LCBnYWRnZXQpOworCisJcmV0dXJuIF9fcmF3X3JlYWRsKGlteF91c2ItPmJhc2UgKyBVU0JfRlJBTUUpICYgMHg3RkY7Cit9CisKK3N0YXRpYyBpbnQgaW14X3VkY193YWtldXAoc3RydWN0IHVzYl9nYWRnZXQgKl9nYWRnZXQpCit7CisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBVU0IgcmVxdWVzdCBjb250cm9sIGZ1bmN0aW9ucworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCitzdGF0aWMgdm9pZCBlcF9hZGRfcmVxdWVzdChzdHJ1Y3QgaW14X2VwX3N0cnVjdCAqaW14X2VwLCBzdHJ1Y3QgaW14X3JlcXVlc3QgKnJlcSkKK3sKKwlpZiAodW5saWtlbHkoIXJlcSkpCisJCXJldHVybjsKKworCXJlcS0+aW5fdXNlID0gMTsKKwlsaXN0X2FkZF90YWlsKCZyZXEtPnF1ZXVlLCAmaW14X2VwLT5xdWV1ZSk7Cit9CisKK3N0YXRpYyB2b2lkIGVwX2RlbF9yZXF1ZXN0KHN0cnVjdCBpbXhfZXBfc3RydWN0ICppbXhfZXAsIHN0cnVjdCBpbXhfcmVxdWVzdCAqcmVxKQoreworCWlmICh1bmxpa2VseSghcmVxKSkKKwkJcmV0dXJuOworCisJbGlzdF9kZWxfaW5pdCgmcmVxLT5xdWV1ZSk7CisJcmVxLT5pbl91c2UgPSAwOworfQorCitzdGF0aWMgdm9pZCBkb25lKHN0cnVjdCBpbXhfZXBfc3RydWN0ICppbXhfZXAsIHN0cnVjdCBpbXhfcmVxdWVzdCAqcmVxLCBpbnQgc3RhdHVzKQoreworCWVwX2RlbF9yZXF1ZXN0KGlteF9lcCwgcmVxKTsKKworCWlmIChsaWtlbHkocmVxLT5yZXEuc3RhdHVzID09IC1FSU5QUk9HUkVTUykpCisJCXJlcS0+cmVxLnN0YXR1cyA9IHN0YXR1czsKKwllbHNlCisJCXN0YXR1cyA9IHJlcS0+cmVxLnN0YXR1czsKKworCWlmIChzdGF0dXMgJiYgc3RhdHVzICE9IC1FU0hVVERPV04pCisJCURfRVJSKGlteF9lcC0+aW14X3VzYi0+ZGV2LAorCQkJIjwlcz4gY29tcGxldGUgJXMgcmVxICVwIHN0YXQgJWQgbGVuICV1LyV1XG4iLCBfX2Z1bmNfXywKKwkJCWlteF9lcC0+ZXAubmFtZSwgJnJlcS0+cmVxLCBzdGF0dXMsCisJCQlyZXEtPnJlcS5hY3R1YWwsIHJlcS0+cmVxLmxlbmd0aCk7CisKKwlyZXEtPnJlcS5jb21wbGV0ZSgmaW14X2VwLT5lcCwgJnJlcS0+cmVxKTsKK30KKworc3RhdGljIHZvaWQgbnVrZShzdHJ1Y3QgaW14X2VwX3N0cnVjdCAqaW14X2VwLCBpbnQgc3RhdHVzKQoreworCXN0cnVjdCBpbXhfcmVxdWVzdCAqcmVxOworCisJd2hpbGUgKCFsaXN0X2VtcHR5KCZpbXhfZXAtPnF1ZXVlKSkgeworCQlyZXEgPSBsaXN0X2VudHJ5KGlteF9lcC0+cXVldWUubmV4dCwgc3RydWN0IGlteF9yZXF1ZXN0LCBxdWV1ZSk7CisJCWRvbmUoaW14X2VwLCByZXEsIHN0YXR1cyk7CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRGF0YSB0YW5zZmVyIG92ZXIgVVNCIGZ1bmN0aW9ucworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworc3RhdGljIGludCByZWFkX3BhY2tldChzdHJ1Y3QgaW14X2VwX3N0cnVjdCAqaW14X2VwLCBzdHJ1Y3QgaW14X3JlcXVlc3QgKnJlcSkKK3sKKwl1OAkqYnVmOworCWludAlieXRlc19lcCwgYnVmZmVyc3BhY2UsIGNvdW50LCBpOworCisJYnl0ZXNfZXAgPSBpbXhfZmlmb19iY291bnQoaW14X2VwKTsKKwlidWZmZXJzcGFjZSA9IHJlcS0+cmVxLmxlbmd0aCAtIHJlcS0+cmVxLmFjdHVhbDsKKworCWJ1ZiA9IHJlcS0+cmVxLmJ1ZiArIHJlcS0+cmVxLmFjdHVhbDsKKwlwcmVmZXRjaHcoYnVmKTsKKworCWlmICh1bmxpa2VseShpbXhfZXBfZW1wdHkoaW14X2VwKSkpCisJCWNvdW50ID0gMDsJLyogemxwICovCisJZWxzZQorCQljb3VudCA9IG1pbihieXRlc19lcCwgYnVmZmVyc3BhY2UpOworCisJZm9yIChpID0gY291bnQ7IGkgPiAwOyBpLS0pCisJCSpidWYrKyA9IF9fcmF3X3JlYWRiKGlteF9lcC0+aW14X3VzYi0+YmFzZQorCQkJCQkJKyBVU0JfRVBfRkRBVDAoRVBfTk8oaW14X2VwKSkpOworCXJlcS0+cmVxLmFjdHVhbCArPSBjb3VudDsKKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIGludCB3cml0ZV9wYWNrZXQoc3RydWN0IGlteF9lcF9zdHJ1Y3QgKmlteF9lcCwgc3RydWN0IGlteF9yZXF1ZXN0ICpyZXEpCit7CisJdTgJKmJ1ZjsKKwlpbnQJbGVuZ3RoLCBjb3VudCwgdGVtcDsKKworCWJ1ZiA9IHJlcS0+cmVxLmJ1ZiArIHJlcS0+cmVxLmFjdHVhbDsKKwlwcmVmZXRjaChidWYpOworCisJbGVuZ3RoID0gbWluKHJlcS0+cmVxLmxlbmd0aCAtIHJlcS0+cmVxLmFjdHVhbCwgKHUzMilpbXhfZXAtPmZpZm9zaXplKTsKKworCWlmIChpbXhfZmlmb19iY291bnQoaW14X2VwKSArIGxlbmd0aCA+IGlteF9lcC0+Zmlmb3NpemUpIHsKKwkJRF9UUlgoaW14X2VwLT5pbXhfdXNiLT5kZXYsICI8JXM+IHBhY2tldCBvdmVyZmlsbCAlcyBmaWZvXG4iLAorCQkJX19mdW5jX18sIGlteF9lcC0+ZXAubmFtZSk7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXEtPnJlcS5hY3R1YWwgKz0gbGVuZ3RoOworCWNvdW50ID0gbGVuZ3RoOworCisJaWYgKCFjb3VudCAmJiByZXEtPnJlcS56ZXJvKSB7CS8qIHpscCAqLworCQl0ZW1wID0gX19yYXdfcmVhZGwoaW14X2VwLT5pbXhfdXNiLT5iYXNlCisJCQkrIFVTQl9FUF9TVEFUKEVQX05PKGlteF9lcCkpKTsKKwkJX19yYXdfd3JpdGVsKHRlbXAgfCBFUFNUQVRfWkxQUywgaW14X2VwLT5pbXhfdXNiLT5iYXNlCisJCQkrIFVTQl9FUF9TVEFUKEVQX05PKGlteF9lcCkpKTsKKwkJRF9UUlgoaW14X2VwLT5pbXhfdXNiLT5kZXYsICI8JXM+IHplcm8gcGFja2V0XG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAwOworCX0KKworCXdoaWxlIChjb3VudC0tKSB7CisJCWlmIChjb3VudCA9PSAwKSB7CS8qIGxhc3QgYnl0ZSAqLworCQkJdGVtcCA9IF9fcmF3X3JlYWRsKGlteF9lcC0+aW14X3VzYi0+YmFzZQorCQkJCSsgVVNCX0VQX0ZDVFJMKEVQX05PKGlteF9lcCkpKTsKKwkJCV9fcmF3X3dyaXRlbCh0ZW1wIHwgRkNUUkxfV0ZSLCBpbXhfZXAtPmlteF91c2ItPmJhc2UKKwkJCQkrIFVTQl9FUF9GQ1RSTChFUF9OTyhpbXhfZXApKSk7CisJCX0KKwkJX19yYXdfd3JpdGViKCpidWYrKywKKwkJCWlteF9lcC0+aW14X3VzYi0+YmFzZSArIFVTQl9FUF9GREFUMChFUF9OTyhpbXhfZXApKSk7CisJfQorCisJcmV0dXJuIGxlbmd0aDsKK30KKworc3RhdGljIGludCByZWFkX2ZpZm8oc3RydWN0IGlteF9lcF9zdHJ1Y3QgKmlteF9lcCwgc3RydWN0IGlteF9yZXF1ZXN0ICpyZXEpCit7CisJaW50IAlieXRlcyA9IDAsCisJCWNvdW50LAorCQljb21wbGV0ZWQgPSAwOworCisJd2hpbGUgKF9fcmF3X3JlYWRsKGlteF9lcC0+aW14X3VzYi0+YmFzZSArIFVTQl9FUF9GU1RBVChFUF9OTyhpbXhfZXApKSkKKwkJJiBGU1RBVF9GUikgeworCQkJY291bnQgPSByZWFkX3BhY2tldChpbXhfZXAsIHJlcSk7CisJCQlieXRlcyArPSBjb3VudDsKKworCQkJY29tcGxldGVkID0gKGNvdW50ICE9IGlteF9lcC0+Zmlmb3NpemUpOworCQkJaWYgKGNvbXBsZXRlZCB8fCByZXEtPnJlcS5hY3R1YWwgPT0gcmVxLT5yZXEubGVuZ3RoKSB7CisJCQkJY29tcGxldGVkID0gMTsKKwkJCQlicmVhazsKKwkJCX0KKwl9CisKKwlpZiAoY29tcGxldGVkIHx8ICFyZXEtPnJlcS5sZW5ndGgpIHsKKwkJZG9uZShpbXhfZXAsIHJlcSwgMCk7CisJCURfUkVRKGlteF9lcC0+aW14X3VzYi0+ZGV2LCAiPCVzPiAlcyByZXE8JXA+ICVzXG4iLAorCQkJX19mdW5jX18sIGlteF9lcC0+ZXAubmFtZSwgcmVxLAorCQkJY29tcGxldGVkID8gImNvbXBsZXRlZCIgOiAibm90IGNvbXBsZXRlZCIpOworCQlpZiAoIUVQX05PKGlteF9lcCkpCisJCQllcDBfY2hnX3N0YXQoX19mdW5jX18sIGlteF9lcC0+aW14X3VzYiwgRVAwX0lETEUpOworCX0KKworCURfVFJYKGlteF9lcC0+aW14X3VzYi0+ZGV2LCAiPCVzPiBieXRlcyByZWFkOiAlZFxuIiwgX19mdW5jX18sIGJ5dGVzKTsKKworCXJldHVybiBjb21wbGV0ZWQ7Cit9CisKK3N0YXRpYyBpbnQgd3JpdGVfZmlmbyhzdHJ1Y3QgaW14X2VwX3N0cnVjdCAqaW14X2VwLCBzdHJ1Y3QgaW14X3JlcXVlc3QgKnJlcSkKK3sKKwlpbnQJYnl0ZXMgPSAwLAorCQljb3VudCwKKwkJY29tcGxldGVkID0gMDsKKworCXdoaWxlICghY29tcGxldGVkKSB7CisJCWNvdW50ID0gd3JpdGVfcGFja2V0KGlteF9lcCwgcmVxKTsKKwkJaWYgKGNvdW50IDwgMCkKKwkJCWJyZWFrOyAvKiBidXN5ICovCisJCWJ5dGVzICs9IGNvdW50OworCisJCS8qIGxhc3QgcGFja2V0ICJtdXN0IGJlIiBzaG9ydCAob3IgYSB6bHApICovCisJCWNvbXBsZXRlZCA9IChjb3VudCAhPSBpbXhfZXAtPmZpZm9zaXplKTsKKworCQlpZiAodW5saWtlbHkoY29tcGxldGVkKSkgeworCQkJZG9uZShpbXhfZXAsIHJlcSwgMCk7CisJCQlEX1JFUShpbXhfZXAtPmlteF91c2ItPmRldiwgIjwlcz4gJXMgcmVxPCVwPiAlc1xuIiwKKwkJCQlfX2Z1bmNfXywgaW14X2VwLT5lcC5uYW1lLCByZXEsCisJCQkJY29tcGxldGVkID8gImNvbXBsZXRlZCIgOiAibm90IGNvbXBsZXRlZCIpOworCQkJaWYgKCFFUF9OTyhpbXhfZXApKQorCQkJCWVwMF9jaGdfc3RhdChfX2Z1bmNfXywgaW14X2VwLT5pbXhfdXNiLCBFUDBfSURMRSk7CisJCX0KKwl9CisKKwlEX1RSWChpbXhfZXAtPmlteF91c2ItPmRldiwgIjwlcz4gYnl0ZXMgc2VudDogJWRcbiIsIF9fZnVuY19fLCBieXRlcyk7CisKKwlyZXR1cm4gY29tcGxldGVkOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRW5kcG9pbnQgaGFuZGxlcnMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KK3N0YXRpYyBpbnQgaGFuZGxlX2VwKHN0cnVjdCBpbXhfZXBfc3RydWN0ICppbXhfZXApCit7CisJc3RydWN0IGlteF9yZXF1ZXN0ICpyZXE7CisJaW50IGNvbXBsZXRlZCA9IDA7CisKKwlkbyB7CisJCWlmICghbGlzdF9lbXB0eSgmaW14X2VwLT5xdWV1ZSkpCisJCQlyZXEgPSBsaXN0X2VudHJ5KGlteF9lcC0+cXVldWUubmV4dCwKKwkJCQlzdHJ1Y3QgaW14X3JlcXVlc3QsIHF1ZXVlKTsKKwkJZWxzZSB7CisJCQlEX1JFUShpbXhfZXAtPmlteF91c2ItPmRldiwgIjwlcz4gbm8gcmVxdWVzdCBvbiAlc1xuIiwKKwkJCQlfX2Z1bmNfXywgaW14X2VwLT5lcC5uYW1lKTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJaWYgKEVQX0RJUihpbXhfZXApKQkvKiB0byBob3N0ICovCisJCQljb21wbGV0ZWQgPSB3cml0ZV9maWZvKGlteF9lcCwgcmVxKTsKKwkJZWxzZQkJCS8qIHRvIGRldmljZSAqLworCQkJY29tcGxldGVkID0gcmVhZF9maWZvKGlteF9lcCwgcmVxKTsKKworCQlkdW1wX2VwX3N0YXQoX19mdW5jX18sIGlteF9lcCk7CisKKwl9IHdoaWxlIChjb21wbGV0ZWQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaGFuZGxlX2VwMChzdHJ1Y3QgaW14X2VwX3N0cnVjdCAqaW14X2VwKQoreworCXN0cnVjdCBpbXhfcmVxdWVzdCAqcmVxID0gTlVMTDsKKwlpbnQgcmV0ID0gMDsKKworCWlmICghbGlzdF9lbXB0eSgmaW14X2VwLT5xdWV1ZSkpCisJCXJlcSA9IGxpc3RfZW50cnkoaW14X2VwLT5xdWV1ZS5uZXh0LCBzdHJ1Y3QgaW14X3JlcXVlc3QsIHF1ZXVlKTsKKworCWlmIChyZXEpIHsKKwkJc3dpdGNoIChpbXhfZXAtPmlteF91c2ItPmVwMHN0YXRlKSB7CisKKwkJY2FzZSBFUDBfSU5fREFUQV9QSEFTRToJCQkvKiBHRVRfREVTQ1JJUFRPUiAqLworCQkJd3JpdGVfZmlmbyhpbXhfZXAsIHJlcSk7CisJCQlicmVhazsKKwkJY2FzZSBFUDBfT1VUX0RBVEFfUEhBU0U6CQkvKiBTRVRfREVTQ1JJUFRPUiAqLworCQkJcmVhZF9maWZvKGlteF9lcCwgcmVxKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJRF9FUDAoaW14X2VwLT5pbXhfdXNiLT5kZXYsCisJCQkJIjwlcz4gZXAwIGkvbywgb2RkIHN0YXRlICVkXG4iLAorCQkJCV9fZnVuY19fLCBpbXhfZXAtPmlteF91c2ItPmVwMHN0YXRlKTsKKwkJCWVwX2RlbF9yZXF1ZXN0KGlteF9lcCwgcmVxKTsKKwkJCXJldCA9IC1FTDJITFQ7CisJCQlicmVhazsKKwkJfQorCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGhhbmRsZV9lcDBfZGV2cmVxKHN0cnVjdCBpbXhfdWRjX3N0cnVjdCAqaW14X3VzYikKK3sKKwlzdHJ1Y3QgaW14X2VwX3N0cnVjdCAqaW14X2VwID0gJmlteF91c2ItPmlteF9lcFswXTsKKwl1bmlvbiB7CisJCXN0cnVjdCB1c2JfY3RybHJlcXVlc3QJcjsKKwkJdTgJCQlyYXdbOF07CisJCXUzMgkJCXdvcmRbMl07CisJfSB1OworCWludCB0ZW1wLCBpOworCisJbnVrZShpbXhfZXAsIC1FUFJPVE8pOworCisJLyogcmVhZCBTRVRVUCBwYWNrZXQgKi8KKwlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisJCWlmIChpbXhfZXBfZW1wdHkoaW14X2VwKSkgeworCQkJRF9FUlIoaW14X3VzYi0+ZGV2LAorCQkJCSI8JXM+IG5vIHNldHVwIHBhY2tldCByZWNlaXZlZFxuIiwgX19mdW5jX18pOworCQkJZ290byBzdGFsbDsKKwkJfQorCQl1LndvcmRbaV0gPSBfX3Jhd19yZWFkbChpbXhfdXNiLT5iYXNlICsJVVNCX0VQX0ZEQVQoRVBfTk8oaW14X2VwKSkpOworCX0KKworCXRlbXAgPSBpbXhfZXBfZW1wdHkoaW14X2VwKTsKKwl3aGlsZSAoIWlteF9lcF9lbXB0eShpbXhfZXApKSB7CisJCWkgPSBfX3Jhd19yZWFkbChpbXhfdXNiLT5iYXNlICsJVVNCX0VQX0ZEQVQoRVBfTk8oaW14X2VwKSkpOworCQlEX0VSUihpbXhfdXNiLT5kZXYsCisJCQkiPCVzPiB3cm9uZyB0byBoYXZlIGV4dHJhIGJ5dGVzIGZvciBzZXR1cCA6IDB4JTA4eFxuIiwKKwkJCV9fZnVuY19fLCBpKTsKKwl9CisJaWYgKCF0ZW1wKQorCQlnb3RvIHN0YWxsOworCisJbGUxNl90b19jcHVzKCZ1LnIud1ZhbHVlKTsKKwlsZTE2X3RvX2NwdXMoJnUuci53SW5kZXgpOworCWxlMTZfdG9fY3B1cygmdS5yLndMZW5ndGgpOworCisJRF9SRVEoaW14X3VzYi0+ZGV2LCAiPCVzPiBTRVRVUCAlMDJ4LiUwMnggdiUwNHggaSUwNHggbCUwNHhcbiIsCisJCV9fZnVuY19fLCB1LnIuYlJlcXVlc3RUeXBlLCB1LnIuYlJlcXVlc3QsCisJCXUuci53VmFsdWUsIHUuci53SW5kZXgsIHUuci53TGVuZ3RoKTsKKworCWlmIChpbXhfdXNiLT5zZXRfY29uZmlnKSB7CisJCS8qIE5BQ0sgdGhlIGhvc3QgYnkgdXNpbmcgQ01ET1ZFUiAqLworCQl0ZW1wID0gX19yYXdfcmVhZGwoaW14X3VzYi0+YmFzZSArIFVTQl9DVFJMKTsKKwkJX19yYXdfd3JpdGVsKHRlbXAgfCBDVFJMX0NNRE9WRVIsIGlteF91c2ItPmJhc2UgKyBVU0JfQ1RSTCk7CisKKwkJRF9FUlIoaW14X3VzYi0+ZGV2LAorCQkJIjwlcz4gc2V0IGNvbmZpZyByZXEgaXMgcGVuZGluZywgTkFDSyB0aGUgaG9zdFxuIiwKKwkJCV9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKworCWlmICh1LnIuYlJlcXVlc3RUeXBlICYgVVNCX0RJUl9JTikKKwkJZXAwX2NoZ19zdGF0KF9fZnVuY19fLCBpbXhfdXNiLCBFUDBfSU5fREFUQV9QSEFTRSk7CisJZWxzZQorCQllcDBfY2hnX3N0YXQoX19mdW5jX18sIGlteF91c2IsIEVQMF9PVVRfREFUQV9QSEFTRSk7CisKKwlpID0gaW14X3VzYi0+ZHJpdmVyLT5zZXR1cCgmaW14X3VzYi0+Z2FkZ2V0LCAmdS5yKTsKKwlpZiAoaSA8IDApIHsKKwkJRF9FUlIoaW14X3VzYi0+ZGV2LCAiPCVzPiBkZXZpY2Ugc2V0dXAgZXJyb3IgJWRcbiIsCisJCQlfX2Z1bmNfXywgaSk7CisJCWdvdG8gc3RhbGw7CisJfQorCisJcmV0dXJuOworc3RhbGw6CisJRF9FUlIoaW14X3VzYi0+ZGV2LCAiPCVzPiBwcm90b2NvbCBTVEFMTFxuIiwgX19mdW5jX18pOworCWlteF9lcF9zdGFsbChpbXhfZXApOworCWVwMF9jaGdfc3RhdChfX2Z1bmNfXywgaW14X3VzYiwgRVAwX1NUQUxMKTsKKwlyZXR1cm47Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBVU0IgZ2FkZ2V0IGNhbGxiYWNrIGZ1bmN0aW9ucworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCitzdGF0aWMgaW50IGlteF9lcF9lbmFibGUoc3RydWN0IHVzYl9lcCAqdXNiX2VwLAorCQkJCWNvbnN0IHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZGVzYykKK3sKKwlzdHJ1Y3QgaW14X2VwX3N0cnVjdCAqaW14X2VwID0gY29udGFpbmVyX29mKHVzYl9lcCwKKwkJCQkJCXN0cnVjdCBpbXhfZXBfc3RydWN0LCBlcCk7CisJc3RydWN0IGlteF91ZGNfc3RydWN0ICppbXhfdXNiID0gaW14X2VwLT5pbXhfdXNiOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoIXVzYl9lcAorCQl8fCAhZGVzYworCQl8fCAhRVBfTk8oaW14X2VwKQorCQl8fCBkZXNjLT5iRGVzY3JpcHRvclR5cGUgIT0gVVNCX0RUX0VORFBPSU5UCisJCXx8IGlteF9lcC0+YkVuZHBvaW50QWRkcmVzcyAhPSBkZXNjLT5iRW5kcG9pbnRBZGRyZXNzKSB7CisJCQlEX0VSUihpbXhfdXNiLT5kZXYsCisJCQkJIjwlcz4gYmFkIGVwIG9yIGRlc2NyaXB0b3JcbiIsIF9fZnVuY19fKTsKKwkJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChpbXhfZXAtPmJtQXR0cmlidXRlcyAhPSBkZXNjLT5ibUF0dHJpYnV0ZXMpIHsKKwkJRF9FUlIoaW14X3VzYi0+ZGV2LAorCQkJIjwlcz4gJXMgdHlwZSBtaXNtYXRjaFxuIiwgX19mdW5jX18sIHVzYl9lcC0+bmFtZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChpbXhfZXAtPmZpZm9zaXplIDwgbGUxNl90b19jcHUoZGVzYy0+d01heFBhY2tldFNpemUpKSB7CisJCURfRVJSKGlteF91c2ItPmRldiwKKwkJCSI8JXM+IGJhZCAlcyBtYXhwYWNrZXRcbiIsIF9fZnVuY19fLCB1c2JfZXAtPm5hbWUpOworCQlyZXR1cm4gLUVSQU5HRTsKKwl9CisKKwlpZiAoIWlteF91c2ItPmRyaXZlciB8fCBpbXhfdXNiLT5nYWRnZXQuc3BlZWQgPT0gVVNCX1NQRUVEX1VOS05PV04pIHsKKwkJRF9FUlIoaW14X3VzYi0+ZGV2LCAiPCVzPiBib2d1cyBkZXZpY2Ugc3RhdGVcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FU0hVVERPV047CisJfQorCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCisJaW14X2VwLT5zdG9wcGVkID0gMDsKKwlpbXhfZmx1c2goaW14X2VwKTsKKwlpbXhfZXBfaXJxX2VuYWJsZShpbXhfZXApOworCisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCisJRF9FUFgoaW14X3VzYi0+ZGV2LCAiPCVzPiBFTkFCTEVEICVzXG4iLCBfX2Z1bmNfXywgdXNiX2VwLT5uYW1lKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpbXhfZXBfZGlzYWJsZShzdHJ1Y3QgdXNiX2VwICp1c2JfZXApCit7CisJc3RydWN0IGlteF9lcF9zdHJ1Y3QgKmlteF9lcCA9IGNvbnRhaW5lcl9vZih1c2JfZXAsCisJCQkJCQlzdHJ1Y3QgaW14X2VwX3N0cnVjdCwgZXApOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoIXVzYl9lcCB8fCAhRVBfTk8oaW14X2VwKSB8fCAhbGlzdF9lbXB0eSgmaW14X2VwLT5xdWV1ZSkpIHsKKwkJRF9FUlIoaW14X2VwLT5pbXhfdXNiLT5kZXYsICI8JXM+ICVzIGNhbiBub3QgYmUgZGlzYWJsZWRcbiIsCisJCQlfX2Z1bmNfXywgdXNiX2VwID8gaW14X2VwLT5lcC5uYW1lIDogTlVMTCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKworCWlteF9lcC0+c3RvcHBlZCA9IDE7CisJbnVrZShpbXhfZXAsIC1FU0hVVERPV04pOworCWlteF9mbHVzaChpbXhfZXApOworCWlteF9lcF9pcnFfZGlzYWJsZShpbXhfZXApOworCisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCisJRF9FUFgoaW14X2VwLT5pbXhfdXNiLT5kZXYsCisJCSI8JXM+IERJU0FCTEVEICVzXG4iLCBfX2Z1bmNfXywgdXNiX2VwLT5uYW1lKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCB1c2JfcmVxdWVzdCAqaW14X2VwX2FsbG9jX3JlcXVlc3QKKwkJCQkJKHN0cnVjdCB1c2JfZXAgKnVzYl9lcCwgZ2ZwX3QgZ2ZwX2ZsYWdzKQoreworCXN0cnVjdCBpbXhfcmVxdWVzdCAqcmVxOworCisJcmVxID0ga3phbGxvYyhzaXplb2YgKnJlcSwgZ2ZwX2ZsYWdzKTsKKwlpZiAoIXJlcSB8fCAhdXNiX2VwKQorCQlyZXR1cm4gMDsKKworCUlOSVRfTElTVF9IRUFEKCZyZXEtPnF1ZXVlKTsKKwlyZXEtPmluX3VzZSA9IDA7CisKKwlyZXR1cm4gJnJlcS0+cmVxOworfQorCitzdGF0aWMgdm9pZCBpbXhfZXBfZnJlZV9yZXF1ZXN0CisJCQkoc3RydWN0IHVzYl9lcCAqdXNiX2VwLCBzdHJ1Y3QgdXNiX3JlcXVlc3QgKnVzYl9yZXEpCit7CisJc3RydWN0IGlteF9yZXF1ZXN0ICpyZXE7CisKKwlyZXEgPSBjb250YWluZXJfb2YodXNiX3JlcSwgc3RydWN0IGlteF9yZXF1ZXN0LCByZXEpOworCVdBUk5fT04oIWxpc3RfZW1wdHkoJnJlcS0+cXVldWUpKTsKKwlrZnJlZShyZXEpOworfQorCitzdGF0aWMgaW50IGlteF9lcF9xdWV1ZQorCShzdHJ1Y3QgdXNiX2VwICp1c2JfZXAsIHN0cnVjdCB1c2JfcmVxdWVzdCAqdXNiX3JlcSwgZ2ZwX3QgZ2ZwX2ZsYWdzKQoreworCXN0cnVjdCBpbXhfZXBfc3RydWN0CSppbXhfZXA7CisJc3RydWN0IGlteF91ZGNfc3RydWN0CSppbXhfdXNiOworCXN0cnVjdCBpbXhfcmVxdWVzdAkqcmVxOworCXVuc2lnbmVkIGxvbmcJCWZsYWdzOworCWludAkJCXJldCA9IDA7CisKKwlpbXhfZXAgPSBjb250YWluZXJfb2YodXNiX2VwLCBzdHJ1Y3QgaW14X2VwX3N0cnVjdCwgZXApOworCWlteF91c2IgPSBpbXhfZXAtPmlteF91c2I7CisJcmVxID0gY29udGFpbmVyX29mKHVzYl9yZXEsIHN0cnVjdCBpbXhfcmVxdWVzdCwgcmVxKTsKKworCS8qCisJICBTcGVjaWFsIGNhcmUgb24gSU1YIHVkYy4KKwkgIElnbm9yZSBlbnF1ZXVlIHdoZW4gYWZ0ZXIgc2V0IGNvbmZpZ3VyYXRpb24gZnJvbSB0aGUKKwkgIGhvc3QuIFRoaXMgYXNzdW1lIGFsbCBnYWRnZXQgZHJpdmVycyByZXBseSBzZXQKKwkgIGNvbmZpZ3VyYXRpb24gd2l0aCB0aGUgbmV4dCBlcDAgcmVxIGVucXVldWUuCisJKi8KKwlpZiAoaW14X3VzYi0+c2V0X2NvbmZpZyAmJiAhRVBfTk8oaW14X2VwKSkgeworCQlpbXhfdXNiLT5zZXRfY29uZmlnID0gMDsKKwkJRF9FUFgoaW14X3VzYi0+ZGV2LAorCQkJIjwlcz4gZ2FkZ2V0IHJlcGx5IHNldCBjb25maWdcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKHVubGlrZWx5KCF1c2JfcmVxIHx8ICFyZXEgfHwgIXVzYl9yZXEtPmNvbXBsZXRlIHx8ICF1c2JfcmVxLT5idWYpKSB7CisJCURfRVJSKGlteF91c2ItPmRldiwgIjwlcz4gYmFkIHBhcmFtc1xuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAodW5saWtlbHkoIXVzYl9lcCB8fCAhaW14X2VwKSkgeworCQlEX0VSUihpbXhfdXNiLT5kZXYsICI8JXM+IGJhZCBlcFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoIWlteF91c2ItPmRyaXZlciB8fCBpbXhfdXNiLT5nYWRnZXQuc3BlZWQgPT0gVVNCX1NQRUVEX1VOS05PV04pIHsKKwkJRF9FUlIoaW14X3VzYi0+ZGV2LCAiPCVzPiBib2d1cyBkZXZpY2Ugc3RhdGVcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FU0hVVERPV047CisJfQorCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCisJLyogRGVidWcgKi8KKwlEX1JFUShpbXhfdXNiLT5kZXYsICI8JXM+IGVwJWQgJXMgcmVxdWVzdCBmb3IgWyVkXSBieXRlc1xuIiwKKwkJX19mdW5jX18sIEVQX05PKGlteF9lcCksCisJCSgoIUVQX05PKGlteF9lcCkgJiYgaW14X2VwLT5pbXhfdXNiLT5lcDBzdGF0ZSA9PSBFUDBfSU5fREFUQV9QSEFTRSkKKwkJfHwgKEVQX05PKGlteF9lcCkgJiYgRVBfRElSKGlteF9lcCkpKSA/ICJJTiIgOiAiT1VUIiwgdXNiX3JlcS0+bGVuZ3RoKTsKKwlkdW1wX3JlcShfX2Z1bmNfXywgaW14X2VwLCB1c2JfcmVxKTsKKworCWlmIChpbXhfZXAtPnN0b3BwZWQpIHsKKwkJdXNiX3JlcS0+c3RhdHVzID0gLUVTSFVURE9XTjsKKwkJcmV0ID0gLUVTSFVURE9XTjsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKHJlcS0+aW5fdXNlKSB7CisJCURfRVJSKGlteF91c2ItPmRldiwKKwkJCSI8JXM+IHJlZnVzaW5nIHRvIHF1ZXVlIHJlcSAlcCAoYWxyZWFkeSBxdWV1ZWQpXG4iLAorCQkJX19mdW5jX18sIHJlcSk7CisJCWdvdG8gb3V0OworCX0KKworCXVzYl9yZXEtPnN0YXR1cyA9IC1FSU5QUk9HUkVTUzsKKwl1c2JfcmVxLT5hY3R1YWwgPSAwOworCisJZXBfYWRkX3JlcXVlc3QoaW14X2VwLCByZXEpOworCisJaWYgKCFFUF9OTyhpbXhfZXApKQorCQlyZXQgPSBoYW5kbGVfZXAwKGlteF9lcCk7CisJZWxzZQorCQlyZXQgPSBoYW5kbGVfZXAoaW14X2VwKTsKK291dDoKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBpbXhfZXBfZGVxdWV1ZShzdHJ1Y3QgdXNiX2VwICp1c2JfZXAsIHN0cnVjdCB1c2JfcmVxdWVzdCAqdXNiX3JlcSkKK3sKKworCXN0cnVjdCBpbXhfZXBfc3RydWN0ICppbXhfZXAgPSBjb250YWluZXJfb2YKKwkJCQkJKHVzYl9lcCwgc3RydWN0IGlteF9lcF9zdHJ1Y3QsIGVwKTsKKwlzdHJ1Y3QgaW14X3JlcXVlc3QgKnJlcTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKHVubGlrZWx5KCF1c2JfZXAgfHwgIUVQX05PKGlteF9lcCkpKSB7CisJCURfRVJSKGlteF9lcC0+aW14X3VzYi0+ZGV2LCAiPCVzPiBiYWQgZXBcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCisJLyogbWFrZSBzdXJlIGl0J3MgYWN0dWFsbHkgcXVldWVkIG9uIHRoaXMgZW5kcG9pbnQgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJlcSwgJmlteF9lcC0+cXVldWUsIHF1ZXVlKSB7CisJCWlmICgmcmVxLT5yZXEgPT0gdXNiX3JlcSkKKwkJCWJyZWFrOworCX0KKwlpZiAoJnJlcS0+cmVxICE9IHVzYl9yZXEpIHsKKwkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlkb25lKGlteF9lcCwgcmVxLCAtRUNPTk5SRVNFVCk7CisKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaW14X2VwX3NldF9oYWx0KHN0cnVjdCB1c2JfZXAgKnVzYl9lcCwgaW50IHZhbHVlKQoreworCXN0cnVjdCBpbXhfZXBfc3RydWN0ICppbXhfZXAgPSBjb250YWluZXJfb2YKKwkJCQkJKHVzYl9lcCwgc3RydWN0IGlteF9lcF9zdHJ1Y3QsIGVwKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKHVubGlrZWx5KCF1c2JfZXAgfHwgIUVQX05PKGlteF9lcCkpKSB7CisJCURfRVJSKGlteF9lcC0+aW14X3VzYi0+ZGV2LCAiPCVzPiBiYWQgZXBcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCisJaWYgKChpbXhfZXAtPmJFbmRwb2ludEFkZHJlc3MgJiBVU0JfRElSX0lOKQorCQkmJiAhbGlzdF9lbXB0eSgmaW14X2VwLT5xdWV1ZSkpIHsKKwkJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwkJCXJldHVybiAtRUFHQUlOOworCX0KKworCWlteF9lcF9zdGFsbChpbXhfZXApOworCisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCisJRF9FUFgoaW14X2VwLT5pbXhfdXNiLT5kZXYsICI8JXM+ICVzIGhhbHRcbiIsIF9fZnVuY19fLCB1c2JfZXAtPm5hbWUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGlteF9lcF9maWZvX3N0YXR1cyhzdHJ1Y3QgdXNiX2VwICp1c2JfZXApCit7CisJc3RydWN0IGlteF9lcF9zdHJ1Y3QgKmlteF9lcCA9IGNvbnRhaW5lcl9vZgorCQkJCQkodXNiX2VwLCBzdHJ1Y3QgaW14X2VwX3N0cnVjdCwgZXApOworCisJaWYgKCF1c2JfZXApIHsKKwkJRF9FUlIoaW14X2VwLT5pbXhfdXNiLT5kZXYsICI8JXM+IGJhZCBlcFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlpZiAoaW14X2VwLT5pbXhfdXNiLT5nYWRnZXQuc3BlZWQgPT0gVVNCX1NQRUVEX1VOS05PV04pCisJCXJldHVybiAwOworCWVsc2UKKwkJcmV0dXJuIGlteF9maWZvX2Jjb3VudChpbXhfZXApOworfQorCitzdGF0aWMgdm9pZCBpbXhfZXBfZmlmb19mbHVzaChzdHJ1Y3QgdXNiX2VwICp1c2JfZXApCit7CisJc3RydWN0IGlteF9lcF9zdHJ1Y3QgKmlteF9lcCA9IGNvbnRhaW5lcl9vZgorCQkJCQkodXNiX2VwLCBzdHJ1Y3QgaW14X2VwX3N0cnVjdCwgZXApOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisKKwlpZiAoIXVzYl9lcCB8fCAhRVBfTk8oaW14X2VwKSB8fCAhbGlzdF9lbXB0eSgmaW14X2VwLT5xdWV1ZSkpIHsKKwkJRF9FUlIoaW14X2VwLT5pbXhfdXNiLT5kZXYsICI8JXM+IGJhZCBlcFxuIiwgX19mdW5jX18pOworCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJCXJldHVybjsKKwl9CisKKwkvKiB0b2dnbGUgYW5kIGhhbHQgYml0cyBzdGF5IHVuY2hhbmdlZCAqLworCWlteF9mbHVzaChpbXhfZXApOworCisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworfQorCitzdGF0aWMgc3RydWN0IHVzYl9lcF9vcHMgaW14X2VwX29wcyA9IHsKKwkuZW5hYmxlCQk9IGlteF9lcF9lbmFibGUsCisJLmRpc2FibGUJPSBpbXhfZXBfZGlzYWJsZSwKKworCS5hbGxvY19yZXF1ZXN0CT0gaW14X2VwX2FsbG9jX3JlcXVlc3QsCisJLmZyZWVfcmVxdWVzdAk9IGlteF9lcF9mcmVlX3JlcXVlc3QsCisKKwkucXVldWUJCT0gaW14X2VwX3F1ZXVlLAorCS5kZXF1ZXVlCT0gaW14X2VwX2RlcXVldWUsCisKKwkuc2V0X2hhbHQJPSBpbXhfZXBfc2V0X2hhbHQsCisJLmZpZm9fc3RhdHVzCT0gaW14X2VwX2ZpZm9fc3RhdHVzLAorCS5maWZvX2ZsdXNoCT0gaW14X2VwX2ZpZm9fZmx1c2gsCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogVVNCIGVuZHBvaW50IGNvbnRyb2wgZnVuY3Rpb25zCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKK3ZvaWQgZXAwX2NoZ19zdGF0KGNvbnN0IGNoYXIgKmxhYmVsLAorCQkJc3RydWN0IGlteF91ZGNfc3RydWN0ICppbXhfdXNiLCBlbnVtIGVwMF9zdGF0ZSBzdGF0KQoreworCURfRVAwKGlteF91c2ItPmRldiwgIjwlcz4gZnJvbSAlMTVzIHRvICUxNXNcbiIsCisJCWxhYmVsLCBzdGF0ZV9uYW1lW2lteF91c2ItPmVwMHN0YXRlXSwgc3RhdGVfbmFtZVtzdGF0XSk7CisKKwlpZiAoaW14X3VzYi0+ZXAwc3RhdGUgPT0gc3RhdCkKKwkJcmV0dXJuOworCisJaW14X3VzYi0+ZXAwc3RhdGUgPSBzdGF0OworfQorCitzdGF0aWMgdm9pZCB1c2JfaW5pdF9kYXRhKHN0cnVjdCBpbXhfdWRjX3N0cnVjdCAqaW14X3VzYikKK3sKKwlzdHJ1Y3QgaW14X2VwX3N0cnVjdCAqaW14X2VwOworCXU4IGk7CisKKwkvKiBkZXZpY2UvZXAwIHJlY29yZHMgaW5pdCAqLworCUlOSVRfTElTVF9IRUFEKCZpbXhfdXNiLT5nYWRnZXQuZXBfbGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJmlteF91c2ItPmdhZGdldC5lcDAtPmVwX2xpc3QpOworCWVwMF9jaGdfc3RhdChfX2Z1bmNfXywgaW14X3VzYiwgRVAwX0lETEUpOworCisJLyogYmFzaWMgZW5kcG9pbnQgcmVjb3JkcyBpbml0ICovCisJZm9yIChpID0gMDsgaSA8IElNWF9VU0JfTkJfRVA7IGkrKykgeworCQlpbXhfZXAgPSAmaW14X3VzYi0+aW14X2VwW2ldOworCisJCWlmIChpKSB7CisJCQlsaXN0X2FkZF90YWlsKCZpbXhfZXAtPmVwLmVwX2xpc3QsCisJCQkJJmlteF91c2ItPmdhZGdldC5lcF9saXN0KTsKKwkJCWlteF9lcC0+c3RvcHBlZCA9IDE7CisJCX0gZWxzZQorCQkJaW14X2VwLT5zdG9wcGVkID0gMDsKKworCQlJTklUX0xJU1RfSEVBRCgmaW14X2VwLT5xdWV1ZSk7CisJfQorfQorCitzdGF0aWMgdm9pZCB1ZGNfc3RvcF9hY3Rpdml0eShzdHJ1Y3QgaW14X3VkY19zdHJ1Y3QgKmlteF91c2IsCisJCQkJCXN0cnVjdCB1c2JfZ2FkZ2V0X2RyaXZlciAqZHJpdmVyKQoreworCXN0cnVjdCBpbXhfZXBfc3RydWN0ICppbXhfZXA7CisJaW50IGk7CisKKwlpZiAoaW14X3VzYi0+Z2FkZ2V0LnNwZWVkID09IFVTQl9TUEVFRF9VTktOT1dOKQorCQlkcml2ZXIgPSBOVUxMOworCisJLyogcHJldmVudCBuZXcgcmVxdWVzdCBzdWJtaXNzaW9ucywga2lsbCBhbnkgb3V0c3RhbmRpbmcgcmVxdWVzdHMgICovCisJZm9yIChpID0gMTsgaSA8IElNWF9VU0JfTkJfRVA7IGkrKykgeworCQlpbXhfZXAgPSAmaW14X3VzYi0+aW14X2VwW2ldOworCQlpbXhfZmx1c2goaW14X2VwKTsKKwkJaW14X2VwLT5zdG9wcGVkID0gMTsKKwkJaW14X2VwX2lycV9kaXNhYmxlKGlteF9lcCk7CisJCW51a2UoaW14X2VwLCAtRVNIVVRET1dOKTsKKwl9CisKKwlpbXhfdXNiLT5jZmcgPSAwOworCWlteF91c2ItPmludGYgPSAwOworCWlteF91c2ItPmFsdCA9IDA7CisKKwlpZiAoZHJpdmVyKQorCQlkcml2ZXItPmRpc2Nvbm5lY3QoJmlteF91c2ItPmdhZGdldCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJbnRlcnJ1cHQgaGFuZGxlcnMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworc3RhdGljIGlycXJldHVybl90IGlteF91ZGNfaXJxKGludCBpcnEsIHZvaWQgKmRldikKK3sKKwlzdHJ1Y3QgaW14X3VkY19zdHJ1Y3QgKmlteF91c2IgPSBkZXY7CisJc3RydWN0IHVzYl9jdHJscmVxdWVzdCB1OworCWludCB0ZW1wLCBjZmcsIGludGYsIGFsdDsKKwlpbnQgaW50ciA9IF9fcmF3X3JlYWRsKGlteF91c2ItPmJhc2UgKyBVU0JfSU5UUik7CisKKwlpZiAoaW50ciAmIChJTlRSX1dBS0VVUCB8IElOVFJfU1VTUEVORCB8IElOVFJfUkVTVU1FIHwgSU5UUl9SRVNFVF9TVEFSVAorCQkJfCBJTlRSX1JFU0VUX1NUT1AgfCBJTlRSX0NGR19DSEcpKSB7CisJCQkJZHVtcF9pbnRyKF9fZnVuY19fLCBpbnRyLCBpbXhfdXNiLT5kZXYpOworCQkJCWR1bXBfdXNiX3N0YXQoX19mdW5jX18sIGlteF91c2IpOworCX0KKworCWlmICghaW14X3VzYi0+ZHJpdmVyKSB7CisJCS8qaW14X3VkY19kaXNhYmxlKGlteF91c2IpOyovCisJCWdvdG8gZW5kX2lycTsKKwl9CisKKwlpZiAoaW50ciAmIElOVFJfV0FLRVVQKSB7CisJCWlmIChpbXhfdXNiLT5nYWRnZXQuc3BlZWQgPT0gVVNCX1NQRUVEX1VOS05PV04KKwkJCSYmIGlteF91c2ItPmRyaXZlciAmJiBpbXhfdXNiLT5kcml2ZXItPnJlc3VtZSkKKwkJCQlpbXhfdXNiLT5kcml2ZXItPnJlc3VtZSgmaW14X3VzYi0+Z2FkZ2V0KTsKKwkJaW14X3VzYi0+c2V0X2NvbmZpZyA9IDA7CisJCWlteF91c2ItPmdhZGdldC5zcGVlZCA9IFVTQl9TUEVFRF9GVUxMOworCX0KKworCWlmIChpbnRyICYgSU5UUl9TVVNQRU5EKSB7CisJCWlmIChpbXhfdXNiLT5nYWRnZXQuc3BlZWQgIT0gVVNCX1NQRUVEX1VOS05PV04KKwkJCSYmIGlteF91c2ItPmRyaXZlciAmJiBpbXhfdXNiLT5kcml2ZXItPnN1c3BlbmQpCisJCQkJaW14X3VzYi0+ZHJpdmVyLT5zdXNwZW5kKCZpbXhfdXNiLT5nYWRnZXQpOworCQlpbXhfdXNiLT5zZXRfY29uZmlnID0gMDsKKwkJaW14X3VzYi0+Z2FkZ2V0LnNwZWVkID0gVVNCX1NQRUVEX1VOS05PV047CisJfQorCisJaWYgKGludHIgJiBJTlRSX1JFU0VUX1NUQVJUKSB7CisJCV9fcmF3X3dyaXRlbChpbnRyLCBpbXhfdXNiLT5iYXNlICsgVVNCX0lOVFIpOworCQl1ZGNfc3RvcF9hY3Rpdml0eShpbXhfdXNiLCBpbXhfdXNiLT5kcml2ZXIpOworCQlpbXhfdXNiLT5zZXRfY29uZmlnID0gMDsKKwkJaW14X3VzYi0+Z2FkZ2V0LnNwZWVkID0gVVNCX1NQRUVEX1VOS05PV047CisJfQorCisJaWYgKGludHIgJiBJTlRSX1JFU0VUX1NUT1ApCisJCWlteF91c2ItPmdhZGdldC5zcGVlZCA9IFVTQl9TUEVFRF9GVUxMOworCisJaWYgKGludHIgJiBJTlRSX0NGR19DSEcpIHsKKwkJX19yYXdfd3JpdGVsKElOVFJfQ0ZHX0NIRywgaW14X3VzYi0+YmFzZSArIFVTQl9JTlRSKTsKKwkJdGVtcCA9IF9fcmF3X3JlYWRsKGlteF91c2ItPmJhc2UgKyBVU0JfU1RBVCk7CisJCWNmZyAgPSAodGVtcCAmIFNUQVRfQ0ZHKSA+PiA1OworCQlpbnRmID0gKHRlbXAgJiBTVEFUX0lOVEYpID4+IDM7CisJCWFsdCAgPSAgdGVtcCAmIFNUQVRfQUxUU0VUOworCisJCURfUkVRKGlteF91c2ItPmRldiwKKwkJCSI8JXM+IG9yaWcgY29uZmlnIEM9JWQsIEk9JWQsIEE9JWQgLyAiCisJCQkicmVxIGNvbmZpZyBDPSVkLCBJPSVkLCBBPSVkXG4iLAorCQkJX19mdW5jX18sIGlteF91c2ItPmNmZywgaW14X3VzYi0+aW50ZiwgaW14X3VzYi0+YWx0LAorCQkJY2ZnLCBpbnRmLCBhbHQpOworCisJCWlmIChjZmcgIT0gMSAmJiBjZmcgIT0gMikKKwkJCWdvdG8gZW5kX2lycTsKKworCQlpbXhfdXNiLT5zZXRfY29uZmlnID0gMDsKKworCQkvKiBDb25maWcgc2V0dXAgKi8KKwkJaWYgKGlteF91c2ItPmNmZyAhPSBjZmcpIHsKKwkJCURfUkVRKGlteF91c2ItPmRldiwgIjwlcz4gQ2hhbmdlIGNvbmZpZyBzdGFydFxuIixfX2Z1bmNfXyk7CisJCQl1LmJSZXF1ZXN0ID0gVVNCX1JFUV9TRVRfQ09ORklHVVJBVElPTjsKKwkJCXUuYlJlcXVlc3RUeXBlID0gVVNCX0RJUl9PVVQgfAorCQkJCQlVU0JfVFlQRV9TVEFOREFSRCB8CisJCQkJCVVTQl9SRUNJUF9ERVZJQ0U7CisJCQl1LndWYWx1ZSA9IGNmZzsKKwkJCXUud0luZGV4ID0gMDsKKwkJCXUud0xlbmd0aCA9IDA7CisJCQlpbXhfdXNiLT5jZmcgPSBjZmc7CisJCQlpbXhfdXNiLT5zZXRfY29uZmlnID0gMTsKKwkJCWlteF91c2ItPmRyaXZlci0+c2V0dXAoJmlteF91c2ItPmdhZGdldCwgJnUpOworCQkJaW14X3VzYi0+c2V0X2NvbmZpZyA9IDA7CisJCQlEX1JFUShpbXhfdXNiLT5kZXYsICI8JXM+IENoYW5nZSBjb25maWcgZG9uZVxuIixfX2Z1bmNfXyk7CisKKwkJfQorCQlpZiAoaW14X3VzYi0+aW50ZiAhPSBpbnRmIHx8IGlteF91c2ItPmFsdCAhPSBhbHQpIHsKKwkJCURfUkVRKGlteF91c2ItPmRldiwgIjwlcz4gQ2hhbmdlIGludGVyZmFjZSBzdGFydFxuIixfX2Z1bmNfXyk7CisJCQl1LmJSZXF1ZXN0ID0gVVNCX1JFUV9TRVRfSU5URVJGQUNFOworCQkJdS5iUmVxdWVzdFR5cGUgPSBVU0JfRElSX09VVCB8CisJCQkJCSAgVVNCX1RZUEVfU1RBTkRBUkQgfAorCQkJCQkgIFVTQl9SRUNJUF9JTlRFUkZBQ0U7CisJCQl1LndWYWx1ZSA9IGFsdDsKKwkJCXUud0luZGV4ID0gaW50ZjsKKwkJCXUud0xlbmd0aCA9IDA7CisJCQlpbXhfdXNiLT5pbnRmID0gaW50ZjsKKwkJCWlteF91c2ItPmFsdCA9IGFsdDsKKwkJCWlteF91c2ItPnNldF9jb25maWcgPSAxOworCQkJaW14X3VzYi0+ZHJpdmVyLT5zZXR1cCgmaW14X3VzYi0+Z2FkZ2V0LCAmdSk7CisJCQlpbXhfdXNiLT5zZXRfY29uZmlnID0gMDsKKwkJCURfUkVRKGlteF91c2ItPmRldiwgIjwlcz4gQ2hhbmdlIGludGVyZmFjZSBkb25lXG4iLF9fZnVuY19fKTsKKwkJfQorCX0KKworCWlmIChpbnRyICYgSU5UUl9TT0YpIHsKKwkJaWYgKGlteF91c2ItPmVwMHN0YXRlID09IEVQMF9JRExFKSB7CisJCQl0ZW1wID0gX19yYXdfcmVhZGwoaW14X3VzYi0+YmFzZSArIFVTQl9DVFJMKTsKKwkJCV9fcmF3X3dyaXRlbCh0ZW1wIHwgQ1RSTF9DTURPVkVSLCBpbXhfdXNiLT5iYXNlICsgVVNCX0NUUkwpOworCQl9CisJfQorCitlbmRfaXJxOgorCV9fcmF3X3dyaXRlbChpbnRyLCBpbXhfdXNiLT5iYXNlICsgVVNCX0lOVFIpOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGlycXJldHVybl90IGlteF91ZGNfY3RybF9pcnEoaW50IGlycSwgdm9pZCAqZGV2KQoreworCXN0cnVjdCBpbXhfdWRjX3N0cnVjdCAqaW14X3VzYiA9IGRldjsKKwlpbnQgaW50ciA9IF9fcmF3X3JlYWRsKGlteF91c2ItPmJhc2UgKyBVU0JfRVBfSU5UUigwKSk7CisKKwlkdW1wX2VwX2ludHIoX19mdW5jX18sIDAsIGludHIsIGlteF91c2ItPmRldik7CisKKwlpZiAoIWlteF91c2ItPmRyaXZlcikgeworCQlfX3Jhd193cml0ZWwoaW50ciwgaW14X3VzYi0+YmFzZSArIFVTQl9FUF9JTlRSKDApKTsKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCX0KKworCS8qIERFVlJFUSBJUlEgaGFzIGhpZ2hlc3QgcHJpb3JpdHkgKi8KKwlpZiAoaW50ciAmIChFUElOVFJfREVWUkVRIHwgRVBJTlRSX01ERVZSRVEpKQorCQloYW5kbGVfZXAwX2RldnJlcShpbXhfdXNiKTsKKwkvKiBTZWVtIGkuTVggaXMgbWlzc2luZyBFT0YgaW50ZXJydXB0IHNvbWV0aW1lcy4KKwkgKiBUaGVyZWZvcmUgd2UgbW9uaXRvciBib3RoIEVPRiBhbmQgRklGT19FTVBUWSBpbnRlcnJ1cHMKKwkgKiB3aGVuIHRyYW5zbWl0aW5nLCBhbmQgYm90aCBFT0YgYW5kIEZJRk9fRlVMTCB3aGVuCisJICogcmVjZWl2aW5nIGRhdGEuCisJICovCisJZWxzZSBpZiAoaW50ciAmIChFUElOVFJfRU9GIHwgRVBJTlRSX0ZJRk9fRU1QVFkgfCBFUElOVFJfRklGT19GVUxMKSkKKwkJaGFuZGxlX2VwMCgmaW14X3VzYi0+aW14X2VwWzBdKTsKKworCV9fcmF3X3dyaXRlbChpbnRyLCBpbXhfdXNiLT5iYXNlICsgVVNCX0VQX0lOVFIoMCkpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgaW14X3VkY19idWxrX2lycShpbnQgaXJxLCB2b2lkICpkZXYpCit7CisJc3RydWN0IGlteF91ZGNfc3RydWN0ICppbXhfdXNiID0gZGV2OworCXN0cnVjdCBpbXhfZXBfc3RydWN0ICppbXhfZXAgPSAmaW14X3VzYi0+aW14X2VwW2lycSAtIFVTQkRfSU5UMF07CisJaW50IGludHIgPSBfX3Jhd19yZWFkbChpbXhfdXNiLT5iYXNlICsgVVNCX0VQX0lOVFIoRVBfTk8oaW14X2VwKSkpOworCisJZHVtcF9lcF9pbnRyKF9fZnVuY19fLCBpcnEgLSBVU0JEX0lOVDAsIGludHIsIGlteF91c2ItPmRldik7CisKKwlpZiAoIWlteF91c2ItPmRyaXZlcikgeworCQlfX3Jhd193cml0ZWwoaW50ciwgaW14X3VzYi0+YmFzZSArIFVTQl9FUF9JTlRSKEVQX05PKGlteF9lcCkpKTsKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCX0KKworCWhhbmRsZV9lcChpbXhfZXApOworCisJX19yYXdfd3JpdGVsKGludHIsIGlteF91c2ItPmJhc2UgKyBVU0JfRVBfSU5UUihFUF9OTyhpbXhfZXApKSk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK2lycV9oYW5kbGVyX3QgaW50cl9oYW5kbGVyKGludCBpKQoreworCXN3aXRjaCAoaSkgeworCWNhc2UgMDoKKwkJcmV0dXJuIGlteF91ZGNfY3RybF9pcnE7CisJY2FzZSAxOgorCWNhc2UgMjoKKwljYXNlIDM6CisJY2FzZSA0OgorCWNhc2UgNToKKwkJcmV0dXJuIGlteF91ZGNfYnVsa19pcnE7CisJZGVmYXVsdDoKKwkJcmV0dXJuIGlteF91ZGNfaXJxOworCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFN0YXRpYyBkZWZpbmVkIElNWCBVREMgc3RydWN0dXJlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdXNiX2dhZGdldF9vcHMgaW14X3VkY19vcHMgPSB7CisJLmdldF9mcmFtZQkgPSBpbXhfdWRjX2dldF9mcmFtZSwKKwkud2FrZXVwCQkgPSBpbXhfdWRjX3dha2V1cCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgaW14X3VkY19zdHJ1Y3QgY29udHJvbGxlciA9IHsKKwkuZ2FkZ2V0ID0geworCQkub3BzCQk9ICZpbXhfdWRjX29wcywKKwkJLmVwMAkJPSAmY29udHJvbGxlci5pbXhfZXBbMF0uZXAsCisJCS5uYW1lCQk9IGRyaXZlcl9uYW1lLAorCQkuZGV2ID0geworCQkJIC5idXNfaWQJPSAiZ2FkZ2V0IiwKKwkJIH0sCisJfSwKKworCS5pbXhfZXBbMF0gPSB7CisJCS5lcCA9IHsKKwkJCS5uYW1lCQk9IGVwMG5hbWUsCisJCQkub3BzCQk9ICZpbXhfZXBfb3BzLAorCQkJLm1heHBhY2tldAk9IDMyLAorCQl9LAorCQkuaW14X3VzYgkJPSAmY29udHJvbGxlciwKKwkJLmZpZm9zaXplCQk9IDMyLAorCQkuYkVuZHBvaW50QWRkcmVzcwk9IDAsCisJCS5ibUF0dHJpYnV0ZXMJCT0gVVNCX0VORFBPSU5UX1hGRVJfQ09OVFJPTCwKKwkgfSwKKwkuaW14X2VwWzFdID0geworCQkuZXAgPSB7CisJCQkubmFtZQkJPSAiZXAxaW4tYnVsayIsCisJCQkub3BzCQk9ICZpbXhfZXBfb3BzLAorCQkJLm1heHBhY2tldAk9IDY0LAorCQl9LAorCQkuaW14X3VzYgkJPSAmY29udHJvbGxlciwKKwkJLmZpZm9zaXplCQk9IDY0LAorCQkuYkVuZHBvaW50QWRkcmVzcwk9IFVTQl9ESVJfSU4gfCAxLAorCQkuYm1BdHRyaWJ1dGVzCQk9IFVTQl9FTkRQT0lOVF9YRkVSX0JVTEssCisJIH0sCisJLmlteF9lcFsyXSA9IHsKKwkJLmVwID0geworCQkJLm5hbWUJCT0gImVwMm91dC1idWxrIiwKKwkJCS5vcHMJCT0gJmlteF9lcF9vcHMsCisJCQkubWF4cGFja2V0CT0gNjQsCisJCX0sCisJCS5pbXhfdXNiCQk9ICZjb250cm9sbGVyLAorCQkuZmlmb3NpemUJCT0gNjQsCisJCS5iRW5kcG9pbnRBZGRyZXNzCT0gVVNCX0RJUl9PVVQgfCAyLAorCQkuYm1BdHRyaWJ1dGVzCQk9IFVTQl9FTkRQT0lOVF9YRkVSX0JVTEssCisJIH0sCisJLmlteF9lcFszXSA9IHsKKwkJLmVwID0geworCQkJLm5hbWUJCT0gImVwM291dC1idWxrIiwKKwkJCS5vcHMJCT0gJmlteF9lcF9vcHMsCisJCQkubWF4cGFja2V0CT0gMzIsCisJCX0sCisJCS5pbXhfdXNiCQk9ICZjb250cm9sbGVyLAorCQkuZmlmb3NpemUJCT0gMzIsCisJCS5iRW5kcG9pbnRBZGRyZXNzIAk9IFVTQl9ESVJfT1VUIHwgMywKKwkJLmJtQXR0cmlidXRlcwkJPSBVU0JfRU5EUE9JTlRfWEZFUl9CVUxLLAorCSB9LAorCS5pbXhfZXBbNF0gPSB7CisJCS5lcCA9IHsKKwkJCS5uYW1lCQk9ICJlcDRpbi1pbnQiLAorCQkJLm9wcwkJPSAmaW14X2VwX29wcywKKwkJCS5tYXhwYWNrZXQJPSAzMiwKKwkJIH0sCisJCS5pbXhfdXNiCQk9ICZjb250cm9sbGVyLAorCQkuZmlmb3NpemUJCT0gMzIsCisJCS5iRW5kcG9pbnRBZGRyZXNzIAk9IFVTQl9ESVJfSU4gfCA0LAorCQkuYm1BdHRyaWJ1dGVzCQk9IFVTQl9FTkRQT0lOVF9YRkVSX0lOVCwKKwkgfSwKKwkuaW14X2VwWzVdID0geworCQkuZXAgPSB7CisJCQkubmFtZQkJPSAiZXA1b3V0LWludCIsCisJCQkub3BzCQk9ICZpbXhfZXBfb3BzLAorCQkJLm1heHBhY2tldAk9IDMyLAorCQl9LAorCQkuaW14X3VzYgkJPSAmY29udHJvbGxlciwKKwkJLmZpZm9zaXplCQk9IDMyLAorCQkuYkVuZHBvaW50QWRkcmVzcyAJPSBVU0JfRElSX09VVCB8IDUsCisJCS5ibUF0dHJpYnV0ZXMJCT0gVVNCX0VORFBPSU5UX1hGRVJfSU5ULAorCSB9LAorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFVTQiBnYWRnZWQgZHJpdmVyIGZ1bmN0aW9ucworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworaW50IHVzYl9nYWRnZXRfcmVnaXN0ZXJfZHJpdmVyKHN0cnVjdCB1c2JfZ2FkZ2V0X2RyaXZlciAqZHJpdmVyKQoreworCXN0cnVjdCBpbXhfdWRjX3N0cnVjdCAqaW14X3VzYiA9ICZjb250cm9sbGVyOworCWludCByZXR2YWw7CisKKwlpZiAoIWRyaXZlcgorCQl8fCBkcml2ZXItPnNwZWVkIDwgVVNCX1NQRUVEX0ZVTEwKKwkJfHwgIWRyaXZlci0+YmluZAorCQl8fCAhZHJpdmVyLT5kaXNjb25uZWN0CisJCXx8ICFkcml2ZXItPnNldHVwKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKCFpbXhfdXNiKQorCQlyZXR1cm4gLUVOT0RFVjsKKwlpZiAoaW14X3VzYi0+ZHJpdmVyKQorCQlyZXR1cm4gLUVCVVNZOworCisJLyogZmlyc3QgaG9vayB1cCB0aGUgZHJpdmVyIC4uLiAqLworCWlteF91c2ItPmRyaXZlciA9IGRyaXZlcjsKKwlpbXhfdXNiLT5nYWRnZXQuZGV2LmRyaXZlciA9ICZkcml2ZXItPmRyaXZlcjsKKworCXJldHZhbCA9IGRldmljZV9hZGQoJmlteF91c2ItPmdhZGdldC5kZXYpOworCWlmIChyZXR2YWwpCisJCWdvdG8gZmFpbDsKKwlyZXR2YWwgPSBkcml2ZXItPmJpbmQoJmlteF91c2ItPmdhZGdldCk7CisJaWYgKHJldHZhbCkgeworCQlEX0VSUihpbXhfdXNiLT5kZXYsICI8JXM+IGJpbmQgdG8gZHJpdmVyICVzIC0tPiBlcnJvciAlZFxuIiwKKwkJCV9fZnVuY19fLCBkcml2ZXItPmRyaXZlci5uYW1lLCByZXR2YWwpOworCQlkZXZpY2VfZGVsKCZpbXhfdXNiLT5nYWRnZXQuZGV2KTsKKworCQlnb3RvIGZhaWw7CisJfQorCisJRF9JTkkoaW14X3VzYi0+ZGV2LCAiPCVzPiByZWdpc3RlcmVkIGdhZGdldCBkcml2ZXIgJyVzJ1xuIiwKKwkJX19mdW5jX18sIGRyaXZlci0+ZHJpdmVyLm5hbWUpOworCisJaW14X3VkY19lbmFibGUoaW14X3VzYik7CisKKwlyZXR1cm4gMDsKK2ZhaWw6CisJaW14X3VzYi0+ZHJpdmVyID0gTlVMTDsKKwlpbXhfdXNiLT5nYWRnZXQuZGV2LmRyaXZlciA9IE5VTEw7CisJcmV0dXJuIHJldHZhbDsKK30KK0VYUE9SVF9TWU1CT0wodXNiX2dhZGdldF9yZWdpc3Rlcl9kcml2ZXIpOworCitpbnQgdXNiX2dhZGdldF91bnJlZ2lzdGVyX2RyaXZlcihzdHJ1Y3QgdXNiX2dhZGdldF9kcml2ZXIgKmRyaXZlcikKK3sKKwlzdHJ1Y3QgaW14X3VkY19zdHJ1Y3QgKmlteF91c2IgPSAmY29udHJvbGxlcjsKKworCWlmICghaW14X3VzYikKKwkJcmV0dXJuIC1FTk9ERVY7CisJaWYgKCFkcml2ZXIgfHwgZHJpdmVyICE9IGlteF91c2ItPmRyaXZlciB8fCAhZHJpdmVyLT51bmJpbmQpCisJCXJldHVybiAtRUlOVkFMOworCisJdWRjX3N0b3BfYWN0aXZpdHkoaW14X3VzYiwgZHJpdmVyKTsKKwlpbXhfdWRjX2Rpc2FibGUoaW14X3VzYik7CisKKwlkcml2ZXItPnVuYmluZCgmaW14X3VzYi0+Z2FkZ2V0KTsKKwlpbXhfdXNiLT5nYWRnZXQuZGV2LmRyaXZlciA9IE5VTEw7CisJaW14X3VzYi0+ZHJpdmVyID0gTlVMTDsKKworCWRldmljZV9kZWwoJmlteF91c2ItPmdhZGdldC5kZXYpOworCisJRF9JTkkoaW14X3VzYi0+ZGV2LCAiPCVzPiB1bnJlZ2lzdGVyZWQgZ2FkZ2V0IGRyaXZlciAnJXMnXG4iLAorCQlfX2Z1bmNfXywgZHJpdmVyLT5kcml2ZXIubmFtZSk7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0wodXNiX2dhZGdldF91bnJlZ2lzdGVyX2RyaXZlcik7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBNb2R1bGUgZnVuY3Rpb25zCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKK3N0YXRpYyBpbnQgX19pbml0IGlteF91ZGNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgaW14X3VkY19zdHJ1Y3QgKmlteF91c2IgPSAmY29udHJvbGxlcjsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKwlzdHJ1Y3QgaW14dXNiX3BsYXRmb3JtX2RhdGEgKnBkYXRhOworCXN0cnVjdCBjbGsgKmNsazsKKwl2b2lkIF9faW9tZW0gKmJhc2U7CisJaW50IHJldCA9IDA7CisJaW50IGksIHJlc19zaXplOworCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlpZiAoIXJlcykgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjYW4ndCBnZXQgZGV2aWNlIHJlc291cmNlc1xuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXBkYXRhID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJaWYgKCFwZGF0YSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJkcml2ZXIgbmVlZHMgcGxhdGZvcm0gZGF0YVxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXJlc19zaXplID0gcmVzLT5lbmQgLSByZXMtPnN0YXJ0ICsgMTsKKwlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihyZXMtPnN0YXJ0LCByZXNfc2l6ZSwgcmVzLT5uYW1lKSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjYW4ndCBhbGxvY2F0ZSAlZCBieXRlcyBhdCAlZCBhZGRyZXNzXG4iLAorCQkJcmVzX3NpemUsIHJlcy0+c3RhcnQpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlpZiAocGRhdGEtPmluaXQpIHsKKwkJcmV0ID0gcGRhdGEtPmluaXQoJnBkZXYtPmRldik7CisJCWlmIChyZXQpCisJCQlnb3RvIGZhaWwwOworCX0KKworCWJhc2UgPSBpb3JlbWFwKHJlcy0+c3RhcnQsIHJlc19zaXplKTsKKwlpZiAoIWJhc2UpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiaW9yZW1hcCBmYWlsZWRcbiIpOworCQlyZXQgPSAtRUlPOworCQlnb3RvIGZhaWwxOworCX0KKworCWNsayA9IGNsa19nZXQoTlVMTCwgInVzYmRfY2xrIik7CisJaWYgKElTX0VSUihjbGspKSB7CisJCXJldCA9IFBUUl9FUlIoY2xrKTsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiY2FuJ3QgZ2V0IFVTQiBjbG9ja1xuIik7CisJCWdvdG8gZmFpbDI7CisJfQorCWNsa19lbmFibGUoY2xrKTsKKworCWlmIChjbGtfZ2V0X3JhdGUoY2xrKSAhPSA0ODAwMDAwMCkgeworCQlEX0lOSSgmcGRldi0+ZGV2LAorCQkJIkJhZCBVU0IgY2xvY2sgKCVkIEh6KSwgY2hhbmdpbmcgdG8gNDgwMDAwMDAgSHpcbiIsCisJCQkoaW50KWNsa19nZXRfcmF0ZShjbGspKTsKKwkJaWYgKGNsa19zZXRfcmF0ZShjbGssIDQ4MDAwMDAwKSkgeworCQkJZGV2X2VycigmcGRldi0+ZGV2LAorCQkJCSJVbmFibGUgdG8gc2V0IGNvcnJlY3QgVVNCIGNsb2NrICg0OE1IeilcbiIpOworCQkJcmV0ID0gLUVJTzsKKwkJCWdvdG8gZmFpbDM7CisJCX0KKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgSU1YX1VTQl9OQl9FUCArIDE7IGkrKykgeworCQlpbXhfdXNiLT51c2JkX2ludFtpXSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgaSk7CisJCWlmIChpbXhfdXNiLT51c2JkX2ludFtpXSA8IDApIHsKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwgImNhbid0IGdldCBpcnEgbnVtYmVyXG4iKTsKKwkJCXJldCA9IC1FTk9ERVY7CisJCQlnb3RvIGZhaWwzOworCQl9CisJfQorCisJZm9yIChpID0gMDsgaSA8IElNWF9VU0JfTkJfRVAgKyAxOyBpKyspIHsKKwkJcmV0ID0gcmVxdWVzdF9pcnEoaW14X3VzYi0+dXNiZF9pbnRbaV0sIGludHJfaGFuZGxlcihpKSwKKwkJCQkgICAgIElSUUZfRElTQUJMRUQsIGRyaXZlcl9uYW1lLCBpbXhfdXNiKTsKKwkJaWYgKHJldCkgeworCQkJZGV2X2VycigmcGRldi0+ZGV2LCAiY2FuJ3QgZ2V0IGlycSAlaSwgZXJyICVkXG4iLAorCQkJCWlteF91c2ItPnVzYmRfaW50W2ldLCByZXQpOworCQkJZm9yICgtLWk7IGkgPj0gMDsgaS0tKQorCQkJCWZyZWVfaXJxKGlteF91c2ItPnVzYmRfaW50W2ldLCBpbXhfdXNiKTsKKwkJCWdvdG8gZmFpbDM7CisJCX0KKwl9CisKKwlpbXhfdXNiLT5yZXMgPSByZXM7CisJaW14X3VzYi0+YmFzZSA9IGJhc2U7CisJaW14X3VzYi0+Y2xrID0gY2xrOworCWlteF91c2ItPmRldiA9ICZwZGV2LT5kZXY7CisKKwlkZXZpY2VfaW5pdGlhbGl6ZSgmaW14X3VzYi0+Z2FkZ2V0LmRldik7CisKKwlpbXhfdXNiLT5nYWRnZXQuZGV2LnBhcmVudCA9ICZwZGV2LT5kZXY7CisJaW14X3VzYi0+Z2FkZ2V0LmRldi5kbWFfbWFzayA9IHBkZXYtPmRldi5kbWFfbWFzazsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGlteF91c2IpOworCisJdXNiX2luaXRfZGF0YShpbXhfdXNiKTsKKwlpbXhfdWRjX2luaXQoaW14X3VzYik7CisKKwlyZXR1cm4gMDsKKworZmFpbDM6CisJY2xrX3B1dChjbGspOworCWNsa19kaXNhYmxlKGNsayk7CitmYWlsMjoKKwlpb3VubWFwKGJhc2UpOworZmFpbDE6CisJaWYgKHBkYXRhLT5leGl0KQorCQlwZGF0YS0+ZXhpdCgmcGRldi0+ZGV2KTsKK2ZhaWwwOgorCXJlbGVhc2VfbWVtX3JlZ2lvbihyZXMtPnN0YXJ0LCByZXNfc2l6ZSk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfX2V4aXQgaW14X3VkY19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgaW14X3VkY19zdHJ1Y3QgKmlteF91c2IgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgaW14dXNiX3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJaW50IGk7CisKKwlpbXhfdWRjX2Rpc2FibGUoaW14X3VzYik7CisKKwlmb3IgKGkgPSAwOyBpIDwgSU1YX1VTQl9OQl9FUCArIDE7IGkrKykKKwkJZnJlZV9pcnEoaW14X3VzYi0+dXNiZF9pbnRbaV0sIGlteF91c2IpOworCisJY2xrX3B1dChpbXhfdXNiLT5jbGspOworCWNsa19kaXNhYmxlKGlteF91c2ItPmNsayk7CisJaW91bm1hcChpbXhfdXNiLT5iYXNlKTsKKworCXJlbGVhc2VfbWVtX3JlZ2lvbihpbXhfdXNiLT5yZXMtPnN0YXJ0LAorCQlpbXhfdXNiLT5yZXMtPmVuZCAtIGlteF91c2ItPnJlcy0+c3RhcnQgKyAxKTsKKworCWlmIChwZGF0YS0+ZXhpdCkKKwkJcGRhdGEtPmV4aXQoJnBkZXYtPmRldik7CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKworCXJldHVybiAwOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWZkZWYJQ09ORklHX1BNCisjZGVmaW5lCWlteF91ZGNfc3VzcGVuZAlOVUxMCisjZGVmaW5lCWlteF91ZGNfcmVzdW1lCU5VTEwKKyNlbHNlCisjZGVmaW5lCWlteF91ZGNfc3VzcGVuZAlOVUxMCisjZGVmaW5lCWlteF91ZGNfcmVzdW1lCU5VTEwKKyNlbmRpZgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciB1ZGNfZHJpdmVyID0geworCS5kcml2ZXIJCT0geworCQkubmFtZQk9IGRyaXZlcl9uYW1lLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwl9LAorCS5yZW1vdmUJCT0gX19leGl0X3AoaW14X3VkY19yZW1vdmUpLAorCS5zdXNwZW5kCT0gaW14X3VkY19zdXNwZW5kLAorCS5yZXN1bWUJCT0gaW14X3VkY19yZXN1bWUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCB1ZGNfaW5pdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcHJvYmUoJnVkY19kcml2ZXIsIGlteF91ZGNfcHJvYmUpOworfQorbW9kdWxlX2luaXQodWRjX2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgdWRjX2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmdWRjX2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdCh1ZGNfZXhpdCk7CisKK01PRFVMRV9ERVNDUklQVElPTigiSU1YIFVTQiBEZXZpY2UgQ29udHJvbGxlciBkcml2ZXIiKTsKK01PRFVMRV9BVVRIT1IoIkRhcml1cyBBdWd1bGlzIDxhdWd1bGlzLmRhcml1c0BnbWFpbC5jb20+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQUxJQVMoInBsYXRmb3JtOmlteF91ZGMiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9pbXhfdWRjLmggYi9kcml2ZXJzL3VzYi9nYWRnZXQvaW14X3VkYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1MDA3NjkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvaW14X3VkYy5oCkBAIC0wLDAgKzEsMzQ0IEBACisvKgorICoJQ29weXJpZ2h0IChDKSAyMDA1IE1pa2UgTGVlKGVlbWlrZUBnbWFpbC5jb20pCisgKgorICoJVGhpcyB1ZGMgZHJpdmVyIGlzIG5vdyB1bmRlciB0ZXN0aW5nIGFuZCBjb2RlIGlzIGJhc2VkIG9uIHB4YTJ4eF91ZGMuaAorICoJUGxlYXNlIHVzZSBpdCB3aXRoIHlvdXIgb3duIHJpc2shCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqCWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKgl0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICoJKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqCWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKglNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKglHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpZm5kZWYgX19MSU5VWF9VU0JfR0FER0VUX0lNWF9ICisjZGVmaW5lIF9fTElOVVhfVVNCX0dBREdFVF9JTVhfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworLyogSGVscGVyIG1hY3JvcyAqLworI2RlZmluZSBFUF9OTyhlcCkJKChlcC0+YkVuZHBvaW50QWRkcmVzcykgJiB+VVNCX0RJUl9JTikgLyogSU46MSwgT1VUOjAgKi8KKyNkZWZpbmUgRVBfRElSKGVwKQkoKGVwLT5iRW5kcG9pbnRBZGRyZXNzKSAmIFVTQl9ESVJfSU4gPyAxIDogMCkKKyNkZWZpbmUgaXJxX3RvX2VwKGlycSkJKCgoaXJxKSA+PSBVU0JEX0lOVDApIHx8ICgoaXJxKSA8PSBVU0JEX0lOVDYpID8gKChpcnEpIC0gVVNCRF9JTlQwKSA6IChVU0JEX0lOVDYpKSAvKnNob3VsZCBub3QgaGFwcGVuKi8KKyNkZWZpbmUgZXBfdG9faXJxKGVwKQkoRVBfTk8oKGVwKSkgKyBVU0JEX0lOVDApCisjZGVmaW5lIElNWF9VU0JfTkJfRVAJNgorCisvKiBEcml2ZXIgc3RydWN0dXJlcyAqLworc3RydWN0IGlteF9yZXF1ZXN0IHsKKwlzdHJ1Y3QgdXNiX3JlcXVlc3QJCQlyZXE7CisJc3RydWN0IGxpc3RfaGVhZAkJCXF1ZXVlOworCXVuc2lnbmVkIGludAkJCQlpbl91c2U7Cit9OworCitlbnVtIGVwMF9zdGF0ZSB7CisJRVAwX0lETEUsCisJRVAwX0lOX0RBVEFfUEhBU0UsCisJRVAwX09VVF9EQVRBX1BIQVNFLAorCUVQMF9DT05GSUcsCisJRVAwX1NUQUxMLAorfTsKKworc3RydWN0IGlteF9lcF9zdHJ1Y3QgeworCXN0cnVjdCB1c2JfZXAJCQkJZXA7CisJc3RydWN0IGlteF91ZGNfc3RydWN0CQkJKmlteF91c2I7CisJc3RydWN0IGxpc3RfaGVhZAkJCXF1ZXVlOworCXVuc2lnbmVkIGNoYXIJCQkJc3RvcHBlZDsKKwl1bnNpZ25lZCBjaGFyCQkJCWZpZm9zaXplOworCXVuc2lnbmVkIGNoYXIJCQkJYkVuZHBvaW50QWRkcmVzczsKKwl1bnNpZ25lZCBjaGFyCQkJCWJtQXR0cmlidXRlczsKK307CisKK3N0cnVjdCBpbXhfdWRjX3N0cnVjdCB7CisJc3RydWN0IHVzYl9nYWRnZXQJCQlnYWRnZXQ7CisJc3RydWN0IHVzYl9nYWRnZXRfZHJpdmVyCQkqZHJpdmVyOworCXN0cnVjdCBkZXZpY2UJCQkJKmRldjsKKwlzdHJ1Y3QgaW14X2VwX3N0cnVjdAkJCWlteF9lcFtJTVhfVVNCX05CX0VQXTsKKwlzdHJ1Y3QgY2xrCQkJCSpjbGs7CisJZW51bSBlcDBfc3RhdGUJCQkJZXAwc3RhdGU7CisJc3RydWN0IHJlc291cmNlCQkJCSpyZXM7CisJdm9pZCBfX2lvbWVtCQkJCSpiYXNlOworCXVuc2lnbmVkIGNoYXIJCQkJc2V0X2NvbmZpZzsKKwlpbnQJCQkJCWNmZywKKwkJCQkJCWludGYsCisJCQkJCQlhbHQsCisJCQkJCQl1c2JkX2ludFs3XTsKK307CisKKy8qIFVTQiByZWdpc3RlcnMgKi8KKyNkZWZpbmUgIFVTQl9GUkFNRQkJKDB4MDApCS8qIFVTQiBmcmFtZSAqLworI2RlZmluZSAgVVNCX1NQRUMJCSgweDA0KQkvKiBVU0IgU3BlYyAqLworI2RlZmluZSAgVVNCX1NUQVQJCSgweDA4KQkvKiBVU0IgU3RhdHVzICovCisjZGVmaW5lICBVU0JfQ1RSTAkJKDB4MEMpCS8qIFVTQiBDb250cm9sICovCisjZGVmaW5lICBVU0JfREFEUgkJKDB4MTApCS8qIFVTQiBEZXNjIFJBTSBhZGRyICovCisjZGVmaW5lICBVU0JfRERBVAkJKDB4MTQpCS8qIFVTQiBEZXNjIFJBTS9FUCBidWZmZXIgZGF0YSAqLworI2RlZmluZSAgVVNCX0lOVFIJCSgweDE4KQkvKiBVU0IgaW50ZXJydXB0ICovCisjZGVmaW5lICBVU0JfTUFTSwkJKDB4MUMpCS8qIFVTQiBNYXNrICovCisjZGVmaW5lICBVU0JfRU5BQgkJKDB4MjQpCS8qIFVTQiBFbmFibGUgKi8KKyNkZWZpbmUgIFVTQl9FUF9TVEFUKHgpCQkoMHgzMCArICh4KjB4MzApKSAvKiBVU0Igc3RhdHVzL2NvbnRyb2wgKi8KKyNkZWZpbmUgIFVTQl9FUF9JTlRSKHgpCQkoMHgzNCArICh4KjB4MzApKSAvKiBVU0IgaW50ZXJydXB0ICovCisjZGVmaW5lICBVU0JfRVBfTUFTSyh4KQkJKDB4MzggKyAoeCoweDMwKSkgLyogVVNCIG1hc2sgKi8KKyNkZWZpbmUgIFVTQl9FUF9GREFUKHgpCQkoMHgzQyArICh4KjB4MzApKSAvKiBVU0IgRklGTyBkYXRhICovCisjZGVmaW5lICBVU0JfRVBfRkRBVDAoeCkJKDB4M0MgKyAoeCoweDMwKSkgLyogVVNCIEZJRk8gZGF0YSAqLworI2RlZmluZSAgVVNCX0VQX0ZEQVQxKHgpCSgweDNEICsgKHgqMHgzMCkpIC8qIFVTQiBGSUZPIGRhdGEgKi8KKyNkZWZpbmUgIFVTQl9FUF9GREFUMih4KQkoMHgzRSArICh4KjB4MzApKSAvKiBVU0IgRklGTyBkYXRhICovCisjZGVmaW5lICBVU0JfRVBfRkRBVDMoeCkJKDB4M0YgKyAoeCoweDMwKSkgLyogVVNCIEZJRk8gZGF0YSAqLworI2RlZmluZSAgVVNCX0VQX0ZTVEFUKHgpCSgweDQwICsgKHgqMHgzMCkpIC8qIFVTQiBGSUZPIHN0YXR1cyAqLworI2RlZmluZSAgVVNCX0VQX0ZDVFJMKHgpCSgweDQ0ICsgKHgqMHgzMCkpIC8qIFVTQiBGSUZPIGNvbnRyb2wgKi8KKyNkZWZpbmUgIFVTQl9FUF9MUkZQKHgpCQkoMHg0OCArICh4KjB4MzApKSAvKiBVU0IgbGFzdCByZWFkIGZyYW1lIHBvaW50ZXIgKi8KKyNkZWZpbmUgIFVTQl9FUF9MV0ZQKHgpCQkoMHg0QyArICh4KjB4MzApKSAvKiBVU0IgbGFzdCB3cml0ZSBmcmFtZSBwb2ludGVyICovCisjZGVmaW5lICBVU0JfRVBfRkFMUk0oeCkJKDB4NTAgKyAoeCoweDMwKSkgLyogVVNCIEZJRk8gYWxhcm0gKi8KKyNkZWZpbmUgIFVTQl9FUF9GUkRQKHgpCQkoMHg1NCArICh4KjB4MzApKSAvKiBVU0IgRklGTyByZWFkIHBvaW50ZXIgKi8KKyNkZWZpbmUgIFVTQl9FUF9GV1JQKHgpCQkoMHg1OCArICh4KjB4MzApKSAvKiBVU0IgRklGTyB3cml0ZSBwb2ludGVyICovCisvKiBVU0IgQ29udHJvbCBSZWdpc3RlciBCaXQgRmllbGRzLiovCisjZGVmaW5lIENUUkxfQ01ET1ZFUgkJKDE8PDYpCS8qIFVEQyBzdGF0dXMgKi8KKyNkZWZpbmUgQ1RSTF9DTURFUlJPUgkJKDE8PDUpCS8qIFVEQyBzdGF0dXMgKi8KKyNkZWZpbmUgQ1RSTF9GRV9FTkEJCSgxPDwzKQkvKiBFbmFibGUgRm9udCBFbmQgbG9naWMgKi8KKyNkZWZpbmUgQ1RSTF9VRENfUlNUCQkoMTw8MikJLyogVURDIHJlc2V0ICovCisjZGVmaW5lIENUUkxfQUZFX0VOQQkJKDE8PDEpCS8qIEFuYWxvZyBGb250IGVuZCBlbmFibGUgKi8KKyNkZWZpbmUgQ1RSTF9SRVNVTUUJCSgxPDwwKQkvKiBVREMgcmVzdW1lICovCisvKiBVU0IgU3RhdHVzIFJlZ2lzdGVyIEJpdCBGaWVsZHMuKi8KKyNkZWZpbmUgU1RBVF9SU1QJCSgxPDw4KQorI2RlZmluZSBTVEFUX1NVU1AJCSgxPDw3KQorI2RlZmluZSBTVEFUX0NGRwkJKDM8PDUpCisjZGVmaW5lIFNUQVRfSU5URgkJKDM8PDMpCisjZGVmaW5lIFNUQVRfQUxUU0VUCQkoNzw8MCkKKy8qIFVTQiBJbnRlcnJ1cHQgU3RhdHVzL01hc2sgUmVnaXN0ZXJzIEJpdCBmaWVsZHMgKi8KKyNkZWZpbmUgSU5UUl9XQUtFVVAJCSgxPDwzMSkJLyogV2FrZSB1cCBJbnRlcnJ1cHQgKi8KKyNkZWZpbmUgSU5UUl9NU09GCQkoMTw8NykJLyogTWlzc2VkIFN0YXJ0IG9mIEZyYW1lICovCisjZGVmaW5lIElOVFJfU09GCQkoMTw8NikJLyogU3RhcnQgb2YgRnJhbWUgKi8KKyNkZWZpbmUgSU5UUl9SRVNFVF9TVE9QCQkoMTw8NSkJLyogUmVzZXQgU2lnbmFsaW5nIHN0b3AgKi8KKyNkZWZpbmUgSU5UUl9SRVNFVF9TVEFSVAkoMTw8NCkJLyogUmVzZXQgU2lnbmFsaW5nIHN0YXJ0ICovCisjZGVmaW5lIElOVFJfUkVTVU1FCQkoMTw8MykJLyogU3VzcGVuZCB0byByZXN1bWUgKi8KKyNkZWZpbmUgSU5UUl9TVVNQRU5ECQkoMTw8MikJLyogQWN0aXZlIHRvIHN1c3BlbmQgKi8KKyNkZWZpbmUgSU5UUl9GUkFNRV9NQVRDSAkoMTw8MSkJLyogRnJhbWUgbWF0Y2hlZCAqLworI2RlZmluZSBJTlRSX0NGR19DSEcJCSgxPDwwKQkvKiBDb25maWd1cmF0aW9uIGNoYW5nZSBvY2N1cnJlZCAqLworLyogVVNCIEVuYWJsZSBSZWdpc3RlciBCaXQgRmllbGRzLiovCisjZGVmaW5lIEVOQUJfUlNUCQkoMTw8MzEpCS8qIFJlc2V0IFVTQiBtb2R1bGVzICovCisjZGVmaW5lIEVOQUJfRU5BQgkJKDE8PDMwKQkvKiBFbmFibGUgVVNCIG1vZHVsZXMqLworI2RlZmluZSBFTkFCX1NVU1BFTkQJCSgxPDwyOSkJLyogU3VzcGVuZCBVU0IgbW9kdWxlcyAqLworI2RlZmluZSBFTkFCX0VORElBTgkJKDE8PDI4KQkvKiBFbmRpYW4gb2YgVVNCIG1vZHVsZXMgKi8KKyNkZWZpbmUgRU5BQl9QV1JNRAkJKDE8PDApCS8qIFBvd2VyIG1vZGUgb2YgVVNCIG1vZHVsZXMgKi8KKy8qIFVTQiBEZXNjcmlwdG9yIFJhbSBBZGRyZXNzIFJlZ2lzdGVyIGJpdCBmaWVsZHMgKi8KKyNkZWZpbmUgREFEUl9DRkcJCSgxPDwzMSkJLyogQ29uZmlndXJhdGlvbiAqLworI2RlZmluZSBEQURSX0JTWQkJKDE8PDMwKQkvKiBCdXN5IHN0YXR1cyAqLworI2RlZmluZSBEQURSX0RBRFIJCSgweDFGRikJLyogRGVzY3JpcHRvciBSYW0gQWRkcmVzcyAqLworLyogVVNCIERlc2NyaXB0b3IgUkFNL0VuZHBvaW50IEJ1ZmZlciBEYXRhIFJlZ2lzdGVyIGJpdCBmaWVsZHMgKi8KKyNkZWZpbmUgRERBVF9EREFUCQkoMHhGRikJLyogRGVzY3JpcHRvciBFbmRwb2ludCBCdWZmZXIgKi8KKy8qIFVTQiBFbmRwb2ludCBTdGF0dXMgUmVnaXN0ZXIgYml0IGZpZWxkcyAqLworI2RlZmluZSBFUFNUQVRfQkNPVU5UCQkoMHg3Rjw8MTYpCS8qIEVuZHBvaW50IEZJRk8gYnl0ZSBjb3VudCAqLworI2RlZmluZSBFUFNUQVRfU0lQCQkoMTw8OCkJLyogRW5kcG9pbnQgc2V0dXAgaW4gcHJvZ3Jlc3MgKi8KKyNkZWZpbmUgRVBTVEFUX0RJUgkJKDE8PDcpCS8qIEVuZHBvaW50IHRyYW5zZmVyIGRpcmVjdGlvbiAqLworI2RlZmluZSBFUFNUQVRfTUFYCQkoMzw8NSkJLyogRW5kcG9pbnQgTWF4IHBhY2tldCBzaXplICovCisjZGVmaW5lIEVQU1RBVF9UWVAJCSgzPDwzKQkvKiBFbmRwb2ludCB0eXBlICovCisjZGVmaW5lIEVQU1RBVF9aTFBTCQkoMTw8MikJLyogU2VuZCB6ZXJvIGxlbmd0aCBwYWNrZXQgKi8KKyNkZWZpbmUgRVBTVEFUX0ZMVVNICQkoMTw8MSkJLyogRW5kcG9pbnQgRklGTyBGbHVzaCAqLworI2RlZmluZSBFUFNUQVRfU1RBTEwJCSgxPDwwKQkvKiBGb3JjZSBzdGFsbCAqLworLyogVVNCIEVuZHBvaW50IEZJRk8gU3RhdHVzIFJlZ2lzdGVyIGJpdCBmaWVsZHMgKi8KKyNkZWZpbmUgRlNUQVRfRlJBTUVfU1RBVAkoMHhGPDwyNCkJLyogRnJhbWUgc3RhdHVzIGJpdCBbMC0zXSAqLworI2RlZmluZSBGU1RBVF9FUlIJCSgxPDwyMikJLyogRklGTyBlcnJvciAqLworI2RlZmluZSBGU1RBVF9VRgkJKDE8PDIxKQkvKiBGSUZPIHVuZGVyZmxvdyAqLworI2RlZmluZSBGU1RBVF9PRgkJKDE8PDIwKQkvKiBGSUZPIG92ZXJmbG93ICovCisjZGVmaW5lIEZTVEFUX0ZSCQkoMTw8MTkpCS8qIEZJRk8gZnJhbWUgcmVhZHkgKi8KKyNkZWZpbmUgRlNUQVRfRlVMTAkJKDE8PDE4KQkvKiBGSUZPIGZ1bGwgKi8KKyNkZWZpbmUgRlNUQVRfQUxSTQkJKDE8PDE3KQkvKiBGSUZPIGFsYXJtICovCisjZGVmaW5lIEZTVEFUX0VNUFRZCQkoMTw8MTYpCS8qIEZJRk8gZW1wdHkgKi8KKy8qIFVTQiBFbmRwb2ludCBGSUZPIENvbnRyb2wgUmVnaXN0ZXIgYml0IGZpZWxkcyAqLworI2RlZmluZSBGQ1RSTF9XRlIJCSgxPDwyOSkJLyogV3JpdGUgZnJhbWUgZW5kICovCisvKiBVU0IgRW5kcG9pbnQgSW50ZXJydXB0IFN0YXR1cyBSZWdzaXRlciBiaXQgZmllbGRzICovCisjZGVmaW5lIEVQSU5UUl9GSUZPX0ZVTEwJKDE8PDgpCS8qIGZpZm8gZnVsbCAqLworI2RlZmluZSBFUElOVFJfRklGT19FTVBUWQkoMTw8NykJLyogZmlmbyBlbXB0eSAqLworI2RlZmluZSBFUElOVFJfRklGT19FUlJPUgkoMTw8NikJLyogZmlmbyBlcnJvciAqLworI2RlZmluZSBFUElOVFJfRklGT19ISUdICSgxPDw1KQkvKiBmaWZvIGhpZ2ggKi8KKyNkZWZpbmUgRVBJTlRSX0ZJRk9fTE9XCQkoMTw8NCkJLyogZmlmbyBsb3cgKi8KKyNkZWZpbmUgRVBJTlRSX01ERVZSRVEJCSgxPDwzKQkvKiBtdWx0aSBEZXZpY2UgcmVxdWVzdCAqLworI2RlZmluZSBFUElOVFJfRU9UCQkoMTw8MikJLyogZmlmbyBlbmQgb2YgdHJhbnNmZXIgKi8KKyNkZWZpbmUgRVBJTlRSX0RFVlJFUQkJKDE8PDEpCS8qIERldmljZSByZXF1ZXN0ICovCisjZGVmaW5lIEVQSU5UUl9FT0YJCSgxPDwwKQkvKiBmaWZvIGVuZCBvZiBmcmFtZSAqLworCisvKiBEZWJ1ZyBtYWNyb3MgKi8KKyNpZmRlZiBERUJVRworCisvKiAjZGVmaW5lIERFQlVHX1JFUSAqLworLyogI2RlZmluZSBERUJVR19UUlggKi8KKy8qICNkZWZpbmUgREVCVUdfSU5JVCAqLworLyogI2RlZmluZSBERUJVR19FUDAgKi8KKy8qICNkZWZpbmUgREVCVUdfRVBYICovCisvKiAjZGVmaW5lIERFQlVHX0lSUSAqLworLyogI2RlZmluZSBERUJVR19FUElSUSAqLworLyogI2RlZmluZSBERUJVR19EVU1QICovCisjZGVmaW5lIERFQlVHX0VSUgorCisjaWZkZWYgREVCVUdfUkVRCisJI2RlZmluZSBEX1JFUShkZXYsIGFyZ3MuLi4pCWRldl9kYmcoZGV2LCAjIyBhcmdzKQorI2Vsc2UKKwkjZGVmaW5lIERfUkVRKGRldiwgYXJncy4uLikJZG8ge30gd2hpbGUgKDApCisjZW5kaWYgLyogREVCVUdfUkVRICovCisKKyNpZmRlZiBERUJVR19UUlgKKwkjZGVmaW5lIERfVFJYKGRldiwgYXJncy4uLikJZGV2X2RiZyhkZXYsICMjIGFyZ3MpCisjZWxzZQorCSNkZWZpbmUgRF9UUlgoZGV2LCBhcmdzLi4uKQlkbyB7fSB3aGlsZSAoMCkKKyNlbmRpZiAvKiBERUJVR19UUlggKi8KKworI2lmZGVmIERFQlVHX0lOSVQKKwkjZGVmaW5lIERfSU5JKGRldiwgYXJncy4uLikJZGV2X2RiZyhkZXYsICMjIGFyZ3MpCisjZWxzZQorCSNkZWZpbmUgRF9JTkkoZGV2LCBhcmdzLi4uKQlkbyB7fSB3aGlsZSAoMCkKKyNlbmRpZiAvKiBERUJVR19JTklUICovCisKKyNpZmRlZiBERUJVR19FUDAKKwlzdGF0aWMgY29uc3QgY2hhciAqc3RhdGVfbmFtZVtdID0geworCQkiRVAwX0lETEUiLAorCQkiRVAwX0lOX0RBVEFfUEhBU0UiLAorCQkiRVAwX09VVF9EQVRBX1BIQVNFIiwKKwkJIkVQMF9DT05GSUciLAorCQkiRVAwX1NUQUxMIgorCX07CisJI2RlZmluZSBEX0VQMChkZXYsIGFyZ3MuLi4pCWRldl9kYmcoZGV2LCAjIyBhcmdzKQorI2Vsc2UKKwkjZGVmaW5lIERfRVAwKGRldiwgYXJncy4uLikJZG8ge30gd2hpbGUgKDApCisjZW5kaWYgLyogREVCVUdfRVAwICovCisKKyNpZmRlZiBERUJVR19FUFgKKwkjZGVmaW5lIERfRVBYKGRldiwgYXJncy4uLikJZGV2X2RiZyhkZXYsICMjIGFyZ3MpCisjZWxzZQorCSNkZWZpbmUgRF9FUFgoZGV2LCBhcmdzLi4uKQlkbyB7fSB3aGlsZSAoMCkKKyNlbmRpZiAvKiBERUJVR19FUDAgKi8KKworI2lmZGVmIERFQlVHX0lSUQorCXN0YXRpYyB2b2lkIGR1bXBfaW50cihjb25zdCBjaGFyICpsYWJlbCwgaW50IGlycXJlZywgc3RydWN0IGRldmljZSAqZGV2KQorCXsKKwkJZGV2X2RiZyhkZXYsICI8JXM+IFVTQl9JTlRSPVslcyVzJXMlcyVzJXMlcyVzJXNdXG4iLCBsYWJlbCwKKwkJCShpcnFyZWcgJiBJTlRSX1dBS0VVUCkgPyAiIHdha2UiIDogIiIsCisJCQkoaXJxcmVnICYgSU5UUl9NU09GKSA/ICIgbXNvZiIgOiAiIiwKKwkJCShpcnFyZWcgJiBJTlRSX1NPRikgPyAiIHNvZiIgOiAiIiwKKwkJCShpcnFyZWcgJiBJTlRSX1JFU1VNRSkgPyAiIHJlc3VtZSIgOiAiIiwKKwkJCShpcnFyZWcgJiBJTlRSX1NVU1BFTkQpID8gIiBzdXNwZW5kIiA6ICIiLAorCQkJKGlycXJlZyAmIElOVFJfUkVTRVRfU1RPUCkgPyAiIG5vcmVzZXQiIDogIiIsCisJCQkoaXJxcmVnICYgSU5UUl9SRVNFVF9TVEFSVCkgPyAiIHJlc2V0IiA6ICIiLAorCQkJKGlycXJlZyAmIElOVFJfRlJBTUVfTUFUQ0gpID8gIiBmbWF0Y2giIDogIiIsCisJCQkoaXJxcmVnICYgSU5UUl9DRkdfQ0hHKSA/ICIgY29uZmlnIiA6ICIiKTsKKwl9CisjZWxzZQorCSNkZWZpbmUgZHVtcF9pbnRyKHgsIHksIHopCQlkbyB7fSB3aGlsZSAoMCkKKyNlbmRpZiAvKiBERUJVR19JUlEgKi8KKworI2lmZGVmIERFQlVHX0VQSVJRCisJc3RhdGljIHZvaWQgZHVtcF9lcF9pbnRyKGNvbnN0IGNoYXIgKmxhYmVsLCBpbnQgbnIsIGludCBpcnFyZWcsIHN0cnVjdCBkZXZpY2UgKmRldikKKwl7CisJCWRldl9kYmcoZGV2LCAiPCVzPiBFUCVkX0lOVFI9WyVzJXMlcyVzJXMlcyVzJXMlc11cbiIsIGxhYmVsLCBuciwKKwkJCShpcnFyZWcgJiBFUElOVFJfRklGT19GVUxMKSA/ICIgZnVsbCIgOiAiIiwKKwkJCShpcnFyZWcgJiBFUElOVFJfRklGT19FTVBUWSkgPyAiIGZlbXB0eSIgOiAiIiwKKwkJCShpcnFyZWcgJiBFUElOVFJfRklGT19FUlJPUikgPyAiIGZlcnIiIDogIiIsCisJCQkoaXJxcmVnICYgRVBJTlRSX0ZJRk9fSElHSCkgPyAiIGZoaWdoIiA6ICIiLAorCQkJKGlycXJlZyAmIEVQSU5UUl9GSUZPX0xPVykgPyAiIGZsb3ciIDogIiIsCisJCQkoaXJxcmVnICYgRVBJTlRSX01ERVZSRVEpID8gIiBtcmVxIiA6ICIiLAorCQkJKGlycXJlZyAmIEVQSU5UUl9FT0YpID8gIiBlb2YiIDogIiIsCisJCQkoaXJxcmVnICYgRVBJTlRSX0RFVlJFUSkgPyAiIGRldnJlcSIgOiAiIiwKKwkJCShpcnFyZWcgJiBFUElOVFJfRU9UKSA/ICIgZW90IiA6ICIiKTsKKwl9CisjZWxzZQorCSNkZWZpbmUgZHVtcF9lcF9pbnRyKHgsIHksIHosIGkpCWRvIHt9IHdoaWxlICgwKQorI2VuZGlmIC8qIERFQlVHX0lSUSAqLworCisjaWZkZWYgREVCVUdfRFVNUAorCXN0YXRpYyB2b2lkIGR1bXBfdXNiX3N0YXQoY29uc3QgY2hhciAqbGFiZWwsIHN0cnVjdCBpbXhfdWRjX3N0cnVjdCAqaW14X3VzYikKKwl7CisJCWludCB0ZW1wID0gX19yYXdfcmVhZGwoaW14X3VzYi0+YmFzZSArIFVTQl9TVEFUKTsKKworCQlkZXZfZGJnKGlteF91c2ItPmRldiwKKwkJCSI8JXM+IFVTQl9TVEFUPVslcyVzIENGRz0lZCwgSU5URj0lZCwgQUxUUj0lZF1cbiIsIGxhYmVsLAorCQkJKHRlbXAgJiBTVEFUX1JTVCkgPyAiIHJlc2V0IiA6ICIiLAorCQkJKHRlbXAgJiBTVEFUX1NVU1ApID8gIiBzdXNwZW5kIiA6ICIiLAorCQkJKHRlbXAgJiBTVEFUX0NGRykgPj4gNSwKKwkJCSh0ZW1wICYgU1RBVF9JTlRGKSA+PiAzLAorCQkJKHRlbXAgJiBTVEFUX0FMVFNFVCkpOworCX0KKworCXN0YXRpYyB2b2lkIGR1bXBfZXBfc3RhdChjb25zdCBjaGFyICpsYWJlbCwgc3RydWN0IGlteF9lcF9zdHJ1Y3QgKmlteF9lcCkKKwl7CisJCWludCB0ZW1wID0gX19yYXdfcmVhZGwoaW14X2VwLT5pbXhfdXNiLT5iYXNlICsgVVNCX0VQX0lOVFIoRVBfTk8oaW14X2VwKSkpOworCisJCWRldl9kYmcoaW14X2VwLT5pbXhfdXNiLT5kZXYsCisJCQkiPCVzPiBFUCVkX0lOVFI9WyVzJXMlcyVzJXMlcyVzJXMlc11cbiIsIGxhYmVsLCBFUF9OTyhpbXhfZXApLAorCQkJKHRlbXAgJiBFUElOVFJfRklGT19GVUxMKSA/ICIgZnVsbCIgOiAiIiwKKwkJCSh0ZW1wICYgRVBJTlRSX0ZJRk9fRU1QVFkpID8gIiBmZW1wdHkiIDogIiIsCisJCQkodGVtcCAmIEVQSU5UUl9GSUZPX0VSUk9SKSA/ICIgZmVyciIgOiAiIiwKKwkJCSh0ZW1wICYgRVBJTlRSX0ZJRk9fSElHSCkgPyAiIGZoaWdoIiA6ICIiLAorCQkJKHRlbXAgJiBFUElOVFJfRklGT19MT1cpID8gIiBmbG93IiA6ICIiLAorCQkJKHRlbXAgJiBFUElOVFJfTURFVlJFUSkgPyAiIG1yZXEiIDogIiIsCisJCQkodGVtcCAmIEVQSU5UUl9FT0YpID8gIiBlb2YiIDogIiIsCisJCQkodGVtcCAmIEVQSU5UUl9ERVZSRVEpID8gIiBkZXZyZXEiIDogIiIsCisJCQkodGVtcCAmIEVQSU5UUl9FT1QpID8gIiBlb3QiIDogIiIpOworCisJCXRlbXAgPSBfX3Jhd19yZWFkbChpbXhfZXAtPmlteF91c2ItPmJhc2UgKyBVU0JfRVBfU1RBVChFUF9OTyhpbXhfZXApKSk7CisKKwkJZGV2X2RiZyhpbXhfZXAtPmlteF91c2ItPmRldiwKKwkJCSI8JXM+IEVQJWRfU1RBVD1bJXMlcyBiY291bnQ9JWRdXG4iLCBsYWJlbCwgRVBfTk8oaW14X2VwKSwKKwkJCSh0ZW1wICYgRVBTVEFUX1NJUCkgPyAiIHNpcCIgOiAiIiwKKwkJCSh0ZW1wICYgRVBTVEFUX1NUQUxMKSA/ICIgc3RhbGwiIDogIiIsCisJCQkodGVtcCAmIEVQU1RBVF9CQ09VTlQpID4+IDE2KTsKKworCQl0ZW1wID0gX19yYXdfcmVhZGwoaW14X2VwLT5pbXhfdXNiLT5iYXNlICsgVVNCX0VQX0ZTVEFUKEVQX05PKGlteF9lcCkpKTsKKworCQlkZXZfZGJnKGlteF9lcC0+aW14X3VzYi0+ZGV2LAorCQkJIjwlcz4gRVAlZF9GU1RBVD1bJXMlcyVzJXMlcyVzJXNdXG4iLCBsYWJlbCwgRVBfTk8oaW14X2VwKSwKKwkJCSh0ZW1wICYgRlNUQVRfRVJSKSA/ICIgZmVyciIgOiAiIiwKKwkJCSh0ZW1wICYgRlNUQVRfVUYpID8gIiBmdW5kZXIiIDogIiIsCisJCQkodGVtcCAmIEZTVEFUX09GKSA/ICIgZm92ZXIiIDogIiIsCisJCQkodGVtcCAmIEZTVEFUX0ZSKSA/ICIgZnJlYWR5IiA6ICIiLAorCQkJKHRlbXAgJiBGU1RBVF9GVUxMKSA/ICIgZmZ1bGwiIDogIiIsCisJCQkodGVtcCAmIEZTVEFUX0FMUk0pID8gIiBmYWxhcm0iIDogIiIsCisJCQkodGVtcCAmIEZTVEFUX0VNUFRZKSA/ICIgZmVtcHR5IiA6ICIiKTsKKwl9CisKKwlzdGF0aWMgdm9pZCBkdW1wX3JlcShjb25zdCBjaGFyICpsYWJlbCwgc3RydWN0IGlteF9lcF9zdHJ1Y3QgKmlteF9lcCwgc3RydWN0IHVzYl9yZXF1ZXN0ICpyZXEpCisJeworCQlpbnQgaTsKKworCQlpZiAoIXJlcSB8fCAhcmVxLT5idWYpIHsKKwkJCWRldl9kYmcoaW14X2VwLT5pbXhfdXNiLT5kZXYsICI8JXM+IHJlcSBvciByZXEgYnVmIGlzIGZyZWVcbiIsIGxhYmVsKTsKKwkJCXJldHVybjsKKwkJfQorCisJCWlmICgoIUVQX05PKGlteF9lcCkgJiYgaW14X2VwLT5pbXhfdXNiLT5lcDBzdGF0ZSA9PSBFUDBfSU5fREFUQV9QSEFTRSkKKwkJCXx8IChFUF9OTyhpbXhfZXApICYmIEVQX0RJUihpbXhfZXApKSkgeworCisJCQlkZXZfZGJnKGlteF9lcC0+aW14X3VzYi0+ZGV2LCAiPCVzPiByZXF1ZXN0IGR1bXAgPCIsIGxhYmVsKTsKKwkJCWZvciAoaSA9IDA7IGkgPCByZXEtPmxlbmd0aDsgaSsrKQorCQkJCXByaW50aygiJTAyeC0iLCAqKCh1OCAqKXJlcS0+YnVmICsgaSkpOworCQkJcHJpbnRrKCI+XG4iKTsKKwkJfQorCX0KKworI2Vsc2UKKwkjZGVmaW5lIGR1bXBfZXBfc3RhdCh4LCB5KQkJZG8ge30gd2hpbGUgKDApCisJI2RlZmluZSBkdW1wX3VzYl9zdGF0KHgsIHkpCQlkbyB7fSB3aGlsZSAoMCkKKwkjZGVmaW5lIGR1bXBfcmVxKHgsIHksIHopCQlkbyB7fSB3aGlsZSAoMCkKKyNlbmRpZiAvKiBERUJVR19EVU1QICovCisKKyNpZmRlZiBERUJVR19FUlIKKwkjZGVmaW5lIERfRVJSKGRldiwgYXJncy4uLikJZGV2X2RiZyhkZXYsICMjIGFyZ3MpCisjZWxzZQorCSNkZWZpbmUgRF9FUlIoZGV2LCBhcmdzLi4uKQlkbyB7fSB3aGlsZSAoMCkKKyNlbmRpZgorCisjZWxzZQorCSNkZWZpbmUgRF9SRVEoZGV2LCBhcmdzLi4uKQkJZG8ge30gd2hpbGUgKDApCisJI2RlZmluZSBEX1RSWChkZXYsIGFyZ3MuLi4pCQlkbyB7fSB3aGlsZSAoMCkKKwkjZGVmaW5lIERfSU5JKGRldiwgYXJncy4uLikJCWRvIHt9IHdoaWxlICgwKQorCSNkZWZpbmUgRF9FUDAoZGV2LCBhcmdzLi4uKQkJZG8ge30gd2hpbGUgKDApCisJI2RlZmluZSBEX0VQWChkZXYsIGFyZ3MuLi4pCQlkbyB7fSB3aGlsZSAoMCkKKwkjZGVmaW5lIGR1bXBfZXBfaW50cih4LCB5LCB6LCBpKQlkbyB7fSB3aGlsZSAoMCkKKwkjZGVmaW5lIGR1bXBfaW50cih4LCB5LCB6KQkJZG8ge30gd2hpbGUgKDApCisJI2RlZmluZSBkdW1wX2VwX3N0YXQoeCwgeSkJCWRvIHt9IHdoaWxlICgwKQorCSNkZWZpbmUgZHVtcF91c2Jfc3RhdCh4LCB5KQkJZG8ge30gd2hpbGUgKDApCisJI2RlZmluZSBkdW1wX3JlcSh4LCB5LCB6KQkJZG8ge30gd2hpbGUgKDApCisJI2RlZmluZSBEX0VSUihkZXYsIGFyZ3MuLi4pCQlkbyB7fSB3aGlsZSAoMCkKKyNlbmRpZiAvKiBERUJVRyAqLworCisjZW5kaWYgLyogX19MSU5VWF9VU0JfR0FER0VUX0lNWF9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvbTY2NTkyLXVkYy5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L202NjU5Mi11ZGMuYwppbmRleCAzYTg4NzllLi40M2RjZjllIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvbTY2NTkyLXVkYy5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9tNjY1OTItdWRjLmMKQEAgLTE1NDYsOCArMTU0Niw2IEBACiB7CiB9CiAKLSNkZWZpbmUgcmVzb3VyY2VfbGVuKHIpICgoKHIpLT5lbmQgLSAociktPnN0YXJ0KSArIDEpCi0KIHN0YXRpYyBpbnQgX19pbml0IG02NjU5Ml9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCXN0cnVjdCByZXNvdXJjZSAqcmVzOwpAQCAtMTU2MCwxMSArMTU1OCwxMCBAQAogCWludCByZXQgPSAwOwogCWludCBpOwogCi0JcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlX2J5bmFtZShwZGV2LCBJT1JFU09VUkNFX01FTSwKLQkJCShjaGFyICopdWRjX25hbWUpOworCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CiAJaWYgKCFyZXMpIHsKIAkJcmV0ID0gLUVOT0RFVjsKLQkJcHJfZXJyKCJwbGF0Zm9ybV9nZXRfcmVzb3VyY2VfYnluYW1lIGVycm9yLlxuIik7CisJCXByX2VycigicGxhdGZvcm1fZ2V0X3Jlc291cmNlIGVycm9yLlxuIik7CiAJCWdvdG8gY2xlYW5fdXA7CiAJfQogCkBAIC0xNTc1LDcgKzE1NzIsNyBAQAogCQlnb3RvIGNsZWFuX3VwOwogCX0KIAotCXJlZyA9IGlvcmVtYXAocmVzLT5zdGFydCwgcmVzb3VyY2VfbGVuKHJlcykpOworCXJlZyA9IGlvcmVtYXAocmVzLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShyZXMpKTsKIAlpZiAocmVnID09IE5VTEwpIHsKIAkJcmV0ID0gLUVOT01FTTsKIAkJcHJfZXJyKCJpb3JlbWFwIGVycm9yLlxuIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvbmV0MjI4MC5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L25ldDIyODAuYwppbmRleCA4YWU3MGRlLi4xMmM2ZDgzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvbmV0MjI4MC5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9uZXQyMjgwLmMKQEAgLTY2OSw3ICs2NjksNyBAQAogCiAJLyogMjI4MCBtYXkgYmUgcG9sbGluZyBWQUxJRF9CSVQgdGhyb3VnaCBlcC0+ZG1hLT5kbWFkZXNjICovCiAJd21iICgpOwotCXRkLT5kbWFjb3VudCA9IGNwdV90b19sZTMycCAoJmRtYWNvdW50KTsKKwl0ZC0+ZG1hY291bnQgPSBjcHVfdG9fbGUzMihkbWFjb3VudCk7CiB9CiAKIHN0YXRpYyBjb25zdCB1MzIgZG1hY3RsX2RlZmF1bHQgPQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L29tYXBfdWRjLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvb21hcF91ZGMuYwppbmRleCAzNGU5ZTM5Li41N2Q5NjQxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvb21hcF91ZGMuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvb21hcF91ZGMuYwpAQCAtMzAwNiw3ICszMDA2LDcgQEAKIAogY2xlYW51cDA6CiAJaWYgKHhjZWl2KQotCQlwdXRfZGV2aWNlKHhjZWl2LT5kZXYpOworCQlvdGdfcHV0X3RyYW5zY2VpdmVyKHhjZWl2KTsKIAogCWlmIChjcHVfaXNfb21hcDE2eHgoKSB8fCBjcHVfaXNfb21hcDI0eHgoKSkgewogCQljbGtfZGlzYWJsZShoaGNfY2xrKTsKQEAgLTMwMzQsNyArMzAzNCw3IEBACiAKIAlwdWxsdXBfZGlzYWJsZSh1ZGMpOwogCWlmICh1ZGMtPnRyYW5zY2VpdmVyKSB7Ci0JCXB1dF9kZXZpY2UodWRjLT50cmFuc2NlaXZlci0+ZGV2KTsKKwkJb3RnX3B1dF90cmFuc2NlaXZlcih1ZGMtPnRyYW5zY2VpdmVyKTsKIAkJdWRjLT50cmFuc2NlaXZlciA9IE5VTEw7CiAJfQogCW9tYXBfd3JpdGV3KDAsIFVEQ19TWVNDT04xKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9weGEyNXhfdWRjLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvcHhhMjV4X3VkYy5jCmluZGV4IDY5N2EwY2EuLjliMzYyMDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9weGEyNXhfdWRjLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3B4YTI1eF91ZGMuYwpAQCAtMjE5OCw3ICsyMTk4LDcgQEAKIAl1ZGNfZGlzYWJsZShkZXYpOwogCXVkY19yZWluaXQoZGV2KTsKIAotCWRldi0+dmJ1cyA9IGlzX3ZidXNfcHJlc2VudCgpOworCWRldi0+dmJ1cyA9ICEhaXNfdmJ1c19wcmVzZW50KCk7CiAKIAkvKiBpcnEgc2V0dXAgYWZ0ZXIgb2xkIGhhcmR3YXJlIHN0YXRlIGlzIGNsZWFuZWQgdXAgKi8KIAlyZXR2YWwgPSByZXF1ZXN0X2lycShpcnEsIHB4YTI1eF91ZGNfaXJxLApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L3B4YTI3eF91ZGMuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9weGEyN3hfdWRjLmMKaW5kZXggNjUxMTBkMC4uOTkwZjQwZiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L3B4YTI3eF91ZGMuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvcHhhMjd4X3VkYy5jCkBAIC00MzAsNyArNDMwLDYgQEAKIC8qKgogICogcGlvX2lycV9kaXNhYmxlIC0gRGlzYWJsZXMgaXJxIGdlbmVyYXRpb24gZm9yIG9uZSBlbmRwb2ludAogICogQGVwOiB1ZGMgZW5kcG9pbnQKLSAqIEBpbmRleDogZW5kcG9pbnQgbnVtYmVyCiAgKi8KIHN0YXRpYyB2b2lkIHBpb19pcnFfZGlzYWJsZShzdHJ1Y3QgcHhhX2VwICplcCkKIHsKQEAgLTU4Niw3ICs1ODUsNiBAQAogICogaW5jX2VwX3N0YXRzX2J5dGVzIC0gVXBkYXRlIGVwIHN0YXRzIGNvdW50cwogICogQGVwOiBwaHlzaWNhbCBlbmRwb2ludAogICogQGNvdW50OiBieXRlcyB0cmFuc2ZlcmVkIG9uIGVuZHBvaW50Ci0gKiBAcmVxOiB1c2IgcmVxdWVzdAogICogQGlzX2luOiBlcCBkaXJlY3Rpb24gKFVTQl9ESVJfSU4gb3IgMCkKICAqLwogc3RhdGljIHZvaWQgaW5jX2VwX3N0YXRzX2J5dGVzKHN0cnVjdCBweGFfZXAgKmVwLCBpbnQgY291bnQsIGludCBpc19pbikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9zM2MyNDEwX3VkYy5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3MzYzI0MTBfdWRjLmMKaW5kZXggYzdlMjU1Ni4uOWEyYjg5MiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L3MzYzI0MTBfdWRjLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3MzYzI0MTBfdWRjLmMKQEAgLTM2LDYgKzM2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAKICNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KQEAgLTUxLDcgKzUyLDYgQEAKICNpbmNsdWRlIDxtYWNoL2lycXMuaD4KIAogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KLSNpbmNsdWRlIDxtYWNoL3JlZ3MtZ3Bpby5oPgogCiAjaW5jbHVkZSA8cGxhdC9yZWdzLXVkYy5oPgogI2luY2x1ZGUgPHBsYXQvdWRjLmg+CkBAIC0xNTEwLDExICsxNTEwLDcgQEAKIAogCWRwcmludGsoREVCVUdfTk9STUFMLCAiJXMoKVxuIiwgX19mdW5jX18pOwogCi0JLyogc29tZSBjcHVzIGNhbm5vdCByZWFkIGZyb20gYW4gbGluZSBjb25maWd1cmVkIHRvIElSUSEgKi8KLQlzM2MyNDEwX2dwaW9fY2ZncGluKHVkY19pbmZvLT52YnVzX3BpbiwgUzNDMjQxMF9HUElPX0lOUFVUKTsKLQl2YWx1ZSA9IHMzYzI0MTBfZ3Bpb19nZXRwaW4odWRjX2luZm8tPnZidXNfcGluKTsKLQlzM2MyNDEwX2dwaW9fY2ZncGluKHVkY19pbmZvLT52YnVzX3BpbiwgUzNDMjQxMF9HUElPX1NGTjIpOwotCisJdmFsdWUgPSBncGlvX2dldF92YWx1ZSh1ZGNfaW5mby0+dmJ1c19waW4pID8gMSA6IDA7CiAJaWYgKHVkY19pbmZvLT52YnVzX3Bpbl9pbnZlcnRlZCkKIAkJdmFsdWUgPSAhdmFsdWU7CiAKQEAgLTE4MDIsNyArMTc5OCw3IEBACiAJc3RydWN0IHMzYzI0MTBfdWRjICp1ZGMgPSAmbWVtb3J5OwogCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwZGV2LT5kZXY7CiAJaW50IHJldHZhbDsKLQl1bnNpZ25lZCBpbnQgaXJxOworCWludCBpcnE7CiAKIAlkZXZfZGJnKGRldiwgIiVzKClcbiIsIF9fZnVuY19fKTsKIApAQCAtMTg2MSw3ICsxODU3LDcgQEAKIAogCS8qIGlycSBzZXR1cCBhZnRlciBvbGQgaGFyZHdhcmUgc3RhdGUgaXMgY2xlYW5lZCB1cCAqLwogCXJldHZhbCA9IHJlcXVlc3RfaXJxKElSUV9VU0JELCBzM2MyNDEwX3VkY19pcnEsCi0JCQlJUlFGX0RJU0FCTEVELCBnYWRnZXRfbmFtZSwgdWRjKTsKKwkJCSAgICAgSVJRRl9ESVNBQkxFRCwgZ2FkZ2V0X25hbWUsIHVkYyk7CiAKIAlpZiAocmV0dmFsICE9IDApIHsKIAkJZGV2X2VycihkZXYsICJjYW5ub3QgZ2V0IGlycSAlaSwgZXJyICVkXG4iLCBJUlFfVVNCRCwgcmV0dmFsKTsKQEAgLTE4NzIsMTcgKzE4NjgsMjggQEAKIAlkZXZfZGJnKGRldiwgImdvdCBpcnEgJWlcbiIsIElSUV9VU0JEKTsKIAogCWlmICh1ZGNfaW5mbyAmJiB1ZGNfaW5mby0+dmJ1c19waW4gPiAwKSB7Ci0JCWlycSA9IHMzYzI0MTBfZ3Bpb19nZXRpcnEodWRjX2luZm8tPnZidXNfcGluKTsKKwkJcmV0dmFsID0gZ3Bpb19yZXF1ZXN0KHVkY19pbmZvLT52YnVzX3BpbiwgInVkYyB2YnVzIik7CisJCWlmIChyZXR2YWwgPCAwKSB7CisJCQlkZXZfZXJyKGRldiwgImNhbm5vdCBjbGFpbSB2YnVzIHBpblxuIik7CisJCQlnb3RvIGVycl9pbnQ7CisJCX0KKworCQlpcnEgPSBncGlvX3RvX2lycSh1ZGNfaW5mby0+dmJ1c19waW4pOworCQlpZiAoaXJxIDwgMCkgeworCQkJZGV2X2VycihkZXYsICJubyBpcnEgZm9yIGdwaW8gdmJ1cyBwaW5cbiIpOworCQkJZ290byBlcnJfZ3Bpb19jbGFpbTsKKwkJfQorCiAJCXJldHZhbCA9IHJlcXVlc3RfaXJxKGlycSwgczNjMjQxMF91ZGNfdmJ1c19pcnEsCiAJCQkJICAgICBJUlFGX0RJU0FCTEVEIHwgSVJRRl9UUklHR0VSX1JJU0lORwogCQkJCSAgICAgfCBJUlFGX1RSSUdHRVJfRkFMTElORyB8IElSUUZfU0hBUkVELAogCQkJCSAgICAgZ2FkZ2V0X25hbWUsIHVkYyk7CiAKIAkJaWYgKHJldHZhbCAhPSAwKSB7Ci0JCQlkZXZfZXJyKGRldiwgImNhbid0IGdldCB2YnVzIGlycSAlaSwgZXJyICVkXG4iLAorCQkJZGV2X2VycihkZXYsICJjYW4ndCBnZXQgdmJ1cyBpcnEgJWQsIGVyciAlZFxuIiwKIAkJCQlpcnEsIHJldHZhbCk7CiAJCQlyZXR2YWwgPSAtRUJVU1k7Ci0JCQlnb3RvIGVycl9pbnQ7CisJCQlnb3RvIGVycl9ncGlvX2NsYWltOwogCQl9CiAKIAkJZGV2X2RiZyhkZXYsICJnb3QgaXJxICVpXG4iLCBpcnEpOwpAQCAtMTkwMiw2ICsxOTA5LDkgQEAKIAogCXJldHVybiAwOwogCitlcnJfZ3Bpb19jbGFpbToKKwlpZiAodWRjX2luZm8gJiYgdWRjX2luZm8tPnZidXNfcGluID4gMCkKKwkJZ3Bpb19mcmVlKHVkY19pbmZvLT52YnVzX3Bpbik7CiBlcnJfaW50OgogCWZyZWVfaXJxKElSUV9VU0JELCB1ZGMpOwogZXJyX21hcDoKQEAgLTE5MjcsNyArMTkzNyw3IEBACiAJZGVidWdmc19yZW1vdmUodWRjLT5yZWdzX2luZm8pOwogCiAJaWYgKHVkY19pbmZvICYmIHVkY19pbmZvLT52YnVzX3BpbiA+IDApIHsKLQkJaXJxID0gczNjMjQxMF9ncGlvX2dldGlycSh1ZGNfaW5mby0+dmJ1c19waW4pOworCQlpcnEgPSBncGlvX3RvX2lycSh1ZGNfaW5mby0+dmJ1c19waW4pOwogCQlmcmVlX2lycShpcnEsIHVkYyk7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvdV9ldGhlci5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3VfZXRoZXIuYwppbmRleCBkOTczOWQ1Li45NmQ2NWNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvdV9ldGhlci5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC91X2V0aGVyLmMKQEAgLTcxNiw2ICs3MTYsMTQgQEAKIAogc3RhdGljIHN0cnVjdCBldGhfZGV2ICp0aGVfZGV2OwogCitzdGF0aWMgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzIGV0aF9uZXRkZXZfb3BzID0geworCS5uZG9fb3BlbgkJPSBldGhfb3BlbiwKKwkubmRvX3N0b3AJCT0gZXRoX3N0b3AsCisJLm5kb19zdGFydF94bWl0CQk9IGV0aF9zdGFydF94bWl0LAorCS5uZG9fY2hhbmdlX210dQkJPSB1ZXRoX2NoYW5nZV9tdHUsCisJLm5kb19zZXRfbWFjX2FkZHJlc3MgCT0gZXRoX21hY19hZGRyLAorCS5uZG9fdmFsaWRhdGVfYWRkcgk9IGV0aF92YWxpZGF0ZV9hZGRyLAorfTsKIAogLyoqCiAgKiBnZXRoZXJfc2V0dXAgLSBpbml0aWFsaXplIG9uZSBldGhlcm5ldC1vdmVyLXVzYiBsaW5rCkBAIC03NjQsMTIgKzc3Miw4IEBACiAJaWYgKGV0aGFkZHIpCiAJCW1lbWNweShldGhhZGRyLCBkZXYtPmhvc3RfbWFjLCBFVEhfQUxFTik7CiAKLQluZXQtPmNoYW5nZV9tdHUgPSB1ZXRoX2NoYW5nZV9tdHU7Ci0JbmV0LT5oYXJkX3N0YXJ0X3htaXQgPSBldGhfc3RhcnRfeG1pdDsKLQluZXQtPm9wZW4gPSBldGhfb3BlbjsKLQluZXQtPnN0b3AgPSBldGhfc3RvcDsKLQkvKiB3YXRjaGRvZ190aW1lbywgdHhfdGltZW91dCAuLi4gKi8KLQkvKiBzZXRfbXVsdGljYXN0X2xpc3QgKi8KKwluZXQtPm5ldGRldl9vcHMgPSAmZXRoX25ldGRldl9vcHM7CisKIAlTRVRfRVRIVE9PTF9PUFMobmV0LCAmb3BzKTsKIAogCS8qIHR3byBraW5kcyBvZiBob3N0LWluaXRpYXRlZCBzdGF0ZSBjaGFuZ2VzOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9LY29uZmlnIGIvZHJpdmVycy91c2IvaG9zdC9LY29uZmlnCmluZGV4IGYzYTc1YTkuLjJiNDc2YjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3QvS2NvbmZpZworKysgYi9kcml2ZXJzL3VzYi9ob3N0L0tjb25maWcKQEAgLTk2LDYgKzk2LDE5IEBACiAJICBFbmFibGVzIHN1cHBvcnQgZm9yIHRoZSBVU0IgY29udHJvbGxlciBwcmVzZW50IG9uIHRoZSBQb3dlclBDCiAJICBPcGVuRmlybXdhcmUgcGxhdGZvcm0gYnVzLgogCitjb25maWcgVVNCX09YVTIxMEhQX0hDRAorCXRyaXN0YXRlICJPWFUyMTBIUCBIQ0Qgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFVTQgorCS0tLWhlbHAtLS0KKwkgIFRoZSBPWFUyMTBIUCBpcyBhbiBVU0IgaG9zdC9PVEcvZGV2aWNlIGNvbnRyb2xsZXIuIEVuYWJsZSB0aGlzCisJICBvcHRpb24gaWYgeW91ciBib2FyZCBoYXMgdGhpcyBjaGlwLiBJZiB1bnN1cmUsIHNheSBOLgorCisJICBUaGlzIGRyaXZlciBkb2VzIG5vdCBzdXBwb3J0IGlzb2Nocm9ub3VzIHRyYW5zZmVycyBhbmQgZG9lc24ndAorCSAgaW1wbGVtZW50IE9URyBub3IgVVNCIGRldmljZSBjb250cm9sbGVycy4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgb3h1MjEwaHAtaGNkLgorCiBjb25maWcgVVNCX0lTUDExNlhfSENECiAJdHJpc3RhdGUgIklTUDExNlggSENEIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBVU0IKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3QvTWFrZWZpbGUgYi9kcml2ZXJzL3VzYi9ob3N0L01ha2VmaWxlCmluZGV4IDIzYmUyMjIuLmU1ZjNmMjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3QvTWFrZWZpbGUKKysrIGIvZHJpdmVycy91c2IvaG9zdC9NYWtlZmlsZQpAQCAtMTMsNiArMTMsNyBAQAogb2JqLSQoQ09ORklHX1BDSSkJCSs9IHBjaS1xdWlya3MubwogCiBvYmotJChDT05GSUdfVVNCX0VIQ0lfSENEKQkrPSBlaGNpLWhjZC5vCitvYmotJChDT05GSUdfVVNCX09YVTIxMEhQX0hDRCkJKz0gb3h1MjEwaHAtaGNkLm8KIG9iai0kKENPTkZJR19VU0JfSVNQMTE2WF9IQ0QpCSs9IGlzcDExNngtaGNkLm8KIG9iai0kKENPTkZJR19VU0JfT0hDSV9IQ0QpCSs9IG9oY2ktaGNkLm8KIG9iai0kKENPTkZJR19VU0JfVUhDSV9IQ0QpCSs9IHVoY2ktaGNkLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1kYmcuYyBiL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1kYmcuYwppbmRleCAwY2I1M2NhLi43ZjRhY2U3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktZGJnLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC9laGNpLWRiZy5jCkBAIC00NTUsOSArNDU1LDcgQEAKIAkJCQkoc2NyYXRjaCA+PiAxNikgJiAweDdmZmYsCiAJCQkJc2NyYXRjaCwKIAkJCQl0ZC0+dXJiKTsKLQkJaWYgKHRlbXAgPCAwKQotCQkJdGVtcCA9IDA7Ci0JCWVsc2UgaWYgKHNpemUgPCB0ZW1wKQorCQlpZiAoc2l6ZSA8IHRlbXApCiAJCQl0ZW1wID0gc2l6ZTsKIAkJc2l6ZSAtPSB0ZW1wOwogCQluZXh0ICs9IHRlbXA7CkBAIC00NjYsOSArNDY0LDcgQEAKIAl9CiAKIAl0ZW1wID0gc25wcmludGYgKG5leHQsIHNpemUsICJcbiIpOwotCWlmICh0ZW1wIDwgMCkKLQkJdGVtcCA9IDA7Ci0JZWxzZSBpZiAoc2l6ZSA8IHRlbXApCisJaWYgKHNpemUgPCB0ZW1wKQogCQl0ZW1wID0gc2l6ZTsKIAlzaXplIC09IHRlbXA7CiAJbmV4dCArPSB0ZW1wOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9laGNpLWh1Yi5jIGIvZHJpdmVycy91c2IvaG9zdC9laGNpLWh1Yi5jCmluZGV4IDIxOGY5NjYuLjk3YTUzYTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1odWIuYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktaHViLmMKQEAgLTE5NCw2ICsxOTQsNyBAQAogCXUzMgkJCXRlbXA7CiAJdTMyCQkJcG93ZXJfb2theTsKIAlpbnQJCQlpOworCXU4CQkJcmVzdW1lX25lZWRlZCA9IDA7CiAKIAlpZiAodGltZV9iZWZvcmUgKGppZmZpZXMsIGVoY2ktPm5leHRfc3RhdGVjaGFuZ2UpKQogCQltc2xlZXAoNSk7CkBAIC0yMjgsNyArMjI5LDkgQEAKIAogCS8qIFNvbWUgY29udHJvbGxlci9maXJtd2FyZSBjb21iaW5hdGlvbnMgbmVlZCBhIGRlbGF5IGR1cmluZyB3aGljaAogCSAqIHRoZXkgc2V0IHVwIHRoZSBwb3J0IHN0YXR1c2VzLiAgU2VlIEJ1Z3ppbGxhICM4MTkwLiAqLwotCW1kZWxheSg4KTsKKwlzcGluX3VubG9ja19pcnEoJmVoY2ktPmxvY2spOworCW1zbGVlcCg4KTsKKwlzcGluX2xvY2tfaXJxKCZlaGNpLT5sb2NrKTsKIAogCS8qIG1hbnVhbGx5IHJlc3VtZSB0aGUgcG9ydHMgd2Ugc3VzcGVuZGVkIGR1cmluZyBidXNfc3VzcGVuZCgpICovCiAJaSA9IEhDU19OX1BPUlRTIChlaGNpLT5oY3NfcGFyYW1zKTsKQEAgLTIzNiwxMiArMjM5LDIxIEBACiAJCXRlbXAgPSBlaGNpX3JlYWRsKGVoY2ksICZlaGNpLT5yZWdzLT5wb3J0X3N0YXR1cyBbaV0pOwogCQl0ZW1wICY9IH4oUE9SVF9SV0NfQklUUyB8IFBPUlRfV0FLRV9CSVRTKTsKIAkJaWYgKHRlc3RfYml0KGksICZlaGNpLT5idXNfc3VzcGVuZGVkKSAmJgotCQkJCSh0ZW1wICYgUE9SVF9TVVNQRU5EKSkKKwkJCQkodGVtcCAmIFBPUlRfU1VTUEVORCkpIHsKIAkJCXRlbXAgfD0gUE9SVF9SRVNVTUU7CisJCQlyZXN1bWVfbmVlZGVkID0gMTsKKwkJfQogCQllaGNpX3dyaXRlbChlaGNpLCB0ZW1wLCAmZWhjaS0+cmVncy0+cG9ydF9zdGF0dXMgW2ldKTsKIAl9CisKKwkvKiBtc2xlZXAgZm9yIDIwbXMgb25seSBpZiBjb2RlIGlzIHRyeWluZyB0byByZXN1bWUgcG9ydCAqLworCWlmIChyZXN1bWVfbmVlZGVkKSB7CisJCXNwaW5fdW5sb2NrX2lycSgmZWhjaS0+bG9jayk7CisJCW1zbGVlcCgyMCk7CisJCXNwaW5fbG9ja19pcnEoJmVoY2ktPmxvY2spOworCX0KKwogCWkgPSBIQ1NfTl9QT1JUUyAoZWhjaS0+aGNzX3BhcmFtcyk7Ci0JbWRlbGF5ICgyMCk7CiAJd2hpbGUgKGktLSkgewogCQl0ZW1wID0gZWhjaV9yZWFkbChlaGNpLCAmZWhjaS0+cmVncy0+cG9ydF9zdGF0dXMgW2ldKTsKIAkJaWYgKHRlc3RfYml0KGksICZlaGNpLT5idXNfc3VzcGVuZGVkKSAmJgpAQCAtNDIyLDggKzQzNCwxNSBAQAogCQlwb3J0X3N0YXR1cyAmPSB+UE9SVF9SV0NfQklUUzsKIAkJZWhjaV93cml0ZWwoZWhjaSwgcG9ydF9zdGF0dXMsIHN0YXR1c19yZWcpOwogCi0JfSBlbHNlCisJCS8qIGVuc3VyZSA0NDBFUFggb2hjaSBjb250cm9sbGVyIHN0YXRlIGlzIG9wZXJhdGlvbmFsICovCisJCWlmIChlaGNpLT5oYXNfYW1jY191c2IyMykKKwkJCXNldF9vaGNpX2hjZnMoZWhjaSwgMSk7CisJfSBlbHNlIHsKIAkJZWhjaV9kYmcgKGVoY2ksICJwb3J0ICVkIGhpZ2ggc3BlZWRcbiIsIGluZGV4ICsgMSk7CisJCS8qIGVuc3VyZSA0NDBFUHggb2hjaSBjb250cm9sbGVyIHN0YXRlIGlzIHN1c3BlbmRlZCAqLworCQlpZiAoZWhjaS0+aGFzX2FtY2NfdXNiMjMpCisJCQlzZXRfb2hjaV9oY2ZzKGVoY2ksIDApOworCX0KIAogCXJldHVybiBwb3J0X3N0YXR1czsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1wY2kuYyBiL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1wY2kuYwppbmRleCAzNjg2NGY5Li5iZGM2ZTg2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktcGNpLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC9laGNpLXBjaS5jCkBAIC0yMTksMTUgKzIxOSwxOSBAQAogCS8qIFNlcmlhbCBCdXMgUmVsZWFzZSBOdW1iZXIgaXMgYXQgUENJIDB4NjAgb2Zmc2V0ICovCiAJcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgMHg2MCwgJmVoY2ktPnNicm4pOwogCi0JLyogV29ya2Fyb3VuZCBjdXJyZW50IFBDSSBpbml0IGdsaXRjaDogIHdha2V1cCBiaXRzIGFyZW4ndAotCSAqIGJlaW5nIHNldCBmcm9tIFBDSSBQTSBjYXBhYmlsaXR5LgorCS8qIEtlZXAgdGhpcyBhcm91bmQgZm9yIGEgd2hpbGUganVzdCBpbiBjYXNlIHNvbWUgRUhDSQorCSAqIGltcGxlbWVudGF0aW9uIHVzZXMgbGVnYWN5IFBDSSBQTSBzdXBwb3J0LiAgVGhpcyB0ZXN0CisJICogY2FuIGJlIHJlbW92ZWQgb24gMTcgRGVjIDIwMDkgaWYgdGhlIGRldl93YXJuKCkgaGFzbid0CisJICogYmVlbiB0cmlnZ2VyZWQgYnkgdGhlbi4KIAkgKi8KIAlpZiAoIWRldmljZV9jYW5fd2FrZXVwKCZwZGV2LT5kZXYpKSB7CiAJCXUxNglwb3J0X3dha2U7CiAKIAkJcGNpX3JlYWRfY29uZmlnX3dvcmQocGRldiwgMHg2MiwgJnBvcnRfd2FrZSk7Ci0JCWlmIChwb3J0X3dha2UgJiAweDAwMDEpCisJCWlmIChwb3J0X3dha2UgJiAweDAwMDEpIHsKKwkJCWRldl93YXJuKCZwZGV2LT5kZXYsICJFbmFibGluZyBsZWdhY3kgUENJIFBNXG4iKTsKIAkJCWRldmljZV9pbml0X3dha2V1cCgmcGRldi0+ZGV2LCAxKTsKKwkJfQogCX0KIAogI2lmZGVmCUNPTkZJR19VU0JfU1VTUEVORApAQCAtNDI4LDYgKzQzMiw4IEBACiAKICNpZmRlZglDT05GSUdfUE0KIAkuc3VzcGVuZCA9CXVzYl9oY2RfcGNpX3N1c3BlbmQsCisJLnN1c3BlbmRfbGF0ZSA9CXVzYl9oY2RfcGNpX3N1c3BlbmRfbGF0ZSwKKwkucmVzdW1lX2Vhcmx5ID0JdXNiX2hjZF9wY2lfcmVzdW1lX2Vhcmx5LAogCS5yZXN1bWUgPQl1c2JfaGNkX3BjaV9yZXN1bWUsCiAjZW5kaWYKIAkuc2h1dGRvd24gPSAJdXNiX2hjZF9wY2lfc2h1dGRvd24sCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktcHBjLW9mLmMgYi9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktcHBjLW9mLmMKaW5kZXggYjAxOGRlZS4uZWY3MzJiNyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC9laGNpLXBwYy1vZi5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1wcGMtb2YuYwpAQCAtMTA3LDExICsxMDcsMTMgQEAKIHsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRuID0gb3AtPm5vZGU7CiAJc3RydWN0IHVzYl9oY2QgKmhjZDsKLQlzdHJ1Y3QgZWhjaV9oY2QJKmVoY2k7CisJc3RydWN0IGVoY2lfaGNkCSplaGNpID0gTlVMTDsKIAlzdHJ1Y3QgcmVzb3VyY2UgcmVzOwogCWludCBpcnE7CiAJaW50IHJ2OwogCisJc3RydWN0IGRldmljZV9ub2RlICpucDsKKwogCWlmICh1c2JfZGlzYWJsZWQoKSkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKQEAgLTE0OSw2ICsxNTEsMjAgQEAKIAl9CiAKIAllaGNpID0gaGNkX3RvX2VoY2koaGNkKTsKKwlucCA9IG9mX2ZpbmRfY29tcGF0aWJsZV9ub2RlKE5VTEwsIE5VTEwsICJpYm0sdXNiLW9oY2ktNDQwZXB4Iik7CisJaWYgKG5wICE9IE5VTEwpIHsKKwkJLyogY2xhaW0gd2UgcmVhbGx5IGFmZmVjdGVkIGJ5IHVzYjIzIGVycmF0dW0gKi8KKwkJaWYgKCFvZl9hZGRyZXNzX3RvX3Jlc291cmNlKG5wLCAwLCAmcmVzKSkKKwkJCWVoY2ktPm9oY2lfaGNjdHJsX3JlZyA9IGlvcmVtYXAocmVzLnN0YXJ0ICsKKwkJCQkJT0hDSV9IQ0NUUkxfT0ZGU0VULCBPSENJX0hDQ1RSTF9MRU4pOworCQllbHNlCisJCQlwcl9kZWJ1ZyhfX0ZJTEVfXyAiOiBubyBvaGNpIG9mZnNldCBpbiBmZHRcbiIpOworCQlpZiAoIWVoY2ktPm9oY2lfaGNjdHJsX3JlZykgeworCQkJcHJfZGVidWcoX19GSUxFX18gIjogaW9yZW1hcCBmb3Igb2hjaSBoY2N0cmwgZmFpbGVkXG4iKTsKKwkJfSBlbHNlIHsKKwkJCWVoY2ktPmhhc19hbWNjX3VzYjIzID0gMTsKKwkJfQorCX0KIAogCWlmIChvZl9nZXRfcHJvcGVydHkoZG4sICJiaWctZW5kaWFuIiwgTlVMTCkpIHsKIAkJZWhjaS0+YmlnX2VuZGlhbl9tbWlvID0gMTsKQEAgLTE4MSw2ICsxOTcsOSBAQAogCWlycV9kaXNwb3NlX21hcHBpbmcoaXJxKTsKIGVycl9pcnE6CiAJcmVsZWFzZV9tZW1fcmVnaW9uKGhjZC0+cnNyY19zdGFydCwgaGNkLT5yc3JjX2xlbik7CisKKwlpZiAoZWhjaS0+aGFzX2FtY2NfdXNiMjMpCisJCWlvdW5tYXAoZWhjaS0+b2hjaV9oY2N0cmxfcmVnKTsKIGVycl9ybXI6CiAJdXNiX3B1dF9oY2QoaGNkKTsKIApAQCAtMTkxLDYgKzIxMCwxMSBAQAogc3RhdGljIGludCBlaGNpX2hjZF9wcGNfb2ZfcmVtb3ZlKHN0cnVjdCBvZl9kZXZpY2UgKm9wKQogewogCXN0cnVjdCB1c2JfaGNkICpoY2QgPSBkZXZfZ2V0X2RydmRhdGEoJm9wLT5kZXYpOworCXN0cnVjdCBlaGNpX2hjZCAqZWhjaSA9IGhjZF90b19laGNpKGhjZCk7CisKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOworCXN0cnVjdCByZXNvdXJjZSByZXM7CisKIAlkZXZfc2V0X2RydmRhdGEoJm9wLT5kZXYsIE5VTEwpOwogCiAJZGV2X2RiZygmb3AtPmRldiwgInN0b3BwaW5nIFBQQy1PRiBVU0IgQ29udHJvbGxlclxuIik7CkBAIC0yMDEsNiArMjI1LDI1IEBACiAJaXJxX2Rpc3Bvc2VfbWFwcGluZyhoY2QtPmlycSk7CiAJcmVsZWFzZV9tZW1fcmVnaW9uKGhjZC0+cnNyY19zdGFydCwgaGNkLT5yc3JjX2xlbik7CiAKKwkvKiB1c2UgcmVxdWVzdF9tZW1fcmVnaW9uIHRvIHRlc3QgaWYgdGhlIG9oY2kgZHJpdmVyIGlzIGxvYWRlZC4gIGlmIHNvCisJICogZW5zdXJlIHRoZSBvaGNpIGNvcmUgaXMgb3BlcmF0aW9uYWwuCisJICovCisJaWYgKGVoY2ktPmhhc19hbWNjX3VzYjIzKSB7CisJCW5wID0gb2ZfZmluZF9jb21wYXRpYmxlX25vZGUoTlVMTCwgTlVMTCwgImlibSx1c2Itb2hjaS00NDBlcHgiKTsKKwkJaWYgKG5wICE9IE5VTEwpIHsKKwkJCWlmICghb2ZfYWRkcmVzc190b19yZXNvdXJjZShucCwgMCwgJnJlcykpCisJCQkJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24ocmVzLnN0YXJ0LAorCQkJCQkJCSAgICAweDQsIGhjZF9uYW1lKSkKKwkJCQkJc2V0X29oY2lfaGNmcyhlaGNpLCAxKTsKKwkJCQllbHNlCisJCQkJCXJlbGVhc2VfbWVtX3JlZ2lvbihyZXMuc3RhcnQsIDB4NCk7CisJCQllbHNlCisJCQkJcHJfZGVidWcoX19GSUxFX18gIjogbm8gb2hjaSBvZmZzZXQgaW4gZmR0XG4iKTsKKwkJCW9mX25vZGVfcHV0KG5wKTsKKwkJfQorCisJCWlvdW5tYXAoZWhjaS0+b2hjaV9oY2N0cmxfcmVnKTsKKwl9CiAJdXNiX3B1dF9oY2QoaGNkKTsKIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9laGNpLmggYi9kcml2ZXJzL3VzYi9ob3N0L2VoY2kuaAppbmRleCBjN2Q0YjVhLi5mYjcwNTRjYyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC9laGNpLmgKKysrIGIvZHJpdmVycy91c2IvaG9zdC9laGNpLmgKQEAgLTEyMCw2ICsxMjAsMTYgQEAKIAl1bnNpZ25lZAkJaGFzX2ZzbF9wb3J0X2J1ZzoxOyAvKiBGcmVlU2NhbGUgKi8KIAl1bnNpZ25lZAkJYmlnX2VuZGlhbl9tbWlvOjE7CiAJdW5zaWduZWQJCWJpZ19lbmRpYW5fZGVzYzoxOworCXVuc2lnbmVkCQloYXNfYW1jY191c2IyMzoxOworCisJLyogcmVxdWlyZWQgZm9yIHVzYjMyIHF1aXJrICovCisJI2RlZmluZSBPSENJX0NUUkxfSENGUyAgICAgICAgICAoMyA8PCA2KQorCSNkZWZpbmUgT0hDSV9VU0JfT1BFUiAgICAgICAgICAgKDIgPDwgNikKKwkjZGVmaW5lIE9IQ0lfVVNCX1NVU1BFTkQgICAgICAgICgzIDw8IDYpCisKKwkjZGVmaW5lIE9IQ0lfSENDVFJMX09GRlNFVCAgICAgIDB4NAorCSNkZWZpbmUgT0hDSV9IQ0NUUkxfTEVOICAgICAgICAgMHg0CisJX19oYzMyCQkJKm9oY2lfaGNjdHJsX3JlZzsKIAogCXU4CQkJc2JybjsJCS8qIHBhY2tlZCByZWxlYXNlIG51bWJlciAqLwogCkBAIC02MzYsNiArNjQ2LDMwIEBACiAjZW5kaWYKIH0KIAorLyoKKyAqIE9uIGNlcnRhaW4gcHBjLTQ0eCBTb0MgdGhlcmUgaXMgYSBIVyBpc3N1ZSwgdGhhdCBjb3VsZCBvbmx5IHdvcmtlZCBhcm91bmQgd2l0aAorICogZXhwbGljaXQgc3VzcGVuZC9vcGVyYXRlIG9mIE9IQ0kuIFRoaXMgZnVuY3Rpb24gaGVyZWJ5IG1ha2VzIHNlbnNlIG9ubHkgb24gdGhhdCBhcmNoLgorICogT3RoZXIgY29tbW9uIGJpdHMgYXJlIGRlcGVuZGFudCBvbiBoYXNfYW1jY191c2IyMyBxdWlyayBmbGFnLgorICovCisjaWZkZWYgQ09ORklHXzQ0eAorc3RhdGljIGlubGluZSB2b2lkIHNldF9vaGNpX2hjZnMoc3RydWN0IGVoY2lfaGNkICplaGNpLCBpbnQgb3BlcmF0aW9uYWwpCit7CisJdTMyIGhjX2NvbnRyb2w7CisKKwloY19jb250cm9sID0gKHJlYWRsX2JlKGVoY2ktPm9oY2lfaGNjdHJsX3JlZykgJiB+T0hDSV9DVFJMX0hDRlMpOworCWlmIChvcGVyYXRpb25hbCkKKwkJaGNfY29udHJvbCB8PSBPSENJX1VTQl9PUEVSOworCWVsc2UKKwkJaGNfY29udHJvbCB8PSBPSENJX1VTQl9TVVNQRU5EOworCisJd3JpdGVsX2JlKGhjX2NvbnRyb2wsIGVoY2ktPm9oY2lfaGNjdHJsX3JlZyk7CisJKHZvaWQpIHJlYWRsX2JlKGVoY2ktPm9oY2lfaGNjdHJsX3JlZyk7Cit9CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIHNldF9vaGNpX2hjZnMoc3RydWN0IGVoY2lfaGNkICplaGNpLCBpbnQgb3BlcmF0aW9uYWwpCit7IH0KKyNlbmRpZgorCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCiAvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9pc3AxNzYwLWhjZC5jIGIvZHJpdmVycy91c2IvaG9zdC9pc3AxNzYwLWhjZC5jCmluZGV4IDgwMTdmMWMuLmI4OTlmMWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3QvaXNwMTc2MC1oY2QuYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L2lzcDE3NjAtaGNkLmMKQEAgLTQzNSwxNCArNDM1LDEzIEBACiAKIAkvKgogCSAqIFBPUlQgMSBDb250cm9sIHJlZ2lzdGVyIG9mIHRoZSBJU1AxNzYwIGlzIHRoZSBPVEcgY29udHJvbAotCSAqIHJlZ2lzdGVyIG9uIElTUDE3NjEuCisJICogcmVnaXN0ZXIgb24gSVNQMTc2MS4gU2luY2UgdGhlcmUgaXMgbm8gT1RHIG9yIGRldmljZSBjb250cm9sbGVyCisJICogc3VwcG9ydCBpbiB0aGlzIGRyaXZlciwgd2UgdXNlIHBvcnQgMSBhcyBhICJub3JtYWwiIFVTQiBob3N0IHBvcnQgb24KKwkgKiBib3RoIGNoaXBzLgogCSAqLwotCWlmICghKHByaXYtPmRldmZsYWdzICYgSVNQMTc2MF9GTEFHX0lTUDE3NjEpICYmCi0JICAgICEocHJpdi0+ZGV2ZmxhZ3MgJiBJU1AxNzYwX0ZMQUdfUE9SVDFfRElTKSkgewotCQlpc3AxNzYwX3dyaXRlbChQT1JUMV9QT1dFUiB8IFBPUlQxX0lOSVQyLAotCQkJICAgICAgIGhjZC0+cmVncyArIEhDX1BPUlQxX0NUUkwpOwotCQltZGVsYXkoMTApOwotCX0KKwlpc3AxNzYwX3dyaXRlbChQT1JUMV9QT1dFUiB8IFBPUlQxX0lOSVQyLAorCQkgICAgICAgaGNkLT5yZWdzICsgSENfUE9SVDFfQ1RSTCk7CisJbWRlbGF5KDEwKTsKIAogCXByaXYtPmhjc19wYXJhbXMgPSBpc3AxNzYwX3JlYWRsKGhjZC0+cmVncyArIEhDX0hDU1BBUkFNUyk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3QvaXNwMTc2MC1oY2QuaCBiL2RyaXZlcnMvdXNiL2hvc3QvaXNwMTc2MC1oY2QuaAppbmRleCA0Mzc3Mjc3Li5hOWRhZWE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L2lzcDE3NjAtaGNkLmgKKysrIGIvZHJpdmVycy91c2IvaG9zdC9pc3AxNzYwLWhjZC5oCkBAIC0xMzUsNyArMTM1LDYgQEAKICAqIGluZGljYXRlIHRoZSBtb3N0ICJhdHlwaWNhbCIgY2FzZSwgc28gdGhhdCBhIGRldmZsYWdzIG9mIDAgaXMKICAqIGEgc2FuZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24uCiAgKi8KLSNkZWZpbmUgSVNQMTc2MF9GTEFHX1BPUlQxX0RJUwkJMHgwMDAwMDAwMSAvKiBQb3J0IDEgZGlzYWJsZWQgKi8KICNkZWZpbmUgSVNQMTc2MF9GTEFHX0JVU19XSURUSF8xNgkweDAwMDAwMDAyIC8qIDE2LWJpdCBkYXRhIGJ1cyB3aWR0aCAqLwogI2RlZmluZSBJU1AxNzYwX0ZMQUdfT1RHX0VOCQkweDAwMDAwMDA0IC8qIFBvcnQgMSBzdXBwb3J0cyBPVEcgKi8KICNkZWZpbmUgSVNQMTc2MF9GTEFHX0FOQUxPR19PQwkJMHgwMDAwMDAwOCAvKiBBbmFsb2cgb3ZlcmN1cnJlbnQgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3QvaXNwMTc2MC1pZi5jIGIvZHJpdmVycy91c2IvaG9zdC9pc3AxNzYwLWlmLmMKaW5kZXggYjg3Y2E3Yy4uNGNmN2NhNCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC9pc3AxNzYwLWlmLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC9pc3AxNzYwLWlmLmMKQEAgLTYwLDkgKzYwLDYgQEAKIAlpZiAob2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUoZHAsICJueHAsdXNiLWlzcDE3NjEiKSkKIAkJZGV2ZmxhZ3MgfD0gSVNQMTc2MF9GTEFHX0lTUDE3NjE7CiAKLQlpZiAob2ZfZ2V0X3Byb3BlcnR5KGRwLCAicG9ydDEtZGlzYWJsZSIsIE5VTEwpICE9IE5VTEwpCi0JCWRldmZsYWdzIHw9IElTUDE3NjBfRkxBR19QT1JUMV9ESVM7Ci0KIAkvKiBTb21lIHN5c3RlbXMgd2lyZSB1cCBvbmx5IDE2IG9mIHRoZSAzMiBkYXRhIGxpbmVzICovCiAJcHJvcCA9IG9mX2dldF9wcm9wZXJ0eShkcCwgImJ1cy13aWR0aCIsIE5VTEwpOwogCWlmIChwcm9wICYmICpwcm9wID09IDE2KQpAQCAtMTI5LDIzICsxMjYsMjMgQEAKICNlbmRpZgogCiAjaWZkZWYgQ09ORklHX1BDSQotc3RhdGljIHUzMiBueHBfcGNpX2lvX2Jhc2U7Ci1zdGF0aWMgdTMyIGlvbGVuZ3RoOwotc3RhdGljIHUzMiBwY2lfbWVtX3BoeTA7Ci1zdGF0aWMgdTMyIGxlbmd0aDsKLXN0YXRpYyB1OCBfX2lvbWVtICpjaGlwX2FkZHI7Ci1zdGF0aWMgdTggX19pb21lbSAqaW9iYXNlOwotCiBzdGF0aWMgaW50IF9fZGV2aW5pdCBpc3AxNzYxX3BjaV9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqZGV2LAogCQljb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpCiB7CiAJdTggbGF0ZW5jeSwgbGltaXQ7CiAJX191MzIgcmVnX2RhdGE7CiAJaW50IHJldHJ5X2NvdW50OwotCWludCBsZW5ndGg7Ci0JaW50IHN0YXR1cyA9IDE7CiAJc3RydWN0IHVzYl9oY2QgKmhjZDsKIAl1bnNpZ25lZCBpbnQgZGV2ZmxhZ3MgPSAwOworCWludCByZXRfc3RhdHVzID0gMDsKKworCXJlc291cmNlX3NpemVfdCBwY2lfbWVtX3BoeTA7CisJcmVzb3VyY2Vfc2l6ZV90IG1lbWxlbmd0aDsKKworCXU4IF9faW9tZW0gKmNoaXBfYWRkcjsKKwl1OCBfX2lvbWVtICppb2Jhc2U7CisJcmVzb3VyY2Vfc2l6ZV90IG54cF9wY2lfaW9fYmFzZTsKKwlyZXNvdXJjZV9zaXplX3QgaW9sZW5ndGg7CiAKIAlpZiAodXNiX2Rpc2FibGVkKCkpCiAJCXJldHVybiAtRU5PREVWOwpAQCAtMTY4LDI2ICsxNjUsMzAgQEAKIAlpb2Jhc2UgPSBpb3JlbWFwX25vY2FjaGUobnhwX3BjaV9pb19iYXNlLCBpb2xlbmd0aCk7CiAJaWYgKCFpb2Jhc2UpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJpb3JlbWFwICMxXG4iKTsKLQkJcmVsZWFzZV9tZW1fcmVnaW9uKG54cF9wY2lfaW9fYmFzZSwgaW9sZW5ndGgpOwotCQlyZXR1cm4gLUVOT01FTTsKKwkJcmV0X3N0YXR1cyA9IC1FTk9NRU07CisJCWdvdG8gY2xlYW51cDE7CiAJfQogCS8qIEdyYWIgdGhlIFBMWCBQQ0kgc2hhcmVkIG1lbW9yeSBvZiB0aGUgSVNQIDE3NjEgd2UgbmVlZCAgKi8KIAlwY2lfbWVtX3BoeTAgPSBwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2LCAzKTsKLQlsZW5ndGggPSBwY2lfcmVzb3VyY2VfbGVuKGRldiwgMyk7Ci0KLQlpZiAobGVuZ3RoIDwgMHhmZmZmKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAibWVtb3J5IGxlbmd0aCBmb3IgdGhpcyByZXNvdXJjZSBpcyBsZXNzIHRoYW4gIgotCQkJCSJyZXF1aXJlZFxuIik7Ci0JCXJlbGVhc2VfbWVtX3JlZ2lvbihueHBfcGNpX2lvX2Jhc2UsIGlvbGVuZ3RoKTsKLQkJaW91bm1hcChpb2Jhc2UpOwotCQlyZXR1cm4gIC1FTk9NRU07CisJbWVtbGVuZ3RoID0gcGNpX3Jlc291cmNlX2xlbihkZXYsIDMpOworCWlmIChtZW1sZW5ndGggPCAweGZmZmYpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJtZW1vcnkgbGVuZ3RoIGZvciB0aGlzIHJlc291cmNlIGlzIHdyb25nXG4iKTsKKwkJcmV0X3N0YXR1cyA9IC1FTk9NRU07CisJCWdvdG8gY2xlYW51cDI7CiAJfQogCi0JaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24ocGNpX21lbV9waHkwLCBsZW5ndGgsICJJU1AtUENJIikpIHsKKwlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihwY2lfbWVtX3BoeTAsIG1lbWxlbmd0aCwgIklTUC1QQ0kiKSkgewogCQlwcmludGsoS0VSTl9FUlIgImhvc3QgY29udHJvbGxlciBhbHJlYWR5IGluIHVzZVxuIik7Ci0JCXJlbGVhc2VfbWVtX3JlZ2lvbihueHBfcGNpX2lvX2Jhc2UsIGlvbGVuZ3RoKTsKLQkJaW91bm1hcChpb2Jhc2UpOwotCQlyZXR1cm4gLUVCVVNZOworCQlyZXRfc3RhdHVzID0gLUVCVVNZOworCQlnb3RvIGNsZWFudXAyOworCX0KKworCS8qIG1hcCBhdmFpbGFibGUgbWVtb3J5ICovCisJY2hpcF9hZGRyID0gaW9yZW1hcF9ub2NhY2hlKHBjaV9tZW1fcGh5MCxtZW1sZW5ndGgpOworCWlmICghY2hpcF9hZGRyKSB7CisJCXByaW50ayhLRVJOX0VSUiAiRXJyb3IgaW9yZW1hcCBmYWlsZWRcbiIpOworCQlyZXRfc3RhdHVzID0gLUVOT01FTTsKKwkJZ290byBjbGVhbnVwMzsKIAl9CiAKIAkvKiBiYWQgcGNpIGxhdGVuY2llcyBjYW4gY29udHJpYnV0ZSB0byBvdmVycnVucyAqLwpAQCAtMjEwLDM5ICsyMTEsNTQgQEAKIAkJICogKi8KIAkJd3JpdGVsKDB4ZmFjZSwgY2hpcF9hZGRyICsgSENfU0NSQVRDSF9SRUcpOwogCQl1ZGVsYXkoMTAwKTsKLQkJcmVnX2RhdGEgPSByZWFkbChjaGlwX2FkZHIgKyBIQ19TQ1JBVENIX1JFRyk7CisJCXJlZ19kYXRhID0gcmVhZGwoY2hpcF9hZGRyICsgSENfU0NSQVRDSF9SRUcpICYgMHgwMDAwZmZmZjsKIAkJcmV0cnlfY291bnQtLTsKIAl9CiAKKwlpb3VubWFwKGNoaXBfYWRkcik7CisKIAkvKiBIb3N0IENvbnRyb2xsZXIgcHJlc2VuY2UgaXMgZGV0ZWN0ZWQgYnkgd3JpdGluZyB0byBzY3JhdGNoIHJlZ2lzdGVyCiAJICogYW5kIHJlYWRpbmcgYmFjayBhbmQgY2hlY2tpbmcgdGhlIGNvbnRlbnRzIGFyZSBzYW1lIG9yIG5vdAogCSAqLwogCWlmIChyZWdfZGF0YSAhPSAweEZBQ0UpIHsKIAkJZGV2X2VycigmZGV2LT5kZXYsICJzY3JhdGNoIHJlZ2lzdGVyIG1pc21hdGNoICV4XG4iLCByZWdfZGF0YSk7Ci0JCWdvdG8gY2xlYW47CisJCXJldF9zdGF0dXMgPSAtRU5PTUVNOworCQlnb3RvIGNsZWFudXAzOwogCX0KIAogCXBjaV9zZXRfbWFzdGVyKGRldik7CiAKLQlzdGF0dXMgPSByZWFkbChpb2Jhc2UgKyAweDY4KTsKLQlzdGF0dXMgfD0gMHg5MDA7Ci0Jd3JpdGVsKHN0YXR1cywgaW9iYXNlICsgMHg2OCk7CisJLyogY29uZmlndXJlIFBMWCBQQ0kgY2hpcCB0byBwYXNzIGludGVycnVwdHMgKi8KKyNkZWZpbmUgUExYX0lOVF9DU1JfUkVHIDB4NjgKKwlyZWdfZGF0YSA9IHJlYWRsKGlvYmFzZSArIFBMWF9JTlRfQ1NSX1JFRyk7CisJcmVnX2RhdGEgfD0gMHg5MDA7CisJd3JpdGVsKHJlZ19kYXRhLCBpb2Jhc2UgKyBQTFhfSU5UX0NTUl9SRUcpOwogCiAJZGV2LT5kZXYuZG1hX21hc2sgPSBOVUxMOwotCWhjZCA9IGlzcDE3NjBfcmVnaXN0ZXIocGNpX21lbV9waHkwLCBsZW5ndGgsIGRldi0+aXJxLAorCWhjZCA9IGlzcDE3NjBfcmVnaXN0ZXIocGNpX21lbV9waHkwLCBtZW1sZW5ndGgsIGRldi0+aXJxLAogCQlJUlFGX1NIQVJFRCB8IElSUUZfRElTQUJMRUQsICZkZXYtPmRldiwgZGV2X25hbWUoJmRldi0+ZGV2KSwKIAkJZGV2ZmxhZ3MpOwotCWlmICghSVNfRVJSKGhjZCkpIHsKLQkJcGNpX3NldF9kcnZkYXRhKGRldiwgaGNkKTsKLQkJcmV0dXJuIDA7CisJaWYgKElTX0VSUihoY2QpKSB7CisJCXJldF9zdGF0dXMgPSAtRU5PREVWOworCQlnb3RvIGNsZWFudXAzOwogCX0KLWNsZWFuOgotCXN0YXR1cyA9IC1FTk9ERVY7CisKKwkvKiBkb25lIHdpdGggUExYIElPIGFjY2VzcyAqLwogCWlvdW5tYXAoaW9iYXNlKTsKLQlyZWxlYXNlX21lbV9yZWdpb24ocGNpX21lbV9waHkwLCBsZW5ndGgpOwogCXJlbGVhc2VfbWVtX3JlZ2lvbihueHBfcGNpX2lvX2Jhc2UsIGlvbGVuZ3RoKTsKLQlyZXR1cm4gc3RhdHVzOworCisJcGNpX3NldF9kcnZkYXRhKGRldiwgaGNkKTsKKwlyZXR1cm4gMDsKKworY2xlYW51cDM6CisJcmVsZWFzZV9tZW1fcmVnaW9uKHBjaV9tZW1fcGh5MCwgbWVtbGVuZ3RoKTsKK2NsZWFudXAyOgorCWlvdW5tYXAoaW9iYXNlKTsKK2NsZWFudXAxOgorCXJlbGVhc2VfbWVtX3JlZ2lvbihueHBfcGNpX2lvX2Jhc2UsIGlvbGVuZ3RoKTsKKwlyZXR1cm4gcmV0X3N0YXR1czsKIH0KKwogc3RhdGljIHZvaWQgaXNwMTc2MV9wY2lfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpkZXYpCiB7CiAJc3RydWN0IHVzYl9oY2QgKmhjZDsKQEAgLTI1NSwxMiArMjcxLDYgQEAKIAl1c2JfcHV0X2hjZChoY2QpOwogCiAJcGNpX2Rpc2FibGVfZGV2aWNlKGRldik7Ci0KLQlpb3VubWFwKGlvYmFzZSk7Ci0JaW91bm1hcChjaGlwX2FkZHIpOwotCi0JcmVsZWFzZV9tZW1fcmVnaW9uKG54cF9wY2lfaW9fYmFzZSwgaW9sZW5ndGgpOwotCXJlbGVhc2VfbWVtX3JlZ2lvbihwY2lfbWVtX3BoeTAsIGxlbmd0aCk7CiB9CiAKIHN0YXRpYyB2b2lkIGlzcDE3NjFfcGNpX3NodXRkb3duKHN0cnVjdCBwY2lfZGV2ICpkZXYpCkBAIC0yNjgsMTIgKzI3OCwxNiBAQAogCXByaW50ayhLRVJOX0VSUiAiaXBzMTc2MV9wY2lfc2h1dGRvd25cbiIpOwogfQogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgaXNwMTc2MF9wbHggW10gPSB7IHsKLQkvKiBoYW5kbGUgYW55IFVTQiAyLjAgRUhDSSBjb250cm9sbGVyICovCi0JUENJX0RFVklDRV9DTEFTUygoKFBDSV9DTEFTU19CUklER0VfT1RIRVIgPDwgOCkgfCAoMHgwNiA8PCAxNikpLCB+MCksCi0JCS5kcml2ZXJfZGF0YSA9IDAsCi19LAoteyAvKiBlbmQ6IGFsbCB6ZXJvZXMgKi8gfQorc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkIGlzcDE3NjBfcGx4IFtdID0geworCXsKKwkJLmNsYXNzICAgICAgICAgID0gUENJX0NMQVNTX0JSSURHRV9PVEhFUiA8PCA4LAorCQkuY2xhc3NfbWFzayAgICAgPSB+MCwKKwkJLnZlbmRvcgkJPSBQQ0lfVkVORE9SX0lEX1BMWCwKKwkJLmRldmljZQkJPSAweDU0MDYsCisJCS5zdWJ2ZW5kb3IJPSBQQ0lfVkVORE9SX0lEX1BMWCwKKwkJLnN1YmRldmljZQk9IDB4OTA1NCwKKwl9LAorCXsgfQogfTsKIE1PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBpc3AxNzYwX3BseCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1oY2QuYyBiL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1oY2QuYwppbmRleCA4YWEzZjQ1Li42NWE5NjA5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L29oY2ktaGNkLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC9vaGNpLWhjZC5jCkBAIC01ODksMTMgKzU4OSwxNSBAQAogCQkvKiBhbHNvOiBwb3dlci9vdmVyY3VycmVudCBmbGFncyBpbiByb290aHViLmEgKi8KIAl9CiAKLQkvKiBSZXNldCBVU0IgbmVhcmx5ICJieSB0aGUgYm9vayIuICBSZW1vdGVXYWtldXBDb25uZWN0ZWQgd2FzCi0JICogc2F2ZWQgaWYgYm9vdCBmaXJtd2FyZSAoQklPUy9TTU0vLi4uKSB0b2xkIHVzIGl0J3MgY29ubmVjdGVkLAotCSAqIG9yIGlmIGJ1cyBnbHVlIGRpZCB0aGUgc2FtZSAoZS5nLiBmb3IgUENJIGFkZC1pbiBjYXJkcyB3aXRoCi0JICogUENJIFBNIHN1cHBvcnQpLgorCS8qIFJlc2V0IFVTQiBuZWFybHkgImJ5IHRoZSBib29rIi4gIFJlbW90ZVdha2V1cENvbm5lY3RlZCBoYXMKKwkgKiB0byBiZSBjaGVja2VkIGluIGNhc2UgYm9vdCBmaXJtd2FyZSAoQklPUy9TTU0vLi4uKSBoYXMgc2V0IHVwCisJICogd2FrZXVwIGluIGEgd2F5IHRoZSBidXMgaXNuJ3QgYXdhcmUgb2YgKGUuZy4sIGxlZ2FjeSBQQ0kgUE0pLgorCSAqIElmIHRoZSBidXMgZ2x1ZSBkZXRlY3RlZCB3YWtldXAgY2FwYWJpbGl0eSB0aGVuIGl0IHNob3VsZAorCSAqIGFscmVhZHkgYmUgZW5hYmxlZC4gIEVpdGhlciB3YXksIGlmIHdha2V1cCBzaG91bGQgYmUgZW5hYmxlZAorCSAqIGJ1dCBpc24ndCwgd2UnbGwgZW5hYmxlIGl0IG5vdy4KIAkgKi8KIAlpZiAoKG9oY2ktPmhjX2NvbnRyb2wgJiBPSENJX0NUUkxfUldDKSAhPSAwCi0JCQkmJiAhZGV2aWNlX21heV93YWtldXAoaGNkLT5zZWxmLmNvbnRyb2xsZXIpKQorCQkJJiYgIWRldmljZV9jYW5fd2FrZXVwKGhjZC0+c2VsZi5jb250cm9sbGVyKSkKIAkJZGV2aWNlX2luaXRfd2FrZXVwKGhjZC0+c2VsZi5jb250cm9sbGVyLCAxKTsKIAogCXN3aXRjaCAob2hjaS0+aGNfY29udHJvbCAmIE9IQ0lfQ1RSTF9IQ0ZTKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L29oY2ktcGNpLmMgYi9kcml2ZXJzL3VzYi9ob3N0L29oY2ktcGNpLmMKaW5kZXggYTljMmFlMy4uOGIyOGFlNyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC9vaGNpLXBjaS5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1wY2kuYwpAQCAtMzU1LDkgKzM1NSw5IEBACiAKIAkJLyogUldDIG1heSBub3QgYmUgc2V0IGZvciBhZGQtaW4gUENJIGNhcmRzLCBzaW5jZSBib290CiAJCSAqIGZpcm13YXJlIHByb2JhYmx5IGlnbm9yZWQgdGhlbS4gIFRoaXMgdHJhbnNmZXJzIFBDSQotCQkgKiBQTSB3YWtldXAgY2FwYWJpbGl0aWVzIChvbmNlIHRoZSBQQ0kgbGF5ZXIgaXMgZml4ZWQpLgorCQkgKiBQTSB3YWtldXAgY2FwYWJpbGl0aWVzLgogCQkgKi8KLQkJaWYgKGRldmljZV9tYXlfd2FrZXVwKCZwZGV2LT5kZXYpKQorCQlpZiAoZGV2aWNlX2Nhbl93YWtldXAoJnBkZXYtPmRldikpCiAJCQlvaGNpLT5oY19jb250cm9sIHw9IE9IQ0lfQ1RSTF9SV0M7CiAJfQogI2VuZGlmIC8qIENPTkZJR19QTSAqLwpAQCAtNDg3LDYgKzQ4Nyw4IEBACiAKICNpZmRlZglDT05GSUdfUE0KIAkuc3VzcGVuZCA9CXVzYl9oY2RfcGNpX3N1c3BlbmQsCisJLnN1c3BlbmRfbGF0ZSA9CXVzYl9oY2RfcGNpX3N1c3BlbmRfbGF0ZSwKKwkucmVzdW1lX2Vhcmx5ID0JdXNiX2hjZF9wY2lfcmVzdW1lX2Vhcmx5LAogCS5yZXN1bWUgPQl1c2JfaGNkX3BjaV9yZXN1bWUsCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9vaGNpLXBueDQwMDguYyBiL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1wbng0MDA4LmMKaW5kZXggZTMwNmNhNi4uMTAwYmYzZCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC9vaGNpLXBueDQwMDguYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L29oY2ktcG54NDAwOC5jCkBAIC0xMDYsNjUgKzEwNiwzNCBAQAogCiBzdGF0aWMgc3RydWN0IGNsayAqdXNiX2NsazsKIAotc3RhdGljIGludCBpc3AxMzAxX3Byb2JlKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCk7Ci1zdGF0aWMgaW50IGlzcDEzMDFfZGV0YWNoKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpOwotCiBzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgbm9ybWFsX2kyY1tdID0KICAgICB7IElTUDEzMDFfSTJDX0FERFIsIElTUDEzMDFfSTJDX0FERFIgKyAxLCBJMkNfQ0xJRU5UX0VORCB9Owotc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IGR1bW15X2kyY19hZGRybGlzdFtdID0geyBJMkNfQ0xJRU5UX0VORCB9OwogCi1zdGF0aWMgc3RydWN0IGkyY19jbGllbnRfYWRkcmVzc19kYXRhIGFkZHJfZGF0YSA9IHsKLQkubm9ybWFsX2kyYyA9IG5vcm1hbF9pMmMsCi0JLnByb2JlID0gZHVtbXlfaTJjX2FkZHJsaXN0LAotCS5pZ25vcmUgPSBkdW1teV9pMmNfYWRkcmxpc3QsCitzdGF0aWMgaW50IGlzcDEzMDFfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKKwkJCSBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaXNwMTMwMV9yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlyZXR1cm4gMDsKK30KKworY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgaXNwMTMwMV9pZFtdID0geworCXsgImlzcDEzMDFfcG54IiwgMCB9LAorCXsgfQogfTsKIAogc3RydWN0IGkyY19kcml2ZXIgaXNwMTMwMV9kcml2ZXIgPSB7CiAJLmRyaXZlciA9IHsKIAkJLm5hbWUgPSAiaXNwMTMwMV9wbngiLAogCX0sCi0JLmF0dGFjaF9hZGFwdGVyID0gaXNwMTMwMV9wcm9iZSwKLQkuZGV0YWNoX2NsaWVudCA9IGlzcDEzMDFfZGV0YWNoLAorCS5wcm9iZSA9IGlzcDEzMDFfcHJvYmUsCisJLnJlbW92ZSA9IGlzcDEzMDFfcmVtb3ZlLAorCS5pZF90YWJsZSA9IGlzcDEzMDFfaWQsCiB9OwogCi1zdGF0aWMgaW50IGlzcDEzMDFfYXR0YWNoKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCwgaW50IGFkZHIsIGludCBraW5kKQotewotCXN0cnVjdCBpMmNfY2xpZW50ICpjOwotCWludCBlcnI7Ci0KLQljID0ga3phbGxvYyhzaXplb2YoKmMpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWMpCi0JCXJldHVybiAtRU5PTUVNOwotCi0Jc3RybGNweShjLT5uYW1lLCAiaXNwMTMwMV9wbngiLCBJMkNfTkFNRV9TSVpFKTsKLQljLT5mbGFncyA9IDA7Ci0JYy0+YWRkciA9IGFkZHI7Ci0JYy0+YWRhcHRlciA9IGFkYXA7Ci0JYy0+ZHJpdmVyID0gJmlzcDEzMDFfZHJpdmVyOwotCi0JZXJyID0gaTJjX2F0dGFjaF9jbGllbnQoYyk7Ci0JaWYgKGVycikgewotCQlrZnJlZShjKTsKLQkJcmV0dXJuIGVycjsKLQl9Ci0KLQlpc3AxMzAxX2kyY19jbGllbnQgPSBjOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgaXNwMTMwMV9wcm9iZShzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXApCi17Ci0JcmV0dXJuIGkyY19wcm9iZShhZGFwLCAmYWRkcl9kYXRhLCBpc3AxMzAxX2F0dGFjaCk7Ci19Ci0KLXN0YXRpYyBpbnQgaXNwMTMwMV9kZXRhY2goc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKLXsKLQlpMmNfZGV0YWNoX2NsaWVudChjbGllbnQpOwotCWtmcmVlKGlzcDEzMDFfaTJjX2NsaWVudCk7Ci0JcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyB2b2lkIGkyY193cml0ZSh1OCBidWYsIHU4IHN1YmFkZHIpCiB7CiAJY2hhciB0bXBidWZbMl07CkBAIC0zMjgsNiArMjk3LDggQEAKIAlzdHJ1Y3QgdXNiX2hjZCAqaGNkID0gMDsKIAlzdHJ1Y3Qgb2hjaV9oY2QgKm9oY2k7CiAJY29uc3Qgc3RydWN0IGhjX2RyaXZlciAqZHJpdmVyID0gJm9oY2lfcG54NDAwOF9oY19kcml2ZXI7CisJc3RydWN0IGkyY19hZGFwdGVyICppMmNfYWRhcDsKKwlzdHJ1Y3QgaTJjX2JvYXJkX2luZm8gaTJjX2luZm87CiAKIAlpbnQgcmV0ID0gMCwgaXJxOwogCkBAIC0zNTEsOSArMzIyLDIwIEBACiAKIAlyZXQgPSBpMmNfYWRkX2RyaXZlcigmaXNwMTMwMV9kcml2ZXIpOwogCWlmIChyZXQgPCAwKSB7Ci0JCWVycigiZmFpbGVkIHRvIGNvbm5lY3QgSTJDIHRvIElTUDEzMDEgVVNCIFRyYW5zY2VpdmVyIik7CisJCWVycigiZmFpbGVkIHRvIGFkZCBJU1AxMzAxIGRyaXZlciIpOwogCQlnb3RvIG91dDsKIAl9CisJaTJjX2FkYXAgPSBpMmNfZ2V0X2FkYXB0ZXIoMik7CisJbWVtc2V0KCZpMmNfaW5mbywgMCwgc2l6ZW9mKHN0cnVjdCBpMmNfYm9hcmRfaW5mbykpOworCXN0cmxjcHkoaTJjX2luZm8ubmFtZSwgImlzcDEzMDFfcG54IiwgSTJDX05BTUVfU0laRSk7CisJaXNwMTMwMV9pMmNfY2xpZW50ID0gaTJjX25ld19wcm9iZWRfZGV2aWNlKGkyY19hZGFwLCAmaTJjX2luZm8sCisJCQkJCQkgICBub3JtYWxfaTJjKTsKKwlpMmNfcHV0X2FkYXB0ZXIoaTJjX2FkYXApOworCWlmICghaXNwMTMwMV9pMmNfY2xpZW50KSB7CisJCWVycigiZmFpbGVkIHRvIGNvbm5lY3QgSTJDIHRvIElTUDEzMDEgVVNCIFRyYW5zY2VpdmVyIik7CisJCXJldCA9IC1FTk9ERVY7CisJCWdvdG8gb3V0X2kyY19kcml2ZXI7CisJfQogCiAJaXNwMTMwMV9jb25maWd1cmUoKTsKIApAQCAtNDI5LDYgKzQxMSw5IEBACiBvdXQyOgogCWNsa19wdXQodXNiX2Nsayk7CiBvdXQxOgorCWkyY191bnJlZ2lzdGVyX2NsaWVudChpc3AxMzAxX2kyY19jbGllbnQpOworCWlzcDEzMDFfaTJjX2NsaWVudCA9IE5VTEw7CitvdXRfaTJjX2RyaXZlcjoKIAlpMmNfZGVsX2RyaXZlcigmaXNwMTMwMV9kcml2ZXIpOwogb3V0OgogCXJldHVybiByZXQ7CkBAIC00NDUsNiArNDMwLDggQEAKIAlwbng0MDA4X3Vuc2V0X3VzYl9iaXRzKCk7CiAJY2xrX2Rpc2FibGUodXNiX2Nsayk7CiAJY2xrX3B1dCh1c2JfY2xrKTsKKwlpMmNfdW5yZWdpc3Rlcl9jbGllbnQoaXNwMTMwMV9pMmNfY2xpZW50KTsKKwlpc3AxMzAxX2kyY19jbGllbnQgPSBOVUxMOwogCWkyY19kZWxfZHJpdmVyKCZpc3AxMzAxX2RyaXZlcik7CiAKIAlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1wcGMtb2YuYyBiL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1wcGMtb2YuYwppbmRleCA3YWM1MzI2Li42OGEzMDE3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L29oY2ktcHBjLW9mLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC9vaGNpLXBwYy1vZi5jCkBAIC05MSw2ICs5MSw3IEBACiAKIAlpbnQgcnY7CiAJaW50IGlzX2JpZ2VuZGlhbjsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOwogCiAJaWYgKHVzYl9kaXNhYmxlZCgpKQogCQlyZXR1cm4gLUVOT0RFVjsKQEAgLTE0Nyw2ICsxNDgsMzAgQEAKIAlpZiAocnYgPT0gMCkKIAkJcmV0dXJuIDA7CiAKKwkvKiBieSBub3csIDQ0MGVweCBpcyBrbm93biB0byBzaG93IHVzYl8yMyBlcnJhdHVtICovCisJbnAgPSBvZl9maW5kX2NvbXBhdGlibGVfbm9kZShOVUxMLCBOVUxMLCAiaWJtLHVzYi1laGNpLTQ0MGVweCIpOworCisJLyogV29yayBhcm91bmQgLSBBdCB0aGlzIHBvaW50IG9oY2lfcnVuIGhhcyBleGVjdXRlZCwgdGhlCisJKiBjb250cm9sbGVyIGlzIHJ1bm5pbmcsIGV2ZXJ5dGhpbmcsIHRoZSByb290IHBvcnRzLCBldGMuLCBpcworCSogc2V0IHVwLiAgSWYgdGhlIGVoY2kgZHJpdmVyIGlzIGxvYWRlZCwgcHV0IHRoZSBvaGNpIGNvcmUgaW4KKwkqIHRoZSBzdXNwZW5kZWQgc3RhdGUuICBUaGUgZWhjaSBkcml2ZXIgd2lsbCBicmluZyBpdCBvdXQgb2YKKwkqIHN1c3BlbmRlZCBzdGF0ZSB3aGVuIC8gaWYgYSBub24taGlnaCBzcGVlZCBVU0IgZGV2aWNlIGlzCisJKiBhdHRhY2hlZCB0byB0aGUgVVNCIEhvc3QgcG9ydC4gIElmIHRoZSBlaGNpIGRyaXZlciBpcyBub3QKKwkqIGxvYWRlZCwgZG8gbm90aGluZy4gcmVxdWVzdF9tZW1fcmVnaW9uIGlzIHVzZWQgdG8gdGVzdCBpZgorCSogdGhlIGVoY2kgZHJpdmVyIGlzIGxvYWRlZC4KKwkqLworCWlmIChucCAhPSAgTlVMTCkgeworCQlpZiAoIW9mX2FkZHJlc3NfdG9fcmVzb3VyY2UobnAsIDAsICZyZXMpKSB7CisJCQlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihyZXMuc3RhcnQsIDB4NCwgaGNkX25hbWUpKSB7CisJCQkJd3JpdGVsX2JlKChyZWFkbF9iZSgmb2hjaS0+cmVncy0+Y29udHJvbCkgfAorCQkJCQlPSENJX1VTQl9TVVNQRU5EKSwgJm9oY2ktPnJlZ3MtPmNvbnRyb2wpOworCQkJCQkodm9pZCkgcmVhZGxfYmUoJm9oY2ktPnJlZ3MtPmNvbnRyb2wpOworCQkJfSBlbHNlCisJCQkJcmVsZWFzZV9tZW1fcmVnaW9uKHJlcy5zdGFydCwgMHg0KTsKKwkJfSBlbHNlCisJCSAgICBwcl9kZWJ1ZyhfX0ZJTEVfXyAiOiBjYW5ub3QgZ2V0IGVoY2kgb2Zmc2V0IGZyb20gZmR0XG4iKTsKKwl9CisKIAlpb3VubWFwKGhjZC0+cmVncyk7CiBlcnJfaW9yZW1hcDoKIAlpcnFfZGlzcG9zZV9tYXBwaW5nKGlycSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L29oY2ktdG1pby5jIGIvZHJpdmVycy91c2IvaG9zdC9vaGNpLXRtaW8uYwppbmRleCBmOWYxMzRhLi44ZGFiZThlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L29oY2ktdG1pby5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS10bWlvLmMKQEAgLTIwMSw3ICsyMDEsNyBAQAogCWlmICghY2VsbCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQloY2QgPSB1c2JfY3JlYXRlX2hjZCgmb2hjaV90bWlvX2hjX2RyaXZlciwgJmRldi0+ZGV2LCBkZXYtPmRldi5idXNfaWQpOworCWhjZCA9IHVzYl9jcmVhdGVfaGNkKCZvaGNpX3RtaW9faGNfZHJpdmVyLCAmZGV2LT5kZXYsIGRldl9uYW1lKCZkZXYtPmRldikpOwogCWlmICghaGNkKSB7CiAJCXJldCA9IC1FTk9NRU07CiAJCWdvdG8gZXJyX3VzYl9jcmVhdGVfaGNkOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9veHUyMTBocC1oY2QuYyBiL2RyaXZlcnMvdXNiL2hvc3Qvb3h1MjEwaHAtaGNkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzU1NDhmNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdXNiL2hvc3Qvb3h1MjEwaHAtaGNkLmMKQEAgLTAsMCArMSwzOTg1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA4IFJvZG9sZm8gR2lvbWV0dGkgPGdpb21ldHRpQGxpbnV4Lml0PgorICogQ29weXJpZ2h0IChjKSAyMDA4IEV1cm90ZWNoIFMucC5BLiA8aW5mb0BldXJ0ZWNoLml0PgorICoKKyAqIFRoaXMgY29kZSBpcyAqc3Ryb25nbHkqIGJhc2VkIG9uIEVIQ0ktSENEIGNvZGUgYnkgRGF2aWQgQnJvd25lbGwgc2luY2UKKyAqIHRoZSBjaGlwIGlzIGEgcXVhc2ktRUhDSSBjb21wYXRpYmxlLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKKyAqIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWFwb29sLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWJvb3QuaD4KKyNpbmNsdWRlIDxsaW51eC91c2IuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKworI2luY2x1ZGUgIi4uL2NvcmUvaGNkLmgiCisKKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS91bmFsaWduZWQuaD4KKworI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorCisjaW5jbHVkZSAib3h1MjEwaHAuaCIKKworI2RlZmluZSBEUklWRVJfVkVSU0lPTiAiMC4wLjUwIgorCisvKgorICogTWFpbiBkZWZpbmVzCisgKi8KKworI2RlZmluZSBveHVfZGJnKG94dSwgZm10LCBhcmdzLi4uKSBcCisJCWRldl9kYmcob3h1X3RvX2hjZChveHUpLT5zZWxmLmNvbnRyb2xsZXIgLCBmbXQgLCAjIyBhcmdzKQorI2RlZmluZSBveHVfZXJyKG94dSwgZm10LCBhcmdzLi4uKSBcCisJCWRldl9lcnIob3h1X3RvX2hjZChveHUpLT5zZWxmLmNvbnRyb2xsZXIgLCBmbXQgLCAjIyBhcmdzKQorI2RlZmluZSBveHVfaW5mbyhveHUsIGZtdCwgYXJncy4uLikgXAorCQlkZXZfaW5mbyhveHVfdG9faGNkKG94dSktPnNlbGYuY29udHJvbGxlciAsIGZtdCAsICMjIGFyZ3MpCisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHVzYl9oY2QgKm94dV90b19oY2Qoc3RydWN0IG94dV9oY2QgKm94dSkKK3sKKwlyZXR1cm4gY29udGFpbmVyX29mKCh2b2lkICopIG94dSwgc3RydWN0IHVzYl9oY2QsIGhjZF9wcml2KTsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3Qgb3h1X2hjZCAqaGNkX3RvX294dShzdHJ1Y3QgdXNiX2hjZCAqaGNkKQoreworCXJldHVybiAoc3RydWN0IG94dV9oY2QgKikgKGhjZC0+aGNkX3ByaXYpOworfQorCisvKgorICogRGVidWcgc3R1ZmYKKyAqLworCisjdW5kZWYgT1hVX1VSQl9UUkFDRQorI3VuZGVmIE9YVV9WRVJCT1NFX0RFQlVHCisKKyNpZmRlZiBPWFVfVkVSQk9TRV9ERUJVRworI2RlZmluZSBveHVfdmRiZwkJCW94dV9kYmcKKyNlbHNlCisjZGVmaW5lIG94dV92ZGJnKG94dSwgZm10LCBhcmdzLi4uKQkvKiBOb3AgKi8KKyNlbmRpZgorCisjaWZkZWYgREVCVUcKKworc3RhdGljIGludCBfX2F0dHJpYnV0ZV9fKChfX3VudXNlZF9fKSkKK2RiZ19zdGF0dXNfYnVmKGNoYXIgKmJ1ZiwgdW5zaWduZWQgbGVuLCBjb25zdCBjaGFyICpsYWJlbCwgdTMyIHN0YXR1cykKK3sKKwlyZXR1cm4gc2NucHJpbnRmKGJ1ZiwgbGVuLCAiJXMlc3N0YXR1cyAlMDR4JXMlcyVzJXMlcyVzJXMlcyVzJXMiLAorCQlsYWJlbCwgbGFiZWxbMF0gPyAiICIgOiAiIiwgc3RhdHVzLAorCQkoc3RhdHVzICYgU1RTX0FTUykgPyAiIEFzeW5jIiA6ICIiLAorCQkoc3RhdHVzICYgU1RTX1BTUykgPyAiIFBlcmlvZGljIiA6ICIiLAorCQkoc3RhdHVzICYgU1RTX1JFQ0wpID8gIiBSZWNsIiA6ICIiLAorCQkoc3RhdHVzICYgU1RTX0hBTFQpID8gIiBIYWx0IiA6ICIiLAorCQkoc3RhdHVzICYgU1RTX0lBQSkgPyAiIElBQSIgOiAiIiwKKwkJKHN0YXR1cyAmIFNUU19GQVRBTCkgPyAiIEZBVEFMIiA6ICIiLAorCQkoc3RhdHVzICYgU1RTX0ZMUikgPyAiIEZMUiIgOiAiIiwKKwkJKHN0YXR1cyAmIFNUU19QQ0QpID8gIiBQQ0QiIDogIiIsCisJCShzdGF0dXMgJiBTVFNfRVJSKSA/ICIgRVJSIiA6ICIiLAorCQkoc3RhdHVzICYgU1RTX0lOVCkgPyAiIElOVCIgOiAiIgorCQkpOworfQorCitzdGF0aWMgaW50IF9fYXR0cmlidXRlX18oKF9fdW51c2VkX18pKQorZGJnX2ludHJfYnVmKGNoYXIgKmJ1ZiwgdW5zaWduZWQgbGVuLCBjb25zdCBjaGFyICpsYWJlbCwgdTMyIGVuYWJsZSkKK3sKKwlyZXR1cm4gc2NucHJpbnRmKGJ1ZiwgbGVuLCAiJXMlc2ludHJlbmFibGUgJTAyeCVzJXMlcyVzJXMlcyIsCisJCWxhYmVsLCBsYWJlbFswXSA/ICIgIiA6ICIiLCBlbmFibGUsCisJCShlbmFibGUgJiBTVFNfSUFBKSA/ICIgSUFBIiA6ICIiLAorCQkoZW5hYmxlICYgU1RTX0ZBVEFMKSA/ICIgRkFUQUwiIDogIiIsCisJCShlbmFibGUgJiBTVFNfRkxSKSA/ICIgRkxSIiA6ICIiLAorCQkoZW5hYmxlICYgU1RTX1BDRCkgPyAiIFBDRCIgOiAiIiwKKwkJKGVuYWJsZSAmIFNUU19FUlIpID8gIiBFUlIiIDogIiIsCisJCShlbmFibGUgJiBTVFNfSU5UKSA/ICIgSU5UIiA6ICIiCisJCSk7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpjb25zdCBmbHNfc3RyaW5nc1tdID0KKyAgICB7ICIxMDI0IiwgIjUxMiIsICIyNTYiLCAiPz8iIH07CisKK3N0YXRpYyBpbnQgZGJnX2NvbW1hbmRfYnVmKGNoYXIgKmJ1ZiwgdW5zaWduZWQgbGVuLAorCQkJCWNvbnN0IGNoYXIgKmxhYmVsLCB1MzIgY29tbWFuZCkKK3sKKwlyZXR1cm4gc2NucHJpbnRmKGJ1ZiwgbGVuLAorCQkiJXMlc2NvbW1hbmQgJTA2eCAlcz0lZCBpdGhyZXNoPSVkJXMlcyVzJXMgcGVyaW9kPSVzJXMgJXMiLAorCQlsYWJlbCwgbGFiZWxbMF0gPyAiICIgOiAiIiwgY29tbWFuZCwKKwkJKGNvbW1hbmQgJiBDTURfUEFSSykgPyAicGFyayIgOiAiKHBhcmspIiwKKwkJQ01EX1BBUktfQ05UKGNvbW1hbmQpLAorCQkoY29tbWFuZCA+PiAxNikgJiAweDNmLAorCQkoY29tbWFuZCAmIENNRF9MUkVTRVQpID8gIiBMUmVzZXQiIDogIiIsCisJCShjb21tYW5kICYgQ01EX0lBQUQpID8gIiBJQUFEIiA6ICIiLAorCQkoY29tbWFuZCAmIENNRF9BU0UpID8gIiBBc3luYyIgOiAiIiwKKwkJKGNvbW1hbmQgJiBDTURfUFNFKSA/ICIgUGVyaW9kaWMiIDogIiIsCisJCWZsc19zdHJpbmdzWyhjb21tYW5kID4+IDIpICYgMHgzXSwKKwkJKGNvbW1hbmQgJiBDTURfUkVTRVQpID8gIiBSZXNldCIgOiAiIiwKKwkJKGNvbW1hbmQgJiBDTURfUlVOKSA/ICJSVU4iIDogIkhBTFQiCisJCSk7Cit9CisKK3N0YXRpYyBpbnQgZGJnX3BvcnRfYnVmKGNoYXIgKmJ1ZiwgdW5zaWduZWQgbGVuLCBjb25zdCBjaGFyICpsYWJlbCwKKwkJCQlpbnQgcG9ydCwgdTMyIHN0YXR1cykKK3sKKwljaGFyCSpzaWc7CisKKwkvKiBzaWduYWxpbmcgc3RhdGUgKi8KKwlzd2l0Y2ggKHN0YXR1cyAmICgzIDw8IDEwKSkgeworCWNhc2UgMCA8PCAxMDoKKwkJc2lnID0gInNlMCI7CisJCWJyZWFrOworCWNhc2UgMSA8PCAxMDoKKwkJc2lnID0gImsiOwkvKiBsb3cgc3BlZWQgKi8KKwkJYnJlYWs7CisJY2FzZSAyIDw8IDEwOgorCQlzaWcgPSAiaiI7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXNpZyA9ICI/IjsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHNjbnByaW50ZihidWYsIGxlbiwKKwkJIiVzJXNwb3J0ICVkIHN0YXR1cyAlMDZ4JXMlcyBzaWc9JXMlcyVzJXMlcyVzJXMlcyVzJXMiLAorCQlsYWJlbCwgbGFiZWxbMF0gPyAiICIgOiAiIiwgcG9ydCwgc3RhdHVzLAorCQkoc3RhdHVzICYgUE9SVF9QT1dFUikgPyAiIFBPV0VSIiA6ICIiLAorCQkoc3RhdHVzICYgUE9SVF9PV05FUikgPyAiIE9XTkVSIiA6ICIiLAorCQlzaWcsCisJCShzdGF0dXMgJiBQT1JUX1JFU0VUKSA/ICIgUkVTRVQiIDogIiIsCisJCShzdGF0dXMgJiBQT1JUX1NVU1BFTkQpID8gIiBTVVNQRU5EIiA6ICIiLAorCQkoc3RhdHVzICYgUE9SVF9SRVNVTUUpID8gIiBSRVNVTUUiIDogIiIsCisJCShzdGF0dXMgJiBQT1JUX09DQykgPyAiIE9DQyIgOiAiIiwKKwkJKHN0YXR1cyAmIFBPUlRfT0MpID8gIiBPQyIgOiAiIiwKKwkJKHN0YXR1cyAmIFBPUlRfUEVDKSA/ICIgUEVDIiA6ICIiLAorCQkoc3RhdHVzICYgUE9SVF9QRSkgPyAiIFBFIiA6ICIiLAorCQkoc3RhdHVzICYgUE9SVF9DU0MpID8gIiBDU0MiIDogIiIsCisJCShzdGF0dXMgJiBQT1JUX0NPTk5FQ1QpID8gIiBDT05ORUNUIiA6ICIiCisJICAgICk7Cit9CisKKyNlbHNlCisKK3N0YXRpYyBpbmxpbmUgaW50IF9fYXR0cmlidXRlX18oKF9fdW51c2VkX18pKQorZGJnX3N0YXR1c19idWYoY2hhciAqYnVmLCB1bnNpZ25lZCBsZW4sIGNvbnN0IGNoYXIgKmxhYmVsLCB1MzIgc3RhdHVzKQoreyByZXR1cm4gMDsgfQorCitzdGF0aWMgaW5saW5lIGludCBfX2F0dHJpYnV0ZV9fKChfX3VudXNlZF9fKSkKK2RiZ19jb21tYW5kX2J1ZihjaGFyICpidWYsIHVuc2lnbmVkIGxlbiwgY29uc3QgY2hhciAqbGFiZWwsIHUzMiBjb21tYW5kKQoreyByZXR1cm4gMDsgfQorCitzdGF0aWMgaW5saW5lIGludCBfX2F0dHJpYnV0ZV9fKChfX3VudXNlZF9fKSkKK2RiZ19pbnRyX2J1ZihjaGFyICpidWYsIHVuc2lnbmVkIGxlbiwgY29uc3QgY2hhciAqbGFiZWwsIHUzMiBlbmFibGUpCit7IHJldHVybiAwOyB9CisKK3N0YXRpYyBpbmxpbmUgaW50IF9fYXR0cmlidXRlX18oKF9fdW51c2VkX18pKQorZGJnX3BvcnRfYnVmKGNoYXIgKmJ1ZiwgdW5zaWduZWQgbGVuLCBjb25zdCBjaGFyICpsYWJlbCwgaW50IHBvcnQsIHUzMiBzdGF0dXMpCit7IHJldHVybiAwOyB9CisKKyNlbmRpZiAvKiBERUJVRyAqLworCisvKiBmdW5jdGlvbnMgaGF2ZSB0aGUgIndyb25nIiBmaWxlbmFtZSB3aGVuIHRoZXkncmUgb3V0cHV0Li4uICovCisjZGVmaW5lIGRiZ19zdGF0dXMob3h1LCBsYWJlbCwgc3RhdHVzKSB7IFwKKwljaGFyIF9idWZbODBdOyBcCisJZGJnX3N0YXR1c19idWYoX2J1Ziwgc2l6ZW9mIF9idWYsIGxhYmVsLCBzdGF0dXMpOyBcCisJb3h1X2RiZyhveHUsICIlc1xuIiwgX2J1Zik7IFwKK30KKworI2RlZmluZSBkYmdfY21kKG94dSwgbGFiZWwsIGNvbW1hbmQpIHsgXAorCWNoYXIgX2J1Zls4MF07IFwKKwlkYmdfY29tbWFuZF9idWYoX2J1Ziwgc2l6ZW9mIF9idWYsIGxhYmVsLCBjb21tYW5kKTsgXAorCW94dV9kYmcob3h1LCAiJXNcbiIsIF9idWYpOyBcCit9CisKKyNkZWZpbmUgZGJnX3BvcnQob3h1LCBsYWJlbCwgcG9ydCwgc3RhdHVzKSB7IFwKKwljaGFyIF9idWZbODBdOyBcCisJZGJnX3BvcnRfYnVmKF9idWYsIHNpemVvZiBfYnVmLCBsYWJlbCwgcG9ydCwgc3RhdHVzKTsgXAorCW94dV9kYmcob3h1LCAiJXNcbiIsIF9idWYpOyBcCit9CisKKy8qCisgKiBNb2R1bGUgcGFyYW1ldGVycworICovCisKKy8qIEluaXRpYWwgSVJRIGxhdGVuY3k6IGZhc3RlciB0aGFuIGh3IGRlZmF1bHQgKi8KK3N0YXRpYyBpbnQgbG9nMl9pcnFfdGhyZXNoOwkJCS8qIDAgdG8gNiAqLworbW9kdWxlX3BhcmFtKGxvZzJfaXJxX3RocmVzaCwgaW50LCBTX0lSVUdPKTsKK01PRFVMRV9QQVJNX0RFU0MobG9nMl9pcnFfdGhyZXNoLCAibG9nMiBJUlEgbGF0ZW5jeSwgMS02NCBtaWNyb2ZyYW1lcyIpOworCisvKiBJbml0aWFsIHBhcmsgc2V0dGluZzogc2xvd2VyIHRoYW4gaHcgZGVmYXVsdCAqLworc3RhdGljIHVuc2lnbmVkIHBhcms7Cittb2R1bGVfcGFyYW0ocGFyaywgdWludCwgU19JUlVHTyk7CitNT0RVTEVfUEFSTV9ERVNDKHBhcmssICJwYXJrIHNldHRpbmc7IDEtMyBiYWNrLXRvLWJhY2sgYXN5bmMgcGFja2V0cyIpOworCisvKiBGb3IgZmxha2V5IGhhcmR3YXJlLCBpZ25vcmUgb3ZlcmN1cnJlbnQgaW5kaWNhdG9ycyAqLworc3RhdGljIGludCBpZ25vcmVfb2M7Cittb2R1bGVfcGFyYW0oaWdub3JlX29jLCBib29sLCBTX0lSVUdPKTsKK01PRFVMRV9QQVJNX0RFU0MoaWdub3JlX29jLCAiaWdub3JlIGJvZ3VzIGhhcmR3YXJlIG92ZXJjdXJyZW50IGluZGljYXRpb25zIik7CisKKworc3RhdGljIHZvaWQgZWhjaV93b3JrKHN0cnVjdCBveHVfaGNkICpveHUpOworc3RhdGljIGludCBveHVfaHViX2NvbnRyb2woc3RydWN0IHVzYl9oY2QgKmhjZCwKKwkJCQl1MTYgdHlwZVJlcSwgdTE2IHdWYWx1ZSwgdTE2IHdJbmRleCwKKwkJCQljaGFyICpidWYsIHUxNiB3TGVuZ3RoKTsKKworLyoKKyAqIExvY2FsIGZ1bmN0aW9ucworICovCisKKy8qIExvdyBsZXZlbCByZWFkL3dyaXRlIHJlZ2lzdGVycyBmdW5jdGlvbnMgKi8KK3N0YXRpYyBpbmxpbmUgdTMyIG94dV9yZWFkbCh2b2lkICpiYXNlLCB1MzIgcmVnKQoreworCXJldHVybiByZWFkbChiYXNlICsgcmVnKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG94dV93cml0ZWwodm9pZCAqYmFzZSwgdTMyIHJlZywgdTMyIHZhbCkKK3sKKwl3cml0ZWwodmFsLCBiYXNlICsgcmVnKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHRpbWVyX2FjdGlvbl9kb25lKHN0cnVjdCBveHVfaGNkICpveHUsCisJCQkJCWVudW0gZWhjaV90aW1lcl9hY3Rpb24gYWN0aW9uKQoreworCWNsZWFyX2JpdChhY3Rpb24sICZveHUtPmFjdGlvbnMpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdGltZXJfYWN0aW9uKHN0cnVjdCBveHVfaGNkICpveHUsCisJCQkJCWVudW0gZWhjaV90aW1lcl9hY3Rpb24gYWN0aW9uKQoreworCWlmICghdGVzdF9hbmRfc2V0X2JpdChhY3Rpb24sICZveHUtPmFjdGlvbnMpKSB7CisJCXVuc2lnbmVkIGxvbmcgdDsKKworCQlzd2l0Y2ggKGFjdGlvbikgeworCQljYXNlIFRJTUVSX0lBQV9XQVRDSERPRzoKKwkJCXQgPSBFSENJX0lBQV9KSUZGSUVTOworCQkJYnJlYWs7CisJCWNhc2UgVElNRVJfSU9fV0FUQ0hET0c6CisJCQl0ID0gRUhDSV9JT19KSUZGSUVTOworCQkJYnJlYWs7CisJCWNhc2UgVElNRVJfQVNZTkNfT0ZGOgorCQkJdCA9IEVIQ0lfQVNZTkNfSklGRklFUzsKKwkJCWJyZWFrOworCQljYXNlIFRJTUVSX0FTWU5DX1NIUklOSzoKKwkJZGVmYXVsdDoKKwkJCXQgPSBFSENJX1NIUklOS19KSUZGSUVTOworCQkJYnJlYWs7CisJCX0KKwkJdCArPSBqaWZmaWVzOworCQkvKiBhbGwgdGltaW5ncyBleGNlcHQgSUFBIHdhdGNoZG9nIGNhbiBiZSBvdmVycmlkZGVuLgorCQkgKiBhc3luYyBxdWV1ZSBTSFJJTksgb2Z0ZW4gcHJlY2VkZXMgSUFBLiAgd2hpbGUgaXQncyByZWFkeQorCQkgKiB0byBnbyBPRkYgbmVpdGhlciBjYW4gbWF0dGVyLCBhbmQgYWZ0ZXJ3YXJkcyB0aGUgSU8KKwkJICogd2F0Y2hkb2cgc3RvcHMgdW5sZXNzIHRoZXJlJ3Mgc3RpbGwgcGVyaW9kaWMgdHJhZmZpYy4KKwkJICovCisJCWlmIChhY3Rpb24gIT0gVElNRVJfSUFBX1dBVENIRE9HCisJCQkJJiYgdCA+IG94dS0+d2F0Y2hkb2cuZXhwaXJlcworCQkJCSYmIHRpbWVyX3BlbmRpbmcoJm94dS0+d2F0Y2hkb2cpKQorCQkJcmV0dXJuOworCQltb2RfdGltZXIoJm94dS0+d2F0Y2hkb2csIHQpOworCX0KK30KKworLyoKKyAqIGhhbmRzaGFrZSAtIHNwaW4gcmVhZGluZyBoYyB1bnRpbCBoYW5kc2hha2UgY29tcGxldGVzIG9yIGZhaWxzCisgKiBAcHRyOiBhZGRyZXNzIG9mIGhjIHJlZ2lzdGVyIHRvIGJlIHJlYWQKKyAqIEBtYXNrOiBiaXRzIHRvIGxvb2sgYXQgaW4gcmVzdWx0IG9mIHJlYWQKKyAqIEBkb25lOiB2YWx1ZSBvZiB0aG9zZSBiaXRzIHdoZW4gaGFuZHNoYWtlIHN1Y2NlZWRzCisgKiBAdXNlYzogdGltZW91dCBpbiBtaWNyb3NlY29uZHMKKyAqCisgKiBSZXR1cm5zIG5lZ2F0aXZlIGVycm5vLCBvciB6ZXJvIG9uIHN1Y2Nlc3MKKyAqCisgKiBTdWNjZXNzIGhhcHBlbnMgd2hlbiB0aGUgIm1hc2siIGJpdHMgaGF2ZSB0aGUgc3BlY2lmaWVkIHZhbHVlIChoYXJkd2FyZQorICogaGFuZHNoYWtlIGRvbmUpLiAgVGhlcmUgYXJlIHR3byBmYWlsdXJlIG1vZGVzOiAgInVzZWMiIGhhdmUgcGFzc2VkIChtYWpvcgorICogaGFyZHdhcmUgZmxha2VvdXQpLCBvciB0aGUgcmVnaXN0ZXIgcmVhZHMgYXMgYWxsLW9uZXMgKGhhcmR3YXJlIHJlbW92ZWQpLgorICoKKyAqIFRoYXQgbGFzdCBmYWlsdXJlIHNob3VsZF9vbmx5IGhhcHBlbiBpbiBjYXNlcyBsaWtlIHBoeXNpY2FsIGNhcmRidXMgZWplY3QKKyAqIGJlZm9yZSBkcml2ZXIgc2h1dGRvd24uIEJ1dCBpdCBhbHNvIHNlZW1zIHRvIGJlIGNhdXNlZCBieSBidWdzIGluIGNhcmRidXMKKyAqIGJyaWRnZSBzaHV0ZG93bjogIHNodXR0aW5nIGRvd24gdGhlIGJyaWRnZSBiZWZvcmUgdGhlIGRldmljZXMgdXNpbmcgaXQuCisgKi8KK3N0YXRpYyBpbnQgaGFuZHNoYWtlKHN0cnVjdCBveHVfaGNkICpveHUsIHZvaWQgX19pb21lbSAqcHRyLAorCQkJCQl1MzIgbWFzaywgdTMyIGRvbmUsIGludCB1c2VjKQoreworCXUzMiByZXN1bHQ7CisKKwlkbyB7CisJCXJlc3VsdCA9IHJlYWRsKHB0cik7CisJCWlmIChyZXN1bHQgPT0gfih1MzIpMCkJCS8qIGNhcmQgcmVtb3ZlZCAqLworCQkJcmV0dXJuIC1FTk9ERVY7CisJCXJlc3VsdCAmPSBtYXNrOworCQlpZiAocmVzdWx0ID09IGRvbmUpCisJCQlyZXR1cm4gMDsKKwkJdWRlbGF5KDEpOworCQl1c2VjLS07CisJfSB3aGlsZSAodXNlYyA+IDApOworCXJldHVybiAtRVRJTUVET1VUOworfQorCisvKiBGb3JjZSBIQyB0byBoYWx0IHN0YXRlIGZyb20gdW5rbm93biAoRUhDSSBzcGVjIHNlY3Rpb24gMi4zKSAqLworc3RhdGljIGludCBlaGNpX2hhbHQoc3RydWN0IG94dV9oY2QgKm94dSkKK3sKKwl1MzIJdGVtcCA9IHJlYWRsKCZveHUtPnJlZ3MtPnN0YXR1cyk7CisKKwkvKiBkaXNhYmxlIGFueSBpcnFzIGxlZnQgZW5hYmxlZCBieSBwcmV2aW91cyBjb2RlICovCisJd3JpdGVsKDAsICZveHUtPnJlZ3MtPmludHJfZW5hYmxlKTsKKworCWlmICgodGVtcCAmIFNUU19IQUxUKSAhPSAwKQorCQlyZXR1cm4gMDsKKworCXRlbXAgPSByZWFkbCgmb3h1LT5yZWdzLT5jb21tYW5kKTsKKwl0ZW1wICY9IH5DTURfUlVOOworCXdyaXRlbCh0ZW1wLCAmb3h1LT5yZWdzLT5jb21tYW5kKTsKKwlyZXR1cm4gaGFuZHNoYWtlKG94dSwgJm94dS0+cmVncy0+c3RhdHVzLAorCQkJICBTVFNfSEFMVCwgU1RTX0hBTFQsIDE2ICogMTI1KTsKK30KKworLyogUHV0IFRESS9BUkMgc2lsaWNvbiBpbnRvIEVIQ0kgbW9kZSAqLworc3RhdGljIHZvaWQgdGRpX3Jlc2V0KHN0cnVjdCBveHVfaGNkICpveHUpCit7CisJdTMyIF9faW9tZW0gKnJlZ19wdHI7CisJdTMyIHRtcDsKKworCXJlZ19wdHIgPSAodTMyIF9faW9tZW0gKikoKCh1OCBfX2lvbWVtICopb3h1LT5yZWdzKSArIDB4NjgpOworCXRtcCA9IHJlYWRsKHJlZ19wdHIpOworCXRtcCB8PSAweDM7CisJd3JpdGVsKHRtcCwgcmVnX3B0cik7Cit9CisKKy8qIFJlc2V0IGEgbm9uLXJ1bm5pbmcgKFNUU19IQUxUID09IDEpIGNvbnRyb2xsZXIgKi8KK3N0YXRpYyBpbnQgZWhjaV9yZXNldChzdHJ1Y3Qgb3h1X2hjZCAqb3h1KQoreworCWludAlyZXR2YWw7CisJdTMyCWNvbW1hbmQgPSByZWFkbCgmb3h1LT5yZWdzLT5jb21tYW5kKTsKKworCWNvbW1hbmQgfD0gQ01EX1JFU0VUOworCWRiZ19jbWQob3h1LCAicmVzZXQiLCBjb21tYW5kKTsKKwl3cml0ZWwoY29tbWFuZCwgJm94dS0+cmVncy0+Y29tbWFuZCk7CisJb3h1X3RvX2hjZChveHUpLT5zdGF0ZSA9IEhDX1NUQVRFX0hBTFQ7CisJb3h1LT5uZXh0X3N0YXRlY2hhbmdlID0gamlmZmllczsKKwlyZXR2YWwgPSBoYW5kc2hha2Uob3h1LCAmb3h1LT5yZWdzLT5jb21tYW5kLAorCQkJICAgIENNRF9SRVNFVCwgMCwgMjUwICogMTAwMCk7CisKKwlpZiAocmV0dmFsKQorCQlyZXR1cm4gcmV0dmFsOworCisJdGRpX3Jlc2V0KG94dSk7CisKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKiBJZGxlIHRoZSBjb250cm9sbGVyIChmcm9tIHJ1bm5pbmcpICovCitzdGF0aWMgdm9pZCBlaGNpX3F1aWVzY2Uoc3RydWN0IG94dV9oY2QgKm94dSkKK3sKKwl1MzIJdGVtcDsKKworI2lmZGVmIERFQlVHCisJaWYgKCFIQ19JU19SVU5OSU5HKG94dV90b19oY2Qob3h1KS0+c3RhdGUpKQorCQlCVUcoKTsKKyNlbmRpZgorCisJLyogd2FpdCBmb3IgYW55IHNjaGVkdWxlIGVuYWJsZXMvZGlzYWJsZXMgdG8gdGFrZSBlZmZlY3QgKi8KKwl0ZW1wID0gcmVhZGwoJm94dS0+cmVncy0+Y29tbWFuZCkgPDwgMTA7CisJdGVtcCAmPSBTVFNfQVNTIHwgU1RTX1BTUzsKKwlpZiAoaGFuZHNoYWtlKG94dSwgJm94dS0+cmVncy0+c3RhdHVzLCBTVFNfQVNTIHwgU1RTX1BTUywKKwkJCQl0ZW1wLCAxNiAqIDEyNSkgIT0gMCkgeworCQlveHVfdG9faGNkKG94dSktPnN0YXRlID0gSENfU1RBVEVfSEFMVDsKKwkJcmV0dXJuOworCX0KKworCS8qIHRoZW4gZGlzYWJsZSBhbnl0aGluZyB0aGF0J3Mgc3RpbGwgYWN0aXZlICovCisJdGVtcCA9IHJlYWRsKCZveHUtPnJlZ3MtPmNvbW1hbmQpOworCXRlbXAgJj0gfihDTURfQVNFIHwgQ01EX0lBQUQgfCBDTURfUFNFKTsKKwl3cml0ZWwodGVtcCwgJm94dS0+cmVncy0+Y29tbWFuZCk7CisKKwkvKiBoYXJkd2FyZSBjYW4gdGFrZSAxNiBtaWNyb2ZyYW1lcyB0byB0dXJuIG9mZiAuLi4gKi8KKwlpZiAoaGFuZHNoYWtlKG94dSwgJm94dS0+cmVncy0+c3RhdHVzLCBTVFNfQVNTIHwgU1RTX1BTUywKKwkJCQkwLCAxNiAqIDEyNSkgIT0gMCkgeworCQlveHVfdG9faGNkKG94dSktPnN0YXRlID0gSENfU1RBVEVfSEFMVDsKKwkJcmV0dXJuOworCX0KK30KKworc3RhdGljIGludCBjaGVja19yZXNldF9jb21wbGV0ZShzdHJ1Y3Qgb3h1X2hjZCAqb3h1LCBpbnQgaW5kZXgsCisJCQkJdTMyIF9faW9tZW0gKnN0YXR1c19yZWcsIGludCBwb3J0X3N0YXR1cykKK3sKKwlpZiAoIShwb3J0X3N0YXR1cyAmIFBPUlRfQ09OTkVDVCkpIHsKKwkJb3h1LT5yZXNldF9kb25lW2luZGV4XSA9IDA7CisJCXJldHVybiBwb3J0X3N0YXR1czsKKwl9CisKKwkvKiBpZiByZXNldCBmaW5pc2hlZCBhbmQgaXQncyBzdGlsbCBub3QgZW5hYmxlZCAtLSBoYW5kb2ZmICovCisJaWYgKCEocG9ydF9zdGF0dXMgJiBQT1JUX1BFKSkgeworCQlveHVfZGJnKG94dSwgIkZhaWxlZCB0byBlbmFibGUgcG9ydCAlZCBvbiByb290IGh1YiBUVFxuIiwKKwkJCQlpbmRleCsxKTsKKwkJcmV0dXJuIHBvcnRfc3RhdHVzOworCX0gZWxzZQorCQlveHVfZGJnKG94dSwgInBvcnQgJWQgaGlnaCBzcGVlZFxuIiwgaW5kZXggKyAxKTsKKworCXJldHVybiBwb3J0X3N0YXR1czsKK30KKworc3RhdGljIHZvaWQgZWhjaV9odWJfZGVzY3JpcHRvcihzdHJ1Y3Qgb3h1X2hjZCAqb3h1LAorCQkJCXN0cnVjdCB1c2JfaHViX2Rlc2NyaXB0b3IgKmRlc2MpCit7CisJaW50IHBvcnRzID0gSENTX05fUE9SVFMob3h1LT5oY3NfcGFyYW1zKTsKKwl1MTYgdGVtcDsKKworCWRlc2MtPmJEZXNjcmlwdG9yVHlwZSA9IDB4Mjk7CisJZGVzYy0+YlB3ck9uMlB3ckdvb2QgPSAxMDsJLyogb3h1IDEuMCwgMi4zLjkgc2F5cyAyMG1zIG1heCAqLworCWRlc2MtPmJIdWJDb250ckN1cnJlbnQgPSAwOworCisJZGVzYy0+Yk5iclBvcnRzID0gcG9ydHM7CisJdGVtcCA9IDEgKyAocG9ydHMgLyA4KTsKKwlkZXNjLT5iRGVzY0xlbmd0aCA9IDcgKyAyICogdGVtcDsKKworCS8qIHR3byBiaXRtYXBzOiAgcG9ydHMgcmVtb3ZhYmxlLCBhbmQgdXNiIDEuMCBsZWdhY3kgUG9ydFB3ckN0cmxNYXNrICovCisJbWVtc2V0KCZkZXNjLT5iaXRtYXBbMF0sIDAsIHRlbXApOworCW1lbXNldCgmZGVzYy0+Yml0bWFwW3RlbXBdLCAweGZmLCB0ZW1wKTsKKworCXRlbXAgPSAweDAwMDg7CQkJLyogcGVyLXBvcnQgb3ZlcmN1cnJlbnQgcmVwb3J0aW5nICovCisJaWYgKEhDU19QUEMob3h1LT5oY3NfcGFyYW1zKSkKKwkJdGVtcCB8PSAweDAwMDE7CQkvKiBwZXItcG9ydCBwb3dlciBjb250cm9sICovCisJZWxzZQorCQl0ZW1wIHw9IDB4MDAwMjsJCS8qIG5vIHBvd2VyIHN3aXRjaGluZyAqLworCWRlc2MtPndIdWJDaGFyYWN0ZXJpc3RpY3MgPSAoX19mb3JjZSBfX3UxNiljcHVfdG9fbGUxNih0ZW1wKTsKK30KKworCisvKiBBbGxvY2F0ZSBhbiBPWFUyMTBIUCBvbi1jaGlwIG1lbW9yeSBkYXRhIGJ1ZmZlcgorICoKKyAqIEFuIG9uLWNoaXAgbWVtb3J5IGRhdGEgYnVmZmVyIGlzIHJlcXVpcmVkIGZvciBlYWNoIE9YVTIxMEhQIFVTQiB0cmFuc2Zlci4KKyAqIEVhY2ggdHJhbnNmZXIgZGVzY3JpcHRvciBoYXMgb25lIG9yIG1vcmUgb24tY2hpcCBtZW1vcnkgZGF0YSBidWZmZXJzLgorICoKKyAqIERhdGEgYnVmZmVycyBhcmUgYWxsb2NhdGVkIGZyb20gYSBmaXggc2l6ZWQgcG9vbCBvZiBkYXRhIGJsb2Nrcy4KKyAqIFRvIG1pbmltaXNlIGZyYWdtZW50YXRpb24gYW5kIGdpdmUgcmVhc29uYWJsZSBtZW1vcnkgdXRsaXNhdGlvbiwKKyAqIGRhdGEgYnVmZmVycyBhcmUgYWxsb2NhdGVkIHdpdGggc2l6ZXMgdGhlIHBvd2VyIG9mIDIgbXVsdGlwbGVzIG9mCisgKiB0aGUgYmxvY2sgc2l6ZSwgc3RhcnRpbmcgb24gYW4gYWRkcmVzcyBhIG11bHRpcGxlIG9mIHRoZSBhbGxvY2F0ZWQgc2l6ZS4KKyAqCisgKiBGSVhNRTogY2FsbGVycyBvZiB0aGlzIGZ1bmN0aW9uIHJlcXVpcmUgYSBidWZmZXIgdG8gYmUgYWxsb2NhdGVkIGZvcgorICogbGVuPTAuIFRoaXMgaXMgYSB3YXN0ZSBvZiBvbi1jaGlwIG1lbW9yeSBhbmQgc2hvdWxkIGJlIGZpeC4gVGhlbiB0aGlzCisgKiBmdW5jdGlvbiBzaG91bGQgYmUgY2hhbmdlZCB0byBub3QgYWxsb2NhdGUgYSBidWZmZXIgZm9yIGxlbj0wLgorICovCitzdGF0aWMgaW50IG94dV9idWZfYWxsb2Moc3RydWN0IG94dV9oY2QgKm94dSwgc3RydWN0IGVoY2lfcXRkICpxdGQsIGludCBsZW4pCit7CisJaW50IG5fYmxvY2tzOwkvKiBtaW5pdW0gYmxvY2tzIG5lZWRlZCB0byBob2xkIGxlbiAqLworCWludCBhX2Jsb2NrczsJLyogYmxvY2tzIGFsbG9jYXRlZCAqLworCWludCBpLCBqOworCisJLyogRG9uJ3QgYWxsb2N0ZSBiaWdnZXIgdGhhbiBzdXBwb3J0ZWQgKi8KKwlpZiAobGVuID4gQlVGRkVSX1NJWkUgKiBCVUZGRVJfTlVNKSB7CisJCW94dV9lcnIob3h1LCAiYnVmZmVyIHRvbyBiaWcgKCVkKVxuIiwgbGVuKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJc3Bpbl9sb2NrKCZveHUtPm1lbV9sb2NrKTsKKworCS8qIE51bWJlciBvZiBibG9ja3MgbmVlZGVkIHRvIGhvbGQgbGVuICovCisJbl9ibG9ja3MgPSAobGVuICsgQlVGRkVSX1NJWkUgLSAxKSAvIEJVRkZFUl9TSVpFOworCisJLyogUm91bmQgdGhlIG51bWJlciBvZiBibG9ja3MgdXAgdG8gdGhlIHBvd2VyIG9mIDIgKi8KKwlmb3IgKGFfYmxvY2tzID0gMTsgYV9ibG9ja3MgPCBuX2Jsb2NrczsgYV9ibG9ja3MgPDw9IDEpCisJCTsKKworCS8qIEZpbmQgYSBzdWl0YWJsZSBhdmFpbGFibGUgZGF0YSBidWZmZXIgKi8KKwlmb3IgKGkgPSAwOyBpIDwgQlVGRkVSX05VTTsKKwkJCWkgKz0gbWF4KGFfYmxvY2tzLCAoaW50KW94dS0+ZGJfdXNlZFtpXSkpIHsKKworCQkvKiBDaGVjayBhbGwgdGhlIHJlcXVpcmVkIGJsb2NrcyBhcmUgYXZhaWxhYmxlICovCisJCWZvciAoaiA9IDA7IGogPCBhX2Jsb2NrczsgaisrKQorCQkJaWYgKG94dS0+ZGJfdXNlZFtpICsgal0pCisJCQkJYnJlYWs7CisKKwkJaWYgKGogIT0gYV9ibG9ja3MpCisJCQljb250aW51ZTsKKworCQkvKiBBbGxvY2F0ZSBibG9ja3MgZm91bmQhICovCisJCXF0ZC0+YnVmZmVyID0gKHZvaWQgKikgJm94dS0+bWVtLT5kYl9wb29sW2ldOworCQlxdGQtPmJ1ZmZlcl9kbWEgPSB2aXJ0X3RvX3BoeXMocXRkLT5idWZmZXIpOworCisJCXF0ZC0+cXRkX2J1ZmZlcl9sZW4gPSBCVUZGRVJfU0laRSAqIGFfYmxvY2tzOworCQlveHUtPmRiX3VzZWRbaV0gPSBhX2Jsb2NrczsKKworCQlzcGluX3VubG9jaygmb3h1LT5tZW1fbG9jayk7CisKKwkJcmV0dXJuIDA7CisJfQorCisJLyogRmFpbGVkICovCisKKwlzcGluX3VubG9jaygmb3h1LT5tZW1fbG9jayk7CisKKwlyZXR1cm4gLUVOT01FTTsKK30KKworc3RhdGljIHZvaWQgb3h1X2J1Zl9mcmVlKHN0cnVjdCBveHVfaGNkICpveHUsIHN0cnVjdCBlaGNpX3F0ZCAqcXRkKQoreworCWludCBpbmRleDsKKworCXNwaW5fbG9jaygmb3h1LT5tZW1fbG9jayk7CisKKwlpbmRleCA9IChxdGQtPmJ1ZmZlciAtICh2b2lkICopICZveHUtPm1lbS0+ZGJfcG9vbFswXSkKKwkJCQkJCQkgLyBCVUZGRVJfU0laRTsKKwlveHUtPmRiX3VzZWRbaW5kZXhdID0gMDsKKwlxdGQtPnF0ZF9idWZmZXJfbGVuID0gMDsKKwlxdGQtPmJ1ZmZlcl9kbWEgPSAwOworCXF0ZC0+YnVmZmVyID0gTlVMTDsKKworCXNwaW5fdW5sb2NrKCZveHUtPm1lbV9sb2NrKTsKKworCXJldHVybjsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGVoY2lfcXRkX2luaXQoc3RydWN0IGVoY2lfcXRkICpxdGQsIGRtYV9hZGRyX3QgZG1hKQoreworCW1lbXNldChxdGQsIDAsIHNpemVvZiAqcXRkKTsKKwlxdGQtPnF0ZF9kbWEgPSBkbWE7CisJcXRkLT5od190b2tlbiA9IGNwdV90b19sZTMyKFFURF9TVFNfSEFMVCk7CisJcXRkLT5od19uZXh0ID0gRUhDSV9MSVNUX0VORDsKKwlxdGQtPmh3X2FsdF9uZXh0ID0gRUhDSV9MSVNUX0VORDsKKwlJTklUX0xJU1RfSEVBRCgmcXRkLT5xdGRfbGlzdCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBveHVfcXRkX2ZyZWUoc3RydWN0IG94dV9oY2QgKm94dSwgc3RydWN0IGVoY2lfcXRkICpxdGQpCit7CisJaW50IGluZGV4OworCisJaWYgKHF0ZC0+YnVmZmVyKQorCQlveHVfYnVmX2ZyZWUob3h1LCBxdGQpOworCisJc3Bpbl9sb2NrKCZveHUtPm1lbV9sb2NrKTsKKworCWluZGV4ID0gcXRkIC0gJm94dS0+bWVtLT5xdGRfcG9vbFswXTsKKwlveHUtPnF0ZF91c2VkW2luZGV4XSA9IDA7CisKKwlzcGluX3VubG9jaygmb3h1LT5tZW1fbG9jayk7CisKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZWhjaV9xdGQgKmVoY2lfcXRkX2FsbG9jKHN0cnVjdCBveHVfaGNkICpveHUpCit7CisJaW50IGk7CisJc3RydWN0IGVoY2lfcXRkICpxdGQgPSBOVUxMOworCisJc3Bpbl9sb2NrKCZveHUtPm1lbV9sb2NrKTsKKworCWZvciAoaSA9IDA7IGkgPCBRVERfTlVNOyBpKyspCisJCWlmICghb3h1LT5xdGRfdXNlZFtpXSkKKwkJCWJyZWFrOworCisJaWYgKGkgPCBRVERfTlVNKSB7CisJCXF0ZCA9IChzdHJ1Y3QgZWhjaV9xdGQgKikgJm94dS0+bWVtLT5xdGRfcG9vbFtpXTsKKwkJbWVtc2V0KHF0ZCwgMCwgc2l6ZW9mICpxdGQpOworCisJCXF0ZC0+aHdfdG9rZW4gPSBjcHVfdG9fbGUzMihRVERfU1RTX0hBTFQpOworCQlxdGQtPmh3X25leHQgPSBFSENJX0xJU1RfRU5EOworCQlxdGQtPmh3X2FsdF9uZXh0ID0gRUhDSV9MSVNUX0VORDsKKwkJSU5JVF9MSVNUX0hFQUQoJnF0ZC0+cXRkX2xpc3QpOworCisJCXF0ZC0+cXRkX2RtYSA9IHZpcnRfdG9fcGh5cyhxdGQpOworCisJCW94dS0+cXRkX3VzZWRbaV0gPSAxOworCX0KKworCXNwaW5fdW5sb2NrKCZveHUtPm1lbV9sb2NrKTsKKworCXJldHVybiBxdGQ7Cit9CisKK3N0YXRpYyB2b2lkIG94dV9xaF9mcmVlKHN0cnVjdCBveHVfaGNkICpveHUsIHN0cnVjdCBlaGNpX3FoICpxaCkKK3sKKwlpbnQgaW5kZXg7CisKKwlzcGluX2xvY2soJm94dS0+bWVtX2xvY2spOworCisJaW5kZXggPSBxaCAtICZveHUtPm1lbS0+cWhfcG9vbFswXTsKKwlveHUtPnFoX3VzZWRbaW5kZXhdID0gMDsKKworCXNwaW5fdW5sb2NrKCZveHUtPm1lbV9sb2NrKTsKKworCXJldHVybjsKK30KKworc3RhdGljIHZvaWQgcWhfZGVzdHJveShzdHJ1Y3Qga3JlZiAqa3JlZikKK3sKKwlzdHJ1Y3QgZWhjaV9xaCAqcWggPSBjb250YWluZXJfb2Yoa3JlZiwgc3RydWN0IGVoY2lfcWgsIGtyZWYpOworCXN0cnVjdCBveHVfaGNkICpveHUgPSBxaC0+b3h1OworCisJLyogY2xlYW4gcXRkcyBmaXJzdCwgYW5kIGtub3cgdGhpcyBpcyBub3QgbGlua2VkICovCisJaWYgKCFsaXN0X2VtcHR5KCZxaC0+cXRkX2xpc3QpIHx8IHFoLT5xaF9uZXh0LnB0cikgeworCQlveHVfZGJnKG94dSwgInVudXNlZCBxaCBub3QgZW1wdHkhXG4iKTsKKwkJQlVHKCk7CisJfQorCWlmIChxaC0+ZHVtbXkpCisJCW94dV9xdGRfZnJlZShveHUsIHFoLT5kdW1teSk7CisJb3h1X3FoX2ZyZWUob3h1LCBxaCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZWhjaV9xaCAqb3h1X3FoX2FsbG9jKHN0cnVjdCBveHVfaGNkICpveHUpCit7CisJaW50IGk7CisJc3RydWN0IGVoY2lfcWggKnFoID0gTlVMTDsKKworCXNwaW5fbG9jaygmb3h1LT5tZW1fbG9jayk7CisKKwlmb3IgKGkgPSAwOyBpIDwgUUhFQURfTlVNOyBpKyspCisJCWlmICghb3h1LT5xaF91c2VkW2ldKQorCQkJYnJlYWs7CisKKwlpZiAoaSA8IFFIRUFEX05VTSkgeworCQlxaCA9IChzdHJ1Y3QgZWhjaV9xaCAqKSAmb3h1LT5tZW0tPnFoX3Bvb2xbaV07CisJCW1lbXNldChxaCwgMCwgc2l6ZW9mICpxaCk7CisKKwkJa3JlZl9pbml0KCZxaC0+a3JlZik7CisJCXFoLT5veHUgPSBveHU7CisJCXFoLT5xaF9kbWEgPSB2aXJ0X3RvX3BoeXMocWgpOworCQlJTklUX0xJU1RfSEVBRCgmcWgtPnF0ZF9saXN0KTsKKworCQkvKiBkdW1teSB0ZCBlbmFibGVzIHNhZmUgdXJiIHF1ZXVpbmcgKi8KKwkJcWgtPmR1bW15ID0gZWhjaV9xdGRfYWxsb2Mob3h1KTsKKwkJaWYgKHFoLT5kdW1teSA9PSBOVUxMKSB7CisJCQlveHVfZGJnKG94dSwgIm5vIGR1bW15IHRkXG4iKTsKKwkJCW94dS0+cWhfdXNlZFtpXSA9IDA7CisKKwkJCXJldHVybiBOVUxMOworCQl9CisKKwkJb3h1LT5xaF91c2VkW2ldID0gMTsKKwl9CisKKwlzcGluX3VubG9jaygmb3h1LT5tZW1fbG9jayk7CisKKwlyZXR1cm4gcWg7Cit9CisKKy8qIHRvIHNoYXJlIGEgcWggKGNwdSB0aHJlYWRzLCBvciBoYykgKi8KK3N0YXRpYyBpbmxpbmUgc3RydWN0IGVoY2lfcWggKnFoX2dldChzdHJ1Y3QgZWhjaV9xaCAqcWgpCit7CisJa3JlZl9nZXQoJnFoLT5rcmVmKTsKKwlyZXR1cm4gcWg7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBxaF9wdXQoc3RydWN0IGVoY2lfcWggKnFoKQoreworCWtyZWZfcHV0KCZxaC0+a3JlZiwgcWhfZGVzdHJveSk7Cit9CisKK3N0YXRpYyB2b2lkIG94dV9tdXJiX2ZyZWUoc3RydWN0IG94dV9oY2QgKm94dSwgc3RydWN0IG94dV9tdXJiICptdXJiKQoreworCWludCBpbmRleDsKKworCXNwaW5fbG9jaygmb3h1LT5tZW1fbG9jayk7CisKKwlpbmRleCA9IG11cmIgLSAmb3h1LT5tdXJiX3Bvb2xbMF07CisJb3h1LT5tdXJiX3VzZWRbaW5kZXhdID0gMDsKKworCXNwaW5fdW5sb2NrKCZveHUtPm1lbV9sb2NrKTsKKworCXJldHVybjsKK30KKworc3RhdGljIHN0cnVjdCBveHVfbXVyYiAqb3h1X211cmJfYWxsb2Moc3RydWN0IG94dV9oY2QgKm94dSkKKworeworCWludCBpOworCXN0cnVjdCBveHVfbXVyYiAqbXVyYiA9IE5VTEw7CisKKwlzcGluX2xvY2soJm94dS0+bWVtX2xvY2spOworCisJZm9yIChpID0gMDsgaSA8IE1VUkJfTlVNOyBpKyspCisJCWlmICghb3h1LT5tdXJiX3VzZWRbaV0pCisJCQlicmVhazsKKworCWlmIChpIDwgTVVSQl9OVU0pIHsKKwkJbXVyYiA9ICYob3h1LT5tdXJiX3Bvb2wpW2ldOworCisJCW94dS0+bXVyYl91c2VkW2ldID0gMTsKKwl9CisKKwlzcGluX3VubG9jaygmb3h1LT5tZW1fbG9jayk7CisKKwlyZXR1cm4gbXVyYjsKK30KKworLyogVGhlIHF1ZXVlIGhlYWRzIGFuZCB0cmFuc2ZlciBkZXNjcmlwdG9ycyBhcmUgbWFuYWdlZCBmcm9tIHBvb2xzIHRpZWQKKyAqIHRvIGVhY2ggb2YgdGhlICJwZXIgZGV2aWNlIiBzdHJ1Y3R1cmVzLgorICogVGhpcyBpcyB0aGUgaW5pdGlhbGlzYXRpb24gYW5kIGNsZWFudXAgY29kZS4KKyAqLworc3RhdGljIHZvaWQgZWhjaV9tZW1fY2xlYW51cChzdHJ1Y3Qgb3h1X2hjZCAqb3h1KQoreworCWtmcmVlKG94dS0+bXVyYl9wb29sKTsKKwlveHUtPm11cmJfcG9vbCA9IE5VTEw7CisKKwlpZiAob3h1LT5hc3luYykKKwkJcWhfcHV0KG94dS0+YXN5bmMpOworCW94dS0+YXN5bmMgPSBOVUxMOworCisJZGVsX3RpbWVyKCZveHUtPnVyYl90aW1lcik7CisKKwlveHUtPnBlcmlvZGljID0gTlVMTDsKKworCS8qIHNoYWRvdyBwZXJpb2RpYyB0YWJsZSAqLworCWtmcmVlKG94dS0+cHNoYWRvdyk7CisJb3h1LT5wc2hhZG93ID0gTlVMTDsKK30KKworLyogUmVtZW1iZXIgdG8gYWRkIGNsZWFudXAgY29kZSAoYWJvdmUpIGlmIHlvdSBhZGQgYW55dGhpbmcgaGVyZS4KKyAqLworc3RhdGljIGludCBlaGNpX21lbV9pbml0KHN0cnVjdCBveHVfaGNkICpveHUsIGdmcF90IGZsYWdzKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IG94dS0+cGVyaW9kaWNfc2l6ZTsgaSsrKQorCQlveHUtPm1lbS0+ZnJhbWVfbGlzdFtpXSA9IEVIQ0lfTElTVF9FTkQ7CisJZm9yIChpID0gMDsgaSA8IFFIRUFEX05VTTsgaSsrKQorCQlveHUtPnFoX3VzZWRbaV0gPSAwOworCWZvciAoaSA9IDA7IGkgPCBRVERfTlVNOyBpKyspCisJCW94dS0+cXRkX3VzZWRbaV0gPSAwOworCisJb3h1LT5tdXJiX3Bvb2wgPSBrY2FsbG9jKE1VUkJfTlVNLCBzaXplb2Yoc3RydWN0IG94dV9tdXJiKSwgZmxhZ3MpOworCWlmICghb3h1LT5tdXJiX3Bvb2wpCisJCWdvdG8gZmFpbDsKKworCWZvciAoaSA9IDA7IGkgPCBNVVJCX05VTTsgaSsrKQorCQlveHUtPm11cmJfdXNlZFtpXSA9IDA7CisKKwlveHUtPmFzeW5jID0gb3h1X3FoX2FsbG9jKG94dSk7CisJaWYgKCFveHUtPmFzeW5jKQorCQlnb3RvIGZhaWw7CisKKwlveHUtPnBlcmlvZGljID0gKF9fbGUzMiAqKSAmb3h1LT5tZW0tPmZyYW1lX2xpc3Q7CisJb3h1LT5wZXJpb2RpY19kbWEgPSB2aXJ0X3RvX3BoeXMob3h1LT5wZXJpb2RpYyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgb3h1LT5wZXJpb2RpY19zaXplOyBpKyspCisJCW94dS0+cGVyaW9kaWNbaV0gPSBFSENJX0xJU1RfRU5EOworCisJLyogc29mdHdhcmUgc2hhZG93IG9mIGhhcmR3YXJlIHRhYmxlICovCisJb3h1LT5wc2hhZG93ID0ga2NhbGxvYyhveHUtPnBlcmlvZGljX3NpemUsIHNpemVvZih2b2lkICopLCBmbGFncyk7CisJaWYgKG94dS0+cHNoYWRvdyAhPSBOVUxMKQorCQlyZXR1cm4gMDsKKworZmFpbDoKKwlveHVfZGJnKG94dSwgImNvdWxkbid0IGluaXQgbWVtb3J5XG4iKTsKKwllaGNpX21lbV9jbGVhbnVwKG94dSk7CisJcmV0dXJuIC1FTk9NRU07Cit9CisKKy8qIEZpbGwgYSBxdGQsIHJldHVybmluZyBob3cgbXVjaCBvZiB0aGUgYnVmZmVyIHdlIHdlcmUgYWJsZSB0byBxdWV1ZSB1cC4KKyAqLworc3RhdGljIGludCBxdGRfZmlsbChzdHJ1Y3QgZWhjaV9xdGQgKnF0ZCwgZG1hX2FkZHJfdCBidWYsIHNpemVfdCBsZW4sCisJCQkJaW50IHRva2VuLCBpbnQgbWF4cGFja2V0KQoreworCWludCBpLCBjb3VudDsKKwl1NjQgYWRkciA9IGJ1ZjsKKworCS8qIG9uZSBidWZmZXIgZW50cnkgcGVyIDRLIC4uLiBmaXJzdCBtaWdodCBiZSBzaG9ydCBvciB1bmFsaWduZWQgKi8KKwlxdGQtPmh3X2J1ZlswXSA9IGNwdV90b19sZTMyKCh1MzIpYWRkcik7CisJcXRkLT5od19idWZfaGlbMF0gPSBjcHVfdG9fbGUzMigodTMyKShhZGRyID4+IDMyKSk7CisJY291bnQgPSAweDEwMDAgLSAoYnVmICYgMHgwZmZmKTsJLyogcmVzdCBvZiB0aGF0IHBhZ2UgKi8KKwlpZiAobGlrZWx5KGxlbiA8IGNvdW50KSkJCS8qIC4uLiBpZmYgbmVlZGVkICovCisJCWNvdW50ID0gbGVuOworCWVsc2UgeworCQlidWYgKz0gIDB4MTAwMDsKKwkJYnVmICY9IH4weDBmZmY7CisKKwkJLyogcGVyLXF0ZCBsaW1pdDogZnJvbSAxNksgdG8gMjBLIChiZXN0IGFsaWdubWVudCkgKi8KKwkJZm9yIChpID0gMTsgY291bnQgPCBsZW4gJiYgaSA8IDU7IGkrKykgeworCQkJYWRkciA9IGJ1ZjsKKwkJCXF0ZC0+aHdfYnVmW2ldID0gY3B1X3RvX2xlMzIoKHUzMilhZGRyKTsKKwkJCXF0ZC0+aHdfYnVmX2hpW2ldID0gY3B1X3RvX2xlMzIoKHUzMikoYWRkciA+PiAzMikpOworCQkJYnVmICs9IDB4MTAwMDsKKwkJCWlmICgoY291bnQgKyAweDEwMDApIDwgbGVuKQorCQkJCWNvdW50ICs9IDB4MTAwMDsKKwkJCWVsc2UKKwkJCQljb3VudCA9IGxlbjsKKwkJfQorCisJCS8qIHNob3J0IHBhY2tldHMgbWF5IG9ubHkgdGVybWluYXRlIHRyYW5zZmVycyAqLworCQlpZiAoY291bnQgIT0gbGVuKQorCQkJY291bnQgLT0gKGNvdW50ICUgbWF4cGFja2V0KTsKKwl9CisJcXRkLT5od190b2tlbiA9IGNwdV90b19sZTMyKChjb3VudCA8PCAxNikgfCB0b2tlbik7CisJcXRkLT5sZW5ndGggPSBjb3VudDsKKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHFoX3VwZGF0ZShzdHJ1Y3Qgb3h1X2hjZCAqb3h1LAorCQkJCXN0cnVjdCBlaGNpX3FoICpxaCwgc3RydWN0IGVoY2lfcXRkICpxdGQpCit7CisJLyogd3JpdGVzIHRvIGFuIGFjdGl2ZSBvdmVybGF5IGFyZSB1bnNhZmUgKi8KKwlCVUdfT04ocWgtPnFoX3N0YXRlICE9IFFIX1NUQVRFX0lETEUpOworCisJcWgtPmh3X3F0ZF9uZXh0ID0gUVREX05FWFQocXRkLT5xdGRfZG1hKTsKKwlxaC0+aHdfYWx0X25leHQgPSBFSENJX0xJU1RfRU5EOworCisJLyogRXhjZXB0IGZvciBjb250cm9sIGVuZHBvaW50cywgd2UgbWFrZSBoYXJkd2FyZSBtYWludGFpbiBkYXRhCisJICogdG9nZ2xlIChsaWtlIE9IQ0kpIC4uLiBoZXJlIChyZSlpbml0aWFsaXplIHRoZSB0b2dnbGUgaW4gdGhlIFFILAorCSAqIGFuZCBzZXQgdGhlIHBzZXVkby10b2dnbGUgaW4gdWRldi4gT25seSB1c2JfY2xlYXJfaGFsdCgpIHdpbGwKKwkgKiBldmVyIGNsZWFyIGl0LgorCSAqLworCWlmICghKHFoLT5od19pbmZvMSAmIGNwdV90b19sZTMyKDEgPDwgMTQpKSkgeworCQl1bnNpZ25lZAlpc19vdXQsIGVwbnVtOworCisJCWlzX291dCA9ICEocXRkLT5od190b2tlbiAmIGNwdV90b19sZTMyKDEgPDwgOCkpOworCQllcG51bSA9IChsZTMyX3RvX2NwdXAoJnFoLT5od19pbmZvMSkgPj4gOCkgJiAweDBmOworCQlpZiAodW5saWtlbHkoIXVzYl9nZXR0b2dnbGUocWgtPmRldiwgZXBudW0sIGlzX291dCkpKSB7CisJCQlxaC0+aHdfdG9rZW4gJj0gfl9fY29uc3RhbnRfY3B1X3RvX2xlMzIoUVREX1RPR0dMRSk7CisJCQl1c2Jfc2V0dG9nZ2xlKHFoLT5kZXYsIGVwbnVtLCBpc19vdXQsIDEpOworCQl9CisJfQorCisJLyogSEMgbXVzdCBzZWUgbGF0ZXN0IHF0ZCBhbmQgcWggZGF0YSBiZWZvcmUgd2UgY2xlYXIgQUNUSVZFK0hBTFQgKi8KKwl3bWIoKTsKKwlxaC0+aHdfdG9rZW4gJj0gX19jb25zdGFudF9jcHVfdG9fbGUzMihRVERfVE9HR0xFIHwgUVREX1NUU19QSU5HKTsKK30KKworLyogSWYgaXQgd2VyZW4ndCBmb3IgYSBjb21tb24gc2lsaWNvbiBxdWlyayAod3JpdGluZyB0aGUgZHVtbXkgaW50byB0aGUgcWgKKyAqIG92ZXJsYXksIHNvIHFoLT5od190b2tlbiB3cm9uZ2x5IGJlY29tZXMgaW5hY3RpdmUvaGFsdGVkKSwgb25seSBmYXVsdAorICogcmVjb3ZlcnkgKGluY2x1ZGluZyB1cmIgZGVxdWV1ZSkgd291bGQgbmVlZCBzb2Z0d2FyZSBjaGFuZ2VzIHRvIGEgUUguLi4KKyAqLworc3RhdGljIHZvaWQgcWhfcmVmcmVzaChzdHJ1Y3Qgb3h1X2hjZCAqb3h1LCBzdHJ1Y3QgZWhjaV9xaCAqcWgpCit7CisJc3RydWN0IGVoY2lfcXRkICpxdGQ7CisKKwlpZiAobGlzdF9lbXB0eSgmcWgtPnF0ZF9saXN0KSkKKwkJcXRkID0gcWgtPmR1bW15OworCWVsc2UgeworCQlxdGQgPSBsaXN0X2VudHJ5KHFoLT5xdGRfbGlzdC5uZXh0LAorCQkJCXN0cnVjdCBlaGNpX3F0ZCwgcXRkX2xpc3QpOworCQkvKiBmaXJzdCBxdGQgbWF5IGFscmVhZHkgYmUgcGFydGlhbGx5IHByb2Nlc3NlZCAqLworCQlpZiAoY3B1X3RvX2xlMzIocXRkLT5xdGRfZG1hKSA9PSBxaC0+aHdfY3VycmVudCkKKwkJCXF0ZCA9IE5VTEw7CisJfQorCisJaWYgKHF0ZCkKKwkJcWhfdXBkYXRlKG94dSwgcWgsIHF0ZCk7Cit9CisKK3N0YXRpYyB2b2lkIHF0ZF9jb3B5X3N0YXR1cyhzdHJ1Y3Qgb3h1X2hjZCAqb3h1LCBzdHJ1Y3QgdXJiICp1cmIsCisJCQkJc2l6ZV90IGxlbmd0aCwgdTMyIHRva2VuKQoreworCS8qIGNvdW50IElOL09VVCBieXRlcywgbm90IFNFVFVQIChldmVuIHNob3J0IHBhY2tldHMpICovCisJaWYgKGxpa2VseShRVERfUElEKHRva2VuKSAhPSAyKSkKKwkJdXJiLT5hY3R1YWxfbGVuZ3RoICs9IGxlbmd0aCAtIFFURF9MRU5HVEgodG9rZW4pOworCisJLyogZG9uJ3QgbW9kaWZ5IGVycm9yIGNvZGVzICovCisJaWYgKHVubGlrZWx5KHVyYi0+c3RhdHVzICE9IC1FSU5QUk9HUkVTUykpCisJCXJldHVybjsKKworCS8qIGZvcmNlIGNsZWFudXAgYWZ0ZXIgc2hvcnQgcmVhZDsgbm90IGFsd2F5cyBhbiBlcnJvciAqLworCWlmICh1bmxpa2VseShJU19TSE9SVF9SRUFEKHRva2VuKSkpCisJCXVyYi0+c3RhdHVzID0gLUVSRU1PVEVJTzsKKworCS8qIHNlcmlvdXMgImNhbid0IHByb2NlZWQiIGZhdWx0cyByZXBvcnRlZCBieSB0aGUgaGFyZHdhcmUgKi8KKwlpZiAodG9rZW4gJiBRVERfU1RTX0hBTFQpIHsKKwkJaWYgKHRva2VuICYgUVREX1NUU19CQUJCTEUpIHsKKwkJCS8qIEZJWE1FICJtdXN0IiBkaXNhYmxlIGJhYmJsaW5nIGRldmljZSdzIHBvcnQgdG9vICovCisJCQl1cmItPnN0YXR1cyA9IC1FT1ZFUkZMT1c7CisJCX0gZWxzZSBpZiAodG9rZW4gJiBRVERfU1RTX01NRikgeworCQkJLyogZnMvbHMgaW50ZXJydXB0IHhmZXIgbWlzc2VkIHRoZSBjb21wbGV0ZS1zcGxpdCAqLworCQkJdXJiLT5zdGF0dXMgPSAtRVBST1RPOworCQl9IGVsc2UgaWYgKHRva2VuICYgUVREX1NUU19EQkUpIHsKKwkJCXVyYi0+c3RhdHVzID0gKFFURF9QSUQodG9rZW4pID09IDEpIC8qIElOID8gKi8KKwkJCQk/IC1FTk9TUiAgLyogaGMgY291bGRuJ3QgcmVhZCBkYXRhICovCisJCQkJOiAtRUNPTU07IC8qIGhjIGNvdWxkbid0IHdyaXRlIGRhdGEgKi8KKwkJfSBlbHNlIGlmICh0b2tlbiAmIFFURF9TVFNfWEFDVCkgeworCQkJLyogdGltZW91dCwgYmFkIGNyYywgd3JvbmcgUElELCBldGM7IHJldHJpZWQgKi8KKwkJCWlmIChRVERfQ0VSUih0b2tlbikpCisJCQkJdXJiLT5zdGF0dXMgPSAtRVBJUEU7CisJCQllbHNlIHsKKwkJCQlveHVfZGJnKG94dSwgImRldnBhdGggJXMgZXAlZCVzIDNzdHJpa2VzXG4iLAorCQkJCQl1cmItPmRldi0+ZGV2cGF0aCwKKwkJCQkJdXNiX3BpcGVlbmRwb2ludCh1cmItPnBpcGUpLAorCQkJCQl1c2JfcGlwZWluKHVyYi0+cGlwZSkgPyAiaW4iIDogIm91dCIpOworCQkJCXVyYi0+c3RhdHVzID0gLUVQUk9UTzsKKwkJCX0KKwkJLyogQ0VSUiBub256ZXJvICsgbm8gZXJyb3JzICsgaGFsdCAtLT4gc3RhbGwgKi8KKwkJfSBlbHNlIGlmIChRVERfQ0VSUih0b2tlbikpCisJCQl1cmItPnN0YXR1cyA9IC1FUElQRTsKKwkJZWxzZQkvKiB1bmtub3duICovCisJCQl1cmItPnN0YXR1cyA9IC1FUFJPVE87CisKKwkJb3h1X3ZkYmcob3h1LCAiZGV2JWQgZXAlZCVzIHF0ZCB0b2tlbiAlMDh4IC0tPiBzdGF0dXMgJWRcbiIsCisJCQl1c2JfcGlwZWRldmljZSh1cmItPnBpcGUpLAorCQkJdXNiX3BpcGVlbmRwb2ludCh1cmItPnBpcGUpLAorCQkJdXNiX3BpcGVpbih1cmItPnBpcGUpID8gImluIiA6ICJvdXQiLAorCQkJdG9rZW4sIHVyYi0+c3RhdHVzKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGVoY2lfdXJiX2RvbmUoc3RydWN0IG94dV9oY2QgKm94dSwgc3RydWN0IHVyYiAqdXJiKQorX19yZWxlYXNlcyhveHUtPmxvY2spCitfX2FjcXVpcmVzKG94dS0+bG9jaykKK3sKKwlpZiAobGlrZWx5KHVyYi0+aGNwcml2ICE9IE5VTEwpKSB7CisJCXN0cnVjdCBlaGNpX3FoCSpxaCA9IChzdHJ1Y3QgZWhjaV9xaCAqKSB1cmItPmhjcHJpdjsKKworCQkvKiBTLW1hc2sgaW4gYSBRSCBtZWFucyBpdCdzIGFuIGludGVycnVwdCB1cmIgKi8KKwkJaWYgKChxaC0+aHdfaW5mbzIgJiBfX2NvbnN0YW50X2NwdV90b19sZTMyKFFIX1NNQVNLKSkgIT0gMCkgeworCisJCQkvKiAuLi4gdXBkYXRlIGhjLXdpZGUgcGVyaW9kaWMgc3RhdHMgKGZvciB1c2JmcykgKi8KKwkJCW94dV90b19oY2Qob3h1KS0+c2VsZi5iYW5kd2lkdGhfaW50X3JlcXMtLTsKKwkJfQorCQlxaF9wdXQocWgpOworCX0KKworCXVyYi0+aGNwcml2ID0gTlVMTDsKKwlzd2l0Y2ggKHVyYi0+c3RhdHVzKSB7CisJY2FzZSAtRUlOUFJPR1JFU1M6CQkvKiBzdWNjZXNzICovCisJCXVyYi0+c3RhdHVzID0gMDsKKwlkZWZhdWx0OgkJCS8qIGZhdWx0ICovCisJCWJyZWFrOworCWNhc2UgLUVSRU1PVEVJTzoJCS8qIGZhdWx0IG9yIG5vcm1hbCAqLworCQlpZiAoISh1cmItPnRyYW5zZmVyX2ZsYWdzICYgVVJCX1NIT1JUX05PVF9PSykpCisJCQl1cmItPnN0YXR1cyA9IDA7CisJCWJyZWFrOworCWNhc2UgLUVDT05OUkVTRVQ6CQkvKiBjYW5jZWxlZCAqLworCWNhc2UgLUVOT0VOVDoKKwkJYnJlYWs7CisJfQorCisjaWZkZWYgT1hVX1VSQl9UUkFDRQorCW94dV9kYmcob3h1LCAiJXMgJXMgdXJiICVwIGVwJWQlcyBzdGF0dXMgJWQgbGVuICVkLyVkXG4iLAorCQlfX2Z1bmNfXywgdXJiLT5kZXYtPmRldnBhdGgsIHVyYiwKKwkJdXNiX3BpcGVlbmRwb2ludCh1cmItPnBpcGUpLAorCQl1c2JfcGlwZWluKHVyYi0+cGlwZSkgPyAiaW4iIDogIm91dCIsCisJCXVyYi0+c3RhdHVzLAorCQl1cmItPmFjdHVhbF9sZW5ndGgsIHVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCk7CisjZW5kaWYKKworCS8qIGNvbXBsZXRlKCkgY2FuIHJlZW50ZXIgdGhpcyBIQ0QgKi8KKwlzcGluX3VubG9jaygmb3h1LT5sb2NrKTsKKwl1c2JfaGNkX2dpdmViYWNrX3VyYihveHVfdG9faGNkKG94dSksIHVyYiwgdXJiLT5zdGF0dXMpOworCXNwaW5fbG9jaygmb3h1LT5sb2NrKTsKK30KKworc3RhdGljIHZvaWQgc3RhcnRfdW5saW5rX2FzeW5jKHN0cnVjdCBveHVfaGNkICpveHUsIHN0cnVjdCBlaGNpX3FoICpxaCk7CitzdGF0aWMgdm9pZCB1bmxpbmtfYXN5bmMoc3RydWN0IG94dV9oY2QgKm94dSwgc3RydWN0IGVoY2lfcWggKnFoKTsKKworc3RhdGljIHZvaWQgaW50cl9kZXNjaGVkdWxlKHN0cnVjdCBveHVfaGNkICpveHUsIHN0cnVjdCBlaGNpX3FoICpxaCk7CitzdGF0aWMgaW50IHFoX3NjaGVkdWxlKHN0cnVjdCBveHVfaGNkICpveHUsIHN0cnVjdCBlaGNpX3FoICpxaCk7CisKKyNkZWZpbmUgSEFMVF9CSVQgX19jb25zdGFudF9jcHVfdG9fbGUzMihRVERfU1RTX0hBTFQpCisKKy8qIFByb2Nlc3MgYW5kIGZyZWUgY29tcGxldGVkIHF0ZHMgZm9yIGEgcWgsIHJldHVybmluZyBVUkJzIHRvIGRyaXZlcnMuCisgKiBDaGFzZXMgdXAgdG8gcWgtPmh3X2N1cnJlbnQuICBSZXR1cm5zIG51bWJlciBvZiBjb21wbGV0aW9ucyBjYWxsZWQsCisgKiBpbmRpY2F0aW5nIGhvdyBtdWNoICJyZWFsIiB3b3JrIHdlIGRpZC4KKyAqLworc3RhdGljIHVuc2lnbmVkIHFoX2NvbXBsZXRpb25zKHN0cnVjdCBveHVfaGNkICpveHUsIHN0cnVjdCBlaGNpX3FoICpxaCkKK3sKKwlzdHJ1Y3QgZWhjaV9xdGQgKmxhc3QgPSBOVUxMLCAqZW5kID0gcWgtPmR1bW15OworCXN0cnVjdCBsaXN0X2hlYWQgKmVudHJ5LCAqdG1wOworCWludCBzdG9wcGVkOworCXVuc2lnbmVkIGNvdW50ID0gMDsKKwlpbnQgZG9fc3RhdHVzID0gMDsKKwl1OCBzdGF0ZTsKKwlzdHJ1Y3Qgb3h1X211cmIgKm11cmIgPSBOVUxMOworCisJaWYgKHVubGlrZWx5KGxpc3RfZW1wdHkoJnFoLT5xdGRfbGlzdCkpKQorCQlyZXR1cm4gY291bnQ7CisKKwkvKiBjb21wbGV0aW9ucyAob3IgdGFza3Mgb24gb3RoZXIgY3B1cykgbXVzdCBuZXZlciBjbG9iYmVyIEhBTFQKKwkgKiB0aWxsIHdlJ3ZlIGdvbmUgdGhyb3VnaCBhbmQgY2xlYW5lZCBldmVyeXRoaW5nIHVwLCBldmVuIHdoZW4KKwkgKiB0aGV5IGFkZCB1cmJzIHRvIHRoaXMgcWgncyBxdWV1ZSBvciBtYXJrIHRoZW0gZm9yIHVubGlua2luZy4KKwkgKgorCSAqIE5PVEU6ICB1bmxpbmtpbmcgZXhwZWN0cyB0byBiZSBkb25lIGluIHF1ZXVlIG9yZGVyLgorCSAqLworCXN0YXRlID0gcWgtPnFoX3N0YXRlOworCXFoLT5xaF9zdGF0ZSA9IFFIX1NUQVRFX0NPTVBMRVRJTkc7CisJc3RvcHBlZCA9IChzdGF0ZSA9PSBRSF9TVEFURV9JRExFKTsKKworCS8qIHJlbW92ZSBkZS1hY3RpdmF0ZWQgUVREcyBmcm9tIGZyb250IG9mIHF1ZXVlLgorCSAqIGFmdGVyIGZhdWx0cyAoaW5jbHVkaW5nIHNob3J0IHJlYWRzKSwgY2xlYW51cCB0aGlzIHVyYgorCSAqIHRoZW4gbGV0IHRoZSBxdWV1ZSBhZHZhbmNlLgorCSAqIGlmIHF1ZXVlIGlzIHN0b3BwZWQsIGhhbmRsZXMgdW5saW5rcy4KKwkgKi8KKwlsaXN0X2Zvcl9lYWNoX3NhZmUoZW50cnksIHRtcCwgJnFoLT5xdGRfbGlzdCkgeworCQlzdHJ1Y3QgZWhjaV9xdGQJKnF0ZDsKKwkJc3RydWN0IHVyYiAqdXJiOworCQl1MzIgdG9rZW4gPSAwOworCisJCXF0ZCA9IGxpc3RfZW50cnkoZW50cnksIHN0cnVjdCBlaGNpX3F0ZCwgcXRkX2xpc3QpOworCQl1cmIgPSBxdGQtPnVyYjsKKworCQkvKiBDbGVhbiB1cCBhbnkgc3RhdGUgZnJvbSBwcmV2aW91cyBRVEQgLi4uKi8KKwkJaWYgKGxhc3QpIHsKKwkJCWlmIChsaWtlbHkobGFzdC0+dXJiICE9IHVyYikpIHsKKwkJCQlpZiAobGFzdC0+dXJiLT5jb21wbGV0ZSA9PSBOVUxMKSB7CisJCQkJCW11cmIgPSAoc3RydWN0IG94dV9tdXJiICopIGxhc3QtPnVyYjsKKwkJCQkJbGFzdC0+dXJiID0gbXVyYi0+bWFpbjsKKwkJCQkJaWYgKG11cmItPmxhc3QpIHsKKwkJCQkJCWVoY2lfdXJiX2RvbmUob3h1LCBsYXN0LT51cmIpOworCQkJCQkJY291bnQrKzsKKwkJCQkJfQorCQkJCQlveHVfbXVyYl9mcmVlKG94dSwgbXVyYik7CisJCQkJfSBlbHNlIHsKKwkJCQkJZWhjaV91cmJfZG9uZShveHUsIGxhc3QtPnVyYik7CisJCQkJCWNvdW50Kys7CisJCQkJfQorCQkJfQorCQkJb3h1X3F0ZF9mcmVlKG94dSwgbGFzdCk7CisJCQlsYXN0ID0gTlVMTDsKKwkJfQorCisJCS8qIGlnbm9yZSB1cmJzIHN1Ym1pdHRlZCBkdXJpbmcgY29tcGxldGlvbnMgd2UgcmVwb3J0ZWQgKi8KKwkJaWYgKHF0ZCA9PSBlbmQpCisJCQlicmVhazsKKworCQkvKiBoYXJkd2FyZSBjb3BpZXMgcXRkIG91dCBvZiBxaCBvdmVybGF5ICovCisJCXJtYigpOworCQl0b2tlbiA9IGxlMzJfdG9fY3B1KHF0ZC0+aHdfdG9rZW4pOworCisJCS8qIGFsd2F5cyBjbGVhbiB1cCBxdGRzIHRoZSBoYyBkZS1hY3RpdmF0ZWQgKi8KKwkJaWYgKCh0b2tlbiAmIFFURF9TVFNfQUNUSVZFKSA9PSAwKSB7CisKKwkJCWlmICgodG9rZW4gJiBRVERfU1RTX0hBTFQpICE9IDApIHsKKwkJCQlzdG9wcGVkID0gMTsKKworCQkJLyogbWFnaWMgZHVtbXkgZm9yIHNvbWUgc2hvcnQgcmVhZHM7IHFoIHdvbid0IGFkdmFuY2UuCisJCQkgKiB0aGF0IHNpbGljb24gcXVpcmsgY2FuIGtpY2sgaW4gd2l0aCB0aGlzIGR1bW15IHRvby4KKwkJCSAqLworCQkJfSBlbHNlIGlmIChJU19TSE9SVF9SRUFEKHRva2VuKSAmJgorCQkJCQkhKHF0ZC0+aHdfYWx0X25leHQgJiBFSENJX0xJU1RfRU5EKSkgeworCQkJCXN0b3BwZWQgPSAxOworCQkJCWdvdG8gaGFsdDsKKwkJCX0KKworCQkvKiBzdG9wIHNjYW5uaW5nIHdoZW4gd2UgcmVhY2ggcXRkcyB0aGUgaGMgaXMgdXNpbmcgKi8KKwkJfSBlbHNlIGlmIChsaWtlbHkoIXN0b3BwZWQgJiYKKwkJCQlIQ19JU19SVU5OSU5HKG94dV90b19oY2Qob3h1KS0+c3RhdGUpKSkgeworCQkJYnJlYWs7CisKKwkJfSBlbHNlIHsKKwkJCXN0b3BwZWQgPSAxOworCisJCQlpZiAodW5saWtlbHkoIUhDX0lTX1JVTk5JTkcob3h1X3RvX2hjZChveHUpLT5zdGF0ZSkpKQorCQkJCXVyYi0+c3RhdHVzID0gLUVTSFVURE9XTjsKKworCQkJLyogaWdub3JlIGFjdGl2ZSB1cmJzIHVubGVzcyBzb21lIHByZXZpb3VzIHF0ZAorCQkJICogZm9yIHRoZSB1cmIgZmF1bHRlZCAoaW5jbHVkaW5nIHNob3J0IHJlYWQpIG9yCisJCQkgKiBpdHMgdXJiIHdhcyBjYW5jZWxlZC4gIHdlIG1heSBwYXRjaCBxaCBvciBxdGRzLgorCQkJICovCisJCQlpZiAobGlrZWx5KHVyYi0+c3RhdHVzID09IC1FSU5QUk9HUkVTUykpCisJCQkJY29udGludWU7CisKKwkJCS8qIGlzc3VlIHN0YXR1cyBhZnRlciBzaG9ydCBjb250cm9sIHJlYWRzICovCisJCQlpZiAodW5saWtlbHkoZG9fc3RhdHVzICE9IDApCisJCQkJCSYmIFFURF9QSUQodG9rZW4pID09IDAgLyogT1VUICovKSB7CisJCQkJZG9fc3RhdHVzID0gMDsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJLyogdG9rZW4gaW4gb3ZlcmxheSBtYXkgYmUgbW9zdCBjdXJyZW50ICovCisJCQlpZiAoc3RhdGUgPT0gUUhfU1RBVEVfSURMRQorCQkJCQkmJiBjcHVfdG9fbGUzMihxdGQtPnF0ZF9kbWEpCisJCQkJCQk9PSBxaC0+aHdfY3VycmVudCkKKwkJCQl0b2tlbiA9IGxlMzJfdG9fY3B1KHFoLT5od190b2tlbik7CisKKwkJCS8qIGZvcmNlIGhhbHQgZm9yIHVubGlua2VkIG9yIGJsb2NrZWQgcWgsIHNvIHdlJ2xsCisJCQkgKiBwYXRjaCB0aGUgcWggbGF0ZXIgYW5kIHNvIHRoYXQgY29tcGxldGlvbnMgY2FuJ3QKKwkJCSAqIGFjdGl2YXRlIGl0IHdoaWxlIHdlICJrbm93IiBpdCdzIHN0b3BwZWQuCisJCQkgKi8KKwkJCWlmICgoSEFMVF9CSVQgJiBxaC0+aHdfdG9rZW4pID09IDApIHsKK2hhbHQ6CisJCQkJcWgtPmh3X3Rva2VuIHw9IEhBTFRfQklUOworCQkJCXdtYigpOworCQkJfQorCQl9CisKKwkJLyogUmVtb3ZlIGl0IGZyb20gdGhlIHF1ZXVlICovCisJCXF0ZF9jb3B5X3N0YXR1cyhveHUsIHVyYi0+Y29tcGxldGUgPworCQkJCQl1cmIgOiAoKHN0cnVjdCBveHVfbXVyYiAqKSB1cmIpLT5tYWluLAorCQkJCXF0ZC0+bGVuZ3RoLCB0b2tlbik7CisJCWlmICgodXNiX3BpcGVpbihxdGQtPnVyYi0+cGlwZSkpICYmCisJCQkJKE5VTEwgIT0gcXRkLT50cmFuc2Zlcl9idWZmZXIpKQorCQkJbWVtY3B5KHF0ZC0+dHJhbnNmZXJfYnVmZmVyLCBxdGQtPmJ1ZmZlciwgcXRkLT5sZW5ndGgpOworCQlkb19zdGF0dXMgPSAodXJiLT5zdGF0dXMgPT0gLUVSRU1PVEVJTykKKwkJCQkmJiB1c2JfcGlwZWNvbnRyb2wodXJiLT5waXBlKTsKKworCQlpZiAoc3RvcHBlZCAmJiBxdGQtPnF0ZF9saXN0LnByZXYgIT0gJnFoLT5xdGRfbGlzdCkgeworCQkJbGFzdCA9IGxpc3RfZW50cnkocXRkLT5xdGRfbGlzdC5wcmV2LAorCQkJCQlzdHJ1Y3QgZWhjaV9xdGQsIHF0ZF9saXN0KTsKKwkJCWxhc3QtPmh3X25leHQgPSBxdGQtPmh3X25leHQ7CisJCX0KKwkJbGlzdF9kZWwoJnF0ZC0+cXRkX2xpc3QpOworCQlsYXN0ID0gcXRkOworCX0KKworCS8qIGxhc3QgdXJiJ3MgY29tcGxldGlvbiBtaWdodCBzdGlsbCBuZWVkIGNhbGxpbmcgKi8KKwlpZiAobGlrZWx5KGxhc3QgIT0gTlVMTCkpIHsKKwkJaWYgKGxhc3QtPnVyYi0+Y29tcGxldGUgPT0gTlVMTCkgeworCQkJbXVyYiA9IChzdHJ1Y3Qgb3h1X211cmIgKikgbGFzdC0+dXJiOworCQkJbGFzdC0+dXJiID0gbXVyYi0+bWFpbjsKKwkJCWlmIChtdXJiLT5sYXN0KSB7CisJCQkJZWhjaV91cmJfZG9uZShveHUsIGxhc3QtPnVyYik7CisJCQkJY291bnQrKzsKKwkJCX0KKwkJCW94dV9tdXJiX2ZyZWUob3h1LCBtdXJiKTsKKwkJfSBlbHNlIHsKKwkJCWVoY2lfdXJiX2RvbmUob3h1LCBsYXN0LT51cmIpOworCQkJY291bnQrKzsKKwkJfQorCQlveHVfcXRkX2ZyZWUob3h1LCBsYXN0KTsKKwl9CisKKwkvKiByZXN0b3JlIG9yaWdpbmFsIHN0YXRlOyBjYWxsZXIgbXVzdCB1bmxpbmsgb3IgcmVsaW5rICovCisJcWgtPnFoX3N0YXRlID0gc3RhdGU7CisKKwkvKiBiZSBzdXJlIHRoZSBoYXJkd2FyZSdzIGRvbmUgd2l0aCB0aGUgcWggYmVmb3JlIHJlZnJlc2hpbmcKKwkgKiBpdCBhZnRlciBmYXVsdCBjbGVhbnVwLCBvciByZWNvdmVyaW5nIGZyb20gc2lsaWNvbiB3cm9uZ2x5CisJICogb3ZlcmxheWluZyB0aGUgZHVtbXkgcXRkICh3aGljaCByZWR1Y2VzIERNQSBjaGF0dGVyKS4KKwkgKi8KKwlpZiAoc3RvcHBlZCAhPSAwIHx8IHFoLT5od19xdGRfbmV4dCA9PSBFSENJX0xJU1RfRU5EKSB7CisJCXN3aXRjaCAoc3RhdGUpIHsKKwkJY2FzZSBRSF9TVEFURV9JRExFOgorCQkJcWhfcmVmcmVzaChveHUsIHFoKTsKKwkJCWJyZWFrOworCQljYXNlIFFIX1NUQVRFX0xJTktFRDoKKwkJCS8qIHNob3VsZCBiZSByYXJlIGZvciBwZXJpb2RpYyB0cmFuc2ZlcnMsCisJCQkgKiBleGNlcHQgbWF5YmUgaGlnaCBiYW5kd2lkdGggLi4uCisJCQkgKi8KKwkJCWlmICgoX19jb25zdGFudF9jcHVfdG9fbGUzMihRSF9TTUFTSykKKwkJCQkJJiBxaC0+aHdfaW5mbzIpICE9IDApIHsKKwkJCQlpbnRyX2Rlc2NoZWR1bGUob3h1LCBxaCk7CisJCQkJKHZvaWQpIHFoX3NjaGVkdWxlKG94dSwgcWgpOworCQkJfSBlbHNlCisJCQkJdW5saW5rX2FzeW5jKG94dSwgcWgpOworCQkJYnJlYWs7CisJCS8qIG90aGVyd2lzZSwgdW5saW5rIGFscmVhZHkgc3RhcnRlZCAqLworCQl9CisJfQorCisJcmV0dXJuIGNvdW50OworfQorCisvKiBIaWdoIGJhbmR3aWR0aCBtdWx0aXBsaWVyLCBhcyBlbmNvZGVkIGluIGhpZ2hzcGVlZCBlbmRwb2ludCBkZXNjcmlwdG9ycyAqLworI2RlZmluZSBoYl9tdWx0KHdNYXhQYWNrZXRTaXplKQkJKDEgKyAoKCh3TWF4UGFja2V0U2l6ZSkgPj4gMTEpICYgMHgwMykpCisvKiAuLi4gYW5kIHBhY2tldCBzaXplLCBmb3IgYW55IGtpbmQgb2YgZW5kcG9pbnQgZGVzY3JpcHRvciAqLworI2RlZmluZSBtYXhfcGFja2V0KHdNYXhQYWNrZXRTaXplKQkoKHdNYXhQYWNrZXRTaXplKSAmIDB4MDdmZikKKworLyogUmV2ZXJzZSBvZiBxaF91cmJfdHJhbnNhY3Rpb246IGZyZWUgYSBsaXN0IG9mIFREcy4KKyAqIHVzZWQgZm9yIGNsZWFudXAgYWZ0ZXIgZXJyb3JzLCBiZWZvcmUgSEMgc2VlcyBhbiBVUkIncyBURHMuCisgKi8KK3N0YXRpYyB2b2lkIHF0ZF9saXN0X2ZyZWUoc3RydWN0IG94dV9oY2QgKm94dSwKKwkJCQlzdHJ1Y3QgdXJiICp1cmIsIHN0cnVjdCBsaXN0X2hlYWQgKnF0ZF9saXN0KQoreworCXN0cnVjdCBsaXN0X2hlYWQgKmVudHJ5LCAqdGVtcDsKKworCWxpc3RfZm9yX2VhY2hfc2FmZShlbnRyeSwgdGVtcCwgcXRkX2xpc3QpIHsKKwkJc3RydWN0IGVoY2lfcXRkCSpxdGQ7CisKKwkJcXRkID0gbGlzdF9lbnRyeShlbnRyeSwgc3RydWN0IGVoY2lfcXRkLCBxdGRfbGlzdCk7CisJCWxpc3RfZGVsKCZxdGQtPnF0ZF9saXN0KTsKKwkJb3h1X3F0ZF9mcmVlKG94dSwgcXRkKTsKKwl9Cit9CisKKy8qIENyZWF0ZSBhIGxpc3Qgb2YgZmlsbGVkIHF0ZHMgZm9yIHRoaXMgVVJCOyB3b24ndCBsaW5rIGludG8gcWguCisgKi8KK3N0YXRpYyBzdHJ1Y3QgbGlzdF9oZWFkICpxaF91cmJfdHJhbnNhY3Rpb24oc3RydWN0IG94dV9oY2QgKm94dSwKKwkJCQkJCXN0cnVjdCB1cmIgKnVyYiwKKwkJCQkJCXN0cnVjdCBsaXN0X2hlYWQgKmhlYWQsCisJCQkJCQlnZnBfdCBmbGFncykKK3sKKwlzdHJ1Y3QgZWhjaV9xdGQJKnF0ZCwgKnF0ZF9wcmV2OworCWRtYV9hZGRyX3QgYnVmOworCWludCBsZW4sIG1heHBhY2tldDsKKwlpbnQgaXNfaW5wdXQ7CisJdTMyIHRva2VuOworCXZvaWQgKnRyYW5zZmVyX2J1ZiA9IE5VTEw7CisJaW50IHJldDsKKworCS8qCisJICogVVJCcyBtYXAgdG8gc2VxdWVuY2VzIG9mIFFURHM6IG9uZSBsb2dpY2FsIHRyYW5zYWN0aW9uCisJICovCisJcXRkID0gZWhjaV9xdGRfYWxsb2Mob3h1KTsKKwlpZiAodW5saWtlbHkoIXF0ZCkpCisJCXJldHVybiBOVUxMOworCWxpc3RfYWRkX3RhaWwoJnF0ZC0+cXRkX2xpc3QsIGhlYWQpOworCXF0ZC0+dXJiID0gdXJiOworCisJdG9rZW4gPSBRVERfU1RTX0FDVElWRTsKKwl0b2tlbiB8PSAoRUhDSV9UVU5FX0NFUlIgPDwgMTApOworCS8qIGZvciBzcGxpdCB0cmFuc2FjdGlvbnMsIFNwbGl0WFN0YXRlIGluaXRpYWxpemVkIHRvIHplcm8gKi8KKworCWxlbiA9IHVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aDsKKwlpc19pbnB1dCA9IHVzYl9waXBlaW4odXJiLT5waXBlKTsKKwlpZiAoIXVyYi0+dHJhbnNmZXJfYnVmZmVyICYmIHVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCAmJiBpc19pbnB1dCkKKwkJdXJiLT50cmFuc2Zlcl9idWZmZXIgPSBwaHlzX3RvX3ZpcnQodXJiLT50cmFuc2Zlcl9kbWEpOworCisJaWYgKHVzYl9waXBlY29udHJvbCh1cmItPnBpcGUpKSB7CisJCS8qIFNFVFVQIHBpZCAqLworCQlyZXQgPSBveHVfYnVmX2FsbG9jKG94dSwgcXRkLCBzaXplb2Yoc3RydWN0IHVzYl9jdHJscmVxdWVzdCkpOworCQlpZiAocmV0KQorCQkJZ290byBjbGVhbnVwOworCisJCXF0ZF9maWxsKHF0ZCwgcXRkLT5idWZmZXJfZG1hLCBzaXplb2Yoc3RydWN0IHVzYl9jdHJscmVxdWVzdCksCisJCQkJdG9rZW4gfCAoMiAvKiAic2V0dXAiICovIDw8IDgpLCA4KTsKKwkJbWVtY3B5KHF0ZC0+YnVmZmVyLCBxdGQtPnVyYi0+c2V0dXBfcGFja2V0LAorCQkJCXNpemVvZihzdHJ1Y3QgdXNiX2N0cmxyZXF1ZXN0KSk7CisKKwkJLyogLi4uIGFuZCBhbHdheXMgYXQgbGVhc3Qgb25lIG1vcmUgcGlkICovCisJCXRva2VuIF49IFFURF9UT0dHTEU7CisJCXF0ZF9wcmV2ID0gcXRkOworCQlxdGQgPSBlaGNpX3F0ZF9hbGxvYyhveHUpOworCQlpZiAodW5saWtlbHkoIXF0ZCkpCisJCQlnb3RvIGNsZWFudXA7CisJCXF0ZC0+dXJiID0gdXJiOworCQlxdGRfcHJldi0+aHdfbmV4dCA9IFFURF9ORVhUKHF0ZC0+cXRkX2RtYSk7CisJCWxpc3RfYWRkX3RhaWwoJnF0ZC0+cXRkX2xpc3QsIGhlYWQpOworCisJCS8qIGZvciB6ZXJvIGxlbmd0aCBEQVRBIHN0YWdlcywgU1RBVFVTIGlzIGFsd2F5cyBJTiAqLworCQlpZiAobGVuID09IDApCisJCQl0b2tlbiB8PSAoMSAvKiAiaW4iICovIDw8IDgpOworCX0KKworCS8qCisJICogRGF0YSB0cmFuc2ZlciBzdGFnZTogYnVmZmVyIHNldHVwCisJICovCisKKwlyZXQgPSBveHVfYnVmX2FsbG9jKG94dSwgcXRkLCBsZW4pOworCWlmIChyZXQpCisJCWdvdG8gY2xlYW51cDsKKworCWJ1ZiA9IHF0ZC0+YnVmZmVyX2RtYTsKKwl0cmFuc2Zlcl9idWYgPSB1cmItPnRyYW5zZmVyX2J1ZmZlcjsKKworCWlmICghaXNfaW5wdXQpCisJCW1lbWNweShxdGQtPmJ1ZmZlciwgcXRkLT51cmItPnRyYW5zZmVyX2J1ZmZlciwgbGVuKTsKKworCWlmIChpc19pbnB1dCkKKwkJdG9rZW4gfD0gKDEgLyogImluIiAqLyA8PCA4KTsKKwkvKiBlbHNlIGl0J3MgYWxyZWFkeSBpbml0dGVkIHRvICJvdXQiIHBpZCAoMCA8PCA4KSAqLworCisJbWF4cGFja2V0ID0gbWF4X3BhY2tldCh1c2JfbWF4cGFja2V0KHVyYi0+ZGV2LCB1cmItPnBpcGUsICFpc19pbnB1dCkpOworCisJLyoKKwkgKiBidWZmZXIgZ2V0cyB3cmFwcGVkIGluIG9uZSBvciBtb3JlIHF0ZHM7CisJICogbGFzdCBvbmUgbWF5IGJlICJzaG9ydCIgKGluY2x1ZGluZyB6ZXJvIGxlbikKKwkgKiBhbmQgbWF5IHNlcnZlIGFzIGEgY29udHJvbCBzdGF0dXMgYWNrCisJICovCisJZm9yICg7OykgeworCQlpbnQgdGhpc19xdGRfbGVuOworCisJCXRoaXNfcXRkX2xlbiA9IHF0ZF9maWxsKHF0ZCwgYnVmLCBsZW4sIHRva2VuLCBtYXhwYWNrZXQpOworCQlxdGQtPnRyYW5zZmVyX2J1ZmZlciA9IHRyYW5zZmVyX2J1ZjsKKwkJbGVuIC09IHRoaXNfcXRkX2xlbjsKKwkJYnVmICs9IHRoaXNfcXRkX2xlbjsKKwkJdHJhbnNmZXJfYnVmICs9IHRoaXNfcXRkX2xlbjsKKwkJaWYgKGlzX2lucHV0KQorCQkJcXRkLT5od19hbHRfbmV4dCA9IG94dS0+YXN5bmMtPmh3X2FsdF9uZXh0OworCisJCS8qIHFoIG1ha2VzIGNvbnRyb2wgcGFja2V0cyB1c2UgcXRkIHRvZ2dsZTsgbWF5YmUgc3dpdGNoIGl0ICovCisJCWlmICgobWF4cGFja2V0ICYgKHRoaXNfcXRkX2xlbiArIChtYXhwYWNrZXQgLSAxKSkpID09IDApCisJCQl0b2tlbiBePSBRVERfVE9HR0xFOworCisJCWlmIChsaWtlbHkobGVuIDw9IDApKQorCQkJYnJlYWs7CisKKwkJcXRkX3ByZXYgPSBxdGQ7CisJCXF0ZCA9IGVoY2lfcXRkX2FsbG9jKG94dSk7CisJCWlmICh1bmxpa2VseSghcXRkKSkKKwkJCWdvdG8gY2xlYW51cDsKKwkJaWYgKGxpa2VseShsZW4gPiAwKSkgeworCQkJcmV0ID0gb3h1X2J1Zl9hbGxvYyhveHUsIHF0ZCwgbGVuKTsKKwkJCWlmIChyZXQpCisJCQkJZ290byBjbGVhbnVwOworCQl9CisJCXF0ZC0+dXJiID0gdXJiOworCQlxdGRfcHJldi0+aHdfbmV4dCA9IFFURF9ORVhUKHF0ZC0+cXRkX2RtYSk7CisJCWxpc3RfYWRkX3RhaWwoJnF0ZC0+cXRkX2xpc3QsIGhlYWQpOworCX0KKworCS8qIHVubGVzcyB0aGUgYnVsay9pbnRlcnJ1cHQgY2FsbGVyIHdhbnRzIGEgY2hhbmNlIHRvIGNsZWFuCisJICogdXAgYWZ0ZXIgc2hvcnQgcmVhZHMsIGhjIHNob3VsZCBhZHZhbmNlIHFoIHBhc3QgdGhpcyB1cmIKKwkgKi8KKwlpZiAobGlrZWx5KCh1cmItPnRyYW5zZmVyX2ZsYWdzICYgVVJCX1NIT1JUX05PVF9PSykgPT0gMAorCQkJCXx8IHVzYl9waXBlY29udHJvbCh1cmItPnBpcGUpKSkKKwkJcXRkLT5od19hbHRfbmV4dCA9IEVIQ0lfTElTVF9FTkQ7CisKKwkvKgorCSAqIGNvbnRyb2wgcmVxdWVzdHMgbWF5IG5lZWQgYSB0ZXJtaW5hdGluZyBkYXRhICJzdGF0dXMiIGFjazsKKwkgKiBidWxrIG9uZXMgbWF5IG5lZWQgYSB0ZXJtaW5hdGluZyBzaG9ydCBwYWNrZXQgKHplcm8gbGVuZ3RoKS4KKwkgKi8KKwlpZiAobGlrZWx5KHVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCAhPSAwKSkgeworCQlpbnQJb25lX21vcmUgPSAwOworCisJCWlmICh1c2JfcGlwZWNvbnRyb2wodXJiLT5waXBlKSkgeworCQkJb25lX21vcmUgPSAxOworCQkJdG9rZW4gXj0gMHgwMTAwOwkvKiAiaW4iIDwtLT4gIm91dCIgICovCisJCQl0b2tlbiB8PSBRVERfVE9HR0xFOwkvKiBmb3JjZSBEQVRBMSAqLworCQl9IGVsc2UgaWYgKHVzYl9waXBlYnVsayh1cmItPnBpcGUpCisJCQkJJiYgKHVyYi0+dHJhbnNmZXJfZmxhZ3MgJiBVUkJfWkVST19QQUNLRVQpCisJCQkJJiYgISh1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggJSBtYXhwYWNrZXQpKSB7CisJCQlvbmVfbW9yZSA9IDE7CisJCX0KKwkJaWYgKG9uZV9tb3JlKSB7CisJCQlxdGRfcHJldiA9IHF0ZDsKKwkJCXF0ZCA9IGVoY2lfcXRkX2FsbG9jKG94dSk7CisJCQlpZiAodW5saWtlbHkoIXF0ZCkpCisJCQkJZ290byBjbGVhbnVwOworCQkJcXRkLT51cmIgPSB1cmI7CisJCQlxdGRfcHJldi0+aHdfbmV4dCA9IFFURF9ORVhUKHF0ZC0+cXRkX2RtYSk7CisJCQlsaXN0X2FkZF90YWlsKCZxdGQtPnF0ZF9saXN0LCBoZWFkKTsKKworCQkJLyogbmV2ZXIgYW55IGRhdGEgaW4gc3VjaCBwYWNrZXRzICovCisJCQlxdGRfZmlsbChxdGQsIDAsIDAsIHRva2VuLCAwKTsKKwkJfQorCX0KKworCS8qIGJ5IGRlZmF1bHQsIGVuYWJsZSBpbnRlcnJ1cHQgb24gdXJiIGNvbXBsZXRpb24gKi8KKwkJcXRkLT5od190b2tlbiB8PSBfX2NvbnN0YW50X2NwdV90b19sZTMyKFFURF9JT0MpOworCXJldHVybiBoZWFkOworCitjbGVhbnVwOgorCXF0ZF9saXN0X2ZyZWUob3h1LCB1cmIsIGhlYWQpOworCXJldHVybiBOVUxMOworfQorCisvKiBFYWNoIFFIIGhvbGRzIGEgcXRkIGxpc3Q7IGEgUUggaXMgdXNlZCBmb3IgZXZlcnl0aGluZyBleGNlcHQgaXNvLgorICoKKyAqIEZvciBpbnRlcnJ1cHQgdXJicywgdGhlIHNjaGVkdWxlciBtdXN0IHNldCB0aGUgbWljcm9mcmFtZSBzY2hlZHVsaW5nCisgKiBtYXNrKHMpIGVhY2ggdGltZSB0aGUgUUggZ2V0cyBzY2hlZHVsZWQuICBGb3IgaGlnaHNwZWVkLCB0aGF0J3MKKyAqIGp1c3Qgb25lIG1pY3JvZnJhbWUgaW4gdGhlIHMtbWFzay4gIEZvciBzcGxpdCBpbnRlcnJ1cHQgdHJhbnNhY3Rpb25zCisgKiB0aGVyZSBhcmUgYWRkaXRpb25hbCBjb21wbGljYXRpb25zOiBjLW1hc2ssIG1heWJlIEZTVE5zLgorICovCitzdGF0aWMgc3RydWN0IGVoY2lfcWggKnFoX21ha2Uoc3RydWN0IG94dV9oY2QgKm94dSwKKwkJCQlzdHJ1Y3QgdXJiICp1cmIsIGdmcF90IGZsYWdzKQoreworCXN0cnVjdCBlaGNpX3FoICpxaCA9IG94dV9xaF9hbGxvYyhveHUpOworCXUzMiBpbmZvMSA9IDAsIGluZm8yID0gMDsKKwlpbnQgaXNfaW5wdXQsIHR5cGU7CisJaW50IG1heHAgPSAwOworCisJaWYgKCFxaCkKKwkJcmV0dXJuIHFoOworCisJLyoKKwkgKiBpbml0IGVuZHBvaW50L2RldmljZSBkYXRhIGZvciB0aGlzIFFICisJICovCisJaW5mbzEgfD0gdXNiX3BpcGVlbmRwb2ludCh1cmItPnBpcGUpIDw8IDg7CisJaW5mbzEgfD0gdXNiX3BpcGVkZXZpY2UodXJiLT5waXBlKSA8PCAwOworCisJaXNfaW5wdXQgPSB1c2JfcGlwZWluKHVyYi0+cGlwZSk7CisJdHlwZSA9IHVzYl9waXBldHlwZSh1cmItPnBpcGUpOworCW1heHAgPSB1c2JfbWF4cGFja2V0KHVyYi0+ZGV2LCB1cmItPnBpcGUsICFpc19pbnB1dCk7CisKKwkvKiBDb21wdXRlIGludGVycnVwdCBzY2hlZHVsaW5nIHBhcmFtZXRlcnMganVzdCBvbmNlLCBhbmQgc2F2ZS4KKwkgKiAtIGFsbG93aW5nIGZvciBoaWdoIGJhbmR3aWR0aCwgaG93IG1hbnkgbnNlYy91ZnJhbWUgYXJlIHVzZWQ/CisJICogLSBzcGxpdCB0cmFuc2FjdGlvbnMgbmVlZCBhIHNlY29uZCBDU1BMSVQgdWZyYW1lOyBzYW1lIHF1ZXN0aW9uCisJICogLSBzcGxpdHMgYWxzbyBuZWVkIGEgc2NoZWR1bGUgZ2FwIChmb3IgZnVsbC9sb3cgc3BlZWQgSS9PKQorCSAqIC0gcWggaGFzIGEgcG9sbGluZyBpbnRlcnZhbAorCSAqCisJICogRm9yIGNvbnRyb2wvYnVsayByZXF1ZXN0cywgdGhlIEhDIG9yIFRUIGhhbmRsZXMgdGhlc2UuCisJICovCisJaWYgKHR5cGUgPT0gUElQRV9JTlRFUlJVUFQpIHsKKwkJcWgtPnVzZWNzID0gTlNfVE9fVVModXNiX2NhbGNfYnVzX3RpbWUoVVNCX1NQRUVEX0hJR0gsCisJCQkJCQkJCWlzX2lucHV0LCAwLAorCQkJCWhiX211bHQobWF4cCkgKiBtYXhfcGFja2V0KG1heHApKSk7CisJCXFoLT5zdGFydCA9IE5PX0ZSQU1FOworCisJCWlmICh1cmItPmRldi0+c3BlZWQgPT0gVVNCX1NQRUVEX0hJR0gpIHsKKwkJCXFoLT5jX3VzZWNzID0gMDsKKwkJCXFoLT5nYXBfdWYgPSAwOworCisJCQlxaC0+cGVyaW9kID0gdXJiLT5pbnRlcnZhbCA+PiAzOworCQkJaWYgKHFoLT5wZXJpb2QgPT0gMCAmJiB1cmItPmludGVydmFsICE9IDEpIHsKKwkJCQkvKiBOT1RFIGludGVydmFsIDIgb3IgNCB1ZnJhbWVzIGNvdWxkIHdvcmsuCisJCQkJICogQnV0IGludGVydmFsIDEgc2NoZWR1bGluZyBpcyBzaW1wbGVyLCBhbmQKKwkJCQkgKiBpbmNsdWRlcyBoaWdoIGJhbmR3aWR0aC4KKwkJCQkgKi8KKwkJCQlkYmcoImludHIgcGVyaW9kICVkIHVmcmFtZXMsIE5ZRVQhIiwKKwkJCQkJCXVyYi0+aW50ZXJ2YWwpOworCQkJCWdvdG8gZG9uZTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXN0cnVjdCB1c2JfdHQJKnR0ID0gdXJiLT5kZXYtPnR0OworCQkJaW50CQl0aGlua190aW1lOworCisJCQkvKiBnYXAgaXMgZihGUy9MUyB0cmFuc2ZlciB0aW1lcykgKi8KKwkJCXFoLT5nYXBfdWYgPSAxICsgdXNiX2NhbGNfYnVzX3RpbWUodXJiLT5kZXYtPnNwZWVkLAorCQkJCQlpc19pbnB1dCwgMCwgbWF4cCkgLyAoMTI1ICogMTAwMCk7CisKKwkJCS8qIEZJWE1FIHRoaXMganVzdCBhcHByb3hpbWF0ZXMgU1BMSVQvQ1NQTElUIHRpbWVzICovCisJCQlpZiAoaXNfaW5wdXQpIHsJCS8qIFNQTElULCBnYXAsIENTUExJVCtEQVRBICovCisJCQkJcWgtPmNfdXNlY3MgPSBxaC0+dXNlY3MgKyBIU19VU0VDUygwKTsKKwkJCQlxaC0+dXNlY3MgPSBIU19VU0VDUygxKTsKKwkJCX0gZWxzZSB7CQkvKiBTUExJVCtEQVRBLCBnYXAsIENTUExJVCAqLworCQkJCXFoLT51c2VjcyArPSBIU19VU0VDUygxKTsKKwkJCQlxaC0+Y191c2VjcyA9IEhTX1VTRUNTKDApOworCQkJfQorCisJCQl0aGlua190aW1lID0gdHQgPyB0dC0+dGhpbmtfdGltZSA6IDA7CisJCQlxaC0+dHRfdXNlY3MgPSBOU19UT19VUyh0aGlua190aW1lICsKKwkJCQkJdXNiX2NhbGNfYnVzX3RpbWUodXJiLT5kZXYtPnNwZWVkLAorCQkJCQlpc19pbnB1dCwgMCwgbWF4X3BhY2tldChtYXhwKSkpOworCQkJcWgtPnBlcmlvZCA9IHVyYi0+aW50ZXJ2YWw7CisJCX0KKwl9CisKKwkvKiBzdXBwb3J0IGZvciB0dCBzY2hlZHVsaW5nLCBhbmQgYWNjZXNzIHRvIHRvZ2dsZXMgKi8KKwlxaC0+ZGV2ID0gdXJiLT5kZXY7CisKKwkvKiB1c2luZyBUVD8gKi8KKwlzd2l0Y2ggKHVyYi0+ZGV2LT5zcGVlZCkgeworCWNhc2UgVVNCX1NQRUVEX0xPVzoKKwkJaW5mbzEgfD0gKDEgPDwgMTIpOwkvKiBFUFMgImxvdyIgKi8KKwkJLyogRkFMTCBUSFJPVUdIICovCisKKwljYXNlIFVTQl9TUEVFRF9GVUxMOgorCQkvKiBFUFMgMCBtZWFucyAiZnVsbCIgKi8KKwkJaWYgKHR5cGUgIT0gUElQRV9JTlRFUlJVUFQpCisJCQlpbmZvMSB8PSAoRUhDSV9UVU5FX1JMX1RUIDw8IDI4KTsKKwkJaWYgKHR5cGUgPT0gUElQRV9DT05UUk9MKSB7CisJCQlpbmZvMSB8PSAoMSA8PCAyNyk7CS8qIGZvciBUVCAqLworCQkJaW5mbzEgfD0gMSA8PCAxNDsJLyogdG9nZ2xlIGZyb20gcXRkICovCisJCX0KKwkJaW5mbzEgfD0gbWF4cCA8PCAxNjsKKworCQlpbmZvMiB8PSAoRUhDSV9UVU5FX01VTFRfVFQgPDwgMzApOworCQlpbmZvMiB8PSB1cmItPmRldi0+dHRwb3J0IDw8IDIzOworCisJCS8qIE5PVEU6ICBpZiAoUElQRV9JTlRFUlJVUFQpIHsgc2NoZWR1bGVyIHNldHMgYy1tYXNrIH0gKi8KKworCQlicmVhazsKKworCWNhc2UgVVNCX1NQRUVEX0hJR0g6CQkvKiBubyBUVCBpbnZvbHZlZCAqLworCQlpbmZvMSB8PSAoMiA8PCAxMik7CS8qIEVQUyAiaGlnaCIgKi8KKwkJaWYgKHR5cGUgPT0gUElQRV9DT05UUk9MKSB7CisJCQlpbmZvMSB8PSAoRUhDSV9UVU5FX1JMX0hTIDw8IDI4KTsKKwkJCWluZm8xIHw9IDY0IDw8IDE2OwkvKiB1c2IyIGZpeGVkIG1heHBhY2tldCAqLworCQkJaW5mbzEgfD0gMSA8PCAxNDsJLyogdG9nZ2xlIGZyb20gcXRkICovCisJCQlpbmZvMiB8PSAoRUhDSV9UVU5FX01VTFRfSFMgPDwgMzApOworCQl9IGVsc2UgaWYgKHR5cGUgPT0gUElQRV9CVUxLKSB7CisJCQlpbmZvMSB8PSAoRUhDSV9UVU5FX1JMX0hTIDw8IDI4KTsKKwkJCWluZm8xIHw9IDUxMiA8PCAxNjsJLyogdXNiMiBmaXhlZCBtYXhwYWNrZXQgKi8KKwkJCWluZm8yIHw9IChFSENJX1RVTkVfTVVMVF9IUyA8PCAzMCk7CisJCX0gZWxzZSB7CQkvKiBQSVBFX0lOVEVSUlVQVCAqLworCQkJaW5mbzEgfD0gbWF4X3BhY2tldChtYXhwKSA8PCAxNjsKKwkJCWluZm8yIHw9IGhiX211bHQobWF4cCkgPDwgMzA7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGJnKCJib2d1cyBkZXYgJXAgc3BlZWQgJWQiLCB1cmItPmRldiwgdXJiLT5kZXYtPnNwZWVkKTsKK2RvbmU6CisJCXFoX3B1dChxaCk7CisJCXJldHVybiBOVUxMOworCX0KKworCS8qIE5PVEU6ICBpZiAoUElQRV9JTlRFUlJVUFQpIHsgc2NoZWR1bGVyIHNldHMgcy1tYXNrIH0gKi8KKworCS8qIGluaXQgYXMgbGl2ZSwgdG9nZ2xlIGNsZWFyLCBhZHZhbmNlIHRvIGR1bW15ICovCisJcWgtPnFoX3N0YXRlID0gUUhfU1RBVEVfSURMRTsKKwlxaC0+aHdfaW5mbzEgPSBjcHVfdG9fbGUzMihpbmZvMSk7CisJcWgtPmh3X2luZm8yID0gY3B1X3RvX2xlMzIoaW5mbzIpOworCXVzYl9zZXR0b2dnbGUodXJiLT5kZXYsIHVzYl9waXBlZW5kcG9pbnQodXJiLT5waXBlKSwgIWlzX2lucHV0LCAxKTsKKwlxaF9yZWZyZXNoKG94dSwgcWgpOworCXJldHVybiBxaDsKK30KKworLyogTW92ZSBxaCAoYW5kIGl0cyBxdGRzKSBvbnRvIGFzeW5jIHF1ZXVlOyBtYXliZSBlbmFibGUgcXVldWUuCisgKi8KK3N0YXRpYyB2b2lkIHFoX2xpbmtfYXN5bmMoc3RydWN0IG94dV9oY2QgKm94dSwgc3RydWN0IGVoY2lfcWggKnFoKQoreworCV9fbGUzMiBkbWEgPSBRSF9ORVhUKHFoLT5xaF9kbWEpOworCXN0cnVjdCBlaGNpX3FoICpoZWFkOworCisJLyogKHJlKXN0YXJ0IHRoZSBhc3luYyBzY2hlZHVsZT8gKi8KKwloZWFkID0gb3h1LT5hc3luYzsKKwl0aW1lcl9hY3Rpb25fZG9uZShveHUsIFRJTUVSX0FTWU5DX09GRik7CisJaWYgKCFoZWFkLT5xaF9uZXh0LnFoKSB7CisJCXUzMgljbWQgPSByZWFkbCgmb3h1LT5yZWdzLT5jb21tYW5kKTsKKworCQlpZiAoIShjbWQgJiBDTURfQVNFKSkgeworCQkJLyogaW4gY2FzZSBhIGNsZWFyIG9mIENNRF9BU0UgZGlkbid0IHRha2UgeWV0ICovCisJCQkodm9pZCloYW5kc2hha2Uob3h1LCAmb3h1LT5yZWdzLT5zdGF0dXMsCisJCQkJCVNUU19BU1MsIDAsIDE1MCk7CisJCQljbWQgfD0gQ01EX0FTRSB8IENNRF9SVU47CisJCQl3cml0ZWwoY21kLCAmb3h1LT5yZWdzLT5jb21tYW5kKTsKKwkJCW94dV90b19oY2Qob3h1KS0+c3RhdGUgPSBIQ19TVEFURV9SVU5OSU5HOworCQkJLyogcG9zdGVkIHdyaXRlIG5lZWQgbm90IGJlIGtub3duIHRvIEhDIHlldCAuLi4gKi8KKwkJfQorCX0KKworCS8qIGNsZWFyIGhhbHQgYW5kL29yIHRvZ2dsZTsgYW5kIG1heWJlIHJlY292ZXIgZnJvbSBzaWxpY29uIHF1aXJrICovCisJaWYgKHFoLT5xaF9zdGF0ZSA9PSBRSF9TVEFURV9JRExFKQorCQlxaF9yZWZyZXNoKG94dSwgcWgpOworCisJLyogc3BsaWNlIHJpZ2h0IGFmdGVyIHN0YXJ0ICovCisJcWgtPnFoX25leHQgPSBoZWFkLT5xaF9uZXh0OworCXFoLT5od19uZXh0ID0gaGVhZC0+aHdfbmV4dDsKKwl3bWIoKTsKKworCWhlYWQtPnFoX25leHQucWggPSBxaDsKKwloZWFkLT5od19uZXh0ID0gZG1hOworCisJcWgtPnFoX3N0YXRlID0gUUhfU1RBVEVfTElOS0VEOworCS8qIHF0ZCBjb21wbGV0aW9ucyByZXBvcnRlZCBsYXRlciBieSBpbnRlcnJ1cHQgKi8KK30KKworI2RlZmluZQlRSF9BRERSX01BU0sJX19jb25zdGFudF9jcHVfdG9fbGUzMigweDdmKQorCisvKgorICogRm9yIGNvbnRyb2wvYnVsay9pbnRlcnJ1cHQsIHJldHVybiBRSCB3aXRoIHRoZXNlIFREcyBhcHBlbmRlZC4KKyAqIEFsbG9jYXRlcyBhbmQgaW5pdGlhbGl6ZXMgdGhlIFFIIGlmIG5lY2Vzc2FyeS4KKyAqIFJldHVybnMgbnVsbCBpZiBpdCBjYW4ndCBhbGxvY2F0ZSBhIFFIIGl0IG5lZWRzIHRvLgorICogSWYgdGhlIFFIIGhhcyBURHMgKHVyYnMpIGFscmVhZHksIHRoYXQncyBncmVhdC4KKyAqLworc3RhdGljIHN0cnVjdCBlaGNpX3FoICpxaF9hcHBlbmRfdGRzKHN0cnVjdCBveHVfaGNkICpveHUsCisJCQkJc3RydWN0IHVyYiAqdXJiLCBzdHJ1Y3QgbGlzdF9oZWFkICpxdGRfbGlzdCwKKwkJCQlpbnQgZXBudW0sIHZvaWQJKipwdHIpCit7CisJc3RydWN0IGVoY2lfcWggKnFoID0gTlVMTDsKKworCXFoID0gKHN0cnVjdCBlaGNpX3FoICopICpwdHI7CisJaWYgKHVubGlrZWx5KHFoID09IE5VTEwpKSB7CisJCS8qIGNhbid0IHNsZWVwIGhlcmUsIHdlIGhhdmUgb3h1LT5sb2NrLi4uICovCisJCXFoID0gcWhfbWFrZShveHUsIHVyYiwgR0ZQX0FUT01JQyk7CisJCSpwdHIgPSBxaDsKKwl9CisJaWYgKGxpa2VseShxaCAhPSBOVUxMKSkgeworCQlzdHJ1Y3QgZWhjaV9xdGQJKnF0ZDsKKworCQlpZiAodW5saWtlbHkobGlzdF9lbXB0eShxdGRfbGlzdCkpKQorCQkJcXRkID0gTlVMTDsKKwkJZWxzZQorCQkJcXRkID0gbGlzdF9lbnRyeShxdGRfbGlzdC0+bmV4dCwgc3RydWN0IGVoY2lfcXRkLAorCQkJCQlxdGRfbGlzdCk7CisKKwkJLyogY29udHJvbCBxaCBtYXkgbmVlZCBwYXRjaGluZyAuLi4gKi8KKwkJaWYgKHVubGlrZWx5KGVwbnVtID09IDApKSB7CisKKwkJCS8qIHVzYl9yZXNldF9kZXZpY2UoKSBicmllZmx5IHJldmVydHMgdG8gYWRkcmVzcyAwICovCisJCQlpZiAodXNiX3BpcGVkZXZpY2UodXJiLT5waXBlKSA9PSAwKQorCQkJCXFoLT5od19pbmZvMSAmPSB+UUhfQUREUl9NQVNLOworCQl9CisKKwkJLyoganVzdCBvbmUgd2F5IHRvIHF1ZXVlIHJlcXVlc3RzOiBzd2FwIHdpdGggdGhlIGR1bW15IHF0ZC4KKwkJICogb25seSBoYyBvciBxaF9yZWZyZXNoKCkgZXZlciBtb2RpZnkgdGhlIG92ZXJsYXkuCisJCSAqLworCQlpZiAobGlrZWx5KHF0ZCAhPSBOVUxMKSkgeworCQkJc3RydWN0IGVoY2lfcXRkCSpkdW1teTsKKwkJCWRtYV9hZGRyX3QgZG1hOworCQkJX19sZTMyIHRva2VuOworCisJCQkvKiB0byBhdm9pZCByYWNpbmcgdGhlIEhDLCB1c2UgdGhlIGR1bW15IHRkIGluc3RlYWQgb2YKKwkJCSAqIHRoZSBmaXJzdCB0ZCBvZiBvdXIgbGlzdCAoYmVjb21lcyBuZXcgZHVtbXkpLiAgYm90aAorCQkJICogdGRzIHN0YXkgZGVhY3RpdmF0ZWQgdW50aWwgd2UncmUgZG9uZSwgd2hlbiB0aGUKKwkJCSAqIEhDIGlzIGFsbG93ZWQgdG8gZmV0Y2ggdGhlIG9sZCBkdW1teSAoNC4xMC4yKS4KKwkJCSAqLworCQkJdG9rZW4gPSBxdGQtPmh3X3Rva2VuOworCQkJcXRkLT5od190b2tlbiA9IEhBTFRfQklUOworCQkJd21iKCk7CisJCQlkdW1teSA9IHFoLT5kdW1teTsKKworCQkJZG1hID0gZHVtbXktPnF0ZF9kbWE7CisJCQkqZHVtbXkgPSAqcXRkOworCQkJZHVtbXktPnF0ZF9kbWEgPSBkbWE7CisKKwkJCWxpc3RfZGVsKCZxdGQtPnF0ZF9saXN0KTsKKwkJCWxpc3RfYWRkKCZkdW1teS0+cXRkX2xpc3QsIHF0ZF9saXN0KTsKKwkJCWxpc3Rfc3BsaWNlKHF0ZF9saXN0LCBxaC0+cXRkX2xpc3QucHJldik7CisKKwkJCWVoY2lfcXRkX2luaXQocXRkLCBxdGQtPnF0ZF9kbWEpOworCQkJcWgtPmR1bW15ID0gcXRkOworCisJCQkvKiBoYyBtdXN0IHNlZSB0aGUgbmV3IGR1bW15IGF0IGxpc3QgZW5kICovCisJCQlkbWEgPSBxdGQtPnF0ZF9kbWE7CisJCQlxdGQgPSBsaXN0X2VudHJ5KHFoLT5xdGRfbGlzdC5wcmV2LAorCQkJCQlzdHJ1Y3QgZWhjaV9xdGQsIHF0ZF9saXN0KTsKKwkJCXF0ZC0+aHdfbmV4dCA9IFFURF9ORVhUKGRtYSk7CisKKwkJCS8qIGxldCB0aGUgaGMgcHJvY2VzcyB0aGVzZSBuZXh0IHF0ZHMgKi8KKwkJCWR1bW15LT5od190b2tlbiA9ICh0b2tlbiAmIH4oMHg4MCkpOworCQkJd21iKCk7CisJCQlkdW1teS0+aHdfdG9rZW4gPSB0b2tlbjsKKworCQkJdXJiLT5oY3ByaXYgPSBxaF9nZXQocWgpOworCQl9CisJfQorCXJldHVybiBxaDsKK30KKworc3RhdGljIGludCBzdWJtaXRfYXN5bmMoc3RydWN0IG94dV9oY2QJKm94dSwgc3RydWN0IHVyYiAqdXJiLAorCQkJc3RydWN0IGxpc3RfaGVhZCAqcXRkX2xpc3QsIGdmcF90IG1lbV9mbGFncykKK3sKKwlzdHJ1Y3QgZWhjaV9xdGQJKnF0ZDsKKwlpbnQgZXBudW07CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgZWhjaV9xaCAqcWggPSBOVUxMOworCWludCByYyA9IDA7CisKKwlxdGQgPSBsaXN0X2VudHJ5KHF0ZF9saXN0LT5uZXh0LCBzdHJ1Y3QgZWhjaV9xdGQsIHF0ZF9saXN0KTsKKwllcG51bSA9IHVyYi0+ZXAtPmRlc2MuYkVuZHBvaW50QWRkcmVzczsKKworI2lmZGVmIE9YVV9VUkJfVFJBQ0UKKwlveHVfZGJnKG94dSwgIiVzICVzIHVyYiAlcCBlcCVkJXMgbGVuICVkLCBxdGQgJXAgW3FoICVwXVxuIiwKKwkJX19mdW5jX18sIHVyYi0+ZGV2LT5kZXZwYXRoLCB1cmIsCisJCWVwbnVtICYgMHgwZiwgKGVwbnVtICYgVVNCX0RJUl9JTikgPyAiaW4iIDogIm91dCIsCisJCXVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCwKKwkJcXRkLCB1cmItPmVwLT5oY3ByaXYpOworI2VuZGlmCisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmb3h1LT5sb2NrLCBmbGFncyk7CisJaWYgKHVubGlrZWx5KCF0ZXN0X2JpdChIQ0RfRkxBR19IV19BQ0NFU1NJQkxFLAorCQkJICAgICAgICZveHVfdG9faGNkKG94dSktPmZsYWdzKSkpIHsKKwkJcmMgPSAtRVNIVVRET1dOOworCQlnb3RvIGRvbmU7CisJfQorCisJcWggPSBxaF9hcHBlbmRfdGRzKG94dSwgdXJiLCBxdGRfbGlzdCwgZXBudW0sICZ1cmItPmVwLT5oY3ByaXYpOworCWlmICh1bmxpa2VseShxaCA9PSBOVUxMKSkgeworCQlyYyA9IC1FTk9NRU07CisJCWdvdG8gZG9uZTsKKwl9CisKKwkvKiBDb250cm9sL2J1bGsgb3BlcmF0aW9ucyB0aHJvdWdoIFRUcyBkb24ndCBuZWVkIHNjaGVkdWxpbmcsCisJICogdGhlIEhDIGFuZCBUVCBoYW5kbGUgaXQgd2hlbiB0aGUgVFQgaGFzIGEgYnVmZmVyIHJlYWR5LgorCSAqLworCWlmIChsaWtlbHkocWgtPnFoX3N0YXRlID09IFFIX1NUQVRFX0lETEUpKQorCQlxaF9saW5rX2FzeW5jKG94dSwgcWhfZ2V0KHFoKSk7Citkb25lOgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm94dS0+bG9jaywgZmxhZ3MpOworCWlmICh1bmxpa2VseShxaCA9PSBOVUxMKSkKKwkJcXRkX2xpc3RfZnJlZShveHUsIHVyYiwgcXRkX2xpc3QpOworCXJldHVybiByYzsKK30KKworLyogVGhlIGFzeW5jIHFoIGZvciB0aGUgcXRkcyBiZWluZyByZWNsYWltZWQgYXJlIG5vdyB1bmxpbmtlZCBmcm9tIHRoZSBIQyAqLworCitzdGF0aWMgdm9pZCBlbmRfdW5saW5rX2FzeW5jKHN0cnVjdCBveHVfaGNkICpveHUpCit7CisJc3RydWN0IGVoY2lfcWggKnFoID0gb3h1LT5yZWNsYWltOworCXN0cnVjdCBlaGNpX3FoICpuZXh0OworCisJdGltZXJfYWN0aW9uX2RvbmUob3h1LCBUSU1FUl9JQUFfV0FUQ0hET0cpOworCisJcWgtPnFoX3N0YXRlID0gUUhfU1RBVEVfSURMRTsKKwlxaC0+cWhfbmV4dC5xaCA9IE5VTEw7CisJcWhfcHV0KHFoKTsJCQkvKiByZWZjb3VudCBmcm9tIHJlY2xhaW0gKi8KKworCS8qIG90aGVyIHVubGluayhzKSBtYXkgYmUgcGVuZGluZyAoaW4gUUhfU1RBVEVfVU5MSU5LX1dBSVQpICovCisJbmV4dCA9IHFoLT5yZWNsYWltOworCW94dS0+cmVjbGFpbSA9IG5leHQ7CisJb3h1LT5yZWNsYWltX3JlYWR5ID0gMDsKKwlxaC0+cmVjbGFpbSA9IE5VTEw7CisKKwlxaF9jb21wbGV0aW9ucyhveHUsIHFoKTsKKworCWlmICghbGlzdF9lbXB0eSgmcWgtPnF0ZF9saXN0KQorCQkJJiYgSENfSVNfUlVOTklORyhveHVfdG9faGNkKG94dSktPnN0YXRlKSkKKwkJcWhfbGlua19hc3luYyhveHUsIHFoKTsKKwllbHNlIHsKKwkJcWhfcHV0KHFoKTsJCS8qIHJlZmNvdW50IGZyb20gYXN5bmMgbGlzdCAqLworCisJCS8qIGl0J3Mgbm90IGZyZWUgdG8gdHVybiB0aGUgYXN5bmMgc2NoZWR1bGUgb24vb2ZmOyBsZWF2ZSBpdAorCQkgKiBhY3RpdmUgYnV0IGlkbGUgZm9yIGEgd2hpbGUgb25jZSBpdCBlbXB0aWVzLgorCQkgKi8KKwkJaWYgKEhDX0lTX1JVTk5JTkcob3h1X3RvX2hjZChveHUpLT5zdGF0ZSkKKwkJCQkmJiBveHUtPmFzeW5jLT5xaF9uZXh0LnFoID09IE5VTEwpCisJCQl0aW1lcl9hY3Rpb24ob3h1LCBUSU1FUl9BU1lOQ19PRkYpOworCX0KKworCWlmIChuZXh0KSB7CisJCW94dS0+cmVjbGFpbSA9IE5VTEw7CisJCXN0YXJ0X3VubGlua19hc3luYyhveHUsIG5leHQpOworCX0KK30KKworLyogbWFrZXMgc3VyZSB0aGUgYXN5bmMgcWggd2lsbCBiZWNvbWUgaWRsZSAqLworLyogY2FsbGVyIG11c3Qgb3duIG94dS0+bG9jayAqLworCitzdGF0aWMgdm9pZCBzdGFydF91bmxpbmtfYXN5bmMoc3RydWN0IG94dV9oY2QgKm94dSwgc3RydWN0IGVoY2lfcWggKnFoKQoreworCWludCBjbWQgPSByZWFkbCgmb3h1LT5yZWdzLT5jb21tYW5kKTsKKwlzdHJ1Y3QgZWhjaV9xaCAqcHJldjsKKworI2lmZGVmIERFQlVHCisJYXNzZXJ0X3NwaW5fbG9ja2VkKCZveHUtPmxvY2spOworCWlmIChveHUtPnJlY2xhaW0gfHwgKHFoLT5xaF9zdGF0ZSAhPSBRSF9TVEFURV9MSU5LRUQKKwkJCQkmJiBxaC0+cWhfc3RhdGUgIT0gUUhfU1RBVEVfVU5MSU5LX1dBSVQpKQorCQlCVUcoKTsKKyNlbmRpZgorCisJLyogc3RvcCBhc3luYyBzY2hlZHVsZSByaWdodCBub3c/ICovCisJaWYgKHVubGlrZWx5KHFoID09IG94dS0+YXN5bmMpKSB7CisJCS8qIGNhbid0IGdldCBoZXJlIHdpdGhvdXQgU1RTX0FTUyBzZXQgKi8KKwkJaWYgKG94dV90b19oY2Qob3h1KS0+c3RhdGUgIT0gSENfU1RBVEVfSEFMVAorCQkJCSYmICFveHUtPnJlY2xhaW0pIHsKKwkJCS8qIC4uLiBhbmQgQ01EX0lBQUQgY2xlYXIgKi8KKwkJCXdyaXRlbChjbWQgJiB+Q01EX0FTRSwgJm94dS0+cmVncy0+Y29tbWFuZCk7CisJCQl3bWIoKTsKKwkJCS8qIGhhbmRzaGFrZSBsYXRlciwgaWYgd2UgbmVlZCB0byAqLworCQkJdGltZXJfYWN0aW9uX2RvbmUob3h1LCBUSU1FUl9BU1lOQ19PRkYpOworCQl9CisJCXJldHVybjsKKwl9CisKKwlxaC0+cWhfc3RhdGUgPSBRSF9TVEFURV9VTkxJTks7CisJb3h1LT5yZWNsYWltID0gcWggPSBxaF9nZXQocWgpOworCisJcHJldiA9IG94dS0+YXN5bmM7CisJd2hpbGUgKHByZXYtPnFoX25leHQucWggIT0gcWgpCisJCXByZXYgPSBwcmV2LT5xaF9uZXh0LnFoOworCisJcHJldi0+aHdfbmV4dCA9IHFoLT5od19uZXh0OworCXByZXYtPnFoX25leHQgPSBxaC0+cWhfbmV4dDsKKwl3bWIoKTsKKworCWlmICh1bmxpa2VseShveHVfdG9faGNkKG94dSktPnN0YXRlID09IEhDX1NUQVRFX0hBTFQpKSB7CisJCS8qIGlmICh1bmxpa2VseShxaC0+cmVjbGFpbSAhPSAwKSkKKwkJICoJdGhpcyB3aWxsIHJlY3Vyc2UsIHByb2JhYmx5IG5vdCBtdWNoCisJCSAqLworCQllbmRfdW5saW5rX2FzeW5jKG94dSk7CisJCXJldHVybjsKKwl9CisKKwlveHUtPnJlY2xhaW1fcmVhZHkgPSAwOworCWNtZCB8PSBDTURfSUFBRDsKKwl3cml0ZWwoY21kLCAmb3h1LT5yZWdzLT5jb21tYW5kKTsKKwkodm9pZCkgcmVhZGwoJm94dS0+cmVncy0+Y29tbWFuZCk7CisJdGltZXJfYWN0aW9uKG94dSwgVElNRVJfSUFBX1dBVENIRE9HKTsKK30KKworc3RhdGljIHZvaWQgc2Nhbl9hc3luYyhzdHJ1Y3Qgb3h1X2hjZCAqb3h1KQoreworCXN0cnVjdCBlaGNpX3FoICpxaDsKKwllbnVtIGVoY2lfdGltZXJfYWN0aW9uIGFjdGlvbiA9IFRJTUVSX0lPX1dBVENIRE9HOworCisJaWYgKCErKyhveHUtPnN0YW1wKSkKKwkJb3h1LT5zdGFtcCsrOworCXRpbWVyX2FjdGlvbl9kb25lKG94dSwgVElNRVJfQVNZTkNfU0hSSU5LKTsKK3Jlc2NhbjoKKwlxaCA9IG94dS0+YXN5bmMtPnFoX25leHQucWg7CisJaWYgKGxpa2VseShxaCAhPSBOVUxMKSkgeworCQlkbyB7CisJCQkvKiBjbGVhbiBhbnkgZmluaXNoZWQgd29yayBmb3IgdGhpcyBxaCAqLworCQkJaWYgKCFsaXN0X2VtcHR5KCZxaC0+cXRkX2xpc3QpCisJCQkJCSYmIHFoLT5zdGFtcCAhPSBveHUtPnN0YW1wKSB7CisJCQkJaW50IHRlbXA7CisKKwkJCQkvKiB1bmxpbmtzIGNvdWxkIGhhcHBlbiBoZXJlOyBjb21wbGV0aW9uCisJCQkJICogcmVwb3J0aW5nIGRyb3BzIHRoZSBsb2NrLiAgcmVzY2FuIHVzaW5nCisJCQkJICogdGhlIGxhdGVzdCBzY2hlZHVsZSwgYnV0IGRvbid0IHJlc2NhbgorCQkJCSAqIHFocyB3ZSBhbHJlYWR5IGZpbmlzaGVkIChubyBsb29waW5nKS4KKwkJCQkgKi8KKwkJCQlxaCA9IHFoX2dldChxaCk7CisJCQkJcWgtPnN0YW1wID0gb3h1LT5zdGFtcDsKKwkJCQl0ZW1wID0gcWhfY29tcGxldGlvbnMob3h1LCBxaCk7CisJCQkJcWhfcHV0KHFoKTsKKwkJCQlpZiAodGVtcCAhPSAwKQorCQkJCQlnb3RvIHJlc2NhbjsKKwkJCX0KKworCQkJLyogdW5saW5rIGlkbGUgZW50cmllcywgcmVkdWNpbmcgSEMgUENJIHVzYWdlIGFzIHdlbGwKKwkJCSAqIGFzIEhDRCBzY2hlZHVsZS1zY2FubmluZyBjb3N0cy4gIGRlbGF5IGZvciBhbnkgcWgKKwkJCSAqIHdlIGp1c3Qgc2Nhbm5lZCwgdGhlcmUncyBhIG5vdC11bnVzdWFsIGNhc2UgdGhhdCBpdAorCQkJICogZG9lc24ndCBzdGF5IGlkbGUgZm9yIGxvbmcuCisJCQkgKiAocGx1cywgYXZvaWRzIHNvbWUga2luZCBvZiByZS1hY3RpdmF0aW9uIHJhY2UuKQorCQkJICovCisJCQlpZiAobGlzdF9lbXB0eSgmcWgtPnF0ZF9saXN0KSkgeworCQkJCWlmIChxaC0+c3RhbXAgPT0gb3h1LT5zdGFtcCkKKwkJCQkJYWN0aW9uID0gVElNRVJfQVNZTkNfU0hSSU5LOworCQkJCWVsc2UgaWYgKCFveHUtPnJlY2xhaW0KKwkJCQkJICAgICYmIHFoLT5xaF9zdGF0ZSA9PSBRSF9TVEFURV9MSU5LRUQpCisJCQkJCXN0YXJ0X3VubGlua19hc3luYyhveHUsIHFoKTsKKwkJCX0KKworCQkJcWggPSBxaC0+cWhfbmV4dC5xaDsKKwkJfSB3aGlsZSAocWgpOworCX0KKwlpZiAoYWN0aW9uID09IFRJTUVSX0FTWU5DX1NIUklOSykKKwkJdGltZXJfYWN0aW9uKG94dSwgVElNRVJfQVNZTkNfU0hSSU5LKTsKK30KKworLyoKKyAqIHBlcmlvZGljX25leHRfc2hhZG93IC0gcmV0dXJuICJuZXh0IiBwb2ludGVyIG9uIHNoYWRvdyBsaXN0CisgKiBAcGVyaW9kaWM6IGhvc3QgcG9pbnRlciB0byBxaC9pdGQvc2l0ZAorICogQHRhZzogaGFyZHdhcmUgdGFnIGZvciB0eXBlIG9mIHRoaXMgcmVjb3JkCisgKi8KK3N0YXRpYyB1bmlvbiBlaGNpX3NoYWRvdyAqcGVyaW9kaWNfbmV4dF9zaGFkb3codW5pb24gZWhjaV9zaGFkb3cgKnBlcmlvZGljLAorCQkJCQkJX19sZTMyIHRhZykKK3sKKwlzd2l0Y2ggKHRhZykgeworCWRlZmF1bHQ6CisJY2FzZSBRX1RZUEVfUUg6CisJCXJldHVybiAmcGVyaW9kaWMtPnFoLT5xaF9uZXh0OworCX0KK30KKworLyogY2FsbGVyIG11c3QgaG9sZCBveHUtPmxvY2sgKi8KK3N0YXRpYyB2b2lkIHBlcmlvZGljX3VubGluayhzdHJ1Y3Qgb3h1X2hjZCAqb3h1LCB1bnNpZ25lZCBmcmFtZSwgdm9pZCAqcHRyKQoreworCXVuaW9uIGVoY2lfc2hhZG93ICpwcmV2X3AgPSAmb3h1LT5wc2hhZG93W2ZyYW1lXTsKKwlfX2xlMzIgKmh3X3AgPSAmb3h1LT5wZXJpb2RpY1tmcmFtZV07CisJdW5pb24gZWhjaV9zaGFkb3cgaGVyZSA9ICpwcmV2X3A7CisKKwkvKiBmaW5kIHByZWRlY2Vzc29yIG9mICJwdHIiOyBodyBhbmQgc2hhZG93IGxpc3RzIGFyZSBpbiBzeW5jICovCisJd2hpbGUgKGhlcmUucHRyICYmIGhlcmUucHRyICE9IHB0cikgeworCQlwcmV2X3AgPSBwZXJpb2RpY19uZXh0X3NoYWRvdyhwcmV2X3AsIFFfTkVYVF9UWVBFKCpod19wKSk7CisJCWh3X3AgPSBoZXJlLmh3X25leHQ7CisJCWhlcmUgPSAqcHJldl9wOworCX0KKwkvKiBhbiBpbnRlcnJ1cHQgZW50cnkgKGF0IGxpc3QgZW5kKSBjb3VsZCBoYXZlIGJlZW4gc2hhcmVkICovCisJaWYgKCFoZXJlLnB0cikKKwkJcmV0dXJuOworCisJLyogdXBkYXRlIHNoYWRvdyBhbmQgaGFyZHdhcmUgbGlzdHMgLi4uIHRoZSBvbGQgIm5leHQiIHBvaW50ZXJzCisJICogZnJvbSBwdHIgbWF5IHN0aWxsIGJlIGluIHVzZSwgdGhlIGNhbGxlciB1cGRhdGVzIHRoZW0uCisJICovCisJKnByZXZfcCA9ICpwZXJpb2RpY19uZXh0X3NoYWRvdygmaGVyZSwgUV9ORVhUX1RZUEUoKmh3X3ApKTsKKwkqaHdfcCA9ICpoZXJlLmh3X25leHQ7Cit9CisKKy8qIGhvdyBtYW55IG9mIHRoZSB1ZnJhbWUncyAxMjUgdXNlY3MgYXJlIGFsbG9jYXRlZD8gKi8KK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBwZXJpb2RpY191c2VjcyhzdHJ1Y3Qgb3h1X2hjZCAqb3h1LAorCQkJCQl1bnNpZ25lZCBmcmFtZSwgdW5zaWduZWQgdWZyYW1lKQoreworCV9fbGUzMiAqaHdfcCA9ICZveHUtPnBlcmlvZGljW2ZyYW1lXTsKKwl1bmlvbiBlaGNpX3NoYWRvdyAqcSA9ICZveHUtPnBzaGFkb3dbZnJhbWVdOworCXVuc2lnbmVkIHVzZWNzID0gMDsKKworCXdoaWxlIChxLT5wdHIpIHsKKwkJc3dpdGNoIChRX05FWFRfVFlQRSgqaHdfcCkpIHsKKwkJY2FzZSBRX1RZUEVfUUg6CisJCWRlZmF1bHQ6CisJCQkvKiBpcyBpdCBpbiB0aGUgUy1tYXNrPyAqLworCQkJaWYgKHEtPnFoLT5od19pbmZvMiAmIGNwdV90b19sZTMyKDEgPDwgdWZyYW1lKSkKKwkJCQl1c2VjcyArPSBxLT5xaC0+dXNlY3M7CisJCQkvKiAuLi4gb3IgQy1tYXNrPyAqLworCQkJaWYgKHEtPnFoLT5od19pbmZvMiAmIGNwdV90b19sZTMyKDEgPDwgKDggKyB1ZnJhbWUpKSkKKwkJCQl1c2VjcyArPSBxLT5xaC0+Y191c2VjczsKKwkJCWh3X3AgPSAmcS0+cWgtPmh3X25leHQ7CisJCQlxID0gJnEtPnFoLT5xaF9uZXh0OworCQkJYnJlYWs7CisJCX0KKwl9CisjaWZkZWYgREVCVUcKKwlpZiAodXNlY3MgPiAxMDApCisJCW94dV9lcnIob3h1LCAidWZyYW1lICVkIHNjaGVkIG92ZXJydW46ICVkIHVzZWNzXG4iLAorCQkJCQkJZnJhbWUgKiA4ICsgdWZyYW1lLCB1c2Vjcyk7CisjZW5kaWYKKwlyZXR1cm4gdXNlY3M7Cit9CisKK3N0YXRpYyBpbnQgZW5hYmxlX3BlcmlvZGljKHN0cnVjdCBveHVfaGNkICpveHUpCit7CisJdTMyIGNtZDsKKwlpbnQgc3RhdHVzOworCisJLyogZGlkIGNsZWFyaW5nIFBTRSBkaWQgdGFrZSBlZmZlY3QgeWV0PworCSAqIHRha2VzIGVmZmVjdCBvbmx5IGF0IGZyYW1lIGJvdW5kYXJpZXMuLi4KKwkgKi8KKwlzdGF0dXMgPSBoYW5kc2hha2Uob3h1LCAmb3h1LT5yZWdzLT5zdGF0dXMsIFNUU19QU1MsIDAsIDkgKiAxMjUpOworCWlmIChzdGF0dXMgIT0gMCkgeworCQlveHVfdG9faGNkKG94dSktPnN0YXRlID0gSENfU1RBVEVfSEFMVDsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisKKwljbWQgPSByZWFkbCgmb3h1LT5yZWdzLT5jb21tYW5kKSB8IENNRF9QU0U7CisJd3JpdGVsKGNtZCwgJm94dS0+cmVncy0+Y29tbWFuZCk7CisJLyogcG9zdGVkIHdyaXRlIC4uLiBQU1MgaGFwcGVucyBsYXRlciAqLworCW94dV90b19oY2Qob3h1KS0+c3RhdGUgPSBIQ19TVEFURV9SVU5OSU5HOworCisJLyogbWFrZSBzdXJlIGVoY2lfd29yayBzY2FucyB0aGVzZSAqLworCW94dS0+bmV4dF91ZnJhbWUgPSByZWFkbCgmb3h1LT5yZWdzLT5mcmFtZV9pbmRleCkKKwkJJSAob3h1LT5wZXJpb2RpY19zaXplIDw8IDMpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRpc2FibGVfcGVyaW9kaWMoc3RydWN0IG94dV9oY2QgKm94dSkKK3sKKwl1MzIgY21kOworCWludCBzdGF0dXM7CisKKwkvKiBkaWQgc2V0dGluZyBQU0Ugbm90IHRha2UgZWZmZWN0IHlldD8KKwkgKiB0YWtlcyBlZmZlY3Qgb25seSBhdCBmcmFtZSBib3VuZGFyaWVzLi4uCisJICovCisJc3RhdHVzID0gaGFuZHNoYWtlKG94dSwgJm94dS0+cmVncy0+c3RhdHVzLCBTVFNfUFNTLCBTVFNfUFNTLCA5ICogMTI1KTsKKwlpZiAoc3RhdHVzICE9IDApIHsKKwkJb3h1X3RvX2hjZChveHUpLT5zdGF0ZSA9IEhDX1NUQVRFX0hBTFQ7CisJCXJldHVybiBzdGF0dXM7CisJfQorCisJY21kID0gcmVhZGwoJm94dS0+cmVncy0+Y29tbWFuZCkgJiB+Q01EX1BTRTsKKwl3cml0ZWwoY21kLCAmb3h1LT5yZWdzLT5jb21tYW5kKTsKKwkvKiBwb3N0ZWQgd3JpdGUgLi4uICovCisKKwlveHUtPm5leHRfdWZyYW1lID0gLTE7CisJcmV0dXJuIDA7Cit9CisKKy8qIHBlcmlvZGljIHNjaGVkdWxlIHNsb3RzIGhhdmUgaXNvIHRkcyAobm9ybWFsIG9yIHNwbGl0KSBmaXJzdCwgdGhlbiBhCisgKiBzcGFyc2UgdHJlZSBmb3IgYWN0aXZlIGludGVycnVwdCB0cmFuc2ZlcnMuCisgKgorICogdGhpcyBqdXN0IGxpbmtzIGluIGEgcWg7IGNhbGxlciBndWFyYW50ZWVzIHVmcmFtZSBtYXNrcyBhcmUgc2V0IHJpZ2h0LgorICogbm8gRlNUTiBzdXBwb3J0ICh5ZXQ7IG94dSAwLjk2KykKKyAqLworc3RhdGljIGludCBxaF9saW5rX3BlcmlvZGljKHN0cnVjdCBveHVfaGNkICpveHUsIHN0cnVjdCBlaGNpX3FoICpxaCkKK3sKKwl1bnNpZ25lZCBpOworCXVuc2lnbmVkIHBlcmlvZCA9IHFoLT5wZXJpb2Q7CisKKwlkZXZfZGJnKCZxaC0+ZGV2LT5kZXYsCisJCSJsaW5rIHFoJWQtJTA0eC8lcCBzdGFydCAlZCBbJWQvJWQgdXNdXG4iLAorCQlwZXJpb2QsIGxlMzJfdG9fY3B1cCgmcWgtPmh3X2luZm8yKSAmIChRSF9DTUFTSyB8IFFIX1NNQVNLKSwKKwkJcWgsIHFoLT5zdGFydCwgcWgtPnVzZWNzLCBxaC0+Y191c2Vjcyk7CisKKwkvKiBoaWdoIGJhbmR3aWR0aCwgb3Igb3RoZXJ3aXNlIGV2ZXJ5IG1pY3JvZnJhbWUgKi8KKwlpZiAocGVyaW9kID09IDApCisJCXBlcmlvZCA9IDE7CisKKwlmb3IgKGkgPSBxaC0+c3RhcnQ7IGkgPCBveHUtPnBlcmlvZGljX3NpemU7IGkgKz0gcGVyaW9kKSB7CisJCXVuaW9uIGVoY2lfc2hhZG93CSpwcmV2ID0gJm94dS0+cHNoYWRvd1tpXTsKKwkJX19sZTMyCQkJKmh3X3AgPSAmb3h1LT5wZXJpb2RpY1tpXTsKKwkJdW5pb24gZWhjaV9zaGFkb3cJaGVyZSA9ICpwcmV2OworCQlfX2xlMzIJCQl0eXBlID0gMDsKKworCQkvKiBza2lwIHRoZSBpc28gbm9kZXMgYXQgbGlzdCBoZWFkICovCisJCXdoaWxlIChoZXJlLnB0cikgeworCQkJdHlwZSA9IFFfTkVYVF9UWVBFKCpod19wKTsKKwkJCWlmICh0eXBlID09IFFfVFlQRV9RSCkKKwkJCQlicmVhazsKKwkJCXByZXYgPSBwZXJpb2RpY19uZXh0X3NoYWRvdyhwcmV2LCB0eXBlKTsKKwkJCWh3X3AgPSAmaGVyZS5xaC0+aHdfbmV4dDsKKwkJCWhlcmUgPSAqcHJldjsKKwkJfQorCisJCS8qIHNvcnRpbmcgZWFjaCBicmFuY2ggYnkgcGVyaW9kIChzbG93LS0+ZmFzdCkKKwkJICogZW5hYmxlcyBzaGFyaW5nIGludGVyaW9yIHRyZWUgbm9kZXMKKwkJICovCisJCXdoaWxlIChoZXJlLnB0ciAmJiBxaCAhPSBoZXJlLnFoKSB7CisJCQlpZiAocWgtPnBlcmlvZCA+IGhlcmUucWgtPnBlcmlvZCkKKwkJCQlicmVhazsKKwkJCXByZXYgPSAmaGVyZS5xaC0+cWhfbmV4dDsKKwkJCWh3X3AgPSAmaGVyZS5xaC0+aHdfbmV4dDsKKwkJCWhlcmUgPSAqcHJldjsKKwkJfQorCQkvKiBsaW5rIGluIHRoaXMgcWgsIHVubGVzcyBzb21lIGVhcmxpZXIgcGFzcyBkaWQgdGhhdCAqLworCQlpZiAocWggIT0gaGVyZS5xaCkgeworCQkJcWgtPnFoX25leHQgPSBoZXJlOworCQkJaWYgKGhlcmUucWgpCisJCQkJcWgtPmh3X25leHQgPSAqaHdfcDsKKwkJCXdtYigpOworCQkJcHJldi0+cWggPSBxaDsKKwkJCSpod19wID0gUUhfTkVYVChxaC0+cWhfZG1hKTsKKwkJfQorCX0KKwlxaC0+cWhfc3RhdGUgPSBRSF9TVEFURV9MSU5LRUQ7CisJcWhfZ2V0KHFoKTsKKworCS8qIHVwZGF0ZSBwZXItcWggYmFuZHdpZHRoIGZvciB1c2JmcyAqLworCW94dV90b19oY2Qob3h1KS0+c2VsZi5iYW5kd2lkdGhfYWxsb2NhdGVkICs9IHFoLT5wZXJpb2QKKwkJPyAoKHFoLT51c2VjcyArIHFoLT5jX3VzZWNzKSAvIHFoLT5wZXJpb2QpCisJCTogKHFoLT51c2VjcyAqIDgpOworCisJLyogbWF5YmUgZW5hYmxlIHBlcmlvZGljIHNjaGVkdWxlIHByb2Nlc3NpbmcgKi8KKwlpZiAoIW94dS0+cGVyaW9kaWNfc2NoZWQrKykKKwkJcmV0dXJuIGVuYWJsZV9wZXJpb2RpYyhveHUpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHFoX3VubGlua19wZXJpb2RpYyhzdHJ1Y3Qgb3h1X2hjZCAqb3h1LCBzdHJ1Y3QgZWhjaV9xaCAqcWgpCit7CisJdW5zaWduZWQgaTsKKwl1bnNpZ25lZCBwZXJpb2Q7CisKKwkvKiBGSVhNRToKKwkgKiAgIElGIHRoaXMgaXNuJ3QgaGlnaCBzcGVlZAorCSAqICAgYW5kIHRoaXMgcWggaXMgYWN0aXZlIGluIHRoZSBjdXJyZW50IHVmcmFtZQorCSAqICAgKGFuZCBvdmVybGF5IHRva2VuIFNwbGl0WHN0YXRlIGlzIGZhbHNlPykKKwkgKiBUSEVOCisJICogICBxaC0+aHdfaW5mbzEgfD0gX19jb25zdGFudF9jcHVfdG9fbGUzMigxIDw8IDcgImlnbm9yZSIpOworCSAqLworCisJLyogaGlnaCBiYW5kd2lkdGgsIG9yIG90aGVyd2lzZSBwYXJ0IG9mIGV2ZXJ5IG1pY3JvZnJhbWUgKi8KKwlwZXJpb2QgPSBxaC0+cGVyaW9kOworCWlmIChwZXJpb2QgPT0gMCkKKwkJcGVyaW9kID0gMTsKKworCWZvciAoaSA9IHFoLT5zdGFydDsgaSA8IG94dS0+cGVyaW9kaWNfc2l6ZTsgaSArPSBwZXJpb2QpCisJCXBlcmlvZGljX3VubGluayhveHUsIGksIHFoKTsKKworCS8qIHVwZGF0ZSBwZXItcWggYmFuZHdpZHRoIGZvciB1c2JmcyAqLworCW94dV90b19oY2Qob3h1KS0+c2VsZi5iYW5kd2lkdGhfYWxsb2NhdGVkIC09IHFoLT5wZXJpb2QKKwkJPyAoKHFoLT51c2VjcyArIHFoLT5jX3VzZWNzKSAvIHFoLT5wZXJpb2QpCisJCTogKHFoLT51c2VjcyAqIDgpOworCisJZGV2X2RiZygmcWgtPmRldi0+ZGV2LAorCQkidW5saW5rIHFoJWQtJTA0eC8lcCBzdGFydCAlZCBbJWQvJWQgdXNdXG4iLAorCQlxaC0+cGVyaW9kLAorCQlsZTMyX3RvX2NwdXAoJnFoLT5od19pbmZvMikgJiAoUUhfQ01BU0sgfCBRSF9TTUFTSyksCisJCXFoLCBxaC0+c3RhcnQsIHFoLT51c2VjcywgcWgtPmNfdXNlY3MpOworCisJLyogcWgtPnFoX25leHQgc3RpbGwgImxpdmUiIHRvIEhDICovCisJcWgtPnFoX3N0YXRlID0gUUhfU1RBVEVfVU5MSU5LOworCXFoLT5xaF9uZXh0LnB0ciA9IE5VTEw7CisJcWhfcHV0KHFoKTsKKworCS8qIG1heWJlIHR1cm4gb2ZmIHBlcmlvZGljIHNjaGVkdWxlICovCisJb3h1LT5wZXJpb2RpY19zY2hlZC0tOworCWlmICghb3h1LT5wZXJpb2RpY19zY2hlZCkKKwkJKHZvaWQpIGRpc2FibGVfcGVyaW9kaWMob3h1KTsKK30KKworc3RhdGljIHZvaWQgaW50cl9kZXNjaGVkdWxlKHN0cnVjdCBveHVfaGNkICpveHUsIHN0cnVjdCBlaGNpX3FoICpxaCkKK3sKKwl1bnNpZ25lZCB3YWl0OworCisJcWhfdW5saW5rX3BlcmlvZGljKG94dSwgcWgpOworCisJLyogc2ltcGxlL3BhcmFub2lkOiAgYWx3YXlzIGRlbGF5LCBleHBlY3RpbmcgdGhlIEhDIG5lZWRzIHRvIHJlYWQKKwkgKiBxaC0+aHdfbmV4dCBvciBmaW5pc2ggYSB3cml0ZWJhY2sgYWZ0ZXIgU1BMSVQvQ1NQTElUIC4uLiBhbmQKKwkgKiBleHBlY3Qga2h1YmQgdG8gY2xlYW4gdXAgYWZ0ZXIgYW55IENTUExJVHMgd2Ugd29uJ3QgaXNzdWUuCisJICogYWN0aXZlIGhpZ2ggc3BlZWQgcXVldWVzIG1heSBuZWVkIGJpZ2dlciBkZWxheXMuLi4KKwkgKi8KKwlpZiAobGlzdF9lbXB0eSgmcWgtPnF0ZF9saXN0KQorCQl8fCAoX19jb25zdGFudF9jcHVfdG9fbGUzMihRSF9DTUFTSykgJiBxaC0+aHdfaW5mbzIpICE9IDApCisJCXdhaXQgPSAyOworCWVsc2UKKwkJd2FpdCA9IDU1OwkvKiB3b3JzdCBjYXNlOiAzICogMTAyNCAqLworCisJdWRlbGF5KHdhaXQpOworCXFoLT5xaF9zdGF0ZSA9IFFIX1NUQVRFX0lETEU7CisJcWgtPmh3X25leHQgPSBFSENJX0xJU1RfRU5EOworCXdtYigpOworfQorCitzdGF0aWMgaW50IGNoZWNrX3BlcmlvZChzdHJ1Y3Qgb3h1X2hjZCAqb3h1LAorCQkJdW5zaWduZWQgZnJhbWUsIHVuc2lnbmVkIHVmcmFtZSwKKwkJCXVuc2lnbmVkIHBlcmlvZCwgdW5zaWduZWQgdXNlY3MpCit7CisJaW50IGNsYWltZWQ7CisKKwkvKiBjb21wbGV0ZSBzcGxpdCBydW5uaW5nIGludG8gbmV4dCBmcmFtZT8KKwkgKiBnaXZlbiBGU1ROIHN1cHBvcnQsIHdlIGNvdWxkIHNvbWV0aW1lcyBjaGVjay4uLgorCSAqLworCWlmICh1ZnJhbWUgPj0gOCkKKwkJcmV0dXJuIDA7CisKKwkvKgorCSAqIDgwJSBwZXJpb2RpYyA9PSAxMDAgdXNlYy91ZnJhbWUgYXZhaWxhYmxlCisJICogY29udmVydCAidXNlY3Mgd2UgbmVlZCIgdG8gIm1heCBhbHJlYWR5IGNsYWltZWQiCisJICovCisJdXNlY3MgPSAxMDAgLSB1c2VjczsKKworCS8qIHdlICJrbm93IiAyIGFuZCA0IHVmcmFtZSBpbnRlcnZhbHMgd2VyZSByZWplY3RlZDsgc28KKwkgKiBmb3IgcGVyaW9kIDAsIGNoZWNrIF9ldmVyeV8gbWljcm9mcmFtZSBpbiB0aGUgc2NoZWR1bGUuCisJICovCisJaWYgKHVubGlrZWx5KHBlcmlvZCA9PSAwKSkgeworCQlkbyB7CisJCQlmb3IgKHVmcmFtZSA9IDA7IHVmcmFtZSA8IDc7IHVmcmFtZSsrKSB7CisJCQkJY2xhaW1lZCA9IHBlcmlvZGljX3VzZWNzKG94dSwgZnJhbWUsIHVmcmFtZSk7CisJCQkJaWYgKGNsYWltZWQgPiB1c2VjcykKKwkJCQkJcmV0dXJuIDA7CisJCQl9CisJCX0gd2hpbGUgKChmcmFtZSArPSAxKSA8IG94dS0+cGVyaW9kaWNfc2l6ZSk7CisKKwkvKiBqdXN0IGNoZWNrIHRoZSBzcGVjaWZpZWQgdWZyYW1lLCBhdCB0aGF0IHBlcmlvZCAqLworCX0gZWxzZSB7CisJCWRvIHsKKwkJCWNsYWltZWQgPSBwZXJpb2RpY191c2VjcyhveHUsIGZyYW1lLCB1ZnJhbWUpOworCQkJaWYgKGNsYWltZWQgPiB1c2VjcykKKwkJCQlyZXR1cm4gMDsKKwkJfSB3aGlsZSAoKGZyYW1lICs9IHBlcmlvZCkgPCBveHUtPnBlcmlvZGljX3NpemUpOworCX0KKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IGNoZWNrX2ludHJfc2NoZWR1bGUoc3RydWN0IG94dV9oY2QJKm94dSwKKwkJCQl1bnNpZ25lZCBmcmFtZSwgdW5zaWduZWQgdWZyYW1lLAorCQkJCWNvbnN0IHN0cnVjdCBlaGNpX3FoICpxaCwgX19sZTMyICpjX21hc2twKQoreworCWludCByZXR2YWwgPSAtRU5PU1BDOworCisJaWYgKHFoLT5jX3VzZWNzICYmIHVmcmFtZSA+PSA2KQkJLyogRlNUTiB0ZXJyaXRvcnk/ICovCisJCWdvdG8gZG9uZTsKKworCWlmICghY2hlY2tfcGVyaW9kKG94dSwgZnJhbWUsIHVmcmFtZSwgcWgtPnBlcmlvZCwgcWgtPnVzZWNzKSkKKwkJZ290byBkb25lOworCWlmICghcWgtPmNfdXNlY3MpIHsKKwkJcmV0dmFsID0gMDsKKwkJKmNfbWFza3AgPSAwOworCQlnb3RvIGRvbmU7CisJfQorCitkb25lOgorCXJldHVybiByZXR2YWw7Cit9CisKKy8qICJmaXJzdCBmaXQiIHNjaGVkdWxpbmcgcG9saWN5IHVzZWQgdGhlIGZpcnN0IHRpbWUgdGhyb3VnaCwKKyAqIG9yIHdoZW4gdGhlIHByZXZpb3VzIHNjaGVkdWxlIHNsb3QgY2FuJ3QgYmUgcmUtdXNlZC4KKyAqLworc3RhdGljIGludCBxaF9zY2hlZHVsZShzdHJ1Y3Qgb3h1X2hjZCAqb3h1LCBzdHJ1Y3QgZWhjaV9xaCAqcWgpCit7CisJaW50CQlzdGF0dXM7CisJdW5zaWduZWQJdWZyYW1lOworCV9fbGUzMgkJY19tYXNrOworCXVuc2lnbmVkCWZyYW1lOwkJLyogMC4uKHFoLT5wZXJpb2QgLSAxKSwgb3IgTk9fRlJBTUUgKi8KKworCXFoX3JlZnJlc2gob3h1LCBxaCk7CisJcWgtPmh3X25leHQgPSBFSENJX0xJU1RfRU5EOworCWZyYW1lID0gcWgtPnN0YXJ0OworCisJLyogcmV1c2UgdGhlIHByZXZpb3VzIHNjaGVkdWxlIHNsb3RzLCBpZiB3ZSBjYW4gKi8KKwlpZiAoZnJhbWUgPCBxaC0+cGVyaW9kKSB7CisJCXVmcmFtZSA9IGZmcyhsZTMyX3RvX2NwdXAoJnFoLT5od19pbmZvMikgJiBRSF9TTUFTSyk7CisJCXN0YXR1cyA9IGNoZWNrX2ludHJfc2NoZWR1bGUob3h1LCBmcmFtZSwgLS11ZnJhbWUsCisJCQkJcWgsICZjX21hc2spOworCX0gZWxzZSB7CisJCXVmcmFtZSA9IDA7CisJCWNfbWFzayA9IDA7CisJCXN0YXR1cyA9IC1FTk9TUEM7CisJfQorCisJLyogZWxzZSBzY2FuIHRoZSBzY2hlZHVsZSB0byBmaW5kIGEgZ3JvdXAgb2Ygc2xvdHMgc3VjaCB0aGF0IGFsbAorCSAqIHVmcmFtZXMgaGF2ZSBlbm91Z2ggcGVyaW9kaWMgYmFuZHdpZHRoIGF2YWlsYWJsZS4KKwkgKi8KKwlpZiAoc3RhdHVzKSB7CisJCS8qICJub3JtYWwiIGNhc2UsIHVmcmFtaW5nIGZsZXhpYmxlIGV4Y2VwdCB3aXRoIHNwbGl0cyAqLworCQlpZiAocWgtPnBlcmlvZCkgeworCQkJZnJhbWUgPSBxaC0+cGVyaW9kIC0gMTsKKwkJCWRvIHsKKwkJCQlmb3IgKHVmcmFtZSA9IDA7IHVmcmFtZSA8IDg7IHVmcmFtZSsrKSB7CisJCQkJCXN0YXR1cyA9IGNoZWNrX2ludHJfc2NoZWR1bGUob3h1LAorCQkJCQkJCWZyYW1lLCB1ZnJhbWUsIHFoLAorCQkJCQkJCSZjX21hc2spOworCQkJCQlpZiAoc3RhdHVzID09IDApCisJCQkJCQlicmVhazsKKwkJCQl9CisJCQl9IHdoaWxlIChzdGF0dXMgJiYgZnJhbWUtLSk7CisKKwkJLyogcWgtPnBlcmlvZCA9PSAwIG1lYW5zIGV2ZXJ5IHVmcmFtZSAqLworCQl9IGVsc2UgeworCQkJZnJhbWUgPSAwOworCQkJc3RhdHVzID0gY2hlY2tfaW50cl9zY2hlZHVsZShveHUsIDAsIDAsIHFoLCAmY19tYXNrKTsKKwkJfQorCQlpZiAoc3RhdHVzKQorCQkJZ290byBkb25lOworCQlxaC0+c3RhcnQgPSBmcmFtZTsKKworCQkvKiByZXNldCBTLWZyYW1lIGFuZCAobWF5YmUpIEMtZnJhbWUgbWFza3MgKi8KKwkJcWgtPmh3X2luZm8yICY9IF9fY29uc3RhbnRfY3B1X3RvX2xlMzIofihRSF9DTUFTSyB8IFFIX1NNQVNLKSk7CisJCXFoLT5od19pbmZvMiB8PSBxaC0+cGVyaW9kCisJCQk/IGNwdV90b19sZTMyKDEgPDwgdWZyYW1lKQorCQkJOiBfX2NvbnN0YW50X2NwdV90b19sZTMyKFFIX1NNQVNLKTsKKwkJcWgtPmh3X2luZm8yIHw9IGNfbWFzazsKKwl9IGVsc2UKKwkJb3h1X2RiZyhveHUsICJyZXVzZWQgcWggJXAgc2NoZWR1bGVcbiIsIHFoKTsKKworCS8qIHN0dWZmIGludG8gdGhlIHBlcmlvZGljIHNjaGVkdWxlICovCisJc3RhdHVzID0gcWhfbGlua19wZXJpb2RpYyhveHUsIHFoKTsKK2RvbmU6CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBpbnRyX3N1Ym1pdChzdHJ1Y3Qgb3h1X2hjZCAqb3h1LCBzdHJ1Y3QgdXJiICp1cmIsCisJCQlzdHJ1Y3QgbGlzdF9oZWFkICpxdGRfbGlzdCwgZ2ZwX3QgbWVtX2ZsYWdzKQoreworCXVuc2lnbmVkIGVwbnVtOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGVoY2lfcWggKnFoOworCWludCBzdGF0dXMgPSAwOworCXN0cnVjdCBsaXN0X2hlYWQJZW1wdHk7CisKKwkvKiBnZXQgZW5kcG9pbnQgYW5kIHRyYW5zZmVyL3NjaGVkdWxlIGRhdGEgKi8KKwllcG51bSA9IHVyYi0+ZXAtPmRlc2MuYkVuZHBvaW50QWRkcmVzczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZveHUtPmxvY2ssIGZsYWdzKTsKKworCWlmICh1bmxpa2VseSghdGVzdF9iaXQoSENEX0ZMQUdfSFdfQUNDRVNTSUJMRSwKKwkJCSAgICAgICAmb3h1X3RvX2hjZChveHUpLT5mbGFncykpKSB7CisJCXN0YXR1cyA9IC1FU0hVVERPV047CisJCWdvdG8gZG9uZTsKKwl9CisKKwkvKiBnZXQgcWggYW5kIGZvcmNlIGFueSBzY2hlZHVsaW5nIGVycm9ycyAqLworCUlOSVRfTElTVF9IRUFEKCZlbXB0eSk7CisJcWggPSBxaF9hcHBlbmRfdGRzKG94dSwgdXJiLCAmZW1wdHksIGVwbnVtLCAmdXJiLT5lcC0+aGNwcml2KTsKKwlpZiAocWggPT0gTlVMTCkgeworCQlzdGF0dXMgPSAtRU5PTUVNOworCQlnb3RvIGRvbmU7CisJfQorCWlmIChxaC0+cWhfc3RhdGUgPT0gUUhfU1RBVEVfSURMRSkgeworCQlzdGF0dXMgPSBxaF9zY2hlZHVsZShveHUsIHFoKTsKKwkJaWYgKHN0YXR1cyAhPSAwKQorCQkJZ290byBkb25lOworCX0KKworCS8qIHRoZW4gcXVldWUgdGhlIHVyYidzIHRkcyB0byB0aGUgcWggKi8KKwlxaCA9IHFoX2FwcGVuZF90ZHMob3h1LCB1cmIsIHF0ZF9saXN0LCBlcG51bSwgJnVyYi0+ZXAtPmhjcHJpdik7CisJQlVHX09OKHFoID09IE5VTEwpOworCisJLyogLi4uIHVwZGF0ZSB1c2JmcyBwZXJpb2RpYyBzdGF0cyAqLworCW94dV90b19oY2Qob3h1KS0+c2VsZi5iYW5kd2lkdGhfaW50X3JlcXMrKzsKKworZG9uZToKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZveHUtPmxvY2ssIGZsYWdzKTsKKwlpZiAoc3RhdHVzKQorCQlxdGRfbGlzdF9mcmVlKG94dSwgdXJiLCBxdGRfbGlzdCk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW5saW5lIGludCBpdGRfc3VibWl0KHN0cnVjdCBveHVfaGNkICpveHUsIHN0cnVjdCB1cmIgKnVyYiwKKwkJCQkJCWdmcF90IG1lbV9mbGFncykKK3sKKwlveHVfZGJnKG94dSwgImlzbyBzdXBwb3J0IGlzIG1pc3NpbmchXG4iKTsKKwlyZXR1cm4gLUVOT1NZUzsKK30KKworc3RhdGljIGlubGluZSBpbnQgc2l0ZF9zdWJtaXQoc3RydWN0IG94dV9oY2QgKm94dSwgc3RydWN0IHVyYiAqdXJiLAorCQkJCQkJZ2ZwX3QgbWVtX2ZsYWdzKQoreworCW94dV9kYmcob3h1LCAic3BsaXQgaXNvIHN1cHBvcnQgaXMgbWlzc2luZyFcbiIpOworCXJldHVybiAtRU5PU1lTOworfQorCitzdGF0aWMgdm9pZCBzY2FuX3BlcmlvZGljKHN0cnVjdCBveHVfaGNkICpveHUpCit7CisJdW5zaWduZWQgZnJhbWUsIGNsb2NrLCBub3dfdWZyYW1lLCBtb2Q7CisJdW5zaWduZWQgbW9kaWZpZWQ7CisKKwltb2QgPSBveHUtPnBlcmlvZGljX3NpemUgPDwgMzsKKworCS8qCisJICogV2hlbiBydW5uaW5nLCBzY2FuIGZyb20gbGFzdCBzY2FuIHBvaW50IHVwIHRvICJub3ciCisJICogZWxzZSBjbGVhbiB1cCBieSBzY2FubmluZyBldmVyeXRoaW5nIHRoYXQncyBsZWZ0LgorCSAqIFRvdWNoZXMgYXMgZmV3IHBhZ2VzIGFzIHBvc3NpYmxlOiAgY2FjaGUtZnJpZW5kbHkuCisJICovCisJbm93X3VmcmFtZSA9IG94dS0+bmV4dF91ZnJhbWU7CisJaWYgKEhDX0lTX1JVTk5JTkcob3h1X3RvX2hjZChveHUpLT5zdGF0ZSkpCisJCWNsb2NrID0gcmVhZGwoJm94dS0+cmVncy0+ZnJhbWVfaW5kZXgpOworCWVsc2UKKwkJY2xvY2sgPSBub3dfdWZyYW1lICsgbW9kIC0gMTsKKwljbG9jayAlPSBtb2Q7CisKKwlmb3IgKDs7KSB7CisJCXVuaW9uIGVoY2lfc2hhZG93CXEsICpxX3A7CisJCV9fbGUzMgkJCXR5cGUsICpod19wOworCQl1bnNpZ25lZAkJdWZyYW1lczsKKworCQkvKiBkb24ndCBzY2FuIHBhc3QgdGhlIGxpdmUgdWZyYW1lICovCisJCWZyYW1lID0gbm93X3VmcmFtZSA+PiAzOworCQlpZiAoZnJhbWUgPT0gKGNsb2NrID4+IDMpKQorCQkJdWZyYW1lcyA9IG5vd191ZnJhbWUgJiAweDA3OworCQllbHNlIHsKKwkJCS8qIHNhZmUgdG8gc2NhbiB0aGUgd2hvbGUgZnJhbWUgYXQgb25jZSAqLworCQkJbm93X3VmcmFtZSB8PSAweDA3OworCQkJdWZyYW1lcyA9IDg7CisJCX0KKworcmVzdGFydDoKKwkJLyogc2NhbiBlYWNoIGVsZW1lbnQgaW4gZnJhbWUncyBxdWV1ZSBmb3IgY29tcGxldGlvbnMgKi8KKwkJcV9wID0gJm94dS0+cHNoYWRvd1tmcmFtZV07CisJCWh3X3AgPSAmb3h1LT5wZXJpb2RpY1tmcmFtZV07CisJCXEucHRyID0gcV9wLT5wdHI7CisJCXR5cGUgPSBRX05FWFRfVFlQRSgqaHdfcCk7CisJCW1vZGlmaWVkID0gMDsKKworCQl3aGlsZSAocS5wdHIgIT0gTlVMTCkgeworCQkJdW5pb24gZWhjaV9zaGFkb3cgdGVtcDsKKwkJCWludCBsaXZlOworCisJCQlsaXZlID0gSENfSVNfUlVOTklORyhveHVfdG9faGNkKG94dSktPnN0YXRlKTsKKwkJCXN3aXRjaCAodHlwZSkgeworCQkJY2FzZSBRX1RZUEVfUUg6CisJCQkJLyogaGFuZGxlIGFueSBjb21wbGV0aW9ucyAqLworCQkJCXRlbXAucWggPSBxaF9nZXQocS5xaCk7CisJCQkJdHlwZSA9IFFfTkVYVF9UWVBFKHEucWgtPmh3X25leHQpOworCQkJCXEgPSBxLnFoLT5xaF9uZXh0OworCQkJCW1vZGlmaWVkID0gcWhfY29tcGxldGlvbnMob3h1LCB0ZW1wLnFoKTsKKwkJCQlpZiAodW5saWtlbHkobGlzdF9lbXB0eSgmdGVtcC5xaC0+cXRkX2xpc3QpKSkKKwkJCQkJaW50cl9kZXNjaGVkdWxlKG94dSwgdGVtcC5xaCk7CisJCQkJcWhfcHV0KHRlbXAucWgpOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlkYmcoImNvcnJ1cHQgdHlwZSAlZCBmcmFtZSAlZCBzaGFkb3cgJXAiLAorCQkJCQl0eXBlLCBmcmFtZSwgcS5wdHIpOworCQkJCXEucHRyID0gTlVMTDsKKwkJCX0KKworCQkJLyogYXNzdW1lIGNvbXBsZXRpb24gY2FsbGJhY2tzIG1vZGlmeSB0aGUgcXVldWUgKi8KKwkJCWlmICh1bmxpa2VseShtb2RpZmllZCkpCisJCQkJZ290byByZXN0YXJ0OworCQl9CisKKwkJLyogU3RvcCB3aGVuIHdlIGNhdGNoIHVwIHRvIHRoZSBIQyAqLworCisJCS8qIEZJWE1FOiAgdGhpcyBhc3N1bWVzIHdlIHdvbid0IGdldCBsYXBwZWQgd2hlbgorCQkgKiBsYXRlbmNpZXMgY2xpbWI7IHRoYXQgc2hvdWxkIGJlIHJhcmUsIGJ1dC4uLgorCQkgKiBkZXRlY3QgaXQsIGFuZCBqdXN0IGdvIGFsbCB0aGUgd2F5IGFyb3VuZC4KKwkJICogRkxSIG1pZ2h0IGhlbHAgZGV0ZWN0IHRoaXMgY2FzZSwgc28gbG9uZyBhcyBsYXRlbmNpZXMKKwkJICogZG9uJ3QgZXhjZWVkIHBlcmlvZGljX3NpemUgbXNlYyAoZGVmYXVsdCAxLjAyNCBzZWMpLgorCQkgKi8KKworCQkvKiBGSVhNRTogbGlrZXdpc2UgYXNzdW1lcyBIQyBkb2Vzbid0IGhhbHQgbWlkLXNjYW4gKi8KKworCQlpZiAobm93X3VmcmFtZSA9PSBjbG9jaykgeworCQkJdW5zaWduZWQJbm93OworCisJCQlpZiAoIUhDX0lTX1JVTk5JTkcob3h1X3RvX2hjZChveHUpLT5zdGF0ZSkpCisJCQkJYnJlYWs7CisJCQlveHUtPm5leHRfdWZyYW1lID0gbm93X3VmcmFtZTsKKwkJCW5vdyA9IHJlYWRsKCZveHUtPnJlZ3MtPmZyYW1lX2luZGV4KSAlIG1vZDsKKwkJCWlmIChub3dfdWZyYW1lID09IG5vdykKKwkJCQlicmVhazsKKworCQkJLyogcmVzY2FuIHRoZSByZXN0IG9mIHRoaXMgZnJhbWUsIHRoZW4gLi4uICovCisJCQljbG9jayA9IG5vdzsKKwkJfSBlbHNlIHsKKwkJCW5vd191ZnJhbWUrKzsKKwkJCW5vd191ZnJhbWUgJT0gbW9kOworCQl9CisJfQorfQorCisvKiBPbiBzb21lIHN5c3RlbXMsIGxlYXZpbmcgcmVtb3RlIHdha2V1cCBlbmFibGVkIHByZXZlbnRzIHN5c3RlbSBzaHV0ZG93bi4KKyAqIFRoZSBmaXJtd2FyZSBzZWVtcyB0byB0aGluayB0aGF0IHBvd2VyaW5nIG9mZiBpcyBhIHdha2V1cCBldmVudCEKKyAqIFRoaXMgcm91dGluZSB0dXJucyBvZmYgcmVtb3RlIHdha2V1cCBhbmQgZXZlcnl0aGluZyBlbHNlLCBvbiBhbGwgcG9ydHMuCisgKi8KK3N0YXRpYyB2b2lkIGVoY2lfdHVybl9vZmZfYWxsX3BvcnRzKHN0cnVjdCBveHVfaGNkICpveHUpCit7CisJaW50IHBvcnQgPSBIQ1NfTl9QT1JUUyhveHUtPmhjc19wYXJhbXMpOworCisJd2hpbGUgKHBvcnQtLSkKKwkJd3JpdGVsKFBPUlRfUldDX0JJVFMsICZveHUtPnJlZ3MtPnBvcnRfc3RhdHVzW3BvcnRdKTsKK30KKworc3RhdGljIHZvaWQgZWhjaV9wb3J0X3Bvd2VyKHN0cnVjdCBveHVfaGNkICpveHUsIGludCBpc19vbikKK3sKKwl1bnNpZ25lZCBwb3J0OworCisJaWYgKCFIQ1NfUFBDKG94dS0+aGNzX3BhcmFtcykpCisJCXJldHVybjsKKworCW94dV9kYmcob3h1LCAiLi4ucG93ZXIlcyBwb3J0cy4uLlxuIiwgaXNfb24gPyAidXAiIDogImRvd24iKTsKKwlmb3IgKHBvcnQgPSBIQ1NfTl9QT1JUUyhveHUtPmhjc19wYXJhbXMpOyBwb3J0ID4gMDsgKQorCQkodm9pZCkgb3h1X2h1Yl9jb250cm9sKG94dV90b19oY2Qob3h1KSwKKwkJCQlpc19vbiA/IFNldFBvcnRGZWF0dXJlIDogQ2xlYXJQb3J0RmVhdHVyZSwKKwkJCQlVU0JfUE9SVF9GRUFUX1BPV0VSLAorCQkJCXBvcnQtLSwgTlVMTCwgMCk7CisJbXNsZWVwKDIwKTsKK30KKworLyogQ2FsbGVkIGZyb20gc29tZSBpbnRlcnJ1cHRzLCB0aW1lcnMsIGFuZCBzbyBvbi4KKyAqIEl0IGNhbGxzIGRyaXZlciBjb21wbGV0aW9uIGZ1bmN0aW9ucywgYWZ0ZXIgZHJvcHBpbmcgb3h1LT5sb2NrLgorICovCitzdGF0aWMgdm9pZCBlaGNpX3dvcmsoc3RydWN0IG94dV9oY2QgKm94dSkKK3sKKwl0aW1lcl9hY3Rpb25fZG9uZShveHUsIFRJTUVSX0lPX1dBVENIRE9HKTsKKwlpZiAob3h1LT5yZWNsYWltX3JlYWR5KQorCQllbmRfdW5saW5rX2FzeW5jKG94dSk7CisKKwkvKiBhbm90aGVyIENQVSBtYXkgZHJvcCBveHUtPmxvY2sgZHVyaW5nIGEgc2NoZWR1bGUgc2NhbiB3aGlsZQorCSAqIGl0IHJlcG9ydHMgdXJiIGNvbXBsZXRpb25zLiAgdGhpcyBmbGFnIGd1YXJkcyBhZ2FpbnN0IGJvZ3VzCisJICogYXR0ZW1wdHMgYXQgcmUtZW50cmFudCBzY2hlZHVsZSBzY2FubmluZy4KKwkgKi8KKwlpZiAob3h1LT5zY2FubmluZykKKwkJcmV0dXJuOworCW94dS0+c2Nhbm5pbmcgPSAxOworCXNjYW5fYXN5bmMob3h1KTsKKwlpZiAob3h1LT5uZXh0X3VmcmFtZSAhPSAtMSkKKwkJc2Nhbl9wZXJpb2RpYyhveHUpOworCW94dS0+c2Nhbm5pbmcgPSAwOworCisJLyogdGhlIElPIHdhdGNoZG9nIGd1YXJkcyBhZ2FpbnN0IGhhcmR3YXJlIG9yIGRyaXZlciBidWdzIHRoYXQKKwkgKiBtaXNwbGFjZSBJUlFzLCBhbmQgc2hvdWxkIGxldCB1cyBydW4gY29tcGxldGVseSB3aXRob3V0IElSUXMuCisJICogc3VjaCBsb3NzYWdlIGhhcyBiZWVuIG9ic2VydmVkIG9uIGJvdGggVlQ2MjAyIGFuZCBWVDgyMzUuCisJICovCisJaWYgKEhDX0lTX1JVTk5JTkcob3h1X3RvX2hjZChveHUpLT5zdGF0ZSkgJiYKKwkJCShveHUtPmFzeW5jLT5xaF9uZXh0LnB0ciAhPSBOVUxMIHx8CisJCQkgb3h1LT5wZXJpb2RpY19zY2hlZCAhPSAwKSkKKwkJdGltZXJfYWN0aW9uKG94dSwgVElNRVJfSU9fV0FUQ0hET0cpOworfQorCitzdGF0aWMgdm9pZCB1bmxpbmtfYXN5bmMoc3RydWN0IG94dV9oY2QgKm94dSwgc3RydWN0IGVoY2lfcWggKnFoKQoreworCS8qIGlmIHdlIG5lZWQgdG8gdXNlIElBQSBhbmQgaXQncyBidXN5LCBkZWZlciAqLworCWlmIChxaC0+cWhfc3RhdGUgPT0gUUhfU1RBVEVfTElOS0VECisJCQkmJiBveHUtPnJlY2xhaW0KKwkJCSYmIEhDX0lTX1JVTk5JTkcob3h1X3RvX2hjZChveHUpLT5zdGF0ZSkpIHsKKwkJc3RydWN0IGVoY2lfcWgJCSpsYXN0OworCisJCWZvciAobGFzdCA9IG94dS0+cmVjbGFpbTsKKwkJCQlsYXN0LT5yZWNsYWltOworCQkJCWxhc3QgPSBsYXN0LT5yZWNsYWltKQorCQkJY29udGludWU7CisJCXFoLT5xaF9zdGF0ZSA9IFFIX1NUQVRFX1VOTElOS19XQUlUOworCQlsYXN0LT5yZWNsYWltID0gcWg7CisKKwkvKiBieXBhc3MgSUFBIGlmIHRoZSBoYyBjYW4ndCBjYXJlICovCisJfSBlbHNlIGlmICghSENfSVNfUlVOTklORyhveHVfdG9faGNkKG94dSktPnN0YXRlKSAmJiBveHUtPnJlY2xhaW0pCisJCWVuZF91bmxpbmtfYXN5bmMob3h1KTsKKworCS8qIHNvbWV0aGluZyBlbHNlIG1pZ2h0IGhhdmUgdW5saW5rZWQgdGhlIHFoIGJ5IG5vdyAqLworCWlmIChxaC0+cWhfc3RhdGUgPT0gUUhfU1RBVEVfTElOS0VEKQorCQlzdGFydF91bmxpbmtfYXN5bmMob3h1LCBxaCk7Cit9CisKKy8qCisgKiBVU0IgaG9zdCBjb250cm9sbGVyIG1ldGhvZHMKKyAqLworCitzdGF0aWMgaXJxcmV0dXJuX3Qgb3h1MjEwX2hjZF9pcnEoc3RydWN0IHVzYl9oY2QgKmhjZCkKK3sKKwlzdHJ1Y3Qgb3h1X2hjZCAqb3h1ID0gaGNkX3RvX294dShoY2QpOworCXUzMiBzdGF0dXMsIHBjZF9zdGF0dXMgPSAwOworCWludCBiaDsKKworCXNwaW5fbG9jaygmb3h1LT5sb2NrKTsKKworCXN0YXR1cyA9IHJlYWRsKCZveHUtPnJlZ3MtPnN0YXR1cyk7CisKKwkvKiBlLmcuIGNhcmRidXMgcGh5c2ljYWwgZWplY3QgKi8KKwlpZiAoc3RhdHVzID09IH4odTMyKSAwKSB7CisJCW94dV9kYmcob3h1LCAiZGV2aWNlIHJlbW92ZWRcbiIpOworCQlnb3RvIGRlYWQ7CisJfQorCisJc3RhdHVzICY9IElOVFJfTUFTSzsKKwlpZiAoIXN0YXR1cykgewkJCS8qIGlycSBzaGFyaW5nPyAqLworCQlzcGluX3VubG9jaygmb3h1LT5sb2NrKTsKKwkJcmV0dXJuIElSUV9OT05FOworCX0KKworCS8qIGNsZWFyIChqdXN0KSBpbnRlcnJ1cHRzICovCisJd3JpdGVsKHN0YXR1cywgJm94dS0+cmVncy0+c3RhdHVzKTsKKwlyZWFkbCgmb3h1LT5yZWdzLT5jb21tYW5kKTsJLyogdW5ibG9jayBwb3N0ZWQgd3JpdGUgKi8KKwliaCA9IDA7CisKKyNpZmRlZiBPWFVfVkVSQk9TRV9ERUJVRworCS8qIHVucmVxdWVzdGVkL2lnbm9yZWQ6IEZyYW1lIExpc3QgUm9sbG92ZXIgKi8KKwlkYmdfc3RhdHVzKG94dSwgImlycSIsIHN0YXR1cyk7CisjZW5kaWYKKworCS8qIElOVCwgRVJSLCBhbmQgSUFBIGludGVycnVwdCByYXRlcyBjYW4gYmUgdGhyb3R0bGVkICovCisKKwkvKiBub3JtYWwgWzQuMTUuMS4yXSBvciBlcnJvciBbNC4xNS4xLjFdIGNvbXBsZXRpb24gKi8KKwlpZiAobGlrZWx5KChzdGF0dXMgJiAoU1RTX0lOVHxTVFNfRVJSKSkgIT0gMCkpCisJCWJoID0gMTsKKworCS8qIGNvbXBsZXRlIHRoZSB1bmxpbmtpbmcgb2Ygc29tZSBxaCBbNC4xNS4yLjNdICovCisJaWYgKHN0YXR1cyAmIFNUU19JQUEpIHsKKwkJb3h1LT5yZWNsYWltX3JlYWR5ID0gMTsKKwkJYmggPSAxOworCX0KKworCS8qIHJlbW90ZSB3YWtldXAgWzQuMy4xXSAqLworCWlmIChzdGF0dXMgJiBTVFNfUENEKSB7CisJCXVuc2lnbmVkIGkgPSBIQ1NfTl9QT1JUUyhveHUtPmhjc19wYXJhbXMpOworCQlwY2Rfc3RhdHVzID0gc3RhdHVzOworCisJCS8qIHJlc3VtZSByb290IGh1Yj8gKi8KKwkJaWYgKCEocmVhZGwoJm94dS0+cmVncy0+Y29tbWFuZCkgJiBDTURfUlVOKSkKKwkJCXVzYl9oY2RfcmVzdW1lX3Jvb3RfaHViKGhjZCk7CisKKwkJd2hpbGUgKGktLSkgeworCQkJaW50IHBzdGF0dXMgPSByZWFkbCgmb3h1LT5yZWdzLT5wb3J0X3N0YXR1c1tpXSk7CisKKwkJCWlmIChwc3RhdHVzICYgUE9SVF9PV05FUikKKwkJCQljb250aW51ZTsKKwkJCWlmICghKHBzdGF0dXMgJiBQT1JUX1JFU1VNRSkKKwkJCQkJfHwgb3h1LT5yZXNldF9kb25lW2ldICE9IDApCisJCQkJY29udGludWU7CisKKwkJCS8qIHN0YXJ0IDIwIG1zZWMgcmVzdW1lIHNpZ25hbGluZyBmcm9tIHRoaXMgcG9ydCwKKwkJCSAqIGFuZCBtYWtlIGtodWJkIGNvbGxlY3QgUE9SVF9TVEFUX0NfU1VTUEVORCB0bworCQkJICogc3RvcCB0aGF0IHNpZ25hbGluZy4KKwkJCSAqLworCQkJb3h1LT5yZXNldF9kb25lW2ldID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoMjApOworCQkJb3h1X2RiZyhveHUsICJwb3J0ICVkIHJlbW90ZSB3YWtldXBcbiIsIGkgKyAxKTsKKwkJCW1vZF90aW1lcigmaGNkLT5yaF90aW1lciwgb3h1LT5yZXNldF9kb25lW2ldKTsKKwkJfQorCX0KKworCS8qIFBDSSBlcnJvcnMgWzQuMTUuMi40XSAqLworCWlmICh1bmxpa2VseSgoc3RhdHVzICYgU1RTX0ZBVEFMKSAhPSAwKSkgeworCQkvKiBib2d1cyAiZmF0YWwiIElSUXMgYXBwZWFyIG9uIHNvbWUgY2hpcHMuLi4gd2h5PyAgKi8KKwkJc3RhdHVzID0gcmVhZGwoJm94dS0+cmVncy0+c3RhdHVzKTsKKwkJZGJnX2NtZChveHUsICJmYXRhbCIsIHJlYWRsKCZveHUtPnJlZ3MtPmNvbW1hbmQpKTsKKwkJZGJnX3N0YXR1cyhveHUsICJmYXRhbCIsIHN0YXR1cyk7CisJCWlmIChzdGF0dXMgJiBTVFNfSEFMVCkgeworCQkJb3h1X2VycihveHUsICJmYXRhbCBlcnJvclxuIik7CitkZWFkOgorCQkJZWhjaV9yZXNldChveHUpOworCQkJd3JpdGVsKDAsICZveHUtPnJlZ3MtPmNvbmZpZ3VyZWRfZmxhZyk7CisJCQkvKiBnZW5lcmljIGxheWVyIGtpbGxzL3VubGlua3MgYWxsIHVyYnMsIHRoZW4KKwkJCSAqIHVzZXMgb3h1X3N0b3AgdG8gY2xlYW4gdXAgdGhlIHJlc3QKKwkJCSAqLworCQkJYmggPSAxOworCQl9CisJfQorCisJaWYgKGJoKQorCQllaGNpX3dvcmsob3h1KTsKKwlzcGluX3VubG9jaygmb3h1LT5sb2NrKTsKKwlpZiAocGNkX3N0YXR1cyAmIFNUU19QQ0QpCisJCXVzYl9oY2RfcG9sbF9yaF9zdGF0dXMoaGNkKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBveHVfaXJxKHN0cnVjdCB1c2JfaGNkICpoY2QpCit7CisJc3RydWN0IG94dV9oY2QgKm94dSA9IGhjZF90b19veHUoaGNkKTsKKwlpbnQgcmV0ID0gSVJRX0hBTkRMRUQ7CisKKwl1MzIgc3RhdHVzID0gb3h1X3JlYWRsKGhjZC0+cmVncywgT1hVX0NISVBJUlFTVEFUVVMpOworCXUzMiBlbmFibGUgPSBveHVfcmVhZGwoaGNkLT5yZWdzLCBPWFVfQ0hJUElSUUVOX1NFVCk7CisKKwkvKiBEaXNhYmxlIGFsbCBpbnRlcnJ1cHQgKi8KKwlveHVfd3JpdGVsKGhjZC0+cmVncywgT1hVX0NISVBJUlFFTl9DTFIsIGVuYWJsZSk7CisKKwlpZiAoKG94dS0+aXNfb3RnICYmIChzdGF0dXMgJiBPWFVfVVNCT1RHSSkpIHx8CisJCSghb3h1LT5pc19vdGcgJiYgKHN0YXR1cyAmIE9YVV9VU0JTUEhJKSkpCisJCW94dTIxMF9oY2RfaXJxKGhjZCk7CisJZWxzZQorCQlyZXQgPSBJUlFfTk9ORTsKKworCS8qIEVuYWJsZSBhbGwgaW50ZXJydXB0IGJhY2sgKi8KKwlveHVfd3JpdGVsKGhjZC0+cmVncywgT1hVX0NISVBJUlFFTl9TRVQsIGVuYWJsZSk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBveHVfd2F0Y2hkb2codW5zaWduZWQgbG9uZyBwYXJhbSkKK3sKKwlzdHJ1Y3Qgb3h1X2hjZAkqb3h1ID0gKHN0cnVjdCBveHVfaGNkICopIHBhcmFtOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmb3h1LT5sb2NrLCBmbGFncyk7CisKKwkvKiBsb3N0IElBQSBpcnFzIHdlZGdlIHRoaW5ncyBiYWRseTsgc2VlbiB3aXRoIGEgdnQ4MjM1ICovCisJaWYgKG94dS0+cmVjbGFpbSkgeworCQl1MzIgc3RhdHVzID0gcmVhZGwoJm94dS0+cmVncy0+c3RhdHVzKTsKKwkJaWYgKHN0YXR1cyAmIFNUU19JQUEpIHsKKwkJCW94dV92ZGJnKG94dSwgImxvc3QgSUFBXG4iKTsKKwkJCXdyaXRlbChTVFNfSUFBLCAmb3h1LT5yZWdzLT5zdGF0dXMpOworCQkJb3h1LT5yZWNsYWltX3JlYWR5ID0gMTsKKwkJfQorCX0KKworCS8qIHN0b3AgYXN5bmMgcHJvY2Vzc2luZyBhZnRlciBpdCdzIGlkbGVkIGEgYml0ICovCisJaWYgKHRlc3RfYml0KFRJTUVSX0FTWU5DX09GRiwgJm94dS0+YWN0aW9ucykpCisJCXN0YXJ0X3VubGlua19hc3luYyhveHUsIG94dS0+YXN5bmMpOworCisJLyogb3h1IGNvdWxkIHJ1biBieSB0aW1lciwgd2l0aG91dCBJUlFzIC4uLiAqLworCWVoY2lfd29yayhveHUpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmb3h1LT5sb2NrLCBmbGFncyk7Cit9CisKKy8qIE9uZS10aW1lIGluaXQsIG9ubHkgZm9yIG1lbW9yeSBzdGF0ZS4KKyAqLworc3RhdGljIGludCBveHVfaGNkX2luaXQoc3RydWN0IHVzYl9oY2QgKmhjZCkKK3sKKwlzdHJ1Y3Qgb3h1X2hjZCAqb3h1ID0gaGNkX3RvX294dShoY2QpOworCXUzMiB0ZW1wOworCWludCByZXR2YWw7CisJdTMyIGhjY19wYXJhbXM7CisKKwlzcGluX2xvY2tfaW5pdCgmb3h1LT5sb2NrKTsKKworCWluaXRfdGltZXIoJm94dS0+d2F0Y2hkb2cpOworCW94dS0+d2F0Y2hkb2cuZnVuY3Rpb24gPSBveHVfd2F0Y2hkb2c7CisJb3h1LT53YXRjaGRvZy5kYXRhID0gKHVuc2lnbmVkIGxvbmcpIG94dTsKKworCS8qCisJICogaHcgZGVmYXVsdDogMUsgcGVyaW9kaWMgbGlzdCBoZWFkcywgb25lIHBlciBmcmFtZS4KKwkgKiBwZXJpb2RpY19zaXplIGNhbiBzaHJpbmsgYnkgVVNCQ01EIHVwZGF0ZSBpZiBoY2NfcGFyYW1zIGFsbG93cy4KKwkgKi8KKwlveHUtPnBlcmlvZGljX3NpemUgPSBERUZBVUxUX0lfVERQUzsKKwlyZXR2YWwgPSBlaGNpX21lbV9pbml0KG94dSwgR0ZQX0tFUk5FTCk7CisJaWYgKHJldHZhbCA8IDApCisJCXJldHVybiByZXR2YWw7CisKKwkvKiBjb250cm9sbGVycyBtYXkgY2FjaGUgc29tZSBvZiB0aGUgcGVyaW9kaWMgc2NoZWR1bGUgLi4uICovCisJaGNjX3BhcmFtcyA9IHJlYWRsKCZveHUtPmNhcHMtPmhjY19wYXJhbXMpOworCWlmIChIQ0NfSVNPQ19DQUNIRShoY2NfcGFyYW1zKSkJCS8qIGZ1bGwgZnJhbWUgY2FjaGUgKi8KKwkJb3h1LT5pX3RocmVzaCA9IDg7CisJZWxzZQkJCQkJLyogTiBtaWNyb2ZyYW1lcyBjYWNoZWQgKi8KKwkJb3h1LT5pX3RocmVzaCA9IDIgKyBIQ0NfSVNPQ19USFJFUyhoY2NfcGFyYW1zKTsKKworCW94dS0+cmVjbGFpbSA9IE5VTEw7CisJb3h1LT5yZWNsYWltX3JlYWR5ID0gMDsKKwlveHUtPm5leHRfdWZyYW1lID0gLTE7CisKKwkvKgorCSAqIGRlZGljYXRlIGEgcWggZm9yIHRoZSBhc3luYyByaW5nIGhlYWQsIHNpbmNlIHdlIGNvdWxkbid0IHVubGluaworCSAqIGEgJ3JlYWwnIHFoIHdpdGhvdXQgc3RvcHBpbmcgdGhlIGFzeW5jIHNjaGVkdWxlIFs0LjhdLiAgdXNlIGl0CisJICogYXMgdGhlICdyZWNsYW1hdGlvbiBsaXN0IGhlYWQnIHRvby4KKwkgKiBpdHMgZHVtbXkgaXMgdXNlZCBpbiBod19hbHRfbmV4dCBvZiBtYW55IHRkcywgdG8gcHJldmVudCB0aGUgcWgKKwkgKiBmcm9tIGF1dG9tYXRpY2FsbHkgYWR2YW5jaW5nIHRvIHRoZSBuZXh0IHRkIGFmdGVyIHNob3J0IHJlYWRzLgorCSAqLworCW94dS0+YXN5bmMtPnFoX25leHQucWggPSBOVUxMOworCW94dS0+YXN5bmMtPmh3X25leHQgPSBRSF9ORVhUKG94dS0+YXN5bmMtPnFoX2RtYSk7CisJb3h1LT5hc3luYy0+aHdfaW5mbzEgPSBjcHVfdG9fbGUzMihRSF9IRUFEKTsKKwlveHUtPmFzeW5jLT5od190b2tlbiA9IGNwdV90b19sZTMyKFFURF9TVFNfSEFMVCk7CisJb3h1LT5hc3luYy0+aHdfcXRkX25leHQgPSBFSENJX0xJU1RfRU5EOworCW94dS0+YXN5bmMtPnFoX3N0YXRlID0gUUhfU1RBVEVfTElOS0VEOworCW94dS0+YXN5bmMtPmh3X2FsdF9uZXh0ID0gUVREX05FWFQob3h1LT5hc3luYy0+ZHVtbXktPnF0ZF9kbWEpOworCisJLyogY2xlYXIgaW50ZXJydXB0IGVuYWJsZXMsIHNldCBpcnEgbGF0ZW5jeSAqLworCWlmIChsb2cyX2lycV90aHJlc2ggPCAwIHx8IGxvZzJfaXJxX3RocmVzaCA+IDYpCisJCWxvZzJfaXJxX3RocmVzaCA9IDA7CisJdGVtcCA9IDEgPDwgKDE2ICsgbG9nMl9pcnFfdGhyZXNoKTsKKwlpZiAoSENDX0NBTlBBUksoaGNjX3BhcmFtcykpIHsKKwkJLyogSFcgZGVmYXVsdCBwYXJrID09IDMsIG9uIGhhcmR3YXJlIHRoYXQgc3VwcG9ydHMgaXQgKGxpa2UKKwkJICogTlZpZGlhIGFuZCBBTEkgc2lsaWNvbiksIG1heGltaXplcyB0aHJvdWdocHV0IG9uIHRoZSBhc3luYworCQkgKiBzY2hlZHVsZSBieSBhdm9pZGluZyBRSCBmZXRjaGVzIGJldHdlZW4gdHJhbnNmZXJzLgorCQkgKgorCQkgKiBXaXRoIGZhc3QgdXNiIHN0b3JhZ2UgZGV2aWNlcyBhbmQgTkZvcmNlMiwgInBhcmsiIHNlZW1zIHRvCisJCSAqIG1ha2UgcHJvYmxlbXM6ICB0aHJvdWdocHV0IHJlZHVjdGlvbiAoISksIGRhdGEgZXJyb3JzLi4uCisJCSAqLworCQlpZiAocGFyaykgeworCQkJcGFyayA9IG1pbihwYXJrLCAodW5zaWduZWQpIDMpOworCQkJdGVtcCB8PSBDTURfUEFSSzsKKwkJCXRlbXAgfD0gcGFyayA8PCA4OworCQl9CisJCW94dV9kYmcob3h1LCAicGFyayAlZFxuIiwgcGFyayk7CisJfQorCWlmIChIQ0NfUEdNX0ZSQU1FTElTVExFTihoY2NfcGFyYW1zKSkgeworCQkvKiBwZXJpb2RpYyBzY2hlZHVsZSBzaXplIGNhbiBiZSBzbWFsbGVyIHRoYW4gZGVmYXVsdCAqLworCQl0ZW1wICY9IH4oMyA8PCAyKTsKKwkJdGVtcCB8PSAoRUhDSV9UVU5FX0ZMUyA8PCAyKTsKKwl9CisJb3h1LT5jb21tYW5kID0gdGVtcDsKKworCXJldHVybiAwOworfQorCisvKiBDYWxsZWQgZHVyaW5nIHByb2JlKCkgYWZ0ZXIgY2hpcCByZXNldCBjb21wbGV0ZXMuCisgKi8KK3N0YXRpYyBpbnQgb3h1X3Jlc2V0KHN0cnVjdCB1c2JfaGNkICpoY2QpCit7CisJc3RydWN0IG94dV9oY2QgKm94dSA9IGhjZF90b19veHUoaGNkKTsKKwlpbnQgcmV0OworCisJc3Bpbl9sb2NrX2luaXQoJm94dS0+bWVtX2xvY2spOworCUlOSVRfTElTVF9IRUFEKCZveHUtPnVyYl9saXN0KTsKKwlveHUtPnVyYl9sZW4gPSAwOworCisJLyogRklNWEUgKi8KKwloY2QtPnNlbGYuY29udHJvbGxlci0+ZG1hX21hc2sgPSAwVUw7CisKKwlpZiAob3h1LT5pc19vdGcpIHsKKwkJb3h1LT5jYXBzID0gaGNkLT5yZWdzICsgT1hVX09UR19DQVBfT0ZGU0VUOworCQlveHUtPnJlZ3MgPSBoY2QtPnJlZ3MgKyBPWFVfT1RHX0NBUF9PRkZTRVQgKyBcCisJCQlIQ19MRU5HVEgocmVhZGwoJm94dS0+Y2Fwcy0+aGNfY2FwYmFzZSkpOworCisJCW94dS0+bWVtID0gaGNkLT5yZWdzICsgT1hVX1NQSF9NRU07CisJfSBlbHNlIHsKKwkJb3h1LT5jYXBzID0gaGNkLT5yZWdzICsgT1hVX1NQSF9DQVBfT0ZGU0VUOworCQlveHUtPnJlZ3MgPSBoY2QtPnJlZ3MgKyBPWFVfU1BIX0NBUF9PRkZTRVQgKyBcCisJCQlIQ19MRU5HVEgocmVhZGwoJm94dS0+Y2Fwcy0+aGNfY2FwYmFzZSkpOworCisJCW94dS0+bWVtID0gaGNkLT5yZWdzICsgT1hVX09UR19NRU07CisJfQorCisJb3h1LT5oY3NfcGFyYW1zID0gcmVhZGwoJm94dS0+Y2Fwcy0+aGNzX3BhcmFtcyk7CisJb3h1LT5zYnJuID0gMHgyMDsKKworCXJldCA9IG94dV9oY2RfaW5pdChoY2QpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBveHVfcnVuKHN0cnVjdCB1c2JfaGNkICpoY2QpCit7CisJc3RydWN0IG94dV9oY2QgKm94dSA9IGhjZF90b19veHUoaGNkKTsKKwlpbnQgcmV0dmFsOworCXUzMiB0ZW1wLCBoY2NfcGFyYW1zOworCisJaGNkLT51c2VzX25ld19wb2xsaW5nID0gMTsKKwloY2QtPnBvbGxfcmggPSAwOworCisJLyogRUhDSSBzcGVjIHNlY3Rpb24gNC4xICovCisJcmV0dmFsID0gZWhjaV9yZXNldChveHUpOworCWlmIChyZXR2YWwgIT0gMCkgeworCQllaGNpX21lbV9jbGVhbnVwKG94dSk7CisJCXJldHVybiByZXR2YWw7CisJfQorCXdyaXRlbChveHUtPnBlcmlvZGljX2RtYSwgJm94dS0+cmVncy0+ZnJhbWVfbGlzdCk7CisJd3JpdGVsKCh1MzIpIG94dS0+YXN5bmMtPnFoX2RtYSwgJm94dS0+cmVncy0+YXN5bmNfbmV4dCk7CisKKwkvKiBoY2NfcGFyYW1zIGNvbnRyb2xzIHdoZXRoZXIgb3h1LT5yZWdzLT5zZWdtZW50IG11c3QgKCEhISkKKwkgKiBiZSB1c2VkOyBpdCBjb25zdHJhaW5zIFFIL0lURC9TSVREIGFuZCBRVEQgbG9jYXRpb25zLgorCSAqIHBjaV9wb29sIGNvbnNpc3RlbnQgbWVtb3J5IGFsd2F5cyB1c2VzIHNlZ21lbnQgemVyby4KKwkgKiBzdHJlYW1pbmcgbWFwcGluZ3MgZm9yIEkvTyBidWZmZXJzLCBsaWtlIHBjaV9tYXBfc2luZ2xlKCksCisJICogY2FuIHJldHVybiBzZWdtZW50cyBhYm92ZSA0R0IsIGlmIHRoZSBkZXZpY2UgYWxsb3dzLgorCSAqCisJICogTk9URTogIHRoZSBkbWEgbWFzayBpcyB2aXNpYmxlIHRocm91Z2ggZG1hX3N1cHBvcnRlZCgpLCBzbworCSAqIGRyaXZlcnMgY2FuIHBhc3MgdGhpcyBpbmZvIGFsb25nIC4uLiBsaWtlIE5FVElGX0ZfSElHSERNQSwKKwkgKiBTY3NpX0hvc3QuaGlnaG1lbV9pbywgYW5kIHNvIGZvcnRoLiAgSXQncyByZWFkb25seSB0byBhbGwKKwkgKiBob3N0IHNpZGUgZHJpdmVycyB0aG91Z2guCisJICovCisJaGNjX3BhcmFtcyA9IHJlYWRsKCZveHUtPmNhcHMtPmhjY19wYXJhbXMpOworCWlmIChIQ0NfNjRCSVRfQUREUihoY2NfcGFyYW1zKSkKKwkJd3JpdGVsKDAsICZveHUtPnJlZ3MtPnNlZ21lbnQpOworCisJb3h1LT5jb21tYW5kICY9IH4oQ01EX0xSRVNFVCB8IENNRF9JQUFEIHwgQ01EX1BTRSB8CisJCQkJQ01EX0FTRSB8IENNRF9SRVNFVCk7CisJb3h1LT5jb21tYW5kIHw9IENNRF9SVU47CisJd3JpdGVsKG94dS0+Y29tbWFuZCwgJm94dS0+cmVncy0+Y29tbWFuZCk7CisJZGJnX2NtZChveHUsICJpbml0Iiwgb3h1LT5jb21tYW5kKTsKKworCS8qCisJICogU3RhcnQsIGVuYWJsaW5nIGZ1bGwgVVNCIDIuMCBmdW5jdGlvbmFsaXR5IC4uLiB1c2IgMS4xIGRldmljZXMKKwkgKiBhcmUgZXhwbGljaXRseSBoYW5kZWQgdG8gY29tcGFuaW9uIGNvbnRyb2xsZXIocyksIHNvIG5vIFRUIGlzCisJICogaW52b2x2ZWQgd2l0aCB0aGUgcm9vdCBodWIuICAoRXhjZXB0IHdoZXJlIG9uZSBpcyBpbnRlZ3JhdGVkLAorCSAqIGFuZCB0aGVyZSdzIG5vIGNvbXBhbmlvbiBjb250cm9sbGVyIHVubGVzcyBtYXliZSBmb3IgVVNCIE9URy4pCisJICovCisJaGNkLT5zdGF0ZSA9IEhDX1NUQVRFX1JVTk5JTkc7CisJd3JpdGVsKEZMQUdfQ0YsICZveHUtPnJlZ3MtPmNvbmZpZ3VyZWRfZmxhZyk7CisJcmVhZGwoJm94dS0+cmVncy0+Y29tbWFuZCk7CS8qIHVuYmxvY2sgcG9zdGVkIHdyaXRlcyAqLworCisJdGVtcCA9IEhDX1ZFUlNJT04ocmVhZGwoJm94dS0+Y2Fwcy0+aGNfY2FwYmFzZSkpOworCW94dV9pbmZvKG94dSwgIlVTQiAleC4leCBzdGFydGVkLCBxdWFzaS1FSENJICV4LiUwMngsIGRyaXZlciAlcyVzXG4iLAorCQkoKG94dS0+c2JybiAmIDB4ZjApPj40KSwgKG94dS0+c2JybiAmIDB4MGYpLAorCQl0ZW1wID4+IDgsIHRlbXAgJiAweGZmLCBEUklWRVJfVkVSU0lPTiwKKwkJaWdub3JlX29jID8gIiwgb3ZlcmN1cnJlbnQgaWdub3JlZCIgOiAiIik7CisKKwl3cml0ZWwoSU5UUl9NQVNLLCAmb3h1LT5yZWdzLT5pbnRyX2VuYWJsZSk7IC8qIFR1cm4gT24gSW50ZXJydXB0cyAqLworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIG94dV9zdG9wKHN0cnVjdCB1c2JfaGNkICpoY2QpCit7CisJc3RydWN0IG94dV9oY2QgKm94dSA9IGhjZF90b19veHUoaGNkKTsKKworCS8qIFR1cm4gb2ZmIHBvcnQgcG93ZXIgb24gYWxsIHJvb3QgaHViIHBvcnRzLiAqLworCWVoY2lfcG9ydF9wb3dlcihveHUsIDApOworCisJLyogbm8gbW9yZSBpbnRlcnJ1cHRzIC4uLiAqLworCWRlbF90aW1lcl9zeW5jKCZveHUtPndhdGNoZG9nKTsKKworCXNwaW5fbG9ja19pcnEoJm94dS0+bG9jayk7CisJaWYgKEhDX0lTX1JVTk5JTkcoaGNkLT5zdGF0ZSkpCisJCWVoY2lfcXVpZXNjZShveHUpOworCisJZWhjaV9yZXNldChveHUpOworCXdyaXRlbCgwLCAmb3h1LT5yZWdzLT5pbnRyX2VuYWJsZSk7CisJc3Bpbl91bmxvY2tfaXJxKCZveHUtPmxvY2spOworCisJLyogbGV0IGNvbXBhbmlvbiBjb250cm9sbGVycyB3b3JrIHdoZW4gd2UgYXJlbid0ICovCisJd3JpdGVsKDAsICZveHUtPnJlZ3MtPmNvbmZpZ3VyZWRfZmxhZyk7CisKKwkvKiByb290IGh1YiBpcyBzaHV0IGRvd24gc2VwYXJhdGVseSAoZmlyc3QsIHdoZW4gcG9zc2libGUpICovCisJc3Bpbl9sb2NrX2lycSgmb3h1LT5sb2NrKTsKKwlpZiAob3h1LT5hc3luYykKKwkJZWhjaV93b3JrKG94dSk7CisJc3Bpbl91bmxvY2tfaXJxKCZveHUtPmxvY2spOworCWVoY2lfbWVtX2NsZWFudXAob3h1KTsKKworCWRiZ19zdGF0dXMob3h1LCAib3h1X3N0b3AgY29tcGxldGVkIiwgcmVhZGwoJm94dS0+cmVncy0+c3RhdHVzKSk7Cit9CisKKy8qIEtpY2sgaW4gZm9yIHNpbGljb24gb24gYW55IGJ1cyAobm90IGp1c3QgcGNpLCBldGMpLgorICogVGhpcyBmb3JjaWJseSBkaXNhYmxlcyBkbWEgYW5kIElSUXMsIGhlbHBpbmcga2V4ZWMgYW5kIG90aGVyIGNhc2VzCisgKiB3aGVyZSB0aGUgbmV4dCBzeXN0ZW0gc29mdHdhcmUgbWF5IGV4cGVjdCBjbGVhbiBzdGF0ZS4KKyAqLworc3RhdGljIHZvaWQgb3h1X3NodXRkb3duKHN0cnVjdCB1c2JfaGNkICpoY2QpCit7CisJc3RydWN0IG94dV9oY2QgKm94dSA9IGhjZF90b19veHUoaGNkKTsKKworCSh2b2lkKSBlaGNpX2hhbHQob3h1KTsKKwllaGNpX3R1cm5fb2ZmX2FsbF9wb3J0cyhveHUpOworCisJLyogbWFrZSBCSU9TL2V0YyB1c2UgY29tcGFuaW9uIGNvbnRyb2xsZXIgZHVyaW5nIHJlYm9vdCAqLworCXdyaXRlbCgwLCAmb3h1LT5yZWdzLT5jb25maWd1cmVkX2ZsYWcpOworCisJLyogdW5ibG9jayBwb3N0ZWQgd3JpdGVzICovCisJcmVhZGwoJm94dS0+cmVncy0+Y29uZmlndXJlZF9mbGFnKTsKK30KKworLyogTm9uLWVycm9yIHJldHVybnMgYXJlIGEgcHJvbWlzZSB0byBnaXZlYmFjaygpIHRoZSB1cmIgbGF0ZXIKKyAqIHdlIGRyb3Agb3duZXJzaGlwIHNvIG5leHQgb3duZXIgKG9yIHVyYiB1bmxpbmspIGNhbiBnZXQgaXQKKyAqCisgKiB1cmIgKyBkZXYgaXMgaW4gaGNkLnNlbGYuY29udHJvbGxlci51cmJfbGlzdAorICogd2UncmUgcXVldWVpbmcgVERzIG9udG8gc29mdHdhcmUgYW5kIGhhcmR3YXJlIGxpc3RzCisgKgorICogaGNkLXNwZWNpZmljIGluaXQgZm9yIGhjcHJpdiBoYXNuJ3QgYmVlbiBkb25lIHlldAorICoKKyAqIE5PVEU6ICBjb250cm9sLCBidWxrLCBhbmQgaW50ZXJydXB0IHNoYXJlIHRoZSBzYW1lIGNvZGUgdG8gYXBwZW5kIFREcworICogdG8gYSAocG9zc2libHkgYWN0aXZlKSBRSCwgYW5kIHRoZSBzYW1lIFFIIHNjYW5uaW5nIGNvZGUuCisgKi8KK3N0YXRpYyBpbnQgX19veHVfdXJiX2VucXVldWUoc3RydWN0IHVzYl9oY2QgKmhjZCwgc3RydWN0IHVyYiAqdXJiLAorCQkJCWdmcF90IG1lbV9mbGFncykKK3sKKwlzdHJ1Y3Qgb3h1X2hjZCAqb3h1ID0gaGNkX3RvX294dShoY2QpOworCXN0cnVjdCBsaXN0X2hlYWQgcXRkX2xpc3Q7CisKKwlJTklUX0xJU1RfSEVBRCgmcXRkX2xpc3QpOworCisJc3dpdGNoICh1c2JfcGlwZXR5cGUodXJiLT5waXBlKSkgeworCWNhc2UgUElQRV9DT05UUk9MOgorCWNhc2UgUElQRV9CVUxLOgorCWRlZmF1bHQ6CisJCWlmICghcWhfdXJiX3RyYW5zYWN0aW9uKG94dSwgdXJiLCAmcXRkX2xpc3QsIG1lbV9mbGFncykpCisJCQlyZXR1cm4gLUVOT01FTTsKKwkJcmV0dXJuIHN1Ym1pdF9hc3luYyhveHUsIHVyYiwgJnF0ZF9saXN0LCBtZW1fZmxhZ3MpOworCisJY2FzZSBQSVBFX0lOVEVSUlVQVDoKKwkJaWYgKCFxaF91cmJfdHJhbnNhY3Rpb24ob3h1LCB1cmIsICZxdGRfbGlzdCwgbWVtX2ZsYWdzKSkKKwkJCXJldHVybiAtRU5PTUVNOworCQlyZXR1cm4gaW50cl9zdWJtaXQob3h1LCB1cmIsICZxdGRfbGlzdCwgbWVtX2ZsYWdzKTsKKworCWNhc2UgUElQRV9JU09DSFJPTk9VUzoKKwkJaWYgKHVyYi0+ZGV2LT5zcGVlZCA9PSBVU0JfU1BFRURfSElHSCkKKwkJCXJldHVybiBpdGRfc3VibWl0KG94dSwgdXJiLCBtZW1fZmxhZ3MpOworCQllbHNlCisJCQlyZXR1cm4gc2l0ZF9zdWJtaXQob3h1LCB1cmIsIG1lbV9mbGFncyk7CisJfQorfQorCisvKiBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBicmVha2luZyBVUkJzIHdpdGggYmlnIGRhdGEgc2l6ZQorICogaW50byBzbWFsbGVyIHNpemUgYW5kIHByb2Nlc3Npbmcgc21hbGwgdXJicyBpbiBzZXF1ZW5jZS4KKyAqLworc3RhdGljIGludCBveHVfdXJiX2VucXVldWUoc3RydWN0IHVzYl9oY2QgKmhjZCwgc3RydWN0IHVyYiAqdXJiLAorCQkJCWdmcF90IG1lbV9mbGFncykKK3sKKwlzdHJ1Y3Qgb3h1X2hjZCAqb3h1ID0gaGNkX3RvX294dShoY2QpOworCWludCBudW0sIHJlbTsKKwlpbnQgdHJhbnNmZXJfYnVmZmVyX2xlbmd0aDsKKwl2b2lkICp0cmFuc2Zlcl9idWZmZXI7CisJc3RydWN0IHVyYiAqbXVyYjsKKwlpbnQgaSwgcmV0OworCisJLyogSWYgbm90IGJ1bGsgcGlwZSBqdXN0IGVucXVldWUgdGhlIFVSQiAqLworCWlmICghdXNiX3BpcGVidWxrKHVyYi0+cGlwZSkpCisJCXJldHVybiBfX294dV91cmJfZW5xdWV1ZShoY2QsIHVyYiwgbWVtX2ZsYWdzKTsKKworCS8qIE90aGVyd2lzZSB3ZSBzaG91bGQgdmVyaWZ5IHRoZSBVU0IgdHJhbnNmZXIgYnVmZmVyIHNpemUhICovCisJdHJhbnNmZXJfYnVmZmVyID0gdXJiLT50cmFuc2Zlcl9idWZmZXI7CisJdHJhbnNmZXJfYnVmZmVyX2xlbmd0aCA9IHVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aDsKKworCW51bSA9IHVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCAvIDQwOTY7CisJcmVtID0gdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoICUgNDA5NjsKKwlpZiAocmVtICE9IDApCisJCW51bSsrOworCisJLyogSWYgVVJCIGlzIHNtYWxsZXIgdGhhbiA0MDk2IGJ5dGVzIGp1c3QgZW5xdWV1ZSBpdCEgKi8KKwlpZiAobnVtID09IDEpCisJCXJldHVybiBfX294dV91cmJfZW5xdWV1ZShoY2QsIHVyYiwgbWVtX2ZsYWdzKTsKKworCS8qIE9rLCB3ZSBoYXZlIG1vcmUgam9iIHRvIGRvISA6KSAqLworCisJZm9yIChpID0gMDsgaSA8IG51bSAtIDE7IGkrKykgeworCQkvKiBHZXQgZnJlZSBtaWNybyBVUkIgcG9sbCB0aWxsIGEgZnJlZSB1cmIgaXMgcmVjaWV2ZWQgKi8KKworCQlkbyB7CisJCQltdXJiID0gKHN0cnVjdCB1cmIgKikgb3h1X211cmJfYWxsb2Mob3h1KTsKKwkJCWlmICghbXVyYikKKwkJCQlzY2hlZHVsZSgpOworCQl9IHdoaWxlICghbXVyYik7CisKKwkJLyogQ29waW5nIHRoZSB1cmIgKi8KKwkJbWVtY3B5KG11cmIsIHVyYiwgc2l6ZW9mKHN0cnVjdCB1cmIpKTsKKworCQltdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoID0gNDA5NjsKKwkJbXVyYi0+dHJhbnNmZXJfYnVmZmVyID0gdHJhbnNmZXJfYnVmZmVyICsgaSAqIDQwOTY7CisKKwkJLyogTnVsbCBwb2ludGVyIGZvciB0aGUgZW5jb2RlcyB0aGF0IHRoaXMgaXMgYSBtaWNybyB1cmIgKi8KKwkJbXVyYi0+Y29tcGxldGUgPSBOVUxMOworCisJCSgoc3RydWN0IG94dV9tdXJiICopIG11cmIpLT5tYWluID0gdXJiOworCQkoKHN0cnVjdCBveHVfbXVyYiAqKSBtdXJiKS0+bGFzdCA9IDA7CisKKwkJLyogVGhpcyBsb29wIGlzIHRvIGd1YXJhbnRlZSB1cmIgdG8gYmUgcHJvY2Vzc2VkIHdoZW4gdGhlcmUncworCQkgKiBub3QgZW5vdWdoIHJlc291cmNlcyBhdCBhIHBhcnRpY3VsYXIgdGltZSBieSByZXRyeWluZy4KKwkJICovCisJCWRvIHsKKwkJCXJldCAgPSBfX294dV91cmJfZW5xdWV1ZShoY2QsIG11cmIsIG1lbV9mbGFncyk7CisJCQlpZiAocmV0KQorCQkJCXNjaGVkdWxlKCk7CisJCX0gd2hpbGUgKHJldCk7CisJfQorCisJLyogTGFzdCB1cmIgcmVxdWlyZXMgc3BlY2lhbCBoYW5kbGluZyAgKi8KKworCS8qIEdldCBmcmVlIG1pY3JvIFVSQiBwb2xsIHRpbGwgYSBmcmVlIHVyYiBpcyByZWNpZXZlZCAqLworCWRvIHsKKwkJbXVyYiA9IChzdHJ1Y3QgdXJiICopIG94dV9tdXJiX2FsbG9jKG94dSk7CisJCWlmICghbXVyYikKKwkJCXNjaGVkdWxlKCk7CisJfSB3aGlsZSAoIW11cmIpOworCisJLyogQ29waW5nIHRoZSB1cmIgKi8KKwltZW1jcHkobXVyYiwgdXJiLCBzaXplb2Yoc3RydWN0IHVyYikpOworCisJbXVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCA9IHJlbSA+IDAgPyByZW0gOiA0MDk2OworCW11cmItPnRyYW5zZmVyX2J1ZmZlciA9IHRyYW5zZmVyX2J1ZmZlciArIChudW0gLSAxKSAqIDQwOTY7CisKKwkvKiBOdWxsIHBvaW50ZXIgZm9yIHRoZSBlbmNvZGVzIHRoYXQgdGhpcyBpcyBhIG1pY3JvIHVyYiAqLworCW11cmItPmNvbXBsZXRlID0gTlVMTDsKKworCSgoc3RydWN0IG94dV9tdXJiICopIG11cmIpLT5tYWluID0gdXJiOworCSgoc3RydWN0IG94dV9tdXJiICopIG11cmIpLT5sYXN0ID0gMTsKKworCWRvIHsKKwkJcmV0ID0gX19veHVfdXJiX2VucXVldWUoaGNkLCBtdXJiLCBtZW1fZmxhZ3MpOworCQlpZiAocmV0KQorCQkJc2NoZWR1bGUoKTsKKwl9IHdoaWxlIChyZXQpOworCisJcmV0dXJuIHJldDsKK30KKworLyogUmVtb3ZlIGZyb20gaGFyZHdhcmUgbGlzdHMuCisgKiBDb21wbGV0aW9ucyBub3JtYWxseSBoYXBwZW4gYXN5bmNocm9ub3VzbHkKKyAqLworc3RhdGljIGludCBveHVfdXJiX2RlcXVldWUoc3RydWN0IHVzYl9oY2QgKmhjZCwgc3RydWN0IHVyYiAqdXJiLCBpbnQgc3RhdHVzKQoreworCXN0cnVjdCBveHVfaGNkICpveHUgPSBoY2RfdG9fb3h1KGhjZCk7CisJc3RydWN0IGVoY2lfcWggKnFoOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmb3h1LT5sb2NrLCBmbGFncyk7CisJc3dpdGNoICh1c2JfcGlwZXR5cGUodXJiLT5waXBlKSkgeworCWNhc2UgUElQRV9DT05UUk9MOgorCWNhc2UgUElQRV9CVUxLOgorCWRlZmF1bHQ6CisJCXFoID0gKHN0cnVjdCBlaGNpX3FoICopIHVyYi0+aGNwcml2OworCQlpZiAoIXFoKQorCQkJYnJlYWs7CisJCXVubGlua19hc3luYyhveHUsIHFoKTsKKwkJYnJlYWs7CisKKwljYXNlIFBJUEVfSU5URVJSVVBUOgorCQlxaCA9IChzdHJ1Y3QgZWhjaV9xaCAqKSB1cmItPmhjcHJpdjsKKwkJaWYgKCFxaCkKKwkJCWJyZWFrOworCQlzd2l0Y2ggKHFoLT5xaF9zdGF0ZSkgeworCQljYXNlIFFIX1NUQVRFX0xJTktFRDoKKwkJCWludHJfZGVzY2hlZHVsZShveHUsIHFoKTsKKwkJCS8qIEZBTEwgVEhST1VHSCAqLworCQljYXNlIFFIX1NUQVRFX0lETEU6CisJCQlxaF9jb21wbGV0aW9ucyhveHUsIHFoKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJb3h1X2RiZyhveHUsICJib2d1cyBxaCAlcCBzdGF0ZSAlZFxuIiwKKwkJCQkJcWgsIHFoLT5xaF9zdGF0ZSk7CisJCQlnb3RvIGRvbmU7CisJCX0KKworCQkvKiByZXNjaGVkdWxlIFFIIGlmZiBhbm90aGVyIHJlcXVlc3QgaXMgcXVldWVkICovCisJCWlmICghbGlzdF9lbXB0eSgmcWgtPnF0ZF9saXN0KQorCQkJCSYmIEhDX0lTX1JVTk5JTkcoaGNkLT5zdGF0ZSkpIHsKKwkJCWludCBzdGF0dXM7CisKKwkJCXN0YXR1cyA9IHFoX3NjaGVkdWxlKG94dSwgcWgpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmb3h1LT5sb2NrLCBmbGFncyk7CisKKwkJCWlmIChzdGF0dXMgIT0gMCkgeworCQkJCS8qIHNob3VsZG4ndCBoYXBwZW4gb2Z0ZW4sIGJ1dCAuLi4KKwkJCQkgKiBGSVhNRSBraWxsIHRob3NlIHRkcycgdXJicworCQkJCSAqLworCQkJCWVycigiY2FuJ3QgcmVzY2hlZHVsZSBxaCAlcCwgZXJyICVkIiwKKwkJCQkJcWgsIHN0YXR1cyk7CisJCQl9CisJCQlyZXR1cm4gc3RhdHVzOworCQl9CisJCWJyZWFrOworCX0KK2RvbmU6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmb3h1LT5sb2NrLCBmbGFncyk7CisJcmV0dXJuIDA7Cit9CisKKy8qIEJ1bGsgcWggaG9sZHMgdGhlIGRhdGEgdG9nZ2xlICovCitzdGF0aWMgdm9pZCBveHVfZW5kcG9pbnRfZGlzYWJsZShzdHJ1Y3QgdXNiX2hjZCAqaGNkLAorCQkJCQlzdHJ1Y3QgdXNiX2hvc3RfZW5kcG9pbnQgKmVwKQoreworCXN0cnVjdCBveHVfaGNkICpveHUgPSBoY2RfdG9fb3h1KGhjZCk7CisJdW5zaWduZWQgbG9uZwkJZmxhZ3M7CisJc3RydWN0IGVoY2lfcWgJCSpxaCwgKnRtcDsKKworCS8qIEFTU0VSVDogIGFueSByZXF1ZXN0cy91cmJzIGFyZSBiZWluZyB1bmxpbmtlZCAqLworCS8qIEFTU0VSVDogIG5vYm9keSBjYW4gYmUgc3VibWl0dGluZyB1cmJzIGZvciB0aGlzIGFueSBtb3JlICovCisKK3Jlc2NhbjoKKwlzcGluX2xvY2tfaXJxc2F2ZSgmb3h1LT5sb2NrLCBmbGFncyk7CisJcWggPSBlcC0+aGNwcml2OworCWlmICghcWgpCisJCWdvdG8gZG9uZTsKKworCS8qIGVuZHBvaW50cyBjYW4gYmUgaXNvIHN0cmVhbXMuICBmb3Igbm93LCB3ZSBkb24ndAorCSAqIGFjY2VsZXJhdGUgaXNvIGNvbXBsZXRpb25zIC4uLiBzbyBzcGluIGEgd2hpbGUuCisJICovCisJaWYgKHFoLT5od19pbmZvMSA9PSAwKSB7CisJCW94dV92ZGJnKG94dSwgImlzbyBkZWxheVxuIik7CisJCWdvdG8gaWRsZV90aW1lb3V0OworCX0KKworCWlmICghSENfSVNfUlVOTklORyhoY2QtPnN0YXRlKSkKKwkJcWgtPnFoX3N0YXRlID0gUUhfU1RBVEVfSURMRTsKKwlzd2l0Y2ggKHFoLT5xaF9zdGF0ZSkgeworCWNhc2UgUUhfU1RBVEVfTElOS0VEOgorCQlmb3IgKHRtcCA9IG94dS0+YXN5bmMtPnFoX25leHQucWg7CisJCQkJdG1wICYmIHRtcCAhPSBxaDsKKwkJCQl0bXAgPSB0bXAtPnFoX25leHQucWgpCisJCQljb250aW51ZTsKKwkJLyogcGVyaW9kaWMgcWggc2VsZi11bmxpbmtzIG9uIGVtcHR5ICovCisJCWlmICghdG1wKQorCQkJZ290byBub2dvb2Q7CisJCXVubGlua19hc3luYyhveHUsIHFoKTsKKwkJLyogRkFMTCBUSFJPVUdIICovCisJY2FzZSBRSF9TVEFURV9VTkxJTks6CQkvKiB3YWl0IGZvciBodyB0byBmaW5pc2g/ICovCitpZGxlX3RpbWVvdXQ6CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm94dS0+bG9jaywgZmxhZ3MpOworCQlzY2hlZHVsZV90aW1lb3V0X3VuaW50ZXJydXB0aWJsZSgxKTsKKwkJZ290byByZXNjYW47CisJY2FzZSBRSF9TVEFURV9JRExFOgkJLyogZnVsbHkgdW5saW5rZWQgKi8KKwkJaWYgKGxpc3RfZW1wdHkoJnFoLT5xdGRfbGlzdCkpIHsKKwkJCXFoX3B1dChxaCk7CisJCQlicmVhazsKKwkJfQorCQkvKiBlbHNlIEZBTEwgVEhST1VHSCAqLworCWRlZmF1bHQ6Citub2dvb2Q6CisJCS8qIGNhbGxlciB3YXMgc3VwcG9zZWQgdG8gaGF2ZSB1bmxpbmtlZCBhbnkgcmVxdWVzdHM7CisJCSAqIHRoYXQncyBub3Qgb3VyIGpvYi4gIGp1c3QgbGVhayB0aGlzIG1lbW9yeS4KKwkJICovCisJCW94dV9lcnIob3h1LCAicWggJXAgKCMlMDJ4KSBzdGF0ZSAlZCVzXG4iLAorCQkJcWgsIGVwLT5kZXNjLmJFbmRwb2ludEFkZHJlc3MsIHFoLT5xaF9zdGF0ZSwKKwkJCWxpc3RfZW1wdHkoJnFoLT5xdGRfbGlzdCkgPyAiIiA6ICIoaGFzIHRkcykiKTsKKwkJYnJlYWs7CisJfQorCWVwLT5oY3ByaXYgPSBOVUxMOworZG9uZToKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZveHUtPmxvY2ssIGZsYWdzKTsKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBpbnQgb3h1X2dldF9mcmFtZShzdHJ1Y3QgdXNiX2hjZCAqaGNkKQoreworCXN0cnVjdCBveHVfaGNkICpveHUgPSBoY2RfdG9fb3h1KGhjZCk7CisKKwlyZXR1cm4gKHJlYWRsKCZveHUtPnJlZ3MtPmZyYW1lX2luZGV4KSA+PiAzKSAlCisJCW94dS0+cGVyaW9kaWNfc2l6ZTsKK30KKworLyogQnVpbGQgInN0YXR1cyBjaGFuZ2UiIHBhY2tldCAob25lIG9yIHR3byBieXRlcykgZnJvbSBIQyByZWdpc3RlcnMgKi8KK3N0YXRpYyBpbnQgb3h1X2h1Yl9zdGF0dXNfZGF0YShzdHJ1Y3QgdXNiX2hjZCAqaGNkLCBjaGFyICpidWYpCit7CisJc3RydWN0IG94dV9oY2QgKm94dSA9IGhjZF90b19veHUoaGNkKTsKKwl1MzIgdGVtcCwgbWFzaywgc3RhdHVzID0gMDsKKwlpbnQgcG9ydHMsIGksIHJldHZhbCA9IDE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8qIGlmICFVU0JfU1VTUEVORCwgcm9vdCBodWIgdGltZXJzIHdvbid0IGdldCBzaHV0IGRvd24gLi4uICovCisJaWYgKCFIQ19JU19SVU5OSU5HKGhjZC0+c3RhdGUpKQorCQlyZXR1cm4gMDsKKworCS8qIGluaXQgc3RhdHVzIHRvIG5vLWNoYW5nZXMgKi8KKwlidWZbMF0gPSAwOworCXBvcnRzID0gSENTX05fUE9SVFMob3h1LT5oY3NfcGFyYW1zKTsKKwlpZiAocG9ydHMgPiA3KSB7CisJCWJ1ZlsxXSA9IDA7CisJCXJldHZhbCsrOworCX0KKworCS8qIFNvbWUgYm9hcmRzIChtb3N0bHkgVklBPykgcmVwb3J0IGJvZ3VzIG92ZXJjdXJyZW50IGluZGljYXRpb25zLAorCSAqIGNhdXNpbmcgbWFzc2l2ZSBsb2cgc3BhbSB1bmxlc3Mgd2UgY29tcGxldGVseSBpZ25vcmUgdGhlbS4gIEl0CisJICogbWF5IGJlIHJlbGV2YW50IHRoYXQgVklBIFZUODIzNSBjb250cm9sZXJzLCB3aGVyZSBQT1JUX1BPV0VSIGlzCisJICogYWx3YXlzIHNldCwgc2VlbSB0byBjbGVhciBQT1JUX09DQyBhbmQgUE9SVF9DU0Mgd2hlbiB3cml0aW5nIHRvCisJICogUE9SVF9QT1dFUjsgdGhhdCdzIHN1cnByaXNpbmcsIGJ1dCBtYXliZSB3aXRoaW4tc3BlYy4KKwkgKi8KKwlpZiAoIWlnbm9yZV9vYykKKwkJbWFzayA9IFBPUlRfQ1NDIHwgUE9SVF9QRUMgfCBQT1JUX09DQzsKKwllbHNlCisJCW1hc2sgPSBQT1JUX0NTQyB8IFBPUlRfUEVDOworCisJLyogbm8gaHViIGNoYW5nZSByZXBvcnRzIChiaXQgMCkgZm9yIG5vdyAocG93ZXIsIC4uLikgKi8KKworCS8qIHBvcnQgTiBjaGFuZ2VzIChiaXQgTik/ICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJm94dS0+bG9jaywgZmxhZ3MpOworCWZvciAoaSA9IDA7IGkgPCBwb3J0czsgaSsrKSB7CisJCXRlbXAgPSByZWFkbCgmb3h1LT5yZWdzLT5wb3J0X3N0YXR1c1tpXSk7CisKKwkJLyoKKwkJICogUmV0dXJuIHN0YXR1cyBpbmZvcm1hdGlvbiBldmVuIGZvciBwb3J0cyB3aXRoIE9XTkVSIHNldC4KKwkJICogT3RoZXJ3aXNlIGtodWJkIHdvdWxkbid0IHNlZSB0aGUgZGlzY29ubmVjdCBldmVudCB3aGVuIGEKKwkJICogaGlnaC1zcGVlZCBkZXZpY2UgaXMgc3dpdGNoZWQgb3ZlciB0byB0aGUgY29tcGFuaW9uCisJCSAqIGNvbnRyb2xsZXIgYnkgdGhlIHVzZXIuCisJCSAqLworCisJCWlmICghKHRlbXAgJiBQT1JUX0NPTk5FQ1QpKQorCQkJb3h1LT5yZXNldF9kb25lW2ldID0gMDsKKwkJaWYgKCh0ZW1wICYgbWFzaykgIT0gMCB8fCAoKHRlbXAgJiBQT1JUX1JFU1VNRSkgIT0gMCAmJgorCQkJCXRpbWVfYWZ0ZXJfZXEoamlmZmllcywgb3h1LT5yZXNldF9kb25lW2ldKSkpIHsKKwkJCWlmIChpIDwgNykKKwkJCQlidWZbMF0gfD0gMSA8PCAoaSArIDEpOworCQkJZWxzZQorCQkJCWJ1ZlsxXSB8PSAxIDw8IChpIC0gNyk7CisJCQlzdGF0dXMgPSBTVFNfUENEOworCQl9CisJfQorCS8qIEZJWE1FIGF1dG9zdXNwZW5kIGlkbGUgcm9vdCBodWJzICovCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmb3h1LT5sb2NrLCBmbGFncyk7CisJcmV0dXJuIHN0YXR1cyA/IHJldHZhbCA6IDA7Cit9CisKKy8qIFJldHVybnMgdGhlIHNwZWVkIG9mIGEgZGV2aWNlIGF0dGFjaGVkIHRvIGEgcG9ydCBvbiB0aGUgcm9vdCBodWIuICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBveHVfcG9ydF9zcGVlZChzdHJ1Y3Qgb3h1X2hjZCAqb3h1LAorCQkJCQkJdW5zaWduZWQgaW50IHBvcnRzYykKK3sKKwlzd2l0Y2ggKChwb3J0c2MgPj4gMjYpICYgMykgeworCWNhc2UgMDoKKwkJcmV0dXJuIDA7CisJY2FzZSAxOgorCQlyZXR1cm4gMSA8PCBVU0JfUE9SVF9GRUFUX0xPV1NQRUVEOworCWNhc2UgMjoKKwlkZWZhdWx0OgorCQlyZXR1cm4gMSA8PCBVU0JfUE9SVF9GRUFUX0hJR0hTUEVFRDsKKwl9Cit9CisKKyNkZWZpbmUJUE9SVF9XQUtFX0JJVFMJKFBPUlRfV0tPQ19FfFBPUlRfV0tESVNDX0V8UE9SVF9XS0NPTk5fRSkKK3N0YXRpYyBpbnQgb3h1X2h1Yl9jb250cm9sKHN0cnVjdCB1c2JfaGNkICpoY2QsIHUxNiB0eXBlUmVxLAorCQkJCXUxNiB3VmFsdWUsIHUxNiB3SW5kZXgsIGNoYXIgKmJ1ZiwgdTE2IHdMZW5ndGgpCit7CisJc3RydWN0IG94dV9oY2QgKm94dSA9IGhjZF90b19veHUoaGNkKTsKKwlpbnQgcG9ydHMgPSBIQ1NfTl9QT1JUUyhveHUtPmhjc19wYXJhbXMpOworCXUzMiBfX2lvbWVtICpzdGF0dXNfcmVnID0gJm94dS0+cmVncy0+cG9ydF9zdGF0dXNbd0luZGV4IC0gMV07CisJdTMyIHRlbXAsIHN0YXR1czsKKwl1bnNpZ25lZCBsb25nCWZsYWdzOworCWludCByZXR2YWwgPSAwOworCXVuc2lnbmVkIHNlbGVjdG9yOworCisJLyoKKwkgKiBGSVhNRTogIHN1cHBvcnQgU2V0UG9ydEZlYXR1cmVzIFVTQl9QT1JUX0ZFQVRfSU5ESUNBVE9SLgorCSAqIEhDU19JTkRJQ0FUT1IgbWF5IHNheSB3ZSBjYW4gY2hhbmdlIExFRHMgdG8gb2ZmL2FtYmVyL2dyZWVuLgorCSAqICh0cmFjayBjdXJyZW50IHN0YXRlIG91cnNlbHZlcykgLi4uIGJsaW5rIGZvciBkaWFnbm9zdGljcywKKwkgKiBwb3dlciwgInRoaXMgaXMgdGhlIG9uZSIsIGV0Yy4gIEVIQ0kgc3BlYyBzdXBwb3J0cyB0aGlzLgorCSAqLworCisJc3Bpbl9sb2NrX2lycXNhdmUoJm94dS0+bG9jaywgZmxhZ3MpOworCXN3aXRjaCAodHlwZVJlcSkgeworCWNhc2UgQ2xlYXJIdWJGZWF0dXJlOgorCQlzd2l0Y2ggKHdWYWx1ZSkgeworCQljYXNlIENfSFVCX0xPQ0FMX1BPV0VSOgorCQljYXNlIENfSFVCX09WRVJfQ1VSUkVOVDoKKwkJCS8qIG5vIGh1Yi13aWRlIGZlYXR1cmUvc3RhdHVzIGZsYWdzICovCisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWdvdG8gZXJyb3I7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBDbGVhclBvcnRGZWF0dXJlOgorCQlpZiAoIXdJbmRleCB8fCB3SW5kZXggPiBwb3J0cykKKwkJCWdvdG8gZXJyb3I7CisJCXdJbmRleC0tOworCQl0ZW1wID0gcmVhZGwoc3RhdHVzX3JlZyk7CisKKwkJLyoKKwkJICogRXZlbiBpZiBPV05FUiBpcyBzZXQsIHNvIHRoZSBwb3J0IGlzIG93bmVkIGJ5IHRoZQorCQkgKiBjb21wYW5pb24gY29udHJvbGxlciwga2h1YmQgbmVlZHMgdG8gYmUgYWJsZSB0byBjbGVhcgorCQkgKiB0aGUgcG9ydC1jaGFuZ2Ugc3RhdHVzIGJpdHMgKGVzcGVjaWFsbHkKKwkJICogVVNCX1BPUlRfRkVBVF9DX0NPTk5FQ1RJT04pLgorCQkgKi8KKworCQlzd2l0Y2ggKHdWYWx1ZSkgeworCQljYXNlIFVTQl9QT1JUX0ZFQVRfRU5BQkxFOgorCQkJd3JpdGVsKHRlbXAgJiB+UE9SVF9QRSwgc3RhdHVzX3JlZyk7CisJCQlicmVhazsKKwkJY2FzZSBVU0JfUE9SVF9GRUFUX0NfRU5BQkxFOgorCQkJd3JpdGVsKCh0ZW1wICYgflBPUlRfUldDX0JJVFMpIHwgUE9SVF9QRUMsIHN0YXR1c19yZWcpOworCQkJYnJlYWs7CisJCWNhc2UgVVNCX1BPUlRfRkVBVF9TVVNQRU5EOgorCQkJaWYgKHRlbXAgJiBQT1JUX1JFU0VUKQorCQkJCWdvdG8gZXJyb3I7CisJCQlpZiAodGVtcCAmIFBPUlRfU1VTUEVORCkgeworCQkJCWlmICgodGVtcCAmIFBPUlRfUEUpID09IDApCisJCQkJCWdvdG8gZXJyb3I7CisJCQkJLyogcmVzdW1lIHNpZ25hbGluZyBmb3IgMjAgbXNlYyAqLworCQkJCXRlbXAgJj0gfihQT1JUX1JXQ19CSVRTIHwgUE9SVF9XQUtFX0JJVFMpOworCQkJCXdyaXRlbCh0ZW1wIHwgUE9SVF9SRVNVTUUsIHN0YXR1c19yZWcpOworCQkJCW94dS0+cmVzZXRfZG9uZVt3SW5kZXhdID0gamlmZmllcworCQkJCQkJKyBtc2Vjc190b19qaWZmaWVzKDIwKTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFVTQl9QT1JUX0ZFQVRfQ19TVVNQRU5EOgorCQkJLyogd2UgYXV0by1jbGVhciB0aGlzIGZlYXR1cmUgKi8KKwkJCWJyZWFrOworCQljYXNlIFVTQl9QT1JUX0ZFQVRfUE9XRVI6CisJCQlpZiAoSENTX1BQQyhveHUtPmhjc19wYXJhbXMpKQorCQkJCXdyaXRlbCh0ZW1wICYgfihQT1JUX1JXQ19CSVRTIHwgUE9SVF9QT1dFUiksCisJCQkJCSAgc3RhdHVzX3JlZyk7CisJCQlicmVhazsKKwkJY2FzZSBVU0JfUE9SVF9GRUFUX0NfQ09OTkVDVElPTjoKKwkJCXdyaXRlbCgodGVtcCAmIH5QT1JUX1JXQ19CSVRTKSB8IFBPUlRfQ1NDLCBzdGF0dXNfcmVnKTsKKwkJCWJyZWFrOworCQljYXNlIFVTQl9QT1JUX0ZFQVRfQ19PVkVSX0NVUlJFTlQ6CisJCQl3cml0ZWwoKHRlbXAgJiB+UE9SVF9SV0NfQklUUykgfCBQT1JUX09DQywgc3RhdHVzX3JlZyk7CisJCQlicmVhazsKKwkJY2FzZSBVU0JfUE9SVF9GRUFUX0NfUkVTRVQ6CisJCQkvKiBHZXRQb3J0U3RhdHVzIGNsZWFycyByZXNldCAqLworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlnb3RvIGVycm9yOworCQl9CisJCXJlYWRsKCZveHUtPnJlZ3MtPmNvbW1hbmQpOwkvKiB1bmJsb2NrIHBvc3RlZCB3cml0ZSAqLworCQlicmVhazsKKwljYXNlIEdldEh1YkRlc2NyaXB0b3I6CisJCWVoY2lfaHViX2Rlc2NyaXB0b3Iob3h1LCAoc3RydWN0IHVzYl9odWJfZGVzY3JpcHRvciAqKQorCQkJYnVmKTsKKwkJYnJlYWs7CisJY2FzZSBHZXRIdWJTdGF0dXM6CisJCS8qIG5vIGh1Yi13aWRlIGZlYXR1cmUvc3RhdHVzIGZsYWdzICovCisJCW1lbXNldChidWYsIDAsIDQpOworCQlicmVhazsKKwljYXNlIEdldFBvcnRTdGF0dXM6CisJCWlmICghd0luZGV4IHx8IHdJbmRleCA+IHBvcnRzKQorCQkJZ290byBlcnJvcjsKKwkJd0luZGV4LS07CisJCXN0YXR1cyA9IDA7CisJCXRlbXAgPSByZWFkbChzdGF0dXNfcmVnKTsKKworCQkvKiB3UG9ydENoYW5nZSBiaXRzICovCisJCWlmICh0ZW1wICYgUE9SVF9DU0MpCisJCQlzdGF0dXMgfD0gMSA8PCBVU0JfUE9SVF9GRUFUX0NfQ09OTkVDVElPTjsKKwkJaWYgKHRlbXAgJiBQT1JUX1BFQykKKwkJCXN0YXR1cyB8PSAxIDw8IFVTQl9QT1JUX0ZFQVRfQ19FTkFCTEU7CisJCWlmICgodGVtcCAmIFBPUlRfT0NDKSAmJiAhaWdub3JlX29jKQorCQkJc3RhdHVzIHw9IDEgPDwgVVNCX1BPUlRfRkVBVF9DX09WRVJfQ1VSUkVOVDsKKworCQkvKiB3aG9ldmVyIHJlc3VtZXMgbXVzdCBHZXRQb3J0U3RhdHVzIHRvIGNvbXBsZXRlIGl0ISEgKi8KKwkJaWYgKHRlbXAgJiBQT1JUX1JFU1VNRSkgeworCisJCQkvKiBSZW1vdGUgV2FrZXVwIHJlY2VpdmVkPyAqLworCQkJaWYgKCFveHUtPnJlc2V0X2RvbmVbd0luZGV4XSkgeworCQkJCS8qIHJlc3VtZSBzaWduYWxpbmcgZm9yIDIwIG1zZWMgKi8KKwkJCQlveHUtPnJlc2V0X2RvbmVbd0luZGV4XSA9IGppZmZpZXMKKwkJCQkJCSsgbXNlY3NfdG9famlmZmllcygyMCk7CisJCQkJLyogY2hlY2sgdGhlIHBvcnQgYWdhaW4gKi8KKwkJCQltb2RfdGltZXIoJm94dV90b19oY2Qob3h1KS0+cmhfdGltZXIsCisJCQkJCQlveHUtPnJlc2V0X2RvbmVbd0luZGV4XSk7CisJCQl9CisKKwkJCS8qIHJlc3VtZSBjb21wbGV0ZWQ/ICovCisJCQllbHNlIGlmICh0aW1lX2FmdGVyX2VxKGppZmZpZXMsCisJCQkJCW94dS0+cmVzZXRfZG9uZVt3SW5kZXhdKSkgeworCQkJCXN0YXR1cyB8PSAxIDw8IFVTQl9QT1JUX0ZFQVRfQ19TVVNQRU5EOworCQkJCW94dS0+cmVzZXRfZG9uZVt3SW5kZXhdID0gMDsKKworCQkJCS8qIHN0b3AgcmVzdW1lIHNpZ25hbGluZyAqLworCQkJCXRlbXAgPSByZWFkbChzdGF0dXNfcmVnKTsKKwkJCQl3cml0ZWwodGVtcCAmIH4oUE9SVF9SV0NfQklUUyB8IFBPUlRfUkVTVU1FKSwKKwkJCQkJc3RhdHVzX3JlZyk7CisJCQkJcmV0dmFsID0gaGFuZHNoYWtlKG94dSwgc3RhdHVzX3JlZywKKwkJCQkJICAgUE9SVF9SRVNVTUUsIDAsIDIwMDAgLyogMm1zZWMgKi8pOworCQkJCWlmIChyZXR2YWwgIT0gMCkgeworCQkJCQlveHVfZXJyKG94dSwKKwkJCQkJCSJwb3J0ICVkIHJlc3VtZSBlcnJvciAlZFxuIiwKKwkJCQkJCXdJbmRleCArIDEsIHJldHZhbCk7CisJCQkJCWdvdG8gZXJyb3I7CisJCQkJfQorCQkJCXRlbXAgJj0gfihQT1JUX1NVU1BFTkR8UE9SVF9SRVNVTUV8KDM8PDEwKSk7CisJCQl9CisJCX0KKworCQkvKiB3aG9ldmVyIHJlc2V0cyBtdXN0IEdldFBvcnRTdGF0dXMgdG8gY29tcGxldGUgaXQhISAqLworCQlpZiAoKHRlbXAgJiBQT1JUX1JFU0VUKQorCQkJCSYmIHRpbWVfYWZ0ZXJfZXEoamlmZmllcywKKwkJCQkJb3h1LT5yZXNldF9kb25lW3dJbmRleF0pKSB7CisJCQlzdGF0dXMgfD0gMSA8PCBVU0JfUE9SVF9GRUFUX0NfUkVTRVQ7CisJCQlveHUtPnJlc2V0X2RvbmVbd0luZGV4XSA9IDA7CisKKwkJCS8qIGZvcmNlIHJlc2V0IHRvIGNvbXBsZXRlICovCisJCQl3cml0ZWwodGVtcCAmIH4oUE9SVF9SV0NfQklUUyB8IFBPUlRfUkVTRVQpLAorCQkJCQlzdGF0dXNfcmVnKTsKKwkJCS8qIFJFVklTSVQ6ICBzb21lIGhhcmR3YXJlIG5lZWRzIDU1MCsgdXNlYyB0byBjbGVhcgorCQkJICogdGhpcyBiaXQ7IHNlZW1zIHRvbyBsb25nIHRvIHNwaW4gcm91dGluZWx5Li4uCisJCQkgKi8KKwkJCXJldHZhbCA9IGhhbmRzaGFrZShveHUsIHN0YXR1c19yZWcsCisJCQkJCVBPUlRfUkVTRVQsIDAsIDc1MCk7CisJCQlpZiAocmV0dmFsICE9IDApIHsKKwkJCQlveHVfZXJyKG94dSwgInBvcnQgJWQgcmVzZXQgZXJyb3IgJWRcbiIsCisJCQkJCXdJbmRleCArIDEsIHJldHZhbCk7CisJCQkJZ290byBlcnJvcjsKKwkJCX0KKworCQkJLyogc2VlIHdoYXQgd2UgZm91bmQgb3V0ICovCisJCQl0ZW1wID0gY2hlY2tfcmVzZXRfY29tcGxldGUob3h1LCB3SW5kZXgsIHN0YXR1c19yZWcsCisJCQkJCXJlYWRsKHN0YXR1c19yZWcpKTsKKwkJfQorCisJCS8qIHRyYW5zZmVyIGRlZGljYXRlZCBwb3J0cyB0byB0aGUgY29tcGFuaW9uIGhjICovCisJCWlmICgodGVtcCAmIFBPUlRfQ09OTkVDVCkgJiYKKwkJCQl0ZXN0X2JpdCh3SW5kZXgsICZveHUtPmNvbXBhbmlvbl9wb3J0cykpIHsKKwkJCXRlbXAgJj0gflBPUlRfUldDX0JJVFM7CisJCQl0ZW1wIHw9IFBPUlRfT1dORVI7CisJCQl3cml0ZWwodGVtcCwgc3RhdHVzX3JlZyk7CisJCQlveHVfZGJnKG94dSwgInBvcnQgJWQgLS0+IGNvbXBhbmlvblxuIiwgd0luZGV4ICsgMSk7CisJCQl0ZW1wID0gcmVhZGwoc3RhdHVzX3JlZyk7CisJCX0KKworCQkvKgorCQkgKiBFdmVuIGlmIE9XTkVSIGlzIHNldCwgdGhlcmUncyBubyBoYXJtIGxldHRpbmcga2h1YmQKKwkJICogc2VlIHRoZSB3UG9ydFN0YXR1cyB2YWx1ZXMgKHRoZXkgc2hvdWxkIGFsbCBiZSAwIGV4Y2VwdAorCQkgKiBmb3IgUE9SVF9QT1dFUiBhbnl3YXkpLgorCQkgKi8KKworCQlpZiAodGVtcCAmIFBPUlRfQ09OTkVDVCkgeworCQkJc3RhdHVzIHw9IDEgPDwgVVNCX1BPUlRfRkVBVF9DT05ORUNUSU9OOworCQkJLyogc3RhdHVzIG1heSBiZSBmcm9tIGludGVncmF0ZWQgVFQgKi8KKwkJCXN0YXR1cyB8PSBveHVfcG9ydF9zcGVlZChveHUsIHRlbXApOworCQl9CisJCWlmICh0ZW1wICYgUE9SVF9QRSkKKwkJCXN0YXR1cyB8PSAxIDw8IFVTQl9QT1JUX0ZFQVRfRU5BQkxFOworCQlpZiAodGVtcCAmIChQT1JUX1NVU1BFTkR8UE9SVF9SRVNVTUUpKQorCQkJc3RhdHVzIHw9IDEgPDwgVVNCX1BPUlRfRkVBVF9TVVNQRU5EOworCQlpZiAodGVtcCAmIFBPUlRfT0MpCisJCQlzdGF0dXMgfD0gMSA8PCBVU0JfUE9SVF9GRUFUX09WRVJfQ1VSUkVOVDsKKwkJaWYgKHRlbXAgJiBQT1JUX1JFU0VUKQorCQkJc3RhdHVzIHw9IDEgPDwgVVNCX1BPUlRfRkVBVF9SRVNFVDsKKwkJaWYgKHRlbXAgJiBQT1JUX1BPV0VSKQorCQkJc3RhdHVzIHw9IDEgPDwgVVNCX1BPUlRfRkVBVF9QT1dFUjsKKworI2lmbmRlZglPWFVfVkVSQk9TRV9ERUJVRworCWlmIChzdGF0dXMgJiB+MHhmZmZmKQkvKiBvbmx5IGlmIHdQb3J0Q2hhbmdlIGlzIGludGVyZXN0aW5nICovCisjZW5kaWYKKwkJZGJnX3BvcnQob3h1LCAiR2V0U3RhdHVzIiwgd0luZGV4ICsgMSwgdGVtcCk7CisJCXB1dF91bmFsaWduZWQoY3B1X3RvX2xlMzIoc3RhdHVzKSwgKF9fbGUzMiAqKSBidWYpOworCQlicmVhazsKKwljYXNlIFNldEh1YkZlYXR1cmU6CisJCXN3aXRjaCAod1ZhbHVlKSB7CisJCWNhc2UgQ19IVUJfTE9DQUxfUE9XRVI6CisJCWNhc2UgQ19IVUJfT1ZFUl9DVVJSRU5UOgorCQkJLyogbm8gaHViLXdpZGUgZmVhdHVyZS9zdGF0dXMgZmxhZ3MgKi8KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZ290byBlcnJvcjsKKwkJfQorCQlicmVhazsKKwljYXNlIFNldFBvcnRGZWF0dXJlOgorCQlzZWxlY3RvciA9IHdJbmRleCA+PiA4OworCQl3SW5kZXggJj0gMHhmZjsKKwkJaWYgKCF3SW5kZXggfHwgd0luZGV4ID4gcG9ydHMpCisJCQlnb3RvIGVycm9yOworCQl3SW5kZXgtLTsKKwkJdGVtcCA9IHJlYWRsKHN0YXR1c19yZWcpOworCQlpZiAodGVtcCAmIFBPUlRfT1dORVIpCisJCQlicmVhazsKKworCQl0ZW1wICY9IH5QT1JUX1JXQ19CSVRTOworCQlzd2l0Y2ggKHdWYWx1ZSkgeworCQljYXNlIFVTQl9QT1JUX0ZFQVRfU1VTUEVORDoKKwkJCWlmICgodGVtcCAmIFBPUlRfUEUpID09IDAKKwkJCQkJfHwgKHRlbXAgJiBQT1JUX1JFU0VUKSAhPSAwKQorCQkJCWdvdG8gZXJyb3I7CisJCQlpZiAoZGV2aWNlX21heV93YWtldXAoJmhjZC0+c2VsZi5yb290X2h1Yi0+ZGV2KSkKKwkJCQl0ZW1wIHw9IFBPUlRfV0FLRV9CSVRTOworCQkJd3JpdGVsKHRlbXAgfCBQT1JUX1NVU1BFTkQsIHN0YXR1c19yZWcpOworCQkJYnJlYWs7CisJCWNhc2UgVVNCX1BPUlRfRkVBVF9QT1dFUjoKKwkJCWlmIChIQ1NfUFBDKG94dS0+aGNzX3BhcmFtcykpCisJCQkJd3JpdGVsKHRlbXAgfCBQT1JUX1BPV0VSLCBzdGF0dXNfcmVnKTsKKwkJCWJyZWFrOworCQljYXNlIFVTQl9QT1JUX0ZFQVRfUkVTRVQ6CisJCQlpZiAodGVtcCAmIFBPUlRfUkVTVU1FKQorCQkJCWdvdG8gZXJyb3I7CisJCQkvKiBsaW5lIHN0YXR1cyBiaXRzIG1heSByZXBvcnQgdGhpcyBhcyBsb3cgc3BlZWQsCisJCQkgKiB3aGljaCBjYW4gYmUgZmluZSBpZiB0aGlzIHJvb3QgaHViIGhhcyBhCisJCQkgKiB0cmFuc2FjdGlvbiB0cmFuc2xhdG9yIGJ1aWx0IGluLgorCQkJICovCisJCQlveHVfdmRiZyhveHUsICJwb3J0ICVkIHJlc2V0XG4iLCB3SW5kZXggKyAxKTsKKwkJCXRlbXAgfD0gUE9SVF9SRVNFVDsKKwkJCXRlbXAgJj0gflBPUlRfUEU7CisKKwkJCS8qCisJCQkgKiBjYWxsZXIgbXVzdCB3YWl0LCB0aGVuIGNhbGwgR2V0UG9ydFN0YXR1cworCQkJICogdXNiIDIuMCBzcGVjIHNheXMgNTAgbXMgcmVzZXRzIG9uIHJvb3QKKwkJCSAqLworCQkJb3h1LT5yZXNldF9kb25lW3dJbmRleF0gPSBqaWZmaWVzCisJCQkJCSsgbXNlY3NfdG9famlmZmllcyg1MCk7CisJCQl3cml0ZWwodGVtcCwgc3RhdHVzX3JlZyk7CisJCQlicmVhazsKKworCQkvKiBGb3IgZG93bnN0cmVhbSBmYWNpbmcgcG9ydHMgKHRoZXNlKTogIG9uZSBodWIgcG9ydCBpcyBwdXQKKwkJICogaW50byB0ZXN0IG1vZGUgYWNjb3JkaW5nIHRvIFVTQjIgMTEuMjQuMi4xMywgdGhlbiB0aGUgaHViCisJCSAqIG11c3QgYmUgcmVzZXQgKHdoaWNoIGZvciByb290IGh1YiBub3cgbWVhbnMgcm1tb2QrbW9kcHJvYmUsCisJCSAqIG9yIGVsc2Ugc3lzdGVtIHJlYm9vdCkuICBTZWUgRUhDSSAyLjMuOSBhbmQgNC4xNCBmb3IgaW5mbworCQkgKiBhYm91dCB0aGUgRUhDSS1zcGVjaWZpYyBzdHVmZi4KKwkJICovCisJCWNhc2UgVVNCX1BPUlRfRkVBVF9URVNUOgorCQkJaWYgKCFzZWxlY3RvciB8fCBzZWxlY3RvciA+IDUpCisJCQkJZ290byBlcnJvcjsKKwkJCWVoY2lfcXVpZXNjZShveHUpOworCQkJZWhjaV9oYWx0KG94dSk7CisJCQl0ZW1wIHw9IHNlbGVjdG9yIDw8IDE2OworCQkJd3JpdGVsKHRlbXAsIHN0YXR1c19yZWcpOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWdvdG8gZXJyb3I7CisJCX0KKwkJcmVhZGwoJm94dS0+cmVncy0+Y29tbWFuZCk7CS8qIHVuYmxvY2sgcG9zdGVkIHdyaXRlcyAqLworCQlicmVhazsKKworCWRlZmF1bHQ6CitlcnJvcjoKKwkJLyogInN0YWxsIiBvbiBlcnJvciAqLworCQlyZXR2YWwgPSAtRVBJUEU7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm94dS0+bG9jaywgZmxhZ3MpOworCXJldHVybiByZXR2YWw7Cit9CisKKyNpZmRlZiBDT05GSUdfUE0KKworc3RhdGljIGludCBveHVfYnVzX3N1c3BlbmQoc3RydWN0IHVzYl9oY2QgKmhjZCkKK3sKKwlzdHJ1Y3Qgb3h1X2hjZCAqb3h1ID0gaGNkX3RvX294dShoY2QpOworCWludCBwb3J0OworCWludCBtYXNrOworCisJb3h1X2RiZyhveHUsICJzdXNwZW5kIHJvb3QgaHViXG4iKTsKKworCWlmICh0aW1lX2JlZm9yZShqaWZmaWVzLCBveHUtPm5leHRfc3RhdGVjaGFuZ2UpKQorCQltc2xlZXAoNSk7CisKKwlwb3J0ID0gSENTX05fUE9SVFMob3h1LT5oY3NfcGFyYW1zKTsKKwlzcGluX2xvY2tfaXJxKCZveHUtPmxvY2spOworCisJLyogc3RvcCBzY2hlZHVsZXMsIGNsZWFuIGFueSBjb21wbGV0ZWQgd29yayAqLworCWlmIChIQ19JU19SVU5OSU5HKGhjZC0+c3RhdGUpKSB7CisJCWVoY2lfcXVpZXNjZShveHUpOworCQloY2QtPnN0YXRlID0gSENfU1RBVEVfUVVJRVNDSU5HOworCX0KKwlveHUtPmNvbW1hbmQgPSByZWFkbCgmb3h1LT5yZWdzLT5jb21tYW5kKTsKKwlpZiAob3h1LT5yZWNsYWltKQorCQlveHUtPnJlY2xhaW1fcmVhZHkgPSAxOworCWVoY2lfd29yayhveHUpOworCisJLyogVW5saWtlIG90aGVyIFVTQiBob3N0IGNvbnRyb2xsZXIgdHlwZXMsIEVIQ0kgZG9lc24ndCBoYXZlCisJICogYW55IG5vdGlvbiBvZiAiZ2xvYmFsIiBvciBidXMtd2lkZSBzdXNwZW5kLiAgVGhlIGRyaXZlciBoYXMKKwkgKiB0byBtYW51YWxseSBzdXNwZW5kIGFsbCB0aGUgYWN0aXZlIHVuc3VzcGVuZGVkIHBvcnRzLCBhbmQKKwkgKiB0aGVuIG1hbnVhbGx5IHJlc3VtZSB0aGVtIGluIHRoZSBidXNfcmVzdW1lKCkgcm91dGluZS4KKwkgKi8KKwlveHUtPmJ1c19zdXNwZW5kZWQgPSAwOworCXdoaWxlIChwb3J0LS0pIHsKKwkJdTMyIF9faW9tZW0gKnJlZyA9ICZveHUtPnJlZ3MtPnBvcnRfc3RhdHVzW3BvcnRdOworCQl1MzIgdDEgPSByZWFkbChyZWcpICYgflBPUlRfUldDX0JJVFM7CisJCXUzMiB0MiA9IHQxOworCisJCS8qIGtlZXAgdHJhY2sgb2Ygd2hpY2ggcG9ydHMgd2Ugc3VzcGVuZCAqLworCQlpZiAoKHQxICYgUE9SVF9QRSkgJiYgISh0MSAmIFBPUlRfT1dORVIpICYmCisJCQkJISh0MSAmIFBPUlRfU1VTUEVORCkpIHsKKwkJCXQyIHw9IFBPUlRfU1VTUEVORDsKKwkJCXNldF9iaXQocG9ydCwgJm94dS0+YnVzX3N1c3BlbmRlZCk7CisJCX0KKworCQkvKiBlbmFibGUgcmVtb3RlIHdha2V1cCBvbiBhbGwgcG9ydHMgKi8KKwkJaWYgKGRldmljZV9tYXlfd2FrZXVwKCZoY2QtPnNlbGYucm9vdF9odWItPmRldikpCisJCQl0MiB8PSBQT1JUX1dLT0NfRXxQT1JUX1dLRElTQ19FfFBPUlRfV0tDT05OX0U7CisJCWVsc2UKKwkJCXQyICY9IH4oUE9SVF9XS09DX0V8UE9SVF9XS0RJU0NfRXxQT1JUX1dLQ09OTl9FKTsKKworCQlpZiAodDEgIT0gdDIpIHsKKwkJCW94dV92ZGJnKG94dSwgInBvcnQgJWQsICUwOHggLT4gJTA4eFxuIiwKKwkJCQlwb3J0ICsgMSwgdDEsIHQyKTsKKwkJCXdyaXRlbCh0MiwgcmVnKTsKKwkJfQorCX0KKworCS8qIHR1cm4gb2ZmIG5vdy1pZGxlIEhDICovCisJZGVsX3RpbWVyX3N5bmMoJm94dS0+d2F0Y2hkb2cpOworCWVoY2lfaGFsdChveHUpOworCWhjZC0+c3RhdGUgPSBIQ19TVEFURV9TVVNQRU5ERUQ7CisKKwkvKiBhbGxvdyByZW1vdGUgd2FrZXVwICovCisJbWFzayA9IElOVFJfTUFTSzsKKwlpZiAoIWRldmljZV9tYXlfd2FrZXVwKCZoY2QtPnNlbGYucm9vdF9odWItPmRldikpCisJCW1hc2sgJj0gflNUU19QQ0Q7CisJd3JpdGVsKG1hc2ssICZveHUtPnJlZ3MtPmludHJfZW5hYmxlKTsKKwlyZWFkbCgmb3h1LT5yZWdzLT5pbnRyX2VuYWJsZSk7CisKKwlveHUtPm5leHRfc3RhdGVjaGFuZ2UgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygxMCk7CisJc3Bpbl91bmxvY2tfaXJxKCZveHUtPmxvY2spOworCXJldHVybiAwOworfQorCisvKiBDYWxsZXIgaGFzIGxvY2tlZCB0aGUgcm9vdCBodWIsIGFuZCBzaG91bGQgcmVzZXQvcmVpbml0IG9uIGVycm9yICovCitzdGF0aWMgaW50IG94dV9idXNfcmVzdW1lKHN0cnVjdCB1c2JfaGNkICpoY2QpCit7CisJc3RydWN0IG94dV9oY2QgKm94dSA9IGhjZF90b19veHUoaGNkKTsKKwl1MzIgdGVtcDsKKwlpbnQgaTsKKworCWlmICh0aW1lX2JlZm9yZShqaWZmaWVzLCBveHUtPm5leHRfc3RhdGVjaGFuZ2UpKQorCQltc2xlZXAoNSk7CisJc3Bpbl9sb2NrX2lycSgmb3h1LT5sb2NrKTsKKworCS8qIElkZWFsbHkgYW5kIHdlJ3ZlIGdvdCBhIHJlYWwgcmVzdW1lIGhlcmUsIGFuZCBubyBwb3J0J3MgcG93ZXIKKwkgKiB3YXMgbG9zdC4gIChGb3IgUENJLCB0aGF0IG1lYW5zIFZhdXggd2FzIG1haW50YWluZWQuKSAgQnV0IHdlCisJICogY291bGQgaW5zdGVhZCBiZSByZXN0b3JpbmcgYSBzd3N1c3Agc25hcHNob3QgLS0gc28gdGhhdCBCSU9TIHdhcworCSAqIHRoZSBsYXN0IHVzZXIgb2YgdGhlIGNvbnRyb2xsZXIsIG5vdCByZXNldC9wbSBoYXJkd2FyZSBrZWVwaW5nCisJICogc3RhdGUgd2UgZ2F2ZSB0byBpdC4KKwkgKi8KKwl0ZW1wID0gcmVhZGwoJm94dS0+cmVncy0+aW50cl9lbmFibGUpOworCW94dV9kYmcob3h1LCAicmVzdW1lIHJvb3QgaHViJXNcbiIsIHRlbXAgPyAiIiA6ICIgYWZ0ZXIgcG93ZXIgbG9zcyIpOworCisJLyogYXQgbGVhc3Qgc29tZSBBUE0gaW1wbGVtZW50YXRpb25zIHdpbGwgdHJ5IHRvIGRlbGl2ZXIKKwkgKiBJUlFzIHJpZ2h0IGF3YXksIHNvIGRlbGF5IHRoZW0gdW50aWwgd2UncmUgcmVhZHkuCisJICovCisJd3JpdGVsKDAsICZveHUtPnJlZ3MtPmludHJfZW5hYmxlKTsKKworCS8qIHJlLWluaXQgb3BlcmF0aW9uYWwgcmVnaXN0ZXJzICovCisJd3JpdGVsKDAsICZveHUtPnJlZ3MtPnNlZ21lbnQpOworCXdyaXRlbChveHUtPnBlcmlvZGljX2RtYSwgJm94dS0+cmVncy0+ZnJhbWVfbGlzdCk7CisJd3JpdGVsKCh1MzIpIG94dS0+YXN5bmMtPnFoX2RtYSwgJm94dS0+cmVncy0+YXN5bmNfbmV4dCk7CisKKwkvKiByZXN0b3JlIENNRF9SVU4sIGZyYW1lbGlzdCBzaXplLCBhbmQgaXJxIHRocmVzaG9sZCAqLworCXdyaXRlbChveHUtPmNvbW1hbmQsICZveHUtPnJlZ3MtPmNvbW1hbmQpOworCisJLyogU29tZSBjb250cm9sbGVyL2Zpcm13YXJlIGNvbWJpbmF0aW9ucyBuZWVkIGEgZGVsYXkgZHVyaW5nIHdoaWNoCisJICogdGhleSBzZXQgdXAgdGhlIHBvcnQgc3RhdHVzZXMuICBTZWUgQnVnemlsbGEgIzgxOTAuICovCisJbWRlbGF5KDgpOworCisJLyogbWFudWFsbHkgcmVzdW1lIHRoZSBwb3J0cyB3ZSBzdXNwZW5kZWQgZHVyaW5nIGJ1c19zdXNwZW5kKCkgKi8KKwlpID0gSENTX05fUE9SVFMob3h1LT5oY3NfcGFyYW1zKTsKKwl3aGlsZSAoaS0tKSB7CisJCXRlbXAgPSByZWFkbCgmb3h1LT5yZWdzLT5wb3J0X3N0YXR1c1tpXSk7CisJCXRlbXAgJj0gfihQT1JUX1JXQ19CSVRTCisJCQl8IFBPUlRfV0tPQ19FIHwgUE9SVF9XS0RJU0NfRSB8IFBPUlRfV0tDT05OX0UpOworCQlpZiAodGVzdF9iaXQoaSwgJm94dS0+YnVzX3N1c3BlbmRlZCkgJiYgKHRlbXAgJiBQT1JUX1NVU1BFTkQpKSB7CisJCQlveHUtPnJlc2V0X2RvbmVbaV0gPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygyMCk7CisJCQl0ZW1wIHw9IFBPUlRfUkVTVU1FOworCQl9CisJCXdyaXRlbCh0ZW1wLCAmb3h1LT5yZWdzLT5wb3J0X3N0YXR1c1tpXSk7CisJfQorCWkgPSBIQ1NfTl9QT1JUUyhveHUtPmhjc19wYXJhbXMpOworCW1kZWxheSgyMCk7CisJd2hpbGUgKGktLSkgeworCQl0ZW1wID0gcmVhZGwoJm94dS0+cmVncy0+cG9ydF9zdGF0dXNbaV0pOworCQlpZiAodGVzdF9iaXQoaSwgJm94dS0+YnVzX3N1c3BlbmRlZCkgJiYgKHRlbXAgJiBQT1JUX1NVU1BFTkQpKSB7CisJCQl0ZW1wICY9IH4oUE9SVF9SV0NfQklUUyB8IFBPUlRfUkVTVU1FKTsKKwkJCXdyaXRlbCh0ZW1wLCAmb3h1LT5yZWdzLT5wb3J0X3N0YXR1c1tpXSk7CisJCQlveHVfdmRiZyhveHUsICJyZXN1bWVkIHBvcnQgJWRcbiIsIGkgKyAxKTsKKwkJfQorCX0KKwkodm9pZCkgcmVhZGwoJm94dS0+cmVncy0+Y29tbWFuZCk7CisKKwkvKiBtYXliZSByZS1hY3RpdmF0ZSB0aGUgc2NoZWR1bGUocykgKi8KKwl0ZW1wID0gMDsKKwlpZiAob3h1LT5hc3luYy0+cWhfbmV4dC5xaCkKKwkJdGVtcCB8PSBDTURfQVNFOworCWlmIChveHUtPnBlcmlvZGljX3NjaGVkKQorCQl0ZW1wIHw9IENNRF9QU0U7CisJaWYgKHRlbXApIHsKKwkJb3h1LT5jb21tYW5kIHw9IHRlbXA7CisJCXdyaXRlbChveHUtPmNvbW1hbmQsICZveHUtPnJlZ3MtPmNvbW1hbmQpOworCX0KKworCW94dS0+bmV4dF9zdGF0ZWNoYW5nZSA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDUpOworCWhjZC0+c3RhdGUgPSBIQ19TVEFURV9SVU5OSU5HOworCisJLyogTm93IHdlIGNhbiBzYWZlbHkgcmUtZW5hYmxlIGlycXMgKi8KKwl3cml0ZWwoSU5UUl9NQVNLLCAmb3h1LT5yZWdzLT5pbnRyX2VuYWJsZSk7CisKKwlzcGluX3VubG9ja19pcnEoJm94dS0+bG9jayk7CisJcmV0dXJuIDA7Cit9CisKKyNlbHNlCisKK3N0YXRpYyBpbnQgb3h1X2J1c19zdXNwZW5kKHN0cnVjdCB1c2JfaGNkICpoY2QpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgb3h1X2J1c19yZXN1bWUoc3RydWN0IHVzYl9oY2QgKmhjZCkKK3sKKwlyZXR1cm4gMDsKK30KKworI2VuZGlmCS8qIENPTkZJR19QTSAqLworCitzdGF0aWMgY29uc3Qgc3RydWN0IGhjX2RyaXZlciBveHVfaGNfZHJpdmVyID0geworCS5kZXNjcmlwdGlvbiA9CQkib3h1MjEwaHBfaGNkIiwKKwkucHJvZHVjdF9kZXNjID0JCSJveHUyMTBocCBIQ0QiLAorCS5oY2RfcHJpdl9zaXplID0Jc2l6ZW9mKHN0cnVjdCBveHVfaGNkKSwKKworCS8qCisJICogR2VuZXJpYyBoYXJkd2FyZSBsaW5rYWdlCisJICovCisJLmlycSA9CQkJb3h1X2lycSwKKwkuZmxhZ3MgPQkJSENEX01FTU9SWSB8IEhDRF9VU0IyLAorCisJLyoKKwkgKiBCYXNpYyBsaWZlY3ljbGUgb3BlcmF0aW9ucworCSAqLworCS5yZXNldCA9CQlveHVfcmVzZXQsCisJLnN0YXJ0ID0JCW94dV9ydW4sCisJLnN0b3AgPQkJCW94dV9zdG9wLAorCS5zaHV0ZG93biA9CQlveHVfc2h1dGRvd24sCisKKwkvKgorCSAqIE1hbmFnaW5nIGkvbyByZXF1ZXN0cyBhbmQgYXNzb2NpYXRlZCBkZXZpY2UgcmVzb3VyY2VzCisJICovCisJLnVyYl9lbnF1ZXVlID0JCW94dV91cmJfZW5xdWV1ZSwKKwkudXJiX2RlcXVldWUgPQkJb3h1X3VyYl9kZXF1ZXVlLAorCS5lbmRwb2ludF9kaXNhYmxlID0Jb3h1X2VuZHBvaW50X2Rpc2FibGUsCisKKwkvKgorCSAqIFNjaGVkdWxpbmcgc3VwcG9ydAorCSAqLworCS5nZXRfZnJhbWVfbnVtYmVyID0Jb3h1X2dldF9mcmFtZSwKKworCS8qCisJICogUm9vdCBodWIgc3VwcG9ydAorCSAqLworCS5odWJfc3RhdHVzX2RhdGEgPQlveHVfaHViX3N0YXR1c19kYXRhLAorCS5odWJfY29udHJvbCA9CQlveHVfaHViX2NvbnRyb2wsCisJLmJ1c19zdXNwZW5kID0JCW94dV9idXNfc3VzcGVuZCwKKwkuYnVzX3Jlc3VtZSA9CQlveHVfYnVzX3Jlc3VtZSwKK307CisKKy8qCisgKiBNb2R1bGUgc3R1ZmYKKyAqLworCitzdGF0aWMgdm9pZCBveHVfY29uZmlndXJhdGlvbihzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LCB2b2lkICpiYXNlKQoreworCXUzMiB0bXA7CisKKwkvKiBJbml0aWFsaXplIHRvcCBsZXZlbCByZWdpc3RlcnMuCisJICogRmlyc3Qgd3JpdGUgZXZlcgorCSAqLworCW94dV93cml0ZWwoYmFzZSwgT1hVX0hPU1RJRkNPTkZJRywgMHgwMDAwMDM3RCk7CisJb3h1X3dyaXRlbChiYXNlLCBPWFVfU09GVFJFU0VULCBPWFVfU1JFU0VUKTsKKwlveHVfd3JpdGVsKGJhc2UsIE9YVV9IT1NUSUZDT05GSUcsIDB4MDAwMDAzN0QpOworCisJdG1wID0gb3h1X3JlYWRsKGJhc2UsIE9YVV9QSU9CVVJTVFJFQURDVFJMKTsKKwlveHVfd3JpdGVsKGJhc2UsIE9YVV9QSU9CVVJTVFJFQURDVFJMLCB0bXAgfCAweDAwNDApOworCisJb3h1X3dyaXRlbChiYXNlLCBPWFVfQVNPLCBPWFVfU1BIUE9FTiB8IE9YVV9PVlJDQ1VSUFVQREVOIHwKKwkJCQkJT1hVX0NPTVBBUkFUT1IgfCBPWFVfQVNPX09QKTsKKworCXRtcCA9IG94dV9yZWFkbChiYXNlLCBPWFVfQ0xLQ1RSTF9TRVQpOworCW94dV93cml0ZWwoYmFzZSwgT1hVX0NMS0NUUkxfU0VULCB0bXAgfCBPWFVfU1lTQ0xLRU4gfCBPWFVfVVNCT1RHQ0xLRU4pOworCisJLyogQ2xlYXIgYWxsIHRvcCBpbnRlcnJ1cHQgZW5hYmxlICovCisJb3h1X3dyaXRlbChiYXNlLCBPWFVfQ0hJUElSUUVOX0NMUiwgMHhmZik7CisKKwkvKiBDbGVhciBhbGwgdG9wIGludGVycnVwdCBzdGF0dXMgKi8KKwlveHVfd3JpdGVsKGJhc2UsIE9YVV9DSElQSVJRU1RBVFVTLCAweGZmKTsKKworCS8qIEVuYWJsZSBhbGwgbmVlZGVkIHRvcCBpbnRlcnJ1cHQgZXhjZXB0IE9URyBTUEggY29yZSAqLworCW94dV93cml0ZWwoYmFzZSwgT1hVX0NISVBJUlFFTl9TRVQsIE9YVV9VU0JTUEhMUFdVSSB8IE9YVV9VU0JPVEdMUFdVSSk7Cit9CisKK3N0YXRpYyBpbnQgb3h1X3ZlcmlmeV9pZChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LCB2b2lkICpiYXNlKQoreworCXUzMiBpZDsKKwljaGFyICpib1tdID0geworCQkicmVzZXJ2ZWQiLAorCQkiMTI4LXBpbiBMUUZQIiwKKwkJIjg0LXBpbiBURkJHQSIsCisJCSJyZXNlcnZlZCIsCisJfTsKKworCS8qIFJlYWQgY29udHJvbGxlciBzaWduYXR1cmUgcmVnaXN0ZXIgdG8gZmluZCBhIG1hdGNoICovCisJaWQgPSBveHVfcmVhZGwoYmFzZSwgT1hVX0RFVklDRUlEKTsKKwlkZXZfaW5mbygmcGRldi0+ZGV2LCAiZGV2aWNlIElEICV4XG4iLCBpZCk7CisJaWYgKChpZCAmIE9YVV9SRVZfTUFTSykgIT0gKE9YVV9SRVZfMjEwMCA8PCBPWFVfUkVWX1NISUZUKSkKKwkJcmV0dXJuIC0xOworCisJZGV2X2luZm8oJnBkZXYtPmRldiwgImZvdW5kIGRldmljZSAleCAlcyAoJTA0eDolMDR4KVxuIiwKKwkJaWQgPj4gT1hVX1JFVl9TSElGVCwKKwkJYm9bKGlkICYgT1hVX0JPX01BU0spID4+IE9YVV9CT19TSElGVF0sCisJCShpZCAmIE9YVV9NQUpfUkVWX01BU0spID4+IE9YVV9NQUpfUkVWX1NISUZULAorCQkoaWQgJiBPWFVfTUlOX1JFVl9NQVNLKSA+PiBPWFVfTUlOX1JFVl9TSElGVCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBoY19kcml2ZXIgb3h1X2hjX2RyaXZlcjsKK3N0YXRpYyBzdHJ1Y3QgdXNiX2hjZCAqb3h1X2NyZWF0ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LAorCQkJCXVuc2lnbmVkIGxvbmcgbWVtc3RhcnQsIHVuc2lnbmVkIGxvbmcgbWVtbGVuLAorCQkJCXZvaWQgKmJhc2UsIGludCBpcnEsIGludCBvdGcpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJnBkZXYtPmRldjsKKworCXN0cnVjdCB1c2JfaGNkICpoY2Q7CisJc3RydWN0IG94dV9oY2QgKm94dTsKKwlpbnQgcmV0OworCisJLyogU2V0IGVuZGlhbiBtb2RlIGFuZCBob3N0IG1vZGUgKi8KKwlveHVfd3JpdGVsKGJhc2UgKyAob3RnID8gT1hVX09UR19DT1JFX09GRlNFVCA6IE9YVV9TUEhfQ09SRV9PRkZTRVQpLAorCQkJCU9YVV9VU0JNT0RFLAorCQkJCU9YVV9DTV9IT1NUX09OTFkgfCBPWFVfRVNfTElUVExFIHwgT1hVX1ZCUFMpOworCisJaGNkID0gdXNiX2NyZWF0ZV9oY2QoJm94dV9oY19kcml2ZXIsIGRldiwKKwkJCQlvdGcgPyAib3h1MjEwaHBfb3RnIiA6ICJveHUyMTBocF9zcGgiKTsKKwlpZiAoIWhjZCkKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwloY2QtPnJzcmNfc3RhcnQgPSBtZW1zdGFydDsKKwloY2QtPnJzcmNfbGVuID0gbWVtbGVuOworCWhjZC0+cmVncyA9IGJhc2U7CisJaGNkLT5pcnEgPSBpcnE7CisJaGNkLT5zdGF0ZSA9IEhDX1NUQVRFX0hBTFQ7CisKKwlveHUgPSBoY2RfdG9fb3h1KGhjZCk7CisJb3h1LT5pc19vdGcgPSBvdGc7CisKKwlyZXQgPSB1c2JfYWRkX2hjZChoY2QsIGlycSwgSVJRRl9TSEFSRUQpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gRVJSX1BUUihyZXQpOworCisJcmV0dXJuIGhjZDsKK30KKworc3RhdGljIGludCBveHVfaW5pdChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LAorCQkJCXVuc2lnbmVkIGxvbmcgbWVtc3RhcnQsIHVuc2lnbmVkIGxvbmcgbWVtbGVuLAorCQkJCXZvaWQgKmJhc2UsIGludCBpcnEpCit7CisJc3RydWN0IG94dV9pbmZvICppbmZvID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IHVzYl9oY2QgKmhjZDsKKwlpbnQgcmV0OworCisJLyogRmlyc3QgdGltZSBjb25maWd1cmF0aW9uIGF0IHN0YXJ0IHVwICovCisJb3h1X2NvbmZpZ3VyYXRpb24ocGRldiwgYmFzZSk7CisKKwlyZXQgPSBveHVfdmVyaWZ5X2lkKHBkZXYsIGJhc2UpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAibm8gZGV2aWNlcyBmb3VuZCFcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwkvKiBDcmVhdGUgdGhlIE9URyBjb250cm9sbGVyICovCisJaGNkID0gb3h1X2NyZWF0ZShwZGV2LCBtZW1zdGFydCwgbWVtbGVuLCBiYXNlLCBpcnEsIDEpOworCWlmIChJU19FUlIoaGNkKSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjYW5ub3QgY3JlYXRlIE9URyBjb250cm9sbGVyIVxuIik7CisJCXJldCA9IFBUUl9FUlIoaGNkKTsKKwkJZ290byBlcnJvcl9jcmVhdGVfb3RnOworCX0KKwlpbmZvLT5oY2RbMF0gPSBoY2Q7CisKKwkvKiBDcmVhdGUgdGhlIFNQSCBob3N0IGNvbnRyb2xsZXIgKi8KKwloY2QgPSBveHVfY3JlYXRlKHBkZXYsIG1lbXN0YXJ0LCBtZW1sZW4sIGJhc2UsIGlycSwgMCk7CisJaWYgKElTX0VSUihoY2QpKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImNhbm5vdCBjcmVhdGUgU1BIIGNvbnRyb2xsZXIhXG4iKTsKKwkJcmV0ID0gUFRSX0VSUihoY2QpOworCQlnb3RvIGVycm9yX2NyZWF0ZV9zcGg7CisJfQorCWluZm8tPmhjZFsxXSA9IGhjZDsKKworCW94dV93cml0ZWwoYmFzZSwgT1hVX0NISVBJUlFFTl9TRVQsCisJCW94dV9yZWFkbChiYXNlLCBPWFVfQ0hJUElSUUVOX1NFVCkgfCAzKTsKKworCXJldHVybiAwOworCitlcnJvcl9jcmVhdGVfc3BoOgorCXVzYl9yZW1vdmVfaGNkKGluZm8tPmhjZFswXSk7CisJdXNiX3B1dF9oY2QoaW5mby0+aGNkWzBdKTsKKworZXJyb3JfY3JlYXRlX290ZzoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG94dV9kcnZfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKwl2b2lkICpiYXNlOworCXVuc2lnbmVkIGxvbmcgbWVtc3RhcnQsIG1lbWxlbjsKKwlpbnQgaXJxLCByZXQ7CisJc3RydWN0IG94dV9pbmZvICppbmZvOworCisJaWYgKHVzYl9kaXNhYmxlZCgpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCS8qCisJICogR2V0IHRoZSBwbGF0Zm9ybSByZXNvdXJjZXMKKwkgKi8KKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9JUlEsIDApOworCWlmICghcmVzKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwKKwkJCSJubyBJUlEhIENoZWNrICVzIHNldHVwIVxuIiwgZGV2X25hbWUoJnBkZXYtPmRldikpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJaXJxID0gcmVzLT5zdGFydDsKKwlkZXZfZGJnKCZwZGV2LT5kZXYsICJJUlEgcmVzb3VyY2UgJWRcbiIsIGlycSk7CisKKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCWlmICghcmVzKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIm5vIHJlZ2lzdGVycyBhZGRyZXNzISBDaGVjayAlcyBzZXR1cCFcbiIsCisJCQlkZXZfbmFtZSgmcGRldi0+ZGV2KSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKwltZW1zdGFydCA9IHJlcy0+c3RhcnQ7CisJbWVtbGVuID0gcmVzLT5lbmQgLSByZXMtPnN0YXJ0ICsgMTsKKwlkZXZfZGJnKCZwZGV2LT5kZXYsICJNRU0gcmVzb3VyY2UgJWx4LSVseFxuIiwgbWVtc3RhcnQsIG1lbWxlbik7CisJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24obWVtc3RhcnQsIG1lbWxlbiwKKwkJCQlveHVfaGNfZHJpdmVyLmRlc2NyaXB0aW9uKSkgeworCQlkZXZfZGJnKCZwZGV2LT5kZXYsICJtZW1vcnkgYXJlYSBhbHJlYWR5IGluIHVzZVxuIik7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJcmV0ID0gc2V0X2lycV90eXBlKGlycSwgSVJRRl9UUklHR0VSX0ZBTExJTkcpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiZXJyb3Igc2V0dGluZyBpcnEgdHlwZVxuIik7CisJCXJldCA9IC1FRkFVTFQ7CisJCWdvdG8gZXJyb3Jfc2V0X2lycV90eXBlOworCX0KKworCWJhc2UgPSBpb3JlbWFwKG1lbXN0YXJ0LCBtZW1sZW4pOworCWlmICghYmFzZSkgeworCQlkZXZfZGJnKCZwZGV2LT5kZXYsICJlcnJvciBtYXBwaW5nIG1lbW9yeVxuIik7CisJCXJldCA9IC1FRkFVTFQ7CisJCWdvdG8gZXJyb3JfaW9yZW1hcDsKKwl9CisKKwkvKiBBbGxvY2F0ZSBhIGRyaXZlciBkYXRhIHN0cnVjdCB0byBob2xkIHVzZWZ1bCBpbmZvIGZvciBib3RoCisJICogU1BIICYgT1RHIGRldmljZXMKKwkgKi8KKwlpbmZvID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG94dV9pbmZvKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFpbmZvKSB7CisJCWRldl9kYmcoJnBkZXYtPmRldiwgImVycm9yIGFsbG9jYXRpbmcgbWVtb3J5XG4iKTsKKwkJcmV0ID0gLUVGQVVMVDsKKwkJZ290byBlcnJvcl9hbGxvYzsKKwl9CisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgaW5mbyk7CisKKwlyZXQgPSBveHVfaW5pdChwZGV2LCBtZW1zdGFydCwgbWVtbGVuLCBiYXNlLCBpcnEpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9kYmcoJnBkZXYtPmRldiwgImNhbm5vdCBpbml0IFVTQiBkZXZpY2VzXG4iKTsKKwkJZ290byBlcnJvcl9pbml0OworCX0KKworCWRldl9pbmZvKCZwZGV2LT5kZXYsICJkZXZpY2VzIGVuYWJsZWQgYW5kIHJ1bm5pbmdcbiIpOworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGluZm8pOworCisJcmV0dXJuIDA7CisKK2Vycm9yX2luaXQ6CisJa2ZyZWUoaW5mbyk7CisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisKK2Vycm9yX2FsbG9jOgorCWlvdW5tYXAoYmFzZSk7CisKK2Vycm9yX3NldF9pcnFfdHlwZToKK2Vycm9yX2lvcmVtYXA6CisJcmVsZWFzZV9tZW1fcmVnaW9uKG1lbXN0YXJ0LCBtZW1sZW4pOworCisJZGV2X2VycigmcGRldi0+ZGV2LCAiaW5pdCAlcyBmYWlsLCAlZFxuIiwgZGV2X25hbWUoJnBkZXYtPmRldiksIHJldCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgb3h1X3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LCBzdHJ1Y3QgdXNiX2hjZCAqaGNkKQoreworCXVzYl9yZW1vdmVfaGNkKGhjZCk7CisJdXNiX3B1dF9oY2QoaGNkKTsKK30KKworc3RhdGljIGludCBveHVfZHJ2X3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBveHVfaW5mbyAqaW5mbyA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXVuc2lnbmVkIGxvbmcgbWVtc3RhcnQgPSBpbmZvLT5oY2RbMF0tPnJzcmNfc3RhcnQsCisJCQltZW1sZW4gPSBpbmZvLT5oY2RbMF0tPnJzcmNfbGVuOworCXZvaWQgKmJhc2UgPSBpbmZvLT5oY2RbMF0tPnJlZ3M7CisKKwlveHVfcmVtb3ZlKHBkZXYsIGluZm8tPmhjZFswXSk7CisJb3h1X3JlbW92ZShwZGV2LCBpbmZvLT5oY2RbMV0pOworCisJaW91bm1hcChiYXNlKTsKKwlyZWxlYXNlX21lbV9yZWdpb24obWVtc3RhcnQsIG1lbWxlbik7CisKKwlrZnJlZShpbmZvKTsKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBveHVfZHJ2X3NodXRkb3duKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJb3h1X2Rydl9yZW1vdmUocGRldik7Cit9CisKKyNpZiAwCisvKiBGSVhNRTogVE9ETyAqLworc3RhdGljIGludCBveHVfZHJ2X3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKKwlzdHJ1Y3QgdXNiX2hjZCAqaGNkID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBveHVfZHJ2X3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOworCXN0cnVjdCB1c2JfaGNkICpoY2QgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKworCXJldHVybiAwOworfQorI2Vsc2UKKyNkZWZpbmUgb3h1X2Rydl9zdXNwZW5kCU5VTEwKKyNkZWZpbmUgb3h1X2Rydl9yZXN1bWUJTlVMTAorI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIG94dV9kcml2ZXIgPSB7CisJLnByb2JlCQk9IG94dV9kcnZfcHJvYmUsCisJLnJlbW92ZQkJPSBveHVfZHJ2X3JlbW92ZSwKKwkuc2h1dGRvd24JPSBveHVfZHJ2X3NodXRkb3duLAorCS5zdXNwZW5kCT0gb3h1X2Rydl9zdXNwZW5kLAorCS5yZXN1bWUJCT0gb3h1X2Rydl9yZXN1bWUsCisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAib3h1MjEwaHAtaGNkIiwKKwkJLmJ1cyA9ICZwbGF0Zm9ybV9idXNfdHlwZQorCX0KK307CisKK3N0YXRpYyBpbnQgX19pbml0IG94dV9tb2R1bGVfaW5pdCh2b2lkKQoreworCWludCByZXR2YWwgPSAwOworCisJcmV0dmFsID0gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZveHVfZHJpdmVyKTsKKwlpZiAocmV0dmFsIDwgMCkKKwkJcmV0dXJuIHJldHZhbDsKKworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBveHVfbW9kdWxlX2NsZWFudXAodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3Rlcigmb3h1X2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KG94dV9tb2R1bGVfaW5pdCk7Cittb2R1bGVfZXhpdChveHVfbW9kdWxlX2NsZWFudXApOworCitNT0RVTEVfREVTQ1JJUFRJT04oIk94Zm9yZCBPWFUyMTBIUCBIQ0QgZHJpdmVyIC0gdmVyLiAiIERSSVZFUl9WRVJTSU9OKTsKK01PRFVMRV9BVVRIT1IoIlJvZG9sZm8gR2lvbWV0dGkgPGdpb21ldHRpQGxpbnV4Lml0PiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9veHUyMTBocC5oIGIvZHJpdmVycy91c2IvaG9zdC9veHUyMTBocC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5MTBlMjcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3VzYi9ob3N0L294dTIxMGhwLmgKQEAgLTAsMCArMSw0NDcgQEAKKy8qCisgKiBIb3N0IGludGVyZmFjZSByZWdpc3RlcnMKKyAqLworCisjZGVmaW5lIE9YVV9ERVZJQ0VJRAkJCTB4MDAKKwkjZGVmaW5lIE9YVV9SRVZfTUFTSwkJMHhmZmZmMDAwMAorCSNkZWZpbmUgT1hVX1JFVl9TSElGVAkJMTYKKwkjZGVmaW5lIE9YVV9SRVZfMjEwMAkJMHgyMTAwCisJI2RlZmluZSBPWFVfQk9fU0hJRlQJCTgKKwkjZGVmaW5lIE9YVV9CT19NQVNLCQkoMHgzIDw8IE9YVV9CT19TSElGVCkKKwkjZGVmaW5lIE9YVV9NQUpfUkVWX1NISUZUCTQKKwkjZGVmaW5lIE9YVV9NQUpfUkVWX01BU0sJKDB4ZiA8PCBPWFVfTUFKX1JFVl9TSElGVCkKKwkjZGVmaW5lIE9YVV9NSU5fUkVWX1NISUZUCTAKKwkjZGVmaW5lIE9YVV9NSU5fUkVWX01BU0sJKDB4ZiA8PCBPWFVfTUlOX1JFVl9TSElGVCkKKyNkZWZpbmUgT1hVX0hPU1RJRkNPTkZJRwkJMHgwNAorI2RlZmluZSBPWFVfU09GVFJFU0VUCQkJMHgwOAorCSNkZWZpbmUgT1hVX1NSRVNFVAkJKDEgPDwgMCkKKworI2RlZmluZSBPWFVfUElPQlVSU1RSRUFEQ1RSTAkJMHgwQworCisjZGVmaW5lIE9YVV9DSElQSVJRU1RBVFVTCQkweDEwCisjZGVmaW5lIE9YVV9DSElQSVJRRU5fU0VUCQkweDE0CisjZGVmaW5lIE9YVV9DSElQSVJRRU5fQ0xSCQkweDE4CisJI2RlZmluZSBPWFVfVVNCU1BITFBXVUkJCTB4MDAwMDAwODAKKwkjZGVmaW5lIE9YVV9VU0JPVEdMUFdVSQkJMHgwMDAwMDA0MAorCSNkZWZpbmUgT1hVX1VTQlNQSEkJCTB4MDAwMDAwMDIKKwkjZGVmaW5lIE9YVV9VU0JPVEdJCQkweDAwMDAwMDAxCisKKyNkZWZpbmUgT1hVX0NMS0NUUkxfU0VUCQkJMHgxQworCSNkZWZpbmUgT1hVX1NZU0NMS0VOCQkweDAwMDAwMDA4CisJI2RlZmluZSBPWFVfVVNCU1BIQ0xLRU4JCTB4MDAwMDAwMDIKKwkjZGVmaW5lIE9YVV9VU0JPVEdDTEtFTgkJMHgwMDAwMDAwMQorCisjZGVmaW5lIE9YVV9BU08JCQkJMHg2OAorCSNkZWZpbmUgT1hVX1NQSFBPRU4JCTB4MDAwMDAxMDAKKwkjZGVmaW5lIE9YVV9PVlJDQ1VSUFVQREVOCTB4MDAwMDA4MDAKKwkjZGVmaW5lIE9YVV9BU09fT1AJCSgxIDw8IDEwKQorCSNkZWZpbmUgT1hVX0NPTVBBUkFUT1IJCTB4MDAwMDA0MDAwCisKKyNkZWZpbmUgT1hVX1VTQk1PREUJCQkweDFBOAorCSNkZWZpbmUgT1hVX1ZCUFMJCTB4MDAwMDAwMjAKKwkjZGVmaW5lIE9YVV9FU19MSVRUTEUJCTB4MDAwMDAwMDAKKwkjZGVmaW5lIE9YVV9DTV9IT1NUX09OTFkJMHgwMDAwMDAwMworCisvKgorICogUHJvcGVyIEVIQ0kgc3RydWN0cyAmIGRlZmluZXMKKyAqLworCisvKiBNYWdpYyBudW1iZXJzIHRoYXQgY2FuIGFmZmVjdCBzeXN0ZW0gcGVyZm9ybWFuY2UgKi8KKyNkZWZpbmUgRUhDSV9UVU5FX0NFUlIJCTMJLyogMC0zIHF0ZCByZXRyaWVzOyAwID09IGRvbid0IHN0b3AgKi8KKyNkZWZpbmUgRUhDSV9UVU5FX1JMX0hTCQk0CS8qIG5hayB0aHJvdHRsZTsgc2VlIDQuOSAqLworI2RlZmluZSBFSENJX1RVTkVfUkxfVFQJCTAKKyNkZWZpbmUgRUhDSV9UVU5FX01VTFRfSFMJMQkvKiAxLTMgdHJhbnNhY3Rpb25zL3VmcmFtZTsgNC4xMC4zICovCisjZGVmaW5lIEVIQ0lfVFVORV9NVUxUX1RUCTEKKyNkZWZpbmUgRUhDSV9UVU5FX0ZMUwkJMgkvKiAoc21hbGwpIDI1NiBmcmFtZSBzY2hlZHVsZSAqLworCitzdHJ1Y3Qgb3h1X2hjZDsKKworLyogRUhDSSByZWdpc3RlciBpbnRlcmZhY2UsIGNvcnJlc3BvbmRzIHRvIEVIQ0kgUmV2aXNpb24gMC45NSBzcGVjaWZpY2F0aW9uICovCisKKy8qIFNlY3Rpb24gMi4yIEhvc3QgQ29udHJvbGxlciBDYXBhYmlsaXR5IFJlZ2lzdGVycyAqLworc3RydWN0IGVoY2lfY2FwcyB7CisJLyogdGhlc2UgZmllbGRzIGFyZSBzcGVjaWZpZWQgYXMgOCBhbmQgMTYgYml0IHJlZ2lzdGVycywKKwkgKiBidXQgc29tZSBob3N0cyBjYW4ndCBwZXJmb3JtIDggb3IgMTYgYml0IFBDSSBhY2Nlc3Nlcy4KKwkgKi8KKwl1MzIJCWhjX2NhcGJhc2U7CisjZGVmaW5lIEhDX0xFTkdUSChwKQkJKCgocCk+PjAwKSYweDAwZmYpCS8qIGJpdHMgNzowICovCisjZGVmaW5lIEhDX1ZFUlNJT04ocCkJCSgoKHApPj4xNikmMHhmZmZmKQkvKiBiaXRzIDMxOjE2ICovCisJdTMyCQloY3NfcGFyYW1zOyAgICAgLyogSENTUEFSQU1TIC0gb2Zmc2V0IDB4NCAqLworI2RlZmluZSBIQ1NfREVCVUdfUE9SVChwKQkoKChwKT4+MjApJjB4ZikJLyogYml0cyAyMzoyMCwgZGVidWcgcG9ydD8gKi8KKyNkZWZpbmUgSENTX0lORElDQVRPUihwKQkoKHApJigxIDw8IDE2KSkJLyogdHJ1ZTogaGFzIHBvcnQgaW5kaWNhdG9ycyAqLworI2RlZmluZSBIQ1NfTl9DQyhwKQkJKCgocCk+PjEyKSYweGYpCS8qIGJpdHMgMTU6MTIsICNjb21wYW5pb24gSENzICovCisjZGVmaW5lIEhDU19OX1BDQyhwKQkJKCgocCk+PjgpJjB4ZikJLyogYml0cyAxMTo4LCBwb3J0cyBwZXIgQ0MgKi8KKyNkZWZpbmUgSENTX1BPUlRST1VURUQocCkJKChwKSYoMSA8PCA3KSkJLyogdHJ1ZTogcG9ydCByb3V0aW5nICovCisjZGVmaW5lIEhDU19QUEMocCkJCSgocCkmKDEgPDwgNCkpCS8qIHRydWU6IHBvcnQgcG93ZXIgY29udHJvbCAqLworI2RlZmluZSBIQ1NfTl9QT1JUUyhwKQkJKCgocCk+PjApJjB4ZikJLyogYml0cyAzOjAsIHBvcnRzIG9uIEhDICovCisKKwl1MzIJCWhjY19wYXJhbXM7ICAgICAgLyogSENDUEFSQU1TIC0gb2Zmc2V0IDB4OCAqLworI2RlZmluZSBIQ0NfRVhUX0NBUFMocCkJCSgoKHApPj44KSYweGZmKQkvKiBmb3IgcGNpIGV4dGVuZGVkIGNhcHMgKi8KKyNkZWZpbmUgSENDX0lTT0NfQ0FDSEUocCkgICAgICAgKChwKSYoMSA8PCA3KSkgIC8qIHRydWU6IGNhbiBjYWNoZSBpc29jIGZyYW1lICovCisjZGVmaW5lIEhDQ19JU09DX1RIUkVTKHApICAgICAgICgoKHApPj40KSYweDcpICAvKiBiaXRzIDY6NCwgdWZyYW1lcyBjYWNoZWQgKi8KKyNkZWZpbmUgSENDX0NBTlBBUksocCkJCSgocCkmKDEgPDwgMikpICAvKiB0cnVlOiBjYW4gcGFyayBvbiBhc3luYyBxaCAqLworI2RlZmluZSBIQ0NfUEdNX0ZSQU1FTElTVExFTihwKSAoKHApJigxIDw8IDEpKSAgLyogdHJ1ZTogcGVyaW9kaWNfc2l6ZSBjaGFuZ2VzKi8KKyNkZWZpbmUgSENDXzY0QklUX0FERFIocCkgICAgICAgKChwKSYoMSkpICAgICAgIC8qIHRydWU6IGNhbiB1c2UgNjQtYml0IGFkZHIgKi8KKwl1OAkJcG9ydHJvdXRlWzhdOwkgLyogbmliYmxlcyBmb3Igcm91dGluZyAtIG9mZnNldCAweEMgKi8KK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisKKy8qIFNlY3Rpb24gMi4zIEhvc3QgQ29udHJvbGxlciBPcGVyYXRpb25hbCBSZWdpc3RlcnMgKi8KK3N0cnVjdCBlaGNpX3JlZ3MgeworCS8qIFVTQkNNRDogb2Zmc2V0IDB4MDAgKi8KKwl1MzIJCWNvbW1hbmQ7CisvKiAyMzoxNiBpcyByL3cgaW50ciByYXRlLCBpbiBtaWNyb2ZyYW1lczsgZGVmYXVsdCAiOCIgPT0gMS9tc2VjICovCisjZGVmaW5lIENNRF9QQVJLCSgxPDwxMSkJCS8qIGVuYWJsZSAicGFyayIgb24gYXN5bmMgcWggKi8KKyNkZWZpbmUgQ01EX1BBUktfQ05UKGMpCSgoKGMpPj44KSYzKQkvKiBob3cgbWFueSB0cmFuc2ZlcnMgdG8gcGFyayBmb3IgKi8KKyNkZWZpbmUgQ01EX0xSRVNFVAkoMTw8NykJCS8qIHBhcnRpYWwgcmVzZXQgKG5vIHBvcnRzLCBldGMpICovCisjZGVmaW5lIENNRF9JQUFECSgxPDw2KQkJLyogImRvb3JiZWxsIiBpbnRlcnJ1cHQgYXN5bmMgYWR2YW5jZSAqLworI2RlZmluZSBDTURfQVNFCQkoMTw8NSkJCS8qIGFzeW5jIHNjaGVkdWxlIGVuYWJsZSAqLworI2RlZmluZSBDTURfUFNFCQkoMTw8NCkJCS8qIHBlcmlvZGljIHNjaGVkdWxlIGVuYWJsZSAqLworLyogMzoyIGlzIHBlcmlvZGljIGZyYW1lIGxpc3Qgc2l6ZSAqLworI2RlZmluZSBDTURfUkVTRVQJKDE8PDEpCQkvKiByZXNldCBIQyBub3QgYnVzICovCisjZGVmaW5lIENNRF9SVU4JCSgxPDwwKQkJLyogc3RhcnQvc3RvcCBIQyAqLworCisJLyogVVNCU1RTOiBvZmZzZXQgMHgwNCAqLworCXUzMgkJc3RhdHVzOworI2RlZmluZSBTVFNfQVNTCQkoMTw8MTUpCQkvKiBBc3luYyBTY2hlZHVsZSBTdGF0dXMgKi8KKyNkZWZpbmUgU1RTX1BTUwkJKDE8PDE0KQkJLyogUGVyaW9kaWMgU2NoZWR1bGUgU3RhdHVzICovCisjZGVmaW5lIFNUU19SRUNMCSgxPDwxMykJCS8qIFJlY2xhbWF0aW9uICovCisjZGVmaW5lIFNUU19IQUxUCSgxPDwxMikJCS8qIE5vdCBydW5uaW5nIChhbnkgcmVhc29uKSAqLworLyogc29tZSBiaXRzIHJlc2VydmVkICovCisJLyogdGhlc2UgU1RTXyogZmxhZ3MgYXJlIGFsc28gaW50cl9lbmFibGUgYml0cyAoVVNCSU5UUikgKi8KKyNkZWZpbmUgU1RTX0lBQQkJKDE8PDUpCQkvKiBJbnRlcnJ1cHRlZCBvbiBhc3luYyBhZHZhbmNlICovCisjZGVmaW5lIFNUU19GQVRBTAkoMTw8NCkJCS8qIHN1Y2ggYXMgc29tZSBQQ0kgYWNjZXNzIGVycm9ycyAqLworI2RlZmluZSBTVFNfRkxSCQkoMTw8MykJCS8qIGZyYW1lIGxpc3Qgcm9sbGVkIG92ZXIgKi8KKyNkZWZpbmUgU1RTX1BDRAkJKDE8PDIpCQkvKiBwb3J0IGNoYW5nZSBkZXRlY3QgKi8KKyNkZWZpbmUgU1RTX0VSUgkJKDE8PDEpCQkvKiAiZXJyb3IiIGNvbXBsZXRpb24gKG92ZXJmbG93LCAuLi4pICovCisjZGVmaW5lIFNUU19JTlQJCSgxPDwwKQkJLyogIm5vcm1hbCIgY29tcGxldGlvbiAoc2hvcnQsIC4uLikgKi8KKworI2RlZmluZSBJTlRSX01BU0sgKFNUU19JQUEgfCBTVFNfRkFUQUwgfCBTVFNfUENEIHwgU1RTX0VSUiB8IFNUU19JTlQpCisKKwkvKiBVU0JJTlRSOiBvZmZzZXQgMHgwOCAqLworCXUzMgkJaW50cl9lbmFibGU7CisKKwkvKiBGUklOREVYOiBvZmZzZXQgMHgwQyAqLworCXUzMgkJZnJhbWVfaW5kZXg7CS8qIGN1cnJlbnQgbWljcm9mcmFtZSBudW1iZXIgKi8KKwkvKiBDVFJMRFNTRUdNRU5UOiBvZmZzZXQgMHgxMCAqLworCXUzMgkJc2VnbWVudDsJLyogYWRkcmVzcyBiaXRzIDYzOjMyIGlmIG5lZWRlZCAqLworCS8qIFBFUklPRElDTElTVEJBU0U6IG9mZnNldCAweDE0ICovCisJdTMyCQlmcmFtZV9saXN0OwkvKiBwb2ludHMgdG8gcGVyaW9kaWMgbGlzdCAqLworCS8qIEFTWU5DTElTVEFERFI6IG9mZnNldCAweDE4ICovCisJdTMyCQlhc3luY19uZXh0OwkvKiBhZGRyZXNzIG9mIG5leHQgYXN5bmMgcXVldWUgaGVhZCAqLworCisJdTMyCQlyZXNlcnZlZFs5XTsKKworCS8qIENPTkZJR0ZMQUc6IG9mZnNldCAweDQwICovCisJdTMyCQljb25maWd1cmVkX2ZsYWc7CisjZGVmaW5lIEZMQUdfQ0YJCSgxPDwwKQkJLyogdHJ1ZTogd2UnbGwgc3VwcG9ydCAiaGlnaCBzcGVlZCIgKi8KKworCS8qIFBPUlRTQzogb2Zmc2V0IDB4NDQgKi8KKwl1MzIJCXBvcnRfc3RhdHVzWzBdOwkvKiB1cCB0byBOX1BPUlRTICovCisvKiAzMToyMyByZXNlcnZlZCAqLworI2RlZmluZSBQT1JUX1dLT0NfRQkoMTw8MjIpCQkvKiB3YWtlIG9uIG92ZXJjdXJyZW50IChlbmFibGUpICovCisjZGVmaW5lIFBPUlRfV0tESVNDX0UJKDE8PDIxKQkJLyogd2FrZSBvbiBkaXNjb25uZWN0IChlbmFibGUpICovCisjZGVmaW5lIFBPUlRfV0tDT05OX0UJKDE8PDIwKQkJLyogd2FrZSBvbiBjb25uZWN0IChlbmFibGUpICovCisvKiAxOToxNiBmb3IgcG9ydCB0ZXN0aW5nICovCisjZGVmaW5lIFBPUlRfTEVEX09GRgkoMDw8MTQpCisjZGVmaW5lIFBPUlRfTEVEX0FNQkVSCSgxPDwxNCkKKyNkZWZpbmUgUE9SVF9MRURfR1JFRU4JKDI8PDE0KQorI2RlZmluZSBQT1JUX0xFRF9NQVNLCSgzPDwxNCkKKyNkZWZpbmUgUE9SVF9PV05FUgkoMTw8MTMpCQkvKiB0cnVlOiBjb21wYW5pb24gaGMgb3ducyB0aGlzIHBvcnQgKi8KKyNkZWZpbmUgUE9SVF9QT1dFUgkoMTw8MTIpCQkvKiB0cnVlOiBoYXMgcG93ZXIgKHNlZSBQUEMpICovCisjZGVmaW5lIFBPUlRfVVNCMTEoeCkgKCgoeCkmKDM8PDEwKSkgPT0gKDE8PDEwKSkJLyogVVNCIDEuMSBkZXZpY2UgKi8KKy8qIDExOjEwIGZvciBkZXRlY3RpbmcgbG93c3BlZWQgZGV2aWNlcyAocmVzZXQgdnMgcmVsZWFzZSBvd25lcnNoaXApICovCisvKiA5IHJlc2VydmVkICovCisjZGVmaW5lIFBPUlRfUkVTRVQJKDE8PDgpCQkvKiByZXNldCBwb3J0ICovCisjZGVmaW5lIFBPUlRfU1VTUEVORAkoMTw8NykJCS8qIHN1c3BlbmQgcG9ydCAqLworI2RlZmluZSBQT1JUX1JFU1VNRQkoMTw8NikJCS8qIHJlc3VtZSBpdCAqLworI2RlZmluZSBQT1JUX09DQwkoMTw8NSkJCS8qIG92ZXIgY3VycmVudCBjaGFuZ2UgKi8KKyNkZWZpbmUgUE9SVF9PQwkJKDE8PDQpCQkvKiBvdmVyIGN1cnJlbnQgYWN0aXZlICovCisjZGVmaW5lIFBPUlRfUEVDCSgxPDwzKQkJLyogcG9ydCBlbmFibGUgY2hhbmdlICovCisjZGVmaW5lIFBPUlRfUEUJCSgxPDwyKQkJLyogcG9ydCBlbmFibGUgKi8KKyNkZWZpbmUgUE9SVF9DU0MJKDE8PDEpCQkvKiBjb25uZWN0IHN0YXR1cyBjaGFuZ2UgKi8KKyNkZWZpbmUgUE9SVF9DT05ORUNUCSgxPDwwKQkJLyogZGV2aWNlIGNvbm5lY3RlZCAqLworI2RlZmluZSBQT1JUX1JXQ19CSVRTICAgKFBPUlRfQ1NDIHwgUE9SVF9QRUMgfCBQT1JUX09DQykKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKiBBcHBlbmRpeCBDLCBEZWJ1ZyBwb3J0IC4uLiBpbnRlbmRlZCBmb3IgdXNlIHdpdGggc3BlY2lhbCAiZGVidWcgZGV2aWNlcyIKKyAqIHRoYXQgY2FuIGhlbHAgaWYgdGhlcmUncyBubyBzZXJpYWwgY29uc29sZS4gIChub25zdGFuZGFyZCBlbnVtZXJhdGlvbi4pCisgKi8KK3N0cnVjdCBlaGNpX2RiZ19wb3J0IHsKKwl1MzIJY29udHJvbDsKKyNkZWZpbmUgREJHUF9PV05FUgkoMTw8MzApCisjZGVmaW5lIERCR1BfRU5BQkxFRAkoMTw8MjgpCisjZGVmaW5lIERCR1BfRE9ORQkoMTw8MTYpCisjZGVmaW5lIERCR1BfSU5VU0UJKDE8PDEwKQorI2RlZmluZSBEQkdQX0VSUkNPREUoeCkJKCgoeCk+PjcpJjB4MDcpCisjCWRlZmluZSBEQkdQX0VSUl9CQUQJMQorIwlkZWZpbmUgREJHUF9FUlJfU0lHTkFMCTIKKyNkZWZpbmUgREJHUF9FUlJPUgkoMTw8NikKKyNkZWZpbmUgREJHUF9HTwkJKDE8PDUpCisjZGVmaW5lIERCR1BfT1VUCSgxPDw0KQorI2RlZmluZSBEQkdQX0xFTih4KQkoKCh4KT4+MCkmMHgwZikKKwl1MzIJcGlkczsKKyNkZWZpbmUgREJHUF9QSURfR0VUKHgpCQkoKCh4KT4+MTYpJjB4ZmYpCisjZGVmaW5lIERCR1BfUElEX1NFVChkYXRhLCB0b2spCSgoKGRhdGEpPDw4KXwodG9rKSkKKwl1MzIJZGF0YTAzOworCXUzMglkYXRhNDc7CisJdTMyCWFkZHJlc3M7CisjZGVmaW5lIERCR1BfRVBBRERSKGRldiwgZXApCSgoKGRldik8PDgpfChlcCkpCit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworCisjZGVmaW5lCVFURF9ORVhUKGRtYSkJY3B1X3RvX2xlMzIoKHUzMilkbWEpCisKKy8qCisgKiBFSENJIFNwZWNpZmljYXRpb24gMC45NSBTZWN0aW9uIDMuNQorICogUVREOiBkZXNjcmliZSBkYXRhIHRyYW5zZmVyIGNvbXBvbmVudHMgKGJ1ZmZlciwgZGlyZWN0aW9uLCAuLi4pCisgKiBTZWUgRmlnIDMtNiAiUXVldWUgRWxlbWVudCBUcmFuc2ZlciBEZXNjcmlwdG9yIEJsb2NrIERpYWdyYW0iLgorICoKKyAqIFRoZXNlIGFyZSBhc3NvY2lhdGVkIG9ubHkgd2l0aCAiUUgiIChRdWV1ZSBIZWFkKSBzdHJ1Y3R1cmVzLAorICogdXNlZCB3aXRoIGNvbnRyb2wsIGJ1bGssIGFuZCBpbnRlcnJ1cHQgdHJhbnNmZXJzLgorICovCitzdHJ1Y3QgZWhjaV9xdGQgeworCS8qIGZpcnN0IHBhcnQgZGVmaW5lZCBieSBFSENJIHNwZWMgKi8KKwlfX2xlMzIJCQlod19uZXh0OwkJLyogc2VlIEVIQ0kgMy41LjEgKi8KKwlfX2xlMzIJCQlod19hbHRfbmV4dDsJCS8qIHNlZSBFSENJIDMuNS4yICovCisJX19sZTMyCQkJaHdfdG9rZW47CQkvKiBzZWUgRUhDSSAzLjUuMyAqLworI2RlZmluZQlRVERfVE9HR0xFCSgxIDw8IDMxKQkvKiBkYXRhIHRvZ2dsZSAqLworI2RlZmluZQlRVERfTEVOR1RIKHRvaykJKCgodG9rKT4+MTYpICYgMHg3ZmZmKQorI2RlZmluZQlRVERfSU9DCQkoMSA8PCAxNSkJLyogaW50ZXJydXB0IG9uIGNvbXBsZXRlICovCisjZGVmaW5lCVFURF9DRVJSKHRvaykJKCgodG9rKT4+MTApICYgMHgzKQorI2RlZmluZQlRVERfUElEKHRvaykJKCgodG9rKT4+OCkgJiAweDMpCisjZGVmaW5lCVFURF9TVFNfQUNUSVZFCSgxIDw8IDcpCS8qIEhDIG1heSBleGVjdXRlIHRoaXMgKi8KKyNkZWZpbmUJUVREX1NUU19IQUxUCSgxIDw8IDYpCS8qIGhhbHRlZCBvbiBlcnJvciAqLworI2RlZmluZQlRVERfU1RTX0RCRQkoMSA8PCA1KQkvKiBkYXRhIGJ1ZmZlciBlcnJvciAoaW4gSEMpICovCisjZGVmaW5lCVFURF9TVFNfQkFCQkxFCSgxIDw8IDQpCS8qIGRldmljZSB3YXMgYmFiYmxpbmcgKHF0ZCBoYWx0ZWQpICovCisjZGVmaW5lCVFURF9TVFNfWEFDVAkoMSA8PCAzKQkvKiBkZXZpY2UgZ2F2ZSBpbGxlZ2FsIHJlc3BvbnNlICovCisjZGVmaW5lCVFURF9TVFNfTU1GCSgxIDw8IDIpCS8qIGluY29tcGxldGUgc3BsaXQgdHJhbnNhY3Rpb24gKi8KKyNkZWZpbmUJUVREX1NUU19TVFMJKDEgPDwgMSkJLyogc3BsaXQgdHJhbnNhY3Rpb24gc3RhdGUgKi8KKyNkZWZpbmUJUVREX1NUU19QSU5HCSgxIDw8IDApCS8qIGlzc3VlIFBJTkc/ICovCisJX19sZTMyCQkJaHdfYnVmWzVdOwkJLyogc2VlIEVIQ0kgMy41LjQgKi8KKwlfX2xlMzIJCQlod19idWZfaGlbNV07CQkvKiBBcHBlbmRpeCBCICovCisKKwkvKiB0aGUgcmVzdCBpcyBIQ0QtcHJpdmF0ZSAqLworCWRtYV9hZGRyX3QJCXF0ZF9kbWE7CQkvKiBxdGQgYWRkcmVzcyAqLworCXN0cnVjdCBsaXN0X2hlYWQJcXRkX2xpc3Q7CQkvKiBzdyBxdGQgbGlzdCAqLworCXN0cnVjdCB1cmIJCSp1cmI7CQkJLyogcXRkJ3MgdXJiICovCisJc2l6ZV90CQkJbGVuZ3RoOwkJCS8qIGxlbmd0aCBvZiBidWZmZXIgKi8KKworCXUzMgkJCXF0ZF9idWZmZXJfbGVuOworCXZvaWQJCQkqYnVmZmVyOworCWRtYV9hZGRyX3QJCWJ1ZmZlcl9kbWE7CisJdm9pZAkJCSp0cmFuc2Zlcl9idWZmZXI7CisJdm9pZAkJCSp0cmFuc2Zlcl9kbWE7Cit9IF9fYXR0cmlidXRlX18gKChhbGlnbmVkKDMyKSkpOworCisvKiBtYXNrIE5ha0NudCtUIGluIHFoLT5od19hbHRfbmV4dCAqLworI2RlZmluZSBRVERfTUFTSyBfX2NvbnN0YW50X2NwdV90b19sZTMyICh+MHgxZikKKworI2RlZmluZSBJU19TSE9SVF9SRUFEKHRva2VuKSAoUVREX0xFTkdUSCh0b2tlbikgIT0gMCAmJiBRVERfUElEKHRva2VuKSA9PSAxKQorCisvKiBUeXBlIHRhZyBmcm9tIHtxaCwgaXRkLCBzaXRkLCBmc3RufS0+aHdfbmV4dCAqLworI2RlZmluZSBRX05FWFRfVFlQRShkbWEpICgoZG1hKSAmIF9fY29uc3RhbnRfY3B1X3RvX2xlMzIgKDMgPDwgMSkpCisKKy8qIHZhbHVlcyBmb3IgdGhhdCB0eXBlIHRhZyAqLworI2RlZmluZSBRX1RZUEVfUUgJX19jb25zdGFudF9jcHVfdG9fbGUzMiAoMSA8PCAxKQorCisvKiBuZXh0IGFzeW5jIHF1ZXVlIGVudHJ5LCBvciBwb2ludGVyIHRvIGludGVycnVwdC9wZXJpb2RpYyBRSCAqLworI2RlZmluZQlRSF9ORVhUKGRtYSkJKGNwdV90b19sZTMyKCgodTMyKWRtYSkmfjB4MDFmKXxRX1RZUEVfUUgpCisKKy8qIGZvciBwZXJpb2RpYy9hc3luYyBzY2hlZHVsZXMgYW5kIHF0ZCBsaXN0cywgbWFyayBlbmQgb2YgbGlzdCAqLworI2RlZmluZQlFSENJX0xJU1RfRU5ECV9fY29uc3RhbnRfY3B1X3RvX2xlMzIoMSkgLyogIm51bGwgcG9pbnRlciIgdG8gaHcgKi8KKworLyoKKyAqIEVudHJpZXMgaW4gcGVyaW9kaWMgc2hhZG93IHRhYmxlIGFyZSBwb2ludGVycyB0byBvbmUgb2YgZm91ciBraW5kcworICogb2YgZGF0YSBzdHJ1Y3R1cmUuICBUaGF0J3MgZGljdGF0ZWQgYnkgdGhlIGhhcmR3YXJlOyBhIHR5cGUgdGFnIGlzCisgKiBlbmNvZGVkIGluIHRoZSBsb3cgYml0cyBvZiB0aGUgaGFyZHdhcmUncyBwZXJpb2RpYyBzY2hlZHVsZS4gIFVzZQorICogUV9ORVhUX1RZUEUgdG8gZ2V0IHRoZSB0YWcuCisgKgorICogRm9yIGVudHJpZXMgaW4gdGhlIGFzeW5jIHNjaGVkdWxlLCB0aGUgdHlwZSB0YWcgYWx3YXlzIHNheXMgInFoIi4KKyAqLwordW5pb24gZWhjaV9zaGFkb3cgeworCXN0cnVjdCBlaGNpX3FoCQkqcWg7CQkvKiBRX1RZUEVfUUggKi8KKwlfX2xlMzIJCQkqaHdfbmV4dDsJLyogKGFsbCB0eXBlcykgKi8KKwl2b2lkCQkJKnB0cjsKK307CisKKy8qCisgKiBFSENJIFNwZWNpZmljYXRpb24gMC45NSBTZWN0aW9uIDMuNgorICogUUg6IGRlc2NyaWJlcyBjb250cm9sL2J1bGsvaW50ZXJydXB0IGVuZHBvaW50cworICogU2VlIEZpZyAzLTcgIlF1ZXVlIEhlYWQgU3RydWN0dXJlIExheW91dCIuCisgKgorICogVGhlc2UgYXBwZWFyIGluIGJvdGggdGhlIGFzeW5jIGFuZCAoZm9yIGludGVycnVwdCkgcGVyaW9kaWMgc2NoZWR1bGVzLgorICovCisKK3N0cnVjdCBlaGNpX3FoIHsKKwkvKiBmaXJzdCBwYXJ0IGRlZmluZWQgYnkgRUhDSSBzcGVjICovCisJX19sZTMyCQkJaHdfbmV4dDsJIC8qIHNlZSBFSENJIDMuNi4xICovCisJX19sZTMyCQkJaHdfaW5mbzE7CS8qIHNlZSBFSENJIDMuNi4yICovCisjZGVmaW5lCVFIX0hFQUQJCTB4MDAwMDgwMDAKKwlfX2xlMzIJCQlod19pbmZvMjsJLyogc2VlIEVIQ0kgMy42LjIgKi8KKyNkZWZpbmUJUUhfU01BU0sJMHgwMDAwMDBmZgorI2RlZmluZQlRSF9DTUFTSwkweDAwMDBmZjAwCisjZGVmaW5lCVFIX0hVQkFERFIJMHgwMDdmMDAwMAorI2RlZmluZQlRSF9IVUJQT1JUCTB4M2Y4MDAwMDAKKyNkZWZpbmUJUUhfTVVMVAkJMHhjMDAwMDAwMAorCV9fbGUzMgkJCWh3X2N1cnJlbnQ7CSAvKiBxdGQgbGlzdCAtIHNlZSBFSENJIDMuNi40ICovCisKKwkvKiBxdGQgb3ZlcmxheSAoaGFyZHdhcmUgcGFydHMgb2YgYSBzdHJ1Y3QgZWhjaV9xdGQpICovCisJX19sZTMyCQkJaHdfcXRkX25leHQ7CisJX19sZTMyCQkJaHdfYWx0X25leHQ7CisJX19sZTMyCQkJaHdfdG9rZW47CisJX19sZTMyCQkJaHdfYnVmWzVdOworCV9fbGUzMgkJCWh3X2J1Zl9oaVs1XTsKKworCS8qIHRoZSByZXN0IGlzIEhDRC1wcml2YXRlICovCisJZG1hX2FkZHJfdAkJcWhfZG1hOwkJLyogYWRkcmVzcyBvZiBxaCAqLworCXVuaW9uIGVoY2lfc2hhZG93CXFoX25leHQ7CS8qIHB0ciB0byBxaDsgb3IgcGVyaW9kaWMgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkCXF0ZF9saXN0OwkvKiBzdyBxdGQgbGlzdCAqLworCXN0cnVjdCBlaGNpX3F0ZAkJKmR1bW15OworCXN0cnVjdCBlaGNpX3FoCQkqcmVjbGFpbTsJLyogbmV4dCB0byByZWNsYWltICovCisKKwlzdHJ1Y3Qgb3h1X2hjZAkJKm94dTsKKwlzdHJ1Y3Qga3JlZgkJa3JlZjsKKwl1bnNpZ25lZAkJc3RhbXA7CisKKwl1OAkJCXFoX3N0YXRlOworI2RlZmluZQlRSF9TVEFURV9MSU5LRUQJCTEJCS8qIEhDIHNlZXMgdGhpcyAqLworI2RlZmluZQlRSF9TVEFURV9VTkxJTksJCTIJCS8qIEhDIG1heSBzdGlsbCBzZWUgdGhpcyAqLworI2RlZmluZQlRSF9TVEFURV9JRExFCQkzCQkvKiBIQyBkb2Vzbid0IHNlZSB0aGlzICovCisjZGVmaW5lCVFIX1NUQVRFX1VOTElOS19XQUlUCTQJCS8qIExJTktFRCBhbmQgb24gcmVjbGFpbSBxICovCisjZGVmaW5lCVFIX1NUQVRFX0NPTVBMRVRJTkcJNQkJLyogZG9uJ3QgdG91Y2ggdG9rZW4uSEFMVCAqLworCisJLyogcGVyaW9kaWMgc2NoZWR1bGUgaW5mbyAqLworCXU4CQkJdXNlY3M7CQkvKiBpbnRyIGJhbmR3aWR0aCAqLworCXU4CQkJZ2FwX3VmOwkJLyogdWZyYW1lcyBzcGxpdC9jc3BsaXQgZ2FwICovCisJdTgJCQljX3VzZWNzOwkvKiAuLi4gc3BsaXQgY29tcGxldGlvbiBidyAqLworCXUxNgkJCXR0X3VzZWNzOwkvKiB0dCBkb3duc3RyZWFtIGJhbmR3aWR0aCAqLworCXVuc2lnbmVkIHNob3J0CQlwZXJpb2Q7CQkvKiBwb2xsaW5nIGludGVydmFsICovCisJdW5zaWduZWQgc2hvcnQJCXN0YXJ0OwkJLyogd2hlcmUgcG9sbGluZyBzdGFydHMgKi8KKyNkZWZpbmUgTk9fRlJBTUUgKCh1bnNpZ25lZCBzaG9ydCl+MCkJCQkvKiBwaWNrIG5ldyBzdGFydCAqLworCXN0cnVjdCB1c2JfZGV2aWNlCSpkZXY7CQkvKiBhY2Nlc3MgdG8gVFQgKi8KK30gX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQoMzIpKSk7CisKKy8qCisgKiBQcm9wZXIgT1hVMjEwSFAgc3RydWN0cworICovCisKKyNkZWZpbmUgT1hVX09UR19DT1JFX09GRlNFVAkweDAwNDAwCisjZGVmaW5lIE9YVV9PVEdfQ0FQX09GRlNFVAkoT1hVX09UR19DT1JFX09GRlNFVCArIDB4MTAwKQorI2RlZmluZSBPWFVfU1BIX0NPUkVfT0ZGU0VUCTB4MDA4MDAKKyNkZWZpbmUgT1hVX1NQSF9DQVBfT0ZGU0VUCShPWFVfU1BIX0NPUkVfT0ZGU0VUICsgMHgxMDApCisKKyNkZWZpbmUgT1hVX09UR19NRU0JCTB4RTAwMAorI2RlZmluZSBPWFVfU1BIX01FTQkJMHgxNjAwMAorCisvKiBPbmx5IGhvdyBtYW55IGVsZW1lbnRzICYgZWxlbWVudCBzdHJ1Y3R1cmUgYXJlIHNwZWNpZmllcyBoZXJlLiAqLworLyogMiBob3N0IGNvbnRyb2xsZXJzIGFyZSBlbmFibGVkIC0gdG90YWwgc2l6ZSA8PSAyOCBrYnl0ZXMgKi8KKyNkZWZpbmUJREVGQVVMVF9JX1REUFMJCTEwMjQKKyNkZWZpbmUgUUhFQURfTlVNCQkxNgorI2RlZmluZSBRVERfTlVNCQkJMzIKKyNkZWZpbmUgU0lURF9OVU0JCTgKKyNkZWZpbmUgTVVSQl9OVU0JCTgKKworI2RlZmluZSBCVUZGRVJfTlVNCQk4CisjZGVmaW5lIEJVRkZFUl9TSVpFCQk1MTIKKworc3RydWN0IG94dV9pbmZvIHsKKwlzdHJ1Y3QgdXNiX2hjZCAqaGNkWzJdOworfTsKKworc3RydWN0IG94dV9idWYgeworCXU4CQkJYnVmZmVyW0JVRkZFUl9TSVpFXTsKK30gX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQoQlVGRkVSX1NJWkUpKSk7CisKK3N0cnVjdCBveHVfb25jaGlwX21lbSB7CisJc3RydWN0IG94dV9idWYJCWRiX3Bvb2xbQlVGRkVSX05VTV07CisKKwl1MzIJCQlmcmFtZV9saXN0W0RFRkFVTFRfSV9URFBTXTsKKwlzdHJ1Y3QgZWhjaV9xaAkJcWhfcG9vbFtRSEVBRF9OVU1dOworCXN0cnVjdCBlaGNpX3F0ZAkJcXRkX3Bvb2xbUVREX05VTV07Cit9IF9fYXR0cmlidXRlX18gKChhbGlnbmVkKDQgPDwgMTApKSk7CisKKyNkZWZpbmUJRUhDSV9NQVhfUk9PVF9QT1JUUwkxNQkJLyogc2VlIEhDU19OX1BPUlRTICovCisKK3N0cnVjdCBveHVfbXVyYiB7CisJc3RydWN0IHVyYgkJdXJiOworCXN0cnVjdCB1cmIJCSptYWluOworCXU4CQkJbGFzdDsKK307CisKK3N0cnVjdCBveHVfaGNkIHsJCQkJLyogb25lIHBlciBjb250cm9sbGVyICovCisJdW5zaWduZWQgaW50CQlpc19vdGc6MTsKKworCXU4CQkJcWhfdXNlZFtRSEVBRF9OVU1dOworCXU4CQkJcXRkX3VzZWRbUVREX05VTV07CisJdTgJCQlkYl91c2VkW0JVRkZFUl9OVU1dOworCXU4CQkJbXVyYl91c2VkW01VUkJfTlVNXTsKKworCXN0cnVjdCBveHVfb25jaGlwX21lbQlfX2lvbWVtICptZW07CisJc3BpbmxvY2tfdAkJbWVtX2xvY2s7CisKKwlzdHJ1Y3QgdGltZXJfbGlzdAl1cmJfdGltZXI7CisKKwlzdHJ1Y3QgZWhjaV9jYXBzIF9faW9tZW0gKmNhcHM7CisJc3RydWN0IGVoY2lfcmVncyBfX2lvbWVtICpyZWdzOworCisJX191MzIJCQloY3NfcGFyYW1zOwkvKiBjYWNoZWQgcmVnaXN0ZXIgY29weSAqLworCXNwaW5sb2NrX3QJCWxvY2s7CisKKwkvKiBhc3luYyBzY2hlZHVsZSBzdXBwb3J0ICovCisJc3RydWN0IGVoY2lfcWgJCSphc3luYzsKKwlzdHJ1Y3QgZWhjaV9xaAkJKnJlY2xhaW07CisJdW5zaWduZWQJCXJlY2xhaW1fcmVhZHk6MTsKKwl1bnNpZ25lZAkJc2Nhbm5pbmc6MTsKKworCS8qIHBlcmlvZGljIHNjaGVkdWxlIHN1cHBvcnQgKi8KKwl1bnNpZ25lZAkJcGVyaW9kaWNfc2l6ZTsKKwlfX2xlMzIJCQkqcGVyaW9kaWM7CS8qIGh3IHBlcmlvZGljIHRhYmxlICovCisJZG1hX2FkZHJfdAkJcGVyaW9kaWNfZG1hOworCXVuc2lnbmVkCQlpX3RocmVzaDsJLyogdWZyYW1lcyBIQyBtaWdodCBjYWNoZSAqLworCisJdW5pb24gZWhjaV9zaGFkb3cJKnBzaGFkb3c7CS8qIG1pcnJvciBodyBwZXJpb2RpYyB0YWJsZSAqLworCWludAkJCW5leHRfdWZyYW1lOwkvKiBzY2FuIHBlcmlvZGljLCBzdGFydCBoZXJlICovCisJdW5zaWduZWQJCXBlcmlvZGljX3NjaGVkOwkvKiBwZXJpb2RpYyBhY3Rpdml0eSBjb3VudCAqLworCisJLyogcGVyIHJvb3QgaHViIHBvcnQgKi8KKwl1bnNpZ25lZCBsb25nCQlyZXNldF9kb25lW0VIQ0lfTUFYX1JPT1RfUE9SVFNdOworCS8qIGJpdCB2ZWN0b3JzIChvbmUgYml0IHBlciBwb3J0KSAqLworCXVuc2lnbmVkIGxvbmcJCWJ1c19zdXNwZW5kZWQ7CS8qIHdoaWNoIHBvcnRzIHdlcmUKKwkJCQkJCSAqIGFscmVhZHkgc3VzcGVuZGVkIGF0IHRoZQorCQkJCQkJICogc3RhcnQgb2YgYSBidXMgc3VzcGVuZAorCQkJCQkJICovCisJdW5zaWduZWQgbG9uZwkJY29tcGFuaW9uX3BvcnRzOy8qIHdoaWNoIHBvcnRzIGFyZSBkZWRpY2F0ZWQKKwkJCQkJCSAqIHRvIHRoZSBjb21wYW5pb24gY29udHJvbGxlcgorCQkJCQkJICovCisKKwlzdHJ1Y3QgdGltZXJfbGlzdAl3YXRjaGRvZzsKKwl1bnNpZ25lZCBsb25nCQlhY3Rpb25zOworCXVuc2lnbmVkCQlzdGFtcDsKKwl1bnNpZ25lZCBsb25nCQluZXh0X3N0YXRlY2hhbmdlOworCXUzMgkJCWNvbW1hbmQ7CisKKwkvKiBTSUxJQ09OIFFVSVJLUyAqLworCXN0cnVjdCBsaXN0X2hlYWQJdXJiX2xpc3Q7CS8qIHRoaXMgaXMgdGhlIGhlYWQgdG8gdXJiCisJCQkJCQkgKiBxdWV1ZSB0aGF0IGRpZG4ndCBnZXQgZW5vdWdoCisJCQkJCQkgKiByZXNvdXJjZXMKKwkJCQkJCSAqLworCXN0cnVjdCBveHVfbXVyYgkJKm11cmJfcG9vbDsJLyogbXVyYiBwZXIgc3BsaXQgYmlnIHVyYiAqLworCXVuc2lnbmVkIHVyYl9sZW47CisKKwl1OAkJCXNicm47CQkvKiBwYWNrZWQgcmVsZWFzZSBudW1iZXIgKi8KK307CisKKyNkZWZpbmUgRUhDSV9JQUFfSklGRklFUwkoSFovMTAwKQkvKiBhcmJpdHJhcnk7IH4xMCBtc2VjICovCisjZGVmaW5lIEVIQ0lfSU9fSklGRklFUwkgCShIWi8xMCkJCS8qIGlvIHdhdGNoZG9nID4gaXJxX3RocmVzaCAqLworI2RlZmluZSBFSENJX0FTWU5DX0pJRkZJRVMgICAgICAoSFovMjApCQkvKiBhc3luYyBpZGxlIHRpbWVvdXQgKi8KKyNkZWZpbmUgRUhDSV9TSFJJTktfSklGRklFUyAgICAgKEhaLzIwMCkJLyogYXN5bmMgcWggdW5saW5rIGRlbGF5ICovCisKK2VudW0gZWhjaV90aW1lcl9hY3Rpb24geworCVRJTUVSX0lPX1dBVENIRE9HLAorCVRJTUVSX0lBQV9XQVRDSERPRywKKwlUSU1FUl9BU1lOQ19TSFJJTkssCisJVElNRVJfQVNZTkNfT0ZGLAorfTsKKworI2luY2x1ZGUgPGxpbnV4L294dTIxMGhwLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L3BjaS1xdWlya3MuYyBiL2RyaXZlcnMvdXNiL2hvc3QvcGNpLXF1aXJrcy5jCmluZGV4IGFlNmU3MGUuLjc1YjY5ODQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3QvcGNpLXF1aXJrcy5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3QvcGNpLXF1aXJrcy5jCkBAIC0xNzIsOSArMTcyLDkgQEAKIAlpZiAoIW1taW9fcmVzb3VyY2VfZW5hYmxlZChwZGV2LCAwKSkKIAkJcmV0dXJuOwogCi0JYmFzZSA9IGlvcmVtYXBfbm9jYWNoZShwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMCksCi0JCQkJICAgICBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDApKTsKLQlpZiAoYmFzZSA9PSBOVUxMKSByZXR1cm47CisJYmFzZSA9IHBjaV9pb3JlbWFwX2JhcihwZGV2LCAwKTsKKwlpZiAoYmFzZSA9PSBOVUxMKQorCQlyZXR1cm47CiAKIC8qIE9uIFBBLVJJU0MsIFBEQyBjYW4gbGVhdmUgSVIgc2V0IGluY29ycmVjdGx5OyBpZ25vcmUgaXQgdGhlcmUuICovCiAjaWZuZGVmIF9faHBwYV9fCkBAIC0yMjEsOSArMjIxLDkgQEAKIAlpZiAoIW1taW9fcmVzb3VyY2VfZW5hYmxlZChwZGV2LCAwKSkKIAkJcmV0dXJuOwogCi0JYmFzZSA9IGlvcmVtYXBfbm9jYWNoZShwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMCksCi0JCQkJcGNpX3Jlc291cmNlX2xlbihwZGV2LCAwKSk7Ci0JaWYgKGJhc2UgPT0gTlVMTCkgcmV0dXJuOworCWJhc2UgPSBwY2lfaW9yZW1hcF9iYXIocGRldiwgMCk7CisJaWYgKGJhc2UgPT0gTlVMTCkKKwkJcmV0dXJuOwogCiAJY2FwX2xlbmd0aCA9IHJlYWRiKGJhc2UpOwogCW9wX3JlZ19iYXNlID0gYmFzZSArIGNhcF9sZW5ndGg7CkBAIC0yNzEsNyArMjcxLDcgQEAKIAkJCS8qIGlmIGJvb3QgZmlybXdhcmUgbm93IG93bnMgRUhDSSwgc3BpbiB0aWxsCiAJCQkgKiBpdCBoYW5kcyBpdCBvdmVyLgogCQkJICovCi0JCQltc2VjID0gNTAwMDsKKwkJCW1zZWMgPSAxMDAwOwogCQkJd2hpbGUgKChjYXAgJiBFSENJX1VTQkxFR1NVUF9CSU9TKSAmJiAobXNlYyA+IDApKSB7CiAJCQkJdHJpZWRfaGFuZG9mZiA9IDE7CiAJCQkJbXNsZWVwKDEwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3QvcjhhNjY1OTctaGNkLmMgYi9kcml2ZXJzL3VzYi9ob3N0L3I4YTY2NTk3LWhjZC5jCmluZGV4IGMyMWYxNGUuLjMxOTA0MTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3QvcjhhNjY1OTctaGNkLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC9yOGE2NjU5Ny1oY2QuYwpAQCAtMjI3NSw3ICsyMjc1LDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotI2RlZmluZSByZXNvdXJjZV9sZW4ocikgKCgociktPmVuZCAtIChyKS0+c3RhcnQpICsgMSkKIHN0YXRpYyBpbnQgX19pbml0IHI4YTY2NTk3X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAjaWYgZGVmaW5lZChDT05GSUdfU1VQRVJIX09OX0NISVBfUjhBNjY1OTcpICYmIGRlZmluZWQoQ09ORklHX0hBVkVfQ0xLKQpAQCAtMjI5NiwxMSArMjI5NSwxMCBAQAogCQlnb3RvIGNsZWFuX3VwOwogCX0KIAotCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZV9ieW5hbWUocGRldiwgSU9SRVNPVVJDRV9NRU0sCi0JCQkJCSAgIChjaGFyICopaGNkX25hbWUpOworCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CiAJaWYgKCFyZXMpIHsKIAkJcmV0ID0gLUVOT0RFVjsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAicGxhdGZvcm1fZ2V0X3Jlc291cmNlX2J5bmFtZSBlcnJvci5cbiIpOworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJwbGF0Zm9ybV9nZXRfcmVzb3VyY2UgZXJyb3IuXG4iKTsKIAkJZ290byBjbGVhbl91cDsKIAl9CiAKQEAgLTIzMTUsNyArMjMxMyw3IEBACiAJaXJxID0gaXJlcy0+c3RhcnQ7CiAJaXJxX3RyaWdnZXIgPSBpcmVzLT5mbGFncyAmIElSUUZfVFJJR0dFUl9NQVNLOwogCi0JcmVnID0gaW9yZW1hcChyZXMtPnN0YXJ0LCByZXNvdXJjZV9sZW4ocmVzKSk7CisJcmVnID0gaW9yZW1hcChyZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKHJlcykpOwogCWlmIChyZWcgPT0gTlVMTCkgewogCQlyZXQgPSAtRU5PTUVNOwogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJpb3JlbWFwIGVycm9yLlxuIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L3VoY2ktaGNkLmMgYi9kcml2ZXJzL3VzYi9ob3N0L3VoY2ktaGNkLmMKaW5kZXggY2Y1ZTRjZi4uNGUyMjEwNiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC91aGNpLWhjZC5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3QvdWhjaS1oY2QuYwpAQCAtOTQyLDYgKzk0Miw4IEBACiAKICNpZmRlZglDT05GSUdfUE0KIAkuc3VzcGVuZCA9CXVzYl9oY2RfcGNpX3N1c3BlbmQsCisJLnN1c3BlbmRfbGF0ZSA9CXVzYl9oY2RfcGNpX3N1c3BlbmRfbGF0ZSwKKwkucmVzdW1lX2Vhcmx5ID0JdXNiX2hjZF9wY2lfcmVzdW1lX2Vhcmx5LAogCS5yZXN1bWUgPQl1c2JfaGNkX3BjaV9yZXN1bWUsCiAjZW5kaWYJLyogUE0gKi8KIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9pbWFnZS9taWNyb3Rlay5jIGIvZHJpdmVycy91c2IvaW1hZ2UvbWljcm90ZWsuYwppbmRleCA4ODU4NjdhLi40NTQxZGZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9pbWFnZS9taWNyb3Rlay5jCisrKyBiL2RyaXZlcnMvdXNiL2ltYWdlL21pY3JvdGVrLmMKQEAgLTM1MCwxNyArMzUwLDE2IEBACiBzdGF0aWMgaW50IG10c19zY3NpX2hvc3RfcmVzZXQoc3RydWN0IHNjc2lfY21uZCAqc3JiKQogewogCXN0cnVjdCBtdHNfZGVzYyogZGVzYyA9IChzdHJ1Y3QgbXRzX2Rlc2MqKShzcmItPmRldmljZS0+aG9zdC0+aG9zdGRhdGFbMF0pOwotCWludCByZXN1bHQsIHJjOworCWludCByZXN1bHQ7CiAKIAlNVFNfREVCVUdfR09UX0hFUkUoKTsKIAltdHNfZGVidWdfZHVtcChkZXNjKTsKIAotCXJjID0gdXNiX2xvY2tfZGV2aWNlX2Zvcl9yZXNldChkZXNjLT51c2JfZGV2LCBkZXNjLT51c2JfaW50Zik7Ci0JaWYgKHJjIDwgMCkKLQkJcmV0dXJuIEZBSUxFRDsKLQlyZXN1bHQgPSB1c2JfcmVzZXRfZGV2aWNlKGRlc2MtPnVzYl9kZXYpOwotCWlmIChyYykKKwlyZXN1bHQgPSB1c2JfbG9ja19kZXZpY2VfZm9yX3Jlc2V0KGRlc2MtPnVzYl9kZXYsIGRlc2MtPnVzYl9pbnRmKTsKKwlpZiAocmVzdWx0ID09IDApIHsKKwkJcmVzdWx0ID0gdXNiX3Jlc2V0X2RldmljZShkZXNjLT51c2JfZGV2KTsKIAkJdXNiX3VubG9ja19kZXZpY2UoZGVzYy0+dXNiX2Rldik7CisJfQogCXJldHVybiByZXN1bHQgPyBGQUlMRUQgOiBTVUNDRVNTOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9taXNjL2JlcnJ5X2NoYXJnZS5jIGIvZHJpdmVycy91c2IvbWlzYy9iZXJyeV9jaGFyZ2UuYwppbmRleCAyNGUyZGMzLi5jMDVhODViIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9taXNjL2JlcnJ5X2NoYXJnZS5jCisrKyBiL2RyaXZlcnMvdXNiL21pc2MvYmVycnlfY2hhcmdlLmMKQEAgLTEyMyw2ICsxMjMsMTEgQEAKIHsKIAlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiA9IGludGVyZmFjZV90b191c2JkZXYoaW50Zik7CiAKKwlpZiAodWRldi0+YnVzX21BIDwgNTAwKSB7CisJCWRiZygmdWRldi0+ZGV2LCAiTm90IGVub3VnaCBwb3dlciB0byBjaGFyZ2UgYXZhaWxhYmxlXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCiAJZGJnKCZ1ZGV2LT5kZXYsICJQb3dlciBpcyBzZXQgdG8gJWRtQVxuIiwKIAkgICAgdWRldi0+YWN0Y29uZmlnLT5kZXNjLmJNYXhQb3dlciAqIDIpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9taXNjL2VtaTI2LmMgYi9kcml2ZXJzL3VzYi9taXNjL2VtaTI2LmMKaW5kZXggZTc2MmJlYi4uODc5YTk4MCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbWlzYy9lbWkyNi5jCisrKyBiL2RyaXZlcnMvdXNiL21pc2MvZW1pMjYuYwpAQCAtMTYwLDcgKzE2MCw3IEBACiAJCQllcnIoIiVzIC0gZXJyb3IgbG9hZGluZyBmaXJtd2FyZTogZXJyb3IgPSAlZCIsIF9fZnVuY19fLCBlcnIpOwogCQkJZ290byB3cmFwZXJyOwogCQl9Ci0JfSB3aGlsZSAoaSA+IDApOworCX0gd2hpbGUgKHJlYyk7CiAKIAkvKiBBc3NlcnQgcmVzZXQgKHN0b3AgdGhlIENQVSBpbiB0aGUgRU1JKSAqLwogCWVyciA9IGVtaTI2X3NldF9yZXNldChkZXYsMSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9taXNjL3VzYnRlc3QuYyBiL2RyaXZlcnMvdXNiL21pc2MvdXNidGVzdC5jCmluZGV4IDQ0NGM2OWMuLjVmMWExOWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL21pc2MvdXNidGVzdC5jCisrKyBiL2RyaXZlcnMvdXNiL21pc2MvdXNidGVzdC5jCkBAIC0xOTIsOCArMTkyLDYgQEAKIHsKIAlzdHJ1Y3QgdXJiCQkqdXJiOwogCi0JaWYgKGJ5dGVzIDwgMCkKLQkJcmV0dXJuIE5VTEw7CiAJdXJiID0gdXNiX2FsbG9jX3VyYiAoMCwgR0ZQX0tFUk5FTCk7CiAJaWYgKCF1cmIpCiAJCXJldHVybiB1cmI7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9tb24vS2NvbmZpZyBiL2RyaXZlcnMvdXNiL21vbi9LY29uZmlnCmluZGV4IGRlYjlkZGYuLmYyOGYzNTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL21vbi9LY29uZmlnCisrKyBiL2RyaXZlcnMvdXNiL21vbi9LY29uZmlnCkBAIC0zLDE0ICszLDEzIEBACiAjCiAKIGNvbmZpZyBVU0JfTU9OCi0JYm9vbCAiVVNCIE1vbml0b3IiCi0JZGVwZW5kcyBvbiBVU0IhPW4KLQlkZWZhdWx0IHkKKwl0cmlzdGF0ZSAiVVNCIE1vbml0b3IiCisJZGVwZW5kcyBvbiBVU0IKKwlkZWZhdWx0IHkgaWYgVVNCPXkKKwlkZWZhdWx0IG0gaWYgVVNCPW0KIAloZWxwCi0JICBJZiB5b3Ugc2F5IFkgaGVyZSwgYSBjb21wb25lbnQgd2hpY2ggY2FwdHVyZXMgdGhlIFVTQiB0cmFmZmljCisJICBJZiB5b3Ugc2VsZWN0IHRoaXMgb3B0aW9uLCBhIGNvbXBvbmVudCB3aGljaCBjYXB0dXJlcyB0aGUgVVNCIHRyYWZmaWMKIAkgIGJldHdlZW4gcGVyaXBoZXJhbC1zcGVjaWZpYyBkcml2ZXJzIGFuZCBIQyBkcml2ZXJzIHdpbGwgYmUgYnVpbHQuCiAJICBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIDxmaWxlOkRvY3VtZW50YXRpb24vdXNiL3VzYm1vbi50eHQ+LgogCi0JICBUaGlzIGlzIHNvbWV3aGF0IGV4cGVyaW1lbnRhbCBhdCB0aGlzIHRpbWUsIGJ1dCBpdCBzaG91bGQgYmUgc2FmZS4KLQotCSAgSWYgdW5zdXJlLCBzYXkgWS4KKwkgIElmIHVuc3VyZSwgc2F5IFkgKGlmIGFsbG93ZWQpLCBvdGhlcndpc2UgTS4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL21vbi9NYWtlZmlsZSBiL2RyaXZlcnMvdXNiL21vbi9NYWtlZmlsZQppbmRleCAwZjc2ZWQ1Li5jNjUxNmI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9tb24vTWFrZWZpbGUKKysrIGIvZHJpdmVycy91c2IvbW9uL01ha2VmaWxlCkBAIC00LDUgKzQsNCBAQAogCiB1c2Jtb24tb2Jqcwk6PSBtb25fbWFpbi5vIG1vbl9zdGF0Lm8gbW9uX3RleHQubyBtb25fYmluLm8gbW9uX2RtYS5vCiAKLSMgVGhpcyBkb2VzIG5vdCB1c2UgQ09ORklHX1VTQl9NT04gYmVjYXVzZSB3ZSB3YW50IHRoaXMgdG8gdXNlIGEgdHJpc3RhdGUuCi1vYmotJChDT05GSUdfVVNCKQkrPSB1c2Jtb24ubworb2JqLSQoQ09ORklHX1VTQl9NT04pCSs9IHVzYm1vbi5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9tdXNiL0tjb25maWcgYi9kcml2ZXJzL3VzYi9tdXNiL0tjb25maWcKaW5kZXggNGI5NTQyYi4uNWFmNzM3OSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbXVzYi9LY29uZmlnCisrKyBiL2RyaXZlcnMvdXNiL211c2IvS2NvbmZpZwpAQCAtMTEsNyArMTEsNyBAQAogCWRlcGVuZHMgb24gKFVTQiB8fCBVU0JfR0FER0VUKSAmJiBIQVZFX0NMSwogCWRlcGVuZHMgb24gIVNVUEVSSAogCXNlbGVjdCBUV0w0MDMwX1VTQiBpZiBNQUNIX09NQVBfMzQzMFNEUAotCXRyaXN0YXRlICdJbnZlbnRyYSBIaWdoc3BlZWQgRHVhbCBSb2xlIENvbnRyb2xsZXIgKFRJLCAuLi4pJworCXRyaXN0YXRlICdJbnZlbnRyYSBIaWdoc3BlZWQgRHVhbCBSb2xlIENvbnRyb2xsZXIgKFRJLCBBREksIC4uLiknCiAJaGVscAogCSAgU2F5IFkgaGVyZSBpZiB5b3VyIHN5c3RlbSBoYXMgYSBkdWFsIHJvbGUgaGlnaCBzcGVlZCBVU0IKIAkgIGNvbnRyb2xsZXIgYmFzZWQgb24gdGhlIE1lbnRvciBHcmFwaGljcyBzaWxpY29uIElQLiAgVGhlbgpAQCAtMjIsNiArMjIsOSBAQAogCSAgVGV4YXMgSW5zdHJ1bWVudHMgcGFydHMgdXNpbmcgdGhpcyBJUCBpbmNsdWRlIERhVmluY2kgNjQ0eCwKIAkgIE9NQVAgMjQzeCwgT01BUCAzNDN4LCBhbmQgVFVTQiA2MDEwLgogCisJICBBbmFsb2cgRGV2aWNlcyBwYXJ0cyB1c2luZyB0aGlzIElQIGluY2x1ZGUgQmxhY2tmaW4gQkY1NHgsCisJICBCRjUyNSBhbmQgQkY1MjcuCisKIAkgIElmIHlvdSBkbyBub3Qga25vdyB3aGF0IHRoaXMgaXMsIHBsZWFzZSBzYXkgTi4KIAogCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTsgdGhlCkBAIC0zMyw2ICszNiw4IEBACiAJZGVmYXVsdCB5IGlmIEFSQ0hfREFWSU5DSQogCWRlZmF1bHQgeSBpZiBBUkNIX09NQVAyNDMwCiAJZGVmYXVsdCB5IGlmIEFSQ0hfT01BUDM0WFgKKwlkZWZhdWx0IHkgaWYgKEJGNTR4ICYmICFCRjU0NCkKKwlkZWZhdWx0IHkgaWYgKEJGNTJ4ICYmICFCRjUyMiAmJiAhQkY1MjMpCiAKIGNvbW1lbnQgIkRhVmluY2kgNjQ0eCBVU0Igc3VwcG9ydCIKIAlkZXBlbmRzIG9uIFVTQl9NVVNCX0hEUkMgJiYgQVJDSF9EQVZJTkNJCkBAIC00Myw2ICs0OCw5IEBACiBjb21tZW50ICJPTUFQIDM0M3ggaGlnaCBzcGVlZCBVU0Igc3VwcG9ydCIKIAlkZXBlbmRzIG9uIFVTQl9NVVNCX0hEUkMgJiYgQVJDSF9PTUFQMzRYWAogCitjb21tZW50ICJCbGFja2ZpbiBoaWdoIHNwZWVkIFVTQiBTdXBwb3J0IgorCWRlcGVuZHMgb24gVVNCX01VU0JfSERSQyAmJiAoQkY1NHggJiYgIUJGNTQ0KSB8fCAoQkY1MnggJiYgIUJGNTIyICYmICFCRjUyMykKKwogY29uZmlnIFVTQl9UVVNCNjAxMAogCWJvb2xlYW4gIlRVU0IgNjAxMCBzdXBwb3J0IgogCWRlcGVuZHMgb24gVVNCX01VU0JfSERSQyAmJiAhVVNCX01VU0JfU09DCkBAIC0xNDIsNyArMTUwLDcgQEAKIGNvbmZpZyBVU0JfSU5WRU5UUkFfRE1BCiAJYm9vbAogCWRlcGVuZHMgb24gVVNCX01VU0JfSERSQyAmJiAhTVVTQl9QSU9fT05MWQotCWRlZmF1bHQgQVJDSF9PTUFQMjQzMCB8fCBBUkNIX09NQVAzNFhYCisJZGVmYXVsdCBBUkNIX09NQVAyNDMwIHx8IEFSQ0hfT01BUDM0WFggfHwgQkxBQ0tGSU4KIAloZWxwCiAJICBFbmFibGUgRE1BIHRyYW5zZmVycyB1c2luZyBNZW50b3IncyBlbmdpbmUuCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL211c2IvTWFrZWZpbGUgYi9kcml2ZXJzL3VzYi9tdXNiL01ha2VmaWxlCmluZGV4IGI2YWYwZDYuLjg1NzEwY2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL211c2IvTWFrZWZpbGUKKysrIGIvZHJpdmVycy91c2IvbXVzYi9NYWtlZmlsZQpAQCAtMjIsNiArMjIsMTQgQEAKIAltdXNiX2hkcmMtb2JqcwkrPSBvbWFwMjQzMC5vCiBlbmRpZgogCitpZmVxICgkKENPTkZJR19CRjU0eCkseSkKKwltdXNiX2hkcmMtb2JqcwkrPSBibGFja2Zpbi5vCitlbmRpZgorCitpZmVxICgkKENPTkZJR19CRjUyeCkseSkKKwltdXNiX2hkcmMtb2JqcwkrPSBibGFja2Zpbi5vCitlbmRpZgorCiBpZmVxICgkKENPTkZJR19VU0JfR0FER0VUX01VU0JfSERSQykseSkKIAltdXNiX2hkcmMtb2JqcwkJKz0gbXVzYl9nYWRnZXRfZXAwLm8gbXVzYl9nYWRnZXQubwogZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL211c2IvYmxhY2tmaW4uYyBiL2RyaXZlcnMvdXNiL211c2IvYmxhY2tmaW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODYxMzQ4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy91c2IvbXVzYi9ibGFja2Zpbi5jCkBAIC0wLDAgKzEsMzIwIEBACisvKgorICogTVVTQiBPVEcgY29udHJvbGxlciBkcml2ZXIgZm9yIEJsYWNrZmluIFByb2Nlc3NvcnMKKyAqCisgKiBDb3B5cmlnaHQgMjAwNi0yMDA4IEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqCisgKiBFbnRlciBidWdzIGF0IGh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZy8KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisKKyNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgorCisjaW5jbHVkZSAibXVzYl9jb3JlLmgiCisjaW5jbHVkZSAiYmxhY2tmaW4uaCIKKworLyoKKyAqIExvYWQgYW4gZW5kcG9pbnQncyBGSUZPCisgKi8KK3ZvaWQgbXVzYl93cml0ZV9maWZvKHN0cnVjdCBtdXNiX2h3X2VwICpod19lcCwgdTE2IGxlbiwgY29uc3QgdTggKnNyYykKK3sKKwl2b2lkIF9faW9tZW0gKmZpZm8gPSBod19lcC0+ZmlmbzsKKwl2b2lkIF9faW9tZW0gKmVwaW8gPSBod19lcC0+cmVnczsKKworCXByZWZldGNoKCh1OCAqKXNyYyk7CisKKwltdXNiX3dyaXRldyhlcGlvLCBNVVNCX1RYQ09VTlQsIGxlbik7CisKKwlEQkcoNCwgIlRYIGVwJWQgZmlmbyAlcCBjb3VudCAlZCBidWYgJXAsIGVwaW8gJXBcbiIsCisJCQlod19lcC0+ZXBudW0sIGZpZm8sIGxlbiwgc3JjLCBlcGlvKTsKKworCWR1bXBfZmlmb19kYXRhKHNyYywgbGVuKTsKKworCWlmICh1bmxpa2VseSgodW5zaWduZWQgbG9uZylzcmMgJiAweDAxKSkKKwkJb3V0c3dfOCgodW5zaWduZWQgbG9uZylmaWZvLCBzcmMsCisJCQlsZW4gJiAweDAxID8gKGxlbiA+PiAxKSArIDEgOiBsZW4gPj4gMSk7CisJZWxzZQorCQlvdXRzdygodW5zaWduZWQgbG9uZylmaWZvLCBzcmMsCisJCQlsZW4gJiAweDAxID8gKGxlbiA+PiAxKSArIDEgOiBsZW4gPj4gMSk7Cit9CisKKy8qCisgKiBVbmxvYWQgYW4gZW5kcG9pbnQncyBGSUZPCisgKi8KK3ZvaWQgbXVzYl9yZWFkX2ZpZm8oc3RydWN0IG11c2JfaHdfZXAgKmh3X2VwLCB1MTYgbGVuLCB1OCAqZHN0KQoreworCXZvaWQgX19pb21lbSAqZmlmbyA9IGh3X2VwLT5maWZvOworCXU4IGVwbnVtID0gaHdfZXAtPmVwbnVtOworCXUxNiBkbWFfcmVnID0gMDsKKworCURCRyg0LCAiJWNYIGVwJWQgZmlmbyAlcCBjb3VudCAlZCBidWYgJXBcbiIsCisJCQknUicsIGh3X2VwLT5lcG51bSwgZmlmbywgbGVuLCBkc3QpOworCisjaWZkZWYgQ09ORklHX0JGNTJ4CisJaW52YWxpZGF0ZV9kY2FjaGVfcmFuZ2UoKHVuc2lnbmVkIGludClkc3QsCisJCSh1bnNpZ25lZCBpbnQpKGRzdCArIGxlbikpOworCisJLyogU2V0dXAgRE1BIGFkZHJlc3MgcmVnaXN0ZXIgKi8KKwlkbWFfcmVnID0gKHUxNikgKCh1MzIpIGRzdCAmIDB4RkZGRik7CisJYmZpbl93cml0ZTE2KFVTQl9ETUFfUkVHKGVwbnVtLCBVU0JfRE1BeF9BRERSX0xPVyksIGRtYV9yZWcpOworCVNTWU5DKCk7CisKKwlkbWFfcmVnID0gKHUxNikgKCgodTMyKSBkc3QgPj4gMTYpICYgMHhGRkZGKTsKKwliZmluX3dyaXRlMTYoVVNCX0RNQV9SRUcoZXBudW0sIFVTQl9ETUF4X0FERFJfSElHSCksIGRtYV9yZWcpOworCVNTWU5DKCk7CisKKwkvKiBTZXR1cCBETUEgY291bnQgcmVnaXN0ZXIgKi8KKwliZmluX3dyaXRlMTYoVVNCX0RNQV9SRUcoZXBudW0sIFVTQl9ETUF4X0NPVU5UX0xPVyksIGxlbik7CisJYmZpbl93cml0ZTE2KFVTQl9ETUFfUkVHKGVwbnVtLCBVU0JfRE1BeF9DT1VOVF9ISUdIKSwgMCk7CisJU1NZTkMoKTsKKworCS8qIEVuYWJsZSB0aGUgRE1BICovCisJZG1hX3JlZyA9IChlcG51bSA8PCA0KSB8IERNQV9FTkEgfCBJTlRfRU5BOworCWJmaW5fd3JpdGUxNihVU0JfRE1BX1JFRyhlcG51bSwgVVNCX0RNQXhfQ1RSTCksIGRtYV9yZWcpOworCVNTWU5DKCk7CisKKwkvKiBXYWl0IGZvciBjb21wZWxldGUgKi8KKwl3aGlsZSAoIShiZmluX3JlYWRfVVNCX0RNQV9JTlRFUlJVUFQoKSAmICgxIDw8IGVwbnVtKSkpCisJCWNwdV9yZWxheCgpOworCisJLyogYWNrbm93bGVkZ2UgZG1hIGludGVycnVwdCAqLworCWJmaW5fd3JpdGVfVVNCX0RNQV9JTlRFUlJVUFQoMSA8PCBlcG51bSk7CisJU1NZTkMoKTsKKworCS8qIFJlc2V0IERNQSAqLworCWJmaW5fd3JpdGUxNihVU0JfRE1BX1JFRyhlcG51bSwgVVNCX0RNQXhfQ1RSTCksIDApOworCVNTWU5DKCk7CisjZWxzZQorCWlmICh1bmxpa2VseSgodW5zaWduZWQgbG9uZylkc3QgJiAweDAxKSkKKwkJaW5zd184KCh1bnNpZ25lZCBsb25nKWZpZm8sIGRzdCwKKwkJCWxlbiAmIDB4MDEgPyAobGVuID4+IDEpICsgMSA6IGxlbiA+PiAxKTsKKwllbHNlCisJCWluc3coKHVuc2lnbmVkIGxvbmcpZmlmbywgZHN0LAorCQkJbGVuICYgMHgwMSA/IChsZW4gPj4gMSkgKyAxIDogbGVuID4+IDEpOworI2VuZGlmCisKKwlkdW1wX2ZpZm9fZGF0YShkc3QsIGxlbik7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBibGFja2Zpbl9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqX19oY2kpCit7CisJdW5zaWduZWQgbG9uZwlmbGFnczsKKwlpcnFyZXR1cm5fdAlyZXR2YWwgPSBJUlFfTk9ORTsKKwlzdHJ1Y3QgbXVzYgkqbXVzYiA9IF9faGNpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJm11c2ItPmxvY2ssIGZsYWdzKTsKKworCW11c2ItPmludF91c2IgPSBtdXNiX3JlYWRiKG11c2ItPm1yZWdzLCBNVVNCX0lOVFJVU0IpOworCW11c2ItPmludF90eCA9IG11c2JfcmVhZHcobXVzYi0+bXJlZ3MsIE1VU0JfSU5UUlRYKTsKKwltdXNiLT5pbnRfcnggPSBtdXNiX3JlYWR3KG11c2ItPm1yZWdzLCBNVVNCX0lOVFJSWCk7CisKKwlpZiAobXVzYi0+aW50X3VzYiB8fCBtdXNiLT5pbnRfdHggfHwgbXVzYi0+aW50X3J4KSB7CisJCW11c2Jfd3JpdGViKG11c2ItPm1yZWdzLCBNVVNCX0lOVFJVU0IsIG11c2ItPmludF91c2IpOworCQltdXNiX3dyaXRldyhtdXNiLT5tcmVncywgTVVTQl9JTlRSVFgsIG11c2ItPmludF90eCk7CisJCW11c2Jfd3JpdGV3KG11c2ItPm1yZWdzLCBNVVNCX0lOVFJSWCwgbXVzYi0+aW50X3J4KTsKKwkJcmV0dmFsID0gbXVzYl9pbnRlcnJ1cHQobXVzYik7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbXVzYi0+bG9jaywgZmxhZ3MpOworCisJLyogUkVWSVNJVCB3ZSBzb21ldGltZXMgZ2V0IHNwdXJpb3VzIElSUXMgb24gZ19lcDAKKwkgKiBub3QgY2xlYXIgd2h5Li4uIGZhbGwgaW4gQkY1NHggdG9vLgorCSAqLworCWlmIChyZXR2YWwgIT0gSVJRX0hBTkRMRUQpCisJCURCRyg1LCAic3B1cmlvdXM/XG4iKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIHZvaWQgbXVzYl9jb25uX3RpbWVyX2hhbmRsZXIodW5zaWduZWQgbG9uZyBfbXVzYikKK3sKKwlzdHJ1Y3QgbXVzYiAqbXVzYiA9ICh2b2lkICopX211c2I7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1MTYgdmFsOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJm11c2ItPmxvY2ssIGZsYWdzKTsKKwlzd2l0Y2ggKG11c2ItPnhjZWl2LnN0YXRlKSB7CisJY2FzZSBPVEdfU1RBVEVfQV9JRExFOgorCWNhc2UgT1RHX1NUQVRFX0FfV0FJVF9CQ09OOgorCQkvKiBTdGFydCBhIG5ldyBzZXNzaW9uICovCisJCXZhbCA9IG11c2JfcmVhZHcobXVzYi0+bXJlZ3MsIE1VU0JfREVWQ1RMKTsKKwkJdmFsIHw9IE1VU0JfREVWQ1RMX1NFU1NJT047CisJCW11c2Jfd3JpdGV3KG11c2ItPm1yZWdzLCBNVVNCX0RFVkNUTCwgdmFsKTsKKworCQl2YWwgPSBtdXNiX3JlYWR3KG11c2ItPm1yZWdzLCBNVVNCX0RFVkNUTCk7CisJCWlmICghKHZhbCAmIE1VU0JfREVWQ1RMX0JERVZJQ0UpKSB7CisJCQlncGlvX3NldF92YWx1ZShtdXNiLT5jb25maWctPmdwaW9fdnJzZWwsIDEpOworCQkJbXVzYi0+eGNlaXYuc3RhdGUgPSBPVEdfU1RBVEVfQV9XQUlUX0JDT047CisJCX0gZWxzZSB7CisJCQlncGlvX3NldF92YWx1ZShtdXNiLT5jb25maWctPmdwaW9fdnJzZWwsIDApOworCisJCQkvKiBJZ25vcmUgVkJVU0VSUk9SIGFuZCBTVVNQRU5EIElSUSAqLworCQkJdmFsID0gbXVzYl9yZWFkYihtdXNiLT5tcmVncywgTVVTQl9JTlRSVVNCRSk7CisJCQl2YWwgJj0gfk1VU0JfSU5UUl9WQlVTRVJST1I7CisJCQltdXNiX3dyaXRlYihtdXNiLT5tcmVncywgTVVTQl9JTlRSVVNCRSwgdmFsKTsKKworCQkJdmFsID0gTVVTQl9JTlRSX1NVU1BFTkQgfCBNVVNCX0lOVFJfVkJVU0VSUk9SOworCQkJbXVzYl93cml0ZWIobXVzYi0+bXJlZ3MsIE1VU0JfSU5UUlVTQiwgdmFsKTsKKworCQkJdmFsID0gTVVTQl9QT1dFUl9IU0VOQUI7CisJCQltdXNiX3dyaXRlYihtdXNiLT5tcmVncywgTVVTQl9QT1dFUiwgdmFsKTsKKwkJfQorCQltb2RfdGltZXIoJm11c2JfY29ubl90aW1lciwgamlmZmllcyArIFRJTUVSX0RFTEFZKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlEQkcoMSwgIiVzIHN0YXRlIG5vdCBoYW5kbGVkXG4iLCBvdGdfc3RhdGVfc3RyaW5nKG11c2IpKTsKKwkJYnJlYWs7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm11c2ItPmxvY2ssIGZsYWdzKTsKKworCURCRyg0LCAic3RhdGUgaXMgJXNcbiIsIG90Z19zdGF0ZV9zdHJpbmcobXVzYikpOworfQorCit2b2lkIG11c2JfcGxhdGZvcm1fZW5hYmxlKHN0cnVjdCBtdXNiICptdXNiKQoreworCWlmIChpc19ob3N0X2VuYWJsZWQobXVzYikpIHsKKwkJbW9kX3RpbWVyKCZtdXNiX2Nvbm5fdGltZXIsIGppZmZpZXMgKyBUSU1FUl9ERUxBWSk7CisJCW11c2ItPmFfd2FpdF9iY29uID0gVElNRVJfREVMQVk7CisJfQorfQorCit2b2lkIG11c2JfcGxhdGZvcm1fZGlzYWJsZShzdHJ1Y3QgbXVzYiAqbXVzYikKK3sKK30KKworc3RhdGljIHZvaWQgYmZpbl92YnVzX3Bvd2VyKHN0cnVjdCBtdXNiICptdXNiLCBpbnQgaXNfb24sIGludCBzbGVlcGluZykKK3sKK30KKworc3RhdGljIHZvaWQgYmZpbl9zZXRfdmJ1cyhzdHJ1Y3QgbXVzYiAqbXVzYiwgaW50IGlzX29uKQoreworCWlmIChpc19vbikKKwkJZ3Bpb19zZXRfdmFsdWUobXVzYi0+Y29uZmlnLT5ncGlvX3Zyc2VsLCAxKTsKKwllbHNlCisJCWdwaW9fc2V0X3ZhbHVlKG11c2ItPmNvbmZpZy0+Z3Bpb192cnNlbCwgMCk7CisKKwlEQkcoMSwgIlZCVVMgJXMsIGRldmN0bCAlMDJ4ICIKKwkJLyogb3RnICUzeCBjb25mICUwOHggcHJjbSAlMDh4ICovICJcbiIsCisJCW90Z19zdGF0ZV9zdHJpbmcobXVzYiksCisJCW11c2JfcmVhZGIobXVzYi0+bXJlZ3MsIE1VU0JfREVWQ1RMKSk7Cit9CisKK3N0YXRpYyBpbnQgYmZpbl9zZXRfcG93ZXIoc3RydWN0IG90Z190cmFuc2NlaXZlciAqeCwgdW5zaWduZWQgbUEpCit7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgbXVzYl9wbGF0Zm9ybV90cnlfaWRsZShzdHJ1Y3QgbXVzYiAqbXVzYiwgdW5zaWduZWQgbG9uZyB0aW1lb3V0KQoreworCWlmIChpc19ob3N0X2VuYWJsZWQobXVzYikpCisJCW1vZF90aW1lcigmbXVzYl9jb25uX3RpbWVyLCBqaWZmaWVzICsgVElNRVJfREVMQVkpOworfQorCitpbnQgbXVzYl9wbGF0Zm9ybV9nZXRfdmJ1c19zdGF0dXMoc3RydWN0IG11c2IgKm11c2IpCit7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgbXVzYl9wbGF0Zm9ybV9zZXRfbW9kZShzdHJ1Y3QgbXVzYiAqbXVzYiwgdTggbXVzYl9tb2RlKQoreworfQorCitpbnQgX19pbml0IG11c2JfcGxhdGZvcm1faW5pdChzdHJ1Y3QgbXVzYiAqbXVzYikKK3sKKworCS8qCisJICogUmV2IDEuMCBCRjU0OSBFWi1LSVRzIHJlcXVpcmUgUEU3IHRvIGJlIGhpZ2ggZm9yIGJvdGggREVWSUNFCisJICogYW5kIE9URyBIT1NUIG1vZGVzLCB3aGlsZSByZXYgMS4xIGFuZCBncmVhdGVyIHJlcXVpcmUgUEU3IHRvCisJICogYmUgbG93IGZvciBERVZJQ0UgbW9kZSBhbmQgaGlnaCBmb3IgSE9TVCBtb2RlLiBXZSBzZXQgaXQgaGlnaAorCSAqIGhlcmUgYmVjYXVzZSB3ZSBhcmUgaW4gaG9zdCBtb2RlCisJICovCisKKwlpZiAoZ3Bpb19yZXF1ZXN0KG11c2ItPmNvbmZpZy0+Z3Bpb192cnNlbCwgIlVTQl9WUlNFTCIpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiRmFpbGVkIHJvIHJlcXVlc3QgVVNCX1ZSU0VMIEdQSU9fJWQgXG4iLAorCQkJbXVzYi0+Y29uZmlnLT5ncGlvX3Zyc2VsKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCWdwaW9fZGlyZWN0aW9uX291dHB1dChtdXNiLT5jb25maWctPmdwaW9fdnJzZWwsIDApOworCisJaWYgKEFOT01BTFlfMDUwMDAzNDYpIHsKKwkJYmZpbl93cml0ZV9VU0JfQVBIWV9DQUxJQihBTk9NQUxZXzA1MDAwMzQ2X3ZhbHVlKTsKKwkJU1NZTkMoKTsKKwl9CisKKwlpZiAoQU5PTUFMWV8wNTAwMDM0NykgeworCQliZmluX3dyaXRlX1VTQl9BUEhZX0NOVFJMKDB4MCk7CisJCVNTWU5DKCk7CisJfQorCisJLyogVE9ETworCSAqIFNldCBTSUMtSVZHIHJlZ2lzdGVyCisJICovCisKKwkvKiBDb25maWd1cmUgUExMIG9zY2lsbGF0b3IgcmVnaXN0ZXIgKi8KKwliZmluX3dyaXRlX1VTQl9QTExPU0NfQ1RSTCgweDMwYTgpOworCVNTWU5DKCk7CisKKwliZmluX3dyaXRlX1VTQl9TUlBfQ0xLRElWKChnZXRfc2NsaygpLzEwMDApIC8gMzIgLSAxKTsKKwlTU1lOQygpOworCisJYmZpbl93cml0ZV9VU0JfRVBfTkkwX1JYTUFYUCg2NCk7CisJU1NZTkMoKTsKKworCWJmaW5fd3JpdGVfVVNCX0VQX05JMF9UWE1BWFAoNjQpOworCVNTWU5DKCk7CisKKwkvKiBSb3V0ZSBJTlRSVVNCL0lOVFJfUlgvSU5UUl9UWCB0byBVU0JfSU5UMCovCisJYmZpbl93cml0ZV9VU0JfR0xPQklOVFIoMHg3KTsKKwlTU1lOQygpOworCisJYmZpbl93cml0ZV9VU0JfR0xPQkFMX0NUTChHTE9CQUxfRU5BIHwgRVAxX1RYX0VOQSB8IEVQMl9UWF9FTkEgfAorCQkJCUVQM19UWF9FTkEgfCBFUDRfVFhfRU5BIHwgRVA1X1RYX0VOQSB8CisJCQkJRVA2X1RYX0VOQSB8IEVQN19UWF9FTkEgfCBFUDFfUlhfRU5BIHwKKwkJCQlFUDJfUlhfRU5BIHwgRVAzX1JYX0VOQSB8IEVQNF9SWF9FTkEgfAorCQkJCUVQNV9SWF9FTkEgfCBFUDZfUlhfRU5BIHwgRVA3X1JYX0VOQSk7CisJU1NZTkMoKTsKKworCWlmIChpc19ob3N0X2VuYWJsZWQobXVzYikpIHsKKwkJbXVzYi0+Ym9hcmRfc2V0X3ZidXMgPSBiZmluX3NldF92YnVzOworCQlzZXR1cF90aW1lcigmbXVzYl9jb25uX3RpbWVyLAorCQkJbXVzYl9jb25uX3RpbWVyX2hhbmRsZXIsICh1bnNpZ25lZCBsb25nKSBtdXNiKTsKKwl9CisJaWYgKGlzX3BlcmlwaGVyYWxfZW5hYmxlZChtdXNiKSkKKwkJbXVzYi0+eGNlaXYuc2V0X3Bvd2VyID0gYmZpbl9zZXRfcG93ZXI7CisKKwltdXNiLT5pc3IgPSBibGFja2Zpbl9pbnRlcnJ1cHQ7CisKKwlyZXR1cm4gMDsKK30KKworaW50IG11c2JfcGxhdGZvcm1fc3VzcGVuZChzdHJ1Y3QgbXVzYiAqbXVzYikKK3sKKwlyZXR1cm4gMDsKK30KKworaW50IG11c2JfcGxhdGZvcm1fcmVzdW1lKHN0cnVjdCBtdXNiICptdXNiKQoreworCXJldHVybiAwOworfQorCisKK2ludCBtdXNiX3BsYXRmb3JtX2V4aXQoc3RydWN0IG11c2IgKm11c2IpCit7CisKKwliZmluX3ZidXNfcG93ZXIobXVzYiwgMCAvKm9mZiovLCAxKTsKKwlncGlvX2ZyZWUobXVzYi0+Y29uZmlnLT5ncGlvX3Zyc2VsKTsKKwltdXNiX3BsYXRmb3JtX3N1c3BlbmQobXVzYik7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL211c2IvYmxhY2tmaW4uaCBiL2RyaXZlcnMvdXNiL211c2IvYmxhY2tmaW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjQwYzFlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy91c2IvbXVzYi9ibGFja2Zpbi5oCkBAIC0wLDAgKzEsNTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgYnkgQW5hbG9nIERldmljZXMsIEluYy4KKyAqCisgKiBUaGUgSW52ZW50cmEgQ29udHJvbGxlciBEcml2ZXIgZm9yIExpbnV4IGlzIGZyZWUgc29mdHdhcmU7IHlvdQorICogY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24uCisgKi8KKworI2lmbmRlZiBfX01VU0JfQkxBQ0tGSU5fSF9fCisjZGVmaW5lIF9fTVVTQl9CTEFDS0ZJTl9IX18KKworLyoKKyAqIEJsYWNrZmluIHNwZWNpZmljIGRlZmluaXRpb25zCisgKi8KKworI3VuZGVmIERVTVBfRklGT19EQVRBCisjaWZkZWYgRFVNUF9GSUZPX0RBVEEKK3N0YXRpYyB2b2lkIGR1bXBfZmlmb19kYXRhKHU4ICpidWYsIHUxNiBsZW4pCit7CisJdTggKnRtcCA9IGJ1ZjsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworCQlpZiAoIShpICUgMTYpICYmIGkpCisJCQlwcl9kZWJ1ZygiXG4iKTsKKwkJcHJfZGVidWcoIiUwMnggIiwgKnRtcCsrKTsKKwl9CisJcHJfZGVidWcoIlxuIik7Cit9CisjZWxzZQorI2RlZmluZSBkdW1wX2ZpZm9fZGF0YShidWYsIGxlbikJZG8ge30gd2hpbGUgKDApCisjZW5kaWYKKworI2lmZGVmIENPTkZJR19CRjUyeAorCisjZGVmaW5lIFVTQl9ETUFfQkFTRQkJVVNCX0RNQV9JTlRFUlJVUFQKKyNkZWZpbmUgVVNCX0RNQXhfQ1RSTAkJMHgwNAorI2RlZmluZSBVU0JfRE1BeF9BRERSX0xPVwkweDA4CisjZGVmaW5lIFVTQl9ETUF4X0FERFJfSElHSAkweDBDCisjZGVmaW5lIFVTQl9ETUF4X0NPVU5UX0xPVwkweDEwCisjZGVmaW5lIFVTQl9ETUF4X0NPVU5UX0hJR0gJMHgxNAorCisjZGVmaW5lIFVTQl9ETUFfUkVHKGVwLCByZWcpCShVU0JfRE1BX0JBU0UgKyAweDIwICogZXAgKyByZWcpCisjZW5kaWYKKworLyogQWxtb3N0IDEgc2Vjb25kICovCisjZGVmaW5lIFRJTUVSX0RFTEFZCSgxICogSFopCisKK3N0YXRpYyBzdHJ1Y3QgdGltZXJfbGlzdCBtdXNiX2Nvbm5fdGltZXI7CisKKyNlbmRpZgkvKiBfX01VU0JfQkxBQ0tGSU5fSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9tdXNiL2RhdmluY2kuYyBiL2RyaXZlcnMvdXNiL211c2IvZGF2aW5jaS5jCmluZGV4IGRmYjNiY2IuLjBkNTY2ZGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL211c2IvZGF2aW5jaS5jCisrKyBiL2RyaXZlcnMvdXNiL211c2IvZGF2aW5jaS5jCkBAIC0zMiw5ICszMiw5IEBACiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAKLSNpbmNsdWRlIDxhc20vYXJjaC9oYXJkd2FyZS5oPgotI2luY2x1ZGUgPGFzbS9hcmNoL21lbW9yeS5oPgotI2luY2x1ZGUgPGFzbS9hcmNoL2dwaW8uaD4KKyNpbmNsdWRlIDxtYWNoL2FyY2gvaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxtYWNoL2FyY2gvbWVtb3J5Lmg+CisjaW5jbHVkZSA8bWFjaC9hcmNoL2dwaW8uaD4KICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgogCiAjaW5jbHVkZSAibXVzYl9jb3JlLmgiCkBAIC0zNjQsNiArMzY0LDE4IEBACiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCitpbnQgbXVzYl9wbGF0Zm9ybV9zZXRfbW9kZShzdHJ1Y3QgbXVzYiAqbXVzYiwgdTggbW9kZSkKK3sKKwkvKiBFVk0gY2FuJ3QgZG8gdGhpcyAocmlnaHQ/KSAqLworCXJldHVybiAtRUlPOworfQorCitpbnQgbXVzYl9wbGF0Zm9ybV9zZXRfbW9kZShzdHJ1Y3QgbXVzYiAqbXVzYiwgdTggbW9kZSkKK3sKKyAgICAgICAvKiBFVk0gY2FuJ3QgZG8gdGhpcyAocmlnaHQ/KSAqLworICAgICAgIHJldHVybiAtRUlPOworfQorCiBpbnQgX19pbml0IG11c2JfcGxhdGZvcm1faW5pdChzdHJ1Y3QgbXVzYiAqbXVzYikKIHsKIAl2b2lkIF9faW9tZW0JKnRpYmFzZSA9IG11c2ItPmN0cmxfYmFzZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL211c2IvbXVzYl9jb3JlLmMgYi9kcml2ZXJzL3VzYi9tdXNiL211c2JfY29yZS5jCmluZGV4IDUyODBkYmEuLjZjN2ZhYWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL211c2IvbXVzYl9jb3JlLmMKKysrIGIvZHJpdmVycy91c2IvbXVzYi9tdXNiX2NvcmUuYwpAQCAtMTQ4LDcgKzE0OCw4IEBACiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKLSNpZm5kZWYgQ09ORklHX1VTQl9UVVNCNjAxMAorI2lmICFkZWZpbmVkKENPTkZJR19VU0JfVFVTQjYwMTApICYmICFkZWZpbmVkKENPTkZJR19CTEFDS0ZJTikKKwogLyoKICAqIExvYWQgYW4gZW5kcG9pbnQncyBGSUZPCiAgKi8KQEAgLTExMjQsMjUgKzExMjUsMjUgQEAKICNlbmRpZgogCXN3aXRjaCAoY2ZnLT5zdHlsZSkgewogCWNhc2UgRklGT19UWDoKLQkJbXVzYl93cml0ZWIobWJhc2UsIE1VU0JfVFhGSUZPU1osIGNfc2l6ZSk7Ci0JCW11c2Jfd3JpdGV3KG1iYXNlLCBNVVNCX1RYRklGT0FERCwgY19vZmYpOworCQltdXNiX3dyaXRlX3R4Zmlmb3N6KG1iYXNlLCBjX3NpemUpOworCQltdXNiX3dyaXRlX3R4Zmlmb2FkZChtYmFzZSwgY19vZmYpOwogCQlod19lcC0+dHhfZG91YmxlX2J1ZmZlcmVkID0gISEoY19zaXplICYgTVVTQl9GSUZPU1pfRFBCKTsKIAkJaHdfZXAtPm1heF9wYWNrZXRfc3pfdHggPSBtYXhwYWNrZXQ7CiAJCWJyZWFrOwogCWNhc2UgRklGT19SWDoKLQkJbXVzYl93cml0ZWIobWJhc2UsIE1VU0JfUlhGSUZPU1osIGNfc2l6ZSk7Ci0JCW11c2Jfd3JpdGV3KG1iYXNlLCBNVVNCX1JYRklGT0FERCwgY19vZmYpOworCQltdXNiX3dyaXRlX3J4Zmlmb3N6KG1iYXNlLCBjX3NpemUpOworCQltdXNiX3dyaXRlX3J4Zmlmb2FkZChtYmFzZSwgY19vZmYpOwogCQlod19lcC0+cnhfZG91YmxlX2J1ZmZlcmVkID0gISEoY19zaXplICYgTVVTQl9GSUZPU1pfRFBCKTsKIAkJaHdfZXAtPm1heF9wYWNrZXRfc3pfcnggPSBtYXhwYWNrZXQ7CiAJCWJyZWFrOwogCWNhc2UgRklGT19SWFRYOgotCQltdXNiX3dyaXRlYihtYmFzZSwgTVVTQl9UWEZJRk9TWiwgY19zaXplKTsKLQkJbXVzYl93cml0ZXcobWJhc2UsIE1VU0JfVFhGSUZPQURELCBjX29mZik7CisJCW11c2Jfd3JpdGVfdHhmaWZvc3oobWJhc2UsIGNfc2l6ZSk7CisJCW11c2Jfd3JpdGVfdHhmaWZvYWRkKG1iYXNlLCBjX29mZik7CiAJCWh3X2VwLT5yeF9kb3VibGVfYnVmZmVyZWQgPSAhIShjX3NpemUgJiBNVVNCX0ZJRk9TWl9EUEIpOwogCQlod19lcC0+bWF4X3BhY2tldF9zel9yeCA9IG1heHBhY2tldDsKIAotCQltdXNiX3dyaXRlYihtYmFzZSwgTVVTQl9SWEZJRk9TWiwgY19zaXplKTsKLQkJbXVzYl93cml0ZXcobWJhc2UsIE1VU0JfUlhGSUZPQURELCBjX29mZik7CisJCW11c2Jfd3JpdGVfcnhmaWZvc3oobWJhc2UsIGNfc2l6ZSk7CisJCW11c2Jfd3JpdGVfcnhmaWZvYWRkKG1iYXNlLCBjX29mZik7CiAJCWh3X2VwLT50eF9kb3VibGVfYnVmZmVyZWQgPSBod19lcC0+cnhfZG91YmxlX2J1ZmZlcmVkOwogCQlod19lcC0+bWF4X3BhY2tldF9zel90eCA9IG1heHBhY2tldDsKIApAQCAtMTIxMiw3ICsxMjEzLDcgQEAKIAkJaWYgKGVwbiA+PSBtdXNiLT5jb25maWctPm51bV9lcHMpIHsKIAkJCXByX2RlYnVnKCIlczogaW52YWxpZCBlcCAlZFxuIiwKIAkJCQkJbXVzYl9kcml2ZXJfbmFtZSwgZXBuKTsKLQkJCWNvbnRpbnVlOworCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KIAkJb2Zmc2V0ID0gZmlmb19zZXR1cChtdXNiLCBod19lcCArIGVwbiwgY2ZnKyssIG9mZnNldCk7CiAJCWlmIChvZmZzZXQgPCAwKSB7CkBAIC0xMjQ2LDkgKzEyNDcsMTAgQEAKICAqLwogc3RhdGljIGludCBfX2luaXQgZXBfY29uZmlnX2Zyb21faHcoc3RydWN0IG11c2IgKm11c2IpCiB7Ci0JdTggZXBudW0gPSAwLCByZWc7CisJdTggZXBudW0gPSAwOwogCXN0cnVjdCBtdXNiX2h3X2VwICpod19lcDsKIAl2b2lkICptYmFzZSA9IG11c2ItPm1yZWdzOworCWludCByZXQgPSAwOwogCiAJREJHKDIsICI8PT0gc3RhdGljIHNpbGljb24gZXAgY29uZmlnXG4iKTsKIApAQCAtMTI1OCwyNiArMTI2MCw5IEBACiAJCW11c2JfZXBfc2VsZWN0KG1iYXNlLCBlcG51bSk7CiAJCWh3X2VwID0gbXVzYi0+ZW5kcG9pbnRzICsgZXBudW07CiAKLQkJLyogcmVhZCBmcm9tIGNvcmUgdXNpbmcgaW5kZXhlZCBtb2RlbCAqLwotCQlyZWcgPSBtdXNiX3JlYWRiKGh3X2VwLT5yZWdzLCAweDEwICsgTVVTQl9GSUZPU0laRSk7Ci0JCWlmICghcmVnKSB7Ci0JCQkvKiAwJ3MgcmV0dXJuZWQgd2hlbiBubyBtb3JlIGVuZHBvaW50cyAqLworCQlyZXQgPSBtdXNiX3JlYWRfZmlmb3NpemUobXVzYiwgaHdfZXAsIGVwbnVtKTsKKwkJaWYgKHJldCA8IDApCiAJCQlicmVhazsKLQkJfQotCQltdXNiLT5ucl9lbmRwb2ludHMrKzsKLQkJbXVzYi0+ZXBtYXNrIHw9ICgxIDw8IGVwbnVtKTsKLQotCQlod19lcC0+bWF4X3BhY2tldF9zel90eCA9IDEgPDwgKHJlZyAmIDB4MGYpOwotCi0JCS8qIHNoYXJlZCBUWC9SWCBGSUZPPyAqLwotCQlpZiAoKHJlZyAmIDB4ZjApID09IDB4ZjApIHsKLQkJCWh3X2VwLT5tYXhfcGFja2V0X3N6X3J4ID0gaHdfZXAtPm1heF9wYWNrZXRfc3pfdHg7Ci0JCQlod19lcC0+aXNfc2hhcmVkX2ZpZm8gPSB0cnVlOwotCQkJY29udGludWU7Ci0JCX0gZWxzZSB7Ci0JCQlod19lcC0+bWF4X3BhY2tldF9zel9yeCA9IDEgPDwgKChyZWcgJiAweGYwKSA+PiA0KTsKLQkJCWh3X2VwLT5pc19zaGFyZWRfZmlmbyA9IGZhbHNlOwotCQl9CiAKIAkJLyogRklYTUUgc2V0IHVwIGh3X2VwLT57cngsdHh9X2RvdWJsZV9idWZmZXJlZCAqLwogCkBAIC0xMzI2LDcgKzEzMTEsNyBAQAogCiAJLyogbG9nIGNvcmUgb3B0aW9ucyAocmVhZCB1c2luZyBpbmRleGVkIG1vZGVsKSAqLwogCW11c2JfZXBfc2VsZWN0KG1iYXNlLCAwKTsKLQlyZWcgPSBtdXNiX3JlYWRiKG1iYXNlLCAweDEwICsgTVVTQl9DT05GSUdEQVRBKTsKKwlyZWcgPSBtdXNiX3JlYWRfY29uZmlnZGF0YShtYmFzZSk7CiAKIAlzdHJjcHkoYUluZm8sIChyZWcgJiBNVVNCX0NPTkZJR0RBVEFfVVRNSURXKSA/ICJVVE1JLTE2IiA6ICJVVE1JLTgiKTsKIAlpZiAocmVnICYgTVVTQl9DT05GSUdEQVRBX0RZTkZJRk8pCkBAIC0xMzkxLDcgKzEzNzYsNyBAQAogCX0KIAogCS8qIGxvZyByZWxlYXNlIGluZm8gKi8KLQlod3ZlcnMgPSBtdXNiX3JlYWR3KG1iYXNlLCBNVVNCX0hXVkVSUyk7CisJaHd2ZXJzID0gbXVzYl9yZWFkX2h3dmVycyhtYmFzZSk7CiAJcmV2X21ham9yID0gKGh3dmVycyA+PiAxMCkgJiAweDFmOwogCXJldl9taW5vciA9IGh3dmVycyAmIDB4M2ZmOwogCXNucHJpbnRmKGFSZXZpc2lvbiwgMzIsICIlZC4lZCVzIiwgcmV2X21ham9yLApAQCAtMTQwMCw4ICsxMzg1LDcgQEAKIAkJCW11c2JfZHJpdmVyX25hbWUsIHR5cGUsIGFSZXZpc2lvbiwgYURhdGUpOwogCiAJLyogY29uZmlndXJlIGVwMCAqLwotCW11c2ItPmVuZHBvaW50c1swXS5tYXhfcGFja2V0X3N6X3R4ID0gTVVTQl9FUDBfRklGT1NJWkU7Ci0JbXVzYi0+ZW5kcG9pbnRzWzBdLm1heF9wYWNrZXRfc3pfcnggPSBNVVNCX0VQMF9GSUZPU0laRTsKKwltdXNiX2NvbmZpZ3VyZV9lcDAobXVzYik7CiAKIAkvKiBkaXNjb3ZlciBlbmRwb2ludCBjb25maWd1cmF0aW9uICovCiAJbXVzYi0+bnJfZW5kcG9pbnRzID0gMTsKQEAgLTE0NDUsNyArMTQyOSw3IEBACiAKIAkJaHdfZXAtPnJlZ3MgPSBNVVNCX0VQX09GRlNFVChpLCAwKSArIG1iYXNlOwogI2lmZGVmIENPTkZJR19VU0JfTVVTQl9IRFJDX0hDRAotCQlod19lcC0+dGFyZ2V0X3JlZ3MgPSBNVVNCX0JVU0NUTF9PRkZTRVQoaSwgMCkgKyBtYmFzZTsKKwkJaHdfZXAtPnRhcmdldF9yZWdzID0gbXVzYl9yZWFkX3RhcmdldF9yZWdfYmFzZShpLCBtYmFzZSk7CiAJCWh3X2VwLT5yeF9yZWluaXQgPSAxOwogCQlod19lcC0+dHhfcmVpbml0ID0gMTsKICNlbmRpZgpAQCAtMTY3MSwxNyArMTY1NSwyMCBAQAogewogCXN0cnVjdCBtdXNiCSptdXNiID0gZGV2X3RvX211c2IoZGV2KTsKIAl1bnNpZ25lZCBsb25nCWZsYWdzOworCWludAkJc3RhdHVzOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJm11c2ItPmxvY2ssIGZsYWdzKTsKLQlpZiAoIXN0cm5jbXAoYnVmLCAiaG9zdCIsIDQpKQotCQltdXNiX3BsYXRmb3JtX3NldF9tb2RlKG11c2IsIE1VU0JfSE9TVCk7Ci0JaWYgKCFzdHJuY21wKGJ1ZiwgInBlcmlwaGVyYWwiLCAxMCkpCi0JCW11c2JfcGxhdGZvcm1fc2V0X21vZGUobXVzYiwgTVVTQl9QRVJJUEhFUkFMKTsKLQlpZiAoIXN0cm5jbXAoYnVmLCAib3RnIiwgMykpCi0JCW11c2JfcGxhdGZvcm1fc2V0X21vZGUobXVzYiwgTVVTQl9PVEcpOworCWlmIChzeXNmc19zdHJlcShidWYsICJob3N0IikpCisJCXN0YXR1cyA9IG11c2JfcGxhdGZvcm1fc2V0X21vZGUobXVzYiwgTVVTQl9IT1NUKTsKKwllbHNlIGlmIChzeXNmc19zdHJlcShidWYsICJwZXJpcGhlcmFsIikpCisJCXN0YXR1cyA9IG11c2JfcGxhdGZvcm1fc2V0X21vZGUobXVzYiwgTVVTQl9QRVJJUEhFUkFMKTsKKwllbHNlIGlmIChzeXNmc19zdHJlcShidWYsICJvdGciKSkKKwkJc3RhdHVzID0gbXVzYl9wbGF0Zm9ybV9zZXRfbW9kZShtdXNiLCBNVVNCX09URyk7CisJZWxzZQorCQlzdGF0dXMgPSAtRUlOVkFMOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm11c2ItPmxvY2ssIGZsYWdzKTsKIAotCXJldHVybiBuOworCXJldHVybiAoc3RhdHVzID09IDApID8gbiA6IHN0YXR1czsKIH0KIHN0YXRpYyBERVZJQ0VfQVRUUihtb2RlLCAwNjQ0LCBtdXNiX21vZGVfc2hvdywgbXVzYl9tb2RlX3N0b3JlKTsKIApAQCAtMTc4MSw3ICsxNzY4LDcgQEAKICNpZmRlZiBDT05GSUdfVVNCX01VU0JfSERSQ19IQ0QKIAlzdHJ1Y3QgdXNiX2hjZAkqaGNkOwogCi0JaGNkID0gdXNiX2NyZWF0ZV9oY2QoJm11c2JfaGNfZHJpdmVyLCBkZXYsIGRldi0+YnVzX2lkKTsKKwloY2QgPSB1c2JfY3JlYXRlX2hjZCgmbXVzYl9oY19kcml2ZXIsIGRldiwgZGV2X25hbWUoZGV2KSk7CiAJaWYgKCFoY2QpCiAJCXJldHVybiBOVUxMOwogCS8qIHVzYmNvcmUgc2V0cyBkZXYtPmRyaXZlcl9kYXRhIHRvIGhjZCwgYW5kIHNvbWV0aW1lcyB1c2VzIHRoYXQuLi4gKi8KQEAgLTE4MTAsNyArMTc5Nyw2IEBACiAJZm9yIChlcG51bSA9IDAsIGVwID0gbXVzYi0+ZW5kcG9pbnRzOwogCQkJZXBudW0gPCBtdXNiLT5jb25maWctPm51bV9lcHM7CiAJCQllcG51bSsrLCBlcCsrKSB7Ci0KIAkJZXAtPm11c2IgPSBtdXNiOwogCQllcC0+ZXBudW0gPSBlcG51bTsKIAl9CkBAIC0xODM4LDcgKzE4MjQsNyBAQAogCW11c2JfZ2FkZ2V0X2NsZWFudXAobXVzYik7CiAjZW5kaWYKIAotCWlmIChtdXNiLT5uSXJxID49IDApIHsKKwlpZiAobXVzYi0+bklycSA+PSAwICYmIG11c2ItPmlycV93YWtlKSB7CiAJCWRpc2FibGVfaXJxX3dha2UobXVzYi0+bklycSk7CiAJCWZyZWVfaXJxKG11c2ItPm5JcnEsIG11c2IpOwogCX0KQEAgLTE5ODQsMTUgKzE5NzAsMTkgQEAKIAlJTklUX1dPUksoJm11c2ItPmlycV93b3JrLCBtdXNiX2lycV93b3JrKTsKIAogCS8qIGF0dGFjaCB0byB0aGUgSVJRICovCi0JaWYgKHJlcXVlc3RfaXJxKG5JcnEsIG11c2ItPmlzciwgMCwgZGV2LT5idXNfaWQsIG11c2IpKSB7CisJaWYgKHJlcXVlc3RfaXJxKG5JcnEsIG11c2ItPmlzciwgMCwgZGV2X25hbWUoZGV2KSwgbXVzYikpIHsKIAkJZGV2X2VycihkZXYsICJyZXF1ZXN0X2lycSAlZCBmYWlsZWQhXG4iLCBuSXJxKTsKIAkJc3RhdHVzID0gLUVOT0RFVjsKIAkJZ290byBmYWlsMjsKIAl9CiAJbXVzYi0+bklycSA9IG5JcnE7CiAvKiBGSVhNRSB0aGlzIGhhbmRsZXMgd2FrZXVwIGlycXMgd3JvbmcgKi8KLQlpZiAoZW5hYmxlX2lycV93YWtlKG5JcnEpID09IDApCisJaWYgKGVuYWJsZV9pcnFfd2FrZShuSXJxKSA9PSAwKSB7CisJCW11c2ItPmlycV93YWtlID0gMTsKIAkJZGV2aWNlX2luaXRfd2FrZXVwKGRldiwgMSk7CisJfSBlbHNlIHsKKwkJbXVzYi0+aXJxX3dha2UgPSAwOworCX0KIAogCXByX2luZm8oIiVzOiBVU0IgJXMgbW9kZSBjb250cm9sbGVyIGF0ICVwIHVzaW5nICVzLCBJUlEgJWRcbiIsCiAJCQltdXNiX2RyaXZlcl9uYW1lLApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbXVzYi9tdXNiX2NvcmUuaCBiL2RyaXZlcnMvdXNiL211c2IvbXVzYl9jb3JlLmgKaW5kZXggODIyMjcyNS4uNjMwOTQ2YSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbXVzYi9tdXNiX2NvcmUuaAorKysgYi9kcml2ZXJzL3VzYi9tdXNiL211c2JfY29yZS5oCkBAIC0xOTEsNyArMTkxLDcgQEAKICAqLwogCiAjaWYgZGVmaW5lZChDT05GSUdfQVJDSF9EQVZJTkNJKSB8fCBkZWZpbmVkKENPTkZJR19BUkNIX09NQVAyNDMwKSBcCi0JCXx8IGRlZmluZWQoQ09ORklHX0FSQ0hfT01BUDM0MzApCisJCXx8IGRlZmluZWQoQ09ORklHX0FSQ0hfT01BUDM0MzApIHx8IGRlZmluZWQoQ09ORklHX0JMQUNLRklOKQogLyogUkVWSVNJVCBpbmRleGVkIGFjY2VzcyBzZWVtZWQgdG8KICAqIG1pc2JlaGF2ZSAob24gRGFWaW5jaSkgZm9yIGF0IGxlYXN0IHBlcmlwaGVyYWwgSU4gLi4uCiAgKi8KQEAgLTM1OSw2ICszNTksNyBAQAogCXN0cnVjdCBvdGdfdHJhbnNjZWl2ZXIJeGNlaXY7CiAKIAlpbnQgbklycTsKKwl1bnNpZ25lZAkJaXJxX3dha2U6MTsKIAogCXN0cnVjdCBtdXNiX2h3X2VwCSBlbmRwb2ludHNbTVVTQl9DX05VTV9FUFNdOwogI2RlZmluZSBjb250cm9sX2VwCQllbmRwb2ludHMKQEAgLTQ0Nyw2ICs0NDgsNzAgQEAKIH0KICNlbmRpZgogCisjaWZkZWYgQ09ORklHX0JMQUNLRklOCitzdGF0aWMgaW5saW5lIGludCBtdXNiX3JlYWRfZmlmb3NpemUoc3RydWN0IG11c2IgKm11c2IsCisJCXN0cnVjdCBtdXNiX2h3X2VwICpod19lcCwgdTggZXBudW0pCit7CisJbXVzYi0+bnJfZW5kcG9pbnRzKys7CisJbXVzYi0+ZXBtYXNrIHw9ICgxIDw8IGVwbnVtKTsKKworCWlmIChlcG51bSA8IDUpIHsKKwkJaHdfZXAtPm1heF9wYWNrZXRfc3pfdHggPSAxMjg7CisJCWh3X2VwLT5tYXhfcGFja2V0X3N6X3J4ID0gMTI4OworCX0gZWxzZSB7CisJCWh3X2VwLT5tYXhfcGFja2V0X3N6X3R4ID0gMTAyNDsKKwkJaHdfZXAtPm1heF9wYWNrZXRfc3pfcnggPSAxMDI0OworCX0KKwlod19lcC0+aXNfc2hhcmVkX2ZpZm8gPSBmYWxzZTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbXVzYl9jb25maWd1cmVfZXAwKHN0cnVjdCBtdXNiICptdXNiKQoreworCW11c2ItPmVuZHBvaW50c1swXS5tYXhfcGFja2V0X3N6X3R4ID0gTVVTQl9FUDBfRklGT1NJWkU7CisJbXVzYi0+ZW5kcG9pbnRzWzBdLm1heF9wYWNrZXRfc3pfcnggPSBNVVNCX0VQMF9GSUZPU0laRTsKKwltdXNiLT5lbmRwb2ludHNbMF0uaXNfc2hhcmVkX2ZpZm8gPSB0cnVlOworfQorCisjZWxzZQorCitzdGF0aWMgaW5saW5lIGludCBtdXNiX3JlYWRfZmlmb3NpemUoc3RydWN0IG11c2IgKm11c2IsCisJCXN0cnVjdCBtdXNiX2h3X2VwICpod19lcCwgdTggZXBudW0pCit7CisJdTggcmVnID0gMDsKKworCS8qIHJlYWQgZnJvbSBjb3JlIHVzaW5nIGluZGV4ZWQgbW9kZWwgKi8KKwlyZWcgPSBtdXNiX3JlYWRiKGh3X2VwLT5yZWdzLCAweDEwICsgTVVTQl9GSUZPU0laRSk7CisJLyogMCdzIHJldHVybmVkIHdoZW4gbm8gbW9yZSBlbmRwb2ludHMgKi8KKwlpZiAoIXJlZykKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwltdXNiLT5ucl9lbmRwb2ludHMrKzsKKwltdXNiLT5lcG1hc2sgfD0gKDEgPDwgZXBudW0pOworCisJaHdfZXAtPm1heF9wYWNrZXRfc3pfdHggPSAxIDw8IChyZWcgJiAweDBmKTsKKworCS8qIHNoYXJlZCBUWC9SWCBGSUZPPyAqLworCWlmICgocmVnICYgMHhmMCkgPT0gMHhmMCkgeworCQlod19lcC0+bWF4X3BhY2tldF9zel9yeCA9IGh3X2VwLT5tYXhfcGFja2V0X3N6X3R4OworCQlod19lcC0+aXNfc2hhcmVkX2ZpZm8gPSB0cnVlOworCQlyZXR1cm4gMDsKKwl9IGVsc2UgeworCQlod19lcC0+bWF4X3BhY2tldF9zel9yeCA9IDEgPDwgKChyZWcgJiAweGYwKSA+PiA0KTsKKwkJaHdfZXAtPmlzX3NoYXJlZF9maWZvID0gZmFsc2U7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtdXNiX2NvbmZpZ3VyZV9lcDAoc3RydWN0IG11c2IgKm11c2IpCit7CisJbXVzYi0+ZW5kcG9pbnRzWzBdLm1heF9wYWNrZXRfc3pfdHggPSBNVVNCX0VQMF9GSUZPU0laRTsKKwltdXNiLT5lbmRwb2ludHNbMF0ubWF4X3BhY2tldF9zel9yeCA9IE1VU0JfRVAwX0ZJRk9TSVpFOworfQorI2VuZGlmIC8qIENPTkZJR19CTEFDS0ZJTiAqLworCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBHbHVlIGl0IHRvZ2V0aGVyICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCkBAIC00NjcsMTYgKzUzMiwxNiBAQAogCiBleHRlcm4gdm9pZCBtdXNiX2hucF9zdG9wKHN0cnVjdCBtdXNiICptdXNiKTsKIAotZXh0ZXJuIHZvaWQgbXVzYl9wbGF0Zm9ybV9zZXRfbW9kZShzdHJ1Y3QgbXVzYiAqbXVzYiwgdTggbXVzYl9tb2RlKTsKK2V4dGVybiBpbnQgbXVzYl9wbGF0Zm9ybV9zZXRfbW9kZShzdHJ1Y3QgbXVzYiAqbXVzYiwgdTggbXVzYl9tb2RlKTsKIAotI2lmIGRlZmluZWQoQ09ORklHX1VTQl9UVVNCNjAxMCkgfHwgXAorI2lmIGRlZmluZWQoQ09ORklHX1VTQl9UVVNCNjAxMCkgfHwgZGVmaW5lZChDT05GSUdfQkxBQ0tGSU4pIHx8IFwKIAlkZWZpbmVkKENPTkZJR19BUkNIX09NQVAyNDMwKSB8fCBkZWZpbmVkKENPTkZJR19BUkNIX09NQVAzNFhYKQogZXh0ZXJuIHZvaWQgbXVzYl9wbGF0Zm9ybV90cnlfaWRsZShzdHJ1Y3QgbXVzYiAqbXVzYiwgdW5zaWduZWQgbG9uZyB0aW1lb3V0KTsKICNlbHNlCiAjZGVmaW5lIG11c2JfcGxhdGZvcm1fdHJ5X2lkbGUoeCwgeSkJCWRvIHt9IHdoaWxlICgwKQogI2VuZGlmCiAKLSNpZmRlZiBDT05GSUdfVVNCX1RVU0I2MDEwCisjaWYgZGVmaW5lZChDT05GSUdfVVNCX1RVU0I2MDEwKSB8fCBkZWZpbmVkKENPTkZJR19CTEFDS0ZJTikKIGV4dGVybiBpbnQgbXVzYl9wbGF0Zm9ybV9nZXRfdmJ1c19zdGF0dXMoc3RydWN0IG11c2IgKm11c2IpOwogI2Vsc2UKICNkZWZpbmUgbXVzYl9wbGF0Zm9ybV9nZXRfdmJ1c19zdGF0dXMoeCkJMApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbXVzYi9tdXNiX2dhZGdldC5jIGIvZHJpdmVycy91c2IvbXVzYi9tdXNiX2dhZGdldC5jCmluZGV4IGQ2YTgwMmMuLjYxOTdkYWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL211c2IvbXVzYl9nYWRnZXQuYworKysgYi9kcml2ZXJzL3VzYi9tdXNiL211c2JfZ2FkZ2V0LmMKQEAgLTE2MzMsNyArMTYzMyw3IEBACiAJbXVzYi0+Zy5zcGVlZCA9IFVTQl9TUEVFRF9VTktOT1dOOwogCiAJLyogdGhpcyAiZ2FkZ2V0IiBhYnN0cmFjdHMvdmlydHVhbGl6ZXMgdGhlIGNvbnRyb2xsZXIgKi8KLQlzdHJjcHkobXVzYi0+Zy5kZXYuYnVzX2lkLCAiZ2FkZ2V0Iik7CisJZGV2X3NldF9uYW1lKCZtdXNiLT5nLmRldiwgImdhZGdldCIpOwogCW11c2ItPmcuZGV2LnBhcmVudCA9IG11c2ItPmNvbnRyb2xsZXI7CiAJbXVzYi0+Zy5kZXYuZG1hX21hc2sgPSBtdXNiLT5jb250cm9sbGVyLT5kbWFfbWFzazsKIAltdXNiLT5nLmRldi5yZWxlYXNlID0gbXVzYl9nYWRnZXRfcmVsZWFzZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL211c2IvbXVzYl9ob3N0LmMgYi9kcml2ZXJzL3VzYi9tdXNiL211c2JfaG9zdC5jCmluZGV4IGNjNjQ0NjIuLjk5ZmE2MTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL211c2IvbXVzYl9ob3N0LmMKKysrIGIvZHJpdmVycy91c2IvbXVzYi9tdXNiX2hvc3QuYwpAQCAtMTEyLDE4ICsxMTIsMjEgQEAKIHsKIAl2b2lkIF9faW9tZW0JKmVwaW8gPSBlcC0+cmVnczsKIAl1MTYJCWNzcjsKKwl1MTYJCWxhc3Rjc3IgPSAwOwogCWludAkJcmV0cmllcyA9IDEwMDA7CiAKIAljc3IgPSBtdXNiX3JlYWR3KGVwaW8sIE1VU0JfVFhDU1IpOwogCXdoaWxlIChjc3IgJiBNVVNCX1RYQ1NSX0ZJRk9OT1RFTVBUWSkgewotCQlEQkcoNSwgIkhvc3QgVFggRklGT05PVEVNUFRZIGNzcjogJTAyeFxuIiwgY3NyKTsKKwkJaWYgKGNzciAhPSBsYXN0Y3NyKQorCQkJREJHKDMsICJIb3N0IFRYIEZJRk9OT1RFTVBUWSBjc3I6ICUwMnhcbiIsIGNzcik7CisJCWxhc3Rjc3IgPSBjc3I7CiAJCWNzciB8PSBNVVNCX1RYQ1NSX0ZMVVNIRklGTzsKIAkJbXVzYl93cml0ZXcoZXBpbywgTVVTQl9UWENTUiwgY3NyKTsKIAkJY3NyID0gbXVzYl9yZWFkdyhlcGlvLCBNVVNCX1RYQ1NSKTsKLQkJaWYgKHJldHJpZXMtLSA8IDEpIHsKLQkJCUVSUigiQ291bGQgbm90IGZsdXNoIGhvc3QgVFggZmlmbzogY3NyOiAlMDR4XG4iLCBjc3IpOworCQlpZiAoV0FSTihyZXRyaWVzLS0gPCAxLAorCQkJCSJDb3VsZCBub3QgZmx1c2ggaG9zdCBUWCVkIGZpZm86IGNzcjogJTA0eFxuIiwKKwkJCQllcC0+ZXBudW0sIGNzcikpCiAJCQlyZXR1cm47Ci0JCX0KIAkJbWRlbGF5KDEpOwogCX0KIH0KQEAgLTI2OCw3ICsyNzEsNyBAQAogX19yZWxlYXNlcyhtdXNiLT5sb2NrKQogX19hY3F1aXJlcyhtdXNiLT5sb2NrKQogewotCURCRygoeyBpbnQgbGV2ZWw7IHN3aXRjaCAodXJiLT5zdGF0dXMpIHsKKwlEQkcoKHsgaW50IGxldmVsOyBzd2l0Y2ggKHN0YXR1cykgewogCQkJCWNhc2UgMDoKIAkJCQkJbGV2ZWwgPSA0OwogCQkJCQlicmVhazsKQEAgLTI4Myw4ICsyODYsOCBAQAogCQkJCQlsZXZlbCA9IDI7CiAJCQkJCWJyZWFrOwogCQkJCX07IGxldmVsOyB9KSwKLQkJCSJjb21wbGV0ZSAlcCAoJWQpLCBkZXYlZCBlcCVkJXMsICVkLyVkXG4iLAotCQkJdXJiLCB1cmItPnN0YXR1cywKKwkJCSJjb21wbGV0ZSAlcCAlcEYgKCVkKSwgZGV2JWQgZXAlZCVzLCAlZC8lZFxuIiwKKwkJCXVyYiwgdXJiLT5jb21wbGV0ZSwgc3RhdHVzLAogCQkJdXNiX3BpcGVkZXZpY2UodXJiLT5waXBlKSwKIAkJCXVzYl9waXBlZW5kcG9pbnQodXJiLT5waXBlKSwKIAkJCXVzYl9waXBlaW4odXJiLT5waXBlKSA/ICJpbiIgOiAib3V0IiwKQEAgLTU5MywxMiArNTk2LDEwIEBACiAKIAkvKiB0YXJnZXQgYWRkciBhbmQgKGZvciBtdWx0aXBvaW50KSBodWIgYWRkci9wb3J0ICovCiAJaWYgKG11c2ItPmlzX211bHRpcG9pbnQpIHsKLQkJbXVzYl93cml0ZWIoZXAtPnRhcmdldF9yZWdzLCBNVVNCX1JYRlVOQ0FERFIsCi0JCQlxaC0+YWRkcl9yZWcpOwotCQltdXNiX3dyaXRlYihlcC0+dGFyZ2V0X3JlZ3MsIE1VU0JfUlhIVUJBRERSLAotCQkJcWgtPmhfYWRkcl9yZWcpOwotCQltdXNiX3dyaXRlYihlcC0+dGFyZ2V0X3JlZ3MsIE1VU0JfUlhIVUJQT1JULAotCQkJcWgtPmhfcG9ydF9yZWcpOworCQltdXNiX3dyaXRlX3J4ZnVuYWRkcihlcC0+dGFyZ2V0X3JlZ3MsIHFoLT5hZGRyX3JlZyk7CisJCW11c2Jfd3JpdGVfcnhodWJhZGRyKGVwLT50YXJnZXRfcmVncywgcWgtPmhfYWRkcl9yZWcpOworCQltdXNiX3dyaXRlX3J4aHVicG9ydChlcC0+dGFyZ2V0X3JlZ3MsIHFoLT5oX3BvcnRfcmVnKTsKKwogCX0gZWxzZQogCQltdXNiX3dyaXRlYihtdXNiLT5tcmVncywgTVVTQl9GQUREUiwgcWgtPmFkZHJfcmVnKTsKIApAQCAtNzEyLDE1ICs3MTMsOSBAQAogCiAJCS8qIHRhcmdldCBhZGRyIGFuZCAoZm9yIG11bHRpcG9pbnQpIGh1YiBhZGRyL3BvcnQgKi8KIAkJaWYgKG11c2ItPmlzX211bHRpcG9pbnQpIHsKLQkJCW11c2Jfd3JpdGViKG1iYXNlLAotCQkJCU1VU0JfQlVTQ1RMX09GRlNFVChlcG51bSwgTVVTQl9UWEZVTkNBRERSKSwKLQkJCQlxaC0+YWRkcl9yZWcpOwotCQkJbXVzYl93cml0ZWIobWJhc2UsCi0JCQkJTVVTQl9CVVNDVExfT0ZGU0VUKGVwbnVtLCBNVVNCX1RYSFVCQUREUiksCi0JCQkJcWgtPmhfYWRkcl9yZWcpOwotCQkJbXVzYl93cml0ZWIobWJhc2UsCi0JCQkJTVVTQl9CVVNDVExfT0ZGU0VUKGVwbnVtLCBNVVNCX1RYSFVCUE9SVCksCi0JCQkJcWgtPmhfcG9ydF9yZWcpOworCQkJbXVzYl93cml0ZV90eGZ1bmFkZHIobWJhc2UsIGVwbnVtLCBxaC0+YWRkcl9yZWcpOworCQkJbXVzYl93cml0ZV90eGh1YmFkZHIobWJhc2UsIGVwbnVtLCBxaC0+aF9hZGRyX3JlZyk7CisJCQltdXNiX3dyaXRlX3R4aHVicG9ydChtYmFzZSwgZXBudW0sIHFoLT5oX3BvcnRfcmVnKTsKIC8qIEZJWE1FIGlmICFlcG51bSwgZG8gdGhlIHNhbWUgZm9yIFJYIC4uLiAqLwogCQl9IGVsc2UKIAkJCW11c2Jfd3JpdGViKG1iYXNlLCBNVVNCX0ZBRERSLCBxaC0+YWRkcl9yZWcpOwpAQCAtOTg4LDggKzk4MywxMCBAQAogCQlpZiAoZmlmb19jb3VudCkgewogCQkJZmlmb19kZXN0ID0gKHU4ICopICh1cmItPnRyYW5zZmVyX2J1ZmZlcgogCQkJCQkrIHVyYi0+YWN0dWFsX2xlbmd0aCk7Ci0JCQlEQkcoMywgIlNlbmRpbmcgJWQgYnl0ZXMgdG8gJXBcbiIsCi0JCQkJCWZpZm9fY291bnQsIGZpZm9fZGVzdCk7CisJCQlEQkcoMywgIlNlbmRpbmcgJWQgYnl0ZSVzIHRvIGVwMCBmaWZvICVwXG4iLAorCQkJCQlmaWZvX2NvdW50LAorCQkJCQkoZmlmb19jb3VudCA9PSAxKSA/ICIiIDogInMiLAorCQkJCQlmaWZvX2Rlc3QpOwogCQkJbXVzYl93cml0ZV9maWZvKGh3X2VwLCBmaWZvX2NvdW50LCBmaWZvX2Rlc3QpOwogCiAJCQl1cmItPmFjdHVhbF9sZW5ndGggKz0gZmlmb19jb3VudDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL211c2IvbXVzYl9pby5oIGIvZHJpdmVycy91c2IvbXVzYi9tdXNiX2lvLmgKaW5kZXggMjIzZjBhNS4uYjA2ZTllZiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbXVzYi9tdXNiX2lvLmgKKysrIGIvZHJpdmVycy91c2IvbXVzYi9tdXNiX2lvLmgKQEAgLTM5LDcgKzM5LDcgQEAKIAogI2lmICFkZWZpbmVkKENPTkZJR19BUk0pICYmICFkZWZpbmVkKENPTkZJR19TVVBFUkgpIFwKIAkmJiAhZGVmaW5lZChDT05GSUdfQVZSMzIpICYmICFkZWZpbmVkKENPTkZJR19QUEMzMikgXAotCSYmICFkZWZpbmVkKENPTkZJR19QUEM2NCkKKwkmJiAhZGVmaW5lZChDT05GSUdfUFBDNjQpICYmICFkZWZpbmVkKENPTkZJR19CTEFDS0ZJTikKIHN0YXRpYyBpbmxpbmUgdm9pZCByZWFkc2woY29uc3Qgdm9pZCBfX2lvbWVtICphZGRyLCB2b2lkICpidWYsIGludCBsZW4pCiAJeyBpbnNsKCh1bnNpZ25lZCBsb25nKWFkZHIsIGJ1ZiwgbGVuKTsgfQogc3RhdGljIGlubGluZSB2b2lkIHJlYWRzdyhjb25zdCB2b2lkIF9faW9tZW0gKmFkZHIsIHZvaWQgKmJ1ZiwgaW50IGxlbikKQEAgLTU2LDYgKzU2LDggQEAKIAogI2VuZGlmCiAKKyNpZm5kZWYgQ09ORklHX0JMQUNLRklOCisKIC8qIE5PVEU6ICB0aGVzZSBvZmZzZXRzIGFyZSBhbGwgaW4gYnl0ZXMgKi8KIAogc3RhdGljIGlubGluZSB1MTYgbXVzYl9yZWFkdyhjb25zdCB2b2lkIF9faW9tZW0gKmFkZHIsIHVuc2lnbmVkIG9mZnNldCkKQEAgLTExNCw0ICsxMTYsMjYgQEAKIAogI2VuZGlmCS8qIENPTkZJR19VU0JfVFVTQjYwMTAgKi8KIAorI2Vsc2UKKworc3RhdGljIGlubGluZSB1OCBtdXNiX3JlYWRiKGNvbnN0IHZvaWQgX19pb21lbSAqYWRkciwgdW5zaWduZWQgb2Zmc2V0KQorCXsgcmV0dXJuICh1OCkgKGJmaW5fcmVhZDE2KGFkZHIgKyBvZmZzZXQpKTsgfQorCitzdGF0aWMgaW5saW5lIHUxNiBtdXNiX3JlYWR3KGNvbnN0IHZvaWQgX19pb21lbSAqYWRkciwgdW5zaWduZWQgb2Zmc2V0KQorCXsgcmV0dXJuIGJmaW5fcmVhZDE2KGFkZHIgKyBvZmZzZXQpOyB9CisKK3N0YXRpYyBpbmxpbmUgdTMyIG11c2JfcmVhZGwoY29uc3Qgdm9pZCBfX2lvbWVtICphZGRyLCB1bnNpZ25lZCBvZmZzZXQpCisJeyByZXR1cm4gKHUzMikgKGJmaW5fcmVhZDE2KGFkZHIgKyBvZmZzZXQpKTsgfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbXVzYl93cml0ZWIodm9pZCBfX2lvbWVtICphZGRyLCB1bnNpZ25lZCBvZmZzZXQsIHU4IGRhdGEpCisJeyBiZmluX3dyaXRlMTYoYWRkciArIG9mZnNldCwgKHUxNikgZGF0YSk7IH0KKworc3RhdGljIGlubGluZSB2b2lkIG11c2Jfd3JpdGV3KHZvaWQgX19pb21lbSAqYWRkciwgdW5zaWduZWQgb2Zmc2V0LCB1MTYgZGF0YSkKKwl7IGJmaW5fd3JpdGUxNihhZGRyICsgb2Zmc2V0LCBkYXRhKTsgfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbXVzYl93cml0ZWwodm9pZCBfX2lvbWVtICphZGRyLCB1bnNpZ25lZCBvZmZzZXQsIHUzMiBkYXRhKQorCXsgYmZpbl93cml0ZTE2KGFkZHIgKyBvZmZzZXQsICh1MTYpIGRhdGEpOyB9CisKKyNlbmRpZiAvKiBDT05GSUdfQkxBQ0tGSU4gKi8KKwogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9tdXNiL211c2JfcmVncy5oIGIvZHJpdmVycy91c2IvbXVzYi9tdXNiX3JlZ3MuaAppbmRleCA5YzIyODY2Li5kZTNiMmYxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9tdXNiL211c2JfcmVncy5oCisrKyBiL2RyaXZlcnMvdXNiL211c2IvbXVzYl9yZWdzLmgKQEAgLTM4LDk3ICszOCw2IEBACiAjZGVmaW5lIE1VU0JfRVAwX0ZJRk9TSVpFCTY0CS8qIFRoaXMgaXMgbm9uLWNvbmZpZ3VyYWJsZSAqLwogCiAvKgotICogQ29tbW9uIFVTQiByZWdpc3RlcnMKLSAqLwotCi0jZGVmaW5lIE1VU0JfRkFERFIJCTB4MDAJLyogOC1iaXQgKi8KLSNkZWZpbmUgTVVTQl9QT1dFUgkJMHgwMQkvKiA4LWJpdCAqLwotCi0jZGVmaW5lIE1VU0JfSU5UUlRYCQkweDAyCS8qIDE2LWJpdCAqLwotI2RlZmluZSBNVVNCX0lOVFJSWAkJMHgwNAotI2RlZmluZSBNVVNCX0lOVFJUWEUJCTB4MDYKLSNkZWZpbmUgTVVTQl9JTlRSUlhFCQkweDA4Ci0jZGVmaW5lIE1VU0JfSU5UUlVTQgkJMHgwQQkvKiA4IGJpdCAqLwotI2RlZmluZSBNVVNCX0lOVFJVU0JFCQkweDBCCS8qIDggYml0ICovCi0jZGVmaW5lIE1VU0JfRlJBTUUJCTB4MEMKLSNkZWZpbmUgTVVTQl9JTkRFWAkJMHgwRQkvKiA4IGJpdCAqLwotI2RlZmluZSBNVVNCX1RFU1RNT0RFCQkweDBGCS8qIDggYml0ICovCi0KLS8qIEdldCBvZmZzZXQgZm9yIGEgZ2l2ZW4gRklGTyBmcm9tIG11c2ItPm1yZWdzICovCi0jaWZkZWYJQ09ORklHX1VTQl9UVVNCNjAxMAotI2RlZmluZSBNVVNCX0ZJRk9fT0ZGU0VUKGVwbnVtKQkoMHgyMDAgKyAoKGVwbnVtKSAqIDB4MjApKQotI2Vsc2UKLSNkZWZpbmUgTVVTQl9GSUZPX09GRlNFVChlcG51bSkJKDB4MjAgKyAoKGVwbnVtKSAqIDQpKQotI2VuZGlmCi0KLS8qCi0gKiBBZGRpdGlvbmFsIENvbnRyb2wgUmVnaXN0ZXJzCi0gKi8KLQotI2RlZmluZSBNVVNCX0RFVkNUTAkJMHg2MAkvKiA4IGJpdCAqLwotCi0vKiBUaGVzZSBhcmUgYWx3YXlzIGNvbnRyb2xsZWQgdGhyb3VnaCB0aGUgSU5ERVggcmVnaXN0ZXIgKi8KLSNkZWZpbmUgTVVTQl9UWEZJRk9TWgkJMHg2MgkvKiA4LWJpdCAoc2VlIG1hc2tzKSAqLwotI2RlZmluZSBNVVNCX1JYRklGT1NaCQkweDYzCS8qIDgtYml0IChzZWUgbWFza3MpICovCi0jZGVmaW5lIE1VU0JfVFhGSUZPQURECQkweDY0CS8qIDE2LWJpdCBvZmZzZXQgc2hpZnRlZCByaWdodCAzICovCi0jZGVmaW5lIE1VU0JfUlhGSUZPQURECQkweDY2CS8qIDE2LWJpdCBvZmZzZXQgc2hpZnRlZCByaWdodCAzICovCi0KLS8qIFJFVklTSVQ6IHZjdHJsL3ZzdGF0dXM6IG9wdGlvbmFsIHZlbmRvciB1dG1pK3BoeSByZWdpc3RlciBhdCAweDY4ICovCi0jZGVmaW5lIE1VU0JfSFdWRVJTCQkweDZDCS8qIDggYml0ICovCi0KLSNkZWZpbmUgTVVTQl9FUElORk8JCTB4NzgJLyogOCBiaXQgKi8KLSNkZWZpbmUgTVVTQl9SQU1JTkZPCQkweDc5CS8qIDggYml0ICovCi0jZGVmaW5lIE1VU0JfTElOS0lORk8JCTB4N2EJLyogOCBiaXQgKi8KLSNkZWZpbmUgTVVTQl9WUExFTgkJMHg3YgkvKiA4IGJpdCAqLwotI2RlZmluZSBNVVNCX0hTX0VPRjEJCTB4N2MJLyogOCBiaXQgKi8KLSNkZWZpbmUgTVVTQl9GU19FT0YxCQkweDdkCS8qIDggYml0ICovCi0jZGVmaW5lIE1VU0JfTFNfRU9GMQkJMHg3ZQkvKiA4IGJpdCAqLwotCi0vKiBPZmZzZXRzIHRvIGVuZHBvaW50IHJlZ2lzdGVycyAqLwotI2RlZmluZSBNVVNCX1RYTUFYUAkJMHgwMAotI2RlZmluZSBNVVNCX1RYQ1NSCQkweDAyCi0jZGVmaW5lIE1VU0JfQ1NSMAkJTVVTQl9UWENTUgkvKiBSZS11c2VkIGZvciBFUDAgKi8KLSNkZWZpbmUgTVVTQl9SWE1BWFAJCTB4MDQKLSNkZWZpbmUgTVVTQl9SWENTUgkJMHgwNgotI2RlZmluZSBNVVNCX1JYQ09VTlQJCTB4MDgKLSNkZWZpbmUgTVVTQl9DT1VOVDAJCU1VU0JfUlhDT1VOVAkvKiBSZS11c2VkIGZvciBFUDAgKi8KLSNkZWZpbmUgTVVTQl9UWFRZUEUJCTB4MEEKLSNkZWZpbmUgTVVTQl9UWVBFMAkJTVVTQl9UWFRZUEUJLyogUmUtdXNlZCBmb3IgRVAwICovCi0jZGVmaW5lIE1VU0JfVFhJTlRFUlZBTAkJMHgwQgotI2RlZmluZSBNVVNCX05BS0xJTUlUMAkJTVVTQl9UWElOVEVSVkFMCS8qIFJlLXVzZWQgZm9yIEVQMCAqLwotI2RlZmluZSBNVVNCX1JYVFlQRQkJMHgwQwotI2RlZmluZSBNVVNCX1JYSU5URVJWQUwJCTB4MEQKLSNkZWZpbmUgTVVTQl9GSUZPU0laRQkJMHgwRgotI2RlZmluZSBNVVNCX0NPTkZJR0RBVEEJCU1VU0JfRklGT1NJWkUJLyogUmUtdXNlZCBmb3IgRVAwICovCi0KLS8qIE9mZnNldHMgdG8gZW5kcG9pbnQgcmVnaXN0ZXJzIGluIGluZGV4ZWQgbW9kZWwgKHVzaW5nIElOREVYIHJlZ2lzdGVyKSAqLwotI2RlZmluZSBNVVNCX0lOREVYRURfT0ZGU0VUKF9lcG51bSwgX29mZnNldCkJXAotCSgweDEwICsgKF9vZmZzZXQpKQotCi0vKiBPZmZzZXRzIHRvIGVuZHBvaW50IHJlZ2lzdGVycyBpbiBmbGF0IG1vZGVscyAqLwotI2RlZmluZSBNVVNCX0ZMQVRfT0ZGU0VUKF9lcG51bSwgX29mZnNldCkJXAotCSgweDEwMCArICgweDEwKihfZXBudW0pKSArIChfb2Zmc2V0KSkKLQotI2lmZGVmIENPTkZJR19VU0JfVFVTQjYwMTAKLS8qIFRVU0I2MDEwIEVQMCBjb25maWd1cmF0aW9uIHJlZ2lzdGVyIGlzIHNwZWNpYWwgKi8KLSNkZWZpbmUgTVVTQl9UVVNCX09GRlNFVChfZXBudW0sIF9vZmZzZXQpCVwKLQkoMHgxMCArIF9vZmZzZXQpCi0jaW5jbHVkZSAidHVzYjYwMTAuaCIJCS8qIE5lZWRlZCAib25seSIgZm9yIFRVU0JfRVAwX0NPTkYgKi8KLSNlbmRpZgotCi0vKiAiYnVzIGNvbnRyb2wiL3RhcmdldCByZWdpc3RlcnMsIGZvciBob3N0IHNpZGUgbXVsdGlwb2ludCAoZXh0ZXJuYWwgaHVicykgKi8KLSNkZWZpbmUgTVVTQl9UWEZVTkNBRERSCQkweDAwCi0jZGVmaW5lIE1VU0JfVFhIVUJBRERSCQkweDAyCi0jZGVmaW5lIE1VU0JfVFhIVUJQT1JUCQkweDAzCi0KLSNkZWZpbmUgTVVTQl9SWEZVTkNBRERSCQkweDA0Ci0jZGVmaW5lIE1VU0JfUlhIVUJBRERSCQkweDA2Ci0jZGVmaW5lIE1VU0JfUlhIVUJQT1JUCQkweDA3Ci0KLSNkZWZpbmUgTVVTQl9CVVNDVExfT0ZGU0VUKF9lcG51bSwgX29mZnNldCkgXAotCSgweDgwICsgKDgqKF9lcG51bSkpICsgKF9vZmZzZXQpKQotCi0vKgogICogTVVTQiBSZWdpc3RlciBiaXRzCiAgKi8KIApAQCAtMjI4LDcgKzEzNyw2IEBACiAKIC8qIFRYQ1NSIGluIFBlcmlwaGVyYWwgYW5kIEhvc3QgbW9kZSAqLwogI2RlZmluZSBNVVNCX1RYQ1NSX0FVVE9TRVQJCTB4ODAwMAotI2RlZmluZSBNVVNCX1RYQ1NSX01PREUJCQkweDIwMDAKICNkZWZpbmUgTVVTQl9UWENTUl9ETUFFTkFCCQkweDEwMDAKICNkZWZpbmUgTVVTQl9UWENTUl9GUkNEQVRBVE9HCQkweDA4MDAKICNkZWZpbmUgTVVTQl9UWENTUl9ETUFNT0RFCQkweDA0MDAKQEAgLTI5Nyw0ICsyMDUsMzA5IEBACiAvKiBIVUJBRERSICovCiAjZGVmaW5lIE1VU0JfSFVCQUREUl9NVUxUSV9UVAkJMHg4MAogCisKKyNpZm5kZWYgQ09ORklHX0JMQUNLRklOCisKKy8qCisgKiBDb21tb24gVVNCIHJlZ2lzdGVycworICovCisKKyNkZWZpbmUgTVVTQl9GQUREUgkJMHgwMAkvKiA4LWJpdCAqLworI2RlZmluZSBNVVNCX1BPV0VSCQkweDAxCS8qIDgtYml0ICovCisKKyNkZWZpbmUgTVVTQl9JTlRSVFgJCTB4MDIJLyogMTYtYml0ICovCisjZGVmaW5lIE1VU0JfSU5UUlJYCQkweDA0CisjZGVmaW5lIE1VU0JfSU5UUlRYRQkJMHgwNgorI2RlZmluZSBNVVNCX0lOVFJSWEUJCTB4MDgKKyNkZWZpbmUgTVVTQl9JTlRSVVNCCQkweDBBCS8qIDggYml0ICovCisjZGVmaW5lIE1VU0JfSU5UUlVTQkUJCTB4MEIJLyogOCBiaXQgKi8KKyNkZWZpbmUgTVVTQl9GUkFNRQkJMHgwQworI2RlZmluZSBNVVNCX0lOREVYCQkweDBFCS8qIDggYml0ICovCisjZGVmaW5lIE1VU0JfVEVTVE1PREUJCTB4MEYJLyogOCBiaXQgKi8KKworLyogR2V0IG9mZnNldCBmb3IgYSBnaXZlbiBGSUZPIGZyb20gbXVzYi0+bXJlZ3MgKi8KKyNpZmRlZglDT05GSUdfVVNCX1RVU0I2MDEwCisjZGVmaW5lIE1VU0JfRklGT19PRkZTRVQoZXBudW0pCSgweDIwMCArICgoZXBudW0pICogMHgyMCkpCisjZWxzZQorI2RlZmluZSBNVVNCX0ZJRk9fT0ZGU0VUKGVwbnVtKQkoMHgyMCArICgoZXBudW0pICogNCkpCisjZW5kaWYKKworLyoKKyAqIEFkZGl0aW9uYWwgQ29udHJvbCBSZWdpc3RlcnMKKyAqLworCisjZGVmaW5lIE1VU0JfREVWQ1RMCQkweDYwCS8qIDggYml0ICovCisKKy8qIFRoZXNlIGFyZSBhbHdheXMgY29udHJvbGxlZCB0aHJvdWdoIHRoZSBJTkRFWCByZWdpc3RlciAqLworI2RlZmluZSBNVVNCX1RYRklGT1NaCQkweDYyCS8qIDgtYml0IChzZWUgbWFza3MpICovCisjZGVmaW5lIE1VU0JfUlhGSUZPU1oJCTB4NjMJLyogOC1iaXQgKHNlZSBtYXNrcykgKi8KKyNkZWZpbmUgTVVTQl9UWEZJRk9BREQJCTB4NjQJLyogMTYtYml0IG9mZnNldCBzaGlmdGVkIHJpZ2h0IDMgKi8KKyNkZWZpbmUgTVVTQl9SWEZJRk9BREQJCTB4NjYJLyogMTYtYml0IG9mZnNldCBzaGlmdGVkIHJpZ2h0IDMgKi8KKworLyogUkVWSVNJVDogdmN0cmwvdnN0YXR1czogb3B0aW9uYWwgdmVuZG9yIHV0bWkrcGh5IHJlZ2lzdGVyIGF0IDB4NjggKi8KKyNkZWZpbmUgTVVTQl9IV1ZFUlMJCTB4NkMJLyogOCBiaXQgKi8KKworI2RlZmluZSBNVVNCX0VQSU5GTwkJMHg3OAkvKiA4IGJpdCAqLworI2RlZmluZSBNVVNCX1JBTUlORk8JCTB4NzkJLyogOCBiaXQgKi8KKyNkZWZpbmUgTVVTQl9MSU5LSU5GTwkJMHg3YQkvKiA4IGJpdCAqLworI2RlZmluZSBNVVNCX1ZQTEVOCQkweDdiCS8qIDggYml0ICovCisjZGVmaW5lIE1VU0JfSFNfRU9GMQkJMHg3YwkvKiA4IGJpdCAqLworI2RlZmluZSBNVVNCX0ZTX0VPRjEJCTB4N2QJLyogOCBiaXQgKi8KKyNkZWZpbmUgTVVTQl9MU19FT0YxCQkweDdlCS8qIDggYml0ICovCisKKy8qIE9mZnNldHMgdG8gZW5kcG9pbnQgcmVnaXN0ZXJzICovCisjZGVmaW5lIE1VU0JfVFhNQVhQCQkweDAwCisjZGVmaW5lIE1VU0JfVFhDU1IJCTB4MDIKKyNkZWZpbmUgTVVTQl9DU1IwCQlNVVNCX1RYQ1NSCS8qIFJlLXVzZWQgZm9yIEVQMCAqLworI2RlZmluZSBNVVNCX1JYTUFYUAkJMHgwNAorI2RlZmluZSBNVVNCX1JYQ1NSCQkweDA2CisjZGVmaW5lIE1VU0JfUlhDT1VOVAkJMHgwOAorI2RlZmluZSBNVVNCX0NPVU5UMAkJTVVTQl9SWENPVU5UCS8qIFJlLXVzZWQgZm9yIEVQMCAqLworI2RlZmluZSBNVVNCX1RYVFlQRQkJMHgwQQorI2RlZmluZSBNVVNCX1RZUEUwCQlNVVNCX1RYVFlQRQkvKiBSZS11c2VkIGZvciBFUDAgKi8KKyNkZWZpbmUgTVVTQl9UWElOVEVSVkFMCQkweDBCCisjZGVmaW5lIE1VU0JfTkFLTElNSVQwCQlNVVNCX1RYSU5URVJWQUwJLyogUmUtdXNlZCBmb3IgRVAwICovCisjZGVmaW5lIE1VU0JfUlhUWVBFCQkweDBDCisjZGVmaW5lIE1VU0JfUlhJTlRFUlZBTAkJMHgwRAorI2RlZmluZSBNVVNCX0ZJRk9TSVpFCQkweDBGCisjZGVmaW5lIE1VU0JfQ09ORklHREFUQQkJTVVTQl9GSUZPU0laRQkvKiBSZS11c2VkIGZvciBFUDAgKi8KKworLyogT2Zmc2V0cyB0byBlbmRwb2ludCByZWdpc3RlcnMgaW4gaW5kZXhlZCBtb2RlbCAodXNpbmcgSU5ERVggcmVnaXN0ZXIpICovCisjZGVmaW5lIE1VU0JfSU5ERVhFRF9PRkZTRVQoX2VwbnVtLCBfb2Zmc2V0KQlcCisJKDB4MTAgKyAoX29mZnNldCkpCisKKy8qIE9mZnNldHMgdG8gZW5kcG9pbnQgcmVnaXN0ZXJzIGluIGZsYXQgbW9kZWxzICovCisjZGVmaW5lIE1VU0JfRkxBVF9PRkZTRVQoX2VwbnVtLCBfb2Zmc2V0KQlcCisJKDB4MTAwICsgKDB4MTAqKF9lcG51bSkpICsgKF9vZmZzZXQpKQorCisjaWZkZWYgQ09ORklHX1VTQl9UVVNCNjAxMAorLyogVFVTQjYwMTAgRVAwIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgaXMgc3BlY2lhbCAqLworI2RlZmluZSBNVVNCX1RVU0JfT0ZGU0VUKF9lcG51bSwgX29mZnNldCkJXAorCSgweDEwICsgX29mZnNldCkKKyNpbmNsdWRlICJ0dXNiNjAxMC5oIgkJLyogTmVlZGVkICJvbmx5IiBmb3IgVFVTQl9FUDBfQ09ORiAqLworI2VuZGlmCisKKyNkZWZpbmUgTVVTQl9UWENTUl9NT0RFCQkJMHgyMDAwCisKKy8qICJidXMgY29udHJvbCIvdGFyZ2V0IHJlZ2lzdGVycywgZm9yIGhvc3Qgc2lkZSBtdWx0aXBvaW50IChleHRlcm5hbCBodWJzKSAqLworI2RlZmluZSBNVVNCX1RYRlVOQ0FERFIJCTB4MDAKKyNkZWZpbmUgTVVTQl9UWEhVQkFERFIJCTB4MDIKKyNkZWZpbmUgTVVTQl9UWEhVQlBPUlQJCTB4MDMKKworI2RlZmluZSBNVVNCX1JYRlVOQ0FERFIJCTB4MDQKKyNkZWZpbmUgTVVTQl9SWEhVQkFERFIJCTB4MDYKKyNkZWZpbmUgTVVTQl9SWEhVQlBPUlQJCTB4MDcKKworI2RlZmluZSBNVVNCX0JVU0NUTF9PRkZTRVQoX2VwbnVtLCBfb2Zmc2V0KSBcCisJKDB4ODAgKyAoOCooX2VwbnVtKSkgKyAoX29mZnNldCkpCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtdXNiX3dyaXRlX3R4Zmlmb3N6KHZvaWQgX19pb21lbSAqbWJhc2UsIHU4IGNfc2l6ZSkKK3sKKwltdXNiX3dyaXRlYihtYmFzZSwgTVVTQl9UWEZJRk9TWiwgY19zaXplKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG11c2Jfd3JpdGVfdHhmaWZvYWRkKHZvaWQgX19pb21lbSAqbWJhc2UsIHUxNiBjX29mZikKK3sKKwltdXNiX3dyaXRldyhtYmFzZSwgTVVTQl9UWEZJRk9BREQsIGNfb2ZmKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG11c2Jfd3JpdGVfcnhmaWZvc3oodm9pZCBfX2lvbWVtICptYmFzZSwgdTggY19zaXplKQoreworCW11c2Jfd3JpdGViKG1iYXNlLCBNVVNCX1JYRklGT1NaLCBjX3NpemUpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgIG11c2Jfd3JpdGVfcnhmaWZvYWRkKHZvaWQgX19pb21lbSAqbWJhc2UsIHUxNiBjX29mZikKK3sKKwltdXNiX3dyaXRldyhtYmFzZSwgTVVTQl9SWEZJRk9BREQsIGNfb2ZmKTsKK30KKworc3RhdGljIGlubGluZSB1OCBtdXNiX3JlYWRfY29uZmlnZGF0YSh2b2lkIF9faW9tZW0gKm1iYXNlKQoreworCXJldHVybiBtdXNiX3JlYWRiKG1iYXNlLCAweDEwICsgTVVTQl9DT05GSUdEQVRBKTsKK30KKworc3RhdGljIGlubGluZSB1MTYgbXVzYl9yZWFkX2h3dmVycyh2b2lkIF9faW9tZW0gKm1iYXNlKQoreworCXJldHVybiBtdXNiX3JlYWR3KG1iYXNlLCBNVVNCX0hXVkVSUyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2lvbWVtICptdXNiX3JlYWRfdGFyZ2V0X3JlZ19iYXNlKHU4IGksIHZvaWQgX19pb21lbSAqbWJhc2UpCit7CisJcmV0dXJuIChNVVNCX0JVU0NUTF9PRkZTRVQoaSwgMCkgKyBtYmFzZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtdXNiX3dyaXRlX3J4ZnVuYWRkcih2b2lkIF9faW9tZW0gKmVwX3RhcmdldF9yZWdzLAorCQl1OCBxaF9hZGRyX3JlZykKK3sKKwltdXNiX3dyaXRlYihlcF90YXJnZXRfcmVncywgTVVTQl9SWEZVTkNBRERSLCBxaF9hZGRyX3JlZyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtdXNiX3dyaXRlX3J4aHViYWRkcih2b2lkIF9faW9tZW0gKmVwX3RhcmdldF9yZWdzLAorCQl1OCBxaF9oX2FkZHJfcmVnKQoreworCW11c2Jfd3JpdGViKGVwX3RhcmdldF9yZWdzLCBNVVNCX1JYSFVCQUREUiwgcWhfaF9hZGRyX3JlZyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtdXNiX3dyaXRlX3J4aHVicG9ydCh2b2lkIF9faW9tZW0gKmVwX3RhcmdldF9yZWdzLAorCQl1OCBxaF9oX3BvcnRfcmVnKQoreworCW11c2Jfd3JpdGViKGVwX3RhcmdldF9yZWdzLCBNVVNCX1JYSFVCUE9SVCwgcWhfaF9wb3J0X3JlZyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCAgbXVzYl93cml0ZV90eGZ1bmFkZHIodm9pZCBfX2lvbWVtICptYmFzZSwgdTggZXBudW0sCisJCXU4IHFoX2FkZHJfcmVnKQoreworCW11c2Jfd3JpdGViKG1iYXNlLCBNVVNCX0JVU0NUTF9PRkZTRVQoZXBudW0sIE1VU0JfVFhGVU5DQUREUiksCisJCQlxaF9hZGRyX3JlZyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCAgbXVzYl93cml0ZV90eGh1YmFkZHIodm9pZCBfX2lvbWVtICptYmFzZSwgdTggZXBudW0sCisJCXU4IHFoX2FkZHJfcmVnKQoreworCW11c2Jfd3JpdGViKG1iYXNlLCBNVVNCX0JVU0NUTF9PRkZTRVQoZXBudW0sIE1VU0JfVFhIVUJBRERSKSwKKwkJCXFoX2FkZHJfcmVnKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkICBtdXNiX3dyaXRlX3R4aHVicG9ydCh2b2lkIF9faW9tZW0gKm1iYXNlLCB1OCBlcG51bSwKKwkJdTggcWhfaF9wb3J0X3JlZykKK3sKKwltdXNiX3dyaXRlYihtYmFzZSwgTVVTQl9CVVNDVExfT0ZGU0VUKGVwbnVtLCBNVVNCX1RYSFVCUE9SVCksCisJCQlxaF9oX3BvcnRfcmVnKTsKK30KKworI2Vsc2UgLyogQ09ORklHX0JMQUNLRklOICovCisKKyNkZWZpbmUgVVNCX0JBU0UJCVVTQl9GQUREUgorI2RlZmluZSBVU0JfT0ZGU0VUKHJlZykJCShyZWcgLSBVU0JfQkFTRSkKKworLyoKKyAqIENvbW1vbiBVU0IgcmVnaXN0ZXJzCisgKi8KKyNkZWZpbmUgTVVTQl9GQUREUgkJVVNCX09GRlNFVChVU0JfRkFERFIpCS8qIDgtYml0ICovCisjZGVmaW5lIE1VU0JfUE9XRVIJCVVTQl9PRkZTRVQoVVNCX1BPV0VSKQkvKiA4LWJpdCAqLworI2RlZmluZSBNVVNCX0lOVFJUWAkJVVNCX09GRlNFVChVU0JfSU5UUlRYKQkvKiAxNi1iaXQgKi8KKyNkZWZpbmUgTVVTQl9JTlRSUlgJCVVTQl9PRkZTRVQoVVNCX0lOVFJSWCkKKyNkZWZpbmUgTVVTQl9JTlRSVFhFCQlVU0JfT0ZGU0VUKFVTQl9JTlRSVFhFKQorI2RlZmluZSBNVVNCX0lOVFJSWEUJCVVTQl9PRkZTRVQoVVNCX0lOVFJSWEUpCisjZGVmaW5lIE1VU0JfSU5UUlVTQgkJVVNCX09GRlNFVChVU0JfSU5UUlVTQikJLyogOCBiaXQgKi8KKyNkZWZpbmUgTVVTQl9JTlRSVVNCRQkJVVNCX09GRlNFVChVU0JfSU5UUlVTQkUpLyogOCBiaXQgKi8KKyNkZWZpbmUgTVVTQl9GUkFNRQkJVVNCX09GRlNFVChVU0JfRlJBTUUpCisjZGVmaW5lIE1VU0JfSU5ERVgJCVVTQl9PRkZTRVQoVVNCX0lOREVYKQkvKiA4IGJpdCAqLworI2RlZmluZSBNVVNCX1RFU1RNT0RFCQlVU0JfT0ZGU0VUKFVTQl9URVNUTU9ERSkvKiA4IGJpdCAqLworCisvKiBHZXQgb2Zmc2V0IGZvciBhIGdpdmVuIEZJRk8gZnJvbSBtdXNiLT5tcmVncyAqLworI2RlZmluZSBNVVNCX0ZJRk9fT0ZGU0VUKGVwbnVtKQlcCisJKFVTQl9PRkZTRVQoVVNCX0VQMF9GSUZPKSArICgoZXBudW0pICogOCkpCisKKy8qCisgKiBBZGRpdGlvbmFsIENvbnRyb2wgUmVnaXN0ZXJzCisgKi8KKworI2RlZmluZSBNVVNCX0RFVkNUTAkJVVNCX09GRlNFVChVU0JfT1RHX0RFVl9DVEwpCS8qIDggYml0ICovCisKKyNkZWZpbmUgTVVTQl9MSU5LSU5GTwkJVVNCX09GRlNFVChVU0JfTElOS0lORk8pLyogOCBiaXQgKi8KKyNkZWZpbmUgTVVTQl9WUExFTgkJVVNCX09GRlNFVChVU0JfVlBMRU4pCS8qIDggYml0ICovCisjZGVmaW5lIE1VU0JfSFNfRU9GMQkJVVNCX09GRlNFVChVU0JfSFNfRU9GMSkJLyogOCBiaXQgKi8KKyNkZWZpbmUgTVVTQl9GU19FT0YxCQlVU0JfT0ZGU0VUKFVTQl9GU19FT0YxKQkvKiA4IGJpdCAqLworI2RlZmluZSBNVVNCX0xTX0VPRjEJCVVTQl9PRkZTRVQoVVNCX0xTX0VPRjEpCS8qIDggYml0ICovCisKKy8qIE9mZnNldHMgdG8gZW5kcG9pbnQgcmVnaXN0ZXJzICovCisjZGVmaW5lIE1VU0JfVFhNQVhQCQkweDAwCisjZGVmaW5lIE1VU0JfVFhDU1IJCTB4MDQKKyNkZWZpbmUgTVVTQl9DU1IwCQlNVVNCX1RYQ1NSCS8qIFJlLXVzZWQgZm9yIEVQMCAqLworI2RlZmluZSBNVVNCX1JYTUFYUAkJMHgwOAorI2RlZmluZSBNVVNCX1JYQ1NSCQkweDBDCisjZGVmaW5lIE1VU0JfUlhDT1VOVAkJMHgxMAorI2RlZmluZSBNVVNCX0NPVU5UMAkJTVVTQl9SWENPVU5UCS8qIFJlLXVzZWQgZm9yIEVQMCAqLworI2RlZmluZSBNVVNCX1RYVFlQRQkJMHgxNAorI2RlZmluZSBNVVNCX1RZUEUwCQlNVVNCX1RYVFlQRQkvKiBSZS11c2VkIGZvciBFUDAgKi8KKyNkZWZpbmUgTVVTQl9UWElOVEVSVkFMCQkweDE4CisjZGVmaW5lIE1VU0JfTkFLTElNSVQwCQlNVVNCX1RYSU5URVJWQUwJLyogUmUtdXNlZCBmb3IgRVAwICovCisjZGVmaW5lIE1VU0JfUlhUWVBFCQkweDFDCisjZGVmaW5lIE1VU0JfUlhJTlRFUlZBTAkJMHgyMAorI2RlZmluZSBNVVNCX1RYQ09VTlQJCTB4MjgKKworLyogT2Zmc2V0cyB0byBlbmRwb2ludCByZWdpc3RlcnMgaW4gaW5kZXhlZCBtb2RlbCAodXNpbmcgSU5ERVggcmVnaXN0ZXIpICovCisjZGVmaW5lIE1VU0JfSU5ERVhFRF9PRkZTRVQoX2VwbnVtLCBfb2Zmc2V0KQlcCisJKDB4NDAgKyAoX29mZnNldCkpCisKKy8qIE9mZnNldHMgdG8gZW5kcG9pbnQgcmVnaXN0ZXJzIGluIGZsYXQgbW9kZWxzICovCisjZGVmaW5lIE1VU0JfRkxBVF9PRkZTRVQoX2VwbnVtLCBfb2Zmc2V0KQlcCisJKFVTQl9PRkZTRVQoVVNCX0VQX05JMF9UWE1BWFApICsgKDB4NDAgKiAoX2VwbnVtKSkgKyAoX29mZnNldCkpCisKKy8qIE5vdCBpbXBsZW1lbnRlZCAtIEhXIGhhcyBzZXBlcmF0ZSBUeC9SeCBGSUZPICovCisjZGVmaW5lIE1VU0JfVFhDU1JfTU9ERQkJCTB4MDAwMAorCisvKgorICogRHVtbXkgc3R1YiBmb3IgY2xrIGZyYW1ld29yaywgaXQgd2lsbCBiZSByZW1vdmVkCisgKiB1bnRpbCBCbGFja2ZpbiBzdXBwb3J0cyBjbGsgZnJhbWV3b3JrCisgKi8KKyNkZWZpbmUgY2xrX2dldChkZXYsIGlkKQlOVUxMCisjZGVmaW5lIGNsa19wdXQoY2xvY2spCQlkbyB7fSB3aGlsZSAoMCkKKyNkZWZpbmUgY2xrX2VuYWJsZShjbG9jaykJZG8ge30gd2hpbGUgKDApCisjZGVmaW5lIGNsa19kaXNhYmxlKGNsb2NrKQlkbyB7fSB3aGlsZSAoMCkKKworc3RhdGljIGlubGluZSB2b2lkIG11c2Jfd3JpdGVfdHhmaWZvc3oodm9pZCBfX2lvbWVtICptYmFzZSwgdTggY19zaXplKQoreworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbXVzYl93cml0ZV90eGZpZm9hZGQodm9pZCBfX2lvbWVtICptYmFzZSwgdTE2IGNfb2ZmKQoreworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbXVzYl93cml0ZV9yeGZpZm9zeih2b2lkIF9faW9tZW0gKm1iYXNlLCB1OCBjX3NpemUpCit7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCAgbXVzYl93cml0ZV9yeGZpZm9hZGQodm9pZCBfX2lvbWVtICptYmFzZSwgdTE2IGNfb2ZmKQoreworfQorCitzdGF0aWMgaW5saW5lIHU4IG11c2JfcmVhZF9jb25maWdkYXRhKHZvaWQgX19pb21lbSAqbWJhc2UpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTE2IG11c2JfcmVhZF9od3ZlcnModm9pZCBfX2lvbWVtICptYmFzZSkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB1MTYgbXVzYl9yZWFkX3RhcmdldF9yZWdfYmFzZSh1OCBpLCB2b2lkIF9faW9tZW0gKm1iYXNlKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbXVzYl93cml0ZV9yeGZ1bmFkZHIodm9pZCBfX2lvbWVtICplcF90YXJnZXRfcmVncywKKwkJdTggcWhfYWRkcl9yZXEpCit7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtdXNiX3dyaXRlX3J4aHViYWRkcih2b2lkIF9faW9tZW0gKmVwX3RhcmdldF9yZWdzLAorCQl1OCBxaF9oX2FkZHJfcmVnKQoreworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbXVzYl93cml0ZV9yeGh1YnBvcnQodm9pZCBfX2lvbWVtICplcF90YXJnZXRfcmVncywKKwkJdTggcWhfaF9wb3J0X3JlZykKK3sKK30KKworc3RhdGljIGlubGluZSB2b2lkICBtdXNiX3dyaXRlX3R4ZnVuYWRkcih2b2lkIF9faW9tZW0gKm1iYXNlLCB1OCBlcG51bSwKKwkJdTggcWhfYWRkcl9yZWcpCit7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCAgbXVzYl93cml0ZV90eGh1YmFkZHIodm9pZCBfX2lvbWVtICptYmFzZSwgdTggZXBudW0sCisJCXU4IHFoX2FkZHJfcmVnKQoreworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgIG11c2Jfd3JpdGVfdHhodWJwb3J0KHZvaWQgX19pb21lbSAqbWJhc2UsIHU4IGVwbnVtLAorCQl1OCBxaF9oX3BvcnRfcmVnKQoreworfQorCisjZW5kaWYgLyogQ09ORklHX0JMQUNLRklOICovCisKICNlbmRpZgkvKiBfX01VU0JfUkVHU19IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL211c2IvbXVzYmhzZG1hLmMgYi9kcml2ZXJzL3VzYi9tdXNiL211c2Joc2RtYS5jCmluZGV4IDhjNzM0ZWYuLjg2NjJlOWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL211c2IvbXVzYmhzZG1hLmMKKysrIGIvZHJpdmVycy91c2IvbXVzYi9tdXNiaHNkbWEuYwpAQCAtMzQsNTggKzM0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlICJtdXNiX2NvcmUuaCIKLQotI2lmIGRlZmluZWQoQ09ORklHX0FSQ0hfT01BUDI0MzApIHx8IGRlZmluZWQoQ09ORklHX0FSQ0hfT01BUDM0MzApCi0jaW5jbHVkZSAib21hcDI0MzAuaCIKLSNlbmRpZgotCi0jZGVmaW5lIE1VU0JfSFNETUFfQkFTRQkJMHgyMDAKLSNkZWZpbmUgTVVTQl9IU0RNQV9JTlRSCQkoTVVTQl9IU0RNQV9CQVNFICsgMCkKLSNkZWZpbmUgTVVTQl9IU0RNQV9DT05UUk9MCQkweDQKLSNkZWZpbmUgTVVTQl9IU0RNQV9BRERSRVNTCQkweDgKLSNkZWZpbmUgTVVTQl9IU0RNQV9DT1VOVAkJMHhjCi0KLSNkZWZpbmUgTVVTQl9IU0RNQV9DSEFOTkVMX09GRlNFVChfYmNoYW5uZWwsIF9vZmZzZXQpCQlcCi0JCShNVVNCX0hTRE1BX0JBU0UgKyAoX2JjaGFubmVsIDw8IDQpICsgX29mZnNldCkKLQotLyogY29udHJvbCByZWdpc3RlciAoMTYtYml0KTogKi8KLSNkZWZpbmUgTVVTQl9IU0RNQV9FTkFCTEVfU0hJRlQJCTAKLSNkZWZpbmUgTVVTQl9IU0RNQV9UUkFOU01JVF9TSElGVAkJMQotI2RlZmluZSBNVVNCX0hTRE1BX01PREUxX1NISUZUCQkyCi0jZGVmaW5lIE1VU0JfSFNETUFfSVJRRU5BQkxFX1NISUZUCQkzCi0jZGVmaW5lIE1VU0JfSFNETUFfRU5EUE9JTlRfU0hJRlQJCTQKLSNkZWZpbmUgTVVTQl9IU0RNQV9CVVNFUlJPUl9TSElGVAkJOAotI2RlZmluZSBNVVNCX0hTRE1BX0JVUlNUTU9ERV9TSElGVAkJOQotI2RlZmluZSBNVVNCX0hTRE1BX0JVUlNUTU9ERQkJKDMgPDwgTVVTQl9IU0RNQV9CVVJTVE1PREVfU0hJRlQpCi0jZGVmaW5lIE1VU0JfSFNETUFfQlVSU1RNT0RFX1VOU1BFQwkwCi0jZGVmaW5lIE1VU0JfSFNETUFfQlVSU1RNT0RFX0lOQ1I0CTEKLSNkZWZpbmUgTVVTQl9IU0RNQV9CVVJTVE1PREVfSU5DUjgJMgotI2RlZmluZSBNVVNCX0hTRE1BX0JVUlNUTU9ERV9JTkNSMTYJMwotCi0jZGVmaW5lIE1VU0JfSFNETUFfQ0hBTk5FTFMJCTgKLQotc3RydWN0IG11c2JfZG1hX2NvbnRyb2xsZXI7Ci0KLXN0cnVjdCBtdXNiX2RtYV9jaGFubmVsIHsKLQlzdHJ1Y3QgZG1hX2NoYW5uZWwJCWNoYW5uZWw7Ci0Jc3RydWN0IG11c2JfZG1hX2NvbnRyb2xsZXIJKmNvbnRyb2xsZXI7Ci0JdTMyCQkJCXN0YXJ0X2FkZHI7Ci0JdTMyCQkJCWxlbjsKLQl1MTYJCQkJbWF4X3BhY2tldF9zejsKLQl1OAkJCQlpZHg7Ci0JdTgJCQkJZXBudW07Ci0JdTgJCQkJdHJhbnNtaXQ7Ci19OwotCi1zdHJ1Y3QgbXVzYl9kbWFfY29udHJvbGxlciB7Ci0Jc3RydWN0IGRtYV9jb250cm9sbGVyCQljb250cm9sbGVyOwotCXN0cnVjdCBtdXNiX2RtYV9jaGFubmVsCQljaGFubmVsW01VU0JfSFNETUFfQ0hBTk5FTFNdOwotCXZvaWQJCQkJKnByaXZhdGVfZGF0YTsKLQl2b2lkIF9faW9tZW0JCQkqYmFzZTsKLQl1OAkJCQljaGFubmVsX2NvdW50OwotCXU4CQkJCXVzZWRfY2hhbm5lbHM7Ci0JdTgJCQkJaXJxOwotfTsKKyNpbmNsdWRlICJtdXNiaHNkbWEuaCIKIAogc3RhdGljIGludCBkbWFfY29udHJvbGxlcl9zdGFydChzdHJ1Y3QgZG1hX2NvbnRyb2xsZXIgKmMpCiB7CkBAIC0yMDMsMTIgKzE1Miw4IEBACiAJCQkJOiAwKTsKIAogCS8qIGFkZHJlc3MvY291bnQgKi8KLQltdXNiX3dyaXRlbChtYmFzZSwKLQkJTVVTQl9IU0RNQV9DSEFOTkVMX09GRlNFVChiY2hhbm5lbCwgTVVTQl9IU0RNQV9BRERSRVNTKSwKLQkJZG1hX2FkZHIpOwotCW11c2Jfd3JpdGVsKG1iYXNlLAotCQlNVVNCX0hTRE1BX0NIQU5ORUxfT0ZGU0VUKGJjaGFubmVsLCBNVVNCX0hTRE1BX0NPVU5UKSwKLQkJbGVuKTsKKwltdXNiX3dyaXRlX2hzZG1hX2FkZHIobWJhc2UsIGJjaGFubmVsLCBkbWFfYWRkcik7CisJbXVzYl93cml0ZV9oc2RtYV9jb3VudChtYmFzZSwgYmNoYW5uZWwsIGxlbik7CiAKIAkvKiBjb250cm9sICh0aGlzIHNob3VsZCBzdGFydCB0aGluZ3MpICovCiAJbXVzYl93cml0ZXcobWJhc2UsCkBAIC0yNzksMTMgKzIyNCw4IEBACiAJCW11c2Jfd3JpdGV3KG1iYXNlLAogCQkJTVVTQl9IU0RNQV9DSEFOTkVMX09GRlNFVChiY2hhbm5lbCwgTVVTQl9IU0RNQV9DT05UUk9MKSwKIAkJCTApOwotCQltdXNiX3dyaXRlbChtYmFzZSwKLQkJCU1VU0JfSFNETUFfQ0hBTk5FTF9PRkZTRVQoYmNoYW5uZWwsIE1VU0JfSFNETUFfQUREUkVTUyksCi0JCQkwKTsKLQkJbXVzYl93cml0ZWwobWJhc2UsCi0JCQlNVVNCX0hTRE1BX0NIQU5ORUxfT0ZGU0VUKGJjaGFubmVsLCBNVVNCX0hTRE1BX0NPVU5UKSwKLQkJCTApOwotCisJCW11c2Jfd3JpdGVfaHNkbWFfYWRkcihtYmFzZSwgYmNoYW5uZWwsIDApOworCQltdXNiX3dyaXRlX2hzZG1hX2NvdW50KG1iYXNlLCBiY2hhbm5lbCwgMCk7CiAJCWNoYW5uZWwtPnN0YXR1cyA9IE1VU0JfRE1BX1NUQVRVU19GUkVFOwogCX0KIApAQCAtMzMzLDEwICsyNzMsOCBAQAogCQkJfSBlbHNlIHsKIAkJCQl1OCBkZXZjdGw7CiAKLQkJCQlhZGRyID0gbXVzYl9yZWFkbChtYmFzZSwKLQkJCQkJCU1VU0JfSFNETUFfQ0hBTk5FTF9PRkZTRVQoCi0JCQkJCQkJYmNoYW5uZWwsCi0JCQkJCQkJTVVTQl9IU0RNQV9BRERSRVNTKSk7CisJCQkJYWRkciA9IG11c2JfcmVhZF9oc2RtYV9hZGRyKG1iYXNlLAorCQkJCQkJYmNoYW5uZWwpOwogCQkJCWNoYW5uZWwtPmFjdHVhbF9sZW4gPSBhZGRyCiAJCQkJCS0gbXVzYl9jaGFubmVsLT5zdGFydF9hZGRyOwogCkBAIC0zNzUsNiArMzEzLDEyIEBACiAJCQl9CiAJCX0KIAl9CisKKyNpZmRlZiBDT05GSUdfQkxBQ0tGSU4KKwkvKiBDbGVhciBETUEgaW50ZXJydXAgZmxhZ3MgKi8KKwltdXNiX3dyaXRlYihtYmFzZSwgTVVTQl9IU0RNQV9JTlRSLCBpbnRfaHNkbWEpOworI2VuZGlmCisKIAlyZXR2YWwgPSBJUlFfSEFORExFRDsKIGRvbmU6CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbXVzYi0+bG9jaywgZmxhZ3MpOwpAQCAtNDI0LDcgKzM2OCw3IEBACiAJY29udHJvbGxlci0+Y29udHJvbGxlci5jaGFubmVsX2Fib3J0ID0gZG1hX2NoYW5uZWxfYWJvcnQ7CiAKIAlpZiAocmVxdWVzdF9pcnEoaXJxLCBkbWFfY29udHJvbGxlcl9pcnEsIElSUUZfRElTQUJMRUQsCi0JCQltdXNiLT5jb250cm9sbGVyLT5idXNfaWQsICZjb250cm9sbGVyLT5jb250cm9sbGVyKSkgeworCQkJZGV2X25hbWUobXVzYi0+Y29udHJvbGxlciksICZjb250cm9sbGVyLT5jb250cm9sbGVyKSkgewogCQlkZXZfZXJyKGRldiwgInJlcXVlc3RfaXJxICVkIGZhaWxlZCFcbiIsIGlycSk7CiAJCWRtYV9jb250cm9sbGVyX2Rlc3Ryb3koJmNvbnRyb2xsZXItPmNvbnRyb2xsZXIpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9tdXNiL211c2Joc2RtYS5oIGIvZHJpdmVycy91c2IvbXVzYi9tdXNiaHNkbWEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjk5ZDkyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy91c2IvbXVzYi9tdXNiaHNkbWEuaApAQCAtMCwwICsxLDE0OSBAQAorLyoKKyAqIE1VU0IgT1RHIGRyaXZlciAtIHN1cHBvcnQgZm9yIE1lbnRvcidzIERNQSBjb250cm9sbGVyCisgKgorICogQ29weXJpZ2h0IDIwMDUgTWVudG9yIEdyYXBoaWNzIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUtMjAwNyBieSBUZXhhcyBJbnN0cnVtZW50cworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSBVU0EKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4KKyAqIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCisgKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OCisgKiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisjaWYgZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQMjQzMCkgfHwgZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQMzQzMCkKKyNpbmNsdWRlICJvbWFwMjQzMC5oIgorI2VuZGlmCisKKyNpZm5kZWYgQ09ORklHX0JMQUNLRklOCisKKyNkZWZpbmUgTVVTQl9IU0RNQV9CQVNFCQkweDIwMAorI2RlZmluZSBNVVNCX0hTRE1BX0lOVFIJCShNVVNCX0hTRE1BX0JBU0UgKyAwKQorI2RlZmluZSBNVVNCX0hTRE1BX0NPTlRST0wJCTB4NAorI2RlZmluZSBNVVNCX0hTRE1BX0FERFJFU1MJCTB4OAorI2RlZmluZSBNVVNCX0hTRE1BX0NPVU5UCQkweGMKKworI2RlZmluZSBNVVNCX0hTRE1BX0NIQU5ORUxfT0ZGU0VUKF9iY2hhbm5lbCwgX29mZnNldCkJCVwKKwkJKE1VU0JfSFNETUFfQkFTRSArIChfYmNoYW5uZWwgPDwgNCkgKyBfb2Zmc2V0KQorCisjZGVmaW5lIG11c2JfcmVhZF9oc2RtYV9hZGRyKG1iYXNlLCBiY2hhbm5lbCkJXAorCW11c2JfcmVhZGwobWJhc2UsCVwKKwkJICAgTVVTQl9IU0RNQV9DSEFOTkVMX09GRlNFVChiY2hhbm5lbCwgTVVTQl9IU0RNQV9BRERSRVNTKSkKKworI2RlZmluZSBtdXNiX3dyaXRlX2hzZG1hX2FkZHIobWJhc2UsIGJjaGFubmVsLCBhZGRyKSBcCisJbXVzYl93cml0ZWwobWJhc2UsIFwKKwkJICAgIE1VU0JfSFNETUFfQ0hBTk5FTF9PRkZTRVQoYmNoYW5uZWwsIE1VU0JfSFNETUFfQUREUkVTUyksIFwKKwkJICAgIGFkZHIpCisKKyNkZWZpbmUgbXVzYl93cml0ZV9oc2RtYV9jb3VudChtYmFzZSwgYmNoYW5uZWwsIGxlbikgXAorCW11c2Jfd3JpdGVsKG1iYXNlLCBcCisJCSAgICBNVVNCX0hTRE1BX0NIQU5ORUxfT0ZGU0VUKGJjaGFubmVsLCBNVVNCX0hTRE1BX0NPVU5UKSwgXAorCQkgICAgbGVuKQorI2Vsc2UKKworI2RlZmluZSBNVVNCX0hTRE1BX0JBU0UJCTB4NDAwCisjZGVmaW5lIE1VU0JfSFNETUFfSU5UUgkJKE1VU0JfSFNETUFfQkFTRSArIDApCisjZGVmaW5lIE1VU0JfSFNETUFfQ09OVFJPTAkJMHgwNAorI2RlZmluZSBNVVNCX0hTRE1BX0FERFJfTE9XCQkweDA4CisjZGVmaW5lIE1VU0JfSFNETUFfQUREUl9ISUdICQkweDBDCisjZGVmaW5lIE1VU0JfSFNETUFfQ09VTlRfTE9XCQkweDEwCisjZGVmaW5lIE1VU0JfSFNETUFfQ09VTlRfSElHSAkJMHgxNAorCisjZGVmaW5lIE1VU0JfSFNETUFfQ0hBTk5FTF9PRkZTRVQoX2JjaGFubmVsLCBfb2Zmc2V0KQkJXAorCQkoTVVTQl9IU0RNQV9CQVNFICsgKF9iY2hhbm5lbCAqIDB4MjApICsgX29mZnNldCkKKworc3RhdGljIGlubGluZSB1MzIgbXVzYl9yZWFkX2hzZG1hX2FkZHIodm9pZCBfX2lvbWVtICptYmFzZSwgdTggYmNoYW5uZWwpCit7CisJdTMyIGFkZHIgPSBtdXNiX3JlYWR3KG1iYXNlLAorCQlNVVNCX0hTRE1BX0NIQU5ORUxfT0ZGU0VUKGJjaGFubmVsLCBNVVNCX0hTRE1BX0FERFJfSElHSCkpOworCisJYWRkciA9IGFkZHIgPDwgMTY7CisKKwlhZGRyIHw9IG11c2JfcmVhZHcobWJhc2UsCisJCU1VU0JfSFNETUFfQ0hBTk5FTF9PRkZTRVQoYmNoYW5uZWwsIE1VU0JfSFNETUFfQUREUl9MT1cpKTsKKworCXJldHVybiBhZGRyOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbXVzYl93cml0ZV9oc2RtYV9hZGRyKHZvaWQgX19pb21lbSAqbWJhc2UsCisJCQkJdTggYmNoYW5uZWwsIGRtYV9hZGRyX3QgZG1hX2FkZHIpCit7CisJbXVzYl93cml0ZXcobWJhc2UsCisJCU1VU0JfSFNETUFfQ0hBTk5FTF9PRkZTRVQoYmNoYW5uZWwsIE1VU0JfSFNETUFfQUREUl9MT1cpLAorCQkoKHUxNikoKHUzMikgZG1hX2FkZHIgJiAweEZGRkYpKSk7CisJbXVzYl93cml0ZXcobWJhc2UsCisJCU1VU0JfSFNETUFfQ0hBTk5FTF9PRkZTRVQoYmNoYW5uZWwsIE1VU0JfSFNETUFfQUREUl9ISUdIKSwKKwkJKCh1MTYpKCgodTMyKSBkbWFfYWRkciA+PiAxNikgJiAweEZGRkYpKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtdXNiX3dyaXRlX2hzZG1hX2NvdW50KHZvaWQgX19pb21lbSAqbWJhc2UsCisJCQkJdTggYmNoYW5uZWwsIHUzMiBsZW4pCit7CisJbXVzYl93cml0ZXcobWJhc2UsCisJCU1VU0JfSFNETUFfQ0hBTk5FTF9PRkZTRVQoYmNoYW5uZWwsIE1VU0JfSFNETUFfQ09VTlRfTE9XKSwKKwkJKCh1MTYpKCh1MzIpIGxlbiAmIDB4RkZGRikpKTsKKwltdXNiX3dyaXRldyhtYmFzZSwKKwkJTVVTQl9IU0RNQV9DSEFOTkVMX09GRlNFVChiY2hhbm5lbCwgTVVTQl9IU0RNQV9DT1VOVF9ISUdIKSwKKwkJKCh1MTYpKCgodTMyKSBsZW4gPj4gMTYpICYgMHhGRkZGKSkpOworfQorCisjZW5kaWYgLyogQ09ORklHX0JMQUNLRklOICovCisKKy8qIGNvbnRyb2wgcmVnaXN0ZXIgKDE2LWJpdCk6ICovCisjZGVmaW5lIE1VU0JfSFNETUFfRU5BQkxFX1NISUZUCQkwCisjZGVmaW5lIE1VU0JfSFNETUFfVFJBTlNNSVRfU0hJRlQJMQorI2RlZmluZSBNVVNCX0hTRE1BX01PREUxX1NISUZUCQkyCisjZGVmaW5lIE1VU0JfSFNETUFfSVJRRU5BQkxFX1NISUZUCTMKKyNkZWZpbmUgTVVTQl9IU0RNQV9FTkRQT0lOVF9TSElGVAk0CisjZGVmaW5lIE1VU0JfSFNETUFfQlVTRVJST1JfU0hJRlQJOAorI2RlZmluZSBNVVNCX0hTRE1BX0JVUlNUTU9ERV9TSElGVAk5CisjZGVmaW5lIE1VU0JfSFNETUFfQlVSU1RNT0RFCQkoMyA8PCBNVVNCX0hTRE1BX0JVUlNUTU9ERV9TSElGVCkKKyNkZWZpbmUgTVVTQl9IU0RNQV9CVVJTVE1PREVfVU5TUEVDCTAKKyNkZWZpbmUgTVVTQl9IU0RNQV9CVVJTVE1PREVfSU5DUjQJMQorI2RlZmluZSBNVVNCX0hTRE1BX0JVUlNUTU9ERV9JTkNSOAkyCisjZGVmaW5lIE1VU0JfSFNETUFfQlVSU1RNT0RFX0lOQ1IxNgkzCisKKyNkZWZpbmUgTVVTQl9IU0RNQV9DSEFOTkVMUwkJOAorCitzdHJ1Y3QgbXVzYl9kbWFfY29udHJvbGxlcjsKKworc3RydWN0IG11c2JfZG1hX2NoYW5uZWwgeworCXN0cnVjdCBkbWFfY2hhbm5lbAkJY2hhbm5lbDsKKwlzdHJ1Y3QgbXVzYl9kbWFfY29udHJvbGxlcgkqY29udHJvbGxlcjsKKwl1MzIJCQkJc3RhcnRfYWRkcjsKKwl1MzIJCQkJbGVuOworCXUxNgkJCQltYXhfcGFja2V0X3N6OworCXU4CQkJCWlkeDsKKwl1OAkJCQllcG51bTsKKwl1OAkJCQl0cmFuc21pdDsKK307CisKK3N0cnVjdCBtdXNiX2RtYV9jb250cm9sbGVyIHsKKwlzdHJ1Y3QgZG1hX2NvbnRyb2xsZXIJCWNvbnRyb2xsZXI7CisJc3RydWN0IG11c2JfZG1hX2NoYW5uZWwJCWNoYW5uZWxbTVVTQl9IU0RNQV9DSEFOTkVMU107CisJdm9pZAkJCQkqcHJpdmF0ZV9kYXRhOworCXZvaWQgX19pb21lbQkJCSpiYXNlOworCXU4CQkJCWNoYW5uZWxfY291bnQ7CisJdTgJCQkJdXNlZF9jaGFubmVsczsKKwl1OAkJCQlpcnE7Cit9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbXVzYi9vbWFwMjQzMC5jIGIvZHJpdmVycy91c2IvbXVzYi9vbWFwMjQzMC5jCmluZGV4IGNlNmMxNjIuLjkwMWRmZmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL211c2Ivb21hcDI0MzAuYworKysgYi9kcml2ZXJzL3VzYi9tdXNiL29tYXAyNDMwLmMKQEAgLTU4LDEwICs1OCwxMCBAQAogI2VuZGlmCiAJdTgJZGV2Y3RsOwogCi0JZGV2Y3RsID0gbXVzYl9yZWFkYihtdXNiLT5tcmVncywgTVVTQl9ERVZDVEwpOwotCiAJc3Bpbl9sb2NrX2lycXNhdmUoJm11c2ItPmxvY2ssIGZsYWdzKTsKIAorCWRldmN0bCA9IG11c2JfcmVhZGIobXVzYi0+bXJlZ3MsIE1VU0JfREVWQ1RMKTsKKwogCXN3aXRjaCAobXVzYi0+eGNlaXYuc3RhdGUpIHsKIAljYXNlIE9UR19TVEFURV9BX1dBSVRfQkNPTjoKIAkJZGV2Y3RsICY9IH5NVVNCX0RFVkNUTF9TRVNTSU9OOwpAQCAtMTk2LDcgKzE5Niw3IEBACiAKIHN0YXRpYyBpbnQgbXVzYl9wbGF0Zm9ybV9yZXN1bWUoc3RydWN0IG11c2IgKm11c2IpOwogCi12b2lkIG11c2JfcGxhdGZvcm1fc2V0X21vZGUoc3RydWN0IG11c2IgKm11c2IsIHU4IG11c2JfbW9kZSkKK2ludCBtdXNiX3BsYXRmb3JtX3NldF9tb2RlKHN0cnVjdCBtdXNiICptdXNiLCB1OCBtdXNiX21vZGUpCiB7CiAJdTgJZGV2Y3RsID0gbXVzYl9yZWFkYihtdXNiLT5tcmVncywgTVVTQl9ERVZDVEwpOwogCkBAIC0yMDQsMTUgKzIwNCwyNCBAQAogCW11c2Jfd3JpdGViKG11c2ItPm1yZWdzLCBNVVNCX0RFVkNUTCwgZGV2Y3RsKTsKIAogCXN3aXRjaCAobXVzYl9tb2RlKSB7CisjaWZkZWYgQ09ORklHX1VTQl9NVVNCX0hEUkNfSENECiAJY2FzZSBNVVNCX0hPU1Q6CiAJCW90Z19zZXRfaG9zdCgmbXVzYi0+eGNlaXYsIG11c2ItPnhjZWl2Lmhvc3QpOwogCQlicmVhazsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19VU0JfR0FER0VUX01VU0JfSERSQwogCWNhc2UgTVVTQl9QRVJJUEhFUkFMOgogCQlvdGdfc2V0X3BlcmlwaGVyYWwoJm11c2ItPnhjZWl2LCBtdXNiLT54Y2Vpdi5nYWRnZXQpOwogCQlicmVhazsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19VU0JfTVVTQl9PVEcKIAljYXNlIE1VU0JfT1RHOgogCQlicmVhazsKKyNlbmRpZgorCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOwogCX0KKwlyZXR1cm4gMDsKIH0KIAogaW50IF9faW5pdCBtdXNiX3BsYXRmb3JtX2luaXQoc3RydWN0IG11c2IgKm11c2IpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9tdXNiL3R1c2I2MDEwLmMgYi9kcml2ZXJzL3VzYi9tdXNiL3R1c2I2MDEwLmMKaW5kZXggZWU4ZmNhOS4uOWUyMGZkMCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbXVzYi90dXNiNjAxMC5jCisrKyBiL2RyaXZlcnMvdXNiL211c2IvdHVzYjYwMTAuYwpAQCAtNTk4LDcgKzU5OCw3IEBACiAgKiBhbmQgcGVyaXBoZXJhbCBtb2RlcyBpbiBub24tT1RHIGNvbmZpZ3VyYXRpb25zIGJ5IHJlY29uZmlndXJpbmcgaGFyZHdhcmUKICAqIGFuZCB0aGVuIHNldHRpbmcgbXVzYi0+Ym9hcmRfbW9kZS4gRm9yIG5vdywgb25seSBzdXBwb3J0IE9URyBtb2RlLgogICovCi12b2lkIG11c2JfcGxhdGZvcm1fc2V0X21vZGUoc3RydWN0IG11c2IgKm11c2IsIHU4IG11c2JfbW9kZSkKK2ludCBtdXNiX3BsYXRmb3JtX3NldF9tb2RlKHN0cnVjdCBtdXNiICptdXNiLCB1OCBtdXNiX21vZGUpCiB7CiAJdm9pZCBfX2lvbWVtCSp0YmFzZSA9IG11c2ItPmN0cmxfYmFzZTsKIAl1MzIJCW90Z19zdGF0LCBwaHlfb3RnX2N0cmwsIHBoeV9vdGdfZW5hLCBkZXZfY29uZjsKQEAgLTY0MSw3ICs2NDEsOCBAQAogI2VuZGlmCiAKIAlkZWZhdWx0OgotCQlEQkcoMiwgIlRyeWluZyB0byBzZXQgdW5rbm93biBtb2RlICVpXG4iLCBtdXNiX21vZGUpOworCQlEQkcoMiwgIlRyeWluZyB0byBzZXQgbW9kZSAlaVxuIiwgbXVzYl9tb2RlKTsKKwkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJbXVzYl93cml0ZWwodGJhc2UsIFRVU0JfUEhZX09UR19DVFJMLApAQCAtNjU1LDYgKzY1Niw4IEBACiAJCSEob3RnX3N0YXQgJiBUVVNCX0RFVl9PVEdfU1RBVF9JRF9TVEFUVVMpKQogCQkJSU5GTygiQ2Fubm90IGJlIHBlcmlwaGVyYWwgd2l0aCBtaW5pLUEgY2FibGUgIgogCQkJIm90Z19zdGF0OiAlMDh4XG4iLCBvdGdfc3RhdCk7CisKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9vdGcvS2NvbmZpZyBiL2RyaXZlcnMvdXNiL290Zy9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlOGRiZGIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3VzYi9vdGcvS2NvbmZpZwpAQCAtMCwwICsxLDU0IEBACisjCisjIFVTQiBPVEcgaW5mcmFzdHJ1Y3R1cmUgbWF5IGJlIG5lZWRlZCBmb3IgcGVyaXBoZXJhbC1vbmx5LCBob3N0LW9ubHksCisjIG9yIE9URy1jYXBhYmxlIGNvbmZpZ3VyYXRpb25zIHdoZW4gT1RHIHRyYW5zY2VpdmVycyBvciBjb250cm9sbGVycworIyBhcmUgdXNlZC4KKyMKKworY29tbWVudCAiT1RHIGFuZCByZWxhdGVkIGluZnJhc3RydWN0dXJlIgorCitpZiBVU0IgfHwgVVNCX0dBREdFVAorCitjb25maWcgVVNCX09UR19VVElMUworCWJvb2wKKwloZWxwCisJICBTZWxlY3QgdGhpcyB0byBtYWtlIHN1cmUgdGhlIGJ1aWxkIGluY2x1ZGVzIG9iamVjdHMgZnJvbQorCSAgdGhlIE9URyBpbmZyYXN0cnVjdHVyZSBkaXJlY3RvcnkuCisKKyMKKyMgVVNCIFRyYW5zY2VpdmVyIERyaXZlcnMKKyMKK2NvbmZpZyBVU0JfR1BJT19WQlVTCisJdHJpc3RhdGUgIkdQSU8gYmFzZWQgcGVyaXBoZXJhbC1vbmx5IFZCVVMgc2Vuc2luZyAndHJhbnNjZWl2ZXInIgorCWRlcGVuZHMgb24gR0VORVJJQ19HUElPCisJc2VsZWN0IFVTQl9PVEdfVVRJTFMKKwloZWxwCisJICBQcm92aWRlcyBzaW1wbGUgR1BJTyBWQlVTIHNlbnNpbmcgZm9yIGNvbnRyb2xsZXJzIHdpdGggYW4KKwkgIGludGVybmFsIHRyYW5zY2VpdmVyIHZpYSB0aGUgb3RnX3RyYW5zY2VpdmVyIGludGVyZmFjZSwgYW5kCisJICBvcHRpb25hbGx5IGNvbnRyb2wgb2YgYSBEKyBwdWxsdXAgR1BJTyBhcyB3ZWxsIGFzIGEgVkJVUworCSAgY3VycmVudCBsaW1pdCByZWd1bGF0b3IuCisKK2NvbmZpZyBJU1AxMzAxX09NQVAKKwl0cmlzdGF0ZSAiUGhpbGlwcyBJU1AxMzAxIHdpdGggT01BUCBPVEciCisJZGVwZW5kcyBvbiBJMkMgJiYgQVJDSF9PTUFQX09URworCXNlbGVjdCBVU0JfT1RHX1VUSUxTCisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIHRoZSBQaGlsaXBzIElTUDEzMDEKKwkgIFVTQi1Pbi1UaGUtR28gdHJhbnNjZWl2ZXIgd29ya2luZyB3aXRoIHRoZSBPTUFQIE9URyBjb250cm9sbGVyLgorCSAgVGhlIElTUDEzMDEgaXMgYSBmdWxsIHNwZWVkIFVTQiAgdHJhbnNjZWl2ZXIgd2hpY2ggaXMgdXNlZCBpbgorCSAgcHJvZHVjdHMgaW5jbHVkaW5nIEgyLCBIMywgYW5kIEg0IGRldmVsb3BtZW50IGJvYXJkcyBmb3IgVGV4YXMKKwkgIEluc3RydW1lbnRzIE9NQVAgcHJvY2Vzc29ycy4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgaXNwMTMwMV9vbWFwLgorCitjb25maWcgVFdMNDAzMF9VU0IKKwl0cmlzdGF0ZSAiVFdMNDAzMCBVU0IgVHJhbnNjZWl2ZXIgRHJpdmVyIgorCWRlcGVuZHMgb24gVFdMNDAzMF9DT1JFCisJc2VsZWN0IFVTQl9PVEdfVVRJTFMKKwloZWxwCisJICBFbmFibGUgdGhpcyB0byBzdXBwb3J0IHRoZSBVU0IgT1RHIHRyYW5zY2VpdmVyIG9uIFRXTDQwMzAKKwkgIGZhbWlseSBjaGlwcyAoaW5jbHVkaW5nIHRoZSBUV0w1MDMwIGFuZCBUUFM2NTl4MCBkZXZpY2VzKS4KKwkgIFRoaXMgdHJhbnNjZWl2ZXIgc3VwcG9ydHMgaGlnaCBhbmQgZnVsbCBzcGVlZCBkZXZpY2VzIHBsdXMsCisJICBpbiBob3N0IG1vZGUsIGxvdyBzcGVlZC4KKworZW5kaWYgIyBVU0IgfHwgT1RHCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9vdGcvTWFrZWZpbGUgYi9kcml2ZXJzL3VzYi9vdGcvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDczYzdjZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdXNiL290Zy9NYWtlZmlsZQpAQCAtMCwwICsxLDE1IEBACisjCisjIE9URyBpbmZyYXN0cnVjdHVyZSBhbmQgdHJhbnNjZWl2ZXIgZHJpdmVycworIworCisjIGluZnJhc3RydWN0dXJlCitvYmotJChDT05GSUdfVVNCX09UR19VVElMUykJKz0gb3RnLm8KKworIyB0cmFuc2NlaXZlciBkcml2ZXJzCitvYmotJChDT05GSUdfVVNCX0dQSU9fVkJVUykJKz0gZ3Bpb192YnVzLm8KK29iai0kKENPTkZJR19JU1AxMzAxX09NQVApCSs9IGlzcDEzMDFfb21hcC5vCitvYmotJChDT05GSUdfVFdMNDAzMF9VU0IpCSs9IHR3bDQwMzAtdXNiLm8KKworY2NmbGFncy0kKENPTkZJR19VU0JfREVCVUcpCSs9IC1EREVCVUcKK2NjZmxhZ3MtJChDT05GSUdfVVNCX0dBREdFVF9ERUJVRykgKz0gLURERUJVRworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9vdGcvZ3Bpb192YnVzLmMgYi9kcml2ZXJzL3VzYi9vdGcvZ3Bpb192YnVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjNhNjAzNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdXNiL290Zy9ncGlvX3ZidXMuYwpAQCAtMCwwICsxLDMzNSBAQAorLyoKKyAqIGdwaW8tdmJ1cy5jIC0gc2ltcGxlIEdQSU8gVkJVUyBzZW5zaW5nIGRyaXZlciBmb3IgQiBwZXJpcGhlcmFsIGRldmljZXMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggUGhpbGlwcCBaYWJlbCA8cGhpbGlwcC56YWJlbEBnbWFpbC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgorCisjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL2NvbnN1bWVyLmg+CisKKyNpbmNsdWRlIDxsaW51eC91c2IvZ2FkZ2V0Lmg+CisjaW5jbHVkZSA8bGludXgvdXNiL2dwaW9fdmJ1cy5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi9vdGcuaD4KKworCisvKgorICogQSBzaW1wbGUgR1BJTyBWQlVTIHNlbnNpbmcgZHJpdmVyIGZvciBCIHBlcmlwaGVyYWwgb25seSBkZXZpY2VzCisgKiB3aXRoIGludGVybmFsIHRyYW5zY2VpdmVycy4gSXQgY2FuIGNvbnRyb2wgYSBEKyBwdWxsdXAgR1BJTyBhbmQKKyAqIGEgcmVndWxhdG9yIHRvIGxpbWl0IHRoZSBjdXJyZW50IGRyYXduIGZyb20gVkJVUy4KKyAqCisgKiBOZWVkcyB0byBiZSBsb2FkZWQgYmVmb3JlIHRoZSBVREMgZHJpdmVyIHRoYXQgd2lsbCB1c2UgaXQuCisgKi8KK3N0cnVjdCBncGlvX3ZidXNfZGF0YSB7CisJc3RydWN0IG90Z190cmFuc2NlaXZlciBvdGc7CisJc3RydWN0IGRldmljZSAgICAgICAgICAqZGV2OworCXN0cnVjdCByZWd1bGF0b3IgICAgICAgKnZidXNfZHJhdzsKKwlpbnQJCQl2YnVzX2RyYXdfZW5hYmxlZDsKKwl1bnNpZ25lZAkJbUE7Cit9OworCisKKy8qCisgKiBUaGlzIGRyaXZlciByZWxpZXMgb24gImJvdGggZWRnZXMiIHRyaWdnZXJpbmcuICBWQlVTIGhhcyAxMDAgbXNlYyB0bworICogc3RhYmlsaXplLCBzbyB0aGUgcGVyaXBoZXJhbCBjb250cm9sbGVyIGRyaXZlciBtYXkgbmVlZCB0byBjb3BlIHdpdGgKKyAqIHNvbWUgYm91bmNpbmcgZHVlIHRvIGN1cnJlbnQgc3VyZ2VzIChlLmcuIGNoYXJnaW5nIGxvY2FsIGNhcGFjaXRhbmNlKQorICogYW5kIGNvbnRhY3QgY2hhdHRlci4KKyAqCisgKiBSRVZJU0lUIGluIGRlc3BlcmF0ZSBzdHJhaXRzLCB0b2dnbGluZyBiZXR3ZWVuIHJpc2luZyBhbmQgZmFsbGluZworICogZWRnZXMgbWlnaHQgYmUgd29ya2FibGUuCisgKi8KKyNkZWZpbmUgVkJVU19JUlFfRkxBR1MgXAorCSggSVJRRl9TQU1QTEVfUkFORE9NIHwgSVJRRl9TSEFSRUQgXAorCXwgSVJRRl9UUklHR0VSX1JJU0lORyB8IElSUUZfVFJJR0dFUl9GQUxMSU5HICkKKworCisvKiBpbnRlcmZhY2UgdG8gcmVndWxhdG9yIGZyYW1ld29yayAqLworc3RhdGljIHZvaWQgc2V0X3ZidXNfZHJhdyhzdHJ1Y3QgZ3Bpb192YnVzX2RhdGEgKmdwaW9fdmJ1cywgdW5zaWduZWQgbUEpCit7CisJc3RydWN0IHJlZ3VsYXRvciAqdmJ1c19kcmF3ID0gZ3Bpb192YnVzLT52YnVzX2RyYXc7CisJaW50IGVuYWJsZWQ7CisKKwlpZiAoIXZidXNfZHJhdykKKwkJcmV0dXJuOworCisJZW5hYmxlZCA9IGdwaW9fdmJ1cy0+dmJ1c19kcmF3X2VuYWJsZWQ7CisJaWYgKG1BKSB7CisJCXJlZ3VsYXRvcl9zZXRfY3VycmVudF9saW1pdCh2YnVzX2RyYXcsIDAsIDEwMDAgKiBtQSk7CisJCWlmICghZW5hYmxlZCkgeworCQkJcmVndWxhdG9yX2VuYWJsZSh2YnVzX2RyYXcpOworCQkJZ3Bpb192YnVzLT52YnVzX2RyYXdfZW5hYmxlZCA9IDE7CisJCX0KKwl9IGVsc2UgeworCQlpZiAoZW5hYmxlZCkgeworCQkJcmVndWxhdG9yX2Rpc2FibGUodmJ1c19kcmF3KTsKKwkJCWdwaW9fdmJ1cy0+dmJ1c19kcmF3X2VuYWJsZWQgPSAwOworCQl9CisJfQorCWdwaW9fdmJ1cy0+bUEgPSBtQTsKK30KKworLyogVkJVUyBjaGFuZ2UgSVJRIGhhbmRsZXIgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCBncGlvX3ZidXNfaXJxKGludCBpcnEsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IGRhdGE7CisJc3RydWN0IGdwaW9fdmJ1c19tYWNoX2luZm8gKnBkYXRhID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJc3RydWN0IGdwaW9fdmJ1c19kYXRhICpncGlvX3ZidXMgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlpbnQgZ3BpbywgdmJ1czsKKworCXZidXMgPSBncGlvX2dldF92YWx1ZShwZGF0YS0+Z3Bpb192YnVzKTsKKwlpZiAocGRhdGEtPmdwaW9fdmJ1c19pbnZlcnRlZCkKKwkJdmJ1cyA9ICF2YnVzOworCisJZGV2X2RiZygmcGRldi0+ZGV2LCAiVkJVUyAlcyAoZ2FkZ2V0OiAlcylcbiIsCisJCXZidXMgPyAic3VwcGxpZWQiIDogImluYWN0aXZlIiwKKwkJZ3Bpb192YnVzLT5vdGcuZ2FkZ2V0ID8gZ3Bpb192YnVzLT5vdGcuZ2FkZ2V0LT5uYW1lIDogIm5vbmUiKTsKKworCWlmICghZ3Bpb192YnVzLT5vdGcuZ2FkZ2V0KQorCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisKKwkvKiBQZXJpcGhlcmFsIGNvbnRyb2xsZXJzIHdoaWNoIG1hbmFnZSB0aGUgcHVsbHVwIHRoZW1zZWx2ZXMgd29uJ3QgaGF2ZQorCSAqIGdwaW9fcHVsbHVwIGNvbmZpZ3VyZWQgaGVyZS4gIElmIGl0J3MgY29uZmlndXJlZCBoZXJlLCB3ZSdsbCBkbyB3aGF0CisJICogaXNwMTMwMV9vbWFwOjpiX3BlcmlwaGVyYWwoKSBkb2VzIGFuZCBlbmFibGUgdGhlIHB1bGx1cCBoZXJlLi4uIGFsdGhvdWdoCisJICogdGhhdCBtYXkgY29tcGxpY2F0ZSB1c2JfZ2FkZ2V0X3ssZGlzfWNvbm5lY3QoKSBzdXBwb3J0LgorCSAqLworCWdwaW8gPSBwZGF0YS0+Z3Bpb19wdWxsdXA7CisJaWYgKHZidXMpIHsKKwkJZ3Bpb192YnVzLT5vdGcuc3RhdGUgPSBPVEdfU1RBVEVfQl9QRVJJUEhFUkFMOworCQl1c2JfZ2FkZ2V0X3ZidXNfY29ubmVjdChncGlvX3ZidXMtPm90Zy5nYWRnZXQpOworCisJCS8qIGRyYXdpbmcgYSAidW5pdCBsb2FkIiBpcyAqYWx3YXlzKiBPSywgZXhjZXB0IGZvciBPVEcgKi8KKwkJc2V0X3ZidXNfZHJhdyhncGlvX3ZidXMsIDEwMCk7CisKKwkJLyogb3B0aW9uYWxseSBlbmFibGUgRCsgcHVsbHVwICovCisJCWlmIChncGlvX2lzX3ZhbGlkKGdwaW8pKQorCQkJZ3Bpb19zZXRfdmFsdWUoZ3BpbywgIXBkYXRhLT5ncGlvX3B1bGx1cF9pbnZlcnRlZCk7CisJfSBlbHNlIHsKKwkJLyogb3B0aW9uYWxseSBkaXNhYmxlIEQrIHB1bGx1cCAqLworCQlpZiAoZ3Bpb19pc192YWxpZChncGlvKSkKKwkJCWdwaW9fc2V0X3ZhbHVlKGdwaW8sIHBkYXRhLT5ncGlvX3B1bGx1cF9pbnZlcnRlZCk7CisKKwkJc2V0X3ZidXNfZHJhdyhncGlvX3ZidXMsIDApOworCisJCXVzYl9nYWRnZXRfdmJ1c19kaXNjb25uZWN0KGdwaW9fdmJ1cy0+b3RnLmdhZGdldCk7CisJCWdwaW9fdmJ1cy0+b3RnLnN0YXRlID0gT1RHX1NUQVRFX0JfSURMRTsKKwl9CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKy8qIE9URyB0cmFuc2NlaXZlciBpbnRlcmZhY2UgKi8KKworLyogYmluZC91bmJpbmQgdGhlIHBlcmlwaGVyYWwgY29udHJvbGxlciAqLworc3RhdGljIGludCBncGlvX3ZidXNfc2V0X3BlcmlwaGVyYWwoc3RydWN0IG90Z190cmFuc2NlaXZlciAqb3RnLAorCQkJCXN0cnVjdCB1c2JfZ2FkZ2V0ICpnYWRnZXQpCit7CisJc3RydWN0IGdwaW9fdmJ1c19kYXRhICpncGlvX3ZidXM7CisJc3RydWN0IGdwaW9fdmJ1c19tYWNoX2luZm8gKnBkYXRhOworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXY7CisJaW50IGdwaW8sIGlycTsKKworCWdwaW9fdmJ1cyA9IGNvbnRhaW5lcl9vZihvdGcsIHN0cnVjdCBncGlvX3ZidXNfZGF0YSwgb3RnKTsKKwlwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGdwaW9fdmJ1cy0+ZGV2KTsKKwlwZGF0YSA9IGdwaW9fdmJ1cy0+ZGV2LT5wbGF0Zm9ybV9kYXRhOworCWlycSA9IGdwaW9fdG9faXJxKHBkYXRhLT5ncGlvX3ZidXMpOworCWdwaW8gPSBwZGF0YS0+Z3Bpb19wdWxsdXA7CisKKwlpZiAoIWdhZGdldCkgeworCQlkZXZfZGJnKCZwZGV2LT5kZXYsICJ1bnJlZ2lzdGVyaW5nIGdhZGdldCAnJXMnXG4iLAorCQkJb3RnLT5nYWRnZXQtPm5hbWUpOworCisJCS8qIG9wdGlvbmFsbHkgZGlzYWJsZSBEKyBwdWxsdXAgKi8KKwkJaWYgKGdwaW9faXNfdmFsaWQoZ3BpbykpCisJCQlncGlvX3NldF92YWx1ZShncGlvLCBwZGF0YS0+Z3Bpb19wdWxsdXBfaW52ZXJ0ZWQpOworCisJCXNldF92YnVzX2RyYXcoZ3Bpb192YnVzLCAwKTsKKworCQl1c2JfZ2FkZ2V0X3ZidXNfZGlzY29ubmVjdChvdGctPmdhZGdldCk7CisJCW90Zy0+c3RhdGUgPSBPVEdfU1RBVEVfVU5ERUZJTkVEOworCisJCW90Zy0+Z2FkZ2V0ID0gTlVMTDsKKwkJcmV0dXJuIDA7CisJfQorCisJb3RnLT5nYWRnZXQgPSBnYWRnZXQ7CisJZGV2X2RiZygmcGRldi0+ZGV2LCAicmVnaXN0ZXJlZCBnYWRnZXQgJyVzJ1xuIiwgZ2FkZ2V0LT5uYW1lKTsKKworCS8qIGluaXRpYWxpemUgY29ubmVjdGlvbiBzdGF0ZSAqLworCWdwaW9fdmJ1c19pcnEoaXJxLCBwZGV2KTsKKwlyZXR1cm4gMDsKK30KKworLyogZWZmZWN0aXZlIGZvciBCIGRldmljZXMsIGlnbm9yZWQgZm9yIEEtcGVyaXBoZXJhbCAqLworc3RhdGljIGludCBncGlvX3ZidXNfc2V0X3Bvd2VyKHN0cnVjdCBvdGdfdHJhbnNjZWl2ZXIgKm90ZywgdW5zaWduZWQgbUEpCit7CisJc3RydWN0IGdwaW9fdmJ1c19kYXRhICpncGlvX3ZidXM7CisKKwlncGlvX3ZidXMgPSBjb250YWluZXJfb2Yob3RnLCBzdHJ1Y3QgZ3Bpb192YnVzX2RhdGEsIG90Zyk7CisKKwlpZiAob3RnLT5zdGF0ZSA9PSBPVEdfU1RBVEVfQl9QRVJJUEhFUkFMKQorCQlzZXRfdmJ1c19kcmF3KGdwaW9fdmJ1cywgbUEpOworCXJldHVybiAwOworfQorCisvKiBmb3Igbm9uLU9URyBCIGRldmljZXM6IHNldC9jbGVhciB0cmFuc2NlaXZlciBzdXNwZW5kIG1vZGUgKi8KK3N0YXRpYyBpbnQgZ3Bpb192YnVzX3NldF9zdXNwZW5kKHN0cnVjdCBvdGdfdHJhbnNjZWl2ZXIgKm90ZywgaW50IHN1c3BlbmQpCit7CisJc3RydWN0IGdwaW9fdmJ1c19kYXRhICpncGlvX3ZidXM7CisKKwlncGlvX3ZidXMgPSBjb250YWluZXJfb2Yob3RnLCBzdHJ1Y3QgZ3Bpb192YnVzX2RhdGEsIG90Zyk7CisKKwkvKiBkcmF3IG1heCAwIG1BIGZyb20gdmJ1cyBpbiBzdXNwZW5kIG1vZGU7IG9yIHRoZSBwcmV2aW91c2x5CisJICogcmVjb3JkZWQgYW1vdW50IG9mIGN1cnJlbnQgaWYgbm90IHN1c3BlbmRlZAorCSAqCisJICogTk9URTogaGlnaCBwb3dlcmVkIGNvbmZpZ3MgKG1BID4gMTAwKSBtYXkgZHJhdyB1cCB0byAyLjUgbUEKKwkgKiBpZiB0aGV5J3JlIHdha2UtZW5hYmxlZCAuLi4gd2UgZG9uJ3QgaGFuZGxlIHRoYXQgeWV0LgorCSAqLworCXJldHVybiBncGlvX3ZidXNfc2V0X3Bvd2VyKG90Zywgc3VzcGVuZCA/IDAgOiBncGlvX3ZidXMtPm1BKTsKK30KKworLyogcGxhdGZvcm0gZHJpdmVyIGludGVyZmFjZSAqLworCitzdGF0aWMgaW50IF9faW5pdCBncGlvX3ZidXNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgZ3Bpb192YnVzX21hY2hfaW5mbyAqcGRhdGEgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlzdHJ1Y3QgZ3Bpb192YnVzX2RhdGEgKmdwaW9fdmJ1czsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKwlpbnQgZXJyLCBncGlvLCBpcnE7CisKKwlpZiAoIXBkYXRhIHx8ICFncGlvX2lzX3ZhbGlkKHBkYXRhLT5ncGlvX3ZidXMpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlncGlvID0gcGRhdGEtPmdwaW9fdmJ1czsKKworCWdwaW9fdmJ1cyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBncGlvX3ZidXNfZGF0YSksIEdGUF9LRVJORUwpOworCWlmICghZ3Bpb192YnVzKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGdwaW9fdmJ1cyk7CisJZ3Bpb192YnVzLT5kZXYgPSAmcGRldi0+ZGV2OworCWdwaW9fdmJ1cy0+b3RnLmxhYmVsID0gImdwaW8tdmJ1cyI7CisJZ3Bpb192YnVzLT5vdGcuc3RhdGUgPSBPVEdfU1RBVEVfVU5ERUZJTkVEOworCWdwaW9fdmJ1cy0+b3RnLnNldF9wZXJpcGhlcmFsID0gZ3Bpb192YnVzX3NldF9wZXJpcGhlcmFsOworCWdwaW9fdmJ1cy0+b3RnLnNldF9wb3dlciA9IGdwaW9fdmJ1c19zZXRfcG93ZXI7CisJZ3Bpb192YnVzLT5vdGcuc2V0X3N1c3BlbmQgPSBncGlvX3ZidXNfc2V0X3N1c3BlbmQ7CisKKwllcnIgPSBncGlvX3JlcXVlc3QoZ3BpbywgInZidXNfZGV0ZWN0Iik7CisJaWYgKGVycikgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjYW4ndCByZXF1ZXN0IHZidXMgZ3BpbyAlZCwgZXJyOiAlZFxuIiwKKwkJCWdwaW8sIGVycik7CisJCWdvdG8gZXJyX2dwaW87CisJfQorCWdwaW9fZGlyZWN0aW9uX2lucHV0KGdwaW8pOworCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfSVJRLCAwKTsKKwlpZiAocmVzKSB7CisJCWlycSA9IHJlcy0+c3RhcnQ7CisJCXJlcy0+ZmxhZ3MgJj0gSVJRRl9UUklHR0VSX01BU0s7CisJCXJlcy0+ZmxhZ3MgfD0gSVJRRl9TQU1QTEVfUkFORE9NIHwgSVJRRl9TSEFSRUQ7CisJfSBlbHNlCisJCWlycSA9IGdwaW9fdG9faXJxKGdwaW8pOworCisJLyogaWYgZGF0YSBsaW5lIHB1bGx1cCBpcyBpbiB1c2UsIGluaXRpYWxpemUgaXQgdG8gIm5vdCBwdWxsaW5nIHVwIiAqLworCWdwaW8gPSBwZGF0YS0+Z3Bpb19wdWxsdXA7CisJaWYgKGdwaW9faXNfdmFsaWQoZ3BpbykpIHsKKwkJZXJyID0gZ3Bpb19yZXF1ZXN0KGdwaW8sICJ1ZGNfcHVsbHVwIik7CisJCWlmIChlcnIpIHsKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwKKwkJCQkiY2FuJ3QgcmVxdWVzdCBwdWxsdXAgZ3BpbyAlZCwgZXJyOiAlZFxuIiwKKwkJCQlncGlvLCBlcnIpOworCQkJZ3Bpb19mcmVlKHBkYXRhLT5ncGlvX3ZidXMpOworCQkJZ290byBlcnJfZ3BpbzsKKwkJfQorCQlncGlvX2RpcmVjdGlvbl9vdXRwdXQoZ3BpbywgcGRhdGEtPmdwaW9fcHVsbHVwX2ludmVydGVkKTsKKwl9CisKKwllcnIgPSByZXF1ZXN0X2lycShpcnEsIGdwaW9fdmJ1c19pcnEsIFZCVVNfSVJRX0ZMQUdTLAorCQkidmJ1c19kZXRlY3QiLCBwZGV2KTsKKwlpZiAoZXJyKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImNhbid0IHJlcXVlc3QgaXJxICVpLCBlcnI6ICVkXG4iLAorCQkJaXJxLCBlcnIpOworCQlnb3RvIGVycl9pcnE7CisJfQorCisJLyogb25seSBhY3RpdmUgd2hlbiBhIGdhZGdldCBpcyByZWdpc3RlcmVkICovCisJZXJyID0gb3RnX3NldF90cmFuc2NlaXZlcigmZ3Bpb192YnVzLT5vdGcpOworCWlmIChlcnIpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiY2FuJ3QgcmVnaXN0ZXIgdHJhbnNjZWl2ZXIsIGVycjogJWRcbiIsCisJCQllcnIpOworCQlnb3RvIGVycl9vdGc7CisJfQorCisJZ3Bpb192YnVzLT52YnVzX2RyYXcgPSByZWd1bGF0b3JfZ2V0KCZwZGV2LT5kZXYsICJ2YnVzX2RyYXciKTsKKwlpZiAoSVNfRVJSKGdwaW9fdmJ1cy0+dmJ1c19kcmF3KSkgeworCQlkZXZfZGJnKCZwZGV2LT5kZXYsICJjYW4ndCBnZXQgdmJ1c19kcmF3IHJlZ3VsYXRvciwgZXJyOiAlbGRcbiIsCisJCQlQVFJfRVJSKGdwaW9fdmJ1cy0+dmJ1c19kcmF3KSk7CisJCWdwaW9fdmJ1cy0+dmJ1c19kcmF3ID0gTlVMTDsKKwl9CisKKwlyZXR1cm4gMDsKK2Vycl9vdGc6CisJZnJlZV9pcnEoaXJxLCAmcGRldi0+ZGV2KTsKK2Vycl9pcnE6CisJaWYgKGdwaW9faXNfdmFsaWQocGRhdGEtPmdwaW9fcHVsbHVwKSkKKwkJZ3Bpb19mcmVlKHBkYXRhLT5ncGlvX3B1bGx1cCk7CisJZ3Bpb19mcmVlKHBkYXRhLT5ncGlvX3ZidXMpOworZXJyX2dwaW86CisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisJa2ZyZWUoZ3Bpb192YnVzKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IF9fZXhpdCBncGlvX3ZidXNfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGdwaW9fdmJ1c19kYXRhICpncGlvX3ZidXMgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgZ3Bpb192YnVzX21hY2hfaW5mbyAqcGRhdGEgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlpbnQgZ3BpbyA9IHBkYXRhLT5ncGlvX3ZidXM7CisKKwlyZWd1bGF0b3JfcHV0KGdwaW9fdmJ1cy0+dmJ1c19kcmF3KTsKKworCW90Z19zZXRfdHJhbnNjZWl2ZXIoTlVMTCk7CisKKwlmcmVlX2lycShncGlvX3RvX2lycShncGlvKSwgJnBkZXYtPmRldik7CisJaWYgKGdwaW9faXNfdmFsaWQocGRhdGEtPmdwaW9fcHVsbHVwKSkKKwkJZ3Bpb19mcmVlKHBkYXRhLT5ncGlvX3B1bGx1cCk7CisJZ3Bpb19mcmVlKGdwaW8pOworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCWtmcmVlKGdwaW9fdmJ1cyk7CisKKwlyZXR1cm4gMDsKK30KKworLyogTk9URTogIHRoZSBncGlvLXZidXMgZGV2aWNlIG1heSAqTk9UKiBiZSBob3RwbHVnZ2VkICovCisKK01PRFVMRV9BTElBUygicGxhdGZvcm06Z3Bpby12YnVzIik7CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGdwaW9fdmJ1c19kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgID0gImdwaW8tdmJ1cyIsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCX0sCisJLnJlbW92ZSAgPSBfX2V4aXRfcChncGlvX3ZidXNfcmVtb3ZlKSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGdwaW9fdmJ1c19pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9wcm9iZSgmZ3Bpb192YnVzX2RyaXZlciwgZ3Bpb192YnVzX3Byb2JlKTsKK30KK21vZHVsZV9pbml0KGdwaW9fdmJ1c19pbml0KTsKKworc3RhdGljIHZvaWQgX19leGl0IGdwaW9fdmJ1c19leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmdwaW9fdmJ1c19kcml2ZXIpOworfQorbW9kdWxlX2V4aXQoZ3Bpb192YnVzX2V4aXQpOworCitNT0RVTEVfREVTQ1JJUFRJT04oInNpbXBsZSBHUElPIGNvbnRyb2xsZWQgT1RHIHRyYW5zY2VpdmVyIGRyaXZlciIpOworTU9EVUxFX0FVVEhPUigiUGhpbGlwcCBaYWJlbCIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvY2hpcHMvaXNwMTMwMV9vbWFwLmMgYi9kcml2ZXJzL3VzYi9vdGcvaXNwMTMwMV9vbWFwLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvaTJjL2NoaXBzL2lzcDEzMDFfb21hcC5jCnJlbmFtZSB0byBkcml2ZXJzL3VzYi9vdGcvaXNwMTMwMV9vbWFwLmMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL290Zy9vdGcuYyBiL2RyaXZlcnMvdXNiL290Zy9vdGcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjMxOGZhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy91c2Ivb3RnL290Zy5jCkBAIC0wLDAgKzEsNjUgQEAKKy8qCisgKiBvdGcuYyAtLSBVU0IgT1RHIHV0aWxpdHkgY29kZQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNCBUZXhhcyBJbnN0cnVtZW50cworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorCisjaW5jbHVkZSA8bGludXgvdXNiL290Zy5oPgorCitzdGF0aWMgc3RydWN0IG90Z190cmFuc2NlaXZlciAqeGNlaXY7CisKKy8qKgorICogb3RnX2dldF90cmFuc2NlaXZlciAtIGZpbmQgdGhlIChzaW5nbGUpIE9URyB0cmFuc2NlaXZlcgorICoKKyAqIFJldHVybnMgdGhlIHRyYW5zY2VpdmVyIGRyaXZlciwgYWZ0ZXIgZ2V0dGluZyBhIHJlZmNvdW50IHRvIGl0OyBvcgorICogbnVsbCBpZiB0aGVyZSBpcyBubyBzdWNoIHRyYW5zY2VpdmVyLiAgVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IKKyAqIGNhbGxpbmcgb3RnX3B1dF90cmFuc2NlaXZlcigpIHRvIHJlbGVhc2UgdGhhdCBjb3VudC4KKyAqCisgKiBGb3IgdXNlIGJ5IFVTQiBob3N0IGFuZCBwZXJpcGhlcmFsIGRyaXZlcnMuCisgKi8KK3N0cnVjdCBvdGdfdHJhbnNjZWl2ZXIgKm90Z19nZXRfdHJhbnNjZWl2ZXIodm9pZCkKK3sKKwlpZiAoeGNlaXYpCisJCWdldF9kZXZpY2UoeGNlaXYtPmRldik7CisJcmV0dXJuIHhjZWl2OworfQorRVhQT1JUX1NZTUJPTChvdGdfZ2V0X3RyYW5zY2VpdmVyKTsKKworLyoqCisgKiBvdGdfcHV0X3RyYW5zY2VpdmVyIC0gcmVsZWFzZSB0aGUgKHNpbmdsZSkgT1RHIHRyYW5zY2VpdmVyCisgKiBAeDogdGhlIHRyYW5zY2VpdmVyIHJldHVybmVkIGJ5IG90Z19nZXRfdHJhbnNjZWl2ZXIoKQorICoKKyAqIFJlbGVhc2VzIGEgcmVmY291bnQgdGhlIGNhbGxlciByZWNlaXZlZCBmcm9tIG90Z19nZXRfdHJhbnNjZWl2ZXIoKS4KKyAqCisgKiBGb3IgdXNlIGJ5IFVTQiBob3N0IGFuZCBwZXJpcGhlcmFsIGRyaXZlcnMuCisgKi8KK3ZvaWQgb3RnX3B1dF90cmFuc2NlaXZlcihzdHJ1Y3Qgb3RnX3RyYW5zY2VpdmVyICp4KQoreworCXB1dF9kZXZpY2UoeC0+ZGV2KTsKK30KK0VYUE9SVF9TWU1CT0wob3RnX3B1dF90cmFuc2NlaXZlcik7CisKKy8qKgorICogb3RnX3NldF90cmFuc2NlaXZlciAtIGRlY2xhcmUgdGhlIChzaW5nbGUpIE9URyB0cmFuc2NlaXZlcgorICogQHg6IHRoZSBVU0IgT1RHIHRyYW5zY2VpdmVyIHRvIGJlIHVzZWQ7IG9yIE5VTEwKKyAqCisgKiBUaGlzIGNhbGwgaXMgZXhjbHVzaXZlbHkgZm9yIHVzZSBieSB0cmFuc2NlaXZlciBkcml2ZXJzLCB3aGljaAorICogY29vcmRpbmF0ZSB0aGUgYWN0aXZpdGllcyBvZiBkcml2ZXJzIGZvciBob3N0IGFuZCBwZXJpcGhlcmFsCisgKiBjb250cm9sbGVycywgYW5kIGluIHNvbWUgY2FzZXMgZm9yIFZCVVMgY3VycmVudCByZWd1bGF0aW9uLgorICovCitpbnQgb3RnX3NldF90cmFuc2NlaXZlcihzdHJ1Y3Qgb3RnX3RyYW5zY2VpdmVyICp4KQoreworCWlmICh4Y2VpdiAmJiB4KQorCQlyZXR1cm4gLUVCVVNZOworCXhjZWl2ID0geDsKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0wob3RnX3NldF90cmFuc2NlaXZlcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9vdGcvdHdsNDAzMC11c2IuYyBiL2RyaXZlcnMvdXNiL290Zy90d2w0MDMwLXVzYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxNmU0NDEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3VzYi9vdGcvdHdsNDAzMC11c2IuYwpAQCAtMCwwICsxLDcyMSBAQAorLyoKKyAqIHR3bDQwMzBfdXNiIC0gVFdMNDAzMCBVU0IgdHJhbnNjZWl2ZXIsIHRhbGtpbmcgdG8gT01BUCBPVEcgY29udHJvbGxlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDA3IFRleGFzIEluc3RydW1lbnRzCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggTm9raWEgQ29ycG9yYXRpb24KKyAqIENvbnRhY3Q6IEZlbGlwZSBCYWxiaSA8ZmVsaXBlLmJhbGJpQG5va2lhLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqCisgKiBDdXJyZW50IHN0YXR1czoKKyAqCS0gSFMgVVNCIFVMUEkgbW9kZSB3b3Jrcy4KKyAqCS0gMy1waW4gbW9kZSBzdXBwb3J0IG1heSBiZSBhZGRlZCBpbiBmdXR1cmUuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC91c2Ivb3RnLmg+CisjaW5jbHVkZSA8bGludXgvaTJjL3R3bDQwMzAuaD4KKworCisvKiBSZWdpc3RlciBkZWZpbmVzICovCisKKyNkZWZpbmUgVkVORE9SX0lEX0xPCQkJMHgwMAorI2RlZmluZSBWRU5ET1JfSURfSEkJCQkweDAxCisjZGVmaW5lIFBST0RVQ1RfSURfTE8JCQkweDAyCisjZGVmaW5lIFBST0RVQ1RfSURfSEkJCQkweDAzCisKKyNkZWZpbmUgRlVOQ19DVFJMCQkJMHgwNAorI2RlZmluZSBGVU5DX0NUUkxfU0VUCQkJMHgwNQorI2RlZmluZSBGVU5DX0NUUkxfQ0xSCQkJMHgwNgorI2RlZmluZSBGVU5DX0NUUkxfU1VTUEVORE0JCSgxIDw8IDYpCisjZGVmaW5lIEZVTkNfQ1RSTF9SRVNFVAkJCSgxIDw8IDUpCisjZGVmaW5lIEZVTkNfQ1RSTF9PUE1PREVfTUFTSwkJKDMgPDwgMykgLyogYml0cyAzIGFuZCA0ICovCisjZGVmaW5lIEZVTkNfQ1RSTF9PUE1PREVfTk9STUFMCQkoMCA8PCAzKQorI2RlZmluZSBGVU5DX0NUUkxfT1BNT0RFX05PTkRSSVZJTkcJKDEgPDwgMykKKyNkZWZpbmUgRlVOQ19DVFJMX09QTU9ERV9ESVNBQkxFX0JJVF9OUlpJCSgyIDw8IDMpCisjZGVmaW5lIEZVTkNfQ1RSTF9URVJNU0VMRUNUCQkoMSA8PCAyKQorI2RlZmluZSBGVU5DX0NUUkxfWENWUlNFTEVDVF9NQVNLCSgzIDw8IDApIC8qIGJpdHMgMCBhbmQgMSAqLworI2RlZmluZSBGVU5DX0NUUkxfWENWUlNFTEVDVF9IUwkJKDAgPDwgMCkKKyNkZWZpbmUgRlVOQ19DVFJMX1hDVlJTRUxFQ1RfRlMJCSgxIDw8IDApCisjZGVmaW5lIEZVTkNfQ1RSTF9YQ1ZSU0VMRUNUX0xTCQkoMiA8PCAwKQorI2RlZmluZSBGVU5DX0NUUkxfWENWUlNFTEVDVF9GUzRMUwkoMyA8PCAwKQorCisjZGVmaW5lIElGQ19DVFJMCQkJMHgwNworI2RlZmluZSBJRkNfQ1RSTF9TRVQJCQkweDA4CisjZGVmaW5lIElGQ19DVFJMX0NMUgkJCTB4MDkKKyNkZWZpbmUgSUZDX0NUUkxfSU5URVJGQUNFX1BST1RFQ1RfRElTQUJMRQkoMSA8PCA3KQorI2RlZmluZSBJRkNfQ1RSTF9BVVRPUkVTVU1FCQkoMSA8PCA0KQorI2RlZmluZSBJRkNfQ1RSTF9DTE9DS1NVU1BFTkRNCQkoMSA8PCAzKQorI2RlZmluZSBJRkNfQ1RSTF9DQVJLSVRNT0RFCQkoMSA8PCAyKQorI2RlZmluZSBJRkNfQ1RSTF9GU0xTU0VSSUFMTU9ERV8zUElOCSgxIDw8IDEpCisKKyNkZWZpbmUgVFdMNDAzMF9PVEdfQ1RSTAkJMHgwQQorI2RlZmluZSBUV0w0MDMwX09UR19DVFJMX1NFVAkJMHgwQgorI2RlZmluZSBUV0w0MDMwX09UR19DVFJMX0NMUgkJMHgwQworI2RlZmluZSBUV0w0MDMwX09UR19DVFJMX0RSVlZCVVMJKDEgPDwgNSkKKyNkZWZpbmUgVFdMNDAzMF9PVEdfQ1RSTF9DSFJHVkJVUwkoMSA8PCA0KQorI2RlZmluZSBUV0w0MDMwX09UR19DVFJMX0RJU0NIUkdWQlVTCSgxIDw8IDMpCisjZGVmaW5lIFRXTDQwMzBfT1RHX0NUUkxfRE1QVUxMRE9XTgkoMSA8PCAyKQorI2RlZmluZSBUV0w0MDMwX09UR19DVFJMX0RQUFVMTERPV04JKDEgPDwgMSkKKyNkZWZpbmUgVFdMNDAzMF9PVEdfQ1RSTF9JRFBVTExVUAkoMSA8PCAwKQorCisjZGVmaW5lIFVTQl9JTlRfRU5fUklTRQkJCTB4MEQKKyNkZWZpbmUgVVNCX0lOVF9FTl9SSVNFX1NFVAkJMHgwRQorI2RlZmluZSBVU0JfSU5UX0VOX1JJU0VfQ0xSCQkweDBGCisjZGVmaW5lIFVTQl9JTlRfRU5fRkFMTAkJCTB4MTAKKyNkZWZpbmUgVVNCX0lOVF9FTl9GQUxMX1NFVAkJMHgxMQorI2RlZmluZSBVU0JfSU5UX0VOX0ZBTExfQ0xSCQkweDEyCisjZGVmaW5lIFVTQl9JTlRfU1RTCQkJMHgxMworI2RlZmluZSBVU0JfSU5UX0xBVENICQkJMHgxNAorI2RlZmluZSBVU0JfSU5UX0lER05ECQkJKDEgPDwgNCkKKyNkZWZpbmUgVVNCX0lOVF9TRVNTRU5ECQkJKDEgPDwgMykKKyNkZWZpbmUgVVNCX0lOVF9TRVNTVkFMSUQJCSgxIDw8IDIpCisjZGVmaW5lIFVTQl9JTlRfVkJVU1ZBTElECQkoMSA8PCAxKQorI2RlZmluZSBVU0JfSU5UX0hPU1RESVNDT05ORUNUCQkoMSA8PCAwKQorCisjZGVmaW5lIENBUktJVF9DVFJMCQkJMHgxOQorI2RlZmluZSBDQVJLSVRfQ1RSTF9TRVQJCQkweDFBCisjZGVmaW5lIENBUktJVF9DVFJMX0NMUgkJCTB4MUIKKyNkZWZpbmUgQ0FSS0lUX0NUUkxfTUlDRU4JCSgxIDw8IDYpCisjZGVmaW5lIENBUktJVF9DVFJMX1NQS1JJR0hURU4JCSgxIDw8IDUpCisjZGVmaW5lIENBUktJVF9DVFJMX1NQS0xFRlRFTgkJKDEgPDwgNCkKKyNkZWZpbmUgQ0FSS0lUX0NUUkxfUlhERU4JCSgxIDw8IDMpCisjZGVmaW5lIENBUktJVF9DVFJMX1RYREVOCQkoMSA8PCAyKQorI2RlZmluZSBDQVJLSVRfQ1RSTF9JREdORERSVgkJKDEgPDwgMSkKKyNkZWZpbmUgQ0FSS0lUX0NUUkxfQ0FSS0lUUFdSCQkoMSA8PCAwKQorI2RlZmluZSBDQVJLSVRfUExTX0NUUkwJCQkweDIyCisjZGVmaW5lIENBUktJVF9QTFNfQ1RSTF9TRVQJCTB4MjMKKyNkZWZpbmUgQ0FSS0lUX1BMU19DVFJMX0NMUgkJMHgyNAorI2RlZmluZSBDQVJLSVRfUExTX0NUUkxfU1BLUlJJR0hUX0JJQVNFTgkoMSA8PCAzKQorI2RlZmluZSBDQVJLSVRfUExTX0NUUkxfU1BLUkxFRlRfQklBU0VOCSgxIDw8IDIpCisjZGVmaW5lIENBUktJVF9QTFNfQ1RSTF9SWFBMU0VOCQkoMSA8PCAxKQorI2RlZmluZSBDQVJLSVRfUExTX0NUUkxfVFhQTFNFTgkJKDEgPDwgMCkKKworI2RlZmluZSBNQ1BDX0NUUkwJCQkweDMwCisjZGVmaW5lIE1DUENfQ1RSTF9TRVQJCQkweDMxCisjZGVmaW5lIE1DUENfQ1RSTF9DTFIJCQkweDMyCisjZGVmaW5lIE1DUENfQ1RSTF9SVFNPTAkJCSgxIDw8IDcpCisjZGVmaW5lIE1DUENfQ1RSTF9FWFRTV1IJCSgxIDw8IDYpCisjZGVmaW5lIE1DUENfQ1RSTF9FWFRTV0MJCSgxIDw8IDUpCisjZGVmaW5lIE1DUENfQ1RSTF9WT0lDRVNXCQkoMSA8PCA0KQorI2RlZmluZSBNQ1BDX0NUUkxfT1VUNjRLCQkoMSA8PCAzKQorI2RlZmluZSBNQ1BDX0NUUkxfUlRTQ1RTU1cJCSgxIDw8IDIpCisjZGVmaW5lIE1DUENfQ1RSTF9IU19VQVJUCQkoMSA8PCAwKQorCisjZGVmaW5lIE1DUENfSU9fQ1RSTAkJCTB4MzMKKyNkZWZpbmUgTUNQQ19JT19DVFJMX1NFVAkJMHgzNAorI2RlZmluZSBNQ1BDX0lPX0NUUkxfQ0xSCQkweDM1CisjZGVmaW5lIE1DUENfSU9fQ1RSTF9NSUNCSUFTRU4JCSgxIDw8IDUpCisjZGVmaW5lIE1DUENfSU9fQ1RSTF9DVFNfTlBVCQkoMSA8PCA0KQorI2RlZmluZSBNQ1BDX0lPX0NUUkxfUlhEX1BVCQkoMSA8PCAzKQorI2RlZmluZSBNQ1BDX0lPX0NUUkxfVFhEVFlQCQkoMSA8PCAyKQorI2RlZmluZSBNQ1BDX0lPX0NUUkxfQ1RTVFlQCQkoMSA8PCAxKQorI2RlZmluZSBNQ1BDX0lPX0NUUkxfUlRTVFlQCQkoMSA8PCAwKQorCisjZGVmaW5lIE1DUENfQ1RSTDIJCQkweDM2CisjZGVmaW5lIE1DUENfQ1RSTDJfU0VUCQkJMHgzNworI2RlZmluZSBNQ1BDX0NUUkwyX0NMUgkJCTB4MzgKKyNkZWZpbmUgTUNQQ19DVFJMMl9NQ1BDX0NLX0VOCQkoMSA8PCAwKQorCisjZGVmaW5lIE9USEVSX0ZVTkNfQ1RSTAkJCTB4ODAKKyNkZWZpbmUgT1RIRVJfRlVOQ19DVFJMX1NFVAkJMHg4MQorI2RlZmluZSBPVEhFUl9GVU5DX0NUUkxfQ0xSCQkweDgyCisjZGVmaW5lIE9USEVSX0ZVTkNfQ1RSTF9CRElTX0FDT05fRU4JKDEgPDwgNCkKKyNkZWZpbmUgT1RIRVJfRlVOQ19DVFJMX0ZJVkVXSVJFX01PREUJKDEgPDwgMikKKworI2RlZmluZSBPVEhFUl9JRkNfQ1RSTAkJCTB4ODMKKyNkZWZpbmUgT1RIRVJfSUZDX0NUUkxfU0VUCQkweDg0CisjZGVmaW5lIE9USEVSX0lGQ19DVFJMX0NMUgkJMHg4NQorI2RlZmluZSBPVEhFUl9JRkNfQ1RSTF9PRV9JTlRfRU4JKDEgPDwgNikKKyNkZWZpbmUgT1RIRVJfSUZDX0NUUkxfQ0VBMjAxMV9NT0RFCSgxIDw8IDUpCisjZGVmaW5lIE9USEVSX0lGQ19DVFJMX0ZTTFNTRVJJQUxNT0RFXzRQSU4JKDEgPDwgNCkKKyNkZWZpbmUgT1RIRVJfSUZDX0NUUkxfSElaX1VMUElfNjBNSFpfT1VUCSgxIDw8IDMpCisjZGVmaW5lIE9USEVSX0lGQ19DVFJMX0hJWl9VTFBJCQkoMSA8PCAyKQorI2RlZmluZSBPVEhFUl9JRkNfQ1RSTF9BTFRfSU5UX1JFUk9VVEUJKDEgPDwgMCkKKworI2RlZmluZSBPVEhFUl9JTlRfRU5fUklTRQkJMHg4NgorI2RlZmluZSBPVEhFUl9JTlRfRU5fUklTRV9TRVQJCTB4ODcKKyNkZWZpbmUgT1RIRVJfSU5UX0VOX1JJU0VfQ0xSCQkweDg4CisjZGVmaW5lIE9USEVSX0lOVF9FTl9GQUxMCQkweDg5CisjZGVmaW5lIE9USEVSX0lOVF9FTl9GQUxMX1NFVAkJMHg4QQorI2RlZmluZSBPVEhFUl9JTlRfRU5fRkFMTF9DTFIJCTB4OEIKKyNkZWZpbmUgT1RIRVJfSU5UX1NUUwkJCTB4OEMKKyNkZWZpbmUgT1RIRVJfSU5UX0xBVENICQkJMHg4RAorI2RlZmluZSBPVEhFUl9JTlRfVkJfU0VTU19WTEQJCSgxIDw8IDcpCisjZGVmaW5lIE9USEVSX0lOVF9ETV9ISQkJCSgxIDw8IDYpIC8qIG5vdCB2YWxpZCBmb3IgImxhdGNoIiByZWcgKi8KKyNkZWZpbmUgT1RIRVJfSU5UX0RQX0hJCQkJKDEgPDwgNSkgLyogbm90IHZhbGlkIGZvciAibGF0Y2giIHJlZyAqLworI2RlZmluZSBPVEhFUl9JTlRfQkRJU19BQ09OCQkoMSA8PCAzKSAvKiBub3QgdmFsaWQgZm9yICJmYWxsIiByZWdzICovCisjZGVmaW5lIE9USEVSX0lOVF9NQU5VCQkJKDEgPDwgMSkKKyNkZWZpbmUgT1RIRVJfSU5UX0FCTk9STUFMX1NUUkVTUwkoMSA8PCAwKQorCisjZGVmaW5lIElEX1NUQVRVUwkJCTB4OTYKKyNkZWZpbmUgSURfUkVTX0ZMT0FUCQkJKDEgPDwgNCkKKyNkZWZpbmUgSURfUkVTXzQ0MEsJCQkoMSA8PCAzKQorI2RlZmluZSBJRF9SRVNfMjAwSwkJCSgxIDw8IDIpCisjZGVmaW5lIElEX1JFU18xMDJLCQkJKDEgPDwgMSkKKyNkZWZpbmUgSURfUkVTX0dORAkJCSgxIDw8IDApCisKKyNkZWZpbmUgUE9XRVJfQ1RSTAkJCTB4QUMKKyNkZWZpbmUgUE9XRVJfQ1RSTF9TRVQJCQkweEFECisjZGVmaW5lIFBPV0VSX0NUUkxfQ0xSCQkJMHhBRQorI2RlZmluZSBQT1dFUl9DVFJMX09UR19FTkFCCQkoMSA8PCA1KQorCisjZGVmaW5lIE9USEVSX0lGQ19DVFJMMgkJCTB4QUYKKyNkZWZpbmUgT1RIRVJfSUZDX0NUUkwyX1NFVAkJMHhCMAorI2RlZmluZSBPVEhFUl9JRkNfQ1RSTDJfQ0xSCQkweEIxCisjZGVmaW5lIE9USEVSX0lGQ19DVFJMMl9VTFBJX1NUUF9MT1cJKDEgPDwgNCkKKyNkZWZpbmUgT1RIRVJfSUZDX0NUUkwyX1VMUElfVFhFTl9QT0wJKDEgPDwgMykKKyNkZWZpbmUgT1RIRVJfSUZDX0NUUkwyX1VMUElfNFBJTl8yNDMwCSgxIDw8IDIpCisjZGVmaW5lIE9USEVSX0lGQ19DVFJMMl9VU0JfSU5UX09VVFNFTF9NQVNLCSgzIDw8IDApIC8qIGJpdHMgMCBhbmQgMSAqLworI2RlZmluZSBPVEhFUl9JRkNfQ1RSTDJfVVNCX0lOVF9PVVRTRUxfSU5UMU4JKDAgPDwgMCkKKyNkZWZpbmUgT1RIRVJfSUZDX0NUUkwyX1VTQl9JTlRfT1VUU0VMX0lOVDJOCSgxIDw8IDApCisKKyNkZWZpbmUgUkVHX0NUUkxfRU4JCQkweEIyCisjZGVmaW5lIFJFR19DVFJMX0VOX1NFVAkJCTB4QjMKKyNkZWZpbmUgUkVHX0NUUkxfRU5fQ0xSCQkJMHhCNAorI2RlZmluZSBSRUdfQ1RSTF9FUlJPUgkJCTB4QjUKKyNkZWZpbmUgVUxQSV9JMkNfQ09ORkxJQ1RfSU5URU4JCSgxIDw8IDApCisKKyNkZWZpbmUgT1RIRVJfRlVOQ19DVFJMMgkJMHhCOAorI2RlZmluZSBPVEhFUl9GVU5DX0NUUkwyX1NFVAkJMHhCOQorI2RlZmluZSBPVEhFUl9GVU5DX0NUUkwyX0NMUgkJMHhCQQorI2RlZmluZSBPVEhFUl9GVU5DX0NUUkwyX1ZCQVRfVElNRVJfRU4JKDEgPDwgMCkKKworLyogZm9sbG93aW5nIHJlZ2lzdGVycyBkbyBub3QgaGF2ZSBzZXBhcmF0ZSBfY2xyIGFuZCBfc2V0IHJlZ2lzdGVycyAqLworI2RlZmluZSBWQlVTX0RFQk9VTkNFCQkJMHhDMAorI2RlZmluZSBJRF9ERUJPVU5DRQkJCTB4QzEKKyNkZWZpbmUgVkJBVF9USU1FUgkJCTB4RDMKKyNkZWZpbmUgUEhZX1BXUl9DVFJMCQkJMHhGRAorI2RlZmluZSBQSFlfUFdSX1BIWVBXRAkJCSgxIDw8IDApCisjZGVmaW5lIFBIWV9DTEtfQ1RSTAkJCTB4RkUKKyNkZWZpbmUgUEhZX0NMS19DVFJMX0NMT0NLR0FUSU5HX0VOCSgxIDw8IDIpCisjZGVmaW5lIFBIWV9DTEtfQ1RSTF9DTEszMktfRU4JCSgxIDw8IDEpCisjZGVmaW5lIFJFUV9QSFlfRFBMTF9DTEsJCSgxIDw8IDApCisjZGVmaW5lIFBIWV9DTEtfQ1RSTF9TVFMJCTB4RkYKKyNkZWZpbmUgUEhZX0RQTExfQ0xLCQkJKDEgPDwgMCkKKworLyogSW4gbW9kdWxlIFRXTDQwMzBfTU9EVUxFX1BNX01BU1RFUiAqLworI2RlZmluZSBQUk9URUNUX0tFWQkJCTB4MEUKKworLyogSW4gbW9kdWxlIFRXTDQwMzBfTU9EVUxFX1BNX1JFQ0VJVkVSICovCisjZGVmaW5lIFZVU0JfREVESUNBVEVEMQkJCTB4N0QKKyNkZWZpbmUgVlVTQl9ERURJQ0FURUQyCQkJMHg3RQorI2RlZmluZSBWVVNCMVY1X0RFVl9HUlAJCQkweDcxCisjZGVmaW5lIFZVU0IxVjVfVFlQRQkJCTB4NzIKKyNkZWZpbmUgVlVTQjFWNV9SRU1BUAkJCTB4NzMKKyNkZWZpbmUgVlVTQjFWOF9ERVZfR1JQCQkJMHg3NAorI2RlZmluZSBWVVNCMVY4X1RZUEUJCQkweDc1CisjZGVmaW5lIFZVU0IxVjhfUkVNQVAJCQkweDc2CisjZGVmaW5lIFZVU0IzVjFfREVWX0dSUAkJCTB4NzcKKyNkZWZpbmUgVlVTQjNWMV9UWVBFCQkJMHg3OAorI2RlZmluZSBWVVNCM1YxX1JFTUFQCQkJMHg3OQorCisvKiBJbiBtb2R1bGUgVFdMNDAzMF9NT0RVTEVfSU5UQlIgKi8KKyNkZWZpbmUgUE1CUjEJCQkJMHgwRAorI2RlZmluZSBHUElPX1VTQl80UElOX1VMUElfMjQzMEMJKDMgPDwgMCkKKworCisKK2VudW0gbGlua3N0YXQgeworCVVTQl9MSU5LX1VOS05PV04gPSAwLAorCVVTQl9MSU5LX05PTkUsCisJVVNCX0xJTktfVkJVUywKKwlVU0JfTElOS19JRCwKK307CisKK3N0cnVjdCB0d2w0MDMwX3VzYiB7CisJc3RydWN0IG90Z190cmFuc2NlaXZlcglvdGc7CisJc3RydWN0IGRldmljZQkJKmRldjsKKworCS8qIGZvciB2YnVzIHJlcG9ydGluZyB3aXRoIGlycXMgZGlzYWJsZWQgKi8KKwlzcGlubG9ja190CQlsb2NrOworCisJLyogcGluIGNvbmZpZ3VyYXRpb24gKi8KKwllbnVtIHR3bDQwMzBfdXNiX21vZGUJdXNiX21vZGU7CisKKwlpbnQJCQlpcnE7CisJdTgJCQlsaW5rc3RhdDsKKwl1OAkJCWFzbGVlcDsKKwlib29sCQkJaXJxX2VuYWJsZWQ7Cit9OworCisvKiBpbnRlcm5hbCBkZWZpbmUgb24gdG9wIG9mIGNvbnRhaW5lcl9vZiAqLworI2RlZmluZSB4Y2Vpdl90b190d2woeCkJCWNvbnRhaW5lcl9vZigoeCksIHN0cnVjdCB0d2w0MDMwX3VzYiwgb3RnKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGludCB0d2w0MDMwX2kyY193cml0ZV91OF92ZXJpZnkoc3RydWN0IHR3bDQwMzBfdXNiICp0d2wsCisJCXU4IG1vZHVsZSwgdTggZGF0YSwgdTggYWRkcmVzcykKK3sKKwl1OCBjaGVjazsKKworCWlmICgodHdsNDAzMF9pMmNfd3JpdGVfdTgobW9kdWxlLCBkYXRhLCBhZGRyZXNzKSA+PSAwKSAmJgorCSAgICAodHdsNDAzMF9pMmNfcmVhZF91OChtb2R1bGUsICZjaGVjaywgYWRkcmVzcykgPj0gMCkgJiYKKwkJCQkJCShjaGVjayA9PSBkYXRhKSkKKwkJcmV0dXJuIDA7CisJZGV2X2RiZyh0d2wtPmRldiwgIldyaXRlJWRbJWQsMHgleF0gd3JvdGUgJTAyeCBidXQgcmVhZCAlMDJ4XG4iLAorCQkJMSwgbW9kdWxlLCBhZGRyZXNzLCBjaGVjaywgZGF0YSk7CisKKwkvKiBGYWlsZWQgb25jZTogVHJ5IGFnYWluICovCisJaWYgKCh0d2w0MDMwX2kyY193cml0ZV91OChtb2R1bGUsIGRhdGEsIGFkZHJlc3MpID49IDApICYmCisJICAgICh0d2w0MDMwX2kyY19yZWFkX3U4KG1vZHVsZSwgJmNoZWNrLCBhZGRyZXNzKSA+PSAwKSAmJgorCQkJCQkJKGNoZWNrID09IGRhdGEpKQorCQlyZXR1cm4gMDsKKwlkZXZfZGJnKHR3bC0+ZGV2LCAiV3JpdGUlZFslZCwweCV4XSB3cm90ZSAlMDJ4IGJ1dCByZWFkICUwMnhcbiIsCisJCQkyLCBtb2R1bGUsIGFkZHJlc3MsIGNoZWNrLCBkYXRhKTsKKworCS8qIEZhaWxlZCBhZ2FpbjogUmV0dXJuIGVycm9yICovCisJcmV0dXJuIC1FQlVTWTsKK30KKworI2RlZmluZSB0d2w0MDMwX3VzYl93cml0ZV92ZXJpZnkodHdsLCBhZGRyZXNzLCBkYXRhKQlcCisJdHdsNDAzMF9pMmNfd3JpdGVfdThfdmVyaWZ5KHR3bCwgVFdMNDAzMF9NT0RVTEVfVVNCLCAoZGF0YSksIChhZGRyZXNzKSkKKworc3RhdGljIGlubGluZSBpbnQgdHdsNDAzMF91c2Jfd3JpdGUoc3RydWN0IHR3bDQwMzBfdXNiICp0d2wsCisJCXU4IGFkZHJlc3MsIHU4IGRhdGEpCit7CisJaW50IHJldCA9IDA7CisKKwlyZXQgPSB0d2w0MDMwX2kyY193cml0ZV91OChUV0w0MDMwX01PRFVMRV9VU0IsIGRhdGEsIGFkZHJlc3MpOworCWlmIChyZXQgPCAwKQorCQlkZXZfZGJnKHR3bC0+ZGV2LAorCQkJIlRXTDQwMzA6VVNCOldyaXRlWzB4JXhdIEVycm9yICVkXG4iLCBhZGRyZXNzLCByZXQpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHR3bDQwMzBfcmVhZGIoc3RydWN0IHR3bDQwMzBfdXNiICp0d2wsIHU4IG1vZHVsZSwgdTggYWRkcmVzcykKK3sKKwl1OCBkYXRhOworCWludCByZXQgPSAwOworCisJcmV0ID0gdHdsNDAzMF9pMmNfcmVhZF91OChtb2R1bGUsICZkYXRhLCBhZGRyZXNzKTsKKwlpZiAocmV0ID49IDApCisJCXJldCA9IGRhdGE7CisJZWxzZQorCQlkZXZfZGJnKHR3bC0+ZGV2LAorCQkJIlRXTDQwMzA6cmVhZGJbMHgleCwweCV4XSBFcnJvciAlZFxuIiwKKwkJCQkJbW9kdWxlLCBhZGRyZXNzLCByZXQpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlubGluZSBpbnQgdHdsNDAzMF91c2JfcmVhZChzdHJ1Y3QgdHdsNDAzMF91c2IgKnR3bCwgdTggYWRkcmVzcykKK3sKKwlyZXR1cm4gdHdsNDAzMF9yZWFkYih0d2wsIFRXTDQwMzBfTU9EVUxFX1VTQiwgYWRkcmVzcyk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBpbmxpbmUgaW50Cit0d2w0MDMwX3VzYl9zZXRfYml0cyhzdHJ1Y3QgdHdsNDAzMF91c2IgKnR3bCwgdTggcmVnLCB1OCBiaXRzKQoreworCXJldHVybiB0d2w0MDMwX3VzYl93cml0ZSh0d2wsIHJlZyArIDEsIGJpdHMpOworfQorCitzdGF0aWMgaW5saW5lIGludAordHdsNDAzMF91c2JfY2xlYXJfYml0cyhzdHJ1Y3QgdHdsNDAzMF91c2IgKnR3bCwgdTggcmVnLCB1OCBiaXRzKQoreworCXJldHVybiB0d2w0MDMwX3VzYl93cml0ZSh0d2wsIHJlZyArIDIsIGJpdHMpOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgZW51bSBsaW5rc3RhdCB0d2w0MDMwX3VzYl9saW5rc3RhdChzdHJ1Y3QgdHdsNDAzMF91c2IgKnR3bCkKK3sKKwlpbnQJc3RhdHVzOworCWludAlsaW5rc3RhdCA9IFVTQl9MSU5LX1VOS05PV047CisKKwkvKiBTVFNfSFdfQ09ORElUSU9OUyAqLworCXN0YXR1cyA9IHR3bDQwMzBfcmVhZGIodHdsLCBUV0w0MDMwX01PRFVMRV9QTV9NQVNURVIsIDB4MGYpOworCWlmIChzdGF0dXMgPCAwKQorCQlkZXZfZXJyKHR3bC0+ZGV2LCAiVVNCIGxpbmsgc3RhdHVzIGVyciAlZFxuIiwgc3RhdHVzKTsKKwllbHNlIGlmIChzdGF0dXMgJiBCSVQoNykpCisJCWxpbmtzdGF0ID0gVVNCX0xJTktfVkJVUzsKKwllbHNlIGlmIChzdGF0dXMgJiBCSVQoMikpCisJCWxpbmtzdGF0ID0gVVNCX0xJTktfSUQ7CisJZWxzZQorCQlsaW5rc3RhdCA9IFVTQl9MSU5LX05PTkU7CisKKwlkZXZfZGJnKHR3bC0+ZGV2LCAiSFdfQ09ORElUSU9OUyAweCUwMngvJWQ7IGxpbmsgJWRcbiIsCisJCQlzdGF0dXMsIHN0YXR1cywgbGlua3N0YXQpOworCisJLyogUkVWSVNJVCB0aGlzIGFzc3VtZXMgaG9zdCBhbmQgcGVyaXBoZXJhbCBjb250cm9sbGVycworCSAqIGFyZSByZWdpc3RlcmVkLCBhbmQgdGhhdCBib3RoIGFyZSBhY3RpdmUuLi4KKwkgKi8KKworCXNwaW5fbG9ja19pcnEoJnR3bC0+bG9jayk7CisJdHdsLT5saW5rc3RhdCA9IGxpbmtzdGF0OworCWlmIChsaW5rc3RhdCA9PSBVU0JfTElOS19JRCkgeworCQl0d2wtPm90Zy5kZWZhdWx0X2EgPSB0cnVlOworCQl0d2wtPm90Zy5zdGF0ZSA9IE9UR19TVEFURV9BX0lETEU7CisJfSBlbHNlIHsKKwkJdHdsLT5vdGcuZGVmYXVsdF9hID0gZmFsc2U7CisJCXR3bC0+b3RnLnN0YXRlID0gT1RHX1NUQVRFX0JfSURMRTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxKCZ0d2wtPmxvY2spOworCisJcmV0dXJuIGxpbmtzdGF0OworfQorCitzdGF0aWMgdm9pZCB0d2w0MDMwX3VzYl9zZXRfbW9kZShzdHJ1Y3QgdHdsNDAzMF91c2IgKnR3bCwgaW50IG1vZGUpCit7CisJdHdsLT51c2JfbW9kZSA9IG1vZGU7CisKKwlzd2l0Y2ggKG1vZGUpIHsKKwljYXNlIFQyX1VTQl9NT0RFX1VMUEk6CisJCXR3bDQwMzBfdXNiX2NsZWFyX2JpdHModHdsLCBJRkNfQ1RSTCwgSUZDX0NUUkxfQ0FSS0lUTU9ERSk7CisJCXR3bDQwMzBfdXNiX3NldF9iaXRzKHR3bCwgUE9XRVJfQ1RSTCwgUE9XRVJfQ1RSTF9PVEdfRU5BQik7CisJCXR3bDQwMzBfdXNiX2NsZWFyX2JpdHModHdsLCBGVU5DX0NUUkwsCisJCQkJCUZVTkNfQ1RSTF9YQ1ZSU0VMRUNUX01BU0sgfAorCQkJCQlGVU5DX0NUUkxfT1BNT0RFX01BU0spOworCQlicmVhazsKKwljYXNlIC0xOgorCQkvKiBGSVhNRTogcG93ZXIgb24gZGVmYXVsdHMgKi8KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGV2X2Vycih0d2wtPmRldiwgInVuc3VwcG9ydGVkIFQyIHRyYW5zY2VpdmVyIG1vZGUgJWRcbiIsCisJCQkJbW9kZSk7CisJCWJyZWFrOworCX07Cit9CisKK3N0YXRpYyB2b2lkIHR3bDQwMzBfaTJjX2FjY2VzcyhzdHJ1Y3QgdHdsNDAzMF91c2IgKnR3bCwgaW50IG9uKQoreworCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKKwlpbnQgdmFsID0gdHdsNDAzMF91c2JfcmVhZCh0d2wsIFBIWV9DTEtfQ1RSTCk7CisKKwlpZiAodmFsID49IDApIHsKKwkJaWYgKG9uKSB7CisJCQkvKiBlbmFibGUgRFBMTCB0byBhY2Nlc3MgUEhZIHJlZ2lzdGVycyBvdmVyIEkyQyAqLworCQkJdmFsIHw9IFJFUV9QSFlfRFBMTF9DTEs7CisJCQlXQVJOX09OKHR3bDQwMzBfdXNiX3dyaXRlX3ZlcmlmeSh0d2wsIFBIWV9DTEtfQ1RSTCwKKwkJCQkJCSh1OCl2YWwpIDwgMCk7CisKKwkJCXRpbWVvdXQgPSBqaWZmaWVzICsgSFo7CisJCQl3aGlsZSAoISh0d2w0MDMwX3VzYl9yZWFkKHR3bCwgUEhZX0NMS19DVFJMX1NUUykgJgorCQkJCQkJCVBIWV9EUExMX0NMSykKKwkJCQkmJiB0aW1lX2JlZm9yZShqaWZmaWVzLCB0aW1lb3V0KSkKKwkJCQkJdWRlbGF5KDEwKTsKKwkJCWlmICghKHR3bDQwMzBfdXNiX3JlYWQodHdsLCBQSFlfQ0xLX0NUUkxfU1RTKSAmCisJCQkJCQkJUEhZX0RQTExfQ0xLKSkKKwkJCQlkZXZfZXJyKHR3bC0+ZGV2LCAiVGltZW91dCBzZXR0aW5nIFQyIEhTVVNCICIKKwkJCQkJCSJQSFkgRFBMTCBjbG9ja1xuIik7CisJCX0gZWxzZSB7CisJCQkvKiBsZXQgVUxQSSBjb250cm9sIHRoZSBEUExMIGNsb2NrICovCisJCQl2YWwgJj0gflJFUV9QSFlfRFBMTF9DTEs7CisJCQlXQVJOX09OKHR3bDQwMzBfdXNiX3dyaXRlX3ZlcmlmeSh0d2wsIFBIWV9DTEtfQ1RSTCwKKwkJCQkJCSh1OCl2YWwpIDwgMCk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIHR3bDQwMzBfcGh5X3Bvd2VyKHN0cnVjdCB0d2w0MDMwX3VzYiAqdHdsLCBpbnQgb24pCit7CisJdTggcHdyOworCisJcHdyID0gdHdsNDAzMF91c2JfcmVhZCh0d2wsIFBIWV9QV1JfQ1RSTCk7CisJaWYgKG9uKSB7CisJCXB3ciAmPSB+UEhZX1BXUl9QSFlQV0Q7CisJCVdBUk5fT04odHdsNDAzMF91c2Jfd3JpdGVfdmVyaWZ5KHR3bCwgUEhZX1BXUl9DVFJMLCBwd3IpIDwgMCk7CisJCXR3bDQwMzBfdXNiX3dyaXRlKHR3bCwgUEhZX0NMS19DVFJMLAorCQkJCSAgdHdsNDAzMF91c2JfcmVhZCh0d2wsIFBIWV9DTEtfQ1RSTCkgfAorCQkJCQkoUEhZX0NMS19DVFJMX0NMT0NLR0FUSU5HX0VOIHwKKwkJCQkJCVBIWV9DTEtfQ1RSTF9DTEszMktfRU4pKTsKKwl9IGVsc2UgIHsKKwkJcHdyIHw9IFBIWV9QV1JfUEhZUFdEOworCQlXQVJOX09OKHR3bDQwMzBfdXNiX3dyaXRlX3ZlcmlmeSh0d2wsIFBIWV9QV1JfQ1RSTCwgcHdyKSA8IDApOworCX0KK30KKworc3RhdGljIHZvaWQgdHdsNDAzMF9waHlfc3VzcGVuZChzdHJ1Y3QgdHdsNDAzMF91c2IgKnR3bCwgaW50IGNvbnRyb2xsZXJfb2ZmKQoreworCWlmICh0d2wtPmFzbGVlcCkKKwkJcmV0dXJuOworCisJdHdsNDAzMF9waHlfcG93ZXIodHdsLCAwKTsKKwl0d2wtPmFzbGVlcCA9IDE7Cit9CisKK3N0YXRpYyB2b2lkIHR3bDQwMzBfcGh5X3Jlc3VtZShzdHJ1Y3QgdHdsNDAzMF91c2IgKnR3bCkKK3sKKwlpZiAoIXR3bC0+YXNsZWVwKQorCQlyZXR1cm47CisKKwl0d2w0MDMwX3BoeV9wb3dlcih0d2wsIDEpOworCXR3bDQwMzBfaTJjX2FjY2Vzcyh0d2wsIDEpOworCXR3bDQwMzBfdXNiX3NldF9tb2RlKHR3bCwgdHdsLT51c2JfbW9kZSk7CisJaWYgKHR3bC0+dXNiX21vZGUgPT0gVDJfVVNCX01PREVfVUxQSSkKKwkJdHdsNDAzMF9pMmNfYWNjZXNzKHR3bCwgMCk7CisJdHdsLT5hc2xlZXAgPSAwOworfQorCitzdGF0aWMgdm9pZCB0d2w0MDMwX3VzYl9sZG9faW5pdChzdHJ1Y3QgdHdsNDAzMF91c2IgKnR3bCkKK3sKKwkvKiBFbmFibGUgd3JpdGluZyB0byBwb3dlciBjb25maWd1cmF0aW9uIHJlZ2lzdGVycyAqLworCXR3bDQwMzBfaTJjX3dyaXRlX3U4KFRXTDQwMzBfTU9EVUxFX1BNX01BU1RFUiwgMHhDMCwgUFJPVEVDVF9LRVkpOworCXR3bDQwMzBfaTJjX3dyaXRlX3U4KFRXTDQwMzBfTU9EVUxFX1BNX01BU1RFUiwgMHgwQywgUFJPVEVDVF9LRVkpOworCisJLyogcHV0IFZVU0IzVjEgTERPIGluIGFjdGl2ZSBzdGF0ZSAqLworCXR3bDQwMzBfaTJjX3dyaXRlX3U4KFRXTDQwMzBfTU9EVUxFX1BNX1JFQ0VJVkVSLCAwLCBWVVNCX0RFRElDQVRFRDIpOworCisJLyogaW5wdXQgdG8gVlVTQjNWMSBMRE8gaXMgZnJvbSBWQkFULCBub3QgVkJVUyAqLworCXR3bDQwMzBfaTJjX3dyaXRlX3U4KFRXTDQwMzBfTU9EVUxFX1BNX1JFQ0VJVkVSLCAweDE0LCBWVVNCX0RFRElDQVRFRDEpOworCisJLyogdHVybiBvbiAzLjFWIHJlZ3VsYXRvciAqLworCXR3bDQwMzBfaTJjX3dyaXRlX3U4KFRXTDQwMzBfTU9EVUxFX1BNX1JFQ0VJVkVSLCAweDIwLCBWVVNCM1YxX0RFVl9HUlApOworCXR3bDQwMzBfaTJjX3dyaXRlX3U4KFRXTDQwMzBfTU9EVUxFX1BNX1JFQ0VJVkVSLCAwLCBWVVNCM1YxX1RZUEUpOworCisJLyogdHVybiBvbiAxLjVWIHJlZ3VsYXRvciAqLworCXR3bDQwMzBfaTJjX3dyaXRlX3U4KFRXTDQwMzBfTU9EVUxFX1BNX1JFQ0VJVkVSLCAweDIwLCBWVVNCMVY1X0RFVl9HUlApOworCXR3bDQwMzBfaTJjX3dyaXRlX3U4KFRXTDQwMzBfTU9EVUxFX1BNX1JFQ0VJVkVSLCAwLCBWVVNCMVY1X1RZUEUpOworCisJLyogdHVybiBvbiAxLjhWIHJlZ3VsYXRvciAqLworCXR3bDQwMzBfaTJjX3dyaXRlX3U4KFRXTDQwMzBfTU9EVUxFX1BNX1JFQ0VJVkVSLCAweDIwLCBWVVNCMVY4X0RFVl9HUlApOworCXR3bDQwMzBfaTJjX3dyaXRlX3U4KFRXTDQwMzBfTU9EVUxFX1BNX1JFQ0VJVkVSLCAwLCBWVVNCMVY4X1RZUEUpOworCisJLyogZGlzYWJsZSBhY2Nlc3MgdG8gcG93ZXIgY29uZmlndXJhdGlvbiByZWdpc3RlcnMgKi8KKwl0d2w0MDMwX2kyY193cml0ZV91OChUV0w0MDMwX01PRFVMRV9QTV9NQVNURVIsIDAsIFBST1RFQ1RfS0VZKTsKK30KKworc3RhdGljIHNzaXplX3QgdHdsNDAzMF91c2JfdmJ1c19zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgdHdsNDAzMF91c2IgKnR3bCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldCA9IC1FSU5WQUw7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdHdsLT5sb2NrLCBmbGFncyk7CisJcmV0ID0gc3ByaW50ZihidWYsICIlc1xuIiwKKwkJCSh0d2wtPmxpbmtzdGF0ID09IFVTQl9MSU5LX1ZCVVMpID8gIm9uIiA6ICJvZmYiKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0d2wtPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiByZXQ7Cit9CitzdGF0aWMgREVWSUNFX0FUVFIodmJ1cywgMDQ0NCwgdHdsNDAzMF91c2JfdmJ1c19zaG93LCBOVUxMKTsKKworc3RhdGljIGlycXJldHVybl90IHR3bDQwMzBfdXNiX2lycShpbnQgaXJxLCB2b2lkICpfdHdsKQoreworCXN0cnVjdCB0d2w0MDMwX3VzYiAqdHdsID0gX3R3bDsKKwlpbnQgc3RhdHVzOworCisjaWZkZWYgQ09ORklHX0xPQ0tERVAKKwkvKiBXT1JLQVJPVU5EIGZvciBsb2NrZGVwIGZvcmNpbmcgSVJRRl9ESVNBQkxFRCBvbiB1cywgd2hpY2gKKwkgKiB3ZSBkb24ndCB3YW50IGFuZCBjYW4ndCB0b2xlcmF0ZS4gIEFsdGhvdWdoIGl0IG1pZ2h0IGJlCisJICogZnJpZW5kbGllciBub3QgdG8gYm9ycm93IHRoaXMgdGhyZWFkIGNvbnRleHQuLi4KKwkgKi8KKwlsb2NhbF9pcnFfZW5hYmxlKCk7CisjZW5kaWYKKworCXN0YXR1cyA9IHR3bDQwMzBfdXNiX2xpbmtzdGF0KHR3bCk7CisJaWYgKHN0YXR1cyAhPSBVU0JfTElOS19VTktOT1dOKSB7CisKKwkJLyogRklYTUUgYWRkIGEgc2V0X3Bvd2VyKCkgbWV0aG9kIHNvIHRoYXQgQi1kZXZpY2VzIGNhbgorCQkgKiBjb25maWd1cmUgdGhlIGNoYXJnZXIgYXBwcm9wcmlhdGVseS4gIEl0J3Mgbm90IGFsd2F5cworCQkgKiBjb3JyZWN0IHRvIGNvbnN1bWUgVkJVUyBwb3dlciwgYW5kIGhvdyBtdWNoIGN1cnJlbnQgdG8KKwkJICogY29uc3VtZSBpcyBhIGZ1bmN0aW9uIG9mIHRoZSBVU0IgY29uZmlndXJhdGlvbiBjaG9zZW4KKwkJICogYnkgdGhlIGhvc3QuCisJCSAqCisJCSAqIFJFVklTSVQgdXNiX2dhZGdldF92YnVzX2Nvbm5lY3QoLi4uKSBhcyBuZWVkZWQsIGRpdHRvCisJCSAqIGl0cyBkaXNjb25uZWN0KCkgc2libGluZywgd2hlbiBjaGFuZ2luZyB0by9mcm9tIHRoZQorCQkgKiBVU0JfTElOS19WQlVTIHN0YXRlLiAgbXVzYl9oZHJjIHdvbid0IGNhcmUgdW50aWwgaXQKKwkJICogc3RhcnRzIHRvIGhhbmRsZSBzb2Z0Y29ubmVjdCByaWdodC4KKwkJICovCisJCXR3bDQwMzBjaGFyZ2VyX3VzYl9lbihzdGF0dXMgPT0gVVNCX0xJTktfVkJVUyk7CisKKwkJaWYgKHN0YXR1cyA9PSBVU0JfTElOS19OT05FKQorCQkJdHdsNDAzMF9waHlfc3VzcGVuZCh0d2wsIDApOworCQllbHNlCisJCQl0d2w0MDMwX3BoeV9yZXN1bWUodHdsKTsKKwl9CisJc3lzZnNfbm90aWZ5KCZ0d2wtPmRldi0+a29iaiwgTlVMTCwgInZidXMiKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGludCB0d2w0MDMwX3NldF9zdXNwZW5kKHN0cnVjdCBvdGdfdHJhbnNjZWl2ZXIgKngsIGludCBzdXNwZW5kKQoreworCXN0cnVjdCB0d2w0MDMwX3VzYiAqdHdsID0geGNlaXZfdG9fdHdsKHgpOworCisJaWYgKHN1c3BlbmQpCisJCXR3bDQwMzBfcGh5X3N1c3BlbmQodHdsLCAxKTsKKwllbHNlCisJCXR3bDQwMzBfcGh5X3Jlc3VtZSh0d2wpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdHdsNDAzMF9zZXRfcGVyaXBoZXJhbChzdHJ1Y3Qgb3RnX3RyYW5zY2VpdmVyICp4LAorCQlzdHJ1Y3QgdXNiX2dhZGdldCAqZ2FkZ2V0KQoreworCXN0cnVjdCB0d2w0MDMwX3VzYiAqdHdsOworCisJaWYgKCF4KQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXR3bCA9IHhjZWl2X3RvX3R3bCh4KTsKKwl0d2wtPm90Zy5nYWRnZXQgPSBnYWRnZXQ7CisJaWYgKCFnYWRnZXQpCisJCXR3bC0+b3RnLnN0YXRlID0gT1RHX1NUQVRFX1VOREVGSU5FRDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHR3bDQwMzBfc2V0X2hvc3Qoc3RydWN0IG90Z190cmFuc2NlaXZlciAqeCwgc3RydWN0IHVzYl9idXMgKmhvc3QpCit7CisJc3RydWN0IHR3bDQwMzBfdXNiICp0d2w7CisKKwlpZiAoIXgpCisJCXJldHVybiAtRU5PREVWOworCisJdHdsID0geGNlaXZfdG9fdHdsKHgpOworCXR3bC0+b3RnLmhvc3QgPSBob3N0OworCWlmICghaG9zdCkKKwkJdHdsLT5vdGcuc3RhdGUgPSBPVEdfU1RBVEVfVU5ERUZJTkVEOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHR3bDQwMzBfdXNiX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHR3bDQwMzBfdXNiX2RhdGEgKnBkYXRhID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJc3RydWN0IHR3bDQwMzBfdXNiCSp0d2w7CisJaW50CQkJc3RhdHVzOworCisJaWYgKCFwZGF0YSkgeworCQlkZXZfZGJnKCZwZGV2LT5kZXYsICJwbGF0Zm9ybV9kYXRhIG5vdCBhdmFpbGFibGVcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwl0d2wgPSBremFsbG9jKHNpemVvZiAqdHdsLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXR3bCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwl0d2wtPmRldgkJPSAmcGRldi0+ZGV2OworCXR3bC0+aXJxCQk9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7CisJdHdsLT5vdGcuZGV2CQk9IHR3bC0+ZGV2OworCXR3bC0+b3RnLmxhYmVsCQk9ICJ0d2w0MDMwIjsKKwl0d2wtPm90Zy5zZXRfaG9zdAk9IHR3bDQwMzBfc2V0X2hvc3Q7CisJdHdsLT5vdGcuc2V0X3BlcmlwaGVyYWwJPSB0d2w0MDMwX3NldF9wZXJpcGhlcmFsOworCXR3bC0+b3RnLnNldF9zdXNwZW5kCT0gdHdsNDAzMF9zZXRfc3VzcGVuZDsKKwl0d2wtPnVzYl9tb2RlCQk9IHBkYXRhLT51c2JfbW9kZTsKKwl0d2wtPmFzbGVlcAkJPSAxOworCisJLyogaW5pdCBzcGlubG9jayBmb3Igd29ya3F1ZXVlICovCisJc3Bpbl9sb2NrX2luaXQoJnR3bC0+bG9jayk7CisKKwl0d2w0MDMwX3VzYl9sZG9faW5pdCh0d2wpOworCW90Z19zZXRfdHJhbnNjZWl2ZXIoJnR3bC0+b3RnKTsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHR3bCk7CisJaWYgKGRldmljZV9jcmVhdGVfZmlsZSgmcGRldi0+ZGV2LCAmZGV2X2F0dHJfdmJ1cykpCisJCWRldl93YXJuKCZwZGV2LT5kZXYsICJjb3VsZCBub3QgY3JlYXRlIHN5c2ZzIGZpbGVcbiIpOworCisJLyogT3VyIGpvYiBpcyB0byB1c2UgaXJxcyBhbmQgc3RhdHVzIGZyb20gdGhlIHBvd2VyIG1vZHVsZQorCSAqIHRvIGtlZXAgdGhlIHRyYW5zY2VpdmVyIGRpc2FibGVkIHdoZW4gbm90aGluZydzIGNvbm5lY3RlZC4KKwkgKgorCSAqIEZJWE1FIHdlIGFjdHVhbGx5IHNob3VsZG4ndCBzdGFydCBlbmFibGluZyBpdCB1bnRpbCB0aGUKKwkgKiBVU0IgY29udHJvbGxlciBkcml2ZXJzIGhhdmUgc2FpZCB0aGV5J3JlIHJlYWR5LCBieSBjYWxsaW5nCisJICogc2V0X2hvc3QoKSBhbmQvb3Igc2V0X3BlcmlwaGVyYWwoKSAuLi4gT1RHX2NhcGFibGUgYm9hcmRzCisJICogbmVlZCBib3RoIGhhbmRsZXMsIG90aGVyd2lzZSBqdXN0IG9uZSBzdWZmaWNlcy4KKwkgKi8KKwl0d2wtPmlycV9lbmFibGVkID0gdHJ1ZTsKKwlzdGF0dXMgPSByZXF1ZXN0X2lycSh0d2wtPmlycSwgdHdsNDAzMF91c2JfaXJxLAorCQkJSVJRRl9UUklHR0VSX0ZBTExJTkcgfCBJUlFGX1RSSUdHRVJfUklTSU5HLAorCQkJInR3bDQwMzBfdXNiIiwgdHdsKTsKKwlpZiAoc3RhdHVzIDwgMCkgeworCQlkZXZfZGJnKCZwZGV2LT5kZXYsICJjYW4ndCBnZXQgSVJRICVkLCBlcnIgJWRcbiIsCisJCQl0d2wtPmlycSwgc3RhdHVzKTsKKwkJa2ZyZWUodHdsKTsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisKKwkvKiBUaGUgSVJRIGhhbmRsZXIganVzdCBoYW5kbGVzIGNoYW5nZXMgZnJvbSB0aGUgcHJldmlvdXMgc3RhdGVzCisJICogb2YgdGhlIElEIGFuZCBWQlVTIHBpbnMgLi4uIGluIHByb2JlKCkgd2UgbXVzdCBpbml0aWFsaXplIHRoYXQKKwkgKiBwcmV2aW91cyBzdGF0ZS4gIFRoZSBlYXN5IHdheTogIGZha2UgYW4gSVJRLgorCSAqCisJICogUkVWSVNJVDogIGEgcmVhbCBJUlEgbWlnaHQgaGF2ZSBoYXBwZW5lZCBhbHJlYWR5LCBpZiBQUkVFTVBUIGlzCisJICogZW5hYmxlZC4gIEVsc2UgdGhlIElSUSBtYXkgbm90IHlldCBiZSBjb25maWd1cmVkIG9yIGVuYWJsZWQsCisJICogYmVjYXVzZSBvZiBzY2hlZHVsaW5nIGRlbGF5cy4KKwkgKi8KKwl0d2w0MDMwX3VzYl9pcnEodHdsLT5pcnEsIHR3bCk7CisKKwlkZXZfaW5mbygmcGRldi0+ZGV2LCAiSW5pdGlhbGl6ZWQgVFdMNDAzMCBVU0IgbW9kdWxlXG4iKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2V4aXQgdHdsNDAzMF91c2JfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHR3bDQwMzBfdXNiICp0d2wgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlpbnQgdmFsOworCisJZnJlZV9pcnEodHdsLT5pcnEsIHR3bCk7CisJZGV2aWNlX3JlbW92ZV9maWxlKHR3bC0+ZGV2LCAmZGV2X2F0dHJfdmJ1cyk7CisKKwkvKiBzZXQgdHJhbnNjZWl2ZXIgbW9kZSB0byBwb3dlciBvbiBkZWZhdWx0cyAqLworCXR3bDQwMzBfdXNiX3NldF9tb2RlKHR3bCwgLTEpOworCisJLyogYXV0b2dhdGUgNjBNSHogVUxQSSBjbG9jaywKKwkgKiBjbGVhciBkcGxsIGNsb2NrIHJlcXVlc3QgZm9yIGkyYyBhY2Nlc3MsCisJICogZGlzYWJsZSAzMktIegorCSAqLworCXZhbCA9IHR3bDQwMzBfdXNiX3JlYWQodHdsLCBQSFlfQ0xLX0NUUkwpOworCWlmICh2YWwgPj0gMCkgeworCQl2YWwgfD0gUEhZX0NMS19DVFJMX0NMT0NLR0FUSU5HX0VOOworCQl2YWwgJj0gfihQSFlfQ0xLX0NUUkxfQ0xLMzJLX0VOIHwgUkVRX1BIWV9EUExMX0NMSyk7CisJCXR3bDQwMzBfdXNiX3dyaXRlKHR3bCwgUEhZX0NMS19DVFJMLCAodTgpdmFsKTsKKwl9CisKKwkvKiBkaXNhYmxlIGNvbXBsZXRlIE9URyBibG9jayAqLworCXR3bDQwMzBfdXNiX2NsZWFyX2JpdHModHdsLCBQT1dFUl9DVFJMLCBQT1dFUl9DVFJMX09UR19FTkFCKTsKKworCXR3bDQwMzBfcGh5X3Bvd2VyKHR3bCwgMCk7CisKKwlrZnJlZSh0d2wpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHR3bDQwMzBfdXNiX2RyaXZlciA9IHsKKwkucHJvYmUJCT0gdHdsNDAzMF91c2JfcHJvYmUsCisJLnJlbW92ZQkJPSBfX2V4aXRfcCh0d2w0MDMwX3VzYl9yZW1vdmUpLAorCS5kcml2ZXIJCT0geworCQkubmFtZQk9ICJ0d2w0MDMwX3VzYiIsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCX0sCit9OworCitzdGF0aWMgaW50IF9faW5pdCB0d2w0MDMwX3VzYl9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmdHdsNDAzMF91c2JfZHJpdmVyKTsKK30KK3N1YnN5c19pbml0Y2FsbCh0d2w0MDMwX3VzYl9pbml0KTsKKworc3RhdGljIHZvaWQgX19leGl0IHR3bDQwMzBfdXNiX2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmdHdsNDAzMF91c2JfZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KHR3bDQwMzBfdXNiX2V4aXQpOworCitNT0RVTEVfQUxJQVMoInBsYXRmb3JtOnR3bDQwMzBfdXNiIik7CitNT0RVTEVfQVVUSE9SKCJUZXhhcyBJbnN0cnVtZW50cywgSW5jLCBOb2tpYSBDb3Jwb3JhdGlvbiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJUV0w0MDMwIFVTQiB0cmFuc2NlaXZlciBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9LY29uZmlnIGIvZHJpdmVycy91c2Ivc2VyaWFsL0tjb25maWcKaW5kZXggNzAzMzhmNC4uYjM2MWYwNSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL0tjb25maWcKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL0tjb25maWcKQEAgLTQ5Niw2ICs0OTYsMTQgQEAKIAlib29sICJVU0IgU2VjdXJlIEVuY2Fwc3VsYXRlZCBEcml2ZXIgLSBQYWRkZWQiCiAJZGVwZW5kcyBvbiBVU0JfU0VSSUFMX1NBRkUKIAorY29uZmlnIFVTQl9TRVJJQUxfU0lFTUVOU19NUEkKKwl0cmlzdGF0ZSAiVVNCIFNpZW1lbnMgTVBJIGRyaXZlciIKKwloZWxwCisJICBTYXkgTSBoZXJlIGlmIHlvdSB3YW50IHRvIHVzZSBhIFNpZW1lbnMgVVNCL01QSSBhZGFwdGVyLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBzaWVtZW5zX21waS4KKwogY29uZmlnIFVTQl9TRVJJQUxfU0lFUlJBV0lSRUxFU1MKIAl0cmlzdGF0ZSAiVVNCIFNpZXJyYSBXaXJlbGVzcyBEcml2ZXIiCiAJaGVscApAQCAtNTY1LDYgKzU3MywxNSBAQAogCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCiAJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgb21uaW5ldC4KIAorY29uZmlnIFVTQl9TRVJJQUxfT1BUSUNPTgorCXRyaXN0YXRlICJVU0IgT3B0aWNvbiBCYXJjb2RlIGRyaXZlciAoc2VyaWFsIG1vZGUpIgorCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gdXNlIGEgT3B0aWNvbiBVU0IgQmFyY29kZSBkZXZpY2UKKwkgIGluIHNlcmlhbCBlbXVsYXRpb24gbW9kZS4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgb3B0aWNvbi4KKwogY29uZmlnIFVTQl9TRVJJQUxfREVCVUcKIAl0cmlzdGF0ZSAiVVNCIERlYnVnZ2luZyBEZXZpY2UiCiAJaGVscApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL01ha2VmaWxlIGIvZHJpdmVycy91c2Ivc2VyaWFsL01ha2VmaWxlCmluZGV4IDYwNDdmODEuLmI3NWJlOTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwvTWFrZWZpbGUKQEAgLTQxLDEwICs0MSwxMiBAQAogb2JqLSQoQ09ORklHX1VTQl9TRVJJQUxfTU9UT1JPTEEpCQkrPSBtb3RvX21vZGVtLm8KIG9iai0kKENPTkZJR19VU0JfU0VSSUFMX05BVk1BTikJCQkrPSBuYXZtYW4ubwogb2JqLSQoQ09ORklHX1VTQl9TRVJJQUxfT01OSU5FVCkJCSs9IG9tbmluZXQubworb2JqLSQoQ09ORklHX1VTQl9TRVJJQUxfT1BUSUNPTikJCSs9IG9wdGljb24ubwogb2JqLSQoQ09ORklHX1VTQl9TRVJJQUxfT1BUSU9OKQkJCSs9IG9wdGlvbi5vCiBvYmotJChDT05GSUdfVVNCX1NFUklBTF9PVEk2ODU4KQkJKz0gb3RpNjg1OC5vCiBvYmotJChDT05GSUdfVVNCX1NFUklBTF9QTDIzMDMpCQkJKz0gcGwyMzAzLm8KIG9iai0kKENPTkZJR19VU0JfU0VSSUFMX1NBRkUpCQkJKz0gc2FmZV9zZXJpYWwubworb2JqLSQoQ09ORklHX1VTQl9TRVJJQUxfU0lFTUVOU19NUEkpCQkrPSBzaWVtZW5zX21waS5vCiBvYmotJChDT05GSUdfVVNCX1NFUklBTF9TSUVSUkFXSVJFTEVTUykJCSs9IHNpZXJyYS5vCiBvYmotJChDT05GSUdfVVNCX1NFUklBTF9TUENQOFg1KQkJKz0gc3BjcDh4NS5vCiBvYmotJChDT05GSUdfVVNCX1NFUklBTF9USSkJCQkrPSB0aV91c2JfMzQxMF81MDUyLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9kaWdpX2FjY2VsZXBvcnQuYyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9kaWdpX2FjY2VsZXBvcnQuYwppbmRleCA2OWY4NGYwLi4zOGJhNGVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvZGlnaV9hY2NlbGVwb3J0LmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL2RpZ2lfYWNjZWxlcG9ydC5jCkBAIC02MzUsOCArNjM1LDcgQEAKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZvb2JfcHJpdi0+ZHBfcG9ydF9sb2NrLCBmbGFncyk7CiAJd2hpbGUgKGNvdW50ID4gMCkgewotCQl3aGlsZSAob29iX3BvcnQtPndyaXRlX3VyYi0+c3RhdHVzID09IC1FSU5QUk9HUkVTUwotCQkJfHwgb29iX3ByaXYtPmRwX3dyaXRlX3VyYl9pbl91c2UpIHsKKwkJd2hpbGUgKG9vYl9wcml2LT5kcF93cml0ZV91cmJfaW5fdXNlKSB7CiAJCQljb25kX3dhaXRfaW50ZXJydXB0aWJsZV90aW1lb3V0X2lycXJlc3RvcmUoCiAJCQkJJm9vYl9wb3J0LT53cml0ZV93YWl0LCBESUdJX1JFVFJZX1RJTUVPVVQsCiAJCQkJJm9vYl9wcml2LT5kcF9wb3J0X2xvY2ssIGZsYWdzKTsKQEAgLTY5OSw5ICs2OTgsOCBAQAogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmRwX3BvcnRfbG9jaywgZmxhZ3MpOwogCXdoaWxlIChjb3VudCA+IDAgJiYgcmV0ID09IDApIHsKLQkJd2hpbGUgKChwb3J0LT53cml0ZV91cmItPnN0YXR1cyA9PSAtRUlOUFJPR1JFU1MKLQkJCQl8fCBwcml2LT5kcF93cml0ZV91cmJfaW5fdXNlKQotCQkJCQkmJiB0aW1lX2JlZm9yZShqaWZmaWVzLCB0aW1lb3V0KSkgeworCQl3aGlsZSAocHJpdi0+ZHBfd3JpdGVfdXJiX2luX3VzZSAmJgorCQkgICAgICAgdGltZV9iZWZvcmUoamlmZmllcywgdGltZW91dCkpIHsKIAkJCWNvbmRfd2FpdF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXRfaXJxcmVzdG9yZSgKIAkJCQkmcG9ydC0+d3JpdGVfd2FpdCwgRElHSV9SRVRSWV9USU1FT1VULAogCQkJCSZwcml2LT5kcF9wb3J0X2xvY2ssIGZsYWdzKTsKQEAgLTc3OSw4ICs3NzcsNyBAQAogCXNwaW5fbG9ja19pcnFzYXZlKCZvb2JfcHJpdi0+ZHBfcG9ydF9sb2NrLCBmbGFncyk7CiAJc3Bpbl9sb2NrKCZwb3J0X3ByaXYtPmRwX3BvcnRfbG9jayk7CiAKLQl3aGlsZSAob29iX3BvcnQtPndyaXRlX3VyYi0+c3RhdHVzID09IC1FSU5QUk9HUkVTUyB8fAotCQkJCQlvb2JfcHJpdi0+ZHBfd3JpdGVfdXJiX2luX3VzZSkgeworCXdoaWxlIChvb2JfcHJpdi0+ZHBfd3JpdGVfdXJiX2luX3VzZSkgewogCQlzcGluX3VubG9jaygmcG9ydF9wcml2LT5kcF9wb3J0X2xvY2spOwogCQljb25kX3dhaXRfaW50ZXJydXB0aWJsZV90aW1lb3V0X2lycXJlc3RvcmUoCiAJCQkmb29iX3BvcnQtPndyaXRlX3dhaXQsIERJR0lfUkVUUllfVElNRU9VVCwKQEAgLTExNjgsMTIgKzExNjUsMTAgQEAKIAogCS8qIGJlIHN1cmUgb25seSBvbmUgd3JpdGUgcHJvY2VlZHMgYXQgYSB0aW1lICovCiAJLyogdGhlcmUgYXJlIHJhY2VzIG9uIHRoZSBwb3J0IHByaXZhdGUgYnVmZmVyICovCi0JLyogYW5kIHJhY2VzIHRvIGNoZWNrIHdyaXRlX3VyYi0+c3RhdHVzICovCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmRwX3BvcnRfbG9jaywgZmxhZ3MpOwogCiAJLyogd2FpdCBmb3IgdXJiIHN0YXR1cyBjbGVhciB0byBzdWJtaXQgYW5vdGhlciB1cmIgKi8KLQlpZiAocG9ydC0+d3JpdGVfdXJiLT5zdGF0dXMgPT0gLUVJTlBST0dSRVNTIHx8Ci0JCQkJCXByaXYtPmRwX3dyaXRlX3VyYl9pbl91c2UpIHsKKwlpZiAocHJpdi0+ZHBfd3JpdGVfdXJiX2luX3VzZSkgewogCQkvKiBidWZmZXIgZGF0YSBpZiBjb3VudCBpcyAxIChwcm9iYWJseSBwdXRfY2hhcikgaWYgcG9zc2libGUgKi8KIAkJaWYgKGNvdW50ID09IDEgJiYgcHJpdi0+ZHBfb3V0X2J1Zl9sZW4gPCBESUdJX09VVF9CVUZfU0laRSkgewogCQkJcHJpdi0+ZHBfb3V0X2J1Zltwcml2LT5kcF9vdXRfYnVmX2xlbisrXSA9ICpidWY7CkBAIC0xMjM2LDcgKzEyMzEsNyBAQAogCWludCByZXQgPSAwOwogCWludCBzdGF0dXMgPSB1cmItPnN0YXR1czsKIAotCWRiZygiZGlnaV93cml0ZV9idWxrX2NhbGxiYWNrOiBUT1AsIHVyYi0+c3RhdHVzPSVkIiwgc3RhdHVzKTsKKwlkYmcoImRpZ2lfd3JpdGVfYnVsa19jYWxsYmFjazogVE9QLCBzdGF0dXM9JWQiLCBzdGF0dXMpOwogCiAJLyogcG9ydCBhbmQgc2VyaWFsIHNhbml0eSBjaGVjayAqLwogCWlmIChwb3J0ID09IE5VTEwgfHwgKHByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCkpID09IE5VTEwpIHsKQEAgLTEyNjYsOCArMTI2MSw3IEBACiAJLyogdHJ5IHRvIHNlbmQgYW55IGJ1ZmZlcmVkIGRhdGEgb24gdGhpcyBwb3J0LCBpZiBpdCBpcyBvcGVuICovCiAJc3Bpbl9sb2NrKCZwcml2LT5kcF9wb3J0X2xvY2spOwogCXByaXYtPmRwX3dyaXRlX3VyYl9pbl91c2UgPSAwOwotCWlmIChwb3J0LT5wb3J0LmNvdW50ICYmIHBvcnQtPndyaXRlX3VyYi0+c3RhdHVzICE9IC1FSU5QUk9HUkVTUwotCSAgICAmJiBwcml2LT5kcF9vdXRfYnVmX2xlbiA+IDApIHsKKwlpZiAocG9ydC0+cG9ydC5jb3VudCAmJiBwcml2LT5kcF9vdXRfYnVmX2xlbiA+IDApIHsKIAkJKigodW5zaWduZWQgY2hhciAqKShwb3J0LT53cml0ZV91cmItPnRyYW5zZmVyX2J1ZmZlcikpCiAJCQk9ICh1bnNpZ25lZCBjaGFyKURJR0lfQ01EX1NFTkRfREFUQTsKIAkJKigodW5zaWduZWQgY2hhciAqKShwb3J0LT53cml0ZV91cmItPnRyYW5zZmVyX2J1ZmZlcikgKyAxKQpAQCAtMTMwNSw4ICsxMjk5LDcgQEAKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5kcF9wb3J0X2xvY2ssIGZsYWdzKTsKIAotCWlmIChwb3J0LT53cml0ZV91cmItPnN0YXR1cyA9PSAtRUlOUFJPR1JFU1MgfHwKLQkJCQkJcHJpdi0+ZHBfd3JpdGVfdXJiX2luX3VzZSkKKwlpZiAocHJpdi0+ZHBfd3JpdGVfdXJiX2luX3VzZSkKIAkJcm9vbSA9IDA7CiAJZWxzZQogCQlyb29tID0gcG9ydC0+YnVsa19vdXRfc2l6ZSAtIDIgLSBwcml2LT5kcF9vdXRfYnVmX2xlbjsKQEAgLTEzMjIsOCArMTMxNSw3IEBACiAJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IHR0eS0+ZHJpdmVyX2RhdGE7CiAJc3RydWN0IGRpZ2lfcG9ydCAqcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKIAotCWlmIChwb3J0LT53cml0ZV91cmItPnN0YXR1cyA9PSAtRUlOUFJPR1JFU1MKLQkgICAgfHwgcHJpdi0+ZHBfd3JpdGVfdXJiX2luX3VzZSkgeworCWlmIChwcml2LT5kcF93cml0ZV91cmJfaW5fdXNlKSB7CiAJCWRiZygiZGlnaV9jaGFyc19pbl9idWZmZXI6IHBvcnQ9JWQsIGNoYXJzPSVkIiwKIAkJCXByaXYtPmRwX3BvcnRfbnVtLCBwb3J0LT5idWxrX291dF9zaXplIC0gMik7CiAJCS8qIHJldHVybihwb3J0LT5idWxrX291dF9zaXplIC0gMik7ICovCkBAIC0xNzAyLDcgKzE2OTQsNyBAQAogCS8qIHNob3J0L211bHRpcGxlIHBhY2tldCBjaGVjayAqLwogCWlmICh1cmItPmFjdHVhbF9sZW5ndGggIT0gbGVuICsgMikgewogCQlkZXZfZXJyKCZwb3J0LT5kZXYsICIlczogSU5DT01QTEVURSBPUiBNVUxUSVBMRSBQQUNLRVQsICIKLQkJCSJ1cmItPnN0YXR1cz0lZCwgcG9ydD0lZCwgb3Bjb2RlPSVkLCBsZW49JWQsICIKKwkJCSJzdGF0dXM9JWQsIHBvcnQ9JWQsIG9wY29kZT0lZCwgbGVuPSVkLCAiCiAJCQkiYWN0dWFsX2xlbmd0aD0lZCwgc3RhdHVzPSVkXG4iLCBfX2Z1bmNfXywgc3RhdHVzLAogCQkJcHJpdi0+ZHBfcG9ydF9udW0sIG9wY29kZSwgbGVuLCB1cmItPmFjdHVhbF9sZW5ndGgsCiAJCQlwb3J0X3N0YXR1cyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvZnRkaV9zaW8uYyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9mdGRpX3Npby5jCmluZGV4IGVmNmNmYTUuLmM3MGE4ZjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC9mdGRpX3Npby5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9mdGRpX3Npby5jCkBAIC0yMDMwLDcgKzIwMzAsNyBAQAogCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+cnhfbG9jaywgZmxhZ3MpOwogCQkJZGJnKCIlcyAtIGRlZmVycmluZyByZW1haW5kZXIgdW50aWwgdW50aHJvdHRsZWQiLAogCQkJCQlfX2Z1bmNfXyk7Ci0JCQlyZXR1cm47CisJCQlnb3RvIG91dDsKIAkJfQogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5yeF9sb2NrLCBmbGFncyk7CiAJCS8qIGlmIHRoZSBwb3J0IGlzIGNsb3NlZCBzdG9wIHRyeWluZyB0byByZWFkICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvZ2FybWluX2dwcy5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL2dhcm1pbl9ncHMuYwppbmRleCA4ZTZhNjZlLi5hMjZhMGUyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvZ2FybWluX2dwcy5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9nYXJtaW5fZ3BzLmMKQEAgLTEwNTYsNyArMTA1Niw3IEBACiAKIAkJaWYgKHN0YXR1cykgewogCQkJZGJnKCIlcyAtIG5vbnplcm8gd3JpdGUgYnVsayBzdGF0dXMgcmVjZWl2ZWQ6ICVkIiwKLQkJCSAgICBfX2Z1bmNfXywgdXJiLT5zdGF0dXMpOworCQkJICAgIF9fZnVuY19fLCBzdGF0dXMpOwogCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmdhcm1pbl9kYXRhX3AtPmxvY2ssIGZsYWdzKTsKIAkJCWdhcm1pbl9kYXRhX3AtPmZsYWdzIHw9IENMRUFSX0hBTFRfUkVRVUlSRUQ7CiAJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZnYXJtaW5fZGF0YV9wLT5sb2NrLCBmbGFncyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvaXB3LmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvaXB3LmMKaW5kZXggM2FjNTlhOC4uZjUzMDAzMiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL2lwdy5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9pcHcuYwpAQCAtNDczLDcgKzQ3Myw3IEBACiAKIAogCi1zdGF0aWMgaW50IHVzYl9pcHdfaW5pdCh2b2lkKQorc3RhdGljIGludCBfX2luaXQgdXNiX2lwd19pbml0KHZvaWQpCiB7CiAJaW50IHJldHZhbDsKIApAQCAtNDkwLDcgKzQ5MCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIHVzYl9pcHdfZXhpdCh2b2lkKQorc3RhdGljIHZvaWQgX19leGl0IHVzYl9pcHdfZXhpdCh2b2lkKQogewogCXVzYl9kZXJlZ2lzdGVyKCZ1c2JfaXB3X2RyaXZlcik7CiAJdXNiX3NlcmlhbF9kZXJlZ2lzdGVyKCZpcHdfZGV2aWNlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9pdXVfcGhvZW5peC5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL2l1dV9waG9lbml4LmMKaW5kZXggZTMyMDk3Mi4uMjMxNGM2YSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL2l1dV9waG9lbml4LmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL2l1dV9waG9lbml4LmMKQEAgLTE5MCwxMCArMTkwLDEyIEBACiB7CiAJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IHVyYi0+Y29udGV4dDsKIAlpbnQgcmVzdWx0OworCWludCBzdGF0dXMgPSB1cmItPnN0YXR1czsKKwogCWRiZygiJXMgLSBlbnRlciIsIF9fZnVuY19fKTsKIAotCWlmICh1cmItPnN0YXR1cykgewotCQlkYmcoIiVzIC0gdXJiLT5zdGF0dXMgPSAlZCIsIF9fZnVuY19fLCB1cmItPnN0YXR1cyk7CisJaWYgKHN0YXR1cykgeworCQlkYmcoIiVzIC0gc3RhdHVzID0gJWQiLCBfX2Z1bmNfXywgc3RhdHVzKTsKIAkJLyogZXJyb3Igc3RvcCBhbGwgKi8KIAkJcmV0dXJuOwogCX0KQEAgLTI0NSwxMCArMjQ3LDEyIEBACiAJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IHVyYi0+Y29udGV4dDsKIAlzdHJ1Y3QgaXV1X3ByaXZhdGUgKnByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CiAJdTggKnN0OworCWludCBzdGF0dXMgPSB1cmItPnN0YXR1czsKKwogCWRiZygiJXMgLSBlbnRlciIsIF9fZnVuY19fKTsKIAotCWlmICh1cmItPnN0YXR1cykgewotCQlkYmcoIiVzIC0gdXJiLT5zdGF0dXMgPSAlZCIsIF9fZnVuY19fLCB1cmItPnN0YXR1cyk7CisJaWYgKHN0YXR1cykgeworCQlkYmcoIiVzIC0gc3RhdHVzID0gJWQiLCBfX2Z1bmNfXywgc3RhdHVzKTsKIAkJLyogZXJyb3Igc3RvcCBhbGwgKi8KIAkJcmV0dXJuOwogCX0KQEAgLTI3NCw5ICsyNzgsOSBAQAogewogCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQgPSB1cmItPmNvbnRleHQ7CiAJaW50IHJlc3VsdDsKLQlkYmcoIiVzIC0gZW50ZXIiLCBfX2Z1bmNfXyk7CisJaW50IHN0YXR1cyA9IHVyYi0+c3RhdHVzOwogCi0JZGJnKCIlcyAtIHVyYi0+c3RhdHVzID0gJWQiLCBfX2Z1bmNfXywgdXJiLT5zdGF0dXMpOworCWRiZygiJXMgLSBzdGF0dXMgPSAlZCIsIF9fZnVuY19fLCBzdGF0dXMpOwogCXVzYl9maWxsX2J1bGtfdXJiKHBvcnQtPnJlYWRfdXJiLCBwb3J0LT5zZXJpYWwtPmRldiwKIAkJCSAgdXNiX3JjdmJ1bGtwaXBlKHBvcnQtPnNlcmlhbC0+ZGV2LAogCQkJCQkgIHBvcnQtPmJ1bGtfaW5fZW5kcG9pbnRBZGRyZXNzKSwKQEAgLTYxOCwxMSArNjIyLDEyIEBACiAJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IHVyYi0+Y29udGV4dDsKIAl1bnNpZ25lZCBjaGFyICpkYXRhID0gdXJiLT50cmFuc2Zlcl9idWZmZXI7CiAJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKLQlkYmcoIiVzIC0gdXJiLT5zdGF0dXMgPSAlZCIsIF9fZnVuY19fLCB1cmItPnN0YXR1cyk7CisJaW50IHN0YXR1cyA9IHVyYi0+c3RhdHVzOwogCi0JaWYgKHVyYi0+c3RhdHVzKSB7Ci0JCWRiZygiJXMgLSB1cmItPnN0YXR1cyA9ICVkIiwgX19mdW5jX18sIHVyYi0+c3RhdHVzKTsKLQkJaWYgKHVyYi0+c3RhdHVzID09IC1FUFJPVE8pIHsKKwlkYmcoIiVzIC0gc3RhdHVzID0gJWQiLCBfX2Z1bmNfXywgc3RhdHVzKTsKKworCWlmIChzdGF0dXMpIHsKKwkJaWYgKHN0YXR1cyA9PSAtRVBST1RPKSB7CiAJCQkvKiByZXNjaGVkdWxlIG5lZWRlZCAqLwogCQl9CiAJCXJldHVybjsKQEAgLTY5NSw3ICs3MDAsNyBAQAogCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQgPSB1cmItPmNvbnRleHQ7CiAJc3RydWN0IGl1dV9wcml2YXRlICpwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IHN0YXR1czsKKwlpbnQgc3RhdHVzID0gdXJiLT5zdGF0dXM7CiAJaW50IGVycm9yID0gMDsKIAlpbnQgbGVuID0gMDsKIAl1bnNpZ25lZCBjaGFyICpkYXRhID0gdXJiLT50cmFuc2Zlcl9idWZmZXI7CkBAIC03MDMsOCArNzA4LDggQEAKIAogCWRiZygiJXMgLSBlbnRlciIsIF9fZnVuY19fKTsKIAotCWlmICh1cmItPnN0YXR1cykgewotCQlkYmcoIiVzIC0gdXJiLT5zdGF0dXMgPSAlZCIsIF9fZnVuY19fLCB1cmItPnN0YXR1cyk7CisJaWYgKHN0YXR1cykgeworCQlkYmcoIiVzIC0gc3RhdHVzID0gJWQiLCBfX2Z1bmNfXywgc3RhdHVzKTsKIAkJLyogZXJyb3Igc3RvcCBhbGwgKi8KIAkJcmV0dXJuOwogCX0KQEAgLTc4MiwxMiArNzg3LDExIEBACiB7CiAJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IHVyYi0+Y29udGV4dDsKIAlpbnQgcmVzdWx0OwotCWRiZygiJXMgLSBlbnRlciIsIF9fZnVuY19fKTsKKwlpbnQgc3RhdHVzID0gdXJiLT5zdGF0dXM7CiAKLQlkYmcoIiVzIC0gdXJiLT5zdGF0dXMgPSAlZCIsIF9fZnVuY19fLCB1cmItPnN0YXR1cyk7CisJZGJnKCIlcyAtIHN0YXR1cyA9ICVkIiwgX19mdW5jX18sIHN0YXR1cyk7CiAKLQlpZiAodXJiLT5zdGF0dXMpIHsKLQkJZGJnKCIlcyAtIHVyYi0+c3RhdHVzID0gJWQiLCBfX2Z1bmNfXywgdXJiLT5zdGF0dXMpOworCWlmIChzdGF0dXMpIHsKIAkJLyogZXJyb3Igc3RvcCBhbGwgKi8KIAkJcmV0dXJuOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9tb3M3ODQwLmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvbW9zNzg0MC5jCmluZGV4IDk2YThjNzcuLjJjMjBlODggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC9tb3M3ODQwLmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL21vczc4NDAuYwpAQCAtMjE0LDYgKzIxNCw3IEBACiAJc3BpbmxvY2tfdCBwb29sX2xvY2s7CiAJc3RydWN0IHVyYiAqd3JpdGVfdXJiX3Bvb2xbTlVNX1VSQlNdOwogCWNoYXIgYnVzeVtOVU1fVVJCU107CisJYm9vbCByZWFkX3VyYl9idXN5OwogfTsKIAogCkBAIC02NzksMjYgKzY4MCwzMCBAQAogCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7CiAJaW50IHN0YXR1cyA9IHVyYi0+c3RhdHVzOwogCi0JaWYgKHN0YXR1cykgewotCQlkYmcoIm5vbnplcm8gcmVhZCBidWxrIHN0YXR1cyByZWNlaXZlZDogJWQiLCBzdGF0dXMpOwotCQlyZXR1cm47Ci0JfQotCiAJbW9zNzg0MF9wb3J0ID0gdXJiLT5jb250ZXh0OwogCWlmICghbW9zNzg0MF9wb3J0KSB7CiAJCWRiZygiJXMiLCAiTlVMTCBtb3M3ODQwX3BvcnQgcG9pbnRlciBcbiIpOworCQltb3M3ODQwX3BvcnQtPnJlYWRfdXJiX2J1c3kgPSBmYWxzZTsKKwkJcmV0dXJuOworCX0KKworCWlmIChzdGF0dXMpIHsKKwkJZGJnKCJub256ZXJvIHJlYWQgYnVsayBzdGF0dXMgcmVjZWl2ZWQ6ICVkIiwgc3RhdHVzKTsKKwkJbW9zNzg0MF9wb3J0LT5yZWFkX3VyYl9idXN5ID0gZmFsc2U7CiAJCXJldHVybjsKIAl9CiAKIAlwb3J0ID0gKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKiltb3M3ODQwX3BvcnQtPnBvcnQ7CiAJaWYgKG1vczc4NDBfcG9ydF9wYXJhbm9pYV9jaGVjayhwb3J0LCBfX2Z1bmNfXykpIHsKIAkJZGJnKCIlcyIsICJQb3J0IFBhcmFub2lhIGZhaWxlZCBcbiIpOworCQltb3M3ODQwX3BvcnQtPnJlYWRfdXJiX2J1c3kgPSBmYWxzZTsKIAkJcmV0dXJuOwogCX0KIAogCXNlcmlhbCA9IG1vczc4NDBfZ2V0X3VzYl9zZXJpYWwocG9ydCwgX19mdW5jX18pOwogCWlmICghc2VyaWFsKSB7CiAJCWRiZygiJXNcbiIsICJCYWQgc2VyaWFsIHBvaW50ZXIgIik7CisJCW1vczc4NDBfcG9ydC0+cmVhZF91cmJfYnVzeSA9IGZhbHNlOwogCQlyZXR1cm47CiAJfQogCkBAIC03MjUsMTcgKzczMCwxOSBAQAogCiAJaWYgKCFtb3M3ODQwX3BvcnQtPnJlYWRfdXJiKSB7CiAJCWRiZygiJXMiLCAiVVJCIEtJTExFRCAhISFcbiIpOworCQltb3M3ODQwX3BvcnQtPnJlYWRfdXJiX2J1c3kgPSBmYWxzZTsKIAkJcmV0dXJuOwogCX0KIAogCiAJbW9zNzg0MF9wb3J0LT5yZWFkX3VyYi0+ZGV2ID0gc2VyaWFsLT5kZXY7CiAKKwltb3M3ODQwX3BvcnQtPnJlYWRfdXJiX2J1c3kgPSB0cnVlOwogCXJldHZhbCA9IHVzYl9zdWJtaXRfdXJiKG1vczc4NDBfcG9ydC0+cmVhZF91cmIsIEdGUF9BVE9NSUMpOwogCiAJaWYgKHJldHZhbCkgewotCQlkYmcoIiB1c2Jfc3VibWl0X3VyYihyZWFkIGJ1bGspIGZhaWxlZCwgcmV0dmFsID0gJWQiLAotCQkgcmV0dmFsKTsKKwkJZGJnKCJ1c2Jfc3VibWl0X3VyYihyZWFkIGJ1bGspIGZhaWxlZCwgcmV0dmFsID0gJWQiLCByZXR2YWwpOworCQltb3M3ODQwX3BvcnQtPnJlYWRfdXJiX2J1c3kgPSBmYWxzZTsKIAl9CiB9CiAKQEAgLTEwNTUsMTAgKzEwNjIsMTIgQEAKIAogCWRiZygibW9zNzg0MF9vcGVuOiBidWxraW4gZW5kcG9pbnQgaXMgJWRcbiIsCiAJICAgIHBvcnQtPmJ1bGtfaW5fZW5kcG9pbnRBZGRyZXNzKTsKKwltb3M3ODQwX3BvcnQtPnJlYWRfdXJiX2J1c3kgPSB0cnVlOwogCXJlc3BvbnNlID0gdXNiX3N1Ym1pdF91cmIobW9zNzg0MF9wb3J0LT5yZWFkX3VyYiwgR0ZQX0tFUk5FTCk7CiAJaWYgKHJlc3BvbnNlKSB7CiAJCWRldl9lcnIoJnBvcnQtPmRldiwgIiVzIC0gRXJyb3IgJWQgc3VibWl0dGluZyBjb250cm9sIHVyYlxuIiwKIAkJCV9fZnVuY19fLCByZXNwb25zZSk7CisJCW1vczc4NDBfcG9ydC0+cmVhZF91cmJfYnVzeSA9IGZhbHNlOwogCX0KIAogCS8qIGluaXRpYWxpemUgb3VyIHdhaXQgcXVldWVzICovCkBAIC0xMjI3LDYgKzEyMzYsNyBAQAogCQlpZiAobW9zNzg0MF9wb3J0LT5yZWFkX3VyYikgewogCQkJZGJnKCIlcyIsICJTaHV0ZG93biBidWxrIHJlYWRcbiIpOwogCQkJdXNiX2tpbGxfdXJiKG1vczc4NDBfcG9ydC0+cmVhZF91cmIpOworCQkJbW9zNzg0MF9wb3J0LT5yZWFkX3VyYl9idXN5ID0gZmFsc2U7CiAJCX0KIAkJaWYgKCgmbW9zNzg0MF9wb3J0LT5jb250cm9sX3VyYikpIHsKIAkJCWRiZygiJXMiLCAiU2h1dGRvd24gY29udHJvbCByZWFkXG4iKTsKQEAgLTIwNDMsMTQgKzIwNTMsMTQgQEAKIAlEYXRhID0gMHgwYzsKIAltb3M3ODQwX3NldF91YXJ0X3JlZyhwb3J0LCBJTlRFUlJVUFRfRU5BQkxFX1JFR0lTVEVSLCBEYXRhKTsKIAotCWlmIChtb3M3ODQwX3BvcnQtPnJlYWRfdXJiLT5zdGF0dXMgIT0gLUVJTlBST0dSRVNTKSB7CisJaWYgKG1vczc4NDBfcG9ydC0+cmVhZF91cmJfYnVzeSA9PSBmYWxzZSkgewogCQltb3M3ODQwX3BvcnQtPnJlYWRfdXJiLT5kZXYgPSBzZXJpYWwtPmRldjsKLQorCQltb3M3ODQwX3BvcnQtPnJlYWRfdXJiX2J1c3kgPSB0cnVlOwogCQlzdGF0dXMgPSB1c2Jfc3VibWl0X3VyYihtb3M3ODQwX3BvcnQtPnJlYWRfdXJiLCBHRlBfQVRPTUlDKTsKLQogCQlpZiAoc3RhdHVzKSB7Ci0JCQlkYmcoIiB1c2Jfc3VibWl0X3VyYihyZWFkIGJ1bGspIGZhaWxlZCwgc3RhdHVzID0gJWQiLAorCQkJZGJnKCJ1c2Jfc3VibWl0X3VyYihyZWFkIGJ1bGspIGZhaWxlZCwgc3RhdHVzID0gJWQiLAogCQkJICAgIHN0YXR1cyk7CisJCQltb3M3ODQwX3BvcnQtPnJlYWRfdXJiX2J1c3kgPSBmYWxzZTsKIAkJfQogCX0KIAl3YWtlX3VwKCZtb3M3ODQwX3BvcnQtPmRlbHRhX21zcl93YWl0KTsKQEAgLTIxMTcsMTIgKzIxMjcsMTQgQEAKIAkJcmV0dXJuOwogCX0KIAotCWlmIChtb3M3ODQwX3BvcnQtPnJlYWRfdXJiLT5zdGF0dXMgIT0gLUVJTlBST0dSRVNTKSB7CisJaWYgKG1vczc4NDBfcG9ydC0+cmVhZF91cmJfYnVzeSA9PSBmYWxzZSkgewogCQltb3M3ODQwX3BvcnQtPnJlYWRfdXJiLT5kZXYgPSBzZXJpYWwtPmRldjsKKwkJbW9zNzg0MF9wb3J0LT5yZWFkX3VyYl9idXN5ID0gdHJ1ZTsKIAkJc3RhdHVzID0gdXNiX3N1Ym1pdF91cmIobW9zNzg0MF9wb3J0LT5yZWFkX3VyYiwgR0ZQX0FUT01JQyk7CiAJCWlmIChzdGF0dXMpIHsKLQkJCWRiZygiIHVzYl9zdWJtaXRfdXJiKHJlYWQgYnVsaykgZmFpbGVkLCBzdGF0dXMgPSAlZCIsCisJCQlkYmcoInVzYl9zdWJtaXRfdXJiKHJlYWQgYnVsaykgZmFpbGVkLCBzdGF0dXMgPSAlZCIsCiAJCQkgICAgc3RhdHVzKTsKKwkJCW1vczc4NDBfcG9ydC0+cmVhZF91cmJfYnVzeSA9IGZhbHNlOwogCQl9CiAJfQogCXJldHVybjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9vcHRpY29uLmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvb3B0aWNvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlYTMyNmYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwvb3B0aWNvbi5jCkBAIC0wLDAgKzEsMzU4IEBACisvKgorICogT3B0aWNvbiBVU0IgYmFyY29kZSB0byBzZXJpYWwgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA4IEdyZWcgS3JvYWgtSGFydG1hbiA8Z3JlZ2toQHN1c2UuZGU+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDggTm92ZWxsIEluYy4KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKgkyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvdHR5Lmg+CisjaW5jbHVkZSA8bGludXgvdHR5X2RyaXZlci5oPgorI2luY2x1ZGUgPGxpbnV4L3R0eV9mbGlwLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdXNiLmg+CisjaW5jbHVkZSA8bGludXgvdXNiL3NlcmlhbC5oPgorI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KKworc3RhdGljIGludCBkZWJ1ZzsKKworc3RhdGljIHN0cnVjdCB1c2JfZGV2aWNlX2lkIGlkX3RhYmxlW10gPSB7CisJeyBVU0JfREVWSUNFKDB4MDY1YSwgMHgwMDA5KSB9LAorCXsgfSwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHVzYiwgaWRfdGFibGUpOworCisvKiBUaGlzIHN0cnVjdHVyZSBob2xkcyBhbGwgb2YgdGhlIGluZGl2aWR1YWwgZGV2aWNlIGluZm9ybWF0aW9uICovCitzdHJ1Y3Qgb3B0aWNvbl9wcml2YXRlIHsKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldjsKKwlzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsOworCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQ7CisJdW5zaWduZWQgY2hhciAqYnVsa19pbl9idWZmZXI7CisJc3RydWN0IHVyYiAqYnVsa19yZWFkX3VyYjsKKwlpbnQgYnVmZmVyX3NpemU7CisJdTggYnVsa19hZGRyZXNzOworCXNwaW5sb2NrX3QgbG9jazsJLyogcHJvdGVjdHMgdGhlIGZvbGxvd2luZyBmbGFncyAqLworCWJvb2wgdGhyb3R0bGVkOworCWJvb2wgYWN0dWFsbHlfdGhyb3R0bGVkOworCWJvb2wgcnRzOworfTsKKworc3RhdGljIHZvaWQgb3B0aWNvbl9idWxrX2NhbGxiYWNrKHN0cnVjdCB1cmIgKnVyYikKK3sKKwlzdHJ1Y3Qgb3B0aWNvbl9wcml2YXRlICpwcml2ID0gdXJiLT5jb250ZXh0OworCXVuc2lnbmVkIGNoYXIgKmRhdGEgPSB1cmItPnRyYW5zZmVyX2J1ZmZlcjsKKwlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gcHJpdi0+cG9ydDsKKwlpbnQgc3RhdHVzID0gdXJiLT5zdGF0dXM7CisJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKKwlpbnQgcmVzdWx0OworCWludCBhdmFpbGFibGVfcm9vbSA9IDA7CisJaW50IGRhdGFfbGVuZ3RoOworCisJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKKworCXN3aXRjaCAoc3RhdHVzKSB7CisJY2FzZSAwOgorCQkvKiBzdWNjZXNzICovCisJCWJyZWFrOworCWNhc2UgLUVDT05OUkVTRVQ6CisJY2FzZSAtRU5PRU5UOgorCWNhc2UgLUVTSFVURE9XTjoKKwkJLyogdGhpcyB1cmIgaXMgdGVybWluYXRlZCwgY2xlYW4gdXAgKi8KKwkJZGJnKCIlcyAtIHVyYiBzaHV0dGluZyBkb3duIHdpdGggc3RhdHVzOiAlZCIsCisJCSAgICBfX2Z1bmNfXywgc3RhdHVzKTsKKwkJcmV0dXJuOworCWRlZmF1bHQ6CisJCWRiZygiJXMgLSBub256ZXJvIHVyYiBzdGF0dXMgcmVjZWl2ZWQ6ICVkIiwKKwkJICAgIF9fZnVuY19fLCBzdGF0dXMpOworCQlnb3RvIGV4aXQ7CisJfQorCisJdXNiX3NlcmlhbF9kZWJ1Z19kYXRhKGRlYnVnLCAmcG9ydC0+ZGV2LCBfX2Z1bmNfXywgdXJiLT5hY3R1YWxfbGVuZ3RoLAorCQkJICAgICAgZGF0YSk7CisKKwlpZiAodXJiLT5hY3R1YWxfbGVuZ3RoID4gMikgeworCQlkYXRhX2xlbmd0aCA9IHVyYi0+YWN0dWFsX2xlbmd0aCAtIDI7CisKKwkJLyoKKwkJICogRGF0YSBmcm9tIHRoZSBkZXZpY2UgY29tZXMgd2l0aCBhIDIgYnl0ZSBoZWFkZXI6CisJCSAqCisJCSAqIDwweDAwPjwweDAwPmRhdGEuLi4KKwkJICogCVRoaXMgaXMgcmVhbCBkYXRhIHRvIGJlIHNlbnQgdG8gdGhlIHR0eSBsYXllcgorCQkgKiA8MHgwMD48MHgwMSlsZXZlbAorCQkgKiAJVGhpcyBpcyBhIFJUUyBsZXZlbCBjaGFuZ2UsIHRoZSB0aGlyZCBieXRlIGlzIHRoZSBSVFMKKwkJICogCXZhbHVlICgwIGZvciBsb3csIDEgZm9yIGhpZ2gpLgorCQkgKi8KKwkJaWYgKChkYXRhWzBdID09IDB4MDApICYmIChkYXRhWzFdID09IDB4MDApKSB7CisJCQkvKiByZWFsIGRhdGEsIHNlbmQgaXQgdG8gdGhlIHR0eSBsYXllciAqLworCQkJdHR5ID0gdHR5X3BvcnRfdHR5X2dldCgmcG9ydC0+cG9ydCk7CisJCQlpZiAodHR5KSB7CisJCQkJYXZhaWxhYmxlX3Jvb20gPSB0dHlfYnVmZmVyX3JlcXVlc3Rfcm9vbSh0dHksCisJCQkJCQkJCWRhdGFfbGVuZ3RoKTsKKwkJCQlpZiAoYXZhaWxhYmxlX3Jvb20pIHsKKwkJCQkJdHR5X2luc2VydF9mbGlwX3N0cmluZyh0dHksIGRhdGEsCisJCQkJCQkJICAgICAgIGF2YWlsYWJsZV9yb29tKTsKKwkJCQkJdHR5X2ZsaXBfYnVmZmVyX3B1c2godHR5KTsKKwkJCQl9CisJCQkJdHR5X2tyZWZfcHV0KHR0eSk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAoKGRhdGFbMF0gPT0gMHgwMCkgJiYgKGRhdGFbMV0gPT0gMHgwMSkpIHsKKwkJCQlpZiAoZGF0YVsyXSA9PSAweDAwKQorCQkJCQlwcml2LT5ydHMgPSBmYWxzZTsKKwkJCQllbHNlCisJCQkJCXByaXYtPnJ0cyA9IHRydWU7CisJCQkJLyogRklYTUUgY2hhbmdlIHRoZSBSVFMgbGV2ZWwgKi8KKwkJCX0gZWxzZSB7CisJCQlkZXZfZGJnKCZwcml2LT51ZGV2LT5kZXYsCisJCQkJIlVua25vd24gZGF0YSBwYWNrZXQgcmVjZWl2ZWQgZnJvbSB0aGUgZGV2aWNlOiIKKwkJCQkiICUyeCAlMnhcbiIsCisJCQkJZGF0YVswXSwgZGF0YVsxXSk7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQlkZXZfZGJnKCZwcml2LT51ZGV2LT5kZXYsCisJCQkiSW1wcm9wZXIgYW1tb3VudCBvZiBkYXRhIHJlY2VpdmVkIGZyb20gdGhlIGRldmljZSwgIgorCQkJIiVkIGJ5dGVzIiwgdXJiLT5hY3R1YWxfbGVuZ3RoKTsKKwl9CisKK2V4aXQ6CisJc3Bpbl9sb2NrKCZwcml2LT5sb2NrKTsKKworCS8qIENvbnRpbnVlIHRyeWluZyB0byBhbHdheXMgcmVhZCBpZiB3ZSBzaG91bGQgKi8KKwlpZiAoIXByaXYtPnRocm90dGxlZCkgeworCQl1c2JfZmlsbF9idWxrX3VyYihwcml2LT5idWxrX3JlYWRfdXJiLCBwcml2LT51ZGV2LAorCQkJCSAgdXNiX3JjdmJ1bGtwaXBlKHByaXYtPnVkZXYsCisJCQkJCQkgIHByaXYtPmJ1bGtfYWRkcmVzcyksCisJCQkJICBwcml2LT5idWxrX2luX2J1ZmZlciwgcHJpdi0+YnVmZmVyX3NpemUsCisJCQkJICBvcHRpY29uX2J1bGtfY2FsbGJhY2ssIHByaXYpOworCQlyZXN1bHQgPSB1c2Jfc3VibWl0X3VyYihwb3J0LT5yZWFkX3VyYiwgR0ZQX0FUT01JQyk7CisJCWlmIChyZXN1bHQpCisJCQlkZXZfZXJyKCZwb3J0LT5kZXYsCisJCQkgICAgIiVzIC0gZmFpbGVkIHJlc3VibWl0dGluZyByZWFkIHVyYiwgZXJyb3IgJWRcbiIsCisJCQkJCQkJX19mdW5jX18sIHJlc3VsdCk7CisJfSBlbHNlCisJCXByaXYtPmFjdHVhbGx5X3Rocm90dGxlZCA9IHRydWU7CisJc3Bpbl91bmxvY2soJnByaXYtPmxvY2spOworfQorCitzdGF0aWMgaW50IG9wdGljb25fb3BlbihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LAorCQkJc3RydWN0IGZpbGUgKmZpbHApCit7CisJc3RydWN0IG9wdGljb25fcHJpdmF0ZSAqcHJpdiA9IHVzYl9nZXRfc2VyaWFsX2RhdGEocG9ydC0+c2VyaWFsKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXN1bHQgPSAwOworCisJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7CisJcHJpdi0+dGhyb3R0bGVkID0gZmFsc2U7CisJcHJpdi0+YWN0dWFsbHlfdGhyb3R0bGVkID0gZmFsc2U7CisJcHJpdi0+cG9ydCA9IHBvcnQ7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCisJLyoKKwkgKiBGb3JjZSBsb3dfbGF0ZW5jeSBvbiBzbyB0aGF0IG91ciB0dHlfcHVzaCBhY3R1YWxseSBmb3JjZXMgdGhlIGRhdGEKKwkgKiB0aHJvdWdoLCBvdGhlcndpc2UgaXQgaXMgc2NoZWR1bGVkLCBhbmQgd2l0aCBoaWdoIGRhdGEgcmF0ZXMgKGxpa2UKKwkgKiB3aXRoIE9IQ0kpIGRhdGEgY2FuIGdldCBsb3N0LgorCSAqLworCWlmICh0dHkpCisJCXR0eS0+bG93X2xhdGVuY3kgPSAxOworCisJLyogU3RhcnQgcmVhZGluZyBmcm9tIHRoZSBkZXZpY2UgKi8KKwl1c2JfZmlsbF9idWxrX3VyYihwcml2LT5idWxrX3JlYWRfdXJiLCBwcml2LT51ZGV2LAorCQkJICB1c2JfcmN2YnVsa3BpcGUocHJpdi0+dWRldiwKKwkJCQkJICBwcml2LT5idWxrX2FkZHJlc3MpLAorCQkJICBwcml2LT5idWxrX2luX2J1ZmZlciwgcHJpdi0+YnVmZmVyX3NpemUsCisJCQkgIG9wdGljb25fYnVsa19jYWxsYmFjaywgcHJpdik7CisJcmVzdWx0ID0gdXNiX3N1Ym1pdF91cmIocHJpdi0+YnVsa19yZWFkX3VyYiwgR0ZQX0tFUk5FTCk7CisJaWYgKHJlc3VsdCkKKwkJZGV2X2VycigmcG9ydC0+ZGV2LAorCQkJIiVzIC0gZmFpbGVkIHJlc3VibWl0dGluZyByZWFkIHVyYiwgZXJyb3IgJWRcbiIsCisJCQlfX2Z1bmNfXywgcmVzdWx0KTsKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgdm9pZCBvcHRpY29uX2Nsb3NlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsCisJCQkgIHN0cnVjdCBmaWxlICpmaWxwKQoreworCXN0cnVjdCBvcHRpY29uX3ByaXZhdGUgKnByaXYgPSB1c2JfZ2V0X3NlcmlhbF9kYXRhKHBvcnQtPnNlcmlhbCk7CisKKwlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOworCisJLyogc2h1dGRvd24gb3VyIHVyYnMgKi8KKwl1c2Jfa2lsbF91cmIocHJpdi0+YnVsa19yZWFkX3VyYik7Cit9CisKK3N0YXRpYyB2b2lkIG9wdGljb25fdGhyb3R0bGUoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gdHR5LT5kcml2ZXJfZGF0YTsKKwlzdHJ1Y3Qgb3B0aWNvbl9wcml2YXRlICpwcml2ID0gdXNiX2dldF9zZXJpYWxfZGF0YShwb3J0LT5zZXJpYWwpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOworCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7CisJcHJpdi0+dGhyb3R0bGVkID0gdHJ1ZTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7Cit9CisKKworc3RhdGljIHZvaWQgb3B0aWNvbl91bnRocm90dGxlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IHR0eS0+ZHJpdmVyX2RhdGE7CisJc3RydWN0IG9wdGljb25fcHJpdmF0ZSAqcHJpdiA9IHVzYl9nZXRfc2VyaWFsX2RhdGEocG9ydC0+c2VyaWFsKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXN1bHQ7CisKKwlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKwlwcml2LT50aHJvdHRsZWQgPSBmYWxzZTsKKwlwcml2LT5hY3R1YWxseV90aHJvdHRsZWQgPSBmYWxzZTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7CisKKwlwcml2LT5idWxrX3JlYWRfdXJiLT5kZXYgPSBwb3J0LT5zZXJpYWwtPmRldjsKKwlyZXN1bHQgPSB1c2Jfc3VibWl0X3VyYihwcml2LT5idWxrX3JlYWRfdXJiLCBHRlBfQVRPTUlDKTsKKwlpZiAocmVzdWx0KQorCQlkZXZfZXJyKCZwb3J0LT5kZXYsCisJCQkiJXMgLSBmYWlsZWQgc3VibWl0dGluZyByZWFkIHVyYiwgZXJyb3IgJWRcbiIsCisJCQkJCQkJX19mdW5jX18sIHJlc3VsdCk7Cit9CisKK3N0YXRpYyBpbnQgb3B0aWNvbl9zdGFydHVwKHN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwpCit7CisJc3RydWN0IG9wdGljb25fcHJpdmF0ZSAqcHJpdjsKKwlzdHJ1Y3QgdXNiX2hvc3RfaW50ZXJmYWNlICppbnRmOworCWludCBpOworCWludCByZXR2YWwgPSAtRU5PTUVNOworCWJvb2wgYnVsa19pbl9mb3VuZCA9IGZhbHNlOworCisJLyogY3JlYXRlIG91ciBwcml2YXRlIHNlcmlhbCBzdHJ1Y3R1cmUgKi8KKwlwcml2ID0ga3phbGxvYyhzaXplb2YoKnByaXYpLCBHRlBfS0VSTkVMKTsKKwlpZiAocHJpdiA9PSBOVUxMKSB7CisJCWRldl9lcnIoJnNlcmlhbC0+ZGV2LT5kZXYsICIlcyAtIE91dCBvZiBtZW1vcnlcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCXNwaW5fbG9ja19pbml0KCZwcml2LT5sb2NrKTsKKwlwcml2LT5zZXJpYWwgPSBzZXJpYWw7CisJcHJpdi0+cG9ydCA9IHNlcmlhbC0+cG9ydFswXTsKKwlwcml2LT51ZGV2ID0gc2VyaWFsLT5kZXY7CisKKwkvKiBmaW5kIG91ciBidWxrIGVuZHBvaW50ICovCisJaW50ZiA9IHNlcmlhbC0+aW50ZXJmYWNlLT5hbHRzZXR0aW5nOworCWZvciAoaSA9IDA7IGkgPCBpbnRmLT5kZXNjLmJOdW1FbmRwb2ludHM7ICsraSkgeworCQlzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVuZHBvaW50OworCisJCWVuZHBvaW50ID0gJmludGYtPmVuZHBvaW50W2ldLmRlc2M7CisJCWlmICghdXNiX2VuZHBvaW50X2lzX2J1bGtfaW4oZW5kcG9pbnQpKQorCQkJY29udGludWU7CisKKwkJcHJpdi0+YnVsa19yZWFkX3VyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7CisJCWlmICghcHJpdi0+YnVsa19yZWFkX3VyYikgeworCQkJZGV2X2VycigmcHJpdi0+dWRldi0+ZGV2LCAib3V0IG9mIG1lbW9yeVxuIik7CisJCQlnb3RvIGVycm9yOworCQl9CisKKwkJcHJpdi0+YnVmZmVyX3NpemUgPSBsZTE2X3RvX2NwdShlbmRwb2ludC0+d01heFBhY2tldFNpemUpICogMjsKKwkJcHJpdi0+YnVsa19pbl9idWZmZXIgPSBrbWFsbG9jKHByaXYtPmJ1ZmZlcl9zaXplLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFwcml2LT5idWxrX2luX2J1ZmZlcikgeworCQkJZGV2X2VycigmcHJpdi0+dWRldi0+ZGV2LCAib3V0IG9mIG1lbW9yeVxuIik7CisJCQlnb3RvIGVycm9yOworCQl9CisKKwkJcHJpdi0+YnVsa19hZGRyZXNzID0gZW5kcG9pbnQtPmJFbmRwb2ludEFkZHJlc3M7CisKKwkJLyogc2V0IHVwIG91ciBidWxrIHVyYiAqLworCQl1c2JfZmlsbF9idWxrX3VyYihwcml2LT5idWxrX3JlYWRfdXJiLCBwcml2LT51ZGV2LAorCQkJCSAgdXNiX3JjdmJ1bGtwaXBlKHByaXYtPnVkZXYsCisJCQkJCQkgIGVuZHBvaW50LT5iRW5kcG9pbnRBZGRyZXNzKSwKKwkJCQkgIHByaXYtPmJ1bGtfaW5fYnVmZmVyLCBwcml2LT5idWZmZXJfc2l6ZSwKKwkJCQkgIG9wdGljb25fYnVsa19jYWxsYmFjaywgcHJpdik7CisKKwkJYnVsa19pbl9mb3VuZCA9IHRydWU7CisJCWJyZWFrOworCQl9CisKKwlpZiAoIWJ1bGtfaW5fZm91bmQpIHsKKwkJZGV2X2VycigmcHJpdi0+dWRldi0+ZGV2LAorCQkJIkVycm9yIC0gdGhlIHByb3BlciBlbmRwb2ludHMgd2VyZSBub3QgZm91bmQhXG4iKTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwl1c2Jfc2V0X3NlcmlhbF9kYXRhKHNlcmlhbCwgcHJpdik7CisJcmV0dXJuIDA7CisKK2Vycm9yOgorCXVzYl9mcmVlX3VyYihwcml2LT5idWxrX3JlYWRfdXJiKTsKKwlrZnJlZShwcml2LT5idWxrX2luX2J1ZmZlcik7CisJa2ZyZWUocHJpdik7CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIHZvaWQgb3B0aWNvbl9zaHV0ZG93bihzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsKQoreworCXN0cnVjdCBvcHRpY29uX3ByaXZhdGUgKnByaXYgPSB1c2JfZ2V0X3NlcmlhbF9kYXRhKHNlcmlhbCk7CisKKwlkYmcoIiVzIiwgX19mdW5jX18pOworCisJdXNiX2tpbGxfdXJiKHByaXYtPmJ1bGtfcmVhZF91cmIpOworCXVzYl9mcmVlX3VyYihwcml2LT5idWxrX3JlYWRfdXJiKTsKKwlrZnJlZShwcml2LT5idWxrX2luX2J1ZmZlcik7CisJa2ZyZWUocHJpdik7CisJdXNiX3NldF9zZXJpYWxfZGF0YShzZXJpYWwsIE5VTEwpOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciBvcHRpY29uX2RyaXZlciA9IHsKKwkubmFtZSA9CQkib3B0aWNvbiIsCisJLnByb2JlID0JdXNiX3NlcmlhbF9wcm9iZSwKKwkuZGlzY29ubmVjdCA9CXVzYl9zZXJpYWxfZGlzY29ubmVjdCwKKwkuaWRfdGFibGUgPQlpZF90YWJsZSwKKwkubm9fZHluYW1pY19pZCA9IAkxLAorfTsKKworc3RhdGljIHN0cnVjdCB1c2Jfc2VyaWFsX2RyaXZlciBvcHRpY29uX2RldmljZSA9IHsKKwkuZHJpdmVyID0geworCQkub3duZXIgPQlUSElTX01PRFVMRSwKKwkJLm5hbWUgPQkJIm9wdGljb24iLAorCX0sCisJLmlkX3RhYmxlID0JCWlkX3RhYmxlLAorCS51c2JfZHJpdmVyID0gCQkmb3B0aWNvbl9kcml2ZXIsCisJLm51bV9wb3J0cyA9CQkxLAorCS5hdHRhY2ggPQkJb3B0aWNvbl9zdGFydHVwLAorCS5vcGVuID0JCQlvcHRpY29uX29wZW4sCisJLmNsb3NlID0JCW9wdGljb25fY2xvc2UsCisJLnNodXRkb3duID0JCW9wdGljb25fc2h1dGRvd24sCisJLnRocm90dGxlID0gCQlvcHRpY29uX3Rocm90dGxlLAorCS51bnRocm90dGxlID0JCW9wdGljb25fdW50aHJvdHRsZSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IG9wdGljb25faW5pdCh2b2lkKQoreworCWludCByZXR2YWw7CisKKwlyZXR2YWwgPSB1c2Jfc2VyaWFsX3JlZ2lzdGVyKCZvcHRpY29uX2RldmljZSk7CisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIHJldHZhbDsKKwlyZXR2YWwgPSB1c2JfcmVnaXN0ZXIoJm9wdGljb25fZHJpdmVyKTsKKwlpZiAocmV0dmFsKQorCQl1c2Jfc2VyaWFsX2RlcmVnaXN0ZXIoJm9wdGljb25fZGV2aWNlKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgb3B0aWNvbl9leGl0KHZvaWQpCit7CisJdXNiX2RlcmVnaXN0ZXIoJm9wdGljb25fZHJpdmVyKTsKKwl1c2Jfc2VyaWFsX2RlcmVnaXN0ZXIoJm9wdGljb25fZGV2aWNlKTsKK30KKworbW9kdWxlX2luaXQob3B0aWNvbl9pbml0KTsKK21vZHVsZV9leGl0KG9wdGljb25fZXhpdCk7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK21vZHVsZV9wYXJhbShkZWJ1ZywgYm9vbCwgU19JUlVHTyB8IFNfSVdVU1IpOworTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgIkRlYnVnIGVuYWJsZWQgb3Igbm90Iik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvb3B0aW9uLmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvb3B0aW9uLmMKaW5kZXggODA5Njk3Yi4uNWVkMTgzNCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL29wdGlvbi5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9vcHRpb24uYwpAQCAtNTIyLDkgKzUyMiw5IEBACiAvKiBwZXIgcG9ydCBwcml2YXRlIGRhdGEgKi8KIAogI2RlZmluZSBOX0lOX1VSQiA0Ci0jZGVmaW5lIE5fT1VUX1VSQiAxCisjZGVmaW5lIE5fT1VUX1VSQiA0CiAjZGVmaW5lIElOX0JVRkxFTiA0MDk2Ci0jZGVmaW5lIE9VVF9CVUZMRU4gMTI4CisjZGVmaW5lIE9VVF9CVUZMRU4gNDA5NgogCiBzdHJ1Y3Qgb3B0aW9uX3BvcnRfcHJpdmF0ZSB7CiAJLyogSW5wdXQgZW5kcG9pbnRzIGFuZCBidWZmZXIgZm9yIHRoaXMgcG9ydCAqLwpAQCAtNjU0LDEwICs2NTQsNiBAQAogCQkJdXNiX3VubGlua191cmIodGhpc191cmIpOwogCQkJY29udGludWU7CiAJCX0KLQkJaWYgKHRoaXNfdXJiLT5zdGF0dXMgIT0gMCkKLQkJCWRiZygidXNiX3dyaXRlICVwIGZhaWxlZCAoZXJyPSVkKSIsCi0JCQkJdGhpc191cmIsIHRoaXNfdXJiLT5zdGF0dXMpOwotCiAJCWRiZygiJXM6IGVuZHBvaW50ICVkIGJ1ZiAlZCIsIF9fZnVuY19fLAogCQkJdXNiX3BpcGVlbmRwb2ludCh0aGlzX3VyYi0+cGlwZSksIGkpOwogCkBAIC02NjksOCArNjY1LDcgQEAKIAkJZXJyID0gdXNiX3N1Ym1pdF91cmIodGhpc191cmIsIEdGUF9BVE9NSUMpOwogCQlpZiAoZXJyKSB7CiAJCQlkYmcoInVzYl9zdWJtaXRfdXJiICVwICh3cml0ZSBidWxrKSBmYWlsZWQgIgotCQkJCSIoJWQsIGhhcyAlZCkiLCB0aGlzX3VyYiwKLQkJCQllcnIsIHRoaXNfdXJiLT5zdGF0dXMpOworCQkJCSIoJWQpIiwgdGhpc191cmIsIGVycik7CiAJCQljbGVhcl9iaXQoaSwgJnBvcnRkYXRhLT5vdXRfYnVzeSk7CiAJCQljb250aW51ZTsKIAkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL3NpZW1lbnNfbXBpLmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvc2llbWVuc19tcGkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTFlYTBjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL3NpZW1lbnNfbXBpLmMKQEAgLTAsMCArMSw3NyBAQAorLyoKKyAqIFNpZW1lbnMgVVNCLU1QSSBTZXJpYWwgVVNCIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBUaG9tYXMgSGVyZ2VuaGFobiA8dGhvbWFzLmhlcmdlbmhhaG5Ac3VzZS5kZT4KKyAqIENvcHlyaWdodCAoQykgMjAwNSwyMDA4IEdyZWcgS3JvYWgtSGFydG1hbiA8Z3JlZ2toQHN1c2UuZGU+CisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICoJMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi9zZXJpYWwuaD4KKworLyogVmVyc2lvbiBJbmZvcm1hdGlvbiAqLworI2RlZmluZSBEUklWRVJfVkVSU0lPTiAiVmVyc2lvbiAwLjEgMDkvMjYvMjAwNSIKKyNkZWZpbmUgRFJJVkVSX0FVVEhPUiAiVGhvbWFzIEhlcmdlbmhhaG5Ad2ViLmRlIGh0dHA6Ly9saWJub2RhdmUuc2YubmV0IgorI2RlZmluZSBEUklWRVJfREVTQyAiRHJpdmVyIGZvciBTaWVtZW5zIFVTQi9NUEkgYWRhcHRlciIKKworCitzdGF0aWMgc3RydWN0IHVzYl9kZXZpY2VfaWQgaWRfdGFibGVbXSA9IHsKKwkvKiBWZW5kb3IgYW5kIHByb2R1Y3QgaWQgZm9yIDZFUzctOTcyLTBDQjIwLTBYQTAgKi8KKwl7IFVTQl9ERVZJQ0UoMHg5MDgsIDB4MDAwNCkgfSwKKwl7IH0sCit9OworTU9EVUxFX0RFVklDRV9UQUJMRSh1c2IsIGlkX3RhYmxlKTsKKworc3RhdGljIHN0cnVjdCB1c2JfZHJpdmVyIHNpZW1lbnNfdXNiX21waV9kcml2ZXIgPSB7CisJLm5hbWUgPQkJInNpZW1lbnNfbXBpIiwKKwkucHJvYmUgPQl1c2Jfc2VyaWFsX3Byb2JlLAorCS5kaXNjb25uZWN0ID0JdXNiX3NlcmlhbF9kaXNjb25uZWN0LAorCS5pZF90YWJsZSA9CWlkX3RhYmxlLAorfTsKKworc3RhdGljIHN0cnVjdCB1c2Jfc2VyaWFsX2RyaXZlciBzaWVtZW5zX3VzYl9tcGlfZGV2aWNlID0geworCS5kcml2ZXIgPSB7CisJCS5vd25lciA9CVRISVNfTU9EVUxFLAorCQkubmFtZSA9CQkic2llbWVuc19tcGkiLAorCX0sCisJLmlkX3RhYmxlID0JCWlkX3RhYmxlLAorCS5udW1fcG9ydHMgPQkJMSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHNpZW1lbnNfdXNiX21waV9pbml0KHZvaWQpCit7CisJaW50IHJldHZhbDsKKworCXJldHZhbCA9IHVzYl9zZXJpYWxfcmVnaXN0ZXIoJnNpZW1lbnNfdXNiX21waV9kZXZpY2UpOworCWlmIChyZXR2YWwpCisJCWdvdG8gZmFpbGVkX3VzYl9zZXJpYWxfcmVnaXN0ZXI7CisJcmV0dmFsID0gdXNiX3JlZ2lzdGVyKCZzaWVtZW5zX3VzYl9tcGlfZHJpdmVyKTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIGZhaWxlZF91c2JfcmVnaXN0ZXI7CisJcHJpbnRrKEtFUk5fSU5GTyBEUklWRVJfREVTQyAiXG4iKTsKKwlwcmludGsoS0VSTl9JTkZPIERSSVZFUl9WRVJTSU9OICIgIiBEUklWRVJfQVVUSE9SICJcbiIpOworCXJldHVybiByZXR2YWw7CitmYWlsZWRfdXNiX3JlZ2lzdGVyOgorCXVzYl9zZXJpYWxfZGVyZWdpc3Rlcigmc2llbWVuc191c2JfbXBpX2RldmljZSk7CitmYWlsZWRfdXNiX3NlcmlhbF9yZWdpc3RlcjoKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgc2llbWVuc191c2JfbXBpX2V4aXQodm9pZCkKK3sKKwl1c2JfZGVyZWdpc3Rlcigmc2llbWVuc191c2JfbXBpX2RyaXZlcik7CisJdXNiX3NlcmlhbF9kZXJlZ2lzdGVyKCZzaWVtZW5zX3VzYl9tcGlfZGV2aWNlKTsKK30KKworbW9kdWxlX2luaXQoc2llbWVuc191c2JfbXBpX2luaXQpOworbW9kdWxlX2V4aXQoc2llbWVuc191c2JfbXBpX2V4aXQpOworTU9EVUxFX0FVVEhPUihEUklWRVJfQVVUSE9SKTsKK01PRFVMRV9ERVNDUklQVElPTihEUklWRVJfREVTQyk7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvc3BjcDh4NS5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL3NwY3A4eDUuYwppbmRleCBhNjViYzJiLi41ZTc1MjhjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvc3BjcDh4NS5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9zcGNwOHg1LmMKQEAgLTcwOSwyMSArNzA5LDIwIEBACiAJdW5zaWduZWQgY2hhciAqZGF0YSA9IHVyYi0+dHJhbnNmZXJfYnVmZmVyOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IGk7Ci0JaW50IHJlc3VsdDsKLQl1OCBzdGF0dXMgPSAwOworCWludCByZXN1bHQgPSB1cmItPnN0YXR1czsKKwl1OCBzdGF0dXM7CiAJY2hhciB0dHlfZmxhZzsKIAotCWRldl9kYmcoJnBvcnQtPmRldiwgInN0YXJ0LCB1cmItPnN0YXR1cyA9ICVkLCAiCi0JCSJ1cmItPmFjdHVhbF9sZW5ndGggPSAlZFxuLCIsIHVyYi0+c3RhdHVzLCB1cmItPmFjdHVhbF9sZW5ndGgpOworCWRldl9kYmcoJnBvcnQtPmRldiwgInN0YXJ0LCByZXN1bHQgPSAlZCwgdXJiLT5hY3R1YWxfbGVuZ3RoID0gJWRcbiwiLAorCQlyZXN1bHQsIHVyYi0+YWN0dWFsX2xlbmd0aCk7CiAKIAkvKiBjaGVjayB0aGUgdXJiIHN0YXR1cyAqLwotCWlmICh1cmItPnN0YXR1cykgeworCWlmIChyZXN1bHQpIHsKIAkJaWYgKCFwb3J0LT5wb3J0LmNvdW50KQogCQkJcmV0dXJuOwotCQlpZiAodXJiLT5zdGF0dXMgPT0gLUVQUk9UTykgeworCQlpZiAocmVzdWx0ID09IC1FUFJPVE8pIHsKIAkJCS8qIHNwY3A4eDUgbXlzdGVyaW91c2x5IGZhaWxzIHdpdGggLUVQUk9UTyAqLwogCQkJLyogcmVzY2hlZHVsZSB0aGUgcmVhZCAqLwotCQkJdXJiLT5zdGF0dXMgPSAwOwogCQkJdXJiLT5kZXYgPSBwb3J0LT5zZXJpYWwtPmRldjsKIAkJCXJlc3VsdCA9IHVzYl9zdWJtaXRfdXJiKHVyYiAsIEdGUF9BVE9NSUMpOwogCQkJaWYgKHJlc3VsdCkKQEAgLTgzMyw4ICs4MzIsOSBAQAogCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQgPSB1cmItPmNvbnRleHQ7CiAJc3RydWN0IHNwY3A4eDVfcHJpdmF0ZSAqcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKIAlpbnQgcmVzdWx0OworCWludCBzdGF0dXMgPSB1cmItPnN0YXR1czsKIAotCXN3aXRjaCAodXJiLT5zdGF0dXMpIHsKKwlzd2l0Y2ggKHN0YXR1cykgewogCWNhc2UgMDoKIAkJLyogc3VjY2VzcyAqLwogCQlicmVhazsKQEAgLTg0MywxNCArODQzLDE0IEBACiAJY2FzZSAtRVNIVVRET1dOOgogCQkvKiB0aGlzIHVyYiBpcyB0ZXJtaW5hdGVkLCBjbGVhbiB1cCAqLwogCQlkZXZfZGJnKCZwb3J0LT5kZXYsICJ1cmIgc2h1dHRpbmcgZG93biB3aXRoIHN0YXR1czogJWRcbiIsCi0JCQl1cmItPnN0YXR1cyk7CisJCQlzdGF0dXMpOwogCQlwcml2LT53cml0ZV91cmJfaW5fdXNlID0gMDsKIAkJcmV0dXJuOwogCWRlZmF1bHQ6CiAJCS8qIGVycm9yIGluIHRoZSB1cmIsIHNvIHdlIGhhdmUgdG8gcmVzdWJtaXQgaXQgKi8KIAkJZGJnKCIlcyAtIE92ZXJmbG93IGluIHdyaXRlIiwgX19mdW5jX18pOwogCQlkYmcoIiVzIC0gbm9uemVybyB3cml0ZSBidWxrIHN0YXR1cyByZWNlaXZlZDogJWQiLAotCQkJX19mdW5jX18sIHVyYi0+c3RhdHVzKTsKKwkJCV9fZnVuY19fLCBzdGF0dXMpOwogCQlwb3J0LT53cml0ZV91cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggPSAxOwogCQlwb3J0LT53cml0ZV91cmItPmRldiA9IHBvcnQtPnNlcmlhbC0+ZGV2OwogCQlyZXN1bHQgPSB1c2Jfc3VibWl0X3VyYihwb3J0LT53cml0ZV91cmIsIEdGUF9BVE9NSUMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL3RpX3VzYl8zNDEwXzUwNTIuYyBiL2RyaXZlcnMvdXNiL3NlcmlhbC90aV91c2JfMzQxMF81MDUyLmMKaW5kZXggMDFkMGM3MC4uM2NmNDFkZiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL3RpX3VzYl8zNDEwXzUwNTIuYworKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwvdGlfdXNiXzM0MTBfNTA1Mi5jCkBAIC0xNDUsNyArMTQ1LDcgQEAKIHN0YXRpYyBpbnQgdGlfd3JpdGVfYnl0ZShzdHJ1Y3QgdGlfZGV2aWNlICp0ZGV2LCB1bnNpZ25lZCBsb25nIGFkZHIsCiAJX191OCBtYXNrLCBfX3U4IGJ5dGUpOwogCi1zdGF0aWMgaW50IHRpX2Rvd25sb2FkX2Zpcm13YXJlKHN0cnVjdCB0aV9kZXZpY2UgKnRkZXYsIGludCB0eXBlKTsKK3N0YXRpYyBpbnQgdGlfZG93bmxvYWRfZmlybXdhcmUoc3RydWN0IHRpX2RldmljZSAqdGRldik7CiAKIC8qIGNpcmN1bGFyIGJ1ZmZlciAqLwogc3RhdGljIHN0cnVjdCBjaXJjX2J1ZiAqdGlfYnVmX2FsbG9jKHZvaWQpOwpAQCAtMTc2LDkgKzE3NiwxNCBAQAogLyogdGhlIGFycmF5IGRpbWVuc2lvbiBpcyB0aGUgbnVtYmVyIG9mIGRlZmF1bHQgZW50cmllcyBwbHVzICovCiAvKiBUSV9FWFRSQV9WSURfUElEX0NPVU5UIHVzZXIgZGVmaW5lZCBlbnRyaWVzIHBsdXMgMSB0ZXJtaW5hdGluZyAqLwogLyogbnVsbCBlbnRyeSAqLwotc3RhdGljIHN0cnVjdCB1c2JfZGV2aWNlX2lkIHRpX2lkX3RhYmxlXzM0MTBbMStUSV9FWFRSQV9WSURfUElEX0NPVU5UKzFdID0geworc3RhdGljIHN0cnVjdCB1c2JfZGV2aWNlX2lkIHRpX2lkX3RhYmxlXzM0MTBbNytUSV9FWFRSQV9WSURfUElEX0NPVU5UKzFdID0gewogCXsgVVNCX0RFVklDRShUSV9WRU5ET1JfSUQsIFRJXzM0MTBfUFJPRFVDVF9JRCkgfSwKIAl7IFVTQl9ERVZJQ0UoVElfVkVORE9SX0lELCBUSV8zNDEwX0VaNDMwX0lEKSB9LAorCXsgVVNCX0RFVklDRShNVFNfVkVORE9SX0lELCBNVFNfR1NNX05PX0ZXX1BST0RVQ1RfSUQpIH0sCisJeyBVU0JfREVWSUNFKE1UU19WRU5ET1JfSUQsIE1UU19DRE1BX05PX0ZXX1BST0RVQ1RfSUQpIH0sCisJeyBVU0JfREVWSUNFKE1UU19WRU5ET1JfSUQsIE1UU19DRE1BX1BST0RVQ1RfSUQpIH0sCisJeyBVU0JfREVWSUNFKE1UU19WRU5ET1JfSUQsIE1UU19HU01fUFJPRFVDVF9JRCkgfSwKKwl7IFVTQl9ERVZJQ0UoTVRTX1ZFTkRPUl9JRCwgTVRTX0VER0VfUFJPRFVDVF9JRCkgfSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgdXNiX2RldmljZV9pZCB0aV9pZF90YWJsZV81MDUyWzQrVElfRVhUUkFfVklEX1BJRF9DT1VOVCsxXSA9IHsKQEAgLTE4OCw5ICsxOTMsMTQgQEAKIAl7IFVTQl9ERVZJQ0UoVElfVkVORE9SX0lELCBUSV81MDUyX0ZJUk1XQVJFX1BST0RVQ1RfSUQpIH0sCiB9OwogCi1zdGF0aWMgc3RydWN0IHVzYl9kZXZpY2VfaWQgdGlfaWRfdGFibGVfY29tYmluZWRbXSA9IHsKK3N0YXRpYyBzdHJ1Y3QgdXNiX2RldmljZV9pZCB0aV9pZF90YWJsZV9jb21iaW5lZFs2KzIqVElfRVhUUkFfVklEX1BJRF9DT1VOVCsxXSA9IHsKIAl7IFVTQl9ERVZJQ0UoVElfVkVORE9SX0lELCBUSV8zNDEwX1BST0RVQ1RfSUQpIH0sCiAJeyBVU0JfREVWSUNFKFRJX1ZFTkRPUl9JRCwgVElfMzQxMF9FWjQzMF9JRCkgfSwKKwl7IFVTQl9ERVZJQ0UoTVRTX1ZFTkRPUl9JRCwgTVRTX0dTTV9OT19GV19QUk9EVUNUX0lEKSB9LAorCXsgVVNCX0RFVklDRShNVFNfVkVORE9SX0lELCBNVFNfQ0RNQV9OT19GV19QUk9EVUNUX0lEKSB9LAorCXsgVVNCX0RFVklDRShNVFNfVkVORE9SX0lELCBNVFNfQ0RNQV9QUk9EVUNUX0lEKSB9LAorCXsgVVNCX0RFVklDRShNVFNfVkVORE9SX0lELCBNVFNfR1NNX1BST0RVQ1RfSUQpIH0sCisJeyBVU0JfREVWSUNFKE1UU19WRU5ET1JfSUQsIE1UU19FREdFX1BST0RVQ1RfSUQpIH0sCiAJeyBVU0JfREVWSUNFKFRJX1ZFTkRPUl9JRCwgVElfNTA1Ml9CT09UX1BST0RVQ1RfSUQpIH0sCiAJeyBVU0JfREVWSUNFKFRJX1ZFTkRPUl9JRCwgVElfNTE1Ml9CT09UX1BST0RVQ1RfSUQpIH0sCiAJeyBVU0JfREVWSUNFKFRJX1ZFTkRPUl9JRCwgVElfNTA1Ml9FRVBST01fUFJPRFVDVF9JRCkgfSwKQEAgLTI3Miw2ICsyODIsOSBAQAogCiBNT0RVTEVfRklSTVdBUkUoInRpXzM0MTAuZnciKTsKIE1PRFVMRV9GSVJNV0FSRSgidGlfNTA1Mi5mdyIpOworTU9EVUxFX0ZJUk1XQVJFKCJtdHNfY2RtYS5mdyIpOworTU9EVUxFX0ZJUk1XQVJFKCJtdHNfZ3NtLmZ3Iik7CitNT0RVTEVfRklSTVdBUkUoIm10c19lZGdlLmZ3Iik7CiAKIG1vZHVsZV9wYXJhbShkZWJ1ZywgYm9vbCwgU19JUlVHTyB8IFNfSVdVU1IpOwogTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgIkVuYWJsZSBkZWJ1Z2dpbmcsIDA9bm8sIDE9eWVzIik7CkBAIC0zMDQsMjEgKzMxNywyOCBAQAogCiBzdGF0aWMgaW50IF9faW5pdCB0aV9pbml0KHZvaWQpCiB7Ci0JaW50IGksIGo7CisJaW50IGksIGosIGM7CiAJaW50IHJldDsKIAogCS8qIGluc2VydCBleHRyYSB2ZW5kb3IgYW5kIHByb2R1Y3QgaWRzICovCisJYyA9IEFSUkFZX1NJWkUodGlfaWRfdGFibGVfY29tYmluZWQpIC0gMiAqIFRJX0VYVFJBX1ZJRF9QSURfQ09VTlQgLSAxOwogCWogPSBBUlJBWV9TSVpFKHRpX2lkX3RhYmxlXzM0MTApIC0gVElfRVhUUkFfVklEX1BJRF9DT1VOVCAtIDE7Ci0JZm9yIChpID0gMDsgaSA8IG1pbih2ZW5kb3JfMzQxMF9jb3VudCwgcHJvZHVjdF8zNDEwX2NvdW50KTsgaSsrLCBqKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgbWluKHZlbmRvcl8zNDEwX2NvdW50LCBwcm9kdWN0XzM0MTBfY291bnQpOyBpKyssIGorKywgYysrKSB7CiAJCXRpX2lkX3RhYmxlXzM0MTBbal0uaWRWZW5kb3IgPSB2ZW5kb3JfMzQxMFtpXTsKIAkJdGlfaWRfdGFibGVfMzQxMFtqXS5pZFByb2R1Y3QgPSBwcm9kdWN0XzM0MTBbaV07CiAJCXRpX2lkX3RhYmxlXzM0MTBbal0ubWF0Y2hfZmxhZ3MgPSBVU0JfREVWSUNFX0lEX01BVENIX0RFVklDRTsKKwkJdGlfaWRfdGFibGVfY29tYmluZWRbY10uaWRWZW5kb3IgPSB2ZW5kb3JfMzQxMFtpXTsKKwkJdGlfaWRfdGFibGVfY29tYmluZWRbY10uaWRQcm9kdWN0ID0gcHJvZHVjdF8zNDEwW2ldOworCQl0aV9pZF90YWJsZV9jb21iaW5lZFtjXS5tYXRjaF9mbGFncyA9IFVTQl9ERVZJQ0VfSURfTUFUQ0hfREVWSUNFOwogCX0KIAlqID0gQVJSQVlfU0laRSh0aV9pZF90YWJsZV81MDUyKSAtIFRJX0VYVFJBX1ZJRF9QSURfQ09VTlQgLSAxOwotCWZvciAoaSA9IDA7IGkgPCBtaW4odmVuZG9yXzUwNTJfY291bnQsIHByb2R1Y3RfNTA1Ml9jb3VudCk7IGkrKywgaisrKSB7CisJZm9yIChpID0gMDsgaSA8IG1pbih2ZW5kb3JfNTA1Ml9jb3VudCwgcHJvZHVjdF81MDUyX2NvdW50KTsgaSsrLCBqKyssIGMrKykgewogCQl0aV9pZF90YWJsZV81MDUyW2pdLmlkVmVuZG9yID0gdmVuZG9yXzUwNTJbaV07CiAJCXRpX2lkX3RhYmxlXzUwNTJbal0uaWRQcm9kdWN0ID0gcHJvZHVjdF81MDUyW2ldOwogCQl0aV9pZF90YWJsZV81MDUyW2pdLm1hdGNoX2ZsYWdzID0gVVNCX0RFVklDRV9JRF9NQVRDSF9ERVZJQ0U7CisJCXRpX2lkX3RhYmxlX2NvbWJpbmVkW2NdLmlkVmVuZG9yID0gdmVuZG9yXzUwNTJbaV07CisJCXRpX2lkX3RhYmxlX2NvbWJpbmVkW2NdLmlkUHJvZHVjdCA9IHByb2R1Y3RfNTA1MltpXTsKKwkJdGlfaWRfdGFibGVfY29tYmluZWRbY10ubWF0Y2hfZmxhZ3MgPSBVU0JfREVWSUNFX0lEX01BVENIX0RFVklDRTsKIAl9CiAKIAlyZXQgPSB1c2Jfc2VyaWFsX3JlZ2lzdGVyKCZ0aV8xcG9ydF9kZXZpY2UpOwpAQCAtMzkwLDExICs0MTAsNyBAQAogCiAJLyogaWYgd2UgaGF2ZSBvbmx5IDEgY29uZmlndXJhdGlvbiwgZG93bmxvYWQgZmlybXdhcmUgKi8KIAlpZiAoZGV2LT5kZXNjcmlwdG9yLmJOdW1Db25maWd1cmF0aW9ucyA9PSAxKSB7Ci0JCWlmICh0ZGV2LT50ZF9pc18zNDEwKQotCQkJc3RhdHVzID0gdGlfZG93bmxvYWRfZmlybXdhcmUodGRldiwgMzQxMCk7Ci0JCWVsc2UKLQkJCXN0YXR1cyA9IHRpX2Rvd25sb2FkX2Zpcm13YXJlKHRkZXYsIDUwNTIpOwotCQlpZiAoc3RhdHVzKQorCQlpZiAoKHN0YXR1cyA9IHRpX2Rvd25sb2FkX2Zpcm13YXJlKHRkZXYpKSAhPSAwKQogCQkJZ290byBmcmVlX3RkZXY7CiAKIAkJLyogMzQxMCBtdXN0IGJlIHJlc2V0LCA1MDUyIHJlc2V0cyBpdHNlbGYgKi8KQEAgLTE2NzEsOSArMTY4Nyw5IEBACiAJcmV0dXJuIHN0YXR1czsKIH0KIAotc3RhdGljIGludCB0aV9kb3dubG9hZF9maXJtd2FyZShzdHJ1Y3QgdGlfZGV2aWNlICp0ZGV2LCBpbnQgdHlwZSkKK3N0YXRpYyBpbnQgdGlfZG93bmxvYWRfZmlybXdhcmUoc3RydWN0IHRpX2RldmljZSAqdGRldikKIHsKLQlpbnQgc3RhdHVzID0gLUVOT01FTTsKKwlpbnQgc3RhdHVzOwogCWludCBidWZmZXJfc2l6ZTsKIAlfX3U4ICpidWZmZXI7CiAJc3RydWN0IHVzYl9kZXZpY2UgKmRldiA9IHRkZXYtPnRkX3NlcmlhbC0+ZGV2OwpAQCAtMTY4MSw5ICsxNjk3LDM0IEBACiAJCXRkZXYtPnRkX3NlcmlhbC0+cG9ydFswXS0+YnVsa19vdXRfZW5kcG9pbnRBZGRyZXNzKTsKIAljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3X3A7CiAJY2hhciBidWZbMzJdOwotCXNwcmludGYoYnVmLCAidGlfdXNiLSVkLmJpbiIsIHR5cGUpOwogCi0JaWYgKHJlcXVlc3RfZmlybXdhcmUoJmZ3X3AsIGJ1ZiwgJmRldi0+ZGV2KSkgeworCS8qIHRyeSBJRCBzcGVjaWZpYyBmaXJtd2FyZSBmaXJzdCwgdGhlbiB0cnkgZ2VuZXJpYyBmaXJtd2FyZSAqLworCXNwcmludGYoYnVmLCAidGlfdXNiLXYlMDR4LXAlMDR4LmZ3IiwgZGV2LT5kZXNjcmlwdG9yLmlkVmVuZG9yLAorCSAgICBkZXYtPmRlc2NyaXB0b3IuaWRQcm9kdWN0KTsKKwlpZiAoKHN0YXR1cyA9IHJlcXVlc3RfZmlybXdhcmUoJmZ3X3AsIGJ1ZiwgJmRldi0+ZGV2KSkgIT0gMCkgeworCQlidWZbMF0gPSAnXDAnOworCQlpZiAoZGV2LT5kZXNjcmlwdG9yLmlkVmVuZG9yID09IE1UU19WRU5ET1JfSUQpIHsKKwkJCXN3aXRjaCAoZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCkgeworCQkJY2FzZSBNVFNfQ0RNQV9QUk9EVUNUX0lEOgorCQkJCXN0cmNweShidWYsICJtdHNfY2RtYS5mdyIpOworCQkJCWJyZWFrOworCQkJY2FzZSBNVFNfR1NNX1BST0RVQ1RfSUQ6CisJCQkJc3RyY3B5KGJ1ZiwgIm10c19nc20uZnciKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgTVRTX0VER0VfUFJPRFVDVF9JRDoKKwkJCQlzdHJjcHkoYnVmLCAibXRzX2VkZ2UuZnciKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpZiAoYnVmWzBdID09ICdcMCcpIHsKKwkJCWlmICh0ZGV2LT50ZF9pc18zNDEwKQorCQkJCXN0cmNweShidWYsICJ0aV8zNDEwLmZ3Iik7CisJCQllbHNlCisJCQkJc3RyY3B5KGJ1ZiwgInRpXzUwNTIuZnciKTsKKwkJfQorCQlzdGF0dXMgPSByZXF1ZXN0X2Zpcm13YXJlKCZmd19wLCBidWYsICZkZXYtPmRldik7CisJfQorCWlmIChzdGF0dXMpIHsKIAkJZGV2X2VycigmZGV2LT5kZXYsICIlcyAtIGZpcm13YXJlIG5vdCBmb3VuZFxuIiwgX19mdW5jX18pOwogCQlyZXR1cm4gLUVOT0VOVDsKIAl9CkBAIC0xNjk5LDYgKzE3NDAsOCBAQAogCQltZW1zZXQoYnVmZmVyICsgZndfcC0+c2l6ZSwgMHhmZiwgYnVmZmVyX3NpemUgLSBmd19wLT5zaXplKTsKIAkJc3RhdHVzID0gdGlfZG9fZG93bmxvYWQoZGV2LCBwaXBlLCBidWZmZXIsIGZ3X3AtPnNpemUpOwogCQlrZnJlZShidWZmZXIpOworCX0gZWxzZSB7CisJCXN0YXR1cyA9IC1FTk9NRU07CiAJfQogCXJlbGVhc2VfZmlybXdhcmUoZndfcCk7CiAJaWYgKHN0YXR1cykgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL3RpX3VzYl8zNDEwXzUwNTIuaCBiL2RyaXZlcnMvdXNiL3NlcmlhbC90aV91c2JfMzQxMF81MDUyLmgKaW5kZXggYjU1NDFiZi4uN2U0NzUyZiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL3RpX3VzYl8zNDEwXzUwNTIuaAorKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwvdGlfdXNiXzM0MTBfNTA1Mi5oCkBAIC0zNCw2ICszNCwxNCBAQAogI2RlZmluZSBUSV81MDUyX0VFUFJPTV9QUk9EVUNUX0lECTB4NTA1QQkvKiBFRVBST00sIG5vIGZpcm13YXJlICovCiAjZGVmaW5lIFRJXzUwNTJfRklSTVdBUkVfUFJPRFVDVF9JRAkweDUwNUYJLyogZmlybXdhcmUgaXMgcnVubmluZyAqLwogCisvKiBNdWx0aS1UZWNoIHZlbmRvciBhbmQgcHJvZHVjdCBpZHMgKi8KKyNkZWZpbmUgTVRTX1ZFTkRPUl9JRAkJCTB4MDZFMAorI2RlZmluZSBNVFNfR1NNX05PX0ZXX1BST0RVQ1RfSUQJMHhGMTA4CisjZGVmaW5lIE1UU19DRE1BX05PX0ZXX1BST0RVQ1RfSUQJMHhGMTA5CisjZGVmaW5lIE1UU19DRE1BX1BST0RVQ1RfSUQJCTB4RjExMAorI2RlZmluZSBNVFNfR1NNX1BST0RVQ1RfSUQJCTB4RjExMQorI2RlZmluZSBNVFNfRURHRV9QUk9EVUNUX0lECQkweEYxMTIKKwogLyogQ29tbWFuZHMgKi8KICNkZWZpbmUgVElfR0VUX1ZFUlNJT04JCQkweDAxCiAjZGVmaW5lIFRJX0dFVF9QT1JUX1NUQVRVUwkJMHgwMgpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL3VzYi1zZXJpYWwuYyBiL2RyaXZlcnMvdXNiL3NlcmlhbC91c2Itc2VyaWFsLmMKaW5kZXggMDgwYWRlMi4uY2ZjZmQ1YSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL3VzYi1zZXJpYWwuYworKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwvdXNiLXNlcmlhbC5jCkBAIC01MTEsOSArNTExLDYgQEAKIAogCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAKLQlpZiAoIXBvcnQpCi0JCXJldHVybjsKLQogCXR0eSA9IHR0eV9wb3J0X3R0eV9nZXQoJnBvcnQtPnBvcnQpOwogCWlmICghdHR5KQogCQlyZXR1cm47CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvdXNiX2RlYnVnLmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvdXNiX2RlYnVnLmMKaW5kZXggZmM1ZDk5NS4uNmM5Y2JiNSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL3VzYl9kZWJ1Zy5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC91c2JfZGVidWcuYwpAQCAtMzEsNyArMzEsNyBAQAogCS5ub19keW5hbWljX2lkID0gCTEsCiB9OwogCi1pbnQgdXNiX2RlYnVnX29wZW4oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwKK3N0YXRpYyBpbnQgdXNiX2RlYnVnX29wZW4oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwKIAkJCQkJCQlzdHJ1Y3QgZmlsZSAqZmlscCkKIHsKIAlwb3J0LT5idWxrX291dF9zaXplID0gVVNCX0RFQlVHX01BWF9QQUNLRVRfU0laRTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3N0b3JhZ2UvS2NvbmZpZyBiL2RyaXZlcnMvdXNiL3N0b3JhZ2UvS2NvbmZpZwppbmRleCBjNjhiNzM4Li45ZGY2ODg3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zdG9yYWdlL0tjb25maWcKKysrIGIvZHJpdmVycy91c2Ivc3RvcmFnZS9LY29uZmlnCkBAIC02MSwxMyArNjEsNiBAQAogCSAgLSBDeVEndmUgQ1E4MDYwQSBDRFJXIGRyaXZlCiAJICAtIFBsYW5leCBlWHRyZW1lIERyaXZlIFJYLTI1SFUgVVNCLUlERSBjYWJsZSAobm90IG1vZGVsIFJYLTI1VSkKIAotY29uZmlnIFVTQl9TVE9SQUdFX0RQQ00KLQlib29sICJNaWNyb3RlY2gvWmlPISBDb21wYWN0Rmxhc2gvU21hcnRNZWRpYSBzdXBwb3J0IgotCWRlcGVuZHMgb24gVVNCX1NUT1JBR0UKLQloZWxwCi0JICBTYXkgWSBoZXJlIHRvIHN1cHBvcnQgdGhlIE1pY3JvdGVjaC9aaU8hIENvbXBhY3RGbGFzaCByZWFkZXIuCi0JICBUaGVyZSBpcyBhIHdlYiBwYWdlIGF0IDxodHRwOi8vd3d3Lnppb2NvcnAuY29tL3Byb2R1Y3RzLz4uCi0KIGNvbmZpZyBVU0JfU1RPUkFHRV9VU0JBVAogCWJvb2wgIlVTQkFUL1VTQkFUMDItYmFzZWQgc3RvcmFnZSBzdXBwb3J0IgogCWRlcGVuZHMgb24gVVNCX1NUT1JBR0UKQEAgLTkwLDEyICs4MywxMiBAQAogCSAgLSBTYW5kaXNrIEltYWdlTWF0ZSBTRERSLTA1YgogCiBjb25maWcgVVNCX1NUT1JBR0VfU0REUjA5Ci0JYm9vbCAiU2FuRGlzayBTRERSLTA5IChhbmQgb3RoZXIgU21hcnRNZWRpYSkgc3VwcG9ydCIKKwlib29sICJTYW5EaXNrIFNERFItMDkgKGFuZCBvdGhlciBTbWFydE1lZGlhLCBpbmNsdWRpbmcgRFBDTSkgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIFVTQl9TVE9SQUdFCiAJaGVscAogCSAgU2F5IFkgaGVyZSB0byBpbmNsdWRlIGFkZGl0aW9uYWwgY29kZSB0byBzdXBwb3J0IHRoZSBTYW5kaXNrIFNERFItMDkKIAkgIFNtYXJ0TWVkaWEgcmVhZGVyIGluIHRoZSBVU0IgTWFzcyBTdG9yYWdlIGRyaXZlci4KLQkgIEFsc28gd29ya3MgZm9yIHRoZSBNaWNyb3RlY2ggWmlvISBTbWFydE1lZGlhIHJlYWRlci4KKwkgIEFsc28gd29ya3MgZm9yIHRoZSBNaWNyb3RlY2ggWmlvISBDb21wYWN0Rmxhc2gvU21hcnRNZWRpYSByZWFkZXIuCiAKIGNvbmZpZyBVU0JfU1RPUkFHRV9TRERSNTUKIAlib29sICJTYW5EaXNrIFNERFItNTUgU21hcnRNZWRpYSBzdXBwb3J0IgpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc3RvcmFnZS9NYWtlZmlsZSBiL2RyaXZlcnMvdXNiL3N0b3JhZ2UvTWFrZWZpbGUKaW5kZXggN2Y4YmViNS4uYjMyMDY5MyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc3RvcmFnZS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3VzYi9zdG9yYWdlL01ha2VmaWxlCkBAIC0xNCw3ICsxNCw2IEBACiB1c2Itc3RvcmFnZS1vYmotJChDT05GSUdfVVNCX1NUT1JBR0VfU0REUjA5KQkrPSBzZGRyMDkubwogdXNiLXN0b3JhZ2Utb2JqLSQoQ09ORklHX1VTQl9TVE9SQUdFX1NERFI1NSkJKz0gc2RkcjU1Lm8KIHVzYi1zdG9yYWdlLW9iai0kKENPTkZJR19VU0JfU1RPUkFHRV9GUkVFQ09NKQkrPSBmcmVlY29tLm8KLXVzYi1zdG9yYWdlLW9iai0kKENPTkZJR19VU0JfU1RPUkFHRV9EUENNKQkrPSBkcGNtLm8KIHVzYi1zdG9yYWdlLW9iai0kKENPTkZJR19VU0JfU1RPUkFHRV9JU0QyMDApCSs9IGlzZDIwMC5vCiB1c2Itc3RvcmFnZS1vYmotJChDT05GSUdfVVNCX1NUT1JBR0VfREFUQUZBQikJKz0gZGF0YWZhYi5vCiB1c2Itc3RvcmFnZS1vYmotJChDT05GSUdfVVNCX1NUT1JBR0VfSlVNUFNIT1QpCSs9IGp1bXBzaG90Lm8KQEAgLTI0LDcgKzIzLDcgQEAKIHVzYi1zdG9yYWdlLW9iai0kKENPTkZJR19VU0JfU1RPUkFHRV9DWVBSRVNTX0FUQUNCKSArPSBjeXByZXNzX2F0YWNiLm8KIAogdXNiLXN0b3JhZ2Utb2JqcyA6PQlzY3NpZ2x1ZS5vIHByb3RvY29sLm8gdHJhbnNwb3J0Lm8gdXNiLm8gXAotCQkJaW5pdGlhbGl6ZXJzLm8gc2llcnJhX21zLm8gJCh1c2Itc3RvcmFnZS1vYmoteSkKKwkJCWluaXRpYWxpemVycy5vIHNpZXJyYV9tcy5vIG9wdGlvbl9tcy5vICQodXNiLXN0b3JhZ2Utb2JqLXkpCiAKIGlmbmVxICgkKENPTkZJR19VU0JfTElCVVNVQUwpLCkKIAlvYmotJChDT05GSUdfVVNCKQkrPSBsaWJ1c3VhbC5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zdG9yYWdlL2RwY20uYyBiL2RyaXZlcnMvdXNiL3N0b3JhZ2UvZHBjbS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Mzk5MjM0Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvdXNiL3N0b3JhZ2UvZHBjbS5jCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyogRHJpdmVyIGZvciBNaWNyb3RlY2ggRFBDTS1VU0IgQ29tcGFjdEZsYXNoL1NtYXJ0TWVkaWEgcmVhZGVyCi0gKgotICogRFBDTSBkcml2ZXIgdjAuMToKLSAqCi0gKiBGaXJzdCByZWxlYXNlCi0gKgotICogQ3VycmVudCBkZXZlbG9wbWVudCBhbmQgbWFpbnRlbmFuY2UgYnk6Ci0gKiAgIChjKSAyMDAwIEJyaWFuIFdlYmIgKHdlYmJiQGVhcnRobGluay5uZXQpCi0gKgotICogVGhpcyBkZXZpY2UgY29udGFpbnMgYm90aCBhIENvbXBhY3RGbGFzaCBjYXJkIHJlYWRlciwgd2hpY2gKLSAqIHVzZXMgdGhlIENvbnRyb2wvQnVsayB3L28gSW50ZXJydXB0IHByb3RvY29sIGFuZAotICogYSBTbWFydE1lZGlhIGNhcmQgcmVhZGVyIHRoYXQgdXNlcyB0aGUgc2FtZSBwcm90b2NvbAotICogYXMgdGhlIFNERFIwOS4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55Ci0gKiBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLSAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gKiA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KLSAqLwotCi0jaW5jbHVkZSA8c2NzaS9zY3NpLmg+Ci0jaW5jbHVkZSA8c2NzaS9zY3NpX2NtbmQuaD4KLSNpbmNsdWRlIDxzY3NpL3Njc2lfZGV2aWNlLmg+Ci0KLSNpbmNsdWRlICJ1c2IuaCIKLSNpbmNsdWRlICJ0cmFuc3BvcnQuaCIKLSNpbmNsdWRlICJwcm90b2NvbC5oIgotI2luY2x1ZGUgImRlYnVnLmgiCi0jaW5jbHVkZSAiZHBjbS5oIgotI2luY2x1ZGUgInNkZHIwOS5oIgotCi0vKgotICogVHJhbnNwb3J0IGZvciB0aGUgTWljcm90ZWNoIERQQ00tVVNCCi0gKgotICovCi1pbnQgZHBjbV90cmFuc3BvcnQoc3RydWN0IHNjc2lfY21uZCAqc3JiLCBzdHJ1Y3QgdXNfZGF0YSAqdXMpCi17Ci0JaW50IHJldDsKLQotCWlmIChzcmIgPT0gTlVMTCkKLQkJcmV0dXJuIFVTQl9TVE9SX1RSQU5TUE9SVF9FUlJPUjsKLQotCVVTX0RFQlVHUCgiZHBjbV90cmFuc3BvcnQ6IExVTj0lZFxuIiwgc3JiLT5kZXZpY2UtPmx1bik7Ci0KLQlzd2l0Y2ggKHNyYi0+ZGV2aWNlLT5sdW4pIHsKLQkJY2FzZSAwOgotCi0JCQkvKgotCQkJICogTFVOIDAgY29ycmVzcG9uZHMgdG8gdGhlIENvbXBhY3RGbGFzaCBjYXJkIHJlYWRlci4KLQkJCSAqLwotCQkJcmV0ID0gdXNiX3N0b3JfQ0JfdHJhbnNwb3J0KHNyYiwgdXMpOwotCQkJYnJlYWs7Ci0KLSNpZmRlZiBDT05GSUdfVVNCX1NUT1JBR0VfU0REUjA5Ci0JCWNhc2UgMToKLQotCQkJLyoKLQkJCSAqIExVTiAxIGNvcnJlc3BvbmRzIHRvIHRoZSBTbWFydE1lZGlhIGNhcmQgcmVhZGVyLgotCQkJICovCi0KLQkJCS8qCi0JCQkgKiBTZXQgdGhlIExVTiB0byAwIChqdXN0IGluIGNhc2UpLgotCQkJICovCi0JCQlzcmItPmRldmljZS0+bHVuID0gMDsgdXMtPnNyYi0+ZGV2aWNlLT5sdW4gPSAwOwotCQkJcmV0ID0gc2RkcjA5X3RyYW5zcG9ydChzcmIsIHVzKTsKLQkJCXNyYi0+ZGV2aWNlLT5sdW4gPSAxOyB1cy0+c3JiLT5kZXZpY2UtPmx1biA9IDE7Ci0JCQlicmVhazsKLQotI2VuZGlmCi0KLQkJZGVmYXVsdDoKLQkJCVVTX0RFQlVHUCgiZHBjbV90cmFuc3BvcnQ6IEludmFsaWQgTFVOICVkXG4iLCBzcmItPmRldmljZS0+bHVuKTsKLQkJCXJldCA9IFVTQl9TVE9SX1RSQU5TUE9SVF9FUlJPUjsKLQkJCWJyZWFrOwotCX0KLQlyZXR1cm4gcmV0OwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc3RvcmFnZS9kcGNtLmggYi9kcml2ZXJzL3VzYi9zdG9yYWdlL2RwY20uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTdiN2IwZi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3VzYi9zdG9yYWdlL2RwY20uaAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qIERyaXZlciBmb3IgTWljcm90ZWNoIERQQ00tVVNCIENvbXBhY3RGbGFzaC9TbWFydE1lZGlhIHJlYWRlcgotICoKLSAqIERQQ00gZHJpdmVyIHYwLjE6Ci0gKgotICogRmlyc3QgcmVsZWFzZQotICoKLSAqIEN1cnJlbnQgZGV2ZWxvcG1lbnQgYW5kIG1haW50ZW5hbmNlIGJ5OgotICogICAoYykgMjAwMCBCcmlhbiBXZWJiICh3ZWJiYkBlYXJ0aGxpbmsubmV0KQotICoKLSAqIFNlZSBkcGNtLmMgZm9yIG1vcmUgZXhwbGFuYXRpb24KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55Ci0gKiBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLSAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gKiA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KLSAqLwotCi0jaWZuZGVmIF9NSUNST1RFQ0hfRFBDTV9VU0JfSAotI2RlZmluZSBfTUlDUk9URUNIX0RQQ01fVVNCX0gKLQotZXh0ZXJuIGludCBkcGNtX3RyYW5zcG9ydChzdHJ1Y3Qgc2NzaV9jbW5kICpzcmIsIHN0cnVjdCB1c19kYXRhICp1cyk7Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc3RvcmFnZS9saWJ1c3VhbC5jIGIvZHJpdmVycy91c2Ivc3RvcmFnZS9saWJ1c3VhbC5jCmluZGV4IGQ2MTdlOGEuLmY5NzBiMjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3N0b3JhZ2UvbGlidXN1YWwuYworKysgYi9kcml2ZXJzL3VzYi9zdG9yYWdlL2xpYnVzdWFsLmMKQEAgLTQ2LDYgKzQ2LDEyIEBACiB7IFVTQl9ERVZJQ0VfVkVSKGlkX3ZlbmRvciwgaWRfcHJvZHVjdCwgYmNkRGV2aWNlTWluLGJjZERldmljZU1heCksIFwKICAgLmRyaXZlcl9pbmZvID0gKGZsYWdzKXwoVVNCX1VTX1RZUEVfU1RPUjw8MjQpIH0KIAorI2RlZmluZSBDT01QTElBTlRfREVWKGlkX3ZlbmRvciwgaWRfcHJvZHVjdCwgYmNkRGV2aWNlTWluLCBiY2REZXZpY2VNYXgsIFwKKwkJICAgIHZlbmRvck5hbWUsIHByb2R1Y3ROYW1lLCB1c2VQcm90b2NvbCwgdXNlVHJhbnNwb3J0LCBcCisJCSAgICBpbml0RnVuY3Rpb24sIGZsYWdzKSBcCit7IFVTQl9ERVZJQ0VfVkVSKGlkX3ZlbmRvciwgaWRfcHJvZHVjdCwgYmNkRGV2aWNlTWluLCBiY2REZXZpY2VNYXgpLCBcCisgIC5kcml2ZXJfaW5mbyA9IChmbGFncykgfQorCiAjZGVmaW5lIFVTVUFMX0RFVih1c2VQcm90bywgdXNlVHJhbnMsIHVzZVR5cGUpIFwKIHsgVVNCX0lOVEVSRkFDRV9JTkZPKFVTQl9DTEFTU19NQVNTX1NUT1JBR0UsIHVzZVByb3RvLCB1c2VUcmFucyksIFwKICAgLmRyaXZlcl9pbmZvID0gKCh1c2VUeXBlKTw8MjQpIH0KQEAgLTU3LDYgKzYzLDcgQEAKIAogI3VuZGVmIFVTVUFMX0RFVgogI3VuZGVmIFVOVVNVQUxfREVWCisjdW5kZWYgQ09NUExJQU5UX0RFVgogCiBNT0RVTEVfREVWSUNFX1RBQkxFKHVzYiwgc3RvcmFnZV91c2JfaWRzKTsKIEVYUE9SVF9TWU1CT0xfR1BMKHN0b3JhZ2VfdXNiX2lkcyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zdG9yYWdlL29wdGlvbl9tcy5jIGIvZHJpdmVycy91c2Ivc3RvcmFnZS9vcHRpb25fbXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTNmOTIyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy91c2Ivc3RvcmFnZS9vcHRpb25fbXMuYwpAQCAtMCwwICsxLDE0NyBAQAorLyoKKyAqIERyaXZlciBmb3IgT3B0aW9uIEhpZ2ggU3BlZWQgTW9iaWxlIERldmljZXMuCisgKgorICogICAoYykgMjAwOCBEYW4gV2lsbGlhbXMgPGRjYndAcmVkaGF0LmNvbT4KKyAqCisgKiBJbnNwaXJhdGlvbiB0YWtlbiBmcm9tIHNpZXJyYV9tcy5jIGJ5IEtldmluIExsb3lkIDxrbGxveWRAc2llcnJhd2lyZWxlc3MuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC91c2IuaD4KKworI2luY2x1ZGUgInVzYi5oIgorI2luY2x1ZGUgInRyYW5zcG9ydC5oIgorI2luY2x1ZGUgIm9wdGlvbl9tcy5oIgorI2luY2x1ZGUgImRlYnVnLmgiCisKKyNkZWZpbmUgWkNEX0ZPUkNFX01PREVNCQkJMHgwMQorI2RlZmluZSBaQ0RfQUxMT1dfTVMgCQkJMHgwMgorCitzdGF0aWMgdW5zaWduZWQgaW50IG9wdGlvbl96ZXJvX2NkID0gWkNEX0ZPUkNFX01PREVNOworbW9kdWxlX3BhcmFtKG9wdGlvbl96ZXJvX2NkLCB1aW50LCBTX0lSVUdPIHwgU19JV1VTUik7CitNT0RVTEVfUEFSTV9ERVNDKG9wdGlvbl96ZXJvX2NkLCAiWmVyb0NEIG1vZGUgKDE9Rm9yY2UgTW9kZW0gKGRlZmF1bHQpLCIKKwkJICIgMj1BbGxvdyBDRC1Sb20iKTsKKworI2RlZmluZSBSRVNQT05TRV9MRU4gMTAyNAorCitzdGF0aWMgaW50IG9wdGlvbl9yZXplcm8oc3RydWN0IHVzX2RhdGEgKnVzLCBpbnQgZXBfaW4sIGludCBlcF9vdXQpCit7CisJY29uc3QgdW5zaWduZWQgY2hhciByZXplcm9fbXNnW10gPSB7CisJICAweDU1LCAweDUzLCAweDQyLCAweDQzLCAweDc4LCAweDU2LCAweDM0LCAweDEyLAorCSAgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4MCwgMHgwMCwgMHgwNiwgMHgwMSwKKwkgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwCisJfTsKKwljaGFyICpidWZmZXI7CisJaW50IHJlc3VsdDsKKworCVVTX0RFQlVHUCgiT3B0aW9uIE1TOiAlcyIsICJERVZJQ0UgTU9ERSBTV0lUQ0hcbiIpOworCisJYnVmZmVyID0ga3phbGxvYyhSRVNQT05TRV9MRU4sIEdGUF9LRVJORUwpOworCWlmIChidWZmZXIgPT0gTlVMTCkKKwkJcmV0dXJuIFVTQl9TVE9SX1RSQU5TUE9SVF9FUlJPUjsKKworCW1lbWNweShidWZmZXIsIHJlemVyb19tc2csIHNpemVvZiAocmV6ZXJvX21zZykpOworCXJlc3VsdCA9IHVzYl9zdG9yX2J1bGtfdHJhbnNmZXJfYnVmKHVzLAorCQkJdXNiX3NuZGJ1bGtwaXBlKHVzLT5wdXNiX2RldiwgZXBfb3V0KSwKKwkJCWJ1ZmZlciwgc2l6ZW9mIChyZXplcm9fbXNnKSwgTlVMTCk7CisJaWYgKHJlc3VsdCAhPSBVU0JfU1RPUl9YRkVSX0dPT0QpIHsKKwkJcmVzdWx0ID0gVVNCX1NUT1JfWEZFUl9FUlJPUjsKKwkJZ290byBvdXQ7CisJfQorCisJLyogU29tZSBvZiB0aGUgZGV2aWNlcyBuZWVkIHRvIGJlIGFza2VkIGZvciBhIHJlc3BvbnNlLCBidXQgd2UgZG9uJ3QKKwkgKiBjYXJlIHdoYXQgdGhhdCByZXNwb25zZSBpcy4KKwkgKi8KKwlyZXN1bHQgPSB1c2Jfc3Rvcl9idWxrX3RyYW5zZmVyX2J1Zih1cywKKwkJCXVzYl9zbmRidWxrcGlwZSh1cy0+cHVzYl9kZXYsIGVwX291dCksCisJCQlidWZmZXIsIFJFU1BPTlNFX0xFTiwgTlVMTCk7CisJcmVzdWx0ID0gVVNCX1NUT1JfWEZFUl9HT09EOworCitvdXQ6CisJa2ZyZWUoYnVmZmVyKTsKKwlyZXR1cm4gcmVzdWx0OworfQorCitpbnQgb3B0aW9uX21zX2luaXQoc3RydWN0IHVzX2RhdGEgKnVzKQoreworCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2OworCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmOworCXN0cnVjdCB1c2JfaG9zdF9pbnRlcmZhY2UgKmlmYWNlX2Rlc2M7CisJc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICplbmRwb2ludCA9IE5VTEw7CisJdTggZXBfaW4gPSAwLCBlcF9vdXQgPSAwOworCWludCBlcF9pbl9zaXplID0gMCwgZXBfb3V0X3NpemUgPSAwOworCWludCBpLCByZXN1bHQ7CisKKwl1ZGV2ID0gdXMtPnB1c2JfZGV2OworCWludGYgPSB1cy0+cHVzYl9pbnRmOworCisJLyogRW5zdXJlIGl0J3MgcmVhbGx5IGEgWmVyb0NEIGRldmljZTsgZGV2aWNlcyB0aGF0IGFyZSBhbHJlYWR5CisJICogaW4gbW9kZW0gbW9kZSByZXR1cm4gMHhGRiBmb3IgY2xhc3MsIHN1YmNsYXNzLCBhbmQgcHJvdG9jb2wuCisJICovCisJaWYgKHVkZXYtPmRlc2NyaXB0b3IuYkRldmljZUNsYXNzICE9IDAgfHwKKwkgICAgdWRldi0+ZGVzY3JpcHRvci5iRGV2aWNlU3ViQ2xhc3MgIT0gMCB8fAorCSAgICB1ZGV2LT5kZXNjcmlwdG9yLmJEZXZpY2VQcm90b2NvbCAhPSAwKQorCQlyZXR1cm4gVVNCX1NUT1JfVFJBTlNQT1JUX0dPT0Q7CisKKwlVU19ERUJVR1AoIk9wdGlvbiBNUzogb3B0aW9uX21zX2luaXQgY2FsbGVkXG4iKTsKKworCS8qIEZpbmQgdGhlIHJpZ2h0IG1hc3Mgc3RvcmFnZSBpbnRlcmZhY2UgKi8KKwlpZmFjZV9kZXNjID0gaW50Zi0+Y3VyX2FsdHNldHRpbmc7CisJaWYgKGlmYWNlX2Rlc2MtPmRlc2MuYkludGVyZmFjZUNsYXNzICE9IDB4OCB8fAorCSAgICBpZmFjZV9kZXNjLT5kZXNjLmJJbnRlcmZhY2VTdWJDbGFzcyAhPSAweDYgfHwKKwkgICAgaWZhY2VfZGVzYy0+ZGVzYy5iSW50ZXJmYWNlUHJvdG9jb2wgIT0gMHg1MCkgeworCQlVU19ERUJVR1AoIk9wdGlvbiBNUzogbWFzcyBzdG9yYWdlIGludGVyZmFjZSBub3QgZm91bmQsIG5vIGFjdGlvbiAiCisJCSAgICAgICAgICAicmVxdWlyZWRcbiIpOworCQlyZXR1cm4gVVNCX1NUT1JfVFJBTlNQT1JUX0dPT0Q7CisJfQorCisJLyogRmluZCB0aGUgbWFzcyBzdG9yYWdlIGJ1bGsgZW5kcG9pbnRzICovCisJZm9yIChpID0gMDsgaSA8IGlmYWNlX2Rlc2MtPmRlc2MuYk51bUVuZHBvaW50cyAmJiAoIWVwX2luX3NpemUgfHwgIWVwX291dF9zaXplKTsgKytpKSB7CisJCWVuZHBvaW50ID0gJmlmYWNlX2Rlc2MtPmVuZHBvaW50W2ldLmRlc2M7CisKKwkJaWYgKHVzYl9lbmRwb2ludF9pc19idWxrX2luKGVuZHBvaW50KSkgeworCQkJZXBfaW4gPSB1c2JfZW5kcG9pbnRfbnVtKGVuZHBvaW50KTsKKwkJCWVwX2luX3NpemUgPSBsZTE2X3RvX2NwdShlbmRwb2ludC0+d01heFBhY2tldFNpemUpOworCQl9IGVsc2UgaWYgKHVzYl9lbmRwb2ludF9pc19idWxrX291dChlbmRwb2ludCkpIHsKKwkJCWVwX291dCA9IHVzYl9lbmRwb2ludF9udW0oZW5kcG9pbnQpOworCQkJZXBfb3V0X3NpemUgPSBsZTE2X3RvX2NwdShlbmRwb2ludC0+d01heFBhY2tldFNpemUpOworCQl9CisJfQorCisJLyogQ2FuJ3QgZmluZCB0aGUgbWFzcyBzdG9yYWdlIGVuZHBvaW50cyAqLworCWlmICghZXBfaW5fc2l6ZSB8fCAhZXBfb3V0X3NpemUpIHsKKwkJVVNfREVCVUdQKCJPcHRpb24gTVM6IG1hc3Mgc3RvcmFnZSBlbmRwb2ludHMgbm90IGZvdW5kLCBubyBhY3Rpb24gIgorCQkgICAgICAgICAgInJlcXVpcmVkXG4iKTsKKwkJcmV0dXJuIFVTQl9TVE9SX1RSQU5TUE9SVF9HT09EOworCX0KKworCS8qIEZvcmNlIE1vZGVtIG1vZGUgKi8KKwlpZiAob3B0aW9uX3plcm9fY2QgPT0gWkNEX0ZPUkNFX01PREVNKSB7CisJCVVTX0RFQlVHUCgiT3B0aW9uIE1TOiAlcyIsICJGb3JjaW5nIE1vZGVtIE1vZGVcbiIpOworCQlyZXN1bHQgPSBvcHRpb25fcmV6ZXJvKHVzLCBlcF9pbiwgZXBfb3V0KTsKKwkJaWYgKHJlc3VsdCAhPSBVU0JfU1RPUl9YRkVSX0dPT0QpCisJCQlVU19ERUJVR1AoIk9wdGlvbiBNUzogRmFpbGVkIHRvIHN3aXRjaCB0byBtb2RlbSBtb2RlLlxuIik7CisJCXJldHVybiAtRUlPOworCX0gZWxzZSBpZiAob3B0aW9uX3plcm9fY2QgPT0gWkNEX0FMTE9XX01TKSB7CisJCS8qIEFsbG93IE1hc3MgU3RvcmFnZSBtb2RlIChrZWVwIENELVJvbSkgKi8KKwkJVVNfREVCVUdQKCJPcHRpb24gTVM6ICVzIiwgIkFsbG93aW5nIE1hc3MgU3RvcmFnZSBNb2RlIGlmIGRldmljZSIKKwkJICAgICAgICAgICIgcmVxdWVzdHMgaXRcbiIpOworCX0KKworCXJldHVybiBVU0JfU1RPUl9UUkFOU1BPUlRfR09PRDsKK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc3RvcmFnZS9vcHRpb25fbXMuaCBiL2RyaXZlcnMvdXNiL3N0b3JhZ2Uvb3B0aW9uX21zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjZlNDQ4YwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdXNiL3N0b3JhZ2Uvb3B0aW9uX21zLmgKQEAgLTAsMCArMSw0IEBACisjaWZuZGVmIF9PUFRJT05fTVNfSF8KKyNkZWZpbmUgX09QVElPTl9NU19IXworZXh0ZXJuIGludCBvcHRpb25fbXNfaW5pdChzdHJ1Y3QgdXNfZGF0YSAqdXMpOworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zdG9yYWdlL3Byb3RvY29sLmMgYi9kcml2ZXJzL3VzYi9zdG9yYWdlL3Byb3RvY29sLmMKaW5kZXggM2IzMzU3ZS4uYmU0NDFkOCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc3RvcmFnZS9wcm90b2NvbC5jCisrKyBiL2RyaXZlcnMvdXNiL3N0b3JhZ2UvcHJvdG9jb2wuYwpAQCAtNTYsOSArNTYsOSBAQAogICogUHJvdG9jb2wgcm91dGluZXMKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdm9pZCB1c2Jfc3Rvcl9xaWMxNTdfY29tbWFuZChzdHJ1Y3Qgc2NzaV9jbW5kICpzcmIsIHN0cnVjdCB1c19kYXRhICp1cykKK3ZvaWQgdXNiX3N0b3JfcGFkMTJfY29tbWFuZChzdHJ1Y3Qgc2NzaV9jbW5kICpzcmIsIHN0cnVjdCB1c19kYXRhICp1cykKIHsKLQkvKiBQYWQgdGhlIEFUQVBJIGNvbW1hbmQgd2l0aCB6ZXJvcyAKKwkvKiBQYWQgdGhlIFNDU0kgY29tbWFuZCB3aXRoIHplcm9zIG91dCB0byAxMiBieXRlcwogCSAqCiAJICogTk9URTogVGhpcyBvbmx5IHdvcmtzIGJlY2F1c2UgYSBzY3NpX2NtbmQgc3RydWN0IGZpZWxkIGNvbnRhaW5zCiAJICogYSB1bnNpZ25lZCBjaGFyIGNtbmRbMTZdLCBzbyB3ZSBrbm93IHdlIGhhdmUgc3RvcmFnZSBhdmFpbGFibGUKQEAgLTczLDI2ICs3Myw2IEBACiAJdXNiX3N0b3JfaW52b2tlX3RyYW5zcG9ydChzcmIsIHVzKTsKIH0KIAotdm9pZCB1c2Jfc3Rvcl9BVEFQSV9jb21tYW5kKHN0cnVjdCBzY3NpX2NtbmQgKnNyYiwgc3RydWN0IHVzX2RhdGEgKnVzKQotewotCS8qIFBhZCB0aGUgQVRBUEkgY29tbWFuZCB3aXRoIHplcm9zIAotCSAqCi0JICogTk9URTogVGhpcyBvbmx5IHdvcmtzIGJlY2F1c2UgYSBzY3NpX2NtbmQgc3RydWN0IGZpZWxkIGNvbnRhaW5zCi0JICogYSB1bnNpZ25lZCBjaGFyIGNtbmRbMTZdLCBzbyB3ZSBrbm93IHdlIGhhdmUgc3RvcmFnZSBhdmFpbGFibGUKLQkgKi8KLQotCS8qIFBhZCB0aGUgQVRBUEkgY29tbWFuZCB3aXRoIHplcm9zICovCi0JZm9yICg7IHNyYi0+Y21kX2xlbjwxMjsgc3JiLT5jbWRfbGVuKyspCi0JCXNyYi0+Y21uZFtzcmItPmNtZF9sZW5dID0gMDsKLQotCS8qIHNldCBjb21tYW5kIGxlbmd0aCB0byAxMiBieXRlcyAqLwotCXNyYi0+Y21kX2xlbiA9IDEyOwotCi0JLyogc2VuZCB0aGUgY29tbWFuZCB0byB0aGUgdHJhbnNwb3J0IGxheWVyICovCi0JdXNiX3N0b3JfaW52b2tlX3RyYW5zcG9ydChzcmIsIHVzKTsKLX0KLQotCiB2b2lkIHVzYl9zdG9yX3VmaV9jb21tYW5kKHN0cnVjdCBzY3NpX2NtbmQgKnNyYiwgc3RydWN0IHVzX2RhdGEgKnVzKQogewogCS8qIGZpeCBzb21lIGNvbW1hbmRzIC0tIHRoaXMgaXMgYSBmb3JtIG9mIG1vZGUgdHJhbnNsYXRpb24KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3N0b3JhZ2UvcHJvdG9jb2wuaCBiL2RyaXZlcnMvdXNiL3N0b3JhZ2UvcHJvdG9jb2wuaAppbmRleCA0ODcwNTZmLi5mZmMzZTJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zdG9yYWdlL3Byb3RvY29sLmgKKysrIGIvZHJpdmVycy91c2Ivc3RvcmFnZS9wcm90b2NvbC5oCkBAIC00MCw4ICs0MCw3IEBACiAjZGVmaW5lIF9QUk9UT0NPTF9IXwogCiAvKiBQcm90b2NvbCBoYW5kbGluZyByb3V0aW5lcyAqLwotZXh0ZXJuIHZvaWQgdXNiX3N0b3JfQVRBUElfY29tbWFuZChzdHJ1Y3Qgc2NzaV9jbW5kKiwgc3RydWN0IHVzX2RhdGEqKTsKLWV4dGVybiB2b2lkIHVzYl9zdG9yX3FpYzE1N19jb21tYW5kKHN0cnVjdCBzY3NpX2NtbmQqLCBzdHJ1Y3QgdXNfZGF0YSopOworZXh0ZXJuIHZvaWQgdXNiX3N0b3JfcGFkMTJfY29tbWFuZChzdHJ1Y3Qgc2NzaV9jbW5kKiwgc3RydWN0IHVzX2RhdGEqKTsKIGV4dGVybiB2b2lkIHVzYl9zdG9yX3VmaV9jb21tYW5kKHN0cnVjdCBzY3NpX2NtbmQqLCBzdHJ1Y3QgdXNfZGF0YSopOwogZXh0ZXJuIHZvaWQgdXNiX3N0b3JfdHJhbnNwYXJlbnRfc2NzaV9jb21tYW5kKHN0cnVjdCBzY3NpX2NtbmQqLAogCQlzdHJ1Y3QgdXNfZGF0YSopOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc3RvcmFnZS9zY3NpZ2x1ZS5jIGIvZHJpdmVycy91c2Ivc3RvcmFnZS9zY3NpZ2x1ZS5jCmluZGV4IDA5Nzc5ZjYuLjJhNDJiODYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3N0b3JhZ2Uvc2NzaWdsdWUuYworKysgYi9kcml2ZXJzL3VzYi9zdG9yYWdlL3Njc2lnbHVlLmMKQEAgLTU5LDYgKzU5LDEzIEBACiAjaW5jbHVkZSAidHJhbnNwb3J0LmgiCiAjaW5jbHVkZSAicHJvdG9jb2wuaCIKIAorLyogVmVuZG9yIElEcyBmb3IgY29tcGFuaWVzIHRoYXQgc2VlbSB0byBpbmNsdWRlIHRoZSBSRUFEIENBUEFDSVRZIGJ1ZworICogaW4gYWxsIHRoZWlyIGRldmljZXMKKyAqLworI2RlZmluZSBWRU5ET1JfSURfTk9LSUEJCTB4MDQyMQorI2RlZmluZSBWRU5ET1JfSURfTklLT04JCTB4MDRiMAorI2RlZmluZSBWRU5ET1JfSURfTU9UT1JPTEEJMHgyMmI4CisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogSG9zdCBmdW5jdGlvbnMgCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0xMjksMTEgKzEzNiwzNSBAQAogCQkJCQkgICAgICBtYXhfc2VjdG9ycyk7CiAJfQogCisJLyogU29tZSBVU0IgaG9zdCBjb250cm9sbGVycyBjYW4ndCBkbyBETUE7IHRoZXkgaGF2ZSB0byB1c2UgUElPLgorCSAqIFRoZXkgaW5kaWNhdGUgdGhpcyBieSBzZXR0aW5nIHRoZWlyIGRtYV9tYXNrIHRvIE5VTEwuICBGb3IKKwkgKiBzdWNoIGNvbnRyb2xsZXJzIHdlIG5lZWQgdG8gbWFrZSBzdXJlIHRoZSBibG9jayBsYXllciBzZXRzCisJICogdXAgYm91bmNlIGJ1ZmZlcnMgaW4gYWRkcmVzc2FibGUgbWVtb3J5LgorCSAqLworCWlmICghdXMtPnB1c2JfZGV2LT5idXMtPmNvbnRyb2xsZXItPmRtYV9tYXNrKQorCQlibGtfcXVldWVfYm91bmNlX2xpbWl0KHNkZXYtPnJlcXVlc3RfcXVldWUsIEJMS19CT1VOQ0VfSElHSCk7CisKIAkvKiBXZSBjYW4ndCBwdXQgdGhlc2Ugc2V0dGluZ3MgaW4gc2xhdmVfYWxsb2MoKSBiZWNhdXNlIHRoYXQgZ2V0cwogCSAqIGNhbGxlZCBiZWZvcmUgdGhlIGRldmljZSB0eXBlIGlzIGtub3duLiAgQ29uc2VxdWVudGx5IHRoZXNlCiAJICogc2V0dGluZ3MgY2FuJ3QgYmUgb3ZlcnJpZGRlbiB2aWEgdGhlIHNjc2kgZGV2aW5mbyBtZWNoYW5pc20uICovCiAJaWYgKHNkZXYtPnR5cGUgPT0gVFlQRV9ESVNLKSB7CiAKKwkJLyogU29tZSB2ZW5kb3JzIHNlZW0gdG8gcHV0IHRoZSBSRUFEIENBUEFDSVRZIGJ1ZyBpbnRvCisJCSAqIGFsbCB0aGVpciBkZXZpY2VzIC0tIHByaW1hcmlseSBtYWtlcnMgb2YgY2VsbCBwaG9uZXMKKwkJICogYW5kIGRpZ2l0YWwgY2FtZXJhcy4gIFNpbmNlIHRoZXNlIGRldmljZXMgYWx3YXlzIHVzZQorCQkgKiBmbGFzaCBtZWRpYSBhbmQgY2FuIGJlIGV4cGVjdGVkIHRvIGhhdmUgYW4gZXZlbiBudW1iZXIKKwkJICogb2Ygc2VjdG9ycywgd2Ugd2lsbCBhbHdheXMgZW5hYmxlIHRoZSBDQVBBQ0lUWV9IRVVSSVNUSUNTCisJCSAqIGZsYWcgdW5sZXNzIHRvbGQgb3RoZXJ3aXNlLiAqLworCQlzd2l0Y2ggKGxlMTZfdG9fY3B1KHVzLT5wdXNiX2Rldi0+ZGVzY3JpcHRvci5pZFZlbmRvcikpIHsKKwkJY2FzZSBWRU5ET1JfSURfTk9LSUE6CisJCWNhc2UgVkVORE9SX0lEX05JS09OOgorCQljYXNlIFZFTkRPUl9JRF9NT1RPUk9MQToKKwkJCWlmICghKHVzLT5mZmxhZ3MgJiAoVVNfRkxfRklYX0NBUEFDSVRZIHwKKwkJCQkJVVNfRkxfQ0FQQUNJVFlfT0spKSkKKwkJCQl1cy0+ZmZsYWdzIHw9IFVTX0ZMX0NBUEFDSVRZX0hFVVJJU1RJQ1M7CisJCQlicmVhazsKKwkJfQorCiAJCS8qIERpc2stdHlwZSBkZXZpY2VzIHVzZSBNT0RFIFNFTlNFKDYpIGlmIHRoZSBwcm90b2NvbAogCQkgKiAoU3ViQ2xhc3MpIGlzIFRyYW5zcGFyZW50IFNDU0ksIG90aGVyd2lzZSB0aGV5IHVzZQogCQkgKiBNT0RFIFNFTlNFKDEwKS4gKi8KQEAgLTE3MCw2ICsyMDEsMTAgQEAKIAkJaWYgKHVzLT5mZmxhZ3MgJiBVU19GTF9DQVBBQ0lUWV9IRVVSSVNUSUNTKQogCQkJc2Rldi0+Z3Vlc3NfY2FwYWNpdHkgPSAxOwogCisJCS8qIGFzc3VtZSBTUEMzIG9yIGxhdHRlciBkZXZpY2VzIHN1cHBvcnQgc2Vuc2Ugc2l6ZSA+IDE4ICovCisJCWlmIChzZGV2LT5zY3NpX2xldmVsID4gU0NTSV9TUENfMikKKwkJCXVzLT5mZmxhZ3MgfD0gVVNfRkxfU0FORV9TRU5TRTsKKwogCQkvKiBTb21lIGRldmljZXMgcmVwb3J0IGEgU0NTSSByZXZpc2lvbiBsZXZlbCBhYm92ZSAyIGJ1dCBhcmUKIAkJICogdW5hYmxlIHRvIGhhbmRsZSB0aGUgUkVQT1JUIExVTlMgY29tbWFuZCAoZm9yIHdoaWNoCiAJCSAqIHN1cHBvcnQgaXMgbWFuZGF0b3J5IGF0IGxldmVsIDMpLiAgU2luY2Ugd2UgYWxyZWFkeSBoYXZlCkBAIC0xOTYsNiArMjMxLDE0IEBACiAJCSAqIHNlY3RvciBpbiBhIGxhcmdlciB0aGVuIDEgc2VjdG9yIHJlYWQsIHNpbmNlIHRoZSBwZXJmb3JtYW5jZQogCQkgKiBpbXBhY3QgaXMgbmVnaWJsZSB3ZSBzZXQgdGhpcyBmbGFnIGZvciBhbGwgVVNCIGRpc2tzICovCiAJCXNkZXYtPmxhc3Rfc2VjdG9yX2J1ZyA9IDE7CisKKwkJLyogRW5hYmxlIGxhc3Qtc2VjdG9yIGhhY2tzIGZvciBzaW5nbGUtdGFyZ2V0IGRldmljZXMgdXNpbmcKKwkJICogdGhlIEJ1bGstb25seSB0cmFuc3BvcnQsIHVubGVzcyB3ZSBhbHJlYWR5IGtub3cgdGhlCisJCSAqIGNhcGFjaXR5IHdpbGwgYmUgZGVjcmVtZW50ZWQgb3IgaXMgY29ycmVjdC4gKi8KKwkJaWYgKCEodXMtPmZmbGFncyAmIChVU19GTF9GSVhfQ0FQQUNJVFkgfCBVU19GTF9DQVBBQ0lUWV9PSyB8CisJCQkJCVVTX0ZMX1NDTV9NVUxUX1RBUkcpKSAmJgorCQkJCXVzLT5wcm90b2NvbCA9PSBVU19QUl9CVUxLKQorCQkJdXMtPnVzZV9sYXN0X3NlY3Rvcl9oYWNrcyA9IDE7CiAJfSBlbHNlIHsKIAogCQkvKiBOb24tZGlzay10eXBlIGRldmljZXMgZG9uJ3QgbmVlZCB0byBibGFja2xpc3QgYW55IHBhZ2VzCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zdG9yYWdlL3NkZHIwOS5jIGIvZHJpdmVycy91c2Ivc3RvcmFnZS9zZGRyMDkuYwppbmRleCBjNWE1NGI4Li41MzFhZTVjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zdG9yYWdlL3NkZHIwOS5jCisrKyBiL2RyaXZlcnMvdXNiL3N0b3JhZ2Uvc2RkcjA5LmMKQEAgLTQ1LDYgKzQ1LDcgQEAKIAogI2luY2x1ZGUgPHNjc2kvc2NzaS5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaV9jbW5kLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2RldmljZS5oPgogCiAjaW5jbHVkZSAidXNiLmgiCiAjaW5jbHVkZSAidHJhbnNwb3J0LmgiCkBAIC0xNDQ2LDYgKzE0NDcsNDggQEAKIH0KIAogLyoKKyAqIFRyYW5zcG9ydCBmb3IgdGhlIE1pY3JvdGVjaCBEUENNLVVTQgorICovCitpbnQgZHBjbV90cmFuc3BvcnQoc3RydWN0IHNjc2lfY21uZCAqc3JiLCBzdHJ1Y3QgdXNfZGF0YSAqdXMpCit7CisJaW50IHJldDsKKworCVVTX0RFQlVHUCgiZHBjbV90cmFuc3BvcnQ6IExVTj0lZFxuIiwgc3JiLT5kZXZpY2UtPmx1bik7CisKKwlzd2l0Y2ggKHNyYi0+ZGV2aWNlLT5sdW4pIHsKKwljYXNlIDA6CisKKwkJLyoKKwkJICogTFVOIDAgY29ycmVzcG9uZHMgdG8gdGhlIENvbXBhY3RGbGFzaCBjYXJkIHJlYWRlci4KKwkJICovCisJCXJldCA9IHVzYl9zdG9yX0NCX3RyYW5zcG9ydChzcmIsIHVzKTsKKwkJYnJlYWs7CisKKwljYXNlIDE6CisKKwkJLyoKKwkJICogTFVOIDEgY29ycmVzcG9uZHMgdG8gdGhlIFNtYXJ0TWVkaWEgY2FyZCByZWFkZXIuCisJCSAqLworCisJCS8qCisJCSAqIFNldCB0aGUgTFVOIHRvIDAgKGp1c3QgaW4gY2FzZSkuCisJCSAqLworCQlzcmItPmRldmljZS0+bHVuID0gMDsKKwkJcmV0ID0gc2RkcjA5X3RyYW5zcG9ydChzcmIsIHVzKTsKKwkJc3JiLT5kZXZpY2UtPmx1biA9IDE7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJVVNfREVCVUdQKCJkcGNtX3RyYW5zcG9ydDogSW52YWxpZCBMVU4gJWRcbiIsCisJCQkJc3JiLT5kZXZpY2UtPmx1bik7CisJCXJldCA9IFVTQl9TVE9SX1RSQU5TUE9SVF9FUlJPUjsKKwkJYnJlYWs7CisJfQorCXJldHVybiByZXQ7Cit9CisKKworLyoKICAqIFRyYW5zcG9ydCBmb3IgdGhlIFNhbmRpc2sgU0REUi0wOQogICovCiBpbnQgc2RkcjA5X3RyYW5zcG9ydChzdHJ1Y3Qgc2NzaV9jbW5kICpzcmIsIHN0cnVjdCB1c19kYXRhICp1cykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3N0b3JhZ2Uvc2RkcjA5LmggYi9kcml2ZXJzL3VzYi9zdG9yYWdlL3NkZHIwOS5oCmluZGV4IGU1MDAzM2EuLmI3MDExNzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3N0b3JhZ2Uvc2RkcjA5LmgKKysrIGIvZHJpdmVycy91c2Ivc3RvcmFnZS9zZGRyMDkuaApAQCAtMjgsOCArMjgsMTEgQEAKIC8qIFNhbmRpc2sgU0REUi0wOSBzdHVmZiAqLwogCiBleHRlcm4gaW50IHNkZHIwOV90cmFuc3BvcnQoc3RydWN0IHNjc2lfY21uZCAqc3JiLCBzdHJ1Y3QgdXNfZGF0YSAqdXMpOwotCi1leHRlcm4gaW50IHVzYl9zdG9yX3NkZHIwOV9kcGNtX2luaXQoc3RydWN0IHVzX2RhdGEgKnVzKTsKIGV4dGVybiBpbnQgdXNiX3N0b3Jfc2RkcjA5X2luaXQoc3RydWN0IHVzX2RhdGEgKnVzKTsKIAorLyogTWljcm90ZWNoIERQQ00tVVNCIHN0dWZmICovCisKK2V4dGVybiBpbnQgZHBjbV90cmFuc3BvcnQoc3RydWN0IHNjc2lfY21uZCAqc3JiLCBzdHJ1Y3QgdXNfZGF0YSAqdXMpOworZXh0ZXJuIGludCB1c2Jfc3Rvcl9zZGRyMDlfZHBjbV9pbml0KHN0cnVjdCB1c19kYXRhICp1cyk7CisKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc3RvcmFnZS90cmFuc3BvcnQuYyBiL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdHJhbnNwb3J0LmMKaW5kZXggNzkxMDhkNS4uMWQ1NDM4ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc3RvcmFnZS90cmFuc3BvcnQuYworKysgYi9kcml2ZXJzL3VzYi9zdG9yYWdlL3RyYW5zcG9ydC5jCkBAIC01Nyw2ICs1Nyw5IEBACiAjaW5jbHVkZSAic2NzaWdsdWUuaCIKICNpbmNsdWRlICJkZWJ1Zy5oIgogCisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSAiLi4vLi4vc2NzaS9zZC5oIgorCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogRGF0YSB0cmFuc2ZlciByb3V0aW5lcwpAQCAtNTExLDYgKzUxNCwxMTAgQEAKICAqIFRyYW5zcG9ydCByb3V0aW5lcwogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCisvKiBUaGVyZSBhcmUgc28gbWFueSBkZXZpY2VzIHRoYXQgcmVwb3J0IHRoZSBjYXBhY2l0eSBpbmNvcnJlY3RseSwKKyAqIHRoaXMgcm91dGluZSB3YXMgd3JpdHRlbiB0byBjb3VudGVyYWN0IHNvbWUgb2YgdGhlIHJlc3VsdGluZworICogcHJvYmxlbXMuCisgKi8KK3N0YXRpYyB2b2lkIGxhc3Rfc2VjdG9yX2hhY2tzKHN0cnVjdCB1c19kYXRhICp1cywgc3RydWN0IHNjc2lfY21uZCAqc3JiKQoreworCXN0cnVjdCBnZW5kaXNrICpkaXNrOworCXN0cnVjdCBzY3NpX2Rpc2sgKnNka3A7CisJdTMyIHNlY3RvcjsKKworCS8qIFRvIFJlcG9ydCAiTWVkaXVtIEVycm9yOiBSZWNvcmQgTm90IEZvdW5kICovCisJc3RhdGljIHVuc2lnbmVkIGNoYXIgcmVjb3JkX25vdF9mb3VuZFsxOF0gPSB7CisJCVswXQk9IDB4NzAsCQkJLyogY3VycmVudCBlcnJvciAqLworCQlbMl0JPSBNRURJVU1fRVJST1IsCQkvKiA9IDB4MDMgKi8KKwkJWzddCT0gMHgwYSwJCQkvKiBhZGRpdGlvbmFsIGxlbmd0aCAqLworCQlbMTJdCT0gMHgxNAkJCS8qIFJlY29yZCBOb3QgRm91bmQgKi8KKwl9OworCisJLyogSWYgbGFzdC1zZWN0b3IgcHJvYmxlbXMgY2FuJ3Qgb2NjdXIsIHdoZXRoZXIgYmVjYXVzZSB0aGUKKwkgKiBjYXBhY2l0eSB3YXMgYWxyZWFkeSBkZWNyZW1lbnRlZCBvciBiZWNhdXNlIHRoZSBkZXZpY2UgaXMKKwkgKiBrbm93biB0byByZXBvcnQgdGhlIGNvcnJlY3QgY2FwYWNpdHksIHRoZW4gd2UgZG9uJ3QgbmVlZAorCSAqIHRvIGRvIGFueXRoaW5nLgorCSAqLworCWlmICghdXMtPnVzZV9sYXN0X3NlY3Rvcl9oYWNrcykKKwkJcmV0dXJuOworCisJLyogV2FzIHRoaXMgY29tbWFuZCBhIFJFQUQoMTApIG9yIGEgV1JJVEUoMTApPyAqLworCWlmIChzcmItPmNtbmRbMF0gIT0gUkVBRF8xMCAmJiBzcmItPmNtbmRbMF0gIT0gV1JJVEVfMTApCisJCWdvdG8gZG9uZTsKKworCS8qIERpZCB0aGlzIGNvbW1hbmQgYWNjZXNzIHRoZSBsYXN0IHNlY3Rvcj8gKi8KKwlzZWN0b3IgPSAoc3JiLT5jbW5kWzJdIDw8IDI0KSB8IChzcmItPmNtbmRbM10gPDwgMTYpIHwKKwkJCShzcmItPmNtbmRbNF0gPDwgOCkgfCAoc3JiLT5jbW5kWzVdKTsKKwlkaXNrID0gc3JiLT5yZXF1ZXN0LT5ycV9kaXNrOworCWlmICghZGlzaykKKwkJZ290byBkb25lOworCXNka3AgPSBzY3NpX2Rpc2soZGlzayk7CisJaWYgKCFzZGtwKQorCQlnb3RvIGRvbmU7CisJaWYgKHNlY3RvciArIDEgIT0gc2RrcC0+Y2FwYWNpdHkpCisJCWdvdG8gZG9uZTsKKworCWlmIChzcmItPnJlc3VsdCA9PSBTQU1fU1RBVF9HT09EICYmIHNjc2lfZ2V0X3Jlc2lkKHNyYikgPT0gMCkgeworCisJCS8qIFRoZSBjb21tYW5kIHN1Y2NlZWRlZC4gIElmIHRoZSBjYXBhY2l0eSBpcyBvZGQKKwkJICogKGkuZS4sIGlmIHRoZSBzZWN0b3IgbnVtYmVyIGlzIGV2ZW4pIHRoZW4gdGhlCisJCSAqICJhbHdheXMtZXZlbiIgaGV1cmlzdGljIHdvdWxkIGJlIHdyb25nIGZvciB0aGlzCisJCSAqIGRldmljZS4gIElzc3VlIGEgV0FSTigpIHNvIHRoYXQgdGhlIGtlcm5lbG9vcHMub3JnCisJCSAqIHByb2plY3Qgd2lsbCBiZSBub3RpZmllZCBhbmQgd2Ugd2lsbCB0aGVuIGtub3cgdG8KKwkJICogbWFyayB0aGUgZGV2aWNlIHdpdGggYSBDQVBBQ0lUWV9PSyBmbGFnLiAgSG9wZWZ1bGx5CisJCSAqIHRoaXMgd2lsbCBvY2N1ciBmb3Igb25seSBhIGZldyBkZXZpY2VzLgorCQkgKgorCQkgKiBVc2UgdGhlIHNpZ24gb2YgdXMtPmxhc3Rfc2VjdG9yX2hhY2tzIHRvIHRlbGwgd2hldGhlcgorCQkgKiB0aGUgd2FybmluZyBoYXMgYWxyZWFkeSBiZWVuIGlzc3VlZDsgd2UgZG9uJ3QgbmVlZAorCQkgKiBtb3JlIHRoYW4gb25lIHdhcm5pbmcgcGVyIGRldmljZS4KKwkJICovCisJCWlmICghKHNlY3RvciAmIDEpICYmIHVzLT51c2VfbGFzdF9zZWN0b3JfaGFja3MgPiAwKSB7CisJCQl1bnNpZ25lZCB2aWQgPSBsZTE2X3RvX2NwdSgKKwkJCQkJdXMtPnB1c2JfZGV2LT5kZXNjcmlwdG9yLmlkVmVuZG9yKTsKKwkJCXVuc2lnbmVkIHBpZCA9IGxlMTZfdG9fY3B1KAorCQkJCQl1cy0+cHVzYl9kZXYtPmRlc2NyaXB0b3IuaWRQcm9kdWN0KTsKKwkJCXVuc2lnbmVkIHJldiA9IGxlMTZfdG9fY3B1KAorCQkJCQl1cy0+cHVzYl9kZXYtPmRlc2NyaXB0b3IuYmNkRGV2aWNlKTsKKworCQkJV0FSTigxLCAiJXM6IFN1Y2Nlc3NmdWwgbGFzdCBzZWN0b3Igc3VjY2VzcyBhdCAldSwgIgorCQkJCQkiZGV2aWNlICUwNHg6JTA0eDolMDR4XG4iLAorCQkJCQlzZGtwLT5kaXNrLT5kaXNrX25hbWUsIHNlY3RvciwKKwkJCQkJdmlkLCBwaWQsIHJldik7CisJCQl1cy0+dXNlX2xhc3Rfc2VjdG9yX2hhY2tzID0gLTE7CisJCX0KKworCX0gZWxzZSB7CisJCS8qIFRoZSBjb21tYW5kIGZhaWxlZC4gIEFsbG93IHVwIHRvIDMgcmV0cmllcyBpbiBjYXNlIHRoaXMKKwkJICogaXMgc29tZSBub3JtYWwgc29ydCBvZiBmYWlsdXJlLiAgQWZ0ZXIgdGhhdCwgYXNzdW1lIHRoZQorCQkgKiBjYXBhY2l0eSBpcyB3cm9uZyBhbmQgd2UncmUgdHJ5aW5nIHRvIGFjY2VzcyB0aGUgc2VjdG9yCisJCSAqIGJleW9uZCB0aGUgZW5kLiAgUmVwbGFjZSB0aGUgcmVzdWx0IGNvZGUgYW5kIHNlbnNlIGRhdGEKKwkJICogd2l0aCB2YWx1ZXMgdGhhdCB3aWxsIGNhdXNlIHRoZSBTQ1NJIGNvcmUgdG8gZmFpbCB0aGUKKwkJICogY29tbWFuZCBpbW1lZGlhdGVseSwgaW5zdGVhZCBvZiBnb2luZyBpbnRvIGFuIGluZmluaXRlCisJCSAqIChvciBldmVuIGp1c3QgYSB2ZXJ5IGxvbmcpIHJldHJ5IGxvb3AuCisJCSAqLworCQlpZiAoKyt1cy0+bGFzdF9zZWN0b3JfcmV0cmllcyA8IDMpCisJCQlyZXR1cm47CisJCXNyYi0+cmVzdWx0ID0gU0FNX1NUQVRfQ0hFQ0tfQ09ORElUSU9OOworCQltZW1jcHkoc3JiLT5zZW5zZV9idWZmZXIsIHJlY29yZF9ub3RfZm91bmQsCisJCQkJc2l6ZW9mKHJlY29yZF9ub3RfZm91bmQpKTsKKworCQkvKiBJbiB0aGVvcnkgd2UgbWlnaHQgd2FudCB0byBpc3N1ZSBhIFdBUk4oKSBoZXJlIGlmIHRoZQorCQkgKiBjYXBhY2l0eSBpcyBldmVuLCBzaW5jZSBpdCBjb3VsZCBpbmRpY2F0ZSB0aGUgZGV2aWNlCisJCSAqIGhhcyB0aGUgUkVBRCBDQVBBQ0lUWSBidWcgX2FuZF8gdGhlIHJlYWwgY2FwYWNpdHkgaXMKKwkJICogb2RkLiAgQnV0IGl0IGNvdWxkIGFsc28gaW5kaWNhdGUgdGhhdCB0aGUgZGV2aWNlCisJCSAqIHNpbXBseSBjYW4ndCBhY2Nlc3MgaXRzIGxhc3Qgc2VjdG9yLCBhIGZhaWx1cmUgbW9kZQorCQkgKiB3aGljaCBpcyBzdXJwcmlzaW5nbHkgY29tbW9uLiAgU28gbm8gd2FybmluZy4KKwkJICovCisJfQorCisgZG9uZToKKwkvKiBEb24ndCByZXNldCB0aGUgcmV0cnkgY291bnRlciBmb3IgVEVTVCBVTklUIFJFQURZIGNvbW1hbmRzLAorCSAqIGJlY2F1c2UgdGhleSBnZXQgaXNzdWVkIGFmdGVyIGRldmljZSByZXNldHMgd2hpY2ggbWlnaHQgYmUKKwkgKiBjYXVzZWQgYnkgYSBmYWlsZWQgbGFzdC1zZWN0b3IgYWNjZXNzLgorCSAqLworCWlmIChzcmItPmNtbmRbMF0gIT0gVEVTVF9VTklUX1JFQURZKQorCQl1cy0+bGFzdF9zZWN0b3JfcmV0cmllcyA9IDA7Cit9CisKIC8qIEludm9rZSB0aGUgdHJhbnNwb3J0IGFuZCBiYXNpYyBlcnJvci1oYW5kbGluZy9yZWNvdmVyeSBtZXRob2RzCiAgKgogICogVGhpcyBpcyB1c2VkIGJ5IHRoZSBwcm90b2NvbCBsYXllcnMgdG8gYWN0dWFsbHkgc2VuZCB0aGUgbWVzc2FnZSB0bwpAQCAtNTQ0LDYgKzY1MSw3IEBACiAJLyogaWYgdGhlIHRyYW5zcG9ydCBwcm92aWRlZCBpdHMgb3duIHNlbnNlIGRhdGEsIGRvbid0IGF1dG8tc2Vuc2UgKi8KIAlpZiAocmVzdWx0ID09IFVTQl9TVE9SX1RSQU5TUE9SVF9OT19TRU5TRSkgewogCQlzcmItPnJlc3VsdCA9IFNBTV9TVEFUX0NIRUNLX0NPTkRJVElPTjsKKwkJbGFzdF9zZWN0b3JfaGFja3ModXMsIHNyYik7CiAJCXJldHVybjsKIAl9CiAKQEAgLTU3OSw2ICs2ODcsMjAgQEAKIAl9CiAKIAkvKgorCSAqIERldGVybWluZSBpZiB0aGlzIGRldmljZSBpcyBTQVQgYnkgc2VlaW5nIGlmIHRoZQorCSAqIGNvbW1hbmQgZXhlY3V0ZWQgc3VjY2Vzc2Z1bGx5LiAgT3RoZXJ3aXNlIHdlJ2xsIGhhdmUKKwkgKiB0byB3YWl0IGZvciBhdCBsZWFzdCBvbmUgQ0hFQ0tfQ09ORElUSU9OIHRvIGRldGVybWluZQorCSAqIFNBTkVfU0VOU0Ugc3VwcG9ydAorCSAqLworCWlmICgoc3JiLT5jbW5kWzBdID09IEFUQV8xNiB8fCBzcmItPmNtbmRbMF0gPT0gQVRBXzEyKSAmJgorCSAgICByZXN1bHQgPT0gVVNCX1NUT1JfVFJBTlNQT1JUX0dPT0QgJiYKKwkgICAgISh1cy0+ZmZsYWdzICYgVVNfRkxfU0FORV9TRU5TRSkgJiYKKwkgICAgIShzcmItPmNtbmRbMl0gJiAweDIwKSkgeworCQlVU19ERUJVR1AoIi0tIFNBVCBzdXBwb3J0ZWQsIGluY3JlYXNpbmcgYXV0by1zZW5zZVxuIik7CisJCXVzLT5mZmxhZ3MgfD0gVVNfRkxfU0FORV9TRU5TRTsKKwl9CisKKwkvKgogCSAqIEEgc2hvcnQgdHJhbnNmZXIgb24gYSBjb21tYW5kIHdoZXJlIHdlIGRvbid0IGV4cGVjdCBpdAogCSAqIGlzIHVudXN1YWwsIGJ1dCBpdCBkb2Vzbid0IG1lYW4gd2UgbmVlZCB0byBhdXRvLXNlbnNlLgogCSAqLwpAQCAtNTk1LDEwICs3MTcsMTUgQEAKIAlpZiAobmVlZF9hdXRvX3NlbnNlKSB7CiAJCWludCB0ZW1wX3Jlc3VsdDsKIAkJc3RydWN0IHNjc2lfZWhfc2F2ZSBzZXM7CisJCWludCBzZW5zZV9zaXplID0gVVNfU0VOU0VfU0laRTsKKworCQkvKiBkZXZpY2Ugc3VwcG9ydHMgYW5kIG5lZWRzIGJpZ2dlciBzZW5zZSBidWZmZXIgKi8KKwkJaWYgKHVzLT5mZmxhZ3MgJiBVU19GTF9TQU5FX1NFTlNFKQorCQkJc2Vuc2Vfc2l6ZSA9IH4wOwogCiAJCVVTX0RFQlVHUCgiSXNzdWluZyBhdXRvLVJFUVVFU1RfU0VOU0VcbiIpOwogCi0JCXNjc2lfZWhfcHJlcF9jbW5kKHNyYiwgJnNlcywgTlVMTCwgMCwgVVNfU0VOU0VfU0laRSk7CisJCXNjc2lfZWhfcHJlcF9jbW5kKHNyYiwgJnNlcywgTlVMTCwgMCwgc2Vuc2Vfc2l6ZSk7CiAKIAkJLyogRklYTUU6IHdlIG11c3QgZG8gdGhlIHByb3RvY29sIHRyYW5zbGF0aW9uIGhlcmUgKi8KIAkJaWYgKHVzLT5zdWJjbGFzcyA9PSBVU19TQ19SQkMgfHwgdXMtPnN1YmNsYXNzID09IFVTX1NDX1NDU0kgfHwKQEAgLTYzMiw2ICs3NTksMjUgQEAKIAkJCXJldHVybjsKIAkJfQogCisJCS8qIElmIHRoZSBzZW5zZSBkYXRhIHJldHVybmVkIGlzIGxhcmdlciB0aGFuIDE4LWJ5dGVzIHRoZW4gd2UKKwkJICogYXNzdW1lIHRoaXMgZGV2aWNlIHN1cHBvcnRzIHJlcXVlc3RpbmcgbW9yZSBpbiB0aGUgZnV0dXJlLgorCQkgKiBUaGUgcmVzcG9uc2UgY29kZSBtdXN0IGJlIDcwaCB0aHJvdWdoIDczaCBpbmNsdXNpdmUuCisJCSAqLworCQlpZiAoc3JiLT5zZW5zZV9idWZmZXJbN10gPiAoVVNfU0VOU0VfU0laRSAtIDgpICYmCisJCSAgICAhKHVzLT5mZmxhZ3MgJiBVU19GTF9TQU5FX1NFTlNFKSAmJgorCQkgICAgKHNyYi0+c2Vuc2VfYnVmZmVyWzBdICYgMHg3QykgPT0gMHg3MCkgeworCQkJVVNfREVCVUdQKCItLSBTQU5FX1NFTlNFIHN1cHBvcnQgZW5hYmxlZFxuIik7CisJCQl1cy0+ZmZsYWdzIHw9IFVTX0ZMX1NBTkVfU0VOU0U7CisKKwkJCS8qIEluZGljYXRlIHRvIHRoZSB1c2VyIHRoYXQgd2UgdHJ1bmNhdGVkIHRoZWlyIHNlbnNlCisJCQkgKiBiZWNhdXNlIHdlIGRpZG4ndCBrbm93IGl0IHN1cHBvcnRlZCBsYXJnZXIgc2Vuc2UuCisJCQkgKi8KKwkJCVVTX0RFQlVHUCgiLS0gU2Vuc2UgZGF0YSB0cnVuY2F0ZWQgdG8gJWkgZnJvbSAlaVxuIiwKKwkJCSAgICAgICAgICBVU19TRU5TRV9TSVpFLAorCQkJICAgICAgICAgIHNyYi0+c2Vuc2VfYnVmZmVyWzddICsgOCk7CisJCQlzcmItPnNlbnNlX2J1ZmZlcls3XSA9IChVU19TRU5TRV9TSVpFIC0gOCk7CisJCX0KKwogCQlVU19ERUJVR1AoIi0tIFJlc3VsdCBmcm9tIGF1dG8tc2Vuc2UgaXMgJWRcbiIsIHRlbXBfcmVzdWx0KTsKIAkJVVNfREVCVUdQKCItLSBjb2RlOiAweCV4LCBrZXk6IDB4JXgsIEFTQzogMHgleCwgQVNDUTogMHgleFxuIiwKIAkJCSAgc3JiLT5zZW5zZV9idWZmZXJbMF0sCkBAIC02NjcsNiArODEzLDcgQEAKIAkJCXNjc2lfYnVmZmxlbihzcmIpIC0gc2NzaV9nZXRfcmVzaWQoc3JiKSA8IHNyYi0+dW5kZXJmbG93KQogCQlzcmItPnJlc3VsdCA9IChESURfRVJST1IgPDwgMTYpIHwgKFNVR0dFU1RfUkVUUlkgPDwgMjQpOwogCisJbGFzdF9zZWN0b3JfaGFja3ModXMsIHNyYik7CiAJcmV0dXJuOwogCiAJLyogRXJyb3IgYW5kIGFib3J0IHByb2Nlc3Npbmc6IHRyeSB0byByZXN5bmNocm9uaXplIHdpdGggdGhlIGRldmljZQpAQCAtNjk0LDYgKzg0MSw3IEBACiAJCXVzLT50cmFuc3BvcnRfcmVzZXQodXMpOwogCX0KIAljbGVhcl9iaXQoVVNfRkxJRFhfUkVTRVRUSU5HLCAmdXMtPmRmbGFncyk7CisJbGFzdF9zZWN0b3JfaGFja3ModXMsIHNyYik7CiB9CiAKIC8qIFN0b3AgdGhlIGN1cnJlbnQgVVJCIHRyYW5zZmVyICovCkBAIC03MTgsMTAgKzg2NiwxMCBAQAogfQogCiAvKgotICogQ29udHJvbC9CdWxrL0ludGVycnVwdCB0cmFuc3BvcnQKKyAqIENvbnRyb2wvQnVsayBhbmQgQ29udHJvbC9CdWxrL0ludGVycnVwdCB0cmFuc3BvcnQKICAqLwogCi1pbnQgdXNiX3N0b3JfQ0JJX3RyYW5zcG9ydChzdHJ1Y3Qgc2NzaV9jbW5kICpzcmIsIHN0cnVjdCB1c19kYXRhICp1cykKK2ludCB1c2Jfc3Rvcl9DQl90cmFuc3BvcnQoc3RydWN0IHNjc2lfY21uZCAqc3JiLCBzdHJ1Y3QgdXNfZGF0YSAqdXMpCiB7CiAJdW5zaWduZWQgaW50IHRyYW5zZmVyX2xlbmd0aCA9IHNjc2lfYnVmZmxlbihzcmIpOwogCXVuc2lnbmVkIGludCBwaXBlID0gMDsKQEAgLTc2Myw2ICs5MTEsMTMgQEAKIAl9CiAKIAkvKiBTVEFUVVMgU1RBR0UgKi8KKworCS8qIE5PVEU6IENCIGRvZXMgbm90IGhhdmUgYSBzdGF0dXMgc3RhZ2UuICBTaWxseSwgSSBrbm93LiAgU28KKwkgKiB3ZSBoYXZlIHRvIGNhdGNoIHRoaXMgYXQgYSBoaWdoZXIgbGV2ZWwuCisJICovCisJaWYgKHVzLT5wcm90b2NvbCAhPSBVU19QUl9DQkkpCisJCXJldHVybiBVU0JfU1RPUl9UUkFOU1BPUlRfR09PRDsKKwogCXJlc3VsdCA9IHVzYl9zdG9yX2ludHJfdHJhbnNmZXIodXMsIHVzLT5pb2J1ZiwgMik7CiAJVVNfREVCVUdQKCJHb3QgaW50ZXJydXB0IGRhdGEgKDB4JXgsIDB4JXgpXG4iLCAKIAkJCXVzLT5pb2J1ZlswXSwgdXMtPmlvYnVmWzFdKTsKQEAgLTgxNyw1NiArOTcyLDYgQEAKIH0KIAogLyoKLSAqIENvbnRyb2wvQnVsayB0cmFuc3BvcnQKLSAqLwotaW50IHVzYl9zdG9yX0NCX3RyYW5zcG9ydChzdHJ1Y3Qgc2NzaV9jbW5kICpzcmIsIHN0cnVjdCB1c19kYXRhICp1cykKLXsKLQl1bnNpZ25lZCBpbnQgdHJhbnNmZXJfbGVuZ3RoID0gc2NzaV9idWZmbGVuKHNyYik7Ci0JaW50IHJlc3VsdDsKLQotCS8qIENPTU1BTkQgU1RBR0UgKi8KLQkvKiBsZXQncyBzZW5kIHRoZSBjb21tYW5kIHZpYSB0aGUgY29udHJvbCBwaXBlICovCi0JcmVzdWx0ID0gdXNiX3N0b3JfY3RybF90cmFuc2Zlcih1cywgdXMtPnNlbmRfY3RybF9waXBlLAotCQkJCSAgICAgIFVTX0NCSV9BRFNDLCAKLQkJCQkgICAgICBVU0JfVFlQRV9DTEFTUyB8IFVTQl9SRUNJUF9JTlRFUkZBQ0UsIDAsIAotCQkJCSAgICAgIHVzLT5pZm51bSwgc3JiLT5jbW5kLCBzcmItPmNtZF9sZW4pOwotCi0JLyogY2hlY2sgdGhlIHJldHVybiBjb2RlIGZvciB0aGUgY29tbWFuZCAqLwotCVVTX0RFQlVHUCgiQ2FsbCB0byB1c2Jfc3Rvcl9jdHJsX3RyYW5zZmVyKCkgcmV0dXJuZWQgJWRcbiIsIHJlc3VsdCk7Ci0KLQkvKiBpZiB3ZSBzdGFsbGVkIHRoZSBjb21tYW5kLCBpdCBtZWFucyBjb21tYW5kIGZhaWxlZCAqLwotCWlmIChyZXN1bHQgPT0gVVNCX1NUT1JfWEZFUl9TVEFMTEVEKSB7Ci0JCXJldHVybiBVU0JfU1RPUl9UUkFOU1BPUlRfRkFJTEVEOwotCX0KLQotCS8qIFVoIG9oLi4uIHNlcmlvdXMgcHJvYmxlbSBoZXJlICovCi0JaWYgKHJlc3VsdCAhPSBVU0JfU1RPUl9YRkVSX0dPT0QpIHsKLQkJcmV0dXJuIFVTQl9TVE9SX1RSQU5TUE9SVF9FUlJPUjsKLQl9Ci0KLQkvKiBEQVRBIFNUQUdFICovCi0JLyogdHJhbnNmZXIgdGhlIGRhdGEgcGF5bG9hZCBmb3IgdGhpcyBjb21tYW5kLCBpZiBvbmUgZXhpc3RzKi8KLQlpZiAodHJhbnNmZXJfbGVuZ3RoKSB7Ci0JCXVuc2lnbmVkIGludCBwaXBlID0gc3JiLT5zY19kYXRhX2RpcmVjdGlvbiA9PSBETUFfRlJPTV9ERVZJQ0UgPyAKLQkJCQl1cy0+cmVjdl9idWxrX3BpcGUgOiB1cy0+c2VuZF9idWxrX3BpcGU7Ci0JCXJlc3VsdCA9IHVzYl9zdG9yX2J1bGtfc3JiKHVzLCBwaXBlLCBzcmIpOwotCQlVU19ERUJVR1AoIkNCIGRhdGEgc3RhZ2UgcmVzdWx0IGlzIDB4JXhcbiIsIHJlc3VsdCk7Ci0KLQkJLyogaWYgd2Ugc3RhbGxlZCB0aGUgZGF0YSB0cmFuc2ZlciBpdCBtZWFucyBjb21tYW5kIGZhaWxlZCAqLwotCQlpZiAocmVzdWx0ID09IFVTQl9TVE9SX1hGRVJfU1RBTExFRCkKLQkJCXJldHVybiBVU0JfU1RPUl9UUkFOU1BPUlRfRkFJTEVEOwotCQlpZiAocmVzdWx0ID4gVVNCX1NUT1JfWEZFUl9TVEFMTEVEKQotCQkJcmV0dXJuIFVTQl9TVE9SX1RSQU5TUE9SVF9FUlJPUjsKLQl9Ci0KLQkvKiBTVEFUVVMgU1RBR0UgKi8KLQkvKiBOT1RFOiBDQiBkb2VzIG5vdCBoYXZlIGEgc3RhdHVzIHN0YWdlLiAgU2lsbHksIEkga25vdy4gIFNvCi0JICogd2UgaGF2ZSB0byBjYXRjaCB0aGlzIGF0IGEgaGlnaGVyIGxldmVsLgotCSAqLwotCXJldHVybiBVU0JfU1RPUl9UUkFOU1BPUlRfR09PRDsKLX0KLQotLyoKICAqIEJ1bGsgb25seSB0cmFuc3BvcnQKICAqLwogCkBAIC0xMTczLDEwICsxMjc4LDkgQEAKICAqLwogaW50IHVzYl9zdG9yX3BvcnRfcmVzZXQoc3RydWN0IHVzX2RhdGEgKnVzKQogewotCWludCByZXN1bHQsIHJjX2xvY2s7CisJaW50IHJlc3VsdDsKIAotCXJlc3VsdCA9IHJjX2xvY2sgPQotCQl1c2JfbG9ja19kZXZpY2VfZm9yX3Jlc2V0KHVzLT5wdXNiX2RldiwgdXMtPnB1c2JfaW50Zik7CisJcmVzdWx0ID0gdXNiX2xvY2tfZGV2aWNlX2Zvcl9yZXNldCh1cy0+cHVzYl9kZXYsIHVzLT5wdXNiX2ludGYpOwogCWlmIChyZXN1bHQgPCAwKQogCQlVU19ERUJVR1AoInVuYWJsZSB0byBsb2NrIGRldmljZSBmb3IgcmVzZXQ6ICVkXG4iLCByZXN1bHQpOwogCWVsc2UgewpAQCAtMTE4OSw4ICsxMjkzLDcgQEAKIAkJCVVTX0RFQlVHUCgidXNiX3Jlc2V0X2RldmljZSByZXR1cm5zICVkXG4iLAogCQkJCQlyZXN1bHQpOwogCQl9Ci0JCWlmIChyY19sb2NrKQotCQkJdXNiX3VubG9ja19kZXZpY2UodXMtPnB1c2JfZGV2KTsKKwkJdXNiX3VubG9ja19kZXZpY2UodXMtPnB1c2JfZGV2KTsKIAl9CiAJcmV0dXJuIHJlc3VsdDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdHJhbnNwb3J0LmggYi9kcml2ZXJzL3VzYi9zdG9yYWdlL3RyYW5zcG9ydC5oCmluZGV4IGU3MGI4ODEuLjI0MmZmNWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdHJhbnNwb3J0LmgKKysrIGIvZHJpdmVycy91c2Ivc3RvcmFnZS90cmFuc3BvcnQuaApAQCAtMTEzLDggKzExMyw2IEBACiAKICNkZWZpbmUgVVNfQ0JJX0FEU0MJCTAKIAotZXh0ZXJuIGludCB1c2Jfc3Rvcl9DQklfdHJhbnNwb3J0KHN0cnVjdCBzY3NpX2NtbmQgKiwgc3RydWN0IHVzX2RhdGEqKTsKLQogZXh0ZXJuIGludCB1c2Jfc3Rvcl9DQl90cmFuc3BvcnQoc3RydWN0IHNjc2lfY21uZCAqLCBzdHJ1Y3QgdXNfZGF0YSopOwogZXh0ZXJuIGludCB1c2Jfc3Rvcl9DQl9yZXNldChzdHJ1Y3QgdXNfZGF0YSopOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zdG9yYWdlL3VudXN1YWxfZGV2cy5oIGIvZHJpdmVycy91c2Ivc3RvcmFnZS91bnVzdWFsX2RldnMuaAppbmRleCBiZmNjMWZlLi5hN2Y5NTEzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zdG9yYWdlL3VudXN1YWxfZGV2cy5oCisrKyBiL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdW51c3VhbF9kZXZzLmgKQEAgLTI3LDcgKzI3LDggQEAKIAogLyogSU1QT1JUQU5UIE5PVEU6IFRoaXMgZmlsZSBtdXN0IGJlIGluY2x1ZGVkIGluIGFub3RoZXIgZmlsZSB3aGljaCBkb2VzCiAgKiB0aGUgZm9sbG93aW5nIHRoaW5nIGZvciBpdCB0byB3b3JrOgotICogVGhlIG1hY3JvIFVOVVNVQUxfREVWKCkgbXVzdCBiZSBkZWZpbmVkIGJlZm9yZSB0aGlzIGZpbGUgaXMgaW5jbHVkZWQKKyAqIFRoZSBVTlVTVUFMX0RFViwgQ09NUExJQU5UX0RFViwgYW5kIFVTVUFMX0RFViBtYWNyb3MgbXVzdCBiZSBkZWZpbmVkCisgKiBiZWZvcmUgdGhpcyBmaWxlIGlzIGluY2x1ZGVkLgogICovCiAKIC8qIElmIHlvdSBlZGl0IHRoaXMgZmlsZSwgcGxlYXNlIHRyeSB0byBrZWVwIGl0IHNvcnRlZCBmaXJzdCBieSBWZW5kb3JJRCwKQEAgLTQ2LDYgKzQ3LDEyIEBACiAgKiA8dXNiLXN0b3JhZ2VAbGlzdHMub25lLWV5ZWQtYWxpZW4ubmV0PgogICovCiAKKy8qIE5vdGU6IElmIHlvdSBhZGQgYW4gZW50cnkgb25seSBpbiBvcmRlciB0byBzZXQgdGhlIENBUEFDSVRZX09LIGZsYWcsCisgKiB1c2UgdGhlIENPTVBMSUFOVF9ERVYgbWFjcm8gaW5zdGVhZCBvZiBVTlVTVUFMX0RFVi4gIFRoaXMgaXMKKyAqIGJlY2F1c2Ugc3VjaCBlbnRyaWVzIG1hcmsgZGV2aWNlcyB3aGljaCBhY3R1YWxseSB3b3JrIGNvcnJlY3RseSwKKyAqIGFzIG9wcG9zZWQgdG8gZGV2aWNlcyB0aGF0IGRvIHNvbWV0aGluZyBzdHJhbmdlbHkgb3Igd3JvbmdseS4KKyAqLworCiAvKiBwYXRjaCBzdWJtaXR0ZWQgYnkgVml2aWFuIEJyZWdpZXIgPFZpdmlhbi5CcmVnaWVyQGltYWcuZnI+CiAgKi8KIFVOVVNVQUxfREVWKCAgMHgwM2ViLCAweDIwMDIsIDB4MDEwMCwgMHgwMTAwLApAQCAtODUsNiArOTIsMTMgQEAKIAkJVVNfU0NfODA3MCwgVVNfUFJfVVNCQVQsIGluaXRfdXNiYXRfY2QsIDApLAogI2VuZGlmCiAKKy8qIFJlcG9ydGVkIGJ5IEJlbiBFZnJvcyA8YmVuQHBjLWRvY3Rvci5jb20+ICovCitVTlVTVUFMX0RFViggIDB4MDNmMCwgMHgwNzBjLCAweDAwMDAsIDB4MDAwMCwKKwkJIkhQIiwKKwkJIlBlcnNvbmFsIE1lZGlhIERyaXZlIiwKKwkJVVNfU0NfREVWSUNFLCBVU19QUl9ERVZJQ0UsIE5VTEwsCisJCVVTX0ZMX1NBTkVfU0VOU0UgKSwKKwogLyogUmVwb3J0ZWQgYnkgR3JhbnQgR3J1bmRsZXIgPGdydW5kbGVyQHBhcmlzYy1saW51eC5vcmc+CiAgKiBIUCByNzA3IGNhbWVyYSBpbiAiRGlzayIgbW9kZSB3aXRoIDIuMDAuMjMgb3IgMi4wMC4yNCBmaXJtd2FyZS4KICAqLwpAQCAtMTYwLDM0ICsxNzQsNiBAQAogCQlVU19TQ19ERVZJQ0UsIFVTX1BSX0RFVklDRSwgTlVMTCwKIAkJVVNfRkxfTUFYX1NFQ1RPUlNfNjQgKSwKIAotLyogUmVwb3J0ZWQgYnkgRmlsaXAgSm9lbHNzb24gPGZpbGlwQGJsdWV0dXJ0bGUubnU+ICovCi1VTlVTVUFMX0RFViggIDB4MDQyMSwgMHgwMDVkLCAweDAwMDEsIDB4MDYwMCwKLQkJIk5va2lhIiwKLQkJIk5va2lhIDMxMTBjIiwKLQkJVVNfU0NfREVWSUNFLCBVU19QUl9ERVZJQ0UsIE5VTEwsCi0JCVVTX0ZMX0ZJWF9DQVBBQ0lUWSApLAotCi0vKiBSZXBvcnRlZCBieSBPemFuIFNlbmVyIDx0aGVtZ3p6eUBnbWFpbC5jb20+ICovCi1VTlVTVUFMX0RFViggIDB4MDQyMSwgMHgwMDYwLCAweDA1NTEsIDB4MDU1MSwKLQkJIk5va2lhIiwKLQkJIjM1MDBjIiwKLQkJVVNfU0NfREVWSUNFLCBVU19QUl9ERVZJQ0UsIE5VTEwsCi0JCVVTX0ZMX0ZJWF9DQVBBQ0lUWSApLAotCi0vKiBSZXBvcnRlZCBieSBDU0VDU1kgTGFzemxvIDxib29iYWFAZnJ1Z2Fsd2FyZS5vcmc+ICovCi1VTlVTVUFMX0RFViggIDB4MDQyMSwgMHgwMDYzLCAweDAwMDEsIDB4MDYwMSwKLQkJIk5va2lhIiwKLQkJIk5va2lhIDMxMDljIiwKLQkJVVNfU0NfREVWSUNFLCBVU19QUl9ERVZJQ0UsIE5VTEwsCi0JCVVTX0ZMX0ZJWF9DQVBBQ0lUWSApLAotCi0vKiBQYXRjaCBmb3IgTm9raWEgNTMxMCBjYXBhY2l0eSAqLwotVU5VU1VBTF9ERVYoICAweDA0MjEsIDB4MDA2YSwgMHgwMDAwLCAweDA3MDEsCi0JCSJOb2tpYSIsCi0JCSI1MzEwIiwKLQkJVVNfU0NfREVWSUNFLCBVU19QUl9ERVZJQ0UsIE5VTEwsCi0JCVVTX0ZMX0ZJWF9DQVBBQ0lUWSApLAotCiAvKiBSZXBvcnRlZCBieSBNYXJpbyBSZXR0aWcgPG1hcmlvcmV0dGlnQHdlYi5kZT4gKi8KIFVOVVNVQUxfREVWKCAgMHgwNDIxLCAweDA0MmUsIDB4MDEwMCwgMHgwMTAwLAogCQkiTm9raWEiLApAQCAtMjUzLDM1ICsyMzksNiBAQAogCQlVU19TQ19ERVZJQ0UsIFVTX1BSX0RFVklDRSwgTlVMTCwKIAkJVVNfRkxfTUFYX1NFQ1RPUlNfNjQgKSwKIAotLyogUmVwb3J0ZWQgYnkgQ2VkcmljIEdvZGluIDxjZWRyaWNAYmVsYm9uZS5iZT4gKi8KLVVOVVNVQUxfREVWKCAgMHgwNDIxLCAweDA0YjksIDB4MDUwMCwgMHgwNTUxLAotCQkiTm9raWEiLAotCQkiNTMwMCIsCi0JCVVTX1NDX0RFVklDRSwgVVNfUFJfREVWSUNFLCBOVUxMLAotCQlVU19GTF9GSVhfQ0FQQUNJVFkgKSwKLQotLyogUmVwb3J0ZWQgYnkgUmljaGFyZCBOYXViZXIgPFJpY2hhcmROYXViZXJAd2ViLmRlPiAqLwotVU5VU1VBTF9ERVYoICAweDA0MjEsIDB4MDRmYSwgMHgwNTUwLCAweDA2NjAsCi0JCSJOb2tpYSIsCi0JCSI2MzAwIiwKLQkJVVNfU0NfREVWSUNFLCBVU19QUl9ERVZJQ0UsIE5VTEwsCi0JCVVTX0ZMX0ZJWF9DQVBBQ0lUWSApLAotCi0vKiBQYXRjaCBmb3IgTm9raWEgNTMxMCBjYXBhY2l0eSAqLwotVU5VU1VBTF9ERVYoICAweDA0MjEsIDB4MDA2YSwgMHgwMDAwLCAweDA1OTEsCi0JIk5va2lhIiwKLQkiNTMxMCIsCi0JVVNfU0NfREVWSUNFLCBVU19QUl9ERVZJQ0UsIE5VTEwsCi0JVVNfRkxfRklYX0NBUEFDSVRZICksCi0KLS8qIFN1Ym1pdHRlZCBieSBSaWNreSBXb25nIFl1bmcgRmVpIDxldmlsYmxhZGV3YXJyaW9yQGdtYWlsLmNvbT4gKi8KLS8qIE5va2lhIDc2MTAgU3VwZXJub3ZhIC0gVG9vIG1hbnkgc2VjdG9ycyByZXBvcnRlZCBpbiB1c2Igc3RvcmFnZSBtb2RlICovCi1VTlVTVUFMX0RFViggIDB4MDQyMSwgMHgwMGY1LCAweDAwMDAsIDB4MDQ3MCwKLQkiTm9raWEiLAotCSI3NjEwIFN1cGVybm92YSIsCi0JVVNfU0NfREVWSUNFLCBVU19QUl9ERVZJQ0UsIE5VTEwsCi0JVVNfRkxfRklYX0NBUEFDSVRZICksCi0KIC8qIFJlcG9ydGVkIGJ5IE9sYWYgSGVyaW5nIDxvbGhAc3VzZS5kZT4gZnJvbSBub3ZlbGwgYnVnICMxMDU4NzggKi8KIFVOVVNVQUxfREVWKCAgMHgwNDI0LCAweDBmZGMsIDB4MDIxMCwgMHgwMjEwLAogCQkiU01TQyIsCkBAIC0yODksMTEgKzI0NiwxNyBAQAogCQlVU19TQ19ERVZJQ0UsIFVTX1BSX0RFVklDRSwgTlVMTCwKIAkJVVNfRkxfU0lOR0xFX0xVTiApLAogCi0jaWZkZWYgQ09ORklHX1VTQl9TVE9SQUdFX0RQQ00KKyNpZmRlZiBDT05GSUdfVVNCX1NUT1JBR0VfU0REUjA5CiBVTlVTVUFMX0RFViggIDB4MDQzNiwgMHgwMDA1LCAweDAxMDAsIDB4MDEwMCwKIAkJIk1pY3JvdGVjaCIsCiAJCSJDYW1lcmFNYXRlIChEUENNX1VTQikiLAogIAkJVVNfU0NfU0NTSSwgVVNfUFJfRFBDTV9VU0IsIE5VTEwsIDAgKSwKKyNlbHNlCitVTlVTVUFMX0RFViggIDB4MDQzNiwgMHgwMDA1LCAweDAxMDAsIDB4MDEwMCwKKwkJIk1pY3JvdGVjaCIsCisJCSJDYW1lcmFNYXRlIiwKKwkJVVNfU0NfU0NTSSwgVVNfUFJfQ0IsIE5VTEwsCisJCVVTX0ZMX1NJTkdMRV9MVU4gKSwKICNlbmRpZgogCiAvKiBQYXRjaCBzdWJtaXR0ZWQgYnkgRGFuaWVsIERyYWtlIDxkc2RAZ2VudG9vLm9yZz4KQEAgLTM4OCw5OCArMzUxLDYgQEAKIAkJIkRWRC1DQU0gRFotTVYxMDBBIENhbWNvcmRlciIsCiAJCVVTX1NDX1NDU0ksIFVTX1BSX0NCLCBOVUxMLCBVU19GTF9TSU5HTEVfTFVOKSwKIAotLyogUGF0Y2ggZm9yIE5pa29uIGNvb2xwaXggMjAwMAotICogU3VibWl0dGVkIGJ5IEZhYmllbiBDb3NzZSA8ZmFiaWVuLmNvc3NlQHdhbmFkb28uZnI+Ki8KLVVOVVNVQUxfREVWKCAgMHgwNGIwLCAweDAzMDEsIDB4MDAxMCwgMHgwMDEwLAotCQkiTklLT04iLAotCQkiTklLT04gRFNDIEUyMDAwIiwKLQkJVVNfU0NfREVWSUNFLCBVU19QUl9ERVZJQ0UsTlVMTCwKLQkJVVNfRkxfTk9UX0xPQ0tBQkxFICksCi0KLS8qIFJlcG9ydGVkIGJ5IFN0ZWZhbiBkZSBLb25pbmsgPHNraW5raWVAeHM0YWxsLm5sPiAqLwotVU5VU1VBTF9ERVYoICAweDA0YjAsIDB4MDQwMSwgMHgwMjAwLCAweDAyMDAsCi0JCSJOSUtPTiIsCi0JCSJOSUtPTiBEU0MgRDEwMCIsCi0JCVVTX1NDX0RFVklDRSwgVVNfUFJfREVWSUNFLCBOVUxMLAotCQlVU19GTF9GSVhfQ0FQQUNJVFkpLAotCi0vKiBSZXBvcnRlZCBieSBUb2JpYXMgS3VuemUgQnJpc2VubyA8dC1saW51eEBmaWN0aXZlLmNvbT4gKi8KLVVOVVNVQUxfREVWKCAgMHgwNGIwLCAweDA0MDMsIDB4MDIwMCwgMHgwMjAwLAotCQkiTklLT04iLAotCQkiTklLT04gRFNDIEQySCIsCi0JCVVTX1NDX0RFVklDRSwgVVNfUFJfREVWSUNFLCBOVUxMLAotCQlVU19GTF9GSVhfQ0FQQUNJVFkpLAotCi0vKiBSZXBvcnRlZCBieSBNaWxpbmV2c2t5IERtaXRyeSA8bmlhbS5uaWFtQGdtYWlsLmNvbT4gKi8KLVVOVVNVQUxfREVWKCAgMHgwNGIwLCAweDA0MDksIDB4MDEwMCwgMHgwMTAwLAotCQkiTklLT04iLAotCQkiTklLT04gRFNDIEQ1MCIsCi0JCVVTX1NDX0RFVklDRSwgVVNfUFJfREVWSUNFLCBOVUxMLAotCQlVU19GTF9GSVhfQ0FQQUNJVFkpLAotCi0vKiBSZXBvcnRlZCBieSBBbmRyZWFzIEJvY2tob2xkIDxhbmRyZWFzQGJvY2tpb25saW5lLmRlPiAqLwotVU5VU1VBTF9ERVYoICAweDA0YjAsIDB4MDQwNSwgMHgwMTAwLCAweDAxMDAsCi0JCSJOSUtPTiIsCi0JCSJOSUtPTiBEU0MgRDcwIiwKLQkJVVNfU0NfREVWSUNFLCBVU19QUl9ERVZJQ0UsIE5VTEwsCi0JCVVTX0ZMX0ZJWF9DQVBBQ0lUWSksCi0KLS8qIFJlcG9ydGVkIGJ5IEphbWllIEtpdHNvbiA8amFtaWVAc3RhYmVyaW5kZS5mc25ldC5jby51az4gKi8KLVVOVVNVQUxfREVWKCAgMHgwNGIwLCAweDA0MGQsIDB4MDEwMCwgMHgwMTAwLAotCQkiTklLT04iLAotCQkiTklLT04gRFNDIEQ3MHMiLAotCQlVU19TQ19ERVZJQ0UsIFVTX1BSX0RFVklDRSwgTlVMTCwKLQkJVVNfRkxfRklYX0NBUEFDSVRZKSwKLQotLyogUmVwb3J0ZWQgYnkgR3JhYmVyIGFuZCBNaWtlIFBhZ2FubyA8bXBhZ2Fuby1rZXJuZWxAbXBhZ2Fuby5jb20+ICovCi1VTlVTVUFMX0RFViggIDB4MDRiMCwgMHgwNDBmLCAweDAxMDAsIDB4MDIwMCwKLQkJIk5JS09OIiwKLQkJIk5JS09OIERTQyBEMjAwIiwKLQkJVVNfU0NfREVWSUNFLCBVU19QUl9ERVZJQ0UsIE5VTEwsCi0JCVVTX0ZMX0ZJWF9DQVBBQ0lUWSksCi0KLS8qIFJlcG9ydGVkIGJ5IEVtaWwgTGFyc3NvbiA8ZW1pbEBzd2lwLm5ldD4gKi8KLVVOVVNVQUxfREVWKCAgMHgwNGIwLCAweDA0MTEsIDB4MDEwMCwgMHgwMTExLAotCQkiTklLT04iLAotCQkiTklLT04gRFNDIEQ4MCIsCi0JCVVTX1NDX0RFVklDRSwgVVNfUFJfREVWSUNFLCBOVUxMLAotCQlVU19GTF9GSVhfQ0FQQUNJVFkpLAotCi0vKiBSZXBvcnRlZCBieSBPcnR3aW4gR2x1ZWNrIDxvZGlAb2RpLmNoPiAqLwotVU5VU1VBTF9ERVYoICAweDA0YjAsIDB4MDQxMywgMHgwMTEwLCAweDAxMTEsCi0JCSJOSUtPTiIsCi0JCSJOSUtPTiBEU0MgRDQwIiwKLQkJVVNfU0NfREVWSUNFLCBVU19QUl9ERVZJQ0UsIE5VTEwsCi0JCVVTX0ZMX0ZJWF9DQVBBQ0lUWSksCi0KLS8qIFJlcG9ydGVkIGJ5IFBhdWwgQ2hlY2sgPHBhdWxAb3BlbnN0cmVldC5jb20+ICovCi1VTlVTVUFMX0RFViggIDB4MDRiMCwgMHgwNDE1LCAweDAxMDAsIDB4MDEwMCwKLQkJIk5JS09OIiwKLQkJIk5JS09OIERTQyBEMlhzIiwKLQkJVVNfU0NfREVWSUNFLCBVU19QUl9ERVZJQ0UsIE5VTEwsCi0JCVVTX0ZMX0ZJWF9DQVBBQ0lUWSksCi0KLS8qIFJlcG9ydGVkIGJ5IFNoYW4gRGVzdHJvbXAgKHNoYW5zYW5AZ21haWwuY29tKSAqLwotVU5VU1VBTF9ERVYoICAweDA0YjAsIDB4MDQxNywgMHgwMTAwLCAweDAxMDAsCi0JCSJOSUtPTiIsCi0JCSJOSUtPTiBEU0MgRDQwWCIsCi0JCVVTX1NDX0RFVklDRSwgVVNfUFJfREVWSUNFLCBOVUxMLAotCQlVU19GTF9GSVhfQ0FQQUNJVFkpLAotCi0vKiBSZXBvcnRlZCBieSBwYXVsIHJlYWR5IDxseHR3aW5AaG9tZWNhbGwuY28udWs+ICovCi1VTlVTVUFMX0RFViggIDB4MDRiMCwgMHgwNDE5LCAweDAxMDAsIDB4MDIwMCwKLQkJIk5JS09OIiwKLQkJIk5JS09OIERTQyBEMzAwIiwKLQkJVVNfU0NfREVWSUNFLCBVU19QUl9ERVZJQ0UsIE5VTEwsCi0JCVVTX0ZMX0ZJWF9DQVBBQ0lUWSksCi0KLS8qIFJlcG9ydGVkIGJ5IERvdWcgTWF4ZXkgKGR3bUBhdXN0aW4uaWJtLmNvbSkgKi8KLVVOVVNVQUxfREVWKCAgMHgwNGIzLCAweDQwMDEsIDB4MDExMCwgMHgwMTEwLAotCQkiSUJNIiwKLQkJIklCTSBSU0EyIiwKLQkJVVNfU0NfREVWSUNFLCBVU19QUl9DQiwgTlVMTCwKLQkJVVNfRkxfTUFYX1NFQ1RPUlNfTUlOKSwKLQogLyogQkVOUSBEQzUzMzAKICAqIFJlcG9ydGVkIGJ5IE1hbnVlbCBGb21idWVuYSA8bWZvbWJ1ZW5hQHlhLmNvbT4gYW5kCiAgKiBGcmFuayBDb3BlbGFuZCA8ZmpjQHRoaW5neS5hcGFuYS5vcmcuYXU+ICovCkBAIC00ODksNiArMzYwLDIxIEBACiAJCVVTX1NDX0RFVklDRSwgVVNfUFJfREVWSUNFLCBOVUxMLAogCQlVU19GTF9JR05PUkVfUkVTSURVRSApLAogCisvKiBQYXRjaCBmb3IgTmlrb24gY29vbHBpeCAyMDAwCisgKiBTdWJtaXR0ZWQgYnkgRmFiaWVuIENvc3NlIDxmYWJpZW4uY29zc2VAd2FuYWRvby5mcj4qLworVU5VU1VBTF9ERVYoICAweDA0YjAsIDB4MDMwMSwgMHgwMDEwLCAweDAwMTAsCisJCSJOSUtPTiIsCisJCSJOSUtPTiBEU0MgRTIwMDAiLAorCQlVU19TQ19ERVZJQ0UsIFVTX1BSX0RFVklDRSxOVUxMLAorCQlVU19GTF9OT1RfTE9DS0FCTEUgKSwKKworLyogUmVwb3J0ZWQgYnkgRG91ZyBNYXhleSAoZHdtQGF1c3Rpbi5pYm0uY29tKSAqLworVU5VU1VBTF9ERVYoICAweDA0YjMsIDB4NDAwMSwgMHgwMTEwLCAweDAxMTAsCisJCSJJQk0iLAorCQkiSUJNIFJTQTIiLAorCQlVU19TQ19ERVZJQ0UsIFVTX1BSX0NCLCBOVUxMLAorCQlVU19GTF9NQVhfU0VDVE9SU19NSU4pLAorCiAjaWZkZWYgQ09ORklHX1VTQl9TVE9SQUdFX0NZUFJFU1NfQVRBQ0IKIC8qIENZN0M2ODMwMCA6IHN1cHBvcnQgYXRhY2IgKi8KIFVOVVNVQUxfREVWKCAgMHgwNGI0LCAweDY4MzAsIDB4MDAwMCwgMHg5OTk5LApAQCAtNTk0LDYgKzQ4MCwxMiBAQAogCQkiZVVTQiBTbWFydE1lZGlhIC8gQ29tcGFjdEZsYXNoIEFkYXB0ZXIiLAogCQlVU19TQ19TQ1NJLCBVU19QUl9EUENNX1VTQiwgdXNiX3N0b3Jfc2RkcjA5X2RwY21faW5pdCwKIAkJMCksCisjZWxzZQorVU5VU1VBTF9ERVYoICAweDA0ZTYsIDB4MDAwNSwgMHgwMTAwLCAweDAyMDgsCisJCSJTQ00gTWljcm9zeXN0ZW1zIiwKKwkJImVVU0IgQ29tcGFjdEZsYXNoIEFkYXB0ZXIiLAorCQlVU19TQ19TQ1NJLCBVU19QUl9DQiwgTlVMTCwKKwkJVVNfRkxfU0lOR0xFX0xVTiksCiAjZW5kaWYKIAogLyogUmVwb3J0ZWQgYnkgTWFya3VzIERlbWxlaXRuZXIgPG1zZGVtbGVpQGNsLnVuaS1oZWlkZWxiZXJnLmRlPiAqLwpAQCAtNjg1LDYgKzU3NywxMyBAQAogCQlVU19TQ184MDcwLCBVU19QUl9ERVZJQ0UsIE5VTEwsCiAJCVVTX0ZMX0ZJWF9JTlFVSVJZICksCiAKKy8qIEFkZGVkIGJ5IEFsYW4gU3Rlcm4gPHN0ZXJuQHJvd2xhbmQuaGFydmFyZC5lZHU+ICovCitDT01QTElBTlRfREVWKDB4MDUyNSwgMHhhNGE1LCAweDAwMDAsIDB4OTk5OSwKKwkJIkxpbnV4IiwKKwkJIkZpbGUtYmFja2VkIFN0b3JhZ2UgR2FkZ2V0IiwKKwkJVVNfU0NfREVWSUNFLCBVU19QUl9ERVZJQ0UsIE5VTEwsCisJCVVTX0ZMX0NBUEFDSVRZX09LICksCisKIC8qIFlha3VtbyBNZWdhIEltYWdlIDM3CiAgKiBTdWJtaXR0ZWQgYnkgU3RlcGhhbiBGdWhybWFubiA8YXRvbWVuZXJnaWVAdC1vbmxpbmUuZGU+ICovCiBVTlVTVUFMX0RFViggIDB4MDUyYiwgMHgxODAxLCAweDAxMDAsIDB4MDEwMCwKQEAgLTgwNywxNSArNzA2LDE1IEBACiAJCVVTX1NDX0RFVklDRSwgVVNfUFJfREVWSUNFLCBOVUxMLAogCQlVU19GTF9GSVhfSU5RVUlSWSApLAogCi0vKiBTdWJtaXR0ZWQgYnkgTWlrZSBBbGJvcm4gPG1hbGJvcm5AZGVhbmRyYS5ob21laXAubmV0PiAqLwotVU5VU1VBTF9ERVYoICAweDA1NGMsIDB4MDE2YSwgMHgwMDAwLCAweDk5OTksCisvKiBTdWJtaXR0ZWQgYnkgRnJhbmsgRW5nZWwgPGZyYW5raWVAY3NlLnVuc3cuZWR1LmF1PiAqLworVU5VU1VBTF9ERVYoICAweDA1NGMsIDB4MDA5OSwgMHgwMDAwLCAweDk5OTksCiAJCSJTb255IiwKIAkJIlBFRyBNYXNzIFN0b3JhZ2UiLAogCQlVU19TQ19ERVZJQ0UsIFVTX1BSX0RFVklDRSwgTlVMTCwKIAkJVVNfRkxfRklYX0lOUVVJUlkgKSwKLQkJCi0vKiBTdWJtaXR0ZWQgYnkgRnJhbmsgRW5nZWwgPGZyYW5raWVAY3NlLnVuc3cuZWR1LmF1PiAqLwotVU5VU1VBTF9ERVYoICAweDA1NGMsIDB4MDA5OSwgMHgwMDAwLCAweDk5OTksCisKKy8qIFN1Ym1pdHRlZCBieSBNaWtlIEFsYm9ybiA8bWFsYm9ybkBkZWFuZHJhLmhvbWVpcC5uZXQ+ICovCitVTlVTVUFMX0RFViggIDB4MDU0YywgMHgwMTZhLCAweDAwMDAsIDB4OTk5OSwKIAkJIlNvbnkiLAogCQkiUEVHIE1hc3MgU3RvcmFnZSIsCiAJCVVTX1NDX0RFVklDRSwgVVNfUFJfREVWSUNFLCBOVUxMLApAQCAtOTY2LDYgKzg2NSwxOCBAQAogCQlVU19TQ19ERVZJQ0UsIFVTX1BSX0RFVklDRSwgTlVMTCwKIAkJVVNfRkxfRklYX0NBUEFDSVRZICksCiAKKy8qIFJlcG9ydGVkIGJ5IERhbiBXaWxsaWFtcyA8ZGNid0ByZWRoYXQuY29tPgorICogT3B0aW9uIE4uVi4gbW9iaWxlIGJyb2FkYmFuZCBtb2RlbXMKKyAqIElnbm9yZSBkcml2ZXIgQ0QgbW9kZSBhbmQgZm9yY2UgaW50byBtb2RlbSBtb2RlIGJ5IGRlZmF1bHQuCisgKi8KKworLyogR2xvYmV0cm90dGVyIEhTRFBBOyBtYXNzIHN0b3JhZ2Ugc2hvd3MgdXAgYXMgUXVhbGNvbW0gZm9yIHZlbmRvciAqLworVU5VU1VBTF9ERVYoICAweDA1YzYsIDB4MTAwMCwgMHgwMDAwLCAweDk5OTksCisJCSJPcHRpb24gTi5WLiIsCisJCSJNYXNzIFN0b3JhZ2UiLAorCQlVU19TQ19ERVZJQ0UsIFVTX1BSX0RFVklDRSwgb3B0aW9uX21zX2luaXQsCisJCTApLAorCiAjaWZkZWYgQ09ORklHX1VTQl9TVE9SQUdFX0pVTVBTSE9UCiBVTlVTVUFMX0RFViggIDB4MDVkYywgMHgwMDAxLCAweDAwMDAsIDB4MDAwMSwKIAkJIkxleGFyIiwKQEAgLTEwMDQsNiArOTE1LDEzIEBACiAJCVVTX1NDX0RFVklDRSwgVVNfUFJfREVWSUNFLCBOVUxMLAogCQlVU19GTF9HT19TTE9XIHwgVVNfRkxfTUFYX1NFQ1RPUlNfNjQgKSwKIAorLyogUmVwb3J0ZWQgYnkgQmVuIEVmcm9zIDxiZW5AcGMtZG9jdG9yLmNvbT4gKi8KK1VOVVNVQUxfREVWKCAgMHgwNWUzLCAweDA3MjMsIDB4OTQ1MSwgMHg5NDUxLAorCQkiR2VuZXN5cyBMb2dpYyIsCisJCSJVU0IgdG8gU0FUQSIsCisJCVVTX1NDX0RFVklDRSwgVVNfUFJfREVWSUNFLCBOVUxMLAorCQlVU19GTF9TQU5FX1NFTlNFICksCisKIC8qIFJlcG9ydGVkIGJ5IEhhbm5vIEJvZWNrIDxoYW5ub0BnbXguZGU+CiAgKiBUYWtlbiBmcm9tIHRoZSBMeWNvcmlzIEtlcm5lbCAqLwogVU5VU1VBTF9ERVYoICAweDA2MzYsIDB4MDAwMywgMHgwMDAwLCAweDk5OTksCkBAIC0xMDQwLDcgKzk1OCw3IEBACiAJCVVTX0ZMX0ZJWF9DQVBBQ0lUWSB8IFVTX0ZMX0dPX1NMT1cgKSwKIAogLyogUmVwb3J0ZWQgYnkgQWxleCBCdXRjaGVyIDxhbGV4LmJ1dGNoZXJAYXNzdXJzeXMuY28udWs+ICovCi1VTlVTVUFMX0RFViggMHgwNjdiLCAweDM1MDcsIDB4MDAwMSwgMHgwMDAxLAorVU5VU1VBTF9ERVYoIDB4MDY3YiwgMHgzNTA3LCAweDAwMDEsIDB4MDEwMSwKIAkJIlByb2xpZmljIFRlY2hub2xvZ3kgSW5jLiIsCiAJCSJBVEFQSS02IEJyaWRnZSBDb250cm9sbGVyIiwKIAkJVVNfU0NfREVWSUNFLCBVU19QUl9ERVZJQ0UsIE5VTEwsCkBAIC0xMTYxLDExICsxMDc5LDE3IEBACiAJCVVTX1NDX0RFVklDRSwgVVNfUFJfREVWSUNFLCB1c2Jfc3Rvcl9ldXNjc2lfaW5pdCwKIAkJVVNfRkxfU0NNX01VTFRfVEFSRyApLAogCi0jaWZkZWYgQ09ORklHX1VTQl9TVE9SQUdFX0RQQ00KKyNpZmRlZiBDT05GSUdfVVNCX1NUT1JBR0VfU0REUjA5CiBVTlVTVUFMX0RFViggIDB4MDdhZiwgMHgwMDA2LCAweDAxMDAsIDB4MDEwMCwKIAkJIk1pY3JvdGVjaCIsCiAJCSJDYW1lcmFNYXRlIChEUENNX1VTQikiLAogIAkJVVNfU0NfU0NTSSwgVVNfUFJfRFBDTV9VU0IsIE5VTEwsIDAgKSwKKyNlbHNlCitVTlVTVUFMX0RFViggIDB4MDdhZiwgMHgwMDA2LCAweDAxMDAsIDB4MDEwMCwKKwkJIk1pY3JvdGVjaCIsCisJCSJDYW1lcmFNYXRlIiwKKwkJVVNfU0NfU0NTSSwgVVNfUFJfQ0IsIE5VTEwsCisJCVVTX0ZMX1NJTkdMRV9MVU4gKSwKICNlbmRpZgogCiAjaWZkZWYgQ09ORklHX1VTQl9TVE9SQUdFX0FMQVVEQQpAQCAtMTMyMCw2ICsxMjQ0LDEzIEBACiAJCVVTX1NDX0RFVklDRSwgVVNfUFJfREVWSUNFLCBOVUxMLAogCQlVU19GTF9GSVhfQ0FQQUNJVFkpLAogCisvKiBSZXBvcnRlZCBhbmQgcGF0Y2hlZCBieSBOZ3V5ZW4gQW5oIFF1eW5oIDxhcXV5bmhAZ21haWwuY29tPiAqLworVU5VU1VBTF9ERVYoIDB4MDg0MCwgMHgwMDg0LCAweDAwMDEsIDB4MDAwMSwKKwkJIkFyZ29zeSIsCisJCSJTdG9yYWdlIiwKKwkJVVNfU0NfREVWSUNFLCBVU19QUl9ERVZJQ0UsIE5VTEwsCisJCVVTX0ZMX0ZJWF9DQVBBQ0lUWSksCisKIC8qIEVudHJ5IGFuZCBzdXBwb3J0aW5nIHBhdGNoIGJ5IFRoZW9kb3JlIEtpbGdvcmUgPGtpbGdvdGFAYXVidXJuLmVkdT4uCiAgKiBGbGFnIHdpbGwgc3VwcG9ydCBCdWxrIGRldmljZXMgd2hpY2ggdXNlIGEgc3RhbmRhcmRzLXZpb2xhdGluZyAzMi1ieXRlCiAgKiBDb21tYW5kIEJsb2NrIFdyYXBwZXIuIEhlcmUsIHRoZSAiREMyTUVHQSIgY2FtZXJhcyAoc2V2ZXJhbCBicmFuZHMpIHdpdGgKQEAgLTEzNDMsMTcgKzEyNzQsNiBAQAogCQlVU19TQ19ERVZJQ0UsIFVTX1BSX0RFVklDRSwgTlVMTCwKIAkJVVNfRkxfTk9UX0xPQ0tBQkxFKSwKIAotLyogQW5kcmV3IEx1bm4gPGFuZHJld0BsdW5uLmNoPgotICogUGFuRGlnaXRhbCBEaWdpdGFsIFBpY3R1cmUgRnJhbWUuIERvZXMgbm90IGxpa2UgQUxMT1dfTUVESVVNX1JFTU9WQUwKLSAqIG9uIExVTiA0LgotICogTm90ZTogVmVuZDpQcm9kIGNsYXNoIHdpdGggIkx0ZCBNYXhlbGwgV1MzMCBTbGltIERpZ2l0YWwgQ2FtZXJhIgotKi8KLVVOVVNVQUxfREVWKCAgMHgwODUxLCAweDE1NDMsIDB4MDIwMCwgMHgwMjAwLAotCQkiUGFuRGlnaXRhbCIsCi0JCSJQaG90byBGcmFtZSIsCi0JCVVTX1NDX0RFVklDRSwgVVNfUFJfREVWSUNFLCBOVUxMLAotCQlVU19GTF9OT1RfTE9DS0FCTEUpLAotCiAvKiBTdWJtaXR0ZWQgYnkgSmFuIERlIEx1eWNrIDxsa21sQGtjb3JlLm9yZz4gKi8KIFVOVVNVQUxfREVWKCAgMHgwOGJkLCAweDExMDAsIDB4MDAwMCwgMHgwMDAwLAogCQkiQ0lUSVpFTiIsCkBAIC0xNDI1LDYgKzEzNDUsMTMgQEAKIAkJVVNfU0NfREVWSUNFLCBVU19QUl9ERVZJQ0UsIE5VTEwsCiAJCVVTX0ZMX0ZJWF9JTlFVSVJZICksCiAKKy8qIFJlcG9ydGVkIGJ5IEphYWsgUmlzdGlvamEgPFJpc3Rpb2phQGdtYWlsLmNvbT4gKi8KK1VOVVNVQUxfREVWKCAweDBhMTcsIDB4MDA2ZSwgMHgwMTAwLCAweDAxMDAsCisJCSJQZW50YXgiLAorCQkiSzEwRCIsCisJCVVTX1NDX0RFVklDRSwgVVNfUFJfREVWSUNFLCBOVUxMLAorCQlVU19GTF9GSVhfQ0FQQUNJVFkgKSwKKwogLyogVGhlc2UgYXJlIHZpcnR1YWwgd2luZG93cyBkcml2ZXIgQ0RzLCB3aGljaCB0aGUgemQxMjExcncgZHJpdmVyCiAgKiBhdXRvbWF0aWNhbGx5IGNvbnZlcnRzIGludG8gV0xBTiBkZXZpY2VzLiAqLwogVU5VU1VBTF9ERVYoIDB4MGFjZSwgMHgyMDExLCAweDAxMDEsIDB4MDEwMSwKQEAgLTE0MzksNiArMTM2NiwxOCBAQAogCQlVU19TQ19ERVZJQ0UsIFVTX1BSX0RFVklDRSwgTlVMTCwKIAkJVVNfRkxfSUdOT1JFX0RFVklDRSApLAogCisvKiBSZXBvcnRlZCBieSBEYW4gV2lsbGlhbXMgPGRjYndAcmVkaGF0LmNvbT4KKyAqIE9wdGlvbiBOLlYuIG1vYmlsZSBicm9hZGJhbmQgbW9kZW1zCisgKiBJZ25vcmUgZHJpdmVyIENEIG1vZGUgYW5kIGZvcmNlIGludG8gbW9kZW0gbW9kZSBieSBkZWZhdWx0LgorICovCisKKy8qIGlDT04gMjI1ICovCitVTlVTVUFMX0RFViggIDB4MGFmMCwgMHg2OTcxLCAweDAwMDAsIDB4OTk5OSwKKwkJIk9wdGlvbiBOLlYuIiwKKwkJIk1hc3MgU3RvcmFnZSIsCisJCVVTX1NDX0RFVklDRSwgVVNfUFJfREVWSUNFLCBvcHRpb25fbXNfaW5pdCwKKwkJMCksCisKIC8qIFJlcG9ydGVkIGJ5IEYuIEFiZW4gPGYuYWJlbkBvcHRpb24uY29tPgogICogVGhpcyBkZXZpY2UgKHdyb25nbHkpIGhhcyBhIHZlbmRvci1zcGVjaWZpYyBkZXZpY2UgZGVzY3JpcHRvci4KICAqIFRoZSBlbnRyeSBpcyBuZWVkZWQgc28gdXNiLXN0b3JhZ2UgY2FuIGJpbmQgdG8gaXQncyBtYXNzLXN0b3JhZ2UKQEAgLTE0NDksNiArMTM4OCwxMyBAQAogCQlVU19TQ19ERVZJQ0UsIFVTX1BSX0RFVklDRSwgTlVMTCwKIAkJMCApLAogCisvKiBSZXBvcnRlZCBieSBCZW4gRWZyb3MgPGJlbkBwYy1kb2N0b3IuY29tPiAqLworVU5VU1VBTF9ERVYoIDB4MGJjMiwgMHgzMDEwLCAweDAwMDAsIDB4MDAwMCwKKwkJIlNlYWdhdGUiLAorCQkiRnJlZUFnZW50IFBybyIsCisJCVVTX1NDX0RFVklDRSwgVVNfUFJfREVWSUNFLCBOVUxMLAorCQlVU19GTF9TQU5FX1NFTlNFICksCisKICNpZmRlZiBDT05GSUdfVVNCX1NUT1JBR0VfSVNEMjAwCiBVTlVTVUFMX0RFViggIDB4MGJmNiwgMHhhMDAxLCAweDAxMDAsIDB4MDExMCwKIAkJIkFUSSIsCkBAIC0xNDcyLDYgKzE0MTgsMjIgQEAKIAkJVVNfRkxfU0lOR0xFX0xVTiApLAogI2VuZGlmCiAKK1VOVVNVQUxfREVWKCAgMHgwZDQ5LCAweDczMTAsIDB4MDAwMCwgMHg5OTk5LAorCQkiTWF4dG9yIiwKKwkJIlVTQiB0byBTQVRBIiwKKwkJVVNfU0NfREVWSUNFLCBVU19QUl9ERVZJQ0UsIE5VTEwsCisJCVVTX0ZMX1NBTkVfU0VOU0UpLAorCisvKgorICogUGV0ZSBaYWl0Y2V2IDx6YWl0Y2V2QHlhaG9vLmNvbT4sIGJ6IzE2NDY4OC4KKyAqIFRoZSBkZXZpY2UgYmxhdGFudGx5IGlnbm9yZXMgTFVOIGFuZCByZXR1cm5zIDEgaW4gR2V0TWF4TFVOLgorICovCitVTlVTVUFMX0RFViggMHgwYzQ1LCAweDEwNjAsIDB4MDEwMCwgMHgwMTAwLAorCQkiVW5rbm93biIsCisJCSJVbmtub3duIiwKKwkJVVNfU0NfREVWSUNFLCBVU19QUl9ERVZJQ0UsIE5VTEwsCisJCVVTX0ZMX1NJTkdMRV9MVU4gKSwKKwogLyogU3VibWl0dGVkIGJ5OiBOaWNrIFNpbGxpayA8bi5zaWxsaWtAdGVtcGxlLmVkdT4KICAqIE5lZWRlZCBmb3IgT25lVG91Y2ggZXh0ZW5zaW9uIHRvIHVzYi1zdG9yYWdlCiAgKgpAQCAtMTQ4OSwxNiArMTQ1MSw2IEBACiAJCQkwKSwKICNlbmRpZgogCi0vKgotICogUGV0ZSBaYWl0Y2V2IDx6YWl0Y2V2QHlhaG9vLmNvbT4sIGJ6IzE2NDY4OC4KLSAqIFRoZSBkZXZpY2UgYmxhdGFudGx5IGlnbm9yZXMgTFVOIGFuZCByZXR1cm5zIDEgaW4gR2V0TWF4TFVOLgotICovCi1VTlVTVUFMX0RFViggMHgwYzQ1LCAweDEwNjAsIDB4MDEwMCwgMHgwMTAwLAotCQkiVW5rbm93biIsCi0JCSJVbmtub3duIiwKLQkJVVNfU0NfREVWSUNFLCBVU19QUl9ERVZJQ0UsIE5VTEwsCi0JCVVTX0ZMX1NJTkdMRV9MVU4gKSwKLQogLyogU3VibWl0dGVkIGJ5IEpvcmlzIFN0cnV5dmUgPGpvcmlzQHN0cnV5dmUuYmU+ICovCiBVTlVTVUFMX0RFViggMHgwZDk2LCAweDQxMGEsIDB4MDAwMSwgMHhmZmZmLAogCQkiTWVkaW9uIiwKQEAgLTE1MTYsNiArMTQ2OCwxMyBAQAogCQkiSkQgNTIwMCB6MyIsCiAJCVVTX1NDX0RFVklDRSwgVVNfUFJfREVWSUNFLCBOVUxMLCBVU19GTF9GSVhfSU5RVUlSWSksCiAKKy8qIFJlcG9ydGVkIGJ5ICBKYXNvbiBKb2huc3RvbiA8a2lsbGVhbkBzaGF3LmNhPiAqLworVU5VU1VBTF9ERVYoICAweDBkYzQsIDB4MDA3MywgMHgwMDAwLCAweDAwMDAsCisJCSJNYWNwb3dlciBUZWNobm9sb2d5IENvLkxURC4iLAorCQkiVVNCIDIuMCAzLjVcIiBERVZJQ0UiLAorCQlVU19TQ19ERVZJQ0UsIFVTX1BSX0RFVklDRSwgTlVMTCwKKwkJVVNfRkxfRklYX0NBUEFDSVRZKSwKKwogLyogUmVwb3J0ZWQgYnkgTHVib21pciBCbGFoYSA8dHJpdG9sQHRyaWxvZ2ljLmN6PgogICogSSBfUkVBTExZXyBkb24ndCBrbm93IHdoYXQgM3JkLCA0dGggbnVtYmVyIGFuZCBhbGwgZGVmaW5lcyBtZWFuLCBidXQgdGhpcwogICogd29ya3MgZm9yIG1lLiBDYW4gYW55Ym9keSBjb3JyZWN0IHRoZXNlIHZhbHVlcz8gKEkgYWJsZSB0byB0ZXN0IGNvcnJlY3RlZApAQCAtMTYzOCwxMyArMTU5Nyw2IEBACiAJCVVTX1NDX0RFVklDRSwgVVNfUFJfREVWSUNFLCBOVUxMLAogCQlVU19GTF9GSVhfQ0FQQUNJVFkgfCBVU19GTF9JR05PUkVfUkVTSURVRSApLAogCi0vKiBSZXBvcnRlZCBieSBSaWNhcmRvIEJhcmJlcmlzIDxyaWNhcmRvQGRhdHRhdGVjLmNvbT4gKi8KLVVOVVNVQUxfREVWKCAgMHgwZmNlLCAweGUwOTIsIDB4MDAwMCwgMHgwMDAwLAotCQkiU29ueSBFcmljc3NvbiIsCi0JCSJQMWkiLAotCQlVU19TQ19ERVZJQ0UsIFVTX1BSX0RFVklDRSwgTlVMTCwKLQkJVVNfRkxfSUdOT1JFX1JFU0lEVUUgKSwKLQogLyogUmVwb3J0ZWQgYnkgRW1tYW51ZWwgVmFzaWxha2lzIDxldmFzQGZvcnRobmV0LmdyPiAqLwogVU5VU1VBTF9ERVYoICAweDBmY2UsIDB4ZTAzMSwgMHgwMDAwLCAweDAwMDAsCiAJCSJTb255IEVyaWNzc29uIiwKQEAgLTE2NTIsNiArMTYwNCwxMyBAQAogCQlVU19TQ19ERVZJQ0UsIFVTX1BSX0RFVklDRSwgTlVMTCwKIAkJVVNfRkxfSUdOT1JFX1JFU0lEVUUgfCBVU19GTF9GSVhfQ0FQQUNJVFkgKSwKIAorLyogUmVwb3J0ZWQgYnkgUmljYXJkbyBCYXJiZXJpcyA8cmljYXJkb0BkYXR0YXRlYy5jb20+ICovCitVTlVTVUFMX0RFViggIDB4MGZjZSwgMHhlMDkyLCAweDAwMDAsIDB4MDAwMCwKKwkJIlNvbnkgRXJpY3Nzb24iLAorCQkiUDFpIiwKKwkJVVNfU0NfREVWSUNFLCBVU19QUl9ERVZJQ0UsIE5VTEwsCisJCVVTX0ZMX0lHTk9SRV9SRVNJRFVFICksCisKIC8qIFJlcG9ydGVkIGJ5IEtldmluIENlcm5la2VlIDxrcGMtdXNiZGV2QGdlbGF0by51aXVjLmVkdT4KICAqIFRlc3RlZCBvbiBoYXJkd2FyZSB2ZXJzaW9uIDEuMTAuCiAgKiBFbnRyeSBpcyBuZWVkZWQgb25seSBmb3IgdGhlIGluaXRpYWxpemVyIGZ1bmN0aW9uIG92ZXJyaWRlLgpAQCAtMTY2NCw2ICsxNjIzLDEyIEBACiAJCVVTX1NDX0RFVklDRSwgVVNfUFJfREVWSUNFLCB1c2Jfc3Rvcl91Y3I2MXMyYl9pbml0LAogCQkwICksCiAKK1VOVVNVQUxfREVWKCAgMHgxMDU4LCAweDA3MDQsIDB4MDAwMCwgMHg5OTk5LAorCQkiV2VzdGVybiBEaWdpdGFsIiwKKwkJIkV4dGVybmFsIEhERCIsCisJCVVTX1NDX0RFVklDRSwgVVNfUFJfREVWSUNFLCBOVUxMLAorCQlVU19GTF9TQU5FX1NFTlNFKSwKKwogLyogUmVwb3J0ZWQgYnkgRmFiaW8gVmVudHVyaSA8Zi52ZW50dXJpQHRkbmV0Lml0PgogICogVGhlIGRldmljZSByZXBvcnRzIGEgdmVuZG9yLXNwZWNpZmljIGJEZXZpY2VDbGFzcy4KICAqLwpAQCAtMjA1MywxMCArMjAxOCwxMCBAQAogICogSk1pY3JvbiByZXNwb25kcyB0byBVU04gYW5kIHNldmVyYWwgb3RoZXIgU0NTSSBpb2N0bHMgd2l0aCBhCiAgKiByZXNpZHVlIHRoYXQgY2F1c2VzIHN1YnNlcXVlbnQgSS9PIHJlcXVlc3RzIHRvIGZhaWwuICAqLwogVU5VU1VBTF9ERVYoICAweDE1MmQsIDB4MjMyOSwgMHgwMTAwLCAweDAxMDAsCi0JICAgICAgICAiSk1pY3JvbiIsCi0JICAgICAgICAiVVNCIHRvIEFUQS9BVEFQSSBCcmlkZ2UiLAotCSAgICAgICAgVVNfU0NfREVWSUNFLCBVU19QUl9ERVZJQ0UsIE5VTEwsCi0JICAgICAgICBVU19GTF9JR05PUkVfUkVTSURVRSApLAorCQkiSk1pY3JvbiIsCisJCSJVU0IgdG8gQVRBL0FUQVBJIEJyaWRnZSIsCisJCVVTX1NDX0RFVklDRSwgVVNfUFJfREVWSUNFLCBOVUxMLAorCQlVU19GTF9JR05PUkVfUkVTSURVRSB8IFVTX0ZMX1NBTkVfU0VOU0UgKSwKIAogLyogUmVwb3J0ZWQgYnkgUm9iZXJ0IFNjaGVkZWwgPHIuc2NoZWRlbEB5YWhvby5kZT4KICAqIE5vdGU6IHRoaXMgaXMgYSAnc3VwZXIgdG9wJyBkZXZpY2UgbGlrZSB0aGUgYWJvdmUgMTRjZC82NjAwIGRldmljZSAqLwpAQCAtMjA4NiwyNyArMjA1MSw2IEBACiAJCVVTX0ZMX0ZJWF9DQVBBQ0lUWSB8IFVTX0ZMX0lHTk9SRV9SRVNJRFVFICksCiAKIC8qCi0gKiBQYXRjaCBieSBQZXRlIFphaXRjZXYgPHphaXRjZXZAcmVkaGF0LmNvbT4KLSAqIFJlcG9ydCBieSBNYXJrIFBhdHRvbi4gUmVkIEhhdCBieiMyMDg5MjguCi0gKiBBZGRlZCBzdXBwb3J0IGZvciByZXYgMHgwMDAyIChNb3Rvcm9sYSBST0tSIFc1KQotICogYnkgSmF2aWVyIFNtYWxkb25lIDxqYXZpZXJAc21hbGRvbmUuY29tLmFyPgotICovCi1VTlVTVUFMX0RFViggIDB4MjJiOCwgMHg0ODEwLCAweDAwMDEsIDB4MDAwMiwKLQkJIk1vdG9yb2xhIiwKLQkJIlJBWlIgVjNpL1JPS1IgVzUiLAotCQlVU19TQ19ERVZJQ0UsIFVTX1BSX0RFVklDRSwgTlVMTCwKLQkJVVNfRkxfRklYX0NBUEFDSVRZKSwKLQotLyoKLSAqIFBhdGNoIGJ5IEpvc3QgRGllZGVyaWNocyA8am9zdEBxZHVzYS5jb20+Ci0gKi8KLVVOVVNVQUxfREVWKDB4MjJiOCwgMHg2NDEwLCAweDAwMDEsIDB4OTk5OSwKLQkJIk1vdG9yb2xhIEluYy4iLAotCQkiTW90b3JvbGEgUGhvbmUgKFJBWlJWM3h4KSIsCi0JCVVTX1NDX0RFVklDRSwgVVNfUFJfREVWSUNFLCBOVUxMLAotCQlVU19GTF9GSVhfQ0FQQUNJVFkpLAotCi0vKgogICogUGF0Y2ggYnkgQ29uc3RhbnRpbiBCYXJhbm92IDxjb25zdEB0bHRzdS5ydT4KICAqIFJlcG9ydCBieSBBbmRyZWFzIEtvZW5lY2tlLgogICogTW90b3JvbGEgUk9LUiBaNi4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdXNiLmMgYi9kcml2ZXJzL3VzYi9zdG9yYWdlL3VzYi5jCmluZGV4IDI3MDE2ZmQuLjRiZWNmNDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdXNiLmMKKysrIGIvZHJpdmVycy91c2Ivc3RvcmFnZS91c2IuYwpAQCAtNzUsOSArNzUsNiBAQAogI2lmZGVmIENPTkZJR19VU0JfU1RPUkFHRV9TRERSNTUKICNpbmNsdWRlICJzZGRyNTUuaCIKICNlbmRpZgotI2lmZGVmIENPTkZJR19VU0JfU1RPUkFHRV9EUENNCi0jaW5jbHVkZSAiZHBjbS5oIgotI2VuZGlmCiAjaWZkZWYgQ09ORklHX1VTQl9TVE9SQUdFX0ZSRUVDT00KICNpbmNsdWRlICJmcmVlY29tLmgiCiAjZW5kaWYKQEAgLTEwMyw2ICsxMDAsNyBAQAogI2luY2x1ZGUgImN5cHJlc3NfYXRhY2IuaCIKICNlbmRpZgogI2luY2x1ZGUgInNpZXJyYV9tcy5oIgorI2luY2x1ZGUgIm9wdGlvbl9tcy5oIgogCiAvKiBTb21lIGluZm9ybWF0aW9uYWwgZGF0YSAqLwogTU9EVUxFX0FVVEhPUigiTWF0dGhldyBEaGFybSA8bWRoYXJtLXVzYkBvbmUtZXllZC1hbGllbi5uZXQ+Iik7CkBAIC0xMTMsNiArMTExLDEwIEBACiBtb2R1bGVfcGFyYW0oZGVsYXlfdXNlLCB1aW50LCBTX0lSVUdPIHwgU19JV1VTUik7CiBNT0RVTEVfUEFSTV9ERVNDKGRlbGF5X3VzZSwgInNlY29uZHMgdG8gZGVsYXkgYmVmb3JlIHVzaW5nIGEgbmV3IGRldmljZSIpOwogCitzdGF0aWMgY2hhciBxdWlya3NbMTI4XTsKK21vZHVsZV9wYXJhbV9zdHJpbmcocXVpcmtzLCBxdWlya3MsIHNpemVvZihxdWlya3MpLCBTX0lSVUdPIHwgU19JV1VTUik7CitNT0RVTEVfUEFSTV9ERVNDKHF1aXJrcywgInN1cHBsZW1lbnRhbCBsaXN0IG9mIGRldmljZSBJRHMgYW5kIHRoZWlyIHF1aXJrcyIpOworCiAKIC8qCiAgKiBUaGUgZW50cmllcyBpbiB0aGlzIHRhYmxlIGNvcnJlc3BvbmQsIGxpbmUgZm9yIGxpbmUsCkBAIC0xMjYsNiArMTI4LDggQEAKIHsgVVNCX0RFVklDRV9WRVIoaWRfdmVuZG9yLCBpZF9wcm9kdWN0LCBiY2REZXZpY2VNaW4sYmNkRGV2aWNlTWF4KSwgXAogICAuZHJpdmVyX2luZm8gPSAoZmxhZ3MpfChVU0JfVVNfVFlQRV9TVE9SPDwyNCkgfQogCisjZGVmaW5lIENPTVBMSUFOVF9ERVYJVU5VU1VBTF9ERVYKKwogI2RlZmluZSBVU1VBTF9ERVYodXNlUHJvdG8sIHVzZVRyYW5zLCB1c2VUeXBlKSBcCiB7IFVTQl9JTlRFUkZBQ0VfSU5GTyhVU0JfQ0xBU1NfTUFTU19TVE9SQUdFLCB1c2VQcm90bywgdXNlVHJhbnMpLCBcCiAgIC5kcml2ZXJfaW5mbyA9IChVU0JfVVNfVFlQRV9TVE9SPDwyNCkgfQpAQCAtMTM0LDYgKzEzOCw3IEBACiAKICMJaW5jbHVkZSAidW51c3VhbF9kZXZzLmgiCiAjdW5kZWYgVU5VU1VBTF9ERVYKKyN1bmRlZiBDT01QTElBTlRfREVWCiAjdW5kZWYgVVNVQUxfREVWCiAJLyogVGVybWluYXRpbmcgZW50cnkgKi8KIAl7IH0KQEAgLTE2NCw2ICsxNjksOCBAQAogCS5pbml0RnVuY3Rpb24gPSBpbml0X2Z1bmN0aW9uLAlcCiB9CiAKKyNkZWZpbmUgQ09NUExJQU5UX0RFVglVTlVTVUFMX0RFVgorCiAjZGVmaW5lIFVTVUFMX0RFVih1c2VfcHJvdG9jb2wsIHVzZV90cmFuc3BvcnQsIHVzZV90eXBlKSBcCiB7IFwKIAkudXNlUHJvdG9jb2wgPSB1c2VfcHJvdG9jb2wsCVwKQEAgLTE3Myw2ICsxODAsNyBAQAogc3RhdGljIHN0cnVjdCB1c191bnVzdWFsX2RldiB1c191bnVzdWFsX2Rldl9saXN0W10gPSB7CiAjCWluY2x1ZGUgInVudXN1YWxfZGV2cy5oIiAKICMJdW5kZWYgVU5VU1VBTF9ERVYKKyMJdW5kZWYgQ09NUExJQU5UX0RFVgogIwl1bmRlZiBVU1VBTF9ERVYKIAogCS8qIFRlcm1pbmF0aW5nIGVudHJ5ICovCkBAIC00NjQsMTUgKzQ3Miw4NSBAQAogCQlVU19ERUJVR1AoIkkvTyBidWZmZXIgYWxsb2NhdGlvbiBmYWlsZWRcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9Ci0KLQl1cy0+c2Vuc2VidWYgPSBrbWFsbG9jKFVTX1NFTlNFX1NJWkUsIEdGUF9LRVJORUwpOwotCWlmICghdXMtPnNlbnNlYnVmKSB7Ci0JCVVTX0RFQlVHUCgiU2Vuc2UgYnVmZmVyIGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQogCXJldHVybiAwOwogfQogCisvKiBXb3JrcyBvbmx5IGZvciBkaWdpdHMgYW5kIGxldHRlcnMsIGJ1dCBzbWFsbCBhbmQgZmFzdCAqLworI2RlZmluZSBUT0xPV0VSKHgpICgoeCkgfCAweDIwKQorCisvKiBBZGp1c3QgZGV2aWNlIGZsYWdzIGJhc2VkIG9uIHRoZSAicXVpcmtzPSIgbW9kdWxlIHBhcmFtZXRlciAqLworc3RhdGljIHZvaWQgYWRqdXN0X3F1aXJrcyhzdHJ1Y3QgdXNfZGF0YSAqdXMpCit7CisJY2hhciAqcDsKKwl1MTYgdmlkID0gbGUxNl90b19jcHUodXMtPnB1c2JfZGV2LT5kZXNjcmlwdG9yLmlkVmVuZG9yKTsKKwl1MTYgcGlkID0gbGUxNl90b19jcHUodXMtPnB1c2JfZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCk7CisJdW5zaWduZWQgZiA9IDA7CisJdW5zaWduZWQgaW50IG1hc2sgPSAoVVNfRkxfU0FORV9TRU5TRSB8IFVTX0ZMX0ZJWF9DQVBBQ0lUWSB8CisJCQlVU19GTF9DQVBBQ0lUWV9IRVVSSVNUSUNTIHwgVVNfRkxfSUdOT1JFX0RFVklDRSB8CisJCQlVU19GTF9OT1RfTE9DS0FCTEUgfCBVU19GTF9NQVhfU0VDVE9SU182NCB8CisJCQlVU19GTF9DQVBBQ0lUWV9PSyB8IFVTX0ZMX0lHTk9SRV9SRVNJRFVFIHwKKwkJCVVTX0ZMX1NJTkdMRV9MVU4gfCBVU19GTF9OT19XUF9ERVRFQ1QpOworCisJcCA9IHF1aXJrczsKKwl3aGlsZSAoKnApIHsKKwkJLyogRWFjaCBlbnRyeSBjb25zaXN0cyBvZiBWSUQ6UElEOmZsYWdzICovCisJCWlmICh2aWQgPT0gc2ltcGxlX3N0cnRvdWwocCwgJnAsIDE2KSAmJgorCQkJCSpwID09ICc6JyAmJgorCQkJCXBpZCA9PSBzaW1wbGVfc3RydG91bChwKzEsICZwLCAxNikgJiYKKwkJCQkqcCA9PSAnOicpCisJCQlicmVhazsKKworCQkvKiBNb3ZlIGZvcndhcmQgdG8gdGhlIG5leHQgZW50cnkgKi8KKwkJd2hpbGUgKCpwKSB7CisJCQlpZiAoKnArKyA9PSAnLCcpCisJCQkJYnJlYWs7CisJCX0KKwl9CisJaWYgKCEqcCkJLyogTm8gbWF0Y2ggKi8KKwkJcmV0dXJuOworCisJLyogQ29sbGVjdCB0aGUgZmxhZ3MgKi8KKwl3aGlsZSAoKisrcCAmJiAqcCAhPSAnLCcpIHsKKwkJc3dpdGNoIChUT0xPV0VSKCpwKSkgeworCQljYXNlICdhJzoKKwkJCWYgfD0gVVNfRkxfU0FORV9TRU5TRTsKKwkJCWJyZWFrOworCQljYXNlICdjJzoKKwkJCWYgfD0gVVNfRkxfRklYX0NBUEFDSVRZOworCQkJYnJlYWs7CisJCWNhc2UgJ2gnOgorCQkJZiB8PSBVU19GTF9DQVBBQ0lUWV9IRVVSSVNUSUNTOworCQkJYnJlYWs7CisJCWNhc2UgJ2knOgorCQkJZiB8PSBVU19GTF9JR05PUkVfREVWSUNFOworCQkJYnJlYWs7CisJCWNhc2UgJ2wnOgorCQkJZiB8PSBVU19GTF9OT1RfTE9DS0FCTEU7CisJCQlicmVhazsKKwkJY2FzZSAnbSc6CisJCQlmIHw9IFVTX0ZMX01BWF9TRUNUT1JTXzY0OworCQkJYnJlYWs7CisJCWNhc2UgJ28nOgorCQkJZiB8PSBVU19GTF9DQVBBQ0lUWV9PSzsKKwkJCWJyZWFrOworCQljYXNlICdyJzoKKwkJCWYgfD0gVVNfRkxfSUdOT1JFX1JFU0lEVUU7CisJCQlicmVhazsKKwkJY2FzZSAncyc6CisJCQlmIHw9IFVTX0ZMX1NJTkdMRV9MVU47CisJCQlicmVhazsKKwkJY2FzZSAndyc6CisJCQlmIHw9IFVTX0ZMX05PX1dQX0RFVEVDVDsKKwkJCWJyZWFrOworCQkvKiBJZ25vcmUgdW5yZWNvZ25pemVkIGZsYWcgY2hhcmFjdGVycyAqLworCQl9CisJfQorCXVzLT5mZmxhZ3MgPSAodXMtPmZmbGFncyAmIH5tYXNrKSB8IGY7CisJZGV2X2luZm8oJnVzLT5wdXNiX2ludGYtPmRldiwgIlF1aXJrcyBtYXRjaCBmb3IgIgorCQkJInZpZCAlMDR4IHBpZCAlMDR4OiAleFxuIiwKKwkJCXZpZCwgcGlkLCBmKTsKK30KKwogLyogRmluZCBhbiB1bnVzdWFsX2RldiBkZXNjcmlwdG9yIChhbHdheXMgc3VjY2VlZHMgaW4gdGhlIGN1cnJlbnQgY29kZSkgKi8KIHN0YXRpYyBzdHJ1Y3QgdXNfdW51c3VhbF9kZXYgKmZpbmRfdW51c3VhbChjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpCiB7CkBAIC00OTcsNiArNTc1LDcgQEAKIAkJCWlkZXNjLT5iSW50ZXJmYWNlUHJvdG9jb2wgOgogCQkJdW51c3VhbF9kZXYtPnVzZVRyYW5zcG9ydDsKIAl1cy0+ZmZsYWdzID0gVVNCX1VTX09SSUdfRkxBR1MoaWQtPmRyaXZlcl9pbmZvKTsKKwlhZGp1c3RfcXVpcmtzKHVzKTsKIAogCWlmICh1cy0+ZmZsYWdzICYgVVNfRkxfSUdOT1JFX0RFVklDRSkgewogCQlwcmludGsoS0VSTl9JTkZPIFVTQl9TVE9SQUdFICJkZXZpY2UgaWdub3JlZFxuIik7CkBAIC01NjIsNyArNjQxLDcgQEAKIAogCWNhc2UgVVNfUFJfQ0JJOgogCQl1cy0+dHJhbnNwb3J0X25hbWUgPSAiQ29udHJvbC9CdWxrL0ludGVycnVwdCI7Ci0JCXVzLT50cmFuc3BvcnQgPSB1c2Jfc3Rvcl9DQklfdHJhbnNwb3J0OworCQl1cy0+dHJhbnNwb3J0ID0gdXNiX3N0b3JfQ0JfdHJhbnNwb3J0OwogCQl1cy0+dHJhbnNwb3J0X3Jlc2V0ID0gdXNiX3N0b3JfQ0JfcmVzZXQ7CiAJCXVzLT5tYXhfbHVuID0gNzsKIAkJYnJlYWs7CkBAIC02NzUsMTkgKzc1NCwxOSBAQAogCiAJY2FzZSBVU19TQ184MDIwOgogCQl1cy0+cHJvdG9jb2xfbmFtZSA9ICI4MDIwaSI7Ci0JCXVzLT5wcm90b19oYW5kbGVyID0gdXNiX3N0b3JfQVRBUElfY29tbWFuZDsKKwkJdXMtPnByb3RvX2hhbmRsZXIgPSB1c2Jfc3Rvcl9wYWQxMl9jb21tYW5kOwogCQl1cy0+bWF4X2x1biA9IDA7CiAJCWJyZWFrOwogCiAJY2FzZSBVU19TQ19RSUM6CiAJCXVzLT5wcm90b2NvbF9uYW1lID0gIlFJQy0xNTciOwotCQl1cy0+cHJvdG9faGFuZGxlciA9IHVzYl9zdG9yX3FpYzE1N19jb21tYW5kOworCQl1cy0+cHJvdG9faGFuZGxlciA9IHVzYl9zdG9yX3BhZDEyX2NvbW1hbmQ7CiAJCXVzLT5tYXhfbHVuID0gMDsKIAkJYnJlYWs7CiAKIAljYXNlIFVTX1NDXzgwNzA6CiAJCXVzLT5wcm90b2NvbF9uYW1lID0gIjgwNzBpIjsKLQkJdXMtPnByb3RvX2hhbmRsZXIgPSB1c2Jfc3Rvcl9BVEFQSV9jb21tYW5kOworCQl1cy0+cHJvdG9faGFuZGxlciA9IHVzYl9zdG9yX3BhZDEyX2NvbW1hbmQ7CiAJCXVzLT5tYXhfbHVuID0gMDsKIAkJYnJlYWs7CiAKQEAgLTg0MCw4ICs5MTksNiBAQAogewogCVVTX0RFQlVHUCgiLS0gJXNcbiIsIF9fZnVuY19fKTsKIAotCWtmcmVlKHVzLT5zZW5zZWJ1Zik7Ci0KIAkvKiBGcmVlIHRoZSBkZXZpY2UtcmVsYXRlZCBETUEtbWFwcGVkIGJ1ZmZlcnMgKi8KIAlpZiAodXMtPmNyKQogCQl1c2JfYnVmZmVyX2ZyZWUodXMtPnB1c2JfZGV2LCBzaXplb2YoKnVzLT5jciksIHVzLT5jciwKQEAgLTEwNjQsNiArMTE0MSw3IEBACiBzdGF0aWMgaW50IF9faW5pdCB1c2Jfc3Rvcl9pbml0KHZvaWQpCiB7CiAJaW50IHJldHZhbDsKKwogCXByaW50ayhLRVJOX0lORk8gIkluaXRpYWxpemluZyBVU0IgTWFzcyBTdG9yYWdlIGRyaXZlci4uLlxuIik7CiAKIAkvKiByZWdpc3RlciB0aGUgZHJpdmVyLCByZXR1cm4gdXNiX3JlZ2lzdGVyIHJldHVybiBjb2RlIGlmIGVycm9yICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zdG9yYWdlL3VzYi5oIGIvZHJpdmVycy91c2Ivc3RvcmFnZS91c2IuaAppbmRleCBhNGFkNzNiLi42NWU2NzRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zdG9yYWdlL3VzYi5oCisrKyBiL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdXNiLmgKQEAgLTEzOCw3ICsxMzgsNiBAQAogCXN0cnVjdCB1c2JfY3RybHJlcXVlc3QJKmNyOwkJIC8qIGNvbnRyb2wgcmVxdWVzdHMJICovCiAJc3RydWN0IHVzYl9zZ19yZXF1ZXN0CWN1cnJlbnRfc2c7CSAvKiBzY2F0dGVyLWdhdGhlciByZXEuICAqLwogCXVuc2lnbmVkIGNoYXIJCSppb2J1ZjsJCSAvKiBJL08gYnVmZmVyCQkgKi8KLQl1bnNpZ25lZCBjaGFyCQkqc2Vuc2VidWY7CSAvKiBzZW5zZSBkYXRhIGJ1ZmZlcgkgKi8KIAlkbWFfYWRkcl90CQljcl9kbWE7CQkgLyogYnVmZmVyIERNQSBhZGRyZXNzZXMgKi8KIAlkbWFfYWRkcl90CQlpb2J1Zl9kbWE7CiAJc3RydWN0IHRhc2tfc3RydWN0CSpjdGxfdGhyZWFkOwkgLyogdGhlIGNvbnRyb2wgdGhyZWFkICAgKi8KQEAgLTE1NSw2ICsxNTQsMTAgQEAKICNpZmRlZiBDT05GSUdfUE0KIAlwbV9ob29rCQkJc3VzcGVuZF9yZXN1bWVfaG9vazsKICNlbmRpZgorCisJLyogaGFja3MgZm9yIFJFQUQgQ0FQQUNJVFkgYnVnIGhhbmRsaW5nICovCisJaW50CQkJdXNlX2xhc3Rfc2VjdG9yX2hhY2tzOworCWludAkJCWxhc3Rfc2VjdG9yX3JldHJpZXM7CiB9OwogCiAvKiBDb252ZXJ0IGJldHdlZW4gdXNfZGF0YSBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgU2NzaV9Ib3N0ICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi93dXNiY29yZS9yaC5jIGIvZHJpdmVycy91c2Ivd3VzYmNvcmUvcmguYwppbmRleCA0MDdhOWZjLi45ZmU0MjQ2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi93dXNiY29yZS9yaC5jCisrKyBiL2RyaXZlcnMvdXNiL3d1c2Jjb3JlL3JoLmMKQEAgLTMyOSw3ICszMjksNyBAQAogc3RhdGljIGludCB3dXNiaGNfcmhfZ2V0X3BvcnRfc3RhdHVzKHN0cnVjdCB3dXNiaGMgKnd1c2JoYywgdTE2IHBvcnRfaWR4LAogCQkJCSAgICAgdTMyICpfYnVmLCB1MTYgd0xlbmd0aCkKIHsKLQl1MTYgKmJ1ZiA9ICh1MTYgKikgX2J1ZjsKKwlfX2xlMTYgKmJ1ZiA9IChfX2xlMTYgKilfYnVmOwogCiAJaWYgKHBvcnRfaWR4ID4gd3VzYmhjLT5wb3J0c19tYXgpCiAJCXJldHVybiAtRUlOVkFMOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91d2IvaTE0ODAvZGZ1L3VzYi5jIGIvZHJpdmVycy91d2IvaTE0ODAvZGZ1L3VzYi5jCmluZGV4IDY4Njc5NWUuLmM3MDgwZDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXdiL2kxNDgwL2RmdS91c2IuYworKysgYi9kcml2ZXJzL3V3Yi9pMTQ4MC9kZnUvdXNiLmMKQEAgLTM4Nyw3ICszODcsNyBAQAogCQlnb3RvIGVycm9yX2NyZWF0ZTsKIAl9CiAKLQkvKiBzZXR1cCB0aGUgZm9wcyBhbmQgdXBsb2FkIHRoZSBmaXJtYXJlICovCisJLyogc2V0dXAgdGhlIGZvcHMgYW5kIHVwbG9hZCB0aGUgZmlybXdhcmUgKi8KIAlpMTQ4MC0+cHJlX2Z3X25hbWUgPSAiaTE0ODAtcHJlLXBoeS0wLjAuYmluIjsKIAlpMTQ4MC0+bWFjX2Z3X25hbWUgPSAiaTE0ODAtdXNiLTAuMC5iaW4iOwogCWkxNDgwLT5tYWNfZndfbmFtZV9kZXByZWNhdGUgPSAicHRjLTAuMC5iaW4iOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91d2IvaTE0ODAvaTE0ODB1LXdscC9pMTQ4MHUtd2xwLmggYi9kcml2ZXJzL3V3Yi9pMTQ4MC9pMTQ4MHUtd2xwL2kxNDgwdS13bHAuaAppbmRleCA1ZjFiMjk1MS4uMzQyMWQzMyAxMDA2NDQKLS0tIGEvZHJpdmVycy91d2IvaTE0ODAvaTE0ODB1LXdscC9pMTQ4MHUtd2xwLmgKKysrIGIvZHJpdmVycy91d2IvaTE0ODAvaTE0ODB1LXdscC9pMTQ4MHUtd2xwLmgKQEAgLTIyMSw3ICsyMjEsNiBAQAogCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2OwogCiAJc3BpbmxvY2tfdCBsb2NrOwotCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOwogCiAJLyogUlggY29udGV4dCBoYW5kbGluZyAqLwogCXN0cnVjdCBza19idWZmICpyeF9za2I7CkBAIC0yNzEsNyArMjcwLDYgQEAKIGV4dGVybiBpbnQgaTE0ODB1X2hhcmRfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqLCBzdHJ1Y3QgbmV0X2RldmljZSAqKTsKIGV4dGVybiB2b2lkIGkxNDgwdV90eF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICopOwogZXh0ZXJuIGludCBpMTQ4MHVfc2V0X2NvbmZpZyhzdHJ1Y3QgbmV0X2RldmljZSAqLCBzdHJ1Y3QgaWZtYXAgKik7Ci1leHRlcm4gc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmkxNDgwdV9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKik7CiBleHRlcm4gaW50IGkxNDgwdV9jaGFuZ2VfbXR1KHN0cnVjdCBuZXRfZGV2aWNlICosIGludCk7CiBleHRlcm4gdm9pZCBpMTQ4MHVfdXdiX25vdGlmc19jYih2b2lkICosIHN0cnVjdCB1d2JfZGV2ICosIGVudW0gdXdiX25vdGlmcyk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXdiL2kxNDgwL2kxNDgwdS13bHAvbGMuYyBiL2RyaXZlcnMvdXdiL2kxNDgwL2kxNDgwdS13bHAvbGMuYwppbmRleCAwNDljMDVkLi5mMjcyZGZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3V3Yi9pMTQ4MC9pMTQ4MHUtd2xwL2xjLmMKKysrIGIvZHJpdmVycy91d2IvaTE0ODAvaTE0ODB1LXdscC9sYy5jCkBAIC0xODEsNiArMTgxLDE1IEBACiB9CiAjZW5kaWYKIAorc3RhdGljIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyBpMTQ4MHVfbmV0ZGV2X29wcyA9IHsKKwkubmRvX29wZW4JPSBpMTQ4MHVfb3BlbiwKKwkubmRvX3N0b3AgCT0gaTE0ODB1X3N0b3AsCisJLm5kb19zdGFydF94bWl0ID0gaTE0ODB1X2hhcmRfc3RhcnRfeG1pdCwKKwkubmRvX3R4X3RpbWVvdXQgPSBpMTQ4MHVfdHhfdGltZW91dCwKKwkubmRvX3NldF9jb25maWcgPSBpMTQ4MHVfc2V0X2NvbmZpZywKKwkubmRvX2NoYW5nZV9tdHUgPSBpMTQ4MHVfY2hhbmdlX210dSwKK307CisKIHN0YXRpYwogaW50IGkxNDgwdV9hZGQoc3RydWN0IGkxNDgwdSAqaTE0ODB1LCBzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaWZhY2UpCiB7CkBAIC0yMzUsMTMgKzI0NCw3IEBACiAJbmV0X2Rldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9ISUdIRE1BOwogCW5ldF9kZXYtPndhdGNoZG9nX3RpbWVvID0gNSpIWjsJCS8qIEZJWE1FOiBhIGJldHRlciBkZWZhdWx0PyAqLwogCi0JbmV0X2Rldi0+b3BlbiA9IGkxNDgwdV9vcGVuOwotCW5ldF9kZXYtPnN0b3AgPSBpMTQ4MHVfc3RvcDsKLQluZXRfZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSBpMTQ4MHVfaGFyZF9zdGFydF94bWl0OwotCW5ldF9kZXYtPnR4X3RpbWVvdXQgPSBpMTQ4MHVfdHhfdGltZW91dDsKLQluZXRfZGV2LT5nZXRfc3RhdHMgPSBpMTQ4MHVfZ2V0X3N0YXRzOwotCW5ldF9kZXYtPnNldF9jb25maWcgPSBpMTQ4MHVfc2V0X2NvbmZpZzsKLQluZXRfZGV2LT5jaGFuZ2VfbXR1ID0gaTE0ODB1X2NoYW5nZV9tdHU7CisJbmV0X2Rldi0+bmV0ZGV2X29wcyA9ICZpMTQ4MHVfbmV0ZGV2X29wczsKIAogI2lmZGVmIGkxNDgwdV9GTE9XX0NPTlRST0wKIAkvKiBOb3RpZmljYXRpb24gZW5kcG9pbnQgc2V0dXAgKHN1Ym1pdHRlZCB3aGVuIHdlIG9wZW4gdGhlIGRldmljZSkgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXdiL2kxNDgwL2kxNDgwdS13bHAvbmV0ZGV2LmMgYi9kcml2ZXJzL3V3Yi9pMTQ4MC9pMTQ4MHUtd2xwL25ldGRldi5jCmluZGV4IGUzODczZmYuLjczMDU1NTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXdiL2kxNDgwL2kxNDgwdS13bHAvbmV0ZGV2LmMKKysrIGIvZHJpdmVycy91d2IvaTE0ODAvaTE0ODB1LXdscC9uZXRkZXYuYwpAQCAtMjYyLDE1ICsyNjIsNiBAQAogCXJldHVybiAwOwogfQogCi0KLS8qKiBSZXBvcnQgc3RhdGlzdGljcyAqLwotc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmkxNDgwdV9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYpCi17Ci0Jc3RydWN0IGkxNDgwdSAqaTE0ODB1ID0gbmV0ZGV2X3ByaXYobmV0X2Rldik7Ci0JcmV0dXJuICZpMTQ4MHUtPnN0YXRzOwotfQotCi0KIC8qKgogICoKICAqIENoYW5nZSB0aGUgaW50ZXJmYWNlIGNvbmZpZy0td2UgcHJvYmFibHkgZG9uJ3QgaGF2ZSB0byBkbyBhbnl0aGluZy4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXdiL2kxNDgwL2kxNDgwdS13bHAvcnguYyBiL2RyaXZlcnMvdXdiL2kxNDgwL2kxNDgwdS13bHAvcnguYwppbmRleCAzNGY0Y2Y5Li4yNWEyNzU4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3V3Yi9pMTQ4MC9pMTQ4MHUtd2xwL3J4LmMKKysrIGIvZHJpdmVycy91d2IvaTE0ODAvaTE0ODB1LXdscC9yeC5jCkBAIC0xNjcsNyArMTY3LDcgQEAKIGRvIHsJCQkJCQkJXAogCWlmIChwcmludGtfcmF0ZWxpbWl0KCkpCQkJCVwKIAkJZGV2X2VycigmaTE0ODB1LT51c2JfaWZhY2UtPmRldiwgbXNnKTsJXAotCWkxNDgwdS0+c3RhdHMucnhfZHJvcHBlZCsrOwkJCVwKKwlpMTQ4MHUtPm5ldF9kZXYtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsJCQlcCiB9IHdoaWxlICgwKQogCiAKQEAgLTE5MywxMCArMTkzLDggQEAKIAlpZiAoIXNob3VsZF9wYXJzZSkKIAkJZ290byBvdXQ7CiAJaTE0ODB1LT5yeF9za2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoaTE0ODB1LT5yeF9za2IsIG5ldF9kZXYpOwotCWkxNDgwdS0+c3RhdHMucnhfcGFja2V0cysrOwotCWkxNDgwdS0+c3RhdHMucnhfYnl0ZXMgKz0gaTE0ODB1LT5yeF91bnRkX3BrdF9zaXplOwotCW5ldF9kZXYtPmxhc3RfcnggPSBqaWZmaWVzOwotCS8qIEZJWE1FOiBmbG93IGNvbnRyb2w6IGNoZWNrIG5ldGlmX3J4KCkgcmV0dmFsICovCisJbmV0X2Rldi0+c3RhdHMucnhfcGFja2V0cysrOworCW5ldF9kZXYtPnN0YXRzLnJ4X2J5dGVzICs9IGkxNDgwdS0+cnhfdW50ZF9wa3Rfc2l6ZTsKIAogCW5ldGlmX3J4KGkxNDgwdS0+cnhfc2tiKTsJCS8qIGRlbGl2ZXIgKi8KIG91dDoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXdiL2kxNDgwL2kxNDgwdS13bHAvdHguYyBiL2RyaXZlcnMvdXdiL2kxNDgwL2kxNDgwdS13bHAvdHguYwppbmRleCAzOTAzMmNjLi4yNmJhY2MwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3V3Yi9pMTQ4MC9pMTQ4MHUtd2xwL3R4LmMKKysrIGIvZHJpdmVycy91d2IvaTE0ODAvaTE0ODB1LXdscC90eC5jCkBAIC0xMTcsOCArMTE3LDggQEAKIAlzd2l0Y2ggKHVyYi0+c3RhdHVzKSB7CiAJY2FzZSAwOgogCQlzcGluX2xvY2tfaXJxc2F2ZSgmaTE0ODB1LT5sb2NrLCBmbGFncyk7Ci0JCWkxNDgwdS0+c3RhdHMudHhfcGFja2V0cysrOwotCQlpMTQ4MHUtPnN0YXRzLnR4X2J5dGVzICs9IHVyYi0+YWN0dWFsX2xlbmd0aDsKKwkJbmV0X2Rldi0+c3RhdHMudHhfcGFja2V0cysrOworCQluZXRfZGV2LT5zdGF0cy50eF9ieXRlcyArPSB1cmItPmFjdHVhbF9sZW5ndGg7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmkxNDgwdS0+bG9jaywgZmxhZ3MpOwogCQlicmVhazsKIAljYXNlIC1FQ09OTlJFU0VUOgkvKiBOb3QgYW4gZXJyb3IsIGJ1dCBhIGNvbnRyb2xsZWQgc2l0dWF0aW9uOyAqLwpAQCAtNTMwLDcgKzUzMCw3IEBACiAJcmV0dXJuIE5FVERFVl9UWF9PSzsKIGVycm9yOgogCWRldl9rZnJlZV9za2JfYW55KHNrYik7Ci0JaTE0ODB1LT5zdGF0cy50eF9kcm9wcGVkKys7CisJbmV0X2Rldi0+c3RhdHMudHhfZHJvcHBlZCsrOwogb3V0OgogCXJldHVybiBORVRERVZfVFhfT0s7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL01ha2VmaWxlIGIvZHJpdmVycy92aWRlby9NYWtlZmlsZQppbmRleCBlMzllMzNlLi5iZTJiNjU3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvdmlkZW8vTWFrZWZpbGUKQEAgLTI4LDcgKzI4LDcgQEAKIG9iai0kKENPTkZJR19GQl9ERUZFUlJFRF9JTykgICArPSBmYl9kZWZpby5vCiAKICMgSGFyZHdhcmUgc3BlY2lmaWMgZHJpdmVycyBnbyBmaXJzdAotb2JqLSQoQ09ORklHX0ZCX0FNSUdBKSAgICAgICAgICAgICs9IGFtaWZiLm8gYzJwLm8KK29iai0kKENPTkZJR19GQl9BTUlHQSkgICAgICAgICAgICArPSBhbWlmYi5vIGMycF9wbGFuYXIubwogb2JqLSQoQ09ORklHX0ZCX0FSQykgICAgICAgICAgICAgICs9IGFyY2ZiLm8KIG9iai0kKENPTkZJR19GQl9DTFBTNzExWCkgICAgICAgICArPSBjbHBzNzExeGZiLm8KIG9iai0kKENPTkZJR19GQl9DWUJFUjIwMDApICAgICAgICArPSBjeWJlcjIwMDBmYi5vCkBAIC03Miw3ICs3Miw3IEBACiBvYmotJChDT05GSUdfRkJfTEVPKSAgICAgICAgICAgICAgKz0gbGVvLm8gc2J1c2xpYi5vCiBvYmotJChDT05GSUdfRkJfU0dJVlcpICAgICAgICAgICAgKz0gc2dpdndmYi5vCiBvYmotJChDT05GSUdfRkJfQUNPUk4pICAgICAgICAgICAgKz0gYWNvcm5mYi5vCi1vYmotJChDT05GSUdfRkJfQVRBUkkpICAgICAgICAgICAgKz0gYXRhZmIubyBjMnAubyBhdGFmYl9tZmIubyBcCitvYmotJChDT05GSUdfRkJfQVRBUkkpICAgICAgICAgICAgKz0gYXRhZmIubyBjMnBfaXBsYW4yLm8gYXRhZmJfbWZiLm8gXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0YWZiX2lwbGFuMnAyLm8gYXRhZmJfaXBsYW4ycDQubyBhdGFmYl9pcGxhbjJwOC5vCiBvYmotJChDT05GSUdfRkJfTUFDKSAgICAgICAgICAgICAgKz0gbWFjZmIubwogb2JqLSQoQ09ORklHX0ZCX0hFQ1VCQSkgICAgICAgICAgICs9IGhlY3ViYWZiLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vYW1iYS1jbGNkLmMgYi9kcml2ZXJzL3ZpZGVvL2FtYmEtY2xjZC5jCmluZGV4IDJhYzUyZmQuLjRlMDQ2ZmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vYW1iYS1jbGNkLmMKKysrIGIvZHJpdmVycy92aWRlby9hbWJhLWNsY2QuYwpAQCAtMjQsNiArMjQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2FtYmEvYnVzLmg+CiAjaW5jbHVkZSA8bGludXgvYW1iYS9jbGNkLmg+CiAjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvaGFyZGlycS5oPgogCiAjaW5jbHVkZSA8YXNtL3NpemVzLmg+CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vYW1pZmIuYyBiL2RyaXZlcnMvdmlkZW8vYW1pZmIuYwppbmRleCBiOGU5YTg2Li4xMDBmMjM2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2FtaWZiLmMKKysrIGIvZHJpdmVycy92aWRlby9hbWlmYi5jCkBAIC0yMTU5LDkgKzIxNTksOSBAQAogCQkJc3JjICs9IHBpdGNoOwogCQl9CiAJfSBlbHNlIHsKLQkJYzJwKGluZm8tPnNjcmVlbl9iYXNlLCBpbWFnZS0+ZGF0YSwgZHgsIGR5LCB3aWR0aCwgaGVpZ2h0LAotCQkgICAgcGFyLT5uZXh0X2xpbmUsIHBhci0+bmV4dF9wbGFuZSwgaW1hZ2UtPndpZHRoLAotCQkgICAgaW5mby0+dmFyLmJpdHNfcGVyX3BpeGVsKTsKKwkJYzJwX3BsYW5hcihpbmZvLT5zY3JlZW5fYmFzZSwgaW1hZ2UtPmRhdGEsIGR4LCBkeSwgd2lkdGgsCisJCQkgICBoZWlnaHQsIHBhci0+bmV4dF9saW5lLCBwYXItPm5leHRfcGxhbmUsCisJCQkgICBpbWFnZS0+d2lkdGgsIGluZm8tPnZhci5iaXRzX3Blcl9waXhlbCk7CiAJfQogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2F0YWZiLmMgYi9kcml2ZXJzL3ZpZGVvL2F0YWZiLmMKaW5kZXggNzdlYjhiMy4uODA1ODU3MiAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9hdGFmYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vYXRhZmIuYwpAQCAtMTIyLDcgKzEyMiw2IEBACiAJdm9pZCAqc2NyZWVuX2Jhc2U7CiAJaW50IHlyZXNfdmlydHVhbDsKIAl1X2xvbmcgbmV4dF9saW5lOwotCXVfbG9uZyBuZXh0X3BsYW5lOwogI2lmIGRlZmluZWQgQVRBRkJfVFQgfHwgZGVmaW5lZCBBVEFGQl9TVEUKIAl1bmlvbiB7CiAJCXN0cnVjdCB7CkBAIC0xNDksNiArMTQ4LDcgQEAKIAkJCXNob3J0IG1vbm87CiAJCQlzaG9ydCBzdGVfbW9kZTsKIAkJCXNob3J0IGJwcDsKKwkJCXUzMiBwc2V1ZG9fcGFsZXR0ZVsxNl07CiAJCX0gZmFsY29uOwogI2VuZGlmCiAJCS8qIE5vdGhpbmcgbmVlZGVkIGZvciBleHRlcm5hbCBtb2RlICovCkBAIC02MTQsNyArNjE0LDcgQEAKIAlmaXgtPnhwYW5zdGVwID0gMDsKIAlmaXgtPnlwYW5zdGVwID0gMTsKIAlmaXgtPnl3cmFwc3RlcCA9IDA7Ci0JZml4LT5saW5lX2xlbmd0aCA9IDA7CisJZml4LT5saW5lX2xlbmd0aCA9IHBhci0+bmV4dF9saW5lOwogCWZpeC0+YWNjZWwgPSBGQl9BQ0NFTF9BVEFSSUJMSVRUOwogCXJldHVybiAwOwogfQpAQCAtNjkxLDYgKzY5MSw3IEBACiAJCXJldHVybiAtRUlOVkFMOwogCXBhci0+eXJlc192aXJ0dWFsID0geXJlc192aXJ0dWFsOwogCXBhci0+c2NyZWVuX2Jhc2UgPSBzY3JlZW5fYmFzZSArIHZhci0+eW9mZnNldCAqIGxpbmVsZW47CisJcGFyLT5uZXh0X2xpbmUgPSBsaW5lbGVuOwogCXJldHVybiAwOwogfQogCkBAIC04ODQsMTAgKzg4NSw2IEBACiAvKiBEZWZhdWx0IGhzeW5jIHRpbWluZyBbbW9uX3R5cGVdIGluIHBpY29zZWNvbmRzICovCiBzdGF0aWMgbG9uZyBoX3N5bmNzWzRdID0geyAzMDAwMDAwLCA0ODc1MDAwLCA0MDAwMDAwLCA0ODc1MDAwIH07CiAKLSNpZmRlZiBGQkNPTl9IQVNfQ0ZCMTYKLXN0YXRpYyB1MTYgZmJjb25fY2ZiMTZfY21hcFsxNl07Ci0jZW5kaWYKLQogc3RhdGljIGlubGluZSBpbnQgaHh4X3ByZXNjYWxlKHN0cnVjdCBmYWxjb25faHcgKmh3KQogewogCXJldHVybiBody0+c3RlX21vZGUgPyAxNgpAQCAtOTE4LDcgKzkxNSw3IEBACiAJCWZpeC0+dmlzdWFsID0gRkJfVklTVUFMX1RSVUVDT0xPUjsKIAkJZml4LT54cGFuc3RlcCA9IDI7CiAJfQotCWZpeC0+bGluZV9sZW5ndGggPSAwOworCWZpeC0+bGluZV9sZW5ndGggPSBwYXItPm5leHRfbGluZTsKIAlmaXgtPmFjY2VsID0gRkJfQUNDRUxfQVRBUklCTElUVDsKIAlyZXR1cm4gMDsKIH0KQEAgLTEzOTQsMTQgKzEzOTEsNyBAQAogCXBhci0+c2NyZWVuX2Jhc2UgPSBzY3JlZW5fYmFzZSArIHZhci0+eW9mZnNldCAqIGxpbmVsZW47CiAJcGFyLT5ody5mYWxjb24ueG9mZnNldCA9IDA7CiAKLQkvLyBGSVhNRSEhISBzb3J0IG9mIHdvcmtzLCBubyBjcmFzaAotCS8vcGFyLT5uZXh0X2xpbmUgPSBsaW5lbGVuOwotCS8vcGFyLT5uZXh0X3BsYW5lID0geXJlc192aXJ0dWFsICogbGluZWxlbjsKIAlwYXItPm5leHRfbGluZSA9IGxpbmVsZW47Ci0JcGFyLT5uZXh0X3BsYW5lID0gMjsKLQkvLyBjcmFzaGVzCi0JLy9wYXItPm5leHRfcGxhbmUgPSBsaW5lbGVuOwotCS8vcGFyLT5uZXh0X2xpbmUgID0geXJlc192aXJ0dWFsICogbGluZWxlbjsKIAogCXJldHVybiAwOwogfQpAQCAtMTczNSwxMCArMTcyNSwxMCBAQAogCQkJKCgocmVkICYgMHhlMDAwKSA+PiAxMykgfCAoKHJlZCAmIDB4MTAwMCkgPj4gMTIpIDw8IDgpIHwKIAkJCSgoKGdyZWVuICYgMHhlMDAwKSA+PiAxMykgfCAoKGdyZWVuICYgMHgxMDAwKSA+PiAxMikgPDwgNCkgfAogCQkJKChibHVlICYgMHhlMDAwKSA+PiAxMykgfCAoKGJsdWUgJiAweDEwMDApID4+IDEyKTsKLSNpZmRlZiBGQkNPTl9IQVNfQ0ZCMTYKLQkJZmJjb25fY2ZiMTZfY21hcFtyZWdub10gPSAoKHJlZCAmIDB4ZjgwMCkgfAotCQkJCQkgICAoKGdyZWVuICYgMHhmYzAwKSA+PiA1KSB8Ci0JCQkJCSAgICgoYmx1ZSAmIDB4ZjgwMCkgPj4gMTEpKTsKKyNpZmRlZiBBVEFGQl9GQUxDT04KKwkJKCh1MzIgKilpbmZvLT5wc2V1ZG9fcGFsZXR0ZSlbcmVnbm9dID0gKChyZWQgJiAweGY4MDApIHwKKwkJCQkJCSAgICAgICAoKGdyZWVuICYgMHhmYzAwKSA+PiA1KSB8CisJCQkJCQkgICAgICAgKChibHVlICYgMHhmODAwKSA+PiAxMSkpOwogI2VuZGlmCiAJfQogCXJldHVybiAwOwpAQCAtMTg1Miw3ICsxODQyLDcgQEAKIAkJZml4LT55cGFuc3RlcCA9IDA7CiAJfQogCWZpeC0+eXdyYXBzdGVwID0gMDsKLQlmaXgtPmxpbmVfbGVuZ3RoID0gMDsKKwlmaXgtPmxpbmVfbGVuZ3RoID0gcGFyLT5uZXh0X2xpbmU7CiAJZml4LT5hY2NlbCA9IEZCX0FDQ0VMX0FUQVJJQkxJVFQ7CiAJcmV0dXJuIDA7CiB9CkBAIC0xOTEwLDYgKzE5MDAsNyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAlwYXItPnlyZXNfdmlydHVhbCA9IHlyZXNfdmlydHVhbDsKIAlwYXItPnNjcmVlbl9iYXNlID0gc2NyZWVuX2Jhc2UgKyB2YXItPnlvZmZzZXQgKiBsaW5lbGVuOworCXBhci0+bmV4dF9saW5lID0gbGluZWxlbjsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMjE2OSw3ICsyMTYwLDcgQEAKIAlmaXgtPnhwYW5zdGVwID0gMDsKIAlmaXgtPnlwYW5zdGVwID0gMDsKIAlmaXgtPnl3cmFwc3RlcCA9IDA7Ci0JZml4LT5saW5lX2xlbmd0aCA9IDA7CisJZml4LT5saW5lX2xlbmd0aCA9IHBhci0+bmV4dF9saW5lOwogCXJldHVybiAwOwogfQogCkBAIC0yMTg0LDYgKzIxNzUsOCBAQAogCSAgICB2YXItPnhvZmZzZXQgPiAwIHx8CiAJICAgIHZhci0+eW9mZnNldCA+IDApCiAJCXJldHVybiAtRUlOVkFMOworCisJcGFyLT5uZXh0X2xpbmUgPSBleHRlcm5hbF94cmVzX3ZpcnR1YWwgKiBleHRlcm5hbF9kZXB0aCAvIDg7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTI0NDMsNDIgKzI0MzYsNiBAQAogCWF0YWZiX2dldF9maXgoJmluZm8tPmZpeCwgaW5mbyk7CiAKIAlpbmZvLT5zY3JlZW5fYmFzZSA9ICh2b2lkICopaW5mby0+Zml4LnNtZW1fc3RhcnQ7Ci0KLQlzd2l0Y2ggKGluZm8tPmZpeC50eXBlKSB7Ci0JY2FzZSBGQl9UWVBFX0lOVEVSTEVBVkVEX1BMQU5FUzoKLQkJc3dpdGNoIChpbmZvLT52YXIuYml0c19wZXJfcGl4ZWwpIHsKLQkJY2FzZSAyOgotCQkJLy8gZGlzcGxheS0+ZGlzcHN3ID0gJmZiY29uX2lwbGFuMnAyOwotCQkJYnJlYWs7Ci0JCWNhc2UgNDoKLQkJCS8vIGRpc3BsYXktPmRpc3BzdyA9ICZmYmNvbl9pcGxhbjJwNDsKLQkJCWJyZWFrOwotCQljYXNlIDg6Ci0JCQkvLyBkaXNwbGF5LT5kaXNwc3cgPSAmZmJjb25faXBsYW4ycDg7Ci0JCQlicmVhazsKLQkJfQotCQlicmVhazsKLQljYXNlIEZCX1RZUEVfUEFDS0VEX1BJWEVMUzoKLQkJc3dpdGNoIChpbmZvLT52YXIuYml0c19wZXJfcGl4ZWwpIHsKLSNpZmRlZiBGQkNPTl9IQVNfTUZCCi0JCWNhc2UgMToKLQkJCS8vIGRpc3BsYXktPmRpc3BzdyA9ICZmYmNvbl9tZmI7Ci0JCQlicmVhazsKLSNlbmRpZgotI2lmZGVmIEZCQ09OX0hBU19DRkI4Ci0JCWNhc2UgODoKLQkJCS8vIGRpc3BsYXktPmRpc3BzdyA9ICZmYmNvbl9jZmI4OwotCQkJYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBGQkNPTl9IQVNfQ0ZCMTYKLQkJY2FzZSAxNjoKLQkJCS8vIGRpc3BsYXktPmRpc3BzdyA9ICZmYmNvbl9jZmIxNjsKLQkJCS8vIGRpc3BsYXktPmRpc3Bzd19kYXRhID0gZmJjb25fY2ZiMTZfY21hcDsKLQkJCWJyZWFrOwotI2VuZGlmCi0JCX0KLQkJYnJlYWs7Ci0JfQogfQogCiBzdGF0aWMgaW50IGF0YWZiX3NldGNvbHJlZyh1X2ludCByZWdubywgdV9pbnQgcmVkLCB1X2ludCBncmVlbiwgdV9pbnQgYmx1ZSwKQEAgLTI1NDksNiArMjUwNiwxMyBAQAogCWlmICghcmVjdC0+d2lkdGggfHwgIXJlY3QtPmhlaWdodCkKIAkJcmV0dXJuOwogCisjaWZkZWYgQVRBRkJfRkFMQ09OCisJaWYgKGluZm8tPnZhci5iaXRzX3Blcl9waXhlbCA9PSAxNikgeworCQljZmJfZmlsbHJlY3QoaW5mbywgcmVjdCk7CisJCXJldHVybjsKKwl9CisjZW5kaWYKKwogCS8qCiAJICogV2UgY291bGQgdXNlIGhhcmR3YXJlIGNsaXBwaW5nIGJ1dCBvbiBtYW55IGNhcmRzIHlvdSBnZXQgYXJvdW5kCiAJICogaGFyZHdhcmUgY2xpcHBpbmcgYnkgd3JpdGluZyB0byBmcmFtZWJ1ZmZlciBkaXJlY3RseS4KQEAgLTI1ODMsNiArMjU0NywxMyBAQAogCXUzMiBkeCwgZHksIHN4LCBzeSwgd2lkdGgsIGhlaWdodDsKIAlpbnQgcmV2X2NvcHkgPSAwOwogCisjaWZkZWYgQVRBRkJfRkFMQ09OCisJaWYgKGluZm8tPnZhci5iaXRzX3Blcl9waXhlbCA9PSAxNikgeworCQljZmJfY29weWFyZWEoaW5mbywgYXJlYSk7CisJCXJldHVybjsKKwl9CisjZW5kaWYKKwogCS8qIGNsaXAgdGhlIGRlc3RpbmF0aW9uICovCiAJeDIgPSBhcmVhLT5keCArIGFyZWEtPndpZHRoOwogCXkyID0gYXJlYS0+ZHkgKyBhcmVhLT5oZWlnaHQ7CkBAIC0yNjMyLDYgKzI2MDMsMTMgQEAKIAljb25zdCBjaGFyICpzcmM7CiAJdTMyIGR4LCBkeSwgd2lkdGgsIGhlaWdodCwgcGl0Y2g7CiAKKyNpZmRlZiBBVEFGQl9GQUxDT04KKwlpZiAoaW5mby0+dmFyLmJpdHNfcGVyX3BpeGVsID09IDE2KSB7CisJCWNmYl9pbWFnZWJsaXQoaW5mbywgaW1hZ2UpOworCQlyZXR1cm47CisJfQorI2VuZGlmCisKIAkvKgogCSAqIFdlIGNvdWxkIHVzZSBoYXJkd2FyZSBjbGlwcGluZyBidXQgb24gbWFueSBjYXJkcyB5b3UgZ2V0IGFyb3VuZAogCSAqIGhhcmR3YXJlIGNsaXBwaW5nIGJ5IHdyaXRpbmcgdG8gZnJhbWVidWZmZXIgZGlyZWN0bHkgbGlrZSB3ZSBhcmUKQEAgLTI2NzYsMTAgKzI2NTQsOSBAQAogCQkJc3JjICs9IHBpdGNoOwogCQl9CiAJfSBlbHNlIHsKLQkJLy8gb25seSB1c2VkIGZvciBsb2dvOyBicm9rZW4KLQkJYzJwKGluZm8tPnNjcmVlbl9iYXNlLCBpbWFnZS0+ZGF0YSwgZHgsIGR5LCB3aWR0aCwgaGVpZ2h0LAotCQkgICAgcGFyLT5uZXh0X2xpbmUsIHBhci0+bmV4dF9wbGFuZSwgaW1hZ2UtPndpZHRoLAotCQkgICAgaW5mby0+dmFyLmJpdHNfcGVyX3BpeGVsKTsKKwkJYzJwX2lwbGFuMihpbmZvLT5zY3JlZW5fYmFzZSwgaW1hZ2UtPmRhdGEsIGR4LCBkeSwgd2lkdGgsCisJCQkgICBoZWlnaHQsIHBhci0+bmV4dF9saW5lLCBpbWFnZS0+d2lkdGgsCisJCQkgICBpbmZvLT52YXIuYml0c19wZXJfcGl4ZWwpOwogCX0KIH0KIApAQCAtMzA5OCw4ICszMDc1LDcgQEAKIAogaW50IF9faW5pdCBhdGFmYl9pbml0KHZvaWQpCiB7Ci0JaW50IHBhZDsKLQlpbnQgZGV0ZWN0ZWRfbW9kZTsKKwlpbnQgcGFkLCBkZXRlY3RlZF9tb2RlLCBlcnJvcjsKIAl1bnNpZ25lZCBpbnQgZGVmbW9kZSA9IDA7CiAJdW5zaWduZWQgbG9uZyBtZW1fcmVxOwogCkBAIC0zMTM5LDggKzMxMTUsMTIgQEAKIAkJCXByaW50aygiYXRhZmJfaW5pdDogaW5pdGlhbGl6aW5nIEZhbGNvbiBod1xuIik7CiAJCQlmYmh3ID0gJmZhbGNvbl9zd2l0Y2g7CiAJCQlhdGFmYl9vcHMuZmJfc2V0Y29scmVnID0gJmZhbGNvbl9zZXRjb2xyZWc7Ci0JCQlyZXF1ZXN0X2lycShJUlFfQVVUT180LCBmYWxjb25fdmJsX3N3aXRjaGVyLCBJUlFfVFlQRV9QUklPLAotCQkJICAgICAgICAgICAgImZyYW1lYnVmZmVyL21vZGVzd2l0Y2giLCBmYWxjb25fdmJsX3N3aXRjaGVyKTsKKwkJCWVycm9yID0gcmVxdWVzdF9pcnEoSVJRX0FVVE9fNCwgZmFsY29uX3ZibF9zd2l0Y2hlciwKKwkJCQkJICAgIElSUV9UWVBFX1BSSU8sCisJCQkJCSAgICAiZnJhbWVidWZmZXIvbW9kZXN3aXRjaCIsCisJCQkJCSAgICBmYWxjb25fdmJsX3N3aXRjaGVyKTsKKwkJCWlmIChlcnJvcikKKwkJCQlyZXR1cm4gZXJyb3I7CiAJCQlkZWZtb2RlID0gREVGTU9ERV9GMzA7CiAJCQlicmVhazsKIAkJfQpAQCAtMzIyNSw2ICszMjA1LDEwIEBACiAJLy8gdHJpZXMgdG8gcmVhZCBmcm9tIEhXIHdoaWNoIG1heSBub3QgYmUgaW5pdGlhbGl6ZWQgeWV0CiAJLy8gc28gc2V0IHNhbmUgdmFyIGZpcnN0LCB0aGVuIGNhbGwgYXRhZmJfc2V0X3BhcgogCWF0YWZiX2dldF92YXIoJmZiX2luZm8udmFyLCAmZmJfaW5mbyk7CisKKyNpZmRlZiBBVEFGQl9GQUxDT04KKwlmYl9pbmZvLnBzZXVkb19wYWxldHRlID0gY3VycmVudF9wYXIuaHcuZmFsY29uLnBzZXVkb19wYWxldHRlOworI2VuZGlmCiAJZmJfaW5mby5mbGFncyA9IEZCSU5GT19GTEFHX0RFRkFVTFQ7CiAKIAlpZiAoIWZiX2ZpbmRfbW9kZSgmZmJfaW5mby52YXIsICZmYl9pbmZvLCBtb2RlX29wdGlvbiwgYXRhZmJfbW9kZWRiLApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvS2NvbmZpZyBiL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L0tjb25maWcKaW5kZXggNGE0ZGQ5YS4uNzJmYWNiOSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvS2NvbmZpZworKysgYi9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9LY29uZmlnCkBAIC01MiwxMSArNTIsMTEgQEAKIAkgIHRoZW4gc2F5IHkgdG8gaW5jbHVkZSBhIHBvd2VyIGRyaXZlciBmb3IgaXQuCiAKIGNvbmZpZyBMQ0RfVERPMjRNCi0JdHJpc3RhdGUgIlRvcHBvbHkgVERPMjRNIExDRCBQYW5lbHMgc3VwcG9ydCIKKwl0cmlzdGF0ZSAiVG9wcG9seSBURE8yNE0gIGFuZCBURE8zNVMgTENEIFBhbmVscyBzdXBwb3J0IgogCWRlcGVuZHMgb24gTENEX0NMQVNTX0RFVklDRSAmJiBTUElfTUFTVEVSCiAJZGVmYXVsdCBuCiAJaGVscAotCSAgSWYgeW91IGhhdmUgYSBUb3Bwb2x5IFRETzI0TSBzZXJpZXMgTENEIHBhbmVsLCBzYXkgeSBoZXJlIHRvCisJICBJZiB5b3UgaGF2ZSBhIFRvcHBvbHkgVERPMjRNL1RETzM1UyBzZXJpZXMgTENEIHBhbmVsLCBzYXkgeSBoZXJlIHRvCiAJICBpbmNsdWRlIHRoZSBzdXBwb3J0IGZvciBpdC4KIAogY29uZmlnIExDRF9WR0cyNDMyQTQKQEAgLTEyMywxNyArMTIzLDE0IEBACiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlIHdpbGwgYmUKIAkgIGNhbGxlZCBhdG1lbC1wd20tYmwuCiAKLWNvbmZpZyBCQUNLTElHSFRfQ09SR0kKLQl0cmlzdGF0ZSAiR2VuZXJpYyAoYWthIFNoYXJwIENvcmdpKSBCYWNrbGlnaHQgRHJpdmVyIChERVBSRUNBVEVEKSIKK2NvbmZpZyBCQUNLTElHSFRfR0VORVJJQworCXRyaXN0YXRlICJHZW5lcmljIChha2EgU2hhcnAgQ29yZ2kpIEJhY2tsaWdodCBEcml2ZXIiCiAJZGVwZW5kcyBvbiBCQUNLTElHSFRfQ0xBU1NfREVWSUNFCi0JZGVmYXVsdCBuCisJZGVmYXVsdCB5CiAJaGVscAogCSAgU2F5IHkgdG8gZW5hYmxlIHRoZSBnZW5lcmljIHBsYXRmb3JtIGJhY2tsaWdodCBkcml2ZXIgcHJldmlvdXNseQogCSAga25vd24gYXMgdGhlIENvcmdpIGJhY2tsaWdodCBkcml2ZXIuIElmIHlvdSBoYXZlIGEgU2hhcnAgWmF1cnVzCi0JICBTTC1DN3h4LCBTTC1DeHgwMCBvciBTTC02MDAweCBzYXkgeS4gTW9zdCB1c2VycyBjYW4gc2F5IG4uCi0KLQkgIE5vdGU6IHRoaXMgZHJpdmVyIGlzIG1hcmtlZCBhcyBkZXByZWNhdGVkLCB0cnkgZW5hYmxlIFNQSSBhbmQKLQkgIHVzZSB0aGUgbmV3IGNvcmdpX2xjZCBkcml2ZXIgd2l0aCBpbnRlZ3JhdGVkIGJhY2tsaWdodCBjb250cm9sCisJICBTTC1DN3h4LCBTTC1DeHgwMCBvciBTTC02MDAweCBzYXkgeS4KIAogY29uZmlnIEJBQ0tMSUdIVF9MT0NPTU8KIAl0cmlzdGF0ZSAiU2hhcnAgTE9DT01PIExDRC9CYWNrbGlnaHQgRHJpdmVyIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvTWFrZWZpbGUgYi9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9NYWtlZmlsZQppbmRleCAxMDM0MjdkLi4zNjNiM2NiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9NYWtlZmlsZQpAQCAtMTEsNyArMTEsNyBAQAogCiBvYmotJChDT05GSUdfQkFDS0xJR0hUX0NMQVNTX0RFVklDRSkgKz0gYmFja2xpZ2h0Lm8KIG9iai0kKENPTkZJR19CQUNLTElHSFRfQVRNRUxfUFdNKSAgICArPSBhdG1lbC1wd20tYmwubwotb2JqLSQoQ09ORklHX0JBQ0tMSUdIVF9DT1JHSSkJKz0gY29yZ2lfYmwubworb2JqLSQoQ09ORklHX0JBQ0tMSUdIVF9HRU5FUklDKQkrPSBnZW5lcmljX2JsLm8KIG9iai0kKENPTkZJR19CQUNLTElHSFRfSFA2ODApCSs9IGhwNjgwX2JsLm8KIG9iai0kKENPTkZJR19CQUNLTElHSFRfTE9DT01PKQkrPSBsb2NvbW9sY2Qubwogb2JqLSQoQ09ORklHX0JBQ0tMSUdIVF9PTUFQMSkJKz0gb21hcDFfYmwubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvYmFja2xpZ2h0LmMgYi9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9iYWNrbGlnaHQuYwppbmRleCAwNjY0ZmMwLi4xNTcwNTdjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9iYWNrbGlnaHQuYworKysgYi9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9iYWNrbGlnaHQuYwpAQCAtNDAsNiArNDAsMTAgQEAKIAkJaWYgKCFiZC0+b3BzLT5jaGVja19mYiB8fAogCQkgICAgYmQtPm9wcy0+Y2hlY2tfZmIoZXZkYXRhLT5pbmZvKSkgewogCQkJYmQtPnByb3BzLmZiX2JsYW5rID0gKihpbnQgKilldmRhdGEtPmRhdGE7CisJCQlpZiAoYmQtPnByb3BzLmZiX2JsYW5rID09IEZCX0JMQU5LX1VOQkxBTkspCisJCQkJYmQtPnByb3BzLnN0YXRlICY9IH5CTF9DT1JFX0ZCQkxBTks7CisJCQllbHNlCisJCQkJYmQtPnByb3BzLnN0YXRlIHw9IEJMX0NPUkVfRkJCTEFOSzsKIAkJCWJhY2tsaWdodF91cGRhdGVfc3RhdHVzKGJkKTsKIAkJfQogCW11dGV4X3VubG9jaygmYmQtPm9wc19sb2NrKTsKQEAgLTgwLDIwICs4NCwxOCBAQAogc3RhdGljIHNzaXplX3QgYmFja2xpZ2h0X3N0b3JlX3Bvd2VyKHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQogewotCWludCByYyA9IC1FTlhJTzsKLQljaGFyICplbmRwOworCWludCByYzsKIAlzdHJ1Y3QgYmFja2xpZ2h0X2RldmljZSAqYmQgPSB0b19iYWNrbGlnaHRfZGV2aWNlKGRldik7Ci0JaW50IHBvd2VyID0gc2ltcGxlX3N0cnRvdWwoYnVmLCAmZW5kcCwgMCk7Ci0Jc2l6ZV90IHNpemUgPSBlbmRwIC0gYnVmOworCXVuc2lnbmVkIGxvbmcgcG93ZXI7CiAKLQlpZiAoKmVuZHAgJiYgaXNzcGFjZSgqZW5kcCkpCi0JCXNpemUrKzsKLQlpZiAoc2l6ZSAhPSBjb3VudCkKLQkJcmV0dXJuIC1FSU5WQUw7CisJcmMgPSBzdHJpY3Rfc3RydG91bChidWYsIDAsICZwb3dlcik7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CiAKKwlyYyA9IC1FTlhJTzsKIAltdXRleF9sb2NrKCZiZC0+b3BzX2xvY2spOwogCWlmIChiZC0+b3BzKSB7Ci0JCXByX2RlYnVnKCJiYWNrbGlnaHQ6IHNldCBwb3dlciB0byAlZFxuIiwgcG93ZXIpOworCQlwcl9kZWJ1ZygiYmFja2xpZ2h0OiBzZXQgcG93ZXIgdG8gJWx1XG4iLCBwb3dlcik7CiAJCWlmIChiZC0+cHJvcHMucG93ZXIgIT0gcG93ZXIpIHsKIAkJCWJkLT5wcm9wcy5wb3dlciA9IHBvd2VyOwogCQkJYmFja2xpZ2h0X3VwZGF0ZV9zdGF0dXMoYmQpOwpAQCAtMTE2LDI4ICsxMTgsMjUgQEAKIHN0YXRpYyBzc2l6ZV90IGJhY2tsaWdodF9zdG9yZV9icmlnaHRuZXNzKHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQogewotCWludCByYyA9IC1FTlhJTzsKLQljaGFyICplbmRwOworCWludCByYzsKIAlzdHJ1Y3QgYmFja2xpZ2h0X2RldmljZSAqYmQgPSB0b19iYWNrbGlnaHRfZGV2aWNlKGRldik7Ci0JaW50IGJyaWdodG5lc3MgPSBzaW1wbGVfc3RydG91bChidWYsICZlbmRwLCAwKTsKLQlzaXplX3Qgc2l6ZSA9IGVuZHAgLSBidWY7CisJdW5zaWduZWQgbG9uZyBicmlnaHRuZXNzOwogCi0JaWYgKCplbmRwICYmIGlzc3BhY2UoKmVuZHApKQotCQlzaXplKys7Ci0JaWYgKHNpemUgIT0gY291bnQpCi0JCXJldHVybiAtRUlOVkFMOworCXJjID0gc3RyaWN0X3N0cnRvdWwoYnVmLCAwLCAmYnJpZ2h0bmVzcyk7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwlyYyA9IC1FTlhJTzsKIAogCW11dGV4X2xvY2soJmJkLT5vcHNfbG9jayk7CiAJaWYgKGJkLT5vcHMpIHsKIAkJaWYgKGJyaWdodG5lc3MgPiBiZC0+cHJvcHMubWF4X2JyaWdodG5lc3MpCiAJCQlyYyA9IC1FSU5WQUw7CiAJCWVsc2UgewotCQkJcHJfZGVidWcoImJhY2tsaWdodDogc2V0IGJyaWdodG5lc3MgdG8gJWRcbiIsCisJCQlwcl9kZWJ1ZygiYmFja2xpZ2h0OiBzZXQgYnJpZ2h0bmVzcyB0byAlbHVcbiIsCiAJCQkJIGJyaWdodG5lc3MpOwotCQkJaWYgKGJkLT5wcm9wcy5icmlnaHRuZXNzICE9IGJyaWdodG5lc3MpIHsKLQkJCQliZC0+cHJvcHMuYnJpZ2h0bmVzcyA9IGJyaWdodG5lc3M7Ci0JCQkJYmFja2xpZ2h0X3VwZGF0ZV9zdGF0dXMoYmQpOwotCQkJfQorCQkJYmQtPnByb3BzLmJyaWdodG5lc3MgPSBicmlnaHRuZXNzOworCQkJYmFja2xpZ2h0X3VwZGF0ZV9zdGF0dXMoYmQpOwogCQkJcmMgPSBjb3VudDsKIAkJfQogCX0KQEAgLTE3MCw2ICsxNjksMzQgQEAKIAogc3RhdGljIHN0cnVjdCBjbGFzcyAqYmFja2xpZ2h0X2NsYXNzOwogCitzdGF0aWMgaW50IGJhY2tsaWdodF9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQoreworCXN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICpiZCA9IHRvX2JhY2tsaWdodF9kZXZpY2UoZGV2KTsKKworCWlmIChiZC0+b3BzLT5vcHRpb25zICYgQkxfQ09SRV9TVVNQRU5EUkVTVU1FKSB7CisJCW11dGV4X2xvY2soJmJkLT5vcHNfbG9jayk7CisJCWJkLT5wcm9wcy5zdGF0ZSB8PSBCTF9DT1JFX1NVU1BFTkRFRDsKKwkJYmFja2xpZ2h0X3VwZGF0ZV9zdGF0dXMoYmQpOworCQltdXRleF91bmxvY2soJmJkLT5vcHNfbG9jayk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYmFja2xpZ2h0X3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGJhY2tsaWdodF9kZXZpY2UgKmJkID0gdG9fYmFja2xpZ2h0X2RldmljZShkZXYpOworCisJaWYgKGJkLT5vcHMtPm9wdGlvbnMgJiBCTF9DT1JFX1NVU1BFTkRSRVNVTUUpIHsKKwkJbXV0ZXhfbG9jaygmYmQtPm9wc19sb2NrKTsKKwkJYmQtPnByb3BzLnN0YXRlICY9IH5CTF9DT1JFX1NVU1BFTkRFRDsKKwkJYmFja2xpZ2h0X3VwZGF0ZV9zdGF0dXMoYmQpOworCQltdXRleF91bmxvY2soJmJkLT5vcHNfbG9jayk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyB2b2lkIGJsX2RldmljZV9yZWxlYXNlKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgYmFja2xpZ2h0X2RldmljZSAqYmQgPSB0b19iYWNrbGlnaHRfZGV2aWNlKGRldik7CkBAIC0yODYsNiArMzEzLDggQEAKIAl9CiAKIAliYWNrbGlnaHRfY2xhc3MtPmRldl9hdHRycyA9IGJsX2RldmljZV9hdHRyaWJ1dGVzOworCWJhY2tsaWdodF9jbGFzcy0+c3VzcGVuZCA9IGJhY2tsaWdodF9zdXNwZW5kOworCWJhY2tsaWdodF9jbGFzcy0+cmVzdW1lID0gYmFja2xpZ2h0X3Jlc3VtZTsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvY29yZ2lfYmwuYyBiL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L2NvcmdpX2JsLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkNGQwMzcuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvY29yZ2lfYmwuYworKysgL2Rldi9udWxsCkBAIC0xLDE2OSArMCwwIEBACi0vKgotICogIEJhY2tsaWdodCBEcml2ZXIgZm9yIFNoYXJwIFphdXJ1cyBIYW5kaGVsZHMgKHZhcmlvdXMgbW9kZWxzKQotICoKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiBSaWNoYXJkIFB1cmRpZQotICoKLSAqICBCYXNlZCBvbiBTaGFycCdzIDIuNCBCYWNrbGlnaHQgRHJpdmVyCi0gKgotICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgotI2luY2x1ZGUgPGxpbnV4L2ZiLmg+Ci0jaW5jbHVkZSA8bGludXgvYmFja2xpZ2h0Lmg+Ci0KLXN0YXRpYyBpbnQgY29yZ2libF9pbnRlbnNpdHk7Ci1zdGF0aWMgc3RydWN0IGJhY2tsaWdodF9wcm9wZXJ0aWVzIGNvcmdpYmxfZGF0YTsKLXN0YXRpYyBzdHJ1Y3QgYmFja2xpZ2h0X2RldmljZSAqY29yZ2lfYmFja2xpZ2h0X2RldmljZTsKLXN0YXRpYyBzdHJ1Y3QgZ2VuZXJpY19ibF9pbmZvICpibF9tYWNoaW5mbzsKLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgY29yZ2libF9mbGFnczsKLSNkZWZpbmUgQ09SR0lCTF9TVVNQRU5ERUQgICAgIDB4MDEKLSNkZWZpbmUgQ09SR0lCTF9CQVRUTE9XICAgICAgIDB4MDIKLQotc3RhdGljIGludCBjb3JnaWJsX3NlbmRfaW50ZW5zaXR5KHN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICpiZCkKLXsKLQlpbnQgaW50ZW5zaXR5ID0gYmQtPnByb3BzLmJyaWdodG5lc3M7Ci0KLQlpZiAoYmQtPnByb3BzLnBvd2VyICE9IEZCX0JMQU5LX1VOQkxBTkspCi0JCWludGVuc2l0eSA9IDA7Ci0JaWYgKGJkLT5wcm9wcy5mYl9ibGFuayAhPSBGQl9CTEFOS19VTkJMQU5LKQotCQlpbnRlbnNpdHkgPSAwOwotCWlmIChjb3JnaWJsX2ZsYWdzICYgQ09SR0lCTF9TVVNQRU5ERUQpCi0JCWludGVuc2l0eSA9IDA7Ci0JaWYgKGNvcmdpYmxfZmxhZ3MgJiBDT1JHSUJMX0JBVFRMT1cpCi0JCWludGVuc2l0eSAmPSBibF9tYWNoaW5mby0+bGltaXRfbWFzazsKLQotCWJsX21hY2hpbmZvLT5zZXRfYmxfaW50ZW5zaXR5KGludGVuc2l0eSk7Ci0KLQljb3JnaWJsX2ludGVuc2l0eSA9IGludGVuc2l0eTsKLQotCWlmIChibF9tYWNoaW5mby0+a2lja19iYXR0ZXJ5KQotCQlibF9tYWNoaW5mby0+a2lja19iYXR0ZXJ5KCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotI2lmZGVmIENPTkZJR19QTQotc3RhdGljIGludCBjb3JnaWJsX3N1c3BlbmQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQotewotCXN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICpiZCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwotCi0JY29yZ2libF9mbGFncyB8PSBDT1JHSUJMX1NVU1BFTkRFRDsKLQliYWNrbGlnaHRfdXBkYXRlX3N0YXR1cyhiZCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgY29yZ2libF9yZXN1bWUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlzdHJ1Y3QgYmFja2xpZ2h0X2RldmljZSAqYmQgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQotCWNvcmdpYmxfZmxhZ3MgJj0gfkNPUkdJQkxfU1VTUEVOREVEOwotCWJhY2tsaWdodF91cGRhdGVfc3RhdHVzKGJkKTsKLQlyZXR1cm4gMDsKLX0KLSNlbHNlCi0jZGVmaW5lIGNvcmdpYmxfc3VzcGVuZAlOVUxMCi0jZGVmaW5lIGNvcmdpYmxfcmVzdW1lCU5VTEwKLSNlbmRpZgotCi1zdGF0aWMgaW50IGNvcmdpYmxfZ2V0X2ludGVuc2l0eShzdHJ1Y3QgYmFja2xpZ2h0X2RldmljZSAqYmQpCi17Ci0JcmV0dXJuIGNvcmdpYmxfaW50ZW5zaXR5OwotfQotCi0vKgotICogQ2FsbGVkIHdoZW4gdGhlIGJhdHRlcnkgaXMgbG93IHRvIGxpbWl0IHRoZSBiYWNrbGlnaHQgaW50ZW5zaXR5LgotICogSWYgbGltaXQ9PTAgY2xlYXIgYW55IGxpbWl0LCBvdGhlcndpc2UgbGltaXQgdGhlIGludGVuc2l0eQotICovCi12b2lkIGNvcmdpYmxfbGltaXRfaW50ZW5zaXR5KGludCBsaW1pdCkKLXsKLQlpZiAobGltaXQpCi0JCWNvcmdpYmxfZmxhZ3MgfD0gQ09SR0lCTF9CQVRUTE9XOwotCWVsc2UKLQkJY29yZ2libF9mbGFncyAmPSB+Q09SR0lCTF9CQVRUTE9XOwotCWJhY2tsaWdodF91cGRhdGVfc3RhdHVzKGNvcmdpX2JhY2tsaWdodF9kZXZpY2UpOwotfQotRVhQT1JUX1NZTUJPTChjb3JnaWJsX2xpbWl0X2ludGVuc2l0eSk7Ci0KLQotc3RhdGljIHN0cnVjdCBiYWNrbGlnaHRfb3BzIGNvcmdpYmxfb3BzID0gewotCS5nZXRfYnJpZ2h0bmVzcyA9IGNvcmdpYmxfZ2V0X2ludGVuc2l0eSwKLQkudXBkYXRlX3N0YXR1cyAgPSBjb3JnaWJsX3NlbmRfaW50ZW5zaXR5LAotfTsKLQotc3RhdGljIGludCBjb3JnaWJsX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0Jc3RydWN0IGdlbmVyaWNfYmxfaW5mbyAqbWFjaGluZm8gPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKLQljb25zdCBjaGFyICpuYW1lID0gImdlbmVyaWMtYmwiOwotCi0JYmxfbWFjaGluZm8gPSBtYWNoaW5mbzsKLQlpZiAoIW1hY2hpbmZvLT5saW1pdF9tYXNrKQotCQltYWNoaW5mby0+bGltaXRfbWFzayA9IC0xOwotCi0JaWYgKG1hY2hpbmZvLT5uYW1lKQotCQluYW1lID0gbWFjaGluZm8tPm5hbWU7Ci0KLQljb3JnaV9iYWNrbGlnaHRfZGV2aWNlID0gYmFja2xpZ2h0X2RldmljZV9yZWdpc3RlciAobmFtZSwKLQkJJnBkZXYtPmRldiwgTlVMTCwgJmNvcmdpYmxfb3BzKTsKLQlpZiAoSVNfRVJSIChjb3JnaV9iYWNrbGlnaHRfZGV2aWNlKSkKLQkJcmV0dXJuIFBUUl9FUlIgKGNvcmdpX2JhY2tsaWdodF9kZXZpY2UpOwotCi0JcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgY29yZ2lfYmFja2xpZ2h0X2RldmljZSk7Ci0KLQljb3JnaV9iYWNrbGlnaHRfZGV2aWNlLT5wcm9wcy5tYXhfYnJpZ2h0bmVzcyA9IG1hY2hpbmZvLT5tYXhfaW50ZW5zaXR5OwotCWNvcmdpX2JhY2tsaWdodF9kZXZpY2UtPnByb3BzLnBvd2VyID0gRkJfQkxBTktfVU5CTEFOSzsKLQljb3JnaV9iYWNrbGlnaHRfZGV2aWNlLT5wcm9wcy5icmlnaHRuZXNzID0gbWFjaGluZm8tPmRlZmF1bHRfaW50ZW5zaXR5OwotCWJhY2tsaWdodF91cGRhdGVfc3RhdHVzKGNvcmdpX2JhY2tsaWdodF9kZXZpY2UpOwotCi0JcHJpbnRrKCJDb3JnaSBCYWNrbGlnaHQgRHJpdmVyIEluaXRpYWxpemVkLlxuIik7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgY29yZ2libF9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlzdHJ1Y3QgYmFja2xpZ2h0X2RldmljZSAqYmQgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQotCWNvcmdpYmxfZGF0YS5wb3dlciA9IDA7Ci0JY29yZ2libF9kYXRhLmJyaWdodG5lc3MgPSAwOwotCWJhY2tsaWdodF91cGRhdGVfc3RhdHVzKGJkKTsKLQotCWJhY2tsaWdodF9kZXZpY2VfdW5yZWdpc3RlcihiZCk7Ci0KLQlwcmludGsoIkNvcmdpIEJhY2tsaWdodCBEcml2ZXIgVW5sb2FkZWRcbiIpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBjb3JnaWJsX2RyaXZlciA9IHsKLQkucHJvYmUJCT0gY29yZ2libF9wcm9iZSwKLQkucmVtb3ZlCQk9IGNvcmdpYmxfcmVtb3ZlLAotCS5zdXNwZW5kCT0gY29yZ2libF9zdXNwZW5kLAotCS5yZXN1bWUJCT0gY29yZ2libF9yZXN1bWUsCi0JLmRyaXZlcgkJPSB7Ci0JCS5uYW1lCT0gImdlbmVyaWMtYmwiLAotCX0sCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBjb3JnaWJsX2luaXQodm9pZCkKLXsKLQlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZjb3JnaWJsX2RyaXZlcik7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBjb3JnaWJsX2V4aXQodm9pZCkKLXsKLQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmY29yZ2libF9kcml2ZXIpOwotfQotCi1tb2R1bGVfaW5pdChjb3JnaWJsX2luaXQpOwotbW9kdWxlX2V4aXQoY29yZ2libF9leGl0KTsKLQotTU9EVUxFX0FVVEhPUigiUmljaGFyZCBQdXJkaWUgPHJwdXJkaWVAcnBzeXMubmV0PiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJDb3JnaSBCYWNrbGlnaHQgRHJpdmVyIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9jcl9ibGxjZC5jIGIvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvY3JfYmxsY2QuYwppbmRleCAyNmFkZDg4Li5iOWZlNjJiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9jcl9ibGxjZC5jCisrKyBiL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L2NyX2JsbGNkLmMKQEAgLTI1OSwyMiArMjU5LDE4IEBACiB7CiAJaW50IHJldCA9IHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmY3JfYmFja2xpZ2h0X2RyaXZlcik7CiAKLQlpZiAoIXJldCkgewotCQljcnAgPSBwbGF0Zm9ybV9kZXZpY2VfYWxsb2MoImNyX2JhY2tsaWdodCIsIC0xKTsKLQkJaWYgKCFjcnApCi0JCQlyZXR1cm4gLUVOT01FTTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OwogCi0JCXJldCA9IHBsYXRmb3JtX2RldmljZV9hZGQoY3JwKTsKLQotCQlpZiAocmV0KSB7Ci0JCQlwbGF0Zm9ybV9kZXZpY2VfcHV0KGNycCk7Ci0JCQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmY3JfYmFja2xpZ2h0X2RyaXZlcik7Ci0JCX0KKwljcnAgPSBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXJfc2ltcGxlKCJjcl9iYWNrbGlnaHQiLCAtMSwgTlVMTCwgMCk7CisJaWYgKElTX0VSUihjcnApKSB7CisJCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZjcl9iYWNrbGlnaHRfZHJpdmVyKTsKKwkJcmV0dXJuIFBUUl9FUlIoY3JwKTsKIAl9CiAKIAlwcmludGsoIkNhcmlsbG8gUmFuY2ggQmFja2xpZ2h0IERyaXZlciBJbml0aWFsaXplZC5cbiIpOwogCi0JcmV0dXJuIHJldDsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IGNyX2JhY2tsaWdodF9leGl0KHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9nZW5lcmljX2JsLmMgYi9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9nZW5lcmljX2JsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQyN2Y2MgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L2dlbmVyaWNfYmwuYwpAQCAtMCwwICsxLDE0NyBAQAorLyoKKyAqICBHZW5lcmljIEJhY2tsaWdodCBEcml2ZXIKKyAqCisgKiAgQ29weXJpZ2h0IChjKSAyMDA0LTIwMDggUmljaGFyZCBQdXJkaWUKKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvZmIuaD4KKyNpbmNsdWRlIDxsaW51eC9iYWNrbGlnaHQuaD4KKworc3RhdGljIGludCBnZW5lcmljYmxfaW50ZW5zaXR5Oworc3RhdGljIHN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICpnZW5lcmljX2JhY2tsaWdodF9kZXZpY2U7CitzdGF0aWMgc3RydWN0IGdlbmVyaWNfYmxfaW5mbyAqYmxfbWFjaGluZm87CisKKy8qIEZsYWcgdG8gc2lnbmFsIHdoZW4gdGhlIGJhdHRlcnkgaXMgbG93ICovCisjZGVmaW5lIEdFTkVSSUNCTF9CQVRUTE9XICAgICAgIEJMX0NPUkVfRFJJVkVSMQorCitzdGF0aWMgaW50IGdlbmVyaWNibF9zZW5kX2ludGVuc2l0eShzdHJ1Y3QgYmFja2xpZ2h0X2RldmljZSAqYmQpCit7CisJaW50IGludGVuc2l0eSA9IGJkLT5wcm9wcy5icmlnaHRuZXNzOworCisJaWYgKGJkLT5wcm9wcy5wb3dlciAhPSBGQl9CTEFOS19VTkJMQU5LKQorCQlpbnRlbnNpdHkgPSAwOworCWlmIChiZC0+cHJvcHMuc3RhdGUgJiBCTF9DT1JFX0ZCQkxBTkspCisJCWludGVuc2l0eSA9IDA7CisJaWYgKGJkLT5wcm9wcy5zdGF0ZSAmIEJMX0NPUkVfU1VTUEVOREVEKQorCQlpbnRlbnNpdHkgPSAwOworCWlmIChiZC0+cHJvcHMuc3RhdGUgJiBHRU5FUklDQkxfQkFUVExPVykKKwkJaW50ZW5zaXR5ICY9IGJsX21hY2hpbmZvLT5saW1pdF9tYXNrOworCisJYmxfbWFjaGluZm8tPnNldF9ibF9pbnRlbnNpdHkoaW50ZW5zaXR5KTsKKworCWdlbmVyaWNibF9pbnRlbnNpdHkgPSBpbnRlbnNpdHk7CisKKwlpZiAoYmxfbWFjaGluZm8tPmtpY2tfYmF0dGVyeSkKKwkJYmxfbWFjaGluZm8tPmtpY2tfYmF0dGVyeSgpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2VuZXJpY2JsX2dldF9pbnRlbnNpdHkoc3RydWN0IGJhY2tsaWdodF9kZXZpY2UgKmJkKQoreworCXJldHVybiBnZW5lcmljYmxfaW50ZW5zaXR5OworfQorCisvKgorICogQ2FsbGVkIHdoZW4gdGhlIGJhdHRlcnkgaXMgbG93IHRvIGxpbWl0IHRoZSBiYWNrbGlnaHQgaW50ZW5zaXR5LgorICogSWYgbGltaXQ9PTAgY2xlYXIgYW55IGxpbWl0LCBvdGhlcndpc2UgbGltaXQgdGhlIGludGVuc2l0eQorICovCit2b2lkIGNvcmdpYmxfbGltaXRfaW50ZW5zaXR5KGludCBsaW1pdCkKK3sKKwlzdHJ1Y3QgYmFja2xpZ2h0X2RldmljZSAqYmQgPSBnZW5lcmljX2JhY2tsaWdodF9kZXZpY2U7CisKKwltdXRleF9sb2NrKCZiZC0+b3BzX2xvY2spOworCWlmIChsaW1pdCkKKwkJYmQtPnByb3BzLnN0YXRlIHw9IEdFTkVSSUNCTF9CQVRUTE9XOworCWVsc2UKKwkJYmQtPnByb3BzLnN0YXRlICY9IH5HRU5FUklDQkxfQkFUVExPVzsKKwliYWNrbGlnaHRfdXBkYXRlX3N0YXR1cyhnZW5lcmljX2JhY2tsaWdodF9kZXZpY2UpOworCW11dGV4X3VubG9jaygmYmQtPm9wc19sb2NrKTsKK30KK0VYUE9SVF9TWU1CT0woY29yZ2libF9saW1pdF9pbnRlbnNpdHkpOworCitzdGF0aWMgc3RydWN0IGJhY2tsaWdodF9vcHMgZ2VuZXJpY2JsX29wcyA9IHsKKwkub3B0aW9ucyA9IEJMX0NPUkVfU1VTUEVORFJFU1VNRSwKKwkuZ2V0X2JyaWdodG5lc3MgPSBnZW5lcmljYmxfZ2V0X2ludGVuc2l0eSwKKwkudXBkYXRlX3N0YXR1cyAgPSBnZW5lcmljYmxfc2VuZF9pbnRlbnNpdHksCit9OworCitzdGF0aWMgaW50IGdlbmVyaWNibF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBnZW5lcmljX2JsX2luZm8gKm1hY2hpbmZvID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJY29uc3QgY2hhciAqbmFtZSA9ICJnZW5lcmljLWJsIjsKKwlzdHJ1Y3QgYmFja2xpZ2h0X2RldmljZSAqYmQ7CisKKwlibF9tYWNoaW5mbyA9IG1hY2hpbmZvOworCWlmICghbWFjaGluZm8tPmxpbWl0X21hc2spCisJCW1hY2hpbmZvLT5saW1pdF9tYXNrID0gLTE7CisKKwlpZiAobWFjaGluZm8tPm5hbWUpCisJCW5hbWUgPSBtYWNoaW5mby0+bmFtZTsKKworCWJkID0gYmFja2xpZ2h0X2RldmljZV9yZWdpc3RlciAobmFtZSwKKwkJJnBkZXYtPmRldiwgTlVMTCwgJmdlbmVyaWNibF9vcHMpOworCWlmIChJU19FUlIgKGJkKSkKKwkJcmV0dXJuIFBUUl9FUlIgKGJkKTsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGJkKTsKKworCWJkLT5wcm9wcy5tYXhfYnJpZ2h0bmVzcyA9IG1hY2hpbmZvLT5tYXhfaW50ZW5zaXR5OworCWJkLT5wcm9wcy5wb3dlciA9IEZCX0JMQU5LX1VOQkxBTks7CisJYmQtPnByb3BzLmJyaWdodG5lc3MgPSBtYWNoaW5mby0+ZGVmYXVsdF9pbnRlbnNpdHk7CisJYmFja2xpZ2h0X3VwZGF0ZV9zdGF0dXMoYmQpOworCisJZ2VuZXJpY19iYWNrbGlnaHRfZGV2aWNlID0gYmQ7CisKKwlwcmludGsoIkdlbmVyaWMgQmFja2xpZ2h0IERyaXZlciBJbml0aWFsaXplZC5cbiIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdlbmVyaWNibF9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgYmFja2xpZ2h0X2RldmljZSAqYmQgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCWJkLT5wcm9wcy5wb3dlciA9IDA7CisJYmQtPnByb3BzLmJyaWdodG5lc3MgPSAwOworCWJhY2tsaWdodF91cGRhdGVfc3RhdHVzKGJkKTsKKworCWJhY2tsaWdodF9kZXZpY2VfdW5yZWdpc3RlcihiZCk7CisKKwlwcmludGsoIkdlbmVyaWMgQmFja2xpZ2h0IERyaXZlciBVbmxvYWRlZFxuIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGdlbmVyaWNibF9kcml2ZXIgPSB7CisJLnByb2JlCQk9IGdlbmVyaWNibF9wcm9iZSwKKwkucmVtb3ZlCQk9IGdlbmVyaWNibF9yZW1vdmUsCisJLmRyaXZlcgkJPSB7CisJCS5uYW1lCT0gImdlbmVyaWMtYmwiLAorCX0sCit9OworCitzdGF0aWMgaW50IF9faW5pdCBnZW5lcmljYmxfaW5pdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmdlbmVyaWNibF9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZ2VuZXJpY2JsX2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmZ2VuZXJpY2JsX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGdlbmVyaWNibF9pbml0KTsKK21vZHVsZV9leGl0KGdlbmVyaWNibF9leGl0KTsKKworTU9EVUxFX0FVVEhPUigiUmljaGFyZCBQdXJkaWUgPHJwdXJkaWVAcnBzeXMubmV0PiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJHZW5lcmljIEJhY2tsaWdodCBEcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L2hwNjgwX2JsLmMgYi9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9ocDY4MF9ibC5jCmluZGV4IGQ0Y2ZlZDAuLjViZTU1YTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L2hwNjgwX2JsLmMKKysrIGIvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvaHA2ODBfYmwuYwpAQCAtMTUxLDE5ICsxNTEsMTUgQEAKIAlpbnQgcmV0OwogCiAJcmV0ID0gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZocDY4MGJsX2RyaXZlcik7Ci0JaWYgKCFyZXQpIHsKLQkJaHA2ODBibF9kZXZpY2UgPSBwbGF0Zm9ybV9kZXZpY2VfYWxsb2MoImhwNjgwLWJsIiwgLTEpOwotCQlpZiAoIWhwNjgwYmxfZGV2aWNlKQotCQkJcmV0dXJuIC1FTk9NRU07Ci0KLQkJcmV0ID0gcGxhdGZvcm1fZGV2aWNlX2FkZChocDY4MGJsX2RldmljZSk7Ci0KLQkJaWYgKHJldCkgewotCQkJcGxhdGZvcm1fZGV2aWNlX3B1dChocDY4MGJsX2RldmljZSk7Ci0JCQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmaHA2ODBibF9kcml2ZXIpOwotCQl9CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwlocDY4MGJsX2RldmljZSA9IHBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcl9zaW1wbGUoImhwNjgwLWJsIiwgLTEsCisJCQkJCQkJTlVMTCwgMCk7CisJaWYgKElTX0VSUihocDY4MGJsX2RldmljZSkpIHsKKwkJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmhwNjgwYmxfZHJpdmVyKTsKKwkJcmV0dXJuIFBUUl9FUlIoaHA2ODBibF9kZXZpY2UpOwogCX0KLQlyZXR1cm4gcmV0OworCXJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgaHA2ODBibF9leGl0KHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9tYnBfbnZpZGlhX2JsLmMgYi9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9tYnBfbnZpZGlhX2JsLmMKaW5kZXggMDY5NjRhZi4uNjU4NjRjNSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvbWJwX252aWRpYV9ibC5jCisrKyBiL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L21icF9udmlkaWFfYmwuYwpAQCAtNzAsNiArNzAsNyBAQAogfQogCiBzdGF0aWMgc3RydWN0IGJhY2tsaWdodF9vcHMgbWJwX29wcyA9IHsKKwkub3B0aW9ucyA9IEJMX0NPUkVfU1VTUEVORFJFU1VNRSwKIAkuZ2V0X2JyaWdodG5lc3MgPSBtYnBfZ2V0X2ludGVuc2l0eSwKIAkudXBkYXRlX3N0YXR1cyAgPSBtYnBfc2VuZF9pbnRlbnNpdHksCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvcHJvZ2Vhcl9ibC5jIGIvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvcHJvZ2Vhcl9ibC5jCmluZGV4IDE1ZmI0ZDU4Li45ZWRhZjI0ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvcHJvZ2Vhcl9ibC5jCisrKyBiL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L3Byb2dlYXJfYmwuYwpAQCAtMTE5LDIwICsxMTksMTYgQEAKIHsKIAlpbnQgcmV0ID0gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZwcm9nZWFyYmxfZHJpdmVyKTsKIAotCWlmICghcmV0KSB7Ci0JCXByb2dlYXJibF9kZXZpY2UgPSBwbGF0Zm9ybV9kZXZpY2VfYWxsb2MoInByb2dlYXItYmwiLCAtMSk7Ci0JCWlmICghcHJvZ2VhcmJsX2RldmljZSkKLQkJCXJldHVybiAtRU5PTUVNOwotCi0JCXJldCA9IHBsYXRmb3JtX2RldmljZV9hZGQocHJvZ2VhcmJsX2RldmljZSk7Ci0KLQkJaWYgKHJldCkgewotCQkJcGxhdGZvcm1fZGV2aWNlX3B1dChwcm9nZWFyYmxfZGV2aWNlKTsKLQkJCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZwcm9nZWFyYmxfZHJpdmVyKTsKLQkJfQorCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisJcHJvZ2VhcmJsX2RldmljZSA9IHBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcl9zaW1wbGUoInByb2dlYXItYmwiLCAtMSwKKwkJCQkJCQkJTlVMTCwgMCk7CisJaWYgKElTX0VSUihwcm9nZWFyYmxfZGV2aWNlKSkgeworCQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmcHJvZ2VhcmJsX2RyaXZlcik7CisJCXJldHVybiBQVFJfRVJSKHByb2dlYXJibF9kZXZpY2UpOwogCX0KIAotCXJldHVybiByZXQ7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBwcm9nZWFyYmxfZXhpdCh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvdGRvMjRtLmMgYi9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC90ZG8yNG0uYwppbmRleCA4NDI3NjY5Li4xZGFlN2Y4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC90ZG8yNG0uYworKysgYi9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC90ZG8yNG0uYwpAQCAtMTQsNiArMTQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CisjaW5jbHVkZSA8bGludXgvc3BpL3RkbzI0bS5oPgogI2luY2x1ZGUgPGxpbnV4L2ZiLmg+CiAjaW5jbHVkZSA8bGludXgvbGNkLmg+CiAKQEAgLTMxLDYgKzMyLDkgQEAKIAlzdHJ1Y3Qgc3BpX3RyYW5zZmVyCXhmZXI7CiAJdWludDhfdAkJCSpidWY7CiAKKwlpbnQgKCphZGpfbW9kZSkoc3RydWN0IHRkbzI0bSAqbGNkLCBpbnQgbW9kZSk7CisJaW50IGNvbG9yX2ludmVydDsKKwogCWludAkJCXBvd2VyOwogCWludAkJCW1vZGU7CiB9OwpAQCAtNjYsNyArNzAsNyBAQAogCUNNRF9OVUxMLAogfTsKIAotc3RhdGljIHVpbnQzMl90IGxjZF92Z2FfcGFzc190aHJvdWdoW10gPSB7CitzdGF0aWMgdWludDMyX3QgbGNkX3ZnYV9wYXNzX3Rocm91Z2hfdGRvMjRtW10gPSB7CiAJQ01EMSgweEIwLCAweDE2KSwKIAlDTUQxKDB4QkMsIDB4ODApLAogCUNNRDEoMHhFMSwgMHgwMCksCkBAIC03NSw3ICs3OSw3IEBACiAJQ01EX05VTEwsCiB9OwogCi1zdGF0aWMgdWludDMyX3QgbGNkX3F2Z2FfcGFzc190aHJvdWdoW10gPSB7CitzdGF0aWMgdWludDMyX3QgbGNkX3F2Z2FfcGFzc190aHJvdWdoX3RkbzI0bVtdID0gewogCUNNRDEoMHhCMCwgMHgxNiksCiAJQ01EMSgweEJDLCAweDgxKSwKIAlDTUQxKDB4RTEsIDB4MDApLApAQCAtODQsNyArODgsNyBAQAogCUNNRF9OVUxMLAogfTsKIAotc3RhdGljIHVpbnQzMl90IGxjZF92Z2FfdHJhbnNmZXJbXSA9IHsKK3N0YXRpYyB1aW50MzJfdCBsY2RfdmdhX3RyYW5zZmVyX3RkbzI0bVtdID0gewogCUNNRDEoMHhjZiwgMHgwMiksIAkvKiBCbGFua2luZyBwZXJpb2QgY29udHJvbCAoMSkgKi8KIAlDTUQyKDB4ZDAsIDB4MDgsIDB4MDQpLAkvKiBCbGFua2luZyBwZXJpb2QgY29udHJvbCAoMikgKi8KIAlDTUQxKDB4ZDEsIDB4MDEpLAkvKiBDS1YgdGltaW5nIGNvbnRyb2wgb24vb2ZmICovCkBAIC0xMTAsNiArMTE0LDM1IEBACiAJQ01EX05VTEwsCiB9OwogCitzdGF0aWMgdWludDMyX3QgbGNkX3ZnYV9wYXNzX3Rocm91Z2hfdGRvMzVzW10gPSB7CisJQ01EMSgweEIwLCAweDE2KSwKKwlDTUQxKDB4QkMsIDB4ODApLAorCUNNRDEoMHhFMSwgMHgwMCksCisJQ01EMSgweDNCLCAweDAwKSwKKwlDTURfTlVMTCwKK307CisKK3N0YXRpYyB1aW50MzJfdCBsY2RfcXZnYV9wYXNzX3Rocm91Z2hfdGRvMzVzW10gPSB7CisJQ01EMSgweEIwLCAweDE2KSwKKwlDTUQxKDB4QkMsIDB4ODEpLAorCUNNRDEoMHhFMSwgMHgwMCksCisJQ01EMSgweDNCLCAweDIyKSwKKwlDTURfTlVMTCwKK307CisKK3N0YXRpYyB1aW50MzJfdCBsY2RfdmdhX3RyYW5zZmVyX3RkbzM1c1tdID0geworCUNNRDEoMHhjZiwgMHgwMiksIAkvKiBCbGFua2luZyBwZXJpb2QgY29udHJvbCAoMSkgKi8KKwlDTUQyKDB4ZDAsIDB4MDgsIDB4MDQpLAkvKiBCbGFua2luZyBwZXJpb2QgY29udHJvbCAoMikgKi8KKwlDTUQxKDB4ZDEsIDB4MDEpLAkvKiBDS1YgdGltaW5nIGNvbnRyb2wgb24vb2ZmICovCisJQ01EMigweGQyLCAweDAwLCAweDFlKSwJLyogQ0tWIDEsMiB0aW1pbmcgY29udHJvbCAqLworCUNNRDIoMHhkMywgMHgxNCwgMHgyOCksCS8qIE9FViB0aW1pbmcgY29udHJvbCAqLworCUNNRDIoMHhkNCwgMHgyOCwgMHg2NCksCS8qIEFTVyB0aW1pbmcgY29udHJvbCAoMSkgKi8KKwlDTUQxKDB4ZDUsIDB4MjgpLAkvKiBBU1cgdGltaW5nIGNvbnRyb2wgKDIpICovCisJQ01EMCgweDIxKSwJCS8qIEludmVydCBmb3Igbm9ybWFsbHkgYmxhY2sgZGlzcGxheSAqLworCUNNRDAoMHgyOSksCQkvKiBEaXNwbGF5IG9uICovCisJQ01EX05VTEwsCit9OworCiBzdGF0aWMgdWludDMyX3QgbGNkX3BhbmVsX2NvbmZpZ1tdID0gewogCUNNRDIoMHhiOCwgMHhmZiwgMHhmOSksCS8qIE91dHB1dCBjb250cm9sICovCiAJQ01EMCgweDExKSwJCS8qIHNsZWVwIG91dCAqLwpAQCAtMTQ4LDYgKzE4MSw4IEBACiAJaW50IG5wYXJhbXMsIGVyciA9IDA7CiAKIAlmb3IgKDsgKnAgIT0gQ01EX05VTEw7IHArKykgeworCQlpZiAoIWxjZC0+Y29sb3JfaW52ZXJ0ICYmICpwID09IENNRDAoMHgyMSkpCisJCQljb250aW51ZTsKIAogCQlucGFyYW1zID0gKCpwID4+IDMwKSAmIDB4MzsKIApAQCAtMTg0LDEyICsyMTksMzMgQEAKIHsKIAlzd2l0Y2ggKG1vZGUpIHsKIAljYXNlIE1PREVfVkdBOgotCQl0ZG8yNG1fd3JpdGVzKGxjZCwgbGNkX3ZnYV9wYXNzX3Rocm91Z2gpOworCQl0ZG8yNG1fd3JpdGVzKGxjZCwgbGNkX3ZnYV9wYXNzX3Rocm91Z2hfdGRvMjRtKTsKIAkJdGRvMjRtX3dyaXRlcyhsY2QsIGxjZF9wYW5lbF9jb25maWcpOwotCQl0ZG8yNG1fd3JpdGVzKGxjZCwgbGNkX3ZnYV90cmFuc2Zlcik7CisJCXRkbzI0bV93cml0ZXMobGNkLCBsY2RfdmdhX3RyYW5zZmVyX3RkbzI0bSk7CiAJCWJyZWFrOwogCWNhc2UgTU9ERV9RVkdBOgotCQl0ZG8yNG1fd3JpdGVzKGxjZCwgbGNkX3F2Z2FfcGFzc190aHJvdWdoKTsKKwkJdGRvMjRtX3dyaXRlcyhsY2QsIGxjZF9xdmdhX3Bhc3NfdGhyb3VnaF90ZG8yNG0pOworCQl0ZG8yNG1fd3JpdGVzKGxjZCwgbGNkX3BhbmVsX2NvbmZpZyk7CisJCXRkbzI0bV93cml0ZXMobGNkLCBsY2RfcXZnYV90cmFuc2Zlcik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWxjZC0+bW9kZSA9IG1vZGU7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGRvMzVzX2Fkal9tb2RlKHN0cnVjdCB0ZG8yNG0gKmxjZCwgaW50IG1vZGUpCit7CisJc3dpdGNoIChtb2RlKSB7CisJY2FzZSBNT0RFX1ZHQToKKwkJdGRvMjRtX3dyaXRlcyhsY2QsIGxjZF92Z2FfcGFzc190aHJvdWdoX3RkbzM1cyk7CisJCXRkbzI0bV93cml0ZXMobGNkLCBsY2RfcGFuZWxfY29uZmlnKTsKKwkJdGRvMjRtX3dyaXRlcyhsY2QsIGxjZF92Z2FfdHJhbnNmZXJfdGRvMzVzKTsKKwkJYnJlYWs7CisJY2FzZSBNT0RFX1FWR0E6CisJCXRkbzI0bV93cml0ZXMobGNkLCBsY2RfcXZnYV9wYXNzX3Rocm91Z2hfdGRvMzVzKTsKIAkJdGRvMjRtX3dyaXRlcyhsY2QsIGxjZF9wYW5lbF9jb25maWcpOwogCQl0ZG8yNG1fd3JpdGVzKGxjZCwgbGNkX3F2Z2FfdHJhbnNmZXIpOwogCQlicmVhazsKQEAgLTIxMyw3ICsyNjksNyBAQAogCWlmIChlcnIpCiAJCWdvdG8gb3V0OwogCi0JZXJyID0gdGRvMjRtX2Fkal9tb2RlKGxjZCwgbGNkLT5tb2RlKTsKKwllcnIgPSBsY2QtPmFkal9tb2RlKGxjZCwgbGNkLT5tb2RlKTsKIG91dDoKIAlyZXR1cm4gZXJyOwogfQpAQCAtMjYyLDcgKzMxOCw3IEBACiAJaWYgKGxjZC0+bW9kZSA9PSBtb2RlKQogCQlyZXR1cm4gMDsKIAotCXJldHVybiB0ZG8yNG1fYWRqX21vZGUobGNkLCBtb2RlKTsKKwlyZXR1cm4gbGNkLT5hZGpfbW9kZShsY2QsIG1vZGUpOwogfQogCiBzdGF0aWMgc3RydWN0IGxjZF9vcHMgdGRvMjRtX29wcyA9IHsKQEAgLTI3Niw4ICszMzIsMTYgQEAKIAlzdHJ1Y3QgdGRvMjRtICpsY2Q7CiAJc3RydWN0IHNwaV9tZXNzYWdlICptOwogCXN0cnVjdCBzcGlfdHJhbnNmZXIgKng7CisJc3RydWN0IHRkbzI0bV9wbGF0Zm9ybV9kYXRhICpwZGF0YTsKKwllbnVtIHRkbzI0bV9tb2RlbCBtb2RlbDsKIAlpbnQgZXJyOwogCisJcGRhdGEgPSBzcGktPmRldi5wbGF0Zm9ybV9kYXRhOworCWlmIChwZGF0YSkKKwkJbW9kZWwgPSBwZGF0YS0+bW9kZWw7CisJZWxzZQorCQltb2RlbCA9IFRETzI0TTsKKwogCXNwaS0+Yml0c19wZXJfd29yZCA9IDg7CiAJc3BpLT5tb2RlID0gU1BJX01PREVfMzsKIAllcnIgPSBzcGlfc2V0dXAoc3BpKTsKQEAgLTMwNiw2ICszNzAsMjAgQEAKIAl4LT50eF9idWYgPSAmbGNkLT5idWZbMF07CiAJc3BpX21lc3NhZ2VfYWRkX3RhaWwoeCwgbSk7CiAKKwlzd2l0Y2ggKG1vZGVsKSB7CisJY2FzZSBURE8yNE06CisJCWxjZC0+Y29sb3JfaW52ZXJ0ID0gMTsKKwkJbGNkLT5hZGpfbW9kZSA9IHRkbzI0bV9hZGpfbW9kZTsKKwkJYnJlYWs7CisJY2FzZSBURE8zNVM6CisJCWxjZC0+YWRqX21vZGUgPSB0ZG8zNXNfYWRqX21vZGU7CisJCWxjZC0+Y29sb3JfaW52ZXJ0ID0gMDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGV2X2Vycigmc3BpLT5kZXYsICJVbnN1cHBvcnRlZCBtb2RlbCIpOworCQlnb3RvIG91dF9mcmVlOworCX0KKwogCWxjZC0+bGNkX2RldiA9IGxjZF9kZXZpY2VfcmVnaXN0ZXIoInRkbzI0bSIsICZzcGktPmRldiwKIAkJCQkJbGNkLCAmdGRvMjRtX29wcyk7CiAJaWYgKElTX0VSUihsY2QtPmxjZF9kZXYpKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC90b3NhX2xjZC5jIGIvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvdG9zYV9sY2QuYwppbmRleCA1N2EyNjY0Li5iN2ZiYzc1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC90b3NhX2xjZC5jCisrKyBiL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L3Rvc2FfbGNkLmMKQEAgLTM5LDYgKzM5LDcgQEAKIAlzdHJ1Y3QgaTJjX2NsaWVudCAqaTJjOwogCiAJaW50IGxjZF9wb3dlcjsKKwlib29sIGlzX3ZnYTsKIH07CiAKIHN0YXRpYyBpbnQgdG9zYV90Z19zZW5kKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIGludCBhZHJzLCB1aW50OF90IGRhdGEpCkBAIC04MSw4ICs4MiwxMiBAQAogc3RhdGljIHZvaWQgdG9zYV9sY2RfdGdfb24oc3RydWN0IHRvc2FfbGNkX2RhdGEgKmRhdGEpCiB7CiAJc3RydWN0IHNwaV9kZXZpY2UgKnNwaSA9IGRhdGEtPnNwaTsKLQljb25zdCBpbnQgdmFsdWUgPSBUR19SRUcwX0NPTE9SIHwgVEdfUkVHMF9VRCB8IFRHX1JFRzBfTFI7Ci0JdG9zYV90Z19zZW5kKHNwaSwgVEdfUE5MQ1RMLCB2YWx1ZSB8IFRHX1JFRzBfVlFWKTsgLyogdGhpcyBkZXBlbmRzIG9uIG1vZGUgKi8KKwlpbnQgdmFsdWUgPSBUR19SRUcwX0NPTE9SIHwgVEdfUkVHMF9VRCB8IFRHX1JFRzBfTFI7CisKKwlpZiAoZGF0YS0+aXNfdmdhKQorCQl2YWx1ZSB8PSBUR19SRUcwX1ZRVjsKKworCXRvc2FfdGdfc2VuZChzcGksIFRHX1BOTENUTCwgdmFsdWUpOwogCiAJLyogVEcgTENEIHBhbm5lbCBwb3dlciB1cCAqLwogCXRvc2FfdGdfc2VuZChzcGksIFRHX1BJTklDVEwsMHg0KTsKQEAgLTE0Miw5ICsxNDcsMjUgQEAKIAlyZXR1cm4gZGF0YS0+bGNkX3Bvd2VyOwogfQogCitzdGF0aWMgaW50IHRvc2FfbGNkX3NldF9tb2RlKHN0cnVjdCBsY2RfZGV2aWNlICpsY2QsIHN0cnVjdCBmYl92aWRlb21vZGUgKm1vZGUpCit7CisJc3RydWN0IHRvc2FfbGNkX2RhdGEgKmRhdGEgPSBsY2RfZ2V0X2RhdGEobGNkKTsKKworCWlmIChtb2RlLT54cmVzID09IDMyMCB8fCBtb2RlLT55cmVzID09IDMyMCkKKwkJZGF0YS0+aXNfdmdhID0gZmFsc2U7CisJZWxzZQorCQlkYXRhLT5pc192Z2EgPSB0cnVlOworCisJaWYgKFBPV0VSX0lTX09OKGRhdGEtPmxjZF9wb3dlcikpCisJCXRvc2FfbGNkX3RnX29uKGRhdGEpOworCisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBzdHJ1Y3QgbGNkX29wcyB0b3NhX2xjZF9vcHMgPSB7CiAJLnNldF9wb3dlciA9IHRvc2FfbGNkX3NldF9wb3dlciwKIAkuZ2V0X3Bvd2VyID0gdG9zYV9sY2RfZ2V0X3Bvd2VyLAorCS5zZXRfbW9kZSA9IHRvc2FfbGNkX3NldF9tb2RlLAogfTsKIAogc3RhdGljIGludCBfX2RldmluaXQgdG9zYV9sY2RfcHJvYmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKQEAgLTE1Niw2ICsxNzcsOCBAQAogCWlmICghZGF0YSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKKwlkYXRhLT5pc192Z2EgPSB0cnVlOyAvKiBkZWZhdXQgdG8gVkdBIG1vZGUgKi8KKwogCS8qCiAJICogYml0c19wZXJfd29yZCBjYW5ub3QgYmUgY29uZmlndXJlZCBpbiBwbGF0Zm9ybSBkYXRhCiAJICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC92Z2cyNDMyYTQuYyBiL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L3ZnZzI0MzJhNC5jCmluZGV4IDU5M2M3NjguLjhlNjUzYjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L3ZnZzI0MzJhNC5jCisrKyBiL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L3ZnZzI0MzJhNC5jCkBAIC0xMzcsNyArMTM3LDcgQEAKIAogCWlsaTkzMjBfd3JpdGUobGNkLCBJTEk5MzIwX1JHQl9JRjEsIGNmZy0+cmdiX2lmMSk7CiAJaWxpOTMyMF93cml0ZShsY2QsIElMSTkzMjBfRlJBTUVNQUtFUiwgMHgwKTsKLQlpbGk5MzIwX3dyaXRlKGxjZCwgSUxJOTMyMF9SR0JfSUYyLCBJTEk5MzIwX1JHQklGMl9EUEwpOworCWlsaTkzMjBfd3JpdGUobGNkLCBJTEk5MzIwX1JHQl9JRjIsIGNmZy0+cmdiX2lmMik7CiAKIAlyZXQgPSBpbGk5MzIwX3dyaXRlX3JlZ3MobGNkLCB2Z2dfaW5pdDEsIEFSUkFZX1NJWkUodmdnX2luaXQxKSk7CiAJaWYgKHJldCAhPSAwKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9iZjU0eC1scTA0M2ZiLmMgYi9kcml2ZXJzL3ZpZGVvL2JmNTR4LWxxMDQzZmIuYwppbmRleCA3NjQ0ZWQyLi4zN2U2MGIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2JmNTR4LWxxMDQzZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL2JmNTR4LWxxMDQzZmIuYwpAQCAtMzM1LDcgKzMzNSwyMCBAQAogCQkJCSAgIHN0cnVjdCBmYl9pbmZvICppbmZvKQogewogCi0JaWYgKHZhci0+Yml0c19wZXJfcGl4ZWwgIT0gTENEX0JQUCkgeworCXN3aXRjaCAodmFyLT5iaXRzX3Blcl9waXhlbCkgeworCWNhc2UgMjQ6LyogVFJVRUNPTE9VUiwgMTZtICovCisJCXZhci0+cmVkLm9mZnNldCA9IDE2OworCQl2YXItPmdyZWVuLm9mZnNldCA9IDg7CisJCXZhci0+Ymx1ZS5vZmZzZXQgPSAwOworCQl2YXItPnJlZC5sZW5ndGggPSB2YXItPmdyZWVuLmxlbmd0aCA9IHZhci0+Ymx1ZS5sZW5ndGggPSA4OworCQl2YXItPnRyYW5zcC5vZmZzZXQgPSAwOworCQl2YXItPnRyYW5zcC5sZW5ndGggPSAwOworCQl2YXItPnRyYW5zcC5tc2JfcmlnaHQgPSAwOworCQl2YXItPnJlZC5tc2JfcmlnaHQgPSAwOworCQl2YXItPmdyZWVuLm1zYl9yaWdodCA9IDA7CisJCXZhci0+Ymx1ZS5tc2JfcmlnaHQgPSAwOworCQlicmVhazsKKwlkZWZhdWx0OgogCQlwcl9kZWJ1ZygiJXM6IGRlcHRoIG5vdCBzdXBwb3J0ZWQ6ICV1IEJQUFxuIiwgX19mdW5jX18sCiAJCQkgdmFyLT5iaXRzX3Blcl9waXhlbCk7CiAJCXJldHVybiAtRUlOVkFMOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9iZmluLXQzNTBtY3FiLWZiLmMgYi9kcml2ZXJzL3ZpZGVvL2JmaW4tdDM1MG1jcWItZmIuYwppbmRleCBhOWIzYWRhLi4yYTQyM2QzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2JmaW4tdDM1MG1jcWItZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL2JmaW4tdDM1MG1jcWItZmIuYwpAQCAtMjU0LDcgKzI1NCwyMCBAQAogCQkJCSAgIHN0cnVjdCBmYl9pbmZvICppbmZvKQogewogCi0JaWYgKHZhci0+Yml0c19wZXJfcGl4ZWwgIT0gTENEX0JQUCkgeworCXN3aXRjaCAodmFyLT5iaXRzX3Blcl9waXhlbCkgeworCWNhc2UgMjQ6LyogVFJVRUNPTE9VUiwgMTZtICovCisJCXZhci0+cmVkLm9mZnNldCA9IDA7CisJCXZhci0+Z3JlZW4ub2Zmc2V0ID0gODsKKwkJdmFyLT5ibHVlLm9mZnNldCA9IDE2OworCQl2YXItPnJlZC5sZW5ndGggPSB2YXItPmdyZWVuLmxlbmd0aCA9IHZhci0+Ymx1ZS5sZW5ndGggPSA4OworCQl2YXItPnRyYW5zcC5vZmZzZXQgPSAwOworCQl2YXItPnRyYW5zcC5sZW5ndGggPSAwOworCQl2YXItPnRyYW5zcC5tc2JfcmlnaHQgPSAwOworCQl2YXItPnJlZC5tc2JfcmlnaHQgPSAwOworCQl2YXItPmdyZWVuLm1zYl9yaWdodCA9IDA7CisJCXZhci0+Ymx1ZS5tc2JfcmlnaHQgPSAwOworCQlicmVhazsKKwlkZWZhdWx0OgogCQlwcl9kZWJ1ZygiJXM6IGRlcHRoIG5vdCBzdXBwb3J0ZWQ6ICV1IEJQUFxuIiwgX19mdW5jX18sCiAJCQkgdmFyLT5iaXRzX3Blcl9waXhlbCk7CiAJCXJldHVybiAtRUlOVkFMOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9jMnAuYyBiL2RyaXZlcnMvdmlkZW8vYzJwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3NmJjMDcuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy92aWRlby9jMnAuYworKysgL2Rldi9udWxsCkBAIC0xLDIzMiArMCwwIEBACi0vKgotICogIEZhc3QgQzJQIChDaHVua3ktdG8tUGxhbmFyKSBDb252ZXJzaW9uCi0gKgotICogIENvcHlyaWdodCAoQykgMjAwMyBHZWVydCBVeXR0ZXJob2V2ZW4KLSAqCi0gKiAgTk9URVM6Ci0gKiAgICAtIFRoaXMgY29kZSB3YXMgaW5zcGlyZWQgYnkgU2NvdXQncyBDMlAgdHV0b3JpYWwKLSAqICAgIC0gSXQgYXNzdW1lcyB0byBydW4gb24gYSBiaWcgZW5kaWFuIHN5c3RlbQotICoKLSAqICBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogIExpY2Vuc2UuIFNlZSB0aGUgZmlsZSBDT1BZSU5HIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKLSAqICBmb3IgbW9yZSBkZXRhaWxzLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KLSNpbmNsdWRlICJjMnAuaCIKLQotCi0gICAgLyoKLSAgICAgKiAgQmFzaWMgdHJhbnNwb3NlIHN0ZXAKLSAgICAgKi8KLQotI2RlZmluZSBfdHJhbnNwKGQsIGkxLCBpMiwgc2hpZnQsIG1hc2spCQkJXAotICAgIGRvIHsJCQkJCQlcCi0JdTMyIHQgPSAoZFtpMV0gXiAoZFtpMl0gPj4gc2hpZnQpKSAmIG1hc2s7CVwKLQlkW2kxXSBePSB0OwkJCQkJXAotCWRbaTJdIF49IHQgPDwgc2hpZnQ7CQkJCVwKLSAgICB9IHdoaWxlICgwKQotCi1zdGF0aWMgaW5saW5lIHUzMiBnZXRfbWFzayhpbnQgbikKLXsKLSAgICBzd2l0Y2ggKG4pIHsKLQljYXNlIDE6Ci0JICAgIHJldHVybiAweDU1NTU1NTU1OwotCSAgICBicmVhazsKLQotCWNhc2UgMjoKLQkgICAgcmV0dXJuIDB4MzMzMzMzMzM7Ci0JICAgIGJyZWFrOwotCi0JY2FzZSA0OgotCSAgICByZXR1cm4gMHgwZjBmMGYwZjsKLQkgICAgYnJlYWs7Ci0KLQljYXNlIDg6Ci0JICAgIHJldHVybiAweDAwZmYwMGZmOwotCSAgICBicmVhazsKLQotCWNhc2UgMTY6Ci0JICAgIHJldHVybiAweDAwMDBmZmZmOwotCSAgICBicmVhazsKLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLSNkZWZpbmUgdHJhbnNwX254MShkLCBuKQkJCQlcCi0gICAgZG8gewkJCQkJCVwKLQl1MzIgbWFzayA9IGdldF9tYXNrKG4pOwkJCQlcCi0JLyogRmlyc3QgYmxvY2sgKi8JCQkJXAotCV90cmFuc3AoZCwgMCwgMSwgbiwgbWFzayk7CQkJXAotCS8qIFNlY29uZCBibG9jayAqLwkJCQlcCi0JX3RyYW5zcChkLCAyLCAzLCBuLCBtYXNrKTsJCQlcCi0JLyogVGhpcmQgYmxvY2sgKi8JCQkJXAotCV90cmFuc3AoZCwgNCwgNSwgbiwgbWFzayk7CQkJXAotCS8qIEZvdXJ0aCBibG9jayAqLwkJCQlcCi0JX3RyYW5zcChkLCA2LCA3LCBuLCBtYXNrKTsJCQlcCi0gICAgfSB3aGlsZSAoMCkKLQotI2RlZmluZSB0cmFuc3BfbngyKGQsIG4pCQkJCVwKLSAgICBkbyB7CQkJCQkJXAotCXUzMiBtYXNrID0gZ2V0X21hc2sobik7CQkJCVwKLQkvKiBGaXJzdCBibG9jayAqLwkJCQlcCi0JX3RyYW5zcChkLCAwLCAyLCBuLCBtYXNrKTsJCQlcCi0JX3RyYW5zcChkLCAxLCAzLCBuLCBtYXNrKTsJCQlcCi0JLyogU2Vjb25kIGJsb2NrICovCQkJCVwKLQlfdHJhbnNwKGQsIDQsIDYsIG4sIG1hc2spOwkJCVwKLQlfdHJhbnNwKGQsIDUsIDcsIG4sIG1hc2spOwkJCVwKLSAgICB9IHdoaWxlICgwKQotCi0jZGVmaW5lIHRyYW5zcF9ueDQoZCwgbikJCQkJXAotICAgIGRvIHsJCQkJCQlcCi0JdTMyIG1hc2sgPSBnZXRfbWFzayhuKTsJCQkJXAotCV90cmFuc3AoZCwgMCwgNCwgbiwgbWFzayk7CQkJXAotCV90cmFuc3AoZCwgMSwgNSwgbiwgbWFzayk7CQkJXAotCV90cmFuc3AoZCwgMiwgNiwgbiwgbWFzayk7CQkJXAotCV90cmFuc3AoZCwgMywgNywgbiwgbWFzayk7CQkJXAotICAgIH0gd2hpbGUgKDApCi0KLSNkZWZpbmUgdHJhbnNwKGQsIG4sIG0pCXRyYW5zcF9ueCAjIyBtKGQsIG4pCi0KLQotICAgIC8qCi0gICAgICogIFBlcmZvcm0gYSBmdWxsIEMyUCBzdGVwIG9uIDMyIDgtYml0IHBpeGVscywgc3RvcmVkIGluIDggMzItYml0IHdvcmRzCi0gICAgICogIGNvbnRhaW5pbmcKLSAgICAgKiAgICAtIDMyIDgtYml0IGNodW5reSBwaXhlbHMgb24gaW5wdXQKLSAgICAgKiAgICAtIHBlcm11dGVkIHBsYW5hciBkYXRhIG9uIG91dHB1dAotICAgICAqLwotCi1zdGF0aWMgdm9pZCBjMnBfOGJwcCh1MzIgZFs4XSkKLXsKLSAgICB0cmFuc3AoZCwgMTYsIDQpOwotICAgIHRyYW5zcChkLCA4LCAyKTsKLSAgICB0cmFuc3AoZCwgNCwgMSk7Ci0gICAgdHJhbnNwKGQsIDIsIDQpOwotICAgIHRyYW5zcChkLCAxLCAyKTsKLX0KLQotCi0gICAgLyoKLSAgICAgKiAgQXJyYXkgY29udGFpbmluZyB0aGUgcGVybXV0aW9uIGluZGljZXMgb2YgdGhlIHBsYW5hciBkYXRhIGFmdGVyIGMycAotICAgICAqLwotCi1zdGF0aWMgY29uc3QgaW50IHBlcm1fYzJwXzhicHBbOF0gPSB7IDcsIDUsIDMsIDEsIDYsIDQsIDIsIDAgfTsKLQotCi0gICAgLyoKLSAgICAgKiAgQ29tcG9zZSB0d28gdmFsdWVzLCB1c2luZyBhIGJpdG1hc2sgYXMgZGVjaXNpb24gdmFsdWUKLSAgICAgKiAgVGhpcyBpcyBlcXVpdmFsZW50IHRvIChhICYgbWFzaykgfCAoYiAmIH5tYXNrKQotICAgICAqLwotCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgY29tcCh1bnNpZ25lZCBsb25nIGEsIHVuc2lnbmVkIGxvbmcgYiwKLQkJCQkgdW5zaWduZWQgbG9uZyBtYXNrKQotewotCXJldHVybiAoKGEgXiBiKSAmIG1hc2spIF4gYjsKLX0KLQotCi0gICAgLyoKLSAgICAgKiAgU3RvcmUgYSBmdWxsIGJsb2NrIG9mIHBsYW5hciBkYXRhIGFmdGVyIGMycCBjb252ZXJzaW9uCi0gICAgICovCi0KLXN0YXRpYyBpbmxpbmUgdm9pZCBzdG9yZV9wbGFuYXIoY2hhciAqZHN0LCB1MzIgZHN0X2luYywgdTMyIGJwcCwgdTMyIGRbOF0pCi17Ci0gICAgaW50IGk7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgYnBwOyBpKyssIGRzdCArPSBkc3RfaW5jKQotCSoodTMyICopZHN0ID0gZFtwZXJtX2MycF84YnBwW2ldXTsKLX0KLQotCi0gICAgLyoKLSAgICAgKiAgU3RvcmUgYSBwYXJ0aWFsIGJsb2NrIG9mIHBsYW5hciBkYXRhIGFmdGVyIGMycCBjb252ZXJzaW9uCi0gICAgICovCi0KLXN0YXRpYyBpbmxpbmUgdm9pZCBzdG9yZV9wbGFuYXJfbWFza2VkKGNoYXIgKmRzdCwgdTMyIGRzdF9pbmMsIHUzMiBicHAsCi0JCQkJICAgICAgIHUzMiBkWzhdLCB1MzIgbWFzaykKLXsKLSAgICBpbnQgaTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBicHA7IGkrKywgZHN0ICs9IGRzdF9pbmMpCi0JKih1MzIgKilkc3QgPSBjb21wKGRbcGVybV9jMnBfOGJwcFtpXV0sICoodTMyICopZHN0LCBtYXNrKTsKLX0KLQotCi0gICAgLyoKLSAgICAgKiAgYzJwIC0gQ29weSA4LWJpdCBjaHVua3kgaW1hZ2UgZGF0YSB0byBhIHBsYW5hciBmcmFtZSBidWZmZXIKLSAgICAgKiAgQGRzdDogU3RhcnRpbmcgYWRkcmVzcyBvZiB0aGUgcGxhbmFyIGZyYW1lIGJ1ZmZlcgotICAgICAqICBAZHg6IEhvcml6b250YWwgZGVzdGluYXRpb24gb2Zmc2V0IChpbiBwaXhlbHMpCi0gICAgICogIEBkeTogVmVydGljYWwgZGVzdGluYXRpb24gb2Zmc2V0IChpbiBwaXhlbHMpCi0gICAgICogIEB3aWR0aDogSW1hZ2Ugd2lkdGggKGluIHBpeGVscykKLSAgICAgKiAgQGhlaWdodDogSW1hZ2UgaGVpZ2h0IChpbiBwaXhlbHMpCi0gICAgICogIEBkc3RfbmV4dGxpbmU6IEZyYW1lIGJ1ZmZlciBvZmZzZXQgdG8gdGhlIG5leHQgbGluZSAoaW4gYnl0ZXMpCi0gICAgICogIEBkc3RfbmV4dHBsYW5lOiBGcmFtZSBidWZmZXIgb2Zmc2V0IHRvIHRoZSBuZXh0IHBsYW5lIChpbiBieXRlcykKLSAgICAgKiAgQHNyY19uZXh0bGluZTogSW1hZ2Ugb2Zmc2V0IHRvIHRoZSBuZXh0IGxpbmUgKGluIGJ5dGVzKQotICAgICAqICBAYnBwOiBCaXRzIHBlciBwaXhlbCBvZiB0aGUgcGxhbmFyIGZyYW1lIGJ1ZmZlciAoMS04KQotICAgICAqLwotCi12b2lkIGMycCh1OCAqZHN0LCBjb25zdCB1OCAqc3JjLCB1MzIgZHgsIHUzMiBkeSwgdTMyIHdpZHRoLCB1MzIgaGVpZ2h0LAotCSB1MzIgZHN0X25leHRsaW5lLCB1MzIgZHN0X25leHRwbGFuZSwgdTMyIHNyY19uZXh0bGluZSwgdTMyIGJwcCkKLXsKLSAgICBpbnQgZHN0X2lkeDsKLSAgICB1MzIgZFs4XSwgZmlyc3QsIGxhc3QsIHc7Ci0gICAgY29uc3QgdTggKmM7Ci0gICAgdTggKnA7Ci0KLSAgICBkc3QgKz0gZHkqZHN0X25leHRsaW5lKyhkeCAmIH4zMSk7Ci0gICAgZHN0X2lkeCA9IGR4ICUgMzI7Ci0gICAgZmlyc3QgPSB+MFVMID4+IGRzdF9pZHg7Ci0gICAgbGFzdCA9IH4ofjBVTCA+PiAoKGRzdF9pZHgrd2lkdGgpICUgMzIpKTsKLSAgICB3aGlsZSAoaGVpZ2h0LS0pIHsKLQljID0gc3JjOwotCXAgPSBkc3Q7Ci0JdyA9IHdpZHRoOwotCWlmIChkc3RfaWR4K3dpZHRoIDw9IDMyKSB7Ci0JICAgIC8qIFNpbmdsZSBkZXN0aW5hdGlvbiB3b3JkICovCi0JICAgIGZpcnN0ICY9IGxhc3Q7Ci0JICAgIG1lbXNldChkLCAwLCBzaXplb2YoZCkpOwotCSAgICBtZW1jcHkoKHU4ICopZCtkc3RfaWR4LCBjLCB3aWR0aCk7Ci0JICAgIGMgKz0gd2lkdGg7Ci0JICAgIGMycF84YnBwKGQpOwotCSAgICBzdG9yZV9wbGFuYXJfbWFza2VkKHAsIGRzdF9uZXh0cGxhbmUsIGJwcCwgZCwgZmlyc3QpOwotCSAgICBwICs9IDQ7Ci0JfSBlbHNlIHsKLQkgICAgLyogTXVsdGlwbGUgZGVzdGluYXRpb24gd29yZHMgKi8KLQkgICAgdyA9IHdpZHRoOwotCSAgICAvKiBMZWFkaW5nIGJpdHMgKi8KLQkgICAgaWYgKGRzdF9pZHgpIHsKLQkJdyA9IDMyIC0gZHN0X2lkeDsKLQkJbWVtc2V0KGQsIDAsIGRzdF9pZHgpOwotCQltZW1jcHkoKHU4ICopZCtkc3RfaWR4LCBjLCB3KTsKLQkJYyArPSB3OwotCQljMnBfOGJwcChkKTsKLQkJc3RvcmVfcGxhbmFyX21hc2tlZChwLCBkc3RfbmV4dHBsYW5lLCBicHAsIGQsIGZpcnN0KTsKLQkJcCArPSA0OwotCQl3ID0gd2lkdGgtdzsKLQkgICAgfQotCSAgICAvKiBNYWluIGNodW5rICovCi0JICAgIHdoaWxlICh3ID49IDMyKSB7Ci0JCW1lbWNweShkLCBjLCAzMik7Ci0JCWMgKz0gMzI7Ci0JCWMycF84YnBwKGQpOwotCQlzdG9yZV9wbGFuYXIocCwgZHN0X25leHRwbGFuZSwgYnBwLCBkKTsKLQkJcCArPSA0OwotCQl3IC09IDMyOwotCSAgICB9Ci0JICAgIC8qIFRyYWlsaW5nIGJpdHMgKi8KLQkgICAgdyAlPSAzMjsKLQkgICAgaWYgKHcgPiAwKSB7Ci0JCW1lbWNweShkLCBjLCB3KTsKLQkJbWVtc2V0KCh1OCAqKWQrdywgMCwgMzItdyk7Ci0JCWMycF84YnBwKGQpOwotCQlzdG9yZV9wbGFuYXJfbWFza2VkKHAsIGRzdF9uZXh0cGxhbmUsIGJwcCwgZCwgbGFzdCk7Ci0JICAgIH0KLQl9Ci0Jc3JjICs9IHNyY19uZXh0bGluZTsKLQlkc3QgKz0gZHN0X25leHRsaW5lOwotICAgIH0KLX0KLUVYUE9SVF9TWU1CT0xfR1BMKGMycCk7Ci0KLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vYzJwLmggYi9kcml2ZXJzL3ZpZGVvL2MycC5oCmluZGV4IGM3N2NiZjEuLjZjMzhkNDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vYzJwLmgKKysrIGIvZHJpdmVycy92aWRlby9jMnAuaApAQCAtMSw3ICsxLDcgQEAKIC8qCiAgKiAgRmFzdCBDMlAgKENodW5reS10by1QbGFuYXIpIENvbnZlcnNpb24KICAqCi0gKiAgQ29weXJpZ2h0IChDKSAyMDAzIEdlZXJ0IFV5dHRlcmhvZXZlbgorICogIENvcHlyaWdodCAoQykgMjAwMy0yMDA4IEdlZXJ0IFV5dHRlcmhvZXZlbgogICoKICAqICBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwogICogIExpY2Vuc2UuIFNlZSB0aGUgZmlsZSBDT1BZSU5HIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKQEAgLTEwLDcgKzEwLDEwIEBACiAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogCi1leHRlcm4gdm9pZCBjMnAodTggKmRzdCwgY29uc3QgdTggKnNyYywgdTMyIGR4LCB1MzIgZHksIHUzMiB3aWR0aCwgdTMyIGhlaWdodCwKLQkJdTMyIGRzdF9uZXh0bGluZSwgdTMyIGRzdF9uZXh0cGxhbmUsIHUzMiBzcmNfbmV4dGxpbmUsCi0JCXUzMiBicHApOworZXh0ZXJuIHZvaWQgYzJwX3BsYW5hcih2b2lkICpkc3QsIGNvbnN0IHZvaWQgKnNyYywgdTMyIGR4LCB1MzIgZHksIHUzMiB3aWR0aCwKKwkJICAgICAgIHUzMiBoZWlnaHQsIHUzMiBkc3RfbmV4dGxpbmUsIHUzMiBkc3RfbmV4dHBsYW5lLAorCQkgICAgICAgdTMyIHNyY19uZXh0bGluZSwgdTMyIGJwcCk7CiAKK2V4dGVybiB2b2lkIGMycF9pcGxhbjIodm9pZCAqZHN0LCBjb25zdCB2b2lkICpzcmMsIHUzMiBkeCwgdTMyIGR5LCB1MzIgd2lkdGgsCisJCSAgICAgICB1MzIgaGVpZ2h0LCB1MzIgZHN0X25leHRsaW5lLCB1MzIgc3JjX25leHRsaW5lLAorCQkgICAgICAgdTMyIGJwcCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2MycF9jb3JlLmggYi9kcml2ZXJzL3ZpZGVvL2MycF9jb3JlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTEwMzVhOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdmlkZW8vYzJwX2NvcmUuaApAQCAtMCwwICsxLDE1MyBAQAorLyoKKyAqICBGYXN0IEMyUCAoQ2h1bmt5LXRvLVBsYW5hcikgQ29udmVyc2lvbgorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwOCBHZWVydCBVeXR0ZXJob2V2ZW4KKyAqCisgKiAgTk9URVM6CisgKiAgICAtIFRoaXMgY29kZSB3YXMgaW5zcGlyZWQgYnkgU2NvdXQncyBDMlAgdHV0b3JpYWwKKyAqICAgIC0gSXQgYXNzdW1lcyB0byBydW4gb24gYSBiaWcgZW5kaWFuIHN5c3RlbQorICoKKyAqICBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogIExpY2Vuc2UuIFNlZSB0aGUgZmlsZSBDT1BZSU5HIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqICBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKworICAgIC8qCisgICAgICogIEJhc2ljIHRyYW5zcG9zZSBzdGVwCisgICAgICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfdHJhbnNwKHUzMiBkW10sIHVuc2lnbmVkIGludCBpMSwgdW5zaWduZWQgaW50IGkyLAorCQkJICAgdW5zaWduZWQgaW50IHNoaWZ0LCB1MzIgbWFzaykKK3sKKwl1MzIgdCA9IChkW2kxXSBeIChkW2kyXSA+PiBzaGlmdCkpICYgbWFzazsKKworCWRbaTFdIF49IHQ7CisJZFtpMl0gXj0gdCA8PCBzaGlmdDsKK30KKworCitleHRlcm4gdm9pZCBjMnBfdW5zdXBwb3J0ZWQodm9pZCk7CisKK3N0YXRpYyBpbmxpbmUgdTMyIGdldF9tYXNrKHVuc2lnbmVkIGludCBuKQoreworCXN3aXRjaCAobikgeworCWNhc2UgMToKKwkJcmV0dXJuIDB4NTU1NTU1NTU7CisKKwljYXNlIDI6CisJCXJldHVybiAweDMzMzMzMzMzOworCisJY2FzZSA0OgorCQlyZXR1cm4gMHgwZjBmMGYwZjsKKworCWNhc2UgODoKKwkJcmV0dXJuIDB4MDBmZjAwZmY7CisKKwljYXNlIDE2OgorCQlyZXR1cm4gMHgwMDAwZmZmZjsKKwl9CisKKwljMnBfdW5zdXBwb3J0ZWQoKTsKKwlyZXR1cm4gMDsKK30KKworCisgICAgLyoKKyAgICAgKiAgVHJhbnNwb3NlIG9wZXJhdGlvbnMgb24gOCAzMi1iaXQgd29yZHMKKyAgICAgKi8KKworc3RhdGljIGlubGluZSB2b2lkIHRyYW5zcDgodTMyIGRbXSwgdW5zaWduZWQgaW50IG4sIHVuc2lnbmVkIGludCBtKQoreworCXUzMiBtYXNrID0gZ2V0X21hc2sobik7CisKKwlzd2l0Y2ggKG0pIHsKKwljYXNlIDE6CisJCS8qIEZpcnN0IG4geCAxIGJsb2NrICovCisJCV90cmFuc3AoZCwgMCwgMSwgbiwgbWFzayk7CisJCS8qIFNlY29uZCBuIHggMSBibG9jayAqLworCQlfdHJhbnNwKGQsIDIsIDMsIG4sIG1hc2spOworCQkvKiBUaGlyZCBuIHggMSBibG9jayAqLworCQlfdHJhbnNwKGQsIDQsIDUsIG4sIG1hc2spOworCQkvKiBGb3VydGggbiB4IDEgYmxvY2sgKi8KKwkJX3RyYW5zcChkLCA2LCA3LCBuLCBtYXNrKTsKKwkJcmV0dXJuOworCisJY2FzZSAyOgorCQkvKiBGaXJzdCBuIHggMiBibG9jayAqLworCQlfdHJhbnNwKGQsIDAsIDIsIG4sIG1hc2spOworCQlfdHJhbnNwKGQsIDEsIDMsIG4sIG1hc2spOworCQkvKiBTZWNvbmQgbiB4IDIgYmxvY2sgKi8KKwkJX3RyYW5zcChkLCA0LCA2LCBuLCBtYXNrKTsKKwkJX3RyYW5zcChkLCA1LCA3LCBuLCBtYXNrKTsKKwkJcmV0dXJuOworCisJY2FzZSA0OgorCQkvKiBTaW5nbGUgbiB4IDQgYmxvY2sgKi8KKwkJX3RyYW5zcChkLCAwLCA0LCBuLCBtYXNrKTsKKwkJX3RyYW5zcChkLCAxLCA1LCBuLCBtYXNrKTsKKwkJX3RyYW5zcChkLCAyLCA2LCBuLCBtYXNrKTsKKwkJX3RyYW5zcChkLCAzLCA3LCBuLCBtYXNrKTsKKwkJcmV0dXJuOworCX0KKworCWMycF91bnN1cHBvcnRlZCgpOworfQorCisKKyAgICAvKgorICAgICAqICBUcmFuc3Bvc2Ugb3BlcmF0aW9ucyBvbiA0IDMyLWJpdCB3b3JkcworICAgICAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgdHJhbnNwNCh1MzIgZFtdLCB1bnNpZ25lZCBpbnQgbiwgdW5zaWduZWQgaW50IG0pCit7CisJdTMyIG1hc2sgPSBnZXRfbWFzayhuKTsKKworCXN3aXRjaCAobSkgeworCWNhc2UgMToKKwkJLyogRmlyc3QgbiB4IDEgYmxvY2sgKi8KKwkJX3RyYW5zcChkLCAwLCAxLCBuLCBtYXNrKTsKKwkJLyogU2Vjb25kIG4geCAxIGJsb2NrICovCisJCV90cmFuc3AoZCwgMiwgMywgbiwgbWFzayk7CisJCXJldHVybjsKKworCWNhc2UgMjoKKwkJLyogU2luZ2xlIG4geCAyIGJsb2NrICovCisJCV90cmFuc3AoZCwgMCwgMiwgbiwgbWFzayk7CisJCV90cmFuc3AoZCwgMSwgMywgbiwgbWFzayk7CisJCXJldHVybjsKKwl9CisKKwljMnBfdW5zdXBwb3J0ZWQoKTsKK30KKworCisgICAgLyoKKyAgICAgKiAgVHJhbnNwb3NlIG9wZXJhdGlvbnMgb24gNCAzMi1iaXQgd29yZHMgKHJldmVyc2Ugb3JkZXIpCisgICAgICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0cmFuc3A0eCh1MzIgZFtdLCB1bnNpZ25lZCBpbnQgbiwgdW5zaWduZWQgaW50IG0pCit7CisJdTMyIG1hc2sgPSBnZXRfbWFzayhuKTsKKworCXN3aXRjaCAobSkgeworCWNhc2UgMjoKKwkJLyogU2luZ2xlIG4geCAyIGJsb2NrICovCisJCV90cmFuc3AoZCwgMiwgMCwgbiwgbWFzayk7CisJCV90cmFuc3AoZCwgMywgMSwgbiwgbWFzayk7CisJCXJldHVybjsKKwl9CisKKwljMnBfdW5zdXBwb3J0ZWQoKTsKK30KKworCisgICAgLyoKKyAgICAgKiAgQ29tcG9zZSB0d28gdmFsdWVzLCB1c2luZyBhIGJpdG1hc2sgYXMgZGVjaXNpb24gdmFsdWUKKyAgICAgKiAgVGhpcyBpcyBlcXVpdmFsZW50IHRvIChhICYgbWFzaykgfCAoYiAmIH5tYXNrKQorICAgICAqLworCitzdGF0aWMgaW5saW5lIHUzMiBjb21wKHUzMiBhLCB1MzIgYiwgdTMyIG1hc2spCit7CisJcmV0dXJuICgoYSBeIGIpICYgbWFzaykgXiBiOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9jMnBfaXBsYW4yLmMgYi9kcml2ZXJzL3ZpZGVvL2MycF9pcGxhbjIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTE1NmRjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy92aWRlby9jMnBfaXBsYW4yLmMKQEAgLTAsMCArMSwxNTMgQEAKKy8qCisgKiAgRmFzdCBDMlAgKENodW5reS10by1QbGFuYXIpIENvbnZlcnNpb24KKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDAzLTIwMDggR2VlcnQgVXl0dGVyaG9ldmVuCisgKgorICogIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiAgTGljZW5zZS4gU2VlIHRoZSBmaWxlIENPUFlJTkcgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorCisjaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgorCisjaW5jbHVkZSAiYzJwLmgiCisjaW5jbHVkZSAiYzJwX2NvcmUuaCIKKworCisgICAgLyoKKyAgICAgKiAgUGVyZm9ybSBhIGZ1bGwgQzJQIHN0ZXAgb24gMTYgOC1iaXQgcGl4ZWxzLCBzdG9yZWQgaW4gNCAzMi1iaXQgd29yZHMKKyAgICAgKiAgY29udGFpbmluZworICAgICAqICAgIC0gMTYgOC1iaXQgY2h1bmt5IHBpeGVscyBvbiBpbnB1dAorICAgICAqICAgIC0gcGVybXV0YXRlZCBwbGFuYXIgZGF0YSAoMiBwbGFuZXMgcGVyIDMyLWJpdCB3b3JkKSBvbiBvdXRwdXQKKyAgICAgKi8KKworc3RhdGljIHZvaWQgYzJwXzE2eDgodTMyIGRbNF0pCit7CisJdHJhbnNwNChkLCA4LCAyKTsKKwl0cmFuc3A0KGQsIDEsIDIpOworCXRyYW5zcDR4KGQsIDE2LCAyKTsKKwl0cmFuc3A0eChkLCAyLCAyKTsKKwl0cmFuc3A0KGQsIDQsIDEpOworfQorCisKKyAgICAvKgorICAgICAqICBBcnJheSBjb250YWluaW5nIHRoZSBwZXJtdXRhdGlvbiBpbmRpY2VzIG9mIHRoZSBwbGFuYXIgZGF0YSBhZnRlciBjMnAKKyAgICAgKi8KKworc3RhdGljIGNvbnN0IGludCBwZXJtX2MycF8xNng4WzRdID0geyAxLCAzLCAwLCAyIH07CisKKworICAgIC8qCisgICAgICogIFN0b3JlIGEgZnVsbCBibG9jayBvZiBpcGxhbjIgZGF0YSBhZnRlciBjMnAgY29udmVyc2lvbgorICAgICAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgc3RvcmVfaXBsYW4yKHZvaWQgKmRzdCwgdTMyIGJwcCwgdTMyIGRbNF0pCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgYnBwLzI7IGkrKywgZHN0ICs9IDQpCisJCXB1dF91bmFsaWduZWRfYmUzMihkW3Blcm1fYzJwXzE2eDhbaV1dLCBkc3QpOworfQorCisKKyAgICAvKgorICAgICAqICBTdG9yZSBhIHBhcnRpYWwgYmxvY2sgb2YgaXBsYW4yIGRhdGEgYWZ0ZXIgYzJwIGNvbnZlcnNpb24KKyAgICAgKi8KKworc3RhdGljIGlubGluZSB2b2lkIHN0b3JlX2lwbGFuMl9tYXNrZWQodm9pZCAqZHN0LCB1MzIgYnBwLCB1MzIgZFs0XSwgdTMyIG1hc2spCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgYnBwLzI7IGkrKywgZHN0ICs9IDQpCisJCXB1dF91bmFsaWduZWRfYmUzMihjb21wKGRbcGVybV9jMnBfMTZ4OFtpXV0sCisJCQkJCWdldF91bmFsaWduZWRfYmUzMihkc3QpLCBtYXNrKSwKKwkJCQkgICBkc3QpOworfQorCisKKyAgICAvKgorICAgICAqICBjMnBfaXBsYW4yIC0gQ29weSA4LWJpdCBjaHVua3kgaW1hZ2UgZGF0YSB0byBhbiBpbnRlcmxlYXZlZCBwbGFuYXIKKyAgICAgKiAgZnJhbWUgYnVmZmVyIHdpdGggMiBieXRlcyBvZiBpbnRlcmxlYXZlCisgICAgICogIEBkc3Q6IFN0YXJ0aW5nIGFkZHJlc3Mgb2YgdGhlIHBsYW5hciBmcmFtZSBidWZmZXIKKyAgICAgKiAgQGR4OiBIb3Jpem9udGFsIGRlc3RpbmF0aW9uIG9mZnNldCAoaW4gcGl4ZWxzKQorICAgICAqICBAZHk6IFZlcnRpY2FsIGRlc3RpbmF0aW9uIG9mZnNldCAoaW4gcGl4ZWxzKQorICAgICAqICBAd2lkdGg6IEltYWdlIHdpZHRoIChpbiBwaXhlbHMpCisgICAgICogIEBoZWlnaHQ6IEltYWdlIGhlaWdodCAoaW4gcGl4ZWxzKQorICAgICAqICBAZHN0X25leHRsaW5lOiBGcmFtZSBidWZmZXIgb2Zmc2V0IHRvIHRoZSBuZXh0IGxpbmUgKGluIGJ5dGVzKQorICAgICAqICBAc3JjX25leHRsaW5lOiBJbWFnZSBvZmZzZXQgdG8gdGhlIG5leHQgbGluZSAoaW4gYnl0ZXMpCisgICAgICogIEBicHA6IEJpdHMgcGVyIHBpeGVsIG9mIHRoZSBwbGFuYXIgZnJhbWUgYnVmZmVyICgyLCA0LCBvciA4KQorICAgICAqLworCit2b2lkIGMycF9pcGxhbjIodm9pZCAqZHN0LCBjb25zdCB2b2lkICpzcmMsIHUzMiBkeCwgdTMyIGR5LCB1MzIgd2lkdGgsCisJCXUzMiBoZWlnaHQsIHUzMiBkc3RfbmV4dGxpbmUsIHUzMiBzcmNfbmV4dGxpbmUsIHUzMiBicHApCit7CisJdW5pb24geworCQl1OCBwaXhlbHNbMTZdOworCQl1MzIgd29yZHNbNF07CisJfSBkOworCXUzMiBkc3RfaWR4LCBmaXJzdCwgbGFzdCwgdzsKKwljb25zdCB1OCAqYzsKKwl2b2lkICpwOworCisJZHN0ICs9IGR5KmRzdF9uZXh0bGluZSsoZHggJiB+MTUpKmJwcDsKKwlkc3RfaWR4ID0gZHggJSAxNjsKKwlmaXJzdCA9IDB4ZmZmZlUgPj4gZHN0X2lkeDsKKwlmaXJzdCB8PSBmaXJzdCA8PCAxNjsKKwlsYXN0ID0gMHhmZmZmVSBeICgweGZmZmZVID4+ICgoZHN0X2lkeCt3aWR0aCkgJSAxNikpOworCWxhc3QgfD0gbGFzdCA8PCAxNjsKKwl3aGlsZSAoaGVpZ2h0LS0pIHsKKwkJYyA9IHNyYzsKKwkJcCA9IGRzdDsKKwkJdyA9IHdpZHRoOworCQlpZiAoZHN0X2lkeCt3aWR0aCA8PSAxNikgeworCQkJLyogU2luZ2xlIGRlc3RpbmF0aW9uIHdvcmQgKi8KKwkJCWZpcnN0ICY9IGxhc3Q7CisJCQltZW1zZXQoZC5waXhlbHMsIDAsIHNpemVvZihkKSk7CisJCQltZW1jcHkoZC5waXhlbHMrZHN0X2lkeCwgYywgd2lkdGgpOworCQkJYyArPSB3aWR0aDsKKwkJCWMycF8xNng4KGQud29yZHMpOworCQkJc3RvcmVfaXBsYW4yX21hc2tlZChwLCBicHAsIGQud29yZHMsIGZpcnN0KTsKKwkJCXAgKz0gYnBwKjI7CisJCX0gZWxzZSB7CisJCQkvKiBNdWx0aXBsZSBkZXN0aW5hdGlvbiB3b3JkcyAqLworCQkJdyA9IHdpZHRoOworCQkJLyogTGVhZGluZyBiaXRzICovCisJCQlpZiAoZHN0X2lkeCkgeworCQkJCXcgPSAxNiAtIGRzdF9pZHg7CisJCQkJbWVtc2V0KGQucGl4ZWxzLCAwLCBkc3RfaWR4KTsKKwkJCQltZW1jcHkoZC5waXhlbHMrZHN0X2lkeCwgYywgdyk7CisJCQkJYyArPSB3OworCQkJCWMycF8xNng4KGQud29yZHMpOworCQkJCXN0b3JlX2lwbGFuMl9tYXNrZWQocCwgYnBwLCBkLndvcmRzLCBmaXJzdCk7CisJCQkJcCArPSBicHAqMjsKKwkJCQl3ID0gd2lkdGgtdzsKKwkJCX0KKwkJCS8qIE1haW4gY2h1bmsgKi8KKwkJCXdoaWxlICh3ID49IDE2KSB7CisJCQkJbWVtY3B5KGQucGl4ZWxzLCBjLCAxNik7CisJCQkJYyArPSAxNjsKKwkJCQljMnBfMTZ4OChkLndvcmRzKTsKKwkJCQlzdG9yZV9pcGxhbjIocCwgYnBwLCBkLndvcmRzKTsKKwkJCQlwICs9IGJwcCoyOworCQkJCXcgLT0gMTY7CisJCQl9CisJCQkvKiBUcmFpbGluZyBiaXRzICovCisJCQl3ICU9IDE2OworCQkJaWYgKHcgPiAwKSB7CisJCQkJbWVtY3B5KGQucGl4ZWxzLCBjLCB3KTsKKwkJCQltZW1zZXQoZC5waXhlbHMrdywgMCwgMTYtdyk7CisJCQkJYzJwXzE2eDgoZC53b3Jkcyk7CisJCQkJc3RvcmVfaXBsYW4yX21hc2tlZChwLCBicHAsIGQud29yZHMsIGxhc3QpOworCQkJfQorCQl9CisJCXNyYyArPSBzcmNfbmV4dGxpbmU7CisJCWRzdCArPSBkc3RfbmV4dGxpbmU7CisJfQorfQorRVhQT1JUX1NZTUJPTF9HUEwoYzJwX2lwbGFuMik7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vYzJwX3BsYW5hci5jIGIvZHJpdmVycy92aWRlby9jMnBfcGxhbmFyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWM3YWM4NQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdmlkZW8vYzJwX3BsYW5hci5jCkBAIC0wLDAgKzEsMTU2IEBACisvKgorICogIEZhc3QgQzJQIChDaHVua3ktdG8tUGxhbmFyKSBDb252ZXJzaW9uCisgKgorICogIENvcHlyaWdodCAoQykgMjAwMy0yMDA4IEdlZXJ0IFV5dHRlcmhvZXZlbgorICoKKyAqICBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogIExpY2Vuc2UuIFNlZSB0aGUgZmlsZSBDT1BZSU5HIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqICBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKworI2luY2x1ZGUgPGFzbS91bmFsaWduZWQuaD4KKworI2luY2x1ZGUgImMycC5oIgorI2luY2x1ZGUgImMycF9jb3JlLmgiCisKKworICAgIC8qCisgICAgICogIFBlcmZvcm0gYSBmdWxsIEMyUCBzdGVwIG9uIDMyIDgtYml0IHBpeGVscywgc3RvcmVkIGluIDggMzItYml0IHdvcmRzCisgICAgICogIGNvbnRhaW5pbmcKKyAgICAgKiAgICAtIDMyIDgtYml0IGNodW5reSBwaXhlbHMgb24gaW5wdXQKKyAgICAgKiAgICAtIHBlcm11dGF0ZWQgcGxhbmFyIGRhdGEgKDEgcGxhbmUgcGVyIDMyLWJpdCB3b3JkKSBvbiBvdXRwdXQKKyAgICAgKi8KKworc3RhdGljIHZvaWQgYzJwXzMyeDgodTMyIGRbOF0pCit7CisJdHJhbnNwOChkLCAxNiwgNCk7CisJdHJhbnNwOChkLCA4LCAyKTsKKwl0cmFuc3A4KGQsIDQsIDEpOworCXRyYW5zcDgoZCwgMiwgNCk7CisJdHJhbnNwOChkLCAxLCAyKTsKK30KKworCisgICAgLyoKKyAgICAgKiAgQXJyYXkgY29udGFpbmluZyB0aGUgcGVybXV0YXRpb24gaW5kaWNlcyBvZiB0aGUgcGxhbmFyIGRhdGEgYWZ0ZXIgYzJwCisgICAgICovCisKK3N0YXRpYyBjb25zdCBpbnQgcGVybV9jMnBfMzJ4OFs4XSA9IHsgNywgNSwgMywgMSwgNiwgNCwgMiwgMCB9OworCisKKyAgICAvKgorICAgICAqICBTdG9yZSBhIGZ1bGwgYmxvY2sgb2YgcGxhbmFyIGRhdGEgYWZ0ZXIgYzJwIGNvbnZlcnNpb24KKyAgICAgKi8KKworc3RhdGljIGlubGluZSB2b2lkIHN0b3JlX3BsYW5hcih2b2lkICpkc3QsIHUzMiBkc3RfaW5jLCB1MzIgYnBwLCB1MzIgZFs4XSkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBicHA7IGkrKywgZHN0ICs9IGRzdF9pbmMpCisJCXB1dF91bmFsaWduZWRfYmUzMihkW3Blcm1fYzJwXzMyeDhbaV1dLCBkc3QpOworfQorCisKKyAgICAvKgorICAgICAqICBTdG9yZSBhIHBhcnRpYWwgYmxvY2sgb2YgcGxhbmFyIGRhdGEgYWZ0ZXIgYzJwIGNvbnZlcnNpb24KKyAgICAgKi8KKworc3RhdGljIGlubGluZSB2b2lkIHN0b3JlX3BsYW5hcl9tYXNrZWQodm9pZCAqZHN0LCB1MzIgZHN0X2luYywgdTMyIGJwcCwKKwkJCQkgICAgICAgdTMyIGRbOF0sIHUzMiBtYXNrKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IGJwcDsgaSsrLCBkc3QgKz0gZHN0X2luYykKKwkJcHV0X3VuYWxpZ25lZF9iZTMyKGNvbXAoZFtwZXJtX2MycF8zMng4W2ldXSwKKwkJCQkJZ2V0X3VuYWxpZ25lZF9iZTMyKGRzdCksIG1hc2spLAorCQkJCSAgIGRzdCk7Cit9CisKKworICAgIC8qCisgICAgICogIGMycF9wbGFuYXIgLSBDb3B5IDgtYml0IGNodW5reSBpbWFnZSBkYXRhIHRvIGEgcGxhbmFyIGZyYW1lIGJ1ZmZlcgorICAgICAqICBAZHN0OiBTdGFydGluZyBhZGRyZXNzIG9mIHRoZSBwbGFuYXIgZnJhbWUgYnVmZmVyCisgICAgICogIEBkeDogSG9yaXpvbnRhbCBkZXN0aW5hdGlvbiBvZmZzZXQgKGluIHBpeGVscykKKyAgICAgKiAgQGR5OiBWZXJ0aWNhbCBkZXN0aW5hdGlvbiBvZmZzZXQgKGluIHBpeGVscykKKyAgICAgKiAgQHdpZHRoOiBJbWFnZSB3aWR0aCAoaW4gcGl4ZWxzKQorICAgICAqICBAaGVpZ2h0OiBJbWFnZSBoZWlnaHQgKGluIHBpeGVscykKKyAgICAgKiAgQGRzdF9uZXh0bGluZTogRnJhbWUgYnVmZmVyIG9mZnNldCB0byB0aGUgbmV4dCBsaW5lIChpbiBieXRlcykKKyAgICAgKiAgQGRzdF9uZXh0cGxhbmU6IEZyYW1lIGJ1ZmZlciBvZmZzZXQgdG8gdGhlIG5leHQgcGxhbmUgKGluIGJ5dGVzKQorICAgICAqICBAc3JjX25leHRsaW5lOiBJbWFnZSBvZmZzZXQgdG8gdGhlIG5leHQgbGluZSAoaW4gYnl0ZXMpCisgICAgICogIEBicHA6IEJpdHMgcGVyIHBpeGVsIG9mIHRoZSBwbGFuYXIgZnJhbWUgYnVmZmVyICgxLTgpCisgICAgICovCisKK3ZvaWQgYzJwX3BsYW5hcih2b2lkICpkc3QsIGNvbnN0IHZvaWQgKnNyYywgdTMyIGR4LCB1MzIgZHksIHUzMiB3aWR0aCwKKwkJdTMyIGhlaWdodCwgdTMyIGRzdF9uZXh0bGluZSwgdTMyIGRzdF9uZXh0cGxhbmUsCisJCXUzMiBzcmNfbmV4dGxpbmUsIHUzMiBicHApCit7CisJdW5pb24geworCQl1OCBwaXhlbHNbMzJdOworCQl1MzIgd29yZHNbOF07CisJfSBkOworCXUzMiBkc3RfaWR4LCBmaXJzdCwgbGFzdCwgdzsKKwljb25zdCB1OCAqYzsKKwl2b2lkICpwOworCisJZHN0ICs9IGR5KmRzdF9uZXh0bGluZSsoZHggJiB+MzEpOworCWRzdF9pZHggPSBkeCAlIDMyOworCWZpcnN0ID0gMHhmZmZmZmZmZlUgPj4gZHN0X2lkeDsKKwlsYXN0ID0gfigweGZmZmZmZmZmVSA+PiAoKGRzdF9pZHgrd2lkdGgpICUgMzIpKTsKKwl3aGlsZSAoaGVpZ2h0LS0pIHsKKwkJYyA9IHNyYzsKKwkJcCA9IGRzdDsKKwkJdyA9IHdpZHRoOworCQlpZiAoZHN0X2lkeCt3aWR0aCA8PSAzMikgeworCQkJLyogU2luZ2xlIGRlc3RpbmF0aW9uIHdvcmQgKi8KKwkJCWZpcnN0ICY9IGxhc3Q7CisJCQltZW1zZXQoZC5waXhlbHMsIDAsIHNpemVvZihkKSk7CisJCQltZW1jcHkoZC5waXhlbHMrZHN0X2lkeCwgYywgd2lkdGgpOworCQkJYyArPSB3aWR0aDsKKwkJCWMycF8zMng4KGQud29yZHMpOworCQkJc3RvcmVfcGxhbmFyX21hc2tlZChwLCBkc3RfbmV4dHBsYW5lLCBicHAsIGQud29yZHMsCisJCQkJCSAgICBmaXJzdCk7CisJCQlwICs9IDQ7CisJCX0gZWxzZSB7CisJCQkvKiBNdWx0aXBsZSBkZXN0aW5hdGlvbiB3b3JkcyAqLworCQkJdyA9IHdpZHRoOworCQkJLyogTGVhZGluZyBiaXRzICovCisJCQlpZiAoZHN0X2lkeCkgeworCQkJCXcgPSAzMiAtIGRzdF9pZHg7CisJCQkJbWVtc2V0KGQucGl4ZWxzLCAwLCBkc3RfaWR4KTsKKwkJCQltZW1jcHkoZC5waXhlbHMrZHN0X2lkeCwgYywgdyk7CisJCQkJYyArPSB3OworCQkJCWMycF8zMng4KGQud29yZHMpOworCQkJCXN0b3JlX3BsYW5hcl9tYXNrZWQocCwgZHN0X25leHRwbGFuZSwgYnBwLAorCQkJCQkJICAgIGQud29yZHMsIGZpcnN0KTsKKwkJCQlwICs9IDQ7CisJCQkJdyA9IHdpZHRoLXc7CisJCQl9CisJCQkvKiBNYWluIGNodW5rICovCisJCQl3aGlsZSAodyA+PSAzMikgeworCQkJCW1lbWNweShkLnBpeGVscywgYywgMzIpOworCQkJCWMgKz0gMzI7CisJCQkJYzJwXzMyeDgoZC53b3Jkcyk7CisJCQkJc3RvcmVfcGxhbmFyKHAsIGRzdF9uZXh0cGxhbmUsIGJwcCwgZC53b3Jkcyk7CisJCQkJcCArPSA0OworCQkJCXcgLT0gMzI7CisJCQl9CisJCQkvKiBUcmFpbGluZyBiaXRzICovCisJCQl3ICU9IDMyOworCQkJaWYgKHcgPiAwKSB7CisJCQkJbWVtY3B5KGQucGl4ZWxzLCBjLCB3KTsKKwkJCQltZW1zZXQoZC5waXhlbHMrdywgMCwgMzItdyk7CisJCQkJYzJwXzMyeDgoZC53b3Jkcyk7CisJCQkJc3RvcmVfcGxhbmFyX21hc2tlZChwLCBkc3RfbmV4dHBsYW5lLCBicHAsCisJCQkJCQkgICAgZC53b3JkcywgbGFzdCk7CisJCQl9CisJCX0KKwkJc3JjICs9IHNyY19uZXh0bGluZTsKKwkJZHN0ICs9IGRzdF9uZXh0bGluZTsKKwl9Cit9CitFWFBPUlRfU1lNQk9MX0dQTChjMnBfcGxhbmFyKTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9jb25zb2xlL2ZiY29uLmMgYi9kcml2ZXJzL3ZpZGVvL2NvbnNvbGUvZmJjb24uYwppbmRleCA0YmNmZjgxLi4xNjU3Yjk2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2NvbnNvbGUvZmJjb24uYworKysgYi9kcml2ZXJzL3ZpZGVvL2NvbnNvbGUvZmJjb24uYwpAQCAtNzgsMTMgKzc4LDYgQEAKICNpbmNsdWRlIDxhc20vZmIuaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgotI2lmZGVmIENPTkZJR19BVEFSSQotI2luY2x1ZGUgPGFzbS9hdGFyaWludHMuaD4KLSNlbmRpZgotI2lmIGRlZmluZWQoX19tYzY4MDAwX18pCi0jaW5jbHVkZSA8YXNtL21hY2hkZXAuaD4KLSNpbmNsdWRlIDxhc20vc2V0dXAuaD4KLSNlbmRpZgogCiAjaW5jbHVkZSAiZmJjb24uaCIKIApAQCAtMTU1LDkgKzE0OCw2IEBACiAKICNkZWZpbmUgQ1VSU09SX0RSQVdfREVMQVkJCSgxKQogCi0vKiAjIFZCTCBpbnRzIGJldHdlZW4gY3Vyc29yIHN0YXRlIGNoYW5nZXMgKi8KLSNkZWZpbmUgQVRBUklfQ1VSU09SX0JMSU5LX1JBVEUJCSg0MikKLQogc3RhdGljIGludCB2YmxfY3Vyc29yX2NudDsKIHN0YXRpYyBpbnQgZmJjb25fY3Vyc29yX25vYmxpbms7CiAKQEAgLTQwMywyMCArMzkzLDYgQEAKIAlyZWxlYXNlX2NvbnNvbGVfc2VtKCk7CiB9CiAKLSNpZmRlZiBDT05GSUdfQVRBUkkKLXN0YXRpYyBpbnQgY3Vyc29yX2JsaW5rX3JhdGU7Ci1zdGF0aWMgaXJxcmV0dXJuX3QgZmJfdmJsX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGV2X2lkKQotewotCXN0cnVjdCBmYl9pbmZvICppbmZvID0gZGV2X2lkOwotCi0JaWYgKHZibF9jdXJzb3JfY250ICYmIC0tdmJsX2N1cnNvcl9jbnQgPT0gMCkgewotCQlzY2hlZHVsZV93b3JrKCZpbmZvLT5xdWV1ZSk7CQotCQl2YmxfY3Vyc29yX2NudCA9IGN1cnNvcl9ibGlua19yYXRlOyAKLQl9Ci0JcmV0dXJuIElSUV9IQU5ETEVEOwotfQotI2VuZGlmCi0JCiBzdGF0aWMgdm9pZCBjdXJzb3JfdGltZXJfaGFuZGxlcih1bnNpZ25lZCBsb25nIGRldl9hZGRyKQogewogCXN0cnVjdCBmYl9pbmZvICppbmZvID0gKHN0cnVjdCBmYl9pbmZvICopIGRldl9hZGRyOwpAQCAtMTAxNywxNSArOTkzLDYgQEAKIAkJaW5mby0+dmFyLnlyZXMsCiAJCWluZm8tPnZhci5iaXRzX3Blcl9waXhlbCk7CiAKLSNpZmRlZiBDT05GSUdfQVRBUkkKLQlpZiAoTUFDSF9JU19BVEFSSSkgewotCQljdXJzb3JfYmxpbmtfcmF0ZSA9IEFUQVJJX0NVUlNPUl9CTElOS19SQVRFOwotCQkodm9pZClyZXF1ZXN0X2lycShJUlFfQVVUT180LCBmYl92YmxfaGFuZGxlciwKLQkJCQlJUlFfVFlQRV9QUklPLCAiZnJhbWVidWZmZXIgdmJsIiwKLQkJCQlpbmZvKTsKLQl9Ci0jZW5kaWYgLyogQ09ORklHX0FUQVJJICovCi0KIAlmYmNvbl9hZGRfY3Vyc29yX3RpbWVyKGluZm8pOwogCWZiY29uX2hhc19leGl0ZWQgPSAwOwogCXJldHVybiBkaXNwbGF5X2Rlc2M7CkBAIC0zNDU0LDExICszNDIxLDYgQEAKIAlpZiAoZmJjb25faGFzX2V4aXRlZCkKIAkJcmV0dXJuOwogCi0jaWZkZWYgQ09ORklHX0FUQVJJCi0JaWYgKE1BQ0hfSVNfQVRBUkkpCi0JCWZyZWVfaXJxKElSUV9BVVRPXzQsIGZiX3ZibF9oYW5kbGVyKTsKLSNlbmRpZgotCiAJa2ZyZWUoKHZvaWQgKilzb2Z0YmFja19idWYpOwogCXNvZnRiYWNrX2J1ZiA9IDBVTDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9jb25zb2xlL3ZnYWNvbi5jIGIvZHJpdmVycy92aWRlby9jb25zb2xlL3ZnYWNvbi5jCmluZGV4IGU2MjEwNzIuLmQwMTJlZGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vY29uc29sZS92Z2Fjb24uYworKysgYi9kcml2ZXJzL3ZpZGVvL2NvbnNvbGUvdmdhY29uLmMKQEAgLTEzMzIsNyArMTMzMiw3IEBACiAJCWMtPnZjX3kgPSBzY3JlZW5faW5mby5vcmlnX3k7CiAJfQogCi0JLyogV2UgY2FuJ3QgY29weSBpbiBtb3JlIHRoZW4gdGhlIHNpemUgb2YgdGhlIHZpZGVvIGJ1ZmZlciwKKwkvKiBXZSBjYW4ndCBjb3B5IGluIG1vcmUgdGhhbiB0aGUgc2l6ZSBvZiB0aGUgdmlkZW8gYnVmZmVyLAogCSAqIG9yIHdlJ2xsIGJlIGNvcHlpbmcgaW4gVkdBIEJJT1MgKi8KIAogCWlmICghdmdhX2lzX2dmeCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vcHMzZmIuYyBiL2RyaXZlcnMvdmlkZW8vcHMzZmIuYwppbmRleCAzOGFjODA1Li44N2Y4MjZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3BzM2ZiLmMKKysrIGIvZHJpdmVycy92aWRlby9wczNmYi5jCkBAIC0xMDA2LDcgKzEwMDYsNyBAQAogCQkJX19mdW5jX18sIHN0YXR1cyk7CiAJCXJldHVybiAtRU5YSU87CiAJfQotCWRldl9kYmcoZGV2LCAidmlkZW86JXAgaW9pZjolbHggbHBhcjolbHggc2l6ZTolbHhcbiIsCisJZGV2X2RiZyhkZXYsICJ2aWRlbzolcCBpb2lmOiVseCBscGFyOiVsbHggc2l6ZTolbHhcbiIsCiAJCXBzM2ZiX3ZpZGVvbWVtb3J5LmFkZHJlc3MsIEdQVV9JT0lGLCB4ZHJfbHBhciwKIAkJcHMzZmJfdmlkZW9tZW1vcnkuc2l6ZSk7CiAKQEAgLTExMzMsNyArMTEzMyw3IEBACiAJCQlfX2Z1bmNfXywgc3RhdHVzKTsKIAkJZ290byBlcnI7CiAJfQotCWRldl9kYmcoJmRldi0+Y29yZSwgImRkcjpscGFyOjB4JWx4XG4iLCBkZHJfbHBhcik7CisJZGV2X2RiZygmZGV2LT5jb3JlLCAiZGRyOmxwYXI6MHglbGx4XG4iLCBkZHJfbHBhcik7CiAKIAlzdGF0dXMgPSBsdjFfZ3B1X2NvbnRleHRfYWxsb2NhdGUocHMzZmIubWVtb3J5X2hhbmRsZSwgMCwKIAkJCQkJICAmcHMzZmIuY29udGV4dF9oYW5kbGUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3cxL21hc3RlcnMvS2NvbmZpZyBiL2RyaXZlcnMvdzEvbWFzdGVycy9LY29uZmlnCmluZGV4IDkwNjE2ODIuLjk2ZDJmOGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdzEvbWFzdGVycy9LY29uZmlnCisrKyBiL2RyaXZlcnMvdzEvbWFzdGVycy9LY29uZmlnCkBAIC0zNCw2ICszNCwxMiBAQAogCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQogCSAgd2lsbCBiZSBjYWxsZWQgZHMyNDgyLgogCitjb25maWcgVzFfTUFTVEVSX01YQworCXRyaXN0YXRlICJGcmVlc2NhbGUgTVhDIDEtd2lyZSBidXNtYXN0ZXIiCisJZGVwZW5kcyBvbiBXMSAmJiBBUkNIX01YQworCWhlbHAKKwkgIFNheSBZIGhlcmUgdG8gZW5hYmxlIE1YQyAxLXdpcmUgaG9zdAorCiBjb25maWcgVzFfTUFTVEVSX0RTMVdNCiAJdHJpc3RhdGUgIk1heGltIERTMVdNIDEtd2lyZSBidXNtYXN0ZXIiCiAJZGVwZW5kcyBvbiBXMSAmJiBBUk0gJiYgSEFWRV9DTEsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdzEvbWFzdGVycy9NYWtlZmlsZSBiL2RyaXZlcnMvdzEvbWFzdGVycy9NYWtlZmlsZQppbmRleCBiYzQ3MTRhLi5jNWEzZTk2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3cxL21hc3RlcnMvTWFrZWZpbGUKKysrIGIvZHJpdmVycy93MS9tYXN0ZXJzL01ha2VmaWxlCkBAIC01LDYgKzUsOCBAQAogb2JqLSQoQ09ORklHX1cxX01BU1RFUl9NQVRST1gpCQkrPSBtYXRyb3hfdzEubwogb2JqLSQoQ09ORklHX1cxX01BU1RFUl9EUzI0OTApCQkrPSBkczI0OTAubwogb2JqLSQoQ09ORklHX1cxX01BU1RFUl9EUzI0ODIpCQkrPSBkczI0ODIubworb2JqLSQoQ09ORklHX1cxX01BU1RFUl9NWEMpCQkrPSBteGNfdzEubworCiBvYmotJChDT05GSUdfVzFfTUFTVEVSX0RTMVdNKQkJKz0gZHMxd20ubwogb2JqLSQoQ09ORklHX1cxX01BU1RFUl9HUElPKQkJKz0gdzEtZ3Bpby5vCiBvYmotJChDT05GSUdfSERRX01BU1RFUl9PTUFQKQkJKz0gb21hcF9oZHEubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy93MS9tYXN0ZXJzL214Y193MS5jIGIvZHJpdmVycy93MS9tYXN0ZXJzL214Y193MS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5ZDc0ZDAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3cxL21hc3RlcnMvbXhjX3cxLmMKQEAgLTAsMCArMSwyMTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNS0yMDA4IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwOCBMdW90YW8gRnUsIGtlcm5lbEBwZW5ndXRyb25peC5kZQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgorICogb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSwgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorCisjaW5jbHVkZSAiLi4vdzEuaCIKKyNpbmNsdWRlICIuLi93MV9pbnQuaCIKKyNpbmNsdWRlICIuLi93MV9sb2cuaCIKKworLyogQWNjb3JkaW5nIHRvIHRoZSBteDI3IERhdGFzaGVldCB0aGUgcmVzZXQgcHJvY2VkdXJlIHNob3VsZCB0YWtlIHVwIHRvIGFib3V0CisgKiAxMzUwdXMuIFdlIHNldCB0aGUgdGltZW91dCB0byA1MDAqMTAwdXMgPSA1MG1zIGZvciBzdXJlICovCisjZGVmaW5lIE1YQ19XMV9SRVNFVF9USU1FT1VUIDUwMAorCisvKgorICogTVhDIFcxIFJlZ2lzdGVyIG9mZnNldHMKKyAqLworI2RlZmluZSBNWENfVzFfQ09OVFJPTCAgICAgICAgICAweDAwCisjZGVmaW5lIE1YQ19XMV9USU1FX0RJVklERVIgICAgIDB4MDIKKyNkZWZpbmUgTVhDX1cxX1JFU0VUICAgICAgICAgICAgMHgwNAorI2RlZmluZSBNWENfVzFfQ09NTUFORCAgICAgICAgICAweDA2CisjZGVmaW5lIE1YQ19XMV9UWFJYICAgICAgICAgICAgIDB4MDgKKyNkZWZpbmUgTVhDX1cxX0lOVEVSUlVQVCAgICAgICAgMHgwQQorI2RlZmluZSBNWENfVzFfSU5URVJSVVBUX0VOICAgICAweDBDCisKK3N0cnVjdCBteGNfdzFfZGV2aWNlIHsKKwl2b2lkIF9faW9tZW0gKnJlZ3M7CisJdW5zaWduZWQgaW50IGNsa2RpdjsKKwlzdHJ1Y3QgY2xrICpjbGs7CisJc3RydWN0IHcxX2J1c19tYXN0ZXIgYnVzX21hc3RlcjsKK307CisKKy8qCisgKiB0aGlzIGlzIHRoZSBsb3cgbGV2ZWwgcm91dGluZSB0bworICogcmVzZXQgdGhlIGRldmljZSBvbiB0aGUgT25lIFdpcmUgaW50ZXJmYWNlCisgKiBvbiB0aGUgaGFyZHdhcmUKKyAqLworc3RhdGljIHU4IG14Y193MV9kczJfcmVzZXRfYnVzKHZvaWQgKmRhdGEpCit7CisJdTggcmVnX3ZhbDsKKwl1bnNpZ25lZCBpbnQgdGltZW91dF9jbnQgPSAwOworCXN0cnVjdCBteGNfdzFfZGV2aWNlICpkZXYgPSBkYXRhOworCisJX19yYXdfd3JpdGViKDB4ODAsIChkZXYtPnJlZ3MgKyBNWENfVzFfQ09OVFJPTCkpOworCisJd2hpbGUgKDEpIHsKKwkJcmVnX3ZhbCA9IF9fcmF3X3JlYWRiKGRldi0+cmVncyArIE1YQ19XMV9DT05UUk9MKTsKKworCQlpZiAoKChyZWdfdmFsID4+IDcpICYgMHgxKSA9PSAwIHx8CisJCSAgICB0aW1lb3V0X2NudCA+IE1YQ19XMV9SRVNFVF9USU1FT1VUKQorCQkJYnJlYWs7CisJCWVsc2UKKwkJCXRpbWVvdXRfY250Kys7CisKKwkJdWRlbGF5KDEwMCk7CisJfQorCXJldHVybiAocmVnX3ZhbCA+PiA3KSAmIDB4MTsKK30KKworLyoKKyAqIHRoaXMgaXMgdGhlIGxvdyBsZXZlbCByb3V0aW5lIHRvIHJlYWQvd3JpdGUgYSBiaXQgb24gdGhlIE9uZSBXaXJlCisgKiBpbnRlcmZhY2Ugb24gdGhlIGhhcmR3YXJlLiBJdCBkb2VzIHdyaXRlIDAgaWYgcGFyYW1ldGVyIGJpdCBpcyBzZXQKKyAqIHRvIDAsIG90aGVyd2lzZSBhIHdyaXRlIDEvcmVhZC4KKyAqLworc3RhdGljIHU4IG14Y193MV9kczJfdG91Y2hfYml0KHZvaWQgKmRhdGEsIHU4IGJpdCkKK3sKKwlzdHJ1Y3QgbXhjX3cxX2RldmljZSAqbWRldiA9IGRhdGE7CisJdm9pZCBfX2lvbWVtICpjdHJsX2FkZHIgPSBtZGV2LT5yZWdzICsgTVhDX1cxX0NPTlRST0w7CisJdW5zaWduZWQgaW50IHRpbWVvdXRfY250ID0gNDAwOyAvKiBUYWtlcyBtYXguIDEyMHVzIGFjY29yZGluZyB0bworCQkJCQkgKiBkYXRhc2hlZXQuCisJCQkJCSAqLworCisJX19yYXdfd3JpdGViKCgxIDw8ICg1IC0gYml0KSksIGN0cmxfYWRkcik7CisKKwl3aGlsZSAodGltZW91dF9jbnQtLSkgeworCQlpZiAoISgoX19yYXdfcmVhZGIoY3RybF9hZGRyKSA+PiAoNSAtIGJpdCkpICYgMHgxKSkKKwkJCWJyZWFrOworCisJCXVkZWxheSgxKTsKKwl9CisKKwlyZXR1cm4gKChfX3Jhd19yZWFkYihjdHJsX2FkZHIpKSA+PiAzKSAmIDB4MTsKK30KKworc3RhdGljIGludCBfX2luaXQgbXhjX3cxX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IG14Y193MV9kZXZpY2UgKm1kZXY7CisJc3RydWN0IHJlc291cmNlICpyZXM7CisJaW50IGVyciA9IDA7CisKKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCWlmICghcmVzKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCW1kZXYgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbXhjX3cxX2RldmljZSksIEdGUF9LRVJORUwpOworCWlmICghbWRldikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwltZGV2LT5jbGsgPSBjbGtfZ2V0KCZwZGV2LT5kZXYsICJvd2lyZV9jbGsiKTsKKwlpZiAoIW1kZXYtPmNsaykgeworCQllcnIgPSAtRU5PREVWOworCQlnb3RvIGZhaWxlZF9jbGs7CisJfQorCisJbWRldi0+Y2xrZGl2ID0gKGNsa19nZXRfcmF0ZShtZGV2LT5jbGspIC8gMTAwMDAwMCkgLSAxOworCisJcmVzID0gcmVxdWVzdF9tZW1fcmVnaW9uKHJlcy0+c3RhcnQsIHJlc291cmNlX3NpemUocmVzKSwKKwkJCQkibXhjX3cxIik7CisJaWYgKCFyZXMpIHsKKwkJZXJyID0gLUVCVVNZOworCQlnb3RvIGZhaWxlZF9yZXE7CisJfQorCisJbWRldi0+cmVncyA9IGlvcmVtYXAocmVzLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShyZXMpKTsKKwlpZiAoIW1kZXYtPnJlZ3MpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJDYW5ub3QgbWFwIGZyYW1lIGJ1ZmZlciByZWdpc3RlcnNcbiIpOworCQlnb3RvIGZhaWxlZF9pb3JlbWFwOworCX0KKworCWNsa19lbmFibGUobWRldi0+Y2xrKTsKKwlfX3Jhd193cml0ZWIobWRldi0+Y2xrZGl2LCBtZGV2LT5yZWdzICsgTVhDX1cxX1RJTUVfRElWSURFUik7CisKKwltZGV2LT5idXNfbWFzdGVyLmRhdGEgPSBtZGV2OworCW1kZXYtPmJ1c19tYXN0ZXIucmVzZXRfYnVzID0gbXhjX3cxX2RzMl9yZXNldF9idXM7CisJbWRldi0+YnVzX21hc3Rlci50b3VjaF9iaXQgPSBteGNfdzFfZHMyX3RvdWNoX2JpdDsKKworCWVyciA9IHcxX2FkZF9tYXN0ZXJfZGV2aWNlKCZtZGV2LT5idXNfbWFzdGVyKTsKKworCWlmIChlcnIpCisJCWdvdG8gZmFpbGVkX2FkZDsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIG1kZXYpOworCXJldHVybiAwOworCitmYWlsZWRfYWRkOgorCWlvdW5tYXAobWRldi0+cmVncyk7CitmYWlsZWRfaW9yZW1hcDoKKwlyZWxlYXNlX21lbV9yZWdpb24ocmVzLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShyZXMpKTsKK2ZhaWxlZF9yZXE6CisJY2xrX3B1dChtZGV2LT5jbGspOworZmFpbGVkX2NsazoKKwlrZnJlZShtZGV2KTsKKwlyZXR1cm4gZXJyOworfQorCisvKgorICogZGlzYXNzb2NpYXRlIHRoZSB3MSBkZXZpY2UgZnJvbSB0aGUgZHJpdmVyCisgKi8KK3N0YXRpYyBpbnQgbXhjX3cxX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBteGNfdzFfZGV2aWNlICptZGV2ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IHJlc291cmNlICpyZXM7CisKKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCisJdzFfcmVtb3ZlX21hc3Rlcl9kZXZpY2UoJm1kZXYtPmJ1c19tYXN0ZXIpOworCisJaW91bm1hcChtZGV2LT5yZWdzKTsKKwlyZWxlYXNlX21lbV9yZWdpb24ocmVzLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShyZXMpKTsKKwljbGtfZGlzYWJsZShtZGV2LT5jbGspOworCWNsa19wdXQobWRldi0+Y2xrKTsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIG14Y193MV9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJICAgLm5hbWUgPSAibXhjX3cxIiwKKwl9LAorCS5wcm9iZSA9IG14Y193MV9wcm9iZSwKKwkucmVtb3ZlID0gbXhjX3cxX3JlbW92ZSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IG14Y193MV9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmbXhjX3cxX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIG14Y193MV9leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJm14Y193MV9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChteGNfdzFfaW5pdCk7Cittb2R1bGVfZXhpdChteGNfdzFfZXhpdCk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BVVRIT1IoIkZyZWVzY2FsZSBTZW1pY29uZHVjdG9ycyBJbmMiKTsKK01PRFVMRV9ERVNDUklQVElPTigiRHJpdmVyIGZvciBPbmUtV2lyZSBvbiBNWEMiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdzEvdzEuaCBiL2RyaXZlcnMvdzEvdzEuaAppbmRleCA5NzMwNGJkLi5kOGE5NzA5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3cxL3cxLmgKKysrIGIvZHJpdmVycy93MS93MS5oCkBAIC0yMTAsNiArMjEwLDcgQEAKIGludCB3MV9yZXNldF9idXMoc3RydWN0IHcxX21hc3RlciAqKTsKIHU4IHcxX2NhbGNfY3JjOCh1OCAqLCBpbnQpOwogdm9pZCB3MV93cml0ZV9ibG9jayhzdHJ1Y3QgdzFfbWFzdGVyICosIGNvbnN0IHU4ICosIGludCk7Cit2b2lkIHcxX3RvdWNoX2Jsb2NrKHN0cnVjdCB3MV9tYXN0ZXIgKiwgdTggKiwgaW50KTsKIHU4IHcxX3JlYWRfYmxvY2soc3RydWN0IHcxX21hc3RlciAqLCB1OCAqLCBpbnQpOwogaW50IHcxX3Jlc2V0X3NlbGVjdF9zbGF2ZShzdHJ1Y3QgdzFfc2xhdmUgKnNsKTsKIHZvaWQgdzFfbmV4dF9wdWxsdXAoc3RydWN0IHcxX21hc3RlciAqLCBpbnQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy93MS93MV9pby5jIGIvZHJpdmVycy93MS93MV9pby5jCmluZGV4IDUxMzljMjUuLjQ0MmJkOGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdzEvdzFfaW8uYworKysgYi9kcml2ZXJzL3cxL3cxX2lvLmMKQEAgLTIzOCw3ICsyMzgsNiBAQAogICogQHBhcmFtIGRldiAgICAgdGhlIG1hc3RlciBkZXZpY2UKICAqIEBwYXJhbSBidWYgICAgIHBvaW50ZXIgdG8gdGhlIGRhdGEgdG8gd3JpdGUKICAqIEBwYXJhbSBsZW4gICAgIHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gd3JpdGUKLSAqIEByZXR1cm4gICAgICAgIHRoZSBieXRlIHJlYWQKICAqLwogdm9pZCB3MV93cml0ZV9ibG9jayhzdHJ1Y3QgdzFfbWFzdGVyICpkZXYsIGNvbnN0IHU4ICpidWYsIGludCBsZW4pCiB7CkBAIC0yNTYsNiArMjU1LDMxIEBACiBFWFBPUlRfU1lNQk9MX0dQTCh3MV93cml0ZV9ibG9jayk7CiAKIC8qKgorICogVG91Y2hlcyBhIHNlcmllcyBvZiBieXRlcy4KKyAqCisgKiBAcGFyYW0gZGV2ICAgICB0aGUgbWFzdGVyIGRldmljZQorICogQHBhcmFtIGJ1ZiAgICAgcG9pbnRlciB0byB0aGUgZGF0YSB0byB3cml0ZQorICogQHBhcmFtIGxlbiAgICAgdGhlIG51bWJlciBvZiBieXRlcyB0byB3cml0ZQorICovCit2b2lkIHcxX3RvdWNoX2Jsb2NrKHN0cnVjdCB3MV9tYXN0ZXIgKmRldiwgdTggKmJ1ZiwgaW50IGxlbikKK3sKKwlpbnQgaSwgajsKKwl1OCB0bXA7CisKKwlmb3IgKGkgPSAwOyBpIDwgbGVuOyArK2kpIHsKKwkJdG1wID0gMDsKKwkJZm9yIChqID0gMDsgaiA8IDg7ICsraikgeworCQkJaWYgKGogPT0gNykKKwkJCQl3MV9wcmVfd3JpdGUoZGV2KTsKKwkJCXRtcCB8PSB3MV90b3VjaF9iaXQoZGV2LCAoYnVmW2ldID4+IGopICYgMHgxKSA8PCBqOworCQl9CisKKwkJYnVmW2ldID0gdG1wOworCX0KK30KK0VYUE9SVF9TWU1CT0xfR1BMKHcxX3RvdWNoX2Jsb2NrKTsKKworLyoqCiAgKiBSZWFkcyBhIHNlcmllcyBvZiBieXRlcy4KICAqCiAgKiBAcGFyYW0gZGV2ICAgICB0aGUgbWFzdGVyIGRldmljZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy93MS93MV9uZXRsaW5rLmMgYi9kcml2ZXJzL3cxL3cxX25ldGxpbmsuYwppbmRleCA2NWM1ZWJkLi5mZGY3Mjg1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3cxL3cxX25ldGxpbmsuYworKysgYi9kcml2ZXJzL3cxL3cxX25ldGxpbmsuYwpAQCAtNDcsMjEgKzQ3LDU2IEBACiAJY25fbmV0bGlua19zZW5kKG0sIDAsIEdGUF9LRVJORUwpOwogfQogCi1zdGF0aWMgaW50IHcxX3Byb2Nlc3NfY29tbWFuZF9tYXN0ZXIoc3RydWN0IHcxX21hc3RlciAqZGV2LCBzdHJ1Y3QgY25fbXNnICptc2csCi0JCXN0cnVjdCB3MV9uZXRsaW5rX21zZyAqaGRyLCBzdHJ1Y3QgdzFfbmV0bGlua19jbWQgKmNtZCkKK3N0YXRpYyB2b2lkIHcxX3NlbmRfc2xhdmUoc3RydWN0IHcxX21hc3RlciAqZGV2LCB1NjQgcm4pCiB7Ci0JZGV2X2RiZygmZGV2LT5kZXYsICIlczogJXM6IGNtZD0lMDJ4LCBsZW49JXUuXG4iLAotCQlfX2Z1bmNfXywgZGV2LT5uYW1lLCBjbWQtPmNtZCwgY21kLT5sZW4pOworCXN0cnVjdCBjbl9tc2cgKm1zZyA9IGRldi0+cHJpdjsKKwlzdHJ1Y3QgdzFfbmV0bGlua19tc2cgKmhkciA9IChzdHJ1Y3QgdzFfbmV0bGlua19tc2cgKikobXNnICsgMSk7CisJc3RydWN0IHcxX25ldGxpbmtfY21kICpjbWQgPSAoc3RydWN0IHcxX25ldGxpbmtfY21kICopKGhkciArIDEpOworCWludCBhdmFpbDsKIAotCWlmIChjbWQtPmNtZCAhPSBXMV9DTURfU0VBUkNIICYmIGNtZC0+Y21kICE9IFcxX0NNRF9BTEFSTV9TRUFSQ0gpCi0JCXJldHVybiAtRUlOVkFMOworCWF2YWlsID0gZGV2LT5wcml2X3NpemUgLSBjbWQtPmxlbjsKIAotCXcxX3NlYXJjaF9wcm9jZXNzKGRldiwgKGNtZC0+Y21kID09IFcxX0NNRF9BTEFSTV9TRUFSQ0gpP1cxX0FMQVJNX1NFQVJDSDpXMV9TRUFSQ0gpOworCWlmIChhdmFpbCA+IDgpIHsKKwkJdTY0ICpkYXRhID0gKHZvaWQgKikoY21kICsgMSkgKyBjbWQtPmxlbjsKKworCQkqZGF0YSA9IHJuOworCQljbWQtPmxlbiArPSA4OworCQloZHItPmxlbiArPSA4OworCQltc2ctPmxlbiArPSA4OworCQlyZXR1cm47CisJfQorCisJbXNnLT5hY2srKzsKKwljbl9uZXRsaW5rX3NlbmQobXNnLCAwLCBHRlBfS0VSTkVMKTsKKworCW1zZy0+bGVuID0gc2l6ZW9mKHN0cnVjdCB3MV9uZXRsaW5rX21zZykgKyBzaXplb2Yoc3RydWN0IHcxX25ldGxpbmtfY21kKTsKKwloZHItPmxlbiA9IHNpemVvZihzdHJ1Y3QgdzFfbmV0bGlua19jbWQpOworCWNtZC0+bGVuID0gMDsKK30KKworc3RhdGljIGludCB3MV9wcm9jZXNzX3NlYXJjaF9jb21tYW5kKHN0cnVjdCB3MV9tYXN0ZXIgKmRldiwgc3RydWN0IGNuX21zZyAqbXNnLAorCQl1bnNpZ25lZCBpbnQgYXZhaWwpCit7CisJc3RydWN0IHcxX25ldGxpbmtfbXNnICpoZHIgPSAoc3RydWN0IHcxX25ldGxpbmtfbXNnICopKG1zZyArIDEpOworCXN0cnVjdCB3MV9uZXRsaW5rX2NtZCAqY21kID0gKHN0cnVjdCB3MV9uZXRsaW5rX2NtZCAqKShoZHIgKyAxKTsKKwlpbnQgc2VhcmNoX3R5cGUgPSAoY21kLT5jbWQgPT0gVzFfQ01EX0FMQVJNX1NFQVJDSCk/VzFfQUxBUk1fU0VBUkNIOlcxX1NFQVJDSDsKKworCWRldi0+cHJpdiA9IG1zZzsKKwlkZXYtPnByaXZfc2l6ZSA9IGF2YWlsOworCisJdzFfc2VhcmNoX2RldmljZXMoZGV2LCBzZWFyY2hfdHlwZSwgdzFfc2VuZF9zbGF2ZSk7CisKKwltc2ctPmFjayA9IDA7CisJY25fbmV0bGlua19zZW5kKG1zZywgMCwgR0ZQX0tFUk5FTCk7CisKKwlkZXYtPnByaXYgPSBOVUxMOworCWRldi0+cHJpdl9zaXplID0gMDsKKwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHcxX3NlbmRfcmVhZF9yZXBseShzdHJ1Y3QgdzFfc2xhdmUgKnNsLCBzdHJ1Y3QgY25fbXNnICptc2csCi0JCXN0cnVjdCB3MV9uZXRsaW5rX21zZyAqaGRyLCBzdHJ1Y3QgdzFfbmV0bGlua19jbWQgKmNtZCkKK3N0YXRpYyBpbnQgdzFfc2VuZF9yZWFkX3JlcGx5KHN0cnVjdCBjbl9tc2cgKm1zZywgc3RydWN0IHcxX25ldGxpbmtfbXNnICpoZHIsCisJCXN0cnVjdCB3MV9uZXRsaW5rX2NtZCAqY21kKQogewogCXZvaWQgKmRhdGE7CiAJc3RydWN0IHcxX25ldGxpbmtfbXNnICpoOwpAQCAtODUsNyArMTIwLDggQEAKIAltZW1jcHkoYywgY21kLCBzaXplb2Yoc3RydWN0IHcxX25ldGxpbmtfY21kKSk7CiAKIAljbS0+YWNrID0gbXNnLT5zZXErMTsKLQljbS0+bGVuID0gc2l6ZW9mKHN0cnVjdCB3MV9uZXRsaW5rX21zZykgKyBzaXplb2Yoc3RydWN0IHcxX25ldGxpbmtfY21kKSArIGNtZC0+bGVuOworCWNtLT5sZW4gPSBzaXplb2Yoc3RydWN0IHcxX25ldGxpbmtfbXNnKSArCisJCXNpemVvZihzdHJ1Y3QgdzFfbmV0bGlua19jbWQpICsgY21kLT5sZW47CiAKIAloLT5sZW4gPSBzaXplb2Yoc3RydWN0IHcxX25ldGxpbmtfY21kKSArIGNtZC0+bGVuOwogCkBAIC05OCwzNiArMTM0LDE3OCBAQAogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyBpbnQgdzFfcHJvY2Vzc19jb21tYW5kX3NsYXZlKHN0cnVjdCB3MV9zbGF2ZSAqc2wsIHN0cnVjdCBjbl9tc2cgKm1zZywKK3N0YXRpYyBpbnQgdzFfcHJvY2Vzc19jb21tYW5kX2lvKHN0cnVjdCB3MV9tYXN0ZXIgKmRldiwgc3RydWN0IGNuX21zZyAqbXNnLAogCQlzdHJ1Y3QgdzFfbmV0bGlua19tc2cgKmhkciwgc3RydWN0IHcxX25ldGxpbmtfY21kICpjbWQpCiB7CiAJaW50IGVyciA9IDA7CiAKLQlkZXZfZGJnKCZzbC0+bWFzdGVyLT5kZXYsICIlczogJTAyeC4lMDEybGx4LiUwMng6IGNtZD0lMDJ4LCBsZW49JXUuXG4iLAotCQlfX2Z1bmNfXywgc2wtPnJlZ19udW0uZmFtaWx5LCAodW5zaWduZWQgbG9uZyBsb25nKXNsLT5yZWdfbnVtLmlkLCBzbC0+cmVnX251bS5jcmMsCi0JCWNtZC0+Y21kLCBjbWQtPmxlbik7Ci0KIAlzd2l0Y2ggKGNtZC0+Y21kKSB7Ci0JCWNhc2UgVzFfQ01EX1JFQUQ6Ci0JCQl3MV9yZWFkX2Jsb2NrKHNsLT5tYXN0ZXIsIGNtZC0+ZGF0YSwgY21kLT5sZW4pOwotCQkJdzFfc2VuZF9yZWFkX3JlcGx5KHNsLCBtc2csIGhkciwgY21kKTsKLQkJCWJyZWFrOwotCQljYXNlIFcxX0NNRF9XUklURToKLQkJCXcxX3dyaXRlX2Jsb2NrKHNsLT5tYXN0ZXIsIGNtZC0+ZGF0YSwgY21kLT5sZW4pOwotCQkJYnJlYWs7Ci0JCWNhc2UgVzFfQ01EX1NFQVJDSDoKLQkJY2FzZSBXMV9DTURfQUxBUk1fU0VBUkNIOgotCQkJdzFfc2VhcmNoX3Byb2Nlc3Moc2wtPm1hc3RlciwKLQkJCQkJKGNtZC0+Y21kID09IFcxX0NNRF9BTEFSTV9TRUFSQ0gpP1cxX0FMQVJNX1NFQVJDSDpXMV9TRUFSQ0gpOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQllcnIgPSAtMTsKLQkJCWJyZWFrOworCWNhc2UgVzFfQ01EX1RPVUNIOgorCQl3MV90b3VjaF9ibG9jayhkZXYsIGNtZC0+ZGF0YSwgY21kLT5sZW4pOworCQl3MV9zZW5kX3JlYWRfcmVwbHkobXNnLCBoZHIsIGNtZCk7CisJCWJyZWFrOworCWNhc2UgVzFfQ01EX1JFQUQ6CisJCXcxX3JlYWRfYmxvY2soZGV2LCBjbWQtPmRhdGEsIGNtZC0+bGVuKTsKKwkJdzFfc2VuZF9yZWFkX3JlcGx5KG1zZywgaGRyLCBjbWQpOworCQlicmVhazsKKwljYXNlIFcxX0NNRF9XUklURToKKwkJdzFfd3JpdGVfYmxvY2soZGV2LCBjbWQtPmRhdGEsIGNtZC0+bGVuKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZXJyID0gLUVJTlZBTDsKKwkJYnJlYWs7CiAJfQogCiAJcmV0dXJuIGVycjsKIH0KIAorc3RhdGljIGludCB3MV9wcm9jZXNzX2NvbW1hbmRfbWFzdGVyKHN0cnVjdCB3MV9tYXN0ZXIgKmRldiwgc3RydWN0IGNuX21zZyAqcmVxX21zZywKKwkJc3RydWN0IHcxX25ldGxpbmtfbXNnICpyZXFfaGRyLCBzdHJ1Y3QgdzFfbmV0bGlua19jbWQgKnJlcV9jbWQpCit7CisJaW50IGVyciA9IC1FSU5WQUw7CisJc3RydWN0IGNuX21zZyAqbXNnOworCXN0cnVjdCB3MV9uZXRsaW5rX21zZyAqaGRyOworCXN0cnVjdCB3MV9uZXRsaW5rX2NtZCAqY21kOworCisJbXNnID0ga3phbGxvYyhQQUdFX1NJWkUsIEdGUF9LRVJORUwpOworCWlmICghbXNnKQorCQlyZXR1cm4gLUVOT01FTTsKKworCW1zZy0+aWQgPSByZXFfbXNnLT5pZDsKKwltc2ctPnNlcSA9IHJlcV9tc2ctPnNlcTsKKwltc2ctPmFjayA9IDA7CisJbXNnLT5sZW4gPSBzaXplb2Yoc3RydWN0IHcxX25ldGxpbmtfbXNnKSArIHNpemVvZihzdHJ1Y3QgdzFfbmV0bGlua19jbWQpOworCisJaGRyID0gKHN0cnVjdCB3MV9uZXRsaW5rX21zZyAqKShtc2cgKyAxKTsKKwljbWQgPSAoc3RydWN0IHcxX25ldGxpbmtfY21kICopKGhkciArIDEpOworCisJaGRyLT50eXBlID0gVzFfTUFTVEVSX0NNRDsKKwloZHItPmlkID0gcmVxX2hkci0+aWQ7CisJaGRyLT5sZW4gPSBzaXplb2Yoc3RydWN0IHcxX25ldGxpbmtfY21kKTsKKworCWNtZC0+Y21kID0gcmVxX2NtZC0+Y21kOworCWNtZC0+bGVuID0gMDsKKworCXN3aXRjaCAoY21kLT5jbWQpIHsKKwljYXNlIFcxX0NNRF9TRUFSQ0g6CisJY2FzZSBXMV9DTURfQUxBUk1fU0VBUkNIOgorCQllcnIgPSB3MV9wcm9jZXNzX3NlYXJjaF9jb21tYW5kKGRldiwgbXNnLAorCQkJCVBBR0VfU0laRSAtIG1zZy0+bGVuIC0gc2l6ZW9mKHN0cnVjdCBjbl9tc2cpKTsKKwkJYnJlYWs7CisJY2FzZSBXMV9DTURfUkVBRDoKKwljYXNlIFcxX0NNRF9XUklURToKKwljYXNlIFcxX0NNRF9UT1VDSDoKKwkJZXJyID0gdzFfcHJvY2Vzc19jb21tYW5kX2lvKGRldiwgcmVxX21zZywgcmVxX2hkciwgcmVxX2NtZCk7CisJCWJyZWFrOworCWNhc2UgVzFfQ01EX1JFU0VUOgorCQllcnIgPSB3MV9yZXNldF9idXMoZGV2KTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZXJyID0gLUVJTlZBTDsKKwkJYnJlYWs7CisJfQorCisJa2ZyZWUobXNnKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHcxX3Byb2Nlc3NfY29tbWFuZF9zbGF2ZShzdHJ1Y3QgdzFfc2xhdmUgKnNsLCBzdHJ1Y3QgY25fbXNnICptc2csCisJCXN0cnVjdCB3MV9uZXRsaW5rX21zZyAqaGRyLCBzdHJ1Y3QgdzFfbmV0bGlua19jbWQgKmNtZCkKK3sKKwlkZXZfZGJnKCZzbC0+bWFzdGVyLT5kZXYsICIlczogJTAyeC4lMDEybGx4LiUwMng6IGNtZD0lMDJ4LCBsZW49JXUuXG4iLAorCQlfX2Z1bmNfXywgc2wtPnJlZ19udW0uZmFtaWx5LCAodW5zaWduZWQgbG9uZyBsb25nKXNsLT5yZWdfbnVtLmlkLAorCQlzbC0+cmVnX251bS5jcmMsIGNtZC0+Y21kLCBjbWQtPmxlbik7CisKKwlyZXR1cm4gdzFfcHJvY2Vzc19jb21tYW5kX2lvKHNsLT5tYXN0ZXIsIG1zZywgaGRyLCBjbWQpOworfQorCitzdGF0aWMgaW50IHcxX3Byb2Nlc3NfY29tbWFuZF9yb290KHN0cnVjdCBjbl9tc2cgKm1zZywgc3RydWN0IHcxX25ldGxpbmtfbXNnICptY21kKQoreworCXN0cnVjdCB3MV9tYXN0ZXIgKm07CisJc3RydWN0IGNuX21zZyAqY247CisJc3RydWN0IHcxX25ldGxpbmtfbXNnICp3OworCXUzMiAqaWQ7CisKKwlpZiAobWNtZC0+dHlwZSAhPSBXMV9MSVNUX01BU1RFUlMpIHsKKwkJcHJpbnRrKEtFUk5fTk9USUNFICIlczogbXNnOiAleC4leCwgd3JvbmcgdHlwZTogJXUsIGxlbjogJXUuXG4iLAorCQkJX19mdW5jX18sIG1zZy0+aWQuaWR4LCBtc2ctPmlkLnZhbCwgbWNtZC0+dHlwZSwgbWNtZC0+bGVuKTsKKwkJcmV0dXJuIC1FUFJPVE87CisJfQorCisJY24gPSBrbWFsbG9jKFBBR0VfU0laRSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFjbikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwljbi0+aWQuaWR4ID0gQ05fVzFfSURYOworCWNuLT5pZC52YWwgPSBDTl9XMV9WQUw7CisKKwljbi0+c2VxID0gbXNnLT5zZXE7CisJY24tPmFjayA9IDE7CisJY24tPmxlbiA9IHNpemVvZihzdHJ1Y3QgdzFfbmV0bGlua19tc2cpOworCXcgPSAoc3RydWN0IHcxX25ldGxpbmtfbXNnICopKGNuICsgMSk7CisKKwl3LT50eXBlID0gVzFfTElTVF9NQVNURVJTOworCXctPnN0YXR1cyA9IDA7CisJdy0+bGVuID0gMDsKKwlpZCA9ICh1MzIgKikodyArIDEpOworCisJbXV0ZXhfbG9jaygmdzFfbWxvY2spOworCWxpc3RfZm9yX2VhY2hfZW50cnkobSwgJncxX21hc3RlcnMsIHcxX21hc3Rlcl9lbnRyeSkgeworCQlpZiAoY24tPmxlbiArIHNpemVvZigqaWQpID4gUEFHRV9TSVpFIC0gc2l6ZW9mKHN0cnVjdCBjbl9tc2cpKSB7CisJCQljbl9uZXRsaW5rX3NlbmQoY24sIDAsIEdGUF9LRVJORUwpOworCQkJY24tPmFjaysrOworCQkJY24tPmxlbiA9IHNpemVvZihzdHJ1Y3QgdzFfbmV0bGlua19tc2cpOworCQkJdy0+bGVuID0gMDsKKwkJCWlkID0gKHUzMiAqKSh3ICsgMSk7CisJCX0KKworCQkqaWQgPSBtLT5pZDsKKwkJdy0+bGVuICs9IHNpemVvZigqaWQpOworCQljbi0+bGVuICs9IHNpemVvZigqaWQpOworCQlpZCsrOworCX0KKwljbi0+YWNrID0gMDsKKwljbl9uZXRsaW5rX3NlbmQoY24sIDAsIEdGUF9LRVJORUwpOworCW11dGV4X3VubG9jaygmdzFfbWxvY2spOworCisJa2ZyZWUoY24pOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHcxX25ldGxpbmtfc2VuZF9lcnJvcihzdHJ1Y3QgY25fbXNnICpyY21zZywgc3RydWN0IHcxX25ldGxpbmtfbXNnICpybXNnLAorCQlzdHJ1Y3QgdzFfbmV0bGlua19jbWQgKnJjbWQsIGludCBlcnJvcikKK3sKKwlzdHJ1Y3QgY25fbXNnICpjbXNnOworCXN0cnVjdCB3MV9uZXRsaW5rX21zZyAqbXNnOworCXN0cnVjdCB3MV9uZXRsaW5rX2NtZCAqY21kOworCisJY21zZyA9IGt6YWxsb2Moc2l6ZW9mKCptc2cpICsgc2l6ZW9mKCpjbWQpICsgc2l6ZW9mKCpjbXNnKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFjbXNnKQorCQlyZXR1cm4gLUVOT01FTTsKKworCW1zZyA9IChzdHJ1Y3QgdzFfbmV0bGlua19tc2cgKikoY21zZyArIDEpOworCWNtZCA9IChzdHJ1Y3QgdzFfbmV0bGlua19jbWQgKikobXNnICsgMSk7CisKKwltZW1jcHkoY21zZywgcmNtc2csIHNpemVvZigqY21zZykpOworCWNtc2ctPmxlbiA9IHNpemVvZigqbXNnKTsKKworCW1lbWNweShtc2csIHJtc2csIHNpemVvZigqbXNnKSk7CisJbXNnLT5sZW4gPSAwOworCW1zZy0+c3RhdHVzID0gKHNob3J0KS1lcnJvcjsKKworCWlmIChyY21kKSB7CisJCW1lbWNweShjbWQsIHJjbWQsIHNpemVvZigqY21kKSk7CisJCWNtZC0+bGVuID0gMDsKKwkJbXNnLT5sZW4gKz0gc2l6ZW9mKCpjbWQpOworCQljbXNnLT5sZW4gKz0gc2l6ZW9mKCpjbWQpOworCX0KKworCWVycm9yID0gY25fbmV0bGlua19zZW5kKGNtc2csIDAsIEdGUF9LRVJORUwpOworCWtmcmVlKGNtc2cpOworCisJcmV0dXJuIGVycm9yOworfQorCiBzdGF0aWMgdm9pZCB3MV9jbl9jYWxsYmFjayh2b2lkICpkYXRhKQogewogCXN0cnVjdCBjbl9tc2cgKm1zZyA9IGRhdGE7CkBAIC0xNDQsNiArMzIyLDcgQEAKIAogCQlkZXYgPSBOVUxMOwogCQlzbCA9IE5VTEw7CisJCWNtZCA9IE5VTEw7CiAKIAkJbWVtY3B5KCZpZCwgbS0+aWQuaWQsIHNpemVvZihpZCkpOwogI2lmIDAKQEAgLTE1NSwxNSArMzM0LDE1IEBACiAJCQlicmVhazsKIAkJfQogCi0JCWlmICghbWxlbikKLQkJCWdvdG8gb3V0X2NvbnQ7Ci0KIAkJaWYgKG0tPnR5cGUgPT0gVzFfTUFTVEVSX0NNRCkgewogCQkJZGV2ID0gdzFfc2VhcmNoX21hc3Rlcl9pZChtLT5pZC5tc3QuaWQpOwogCQl9IGVsc2UgaWYgKG0tPnR5cGUgPT0gVzFfU0xBVkVfQ01EKSB7CiAJCQlzbCA9IHcxX3NlYXJjaF9zbGF2ZSgmaWQpOwogCQkJaWYgKHNsKQogCQkJCWRldiA9IHNsLT5tYXN0ZXI7CisJCX0gZWxzZSB7CisJCQllcnIgPSB3MV9wcm9jZXNzX2NvbW1hbmRfcm9vdChtc2csIG0pOworCQkJZ290byBvdXRfY29udDsKIAkJfQogCiAJCWlmICghZGV2KSB7CkBAIC0xNzEsNiArMzUwLDEwIEBACiAJCQlnb3RvIG91dF9jb250OwogCQl9CiAKKwkJZXJyID0gMDsKKwkJaWYgKCFtbGVuKQorCQkJZ290byBvdXRfY29udDsKKwogCQltdXRleF9sb2NrKCZkZXYtPm11dGV4KTsKIAogCQlpZiAoc2wgJiYgdzFfcmVzZXRfc2VsZWN0X3NsYXZlKHNsKSkgewpAQCAtMTg3LDkgKzM3MCwxMiBAQAogCQkJfQogCiAJCQlpZiAoc2wpCi0JCQkJdzFfcHJvY2Vzc19jb21tYW5kX3NsYXZlKHNsLCBtc2csIG0sIGNtZCk7CisJCQkJZXJyID0gdzFfcHJvY2Vzc19jb21tYW5kX3NsYXZlKHNsLCBtc2csIG0sIGNtZCk7CiAJCQllbHNlCi0JCQkJdzFfcHJvY2Vzc19jb21tYW5kX21hc3RlcihkZXYsIG1zZywgbSwgY21kKTsKKwkJCQllcnIgPSB3MV9wcm9jZXNzX2NvbW1hbmRfbWFzdGVyKGRldiwgbXNnLCBtLCBjbWQpOworCisJCQl3MV9uZXRsaW5rX3NlbmRfZXJyb3IobXNnLCBtLCBjbWQsIGVycik7CisJCQllcnIgPSAwOwogCiAJCQljbWRfZGF0YSArPSBjbWQtPmxlbiArIHNpemVvZihzdHJ1Y3QgdzFfbmV0bGlua19jbWQpOwogCQkJbWxlbiAtPSBjbWQtPmxlbiArIHNpemVvZihzdHJ1Y3QgdzFfbmV0bGlua19jbWQpOwpAQCAtMjAwLDYgKzM4Niw4IEBACiAJCQlhdG9taWNfZGVjKCZzbC0+cmVmY250KTsKIAkJbXV0ZXhfdW5sb2NrKCZkZXYtPm11dGV4KTsKIG91dF9jb250OgorCQlpZiAoIWNtZCB8fCBlcnIpCisJCQl3MV9uZXRsaW5rX3NlbmRfZXJyb3IobXNnLCBtLCBjbWQsIGVycik7CiAJCW1zZy0+bGVuIC09IHNpemVvZihzdHJ1Y3QgdzFfbmV0bGlua19tc2cpICsgbS0+bGVuOwogCQltID0gKHN0cnVjdCB3MV9uZXRsaW5rX21zZyAqKSgoKHU4ICopbSkgKyBzaXplb2Yoc3RydWN0IHcxX25ldGxpbmtfbXNnKSArIG0tPmxlbik7CiAKQEAgLTIwOSwxMSArMzk3LDYgQEAKIAkJaWYgKGVyciA9PSAtRU5PREVWKQogCQkJZXJyID0gMDsKIAl9Ci0jaWYgMAotCWlmIChlcnIpIHsKLQkJcHJpbnRrKCIlczogbWFsZm9ybWVkIG1lc3NhZ2UuIERyb3BwaW5nLlxuIiwgX19mdW5jX18pOwotCX0KLSNlbmRpZgogfQogCiBpbnQgdzFfaW5pdF9uZXRsaW5rKHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3cxL3cxX25ldGxpbmsuaCBiL2RyaXZlcnMvdzEvdzFfbmV0bGluay5oCmluZGV4IDU2MTIyYjkuLjI3ZTk1MGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdzEvdzFfbmV0bGluay5oCisrKyBiL2RyaXZlcnMvdzEvdzFfbmV0bGluay5oCkBAIC0zNCwxMiArMzQsMTMgQEAKIAlXMV9NQVNURVJfUkVNT1ZFLAogCVcxX01BU1RFUl9DTUQsCiAJVzFfU0xBVkVfQ01ELAorCVcxX0xJU1RfTUFTVEVSUywKIH07CiAKIHN0cnVjdCB3MV9uZXRsaW5rX21zZwogewogCV9fdTgJCQkJdHlwZTsKLQlfX3U4CQkJCXJlc2VydmVkOworCV9fdTgJCQkJc3RhdHVzOwogCV9fdTE2CQkJCWxlbjsKIAl1bmlvbiB7CiAJCV9fdTgJCQlpZFs4XTsKQEAgLTUxLDEwICs1MiwxNSBAQAogCV9fdTgJCQkJZGF0YVswXTsKIH07CiAKLSNkZWZpbmUgVzFfQ01EX1JFQUQJCTB4MAotI2RlZmluZSBXMV9DTURfV1JJVEUJCTB4MQotI2RlZmluZSBXMV9DTURfU0VBUkNICQkweDIKLSNkZWZpbmUgVzFfQ01EX0FMQVJNX1NFQVJDSAkweDMKK2VudW0gdzFfY29tbWFuZHMgeworCVcxX0NNRF9SRUFEID0gMCwKKwlXMV9DTURfV1JJVEUsCisJVzFfQ01EX1NFQVJDSCwKKwlXMV9DTURfQUxBUk1fU0VBUkNILAorCVcxX0NNRF9UT1VDSCwKKwlXMV9DTURfUkVTRVQsCisJVzFfQ01EX01BWCwKK307CiAKIHN0cnVjdCB3MV9uZXRsaW5rX2NtZAogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy93YXRjaGRvZy9LY29uZmlnIGIvZHJpdmVycy93YXRjaGRvZy9LY29uZmlnCmluZGV4IGVjNjhjNzQuLjNlZmExMmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvd2F0Y2hkb2cvS2NvbmZpZworKysgYi9kcml2ZXJzL3dhdGNoZG9nL0tjb25maWcKQEAgLTc3MCw2ICs3NzAsMTIgQEAKIAogIyBQT1dFUlBDIEFyY2hpdGVjdHVyZQogCitjb25maWcgR0VGX1dEVAorCXRyaXN0YXRlICJHRSBGYW51YyBXYXRjaGRvZyBUaW1lciIKKwlkZXBlbmRzIG9uIEdFRl9TQkM2MTAKKwktLS1oZWxwLS0tCisJICBXYXRjaGRvZyB0aW1lciBmb3VuZCBpbiBhIG51bWJlciBvZiBHRSBGYW51YyBzaW5nbGUgYm9hcmQgY29tcHV0ZXJzLgorCiBjb25maWcgTVBDNTIwMF9XRFQKIAl0cmlzdGF0ZSAiTVBDNTIwMCBXYXRjaGRvZyBUaW1lciIKIAlkZXBlbmRzIG9uIFBQQ19NUEM1Mnh4CkBAIC03OTAsNiArNzk2LDE0IEBACiAJdHJpc3RhdGUgIk1WNjRYNjAgKE1hcnZlbGwgRGlzY292ZXJ5KSBXYXRjaGRvZyBUaW1lciIKIAlkZXBlbmRzIG9uIE1WNjRYNjAKIAorY29uZmlnIFBJS0FfV0RUCisJdHJpc3RhdGUgIlBJS0EgRlBHQSBXYXRjaGRvZyIKKwlkZXBlbmRzIG9uIFdBUlAKKwlkZWZhdWx0IHkKKwloZWxwCisJICBUaGlzIGVuYWJsZXMgdGhlIHdhdGNoZG9nIGluIHRoZSBQSUtBIEZQR0EuIEN1cnJlbnRseSB1c2VkIG9uCisJICB0aGUgV2FycCBwbGF0Zm9ybS4KKwogY29uZmlnIEJPT0tFX1dEVAogCWJvb2wgIlBvd2VyUEMgQm9vay1FIFdhdGNoZG9nIFRpbWVyIgogCWRlcGVuZHMgb24gQk9PS0UgfHwgNHh4CmRpZmYgLS1naXQgYS9kcml2ZXJzL3dhdGNoZG9nL01ha2VmaWxlIGIvZHJpdmVycy93YXRjaGRvZy9NYWtlZmlsZQppbmRleCBjMTliODY2Li44MDZiM2ViIDEwMDY0NAotLS0gYS9kcml2ZXJzL3dhdGNoZG9nL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvd2F0Y2hkb2cvTWFrZWZpbGUKQEAgLTExMSw5ICsxMTEsMTEgQEAKICMgUEFSSVNDIEFyY2hpdGVjdHVyZQogCiAjIFBPV0VSUEMgQXJjaGl0ZWN0dXJlCitvYmotJChDT05GSUdfR0VGX1dEVCkgKz0gZ2VmX3dkdC5vCiBvYmotJChDT05GSUdfTVBDNTIwMF9XRFQpICs9IG1wYzUyMDBfd2R0Lm8KIG9iai0kKENPTkZJR184eHh4X1dEVCkgKz0gbXBjOHh4eF93ZHQubwogb2JqLSQoQ09ORklHX01WNjRYNjBfV0RUKSArPSBtdjY0eDYwX3dkdC5vCitvYmotJChDT05GSUdfUElLQV9XRFQpICs9IHBpa2Ffd2R0Lm8KIG9iai0kKENPTkZJR19CT09LRV9XRFQpICs9IGJvb2tlX3dkdC5vCiAKICMgUFBDNjQgQXJjaGl0ZWN0dXJlCmRpZmYgLS1naXQgYS9kcml2ZXJzL3dhdGNoZG9nL2dlZl93ZHQuYyBiL2RyaXZlcnMvd2F0Y2hkb2cvZ2VmX3dkdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwYzJiN2EKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3dhdGNoZG9nL2dlZl93ZHQuYwpAQCAtMCwwICsxLDMzMCBAQAorLyoKKyAqIEdFIEZhbnVjIHdhdGNoZG9nIHVzZXJzcGFjZSBpbnRlcmZhY2UKKyAqCisgKiBBdXRob3I6ICBNYXJ0eW4gV2VsY2ggPG1hcnR5bi53ZWxjaEBnZWZhbnVjLmNvbT4KKyAqCisgKiBDb3B5cmlnaHQgMjAwOCBHRSBGYW51YyBJbnRlbGxpZ2VudCBQbGF0Zm9ybXMgRW1iZWRkZWQgU3lzdGVtcywgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogQmFzZWQgb246IG12NjR4NjBfd2R0LmMgKE1WNjRYNjAgd2F0Y2hkb2cgdXNlcnNwYWNlIGludGVyZmFjZSkKKyAqICAgQXV0aG9yOiBKYW1lcyBDaGFwbWFuIDxqY2hhcG1hbkBrYXRhbGl4LmNvbT4KKyAqLworCisvKiBUT0RPOgorICogVGhpcyBkcml2ZXIgZG9lcyBub3QgcHJvdmlkZSBzdXBwb3J0IGZvciB0aGUgaGFyZHdhcmVzIGNhcGFiaWxpdHkgb2Ygc2VuZGluZworICogYW4gaW50ZXJydXB0IGF0IGEgcHJvZ3JhbW1hYmxlIHRocmVzaG9sZC4KKyAqCisgKiBUaGlzIGRyaXZlciBjdXJyZW50bHkgY2FuIG9ubHkgc3VwcG9ydCAxIHdhdGNoZG9nIC0gdGhlcmUgYXJlIDIgaW4gdGhlCisgKiBoYXJkd2FyZSB0aGF0IHRoaXMgZHJpdmVyIHN1cHBvcnRzLiBUaHVzIG9uZSBjb3VsZCBiZSBjb25maWd1cmVkIGFzIGEKKyAqIHByb2Nlc3MtYmFzZWQgd2F0Y2hkb2cgKHZpYSAvZGV2L3dhdGNoZG9nKSwgdGhlIHNlY29uZCAodXNpbmcgdGhlIGludGVycnVwdAorICogY2FwYWJpbGl0aWVzKSBhIGtlcm5lbC1iYXNlZCB3YXRjaGRvZy4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3dhdGNoZG9nLmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9wbGF0Zm9ybS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgorCisjaW5jbHVkZSA8c3lzZGV2L2ZzbF9zb2MuaD4KKworLyoKKyAqIFRoZSB3YXRjaGRvZyBjb25maWd1cmF0aW9uIHJlZ2lzdGVyIGNvbnRhaW5zIGEgcGFpciBvZiAyLWJpdCBmaWVsZHMsCisgKiAgIDEuICBhIHJlbG9hZCBmaWVsZCwgYml0cyAyNy0yNiwgd2hpY2ggdHJpZ2dlcnMgYSByZWxvYWQgb2YKKyAqICAgICAgIHRoZSBjb3VudGRvd24gcmVnaXN0ZXIsIGFuZAorICogICAyLiAgYW4gZW5hYmxlIGZpZWxkLCBiaXRzIDI1LTI0LCB3aGljaCB0b2dnbGVzIGJldHdlZW4KKyAqICAgICAgIGVuYWJsaW5nIGFuZCBkaXNhYmxpbmcgdGhlIHdhdGNoZG9nIHRpbWVyLgorICogQml0IDMxIGlzIGEgcmVhZC1vbmx5IGZpZWxkIHdoaWNoIGluZGljYXRlcyB3aGV0aGVyIHRoZQorICogd2F0Y2hkb2cgdGltZXIgaXMgY3VycmVudGx5IGVuYWJsZWQuCisgKgorICogVGhlIGxvdyAyNCBiaXRzIGNvbnRhaW4gdGhlIHRpbWVyIHJlbG9hZCB2YWx1ZS4KKyAqLworI2RlZmluZSBHRUZfV0RDX0VOQUJMRV9TSElGVAkyNAorI2RlZmluZSBHRUZfV0RDX1NFUlZJQ0VfU0hJRlQJMjYKKyNkZWZpbmUgR0VGX1dEQ19FTkFCTEVEX1NISUZUCTMxCisKKyNkZWZpbmUgR0VGX1dEQ19FTkFCTEVEX1RSVUUJMQorI2RlZmluZSBHRUZfV0RDX0VOQUJMRURfRkFMU0UJMAorCisvKiBGbGFncyBiaXRzICovCisjZGVmaW5lIEdFRl9XRE9HX0ZMQUdfT1BFTkVECTAKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgd2R0X2ZsYWdzOworc3RhdGljIGludCB3ZHRfc3RhdHVzOworc3RhdGljIHZvaWQgX19pb21lbSAqZ2VmX3dkdF9yZWdzOworc3RhdGljIGludCBnZWZfd2R0X3RpbWVvdXQ7CitzdGF0aWMgaW50IGdlZl93ZHRfY291bnQ7CitzdGF0aWMgdW5zaWduZWQgaW50IGJ1c19jbGs7CitzdGF0aWMgY2hhciBleHBlY3RfY2xvc2U7CitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGdlZl93ZHRfc3BpbmxvY2spOworCitzdGF0aWMgaW50IG5vd2F5b3V0ID0gV0FUQ0hET0dfTk9XQVlPVVQ7Cittb2R1bGVfcGFyYW0obm93YXlvdXQsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKG5vd2F5b3V0LCAiV2F0Y2hkb2cgY2Fubm90IGJlIHN0b3BwZWQgb25jZSBzdGFydGVkIChkZWZhdWx0PSIKKwlfX01PRFVMRV9TVFJJTkcoV0FUQ0hET0dfTk9XQVlPVVQpICIpIik7CisKKworc3RhdGljIGludCBnZWZfd2R0X3RvZ2dsZV93ZGMoaW50IGVuYWJsZWRfcHJlZGljYXRlLCBpbnQgZmllbGRfc2hpZnQpCit7CisJdTMyIGRhdGE7CisJdTMyIGVuYWJsZWQ7CisJaW50IHJldCA9IDA7CisKKwlzcGluX2xvY2soJmdlZl93ZHRfc3BpbmxvY2spOworCWRhdGEgPSBpb3JlYWQzMmJlKGdlZl93ZHRfcmVncyk7CisJZW5hYmxlZCA9IChkYXRhID4+IEdFRl9XRENfRU5BQkxFRF9TSElGVCkgJiAxOworCisJLyogb25seSB0b2dnbGUgdGhlIHJlcXVlc3RlZCBmaWVsZCBpZiBlbmFibGVkIHN0YXRlIG1hdGNoZXMgcHJlZGljYXRlICovCisJaWYgKChlbmFibGVkIF4gZW5hYmxlZF9wcmVkaWNhdGUpID09IDApIHsKKwkJLyogV2Ugd3JpdGUgYSAxLCB0aGVuIGEgMiAtLSB0byB0aGUgYXBwcm9wcmlhdGUgZmllbGQgKi8KKwkJZGF0YSA9ICgxIDw8IGZpZWxkX3NoaWZ0KSB8IGdlZl93ZHRfY291bnQ7CisJCWlvd3JpdGUzMmJlKGRhdGEsIGdlZl93ZHRfcmVncyk7CisKKwkJZGF0YSA9ICgyIDw8IGZpZWxkX3NoaWZ0KSB8IGdlZl93ZHRfY291bnQ7CisJCWlvd3JpdGUzMmJlKGRhdGEsIGdlZl93ZHRfcmVncyk7CisJCXJldCA9IDE7CisJfQorCXNwaW5fdW5sb2NrKCZnZWZfd2R0X3NwaW5sb2NrKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGdlZl93ZHRfc2VydmljZSh2b2lkKQoreworCWdlZl93ZHRfdG9nZ2xlX3dkYyhHRUZfV0RDX0VOQUJMRURfVFJVRSwKKwkJR0VGX1dEQ19TRVJWSUNFX1NISUZUKTsKK30KKworc3RhdGljIHZvaWQgZ2VmX3dkdF9oYW5kbGVyX2VuYWJsZSh2b2lkKQoreworCWlmIChnZWZfd2R0X3RvZ2dsZV93ZGMoR0VGX1dEQ19FTkFCTEVEX0ZBTFNFLAorCQkJCSAgIEdFRl9XRENfRU5BQkxFX1NISUZUKSkgeworCQlnZWZfd2R0X3NlcnZpY2UoKTsKKwkJcHJpbnRrKEtFUk5fTk9USUNFICJnZWZfd2R0OiB3YXRjaGRvZyBhY3RpdmF0ZWRcbiIpOworCX0KK30KKworc3RhdGljIHZvaWQgZ2VmX3dkdF9oYW5kbGVyX2Rpc2FibGUodm9pZCkKK3sKKwlpZiAoZ2VmX3dkdF90b2dnbGVfd2RjKEdFRl9XRENfRU5BQkxFRF9UUlVFLAorCQkJCSAgIEdFRl9XRENfRU5BQkxFX1NISUZUKSkKKwkJcHJpbnRrKEtFUk5fTk9USUNFICJnZWZfd2R0OiB3YXRjaGRvZyBkZWFjdGl2YXRlZFxuIik7Cit9CisKK3N0YXRpYyB2b2lkIGdlZl93ZHRfc2V0X3RpbWVvdXQodW5zaWduZWQgaW50IHRpbWVvdXQpCit7CisJLyogbWF4aW11bSBidXMgY3ljbGUgY291bnQgaXMgMHhGRkZGRkZGRiAqLworCWlmICh0aW1lb3V0ID4gMHhGRkZGRkZGRiAvIGJ1c19jbGspCisJCXRpbWVvdXQgPSAweEZGRkZGRkZGIC8gYnVzX2NsazsKKworCS8qIFJlZ2lzdGVyIG9ubHkgaG9sZHMgdXBwZXIgMjQgYml0cywgYml0IHNoaWZ0ZWQgaW50byBsb3dlciAyNCAqLworCWdlZl93ZHRfY291bnQgPSAodGltZW91dCAqIGJ1c19jbGspID4+IDg7CisJZ2VmX3dkdF90aW1lb3V0ID0gdGltZW91dDsKK30KKworCitzdGF0aWMgc3NpemVfdCBnZWZfd2R0X3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqZGF0YSwKKwkJCQkgc2l6ZV90IGxlbiwgbG9mZl90ICpwcG9zKQoreworCWlmIChsZW4pIHsKKwkJaWYgKCFub3dheW91dCkgeworCQkJc2l6ZV90IGk7CisKKwkJCWV4cGVjdF9jbG9zZSA9IDA7CisKKwkJCWZvciAoaSA9IDA7IGkgIT0gbGVuOyBpKyspIHsKKwkJCQljaGFyIGM7CisJCQkJaWYgKGdldF91c2VyKGMsIGRhdGEgKyBpKSkKKwkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJaWYgKGMgPT0gJ1YnKQorCQkJCQlleHBlY3RfY2xvc2UgPSA0MjsKKwkJCX0KKwkJfQorCQlnZWZfd2R0X3NlcnZpY2UoKTsKKwl9CisKKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgbG9uZyBnZWZfd2R0X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAorCQkJCQkJCXVuc2lnbmVkIGxvbmcgYXJnKQoreworCWludCB0aW1lb3V0OworCWludCBvcHRpb25zOworCXZvaWQgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOworCXN0YXRpYyBzdHJ1Y3Qgd2F0Y2hkb2dfaW5mbyBpbmZvID0geworCQkub3B0aW9ucyA9CVdESU9GX1NFVFRJTUVPVVQgfCBXRElPRl9NQUdJQ0NMT1NFIHwKKwkJCQlXRElPRl9LRUVQQUxJVkVQSU5HLAorCQkuZmlybXdhcmVfdmVyc2lvbiA9IDAsCisJCS5pZGVudGl0eSA9ICJHRSBGYW51YyB3YXRjaGRvZyIsCisJfTsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBXRElPQ19HRVRTVVBQT1JUOgorCQlpZiAoY29weV90b191c2VyKGFyZ3AsICZpbmZvLCBzaXplb2YoaW5mbykpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWJyZWFrOworCisJY2FzZSBXRElPQ19HRVRTVEFUVVM6CisJY2FzZSBXRElPQ19HRVRCT09UU1RBVFVTOgorCQlpZiAocHV0X3VzZXIod2R0X3N0YXR1cywgKGludCBfX3VzZXIgKilhcmdwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQl3ZHRfc3RhdHVzICY9IH5XRElPRl9LRUVQQUxJVkVQSU5HOworCQlicmVhazsKKworCWNhc2UgV0RJT0NfU0VUT1BUSU9OUzoKKwkJaWYgKGdldF91c2VyKG9wdGlvbnMsIChpbnQgX191c2VyICopYXJncCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlpZiAob3B0aW9ucyAmIFdESU9TX0RJU0FCTEVDQVJEKQorCQkJZ2VmX3dkdF9oYW5kbGVyX2Rpc2FibGUoKTsKKworCQlpZiAob3B0aW9ucyAmIFdESU9TX0VOQUJMRUNBUkQpCisJCQlnZWZfd2R0X2hhbmRsZXJfZW5hYmxlKCk7CisJCWJyZWFrOworCisJY2FzZSBXRElPQ19LRUVQQUxJVkU6CisJCWdlZl93ZHRfc2VydmljZSgpOworCQl3ZHRfc3RhdHVzIHw9IFdESU9GX0tFRVBBTElWRVBJTkc7CisJCWJyZWFrOworCisJY2FzZSBXRElPQ19TRVRUSU1FT1VUOgorCQlpZiAoZ2V0X3VzZXIodGltZW91dCwgKGludCBfX3VzZXIgKilhcmdwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlnZWZfd2R0X3NldF90aW1lb3V0KHRpbWVvdXQpOworCQkvKiBGYWxsIHRocm91Z2ggKi8KKworCWNhc2UgV0RJT0NfR0VUVElNRU9VVDoKKwkJaWYgKHB1dF91c2VyKGdlZl93ZHRfdGltZW91dCwgKGludCBfX3VzZXIgKilhcmdwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJldHVybiAtRU5PVFRZOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdlZl93ZHRfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlpZiAodGVzdF9hbmRfc2V0X2JpdChHRUZfV0RPR19GTEFHX09QRU5FRCwgJndkdF9mbGFncykpCisJCXJldHVybiAtRUJVU1k7CisKKwlpZiAobm93YXlvdXQpCisJCV9fbW9kdWxlX2dldChUSElTX01PRFVMRSk7CisKKwlnZWZfd2R0X2hhbmRsZXJfZW5hYmxlKCk7CisKKwlyZXR1cm4gbm9uc2Vla2FibGVfb3Blbihpbm9kZSwgZmlsZSk7Cit9CisKK3N0YXRpYyBpbnQgZ2VmX3dkdF9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWlmIChleHBlY3RfY2xvc2UgPT0gNDIpCisJCWdlZl93ZHRfaGFuZGxlcl9kaXNhYmxlKCk7CisJZWxzZSB7CisJCXByaW50ayhLRVJOX0NSSVQKKwkJICAgICAgICJnZWZfd2R0OiB1bmV4cGVjdGVkIGNsb3NlLCBub3Qgc3RvcHBpbmcgdGltZXIhXG4iKTsKKwkJZ2VmX3dkdF9zZXJ2aWNlKCk7CisJfQorCWV4cGVjdF9jbG9zZSA9IDA7CisKKwljbGVhcl9iaXQoR0VGX1dET0dfRkxBR19PUEVORUQsICZ3ZHRfZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGdlZl93ZHRfZm9wcyA9IHsKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkubGxzZWVrID0gbm9fbGxzZWVrLAorCS53cml0ZSA9IGdlZl93ZHRfd3JpdGUsCisJLnVubG9ja2VkX2lvY3RsID0gZ2VmX3dkdF9pb2N0bCwKKwkub3BlbiA9IGdlZl93ZHRfb3BlbiwKKwkucmVsZWFzZSA9IGdlZl93ZHRfcmVsZWFzZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSBnZWZfd2R0X21pc2NkZXYgPSB7CisJLm1pbm9yID0gV0FUQ0hET0dfTUlOT1IsCisJLm5hbWUgPSAid2F0Y2hkb2ciLAorCS5mb3BzID0gJmdlZl93ZHRfZm9wcywKK307CisKKworc3RhdGljIGludCBfX2RldmluaXQgZ2VmX3dkdF9wcm9iZShzdHJ1Y3Qgb2ZfZGV2aWNlICpkZXYsCisJY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqbWF0Y2gpCit7CisJaW50IHRpbWVvdXQgPSAxMDsKKwl1MzIgZnJlcTsKKworCWJ1c19jbGsgPSAxMzM7IC8qIGluIE1IeiAqLworCisJZnJlcSA9IGZzbF9nZXRfc3lzX2ZyZXEoKTsKKwlpZiAoZnJlcSA+IDApCisJCWJ1c19jbGsgPSBmcmVxOworCisJLyogTWFwIGRldmljZXMgcmVnaXN0ZXJzIGludG8gbWVtb3J5ICovCisJZ2VmX3dkdF9yZWdzID0gb2ZfaW9tYXAoZGV2LT5ub2RlLCAwKTsKKwlpZiAoZ2VmX3dkdF9yZWdzID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJZ2VmX3dkdF9zZXRfdGltZW91dCh0aW1lb3V0KTsKKworCWdlZl93ZHRfaGFuZGxlcl9kaXNhYmxlKCk7CS8qIGluIGNhc2UgdGltZXIgd2FzIGFscmVhZHkgcnVubmluZyAqLworCisJcmV0dXJuIG1pc2NfcmVnaXN0ZXIoJmdlZl93ZHRfbWlzY2Rldik7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IGdlZl93ZHRfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKK3sKKwltaXNjX2RlcmVnaXN0ZXIoJmdlZl93ZHRfbWlzY2Rldik7CisKKwlnZWZfd2R0X2hhbmRsZXJfZGlzYWJsZSgpOworCisJaW91bm1hcChnZWZfd2R0X3JlZ3MpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGdlZl93ZHRfaWRzW10gPSB7CisJeworCQkuY29tcGF0aWJsZSA9ICJnZWYsZnBnYS13ZHQiLAorCX0sCisJe30sCit9OworCitzdGF0aWMgc3RydWN0IG9mX3BsYXRmb3JtX2RyaXZlciBnZWZfd2R0X2RyaXZlciA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm5hbWUJCT0gImdlZl93ZHQiLAorCS5tYXRjaF90YWJsZQk9IGdlZl93ZHRfaWRzLAorCS5wcm9iZQkJPSBnZWZfd2R0X3Byb2JlLAorfTsKKworc3RhdGljIGludCBfX2luaXQgZ2VmX3dkdF9pbml0KHZvaWQpCit7CisJcHJpbnRrKEtFUk5fSU5GTyAiR0UgRmFudWMgd2F0Y2hkb2cgZHJpdmVyXG4iKTsKKwlyZXR1cm4gb2ZfcmVnaXN0ZXJfcGxhdGZvcm1fZHJpdmVyKCZnZWZfd2R0X2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBnZWZfd2R0X2V4aXQodm9pZCkKK3sKKwlvZl91bnJlZ2lzdGVyX3BsYXRmb3JtX2RyaXZlcigmZ2VmX3dkdF9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChnZWZfd2R0X2luaXQpOworbW9kdWxlX2V4aXQoZ2VmX3dkdF9leGl0KTsKKworTU9EVUxFX0FVVEhPUigiTWFydHluIFdlbGNoIDxtYXJ0eW4ud2VsY2hAZ2VmYW51Yy5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkdFIEZhbnVjIHdhdGNoZG9nIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTX01JU0NERVYoV0FUQ0hET0dfTUlOT1IpOworTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTogZ2VmX3dkdCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy93YXRjaGRvZy9waWthX3dkdC5jIGIvZHJpdmVycy93YXRjaGRvZy9waWthX3dkdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkMjJlOTkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3dhdGNoZG9nL3Bpa2Ffd2R0LmMKQEAgLTAsMCArMSwzMDEgQEAKKy8qCisgKiBQSUtBIEZQR0EgYmFzZWQgV2F0Y2hkb2cgVGltZXIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggUElLQSBUZWNobm9sb2dpZXMKKyAqICAgU2VhbiBNYWNMZW5uYW4gPHNtYWNsZW5uYW5AcGlrYXRlY2guY29tPgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvd2F0Y2hkb2cuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWJvb3QuaD4KKyNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9wbGF0Zm9ybS5oPgorCisjZGVmaW5lIERSVl9OQU1FICJQSUtBLVdEVCIKKyNkZWZpbmUgUEZYIERSVl9OQU1FICI6ICIKKworLyogSGFyZHdhcmUgdGltZW91dCBpbiBzZWNvbmRzICovCisjZGVmaW5lIFdEVF9IV19USU1FT1VUIDIKKworLyogVGltZXIgaGVhcnRiZWF0ICg1MDBtcykgKi8KKyNkZWZpbmUgV0RUX1RJTUVPVVQJKEhaLzIpCisKKy8qIFVzZXIgbGFuZCB0aW1lb3V0ICovCisjZGVmaW5lIFdEVF9IRUFSVEJFQVQgMTUKK3N0YXRpYyBpbnQgaGVhcnRiZWF0ID0gV0RUX0hFQVJUQkVBVDsKK21vZHVsZV9wYXJhbShoZWFydGJlYXQsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGhlYXJ0YmVhdCwgIldhdGNoZG9nIGhlYXJ0YmVhdHMgaW4gc2Vjb25kcy4gIgorCSIoZGVmYXVsdCA9ICIgX19NT0RVTEVfU1RSSU5HKFdEVF9IRUFSVEJFQVQpICIpIik7CisKK3N0YXRpYyBpbnQgbm93YXlvdXQgPSBXQVRDSERPR19OT1dBWU9VVDsKK21vZHVsZV9wYXJhbShub3dheW91dCwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0Mobm93YXlvdXQsICJXYXRjaGRvZyBjYW5ub3QgYmUgc3RvcHBlZCBvbmNlIHN0YXJ0ZWQgIgorCSIoZGVmYXVsdD0iIF9fTU9EVUxFX1NUUklORyhXQVRDSERPR19OT1dBWU9VVCkgIikiKTsKKworc3RhdGljIHN0cnVjdCB7CisJdm9pZCBfX2lvbWVtICpmcGdhOworCXVuc2lnbmVkIGxvbmcgbmV4dF9oZWFydGJlYXQ7CS8qIHRoZSBuZXh0X2hlYXJ0YmVhdCBmb3IgdGhlIHRpbWVyICovCisJdW5zaWduZWQgbG9uZyBvcGVuOworCWNoYXIgZXhwZWN0X2Nsb3NlOworCWludCBib290c3RhdHVzOworCXN0cnVjdCB0aW1lcl9saXN0IHRpbWVyOwkvKiBUaGUgdGltZXIgdGhhdCBwaW5ncyB0aGUgd2F0Y2hkb2cgKi8KK30gcGlrYXdkdF9wcml2YXRlOworCitzdGF0aWMgc3RydWN0IHdhdGNoZG9nX2luZm8gaWRlbnQgPSB7CisJLmlkZW50aXR5CT0gRFJWX05BTUUsCisJLm9wdGlvbnMJPSBXRElPRl9DQVJEUkVTRVQgfAorCQkJICBXRElPRl9TRVRUSU1FT1VUIHwKKwkJCSAgV0RJT0ZfS0VFUEFMSVZFUElORyB8CisJCQkgIFdESU9GX01BR0lDQ0xPU0UsCit9OworCisvKgorICogUmVsb2FkIHRoZSB3YXRjaGRvZyB0aW1lci4gIChpZSwgcGF0IHRoZSB3YXRjaGRvZykKKyAqLworc3RhdGljIGlubGluZSB2b2lkIHBpa2F3ZHRfcmVzZXQodm9pZCkKK3sKKwkvKiAtLSBGUEdBOiBSZXNldCBDb250cm9sIFJlZ2lzdGVyICgzMmJpdCBSL1cpIChPZmZzZXQ6IDB4MTQpIC0tCisJICogQml0IDcsICAgIFdUQ0hER19FTjogV2hlbiBzZXQgdG8gMSwgdGhlIHdhdGNoZG9nIHRpbWVyIGlzIGVuYWJsZWQuCisJICogICAgICAgICAgIE9uY2UgZW5hYmxlZCwgaXQgY2Fubm90IGJlIGRpc2FibGVkLiBUaGUgd2F0Y2hkb2cgY2FuIGJlCisJICogICAgICAgICAgIGtpY2tlZCBieSBwZXJmb3JtaW5nIGFueSB3cml0ZSBhY2Nlc3MgdG8gdGhlIHJlc2V0CisJICogICAgICAgICAgIGNvbnRyb2wgcmVnaXN0ZXIgKHRoaXMgcmVnaXN0ZXIpLgorCSAqIEJpdCA4LTExLCBXVENIREdfVElNRU9VVF9TRUM6IFNldHMgdGhlIHdhdGNoZG9nIHRpbWVvdXQgdmFsdWUgaW4KKwkgKiAgICAgICAgICAgc2Vjb25kcy4gVmFsaWQgcmFuZ2VzIGFyZSAxIHRvIDE1IHNlY29uZHMuIFRoZSB2YWx1ZSBjYW4KKwkgKiAgICAgICAgICAgYmUgbW9kaWZpZWQgZHluYW1pY2FsbHkuCisJICovCisJdW5zaWduZWQgcmVzZXQgPSBpbl9iZTMyKHBpa2F3ZHRfcHJpdmF0ZS5mcGdhICsgMHgxNCk7CisJLyogZW5hYmxlIHdpdGggbWF4IHRpbWVvdXQgLSAxNSBzZWNvbmRzICovCisJcmVzZXQgfD0gKDEgPDwgNykgKyAoV0RUX0hXX1RJTUVPVVQgPDwgOCk7CisJb3V0X2JlMzIocGlrYXdkdF9wcml2YXRlLmZwZ2EgKyAweDE0LCByZXNldCk7Cit9CisKKy8qCisgKiBUaW1lciB0aWNrCisgKi8KK3N0YXRpYyB2b2lkIHBpa2F3ZHRfcGluZyh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJaWYgKHRpbWVfYmVmb3JlKGppZmZpZXMsIHBpa2F3ZHRfcHJpdmF0ZS5uZXh0X2hlYXJ0YmVhdCkgfHwKKwkJCSghbm93YXlvdXQgJiYgIXBpa2F3ZHRfcHJpdmF0ZS5vcGVuKSkgeworCQlwaWthd2R0X3Jlc2V0KCk7CisJCW1vZF90aW1lcigmcGlrYXdkdF9wcml2YXRlLnRpbWVyLCBqaWZmaWVzICsgV0RUX1RJTUVPVVQpOworCX0gZWxzZQorCQlwcmludGsoS0VSTl9DUklUIFBGWCAiSSB3aWxsIHJlc2V0IHlvdXIgbWFjaGluZSAhXG4iKTsKK30KKworCitzdGF0aWMgdm9pZCBwaWthd2R0X2tlZXBhbGl2ZSh2b2lkKQoreworCXBpa2F3ZHRfcHJpdmF0ZS5uZXh0X2hlYXJ0YmVhdCA9IGppZmZpZXMgKyBoZWFydGJlYXQgKiBIWjsKK30KKworc3RhdGljIHZvaWQgcGlrYXdkdF9zdGFydCh2b2lkKQoreworCXBpa2F3ZHRfa2VlcGFsaXZlKCk7CisJbW9kX3RpbWVyKCZwaWthd2R0X3ByaXZhdGUudGltZXIsIGppZmZpZXMgKyBXRFRfVElNRU9VVCk7Cit9CisKKy8qCisgKiBXYXRjaGRvZyBkZXZpY2UgaXMgb3BlbmVkLCBhbmQgd2F0Y2hkb2cgc3RhcnRzIHJ1bm5pbmcuCisgKi8KK3N0YXRpYyBpbnQgcGlrYXdkdF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCS8qIC9kZXYvd2F0Y2hkb2cgY2FuIG9ubHkgYmUgb3BlbmVkIG9uY2UgKi8KKwlpZiAodGVzdF9hbmRfc2V0X2JpdCgwLCAmcGlrYXdkdF9wcml2YXRlLm9wZW4pKQorCQlyZXR1cm4gLUVCVVNZOworCisJcGlrYXdkdF9zdGFydCgpOworCisJcmV0dXJuIG5vbnNlZWthYmxlX29wZW4oaW5vZGUsIGZpbGUpOworfQorCisvKgorICogQ2xvc2UgdGhlIHdhdGNoZG9nIGRldmljZS4KKyAqLworc3RhdGljIGludCBwaWthd2R0X3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJLyogc3RvcCBpbnRlcm5hbCBwaW5nICovCisJaWYgKCFwaWthd2R0X3ByaXZhdGUuZXhwZWN0X2Nsb3NlKQorCQlkZWxfdGltZXIoJnBpa2F3ZHRfcHJpdmF0ZS50aW1lcik7CisKKwljbGVhcl9iaXQoMCwgJnBpa2F3ZHRfcHJpdmF0ZS5vcGVuKTsKKwlwaWthd2R0X3ByaXZhdGUuZXhwZWN0X2Nsb3NlID0gMDsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFBhdCB0aGUgd2F0Y2hkb2cgd2hlbmV2ZXIgZGV2aWNlIGlzIHdyaXR0ZW4gdG8uCisgKi8KK3N0YXRpYyBzc2l6ZV90IHBpa2F3ZHRfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpkYXRhLAorCQkJICAgICBzaXplX3QgbGVuLCBsb2ZmX3QgKnBwb3MpCit7CisJaWYgKCFsZW4pCisJCXJldHVybiAwOworCisJLyogU2NhbiBmb3IgbWFnaWMgY2hhcmFjdGVyICovCisJaWYgKCFub3dheW91dCkgeworCQlzaXplX3QgaTsKKworCQlwaWthd2R0X3ByaXZhdGUuZXhwZWN0X2Nsb3NlID0gMDsKKworCQlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKwkJCWNoYXIgYzsKKwkJCWlmIChnZXRfdXNlcihjLCBkYXRhICsgaSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlpZiAoYyA9PSAnVicpIHsKKwkJCQlwaWthd2R0X3ByaXZhdGUuZXhwZWN0X2Nsb3NlID0gNDI7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisKKwlwaWthd2R0X2tlZXBhbGl2ZSgpOworCisJcmV0dXJuIGxlbjsKK30KKworLyoKKyAqIEhhbmRsZSBjb21tYW5kcyBmcm9tIHVzZXItc3BhY2UuCisgKi8KK3N0YXRpYyBsb25nIHBpa2F3ZHRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsCisJCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXZvaWQgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOworCWludCBfX3VzZXIgKnAgPSBhcmdwOworCWludCBuZXdfdmFsdWU7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgV0RJT0NfR0VUU1VQUE9SVDoKKwkJcmV0dXJuIGNvcHlfdG9fdXNlcihhcmdwLCAmaWRlbnQsIHNpemVvZihpZGVudCkpID8gLUVGQVVMVCA6IDA7CisKKwljYXNlIFdESU9DX0dFVFNUQVRVUzoKKwkJcmV0dXJuIHB1dF91c2VyKDAsIHApOworCisJY2FzZSBXRElPQ19HRVRCT09UU1RBVFVTOgorCQlyZXR1cm4gcHV0X3VzZXIocGlrYXdkdF9wcml2YXRlLmJvb3RzdGF0dXMsIHApOworCisJY2FzZSBXRElPQ19LRUVQQUxJVkU6CisJCXBpa2F3ZHRfa2VlcGFsaXZlKCk7CisJCXJldHVybiAwOworCisJY2FzZSBXRElPQ19TRVRUSU1FT1VUOgorCQlpZiAoZ2V0X3VzZXIobmV3X3ZhbHVlLCBwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCWhlYXJ0YmVhdCA9IG5ld192YWx1ZTsKKwkJcGlrYXdkdF9rZWVwYWxpdmUoKTsKKworCQlyZXR1cm4gcHV0X3VzZXIobmV3X3ZhbHVlLCBwKTsgIC8qIHJldHVybiBjdXJyZW50IHZhbHVlICovCisKKwljYXNlIFdESU9DX0dFVFRJTUVPVVQ6CisJCXJldHVybiBwdXRfdXNlcihoZWFydGJlYXQsIHApOworCX0KKwlyZXR1cm4gLUVOT1RUWTsKK30KKworCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwaWthd2R0X2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5sbHNlZWsJCT0gbm9fbGxzZWVrLAorCS5vcGVuCQk9IHBpa2F3ZHRfb3BlbiwKKwkucmVsZWFzZQk9IHBpa2F3ZHRfcmVsZWFzZSwKKwkud3JpdGUJCT0gcGlrYXdkdF93cml0ZSwKKwkudW5sb2NrZWRfaW9jdGwJPSBwaWthd2R0X2lvY3RsLAorfTsKKworc3RhdGljIHN0cnVjdCBtaXNjZGV2aWNlIHBpa2F3ZHRfbWlzY2RldiA9IHsKKwkubWlub3IJPSBXQVRDSERPR19NSU5PUiwKKwkubmFtZQk9ICJ3YXRjaGRvZyIsCisJLmZvcHMJPSAmcGlrYXdkdF9mb3BzLAorfTsKKworc3RhdGljIGludCBfX2luaXQgcGlrYXdkdF9pbml0KHZvaWQpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpucDsKKwl2b2lkIF9faW9tZW0gKmZwZ2E7CisJc3RhdGljIHUzMiBwb3N0MTsKKwlpbnQgcmV0OworCisJbnAgPSBvZl9maW5kX2NvbXBhdGlibGVfbm9kZShOVUxMLCBOVUxMLCAicGlrYSxmcGdhIik7CisJaWYgKG5wID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiVW5hYmxlIHRvIGZpbmQgZnBnYS5cbiIpOworCQlyZXR1cm4gLUVOT0VOVDsKKwl9CisKKwlwaWthd2R0X3ByaXZhdGUuZnBnYSA9IG9mX2lvbWFwKG5wLCAwKTsKKwlvZl9ub2RlX3B1dChucCk7CisJaWYgKHBpa2F3ZHRfcHJpdmF0ZS5mcGdhID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiVW5hYmxlIHRvIG1hcCBmcGdhLlxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWlkZW50LmZpcm13YXJlX3ZlcnNpb24gPSBpbl9iZTMyKHBpa2F3ZHRfcHJpdmF0ZS5mcGdhICsgMHgxYykgJiAweGZmZmY7CisKKwkvKiBQT1NUIGluZm9ybWF0aW9uIGlzIGluIHRoZSBzZCBhcmVhLiAqLworCW5wID0gb2ZfZmluZF9jb21wYXRpYmxlX25vZGUoTlVMTCwgTlVMTCwgInBpa2EsZnBnYS1zZCIpOworCWlmIChucCA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIlVuYWJsZSB0byBmaW5kIGZwZ2Etc2QuXG4iKTsKKwkJcmV0ID0gLUVOT0VOVDsKKwkJZ290byBvdXQ7CisJfQorCisJZnBnYSA9IG9mX2lvbWFwKG5wLCAwKTsKKwlvZl9ub2RlX3B1dChucCk7CisJaWYgKGZwZ2EgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJVbmFibGUgdG8gbWFwIGZwZ2Etc2QuXG4iKTsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBvdXQ7CisJfQorCisJLyogLS0gRlBHQTogUE9TVCBUZXN0IFJlc3VsdHMgUmVnaXN0ZXIgMSAoMzJiaXQgUi9XKSAoT2Zmc2V0OiAweDQwNDApIC0tCisJICogQml0IDMxLCAgIFdET0c6IFNldCB0byAxIHdoZW4gdGhlIGxhc3QgcmVzZXQgd2FzIGNhdXNlZCBieSBhIHdhdGNoZG9nCisJICogICAgICAgICAgIHRpbWVvdXQuCisJICovCisJcG9zdDEgPSBpbl9iZTMyKGZwZ2EgKyAweDQwKTsKKwlpZiAocG9zdDEgJiAweDgwMDAwMDAwKQorCQlwaWthd2R0X3ByaXZhdGUuYm9vdHN0YXR1cyA9IFdESU9GX0NBUkRSRVNFVDsKKworCWlvdW5tYXAoZnBnYSk7CisKKwlzZXR1cF90aW1lcigmcGlrYXdkdF9wcml2YXRlLnRpbWVyLCBwaWthd2R0X3BpbmcsIDApOworCisJcmV0ID0gbWlzY19yZWdpc3RlcigmcGlrYXdkdF9taXNjZGV2KTsKKwlpZiAocmV0KSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIlVuYWJsZSB0byByZWdpc3RlciBtaXNjZGV2LlxuIik7CisJCWdvdG8gb3V0OworCX0KKworCXByaW50ayhLRVJOX0lORk8gUEZYICJpbml0aWFsaXplZC4gaGVhcnRiZWF0PSVkIHNlYyAobm93YXlvdXQ9JWQpXG4iLAorCQkJCQkJCWhlYXJ0YmVhdCwgbm93YXlvdXQpOworCXJldHVybiAwOworCitvdXQ6CisJaW91bm1hcChwaWthd2R0X3ByaXZhdGUuZnBnYSk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHBpa2F3ZHRfZXhpdCh2b2lkKQoreworCW1pc2NfZGVyZWdpc3RlcigmcGlrYXdkdF9taXNjZGV2KTsKKworCWlvdW5tYXAocGlrYXdkdF9wcml2YXRlLmZwZ2EpOworfQorCittb2R1bGVfaW5pdChwaWthd2R0X2luaXQpOworbW9kdWxlX2V4aXQocGlrYXdkdF9leGl0KTsKKworTU9EVUxFX0FVVEhPUigiU2VhbiBNYWNMZW5uYW4gPHNtYWNsZW5uYW5AcGlrYXRlY2guY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJQSUtBIEZQR0EgYmFzZWQgV2F0Y2hkb2cgVGltZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BTElBU19NSVNDREVWKFdBVENIRE9HX01JTk9SKTsKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy93YXRjaGRvZy93bTgzNTBfd2R0LmMgYi9kcml2ZXJzL3dhdGNoZG9nL3dtODM1MF93ZHQuYwppbmRleCAyYmMwZDRkLi5hMmQyZThlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3dhdGNoZG9nL3dtODM1MF93ZHQuYworKysgYi9kcml2ZXJzL3dhdGNoZG9nL3dtODM1MF93ZHQuYwpAQCAtMjc5LDcgKzI3OSw3IEBACiAJLmZvcHMgPSAmd204MzUwX3dkdF9mb3BzLAogfTsKIAotc3RhdGljIGludCB3bTgzNTBfd2R0X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCitzdGF0aWMgaW50IF9fZGV2aW5pdCB3bTgzNTBfd2R0X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJc3RydWN0IHdtODM1MCAqd204MzUwID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CiAKQEAgLTI5Niw3ICsyOTYsNyBAQAogCXJldHVybiBtaXNjX3JlZ2lzdGVyKCZ3bTgzNTBfd2R0X21pc2NkZXYpOwogfQogCi1zdGF0aWMgaW50IF9fZXhpdCB3bTgzNTBfd2R0X3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQorc3RhdGljIGludCBfX2RldmV4aXQgd204MzUwX3dkdF9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKIAltaXNjX2RlcmVnaXN0ZXIoJndtODM1MF93ZHRfbWlzY2Rldik7CiAKQEAgLTMwNSw3ICszMDUsNyBAQAogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciB3bTgzNTBfd2R0X2RyaXZlciA9IHsKIAkucHJvYmUgPSB3bTgzNTBfd2R0X3Byb2JlLAotCS5yZW1vdmUgPSB3bTgzNTBfd2R0X3JlbW92ZSwKKwkucmVtb3ZlID0gX19kZXZleGl0X3Aod204MzUwX3dkdF9yZW1vdmUpLAogCS5kcml2ZXIgPSB7CiAJCS5uYW1lID0gIndtODM1MC13ZHQiLAogCX0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL3hlbi9LY29uZmlnIGIvZHJpdmVycy94ZW4vS2NvbmZpZwppbmRleCA0Yjc1YTE2Li41MjYxODdjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3hlbi9LY29uZmlnCisrKyBiL2RyaXZlcnMveGVuL0tjb25maWcKQEAgLTE3LDMgKzE3LDI3IEBACiAJICBpcyBub3QgYWNjaWRlbnRhbGx5IHZpc2libGUgdG8gb3RoZXIgZG9tYWlucy4gIElzIGl0IG1vcmUKIAkgIHNlY3VyZSwgYnV0IHNsaWdodGx5IGxlc3MgZWZmaWNpZW50LgogCSAgSWYgaW4gZG91YnQsIHNheSB5ZXMuCisKK2NvbmZpZyBYRU5GUworCXRyaXN0YXRlICJYZW4gZmlsZXN5c3RlbSIKKwlkZXBlbmRzIG9uIFhFTgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIFRoZSB4ZW4gZmlsZXN5c3RlbSBwcm92aWRlcyBhIHdheSBmb3IgZG9tYWlucyB0byBzaGFyZQorCSAgaW5mb3JtYXRpb24gd2l0aCBlYWNoIG90aGVyIGFuZCB3aXRoIHRoZSBoeXBlcnZpc29yLgorCSAgRm9yIGV4YW1wbGUsIGJ5IHJlYWRpbmcgYW5kIHdyaXRpbmcgdGhlICJ4ZW5idXMiIGZpbGUsIGd1ZXN0cworCSAgbWF5IHBhc3MgYXJiaXRyYXJ5IGluZm9ybWF0aW9uIHRvIHRoZSBpbml0aWFsIGRvbWFpbi4KKwkgIElmIGluIGRvdWJ0LCBzYXkgeWVzLgorCitjb25maWcgWEVOX0NPTVBBVF9YRU5GUworICAgICAgIGJvb2wgIkNyZWF0ZSBjb21wYXRpYmlsaXR5IG1vdW50IHBvaW50IC9wcm9jL3hlbiIKKyAgICAgICBkZXBlbmRzIG9uIFhFTkZTCisgICAgICAgZGVmYXVsdCB5CisgICAgICAgaGVscAorICAgICAgICAgVGhlIG9sZCB4ZW5zdG9yZSB1c2Vyc3BhY2UgdG9vbHMgZXhwZWN0IHRvIGZpbmQgInhlbmJ1cyIKKyAgICAgICAgIHVuZGVyIC9wcm9jL3hlbiwgYnV0ICJ4ZW5idXMiIGlzIG5vdyBmb3VuZCBhdCB0aGUgcm9vdCBvZiB0aGUKKyAgICAgICAgIHhlbmZzIGZpbGVzeXN0ZW0uICBTZWxlY3RpbmcgdGhpcyBjYXVzZXMgdGhlIGtlcm5lbCB0byBjcmVhdGUKKyAgICAgICAgIHRoZSBjb21wYXRpYmlsdHkgbW91bnQgcG9pbnQgL3Byb2MveGVuIGlmIGl0IGlzIHJ1bm5pbmcgb24KKyAgICAgICAgIGEgeGVuIHBsYXRmb3JtLgorICAgICAgICAgSWYgaW4gZG91YnQsIHNheSB5ZXMuCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMveGVuL01ha2VmaWxlIGIvZHJpdmVycy94ZW4vTWFrZWZpbGUKaW5kZXggZDJhOGZkZi4uZmY4YWNjYyAxMDA2NDQKLS0tIGEvZHJpdmVycy94ZW4vTWFrZWZpbGUKKysrIGIvZHJpdmVycy94ZW4vTWFrZWZpbGUKQEAgLTEsNSArMSw3IEBACiBvYmoteQkrPSBncmFudC10YWJsZS5vIGZlYXR1cmVzLm8gZXZlbnRzLm8gbWFuYWdlLm8KIG9iai15CSs9IHhlbmJ1cy8KKwogb2JqLSQoQ09ORklHX0hPVFBMVUdfQ1BVKQkrPSBjcHVfaG90cGx1Zy5vCiBvYmotJChDT05GSUdfWEVOX1hFTkNPTU0pCSs9IHhlbmNvbW0ubwogb2JqLSQoQ09ORklHX1hFTl9CQUxMT09OKQkrPSBiYWxsb29uLm8KK29iai0kKENPTkZJR19YRU5GUykJCSs9IHhlbmZzLwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RyaXZlcnMveGVuL3hlbmJ1cy94ZW5idXNfY2xpZW50LmMgYi9kcml2ZXJzL3hlbi94ZW5idXMveGVuYnVzX2NsaWVudC5jCmluZGV4IDk2NzhiM2UuLjkyYTFlZjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMveGVuL3hlbmJ1cy94ZW5idXNfY2xpZW50LmMKKysrIGIvZHJpdmVycy94ZW4veGVuYnVzL3hlbmJ1c19jbGllbnQuYwpAQCAtMTM2LDcgKzEzNiw2IEBACiAvKioKICAqIHhlbmJ1c19zd2l0Y2hfc3RhdGUKICAqIEBkZXY6IHhlbmJ1cyBkZXZpY2UKLSAqIEB4YnQ6IHRyYW5zYWN0aW9uIGhhbmRsZQogICogQHN0YXRlOiBuZXcgc3RhdGUKICAqCiAgKiBBZHZlcnRpc2UgaW4gdGhlIHN0b3JlIGEgY2hhbmdlIG9mIHRoZSBnaXZlbiBkcml2ZXIgdG8gdGhlIGdpdmVuIG5ld19zdGF0ZS4KQEAgLTI2Nyw3ICsyNjYsNyBAQAogICogQGZtdDogZXJyb3IgbWVzc2FnZSBmb3JtYXQKICAqCiAgKiBFcXVpdmFsZW50IHRvIHhlbmJ1c19kZXZfZXJyb3IoZGV2LCBlcnIsIGZtdCwgYXJncyksIGZvbGxvd2VkIGJ5Ci0gKiB4ZW5idXNfc3dpdGNoX3N0YXRlKGRldiwgTlVMTCwgWGVuYnVzU3RhdGVDbG9zaW5nKSB0byBzY2hlZHVsZSBhbiBvcmRlcmx5CisgKiB4ZW5idXNfc3dpdGNoX3N0YXRlKGRldiwgWGVuYnVzU3RhdGVDbG9zaW5nKSB0byBzY2hlZHVsZSBhbiBvcmRlcmx5CiAgKiBjbG9zZWRvd24gb2YgdGhpcyBkcml2ZXIgYW5kIGl0cyBwZWVyLgogICovCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMveGVuL3hlbmJ1cy94ZW5idXNfcHJvYmUuYyBiL2RyaXZlcnMveGVuL3hlbmJ1cy94ZW5idXNfcHJvYmUuYwppbmRleCBiMmEwMzE4Li43NzNkMWNmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3hlbi94ZW5idXMveGVuYnVzX3Byb2JlLmMKKysrIGIvZHJpdmVycy94ZW4veGVuYnVzL3hlbmJ1c19wcm9iZS5jCkBAIC00MCw2ICs0MCw3IEBACiAjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KICNpbmNsdWRlIDxsaW51eC9mY250bC5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgogI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+CiAjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CkBAIC01NSw3ICs1NiwxMCBAQAogI2luY2x1ZGUgInhlbmJ1c19jb21tcy5oIgogI2luY2x1ZGUgInhlbmJ1c19wcm9iZS5oIgogCisKIGludCB4ZW5fc3RvcmVfZXZ0Y2huOworRVhQT1JUX1NZTUJPTCh4ZW5fc3RvcmVfZXZ0Y2huKTsKKwogc3RydWN0IHhlbnN0b3JlX2RvbWFpbl9pbnRlcmZhY2UgKnhlbl9zdG9yZV9pbnRlcmZhY2U7CiBzdGF0aWMgdW5zaWduZWQgbG9uZyB4ZW5fc3RvcmVfbWZuOwogCkBAIC0xNjYsNiArMTcwLDkgQEAKIAlyZXR1cm4gcmVhZF9vdGhlcmVuZF9kZXRhaWxzKHhlbmRldiwgImJhY2tlbmQtaWQiLCAiYmFja2VuZCIpOwogfQogCitzdGF0aWMgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgeGVuYnVzX2Rldl9hdHRyc1tdID0geworCV9fQVRUUl9OVUxMCit9OwogCiAvKiBCdXMgdHlwZSBmb3IgZnJvbnRlbmQgZHJpdmVycy4gKi8KIHN0YXRpYyBzdHJ1Y3QgeGVuX2J1c190eXBlIHhlbmJ1c19mcm9udGVuZCA9IHsKQEAgLTE3NCwxMiArMTgxLDEzIEBACiAJLmdldF9idXNfaWQgPSBmcm9udGVuZF9idXNfaWQsCiAJLnByb2JlID0geGVuYnVzX3Byb2JlX2Zyb250ZW5kLAogCS5idXMgPSB7Ci0JCS5uYW1lICAgICA9ICJ4ZW4iLAotCQkubWF0Y2ggICAgPSB4ZW5idXNfbWF0Y2gsCi0JCS51ZXZlbnQgICA9IHhlbmJ1c191ZXZlbnQsCi0JCS5wcm9iZSAgICA9IHhlbmJ1c19kZXZfcHJvYmUsCi0JCS5yZW1vdmUgICA9IHhlbmJ1c19kZXZfcmVtb3ZlLAotCQkuc2h1dGRvd24gPSB4ZW5idXNfZGV2X3NodXRkb3duLAorCQkubmFtZSAgICAgID0gInhlbiIsCisJCS5tYXRjaCAgICAgPSB4ZW5idXNfbWF0Y2gsCisJCS51ZXZlbnQgICAgPSB4ZW5idXNfdWV2ZW50LAorCQkucHJvYmUgICAgID0geGVuYnVzX2Rldl9wcm9iZSwKKwkJLnJlbW92ZSAgICA9IHhlbmJ1c19kZXZfcmVtb3ZlLAorCQkuc2h1dGRvd24gID0geGVuYnVzX2Rldl9zaHV0ZG93biwKKwkJLmRldl9hdHRycyA9IHhlbmJ1c19kZXZfYXR0cnMsCiAJfSwKIH07CiAKQEAgLTg1Miw2ICs4NjAsMTQgQEAKIAlpZiAoIXhlbl9pbml0aWFsX2RvbWFpbigpKQogCQl4ZW5idXNfcHJvYmUoTlVMTCk7CiAKKyNpZmRlZiBDT05GSUdfWEVOX0NPTVBBVF9YRU5GUworCS8qCisJICogQ3JlYXRlIHhlbmZzIG1vdW50cG9pbnQgaW4gL3Byb2MgZm9yIGNvbXBhdGliaWxpdHkgd2l0aAorCSAqIHV0aWxpdGllcyB0aGF0IGV4cGVjdCB0byBmaW5kICJ4ZW5idXMiIHVuZGVyICIvcHJvYy94ZW4iLgorCSAqLworCXByb2NfbWtkaXIoInhlbiIsIE5VTEwpOworI2VuZGlmCisKIAlyZXR1cm4gMDsKIAogICBvdXRfdW5yZWdfYmFjazoKZGlmZiAtLWdpdCBhL2RyaXZlcnMveGVuL3hlbmJ1cy94ZW5idXNfeHMuYyBiL2RyaXZlcnMveGVuL3hlbmJ1cy94ZW5idXNfeHMuYwppbmRleCA3ZjJmOTFjLi5lMzI1ZWFiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3hlbi94ZW5idXMveGVuYnVzX3hzLmMKKysrIGIvZHJpdmVycy94ZW4veGVuYnVzL3hlbmJ1c194cy5jCkBAIC0xODQsNiArMTg0LDcgQEAKIAogCXJldHVybiByZXQ7CiB9CitFWFBPUlRfU1lNQk9MKHhlbmJ1c19kZXZfcmVxdWVzdF9hbmRfcmVwbHkpOwogCiAvKiBTZW5kIG1lc3NhZ2UgdG8geHMsIGdldCBrbWFsbG9jJ2VkIHJlcGx5LiAgRVJSX1BUUigpIG9uIGVycm9yLiAqLwogc3RhdGljIHZvaWQgKnhzX3RhbGt2KHN0cnVjdCB4ZW5idXNfdHJhbnNhY3Rpb24gdCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMveGVuL3hlbmZzL01ha2VmaWxlIGIvZHJpdmVycy94ZW4veGVuZnMvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjUyNzVjMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMveGVuL3hlbmZzL01ha2VmaWxlCkBAIC0wLDAgKzEsMyBAQAorb2JqLSQoQ09ORklHX1hFTkZTKSArPSB4ZW5mcy5vCisKK3hlbmZzLW9ianMgPSBzdXBlci5vIHhlbmJ1cy5vClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy94ZW4veGVuZnMvc3VwZXIuYyBiL2RyaXZlcnMveGVuL3hlbmZzL3N1cGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTE1NzQxYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMveGVuL3hlbmZzL3N1cGVyLmMKQEAgLTAsMCArMSw2NCBAQAorLyoKKyAqICB4ZW5mcy5jIC0gYSBmaWxlc3lzdGVtIGZvciBwYXNzaW5nIGluZm8gYmV0d2VlbiB0aGUgYSBkb21haW4gYW5kCisgKiAgdGhlIGh5cGVydmlzb3IuCisgKgorICogMjAwOC0xMC0wNyAgQWxleCBaZWZmZXJ0dCAgICBSZXBsYWNlZCAvcHJvYy94ZW4veGVuYnVzIHdpdGggeGVuZnMgZmlsZXN5c3RlbQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgL3Byb2MveGVuIGNvbXBhdGliaWxpdHkgbW91bnQgcG9pbnQuCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR1cm5lZCB4ZW5mcyBpbnRvIGEgbG9hZGFibGUgbW9kdWxlLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbWFnaWMuaD4KKworI2luY2x1ZGUgInhlbmZzLmgiCisKKyNpbmNsdWRlIDxhc20veGVuL2h5cGVydmlzb3IuaD4KKworTU9EVUxFX0RFU0NSSVBUSU9OKCJYZW4gZmlsZXN5c3RlbSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitzdGF0aWMgaW50IHhlbmZzX2ZpbGxfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdm9pZCAqZGF0YSwgaW50IHNpbGVudCkKK3sKKwlzdGF0aWMgc3RydWN0IHRyZWVfZGVzY3IgeGVuZnNfZmlsZXNbXSA9IHsKKwkJWzJdID0geyJ4ZW5idXMiLCAmeGVuYnVzX2ZpbGVfb3BzLCBTX0lSVVNSfFNfSVdVU1J9LAorCQl7IiJ9LAorCX07CisKKwlyZXR1cm4gc2ltcGxlX2ZpbGxfc3VwZXIoc2IsIFhFTkZTX1NVUEVSX01BR0lDLCB4ZW5mc19maWxlcyk7Cit9CisKK3N0YXRpYyBpbnQgeGVuZnNfZ2V0X3NiKHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICpmc190eXBlLAorCQkJaW50IGZsYWdzLCBjb25zdCBjaGFyICpkZXZfbmFtZSwKKwkJCXZvaWQgKmRhdGEsIHN0cnVjdCB2ZnNtb3VudCAqbW50KQoreworCXJldHVybiBnZXRfc2Jfc2luZ2xlKGZzX3R5cGUsIGZsYWdzLCBkYXRhLCB4ZW5mc19maWxsX3N1cGVyLCBtbnQpOworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgeGVuZnNfdHlwZSA9IHsKKwkub3duZXIgPQlUSElTX01PRFVMRSwKKwkubmFtZSA9CQkieGVuZnMiLAorCS5nZXRfc2IgPQl4ZW5mc19nZXRfc2IsCisJLmtpbGxfc2IgPQlraWxsX2xpdHRlcl9zdXBlciwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHhlbmZzX2luaXQodm9pZCkKK3sKKwlpZiAoeGVuX3B2X2RvbWFpbigpKQorCQlyZXR1cm4gcmVnaXN0ZXJfZmlsZXN5c3RlbSgmeGVuZnNfdHlwZSk7CisKKwlwcmludGsoS0VSTl9JTkZPICJYRU5GUzogbm90IHJlZ2lzdGVyaW5nIGZpbGVzeXN0ZW0gb24gbm9uLXhlbiBwbGF0Zm9ybVxuIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB4ZW5mc19leGl0KHZvaWQpCit7CisJaWYgKHhlbl9wdl9kb21haW4oKSkKKwkJdW5yZWdpc3Rlcl9maWxlc3lzdGVtKCZ4ZW5mc190eXBlKTsKK30KKworbW9kdWxlX2luaXQoeGVuZnNfaW5pdCk7Cittb2R1bGVfZXhpdCh4ZW5mc19leGl0KTsKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy94ZW4veGVuZnMveGVuYnVzLmMgYi9kcml2ZXJzL3hlbi94ZW5mcy94ZW5idXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NzVhNGM1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy94ZW4veGVuZnMveGVuYnVzLmMKQEAgLTAsMCArMSw1OTMgQEAKKy8qCisgKiBEcml2ZXIgZ2l2aW5nIHVzZXItc3BhY2UgYWNjZXNzIHRvIHRoZSBrZXJuZWwncyB4ZW5idXMgY29ubmVjdGlvbgorICogdG8geGVuc3RvcmUuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA1LCBDaHJpc3RpYW4gTGltcGFjaAorICogQ29weXJpZ2h0IChjKSAyMDA1LCBSdXN0eSBSdXNzZWxsLCBJQk0gQ29ycG9yYXRpb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBvciwgd2hlbiBkaXN0cmlidXRlZAorICogc2VwYXJhdGVseSBmcm9tIHRoZSBMaW51eCBrZXJuZWwgb3IgaW5jb3Jwb3JhdGVkIGludG8gb3RoZXIKKyAqIHNvZnR3YXJlIHBhY2thZ2VzLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgbGljZW5zZToKKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CisgKiBvZiB0aGlzIHNvdXJjZSBmaWxlICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQKKyAqIHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksCisgKiBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwKKyAqIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUworICogSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIENoYW5nZXM6CisgKiAyMDA4LTEwLTA3ICBBbGV4IFplZmZlcnR0ICAgIFJlcGxhY2VkIC9wcm9jL3hlbi94ZW5idXMgd2l0aCB4ZW5mcyBmaWxlc3lzdGVtCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCAvcHJvYy94ZW4gY29tcGF0aWJpbGl0eSBtb3VudCBwb2ludC4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHVybmVkIHhlbmZzIGludG8gYSBsb2FkYWJsZSBtb2R1bGUuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvdWlvLmg+CisjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KKyNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L21vdW50Lmg+CisjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbmFtZWkuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKworI2luY2x1ZGUgInhlbmZzLmgiCisjaW5jbHVkZSAiLi4veGVuYnVzL3hlbmJ1c19jb21tcy5oIgorCisjaW5jbHVkZSA8eGVuL3hlbmJ1cy5oPgorI2luY2x1ZGUgPGFzbS94ZW4vaHlwZXJ2aXNvci5oPgorCisvKgorICogQW4gZWxlbWVudCBvZiBhIGxpc3Qgb2Ygb3V0c3RhbmRpbmcgdHJhbnNhY3Rpb25zLCBmb3Igd2hpY2ggd2UncmUKKyAqIHN0aWxsIHdhaXRpbmcgYSByZXBseS4KKyAqLworc3RydWN0IHhlbmJ1c190cmFuc2FjdGlvbl9ob2xkZXIgeworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwlzdHJ1Y3QgeGVuYnVzX3RyYW5zYWN0aW9uIGhhbmRsZTsKK307CisKKy8qCisgKiBBIGJ1ZmZlciBvZiBkYXRhIG9uIHRoZSBxdWV1ZS4KKyAqLworc3RydWN0IHJlYWRfYnVmZmVyIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJdW5zaWduZWQgaW50IGNvbnM7CisJdW5zaWduZWQgaW50IGxlbjsKKwljaGFyIG1zZ1tdOworfTsKKworc3RydWN0IHhlbmJ1c19maWxlX3ByaXYgeworCS8qCisJICogbXNnYnVmZmVyX211dGV4IGlzIGhlbGQgd2hpbGUgcGFydGlhbCByZXF1ZXN0cyBhcmUgYnVpbHQgdXAKKwkgKiBhbmQgY29tcGxldGUgcmVxdWVzdHMgYXJlIGFjdGVkIG9uLiAgSXQgdGhlcmVmb3JlIHByb3RlY3RzCisJICogdGhlICJ0cmFuc2FjdGlvbnMiIGFuZCAid2F0Y2hlcyIgbGlzdHMsIGFuZCB0aGUgcGFydGlhbAorCSAqIHJlcXVlc3QgbGVuZ3RoIGFuZCBidWZmZXIuCisJICoKKwkgKiByZXBseV9tdXRleCBwcm90ZWN0cyB0aGUgcmVwbHkgYmVpbmcgYnVpbHQgdXAgdG8gcmV0dXJuIHRvCisJICogdXNlcm1vZGUuICBJdCBuZXN0cyBpbnNpZGUgbXNnYnVmZmVyX211dGV4IGJ1dCBtYXkgYmUgaGVsZAorCSAqIGFsb25lIGR1cmluZyBhIHdhdGNoIGNhbGxiYWNrLgorCSAqLworCXN0cnVjdCBtdXRleCBtc2didWZmZXJfbXV0ZXg7CisKKwkvKiBJbi1wcm9ncmVzcyB0cmFuc2FjdGlvbnMgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIHRyYW5zYWN0aW9uczsKKworCS8qIEFjdGl2ZSB3YXRjaGVzLiAqLworCXN0cnVjdCBsaXN0X2hlYWQgd2F0Y2hlczsKKworCS8qIFBhcnRpYWwgcmVxdWVzdC4gKi8KKwl1bnNpZ25lZCBpbnQgbGVuOworCXVuaW9uIHsKKwkJc3RydWN0IHhzZF9zb2NrbXNnIG1zZzsKKwkJY2hhciBidWZmZXJbUEFHRV9TSVpFXTsKKwl9IHU7CisKKwkvKiBSZXNwb25zZSBxdWV1ZS4gKi8KKwlzdHJ1Y3QgbXV0ZXggcmVwbHlfbXV0ZXg7CisJc3RydWN0IGxpc3RfaGVhZCByZWFkX2J1ZmZlcnM7CisJd2FpdF9xdWV1ZV9oZWFkX3QgcmVhZF93YWl0cTsKKworfTsKKworLyogUmVhZCBvdXQgYW55IHJhdyB4ZW5idXMgbWVzc2FnZXMgcXVldWVkIHVwLiAqLworc3RhdGljIHNzaXplX3QgeGVuYnVzX2ZpbGVfcmVhZChzdHJ1Y3QgZmlsZSAqZmlscCwKKwkJCSAgICAgICBjaGFyIF9fdXNlciAqdWJ1ZiwKKwkJCSAgICAgICBzaXplX3QgbGVuLCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IHhlbmJ1c19maWxlX3ByaXYgKnUgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHJlYWRfYnVmZmVyICpyYjsKKwl1bnNpZ25lZCBpOworCWludCByZXQ7CisKKwltdXRleF9sb2NrKCZ1LT5yZXBseV9tdXRleCk7CisJd2hpbGUgKGxpc3RfZW1wdHkoJnUtPnJlYWRfYnVmZmVycykpIHsKKwkJbXV0ZXhfdW5sb2NrKCZ1LT5yZXBseV9tdXRleCk7CisJCXJldCA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZSh1LT5yZWFkX3dhaXRxLAorCQkJCQkgICAgICAgIWxpc3RfZW1wdHkoJnUtPnJlYWRfYnVmZmVycykpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwkJbXV0ZXhfbG9jaygmdS0+cmVwbHlfbXV0ZXgpOworCX0KKworCXJiID0gbGlzdF9lbnRyeSh1LT5yZWFkX2J1ZmZlcnMubmV4dCwgc3RydWN0IHJlYWRfYnVmZmVyLCBsaXN0KTsKKwlpID0gMDsKKwl3aGlsZSAoaSA8IGxlbikgeworCQl1bnNpZ25lZCBzeiA9IG1pbigodW5zaWduZWQpbGVuIC0gaSwgcmItPmxlbiAtIHJiLT5jb25zKTsKKworCQlyZXQgPSBjb3B5X3RvX3VzZXIodWJ1ZiArIGksICZyYi0+bXNnW3JiLT5jb25zXSwgc3opOworCisJCWkgKz0gc3ogLSByZXQ7CisJCXJiLT5jb25zICs9IHN6IC0gcmV0OworCisJCWlmIChyZXQgIT0gc3opIHsKKwkJCWlmIChpID09IDApCisJCQkJaSA9IC1FRkFVTFQ7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCS8qIENsZWFyIG91dCBidWZmZXIgaWYgaXQgaGFzIGJlZW4gY29uc3VtZWQgKi8KKwkJaWYgKHJiLT5jb25zID09IHJiLT5sZW4pIHsKKwkJCWxpc3RfZGVsKCZyYi0+bGlzdCk7CisJCQlrZnJlZShyYik7CisJCQlpZiAobGlzdF9lbXB0eSgmdS0+cmVhZF9idWZmZXJzKSkKKwkJCQlicmVhazsKKwkJCXJiID0gbGlzdF9lbnRyeSh1LT5yZWFkX2J1ZmZlcnMubmV4dCwKKwkJCQkJc3RydWN0IHJlYWRfYnVmZmVyLCBsaXN0KTsKKwkJfQorCX0KKworb3V0OgorCW11dGV4X3VubG9jaygmdS0+cmVwbHlfbXV0ZXgpOworCXJldHVybiBpOworfQorCisvKgorICogQWRkIGEgYnVmZmVyIHRvIHRoZSBxdWV1ZS4gIENhbGxlciBtdXN0IGhvbGQgdGhlIGFwcHJvcHJpYXRlIGxvY2sKKyAqIGlmIHRoZSBxdWV1ZSBpcyBub3QgbG9jYWwuICAoQ29tbW9ubHkgdGhlIGNhbGxlciB3aWxsIGJ1aWxkIHVwCisgKiBtdWx0aXBsZSBxdWV1ZWQgYnVmZmVycyBvbiBhIHRlbXBvcmFyeSBsb2NhbCBsaXN0LCBhbmQgdGhlbiBhZGQgaXQKKyAqIHRvIHRoZSBhcHByb3ByaWF0ZSBsaXN0IHVuZGVyIGxvY2sgb25jZSBhbGwgdGhlIGJ1ZmZlcnMgaGF2ZSBlZW4KKyAqIHN1Y2Nlc3NmdWxseSBhbGxvY2F0ZWQuKQorICovCitzdGF0aWMgaW50IHF1ZXVlX3JlcGx5KHN0cnVjdCBsaXN0X2hlYWQgKnF1ZXVlLCBjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgbGVuKQoreworCXN0cnVjdCByZWFkX2J1ZmZlciAqcmI7CisKKwlpZiAobGVuID09IDApCisJCXJldHVybiAwOworCisJcmIgPSBrbWFsbG9jKHNpemVvZigqcmIpICsgbGVuLCBHRlBfS0VSTkVMKTsKKwlpZiAocmIgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyYi0+Y29ucyA9IDA7CisJcmItPmxlbiA9IGxlbjsKKworCW1lbWNweShyYi0+bXNnLCBkYXRhLCBsZW4pOworCisJbGlzdF9hZGRfdGFpbCgmcmItPmxpc3QsIHF1ZXVlKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEZyZWUgYWxsIHRoZSByZWFkX2J1ZmZlciBzIG9uIGEgbGlzdC4KKyAqIENhbGxlciBtdXN0IGhhdmUgc29sZSByZWZlcmVuY2UgdG8gbGlzdC4KKyAqLworc3RhdGljIHZvaWQgcXVldWVfY2xlYW51cChzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0KQoreworCXN0cnVjdCByZWFkX2J1ZmZlciAqcmI7CisKKwl3aGlsZSAoIWxpc3RfZW1wdHkobGlzdCkpIHsKKwkJcmIgPSBsaXN0X2VudHJ5KGxpc3QtPm5leHQsIHN0cnVjdCByZWFkX2J1ZmZlciwgbGlzdCk7CisJCWxpc3RfZGVsKGxpc3QtPm5leHQpOworCQlrZnJlZShyYik7CisJfQorfQorCitzdHJ1Y3Qgd2F0Y2hfYWRhcHRlciB7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCXN0cnVjdCB4ZW5idXNfd2F0Y2ggd2F0Y2g7CisJc3RydWN0IHhlbmJ1c19maWxlX3ByaXYgKmRldl9kYXRhOworCWNoYXIgKnRva2VuOworfTsKKworc3RhdGljIHZvaWQgZnJlZV93YXRjaF9hZGFwdGVyKHN0cnVjdCB3YXRjaF9hZGFwdGVyICp3YXRjaCkKK3sKKwlrZnJlZSh3YXRjaC0+d2F0Y2gubm9kZSk7CisJa2ZyZWUod2F0Y2gtPnRva2VuKTsKKwlrZnJlZSh3YXRjaCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgd2F0Y2hfYWRhcHRlciAqYWxsb2Nfd2F0Y2hfYWRhcHRlcihjb25zdCBjaGFyICpwYXRoLAorCQkJCQkJIGNvbnN0IGNoYXIgKnRva2VuKQoreworCXN0cnVjdCB3YXRjaF9hZGFwdGVyICp3YXRjaDsKKworCXdhdGNoID0ga3phbGxvYyhzaXplb2YoKndhdGNoKSwgR0ZQX0tFUk5FTCk7CisJaWYgKHdhdGNoID09IE5VTEwpCisJCWdvdG8gb3V0X2ZhaWw7CisKKwl3YXRjaC0+d2F0Y2gubm9kZSA9IGtzdHJkdXAocGF0aCwgR0ZQX0tFUk5FTCk7CisJaWYgKHdhdGNoLT53YXRjaC5ub2RlID09IE5VTEwpCisJCWdvdG8gb3V0X2ZyZWU7CisKKwl3YXRjaC0+dG9rZW4gPSBrc3RyZHVwKHRva2VuLCBHRlBfS0VSTkVMKTsKKwlpZiAod2F0Y2gtPnRva2VuID09IE5VTEwpCisJCWdvdG8gb3V0X2ZyZWU7CisKKwlyZXR1cm4gd2F0Y2g7CisKK291dF9mcmVlOgorCWZyZWVfd2F0Y2hfYWRhcHRlcih3YXRjaCk7CisKK291dF9mYWlsOgorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZCB3YXRjaF9maXJlZChzdHJ1Y3QgeGVuYnVzX3dhdGNoICp3YXRjaCwKKwkJCWNvbnN0IGNoYXIgKip2ZWMsCisJCQl1bnNpZ25lZCBpbnQgbGVuKQoreworCXN0cnVjdCB3YXRjaF9hZGFwdGVyICphZGFwOworCXN0cnVjdCB4c2Rfc29ja21zZyBoZHI7CisJY29uc3QgY2hhciAqcGF0aCwgKnRva2VuOworCWludCBwYXRoX2xlbiwgdG9rX2xlbiwgYm9keV9sZW4sIGRhdGFfbGVuID0gMDsKKwlpbnQgcmV0OworCUxJU1RfSEVBRChzdGFnaW5nX3EpOworCisJYWRhcCA9IGNvbnRhaW5lcl9vZih3YXRjaCwgc3RydWN0IHdhdGNoX2FkYXB0ZXIsIHdhdGNoKTsKKworCXBhdGggPSB2ZWNbWFNfV0FUQ0hfUEFUSF07CisJdG9rZW4gPSBhZGFwLT50b2tlbjsKKworCXBhdGhfbGVuID0gc3RybGVuKHBhdGgpICsgMTsKKwl0b2tfbGVuID0gc3RybGVuKHRva2VuKSArIDE7CisJaWYgKGxlbiA+IDIpCisJCWRhdGFfbGVuID0gdmVjW2xlbl0gLSB2ZWNbMl0gKyAxOworCWJvZHlfbGVuID0gcGF0aF9sZW4gKyB0b2tfbGVuICsgZGF0YV9sZW47CisKKwloZHIudHlwZSA9IFhTX1dBVENIX0VWRU5UOworCWhkci5sZW4gPSBib2R5X2xlbjsKKworCW11dGV4X2xvY2soJmFkYXAtPmRldl9kYXRhLT5yZXBseV9tdXRleCk7CisKKwlyZXQgPSBxdWV1ZV9yZXBseSgmc3RhZ2luZ19xLCAmaGRyLCBzaXplb2YoaGRyKSk7CisJaWYgKCFyZXQpCisJCXJldCA9IHF1ZXVlX3JlcGx5KCZzdGFnaW5nX3EsIHBhdGgsIHBhdGhfbGVuKTsKKwlpZiAoIXJldCkKKwkJcmV0ID0gcXVldWVfcmVwbHkoJnN0YWdpbmdfcSwgdG9rZW4sIHRva19sZW4pOworCWlmICghcmV0ICYmIGxlbiA+IDIpCisJCXJldCA9IHF1ZXVlX3JlcGx5KCZzdGFnaW5nX3EsIHZlY1syXSwgZGF0YV9sZW4pOworCisJaWYgKCFyZXQpIHsKKwkJLyogc3VjY2VzczogcGFzcyByZXBseSBsaXN0IG9udG8gd2F0Y2hlciAqLworCQlsaXN0X3NwbGljZV90YWlsKCZzdGFnaW5nX3EsICZhZGFwLT5kZXZfZGF0YS0+cmVhZF9idWZmZXJzKTsKKwkJd2FrZV91cCgmYWRhcC0+ZGV2X2RhdGEtPnJlYWRfd2FpdHEpOworCX0gZWxzZQorCQlxdWV1ZV9jbGVhbnVwKCZzdGFnaW5nX3EpOworCisJbXV0ZXhfdW5sb2NrKCZhZGFwLT5kZXZfZGF0YS0+cmVwbHlfbXV0ZXgpOworfQorCitzdGF0aWMgaW50IHhlbmJ1c193cml0ZV90cmFuc2FjdGlvbih1bnNpZ25lZCBtc2dfdHlwZSwKKwkJCQkgICAgc3RydWN0IHhlbmJ1c19maWxlX3ByaXYgKnUpCit7CisJaW50IHJjLCByZXQ7CisJdm9pZCAqcmVwbHk7CisJc3RydWN0IHhlbmJ1c190cmFuc2FjdGlvbl9ob2xkZXIgKnRyYW5zID0gTlVMTDsKKwlMSVNUX0hFQUQoc3RhZ2luZ19xKTsKKworCWlmIChtc2dfdHlwZSA9PSBYU19UUkFOU0FDVElPTl9TVEFSVCkgeworCQl0cmFucyA9IGttYWxsb2Moc2l6ZW9mKCp0cmFucyksIEdGUF9LRVJORUwpOworCQlpZiAoIXRyYW5zKSB7CisJCQlyYyA9IC1FTk9NRU07CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKworCXJlcGx5ID0geGVuYnVzX2Rldl9yZXF1ZXN0X2FuZF9yZXBseSgmdS0+dS5tc2cpOworCWlmIChJU19FUlIocmVwbHkpKSB7CisJCWtmcmVlKHRyYW5zKTsKKwkJcmMgPSBQVFJfRVJSKHJlcGx5KTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKG1zZ190eXBlID09IFhTX1RSQU5TQUNUSU9OX1NUQVJUKSB7CisJCXRyYW5zLT5oYW5kbGUuaWQgPSBzaW1wbGVfc3RydG91bChyZXBseSwgTlVMTCwgMCk7CisKKwkJbGlzdF9hZGQoJnRyYW5zLT5saXN0LCAmdS0+dHJhbnNhY3Rpb25zKTsKKwl9IGVsc2UgaWYgKG1zZ190eXBlID09IFhTX1RSQU5TQUNUSU9OX0VORCkgeworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHRyYW5zLCAmdS0+dHJhbnNhY3Rpb25zLCBsaXN0KQorCQkJaWYgKHRyYW5zLT5oYW5kbGUuaWQgPT0gdS0+dS5tc2cudHhfaWQpCisJCQkJYnJlYWs7CisJCUJVR19PTigmdHJhbnMtPmxpc3QgPT0gJnUtPnRyYW5zYWN0aW9ucyk7CisJCWxpc3RfZGVsKCZ0cmFucy0+bGlzdCk7CisKKwkJa2ZyZWUodHJhbnMpOworCX0KKworCW11dGV4X2xvY2soJnUtPnJlcGx5X211dGV4KTsKKwlyZXQgPSBxdWV1ZV9yZXBseSgmc3RhZ2luZ19xLCAmdS0+dS5tc2csIHNpemVvZih1LT51Lm1zZykpOworCWlmICghcmV0KQorCQlyZXQgPSBxdWV1ZV9yZXBseSgmc3RhZ2luZ19xLCByZXBseSwgdS0+dS5tc2cubGVuKTsKKwlpZiAoIXJldCkgeworCQlsaXN0X3NwbGljZV90YWlsKCZzdGFnaW5nX3EsICZ1LT5yZWFkX2J1ZmZlcnMpOworCQl3YWtlX3VwKCZ1LT5yZWFkX3dhaXRxKTsKKwl9IGVsc2UgeworCQlxdWV1ZV9jbGVhbnVwKCZzdGFnaW5nX3EpOworCQlyYyA9IHJldDsKKwl9CisJbXV0ZXhfdW5sb2NrKCZ1LT5yZXBseV9tdXRleCk7CisKKwlrZnJlZShyZXBseSk7CisKK291dDoKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgeGVuYnVzX3dyaXRlX3dhdGNoKHVuc2lnbmVkIG1zZ190eXBlLCBzdHJ1Y3QgeGVuYnVzX2ZpbGVfcHJpdiAqdSkKK3sKKwlzdHJ1Y3Qgd2F0Y2hfYWRhcHRlciAqd2F0Y2gsICp0bXBfd2F0Y2g7CisJY2hhciAqcGF0aCwgKnRva2VuOworCWludCBlcnIsIHJjOworCUxJU1RfSEVBRChzdGFnaW5nX3EpOworCisJcGF0aCA9IHUtPnUuYnVmZmVyICsgc2l6ZW9mKHUtPnUubXNnKTsKKwl0b2tlbiA9IG1lbWNocihwYXRoLCAwLCB1LT51Lm1zZy5sZW4pOworCWlmICh0b2tlbiA9PSBOVUxMKSB7CisJCXJjID0gLUVJTFNFUTsKKwkJZ290byBvdXQ7CisJfQorCXRva2VuKys7CisKKwlpZiAobXNnX3R5cGUgPT0gWFNfV0FUQ0gpIHsKKwkJd2F0Y2ggPSBhbGxvY193YXRjaF9hZGFwdGVyKHBhdGgsIHRva2VuKTsKKwkJaWYgKHdhdGNoID09IE5VTEwpIHsKKwkJCXJjID0gLUVOT01FTTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJd2F0Y2gtPndhdGNoLmNhbGxiYWNrID0gd2F0Y2hfZmlyZWQ7CisJCXdhdGNoLT5kZXZfZGF0YSA9IHU7CisKKwkJZXJyID0gcmVnaXN0ZXJfeGVuYnVzX3dhdGNoKCZ3YXRjaC0+d2F0Y2gpOworCQlpZiAoZXJyKSB7CisJCQlmcmVlX3dhdGNoX2FkYXB0ZXIod2F0Y2gpOworCQkJcmMgPSBlcnI7CisJCQlnb3RvIG91dDsKKwkJfQorCQlsaXN0X2FkZCgmd2F0Y2gtPmxpc3QsICZ1LT53YXRjaGVzKTsKKwl9IGVsc2UgeworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUod2F0Y2gsIHRtcF93YXRjaCwgJnUtPndhdGNoZXMsIGxpc3QpIHsKKwkJCWlmICghc3RyY21wKHdhdGNoLT50b2tlbiwgdG9rZW4pICYmCisJCQkgICAgIXN0cmNtcCh3YXRjaC0+d2F0Y2gubm9kZSwgcGF0aCkpIHsKKwkJCQl1bnJlZ2lzdGVyX3hlbmJ1c193YXRjaCgmd2F0Y2gtPndhdGNoKTsKKwkJCQlsaXN0X2RlbCgmd2F0Y2gtPmxpc3QpOworCQkJCWZyZWVfd2F0Y2hfYWRhcHRlcih3YXRjaCk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisKKwkvKiBTdWNjZXNzLiAgU3ludGhlc2l6ZSBhIHJlcGx5IHRvIHNheSBhbGwgaXMgT0suICovCisJeworCQlzdHJ1Y3QgeworCQkJc3RydWN0IHhzZF9zb2NrbXNnIGhkcjsKKwkJCWNoYXIgYm9keVszXTsKKwkJfSBfX3BhY2tlZCByZXBseSA9IHsKKwkJCXsKKwkJCQkudHlwZSA9IG1zZ190eXBlLAorCQkJCS5sZW4gPSBzaXplb2YocmVwbHkuYm9keSkKKwkJCX0sCisJCQkiT0siCisJCX07CisKKwkJbXV0ZXhfbG9jaygmdS0+cmVwbHlfbXV0ZXgpOworCQlyYyA9IHF1ZXVlX3JlcGx5KCZ1LT5yZWFkX2J1ZmZlcnMsICZyZXBseSwgc2l6ZW9mKHJlcGx5KSk7CisJCW11dGV4X3VubG9jaygmdS0+cmVwbHlfbXV0ZXgpOworCX0KKworb3V0OgorCXJldHVybiByYzsKK30KKworc3RhdGljIHNzaXplX3QgeGVuYnVzX2ZpbGVfd3JpdGUoc3RydWN0IGZpbGUgKmZpbHAsCisJCQkJY29uc3QgY2hhciBfX3VzZXIgKnVidWYsCisJCQkJc2l6ZV90IGxlbiwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCB4ZW5idXNfZmlsZV9wcml2ICp1ID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCXVpbnQzMl90IG1zZ190eXBlOworCWludCByYyA9IGxlbjsKKwlpbnQgcmV0OworCUxJU1RfSEVBRChzdGFnaW5nX3EpOworCisJLyoKKwkgKiBXZSdyZSBleHBlY3RpbmcgdXNlcm1vZGUgdG8gYmUgd3JpdGluZyBwcm9wZXJseSBmb3JtZWQKKwkgKiB4ZW5idXMgbWVzc2FnZXMuICBJZiB0aGV5IHdyaXRlIGFuIGluY29tcGxldGUgbWVzc2FnZSB3ZQorCSAqIGJ1ZmZlciBpdCB1cC4gIE9uY2UgaXQgaXMgY29tcGxldGUsIHdlIGFjdCBvbiBpdC4KKwkgKi8KKworCS8qCisJICogTWFrZSBzdXJlIGNvbmN1cnJlbnQgd3JpdGVycyBjYW4ndCBzdG9tcCBhbGwgb3ZlciBlYWNoCisJICogb3RoZXIncyBtZXNzYWdlcyBhbmQgbWFrZSBhIG1lc3Mgb2Ygb3VyIHBhcnRpYWwgbWVzc2FnZQorCSAqIGJ1ZmZlci4gIFdlIGRvbid0IG1ha2UgYW55IGF0dGVtcHB0IHRvIHN0b3AgbXVsdGlwbGUKKwkgKiB3cml0ZXJzIGZyb20gbWFraW5nIGEgbWVzcyBvZiBlYWNoIG90aGVyJ3MgaW5jb21wbGV0ZQorCSAqIG1lc3NhZ2VzOyB3ZSdyZSBqdXN0IHRyeWluZyB0byBndWFyYW50ZWUgb3VyIG93biBpbnRlcm5hbAorCSAqIGNvbnNpc3RlbmN5IGFuZCBtYWtlIHN1cmUgdGhhdCBzaW5nbGUgd3JpdGVzIGFyZSBoYW5kbGVkCisJICogYXRvbWljYWxseS4KKwkgKi8KKwltdXRleF9sb2NrKCZ1LT5tc2didWZmZXJfbXV0ZXgpOworCisJLyogR2V0IHRoaXMgb3V0IG9mIHRoZSB3YXkgZWFybHkgdG8gYXZvaWQgY29uZnVzaW9uICovCisJaWYgKGxlbiA9PSAwKQorCQlnb3RvIG91dDsKKworCS8qIENhbid0IHdyaXRlIGEgeGVuYnVzIG1lc3NhZ2UgbGFyZ2VyIHdlIGNhbiBidWZmZXIgKi8KKwlpZiAoKGxlbiArIHUtPmxlbikgPiBzaXplb2YodS0+dS5idWZmZXIpKSB7CisJCS8qIE9uIGVycm9yLCBkdW1wIGV4aXN0aW5nIGJ1ZmZlciAqLworCQl1LT5sZW4gPSAwOworCQlyYyA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKworCXJldCA9IGNvcHlfZnJvbV91c2VyKHUtPnUuYnVmZmVyICsgdS0+bGVuLCB1YnVmLCBsZW4pOworCisJaWYgKHJldCA9PSBsZW4pIHsKKwkJcmMgPSAtRUZBVUxUOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBEZWFsIHdpdGggYSBwYXJ0aWFsIGNvcHkuICovCisJbGVuIC09IHJldDsKKwlyYyA9IGxlbjsKKworCXUtPmxlbiArPSBsZW47CisKKwkvKiBSZXR1cm4gaWYgd2UgaGF2ZW4ndCBnb3QgYSBmdWxsIG1lc3NhZ2UgeWV0ICovCisJaWYgKHUtPmxlbiA8IHNpemVvZih1LT51Lm1zZykpCisJCWdvdG8gb3V0OwkvKiBub3QgZXZlbiB0aGUgaGVhZGVyIHlldCAqLworCisJLyogSWYgd2UncmUgZXhwZWN0aW5nIGEgbWVzc2FnZSB0aGF0J3MgbGFyZ2VyIHRoYW4gd2UgY2FuCisJICAgcG9zc2libHkgc2VuZCwgZHVtcCB3aGF0IHdlIGhhdmUgYW5kIHJldHVybiBhbiBlcnJvci4gKi8KKwlpZiAoKHNpemVvZih1LT51Lm1zZykgKyB1LT51Lm1zZy5sZW4pID4gc2l6ZW9mKHUtPnUuYnVmZmVyKSkgeworCQlyYyA9IC1FMkJJRzsKKwkJdS0+bGVuID0gMDsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKHUtPmxlbiA8IChzaXplb2YodS0+dS5tc2cpICsgdS0+dS5tc2cubGVuKSkKKwkJZ290byBvdXQ7CS8qIGluY29tcGxldGUgZGF0YSBwb3J0aW9uICovCisKKwkvKgorCSAqIE9LLCBub3cgd2UgaGF2ZSBhIGNvbXBsZXRlIG1lc3NhZ2UuICBEbyBzb21ldGhpbmcgd2l0aCBpdC4KKwkgKi8KKworCW1zZ190eXBlID0gdS0+dS5tc2cudHlwZTsKKworCXN3aXRjaCAobXNnX3R5cGUpIHsKKwljYXNlIFhTX1RSQU5TQUNUSU9OX1NUQVJUOgorCWNhc2UgWFNfVFJBTlNBQ1RJT05fRU5EOgorCWNhc2UgWFNfRElSRUNUT1JZOgorCWNhc2UgWFNfUkVBRDoKKwljYXNlIFhTX0dFVF9QRVJNUzoKKwljYXNlIFhTX1JFTEVBU0U6CisJY2FzZSBYU19HRVRfRE9NQUlOX1BBVEg6CisJY2FzZSBYU19XUklURToKKwljYXNlIFhTX01LRElSOgorCWNhc2UgWFNfUk06CisJY2FzZSBYU19TRVRfUEVSTVM6CisJCS8qIFNlbmQgb3V0IGEgdHJhbnNhY3Rpb24gKi8KKwkJcmV0ID0geGVuYnVzX3dyaXRlX3RyYW5zYWN0aW9uKG1zZ190eXBlLCB1KTsKKwkJYnJlYWs7CisKKwljYXNlIFhTX1dBVENIOgorCWNhc2UgWFNfVU5XQVRDSDoKKwkJLyogKFVuKUFzayBmb3Igc29tZSBwYXRoIHRvIGJlIHdhdGNoZWQgZm9yIGNoYW5nZXMgKi8KKwkJcmV0ID0geGVuYnVzX3dyaXRlX3dhdGNoKG1zZ190eXBlLCB1KTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXQgPSAtRUlOVkFMOworCQlicmVhazsKKwl9CisJaWYgKHJldCAhPSAwKQorCQlyYyA9IHJldDsKKworCS8qIEJ1ZmZlcmVkIG1lc3NhZ2UgY29uc3VtZWQgKi8KKwl1LT5sZW4gPSAwOworCisgb3V0OgorCW11dGV4X3VubG9jaygmdS0+bXNnYnVmZmVyX211dGV4KTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgeGVuYnVzX2ZpbGVfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwlzdHJ1Y3QgeGVuYnVzX2ZpbGVfcHJpdiAqdTsKKworCWlmICh4ZW5fc3RvcmVfZXZ0Y2huID09IDApCisJCXJldHVybiAtRU5PRU5UOworCisJbm9uc2Vla2FibGVfb3Blbihpbm9kZSwgZmlscCk7CisKKwl1ID0ga3phbGxvYyhzaXplb2YoKnUpLCBHRlBfS0VSTkVMKTsKKwlpZiAodSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCUlOSVRfTElTVF9IRUFEKCZ1LT50cmFuc2FjdGlvbnMpOworCUlOSVRfTElTVF9IRUFEKCZ1LT53YXRjaGVzKTsKKwlJTklUX0xJU1RfSEVBRCgmdS0+cmVhZF9idWZmZXJzKTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZ1LT5yZWFkX3dhaXRxKTsKKworCW11dGV4X2luaXQoJnUtPnJlcGx5X211dGV4KTsKKwltdXRleF9pbml0KCZ1LT5tc2didWZmZXJfbXV0ZXgpOworCisJZmlscC0+cHJpdmF0ZV9kYXRhID0gdTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHhlbmJ1c19maWxlX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApCit7CisJc3RydWN0IHhlbmJ1c19maWxlX3ByaXYgKnUgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHhlbmJ1c190cmFuc2FjdGlvbl9ob2xkZXIgKnRyYW5zLCAqdG1wOworCXN0cnVjdCB3YXRjaF9hZGFwdGVyICp3YXRjaCwgKnRtcF93YXRjaDsKKworCS8qCisJICogTm8gbmVlZCBmb3IgbG9ja2luZyBoZXJlIGJlY2F1c2UgdGhlcmUgYXJlIG5vIG90aGVyIHVzZXJzLAorCSAqIGJ5IGRlZmluaXRpb24uCisJICovCisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUodHJhbnMsIHRtcCwgJnUtPnRyYW5zYWN0aW9ucywgbGlzdCkgeworCQl4ZW5idXNfdHJhbnNhY3Rpb25fZW5kKHRyYW5zLT5oYW5kbGUsIDEpOworCQlsaXN0X2RlbCgmdHJhbnMtPmxpc3QpOworCQlrZnJlZSh0cmFucyk7CisJfQorCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHdhdGNoLCB0bXBfd2F0Y2gsICZ1LT53YXRjaGVzLCBsaXN0KSB7CisJCXVucmVnaXN0ZXJfeGVuYnVzX3dhdGNoKCZ3YXRjaC0+d2F0Y2gpOworCQlsaXN0X2RlbCgmd2F0Y2gtPmxpc3QpOworCQlmcmVlX3dhdGNoX2FkYXB0ZXIod2F0Y2gpOworCX0KKworCWtmcmVlKHUpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgeGVuYnVzX2ZpbGVfcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwgcG9sbF90YWJsZSAqd2FpdCkKK3sKKwlzdHJ1Y3QgeGVuYnVzX2ZpbGVfcHJpdiAqdSA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKworCXBvbGxfd2FpdChmaWxlLCAmdS0+cmVhZF93YWl0cSwgd2FpdCk7CisJaWYgKCFsaXN0X2VtcHR5KCZ1LT5yZWFkX2J1ZmZlcnMpKQorCQlyZXR1cm4gUE9MTElOIHwgUE9MTFJETk9STTsKKwlyZXR1cm4gMDsKK30KKworY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB4ZW5idXNfZmlsZV9vcHMgPSB7CisJLnJlYWQgPSB4ZW5idXNfZmlsZV9yZWFkLAorCS53cml0ZSA9IHhlbmJ1c19maWxlX3dyaXRlLAorCS5vcGVuID0geGVuYnVzX2ZpbGVfb3BlbiwKKwkucmVsZWFzZSA9IHhlbmJ1c19maWxlX3JlbGVhc2UsCisJLnBvbGwgPSB4ZW5idXNfZmlsZV9wb2xsLAorfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMveGVuL3hlbmZzL3hlbmZzLmggYi9kcml2ZXJzL3hlbi94ZW5mcy94ZW5mcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxZjA4YjIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3hlbi94ZW5mcy94ZW5mcy5oCkBAIC0wLDAgKzEsNiBAQAorI2lmbmRlZiBfWEVORlNfWEVOQlVTX0gKKyNkZWZpbmUgX1hFTkZTX1hFTkJVU19ICisKK2V4dGVybiBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHhlbmJ1c19maWxlX29wczsKKworI2VuZGlmCS8qIF9YRU5GU19YRU5CVVNfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy96b3Jyby8uZ2l0aWdub3JlIGIvZHJpdmVycy96b3Jyby8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0Zjk4MGIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3pvcnJvLy5naXRpZ25vcmUKQEAgLTAsMCArMSwyIEBACitkZXZsaXN0LmgKK2dlbi1kZXZsaXN0CmRpZmYgLS1naXQgYS9kcml2ZXJzL3pvcnJvL3pvcnJvLXN5c2ZzLmMgYi9kcml2ZXJzL3pvcnJvL3pvcnJvLXN5c2ZzLmMKaW5kZXggNTI5MDU1Mi4uMWQyYTc3MmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvem9ycm8vem9ycm8tc3lzZnMuYworKysgYi9kcml2ZXJzL3pvcnJvL3pvcnJvLXN5c2ZzLmMKQEAgLTc3LDE3ICs3NywyMSBAQAogCS5yZWFkID0gem9ycm9fcmVhZF9jb25maWcsCiB9OwogCi12b2lkIHpvcnJvX2NyZWF0ZV9zeXNmc19kZXZfZmlsZXMoc3RydWN0IHpvcnJvX2RldiAqeikKK2ludCB6b3Jyb19jcmVhdGVfc3lzZnNfZGV2X2ZpbGVzKHN0cnVjdCB6b3Jyb19kZXYgKnopCiB7CiAJc3RydWN0IGRldmljZSAqZGV2ID0gJnotPmRldjsKKwlpbnQgZXJyb3I7CiAKIAkvKiBjdXJyZW50IGNvbmZpZ3VyYXRpb24ncyBhdHRyaWJ1dGVzICovCi0JZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJmRldl9hdHRyX2lkKTsKLQlkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfdHlwZSk7Ci0JZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJmRldl9hdHRyX3NlcmlhbCk7Ci0JZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJmRldl9hdHRyX3Nsb3RhZGRyKTsKLQlkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfc2xvdHNpemUpOwotCWRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl9yZXNvdXJjZSk7Ci0Jc3lzZnNfY3JlYXRlX2Jpbl9maWxlKCZkZXYtPmtvYmosICZ6b3Jyb19jb25maWdfYXR0cik7CisJaWYgKChlcnJvciA9IGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl9pZCkpIHx8CisJICAgIChlcnJvciA9IGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl90eXBlKSkgfHwKKwkgICAgKGVycm9yID0gZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJmRldl9hdHRyX3NlcmlhbCkpIHx8CisJICAgIChlcnJvciA9IGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl9zbG90YWRkcikpIHx8CisJICAgIChlcnJvciA9IGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl9zbG90c2l6ZSkpIHx8CisJICAgIChlcnJvciA9IGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl9yZXNvdXJjZSkpIHx8CisJICAgIChlcnJvciA9IHN5c2ZzX2NyZWF0ZV9iaW5fZmlsZSgmZGV2LT5rb2JqLCAmem9ycm9fY29uZmlnX2F0dHIpKSkKKwkJcmV0dXJuIGVycm9yOworCisJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvem9ycm8vem9ycm8uYyBiL2RyaXZlcnMvem9ycm8vem9ycm8uYwppbmRleCBkZmYxNmQ5Li5hMTU4NWQ2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3pvcnJvL3pvcnJvLmMKKysrIGIvZHJpdmVycy96b3Jyby96b3Jyby5jCkBAIC0xMzAsNiArMTMwLDcgQEAKIHsKICAgICBzdHJ1Y3Qgem9ycm9fZGV2ICp6OwogICAgIHVuc2lnbmVkIGludCBpOworICAgIGludCBlcnJvcjsKIAogICAgIGlmICghTUFDSF9JU19BTUlHQSB8fCAhQU1JR0FIV19QUkVTRU5UKFpPUlJPKSkKIAlyZXR1cm4gMDsKQEAgLTE0MCw3ICsxNDEsMTEgQEAKICAgICAvKiBJbml0aWFsaXplIHRoZSBab3JybyBidXMgKi8KICAgICBJTklUX0xJU1RfSEVBRCgmem9ycm9fYnVzLmRldmljZXMpOwogICAgIHN0cmNweSh6b3Jyb19idXMuZGV2LmJ1c19pZCwgInpvcnJvIik7Ci0gICAgZGV2aWNlX3JlZ2lzdGVyKCZ6b3Jyb19idXMuZGV2KTsKKyAgICBlcnJvciA9IGRldmljZV9yZWdpc3Rlcigmem9ycm9fYnVzLmRldik7CisgICAgaWYgKGVycm9yKSB7CisJcHJfZXJyKCJab3JybzogRXJyb3IgcmVnaXN0ZXJpbmcgem9ycm9fYnVzXG4iKTsKKwlyZXR1cm4gZXJyb3I7CisgICAgfQogCiAgICAgLyogUmVxdWVzdCB0aGUgcmVzb3VyY2VzICovCiAgICAgem9ycm9fYnVzLm51bV9yZXNvdXJjZXMgPSBBTUlHQUhXX1BSRVNFTlQoWk9SUk8zKSA/IDQgOiAyOwpAQCAtMTYwLDE1ICsxNjUsMTkgQEAKIAl6b3Jyb19uYW1lX2RldmljZSh6KTsKIAl6LT5yZXNvdXJjZS5uYW1lID0gei0+bmFtZTsKIAlpZiAocmVxdWVzdF9yZXNvdXJjZSh6b3Jyb19maW5kX3BhcmVudF9yZXNvdXJjZSh6KSwgJnotPnJlc291cmNlKSkKLQkgICAgcHJpbnRrKEtFUk5fRVJSICJab3JybzogQWRkcmVzcyBzcGFjZSBjb2xsaXNpb24gb24gZGV2aWNlICVzICIKLQkJICAgIlslbHg6JWx4XVxuIiwKLQkJICAgei0+bmFtZSwgKHVuc2lnbmVkIGxvbmcpem9ycm9fcmVzb3VyY2Vfc3RhcnQoeiksCi0JCSAgICh1bnNpZ25lZCBsb25nKXpvcnJvX3Jlc291cmNlX2VuZCh6KSk7CisJICAgIHByX2VycigiWm9ycm86IEFkZHJlc3Mgc3BhY2UgY29sbGlzaW9uIG9uIGRldmljZSAlcyAlcFJcbiIsCisJCSAgIHotPm5hbWUsICZ6LT5yZXNvdXJjZSk7CiAJc3ByaW50Zih6LT5kZXYuYnVzX2lkLCAiJTAyeCIsIGkpOwogCXotPmRldi5wYXJlbnQgPSAmem9ycm9fYnVzLmRldjsKIAl6LT5kZXYuYnVzID0gJnpvcnJvX2J1c190eXBlOwotCWRldmljZV9yZWdpc3Rlcigmei0+ZGV2KTsKLQl6b3Jyb19jcmVhdGVfc3lzZnNfZGV2X2ZpbGVzKHopOworCWVycm9yID0gZGV2aWNlX3JlZ2lzdGVyKCZ6LT5kZXYpOworCWlmIChlcnJvcikgeworCSAgICBwcl9lcnIoIlpvcnJvOiBFcnJvciByZWdpc3RlcmluZyBkZXZpY2UgJXNcbiIsIHotPm5hbWUpOworCSAgICBjb250aW51ZTsKKwl9CisJZXJyb3IgPSB6b3Jyb19jcmVhdGVfc3lzZnNfZGV2X2ZpbGVzKHopOworCWlmIChlcnJvcikKKwkgICAgZGV2X2Vycigmei0+ZGV2LCAiRXJyb3IgY3JlYXRpbmcgc3lzZnMgZmlsZXNcbiIpOwogICAgIH0KIAogICAgIC8qIE1hcmsgYWxsIGF2YWlsYWJsZSBab3JybyBJSSBtZW1vcnkgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvem9ycm8vem9ycm8uaCBiL2RyaXZlcnMvem9ycm8vem9ycm8uaAppbmRleCA1YzkxYWRhLi5iNjgyZDVjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3pvcnJvL3pvcnJvLmgKKysrIGIvZHJpdmVycy96b3Jyby96b3Jyby5oCkBAIC0xLDQgKzEsNCBAQAogCiBleHRlcm4gdm9pZCB6b3Jyb19uYW1lX2RldmljZShzdHJ1Y3Qgem9ycm9fZGV2ICp6KTsKLWV4dGVybiB2b2lkIHpvcnJvX2NyZWF0ZV9zeXNmc19kZXZfZmlsZXMoc3RydWN0IHpvcnJvX2RldiAqeik7CitleHRlcm4gaW50IHpvcnJvX2NyZWF0ZV9zeXNmc19kZXZfZmlsZXMoc3RydWN0IHpvcnJvX2RldiAqeik7CiAKZGlmZiAtLWdpdCBhL2Zpcm13YXJlLy5naXRpZ25vcmUgYi9maXJtd2FyZS8uZ2l0aWdub3JlCmluZGV4IGQ5YzY5MDEuLmY4OWEyMWYgMTAwNjQ0Ci0tLSBhL2Zpcm13YXJlLy5naXRpZ25vcmUKKysrIGIvZmlybXdhcmUvLmdpdGlnbm9yZQpAQCAtMyw0ICszLDMgQEAKICouYmluCiAqLmNzcAogKi5kc3AKLWloZXgyZncKZGlmZiAtLWdpdCBhL2Zpcm13YXJlL01ha2VmaWxlIGIvZmlybXdhcmUvTWFrZWZpbGUKaW5kZXggZDg3MmI3OS4uNDY2MTA2ZiAxMDA2NDQKLS0tIGEvZmlybXdhcmUvTWFrZWZpbGUKKysrIGIvZmlybXdhcmUvTWFrZWZpbGUKQEAgLTM3LDYgKzM3LDggQEAKIAkJCQkgICBjeGdiMy90M2NfcHNyYW0tMS4xLjAuYmluIFwKIAkJCQkgICBjeGdiMy90M2Z3LTcuMC4wLmJpbgogZnctc2hpcHBlZC0kKENPTkZJR19EVkJfVFRVU0JfQlVER0VUKSArPSB0dHVzYi1idWRnZXQvZHNwYm9vdGNvZGUuYmluCitmdy1zaGlwcGVkLSQoQ09ORklHX0UxMDApICs9IGUxMDAvZDEwMW1fdWNvZGUuYmluIGUxMDAvZDEwMXNfdWNvZGUuYmluIFwKKwkJCSAgICAgZTEwMC9kMTAyZV91Y29kZS5iaW4KIGZ3LXNoaXBwZWQtJChDT05GSUdfU01DVFIpICs9IHRyX3NtY3RyLmJpbgogZnctc2hpcHBlZC0kKENPTkZJR19TTkRfS09SRzEyMTIpICs9IGtvcmcvazEyMTIuZHNwCiBmdy1zaGlwcGVkLSQoQ09ORklHX1NORF9NQUVTVFJPMykgKz0gZXNzL21hZXN0cm8zX2Fzc3Bfa2VybmVsLmZ3IFwKQEAgLTc2LDcgKzc4LDggQEAKIAlrZXlzcGFuL3VzYTI4LmZ3IGtleXNwYW4vdXNhMjh4YS5mdyBrZXlzcGFuL3VzYTI4eGIuZncJCVwKIAlrZXlzcGFuL3VzYTI4eC5mdyBrZXlzcGFuL3VzYTQ5dy5mdyBrZXlzcGFuL3VzYTQ5d2xjLmZ3CiBlbmRpZgotZnctc2hpcHBlZC0kKENPTkZJR19VU0JfU0VSSUFMX1RJKSArPSB0aV8zNDEwLmZ3IHRpXzUwNTIuZncKK2Z3LXNoaXBwZWQtJChDT05GSUdfVVNCX1NFUklBTF9USSkgKz0gdGlfMzQxMC5mdyB0aV81MDUyLmZ3IFwKKwkJCQkgICAgICBtdHNfY2RtYS5mdyBtdHNfZ3NtLmZ3IG10c19lZGdlLmZ3CiBmdy1zaGlwcGVkLSQoQ09ORklHX1VTQl9TRVJJQUxfRURHRVBPUlQpICs9IGVkZ2Vwb3J0L2Jvb3QuZncgZWRnZXBvcnQvYm9vdDIuZncgXAogCQkJCQkgICAgZWRnZXBvcnQvZG93bi5mdyBlZGdlcG9ydC9kb3duMi5mdwogZnctc2hpcHBlZC0kKENPTkZJR19VU0JfU0VSSUFMX0VER0VQT1JUX1RJKSArPSBlZGdlcG9ydC9kb3duMy5iaW4KQEAgLTk5LDEwICsxMDIsMTAgQEAKICAgICAgIGNtZF9paGV4ICA9ICQoT0JKQ09QWSkgLUlpaGV4IC1PYmluYXJ5ICQ8ICRACiAKIHF1aWV0X2NtZF9paGV4MmZ3ICA9IElIRVgyRlcgJEAKLSAgICAgIGNtZF9paGV4MmZ3ICA9ICQob2JqdHJlZSkvJChvYmopL2loZXgyZncgJDwgJEAKKyAgICAgIGNtZF9paGV4MmZ3ICA9ICQob2JqdHJlZSkvc2NyaXB0cy9paGV4MmZ3ICQ8ICRACiAKIHF1aWV0X2NtZF9oMTZ0b2Z3ICA9IEgxNlRPRlcgJEAKLSAgICAgIGNtZF9oMTZ0b2Z3ICA9ICQob2JqdHJlZSkvJChvYmopL2loZXgyZncgLXcgJDwgJEAKKyAgICAgIGNtZF9oMTZ0b2Z3ICA9ICQob2JqdHJlZSkvc2NyaXB0cy9paGV4MmZ3IC13ICQ8ICRACiAKIHF1aWV0X2NtZF9md2JpbiA9IE1LX0ZXICAgJEAKICAgICAgIGNtZF9md2JpbiA9IEZXTkFNRT0iJChwYXRzdWJzdCBmaXJtd2FyZS8lLmdlbi5TLCUsJEApIjsJCSAgICAgXApAQCAtMTY1LDExICsxNjgsMTEgQEAKICMgaXMgYWN0dWFsbHkgbWVhbmluZ2Z1bCwgYmVjYXVzZSB0aGUgZmlybXdhcmUgaGFzIHRvIGJlIGxvYWRlZCBpbiBhIGNlcnRhaW4KICMgb3JkZXIgcmF0aGVyIHRoYW4gYXMgYSBzaW5nbGUgYmluYXJ5IGJsb2IuIFRodXMsIHdlIGNvbnZlcnQgdGhlbSBpbnRvIG91cgogIyBtb3JlIGNvbXBhY3QgYmluYXJ5IHJlcHJlc2VudGF0aW9uIG9mIGloZXggcmVjb3JkcyAoPGxpbnV4L2loZXguaD4pCi0kKG9iaikvJS5mdzogJChvYmopLyUuSEVYICQob2JqKS9paGV4MmZ3IHwgJChvYmp0cmVlKS8kKG9iaikvJCQoZGlyICUpCiskKG9iaikvJS5mdzogJChvYmopLyUuSEVYICB8ICQob2JqdHJlZSkvJChvYmopLyQkKGRpciAlKQogCSQoY2FsbCBjbWQsaWhleDJmdykKIAogIyAuSDE2IGlzIG91ciBvd24gbW9kaWZpZWQgZm9ybSBvZiBJbnRlbCBIRVgsIHdpdGggMTYtYml0IGxlbmd0aCBmb3IgcmVjb3Jkcy4KLSQob2JqKS8lLmZ3OiAkKG9iaikvJS5IMTYgJChvYmopL2loZXgyZncgfCAkKG9ianRyZWUpLyQob2JqKS8kJChkaXIgJSkKKyQob2JqKS8lLmZ3OiAkKG9iaikvJS5IMTYgfCAkKG9ianRyZWUpLyQob2JqKS8kJChkaXIgJSkKIAkkKGNhbGwgY21kLGgxNnRvZncpCiAKICQoZmlybXdhcmUtZGlycyk6CkBAIC0xODYsNSArMTg5LDMgQEAKICMgV2l0aG91dCB0aGlzLCBidWlsdC1pbi5vIHdvbid0IGJlIGNyZWF0ZWQgd2hlbiBpdCdzIGVtcHR5LCBhbmQgdGhlCiAjIGZpbmFsIHZtbGludXggbGluayB3aWxsIGZhaWwuCiBvYmotbiA6PSBkdW1teQotCi1ob3N0cHJvZ3MteSA6PSBpaGV4MmZ3CmRpZmYgLS1naXQgYS9maXJtd2FyZS9XSEVOQ0UgYi9maXJtd2FyZS9XSEVOQ0UKaW5kZXggMWJiMmNmNC4uNTI0MTEzZiAxMDA2NDQKLS0tIGEvZmlybXdhcmUvV0hFTkNFCisrKyBiL2Zpcm13YXJlL1dIRU5DRQpAQCAtMTkxLDcgKzE5MSw3IEBACiAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLURyaXZlcjogdHVfdXNiXzM0MTBfNTA1MiAtLSBVU0IgVEkgMzQxMC81MDUyIHNlcmlhbCBkZXZpY2UKK0RyaXZlcjogdGlfdXNiXzM0MTBfNTA1MiAtLSBVU0IgVEkgMzQxMC81MDUyIHNlcmlhbCBkZXZpY2UKIAogRmlsZTogdGlfMzQxMC5mdwogSW5mbzogZmlybXdhcmUgOS8xMC8wNCBGVzM0MTBfU3BlY2lhbF9TdGFydFdkb2dPblN0YXJ0UG9ydApAQCAtMjA2LDYgKzIwNiwyMCBAQAogCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCitEcml2ZXI6IHRpX3VzYl8zNDEwXzUwNTIgLS0gTXVsdGktVGVjaCBVU0IgY2VsbCBtb2RlbXMKKworRmlsZTogbXRzX2NkbWEuZncKK0ZpbGU6IG10c19nc20uZncKK0ZpbGU6IG10c19lZGdlLmZ3CisKK0xpY2VuY2U6ICJhbGwgZmlybXdhcmUgY29tcG9uZW50cyBhcmUgcmVkaXN0cmlidXRhYmxlIGluIGJpbmFyeSBmb3JtIgorICAgICAgICAgcGVyIHN1cHBvcnRAbXVsdGl0ZWNoLmNvbQorCSBDb3B5cmlnaHQgKEMpIDIwMDUgTXVsdGktVGVjaCBTeXN0ZW1zLCBJbmMuCisKK0ZvdW5kIGluIGhleCBmb3JtIGluIGZ0cDovL2Z0cC5tdWx0aXRlY2guY29tL3dpcmVsZXNzL3dpcmVsZXNzX2xpbnV4LnppcAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCiBEcml2ZXI6IHdoaXRlaGVhdCAtLSBVU0IgQ29ubmVjdFRlY2ggV2hpdGVIRUFUIHNlcmlhbCBkZXZpY2UKIAogRmlsZTogd2hpdGVoZWF0LmZ3CkBAIC0zNjAsNiArMzc0LDE4IEBACiAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKK0RyaXZlcjogZTEwMCAtLSBJbnRlbCBQUk8vMTAwIEV0aGVybmV0IE5JQworCitGaWxlOiBlMTAwL2QxMDFtX3Vjb2RlLmJpbgorRmlsZTogZTEwMC9kMTAxc191Y29kZS5iaW4KK0ZpbGU6IGUxMDAvZDEwMmVfdWNvZGUuYmluCisKK0xpY2VuY2U6IFVua25vd24KKworRm91bmQgaW4gaGV4IGZvcm0gaW4ga2VybmVsIHNvdXJjZS4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwogRHJpdmVyOiBhY2VuaWMgLS0gQWx0ZW9uIEFjZU5JQyBHaWdhYml0IEV0aGVybmV0IGNhcmQKIAogRmlsZTogYWNlbmljL3RnMS5iaW4KZGlmZiAtLWdpdCBhL2Zpcm13YXJlL2UxMDAvZDEwMW1fdWNvZGUuYmluLmloZXggYi9maXJtd2FyZS9lMTAwL2QxMDFtX3Vjb2RlLmJpbi5paGV4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyOTcxZWQKLS0tIC9kZXYvbnVsbAorKysgYi9maXJtd2FyZS9lMTAwL2QxMDFtX3Vjb2RlLmJpbi5paGV4CkBAIC0wLDAgKzEsMzggQEAKKzoxMDAwMDAwMDE1MDI1NTAwMzcwNEZGRkZGRkZGRkZGRjg5MDdBNzA2MTIKKzoxMDAwMTAwMEZGRkZGRkZGRkZGRjU4MDUwMTAwMEMwMDEyMTMxMDAwNDcKKzoxMDAwMjAwMDA4MDAwQzAwMTYwMjM4MDA5QzAwMTAwMDU2NDAyMDAwMEEKKzoxMDAwMzAwMENDODAyMzAwNTYwMDM4MDA5QzAwMTAwMDBCNEMyNDAwOUMKKzoxMDAwNDAwMDAwMDgwMDAwMTg0ODEyMDAzODA0MzgwMDAwMDAwMDAwQzIKKzoxMDAwNTAwMDAwMDAxNDAwNTUwNTM4MDAwMDgwMzAwMDYyMDYxMDAwRDIKKzoxMDAwNjAwMDYxMDUxMDAwMDgwNDBFMDA2MTQ4MTMwMDAyMDAwQzAwMzYKKzoxMDAwNzAwMDkzMzAxMDAwMDA4MDMwMDAyNDA2MTAwMDYxMDUxMDAwNEQKKzoxMDAwODAwMDA4MDQwRTAwNjEwODEwMDA3RTAwMEMwMDIxMkMyMjAwRTQKKzoxMDAwOTAwMDAyMDAwQzAwOTMzMDEwMDA3QTBDMzgwMDAwMDAwODAwQjkKKzoxMDAwQTAwMDkwMzAxMDAwN0EwQzM4MDAwMDAwMDAwMDAwMDAwMDAwQzIKKzoxMDAwQjAwMDAwMDAwMDAwMDAwMDAwMDA5QzAwMTAwMDJENEMyNDAwRjcKKzoxMDAwQzAwMDA0MDAwMTAwMDAxMDA0MDAzNzA0M0EwMDEwNDAwNDAwNEUKKzoxMDAwRDAwMDhBMDczODAwMDAwMDAwMDA5OTAwMTAwMDdBNkMyMDAwQTgKKzoxMDAwRTAwMDlDMDAxMDAwNDg0QzI0MDAyNDA4MTMwMDAxMDAwQzAwNjAKKzoxMDAwRjAwMDEzMTIxMDAwNzUwQzI2MDAwMDEwMDQwMDA0MDAwMTAwMEIKKzoxMDAxMDAwMDI2MDgxMzAwMDYwMDBDMDBBODA2MjIwMDI2QzkxMzAwQ0EKKzoxMDAxMTAwMDEzMTMxMDAwQTgwNjM4MDAwMDAwMDAwMDAwMDAwMDAwQzMKKzoxMDAxMjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwQ0YKKzoxMDAxMzAwMDAwMDAwMDAwMDAwMDAwMDAwMDA2MDgwMDEwMUIxMDAwNzYKKzoxMDAxNDAwMDA0MDAwNTAwMjYwODEwMDAxMDEyMTAwMDM0MEMzODAwQkUKKzoxMDAxNTAwMDAwMDAwMDAwMDAwMDAwMDA1QjE1MjEwMDk5MDAxMDAwNjUKKzoxMDAxNjAwMDU5NjUyMDAwOUMwMDEwMDA1OTQ1MjQwMDM2MDgxMzAwRjIKKzoxMDAxNzAwMDAwMDAwQzAwNjIwQzIyMDAwMTAwMEMwMDEzMUIxMDAwOTgKKzoxMDAxODAwMDBFOUMyMjAwMEUwQzIxMDAwRTZDMjIwMDBFNkMyMTAwMzEKKzoxMDAxOTAwMDBFRkMyMjAwMEU1QzIxMDAwRTRDMjEwMDU1MDUzODAwOUIKKzoxMDAxQTAwMDA0MDAwMTAwMDAxMDA0MDA2NzhDMjcwMDAwMDgwNDAwMTAKKzoxMDAxQjAwMDAwODEwMTAwMzcwNDNBMDAyNjA4MTMwMDAxMDAwQzAwRkEKKzoxMDAxQzAwMDU5MDUyMjAwMTMxMzEwMDA1OTA1MzgwMDAwMDAwMDAwRTMKKzoxMDAxRDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMUYKKzoxMDAxRTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDMxMDgxMzAwQzMKKzoxMDAxRjAwMDBCMDkxMDAwMTM0ODEyMDA4MEZGMEMwMEFCMDYyNjAwMEMKKzoxMDAyMDAwMDAwMTAwNDAwMDQwMDAxMDBBODA2MzgwMDAwMDAwMDAwRUYKKzowQjAyMTAwMDAwMDAwMDAwMDAwMDAwMDA0RTQxN0VENgorOjAwMDAwMDAxRkYKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICBNaWNybyBjb2RlIGZvciA4MDg2OjEyMjkgUmV2IDggICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL2Zpcm13YXJlL2UxMDAvZDEwMXNfdWNvZGUuYmluLmloZXggYi9maXJtd2FyZS9lMTAwL2QxMDFzX3Vjb2RlLmJpbi5paGV4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwMmM3ZmUKLS0tIC9kZXYvbnVsbAorKysgYi9maXJtd2FyZS9lMTAwL2QxMDFzX3Vjb2RlLmJpbi5paGV4CkBAIC0wLDAgKzEsMzggQEAKKzoxMDAwMDAwMDQyMDI1NTAwN0UwNEZGRkZGRkZGRkZGRjE4MDhGRjA2QjYKKzoxMDAwMTAwMEZGRkZGRkZGRkZGRkE2MDUwMTAwMEMwMDEyMTMxMDAwRjkKKzoxMDAwMjAwMDA4MDAwQzAwNDMwMjM4MDA5QzAwMTAwMDU2NDAyMDAwREQKKzoxMDAwMzAwMEQwODAyMzAwNTYwMDM4MDA5QzAwMTAwMDhCNEYyNDAwMTUKKzoxMDAwNDAwMDAwMDgwMDAwMTg0ODEyMDA3RjA0MzgwMDAwMDAwMDAwN0IKKzoxMDAwNTAwMDAwMDAxNDAwQTMwNTM4MDAwMDgwMzAwMDEwMDYxMDAwRDYKKzoxMDAwNjAwMDYxMDUxMDAwMDgwNDBFMDA2MTQ4MTMwMDAyMDAwQzAwMzYKKzoxMDAwNzAwMDkzMzAxMDAwMDA4MDMwMDAyNDA2MTAwMDYxMDUxMDAwNEQKKzoxMDAwODAwMDA4MDQwRTAwNjEwODEwMDA3RTAwMEMwMEExMkYyMjAwNjEKKzoxMDAwOTAwMDAyMDAwQzAwOTMzMDEwMDA5MDBGMzgwMDAwMDAwODAwQTAKKzoxMDAwQTAwMDkwMzAxMDAwOTAwRjM4MDAwMDAwMDAwMDAwMDAwMDAwQTkKKzoxMDAwQjAwMDAwMDAwMDAwMDAwMDAwMDA5QzAwMTAwMEFENEYyNDAwNzQKKzoxMDAwQzAwMDA0MDAwMTAwMDAxMDA0MDA3RTA0M0EwMDEwNDAwNDAwMDcKKzoxMDAwRDAwMDE5MDgzODAwMDAwMDAwMDA5OTAwMTAwMEZENkYyMDAwOTIKKzoxMDAwRTAwMDlBMDAxMDAwRkRBRjIwMDA5QzAwMTAwMEM4NEYyNDAwQjMKKzoxMDAwRjAwMDI0MDgxMzAwMDEwMDBDMDAxMzEyMTAwMEY3MEYyNjAwNTMKKzoxMDAxMDAwMDAwMTAwNDAwMDQwMDAxMDAyNjA4MTMwMDA2MDAwQzAwODMKKzoxMDAxMTAwMDAwMDcyMjAwMjZDOTEzMDAxMzEzMTAwMDAwMDczODAwM0YKKzoxMDAxMjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwQ0YKKzoxMDAxMzAwMDAwMDAwMDAwMDAwMDAwMDAwMDA2MDgwMDEwMUIxMDAwNzYKKzoxMDAxNDAwMDA0MDAwNTAwMjYwODEwMDAxMDEyMTAwMEI2MEYzODAwMzkKKzoxMDAxNTAwMDAwMDAwMDAwMDAwMDAwMDBBOTE1MjEwMDk5MDAxMDAwMTcKKzoxMDAxNjAwMEE3NjUyMDAwOUEwMDEwMDBBN0E1MjAwMDlDMDAxMDAwQTEKKzoxMDAxNzAwMEE3NDUyNDAwMzYwODEzMDAwMDAwMEMwMEU0MEYyMjAwRkQKKzoxMDAxODAwMDAxMDAwQzAwMTMxQjEwMDA4RTlGMjIwMDhFMEYyMTAwMTcKKzoxMDAxOTAwMDhFNkYyMjAwOEU2RjIxMDA4RUZGMjIwMDhFNUYyMTAwNjUKKzoxMDAxQTAwMDhFNEYyMTAwQTMwNTM4MDAwNDAwMDEwMDAwMTAwNDAwNTgKKzoxMDAxQjAwMEU5OEYyNzAwMDAwODA0MDAwMDgxMDEwMDdFMDQzQTAwNTYKKzoxMDAxQzAwMDI2MDgxMzAwMDEwMDBDMDBBNzA1MjIwMDEzMTMxMDAwREQKKzoxMDAxRDAwMEE3MDUzODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM0IKKzoxMDAxRTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEYKKzoxMDAxRjAwMDAwMDAwMDAwMzEwODEzMDAwQjA5MTAwMDEzNDgxMjAwMjIKKzoxMDAyMDAwMDgwRkYwQzAwMDMwNzI2MDAwMDEwMDQwMDA0MDAwMTAwMUEKKzowQjAyMTAwMDAwMDczODAwMDAwMDAwMDA0RTQzODA5MworOjAwMDAwMDAxRkYKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICBNaWNybyBjb2RlIGZvciA4MDg2OjEyMjkgUmV2IDkgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL2Zpcm13YXJlL2UxMDAvZDEwMmVfdWNvZGUuYmluLmloZXggYi9maXJtd2FyZS9lMTAwL2QxMDJlX3Vjb2RlLmJpbi5paGV4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllODA2ZGEKLS0tIC9kZXYvbnVsbAorKysgYi9maXJtd2FyZS9lMTAwL2QxMDJlX3Vjb2RlLmJpbi5paGV4CkBAIC0wLDAgKzEsMzggQEAKKzoxMDAwMDAwMDhGMDI3RDAwRjkwNDQyMEU4NTBDRUQxNEU5MTRGQTE0RjgKKzoxMDAwMTAwMDM2MEVGNzBFRkYxRkZGMUZCOTE0RTAwMDAwMDAwMDAwQUUKKzoxMDAwMjAwMDAwMDAwMDAwMDAwMDAwMDBCRDE0RTAwMDAwMDAwMDAwMUYKKzoxMDAwMzAwMDAwMDAwMDAwMDAwMDAwMDBENTE0RTAwMDAwMDAwMDAwRjcKKzoxMDAwNDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwQjAKKzoxMDAwNTAwMDAwMDAwMDAwMDAwMDAwMDBDMTE0RTAwMDAwMDAwMDAwRUIKKzoxMDAwNjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwOTAKKzoxMDAwNzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwODAKKzoxMDAwODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNzAKKzoxMDAwOTAwMDAwMDAwMDAwMDAwMDAwMDBDODE0RTAwMDAwMDAwMDAwQTQKKzoxMDAwQTAwMDAwMDAwMDAwMDAwMDAwMDAwMDA2MjAwMEVFMTRFMDAwNDgKKzoxMDAwQjAwMDAwMDAwMDAwMDAwMDAwMDA4MEZGMzAwMDQ2MEU5NDAwQTkKKzoxMDAwQzAwMDAwODIwMzAwMDAyMDEwMDA0MzBFRTAwMDAwMDAwMDAwNEEKKzoxMDAwRDAwMDAwMDAwMDAwMDAwMDAwMDAwNjAwMzAwMEZCMTRFMDAwRkIKKzoxMDAwRTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTAKKzoxMDAwRjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzoxMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRUYKKzoxMDAxMTAwMDAwMDAwMDAwMDAwMDAwMDA0MTZFOTAwMDNDMEU4MDAwRDYKKzoxMDAxMjAwMDM5MEVFMDAwMDAwMDAwMDBGRDZFOTAwMEZEMEU5MDAwMTIKKzoxMDAxMzAwMEY4MEVFMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRDkKKzoxMDAxNDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwQUYKKzoxMDAxNTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwOUYKKzoxMDAxNjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwOEYKKzoxMDAxNzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwN0YKKzoxMDAxODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNkYKKzoxMDAxOTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNUYKKzoxMDAxQTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNEYKKzoxMDAxQjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM0YKKzoxMDAxQzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMkYKKzoxMDAxRDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMUYKKzoxMDAxRTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEYKKzoxMDAxRjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRkYKKzoxMDAyMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRUUKKzowQjAyMTAwMDAwMDAwMDAwMDAwMDAwMDAyQTM2MkU1NQorOjAwMDAwMDAxRkYKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICBNaWNybyBjb2RlIGZvciB0aGUgODA4NjoxMjI5IFJldiBGLzEwICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL2Zpcm13YXJlL210c19jZG1hLmZ3LmloZXggYi9maXJtd2FyZS9tdHNfY2RtYS5mdy5paGV4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2YWQwY2IKLS0tIC9kZXYvbnVsbAorKysgYi9maXJtd2FyZS9tdHNfY2RtYS5mdy5paGV4CkBAIC0wLDAgKzEsODY3IEBACis6MTAwMDAwMDAxNDM2MDAwMjAwMUUwMjFBRjlGRkZGRkZGRkZGMDIzMzQxCis6MTAwMDEwMDAxREZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGMDIzMzlCCis6MTAwMDIwMDBDODc1ODFDRTkwRkRFODg1ODNBMDEyMzUzQ0VDNEQ2MDBCCis6MTAwMDMwMDA3Mzc4QUI4MDAzNzYwMDE4Qjg5Q0ZBNzg3RjgwMDM3NkRCCis6MTAwMDQwMDAwMDE4Qjg2NUZBNzgyMDgwMDM3NjAwMThCODIwRkE3ODhFCis6MTAwMDUwMDAyMDgwMDM3NjAwMThCODFGRkE5MEZERERBRTgzQUY4MkQyCis6MTAwMDYwMDA5MEZCRjgxMjAwQUE2MDA1RTRGMEEzODBGNjkwRkRFODhBCis6MTAwMDcwMDBBODgyOTBGREU4QTk4MkU4Njk2MDA1RTRGMjA4ODBGN0FCCis6MTAwMDgwMDA5MDAxMDgxMjAwQjM5MDAxMEMxMjAwQjM5MDAxMTAxMkZECis6MTAwMDkwMDAwMEIzOTAwMTE0MTIwMEQxOTAwMTFBMTIwMEQxOTAwMTA2Cis6MTAwMEEwMDAyMDEyMDBEMTc1RDAwMDEyMzQxQTAyMDEyNkVGNjU4MkE5Cis6MTAwMEIwMDA3MDAzRUU2NTgzMjJFNDkzRjg3NDAxOTNGOTc0MDI5MzVDCis6MTAwMEMwMDBGRTc0MDM5M0Y1ODI4RTgzRTg2OTcwMDEyMkU0OTNGNjRGCis6MTAwMEQwMDBBMzA4ODBGNEU0OTNGQzc0MDE5M0ZENzQwMjkzRkU3NDBFCis6MTAwMEUwMDAwMzkzRkY3NDA0OTNGODc0MDU5M0Y1ODI4ODgzMTIwMEQ4Cis6MTAwMEYwMDBBQTcwMDEyMkU0OTNBM0E4ODNBOTgyOEM4MzhEODJGMDQ1Cis6MTAwMTAwMDBBM0FDODNBRDgyODg4Mzg5ODI4MEUzMjEyMTA0OUI4MDE0Cis6MTAwMTEwMDA4MDA0OUJBQ0FFMDQ5QkZERTgwNDlEMDQ5REZCRjMwNEFFCis6MTAwMTIwMDBBMjA0OURGQkYzMDUwMjA1MDI4MEZFRDBGMDMwRjAwOTI5Cis6MTAwMTMwMDAyMEYzMDNGNjgwMTBGNzgwMEQzMEYxMDkyMEYzMDNGMjZECis6MTAwMTQwMDA4MDA0RjM4MDAxRjAyMEY0MDRGQ0QwRTBDQzIyQ0NDMDg5Cis6MTAwMTUwMDBFMDEyMDE2MzAyMDE1NEJDMDAwNUQwRjBBQ0YwMjJDM0YwCis6MTAwMTYwMDAxM0RDRkMwMjAxMkFCRjAwMDlFRDI1ODI3NUYwMDFGOEJECis6MTAwMTcwMDBFNjIyQkYwMTBGRUQyNTgyRjU4MkVFMzU4M0Y1ODM3NTBBCis6MTAwMTgwMDBGMDA0RTAyMkVEMjU4Mjc1RjAwMkY4RTIyMkQwODNEMDVGCis6MTAwMTkwMDA4MkY1RjBDM0U0OTNBM0M1RjA5NUYwQzBFMEMzRDBGMEJFCis6MTAwMUEwMDBFNDkzQTM5NUYwNDAxMkEzQTNDM0U1RjAzMzUwMDIwNUY2Cis6MTAwMUIwMDA4MzI1ODJGNTgyNTAwMjA1ODM3NDAxOTNDMEUwRTQ5M0E1Cis6MTAwMUMwMDBDMEUwMjJEMDgzRDA4MkY1RjBFNDkzNzAwOTc0MDE5M0VCCis6MTAwMUQwMDA3MDA0QTNBMzgwMEM3NDAyOTM2NUYwNjAwNUEzQTNBMzJECis6MTAwMUUwMDA4MEU3NzQwMTkzQzBFMEU0OTNDMEUwMjIxMjAyNjQwMjRECis6MTAwMUYwMDAwMUZCMTIwMkI4MDIwMUZCMTIwMkRDMDIwMUZCMzBFMDNCCis6MTAwMjAwMDAwNzIwRTMwMkU2MjJFNzIyMzBFMTA3MjBFMzAyRTIyMkIwCis6MTAwMjEwMDBFMzIyMzBFMjAyRTAyMkU0OTMyMjEyMDJEQzAyMDIyMzEzCis6MTAwMjIwMDAxMjAyQjgwMjAyMjNBQkYwMTIwMjJEQ0JDNUYwQ0IyMjkyCis6MTAwMjMwMDAzMEUwMTAyMEUzMDZFNkY1RjAwOEU2MjJFN0Y1RjAwOUU1Cis6MTAwMjQwMDBFNzE5MjIzMEUxMTAyMEUzMDZFMkY1RjAwOEUyMjJFM0FDCis6MTAwMjUwMDBGNUYwMDlFMzE5MjIzMEUyMDZFMEY1RjBBM0UwMjJFNDJDCis6MTAwMjYwMDA5M0Y1RjA3NDAxOTMyMkJCMDAwMzc0MDkyMkJCMDEwN0NDCis6MTAwMjcwMDA4OTgyOEE4Mzc0MDQyMkJCMDIwNzg5ODI4QTgzNzQxMDZDCis6MTAwMjgwMDAyMjc0MEEyMjAyMDI4NEJCMDAwN0U5MjU4MkY4NzQwMTY1Cis6MTAwMjkwMDAyMkJCMDEwREU5MjU4MkY1ODJFQTM1ODNGNTgzNzQwNERBCis6MTAwMkEwMDAyMkJCMDIwREU5MjU4MkY1ODJFQTM1ODNGNTgzNzQxMEJECis6MTAwMkIwMDAyMkU5MjU4MkY4NzQwMjIyMDIwMkI4QkYwMDA1RURGODk3Cis6MTAwMkMwMDA3NDAxMjJCRjAxMDc4RDgyOEU4Mzc0MDQyMkJGMDIwNzRFCis6MTAwMkQwMDA4RDgyOEU4Mzc0MTAyMkVERjg3NDAyMjIwMjAyRENCRjNDCis6MTAwMkUwMDAwMDA3RUQyNTgyRjg3NDAxMjJCRjAxMERFRDI1ODJGNThFCis6MTAwMkYwMDA4MkVFMzU4M0Y1ODM3NDA0MjJCRjAyMERFRDI1ODJGNTZECis6MTAwMzAwMDA4MkVFMzU4M0Y1ODM3NDEwMjJFRDI1ODJGODc0MDIyMjgzCis6MTAwMzEwMDAwMjAzMTBDMEUwMTIwMjY0MDIwMzI4QzBFMDEyMDJCODE3Cis6MTAwMzIwMDAwMjAzMjhDMEUwMTIwMkRDMDIwMzI4MzBFMDBCMjBFM0M1Cis6MTAwMzMwMDAwNEQwRTBGNjIyRDBFMEY3MjIzMEUxMEIyMEUzMDREMDM1Cis6MTAwMzQwMDBFMEYyMjJEMEUwRjMyMkQwRTBGMDIyQzlDREM5Q0FDRTNCCis6MTAwMzUwMDBDQUNCQ0ZDQjEyMDM1QkVERjlFRUZBRUZGQjIyQkIwMDY5Cis6MTAwMzYwMDAyRkJGMDAwQUZBRURGOEU3RjYwODA5REFGQTIyQkYwMTEyCis6MTAwMzcwMDAxMjhEODI4RTgzRjgwMjAzNzgwOUEzRTdGMEQ4RkEyMjVGCis6MTAwMzgwMDAwMjAzODNGQUVERjhFN0YyMDgwOURBRkEyMjAyMDM4RDk0Cis6MTAwMzkwMDBCQjAxNERCRjAwMTQ4OTgyOEE4M0Y5RURGODAyMDM5RkU3Cis6MTAwM0EwMDAwOEEzRTBGNkQ5RkEyMjAyMDNCMEJGMDEyMjhEODI4RUEzCis6MTAwM0IwMDA4M0ZCMDhDOUM1ODJDOUNBQzU4M0NBRTBBM0M5QzU4MjZGCis6MTAwM0MwMDBDOUNBQzU4M0NBRjBBM0RCRUFEOEU4MjIwMjAzRDM4REU5Cis6MTAwM0QwMDA4MjhFODNGOUVERjhFMEYyMDhBM0Q5RkEyMjAyMDNERDU4Cis6MTAwM0UwMDBCQjAyNERCRjAwMTI4OTgyOEE4M0Y5RURGODAyMDNFRjQ4Cis6MTAwM0YwMDAwOEEzRTQ5M0Y2RDlGOTIyQkYwMTIzOEQ4MjhFODNGQkYzCis6MTAwNDAwMDAwOEM5QzU4MkM5Q0FDNTgzQ0FFNDkzQTNDOUM1ODJDOTNDCis6MTAwNDEwMDBDQUM1ODNDQUYwQTNEQkU5RDhFNzIyMDIwNDIyODk4Mjk1Cis6MTAwNDIwMDA4QTgzRjlFREY4RTQ5M0YyMDhBM0Q5RjkyMjAyMDQzM0EwCis6MTAwNDMwMDBCRjAwMERGQUVERjhFM0Y2MDgwOURBRkEyMjAyMDQzREVFCis6MTAwNDQwMDBCRjAxMTI4RDgyOEU4M0Y4MDIwNDRBMDlBM0UzRjBEODFCCis6MTAwNDUwMDBGQTIyMDIwNDU1RkFFREY4RTNGMjA4MDlEQUZBMjIwMjY4Cis6MTAwNDYwMDAwNDVGRTZGQjA4RTZGQTA4RTZGOTA0RjYxODcwMDEwNkYwCis6MTAwNDcwMDAyMkU2RkYwOEU2RkUwOEU2RkQyMkVGRjBBM0VFRjBBMzc5Cis6MTAwNDgwMDBFREYwMjJFQkYwQTNFQUYwQTNFOUYwMjJFMEZGQTNFMDE1Cis6MTAwNDkwMDBGRUEzRTBGRDIyRTBGQkEzRTBGQUEzRTBGOTIyMDAwMEM2Cis6MTAwNEEwMDAwMDAwMDAwMDAwMDUwMjAwNjEwNTcxMDAyNjA1OTgwMEFCCis6MTAwNEIwMDAzMzBBMDkwMDYxMEE3NTAwNjYxNTQ0MDA2MTBDRjkwMEYxCis6MTAwNEMwMDA2MTA5QTkwMDYxMDlFMDAwNjEwREMwMDA2MTBCRjEwMDQ0Cis6MTAwNEQwMDA2MTBBMUMwMDYxMEE1MTAwNjExNzNDMDAzMzE3NEYwMDhDCis6MTAwNEUwMDAzNDFFMTQwMDQzMUVCRjAwNDQyMDJDMDA0NDIwMUEwMDc4Cis6MTAwNEYwMDA0NzFFRTYwMDQ3MUY4QjAwNEQxRkRDMDA0RjFGMDgwMDAyCis6MTAwNTAwMDA1ODMyQTgwMDYxN0NDQzdERkYxMjFDQzUyMjkwRkZGQ0Y0Cis6MTAwNTEwMDBFMDIwRTcyREMyQUZBRTU5QUY1ODc1NUEyMEU1NUExNDA2Cis6MTAwNTIwMDBDNTVBNjAxOUU0RkU3RjA1RUU0RkNFMjRGRkNFQ0YzNENFCis6MTAwNTMwMDBGRkNGNjAwN0U0OTBGRjkyRjA4MEVEODBFMDhFNTk4RjRFCis6MTAwNTQwMDA1ODIyMTIwNTBBN0QwNzdDQjcxMjMyQzQ3RDBGN0M2RURCCis6MTAwNTUwMDAxMjMyREU3ODlEN0EwNkU0RjYwOERBRkM3QTA2MTIwNTk1Cis6MTAwNTYwMDBDRDdDMDMxMjBFNTUxMjIxNjhFNEZFRkY3QzBGMTIzMjdGCis6MTAwNTcwMDA0REQyQTgyMjEyMzEzOEU0OTBGQzM4RjA5MEZGRjBFMDIwCis6MTAwNTgwMDAzMEU0MDg3NDAxOTBGQzM5RjA4MDA1RTQ5MEZDMzlGMDA3Cis6MTAwNTkwMDA3RDBBN0MwMDEyMjU0NjEyMzFCQjIyMTIzMTM4OTBGQ0I0Cis6MTAwNUEwMDAzOUUwMTQ3MDBFOTBGRkYwRTA0NDEwRjA3QzAwMTIyNTRBCis6MTAwNUIwMDBERjgwMTk5MEZDMzlFMDcwMEU5MEZGRjBFMDU0RUZGMDBFCis6MTAwNUMwMDA3QzAwMTIyNURGODAwNTdDMTcxMjI1REYxMjMxQkIyMjRCCis6MTAwNUQwMDA5MEZGRjBFMDU0QUJGMDkwRkZGMEUwNDQyMEYwMjI4QzZDCis6MTAwNUUwMDAzNzhEMzY3ODgyRURGNjA4RUNGNkVERkVFQ0ZEN0YwMUY2Cis6MTAwNUYwMDA5MDAwMDUxMjAxRjU3ODgwRjY3ODgyRTZGRDA4RTZGQ0E5Cis6MTAwNjAwMDBFREZFRUNGRDdGMDE5MDAwMDQxMjAxRjU1NDBGRkM3RDFFCis6MTAwNjEwMDA4MDEyMTc2RDc4ODBFNjcwMERBRDNBQUUzOUFGMzhFNEQwCis6MTAwNjIwMDAxMjAzMTg3QzA4MjI5MEZGRjBFMDU0RkVGMDkwRkZGMEQ3Cis6MTAwNjMwMDBFMDU0RkRGMDgwMUU3ODgyRTZGRDA4RTZGQ0VERkVFQzVECis6MTAwNjQwMDBGRDdGMDE5MDAwMDgxMjAyMTcyNUUwNDQwMTkwRkZGMzlFCis6MTAwNjUwMDBGMDAyMDZEOTc4ODJFNkZEMDhFNkZDRURGRUVDRkQ3RkFGCis6MTAwNjYwMDAwMTkwMDAwNjEyMDIxNzU0RkU5MEZGRjNGMDgwMkI3OEUxCis6MTAwNjcwMDA4MkU2RkQwOEU2RkNFREZFRUNGRDdGMDE5MDAwMDgxMjJECis6MTAwNjgwMDAwMjE3RkFFQjkwRkZGMUYwMTIwOEM4NDAwREFEM0FBRTM4Cis6MTAwNjkwMDAzOUFGMzhFNDEyMDMxODdDMTgyMjc4ODJFNkZEMDhFNkE4Cis6MTAwNkEwMDBGQ0VERkVFQ0ZEN0YwMTkwMDAwODEyMDIxNzkwRkZGMUI3Cis6MTAwNkIwMDBGMDEyMDhDODQwMERBRDNBQUUzOUFGMzhFNDEyMDMxODU1Cis6MTAwNkMwMDA3QzE4MjI3ODgyRTZGRDA4RTZGQ0VERkVFQ0ZEN0YwMTU5Cis6MTAwNkQwMDA5MDAwMDYxMjAyMTc0NDAxOTBGRkYzRjA3ODgzRTYyNDlECis6MTAwNkUwMDAwM0Y2MThFNjM0MDBGNjc4ODBFNjI0RkU1MDA5OTBGRjAxCis6MTAwNkYwMDBGMEUwNTRGREYwODAwNzkwRkZGMEUwNDQwMkYwRTQ5MDU5Cis6MTAwNzAwMDBGRkYxRjA3ODgxNzYwMDc4ODBFNjI0RkZGQ0U0MzRGRjg2Cis6MTAwNzEwMDBGRDc4ODFFNjdGMDBGRUVDRDM5RUVGNjQ4MENENjQ4MDlGCis6MTAwNzIwMDA5RDQwMkYxMjA4QUQ0MDBGNzg4MUU2QUQzQUFFMzlBRjRCCis6MTAwNzMwMDAzODEyMDMxODdDMTgyMjkwRkZGMkUwRkM3ODgyODY4MzNFCis6MTAwNzQwMDAwODg2ODJFQ0YwNzg4MTA2QTM3ODgyQTY4MzA4QTY4MkM4Cis6MTAwNzUwMDA4MEI1MTIwOEFENDAwRjc4ODFFNkFEM0FBRTM5QUYzOEJBCis6MTAwNzYwMDAxMjAzMTg3QzE4MjI5MEZGRjJFMEZDNzg4Mjg2ODMwODNFCis6MTAwNzcwMDA4NjgyRUNGMDc4ODBFNkFEM0FBRTM5QUYzODEyMDMxOEQ1Cis6MTAwNzgwMDA3QzAwMjI4QzM3OEQzNjc4ODJFREY2MDhFQ0Y2RURGRTkzCis6MTAwNzkwMDBFQ0ZEN0YwMTkwMDAwNTEyMDFGNTc4ODFGNjc4ODJFNjg0Cis6MTAwN0EwMDBGRDA4RTZGQ0VERkVFQ0ZEN0YwMTkwMDAwNDEyMDFGNTcyCis6MTAwN0IwMDA1NDBGRkM3RDgxMTIxNzZENzg4MUU2NzAwMzdDMDgyMjRFCis6MTAwN0MwMDA5MEZGRjBFMDU0RkVGMDkwRkZGMEUwNTRGREYwODAxQjRECis6MTAwN0QwMDA3ODgyRTZGRDA4RTZGQ0VERkVFQ0ZEN0YwMTkwMDAwODY2Cis6MTAwN0UwMDAxMjAyMTcyNUUwOTBGRkYzRjA4MDVCNzg4MkU2RkQwOEE3Cis6MTAwN0YwMDBFNkZDRURGRUVDRkQ3RjAxOTAwMDA2MTIwMjE3NTRGRUIwCis6MTAwODAwMDA5MEZGRjNGMDgwMjE3ODgyRTZGRDA4RTZGQ0VERkVFQzM3Cis6MTAwODEwMDBGRDdGMDE5MDAwMDgxMjAyMTdGQUVCOTBGRkYxRjAxMjMxCis6MTAwODIwMDAwOEM4NDAwMzdDMTgyMjc4ODJFNkZEMDhFNkZDRURGRTRECis6MTAwODMwMDBFQ0ZEN0YwMTkwMDAwODEyMDIxNzkwRkZGMUYwMTIwODAyCis6MTAwODQwMDBDODQwMDM3QzE4MjI3ODgzRTYyNDBBRjYxOEU2MzQwMEIwCis6MTAwODUwMDBGNjc4ODA3NjAwNzg4MUU2MjRGRkZDRTQzNEZGRkQ3OEFBCis6MTAwODYwMDA4MEU2N0YwMEZFRUNEMzlFRUY2NDgwQ0Q2NDgwOUQ0MEU3Cis6MTAwODcwMDAyMTc4ODI4NjgzMDg4NjgyRTA5MEZGRjFGMDEyMDhDODEyCis6MTAwODgwMDA0MDAzN0MxODIyNzg4MDA2Nzg4MzA2RTYxODcwMDEwNkZCCis6MTAwODkwMDA4MEMzOTBGRkYwRTA0NDAxRjA3ODgyODY4MzA4ODY4MjZFCis6MTAwOEEwMDBFMDkwRkZGMUYwMTIwOEM4NDAwMzdDMTgyMjdDMDAyMjdGCis6MTAwOEIwMDA5MEZGRjBFMDIwRTcxMjkwRkZGMEUwMzBFNTA5OTBGRkI0Cis6MTAwOEMwMDBGMEUwNDQyMEYwQzMyMjgwRTdEMzIyOTBGRkYwRTAyMDQ0Cis6MTAwOEQwMDBFMzEyOTBGRkYwRTAzMEU1MDk5MEZGRjBFMDQ0MjBGMEYzCis6MTAwOEUwMDBDMzIyODBFN0QzMjI4QzQyOEQ0MTdDMDBFRDU0RjBGRDgxCis6MTAwOEYwMDBFQzcwMDNFRDY0MzA3MDA1NzUzRTAzODAwMzc1M0UwNEIzCis6MTAwOTAwMDBBQzNFMTIwRjcyNzU4MzAwODU4MzQwRTU0MTU0MEZGNUFDCis6MTAwOTEwMDAzRkU1NDA3MDA0RTUzRjY0MDM3MDM1RTUzRTI0RkQ3NTE2Cis6MTAwOTIwMDBGMDBBQTQyNDAyRjU4MkU0MzRGQ0Y1ODNFMDMwRTYwNTA1Cis6MTAwOTMwMDAxMjEwNTk4MDE5RTUzRTI0OURGOEU2NTRGQkY2NzhBOTdCCis6MTAwOTQwMDBFNjI0MDVGNTgyMThFNjM0MDBGNTgzNzQwRkYwODA1OTJCCis6MTAwOTUwMDBFNTQwNzAwNEU1M0Y2NDA0NzA0OEU1M0UyNEZENzVGMDExCis6MTAwOTYwMDAwQUE0MjQwMkY1ODJFNDM0RkNGNTgzRTAzMEU1MDdBQzA4Cis6MTAwOTcwMDA0MkFENDExMjFDNUFFNTQyMzBFMjE1NzhBREU2MzBFMDU2Cis6MTAwOTgwMDAwRjc4QURFNjMwRTEwOUU0RkYwNEZFN0MwNDEyMzI0RDNECis6MTAwOTkwMDA3OEE5RTYyNDA2RjU4MjE4RTYzNDAwRjU4Mzc0MEZGMDkyCis6MTAwOUEwMDA4MDA3RTRGQzdERUUxMjFDNUFDMjAzMjIxMjMxMzgxMjc5Cis6MTAwOUIwMDAwRjcyNzhBOUU2MjQwNkY1ODIxOEU2MzQwMEY1ODNFMDg0Cis6MTAwOUMwMDA5MEZDMzhGMDc4QTlFNjI0MDVGNTgyMThFNjM0MDBGNUE1Cis6MTAwOUQwMDA4M0UwOTBGQzM5RjBDMjAzN0QwMjdDMDAxMjI1NDYxMkIwCis6MTAwOUUwMDAzMUJCMjIxMjMxMzg3ODk1RUNGNkVDMjQ5REY4RTYzMEQ0Cis6MTAwOUYwMDBFMTA3N0MxMzEyMjVERjgwMEY5MEZDMzlFMEZENzg5NTJDCis6MTAwQTAwMDBFNkZDMTIxM0VGMTIyNURGMTIzMUJCMjIxMjMxMzg3OEM3Cis6MTAwQTEwMDA5NUVDRjY3RDAwMTIwRjEyMTIyNURGMTIzMUJCMjIxMjY3Cis6MTAwQTIwMDAzMTM4Nzg5NUVDRjZFQzI0OURGOEU2MzBFMjA3N0MxMzNCCis6MTAwQTMwMDAxMjI1REY4MDFCNzg5NUU2MjQ5REY4RTYyMEUxMDc3Q0VGCis6MTAwQTQwMDAxMjEyMjVERjgwMEE3ODk1RTZGQzEyMTQxMzEyMjVERkI2Cis6MTAwQTUwMDAxMjMxQkIyMjEyMzEzODc4OTVFQ0Y2RUMyNDlERjhFNjgxCis6MTAwQTYwMDAyMEUyMDc3QzExMTIyNURGODAwQTc4OTVFNkZDMTIxNTNBCis6MTAwQTcwMDAxNDEyMjVERjEyMzFCQjIyMTIzMTM4Nzg5NUVDRjYxMkIwCis6MTAwQTgwMDAwRjcyNzhBOUU2MjQwOUY1ODIxOEU2MzQwMEY1ODNFMEIwCis6MTAwQTkwMDA5MEZDM0ZGMDc4QTlFNjI0MEFGNTgyMThFNjM0MDBGNUM4Cis6MTAwQUEwMDA4M0UwOTBGQzQwRjA3OEE5RTYyNDAzRjU4MjE4RTYzNDUwCis6MTAwQUIwMDAwMEY1ODNFMEZDNzhBOUU2MjQwNEY1ODIxOEU2MzQwMDBBCis6MTAwQUMwMDBGNTgzRTBGNTYyNzhBOUU2MjQwMkY1ODIxOEU2MzQwMEExCis6MTAwQUQwMDBGNTgzRTBGNTYzOEM2MUU0RUMzMzMzNTQwMTc4OTVGNkVCCis6MTAwQUUwMDA2MDA4RTU2MjMwRTEwMzc4OTUwNjc4OTVFNjkwRkM0MTcwCis6MTAwQUYwMDBGMDc4QTdFNjI0MDJGNTgyMThFNjM0MDBGNTgzRTBGRERECis6MTAwQjAwMDBBM0UwNTQwQ0ZDRUQ1NEU2OEM2NUY1NjRFNTYxMzBFNTNBCis6MTAwQjEwMDAwMzQzNjUwMUU1NjIyMEU1MEVFNTYxNTQ3RjcwMDhFNTU5Cis6MTAwQjIwMDA2MTIwRTcwMzQzNjUwMkU1NjEzMEUzMDM0MzY1MTBFNUI3Cis6MTAwQjMwMDA2MTMwRTIwMzQzNjUyMEU1NjE1NDAzNjAwMzQzNjU0MDhGCis6MTAwQjQwMDBFNTYxMzBFMTAzNDM2NTgwRTU2MTMwRTQwMzQzNjQwMTFFCis6MTAwQjUwMDBFNTYxMzBFNjAzNDM2NDA4RTU2MjIwRTQwRUU1NjE1NDk0Cis6MTAwQjYwMDA3RjcwMDhFNTYxMjBFNzAzNDM2NDEwNTM2NUZCNTM2NDFECis6MTAwQjcwMDBGOUFENjRFNTY1OTBGQzNBQ0RGMEEzQ0RGMEU1NjMzMEM2Cis6MTAwQjgwMDBFMzBERTU2MzU0MzBDNDU0MEY5MEZDM0RGMDgwMDVFNDYwCis6MTAwQjkwMDA5MEZDM0RGMEU1NjM1NDAzOTBGQzNDRjBFNTYzNTQwNEE1Cis6MTAwQkEwMDBDMzEzOTBGQzNFRjA5MEZDM0NFMDcwMEU3RDM1N0VGQzYzCis6MTAwQkIwMDA3RjAxNzQwMTkwMDAwOTEyMDE0Qjc4QTlFNjI0MDhGNTIxCis6MTAwQkMwMDA4MjE4RTYzNDAwRjU4M0UwN0MwMEZENzhBOUU2MjQwNzZFCis6MTAwQkQwMDBGNTgyMThFNjM0MDBGNTgzRTA3RjAwNENGRUVGNEQ5MDdGCis6MTAwQkUwMDBGQzM4RjBBM0NFRjBDRUMyMDM3RDBBN0MwMDEyMjU0NjZECis6MTAwQkYwMDAxMjMxQkIyMjEyMzEzODc4OTVFQ0Y2Nzg5QTc2MDEwOERBCis6MTAwQzAwMDA3NkZDMDg3NjM4Nzg5Nzc2MEM3ODlBMTIwNDZFMTIwMjgxCis6MTAwQzEwMDAxRDc4OThDQkY2Q0IwOEY2N0YwMEVGMjRFQTQwMUZFNDVFCis6MTAwQzIwMDBFRjI1RTA5MDM1N0VGRDkzQ0QwNDkzNzg5OTY2NzAwM0FGCis6MTAwQzMwMDBFRDE4NjY3MDA2Nzg5Nzc2MDA4MDAzMEY4MERDNzg5NjUyCis6MTAwQzQwMDBFRkY2Nzg5QTEyMDQ2RTkwMDAwMjEyMDIxNzc4OThDQjkxCis6MTAwQzUwMDBGNkNCMDhGNjU0MDRDQjU0MDY0QjYwMDQ3ODk3NzYwQjE5Cis6MTAwQzYwMDA3ODk5RTYzMEUzMTM3ODlBMTIwNDZFOTAwMDA1MTIwMTI5Cis6MTAwQzcwMDBGNTI0RkI1MDA0Nzg5Nzc2MEQ3ODk5RTY1NEMwN0QwMEYyCis6MTAwQzgwMDA2NEMwNEQ3MDA0Nzg5Nzc2MEI3ODlBMTIwNDZFOTAwMEM5Cis6MTAwQzkwMDAwNDEyMDFGNTI0RkM1MDA0Nzg5Nzc2MEY3ODlBMTIwNDE4Cis6MTAwQ0EwMDA2RTkwMDAwNjEyMDFGNTI0RkQ1MDA0Nzg5Nzc2MEU3OEI4Cis6MTAwQ0IwMDA5QTEyMDQ2RTkwMDAwOTEyMDFGNTI0RkQ1MDA0Nzg5N0YxCis6MTAwQ0MwMDA3NjBBNzg5N0U2NzAyQTc4OTVFNkZDMTIwRjcyNzg5QTgxCis6MTAwQ0QwMDAxMjA0NkU3OEE3RTZGOTc4QTZFNkZBN0IwMTc0MEE3ODIyCis6MTAwQ0UwMDAwMDEyMDM0OEMyMDM3ODk1RTZGQzEyMTExNTc4OTdFQ0MwCis6MTAwQ0YwMDBGNjc4OTdFNkZDMTIyNURGMTIzMUJCMjIxMjMxMzg3OEU0Cis6MTAwRDAwMDA5NUVDRjYxMjBGNzI3ODk1RTYyNEZENzVGMDBBQTQyNDhFCis6MTAwRDEwMDAxNEY1ODJFNDM0RkNGNTgzQUM4MkFEODM3OEE2ODY4MzM3Cis6MTAwRDIwMDAwODg2ODJFQ0Y5RURGQTdCMEE3ODAxMTIwM0IwQzIwMzVGCis6MTAwRDMwMDA3ODk1RTZGQzEyMTExNTEyMzFCQjIyOEQyQjhDMkFFRDExCis6MTAwRDQwMDA2MDQwNzUyNzAxNzUyOTQ4NzUyOEZGRTUyQTI0RkRGQ0I4Cis6MTAwRDUwMDBFNDM0RkZGREVDN0MwMzI1RTBDRDMzQ0REQ0Y5RkNFNThDCis6MTAwRDYwMDAyOTJDRjUyOUU1MjgzREY1MjhBRDI5QUUyOEFGMjc3NEIzCis6MTAwRDcwMDA4MDkwMDAwNjEyMDMyMDc0ODA5MDAwMDIxMjAzMjAxMjVCCis6MTAwRDgwMDAwRkM1RTUyQjE0NjAzQjc1MjcwMTc1MjkwODc1MjhGRkYxCis6MTAwRDkwMDBFNTJBMjRGREZDRTQzNEZGRkRFQzdDMDMyNUUwQ0QzM0EzCis6MTAwREEwMDBDRERDRjlGQ0U1MjkyQ0Y1MjlFNTI4M0RGNTI4QUQyOTEwCis6MTAwREIwMDBBRTI4QUYyN0U0OTAwMDA2MTIwMzIwRTQ5MDAwMDIxMjUwCis6MTAwREMwMDAwMzIwMjIxMjMxMzg3ODk1RUNGNkVDMjQ5REY4RTYzMEI5Cis6MTAwREQwMDBFMjA5Nzg5NUU2RkMxMjE1MTREMjAwNzg5NUU2RkMxMjJCCis6MTAwREUwMDAwRjcyNzg5Njc2MDA5MEZDMzlFMDMwRTcwNDc4OTY3NkJBCis6MTAwREYwMDAwMTc4OTZFNkZENzg5NUU2RkMxMjBEMzhDMjAzMzAwMEM2Cis6MTAwRTAwMDAwNzc4OTVFNkZDMTIxNDEzN0MwMDEyMjVERjEyMzFCQjIzCis6MTAwRTEwMDAyMjc4QTlFNjI0MDRGNTgyMThFNjM0MDBGNTgzRTA0NDNDCis6MTAwRTIwMDAwMUYwNzhBOUU2MjQwNEY1ODIxOEU2MzQwMEY1ODNFMEExCis6MTAwRTMwMDAzMEUwMDI4MEVENzhBOUU2MjQwQkY1ODIxOEU2MzQwMDU0Cis6MTAwRTQwMDBGNTgzRTA1NEY4RjA3OEE5RTYyNDAyRjU4MjE4RTYzNDM4Cis6MTAwRTUwMDAwMEY1ODNFMDQ0ODBGMDIyQzIwMzhDNTgxMjBGNzI3OEIwCis6MTAwRTYwMDBBNjg2ODMwODg2ODI3OUFGN0EzNTdCMEE3ODAxMTIwM0Q5Cis6MTAwRTcwMDBGRTEyMEUwRUFDNTg3RDAyMTIwRDM4QzIwM0FDNTgxMjkxCis6MTAwRTgwMDAxMTE1MjI4RDUzOEU1MjhGNTE4QzUwMTIwRjcyNzU0RjQ3Cis6MTAwRTkwMDAwMDc4QTlFNjI0MDVGNTgyMThFNjM0MDBGNTgzRTAyMDAxCis6MTAwRUEwMDBFNDFGRTU0RjI0RjY0MDE5MDU0RkMyMDM3QzE4MTIzMkE3Cis6MTAwRUIwMDBGQjkwRkY5M0UwNDQwMUYwQjJCM0FDNTAxMjBGNzI4MDhDCis6MTAwRUMwMDBEMDc4QTlFNjI0MDVGNTgyMThFNjM0MDBGNTgzRTAyMDAxCis6MTAwRUQwMDBFNDA1QzIwMzdDMDIyMjc4QTlFNjI0MDVGNTgyMThFNjFGCis6MTAwRUUwMDAzNDAwRjU4M0UwNTQwRjYwMTY3OEE5RTYyNDA1RjU4MkY2Cis6MTAwRUYwMDAxOEU2MzQwMEY1ODNFMDU0MEZGMEMyMDM3QzAxMjI3ODM5Cis6MTAwRjAwMDBBODg2ODMwODg2ODJFMEFENTNBRTUyQUY1MTEyMDMxODEzCis6MTAwRjEwMDBDMjAzN0MwMDIyOEQzMThDMzAxMjE1MTRFNTMxNjAwRjM0Cis6MTAwRjIwMDBFNTMwQjQwMzBBN0MwMTEyMjUwRTdDODExMjI1MEVBQzNCCis6MTAwRjMwMDAzMDEyMEY3MkU1MzE2MDFBNzhBQTg2ODMwODg2ODJFMDQzCis6MTAwRjQwMDA1NEU3RjBBM0EzQTNBM0UwNTRFN0YwQUMzMDdEMDIxMjcyCis6MTAwRjUwMDAwRDM4NzhBNjg2ODMwODg2ODI3OUI5N0EzNTdCMEE3ODM3Cis6MTAwRjYwMDAwMTEyMDNGRUMyMDNFNTMwMjQ5REY4RTY1NEZERjZBQzAxCis6MTAwRjcwMDAzMDEyMTExNTIyOEMyNjMwMDMwNTEyMzI5QTgwRjg3QzJCCis6MTAwRjgwMDAwQTEyMzFBREQyMDNFNTI2MjRGRDc4QTNGNjcwMDc3ODY2Cis6MTAwRjkwMDBBQTc2RkYwODc2RTA3OEEzRTY3RDAwN0MwNDI1RTBDRDA0Cis6MTAwRkEwMDAzM0NERENGOUZDMjRBMDc4QTlGNkVEMzRGRjE4RjY3OEVGCis6MTAwRkIwMDBBM0U2NzVGMDBBQTQyNDAwRkNFNDM0RkNGRDc4QTZFRDU5Cis6MTAwRkMwMDBGNjA4RUNGNjEyMzI0NjIyNzhBOUU2MjQwMkY1ODIxOEQ5Cis6MTAwRkQwMDBFNjM0MDBGNTgzRTAzMEU3MjI3OEE5RTYyNDAyRjU4MkMyCis6MTAwRkUwMDAxOEU2MzQwMEY1ODNFMDU0N0ZGMDc4QTlFNjI0MDJGNTkyCis6MTAwRkYwMDA4MjE4RTYzNDAwRjU4M0UwNDQ4MEYwMjI3OEFBODY4M0U0Cis6MTAxMDAwMDAwODg2ODJFMDU0N0ZGMEFEODNFNTgyMjQwNEZDRTQzRDUxCis6MTAxMDEwMDA4QzgyRjU4M0UwNTQ3RkYwNzhBOUU2MjQwQkY1ODIxOEUyCis6MTAxMDIwMDBFNjM0MDBGNTgzRTA1NEY4RjA3OEFCRTYyNDAxRjU4MjZECis6MTAxMDMwMDAxOEU2MzQwMEY1ODNFMDQ0MDNGMDc4QUJFNjI0MDVGNUM4Cis6MTAxMDQwMDA4MjE4RTYzNDAwRjU4M0UwNDQwM0YwNzhBOUU2MjQwNTJECis6MTAxMDUwMDBGNTgyMThFNjM0MDBGNTgzNzQwRkYwMjI3OEFBODY4M0FGCis6MTAxMDYwMDAwODg2ODJFMDU0M0ZGMEFEODNFNTgyMjQwNEZDRTQzRDMxCis6MTAxMDcwMDA4QzgyRjU4M0UwNTQzRkYwNzhBM0U2MjRBNEY4RTZGQ0U0Cis6MTAxMDgwMDA3OEFCRTYyNDAxRjU4MjE4RTYzNDAwRjU4M0VDRjA3OEJECis6MTAxMDkwMDBBM0U2MjRBNEY4RTZGQzc4QUJFNjI0MDVGNTgyMThFNjdFCis6MTAxMEEwMDAzNDAwRjU4M0VDRjA3OEE5RTYyNDBCRjU4MjE4RTYzNEQ5Cis6MTAxMEIwMDAwMEY1ODNFMDU0RkI0NDAyRjUyNjc4QTdFNjI0MDJGNTA4Cis6MTAxMEMwMDA4MjE4RTYzNDAwRjU4M0UwMzBFNTAzNDMyNjAxNzhBOTcxCis6MTAxMEQwMDBFNjI0MDVGNTgyMThFNjM0MDBGNTgzRTAzMEUwMDMxMkRCCis6MTAxMEUwMDAwRkM1RTUyNkZDNzhBOUU2MjQwQkY1ODIxOEU2MzQwMDQ2Cis6MTAxMEYwMDBGNTgzRUNGMDc4QTlFNjI0MDVGNTgyMThFNjM0MDBGNUNFCis6MTAxMTAwMDA4Mzc0MEZGMDc4QUE4NjgzMDg4NjgyRTA0NDgwRjBBMzc3Cis6MTAxMTEwMDBBM0EzQTNFMDQ0ODBGMDIyOEMyQTEyMEY3Mjc4QTdFNkUyCis6MTAxMTIwMDAyNDA4RjU4MjE4RTYzNDAwRjU4M0UwRkM3OEE5RTYyNDZCCis6MTAxMTMwMDAwQUY1ODIxOEU2MzQwMEY1ODNFQ0YwNzhBN0U2MjQwNzc4Cis6MTAxMTQwMDBGNTgyMThFNjM0MDBGNTgzRTBGQzc4QTlFNjI0MDlGNTc5Cis6MTAxMTUwMDA4MjE4RTYzNDAwRjU4M0VDRjA3OEE2ODY4MzA4ODY4MjUwCis6MTAxMTYwMDBFMEZEQTNFMEZDRURGRTc4QTlFNjI0MDhGNTgyMThFNjkwCis6MTAxMTcwMDAzNDAwRjU4M0VFRjBFQ0ZFNzhBOUU2MjQwN0Y1ODIxODNBCis6MTAxMTgwMDBFNjM0MDBGNTgzRUVGMDhDMjk4RDI4QzNFQzk0MDVFRDUwCis6MTAxMTkwMDA5NDBDNDAwNTc1Mjc3QzgwMzNEM0U1Mjk5NDAxRTUyODFDCis6MTAxMUEwMDA5NDAzNDAwNTc1MjczQzgwMjNEM0U1Mjk5NDgxRTUyOEU1Cis6MTAxMUIwMDA5NDAxNDAwNTc1MjcxODgwMTNEM0U1Mjk5NDYwRTUyODJDCis6MTAxMUMwMDA5NDAwNDAwNTc1MjcwQzgwMDM3NTI3MDhBRjI3RTRFRkNFCis6MTAxMUQwMDA1NDdDNDQ4M0ZGOEYyN0U1MjdGQzc4QUJFNjI0MDFGNTk4Cis6MTAxMUUwMDA4MjE4RTYzNDAwRjU4M0VDRjBFNTI3RkM3OEFCRTYyNEMyCis6MTAxMUYwMDAwNUY1ODIxOEU2MzQwMEY1ODNFQ0YwRTUyN0ZDNzhBM0NBCis6MTAxMjAwMDBFNjI0QTRGOEVDRjY3OEE5RTYyNDAyRjU4MjE4RTYzNDgwCis6MTAxMjEwMDAwMEY1ODNFMEY1Mjc3OEE3RTYyNDAyRjU4MjE4RTYzNDg2Cis6MTAxMjIwMDAwMEY1ODNBM0UwMzBFMzE3NTMyN0M3NzhBN0U2MjQwNTJBCis6MTAxMjMwMDBGNTgyMThFNjM0MDBGNTgzRTA5MDM1QUE5MzQyMjc3OENBCis6MTAxMjQwMDBBN0U2MjQwMkY1ODIxOEU2MzQwMEY1ODNFMDMwRTcwNUNFCis6MTAxMjUwMDA0MzI3NDA4MDAzNTMyN0JGNTMyN0ZCNzhBN0U2MjQwNjg0Cis6MTAxMjYwMDBGNTgyMThFNjM0MDBGNTgzRTA2MDAzNDMyNzA0NTMyNzMyCis6MTAxMjcwMDBGQzc4QTdFNjI0MDRGNTgyMThFNjM0MDBGNTgzRTA0MjAyCis6MTAxMjgwMDAyNzQzMjc4MEU1MjdGQzc4QTlFNjI0MDJGNTgyMThFNkEzCis6MTAxMjkwMDAzNDAwRjU4M0VDRjA3OEE5RTYyNDA0RjU4MjE4RTYzNEVFCis6MTAxMkEwMDAwMEY1ODNFMEY1Mjc3OEE3RTYyNDAyRjU4MjE4RTYzNEY2Cis6MTAxMkIwMDAwMEY1ODNBM0UwMzBFMTA1NTMyN0RGODAwMzQzMjcyMEI3Cis6MTAxMkMwMDA3OEE3RTYyNDAyRjU4MjE4RTYzNDAwRjU4M0UwMzBFNERFCis6MTAxMkQwMDAwNTUzMjdFRjgwMDM0MzI3MTA3OEE3RTYyNDA5RjU4MkZBCis6MTAxMkUwMDAxOEU2MzQwMEY1ODNFMEI0MDIwMzQzMjcwMkU1MjdGQzQ3Cis6MTAxMkYwMDA3OEE5RTYyNDA0RjU4MjE4RTYzNDAwRjU4M0VDRjA3ODRBCis6MTAxMzAwMDBBOUU2MjQwM0Y1ODIxOEU2MzQwMEY1ODNFMEY1Mjc3ODkyCis6MTAxMzEwMDBBN0U2MjQwOUY1ODIxOEU2MzQwMEY1ODNFMDcwMDU1MzRBCis6MTAxMzIwMDAyNzdGODAwMzQzMjc4MDc4QTdFNjI0MDJGNTgyMThFNjBBCis6MTAxMzMwMDAzNDAwRjU4M0EzRTAzMEUwMDU0MzI3MjA4MDAzNTMyN0UyCis6MTAxMzQwMDBERjc4QTdFNjI0MDJGNTgyMThFNjM0MDBGNTgzRTAzMDYyCis6MTAxMzUwMDBFMzA1NDMyNzQwODAwMzUzMjdCRjc4QTdFNjI0MDJGNTFGCis6MTAxMzYwMDA4MjE4RTYzNDAwRjU4M0UwMzBFMDA1NDMyNzEwODAwMzVGCis6MTAxMzcwMDA1MzI3RUY3OEE3RTYyNDAyRjU4MjE4RTYzNDAwRjU4M0I4Cis6MTAxMzgwMDBBM0UwMzBFNDA1NDMyNzA4ODAwMzUzMjdGNzc4QTdFNjU2Cis6MTAxMzkwMDAyNDAyRjU4MjE4RTYzNDAwRjU4M0EzRTAzMEU1MDU0MzI2Cis6MTAxM0EwMDAyNzA0ODAwMzUzMjdGQjc4QTdFNjI0MDJGNTgyMThFNjdBCis6MTAxM0IwMDAzNDAwRjU4M0EzRTAzMEU2MDU0MzI3MDE4MDAzNTMyNzdCCis6MTAxM0MwMDBGRTc4QTdFNjI0MDJGNTgyMThFNjM0MDBGNTgzQTNFMDUwCis6MTAxM0QwMDAzMEU3MDU0MzI3MDI4MDAzNTMyN0ZERTUyN0ZDNzhBOTYyCis6MTAxM0UwMDBFNjI0MDNGNTgyMThFNjM0MDBGNTgzRUNGMEMyMDM3Q0IyCis6MTAxM0YwMDAwMDIyOEQyNzhDMjZFRDU0MDMxNDYwMDM3QzEwMjJFNTE3Cis6MTAxNDAwMDAyNzU0N0MyNEZDNDAwMzdDMEIyMkU1MjYyNDlERjhFNjJGCis6MTAxNDEwMDA0NDAyRjY3QzAwMjI4QzMwMTIwRjcyRTUzMDI0OURGOEQ1Cis6MTAxNDIwMDBFNjIwRTI0RkFDMzA3RDAyMTIwRDM4RTUzMDI0RkU0NDU4Cis6MTAxNDMwMDAyOEZDNzhBQTg2ODMwODg2ODJFQ0YwQUY4M0U1ODIyNEI0Cis6MTAxNDQwMDAwNEZFRTQzRkZGRUM4RTgyOEY4M0YwN0MwMzhDMkNFNTVFCis6MTAxNDUwMDAyQ0ZDNzhBQkU2MjQwMUY1ODIxOEU2MzQwMEY1ODNFQzI5Cis6MTAxNDYwMDBGMEU1MkNGQzc4QUJFNjI0MDVGNTgyMThFNjM0MDBGNUFGCis6MTAxNDcwMDA4M0VDRjA3NTJEMDE3NTJGNDg3NTJFRkZFNTMwMjRGREE2Cis6MTAxNDgwMDBGQ0U0MzRGRkZERUM3QzAzMjVFMENEMzNDRERDRjlGQzNFCis6MTAxNDkwMDBFNTJGMkNGNTJGRTUyRTNERjUyRTc4QUJFNjI0MDRGNTRGCis6MTAxNEEwMDA4MjE4RTYzNDAwRjU4M0UwNTRFN0Y1MkNBRDJGQUUyRTFDCis6MTAxNEIwMDBBRjJERTQ5MDAwMDIxMjAzMjBFNDkwMDAwNjEyMDMyMEY2Cis6MTAxNEMwMDAxMjAxRUYzMEU1MDM0MzJDMTBFNTJDRkM3OEFCRTYyNDQ5Cis6MTAxNEQwMDAwNEY1ODIxOEU2MzQwMEY1ODNFQ0YwMTIxMDU5NzhBOTZGCis6MTAxNEUwMDBFNjI0MDZGNTgyMThFNjM0MDBGNTgzRTBDMjAzRkNFNTQ1Cis6MTAxNEYwMDAzMDI0OURGOEU2NDQwNEY2OEMyQ0U1MzA1NDBGQzQ1NDk3Cis6MTAxNTAwMDBGMDdFMDBGRkVFRUY0NDA0N0QwMEZGRUM0RUZDRUQ0RjVCCis6MTAxNTEwMDBGRDEyMUNDNTdDMDAyMjhDMkYxMjBGNzIxMjBGRjk3ODVECis6MTAxNTIwMDBBQTg2ODMwODg2ODJFMDU0MDhGMEEzQTNBM0EzRTA1NDBDCis6MTAxNTMwMDAwOEYwQUMyRjdEMDIxMjBEMzhDMjAzRTUyRjI0OURGODcwCis6MTAxNTQwMDBFNjU0RkJGNjdDMDAyMjEyMzEzODc4OTZFQ0Y2RUMyNDU3Cis6MTAxNTUwMDA5REY4RTYzMEUxMEE3RDAwN0MxMzEyMjU0NjEyMzFCQjZFCis6MTAxNTYwMDA3ODk2RTYyNDlERjhFNjQ0MDFGNjc4OTZFNkZDMTIwRjlDCis6MTAxNTcwMDA3Mjc4OTZFNjI0RkQ3NUYwMEFBNDI0MTRGNTgyRTQzNDBBCis6MTAxNTgwMDBGQ0Y1ODM3OEE2RTZGQTA4RTZGOTdCMEE3ODAxMTIwM0VGCis6MTAxNTkwMDBCMDc4QTY4NjgzMDg4NjgyNzlCOTdBMzU3QjBBNzgwMTg1Cis6MTAxNUEwMDAxMjAzRkUxMjBGQzVDMjAzNzg5NkU2RkMxMjExMTU3OERECis6MTAxNUIwMDA5NUVDRjZFQzYwMEE3RDAwN0MwODEyMjU0NjEyMzFCQkUyCis6MTAxNUMwMDA3ODk2RTZGQzEyMEY3Mjc4QTlFNjI0MDRGNTgyMThFNkY0Cis6MTAxNUQwMDAzNDAwRjU4M0UwNDQxMDU0REZGQzc4QTlFNjI0MDRGNUQ4Cis6MTAxNUUwMDA4MjE4RTYzNDAwRjU4M0VDRjA3ODk1RUNGNkMyMDM3Q0MzCis6MTAxNUYwMDBDODEyMzJGQjc4OTZFNkZDMTIwRjcyNzhBOUU2MjQwNDMyCis6MTAxNjAwMDBGNTgyMThFNjM0MDBGNTgzRTA1NEVGRjBDMjAzN0NDODlECis6MTAxNjEwMDAxMjMyRkI3ODk2RTZGQzEyMEY3Mjc4QTlFNjI0MDRGNUU0Cis6MTAxNjIwMDA4MjE4RTYzNDAwRjU4M0UwNDQxMEYwQzIwMzdDQzgxMjRGCis6MTAxNjMwMDAzMkZCNzg5NkU2RkMxMjBGNzI3OEE5RTYyNDA0RjU4MjU0Cis6MTAxNjQwMDAxOEU2MzQwMEY1ODNFMDQ0MjBGMEMyMDM3Q0YwMTIzMjQ3Cis6MTAxNjUwMDBGQjc4OTZFNkZDMTIwRjcyNzhBOUU2MjQwNUY1ODIxODRECis6MTAxNjYwMDBFNjM0MDBGNTgzRTAzMEU0MTVDMjAzNzg5NkU2NDQxMEQyCis6MTAxNjcwMDA3RjAwRkU3QzA3MTIzMjREMTIzMUJCMDIxNzNCNzhBOTY2Cis6MTAxNjgwMDBFNjI0MDRGNTgyMThFNjM0MDBGNTgzRTA1NENGRjBDMjc2Cis6MTAxNjkwMDAwMzdDQzgxMjMyRkI3ODk2RTZGQzEyMEY3Mjc4QTlFNjNBCis6MTAxNkEwMDAyNDA0RjU4MjE4RTYzNDAwRjU4M0UwNDQzMEYwQzIwM0U4Cis6MTAxNkIwMDA3Q0YwMTIzMkZCNzg5NkU2RkMxMjBGNzI3OEE5RTYyNEQxCis6MTAxNkMwMDAwNUY1ODIxOEU2MzQwMEY1ODNFMDMwRTQxNEMyMDM3OEFGCis6MTAxNkQwMDA5NkU2NDQxMDdGMDBGRTdDMDcxMjMyNEQxMjMxQkI4MDJCCis6MTAxNkUwMDA1RDc4QTlFNjI0MDRGNTgyMThFNjM0MDBGNTgzRTA1NDE5Cis6MTAxNkYwMDBFRkYwNzhBOUU2MjQwNEY1ODIxOEU2MzQwMEY1ODNFMERCCis6MTAxNzAwMDA1NERGRjA3ODk2RTYyNEZENzVGMDBBQTQyNDE0RjU4MkRGCis6MTAxNzEwMDBFNDM0RkNGNTgzQUM4MkFEODM3OEE2ODY4MzA4ODY4MkE4Cis6MTAxNzIwMDBFQ0Y5RURGQTdCMEE3ODAxMTIwM0IwQzIwMzc4OTZFNjcxCis6MTAxNzMwMDBGQzEyMTExNTdEMDA3QzBCMTIyNTQ2MTIzMUJCMjIxMkMyCis6MTAxNzQwMDAzMTM4RTQ5MEZDMzlGMDdEMDI3QzAwMTIyNTQ2MTIzMURDCis6MTAxNzUwMDBCQjIyMTIzMTM4N0MwMDEyMjVERjEyMzFCQjIyNzQzQ0NGCis6MTAxNzYwMDA5MEZCRTBGMDc0M0U5MEZCRTBGMEU0OTBGQzI4RjAyMjY3Cis6MTAxNzcwMDA4RDM1OEMzNEVDQjQwMTAyODAwM0QzNDAwMjgwMjhCNDUwCis6MTAxNzgwMDAwMjAyODAwM0QzNDAwOEE4MzVFNjI1RTBGNjgwMThCNEFECis6MTAxNzkwMDAwNDAyODAwM0QzNDAwQUE4MzVFNjI1RTAyNUUwRjY4MDYwCis6MTAxN0EwMDAwNkE4MzU3NjAwODAwMDIyOEMzQzhEM0JFREZFRUNGRERBCis6MTAxN0IwMDA3RjAxNzU2NjA2NzU2NzAwOTBGQzI5MTIwNDc3MTIwMTk3Cis6MTAxN0MwMDBFRkI0ODAwMjgwMDZEMzUwMDMwMjE4NkU5MEZDMjkxMkY5Cis6MTAxN0QwMDAwNDg5OTAwMDAzMTIwMUY1NTRGMEI0MzAwMjgwMDNEMzYxCis6MTAxN0UwMDA0MDVGOTBGQzI5MTIwNDg5OTAwMDA4MTIwMjE3RkFGRDRDCis6MTAxN0YwMDBFQkZFN0YwMTkwRkMyQzEyMDQ3N0VFQ0Q5MDM1QzNGQ0ZDCis6MTAxODAwMDBFNDkzRkY3NDAxOTNGRUY5RUZGQTdCMDFFQUZGRTlGRTJFCis6MTAxODEwMDBFQ0MzOUVFRDlGNDAyNTkwMzVDNUU0OTNGRDc0MDE5Mzg0Cis6MTAxODIwMDBGQ0VERkVFQ0ZEN0YwMUVFQ0RGQzkwRkMyRUUwRDM5Q0E4Cis6MTAxODMwMDA5MEZDMkRFMDlENTAwNTc1NjY4MDgwMzMxMjE5OEM4MEQ4Cis6MTAxODQwMDAyRUI0NjAwMjgwMDNEMzQwMEJBQzNDQUQzQjEyMDc4MDRBCis6MTAxODUwMDA4QzY2ODAxQkI0MTAwM0IzNDAxMEMzQjQyMDAzQjM0MEE0Cis6MTAxODYwMDAwOUMzQjQ0MDAyODAwM0QzNDAwMDc1NjY4MTgwMDA4MEM0Cis6MTAxODcwMDA3NUI0ODEwMjgwMDNEMzQwNkI5MEZDMjkxMjA0ODk5MEQ3Cis6MTAxODgwMDAwMDAzMTIwMUY1NTRGMEI0MzAwMjgwMDNEMzQwMUQ5MEUwCis6MTAxODkwMDBGQzI5MTIwNDg5OTAwMDA4MTIwMjE3RkFGREVCRkU3RjYyCis6MTAxOEEwMDAwMTkwRkMyRjEyMDQ3NzEyMThGNjgwMzZCNDYwMDI4MDgzCis6MTAxOEIwMDAwM0QzNDAxMzc1M0E2N0U0RjUzOUY1MzhBQzNDQUQzQkRBCis6MTAxOEMwMDAxMjA1REM4QzY2ODAxQkI0MTAwM0IzNDAxMEMzQjQyMDM3Cis6MTAxOEQwMDAwM0IzNDAwOUMzQjQ0MDAyODAwM0QzNDAwMDc1NjY4MTVFCis6MTAxOEUwMDA4MDAwODAwMjgwMDBFNTY2RkM5MEZDMjkxMjA0ODlFQ0VGCis6MTAxOEYwMDA5MDAwMDIxMjAzMjBBQzY3MjI5MEZDMjkxMjA0ODk5MDA4Cis6MTAxOTAwMDAwMDA0MTIwMUY1NjAwNDc0MDE4MDAxRTRBMkUwOTIwMTc4Cis6MTAxOTEwMDA5MEZDMjkxMjA0ODlFRDI0MDNGRDUwMDEwRTkwRkMyQzRCCis6MTAxOTIwMDAxMjA0Nzc5MEZDMjkxMjA0ODk5MDAwMDUxMjAxRjVGNTQ0Cis6MTAxOTMwMDA2NzkwMDAwNDEyMDFGNTU0MEZGQzdENjcxMjE3NkRFNUU2Cis6MTAxOTQwMDA2NzcwMDQ3NTY2MDgyMjc1NjYwMDc4ODQ3NjAwNzg4NDZFCis6MTAxOTUwMDBFNkMzOTU2NzUwMzg5MEZDMkYxMjA0ODkxMjAxRUZGQzAyCis6MTAxOTYwMDA5MEZDMkMxMjA0ODlFQzEyMDMxODMwMDEwRTkwRkMzMTBCCis6MTAxOTcwMDBFMDA0RjA5MEZDMzA3MDAzRTAwNEYwNzg4NDA2OTBGQzAyCis6MTAxOTgwMDAyRUUwMDRGMDkwRkMyRDcwMDNFMDA0RjA4MEMwMjI5MDYzCis6MTAxOTkwMDBGQzJBRTBGREEzRTBGQ0VERkVFQ0ZEN0YwMUVEMjQwQTU2Cis6MTAxOUEwMDBGRDUwMDEwRTkwRkMzMjEyMDQ3NzkwRkMyOTEyMDQ4OTNDCis6MTAxOUIwMDA5MDAwMDQxMjAxRjU1NDBGQjQwMTAyODAwM0QzNDAxN0M0Cis6MTAxOUMwMDA5MEZDMzIxMjA0ODkwREVENzAwMTBFOTBGQzJGMTIwNDcwCis6MTAxOUQwMDA3Nzc4ODg3NjAxODA0RUI0MDIwMjgwMDNEMzQwMTk5MDU0Cis6MTAxOUUwMDBGQzMyMTIwNDg5RUQyNDAyRkQ1MDAxMEU5MEZDMkYxMkVFCis6MTAxOUYwMDAwNDc3Nzg4ODc2MDI4MDJEQjQwNDAyODAwM0QzNDAxOURFCis6MTAxQTAwMDA5MEZDMzIxMjA0ODlFRDI0MDRGRDUwMDEwRTkwRkMyRjRECis6MTAxQTEwMDAxMjA0Nzc3ODg4NzYwNDgwMENCNDAwMDI4MDAzRDM0MEU3Cis6MTAxQTIwMDAwMDc1NjYwODIyOTBGQzI5MTIwNDg5OTAwMDA1MTIwMUI1Cis6MTAxQTMwMDBGNUY1Njc3ODg1NzYwMDc4ODVFNkMzOTU2NzQwMDMwMkZCCis6MTAxQTQwMDAxQUY0Nzg4Njc2MDA3ODg2RTZDMzc4ODg5NjUwNzY5MDgxCis6MTAxQTUwMDBGQzJDMTIwNDg5MTIwMUVGRkM5MEZDMzIxMjA0OTIxMjQ5Cis6MTAxQTYwMDAwMUU5RjQ1Q0ZDMTIwMUU5Rjg5MEZDMkYxMjA0ODlFODBBCis6MTAxQTcwMDBDMEUwMTIwMUVGQzhEMEUwQzg1ODRDRkM5MEZDMkMxMjFBCis6MTAxQTgwMDAwNDg5RUMxMjAzMTg3ODg3RUNGNjkwRkMzMUUwMDRGMDNFCis6MTAxQTkwMDA5MEZDMzA3MDAzRTAwNEYwMDlFOTcwMDEwQTkwRkMzMjE4Cis6MTAxQUEwMDAxMjA0ODA5MEZDMjkxMjA0ODk5MDAwMDQxMjAxRjUzMDgwCis6MTAxQUIwMDBFNDBFOTBGQzJFRTAwNEYwOTBGQzJENzAwM0UwMDRGMEE2Cis6MTAxQUMwMDA3ODg2MDY4MDgxNzg4OEU2RkRFNEZFRkZFRUNERkM5MDA2Cis6MTAxQUQwMDBGQzMxRTAyQ0YwOTBGQzMwRTAzREYwNzg4OEU2RkRFNDRECis6MTAxQUUwMDBGRUZGRUVDREZDOTBGQzM0RTAyQ0YwOTBGQzMzRTAzREFBCis6MTAxQUYwMDBGMDc4ODUwNjAyMUEzNDc1NjYwMDIyMjJDMEUwQzBGMDM0Cis6MTAxQjAwMDBDMDgyQzA4M0MwRDBFOEMwRTBFOUMwRTBFQUMwRTBFQjNBCis6MTAxQjEwMDBDMEUwRUNDMEUwRURDMEUwRUVDMEUwRUZDMEUwOTBGRjYwCis6MTAxQjIwMDA5MkUwMTIwMUMwMUI0NzMwMUI0NzMyMUI1NjM4MUI2ODFFCis6MTAxQjMwMDAzQTFCN0EzRTFCOTI0NDFCODY0NjFCOUU1MDFCRTA1MjZBCis6MTAxQjQwMDAxQkJGNTQxQzAxNTYwMDAwMUMyMjkwRkY5MkUwN0YwMDM2Cis6MTAxQjUwMDBGRTdDMDExMjMyNEQwMjFDMzJFNEZGMDRGRTdDMDMxMkIzCis6MTAxQjYwMDAzMjRENzQyMDkwRkZGRUYwMDIxQzMyRTRGRjA0RkU3QzM0Cis6MTAxQjcwMDAwMjEyMzI0RDc0NDA5MEZGRkVGMDAyMUMzMkU0RkYwNDZBCis6MTAxQjgwMDBGRTdDMDQxMjMyNEQwMjFDMzJFNEZGMDRGRTdDMDUxMjdFCis6MTAxQjkwMDAzMjREMDIxQzMyRTRGRjA0RkU3QzA2MTIzMjREMDIxQzYwCis6MTAxQkEwMDAzMjkwRkZBNUUwN0QwMDkwRkJGOENERjBBM0NERjA5MDQyCis6MTAxQkIwMDBGQkY5RTBGQ0Y1ODM5MEZCRjhFMDQ0MzNGRDEyMUNDNTEzCis6MTAxQkMwMDA4MDczOTBGRkI1RTA3RDAwOTBGQkZBQ0RGMEEzQ0RGMERGCis6MTAxQkQwMDA5MEZCRkJFMEZDRjU4MzkwRkJGQUUwNDQ0M0ZEMTIxQzE0Cis6MTAxQkUwMDBDNTgwNTI5MEZGQTZFMDdEMDA5MEZCRkNDREYwQTNDRDE4Cis6MTAxQkYwMDBGMDkwRkJGREUwRkNGNTgzOTBGQkZDRTA0NDM0RkQxMjJCCis6MTAxQzAwMDAxQ0M1ODAzMTkwRkZCNkUwN0QwMDkwRkJGRUNERjBBM0I3Cis6MTAxQzEwMDBDREYwOTBGQkZGRTBGQ0Y1ODM5MEZCRkVFMDQ0NDRGRDNCCis6MTAxQzIwMDAxMjFDQzU4MDEwOTBGRjkyRTA3RDAwRkNFRDQ0QUFGRERGCis6MTAxQzMwMDAxMjFDQzU4MDAwRTQ5MEZGOTJGMEQwRTBGRkQwRTBGRURGCis6MTAxQzQwMDBEMEUwRkREMEUwRkNEMEUwRkJEMEUwRkFEMEUwRjlEMDZECis6MTAxQzUwMDBFMEY4RDBEMEQwODNEMDgyRDBGMEQwRTAzMjA1ODEwNTNBCis6MTAxQzYwMDA4MTA1ODEwNTgxQTg4MTE4MTgxOEVERjYwOEVDRjY5MDE5Cis6MTAxQzcwMDBGRjVBRTAyMEU3MDI4MEY3OTBGRjU5RTA3RDAwQTg4MTNECis6MTAxQzgwMDAxOENERjZDRDA4RjY3RDAzQTg4MUU2MThGQ0U2Q0MyNTM0Cis6MTAxQzkwMDBFMENDMzNDQ0RERjlDQ0Y2Q0MwOEY2QTg4MTE4RTY0NENDCis6MTAxQ0EwMDBGOEY2QTg4MTE4MTgxOEU2RkQwOEU2RkNBODgxMTg4NjQxCis6MTAxQ0IwMDA4MzA4ODY4MkVERjBBM0VDRjA3NDAyOTBGRjVBRjAxNUQxCis6MTAxQ0MwMDA4MTE1ODExNTgxMTU4MTIyRTU4MTI0MDVGNTgxRTRBODFFCis6MTAxQ0QwMDA4MTE4RjZBODgxMTgxODE4MThFREY2MDhFQ0Y2OTBGQjk0Cis6MTAxQ0UwMDBGNUUwMjRGODUwMDMwMjFERTZFNEE4ODExODE4RjZBOEQwCis6MTAxQ0YwMDA4MTE4RTZGRUE4ODExODE4MTgxOEU2RkQwOEU2RkM3RjkyCis6MTAxRDAwMDAwMEVGMjRGODQwNERFNEVGMjVFMDI0N0RGNTgyRTQzNDMzCis6MTAxRDEwMDBGQ0Y1ODNFMEZCQTNFMDZDNzAwM0ZBRUI2RDcwMDk3NEQzCis6MTAxRDIwMDAwMUE4ODExODE4RjY4MDJCRTRFRjI1RTAyNDdERjU4MkM4Cis6MTAxRDMwMDBFNDM0RkNGNTgzN0EwMEUwNTRGMENDRjhDQ0NERjlDRDU2Cis6MTAxRDQwMDBGQjc4MDBFOTU0RjBGOUVBNjg3MDAyRUI2OTcwMDEwRTYzCis6MTAxRDUwMDAwRjgwQUVBODgxMThFRUY2QTg4MTE4MTgxODE4RURGNkI1Cis6MTAxRDYwMDAwOEVDRjZBODgxRUZGNkE4ODExODE4RTY3MDc5QTg4MTJBCis6MTAxRDcwMDAxOEU2MjRGNzQwNzFBODgxMTgxODE4MThFNjU0MEZBODFGCis6MTAxRDgwMDA4MUY2NjQwNDYwMTdBODgxRTY2NDAzNjAxMEE4ODExOEQ2Cis6MTAxRDkwMDAxODE4MThFNkZEMDhFNkZDMTIxQzVBODA0QTdDMEExMjQ0Cis6MTAxREEwMDAzMUFEQTg4MTE4MTgxODE4RTZGRDA4RTZGQzkwRkJGNDgwCis6MTAxREIwMDBFMDI1RTAyNDdERjU4MkU0MzRGQ0Y1ODNFREYwQTNFQzJFCis6MTAxREMwMDBGMDkwRkJGNEUwRkZFNEVGMDQ1NDA3RkY5MEZCRjRGMDI1Cis6MTAxREQwMDA5MEZCRjVFMDA0RjAxMjMyNDY5MEZCRjZFMDcwMDhFNDY4Cis6MTAxREUwMDBGRUZGN0MwRjEyMzI0RDgwMjc5MEZCRjdFMDA0RjA1NDg5Cis6MTAxREYwMDAzRjcwMUQ5MEZCRjdFMDQ0RkU3RDAwRkM5MEZCRjRFMDlCCis6MTAxRTAwMDAyNUUwMjQ3REY1ODJFNDM0RkNGNTgzRURGMEEzRUNGMENECis6MTAxRTEwMDBFNTgxMjRGQkY1ODEyMjc4OEI3NjAwNzg4Qzc2MDA3NDNFCis6MTAxRTIwMDAwMTkwRkJGNkYwMTIzMTM4OTBGQkY1RTA2MDU3N0MwQTI4Cis6MTAxRTMwMDAxMjMxQUQ5MEZCRjNFMDI1RTAyNDdERjU4MkU0MzRGQzIzCis6MTAxRTQwMDBGNTgzRTBGREEzRTBGQzkwRkJGM0UwMjVFMDI0N0RGNUM1Cis6MTAxRTUwMDA4MkU0MzRGQ0Y1ODNFNEYwQTNGMDkwRkJGM0UwRkZFNENDCis6MTAxRTYwMDBFRjA0NTQwN0ZGOTBGQkYzRjA5MEZCRjVFMDE0RjA3OERCCis6MTAxRTcwMDA4OUVERjYwOEVDRjYxMjMyNDY3ODg5RTZGRDA4RTZGQ0I0Cis6MTAxRTgwMDAxMjA4RTM4MEEzMTIzMjlBOTBGRjkzRTA0NDAxRjBCMjZCCis6MTAxRTkwMDBCMzc4OEIwNkI2MDAxMTc4OEI3NjAwNzg4Q0U2RjQwNDY0Cis6MTAxRUEwMDAwNEEyRTA5MkI0Nzg4Q0Y2MDIxRTI1RTQ5MEZCRjZGMEQyCis6MTAxRUIwMDA5MEZCRjVFMDdEMDBGQ0VENDRDRkZEMTIxQzVBMTIzMTgxCis6MTAxRUMwMDBCQjIyMTIzMTM4RTU3MDY0NDk0NTZGNjAxNTkwRkY4MzdECis6MTAxRUQwMDBFMDU0MEY3RDAwRDM5NTcwRUQ5NTZGNTAwNTEyMkY4MTYyCis6MTAxRUUwMDA4MDAzMTIzMDUxMTIzMUJCMjIxMjMxMzhFNTcwNjQ0OTNGCis6MTAxRUYwMDA0NTZGNjAwNTEyMzA4QjgwMEU5MEZGODBFMDQ0MDhGMDQzCis6MTAxRjAwMDA5MEZGODNFMDU0N0ZGMDEyMzFCQjIyMTIzMTM4OEM1NEExCis6MTAxRjEwMDBFQzU0RjBCNDEwMTU3NTZBMzU3NTY5RkM3NTY4MDFFNTA3Cis6MTAxRjIwMDA2QTI0MDNGNTZBRTU2OTM0MDBGNTY5RTRGNTU3RjU1NjY2Cis6MTAxRjMwMDBFNTU2QzM5NDAxNTAyN0U1NTQ1NDBGRkNBRDZBQUU2OUQxCis6MTAxRjQwMDBBRjY4MTIwRTgwOEM1NUVDNjAwMjgwMTIwNTZBRTU2QTVCCis6MTAxRjUwMDA3MDAyMDU2OTA1NTdFNTU3NzAwMjA1NTY4MEQyRTU1NEIxCis6MTAxRjYwMDA1NDBGMjQ5REY4RTY1NEZFRjZFNTU0NTQwRjdGMDBGRTBFCis6MTAxRjcwMDA3QzEyMTIzMjRERTU1NTE0NzAwOTdEMDA3QzA5MTIyNTQyCis6MTAxRjgwMDA0NjgwMDdBRDU3N0MwMDEyMjU0NjEyMzFCQjIyMTIzMTI0Cis6MTAxRjkwMDAzODkwRkZGQ0UwNDQwMkYwOTBGRjAwRTAzMEU3MTM5MDNGCis6MTAxRkEwMDBGRjgzRTA0NDgwRjA0MzZEODA5MEZGRkNFMDQ0MDFGMDRCCis6MTAxRkIwMDA4MDExOTBGRjgyRTA0NDA4RjA1MzZEN0Y5MEZGRkNFMEI5Cis6MTAxRkMwMDA1NEZFRjA5MEZGODFFMDQ0ODBGMDEyMjVGOTkwRkZGRTZFCis6MTAxRkQwMDBFMDQ0MDVGMDkwRkZGQ0UwNTRGREYwMTIzMUJCMjIxMjBBCis6MTAxRkUwMDAzMTM4N0MwMTEyMzJGQjc4QURFNjQ0MDJGNjc0RkVGQzE3Cis6MTAxRkYwMDAwNEZEMTIxQ0M1OTBGRjVBRTAzMEU3MDI4MEY3RTRGNUJCCis6MTAyMDAwMDA0RTc1NEQxMEFDNEVBRDRERTU0RTE1NEU3MDAyMTU0RDUyCis6MTAyMDEwMDBFQzRENjAwMjgwRUU0Mzg3MDExMjMxQkIyMjEyMzEzODUxCis6MTAyMDIwMDA3QzAyMTIzMUM3NzhBREU2NTRGREY2MTIzMUJCMjIxMkE0Cis6MTAyMDMwMDAzMTM4NzhBREU2MzBFMDJDNzhBREU2MzBFMTI2NzhBRDg5Cis6MTAyMDQwMDBFNkZDRjU4MzE4RTY0NEYwRkQxMjFDNUE5MEZGRkNFMDE0Cis6MTAyMDUwMDA0NDIwRjA3QzAyMTIzMkZCNzhBREU2NTRGREY2NzQxQThGCis6MTAyMDYwMDA5MEZGRkVGMDc4QURFNkZDRjU4MzE4RTY0NEYxRkQxMjMyCis6MTAyMDcwMDAxQzVBMTIzMUJCMjI3NTZEMDA5MEZGRkZFMDYwMDM0M0Q0Cis6MTAyMDgwMDA2RDAxNzU2RTAwRTRGNTZDRjU2QkU0RjU2Rjc1NzA0OUU0Cis6MTAyMDkwMDA3NDg0OTBGRjgyRjA3NDg0OTBGRjgwRjA3NDgwOTBGRkNECis6MTAyMEEwMDA1OEYwNzQ4MDkwRkY1QUYwQUQ0NkFGNDU3RTAwRUUyNEE0Cis6MTAyMEIwMDBGRTUwMDMwMjIxNDJFNEVFNzVGMDA3QTQyNDdGRjU4MjZFCis6MTAyMEMwMDBFNDM0RjhGNTgzRTBGRkU0RUY1NDgwRkRFNEVGNTQwRkNGCis6MTAyMEQwMDAxNEZGRUQ2MDM4RTRFRjc1RjAwOEE0MjQ0OEY1ODJFNEJECis6MTAyMEUwMDAzNEZGRjU4Mzc0OTBGMEU0RUY3NUYwMDhBNDI0NEFGNTBBCis6MTAyMEYwMDA4MkU0MzRGRkY1ODM3NDgwRjBFNEVGNzVGMDA4QTQyNEUzCis6MTAyMTAwMDA0RUY1ODJFNDM0RkZGNTgzNzQ4MEYwODAzNEU0RUY3NTlCCis6MTAyMTEwMDBGMDA4QTQyNDA4RjU4MkU0MzRGRkY1ODM3NDkwRjBFNDE5Cis6MTAyMTIwMDBFRjc1RjAwOEE0MjQwQUY1ODJFNDM0RkZGNTgzRTRGMEE3Cis6MTAyMTMwMDBFNEVGNzVGMDA4QTQyNDBFRjU4MkU0MzRGRkY1ODNFNDlGCis6MTAyMTQwMDBGMDBFMDIyMEFCOEQ0NjhFNDQ4RjQ1NzQ3RjkwRkZGRENDCis6MTAyMTUwMDBGMDc0OTA5MEZGRkNGMDIyOEM1OEVDMjRGNjUwMDZFNUM5Cis6MTAyMTYwMDA1ODI0MzdGQzIyRTU1ODI0MzBGQzIyRDJCMDEyMjU0M0YzCis6MTAyMTcwMDBFQzcwMDMwMjIyN0U3NTVDMDNBRTVCN0YwMEU1NUMxNUFDCis6MTAyMTgwMDA1QzY0ODAyNDdGNTAzNUVGMjQwMEY1ODJFNDM0RkJGNTU1Cis6MTAyMTkwMDA4M0UwRkUyNEZFNTAxRUVGN0QwMEZDRTRGQjc0NzRDMzVDCis6MTAyMUEwMDA5Q0ZBRUI5REZCRUU3RDAwRkNFQUMzOUNFRDY0ODBDQkNBCis6MTAyMUIwMDA2NDgwOUI1MDAyODAwNUVGMkVGRjgwQzE4RTVCOEY1QTlBCis6MTAyMUMwMDBFNTVDNjQ4MDI0N0Y1MDAzMDIyMjdFRTU1QTI0OEU1MDExCis6MTAyMUQwMDAwMzAyMjI3RTg1NUE1RDc1NUIwMEFFNUFBRjVCOTAzNTc3Cis6MTAyMUUwMDBFRUU0OTNGNTVDRTU1QzE1NUM2NDgwMjQ3RjUwMThFRUFBCis6MTAyMUYwMDAyNDAwRjU4MkU0MzRGQkY1ODNFMEZDRUY5MDM1RUU5M0E4Cis6MTAyMjAwMDA2QzcwMDQwRTBGODBERThFNUE4RjVCRTU1QzY0ODAyNDU4Cis6MTAyMjEwMDA3RjQwNkU3NTVFMDE3NTYwRTg3NTVGRkZFNTVEMjQwMkM1Cis6MTAyMjIwMDBGNTVBNzU1QzA3RTU1QzMzNDA1N0FENjBBRTVGQUY1RTU1Cis6MTAyMjMwMDBFNTVDRjU4MjMzOTVFMEY1ODMxMjAxRjVDNDU0MEZGQzlCCis6MTAyMjQwMDAxMjIxNTVFNTVBMjQwMEY1ODJFNDM0RkJGNTgzRUNGMEM1Cis6MTAyMjUwMDAwNTVBMDU1QUFENjBBRTVGQUY1RUU1NUNGNTgyMzM5NTE5Cis6MTAyMjYwMDBFMEY1ODMxMjAxRjU1NDBGRkMxMjIxNTVFNTVBMjQwMEM0Cis6MTAyMjcwMDBGNTgyRTQzNEZCRjU4M0VDRjAwNTVBMDU1QTE1NUM4MEQxCis6MTAyMjgwMDBBNDc0MDI5MEY4NTFGMDkwRjg2Qjc5Qzc3QTM1N0IyN0U3Cis6MTAyMjkwMDA3ODAxMTIwM0ZFNzU2QTM1NzU2OUZDNzU2ODAxRTQ5MDcyCis6MTAyMkEwMDBGRjgzRjA3NDgwOTBGRjgxRjA3NTU5MDJFNTU5NzVGMDU1Cis6MTAyMkIwMDAwN0E0MjQ3RkY1ODJFNDM0RjhGNTgzRTA3ODhGRjZGQ0Y4Cis6MTAyMkMwMDA1NDBGMTRGQzc4OEZFQ0Y2RTU1OTc1RjAwN0E0MjQ4MUJGCis6MTAyMkQwMDBGNTgyRTQzNEY4RjU4M0UwNzg5Mjc2RkQwODc2RThGQzQwCis6MTAyMkUwMDA3ODhGRTY3NUYwMDhBNDI0NDhGNTgyRTQzNEZGRjU4MzdFCis6MTAyMkYwMDBFNEYwNzg4RkU2NzVGMDA4QTQyNDRGRjU4MkU0MzRGRjBCCis6MTAyMzAwMDBGNTgzRUNGMDc4OTJFNkZGMDhFNjdFMDNDRkMzMTNDRkE3Cis6MTAyMzEwMDAxM0RFRjlGRTc4OEZFNjc1RjAwOEE0MjQ0OUY1ODJFNDBGCis6MTAyMzIwMDAzNEZGRjU4M0VFRjA3ODhGRTY3NUYwMDhBNDI0NEFGNUMzCis6MTAyMzMwMDA4MkU0MzRGRkY1ODM3NDgwRjA3ODkwRUNGNjdEMDA3OEM5Cis6MTAyMzQwMDA5M0U2MkNGNjE4RTYzREY2Nzg5MkU2RkQwOEU2N0MwMzY3Cis6MTAyMzUwMDBDREMzMTNDRDEzRENGOUZDNzg4RkU2NzVGMDA4QTQyNDA3Cis6MTAyMzYwMDA0REY1ODJFNDM0RkZGNTgzRUNGMDc4OEZFNjc1RjAwOEU0Cis6MTAyMzcwMDBBNDI0NEVGNTgyRTQzNEZGRjU4M0U0RjA3ODkyRTZGRDgwCis6MTAyMzgwMDAwOEU2RkM3ODhGRTZGRjdFMDBFRTI0RkU1MDAzMDIyNDcwCis6MTAyMzkwMDBGREU0RUU3NUYwMDdBNDI0N0ZGNTgyRTQzNEY4RjU4M0JDCis6MTAyM0EwMDBFMEZGRTRFRjU0ODBGQUU0RUY1NDBGMTRGRkU0RUU3NTFECis6MTAyM0IwMDBGMDA3QTQyNDgxRjU4MkU0MzRGOEY1ODNFMDc4OTBGNjAwCis6MTAyM0MwMDBFNEVFMTMxMzU0ODAyNEYwRjhFNDM0RkRGOUU4RkNFOTVBCis6MTAyM0QwMDBGRDhBNUFFQTcwMDMwMjI0NkFFNEVGNzVGMDA4QTQyNDI3Cis6MTAyM0UwMDA0OEY1ODJFNDM0RkZGNTgzRTRGMDc4OTBFNkZBRTRFRjEwCis6MTAyM0YwMDA3NUYwMDhBNDI0NEZGNTgyRTQzNEZGRjU4M0VBRjBFRDhDCis6MTAyNDAwMDBGQkVDN0EwM0NCQzMxM0NCMTNEQUY5RkFFNEVGNzVGMEU0Cis6MTAyNDEwMDAwOEE0MjQ0OUY1ODJFNDM0RkZGNTgzRUFGMDc4OTBFNkQ1Cis6MTAyNDIwMDA3QjAwRkFFQzJBRkNFRDNCRkRGQkVDN0EwM0NCQzMxM0ZCCis6MTAyNDMwMDBDQjEzREFGOUZBRTRFRjc1RjAwOEE0MjQ0REY1ODJFNDQxCis6MTAyNDQwMDAzNEZGRjU4M0VBRjBFNEVGNzVGMDA4QTQyNDRBRjU4MjNFCis6MTAyNDUwMDBFNDM0RkZGNTgzNzQ4MEYwRTRFRjc1RjAwOEE0MjQ0RUIzCis6MTAyNDYwMDBGNTgyRTQzNEZGRjU4Mzc0ODBGMDAyMjRGOUU0RUY3NTFCCis6MTAyNDcwMDBGMDA4QTQyNDA4RjU4MkU0MzRGRkY1ODNFNEYwNzg5MEIyCis6MTAyNDgwMDBFNkZBRTRFRjc1RjAwOEE0MjQwRkY1ODJFNDM0RkZGNUQyCis6MTAyNDkwMDA4M0VBRjBFREZCRUM3QTAzQ0JDMzEzQ0IxM0RBRjlGQTQyCis6MTAyNEEwMDBFNEVGNzVGMDA4QTQyNDA5RjU4MkU0MzRGRkY1ODNFQTJCCis6MTAyNEIwMDBGMDc4OTBFNjdCMDBGQUVDMkFGQ0VEM0JGREZCRUM3QTMxCis6MTAyNEMwMDAwM0NCQzMxM0NCMTNEQUY5RkFFNEVGNzVGMDA4QTQyNEI1Cis6MTAyNEQwMDAwREY1ODJFNDM0RkZGNTgzRUFGMEU0RUY3NUYwMDhBNDJCCis6MTAyNEUwMDAyNDBBRjU4MkU0MzRGRkY1ODNFNEYwRTRFRjc1RjAwOEE0Cis6MTAyNEYwMDBBNDI0MEVGNTgyRTQzNEZGRjU4M0U0RjAwRTAyMjM4NjczCis6MTAyNTAwMDA4RTU5Nzg5MkVERjYwOEVDRjY3ODhGRUZGNjEyMjA3MzdDCis6MTAyNTEwMDAyMjhDMjZFQzMwRTcxOEU1MjY1NDBGMTQ3NUYwMDhBNDM5Cis6MTAyNTIwMDAyNDQ4RjU4MkU0MzRGRkY1ODNFMDU0REZGMDgwMTZFNUJCCis6MTAyNTMwMDAyNjU0MEYxNDc1RjAwOEE0MjQwOEY1ODJFNDM0RkZGNTNFCis6MTAyNTQwMDA4M0UwNTRERkYwMjI3QzAwMjJFQzkwRkMzN0YwOEMyNEY2Cis6MTAyNTUwMDBFRDI0MDNGNTI1N0QwMEQzOTU3MkVEOTU3MTQwMDM4NTNCCis6MTAyNTYwMDA3MjI1RTUyNTI0Qjc1MDA5NzUyNTAzNzQwMjkwRkMzN0MwCis6MTAyNTcwMDBGMEFDMjUxMjMwNzYyMkU0RjU2Q0Y1NkIxMjI1N0QyMjQ1Cis6MTAyNTgwMDA5MEZDMzVFMDY1NzM2MDBFNzQwNDkwRkMzN0YwRTRGNTYwCis6MTAyNTkwMDA2Qjc1NkMwMzgwNDY3RDczRTRGRUZGNzkzNTdBRkM3QkI2Cis6MTAyNUEwMDAwMTc0MDU3ODAwMTIwMzQ4RTU2QzI0MDNGNTZDRTU2QkIzCis6MTAyNUIwMDAzNDAwRjU2QkU1NkNEMzk1NzJFNTZCOTU3MTQwMDY4NTNCCis6MTAyNUMwMDA3MjZDODU3MTZCRDNFNTZDOTQ0OEU1NkI5NDAwNDAwQzlDCis6MTAyNUQwMDA3NDAyOTBGQzM3RjBFNEY1NkI3NTZDMDNBQzZDMTIzMDUwCis6MTAyNUUwMDA3NjIyRUM5MEZDMzdGMEU0RjU2Q0Y1NkI4QzMyRUM2MDA1Cis6MTAyNUYwMDAwNTEyMzA2NzgwMDU3QzAwMTIzMDc2MjI5MEZGOTNFMDUwCis6MTAyNjAwMDA0NDAxRjBCMkIzOTBGRjA0RTBGNTRBOTBGRjA2RTBGRDBDCis6MTAyNjEwMDBBM0UwRUQ3RDAwRkM3RDAwRkM5MEZGMDZFMEZGQTNFMDYxCis6MTAyNjIwMDA3RTAwRkZFNEZFRUM0RUZDRUQ0RkZEQzNFQzk0NDhFRDY0Cis6MTAyNjMwMDA5NDAwNTAyMjkwRkYwNkUwRkRBM0UwRUQ3RDAwRkM3REJDCis6MTAyNjQwMDAwMEZDOTBGRjA2RTBGRkEzRTA3RTAwRkZFNEZFRUM0RUZFCis6MTAyNjUwMDBGQ0VENEZGRDgwMDRFNEZEN0M0ODhDNzI4RDcxOTBGRjkxCis6MTAyNjYwMDAwMkUwRkRBM0UwRUQ3RDAwRkM3RDAwRkM5MEZGMDJFMEI4Cis6MTAyNjcwMDBGRkEzRTA3RTAwRkZFNEZFRUM0RUY1NENFRDRGRjU0QjgyCis6MTAyNjgwMDA3NTZBMzU3NTY5RkM3NTY4MDE3RDM1N0VGQzdGMDE3OTU5Cis6MTAyNjkwMDA3M0U0RkFGQjc0MDU3ODAwMTIwMzQ4NzU0OTAwRTU0OUI0Cis6MTAyNkEwMDAyNEZFNDAxOUFENkFBRTY5QUY2OEU0MTIwMzE4MDU0OTBCCis6MTAyNkIwMDAwREVENzAwMTBFOEQ2QThFNjk4RjY4ODBFMTc1NkEzNTQ3Cis6MTAyNkMwMDA3NTY5RkM3NTY4MDE5MEZGMDBFMDU0NjBCNDAwMDI4MEY5Cis6MTAyNkQwMDAwNkQzNTAwMzAyMkNCRkU1NEE1NDBGRjU0OUU1NEE1NDhFCis6MTAyNkUwMDA4MEEyRTA5MjAyOTBGRjAxRTAxMjAxOEEwMDBCMkNCQTU2Cis6MTAyNkYwMDAyNzA1MjgyMzJDQkEyOTJGMkNCQTJBMTIyQTQ2MkJBREJCCis6MTAyNzAwMDAyQkIwMkJGMDJDNjMyQzkxRTU2RDMwRTcwRUU1NEM0NTlBCis6MTAyNzEwMDA0QjcwMDhFNTcyNjQwMjQ1NzE2MDAzMDIyQ0JDOTBGRkE3Cis6MTAyNzIwMDAwMEUwNTQxRkI0MDAwMjgwMDNEMzQwMjlFNTRBNjAwMzRGCis6MTAyNzMwMDAwMjI4MjBBRDZBQUU2OUFGNjg3NDAxMTIwMzE4NzhBRDQzCis6MTAyNzQwMDBFNjMwRTAwQkFENkFBRTY5QUY2ODc0MDIxMjAzMTg3QzI0Cis6MTAyNzUwMDAwMjEyMzA3NjIyQjQwMTAyODAwM0QzNDAxQkU1NkQyMEMzCis6MTAyNzYwMDBFMTA3RTU0QTYwMDMwMjI4MjBFNTRBMjRGRTUwMDMwMkZGCis6MTAyNzcwMDAyODIwN0MwMjEyMzA3NjIyQjQwMjAyODAwNkQzNTAwMzU1Cis6MTAyNzgwMDAwMjI4MUVFNTZEMjBFMTBERTU0QTYwMDlFNTRBNjQ4MEY2Cis6MTAyNzkwMDA2MDAzMDIyODIwQUM0QTEyMzBGRDQwMDMwMjI4MjBFNUU1Cis6MTAyN0EwMDA0OTcwMjUzMDAyMTE5MEZGODBFMDU0MDhBRDZBQUU2OThGCis6MTAyN0IwMDBBRjY4MTIwMzE4ODAwRjkwRkY4MkUwNTQwOEFENkFBRTM0Cis6MTAyN0MwMDA2OUFGNjgxMjAzMTg4MDNEMTU0OTMwMDIxREU1NDk3NTRGCis6MTAyN0QwMDBGMDA4QTQyNDQ4RjU4MkU0MzRGRkY1ODNFMDU0MDhBRDAyCis6MTAyN0UwMDA2QUFFNjlBRjY4MTIwMzE4ODAxQkU1NDk3NUYwMDhBNDRBCis6MTAyN0YwMDAyNDA4RjU4MkU0MzRGRkY1ODNFMDU0MDhBRDZBQUU2OTNECis6MTAyODAwMDBBRjY4MTIwMzE4QUQ2QUFFNjlBRjY4MTIwMUVGNjAwQkQyCis6MTAyODEwMDBBRDZBQUU2OUFGNjg3NDAxMTIwMzE4N0MwMjEyMzA3NjlCCis6MTAyODIwMDAyMjgwMDAwMjJDQkNFNTZEMjBFNzA2RTU3MjQ1NzE2MDUwCis6MTAyODMwMDAwMzAyMkNCQzkwRkYwMEUwNTQxRkI0MDAwMjgwMDNEM0JECis6MTAyODQwMDA0MDFBRTU0QzE0NDU0QjcwMDRFNTRBNjAwMzAyMjkyQ0ZDCis6MTAyODUwMDA3OEFERTY1NEZFRjY3QzAwMTIzMDc2MjJCNDAxMDI4MDk4Cis6MTAyODYwMDAwM0QzNDAyQUU1NkQyMEUxMDhFNTZEMjBFMDAzMDIyOTRECis6MTAyODcwMDAyQ0U1NkQzMEUwMDRFNTRBNzAwQkU1NkQzMEUxMDlFNUNCCis6MTAyODgwMDA0QTI0RkU1MDAzMDIyOTJDN0MwMDEyMzA3NjIyQjQwMjI2Cis6MTAyODkwMDAwMjgwMDZEMzUwMDMwMjI5MkFFNTRDNDU0QjYwMDMwMjBGCis6MTAyOEEwMDAyOTJDQUM0QTEyMzBGRDQwMDMwMjI5MkNFNTZEMjBFMUIxCis6MTAyOEIwMDAwN0U1NkQyMEUwMDI4MDc3RTU2RDMwRTAwNkU1NDk2MEQwCis6MTAyOEMwMDAwMjgwNkNFNTQ5NzAwRjkwRkY4MkUwNTRGN0YwOTBGRkIyCis6MTAyOEQwMDA4MEUwNTRGN0YwMjJFNTQ5QjQwMTAyODAwM0QzNDAwOUI3Cis6MTAyOEUwMDA3RDAxN0MwMzEyMEYxMjgwMTFCNDAyMDI4MDAzRDM0MEQ5Cis6MTAyOEYwMDAwOTdEMDE3QzA0MTIwRjEyODAwMDE1NDkzMDAyMTVFNTk0Cis6MTAyOTAwMDA0OTc1RjAwOEE0MjQ0OEY1ODJFNDM0RkZGNTgzRTA1NEM3Cis6MTAyOTEwMDBGN0YwODAxM0U1NDk3NUYwMDhBNDI0MDhGNTgyRTQzNDQzCis6MTAyOTIwMDBGRkY1ODNFMDU0RjdGMDdDMDAxMjMwNzYyMjgwMDAwMjNECis6MTAyOTMwMDAyQ0JDRTU2RDIwRTcwNkU1NzI0NTcxNjAwMzAyMkNCQ0Y2Cis6MTAyOTQwMDA5MEZGMDBFMDU0MUZCNDAwMDI4MDAzRDM0MDFBRTU0QzBFCis6MTAyOTUwMDAxNDQ1NEI3MDA0RTU0QTYwMDMwMjJBMEY3OEFERTY0NDQzCis6MTAyOTYwMDAwMUY2N0MwMDEyMzA3NjIyQjQwMTAyODAwM0QzNDAyOUE0Cis6MTAyOTcwMDBFNTZEMjBFMTA4RTU2RDIwRTAwMzAyMkEwRkU1NkQzMEVBCis6MTAyOTgwMDBFMDA0RTU0OTcwMEJFNTZEMzBFMTA4RTU0OTI0RkU1MEFGCis6MTAyOTkwMDAwMjgwN0Y3QzAwMTIzMDc2MjJCNDAyMDI4MDAzRDM0MDkyCis6MTAyOUEwMDA2RkU1NEM0NTRCNjAwMjgwNjlBQzRBMTIzMEZENDAwMjM1Cis6MTAyOUIwMDA4MDYwRTU2RDIwRTEwN0U1NkQyMEUwMDI4MDU0RTU0OTg3Cis6MTAyOUMwMDA3MDE0MzAwMjA5OTBGRjgwRTA0NDA4RjA4MDA3OTBGRjA3Cis6MTAyOUQwMDA4MkUwNDQwOEYwMjJFNTZEMzBFMTMzMTU0OTMwMDIxNUZDCis6MTAyOUUwMDBFNTQ5NzVGMDA4QTQyNDQ4RjU4MkU0MzRGRkY1ODNFMDU2Cis6MTAyOUYwMDA0NDA4RjA4MDEzRTU0OTc1RjAwOEE0MjQwOEY1ODJFNDQyCis6MTAyQTAwMDAzNEZGRjU4M0UwNDQwOEYwN0MwMDEyMzA3NjIyODAwMjI3Cis6MTAyQTEwMDA4MDAwMDIyQ0JDRTU2RDIwRTcxMkU1NzI0NTcxNzAwQzU4Cis6MTAyQTIwMDBFNTRBNzAwODkwRkYwMEUwNTQxRjYwMDMwMjJDQkNFNUVCCis6MTAyQTMwMDA0QzkwRkZGRkYwOTBGRkZGRTA2MDA1NDM2RDAxODAwM0M1Cis6MTAyQTQwMDA1MzZERkU3QzAwMTIzMDc2MjJFNTZEMzBFNzBFRTU3MkE0Cis6MTAyQTUwMDA0NTcxNjAwODkwRkYwMEUwNTQxRjYwMDMwMjJDQkNBRDdDCis6MTAyQTYwMDA0QkU1NENFRDdEMDBGQzdEMDBGQ0JEMDAwMjgwMDMwMkM3Cis6MTAyQTcwMDAyQkE4QjQwMTAyODAwM0QzNDAzMkU1NEE3MDA1RTU0QzJGCis6MTAyQTgwMDBGQzYwMDMwMjJCQUE3NTZBNDA3NTY5Rjg3NTY4MDFEMzZBCis6MTAyQTkwMDBFNTcyOTQxMkU1NzE5NDAwNDAwNkU0RkQ3QzEyODAwNDE2Cis6MTAyQUEwMDBBQzcyQUQ3MThDNzA4RDZGMTIzMDhCMjJCNDAyMDI4MENCCis6MTAyQUIwMDAwM0QzNDA1OUU1NEE2MDAzMDIyQkFBRTU0Q0ZDNzAyNzdBCis6MTAyQUMwMDA3NTZBNTI3NTY5Rjg3NTY4MDFEM0U1NzI5NDE5RTU3MUY0Cis6MTAyQUQwMDA5NDAwNDAwNkU0RkQ3QzE5ODAwNEFDNzJBRDcxOEM3MEVBCis6MTAyQUUwMDA4RDZGMTIzMDhCODAyNTc1NkE2Qjc1NjlGODc1NjgwMTdBCis6MTAyQUYwMDBEM0U1NzI5NDI3RTU3MTk0MDA0MDA2RTRGRDdDMjc4MEJECis6MTAyQjAwMDAwNEFDNzJBRDcxOEM3MDhENkYxMjMwOEIyMkI0MDMwMkU1Cis6MTAyQjEwMDA4MDA2RDM1MDAzMDIyQkE4RTU0Q0Y1NDk3MDBGOTBGRkI3Cis6MTAyQjIwMDAwNEUwRkRBM0UwNEQ2MDAzMDIyQkFBODAxODkwRkIwMjk1Cis6MTAyQjMwMDBFMEZEQTNFMEZDOTBGRjA1RTA2QzcwMDc5MEZGMDRFMDZGCis6MTAyQjQwMDA2RDYwMDI4MDY4RTRGNTcwRjU2RjdGMDBFNTQ5MTRDNTlCCis6MTAyQjUwMDA0OTYwMEZFRjI0MDBGNTgyRTQzNEZCRjU4M0UwMkZGRjlBCis6MTAyQjYwMDA4MEVBOEY0QUU1NEEyNDAwRjU4MkU0MzRGQkY1ODNFMEVECis6MTAyQjcwMDA3RDAwRDM5NTcyRUQ5NTcxNDAwNkFDNzJBRDcxODAwRkZBCis6MTAyQjgwMDBFNTRBMjQwMEY1ODJFNDM0RkJGNTgzRTA3RDAwRkM4QzBCCis6MTAyQjkwMDA3MDhENkZFNTRBMjQwMEZDRTQzNEZCRkRGRUVDRkQ3RjA0Cis6MTAyQkEwMDAwMThENkE4RTY5OEY2ODEyMzA4QjIyODAwMDAyMkNCQ0U2Cis6MTAyQkIwMDAwMjJDQkNFNTZEMzBFNzE5RTU3MjE0NDU3MTcwMTJFNTIxCis6MTAyQkMwMDA0QTcwMEVFNTRDNDU0QjcwMDg5MEZGMDBFMDU0MUY2MEMyCis6MTAyQkQwMDAwMzAyMkNCQ0U1NkQyMEUwMDhFNTZEMjBFMTAzMDIyQzJBCis6MTAyQkUwMDBCQzc1NkE2RUU0RjU2OUY1NjhFNEY1NkYwNEY1NzAxMjdBCis6MTAyQkYwMDAzMDhCMjJFNTZEMjBFNzI3RTU3MjQ1NzE3MDIxRTU0QUFCCis6MTAyQzAwMDA3MDFERTU0QzY0MDI0NTRCNjAwREU1NEMxNDQ1NEI2MDZFCis6MTAyQzEwMDAwNkU1NEM0NTRCNzAwODkwRkYwMEUwNTQxRjYwMDMwMjJFCis6MTAyQzIwMDAyQ0JDRTU2RDIwRTAwOEU1NkQyMEUxMDMwMjJDQkM4NTlECis6MTAyQzMwMDA0QzZFRTU2RTcwMEE0MzZEMDE1MzZERkREMkIwODAyMDdECis6MTAyQzQwMDBFNTZFNjQwMjYwMDdFNTZFMTQ2MDAyODA3MjUzNkRGRUVCCis6MTAyQzUwMDA0MzZEMDJFNTZFNjQwMjYwMDVFNTZFMTQ3MDAyQzJCMDU5Cis6MTAyQzYwMDA3QzAwMTIzMDc2MjJFNTZEMzBFNzFBRTU3MjE0NDU3MTZBCis6MTAyQzcwMDA3MDEzRTU0QTcwMEZFNTRDNDU0QjcwMDk5MEZGMDBFMDdBCis6MTAyQzgwMDA1NDFGMTQ2MDAyODAzOEU1NkQyMEUxMDI4MDMxN0MwMTIwCis6MTAyQzkwMDAxMjMwNzYyMkU1NkQyMEU3MTVFNTcyNDU3MTcwMEZFNTdCCis6MTAyQ0EwMDA0QzQ1NEI3MDA5OTBGRjAwRTA1NDFGMTQ2MDAyODAwRkU4Cis6MTAyQ0IwMDBFNTZEMjBFMTAyODAwODdDMDAxMjMwNzYyMjgwMDAwMjVGCis6MTAyQ0MwMDAyRjdEQjQ0MDAyODAwNkQzNTAwMzAyMkY3MzkwRkYwMTgyCis6MTAyQ0QwMDBFMDkwRkMzNUYwRTU0QTkwRkMzNkYwRTQ5MEZDMzdGMEVCCis6MTAyQ0UwMDBFNTZBMjQwM0Y1NkFFNTY5MzQwMEY1NjlBRDRCRTU0QzA2Cis6MTAyQ0YwMDA4NTZBODI4NTY5ODNDREYwQTNDREYwOTBGRjAxRTAxMjUzCis6MTAyRDAwMDAwMUMwMkQyQTAxMkQ1MDAyMkQ3QTAzMkRBNDA0MkRGMjhECis6MTAyRDEwMDAwNTJFMkYwNjJFNTUwNzJFN0IwODJFQTcwOTJFQ0QwQjJDCis6MTAyRDIwMDAyRUYzMEMyRjAyODAyRjAyODEwMDAwMkY2MEU1NkQyMDEyCis6MTAyRDMwMDBFNzA2N0MwNTEyMjVERjIyN0Q3NjdFMzU3RjAyNzkzODE1Cis6MTAyRDQwMDA3QUZDN0IwMTc0MDg3ODAwMTIwMzQ4N0QwODdDMDAxMjJECis6MTAyRDUwMDAyNTQ2MjJFNTZEMjBFNzA2N0MwNTEyMjVERjIyRTU0QTlGCis6MTAyRDYwMDBCNDAzMDA0MDEwQjQwNTAwNTAwQkU1NEE3RjAwRkU3QzIwCis6MTAyRDcwMDAxMDEyMzI0RDIyN0QwMDdDMDcxMjI1NDYyMkU1NkQyMDdGCis6MTAyRDgwMDBFNzA2N0MwNTEyMjVERjIyRTU0QUI0MDMwMDQwMTBCNEIzCis6MTAyRDkwMDAwNTAwNTAwQkU1NEE3RjAwRkU3QzExMTIzMjREMjI3RDZBCis6MTAyREEwMDAwMDdDMDcxMjI1NDYyMkU1NkQyMEU3MDY3QzA1MTIyNUVBCis6MTAyREIwMDBERjIyRTU0QUI0MDUwMjgwMDNEMzQwMEFFNEZGMDRGRUEzCis6MTAyREMwMDA3QzBBMTIzMjREMjJCNDAxMDI4MDAzRDM0MDBBRTRGRjkwCis6MTAyREQwMDAwNEZFN0MwODEyMzI0RDIyQjQwMzAwNDAxMEI0MDUwMEZBCis6MTAyREUwMDA1MDBCRTU0QTdGMDBGRTdDMTMxMjMyNEQyMjdEMDA3Q0ExCis6MTAyREYwMDAwNzEyMjU0NjIyRTU2RDIwRTczNEQzRTU3Mjk0NDhFNUI1Cis6MTAyRTAwMDA3MTk0MDA1MDA2RTU3MjQ1NzE3MDA2N0MwMjEyMjVERjUwCis6MTAyRTEwMDAyMkU1NEFCNDAxMDNCMzQwMEJDM0I0MDMwMDQwMDlCNDM0Cis6MTAyRTIwMDAwNjAwNTAwNDEyMzEyMzIyN0MwNzEyMjVERjIyMTIyNUNFCis6MTAyRTMwMDA3RDIyRTU2RDIwRTcxREU1NEFCNDAzMDA0MDEwQjQwNThFCis6MTAyRTQwMDAwMDUwMEJFNTRBN0YwMEZFN0MxNjEyMzI0RDIyN0MwN0IzCis6MTAyRTUwMDAxMjI1REYyMjEyMjU3RDIyRTU2RDIwRTcxREU1NEFCNDBCCis6MTAyRTYwMDAwMzAwNDAxMEI0MDUwMDUwMEJFNTRBN0YwMEZFN0MxOUJBCis6MTAyRTcwMDAxMjMyNEQyMjdDMDcxMjI1REYyMjEyMjU3RDIyRTU2REJDCis6MTAyRTgwMDAyMEU3MjM3NDgxOTBGRjkzRjBFNTRBQjQwMzAwNDAxMERCCis6MTAyRTkwMDBCNDA1MDA1MDBCRTU0QTdGMDBGRTdDMTcxMjMyNEQyMjJDCis6MTAyRUEwMDA3QzA3MTIyNURGMjIxMjI1N0QyMkU1NkQyMEU3MURFNTM2Cis6MTAyRUIwMDA0QUI0MDMwMDQwMTBCNDA1MDA1MDBCRTU0QTdGMDBGRTAxCis6MTAyRUMwMDA3QzE4MTIzMjREMjI3QzA3MTIyNURGMjIxMjI1N0QyMjJBCis6MTAyRUQwMDBFNTZEMjBFNzFERTU0QUI0MDMwMDQwMTBCNDA1MDA1MDNECis6MTAyRUUwMDAwQkU1NEE3RjAwRkU3QzE1MTIzMjREMjI3QzA3MTIyNTJECis6MTAyRUYwMDBERjIyMTIyNTdEMjJFNTZEMjBFNzA2N0MwNzEyMjVERjAzCis6MTAyRjAwMDAyMjEyMjU3RDIyRTU2RDMwRTcyMDkwRkYwMEUwNTQxRjVFCis6MTAyRjEwMDA3MDEwOTBGRjAxRTBCNDgwMDUxMjI1NzQ4MDAzMTIyNTIzCis6MTAyRjIwMDA3RDIyN0QwMDdDMDUxMjI1NDYyMjkwRkYwMEUwNTQxRjgzCis6MTAyRjMwMDA2MDA2N0MwNTEyMjVERjIyRDNFNTcyOTQ0OEU1NzE5NDgyCis6MTAyRjQwMDAwMDUwMEJDM0U1NzI5NDA3RTU3MTk0MDA1MDA2N0MwM0IyCis6MTAyRjUwMDAxMjI1REYyMkU1NEFCNDA1MDQxMjMxMjMyMjdDMDcxMjMwCis6MTAyRjYwMDAyNURGMjJFNTZEMzBFNzA4N0QwMDdDMDUxMjI1NDYyMjJECis6MTAyRjcwMDA3QzA1MTIyNURGMjJCNDIwMDI4MDAzRDM0MDAwODAwMEFDCis6MTAyRjgwMDAxMjMwNTEyMjc1NDMwMDkwRkY4M0UwNTQwRkQzOTU0M0Q0Cis6MTAyRjkwMDA0MDI0RTU0MzI0RjBGNTgyRTQzNEZFRjU4M0UwQUQ2QTk1Cis6MTAyRkEwMDBBRTY5QUY2ODEyMDMxODA1NDMwREVENzAwMTBFOEQ2QTBFCis6MTAyRkIwMDA4RTY5OEY2ODgwRDFFNTQzN0QwMEZDQzNFNTcwOUNGNTg4Cis6MTAyRkMwMDA3MEU1NkY5REY1NkZFNTcwNDU2RjYwMDZFNDkwRkY4M0Q3Cis6MTAyRkQwMDBGMDIyOTBGRjgyRTA0NDA4RjBFNEY1NkY3NTcwNDk5MEFDCis6MTAyRkUwMDBGQzM1RTBCNDA1MDI4MDAzRDM0MDQwOTBGQzM2RTBGNUE4Cis6MTAyRkYwMDA0M0I0MDUwMjgwMDNEMzQwMEFFNEZGMDRGRTdDMEIxMkI1Cis6MTAzMDAwMDAzMjREMjJCNDAxMDI4MDAzRDM0MDBBRTRGRjA0RkU3QzY3Cis6MTAzMDEwMDAwOTEyMzI0RDIyQjQwMzAwNDAxMEI0MDUwMDUwMEJFNUY0Cis6MTAzMDIwMDA0MzdGMDBGRTdDMTQxMjMyNEQyMjIyQjQ4MDAwNDAyM0U0Cis6MTAzMDMwMDBCNDgyMDA1MDFFN0MzNTdERkMxMjE3QTU3RDAwOEM2QzdGCis6MTAzMDQwMDA4RDZCOTBGQzM3RTA2MDA1MTIzMDUxODAwNTdDMDAxMkRBCis6MTAzMDUwMDAzMDc2MjIyMjkwRkY4M0UwNTQ3RkYwOTBGRjgyRTA0NDlDCis6MTAzMDYwMDAwOEYwOTBGRjgwRTA0NDA4RjAyMjkwRkY4MkUwNDQwOERFCis6MTAzMDcwMDBGMDkwRkY4MEUwNDQwOEYwMjI4QzIzN0QwMDhDNzA4RDVFCis6MTAzMDgwMDA2Rjc1NkEzNTc1NjlGQzc1NjgwMTEyMzA4QjIyOTBGRjg3Cis6MTAzMDkwMDA4M0UwNTQ3RkYwRTU3MDY0NDk0NTZGNzAwMTIyQzNFNTE5Cis6MTAzMEEwMDA3MDk0MDhFNTZGOTQwMDQwMTU3NTIxMDhFNTIxN0QwMEI2Cis6MTAzMEIwMDBGQ0MzRTU3MDlDRjU3MEU1NkY5REY1NkY4MDA5ODU3MDI4Cis6MTAzMEMwMDAyMUU0RjU2Rjc1NzA0OTc1MjIwMEU1MjJDMzk1MjE1MDAyCis6MTAzMEQwMDAyNkFENkFBRTY5QUY2ODEyMDFFRkZDRTUyMjI0RjhGNTZGCis6MTAzMEUwMDA4MkU0MzRGRUY1ODNFQ0YwMDUyMjBERUQ3MDAxMEU4REM3Cis6MTAzMEYwMDA2QThFNjk4RjY4ODBEM0U1MjE1NDdGOTBGRjgxRjAyMjJBCis6MTAzMTAwMDA4QzQ4N0YwMEVGMjRGRDQwMTlFNEVGNzVGMDA3QTQyNEZDCis6MTAzMTEwMDA3RkY1ODJFNDM0RjhGNTgzRTA2NTQ4NzAwMkQzMjIwRjJFCis6MTAzMTIwMDA4MEUyOEY0N0MzMjI4NTcyNzA4NTcxNkY5MEZGODJFMEM1Cis6MTAzMTMwMDA1NEY3RjA5MEZGODNFMDU0N0ZGMDIyQzAwMEMwMDFDMDNDCis6MTAzMTQwMDAwMkMwMDZDMDA3RTU3ODI0MDhGODg2MDY1MzA2N0Y3QzhGCis6MTAzMTUwMDBGRjEyMzFBRDdDMDA3RDAwRTU3QjYwNDZGRjkwRkQ5NTYwCis6MTAzMTYwMDBFMDU0N0Y2RTcwMEZDMDgzQzA4MkEzRTBGREEzRTBGQzNCCis6MTAzMTcwMDBBMzE1N0I4MDA3QTNBM0EzREZFNjgwMjZERjA2RDA4MjBBCis6MTAzMTgwMDBEMDgzODAxRUUwRjhBM0UwRjlBM0UwRkFEMDgyRDA4M0Q4Cis6MTAzMTkwMDBFOEYwQTNFOUYwQTNFQUYwQTNDMDgzQzA4MkEzQTNBMzRECis6MTAzMUEwMDA4MERBMTIzMjQ2RDAwN0QwMDZEMDAyRDAwMUQwMDAyMkY5Cis6MTAzMUIwMDA4NUE4N0E3NUE4ODhFQzcwMDI3QzNGOEM3OTIyRTU3ODI2Cis6MTAzMUMwMDAyNDA4Rjg3NjAwMTIzMjlBODBGQkMwMDBDMDAxQzAwMkM5Cis6MTAzMUQwMDBDMDA2QzAwN0FFMDQ3Q0ZGMTIzMUFERTU3QjYwNDJGRjQ0Cis6MTAzMUUwMDA5MEZEOTVFMDU0N0Y2RTcwMEJDMDgzQzA4MkEzQTNBM0IzCis6MTAzMUYwMDAxNTdCODAwN0EzQTNBM0RGRUE4MDI2REYwNkQwODJEMDU5Cis6MTAzMjAwMDA4MzgwRDhFMEY4QTNFMEY5QTNFMEZBRDA4MkQwODNFODg1Cis6MTAzMjEwMDBGMEEzRTlGMEEzRUFGMEEzQzA4M0MwODJBM0EzQTM4MDM0Cis6MTAzMjIwMDBEQTc4MDgwODc5MTgwOTdDMDFFNjU0N0Y2RTcwMDY3NjEyCis6MTAzMjMwMDAwMDc3MDA4MDA2MDgwOTBDQkMwOEVFMTIzMjQ2RDAwNzYxCis6MTAzMjQwMDBEMDA2RDAwMkQwMDFEMDAwMjI3NTc5MDA4NTdBQTgyMjVDCis6MTAzMjUwMDBDMEYwQzA4MkMwODNDM0U1N0IyNEU4NTAwNTEyMzI5QUQ3Cis6MTAzMjYwMDA4MEY0RUM2MDMxOTAzNTc1RTQ5M0MzOUM0MDI4QzAwNDMxCis6MTAzMjcwMDA3Q0ZGMTIzMUFERDAwNDQzMDQ4MEU1N0I3NUYwMDNBNERDCis6MTAzMjgwMDAyNDk1RjU4MkU0MzRGREY1ODNFQ0YwRUZBM0YwRUVBMzkyCis6MTAzMjkwMDBGMDA1N0IxMjMyNDZEMDgzRDA4MkQwRjAyMkMwMDQ3QzZECis6MTAzMkEwMDAyMEQyOENEMjhERDUwNEZERDAwNDIyNzVBODAwNzU4ODVCCis6MTAzMkIwMDAwMDc1QjgwMDc1RjAwMDc1RDAwMEU0Rjg5MDAwMDBGNkQ1Cis6MTAzMkMwMDAwOEI4MDBGQjAyMDAwMEMzRUQ5NDAyNTAwNDdEMDM3Q0FCCis6MTAzMkQwMDBFOEVDRjRGQ0VERjRGRDBDQkMwMDAxMEQ4QzdGOEQ3RTYwCis6MTAzMkUwMDAyMkMzRUM5NEJDRUQ5NDAyNTAwNDdEMDc3Q0QwRUNGNDM2Cis6MTAzMkYwMDBGQ0VERjRGRDBDQkMwMDAxMEQ4QzdEOEQ3QzIyRUM3MDhFCis6MTAzMzAwMDAwMTIyQzAwMEU1NzgyNDE4RjhBNjA0RTU3ODI0MDhGODFFCis6MTAzMzEwMDBDNjU0N0ZGNkU2MzBFNzAzRDAwMDIyMTIzMjlBODBGNERBCis6MTAzMzIwMDBDMjhDODU3QzhDODU3RDhBRDI4Q0MwRTBDMEQwQzBGMEY4Cis6MTAzMzMwMDBDMDgyQzA4M0MwMDBDMDAxQzAwMkMwMDNDMDA0QzAwNTc5Cis6MTAzMzQwMDBDMDA2QzAwNzEyMUFGOEU1NzgyNDA4RjhFNjYwMjRFNUZDCis6MTAzMzUwMDA3ODI0MTBGOEE2ODFFNTc4NzVGMDIxQTQyNDhERjU4MkYzCis6MTAzMzYwMDBFNDM0RkNGNTgzNzhBRUU1ODEwNEMzOThGOUU2RjAwODBGCis6MTAzMzcwMDBBM0Q5RkE3NDA4MjU3OEY4MDU3ODA4RTY1NDgwNzAwQzBCCis6MTAzMzgwMDBFNTc4QjQwN0YzNzgwODc1NzgwMDgwRUZFNTc4MjQxMEM1Cis6MTAzMzkwMDBGODg2ODFFNTc4NzVGMDIxQTQyNDhERjU4MkU0MzRGQzZCCis6MTAzM0EwMDBGNTgzNzhBRUU1ODEwNEMzOThGOUUwRjYwOEEzRDlGQTZECis6MTAzM0IwMDBEMDA3RDAwNkQwMDVEMDA0RDAwM0QwMDJEMDAxRDAwMDcxCis6MTAzM0MwMDBEMDgzRDA4MkQwRjBEMEQwRDBFMDMyQzBFMEMwRDBDMDI2Cis6MTAzM0QwMDAwMEMwMDFDMDAyQzI4RTg1N0U4RDg1N0Y4QkQyOEU3ODIzCis6MTAzM0UwMDAxOTc5MDk3QTA3RTc3MDA0QTYwMDgwMEJFNjYwMDgxNkQxCis6MTAzM0YwMDBFNjcwMDRFNzQ0ODBGNzA4MDlEQUVBRTU3OTYwMTMxNDE3Cis6MTAzNDAwMDBGNTc5NzAwRUU1NzgyNDA4Rjg3NjAwMTIzMjQ2RDI4Q0YxCis6MTAzNDEwMDBEMjhERDAwMkQwMDFEMDAwRDBEMEQwRTAzMjc1ODFBREI1Cis6MTAzNDIwMDA3NDJBOTBGRjkzRjA3NTdGMzA3NTdFRjg3NTdENjA3NTE2Cis6MTAzNDMwMDA3Q0YwMTIwNTNGMTIzNENFMTIxNzVCOTBGRjkzRTA0NEVDCis6MTAzNDQwMDAwMUYwQjJCMzEyMzRGODEyMzJBODgwREEyMkMwMDA3QzQ0Cis6MTAzNDUwMDAwMUVDMjQwOEY4RTY2MDA5MENCQzA4RjUxMjMyOUE4MEU5Cis6MTAzNDYwMDBFRUQwMDAyMkMwRjBDMDgyQzA4M0MwMDBDMDA2QzAwN0ZBCis6MTAzNDcwMDBFRDI0MTBGODc2QkNFRDc1RjAyMUE0MjQ4REY1ODJFNERFCis6MTAzNDgwMDAzNEZDRjU4M0MwODJDMDgzQTNBM0U0NzgwREYwQTNEOEY1Cis6MTAzNDkwMDBGQ0VDNTQ3Rjc1RjAwMkE0MjQ0MUY1ODJFNUYwMzQzNTRDCis6MTAzNEEwMDBGNTgzRTQ5M0ZFNzQwMTkzRjU4MjhFODNFNDkzRkU3NEI2Cis6MTAzNEIwMDAwMTkzRkZEMDgzRDA4MkVGRjBBM0VFRjBFRDI0MDhGODYzCis6MTAzNEMwMDBFQzQ0ODBGNkQwMDdEMDA2RDAwMEQwODNEMDgyRDBGMDc0Cis6MTAzNEQwMDAyMjc1NzgwMDc1N0IwMDdBMDg3OTE4NzgwODc2MDA3NzZECis6MTAzNEUwMDAwMDA4MDlEQUY4RTQ3ODA4NzQ4MDQ0N0ZGNjc0MDE0NDJGCis6MTAzNEYwMDAxMEY1ODk3NUI4MDhEMkFCRDJBOTIyNzU4MUFERDI4RUVDCis6MTAzNTAwMDBEMjhDRDJBRkU1N0I2MDMyRkY5MEZEOTVFMDU0ODA2MEI1Cis6MTAzNTEwMDAyNDc4MDg3OTA4RTA1NDdGRkE3QjAwRTY1NDdGQjUwMkVFCis6MTAzNTIwMDAwMjdCRkYwOEQ5RjVFQjcwMENFQUYwMTIzNDRBQUQwNEM3Cis6MTAzNTMwMDBBQzAyMTIzNDYxQTNBM0EzREZEMjEyMzI5QTgwQzU3Q0ZECis6MTAzNTQwMDAwMTdEMDAyMjA0RkUwNEYyMDRGNjA0RUEwNEU2MDRFMjJCCis6MTAzNTUwMDAwNEVFMDRGQTA0QTYwNEFBMDRENjA0REEwNEEyMDRBMjFGCis6MTAzNTYwMDAwNEEyMDRERTA0QkUwNEI2MDRCQTA0QjIwNENBMDRDNjRCCis6MTAzNTcwMDAwNEMyMDRDRTA0RDIwNEFFMTkwMTAzMDAyMjAwNDgwMkEyCis6MTAzNTgwMDAwMDQ4MEUzMDE0MjBDODFBRDAxODBBMEMwNTA2MDIwMzkxCis6MTAzNTkwMDAwMTAyMDAwMUNFMDE4MTAxMDAwMEMwMDA4MDAwNjAwMDM2Cis6MTAzNUEwMDAzMDAwMTgwMDEwMDAwODAwMDQwMDAyMDAwMTAwMDgxODk0Cis6MTAzNUIwMDAyODM4MEMwNTEwMEEwMjAwMDAwMDAwMDAwMzAxMTAwQTYwCis6MTAzNUMwMDAwMjAwMDAwMDAwMDBGQkUwRkJGMjA5MDIyNzAwMDEwMkZDCis6MTAzNUQwMDAwMEEwRkEwOTA0MDAwMDAzRkYwMDAwMDAwNzA1ODEwMkIzCis6MTAzNUUwMDA0MDAwMDAwNzA1MDEwMjQwMDAwMDA3MDU4MzAzMDIwMEI4Cis6MTAzNUYwMDAwMTIyMDM1NDAwNTUwMDUzMDA0MjAwMzMwMDM0MDAzMUNGCis6MTAzNjAwMDAwMDMwMDAyMDAwMjAwMDIwMDAyMDAwMjAwMDIwMDAyMEFBCis6MDczNjEwMDAwMDIwMDAwMDAwMDAwMDkzCis6MDAwMDAwMDFGRgpkaWZmIC0tZ2l0IGEvZmlybXdhcmUvbXRzX2VkZ2UuZncuaWhleCBiL2Zpcm13YXJlL210c19lZGdlLmZ3LmloZXgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDE0ZWJkNgotLS0gL2Rldi9udWxsCisrKyBiL2Zpcm13YXJlL210c19lZGdlLmZ3LmloZXgKQEAgLTAsMCArMSw4ODEgQEAKKzoxMDAwMDAwMEYwMzYwMDAyMDAxRTAyMUFGQkZGRkZGRkZGRkYwMjMzNjMKKzoxMDAwMTAwMEY5RkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkYwMjM0QkUKKzoxMDAwMjAwMEE0NzU4MUQ0OTBGREU4ODU4M0EwMTIzNjE4RUM0RDYwNEMKKzoxMDAwMzAwMDczNzhBRjgwMDM3NjAwMThCOEEwRkE3ODdGODAwMzc2RDMKKzoxMDAwNDAwMDAwMThCODY1RkE3ODIwODAwMzc2MDAxOEI4MjBGQTc4OEUKKzoxMDAwNTAwMDIwODAwMzc2MDAxOEI4MUZGQTkwRkREREFFODNBRjgyRDIKKzoxMDAwNjAwMDkwRkJGODEyMDBBQTYwMDVFNEYwQTM4MEY2OTBGREU4OEEKKzoxMDAwNzAwMEE4ODI5MEZERThBOTgyRTg2OTYwMDVFNEYyMDg4MEY3QUIKKzoxMDAwODAwMDkwMDEwODEyMDBCMzkwMDEwQzEyMDBCMzkwMDExMDEyRkQKKzoxMDAwOTAwMDAwQjM5MDAxMTQxMjAwRDE5MDAxMUExMjAwRDE5MDAxMDYKKzoxMDAwQTAwMDIwMTIwMEQxNzVEMDAwMTIzNEY2MDIwMTI2RUY2NTgyQ0QKKzoxMDAwQjAwMDcwMDNFRTY1ODMyMkU0OTNGODc0MDE5M0Y5NzQwMjkzNUMKKzoxMDAwQzAwMEZFNzQwMzkzRjU4MjhFODNFODY5NzAwMTIyRTQ5M0Y2NEYKKzoxMDAwRDAwMEEzMDg4MEY0RTQ5M0ZDNzQwMTkzRkQ3NDAyOTNGRTc0MEUKKzoxMDAwRTAwMDAzOTNGRjc0MDQ5M0Y4NzQwNTkzRjU4Mjg4ODMxMjAwRDgKKzoxMDAwRjAwMEFBNzAwMTIyRTQ5M0EzQTg4M0E5ODI4QzgzOEQ4MkYwNDUKKzoxMDAxMDAwMEEzQUM4M0FEODI4ODgzODk4MjgwRTMyMTIxMDQ5QjgwMTQKKzoxMDAxMTAwMDgwMDQ5QkIwQjQwNDlCRkRFODA0OUYwNDlGRkJGMzA0QTAKKzoxMDAxMjAwMEE0MDQ5RkZCRjMwNTA0MDUwNDgwRkVEMEYwMzBGMDA5MjEKKzoxMDAxMzAwMDIwRjMwM0Y2ODAxMEY3ODAwRDMwRjEwOTIwRjMwM0YyNkQKKzoxMDAxNDAwMDgwMDRGMzgwMDFGMDIwRjQwNEZDRDBFMENDMjJDQ0MwODkKKzoxMDAxNTAwMEUwMTIwMTYzMDIwMTU0QkMwMDA1RDBGMEFDRjAyMkMzRjAKKzoxMDAxNjAwMDEzRENGQzAyMDEyQUJGMDAwOUVEMjU4Mjc1RjAwMUY4QkQKKzoxMDAxNzAwMEU2MjJCRjAxMEZFRDI1ODJGNTgyRUUzNTgzRjU4Mzc1MEEKKzoxMDAxODAwMEYwMDRFMDIyRUQyNTgyNzVGMDAyRjhFMjIyRDA4M0QwNUYKKzoxMDAxOTAwMDgyRjVGMEMzRTQ5M0EzQzVGMDk1RjBDMEUwQzNEMEYwQkUKKzoxMDAxQTAwMEU0OTNBMzk1RjA0MDEyQTNBM0MzRTVGMDMzNTAwMjA1RjYKKzoxMDAxQjAwMDgzMjU4MkY1ODI1MDAyMDU4Mzc0MDE5M0MwRTBFNDkzQTUKKzoxMDAxQzAwMEMwRTAyMkQwODNEMDgyRjVGMEU0OTM3MDA5NzQwMTkzRUIKKzoxMDAxRDAwMDcwMDRBM0EzODAwQzc0MDI5MzY1RjA2MDA1QTNBM0EzMkQKKzoxMDAxRTAwMDgwRTc3NDAxOTNDMEUwRTQ5M0MwRTAyMjEyMDI2NDAyNEQKKzoxMDAxRjAwMDAxRkIxMjAyQjgwMjAxRkIxMjAyREMwMjAxRkIzMEUwM0IKKzoxMDAyMDAwMDA3MjBFMzAyRTYyMkU3MjIzMEUxMDcyMEUzMDJFMjIyQjAKKzoxMDAyMTAwMEUzMjIzMEUyMDJFMDIyRTQ5MzIyMTIwMkRDMDIwMjIzMTMKKzoxMDAyMjAwMDEyMDJCODAyMDIyM0FCRjAxMjAyMkRDQkM1RjBDQjIyOTIKKzoxMDAyMzAwMDMwRTAxMDIwRTMwNkU2RjVGMDA4RTYyMkU3RjVGMDA5RTUKKzoxMDAyNDAwMEU3MTkyMjMwRTExMDIwRTMwNkUyRjVGMDA4RTIyMkUzQUMKKzoxMDAyNTAwMEY1RjAwOUUzMTkyMjMwRTIwNkUwRjVGMEEzRTAyMkU0MkMKKzoxMDAyNjAwMDkzRjVGMDc0MDE5MzIyQkIwMDAzNzQwOTIyQkIwMTA3Q0MKKzoxMDAyNzAwMDg5ODI4QTgzNzQwNDIyQkIwMjA3ODk4MjhBODM3NDEwNkMKKzoxMDAyODAwMDIyNzQwQTIyMDIwMjg0QkIwMDA3RTkyNTgyRjg3NDAxNjUKKzoxMDAyOTAwMDIyQkIwMTBERTkyNTgyRjU4MkVBMzU4M0Y1ODM3NDA0REEKKzoxMDAyQTAwMDIyQkIwMjBERTkyNTgyRjU4MkVBMzU4M0Y1ODM3NDEwQkQKKzoxMDAyQjAwMDIyRTkyNTgyRjg3NDAyMjIwMjAyQjhCRjAwMDVFREY4OTcKKzoxMDAyQzAwMDc0MDEyMkJGMDEwNzhEODI4RTgzNzQwNDIyQkYwMjA3NEUKKzoxMDAyRDAwMDhEODI4RTgzNzQxMDIyRURGODc0MDIyMjAyMDJEQ0JGM0MKKzoxMDAyRTAwMDAwMDdFRDI1ODJGODc0MDEyMkJGMDEwREVEMjU4MkY1OEUKKzoxMDAyRjAwMDgyRUUzNTgzRjU4Mzc0MDQyMkJGMDIwREVEMjU4MkY1NkQKKzoxMDAzMDAwMDgyRUUzNTgzRjU4Mzc0MTAyMkVEMjU4MkY4NzQwMjIyODMKKzoxMDAzMTAwMDAyMDMxMEMwRTAxMjAyNjQwMjAzMjhDMEUwMTIwMkI4MTcKKzoxMDAzMjAwMDAyMDMyOEMwRTAxMjAyREMwMjAzMjgzMEUwMEIyMEUzQzUKKzoxMDAzMzAwMDA0RDBFMEY2MjJEMEUwRjcyMjMwRTEwQjIwRTMwNEQwMzUKKzoxMDAzNDAwMEUwRjIyMkQwRTBGMzIyRDBFMEYwMjJDOUNEQzlDQUNFM0IKKzoxMDAzNTAwMENBQ0JDRkNCMTIwMzVCRURGOUVFRkFFRkZCMjJCQjAwNjkKKzoxMDAzNjAwMDJGQkYwMDBBRkFFREY4RTdGNjA4MDlEQUZBMjJCRjAxMTIKKzoxMDAzNzAwMDEyOEQ4MjhFODNGODAyMDM3ODA5QTNFN0YwRDhGQTIyNUYKKzoxMDAzODAwMDAyMDM4M0ZBRURGOEU3RjIwODA5REFGQTIyMDIwMzhEOTQKKzoxMDAzOTAwMEJCMDE0REJGMDAxNDg5ODI4QTgzRjlFREY4MDIwMzlGRTcKKzoxMDAzQTAwMDA4QTNFMEY2RDlGQTIyMDIwM0IwQkYwMTIyOEQ4MjhFQTMKKzoxMDAzQjAwMDgzRkIwOEM5QzU4MkM5Q0FDNTgzQ0FFMEEzQzlDNTgyNkYKKzoxMDAzQzAwMEM5Q0FDNTgzQ0FGMEEzREJFQUQ4RTgyMjAyMDNEMzhERTkKKzoxMDAzRDAwMDgyOEU4M0Y5RURGOEUwRjIwOEEzRDlGQTIyMDIwM0RENTgKKzoxMDAzRTAwMEJCMDI0REJGMDAxMjg5ODI4QTgzRjlFREY4MDIwM0VGNDgKKzoxMDAzRjAwMDA4QTNFNDkzRjZEOUY5MjJCRjAxMjM4RDgyOEU4M0ZCRjMKKzoxMDA0MDAwMDA4QzlDNTgyQzlDQUM1ODNDQUU0OTNBM0M5QzU4MkM5M0MKKzoxMDA0MTAwMENBQzU4M0NBRjBBM0RCRTlEOEU3MjIwMjA0MjI4OTgyOTUKKzoxMDA0MjAwMDhBODNGOUVERjhFNDkzRjIwOEEzRDlGOTIyMDIwNDMzQTAKKzoxMDA0MzAwMEJGMDAwREZBRURGOEUzRjYwODA5REFGQTIyMDIwNDNERUUKKzoxMDA0NDAwMEJGMDExMjhEODI4RTgzRjgwMjA0NEEwOUEzRTNGMEQ4MUIKKzoxMDA0NTAwMEZBMjIwMjA0NTVGQUVERjhFM0YyMDgwOURBRkEyMjAyNjgKKzoxMDA0NjAwMDA0NUZFNkZCMDhFNkZBMDhFNkY5MDRGNjE4NzAwMTA2RjAKKzoxMDA0NzAwMDIyRTZGRjA4RTZGRTA4RTZGRDIyRUZGMEEzRUVGMEEzNzkKKzoxMDA0ODAwMEVERjAyMkVCRjBBM0VBRjBBM0U5RjAyMkUwRkZBM0UwMTUKKzoxMDA0OTAwMEZFQTNFMEZEMjJFMEZCQTNFMEZBQTNFMEY5MjIwMDAwQzYKKzoxMDA0QTAwMDAwMDAwMDAwMDAwMDAwMDUwNDAwNjEwNTczMDAyNjA1M0YKKzoxMDA0QjAwMDlBMDAzMzBBMEIwMDYxMEE3NzAwNjYxNTQ2MDA2MTBDNEEKKzoxMDA0QzAwMEZCMDA2MTA5QUIwMDYxMDlFMjAwNjEwREMyMDA2MTBCMzQKKzoxMDA0RDAwMEYzMDA2MTBBMUUwMDYxMEE1MzAwNjExNzNFMDAzMzE3RTIKKzoxMDA0RTAwMDUxMDAzNDFFMTYwMDQzMUVCQzAwNDQyMDI5MDA0NDIwNDUKKzoxMDA0RjAwMDE3MDA0NzFFRTMwMDQ3MUY4ODAwNEQxRkQ5MDA0RjFGRkMKKzoxMDA1MDAwMDA1MDA1ODMzODQwMDYxN0NDQzdERkYxMjFDQzcyMjkwMEIKKzoxMDA1MTAwMEZGRkNFMDIwRTcyREMyQUZBRTU5QUY1ODc1NUEyMEU1NzkKKzoxMDA1MjAwMDVBMTRDNTVBNjAxOUU0RkU3RjA1RUU0RkNFMjRGRkNFNjMKKzoxMDA1MzAwMENGMzRGRkNGNjAwN0U0OTBGRjkyRjA4MEVEODBFMDhFMzMKKzoxMDA1NDAwMDU5OEY1ODIyMTIwNTBDN0QwNzdDQjcxMjMzQTA3RDBGRkUKKzoxMDA1NTAwMDdDNkUxMjMzQkE3OEExN0EwNkU0RjYwOERBRkM3QTA2RTEKKzoxMDA1NjAwMDEyMDVDRjdDMDMxMjBFNTcxMjIxNjVFNEZFRkY3QzBGQUIKKzoxMDA1NzAwMDEyMzMyOUQyQTgyMjEyMzIxNEU0OTBGQzM4RjA5MEZGRjIKKzoxMDA1ODAwMEYwRTAzMEU0MDg3NDAxOTBGQzM5RjA4MDA1RTQ5MEZDNjAKKzoxMDA1OTAwMDM5RjA3RDBBN0MwMDEyMjU0NzEyMzI5NzIyMTIzMjE0NUMKKzoxMDA1QTAwMDkwRkMzOUUwMTQ3MDBFOTBGRkYwRTA0NDEwRjA3QzAwRjUKKzoxMDA1QjAwMDEyMjVFMDgwMTk5MEZDMzlFMDcwMEU5MEZGRjBFMDU0QjUKKzoxMDA1QzAwMEVGRjA3QzAwMTIyNUUwODAwNTdDMTcxMjI1RTAxMjMyNDYKKzoxMDA1RDAwMDk3MjI5MEZGRjBFMDU0QUJGMDkwRkZGMEUwNDQyMEYwNjEKKzoxMDA1RTAwMDIyOEMzNzhEMzY3ODgyRURGNjA4RUNGNkVERkVFQ0ZEQzgKKzoxMDA1RjAwMDdGMDE5MDAwMDUxMjAxRjU3ODgwRjY3ODgyRTZGRDA4MEIKKzoxMDA2MDAwMEU2RkNFREZFRUNGRDdGMDE5MDAwMDQxMjAxRjU1NDBGQjUKKzoxMDA2MTAwMEZDN0Q4MDEyMTc2Rjc4ODBFNjcwMERBRDNBQUUzOUFGNzEKKzoxMDA2MjAwMDM4RTQxMjAzMTg3QzA4MjI5MEZGRjBFMDU0RkVGMDkwQUEKKzoxMDA2MzAwMEZGRjBFMDU0RkRGMDgwMUU3ODgyRTZGRDA4RTZGQ0VENTgKKzoxMDA2NDAwMEZFRUNGRDdGMDE5MDAwMDgxMjAyMTcyNUUwNDQwMTkwQTYKKzoxMDA2NTAwMEZGRjNGMDAyMDZEQjc4ODJFNkZEMDhFNkZDRURGRUVDMzcKKzoxMDA2NjAwMEZEN0YwMTkwMDAwNjEyMDIxNzU0RkU5MEZGRjNGMDgwMDgKKzoxMDA2NzAwMDJCNzg4MkU2RkQwOEU2RkNFREZFRUNGRDdGMDE5MDAwQTQKKzoxMDA2ODAwMDA4MTIwMjE3RkFFQjkwRkZGMUYwMTIwOENBNDAwREFEMDQKKzoxMDA2OTAwMDNBQUUzOUFGMzhFNDEyMDMxODdDMTgyMjc4ODJFNkZEQUUKKzoxMDA2QTAwMDA4RTZGQ0VERkVFQ0ZEN0YwMTkwMDAwODEyMDIxNzkwQjkKKzoxMDA2QjAwMEZGRjFGMDEyMDhDQTQwMERBRDNBQUUzOUFGMzhFNDEyN0UKKzoxMDA2QzAwMDAzMTg3QzE4MjI3ODgyRTZGRDA4RTZGQ0VERkVFQ0ZEQkUKKzoxMDA2RDAwMDdGMDE5MDAwMDYxMjAyMTc0NDAxOTBGRkYzRjA3ODgzMjcKKzoxMDA2RTAwMEU2MjQwM0Y2MThFNjM0MDBGNjc4ODBFNjI0RkU1MDA5ODYKKzoxMDA2RjAwMDkwRkZGMEUwNTRGREYwODAwNzkwRkZGMEUwNDQwMkYwM0UKKzoxMDA3MDAwMEU0OTBGRkYxRjA3ODgxNzYwMDc4ODBFNjI0RkZGQ0U0NDUKKzoxMDA3MTAwMDM0RkZGRDc4ODFFNjdGMDBGRUVDRDM5RUVGNjQ4MENENTAKKzoxMDA3MjAwMDY0ODA5RDQwMkYxMjA4QUY0MDBGNzg4MUU2QUQzQUFFNEQKKzoxMDA3MzAwMDM5QUYzODEyMDMxODdDMTgyMjkwRkZGMkUwRkM3ODgyNUYKKzoxMDA3NDAwMDg2ODMwODg2ODJFQ0YwNzg4MTA2QTM3ODgyQTY4MzA4RTcKKzoxMDA3NTAwMEE2ODI4MEI1MTIwOEFGNDAwRjc4ODFFNkFEM0FBRTM5NzcKKzoxMDA3NjAwMEFGMzgxMjAzMTg3QzE4MjI5MEZGRjJFMEZDNzg4Mjg2RTIKKzoxMDA3NzAwMDgzMDg4NjgyRUNGMDc4ODBFNkFEM0FBRTM5QUYzODEyNjUKKzoxMDA3ODAwMDAzMTg3QzAwMjI4QzM3OEQzNjc4ODJFREY2MDhFQ0Y2NjMKKzoxMDA3OTAwMEVERkVFQ0ZEN0YwMTkwMDAwNTEyMDFGNTc4ODFGNjc4MDEKKzoxMDA3QTAwMDgyRTZGRDA4RTZGQ0VERkVFQ0ZEN0YwMTkwMDAwNDEyMDAKKzoxMDA3QjAwMDAxRjU1NDBGRkM3RDgxMTIxNzZGNzg4MUU2NzAwMzdDODAKKzoxMDA3QzAwMDA4MjI5MEZGRjBFMDU0RkVGMDkwRkZGMEUwNTRGREYwQkUKKzoxMDA3RDAwMDgwMUI3ODgyRTZGRDA4RTZGQ0VERkVFQ0ZEN0YwMTkwRDMKKzoxMDA3RTAwMDAwMDgxMjAyMTcyNUUwOTBGRkYzRjA4MDVCNzg4MkU2QTQKKzoxMDA3RjAwMEZEMDhFNkZDRURGRUVDRkQ3RjAxOTAwMDA2MTIwMjE3RkQKKzoxMDA4MDAwMDU0RkU5MEZGRjNGMDgwMjE3ODgyRTZGRDA4RTZGQ0VEQ0YKKzoxMDA4MTAwMEZFRUNGRDdGMDE5MDAwMDgxMjAyMTdGQUVCOTBGRkYxNDkKKzoxMDA4MjAwMEYwMTIwOENBNDAwMzdDMTgyMjc4ODJFNkZEMDhFNkZDMzQKKzoxMDA4MzAwMEVERkVFQ0ZEN0YwMTkwMDAwODEyMDIxNzkwRkZGMUYwMzEKKzoxMDA4NDAwMDEyMDhDQTQwMDM3QzE4MjI3ODgzRTYyNDBBRjYxOEU2QzgKKzoxMDA4NTAwMDM0MDBGNjc4ODA3NjAwNzg4MUU2MjRGRkZDRTQzNEZGRUIKKzoxMDA4NjAwMEZENzg4MEU2N0YwMEZFRUNEMzlFRUY2NDgwQ0Q2NDgwNEYKKzoxMDA4NzAwMDlENDAyMTc4ODI4NjgzMDg4NjgyRTA5MEZGRjFGMDEyMDUKKzoxMDA4ODAwMDA4Q0E0MDAzN0MxODIyNzg4MDA2Nzg4MzA2RTYxODcwMzAKKzoxMDA4OTAwMDAxMDY4MEMzOTBGRkYwRTA0NDAxRjA3ODgyODY4MzA4NkYKKzoxMDA4QTAwMDg2ODJFMDkwRkZGMUYwMTIwOENBNDAwMzdDMTgyMjdDOTcKKzoxMDA4QjAwMDAwMjI5MEZGRjBFMDIwRTcxMjkwRkZGMEUwMzBFNTA5MjEKKzoxMDA4QzAwMDkwRkZGMEUwNDQyMEYwQzMyMjgwRTdEMzIyOTBGRkYwQjUKKzoxMDA4RDAwMEUwMjBFMzEyOTBGRkYwRTAzMEU1MDk5MEZGRjBFMDQ0MDMKKzoxMDA4RTAwMDIwRjBDMzIyODBFN0QzMjI4QzQyOEQ0MTdDMDBFRDU0NUUKKzoxMDA4RjAwMEYwRkRFQzcwMDNFRDY0MzA3MDA1NzUzRTAzODAwMzc1MDgKKzoxMDA5MDAwMDNFMDRBQzNFMTIwRjc0NzU4MzAwODU4MzQwRTU0MTU0NkMKKzoxMDA5MTAwMDBGRjUzRkU1NDA3MDA0RTUzRjY0MDM3MDM1RTUzRTI0ODQKKzoxMDA5MjAwMEZENzVGMDBBQTQyNDAyRjU4MkU0MzRGQ0Y1ODNFMDMwN0UKKzoxMDA5MzAwMEU2MDUxMjEwNUI4MDE5RTUzRTI0QTFGOEU2NTRGQkY2QUIKKzoxMDA5NDAwMDc4QURFNjI0MDVGNTgyMThFNjM0MDBGNTgzNzQwRkYwREYKKzoxMDA5NTAwMDgwNTlFNTQwNzAwNEU1M0Y2NDA0NzA0OEU1M0UyNEZEOUQKKzoxMDA5NjAwMDc1RjAwQUE0MjQwMkY1ODJFNDM0RkNGNTgzRTAzMEU1NTYKKzoxMDA5NzAwMDA3QUM0MkFENDExMjFDNUNFNTQyMzBFMjE1NzhCMUU2QUQKKzoxMDA5ODAwMDMwRTAwRjc4QjFFNjMwRTEwOUU0RkYwNEZFN0MwNDEyQTgKKzoxMDA5OTAwMDMzMjk3OEFERTYyNDA2RjU4MjE4RTYzNDAwRjU4Mzc0MzEKKzoxMDA5QTAwMDBGRjA4MDA3RTRGQzdERUUxMjFDNUNDMjAzMjIxMjMyQzEKKzoxMDA5QjAwMDE0MTIwRjc0NzhBREU2MjQwNkY1ODIxOEU2MzQwMEY1QkIKKzoxMDA5QzAwMDgzRTA5MEZDMzhGMDc4QURFNjI0MDVGNTgyMThFNjM0MzMKKzoxMDA5RDAwMDAwRjU4M0UwOTBGQzM5RjBDMjAzN0QwMjdDMDAxMjI1MTMKKzoxMDA5RTAwMDQ3MTIzMjk3MjIxMjMyMTQ3ODk5RUNGNkVDMjRBMUY4Q0YKKzoxMDA5RjAwMEU2MzBFMTA3N0MxMzEyMjVFMDgwMEY5MEZDMzlFMEZEMjIKKzoxMDBBMDAwMDc4OTlFNkZDMTIxM0YxMTIyNUUwMTIzMjk3MjIxMjMyODUKKzoxMDBBMTAwMDE0Nzg5OUVDRjY3RDAwMTIwRjE0MTIyNUUwMTIzMjk3MkIKKzoxMDBBMjAwMDIyMTIzMjE0Nzg5OUVDRjZFQzI0QTFGOEU2MzBFMjA3QjEKKzoxMDBBMzAwMDdDMTMxMjI1RTA4MDFCNzg5OUU2MjRBMUY4RTYyMEUxREEKKzoxMDBBNDAwMDA3N0MxMjEyMjVFMDgwMEE3ODk5RTZGQzEyMTQxNTEyMzAKKzoxMDBBNTAwMDI1RTAxMjMyOTcyMjEyMzIxNDc4OTlFQ0Y2RUMyNEExOTgKKzoxMDBBNjAwMEY4RTYyMEUyMDc3QzExMTIyNUUwODAwQTc4OTlFNkZDN0UKKzoxMDBBNzAwMDEyMTUxNjEyMjVFMDEyMzI5NzIyMTIzMjE0Nzg5OUVDRDAKKzoxMDBBODAwMEY2MTIwRjc0NzhBREU2MjQwOUY1ODIxOEU2MzQwMEY1MDUKKzoxMDBBOTAwMDgzRTA5MEZDM0ZGMDc4QURFNjI0MEFGNTgyMThFNjM0NTYKKzoxMDBBQTAwMDAwRjU4M0UwOTBGQzQwRjA3OEFERTYyNDAzRjU4MjE4NzEKKzoxMDBBQjAwMEU2MzQwMEY1ODNFMEZDNzhBREU2MjQwNEY1ODIxOEU2MjAKKzoxMDBBQzAwMDM0MDBGNTgzRTBGNTYyNzhBREU2MjQwMkY1ODIxOEU2OUQKKzoxMDBBRDAwMDM0MDBGNTgzRTBGNTYzOEM2MUU0RUMzMzMzNTQwMTc4NDIKKzoxMDBBRTAwMDk5RjY2MDA4RTU2MjMwRTEwMzc4OTkwNjc4OTlFNjkwMTYKKzoxMDBBRjAwMEZDNDFGMDc4QUJFNjI0MDJGNTgyMThFNjM0MDBGNTgzNzkKKzoxMDBCMDAwMEUwRkRBM0UwNTQwQ0ZDRUQ1NEU2OEM2NUY1NjRFNTYxNzIKKzoxMDBCMTAwMDMwRTUwMzQzNjUwMUU1NjIyMEU1MEVFNTYxNTQ3RjcwMzEKKzoxMDBCMjAwMDA4RTU2MTIwRTcwMzQzNjUwMkU1NjEzMEUzMDM0MzY1QkYKKzoxMDBCMzAwMDEwRTU2MTMwRTIwMzQzNjUyMEU1NjE1NDAzNjAwMzQzM0YKKzoxMDBCNDAwMDY1NDBFNTYxMzBFMTAzNDM2NTgwRTU2MTMwRTQwMzQzREUKKzoxMDBCNTAwMDY0MDFFNTYxMzBFNjAzNDM2NDA4RTU2MjIwRTQwRUU1RTQKKzoxMDBCNjAwMDYxNTQ3RjcwMDhFNTYxMjBFNzAzNDM2NDEwNTM2NUZCMUYKKzoxMDBCNzAwMDUzNjRGOUFENjRFNTY1OTBGQzNBQ0RGMEEzQ0RGMEU1QTIKKzoxMDBCODAwMDYzMzBFMzBERTU2MzU0MzBDNDU0MEY5MEZDM0RGMDgwQjYKKzoxMDBCOTAwMDA1RTQ5MEZDM0RGMEU1NjM1NDAzOTBGQzNDRjBFNTYzMTQKKzoxMDBCQTAwMDU0MDRDMzEzOTBGQzNFRjA5MEZDM0NFMDcwMEU3RDM1ODUKKzoxMDBCQjAwMDdFRkM3RjAxNzQwMTkwMDAwOTEyMDE0Qjc4QURFNjI0QTAKKzoxMDBCQzAwMDA4RjU4MjE4RTYzNDAwRjU4M0UwN0MwMEZENzhBREU2OTgKKzoxMDBCRDAwMDI0MDdGNTgyMThFNjM0MDBGNTgzRTA3RjAwNENGRUVGMzEKKzoxMDBCRTAwMDREOTBGQzM4RjBBM0NFRjBDRUMyMDM3RDBBN0MwMDEyRkIKKzoxMDBCRjAwMDI1NDcxMjMyOTcyMjEyMzIxNDc4OTlFQ0Y2Nzg5RTc2QjUKKzoxMDBDMDAwMDAxMDg3NkZDMDg3NjM4Nzg5Qjc2MEM3ODlFMTIwNDZFODQKKzoxMDBDMTAwMDEyMDIxRDc4OUNDQkY2Q0IwOEY2N0YwMEVGMjRFQTQwNDkKKzoxMDBDMjAwMDFGRTRFRjI1RTA5MDM2NUFGRDkzQ0QwNDkzNzg5RDY2M0UKKzoxMDBDMzAwMDcwMDNFRDE4NjY3MDA2Nzg5Qjc2MDA4MDAzMEY4MERDRTkKKzoxMDBDNDAwMDc4OUFFRkY2Nzg5RTEyMDQ2RTkwMDAwMjEyMDIxNzc4REUKKzoxMDBDNTAwMDlDQ0JGNkNCMDhGNjU0MDRDQjU0MDY0QjYwMDQ3ODlCMkYKKzoxMDBDNjAwMDc2MEI3ODlERTYzMEUzMTM3ODlFMTIwNDZFOTAwMDA1QjMKKzoxMDBDNzAwMDEyMDFGNTI0RkI1MDA0Nzg5Qjc2MEQ3ODlERTY1NEMwNTQKKzoxMDBDODAwMDdEMDA2NEMwNEQ3MDA0Nzg5Qjc2MEI3ODlFMTIwNDZFRDQKKzoxMDBDOTAwMDkwMDAwNDEyMDFGNTI0RkM1MDA0Nzg5Qjc2MEY3ODlFOTYKKzoxMDBDQTAwMDEyMDQ2RTkwMDAwNjEyMDFGNTI0RkQ1MDA0Nzg5Qjc2MjQKKzoxMDBDQjAwMDBFNzg5RTEyMDQ2RTkwMDAwOTEyMDFGNTI0RkQ1MDA0NzYKKzoxMDBDQzAwMDc4OUI3NjBBNzg5QkU2NzAyQTc4OTlFNkZDMTIwRjc0NzYKKzoxMDBDRDAwMDc4OUUxMjA0NkU3OEFCRTZGOTc4QUFFNkZBN0IwMTc0ODYKKzoxMDBDRTAwMDBBNzgwMDEyMDM0OEMyMDM3ODk5RTZGQzEyMTExNzc4QkIKKzoxMDBDRjAwMDlCRUNGNjc4OUJFNkZDMTIyNUUwMTIzMjk3MjIxMjMyMkEKKzoxMDBEMDAwMDE0Nzg5OUVDRjYxMjBGNzQ3ODk5RTYyNEZENzVGMDBBQzAKKzoxMDBEMTAwMEE0MjQxNEY1ODJFNDM0RkNGNTgzQUM4MkFEODM3OEFBNzQKKzoxMDBEMjAwMDg2ODMwODg2ODJFQ0Y5RURGQTdCMEE3ODAxMTIwM0IwMUIKKzoxMDBEMzAwMEMyMDM3ODk5RTZGQzEyMTExNzEyMzI5NzIyOEQyQjhDODAKKzoxMDBENDAwMDJBRUQ2MDQwNzUyNzAxNzUyOTQ4NzUyOEZGRTUyQTI0OUEKKzoxMDBENTAwMEZERkNFNDM0RkZGREVDN0MwMzI1RTBDRDMzQ0REQ0Y5NzQKKzoxMDBENjAwMEZDRTUyOTJDRjUyOUU1MjgzREY1MjhBRDI5QUUyOEFGNkQKKzoxMDBENzAwMDI3NzQ4MDkwMDAwNjEyMDMyMDc0ODA5MDAwMDIxMjAzRjIKKzoxMDBEODAwMDIwMTIwRkM3RTUyQjE0NjAzQjc1MjcwMTc1MjkwODc1RTQKKzoxMDBEOTAwMDI4RkZFNTJBMjRGREZDRTQzNEZGRkRFQzdDMDMyNUUwN0MKKzoxMDBEQTAwMENEMzNDRERDRjlGQ0U1MjkyQ0Y1MjlFNTI4M0RGNTI4RTYKKzoxMDBEQjAwMEFEMjlBRTI4QUYyN0U0OTAwMDA2MTIwMzIwRTQ5MDAwOEUKKzoxMDBEQzAwMDAyMTIwMzIwMjIxMjMyMTQ3ODk5RUNGNkVDMjRBMUY4RDYKKzoxMDBERDAwMEU2MzBFMjA5Nzg5OUU2RkMxMjE1MTZEMjAwNzg5OUU2MTkKKzoxMDBERTAwMEZDMTIwRjc0Nzg5QTc2MDA5MEZDMzlFMDMwRTcwNDc4QjIKKzoxMDBERjAwMDlBNzYwMTc4OUFFNkZENzg5OUU2RkMxMjBEM0FDMjAzREMKKzoxMDBFMDAwMDMwMDAwNzc4OTlFNkZDMTIxNDE1N0MwMDEyMjVFMDEyRDgKKzoxMDBFMTAwMDMyOTcyMjc4QURFNjI0MDRGNTgyMThFNjM0MDBGNTgzOTMKKzoxMDBFMjAwMEUwNDQwMUYwNzhBREU2MjQwNEY1ODIxOEU2MzQwMEY1REMKKzoxMDBFMzAwMDgzRTAzMEUwMDI4MEVENzhBREU2MjQwQkY1ODIxOEU2MjEKKzoxMDBFNDAwMDM0MDBGNTgzRTA1NEY4RjA3OEFERTYyNDAyRjU4MjE4MUEKKzoxMDBFNTAwMEU2MzQwMEY1ODNFMDQ0ODBGMDIyQzIwMzhDNTgxMjBGODAKKzoxMDBFNjAwMDc0NzhBQTg2ODMwODg2ODI3OThCN0EzNjdCMEE3ODAxMjEKKzoxMDBFNzAwMDEyMDNGRTEyMEUxMEFDNTg3RDAyMTIwRDNBQzIwM0FDRTIKKzoxMDBFODAwMDU4MTIxMTE3MjI4RDUzOEU1MjhGNTE4QzUwMTIwRjc0OUQKKzoxMDBFOTAwMDc1NEYwMDc4QURFNjI0MDVGNTgyMThFNjM0MDBGNTgzMzkKKzoxMDBFQTAwMEUwMjBFNDFGRTU0RjI0RjY0MDE5MDU0RkMyMDM3QzE4RUIKKzoxMDBFQjAwMDEyMzNENzkwRkY5M0UwNDQwMUYwQjJCM0FDNTAxMjBGNUQKKzoxMDBFQzAwMDc0ODBEMDc4QURFNjI0MDVGNTgyMThFNjM0MDBGNTgzMDkKKzoxMDBFRDAwMEUwMjBFNDA1QzIwMzdDMDIyMjc4QURFNjI0MDVGNTgyMTkKKzoxMDBFRTAwMDE4RTYzNDAwRjU4M0UwNTQwRjYwMTY3OEFERTYyNDA1NkIKKzoxMDBFRjAwMEY1ODIxOEU2MzQwMEY1ODNFMDU0MEZGMEMyMDM3QzAxNUMKKzoxMDBGMDAwMDIyNzhBQzg2ODMwODg2ODJFMEFENTNBRTUyQUY1MTEyOTAKKzoxMDBGMTAwMDAzMThDMjAzN0MwMDIyOEQzMThDMzAxMjE1MTZFNTMxODYKKzoxMDBGMjAwMDYwMEZFNTMwQjQwMzBBN0MwMTEyMjUwRjdDODExMjI1ODUKKzoxMDBGMzAwMDBGQUMzMDEyMEY3NEU1MzE2MDFBNzhBRTg2ODMwODg2RTQKKzoxMDBGNDAwMDgyRTA1NEU3RjBBM0EzQTNBM0UwNTRFN0YwQUMzMDdEMjQKKzoxMDBGNTAwMDAyMTIwRDNBNzhBQTg2ODMwODg2ODI3OTk1N0EzNjdCQzIKKzoxMDBGNjAwMDBBNzgwMTEyMDNGRUMyMDNFNTMwMjRBMUY4RTY1NEZEMUQKKzoxMDBGNzAwMEY2QUMzMDEyMTExNzIyOEMyNjMwMDMwNTEyMzM3NjgwMUUKKzoxMDBGODAwMEY4N0MwQTEyMzI4OUQyMDNFNTI2MjRGRDc4QTdGNjcwOTAKKzoxMDBGOTAwMDA3NzhBRTc2RkYwODc2RTA3OEE3RTY3RDAwN0MwNDI1MkEKKzoxMDBGQTAwMEUwQ0QzM0NERENGOUZDMjRBMDc4QURGNkVEMzRGRjE4QUMKKzoxMDBGQjAwMEY2NzhBN0U2NzVGMDBBQTQyNDAwRkNFNDM0RkNGRDc4N0EKKzoxMDBGQzAwMEFBRURGNjA4RUNGNjEyMzMyMjIyNzhBREU2MjQwMkY1RkIKKzoxMDBGRDAwMDgyMThFNjM0MDBGNTgzRTAzMEU3MjI3OEFERTYyNDAyOUIKKzoxMDBGRTAwMEY1ODIxOEU2MzQwMEY1ODNFMDU0N0ZGMDc4QURFNjI0MEUKKzoxMDBGRjAwMDAyRjU4MjE4RTYzNDAwRjU4M0UwNDQ4MEYwMjI3OEFFRjIKKzoxMDEwMDAwMDg2ODMwODg2ODJFMDU0N0ZGMEFEODNFNTgyMjQwNEZDNjkKKzoxMDEwMTAwMEU0M0Q4QzgyRjU4M0UwNTQ3RkYwNzhBREU2MjQwQkY1NTcKKzoxMDEwMjAwMDgyMThFNjM0MDBGNTgzRTA1NEY4RjA3OEFGRTYyNDAxNDYKKzoxMDEwMzAwMEY1ODIxOEU2MzQwMEY1ODNFMDQ0MDNGMDc4QUZFNjI0NDcKKzoxMDEwNDAwMDA1RjU4MjE4RTYzNDAwRjU4M0UwNDQwM0YwNzhBREU2NTgKKzoxMDEwNTAwMDI0MDVGNTgyMThFNjM0MDBGNTgzNzQwRkYwMjI3OEFFOEIKKzoxMDEwNjAwMDg2ODMwODg2ODJFMDU0M0ZGMEFEODNFNTgyMjQwNEZDNDkKKzoxMDEwNzAwMEU0M0Q4QzgyRjU4M0UwNTQzRkYwNzhBN0U2MjRBOEY4OUQKKzoxMDEwODAwMEU2RkM3OEFGRTYyNDAxRjU4MjE4RTYzNDAwRjU4M0VDM0YKKzoxMDEwOTAwMEYwNzhBN0U2MjRBOEY4RTZGQzc4QUZFNjI0MDVGNTgyMDgKKzoxMDEwQTAwMDE4RTYzNDAwRjU4M0VDRjA3OEFERTYyNDBCRjU4MjE4RjEKKzoxMDEwQjAwMEU2MzQwMEY1ODNFMDU0RkI0NDAyRjUyNjc4QUJFNjI0RTEKKzoxMDEwQzAwMDAyRjU4MjE4RTYzNDAwRjU4M0UwMzBFNTAzNDMyNjAxOUIKKzoxMDEwRDAwMDc4QURFNjI0MDVGNTgyMThFNjM0MDBGNTgzRTAzMEUwQ0IKKzoxMDEwRTAwMDAzMTIwRkM3RTUyNkZDNzhBREU2MjQwQkY1ODIxOEU2NUYKKzoxMDEwRjAwMDM0MDBGNTgzRUNGMDc4QURFNjI0MDVGNTgyMThFNjM0OEIKKzoxMDExMDAwMDAwRjU4Mzc0MEZGMDc4QUU4NjgzMDg4NjgyRTA0NDgwMTEKKzoxMDExMTAwMEYwQTNBM0EzQTNFMDQ0ODBGMDIyOEMyQTEyMEY3NDc4REEKKzoxMDExMjAwMEFCRTYyNDA4RjU4MjE4RTYzNDAwRjU4M0UwRkM3OEFERTAKKzoxMDExMzAwMEU2MjQwQUY1ODIxOEU2MzQwMEY1ODNFQ0YwNzhBQkU2OTUKKzoxMDExNDAwMDI0MDdGNTgyMThFNjM0MDBGNTgzRTBGQzc4QURFNjI0NDgKKzoxMDExNTAwMDA5RjU4MjE4RTYzNDAwRjU4M0VDRjA3OEFBODY4MzA4NTYKKzoxMDExNjAwMDg2ODJFMEZEQTNFMEZDRURGRTc4QURFNjI0MDhGNTgyODIKKzoxMDExNzAwMDE4RTYzNDAwRjU4M0VFRjBFQ0ZFNzhBREU2MjQwN0Y1RDIKKzoxMDExODAwMDgyMThFNjM0MDBGNTgzRUVGMDhDMjk4RDI4QzNFQzk0QTgKKzoxMDExOTAwMDA1RUQ5NDBDNDAwNTc1Mjc3QzgwMzNEM0U1Mjk5NDAxMzcKKzoxMDExQTAwMEU1Mjg5NDAzNDAwNTc1MjczQzgwMjNEM0U1Mjk5NDgxRTUKKzoxMDExQjAwMEU1Mjg5NDAxNDAwNTc1MjcxODgwMTNEM0U1Mjk5NDYwMkMKKzoxMDExQzAwMEU1Mjg5NDAwNDAwNTc1MjcwQzgwMDM3NTI3MDhBRjI3OTQKKzoxMDExRDAwMEU0RUY1NDdDNDQ4M0ZGOEYyN0U1MjdGQzc4QUZFNjI0QjcKKzoxMDExRTAwMDAxRjU4MjE4RTYzNDAwRjU4M0VDRjBFNTI3RkM3OEFGRDIKKzoxMDExRjAwMEU2MjQwNUY1ODIxOEU2MzQwMEY1ODNFQ0YwRTUyN0ZDREIKKzoxMDEyMDAwMDc4QTdFNjI0QThGOEVDRjY3OEFERTYyNDAyRjU4MjE4NzMKKzoxMDEyMTAwMEU2MzQwMEY1ODNFMEY1Mjc3OEFCRTYyNDAyRjU4MjE4ODIKKzoxMDEyMjAwMEU2MzQwMEY1ODNBM0UwMzBFMzE3NTMyN0M3NzhBQkU2MzUKKzoxMDEyMzAwMDI0MDVGNTgyMThFNjM0MDBGNTgzRTA5MDM2ODY5MzQyNjMKKzoxMDEyNDAwMDI3NzhBQkU2MjQwMkY1ODIxOEU2MzQwMEY1ODNFMDMwMTcKKzoxMDEyNTAwMEU3MDU0MzI3NDA4MDAzNTMyN0JGNTMyN0ZCNzhBQkU2QkUKKzoxMDEyNjAwMDI0MDZGNTgyMThFNjM0MDBGNTgzRTA2MDAzNDMyNzA0ODIKKzoxMDEyNzAwMDUzMjdGQzc4QUJFNjI0MDRGNTgyMThFNjM0MDBGNTgzQTYKKzoxMDEyODAwMEUwNDIyNzQzMjc4MEU1MjdGQzc4QURFNjI0MDJGNTgyN0IKKzoxMDEyOTAwMDE4RTYzNDAwRjU4M0VDRjA3OEFERTYyNDA0RjU4MjE4MDYKKzoxMDEyQTAwMEU2MzQwMEY1ODNFMEY1Mjc3OEFCRTYyNDAyRjU4MjE4RjIKKzoxMDEyQjAwMEU2MzQwMEY1ODNBM0UwMzBFMTA1NTMyN0RGODAwMzQzRTQKKzoxMDEyQzAwMDI3MjA3OEFCRTYyNDAyRjU4MjE4RTYzNDAwRjU4M0UwQTcKKzoxMDEyRDAwMDMwRTQwNTUzMjdFRjgwMDM0MzI3MTA3OEFCRTYyNDA5NTkKKzoxMDEyRTAwMEY1ODIxOEU2MzQwMEY1ODNFMEI0MDIwMzQzMjcwMkU1RjMKKzoxMDEyRjAwMDI3RkM3OEFERTYyNDA0RjU4MjE4RTYzNDAwRjU4M0VDOEIKKzoxMDEzMDAwMEYwNzhBREU2MjQwM0Y1ODIxOEU2MzQwMEY1ODNFMEY1QzUKKzoxMDEzMTAwMDI3NzhBQkU2MjQwOUY1ODIxOEU2MzQwMEY1ODNFMDcwRkYKKzoxMDEzMjAwMDA1NTMyNzdGODAwMzQzMjc4MDc4QUJFNjI0MDJGNTgyQUMKKzoxMDEzMzAwMDE4RTYzNDAwRjU4M0EzRTAzMEUwMDU0MzI3MjA4MDAzNUUKKzoxMDEzNDAwMDUzMjdERjc4QUJFNjI0MDJGNTgyMThFNjM0MDBGNTgzRjQKKzoxMDEzNTAwMEUwMzBFMzA1NDMyNzQwODAwMzUzMjdCRjc4QUJFNjI0MDIKKzoxMDEzNjAwMDAyRjU4MjE4RTYzNDAwRjU4M0UwMzBFMDA1NDMyNzEwRUIKKzoxMDEzNzAwMDgwMDM1MzI3RUY3OEFCRTYyNDAyRjU4MjE4RTYzNDAwQTkKKzoxMDEzODAwMEY1ODNBM0UwMzBFNDA1NDMyNzA4ODAwMzUzMjdGNzc4NkIKKzoxMDEzOTAwMEFCRTYyNDAyRjU4MjE4RTYzNDAwRjU4M0EzRTAzMEU1REQKKzoxMDEzQTAwMDA1NDMyNzA0ODAwMzUzMjdGQjc4QUJFNjI0MDJGNTgyMkMKKzoxMDEzQjAwMDE4RTYzNDAwRjU4M0EzRTAzMEU2MDU0MzI3MDE4MDAzRjcKKzoxMDEzQzAwMDUzMjdGRTc4QUJFNjI0MDJGNTgyMThFNjM0MDBGNTgzNTUKKzoxMDEzRDAwMEEzRTAzMEU3MDU0MzI3MDI4MDAzNTMyN0ZERTUyN0ZDMDAKKzoxMDEzRTAwMDc4QURFNjI0MDNGNTgyMThFNjM0MDBGNTgzRUNGMEMyMEMKKzoxMDEzRjAwMDAzN0MwMDIyOEQyNzhDMjZFRDU0MDMxNDYwMDM3QzEwOUYKKzoxMDE0MDAwMDIyRTUyNzU0N0MyNEZDNDAwMzdDMEIyMkU1MjYyNEExMDIKKzoxMDE0MTAwMEY4RTY0NDAyRjY3QzAwMjI4QzMwMTIwRjc0RTUzMDI0OEEKKzoxMDE0MjAwMEExRjhFNjIwRTI0RkFDMzA3RDAyMTIwRDNBRTUzMDI0RkYKKzoxMDE0MzAwMEZFNDQyOEZDNzhBRTg2ODMwODg2ODJFQ0YwQUY4M0U1MTQKKzoxMDE0NDAwMDgyMjQwNEZFRTQzRkZGRUM4RTgyOEY4M0YwN0MwMzhDQzkKKzoxMDE0NTAwMDJDRTUyQ0ZDNzhBRkU2MjQwMUY1ODIxOEU2MzQwMEY1ODMKKzoxMDE0NjAwMDgzRUNGMEU1MkNGQzc4QUZFNjI0MDVGNTgyMThFNjM0MzEKKzoxMDE0NzAwMDAwRjU4M0VDRjA3NTJEMDE3NTJGNDg3NTJFRkZFNTMwRDIKKzoxMDE0ODAwMDI0RkRGQ0U0MzRGRkZERUM3QzAzMjVFMENEMzNDRERDMTIKKzoxMDE0OTAwMEY5RkNFNTJGMkNGNTJGRTUyRTNERjUyRTc4QUZFNjI0NEYKKzoxMDE0QTAwMDA0RjU4MjE4RTYzNDAwRjU4M0UwNTRFN0Y1MkNBRDJGRkYKKzoxMDE0QjAwMEFFMkVBRjJERTQ5MDAwMDIxMjAzMjBFNDkwMDAwNjEyM0QKKzoxMDE0QzAwMDAzMjAxMjAxRUYzMEU1MDM0MzJDMTBFNTJDRkM3OEFGMkMKKzoxMDE0RDAwMEU2MjQwNEY1ODIxOEU2MzQwMEY1ODNFQ0YwMTIxMDVCODQKKzoxMDE0RTAwMDc4QURFNjI0MDZGNTgyMThFNjM0MDBGNTgzRTBDMjAzMDEKKzoxMDE0RjAwMEZDRTUzMDI0QTFGOEU2NDQwNEY2OEMyQ0U1MzA1NDBGQ0EKKzoxMDE1MDAwMEM0NTRGMDdFMDBGRkVFRUY0NDA0N0QwMEZGRUM0RUZDN0YKKzoxMDE1MTAwMEVENEZGRDEyMUNDNzdDMDAyMjhDMkYxMjBGNzQxMjBGOEUKKzoxMDE1MjAwMEZCNzhBRTg2ODMwODg2ODJFMDU0MDhGMEEzQTNBM0EzQzkKKzoxMDE1MzAwMEUwNTQwOEYwQUMyRjdEMDIxMjBEM0FDMjAzRTUyRjI0Q0YKKzoxMDE1NDAwMEExRjhFNjU0RkJGNjdDMDAyMjEyMzIxNDc4OUFFQ0Y2RUQKKzoxMDE1NTAwMEVDMjRBMUY4RTYzMEUxMEE3RDAwN0MxMzEyMjU0NzEyNDUKKzoxMDE1NjAwMDMyOTc3ODlBRTYyNEExRjhFNjQ0MDFGNjc4OUFFNkZDRTgKKzoxMDE1NzAwMDEyMEY3NDc4OUFFNjI0RkQ3NUYwMEFBNDI0MTRGNTgyRkIKKzoxMDE1ODAwMEU0MzRGQ0Y1ODM3OEFBRTZGQTA4RTZGOTdCMEE3ODAxRTgKKzoxMDE1OTAwMDEyMDNCMDc4QUE4NjgzMDg4NjgyNzk5NTdBMzY3QjBBMDgKKzoxMDE1QTAwMDc4MDExMjAzRkUxMjBGQzdDMjAzNzg5QUU2RkMxMjExRUIKKzoxMDE1QjAwMDE3Nzg5OUVDRjZFQzYwMEE3RDAwN0MwODEyMjU0NzEyM0EKKzoxMDE1QzAwMDMyOTc3ODlBRTZGQzEyMEY3NDc4QURFNjI0MDRGNTgyMUYKKzoxMDE1RDAwMDE4RTYzNDAwRjU4M0UwNDQxMDU0REZGQzc4QURFNjI0Q0YKKzoxMDE1RTAwMDA0RjU4MjE4RTYzNDAwRjU4M0VDRjA3ODk5RUNGNkMyNDUKKzoxMDE1RjAwMDAzN0NDODEyMzNENzc4OUFFNkZDMTIwRjc0NzhBREU2RjQKKzoxMDE2MDAwMDI0MDRGNTgyMThFNjM0MDBGNTgzRTA1NEVGRjBDMjAzQjkKKzoxMDE2MTAwMDdDQzgxMjMzRDc3ODlBRTZGQzEyMEY3NDc4QURFNjI0QjIKKzoxMDE2MjAwMDA0RjU4MjE4RTYzNDAwRjU4M0UwNDQxMEYwQzIwMzdDMzAKKzoxMDE2MzAwMEM4MTIzM0Q3Nzg5QUU2RkMxMjBGNzQ3OEFERTYyNDA0MEEKKzoxMDE2NDAwMEY1ODIxOEU2MzQwMEY1ODNFMDQ0MjBGMEMyMDM3Q0YwMTQKKzoxMDE2NTAwMDEyMzNENzc4OUFFNkZDMTIwRjc0NzhBREU2MjQwNUY1QkMKKzoxMDE2NjAwMDgyMThFNjM0MDBGNTgzRTAzMEU0MTVDMjAzNzg5QUU2ODgKKzoxMDE2NzAwMDQ0MTA3RjAwRkU3QzA3MTIzMzI5MTIzMjk3MDIxNzNENzcKKzoxMDE2ODAwMDc4QURFNjI0MDRGNTgyMThFNjM0MDBGNTgzRTA1NENGMDMKKzoxMDE2OTAwMEYwQzIwMzdDQzgxMjMzRDc3ODlBRTZGQzEyMEY3NDc4MzQKKzoxMDE2QTAwMEFERTYyNDA0RjU4MjE4RTYzNDAwRjU4M0UwNDQzMEYwMUEKKzoxMDE2QjAwMEMyMDM3Q0YwMTIzM0Q3Nzg5QUU2RkMxMjBGNzQ3OEFEMkYKKzoxMDE2QzAwMEU2MjQwNUY1ODIxOEU2MzQwMEY1ODNFMDMwRTQxNEMyMjAKKzoxMDE2RDAwMDAzNzg5QUU2NDQxMDdGMDBGRTdDMDcxMjMzMjkxMjMyMDkKKzoxMDE2RTAwMDk3ODA1RDc4QURFNjI0MDRGNTgyMThFNjM0MDBGNTgzMzIKKzoxMDE2RjAwMEUwNTRFRkYwNzhBREU2MjQwNEY1ODIxOEU2MzQwMEY1MDYKKzoxMDE3MDAwMDgzRTA1NERGRjA3ODlBRTYyNEZENzVGMDBBQTQyNDE0RUYKKzoxMDE3MTAwMEY1ODJFNDM0RkNGNTgzQUM4MkFEODM3OEFBODY4MzA4MzUKKzoxMDE3MjAwMDg2ODJFQ0Y5RURGQTdCMEE3ODAxMTIwM0IwQzIwMzc4RTUKKzoxMDE3MzAwMDlBRTZGQzEyMTExNzdEMDA3QzBCMTIyNTQ3MTIzMjk3OTYKKzoxMDE3NDAwMDIyMTIzMjE0RTQ5MEZDMzlGMDdEMDI3QzAwMTIyNTQ3MEQKKzoxMDE3NTAwMDEyMzI5NzIyMTIzMjE0N0MwMDEyMjVFMDEyMzI5NzIyQTQKKzoxMDE3NjAwMDc0M0M5MEZCRTBGMDc0M0U5MEZCRTBGMEU0OTBGQzI4QzkKKzoxMDE3NzAwMEYwMjI4RDM1OEMzNEVDQjQwMTAyODAwM0QzNDAwMjgwMUEKKzoxMDE3ODAwMDI4QjQwMjAyODAwM0QzNDAwOEE4MzVFNjI1RTBGNjgwOUQKKzoxMDE3OTAwMDE4QjQwNDAyODAwM0QzNDAwQUE4MzVFNjI1RTAyNUUwMEEKKzoxMDE3QTAwMEY2ODAwNkE4MzU3NjAwODAwMDIyOEMzQzhEM0JFREZFNEQKKzoxMDE3QjAwMEVDRkQ3RjAxNzU2NjA2NzU2NzAwOTBGQzI5MTIwNDc3QzEKKzoxMDE3QzAwMDEyMDFFRkI0ODAwMjgwMDZEMzUwMDMwMjE4NzA5MEZDMUYKKzoxMDE3RDAwMDI5MTIwNDg5OTAwMDAzMTIwMUY1NTRGMEI0MzAwMjgwRkMKKzoxMDE3RTAwMDAzRDM0MDVGOTBGQzI5MTIwNDg5OTAwMDA4MTIwMjE3NkQKKzoxMDE3RjAwMEZBRkRFQkZFN0YwMTkwRkMyQzEyMDQ3N0VFQ0Q5MDM2QzMKKzoxMDE4MDAwMDlGRkNFNDkzRkY3NDAxOTNGRUY5RUZGQTdCMDFFQUZGN0EKKzoxMDE4MTAwMEU5RkVFQ0MzOUVFRDlGNDAyNTkwMzZBMUU0OTNGRDc0NTQKKzoxMDE4MjAwMDAxOTNGQ0VERkVFQ0ZEN0YwMUVFQ0RGQzkwRkMyRUUwODMKKzoxMDE4MzAwMEQzOUM5MEZDMkRFMDlENTAwNTc1NjY4MDgwMzMxMjE5NzUKKzoxMDE4NDAwMDhFODAyRUI0NjAwMjgwMDNEMzQwMEJBQzNDQUQzQjEyQzMKKzoxMDE4NTAwMDA3ODI4QzY2ODAxQkI0MTAwM0IzNDAxMEMzQjQyMDAzMEUKKzoxMDE4NjAwMEIzNDAwOUMzQjQ0MDAyODAwM0QzNDAwMDc1NjY4MTgwNTEKKzoxMDE4NzAwMDAwODA3NUI0ODEwMjgwMDNEMzQwNkI5MEZDMjkxMjA0NzAKKzoxMDE4ODAwMDg5OTAwMDAzMTIwMUY1NTRGMEI0MzAwMjgwMDNEMzQwNzQKKzoxMDE4OTAwMDFEOTBGQzI5MTIwNDg5OTAwMDA4MTIwMjE3RkFGREVCMzIKKzoxMDE4QTAwMEZFN0YwMTkwRkMyRjEyMDQ3NzEyMThGODgwMzZCNDYwODYKKzoxMDE4QjAwMDAyODAwM0QzNDAxMzc1M0E2N0U0RjUzOUY1MzhBQzNDNDAKKzoxMDE4QzAwMEFEM0IxMjA1REU4QzY2ODAxQkI0MTAwM0IzNDAxMEMzMjEKKzoxMDE4RDAwMEI0MjAwM0IzNDAwOUMzQjQ0MDAyODAwM0QzNDAwMDc1NzEKKzoxMDE4RTAwMDY2ODE4MDAwODAwMjgwMDBFNTY2RkM5MEZDMjkxMjA0N0QKKzoxMDE4RjAwMDg5RUM5MDAwMDIxMjAzMjBBQzY3MjI5MEZDMjkxMjA0QUMKKzoxMDE5MDAwMDg5OTAwMDA0MTIwMUY1NjAwNDc0MDE4MDAxRTRBMkUwRjIKKzoxMDE5MTAwMDkyMDE5MEZDMjkxMjA0ODlFRDI0MDNGRDUwMDEwRTkwRTAKKzoxMDE5MjAwMEZDMkMxMjA0Nzc5MEZDMjkxMjA0ODk5MDAwMDUxMjAxMDYKKzoxMDE5MzAwMEY1RjU2NzkwMDAwNDEyMDFGNTU0MEZGQzdENjcxMjE3NEUKKzoxMDE5NDAwMDZGRTU2NzcwMDQ3NTY2MDgyMjc1NjYwMDc4ODQ3NjAwMTYKKzoxMDE5NTAwMDc4ODRFNkMzOTU2NzUwMzg5MEZDMkYxMjA0ODkxMjAxRjEKKzoxMDE5NjAwMEVGRkM5MEZDMkMxMjA0ODlFQzEyMDMxODMwMDEwRTkwNEQKKzoxMDE5NzAwMEZDMzFFMDA0RjA5MEZDMzA3MDAzRTAwNEYwNzg4NDA2NjEKKzoxMDE5ODAwMDkwRkMyRUUwMDRGMDkwRkMyRDcwMDNFMDA0RjA4MEMwODkKKzoxMDE5OTAwMDIyOTBGQzJBRTBGREEzRTBGQ0VERkVFQ0ZEN0YwMUVERDIKKzoxMDE5QTAwMDI0MEFGRDUwMDEwRTkwRkMzMjEyMDQ3NzkwRkMyOTEyOUIKKzoxMDE5QjAwMDA0ODk5MDAwMDQxMjAxRjU1NDBGQjQwMTAyODAwM0QzOEUKKzoxMDE5QzAwMDQwMTc5MEZDMzIxMjA0ODkwREVENzAwMTBFOTBGQzJGMkYKKzoxMDE5RDAwMDEyMDQ3Nzc4ODg3NjAxODA0RUI0MDIwMjgwMDNEMzQwRTcKKzoxMDE5RTAwMDE5OTBGQzMyMTIwNDg5RUQyNDAyRkQ1MDAxMEU5MEZDODYKKzoxMDE5RjAwMDJGMTIwNDc3Nzg4ODc2MDI4MDJEQjQwNDAyODAwM0QzRjYKKzoxMDFBMDAwMDQwMTk5MEZDMzIxMjA0ODlFRDI0MDRGRDUwMDEwRTkwMUYKKzoxMDFBMTAwMEZDMkYxMjA0Nzc3ODg4NzYwNDgwMENCNDAwMDI4MDAzQ0YKKzoxMDFBMjAwMEQzNDAwMDc1NjYwODIyOTBGQzI5MTIwNDg5OTAwMDA1QjUKKzoxMDFBMzAwMDEyMDFGNUY1Njc3ODg1NzYwMDc4ODVFNkMzOTU2NzQwRUQKKzoxMDFBNDAwMDAzMDIxQUY2Nzg4Njc2MDA3ODg2RTZDMzc4ODg5NjUwODAKKzoxMDFBNTAwMDc2OTBGQzJDMTIwNDg5MTIwMUVGRkM5MEZDMzIxMjA0RTcKKzoxMDFBNjAwMDkyMTIwMUU5RjQ1Q0ZDMTIwMUU5Rjg5MEZDMkYxMjA0RDcKKzoxMDFBNzAwMDg5RThDMEUwMTIwMUVGQzhEMEUwQzg1ODRDRkM5MEZDRTcKKzoxMDFBODAwMDJDMTIwNDg5RUMxMjAzMTg3ODg3RUNGNjkwRkMzMUUwRjQKKzoxMDFBOTAwMDA0RjA5MEZDMzA3MDAzRTAwNEYwMDlFOTcwMDEwQTkwNTIKKzoxMDFBQTAwMEZDMzIxMjA0ODA5MEZDMjkxMjA0ODk5MDAwMDQxMjAxNzcKKzoxMDFBQjAwMEY1MzBFNDBFOTBGQzJFRTAwNEYwOTBGQzJENzAwM0UwNzUKKzoxMDFBQzAwMDA0RjA3ODg2MDY4MDgxNzg4OEU2RkRFNEZFRkZFRUNEOUUKKzoxMDFBRDAwMEZDOTBGQzMxRTAyQ0YwOTBGQzMwRTAzREYwNzg4OEU2QTIKKzoxMDFBRTAwMEZERTRGRUZGRUVDREZDOTBGQzM0RTAyQ0YwOTBGQzMzRTYKKzoxMDFBRjAwMEUwM0RGMDc4ODUwNjAyMUEzNjc1NjYwMDIyMjJDMEUwQzUKKzoxMDFCMDAwMEMwRjBDMDgyQzA4M0MwRDBFOEMwRTBFOUMwRTBFQUMwNTUKKzoxMDFCMTAwMEUwRUJDMEUwRUNDMEUwRURDMEUwRUVDMEUwRUZDMEUwMjQKKzoxMDFCMjAwMDkwRkY5MkUwMTIwMUMwMUI0OTMwMUI0OTMyMUI1ODM4MEMKKzoxMDFCMzAwMDFCNkEzQTFCN0MzRTFCOTQ0NDFCODg0NjFCQTA1MDFCMEYKKzoxMDFCNDAwMEUyNTIxQkMxNTQxQzAzNTYwMDAwMUMyNDkwRkY5MkUwN0IKKzoxMDFCNTAwMDdGMDBGRTdDMDExMjMzMjkwMjFDMzRFNEZGMDRGRTdDNkEKKzoxMDFCNjAwMDAzMTIzMzI5NzQyMDkwRkZGRUYwMDIxQzM0RTRGRjA0QkEKKzoxMDFCNzAwMEZFN0MwMjEyMzMyOTc0NDA5MEZGRkVGMDAyMUMzNEU0MTQKKzoxMDFCODAwMEZGMDRGRTdDMDQxMjMzMjkwMjFDMzRFNEZGMDRGRTdDQjMKKzoxMDFCOTAwMDA1MTIzMzI5MDIxQzM0RTRGRjA0RkU3QzA2MTIzMzI5QUIKKzoxMDFCQTAwMDAyMUMzNDkwRkZBNUUwN0QwMDkwRkJGOENERjBBM0NEQTIKKzoxMDFCQjAwMEYwOTBGQkY5RTBGQ0Y1ODM5MEZCRjhFMDQ0MzNGRDEyNzQKKzoxMDFCQzAwMDFDQzc4MDczOTBGRkI1RTA3RDAwOTBGQkZBQ0RGMEEzQjkKKzoxMDFCRDAwMENERjA5MEZCRkJFMEZDRjU4MzkwRkJGQUUwNDQ0M0ZEODUKKzoxMDFCRTAwMDEyMUNDNzgwNTI5MEZGQTZFMDdEMDA5MEZCRkNDREYwNTgKKzoxMDFCRjAwMEEzQ0RGMDkwRkJGREUwRkNGNTgzOTBGQkZDRTA0NDM0Q0EKKzoxMDFDMDAwMEZEMTIxQ0M3ODAzMTkwRkZCNkUwN0QwMDkwRkJGRUNEMzkKKzoxMDFDMTAwMEYwQTNDREYwOTBGQkZGRTBGQ0Y1ODM5MEZCRkVFMDQ0RTkKKzoxMDFDMjAwMDQ0RkQxMjFDQzc4MDEwOTBGRjkyRTA3RDAwRkNFRDQ0NDMKKzoxMDFDMzAwMEFBRkQxMjFDQzc4MDAwRTQ5MEZGOTJGMEQwRTBGRkQwMTQKKzoxMDFDNDAwMEUwRkVEMEUwRkREMEUwRkNEMEUwRkJEMEUwRkFEMEUwNTgKKzoxMDFDNTAwMEY5RDBFMEY4RDBEMEQwODNEMDgyRDBGMEQwRTAzMjA1RjcKKzoxMDFDNjAwMDgxMDU4MTA1ODEwNTgxQTg4MTE4MTgxOEVERjYwOEVDMTkKKzoxMDFDNzAwMEY2OTBGRjVBRTAyMEU3MDI4MEY3OTBGRjU5RTA3RDAwRTAKKzoxMDFDODAwMEE4ODExOENERjZDRDA4RjY3RDAzQTg4MUU2MThGQ0U2RkMKKzoxMDFDOTAwMENDMjVFMENDMzNDQ0RERjlDQ0Y2Q0MwOEY2QTg4MTE4MDUKKzoxMDFDQTAwMEU2NDRGOEY2QTg4MTE4MTgxOEU2RkQwOEU2RkNBODgxQjUKKzoxMDFDQjAwMDE4ODY4MzA4ODY4MkVERjBBM0VDRjA3NDAyOTBGRjVBMzgKKzoxMDFDQzAwMEYwMTU4MTE1ODExNTgxMTU4MTIyRTU4MTI0MDVGNTgxQTUKKzoxMDFDRDAwMEU0QTg4MTE4RjZBODgxMTgxODE4MThFREY2MDhFQ0Y2OTMKKzoxMDFDRTAwMDkwRkJGNUUwMjRGODUwMDMwMjFERThFNEE4ODExODE4RTEKKzoxMDFDRjAwMEY2QTg4MTE4RTZGRUE4ODExODE4MTgxOEU2RkQwOEU2NkYKKzoxMDFEMDAwMEZDN0YwMEVGMjRGODQwNERFNEVGMjVFMDI0N0RGNTgyRDAKKzoxMDFEMTAwMEU0MzRGQ0Y1ODNFMEZCQTNFMDZDNzAwM0ZBRUI2RDcwMzgKKzoxMDFEMjAwMDA5NzQwMUE4ODExODE4RjY4MDJCRTRFRjI1RTAyNDdEQzIKKzoxMDFEMzAwMEY1ODJFNDM0RkNGNTgzN0EwMEUwNTRGMENDRjhDQ0NEQTUKKzoxMDFENDAwMEY5Q0RGQjc4MDBFOTU0RjBGOUVBNjg3MDAyRUI2OTcwQUMKKzoxMDFENTAwMDAxMEUwRjgwQUVBODgxMThFRUY2QTg4MTE4MTgxODE4ODkKKzoxMDFENjAwMEVERjYwOEVDRjZBODgxRUZGNkE4ODExODE4RTY3MDc5NzAKKzoxMDFENzAwMEE4ODExOEU2MjRGNzQwNzFBODgxMTgxODE4MThFNjU0QUQKKzoxMDFEODAwMDBGQTg4MUY2NjQwNDYwMTdBODgxRTY2NDAzNjAxMEE4QjgKKzoxMDFEOTAwMDgxMTgxODE4MThFNkZEMDhFNkZDMTIxQzVDODA0QTdDQzUKKzoxMDFEQTAwMDBBMTIzMjg5QTg4MTE4MTgxODE4RTZGRDA4RTZGQzkwNzYKKzoxMDFEQjAwMEZCRjRFMDI1RTAyNDdERjU4MkU0MzRGQ0Y1ODNFREYwQ0UKKzoxMDFEQzAwMEEzRUNGMDkwRkJGNEUwRkZFNEVGMDQ1NDA3RkY5MEZCN0EKKzoxMDFERDAwMEY0RjA5MEZCRjVFMDA0RjAxMjMzMjI5MEZCRjZFMDcwOTMKKzoxMDFERTAwMDA4RTRGRUZGN0MwRjEyMzMyOTgwMjc5MEZCRjdFMDA0MDQKKzoxMDFERjAwMEYwNTQzRjcwMUQ5MEZCRjdFMDQ0RkU3RDAwRkM5MEZCMkIKKzoxMDFFMDAwMEY0RTAyNUUwMjQ3REY1ODJFNDM0RkNGNTgzRURGMEEzRDUKKzoxMDFFMTAwMEVDRjBFNTgxMjRGQkY1ODEyMjc4OEI3NjAwNzg4Qzc2RDYKKzoxMDFFMjAwMDAwNzQwMTkwRkJGNkYwMTIzMjE0OTBGQkY1RTA2MDU3NUQKKzoxMDFFMzAwMDdDMEExMjMyODk5MEZCRjNFMDI1RTAyNDdERjU4MkU0RjAKKzoxMDFFNDAwMDM0RkNGNTgzRTBGREEzRTBGQzkwRkJGM0UwMjVFMDI0MDcKKzoxMDFFNTAwMDdERjU4MkU0MzRGQ0Y1ODNFNEYwQTNGMDkwRkJGM0UwM0QKKzoxMDFFNjAwMEZGRTRFRjA0NTQwN0ZGOTBGQkYzRjA5MEZCRjVFMDE0NjAKKzoxMDFFNzAwMEYwNzg4OUVERjYwOEVDRjYxMjMzMjI3ODg5RTZGRDA4NTEKKzoxMDFFODAwMEU2RkMxMjA4RTU4MEEzMTIzMzc2OTBGRjkzRTA0NDAxNEMKKzoxMDFFOTAwMEYwQjJCMzc4OEIwNkI2MDAwRDc4OEI3NjAwNzg4Q0U2QkUKKzoxMDFFQTAwMEY0MDQwNDc4OENGNjgwODJFNDkwRkJGNkYwOTBGQkY1NjUKKzoxMDFFQjAwMEUwN0QwMEZDRUQ0NENGRkQxMjFDNUMxMjMyOTcyMjEyMzMKKzoxMDFFQzAwMDMyMTRFNTcwNjQ0OTQ1NkY2MDE1OTBGRjgzRTA1NDBGNEMKKzoxMDFFRDAwMDdEMDBEMzk1NzBFRDk1NkY1MDA1MTIzMDVEODAwMzEyMzMKKzoxMDFFRTAwMDMxMkQxMjMyOTcyMjEyMzIxNEU1NzA2NDQ5NDU2RjYwMjkKKzoxMDFFRjAwMDA1MTIzMTY3ODAwRTkwRkY4MEUwNDQwOEYwOTBGRjgzNjgKKzoxMDFGMDAwMEUwNTQ3RkYwMTIzMjk3MjIxMjMyMTQ4QzU0RUM1NEYwQzkKKzoxMDFGMTAwMEI0MTAxNTc1NkEzNTc1NjlGQzc1NjgwMUU1NkEyNDAzQTYKKzoxMDFGMjAwMEY1NkFFNTY5MzQwMEY1NjlFNEY1NTdGNTU2RTU1NkMzRjkKKzoxMDFGMzAwMDk0MDE1MDI3RTU1NDU0MEZGQ0FENkFBRTY5QUY2ODEyQTYKKzoxMDFGNDAwMDBFODI4QzU1RUM2MDAyODAxMjA1NkFFNTZBNzAwMjA1MEIKKzoxMDFGNTAwMDY5MDU1N0U1NTc3MDAyMDU1NjgwRDJFNTU0NTQwRjI0QTEKKzoxMDFGNjAwMEExRjhFNjU0RkVGNkU1NTQ1NDBGN0YwMEZFN0MxMjEyRjEKKzoxMDFGNzAwMDMzMjlFNTU1MTQ3MDA5N0QwMDdDMDkxMjI1NDc4MDA3MzcKKzoxMDFGODAwMEFENTc3QzAwMTIyNTQ3MTIzMjk3MjIxMjMyMTQ5MEZGNkYKKzoxMDFGOTAwMEZDRTA0NDAyRjA5MEZGMDBFMDMwRTcxMzkwRkY4M0UwQTQKKzoxMDFGQTAwMDQ0ODBGMDQzNkQ4MDkwRkZGQ0UwNDQwMUYwODAxMTkwOEMKKzoxMDFGQjAwMEZGODJFMDQ0MDhGMDUzNkQ3RjkwRkZGQ0UwNTRGRUYwOTgKKzoxMDFGQzAwMDkwRkY4MUUwNDQ4MEYwMTIyNUZBOTBGRkZFRTA0NDA1ODYKKzoxMDFGRDAwMEYwOTBGRkZDRTA1NEZERjAxMjMyOTcyMjEyMzIxNDdDOTQKKzoxMDFGRTAwMDAxMTIzM0Q3NzhCMUU2NDQwMkY2NzRGRUZDMDRGRDEyMDgKKzoxMDFGRjAwMDFDQzc5MEZGNUFFMDMwRTcwMjgwRjdFNEY1NEU3NTREQkMKKzoxMDIwMDAwMDEwQUM0RUFENERFNTRFMTU0RTcwMDIxNTRERUM0RDYwQzkKKzoxMDIwMTAwMDAyODBFRTQzODcwMTEyMzI5NzIyMTIzMjE0N0MwMjEyQTAKKzoxMDIwMjAwMDMyQTM3OEIxRTY1NEZERjYxMjMyOTcyMjEyMzIxNDc4QjgKKzoxMDIwMzAwMEIxRTYzMEUwMkM3OEIxRTYzMEUxMjY3OEIxRTZGQ0Y1ODcKKzoxMDIwNDAwMDgzMThFNjQ0RjBGRDEyMUM1QzkwRkZGQ0UwNDQyMEYwOTUKKzoxMDIwNTAwMDdDMDIxMjMzRDc3OEIxRTY1NEZERjY3NDFBOTBGRkZFNzUKKzoxMDIwNjAwMEYwNzhCMUU2RkNGNTgzMThFNjQ0RjFGRDEyMUM1QzEyMzEKKzoxMDIwNzAwMDMyOTcyMjc1NkQwMDkwRkZGRkUwNjAwMzQzNkQwMTc1OUMKKzoxMDIwODAwMDZFMDBFNEY1NkNGNTZCRTRGNTZGNzU3MDQ5NzQ4NDkwM0YKKzoxMDIwOTAwMEZGODJGMDc0ODQ5MEZGODBGMDc0ODA5MEZGNThGMDc0OTkKKzoxMDIwQTAwMDgwOTBGRjVBRjBBRDQ2QUY0NTdFMDBFRTI0RkU1MDAzMEYKKzoxMDIwQjAwMDAyMjEzRkU0RUU3NUYwMDdBNDI0N0ZGNTgyRTQzNEY4QjIKKzoxMDIwQzAwMEY1ODNFMEZGRTRFRjU0ODBGREU0RUY1NDBGMTRGRkVEREYKKzoxMDIwRDAwMDYwMzhFNEVGNzVGMDA4QTQyNDQ4RjU4MkU0MzRGRkY1OTUKKzoxMDIwRTAwMDgzNzQ5MEYwRTRFRjc1RjAwOEE0MjQ0QUY1ODJFNDM0OTgKKzoxMDIwRjAwMEZGRjU4Mzc0ODBGMEU0RUY3NUYwMDhBNDI0NEVGNTgyQjgKKzoxMDIxMDAwMEU0MzRGRkY1ODM3NDgwRjA4MDM0RTRFRjc1RjAwOEE0QzQKKzoxMDIxMTAwMDI0MDhGNTgyRTQzNEZGRjU4Mzc0OTBGMEU0RUY3NUYwNjEKKzoxMDIxMjAwMDA4QTQyNDBBRjU4MkU0MzRGRkY1ODNFNEYwRTRFRjc1QjMKKzoxMDIxMzAwMEYwMDhBNDI0MEVGNTgyRTQzNEZGRjU4M0U0RjAwRTAyRTcKKzoxMDIxNDAwMDIwQTg4RDQ2OEU0NDhGNDU3NDdGOTBGRkZERjA3NDkwREIKKzoxMDIxNTAwMDkwRkZGQ0YwMjI4QzU4RUMyNEY2NTAwNkU1NTgyNDM3MEEKKzoxMDIxNjAwMEZDMjJFNTU4MjQzMEZDMjJEMkIwRDJCMUMyQjQxMjI1RjAKKzoxMDIxNzAwMDQ0RUM3MDAzMDIyMjdGNzU1QzAzQUU1QjdGMDBFNTVDN0MKKzoxMDIxODAwMDE1NUM2NDgwMjQ3RjUwMzVFRjI0MDBGNTgyRTQzNEZCMzUKKzoxMDIxOTAwMEY1ODNFMEZFMjRGRTUwMUVFRjdEMDBGQ0U0RkI3NDc0MkEKKzoxMDIxQTAwMEMzOUNGQUVCOURGQkVFN0QwMEZDRUFDMzlDRUQ2NDgwRDIKKzoxMDIxQjAwMENCNjQ4MDlCNTAwMjgwMDVFRjJFRkY4MEMxOEU1QjhGMjkKKzoxMDIxQzAwMDVBRTU1QzY0ODAyNDdGNTAwMzAyMjI3RkU1NUEyNDhFMDYKKzoxMDIxRDAwMDUwMDMwMjIyN0Y4NTVBNUQ3NTVCMDBBRTVBQUY1QjkwNUIKKzoxMDIxRTAwMDM2Q0FFNDkzRjU1Q0U1NUMxNTVDNjQ4MDI0N0Y1MDE4ODYKKzoxMDIxRjAwMEVFMjQwMEY1ODJFNDM0RkJGNTgzRTBGQ0VGOTAzNkNBNzAKKzoxMDIyMDAwMDkzNkM3MDA0MEUwRjgwREU4RTVBOEY1QkU1NUM2NDgwRTkKKzoxMDIyMTAwMDI0N0Y0MDZFNzU1RTAxNzU2MEU4NzU1RkZGRTU1RDI0QTMKKzoxMDIyMjAwMDAyRjU1QTc1NUMwN0U1NUMzMzQwNTdBRDYwQUU1RkFGQjEKKzoxMDIyMzAwMDVFRTU1Q0Y1ODIzMzk1RTBGNTgzMTIwMUY1QzQ1NDBGMzkKKzoxMDIyNDAwMEZDMTIyMTUyRTU1QTI0MDBGNTgyRTQzNEZCRjU4M0VDQkMKKzoxMDIyNTAwMEYwMDU1QTA1NUFBRDYwQUU1RkFGNUVFNTVDRjU4MjMzQkUKKzoxMDIyNjAwMDk1RTBGNTgzMTIwMUY1NTQwRkZDMTIyMTUyRTU1QTI0MzIKKzoxMDIyNzAwMDAwRjU4MkU0MzRGQkY1ODNFQ0YwMDU1QTA1NUExNTVDNTEKKzoxMDIyODAwMDgwQTQ3NDAyOTBGODUxRjA5MEY4NkI3OUEzN0EzNjdCQjEKKzoxMDIyOTAwMDI3NzgwMTEyMDNGRTc1NkEzNTc1NjlGQzc1NjgwMUU0REIKKzoxMDIyQTAwMDkwRkY4M0YwNzQ4MDkwRkY4MUYwNzU1OTAyRTU1OTc1QjUKKzoxMDIyQjAwMEYwMDdBNDI0N0ZGNTgyRTQzNEY4RjU4M0UwNzg5M0Y2MDAKKzoxMDIyQzAwMEZDNTQwRjE0RkM3ODkzRUNGNkU1NTk3NUYwMDdBNDI0NDAKKzoxMDIyRDAwMDgxRjU4MkU0MzRGOEY1ODNFMDc4OTY3NkZEMDg3NkU4QjcKKzoxMDIyRTAwMEZDNzg5M0U2NzVGMDA4QTQyNDQ4RjU4MkU0MzRGRkY1MDEKKzoxMDIyRjAwMDgzRTRGMDc4OTNFNjc1RjAwOEE0MjQ0RkY1ODJFNDM0ODMKKzoxMDIzMDAwMEZGRjU4M0VDRjA3ODk2RTZGRjA4RTY3RTAzQ0ZDMzEzNzMKKzoxMDIzMTAwMENGMTNERUY5RkU3ODkzRTY3NUYwMDhBNDI0NDlGNTgyMjAKKzoxMDIzMjAwMEU0MzRGRkY1ODNFRUYwNzg5M0U2NzVGMDA4QTQyNDRBRDAKKzoxMDIzMzAwMEY1ODJFNDM0RkZGNTgzNzQ4MEYwNzg5NEVDRjY3RDAwNDgKKzoxMDIzNDAwMDc4OTdFNjJDRjYxOEU2M0RGNjc4OTZFNkZEMDhFNjdDRUEKKzoxMDIzNTAwMDAzQ0RDMzEzQ0QxM0RDRjlGQzc4OTNFNjc1RjAwOEE0MjQKKzoxMDIzNjAwMDI0NERGNTgyRTQzNEZGRjU4M0VDRjA3ODkzRTY3NUYwQzQKKzoxMDIzNzAwMDA4QTQyNDRFRjU4MkU0MzRGRkY1ODNFNEYwNzg5NkU2NzEKKzoxMDIzODAwMEZEMDhFNkZDNzg5M0U2RkY3RTAwRUUyNEZFNTAwMzAyOTMKKzoxMDIzOTAwMDI0RkVFNEVFNzVGMDA3QTQyNDdGRjU4MkU0MzRGOEY1MUEKKzoxMDIzQTAwMDgzRTBGRkU0RUY1NDgwRkFFNEVGNTQwRjE0RkZFNEVFMEYKKzoxMDIzQjAwMDc1RjAwN0E0MjQ4MUY1ODJFNDM0RjhGNTgzRTA3ODk0N0QKKzoxMDIzQzAwMEY2RTRFRTEzMTM1NDgwMjRGMEY4RTQzNEZERjlFOEZDNEQKKzoxMDIzRDAwMEU5RkQ4QTVBRUE3MDAzMDIyNDZCRTRFRjc1RjAwOEE0NjEKKzoxMDIzRTAwMDI0NDhGNTgyRTQzNEZGRjU4M0U0RjA3ODk0RTZGQUU0RDcKKzoxMDIzRjAwMEVGNzVGMDA4QTQyNDRGRjU4MkU0MzRGRkY1ODNFQUYwOEEKKzoxMDI0MDAwMEVERkJFQzdBMDNDQkMzMTNDQjEzREFGOUZBRTRFRjc1RTcKKzoxMDI0MTAwMEYwMDhBNDI0NDlGNTgyRTQzNEZGRjU4M0VBRjA3ODk0QzcKKzoxMDI0MjAwMEU2N0IwMEZBRUMyQUZDRUQzQkZERkJFQzdBMDNDQkMzMjgKKzoxMDI0MzAwMDEzQ0IxM0RBRjlGQUU0RUY3NUYwMDhBNDI0NERGNTgyMTIKKzoxMDI0NDAwMEU0MzRGRkY1ODNFQUYwRTRFRjc1RjAwOEE0MjQ0QUY1REMKKzoxMDI0NTAwMDgyRTQzNEZGRjU4Mzc0ODBGMEU0RUY3NUYwMDhBNDI0N0YKKzoxMDI0NjAwMDRFRjU4MkU0MzRGRkY1ODM3NDgwRjAwMjI0RkFFNEVGNDEKKzoxMDI0NzAwMDc1RjAwOEE0MjQwOEY1ODJFNDM0RkZGNTgzRTRGMDc4Q0QKKzoxMDI0ODAwMDk0RTZGQUU0RUY3NUYwMDhBNDI0MEZGNTgyRTQzNEZGMzMKKzoxMDI0OTAwMEY1ODNFQUYwRURGQkVDN0EwM0NCQzMxM0NCMTNEQUY5NDcKKzoxMDI0QTAwMEZBRTRFRjc1RjAwOEE0MjQwOUY1ODJFNDM0RkZGNTgzMUIKKzoxMDI0QjAwMEVBRjA3ODk0RTY3QjAwRkFFQzJBRkNFRDNCRkRGQkVDQkQKKzoxMDI0QzAwMDdBMDNDQkMzMTNDQjEzREFGOUZBRTRFRjc1RjAwOEE0NUYKKzoxMDI0RDAwMDI0MERGNTgyRTQzNEZGRjU4M0VBRjBFNEVGNzVGMDA4QUIKKzoxMDI0RTAwMEE0MjQwQUY1ODJFNDM0RkZGNTgzRTRGMEU0RUY3NUYwMDgKKzoxMDI0RjAwMDA4QTQyNDBFRjU4MkU0MzRGRkY1ODNFNEYwMEUwMjIzRjEKKzoxMDI1MDAwMDg3OEU1OTc4OTZFREY2MDhFQ0Y2Nzg5M0VGRjYxMjIwNjAKKzoxMDI1MTAwMDcwMjI4QzI2RUMzMEU3MThFNTI2NTQwRjE0NzVGMDA4NkQKKzoxMDI1MjAwMEE0MjQ0OEY1ODJFNDM0RkZGNTgzRTA1NERGRjA4MDE2RkMKKzoxMDI1MzAwMEU1MjY1NDBGMTQ3NUYwMDhBNDI0MDhGNTgyRTQzNEZGNEUKKzoxMDI1NDAwMEY1ODNFMDU0REZGMDIyN0MwMDIyRUM5MEZDMzdGMDhDMjUKKzoxMDI1NTAwMDI0RUQyNDAzRjUyNTdEMDBEMzk1NzJFRDk1NzE0MDAzOUMKKzoxMDI1NjAwMDg1NzIyNUU1MjUyNEI3NTAwOTc1MjUwMzc0MDI5MEZDNzIKKzoxMDI1NzAwMDM3RjBBQzI1MTIzMTUyMjJFNEY1NkNGNTZCMTIyNTdFNTIKKzoxMDI1ODAwMDIyOTBGQzM1RTA2NTczNjAwRTc0MDQ5MEZDMzdGMEU0MzMKKzoxMDI1OTAwMEY1NkI3NTZDMDM4MDQ2N0Q3M0U0RkVGRjc5MzU3QUZDM0MKKzoxMDI1QTAwMDdCMDE3NDA1NzgwMDEyMDM0OEU1NkMyNDAzRjU2Q0U1QTMKKzoxMDI1QjAwMDZCMzQwMEY1NkJFNTZDRDM5NTcyRTU2Qjk1NzE0MDA2NTUKKzoxMDI1QzAwMDg1NzI2Qzg1NzE2QkQzRTU2Qzk0NDhFNTZCOTQwMDQwMjMKKzoxMDI1RDAwMDBDNzQwMjkwRkMzN0YwRTRGNTZCNzU2QzAzQUM2QzEyNzQKKzoxMDI1RTAwMDMxNTIyMkVDOTBGQzM3RjBFNEY1NkNGNTZCOEMzMkVDNTgKKzoxMDI1RjAwMDYwMDUxMjMxNDM4MDA1N0MwMDEyMzE1MjIyOTBGRjkzMTYKKzoxMDI2MDAwMEUwNDQwMUYwQjJCMzkwRkYwNEUwRjU0QTkwRkYwNkUwMjkKKzoxMDI2MTAwMEZEQTNFMEVEN0QwMEZDN0QwMEZDOTBGRjA2RTBGRkEzNDQKKzoxMDI2MjAwMEUwN0UwMEZGRTRGRUVDNEVGQ0VENEZGREMzRUM5NDQ4NzEKKzoxMDI2MzAwMEVEOTQwMDUwMjI5MEZGMDZFMEZEQTNFMEVEN0QwMEZDNEMKKzoxMDI2NDAwMDdEMDBGQzkwRkYwNkUwRkZBM0UwN0UwMEZGRTRGRUVDQ0YKKzoxMDI2NTAwMDRFRkNFRDRGRkQ4MDA0RTRGRDdDNDg4QzcyOEQ3MTkwNDIKKzoxMDI2NjAwMEZGMDJFMEZEQTNFMEVEN0QwMEZDN0QwMEZDOTBGRjAyOTkKKzoxMDI2NzAwMEUwRkZBM0UwN0UwMEZGRTRGRUVDNEVGNTRDRUQ0RkY1RUQKKzoxMDI2ODAwMDRCNzU2QTM1NzU2OUZDNzU2ODAxN0QzNTdFRkM3RjAxODcKKzoxMDI2OTAwMDc5NzNFNEZBRkI3NDA1NzgwMDEyMDM0ODc1NDkwMEU1ODQKKzoxMDI2QTAwMDQ5MjRGRTQwMTlBRDZBQUU2OUFGNjhFNDEyMDMxODA1MEIKKzoxMDI2QjAwMDQ5MERFRDcwMDEwRThENkE4RTY5OEY2ODgwRTE3NTZBMzMKKzoxMDI2QzAwMDM1NzU2OUZDNzU2ODAxNzhCM0U2MTQxODQ2NjAwMzAyMzUKKzoxMDI2RDAwMDI3OTI3ODkwRTZGRjA4RTZGRTc4OEVFNEY2MDhGNkMzQzcKKzoxMDI2RTAwMDc4OEZFNjk0MDIxOEU2OTQwMDUwMURFNEZFRkZDM0VFRDYKKzoxMDI2RjAwMDk0RThFRjk0MDM1MDA3MEVCRTAwMDEwRjgwRjA3ODhGMkUKKzoxMDI3MDAwMDA2RTYxODcwMDEwNjgwRDc3ODkwRUZGNjA4RUVGNkQyNEMKKzoxMDI3MTAwMEI0Nzg5MEU2RkYwOEU2RkU3ODhFRTRGNjA4RjZDMzc4MTMKKzoxMDI3MjAwMDhGRTY5NDFFMThFNjk0MDA1MDFERTRGRUZGQzNFRTk0NUQKKzoxMDI3MzAwMEU4RUY5NDAzNTAwNzBFQkUwMDAxMEY4MEYwNzg4RjA2N0IKKzoxMDI3NDAwMEU2MTg3MDAxMDY4MEQ3Nzg5MEVGRjYwOEVFRjZDMkIxNzEKKzoxMDI3NTAwMDc4OTBFNkZGMDhFNkZFNzg4RUU0RjYwOEY2QzM3ODhGRjgKKzoxMDI3NjAwMEU2OTQzQTE4RTY5NDAwNTAxREU0RkVGRkMzRUU5NEU4QTgKKzoxMDI3NzAwMEVGOTQwMzUwMDcwRUJFMDAwMTBGODBGMDc4OEYwNkU2M0QKKzoxMDI3ODAwMDE4NzAwMTA2ODBENzc4OTBFRkY2MDhFRUY2RDJCMTc4OEYKKzoxMDI3OTAwMEIyRTRGNjA4RjY5MEZGMDBFMDU0NjBCNDAwMDI4MDA2NTAKKzoxMDI3QTAwMEQzNTAwMzAyMkQ5QkU1NEE1NDBGRjU0OUU1NEE1NDgwNjYKKzoxMDI3QjAwMEEyRTA5MjAyOTBGRjAxRTAxMjAxOEEwMDBCMkQ5NjI3MDEKKzoxMDI3QzAwMEQ0MjhGMjJEOTYyOUZFMkQ5NjJBRTEyQjE1MkM3QzJDNEYKKzoxMDI3RDAwMDdGMkNCRjJEM0YyRDZERTU2RDMwRTcwRUU1NEM0NTRCNTEKKzoxMDI3RTAwMDcwMDhFNTcyNjQwMjQ1NzE2MDAzMDIyRDk4OTBGRjAwNDUKKzoxMDI3RjAwMEUwNTQxRkI0MDAwMjgwMDNEMzQwMjlFNTRBNjAwMzAyN0QKKzoxMDI4MDAwMDI4RUZBRDZBQUU2OUFGNjg3NDAxMTIwMzE4NzhCMUU2QkIKKzoxMDI4MTAwMDMwRTAwQkFENkFBRTY5QUY2ODc0MDIxMjAzMTg3QzAyMzcKKzoxMDI4MjAwMDEyMzE1MjIyQjQwMTAyODAwM0QzNDAxQkU1NkQyMEUxMzYKKzoxMDI4MzAwMDA3RTU0QTYwMDMwMjI4RUZFNTRBMjRGRTUwMDMwMjI4MTgKKzoxMDI4NDAwMEVGN0MwMjEyMzE1MjIyQjQwMjAyODAwNkQzNTAwMzAyRkUKKzoxMDI4NTAwMDI4RURFNTZEMjBFMTBERTU0QTYwMDlFNTRBNjQ4MDYwRjgKKzoxMDI4NjAwMDAzMDIyOEVGQUM0QTEyMzFEOTQwMDMwMjI4RUZFNTQ5QjAKKzoxMDI4NzAwMDcwMjUzMDAyMTE5MEZGODBFMDU0MDhBRDZBQUU2OUFGNTgKKzoxMDI4ODAwMDY4MTIwMzE4ODAwRjkwRkY4MkUwNTQwOEFENkFBRTY5QTkKKzoxMDI4OTAwMEFGNjgxMjAzMTg4MDNEMTU0OTMwMDIxREU1NDk3NUYwRjcKKzoxMDI4QTAwMDA4QTQyNDQ4RjU4MkU0MzRGRkY1ODNFMDU0MDhBRDZBQjcKKzoxMDI4QjAwMEFFNjlBRjY4MTIwMzE4ODAxQkU1NDk3NUYwMDhBNDI0QkYKKzoxMDI4QzAwMDA4RjU4MkU0MzRGRkY1ODNFMDU0MDhBRDZBQUU2OUFGRTEKKzoxMDI4RDAwMDY4MTIwMzE4QUQ2QUFFNjlBRjY4MTIwMUVGNjAwQkFEMDQKKzoxMDI4RTAwMDZBQUU2OUFGNjg3NDAxMTIwMzE4N0MwMjEyMzE1MjIyNzkKKzoxMDI4RjAwMDgwMDAwMjJEOThFNTZEMjBFNzA2RTU3MjQ1NzE2MDAzQzIKKzoxMDI5MDAwMDAyMkQ5ODkwRkYwMEUwNTQxRkI0MDAwMjgwMDNEMzQwRDIKKzoxMDI5MTAwMDFBRTU0QzE0NDU0QjcwMDRFNTRBNjAwMzAyMjlGQjc4MjQKKzoxMDI5MjAwMEIxRTY1NEZFRjY3QzAwMTIzMTUyMjJCNDAxMDI4MDAzNUIKKzoxMDI5MzAwMEQzNDAyQUU1NkQyMEUxMDhFNTZEMjBFMDAzMDIyOUZCODQKKzoxMDI5NDAwMEU1NkQzMEUwMDRFNTRBNzAwQkU1NkQzMEUxMDlFNTRBREMKKzoxMDI5NTAwMDI0RkU1MDAzMDIyOUZCN0MwMDEyMzE1MjIyQjQwMjAyRjEKKzoxMDI5NjAwMDgwMDZEMzUwMDMwMjI5RjlFNTRDNDU0QjYwMDMwMjI5NDgKKzoxMDI5NzAwMEZCQUM0QTEyMzFEOTQwMDMwMjI5RkJFNTZEMjBFMTA3ODcKKzoxMDI5ODAwMEU1NkQyMEUwMDI4MDc3RTU2RDMwRTAwNkU1NDk2MDAyMDQKKzoxMDI5OTAwMDgwNkNFNTQ5NzAwRjkwRkY4MkUwNTRGN0YwOTBGRjgwNjMKKzoxMDI5QTAwMEUwNTRGN0YwMjJFNTQ5QjQwMTAyODAwM0QzNDAwOTdERTkKKzoxMDI5QjAwMDAxN0MwMzEyMEYxNDgwMTFCNDAyMDI4MDAzRDM0MDA5N0EKKzoxMDI5QzAwMDdEMDE3QzA0MTIwRjE0ODAwMDE1NDkzMDAyMTVFNTQ5ODEKKzoxMDI5RDAwMDc1RjAwOEE0MjQ0OEY1ODJFNDM0RkZGNTgzRTA1NEY3NDkKKzoxMDI5RTAwMEYwODAxM0U1NDk3NUYwMDhBNDI0MDhGNTgyRTQzNEZGNkIKKzoxMDI5RjAwMEY1ODNFMDU0RjdGMDdDMDAxMjMxNTIyMjgwMDAwMjJENjIKKzoxMDJBMDAwMDk4RTU2RDIwRTcwNkU1NzI0NTcxNjAwMzAyMkQ5ODkwMDgKKzoxMDJBMTAwMEZGMDBFMDU0MUZCNDAwMDI4MDAzRDM0MDFBRTU0QzE0QjkKKzoxMDJBMjAwMDQ1NEI3MDA0RTU0QTYwMDMwMjJBREU3OEIxRTY0NDAxQjIKKzoxMDJBMzAwMEY2N0MwMDEyMzE1MjIyQjQwMTAyODAwM0QzNDAyOUU1MTIKKzoxMDJBNDAwMDZEMjBFMTA4RTU2RDIwRTAwMzAyMkFERUU1NkQzMEUwNEYKKzoxMDJBNTAwMDA0RTU0OTcwMEJFNTZEMzBFMTA4RTU0OTI0RkU1MDAyQkMKKzoxMDJBNjAwMDgwN0Y3QzAwMTIzMTUyMjJCNDAyMDI4MDAzRDM0MDZGNzcKKzoxMDJBNzAwMEU1NEM0NTRCNjAwMjgwNjlBQzRBMTIzMUQ5NDAwMjgwNzYKKzoxMDJBODAwMDYwRTU2RDIwRTEwN0U1NkQyMEUwMDI4MDU0RTU0OTcwQzYKKzoxMDJBOTAwMDE0MzAwMjA5OTBGRjgwRTA0NDA4RjA4MDA3OTBGRjgyMjQKKzoxMDJBQTAwMEUwNDQwOEYwMjJFNTZEMzBFMTMzMTU0OTMwMDIxNUU1QzgKKzoxMDJBQjAwMDQ5NzVGMDA4QTQyNDQ4RjU4MkU0MzRGRkY1ODNFMDQ0MjYKKzoxMDJBQzAwMDA4RjA4MDEzRTU0OTc1RjAwOEE0MjQwOEY1ODJFNDM0ODEKKzoxMDJBRDAwMEZGRjU4M0UwNDQwOEYwN0MwMDEyMzE1MjIyODAwMjgwMkUKKzoxMDJBRTAwMDAwMDIyRDk4RTU2RDIwRTcxMkU1NzI0NTcxNzAwQ0U1NDYKKzoxMDJBRjAwMDRBNzAwODkwRkYwMEUwNTQxRjYwMDMwMjJEOThFNTRDRDcKKzoxMDJCMDAwMDkwRkZGRkYwOTBGRkZGRTA2MDA1NDM2RDAxODAwMzUzRUQKKzoxMDJCMTAwMDZERkU3QzAwMTIzMTUyMjJFNTZEMzBFNzBFRTU3MjQ1MDQKKzoxMDJCMjAwMDcxNjAwODkwRkYwMEUwNTQxRjYwMDMwMjJEOThBRDRCQzgKKzoxMDJCMzAwMEU1NENFRDdEMDBGQzdEMDBGQ0JEMDAwMjgwMDMwMjJDMTUKKzoxMDJCNDAwMDc3QjQwMTAyODAwM0QzNDAzMkU1NEE3MDA1RTU0Q0ZDQkUKKzoxMDJCNTAwMDYwMDMwMjJDNzk3NTZBNDA3NTY5Rjg3NTY4MDFEM0U1RTAKKzoxMDJCNjAwMDcyOTQxMkU1NzE5NDAwNDAwNkU0RkQ3QzEyODAwNEFDN0UKKzoxMDJCNzAwMDcyQUQ3MThDNzA4RDZGMTIzMTY3MjJCNDAyMDI4MDAzQzYKKzoxMDJCODAwMEQzNDA1OUU1NEE2MDAzMDIyQzc5RTU0Q0ZDNzAyNzc1NjcKKzoxMDJCOTAwMDZBNTI3NTY5Rjg3NTY4MDFEM0U1NzI5NDE5RTU3MTk0MDQKKzoxMDJCQTAwMDAwNDAwNkU0RkQ3QzE5ODAwNEFDNzJBRDcxOEM3MDhEMjAKKzoxMDJCQjAwMDZGMTIzMTY3ODAyNTc1NkE2Qjc1NjlGODc1NjgwMUQzODYKKzoxMDJCQzAwMEU1NzI5NDI3RTU3MTk0MDA0MDA2RTRGRDdDMjc4MDA0QkIKKzoxMDJCRDAwMEFDNzJBRDcxOEM3MDhENkYxMjMxNjcyMkI0MDMwMjgwQkMKKzoxMDJCRTAwMDA2RDM1MDAzMDIyQzc3RTU0Q0Y1NDk3MDBGOTBGRjA0OTMKKzoxMDJCRjAwMEUwRkRBM0UwNEQ2MDAzMDIyQzc5ODAxODkwRkIwMkUwMTkKKzoxMDJDMDAwMEZEQTNFMEZDOTBGRjA1RTA2QzcwMDc5MEZGMDRFMDZEMTEKKzoxMDJDMTAwMDYwMDI4MDY4RTRGNTcwRjU2RjdGMDBFNTQ5MTRDNTQ5RUUKKzoxMDJDMjAwMDYwMEZFRjI0MDBGNTgyRTQzNEZCRjU4M0UwMkZGRjgwOTIKKzoxMDJDMzAwMEVBOEY0QUU1NEEyNDAwRjU4MkU0MzRGQkY1ODNFMDdEMUYKKzoxMDJDNDAwMDAwRDM5NTcyRUQ5NTcxNDAwNkFDNzJBRDcxODAwRkU1QzEKKzoxMDJDNTAwMDRBMjQwMEY1ODJFNDM0RkJGNTgzRTA3RDAwRkM4QzcwQUYKKzoxMDJDNjAwMDhENkZFNTRBMjQwMEZDRTQzNEZCRkRGRUVDRkQ3RjAxQTIKKzoxMDJDNzAwMDhENkE4RTY5OEY2ODEyMzE2NzIyODAwMDAyMkQ5ODAyNUEKKzoxMDJDODAwMDJEOThFNTZEMzBFNzE5RTU3MjE0NDU3MTcwMTJFNTRBMkIKKzoxMDJDOTAwMDcwMEVFNTRDNDU0QjcwMDg5MEZGMDBFMDU0MUY2MDAzMzgKKzoxMDJDQTAwMDAyMkQ5OEU1NkQyMEUwMDhFNTZEMjBFMTAzMDIyRDk4RTYKKzoxMDJDQjAwMDc1NkE2RUU0RjU2OUY1NjhFNEY1NkYwNEY1NzAxMjMxMzQKKzoxMDJDQzAwMDY3MjJFNTZEMjBFNzI3RTU3MjQ1NzE3MDIxRTU0QTcwQkUKKzoxMDJDRDAwMDFERTU0QzY0MDI0NTRCNjAwREU1NEMxNDQ1NEI2MDA2MDgKKzoxMDJDRTAwMEU1NEM0NTRCNzAwODkwRkYwMEUwNTQxRjYwMDMwMjJEMzcKKzoxMDJDRjAwMDk4RTU2RDIwRTAwOEU1NkQyMEUxMDMwMjJEOTg4NTRDRjQKKzoxMDJEMDAwMDZFRTU2RTcwMTA0MzZEMDE1MzZERkREMkIwNzhCMkU0ODQKKzoxMDJEMTAwMEY2MDhGNjgwMjdFNTZFNjQwMjYwMDdFNTZFMTQ2MDAyMkYKKzoxMDJEMjAwMDgwNzk1MzZERkU0MzZEMDJFNTZFNjQwMjYwMDVFNTZFQzkKKzoxMDJEMzAwMDE0NzAwOTc4QjJFNEY2MDgwNEY2QzJCMDdDMDAxMjMxQ0YKKzoxMDJENDAwMDUyMjJFNTZEMzBFNzFBRTU3MjE0NDU3MTcwMTNFNTRBQjkKKzoxMDJENTAwMDcwMEZFNTRDNDU0QjcwMDk5MEZGMDBFMDU0MUYxNDYwNjQKKzoxMDJENjAwMDAyODAzOEU1NkQyMEUxMDI4MDMxN0MwMTEyMzE1MjIyNkYKKzoxMDJENzAwMEU1NkQyMEU3MTVFNTcyNDU3MTcwMEZFNTRDNDU0QjcwMjgKKzoxMDJEODAwMDA5OTBGRjAwRTA1NDFGMTQ2MDAyODAwRkU1NkQyMEUxMDAKKzoxMDJEOTAwMDAyODAwODdDMDAxMjMxNTIyMjgwMDAwMjMwNTlCNDQwNzcKKzoxMDJEQTAwMDAyODAwNkQzNTAwMzAyMzA0RjkwRkYwMUUwOTBGQzM1QzMKKzoxMDJEQjAwMEYwRTU0QTkwRkMzNkYwRTQ5MEZDMzdGMEU1NkEyNDAzMzUKKzoxMDJEQzAwMEY1NkFFNTY5MzQwMEY1NjlBRDRCRTU0Qzg1NkE4Mjg1QTUKKzoxMDJERDAwMDY5ODNDREYwQTNDREYwOTBGRjAxRTAxMjAxQzAyRTA2NzMKKzoxMDJERTAwMDAxMkUyQzAyMkU1NjAzMkU4MDA0MkVDRTA1MkYwQjA2MEMKKzoxMDJERjAwMDJGMzEwNzJGNTcwODJGODMwOTJGQTkwQjJGQ0YwQzJGMDcKKzoxMDJFMDAwMERFODAyRkRFODEwMDAwMzAzQ0U1NkQyMEU3MDY3QzA1OEEKKzoxMDJFMTAwMDEyMjVFMDIyN0Q1MjdFMzY3RjAyNzkzODdBRkM3QjAxRDIKKzoxMDJFMjAwMDc0MDg3ODAwMTIwMzQ4N0QwODdDMDAxMjI1NDcyMkU1Q0IKKzoxMDJFMzAwMDZEMjBFNzA2N0MwNTEyMjVFMDIyRTU0QUI0MDMwMDQwMzgKKzoxMDJFNDAwMDEwQjQwNTAwNTAwQkU1NEE3RjAwRkU3QzEwMTIzMzI5QjgKKzoxMDJFNTAwMDIyN0QwMDdDMDcxMjI1NDcyMkU1NkQyMEU3MDY3QzA1RDAKKzoxMDJFNjAwMDEyMjVFMDIyRTU0QUI0MDMwMDQwMTBCNDA1MDA1MDBCREYKKzoxMDJFNzAwMEU1NEE3RjAwRkU3QzExMTIzMzI5MjI3RDAwN0MwNzEyNzcKKzoxMDJFODAwMDI1NDcyMkU1NkQyMEU3MDY3QzA1MTIyNUUwMjJFNTRBNkMKKzoxMDJFOTAwMEI0MDUwMjgwMDNEMzQwMEFFNEZGMDRGRTdDMEExMjMzMjcKKzoxMDJFQTAwMDI5MjJCNDAxMDI4MDAzRDM0MDBBRTRGRjA0RkU3QzA4MTcKKzoxMDJFQjAwMDEyMzMyOTIyQjQwMzAwNDAxMEI0MDUwMDUwMEJFNTRBMzgKKzoxMDJFQzAwMDdGMDBGRTdDMTMxMjMzMjkyMjdEMDA3QzA3MTIyNTQ3RTgKKzoxMDJFRDAwMDIyRTU2RDIwRTczNEQzRTU3Mjk0NDhFNTcxOTQwMDUwMDMKKzoxMDJFRTAwMDA2RTU3MjQ1NzE3MDA2N0MwMjEyMjVFMDIyRTU0QUI0QkYKKzoxMDJFRjAwMDAxMDNCMzQwMEJDM0I0MDMwMDQwMDlCNDA2MDA1MDA0RkYKKzoxMDJGMDAwMDEyMzFGRjIyN0MwNzEyMjVFMDIyMTIyNTdFMjJFNTZENzgKKzoxMDJGMTAwMDIwRTcxREU1NEFCNDAzMDA0MDEwQjQwNTAwNTAwQkU1NUUKKzoxMDJGMjAwMDRBN0YwMEZFN0MxNjEyMzMyOTIyN0MwNzEyMjVFMDIyRkMKKzoxMDJGMzAwMDEyMjU3RTIyRTU2RDIwRTcxREU1NEFCNDAzMDA0MDEwMEUKKzoxMDJGNDAwMEI0MDUwMDUwMEJFNTRBN0YwMEZFN0MxOTEyMzMyOTIyOUMKKzoxMDJGNTAwMDdDMDcxMjI1RTAyMjEyMjU3RTIyRTU2RDIwRTcyMzc0RUUKKzoxMDJGNjAwMDgxOTBGRjkzRjBFNTRBQjQwMzAwNDAxMEI0MDUwMDUwOEYKKzoxMDJGNzAwMDBCRTU0QTdGMDBGRTdDMTcxMjMzMjkyMjdDMDcxMjI1QkQKKzoxMDJGODAwMEUwMjIxMjI1N0UyMkU1NkQyMEU3MURFNTRBQjQwMzAwMEMKKzoxMDJGOTAwMDQwMTBCNDA1MDA1MDBCRTU0QTdGMDBGRTdDMTgxMjMzNDgKKzoxMDJGQTAwMDI5MjI3QzA3MTIyNUUwMjIxMjI1N0UyMkU1NkQyMEU3RUEKKzoxMDJGQjAwMDFERTU0QUI0MDMwMDQwMTBCNDA1MDA1MDBCRTU0QTdGRkMKKzoxMDJGQzAwMDAwRkU3QzE1MTIzMzI5MjI3QzA3MTIyNUUwMjIxMjI1RUYKKzoxMDJGRDAwMDdFMjJFNTZEMjBFNzA2N0MwNzEyMjVFMDIyMTIyNTdFODEKKzoxMDJGRTAwMDIyRTU2RDMwRTcyMDkwRkYwMEUwNTQxRjcwMTA5MEZGNDUKKzoxMDJGRjAwMDAxRTBCNDgwMDUxMjI1NzU4MDAzMTIyNTdFMjI3RDAwMzQKKzoxMDMwMDAwMDdDMDUxMjI1NDcyMjkwRkYwMEUwNTQxRjYwMDY3QzA1RDYKKzoxMDMwMTAwMDEyMjVFMDIyRDNFNTcyOTQ0OEU1NzE5NDAwNTAwQkMzNjkKKzoxMDMwMjAwMEU1NzI5NDA3RTU3MTk0MDA1MDA2N0MwMzEyMjVFMDIyQjYKKzoxMDMwMzAwMEU1NEFCNDA1MDQxMjMxRkYyMjdDMDcxMjI1RTAyMkU1OUYKKzoxMDMwNDAwMDZEMzBFNzA4N0QwMDdDMDUxMjI1NDcyMjdDMDUxMjI1OUUKKzoxMDMwNTAwMEUwMjJCNDIwMDI4MDAzRDM0MDAwODAwMDEyMzEyRDIyRjAKKzoxMDMwNjAwMDc1NDMwMDkwRkY4M0UwNTQwRkQzOTU0MzQwMjRFNTQzMUMKKzoxMDMwNzAwMDI0RjBGNTgyRTQzNEZFRjU4M0UwQUQ2QUFFNjlBRjY4MTIKKzoxMDMwODAwMDEyMDMxODA1NDMwREVENzAwMTBFOEQ2QThFNjk4RjY4NkQKKzoxMDMwOTAwMDgwRDFFNTQzN0QwMEZDQzNFNTcwOUNGNTcwRTU2RjlEMzQKKzoxMDMwQTAwMEY1NkZFNTcwNDU2RjYwMDZFNDkwRkY4M0YwMjI5MEZGQjYKKzoxMDMwQjAwMDgyRTA0NDA4RjBFNEY1NkY3NTcwNDk5MEZDMzVFMEI0QTcKKzoxMDMwQzAwMDA1MDI4MDAzRDM0MDQwOTBGQzM2RTBGNTQzQjQwNTAyOEUKKzoxMDMwRDAwMDgwMDNEMzQwMEFFNEZGMDRGRTdDMEIxMjMzMjkyMkI0QTAKKzoxMDMwRTAwMDAxMDI4MDAzRDM0MDBBRTRGRjA0RkU3QzA5MTIzMzI5NjUKKzoxMDMwRjAwMDIyQjQwMzAwNDAxMEI0MDUwMDUwMEJFNTQzN0YwMEZFRUUKKzoxMDMxMDAwMDdDMTQxMjMzMjkyMjIyQjQ4MDAwNDAyM0I0ODIwMDUwNjAKKzoxMDMxMTAwMDFFN0MzNTdERkMxMjE3QTc3RDAwOEM2QzhENkI5MEZDOUUKKzoxMDMxMjAwMDM3RTA2MDA1MTIzMTJEODAwNTdDMDAxMjMxNTIyMjIyRDkKKzoxMDMxMzAwMDkwRkY4M0UwNTQ3RkYwOTBGRjgyRTA0NDA4RjA5MEZGMUUKKzoxMDMxNDAwMDgwRTA0NDA4RjAyMjkwRkY4MkUwNDQwOEYwOTBGRjgwODUKKzoxMDMxNTAwMEUwNDQwOEYwMjI4QzIzN0QwMDhDNzA4RDZGNzU2QTM1RjkKKzoxMDMxNjAwMDc1NjlGQzc1NjgwMTEyMzE2NzIyOTBGRjgzRTA1NDdGMTYKKzoxMDMxNzAwMEYwRTU3MDY0NDk0NTZGNzAwMTIyQzNFNTcwOTQwOEU1N0QKKzoxMDMxODAwMDZGOTQwMDQwMTU3NTIxMDhFNTIxN0QwMEZDQzNFNTcwQjIKKzoxMDMxOTAwMDlDRjU3MEU1NkY5REY1NkY4MDA5ODU3MDIxRTRGNTZGRjIKKzoxMDMxQTAwMDc1NzA0OTc1MjIwMEU1MjJDMzk1MjE1MDI2QUQ2QUFFOUYKKzoxMDMxQjAwMDY5QUY2ODEyMDFFRkZDRTUyMjI0RjhGNTgyRTQzNEZFRTEKKzoxMDMxQzAwMEY1ODNFQ0YwMDUyMjBERUQ3MDAxMEU4RDZBOEU2OThGOEUKKzoxMDMxRDAwMDY4ODBEM0U1MjE1NDdGOTBGRjgxRjAyMjhDNDg3RjAwRTYKKzoxMDMxRTAwMEVGMjRGRDQwMTlFNEVGNzVGMDA3QTQyNDdGRjU4MkU0OTUKKzoxMDMxRjAwMDM0RjhGNTgzRTA2NTQ4NzAwMkQzMjIwRjgwRTI4RjQ3RjAKKzoxMDMyMDAwMEMzMjI4NTcyNzA4NTcxNkY5MEZGODJFMDU0RjdGMDkwNTEKKzoxMDMyMTAwMEZGODNFMDU0N0ZGMDIyQzAwMEMwMDFDMDAyQzAwNkMwOUUKKzoxMDMyMjAwMDA3RTU3ODI0MDhGODg2MDY1MzA2N0Y3Q0ZGMTIzMjg5NkEKKzoxMDMyMzAwMDdDMDA3RDAwRTU3QjYwNDZGRjkwRkQ5NUUwNTQ3RjZFNEQKKzoxMDMyNDAwMDcwMEZDMDgzQzA4MkEzRTBGREEzRTBGQ0EzMTU3QjgwQzgKKzoxMDMyNTAwMDA3QTNBM0EzREZFNjgwMjZERjA2RDA4MkQwODM4MDFFRUIKKzoxMDMyNjAwMEUwRjhBM0UwRjlBM0UwRkFEMDgyRDA4M0U4RjBBM0U5ODQKKzoxMDMyNzAwMEYwQTNFQUYwQTNDMDgzQzA4MkEzQTNBMzgwREExMjMzMzEKKzoxMDMyODAwMDIyRDAwN0QwMDZEMDAyRDAwMUQwMDAyMjg1QTg3QTc1QkUKKzoxMDMyOTAwMEE4ODhFQzcwMDI3QzNGOEM3OTIyRTU3ODI0MDhGODc2QzcKKzoxMDMyQTAwMDAwMTIzMzc2ODBGQkMwMDBDMDAxQzAwMkMwMDZDMDA3MTgKKzoxMDMyQjAwMEFFMDQ3Q0ZGMTIzMjg5RTU3QjYwNDJGRjkwRkQ5NUUwMTEKKzoxMDMyQzAwMDU0N0Y2RTcwMEJDMDgzQzA4MkEzQTNBMzE1N0I4MDA3QkQKKzoxMDMyRDAwMEEzQTNBM0RGRUE4MDI2REYwNkQwODJEMDgzODBEOEUwRDQKKzoxMDMyRTAwMEY4QTNFMEY5QTNFMEZBRDA4MkQwODNFOEYwQTNFOUYwRjQKKzoxMDMyRjAwMEEzRUFGMEEzQzA4M0MwODJBM0EzQTM4MERBNzgwODA4NUUKKzoxMDMzMDAwMDc5MTgwOTdDMDFFNjU0N0Y2RTcwMDY3NjAwNzcwMDgwOUMKKzoxMDMzMTAwMDA2MDgwOTBDQkMwOEVFMTIzMzIyRDAwN0QwMDZEMDAyRjIKKzoxMDMzMjAwMEQwMDFEMDAwMjI3NTc5MDA4NTdBQTgyMkMwRjBDMDgyMzEKKzoxMDMzMzAwMEMwODNDM0U1N0IyNEU4NTAwNTEyMzM3NjgwRjRFQzYwNEIKKzoxMDMzNDAwMDMxOTAzNjUxRTQ5M0MzOUM0MDI4QzAwNDdDRkYxMjMyNzQKKzoxMDMzNTAwMDg5RDAwNDQzMDQ4MEU1N0I3NUYwMDNBNDI0OTVGNTgyQUQKKzoxMDMzNjAwMEU0MzRGREY1ODNFQ0YwRUZBM0YwRUVBM0YwMDU3QjEyNUYKKzoxMDMzNzAwMDMzMjJEMDgzRDA4MkQwRjAyMkMwMDQ3QzIwRDI4Q0QyRTEKKzoxMDMzODAwMDhERDUwNEZERDAwNDIyNzVBODAwNzU4ODAwNzVCODAwOUQKKzoxMDMzOTAwMDc1RjAwMDc1RDAwMEU0Rjg5MDAwMDBGNjA4QjgwMEZCNjYKKzoxMDMzQTAwMDAyMDAwMEMzRUQ5NDAyNTAwNDdEMDM3Q0U4RUNGNEZDQzEKKzoxMDMzQjAwMEVERjRGRDBDQkMwMDAxMEQ4QzdGOEQ3RTIyQzNFQzk0REUKKzoxMDMzQzAwMEJDRUQ5NDAyNTAwNDdEMDc3Q0QwRUNGNEZDRURGNEZERTAKKzoxMDMzRDAwMDBDQkMwMDAxMEQ4QzdEOEQ3QzIyRUM3MDAxMjJDMDAwQTQKKzoxMDMzRTAwMEU1NzgyNDE4RjhBNjA0RTU3ODI0MDhGOEM2NTQ3RkY2OTIKKzoxMDMzRjAwMEU2MzBFNzAzRDAwMDIyMTIzMzc2ODBGNEMyOEM4NTdDNUQKKzoxMDM0MDAwMDhDODU3RDhBRDI4Q0MwRTBDMEQwQzBGMEMwODJDMDgzRTEKKzoxMDM0MTAwMEMwMDBDMDAxQzAwMkMwMDNDMDA0QzAwNUMwMDZDMDA3OTAKKzoxMDM0MjAwMDEyMUFGQUU1NzgyNDA4RjhFNjYwMjRFNTc4MjQxMEY4MDIKKzoxMDM0MzAwMEE2ODFFNTc4NzVGMDIxQTQyNDhERjU4MkU0MzRGQ0Y1QUQKKzoxMDM0NDAwMDgzNzhCNEU1ODEwNEMzOThGOUU2RjAwOEEzRDlGQTc0NDcKKzoxMDM0NTAwMDA4MjU3OEY4MDU3ODA4RTY1NDgwNzAwQ0U1NzhCNDA3RkMKKzoxMDM0NjAwMEYzNzgwODc1NzgwMDgwRUZFNTc4MjQxMEY4ODY4MUU1MTgKKzoxMDM0NzAwMDc4NzVGMDIxQTQyNDhERjU4MkU0MzRGQ0Y1ODM3OEI0Q0EKKzoxMDM0ODAwMEU1ODEwNEMzOThGOUUwRjYwOEEzRDlGQUQwMDdEMDA2N0QKKzoxMDM0OTAwMEQwMDVEMDA0RDAwM0QwMDJEMDAxRDAwMEQwODNEMDgyOTgKKzoxMDM0QTAwMEQwRjBEMEQwRDBFMDMyQzBFMEMwRDBDMDAwQzAwMUMwNjkKKzoxMDM0QjAwMDAyQzI4RTg1N0U4RDg1N0Y4QkQyOEU3ODE5NzkwOTdBQUUKKzoxMDM0QzAwMDA3RTc3MDA0QTYwMDgwMEJFNjYwMDgxNkU2NzAwNEU3QzQKKzoxMDM0RDAwMDQ0ODBGNzA4MDlEQUVBRTU3OTYwMTMxNEY1Nzk3MDBFOEIKKzoxMDM0RTAwMEU1NzgyNDA4Rjg3NjAwMTIzMzIyRDI4Q0QyOEREMDAyRUYKKzoxMDM0RjAwMEQwMDFEMDAwRDBEMEQwRTAzMjc1ODFCMzc0MkE5MEZGRDMKKzoxMDM1MDAwMDkzRjA3NTdGMzA3NTdFRjg3NTdENjA3NTdDRjAxMjA1REYKKzoxMDM1MTAwMDQxMTIzNUFBMTIxNzVEOTBGRjkzRTA0NDAxRjBCMkIzNTcKKzoxMDM1MjAwMDEyMzVENDEyMzM4NDgwREEyMkMwMDA3QzAxRUMyNDA4RTYKKzoxMDM1MzAwMEY4RTY2MDA5MENCQzA4RjUxMjMzNzY4MEVFRDAwMDIyNjQKKzoxMDM1NDAwMEMwRjBDMDgyQzA4M0MwMDBDMDA2QzAwN0VEMjQxMEY4RTAKKzoxMDM1NTAwMDc2QzJFRDc1RjAyMUE0MjQ4REY1ODJFNDM0RkNGNTgzNjgKKzoxMDM1NjAwMEMwODJDMDgzQTNBM0U0NzgwREYwQTNEOEZDRUM1NDdGMDEKKzoxMDM1NzAwMDc1RjAwMkE0MjQxREY1ODJFNUYwMzQzNkY1ODNFNDkzNUEKKzoxMDM1ODAwMEZFNzQwMTkzRjU4MjhFODNFNDkzRkU3NDAxOTNGRkQwNjEKKzoxMDM1OTAwMDgzRDA4MkVGRjBBM0VFRjBFRDI0MDhGOEVDNDQ4MEY2M0YKKzoxMDM1QTAwMEQwMDdEMDA2RDAwMEQwODNEMDgyRDBGMDIyNzU3ODAwMkEKKzoxMDM1QjAwMDc1N0IwMDdBMDg3OTE4NzgwODc2MDA3NzAwMDgwOURBQjAKKzoxMDM1QzAwMEY4RTQ3ODA4NzQ4MDQ0N0ZGNjc0MDE0NDEwRjU4OTc1MzYKKzoxMDM1RDAwMEI4MDhEMkFCRDJBOTIyNzU4MUIzRDI4RUQyOENEMkFGMjkKKzoxMDM1RTAwMEU1N0I2MDMyRkY5MEZEOTVFMDU0ODA2MDI0NzgwODc5OTcKKzoxMDM1RjAwMDA4RTA1NDdGRkE3QjAwRTY1NDdGQjUwMjAyN0JGRjA4QTcKKzoxMDM2MDAwMEQ5RjVFQjcwMENFQUYwMTIzNTI2QUQwNEFDMDIxMjM1OTgKKzoxMDM2MTAwMDNEQTNBM0EzREZEMjEyMzM3NjgwQzU3QzAxN0QwMDIyQjcKKzoxMDM2MjAwMDA1MDAwNEY0MDRGODA0RUMwNEU4MDRFNDA0RjAwNEZDRTkKKzoxMDM2MzAwMDA0QTgwNEFDMDREODA0REMwNEE0MDRBNDA0QTQwNEUwOTYKKzoxMDM2NDAwMDA0QzAwNEI4MDRCQzA0QjQwNENDMDRDODA0QzQwNEQwNEEKKzoxMDM2NTAwMDA0RDQwNEIwMTkwMTAzMDAyMjAwNDgwMjAwNDgwRTMwQ0YKKzoxMDM2NjAwMDE0MjBDODFBRDAxODBBMEMwNTA2MDIwMzAxMDIwMDAxMzIKKzoxMDM2NzAwMENFMDE4MTAxMDAwMEMwMDA4MDAwNjAwMDMwMDAxODAwMTEKKzoxMDM2ODAwMDEwMDAwODAwMDQwMDAyMDAwMTAwMDgxODI4MzgwQzA1OEEKKzoxMDM2OTAwMDEwMEEwMjAwMDAwMDAwMDAwMzAxMTAwQTAyMDAwMDAwRUUKKzoxMDM2QTAwMDAwMDBGQkUwRkJGMjA5MDIyNzAwMDEwMjAwQTBGQTA5N0EKKzoxMDM2QjAwMDA0MDAwMDAzRkYwMDAwMDAwNzA1ODEwMjQwMDAwMDA3MkUKKzoxMDM2QzAwMDA1MDEwMjQwMDAwMDA3MDU4MzAzMDIwMDAxMjIwMzU0QTQKKzoxMDM2RDAwMDAwNTUwMDUzMDA0MjAwMzMwMDM0MDAzMTAwMzAwMDIwMTgKKzoxMDM2RTAwMDAwMjAwMDIwMDAyMDAwMjAwMDIwMDAyMDAwMjAwMDAwRkEKKzowMzM2RjAwMDAwMDAwMEQ3Cis6MDAwMDAwMDFGRgpkaWZmIC0tZ2l0IGEvZmlybXdhcmUvbXRzX2dzbS5mdy5paGV4IGIvZmlybXdhcmUvbXRzX2dzbS5mdy5paGV4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2YWQwY2IKLS0tIC9kZXYvbnVsbAorKysgYi9maXJtd2FyZS9tdHNfZ3NtLmZ3LmloZXgKQEAgLTAsMCArMSw4NjcgQEAKKzoxMDAwMDAwMDE0MzYwMDAyMDAxRTAyMUFGOUZGRkZGRkZGRkYwMjMzNDEKKzoxMDAwMTAwMDFERkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkYwMjMzOUIKKzoxMDAwMjAwMEM4NzU4MUNFOTBGREU4ODU4M0EwMTIzNTNDRUM0RDYwMEIKKzoxMDAwMzAwMDczNzhBQjgwMDM3NjAwMThCODlDRkE3ODdGODAwMzc2REIKKzoxMDAwNDAwMDAwMThCODY1RkE3ODIwODAwMzc2MDAxOEI4MjBGQTc4OEUKKzoxMDAwNTAwMDIwODAwMzc2MDAxOEI4MUZGQTkwRkREREFFODNBRjgyRDIKKzoxMDAwNjAwMDkwRkJGODEyMDBBQTYwMDVFNEYwQTM4MEY2OTBGREU4OEEKKzoxMDAwNzAwMEE4ODI5MEZERThBOTgyRTg2OTYwMDVFNEYyMDg4MEY3QUIKKzoxMDAwODAwMDkwMDEwODEyMDBCMzkwMDEwQzEyMDBCMzkwMDExMDEyRkQKKzoxMDAwOTAwMDAwQjM5MDAxMTQxMjAwRDE5MDAxMUExMjAwRDE5MDAxMDYKKzoxMDAwQTAwMDIwMTIwMEQxNzVEMDAwMTIzNDFBMDIwMTI2RUY2NTgyQTkKKzoxMDAwQjAwMDcwMDNFRTY1ODMyMkU0OTNGODc0MDE5M0Y5NzQwMjkzNUMKKzoxMDAwQzAwMEZFNzQwMzkzRjU4MjhFODNFODY5NzAwMTIyRTQ5M0Y2NEYKKzoxMDAwRDAwMEEzMDg4MEY0RTQ5M0ZDNzQwMTkzRkQ3NDAyOTNGRTc0MEUKKzoxMDAwRTAwMDAzOTNGRjc0MDQ5M0Y4NzQwNTkzRjU4Mjg4ODMxMjAwRDgKKzoxMDAwRjAwMEFBNzAwMTIyRTQ5M0EzQTg4M0E5ODI4QzgzOEQ4MkYwNDUKKzoxMDAxMDAwMEEzQUM4M0FEODI4ODgzODk4MjgwRTMyMTIxMDQ5QjgwMTQKKzoxMDAxMTAwMDgwMDQ5QkFDQUUwNDlCRkRFODA0OUQwNDlERkJGMzA0QUUKKzoxMDAxMjAwMEEyMDQ5REZCRjMwNTAyMDUwMjgwRkVEMEYwMzBGMDA5MjkKKzoxMDAxMzAwMDIwRjMwM0Y2ODAxMEY3ODAwRDMwRjEwOTIwRjMwM0YyNkQKKzoxMDAxNDAwMDgwMDRGMzgwMDFGMDIwRjQwNEZDRDBFMENDMjJDQ0MwODkKKzoxMDAxNTAwMEUwMTIwMTYzMDIwMTU0QkMwMDA1RDBGMEFDRjAyMkMzRjAKKzoxMDAxNjAwMDEzRENGQzAyMDEyQUJGMDAwOUVEMjU4Mjc1RjAwMUY4QkQKKzoxMDAxNzAwMEU2MjJCRjAxMEZFRDI1ODJGNTgyRUUzNTgzRjU4Mzc1MEEKKzoxMDAxODAwMEYwMDRFMDIyRUQyNTgyNzVGMDAyRjhFMjIyRDA4M0QwNUYKKzoxMDAxOTAwMDgyRjVGMEMzRTQ5M0EzQzVGMDk1RjBDMEUwQzNEMEYwQkUKKzoxMDAxQTAwMEU0OTNBMzk1RjA0MDEyQTNBM0MzRTVGMDMzNTAwMjA1RjYKKzoxMDAxQjAwMDgzMjU4MkY1ODI1MDAyMDU4Mzc0MDE5M0MwRTBFNDkzQTUKKzoxMDAxQzAwMEMwRTAyMkQwODNEMDgyRjVGMEU0OTM3MDA5NzQwMTkzRUIKKzoxMDAxRDAwMDcwMDRBM0EzODAwQzc0MDI5MzY1RjA2MDA1QTNBM0EzMkQKKzoxMDAxRTAwMDgwRTc3NDAxOTNDMEUwRTQ5M0MwRTAyMjEyMDI2NDAyNEQKKzoxMDAxRjAwMDAxRkIxMjAyQjgwMjAxRkIxMjAyREMwMjAxRkIzMEUwM0IKKzoxMDAyMDAwMDA3MjBFMzAyRTYyMkU3MjIzMEUxMDcyMEUzMDJFMjIyQjAKKzoxMDAyMTAwMEUzMjIzMEUyMDJFMDIyRTQ5MzIyMTIwMkRDMDIwMjIzMTMKKzoxMDAyMjAwMDEyMDJCODAyMDIyM0FCRjAxMjAyMkRDQkM1RjBDQjIyOTIKKzoxMDAyMzAwMDMwRTAxMDIwRTMwNkU2RjVGMDA4RTYyMkU3RjVGMDA5RTUKKzoxMDAyNDAwMEU3MTkyMjMwRTExMDIwRTMwNkUyRjVGMDA4RTIyMkUzQUMKKzoxMDAyNTAwMEY1RjAwOUUzMTkyMjMwRTIwNkUwRjVGMEEzRTAyMkU0MkMKKzoxMDAyNjAwMDkzRjVGMDc0MDE5MzIyQkIwMDAzNzQwOTIyQkIwMTA3Q0MKKzoxMDAyNzAwMDg5ODI4QTgzNzQwNDIyQkIwMjA3ODk4MjhBODM3NDEwNkMKKzoxMDAyODAwMDIyNzQwQTIyMDIwMjg0QkIwMDA3RTkyNTgyRjg3NDAxNjUKKzoxMDAyOTAwMDIyQkIwMTBERTkyNTgyRjU4MkVBMzU4M0Y1ODM3NDA0REEKKzoxMDAyQTAwMDIyQkIwMjBERTkyNTgyRjU4MkVBMzU4M0Y1ODM3NDEwQkQKKzoxMDAyQjAwMDIyRTkyNTgyRjg3NDAyMjIwMjAyQjhCRjAwMDVFREY4OTcKKzoxMDAyQzAwMDc0MDEyMkJGMDEwNzhEODI4RTgzNzQwNDIyQkYwMjA3NEUKKzoxMDAyRDAwMDhEODI4RTgzNzQxMDIyRURGODc0MDIyMjAyMDJEQ0JGM0MKKzoxMDAyRTAwMDAwMDdFRDI1ODJGODc0MDEyMkJGMDEwREVEMjU4MkY1OEUKKzoxMDAyRjAwMDgyRUUzNTgzRjU4Mzc0MDQyMkJGMDIwREVEMjU4MkY1NkQKKzoxMDAzMDAwMDgyRUUzNTgzRjU4Mzc0MTAyMkVEMjU4MkY4NzQwMjIyODMKKzoxMDAzMTAwMDAyMDMxMEMwRTAxMjAyNjQwMjAzMjhDMEUwMTIwMkI4MTcKKzoxMDAzMjAwMDAyMDMyOEMwRTAxMjAyREMwMjAzMjgzMEUwMEIyMEUzQzUKKzoxMDAzMzAwMDA0RDBFMEY2MjJEMEUwRjcyMjMwRTEwQjIwRTMwNEQwMzUKKzoxMDAzNDAwMEUwRjIyMkQwRTBGMzIyRDBFMEYwMjJDOUNEQzlDQUNFM0IKKzoxMDAzNTAwMENBQ0JDRkNCMTIwMzVCRURGOUVFRkFFRkZCMjJCQjAwNjkKKzoxMDAzNjAwMDJGQkYwMDBBRkFFREY4RTdGNjA4MDlEQUZBMjJCRjAxMTIKKzoxMDAzNzAwMDEyOEQ4MjhFODNGODAyMDM3ODA5QTNFN0YwRDhGQTIyNUYKKzoxMDAzODAwMDAyMDM4M0ZBRURGOEU3RjIwODA5REFGQTIyMDIwMzhEOTQKKzoxMDAzOTAwMEJCMDE0REJGMDAxNDg5ODI4QTgzRjlFREY4MDIwMzlGRTcKKzoxMDAzQTAwMDA4QTNFMEY2RDlGQTIyMDIwM0IwQkYwMTIyOEQ4MjhFQTMKKzoxMDAzQjAwMDgzRkIwOEM5QzU4MkM5Q0FDNTgzQ0FFMEEzQzlDNTgyNkYKKzoxMDAzQzAwMEM5Q0FDNTgzQ0FGMEEzREJFQUQ4RTgyMjAyMDNEMzhERTkKKzoxMDAzRDAwMDgyOEU4M0Y5RURGOEUwRjIwOEEzRDlGQTIyMDIwM0RENTgKKzoxMDAzRTAwMEJCMDI0REJGMDAxMjg5ODI4QTgzRjlFREY4MDIwM0VGNDgKKzoxMDAzRjAwMDA4QTNFNDkzRjZEOUY5MjJCRjAxMjM4RDgyOEU4M0ZCRjMKKzoxMDA0MDAwMDA4QzlDNTgyQzlDQUM1ODNDQUU0OTNBM0M5QzU4MkM5M0MKKzoxMDA0MTAwMENBQzU4M0NBRjBBM0RCRTlEOEU3MjIwMjA0MjI4OTgyOTUKKzoxMDA0MjAwMDhBODNGOUVERjhFNDkzRjIwOEEzRDlGOTIyMDIwNDMzQTAKKzoxMDA0MzAwMEJGMDAwREZBRURGOEUzRjYwODA5REFGQTIyMDIwNDNERUUKKzoxMDA0NDAwMEJGMDExMjhEODI4RTgzRjgwMjA0NEEwOUEzRTNGMEQ4MUIKKzoxMDA0NTAwMEZBMjIwMjA0NTVGQUVERjhFM0YyMDgwOURBRkEyMjAyNjgKKzoxMDA0NjAwMDA0NUZFNkZCMDhFNkZBMDhFNkY5MDRGNjE4NzAwMTA2RjAKKzoxMDA0NzAwMDIyRTZGRjA4RTZGRTA4RTZGRDIyRUZGMEEzRUVGMEEzNzkKKzoxMDA0ODAwMEVERjAyMkVCRjBBM0VBRjBBM0U5RjAyMkUwRkZBM0UwMTUKKzoxMDA0OTAwMEZFQTNFMEZEMjJFMEZCQTNFMEZBQTNFMEY5MjIwMDAwQzYKKzoxMDA0QTAwMDAwMDAwMDAwMDAwNTAyMDA2MTA1NzEwMDI2MDU5ODAwQUIKKzoxMDA0QjAwMDMzMEEwOTAwNjEwQTc1MDA2NjE1NDQwMDYxMENGOTAwRjEKKzoxMDA0QzAwMDYxMDlBOTAwNjEwOUUwMDA2MTBEQzAwMDYxMEJGMTAwNDQKKzoxMDA0RDAwMDYxMEExQzAwNjEwQTUxMDA2MTE3M0MwMDMzMTc0RjAwOEMKKzoxMDA0RTAwMDM0MUUxNDAwNDMxRUJGMDA0NDIwMkMwMDQ0MjAxQTAwNzgKKzoxMDA0RjAwMDQ3MUVFNjAwNDcxRjhCMDA0RDFGREMwMDRGMUYwODAwMDIKKzoxMDA1MDAwMDU4MzJBODAwNjE3Q0NDN0RGRjEyMUNDNTIyOTBGRkZDRjQKKzoxMDA1MTAwMEUwMjBFNzJEQzJBRkFFNTlBRjU4NzU1QTIwRTU1QTE0MDYKKzoxMDA1MjAwMEM1NUE2MDE5RTRGRTdGMDVFRTRGQ0UyNEZGQ0VDRjM0Q0UKKzoxMDA1MzAwMEZGQ0Y2MDA3RTQ5MEZGOTJGMDgwRUQ4MEUwOEU1OThGNEUKKzoxMDA1NDAwMDU4MjIxMjA1MEE3RDA3N0NCNzEyMzJDNDdEMEY3QzZFREIKKzoxMDA1NTAwMDEyMzJERTc4OUQ3QTA2RTRGNjA4REFGQzdBMDYxMjA1OTUKKzoxMDA1NjAwMENEN0MwMzEyMEU1NTEyMjE2OEU0RkVGRjdDMEYxMjMyN0YKKzoxMDA1NzAwMDRERDJBODIyMTIzMTM4RTQ5MEZDMzhGMDkwRkZGMEUwMjAKKzoxMDA1ODAwMDMwRTQwODc0MDE5MEZDMzlGMDgwMDVFNDkwRkMzOUYwMDcKKzoxMDA1OTAwMDdEMEE3QzAwMTIyNTQ2MTIzMUJCMjIxMjMxMzg5MEZDQjQKKzoxMDA1QTAwMDM5RTAxNDcwMEU5MEZGRjBFMDQ0MTBGMDdDMDAxMjI1NEEKKzoxMDA1QjAwMERGODAxOTkwRkMzOUUwNzAwRTkwRkZGMEUwNTRFRkYwMEUKKzoxMDA1QzAwMDdDMDAxMjI1REY4MDA1N0MxNzEyMjVERjEyMzFCQjIyNEIKKzoxMDA1RDAwMDkwRkZGMEUwNTRBQkYwOTBGRkYwRTA0NDIwRjAyMjhDNkMKKzoxMDA1RTAwMDM3OEQzNjc4ODJFREY2MDhFQ0Y2RURGRUVDRkQ3RjAxRjYKKzoxMDA1RjAwMDkwMDAwNTEyMDFGNTc4ODBGNjc4ODJFNkZEMDhFNkZDQTkKKzoxMDA2MDAwMEVERkVFQ0ZEN0YwMTkwMDAwNDEyMDFGNTU0MEZGQzdEMUUKKzoxMDA2MTAwMDgwMTIxNzZENzg4MEU2NzAwREFEM0FBRTM5QUYzOEU0RDAKKzoxMDA2MjAwMDEyMDMxODdDMDgyMjkwRkZGMEUwNTRGRUYwOTBGRkYwRDcKKzoxMDA2MzAwMEUwNTRGREYwODAxRTc4ODJFNkZEMDhFNkZDRURGRUVDNUQKKzoxMDA2NDAwMEZEN0YwMTkwMDAwODEyMDIxNzI1RTA0NDAxOTBGRkYzOUUKKzoxMDA2NTAwMEYwMDIwNkQ5Nzg4MkU2RkQwOEU2RkNFREZFRUNGRDdGQUYKKzoxMDA2NjAwMDAxOTAwMDA2MTIwMjE3NTRGRTkwRkZGM0YwODAyQjc4RTEKKzoxMDA2NzAwMDgyRTZGRDA4RTZGQ0VERkVFQ0ZEN0YwMTkwMDAwODEyMkQKKzoxMDA2ODAwMDAyMTdGQUVCOTBGRkYxRjAxMjA4Qzg0MDBEQUQzQUFFMzgKKzoxMDA2OTAwMDM5QUYzOEU0MTIwMzE4N0MxODIyNzg4MkU2RkQwOEU2QTgKKzoxMDA2QTAwMEZDRURGRUVDRkQ3RjAxOTAwMDA4MTIwMjE3OTBGRkYxQjcKKzoxMDA2QjAwMEYwMTIwOEM4NDAwREFEM0FBRTM5QUYzOEU0MTIwMzE4NTUKKzoxMDA2QzAwMDdDMTgyMjc4ODJFNkZEMDhFNkZDRURGRUVDRkQ3RjAxNTkKKzoxMDA2RDAwMDkwMDAwNjEyMDIxNzQ0MDE5MEZGRjNGMDc4ODNFNjI0OUQKKzoxMDA2RTAwMDAzRjYxOEU2MzQwMEY2Nzg4MEU2MjRGRTUwMDk5MEZGMDEKKzoxMDA2RjAwMEYwRTA1NEZERjA4MDA3OTBGRkYwRTA0NDAyRjBFNDkwNTkKKzoxMDA3MDAwMEZGRjFGMDc4ODE3NjAwNzg4MEU2MjRGRkZDRTQzNEZGODYKKzoxMDA3MTAwMEZENzg4MUU2N0YwMEZFRUNEMzlFRUY2NDgwQ0Q2NDgwOUYKKzoxMDA3MjAwMDlENDAyRjEyMDhBRDQwMEY3ODgxRTZBRDNBQUUzOUFGNEIKKzoxMDA3MzAwMDM4MTIwMzE4N0MxODIyOTBGRkYyRTBGQzc4ODI4NjgzM0UKKzoxMDA3NDAwMDA4ODY4MkVDRjA3ODgxMDZBMzc4ODJBNjgzMDhBNjgyQzgKKzoxMDA3NTAwMDgwQjUxMjA4QUQ0MDBGNzg4MUU2QUQzQUFFMzlBRjM4QkEKKzoxMDA3NjAwMDEyMDMxODdDMTgyMjkwRkZGMkUwRkM3ODgyODY4MzA4M0UKKzoxMDA3NzAwMDg2ODJFQ0YwNzg4MEU2QUQzQUFFMzlBRjM4MTIwMzE4RDUKKzoxMDA3ODAwMDdDMDAyMjhDMzc4RDM2Nzg4MkVERjYwOEVDRjZFREZFOTMKKzoxMDA3OTAwMEVDRkQ3RjAxOTAwMDA1MTIwMUY1Nzg4MUY2Nzg4MkU2ODQKKzoxMDA3QTAwMEZEMDhFNkZDRURGRUVDRkQ3RjAxOTAwMDA0MTIwMUY1NzIKKzoxMDA3QjAwMDU0MEZGQzdEODExMjE3NkQ3ODgxRTY3MDAzN0MwODIyNEUKKzoxMDA3QzAwMDkwRkZGMEUwNTRGRUYwOTBGRkYwRTA1NEZERjA4MDFCNEQKKzoxMDA3RDAwMDc4ODJFNkZEMDhFNkZDRURGRUVDRkQ3RjAxOTAwMDA4NjYKKzoxMDA3RTAwMDEyMDIxNzI1RTA5MEZGRjNGMDgwNUI3ODgyRTZGRDA4QTcKKzoxMDA3RjAwMEU2RkNFREZFRUNGRDdGMDE5MDAwMDYxMjAyMTc1NEZFQjAKKzoxMDA4MDAwMDkwRkZGM0YwODAyMTc4ODJFNkZEMDhFNkZDRURGRUVDMzcKKzoxMDA4MTAwMEZEN0YwMTkwMDAwODEyMDIxN0ZBRUI5MEZGRjFGMDEyMzEKKzoxMDA4MjAwMDA4Qzg0MDAzN0MxODIyNzg4MkU2RkQwOEU2RkNFREZFNEQKKzoxMDA4MzAwMEVDRkQ3RjAxOTAwMDA4MTIwMjE3OTBGRkYxRjAxMjA4MDIKKzoxMDA4NDAwMEM4NDAwMzdDMTgyMjc4ODNFNjI0MEFGNjE4RTYzNDAwQjAKKzoxMDA4NTAwMEY2Nzg4MDc2MDA3ODgxRTYyNEZGRkNFNDM0RkZGRDc4QUEKKzoxMDA4NjAwMDgwRTY3RjAwRkVFQ0QzOUVFRjY0ODBDRDY0ODA5RDQwRTcKKzoxMDA4NzAwMDIxNzg4Mjg2ODMwODg2ODJFMDkwRkZGMUYwMTIwOEM4MTIKKzoxMDA4ODAwMDQwMDM3QzE4MjI3ODgwMDY3ODgzMDZFNjE4NzAwMTA2RkIKKzoxMDA4OTAwMDgwQzM5MEZGRjBFMDQ0MDFGMDc4ODI4NjgzMDg4NjgyNkUKKzoxMDA4QTAwMEUwOTBGRkYxRjAxMjA4Qzg0MDAzN0MxODIyN0MwMDIyN0YKKzoxMDA4QjAwMDkwRkZGMEUwMjBFNzEyOTBGRkYwRTAzMEU1MDk5MEZGQjQKKzoxMDA4QzAwMEYwRTA0NDIwRjBDMzIyODBFN0QzMjI5MEZGRjBFMDIwNDQKKzoxMDA4RDAwMEUzMTI5MEZGRjBFMDMwRTUwOTkwRkZGMEUwNDQyMEYwRjMKKzoxMDA4RTAwMEMzMjI4MEU3RDMyMjhDNDI4RDQxN0MwMEVENTRGMEZEODEKKzoxMDA4RjAwMEVDNzAwM0VENjQzMDcwMDU3NTNFMDM4MDAzNzUzRTA0QjMKKzoxMDA5MDAwMEFDM0UxMjBGNzI3NTgzMDA4NTgzNDBFNTQxNTQwRkY1QUMKKzoxMDA5MTAwMDNGRTU0MDcwMDRFNTNGNjQwMzcwMzVFNTNFMjRGRDc1MTYKKzoxMDA5MjAwMEYwMEFBNDI0MDJGNTgyRTQzNEZDRjU4M0UwMzBFNjA1MDUKKzoxMDA5MzAwMDEyMTA1OTgwMTlFNTNFMjQ5REY4RTY1NEZCRjY3OEE5N0IKKzoxMDA5NDAwMEU2MjQwNUY1ODIxOEU2MzQwMEY1ODM3NDBGRjA4MDU5MkIKKzoxMDA5NTAwMEU1NDA3MDA0RTUzRjY0MDQ3MDQ4RTUzRTI0RkQ3NUYwMTEKKzoxMDA5NjAwMDBBQTQyNDAyRjU4MkU0MzRGQ0Y1ODNFMDMwRTUwN0FDMDgKKzoxMDA5NzAwMDQyQUQ0MTEyMUM1QUU1NDIzMEUyMTU3OEFERTYzMEUwNTYKKzoxMDA5ODAwMDBGNzhBREU2MzBFMTA5RTRGRjA0RkU3QzA0MTIzMjREM0QKKzoxMDA5OTAwMDc4QTlFNjI0MDZGNTgyMThFNjM0MDBGNTgzNzQwRkYwOTIKKzoxMDA5QTAwMDgwMDdFNEZDN0RFRTEyMUM1QUMyMDMyMjEyMzEzODEyNzkKKzoxMDA5QjAwMDBGNzI3OEE5RTYyNDA2RjU4MjE4RTYzNDAwRjU4M0UwODQKKzoxMDA5QzAwMDkwRkMzOEYwNzhBOUU2MjQwNUY1ODIxOEU2MzQwMEY1QTUKKzoxMDA5RDAwMDgzRTA5MEZDMzlGMEMyMDM3RDAyN0MwMDEyMjU0NjEyQjAKKzoxMDA5RTAwMDMxQkIyMjEyMzEzODc4OTVFQ0Y2RUMyNDlERjhFNjMwRDQKKzoxMDA5RjAwMEUxMDc3QzEzMTIyNURGODAwRjkwRkMzOUUwRkQ3ODk1MkMKKzoxMDBBMDAwMEU2RkMxMjEzRUYxMjI1REYxMjMxQkIyMjEyMzEzODc4QzcKKzoxMDBBMTAwMDk1RUNGNjdEMDAxMjBGMTIxMjI1REYxMjMxQkIyMjEyNjcKKzoxMDBBMjAwMDMxMzg3ODk1RUNGNkVDMjQ5REY4RTYzMEUyMDc3QzEzM0IKKzoxMDBBMzAwMDEyMjVERjgwMUI3ODk1RTYyNDlERjhFNjIwRTEwNzdDRUYKKzoxMDBBNDAwMDEyMTIyNURGODAwQTc4OTVFNkZDMTIxNDEzMTIyNURGQjYKKzoxMDBBNTAwMDEyMzFCQjIyMTIzMTM4Nzg5NUVDRjZFQzI0OURGOEU2ODEKKzoxMDBBNjAwMDIwRTIwNzdDMTExMjI1REY4MDBBNzg5NUU2RkMxMjE1M0EKKzoxMDBBNzAwMDE0MTIyNURGMTIzMUJCMjIxMjMxMzg3ODk1RUNGNjEyQjAKKzoxMDBBODAwMDBGNzI3OEE5RTYyNDA5RjU4MjE4RTYzNDAwRjU4M0UwQjAKKzoxMDBBOTAwMDkwRkMzRkYwNzhBOUU2MjQwQUY1ODIxOEU2MzQwMEY1QzgKKzoxMDBBQTAwMDgzRTA5MEZDNDBGMDc4QTlFNjI0MDNGNTgyMThFNjM0NTAKKzoxMDBBQjAwMDAwRjU4M0UwRkM3OEE5RTYyNDA0RjU4MjE4RTYzNDAwMEEKKzoxMDBBQzAwMEY1ODNFMEY1NjI3OEE5RTYyNDAyRjU4MjE4RTYzNDAwQTEKKzoxMDBBRDAwMEY1ODNFMEY1NjM4QzYxRTRFQzMzMzM1NDAxNzg5NUY2RUIKKzoxMDBBRTAwMDYwMDhFNTYyMzBFMTAzNzg5NTA2Nzg5NUU2OTBGQzQxNzAKKzoxMDBBRjAwMEYwNzhBN0U2MjQwMkY1ODIxOEU2MzQwMEY1ODNFMEZEREQKKzoxMDBCMDAwMEEzRTA1NDBDRkNFRDU0RTY4QzY1RjU2NEU1NjEzMEU1M0EKKzoxMDBCMTAwMDAzNDM2NTAxRTU2MjIwRTUwRUU1NjE1NDdGNzAwOEU1NTkKKzoxMDBCMjAwMDYxMjBFNzAzNDM2NTAyRTU2MTMwRTMwMzQzNjUxMEU1QjcKKzoxMDBCMzAwMDYxMzBFMjAzNDM2NTIwRTU2MTU0MDM2MDAzNDM2NTQwOEYKKzoxMDBCNDAwMEU1NjEzMEUxMDM0MzY1ODBFNTYxMzBFNDAzNDM2NDAxMUUKKzoxMDBCNTAwMEU1NjEzMEU2MDM0MzY0MDhFNTYyMjBFNDBFRTU2MTU0OTQKKzoxMDBCNjAwMDdGNzAwOEU1NjEyMEU3MDM0MzY0MTA1MzY1RkI1MzY0MUQKKzoxMDBCNzAwMEY5QUQ2NEU1NjU5MEZDM0FDREYwQTNDREYwRTU2MzMwQzYKKzoxMDBCODAwMEUzMERFNTYzNTQzMEM0NTQwRjkwRkMzREYwODAwNUU0NjAKKzoxMDBCOTAwMDkwRkMzREYwRTU2MzU0MDM5MEZDM0NGMEU1NjM1NDA0QTUKKzoxMDBCQTAwMEMzMTM5MEZDM0VGMDkwRkMzQ0UwNzAwRTdEMzU3RUZDNjMKKzoxMDBCQjAwMDdGMDE3NDAxOTAwMDA5MTIwMTRCNzhBOUU2MjQwOEY1MjEKKzoxMDBCQzAwMDgyMThFNjM0MDBGNTgzRTA3QzAwRkQ3OEE5RTYyNDA3NkUKKzoxMDBCRDAwMEY1ODIxOEU2MzQwMEY1ODNFMDdGMDA0Q0ZFRUY0RDkwN0YKKzoxMDBCRTAwMEZDMzhGMEEzQ0VGMENFQzIwMzdEMEE3QzAwMTIyNTQ2NkQKKzoxMDBCRjAwMDEyMzFCQjIyMTIzMTM4Nzg5NUVDRjY3ODlBNzYwMTA4REEKKzoxMDBDMDAwMDc2RkMwODc2Mzg3ODk3NzYwQzc4OUExMjA0NkUxMjAyODEKKzoxMDBDMTAwMDFENzg5OENCRjZDQjA4RjY3RjAwRUYyNEVBNDAxRkU0NUUKKzoxMDBDMjAwMEVGMjVFMDkwMzU3RUZEOTNDRDA0OTM3ODk5NjY3MDAzQUYKKzoxMDBDMzAwMEVEMTg2NjcwMDY3ODk3NzYwMDgwMDMwRjgwREM3ODk2NTIKKzoxMDBDNDAwMEVGRjY3ODlBMTIwNDZFOTAwMDAyMTIwMjE3Nzg5OENCOTEKKzoxMDBDNTAwMEY2Q0IwOEY2NTQwNENCNTQwNjRCNjAwNDc4OTc3NjBCMTkKKzoxMDBDNjAwMDc4OTlFNjMwRTMxMzc4OUExMjA0NkU5MDAwMDUxMjAxMjkKKzoxMDBDNzAwMEY1MjRGQjUwMDQ3ODk3NzYwRDc4OTlFNjU0QzA3RDAwRjIKKzoxMDBDODAwMDY0QzA0RDcwMDQ3ODk3NzYwQjc4OUExMjA0NkU5MDAwQzkKKzoxMDBDOTAwMDA0MTIwMUY1MjRGQzUwMDQ3ODk3NzYwRjc4OUExMjA0MTgKKzoxMDBDQTAwMDZFOTAwMDA2MTIwMUY1MjRGRDUwMDQ3ODk3NzYwRTc4QjgKKzoxMDBDQjAwMDlBMTIwNDZFOTAwMDA5MTIwMUY1MjRGRDUwMDQ3ODk3RjEKKzoxMDBDQzAwMDc2MEE3ODk3RTY3MDJBNzg5NUU2RkMxMjBGNzI3ODlBODEKKzoxMDBDRDAwMDEyMDQ2RTc4QTdFNkY5NzhBNkU2RkE3QjAxNzQwQTc4MjIKKzoxMDBDRTAwMDAwMTIwMzQ4QzIwMzc4OTVFNkZDMTIxMTE1Nzg5N0VDQzAKKzoxMDBDRjAwMEY2Nzg5N0U2RkMxMjI1REYxMjMxQkIyMjEyMzEzODc4RTQKKzoxMDBEMDAwMDk1RUNGNjEyMEY3Mjc4OTVFNjI0RkQ3NUYwMEFBNDI0OEUKKzoxMDBEMTAwMDE0RjU4MkU0MzRGQ0Y1ODNBQzgyQUQ4Mzc4QTY4NjgzMzcKKzoxMDBEMjAwMDA4ODY4MkVDRjlFREZBN0IwQTc4MDExMjAzQjBDMjAzNUYKKzoxMDBEMzAwMDc4OTVFNkZDMTIxMTE1MTIzMUJCMjI4RDJCOEMyQUVEMTEKKzoxMDBENDAwMDYwNDA3NTI3MDE3NTI5NDg3NTI4RkZFNTJBMjRGREZDQjgKKzoxMDBENTAwMEU0MzRGRkZERUM3QzAzMjVFMENEMzNDRERDRjlGQ0U1OEMKKzoxMDBENjAwMDI5MkNGNTI5RTUyODNERjUyOEFEMjlBRTI4QUYyNzc0QjMKKzoxMDBENzAwMDgwOTAwMDA2MTIwMzIwNzQ4MDkwMDAwMjEyMDMyMDEyNUIKKzoxMDBEODAwMDBGQzVFNTJCMTQ2MDNCNzUyNzAxNzUyOTA4NzUyOEZGRjEKKzoxMDBEOTAwMEU1MkEyNEZERkNFNDM0RkZGREVDN0MwMzI1RTBDRDMzQTMKKzoxMDBEQTAwMENERENGOUZDRTUyOTJDRjUyOUU1MjgzREY1MjhBRDI5MTAKKzoxMDBEQjAwMEFFMjhBRjI3RTQ5MDAwMDYxMjAzMjBFNDkwMDAwMjEyNTAKKzoxMDBEQzAwMDAzMjAyMjEyMzEzODc4OTVFQ0Y2RUMyNDlERjhFNjMwQjkKKzoxMDBERDAwMEUyMDk3ODk1RTZGQzEyMTUxNEQyMDA3ODk1RTZGQzEyMkIKKzoxMDBERTAwMDBGNzI3ODk2NzYwMDkwRkMzOUUwMzBFNzA0Nzg5Njc2QkEKKzoxMDBERjAwMDAxNzg5NkU2RkQ3ODk1RTZGQzEyMEQzOEMyMDMzMDAwQzYKKzoxMDBFMDAwMDA3Nzg5NUU2RkMxMjE0MTM3QzAwMTIyNURGMTIzMUJCMjMKKzoxMDBFMTAwMDIyNzhBOUU2MjQwNEY1ODIxOEU2MzQwMEY1ODNFMDQ0M0MKKzoxMDBFMjAwMDAxRjA3OEE5RTYyNDA0RjU4MjE4RTYzNDAwRjU4M0UwQTEKKzoxMDBFMzAwMDMwRTAwMjgwRUQ3OEE5RTYyNDBCRjU4MjE4RTYzNDAwNTQKKzoxMDBFNDAwMEY1ODNFMDU0RjhGMDc4QTlFNjI0MDJGNTgyMThFNjM0MzgKKzoxMDBFNTAwMDAwRjU4M0UwNDQ4MEYwMjJDMjAzOEM1ODEyMEY3Mjc4QjAKKzoxMDBFNjAwMEE2ODY4MzA4ODY4Mjc5QUY3QTM1N0IwQTc4MDExMjAzRDkKKzoxMDBFNzAwMEZFMTIwRTBFQUM1ODdEMDIxMjBEMzhDMjAzQUM1ODEyOTEKKzoxMDBFODAwMDExMTUyMjhENTM4RTUyOEY1MThDNTAxMjBGNzI3NTRGNDcKKzoxMDBFOTAwMDAwNzhBOUU2MjQwNUY1ODIxOEU2MzQwMEY1ODNFMDIwMDEKKzoxMDBFQTAwMEU0MUZFNTRGMjRGNjQwMTkwNTRGQzIwMzdDMTgxMjMyQTcKKzoxMDBFQjAwMEZCOTBGRjkzRTA0NDAxRjBCMkIzQUM1MDEyMEY3MjgwOEMKKzoxMDBFQzAwMEQwNzhBOUU2MjQwNUY1ODIxOEU2MzQwMEY1ODNFMDIwMDEKKzoxMDBFRDAwMEU0MDVDMjAzN0MwMjIyNzhBOUU2MjQwNUY1ODIxOEU2MUYKKzoxMDBFRTAwMDM0MDBGNTgzRTA1NDBGNjAxNjc4QTlFNjI0MDVGNTgyRjYKKzoxMDBFRjAwMDE4RTYzNDAwRjU4M0UwNTQwRkYwQzIwMzdDMDEyMjc4MzkKKzoxMDBGMDAwMEE4ODY4MzA4ODY4MkUwQUQ1M0FFNTJBRjUxMTIwMzE4MTMKKzoxMDBGMTAwMEMyMDM3QzAwMjI4RDMxOEMzMDEyMTUxNEU1MzE2MDBGMzQKKzoxMDBGMjAwMEU1MzBCNDAzMEE3QzAxMTIyNTBFN0M4MTEyMjUwRUFDM0IKKzoxMDBGMzAwMDMwMTIwRjcyRTUzMTYwMUE3OEFBODY4MzA4ODY4MkUwNDMKKzoxMDBGNDAwMDU0RTdGMEEzQTNBM0EzRTA1NEU3RjBBQzMwN0QwMjEyNzIKKzoxMDBGNTAwMDBEMzg3OEE2ODY4MzA4ODY4Mjc5Qjk3QTM1N0IwQTc4MzcKKzoxMDBGNjAwMDAxMTIwM0ZFQzIwM0U1MzAyNDlERjhFNjU0RkRGNkFDMDEKKzoxMDBGNzAwMDMwMTIxMTE1MjI4QzI2MzAwMzA1MTIzMjlBODBGODdDMkIKKzoxMDBGODAwMDBBMTIzMUFERDIwM0U1MjYyNEZENzhBM0Y2NzAwNzc4NjYKKzoxMDBGOTAwMEFBNzZGRjA4NzZFMDc4QTNFNjdEMDA3QzA0MjVFMENEMDQKKzoxMDBGQTAwMDMzQ0REQ0Y5RkMyNEEwNzhBOUY2RUQzNEZGMThGNjc4RUYKKzoxMDBGQjAwMEEzRTY3NUYwMEFBNDI0MDBGQ0U0MzRGQ0ZENzhBNkVENTkKKzoxMDBGQzAwMEY2MDhFQ0Y2MTIzMjQ2MjI3OEE5RTYyNDAyRjU4MjE4RDkKKzoxMDBGRDAwMEU2MzQwMEY1ODNFMDMwRTcyMjc4QTlFNjI0MDJGNTgyQzIKKzoxMDBGRTAwMDE4RTYzNDAwRjU4M0UwNTQ3RkYwNzhBOUU2MjQwMkY1OTIKKzoxMDBGRjAwMDgyMThFNjM0MDBGNTgzRTA0NDgwRjAyMjc4QUE4NjgzRTQKKzoxMDEwMDAwMDA4ODY4MkUwNTQ3RkYwQUQ4M0U1ODIyNDA0RkNFNDNENTEKKzoxMDEwMTAwMDhDODJGNTgzRTA1NDdGRjA3OEE5RTYyNDBCRjU4MjE4RTIKKzoxMDEwMjAwMEU2MzQwMEY1ODNFMDU0RjhGMDc4QUJFNjI0MDFGNTgyNkQKKzoxMDEwMzAwMDE4RTYzNDAwRjU4M0UwNDQwM0YwNzhBQkU2MjQwNUY1QzgKKzoxMDEwNDAwMDgyMThFNjM0MDBGNTgzRTA0NDAzRjA3OEE5RTYyNDA1MkQKKzoxMDEwNTAwMEY1ODIxOEU2MzQwMEY1ODM3NDBGRjAyMjc4QUE4NjgzQUYKKzoxMDEwNjAwMDA4ODY4MkUwNTQzRkYwQUQ4M0U1ODIyNDA0RkNFNDNEMzEKKzoxMDEwNzAwMDhDODJGNTgzRTA1NDNGRjA3OEEzRTYyNEE0RjhFNkZDRTQKKzoxMDEwODAwMDc4QUJFNjI0MDFGNTgyMThFNjM0MDBGNTgzRUNGMDc4QkQKKzoxMDEwOTAwMEEzRTYyNEE0RjhFNkZDNzhBQkU2MjQwNUY1ODIxOEU2N0UKKzoxMDEwQTAwMDM0MDBGNTgzRUNGMDc4QTlFNjI0MEJGNTgyMThFNjM0RDkKKzoxMDEwQjAwMDAwRjU4M0UwNTRGQjQ0MDJGNTI2NzhBN0U2MjQwMkY1MDgKKzoxMDEwQzAwMDgyMThFNjM0MDBGNTgzRTAzMEU1MDM0MzI2MDE3OEE5NzEKKzoxMDEwRDAwMEU2MjQwNUY1ODIxOEU2MzQwMEY1ODNFMDMwRTAwMzEyREIKKzoxMDEwRTAwMDBGQzVFNTI2RkM3OEE5RTYyNDBCRjU4MjE4RTYzNDAwNDYKKzoxMDEwRjAwMEY1ODNFQ0YwNzhBOUU2MjQwNUY1ODIxOEU2MzQwMEY1Q0UKKzoxMDExMDAwMDgzNzQwRkYwNzhBQTg2ODMwODg2ODJFMDQ0ODBGMEEzNzcKKzoxMDExMTAwMEEzQTNBM0UwNDQ4MEYwMjI4QzJBMTIwRjcyNzhBN0U2RTIKKzoxMDExMjAwMDI0MDhGNTgyMThFNjM0MDBGNTgzRTBGQzc4QTlFNjI0NkIKKzoxMDExMzAwMDBBRjU4MjE4RTYzNDAwRjU4M0VDRjA3OEE3RTYyNDA3NzgKKzoxMDExNDAwMEY1ODIxOEU2MzQwMEY1ODNFMEZDNzhBOUU2MjQwOUY1NzkKKzoxMDExNTAwMDgyMThFNjM0MDBGNTgzRUNGMDc4QTY4NjgzMDg4NjgyNTAKKzoxMDExNjAwMEUwRkRBM0UwRkNFREZFNzhBOUU2MjQwOEY1ODIxOEU2OTAKKzoxMDExNzAwMDM0MDBGNTgzRUVGMEVDRkU3OEE5RTYyNDA3RjU4MjE4M0EKKzoxMDExODAwMEU2MzQwMEY1ODNFRUYwOEMyOThEMjhDM0VDOTQwNUVENTAKKzoxMDExOTAwMDk0MEM0MDA1NzUyNzdDODAzM0QzRTUyOTk0MDFFNTI4MUMKKzoxMDExQTAwMDk0MDM0MDA1NzUyNzNDODAyM0QzRTUyOTk0ODFFNTI4RTUKKzoxMDExQjAwMDk0MDE0MDA1NzUyNzE4ODAxM0QzRTUyOTk0NjBFNTI4MkMKKzoxMDExQzAwMDk0MDA0MDA1NzUyNzBDODAwMzc1MjcwOEFGMjdFNEVGQ0UKKzoxMDExRDAwMDU0N0M0NDgzRkY4RjI3RTUyN0ZDNzhBQkU2MjQwMUY1OTgKKzoxMDExRTAwMDgyMThFNjM0MDBGNTgzRUNGMEU1MjdGQzc4QUJFNjI0QzIKKzoxMDExRjAwMDA1RjU4MjE4RTYzNDAwRjU4M0VDRjBFNTI3RkM3OEEzQ0EKKzoxMDEyMDAwMEU2MjRBNEY4RUNGNjc4QTlFNjI0MDJGNTgyMThFNjM0ODAKKzoxMDEyMTAwMDAwRjU4M0UwRjUyNzc4QTdFNjI0MDJGNTgyMThFNjM0ODYKKzoxMDEyMjAwMDAwRjU4M0EzRTAzMEUzMTc1MzI3Qzc3OEE3RTYyNDA1MkEKKzoxMDEyMzAwMEY1ODIxOEU2MzQwMEY1ODNFMDkwMzVBQTkzNDIyNzc4Q0EKKzoxMDEyNDAwMEE3RTYyNDAyRjU4MjE4RTYzNDAwRjU4M0UwMzBFNzA1Q0UKKzoxMDEyNTAwMDQzMjc0MDgwMDM1MzI3QkY1MzI3RkI3OEE3RTYyNDA2ODQKKzoxMDEyNjAwMEY1ODIxOEU2MzQwMEY1ODNFMDYwMDM0MzI3MDQ1MzI3MzIKKzoxMDEyNzAwMEZDNzhBN0U2MjQwNEY1ODIxOEU2MzQwMEY1ODNFMDQyMDIKKzoxMDEyODAwMDI3NDMyNzgwRTUyN0ZDNzhBOUU2MjQwMkY1ODIxOEU2QTMKKzoxMDEyOTAwMDM0MDBGNTgzRUNGMDc4QTlFNjI0MDRGNTgyMThFNjM0RUUKKzoxMDEyQTAwMDAwRjU4M0UwRjUyNzc4QTdFNjI0MDJGNTgyMThFNjM0RjYKKzoxMDEyQjAwMDAwRjU4M0EzRTAzMEUxMDU1MzI3REY4MDAzNDMyNzIwQjcKKzoxMDEyQzAwMDc4QTdFNjI0MDJGNTgyMThFNjM0MDBGNTgzRTAzMEU0REUKKzoxMDEyRDAwMDA1NTMyN0VGODAwMzQzMjcxMDc4QTdFNjI0MDlGNTgyRkEKKzoxMDEyRTAwMDE4RTYzNDAwRjU4M0UwQjQwMjAzNDMyNzAyRTUyN0ZDNDcKKzoxMDEyRjAwMDc4QTlFNjI0MDRGNTgyMThFNjM0MDBGNTgzRUNGMDc4NEEKKzoxMDEzMDAwMEE5RTYyNDAzRjU4MjE4RTYzNDAwRjU4M0UwRjUyNzc4OTIKKzoxMDEzMTAwMEE3RTYyNDA5RjU4MjE4RTYzNDAwRjU4M0UwNzAwNTUzNEEKKzoxMDEzMjAwMDI3N0Y4MDAzNDMyNzgwNzhBN0U2MjQwMkY1ODIxOEU2MEEKKzoxMDEzMzAwMDM0MDBGNTgzQTNFMDMwRTAwNTQzMjcyMDgwMDM1MzI3RTIKKzoxMDEzNDAwMERGNzhBN0U2MjQwMkY1ODIxOEU2MzQwMEY1ODNFMDMwNjIKKzoxMDEzNTAwMEUzMDU0MzI3NDA4MDAzNTMyN0JGNzhBN0U2MjQwMkY1MUYKKzoxMDEzNjAwMDgyMThFNjM0MDBGNTgzRTAzMEUwMDU0MzI3MTA4MDAzNUYKKzoxMDEzNzAwMDUzMjdFRjc4QTdFNjI0MDJGNTgyMThFNjM0MDBGNTgzQjgKKzoxMDEzODAwMEEzRTAzMEU0MDU0MzI3MDg4MDAzNTMyN0Y3NzhBN0U2NTYKKzoxMDEzOTAwMDI0MDJGNTgyMThFNjM0MDBGNTgzQTNFMDMwRTUwNTQzMjYKKzoxMDEzQTAwMDI3MDQ4MDAzNTMyN0ZCNzhBN0U2MjQwMkY1ODIxOEU2N0EKKzoxMDEzQjAwMDM0MDBGNTgzQTNFMDMwRTYwNTQzMjcwMTgwMDM1MzI3N0IKKzoxMDEzQzAwMEZFNzhBN0U2MjQwMkY1ODIxOEU2MzQwMEY1ODNBM0UwNTAKKzoxMDEzRDAwMDMwRTcwNTQzMjcwMjgwMDM1MzI3RkRFNTI3RkM3OEE5NjIKKzoxMDEzRTAwMEU2MjQwM0Y1ODIxOEU2MzQwMEY1ODNFQ0YwQzIwMzdDQjIKKzoxMDEzRjAwMDAwMjI4RDI3OEMyNkVENTQwMzE0NjAwMzdDMTAyMkU1MTcKKzoxMDE0MDAwMDI3NTQ3QzI0RkM0MDAzN0MwQjIyRTUyNjI0OURGOEU2MkYKKzoxMDE0MTAwMDQ0MDJGNjdDMDAyMjhDMzAxMjBGNzJFNTMwMjQ5REY4RDUKKzoxMDE0MjAwMEU2MjBFMjRGQUMzMDdEMDIxMjBEMzhFNTMwMjRGRTQ0NTgKKzoxMDE0MzAwMDI4RkM3OEFBODY4MzA4ODY4MkVDRjBBRjgzRTU4MjI0QjQKKzoxMDE0NDAwMDA0RkVFNDNGRkZFQzhFODI4RjgzRjA3QzAzOEMyQ0U1NUUKKzoxMDE0NTAwMDJDRkM3OEFCRTYyNDAxRjU4MjE4RTYzNDAwRjU4M0VDMjkKKzoxMDE0NjAwMEYwRTUyQ0ZDNzhBQkU2MjQwNUY1ODIxOEU2MzQwMEY1QUYKKzoxMDE0NzAwMDgzRUNGMDc1MkQwMTc1MkY0ODc1MkVGRkU1MzAyNEZEQTYKKzoxMDE0ODAwMEZDRTQzNEZGRkRFQzdDMDMyNUUwQ0QzM0NERENGOUZDM0UKKzoxMDE0OTAwMEU1MkYyQ0Y1MkZFNTJFM0RGNTJFNzhBQkU2MjQwNEY1NEYKKzoxMDE0QTAwMDgyMThFNjM0MDBGNTgzRTA1NEU3RjUyQ0FEMkZBRTJFMUMKKzoxMDE0QjAwMEFGMkRFNDkwMDAwMjEyMDMyMEU0OTAwMDA2MTIwMzIwRjYKKzoxMDE0QzAwMDEyMDFFRjMwRTUwMzQzMkMxMEU1MkNGQzc4QUJFNjI0NDkKKzoxMDE0RDAwMDA0RjU4MjE4RTYzNDAwRjU4M0VDRjAxMjEwNTk3OEE5NkYKKzoxMDE0RTAwMEU2MjQwNkY1ODIxOEU2MzQwMEY1ODNFMEMyMDNGQ0U1NDUKKzoxMDE0RjAwMDMwMjQ5REY4RTY0NDA0RjY4QzJDRTUzMDU0MEZDNDU0OTcKKzoxMDE1MDAwMEYwN0UwMEZGRUVFRjQ0MDQ3RDAwRkZFQzRFRkNFRDRGNUIKKzoxMDE1MTAwMEZEMTIxQ0M1N0MwMDIyOEMyRjEyMEY3MjEyMEZGOTc4NUQKKzoxMDE1MjAwMEFBODY4MzA4ODY4MkUwNTQwOEYwQTNBM0EzQTNFMDU0MEMKKzoxMDE1MzAwMDA4RjBBQzJGN0QwMjEyMEQzOEMyMDNFNTJGMjQ5REY4NzAKKzoxMDE1NDAwMEU2NTRGQkY2N0MwMDIyMTIzMTM4Nzg5NkVDRjZFQzI0NTcKKzoxMDE1NTAwMDlERjhFNjMwRTEwQTdEMDA3QzEzMTIyNTQ2MTIzMUJCNkUKKzoxMDE1NjAwMDc4OTZFNjI0OURGOEU2NDQwMUY2Nzg5NkU2RkMxMjBGOUMKKzoxMDE1NzAwMDcyNzg5NkU2MjRGRDc1RjAwQUE0MjQxNEY1ODJFNDM0MEEKKzoxMDE1ODAwMEZDRjU4Mzc4QTZFNkZBMDhFNkY5N0IwQTc4MDExMjAzRUYKKzoxMDE1OTAwMEIwNzhBNjg2ODMwODg2ODI3OUI5N0EzNTdCMEE3ODAxODUKKzoxMDE1QTAwMDEyMDNGRTEyMEZDNUMyMDM3ODk2RTZGQzEyMTExNTc4REQKKzoxMDE1QjAwMDk1RUNGNkVDNjAwQTdEMDA3QzA4MTIyNTQ2MTIzMUJCRTIKKzoxMDE1QzAwMDc4OTZFNkZDMTIwRjcyNzhBOUU2MjQwNEY1ODIxOEU2RjQKKzoxMDE1RDAwMDM0MDBGNTgzRTA0NDEwNTRERkZDNzhBOUU2MjQwNEY1RDgKKzoxMDE1RTAwMDgyMThFNjM0MDBGNTgzRUNGMDc4OTVFQ0Y2QzIwMzdDQzMKKzoxMDE1RjAwMEM4MTIzMkZCNzg5NkU2RkMxMjBGNzI3OEE5RTYyNDA0MzIKKzoxMDE2MDAwMEY1ODIxOEU2MzQwMEY1ODNFMDU0RUZGMEMyMDM3Q0M4OUQKKzoxMDE2MTAwMDEyMzJGQjc4OTZFNkZDMTIwRjcyNzhBOUU2MjQwNEY1RTQKKzoxMDE2MjAwMDgyMThFNjM0MDBGNTgzRTA0NDEwRjBDMjAzN0NDODEyNEYKKzoxMDE2MzAwMDMyRkI3ODk2RTZGQzEyMEY3Mjc4QTlFNjI0MDRGNTgyNTQKKzoxMDE2NDAwMDE4RTYzNDAwRjU4M0UwNDQyMEYwQzIwMzdDRjAxMjMyNDcKKzoxMDE2NTAwMEZCNzg5NkU2RkMxMjBGNzI3OEE5RTYyNDA1RjU4MjE4NEQKKzoxMDE2NjAwMEU2MzQwMEY1ODNFMDMwRTQxNUMyMDM3ODk2RTY0NDEwRDIKKzoxMDE2NzAwMDdGMDBGRTdDMDcxMjMyNEQxMjMxQkIwMjE3M0I3OEE5NjYKKzoxMDE2ODAwMEU2MjQwNEY1ODIxOEU2MzQwMEY1ODNFMDU0Q0ZGMEMyNzYKKzoxMDE2OTAwMDAzN0NDODEyMzJGQjc4OTZFNkZDMTIwRjcyNzhBOUU2M0EKKzoxMDE2QTAwMDI0MDRGNTgyMThFNjM0MDBGNTgzRTA0NDMwRjBDMjAzRTgKKzoxMDE2QjAwMDdDRjAxMjMyRkI3ODk2RTZGQzEyMEY3Mjc4QTlFNjI0RDEKKzoxMDE2QzAwMDA1RjU4MjE4RTYzNDAwRjU4M0UwMzBFNDE0QzIwMzc4QUYKKzoxMDE2RDAwMDk2RTY0NDEwN0YwMEZFN0MwNzEyMzI0RDEyMzFCQjgwMkIKKzoxMDE2RTAwMDVENzhBOUU2MjQwNEY1ODIxOEU2MzQwMEY1ODNFMDU0MTkKKzoxMDE2RjAwMEVGRjA3OEE5RTYyNDA0RjU4MjE4RTYzNDAwRjU4M0UwREIKKzoxMDE3MDAwMDU0REZGMDc4OTZFNjI0RkQ3NUYwMEFBNDI0MTRGNTgyREYKKzoxMDE3MTAwMEU0MzRGQ0Y1ODNBQzgyQUQ4Mzc4QTY4NjgzMDg4NjgyQTgKKzoxMDE3MjAwMEVDRjlFREZBN0IwQTc4MDExMjAzQjBDMjAzNzg5NkU2NzEKKzoxMDE3MzAwMEZDMTIxMTE1N0QwMDdDMEIxMjI1NDYxMjMxQkIyMjEyQzIKKzoxMDE3NDAwMDMxMzhFNDkwRkMzOUYwN0QwMjdDMDAxMjI1NDYxMjMxREMKKzoxMDE3NTAwMEJCMjIxMjMxMzg3QzAwMTIyNURGMTIzMUJCMjI3NDNDQ0YKKzoxMDE3NjAwMDkwRkJFMEYwNzQzRTkwRkJFMEYwRTQ5MEZDMjhGMDIyNjcKKzoxMDE3NzAwMDhEMzU4QzM0RUNCNDAxMDI4MDAzRDM0MDAyODAyOEI0NTAKKzoxMDE3ODAwMDAyMDI4MDAzRDM0MDA4QTgzNUU2MjVFMEY2ODAxOEI0QUQKKzoxMDE3OTAwMDA0MDI4MDAzRDM0MDBBQTgzNUU2MjVFMDI1RTBGNjgwNjAKKzoxMDE3QTAwMDA2QTgzNTc2MDA4MDAwMjI4QzNDOEQzQkVERkVFQ0ZEREEKKzoxMDE3QjAwMDdGMDE3NTY2MDY3NTY3MDA5MEZDMjkxMjA0NzcxMjAxOTcKKzoxMDE3QzAwMEVGQjQ4MDAyODAwNkQzNTAwMzAyMTg2RTkwRkMyOTEyRjkKKzoxMDE3RDAwMDA0ODk5MDAwMDMxMjAxRjU1NEYwQjQzMDAyODAwM0QzNjEKKzoxMDE3RTAwMDQwNUY5MEZDMjkxMjA0ODk5MDAwMDgxMjAyMTdGQUZENEMKKzoxMDE3RjAwMEVCRkU3RjAxOTBGQzJDMTIwNDc3RUVDRDkwMzVDM0ZDRkMKKzoxMDE4MDAwMEU0OTNGRjc0MDE5M0ZFRjlFRkZBN0IwMUVBRkZFOUZFMkUKKzoxMDE4MTAwMEVDQzM5RUVEOUY0MDI1OTAzNUM1RTQ5M0ZENzQwMTkzODQKKzoxMDE4MjAwMEZDRURGRUVDRkQ3RjAxRUVDREZDOTBGQzJFRTBEMzlDQTgKKzoxMDE4MzAwMDkwRkMyREUwOUQ1MDA1NzU2NjgwODAzMzEyMTk4QzgwRDgKKzoxMDE4NDAwMDJFQjQ2MDAyODAwM0QzNDAwQkFDM0NBRDNCMTIwNzgwNEEKKzoxMDE4NTAwMDhDNjY4MDFCQjQxMDAzQjM0MDEwQzNCNDIwMDNCMzQwQTQKKzoxMDE4NjAwMDA5QzNCNDQwMDI4MDAzRDM0MDAwNzU2NjgxODAwMDgwQzQKKzoxMDE4NzAwMDc1QjQ4MTAyODAwM0QzNDA2QjkwRkMyOTEyMDQ4OTkwRDcKKzoxMDE4ODAwMDAwMDMxMjAxRjU1NEYwQjQzMDAyODAwM0QzNDAxRDkwRTAKKzoxMDE4OTAwMEZDMjkxMjA0ODk5MDAwMDgxMjAyMTdGQUZERUJGRTdGNjIKKzoxMDE4QTAwMDAxOTBGQzJGMTIwNDc3MTIxOEY2ODAzNkI0NjAwMjgwODMKKzoxMDE4QjAwMDAzRDM0MDEzNzUzQTY3RTRGNTM5RjUzOEFDM0NBRDNCREEKKzoxMDE4QzAwMDEyMDVEQzhDNjY4MDFCQjQxMDAzQjM0MDEwQzNCNDIwMzcKKzoxMDE4RDAwMDAzQjM0MDA5QzNCNDQwMDI4MDAzRDM0MDAwNzU2NjgxNUUKKzoxMDE4RTAwMDgwMDA4MDAyODAwMEU1NjZGQzkwRkMyOTEyMDQ4OUVDRUYKKzoxMDE4RjAwMDkwMDAwMjEyMDMyMEFDNjcyMjkwRkMyOTEyMDQ4OTkwMDgKKzoxMDE5MDAwMDAwMDQxMjAxRjU2MDA0NzQwMTgwMDFFNEEyRTA5MjAxNzgKKzoxMDE5MTAwMDkwRkMyOTEyMDQ4OUVEMjQwM0ZENTAwMTBFOTBGQzJDNEIKKzoxMDE5MjAwMDEyMDQ3NzkwRkMyOTEyMDQ4OTkwMDAwNTEyMDFGNUY1NDQKKzoxMDE5MzAwMDY3OTAwMDA0MTIwMUY1NTQwRkZDN0Q2NzEyMTc2REU1RTYKKzoxMDE5NDAwMDY3NzAwNDc1NjYwODIyNzU2NjAwNzg4NDc2MDA3ODg0NkUKKzoxMDE5NTAwMEU2QzM5NTY3NTAzODkwRkMyRjEyMDQ4OTEyMDFFRkZDMDIKKzoxMDE5NjAwMDkwRkMyQzEyMDQ4OUVDMTIwMzE4MzAwMTBFOTBGQzMxMEIKKzoxMDE5NzAwMEUwMDRGMDkwRkMzMDcwMDNFMDA0RjA3ODg0MDY5MEZDMDIKKzoxMDE5ODAwMDJFRTAwNEYwOTBGQzJENzAwM0UwMDRGMDgwQzAyMjkwNjMKKzoxMDE5OTAwMEZDMkFFMEZEQTNFMEZDRURGRUVDRkQ3RjAxRUQyNDBBNTYKKzoxMDE5QTAwMEZENTAwMTBFOTBGQzMyMTIwNDc3OTBGQzI5MTIwNDg5M0MKKzoxMDE5QjAwMDkwMDAwNDEyMDFGNTU0MEZCNDAxMDI4MDAzRDM0MDE3QzQKKzoxMDE5QzAwMDkwRkMzMjEyMDQ4OTBERUQ3MDAxMEU5MEZDMkYxMjA0NzAKKzoxMDE5RDAwMDc3Nzg4ODc2MDE4MDRFQjQwMjAyODAwM0QzNDAxOTkwNTQKKzoxMDE5RTAwMEZDMzIxMjA0ODlFRDI0MDJGRDUwMDEwRTkwRkMyRjEyRUUKKzoxMDE5RjAwMDA0Nzc3ODg4NzYwMjgwMkRCNDA0MDI4MDAzRDM0MDE5REUKKzoxMDFBMDAwMDkwRkMzMjEyMDQ4OUVEMjQwNEZENTAwMTBFOTBGQzJGNEQKKzoxMDFBMTAwMDEyMDQ3Nzc4ODg3NjA0ODAwQ0I0MDAwMjgwMDNEMzQwRTcKKzoxMDFBMjAwMDAwNzU2NjA4MjI5MEZDMjkxMjA0ODk5MDAwMDUxMjAxQjUKKzoxMDFBMzAwMEY1RjU2Nzc4ODU3NjAwNzg4NUU2QzM5NTY3NDAwMzAyRkIKKzoxMDFBNDAwMDFBRjQ3ODg2NzYwMDc4ODZFNkMzNzg4ODk2NTA3NjkwODEKKzoxMDFBNTAwMEZDMkMxMjA0ODkxMjAxRUZGQzkwRkMzMjEyMDQ5MjEyNDkKKzoxMDFBNjAwMDAxRTlGNDVDRkMxMjAxRTlGODkwRkMyRjEyMDQ4OUU4MEEKKzoxMDFBNzAwMEMwRTAxMjAxRUZDOEQwRTBDODU4NENGQzkwRkMyQzEyMUEKKzoxMDFBODAwMDA0ODlFQzEyMDMxODc4ODdFQ0Y2OTBGQzMxRTAwNEYwM0UKKzoxMDFBOTAwMDkwRkMzMDcwMDNFMDA0RjAwOUU5NzAwMTBBOTBGQzMyMTgKKzoxMDFBQTAwMDEyMDQ4MDkwRkMyOTEyMDQ4OTkwMDAwNDEyMDFGNTMwODAKKzoxMDFBQjAwMEU0MEU5MEZDMkVFMDA0RjA5MEZDMkQ3MDAzRTAwNEYwQTYKKzoxMDFBQzAwMDc4ODYwNjgwODE3ODg4RTZGREU0RkVGRkVFQ0RGQzkwMDYKKzoxMDFBRDAwMEZDMzFFMDJDRjA5MEZDMzBFMDNERjA3ODg4RTZGREU0NEQKKzoxMDFBRTAwMEZFRkZFRUNERkM5MEZDMzRFMDJDRjA5MEZDMzNFMDNEQUEKKzoxMDFBRjAwMEYwNzg4NTA2MDIxQTM0NzU2NjAwMjIyMkMwRTBDMEYwMzQKKzoxMDFCMDAwMEMwODJDMDgzQzBEMEU4QzBFMEU5QzBFMEVBQzBFMEVCM0EKKzoxMDFCMTAwMEMwRTBFQ0MwRTBFREMwRTBFRUMwRTBFRkMwRTA5MEZGNjAKKzoxMDFCMjAwMDkyRTAxMjAxQzAxQjQ3MzAxQjQ3MzIxQjU2MzgxQjY4MUUKKzoxMDFCMzAwMDNBMUI3QTNFMUI5MjQ0MUI4NjQ2MUI5RTUwMUJFMDUyNkEKKzoxMDFCNDAwMDFCQkY1NDFDMDE1NjAwMDAxQzIyOTBGRjkyRTA3RjAwMzYKKzoxMDFCNTAwMEZFN0MwMTEyMzI0RDAyMUMzMkU0RkYwNEZFN0MwMzEyQjMKKzoxMDFCNjAwMDMyNEQ3NDIwOTBGRkZFRjAwMjFDMzJFNEZGMDRGRTdDMzQKKzoxMDFCNzAwMDAyMTIzMjRENzQ0MDkwRkZGRUYwMDIxQzMyRTRGRjA0NkEKKzoxMDFCODAwMEZFN0MwNDEyMzI0RDAyMUMzMkU0RkYwNEZFN0MwNTEyN0UKKzoxMDFCOTAwMDMyNEQwMjFDMzJFNEZGMDRGRTdDMDYxMjMyNEQwMjFDNjAKKzoxMDFCQTAwMDMyOTBGRkE1RTA3RDAwOTBGQkY4Q0RGMEEzQ0RGMDkwNDIKKzoxMDFCQjAwMEZCRjlFMEZDRjU4MzkwRkJGOEUwNDQzM0ZEMTIxQ0M1MTMKKzoxMDFCQzAwMDgwNzM5MEZGQjVFMDdEMDA5MEZCRkFDREYwQTNDREYwREYKKzoxMDFCRDAwMDkwRkJGQkUwRkNGNTgzOTBGQkZBRTA0NDQzRkQxMjFDMTQKKzoxMDFCRTAwMEM1ODA1MjkwRkZBNkUwN0QwMDkwRkJGQ0NERjBBM0NEMTgKKzoxMDFCRjAwMEYwOTBGQkZERTBGQ0Y1ODM5MEZCRkNFMDQ0MzRGRDEyMkIKKzoxMDFDMDAwMDFDQzU4MDMxOTBGRkI2RTA3RDAwOTBGQkZFQ0RGMEEzQjcKKzoxMDFDMTAwMENERjA5MEZCRkZFMEZDRjU4MzkwRkJGRUUwNDQ0NEZEM0IKKzoxMDFDMjAwMDEyMUNDNTgwMTA5MEZGOTJFMDdEMDBGQ0VENDRBQUZEREYKKzoxMDFDMzAwMDEyMUNDNTgwMDBFNDkwRkY5MkYwRDBFMEZGRDBFMEZFREYKKzoxMDFDNDAwMEQwRTBGREQwRTBGQ0QwRTBGQkQwRTBGQUQwRTBGOUQwNkQKKzoxMDFDNTAwMEUwRjhEMEQwRDA4M0QwODJEMEYwRDBFMDMyMDU4MTA1M0EKKzoxMDFDNjAwMDgxMDU4MTA1ODFBODgxMTgxODE4RURGNjA4RUNGNjkwMTkKKzoxMDFDNzAwMEZGNUFFMDIwRTcwMjgwRjc5MEZGNTlFMDdEMDBBODgxM0QKKzoxMDFDODAwMDE4Q0RGNkNEMDhGNjdEMDNBODgxRTYxOEZDRTZDQzI1MzQKKzoxMDFDOTAwMEUwQ0MzM0NDRERGOUNDRjZDQzA4RjZBODgxMThFNjQ0Q0MKKzoxMDFDQTAwMEY4RjZBODgxMTgxODE4RTZGRDA4RTZGQ0E4ODExODg2NDEKKzoxMDFDQjAwMDgzMDg4NjgyRURGMEEzRUNGMDc0MDI5MEZGNUFGMDE1RDEKKzoxMDFDQzAwMDgxMTU4MTE1ODExNTgxMjJFNTgxMjQwNUY1ODFFNEE4MUUKKzoxMDFDRDAwMDgxMThGNkE4ODExODE4MTgxOEVERjYwOEVDRjY5MEZCOTQKKzoxMDFDRTAwMEY1RTAyNEY4NTAwMzAyMURFNkU0QTg4MTE4MThGNkE4RDAKKzoxMDFDRjAwMDgxMThFNkZFQTg4MTE4MTgxODE4RTZGRDA4RTZGQzdGOTIKKzoxMDFEMDAwMDAwRUYyNEY4NDA0REU0RUYyNUUwMjQ3REY1ODJFNDM0MzMKKzoxMDFEMTAwMEZDRjU4M0UwRkJBM0UwNkM3MDAzRkFFQjZENzAwOTc0RDMKKzoxMDFEMjAwMDAxQTg4MTE4MThGNjgwMkJFNEVGMjVFMDI0N0RGNTgyQzgKKzoxMDFEMzAwMEU0MzRGQ0Y1ODM3QTAwRTA1NEYwQ0NGOENDQ0RGOUNENTYKKzoxMDFENDAwMEZCNzgwMEU5NTRGMEY5RUE2ODcwMDJFQjY5NzAwMTBFNjMKKzoxMDFENTAwMDBGODBBRUE4ODExOEVFRjZBODgxMTgxODE4MThFREY2QjUKKzoxMDFENjAwMDA4RUNGNkE4ODFFRkY2QTg4MTE4MThFNjcwNzlBODgxMkEKKzoxMDFENzAwMDE4RTYyNEY3NDA3MUE4ODExODE4MTgxOEU2NTQwRkE4MUYKKzoxMDFEODAwMDgxRjY2NDA0NjAxN0E4ODFFNjY0MDM2MDEwQTg4MTE4RDYKKzoxMDFEOTAwMDE4MTgxOEU2RkQwOEU2RkMxMjFDNUE4MDRBN0MwQTEyNDQKKzoxMDFEQTAwMDMxQURBODgxMTgxODE4MThFNkZEMDhFNkZDOTBGQkY0ODAKKzoxMDFEQjAwMEUwMjVFMDI0N0RGNTgyRTQzNEZDRjU4M0VERjBBM0VDMkUKKzoxMDFEQzAwMEYwOTBGQkY0RTBGRkU0RUYwNDU0MDdGRjkwRkJGNEYwMjUKKzoxMDFERDAwMDkwRkJGNUUwMDRGMDEyMzI0NjkwRkJGNkUwNzAwOEU0NjgKKzoxMDFERTAwMEZFRkY3QzBGMTIzMjREODAyNzkwRkJGN0UwMDRGMDU0ODkKKzoxMDFERjAwMDNGNzAxRDkwRkJGN0UwNDRGRTdEMDBGQzkwRkJGNEUwOUIKKzoxMDFFMDAwMDI1RTAyNDdERjU4MkU0MzRGQ0Y1ODNFREYwQTNFQ0YwQ0QKKzoxMDFFMTAwMEU1ODEyNEZCRjU4MTIyNzg4Qjc2MDA3ODhDNzYwMDc0M0UKKzoxMDFFMjAwMDAxOTBGQkY2RjAxMjMxMzg5MEZCRjVFMDYwNTc3QzBBMjgKKzoxMDFFMzAwMDEyMzFBRDkwRkJGM0UwMjVFMDI0N0RGNTgyRTQzNEZDMjMKKzoxMDFFNDAwMEY1ODNFMEZEQTNFMEZDOTBGQkYzRTAyNUUwMjQ3REY1QzUKKzoxMDFFNTAwMDgyRTQzNEZDRjU4M0U0RjBBM0YwOTBGQkYzRTBGRkU0Q0MKKzoxMDFFNjAwMEVGMDQ1NDA3RkY5MEZCRjNGMDkwRkJGNUUwMTRGMDc4REIKKzoxMDFFNzAwMDg5RURGNjA4RUNGNjEyMzI0Njc4ODlFNkZEMDhFNkZDQjQKKzoxMDFFODAwMDEyMDhFMzgwQTMxMjMyOUE5MEZGOTNFMDQ0MDFGMEIyNkIKKzoxMDFFOTAwMEIzNzg4QjA2QjYwMDExNzg4Qjc2MDA3ODhDRTZGNDA0NjQKKzoxMDFFQTAwMDA0QTJFMDkyQjQ3ODhDRjYwMjFFMjVFNDkwRkJGNkYwRDIKKzoxMDFFQjAwMDkwRkJGNUUwN0QwMEZDRUQ0NENGRkQxMjFDNUExMjMxODEKKzoxMDFFQzAwMEJCMjIxMjMxMzhFNTcwNjQ0OTQ1NkY2MDE1OTBGRjgzN0QKKzoxMDFFRDAwMEUwNTQwRjdEMDBEMzk1NzBFRDk1NkY1MDA1MTIyRjgxNjIKKzoxMDFFRTAwMDgwMDMxMjMwNTExMjMxQkIyMjEyMzEzOEU1NzA2NDQ5M0YKKzoxMDFFRjAwMDQ1NkY2MDA1MTIzMDhCODAwRTkwRkY4MEUwNDQwOEYwNDMKKzoxMDFGMDAwMDkwRkY4M0UwNTQ3RkYwMTIzMUJCMjIxMjMxMzg4QzU0QTEKKzoxMDFGMTAwMEVDNTRGMEI0MTAxNTc1NkEzNTc1NjlGQzc1NjgwMUU1MDcKKzoxMDFGMjAwMDZBMjQwM0Y1NkFFNTY5MzQwMEY1NjlFNEY1NTdGNTU2NjYKKzoxMDFGMzAwMEU1NTZDMzk0MDE1MDI3RTU1NDU0MEZGQ0FENkFBRTY5RDEKKzoxMDFGNDAwMEFGNjgxMjBFODA4QzU1RUM2MDAyODAxMjA1NkFFNTZBNUIKKzoxMDFGNTAwMDcwMDIwNTY5MDU1N0U1NTc3MDAyMDU1NjgwRDJFNTU0QjEKKzoxMDFGNjAwMDU0MEYyNDlERjhFNjU0RkVGNkU1NTQ1NDBGN0YwMEZFMEUKKzoxMDFGNzAwMDdDMTIxMjMyNERFNTU1MTQ3MDA5N0QwMDdDMDkxMjI1NDIKKzoxMDFGODAwMDQ2ODAwN0FENTc3QzAwMTIyNTQ2MTIzMUJCMjIxMjMxMjQKKzoxMDFGOTAwMDM4OTBGRkZDRTA0NDAyRjA5MEZGMDBFMDMwRTcxMzkwM0YKKzoxMDFGQTAwMEZGODNFMDQ0ODBGMDQzNkQ4MDkwRkZGQ0UwNDQwMUYwNEIKKzoxMDFGQjAwMDgwMTE5MEZGODJFMDQ0MDhGMDUzNkQ3RjkwRkZGQ0UwQjkKKzoxMDFGQzAwMDU0RkVGMDkwRkY4MUUwNDQ4MEYwMTIyNUY5OTBGRkZFNkUKKzoxMDFGRDAwMEUwNDQwNUYwOTBGRkZDRTA1NEZERjAxMjMxQkIyMjEyMEEKKzoxMDFGRTAwMDMxMzg3QzAxMTIzMkZCNzhBREU2NDQwMkY2NzRGRUZDMTcKKzoxMDFGRjAwMDA0RkQxMjFDQzU5MEZGNUFFMDMwRTcwMjgwRjdFNEY1QkIKKzoxMDIwMDAwMDRFNzU0RDEwQUM0RUFENERFNTRFMTU0RTcwMDIxNTRENTIKKzoxMDIwMTAwMEVDNEQ2MDAyODBFRTQzODcwMTEyMzFCQjIyMTIzMTM4NTEKKzoxMDIwMjAwMDdDMDIxMjMxQzc3OEFERTY1NEZERjYxMjMxQkIyMjEyQTQKKzoxMDIwMzAwMDMxMzg3OEFERTYzMEUwMkM3OEFERTYzMEUxMjY3OEFEODkKKzoxMDIwNDAwMEU2RkNGNTgzMThFNjQ0RjBGRDEyMUM1QTkwRkZGQ0UwMTQKKzoxMDIwNTAwMDQ0MjBGMDdDMDIxMjMyRkI3OEFERTY1NEZERjY3NDFBOEYKKzoxMDIwNjAwMDkwRkZGRUYwNzhBREU2RkNGNTgzMThFNjQ0RjFGRDEyMzIKKzoxMDIwNzAwMDFDNUExMjMxQkIyMjc1NkQwMDkwRkZGRkUwNjAwMzQzRDQKKzoxMDIwODAwMDZEMDE3NTZFMDBFNEY1NkNGNTZCRTRGNTZGNzU3MDQ5RTQKKzoxMDIwOTAwMDc0ODQ5MEZGODJGMDc0ODQ5MEZGODBGMDc0ODA5MEZGQ0QKKzoxMDIwQTAwMDU4RjA3NDgwOTBGRjVBRjBBRDQ2QUY0NTdFMDBFRTI0QTQKKzoxMDIwQjAwMEZFNTAwMzAyMjE0MkU0RUU3NUYwMDdBNDI0N0ZGNTgyNkUKKzoxMDIwQzAwMEU0MzRGOEY1ODNFMEZGRTRFRjU0ODBGREU0RUY1NDBGQ0YKKzoxMDIwRDAwMDE0RkZFRDYwMzhFNEVGNzVGMDA4QTQyNDQ4RjU4MkU0QkQKKzoxMDIwRTAwMDM0RkZGNTgzNzQ5MEYwRTRFRjc1RjAwOEE0MjQ0QUY1MEEKKzoxMDIwRjAwMDgyRTQzNEZGRjU4Mzc0ODBGMEU0RUY3NUYwMDhBNDI0RTMKKzoxMDIxMDAwMDRFRjU4MkU0MzRGRkY1ODM3NDgwRjA4MDM0RTRFRjc1OUIKKzoxMDIxMTAwMEYwMDhBNDI0MDhGNTgyRTQzNEZGRjU4Mzc0OTBGMEU0MTkKKzoxMDIxMjAwMEVGNzVGMDA4QTQyNDBBRjU4MkU0MzRGRkY1ODNFNEYwQTcKKzoxMDIxMzAwMEU0RUY3NUYwMDhBNDI0MEVGNTgyRTQzNEZGRjU4M0U0OUYKKzoxMDIxNDAwMEYwMEUwMjIwQUI4RDQ2OEU0NDhGNDU3NDdGOTBGRkZEQ0MKKzoxMDIxNTAwMEYwNzQ5MDkwRkZGQ0YwMjI4QzU4RUMyNEY2NTAwNkU1QzkKKzoxMDIxNjAwMDU4MjQzN0ZDMjJFNTU4MjQzMEZDMjJEMkIwMTIyNTQzRjMKKzoxMDIxNzAwMEVDNzAwMzAyMjI3RTc1NUMwM0FFNUI3RjAwRTU1QzE1QUMKKzoxMDIxODAwMDVDNjQ4MDI0N0Y1MDM1RUYyNDAwRjU4MkU0MzRGQkY1NTUKKzoxMDIxOTAwMDgzRTBGRTI0RkU1MDFFRUY3RDAwRkNFNEZCNzQ3NEMzNUMKKzoxMDIxQTAwMDlDRkFFQjlERkJFRTdEMDBGQ0VBQzM5Q0VENjQ4MENCQ0EKKzoxMDIxQjAwMDY0ODA5QjUwMDI4MDA1RUYyRUZGODBDMThFNUI4RjVBOUEKKzoxMDIxQzAwMEU1NUM2NDgwMjQ3RjUwMDMwMjIyN0VFNTVBMjQ4RTUwMTEKKzoxMDIxRDAwMDAzMDIyMjdFODU1QTVENzU1QjAwQUU1QUFGNUI5MDM1NzcKKzoxMDIxRTAwMEVFRTQ5M0Y1NUNFNTVDMTU1QzY0ODAyNDdGNTAxOEVFQUEKKzoxMDIxRjAwMDI0MDBGNTgyRTQzNEZCRjU4M0UwRkNFRjkwMzVFRTkzQTgKKzoxMDIyMDAwMDZDNzAwNDBFMEY4MERFOEU1QThGNUJFNTVDNjQ4MDI0NTgKKzoxMDIyMTAwMDdGNDA2RTc1NUUwMTc1NjBFODc1NUZGRkU1NUQyNDAyQzUKKzoxMDIyMjAwMEY1NUE3NTVDMDdFNTVDMzM0MDU3QUQ2MEFFNUZBRjVFNTUKKzoxMDIyMzAwMEU1NUNGNTgyMzM5NUUwRjU4MzEyMDFGNUM0NTQwRkZDOUIKKzoxMDIyNDAwMDEyMjE1NUU1NUEyNDAwRjU4MkU0MzRGQkY1ODNFQ0YwQzUKKzoxMDIyNTAwMDA1NUEwNTVBQUQ2MEFFNUZBRjVFRTU1Q0Y1ODIzMzk1MTkKKzoxMDIyNjAwMEUwRjU4MzEyMDFGNTU0MEZGQzEyMjE1NUU1NUEyNDAwQzQKKzoxMDIyNzAwMEY1ODJFNDM0RkJGNTgzRUNGMDA1NUEwNTVBMTU1QzgwRDEKKzoxMDIyODAwMEE0NzQwMjkwRjg1MUYwOTBGODZCNzlDNzdBMzU3QjI3RTcKKzoxMDIyOTAwMDc4MDExMjAzRkU3NTZBMzU3NTY5RkM3NTY4MDFFNDkwNzIKKzoxMDIyQTAwMEZGODNGMDc0ODA5MEZGODFGMDc1NTkwMkU1NTk3NUYwNTUKKzoxMDIyQjAwMDA3QTQyNDdGRjU4MkU0MzRGOEY1ODNFMDc4OEZGNkZDRjgKKzoxMDIyQzAwMDU0MEYxNEZDNzg4RkVDRjZFNTU5NzVGMDA3QTQyNDgxQkYKKzoxMDIyRDAwMEY1ODJFNDM0RjhGNTgzRTA3ODkyNzZGRDA4NzZFOEZDNDAKKzoxMDIyRTAwMDc4OEZFNjc1RjAwOEE0MjQ0OEY1ODJFNDM0RkZGNTgzN0UKKzoxMDIyRjAwMEU0RjA3ODhGRTY3NUYwMDhBNDI0NEZGNTgyRTQzNEZGMEIKKzoxMDIzMDAwMEY1ODNFQ0YwNzg5MkU2RkYwOEU2N0UwM0NGQzMxM0NGQTcKKzoxMDIzMTAwMDEzREVGOUZFNzg4RkU2NzVGMDA4QTQyNDQ5RjU4MkU0MEYKKzoxMDIzMjAwMDM0RkZGNTgzRUVGMDc4OEZFNjc1RjAwOEE0MjQ0QUY1QzMKKzoxMDIzMzAwMDgyRTQzNEZGRjU4Mzc0ODBGMDc4OTBFQ0Y2N0QwMDc4QzkKKzoxMDIzNDAwMDkzRTYyQ0Y2MThFNjNERjY3ODkyRTZGRDA4RTY3QzAzNjcKKzoxMDIzNTAwMENEQzMxM0NEMTNEQ0Y5RkM3ODhGRTY3NUYwMDhBNDI0MDcKKzoxMDIzNjAwMDRERjU4MkU0MzRGRkY1ODNFQ0YwNzg4RkU2NzVGMDA4RTQKKzoxMDIzNzAwMEE0MjQ0RUY1ODJFNDM0RkZGNTgzRTRGMDc4OTJFNkZEODAKKzoxMDIzODAwMDA4RTZGQzc4OEZFNkZGN0UwMEVFMjRGRTUwMDMwMjI0NzAKKzoxMDIzOTAwMEZERTRFRTc1RjAwN0E0MjQ3RkY1ODJFNDM0RjhGNTgzQkMKKzoxMDIzQTAwMEUwRkZFNEVGNTQ4MEZBRTRFRjU0MEYxNEZGRTRFRTc1MUQKKzoxMDIzQjAwMEYwMDdBNDI0ODFGNTgyRTQzNEY4RjU4M0UwNzg5MEY2MDAKKzoxMDIzQzAwMEU0RUUxMzEzNTQ4MDI0RjBGOEU0MzRGREY5RThGQ0U5NUEKKzoxMDIzRDAwMEZEOEE1QUVBNzAwMzAyMjQ2QUU0RUY3NUYwMDhBNDI0MjcKKzoxMDIzRTAwMDQ4RjU4MkU0MzRGRkY1ODNFNEYwNzg5MEU2RkFFNEVGMTAKKzoxMDIzRjAwMDc1RjAwOEE0MjQ0RkY1ODJFNDM0RkZGNTgzRUFGMEVEOEMKKzoxMDI0MDAwMEZCRUM3QTAzQ0JDMzEzQ0IxM0RBRjlGQUU0RUY3NUYwRTQKKzoxMDI0MTAwMDA4QTQyNDQ5RjU4MkU0MzRGRkY1ODNFQUYwNzg5MEU2RDUKKzoxMDI0MjAwMDdCMDBGQUVDMkFGQ0VEM0JGREZCRUM3QTAzQ0JDMzEzRkIKKzoxMDI0MzAwMENCMTNEQUY5RkFFNEVGNzVGMDA4QTQyNDRERjU4MkU0NDEKKzoxMDI0NDAwMDM0RkZGNTgzRUFGMEU0RUY3NUYwMDhBNDI0NEFGNTgyM0UKKzoxMDI0NTAwMEU0MzRGRkY1ODM3NDgwRjBFNEVGNzVGMDA4QTQyNDRFQjMKKzoxMDI0NjAwMEY1ODJFNDM0RkZGNTgzNzQ4MEYwMDIyNEY5RTRFRjc1MUIKKzoxMDI0NzAwMEYwMDhBNDI0MDhGNTgyRTQzNEZGRjU4M0U0RjA3ODkwQjIKKzoxMDI0ODAwMEU2RkFFNEVGNzVGMDA4QTQyNDBGRjU4MkU0MzRGRkY1RDIKKzoxMDI0OTAwMDgzRUFGMEVERkJFQzdBMDNDQkMzMTNDQjEzREFGOUZBNDIKKzoxMDI0QTAwMEU0RUY3NUYwMDhBNDI0MDlGNTgyRTQzNEZGRjU4M0VBMkIKKzoxMDI0QjAwMEYwNzg5MEU2N0IwMEZBRUMyQUZDRUQzQkZERkJFQzdBMzEKKzoxMDI0QzAwMDAzQ0JDMzEzQ0IxM0RBRjlGQUU0RUY3NUYwMDhBNDI0QjUKKzoxMDI0RDAwMDBERjU4MkU0MzRGRkY1ODNFQUYwRTRFRjc1RjAwOEE0MkIKKzoxMDI0RTAwMDI0MEFGNTgyRTQzNEZGRjU4M0U0RjBFNEVGNzVGMDA4QTQKKzoxMDI0RjAwMEE0MjQwRUY1ODJFNDM0RkZGNTgzRTRGMDBFMDIyMzg2NzMKKzoxMDI1MDAwMDhFNTk3ODkyRURGNjA4RUNGNjc4OEZFRkY2MTIyMDczN0MKKzoxMDI1MTAwMDIyOEMyNkVDMzBFNzE4RTUyNjU0MEYxNDc1RjAwOEE0MzkKKzoxMDI1MjAwMDI0NDhGNTgyRTQzNEZGRjU4M0UwNTRERkYwODAxNkU1QkIKKzoxMDI1MzAwMDI2NTQwRjE0NzVGMDA4QTQyNDA4RjU4MkU0MzRGRkY1M0UKKzoxMDI1NDAwMDgzRTA1NERGRjAyMjdDMDAyMkVDOTBGQzM3RjA4QzI0RjYKKzoxMDI1NTAwMEVEMjQwM0Y1MjU3RDAwRDM5NTcyRUQ5NTcxNDAwMzg1M0IKKzoxMDI1NjAwMDcyMjVFNTI1MjRCNzUwMDk3NTI1MDM3NDAyOTBGQzM3QzAKKzoxMDI1NzAwMEYwQUMyNTEyMzA3NjIyRTRGNTZDRjU2QjEyMjU3RDIyNDUKKzoxMDI1ODAwMDkwRkMzNUUwNjU3MzYwMEU3NDA0OTBGQzM3RjBFNEY1NjAKKzoxMDI1OTAwMDZCNzU2QzAzODA0NjdENzNFNEZFRkY3OTM1N0FGQzdCQjYKKzoxMDI1QTAwMDAxNzQwNTc4MDAxMjAzNDhFNTZDMjQwM0Y1NkNFNTZCQjMKKzoxMDI1QjAwMDM0MDBGNTZCRTU2Q0QzOTU3MkU1NkI5NTcxNDAwNjg1M0IKKzoxMDI1QzAwMDcyNkM4NTcxNkJEM0U1NkM5NDQ4RTU2Qjk0MDA0MDBDOUMKKzoxMDI1RDAwMDc0MDI5MEZDMzdGMEU0RjU2Qjc1NkMwM0FDNkMxMjMwNTAKKzoxMDI1RTAwMDc2MjJFQzkwRkMzN0YwRTRGNTZDRjU2QjhDMzJFQzYwMDUKKzoxMDI1RjAwMDA1MTIzMDY3ODAwNTdDMDAxMjMwNzYyMjkwRkY5M0UwNTAKKzoxMDI2MDAwMDQ0MDFGMEIyQjM5MEZGMDRFMEY1NEE5MEZGMDZFMEZEMEMKKzoxMDI2MTAwMEEzRTBFRDdEMDBGQzdEMDBGQzkwRkYwNkUwRkZBM0UwNjEKKzoxMDI2MjAwMDdFMDBGRkU0RkVFQzRFRkNFRDRGRkRDM0VDOTQ0OEVENjQKKzoxMDI2MzAwMDk0MDA1MDIyOTBGRjA2RTBGREEzRTBFRDdEMDBGQzdEQkMKKzoxMDI2NDAwMDAwRkM5MEZGMDZFMEZGQTNFMDdFMDBGRkU0RkVFQzRFRkUKKzoxMDI2NTAwMEZDRUQ0RkZEODAwNEU0RkQ3QzQ4OEM3MjhENzE5MEZGOTEKKzoxMDI2NjAwMDAyRTBGREEzRTBFRDdEMDBGQzdEMDBGQzkwRkYwMkUwQjgKKzoxMDI2NzAwMEZGQTNFMDdFMDBGRkU0RkVFQzRFRjU0Q0VENEZGNTRCODIKKzoxMDI2ODAwMDc1NkEzNTc1NjlGQzc1NjgwMTdEMzU3RUZDN0YwMTc5NTkKKzoxMDI2OTAwMDczRTRGQUZCNzQwNTc4MDAxMjAzNDg3NTQ5MDBFNTQ5QjQKKzoxMDI2QTAwMDI0RkU0MDE5QUQ2QUFFNjlBRjY4RTQxMjAzMTgwNTQ5MEIKKzoxMDI2QjAwMDBERUQ3MDAxMEU4RDZBOEU2OThGNjg4MEUxNzU2QTM1NDcKKzoxMDI2QzAwMDc1NjlGQzc1NjgwMTkwRkYwMEUwNTQ2MEI0MDAwMjgwRjkKKzoxMDI2RDAwMDA2RDM1MDAzMDIyQ0JGRTU0QTU0MEZGNTQ5RTU0QTU0OEUKKzoxMDI2RTAwMDgwQTJFMDkyMDI5MEZGMDFFMDEyMDE4QTAwMEIyQ0JBNTYKKzoxMDI2RjAwMDI3MDUyODIzMkNCQTI5MkYyQ0JBMkExMjJBNDYyQkFEQkIKKzoxMDI3MDAwMDJCQjAyQkYwMkM2MzJDOTFFNTZEMzBFNzBFRTU0QzQ1OUEKKzoxMDI3MTAwMDRCNzAwOEU1NzI2NDAyNDU3MTYwMDMwMjJDQkM5MEZGQTcKKzoxMDI3MjAwMDAwRTA1NDFGQjQwMDAyODAwM0QzNDAyOUU1NEE2MDAzNEYKKzoxMDI3MzAwMDAyMjgyMEFENkFBRTY5QUY2ODc0MDExMjAzMTg3OEFENDMKKzoxMDI3NDAwMEU2MzBFMDBCQUQ2QUFFNjlBRjY4NzQwMjEyMDMxODdDMjQKKzoxMDI3NTAwMDAyMTIzMDc2MjJCNDAxMDI4MDAzRDM0MDFCRTU2RDIwQzMKKzoxMDI3NjAwMEUxMDdFNTRBNjAwMzAyMjgyMEU1NEEyNEZFNTAwMzAyRkYKKzoxMDI3NzAwMDI4MjA3QzAyMTIzMDc2MjJCNDAyMDI4MDA2RDM1MDAzNTUKKzoxMDI3ODAwMDAyMjgxRUU1NkQyMEUxMERFNTRBNjAwOUU1NEE2NDgwRjYKKzoxMDI3OTAwMDYwMDMwMjI4MjBBQzRBMTIzMEZENDAwMzAyMjgyMEU1RTUKKzoxMDI3QTAwMDQ5NzAyNTMwMDIxMTkwRkY4MEUwNTQwOEFENkFBRTY5OEYKKzoxMDI3QjAwMEFGNjgxMjAzMTg4MDBGOTBGRjgyRTA1NDA4QUQ2QUFFMzQKKzoxMDI3QzAwMDY5QUY2ODEyMDMxODgwM0QxNTQ5MzAwMjFERTU0OTc1NEYKKzoxMDI3RDAwMEYwMDhBNDI0NDhGNTgyRTQzNEZGRjU4M0UwNTQwOEFEMDIKKzoxMDI3RTAwMDZBQUU2OUFGNjgxMjAzMTg4MDFCRTU0OTc1RjAwOEE0NEEKKzoxMDI3RjAwMDI0MDhGNTgyRTQzNEZGRjU4M0UwNTQwOEFENkFBRTY5M0QKKzoxMDI4MDAwMEFGNjgxMjAzMThBRDZBQUU2OUFGNjgxMjAxRUY2MDBCRDIKKzoxMDI4MTAwMEFENkFBRTY5QUY2ODc0MDExMjAzMTg3QzAyMTIzMDc2OUIKKzoxMDI4MjAwMDIyODAwMDAyMkNCQ0U1NkQyMEU3MDZFNTcyNDU3MTYwNTAKKzoxMDI4MzAwMDAzMDIyQ0JDOTBGRjAwRTA1NDFGQjQwMDAyODAwM0QzQkQKKzoxMDI4NDAwMDQwMUFFNTRDMTQ0NTRCNzAwNEU1NEE2MDAzMDIyOTJDRkMKKzoxMDI4NTAwMDc4QURFNjU0RkVGNjdDMDAxMjMwNzYyMkI0MDEwMjgwOTgKKzoxMDI4NjAwMDAzRDM0MDJBRTU2RDIwRTEwOEU1NkQyMEUwMDMwMjI5NEQKKzoxMDI4NzAwMDJDRTU2RDMwRTAwNEU1NEE3MDBCRTU2RDMwRTEwOUU1Q0IKKzoxMDI4ODAwMDRBMjRGRTUwMDMwMjI5MkM3QzAwMTIzMDc2MjJCNDAyMjYKKzoxMDI4OTAwMDAyODAwNkQzNTAwMzAyMjkyQUU1NEM0NTRCNjAwMzAyMEYKKzoxMDI4QTAwMDI5MkNBQzRBMTIzMEZENDAwMzAyMjkyQ0U1NkQyMEUxQjEKKzoxMDI4QjAwMDA3RTU2RDIwRTAwMjgwNzdFNTZEMzBFMDA2RTU0OTYwRDAKKzoxMDI4QzAwMDAyODA2Q0U1NDk3MDBGOTBGRjgyRTA1NEY3RjA5MEZGQjIKKzoxMDI4RDAwMDgwRTA1NEY3RjAyMkU1NDlCNDAxMDI4MDAzRDM0MDA5QjcKKzoxMDI4RTAwMDdEMDE3QzAzMTIwRjEyODAxMUI0MDIwMjgwMDNEMzQwRDkKKzoxMDI4RjAwMDA5N0QwMTdDMDQxMjBGMTI4MDAwMTU0OTMwMDIxNUU1OTQKKzoxMDI5MDAwMDQ5NzVGMDA4QTQyNDQ4RjU4MkU0MzRGRkY1ODNFMDU0QzcKKzoxMDI5MTAwMEY3RjA4MDEzRTU0OTc1RjAwOEE0MjQwOEY1ODJFNDM0NDMKKzoxMDI5MjAwMEZGRjU4M0UwNTRGN0YwN0MwMDEyMzA3NjIyODAwMDAyM0QKKzoxMDI5MzAwMDJDQkNFNTZEMjBFNzA2RTU3MjQ1NzE2MDAzMDIyQ0JDRjYKKzoxMDI5NDAwMDkwRkYwMEUwNTQxRkI0MDAwMjgwMDNEMzQwMUFFNTRDMEUKKzoxMDI5NTAwMDE0NDU0QjcwMDRFNTRBNjAwMzAyMkEwRjc4QURFNjQ0NDMKKzoxMDI5NjAwMDAxRjY3QzAwMTIzMDc2MjJCNDAxMDI4MDAzRDM0MDI5QTQKKzoxMDI5NzAwMEU1NkQyMEUxMDhFNTZEMjBFMDAzMDIyQTBGRTU2RDMwRUEKKzoxMDI5ODAwMEUwMDRFNTQ5NzAwQkU1NkQzMEUxMDhFNTQ5MjRGRTUwQUYKKzoxMDI5OTAwMDAyODA3RjdDMDAxMjMwNzYyMkI0MDIwMjgwMDNEMzQwOTIKKzoxMDI5QTAwMDZGRTU0QzQ1NEI2MDAyODA2OUFDNEExMjMwRkQ0MDAyMzUKKzoxMDI5QjAwMDgwNjBFNTZEMjBFMTA3RTU2RDIwRTAwMjgwNTRFNTQ5ODcKKzoxMDI5QzAwMDcwMTQzMDAyMDk5MEZGODBFMDQ0MDhGMDgwMDc5MEZGMDcKKzoxMDI5RDAwMDgyRTA0NDA4RjAyMkU1NkQzMEUxMzMxNTQ5MzAwMjE1RkMKKzoxMDI5RTAwMEU1NDk3NUYwMDhBNDI0NDhGNTgyRTQzNEZGRjU4M0UwNTYKKzoxMDI5RjAwMDQ0MDhGMDgwMTNFNTQ5NzVGMDA4QTQyNDA4RjU4MkU0NDIKKzoxMDJBMDAwMDM0RkZGNTgzRTA0NDA4RjA3QzAwMTIzMDc2MjI4MDAyMjcKKzoxMDJBMTAwMDgwMDAwMjJDQkNFNTZEMjBFNzEyRTU3MjQ1NzE3MDBDNTgKKzoxMDJBMjAwMEU1NEE3MDA4OTBGRjAwRTA1NDFGNjAwMzAyMkNCQ0U1RUIKKzoxMDJBMzAwMDRDOTBGRkZGRjA5MEZGRkZFMDYwMDU0MzZEMDE4MDAzQzUKKzoxMDJBNDAwMDUzNkRGRTdDMDAxMjMwNzYyMkU1NkQzMEU3MEVFNTcyQTQKKzoxMDJBNTAwMDQ1NzE2MDA4OTBGRjAwRTA1NDFGNjAwMzAyMkNCQ0FEN0MKKzoxMDJBNjAwMDRCRTU0Q0VEN0QwMEZDN0QwMEZDQkQwMDAyODAwMzAyQzcKKzoxMDJBNzAwMDJCQThCNDAxMDI4MDAzRDM0MDMyRTU0QTcwMDVFNTRDMkYKKzoxMDJBODAwMEZDNjAwMzAyMkJBQTc1NkE0MDc1NjlGODc1NjgwMUQzNkEKKzoxMDJBOTAwMEU1NzI5NDEyRTU3MTk0MDA0MDA2RTRGRDdDMTI4MDA0MTYKKzoxMDJBQTAwMEFDNzJBRDcxOEM3MDhENkYxMjMwOEIyMkI0MDIwMjgwQ0IKKzoxMDJBQjAwMDAzRDM0MDU5RTU0QTYwMDMwMjJCQUFFNTRDRkM3MDI3N0EKKzoxMDJBQzAwMDc1NkE1Mjc1NjlGODc1NjgwMUQzRTU3Mjk0MTlFNTcxRjQKKzoxMDJBRDAwMDk0MDA0MDA2RTRGRDdDMTk4MDA0QUM3MkFENzE4QzcwRUEKKzoxMDJBRTAwMDhENkYxMjMwOEI4MDI1NzU2QTZCNzU2OUY4NzU2ODAxN0EKKzoxMDJBRjAwMEQzRTU3Mjk0MjdFNTcxOTQwMDQwMDZFNEZEN0MyNzgwQkQKKzoxMDJCMDAwMDA0QUM3MkFENzE4QzcwOEQ2RjEyMzA4QjIyQjQwMzAyRTUKKzoxMDJCMTAwMDgwMDZEMzUwMDMwMjJCQThFNTRDRjU0OTcwMEY5MEZGQjcKKzoxMDJCMjAwMDA0RTBGREEzRTA0RDYwMDMwMjJCQUE4MDE4OTBGQjAyOTUKKzoxMDJCMzAwMEUwRkRBM0UwRkM5MEZGMDVFMDZDNzAwNzkwRkYwNEUwNkYKKzoxMDJCNDAwMDZENjAwMjgwNjhFNEY1NzBGNTZGN0YwMEU1NDkxNEM1OUIKKzoxMDJCNTAwMDQ5NjAwRkVGMjQwMEY1ODJFNDM0RkJGNTgzRTAyRkZGOUEKKzoxMDJCNjAwMDgwRUE4RjRBRTU0QTI0MDBGNTgyRTQzNEZCRjU4M0UwRUQKKzoxMDJCNzAwMDdEMDBEMzk1NzJFRDk1NzE0MDA2QUM3MkFENzE4MDBGRkEKKzoxMDJCODAwMEU1NEEyNDAwRjU4MkU0MzRGQkY1ODNFMDdEMDBGQzhDMEIKKzoxMDJCOTAwMDcwOEQ2RkU1NEEyNDAwRkNFNDM0RkJGREZFRUNGRDdGMDQKKzoxMDJCQTAwMDAxOEQ2QThFNjk4RjY4MTIzMDhCMjI4MDAwMDIyQ0JDRTYKKzoxMDJCQjAwMDAyMkNCQ0U1NkQzMEU3MTlFNTcyMTQ0NTcxNzAxMkU1MjEKKzoxMDJCQzAwMDRBNzAwRUU1NEM0NTRCNzAwODkwRkYwMEUwNTQxRjYwQzIKKzoxMDJCRDAwMDAzMDIyQ0JDRTU2RDIwRTAwOEU1NkQyMEUxMDMwMjJDMkEKKzoxMDJCRTAwMEJDNzU2QTZFRTRGNTY5RjU2OEU0RjU2RjA0RjU3MDEyN0EKKzoxMDJCRjAwMDMwOEIyMkU1NkQyMEU3MjdFNTcyNDU3MTcwMjFFNTRBQUIKKzoxMDJDMDAwMDcwMURFNTRDNjQwMjQ1NEI2MDBERTU0QzE0NDU0QjYwNkUKKzoxMDJDMTAwMDA2RTU0QzQ1NEI3MDA4OTBGRjAwRTA1NDFGNjAwMzAyMkUKKzoxMDJDMjAwMDJDQkNFNTZEMjBFMDA4RTU2RDIwRTEwMzAyMkNCQzg1OUQKKzoxMDJDMzAwMDRDNkVFNTZFNzAwQTQzNkQwMTUzNkRGREQyQjA4MDIwN0QKKzoxMDJDNDAwMEU1NkU2NDAyNjAwN0U1NkUxNDYwMDI4MDcyNTM2REZFRUIKKzoxMDJDNTAwMDQzNkQwMkU1NkU2NDAyNjAwNUU1NkUxNDcwMDJDMkIwNTkKKzoxMDJDNjAwMDdDMDAxMjMwNzYyMkU1NkQzMEU3MUFFNTcyMTQ0NTcxNkEKKzoxMDJDNzAwMDcwMTNFNTRBNzAwRkU1NEM0NTRCNzAwOTkwRkYwMEUwN0EKKzoxMDJDODAwMDU0MUYxNDYwMDI4MDM4RTU2RDIwRTEwMjgwMzE3QzAxMjAKKzoxMDJDOTAwMDEyMzA3NjIyRTU2RDIwRTcxNUU1NzI0NTcxNzAwRkU1N0IKKzoxMDJDQTAwMDRDNDU0QjcwMDk5MEZGMDBFMDU0MUYxNDYwMDI4MDBGRTgKKzoxMDJDQjAwMEU1NkQyMEUxMDI4MDA4N0MwMDEyMzA3NjIyODAwMDAyNUYKKzoxMDJDQzAwMDJGN0RCNDQwMDI4MDA2RDM1MDAzMDIyRjczOTBGRjAxODIKKzoxMDJDRDAwMEUwOTBGQzM1RjBFNTRBOTBGQzM2RjBFNDkwRkMzN0YwRUIKKzoxMDJDRTAwMEU1NkEyNDAzRjU2QUU1NjkzNDAwRjU2OUFENEJFNTRDMDYKKzoxMDJDRjAwMDg1NkE4Mjg1Njk4M0NERjBBM0NERjA5MEZGMDFFMDEyNTMKKzoxMDJEMDAwMDAxQzAyRDJBMDEyRDUwMDIyRDdBMDMyREE0MDQyREYyOEQKKzoxMDJEMTAwMDA1MkUyRjA2MkU1NTA3MkU3QjA4MkVBNzA5MkVDRDBCMkMKKzoxMDJEMjAwMDJFRjMwQzJGMDI4MDJGMDI4MTAwMDAyRjYwRTU2RDIwMTIKKzoxMDJEMzAwMEU3MDY3QzA1MTIyNURGMjI3RDc2N0UzNTdGMDI3OTM4MTUKKzoxMDJENDAwMDdBRkM3QjAxNzQwODc4MDAxMjAzNDg3RDA4N0MwMDEyMkQKKzoxMDJENTAwMDI1NDYyMkU1NkQyMEU3MDY3QzA1MTIyNURGMjJFNTRBOUYKKzoxMDJENjAwMEI0MDMwMDQwMTBCNDA1MDA1MDBCRTU0QTdGMDBGRTdDMjAKKzoxMDJENzAwMDEwMTIzMjREMjI3RDAwN0MwNzEyMjU0NjIyRTU2RDIwN0YKKzoxMDJEODAwMEU3MDY3QzA1MTIyNURGMjJFNTRBQjQwMzAwNDAxMEI0QjMKKzoxMDJEOTAwMDA1MDA1MDBCRTU0QTdGMDBGRTdDMTExMjMyNEQyMjdENkEKKzoxMDJEQTAwMDAwN0MwNzEyMjU0NjIyRTU2RDIwRTcwNjdDMDUxMjI1RUEKKzoxMDJEQjAwMERGMjJFNTRBQjQwNTAyODAwM0QzNDAwQUU0RkYwNEZFQTMKKzoxMDJEQzAwMDdDMEExMjMyNEQyMkI0MDEwMjgwMDNEMzQwMEFFNEZGOTAKKzoxMDJERDAwMDA0RkU3QzA4MTIzMjREMjJCNDAzMDA0MDEwQjQwNTAwRkEKKzoxMDJERTAwMDUwMEJFNTRBN0YwMEZFN0MxMzEyMzI0RDIyN0QwMDdDQTEKKzoxMDJERjAwMDA3MTIyNTQ2MjJFNTZEMjBFNzM0RDNFNTcyOTQ0OEU1QjUKKzoxMDJFMDAwMDcxOTQwMDUwMDZFNTcyNDU3MTcwMDY3QzAyMTIyNURGNTAKKzoxMDJFMTAwMDIyRTU0QUI0MDEwM0IzNDAwQkMzQjQwMzAwNDAwOUI0MzQKKzoxMDJFMjAwMDA2MDA1MDA0MTIzMTIzMjI3QzA3MTIyNURGMjIxMjI1Q0UKKzoxMDJFMzAwMDdEMjJFNTZEMjBFNzFERTU0QUI0MDMwMDQwMTBCNDA1OEUKKzoxMDJFNDAwMDAwNTAwQkU1NEE3RjAwRkU3QzE2MTIzMjREMjI3QzA3QjMKKzoxMDJFNTAwMDEyMjVERjIyMTIyNTdEMjJFNTZEMjBFNzFERTU0QUI0MEIKKzoxMDJFNjAwMDAzMDA0MDEwQjQwNTAwNTAwQkU1NEE3RjAwRkU3QzE5QkEKKzoxMDJFNzAwMDEyMzI0RDIyN0MwNzEyMjVERjIyMTIyNTdEMjJFNTZEQkMKKzoxMDJFODAwMDIwRTcyMzc0ODE5MEZGOTNGMEU1NEFCNDAzMDA0MDEwREIKKzoxMDJFOTAwMEI0MDUwMDUwMEJFNTRBN0YwMEZFN0MxNzEyMzI0RDIyMkMKKzoxMDJFQTAwMDdDMDcxMjI1REYyMjEyMjU3RDIyRTU2RDIwRTcxREU1MzYKKzoxMDJFQjAwMDRBQjQwMzAwNDAxMEI0MDUwMDUwMEJFNTRBN0YwMEZFMDEKKzoxMDJFQzAwMDdDMTgxMjMyNEQyMjdDMDcxMjI1REYyMjEyMjU3RDIyMkEKKzoxMDJFRDAwMEU1NkQyMEU3MURFNTRBQjQwMzAwNDAxMEI0MDUwMDUwM0QKKzoxMDJFRTAwMDBCRTU0QTdGMDBGRTdDMTUxMjMyNEQyMjdDMDcxMjI1MkQKKzoxMDJFRjAwMERGMjIxMjI1N0QyMkU1NkQyMEU3MDY3QzA3MTIyNURGMDMKKzoxMDJGMDAwMDIyMTIyNTdEMjJFNTZEMzBFNzIwOTBGRjAwRTA1NDFGNUUKKzoxMDJGMTAwMDcwMTA5MEZGMDFFMEI0ODAwNTEyMjU3NDgwMDMxMjI1MjMKKzoxMDJGMjAwMDdEMjI3RDAwN0MwNTEyMjU0NjIyOTBGRjAwRTA1NDFGODMKKzoxMDJGMzAwMDYwMDY3QzA1MTIyNURGMjJEM0U1NzI5NDQ4RTU3MTk0ODIKKzoxMDJGNDAwMDAwNTAwQkMzRTU3Mjk0MDdFNTcxOTQwMDUwMDY3QzAzQjIKKzoxMDJGNTAwMDEyMjVERjIyRTU0QUI0MDUwNDEyMzEyMzIyN0MwNzEyMzAKKzoxMDJGNjAwMDI1REYyMkU1NkQzMEU3MDg3RDAwN0MwNTEyMjU0NjIyMkQKKzoxMDJGNzAwMDdDMDUxMjI1REYyMkI0MjAwMjgwMDNEMzQwMDA4MDAwQUMKKzoxMDJGODAwMDEyMzA1MTIyNzU0MzAwOTBGRjgzRTA1NDBGRDM5NTQzRDQKKzoxMDJGOTAwMDQwMjRFNTQzMjRGMEY1ODJFNDM0RkVGNTgzRTBBRDZBOTUKKzoxMDJGQTAwMEFFNjlBRjY4MTIwMzE4MDU0MzBERUQ3MDAxMEU4RDZBMEUKKzoxMDJGQjAwMDhFNjk4RjY4ODBEMUU1NDM3RDAwRkNDM0U1NzA5Q0Y1ODgKKzoxMDJGQzAwMDcwRTU2RjlERjU2RkU1NzA0NTZGNjAwNkU0OTBGRjgzRDcKKzoxMDJGRDAwMEYwMjI5MEZGODJFMDQ0MDhGMEU0RjU2Rjc1NzA0OTkwQUMKKzoxMDJGRTAwMEZDMzVFMEI0MDUwMjgwMDNEMzQwNDA5MEZDMzZFMEY1QTgKKzoxMDJGRjAwMDQzQjQwNTAyODAwM0QzNDAwQUU0RkYwNEZFN0MwQjEyQjUKKzoxMDMwMDAwMDMyNEQyMkI0MDEwMjgwMDNEMzQwMEFFNEZGMDRGRTdDNjcKKzoxMDMwMTAwMDA5MTIzMjREMjJCNDAzMDA0MDEwQjQwNTAwNTAwQkU1RjQKKzoxMDMwMjAwMDQzN0YwMEZFN0MxNDEyMzI0RDIyMjJCNDgwMDA0MDIzRTQKKzoxMDMwMzAwMEI0ODIwMDUwMUU3QzM1N0RGQzEyMTdBNTdEMDA4QzZDN0YKKzoxMDMwNDAwMDhENkI5MEZDMzdFMDYwMDUxMjMwNTE4MDA1N0MwMDEyREEKKzoxMDMwNTAwMDMwNzYyMjIyOTBGRjgzRTA1NDdGRjA5MEZGODJFMDQ0OUMKKzoxMDMwNjAwMDA4RjA5MEZGODBFMDQ0MDhGMDIyOTBGRjgyRTA0NDA4REUKKzoxMDMwNzAwMEYwOTBGRjgwRTA0NDA4RjAyMjhDMjM3RDAwOEM3MDhENUUKKzoxMDMwODAwMDZGNzU2QTM1NzU2OUZDNzU2ODAxMTIzMDhCMjI5MEZGODcKKzoxMDMwOTAwMDgzRTA1NDdGRjBFNTcwNjQ0OTQ1NkY3MDAxMjJDM0U1MTkKKzoxMDMwQTAwMDcwOTQwOEU1NkY5NDAwNDAxNTc1MjEwOEU1MjE3RDAwQjYKKzoxMDMwQjAwMEZDQzNFNTcwOUNGNTcwRTU2RjlERjU2RjgwMDk4NTcwMjgKKzoxMDMwQzAwMDIxRTRGNTZGNzU3MDQ5NzUyMjAwRTUyMkMzOTUyMTUwMDIKKzoxMDMwRDAwMDI2QUQ2QUFFNjlBRjY4MTIwMUVGRkNFNTIyMjRGOEY1NkYKKzoxMDMwRTAwMDgyRTQzNEZFRjU4M0VDRjAwNTIyMERFRDcwMDEwRThEQzcKKzoxMDMwRjAwMDZBOEU2OThGNjg4MEQzRTUyMTU0N0Y5MEZGODFGMDIyMkEKKzoxMDMxMDAwMDhDNDg3RjAwRUYyNEZENDAxOUU0RUY3NUYwMDdBNDI0RkMKKzoxMDMxMTAwMDdGRjU4MkU0MzRGOEY1ODNFMDY1NDg3MDAyRDMyMjBGMkUKKzoxMDMxMjAwMDgwRTI4RjQ3QzMyMjg1NzI3MDg1NzE2RjkwRkY4MkUwQzUKKzoxMDMxMzAwMDU0RjdGMDkwRkY4M0UwNTQ3RkYwMjJDMDAwQzAwMUMwM0MKKzoxMDMxNDAwMDAyQzAwNkMwMDdFNTc4MjQwOEY4ODYwNjUzMDY3RjdDOEYKKzoxMDMxNTAwMEZGMTIzMUFEN0MwMDdEMDBFNTdCNjA0NkZGOTBGRDk1NjAKKzoxMDMxNjAwMEUwNTQ3RjZFNzAwRkMwODNDMDgyQTNFMEZEQTNFMEZDM0IKKzoxMDMxNzAwMEEzMTU3QjgwMDdBM0EzQTNERkU2ODAyNkRGMDZEMDgyMEEKKzoxMDMxODAwMEQwODM4MDFFRTBGOEEzRTBGOUEzRTBGQUQwODJEMDgzRDgKKzoxMDMxOTAwMEU4RjBBM0U5RjBBM0VBRjBBM0MwODNDMDgyQTNBM0EzNEQKKzoxMDMxQTAwMDgwREExMjMyNDZEMDA3RDAwNkQwMDJEMDAxRDAwMDIyRjkKKzoxMDMxQjAwMDg1QTg3QTc1QTg4OEVDNzAwMjdDM0Y4Qzc5MjJFNTc4MjYKKzoxMDMxQzAwMDI0MDhGODc2MDAxMjMyOUE4MEZCQzAwMEMwMDFDMDAyQzkKKzoxMDMxRDAwMEMwMDZDMDA3QUUwNDdDRkYxMjMxQURFNTdCNjA0MkZGNDQKKzoxMDMxRTAwMDkwRkQ5NUUwNTQ3RjZFNzAwQkMwODNDMDgyQTNBM0EzQjMKKzoxMDMxRjAwMDE1N0I4MDA3QTNBM0EzREZFQTgwMjZERjA2RDA4MkQwNTkKKzoxMDMyMDAwMDgzODBEOEUwRjhBM0UwRjlBM0UwRkFEMDgyRDA4M0U4ODUKKzoxMDMyMTAwMEYwQTNFOUYwQTNFQUYwQTNDMDgzQzA4MkEzQTNBMzgwMzQKKzoxMDMyMjAwMERBNzgwODA4NzkxODA5N0MwMUU2NTQ3RjZFNzAwNjc2MTIKKzoxMDMyMzAwMDAwNzcwMDgwMDYwODA5MENCQzA4RUUxMjMyNDZEMDA3NjEKKzoxMDMyNDAwMEQwMDZEMDAyRDAwMUQwMDAyMjc1NzkwMDg1N0FBODIyNUMKKzoxMDMyNTAwMEMwRjBDMDgyQzA4M0MzRTU3QjI0RTg1MDA1MTIzMjlBRDcKKzoxMDMyNjAwMDgwRjRFQzYwMzE5MDM1NzVFNDkzQzM5QzQwMjhDMDA0MzEKKzoxMDMyNzAwMDdDRkYxMjMxQUREMDA0NDMwNDgwRTU3Qjc1RjAwM0E0REMKKzoxMDMyODAwMDI0OTVGNTgyRTQzNEZERjU4M0VDRjBFRkEzRjBFRUEzOTIKKzoxMDMyOTAwMEYwMDU3QjEyMzI0NkQwODNEMDgyRDBGMDIyQzAwNDdDNkQKKzoxMDMyQTAwMDIwRDI4Q0QyOERENTA0RkREMDA0MjI3NUE4MDA3NTg4NUIKKzoxMDMyQjAwMDAwNzVCODAwNzVGMDAwNzVEMDAwRTRGODkwMDAwMEY2RDUKKzoxMDMyQzAwMDA4QjgwMEZCMDIwMDAwQzNFRDk0MDI1MDA0N0QwMzdDQUIKKzoxMDMyRDAwMEU4RUNGNEZDRURGNEZEMENCQzAwMDEwRDhDN0Y4RDdFNjAKKzoxMDMyRTAwMDIyQzNFQzk0QkNFRDk0MDI1MDA0N0QwNzdDRDBFQ0Y0MzYKKzoxMDMyRjAwMEZDRURGNEZEMENCQzAwMDEwRDhDN0Q4RDdDMjJFQzcwOEUKKzoxMDMzMDAwMDAxMjJDMDAwRTU3ODI0MThGOEE2MDRFNTc4MjQwOEY4MUUKKzoxMDMzMTAwMEM2NTQ3RkY2RTYzMEU3MDNEMDAwMjIxMjMyOUE4MEY0REEKKzoxMDMzMjAwMEMyOEM4NTdDOEM4NTdEOEFEMjhDQzBFMEMwRDBDMEYwRjgKKzoxMDMzMzAwMEMwODJDMDgzQzAwMEMwMDFDMDAyQzAwM0MwMDRDMDA1NzkKKzoxMDMzNDAwMEMwMDZDMDA3MTIxQUY4RTU3ODI0MDhGOEU2NjAyNEU1RkMKKzoxMDMzNTAwMDc4MjQxMEY4QTY4MUU1Nzg3NUYwMjFBNDI0OERGNTgyRjMKKzoxMDMzNjAwMEU0MzRGQ0Y1ODM3OEFFRTU4MTA0QzM5OEY5RTZGMDA4MEYKKzoxMDMzNzAwMEEzRDlGQTc0MDgyNTc4RjgwNTc4MDhFNjU0ODA3MDBDMEIKKzoxMDMzODAwMEU1NzhCNDA3RjM3ODA4NzU3ODAwODBFRkU1NzgyNDEwQzUKKzoxMDMzOTAwMEY4ODY4MUU1Nzg3NUYwMjFBNDI0OERGNTgyRTQzNEZDNkIKKzoxMDMzQTAwMEY1ODM3OEFFRTU4MTA0QzM5OEY5RTBGNjA4QTNEOUZBNkQKKzoxMDMzQjAwMEQwMDdEMDA2RDAwNUQwMDREMDAzRDAwMkQwMDFEMDAwNzEKKzoxMDMzQzAwMEQwODNEMDgyRDBGMEQwRDBEMEUwMzJDMEUwQzBEMEMwMjYKKzoxMDMzRDAwMDAwQzAwMUMwMDJDMjhFODU3RThEODU3RjhCRDI4RTc4MjMKKzoxMDMzRTAwMDE5NzkwOTdBMDdFNzcwMDRBNjAwODAwQkU2NjAwODE2RDEKKzoxMDMzRjAwMEU2NzAwNEU3NDQ4MEY3MDgwOURBRUFFNTc5NjAxMzE0MTcKKzoxMDM0MDAwMEY1Nzk3MDBFRTU3ODI0MDhGODc2MDAxMjMyNDZEMjhDRjEKKzoxMDM0MTAwMEQyOEREMDAyRDAwMUQwMDBEMEQwRDBFMDMyNzU4MUFEQjUKKzoxMDM0MjAwMDc0MkE5MEZGOTNGMDc1N0YzMDc1N0VGODc1N0Q2MDc1MTYKKzoxMDM0MzAwMDdDRjAxMjA1M0YxMjM0Q0UxMjE3NUI5MEZGOTNFMDQ0RUMKKzoxMDM0NDAwMDAxRjBCMkIzMTIzNEY4MTIzMkE4ODBEQTIyQzAwMDdDNDQKKzoxMDM0NTAwMDAxRUMyNDA4RjhFNjYwMDkwQ0JDMDhGNTEyMzI5QTgwRTkKKzoxMDM0NjAwMEVFRDAwMDIyQzBGMEMwODJDMDgzQzAwMEMwMDZDMDA3RkEKKzoxMDM0NzAwMEVEMjQxMEY4NzZCQ0VENzVGMDIxQTQyNDhERjU4MkU0REUKKzoxMDM0ODAwMDM0RkNGNTgzQzA4MkMwODNBM0EzRTQ3ODBERjBBM0Q4RjUKKzoxMDM0OTAwMEZDRUM1NDdGNzVGMDAyQTQyNDQxRjU4MkU1RjAzNDM1NEMKKzoxMDM0QTAwMEY1ODNFNDkzRkU3NDAxOTNGNTgyOEU4M0U0OTNGRTc0QjYKKzoxMDM0QjAwMDAxOTNGRkQwODNEMDgyRUZGMEEzRUVGMEVEMjQwOEY4NjMKKzoxMDM0QzAwMEVDNDQ4MEY2RDAwN0QwMDZEMDAwRDA4M0QwODJEMEYwNzQKKzoxMDM0RDAwMDIyNzU3ODAwNzU3QjAwN0EwODc5MTg3ODA4NzYwMDc3NkQKKzoxMDM0RTAwMDAwMDgwOURBRjhFNDc4MDg3NDgwNDQ3RkY2NzQwMTQ0MkYKKzoxMDM0RjAwMDEwRjU4OTc1QjgwOEQyQUJEMkE5MjI3NTgxQUREMjhFRUMKKzoxMDM1MDAwMEQyOENEMkFGRTU3QjYwMzJGRjkwRkQ5NUUwNTQ4MDYwQjUKKzoxMDM1MTAwMDI0NzgwODc5MDhFMDU0N0ZGQTdCMDBFNjU0N0ZCNTAyRUUKKzoxMDM1MjAwMDAyN0JGRjA4RDlGNUVCNzAwQ0VBRjAxMjM0NEFBRDA0QzcKKzoxMDM1MzAwMEFDMDIxMjM0NjFBM0EzQTNERkQyMTIzMjlBODBDNTdDRkQKKzoxMDM1NDAwMDAxN0QwMDIyMDRGRTA0RjIwNEY2MDRFQTA0RTYwNEUyMkIKKzoxMDM1NTAwMDA0RUUwNEZBMDRBNjA0QUEwNEQ2MDREQTA0QTIwNEEyMUYKKzoxMDM1NjAwMDA0QTIwNERFMDRCRTA0QjYwNEJBMDRCMjA0Q0EwNEM2NEIKKzoxMDM1NzAwMDA0QzIwNENFMDREMjA0QUUxOTAxMDMwMDIyMDA0ODAyQTIKKzoxMDM1ODAwMDAwNDgwRTMwMTQyMEM4MUFEMDE4MEEwQzA1MDYwMjAzOTEKKzoxMDM1OTAwMDAxMDIwMDAxQ0UwMTgxMDEwMDAwQzAwMDgwMDA2MDAwMzYKKzoxMDM1QTAwMDMwMDAxODAwMTAwMDA4MDAwNDAwMDIwMDAxMDAwODE4OTQKKzoxMDM1QjAwMDI4MzgwQzA1MTAwQTAyMDAwMDAwMDAwMDAzMDExMDBBNjAKKzoxMDM1QzAwMDAyMDAwMDAwMDAwMEZCRTBGQkYyMDkwMjI3MDAwMTAyRkMKKzoxMDM1RDAwMDAwQTBGQTA5MDQwMDAwMDNGRjAwMDAwMDA3MDU4MTAyQjMKKzoxMDM1RTAwMDQwMDAwMDA3MDUwMTAyNDAwMDAwMDcwNTgzMDMwMjAwQjgKKzoxMDM1RjAwMDAxMjIwMzU0MDA1NTAwNTMwMDQyMDAzMzAwMzQwMDMxQ0YKKzoxMDM2MDAwMDAwMzAwMDIwMDAyMDAwMjAwMDIwMDAyMDAwMjAwMDIwQUEKKzowNzM2MTAwMDAwMjAwMDAwMDAwMDAwOTMKKzowMDAwMDAwMUZGCmRpZmYgLS1naXQgYS9mcy9LY29uZmlnIGIvZnMvS2NvbmZpZwppbmRleCAzMjg4MzU4Li41MTMwN2IwIDEwMDY0NAotLS0gYS9mcy9LY29uZmlnCisrKyBiL2ZzL0tjb25maWcKQEAgLTI2OSw2ICsyNjksMjUgQEAKIAkgIFBvc2l4IEFjY2VzcyBDb250cm9sIExpc3RzIChBQ0xzKSBzdXBwb3J0IHBlcm1pc3Npb25zIGZvciB1c2VycyBhbmQKIAkgIGdyb3VwcyBiZXlvbmQgdGhlIG93bmVyL2dyb3VwL3dvcmxkIHNjaGVtZS4KIAorY29uZmlnIEJUUkZTX0ZTCisJdHJpc3RhdGUgIkJ0cmZzIGZpbGVzeXN0ZW0gKEVYUEVSSU1FTlRBTCkgVW5zdGFibGUgZGlzayBmb3JtYXQiCisJZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwKKwlzZWxlY3QgTElCQ1JDMzJDCisJc2VsZWN0IFpMSUJfSU5GTEFURQorCXNlbGVjdCBaTElCX0RFRkxBVEUKKwloZWxwCisJICBCdHJmcyBpcyBhIG5ldyBmaWxlc3lzdGVtIHdpdGggZXh0ZW50cywgd3JpdGFibGUgc25hcHNob3R0aW5nLAorCSAgc3VwcG9ydCBmb3IgbXVsdGlwbGUgZGV2aWNlcyBhbmQgbWFueSBtb3JlIGZlYXR1cmVzLgorCisJICBCdHJmcyBpcyBoaWdobHkgZXhwZXJpbWVudGFsLCBhbmQgVEhFIERJU0sgRk9STUFUIElTIE5PVCBZRVQKKwkgIEZJTkFMSVpFRC4gIFlvdSBzaG91bGQgc2F5IE4gaGVyZSB1bmxlc3MgeW91IGFyZSBpbnRlcmVzdGVkIGluCisJICB0ZXN0aW5nIEJ0cmZzIHdpdGggbm9uLWNyaXRpY2FsIGRhdGEuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBmaWxlIHN5c3RlbSBzdXBwb3J0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiBUaGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBidHJmcy4KKworCSAgSWYgdW5zdXJlLCBzYXkgTi4KKwogZW5kaWYgIyBCTE9DSwogCiBzb3VyY2UgImZzL25vdGlmeS9LY29uZmlnIgpAQCAtOTEzLDYgKzkzMiw1OCBAQAogCiAJICBJZiB1bnN1cmUsIHNheSBOLgogCitjb25maWcgU1FVQVNIRlMKKwl0cmlzdGF0ZSAiU3F1YXNoRlMgNC4wIC0gU3F1YXNoZWQgZmlsZSBzeXN0ZW0gc3VwcG9ydCIKKwlkZXBlbmRzIG9uIEJMT0NLCisJc2VsZWN0IFpMSUJfSU5GTEFURQorCWhlbHAKKwkgIFNheWluZyBZIGhlcmUgaW5jbHVkZXMgc3VwcG9ydCBmb3IgU3F1YXNoRlMgNC4wIChhIENvbXByZXNzZWQKKwkgIFJlYWQtT25seSBGaWxlIFN5c3RlbSkuICBTcXVhc2hmcyBpcyBhIGhpZ2hseSBjb21wcmVzc2VkIHJlYWQtb25seQorCSAgZmlsZXN5c3RlbSBmb3IgTGludXguICBJdCB1c2VzIHpsaWIgY29tcHJlc3Npb24gdG8gY29tcHJlc3MgYm90aAorCSAgZmlsZXMsIGlub2RlcyBhbmQgZGlyZWN0b3JpZXMuICBJbm9kZXMgaW4gdGhlIHN5c3RlbSBhcmUgdmVyeSBzbWFsbAorCSAgYW5kIGFsbCBibG9ja3MgYXJlIHBhY2tlZCB0byBtaW5pbWlzZSBkYXRhIG92ZXJoZWFkLiBCbG9jayBzaXplcworCSAgZ3JlYXRlciB0aGFuIDRLIGFyZSBzdXBwb3J0ZWQgdXAgdG8gYSBtYXhpbXVtIG9mIDEgTWJ5dGVzIChkZWZhdWx0CisJICBibG9jayBzaXplIDEyOEspLiAgU3F1YXNoRlMgNC4wIHN1cHBvcnRzIDY0IGJpdCBmaWxlc3lzdGVtcyBhbmQgZmlsZXMKKwkgIChsYXJnZXIgdGhhbiA0R0IpLCBmdWxsIHVpZC9naWQgaW5mb3JtYXRpb24sIGhhcmQgbGlua3MgYW5kCisJICB0aW1lc3RhbXBzLiAgCisKKwkgIFNxdWFzaGZzIGlzIGludGVuZGVkIGZvciBnZW5lcmFsIHJlYWQtb25seSBmaWxlc3lzdGVtIHVzZSwgZm9yCisJICBhcmNoaXZhbCB1c2UgKGkuZS4gaW4gY2FzZXMgd2hlcmUgYSAudGFyLmd6IGZpbGUgbWF5IGJlIHVzZWQpLCBhbmQgaW4KKwkgIGVtYmVkZGVkIHN5c3RlbXMgd2hlcmUgbG93IG92ZXJoZWFkIGlzIG5lZWRlZC4gIEZ1cnRoZXIgaW5mb3JtYXRpb24KKwkgIGFuZCB0b29scyBhcmUgYXZhaWxhYmxlIGZyb20gaHR0cDovL3NxdWFzaGZzLnNvdXJjZWZvcmdlLm5ldC4KKworCSAgSWYgeW91IHdhbnQgdG8gY29tcGlsZSB0aGlzIGFzIGEgbW9kdWxlICggPSBjb2RlIHdoaWNoIGNhbiBiZQorCSAgaW5zZXJ0ZWQgaW4gYW5kIHJlbW92ZWQgZnJvbSB0aGUgcnVubmluZyBrZXJuZWwgd2hlbmV2ZXIgeW91IHdhbnQpLAorCSAgc2F5IE0gaGVyZSBhbmQgcmVhZCA8ZmlsZTpEb2N1bWVudGF0aW9uL21vZHVsZXMudHh0Pi4gIFRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIHNxdWFzaGZzLiAgTm90ZSB0aGF0IHRoZSByb290IGZpbGUgc3lzdGVtICh0aGUgb25lCisJICBjb250YWluaW5nIHRoZSBkaXJlY3RvcnkgLykgY2Fubm90IGJlIGNvbXBpbGVkIGFzIGEgbW9kdWxlLgorCisJICBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgU1FVQVNIRlNfRU1CRURERUQKKworCWJvb2wgIkFkZGl0aW9uYWwgb3B0aW9uIGZvciBtZW1vcnktY29uc3RyYWluZWQgc3lzdGVtcyIgCisJZGVwZW5kcyBvbiBTUVVBU0hGUworCWRlZmF1bHQgbgorCWhlbHAKKwkgIFNheWluZyBZIGhlcmUgYWxsb3dzIHlvdSB0byBzcGVjaWZ5IGNhY2hlIHNpemUuCisKKwkgIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBTUVVBU0hGU19GUkFHTUVOVF9DQUNIRV9TSVpFCisJaW50ICJOdW1iZXIgb2YgZnJhZ21lbnRzIGNhY2hlZCIgaWYgU1FVQVNIRlNfRU1CRURERUQKKwlkZXBlbmRzIG9uIFNRVUFTSEZTCisJZGVmYXVsdCAiMyIKKwloZWxwCisJICBCeSBkZWZhdWx0IFNxdWFzaEZTIGNhY2hlcyB0aGUgbGFzdCAzIGZyYWdtZW50cyByZWFkIGZyb20KKwkgIHRoZSBmaWxlc3lzdGVtLiAgSW5jcmVhc2luZyB0aGlzIGFtb3VudCBtYXkgbWVhbiBTcXVhc2hGUworCSAgaGFzIHRvIHJlLXJlYWQgZnJhZ21lbnRzIGxlc3Mgb2Z0ZW4gZnJvbSBkaXNrLCBhdCB0aGUgZXhwZW5zZQorCSAgb2YgZXh0cmEgc3lzdGVtIG1lbW9yeS4gIERlY3JlYXNpbmcgdGhpcyBhbW91bnQgd2lsbCBtZWFuCisJICBTcXVhc2hGUyB1c2VzIGxlc3MgbWVtb3J5IGF0IHRoZSBleHBlbnNlIG9mIGV4dHJhIHJlYWRzIGZyb20gZGlzay4KKworCSAgTm90ZSB0aGVyZSBtdXN0IGJlIGF0IGxlYXN0IG9uZSBjYWNoZWQgZnJhZ21lbnQuICBBbnl0aGluZworCSAgbXVjaCBtb3JlIHRoYW4gdGhyZWUgd2lsbCBwcm9iYWJseSBub3QgbWFrZSBtdWNoIGRpZmZlcmVuY2UuCisKIGNvbmZpZyBWWEZTX0ZTCiAJdHJpc3RhdGUgIkZyZWVWeEZTIGZpbGUgc3lzdGVtIHN1cHBvcnQgKFZFUklUQVMgVnhGUyhUTSkgY29tcGF0aWJsZSkiCiAJZGVwZW5kcyBvbiBCTE9DSwpkaWZmIC0tZ2l0IGEvZnMvS2NvbmZpZy5iaW5mbXQgYi9mcy9LY29uZmlnLmJpbmZtdAppbmRleCBjZTlmYjNmLi5iYjRjYzViIDEwMDY0NAotLS0gYS9mcy9LY29uZmlnLmJpbmZtdAorKysgYi9mcy9LY29uZmlnLmJpbmZtdApAQCAtNDMsNyArNDMsNyBAQAogY29uZmlnIENPUkVfRFVNUF9ERUZBVUxUX0VMRl9IRUFERVJTCiAJYm9vbCAiV3JpdGUgRUxGIGNvcmUgZHVtcHMgd2l0aCBwYXJ0aWFsIHNlZ21lbnRzIgogCWRlZmF1bHQgbgotCWRlcGVuZHMgb24gQklORk1UX0VMRgorCWRlcGVuZHMgb24gQklORk1UX0VMRiAmJiBFTEZfQ09SRQogCWhlbHAKIAkgIEVMRiBjb3JlIGR1bXAgZmlsZXMgZGVzY3JpYmUgZWFjaCBtZW1vcnkgbWFwcGluZyBvZiB0aGUgY3Jhc2hlZAogCSAgcHJvY2VzcywgYW5kIGNhbiBjb250YWluIG9yIG9taXQgdGhlIG1lbW9yeSBjb250ZW50cyBvZiBlYWNoIG9uZS4KZGlmZiAtLWdpdCBhL2ZzL01ha2VmaWxlIGIvZnMvTWFrZWZpbGUKaW5kZXggYzgzMDYxMS4uMzhiYzczNSAxMDA2NDQKLS0tIGEvZnMvTWFrZWZpbGUKKysrIGIvZnMvTWFrZWZpbGUKQEAgLTc0LDYgKzc0LDcgQEAKIG9iai0kKENPTkZJR19KQkQyKQkJKz0gamJkMi8KIG9iai0kKENPTkZJR19FWFQyX0ZTKQkJKz0gZXh0Mi8KIG9iai0kKENPTkZJR19DUkFNRlMpCQkrPSBjcmFtZnMvCitvYmotJChDT05GSUdfU1FVQVNIRlMpCQkrPSBzcXVhc2hmcy8KIG9iai15CQkJCSs9IHJhbWZzLwogb2JqLSQoQ09ORklHX0hVR0VUTEJGUykJCSs9IGh1Z2V0bGJmcy8KIG9iai0kKENPTkZJR19DT0RBX0ZTKQkJKz0gY29kYS8KQEAgLTExOSw0ICsxMjAsNSBAQAogb2JqLSQoQ09ORklHX0hQUEZTKQkJKz0gaHBwZnMvCiBvYmotJChDT05GSUdfREVCVUdfRlMpCQkrPSBkZWJ1Z2ZzLwogb2JqLSQoQ09ORklHX09DRlMyX0ZTKQkJKz0gb2NmczIvCitvYmotJChDT05GSUdfQlRSRlNfRlMpCQkrPSBidHJmcy8KIG9iai0kKENPTkZJR19HRlMyX0ZTKSAgICAgICAgICAgKz0gZ2ZzMi8KZGlmZiAtLWdpdCBhL2ZzL2Fpby5jIGIvZnMvYWlvLmMKaW5kZXggZDZmODlkMy4uOGZhNzdlMiAxMDA2NDQKLS0tIGEvZnMvYWlvLmMKKysrIGIvZnMvYWlvLmMKQEAgLTEyNzAsNyArMTI3MCw3IEBACiAgKglwb2ludGVyIGlzIHBhc3NlZCBmb3IgY3R4cC4gIFdpbGwgZmFpbCB3aXRoIC1FTk9TWVMgaWYgbm90CiAgKglpbXBsZW1lbnRlZC4KICAqLwotYXNtbGlua2FnZSBsb25nIHN5c19pb19zZXR1cCh1bnNpZ25lZCBucl9ldmVudHMsIGFpb19jb250ZXh0X3QgX191c2VyICpjdHhwKQorU1lTQ0FMTF9ERUZJTkUyKGlvX3NldHVwLCB1bnNpZ25lZCwgbnJfZXZlbnRzLCBhaW9fY29udGV4dF90IF9fdXNlciAqLCBjdHhwKQogewogCXN0cnVjdCBraW9jdHggKmlvY3R4ID0gTlVMTDsKIAl1bnNpZ25lZCBsb25nIGN0eDsKQEAgLTEzMDgsNyArMTMwOCw3IEBACiAgKglpbXBsZW1lbnRlZC4gIE1heSBmYWlsIHdpdGggLUVGQVVMVCBpZiB0aGUgY29udGV4dCBwb2ludGVkIHRvCiAgKglpcyBpbnZhbGlkLgogICovCi1hc21saW5rYWdlIGxvbmcgc3lzX2lvX2Rlc3Ryb3koYWlvX2NvbnRleHRfdCBjdHgpCitTWVNDQUxMX0RFRklORTEoaW9fZGVzdHJveSwgYWlvX2NvbnRleHRfdCwgY3R4KQogewogCXN0cnVjdCBraW9jdHggKmlvY3R4ID0gbG9va3VwX2lvY3R4KGN0eCk7CiAJaWYgKGxpa2VseShOVUxMICE9IGlvY3R4KSkgewpAQCAtMTY2Miw4ICsxNjYyLDggQEAKICAqCWFyZSBhdmFpbGFibGUgdG8gcXVldWUgYW55IGlvY2JzLiAgV2lsbCByZXR1cm4gMCBpZiBuciBpcyAwLiAgV2lsbAogICoJZmFpbCB3aXRoIC1FTk9TWVMgaWYgbm90IGltcGxlbWVudGVkLgogICovCi1hc21saW5rYWdlIGxvbmcgc3lzX2lvX3N1Ym1pdChhaW9fY29udGV4dF90IGN0eF9pZCwgbG9uZyBuciwKLQkJCSAgICAgIHN0cnVjdCBpb2NiIF9fdXNlciAqIF9fdXNlciAqaW9jYnBwKQorU1lTQ0FMTF9ERUZJTkUzKGlvX3N1Ym1pdCwgYWlvX2NvbnRleHRfdCwgY3R4X2lkLCBsb25nLCBuciwKKwkJc3RydWN0IGlvY2IgX191c2VyICogX191c2VyICosIGlvY2JwcCkKIHsKIAlzdHJ1Y3Qga2lvY3R4ICpjdHg7CiAJbG9uZyByZXQgPSAwOwpAQCAtMTczNyw4ICsxNzM3LDggQEAKICAqCWludmFsaWQuICBNYXkgZmFpbCB3aXRoIC1FQUdBSU4gaWYgdGhlIGlvY2Igc3BlY2lmaWVkIHdhcyBub3QKICAqCWNhbmNlbGxlZC4gIFdpbGwgZmFpbCB3aXRoIC1FTk9TWVMgaWYgbm90IGltcGxlbWVudGVkLgogICovCi1hc21saW5rYWdlIGxvbmcgc3lzX2lvX2NhbmNlbChhaW9fY29udGV4dF90IGN0eF9pZCwgc3RydWN0IGlvY2IgX191c2VyICppb2NiLAotCQkJICAgICAgc3RydWN0IGlvX2V2ZW50IF9fdXNlciAqcmVzdWx0KQorU1lTQ0FMTF9ERUZJTkUzKGlvX2NhbmNlbCwgYWlvX2NvbnRleHRfdCwgY3R4X2lkLCBzdHJ1Y3QgaW9jYiBfX3VzZXIgKiwgaW9jYiwKKwkJc3RydWN0IGlvX2V2ZW50IF9fdXNlciAqLCByZXN1bHQpCiB7CiAJaW50ICgqY2FuY2VsKShzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBpb19ldmVudCAqcmVzKTsKIAlzdHJ1Y3Qga2lvY3R4ICpjdHg7CkBAIC0xNzk5LDExICsxNzk5LDExIEBACiAgKgl3aWxsIGJlIHVwZGF0ZWQgaWYgbm90IE5VTEwgYW5kIHRoZSBvcGVyYXRpb24gYmxvY2tzLiAgV2lsbCBmYWlsCiAgKgl3aXRoIC1FTk9TWVMgaWYgbm90IGltcGxlbWVudGVkLgogICovCi1hc21saW5rYWdlIGxvbmcgc3lzX2lvX2dldGV2ZW50cyhhaW9fY29udGV4dF90IGN0eF9pZCwKLQkJCQkgbG9uZyBtaW5fbnIsCi0JCQkJIGxvbmcgbnIsCi0JCQkJIHN0cnVjdCBpb19ldmVudCBfX3VzZXIgKmV2ZW50cywKLQkJCQkgc3RydWN0IHRpbWVzcGVjIF9fdXNlciAqdGltZW91dCkKK1NZU0NBTExfREVGSU5FNShpb19nZXRldmVudHMsIGFpb19jb250ZXh0X3QsIGN0eF9pZCwKKwkJbG9uZywgbWluX25yLAorCQlsb25nLCBuciwKKwkJc3RydWN0IGlvX2V2ZW50IF9fdXNlciAqLCBldmVudHMsCisJCXN0cnVjdCB0aW1lc3BlYyBfX3VzZXIgKiwgdGltZW91dCkKIHsKIAlzdHJ1Y3Qga2lvY3R4ICppb2N0eCA9IGxvb2t1cF9pb2N0eChjdHhfaWQpOwogCWxvbmcgcmV0ID0gLUVJTlZBTDsKZGlmZiAtLWdpdCBhL2ZzL2JpbmZtdF9lbGYuYyBiL2ZzL2JpbmZtdF9lbGYuYwppbmRleCBjNDFmYTJhLi5lM2ZmMmI5IDEwMDY0NAotLS0gYS9mcy9iaW5mbXRfZWxmLmMKKysrIGIvZnMvYmluZm10X2VsZi5jCkBAIC0xNTIsOCArMTUyLDEwIEBACiAJZWxmX2FkZHJfdCBfX3VzZXIgKnNwOwogCWVsZl9hZGRyX3QgX191c2VyICp1X3BsYXRmb3JtOwogCWVsZl9hZGRyX3QgX191c2VyICp1X2Jhc2VfcGxhdGZvcm07CisJZWxmX2FkZHJfdCBfX3VzZXIgKnVfcmFuZF9ieXRlczsKIAljb25zdCBjaGFyICprX3BsYXRmb3JtID0gRUxGX1BMQVRGT1JNOwogCWNvbnN0IGNoYXIgKmtfYmFzZV9wbGF0Zm9ybSA9IEVMRl9CQVNFX1BMQVRGT1JNOworCXVuc2lnbmVkIGNoYXIga19yYW5kX2J5dGVzWzE2XTsKIAlpbnQgaXRlbXM7CiAJZWxmX2FkZHJfdCAqZWxmX2luZm87CiAJaW50IGVpX2luZGV4ID0gMDsKQEAgLTE5Niw2ICsxOTgsMTUgQEAKIAkJCXJldHVybiAtRUZBVUxUOwogCX0KIAorCS8qCisJICogR2VuZXJhdGUgMTYgcmFuZG9tIGJ5dGVzIGZvciB1c2Vyc3BhY2UgUFJORyBzZWVkaW5nLgorCSAqLworCWdldF9yYW5kb21fYnl0ZXMoa19yYW5kX2J5dGVzLCBzaXplb2Yoa19yYW5kX2J5dGVzKSk7CisJdV9yYW5kX2J5dGVzID0gKGVsZl9hZGRyX3QgX191c2VyICopCisJCSAgICAgICBTVEFDS19BTExPQyhwLCBzaXplb2Yoa19yYW5kX2J5dGVzKSk7CisJaWYgKF9fY29weV90b191c2VyKHVfcmFuZF9ieXRlcywga19yYW5kX2J5dGVzLCBzaXplb2Yoa19yYW5kX2J5dGVzKSkpCisJCXJldHVybiAtRUZBVUxUOworCiAJLyogQ3JlYXRlIHRoZSBFTEYgaW50ZXJwcmV0ZXIgaW5mbyAqLwogCWVsZl9pbmZvID0gKGVsZl9hZGRyX3QgKiljdXJyZW50LT5tbS0+c2F2ZWRfYXV4djsKIAkvKiB1cGRhdGUgQVRfVkVDVE9SX1NJWkVfQkFTRSBpZiB0aGUgbnVtYmVyIG9mIE5FV19BVVhfRU5UKCkgY2hhbmdlcyAqLwpAQCAtMjI4LDYgKzIzOSw3IEBACiAJTkVXX0FVWF9FTlQoQVRfR0lELCBjcmVkLT5naWQpOwogCU5FV19BVVhfRU5UKEFUX0VHSUQsIGNyZWQtPmVnaWQpOwogIAlORVdfQVVYX0VOVChBVF9TRUNVUkUsIHNlY3VyaXR5X2Jwcm1fc2VjdXJlZXhlYyhicHJtKSk7CisJTkVXX0FVWF9FTlQoQVRfUkFORE9NLCAoZWxmX2FkZHJfdCkodW5zaWduZWQgbG9uZyl1X3JhbmRfYnl0ZXMpOwogCU5FV19BVVhfRU5UKEFUX0VYRUNGTiwgYnBybS0+ZXhlYyk7CiAJaWYgKGtfcGxhdGZvcm0pIHsKIAkJTkVXX0FVWF9FTlQoQVRfUExBVEZPUk0sCmRpZmYgLS1naXQgYS9mcy9iaW5mbXRfZWxmX2ZkcGljLmMgYi9mcy9iaW5mbXRfZWxmX2ZkcGljLmMKaW5kZXggYWE1YjQzMi4uZjNlNzJjNSAxMDA2NDQKLS0tIGEvZnMvYmluZm10X2VsZl9mZHBpYy5jCisrKyBiL2ZzL2JpbmZtdF9lbGZfZmRwaWMuYwpAQCAtMTY4LDkgKzE2OCw2IEBACiAJc3RydWN0IGVsZl9mZHBpY19wYXJhbXMgZXhlY19wYXJhbXMsIGludGVycF9wYXJhbXM7CiAJc3RydWN0IGVsZl9waGRyICpwaGRyOwogCXVuc2lnbmVkIGxvbmcgc3RhY2tfc2l6ZSwgZW50cnlhZGRyOwotI2lmbmRlZiBDT05GSUdfTU1VCi0JdW5zaWduZWQgbG9uZyBmdWxsc2l6ZTsKLSNlbmRpZgogI2lmZGVmIEVMRl9GRFBJQ19QTEFUX0lOSVQKIAl1bnNpZ25lZCBsb25nIGR5bmFkZHI7CiAjZW5kaWYKQEAgLTM5MCwxMSArMzg3LDYgQEAKIAkJZ290byBlcnJvcl9raWxsOwogCX0KIAotCS8qIGV4cGFuZCB0aGUgc3RhY2sgbWFwcGluZyB0byB1c2UgdXAgdGhlIGVudGlyZSBhbGxvY2F0aW9uIGdyYW51bGUgKi8KLQlmdWxsc2l6ZSA9IGtvYmpzaXplKChjaGFyICopIGN1cnJlbnQtPm1tLT5zdGFydF9icmspOwotCWlmICghSVNfRVJSX1ZBTFVFKGRvX21yZW1hcChjdXJyZW50LT5tbS0+c3RhcnRfYnJrLCBzdGFja19zaXplLAotCQkJCSAgICBmdWxsc2l6ZSwgMCwgMCkpKQotCQlzdGFja19zaXplID0gZnVsbHNpemU7CiAJdXBfd3JpdGUoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7CiAKIAljdXJyZW50LT5tbS0+YnJrID0gY3VycmVudC0+bW0tPnN0YXJ0X2JyazsKQEAgLTE1NjcsMTEgKzE1NTksOSBAQAogc3RhdGljIGludCBlbGZfZmRwaWNfZHVtcF9zZWdtZW50cyhzdHJ1Y3QgZmlsZSAqZmlsZSwgc2l6ZV90ICpzaXplLAogCQkJICAgdW5zaWduZWQgbG9uZyAqbGltaXQsIHVuc2lnbmVkIGxvbmcgbW1fZmxhZ3MpCiB7Ci0Jc3RydWN0IHZtX2xpc3Rfc3RydWN0ICp2bWw7CisJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWE7CiAKLQlmb3IgKHZtbCA9IGN1cnJlbnQtPm1tLT5jb250ZXh0LnZtbGlzdDsgdm1sOyB2bWwgPSB2bWwtPm5leHQpIHsKLQlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSA9IHZtbC0+dm1hOwotCisJZm9yICh2bWEgPSBjdXJyZW50LT5tbS0+bW1hcDsgdm1hOyB2bWEgPSB2bWEtPnZtX25leHQpIHsKIAkJaWYgKCFtYXlkdW1wKHZtYSwgbW1fZmxhZ3MpKQogCQkJY29udGludWU7CiAKQEAgLTE2MTcsOSArMTYwNyw2IEBACiAJZWxmX2ZweHJlZ3NldF90ICp4ZnB1ID0gTlVMTDsKICNlbmRpZgogCWludCB0aHJlYWRfc3RhdHVzX3NpemUgPSAwOwotI2lmbmRlZiBDT05GSUdfTU1VCi0Jc3RydWN0IHZtX2xpc3Rfc3RydWN0ICp2bWw7Ci0jZW5kaWYKIAllbGZfYWRkcl90ICphdXh2OwogCXVuc2lnbmVkIGxvbmcgbW1fZmxhZ3M7CiAKQEAgLTE2ODUsMTMgKzE2NzIsNyBAQAogCWZpbGxfcHJzdGF0dXMocHJzdGF0dXMsIGN1cnJlbnQsIHNpZ25yKTsKIAllbGZfY29yZV9jb3B5X3JlZ3MoJnByc3RhdHVzLT5wcl9yZWcsIHJlZ3MpOwogCi0jaWZkZWYgQ09ORklHX01NVQogCXNlZ3MgPSBjdXJyZW50LT5tbS0+bWFwX2NvdW50OwotI2Vsc2UKLQlzZWdzID0gMDsKLQlmb3IgKHZtbCA9IGN1cnJlbnQtPm1tLT5jb250ZXh0LnZtbGlzdDsgdm1sOyB2bWwgPSB2bWwtPm5leHQpCi0JICAgIHNlZ3MrKzsKLSNlbmRpZgogI2lmZGVmIEVMRl9DT1JFX0VYVFJBX1BIRFJTCiAJc2VncyArPSBFTEZfQ09SRV9FWFRSQV9QSERSUzsKICNlbmRpZgpAQCAtMTc2NiwyMCArMTc0NywxMCBAQAogCW1tX2ZsYWdzID0gY3VycmVudC0+bW0tPmZsYWdzOwogCiAJLyogd3JpdGUgcHJvZ3JhbSBoZWFkZXJzIGZvciBzZWdtZW50cyBkdW1wICovCi0JZm9yICgKLSNpZmRlZiBDT05GSUdfTU1VCi0JCXZtYSA9IGN1cnJlbnQtPm1tLT5tbWFwOyB2bWE7IHZtYSA9IHZtYS0+dm1fbmV4dAotI2Vsc2UKLQkJCXZtbCA9IGN1cnJlbnQtPm1tLT5jb250ZXh0LnZtbGlzdDsgdm1sOyB2bWwgPSB2bWwtPm5leHQKLSNlbmRpZgotCSAgICAgKSB7CisJZm9yICh2bWEgPSBjdXJyZW50LT5tbS0+bW1hcDsgdm1hOyB2bWEgPSB2bWEtPnZtX25leHQpIHsKIAkJc3RydWN0IGVsZl9waGRyIHBoZHI7CiAJCXNpemVfdCBzejsKIAotI2lmbmRlZiBDT05GSUdfTU1VCi0JCXZtYSA9IHZtbC0+dm1hOwotI2VuZGlmCi0KIAkJc3ogPSB2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQ7CiAKIAkJcGhkci5wX3R5cGUgPSBQVF9MT0FEOwpkaWZmIC0tZ2l0IGEvZnMvYmluZm10X2ZsYXQuYyBiL2ZzL2JpbmZtdF9mbGF0LmMKaW5kZXggN2JiZDVjNi4uNWNlYmYwYiAxMDA2NDQKLS0tIGEvZnMvYmluZm10X2ZsYXQuYworKysgYi9mcy9iaW5mbXRfZmxhdC5jCkBAIC00MTcsOCArNDE3LDggQEAKIAl1bnNpZ25lZCBsb25nIHRleHRwb3MgPSAwLCBkYXRhcG9zID0gMCwgcmVzdWx0OwogCXVuc2lnbmVkIGxvbmcgcmVhbGRhdGFzdGFydCA9IDA7CiAJdW5zaWduZWQgbG9uZyB0ZXh0X2xlbiwgZGF0YV9sZW4sIGJzc19sZW4sIHN0YWNrX2xlbiwgZmxhZ3M7Ci0JdW5zaWduZWQgbG9uZyBsZW4sIHJlYWxsZW4sIG1lbXAgPSAwOwotCXVuc2lnbmVkIGxvbmcgZXh0cmEsIHJsaW07CisJdW5zaWduZWQgbG9uZyBsZW4sIG1lbXAgPSAwOworCXVuc2lnbmVkIGxvbmcgbWVtcF9zaXplLCBleHRyYSwgcmxpbTsKIAl1bnNpZ25lZCBsb25nICpyZWxvYyA9IDAsICpycDsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlOwogCWludCBpLCByZXYsIHJlbG9jcyA9IDA7CkBAIC01NDMsMTcgKzU0MywxMCBAQAogCQl9CiAKIAkJbGVuID0gZGF0YV9sZW4gKyBleHRyYSArIE1BWF9TSEFSRURfTElCUyAqIHNpemVvZih1bnNpZ25lZCBsb25nKTsKKwkJbGVuID0gUEFHRV9BTElHTihsZW4pOwogCQlkb3duX3dyaXRlKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOwogCQlyZWFsZGF0YXN0YXJ0ID0gZG9fbW1hcCgwLCAwLCBsZW4sCiAJCQlQUk9UX1JFQUR8UFJPVF9XUklURXxQUk9UX0VYRUMsIE1BUF9QUklWQVRFLCAwKTsKLQkJLyogUmVtYXAgdG8gdXNlIGFsbCBhdmFpbGFiZSBzbGFjayByZWdpb24gc3BhY2UgKi8KLQkJaWYgKHJlYWxkYXRhc3RhcnQgJiYgKHJlYWxkYXRhc3RhcnQgPCAodW5zaWduZWQgbG9uZyktNDA5NikpIHsKLQkJCXJlYWxsZW4gPSBrb2Jqc2l6ZSgodm9pZCAqKXJlYWxkYXRhc3RhcnQpOwotCQkJaWYgKHJlYWxsZW4gPiBsZW4pIHsKLQkJCQlyZWFsZGF0YXN0YXJ0ID0gZG9fbXJlbWFwKHJlYWxkYXRhc3RhcnQsIGxlbiwKLQkJCQkJcmVhbGxlbiwgTVJFTUFQX0ZJWEVELCByZWFsZGF0YXN0YXJ0KTsKLQkJCX0KLQkJfQogCQl1cF93cml0ZSgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKIAogCQlpZiAocmVhbGRhdGFzdGFydCA9PSAwIHx8IHJlYWxkYXRhc3RhcnQgPj0gKHVuc2lnbmVkIGxvbmcpLTQwOTYpIHsKQEAgLTU5MSwyMSArNTg0LDE0IEBACiAKIAkJcmVsb2MgPSAodW5zaWduZWQgbG9uZyAqKSAoZGF0YXBvcysobnRvaGwoaGRyLT5yZWxvY19zdGFydCktdGV4dF9sZW4pKTsKIAkJbWVtcCA9IHJlYWxkYXRhc3RhcnQ7Ci0KKwkJbWVtcF9zaXplID0gbGVuOwogCX0gZWxzZSB7CiAKIAkJbGVuID0gdGV4dF9sZW4gKyBkYXRhX2xlbiArIGV4dHJhICsgTUFYX1NIQVJFRF9MSUJTICogc2l6ZW9mKHVuc2lnbmVkIGxvbmcpOworCQlsZW4gPSBQQUdFX0FMSUdOKGxlbik7CiAJCWRvd25fd3JpdGUoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7CiAJCXRleHRwb3MgPSBkb19tbWFwKDAsIDAsIGxlbiwKIAkJCVBST1RfUkVBRCB8IFBST1RfRVhFQyB8IFBST1RfV1JJVEUsIE1BUF9QUklWQVRFLCAwKTsKLQkJLyogUmVtYXAgdG8gdXNlIGFsbCBhdmFpbGFiZSBzbGFjayByZWdpb24gc3BhY2UgKi8KLQkJaWYgKHRleHRwb3MgJiYgKHRleHRwb3MgPCAodW5zaWduZWQgbG9uZykgLTQwOTYpKSB7Ci0JCQlyZWFsbGVuID0ga29ianNpemUoKHZvaWQgKil0ZXh0cG9zKTsKLQkJCWlmIChyZWFsbGVuID4gbGVuKSB7Ci0JCQkJdGV4dHBvcyA9IGRvX21yZW1hcCh0ZXh0cG9zLCBsZW4sIHJlYWxsZW4sCi0JCQkJCU1SRU1BUF9GSVhFRCwgdGV4dHBvcyk7Ci0JCQl9Ci0JCX0KIAkJdXBfd3JpdGUoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7CiAKIAkJaWYgKCF0ZXh0cG9zICB8fCB0ZXh0cG9zID49ICh1bnNpZ25lZCBsb25nKSAtNDA5NikgewpAQCAtNjIyLDcgKzYwOCw3IEBACiAJCXJlbG9jID0gKHVuc2lnbmVkIGxvbmcgKikgKHRleHRwb3MgKyBudG9obChoZHItPnJlbG9jX3N0YXJ0KSArCiAJCQkJTUFYX1NIQVJFRF9MSUJTICogc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKTsKIAkJbWVtcCA9IHRleHRwb3M7Ci0KKwkJbWVtcF9zaXplID0gbGVuOwogI2lmZGVmIENPTkZJR19CSU5GTVRfWkZMQVQKIAkJLyoKIAkJICogbG9hZCBpdCBhbGwgaW4gYW5kIHRyZWF0IGl0IGxpa2UgYSBSQU0gbG9hZCBmcm9tIG5vdyBvbgpAQCAtNjgwLDEwICs2NjYsMTIgQEAKIAkJICogc2V0IHVwIHRoZSBicmsgc3R1ZmYsIHVzZXMgYW55IHNsYWNrIGxlZnQgaW4gZGF0YS9ic3Mvc3RhY2sKIAkJICogYWxsb2NhdGlvbi4gIFdlIHB1dCB0aGUgYnJrIGFmdGVyIHRoZSBic3MgKGJldHdlZW4gdGhlIGJzcwogCQkgKiBhbmQgc3RhY2spIGxpa2Ugb3RoZXIgcGxhdGZvcm1zLgorCQkgKiBVc2Vyc3BhY2UgY29kZSByZWxpZXMgb24gdGhlIHN0YWNrIHBvaW50ZXIgc3RhcnRpbmcgb3V0IGF0CisJCSAqIGFuIGFkZHJlc3MgcmlnaHQgYXQgdGhlIGVuZCBvZiBhIHBhZ2UuCiAJCSAqLwogCQljdXJyZW50LT5tbS0+c3RhcnRfYnJrID0gZGF0YXBvcyArIGRhdGFfbGVuICsgYnNzX2xlbjsKIAkJY3VycmVudC0+bW0tPmJyayA9IChjdXJyZW50LT5tbS0+c3RhcnRfYnJrICsgMykgJiB+MzsKLQkJY3VycmVudC0+bW0tPmNvbnRleHQuZW5kX2JyayA9IG1lbXAgKyBrb2Jqc2l6ZSgodm9pZCAqKSBtZW1wKSAtIHN0YWNrX2xlbjsKKwkJY3VycmVudC0+bW0tPmNvbnRleHQuZW5kX2JyayA9IG1lbXAgKyBtZW1wX3NpemUgLSBzdGFja19sZW47CiAJfQogCiAJaWYgKGZsYWdzICYgRkxBVF9GTEFHX0tUUkFDRSkKQEAgLTc5MCw4ICs3NzgsOCBAQAogCiAJLyogemVybyB0aGUgQlNTLCAgQlJLIGFuZCBzdGFjayBhcmVhcyAqLwogCW1lbXNldCgodm9pZCopKGRhdGFwb3MgKyBkYXRhX2xlbiksIDAsIGJzc19sZW4gKyAKLQkJCShtZW1wICsga29ianNpemUoKHZvaWQgKikgbWVtcCkgLSBzdGFja19sZW4gLQkvKiBlbmQgYnJrICovCi0JCQlsaWJpbmZvLT5saWJfbGlzdFtpZF0uc3RhcnRfYnJrKSArCQkvKiBzdGFydCBicmsgKi8KKwkJCShtZW1wICsgbWVtcF9zaXplIC0gc3RhY2tfbGVuIC0JCS8qIGVuZCBicmsgKi8KKwkJCWxpYmluZm8tPmxpYl9saXN0W2lkXS5zdGFydF9icmspICsJLyogc3RhcnQgYnJrICovCiAJCQlzdGFja19sZW4pOwogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9mcy9iaW8uYyBiL2ZzL2Jpby5jCmluZGV4IDcxMWNlZTEuLjA2MjI5OWEgMTAwNjQ0Ci0tLSBhL2ZzL2Jpby5jCisrKyBiL2ZzL2Jpby5jCkBAIC03ODgsNiArNzg4LDcgQEAKIAlpbnQgaSwgcmV0OwogCWludCBucl9wYWdlcyA9IDA7CiAJdW5zaWduZWQgaW50IGxlbiA9IDA7CisJdW5zaWduZWQgaW50IG9mZnNldCA9IG1hcF9kYXRhID8gbWFwX2RhdGEtPm9mZnNldCAmIH5QQUdFX01BU0sgOiAwOwogCiAJZm9yIChpID0gMDsgaSA8IGlvdl9jb3VudDsgaSsrKSB7CiAJCXVuc2lnbmVkIGxvbmcgdWFkZHI7CkBAIC04MTQsMzUgKzgxNSw0MiBAQAogCWJpby0+YmlfcncgfD0gKCF3cml0ZV90b192bSA8PCBCSU9fUlcpOwogCiAJcmV0ID0gMDsKLQlpID0gMDsKLQl3aGlsZSAobGVuKSB7Ci0JCXVuc2lnbmVkIGludCBieXRlczsKIAotCQlpZiAobWFwX2RhdGEpCi0JCQlieXRlcyA9IDFVIDw8IChQQUdFX1NISUZUICsgbWFwX2RhdGEtPnBhZ2Vfb3JkZXIpOwotCQllbHNlCi0JCQlieXRlcyA9IFBBR0VfU0laRTsKKwlpZiAobWFwX2RhdGEpIHsKKwkJbnJfcGFnZXMgPSAxIDw8IG1hcF9kYXRhLT5wYWdlX29yZGVyOworCQlpID0gbWFwX2RhdGEtPm9mZnNldCAvIFBBR0VfU0laRTsKKwl9CisJd2hpbGUgKGxlbikgeworCQl1bnNpZ25lZCBpbnQgYnl0ZXMgPSBQQUdFX1NJWkU7CisKKwkJYnl0ZXMgLT0gb2Zmc2V0OwogCiAJCWlmIChieXRlcyA+IGxlbikKIAkJCWJ5dGVzID0gbGVuOwogCiAJCWlmIChtYXBfZGF0YSkgewotCQkJaWYgKGkgPT0gbWFwX2RhdGEtPm5yX2VudHJpZXMpIHsKKwkJCWlmIChpID09IG1hcF9kYXRhLT5ucl9lbnRyaWVzICogbnJfcGFnZXMpIHsKIAkJCQlyZXQgPSAtRU5PTUVNOwogCQkJCWJyZWFrOwogCQkJfQotCQkJcGFnZSA9IG1hcF9kYXRhLT5wYWdlc1tpKytdOwotCQl9IGVsc2UKKworCQkJcGFnZSA9IG1hcF9kYXRhLT5wYWdlc1tpIC8gbnJfcGFnZXNdOworCQkJcGFnZSArPSAoaSAlIG5yX3BhZ2VzKTsKKworCQkJaSsrOworCQl9IGVsc2UgewogCQkJcGFnZSA9IGFsbG9jX3BhZ2UocS0+Ym91bmNlX2dmcCB8IGdmcF9tYXNrKTsKLQkJaWYgKCFwYWdlKSB7Ci0JCQlyZXQgPSAtRU5PTUVNOwotCQkJYnJlYWs7CisJCQlpZiAoIXBhZ2UpIHsKKwkJCQlyZXQgPSAtRU5PTUVNOworCQkJCWJyZWFrOworCQkJfQogCQl9CiAKLQkJaWYgKGJpb19hZGRfcGNfcGFnZShxLCBiaW8sIHBhZ2UsIGJ5dGVzLCAwKSA8IGJ5dGVzKQorCQlpZiAoYmlvX2FkZF9wY19wYWdlKHEsIGJpbywgcGFnZSwgYnl0ZXMsIG9mZnNldCkgPCBieXRlcykKIAkJCWJyZWFrOwogCiAJCWxlbiAtPSBieXRlczsKKwkJb2Zmc2V0ID0gMDsKIAl9CiAKIAlpZiAocmV0KQpAQCAtODUxLDcgKzg1OSw3IEBACiAJLyoKIAkgKiBzdWNjZXNzCiAJICovCi0JaWYgKCF3cml0ZV90b192bSkgeworCWlmICghd3JpdGVfdG9fdm0gJiYgKCFtYXBfZGF0YSB8fCAhbWFwX2RhdGEtPm51bGxfbWFwcGVkKSkgewogCQlyZXQgPSBfX2Jpb19jb3B5X2lvdihiaW8sIGJpby0+YmlfaW9fdmVjLCBpb3YsIGlvdl9jb3VudCwgMCwgMCk7CiAJCWlmIChyZXQpCiAJCQlnb3RvIGNsZWFudXA7CmRpZmYgLS1naXQgYS9mcy9ibG9ja19kZXYuYyBiL2ZzL2Jsb2NrX2Rldi5jCmluZGV4IGI5NTc3MTcuLmIzYzFlZmYgMTAwNjQ0Ci0tLSBhL2ZzL2Jsb2NrX2Rldi5jCisrKyBiL2ZzL2Jsb2NrX2Rldi5jCkBAIC0yODUsNiArMjg1LDggQEAKIAlJTklUX0xJU1RfSEVBRCgmYmRldi0+YmRfaG9sZGVyX2xpc3QpOwogI2VuZGlmCiAJaW5vZGVfaW5pdF9vbmNlKCZlaS0+dmZzX2lub2RlKTsKKwkvKiBJbml0aWFsaXplIG11dGV4IGZvciBmcmVlemUuICovCisJbXV0ZXhfaW5pdCgmYmRldi0+YmRfZnNmcmVlemVfbXV0ZXgpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgX19iZF9mb3JnZXQoc3RydWN0IGlub2RlICppbm9kZSkKQEAgLTEwMDUsNiArMTAwNyw3IEBACiAJfQogCiAJbG9ja19rZXJuZWwoKTsKKyByZXN0YXJ0OgogCiAJcmV0ID0gLUVOWElPOwogCWRpc2sgPSBnZXRfZ2VuZGlzayhiZGV2LT5iZF9kZXYsICZwYXJ0bm8pOwpAQCAtMTAyNSw2ICsxMDI4LDE5IEBACiAKIAkJCWlmIChkaXNrLT5mb3BzLT5vcGVuKSB7CiAJCQkJcmV0ID0gZGlzay0+Zm9wcy0+b3BlbihiZGV2LCBtb2RlKTsKKwkJCQlpZiAocmV0ID09IC1FUkVTVEFSVFNZUykgeworCQkJCQkvKiBMb3N0IGEgcmFjZSB3aXRoICdkaXNrJyBiZWluZworCQkJCQkgKiBkZWxldGVkLCB0cnkgYWdhaW4uCisJCQkJCSAqIFNlZSBtZC5jCisJCQkJCSAqLworCQkJCQlkaXNrX3B1dF9wYXJ0KGJkZXYtPmJkX3BhcnQpOworCQkJCQliZGV2LT5iZF9wYXJ0ID0gTlVMTDsKKwkJCQkJbW9kdWxlX3B1dChkaXNrLT5mb3BzLT5vd25lcik7CisJCQkJCXB1dF9kaXNrKGRpc2spOworCQkJCQliZGV2LT5iZF9kaXNrID0gTlVMTDsKKwkJCQkJbXV0ZXhfdW5sb2NrKCZiZGV2LT5iZF9tdXRleCk7CisJCQkJCWdvdG8gcmVzdGFydDsKKwkJCQl9CiAJCQkJaWYgKHJldCkKIAkJCQkJZ290byBvdXRfY2xlYXI7CiAJCQl9CkBAIC0xMjIwLDYgKzEyMzYsMjAgQEAKIAlyZXR1cm4gYmxrZGV2X2lvY3RsKGJkZXYsIG1vZGUsIGNtZCwgYXJnKTsKIH0KIAorLyoKKyAqIFRyeSB0byByZWxlYXNlIGEgcGFnZSBhc3NvY2lhdGVkIHdpdGggYmxvY2sgZGV2aWNlIHdoZW4gdGhlIHN5c3RlbQorICogaXMgdW5kZXIgbWVtb3J5IHByZXNzdXJlLgorICovCitzdGF0aWMgaW50IGJsa2Rldl9yZWxlYXNlcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSwgZ2ZwX3Qgd2FpdCkKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnN1cGVyID0gQkRFVl9JKHBhZ2UtPm1hcHBpbmctPmhvc3QpLT5iZGV2LmJkX3N1cGVyOworCisJaWYgKHN1cGVyICYmIHN1cGVyLT5zX29wLT5iZGV2X3RyeV90b19mcmVlX3BhZ2UpCisJCXJldHVybiBzdXBlci0+c19vcC0+YmRldl90cnlfdG9fZnJlZV9wYWdlKHN1cGVyLCBwYWdlLCB3YWl0KTsKKworCXJldHVybiB0cnlfdG9fZnJlZV9idWZmZXJzKHBhZ2UpOworfQorCiBzdGF0aWMgY29uc3Qgc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyBkZWZfYmxrX2FvcHMgPSB7CiAJLnJlYWRwYWdlCT0gYmxrZGV2X3JlYWRwYWdlLAogCS53cml0ZXBhZ2UJPSBibGtkZXZfd3JpdGVwYWdlLApAQCAtMTIyNyw2ICsxMjU3LDcgQEAKIAkud3JpdGVfYmVnaW4JPSBibGtkZXZfd3JpdGVfYmVnaW4sCiAJLndyaXRlX2VuZAk9IGJsa2Rldl93cml0ZV9lbmQsCiAJLndyaXRlcGFnZXMJPSBnZW5lcmljX3dyaXRlcGFnZXMsCisJLnJlbGVhc2VwYWdlCT0gYmxrZGV2X3JlbGVhc2VwYWdlLAogCS5kaXJlY3RfSU8JPSBibGtkZXZfZGlyZWN0X0lPLAogfTsKIApkaWZmIC0tZ2l0IGEvZnMvYnRyZnMvTWFrZWZpbGUgYi9mcy9idHJmcy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMmNmNWE1Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvYnRyZnMvTWFrZWZpbGUKQEAgLTAsMCArMSwyNSBAQAoraWZuZXEgKCQoS0VSTkVMUkVMRUFTRSksKQorIyBrYnVpbGQgcGFydCBvZiBtYWtlZmlsZQorCitvYmotJChDT05GSUdfQlRSRlNfRlMpIDo9IGJ0cmZzLm8KK2J0cmZzLXkgOj0gc3VwZXIubyBjdHJlZS5vIGV4dGVudC10cmVlLm8gcHJpbnQtdHJlZS5vIHJvb3QtdHJlZS5vIGRpci1pdGVtLm8gXAorCSAgIGZpbGUtaXRlbS5vIGlub2RlLWl0ZW0ubyBpbm9kZS1tYXAubyBkaXNrLWlvLm8gXAorCSAgIHRyYW5zYWN0aW9uLm8gaW5vZGUubyBmaWxlLm8gdHJlZS1kZWZyYWcubyBcCisJICAgZXh0ZW50X21hcC5vIHN5c2ZzLm8gc3RydWN0LWZ1bmNzLm8geGF0dHIubyBvcmRlcmVkLWRhdGEubyBcCisJICAgZXh0ZW50X2lvLm8gdm9sdW1lcy5vIGFzeW5jLXRocmVhZC5vIGlvY3RsLm8gbG9ja2luZy5vIG9ycGhhbi5vIFwKKwkgICByZWYtY2FjaGUubyBleHBvcnQubyB0cmVlLWxvZy5vIGFjbC5vIGZyZWUtc3BhY2UtY2FjaGUubyB6bGliLm8gXAorCSAgIGNvbXByZXNzaW9uLm8KK2Vsc2UKKworIyBOb3JtYWwgTWFrZWZpbGUKKworS0VSTkVMRElSIDo9IC9saWIvbW9kdWxlcy9gdW5hbWUgLXJgL2J1aWxkCithbGw6CisJJChNQUtFKSAtQyAkKEtFUk5FTERJUikgTT1gcHdkYCBDT05GSUdfQlRSRlNfRlM9bSBtb2R1bGVzCisKK21vZHVsZXNfaW5zdGFsbDoKKwkkKE1BS0UpIC1DICQoS0VSTkVMRElSKSBNPWBwd2RgIG1vZHVsZXNfaW5zdGFsbAorY2xlYW46CisJJChNQUtFKSAtQyAkKEtFUk5FTERJUikgTT1gcHdkYCBjbGVhbgorCitlbmRpZgpkaWZmIC0tZ2l0IGEvZnMvYnRyZnMvYWNsLmMgYi9mcy9idHJmcy9hY2wuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDUzYjYyCi0tLSAvZGV2L251bGwKKysrIGIvZnMvYnRyZnMvYWNsLmMKQEAgLTAsMCArMSwzNTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgUmVkIEhhdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIHYyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCisgKiBCb3N0b24sIE1BIDAyMTExMC0xMzA3LCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgveGF0dHIuaD4KKyNpbmNsdWRlIDxsaW51eC9wb3NpeF9hY2xfeGF0dHIuaD4KKyNpbmNsdWRlIDxsaW51eC9wb3NpeF9hY2wuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorCisjaW5jbHVkZSAiY3RyZWUuaCIKKyNpbmNsdWRlICJidHJmc19pbm9kZS5oIgorI2luY2x1ZGUgInhhdHRyLmgiCisKKyNpZmRlZiBDT05GSUdfRlNfUE9TSVhfQUNMCisKK3N0YXRpYyB2b2lkIGJ0cmZzX3VwZGF0ZV9jYWNoZWRfYWNsKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJICAgIHN0cnVjdCBwb3NpeF9hY2wgKipwX2FjbCwKKwkJCQkgICAgc3RydWN0IHBvc2l4X2FjbCAqYWNsKQoreworCXNwaW5fbG9jaygmaW5vZGUtPmlfbG9jayk7CisJaWYgKCpwX2FjbCAmJiAqcF9hY2wgIT0gQlRSRlNfQUNMX05PVF9DQUNIRUQpCisJCXBvc2l4X2FjbF9yZWxlYXNlKCpwX2FjbCk7CisJKnBfYWNsID0gcG9zaXhfYWNsX2R1cChhY2wpOworCXNwaW5fdW5sb2NrKCZpbm9kZS0+aV9sb2NrKTsKK30KKworc3RhdGljIHN0cnVjdCBwb3NpeF9hY2wgKmJ0cmZzX2dldF9hY2woc3RydWN0IGlub2RlICppbm9kZSwgaW50IHR5cGUpCit7CisJaW50IHNpemU7CisJY29uc3QgY2hhciAqbmFtZTsKKwljaGFyICp2YWx1ZSA9IE5VTEw7CisJc3RydWN0IHBvc2l4X2FjbCAqYWNsID0gTlVMTCwgKipwX2FjbDsKKworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgQUNMX1RZUEVfQUNDRVNTOgorCQluYW1lID0gUE9TSVhfQUNMX1hBVFRSX0FDQ0VTUzsKKwkJcF9hY2wgPSAmQlRSRlNfSShpbm9kZSktPmlfYWNsOworCQlicmVhazsKKwljYXNlIEFDTF9UWVBFX0RFRkFVTFQ6CisJCW5hbWUgPSBQT1NJWF9BQ0xfWEFUVFJfREVGQVVMVDsKKwkJcF9hY2wgPSAmQlRSRlNfSShpbm9kZSktPmlfZGVmYXVsdF9hY2w7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOworCX0KKworCXNwaW5fbG9jaygmaW5vZGUtPmlfbG9jayk7CisJaWYgKCpwX2FjbCAhPSBCVFJGU19BQ0xfTk9UX0NBQ0hFRCkKKwkJYWNsID0gcG9zaXhfYWNsX2R1cCgqcF9hY2wpOworCXNwaW5fdW5sb2NrKCZpbm9kZS0+aV9sb2NrKTsKKworCWlmIChhY2wpCisJCXJldHVybiBhY2w7CisKKworCXNpemUgPSBfX2J0cmZzX2dldHhhdHRyKGlub2RlLCBuYW1lLCAiIiwgMCk7CisJaWYgKHNpemUgPiAwKSB7CisJCXZhbHVlID0ga3phbGxvYyhzaXplLCBHRlBfTk9GUyk7CisJCWlmICghdmFsdWUpCisJCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwkJc2l6ZSA9IF9fYnRyZnNfZ2V0eGF0dHIoaW5vZGUsIG5hbWUsIHZhbHVlLCBzaXplKTsKKwkJaWYgKHNpemUgPiAwKSB7CisJCQlhY2wgPSBwb3NpeF9hY2xfZnJvbV94YXR0cih2YWx1ZSwgc2l6ZSk7CisJCQlidHJmc191cGRhdGVfY2FjaGVkX2FjbChpbm9kZSwgcF9hY2wsIGFjbCk7CisJCX0KKwkJa2ZyZWUodmFsdWUpOworCX0gZWxzZSBpZiAoc2l6ZSA9PSAtRU5PRU5UKSB7CisJCWFjbCA9IE5VTEw7CisJCWJ0cmZzX3VwZGF0ZV9jYWNoZWRfYWNsKGlub2RlLCBwX2FjbCwgYWNsKTsKKwl9CisKKwlyZXR1cm4gYWNsOworfQorCitzdGF0aWMgaW50IGJ0cmZzX3hhdHRyX2dldF9hY2woc3RydWN0IGlub2RlICppbm9kZSwgaW50IHR5cGUsCisJCQkgICAgICAgdm9pZCAqdmFsdWUsIHNpemVfdCBzaXplKQoreworCXN0cnVjdCBwb3NpeF9hY2wgKmFjbDsKKwlpbnQgcmV0ID0gMDsKKworCWFjbCA9IGJ0cmZzX2dldF9hY2woaW5vZGUsIHR5cGUpOworCisJaWYgKElTX0VSUihhY2wpKQorCQlyZXR1cm4gUFRSX0VSUihhY2wpOworCWlmIChhY2wgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9EQVRBOworCXJldCA9IHBvc2l4X2FjbF90b194YXR0cihhY2wsIHZhbHVlLCBzaXplKTsKKwlwb3NpeF9hY2xfcmVsZWFzZShhY2wpOworCisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIE5lZWRzIHRvIGJlIGNhbGxlZCB3aXRoIGZzX211dGV4IGhlbGQKKyAqLworc3RhdGljIGludCBidHJmc19zZXRfYWNsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBwb3NpeF9hY2wgKmFjbCwgaW50IHR5cGUpCit7CisJaW50IHJldCwgc2l6ZSA9IDA7CisJY29uc3QgY2hhciAqbmFtZTsKKwlzdHJ1Y3QgcG9zaXhfYWNsICoqcF9hY2w7CisJY2hhciAqdmFsdWUgPSBOVUxMOworCW1vZGVfdCBtb2RlOworCisJaWYgKGFjbCkgeworCQlyZXQgPSBwb3NpeF9hY2xfdmFsaWQoYWNsKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCQlyZXQgPSAwOworCX0KKworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgQUNMX1RZUEVfQUNDRVNTOgorCQltb2RlID0gaW5vZGUtPmlfbW9kZTsKKwkJcmV0ID0gcG9zaXhfYWNsX2VxdWl2X21vZGUoYWNsLCAmbW9kZSk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKwkJcmV0ID0gMDsKKwkJaW5vZGUtPmlfbW9kZSA9IG1vZGU7CisJCW5hbWUgPSBQT1NJWF9BQ0xfWEFUVFJfQUNDRVNTOworCQlwX2FjbCA9ICZCVFJGU19JKGlub2RlKS0+aV9hY2w7CisJCWJyZWFrOworCWNhc2UgQUNMX1RZUEVfREVGQVVMVDoKKwkJaWYgKCFTX0lTRElSKGlub2RlLT5pX21vZGUpKQorCQkJcmV0dXJuIGFjbCA/IC1FSU5WQUwgOiAwOworCQluYW1lID0gUE9TSVhfQUNMX1hBVFRSX0RFRkFVTFQ7CisJCXBfYWNsID0gJkJUUkZTX0koaW5vZGUpLT5pX2RlZmF1bHRfYWNsOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoYWNsKSB7CisJCXNpemUgPSBwb3NpeF9hY2xfeGF0dHJfc2l6ZShhY2wtPmFfY291bnQpOworCQl2YWx1ZSA9IGttYWxsb2Moc2l6ZSwgR0ZQX05PRlMpOworCQlpZiAoIXZhbHVlKSB7CisJCQlyZXQgPSAtRU5PTUVNOworCQkJZ290byBvdXQ7CisJCX0KKworCQlyZXQgPSBwb3NpeF9hY2xfdG9feGF0dHIoYWNsLCB2YWx1ZSwgc2l6ZSk7CisJCWlmIChyZXQgPCAwKQorCQkJZ290byBvdXQ7CisJfQorCisJcmV0ID0gX19idHJmc19zZXR4YXR0cihpbm9kZSwgbmFtZSwgdmFsdWUsIHNpemUsIDApOworCitvdXQ6CisJa2ZyZWUodmFsdWUpOworCisJaWYgKCFyZXQpCisJCWJ0cmZzX3VwZGF0ZV9jYWNoZWRfYWNsKGlub2RlLCBwX2FjbCwgYWNsKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYnRyZnNfeGF0dHJfc2V0X2FjbChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgdHlwZSwKKwkJCSAgICAgICBjb25zdCB2b2lkICp2YWx1ZSwgc2l6ZV90IHNpemUpCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IHBvc2l4X2FjbCAqYWNsID0gTlVMTDsKKworCWlmICh2YWx1ZSkgeworCQlhY2wgPSBwb3NpeF9hY2xfZnJvbV94YXR0cih2YWx1ZSwgc2l6ZSk7CisJCWlmIChhY2wgPT0gTlVMTCkgeworCQkJdmFsdWUgPSBOVUxMOworCQkJc2l6ZSA9IDA7CisJCX0gZWxzZSBpZiAoSVNfRVJSKGFjbCkpIHsKKwkJCXJldHVybiBQVFJfRVJSKGFjbCk7CisJCX0KKwl9CisKKwlyZXQgPSBidHJmc19zZXRfYWNsKGlub2RlLCBhY2wsIHR5cGUpOworCisJcG9zaXhfYWNsX3JlbGVhc2UoYWNsKTsKKworCXJldHVybiByZXQ7Cit9CisKKworc3RhdGljIGludCBidHJmc194YXR0cl9hY2xfYWNjZXNzX2dldChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjb25zdCBjaGFyICpuYW1lLAorCQkJCSAgICAgIHZvaWQgKnZhbHVlLCBzaXplX3Qgc2l6ZSkKK3sKKwlyZXR1cm4gYnRyZnNfeGF0dHJfZ2V0X2FjbChpbm9kZSwgQUNMX1RZUEVfQUNDRVNTLCB2YWx1ZSwgc2l6ZSk7Cit9CisKK3N0YXRpYyBpbnQgYnRyZnNfeGF0dHJfYWNsX2FjY2Vzc19zZXQoc3RydWN0IGlub2RlICppbm9kZSwgY29uc3QgY2hhciAqbmFtZSwKKwkJCQkgICAgICBjb25zdCB2b2lkICp2YWx1ZSwgc2l6ZV90IHNpemUsIGludCBmbGFncykKK3sKKwlyZXR1cm4gYnRyZnNfeGF0dHJfc2V0X2FjbChpbm9kZSwgQUNMX1RZUEVfQUNDRVNTLCB2YWx1ZSwgc2l6ZSk7Cit9CisKK3N0YXRpYyBpbnQgYnRyZnNfeGF0dHJfYWNsX2RlZmF1bHRfZ2V0KHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkJICAgICAgIHZvaWQgKnZhbHVlLCBzaXplX3Qgc2l6ZSkKK3sKKwlyZXR1cm4gYnRyZnNfeGF0dHJfZ2V0X2FjbChpbm9kZSwgQUNMX1RZUEVfREVGQVVMVCwgdmFsdWUsIHNpemUpOworfQorCitzdGF0aWMgaW50IGJ0cmZzX3hhdHRyX2FjbF9kZWZhdWx0X3NldChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjb25zdCBjaGFyICpuYW1lLAorCQkJICAgICAgIGNvbnN0IHZvaWQgKnZhbHVlLCBzaXplX3Qgc2l6ZSwgaW50IGZsYWdzKQoreworCXJldHVybiBidHJmc194YXR0cl9zZXRfYWNsKGlub2RlLCBBQ0xfVFlQRV9ERUZBVUxULCB2YWx1ZSwgc2l6ZSk7Cit9CisKK2ludCBidHJmc19jaGVja19hY2woc3RydWN0IGlub2RlICppbm9kZSwgaW50IG1hc2spCit7CisJc3RydWN0IHBvc2l4X2FjbCAqYWNsOworCWludCBlcnJvciA9IC1FQUdBSU47CisKKwlhY2wgPSBidHJmc19nZXRfYWNsKGlub2RlLCBBQ0xfVFlQRV9BQ0NFU1MpOworCisJaWYgKElTX0VSUihhY2wpKQorCQlyZXR1cm4gUFRSX0VSUihhY2wpOworCWlmIChhY2wpIHsKKwkJZXJyb3IgPSBwb3NpeF9hY2xfcGVybWlzc2lvbihpbm9kZSwgYWNsLCBtYXNrKTsKKwkJcG9zaXhfYWNsX3JlbGVhc2UoYWNsKTsKKwl9CisKKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qCisgKiBidHJmc19pbml0X2FjbCBpcyBhbHJlYWR5IGdlbmVyYWxseSBjYWxsZWQgdW5kZXIgZnNfbXV0ZXgsIHNvIHRoZSBsb2NraW5nCisgKiBzdHVmZiBoYXMgYmVlbiBmaXhlZCB0byB3b3JrIHdpdGggdGhhdC4gIElmIHRoZSBsb2NraW5nIHN0dWZmIGNoYW5nZXMsIHdlCisgKiBuZWVkIHRvIHJlLWV2YWx1YXRlIHRoZSBhY2wgbG9ja2luZyBzdHVmZi4KKyAqLworaW50IGJ0cmZzX2luaXRfYWNsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBpbm9kZSAqZGlyKQoreworCXN0cnVjdCBwb3NpeF9hY2wgKmFjbCA9IE5VTEw7CisJaW50IHJldCA9IDA7CisKKwkvKiB0aGlzIGhhcHBlbnMgd2l0aCBzdWJ2b2xzICovCisJaWYgKCFkaXIpCisJCXJldHVybiAwOworCisJaWYgKCFTX0lTTE5LKGlub2RlLT5pX21vZGUpKSB7CisJCWlmIChJU19QT1NJWEFDTChkaXIpKSB7CisJCQlhY2wgPSBidHJmc19nZXRfYWNsKGRpciwgQUNMX1RZUEVfREVGQVVMVCk7CisJCQlpZiAoSVNfRVJSKGFjbCkpCisJCQkJcmV0dXJuIFBUUl9FUlIoYWNsKTsKKwkJfQorCisJCWlmICghYWNsKQorCQkJaW5vZGUtPmlfbW9kZSAmPSB+Y3VycmVudC0+ZnMtPnVtYXNrOworCX0KKworCWlmIChJU19QT1NJWEFDTChkaXIpICYmIGFjbCkgeworCQlzdHJ1Y3QgcG9zaXhfYWNsICpjbG9uZTsKKwkJbW9kZV90IG1vZGU7CisKKwkJaWYgKFNfSVNESVIoaW5vZGUtPmlfbW9kZSkpIHsKKwkJCXJldCA9IGJ0cmZzX3NldF9hY2woaW5vZGUsIGFjbCwgQUNMX1RZUEVfREVGQVVMVCk7CisJCQlpZiAocmV0KQorCQkJCWdvdG8gZmFpbGVkOworCQl9CisJCWNsb25lID0gcG9zaXhfYWNsX2Nsb25lKGFjbCwgR0ZQX05PRlMpOworCQlyZXQgPSAtRU5PTUVNOworCQlpZiAoIWNsb25lKQorCQkJZ290byBmYWlsZWQ7CisKKwkJbW9kZSA9IGlub2RlLT5pX21vZGU7CisJCXJldCA9IHBvc2l4X2FjbF9jcmVhdGVfbWFzcShjbG9uZSwgJm1vZGUpOworCQlpZiAocmV0ID49IDApIHsKKwkJCWlub2RlLT5pX21vZGUgPSBtb2RlOworCQkJaWYgKHJldCA+IDApIHsKKwkJCQkvKiB3ZSBuZWVkIGFuIGFjbCAqLworCQkJCXJldCA9IGJ0cmZzX3NldF9hY2woaW5vZGUsIGNsb25lLAorCQkJCQkJICAgIEFDTF9UWVBFX0FDQ0VTUyk7CisJCQl9CisJCX0KKwl9CitmYWlsZWQ6CisJcG9zaXhfYWNsX3JlbGVhc2UoYWNsKTsKKworCXJldHVybiByZXQ7Cit9CisKK2ludCBidHJmc19hY2xfY2htb2Qoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlzdHJ1Y3QgcG9zaXhfYWNsICphY2wsICpjbG9uZTsKKwlpbnQgcmV0ID0gMDsKKworCWlmIChTX0lTTE5LKGlub2RlLT5pX21vZGUpKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwlpZiAoIUlTX1BPU0lYQUNMKGlub2RlKSkKKwkJcmV0dXJuIDA7CisKKwlhY2wgPSBidHJmc19nZXRfYWNsKGlub2RlLCBBQ0xfVFlQRV9BQ0NFU1MpOworCWlmIChJU19FUlIoYWNsKSB8fCAhYWNsKQorCQlyZXR1cm4gUFRSX0VSUihhY2wpOworCisJY2xvbmUgPSBwb3NpeF9hY2xfY2xvbmUoYWNsLCBHRlBfS0VSTkVMKTsKKwlwb3NpeF9hY2xfcmVsZWFzZShhY2wpOworCWlmICghY2xvbmUpCisJCXJldHVybiAtRU5PTUVNOworCisJcmV0ID0gcG9zaXhfYWNsX2NobW9kX21hc3EoY2xvbmUsIGlub2RlLT5pX21vZGUpOworCWlmICghcmV0KQorCQlyZXQgPSBidHJmc19zZXRfYWNsKGlub2RlLCBjbG9uZSwgQUNMX1RZUEVfQUNDRVNTKTsKKworCXBvc2l4X2FjbF9yZWxlYXNlKGNsb25lKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0cnVjdCB4YXR0cl9oYW5kbGVyIGJ0cmZzX3hhdHRyX2FjbF9kZWZhdWx0X2hhbmRsZXIgPSB7CisJLnByZWZpeCA9IFBPU0lYX0FDTF9YQVRUUl9ERUZBVUxULAorCS5nZXQJPSBidHJmc194YXR0cl9hY2xfZGVmYXVsdF9nZXQsCisJLnNldAk9IGJ0cmZzX3hhdHRyX2FjbF9kZWZhdWx0X3NldCwKK307CisKK3N0cnVjdCB4YXR0cl9oYW5kbGVyIGJ0cmZzX3hhdHRyX2FjbF9hY2Nlc3NfaGFuZGxlciA9IHsKKwkucHJlZml4ID0gUE9TSVhfQUNMX1hBVFRSX0FDQ0VTUywKKwkuZ2V0CT0gYnRyZnNfeGF0dHJfYWNsX2FjY2Vzc19nZXQsCisJLnNldAk9IGJ0cmZzX3hhdHRyX2FjbF9hY2Nlc3Nfc2V0LAorfTsKKworI2Vsc2UgLyogQ09ORklHX0ZTX1BPU0lYX0FDTCAqLworCitpbnQgYnRyZnNfYWNsX2NobW9kKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJcmV0dXJuIDA7Cit9CisKK2ludCBidHJmc19pbml0X2FjbChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgaW5vZGUgKmRpcikKK3sKKwlyZXR1cm4gMDsKK30KKworaW50IGJ0cmZzX2NoZWNrX2FjbChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgbWFzaykKK3sKKwlyZXR1cm4gMDsKK30KKworI2VuZGlmIC8qIENPTkZJR19GU19QT1NJWF9BQ0wgKi8KZGlmZiAtLWdpdCBhL2ZzL2J0cmZzL2FzeW5jLXRocmVhZC5jIGIvZnMvYnRyZnMvYXN5bmMtdGhyZWFkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGUyZmVjMAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2J0cmZzL2FzeW5jLXRocmVhZC5jCkBAIC0wLDAgKzEsNDE5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE9yYWNsZS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIHYyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCisgKiBCb3N0b24sIE1BIDAyMTExMC0xMzA3LCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjIGluY2x1ZGUgPGxpbnV4L2ZyZWV6ZXIuaD4KKyNpbmNsdWRlICJhc3luYy10aHJlYWQuaCIKKworI2RlZmluZSBXT1JLX1FVRVVFRF9CSVQgMAorI2RlZmluZSBXT1JLX0RPTkVfQklUIDEKKyNkZWZpbmUgV09SS19PUkRFUl9ET05FX0JJVCAyCisKKy8qCisgKiBjb250YWluZXIgZm9yIHRoZSBrdGhyZWFkIHRhc2sgcG9pbnRlciBhbmQgdGhlIGxpc3Qgb2YgcGVuZGluZyB3b3JrCisgKiBPbmUgb2YgdGhlc2UgaXMgYWxsb2NhdGVkIHBlciB0aHJlYWQuCisgKi8KK3N0cnVjdCBidHJmc193b3JrZXJfdGhyZWFkIHsKKwkvKiBwb29sIHdlIGJlbG9uZyB0byAqLworCXN0cnVjdCBidHJmc193b3JrZXJzICp3b3JrZXJzOworCisJLyogbGlzdCBvZiBzdHJ1Y3QgYnRyZnNfd29yayB0aGF0IGFyZSB3YWl0aW5nIGZvciBzZXJ2aWNlICovCisJc3RydWN0IGxpc3RfaGVhZCBwZW5kaW5nOworCisJLyogbGlzdCBvZiB3b3JrZXIgdGhyZWFkcyBmcm9tIHN0cnVjdCBidHJmc193b3JrZXJzICovCisJc3RydWN0IGxpc3RfaGVhZCB3b3JrZXJfbGlzdDsKKworCS8qIGt0aHJlYWQgKi8KKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2s7CisKKwkvKiBudW1iZXIgb2YgdGhpbmdzIG9uIHRoZSBwZW5kaW5nIGxpc3QgKi8KKwlhdG9taWNfdCBudW1fcGVuZGluZzsKKworCXVuc2lnbmVkIGxvbmcgc2VxdWVuY2U7CisKKwkvKiBwcm90ZWN0cyB0aGUgcGVuZGluZyBsaXN0LiAqLworCXNwaW5sb2NrX3QgbG9jazsKKworCS8qIHNldCB0byBub24temVybyB3aGVuIHRoaXMgdGhyZWFkIGlzIGFscmVhZHkgYXdha2UgYW5kIGtpY2tpbmcgKi8KKwlpbnQgd29ya2luZzsKKworCS8qIGFyZSB3ZSBjdXJyZW50bHkgaWRsZSAqLworCWludCBpZGxlOworfTsKKworLyoKKyAqIGhlbHBlciBmdW5jdGlvbiB0byBtb3ZlIGEgdGhyZWFkIG9udG8gdGhlIGlkbGUgbGlzdCBhZnRlciBpdAorICogaGFzIGZpbmlzaGVkIHNvbWUgcmVxdWVzdHMuCisgKi8KK3N0YXRpYyB2b2lkIGNoZWNrX2lkbGVfd29ya2VyKHN0cnVjdCBidHJmc193b3JrZXJfdGhyZWFkICp3b3JrZXIpCit7CisJaWYgKCF3b3JrZXItPmlkbGUgJiYgYXRvbWljX3JlYWQoJndvcmtlci0+bnVtX3BlbmRpbmcpIDwKKwkgICAgd29ya2VyLT53b3JrZXJzLT5pZGxlX3RocmVzaCAvIDIpIHsKKwkJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJndvcmtlci0+d29ya2Vycy0+bG9jaywgZmxhZ3MpOworCQl3b3JrZXItPmlkbGUgPSAxOworCQlsaXN0X21vdmUoJndvcmtlci0+d29ya2VyX2xpc3QsICZ3b3JrZXItPndvcmtlcnMtPmlkbGVfbGlzdCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndvcmtlci0+d29ya2Vycy0+bG9jaywgZmxhZ3MpOworCX0KK30KKworLyoKKyAqIGhlbHBlciBmdW5jdGlvbiB0byBtb3ZlIGEgdGhyZWFkIG9mZiB0aGUgaWRsZSBsaXN0IGFmdGVyIG5ldworICogcGVuZGluZyB3b3JrIGlzIGFkZGVkLgorICovCitzdGF0aWMgdm9pZCBjaGVja19idXN5X3dvcmtlcihzdHJ1Y3QgYnRyZnNfd29ya2VyX3RocmVhZCAqd29ya2VyKQoreworCWlmICh3b3JrZXItPmlkbGUgJiYgYXRvbWljX3JlYWQoJndvcmtlci0+bnVtX3BlbmRpbmcpID49CisJICAgIHdvcmtlci0+d29ya2Vycy0+aWRsZV90aHJlc2gpIHsKKwkJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJndvcmtlci0+d29ya2Vycy0+bG9jaywgZmxhZ3MpOworCQl3b3JrZXItPmlkbGUgPSAwOworCQlsaXN0X21vdmVfdGFpbCgmd29ya2VyLT53b3JrZXJfbGlzdCwKKwkJCSAgICAgICAmd29ya2VyLT53b3JrZXJzLT53b3JrZXJfbGlzdCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndvcmtlci0+d29ya2Vycy0+bG9jaywgZmxhZ3MpOworCX0KK30KKworc3RhdGljIG5vaW5saW5lIGludCBydW5fb3JkZXJlZF9jb21wbGV0aW9ucyhzdHJ1Y3QgYnRyZnNfd29ya2VycyAqd29ya2VycywKKwkJCQkJICAgIHN0cnVjdCBidHJmc193b3JrICp3b3JrKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoIXdvcmtlcnMtPm9yZGVyZWQpCisJCXJldHVybiAwOworCisJc2V0X2JpdChXT1JLX0RPTkVfQklULCAmd29yay0+ZmxhZ3MpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJndvcmtlcnMtPmxvY2ssIGZsYWdzKTsKKworCXdoaWxlICghbGlzdF9lbXB0eSgmd29ya2Vycy0+b3JkZXJfbGlzdCkpIHsKKwkJd29yayA9IGxpc3RfZW50cnkod29ya2Vycy0+b3JkZXJfbGlzdC5uZXh0LAorCQkJCSAgc3RydWN0IGJ0cmZzX3dvcmssIG9yZGVyX2xpc3QpOworCisJCWlmICghdGVzdF9iaXQoV09SS19ET05FX0JJVCwgJndvcmstPmZsYWdzKSkKKwkJCWJyZWFrOworCisJCS8qIHdlIGFyZSBnb2luZyB0byBjYWxsIHRoZSBvcmRlcmVkIGRvbmUgZnVuY3Rpb24sIGJ1dAorCQkgKiB3ZSBsZWF2ZSB0aGUgd29yayBpdGVtIG9uIHRoZSBsaXN0IGFzIGEgYmFycmllciBzbworCQkgKiB0aGF0IGxhdGVyIHdvcmsgaXRlbXMgdGhhdCBhcmUgZG9uZSBkb24ndCBoYXZlIHRoZWlyCisJCSAqIGZ1bmN0aW9ucyBjYWxsZWQgYmVmb3JlIHRoaXMgb25lIHJldHVybnMKKwkJICovCisJCWlmICh0ZXN0X2FuZF9zZXRfYml0KFdPUktfT1JERVJfRE9ORV9CSVQsICZ3b3JrLT5mbGFncykpCisJCQlicmVhazsKKworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3b3JrZXJzLT5sb2NrLCBmbGFncyk7CisKKwkJd29yay0+b3JkZXJlZF9mdW5jKHdvcmspOworCisJCS8qIG5vdyB0YWtlIHRoZSBsb2NrIGFnYWluIGFuZCBjYWxsIHRoZSBmcmVlaW5nIGNvZGUgKi8KKwkJc3Bpbl9sb2NrX2lycXNhdmUoJndvcmtlcnMtPmxvY2ssIGZsYWdzKTsKKwkJbGlzdF9kZWwoJndvcmstPm9yZGVyX2xpc3QpOworCQl3b3JrLT5vcmRlcmVkX2ZyZWUod29yayk7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd29ya2Vycy0+bG9jaywgZmxhZ3MpOworCXJldHVybiAwOworfQorCisvKgorICogbWFpbiBsb29wIGZvciBzZXJ2aWNpbmcgd29yayBpdGVtcworICovCitzdGF0aWMgaW50IHdvcmtlcl9sb29wKHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgYnRyZnNfd29ya2VyX3RocmVhZCAqd29ya2VyID0gYXJnOworCXN0cnVjdCBsaXN0X2hlYWQgKmN1cjsKKwlzdHJ1Y3QgYnRyZnNfd29yayAqd29yazsKKwlkbyB7CisJCXNwaW5fbG9ja19pcnEoJndvcmtlci0+bG9jayk7CisJCXdoaWxlICghbGlzdF9lbXB0eSgmd29ya2VyLT5wZW5kaW5nKSkgeworCQkJY3VyID0gd29ya2VyLT5wZW5kaW5nLm5leHQ7CisJCQl3b3JrID0gbGlzdF9lbnRyeShjdXIsIHN0cnVjdCBidHJmc193b3JrLCBsaXN0KTsKKwkJCWxpc3RfZGVsKCZ3b3JrLT5saXN0KTsKKwkJCWNsZWFyX2JpdChXT1JLX1FVRVVFRF9CSVQsICZ3b3JrLT5mbGFncyk7CisKKwkJCXdvcmstPndvcmtlciA9IHdvcmtlcjsKKwkJCXNwaW5fdW5sb2NrX2lycSgmd29ya2VyLT5sb2NrKTsKKworCQkJd29yay0+ZnVuYyh3b3JrKTsKKworCQkJYXRvbWljX2RlYygmd29ya2VyLT5udW1fcGVuZGluZyk7CisJCQkvKgorCQkJICogdW5sZXNzIHRoaXMgaXMgYW4gb3JkZXJlZCB3b3JrIHF1ZXVlLAorCQkJICogJ3dvcmsnIHdhcyBwcm9iYWJseSBmcmVlZCBieSBmdW5jIGFib3ZlLgorCQkJICovCisJCQlydW5fb3JkZXJlZF9jb21wbGV0aW9ucyh3b3JrZXItPndvcmtlcnMsIHdvcmspOworCisJCQlzcGluX2xvY2tfaXJxKCZ3b3JrZXItPmxvY2spOworCQkJY2hlY2tfaWRsZV93b3JrZXIod29ya2VyKTsKKworCQl9CisJCXdvcmtlci0+d29ya2luZyA9IDA7CisJCWlmIChmcmVlemluZyhjdXJyZW50KSkgeworCQkJcmVmcmlnZXJhdG9yKCk7CisJCX0gZWxzZSB7CisJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQkJc3Bpbl91bmxvY2tfaXJxKCZ3b3JrZXItPmxvY2spOworCQkJaWYgKCFrdGhyZWFkX3Nob3VsZF9zdG9wKCkpCisJCQkJc2NoZWR1bGUoKTsKKwkJCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKwkJfQorCX0gd2hpbGUgKCFrdGhyZWFkX3Nob3VsZF9zdG9wKCkpOworCXJldHVybiAwOworfQorCisvKgorICogdGhpcyB3aWxsIHdhaXQgZm9yIGFsbCB0aGUgd29ya2VyIHRocmVhZHMgdG8gc2h1dGRvd24KKyAqLworaW50IGJ0cmZzX3N0b3Bfd29ya2VycyhzdHJ1Y3QgYnRyZnNfd29ya2VycyAqd29ya2VycykKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpjdXI7CisJc3RydWN0IGJ0cmZzX3dvcmtlcl90aHJlYWQgKndvcmtlcjsKKworCWxpc3Rfc3BsaWNlX2luaXQoJndvcmtlcnMtPmlkbGVfbGlzdCwgJndvcmtlcnMtPndvcmtlcl9saXN0KTsKKwl3aGlsZSAoIWxpc3RfZW1wdHkoJndvcmtlcnMtPndvcmtlcl9saXN0KSkgeworCQljdXIgPSB3b3JrZXJzLT53b3JrZXJfbGlzdC5uZXh0OworCQl3b3JrZXIgPSBsaXN0X2VudHJ5KGN1ciwgc3RydWN0IGJ0cmZzX3dvcmtlcl90aHJlYWQsCisJCQkJICAgIHdvcmtlcl9saXN0KTsKKwkJa3RocmVhZF9zdG9wKHdvcmtlci0+dGFzayk7CisJCWxpc3RfZGVsKCZ3b3JrZXItPndvcmtlcl9saXN0KTsKKwkJa2ZyZWUod29ya2VyKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBzaW1wbGUgaW5pdCBvbiBzdHJ1Y3QgYnRyZnNfd29ya2VycworICovCit2b2lkIGJ0cmZzX2luaXRfd29ya2VycyhzdHJ1Y3QgYnRyZnNfd29ya2VycyAqd29ya2VycywgY2hhciAqbmFtZSwgaW50IG1heCkKK3sKKwl3b3JrZXJzLT5udW1fd29ya2VycyA9IDA7CisJSU5JVF9MSVNUX0hFQUQoJndvcmtlcnMtPndvcmtlcl9saXN0KTsKKwlJTklUX0xJU1RfSEVBRCgmd29ya2Vycy0+aWRsZV9saXN0KTsKKwlJTklUX0xJU1RfSEVBRCgmd29ya2Vycy0+b3JkZXJfbGlzdCk7CisJc3Bpbl9sb2NrX2luaXQoJndvcmtlcnMtPmxvY2spOworCXdvcmtlcnMtPm1heF93b3JrZXJzID0gbWF4OworCXdvcmtlcnMtPmlkbGVfdGhyZXNoID0gMzI7CisJd29ya2Vycy0+bmFtZSA9IG5hbWU7CisJd29ya2Vycy0+b3JkZXJlZCA9IDA7Cit9CisKKy8qCisgKiBzdGFydHMgbmV3IHdvcmtlciB0aHJlYWRzLiAgVGhpcyBkb2VzIG5vdCBlbmZvcmNlIHRoZSBtYXggd29ya2VyCisgKiBjb3VudCBpbiBjYXNlIHlvdSBuZWVkIHRvIHRlbXBvcmFyaWx5IGdvIHBhc3QgaXQuCisgKi8KK2ludCBidHJmc19zdGFydF93b3JrZXJzKHN0cnVjdCBidHJmc193b3JrZXJzICp3b3JrZXJzLCBpbnQgbnVtX3dvcmtlcnMpCit7CisJc3RydWN0IGJ0cmZzX3dvcmtlcl90aHJlYWQgKndvcmtlcjsKKwlpbnQgcmV0ID0gMDsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBudW1fd29ya2VyczsgaSsrKSB7CisJCXdvcmtlciA9IGt6YWxsb2Moc2l6ZW9mKCp3b3JrZXIpLCBHRlBfTk9GUyk7CisJCWlmICghd29ya2VyKSB7CisJCQlyZXQgPSAtRU5PTUVNOworCQkJZ290byBmYWlsOworCQl9CisKKwkJSU5JVF9MSVNUX0hFQUQoJndvcmtlci0+cGVuZGluZyk7CisJCUlOSVRfTElTVF9IRUFEKCZ3b3JrZXItPndvcmtlcl9saXN0KTsKKwkJc3Bpbl9sb2NrX2luaXQoJndvcmtlci0+bG9jayk7CisJCWF0b21pY19zZXQoJndvcmtlci0+bnVtX3BlbmRpbmcsIDApOworCQl3b3JrZXItPnRhc2sgPSBrdGhyZWFkX3J1bih3b3JrZXJfbG9vcCwgd29ya2VyLAorCQkJCQkgICAiYnRyZnMtJXMtJWQiLCB3b3JrZXJzLT5uYW1lLAorCQkJCQkgICB3b3JrZXJzLT5udW1fd29ya2VycyArIGkpOworCQl3b3JrZXItPndvcmtlcnMgPSB3b3JrZXJzOworCQlpZiAoSVNfRVJSKHdvcmtlci0+dGFzaykpIHsKKwkJCWtmcmVlKHdvcmtlcik7CisJCQlyZXQgPSBQVFJfRVJSKHdvcmtlci0+dGFzayk7CisJCQlnb3RvIGZhaWw7CisJCX0KKworCQlzcGluX2xvY2tfaXJxKCZ3b3JrZXJzLT5sb2NrKTsKKwkJbGlzdF9hZGRfdGFpbCgmd29ya2VyLT53b3JrZXJfbGlzdCwgJndvcmtlcnMtPmlkbGVfbGlzdCk7CisJCXdvcmtlci0+aWRsZSA9IDE7CisJCXdvcmtlcnMtPm51bV93b3JrZXJzKys7CisJCXNwaW5fdW5sb2NrX2lycSgmd29ya2Vycy0+bG9jayk7CisJfQorCXJldHVybiAwOworZmFpbDoKKwlidHJmc19zdG9wX3dvcmtlcnMod29ya2Vycyk7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIHJ1biB0aHJvdWdoIHRoZSBsaXN0IGFuZCBmaW5kIGEgd29ya2VyIHRocmVhZCB0aGF0IGRvZXNuJ3QgaGF2ZSBhIGxvdAorICogdG8gZG8gcmlnaHQgbm93LiAgVGhpcyBjYW4gcmV0dXJuIG51bGwgaWYgd2UgYXJlbid0IHlldCBhdCB0aGUgdGhyZWFkCisgKiBjb3VudCBsaW1pdCBhbmQgYWxsIG9mIHRoZSB0aHJlYWRzIGFyZSBidXN5LgorICovCitzdGF0aWMgc3RydWN0IGJ0cmZzX3dvcmtlcl90aHJlYWQgKm5leHRfd29ya2VyKHN0cnVjdCBidHJmc193b3JrZXJzICp3b3JrZXJzKQoreworCXN0cnVjdCBidHJmc193b3JrZXJfdGhyZWFkICp3b3JrZXI7CisJc3RydWN0IGxpc3RfaGVhZCAqbmV4dDsKKwlpbnQgZW5mb3JjZV9taW4gPSB3b3JrZXJzLT5udW1fd29ya2VycyA8IHdvcmtlcnMtPm1heF93b3JrZXJzOworCisJLyoKKwkgKiBpZiB3ZSBmaW5kIGFuIGlkbGUgdGhyZWFkLCBkb24ndCBtb3ZlIGl0IHRvIHRoZSBlbmQgb2YgdGhlCisJICogaWRsZSBsaXN0LiAgVGhpcyBpbXByb3ZlcyB0aGUgY2hhbmNlIHRoYXQgdGhlIG5leHQgc3VibWlzc2lvbgorCSAqIHdpbGwgcmV1c2UgdGhlIHNhbWUgdGhyZWFkLCBhbmQgbWF5YmUgY2F0Y2ggaXQgd2hpbGUgaXQgaXMgc3RpbGwKKwkgKiB3b3JraW5nCisJICovCisJaWYgKCFsaXN0X2VtcHR5KCZ3b3JrZXJzLT5pZGxlX2xpc3QpKSB7CisJCW5leHQgPSB3b3JrZXJzLT5pZGxlX2xpc3QubmV4dDsKKwkJd29ya2VyID0gbGlzdF9lbnRyeShuZXh0LCBzdHJ1Y3QgYnRyZnNfd29ya2VyX3RocmVhZCwKKwkJCQkgICAgd29ya2VyX2xpc3QpOworCQlyZXR1cm4gd29ya2VyOworCX0KKwlpZiAoZW5mb3JjZV9taW4gfHwgbGlzdF9lbXB0eSgmd29ya2Vycy0+d29ya2VyX2xpc3QpKQorCQlyZXR1cm4gTlVMTDsKKworCS8qCisJICogaWYgd2UgcGljayBhIGJ1c3kgdGFzaywgbW92ZSB0aGUgdGFzayB0byB0aGUgZW5kIG9mIHRoZSBsaXN0LgorCSAqIGhvcGVmdWxseSB0aGlzIHdpbGwga2VlcCB0aGluZ3Mgc29tZXdoYXQgZXZlbmx5IGJhbGFuY2VkLgorCSAqIERvIHRoZSBtb3ZlIGluIGJhdGNoZXMgYmFzZWQgb24gdGhlIHNlcXVlbmNlIG51bWJlci4gIFRoaXMgZ3JvdXBzCisJICogcmVxdWVzdHMgc3VibWl0dGVkIGF0IHJvdWdobHkgdGhlIHNhbWUgdGltZSBvbnRvIHRoZSBzYW1lIHdvcmtlci4KKwkgKi8KKwluZXh0ID0gd29ya2Vycy0+d29ya2VyX2xpc3QubmV4dDsKKwl3b3JrZXIgPSBsaXN0X2VudHJ5KG5leHQsIHN0cnVjdCBidHJmc193b3JrZXJfdGhyZWFkLCB3b3JrZXJfbGlzdCk7CisJYXRvbWljX2luYygmd29ya2VyLT5udW1fcGVuZGluZyk7CisJd29ya2VyLT5zZXF1ZW5jZSsrOworCisJaWYgKHdvcmtlci0+c2VxdWVuY2UgJSB3b3JrZXJzLT5pZGxlX3RocmVzaCA9PSAwKQorCQlsaXN0X21vdmVfdGFpbChuZXh0LCAmd29ya2Vycy0+d29ya2VyX2xpc3QpOworCXJldHVybiB3b3JrZXI7Cit9CisKKy8qCisgKiBzZWxlY3RzIGEgd29ya2VyIHRocmVhZCB0byB0YWtlIHRoZSBuZXh0IGpvYi4gIFRoaXMgd2lsbCBlaXRoZXIgZmluZAorICogYW4gaWRsZSB3b3JrZXIsIHN0YXJ0IGEgbmV3IHdvcmtlciB1cCB0byB0aGUgbWF4IGNvdW50LCBvciBqdXN0IHJldHVybgorICogb25lIG9mIHRoZSBleGlzdGluZyBidXN5IHdvcmtlcnMuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgYnRyZnNfd29ya2VyX3RocmVhZCAqZmluZF93b3JrZXIoc3RydWN0IGJ0cmZzX3dvcmtlcnMgKndvcmtlcnMpCit7CisJc3RydWN0IGJ0cmZzX3dvcmtlcl90aHJlYWQgKndvcmtlcjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCithZ2FpbjoKKwlzcGluX2xvY2tfaXJxc2F2ZSgmd29ya2Vycy0+bG9jaywgZmxhZ3MpOworCXdvcmtlciA9IG5leHRfd29ya2VyKHdvcmtlcnMpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndvcmtlcnMtPmxvY2ssIGZsYWdzKTsKKworCWlmICghd29ya2VyKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZ3b3JrZXJzLT5sb2NrLCBmbGFncyk7CisJCWlmICh3b3JrZXJzLT5udW1fd29ya2VycyA+PSB3b3JrZXJzLT5tYXhfd29ya2VycykgeworCQkJc3RydWN0IGxpc3RfaGVhZCAqZmFsbGJhY2sgPSBOVUxMOworCQkJLyoKKwkJCSAqIHdlIGhhdmUgZmFpbGVkIHRvIGZpbmQgYW55IHdvcmtlcnMsIGp1c3QKKwkJCSAqIHJldHVybiB0aGUgZm9yY2Ugb25lCisJCQkgKi8KKwkJCWlmICghbGlzdF9lbXB0eSgmd29ya2Vycy0+d29ya2VyX2xpc3QpKQorCQkJCWZhbGxiYWNrID0gd29ya2Vycy0+d29ya2VyX2xpc3QubmV4dDsKKwkJCWlmICghbGlzdF9lbXB0eSgmd29ya2Vycy0+aWRsZV9saXN0KSkKKwkJCQlmYWxsYmFjayA9IHdvcmtlcnMtPmlkbGVfbGlzdC5uZXh0OworCQkJQlVHX09OKCFmYWxsYmFjayk7CisJCQl3b3JrZXIgPSBsaXN0X2VudHJ5KGZhbGxiYWNrLAorCQkJCSAgc3RydWN0IGJ0cmZzX3dvcmtlcl90aHJlYWQsIHdvcmtlcl9saXN0KTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndvcmtlcnMtPmxvY2ssIGZsYWdzKTsKKwkJfSBlbHNlIHsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndvcmtlcnMtPmxvY2ssIGZsYWdzKTsKKwkJCS8qIHdlJ3JlIGJlbG93IHRoZSBsaW1pdCwgc3RhcnQgYW5vdGhlciB3b3JrZXIgKi8KKwkJCWJ0cmZzX3N0YXJ0X3dvcmtlcnMod29ya2VycywgMSk7CisJCQlnb3RvIGFnYWluOworCQl9CisJfQorCXJldHVybiB3b3JrZXI7Cit9CisKKy8qCisgKiBidHJmc19yZXF1ZXVlX3dvcmsganVzdCBwdXRzIHRoZSB3b3JrIGl0ZW0gYmFjayBvbiB0aGUgdGFpbCBvZiB0aGUgbGlzdAorICogaXQgd2FzIHRha2VuIGZyb20uICBJdCBpcyBpbnRlbmRlZCBmb3IgdXNlIHdpdGggbG9uZyBydW5uaW5nIHdvcmsgZnVuY3Rpb25zCisgKiB0aGF0IG1ha2Ugc29tZSBwcm9ncmVzcyBhbmQgd2FudCB0byBnaXZlIHRoZSBjcHUgdXAgZm9yIG90aGVycy4KKyAqLworaW50IGJ0cmZzX3JlcXVldWVfd29yayhzdHJ1Y3QgYnRyZnNfd29yayAqd29yaykKK3sKKwlzdHJ1Y3QgYnRyZnNfd29ya2VyX3RocmVhZCAqd29ya2VyID0gd29yay0+d29ya2VyOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAodGVzdF9hbmRfc2V0X2JpdChXT1JLX1FVRVVFRF9CSVQsICZ3b3JrLT5mbGFncykpCisJCWdvdG8gb3V0OworCisJc3Bpbl9sb2NrX2lycXNhdmUoJndvcmtlci0+bG9jaywgZmxhZ3MpOworCWF0b21pY19pbmMoJndvcmtlci0+bnVtX3BlbmRpbmcpOworCWxpc3RfYWRkX3RhaWwoJndvcmstPmxpc3QsICZ3b3JrZXItPnBlbmRpbmcpOworCisJLyogYnkgZGVmaW5pdGlvbiB3ZSdyZSBidXN5LCB0YWtlIG91cnNlbHZlcyBvZmYgdGhlIGlkbGUKKwkgKiBsaXN0CisJICovCisJaWYgKHdvcmtlci0+aWRsZSkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmd29ya2VyLT53b3JrZXJzLT5sb2NrLCBmbGFncyk7CisJCXdvcmtlci0+aWRsZSA9IDA7CisJCWxpc3RfbW92ZV90YWlsKCZ3b3JrZXItPndvcmtlcl9saXN0LAorCQkJICAgICAgICZ3b3JrZXItPndvcmtlcnMtPndvcmtlcl9saXN0KTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd29ya2VyLT53b3JrZXJzLT5sb2NrLCBmbGFncyk7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd29ya2VyLT5sb2NrLCBmbGFncyk7CisKK291dDoKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIHBsYWNlcyBhIHN0cnVjdCBidHJmc193b3JrIGludG8gdGhlIHBlbmRpbmcgcXVldWUgb2Ygb25lIG9mIHRoZSBrdGhyZWFkcworICovCitpbnQgYnRyZnNfcXVldWVfd29ya2VyKHN0cnVjdCBidHJmc193b3JrZXJzICp3b3JrZXJzLCBzdHJ1Y3QgYnRyZnNfd29yayAqd29yaykKK3sKKwlzdHJ1Y3QgYnRyZnNfd29ya2VyX3RocmVhZCAqd29ya2VyOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHdha2UgPSAwOworCisJLyogZG9uJ3QgcmVxdWV1ZSBzb21ldGhpbmcgYWxyZWFkeSBvbiBhIGxpc3QgKi8KKwlpZiAodGVzdF9hbmRfc2V0X2JpdChXT1JLX1FVRVVFRF9CSVQsICZ3b3JrLT5mbGFncykpCisJCWdvdG8gb3V0OworCisJd29ya2VyID0gZmluZF93b3JrZXIod29ya2Vycyk7CisJaWYgKHdvcmtlcnMtPm9yZGVyZWQpIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJndvcmtlcnMtPmxvY2ssIGZsYWdzKTsKKwkJbGlzdF9hZGRfdGFpbCgmd29yay0+b3JkZXJfbGlzdCwgJndvcmtlcnMtPm9yZGVyX2xpc3QpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3b3JrZXJzLT5sb2NrLCBmbGFncyk7CisJfSBlbHNlIHsKKwkJSU5JVF9MSVNUX0hFQUQoJndvcmstPm9yZGVyX2xpc3QpOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZ3b3JrZXItPmxvY2ssIGZsYWdzKTsKKwlhdG9taWNfaW5jKCZ3b3JrZXItPm51bV9wZW5kaW5nKTsKKwljaGVja19idXN5X3dvcmtlcih3b3JrZXIpOworCWxpc3RfYWRkX3RhaWwoJndvcmstPmxpc3QsICZ3b3JrZXItPnBlbmRpbmcpOworCisJLyoKKwkgKiBhdm9pZCBjYWxsaW5nIGludG8gd2FrZV91cF9wcm9jZXNzIGlmIHRoaXMgdGhyZWFkIGhhcyBhbHJlYWR5CisJICogYmVlbiBraWNrZWQKKwkgKi8KKwlpZiAoIXdvcmtlci0+d29ya2luZykKKwkJd2FrZSA9IDE7CisJd29ya2VyLT53b3JraW5nID0gMTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndvcmtlci0+bG9jaywgZmxhZ3MpOworCisJaWYgKHdha2UpCisJCXdha2VfdXBfcHJvY2Vzcyh3b3JrZXItPnRhc2spOworb3V0OgorCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZnMvYnRyZnMvYXN5bmMtdGhyZWFkLmggYi9mcy9idHJmcy9hc3luYy10aHJlYWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMWJlNGVkCi0tLSAvZGV2L251bGwKKysrIGIvZnMvYnRyZnMvYXN5bmMtdGhyZWFkLmgKQEAgLTAsMCArMSwxMDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgT3JhY2xlLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgdjIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKKyAqIEJvc3RvbiwgTUEgMDIxMTEwLTEzMDcsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fQlRSRlNfQVNZTkNfVEhSRUFEXworI2RlZmluZSBfX0JUUkZTX0FTWU5DX1RIUkVBRF8KKworc3RydWN0IGJ0cmZzX3dvcmtlcl90aHJlYWQ7CisKKy8qCisgKiBUaGlzIGlzIHNpbWlsYXIgdG8gYSB3b3JrcXVldWUsIGJ1dCBpdCBpcyBtZWFudCB0byBzcHJlYWQgdGhlIG9wZXJhdGlvbnMKKyAqIGFjcm9zcyBhbGwgYXZhaWxhYmxlIGNwdXMgaW5zdGVhZCBvZiBqdXN0IHRoZSBDUFUgdGhhdCB3YXMgdXNlZCB0bworICogcXVldWUgdGhlIHdvcmsuICBUaGVyZSBpcyBhbHNvIHNvbWUgYmF0Y2hpbmcgaW50cm9kdWNlZCB0byB0cnkgYW5kCisgKiBjdXQgZG93biBvbiBjb250ZXh0IHN3aXRjaGVzLgorICoKKyAqIEJ5IGRlZmF1bHQgdGhyZWFkcyBhcmUgYWRkZWQgb24gZGVtYW5kIHVwIHRvIDIgKiB0aGUgbnVtYmVyIG9mIGNwdXMuCisgKiBDaGFuZ2luZyBzdHJ1Y3QgYnRyZnNfd29ya2Vycy0+bWF4X3dvcmtlcnMgaXMgb25lIHdheSB0byBwcmV2ZW50CisgKiBkZW1hbmQgY3JlYXRpb24gb2Yga3RocmVhZHMuCisgKgorICogdGhlIGJhc2ljIG1vZGVsIG9mIHRoZXNlIHdvcmtlciB0aHJlYWRzIGlzIHRvIGVtYmVkIGEgYnRyZnNfd29yaworICogc3RydWN0dXJlIGluIHlvdXIgb3duIGRhdGEgc3RydWN0LCBhbmQgdXNlIGNvbnRhaW5lcl9vZiBpbiBhCisgKiB3b3JrIGZ1bmN0aW9uIHRvIGdldCBiYWNrIHRvIHlvdXIgZGF0YSBzdHJ1Y3QuCisgKi8KK3N0cnVjdCBidHJmc193b3JrIHsKKwkvKgorCSAqIGZ1bmMgc2hvdWxkIGJlIHNldCB0byB0aGUgZnVuY3Rpb24geW91IHdhbnQgY2FsbGVkCisJICogeW91ciB3b3JrIHN0cnVjdCBpcyBwYXNzZWQgYXMgdGhlIG9ubHkgYXJnCisJICoKKwkgKiBvcmRlcmVkX2Z1bmMgbXVzdCBiZSBzZXQgZm9yIHdvcmsgc2VudCB0byBhbiBvcmRlcmVkIHdvcmsgcXVldWUsCisJICogYW5kIGl0IGlzIGNhbGxlZCB0byBjb21wbGV0ZSBhIGdpdmVuIHdvcmsgaXRlbSBpbiB0aGUgc2FtZQorCSAqIG9yZGVyIHRoZXkgd2VyZSBzZW50IHRvIHRoZSBxdWV1ZS4KKwkgKi8KKwl2b2lkICgqZnVuYykoc3RydWN0IGJ0cmZzX3dvcmsgKndvcmspOworCXZvaWQgKCpvcmRlcmVkX2Z1bmMpKHN0cnVjdCBidHJmc193b3JrICp3b3JrKTsKKwl2b2lkICgqb3JkZXJlZF9mcmVlKShzdHJ1Y3QgYnRyZnNfd29yayAqd29yayk7CisKKwkvKgorCSAqIGZsYWdzIHNob3VsZCBiZSBzZXQgdG8gemVyby4gIEl0IGlzIHVzZWQgdG8gbWFrZSBzdXJlIHRoZQorCSAqIHN0cnVjdCBpcyBvbmx5IGluc2VydGVkIG9uY2UgaW50byB0aGUgbGlzdC4KKwkgKi8KKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyogZG9uJ3QgdG91Y2ggdGhlc2UgKi8KKwlzdHJ1Y3QgYnRyZnNfd29ya2VyX3RocmVhZCAqd29ya2VyOworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIG9yZGVyX2xpc3Q7Cit9OworCitzdHJ1Y3QgYnRyZnNfd29ya2VycyB7CisJLyogY3VycmVudCBudW1iZXIgb2YgcnVubmluZyB3b3JrZXJzICovCisJaW50IG51bV93b3JrZXJzOworCisJLyogbWF4IG51bWJlciBvZiB3b3JrZXJzIGFsbG93ZWQuICBjaGFuZ2VkIGJ5IGJ0cmZzX3N0YXJ0X3dvcmtlcnMgKi8KKwlpbnQgbWF4X3dvcmtlcnM7CisKKwkvKiBvbmNlIGEgd29ya2VyIGhhcyB0aGlzIG1hbnkgcmVxdWVzdHMgb3IgZmV3ZXIsIGl0IGlzIGlkbGUgKi8KKwlpbnQgaWRsZV90aHJlc2g7CisKKwkvKiBmb3JjZSBjb21wbGV0aW9ucyBpbiB0aGUgb3JkZXIgdGhleSB3ZXJlIHF1ZXVlZCAqLworCWludCBvcmRlcmVkOworCisJLyogbGlzdCB3aXRoIGFsbCB0aGUgd29yayB0aHJlYWRzLiAgVGhlIHdvcmtlcnMgb24gdGhlIGlkbGUgdGhyZWFkCisJICogbWF5IGJlIGFjdGl2ZWx5IHNlcnZpY2luZyBqb2JzLCBidXQgdGhleSBoYXZlbid0IHlldCBoaXQgdGhlCisJICogaWRsZSB0aHJlc2ggbGltaXQgYWJvdmUuCisJICovCisJc3RydWN0IGxpc3RfaGVhZCB3b3JrZXJfbGlzdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGlkbGVfbGlzdDsKKworCS8qCisJICogd2hlbiBvcGVyYXRpbmcgaW4gb3JkZXJlZCBtb2RlLCB0aGlzIG1haW50YWlucyB0aGUgbGlzdAorCSAqIG9mIHdvcmsgaXRlbXMgd2FpdGluZyBmb3IgY29tcGxldGlvbgorCSAqLworCXN0cnVjdCBsaXN0X2hlYWQgb3JkZXJfbGlzdDsKKworCS8qIGxvY2sgZm9yIGZpbmRpbmcgdGhlIG5leHQgd29ya2VyIHRocmVhZCB0byBxdWV1ZSBvbiAqLworCXNwaW5sb2NrX3QgbG9jazsKKworCS8qIGV4dHJhIG5hbWUgZm9yIHRoaXMgd29ya2VyLCB1c2VkIGZvciBjdXJyZW50LT5uYW1lICovCisJY2hhciAqbmFtZTsKK307CisKK2ludCBidHJmc19xdWV1ZV93b3JrZXIoc3RydWN0IGJ0cmZzX3dvcmtlcnMgKndvcmtlcnMsIHN0cnVjdCBidHJmc193b3JrICp3b3JrKTsKK2ludCBidHJmc19zdGFydF93b3JrZXJzKHN0cnVjdCBidHJmc193b3JrZXJzICp3b3JrZXJzLCBpbnQgbnVtX3dvcmtlcnMpOworaW50IGJ0cmZzX3N0b3Bfd29ya2VycyhzdHJ1Y3QgYnRyZnNfd29ya2VycyAqd29ya2Vycyk7Cit2b2lkIGJ0cmZzX2luaXRfd29ya2VycyhzdHJ1Y3QgYnRyZnNfd29ya2VycyAqd29ya2VycywgY2hhciAqbmFtZSwgaW50IG1heCk7CitpbnQgYnRyZnNfcmVxdWV1ZV93b3JrKHN0cnVjdCBidHJmc193b3JrICp3b3JrKTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZnMvYnRyZnMvYnRyZnNfaW5vZGUuaCBiL2ZzL2J0cmZzL2J0cmZzX2lub2RlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYThjOTY5MwotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2J0cmZzL2J0cmZzX2lub2RlLmgKQEAgLTAsMCArMSwxMzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgT3JhY2xlLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgdjIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKKyAqIEJvc3RvbiwgTUEgMDIxMTEwLTEzMDcsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fQlRSRlNfSV9fCisjZGVmaW5lIF9fQlRSRlNfSV9fCisKKyNpbmNsdWRlICJleHRlbnRfbWFwLmgiCisjaW5jbHVkZSAiZXh0ZW50X2lvLmgiCisjaW5jbHVkZSAib3JkZXJlZC1kYXRhLmgiCisKKy8qIGluIG1lbW9yeSBidHJmcyBpbm9kZSAqLworc3RydWN0IGJ0cmZzX2lub2RlIHsKKwkvKiB3aGljaCBzdWJ2b2x1bWUgdGhpcyBpbm9kZSBiZWxvbmdzIHRvICovCisJc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3Q7CisKKwkvKiBrZXkgdXNlZCB0byBmaW5kIHRoaXMgaW5vZGUgb24gZGlzay4gIFRoaXMgaXMgdXNlZCBieSB0aGUgY29kZQorCSAqIHRvIHJlYWQgaW4gcm9vdHMgb2Ygc3Vidm9sdW1lcworCSAqLworCXN0cnVjdCBidHJmc19rZXkgbG9jYXRpb247CisKKwkvKiB0aGUgZXh0ZW50X3RyZWUgaGFzIGNhY2hlcyBvZiBhbGwgdGhlIGV4dGVudCBtYXBwaW5ncyB0byBkaXNrICovCisJc3RydWN0IGV4dGVudF9tYXBfdHJlZSBleHRlbnRfdHJlZTsKKworCS8qIHRoZSBpb190cmVlIGRvZXMgcmFuZ2Ugc3RhdGUgKERJUlRZLCBMT0NLRUQgZXRjKSAqLworCXN0cnVjdCBleHRlbnRfaW9fdHJlZSBpb190cmVlOworCisJLyogc3BlY2lhbCB1dGlsaXR5IHRyZWUgdXNlZCB0byByZWNvcmQgd2hpY2ggbWlycm9ycyBoYXZlIGFscmVhZHkgYmVlbgorCSAqIHRyaWVkIHdoZW4gY2hlY2tzdW1zIGZhaWwgZm9yIGEgZ2l2ZW4gYmxvY2sKKwkgKi8KKwlzdHJ1Y3QgZXh0ZW50X2lvX3RyZWUgaW9fZmFpbHVyZV90cmVlOworCisJLyogaGVsZCB3aGlsZSBpbmVzcnRpbmcgb3IgZGVsZXRpbmcgZXh0ZW50cyBmcm9tIGZpbGVzICovCisJc3RydWN0IG11dGV4IGV4dGVudF9tdXRleDsKKworCS8qIGhlbGQgd2hpbGUgbG9nZ2luZyB0aGUgaW5vZGUgaW4gdHJlZS1sb2cuYyAqLworCXN0cnVjdCBtdXRleCBsb2dfbXV0ZXg7CisKKwkvKiB1c2VkIHRvIG9yZGVyIGRhdGEgd3J0IG1ldGFkYXRhICovCisJc3RydWN0IGJ0cmZzX29yZGVyZWRfaW5vZGVfdHJlZSBvcmRlcmVkX3RyZWU7CisKKwkvKiBzdGFuZGFyZCBhY2wgcG9pbnRlcnMgKi8KKwlzdHJ1Y3QgcG9zaXhfYWNsICppX2FjbDsKKwlzdHJ1Y3QgcG9zaXhfYWNsICppX2RlZmF1bHRfYWNsOworCisJLyogZm9yIGtlZXBpbmcgdHJhY2sgb2Ygb3JwaGFuZWQgaW5vZGVzICovCisJc3RydWN0IGxpc3RfaGVhZCBpX29ycGhhbjsKKworCS8qIGxpc3Qgb2YgYWxsIHRoZSBkZWxhbGxvYyBpbm9kZXMgaW4gdGhlIEZTLiAgVGhlcmUgYXJlIHRpbWVzIHdlIG5lZWQKKwkgKiB0byB3cml0ZSBhbGwgdGhlIGRlbGFsbG9jIHBhZ2VzIHRvIGRpc2ssIGFuZCB0aGlzIGxpc3QgaXMgdXNlZAorCSAqIHRvIHdhbGsgdGhlbSBhbGwuCisJICovCisJc3RydWN0IGxpc3RfaGVhZCBkZWxhbGxvY19pbm9kZXM7CisKKwkvKiBmdWxsIDY0IGJpdCBnZW5lcmF0aW9uIG51bWJlciwgc3RydWN0IHZmc19pbm9kZSBkb2Vzbid0IGhhdmUgYSBiaWcKKwkgKiBlbm91Z2ggZmllbGQgZm9yIHRoaXMuCisJICovCisJdTY0IGdlbmVyYXRpb247CisKKwkvKiBzZXF1ZW5jZSBudW1iZXIgZm9yIE5GUyBjaGFuZ2VzICovCisJdTY0IHNlcXVlbmNlOworCisJLyoKKwkgKiB0cmFuc2lkIG9mIHRoZSB0cmFuc19oYW5kbGUgdGhhdCBsYXN0IG1vZGlmaWVkIHRoaXMgaW5vZGUKKwkgKi8KKwl1NjQgbGFzdF90cmFuczsKKwkvKgorCSAqIHRyYW5zaWQgdGhhdCBsYXN0IGxvZ2dlZCB0aGlzIGlub2RlCisJICovCisJdTY0IGxvZ2dlZF90cmFuczsKKworCS8qCisJICogdHJhbnMgdGhhdCBsYXN0IG1hZGUgYSBjaGFuZ2UgdGhhdCBzaG91bGQgYmUgZnVsbHkgZnN5bmMnZC4gIFRoaXMKKwkgKiBnZXRzIHJlc2V0IHRvIHplcm8gZWFjaCB0aW1lIHRoZSBpbm9kZSBpcyBsb2dnZWQKKwkgKi8KKwl1NjQgbG9nX2RpcnR5X3RyYW5zOworCisJLyogdG90YWwgbnVtYmVyIG9mIGJ5dGVzIHBlbmRpbmcgZGVsYWxsb2MsIHVzZWQgYnkgc3RhdCB0byBjYWxjIHRoZQorCSAqIHJlYWwgYmxvY2sgdXNhZ2Ugb2YgdGhlIGZpbGUKKwkgKi8KKwl1NjQgZGVsYWxsb2NfYnl0ZXM7CisKKwkvKgorCSAqIHRoZSBzaXplIG9mIHRoZSBmaWxlIHN0b3JlZCBpbiB0aGUgbWV0YWRhdGEgb24gZGlzay4gIGRhdGE9b3JkZXJlZAorCSAqIG1lYW5zIHRoZSBpbi1tZW1vcnkgaV9zaXplIG1pZ2h0IGJlIGxhcmdlciB0aGFuIHRoZSBzaXplIG9uIGRpc2sKKwkgKiBiZWNhdXNlIG5vdCBhbGwgdGhlIGJsb2NrcyBhcmUgd3JpdHRlbiB5ZXQuCisJICovCisJdTY0IGRpc2tfaV9zaXplOworCisJLyogZmxhZ3MgZmllbGQgZnJvbSB0aGUgb24gZGlzayBpbm9kZSAqLworCXUzMiBmbGFnczsKKworCS8qCisJICogaWYgdGhpcyBpcyBhIGRpcmVjdG9yeSB0aGVuIGluZGV4X2NudCBpcyB0aGUgY291bnRlciBmb3IgdGhlIGluZGV4CisJICogbnVtYmVyIGZvciBuZXcgZmlsZXMgdGhhdCBhcmUgY3JlYXRlZAorCSAqLworCXU2NCBpbmRleF9jbnQ7CisKKwkvKiB0aGUgc3RhcnQgb2YgYmxvY2sgZ3JvdXAgcHJlZmVycmVkIGZvciBhbGxvY2F0aW9ucy4gKi8KKwl1NjQgYmxvY2tfZ3JvdXA7CisKKwlzdHJ1Y3QgaW5vZGUgdmZzX2lub2RlOworfTsKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgYnRyZnNfaW5vZGUgKkJUUkZTX0koc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlyZXR1cm4gY29udGFpbmVyX29mKGlub2RlLCBzdHJ1Y3QgYnRyZnNfaW5vZGUsIHZmc19pbm9kZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBidHJmc19pX3NpemVfd3JpdGUoc3RydWN0IGlub2RlICppbm9kZSwgdTY0IHNpemUpCit7CisJaW5vZGUtPmlfc2l6ZSA9IHNpemU7CisJQlRSRlNfSShpbm9kZSktPmRpc2tfaV9zaXplID0gc2l6ZTsKK30KKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2ZzL2J0cmZzL2NvbXBhdC5oIGIvZnMvYnRyZnMvY29tcGF0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2M0NTAzZQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2J0cmZzL2NvbXBhdC5oCkBAIC0wLDAgKzEsNyBAQAorI2lmbmRlZiBfQ09NUEFUX0hfCisjZGVmaW5lIF9DT01QQVRfSF8KKworI2RlZmluZSBidHJmc19kcm9wX25saW5rKGlub2RlKSBkcm9wX25saW5rKGlub2RlKQorI2RlZmluZSBidHJmc19pbmNfbmxpbmsoaW5vZGUpCWluY19ubGluayhpbm9kZSkKKworI2VuZGlmIC8qIF9DT01QQVRfSF8gKi8KZGlmZiAtLWdpdCBhL2ZzL2J0cmZzL2NvbXByZXNzaW9uLmMgYi9mcy9idHJmcy9jb21wcmVzc2lvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlODQ4ZDgKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9idHJmcy9jb21wcmVzc2lvbi5jCkBAIC0wLDAgKzEsNzA5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IE9yYWNsZS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIHYyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCisgKiBCb3N0b24sIE1BIDAyMTExMC0xMzA3LCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2Jpby5oPgorI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CisjaW5jbHVkZSA8bGludXgvZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvYmFja2luZy1kZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9tcGFnZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N3YXAuaD4KKyNpbmNsdWRlIDxsaW51eC93cml0ZWJhY2suaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRfc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvcGFnZXZlYy5oPgorI2luY2x1ZGUgImNvbXBhdC5oIgorI2luY2x1ZGUgImN0cmVlLmgiCisjaW5jbHVkZSAiZGlzay1pby5oIgorI2luY2x1ZGUgInRyYW5zYWN0aW9uLmgiCisjaW5jbHVkZSAiYnRyZnNfaW5vZGUuaCIKKyNpbmNsdWRlICJ2b2x1bWVzLmgiCisjaW5jbHVkZSAib3JkZXJlZC1kYXRhLmgiCisjaW5jbHVkZSAiY29tcHJlc3Npb24uaCIKKyNpbmNsdWRlICJleHRlbnRfaW8uaCIKKyNpbmNsdWRlICJleHRlbnRfbWFwLmgiCisKK3N0cnVjdCBjb21wcmVzc2VkX2JpbyB7CisJLyogbnVtYmVyIG9mIGJpb3MgcGVuZGluZyBmb3IgdGhpcyBjb21wcmVzc2VkIGV4dGVudCAqLworCWF0b21pY190IHBlbmRpbmdfYmlvczsKKworCS8qIHRoZSBwYWdlcyB3aXRoIHRoZSBjb21wcmVzc2VkIGRhdGEgb24gdGhlbSAqLworCXN0cnVjdCBwYWdlICoqY29tcHJlc3NlZF9wYWdlczsKKworCS8qIGlub2RlIHRoYXQgb3ducyB0aGlzIGRhdGEgKi8KKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCisJLyogc3RhcnRpbmcgb2Zmc2V0IGluIHRoZSBpbm9kZSBmb3Igb3VyIHBhZ2VzICovCisJdTY0IHN0YXJ0OworCisJLyogbnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBpbm9kZSB3ZSdyZSB3b3JraW5nIG9uICovCisJdW5zaWduZWQgbG9uZyBsZW47CisKKwkvKiBudW1iZXIgb2YgYnl0ZXMgb24gZGlzayAqLworCXVuc2lnbmVkIGxvbmcgY29tcHJlc3NlZF9sZW47CisKKwkvKiBudW1iZXIgb2YgY29tcHJlc3NlZCBwYWdlcyBpbiB0aGUgYXJyYXkgKi8KKwl1bnNpZ25lZCBsb25nIG5yX3BhZ2VzOworCisJLyogSU8gZXJyb3JzICovCisJaW50IGVycm9yczsKKwlpbnQgbWlycm9yX251bTsKKworCS8qIGZvciByZWFkcywgdGhpcyBpcyB0aGUgYmlvIHdlIGFyZSBjb3B5aW5nIHRoZSBkYXRhIGludG8gKi8KKwlzdHJ1Y3QgYmlvICpvcmlnX2JpbzsKKworCS8qCisJICogdGhlIHN0YXJ0IG9mIGEgdmFyaWFibGUgbGVuZ3RoIGFycmF5IG9mIGNoZWNrc3VtcyBvbmx5CisJICogdXNlZCBieSByZWFkcworCSAqLworCXUzMiBzdW1zOworfTsKKworc3RhdGljIGlubGluZSBpbnQgY29tcHJlc3NlZF9iaW9fc2l6ZShzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwKKwkJCQkgICAgICB1bnNpZ25lZCBsb25nIGRpc2tfc2l6ZSkKK3sKKwl1MTYgY3N1bV9zaXplID0gYnRyZnNfc3VwZXJfY3N1bV9zaXplKCZyb290LT5mc19pbmZvLT5zdXBlcl9jb3B5KTsKKwlyZXR1cm4gc2l6ZW9mKHN0cnVjdCBjb21wcmVzc2VkX2JpbykgKworCQkoKGRpc2tfc2l6ZSArIHJvb3QtPnNlY3RvcnNpemUgLSAxKSAvIHJvb3QtPnNlY3RvcnNpemUpICoKKwkJY3N1bV9zaXplOworfQorCitzdGF0aWMgc3RydWN0IGJpbyAqY29tcHJlc3NlZF9iaW9fYWxsb2Moc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwKKwkJCQkJdTY0IGZpcnN0X2J5dGUsIGdmcF90IGdmcF9mbGFncykKK3sKKwlzdHJ1Y3QgYmlvICpiaW87CisJaW50IG5yX3ZlY3M7CisKKwlucl92ZWNzID0gYmlvX2dldF9ucl92ZWNzKGJkZXYpOworCWJpbyA9IGJpb19hbGxvYyhnZnBfZmxhZ3MsIG5yX3ZlY3MpOworCisJaWYgKGJpbyA9PSBOVUxMICYmIChjdXJyZW50LT5mbGFncyAmIFBGX01FTUFMTE9DKSkgeworCQl3aGlsZSAoIWJpbyAmJiAobnJfdmVjcyAvPSAyKSkKKwkJCWJpbyA9IGJpb19hbGxvYyhnZnBfZmxhZ3MsIG5yX3ZlY3MpOworCX0KKworCWlmIChiaW8pIHsKKwkJYmlvLT5iaV9zaXplID0gMDsKKwkJYmlvLT5iaV9iZGV2ID0gYmRldjsKKwkJYmlvLT5iaV9zZWN0b3IgPSBmaXJzdF9ieXRlID4+IDk7CisJfQorCXJldHVybiBiaW87Cit9CisKK3N0YXRpYyBpbnQgY2hlY2tfY29tcHJlc3NlZF9jc3VtKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJIHN0cnVjdCBjb21wcmVzc2VkX2JpbyAqY2IsCisJCQkJIHU2NCBkaXNrX3N0YXJ0KQoreworCWludCByZXQ7CisJc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QgPSBCVFJGU19JKGlub2RlKS0+cm9vdDsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwl1bnNpZ25lZCBsb25nIGk7CisJY2hhciAqa2FkZHI7CisJdTMyIGNzdW07CisJdTMyICpjYl9zdW0gPSAmY2ItPnN1bXM7CisKKwlpZiAoYnRyZnNfdGVzdF9mbGFnKGlub2RlLCBOT0RBVEFTVU0pKQorCQlyZXR1cm4gMDsKKworCWZvciAoaSA9IDA7IGkgPCBjYi0+bnJfcGFnZXM7IGkrKykgeworCQlwYWdlID0gY2ItPmNvbXByZXNzZWRfcGFnZXNbaV07CisJCWNzdW0gPSB+KHUzMikwOworCisJCWthZGRyID0ga21hcF9hdG9taWMocGFnZSwgS01fVVNFUjApOworCQljc3VtID0gYnRyZnNfY3N1bV9kYXRhKHJvb3QsIGthZGRyLCBjc3VtLCBQQUdFX0NBQ0hFX1NJWkUpOworCQlidHJmc19jc3VtX2ZpbmFsKGNzdW0sIChjaGFyICopJmNzdW0pOworCQlrdW5tYXBfYXRvbWljKGthZGRyLCBLTV9VU0VSMCk7CisKKwkJaWYgKGNzdW0gIT0gKmNiX3N1bSkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiYnRyZnMgY3N1bSBmYWlsZWQgaW5vICVsdSAiCisJCQkgICAgICAgImV4dGVudCAlbGx1IGNzdW0gJXUgIgorCQkJICAgICAgICJ3YW50ZWQgJXUgbWlycm9yICVkXG4iLCBpbm9kZS0+aV9pbm8sCisJCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylkaXNrX3N0YXJ0LAorCQkJICAgICAgIGNzdW0sICpjYl9zdW0sIGNiLT5taXJyb3JfbnVtKTsKKwkJCXJldCA9IC1FSU87CisJCQlnb3RvIGZhaWw7CisJCX0KKwkJY2Jfc3VtKys7CisKKwl9CisJcmV0ID0gMDsKK2ZhaWw6CisJcmV0dXJuIHJldDsKK30KKworLyogd2hlbiB3ZSBmaW5pc2ggcmVhZGluZyBjb21wcmVzc2VkIHBhZ2VzIGZyb20gdGhlIGRpc2ssIHdlCisgKiBkZWNvbXByZXNzIHRoZW0gYW5kIHRoZW4gcnVuIHRoZSBiaW8gZW5kX2lvIHJvdXRpbmVzIG9uIHRoZQorICogZGVjb21wcmVzc2VkIHBhZ2VzIChpbiB0aGUgaW5vZGUgYWRkcmVzcyBzcGFjZSkuCisgKgorICogVGhpcyBhbGxvd3MgdGhlIGNoZWNrc3VtbWluZyBhbmQgb3RoZXIgSU8gZXJyb3IgaGFuZGxpbmcgcm91dGluZXMKKyAqIHRvIHdvcmsgbm9ybWFsbHkKKyAqCisgKiBUaGUgY29tcHJlc3NlZCBwYWdlcyBhcmUgZnJlZWQgaGVyZSwgYW5kIGl0IG11c3QgYmUgcnVuCisgKiBpbiBwcm9jZXNzIGNvbnRleHQKKyAqLworc3RhdGljIHZvaWQgZW5kX2NvbXByZXNzZWRfYmlvX3JlYWQoc3RydWN0IGJpbyAqYmlvLCBpbnQgZXJyKQoreworCXN0cnVjdCBleHRlbnRfaW9fdHJlZSAqdHJlZTsKKwlzdHJ1Y3QgY29tcHJlc3NlZF9iaW8gKmNiID0gYmlvLT5iaV9wcml2YXRlOworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisJdW5zaWduZWQgbG9uZyBpbmRleDsKKwlpbnQgcmV0OworCisJaWYgKGVycikKKwkJY2ItPmVycm9ycyA9IDE7CisKKwkvKiBpZiB0aGVyZSBhcmUgbW9yZSBiaW9zIHN0aWxsIHBlbmRpbmcgZm9yIHRoaXMgY29tcHJlc3NlZAorCSAqIGV4dGVudCwganVzdCBleGl0CisJICovCisJaWYgKCFhdG9taWNfZGVjX2FuZF90ZXN0KCZjYi0+cGVuZGluZ19iaW9zKSkKKwkJZ290byBvdXQ7CisKKwlpbm9kZSA9IGNiLT5pbm9kZTsKKwlyZXQgPSBjaGVja19jb21wcmVzc2VkX2NzdW0oaW5vZGUsIGNiLCAodTY0KWJpby0+Ymlfc2VjdG9yIDw8IDkpOworCWlmIChyZXQpCisJCWdvdG8gY3N1bV9mYWlsZWQ7CisKKwkvKiBvaywgd2UncmUgdGhlIGxhc3QgYmlvIGZvciB0aGlzIGV4dGVudCwgbGV0cyBzdGFydAorCSAqIHRoZSBkZWNvbXByZXNzaW9uLgorCSAqLworCXRyZWUgPSAmQlRSRlNfSShpbm9kZSktPmlvX3RyZWU7CisJcmV0ID0gYnRyZnNfemxpYl9kZWNvbXByZXNzX2Jpb3ZlYyhjYi0+Y29tcHJlc3NlZF9wYWdlcywKKwkJCQkJY2ItPnN0YXJ0LAorCQkJCQljYi0+b3JpZ19iaW8tPmJpX2lvX3ZlYywKKwkJCQkJY2ItPm9yaWdfYmlvLT5iaV92Y250LAorCQkJCQljYi0+Y29tcHJlc3NlZF9sZW4pOworY3N1bV9mYWlsZWQ6CisJaWYgKHJldCkKKwkJY2ItPmVycm9ycyA9IDE7CisKKwkvKiByZWxlYXNlIHRoZSBjb21wcmVzc2VkIHBhZ2VzICovCisJaW5kZXggPSAwOworCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IGNiLT5ucl9wYWdlczsgaW5kZXgrKykgeworCQlwYWdlID0gY2ItPmNvbXByZXNzZWRfcGFnZXNbaW5kZXhdOworCQlwYWdlLT5tYXBwaW5nID0gTlVMTDsKKwkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOworCX0KKworCS8qIGRvIGlvIGNvbXBsZXRpb24gb24gdGhlIG9yaWdpbmFsIGJpbyAqLworCWlmIChjYi0+ZXJyb3JzKSB7CisJCWJpb19pb19lcnJvcihjYi0+b3JpZ19iaW8pOworCX0gZWxzZSB7CisJCWludCBiaW9faW5kZXggPSAwOworCQlzdHJ1Y3QgYmlvX3ZlYyAqYnZlYyA9IGNiLT5vcmlnX2Jpby0+YmlfaW9fdmVjOworCisJCS8qCisJCSAqIHdlIGhhdmUgdmVyaWZpZWQgdGhlIGNoZWNrc3VtIGFscmVhZHksIHNldCBwYWdlCisJCSAqIGNoZWNrZWQgc28gdGhlIGVuZF9pbyBoYW5kbGVycyBrbm93IGFib3V0IGl0CisJCSAqLworCQl3aGlsZSAoYmlvX2luZGV4IDwgY2ItPm9yaWdfYmlvLT5iaV92Y250KSB7CisJCQlTZXRQYWdlQ2hlY2tlZChidmVjLT5idl9wYWdlKTsKKwkJCWJ2ZWMrKzsKKwkJCWJpb19pbmRleCsrOworCQl9CisJCWJpb19lbmRpbyhjYi0+b3JpZ19iaW8sIDApOworCX0KKworCS8qIGZpbmFsbHkgZnJlZSB0aGUgY2Igc3RydWN0ICovCisJa2ZyZWUoY2ItPmNvbXByZXNzZWRfcGFnZXMpOworCWtmcmVlKGNiKTsKK291dDoKKwliaW9fcHV0KGJpbyk7Cit9CisKKy8qCisgKiBDbGVhciB0aGUgd3JpdGViYWNrIGJpdHMgb24gYWxsIG9mIHRoZSBmaWxlCisgKiBwYWdlcyBmb3IgYSBjb21wcmVzc2VkIHdyaXRlCisgKi8KK3N0YXRpYyBub2lubGluZSBpbnQgZW5kX2NvbXByZXNzZWRfd3JpdGViYWNrKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHU2NCBzdGFydCwKKwkJCQkJICAgICB1bnNpZ25lZCBsb25nIHJhbV9zaXplKQoreworCXVuc2lnbmVkIGxvbmcgaW5kZXggPSBzdGFydCA+PiBQQUdFX0NBQ0hFX1NISUZUOworCXVuc2lnbmVkIGxvbmcgZW5kX2luZGV4ID0gKHN0YXJ0ICsgcmFtX3NpemUgLSAxKSA+PiBQQUdFX0NBQ0hFX1NISUZUOworCXN0cnVjdCBwYWdlICpwYWdlc1sxNl07CisJdW5zaWduZWQgbG9uZyBucl9wYWdlcyA9IGVuZF9pbmRleCAtIGluZGV4ICsgMTsKKwlpbnQgaTsKKwlpbnQgcmV0OworCisJd2hpbGUgKG5yX3BhZ2VzID4gMCkgeworCQlyZXQgPSBmaW5kX2dldF9wYWdlc19jb250aWcoaW5vZGUtPmlfbWFwcGluZywgaW5kZXgsCisJCQkJICAgICBtaW5fdCh1bnNpZ25lZCBsb25nLAorCQkJCSAgICAgbnJfcGFnZXMsIEFSUkFZX1NJWkUocGFnZXMpKSwgcGFnZXMpOworCQlpZiAocmV0ID09IDApIHsKKwkJCW5yX3BhZ2VzIC09IDE7CisJCQlpbmRleCArPSAxOworCQkJY29udGludWU7CisJCX0KKwkJZm9yIChpID0gMDsgaSA8IHJldDsgaSsrKSB7CisJCQllbmRfcGFnZV93cml0ZWJhY2socGFnZXNbaV0pOworCQkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2VzW2ldKTsKKwkJfQorCQlucl9wYWdlcyAtPSByZXQ7CisJCWluZGV4ICs9IHJldDsKKwl9CisJLyogdGhlIGlub2RlIG1heSBiZSBnb25lIG5vdyAqLworCXJldHVybiAwOworfQorCisvKgorICogZG8gdGhlIGNsZWFudXAgb25jZSBhbGwgdGhlIGNvbXByZXNzZWQgcGFnZXMgaGl0IHRoZSBkaXNrLgorICogVGhpcyB3aWxsIGNsZWFyIHdyaXRlYmFjayBvbiB0aGUgZmlsZSBwYWdlcyBhbmQgZnJlZSB0aGUgY29tcHJlc3NlZAorICogcGFnZXMuCisgKgorICogVGhpcyBhbHNvIGNhbGxzIHRoZSB3cml0ZWJhY2sgZW5kIGhvb2tzIGZvciB0aGUgZmlsZSBwYWdlcyBzbyB0aGF0CisgKiBtZXRhZGF0YSBhbmQgY2hlY2tzdW1zIGNhbiBiZSB1cGRhdGVkIGluIHRoZSBmaWxlLgorICovCitzdGF0aWMgdm9pZCBlbmRfY29tcHJlc3NlZF9iaW9fd3JpdGUoc3RydWN0IGJpbyAqYmlvLCBpbnQgZXJyKQoreworCXN0cnVjdCBleHRlbnRfaW9fdHJlZSAqdHJlZTsKKwlzdHJ1Y3QgY29tcHJlc3NlZF9iaW8gKmNiID0gYmlvLT5iaV9wcml2YXRlOworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisJdW5zaWduZWQgbG9uZyBpbmRleDsKKworCWlmIChlcnIpCisJCWNiLT5lcnJvcnMgPSAxOworCisJLyogaWYgdGhlcmUgYXJlIG1vcmUgYmlvcyBzdGlsbCBwZW5kaW5nIGZvciB0aGlzIGNvbXByZXNzZWQKKwkgKiBleHRlbnQsIGp1c3QgZXhpdAorCSAqLworCWlmICghYXRvbWljX2RlY19hbmRfdGVzdCgmY2ItPnBlbmRpbmdfYmlvcykpCisJCWdvdG8gb3V0OworCisJLyogb2ssIHdlJ3JlIHRoZSBsYXN0IGJpbyBmb3IgdGhpcyBleHRlbnQsIHN0ZXAgb25lIGlzIHRvCisJICogY2FsbCBiYWNrIGludG8gdGhlIEZTIGFuZCBkbyBhbGwgdGhlIGVuZF9pbyBvcGVyYXRpb25zCisJICovCisJaW5vZGUgPSBjYi0+aW5vZGU7CisJdHJlZSA9ICZCVFJGU19JKGlub2RlKS0+aW9fdHJlZTsKKwljYi0+Y29tcHJlc3NlZF9wYWdlc1swXS0+bWFwcGluZyA9IGNiLT5pbm9kZS0+aV9tYXBwaW5nOworCXRyZWUtPm9wcy0+d3JpdGVwYWdlX2VuZF9pb19ob29rKGNiLT5jb21wcmVzc2VkX3BhZ2VzWzBdLAorCQkJCQkgY2ItPnN0YXJ0LAorCQkJCQkgY2ItPnN0YXJ0ICsgY2ItPmxlbiAtIDEsCisJCQkJCSBOVUxMLCAxKTsKKwljYi0+Y29tcHJlc3NlZF9wYWdlc1swXS0+bWFwcGluZyA9IE5VTEw7CisKKwllbmRfY29tcHJlc3NlZF93cml0ZWJhY2soaW5vZGUsIGNiLT5zdGFydCwgY2ItPmxlbik7CisJLyogbm90ZSwgb3VyIGlub2RlIGNvdWxkIGJlIGdvbmUgbm93ICovCisKKwkvKgorCSAqIHJlbGVhc2UgdGhlIGNvbXByZXNzZWQgcGFnZXMsIHRoZXNlIGNhbWUgZnJvbSBhbGxvY19wYWdlIGFuZAorCSAqIGFyZSBub3QgYXR0YWNoZWQgdG8gdGhlIGlub2RlIGF0IGFsbAorCSAqLworCWluZGV4ID0gMDsKKwlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBjYi0+bnJfcGFnZXM7IGluZGV4KyspIHsKKwkJcGFnZSA9IGNiLT5jb21wcmVzc2VkX3BhZ2VzW2luZGV4XTsKKwkJcGFnZS0+bWFwcGluZyA9IE5VTEw7CisJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKKwl9CisKKwkvKiBmaW5hbGx5IGZyZWUgdGhlIGNiIHN0cnVjdCAqLworCWtmcmVlKGNiLT5jb21wcmVzc2VkX3BhZ2VzKTsKKwlrZnJlZShjYik7CitvdXQ6CisJYmlvX3B1dChiaW8pOworfQorCisvKgorICogd29ya2VyIGZ1bmN0aW9uIHRvIGJ1aWxkIGFuZCBzdWJtaXQgYmlvcyBmb3IgcHJldmlvdXNseSBjb21wcmVzc2VkIHBhZ2VzLgorICogVGhlIGNvcnJlc3BvbmRpbmcgcGFnZXMgaW4gdGhlIGlub2RlIHNob3VsZCBiZSBtYXJrZWQgZm9yIHdyaXRlYmFjaworICogYW5kIHRoZSBjb21wcmVzc2VkIHBhZ2VzIHNob3VsZCBoYXZlIGEgcmVmZXJlbmNlIG9uIHRoZW0gZm9yIGRyb3BwaW5nCisgKiB3aGVuIHRoZSBJTyBpcyBjb21wbGV0ZS4KKyAqCisgKiBUaGlzIGFsc28gY2hlY2tzdW1zIHRoZSBmaWxlIGJ5dGVzIGFuZCBnZXRzIHRoaW5ncyByZWFkeSBmb3IKKyAqIHRoZSBlbmQgaW8gaG9va3MuCisgKi8KK2ludCBidHJmc19zdWJtaXRfY29tcHJlc3NlZF93cml0ZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1NjQgc3RhcnQsCisJCQkJIHVuc2lnbmVkIGxvbmcgbGVuLCB1NjQgZGlza19zdGFydCwKKwkJCQkgdW5zaWduZWQgbG9uZyBjb21wcmVzc2VkX2xlbiwKKwkJCQkgc3RydWN0IHBhZ2UgKipjb21wcmVzc2VkX3BhZ2VzLAorCQkJCSB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzKQoreworCXN0cnVjdCBiaW8gKmJpbyA9IE5VTEw7CisJc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QgPSBCVFJGU19JKGlub2RlKS0+cm9vdDsKKwlzdHJ1Y3QgY29tcHJlc3NlZF9iaW8gKmNiOworCXVuc2lnbmVkIGxvbmcgYnl0ZXNfbGVmdDsKKwlzdHJ1Y3QgZXh0ZW50X2lvX3RyZWUgKmlvX3RyZWUgPSAmQlRSRlNfSShpbm9kZSktPmlvX3RyZWU7CisJaW50IHBhZ2VfaW5kZXggPSAwOworCXN0cnVjdCBwYWdlICpwYWdlOworCXU2NCBmaXJzdF9ieXRlID0gZGlza19zdGFydDsKKwlzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2OworCWludCByZXQ7CisKKwlXQVJOX09OKHN0YXJ0ICYgKCh1NjQpUEFHRV9DQUNIRV9TSVpFIC0gMSkpOworCWNiID0ga21hbGxvYyhjb21wcmVzc2VkX2Jpb19zaXplKHJvb3QsIGNvbXByZXNzZWRfbGVuKSwgR0ZQX05PRlMpOworCWF0b21pY19zZXQoJmNiLT5wZW5kaW5nX2Jpb3MsIDApOworCWNiLT5lcnJvcnMgPSAwOworCWNiLT5pbm9kZSA9IGlub2RlOworCWNiLT5zdGFydCA9IHN0YXJ0OworCWNiLT5sZW4gPSBsZW47CisJY2ItPm1pcnJvcl9udW0gPSAwOworCWNiLT5jb21wcmVzc2VkX3BhZ2VzID0gY29tcHJlc3NlZF9wYWdlczsKKwljYi0+Y29tcHJlc3NlZF9sZW4gPSBjb21wcmVzc2VkX2xlbjsKKwljYi0+b3JpZ19iaW8gPSBOVUxMOworCWNiLT5ucl9wYWdlcyA9IG5yX3BhZ2VzOworCisJYmRldiA9IEJUUkZTX0koaW5vZGUpLT5yb290LT5mc19pbmZvLT5mc19kZXZpY2VzLT5sYXRlc3RfYmRldjsKKworCWJpbyA9IGNvbXByZXNzZWRfYmlvX2FsbG9jKGJkZXYsIGZpcnN0X2J5dGUsIEdGUF9OT0ZTKTsKKwliaW8tPmJpX3ByaXZhdGUgPSBjYjsKKwliaW8tPmJpX2VuZF9pbyA9IGVuZF9jb21wcmVzc2VkX2Jpb193cml0ZTsKKwlhdG9taWNfaW5jKCZjYi0+cGVuZGluZ19iaW9zKTsKKworCS8qIGNyZWF0ZSBhbmQgc3VibWl0IGJpb3MgZm9yIHRoZSBjb21wcmVzc2VkIHBhZ2VzICovCisJYnl0ZXNfbGVmdCA9IGNvbXByZXNzZWRfbGVuOworCWZvciAocGFnZV9pbmRleCA9IDA7IHBhZ2VfaW5kZXggPCBjYi0+bnJfcGFnZXM7IHBhZ2VfaW5kZXgrKykgeworCQlwYWdlID0gY29tcHJlc3NlZF9wYWdlc1twYWdlX2luZGV4XTsKKwkJcGFnZS0+bWFwcGluZyA9IGlub2RlLT5pX21hcHBpbmc7CisJCWlmIChiaW8tPmJpX3NpemUpCisJCQlyZXQgPSBpb190cmVlLT5vcHMtPm1lcmdlX2Jpb19ob29rKHBhZ2UsIDAsCisJCQkJCQkJICAgUEFHRV9DQUNIRV9TSVpFLAorCQkJCQkJCSAgIGJpbywgMCk7CisJCWVsc2UKKwkJCXJldCA9IDA7CisKKwkJcGFnZS0+bWFwcGluZyA9IE5VTEw7CisJCWlmIChyZXQgfHwgYmlvX2FkZF9wYWdlKGJpbywgcGFnZSwgUEFHRV9DQUNIRV9TSVpFLCAwKSA8CisJCSAgICBQQUdFX0NBQ0hFX1NJWkUpIHsKKwkJCWJpb19nZXQoYmlvKTsKKworCQkJLyoKKwkJCSAqIGluYyB0aGUgY291bnQgYmVmb3JlIHdlIHN1Ym1pdCB0aGUgYmlvIHNvCisJCQkgKiB3ZSBrbm93IHRoZSBlbmQgSU8gaGFuZGxlciB3b24ndCBoYXBwZW4gYmVmb3JlCisJCQkgKiB3ZSBpbmMgdGhlIGNvdW50LiAgT3RoZXJ3aXNlLCB0aGUgY2IgbWlnaHQgZ2V0CisJCQkgKiBmcmVlZCBiZWZvcmUgd2UncmUgZG9uZSBzZXR0aW5nIGl0IHVwCisJCQkgKi8KKwkJCWF0b21pY19pbmMoJmNiLT5wZW5kaW5nX2Jpb3MpOworCQkJcmV0ID0gYnRyZnNfYmlvX3dxX2VuZF9pbyhyb290LT5mc19pbmZvLCBiaW8sIDApOworCQkJQlVHX09OKHJldCk7CisKKwkJCXJldCA9IGJ0cmZzX2NzdW1fb25lX2Jpbyhyb290LCBpbm9kZSwgYmlvLCBzdGFydCwgMSk7CisJCQlCVUdfT04ocmV0KTsKKworCQkJcmV0ID0gYnRyZnNfbWFwX2Jpbyhyb290LCBXUklURSwgYmlvLCAwLCAxKTsKKwkJCUJVR19PTihyZXQpOworCisJCQliaW9fcHV0KGJpbyk7CisKKwkJCWJpbyA9IGNvbXByZXNzZWRfYmlvX2FsbG9jKGJkZXYsIGZpcnN0X2J5dGUsIEdGUF9OT0ZTKTsKKwkJCWJpby0+YmlfcHJpdmF0ZSA9IGNiOworCQkJYmlvLT5iaV9lbmRfaW8gPSBlbmRfY29tcHJlc3NlZF9iaW9fd3JpdGU7CisJCQliaW9fYWRkX3BhZ2UoYmlvLCBwYWdlLCBQQUdFX0NBQ0hFX1NJWkUsIDApOworCQl9CisJCWlmIChieXRlc19sZWZ0IDwgUEFHRV9DQUNIRV9TSVpFKSB7CisJCQlwcmludGsoImJ5dGVzIGxlZnQgJWx1IGNvbXByZXNzIGxlbiAlbHUgbnIgJWx1XG4iLAorCQkJICAgICAgIGJ5dGVzX2xlZnQsIGNiLT5jb21wcmVzc2VkX2xlbiwgY2ItPm5yX3BhZ2VzKTsKKwkJfQorCQlieXRlc19sZWZ0IC09IFBBR0VfQ0FDSEVfU0laRTsKKwkJZmlyc3RfYnl0ZSArPSBQQUdFX0NBQ0hFX1NJWkU7CisJCWNvbmRfcmVzY2hlZCgpOworCX0KKwliaW9fZ2V0KGJpbyk7CisKKwlyZXQgPSBidHJmc19iaW9fd3FfZW5kX2lvKHJvb3QtPmZzX2luZm8sIGJpbywgMCk7CisJQlVHX09OKHJldCk7CisKKwlyZXQgPSBidHJmc19jc3VtX29uZV9iaW8ocm9vdCwgaW5vZGUsIGJpbywgc3RhcnQsIDEpOworCUJVR19PTihyZXQpOworCisJcmV0ID0gYnRyZnNfbWFwX2Jpbyhyb290LCBXUklURSwgYmlvLCAwLCAxKTsKKwlCVUdfT04ocmV0KTsKKworCWJpb19wdXQoYmlvKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIG5vaW5saW5lIGludCBhZGRfcmFfYmlvX3BhZ2VzKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJICAgICB1NjQgY29tcHJlc3NlZF9lbmQsCisJCQkJICAgICBzdHJ1Y3QgY29tcHJlc3NlZF9iaW8gKmNiKQoreworCXVuc2lnbmVkIGxvbmcgZW5kX2luZGV4OworCXVuc2lnbmVkIGxvbmcgcGFnZV9pbmRleDsKKwl1NjQgbGFzdF9vZmZzZXQ7CisJdTY0IGlzaXplID0gaV9zaXplX3JlYWQoaW5vZGUpOworCWludCByZXQ7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisJdW5zaWduZWQgbG9uZyBucl9wYWdlcyA9IDA7CisJc3RydWN0IGV4dGVudF9tYXAgKmVtOworCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gaW5vZGUtPmlfbWFwcGluZzsKKwlzdHJ1Y3QgcGFnZXZlYyBwdmVjOworCXN0cnVjdCBleHRlbnRfbWFwX3RyZWUgKmVtX3RyZWU7CisJc3RydWN0IGV4dGVudF9pb190cmVlICp0cmVlOworCXU2NCBlbmQ7CisJaW50IG1pc3NlcyA9IDA7CisKKwlwYWdlID0gY2ItPm9yaWdfYmlvLT5iaV9pb192ZWNbY2ItPm9yaWdfYmlvLT5iaV92Y250IC0gMV0uYnZfcGFnZTsKKwlsYXN0X29mZnNldCA9IChwYWdlX29mZnNldChwYWdlKSArIFBBR0VfQ0FDSEVfU0laRSk7CisJZW1fdHJlZSA9ICZCVFJGU19JKGlub2RlKS0+ZXh0ZW50X3RyZWU7CisJdHJlZSA9ICZCVFJGU19JKGlub2RlKS0+aW9fdHJlZTsKKworCWlmIChpc2l6ZSA9PSAwKQorCQlyZXR1cm4gMDsKKworCWVuZF9pbmRleCA9IChpX3NpemVfcmVhZChpbm9kZSkgLSAxKSA+PiBQQUdFX0NBQ0hFX1NISUZUOworCisJcGFnZXZlY19pbml0KCZwdmVjLCAwKTsKKwl3aGlsZSAobGFzdF9vZmZzZXQgPCBjb21wcmVzc2VkX2VuZCkgeworCQlwYWdlX2luZGV4ID0gbGFzdF9vZmZzZXQgPj4gUEFHRV9DQUNIRV9TSElGVDsKKworCQlpZiAocGFnZV9pbmRleCA+IGVuZF9pbmRleCkKKwkJCWJyZWFrOworCisJCXJjdV9yZWFkX2xvY2soKTsKKwkJcGFnZSA9IHJhZGl4X3RyZWVfbG9va3VwKCZtYXBwaW5nLT5wYWdlX3RyZWUsIHBhZ2VfaW5kZXgpOworCQlyY3VfcmVhZF91bmxvY2soKTsKKwkJaWYgKHBhZ2UpIHsKKwkJCW1pc3NlcysrOworCQkJaWYgKG1pc3NlcyA+IDQpCisJCQkJYnJlYWs7CisJCQlnb3RvIG5leHQ7CisJCX0KKworCQlwYWdlID0gYWxsb2NfcGFnZShtYXBwaW5nX2dmcF9tYXNrKG1hcHBpbmcpIHwgR0ZQX05PRlMpOworCQlpZiAoIXBhZ2UpCisJCQlicmVhazsKKworCQlwYWdlLT5pbmRleCA9IHBhZ2VfaW5kZXg7CisJCS8qCisJCSAqIHdoYXQgd2Ugd2FudCB0byBkbyBoZXJlIGlzIGNhbGwgYWRkX3RvX3BhZ2VfY2FjaGVfbHJ1LAorCQkgKiBidXQgdGhhdCBpc24ndCBleHBvcnRlZCwgc28gd2UgcmVwcm9kdWNlIGl0IGhlcmUKKwkJICovCisJCWlmIChhZGRfdG9fcGFnZV9jYWNoZShwYWdlLCBtYXBwaW5nLAorCQkJCSAgICAgIHBhZ2UtPmluZGV4LCBHRlBfTk9GUykpIHsKKwkJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKKwkJCWdvdG8gbmV4dDsKKwkJfQorCisJCS8qIG9wZW4gY29kaW5nIG9mIGxydV9jYWNoZV9hZGQsIGFsc28gbm90IGV4cG9ydGVkICovCisJCXBhZ2VfY2FjaGVfZ2V0KHBhZ2UpOworCQlpZiAoIXBhZ2V2ZWNfYWRkKCZwdmVjLCBwYWdlKSkKKwkJCV9fcGFnZXZlY19scnVfYWRkX2ZpbGUoJnB2ZWMpOworCisJCWVuZCA9IGxhc3Rfb2Zmc2V0ICsgUEFHRV9DQUNIRV9TSVpFIC0gMTsKKwkJLyoKKwkJICogYXQgdGhpcyBwb2ludCwgd2UgaGF2ZSBhIGxvY2tlZCBwYWdlIGluIHRoZSBwYWdlIGNhY2hlCisJCSAqIGZvciB0aGVzZSBieXRlcyBpbiB0aGUgZmlsZS4gIEJ1dCwgd2UgaGF2ZSB0byBtYWtlCisJCSAqIHN1cmUgdGhleSBtYXAgdG8gdGhpcyBjb21wcmVzc2VkIGV4dGVudCBvbiBkaXNrLgorCQkgKi8KKwkJc2V0X3BhZ2VfZXh0ZW50X21hcHBlZChwYWdlKTsKKwkJbG9ja19leHRlbnQodHJlZSwgbGFzdF9vZmZzZXQsIGVuZCwgR0ZQX05PRlMpOworCQlzcGluX2xvY2soJmVtX3RyZWUtPmxvY2spOworCQllbSA9IGxvb2t1cF9leHRlbnRfbWFwcGluZyhlbV90cmVlLCBsYXN0X29mZnNldCwKKwkJCQkJICAgUEFHRV9DQUNIRV9TSVpFKTsKKwkJc3Bpbl91bmxvY2soJmVtX3RyZWUtPmxvY2spOworCisJCWlmICghZW0gfHwgbGFzdF9vZmZzZXQgPCBlbS0+c3RhcnQgfHwKKwkJICAgIChsYXN0X29mZnNldCArIFBBR0VfQ0FDSEVfU0laRSA+IGV4dGVudF9tYXBfZW5kKGVtKSkgfHwKKwkJICAgIChlbS0+YmxvY2tfc3RhcnQgPj4gOSkgIT0gY2ItPm9yaWdfYmlvLT5iaV9zZWN0b3IpIHsKKwkJCWZyZWVfZXh0ZW50X21hcChlbSk7CisJCQl1bmxvY2tfZXh0ZW50KHRyZWUsIGxhc3Rfb2Zmc2V0LCBlbmQsIEdGUF9OT0ZTKTsKKwkJCXVubG9ja19wYWdlKHBhZ2UpOworCQkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOworCQkJYnJlYWs7CisJCX0KKwkJZnJlZV9leHRlbnRfbWFwKGVtKTsKKworCQlpZiAocGFnZS0+aW5kZXggPT0gZW5kX2luZGV4KSB7CisJCQljaGFyICp1c2VycGFnZTsKKwkJCXNpemVfdCB6ZXJvX29mZnNldCA9IGlzaXplICYgKFBBR0VfQ0FDSEVfU0laRSAtIDEpOworCisJCQlpZiAoemVyb19vZmZzZXQpIHsKKwkJCQlpbnQgemVyb3M7CisJCQkJemVyb3MgPSBQQUdFX0NBQ0hFX1NJWkUgLSB6ZXJvX29mZnNldDsKKwkJCQl1c2VycGFnZSA9IGttYXBfYXRvbWljKHBhZ2UsIEtNX1VTRVIwKTsKKwkJCQltZW1zZXQodXNlcnBhZ2UgKyB6ZXJvX29mZnNldCwgMCwgemVyb3MpOworCQkJCWZsdXNoX2RjYWNoZV9wYWdlKHBhZ2UpOworCQkJCWt1bm1hcF9hdG9taWModXNlcnBhZ2UsIEtNX1VTRVIwKTsKKwkJCX0KKwkJfQorCisJCXJldCA9IGJpb19hZGRfcGFnZShjYi0+b3JpZ19iaW8sIHBhZ2UsCisJCQkJICAgUEFHRV9DQUNIRV9TSVpFLCAwKTsKKworCQlpZiAocmV0ID09IFBBR0VfQ0FDSEVfU0laRSkgeworCQkJbnJfcGFnZXMrKzsKKwkJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKKwkJfSBlbHNlIHsKKwkJCXVubG9ja19leHRlbnQodHJlZSwgbGFzdF9vZmZzZXQsIGVuZCwgR0ZQX05PRlMpOworCQkJdW5sb2NrX3BhZ2UocGFnZSk7CisJCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CisJCQlicmVhazsKKwkJfQorbmV4dDoKKwkJbGFzdF9vZmZzZXQgKz0gUEFHRV9DQUNIRV9TSVpFOworCX0KKwlpZiAocGFnZXZlY19jb3VudCgmcHZlYykpCisJCV9fcGFnZXZlY19scnVfYWRkX2ZpbGUoJnB2ZWMpOworCXJldHVybiAwOworfQorCisvKgorICogZm9yIGEgY29tcHJlc3NlZCByZWFkLCB0aGUgYmlvIHdlIGdldCBwYXNzZWQgaGFzIGFsbCB0aGUgaW5vZGUgcGFnZXMKKyAqIGluIGl0LiAgV2UgZG9uJ3QgYWN0dWFsbHkgZG8gSU8gb24gdGhvc2UgcGFnZXMgYnV0IGFsbG9jYXRlIG5ldyBvbmVzCisgKiB0byBob2xkIHRoZSBjb21wcmVzc2VkIHBhZ2VzIG9uIGRpc2suCisgKgorICogYmlvLT5iaV9zZWN0b3IgcG9pbnRzIHRvIHRoZSBjb21wcmVzc2VkIGV4dGVudCBvbiBkaXNrCisgKiBiaW8tPmJpX2lvX3ZlYyBwb2ludHMgdG8gYWxsIG9mIHRoZSBpbm9kZSBwYWdlcworICogYmlvLT5iaV92Y250IGlzIGEgY291bnQgb2YgcGFnZXMKKyAqCisgKiBBZnRlciB0aGUgY29tcHJlc3NlZCBwYWdlcyBhcmUgcmVhZCwgd2UgY29weSB0aGUgYnl0ZXMgaW50byB0aGUKKyAqIGJpbyB3ZSB3ZXJlIHBhc3NlZCBhbmQgdGhlbiBjYWxsIHRoZSBiaW8gZW5kX2lvIGNhbGxzCisgKi8KK2ludCBidHJmc19zdWJtaXRfY29tcHJlc3NlZF9yZWFkKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBiaW8gKmJpbywKKwkJCQkgaW50IG1pcnJvcl9udW0sIHVuc2lnbmVkIGxvbmcgYmlvX2ZsYWdzKQoreworCXN0cnVjdCBleHRlbnRfaW9fdHJlZSAqdHJlZTsKKwlzdHJ1Y3QgZXh0ZW50X21hcF90cmVlICplbV90cmVlOworCXN0cnVjdCBjb21wcmVzc2VkX2JpbyAqY2I7CisJc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QgPSBCVFJGU19JKGlub2RlKS0+cm9vdDsKKwl1bnNpZ25lZCBsb25nIHVuY29tcHJlc3NlZF9sZW4gPSBiaW8tPmJpX3ZjbnQgKiBQQUdFX0NBQ0hFX1NJWkU7CisJdW5zaWduZWQgbG9uZyBjb21wcmVzc2VkX2xlbjsKKwl1bnNpZ25lZCBsb25nIG5yX3BhZ2VzOworCXVuc2lnbmVkIGxvbmcgcGFnZV9pbmRleDsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwlzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2OworCXN0cnVjdCBiaW8gKmNvbXBfYmlvOworCXU2NCBjdXJfZGlza19ieXRlID0gKHU2NCliaW8tPmJpX3NlY3RvciA8PCA5OworCXU2NCBlbV9sZW47CisJdTY0IGVtX3N0YXJ0OworCXN0cnVjdCBleHRlbnRfbWFwICplbTsKKwlpbnQgcmV0OworCXUzMiAqc3VtczsKKworCXRyZWUgPSAmQlRSRlNfSShpbm9kZSktPmlvX3RyZWU7CisJZW1fdHJlZSA9ICZCVFJGU19JKGlub2RlKS0+ZXh0ZW50X3RyZWU7CisKKwkvKiB3ZSBuZWVkIHRoZSBhY3R1YWwgc3RhcnRpbmcgb2Zmc2V0IG9mIHRoaXMgZXh0ZW50IGluIHRoZSBmaWxlICovCisJc3Bpbl9sb2NrKCZlbV90cmVlLT5sb2NrKTsKKwllbSA9IGxvb2t1cF9leHRlbnRfbWFwcGluZyhlbV90cmVlLAorCQkJCSAgIHBhZ2Vfb2Zmc2V0KGJpby0+YmlfaW9fdmVjLT5idl9wYWdlKSwKKwkJCQkgICBQQUdFX0NBQ0hFX1NJWkUpOworCXNwaW5fdW5sb2NrKCZlbV90cmVlLT5sb2NrKTsKKworCWNvbXByZXNzZWRfbGVuID0gZW0tPmJsb2NrX2xlbjsKKwljYiA9IGttYWxsb2MoY29tcHJlc3NlZF9iaW9fc2l6ZShyb290LCBjb21wcmVzc2VkX2xlbiksIEdGUF9OT0ZTKTsKKwlhdG9taWNfc2V0KCZjYi0+cGVuZGluZ19iaW9zLCAwKTsKKwljYi0+ZXJyb3JzID0gMDsKKwljYi0+aW5vZGUgPSBpbm9kZTsKKwljYi0+bWlycm9yX251bSA9IG1pcnJvcl9udW07CisJc3VtcyA9ICZjYi0+c3VtczsKKworCWNiLT5zdGFydCA9IGVtLT5vcmlnX3N0YXJ0OworCWVtX2xlbiA9IGVtLT5sZW47CisJZW1fc3RhcnQgPSBlbS0+c3RhcnQ7CisKKwlmcmVlX2V4dGVudF9tYXAoZW0pOworCWVtID0gTlVMTDsKKworCWNiLT5sZW4gPSB1bmNvbXByZXNzZWRfbGVuOworCWNiLT5jb21wcmVzc2VkX2xlbiA9IGNvbXByZXNzZWRfbGVuOworCWNiLT5vcmlnX2JpbyA9IGJpbzsKKworCW5yX3BhZ2VzID0gKGNvbXByZXNzZWRfbGVuICsgUEFHRV9DQUNIRV9TSVpFIC0gMSkgLworCQkJCSBQQUdFX0NBQ0hFX1NJWkU7CisJY2ItPmNvbXByZXNzZWRfcGFnZXMgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcGFnZSAqKSAqIG5yX3BhZ2VzLAorCQkJCSAgICAgICBHRlBfTk9GUyk7CisJYmRldiA9IEJUUkZTX0koaW5vZGUpLT5yb290LT5mc19pbmZvLT5mc19kZXZpY2VzLT5sYXRlc3RfYmRldjsKKworCWZvciAocGFnZV9pbmRleCA9IDA7IHBhZ2VfaW5kZXggPCBucl9wYWdlczsgcGFnZV9pbmRleCsrKSB7CisJCWNiLT5jb21wcmVzc2VkX3BhZ2VzW3BhZ2VfaW5kZXhdID0gYWxsb2NfcGFnZShHRlBfTk9GUyB8CisJCQkJCQkJICAgICAgX19HRlBfSElHSE1FTSk7CisJfQorCWNiLT5ucl9wYWdlcyA9IG5yX3BhZ2VzOworCisJYWRkX3JhX2Jpb19wYWdlcyhpbm9kZSwgZW1fc3RhcnQgKyBlbV9sZW4sIGNiKTsKKworCS8qIGluY2x1ZGUgYW55IHBhZ2VzIHdlIGFkZGVkIGluIGFkZF9yYS1iaW9fcGFnZXMgKi8KKwl1bmNvbXByZXNzZWRfbGVuID0gYmlvLT5iaV92Y250ICogUEFHRV9DQUNIRV9TSVpFOworCWNiLT5sZW4gPSB1bmNvbXByZXNzZWRfbGVuOworCisJY29tcF9iaW8gPSBjb21wcmVzc2VkX2Jpb19hbGxvYyhiZGV2LCBjdXJfZGlza19ieXRlLCBHRlBfTk9GUyk7CisJY29tcF9iaW8tPmJpX3ByaXZhdGUgPSBjYjsKKwljb21wX2Jpby0+YmlfZW5kX2lvID0gZW5kX2NvbXByZXNzZWRfYmlvX3JlYWQ7CisJYXRvbWljX2luYygmY2ItPnBlbmRpbmdfYmlvcyk7CisKKwlmb3IgKHBhZ2VfaW5kZXggPSAwOyBwYWdlX2luZGV4IDwgbnJfcGFnZXM7IHBhZ2VfaW5kZXgrKykgeworCQlwYWdlID0gY2ItPmNvbXByZXNzZWRfcGFnZXNbcGFnZV9pbmRleF07CisJCXBhZ2UtPm1hcHBpbmcgPSBpbm9kZS0+aV9tYXBwaW5nOworCQlwYWdlLT5pbmRleCA9IGVtX3N0YXJ0ID4+IFBBR0VfQ0FDSEVfU0hJRlQ7CisKKwkJaWYgKGNvbXBfYmlvLT5iaV9zaXplKQorCQkJcmV0ID0gdHJlZS0+b3BzLT5tZXJnZV9iaW9faG9vayhwYWdlLCAwLAorCQkJCQkJCVBBR0VfQ0FDSEVfU0laRSwKKwkJCQkJCQljb21wX2JpbywgMCk7CisJCWVsc2UKKwkJCXJldCA9IDA7CisKKwkJcGFnZS0+bWFwcGluZyA9IE5VTEw7CisJCWlmIChyZXQgfHwgYmlvX2FkZF9wYWdlKGNvbXBfYmlvLCBwYWdlLCBQQUdFX0NBQ0hFX1NJWkUsIDApIDwKKwkJICAgIFBBR0VfQ0FDSEVfU0laRSkgeworCQkJYmlvX2dldChjb21wX2Jpbyk7CisKKwkJCXJldCA9IGJ0cmZzX2Jpb193cV9lbmRfaW8ocm9vdC0+ZnNfaW5mbywgY29tcF9iaW8sIDApOworCQkJQlVHX09OKHJldCk7CisKKwkJCS8qCisJCQkgKiBpbmMgdGhlIGNvdW50IGJlZm9yZSB3ZSBzdWJtaXQgdGhlIGJpbyBzbworCQkJICogd2Uga25vdyB0aGUgZW5kIElPIGhhbmRsZXIgd29uJ3QgaGFwcGVuIGJlZm9yZQorCQkJICogd2UgaW5jIHRoZSBjb3VudC4gIE90aGVyd2lzZSwgdGhlIGNiIG1pZ2h0IGdldAorCQkJICogZnJlZWQgYmVmb3JlIHdlJ3JlIGRvbmUgc2V0dGluZyBpdCB1cAorCQkJICovCisJCQlhdG9taWNfaW5jKCZjYi0+cGVuZGluZ19iaW9zKTsKKworCQkJaWYgKCFidHJmc190ZXN0X2ZsYWcoaW5vZGUsIE5PREFUQVNVTSkpIHsKKwkJCQlidHJmc19sb29rdXBfYmlvX3N1bXMocm9vdCwgaW5vZGUsIGNvbXBfYmlvLAorCQkJCQkJICAgICAgc3Vtcyk7CisJCQl9CisJCQlzdW1zICs9IChjb21wX2Jpby0+Ymlfc2l6ZSArIHJvb3QtPnNlY3RvcnNpemUgLSAxKSAvCisJCQkJcm9vdC0+c2VjdG9yc2l6ZTsKKworCQkJcmV0ID0gYnRyZnNfbWFwX2Jpbyhyb290LCBSRUFELCBjb21wX2JpbywKKwkJCQkJICAgIG1pcnJvcl9udW0sIDApOworCQkJQlVHX09OKHJldCk7CisKKwkJCWJpb19wdXQoY29tcF9iaW8pOworCisJCQljb21wX2JpbyA9IGNvbXByZXNzZWRfYmlvX2FsbG9jKGJkZXYsIGN1cl9kaXNrX2J5dGUsCisJCQkJCQkJR0ZQX05PRlMpOworCQkJY29tcF9iaW8tPmJpX3ByaXZhdGUgPSBjYjsKKwkJCWNvbXBfYmlvLT5iaV9lbmRfaW8gPSBlbmRfY29tcHJlc3NlZF9iaW9fcmVhZDsKKworCQkJYmlvX2FkZF9wYWdlKGNvbXBfYmlvLCBwYWdlLCBQQUdFX0NBQ0hFX1NJWkUsIDApOworCQl9CisJCWN1cl9kaXNrX2J5dGUgKz0gUEFHRV9DQUNIRV9TSVpFOworCX0KKwliaW9fZ2V0KGNvbXBfYmlvKTsKKworCXJldCA9IGJ0cmZzX2Jpb193cV9lbmRfaW8ocm9vdC0+ZnNfaW5mbywgY29tcF9iaW8sIDApOworCUJVR19PTihyZXQpOworCisJaWYgKCFidHJmc190ZXN0X2ZsYWcoaW5vZGUsIE5PREFUQVNVTSkpCisJCWJ0cmZzX2xvb2t1cF9iaW9fc3Vtcyhyb290LCBpbm9kZSwgY29tcF9iaW8sIHN1bXMpOworCisJcmV0ID0gYnRyZnNfbWFwX2Jpbyhyb290LCBSRUFELCBjb21wX2JpbywgbWlycm9yX251bSwgMCk7CisJQlVHX09OKHJldCk7CisKKwliaW9fcHV0KGNvbXBfYmlvKTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2ZzL2J0cmZzL2NvbXByZXNzaW9uLmggYi9mcy9idHJmcy9jb21wcmVzc2lvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyMWY1YjQKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9idHJmcy9jb21wcmVzc2lvbi5oCkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggT3JhY2xlLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgdjIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKKyAqIEJvc3RvbiwgTUEgMDIxMTEwLTEzMDcsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fQlRSRlNfQ09NUFJFU1NJT05fCisjZGVmaW5lIF9fQlRSRlNfQ09NUFJFU1NJT05fCisKK2ludCBidHJmc196bGliX2RlY29tcHJlc3ModW5zaWduZWQgY2hhciAqZGF0YV9pbiwKKwkJCSAgc3RydWN0IHBhZ2UgKmRlc3RfcGFnZSwKKwkJCSAgdW5zaWduZWQgbG9uZyBzdGFydF9ieXRlLAorCQkJICBzaXplX3Qgc3JjbGVuLCBzaXplX3QgZGVzdGxlbik7CitpbnQgYnRyZnNfemxpYl9jb21wcmVzc19wYWdlcyhzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywKKwkJCSAgICAgIHU2NCBzdGFydCwgdW5zaWduZWQgbG9uZyBsZW4sCisJCQkgICAgICBzdHJ1Y3QgcGFnZSAqKnBhZ2VzLAorCQkJICAgICAgdW5zaWduZWQgbG9uZyBucl9kZXN0X3BhZ2VzLAorCQkJICAgICAgdW5zaWduZWQgbG9uZyAqb3V0X3BhZ2VzLAorCQkJICAgICAgdW5zaWduZWQgbG9uZyAqdG90YWxfaW4sCisJCQkgICAgICB1bnNpZ25lZCBsb25nICp0b3RhbF9vdXQsCisJCQkgICAgICB1bnNpZ25lZCBsb25nIG1heF9vdXQpOworaW50IGJ0cmZzX3psaWJfZGVjb21wcmVzc19iaW92ZWMoc3RydWN0IHBhZ2UgKipwYWdlc19pbiwKKwkJCSAgICAgIHU2NCBkaXNrX3N0YXJ0LAorCQkJICAgICAgc3RydWN0IGJpb192ZWMgKmJ2ZWMsCisJCQkgICAgICBpbnQgdmNudCwKKwkJCSAgICAgIHNpemVfdCBzcmNsZW4pOwordm9pZCBidHJmc196bGliX2V4aXQodm9pZCk7CitpbnQgYnRyZnNfc3VibWl0X2NvbXByZXNzZWRfd3JpdGUoc3RydWN0IGlub2RlICppbm9kZSwgdTY0IHN0YXJ0LAorCQkJCSAgdW5zaWduZWQgbG9uZyBsZW4sIHU2NCBkaXNrX3N0YXJ0LAorCQkJCSAgdW5zaWduZWQgbG9uZyBjb21wcmVzc2VkX2xlbiwKKwkJCQkgIHN0cnVjdCBwYWdlICoqY29tcHJlc3NlZF9wYWdlcywKKwkJCQkgIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMpOworaW50IGJ0cmZzX3N1Ym1pdF9jb21wcmVzc2VkX3JlYWQoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGJpbyAqYmlvLAorCQkJCSBpbnQgbWlycm9yX251bSwgdW5zaWduZWQgbG9uZyBiaW9fZmxhZ3MpOworI2VuZGlmCmRpZmYgLS1naXQgYS9mcy9idHJmcy9jcmMzMmMuaCBiL2ZzL2J0cmZzL2NyYzMyYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlMWIzZGUKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9idHJmcy9jcmMzMmMuaApAQCAtMCwwICsxLDI5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IE9yYWNsZS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIHYyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCisgKiBCb3N0b24sIE1BIDAyMTExMC0xMzA3LCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0JUUkZTX0NSQzMyQ19fCisjZGVmaW5lIF9fQlRSRlNfQ1JDMzJDX18KKyNpbmNsdWRlIDxsaW51eC9jcmMzMmMuaD4KKworLyoKKyAqIHRoaXMgZmlsZSB1c2VkIHRvIGRvIG1vcmUgZm9yIHNlbGVjdGluZyB0aGUgSFcgdmVyc2lvbiBvZiBjcmMzMmMsCisgKiBwZXJoYXBzIGl0IHdpbGwgb25lIGRheSBhZ2FpbiBzb29uLgorICovCisjZGVmaW5lIGJ0cmZzX2NyYzMyYyhzZWVkLCBkYXRhLCBsZW5ndGgpIGNyYzMyYyhzZWVkLCBkYXRhLCBsZW5ndGgpCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvZnMvYnRyZnMvY3RyZWUuYyBiL2ZzL2J0cmZzL2N0cmVlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWU0NmMwNwotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2J0cmZzL2N0cmVlLmMKQEAgLTAsMCArMSwzOTUzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LDIwMDggT3JhY2xlLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgdjIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKKyAqIEJvc3RvbiwgTUEgMDIxMTEwLTEzMDcsIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlICJjdHJlZS5oIgorI2luY2x1ZGUgImRpc2staW8uaCIKKyNpbmNsdWRlICJ0cmFuc2FjdGlvbi5oIgorI2luY2x1ZGUgInByaW50LXRyZWUuaCIKKyNpbmNsdWRlICJsb2NraW5nLmgiCisKK3N0YXRpYyBpbnQgc3BsaXRfbm9kZShzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywgc3RydWN0IGJ0cmZzX3Jvb3QKKwkJICAgICAgKnJvb3QsIHN0cnVjdCBidHJmc19wYXRoICpwYXRoLCBpbnQgbGV2ZWwpOworc3RhdGljIGludCBzcGxpdF9sZWFmKHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLCBzdHJ1Y3QgYnRyZnNfcm9vdAorCQkgICAgICAqcm9vdCwgc3RydWN0IGJ0cmZzX2tleSAqaW5zX2tleSwKKwkJICAgICAgc3RydWN0IGJ0cmZzX3BhdGggKnBhdGgsIGludCBkYXRhX3NpemUsIGludCBleHRlbmQpOworc3RhdGljIGludCBwdXNoX25vZGVfbGVmdChzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKKwkJCSAgc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsIHN0cnVjdCBleHRlbnRfYnVmZmVyICpkc3QsCisJCQkgIHN0cnVjdCBleHRlbnRfYnVmZmVyICpzcmMsIGludCBlbXB0eSk7CitzdGF0aWMgaW50IGJhbGFuY2Vfbm9kZV9yaWdodChzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKKwkJCSAgICAgIHN0cnVjdCBidHJmc19yb290ICpyb290LAorCQkJICAgICAgc3RydWN0IGV4dGVudF9idWZmZXIgKmRzdF9idWYsCisJCQkgICAgICBzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqc3JjX2J1Zik7CitzdGF0aWMgaW50IGRlbF9wdHIoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsIHN0cnVjdCBidHJmc19yb290ICpyb290LAorCQkgICBzdHJ1Y3QgYnRyZnNfcGF0aCAqcGF0aCwgaW50IGxldmVsLCBpbnQgc2xvdCk7CisKK2lubGluZSB2b2lkIGJ0cmZzX2luaXRfcGF0aChzdHJ1Y3QgYnRyZnNfcGF0aCAqcCkKK3sKKwltZW1zZXQocCwgMCwgc2l6ZW9mKCpwKSk7Cit9CisKK3N0cnVjdCBidHJmc19wYXRoICpidHJmc19hbGxvY19wYXRoKHZvaWQpCit7CisJc3RydWN0IGJ0cmZzX3BhdGggKnBhdGg7CisJcGF0aCA9IGttZW1fY2FjaGVfYWxsb2MoYnRyZnNfcGF0aF9jYWNoZXAsIEdGUF9OT0ZTKTsKKwlpZiAocGF0aCkgeworCQlidHJmc19pbml0X3BhdGgocGF0aCk7CisJCXBhdGgtPnJlYWRhID0gMTsKKwl9CisJcmV0dXJuIHBhdGg7Cit9CisKKy8qIHRoaXMgYWxzbyByZWxlYXNlcyB0aGUgcGF0aCAqLwordm9pZCBidHJmc19mcmVlX3BhdGgoc3RydWN0IGJ0cmZzX3BhdGggKnApCit7CisJYnRyZnNfcmVsZWFzZV9wYXRoKE5VTEwsIHApOworCWttZW1fY2FjaGVfZnJlZShidHJmc19wYXRoX2NhY2hlcCwgcCk7Cit9CisKKy8qCisgKiBwYXRoIHJlbGVhc2UgZHJvcHMgcmVmZXJlbmNlcyBvbiB0aGUgZXh0ZW50IGJ1ZmZlcnMgaW4gdGhlIHBhdGgKKyAqIGFuZCBpdCBkcm9wcyBhbnkgbG9ja3MgaGVsZCBieSB0aGlzIHBhdGgKKyAqCisgKiBJdCBpcyBzYWZlIHRvIGNhbGwgdGhpcyBvbiBwYXRocyB0aGF0IG5vIGxvY2tzIG9yIGV4dGVudCBidWZmZXJzIGhlbGQuCisgKi8KK25vaW5saW5lIHZvaWQgYnRyZnNfcmVsZWFzZV9wYXRoKHN0cnVjdCBidHJmc19yb290ICpyb290LCBzdHJ1Y3QgYnRyZnNfcGF0aCAqcCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBCVFJGU19NQVhfTEVWRUw7IGkrKykgeworCQlwLT5zbG90c1tpXSA9IDA7CisJCWlmICghcC0+bm9kZXNbaV0pCisJCQljb250aW51ZTsKKwkJaWYgKHAtPmxvY2tzW2ldKSB7CisJCQlidHJmc190cmVlX3VubG9jayhwLT5ub2Rlc1tpXSk7CisJCQlwLT5sb2Nrc1tpXSA9IDA7CisJCX0KKwkJZnJlZV9leHRlbnRfYnVmZmVyKHAtPm5vZGVzW2ldKTsKKwkJcC0+bm9kZXNbaV0gPSBOVUxMOworCX0KK30KKworLyoKKyAqIHNhZmVseSBnZXRzIGEgcmVmZXJlbmNlIG9uIHRoZSByb290IG5vZGUgb2YgYSB0cmVlLiAgQSBsb2NrCisgKiBpcyBub3QgdGFrZW4sIHNvIGEgY29uY3VycmVudCB3cml0ZXIgbWF5IHB1dCBhIGRpZmZlcmVudCBub2RlCisgKiBhdCB0aGUgcm9vdCBvZiB0aGUgdHJlZS4gIFNlZSBidHJmc19sb2NrX3Jvb3Rfbm9kZSBmb3IgdGhlCisgKiBsb29waW5nIHJlcXVpcmVkLgorICoKKyAqIFRoZSBleHRlbnQgYnVmZmVyIHJldHVybmVkIGJ5IHRoaXMgaGFzIGEgcmVmZXJlbmNlIHRha2VuLCBzbworICogaXQgd29uJ3QgZGlzYXBwZWFyLiAgSXQgbWF5IHN0b3AgYmVpbmcgdGhlIHJvb3Qgb2YgdGhlIHRyZWUKKyAqIGF0IGFueSB0aW1lIGJlY2F1c2UgdGhlcmUgYXJlIG5vIGxvY2tzIGhlbGQuCisgKi8KK3N0cnVjdCBleHRlbnRfYnVmZmVyICpidHJmc19yb290X25vZGUoc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QpCit7CisJc3RydWN0IGV4dGVudF9idWZmZXIgKmViOworCXNwaW5fbG9jaygmcm9vdC0+bm9kZV9sb2NrKTsKKwllYiA9IHJvb3QtPm5vZGU7CisJZXh0ZW50X2J1ZmZlcl9nZXQoZWIpOworCXNwaW5fdW5sb2NrKCZyb290LT5ub2RlX2xvY2spOworCXJldHVybiBlYjsKK30KKworLyogbG9vcCBhcm91bmQgdGFraW5nIHJlZmVyZW5jZXMgb24gYW5kIGxvY2tpbmcgdGhlIHJvb3Qgbm9kZSBvZiB0aGUKKyAqIHRyZWUgdW50aWwgeW91IGVuZCB1cCB3aXRoIGEgbG9jayBvbiB0aGUgcm9vdC4gIEEgbG9ja2VkIGJ1ZmZlcgorICogaXMgcmV0dXJuZWQsIHdpdGggYSByZWZlcmVuY2UgaGVsZC4KKyAqLworc3RydWN0IGV4dGVudF9idWZmZXIgKmJ0cmZzX2xvY2tfcm9vdF9ub2RlKHN0cnVjdCBidHJmc19yb290ICpyb290KQoreworCXN0cnVjdCBleHRlbnRfYnVmZmVyICplYjsKKworCXdoaWxlICgxKSB7CisJCWViID0gYnRyZnNfcm9vdF9ub2RlKHJvb3QpOworCQlidHJmc190cmVlX2xvY2soZWIpOworCisJCXNwaW5fbG9jaygmcm9vdC0+bm9kZV9sb2NrKTsKKwkJaWYgKGViID09IHJvb3QtPm5vZGUpIHsKKwkJCXNwaW5fdW5sb2NrKCZyb290LT5ub2RlX2xvY2spOworCQkJYnJlYWs7CisJCX0KKwkJc3Bpbl91bmxvY2soJnJvb3QtPm5vZGVfbG9jayk7CisKKwkJYnRyZnNfdHJlZV91bmxvY2soZWIpOworCQlmcmVlX2V4dGVudF9idWZmZXIoZWIpOworCX0KKwlyZXR1cm4gZWI7Cit9CisKKy8qIGNvd29ubHkgcm9vdCAoZXZlcnl0aGluZyBub3QgYSByZWZlcmVuY2UgY291bnRlZCBjb3cgc3Vidm9sdW1lKSwganVzdCBnZXQKKyAqIHB1dCBvbnRvIGEgc2ltcGxlIGRpcnR5IGxpc3QuICB0cmFuc2FjdGlvbi5jIHdhbGtzIHRoaXMgdG8gbWFrZSBzdXJlIHRoZXkKKyAqIGdldCBwcm9wZXJseSB1cGRhdGVkIG9uIGRpc2suCisgKi8KK3N0YXRpYyB2b2lkIGFkZF9yb290X3RvX2RpcnR5X2xpc3Qoc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QpCit7CisJaWYgKHJvb3QtPnRyYWNrX2RpcnR5ICYmIGxpc3RfZW1wdHkoJnJvb3QtPmRpcnR5X2xpc3QpKSB7CisJCWxpc3RfYWRkKCZyb290LT5kaXJ0eV9saXN0LAorCQkJICZyb290LT5mc19pbmZvLT5kaXJ0eV9jb3dvbmx5X3Jvb3RzKTsKKwl9Cit9CisKKy8qCisgKiB1c2VkIGJ5IHNuYXBzaG90IGNyZWF0aW9uIHRvIG1ha2UgYSBjb3B5IG9mIGEgcm9vdCBmb3IgYSB0cmVlIHdpdGgKKyAqIGEgZ2l2ZW4gb2JqZWN0aWQuICBUaGUgYnVmZmVyIHdpdGggdGhlIG5ldyByb290IG5vZGUgaXMgcmV0dXJuZWQgaW4KKyAqIGNvd19yZXQsIGFuZCB0aGlzIGZ1bmMgcmV0dXJucyB6ZXJvIG9uIHN1Y2Nlc3Mgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlLgorICovCitpbnQgYnRyZnNfY29weV9yb290KHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAorCQkgICAgICBzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwKKwkJICAgICAgc3RydWN0IGV4dGVudF9idWZmZXIgKmJ1ZiwKKwkJICAgICAgc3RydWN0IGV4dGVudF9idWZmZXIgKipjb3dfcmV0LCB1NjQgbmV3X3Jvb3Rfb2JqZWN0aWQpCit7CisJc3RydWN0IGV4dGVudF9idWZmZXIgKmNvdzsKKwl1MzIgbnJpdGVtczsKKwlpbnQgcmV0ID0gMDsKKwlpbnQgbGV2ZWw7CisJc3RydWN0IGJ0cmZzX3Jvb3QgKm5ld19yb290OworCisJbmV3X3Jvb3QgPSBrbWFsbG9jKHNpemVvZigqbmV3X3Jvb3QpLCBHRlBfTk9GUyk7CisJaWYgKCFuZXdfcm9vdCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwltZW1jcHkobmV3X3Jvb3QsIHJvb3QsIHNpemVvZigqbmV3X3Jvb3QpKTsKKwluZXdfcm9vdC0+cm9vdF9rZXkub2JqZWN0aWQgPSBuZXdfcm9vdF9vYmplY3RpZDsKKworCVdBUk5fT04ocm9vdC0+cmVmX2Nvd3MgJiYgdHJhbnMtPnRyYW5zaWQgIT0KKwkJcm9vdC0+ZnNfaW5mby0+cnVubmluZ190cmFuc2FjdGlvbi0+dHJhbnNpZCk7CisJV0FSTl9PTihyb290LT5yZWZfY293cyAmJiB0cmFucy0+dHJhbnNpZCAhPSByb290LT5sYXN0X3RyYW5zKTsKKworCWxldmVsID0gYnRyZnNfaGVhZGVyX2xldmVsKGJ1Zik7CisJbnJpdGVtcyA9IGJ0cmZzX2hlYWRlcl9ucml0ZW1zKGJ1Zik7CisKKwljb3cgPSBidHJmc19hbGxvY19mcmVlX2Jsb2NrKHRyYW5zLCBuZXdfcm9vdCwgYnVmLT5sZW4sIDAsCisJCQkJICAgICBuZXdfcm9vdF9vYmplY3RpZCwgdHJhbnMtPnRyYW5zaWQsCisJCQkJICAgICBsZXZlbCwgYnVmLT5zdGFydCwgMCk7CisJaWYgKElTX0VSUihjb3cpKSB7CisJCWtmcmVlKG5ld19yb290KTsKKwkJcmV0dXJuIFBUUl9FUlIoY293KTsKKwl9CisKKwljb3B5X2V4dGVudF9idWZmZXIoY293LCBidWYsIDAsIDAsIGNvdy0+bGVuKTsKKwlidHJmc19zZXRfaGVhZGVyX2J5dGVucihjb3csIGNvdy0+c3RhcnQpOworCWJ0cmZzX3NldF9oZWFkZXJfZ2VuZXJhdGlvbihjb3csIHRyYW5zLT50cmFuc2lkKTsKKwlidHJmc19zZXRfaGVhZGVyX293bmVyKGNvdywgbmV3X3Jvb3Rfb2JqZWN0aWQpOworCWJ0cmZzX2NsZWFyX2hlYWRlcl9mbGFnKGNvdywgQlRSRlNfSEVBREVSX0ZMQUdfV1JJVFRFTik7CisKKwl3cml0ZV9leHRlbnRfYnVmZmVyKGNvdywgcm9vdC0+ZnNfaW5mby0+ZnNpZCwKKwkJCSAgICAodW5zaWduZWQgbG9uZylidHJmc19oZWFkZXJfZnNpZChjb3cpLAorCQkJICAgIEJUUkZTX0ZTSURfU0laRSk7CisKKwlXQVJOX09OKGJ0cmZzX2hlYWRlcl9nZW5lcmF0aW9uKGJ1ZikgPiB0cmFucy0+dHJhbnNpZCk7CisJcmV0ID0gYnRyZnNfaW5jX3JlZih0cmFucywgbmV3X3Jvb3QsIGJ1ZiwgY293LCBOVUxMKTsKKwlrZnJlZShuZXdfcm9vdCk7CisKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJYnRyZnNfbWFya19idWZmZXJfZGlydHkoY293KTsKKwkqY293X3JldCA9IGNvdzsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGRvZXMgdGhlIGRpcnR5IHdvcmsgaW4gY293IG9mIGEgc2luZ2xlIGJsb2NrLiAgVGhlIHBhcmVudCBibG9jayAoaWYKKyAqIHN1cHBsaWVkKSBpcyB1cGRhdGVkIHRvIHBvaW50IHRvIHRoZSBuZXcgY293IGNvcHkuICBUaGUgbmV3IGJ1ZmZlciBpcyBtYXJrZWQKKyAqIGRpcnR5IGFuZCByZXR1cm5lZCBsb2NrZWQuICBJZiB5b3UgbW9kaWZ5IHRoZSBibG9jayBpdCBuZWVkcyB0byBiZSBtYXJrZWQKKyAqIGRpcnR5IGFnYWluLgorICoKKyAqIHNlYXJjaF9zdGFydCAtLSBhbiBhbGxvY2F0aW9uIGhpbnQgZm9yIHRoZSBuZXcgYmxvY2sKKyAqCisgKiBlbXB0eV9zaXplIC0tIGEgaGludCB0aGF0IHlvdSBwbGFuIG9uIGRvaW5nIG1vcmUgY293LiAgVGhpcyBpcyB0aGUgc2l6ZSBpbgorICogYnl0ZXMgdGhlIGFsbG9jYXRvciBzaG91bGQgdHJ5IHRvIGZpbmQgZnJlZSBuZXh0IHRvIHRoZSBibG9jayBpdCByZXR1cm5zLgorICogVGhpcyBpcyBqdXN0IGEgaGludCBhbmQgbWF5IGJlIGlnbm9yZWQgYnkgdGhlIGFsbG9jYXRvci4KKyAqCisgKiBwcmVhbGxvY19kZXN0IC0tIGlmIHlvdSBoYXZlIGFscmVhZHkgcmVzZXJ2ZWQgYSBkZXN0aW5hdGlvbiBmb3IgdGhlIGNvdywKKyAqIHRoaXMgdXNlcyB0aGF0IGJsb2NrIGluc3RlYWQgb2YgYWxsb2NhdGluZyBhIG5ldyBvbmUuCisgKiBidHJmc19hbGxvY19yZXNlcnZlZF9leHRlbnQgaXMgdXNlZCB0byBmaW5pc2ggdGhlIGFsbG9jYXRpb24uCisgKi8KK3N0YXRpYyBub2lubGluZSBpbnQgX19idHJmc19jb3dfYmxvY2soc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCisJCQkgICAgIHN0cnVjdCBidHJmc19yb290ICpyb290LAorCQkJICAgICBzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqYnVmLAorCQkJICAgICBzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqcGFyZW50LCBpbnQgcGFyZW50X3Nsb3QsCisJCQkgICAgIHN0cnVjdCBleHRlbnRfYnVmZmVyICoqY293X3JldCwKKwkJCSAgICAgdTY0IHNlYXJjaF9zdGFydCwgdTY0IGVtcHR5X3NpemUsCisJCQkgICAgIHU2NCBwcmVhbGxvY19kZXN0KQoreworCXU2NCBwYXJlbnRfc3RhcnQ7CisJc3RydWN0IGV4dGVudF9idWZmZXIgKmNvdzsKKwl1MzIgbnJpdGVtczsKKwlpbnQgcmV0ID0gMDsKKwlpbnQgbGV2ZWw7CisJaW50IHVubG9ja19vcmlnID0gMDsKKworCWlmICgqY293X3JldCA9PSBidWYpCisJCXVubG9ja19vcmlnID0gMTsKKworCVdBUk5fT04oIWJ0cmZzX3RyZWVfbG9ja2VkKGJ1ZikpOworCisJaWYgKHBhcmVudCkKKwkJcGFyZW50X3N0YXJ0ID0gcGFyZW50LT5zdGFydDsKKwllbHNlCisJCXBhcmVudF9zdGFydCA9IDA7CisKKwlXQVJOX09OKHJvb3QtPnJlZl9jb3dzICYmIHRyYW5zLT50cmFuc2lkICE9CisJCXJvb3QtPmZzX2luZm8tPnJ1bm5pbmdfdHJhbnNhY3Rpb24tPnRyYW5zaWQpOworCVdBUk5fT04ocm9vdC0+cmVmX2Nvd3MgJiYgdHJhbnMtPnRyYW5zaWQgIT0gcm9vdC0+bGFzdF90cmFucyk7CisKKwlsZXZlbCA9IGJ0cmZzX2hlYWRlcl9sZXZlbChidWYpOworCW5yaXRlbXMgPSBidHJmc19oZWFkZXJfbnJpdGVtcyhidWYpOworCisJaWYgKHByZWFsbG9jX2Rlc3QpIHsKKwkJc3RydWN0IGJ0cmZzX2tleSBpbnM7CisKKwkJaW5zLm9iamVjdGlkID0gcHJlYWxsb2NfZGVzdDsKKwkJaW5zLm9mZnNldCA9IGJ1Zi0+bGVuOworCQlpbnMudHlwZSA9IEJUUkZTX0VYVEVOVF9JVEVNX0tFWTsKKworCQlyZXQgPSBidHJmc19hbGxvY19yZXNlcnZlZF9leHRlbnQodHJhbnMsIHJvb3QsIHBhcmVudF9zdGFydCwKKwkJCQkJCSAgcm9vdC0+cm9vdF9rZXkub2JqZWN0aWQsCisJCQkJCQkgIHRyYW5zLT50cmFuc2lkLCBsZXZlbCwgJmlucyk7CisJCUJVR19PTihyZXQpOworCQljb3cgPSBidHJmc19pbml0X25ld19idWZmZXIodHJhbnMsIHJvb3QsIHByZWFsbG9jX2Rlc3QsCisJCQkJCSAgICBidWYtPmxlbik7CisJfSBlbHNlIHsKKwkJY293ID0gYnRyZnNfYWxsb2NfZnJlZV9ibG9jayh0cmFucywgcm9vdCwgYnVmLT5sZW4sCisJCQkJCSAgICAgcGFyZW50X3N0YXJ0LAorCQkJCQkgICAgIHJvb3QtPnJvb3Rfa2V5Lm9iamVjdGlkLAorCQkJCQkgICAgIHRyYW5zLT50cmFuc2lkLCBsZXZlbCwKKwkJCQkJICAgICBzZWFyY2hfc3RhcnQsIGVtcHR5X3NpemUpOworCX0KKwlpZiAoSVNfRVJSKGNvdykpCisJCXJldHVybiBQVFJfRVJSKGNvdyk7CisKKwljb3B5X2V4dGVudF9idWZmZXIoY293LCBidWYsIDAsIDAsIGNvdy0+bGVuKTsKKwlidHJmc19zZXRfaGVhZGVyX2J5dGVucihjb3csIGNvdy0+c3RhcnQpOworCWJ0cmZzX3NldF9oZWFkZXJfZ2VuZXJhdGlvbihjb3csIHRyYW5zLT50cmFuc2lkKTsKKwlidHJmc19zZXRfaGVhZGVyX293bmVyKGNvdywgcm9vdC0+cm9vdF9rZXkub2JqZWN0aWQpOworCWJ0cmZzX2NsZWFyX2hlYWRlcl9mbGFnKGNvdywgQlRSRlNfSEVBREVSX0ZMQUdfV1JJVFRFTik7CisKKwl3cml0ZV9leHRlbnRfYnVmZmVyKGNvdywgcm9vdC0+ZnNfaW5mby0+ZnNpZCwKKwkJCSAgICAodW5zaWduZWQgbG9uZylidHJmc19oZWFkZXJfZnNpZChjb3cpLAorCQkJICAgIEJUUkZTX0ZTSURfU0laRSk7CisKKwlXQVJOX09OKGJ0cmZzX2hlYWRlcl9nZW5lcmF0aW9uKGJ1ZikgPiB0cmFucy0+dHJhbnNpZCk7CisJaWYgKGJ0cmZzX2hlYWRlcl9nZW5lcmF0aW9uKGJ1ZikgIT0gdHJhbnMtPnRyYW5zaWQpIHsKKwkJdTMyIG5yX2V4dGVudHM7CisJCXJldCA9IGJ0cmZzX2luY19yZWYodHJhbnMsIHJvb3QsIGJ1ZiwgY293LCAmbnJfZXh0ZW50cyk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCisJCXJldCA9IGJ0cmZzX2NhY2hlX3JlZih0cmFucywgcm9vdCwgYnVmLCBucl9leHRlbnRzKTsKKwkJV0FSTl9PTihyZXQpOworCX0gZWxzZSBpZiAoYnRyZnNfaGVhZGVyX293bmVyKGJ1ZikgPT0gQlRSRlNfVFJFRV9SRUxPQ19PQkpFQ1RJRCkgeworCQkvKgorCQkgKiBUaGVyZSBhcmUgb25seSB0d28gcGxhY2VzIHRoYXQgY2FuIGRyb3AgcmVmZXJlbmNlIHRvCisJCSAqIHRyZWUgYmxvY2tzIG93bmVkIGJ5IGxpdmluZyByZWxvYyB0cmVlcywgb25lIGlzIGhlcmUsCisJCSAqIHRoZSBvdGhlciBwbGFjZSBpcyBidHJmc19kcm9wX3N1YnRyZWUuIEluIGJvdGggcGxhY2VzLAorCQkgKiB3ZSBjaGVjayByZWZlcmVuY2UgY291bnQgd2hpbGUgdHJlZSBibG9jayBpcyBsb2NrZWQuCisJCSAqIEZ1cnRoZXJtb3JlLCBpZiByZWZlcmVuY2UgY291bnQgaXMgb25lLCBpdCB3b24ndCBnZXQKKwkJICogaW5jcmVhc2VkIGJ5IHNvbWVvbmUgZWxzZS4KKwkJICovCisJCXUzMiByZWZzOworCQlyZXQgPSBidHJmc19sb29rdXBfZXh0ZW50X3JlZih0cmFucywgcm9vdCwgYnVmLT5zdGFydCwKKwkJCQkJICAgICAgYnVmLT5sZW4sICZyZWZzKTsKKwkJQlVHX09OKHJldCk7CisJCWlmIChyZWZzID09IDEpIHsKKwkJCXJldCA9IGJ0cmZzX3VwZGF0ZV9yZWYodHJhbnMsIHJvb3QsIGJ1ZiwgY293LAorCQkJCQkgICAgICAgMCwgbnJpdGVtcyk7CisJCQljbGVhbl90cmVlX2Jsb2NrKHRyYW5zLCByb290LCBidWYpOworCQl9IGVsc2UgeworCQkJcmV0ID0gYnRyZnNfaW5jX3JlZih0cmFucywgcm9vdCwgYnVmLCBjb3csIE5VTEwpOworCQl9CisJCUJVR19PTihyZXQpOworCX0gZWxzZSB7CisJCXJldCA9IGJ0cmZzX3VwZGF0ZV9yZWYodHJhbnMsIHJvb3QsIGJ1ZiwgY293LCAwLCBucml0ZW1zKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJCWNsZWFuX3RyZWVfYmxvY2sodHJhbnMsIHJvb3QsIGJ1Zik7CisJfQorCisJaWYgKHJvb3QtPnJvb3Rfa2V5Lm9iamVjdGlkID09IEJUUkZTX1RSRUVfUkVMT0NfT0JKRUNUSUQpIHsKKwkJcmV0ID0gYnRyZnNfcmVsb2NfdHJlZV9jYWNoZV9yZWYodHJhbnMsIHJvb3QsIGNvdywgYnVmLT5zdGFydCk7CisJCVdBUk5fT04ocmV0KTsKKwl9CisKKwlpZiAoYnVmID09IHJvb3QtPm5vZGUpIHsKKwkJV0FSTl9PTihwYXJlbnQgJiYgcGFyZW50ICE9IGJ1Zik7CisKKwkJc3Bpbl9sb2NrKCZyb290LT5ub2RlX2xvY2spOworCQlyb290LT5ub2RlID0gY293OworCQlleHRlbnRfYnVmZmVyX2dldChjb3cpOworCQlzcGluX3VubG9jaygmcm9vdC0+bm9kZV9sb2NrKTsKKworCQlpZiAoYnVmICE9IHJvb3QtPmNvbW1pdF9yb290KSB7CisJCQlidHJmc19mcmVlX2V4dGVudCh0cmFucywgcm9vdCwgYnVmLT5zdGFydCwKKwkJCQkJICBidWYtPmxlbiwgYnVmLT5zdGFydCwKKwkJCQkJICByb290LT5yb290X2tleS5vYmplY3RpZCwKKwkJCQkJICBidHJmc19oZWFkZXJfZ2VuZXJhdGlvbihidWYpLAorCQkJCQkgIGxldmVsLCAxKTsKKwkJfQorCQlmcmVlX2V4dGVudF9idWZmZXIoYnVmKTsKKwkJYWRkX3Jvb3RfdG9fZGlydHlfbGlzdChyb290KTsKKwl9IGVsc2UgeworCQlidHJmc19zZXRfbm9kZV9ibG9ja3B0cihwYXJlbnQsIHBhcmVudF9zbG90LAorCQkJCQljb3ctPnN0YXJ0KTsKKwkJV0FSTl9PTih0cmFucy0+dHJhbnNpZCA9PSAwKTsKKwkJYnRyZnNfc2V0X25vZGVfcHRyX2dlbmVyYXRpb24ocGFyZW50LCBwYXJlbnRfc2xvdCwKKwkJCQkJICAgICAgdHJhbnMtPnRyYW5zaWQpOworCQlidHJmc19tYXJrX2J1ZmZlcl9kaXJ0eShwYXJlbnQpOworCQlXQVJOX09OKGJ0cmZzX2hlYWRlcl9nZW5lcmF0aW9uKHBhcmVudCkgIT0gdHJhbnMtPnRyYW5zaWQpOworCQlidHJmc19mcmVlX2V4dGVudCh0cmFucywgcm9vdCwgYnVmLT5zdGFydCwgYnVmLT5sZW4sCisJCQkJICBwYXJlbnRfc3RhcnQsIGJ0cmZzX2hlYWRlcl9vd25lcihwYXJlbnQpLAorCQkJCSAgYnRyZnNfaGVhZGVyX2dlbmVyYXRpb24ocGFyZW50KSwgbGV2ZWwsIDEpOworCX0KKwlpZiAodW5sb2NrX29yaWcpCisJCWJ0cmZzX3RyZWVfdW5sb2NrKGJ1Zik7CisJZnJlZV9leHRlbnRfYnVmZmVyKGJ1Zik7CisJYnRyZnNfbWFya19idWZmZXJfZGlydHkoY293KTsKKwkqY293X3JldCA9IGNvdzsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGNvd3MgYSBzaW5nbGUgYmxvY2ssIHNlZSBfX2J0cmZzX2Nvd19ibG9jayBmb3IgdGhlIHJlYWwgd29yay4KKyAqIFRoaXMgdmVyc2lvbiBvZiBpdCBoYXMgZXh0cmEgY2hlY2tzIHNvIHRoYXQgYSBibG9jayBpc24ndCBjb3cnZCBtb3JlIHRoYW4KKyAqIG9uY2UgcGVyIHRyYW5zYWN0aW9uLCBhcyBsb25nIGFzIGl0IGhhc24ndCBiZWVuIHdyaXR0ZW4geWV0CisgKi8KK25vaW5saW5lIGludCBidHJmc19jb3dfYmxvY2soc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCisJCSAgICBzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwgc3RydWN0IGV4dGVudF9idWZmZXIgKmJ1ZiwKKwkJICAgIHN0cnVjdCBleHRlbnRfYnVmZmVyICpwYXJlbnQsIGludCBwYXJlbnRfc2xvdCwKKwkJICAgIHN0cnVjdCBleHRlbnRfYnVmZmVyICoqY293X3JldCwgdTY0IHByZWFsbG9jX2Rlc3QpCit7CisJdTY0IHNlYXJjaF9zdGFydDsKKwlpbnQgcmV0OworCisJaWYgKHRyYW5zLT50cmFuc2FjdGlvbiAhPSByb290LT5mc19pbmZvLT5ydW5uaW5nX3RyYW5zYWN0aW9uKSB7CisJCXByaW50ayhLRVJOX0NSSVQgInRyYW5zICVsbHUgcnVubmluZyAlbGx1XG4iLAorCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyl0cmFucy0+dHJhbnNpZCwKKwkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpCisJCSAgICAgICByb290LT5mc19pbmZvLT5ydW5uaW5nX3RyYW5zYWN0aW9uLT50cmFuc2lkKTsKKwkJV0FSTl9PTigxKTsKKwl9CisJaWYgKHRyYW5zLT50cmFuc2lkICE9IHJvb3QtPmZzX2luZm8tPmdlbmVyYXRpb24pIHsKKwkJcHJpbnRrKEtFUk5fQ1JJVCAidHJhbnMgJWxsdSBydW5uaW5nICVsbHVcbiIsCisJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKXRyYW5zLT50cmFuc2lkLAorCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylyb290LT5mc19pbmZvLT5nZW5lcmF0aW9uKTsKKwkJV0FSTl9PTigxKTsKKwl9CisKKwlzcGluX2xvY2soJnJvb3QtPmZzX2luZm8tPmhhc2hfbG9jayk7CisJaWYgKGJ0cmZzX2hlYWRlcl9nZW5lcmF0aW9uKGJ1ZikgPT0gdHJhbnMtPnRyYW5zaWQgJiYKKwkgICAgYnRyZnNfaGVhZGVyX293bmVyKGJ1ZikgPT0gcm9vdC0+cm9vdF9rZXkub2JqZWN0aWQgJiYKKwkgICAgIWJ0cmZzX2hlYWRlcl9mbGFnKGJ1ZiwgQlRSRlNfSEVBREVSX0ZMQUdfV1JJVFRFTikpIHsKKwkJKmNvd19yZXQgPSBidWY7CisJCXNwaW5fdW5sb2NrKCZyb290LT5mc19pbmZvLT5oYXNoX2xvY2spOworCQlXQVJOX09OKHByZWFsbG9jX2Rlc3QpOworCQlyZXR1cm4gMDsKKwl9CisJc3Bpbl91bmxvY2soJnJvb3QtPmZzX2luZm8tPmhhc2hfbG9jayk7CisJc2VhcmNoX3N0YXJ0ID0gYnVmLT5zdGFydCAmIH4oKHU2NCkoMTAyNCAqIDEwMjQgKiAxMDI0KSAtIDEpOworCXJldCA9IF9fYnRyZnNfY293X2Jsb2NrKHRyYW5zLCByb290LCBidWYsIHBhcmVudCwKKwkJCQkgcGFyZW50X3Nsb3QsIGNvd19yZXQsIHNlYXJjaF9zdGFydCwgMCwKKwkJCQkgcHJlYWxsb2NfZGVzdCk7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIGhlbHBlciBmdW5jdGlvbiBmb3IgZGVmcmFnIHRvIGRlY2lkZSBpZiB0d28gYmxvY2tzIHBvaW50ZWQgdG8gYnkgYQorICogbm9kZSBhcmUgYWN0dWFsbHkgY2xvc2UgYnkKKyAqLworc3RhdGljIGludCBjbG9zZV9ibG9ja3ModTY0IGJsb2NrbnIsIHU2NCBvdGhlciwgdTMyIGJsb2Nrc2l6ZSkKK3sKKwlpZiAoYmxvY2tuciA8IG90aGVyICYmIG90aGVyIC0gKGJsb2NrbnIgKyBibG9ja3NpemUpIDwgMzI3NjgpCisJCXJldHVybiAxOworCWlmIChibG9ja25yID4gb3RoZXIgJiYgYmxvY2tuciAtIChvdGhlciArIGJsb2Nrc2l6ZSkgPCAzMjc2OCkKKwkJcmV0dXJuIDE7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBjb21wYXJlIHR3byBrZXlzIGluIGEgbWVtY21wIGZhc2hpb24KKyAqLworc3RhdGljIGludCBjb21wX2tleXMoc3RydWN0IGJ0cmZzX2Rpc2tfa2V5ICpkaXNrLCBzdHJ1Y3QgYnRyZnNfa2V5ICprMikKK3sKKwlzdHJ1Y3QgYnRyZnNfa2V5IGsxOworCisJYnRyZnNfZGlza19rZXlfdG9fY3B1KCZrMSwgZGlzayk7CisKKwlpZiAoazEub2JqZWN0aWQgPiBrMi0+b2JqZWN0aWQpCisJCXJldHVybiAxOworCWlmIChrMS5vYmplY3RpZCA8IGsyLT5vYmplY3RpZCkKKwkJcmV0dXJuIC0xOworCWlmIChrMS50eXBlID4gazItPnR5cGUpCisJCXJldHVybiAxOworCWlmIChrMS50eXBlIDwgazItPnR5cGUpCisJCXJldHVybiAtMTsKKwlpZiAoazEub2Zmc2V0ID4gazItPm9mZnNldCkKKwkJcmV0dXJuIDE7CisJaWYgKGsxLm9mZnNldCA8IGsyLT5vZmZzZXQpCisJCXJldHVybiAtMTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIHNhbWUgYXMgY29tcF9rZXlzIG9ubHkgd2l0aCB0d28gYnRyZnNfa2V5J3MKKyAqLworc3RhdGljIGludCBjb21wX2NwdV9rZXlzKHN0cnVjdCBidHJmc19rZXkgKmsxLCBzdHJ1Y3QgYnRyZnNfa2V5ICprMikKK3sKKwlpZiAoazEtPm9iamVjdGlkID4gazItPm9iamVjdGlkKQorCQlyZXR1cm4gMTsKKwlpZiAoazEtPm9iamVjdGlkIDwgazItPm9iamVjdGlkKQorCQlyZXR1cm4gLTE7CisJaWYgKGsxLT50eXBlID4gazItPnR5cGUpCisJCXJldHVybiAxOworCWlmIChrMS0+dHlwZSA8IGsyLT50eXBlKQorCQlyZXR1cm4gLTE7CisJaWYgKGsxLT5vZmZzZXQgPiBrMi0+b2Zmc2V0KQorCQlyZXR1cm4gMTsKKwlpZiAoazEtPm9mZnNldCA8IGsyLT5vZmZzZXQpCisJCXJldHVybiAtMTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIHRoaXMgaXMgdXNlZCBieSB0aGUgZGVmcmFnIGNvZGUgdG8gZ28gdGhyb3VnaCBhbGwgdGhlCisgKiBsZWF2ZXMgcG9pbnRlZCB0byBieSBhIG5vZGUgYW5kIHJlYWxsb2NhdGUgdGhlbSBzbyB0aGF0CisgKiBkaXNrIG9yZGVyIGlzIGNsb3NlIHRvIGtleSBvcmRlcgorICovCitpbnQgYnRyZnNfcmVhbGxvY19ub2RlKHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAorCQkgICAgICAgc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsIHN0cnVjdCBleHRlbnRfYnVmZmVyICpwYXJlbnQsCisJCSAgICAgICBpbnQgc3RhcnRfc2xvdCwgaW50IGNhY2hlX29ubHksIHU2NCAqbGFzdF9yZXQsCisJCSAgICAgICBzdHJ1Y3QgYnRyZnNfa2V5ICpwcm9ncmVzcykKK3sKKwlzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqY3VyOworCXU2NCBibG9ja25yOworCXU2NCBnZW47CisJdTY0IHNlYXJjaF9zdGFydCA9ICpsYXN0X3JldDsKKwl1NjQgbGFzdF9ibG9jayA9IDA7CisJdTY0IG90aGVyOworCXUzMiBwYXJlbnRfbnJpdGVtczsKKwlpbnQgZW5kX3Nsb3Q7CisJaW50IGk7CisJaW50IGVyciA9IDA7CisJaW50IHBhcmVudF9sZXZlbDsKKwlpbnQgdXB0b2RhdGU7CisJdTMyIGJsb2Nrc2l6ZTsKKwlpbnQgcHJvZ3Jlc3NfcGFzc2VkID0gMDsKKwlzdHJ1Y3QgYnRyZnNfZGlza19rZXkgZGlza19rZXk7CisKKwlwYXJlbnRfbGV2ZWwgPSBidHJmc19oZWFkZXJfbGV2ZWwocGFyZW50KTsKKwlpZiAoY2FjaGVfb25seSAmJiBwYXJlbnRfbGV2ZWwgIT0gMSkKKwkJcmV0dXJuIDA7CisKKwlpZiAodHJhbnMtPnRyYW5zYWN0aW9uICE9IHJvb3QtPmZzX2luZm8tPnJ1bm5pbmdfdHJhbnNhY3Rpb24pCisJCVdBUk5fT04oMSk7CisJaWYgKHRyYW5zLT50cmFuc2lkICE9IHJvb3QtPmZzX2luZm8tPmdlbmVyYXRpb24pCisJCVdBUk5fT04oMSk7CisKKwlwYXJlbnRfbnJpdGVtcyA9IGJ0cmZzX2hlYWRlcl9ucml0ZW1zKHBhcmVudCk7CisJYmxvY2tzaXplID0gYnRyZnNfbGV2ZWxfc2l6ZShyb290LCBwYXJlbnRfbGV2ZWwgLSAxKTsKKwllbmRfc2xvdCA9IHBhcmVudF9ucml0ZW1zOworCisJaWYgKHBhcmVudF9ucml0ZW1zID09IDEpCisJCXJldHVybiAwOworCisJZm9yIChpID0gc3RhcnRfc2xvdDsgaSA8IGVuZF9zbG90OyBpKyspIHsKKwkJaW50IGNsb3NlID0gMTsKKworCQlpZiAoIXBhcmVudC0+bWFwX3Rva2VuKSB7CisJCQltYXBfZXh0ZW50X2J1ZmZlcihwYXJlbnQsCisJCQkJCWJ0cmZzX25vZGVfa2V5X3B0cl9vZmZzZXQoaSksCisJCQkJCXNpemVvZihzdHJ1Y3QgYnRyZnNfa2V5X3B0ciksCisJCQkJCSZwYXJlbnQtPm1hcF90b2tlbiwgJnBhcmVudC0+a2FkZHIsCisJCQkJCSZwYXJlbnQtPm1hcF9zdGFydCwgJnBhcmVudC0+bWFwX2xlbiwKKwkJCQkJS01fVVNFUjEpOworCQl9CisJCWJ0cmZzX25vZGVfa2V5KHBhcmVudCwgJmRpc2tfa2V5LCBpKTsKKwkJaWYgKCFwcm9ncmVzc19wYXNzZWQgJiYgY29tcF9rZXlzKCZkaXNrX2tleSwgcHJvZ3Jlc3MpIDwgMCkKKwkJCWNvbnRpbnVlOworCisJCXByb2dyZXNzX3Bhc3NlZCA9IDE7CisJCWJsb2NrbnIgPSBidHJmc19ub2RlX2Jsb2NrcHRyKHBhcmVudCwgaSk7CisJCWdlbiA9IGJ0cmZzX25vZGVfcHRyX2dlbmVyYXRpb24ocGFyZW50LCBpKTsKKwkJaWYgKGxhc3RfYmxvY2sgPT0gMCkKKwkJCWxhc3RfYmxvY2sgPSBibG9ja25yOworCisJCWlmIChpID4gMCkgeworCQkJb3RoZXIgPSBidHJmc19ub2RlX2Jsb2NrcHRyKHBhcmVudCwgaSAtIDEpOworCQkJY2xvc2UgPSBjbG9zZV9ibG9ja3MoYmxvY2tuciwgb3RoZXIsIGJsb2Nrc2l6ZSk7CisJCX0KKwkJaWYgKCFjbG9zZSAmJiBpIDwgZW5kX3Nsb3QgLSAyKSB7CisJCQlvdGhlciA9IGJ0cmZzX25vZGVfYmxvY2twdHIocGFyZW50LCBpICsgMSk7CisJCQljbG9zZSA9IGNsb3NlX2Jsb2NrcyhibG9ja25yLCBvdGhlciwgYmxvY2tzaXplKTsKKwkJfQorCQlpZiAoY2xvc2UpIHsKKwkJCWxhc3RfYmxvY2sgPSBibG9ja25yOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKHBhcmVudC0+bWFwX3Rva2VuKSB7CisJCQl1bm1hcF9leHRlbnRfYnVmZmVyKHBhcmVudCwgcGFyZW50LT5tYXBfdG9rZW4sCisJCQkJCSAgICBLTV9VU0VSMSk7CisJCQlwYXJlbnQtPm1hcF90b2tlbiA9IE5VTEw7CisJCX0KKworCQljdXIgPSBidHJmc19maW5kX3RyZWVfYmxvY2socm9vdCwgYmxvY2tuciwgYmxvY2tzaXplKTsKKwkJaWYgKGN1cikKKwkJCXVwdG9kYXRlID0gYnRyZnNfYnVmZmVyX3VwdG9kYXRlKGN1ciwgZ2VuKTsKKwkJZWxzZQorCQkJdXB0b2RhdGUgPSAwOworCQlpZiAoIWN1ciB8fCAhdXB0b2RhdGUpIHsKKwkJCWlmIChjYWNoZV9vbmx5KSB7CisJCQkJZnJlZV9leHRlbnRfYnVmZmVyKGN1cik7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIWN1cikgeworCQkJCWN1ciA9IHJlYWRfdHJlZV9ibG9jayhyb290LCBibG9ja25yLAorCQkJCQkJCSBibG9ja3NpemUsIGdlbik7CisJCQl9IGVsc2UgaWYgKCF1cHRvZGF0ZSkgeworCQkJCWJ0cmZzX3JlYWRfYnVmZmVyKGN1ciwgZ2VuKTsKKwkJCX0KKwkJfQorCQlpZiAoc2VhcmNoX3N0YXJ0ID09IDApCisJCQlzZWFyY2hfc3RhcnQgPSBsYXN0X2Jsb2NrOworCisJCWJ0cmZzX3RyZWVfbG9jayhjdXIpOworCQllcnIgPSBfX2J0cmZzX2Nvd19ibG9jayh0cmFucywgcm9vdCwgY3VyLCBwYXJlbnQsIGksCisJCQkJCSZjdXIsIHNlYXJjaF9zdGFydCwKKwkJCQkJbWluKDE2ICogYmxvY2tzaXplLAorCQkJCQkgICAgKGVuZF9zbG90IC0gaSkgKiBibG9ja3NpemUpLCAwKTsKKwkJaWYgKGVycikgeworCQkJYnRyZnNfdHJlZV91bmxvY2soY3VyKTsKKwkJCWZyZWVfZXh0ZW50X2J1ZmZlcihjdXIpOworCQkJYnJlYWs7CisJCX0KKwkJc2VhcmNoX3N0YXJ0ID0gY3VyLT5zdGFydDsKKwkJbGFzdF9ibG9jayA9IGN1ci0+c3RhcnQ7CisJCSpsYXN0X3JldCA9IHNlYXJjaF9zdGFydDsKKwkJYnRyZnNfdHJlZV91bmxvY2soY3VyKTsKKwkJZnJlZV9leHRlbnRfYnVmZmVyKGN1cik7CisJfQorCWlmIChwYXJlbnQtPm1hcF90b2tlbikgeworCQl1bm1hcF9leHRlbnRfYnVmZmVyKHBhcmVudCwgcGFyZW50LT5tYXBfdG9rZW4sCisJCQkJICAgIEtNX1VTRVIxKTsKKwkJcGFyZW50LT5tYXBfdG9rZW4gPSBOVUxMOworCX0KKwlyZXR1cm4gZXJyOworfQorCisvKgorICogVGhlIGxlYWYgZGF0YSBncm93cyBmcm9tIGVuZC10by1mcm9udCBpbiB0aGUgbm9kZS4KKyAqIHRoaXMgcmV0dXJucyB0aGUgYWRkcmVzcyBvZiB0aGUgc3RhcnQgb2YgdGhlIGxhc3QgaXRlbSwKKyAqIHdoaWNoIGlzIHRoZSBzdG9wIG9mIHRoZSBsZWFmIGRhdGEgc3RhY2sKKyAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgbGVhZl9kYXRhX2VuZChzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwKKwkJCQkJIHN0cnVjdCBleHRlbnRfYnVmZmVyICpsZWFmKQoreworCXUzMiBuciA9IGJ0cmZzX2hlYWRlcl9ucml0ZW1zKGxlYWYpOworCWlmIChuciA9PSAwKQorCQlyZXR1cm4gQlRSRlNfTEVBRl9EQVRBX1NJWkUocm9vdCk7CisJcmV0dXJuIGJ0cmZzX2l0ZW1fb2Zmc2V0X25yKGxlYWYsIG5yIC0gMSk7Cit9CisKKy8qCisgKiBleHRyYSBkZWJ1Z2dpbmcgY2hlY2tzIHRvIG1ha2Ugc3VyZSBhbGwgdGhlIGl0ZW1zIGluIGEga2V5IGFyZQorICogd2VsbCBmb3JtZWQgYW5kIGluIHRoZSBwcm9wZXIgb3JkZXIKKyAqLworc3RhdGljIGludCBjaGVja19ub2RlKHN0cnVjdCBidHJmc19yb290ICpyb290LCBzdHJ1Y3QgYnRyZnNfcGF0aCAqcGF0aCwKKwkJICAgICAgaW50IGxldmVsKQoreworCXN0cnVjdCBleHRlbnRfYnVmZmVyICpwYXJlbnQgPSBOVUxMOworCXN0cnVjdCBleHRlbnRfYnVmZmVyICpub2RlID0gcGF0aC0+bm9kZXNbbGV2ZWxdOworCXN0cnVjdCBidHJmc19kaXNrX2tleSBwYXJlbnRfa2V5OworCXN0cnVjdCBidHJmc19kaXNrX2tleSBub2RlX2tleTsKKwlpbnQgcGFyZW50X3Nsb3Q7CisJaW50IHNsb3Q7CisJc3RydWN0IGJ0cmZzX2tleSBjcHVrZXk7CisJdTMyIG5yaXRlbXMgPSBidHJmc19oZWFkZXJfbnJpdGVtcyhub2RlKTsKKworCWlmIChwYXRoLT5ub2Rlc1tsZXZlbCArIDFdKQorCQlwYXJlbnQgPSBwYXRoLT5ub2Rlc1tsZXZlbCArIDFdOworCisJc2xvdCA9IHBhdGgtPnNsb3RzW2xldmVsXTsKKwlCVUdfT04obnJpdGVtcyA9PSAwKTsKKwlpZiAocGFyZW50KSB7CisJCXBhcmVudF9zbG90ID0gcGF0aC0+c2xvdHNbbGV2ZWwgKyAxXTsKKwkJYnRyZnNfbm9kZV9rZXkocGFyZW50LCAmcGFyZW50X2tleSwgcGFyZW50X3Nsb3QpOworCQlidHJmc19ub2RlX2tleShub2RlLCAmbm9kZV9rZXksIDApOworCQlCVUdfT04obWVtY21wKCZwYXJlbnRfa2V5LCAmbm9kZV9rZXksCisJCQkgICAgICBzaXplb2Yoc3RydWN0IGJ0cmZzX2Rpc2tfa2V5KSkpOworCQlCVUdfT04oYnRyZnNfbm9kZV9ibG9ja3B0cihwYXJlbnQsIHBhcmVudF9zbG90KSAhPQorCQkgICAgICAgYnRyZnNfaGVhZGVyX2J5dGVucihub2RlKSk7CisJfQorCUJVR19PTihucml0ZW1zID4gQlRSRlNfTk9ERVBUUlNfUEVSX0JMT0NLKHJvb3QpKTsKKwlpZiAoc2xvdCAhPSAwKSB7CisJCWJ0cmZzX25vZGVfa2V5X3RvX2NwdShub2RlLCAmY3B1a2V5LCBzbG90IC0gMSk7CisJCWJ0cmZzX25vZGVfa2V5KG5vZGUsICZub2RlX2tleSwgc2xvdCk7CisJCUJVR19PTihjb21wX2tleXMoJm5vZGVfa2V5LCAmY3B1a2V5KSA8PSAwKTsKKwl9CisJaWYgKHNsb3QgPCBucml0ZW1zIC0gMSkgeworCQlidHJmc19ub2RlX2tleV90b19jcHUobm9kZSwgJmNwdWtleSwgc2xvdCArIDEpOworCQlidHJmc19ub2RlX2tleShub2RlLCAmbm9kZV9rZXksIHNsb3QpOworCQlCVUdfT04oY29tcF9rZXlzKCZub2RlX2tleSwgJmNwdWtleSkgPj0gMCk7CisJfQorCXJldHVybiAwOworfQorCisvKgorICogZXh0cmEgY2hlY2tpbmcgdG8gbWFrZSBzdXJlIGFsbCB0aGUgaXRlbXMgaW4gYSBsZWFmIGFyZQorICogd2VsbCBmb3JtZWQgYW5kIGluIHRoZSBwcm9wZXIgb3JkZXIKKyAqLworc3RhdGljIGludCBjaGVja19sZWFmKHN0cnVjdCBidHJmc19yb290ICpyb290LCBzdHJ1Y3QgYnRyZnNfcGF0aCAqcGF0aCwKKwkJICAgICAgaW50IGxldmVsKQoreworCXN0cnVjdCBleHRlbnRfYnVmZmVyICpsZWFmID0gcGF0aC0+bm9kZXNbbGV2ZWxdOworCXN0cnVjdCBleHRlbnRfYnVmZmVyICpwYXJlbnQgPSBOVUxMOworCWludCBwYXJlbnRfc2xvdDsKKwlzdHJ1Y3QgYnRyZnNfa2V5IGNwdWtleTsKKwlzdHJ1Y3QgYnRyZnNfZGlza19rZXkgcGFyZW50X2tleTsKKwlzdHJ1Y3QgYnRyZnNfZGlza19rZXkgbGVhZl9rZXk7CisJaW50IHNsb3QgPSBwYXRoLT5zbG90c1swXTsKKworCXUzMiBucml0ZW1zID0gYnRyZnNfaGVhZGVyX25yaXRlbXMobGVhZik7CisKKwlpZiAocGF0aC0+bm9kZXNbbGV2ZWwgKyAxXSkKKwkJcGFyZW50ID0gcGF0aC0+bm9kZXNbbGV2ZWwgKyAxXTsKKworCWlmIChucml0ZW1zID09IDApCisJCXJldHVybiAwOworCisJaWYgKHBhcmVudCkgeworCQlwYXJlbnRfc2xvdCA9IHBhdGgtPnNsb3RzW2xldmVsICsgMV07CisJCWJ0cmZzX25vZGVfa2V5KHBhcmVudCwgJnBhcmVudF9rZXksIHBhcmVudF9zbG90KTsKKwkJYnRyZnNfaXRlbV9rZXkobGVhZiwgJmxlYWZfa2V5LCAwKTsKKworCQlCVUdfT04obWVtY21wKCZwYXJlbnRfa2V5LCAmbGVhZl9rZXksCisJCSAgICAgICBzaXplb2Yoc3RydWN0IGJ0cmZzX2Rpc2tfa2V5KSkpOworCQlCVUdfT04oYnRyZnNfbm9kZV9ibG9ja3B0cihwYXJlbnQsIHBhcmVudF9zbG90KSAhPQorCQkgICAgICAgYnRyZnNfaGVhZGVyX2J5dGVucihsZWFmKSk7CisJfQorCWlmIChzbG90ICE9IDAgJiYgc2xvdCA8IG5yaXRlbXMgLSAxKSB7CisJCWJ0cmZzX2l0ZW1fa2V5KGxlYWYsICZsZWFmX2tleSwgc2xvdCk7CisJCWJ0cmZzX2l0ZW1fa2V5X3RvX2NwdShsZWFmLCAmY3B1a2V5LCBzbG90IC0gMSk7CisJCWlmIChjb21wX2tleXMoJmxlYWZfa2V5LCAmY3B1a2V5KSA8PSAwKSB7CisJCQlidHJmc19wcmludF9sZWFmKHJvb3QsIGxlYWYpOworCQkJcHJpbnRrKEtFUk5fQ1JJVCAic2xvdCAlZCBvZmZzZXQgYmFkIGtleVxuIiwgc2xvdCk7CisJCQlCVUdfT04oMSk7CisJCX0KKwkJaWYgKGJ0cmZzX2l0ZW1fb2Zmc2V0X25yKGxlYWYsIHNsb3QgLSAxKSAhPQorCQkgICAgICAgYnRyZnNfaXRlbV9lbmRfbnIobGVhZiwgc2xvdCkpIHsKKwkJCWJ0cmZzX3ByaW50X2xlYWYocm9vdCwgbGVhZik7CisJCQlwcmludGsoS0VSTl9DUklUICJzbG90ICVkIG9mZnNldCBiYWRcbiIsIHNsb3QpOworCQkJQlVHX09OKDEpOworCQl9CisJfQorCWlmIChzbG90IDwgbnJpdGVtcyAtIDEpIHsKKwkJYnRyZnNfaXRlbV9rZXkobGVhZiwgJmxlYWZfa2V5LCBzbG90KTsKKwkJYnRyZnNfaXRlbV9rZXlfdG9fY3B1KGxlYWYsICZjcHVrZXksIHNsb3QgKyAxKTsKKwkJQlVHX09OKGNvbXBfa2V5cygmbGVhZl9rZXksICZjcHVrZXkpID49IDApOworCQlpZiAoYnRyZnNfaXRlbV9vZmZzZXRfbnIobGVhZiwgc2xvdCkgIT0KKwkJCWJ0cmZzX2l0ZW1fZW5kX25yKGxlYWYsIHNsb3QgKyAxKSkgeworCQkJYnRyZnNfcHJpbnRfbGVhZihyb290LCBsZWFmKTsKKwkJCXByaW50ayhLRVJOX0NSSVQgInNsb3QgJWQgb2Zmc2V0IGJhZFxuIiwgc2xvdCk7CisJCQlCVUdfT04oMSk7CisJCX0KKwl9CisJQlVHX09OKGJ0cmZzX2l0ZW1fb2Zmc2V0X25yKGxlYWYsIDApICsKKwkgICAgICAgYnRyZnNfaXRlbV9zaXplX25yKGxlYWYsIDApICE9IEJUUkZTX0xFQUZfREFUQV9TSVpFKHJvb3QpKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIG5vaW5saW5lIGludCBjaGVja19ibG9jayhzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwKKwkJCQlzdHJ1Y3QgYnRyZnNfcGF0aCAqcGF0aCwgaW50IGxldmVsKQoreworCXJldHVybiAwOworCWlmIChsZXZlbCA9PSAwKQorCQlyZXR1cm4gY2hlY2tfbGVhZihyb290LCBwYXRoLCBsZXZlbCk7CisJcmV0dXJuIGNoZWNrX25vZGUocm9vdCwgcGF0aCwgbGV2ZWwpOworfQorCisvKgorICogc2VhcmNoIGZvciBrZXkgaW4gdGhlIGV4dGVudF9idWZmZXIuICBUaGUgaXRlbXMgc3RhcnQgYXQgb2Zmc2V0IHAsCisgKiBhbmQgdGhleSBhcmUgaXRlbV9zaXplIGFwYXJ0LiAgVGhlcmUgYXJlICdtYXgnIGl0ZW1zIGluIHAuCisgKgorICogdGhlIHNsb3QgaW4gdGhlIGFycmF5IGlzIHJldHVybmVkIHZpYSBzbG90LCBhbmQgaXQgcG9pbnRzIHRvCisgKiB0aGUgcGxhY2Ugd2hlcmUgeW91IHdvdWxkIGluc2VydCBrZXkgaWYgaXQgaXMgbm90IGZvdW5kIGluCisgKiB0aGUgYXJyYXkuCisgKgorICogc2xvdCBtYXkgcG9pbnQgdG8gbWF4IGlmIHRoZSBrZXkgaXMgYmlnZ2VyIHRoYW4gYWxsIG9mIHRoZSBrZXlzCisgKi8KK3N0YXRpYyBub2lubGluZSBpbnQgZ2VuZXJpY19iaW5fc2VhcmNoKHN0cnVjdCBleHRlbnRfYnVmZmVyICplYiwKKwkJCQkgICAgICAgdW5zaWduZWQgbG9uZyBwLAorCQkJCSAgICAgICBpbnQgaXRlbV9zaXplLCBzdHJ1Y3QgYnRyZnNfa2V5ICprZXksCisJCQkJICAgICAgIGludCBtYXgsIGludCAqc2xvdCkKK3sKKwlpbnQgbG93ID0gMDsKKwlpbnQgaGlnaCA9IG1heDsKKwlpbnQgbWlkOworCWludCByZXQ7CisJc3RydWN0IGJ0cmZzX2Rpc2tfa2V5ICp0bXAgPSBOVUxMOworCXN0cnVjdCBidHJmc19kaXNrX2tleSB1bmFsaWduZWQ7CisJdW5zaWduZWQgbG9uZyBvZmZzZXQ7CisJY2hhciAqbWFwX3Rva2VuID0gTlVMTDsKKwljaGFyICprYWRkciA9IE5VTEw7CisJdW5zaWduZWQgbG9uZyBtYXBfc3RhcnQgPSAwOworCXVuc2lnbmVkIGxvbmcgbWFwX2xlbiA9IDA7CisJaW50IGVycjsKKworCXdoaWxlIChsb3cgPCBoaWdoKSB7CisJCW1pZCA9IChsb3cgKyBoaWdoKSAvIDI7CisJCW9mZnNldCA9IHAgKyBtaWQgKiBpdGVtX3NpemU7CisKKwkJaWYgKCFtYXBfdG9rZW4gfHwgb2Zmc2V0IDwgbWFwX3N0YXJ0IHx8CisJCSAgICAob2Zmc2V0ICsgc2l6ZW9mKHN0cnVjdCBidHJmc19kaXNrX2tleSkpID4KKwkJICAgIG1hcF9zdGFydCArIG1hcF9sZW4pIHsKKwkJCWlmIChtYXBfdG9rZW4pIHsKKwkJCQl1bm1hcF9leHRlbnRfYnVmZmVyKGViLCBtYXBfdG9rZW4sIEtNX1VTRVIwKTsKKwkJCQltYXBfdG9rZW4gPSBOVUxMOworCQkJfQorCisJCQllcnIgPSBtYXBfcHJpdmF0ZV9leHRlbnRfYnVmZmVyKGViLCBvZmZzZXQsCisJCQkJCQlzaXplb2Yoc3RydWN0IGJ0cmZzX2Rpc2tfa2V5KSwKKwkJCQkJCSZtYXBfdG9rZW4sICZrYWRkciwKKwkJCQkJCSZtYXBfc3RhcnQsICZtYXBfbGVuLCBLTV9VU0VSMCk7CisKKwkJCWlmICghZXJyKSB7CisJCQkJdG1wID0gKHN0cnVjdCBidHJmc19kaXNrX2tleSAqKShrYWRkciArIG9mZnNldCAtCisJCQkJCQkJbWFwX3N0YXJ0KTsKKwkJCX0gZWxzZSB7CisJCQkJcmVhZF9leHRlbnRfYnVmZmVyKGViLCAmdW5hbGlnbmVkLAorCQkJCQkJICAgb2Zmc2V0LCBzaXplb2YodW5hbGlnbmVkKSk7CisJCQkJdG1wID0gJnVuYWxpZ25lZDsKKwkJCX0KKworCQl9IGVsc2UgeworCQkJdG1wID0gKHN0cnVjdCBidHJmc19kaXNrX2tleSAqKShrYWRkciArIG9mZnNldCAtCisJCQkJCQkJbWFwX3N0YXJ0KTsKKwkJfQorCQlyZXQgPSBjb21wX2tleXModG1wLCBrZXkpOworCisJCWlmIChyZXQgPCAwKQorCQkJbG93ID0gbWlkICsgMTsKKwkJZWxzZSBpZiAocmV0ID4gMCkKKwkJCWhpZ2ggPSBtaWQ7CisJCWVsc2UgeworCQkJKnNsb3QgPSBtaWQ7CisJCQlpZiAobWFwX3Rva2VuKQorCQkJCXVubWFwX2V4dGVudF9idWZmZXIoZWIsIG1hcF90b2tlbiwgS01fVVNFUjApOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisJKnNsb3QgPSBsb3c7CisJaWYgKG1hcF90b2tlbikKKwkJdW5tYXBfZXh0ZW50X2J1ZmZlcihlYiwgbWFwX3Rva2VuLCBLTV9VU0VSMCk7CisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBzaW1wbGUgYmluX3NlYXJjaCBmcm9udGVuZCB0aGF0IGRvZXMgdGhlIHJpZ2h0IHRoaW5nIGZvcgorICogbGVhdmVzIHZzIG5vZGVzCisgKi8KK3N0YXRpYyBpbnQgYmluX3NlYXJjaChzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqZWIsIHN0cnVjdCBidHJmc19rZXkgKmtleSwKKwkJICAgICAgaW50IGxldmVsLCBpbnQgKnNsb3QpCit7CisJaWYgKGxldmVsID09IDApIHsKKwkJcmV0dXJuIGdlbmVyaWNfYmluX3NlYXJjaChlYiwKKwkJCQkJICBvZmZzZXRvZihzdHJ1Y3QgYnRyZnNfbGVhZiwgaXRlbXMpLAorCQkJCQkgIHNpemVvZihzdHJ1Y3QgYnRyZnNfaXRlbSksCisJCQkJCSAga2V5LCBidHJmc19oZWFkZXJfbnJpdGVtcyhlYiksCisJCQkJCSAgc2xvdCk7CisJfSBlbHNlIHsKKwkJcmV0dXJuIGdlbmVyaWNfYmluX3NlYXJjaChlYiwKKwkJCQkJICBvZmZzZXRvZihzdHJ1Y3QgYnRyZnNfbm9kZSwgcHRycyksCisJCQkJCSAgc2l6ZW9mKHN0cnVjdCBidHJmc19rZXlfcHRyKSwKKwkJCQkJICBrZXksIGJ0cmZzX2hlYWRlcl9ucml0ZW1zKGViKSwKKwkJCQkJICBzbG90KTsKKwl9CisJcmV0dXJuIC0xOworfQorCisvKiBnaXZlbiBhIG5vZGUgYW5kIHNsb3QgbnVtYmVyLCB0aGlzIHJlYWRzIHRoZSBibG9ja3MgaXQgcG9pbnRzIHRvLiAgVGhlCisgKiBleHRlbnQgYnVmZmVyIGlzIHJldHVybmVkIHdpdGggYSByZWZlcmVuY2UgdGFrZW4gKGJ1dCB1bmxvY2tlZCkuCisgKiBOVUxMIGlzIHJldHVybmVkIG9uIGVycm9yLgorICovCitzdGF0aWMgbm9pbmxpbmUgc3RydWN0IGV4dGVudF9idWZmZXIgKnJlYWRfbm9kZV9zbG90KHN0cnVjdCBidHJmc19yb290ICpyb290LAorCQkJCSAgIHN0cnVjdCBleHRlbnRfYnVmZmVyICpwYXJlbnQsIGludCBzbG90KQoreworCWludCBsZXZlbCA9IGJ0cmZzX2hlYWRlcl9sZXZlbChwYXJlbnQpOworCWlmIChzbG90IDwgMCkKKwkJcmV0dXJuIE5VTEw7CisJaWYgKHNsb3QgPj0gYnRyZnNfaGVhZGVyX25yaXRlbXMocGFyZW50KSkKKwkJcmV0dXJuIE5VTEw7CisKKwlCVUdfT04obGV2ZWwgPT0gMCk7CisKKwlyZXR1cm4gcmVhZF90cmVlX2Jsb2NrKHJvb3QsIGJ0cmZzX25vZGVfYmxvY2twdHIocGFyZW50LCBzbG90KSwKKwkJICAgICAgIGJ0cmZzX2xldmVsX3NpemUocm9vdCwgbGV2ZWwgLSAxKSwKKwkJICAgICAgIGJ0cmZzX25vZGVfcHRyX2dlbmVyYXRpb24ocGFyZW50LCBzbG90KSk7Cit9CisKKy8qCisgKiBub2RlIGxldmVsIGJhbGFuY2luZywgdXNlZCB0byBtYWtlIHN1cmUgbm9kZXMgYXJlIGluIHByb3BlciBvcmRlciBmb3IKKyAqIGl0ZW0gZGVsZXRpb24uICBXZSBiYWxhbmNlIGZyb20gdGhlIHRvcCBkb3duLCBzbyB3ZSBoYXZlIHRvIG1ha2Ugc3VyZQorICogdGhhdCBhIGRlbGV0aW9uIHdvbid0IGxlYXZlIGFuIG5vZGUgY29tcGxldGVseSBlbXB0eSBsYXRlciBvbi4KKyAqLworc3RhdGljIG5vaW5saW5lIGludCBiYWxhbmNlX2xldmVsKHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAorCQkJIHN0cnVjdCBidHJmc19yb290ICpyb290LAorCQkJIHN0cnVjdCBidHJmc19wYXRoICpwYXRoLCBpbnQgbGV2ZWwpCit7CisJc3RydWN0IGV4dGVudF9idWZmZXIgKnJpZ2h0ID0gTlVMTDsKKwlzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqbWlkOworCXN0cnVjdCBleHRlbnRfYnVmZmVyICpsZWZ0ID0gTlVMTDsKKwlzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqcGFyZW50ID0gTlVMTDsKKwlpbnQgcmV0ID0gMDsKKwlpbnQgd3JldDsKKwlpbnQgcHNsb3Q7CisJaW50IG9yaWdfc2xvdCA9IHBhdGgtPnNsb3RzW2xldmVsXTsKKwlpbnQgZXJyX29uX2Vub3NwYyA9IDA7CisJdTY0IG9yaWdfcHRyOworCisJaWYgKGxldmVsID09IDApCisJCXJldHVybiAwOworCisJbWlkID0gcGF0aC0+bm9kZXNbbGV2ZWxdOworCVdBUk5fT04oIXBhdGgtPmxvY2tzW2xldmVsXSk7CisJV0FSTl9PTihidHJmc19oZWFkZXJfZ2VuZXJhdGlvbihtaWQpICE9IHRyYW5zLT50cmFuc2lkKTsKKworCW9yaWdfcHRyID0gYnRyZnNfbm9kZV9ibG9ja3B0cihtaWQsIG9yaWdfc2xvdCk7CisKKwlpZiAobGV2ZWwgPCBCVFJGU19NQVhfTEVWRUwgLSAxKQorCQlwYXJlbnQgPSBwYXRoLT5ub2Rlc1tsZXZlbCArIDFdOworCXBzbG90ID0gcGF0aC0+c2xvdHNbbGV2ZWwgKyAxXTsKKworCS8qCisJICogZGVhbCB3aXRoIHRoZSBjYXNlIHdoZXJlIHRoZXJlIGlzIG9ubHkgb25lIHBvaW50ZXIgaW4gdGhlIHJvb3QKKwkgKiBieSBwcm9tb3RpbmcgdGhlIG5vZGUgYmVsb3cgdG8gYSByb290CisJICovCisJaWYgKCFwYXJlbnQpIHsKKwkJc3RydWN0IGV4dGVudF9idWZmZXIgKmNoaWxkOworCisJCWlmIChidHJmc19oZWFkZXJfbnJpdGVtcyhtaWQpICE9IDEpCisJCQlyZXR1cm4gMDsKKworCQkvKiBwcm9tb3RlIHRoZSBjaGlsZCB0byBhIHJvb3QgKi8KKwkJY2hpbGQgPSByZWFkX25vZGVfc2xvdChyb290LCBtaWQsIDApOworCQlidHJmc190cmVlX2xvY2soY2hpbGQpOworCQlCVUdfT04oIWNoaWxkKTsKKwkJcmV0ID0gYnRyZnNfY293X2Jsb2NrKHRyYW5zLCByb290LCBjaGlsZCwgbWlkLCAwLCAmY2hpbGQsIDApOworCQlCVUdfT04ocmV0KTsKKworCQlzcGluX2xvY2soJnJvb3QtPm5vZGVfbG9jayk7CisJCXJvb3QtPm5vZGUgPSBjaGlsZDsKKwkJc3Bpbl91bmxvY2soJnJvb3QtPm5vZGVfbG9jayk7CisKKwkJcmV0ID0gYnRyZnNfdXBkYXRlX2V4dGVudF9yZWYodHJhbnMsIHJvb3QsIGNoaWxkLT5zdGFydCwKKwkJCQkJICAgICAgbWlkLT5zdGFydCwgY2hpbGQtPnN0YXJ0LAorCQkJCQkgICAgICByb290LT5yb290X2tleS5vYmplY3RpZCwKKwkJCQkJICAgICAgdHJhbnMtPnRyYW5zaWQsIGxldmVsIC0gMSk7CisJCUJVR19PTihyZXQpOworCisJCWFkZF9yb290X3RvX2RpcnR5X2xpc3Qocm9vdCk7CisJCWJ0cmZzX3RyZWVfdW5sb2NrKGNoaWxkKTsKKwkJcGF0aC0+bG9ja3NbbGV2ZWxdID0gMDsKKwkJcGF0aC0+bm9kZXNbbGV2ZWxdID0gTlVMTDsKKwkJY2xlYW5fdHJlZV9ibG9jayh0cmFucywgcm9vdCwgbWlkKTsKKwkJYnRyZnNfdHJlZV91bmxvY2sobWlkKTsKKwkJLyogb25jZSBmb3IgdGhlIHBhdGggKi8KKwkJZnJlZV9leHRlbnRfYnVmZmVyKG1pZCk7CisJCXJldCA9IGJ0cmZzX2ZyZWVfZXh0ZW50KHRyYW5zLCByb290LCBtaWQtPnN0YXJ0LCBtaWQtPmxlbiwKKwkJCQkJbWlkLT5zdGFydCwgcm9vdC0+cm9vdF9rZXkub2JqZWN0aWQsCisJCQkJCWJ0cmZzX2hlYWRlcl9nZW5lcmF0aW9uKG1pZCksCisJCQkJCWxldmVsLCAxKTsKKwkJLyogb25jZSBmb3IgdGhlIHJvb3QgcHRyICovCisJCWZyZWVfZXh0ZW50X2J1ZmZlcihtaWQpOworCQlyZXR1cm4gcmV0OworCX0KKwlpZiAoYnRyZnNfaGVhZGVyX25yaXRlbXMobWlkKSA+CisJICAgIEJUUkZTX05PREVQVFJTX1BFUl9CTE9DSyhyb290KSAvIDQpCisJCXJldHVybiAwOworCisJaWYgKGJ0cmZzX2hlYWRlcl9ucml0ZW1zKG1pZCkgPCAyKQorCQllcnJfb25fZW5vc3BjID0gMTsKKworCWxlZnQgPSByZWFkX25vZGVfc2xvdChyb290LCBwYXJlbnQsIHBzbG90IC0gMSk7CisJaWYgKGxlZnQpIHsKKwkJYnRyZnNfdHJlZV9sb2NrKGxlZnQpOworCQl3cmV0ID0gYnRyZnNfY293X2Jsb2NrKHRyYW5zLCByb290LCBsZWZ0LAorCQkJCSAgICAgICBwYXJlbnQsIHBzbG90IC0gMSwgJmxlZnQsIDApOworCQlpZiAod3JldCkgeworCQkJcmV0ID0gd3JldDsKKwkJCWdvdG8gZW5vc3BjOworCQl9CisJfQorCXJpZ2h0ID0gcmVhZF9ub2RlX3Nsb3Qocm9vdCwgcGFyZW50LCBwc2xvdCArIDEpOworCWlmIChyaWdodCkgeworCQlidHJmc190cmVlX2xvY2socmlnaHQpOworCQl3cmV0ID0gYnRyZnNfY293X2Jsb2NrKHRyYW5zLCByb290LCByaWdodCwKKwkJCQkgICAgICAgcGFyZW50LCBwc2xvdCArIDEsICZyaWdodCwgMCk7CisJCWlmICh3cmV0KSB7CisJCQlyZXQgPSB3cmV0OworCQkJZ290byBlbm9zcGM7CisJCX0KKwl9CisKKwkvKiBmaXJzdCwgdHJ5IHRvIG1ha2Ugc29tZSByb29tIGluIHRoZSBtaWRkbGUgYnVmZmVyICovCisJaWYgKGxlZnQpIHsKKwkJb3JpZ19zbG90ICs9IGJ0cmZzX2hlYWRlcl9ucml0ZW1zKGxlZnQpOworCQl3cmV0ID0gcHVzaF9ub2RlX2xlZnQodHJhbnMsIHJvb3QsIGxlZnQsIG1pZCwgMSk7CisJCWlmICh3cmV0IDwgMCkKKwkJCXJldCA9IHdyZXQ7CisJCWlmIChidHJmc19oZWFkZXJfbnJpdGVtcyhtaWQpIDwgMikKKwkJCWVycl9vbl9lbm9zcGMgPSAxOworCX0KKworCS8qCisJICogdGhlbiB0cnkgdG8gZW1wdHkgdGhlIHJpZ2h0IG1vc3QgYnVmZmVyIGludG8gdGhlIG1pZGRsZQorCSAqLworCWlmIChyaWdodCkgeworCQl3cmV0ID0gcHVzaF9ub2RlX2xlZnQodHJhbnMsIHJvb3QsIG1pZCwgcmlnaHQsIDEpOworCQlpZiAod3JldCA8IDAgJiYgd3JldCAhPSAtRU5PU1BDKQorCQkJcmV0ID0gd3JldDsKKwkJaWYgKGJ0cmZzX2hlYWRlcl9ucml0ZW1zKHJpZ2h0KSA9PSAwKSB7CisJCQl1NjQgYnl0ZW5yID0gcmlnaHQtPnN0YXJ0OworCQkJdTY0IGdlbmVyYXRpb24gPSBidHJmc19oZWFkZXJfZ2VuZXJhdGlvbihwYXJlbnQpOworCQkJdTMyIGJsb2Nrc2l6ZSA9IHJpZ2h0LT5sZW47CisKKwkJCWNsZWFuX3RyZWVfYmxvY2sodHJhbnMsIHJvb3QsIHJpZ2h0KTsKKwkJCWJ0cmZzX3RyZWVfdW5sb2NrKHJpZ2h0KTsKKwkJCWZyZWVfZXh0ZW50X2J1ZmZlcihyaWdodCk7CisJCQlyaWdodCA9IE5VTEw7CisJCQl3cmV0ID0gZGVsX3B0cih0cmFucywgcm9vdCwgcGF0aCwgbGV2ZWwgKyAxLCBwc2xvdCArCisJCQkJICAgICAgIDEpOworCQkJaWYgKHdyZXQpCisJCQkJcmV0ID0gd3JldDsKKwkJCXdyZXQgPSBidHJmc19mcmVlX2V4dGVudCh0cmFucywgcm9vdCwgYnl0ZW5yLAorCQkJCQkJIGJsb2Nrc2l6ZSwgcGFyZW50LT5zdGFydCwKKwkJCQkJCSBidHJmc19oZWFkZXJfb3duZXIocGFyZW50KSwKKwkJCQkJCSBnZW5lcmF0aW9uLCBsZXZlbCwgMSk7CisJCQlpZiAod3JldCkKKwkJCQlyZXQgPSB3cmV0OworCQl9IGVsc2UgeworCQkJc3RydWN0IGJ0cmZzX2Rpc2tfa2V5IHJpZ2h0X2tleTsKKwkJCWJ0cmZzX25vZGVfa2V5KHJpZ2h0LCAmcmlnaHRfa2V5LCAwKTsKKwkJCWJ0cmZzX3NldF9ub2RlX2tleShwYXJlbnQsICZyaWdodF9rZXksIHBzbG90ICsgMSk7CisJCQlidHJmc19tYXJrX2J1ZmZlcl9kaXJ0eShwYXJlbnQpOworCQl9CisJfQorCWlmIChidHJmc19oZWFkZXJfbnJpdGVtcyhtaWQpID09IDEpIHsKKwkJLyoKKwkJICogd2UncmUgbm90IGFsbG93ZWQgdG8gbGVhdmUgYSBub2RlIHdpdGggb25lIGl0ZW0gaW4gdGhlCisJCSAqIHRyZWUgZHVyaW5nIGEgZGVsZXRlLiAgQSBkZWxldGlvbiBmcm9tIGxvd2VyIGluIHRoZSB0cmVlCisJCSAqIGNvdWxkIHRyeSB0byBkZWxldGUgdGhlIG9ubHkgcG9pbnRlciBpbiB0aGlzIG5vZGUuCisJCSAqIFNvLCBwdWxsIHNvbWUga2V5cyBmcm9tIHRoZSBsZWZ0LgorCQkgKiBUaGVyZSBoYXMgdG8gYmUgYSBsZWZ0IHBvaW50ZXIgYXQgdGhpcyBwb2ludCBiZWNhdXNlCisJCSAqIG90aGVyd2lzZSB3ZSB3b3VsZCBoYXZlIHB1bGxlZCBzb21lIHBvaW50ZXJzIGZyb20gdGhlCisJCSAqIHJpZ2h0CisJCSAqLworCQlCVUdfT04oIWxlZnQpOworCQl3cmV0ID0gYmFsYW5jZV9ub2RlX3JpZ2h0KHRyYW5zLCByb290LCBtaWQsIGxlZnQpOworCQlpZiAod3JldCA8IDApIHsKKwkJCXJldCA9IHdyZXQ7CisJCQlnb3RvIGVub3NwYzsKKwkJfQorCQlpZiAod3JldCA9PSAxKSB7CisJCQl3cmV0ID0gcHVzaF9ub2RlX2xlZnQodHJhbnMsIHJvb3QsIGxlZnQsIG1pZCwgMSk7CisJCQlpZiAod3JldCA8IDApCisJCQkJcmV0ID0gd3JldDsKKwkJfQorCQlCVUdfT04od3JldCA9PSAxKTsKKwl9CisJaWYgKGJ0cmZzX2hlYWRlcl9ucml0ZW1zKG1pZCkgPT0gMCkgeworCQkvKiB3ZSd2ZSBtYW5hZ2VkIHRvIGVtcHR5IHRoZSBtaWRkbGUgbm9kZSwgZHJvcCBpdCAqLworCQl1NjQgcm9vdF9nZW4gPSBidHJmc19oZWFkZXJfZ2VuZXJhdGlvbihwYXJlbnQpOworCQl1NjQgYnl0ZW5yID0gbWlkLT5zdGFydDsKKwkJdTMyIGJsb2Nrc2l6ZSA9IG1pZC0+bGVuOworCisJCWNsZWFuX3RyZWVfYmxvY2sodHJhbnMsIHJvb3QsIG1pZCk7CisJCWJ0cmZzX3RyZWVfdW5sb2NrKG1pZCk7CisJCWZyZWVfZXh0ZW50X2J1ZmZlcihtaWQpOworCQltaWQgPSBOVUxMOworCQl3cmV0ID0gZGVsX3B0cih0cmFucywgcm9vdCwgcGF0aCwgbGV2ZWwgKyAxLCBwc2xvdCk7CisJCWlmICh3cmV0KQorCQkJcmV0ID0gd3JldDsKKwkJd3JldCA9IGJ0cmZzX2ZyZWVfZXh0ZW50KHRyYW5zLCByb290LCBieXRlbnIsIGJsb2Nrc2l6ZSwKKwkJCQkJIHBhcmVudC0+c3RhcnQsCisJCQkJCSBidHJmc19oZWFkZXJfb3duZXIocGFyZW50KSwKKwkJCQkJIHJvb3RfZ2VuLCBsZXZlbCwgMSk7CisJCWlmICh3cmV0KQorCQkJcmV0ID0gd3JldDsKKwl9IGVsc2UgeworCQkvKiB1cGRhdGUgdGhlIHBhcmVudCBrZXkgdG8gcmVmbGVjdCBvdXIgY2hhbmdlcyAqLworCQlzdHJ1Y3QgYnRyZnNfZGlza19rZXkgbWlkX2tleTsKKwkJYnRyZnNfbm9kZV9rZXkobWlkLCAmbWlkX2tleSwgMCk7CisJCWJ0cmZzX3NldF9ub2RlX2tleShwYXJlbnQsICZtaWRfa2V5LCBwc2xvdCk7CisJCWJ0cmZzX21hcmtfYnVmZmVyX2RpcnR5KHBhcmVudCk7CisJfQorCisJLyogdXBkYXRlIHRoZSBwYXRoICovCisJaWYgKGxlZnQpIHsKKwkJaWYgKGJ0cmZzX2hlYWRlcl9ucml0ZW1zKGxlZnQpID4gb3JpZ19zbG90KSB7CisJCQlleHRlbnRfYnVmZmVyX2dldChsZWZ0KTsKKwkJCS8qIGxlZnQgd2FzIGxvY2tlZCBhZnRlciBjb3cgKi8KKwkJCXBhdGgtPm5vZGVzW2xldmVsXSA9IGxlZnQ7CisJCQlwYXRoLT5zbG90c1tsZXZlbCArIDFdIC09IDE7CisJCQlwYXRoLT5zbG90c1tsZXZlbF0gPSBvcmlnX3Nsb3Q7CisJCQlpZiAobWlkKSB7CisJCQkJYnRyZnNfdHJlZV91bmxvY2sobWlkKTsKKwkJCQlmcmVlX2V4dGVudF9idWZmZXIobWlkKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCW9yaWdfc2xvdCAtPSBidHJmc19oZWFkZXJfbnJpdGVtcyhsZWZ0KTsKKwkJCXBhdGgtPnNsb3RzW2xldmVsXSA9IG9yaWdfc2xvdDsKKwkJfQorCX0KKwkvKiBkb3VibGUgY2hlY2sgd2UgaGF2ZW4ndCBtZXNzZWQgdGhpbmdzIHVwICovCisJY2hlY2tfYmxvY2socm9vdCwgcGF0aCwgbGV2ZWwpOworCWlmIChvcmlnX3B0ciAhPQorCSAgICBidHJmc19ub2RlX2Jsb2NrcHRyKHBhdGgtPm5vZGVzW2xldmVsXSwgcGF0aC0+c2xvdHNbbGV2ZWxdKSkKKwkJQlVHKCk7Citlbm9zcGM6CisJaWYgKHJpZ2h0KSB7CisJCWJ0cmZzX3RyZWVfdW5sb2NrKHJpZ2h0KTsKKwkJZnJlZV9leHRlbnRfYnVmZmVyKHJpZ2h0KTsKKwl9CisJaWYgKGxlZnQpIHsKKwkJaWYgKHBhdGgtPm5vZGVzW2xldmVsXSAhPSBsZWZ0KQorCQkJYnRyZnNfdHJlZV91bmxvY2sobGVmdCk7CisJCWZyZWVfZXh0ZW50X2J1ZmZlcihsZWZ0KTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworLyogTm9kZSBiYWxhbmNpbmcgZm9yIGluc2VydGlvbi4gIEhlcmUgd2Ugb25seSBzcGxpdCBvciBwdXNoIG5vZGVzIGFyb3VuZAorICogd2hlbiB0aGV5IGFyZSBjb21wbGV0ZWx5IGZ1bGwuICBUaGlzIGlzIGFsc28gZG9uZSB0b3AgZG93biwgc28gd2UKKyAqIGhhdmUgdG8gYmUgcGVzc2ltaXN0aWMuCisgKi8KK3N0YXRpYyBub2lubGluZSBpbnQgcHVzaF9ub2Rlc19mb3JfaW5zZXJ0KHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAorCQkJCQkgIHN0cnVjdCBidHJmc19yb290ICpyb290LAorCQkJCQkgIHN0cnVjdCBidHJmc19wYXRoICpwYXRoLCBpbnQgbGV2ZWwpCit7CisJc3RydWN0IGV4dGVudF9idWZmZXIgKnJpZ2h0ID0gTlVMTDsKKwlzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqbWlkOworCXN0cnVjdCBleHRlbnRfYnVmZmVyICpsZWZ0ID0gTlVMTDsKKwlzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqcGFyZW50ID0gTlVMTDsKKwlpbnQgcmV0ID0gMDsKKwlpbnQgd3JldDsKKwlpbnQgcHNsb3Q7CisJaW50IG9yaWdfc2xvdCA9IHBhdGgtPnNsb3RzW2xldmVsXTsKKwl1NjQgb3JpZ19wdHI7CisKKwlpZiAobGV2ZWwgPT0gMCkKKwkJcmV0dXJuIDE7CisKKwltaWQgPSBwYXRoLT5ub2Rlc1tsZXZlbF07CisJV0FSTl9PTihidHJmc19oZWFkZXJfZ2VuZXJhdGlvbihtaWQpICE9IHRyYW5zLT50cmFuc2lkKTsKKwlvcmlnX3B0ciA9IGJ0cmZzX25vZGVfYmxvY2twdHIobWlkLCBvcmlnX3Nsb3QpOworCisJaWYgKGxldmVsIDwgQlRSRlNfTUFYX0xFVkVMIC0gMSkKKwkJcGFyZW50ID0gcGF0aC0+bm9kZXNbbGV2ZWwgKyAxXTsKKwlwc2xvdCA9IHBhdGgtPnNsb3RzW2xldmVsICsgMV07CisKKwlpZiAoIXBhcmVudCkKKwkJcmV0dXJuIDE7CisKKwlsZWZ0ID0gcmVhZF9ub2RlX3Nsb3Qocm9vdCwgcGFyZW50LCBwc2xvdCAtIDEpOworCisJLyogZmlyc3QsIHRyeSB0byBtYWtlIHNvbWUgcm9vbSBpbiB0aGUgbWlkZGxlIGJ1ZmZlciAqLworCWlmIChsZWZ0KSB7CisJCXUzMiBsZWZ0X25yOworCisJCWJ0cmZzX3RyZWVfbG9jayhsZWZ0KTsKKwkJbGVmdF9uciA9IGJ0cmZzX2hlYWRlcl9ucml0ZW1zKGxlZnQpOworCQlpZiAobGVmdF9uciA+PSBCVFJGU19OT0RFUFRSU19QRVJfQkxPQ0socm9vdCkgLSAxKSB7CisJCQl3cmV0ID0gMTsKKwkJfSBlbHNlIHsKKwkJCXJldCA9IGJ0cmZzX2Nvd19ibG9jayh0cmFucywgcm9vdCwgbGVmdCwgcGFyZW50LAorCQkJCQkgICAgICBwc2xvdCAtIDEsICZsZWZ0LCAwKTsKKwkJCWlmIChyZXQpCisJCQkJd3JldCA9IDE7CisJCQllbHNlIHsKKwkJCQl3cmV0ID0gcHVzaF9ub2RlX2xlZnQodHJhbnMsIHJvb3QsCisJCQkJCQkgICAgICBsZWZ0LCBtaWQsIDApOworCQkJfQorCQl9CisJCWlmICh3cmV0IDwgMCkKKwkJCXJldCA9IHdyZXQ7CisJCWlmICh3cmV0ID09IDApIHsKKwkJCXN0cnVjdCBidHJmc19kaXNrX2tleSBkaXNrX2tleTsKKwkJCW9yaWdfc2xvdCArPSBsZWZ0X25yOworCQkJYnRyZnNfbm9kZV9rZXkobWlkLCAmZGlza19rZXksIDApOworCQkJYnRyZnNfc2V0X25vZGVfa2V5KHBhcmVudCwgJmRpc2tfa2V5LCBwc2xvdCk7CisJCQlidHJmc19tYXJrX2J1ZmZlcl9kaXJ0eShwYXJlbnQpOworCQkJaWYgKGJ0cmZzX2hlYWRlcl9ucml0ZW1zKGxlZnQpID4gb3JpZ19zbG90KSB7CisJCQkJcGF0aC0+bm9kZXNbbGV2ZWxdID0gbGVmdDsKKwkJCQlwYXRoLT5zbG90c1tsZXZlbCArIDFdIC09IDE7CisJCQkJcGF0aC0+c2xvdHNbbGV2ZWxdID0gb3JpZ19zbG90OworCQkJCWJ0cmZzX3RyZWVfdW5sb2NrKG1pZCk7CisJCQkJZnJlZV9leHRlbnRfYnVmZmVyKG1pZCk7CisJCQl9IGVsc2UgeworCQkJCW9yaWdfc2xvdCAtPQorCQkJCQlidHJmc19oZWFkZXJfbnJpdGVtcyhsZWZ0KTsKKwkJCQlwYXRoLT5zbG90c1tsZXZlbF0gPSBvcmlnX3Nsb3Q7CisJCQkJYnRyZnNfdHJlZV91bmxvY2sobGVmdCk7CisJCQkJZnJlZV9leHRlbnRfYnVmZmVyKGxlZnQpOworCQkJfQorCQkJcmV0dXJuIDA7CisJCX0KKwkJYnRyZnNfdHJlZV91bmxvY2sobGVmdCk7CisJCWZyZWVfZXh0ZW50X2J1ZmZlcihsZWZ0KTsKKwl9CisJcmlnaHQgPSByZWFkX25vZGVfc2xvdChyb290LCBwYXJlbnQsIHBzbG90ICsgMSk7CisKKwkvKgorCSAqIHRoZW4gdHJ5IHRvIGVtcHR5IHRoZSByaWdodCBtb3N0IGJ1ZmZlciBpbnRvIHRoZSBtaWRkbGUKKwkgKi8KKwlpZiAocmlnaHQpIHsKKwkJdTMyIHJpZ2h0X25yOworCQlidHJmc190cmVlX2xvY2socmlnaHQpOworCQlyaWdodF9uciA9IGJ0cmZzX2hlYWRlcl9ucml0ZW1zKHJpZ2h0KTsKKwkJaWYgKHJpZ2h0X25yID49IEJUUkZTX05PREVQVFJTX1BFUl9CTE9DSyhyb290KSAtIDEpIHsKKwkJCXdyZXQgPSAxOworCQl9IGVsc2UgeworCQkJcmV0ID0gYnRyZnNfY293X2Jsb2NrKHRyYW5zLCByb290LCByaWdodCwKKwkJCQkJICAgICAgcGFyZW50LCBwc2xvdCArIDEsCisJCQkJCSAgICAgICZyaWdodCwgMCk7CisJCQlpZiAocmV0KQorCQkJCXdyZXQgPSAxOworCQkJZWxzZSB7CisJCQkJd3JldCA9IGJhbGFuY2Vfbm9kZV9yaWdodCh0cmFucywgcm9vdCwKKwkJCQkJCQkgIHJpZ2h0LCBtaWQpOworCQkJfQorCQl9CisJCWlmICh3cmV0IDwgMCkKKwkJCXJldCA9IHdyZXQ7CisJCWlmICh3cmV0ID09IDApIHsKKwkJCXN0cnVjdCBidHJmc19kaXNrX2tleSBkaXNrX2tleTsKKworCQkJYnRyZnNfbm9kZV9rZXkocmlnaHQsICZkaXNrX2tleSwgMCk7CisJCQlidHJmc19zZXRfbm9kZV9rZXkocGFyZW50LCAmZGlza19rZXksIHBzbG90ICsgMSk7CisJCQlidHJmc19tYXJrX2J1ZmZlcl9kaXJ0eShwYXJlbnQpOworCisJCQlpZiAoYnRyZnNfaGVhZGVyX25yaXRlbXMobWlkKSA8PSBvcmlnX3Nsb3QpIHsKKwkJCQlwYXRoLT5ub2Rlc1tsZXZlbF0gPSByaWdodDsKKwkJCQlwYXRoLT5zbG90c1tsZXZlbCArIDFdICs9IDE7CisJCQkJcGF0aC0+c2xvdHNbbGV2ZWxdID0gb3JpZ19zbG90IC0KKwkJCQkJYnRyZnNfaGVhZGVyX25yaXRlbXMobWlkKTsKKwkJCQlidHJmc190cmVlX3VubG9jayhtaWQpOworCQkJCWZyZWVfZXh0ZW50X2J1ZmZlcihtaWQpOworCQkJfSBlbHNlIHsKKwkJCQlidHJmc190cmVlX3VubG9jayhyaWdodCk7CisJCQkJZnJlZV9leHRlbnRfYnVmZmVyKHJpZ2h0KTsKKwkJCX0KKwkJCXJldHVybiAwOworCQl9CisJCWJ0cmZzX3RyZWVfdW5sb2NrKHJpZ2h0KTsKKwkJZnJlZV9leHRlbnRfYnVmZmVyKHJpZ2h0KTsKKwl9CisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiByZWFkYWhlYWQgb25lIGZ1bGwgbm9kZSBvZiBsZWF2ZXMsIGZpbmRpbmcgdGhpbmdzIHRoYXQgYXJlIGNsb3NlCisgKiB0byB0aGUgYmxvY2sgaW4gJ3Nsb3QnLCBhbmQgdHJpZ2dlcmluZyByYSBvbiB0aGVtLgorICovCitzdGF0aWMgbm9pbmxpbmUgdm9pZCByZWFkYV9mb3Jfc2VhcmNoKHN0cnVjdCBidHJmc19yb290ICpyb290LAorCQkJCSAgICAgIHN0cnVjdCBidHJmc19wYXRoICpwYXRoLAorCQkJCSAgICAgIGludCBsZXZlbCwgaW50IHNsb3QsIHU2NCBvYmplY3RpZCkKK3sKKwlzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqbm9kZTsKKwlzdHJ1Y3QgYnRyZnNfZGlza19rZXkgZGlza19rZXk7CisJdTMyIG5yaXRlbXM7CisJdTY0IHNlYXJjaDsKKwl1NjQgbG93ZXN0X3JlYWQ7CisJdTY0IGhpZ2hlc3RfcmVhZDsKKwl1NjQgbnJlYWQgPSAwOworCWludCBkaXJlY3Rpb24gPSBwYXRoLT5yZWFkYTsKKwlzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqZWI7CisJdTMyIG5yOworCXUzMiBibG9ja3NpemU7CisJdTMyIG5zY2FuID0gMDsKKworCWlmIChsZXZlbCAhPSAxKQorCQlyZXR1cm47CisKKwlpZiAoIXBhdGgtPm5vZGVzW2xldmVsXSkKKwkJcmV0dXJuOworCisJbm9kZSA9IHBhdGgtPm5vZGVzW2xldmVsXTsKKworCXNlYXJjaCA9IGJ0cmZzX25vZGVfYmxvY2twdHIobm9kZSwgc2xvdCk7CisJYmxvY2tzaXplID0gYnRyZnNfbGV2ZWxfc2l6ZShyb290LCBsZXZlbCAtIDEpOworCWViID0gYnRyZnNfZmluZF90cmVlX2Jsb2NrKHJvb3QsIHNlYXJjaCwgYmxvY2tzaXplKTsKKwlpZiAoZWIpIHsKKwkJZnJlZV9leHRlbnRfYnVmZmVyKGViKTsKKwkJcmV0dXJuOworCX0KKworCWhpZ2hlc3RfcmVhZCA9IHNlYXJjaDsKKwlsb3dlc3RfcmVhZCA9IHNlYXJjaDsKKworCW5yaXRlbXMgPSBidHJmc19oZWFkZXJfbnJpdGVtcyhub2RlKTsKKwluciA9IHNsb3Q7CisJd2hpbGUgKDEpIHsKKwkJaWYgKGRpcmVjdGlvbiA8IDApIHsKKwkJCWlmIChuciA9PSAwKQorCQkJCWJyZWFrOworCQkJbnItLTsKKwkJfSBlbHNlIGlmIChkaXJlY3Rpb24gPiAwKSB7CisJCQlucisrOworCQkJaWYgKG5yID49IG5yaXRlbXMpCisJCQkJYnJlYWs7CisJCX0KKwkJaWYgKHBhdGgtPnJlYWRhIDwgMCAmJiBvYmplY3RpZCkgeworCQkJYnRyZnNfbm9kZV9rZXkobm9kZSwgJmRpc2tfa2V5LCBucik7CisJCQlpZiAoYnRyZnNfZGlza19rZXlfb2JqZWN0aWQoJmRpc2tfa2V5KSAhPSBvYmplY3RpZCkKKwkJCQlicmVhazsKKwkJfQorCQlzZWFyY2ggPSBidHJmc19ub2RlX2Jsb2NrcHRyKG5vZGUsIG5yKTsKKwkJaWYgKChzZWFyY2ggPj0gbG93ZXN0X3JlYWQgJiYgc2VhcmNoIDw9IGhpZ2hlc3RfcmVhZCkgfHwKKwkJICAgIChzZWFyY2ggPCBsb3dlc3RfcmVhZCAmJiBsb3dlc3RfcmVhZCAtIHNlYXJjaCA8PSAxNjM4NCkgfHwKKwkJICAgIChzZWFyY2ggPiBoaWdoZXN0X3JlYWQgJiYgc2VhcmNoIC0gaGlnaGVzdF9yZWFkIDw9IDE2Mzg0KSkgeworCQkJcmVhZGFoZWFkX3RyZWVfYmxvY2socm9vdCwgc2VhcmNoLCBibG9ja3NpemUsCisJCQkJICAgICBidHJmc19ub2RlX3B0cl9nZW5lcmF0aW9uKG5vZGUsIG5yKSk7CisJCQlucmVhZCArPSBibG9ja3NpemU7CisJCX0KKwkJbnNjYW4rKzsKKwkJaWYgKHBhdGgtPnJlYWRhIDwgMiAmJiAobnJlYWQgPiAoNjQgKiAxMDI0KSB8fCBuc2NhbiA+IDMyKSkKKwkJCWJyZWFrOworCisJCWlmIChucmVhZCA+ICgyNTYgKiAxMDI0KSB8fCBuc2NhbiA+IDEyOCkKKwkJCWJyZWFrOworCisJCWlmIChzZWFyY2ggPCBsb3dlc3RfcmVhZCkKKwkJCWxvd2VzdF9yZWFkID0gc2VhcmNoOworCQlpZiAoc2VhcmNoID4gaGlnaGVzdF9yZWFkKQorCQkJaGlnaGVzdF9yZWFkID0gc2VhcmNoOworCX0KK30KKworLyoKKyAqIHdoZW4gd2Ugd2FsayBkb3duIHRoZSB0cmVlLCBpdCBpcyB1c3VhbGx5IHNhZmUgdG8gdW5sb2NrIHRoZSBoaWdoZXIgbGF5ZXJzCisgKiBpbiB0aGUgdHJlZS4gIFRoZSBleGNlcHRpb25zIGFyZSB3aGVuIG91ciBwYXRoIGdvZXMgdGhyb3VnaCBzbG90IDAsIGJlY2F1c2UKKyAqIG9wZXJhdGlvbnMgb24gdGhlIHRyZWUgbWlnaHQgcmVxdWlyZSBjaGFuZ2luZyBrZXkgcG9pbnRlcnMgaGlnaGVyIHVwIGluIHRoZQorICogdHJlZS4KKyAqCisgKiBjYWxsZXJzIG1pZ2h0IGFsc28gaGF2ZSBzZXQgcGF0aC0+a2VlcF9sb2Nrcywgd2hpY2ggdGVsbHMgdGhpcyBjb2RlIHRvIGtlZXAKKyAqIHRoZSBsb2NrIGlmIHRoZSBwYXRoIHBvaW50cyB0byB0aGUgbGFzdCBzbG90IGluIHRoZSBibG9jay4gIFRoaXMgaXMgcGFydCBvZgorICogd2Fsa2luZyB0aHJvdWdoIHRoZSB0cmVlLCBhbmQgc2VsZWN0aW5nIHRoZSBuZXh0IHNsb3QgaW4gdGhlIGhpZ2hlciBibG9jay4KKyAqCisgKiBsb3dlc3RfdW5sb2NrIHNldHMgdGhlIGxvd2VzdCBsZXZlbCBpbiB0aGUgdHJlZSB3ZSdyZSBhbGxvd2VkIHRvIHVubG9jay4gIHNvCisgKiBpZiBsb3dlc3RfdW5sb2NrIGlzIDEsIGxldmVsIDAgd29uJ3QgYmUgdW5sb2NrZWQKKyAqLworc3RhdGljIG5vaW5saW5lIHZvaWQgdW5sb2NrX3VwKHN0cnVjdCBidHJmc19wYXRoICpwYXRoLCBpbnQgbGV2ZWwsCisJCQkgICAgICAgaW50IGxvd2VzdF91bmxvY2spCit7CisJaW50IGk7CisJaW50IHNraXBfbGV2ZWwgPSBsZXZlbDsKKwlpbnQgbm9fc2tpcHMgPSAwOworCXN0cnVjdCBleHRlbnRfYnVmZmVyICp0OworCisJZm9yIChpID0gbGV2ZWw7IGkgPCBCVFJGU19NQVhfTEVWRUw7IGkrKykgeworCQlpZiAoIXBhdGgtPm5vZGVzW2ldKQorCQkJYnJlYWs7CisJCWlmICghcGF0aC0+bG9ja3NbaV0pCisJCQlicmVhazsKKwkJaWYgKCFub19za2lwcyAmJiBwYXRoLT5zbG90c1tpXSA9PSAwKSB7CisJCQlza2lwX2xldmVsID0gaSArIDE7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIW5vX3NraXBzICYmIHBhdGgtPmtlZXBfbG9ja3MpIHsKKwkJCXUzMiBucml0ZW1zOworCQkJdCA9IHBhdGgtPm5vZGVzW2ldOworCQkJbnJpdGVtcyA9IGJ0cmZzX2hlYWRlcl9ucml0ZW1zKHQpOworCQkJaWYgKG5yaXRlbXMgPCAxIHx8IHBhdGgtPnNsb3RzW2ldID49IG5yaXRlbXMgLSAxKSB7CisJCQkJc2tpcF9sZXZlbCA9IGkgKyAxOworCQkJCWNvbnRpbnVlOworCQkJfQorCQl9CisJCWlmIChza2lwX2xldmVsIDwgaSAmJiBpID49IGxvd2VzdF91bmxvY2spCisJCQlub19za2lwcyA9IDE7CisKKwkJdCA9IHBhdGgtPm5vZGVzW2ldOworCQlpZiAoaSA+PSBsb3dlc3RfdW5sb2NrICYmIGkgPiBza2lwX2xldmVsICYmIHBhdGgtPmxvY2tzW2ldKSB7CisJCQlidHJmc190cmVlX3VubG9jayh0KTsKKwkJCXBhdGgtPmxvY2tzW2ldID0gMDsKKwkJfQorCX0KK30KKworLyoKKyAqIGxvb2sgZm9yIGtleSBpbiB0aGUgdHJlZS4gIHBhdGggaXMgZmlsbGVkIGluIHdpdGggbm9kZXMgYWxvbmcgdGhlIHdheQorICogaWYga2V5IGlzIGZvdW5kLCB3ZSByZXR1cm4gemVybyBhbmQgeW91IGNhbiBmaW5kIHRoZSBpdGVtIGluIHRoZSBsZWFmCisgKiBsZXZlbCBvZiB0aGUgcGF0aCAobGV2ZWwgMCkKKyAqCisgKiBJZiB0aGUga2V5IGlzbid0IGZvdW5kLCB0aGUgcGF0aCBwb2ludHMgdG8gdGhlIHNsb3Qgd2hlcmUgaXQgc2hvdWxkCisgKiBiZSBpbnNlcnRlZCwgYW5kIDEgaXMgcmV0dXJuZWQuICBJZiB0aGVyZSBhcmUgb3RoZXIgZXJyb3JzIGR1cmluZyB0aGUKKyAqIHNlYXJjaCBhIG5lZ2F0aXZlIGVycm9yIG51bWJlciBpcyByZXR1cm5lZC4KKyAqCisgKiBpZiBpbnNfbGVuID4gMCwgbm9kZXMgYW5kIGxlYXZlcyB3aWxsIGJlIHNwbGl0IGFzIHdlIHdhbGsgZG93biB0aGUKKyAqIHRyZWUuICBpZiBpbnNfbGVuIDwgMCwgbm9kZXMgd2lsbCBiZSBtZXJnZWQgYXMgd2Ugd2FsayBkb3duIHRoZSB0cmVlIChpZgorICogcG9zc2libGUpCisgKi8KK2ludCBidHJmc19zZWFyY2hfc2xvdChzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywgc3RydWN0IGJ0cmZzX3Jvb3QKKwkJICAgICAgKnJvb3QsIHN0cnVjdCBidHJmc19rZXkgKmtleSwgc3RydWN0IGJ0cmZzX3BhdGggKnAsIGludAorCQkgICAgICBpbnNfbGVuLCBpbnQgY293KQoreworCXN0cnVjdCBleHRlbnRfYnVmZmVyICpiOworCXN0cnVjdCBleHRlbnRfYnVmZmVyICp0bXA7CisJaW50IHNsb3Q7CisJaW50IHJldDsKKwlpbnQgbGV2ZWw7CisJaW50IHNob3VsZF9yZWFkYSA9IHAtPnJlYWRhOworCWludCBsb3dlc3RfdW5sb2NrID0gMTsKKwlpbnQgYmxvY2tzaXplOworCXU4IGxvd2VzdF9sZXZlbCA9IDA7CisJdTY0IGJsb2NrbnI7CisJdTY0IGdlbjsKKwlzdHJ1Y3QgYnRyZnNfa2V5IHByZWFsbG9jX2Jsb2NrOworCisJbG93ZXN0X2xldmVsID0gcC0+bG93ZXN0X2xldmVsOworCVdBUk5fT04obG93ZXN0X2xldmVsICYmIGluc19sZW4gPiAwKTsKKwlXQVJOX09OKHAtPm5vZGVzWzBdICE9IE5VTEwpOworCisJaWYgKGluc19sZW4gPCAwKQorCQlsb3dlc3RfdW5sb2NrID0gMjsKKworCXByZWFsbG9jX2Jsb2NrLm9iamVjdGlkID0gMDsKKworYWdhaW46CisJaWYgKHAtPnNraXBfbG9ja2luZykKKwkJYiA9IGJ0cmZzX3Jvb3Rfbm9kZShyb290KTsKKwllbHNlCisJCWIgPSBidHJmc19sb2NrX3Jvb3Rfbm9kZShyb290KTsKKworCXdoaWxlIChiKSB7CisJCWxldmVsID0gYnRyZnNfaGVhZGVyX2xldmVsKGIpOworCisJCS8qCisJCSAqIHNldHVwIHRoZSBwYXRoIGhlcmUgc28gd2UgY2FuIHJlbGVhc2UgaXQgdW5kZXIgbG9jaworCQkgKiBjb250ZW50aW9uIHdpdGggdGhlIGNvdyBjb2RlCisJCSAqLworCQlwLT5ub2Rlc1tsZXZlbF0gPSBiOworCQlpZiAoIXAtPnNraXBfbG9ja2luZykKKwkJCXAtPmxvY2tzW2xldmVsXSA9IDE7CisKKwkJaWYgKGNvdykgeworCQkJaW50IHdyZXQ7CisKKwkJCS8qIGlzIGEgY293IG9uIHRoaXMgYmxvY2sgbm90IHJlcXVpcmVkICovCisJCQlzcGluX2xvY2soJnJvb3QtPmZzX2luZm8tPmhhc2hfbG9jayk7CisJCQlpZiAoYnRyZnNfaGVhZGVyX2dlbmVyYXRpb24oYikgPT0gdHJhbnMtPnRyYW5zaWQgJiYKKwkJCSAgICBidHJmc19oZWFkZXJfb3duZXIoYikgPT0gcm9vdC0+cm9vdF9rZXkub2JqZWN0aWQgJiYKKwkJCSAgICAhYnRyZnNfaGVhZGVyX2ZsYWcoYiwgQlRSRlNfSEVBREVSX0ZMQUdfV1JJVFRFTikpIHsKKwkJCQlzcGluX3VubG9jaygmcm9vdC0+ZnNfaW5mby0+aGFzaF9sb2NrKTsKKwkJCQlnb3RvIGNvd19kb25lOworCQkJfQorCQkJc3Bpbl91bmxvY2soJnJvb3QtPmZzX2luZm8tPmhhc2hfbG9jayk7CisKKwkJCS8qIG9rLCB3ZSBoYXZlIHRvIGNvdywgaXMgb3VyIG9sZCBwcmVhbGxvYyB0aGUgcmlnaHQKKwkJCSAqIHNpemU/CisJCQkgKi8KKwkJCWlmIChwcmVhbGxvY19ibG9jay5vYmplY3RpZCAmJgorCQkJICAgIHByZWFsbG9jX2Jsb2NrLm9mZnNldCAhPSBiLT5sZW4pIHsKKwkJCQlidHJmc19mcmVlX3Jlc2VydmVkX2V4dGVudChyb290LAorCQkJCQkgICBwcmVhbGxvY19ibG9jay5vYmplY3RpZCwKKwkJCQkJICAgcHJlYWxsb2NfYmxvY2sub2Zmc2V0KTsKKwkJCQlwcmVhbGxvY19ibG9jay5vYmplY3RpZCA9IDA7CisJCQl9CisKKwkJCS8qCisJCQkgKiBmb3IgaGlnaGVyIGxldmVsIGJsb2NrcywgdHJ5IG5vdCB0byBhbGxvY2F0ZSBibG9ja3MKKwkJCSAqIHdpdGggdGhlIGJsb2NrIGFuZCB0aGUgcGFyZW50IGxvY2tzIGhlbGQuCisJCQkgKi8KKwkJCWlmIChsZXZlbCA+IDEgJiYgIXByZWFsbG9jX2Jsb2NrLm9iamVjdGlkICYmCisJCQkgICAgYnRyZnNfcGF0aF9sb2NrX3dhaXRpbmcocCwgbGV2ZWwpKSB7CisJCQkJdTMyIHNpemUgPSBiLT5sZW47CisJCQkJdTY0IGhpbnQgPSBiLT5zdGFydDsKKworCQkJCWJ0cmZzX3JlbGVhc2VfcGF0aChyb290LCBwKTsKKwkJCQlyZXQgPSBidHJmc19yZXNlcnZlX2V4dGVudCh0cmFucywgcm9vdCwKKwkJCQkJCQkgICBzaXplLCBzaXplLCAwLAorCQkJCQkJCSAgIGhpbnQsICh1NjQpLTEsCisJCQkJCQkJICAgJnByZWFsbG9jX2Jsb2NrLCAwKTsKKwkJCQlCVUdfT04ocmV0KTsKKwkJCQlnb3RvIGFnYWluOworCQkJfQorCisJCQl3cmV0ID0gYnRyZnNfY293X2Jsb2NrKHRyYW5zLCByb290LCBiLAorCQkJCQkgICAgICAgcC0+bm9kZXNbbGV2ZWwgKyAxXSwKKwkJCQkJICAgICAgIHAtPnNsb3RzW2xldmVsICsgMV0sCisJCQkJCSAgICAgICAmYiwgcHJlYWxsb2NfYmxvY2sub2JqZWN0aWQpOworCQkJcHJlYWxsb2NfYmxvY2sub2JqZWN0aWQgPSAwOworCQkJaWYgKHdyZXQpIHsKKwkJCQlmcmVlX2V4dGVudF9idWZmZXIoYik7CisJCQkJcmV0ID0gd3JldDsKKwkJCQlnb3RvIGRvbmU7CisJCQl9CisJCX0KK2Nvd19kb25lOgorCQlCVUdfT04oIWNvdyAmJiBpbnNfbGVuKTsKKwkJaWYgKGxldmVsICE9IGJ0cmZzX2hlYWRlcl9sZXZlbChiKSkKKwkJCVdBUk5fT04oMSk7CisJCWxldmVsID0gYnRyZnNfaGVhZGVyX2xldmVsKGIpOworCisJCXAtPm5vZGVzW2xldmVsXSA9IGI7CisJCWlmICghcC0+c2tpcF9sb2NraW5nKQorCQkJcC0+bG9ja3NbbGV2ZWxdID0gMTsKKworCQlyZXQgPSBjaGVja19ibG9jayhyb290LCBwLCBsZXZlbCk7CisJCWlmIChyZXQpIHsKKwkJCXJldCA9IC0xOworCQkJZ290byBkb25lOworCQl9CisKKwkJcmV0ID0gYmluX3NlYXJjaChiLCBrZXksIGxldmVsLCAmc2xvdCk7CisJCWlmIChsZXZlbCAhPSAwKSB7CisJCQlpZiAocmV0ICYmIHNsb3QgPiAwKQorCQkJCXNsb3QgLT0gMTsKKwkJCXAtPnNsb3RzW2xldmVsXSA9IHNsb3Q7CisJCQlpZiAoKHAtPnNlYXJjaF9mb3Jfc3BsaXQgfHwgaW5zX2xlbiA+IDApICYmCisJCQkgICAgYnRyZnNfaGVhZGVyX25yaXRlbXMoYikgPj0KKwkJCSAgICBCVFJGU19OT0RFUFRSU19QRVJfQkxPQ0socm9vdCkgLSAzKSB7CisJCQkJaW50IHNyZXQgPSBzcGxpdF9ub2RlKHRyYW5zLCByb290LCBwLCBsZXZlbCk7CisJCQkJQlVHX09OKHNyZXQgPiAwKTsKKwkJCQlpZiAoc3JldCkgeworCQkJCQlyZXQgPSBzcmV0OworCQkJCQlnb3RvIGRvbmU7CisJCQkJfQorCQkJCWIgPSBwLT5ub2Rlc1tsZXZlbF07CisJCQkJc2xvdCA9IHAtPnNsb3RzW2xldmVsXTsKKwkJCX0gZWxzZSBpZiAoaW5zX2xlbiA8IDApIHsKKwkJCQlpbnQgc3JldCA9IGJhbGFuY2VfbGV2ZWwodHJhbnMsIHJvb3QsIHAsCisJCQkJCQkJIGxldmVsKTsKKwkJCQlpZiAoc3JldCkgeworCQkJCQlyZXQgPSBzcmV0OworCQkJCQlnb3RvIGRvbmU7CisJCQkJfQorCQkJCWIgPSBwLT5ub2Rlc1tsZXZlbF07CisJCQkJaWYgKCFiKSB7CisJCQkJCWJ0cmZzX3JlbGVhc2VfcGF0aChOVUxMLCBwKTsKKwkJCQkJZ290byBhZ2FpbjsKKwkJCQl9CisJCQkJc2xvdCA9IHAtPnNsb3RzW2xldmVsXTsKKwkJCQlCVUdfT04oYnRyZnNfaGVhZGVyX25yaXRlbXMoYikgPT0gMSk7CisJCQl9CisJCQl1bmxvY2tfdXAocCwgbGV2ZWwsIGxvd2VzdF91bmxvY2spOworCisJCQkvKiB0aGlzIGlzIG9ubHkgdHJ1ZSB3aGlsZSBkcm9wcGluZyBhIHNuYXBzaG90ICovCisJCQlpZiAobGV2ZWwgPT0gbG93ZXN0X2xldmVsKSB7CisJCQkJcmV0ID0gMDsKKwkJCQlnb3RvIGRvbmU7CisJCQl9CisKKwkJCWJsb2NrbnIgPSBidHJmc19ub2RlX2Jsb2NrcHRyKGIsIHNsb3QpOworCQkJZ2VuID0gYnRyZnNfbm9kZV9wdHJfZ2VuZXJhdGlvbihiLCBzbG90KTsKKwkJCWJsb2Nrc2l6ZSA9IGJ0cmZzX2xldmVsX3NpemUocm9vdCwgbGV2ZWwgLSAxKTsKKworCQkJdG1wID0gYnRyZnNfZmluZF90cmVlX2Jsb2NrKHJvb3QsIGJsb2NrbnIsIGJsb2Nrc2l6ZSk7CisJCQlpZiAodG1wICYmIGJ0cmZzX2J1ZmZlcl91cHRvZGF0ZSh0bXAsIGdlbikpIHsKKwkJCQliID0gdG1wOworCQkJfSBlbHNlIHsKKwkJCQkvKgorCQkJCSAqIHJlZHVjZSBsb2NrIGNvbnRlbnRpb24gYXQgaGlnaCBsZXZlbHMKKwkJCQkgKiBvZiB0aGUgYnRyZWUgYnkgZHJvcHBpbmcgbG9ja3MgYmVmb3JlCisJCQkJICogd2UgcmVhZC4KKwkJCQkgKi8KKwkJCQlpZiAobGV2ZWwgPiAxKSB7CisJCQkJCWJ0cmZzX3JlbGVhc2VfcGF0aChOVUxMLCBwKTsKKwkJCQkJaWYgKHRtcCkKKwkJCQkJCWZyZWVfZXh0ZW50X2J1ZmZlcih0bXApOworCQkJCQlpZiAoc2hvdWxkX3JlYWRhKQorCQkJCQkJcmVhZGFfZm9yX3NlYXJjaChyb290LCBwLAorCQkJCQkJCQkgbGV2ZWwsIHNsb3QsCisJCQkJCQkJCSBrZXktPm9iamVjdGlkKTsKKworCQkJCQl0bXAgPSByZWFkX3RyZWVfYmxvY2socm9vdCwgYmxvY2tuciwKKwkJCQkJCQkgYmxvY2tzaXplLCBnZW4pOworCQkJCQlpZiAodG1wKQorCQkJCQkJZnJlZV9leHRlbnRfYnVmZmVyKHRtcCk7CisJCQkJCWdvdG8gYWdhaW47CisJCQkJfSBlbHNlIHsKKwkJCQkJaWYgKHRtcCkKKwkJCQkJCWZyZWVfZXh0ZW50X2J1ZmZlcih0bXApOworCQkJCQlpZiAoc2hvdWxkX3JlYWRhKQorCQkJCQkJcmVhZGFfZm9yX3NlYXJjaChyb290LCBwLAorCQkJCQkJCQkgbGV2ZWwsIHNsb3QsCisJCQkJCQkJCSBrZXktPm9iamVjdGlkKTsKKwkJCQkJYiA9IHJlYWRfbm9kZV9zbG90KHJvb3QsIGIsIHNsb3QpOworCQkJCX0KKwkJCX0KKwkJCWlmICghcC0+c2tpcF9sb2NraW5nKQorCQkJCWJ0cmZzX3RyZWVfbG9jayhiKTsKKwkJfSBlbHNlIHsKKwkJCXAtPnNsb3RzW2xldmVsXSA9IHNsb3Q7CisJCQlpZiAoaW5zX2xlbiA+IDAgJiYKKwkJCSAgICBidHJmc19sZWFmX2ZyZWVfc3BhY2Uocm9vdCwgYikgPCBpbnNfbGVuKSB7CisJCQkJaW50IHNyZXQgPSBzcGxpdF9sZWFmKHRyYW5zLCByb290LCBrZXksCisJCQkJCQkgICAgICBwLCBpbnNfbGVuLCByZXQgPT0gMCk7CisJCQkJQlVHX09OKHNyZXQgPiAwKTsKKwkJCQlpZiAoc3JldCkgeworCQkJCQlyZXQgPSBzcmV0OworCQkJCQlnb3RvIGRvbmU7CisJCQkJfQorCQkJfQorCQkJaWYgKCFwLT5zZWFyY2hfZm9yX3NwbGl0KQorCQkJCXVubG9ja191cChwLCBsZXZlbCwgbG93ZXN0X3VubG9jayk7CisJCQlnb3RvIGRvbmU7CisJCX0KKwl9CisJcmV0ID0gMTsKK2RvbmU6CisJaWYgKHByZWFsbG9jX2Jsb2NrLm9iamVjdGlkKSB7CisJCWJ0cmZzX2ZyZWVfcmVzZXJ2ZWRfZXh0ZW50KHJvb3QsCisJCQkgICBwcmVhbGxvY19ibG9jay5vYmplY3RpZCwKKwkJCSAgIHByZWFsbG9jX2Jsb2NrLm9mZnNldCk7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworaW50IGJ0cmZzX21lcmdlX3BhdGgoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCisJCSAgICAgc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsCisJCSAgICAgc3RydWN0IGJ0cmZzX2tleSAqbm9kZV9rZXlzLAorCQkgICAgIHU2NCAqbm9kZXMsIGludCBsb3dlc3RfbGV2ZWwpCit7CisJc3RydWN0IGV4dGVudF9idWZmZXIgKmViOworCXN0cnVjdCBleHRlbnRfYnVmZmVyICpwYXJlbnQ7CisJc3RydWN0IGJ0cmZzX2tleSBrZXk7CisJdTY0IGJ5dGVucjsKKwl1NjQgZ2VuZXJhdGlvbjsKKwl1MzIgYmxvY2tzaXplOworCWludCBsZXZlbDsKKwlpbnQgc2xvdDsKKwlpbnQga2V5X21hdGNoOworCWludCByZXQ7CisKKwllYiA9IGJ0cmZzX2xvY2tfcm9vdF9ub2RlKHJvb3QpOworCXJldCA9IGJ0cmZzX2Nvd19ibG9jayh0cmFucywgcm9vdCwgZWIsIE5VTEwsIDAsICZlYiwgMCk7CisJQlVHX09OKHJldCk7CisKKwlwYXJlbnQgPSBlYjsKKwl3aGlsZSAoMSkgeworCQlsZXZlbCA9IGJ0cmZzX2hlYWRlcl9sZXZlbChwYXJlbnQpOworCQlpZiAobGV2ZWwgPT0gMCB8fCBsZXZlbCA8PSBsb3dlc3RfbGV2ZWwpCisJCQlicmVhazsKKworCQlyZXQgPSBiaW5fc2VhcmNoKHBhcmVudCwgJm5vZGVfa2V5c1tsb3dlc3RfbGV2ZWxdLCBsZXZlbCwKKwkJCQkgJnNsb3QpOworCQlpZiAocmV0ICYmIHNsb3QgPiAwKQorCQkJc2xvdC0tOworCisJCWJ5dGVuciA9IGJ0cmZzX25vZGVfYmxvY2twdHIocGFyZW50LCBzbG90KTsKKwkJaWYgKG5vZGVzW2xldmVsIC0gMV0gPT0gYnl0ZW5yKQorCQkJYnJlYWs7CisKKwkJYmxvY2tzaXplID0gYnRyZnNfbGV2ZWxfc2l6ZShyb290LCBsZXZlbCAtIDEpOworCQlnZW5lcmF0aW9uID0gYnRyZnNfbm9kZV9wdHJfZ2VuZXJhdGlvbihwYXJlbnQsIHNsb3QpOworCQlidHJmc19ub2RlX2tleV90b19jcHUoZWIsICZrZXksIHNsb3QpOworCQlrZXlfbWF0Y2ggPSAhbWVtY21wKCZrZXksICZub2RlX2tleXNbbGV2ZWwgLSAxXSwgc2l6ZW9mKGtleSkpOworCisJCWlmIChnZW5lcmF0aW9uID09IHRyYW5zLT50cmFuc2lkKSB7CisJCQllYiA9IHJlYWRfdHJlZV9ibG9jayhyb290LCBieXRlbnIsIGJsb2Nrc2l6ZSwKKwkJCQkJICAgICBnZW5lcmF0aW9uKTsKKwkJCWJ0cmZzX3RyZWVfbG9jayhlYik7CisJCX0KKworCQkvKgorCQkgKiBpZiBub2RlIGtleXMgbWF0Y2ggYW5kIG5vZGUgcG9pbnRlciBoYXNuJ3QgYmVlbiBtb2RpZmllZAorCQkgKiBpbiB0aGUgcnVubmluZyB0cmFuc2FjdGlvbiwgd2UgY2FuIG1lcmdlIHRoZSBwYXRoLiBmb3IKKwkJICogYmxvY2tzIG93ZW5lZCBieSByZWxvYyB0cmVlcywgdGhlIG5vZGUgcG9pbnRlciBjaGVjayBpcworCQkgKiBza2lwcGVkLCB0aGlzIGlzIGJlY2F1c2UgdGhlc2UgYmxvY2tzIGFyZSBmdWxseSBjb250cm9sbGVkCisJCSAqIGJ5IHRoZSBzcGFjZSBiYWxhbmNlIGNvZGUsIG5vIG9uZSBlbHNlIGNhbiBtb2RpZnkgdGhlbS4KKwkJICovCisJCWlmICghbm9kZXNbbGV2ZWwgLSAxXSB8fCAha2V5X21hdGNoIHx8CisJCSAgICAoZ2VuZXJhdGlvbiA9PSB0cmFucy0+dHJhbnNpZCAmJgorCQkgICAgIGJ0cmZzX2hlYWRlcl9vd25lcihlYikgIT0gQlRSRlNfVFJFRV9SRUxPQ19PQkpFQ1RJRCkpIHsKKwkJCWlmIChsZXZlbCA9PSAxIHx8IGxldmVsID09IGxvd2VzdF9sZXZlbCArIDEpIHsKKwkJCQlpZiAoZ2VuZXJhdGlvbiA9PSB0cmFucy0+dHJhbnNpZCkgeworCQkJCQlidHJmc190cmVlX3VubG9jayhlYik7CisJCQkJCWZyZWVfZXh0ZW50X2J1ZmZlcihlYik7CisJCQkJfQorCQkJCWJyZWFrOworCQkJfQorCisJCQlpZiAoZ2VuZXJhdGlvbiAhPSB0cmFucy0+dHJhbnNpZCkgeworCQkJCWViID0gcmVhZF90cmVlX2Jsb2NrKHJvb3QsIGJ5dGVuciwgYmxvY2tzaXplLAorCQkJCQkJZ2VuZXJhdGlvbik7CisJCQkJYnRyZnNfdHJlZV9sb2NrKGViKTsKKwkJCX0KKworCQkJcmV0ID0gYnRyZnNfY293X2Jsb2NrKHRyYW5zLCByb290LCBlYiwgcGFyZW50LCBzbG90LAorCQkJCQkgICAgICAmZWIsIDApOworCQkJQlVHX09OKHJldCk7CisKKwkJCWlmIChyb290LT5yb290X2tleS5vYmplY3RpZCA9PQorCQkJICAgIEJUUkZTX1RSRUVfUkVMT0NfT0JKRUNUSUQpIHsKKwkJCQlpZiAoIW5vZGVzW2xldmVsIC0gMV0pIHsKKwkJCQkJbm9kZXNbbGV2ZWwgLSAxXSA9IGViLT5zdGFydDsKKwkJCQkJbWVtY3B5KCZub2RlX2tleXNbbGV2ZWwgLSAxXSwgJmtleSwKKwkJCQkJICAgICAgIHNpemVvZihub2RlX2tleXNbMF0pKTsKKwkJCQl9IGVsc2UgeworCQkJCQlXQVJOX09OKDEpOworCQkJCX0KKwkJCX0KKworCQkJYnRyZnNfdHJlZV91bmxvY2socGFyZW50KTsKKwkJCWZyZWVfZXh0ZW50X2J1ZmZlcihwYXJlbnQpOworCQkJcGFyZW50ID0gZWI7CisJCQljb250aW51ZTsKKwkJfQorCisJCWJ0cmZzX3NldF9ub2RlX2Jsb2NrcHRyKHBhcmVudCwgc2xvdCwgbm9kZXNbbGV2ZWwgLSAxXSk7CisJCWJ0cmZzX3NldF9ub2RlX3B0cl9nZW5lcmF0aW9uKHBhcmVudCwgc2xvdCwgdHJhbnMtPnRyYW5zaWQpOworCQlidHJmc19tYXJrX2J1ZmZlcl9kaXJ0eShwYXJlbnQpOworCisJCXJldCA9IGJ0cmZzX2luY19leHRlbnRfcmVmKHRyYW5zLCByb290LAorCQkJCQlub2Rlc1tsZXZlbCAtIDFdLAorCQkJCQlibG9ja3NpemUsIHBhcmVudC0+c3RhcnQsCisJCQkJCWJ0cmZzX2hlYWRlcl9vd25lcihwYXJlbnQpLAorCQkJCQlidHJmc19oZWFkZXJfZ2VuZXJhdGlvbihwYXJlbnQpLAorCQkJCQlsZXZlbCAtIDEpOworCQlCVUdfT04ocmV0KTsKKworCQkvKgorCQkgKiBJZiB0aGUgYmxvY2sgd2FzIGNyZWF0ZWQgaW4gdGhlIHJ1bm5pbmcgdHJhbnNhY3Rpb24sCisJCSAqIGl0J3MgcG9zc2libGUgdGhpcyBpcyB0aGUgbGFzdCByZWZlcmVuY2UgdG8gaXQsIHNvIHdlCisJCSAqIHNob3VsZCBkcm9wIHRoZSBzdWJ0cmVlLgorCQkgKi8KKwkJaWYgKGdlbmVyYXRpb24gPT0gdHJhbnMtPnRyYW5zaWQpIHsKKwkJCXJldCA9IGJ0cmZzX2Ryb3Bfc3VidHJlZSh0cmFucywgcm9vdCwgZWIsIHBhcmVudCk7CisJCQlCVUdfT04ocmV0KTsKKwkJCWJ0cmZzX3RyZWVfdW5sb2NrKGViKTsKKwkJCWZyZWVfZXh0ZW50X2J1ZmZlcihlYik7CisJCX0gZWxzZSB7CisJCQlyZXQgPSBidHJmc19mcmVlX2V4dGVudCh0cmFucywgcm9vdCwgYnl0ZW5yLAorCQkJCQlibG9ja3NpemUsIHBhcmVudC0+c3RhcnQsCisJCQkJCWJ0cmZzX2hlYWRlcl9vd25lcihwYXJlbnQpLAorCQkJCQlidHJmc19oZWFkZXJfZ2VuZXJhdGlvbihwYXJlbnQpLAorCQkJCQlsZXZlbCAtIDEsIDEpOworCQkJQlVHX09OKHJldCk7CisJCX0KKwkJYnJlYWs7CisJfQorCWJ0cmZzX3RyZWVfdW5sb2NrKHBhcmVudCk7CisJZnJlZV9leHRlbnRfYnVmZmVyKHBhcmVudCk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBhZGp1c3QgdGhlIHBvaW50ZXJzIGdvaW5nIHVwIHRoZSB0cmVlLCBzdGFydGluZyBhdCBsZXZlbAorICogbWFraW5nIHN1cmUgdGhlIHJpZ2h0IGtleSBvZiBlYWNoIG5vZGUgaXMgcG9pbnRzIHRvICdrZXknLgorICogVGhpcyBpcyB1c2VkIGFmdGVyIHNoaWZ0aW5nIHBvaW50ZXJzIHRvIHRoZSBsZWZ0LCBzbyBpdCBzdG9wcworICogZml4aW5nIHVwIHBvaW50ZXJzIHdoZW4gYSBnaXZlbiBsZWFmL25vZGUgaXMgbm90IGluIHNsb3QgMCBvZiB0aGUKKyAqIGhpZ2hlciBsZXZlbHMKKyAqCisgKiBJZiB0aGlzIGZhaWxzIHRvIHdyaXRlIGEgdHJlZSBibG9jaywgaXQgcmV0dXJucyAtMSwgYnV0IGNvbnRpbnVlcworICogZml4aW5nIHVwIHRoZSBibG9ja3MgaW4gcmFtIHNvIHRoZSB0cmVlIGlzIGNvbnNpc3RlbnQuCisgKi8KK3N0YXRpYyBpbnQgZml4dXBfbG93X2tleXMoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCisJCQkgIHN0cnVjdCBidHJmc19yb290ICpyb290LCBzdHJ1Y3QgYnRyZnNfcGF0aCAqcGF0aCwKKwkJCSAgc3RydWN0IGJ0cmZzX2Rpc2tfa2V5ICprZXksIGludCBsZXZlbCkKK3sKKwlpbnQgaTsKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqdDsKKworCWZvciAoaSA9IGxldmVsOyBpIDwgQlRSRlNfTUFYX0xFVkVMOyBpKyspIHsKKwkJaW50IHRzbG90ID0gcGF0aC0+c2xvdHNbaV07CisJCWlmICghcGF0aC0+bm9kZXNbaV0pCisJCQlicmVhazsKKwkJdCA9IHBhdGgtPm5vZGVzW2ldOworCQlidHJmc19zZXRfbm9kZV9rZXkodCwga2V5LCB0c2xvdCk7CisJCWJ0cmZzX21hcmtfYnVmZmVyX2RpcnR5KHBhdGgtPm5vZGVzW2ldKTsKKwkJaWYgKHRzbG90ICE9IDApCisJCQlicmVhazsKKwl9CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIHVwZGF0ZSBpdGVtIGtleS4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzbid0IGNvbXBsZXRlbHkgc2FmZS4gSXQncyB0aGUgY2FsbGVyJ3MgcmVzcG9uc2liaWxpdHkKKyAqIHRoYXQgdGhlIG5ldyBrZXkgd29uJ3QgYnJlYWsgdGhlIG9yZGVyCisgKi8KK2ludCBidHJmc19zZXRfaXRlbV9rZXlfc2FmZShzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKKwkJCSAgICBzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwgc3RydWN0IGJ0cmZzX3BhdGggKnBhdGgsCisJCQkgICAgc3RydWN0IGJ0cmZzX2tleSAqbmV3X2tleSkKK3sKKwlzdHJ1Y3QgYnRyZnNfZGlza19rZXkgZGlza19rZXk7CisJc3RydWN0IGV4dGVudF9idWZmZXIgKmViOworCWludCBzbG90OworCisJZWIgPSBwYXRoLT5ub2Rlc1swXTsKKwlzbG90ID0gcGF0aC0+c2xvdHNbMF07CisJaWYgKHNsb3QgPiAwKSB7CisJCWJ0cmZzX2l0ZW1fa2V5KGViLCAmZGlza19rZXksIHNsb3QgLSAxKTsKKwkJaWYgKGNvbXBfa2V5cygmZGlza19rZXksIG5ld19rZXkpID49IDApCisJCQlyZXR1cm4gLTE7CisJfQorCWlmIChzbG90IDwgYnRyZnNfaGVhZGVyX25yaXRlbXMoZWIpIC0gMSkgeworCQlidHJmc19pdGVtX2tleShlYiwgJmRpc2tfa2V5LCBzbG90ICsgMSk7CisJCWlmIChjb21wX2tleXMoJmRpc2tfa2V5LCBuZXdfa2V5KSA8PSAwKQorCQkJcmV0dXJuIC0xOworCX0KKworCWJ0cmZzX2NwdV9rZXlfdG9fZGlzaygmZGlza19rZXksIG5ld19rZXkpOworCWJ0cmZzX3NldF9pdGVtX2tleShlYiwgJmRpc2tfa2V5LCBzbG90KTsKKwlidHJmc19tYXJrX2J1ZmZlcl9kaXJ0eShlYik7CisJaWYgKHNsb3QgPT0gMCkKKwkJZml4dXBfbG93X2tleXModHJhbnMsIHJvb3QsIHBhdGgsICZkaXNrX2tleSwgMSk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiB0cnkgdG8gcHVzaCBkYXRhIGZyb20gb25lIG5vZGUgaW50byB0aGUgbmV4dCBub2RlIGxlZnQgaW4gdGhlCisgKiB0cmVlLgorICoKKyAqIHJldHVybnMgMCBpZiBzb21lIHB0cnMgd2VyZSBwdXNoZWQgbGVmdCwgPCAwIGlmIHRoZXJlIHdhcyBzb21lIGhvcnJpYmxlCisgKiBlcnJvciwgYW5kID4gMCBpZiB0aGVyZSB3YXMgbm8gcm9vbSBpbiB0aGUgbGVmdCBoYW5kIGJsb2NrLgorICovCitzdGF0aWMgaW50IHB1c2hfbm9kZV9sZWZ0KHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAorCQkJICBzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwgc3RydWN0IGV4dGVudF9idWZmZXIgKmRzdCwKKwkJCSAgc3RydWN0IGV4dGVudF9idWZmZXIgKnNyYywgaW50IGVtcHR5KQoreworCWludCBwdXNoX2l0ZW1zID0gMDsKKwlpbnQgc3JjX25yaXRlbXM7CisJaW50IGRzdF9ucml0ZW1zOworCWludCByZXQgPSAwOworCisJc3JjX25yaXRlbXMgPSBidHJmc19oZWFkZXJfbnJpdGVtcyhzcmMpOworCWRzdF9ucml0ZW1zID0gYnRyZnNfaGVhZGVyX25yaXRlbXMoZHN0KTsKKwlwdXNoX2l0ZW1zID0gQlRSRlNfTk9ERVBUUlNfUEVSX0JMT0NLKHJvb3QpIC0gZHN0X25yaXRlbXM7CisJV0FSTl9PTihidHJmc19oZWFkZXJfZ2VuZXJhdGlvbihzcmMpICE9IHRyYW5zLT50cmFuc2lkKTsKKwlXQVJOX09OKGJ0cmZzX2hlYWRlcl9nZW5lcmF0aW9uKGRzdCkgIT0gdHJhbnMtPnRyYW5zaWQpOworCisJaWYgKCFlbXB0eSAmJiBzcmNfbnJpdGVtcyA8PSA4KQorCQlyZXR1cm4gMTsKKworCWlmIChwdXNoX2l0ZW1zIDw9IDApCisJCXJldHVybiAxOworCisJaWYgKGVtcHR5KSB7CisJCXB1c2hfaXRlbXMgPSBtaW4oc3JjX25yaXRlbXMsIHB1c2hfaXRlbXMpOworCQlpZiAocHVzaF9pdGVtcyA8IHNyY19ucml0ZW1zKSB7CisJCQkvKiBsZWF2ZSBhdCBsZWFzdCA4IHBvaW50ZXJzIGluIHRoZSBub2RlIGlmCisJCQkgKiB3ZSBhcmVuJ3QgZ29pbmcgdG8gZW1wdHkgaXQKKwkJCSAqLworCQkJaWYgKHNyY19ucml0ZW1zIC0gcHVzaF9pdGVtcyA8IDgpIHsKKwkJCQlpZiAocHVzaF9pdGVtcyA8PSA4KQorCQkJCQlyZXR1cm4gMTsKKwkJCQlwdXNoX2l0ZW1zIC09IDg7CisJCQl9CisJCX0KKwl9IGVsc2UKKwkJcHVzaF9pdGVtcyA9IG1pbihzcmNfbnJpdGVtcyAtIDgsIHB1c2hfaXRlbXMpOworCisJY29weV9leHRlbnRfYnVmZmVyKGRzdCwgc3JjLAorCQkJICAgYnRyZnNfbm9kZV9rZXlfcHRyX29mZnNldChkc3RfbnJpdGVtcyksCisJCQkgICBidHJmc19ub2RlX2tleV9wdHJfb2Zmc2V0KDApLAorCQkJICAgcHVzaF9pdGVtcyAqIHNpemVvZihzdHJ1Y3QgYnRyZnNfa2V5X3B0cikpOworCisJaWYgKHB1c2hfaXRlbXMgPCBzcmNfbnJpdGVtcykgeworCQltZW1tb3ZlX2V4dGVudF9idWZmZXIoc3JjLCBidHJmc19ub2RlX2tleV9wdHJfb2Zmc2V0KDApLAorCQkJCSAgICAgIGJ0cmZzX25vZGVfa2V5X3B0cl9vZmZzZXQocHVzaF9pdGVtcyksCisJCQkJICAgICAgKHNyY19ucml0ZW1zIC0gcHVzaF9pdGVtcykgKgorCQkJCSAgICAgIHNpemVvZihzdHJ1Y3QgYnRyZnNfa2V5X3B0cikpOworCX0KKwlidHJmc19zZXRfaGVhZGVyX25yaXRlbXMoc3JjLCBzcmNfbnJpdGVtcyAtIHB1c2hfaXRlbXMpOworCWJ0cmZzX3NldF9oZWFkZXJfbnJpdGVtcyhkc3QsIGRzdF9ucml0ZW1zICsgcHVzaF9pdGVtcyk7CisJYnRyZnNfbWFya19idWZmZXJfZGlydHkoc3JjKTsKKwlidHJmc19tYXJrX2J1ZmZlcl9kaXJ0eShkc3QpOworCisJcmV0ID0gYnRyZnNfdXBkYXRlX3JlZih0cmFucywgcm9vdCwgc3JjLCBkc3QsIGRzdF9ucml0ZW1zLCBwdXNoX2l0ZW1zKTsKKwlCVUdfT04ocmV0KTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiB0cnkgdG8gcHVzaCBkYXRhIGZyb20gb25lIG5vZGUgaW50byB0aGUgbmV4dCBub2RlIHJpZ2h0IGluIHRoZQorICogdHJlZS4KKyAqCisgKiByZXR1cm5zIDAgaWYgc29tZSBwdHJzIHdlcmUgcHVzaGVkLCA8IDAgaWYgdGhlcmUgd2FzIHNvbWUgaG9ycmlibGUKKyAqIGVycm9yLCBhbmQgPiAwIGlmIHRoZXJlIHdhcyBubyByb29tIGluIHRoZSByaWdodCBoYW5kIGJsb2NrLgorICoKKyAqIHRoaXMgd2lsbCAgb25seSBwdXNoIHVwIHRvIDEvMiB0aGUgY29udGVudHMgb2YgdGhlIGxlZnQgbm9kZSBvdmVyCisgKi8KK3N0YXRpYyBpbnQgYmFsYW5jZV9ub2RlX3JpZ2h0KHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAorCQkJICAgICAgc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsCisJCQkgICAgICBzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqZHN0LAorCQkJICAgICAgc3RydWN0IGV4dGVudF9idWZmZXIgKnNyYykKK3sKKwlpbnQgcHVzaF9pdGVtcyA9IDA7CisJaW50IG1heF9wdXNoOworCWludCBzcmNfbnJpdGVtczsKKwlpbnQgZHN0X25yaXRlbXM7CisJaW50IHJldCA9IDA7CisKKwlXQVJOX09OKGJ0cmZzX2hlYWRlcl9nZW5lcmF0aW9uKHNyYykgIT0gdHJhbnMtPnRyYW5zaWQpOworCVdBUk5fT04oYnRyZnNfaGVhZGVyX2dlbmVyYXRpb24oZHN0KSAhPSB0cmFucy0+dHJhbnNpZCk7CisKKwlzcmNfbnJpdGVtcyA9IGJ0cmZzX2hlYWRlcl9ucml0ZW1zKHNyYyk7CisJZHN0X25yaXRlbXMgPSBidHJmc19oZWFkZXJfbnJpdGVtcyhkc3QpOworCXB1c2hfaXRlbXMgPSBCVFJGU19OT0RFUFRSU19QRVJfQkxPQ0socm9vdCkgLSBkc3RfbnJpdGVtczsKKwlpZiAocHVzaF9pdGVtcyA8PSAwKQorCQlyZXR1cm4gMTsKKworCWlmIChzcmNfbnJpdGVtcyA8IDQpCisJCXJldHVybiAxOworCisJbWF4X3B1c2ggPSBzcmNfbnJpdGVtcyAvIDIgKyAxOworCS8qIGRvbid0IHRyeSB0byBlbXB0eSB0aGUgbm9kZSAqLworCWlmIChtYXhfcHVzaCA+PSBzcmNfbnJpdGVtcykKKwkJcmV0dXJuIDE7CisKKwlpZiAobWF4X3B1c2ggPCBwdXNoX2l0ZW1zKQorCQlwdXNoX2l0ZW1zID0gbWF4X3B1c2g7CisKKwltZW1tb3ZlX2V4dGVudF9idWZmZXIoZHN0LCBidHJmc19ub2RlX2tleV9wdHJfb2Zmc2V0KHB1c2hfaXRlbXMpLAorCQkJCSAgICAgIGJ0cmZzX25vZGVfa2V5X3B0cl9vZmZzZXQoMCksCisJCQkJICAgICAgKGRzdF9ucml0ZW1zKSAqCisJCQkJICAgICAgc2l6ZW9mKHN0cnVjdCBidHJmc19rZXlfcHRyKSk7CisKKwljb3B5X2V4dGVudF9idWZmZXIoZHN0LCBzcmMsCisJCQkgICBidHJmc19ub2RlX2tleV9wdHJfb2Zmc2V0KDApLAorCQkJICAgYnRyZnNfbm9kZV9rZXlfcHRyX29mZnNldChzcmNfbnJpdGVtcyAtIHB1c2hfaXRlbXMpLAorCQkJICAgcHVzaF9pdGVtcyAqIHNpemVvZihzdHJ1Y3QgYnRyZnNfa2V5X3B0cikpOworCisJYnRyZnNfc2V0X2hlYWRlcl9ucml0ZW1zKHNyYywgc3JjX25yaXRlbXMgLSBwdXNoX2l0ZW1zKTsKKwlidHJmc19zZXRfaGVhZGVyX25yaXRlbXMoZHN0LCBkc3RfbnJpdGVtcyArIHB1c2hfaXRlbXMpOworCisJYnRyZnNfbWFya19idWZmZXJfZGlydHkoc3JjKTsKKwlidHJmc19tYXJrX2J1ZmZlcl9kaXJ0eShkc3QpOworCisJcmV0ID0gYnRyZnNfdXBkYXRlX3JlZih0cmFucywgcm9vdCwgc3JjLCBkc3QsIDAsIHB1c2hfaXRlbXMpOworCUJVR19PTihyZXQpOworCisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIGhlbHBlciBmdW5jdGlvbiB0byBpbnNlcnQgYSBuZXcgcm9vdCBsZXZlbCBpbiB0aGUgdHJlZS4KKyAqIEEgbmV3IG5vZGUgaXMgYWxsb2NhdGVkLCBhbmQgYSBzaW5nbGUgaXRlbSBpcyBpbnNlcnRlZCB0bworICogcG9pbnQgdG8gdGhlIGV4aXN0aW5nIHJvb3QKKyAqCisgKiByZXR1cm5zIHplcm8gb24gc3VjY2VzcyBvciA8IDAgb24gZmFpbHVyZS4KKyAqLworc3RhdGljIG5vaW5saW5lIGludCBpbnNlcnRfbmV3X3Jvb3Qoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCisJCQkgICBzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwKKwkJCSAgIHN0cnVjdCBidHJmc19wYXRoICpwYXRoLCBpbnQgbGV2ZWwpCit7CisJdTY0IGxvd2VyX2dlbjsKKwlzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqbG93ZXI7CisJc3RydWN0IGV4dGVudF9idWZmZXIgKmM7CisJc3RydWN0IGV4dGVudF9idWZmZXIgKm9sZDsKKwlzdHJ1Y3QgYnRyZnNfZGlza19rZXkgbG93ZXJfa2V5OworCWludCByZXQ7CisKKwlCVUdfT04ocGF0aC0+bm9kZXNbbGV2ZWxdKTsKKwlCVUdfT04ocGF0aC0+bm9kZXNbbGV2ZWwtMV0gIT0gcm9vdC0+bm9kZSk7CisKKwlsb3dlciA9IHBhdGgtPm5vZGVzW2xldmVsLTFdOworCWlmIChsZXZlbCA9PSAxKQorCQlidHJmc19pdGVtX2tleShsb3dlciwgJmxvd2VyX2tleSwgMCk7CisJZWxzZQorCQlidHJmc19ub2RlX2tleShsb3dlciwgJmxvd2VyX2tleSwgMCk7CisKKwljID0gYnRyZnNfYWxsb2NfZnJlZV9ibG9jayh0cmFucywgcm9vdCwgcm9vdC0+bm9kZXNpemUsIDAsCisJCQkJICAgcm9vdC0+cm9vdF9rZXkub2JqZWN0aWQsIHRyYW5zLT50cmFuc2lkLAorCQkJCSAgIGxldmVsLCByb290LT5ub2RlLT5zdGFydCwgMCk7CisJaWYgKElTX0VSUihjKSkKKwkJcmV0dXJuIFBUUl9FUlIoYyk7CisKKwltZW1zZXRfZXh0ZW50X2J1ZmZlcihjLCAwLCAwLCByb290LT5ub2Rlc2l6ZSk7CisJYnRyZnNfc2V0X2hlYWRlcl9ucml0ZW1zKGMsIDEpOworCWJ0cmZzX3NldF9oZWFkZXJfbGV2ZWwoYywgbGV2ZWwpOworCWJ0cmZzX3NldF9oZWFkZXJfYnl0ZW5yKGMsIGMtPnN0YXJ0KTsKKwlidHJmc19zZXRfaGVhZGVyX2dlbmVyYXRpb24oYywgdHJhbnMtPnRyYW5zaWQpOworCWJ0cmZzX3NldF9oZWFkZXJfb3duZXIoYywgcm9vdC0+cm9vdF9rZXkub2JqZWN0aWQpOworCisJd3JpdGVfZXh0ZW50X2J1ZmZlcihjLCByb290LT5mc19pbmZvLT5mc2lkLAorCQkJICAgICh1bnNpZ25lZCBsb25nKWJ0cmZzX2hlYWRlcl9mc2lkKGMpLAorCQkJICAgIEJUUkZTX0ZTSURfU0laRSk7CisKKwl3cml0ZV9leHRlbnRfYnVmZmVyKGMsIHJvb3QtPmZzX2luZm8tPmNodW5rX3RyZWVfdXVpZCwKKwkJCSAgICAodW5zaWduZWQgbG9uZylidHJmc19oZWFkZXJfY2h1bmtfdHJlZV91dWlkKGMpLAorCQkJICAgIEJUUkZTX1VVSURfU0laRSk7CisKKwlidHJmc19zZXRfbm9kZV9rZXkoYywgJmxvd2VyX2tleSwgMCk7CisJYnRyZnNfc2V0X25vZGVfYmxvY2twdHIoYywgMCwgbG93ZXItPnN0YXJ0KTsKKwlsb3dlcl9nZW4gPSBidHJmc19oZWFkZXJfZ2VuZXJhdGlvbihsb3dlcik7CisJV0FSTl9PTihsb3dlcl9nZW4gIT0gdHJhbnMtPnRyYW5zaWQpOworCisJYnRyZnNfc2V0X25vZGVfcHRyX2dlbmVyYXRpb24oYywgMCwgbG93ZXJfZ2VuKTsKKworCWJ0cmZzX21hcmtfYnVmZmVyX2RpcnR5KGMpOworCisJc3Bpbl9sb2NrKCZyb290LT5ub2RlX2xvY2spOworCW9sZCA9IHJvb3QtPm5vZGU7CisJcm9vdC0+bm9kZSA9IGM7CisJc3Bpbl91bmxvY2soJnJvb3QtPm5vZGVfbG9jayk7CisKKwlyZXQgPSBidHJmc191cGRhdGVfZXh0ZW50X3JlZih0cmFucywgcm9vdCwgbG93ZXItPnN0YXJ0LAorCQkJCSAgICAgIGxvd2VyLT5zdGFydCwgYy0+c3RhcnQsCisJCQkJICAgICAgcm9vdC0+cm9vdF9rZXkub2JqZWN0aWQsCisJCQkJICAgICAgdHJhbnMtPnRyYW5zaWQsIGxldmVsIC0gMSk7CisJQlVHX09OKHJldCk7CisKKwkvKiB0aGUgc3VwZXIgaGFzIGFuIGV4dHJhIHJlZiB0byByb290LT5ub2RlICovCisJZnJlZV9leHRlbnRfYnVmZmVyKG9sZCk7CisKKwlhZGRfcm9vdF90b19kaXJ0eV9saXN0KHJvb3QpOworCWV4dGVudF9idWZmZXJfZ2V0KGMpOworCXBhdGgtPm5vZGVzW2xldmVsXSA9IGM7CisJcGF0aC0+bG9ja3NbbGV2ZWxdID0gMTsKKwlwYXRoLT5zbG90c1tsZXZlbF0gPSAwOworCXJldHVybiAwOworfQorCisvKgorICogd29ya2VyIGZ1bmN0aW9uIHRvIGluc2VydCBhIHNpbmdsZSBwb2ludGVyIGluIGEgbm9kZS4KKyAqIHRoZSBub2RlIHNob3VsZCBoYXZlIGVub3VnaCByb29tIGZvciB0aGUgcG9pbnRlciBhbHJlYWR5CisgKgorICogc2xvdCBhbmQgbGV2ZWwgaW5kaWNhdGUgd2hlcmUgeW91IHdhbnQgdGhlIGtleSB0byBnbywgYW5kCisgKiBibG9ja25yIGlzIHRoZSBibG9jayB0aGUga2V5IHBvaW50cyB0by4KKyAqCisgKiByZXR1cm5zIHplcm8gb24gc3VjY2VzcyBhbmQgPCAwIG9uIGFueSBlcnJvcgorICovCitzdGF0aWMgaW50IGluc2VydF9wdHIoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsIHN0cnVjdCBidHJmc19yb290CisJCSAgICAgICpyb290LCBzdHJ1Y3QgYnRyZnNfcGF0aCAqcGF0aCwgc3RydWN0IGJ0cmZzX2Rpc2tfa2V5CisJCSAgICAgICprZXksIHU2NCBieXRlbnIsIGludCBzbG90LCBpbnQgbGV2ZWwpCit7CisJc3RydWN0IGV4dGVudF9idWZmZXIgKmxvd2VyOworCWludCBucml0ZW1zOworCisJQlVHX09OKCFwYXRoLT5ub2Rlc1tsZXZlbF0pOworCWxvd2VyID0gcGF0aC0+bm9kZXNbbGV2ZWxdOworCW5yaXRlbXMgPSBidHJmc19oZWFkZXJfbnJpdGVtcyhsb3dlcik7CisJaWYgKHNsb3QgPiBucml0ZW1zKQorCQlCVUcoKTsKKwlpZiAobnJpdGVtcyA9PSBCVFJGU19OT0RFUFRSU19QRVJfQkxPQ0socm9vdCkpCisJCUJVRygpOworCWlmIChzbG90ICE9IG5yaXRlbXMpIHsKKwkJbWVtbW92ZV9leHRlbnRfYnVmZmVyKGxvd2VyLAorCQkJICAgICAgYnRyZnNfbm9kZV9rZXlfcHRyX29mZnNldChzbG90ICsgMSksCisJCQkgICAgICBidHJmc19ub2RlX2tleV9wdHJfb2Zmc2V0KHNsb3QpLAorCQkJICAgICAgKG5yaXRlbXMgLSBzbG90KSAqIHNpemVvZihzdHJ1Y3QgYnRyZnNfa2V5X3B0cikpOworCX0KKwlidHJmc19zZXRfbm9kZV9rZXkobG93ZXIsIGtleSwgc2xvdCk7CisJYnRyZnNfc2V0X25vZGVfYmxvY2twdHIobG93ZXIsIHNsb3QsIGJ5dGVucik7CisJV0FSTl9PTih0cmFucy0+dHJhbnNpZCA9PSAwKTsKKwlidHJmc19zZXRfbm9kZV9wdHJfZ2VuZXJhdGlvbihsb3dlciwgc2xvdCwgdHJhbnMtPnRyYW5zaWQpOworCWJ0cmZzX3NldF9oZWFkZXJfbnJpdGVtcyhsb3dlciwgbnJpdGVtcyArIDEpOworCWJ0cmZzX21hcmtfYnVmZmVyX2RpcnR5KGxvd2VyKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIHNwbGl0IHRoZSBub2RlIGF0IHRoZSBzcGVjaWZpZWQgbGV2ZWwgaW4gcGF0aCBpbiB0d28uCisgKiBUaGUgcGF0aCBpcyBjb3JyZWN0ZWQgdG8gcG9pbnQgdG8gdGhlIGFwcHJvcHJpYXRlIG5vZGUgYWZ0ZXIgdGhlIHNwbGl0CisgKgorICogQmVmb3JlIHNwbGl0dGluZyB0aGlzIHRyaWVzIHRvIG1ha2Ugc29tZSByb29tIGluIHRoZSBub2RlIGJ5IHB1c2hpbmcKKyAqIGxlZnQgYW5kIHJpZ2h0LCBpZiBlaXRoZXIgb25lIHdvcmtzLCBpdCByZXR1cm5zIHJpZ2h0IGF3YXkuCisgKgorICogcmV0dXJucyAwIG9uIHN1Y2Nlc3MgYW5kIDwgMCBvbiBmYWlsdXJlCisgKi8KK3N0YXRpYyBub2lubGluZSBpbnQgc3BsaXRfbm9kZShzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKKwkJCSAgICAgICBzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwKKwkJCSAgICAgICBzdHJ1Y3QgYnRyZnNfcGF0aCAqcGF0aCwgaW50IGxldmVsKQoreworCXN0cnVjdCBleHRlbnRfYnVmZmVyICpjOworCXN0cnVjdCBleHRlbnRfYnVmZmVyICpzcGxpdDsKKwlzdHJ1Y3QgYnRyZnNfZGlza19rZXkgZGlza19rZXk7CisJaW50IG1pZDsKKwlpbnQgcmV0OworCWludCB3cmV0OworCXUzMiBjX25yaXRlbXM7CisKKwljID0gcGF0aC0+bm9kZXNbbGV2ZWxdOworCVdBUk5fT04oYnRyZnNfaGVhZGVyX2dlbmVyYXRpb24oYykgIT0gdHJhbnMtPnRyYW5zaWQpOworCWlmIChjID09IHJvb3QtPm5vZGUpIHsKKwkJLyogdHJ5aW5nIHRvIHNwbGl0IHRoZSByb290LCBsZXRzIG1ha2UgYSBuZXcgb25lICovCisJCXJldCA9IGluc2VydF9uZXdfcm9vdCh0cmFucywgcm9vdCwgcGF0aCwgbGV2ZWwgKyAxKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJfSBlbHNlIHsKKwkJcmV0ID0gcHVzaF9ub2Rlc19mb3JfaW5zZXJ0KHRyYW5zLCByb290LCBwYXRoLCBsZXZlbCk7CisJCWMgPSBwYXRoLT5ub2Rlc1tsZXZlbF07CisJCWlmICghcmV0ICYmIGJ0cmZzX2hlYWRlcl9ucml0ZW1zKGMpIDwKKwkJICAgIEJUUkZTX05PREVQVFJTX1BFUl9CTE9DSyhyb290KSAtIDMpCisJCQlyZXR1cm4gMDsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCX0KKworCWNfbnJpdGVtcyA9IGJ0cmZzX2hlYWRlcl9ucml0ZW1zKGMpOworCisJc3BsaXQgPSBidHJmc19hbGxvY19mcmVlX2Jsb2NrKHRyYW5zLCByb290LCByb290LT5ub2Rlc2l6ZSwKKwkJCQkJcGF0aC0+bm9kZXNbbGV2ZWwgKyAxXS0+c3RhcnQsCisJCQkJCXJvb3QtPnJvb3Rfa2V5Lm9iamVjdGlkLAorCQkJCQl0cmFucy0+dHJhbnNpZCwgbGV2ZWwsIGMtPnN0YXJ0LCAwKTsKKwlpZiAoSVNfRVJSKHNwbGl0KSkKKwkJcmV0dXJuIFBUUl9FUlIoc3BsaXQpOworCisJYnRyZnNfc2V0X2hlYWRlcl9mbGFncyhzcGxpdCwgYnRyZnNfaGVhZGVyX2ZsYWdzKGMpKTsKKwlidHJmc19zZXRfaGVhZGVyX2xldmVsKHNwbGl0LCBidHJmc19oZWFkZXJfbGV2ZWwoYykpOworCWJ0cmZzX3NldF9oZWFkZXJfYnl0ZW5yKHNwbGl0LCBzcGxpdC0+c3RhcnQpOworCWJ0cmZzX3NldF9oZWFkZXJfZ2VuZXJhdGlvbihzcGxpdCwgdHJhbnMtPnRyYW5zaWQpOworCWJ0cmZzX3NldF9oZWFkZXJfb3duZXIoc3BsaXQsIHJvb3QtPnJvb3Rfa2V5Lm9iamVjdGlkKTsKKwlidHJmc19zZXRfaGVhZGVyX2ZsYWdzKHNwbGl0LCAwKTsKKwl3cml0ZV9leHRlbnRfYnVmZmVyKHNwbGl0LCByb290LT5mc19pbmZvLT5mc2lkLAorCQkJICAgICh1bnNpZ25lZCBsb25nKWJ0cmZzX2hlYWRlcl9mc2lkKHNwbGl0KSwKKwkJCSAgICBCVFJGU19GU0lEX1NJWkUpOworCXdyaXRlX2V4dGVudF9idWZmZXIoc3BsaXQsIHJvb3QtPmZzX2luZm8tPmNodW5rX3RyZWVfdXVpZCwKKwkJCSAgICAodW5zaWduZWQgbG9uZylidHJmc19oZWFkZXJfY2h1bmtfdHJlZV91dWlkKHNwbGl0KSwKKwkJCSAgICBCVFJGU19VVUlEX1NJWkUpOworCisJbWlkID0gKGNfbnJpdGVtcyArIDEpIC8gMjsKKworCWNvcHlfZXh0ZW50X2J1ZmZlcihzcGxpdCwgYywKKwkJCSAgIGJ0cmZzX25vZGVfa2V5X3B0cl9vZmZzZXQoMCksCisJCQkgICBidHJmc19ub2RlX2tleV9wdHJfb2Zmc2V0KG1pZCksCisJCQkgICAoY19ucml0ZW1zIC0gbWlkKSAqIHNpemVvZihzdHJ1Y3QgYnRyZnNfa2V5X3B0cikpOworCWJ0cmZzX3NldF9oZWFkZXJfbnJpdGVtcyhzcGxpdCwgY19ucml0ZW1zIC0gbWlkKTsKKwlidHJmc19zZXRfaGVhZGVyX25yaXRlbXMoYywgbWlkKTsKKwlyZXQgPSAwOworCisJYnRyZnNfbWFya19idWZmZXJfZGlydHkoYyk7CisJYnRyZnNfbWFya19idWZmZXJfZGlydHkoc3BsaXQpOworCisJYnRyZnNfbm9kZV9rZXkoc3BsaXQsICZkaXNrX2tleSwgMCk7CisJd3JldCA9IGluc2VydF9wdHIodHJhbnMsIHJvb3QsIHBhdGgsICZkaXNrX2tleSwgc3BsaXQtPnN0YXJ0LAorCQkJICBwYXRoLT5zbG90c1tsZXZlbCArIDFdICsgMSwKKwkJCSAgbGV2ZWwgKyAxKTsKKwlpZiAod3JldCkKKwkJcmV0ID0gd3JldDsKKworCXJldCA9IGJ0cmZzX3VwZGF0ZV9yZWYodHJhbnMsIHJvb3QsIGMsIHNwbGl0LCAwLCBjX25yaXRlbXMgLSBtaWQpOworCUJVR19PTihyZXQpOworCisJaWYgKHBhdGgtPnNsb3RzW2xldmVsXSA+PSBtaWQpIHsKKwkJcGF0aC0+c2xvdHNbbGV2ZWxdIC09IG1pZDsKKwkJYnRyZnNfdHJlZV91bmxvY2soYyk7CisJCWZyZWVfZXh0ZW50X2J1ZmZlcihjKTsKKwkJcGF0aC0+bm9kZXNbbGV2ZWxdID0gc3BsaXQ7CisJCXBhdGgtPnNsb3RzW2xldmVsICsgMV0gKz0gMTsKKwl9IGVsc2UgeworCQlidHJmc190cmVlX3VubG9jayhzcGxpdCk7CisJCWZyZWVfZXh0ZW50X2J1ZmZlcihzcGxpdCk7CisJfQorCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBob3cgbWFueSBieXRlcyBhcmUgcmVxdWlyZWQgdG8gc3RvcmUgdGhlIGl0ZW1zIGluIGEgbGVhZi4gIHN0YXJ0CisgKiBhbmQgbnIgaW5kaWNhdGUgd2hpY2ggaXRlbXMgaW4gdGhlIGxlYWYgdG8gY2hlY2suICBUaGlzIHRvdGFscyB1cCB0aGUKKyAqIHNwYWNlIHVzZWQgYm90aCBieSB0aGUgaXRlbSBzdHJ1Y3RzIGFuZCB0aGUgaXRlbSBkYXRhCisgKi8KK3N0YXRpYyBpbnQgbGVhZl9zcGFjZV91c2VkKHN0cnVjdCBleHRlbnRfYnVmZmVyICpsLCBpbnQgc3RhcnQsIGludCBucikKK3sKKwlpbnQgZGF0YV9sZW47CisJaW50IG5yaXRlbXMgPSBidHJmc19oZWFkZXJfbnJpdGVtcyhsKTsKKwlpbnQgZW5kID0gbWluKG5yaXRlbXMsIHN0YXJ0ICsgbnIpIC0gMTsKKworCWlmICghbnIpCisJCXJldHVybiAwOworCWRhdGFfbGVuID0gYnRyZnNfaXRlbV9lbmRfbnIobCwgc3RhcnQpOworCWRhdGFfbGVuID0gZGF0YV9sZW4gLSBidHJmc19pdGVtX29mZnNldF9ucihsLCBlbmQpOworCWRhdGFfbGVuICs9IHNpemVvZihzdHJ1Y3QgYnRyZnNfaXRlbSkgKiBucjsKKwlXQVJOX09OKGRhdGFfbGVuIDwgMCk7CisJcmV0dXJuIGRhdGFfbGVuOworfQorCisvKgorICogVGhlIHNwYWNlIGJldHdlZW4gdGhlIGVuZCBvZiB0aGUgbGVhZiBpdGVtcyBhbmQKKyAqIHRoZSBzdGFydCBvZiB0aGUgbGVhZiBkYXRhLiAgSU9XLCBob3cgbXVjaCByb29tCisgKiB0aGUgbGVhZiBoYXMgbGVmdCBmb3IgYm90aCBpdGVtcyBhbmQgZGF0YQorICovCitub2lubGluZSBpbnQgYnRyZnNfbGVhZl9mcmVlX3NwYWNlKHN0cnVjdCBidHJmc19yb290ICpyb290LAorCQkJCSAgIHN0cnVjdCBleHRlbnRfYnVmZmVyICpsZWFmKQoreworCWludCBucml0ZW1zID0gYnRyZnNfaGVhZGVyX25yaXRlbXMobGVhZik7CisJaW50IHJldDsKKwlyZXQgPSBCVFJGU19MRUFGX0RBVEFfU0laRShyb290KSAtIGxlYWZfc3BhY2VfdXNlZChsZWFmLCAwLCBucml0ZW1zKTsKKwlpZiAocmV0IDwgMCkgeworCQlwcmludGsoS0VSTl9DUklUICJsZWFmIGZyZWUgc3BhY2UgcmV0ICVkLCBsZWFmIGRhdGEgc2l6ZSAlbHUsICIKKwkJICAgICAgICJ1c2VkICVkIG5yaXRlbXMgJWRcbiIsCisJCSAgICAgICByZXQsICh1bnNpZ25lZCBsb25nKSBCVFJGU19MRUFGX0RBVEFfU0laRShyb290KSwKKwkJICAgICAgIGxlYWZfc3BhY2VfdXNlZChsZWFmLCAwLCBucml0ZW1zKSwgbnJpdGVtcyk7CisJfQorCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBwdXNoIHNvbWUgZGF0YSBpbiB0aGUgcGF0aCBsZWFmIHRvIHRoZSByaWdodCwgdHJ5aW5nIHRvIGZyZWUgdXAgYXQKKyAqIGxlYXN0IGRhdGFfc2l6ZSBieXRlcy4gIHJldHVybnMgemVybyBpZiB0aGUgcHVzaCB3b3JrZWQsIG5vbnplcm8gb3RoZXJ3aXNlCisgKgorICogcmV0dXJucyAxIGlmIHRoZSBwdXNoIGZhaWxlZCBiZWNhdXNlIHRoZSBvdGhlciBub2RlIGRpZG4ndCBoYXZlIGVub3VnaAorICogcm9vbSwgMCBpZiBldmVyeXRoaW5nIHdvcmtlZCBvdXQgYW5kIDwgMCBpZiB0aGVyZSB3ZXJlIG1ham9yIGVycm9ycy4KKyAqLworc3RhdGljIGludCBwdXNoX2xlYWZfcmlnaHQoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsIHN0cnVjdCBidHJmc19yb290CisJCQkgICAqcm9vdCwgc3RydWN0IGJ0cmZzX3BhdGggKnBhdGgsIGludCBkYXRhX3NpemUsCisJCQkgICBpbnQgZW1wdHkpCit7CisJc3RydWN0IGV4dGVudF9idWZmZXIgKmxlZnQgPSBwYXRoLT5ub2Rlc1swXTsKKwlzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqcmlnaHQ7CisJc3RydWN0IGV4dGVudF9idWZmZXIgKnVwcGVyOworCXN0cnVjdCBidHJmc19kaXNrX2tleSBkaXNrX2tleTsKKwlpbnQgc2xvdDsKKwl1MzIgaTsKKwlpbnQgZnJlZV9zcGFjZTsKKwlpbnQgcHVzaF9zcGFjZSA9IDA7CisJaW50IHB1c2hfaXRlbXMgPSAwOworCXN0cnVjdCBidHJmc19pdGVtICppdGVtOworCXUzMiBsZWZ0X25yaXRlbXM7CisJdTMyIG5yOworCXUzMiByaWdodF9ucml0ZW1zOworCXUzMiBkYXRhX2VuZDsKKwl1MzIgdGhpc19pdGVtX3NpemU7CisJaW50IHJldDsKKworCXNsb3QgPSBwYXRoLT5zbG90c1sxXTsKKwlpZiAoIXBhdGgtPm5vZGVzWzFdKQorCQlyZXR1cm4gMTsKKworCXVwcGVyID0gcGF0aC0+bm9kZXNbMV07CisJaWYgKHNsb3QgPj0gYnRyZnNfaGVhZGVyX25yaXRlbXModXBwZXIpIC0gMSkKKwkJcmV0dXJuIDE7CisKKwlXQVJOX09OKCFidHJmc190cmVlX2xvY2tlZChwYXRoLT5ub2Rlc1sxXSkpOworCisJcmlnaHQgPSByZWFkX25vZGVfc2xvdChyb290LCB1cHBlciwgc2xvdCArIDEpOworCWJ0cmZzX3RyZWVfbG9jayhyaWdodCk7CisJZnJlZV9zcGFjZSA9IGJ0cmZzX2xlYWZfZnJlZV9zcGFjZShyb290LCByaWdodCk7CisJaWYgKGZyZWVfc3BhY2UgPCBkYXRhX3NpemUpCisJCWdvdG8gb3V0X3VubG9jazsKKworCS8qIGNvdyBhbmQgZG91YmxlIGNoZWNrICovCisJcmV0ID0gYnRyZnNfY293X2Jsb2NrKHRyYW5zLCByb290LCByaWdodCwgdXBwZXIsCisJCQkgICAgICBzbG90ICsgMSwgJnJpZ2h0LCAwKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dF91bmxvY2s7CisKKwlmcmVlX3NwYWNlID0gYnRyZnNfbGVhZl9mcmVlX3NwYWNlKHJvb3QsIHJpZ2h0KTsKKwlpZiAoZnJlZV9zcGFjZSA8IGRhdGFfc2l6ZSkKKwkJZ290byBvdXRfdW5sb2NrOworCisJbGVmdF9ucml0ZW1zID0gYnRyZnNfaGVhZGVyX25yaXRlbXMobGVmdCk7CisJaWYgKGxlZnRfbnJpdGVtcyA9PSAwKQorCQlnb3RvIG91dF91bmxvY2s7CisKKwlpZiAoZW1wdHkpCisJCW5yID0gMDsKKwllbHNlCisJCW5yID0gMTsKKworCWlmIChwYXRoLT5zbG90c1swXSA+PSBsZWZ0X25yaXRlbXMpCisJCXB1c2hfc3BhY2UgKz0gZGF0YV9zaXplOworCisJaSA9IGxlZnRfbnJpdGVtcyAtIDE7CisJd2hpbGUgKGkgPj0gbnIpIHsKKwkJaXRlbSA9IGJ0cmZzX2l0ZW1fbnIobGVmdCwgaSk7CisKKwkJaWYgKCFlbXB0eSAmJiBwdXNoX2l0ZW1zID4gMCkgeworCQkJaWYgKHBhdGgtPnNsb3RzWzBdID4gaSkKKwkJCQlicmVhazsKKwkJCWlmIChwYXRoLT5zbG90c1swXSA9PSBpKSB7CisJCQkJaW50IHNwYWNlID0gYnRyZnNfbGVhZl9mcmVlX3NwYWNlKHJvb3QsIGxlZnQpOworCQkJCWlmIChzcGFjZSArIHB1c2hfc3BhY2UgKiAyID4gZnJlZV9zcGFjZSkKKwkJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQlpZiAocGF0aC0+c2xvdHNbMF0gPT0gaSkKKwkJCXB1c2hfc3BhY2UgKz0gZGF0YV9zaXplOworCisJCWlmICghbGVmdC0+bWFwX3Rva2VuKSB7CisJCQltYXBfZXh0ZW50X2J1ZmZlcihsZWZ0LCAodW5zaWduZWQgbG9uZylpdGVtLAorCQkJCQlzaXplb2Yoc3RydWN0IGJ0cmZzX2l0ZW0pLAorCQkJCQkmbGVmdC0+bWFwX3Rva2VuLCAmbGVmdC0+a2FkZHIsCisJCQkJCSZsZWZ0LT5tYXBfc3RhcnQsICZsZWZ0LT5tYXBfbGVuLAorCQkJCQlLTV9VU0VSMSk7CisJCX0KKworCQl0aGlzX2l0ZW1fc2l6ZSA9IGJ0cmZzX2l0ZW1fc2l6ZShsZWZ0LCBpdGVtKTsKKwkJaWYgKHRoaXNfaXRlbV9zaXplICsgc2l6ZW9mKCppdGVtKSArIHB1c2hfc3BhY2UgPiBmcmVlX3NwYWNlKQorCQkJYnJlYWs7CisKKwkJcHVzaF9pdGVtcysrOworCQlwdXNoX3NwYWNlICs9IHRoaXNfaXRlbV9zaXplICsgc2l6ZW9mKCppdGVtKTsKKwkJaWYgKGkgPT0gMCkKKwkJCWJyZWFrOworCQlpLS07CisJfQorCWlmIChsZWZ0LT5tYXBfdG9rZW4pIHsKKwkJdW5tYXBfZXh0ZW50X2J1ZmZlcihsZWZ0LCBsZWZ0LT5tYXBfdG9rZW4sIEtNX1VTRVIxKTsKKwkJbGVmdC0+bWFwX3Rva2VuID0gTlVMTDsKKwl9CisKKwlpZiAocHVzaF9pdGVtcyA9PSAwKQorCQlnb3RvIG91dF91bmxvY2s7CisKKwlpZiAoIWVtcHR5ICYmIHB1c2hfaXRlbXMgPT0gbGVmdF9ucml0ZW1zKQorCQlXQVJOX09OKDEpOworCisJLyogcHVzaCBsZWZ0IHRvIHJpZ2h0ICovCisJcmlnaHRfbnJpdGVtcyA9IGJ0cmZzX2hlYWRlcl9ucml0ZW1zKHJpZ2h0KTsKKworCXB1c2hfc3BhY2UgPSBidHJmc19pdGVtX2VuZF9ucihsZWZ0LCBsZWZ0X25yaXRlbXMgLSBwdXNoX2l0ZW1zKTsKKwlwdXNoX3NwYWNlIC09IGxlYWZfZGF0YV9lbmQocm9vdCwgbGVmdCk7CisKKwkvKiBtYWtlIHJvb20gaW4gdGhlIHJpZ2h0IGRhdGEgYXJlYSAqLworCWRhdGFfZW5kID0gbGVhZl9kYXRhX2VuZChyb290LCByaWdodCk7CisJbWVtbW92ZV9leHRlbnRfYnVmZmVyKHJpZ2h0LAorCQkJICAgICAgYnRyZnNfbGVhZl9kYXRhKHJpZ2h0KSArIGRhdGFfZW5kIC0gcHVzaF9zcGFjZSwKKwkJCSAgICAgIGJ0cmZzX2xlYWZfZGF0YShyaWdodCkgKyBkYXRhX2VuZCwKKwkJCSAgICAgIEJUUkZTX0xFQUZfREFUQV9TSVpFKHJvb3QpIC0gZGF0YV9lbmQpOworCisJLyogY29weSBmcm9tIHRoZSBsZWZ0IGRhdGEgYXJlYSAqLworCWNvcHlfZXh0ZW50X2J1ZmZlcihyaWdodCwgbGVmdCwgYnRyZnNfbGVhZl9kYXRhKHJpZ2h0KSArCisJCSAgICAgQlRSRlNfTEVBRl9EQVRBX1NJWkUocm9vdCkgLSBwdXNoX3NwYWNlLAorCQkgICAgIGJ0cmZzX2xlYWZfZGF0YShsZWZ0KSArIGxlYWZfZGF0YV9lbmQocm9vdCwgbGVmdCksCisJCSAgICAgcHVzaF9zcGFjZSk7CisKKwltZW1tb3ZlX2V4dGVudF9idWZmZXIocmlnaHQsIGJ0cmZzX2l0ZW1fbnJfb2Zmc2V0KHB1c2hfaXRlbXMpLAorCQkJICAgICAgYnRyZnNfaXRlbV9ucl9vZmZzZXQoMCksCisJCQkgICAgICByaWdodF9ucml0ZW1zICogc2l6ZW9mKHN0cnVjdCBidHJmc19pdGVtKSk7CisKKwkvKiBjb3B5IHRoZSBpdGVtcyBmcm9tIGxlZnQgdG8gcmlnaHQgKi8KKwljb3B5X2V4dGVudF9idWZmZXIocmlnaHQsIGxlZnQsIGJ0cmZzX2l0ZW1fbnJfb2Zmc2V0KDApLAorCQkgICBidHJmc19pdGVtX25yX29mZnNldChsZWZ0X25yaXRlbXMgLSBwdXNoX2l0ZW1zKSwKKwkJICAgcHVzaF9pdGVtcyAqIHNpemVvZihzdHJ1Y3QgYnRyZnNfaXRlbSkpOworCisJLyogdXBkYXRlIHRoZSBpdGVtIHBvaW50ZXJzICovCisJcmlnaHRfbnJpdGVtcyArPSBwdXNoX2l0ZW1zOworCWJ0cmZzX3NldF9oZWFkZXJfbnJpdGVtcyhyaWdodCwgcmlnaHRfbnJpdGVtcyk7CisJcHVzaF9zcGFjZSA9IEJUUkZTX0xFQUZfREFUQV9TSVpFKHJvb3QpOworCWZvciAoaSA9IDA7IGkgPCByaWdodF9ucml0ZW1zOyBpKyspIHsKKwkJaXRlbSA9IGJ0cmZzX2l0ZW1fbnIocmlnaHQsIGkpOworCQlpZiAoIXJpZ2h0LT5tYXBfdG9rZW4pIHsKKwkJCW1hcF9leHRlbnRfYnVmZmVyKHJpZ2h0LCAodW5zaWduZWQgbG9uZylpdGVtLAorCQkJCQlzaXplb2Yoc3RydWN0IGJ0cmZzX2l0ZW0pLAorCQkJCQkmcmlnaHQtPm1hcF90b2tlbiwgJnJpZ2h0LT5rYWRkciwKKwkJCQkJJnJpZ2h0LT5tYXBfc3RhcnQsICZyaWdodC0+bWFwX2xlbiwKKwkJCQkJS01fVVNFUjEpOworCQl9CisJCXB1c2hfc3BhY2UgLT0gYnRyZnNfaXRlbV9zaXplKHJpZ2h0LCBpdGVtKTsKKwkJYnRyZnNfc2V0X2l0ZW1fb2Zmc2V0KHJpZ2h0LCBpdGVtLCBwdXNoX3NwYWNlKTsKKwl9CisKKwlpZiAocmlnaHQtPm1hcF90b2tlbikgeworCQl1bm1hcF9leHRlbnRfYnVmZmVyKHJpZ2h0LCByaWdodC0+bWFwX3Rva2VuLCBLTV9VU0VSMSk7CisJCXJpZ2h0LT5tYXBfdG9rZW4gPSBOVUxMOworCX0KKwlsZWZ0X25yaXRlbXMgLT0gcHVzaF9pdGVtczsKKwlidHJmc19zZXRfaGVhZGVyX25yaXRlbXMobGVmdCwgbGVmdF9ucml0ZW1zKTsKKworCWlmIChsZWZ0X25yaXRlbXMpCisJCWJ0cmZzX21hcmtfYnVmZmVyX2RpcnR5KGxlZnQpOworCWJ0cmZzX21hcmtfYnVmZmVyX2RpcnR5KHJpZ2h0KTsKKworCXJldCA9IGJ0cmZzX3VwZGF0ZV9yZWYodHJhbnMsIHJvb3QsIGxlZnQsIHJpZ2h0LCAwLCBwdXNoX2l0ZW1zKTsKKwlCVUdfT04ocmV0KTsKKworCWJ0cmZzX2l0ZW1fa2V5KHJpZ2h0LCAmZGlza19rZXksIDApOworCWJ0cmZzX3NldF9ub2RlX2tleSh1cHBlciwgJmRpc2tfa2V5LCBzbG90ICsgMSk7CisJYnRyZnNfbWFya19idWZmZXJfZGlydHkodXBwZXIpOworCisJLyogdGhlbiBmaXh1cCB0aGUgbGVhZiBwb2ludGVyIGluIHRoZSBwYXRoICovCisJaWYgKHBhdGgtPnNsb3RzWzBdID49IGxlZnRfbnJpdGVtcykgeworCQlwYXRoLT5zbG90c1swXSAtPSBsZWZ0X25yaXRlbXM7CisJCWlmIChidHJmc19oZWFkZXJfbnJpdGVtcyhwYXRoLT5ub2Rlc1swXSkgPT0gMCkKKwkJCWNsZWFuX3RyZWVfYmxvY2sodHJhbnMsIHJvb3QsIHBhdGgtPm5vZGVzWzBdKTsKKwkJYnRyZnNfdHJlZV91bmxvY2socGF0aC0+bm9kZXNbMF0pOworCQlmcmVlX2V4dGVudF9idWZmZXIocGF0aC0+bm9kZXNbMF0pOworCQlwYXRoLT5ub2Rlc1swXSA9IHJpZ2h0OworCQlwYXRoLT5zbG90c1sxXSArPSAxOworCX0gZWxzZSB7CisJCWJ0cmZzX3RyZWVfdW5sb2NrKHJpZ2h0KTsKKwkJZnJlZV9leHRlbnRfYnVmZmVyKHJpZ2h0KTsKKwl9CisJcmV0dXJuIDA7CisKK291dF91bmxvY2s6CisJYnRyZnNfdHJlZV91bmxvY2socmlnaHQpOworCWZyZWVfZXh0ZW50X2J1ZmZlcihyaWdodCk7CisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBwdXNoIHNvbWUgZGF0YSBpbiB0aGUgcGF0aCBsZWFmIHRvIHRoZSBsZWZ0LCB0cnlpbmcgdG8gZnJlZSB1cCBhdAorICogbGVhc3QgZGF0YV9zaXplIGJ5dGVzLiAgcmV0dXJucyB6ZXJvIGlmIHRoZSBwdXNoIHdvcmtlZCwgbm9uemVybyBvdGhlcndpc2UKKyAqLworc3RhdGljIGludCBwdXNoX2xlYWZfbGVmdChzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywgc3RydWN0IGJ0cmZzX3Jvb3QKKwkJCSAgKnJvb3QsIHN0cnVjdCBidHJmc19wYXRoICpwYXRoLCBpbnQgZGF0YV9zaXplLAorCQkJICBpbnQgZW1wdHkpCit7CisJc3RydWN0IGJ0cmZzX2Rpc2tfa2V5IGRpc2tfa2V5OworCXN0cnVjdCBleHRlbnRfYnVmZmVyICpyaWdodCA9IHBhdGgtPm5vZGVzWzBdOworCXN0cnVjdCBleHRlbnRfYnVmZmVyICpsZWZ0OworCWludCBzbG90OworCWludCBpOworCWludCBmcmVlX3NwYWNlOworCWludCBwdXNoX3NwYWNlID0gMDsKKwlpbnQgcHVzaF9pdGVtcyA9IDA7CisJc3RydWN0IGJ0cmZzX2l0ZW0gKml0ZW07CisJdTMyIG9sZF9sZWZ0X25yaXRlbXM7CisJdTMyIHJpZ2h0X25yaXRlbXM7CisJdTMyIG5yOworCWludCByZXQgPSAwOworCWludCB3cmV0OworCXUzMiB0aGlzX2l0ZW1fc2l6ZTsKKwl1MzIgb2xkX2xlZnRfaXRlbV9zaXplOworCisJc2xvdCA9IHBhdGgtPnNsb3RzWzFdOworCWlmIChzbG90ID09IDApCisJCXJldHVybiAxOworCWlmICghcGF0aC0+bm9kZXNbMV0pCisJCXJldHVybiAxOworCisJcmlnaHRfbnJpdGVtcyA9IGJ0cmZzX2hlYWRlcl9ucml0ZW1zKHJpZ2h0KTsKKwlpZiAocmlnaHRfbnJpdGVtcyA9PSAwKQorCQlyZXR1cm4gMTsKKworCVdBUk5fT04oIWJ0cmZzX3RyZWVfbG9ja2VkKHBhdGgtPm5vZGVzWzFdKSk7CisKKwlsZWZ0ID0gcmVhZF9ub2RlX3Nsb3Qocm9vdCwgcGF0aC0+bm9kZXNbMV0sIHNsb3QgLSAxKTsKKwlidHJmc190cmVlX2xvY2sobGVmdCk7CisJZnJlZV9zcGFjZSA9IGJ0cmZzX2xlYWZfZnJlZV9zcGFjZShyb290LCBsZWZ0KTsKKwlpZiAoZnJlZV9zcGFjZSA8IGRhdGFfc2l6ZSkgeworCQlyZXQgPSAxOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBjb3cgYW5kIGRvdWJsZSBjaGVjayAqLworCXJldCA9IGJ0cmZzX2Nvd19ibG9jayh0cmFucywgcm9vdCwgbGVmdCwKKwkJCSAgICAgIHBhdGgtPm5vZGVzWzFdLCBzbG90IC0gMSwgJmxlZnQsIDApOworCWlmIChyZXQpIHsKKwkJLyogd2UgaGl0IC1FTk9TUEMsIGJ1dCBpdCBpc24ndCBmYXRhbCBoZXJlICovCisJCXJldCA9IDE7CisJCWdvdG8gb3V0OworCX0KKworCWZyZWVfc3BhY2UgPSBidHJmc19sZWFmX2ZyZWVfc3BhY2Uocm9vdCwgbGVmdCk7CisJaWYgKGZyZWVfc3BhY2UgPCBkYXRhX3NpemUpIHsKKwkJcmV0ID0gMTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKGVtcHR5KQorCQluciA9IHJpZ2h0X25yaXRlbXM7CisJZWxzZQorCQluciA9IHJpZ2h0X25yaXRlbXMgLSAxOworCisJZm9yIChpID0gMDsgaSA8IG5yOyBpKyspIHsKKwkJaXRlbSA9IGJ0cmZzX2l0ZW1fbnIocmlnaHQsIGkpOworCQlpZiAoIXJpZ2h0LT5tYXBfdG9rZW4pIHsKKwkJCW1hcF9leHRlbnRfYnVmZmVyKHJpZ2h0LCAodW5zaWduZWQgbG9uZylpdGVtLAorCQkJCQlzaXplb2Yoc3RydWN0IGJ0cmZzX2l0ZW0pLAorCQkJCQkmcmlnaHQtPm1hcF90b2tlbiwgJnJpZ2h0LT5rYWRkciwKKwkJCQkJJnJpZ2h0LT5tYXBfc3RhcnQsICZyaWdodC0+bWFwX2xlbiwKKwkJCQkJS01fVVNFUjEpOworCQl9CisKKwkJaWYgKCFlbXB0eSAmJiBwdXNoX2l0ZW1zID4gMCkgeworCQkJaWYgKHBhdGgtPnNsb3RzWzBdIDwgaSkKKwkJCQlicmVhazsKKwkJCWlmIChwYXRoLT5zbG90c1swXSA9PSBpKSB7CisJCQkJaW50IHNwYWNlID0gYnRyZnNfbGVhZl9mcmVlX3NwYWNlKHJvb3QsIHJpZ2h0KTsKKwkJCQlpZiAoc3BhY2UgKyBwdXNoX3NwYWNlICogMiA+IGZyZWVfc3BhY2UpCisJCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJaWYgKHBhdGgtPnNsb3RzWzBdID09IGkpCisJCQlwdXNoX3NwYWNlICs9IGRhdGFfc2l6ZTsKKworCQl0aGlzX2l0ZW1fc2l6ZSA9IGJ0cmZzX2l0ZW1fc2l6ZShyaWdodCwgaXRlbSk7CisJCWlmICh0aGlzX2l0ZW1fc2l6ZSArIHNpemVvZigqaXRlbSkgKyBwdXNoX3NwYWNlID4gZnJlZV9zcGFjZSkKKwkJCWJyZWFrOworCisJCXB1c2hfaXRlbXMrKzsKKwkJcHVzaF9zcGFjZSArPSB0aGlzX2l0ZW1fc2l6ZSArIHNpemVvZigqaXRlbSk7CisJfQorCisJaWYgKHJpZ2h0LT5tYXBfdG9rZW4pIHsKKwkJdW5tYXBfZXh0ZW50X2J1ZmZlcihyaWdodCwgcmlnaHQtPm1hcF90b2tlbiwgS01fVVNFUjEpOworCQlyaWdodC0+bWFwX3Rva2VuID0gTlVMTDsKKwl9CisKKwlpZiAocHVzaF9pdGVtcyA9PSAwKSB7CisJCXJldCA9IDE7CisJCWdvdG8gb3V0OworCX0KKwlpZiAoIWVtcHR5ICYmIHB1c2hfaXRlbXMgPT0gYnRyZnNfaGVhZGVyX25yaXRlbXMocmlnaHQpKQorCQlXQVJOX09OKDEpOworCisJLyogcHVzaCBkYXRhIGZyb20gcmlnaHQgdG8gbGVmdCAqLworCWNvcHlfZXh0ZW50X2J1ZmZlcihsZWZ0LCByaWdodCwKKwkJCSAgIGJ0cmZzX2l0ZW1fbnJfb2Zmc2V0KGJ0cmZzX2hlYWRlcl9ucml0ZW1zKGxlZnQpKSwKKwkJCSAgIGJ0cmZzX2l0ZW1fbnJfb2Zmc2V0KDApLAorCQkJICAgcHVzaF9pdGVtcyAqIHNpemVvZihzdHJ1Y3QgYnRyZnNfaXRlbSkpOworCisJcHVzaF9zcGFjZSA9IEJUUkZTX0xFQUZfREFUQV9TSVpFKHJvb3QpIC0KKwkJICAgICBidHJmc19pdGVtX29mZnNldF9ucihyaWdodCwgcHVzaF9pdGVtcyAtIDEpOworCisJY29weV9leHRlbnRfYnVmZmVyKGxlZnQsIHJpZ2h0LCBidHJmc19sZWFmX2RhdGEobGVmdCkgKworCQkgICAgIGxlYWZfZGF0YV9lbmQocm9vdCwgbGVmdCkgLSBwdXNoX3NwYWNlLAorCQkgICAgIGJ0cmZzX2xlYWZfZGF0YShyaWdodCkgKworCQkgICAgIGJ0cmZzX2l0ZW1fb2Zmc2V0X25yKHJpZ2h0LCBwdXNoX2l0ZW1zIC0gMSksCisJCSAgICAgcHVzaF9zcGFjZSk7CisJb2xkX2xlZnRfbnJpdGVtcyA9IGJ0cmZzX2hlYWRlcl9ucml0ZW1zKGxlZnQpOworCUJVR19PTihvbGRfbGVmdF9ucml0ZW1zIDw9IDApOworCisJb2xkX2xlZnRfaXRlbV9zaXplID0gYnRyZnNfaXRlbV9vZmZzZXRfbnIobGVmdCwgb2xkX2xlZnRfbnJpdGVtcyAtIDEpOworCWZvciAoaSA9IG9sZF9sZWZ0X25yaXRlbXM7IGkgPCBvbGRfbGVmdF9ucml0ZW1zICsgcHVzaF9pdGVtczsgaSsrKSB7CisJCXUzMiBpb2ZmOworCisJCWl0ZW0gPSBidHJmc19pdGVtX25yKGxlZnQsIGkpOworCQlpZiAoIWxlZnQtPm1hcF90b2tlbikgeworCQkJbWFwX2V4dGVudF9idWZmZXIobGVmdCwgKHVuc2lnbmVkIGxvbmcpaXRlbSwKKwkJCQkJc2l6ZW9mKHN0cnVjdCBidHJmc19pdGVtKSwKKwkJCQkJJmxlZnQtPm1hcF90b2tlbiwgJmxlZnQtPmthZGRyLAorCQkJCQkmbGVmdC0+bWFwX3N0YXJ0LCAmbGVmdC0+bWFwX2xlbiwKKwkJCQkJS01fVVNFUjEpOworCQl9CisKKwkJaW9mZiA9IGJ0cmZzX2l0ZW1fb2Zmc2V0KGxlZnQsIGl0ZW0pOworCQlidHJmc19zZXRfaXRlbV9vZmZzZXQobGVmdCwgaXRlbSwKKwkJICAgICAgaW9mZiAtIChCVFJGU19MRUFGX0RBVEFfU0laRShyb290KSAtIG9sZF9sZWZ0X2l0ZW1fc2l6ZSkpOworCX0KKwlidHJmc19zZXRfaGVhZGVyX25yaXRlbXMobGVmdCwgb2xkX2xlZnRfbnJpdGVtcyArIHB1c2hfaXRlbXMpOworCWlmIChsZWZ0LT5tYXBfdG9rZW4pIHsKKwkJdW5tYXBfZXh0ZW50X2J1ZmZlcihsZWZ0LCBsZWZ0LT5tYXBfdG9rZW4sIEtNX1VTRVIxKTsKKwkJbGVmdC0+bWFwX3Rva2VuID0gTlVMTDsKKwl9CisKKwkvKiBmaXh1cCByaWdodCBub2RlICovCisJaWYgKHB1c2hfaXRlbXMgPiByaWdodF9ucml0ZW1zKSB7CisJCXByaW50ayhLRVJOX0NSSVQgInB1c2ggaXRlbXMgJWQgbnIgJXVcbiIsIHB1c2hfaXRlbXMsCisJCSAgICAgICByaWdodF9ucml0ZW1zKTsKKwkJV0FSTl9PTigxKTsKKwl9CisKKwlpZiAocHVzaF9pdGVtcyA8IHJpZ2h0X25yaXRlbXMpIHsKKwkJcHVzaF9zcGFjZSA9IGJ0cmZzX2l0ZW1fb2Zmc2V0X25yKHJpZ2h0LCBwdXNoX2l0ZW1zIC0gMSkgLQorCQkJCQkJICBsZWFmX2RhdGFfZW5kKHJvb3QsIHJpZ2h0KTsKKwkJbWVtbW92ZV9leHRlbnRfYnVmZmVyKHJpZ2h0LCBidHJmc19sZWFmX2RhdGEocmlnaHQpICsKKwkJCQkgICAgICBCVFJGU19MRUFGX0RBVEFfU0laRShyb290KSAtIHB1c2hfc3BhY2UsCisJCQkJICAgICAgYnRyZnNfbGVhZl9kYXRhKHJpZ2h0KSArCisJCQkJICAgICAgbGVhZl9kYXRhX2VuZChyb290LCByaWdodCksIHB1c2hfc3BhY2UpOworCisJCW1lbW1vdmVfZXh0ZW50X2J1ZmZlcihyaWdodCwgYnRyZnNfaXRlbV9ucl9vZmZzZXQoMCksCisJCQkgICAgICBidHJmc19pdGVtX25yX29mZnNldChwdXNoX2l0ZW1zKSwKKwkJCSAgICAgKGJ0cmZzX2hlYWRlcl9ucml0ZW1zKHJpZ2h0KSAtIHB1c2hfaXRlbXMpICoKKwkJCSAgICAgc2l6ZW9mKHN0cnVjdCBidHJmc19pdGVtKSk7CisJfQorCXJpZ2h0X25yaXRlbXMgLT0gcHVzaF9pdGVtczsKKwlidHJmc19zZXRfaGVhZGVyX25yaXRlbXMocmlnaHQsIHJpZ2h0X25yaXRlbXMpOworCXB1c2hfc3BhY2UgPSBCVFJGU19MRUFGX0RBVEFfU0laRShyb290KTsKKwlmb3IgKGkgPSAwOyBpIDwgcmlnaHRfbnJpdGVtczsgaSsrKSB7CisJCWl0ZW0gPSBidHJmc19pdGVtX25yKHJpZ2h0LCBpKTsKKworCQlpZiAoIXJpZ2h0LT5tYXBfdG9rZW4pIHsKKwkJCW1hcF9leHRlbnRfYnVmZmVyKHJpZ2h0LCAodW5zaWduZWQgbG9uZylpdGVtLAorCQkJCQlzaXplb2Yoc3RydWN0IGJ0cmZzX2l0ZW0pLAorCQkJCQkmcmlnaHQtPm1hcF90b2tlbiwgJnJpZ2h0LT5rYWRkciwKKwkJCQkJJnJpZ2h0LT5tYXBfc3RhcnQsICZyaWdodC0+bWFwX2xlbiwKKwkJCQkJS01fVVNFUjEpOworCQl9CisKKwkJcHVzaF9zcGFjZSA9IHB1c2hfc3BhY2UgLSBidHJmc19pdGVtX3NpemUocmlnaHQsIGl0ZW0pOworCQlidHJmc19zZXRfaXRlbV9vZmZzZXQocmlnaHQsIGl0ZW0sIHB1c2hfc3BhY2UpOworCX0KKwlpZiAocmlnaHQtPm1hcF90b2tlbikgeworCQl1bm1hcF9leHRlbnRfYnVmZmVyKHJpZ2h0LCByaWdodC0+bWFwX3Rva2VuLCBLTV9VU0VSMSk7CisJCXJpZ2h0LT5tYXBfdG9rZW4gPSBOVUxMOworCX0KKworCWJ0cmZzX21hcmtfYnVmZmVyX2RpcnR5KGxlZnQpOworCWlmIChyaWdodF9ucml0ZW1zKQorCQlidHJmc19tYXJrX2J1ZmZlcl9kaXJ0eShyaWdodCk7CisKKwlyZXQgPSBidHJmc191cGRhdGVfcmVmKHRyYW5zLCByb290LCByaWdodCwgbGVmdCwKKwkJCSAgICAgICBvbGRfbGVmdF9ucml0ZW1zLCBwdXNoX2l0ZW1zKTsKKwlCVUdfT04ocmV0KTsKKworCWJ0cmZzX2l0ZW1fa2V5KHJpZ2h0LCAmZGlza19rZXksIDApOworCXdyZXQgPSBmaXh1cF9sb3dfa2V5cyh0cmFucywgcm9vdCwgcGF0aCwgJmRpc2tfa2V5LCAxKTsKKwlpZiAod3JldCkKKwkJcmV0ID0gd3JldDsKKworCS8qIHRoZW4gZml4dXAgdGhlIGxlYWYgcG9pbnRlciBpbiB0aGUgcGF0aCAqLworCWlmIChwYXRoLT5zbG90c1swXSA8IHB1c2hfaXRlbXMpIHsKKwkJcGF0aC0+c2xvdHNbMF0gKz0gb2xkX2xlZnRfbnJpdGVtczsKKwkJaWYgKGJ0cmZzX2hlYWRlcl9ucml0ZW1zKHBhdGgtPm5vZGVzWzBdKSA9PSAwKQorCQkJY2xlYW5fdHJlZV9ibG9jayh0cmFucywgcm9vdCwgcGF0aC0+bm9kZXNbMF0pOworCQlidHJmc190cmVlX3VubG9jayhwYXRoLT5ub2Rlc1swXSk7CisJCWZyZWVfZXh0ZW50X2J1ZmZlcihwYXRoLT5ub2Rlc1swXSk7CisJCXBhdGgtPm5vZGVzWzBdID0gbGVmdDsKKwkJcGF0aC0+c2xvdHNbMV0gLT0gMTsKKwl9IGVsc2UgeworCQlidHJmc190cmVlX3VubG9jayhsZWZ0KTsKKwkJZnJlZV9leHRlbnRfYnVmZmVyKGxlZnQpOworCQlwYXRoLT5zbG90c1swXSAtPSBwdXNoX2l0ZW1zOworCX0KKwlCVUdfT04ocGF0aC0+c2xvdHNbMF0gPCAwKTsKKwlyZXR1cm4gcmV0Oworb3V0OgorCWJ0cmZzX3RyZWVfdW5sb2NrKGxlZnQpOworCWZyZWVfZXh0ZW50X2J1ZmZlcihsZWZ0KTsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogc3BsaXQgdGhlIHBhdGgncyBsZWFmIGluIHR3bywgbWFraW5nIHN1cmUgdGhlcmUgaXMgYXQgbGVhc3QgZGF0YV9zaXplCisgKiBhdmFpbGFibGUgZm9yIHRoZSByZXN1bHRpbmcgbGVhZiBsZXZlbCBvZiB0aGUgcGF0aC4KKyAqCisgKiByZXR1cm5zIDAgaWYgYWxsIHdlbnQgd2VsbCBhbmQgPCAwIG9uIGZhaWx1cmUuCisgKi8KK3N0YXRpYyBub2lubGluZSBpbnQgc3BsaXRfbGVhZihzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKKwkJCSAgICAgICBzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwKKwkJCSAgICAgICBzdHJ1Y3QgYnRyZnNfa2V5ICppbnNfa2V5LAorCQkJICAgICAgIHN0cnVjdCBidHJmc19wYXRoICpwYXRoLCBpbnQgZGF0YV9zaXplLAorCQkJICAgICAgIGludCBleHRlbmQpCit7CisJc3RydWN0IGV4dGVudF9idWZmZXIgKmw7CisJdTMyIG5yaXRlbXM7CisJaW50IG1pZDsKKwlpbnQgc2xvdDsKKwlzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqcmlnaHQ7CisJaW50IGRhdGFfY29weV9zaXplOworCWludCBydF9kYXRhX29mZjsKKwlpbnQgaTsKKwlpbnQgcmV0ID0gMDsKKwlpbnQgd3JldDsKKwlpbnQgZG91YmxlX3NwbGl0OworCWludCBudW1fZG91YmxlcyA9IDA7CisJc3RydWN0IGJ0cmZzX2Rpc2tfa2V5IGRpc2tfa2V5OworCisJLyogZmlyc3QgdHJ5IHRvIG1ha2Ugc29tZSByb29tIGJ5IHB1c2hpbmcgbGVmdCBhbmQgcmlnaHQgKi8KKwlpZiAoZGF0YV9zaXplICYmIGluc19rZXktPnR5cGUgIT0gQlRSRlNfRElSX0lURU1fS0VZKSB7CisJCXdyZXQgPSBwdXNoX2xlYWZfcmlnaHQodHJhbnMsIHJvb3QsIHBhdGgsIGRhdGFfc2l6ZSwgMCk7CisJCWlmICh3cmV0IDwgMCkKKwkJCXJldHVybiB3cmV0OworCQlpZiAod3JldCkgeworCQkJd3JldCA9IHB1c2hfbGVhZl9sZWZ0KHRyYW5zLCByb290LCBwYXRoLCBkYXRhX3NpemUsIDApOworCQkJaWYgKHdyZXQgPCAwKQorCQkJCXJldHVybiB3cmV0OworCQl9CisJCWwgPSBwYXRoLT5ub2Rlc1swXTsKKworCQkvKiBkaWQgdGhlIHB1c2hlcyB3b3JrPyAqLworCQlpZiAoYnRyZnNfbGVhZl9mcmVlX3NwYWNlKHJvb3QsIGwpID49IGRhdGFfc2l6ZSkKKwkJCXJldHVybiAwOworCX0KKworCWlmICghcGF0aC0+bm9kZXNbMV0pIHsKKwkJcmV0ID0gaW5zZXJ0X25ld19yb290KHRyYW5zLCByb290LCBwYXRoLCAxKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJfQorYWdhaW46CisJZG91YmxlX3NwbGl0ID0gMDsKKwlsID0gcGF0aC0+bm9kZXNbMF07CisJc2xvdCA9IHBhdGgtPnNsb3RzWzBdOworCW5yaXRlbXMgPSBidHJmc19oZWFkZXJfbnJpdGVtcyhsKTsKKwltaWQgPSAobnJpdGVtcyArIDEpIC8gMjsKKworCXJpZ2h0ID0gYnRyZnNfYWxsb2NfZnJlZV9ibG9jayh0cmFucywgcm9vdCwgcm9vdC0+bGVhZnNpemUsCisJCQkJCXBhdGgtPm5vZGVzWzFdLT5zdGFydCwKKwkJCQkJcm9vdC0+cm9vdF9rZXkub2JqZWN0aWQsCisJCQkJCXRyYW5zLT50cmFuc2lkLCAwLCBsLT5zdGFydCwgMCk7CisJaWYgKElTX0VSUihyaWdodCkpIHsKKwkJQlVHX09OKDEpOworCQlyZXR1cm4gUFRSX0VSUihyaWdodCk7CisJfQorCisJbWVtc2V0X2V4dGVudF9idWZmZXIocmlnaHQsIDAsIDAsIHNpemVvZihzdHJ1Y3QgYnRyZnNfaGVhZGVyKSk7CisJYnRyZnNfc2V0X2hlYWRlcl9ieXRlbnIocmlnaHQsIHJpZ2h0LT5zdGFydCk7CisJYnRyZnNfc2V0X2hlYWRlcl9nZW5lcmF0aW9uKHJpZ2h0LCB0cmFucy0+dHJhbnNpZCk7CisJYnRyZnNfc2V0X2hlYWRlcl9vd25lcihyaWdodCwgcm9vdC0+cm9vdF9rZXkub2JqZWN0aWQpOworCWJ0cmZzX3NldF9oZWFkZXJfbGV2ZWwocmlnaHQsIDApOworCXdyaXRlX2V4dGVudF9idWZmZXIocmlnaHQsIHJvb3QtPmZzX2luZm8tPmZzaWQsCisJCQkgICAgKHVuc2lnbmVkIGxvbmcpYnRyZnNfaGVhZGVyX2ZzaWQocmlnaHQpLAorCQkJICAgIEJUUkZTX0ZTSURfU0laRSk7CisKKwl3cml0ZV9leHRlbnRfYnVmZmVyKHJpZ2h0LCByb290LT5mc19pbmZvLT5jaHVua190cmVlX3V1aWQsCisJCQkgICAgKHVuc2lnbmVkIGxvbmcpYnRyZnNfaGVhZGVyX2NodW5rX3RyZWVfdXVpZChyaWdodCksCisJCQkgICAgQlRSRlNfVVVJRF9TSVpFKTsKKwlpZiAobWlkIDw9IHNsb3QpIHsKKwkJaWYgKG5yaXRlbXMgPT0gMSB8fAorCQkgICAgbGVhZl9zcGFjZV91c2VkKGwsIG1pZCwgbnJpdGVtcyAtIG1pZCkgKyBkYXRhX3NpemUgPgorCQkJQlRSRlNfTEVBRl9EQVRBX1NJWkUocm9vdCkpIHsKKwkJCWlmIChzbG90ID49IG5yaXRlbXMpIHsKKwkJCQlidHJmc19jcHVfa2V5X3RvX2Rpc2soJmRpc2tfa2V5LCBpbnNfa2V5KTsKKwkJCQlidHJmc19zZXRfaGVhZGVyX25yaXRlbXMocmlnaHQsIDApOworCQkJCXdyZXQgPSBpbnNlcnRfcHRyKHRyYW5zLCByb290LCBwYXRoLAorCQkJCQkJICAmZGlza19rZXksIHJpZ2h0LT5zdGFydCwKKwkJCQkJCSAgcGF0aC0+c2xvdHNbMV0gKyAxLCAxKTsKKwkJCQlpZiAod3JldCkKKwkJCQkJcmV0ID0gd3JldDsKKworCQkJCWJ0cmZzX3RyZWVfdW5sb2NrKHBhdGgtPm5vZGVzWzBdKTsKKwkJCQlmcmVlX2V4dGVudF9idWZmZXIocGF0aC0+bm9kZXNbMF0pOworCQkJCXBhdGgtPm5vZGVzWzBdID0gcmlnaHQ7CisJCQkJcGF0aC0+c2xvdHNbMF0gPSAwOworCQkJCXBhdGgtPnNsb3RzWzFdICs9IDE7CisJCQkJYnRyZnNfbWFya19idWZmZXJfZGlydHkocmlnaHQpOworCQkJCXJldHVybiByZXQ7CisJCQl9CisJCQltaWQgPSBzbG90OworCQkJaWYgKG1pZCAhPSBucml0ZW1zICYmCisJCQkgICAgbGVhZl9zcGFjZV91c2VkKGwsIG1pZCwgbnJpdGVtcyAtIG1pZCkgKworCQkJICAgIGRhdGFfc2l6ZSA+IEJUUkZTX0xFQUZfREFUQV9TSVpFKHJvb3QpKSB7CisJCQkJZG91YmxlX3NwbGl0ID0gMTsKKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCWlmIChsZWFmX3NwYWNlX3VzZWQobCwgMCwgbWlkKSArIGRhdGFfc2l6ZSA+CisJCQlCVFJGU19MRUFGX0RBVEFfU0laRShyb290KSkgeworCQkJaWYgKCFleHRlbmQgJiYgZGF0YV9zaXplICYmIHNsb3QgPT0gMCkgeworCQkJCWJ0cmZzX2NwdV9rZXlfdG9fZGlzaygmZGlza19rZXksIGluc19rZXkpOworCQkJCWJ0cmZzX3NldF9oZWFkZXJfbnJpdGVtcyhyaWdodCwgMCk7CisJCQkJd3JldCA9IGluc2VydF9wdHIodHJhbnMsIHJvb3QsIHBhdGgsCisJCQkJCQkgICZkaXNrX2tleSwKKwkJCQkJCSAgcmlnaHQtPnN0YXJ0LAorCQkJCQkJICBwYXRoLT5zbG90c1sxXSwgMSk7CisJCQkJaWYgKHdyZXQpCisJCQkJCXJldCA9IHdyZXQ7CisJCQkJYnRyZnNfdHJlZV91bmxvY2socGF0aC0+bm9kZXNbMF0pOworCQkJCWZyZWVfZXh0ZW50X2J1ZmZlcihwYXRoLT5ub2Rlc1swXSk7CisJCQkJcGF0aC0+bm9kZXNbMF0gPSByaWdodDsKKwkJCQlwYXRoLT5zbG90c1swXSA9IDA7CisJCQkJaWYgKHBhdGgtPnNsb3RzWzFdID09IDApIHsKKwkJCQkJd3JldCA9IGZpeHVwX2xvd19rZXlzKHRyYW5zLCByb290LAorCQkJCQkJICAgICAgcGF0aCwgJmRpc2tfa2V5LCAxKTsKKwkJCQkJaWYgKHdyZXQpCisJCQkJCQlyZXQgPSB3cmV0OworCQkJCX0KKwkJCQlidHJmc19tYXJrX2J1ZmZlcl9kaXJ0eShyaWdodCk7CisJCQkJcmV0dXJuIHJldDsKKwkJCX0gZWxzZSBpZiAoKGV4dGVuZCB8fCAhZGF0YV9zaXplKSAmJiBzbG90ID09IDApIHsKKwkJCQltaWQgPSAxOworCQkJfSBlbHNlIHsKKwkJCQltaWQgPSBzbG90OworCQkJCWlmIChtaWQgIT0gbnJpdGVtcyAmJgorCQkJCSAgICBsZWFmX3NwYWNlX3VzZWQobCwgbWlkLCBucml0ZW1zIC0gbWlkKSArCisJCQkJICAgIGRhdGFfc2l6ZSA+IEJUUkZTX0xFQUZfREFUQV9TSVpFKHJvb3QpKSB7CisJCQkJCWRvdWJsZV9zcGxpdCA9IDE7CisJCQkJfQorCQkJfQorCQl9CisJfQorCW5yaXRlbXMgPSBucml0ZW1zIC0gbWlkOworCWJ0cmZzX3NldF9oZWFkZXJfbnJpdGVtcyhyaWdodCwgbnJpdGVtcyk7CisJZGF0YV9jb3B5X3NpemUgPSBidHJmc19pdGVtX2VuZF9ucihsLCBtaWQpIC0gbGVhZl9kYXRhX2VuZChyb290LCBsKTsKKworCWNvcHlfZXh0ZW50X2J1ZmZlcihyaWdodCwgbCwgYnRyZnNfaXRlbV9ucl9vZmZzZXQoMCksCisJCQkgICBidHJmc19pdGVtX25yX29mZnNldChtaWQpLAorCQkJICAgbnJpdGVtcyAqIHNpemVvZihzdHJ1Y3QgYnRyZnNfaXRlbSkpOworCisJY29weV9leHRlbnRfYnVmZmVyKHJpZ2h0LCBsLAorCQkgICAgIGJ0cmZzX2xlYWZfZGF0YShyaWdodCkgKyBCVFJGU19MRUFGX0RBVEFfU0laRShyb290KSAtCisJCSAgICAgZGF0YV9jb3B5X3NpemUsIGJ0cmZzX2xlYWZfZGF0YShsKSArCisJCSAgICAgbGVhZl9kYXRhX2VuZChyb290LCBsKSwgZGF0YV9jb3B5X3NpemUpOworCisJcnRfZGF0YV9vZmYgPSBCVFJGU19MRUFGX0RBVEFfU0laRShyb290KSAtCisJCSAgICAgIGJ0cmZzX2l0ZW1fZW5kX25yKGwsIG1pZCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnJpdGVtczsgaSsrKSB7CisJCXN0cnVjdCBidHJmc19pdGVtICppdGVtID0gYnRyZnNfaXRlbV9ucihyaWdodCwgaSk7CisJCXUzMiBpb2ZmOworCisJCWlmICghcmlnaHQtPm1hcF90b2tlbikgeworCQkJbWFwX2V4dGVudF9idWZmZXIocmlnaHQsICh1bnNpZ25lZCBsb25nKWl0ZW0sCisJCQkJCXNpemVvZihzdHJ1Y3QgYnRyZnNfaXRlbSksCisJCQkJCSZyaWdodC0+bWFwX3Rva2VuLCAmcmlnaHQtPmthZGRyLAorCQkJCQkmcmlnaHQtPm1hcF9zdGFydCwgJnJpZ2h0LT5tYXBfbGVuLAorCQkJCQlLTV9VU0VSMSk7CisJCX0KKworCQlpb2ZmID0gYnRyZnNfaXRlbV9vZmZzZXQocmlnaHQsIGl0ZW0pOworCQlidHJmc19zZXRfaXRlbV9vZmZzZXQocmlnaHQsIGl0ZW0sIGlvZmYgKyBydF9kYXRhX29mZik7CisJfQorCisJaWYgKHJpZ2h0LT5tYXBfdG9rZW4pIHsKKwkJdW5tYXBfZXh0ZW50X2J1ZmZlcihyaWdodCwgcmlnaHQtPm1hcF90b2tlbiwgS01fVVNFUjEpOworCQlyaWdodC0+bWFwX3Rva2VuID0gTlVMTDsKKwl9CisKKwlidHJmc19zZXRfaGVhZGVyX25yaXRlbXMobCwgbWlkKTsKKwlyZXQgPSAwOworCWJ0cmZzX2l0ZW1fa2V5KHJpZ2h0LCAmZGlza19rZXksIDApOworCXdyZXQgPSBpbnNlcnRfcHRyKHRyYW5zLCByb290LCBwYXRoLCAmZGlza19rZXksIHJpZ2h0LT5zdGFydCwKKwkJCSAgcGF0aC0+c2xvdHNbMV0gKyAxLCAxKTsKKwlpZiAod3JldCkKKwkJcmV0ID0gd3JldDsKKworCWJ0cmZzX21hcmtfYnVmZmVyX2RpcnR5KHJpZ2h0KTsKKwlidHJmc19tYXJrX2J1ZmZlcl9kaXJ0eShsKTsKKwlCVUdfT04ocGF0aC0+c2xvdHNbMF0gIT0gc2xvdCk7CisKKwlyZXQgPSBidHJmc191cGRhdGVfcmVmKHRyYW5zLCByb290LCBsLCByaWdodCwgMCwgbnJpdGVtcyk7CisJQlVHX09OKHJldCk7CisKKwlpZiAobWlkIDw9IHNsb3QpIHsKKwkJYnRyZnNfdHJlZV91bmxvY2socGF0aC0+bm9kZXNbMF0pOworCQlmcmVlX2V4dGVudF9idWZmZXIocGF0aC0+bm9kZXNbMF0pOworCQlwYXRoLT5ub2Rlc1swXSA9IHJpZ2h0OworCQlwYXRoLT5zbG90c1swXSAtPSBtaWQ7CisJCXBhdGgtPnNsb3RzWzFdICs9IDE7CisJfSBlbHNlIHsKKwkJYnRyZnNfdHJlZV91bmxvY2socmlnaHQpOworCQlmcmVlX2V4dGVudF9idWZmZXIocmlnaHQpOworCX0KKworCUJVR19PTihwYXRoLT5zbG90c1swXSA8IDApOworCisJaWYgKGRvdWJsZV9zcGxpdCkgeworCQlCVUdfT04obnVtX2RvdWJsZXMgIT0gMCk7CisJCW51bV9kb3VibGVzKys7CisJCWdvdG8gYWdhaW47CisJfQorCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIHNwbGl0cyBhIHNpbmdsZSBpdGVtIGludG8gdHdvIGl0ZW1zLAorICogZ2l2aW5nICduZXdfa2V5JyB0byB0aGUgbmV3IGl0ZW0gYW5kIHNwbGl0dGluZyB0aGUKKyAqIG9sZCBvbmUgYXQgc3BsaXRfb2Zmc2V0IChmcm9tIHRoZSBzdGFydCBvZiB0aGUgaXRlbSkuCisgKgorICogVGhlIHBhdGggbWF5IGJlIHJlbGVhc2VkIGJ5IHRoaXMgb3BlcmF0aW9uLiAgQWZ0ZXIKKyAqIHRoZSBzcGxpdCwgdGhlIHBhdGggaXMgcG9pbnRpbmcgdG8gdGhlIG9sZCBpdGVtLiAgVGhlCisgKiBuZXcgaXRlbSBpcyBnb2luZyB0byBiZSBpbiB0aGUgc2FtZSBub2RlIGFzIHRoZSBvbGQgb25lLgorICoKKyAqIE5vdGUsIHRoZSBpdGVtIGJlaW5nIHNwbGl0IG11c3QgYmUgc21hbGxlciBlbm91Z2ggdG8gbGl2ZSBhbG9uZSBvbgorICogYSB0cmVlIGJsb2NrIHdpdGggcm9vbSBmb3Igb25lIGV4dHJhIHN0cnVjdCBidHJmc19pdGVtCisgKgorICogVGhpcyBhbGxvd3MgdXMgdG8gc3BsaXQgdGhlIGl0ZW0gaW4gcGxhY2UsIGtlZXBpbmcgYSBsb2NrIG9uIHRoZQorICogbGVhZiB0aGUgZW50aXJlIHRpbWUuCisgKi8KK2ludCBidHJmc19zcGxpdF9pdGVtKHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAorCQkgICAgIHN0cnVjdCBidHJmc19yb290ICpyb290LAorCQkgICAgIHN0cnVjdCBidHJmc19wYXRoICpwYXRoLAorCQkgICAgIHN0cnVjdCBidHJmc19rZXkgKm5ld19rZXksCisJCSAgICAgdW5zaWduZWQgbG9uZyBzcGxpdF9vZmZzZXQpCit7CisJdTMyIGl0ZW1fc2l6ZTsKKwlzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqbGVhZjsKKwlzdHJ1Y3QgYnRyZnNfa2V5IG9yaWdfa2V5OworCXN0cnVjdCBidHJmc19pdGVtICppdGVtOworCXN0cnVjdCBidHJmc19pdGVtICpuZXdfaXRlbTsKKwlpbnQgcmV0ID0gMDsKKwlpbnQgc2xvdDsKKwl1MzIgbnJpdGVtczsKKwl1MzIgb3JpZ19vZmZzZXQ7CisJc3RydWN0IGJ0cmZzX2Rpc2tfa2V5IGRpc2tfa2V5OworCWNoYXIgKmJ1ZjsKKworCWxlYWYgPSBwYXRoLT5ub2Rlc1swXTsKKwlidHJmc19pdGVtX2tleV90b19jcHUobGVhZiwgJm9yaWdfa2V5LCBwYXRoLT5zbG90c1swXSk7CisJaWYgKGJ0cmZzX2xlYWZfZnJlZV9zcGFjZShyb290LCBsZWFmKSA+PSBzaXplb2Yoc3RydWN0IGJ0cmZzX2l0ZW0pKQorCQlnb3RvIHNwbGl0OworCisJaXRlbV9zaXplID0gYnRyZnNfaXRlbV9zaXplX25yKGxlYWYsIHBhdGgtPnNsb3RzWzBdKTsKKwlidHJmc19yZWxlYXNlX3BhdGgocm9vdCwgcGF0aCk7CisKKwlwYXRoLT5zZWFyY2hfZm9yX3NwbGl0ID0gMTsKKwlwYXRoLT5rZWVwX2xvY2tzID0gMTsKKworCXJldCA9IGJ0cmZzX3NlYXJjaF9zbG90KHRyYW5zLCByb290LCAmb3JpZ19rZXksIHBhdGgsIDAsIDEpOworCXBhdGgtPnNlYXJjaF9mb3Jfc3BsaXQgPSAwOworCisJLyogaWYgb3VyIGl0ZW0gaXNuJ3QgdGhlcmUgb3IgZ290IHNtYWxsZXIsIHJldHVybiBub3cgKi8KKwlpZiAocmV0ICE9IDAgfHwgaXRlbV9zaXplICE9IGJ0cmZzX2l0ZW1fc2l6ZV9ucihwYXRoLT5ub2Rlc1swXSwKKwkJCQkJCQlwYXRoLT5zbG90c1swXSkpIHsKKwkJcGF0aC0+a2VlcF9sb2NrcyA9IDA7CisJCXJldHVybiAtRUFHQUlOOworCX0KKworCXJldCA9IHNwbGl0X2xlYWYodHJhbnMsIHJvb3QsICZvcmlnX2tleSwgcGF0aCwKKwkJCSBzaXplb2Yoc3RydWN0IGJ0cmZzX2l0ZW0pLCAxKTsKKwlwYXRoLT5rZWVwX2xvY2tzID0gMDsKKwlCVUdfT04ocmV0KTsKKworCWxlYWYgPSBwYXRoLT5ub2Rlc1swXTsKKwlCVUdfT04oYnRyZnNfbGVhZl9mcmVlX3NwYWNlKHJvb3QsIGxlYWYpIDwgc2l6ZW9mKHN0cnVjdCBidHJmc19pdGVtKSk7CisKK3NwbGl0OgorCWl0ZW0gPSBidHJmc19pdGVtX25yKGxlYWYsIHBhdGgtPnNsb3RzWzBdKTsKKwlvcmlnX29mZnNldCA9IGJ0cmZzX2l0ZW1fb2Zmc2V0KGxlYWYsIGl0ZW0pOworCWl0ZW1fc2l6ZSA9IGJ0cmZzX2l0ZW1fc2l6ZShsZWFmLCBpdGVtKTsKKworCisJYnVmID0ga21hbGxvYyhpdGVtX3NpemUsIEdGUF9OT0ZTKTsKKwlyZWFkX2V4dGVudF9idWZmZXIobGVhZiwgYnVmLCBidHJmc19pdGVtX3B0cl9vZmZzZXQobGVhZiwKKwkJCSAgICBwYXRoLT5zbG90c1swXSksIGl0ZW1fc2l6ZSk7CisJc2xvdCA9IHBhdGgtPnNsb3RzWzBdICsgMTsKKwlsZWFmID0gcGF0aC0+bm9kZXNbMF07CisKKwlucml0ZW1zID0gYnRyZnNfaGVhZGVyX25yaXRlbXMobGVhZik7CisKKwlpZiAoc2xvdCAhPSBucml0ZW1zKSB7CisJCS8qIHNoaWZ0IHRoZSBpdGVtcyAqLworCQltZW1tb3ZlX2V4dGVudF9idWZmZXIobGVhZiwgYnRyZnNfaXRlbV9ucl9vZmZzZXQoc2xvdCArIDEpLAorCQkJICAgICAgYnRyZnNfaXRlbV9ucl9vZmZzZXQoc2xvdCksCisJCQkgICAgICAobnJpdGVtcyAtIHNsb3QpICogc2l6ZW9mKHN0cnVjdCBidHJmc19pdGVtKSk7CisKKwl9CisKKwlidHJmc19jcHVfa2V5X3RvX2Rpc2soJmRpc2tfa2V5LCBuZXdfa2V5KTsKKwlidHJmc19zZXRfaXRlbV9rZXkobGVhZiwgJmRpc2tfa2V5LCBzbG90KTsKKworCW5ld19pdGVtID0gYnRyZnNfaXRlbV9ucihsZWFmLCBzbG90KTsKKworCWJ0cmZzX3NldF9pdGVtX29mZnNldChsZWFmLCBuZXdfaXRlbSwgb3JpZ19vZmZzZXQpOworCWJ0cmZzX3NldF9pdGVtX3NpemUobGVhZiwgbmV3X2l0ZW0sIGl0ZW1fc2l6ZSAtIHNwbGl0X29mZnNldCk7CisKKwlidHJmc19zZXRfaXRlbV9vZmZzZXQobGVhZiwgaXRlbSwKKwkJCSAgICAgIG9yaWdfb2Zmc2V0ICsgaXRlbV9zaXplIC0gc3BsaXRfb2Zmc2V0KTsKKwlidHJmc19zZXRfaXRlbV9zaXplKGxlYWYsIGl0ZW0sIHNwbGl0X29mZnNldCk7CisKKwlidHJmc19zZXRfaGVhZGVyX25yaXRlbXMobGVhZiwgbnJpdGVtcyArIDEpOworCisJLyogd3JpdGUgdGhlIGRhdGEgZm9yIHRoZSBzdGFydCBvZiB0aGUgb3JpZ2luYWwgaXRlbSAqLworCXdyaXRlX2V4dGVudF9idWZmZXIobGVhZiwgYnVmLAorCQkJICAgIGJ0cmZzX2l0ZW1fcHRyX29mZnNldChsZWFmLCBwYXRoLT5zbG90c1swXSksCisJCQkgICAgc3BsaXRfb2Zmc2V0KTsKKworCS8qIHdyaXRlIHRoZSBkYXRhIGZvciB0aGUgbmV3IGl0ZW0gKi8KKwl3cml0ZV9leHRlbnRfYnVmZmVyKGxlYWYsIGJ1ZiArIHNwbGl0X29mZnNldCwKKwkJCSAgICBidHJmc19pdGVtX3B0cl9vZmZzZXQobGVhZiwgc2xvdCksCisJCQkgICAgaXRlbV9zaXplIC0gc3BsaXRfb2Zmc2V0KTsKKwlidHJmc19tYXJrX2J1ZmZlcl9kaXJ0eShsZWFmKTsKKworCXJldCA9IDA7CisJaWYgKGJ0cmZzX2xlYWZfZnJlZV9zcGFjZShyb290LCBsZWFmKSA8IDApIHsKKwkJYnRyZnNfcHJpbnRfbGVhZihyb290LCBsZWFmKTsKKwkJQlVHKCk7CisJfQorCWtmcmVlKGJ1Zik7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIG1ha2UgdGhlIGl0ZW0gcG9pbnRlZCB0byBieSB0aGUgcGF0aCBzbWFsbGVyLiAgbmV3X3NpemUgaW5kaWNhdGVzCisgKiBob3cgc21hbGwgdG8gbWFrZSBpdCwgYW5kIGZyb21fZW5kIHRlbGxzIHVzIGlmIHdlIGp1c3QgY2hvcCBieXRlcworICogb2ZmIHRoZSBlbmQgb2YgdGhlIGl0ZW0gb3IgaWYgd2Ugc2hpZnQgdGhlIGl0ZW0gdG8gY2hvcCBieXRlcyBvZmYKKyAqIHRoZSBmcm9udC4KKyAqLworaW50IGJ0cmZzX3RydW5jYXRlX2l0ZW0oc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCisJCQlzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwKKwkJCXN0cnVjdCBidHJmc19wYXRoICpwYXRoLAorCQkJdTMyIG5ld19zaXplLCBpbnQgZnJvbV9lbmQpCit7CisJaW50IHJldCA9IDA7CisJaW50IHNsb3Q7CisJaW50IHNsb3Rfb3JpZzsKKwlzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqbGVhZjsKKwlzdHJ1Y3QgYnRyZnNfaXRlbSAqaXRlbTsKKwl1MzIgbnJpdGVtczsKKwl1bnNpZ25lZCBpbnQgZGF0YV9lbmQ7CisJdW5zaWduZWQgaW50IG9sZF9kYXRhX3N0YXJ0OworCXVuc2lnbmVkIGludCBvbGRfc2l6ZTsKKwl1bnNpZ25lZCBpbnQgc2l6ZV9kaWZmOworCWludCBpOworCisJc2xvdF9vcmlnID0gcGF0aC0+c2xvdHNbMF07CisJbGVhZiA9IHBhdGgtPm5vZGVzWzBdOworCXNsb3QgPSBwYXRoLT5zbG90c1swXTsKKworCW9sZF9zaXplID0gYnRyZnNfaXRlbV9zaXplX25yKGxlYWYsIHNsb3QpOworCWlmIChvbGRfc2l6ZSA9PSBuZXdfc2l6ZSkKKwkJcmV0dXJuIDA7CisKKwlucml0ZW1zID0gYnRyZnNfaGVhZGVyX25yaXRlbXMobGVhZik7CisJZGF0YV9lbmQgPSBsZWFmX2RhdGFfZW5kKHJvb3QsIGxlYWYpOworCisJb2xkX2RhdGFfc3RhcnQgPSBidHJmc19pdGVtX29mZnNldF9ucihsZWFmLCBzbG90KTsKKworCXNpemVfZGlmZiA9IG9sZF9zaXplIC0gbmV3X3NpemU7CisKKwlCVUdfT04oc2xvdCA8IDApOworCUJVR19PTihzbG90ID49IG5yaXRlbXMpOworCisJLyoKKwkgKiBpdGVtMC4uaXRlbU4gLi4uIGRhdGFOLm9mZnNldC4uZGF0YU4uc2l6ZSAuLiBkYXRhMC5zaXplCisJICovCisJLyogZmlyc3QgY29ycmVjdCB0aGUgZGF0YSBwb2ludGVycyAqLworCWZvciAoaSA9IHNsb3Q7IGkgPCBucml0ZW1zOyBpKyspIHsKKwkJdTMyIGlvZmY7CisJCWl0ZW0gPSBidHJmc19pdGVtX25yKGxlYWYsIGkpOworCisJCWlmICghbGVhZi0+bWFwX3Rva2VuKSB7CisJCQltYXBfZXh0ZW50X2J1ZmZlcihsZWFmLCAodW5zaWduZWQgbG9uZylpdGVtLAorCQkJCQlzaXplb2Yoc3RydWN0IGJ0cmZzX2l0ZW0pLAorCQkJCQkmbGVhZi0+bWFwX3Rva2VuLCAmbGVhZi0+a2FkZHIsCisJCQkJCSZsZWFmLT5tYXBfc3RhcnQsICZsZWFmLT5tYXBfbGVuLAorCQkJCQlLTV9VU0VSMSk7CisJCX0KKworCQlpb2ZmID0gYnRyZnNfaXRlbV9vZmZzZXQobGVhZiwgaXRlbSk7CisJCWJ0cmZzX3NldF9pdGVtX29mZnNldChsZWFmLCBpdGVtLCBpb2ZmICsgc2l6ZV9kaWZmKTsKKwl9CisKKwlpZiAobGVhZi0+bWFwX3Rva2VuKSB7CisJCXVubWFwX2V4dGVudF9idWZmZXIobGVhZiwgbGVhZi0+bWFwX3Rva2VuLCBLTV9VU0VSMSk7CisJCWxlYWYtPm1hcF90b2tlbiA9IE5VTEw7CisJfQorCisJLyogc2hpZnQgdGhlIGRhdGEgKi8KKwlpZiAoZnJvbV9lbmQpIHsKKwkJbWVtbW92ZV9leHRlbnRfYnVmZmVyKGxlYWYsIGJ0cmZzX2xlYWZfZGF0YShsZWFmKSArCisJCQkgICAgICBkYXRhX2VuZCArIHNpemVfZGlmZiwgYnRyZnNfbGVhZl9kYXRhKGxlYWYpICsKKwkJCSAgICAgIGRhdGFfZW5kLCBvbGRfZGF0YV9zdGFydCArIG5ld19zaXplIC0gZGF0YV9lbmQpOworCX0gZWxzZSB7CisJCXN0cnVjdCBidHJmc19kaXNrX2tleSBkaXNrX2tleTsKKwkJdTY0IG9mZnNldDsKKworCQlidHJmc19pdGVtX2tleShsZWFmLCAmZGlza19rZXksIHNsb3QpOworCisJCWlmIChidHJmc19kaXNrX2tleV90eXBlKCZkaXNrX2tleSkgPT0gQlRSRlNfRVhURU5UX0RBVEFfS0VZKSB7CisJCQl1bnNpZ25lZCBsb25nIHB0cjsKKwkJCXN0cnVjdCBidHJmc19maWxlX2V4dGVudF9pdGVtICpmaTsKKworCQkJZmkgPSBidHJmc19pdGVtX3B0cihsZWFmLCBzbG90LAorCQkJCQkgICAgc3RydWN0IGJ0cmZzX2ZpbGVfZXh0ZW50X2l0ZW0pOworCQkJZmkgPSAoc3RydWN0IGJ0cmZzX2ZpbGVfZXh0ZW50X2l0ZW0gKikoCisJCQkgICAgICh1bnNpZ25lZCBsb25nKWZpIC0gc2l6ZV9kaWZmKTsKKworCQkJaWYgKGJ0cmZzX2ZpbGVfZXh0ZW50X3R5cGUobGVhZiwgZmkpID09CisJCQkgICAgQlRSRlNfRklMRV9FWFRFTlRfSU5MSU5FKSB7CisJCQkJcHRyID0gYnRyZnNfaXRlbV9wdHJfb2Zmc2V0KGxlYWYsIHNsb3QpOworCQkJCW1lbW1vdmVfZXh0ZW50X2J1ZmZlcihsZWFmLCBwdHIsCisJCQkJICAgICAgKHVuc2lnbmVkIGxvbmcpZmksCisJCQkJICAgICAgb2Zmc2V0b2Yoc3RydWN0IGJ0cmZzX2ZpbGVfZXh0ZW50X2l0ZW0sCisJCQkJCQkgZGlza19ieXRlbnIpKTsKKwkJCX0KKwkJfQorCisJCW1lbW1vdmVfZXh0ZW50X2J1ZmZlcihsZWFmLCBidHJmc19sZWFmX2RhdGEobGVhZikgKworCQkJICAgICAgZGF0YV9lbmQgKyBzaXplX2RpZmYsIGJ0cmZzX2xlYWZfZGF0YShsZWFmKSArCisJCQkgICAgICBkYXRhX2VuZCwgb2xkX2RhdGFfc3RhcnQgLSBkYXRhX2VuZCk7CisKKwkJb2Zmc2V0ID0gYnRyZnNfZGlza19rZXlfb2Zmc2V0KCZkaXNrX2tleSk7CisJCWJ0cmZzX3NldF9kaXNrX2tleV9vZmZzZXQoJmRpc2tfa2V5LCBvZmZzZXQgKyBzaXplX2RpZmYpOworCQlidHJmc19zZXRfaXRlbV9rZXkobGVhZiwgJmRpc2tfa2V5LCBzbG90KTsKKwkJaWYgKHNsb3QgPT0gMCkKKwkJCWZpeHVwX2xvd19rZXlzKHRyYW5zLCByb290LCBwYXRoLCAmZGlza19rZXksIDEpOworCX0KKworCWl0ZW0gPSBidHJmc19pdGVtX25yKGxlYWYsIHNsb3QpOworCWJ0cmZzX3NldF9pdGVtX3NpemUobGVhZiwgaXRlbSwgbmV3X3NpemUpOworCWJ0cmZzX21hcmtfYnVmZmVyX2RpcnR5KGxlYWYpOworCisJcmV0ID0gMDsKKwlpZiAoYnRyZnNfbGVhZl9mcmVlX3NwYWNlKHJvb3QsIGxlYWYpIDwgMCkgeworCQlidHJmc19wcmludF9sZWFmKHJvb3QsIGxlYWYpOworCQlCVUcoKTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIG1ha2UgdGhlIGl0ZW0gcG9pbnRlZCB0byBieSB0aGUgcGF0aCBiaWdnZXIsIGRhdGFfc2l6ZSBpcyB0aGUgbmV3IHNpemUuCisgKi8KK2ludCBidHJmc19leHRlbmRfaXRlbShzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKKwkJICAgICAgc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsIHN0cnVjdCBidHJmc19wYXRoICpwYXRoLAorCQkgICAgICB1MzIgZGF0YV9zaXplKQoreworCWludCByZXQgPSAwOworCWludCBzbG90OworCWludCBzbG90X29yaWc7CisJc3RydWN0IGV4dGVudF9idWZmZXIgKmxlYWY7CisJc3RydWN0IGJ0cmZzX2l0ZW0gKml0ZW07CisJdTMyIG5yaXRlbXM7CisJdW5zaWduZWQgaW50IGRhdGFfZW5kOworCXVuc2lnbmVkIGludCBvbGRfZGF0YTsKKwl1bnNpZ25lZCBpbnQgb2xkX3NpemU7CisJaW50IGk7CisKKwlzbG90X29yaWcgPSBwYXRoLT5zbG90c1swXTsKKwlsZWFmID0gcGF0aC0+bm9kZXNbMF07CisKKwlucml0ZW1zID0gYnRyZnNfaGVhZGVyX25yaXRlbXMobGVhZik7CisJZGF0YV9lbmQgPSBsZWFmX2RhdGFfZW5kKHJvb3QsIGxlYWYpOworCisJaWYgKGJ0cmZzX2xlYWZfZnJlZV9zcGFjZShyb290LCBsZWFmKSA8IGRhdGFfc2l6ZSkgeworCQlidHJmc19wcmludF9sZWFmKHJvb3QsIGxlYWYpOworCQlCVUcoKTsKKwl9CisJc2xvdCA9IHBhdGgtPnNsb3RzWzBdOworCW9sZF9kYXRhID0gYnRyZnNfaXRlbV9lbmRfbnIobGVhZiwgc2xvdCk7CisKKwlCVUdfT04oc2xvdCA8IDApOworCWlmIChzbG90ID49IG5yaXRlbXMpIHsKKwkJYnRyZnNfcHJpbnRfbGVhZihyb290LCBsZWFmKTsKKwkJcHJpbnRrKEtFUk5fQ1JJVCAic2xvdCAlZCB0b28gbGFyZ2UsIG5yaXRlbXMgJWRcbiIsCisJCSAgICAgICBzbG90LCBucml0ZW1zKTsKKwkJQlVHX09OKDEpOworCX0KKworCS8qCisJICogaXRlbTAuLml0ZW1OIC4uLiBkYXRhTi5vZmZzZXQuLmRhdGFOLnNpemUgLi4gZGF0YTAuc2l6ZQorCSAqLworCS8qIGZpcnN0IGNvcnJlY3QgdGhlIGRhdGEgcG9pbnRlcnMgKi8KKwlmb3IgKGkgPSBzbG90OyBpIDwgbnJpdGVtczsgaSsrKSB7CisJCXUzMiBpb2ZmOworCQlpdGVtID0gYnRyZnNfaXRlbV9ucihsZWFmLCBpKTsKKworCQlpZiAoIWxlYWYtPm1hcF90b2tlbikgeworCQkJbWFwX2V4dGVudF9idWZmZXIobGVhZiwgKHVuc2lnbmVkIGxvbmcpaXRlbSwKKwkJCQkJc2l6ZW9mKHN0cnVjdCBidHJmc19pdGVtKSwKKwkJCQkJJmxlYWYtPm1hcF90b2tlbiwgJmxlYWYtPmthZGRyLAorCQkJCQkmbGVhZi0+bWFwX3N0YXJ0LCAmbGVhZi0+bWFwX2xlbiwKKwkJCQkJS01fVVNFUjEpOworCQl9CisJCWlvZmYgPSBidHJmc19pdGVtX29mZnNldChsZWFmLCBpdGVtKTsKKwkJYnRyZnNfc2V0X2l0ZW1fb2Zmc2V0KGxlYWYsIGl0ZW0sIGlvZmYgLSBkYXRhX3NpemUpOworCX0KKworCWlmIChsZWFmLT5tYXBfdG9rZW4pIHsKKwkJdW5tYXBfZXh0ZW50X2J1ZmZlcihsZWFmLCBsZWFmLT5tYXBfdG9rZW4sIEtNX1VTRVIxKTsKKwkJbGVhZi0+bWFwX3Rva2VuID0gTlVMTDsKKwl9CisKKwkvKiBzaGlmdCB0aGUgZGF0YSAqLworCW1lbW1vdmVfZXh0ZW50X2J1ZmZlcihsZWFmLCBidHJmc19sZWFmX2RhdGEobGVhZikgKworCQkgICAgICBkYXRhX2VuZCAtIGRhdGFfc2l6ZSwgYnRyZnNfbGVhZl9kYXRhKGxlYWYpICsKKwkJICAgICAgZGF0YV9lbmQsIG9sZF9kYXRhIC0gZGF0YV9lbmQpOworCisJZGF0YV9lbmQgPSBvbGRfZGF0YTsKKwlvbGRfc2l6ZSA9IGJ0cmZzX2l0ZW1fc2l6ZV9ucihsZWFmLCBzbG90KTsKKwlpdGVtID0gYnRyZnNfaXRlbV9ucihsZWFmLCBzbG90KTsKKwlidHJmc19zZXRfaXRlbV9zaXplKGxlYWYsIGl0ZW0sIG9sZF9zaXplICsgZGF0YV9zaXplKTsKKwlidHJmc19tYXJrX2J1ZmZlcl9kaXJ0eShsZWFmKTsKKworCXJldCA9IDA7CisJaWYgKGJ0cmZzX2xlYWZfZnJlZV9zcGFjZShyb290LCBsZWFmKSA8IDApIHsKKwkJYnRyZnNfcHJpbnRfbGVhZihyb290LCBsZWFmKTsKKwkJQlVHKCk7CisJfQorCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBHaXZlbiBhIGtleSBhbmQgc29tZSBkYXRhLCBpbnNlcnQgaXRlbXMgaW50byB0aGUgdHJlZS4KKyAqIFRoaXMgZG9lcyBhbGwgdGhlIHBhdGggaW5pdCByZXF1aXJlZCwgbWFraW5nIHJvb20gaW4gdGhlIHRyZWUgaWYgbmVlZGVkLgorICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGtleXMgdGhhdCB3ZXJlIGluc2VydGVkLgorICovCitpbnQgYnRyZnNfaW5zZXJ0X3NvbWVfaXRlbXMoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCisJCQkgICAgc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsCisJCQkgICAgc3RydWN0IGJ0cmZzX3BhdGggKnBhdGgsCisJCQkgICAgc3RydWN0IGJ0cmZzX2tleSAqY3B1X2tleSwgdTMyICpkYXRhX3NpemUsCisJCQkgICAgaW50IG5yKQoreworCXN0cnVjdCBleHRlbnRfYnVmZmVyICpsZWFmOworCXN0cnVjdCBidHJmc19pdGVtICppdGVtOworCWludCByZXQgPSAwOworCWludCBzbG90OworCWludCBpOworCXUzMiBucml0ZW1zOworCXUzMiB0b3RhbF9kYXRhID0gMDsKKwl1MzIgdG90YWxfc2l6ZSA9IDA7CisJdW5zaWduZWQgaW50IGRhdGFfZW5kOworCXN0cnVjdCBidHJmc19kaXNrX2tleSBkaXNrX2tleTsKKwlzdHJ1Y3QgYnRyZnNfa2V5IGZvdW5kX2tleTsKKworCWZvciAoaSA9IDA7IGkgPCBucjsgaSsrKSB7CisJCWlmICh0b3RhbF9zaXplICsgZGF0YV9zaXplW2ldICsgc2l6ZW9mKHN0cnVjdCBidHJmc19pdGVtKSA+CisJCSAgICBCVFJGU19MRUFGX0RBVEFfU0laRShyb290KSkgeworCQkJYnJlYWs7CisJCQluciA9IGk7CisJCX0KKwkJdG90YWxfZGF0YSArPSBkYXRhX3NpemVbaV07CisJCXRvdGFsX3NpemUgKz0gZGF0YV9zaXplW2ldICsgc2l6ZW9mKHN0cnVjdCBidHJmc19pdGVtKTsKKwl9CisJQlVHX09OKG5yID09IDApOworCisJcmV0ID0gYnRyZnNfc2VhcmNoX3Nsb3QodHJhbnMsIHJvb3QsIGNwdV9rZXksIHBhdGgsIHRvdGFsX3NpemUsIDEpOworCWlmIChyZXQgPT0gMCkKKwkJcmV0dXJuIC1FRVhJU1Q7CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0OworCisJbGVhZiA9IHBhdGgtPm5vZGVzWzBdOworCisJbnJpdGVtcyA9IGJ0cmZzX2hlYWRlcl9ucml0ZW1zKGxlYWYpOworCWRhdGFfZW5kID0gbGVhZl9kYXRhX2VuZChyb290LCBsZWFmKTsKKworCWlmIChidHJmc19sZWFmX2ZyZWVfc3BhY2Uocm9vdCwgbGVhZikgPCB0b3RhbF9zaXplKSB7CisJCWZvciAoaSA9IG5yOyBpID49IDA7IGktLSkgeworCQkJdG90YWxfZGF0YSAtPSBkYXRhX3NpemVbaV07CisJCQl0b3RhbF9zaXplIC09IGRhdGFfc2l6ZVtpXSArIHNpemVvZihzdHJ1Y3QgYnRyZnNfaXRlbSk7CisJCQlpZiAodG90YWxfc2l6ZSA8IGJ0cmZzX2xlYWZfZnJlZV9zcGFjZShyb290LCBsZWFmKSkKKwkJCQlicmVhazsKKwkJfQorCQluciA9IGk7CisJfQorCisJc2xvdCA9IHBhdGgtPnNsb3RzWzBdOworCUJVR19PTihzbG90IDwgMCk7CisKKwlpZiAoc2xvdCAhPSBucml0ZW1zKSB7CisJCXVuc2lnbmVkIGludCBvbGRfZGF0YSA9IGJ0cmZzX2l0ZW1fZW5kX25yKGxlYWYsIHNsb3QpOworCisJCWl0ZW0gPSBidHJmc19pdGVtX25yKGxlYWYsIHNsb3QpOworCQlidHJmc19pdGVtX2tleV90b19jcHUobGVhZiwgJmZvdW5kX2tleSwgc2xvdCk7CisKKwkJLyogZmlndXJlIG91dCBob3cgbWFueSBrZXlzIHdlIGNhbiBpbnNlcnQgaW4gaGVyZSAqLworCQl0b3RhbF9kYXRhID0gZGF0YV9zaXplWzBdOworCQlmb3IgKGkgPSAxOyBpIDwgbnI7IGkrKykgeworCQkJaWYgKGNvbXBfY3B1X2tleXMoJmZvdW5kX2tleSwgY3B1X2tleSArIGkpIDw9IDApCisJCQkJYnJlYWs7CisJCQl0b3RhbF9kYXRhICs9IGRhdGFfc2l6ZVtpXTsKKwkJfQorCQluciA9IGk7CisKKwkJaWYgKG9sZF9kYXRhIDwgZGF0YV9lbmQpIHsKKwkJCWJ0cmZzX3ByaW50X2xlYWYocm9vdCwgbGVhZik7CisJCQlwcmludGsoS0VSTl9DUklUICJzbG90ICVkIG9sZF9kYXRhICVkIGRhdGFfZW5kICVkXG4iLAorCQkJICAgICAgIHNsb3QsIG9sZF9kYXRhLCBkYXRhX2VuZCk7CisJCQlCVUdfT04oMSk7CisJCX0KKwkJLyoKKwkJICogaXRlbTAuLml0ZW1OIC4uLiBkYXRhTi5vZmZzZXQuLmRhdGFOLnNpemUgLi4gZGF0YTAuc2l6ZQorCQkgKi8KKwkJLyogZmlyc3QgY29ycmVjdCB0aGUgZGF0YSBwb2ludGVycyAqLworCQlXQVJOX09OKGxlYWYtPm1hcF90b2tlbik7CisJCWZvciAoaSA9IHNsb3Q7IGkgPCBucml0ZW1zOyBpKyspIHsKKwkJCXUzMiBpb2ZmOworCisJCQlpdGVtID0gYnRyZnNfaXRlbV9ucihsZWFmLCBpKTsKKwkJCWlmICghbGVhZi0+bWFwX3Rva2VuKSB7CisJCQkJbWFwX2V4dGVudF9idWZmZXIobGVhZiwgKHVuc2lnbmVkIGxvbmcpaXRlbSwKKwkJCQkJc2l6ZW9mKHN0cnVjdCBidHJmc19pdGVtKSwKKwkJCQkJJmxlYWYtPm1hcF90b2tlbiwgJmxlYWYtPmthZGRyLAorCQkJCQkmbGVhZi0+bWFwX3N0YXJ0LCAmbGVhZi0+bWFwX2xlbiwKKwkJCQkJS01fVVNFUjEpOworCQkJfQorCisJCQlpb2ZmID0gYnRyZnNfaXRlbV9vZmZzZXQobGVhZiwgaXRlbSk7CisJCQlidHJmc19zZXRfaXRlbV9vZmZzZXQobGVhZiwgaXRlbSwgaW9mZiAtIHRvdGFsX2RhdGEpOworCQl9CisJCWlmIChsZWFmLT5tYXBfdG9rZW4pIHsKKwkJCXVubWFwX2V4dGVudF9idWZmZXIobGVhZiwgbGVhZi0+bWFwX3Rva2VuLCBLTV9VU0VSMSk7CisJCQlsZWFmLT5tYXBfdG9rZW4gPSBOVUxMOworCQl9CisKKwkJLyogc2hpZnQgdGhlIGl0ZW1zICovCisJCW1lbW1vdmVfZXh0ZW50X2J1ZmZlcihsZWFmLCBidHJmc19pdGVtX25yX29mZnNldChzbG90ICsgbnIpLAorCQkJICAgICAgYnRyZnNfaXRlbV9ucl9vZmZzZXQoc2xvdCksCisJCQkgICAgICAobnJpdGVtcyAtIHNsb3QpICogc2l6ZW9mKHN0cnVjdCBidHJmc19pdGVtKSk7CisKKwkJLyogc2hpZnQgdGhlIGRhdGEgKi8KKwkJbWVtbW92ZV9leHRlbnRfYnVmZmVyKGxlYWYsIGJ0cmZzX2xlYWZfZGF0YShsZWFmKSArCisJCQkgICAgICBkYXRhX2VuZCAtIHRvdGFsX2RhdGEsIGJ0cmZzX2xlYWZfZGF0YShsZWFmKSArCisJCQkgICAgICBkYXRhX2VuZCwgb2xkX2RhdGEgLSBkYXRhX2VuZCk7CisJCWRhdGFfZW5kID0gb2xkX2RhdGE7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogdGhpcyBzdWNrcyBidXQgaXQgaGFzIHRvIGJlIGRvbmUsIGlmIHdlIGFyZSBpbnNlcnRpbmcgYXQKKwkJICogdGhlIGVuZCBvZiB0aGUgbGVhZiBvbmx5IGluc2VydCAxIG9mIHRoZSBpdGVtcywgc2luY2Ugd2UKKwkJICogaGF2ZSBubyB3YXkgb2Yga25vd2luZyB3aGF0cyBvbiB0aGUgbmV4dCBsZWFmIGFuZCB3ZSdkIGhhdmUKKwkJICogdG8gZHJvcCBvdXIgY3VycmVudCBsb2NrcyB0byBmaWd1cmUgaXQgb3V0CisJCSAqLworCQluciA9IDE7CisJfQorCisJLyogc2V0dXAgdGhlIGl0ZW0gZm9yIHRoZSBuZXcgZGF0YSAqLworCWZvciAoaSA9IDA7IGkgPCBucjsgaSsrKSB7CisJCWJ0cmZzX2NwdV9rZXlfdG9fZGlzaygmZGlza19rZXksIGNwdV9rZXkgKyBpKTsKKwkJYnRyZnNfc2V0X2l0ZW1fa2V5KGxlYWYsICZkaXNrX2tleSwgc2xvdCArIGkpOworCQlpdGVtID0gYnRyZnNfaXRlbV9ucihsZWFmLCBzbG90ICsgaSk7CisJCWJ0cmZzX3NldF9pdGVtX29mZnNldChsZWFmLCBpdGVtLCBkYXRhX2VuZCAtIGRhdGFfc2l6ZVtpXSk7CisJCWRhdGFfZW5kIC09IGRhdGFfc2l6ZVtpXTsKKwkJYnRyZnNfc2V0X2l0ZW1fc2l6ZShsZWFmLCBpdGVtLCBkYXRhX3NpemVbaV0pOworCX0KKwlidHJmc19zZXRfaGVhZGVyX25yaXRlbXMobGVhZiwgbnJpdGVtcyArIG5yKTsKKwlidHJmc19tYXJrX2J1ZmZlcl9kaXJ0eShsZWFmKTsKKworCXJldCA9IDA7CisJaWYgKHNsb3QgPT0gMCkgeworCQlidHJmc19jcHVfa2V5X3RvX2Rpc2soJmRpc2tfa2V5LCBjcHVfa2V5KTsKKwkJcmV0ID0gZml4dXBfbG93X2tleXModHJhbnMsIHJvb3QsIHBhdGgsICZkaXNrX2tleSwgMSk7CisJfQorCisJaWYgKGJ0cmZzX2xlYWZfZnJlZV9zcGFjZShyb290LCBsZWFmKSA8IDApIHsKKwkJYnRyZnNfcHJpbnRfbGVhZihyb290LCBsZWFmKTsKKwkJQlVHKCk7CisJfQorb3V0OgorCWlmICghcmV0KQorCQlyZXQgPSBucjsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogR2l2ZW4gYSBrZXkgYW5kIHNvbWUgZGF0YSwgaW5zZXJ0IGl0ZW1zIGludG8gdGhlIHRyZWUuCisgKiBUaGlzIGRvZXMgYWxsIHRoZSBwYXRoIGluaXQgcmVxdWlyZWQsIG1ha2luZyByb29tIGluIHRoZSB0cmVlIGlmIG5lZWRlZC4KKyAqLworaW50IGJ0cmZzX2luc2VydF9lbXB0eV9pdGVtcyhzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKKwkJCSAgICBzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwKKwkJCSAgICBzdHJ1Y3QgYnRyZnNfcGF0aCAqcGF0aCwKKwkJCSAgICBzdHJ1Y3QgYnRyZnNfa2V5ICpjcHVfa2V5LCB1MzIgKmRhdGFfc2l6ZSwKKwkJCSAgICBpbnQgbnIpCit7CisJc3RydWN0IGV4dGVudF9idWZmZXIgKmxlYWY7CisJc3RydWN0IGJ0cmZzX2l0ZW0gKml0ZW07CisJaW50IHJldCA9IDA7CisJaW50IHNsb3Q7CisJaW50IHNsb3Rfb3JpZzsKKwlpbnQgaTsKKwl1MzIgbnJpdGVtczsKKwl1MzIgdG90YWxfc2l6ZSA9IDA7CisJdTMyIHRvdGFsX2RhdGEgPSAwOworCXVuc2lnbmVkIGludCBkYXRhX2VuZDsKKwlzdHJ1Y3QgYnRyZnNfZGlza19rZXkgZGlza19rZXk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnI7IGkrKykKKwkJdG90YWxfZGF0YSArPSBkYXRhX3NpemVbaV07CisKKwl0b3RhbF9zaXplID0gdG90YWxfZGF0YSArIChuciAqIHNpemVvZihzdHJ1Y3QgYnRyZnNfaXRlbSkpOworCXJldCA9IGJ0cmZzX3NlYXJjaF9zbG90KHRyYW5zLCByb290LCBjcHVfa2V5LCBwYXRoLCB0b3RhbF9zaXplLCAxKTsKKwlpZiAocmV0ID09IDApCisJCXJldHVybiAtRUVYSVNUOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dDsKKworCXNsb3Rfb3JpZyA9IHBhdGgtPnNsb3RzWzBdOworCWxlYWYgPSBwYXRoLT5ub2Rlc1swXTsKKworCW5yaXRlbXMgPSBidHJmc19oZWFkZXJfbnJpdGVtcyhsZWFmKTsKKwlkYXRhX2VuZCA9IGxlYWZfZGF0YV9lbmQocm9vdCwgbGVhZik7CisKKwlpZiAoYnRyZnNfbGVhZl9mcmVlX3NwYWNlKHJvb3QsIGxlYWYpIDwgdG90YWxfc2l6ZSkgeworCQlidHJmc19wcmludF9sZWFmKHJvb3QsIGxlYWYpOworCQlwcmludGsoS0VSTl9DUklUICJub3QgZW5vdWdoIGZyZWVzcGFjZSBuZWVkICV1IGhhdmUgJWRcbiIsCisJCSAgICAgICB0b3RhbF9zaXplLCBidHJmc19sZWFmX2ZyZWVfc3BhY2Uocm9vdCwgbGVhZikpOworCQlCVUcoKTsKKwl9CisKKwlzbG90ID0gcGF0aC0+c2xvdHNbMF07CisJQlVHX09OKHNsb3QgPCAwKTsKKworCWlmIChzbG90ICE9IG5yaXRlbXMpIHsKKwkJdW5zaWduZWQgaW50IG9sZF9kYXRhID0gYnRyZnNfaXRlbV9lbmRfbnIobGVhZiwgc2xvdCk7CisKKwkJaWYgKG9sZF9kYXRhIDwgZGF0YV9lbmQpIHsKKwkJCWJ0cmZzX3ByaW50X2xlYWYocm9vdCwgbGVhZik7CisJCQlwcmludGsoS0VSTl9DUklUICJzbG90ICVkIG9sZF9kYXRhICVkIGRhdGFfZW5kICVkXG4iLAorCQkJICAgICAgIHNsb3QsIG9sZF9kYXRhLCBkYXRhX2VuZCk7CisJCQlCVUdfT04oMSk7CisJCX0KKwkJLyoKKwkJICogaXRlbTAuLml0ZW1OIC4uLiBkYXRhTi5vZmZzZXQuLmRhdGFOLnNpemUgLi4gZGF0YTAuc2l6ZQorCQkgKi8KKwkJLyogZmlyc3QgY29ycmVjdCB0aGUgZGF0YSBwb2ludGVycyAqLworCQlXQVJOX09OKGxlYWYtPm1hcF90b2tlbik7CisJCWZvciAoaSA9IHNsb3Q7IGkgPCBucml0ZW1zOyBpKyspIHsKKwkJCXUzMiBpb2ZmOworCisJCQlpdGVtID0gYnRyZnNfaXRlbV9ucihsZWFmLCBpKTsKKwkJCWlmICghbGVhZi0+bWFwX3Rva2VuKSB7CisJCQkJbWFwX2V4dGVudF9idWZmZXIobGVhZiwgKHVuc2lnbmVkIGxvbmcpaXRlbSwKKwkJCQkJc2l6ZW9mKHN0cnVjdCBidHJmc19pdGVtKSwKKwkJCQkJJmxlYWYtPm1hcF90b2tlbiwgJmxlYWYtPmthZGRyLAorCQkJCQkmbGVhZi0+bWFwX3N0YXJ0LCAmbGVhZi0+bWFwX2xlbiwKKwkJCQkJS01fVVNFUjEpOworCQkJfQorCisJCQlpb2ZmID0gYnRyZnNfaXRlbV9vZmZzZXQobGVhZiwgaXRlbSk7CisJCQlidHJmc19zZXRfaXRlbV9vZmZzZXQobGVhZiwgaXRlbSwgaW9mZiAtIHRvdGFsX2RhdGEpOworCQl9CisJCWlmIChsZWFmLT5tYXBfdG9rZW4pIHsKKwkJCXVubWFwX2V4dGVudF9idWZmZXIobGVhZiwgbGVhZi0+bWFwX3Rva2VuLCBLTV9VU0VSMSk7CisJCQlsZWFmLT5tYXBfdG9rZW4gPSBOVUxMOworCQl9CisKKwkJLyogc2hpZnQgdGhlIGl0ZW1zICovCisJCW1lbW1vdmVfZXh0ZW50X2J1ZmZlcihsZWFmLCBidHJmc19pdGVtX25yX29mZnNldChzbG90ICsgbnIpLAorCQkJICAgICAgYnRyZnNfaXRlbV9ucl9vZmZzZXQoc2xvdCksCisJCQkgICAgICAobnJpdGVtcyAtIHNsb3QpICogc2l6ZW9mKHN0cnVjdCBidHJmc19pdGVtKSk7CisKKwkJLyogc2hpZnQgdGhlIGRhdGEgKi8KKwkJbWVtbW92ZV9leHRlbnRfYnVmZmVyKGxlYWYsIGJ0cmZzX2xlYWZfZGF0YShsZWFmKSArCisJCQkgICAgICBkYXRhX2VuZCAtIHRvdGFsX2RhdGEsIGJ0cmZzX2xlYWZfZGF0YShsZWFmKSArCisJCQkgICAgICBkYXRhX2VuZCwgb2xkX2RhdGEgLSBkYXRhX2VuZCk7CisJCWRhdGFfZW5kID0gb2xkX2RhdGE7CisJfQorCisJLyogc2V0dXAgdGhlIGl0ZW0gZm9yIHRoZSBuZXcgZGF0YSAqLworCWZvciAoaSA9IDA7IGkgPCBucjsgaSsrKSB7CisJCWJ0cmZzX2NwdV9rZXlfdG9fZGlzaygmZGlza19rZXksIGNwdV9rZXkgKyBpKTsKKwkJYnRyZnNfc2V0X2l0ZW1fa2V5KGxlYWYsICZkaXNrX2tleSwgc2xvdCArIGkpOworCQlpdGVtID0gYnRyZnNfaXRlbV9ucihsZWFmLCBzbG90ICsgaSk7CisJCWJ0cmZzX3NldF9pdGVtX29mZnNldChsZWFmLCBpdGVtLCBkYXRhX2VuZCAtIGRhdGFfc2l6ZVtpXSk7CisJCWRhdGFfZW5kIC09IGRhdGFfc2l6ZVtpXTsKKwkJYnRyZnNfc2V0X2l0ZW1fc2l6ZShsZWFmLCBpdGVtLCBkYXRhX3NpemVbaV0pOworCX0KKwlidHJmc19zZXRfaGVhZGVyX25yaXRlbXMobGVhZiwgbnJpdGVtcyArIG5yKTsKKwlidHJmc19tYXJrX2J1ZmZlcl9kaXJ0eShsZWFmKTsKKworCXJldCA9IDA7CisJaWYgKHNsb3QgPT0gMCkgeworCQlidHJmc19jcHVfa2V5X3RvX2Rpc2soJmRpc2tfa2V5LCBjcHVfa2V5KTsKKwkJcmV0ID0gZml4dXBfbG93X2tleXModHJhbnMsIHJvb3QsIHBhdGgsICZkaXNrX2tleSwgMSk7CisJfQorCisJaWYgKGJ0cmZzX2xlYWZfZnJlZV9zcGFjZShyb290LCBsZWFmKSA8IDApIHsKKwkJYnRyZnNfcHJpbnRfbGVhZihyb290LCBsZWFmKTsKKwkJQlVHKCk7CisJfQorb3V0OgorCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBHaXZlbiBhIGtleSBhbmQgc29tZSBkYXRhLCBpbnNlcnQgYW4gaXRlbSBpbnRvIHRoZSB0cmVlLgorICogVGhpcyBkb2VzIGFsbCB0aGUgcGF0aCBpbml0IHJlcXVpcmVkLCBtYWtpbmcgcm9vbSBpbiB0aGUgdHJlZSBpZiBuZWVkZWQuCisgKi8KK2ludCBidHJmc19pbnNlcnRfaXRlbShzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywgc3RydWN0IGJ0cmZzX3Jvb3QKKwkJICAgICAgKnJvb3QsIHN0cnVjdCBidHJmc19rZXkgKmNwdV9rZXksIHZvaWQgKmRhdGEsIHUzMgorCQkgICAgICBkYXRhX3NpemUpCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IGJ0cmZzX3BhdGggKnBhdGg7CisJc3RydWN0IGV4dGVudF9idWZmZXIgKmxlYWY7CisJdW5zaWduZWQgbG9uZyBwdHI7CisKKwlwYXRoID0gYnRyZnNfYWxsb2NfcGF0aCgpOworCUJVR19PTighcGF0aCk7CisJcmV0ID0gYnRyZnNfaW5zZXJ0X2VtcHR5X2l0ZW0odHJhbnMsIHJvb3QsIHBhdGgsIGNwdV9rZXksIGRhdGFfc2l6ZSk7CisJaWYgKCFyZXQpIHsKKwkJbGVhZiA9IHBhdGgtPm5vZGVzWzBdOworCQlwdHIgPSBidHJmc19pdGVtX3B0cl9vZmZzZXQobGVhZiwgcGF0aC0+c2xvdHNbMF0pOworCQl3cml0ZV9leHRlbnRfYnVmZmVyKGxlYWYsIGRhdGEsIHB0ciwgZGF0YV9zaXplKTsKKwkJYnRyZnNfbWFya19idWZmZXJfZGlydHkobGVhZik7CisJfQorCWJ0cmZzX2ZyZWVfcGF0aChwYXRoKTsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogZGVsZXRlIHRoZSBwb2ludGVyIGZyb20gYSBnaXZlbiBub2RlLgorICoKKyAqIHRoZSB0cmVlIHNob3VsZCBoYXZlIGJlZW4gcHJldmlvdXNseSBiYWxhbmNlZCBzbyB0aGUgZGVsZXRpb24gZG9lcyBub3QKKyAqIGVtcHR5IGEgbm9kZS4KKyAqLworc3RhdGljIGludCBkZWxfcHRyKHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLCBzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwKKwkJICAgc3RydWN0IGJ0cmZzX3BhdGggKnBhdGgsIGludCBsZXZlbCwgaW50IHNsb3QpCit7CisJc3RydWN0IGV4dGVudF9idWZmZXIgKnBhcmVudCA9IHBhdGgtPm5vZGVzW2xldmVsXTsKKwl1MzIgbnJpdGVtczsKKwlpbnQgcmV0ID0gMDsKKwlpbnQgd3JldDsKKworCW5yaXRlbXMgPSBidHJmc19oZWFkZXJfbnJpdGVtcyhwYXJlbnQpOworCWlmIChzbG90ICE9IG5yaXRlbXMgLSAxKSB7CisJCW1lbW1vdmVfZXh0ZW50X2J1ZmZlcihwYXJlbnQsCisJCQkgICAgICBidHJmc19ub2RlX2tleV9wdHJfb2Zmc2V0KHNsb3QpLAorCQkJICAgICAgYnRyZnNfbm9kZV9rZXlfcHRyX29mZnNldChzbG90ICsgMSksCisJCQkgICAgICBzaXplb2Yoc3RydWN0IGJ0cmZzX2tleV9wdHIpICoKKwkJCSAgICAgIChucml0ZW1zIC0gc2xvdCAtIDEpKTsKKwl9CisJbnJpdGVtcy0tOworCWJ0cmZzX3NldF9oZWFkZXJfbnJpdGVtcyhwYXJlbnQsIG5yaXRlbXMpOworCWlmIChucml0ZW1zID09IDAgJiYgcGFyZW50ID09IHJvb3QtPm5vZGUpIHsKKwkJQlVHX09OKGJ0cmZzX2hlYWRlcl9sZXZlbChyb290LT5ub2RlKSAhPSAxKTsKKwkJLyoganVzdCB0dXJuIHRoZSByb290IGludG8gYSBsZWFmIGFuZCBicmVhayAqLworCQlidHJmc19zZXRfaGVhZGVyX2xldmVsKHJvb3QtPm5vZGUsIDApOworCX0gZWxzZSBpZiAoc2xvdCA9PSAwKSB7CisJCXN0cnVjdCBidHJmc19kaXNrX2tleSBkaXNrX2tleTsKKworCQlidHJmc19ub2RlX2tleShwYXJlbnQsICZkaXNrX2tleSwgMCk7CisJCXdyZXQgPSBmaXh1cF9sb3dfa2V5cyh0cmFucywgcm9vdCwgcGF0aCwgJmRpc2tfa2V5LCBsZXZlbCArIDEpOworCQlpZiAod3JldCkKKwkJCXJldCA9IHdyZXQ7CisJfQorCWJ0cmZzX21hcmtfYnVmZmVyX2RpcnR5KHBhcmVudCk7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIGEgaGVscGVyIGZ1bmN0aW9uIHRvIGRlbGV0ZSB0aGUgbGVhZiBwb2ludGVkIHRvIGJ5IHBhdGgtPnNsb3RzWzFdIGFuZAorICogcGF0aC0+bm9kZXNbMV0uICBieXRlbnIgaXMgdGhlIG5vZGUgYmxvY2sgcG9pbnRlciwgYnV0IHNpbmNlIHRoZSBjYWxsZXJzCisgKiBhbHJlYWR5IGtub3cgaXQsIGl0IGlzIGZhc3RlciB0byBoYXZlIHRoZW0gcGFzcyBpdCBkb3duIHRoYW4gdG8KKyAqIHJlYWQgaXQgb3V0IG9mIHRoZSBub2RlIGFnYWluLgorICoKKyAqIFRoaXMgZGVsZXRlcyB0aGUgcG9pbnRlciBpbiBwYXRoLT5ub2Rlc1sxXSBhbmQgZnJlZXMgdGhlIGxlYWYKKyAqIGJsb2NrIGV4dGVudC4gIHplcm8gaXMgcmV0dXJuZWQgaWYgaXQgYWxsIHdvcmtlZCBvdXQsIDwgMCBvdGhlcndpc2UuCisgKgorICogVGhlIHBhdGggbXVzdCBoYXZlIGFscmVhZHkgYmVlbiBzZXR1cCBmb3IgZGVsZXRpbmcgdGhlIGxlYWYsIGluY2x1ZGluZworICogYWxsIHRoZSBwcm9wZXIgYmFsYW5jaW5nLiAgcGF0aC0+bm9kZXNbMV0gbXVzdCBiZSBsb2NrZWQuCisgKi8KK25vaW5saW5lIGludCBidHJmc19kZWxfbGVhZihzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKKwkJCSAgICBzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwKKwkJCSAgICBzdHJ1Y3QgYnRyZnNfcGF0aCAqcGF0aCwgdTY0IGJ5dGVucikKK3sKKwlpbnQgcmV0OworCXU2NCByb290X2dlbiA9IGJ0cmZzX2hlYWRlcl9nZW5lcmF0aW9uKHBhdGgtPm5vZGVzWzFdKTsKKworCXJldCA9IGRlbF9wdHIodHJhbnMsIHJvb3QsIHBhdGgsIDEsIHBhdGgtPnNsb3RzWzFdKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gYnRyZnNfZnJlZV9leHRlbnQodHJhbnMsIHJvb3QsIGJ5dGVuciwKKwkJCQlidHJmc19sZXZlbF9zaXplKHJvb3QsIDApLAorCQkJCXBhdGgtPm5vZGVzWzFdLT5zdGFydCwKKwkJCQlidHJmc19oZWFkZXJfb3duZXIocGF0aC0+bm9kZXNbMV0pLAorCQkJCXJvb3RfZ2VuLCAwLCAxKTsKKwlyZXR1cm4gcmV0OworfQorLyoKKyAqIGRlbGV0ZSB0aGUgaXRlbSBhdCB0aGUgbGVhZiBsZXZlbCBpbiBwYXRoLiAgSWYgdGhhdCBlbXB0aWVzCisgKiB0aGUgbGVhZiwgcmVtb3ZlIGl0IGZyb20gdGhlIHRyZWUKKyAqLworaW50IGJ0cmZzX2RlbF9pdGVtcyhzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywgc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsCisJCSAgICBzdHJ1Y3QgYnRyZnNfcGF0aCAqcGF0aCwgaW50IHNsb3QsIGludCBucikKK3sKKwlzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqbGVhZjsKKwlzdHJ1Y3QgYnRyZnNfaXRlbSAqaXRlbTsKKwlpbnQgbGFzdF9vZmY7CisJaW50IGRzaXplID0gMDsKKwlpbnQgcmV0ID0gMDsKKwlpbnQgd3JldDsKKwlpbnQgaTsKKwl1MzIgbnJpdGVtczsKKworCWxlYWYgPSBwYXRoLT5ub2Rlc1swXTsKKwlsYXN0X29mZiA9IGJ0cmZzX2l0ZW1fb2Zmc2V0X25yKGxlYWYsIHNsb3QgKyBuciAtIDEpOworCisJZm9yIChpID0gMDsgaSA8IG5yOyBpKyspCisJCWRzaXplICs9IGJ0cmZzX2l0ZW1fc2l6ZV9ucihsZWFmLCBzbG90ICsgaSk7CisKKwlucml0ZW1zID0gYnRyZnNfaGVhZGVyX25yaXRlbXMobGVhZik7CisKKwlpZiAoc2xvdCArIG5yICE9IG5yaXRlbXMpIHsKKwkJaW50IGRhdGFfZW5kID0gbGVhZl9kYXRhX2VuZChyb290LCBsZWFmKTsKKworCQltZW1tb3ZlX2V4dGVudF9idWZmZXIobGVhZiwgYnRyZnNfbGVhZl9kYXRhKGxlYWYpICsKKwkJCSAgICAgIGRhdGFfZW5kICsgZHNpemUsCisJCQkgICAgICBidHJmc19sZWFmX2RhdGEobGVhZikgKyBkYXRhX2VuZCwKKwkJCSAgICAgIGxhc3Rfb2ZmIC0gZGF0YV9lbmQpOworCisJCWZvciAoaSA9IHNsb3QgKyBucjsgaSA8IG5yaXRlbXM7IGkrKykgeworCQkJdTMyIGlvZmY7CisKKwkJCWl0ZW0gPSBidHJmc19pdGVtX25yKGxlYWYsIGkpOworCQkJaWYgKCFsZWFmLT5tYXBfdG9rZW4pIHsKKwkJCQltYXBfZXh0ZW50X2J1ZmZlcihsZWFmLCAodW5zaWduZWQgbG9uZylpdGVtLAorCQkJCQlzaXplb2Yoc3RydWN0IGJ0cmZzX2l0ZW0pLAorCQkJCQkmbGVhZi0+bWFwX3Rva2VuLCAmbGVhZi0+a2FkZHIsCisJCQkJCSZsZWFmLT5tYXBfc3RhcnQsICZsZWFmLT5tYXBfbGVuLAorCQkJCQlLTV9VU0VSMSk7CisJCQl9CisJCQlpb2ZmID0gYnRyZnNfaXRlbV9vZmZzZXQobGVhZiwgaXRlbSk7CisJCQlidHJmc19zZXRfaXRlbV9vZmZzZXQobGVhZiwgaXRlbSwgaW9mZiArIGRzaXplKTsKKwkJfQorCisJCWlmIChsZWFmLT5tYXBfdG9rZW4pIHsKKwkJCXVubWFwX2V4dGVudF9idWZmZXIobGVhZiwgbGVhZi0+bWFwX3Rva2VuLCBLTV9VU0VSMSk7CisJCQlsZWFmLT5tYXBfdG9rZW4gPSBOVUxMOworCQl9CisKKwkJbWVtbW92ZV9leHRlbnRfYnVmZmVyKGxlYWYsIGJ0cmZzX2l0ZW1fbnJfb2Zmc2V0KHNsb3QpLAorCQkJICAgICAgYnRyZnNfaXRlbV9ucl9vZmZzZXQoc2xvdCArIG5yKSwKKwkJCSAgICAgIHNpemVvZihzdHJ1Y3QgYnRyZnNfaXRlbSkgKgorCQkJICAgICAgKG5yaXRlbXMgLSBzbG90IC0gbnIpKTsKKwl9CisJYnRyZnNfc2V0X2hlYWRlcl9ucml0ZW1zKGxlYWYsIG5yaXRlbXMgLSBucik7CisJbnJpdGVtcyAtPSBucjsKKworCS8qIGRlbGV0ZSB0aGUgbGVhZiBpZiB3ZSd2ZSBlbXB0aWVkIGl0ICovCisJaWYgKG5yaXRlbXMgPT0gMCkgeworCQlpZiAobGVhZiA9PSByb290LT5ub2RlKSB7CisJCQlidHJmc19zZXRfaGVhZGVyX2xldmVsKGxlYWYsIDApOworCQl9IGVsc2UgeworCQkJcmV0ID0gYnRyZnNfZGVsX2xlYWYodHJhbnMsIHJvb3QsIHBhdGgsIGxlYWYtPnN0YXJ0KTsKKwkJCUJVR19PTihyZXQpOworCQl9CisJfSBlbHNlIHsKKwkJaW50IHVzZWQgPSBsZWFmX3NwYWNlX3VzZWQobGVhZiwgMCwgbnJpdGVtcyk7CisJCWlmIChzbG90ID09IDApIHsKKwkJCXN0cnVjdCBidHJmc19kaXNrX2tleSBkaXNrX2tleTsKKworCQkJYnRyZnNfaXRlbV9rZXkobGVhZiwgJmRpc2tfa2V5LCAwKTsKKwkJCXdyZXQgPSBmaXh1cF9sb3dfa2V5cyh0cmFucywgcm9vdCwgcGF0aCwKKwkJCQkJICAgICAgJmRpc2tfa2V5LCAxKTsKKwkJCWlmICh3cmV0KQorCQkJCXJldCA9IHdyZXQ7CisJCX0KKworCQkvKiBkZWxldGUgdGhlIGxlYWYgaWYgaXQgaXMgbW9zdGx5IGVtcHR5ICovCisJCWlmICh1c2VkIDwgQlRSRlNfTEVBRl9EQVRBX1NJWkUocm9vdCkgLyA0KSB7CisJCQkvKiBwdXNoX2xlYWZfbGVmdCBmaXhlcyB0aGUgcGF0aC4KKwkJCSAqIG1ha2Ugc3VyZSB0aGUgcGF0aCBzdGlsbCBwb2ludHMgdG8gb3VyIGxlYWYKKwkJCSAqIGZvciBwb3NzaWJsZSBjYWxsIHRvIGRlbF9wdHIgYmVsb3cKKwkJCSAqLworCQkJc2xvdCA9IHBhdGgtPnNsb3RzWzFdOworCQkJZXh0ZW50X2J1ZmZlcl9nZXQobGVhZik7CisKKwkJCXdyZXQgPSBwdXNoX2xlYWZfbGVmdCh0cmFucywgcm9vdCwgcGF0aCwgMSwgMSk7CisJCQlpZiAod3JldCA8IDAgJiYgd3JldCAhPSAtRU5PU1BDKQorCQkJCXJldCA9IHdyZXQ7CisKKwkJCWlmIChwYXRoLT5ub2Rlc1swXSA9PSBsZWFmICYmCisJCQkgICAgYnRyZnNfaGVhZGVyX25yaXRlbXMobGVhZikpIHsKKwkJCQl3cmV0ID0gcHVzaF9sZWFmX3JpZ2h0KHRyYW5zLCByb290LCBwYXRoLCAxLCAxKTsKKwkJCQlpZiAod3JldCA8IDAgJiYgd3JldCAhPSAtRU5PU1BDKQorCQkJCQlyZXQgPSB3cmV0OworCQkJfQorCisJCQlpZiAoYnRyZnNfaGVhZGVyX25yaXRlbXMobGVhZikgPT0gMCkgeworCQkJCXBhdGgtPnNsb3RzWzFdID0gc2xvdDsKKwkJCQlyZXQgPSBidHJmc19kZWxfbGVhZih0cmFucywgcm9vdCwgcGF0aCwKKwkJCQkJCSAgICAgbGVhZi0+c3RhcnQpOworCQkJCUJVR19PTihyZXQpOworCQkJCWZyZWVfZXh0ZW50X2J1ZmZlcihsZWFmKTsKKwkJCX0gZWxzZSB7CisJCQkJLyogaWYgd2UncmUgc3RpbGwgaW4gdGhlIHBhdGgsIG1ha2Ugc3VyZQorCQkJCSAqIHdlJ3JlIGRpcnR5LiAgT3RoZXJ3aXNlLCBvbmUgb2YgdGhlCisJCQkJICogcHVzaF9sZWFmIGZ1bmN0aW9ucyBtdXN0IGhhdmUgYWxyZWFkeQorCQkJCSAqIGRpcnRpZWQgdGhpcyBidWZmZXIKKwkJCQkgKi8KKwkJCQlpZiAocGF0aC0+bm9kZXNbMF0gPT0gbGVhZikKKwkJCQkJYnRyZnNfbWFya19idWZmZXJfZGlydHkobGVhZik7CisJCQkJZnJlZV9leHRlbnRfYnVmZmVyKGxlYWYpOworCQkJfQorCQl9IGVsc2UgeworCQkJYnRyZnNfbWFya19idWZmZXJfZGlydHkobGVhZik7CisJCX0KKwl9CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIHNlYXJjaCB0aGUgdHJlZSBhZ2FpbiB0byBmaW5kIGEgbGVhZiB3aXRoIGxlc3NlciBrZXlzCisgKiByZXR1cm5zIDAgaWYgaXQgZm91bmQgc29tZXRoaW5nIG9yIDEgaWYgdGhlcmUgYXJlIG5vIGxlc3NlciBsZWF2ZXMuCisgKiByZXR1cm5zIDwgMCBvbiBpbyBlcnJvcnMuCisgKgorICogVGhpcyBtYXkgcmVsZWFzZSB0aGUgcGF0aCwgYW5kIHNvIHlvdSBtYXkgbG9zZSBhbnkgbG9ja3MgaGVsZCBhdCB0aGUKKyAqIHRpbWUgeW91IGNhbGwgaXQuCisgKi8KK2ludCBidHJmc19wcmV2X2xlYWYoc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsIHN0cnVjdCBidHJmc19wYXRoICpwYXRoKQoreworCXN0cnVjdCBidHJmc19rZXkga2V5OworCXN0cnVjdCBidHJmc19kaXNrX2tleSBmb3VuZF9rZXk7CisJaW50IHJldDsKKworCWJ0cmZzX2l0ZW1fa2V5X3RvX2NwdShwYXRoLT5ub2Rlc1swXSwgJmtleSwgMCk7CisKKwlpZiAoa2V5Lm9mZnNldCA+IDApCisJCWtleS5vZmZzZXQtLTsKKwllbHNlIGlmIChrZXkudHlwZSA+IDApCisJCWtleS50eXBlLS07CisJZWxzZSBpZiAoa2V5Lm9iamVjdGlkID4gMCkKKwkJa2V5Lm9iamVjdGlkLS07CisJZWxzZQorCQlyZXR1cm4gMTsKKworCWJ0cmZzX3JlbGVhc2VfcGF0aChyb290LCBwYXRoKTsKKwlyZXQgPSBidHJmc19zZWFyY2hfc2xvdChOVUxMLCByb290LCAma2V5LCBwYXRoLCAwLCAwKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwlidHJmc19pdGVtX2tleShwYXRoLT5ub2Rlc1swXSwgJmZvdW5kX2tleSwgMCk7CisJcmV0ID0gY29tcF9rZXlzKCZmb3VuZF9rZXksICZrZXkpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIEEgaGVscGVyIGZ1bmN0aW9uIHRvIHdhbGsgZG93biB0aGUgdHJlZSBzdGFydGluZyBhdCBtaW5fa2V5LCBhbmQgbG9va2luZworICogZm9yIG5vZGVzIG9yIGxlYXZlcyB0aGF0IGFyZSBlaXRoZXIgaW4gY2FjaGUgb3IgaGF2ZSBhIG1pbmltdW0KKyAqIHRyYW5zYWN0aW9uIGlkLiAgVGhpcyBpcyB1c2VkIGJ5IHRoZSBidHJlZSBkZWZyYWcgY29kZSwgYW5kIHRyZWUgbG9nZ2luZworICoKKyAqIFRoaXMgZG9lcyBub3QgY293LCBidXQgaXQgZG9lcyBzdHVmZiB0aGUgc3RhcnRpbmcga2V5IGl0IGZpbmRzIGJhY2sKKyAqIGludG8gbWluX2tleSwgc28geW91IGNhbiBjYWxsIGJ0cmZzX3NlYXJjaF9zbG90IHdpdGggY293PTEgb24gdGhlCisgKiBrZXkgYW5kIGdldCBhIHdyaXRhYmxlIHBhdGguCisgKgorICogVGhpcyBkb2VzIGxvY2sgYXMgaXQgZGVzY2VuZHMsIGFuZCBwYXRoLT5rZWVwX2xvY2tzIHNob3VsZCBiZSBzZXQKKyAqIHRvIDEgYnkgdGhlIGNhbGxlci4KKyAqCisgKiBUaGlzIGhvbm9ycyBwYXRoLT5sb3dlc3RfbGV2ZWwgdG8gcHJldmVudCBkZXNjZW50IHBhc3QgYSBnaXZlbiBsZXZlbAorICogb2YgdGhlIHRyZWUuCisgKgorICogbWluX3RyYW5zIGluZGljYXRlcyB0aGUgb2xkZXN0IHRyYW5zYWN0aW9uIHRoYXQgeW91IGFyZSBpbnRlcmVzdGVkCisgKiBpbiB3YWxraW5nIHRocm91Z2guICBBbnkgbm9kZXMgb3IgbGVhdmVzIG9sZGVyIHRoYW4gbWluX3RyYW5zIGFyZQorICogc2tpcHBlZCBvdmVyICh3aXRob3V0IHJlYWRpbmcgdGhlbSkuCisgKgorICogcmV0dXJucyB6ZXJvIGlmIHNvbWV0aGluZyB1c2VmdWwgd2FzIGZvdW5kLCA8IDAgb24gZXJyb3IgYW5kIDEgaWYgdGhlcmUKKyAqIHdhcyBub3RoaW5nIGluIHRoZSB0cmVlIHRoYXQgbWF0Y2hlZCB0aGUgc2VhcmNoIGNyaXRlcmlhLgorICovCitpbnQgYnRyZnNfc2VhcmNoX2ZvcndhcmQoc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsIHN0cnVjdCBidHJmc19rZXkgKm1pbl9rZXksCisJCQkgc3RydWN0IGJ0cmZzX2tleSAqbWF4X2tleSwKKwkJCSBzdHJ1Y3QgYnRyZnNfcGF0aCAqcGF0aCwgaW50IGNhY2hlX29ubHksCisJCQkgdTY0IG1pbl90cmFucykKK3sKKwlzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqY3VyOworCXN0cnVjdCBidHJmc19rZXkgZm91bmRfa2V5OworCWludCBzbG90OworCWludCBzcmV0OworCXUzMiBucml0ZW1zOworCWludCBsZXZlbDsKKwlpbnQgcmV0ID0gMTsKKworCVdBUk5fT04oIXBhdGgtPmtlZXBfbG9ja3MpOworYWdhaW46CisJY3VyID0gYnRyZnNfbG9ja19yb290X25vZGUocm9vdCk7CisJbGV2ZWwgPSBidHJmc19oZWFkZXJfbGV2ZWwoY3VyKTsKKwlXQVJOX09OKHBhdGgtPm5vZGVzW2xldmVsXSk7CisJcGF0aC0+bm9kZXNbbGV2ZWxdID0gY3VyOworCXBhdGgtPmxvY2tzW2xldmVsXSA9IDE7CisKKwlpZiAoYnRyZnNfaGVhZGVyX2dlbmVyYXRpb24oY3VyKSA8IG1pbl90cmFucykgeworCQlyZXQgPSAxOworCQlnb3RvIG91dDsKKwl9CisJd2hpbGUgKDEpIHsKKwkJbnJpdGVtcyA9IGJ0cmZzX2hlYWRlcl9ucml0ZW1zKGN1cik7CisJCWxldmVsID0gYnRyZnNfaGVhZGVyX2xldmVsKGN1cik7CisJCXNyZXQgPSBiaW5fc2VhcmNoKGN1ciwgbWluX2tleSwgbGV2ZWwsICZzbG90KTsKKworCQkvKiBhdCB0aGUgbG93ZXN0IGxldmVsLCB3ZSdyZSBkb25lLCBzZXR1cCB0aGUgcGF0aCBhbmQgZXhpdCAqLworCQlpZiAobGV2ZWwgPT0gcGF0aC0+bG93ZXN0X2xldmVsKSB7CisJCQlpZiAoc2xvdCA+PSBucml0ZW1zKQorCQkJCWdvdG8gZmluZF9uZXh0X2tleTsKKwkJCXJldCA9IDA7CisJCQlwYXRoLT5zbG90c1tsZXZlbF0gPSBzbG90OworCQkJYnRyZnNfaXRlbV9rZXlfdG9fY3B1KGN1ciwgJmZvdW5kX2tleSwgc2xvdCk7CisJCQlnb3RvIG91dDsKKwkJfQorCQlpZiAoc3JldCAmJiBzbG90ID4gMCkKKwkJCXNsb3QtLTsKKwkJLyoKKwkJICogY2hlY2sgdGhpcyBub2RlIHBvaW50ZXIgYWdhaW5zdCB0aGUgY2FjaGVfb25seSBhbmQKKwkJICogbWluX3RyYW5zIHBhcmFtZXRlcnMuICBJZiBpdCBpc24ndCBpbiBjYWNoZSBvciBpcyB0b28KKwkJICogb2xkLCBza2lwIHRvIHRoZSBuZXh0IG9uZS4KKwkJICovCisJCXdoaWxlIChzbG90IDwgbnJpdGVtcykgeworCQkJdTY0IGJsb2NrcHRyOworCQkJdTY0IGdlbjsKKwkJCXN0cnVjdCBleHRlbnRfYnVmZmVyICp0bXA7CisJCQlzdHJ1Y3QgYnRyZnNfZGlza19rZXkgZGlza19rZXk7CisKKwkJCWJsb2NrcHRyID0gYnRyZnNfbm9kZV9ibG9ja3B0cihjdXIsIHNsb3QpOworCQkJZ2VuID0gYnRyZnNfbm9kZV9wdHJfZ2VuZXJhdGlvbihjdXIsIHNsb3QpOworCQkJaWYgKGdlbiA8IG1pbl90cmFucykgeworCQkJCXNsb3QrKzsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghY2FjaGVfb25seSkKKwkJCQlicmVhazsKKworCQkJaWYgKG1heF9rZXkpIHsKKwkJCQlidHJmc19ub2RlX2tleShjdXIsICZkaXNrX2tleSwgc2xvdCk7CisJCQkJaWYgKGNvbXBfa2V5cygmZGlza19rZXksIG1heF9rZXkpID49IDApIHsKKwkJCQkJcmV0ID0gMTsKKwkJCQkJZ290byBvdXQ7CisJCQkJfQorCQkJfQorCisJCQl0bXAgPSBidHJmc19maW5kX3RyZWVfYmxvY2socm9vdCwgYmxvY2twdHIsCisJCQkJCSAgICBidHJmc19sZXZlbF9zaXplKHJvb3QsIGxldmVsIC0gMSkpOworCisJCQlpZiAodG1wICYmIGJ0cmZzX2J1ZmZlcl91cHRvZGF0ZSh0bXAsIGdlbikpIHsKKwkJCQlmcmVlX2V4dGVudF9idWZmZXIodG1wKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmICh0bXApCisJCQkJZnJlZV9leHRlbnRfYnVmZmVyKHRtcCk7CisJCQlzbG90Kys7CisJCX0KK2ZpbmRfbmV4dF9rZXk6CisJCS8qCisJCSAqIHdlIGRpZG4ndCBmaW5kIGEgY2FuZGlkYXRlIGtleSBpbiB0aGlzIG5vZGUsIHdhbGsgZm9yd2FyZAorCQkgKiBhbmQgZmluZCBhbm90aGVyIG9uZQorCQkgKi8KKwkJaWYgKHNsb3QgPj0gbnJpdGVtcykgeworCQkJcGF0aC0+c2xvdHNbbGV2ZWxdID0gc2xvdDsKKwkJCXNyZXQgPSBidHJmc19maW5kX25leHRfa2V5KHJvb3QsIHBhdGgsIG1pbl9rZXksIGxldmVsLAorCQkJCQkJICBjYWNoZV9vbmx5LCBtaW5fdHJhbnMpOworCQkJaWYgKHNyZXQgPT0gMCkgeworCQkJCWJ0cmZzX3JlbGVhc2VfcGF0aChyb290LCBwYXRoKTsKKwkJCQlnb3RvIGFnYWluOworCQkJfSBlbHNlIHsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJfQorCQkvKiBzYXZlIG91ciBrZXkgZm9yIHJldHVybmluZyBiYWNrICovCisJCWJ0cmZzX25vZGVfa2V5X3RvX2NwdShjdXIsICZmb3VuZF9rZXksIHNsb3QpOworCQlwYXRoLT5zbG90c1tsZXZlbF0gPSBzbG90OworCQlpZiAobGV2ZWwgPT0gcGF0aC0+bG93ZXN0X2xldmVsKSB7CisJCQlyZXQgPSAwOworCQkJdW5sb2NrX3VwKHBhdGgsIGxldmVsLCAxKTsKKwkJCWdvdG8gb3V0OworCQl9CisJCWN1ciA9IHJlYWRfbm9kZV9zbG90KHJvb3QsIGN1ciwgc2xvdCk7CisKKwkJYnRyZnNfdHJlZV9sb2NrKGN1cik7CisJCXBhdGgtPmxvY2tzW2xldmVsIC0gMV0gPSAxOworCQlwYXRoLT5ub2Rlc1tsZXZlbCAtIDFdID0gY3VyOworCQl1bmxvY2tfdXAocGF0aCwgbGV2ZWwsIDEpOworCX0KK291dDoKKwlpZiAocmV0ID09IDApCisJCW1lbWNweShtaW5fa2V5LCAmZm91bmRfa2V5LCBzaXplb2YoZm91bmRfa2V5KSk7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIHRoaXMgaXMgc2ltaWxhciB0byBidHJmc19uZXh0X2xlYWYsIGJ1dCBkb2VzIG5vdCB0cnkgdG8gcHJlc2VydmUKKyAqIGFuZCBmaXh1cCB0aGUgcGF0aC4gIEl0IGxvb2tzIGZvciBhbmQgcmV0dXJucyB0aGUgbmV4dCBrZXkgaW4gdGhlCisgKiB0cmVlIGJhc2VkIG9uIHRoZSBjdXJyZW50IHBhdGggYW5kIHRoZSBjYWNoZV9vbmx5IGFuZCBtaW5fdHJhbnMKKyAqIHBhcmFtZXRlcnMuCisgKgorICogMCBpcyByZXR1cm5lZCBpZiBhbm90aGVyIGtleSBpcyBmb3VuZCwgPCAwIGlmIHRoZXJlIGFyZSBhbnkgZXJyb3JzCisgKiBhbmQgMSBpcyByZXR1cm5lZCBpZiB0aGVyZSBhcmUgbm8gaGlnaGVyIGtleXMgaW4gdGhlIHRyZWUKKyAqCisgKiBwYXRoLT5rZWVwX2xvY2tzIHNob3VsZCBiZSBzZXQgdG8gMSBvbiB0aGUgc2VhcmNoIG1hZGUgYmVmb3JlCisgKiBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uCisgKi8KK2ludCBidHJmc19maW5kX25leHRfa2V5KHN0cnVjdCBidHJmc19yb290ICpyb290LCBzdHJ1Y3QgYnRyZnNfcGF0aCAqcGF0aCwKKwkJCXN0cnVjdCBidHJmc19rZXkgKmtleSwgaW50IGxvd2VzdF9sZXZlbCwKKwkJCWludCBjYWNoZV9vbmx5LCB1NjQgbWluX3RyYW5zKQoreworCWludCBsZXZlbCA9IGxvd2VzdF9sZXZlbDsKKwlpbnQgc2xvdDsKKwlzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqYzsKKworCVdBUk5fT04oIXBhdGgtPmtlZXBfbG9ja3MpOworCXdoaWxlIChsZXZlbCA8IEJUUkZTX01BWF9MRVZFTCkgeworCQlpZiAoIXBhdGgtPm5vZGVzW2xldmVsXSkKKwkJCXJldHVybiAxOworCisJCXNsb3QgPSBwYXRoLT5zbG90c1tsZXZlbF0gKyAxOworCQljID0gcGF0aC0+bm9kZXNbbGV2ZWxdOworbmV4dDoKKwkJaWYgKHNsb3QgPj0gYnRyZnNfaGVhZGVyX25yaXRlbXMoYykpIHsKKwkJCWxldmVsKys7CisJCQlpZiAobGV2ZWwgPT0gQlRSRlNfTUFYX0xFVkVMKQorCQkJCXJldHVybiAxOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKGxldmVsID09IDApCisJCQlidHJmc19pdGVtX2tleV90b19jcHUoYywga2V5LCBzbG90KTsKKwkJZWxzZSB7CisJCQl1NjQgYmxvY2twdHIgPSBidHJmc19ub2RlX2Jsb2NrcHRyKGMsIHNsb3QpOworCQkJdTY0IGdlbiA9IGJ0cmZzX25vZGVfcHRyX2dlbmVyYXRpb24oYywgc2xvdCk7CisKKwkJCWlmIChjYWNoZV9vbmx5KSB7CisJCQkJc3RydWN0IGV4dGVudF9idWZmZXIgKmN1cjsKKwkJCQljdXIgPSBidHJmc19maW5kX3RyZWVfYmxvY2socm9vdCwgYmxvY2twdHIsCisJCQkJCSAgICBidHJmc19sZXZlbF9zaXplKHJvb3QsIGxldmVsIC0gMSkpOworCQkJCWlmICghY3VyIHx8ICFidHJmc19idWZmZXJfdXB0b2RhdGUoY3VyLCBnZW4pKSB7CisJCQkJCXNsb3QrKzsKKwkJCQkJaWYgKGN1cikKKwkJCQkJCWZyZWVfZXh0ZW50X2J1ZmZlcihjdXIpOworCQkJCQlnb3RvIG5leHQ7CisJCQkJfQorCQkJCWZyZWVfZXh0ZW50X2J1ZmZlcihjdXIpOworCQkJfQorCQkJaWYgKGdlbiA8IG1pbl90cmFucykgeworCQkJCXNsb3QrKzsKKwkJCQlnb3RvIG5leHQ7CisJCQl9CisJCQlidHJmc19ub2RlX2tleV90b19jcHUoYywga2V5LCBzbG90KTsKKwkJfQorCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBzZWFyY2ggdGhlIHRyZWUgYWdhaW4gdG8gZmluZCBhIGxlYWYgd2l0aCBncmVhdGVyIGtleXMKKyAqIHJldHVybnMgMCBpZiBpdCBmb3VuZCBzb21ldGhpbmcgb3IgMSBpZiB0aGVyZSBhcmUgbm8gZ3JlYXRlciBsZWF2ZXMuCisgKiByZXR1cm5zIDwgMCBvbiBpbyBlcnJvcnMuCisgKi8KK2ludCBidHJmc19uZXh0X2xlYWYoc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsIHN0cnVjdCBidHJmc19wYXRoICpwYXRoKQoreworCWludCBzbG90OworCWludCBsZXZlbCA9IDE7CisJc3RydWN0IGV4dGVudF9idWZmZXIgKmM7CisJc3RydWN0IGV4dGVudF9idWZmZXIgKm5leHQgPSBOVUxMOworCXN0cnVjdCBidHJmc19rZXkga2V5OworCXUzMiBucml0ZW1zOworCWludCByZXQ7CisKKwlucml0ZW1zID0gYnRyZnNfaGVhZGVyX25yaXRlbXMocGF0aC0+bm9kZXNbMF0pOworCWlmIChucml0ZW1zID09IDApCisJCXJldHVybiAxOworCisJYnRyZnNfaXRlbV9rZXlfdG9fY3B1KHBhdGgtPm5vZGVzWzBdLCAma2V5LCBucml0ZW1zIC0gMSk7CisKKwlidHJmc19yZWxlYXNlX3BhdGgocm9vdCwgcGF0aCk7CisJcGF0aC0+a2VlcF9sb2NrcyA9IDE7CisJcmV0ID0gYnRyZnNfc2VhcmNoX3Nsb3QoTlVMTCwgcm9vdCwgJmtleSwgcGF0aCwgMCwgMCk7CisJcGF0aC0+a2VlcF9sb2NrcyA9IDA7CisKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCW5yaXRlbXMgPSBidHJmc19oZWFkZXJfbnJpdGVtcyhwYXRoLT5ub2Rlc1swXSk7CisJLyoKKwkgKiBieSByZWxlYXNpbmcgdGhlIHBhdGggYWJvdmUgd2UgZHJvcHBlZCBhbGwgb3VyIGxvY2tzLiAgQSBiYWxhbmNlCisJICogY291bGQgaGF2ZSBhZGRlZCBtb3JlIGl0ZW1zIG5leHQgdG8gdGhlIGtleSB0aGF0IHVzZWQgdG8gYmUKKwkgKiBhdCB0aGUgdmVyeSBlbmQgb2YgdGhlIGJsb2NrLiAgU28sIGNoZWNrIGFnYWluIGhlcmUgYW5kCisJICogYWR2YW5jZSB0aGUgcGF0aCBpZiB0aGVyZSBhcmUgbm93IG1vcmUgaXRlbXMgYXZhaWxhYmxlLgorCSAqLworCWlmIChucml0ZW1zID4gMCAmJiBwYXRoLT5zbG90c1swXSA8IG5yaXRlbXMgLSAxKSB7CisJCXBhdGgtPnNsb3RzWzBdKys7CisJCWdvdG8gZG9uZTsKKwl9CisKKwl3aGlsZSAobGV2ZWwgPCBCVFJGU19NQVhfTEVWRUwpIHsKKwkJaWYgKCFwYXRoLT5ub2Rlc1tsZXZlbF0pCisJCQlyZXR1cm4gMTsKKworCQlzbG90ID0gcGF0aC0+c2xvdHNbbGV2ZWxdICsgMTsKKwkJYyA9IHBhdGgtPm5vZGVzW2xldmVsXTsKKwkJaWYgKHNsb3QgPj0gYnRyZnNfaGVhZGVyX25yaXRlbXMoYykpIHsKKwkJCWxldmVsKys7CisJCQlpZiAobGV2ZWwgPT0gQlRSRlNfTUFYX0xFVkVMKQorCQkJCXJldHVybiAxOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAobmV4dCkgeworCQkJYnRyZnNfdHJlZV91bmxvY2sobmV4dCk7CisJCQlmcmVlX2V4dGVudF9idWZmZXIobmV4dCk7CisJCX0KKworCQlpZiAobGV2ZWwgPT0gMSAmJiAocGF0aC0+bG9ja3NbMV0gfHwgcGF0aC0+c2tpcF9sb2NraW5nKSAmJgorCQkgICAgcGF0aC0+cmVhZGEpCisJCQlyZWFkYV9mb3Jfc2VhcmNoKHJvb3QsIHBhdGgsIGxldmVsLCBzbG90LCAwKTsKKworCQluZXh0ID0gcmVhZF9ub2RlX3Nsb3Qocm9vdCwgYywgc2xvdCk7CisJCWlmICghcGF0aC0+c2tpcF9sb2NraW5nKSB7CisJCQlXQVJOX09OKCFidHJmc190cmVlX2xvY2tlZChjKSk7CisJCQlidHJmc190cmVlX2xvY2sobmV4dCk7CisJCX0KKwkJYnJlYWs7CisJfQorCXBhdGgtPnNsb3RzW2xldmVsXSA9IHNsb3Q7CisJd2hpbGUgKDEpIHsKKwkJbGV2ZWwtLTsKKwkJYyA9IHBhdGgtPm5vZGVzW2xldmVsXTsKKwkJaWYgKHBhdGgtPmxvY2tzW2xldmVsXSkKKwkJCWJ0cmZzX3RyZWVfdW5sb2NrKGMpOworCQlmcmVlX2V4dGVudF9idWZmZXIoYyk7CisJCXBhdGgtPm5vZGVzW2xldmVsXSA9IG5leHQ7CisJCXBhdGgtPnNsb3RzW2xldmVsXSA9IDA7CisJCWlmICghcGF0aC0+c2tpcF9sb2NraW5nKQorCQkJcGF0aC0+bG9ja3NbbGV2ZWxdID0gMTsKKwkJaWYgKCFsZXZlbCkKKwkJCWJyZWFrOworCQlpZiAobGV2ZWwgPT0gMSAmJiBwYXRoLT5sb2Nrc1sxXSAmJiBwYXRoLT5yZWFkYSkKKwkJCXJlYWRhX2Zvcl9zZWFyY2gocm9vdCwgcGF0aCwgbGV2ZWwsIHNsb3QsIDApOworCQluZXh0ID0gcmVhZF9ub2RlX3Nsb3Qocm9vdCwgbmV4dCwgMCk7CisJCWlmICghcGF0aC0+c2tpcF9sb2NraW5nKSB7CisJCQlXQVJOX09OKCFidHJmc190cmVlX2xvY2tlZChwYXRoLT5ub2Rlc1tsZXZlbF0pKTsKKwkJCWJ0cmZzX3RyZWVfbG9jayhuZXh0KTsKKwkJfQorCX0KK2RvbmU6CisJdW5sb2NrX3VwKHBhdGgsIDAsIDEpOworCXJldHVybiAwOworfQorCisvKgorICogdGhpcyB1c2VzIGJ0cmZzX3ByZXZfbGVhZiB0byB3YWxrIGJhY2t3YXJkcyBpbiB0aGUgdHJlZSwgYW5kIGtlZXBzCisgKiBzZWFyY2hpbmcgdW50aWwgaXQgZ2V0cyBwYXN0IG1pbl9vYmplY3RpZCBvciBmaW5kcyBhbiBpdGVtIG9mICd0eXBlJworICoKKyAqIHJldHVybnMgMCBpZiBzb21ldGhpbmcgaXMgZm91bmQsIDEgaWYgbm90aGluZyB3YXMgZm91bmQgYW5kIDwgMCBvbiBlcnJvcgorICovCitpbnQgYnRyZnNfcHJldmlvdXNfaXRlbShzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwKKwkJCXN0cnVjdCBidHJmc19wYXRoICpwYXRoLCB1NjQgbWluX29iamVjdGlkLAorCQkJaW50IHR5cGUpCit7CisJc3RydWN0IGJ0cmZzX2tleSBmb3VuZF9rZXk7CisJc3RydWN0IGV4dGVudF9idWZmZXIgKmxlYWY7CisJdTMyIG5yaXRlbXM7CisJaW50IHJldDsKKworCXdoaWxlICgxKSB7CisJCWlmIChwYXRoLT5zbG90c1swXSA9PSAwKSB7CisJCQlyZXQgPSBidHJmc19wcmV2X2xlYWYocm9vdCwgcGF0aCk7CisJCQlpZiAocmV0ICE9IDApCisJCQkJcmV0dXJuIHJldDsKKwkJfSBlbHNlIHsKKwkJCXBhdGgtPnNsb3RzWzBdLS07CisJCX0KKwkJbGVhZiA9IHBhdGgtPm5vZGVzWzBdOworCQlucml0ZW1zID0gYnRyZnNfaGVhZGVyX25yaXRlbXMobGVhZik7CisJCWlmIChucml0ZW1zID09IDApCisJCQlyZXR1cm4gMTsKKwkJaWYgKHBhdGgtPnNsb3RzWzBdID09IG5yaXRlbXMpCisJCQlwYXRoLT5zbG90c1swXS0tOworCisJCWJ0cmZzX2l0ZW1fa2V5X3RvX2NwdShsZWFmLCAmZm91bmRfa2V5LCBwYXRoLT5zbG90c1swXSk7CisJCWlmIChmb3VuZF9rZXkudHlwZSA9PSB0eXBlKQorCQkJcmV0dXJuIDA7CisJCWlmIChmb3VuZF9rZXkub2JqZWN0aWQgPCBtaW5fb2JqZWN0aWQpCisJCQlicmVhazsKKwkJaWYgKGZvdW5kX2tleS5vYmplY3RpZCA9PSBtaW5fb2JqZWN0aWQgJiYKKwkJICAgIGZvdW5kX2tleS50eXBlIDwgdHlwZSkKKwkJCWJyZWFrOworCX0KKwlyZXR1cm4gMTsKK30KZGlmZiAtLWdpdCBhL2ZzL2J0cmZzL2N0cmVlLmggYi9mcy9idHJmcy9jdHJlZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlZTA2MGYKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9idHJmcy9jdHJlZS5oCkBAIC0wLDAgKzEsMjEyOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBPcmFjbGUuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSB2MiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorICogQm9zdG9uLCBNQSAwMjExMTAtMTMwNywgVVNBLgorICovCisKKyNpZm5kZWYgX19CVFJGU19DVFJFRV9fCisjZGVmaW5lIF9fQlRSRlNfQ1RSRUVfXworCisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgorI2luY2x1ZGUgPGxpbnV4L2JhY2tpbmctZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvd2FpdC5oPgorI2luY2x1ZGUgPGFzbS9rbWFwX3R5cGVzLmg+CisjaW5jbHVkZSAiZXh0ZW50X2lvLmgiCisjaW5jbHVkZSAiZXh0ZW50X21hcC5oIgorI2luY2x1ZGUgImFzeW5jLXRocmVhZC5oIgorCitzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlOworc3RydWN0IGJ0cmZzX3RyYW5zYWN0aW9uOworZXh0ZXJuIHN0cnVjdCBrbWVtX2NhY2hlICpidHJmc190cmFuc19oYW5kbGVfY2FjaGVwOworZXh0ZXJuIHN0cnVjdCBrbWVtX2NhY2hlICpidHJmc190cmFuc2FjdGlvbl9jYWNoZXA7CitleHRlcm4gc3RydWN0IGttZW1fY2FjaGUgKmJ0cmZzX2JpdF9yYWRpeF9jYWNoZXA7CitleHRlcm4gc3RydWN0IGttZW1fY2FjaGUgKmJ0cmZzX3BhdGhfY2FjaGVwOworc3RydWN0IGJ0cmZzX29yZGVyZWRfc3VtOworCisjZGVmaW5lIEJUUkZTX01BR0lDICJfQkhSZlNfTSIKKworI2RlZmluZSBCVFJGU19BQ0xfTk9UX0NBQ0hFRCAgICAoKHZvaWQgKiktMSkKKworI2lmZGVmIENPTkZJR19MT0NLREVQCisjIGRlZmluZSBCVFJGU19NQVhfTEVWRUwgNworI2Vsc2UKKyMgZGVmaW5lIEJUUkZTX01BWF9MRVZFTCA4CisjZW5kaWYKKworLyogaG9sZHMgcG9pbnRlcnMgdG8gYWxsIG9mIHRoZSB0cmVlIHJvb3RzICovCisjZGVmaW5lIEJUUkZTX1JPT1RfVFJFRV9PQkpFQ1RJRCAxVUxMCisKKy8qIHN0b3JlcyBpbmZvcm1hdGlvbiBhYm91dCB3aGljaCBleHRlbnRzIGFyZSBpbiB1c2UsIGFuZCByZWZlcmVuY2UgY291bnRzICovCisjZGVmaW5lIEJUUkZTX0VYVEVOVF9UUkVFX09CSkVDVElEIDJVTEwKKworLyoKKyAqIGNodW5rIHRyZWUgc3RvcmVzIHRyYW5zbGF0aW9ucyBmcm9tIGxvZ2ljYWwgLT4gcGh5c2ljYWwgYmxvY2sgbnVtYmVyaW5nCisgKiB0aGUgc3VwZXIgYmxvY2sgcG9pbnRzIHRvIHRoZSBjaHVuayB0cmVlCisgKi8KKyNkZWZpbmUgQlRSRlNfQ0hVTktfVFJFRV9PQkpFQ1RJRCAzVUxMCisKKy8qCisgKiBzdG9yZXMgaW5mb3JtYXRpb24gYWJvdXQgd2hpY2ggYXJlYXMgb2YgYSBnaXZlbiBkZXZpY2UgYXJlIGluIHVzZS4KKyAqIG9uZSBwZXIgZGV2aWNlLiAgVGhlIHRyZWUgb2YgdHJlZSByb290cyBwb2ludHMgdG8gdGhlIGRldmljZSB0cmVlCisgKi8KKyNkZWZpbmUgQlRSRlNfREVWX1RSRUVfT0JKRUNUSUQgNFVMTAorCisvKiBvbmUgcGVyIHN1YnZvbHVtZSwgc3RvcmluZyBmaWxlcyBhbmQgZGlyZWN0b3JpZXMgKi8KKyNkZWZpbmUgQlRSRlNfRlNfVFJFRV9PQkpFQ1RJRCA1VUxMCisKKy8qIGRpcmVjdG9yeSBvYmplY3RpZCBpbnNpZGUgdGhlIHJvb3QgdHJlZSAqLworI2RlZmluZSBCVFJGU19ST09UX1RSRUVfRElSX09CSkVDVElEIDZVTEwKKworLyogaG9sZHMgY2hlY2tzdW1zIG9mIGFsbCB0aGUgZGF0YSBleHRlbnRzICovCisjZGVmaW5lIEJUUkZTX0NTVU1fVFJFRV9PQkpFQ1RJRCA3VUxMCisKKy8qIG9yaHBhbiBvYmplY3RpZCBmb3IgdHJhY2tpbmcgdW5saW5rZWQvdHJ1bmNhdGVkIGZpbGVzICovCisjZGVmaW5lIEJUUkZTX09SUEhBTl9PQkpFQ1RJRCAtNVVMTAorCisvKiBkb2VzIHdyaXRlIGFoZWFkIGxvZ2dpbmcgdG8gc3BlZWQgdXAgZnN5bmNzICovCisjZGVmaW5lIEJUUkZTX1RSRUVfTE9HX09CSkVDVElEIC02VUxMCisjZGVmaW5lIEJUUkZTX1RSRUVfTE9HX0ZJWFVQX09CSkVDVElEIC03VUxMCisKKy8qIGZvciBzcGFjZSBiYWxhbmNpbmcgKi8KKyNkZWZpbmUgQlRSRlNfVFJFRV9SRUxPQ19PQkpFQ1RJRCAtOFVMTAorI2RlZmluZSBCVFJGU19EQVRBX1JFTE9DX1RSRUVfT0JKRUNUSUQgLTlVTEwKKworLyoKKyAqIGV4dGVudCBjaGVja3N1bXMgYWxsIGhhdmUgdGhpcyBvYmplY3RpZAorICogdGhpcyBhbGxvd3MgdGhlbSB0byBzaGFyZSB0aGUgbG9nZ2luZyB0cmVlCisgKiBmb3IgZnN5bmNzCisgKi8KKyNkZWZpbmUgQlRSRlNfRVhURU5UX0NTVU1fT0JKRUNUSUQgLTEwVUxMCisKKy8qIGR1bW15IG9iamVjdGlkIHJlcHJlc2VudHMgbXVsdGlwbGUgb2JqZWN0aWRzICovCisjZGVmaW5lIEJUUkZTX01VTFRJUExFX09CSkVDVElEUyAtMjU1VUxMCisKKy8qCisgKiBBbGwgZmlsZXMgaGF2ZSBvYmplY3RpZHMgaW4gdGhpcyByYW5nZS4KKyAqLworI2RlZmluZSBCVFJGU19GSVJTVF9GUkVFX09CSkVDVElEIDI1NlVMTAorI2RlZmluZSBCVFJGU19MQVNUX0ZSRUVfT0JKRUNUSUQgLTI1NlVMTAorI2RlZmluZSBCVFJGU19GSVJTVF9DSFVOS19UUkVFX09CSkVDVElEIDI1NlVMTAorCisKKy8qCisgKiB0aGUgZGV2aWNlIGl0ZW1zIGdvIGludG8gdGhlIGNodW5rIHRyZWUuICBUaGUga2V5IGlzIGluIHRoZSBmb3JtCisgKiBbIDEgQlRSRlNfREVWX0lURU1fS0VZIGRldmljZV9pZCBdCisgKi8KKyNkZWZpbmUgQlRSRlNfREVWX0lURU1TX09CSkVDVElEIDFVTEwKKworLyoKKyAqIHdlIGNhbiBhY3R1YWxseSBzdG9yZSBtdWNoIGJpZ2dlciBuYW1lcywgYnV0IGxldHMgbm90IGNvbmZ1c2UgdGhlIHJlc3QKKyAqIG9mIGxpbnV4CisgKi8KKyNkZWZpbmUgQlRSRlNfTkFNRV9MRU4gMjU1CisKKy8qIDMyIGJ5dGVzIGluIHZhcmlvdXMgY3N1bSBmaWVsZHMgKi8KKyNkZWZpbmUgQlRSRlNfQ1NVTV9TSVpFIDMyCisKKy8qIGNzdW0gdHlwZXMgKi8KKyNkZWZpbmUgQlRSRlNfQ1NVTV9UWVBFX0NSQzMyCTAKKworc3RhdGljIGludCBidHJmc19jc3VtX3NpemVzW10gPSB7IDQsIDAgfTsKKworLyogZm91ciBieXRlcyBmb3IgQ1JDMzIgKi8KKyNkZWZpbmUgQlRSRlNfRU1QVFlfRElSX1NJWkUgMAorCisjZGVmaW5lIEJUUkZTX0ZUX1VOS05PV04JMAorI2RlZmluZSBCVFJGU19GVF9SRUdfRklMRQkxCisjZGVmaW5lIEJUUkZTX0ZUX0RJUgkJMgorI2RlZmluZSBCVFJGU19GVF9DSFJERVYJCTMKKyNkZWZpbmUgQlRSRlNfRlRfQkxLREVWCQk0CisjZGVmaW5lIEJUUkZTX0ZUX0ZJRk8JCTUKKyNkZWZpbmUgQlRSRlNfRlRfU09DSwkJNgorI2RlZmluZSBCVFJGU19GVF9TWU1MSU5LCTcKKyNkZWZpbmUgQlRSRlNfRlRfWEFUVFIJCTgKKyNkZWZpbmUgQlRSRlNfRlRfTUFYCQk5CisKKy8qCisgKiB0aGUga2V5IGRlZmluZXMgdGhlIG9yZGVyIGluIHRoZSB0cmVlLCBhbmQgc28gaXQgYWxzbyBkZWZpbmVzIChvcHRpbWFsKQorICogYmxvY2sgbGF5b3V0LiAgb2JqZWN0aWQgY29ycmVzb25kcyB0byB0aGUgaW5vZGUgbnVtYmVyLiAgVGhlIGZsYWdzCisgKiB0ZWxscyB1cyB0aGluZ3MgYWJvdXQgdGhlIG9iamVjdCwgYW5kIGlzIGEga2luZCBvZiBzdHJlYW0gc2VsZWN0b3IuCisgKiBzbyBmb3IgYSBnaXZlbiBpbm9kZSwga2V5cyB3aXRoIGZsYWdzIG9mIDEgbWlnaHQgcmVmZXIgdG8gdGhlIGlub2RlCisgKiBkYXRhLCBmbGFncyBvZiAyIG1heSBwb2ludCB0byBmaWxlIGRhdGEgaW4gdGhlIGJ0cmVlIGFuZCBmbGFncyA9PSAzCisgKiBtYXkgcG9pbnQgdG8gZXh0ZW50cy4KKyAqCisgKiBvZmZzZXQgaXMgdGhlIHN0YXJ0aW5nIGJ5dGUgb2Zmc2V0IGZvciB0aGlzIGtleSBpbiB0aGUgc3RyZWFtLgorICoKKyAqIGJ0cmZzX2Rpc2tfa2V5IGlzIGluIGRpc2sgYnl0ZSBvcmRlci4gIHN0cnVjdCBidHJmc19rZXkgaXMgYWx3YXlzCisgKiBpbiBjcHUgbmF0aXZlIG9yZGVyLiAgT3RoZXJ3aXNlIHRoZXkgYXJlIGlkZW50aWNhbCBhbmQgdGhlaXIgc2l6ZXMKKyAqIHNob3VsZCBiZSB0aGUgc2FtZSAoaWUgYm90aCBwYWNrZWQpCisgKi8KK3N0cnVjdCBidHJmc19kaXNrX2tleSB7CisJX19sZTY0IG9iamVjdGlkOworCXU4IHR5cGU7CisJX19sZTY0IG9mZnNldDsKK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKTsKKworc3RydWN0IGJ0cmZzX2tleSB7CisJdTY0IG9iamVjdGlkOworCXU4IHR5cGU7CisJdTY0IG9mZnNldDsKK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKTsKKworc3RydWN0IGJ0cmZzX21hcHBpbmdfdHJlZSB7CisJc3RydWN0IGV4dGVudF9tYXBfdHJlZSBtYXBfdHJlZTsKK307CisKKyNkZWZpbmUgQlRSRlNfVVVJRF9TSVpFIDE2CitzdHJ1Y3QgYnRyZnNfZGV2X2l0ZW0geworCS8qIHRoZSBpbnRlcm5hbCBidHJmcyBkZXZpY2UgaWQgKi8KKwlfX2xlNjQgZGV2aWQ7CisKKwkvKiBzaXplIG9mIHRoZSBkZXZpY2UgKi8KKwlfX2xlNjQgdG90YWxfYnl0ZXM7CisKKwkvKiBieXRlcyB1c2VkICovCisJX19sZTY0IGJ5dGVzX3VzZWQ7CisKKwkvKiBvcHRpbWFsIGlvIGFsaWdubWVudCBmb3IgdGhpcyBkZXZpY2UgKi8KKwlfX2xlMzIgaW9fYWxpZ247CisKKwkvKiBvcHRpbWFsIGlvIHdpZHRoIGZvciB0aGlzIGRldmljZSAqLworCV9fbGUzMiBpb193aWR0aDsKKworCS8qIG1pbmltYWwgaW8gc2l6ZSBmb3IgdGhpcyBkZXZpY2UgKi8KKwlfX2xlMzIgc2VjdG9yX3NpemU7CisKKwkvKiB0eXBlIGFuZCBpbmZvIGFib3V0IHRoaXMgZGV2aWNlICovCisJX19sZTY0IHR5cGU7CisKKwkvKiBleHBlY3RlZCBnZW5lcmF0aW9uIGZvciB0aGlzIGRldmljZSAqLworCV9fbGU2NCBnZW5lcmF0aW9uOworCisJLyoKKwkgKiBzdGFydGluZyBieXRlIG9mIHRoaXMgcGFydGl0aW9uIG9uIHRoZSBkZXZpY2UsCisJICogdG8gYWxsb3dyIGZvciBzdHJpcGUgYWxpZ25tZW50IGluIHRoZSBmdXR1cmUKKwkgKi8KKwlfX2xlNjQgc3RhcnRfb2Zmc2V0OworCisJLyogZ3JvdXBpbmcgaW5mb3JtYXRpb24gZm9yIGFsbG9jYXRpb24gZGVjaXNpb25zICovCisJX19sZTMyIGRldl9ncm91cDsKKworCS8qIHNlZWsgc3BlZWQgMC0xMDAgd2hlcmUgMTAwIGlzIGZhc3Rlc3QgKi8KKwl1OCBzZWVrX3NwZWVkOworCisJLyogYmFuZHdpZHRoIDAtMTAwIHdoZXJlIDEwMCBpcyBmYXN0ZXN0ICovCisJdTggYmFuZHdpZHRoOworCisJLyogYnRyZnMgZ2VuZXJhdGVkIHV1aWQgZm9yIHRoaXMgZGV2aWNlICovCisJdTggdXVpZFtCVFJGU19VVUlEX1NJWkVdOworCisJLyogdXVpZCBvZiBGUyB3aG8gb3ducyB0aGlzIGRldmljZSAqLworCXU4IGZzaWRbQlRSRlNfVVVJRF9TSVpFXTsKK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKTsKKworc3RydWN0IGJ0cmZzX3N0cmlwZSB7CisJX19sZTY0IGRldmlkOworCV9fbGU2NCBvZmZzZXQ7CisJdTggZGV2X3V1aWRbQlRSRlNfVVVJRF9TSVpFXTsKK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKTsKKworc3RydWN0IGJ0cmZzX2NodW5rIHsKKwkvKiBzaXplIG9mIHRoaXMgY2h1bmsgaW4gYnl0ZXMgKi8KKwlfX2xlNjQgbGVuZ3RoOworCisJLyogb2JqZWN0aWQgb2YgdGhlIHJvb3QgcmVmZXJlbmNpbmcgdGhpcyBjaHVuayAqLworCV9fbGU2NCBvd25lcjsKKworCV9fbGU2NCBzdHJpcGVfbGVuOworCV9fbGU2NCB0eXBlOworCisJLyogb3B0aW1hbCBpbyBhbGlnbm1lbnQgZm9yIHRoaXMgY2h1bmsgKi8KKwlfX2xlMzIgaW9fYWxpZ247CisKKwkvKiBvcHRpbWFsIGlvIHdpZHRoIGZvciB0aGlzIGNodW5rICovCisJX19sZTMyIGlvX3dpZHRoOworCisJLyogbWluaW1hbCBpbyBzaXplIGZvciB0aGlzIGNodW5rICovCisJX19sZTMyIHNlY3Rvcl9zaXplOworCisJLyogMl4xNiBzdHJpcGVzIGlzIHF1aXRlIGEgbG90LCBhIHNlY29uZCBsaW1pdCBpcyB0aGUgc2l6ZSBvZiBhIHNpbmdsZQorCSAqIGl0ZW0gaW4gdGhlIGJ0cmVlCisJICovCisJX19sZTE2IG51bV9zdHJpcGVzOworCisJLyogc3ViIHN0cmlwZXMgb25seSBtYXR0ZXIgZm9yIHJhaWQxMCAqLworCV9fbGUxNiBzdWJfc3RyaXBlczsKKwlzdHJ1Y3QgYnRyZnNfc3RyaXBlIHN0cmlwZTsKKwkvKiBhZGRpdGlvbmFsIHN0cmlwZXMgZ28gaGVyZSAqLworfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpOworCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgYnRyZnNfY2h1bmtfaXRlbV9zaXplKGludCBudW1fc3RyaXBlcykKK3sKKwlCVUdfT04obnVtX3N0cmlwZXMgPT0gMCk7CisJcmV0dXJuIHNpemVvZihzdHJ1Y3QgYnRyZnNfY2h1bmspICsKKwkJc2l6ZW9mKHN0cnVjdCBidHJmc19zdHJpcGUpICogKG51bV9zdHJpcGVzIC0gMSk7Cit9CisKKyNkZWZpbmUgQlRSRlNfRlNJRF9TSVpFIDE2CisjZGVmaW5lIEJUUkZTX0hFQURFUl9GTEFHX1dSSVRURU4gKDEgPDwgMCkKKworLyoKKyAqIGV2ZXJ5IHRyZWUgYmxvY2sgKGxlYWYgb3Igbm9kZSkgc3RhcnRzIHdpdGggdGhpcyBoZWFkZXIuCisgKi8KK3N0cnVjdCBidHJmc19oZWFkZXIgeworCS8qIHRoZXNlIGZpcnN0IGZvdXIgbXVzdCBtYXRjaCB0aGUgc3VwZXIgYmxvY2sgKi8KKwl1OCBjc3VtW0JUUkZTX0NTVU1fU0laRV07CisJdTggZnNpZFtCVFJGU19GU0lEX1NJWkVdOyAvKiBGUyBzcGVjaWZpYyB1dWlkICovCisJX19sZTY0IGJ5dGVucjsgLyogd2hpY2ggYmxvY2sgdGhpcyBub2RlIGlzIHN1cHBvc2VkIHRvIGxpdmUgaW4gKi8KKwlfX2xlNjQgZmxhZ3M7CisKKwkvKiBhbGxvd2VkIHRvIGJlIGRpZmZlcmVudCBmcm9tIHRoZSBzdXBlciBmcm9tIGhlcmUgb24gZG93biAqLworCXU4IGNodW5rX3RyZWVfdXVpZFtCVFJGU19VVUlEX1NJWkVdOworCV9fbGU2NCBnZW5lcmF0aW9uOworCV9fbGU2NCBvd25lcjsKKwlfX2xlMzIgbnJpdGVtczsKKwl1OCBsZXZlbDsKK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKTsKKworI2RlZmluZSBCVFJGU19OT0RFUFRSU19QRVJfQkxPQ0socikgKCgociktPm5vZGVzaXplIC0gXAorCQkJCSAgICAgIHNpemVvZihzdHJ1Y3QgYnRyZnNfaGVhZGVyKSkgLyBcCisJCQkJICAgICBzaXplb2Yoc3RydWN0IGJ0cmZzX2tleV9wdHIpKQorI2RlZmluZSBfX0JUUkZTX0xFQUZfREFUQV9TSVpFKGJzKSAoKGJzKSAtIHNpemVvZihzdHJ1Y3QgYnRyZnNfaGVhZGVyKSkKKyNkZWZpbmUgQlRSRlNfTEVBRl9EQVRBX1NJWkUocikgKF9fQlRSRlNfTEVBRl9EQVRBX1NJWkUoci0+bGVhZnNpemUpKQorI2RlZmluZSBCVFJGU19NQVhfSU5MSU5FX0RBVEFfU0laRShyKSAoQlRSRlNfTEVBRl9EQVRBX1NJWkUocikgLSBcCisJCQkJCXNpemVvZihzdHJ1Y3QgYnRyZnNfaXRlbSkgLSBcCisJCQkJCXNpemVvZihzdHJ1Y3QgYnRyZnNfZmlsZV9leHRlbnRfaXRlbSkpCisKKyNkZWZpbmUgQlRSRlNfU1VQRVJfRkxBR19TRUVESU5HICgxVUxMIDw8IDMyKQorCisvKgorICogdGhpcyBpcyBhIHZlcnkgZ2VuZXJvdXMgcG9ydGlvbiBvZiB0aGUgc3VwZXIgYmxvY2ssIGdpdmluZyB1cworICogcm9vbSB0byB0cmFuc2xhdGUgMTQgY2h1bmtzIHdpdGggMyBzdHJpcGVzIGVhY2guCisgKi8KKyNkZWZpbmUgQlRSRlNfU1lTVEVNX0NIVU5LX0FSUkFZX1NJWkUgMjA0OAorI2RlZmluZSBCVFJGU19MQUJFTF9TSVpFIDI1NgorCisvKgorICogdGhlIHN1cGVyIGJsb2NrIGJhc2ljYWxseSBsaXN0cyB0aGUgbWFpbiB0cmVlcyBvZiB0aGUgRlMKKyAqIGl0IGN1cnJlbnRseSBsYWNrcyBhbnkgYmxvY2sgY291bnQgZXRjIGV0YworICovCitzdHJ1Y3QgYnRyZnNfc3VwZXJfYmxvY2sgeworCXU4IGNzdW1bQlRSRlNfQ1NVTV9TSVpFXTsKKwkvKiB0aGUgZmlyc3QgNCBmaWVsZHMgbXVzdCBtYXRjaCBzdHJ1Y3QgYnRyZnNfaGVhZGVyICovCisJdTggZnNpZFtCVFJGU19GU0lEX1NJWkVdOyAgICAvKiBGUyBzcGVjaWZpYyB1dWlkICovCisJX19sZTY0IGJ5dGVucjsgLyogdGhpcyBibG9jayBudW1iZXIgKi8KKwlfX2xlNjQgZmxhZ3M7CisKKwkvKiBhbGxvd2VkIHRvIGJlIGRpZmZlcmVudCBmcm9tIHRoZSBidHJmc19oZWFkZXIgZnJvbSBoZXJlIG93biBkb3duICovCisJX19sZTY0IG1hZ2ljOworCV9fbGU2NCBnZW5lcmF0aW9uOworCV9fbGU2NCByb290OworCV9fbGU2NCBjaHVua19yb290OworCV9fbGU2NCBsb2dfcm9vdDsKKworCS8qIHRoaXMgd2lsbCBoZWxwIGZpbmQgdGhlIG5ldyBzdXBlciBiYXNlZCBvbiB0aGUgbG9nIHJvb3QgKi8KKwlfX2xlNjQgbG9nX3Jvb3RfdHJhbnNpZDsKKwlfX2xlNjQgdG90YWxfYnl0ZXM7CisJX19sZTY0IGJ5dGVzX3VzZWQ7CisJX19sZTY0IHJvb3RfZGlyX29iamVjdGlkOworCV9fbGU2NCBudW1fZGV2aWNlczsKKwlfX2xlMzIgc2VjdG9yc2l6ZTsKKwlfX2xlMzIgbm9kZXNpemU7CisJX19sZTMyIGxlYWZzaXplOworCV9fbGUzMiBzdHJpcGVzaXplOworCV9fbGUzMiBzeXNfY2h1bmtfYXJyYXlfc2l6ZTsKKwlfX2xlNjQgY2h1bmtfcm9vdF9nZW5lcmF0aW9uOworCV9fbGU2NCBjb21wYXRfZmxhZ3M7CisJX19sZTY0IGNvbXBhdF9yb19mbGFnczsKKwlfX2xlNjQgaW5jb21wYXRfZmxhZ3M7CisJX19sZTE2IGNzdW1fdHlwZTsKKwl1OCByb290X2xldmVsOworCXU4IGNodW5rX3Jvb3RfbGV2ZWw7CisJdTggbG9nX3Jvb3RfbGV2ZWw7CisJc3RydWN0IGJ0cmZzX2Rldl9pdGVtIGRldl9pdGVtOworCisJY2hhciBsYWJlbFtCVFJGU19MQUJFTF9TSVpFXTsKKworCS8qIGZ1dHVyZSBleHBhbnNpb24gKi8KKwlfX2xlNjQgcmVzZXJ2ZWRbMzJdOworCXU4IHN5c19jaHVua19hcnJheVtCVFJGU19TWVNURU1fQ0hVTktfQVJSQVlfU0laRV07Cit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSk7CisKKy8qCisgKiBDb21wYXQgZmxhZ3MgdGhhdCB3ZSBzdXBwb3J0LiAgSWYgYW55IGluY29tcGF0IGZsYWdzIGFyZSBzZXQgb3RoZXIgdGhhbiB0aGUKKyAqIG9uZXMgc3BlY2lmaWVkIGJlbG93IHRoZW4gd2Ugd2lsbCBmYWlsIHRvIG1vdW50CisgKi8KKyNkZWZpbmUgQlRSRlNfRkVBVFVSRV9DT01QQVRfU1VQUAkweDAKKyNkZWZpbmUgQlRSRlNfRkVBVFVSRV9DT01QQVRfUk9fU1VQUAkweDAKKyNkZWZpbmUgQlRSRlNfRkVBVFVSRV9JTkNPTVBBVF9TVVBQCTB4MAorCisvKgorICogQSBsZWFmIGlzIGZ1bGwgb2YgaXRlbXMuIG9mZnNldCBhbmQgc2l6ZSB0ZWxsIHVzIHdoZXJlIHRvIGZpbmQKKyAqIHRoZSBpdGVtIGluIHRoZSBsZWFmIChyZWxhdGl2ZSB0byB0aGUgc3RhcnQgb2YgdGhlIGRhdGEgYXJlYSkKKyAqLworc3RydWN0IGJ0cmZzX2l0ZW0geworCXN0cnVjdCBidHJmc19kaXNrX2tleSBrZXk7CisJX19sZTMyIG9mZnNldDsKKwlfX2xlMzIgc2l6ZTsKK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKTsKKworLyoKKyAqIGxlYXZlcyBoYXZlIGFuIGl0ZW0gYXJlYSBhbmQgYSBkYXRhIGFyZWE6CisgKiBbaXRlbTAsIGl0ZW0xLi4uLml0ZW1OXSBbZnJlZSBzcGFjZV0gW2RhdGFOLi4uZGF0YTEsIGRhdGEwXQorICoKKyAqIFRoZSBkYXRhIGlzIHNlcGFyYXRlIGZyb20gdGhlIGl0ZW1zIHRvIGdldCB0aGUga2V5cyBjbG9zZXIgdG9nZXRoZXIKKyAqIGR1cmluZyBzZWFyY2hlcy4KKyAqLworc3RydWN0IGJ0cmZzX2xlYWYgeworCXN0cnVjdCBidHJmc19oZWFkZXIgaGVhZGVyOworCXN0cnVjdCBidHJmc19pdGVtIGl0ZW1zW107Cit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSk7CisKKy8qCisgKiBhbGwgbm9uLWxlYWYgYmxvY2tzIGFyZSBub2RlcywgdGhleSBob2xkIG9ubHkga2V5cyBhbmQgcG9pbnRlcnMgdG8KKyAqIG90aGVyIGJsb2NrcworICovCitzdHJ1Y3QgYnRyZnNfa2V5X3B0ciB7CisJc3RydWN0IGJ0cmZzX2Rpc2tfa2V5IGtleTsKKwlfX2xlNjQgYmxvY2twdHI7CisJX19sZTY0IGdlbmVyYXRpb247Cit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSk7CisKK3N0cnVjdCBidHJmc19ub2RlIHsKKwlzdHJ1Y3QgYnRyZnNfaGVhZGVyIGhlYWRlcjsKKwlzdHJ1Y3QgYnRyZnNfa2V5X3B0ciBwdHJzW107Cit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSk7CisKKy8qCisgKiBidHJmc19wYXRocyByZW1lbWJlciB0aGUgcGF0aCB0YWtlbiBmcm9tIHRoZSByb290IGRvd24gdG8gdGhlIGxlYWYuCisgKiBsZXZlbCAwIGlzIGFsd2F5cyB0aGUgbGVhZiwgYW5kIG5vZGVzWzEuLi5CVFJGU19NQVhfTEVWRUxdIHdpbGwgcG9pbnQKKyAqIHRvIGFueSBvdGhlciBsZXZlbHMgdGhhdCBhcmUgcHJlc2VudC4KKyAqCisgKiBUaGUgc2xvdHMgYXJyYXkgcmVjb3JkcyB0aGUgaW5kZXggb2YgdGhlIGl0ZW0gb3IgYmxvY2sgcG9pbnRlcgorICogdXNlZCB3aGlsZSB3YWxraW5nIHRoZSB0cmVlLgorICovCitzdHJ1Y3QgYnRyZnNfcGF0aCB7CisJc3RydWN0IGV4dGVudF9idWZmZXIgKm5vZGVzW0JUUkZTX01BWF9MRVZFTF07CisJaW50IHNsb3RzW0JUUkZTX01BWF9MRVZFTF07CisJLyogaWYgdGhlcmUgaXMgcmVhbCByYW5nZSBsb2NraW5nLCB0aGlzIGxvY2tzIGZpZWxkIHdpbGwgY2hhbmdlICovCisJaW50IGxvY2tzW0JUUkZTX01BWF9MRVZFTF07CisJaW50IHJlYWRhOworCS8qIGtlZXAgc29tZSB1cHBlciBsb2NrcyBhcyB3ZSB3YWxrIGRvd24gKi8KKwlpbnQga2VlcF9sb2NrczsKKwlpbnQgc2tpcF9sb2NraW5nOworCWludCBsb3dlc3RfbGV2ZWw7CisKKwkvKgorCSAqIHNldCBieSBidHJmc19zcGxpdF9pdGVtLCB0ZWxscyBzZWFyY2hfc2xvdCB0byBrZWVwIGFsbCBsb2NrcworCSAqIGFuZCB0byBmb3JjZSBjYWxscyB0byBrZWVwIHNwYWNlIGluIHRoZSBub2RlcworCSAqLworCWludCBzZWFyY2hfZm9yX3NwbGl0OworfTsKKworLyoKKyAqIGl0ZW1zIGluIHRoZSBleHRlbnQgYnRyZWUgYXJlIHVzZWQgdG8gcmVjb3JkIHRoZSBvYmplY3RpZCBvZiB0aGUKKyAqIG93bmVyIG9mIHRoZSBibG9jayBhbmQgdGhlIG51bWJlciBvZiByZWZlcmVuY2VzCisgKi8KK3N0cnVjdCBidHJmc19leHRlbnRfaXRlbSB7CisJX19sZTMyIHJlZnM7Cit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSk7CisKK3N0cnVjdCBidHJmc19leHRlbnRfcmVmIHsKKwlfX2xlNjQgcm9vdDsKKwlfX2xlNjQgZ2VuZXJhdGlvbjsKKwlfX2xlNjQgb2JqZWN0aWQ7CisJX19sZTMyIG51bV9yZWZzOworfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpOworCisvKiBkZXYgZXh0ZW50cyByZWNvcmQgZnJlZSBzcGFjZSBvbiBpbmRpdmlkdWFsIGRldmljZXMuICBUaGUgb3duZXIKKyAqIGZpZWxkIHBvaW50cyBiYWNrIHRvIHRoZSBjaHVuayBhbGxvY2F0aW9uIG1hcHBpbmcgdHJlZSB0aGF0IGFsbG9jYXRlZAorICogdGhlIGV4dGVudC4gIFRoZSBjaHVuayB0cmVlIHV1aWQgZmllbGQgaXMgYSB3YXkgdG8gZG91YmxlIGNoZWNrIHRoZSBvd25lcgorICovCitzdHJ1Y3QgYnRyZnNfZGV2X2V4dGVudCB7CisJX19sZTY0IGNodW5rX3RyZWU7CisJX19sZTY0IGNodW5rX29iamVjdGlkOworCV9fbGU2NCBjaHVua19vZmZzZXQ7CisJX19sZTY0IGxlbmd0aDsKKwl1OCBjaHVua190cmVlX3V1aWRbQlRSRlNfVVVJRF9TSVpFXTsKK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKTsKKworc3RydWN0IGJ0cmZzX2lub2RlX3JlZiB7CisJX19sZTY0IGluZGV4OworCV9fbGUxNiBuYW1lX2xlbjsKKwkvKiBuYW1lIGdvZXMgaGVyZSAqLworfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpOworCitzdHJ1Y3QgYnRyZnNfdGltZXNwZWMgeworCV9fbGU2NCBzZWM7CisJX19sZTMyIG5zZWM7Cit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSk7CisKK3R5cGVkZWYgZW51bSB7CisJQlRSRlNfQ09NUFJFU1NfTk9ORSA9IDAsCisJQlRSRlNfQ09NUFJFU1NfWkxJQiA9IDEsCisJQlRSRlNfQ09NUFJFU1NfTEFTVCA9IDIsCit9IGJ0cmZzX2NvbXByZXNzaW9uX3R5cGU7CisKKy8qIHdlIGRvbid0IHVuZGVyc3RhbmQgYW55IGVuY3J5cHRpb24gbWV0aG9kcyByaWdodCBub3cgKi8KK3R5cGVkZWYgZW51bSB7CisJQlRSRlNfRU5DUllQVElPTl9OT05FID0gMCwKKwlCVFJGU19FTkNSWVBUSU9OX0xBU1QgPSAxLAorfSBidHJmc19lbmNyeXB0aW9uX3R5cGU7CisKK3N0cnVjdCBidHJmc19pbm9kZV9pdGVtIHsKKwkvKiBuZnMgc3R5bGUgZ2VuZXJhdGlvbiBudW1iZXIgKi8KKwlfX2xlNjQgZ2VuZXJhdGlvbjsKKwkvKiB0cmFuc2lkIHRoYXQgbGFzdCB0b3VjaGVkIHRoaXMgaW5vZGUgKi8KKwlfX2xlNjQgdHJhbnNpZDsKKwlfX2xlNjQgc2l6ZTsKKwlfX2xlNjQgbmJ5dGVzOworCV9fbGU2NCBibG9ja19ncm91cDsKKwlfX2xlMzIgbmxpbms7CisJX19sZTMyIHVpZDsKKwlfX2xlMzIgZ2lkOworCV9fbGUzMiBtb2RlOworCV9fbGU2NCByZGV2OworCV9fbGU2NCBmbGFnczsKKworCS8qIG1vZGlmaWNhdGlvbiBzZXF1ZW5jZSBudW1iZXIgZm9yIE5GUyAqLworCV9fbGU2NCBzZXF1ZW5jZTsKKworCS8qCisJICogYSBsaXR0bGUgZnV0dXJlIGV4cGFuc2lvbiwgZm9yIG1vcmUgdGhhbiB0aGlzIHdlIGNhbgorCSAqIGp1c3QgZ3JvdyB0aGUgaW5vZGUgaXRlbSBhbmQgdmVyc2lvbiBpdAorCSAqLworCV9fbGU2NCByZXNlcnZlZFs0XTsKKwlzdHJ1Y3QgYnRyZnNfdGltZXNwZWMgYXRpbWU7CisJc3RydWN0IGJ0cmZzX3RpbWVzcGVjIGN0aW1lOworCXN0cnVjdCBidHJmc190aW1lc3BlYyBtdGltZTsKKwlzdHJ1Y3QgYnRyZnNfdGltZXNwZWMgb3RpbWU7Cit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSk7CisKK3N0cnVjdCBidHJmc19kaXJfbG9nX2l0ZW0geworCV9fbGU2NCBlbmQ7Cit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSk7CisKK3N0cnVjdCBidHJmc19kaXJfaXRlbSB7CisJc3RydWN0IGJ0cmZzX2Rpc2tfa2V5IGxvY2F0aW9uOworCV9fbGU2NCB0cmFuc2lkOworCV9fbGUxNiBkYXRhX2xlbjsKKwlfX2xlMTYgbmFtZV9sZW47CisJdTggdHlwZTsKK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKTsKKworc3RydWN0IGJ0cmZzX3Jvb3RfaXRlbSB7CisJc3RydWN0IGJ0cmZzX2lub2RlX2l0ZW0gaW5vZGU7CisJX19sZTY0IGdlbmVyYXRpb247CisJX19sZTY0IHJvb3RfZGlyaWQ7CisJX19sZTY0IGJ5dGVucjsKKwlfX2xlNjQgYnl0ZV9saW1pdDsKKwlfX2xlNjQgYnl0ZXNfdXNlZDsKKwlfX2xlNjQgbGFzdF9zbmFwc2hvdDsKKwlfX2xlNjQgZmxhZ3M7CisJX19sZTMyIHJlZnM7CisJc3RydWN0IGJ0cmZzX2Rpc2tfa2V5IGRyb3BfcHJvZ3Jlc3M7CisJdTggZHJvcF9sZXZlbDsKKwl1OCBsZXZlbDsKK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKTsKKworLyoKKyAqIHRoaXMgaXMgdXNlZCBmb3IgYm90aCBmb3J3YXJkIGFuZCBiYWNrd2FyZCByb290IHJlZnMKKyAqLworc3RydWN0IGJ0cmZzX3Jvb3RfcmVmIHsKKwlfX2xlNjQgZGlyaWQ7CisJX19sZTY0IHNlcXVlbmNlOworCV9fbGUxNiBuYW1lX2xlbjsKK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKTsKKworI2RlZmluZSBCVFJGU19GSUxFX0VYVEVOVF9JTkxJTkUgMAorI2RlZmluZSBCVFJGU19GSUxFX0VYVEVOVF9SRUcgMQorI2RlZmluZSBCVFJGU19GSUxFX0VYVEVOVF9QUkVBTExPQyAyCisKK3N0cnVjdCBidHJmc19maWxlX2V4dGVudF9pdGVtIHsKKwkvKgorCSAqIHRyYW5zYWN0aW9uIGlkIHRoYXQgY3JlYXRlZCB0aGlzIGV4dGVudAorCSAqLworCV9fbGU2NCBnZW5lcmF0aW9uOworCS8qCisJICogbWF4IG51bWJlciBvZiBieXRlcyB0byBob2xkIHRoaXMgZXh0ZW50IGluIHJhbQorCSAqIHdoZW4gd2Ugc3BsaXQgYSBjb21wcmVzc2VkIGV4dGVudCB3ZSBjYW4ndCBrbm93IGhvdyBiaWcKKwkgKiBlYWNoIG9mIHRoZSByZXN1bHRpbmcgcGllY2VzIHdpbGwgYmUuICBTbywgdGhpcyBpcworCSAqIGFuIHVwcGVyIGxpbWl0IG9uIHRoZSBzaXplIG9mIHRoZSBleHRlbnQgaW4gcmFtIGluc3RlYWQgb2YKKwkgKiBhbiBleGFjdCBsaW1pdC4KKwkgKi8KKwlfX2xlNjQgcmFtX2J5dGVzOworCisJLyoKKwkgKiAzMiBiaXRzIGZvciB0aGUgdmFyaW91cyB3YXlzIHdlIG1pZ2h0IGVuY29kZSB0aGUgZGF0YSwKKwkgKiBpbmNsdWRpbmcgY29tcHJlc3Npb24gYW5kIGVuY3J5cHRpb24uICBJZiBhbnkgb2YgdGhlc2UKKwkgKiBhcmUgc2V0IHRvIHNvbWV0aGluZyBhIGdpdmVuIGRpc2sgZm9ybWF0IGRvZXNuJ3QgdW5kZXJzdGFuZAorCSAqIGl0IGlzIHRyZWF0ZWQgbGlrZSBhbiBpbmNvbXBhdCBmbGFnIGZvciByZWFkaW5nIGFuZCB3cml0aW5nLAorCSAqIGJ1dCBub3QgZm9yIHN0YXQuCisJICovCisJdTggY29tcHJlc3Npb247CisJdTggZW5jcnlwdGlvbjsKKwlfX2xlMTYgb3RoZXJfZW5jb2Rpbmc7IC8qIHNwYXJlIGZvciBsYXRlciB1c2UgKi8KKworCS8qIGFyZSB3ZSBpbmxpbmUgZGF0YSBvciBhIHJlYWwgZXh0ZW50PyAqLworCXU4IHR5cGU7CisKKwkvKgorCSAqIGRpc2sgc3BhY2UgY29uc3VtZWQgYnkgdGhlIGV4dGVudCwgY2hlY2tzdW0gYmxvY2tzIGFyZSBpbmNsdWRlZAorCSAqIGluIHRoZXNlIG51bWJlcnMKKwkgKi8KKwlfX2xlNjQgZGlza19ieXRlbnI7CisJX19sZTY0IGRpc2tfbnVtX2J5dGVzOworCS8qCisJICogdGhlIGxvZ2ljYWwgb2Zmc2V0IGluIGZpbGUgYmxvY2tzIChubyBjc3VtcykKKwkgKiB0aGlzIGV4dGVudCByZWNvcmQgaXMgZm9yLiAgVGhpcyBhbGxvd3MgYSBmaWxlIGV4dGVudCB0byBwb2ludAorCSAqIGludG8gdGhlIG1pZGRsZSBvZiBhbiBleGlzdGluZyBleHRlbnQgb24gZGlzaywgc2hhcmluZyBpdAorCSAqIGJldHdlZW4gdHdvIHNuYXBzaG90cyAodXNlZnVsIGlmIHNvbWUgYnl0ZXMgaW4gdGhlIG1pZGRsZSBvZiB0aGUKKwkgKiBleHRlbnQgaGF2ZSBjaGFuZ2VkCisJICovCisJX19sZTY0IG9mZnNldDsKKwkvKgorCSAqIHRoZSBsb2dpY2FsIG51bWJlciBvZiBmaWxlIGJsb2NrcyAobm8gY3N1bXMgaW5jbHVkZWQpLiAgVGhpcworCSAqIGFsd2F5cyByZWZsZWN0cyB0aGUgc2l6ZSB1bmNvbXByZXNzZWQgYW5kIHdpdGhvdXQgZW5jb2RpbmcuCisJICovCisJX19sZTY0IG51bV9ieXRlczsKKworfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpOworCitzdHJ1Y3QgYnRyZnNfY3N1bV9pdGVtIHsKKwl1OCBjc3VtOworfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpOworCisvKiBkaWZmZXJlbnQgdHlwZXMgb2YgYmxvY2sgZ3JvdXBzIChhbmQgY2h1bmtzKSAqLworI2RlZmluZSBCVFJGU19CTE9DS19HUk9VUF9EQVRBICAgICAoMSA8PCAwKQorI2RlZmluZSBCVFJGU19CTE9DS19HUk9VUF9TWVNURU0gICAoMSA8PCAxKQorI2RlZmluZSBCVFJGU19CTE9DS19HUk9VUF9NRVRBREFUQSAoMSA8PCAyKQorI2RlZmluZSBCVFJGU19CTE9DS19HUk9VUF9SQUlEMCAgICAoMSA8PCAzKQorI2RlZmluZSBCVFJGU19CTE9DS19HUk9VUF9SQUlEMSAgICAoMSA8PCA0KQorI2RlZmluZSBCVFJGU19CTE9DS19HUk9VUF9EVVAJICAgKDEgPDwgNSkKKyNkZWZpbmUgQlRSRlNfQkxPQ0tfR1JPVVBfUkFJRDEwICAgKDEgPDwgNikKKworc3RydWN0IGJ0cmZzX2Jsb2NrX2dyb3VwX2l0ZW0geworCV9fbGU2NCB1c2VkOworCV9fbGU2NCBjaHVua19vYmplY3RpZDsKKwlfX2xlNjQgZmxhZ3M7Cit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSk7CisKK3N0cnVjdCBidHJmc19zcGFjZV9pbmZvIHsKKwl1NjQgZmxhZ3M7CisJdTY0IHRvdGFsX2J5dGVzOworCXU2NCBieXRlc191c2VkOworCXU2NCBieXRlc19waW5uZWQ7CisJdTY0IGJ5dGVzX3Jlc2VydmVkOworCXU2NCBieXRlc19yZWFkb25seTsKKwlpbnQgZnVsbDsKKwlpbnQgZm9yY2VfYWxsb2M7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCisJLyogZm9yIGJsb2NrIGdyb3VwcyBpbiBvdXIgc2FtZSB0eXBlICovCisJc3RydWN0IGxpc3RfaGVhZCBibG9ja19ncm91cHM7CisJc3BpbmxvY2tfdCBsb2NrOworCXN0cnVjdCByd19zZW1hcGhvcmUgZ3JvdXBzX3NlbTsKK307CisKK3N0cnVjdCBidHJmc19mcmVlX3NwYWNlIHsKKwlzdHJ1Y3QgcmJfbm9kZSBieXRlc19pbmRleDsKKwlzdHJ1Y3QgcmJfbm9kZSBvZmZzZXRfaW5kZXg7CisJdTY0IG9mZnNldDsKKwl1NjQgYnl0ZXM7Cit9OworCitzdHJ1Y3QgYnRyZnNfYmxvY2tfZ3JvdXBfY2FjaGUgeworCXN0cnVjdCBidHJmc19rZXkga2V5OworCXN0cnVjdCBidHJmc19ibG9ja19ncm91cF9pdGVtIGl0ZW07CisJc3BpbmxvY2tfdCBsb2NrOworCXN0cnVjdCBtdXRleCBhbGxvY19tdXRleDsKKwlzdHJ1Y3QgbXV0ZXggY2FjaGVfbXV0ZXg7CisJdTY0IHBpbm5lZDsKKwl1NjQgcmVzZXJ2ZWQ7CisJdTY0IGZsYWdzOworCWludCBjYWNoZWQ7CisJaW50IHJvOworCWludCBkaXJ0eTsKKworCXN0cnVjdCBidHJmc19zcGFjZV9pbmZvICpzcGFjZV9pbmZvOworCisJLyogZnJlZSBzcGFjZSBjYWNoZSBzdHVmZiAqLworCXN0cnVjdCByYl9yb290IGZyZWVfc3BhY2VfYnl0ZXM7CisJc3RydWN0IHJiX3Jvb3QgZnJlZV9zcGFjZV9vZmZzZXQ7CisKKwkvKiBibG9jayBncm91cCBjYWNoZSBzdHVmZiAqLworCXN0cnVjdCByYl9ub2RlIGNhY2hlX25vZGU7CisKKwkvKiBmb3IgYmxvY2sgZ3JvdXBzIGluIHRoZSBzYW1lIHJhaWQgdHlwZSAqLworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKworCS8qIHVzYWdlIGNvdW50ICovCisJYXRvbWljX3QgY291bnQ7Cit9OworCitzdHJ1Y3QgYnRyZnNfbGVhZl9yZWZfdHJlZSB7CisJc3RydWN0IHJiX3Jvb3Qgcm9vdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJc3BpbmxvY2tfdCBsb2NrOworfTsKKworc3RydWN0IGJ0cmZzX2RldmljZTsKK3N0cnVjdCBidHJmc19mc19kZXZpY2VzOworc3RydWN0IGJ0cmZzX2ZzX2luZm8geworCXU4IGZzaWRbQlRSRlNfRlNJRF9TSVpFXTsKKwl1OCBjaHVua190cmVlX3V1aWRbQlRSRlNfVVVJRF9TSVpFXTsKKwlzdHJ1Y3QgYnRyZnNfcm9vdCAqZXh0ZW50X3Jvb3Q7CisJc3RydWN0IGJ0cmZzX3Jvb3QgKnRyZWVfcm9vdDsKKwlzdHJ1Y3QgYnRyZnNfcm9vdCAqY2h1bmtfcm9vdDsKKwlzdHJ1Y3QgYnRyZnNfcm9vdCAqZGV2X3Jvb3Q7CisJc3RydWN0IGJ0cmZzX3Jvb3QgKmZzX3Jvb3Q7CisJc3RydWN0IGJ0cmZzX3Jvb3QgKmNzdW1fcm9vdDsKKworCS8qIHRoZSBsb2cgcm9vdCB0cmVlIGlzIGEgZGlyZWN0b3J5IG9mIGFsbCB0aGUgb3RoZXIgbG9nIHJvb3RzICovCisJc3RydWN0IGJ0cmZzX3Jvb3QgKmxvZ19yb290X3RyZWU7CisJc3RydWN0IHJhZGl4X3RyZWVfcm9vdCBmc19yb290c19yYWRpeDsKKworCS8qIGJsb2NrIGdyb3VwIGNhY2hlIHN0dWZmICovCisJc3BpbmxvY2tfdCBibG9ja19ncm91cF9jYWNoZV9sb2NrOworCXN0cnVjdCByYl9yb290IGJsb2NrX2dyb3VwX2NhY2hlX3RyZWU7CisKKwlzdHJ1Y3QgZXh0ZW50X2lvX3RyZWUgcGlubmVkX2V4dGVudHM7CisJc3RydWN0IGV4dGVudF9pb190cmVlIHBlbmRpbmdfZGVsOworCXN0cnVjdCBleHRlbnRfaW9fdHJlZSBleHRlbnRfaW5zOworCisJLyogbG9naWNhbC0+cGh5c2ljYWwgZXh0ZW50IG1hcHBpbmcgKi8KKwlzdHJ1Y3QgYnRyZnNfbWFwcGluZ190cmVlIG1hcHBpbmdfdHJlZTsKKworCXU2NCBnZW5lcmF0aW9uOworCXU2NCBsYXN0X3RyYW5zX2NvbW1pdHRlZDsKKwl1NjQgbGFzdF90cmFuc19uZXdfYmxvY2tncm91cDsKKwl1NjQgb3Blbl9pb2N0bF90cmFuczsKKwl1bnNpZ25lZCBsb25nIG1vdW50X29wdDsKKwl1NjQgbWF4X2V4dGVudDsKKwl1NjQgbWF4X2lubGluZTsKKwl1NjQgYWxsb2Nfc3RhcnQ7CisJc3RydWN0IGJ0cmZzX3RyYW5zYWN0aW9uICpydW5uaW5nX3RyYW5zYWN0aW9uOworCXdhaXRfcXVldWVfaGVhZF90IHRyYW5zYWN0aW9uX3Rocm90dGxlOworCXdhaXRfcXVldWVfaGVhZF90IHRyYW5zYWN0aW9uX3dhaXQ7CisKKwl3YWl0X3F1ZXVlX2hlYWRfdCBhc3luY19zdWJtaXRfd2FpdDsKKwl3YWl0X3F1ZXVlX2hlYWRfdCB0cmVlX2xvZ193YWl0OworCisJc3RydWN0IGJ0cmZzX3N1cGVyX2Jsb2NrIHN1cGVyX2NvcHk7CisJc3RydWN0IGJ0cmZzX3N1cGVyX2Jsb2NrIHN1cGVyX2Zvcl9jb21taXQ7CisJc3RydWN0IGJsb2NrX2RldmljZSAqX19iZGV2OworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2I7CisJc3RydWN0IGlub2RlICpidHJlZV9pbm9kZTsKKwlzdHJ1Y3QgYmFja2luZ19kZXZfaW5mbyBiZGk7CisJc3BpbmxvY2tfdCBoYXNoX2xvY2s7CisJc3RydWN0IG11dGV4IHRyYW5zX211dGV4OworCXN0cnVjdCBtdXRleCB0cmVlX2xvZ19tdXRleDsKKwlzdHJ1Y3QgbXV0ZXggdHJhbnNhY3Rpb25fa3RocmVhZF9tdXRleDsKKwlzdHJ1Y3QgbXV0ZXggY2xlYW5lcl9tdXRleDsKKwlzdHJ1Y3QgbXV0ZXggZXh0ZW50X2luc19tdXRleDsKKwlzdHJ1Y3QgbXV0ZXggcGlubmVkX211dGV4OworCXN0cnVjdCBtdXRleCBjaHVua19tdXRleDsKKwlzdHJ1Y3QgbXV0ZXggZHJvcF9tdXRleDsKKwlzdHJ1Y3QgbXV0ZXggdm9sdW1lX211dGV4OworCXN0cnVjdCBtdXRleCB0cmVlX3JlbG9jX211dGV4OworCXN0cnVjdCBsaXN0X2hlYWQgdHJhbnNfbGlzdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGhhc2hlcnM7CisJc3RydWN0IGxpc3RfaGVhZCBkZWFkX3Jvb3RzOworCisJYXRvbWljX3QgbnJfYXN5bmNfc3VibWl0czsKKwlhdG9taWNfdCBhc3luY19zdWJtaXRfZHJhaW5pbmc7CisJYXRvbWljX3QgbnJfYXN5bmNfYmlvczsKKwlhdG9taWNfdCBhc3luY19kZWxhbGxvY19wYWdlczsKKwlhdG9taWNfdCB0cmVlX2xvZ193cml0ZXJzOworCWF0b21pY190IHRyZWVfbG9nX2NvbW1pdDsKKwl1bnNpZ25lZCBsb25nIHRyZWVfbG9nX2JhdGNoOworCXU2NCB0cmVlX2xvZ190cmFuc2lkOworCisJLyoKKwkgKiB0aGlzIGlzIHVzZWQgYnkgdGhlIGJhbGFuY2luZyBjb2RlIHRvIHdhaXQgZm9yIGFsbCB0aGUgcGVuZGluZworCSAqIG9yZGVyZWQgZXh0ZW50cworCSAqLworCXNwaW5sb2NrX3Qgb3JkZXJlZF9leHRlbnRfbG9jazsKKwlzdHJ1Y3QgbGlzdF9oZWFkIG9yZGVyZWRfZXh0ZW50czsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGRlbGFsbG9jX2lub2RlczsKKworCS8qCisJICogdGhlcmUgaXMgYSBwb29sIG9mIHdvcmtlciB0aHJlYWRzIGZvciBjaGVja3N1bW1pbmcgZHVyaW5nIHdyaXRlcworCSAqIGFuZCBhIHBvb2wgZm9yIGNoZWNrc3VtbWluZyBhZnRlciByZWFkcy4gIFRoaXMgaXMgYmVjYXVzZSByZWFkZXJzCisJICogY2FuIHJ1biB3aXRoIEZTIGxvY2tzIGhlbGQsIGFuZCB0aGUgd3JpdGVycyBtYXkgYmUgd2FpdGluZyBmb3IKKwkgKiB0aG9zZSBsb2Nrcy4gIFdlIGRvbid0IHdhbnQgb3JkZXJpbmcgaW4gdGhlIHBlbmRpbmcgbGlzdCB0byBjYXVzZQorCSAqIGRlYWRsb2NrcywgYW5kIHNvIHRoZSB0d28gYXJlIHNlcnZpY2VkIHNlcGFyYXRlbHkuCisJICoKKwkgKiBBIHRoaXJkIHBvb2wgZG9lcyBzdWJtaXRfYmlvIHRvIGF2b2lkIGRlYWRsb2NraW5nIHdpdGggdGhlIG90aGVyCisJICogdHdvCisJICovCisJc3RydWN0IGJ0cmZzX3dvcmtlcnMgd29ya2VyczsKKwlzdHJ1Y3QgYnRyZnNfd29ya2VycyBkZWxhbGxvY193b3JrZXJzOworCXN0cnVjdCBidHJmc193b3JrZXJzIGVuZGlvX3dvcmtlcnM7CisJc3RydWN0IGJ0cmZzX3dvcmtlcnMgZW5kaW9fbWV0YV93b3JrZXJzOworCXN0cnVjdCBidHJmc193b3JrZXJzIGVuZGlvX21ldGFfd3JpdGVfd29ya2VyczsKKwlzdHJ1Y3QgYnRyZnNfd29ya2VycyBlbmRpb193cml0ZV93b3JrZXJzOworCXN0cnVjdCBidHJmc193b3JrZXJzIHN1Ym1pdF93b3JrZXJzOworCS8qCisJICogZml4dXAgd29ya2VycyB0YWtlIGRpcnR5IHBhZ2VzIHRoYXQgZGlkbid0IHByb3Blcmx5IGdvIHRocm91Z2gKKwkgKiB0aGUgY293IG1lY2hhbmlzbSBhbmQgbWFrZSB0aGVtIHNhZmUgdG8gd3JpdGUuICBJdCBoYXBwZW5zCisJICogZm9yIHRoZSBzeXNfbXVubWFwIGZ1bmN0aW9uIGNhbGwgcGF0aAorCSAqLworCXN0cnVjdCBidHJmc193b3JrZXJzIGZpeHVwX3dvcmtlcnM7CisJc3RydWN0IHRhc2tfc3RydWN0ICp0cmFuc2FjdGlvbl9rdGhyZWFkOworCXN0cnVjdCB0YXNrX3N0cnVjdCAqY2xlYW5lcl9rdGhyZWFkOworCWludCB0aHJlYWRfcG9vbF9zaXplOworCisJLyogdHJlZSByZWxvY2F0aW9uIHJlbG9jYXRlZCBmaWVsZHMgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIGRlYWRfcmVsb2Nfcm9vdHM7CisJc3RydWN0IGJ0cmZzX2xlYWZfcmVmX3RyZWUgcmVsb2NfcmVmX3RyZWU7CisJc3RydWN0IGJ0cmZzX2xlYWZfcmVmX3RyZWUgc2hhcmVkX3JlZl90cmVlOworCisJc3RydWN0IGtvYmplY3Qgc3VwZXJfa29iajsKKwlzdHJ1Y3QgY29tcGxldGlvbiBrb2JqX3VucmVnaXN0ZXI7CisJaW50IGRvX2JhcnJpZXJzOworCWludCBjbG9zaW5nOworCWludCBsb2dfcm9vdF9yZWNvdmVyaW5nOworCWF0b21pY190IHRocm90dGxlczsKKwlhdG9taWNfdCB0aHJvdHRsZV9nZW47CisKKwl1NjQgdG90YWxfcGlubmVkOworCXN0cnVjdCBsaXN0X2hlYWQgZGlydHlfY293b25seV9yb290czsKKworCXN0cnVjdCBidHJmc19mc19kZXZpY2VzICpmc19kZXZpY2VzOworCXN0cnVjdCBsaXN0X2hlYWQgc3BhY2VfaW5mbzsKKwlzcGlubG9ja190IGRlbGFsbG9jX2xvY2s7CisJc3BpbmxvY2tfdCBuZXdfdHJhbnNfbG9jazsKKwl1NjQgZGVsYWxsb2NfYnl0ZXM7CisJdTY0IGxhc3RfYWxsb2M7CisJdTY0IGxhc3RfZGF0YV9hbGxvYzsKKworCXNwaW5sb2NrX3QgcmVmX2NhY2hlX2xvY2s7CisJdTY0IHRvdGFsX3JlZl9jYWNoZV9zaXplOworCisJdTY0IGF2YWlsX2RhdGFfYWxsb2NfYml0czsKKwl1NjQgYXZhaWxfbWV0YWRhdGFfYWxsb2NfYml0czsKKwl1NjQgYXZhaWxfc3lzdGVtX2FsbG9jX2JpdHM7CisJdTY0IGRhdGFfYWxsb2NfcHJvZmlsZTsKKwl1NjQgbWV0YWRhdGFfYWxsb2NfcHJvZmlsZTsKKwl1NjQgc3lzdGVtX2FsbG9jX3Byb2ZpbGU7CisKKwl2b2lkICpiZGV2X2hvbGRlcjsKK307CisKKy8qCisgKiBpbiByYW0gcmVwcmVzZW50YXRpb24gb2YgdGhlIHRyZWUuICBleHRlbnRfcm9vdCBpcyB1c2VkIGZvciBhbGwgYWxsb2NhdGlvbnMKKyAqIGFuZCBmb3IgdGhlIGV4dGVudCB0cmVlIGV4dGVudF9yb290IHJvb3QuCisgKi8KK3N0cnVjdCBidHJmc19kaXJ0eV9yb290Oworc3RydWN0IGJ0cmZzX3Jvb3QgeworCXN0cnVjdCBleHRlbnRfYnVmZmVyICpub2RlOworCisJLyogdGhlIG5vZGUgbG9jayBpcyBoZWxkIHdoaWxlIGNoYW5naW5nIHRoZSBub2RlIHBvaW50ZXIgKi8KKwlzcGlubG9ja190IG5vZGVfbG9jazsKKworCXN0cnVjdCBleHRlbnRfYnVmZmVyICpjb21taXRfcm9vdDsKKwlzdHJ1Y3QgYnRyZnNfbGVhZl9yZWZfdHJlZSAqcmVmX3RyZWU7CisJc3RydWN0IGJ0cmZzX2xlYWZfcmVmX3RyZWUgcmVmX3RyZWVfc3RydWN0OworCXN0cnVjdCBidHJmc19kaXJ0eV9yb290ICpkaXJ0eV9yb290OworCXN0cnVjdCBidHJmc19yb290ICpsb2dfcm9vdDsKKwlzdHJ1Y3QgYnRyZnNfcm9vdCAqcmVsb2Nfcm9vdDsKKworCXN0cnVjdCBidHJmc19yb290X2l0ZW0gcm9vdF9pdGVtOworCXN0cnVjdCBidHJmc19rZXkgcm9vdF9rZXk7CisJc3RydWN0IGJ0cmZzX2ZzX2luZm8gKmZzX2luZm87CisJc3RydWN0IGV4dGVudF9pb190cmVlIGRpcnR5X2xvZ19wYWdlczsKKworCXN0cnVjdCBrb2JqZWN0IHJvb3Rfa29iajsKKwlzdHJ1Y3QgY29tcGxldGlvbiBrb2JqX3VucmVnaXN0ZXI7CisJc3RydWN0IG11dGV4IG9iamVjdGlkX211dGV4OworCXN0cnVjdCBtdXRleCBsb2dfbXV0ZXg7CisKKwl1NjQgb2JqZWN0aWQ7CisJdTY0IGxhc3RfdHJhbnM7CisKKwkvKiBkYXRhIGFsbG9jYXRpb25zIGFyZSBkb25lIGluIHNlY3RvcnNpemUgdW5pdHMgKi8KKwl1MzIgc2VjdG9yc2l6ZTsKKworCS8qIG5vZGUgYWxsb2NhdGlvbnMgYXJlIGRvbmUgaW4gbm9kZXNpemUgdW5pdHMgKi8KKwl1MzIgbm9kZXNpemU7CisKKwkvKiBsZWFmIGFsbG9jYXRpb25zIGFyZSBkb25lIGluIGxlYWZzaXplIHVuaXRzICovCisJdTMyIGxlYWZzaXplOworCisJdTMyIHN0cmlwZXNpemU7CisKKwl1MzIgdHlwZTsKKwl1NjQgaGlnaGVzdF9pbm9kZTsKKwl1NjQgbGFzdF9pbm9kZV9hbGxvYzsKKwlpbnQgcmVmX2Nvd3M7CisJaW50IHRyYWNrX2RpcnR5OworCXU2NCBkZWZyYWdfdHJhbnNfc3RhcnQ7CisJc3RydWN0IGJ0cmZzX2tleSBkZWZyYWdfcHJvZ3Jlc3M7CisJc3RydWN0IGJ0cmZzX2tleSBkZWZyYWdfbWF4OworCWludCBkZWZyYWdfcnVubmluZzsKKwlpbnQgZGVmcmFnX2xldmVsOworCWNoYXIgKm5hbWU7CisJaW50IGluX3N5c2ZzOworCisJLyogdGhlIGRpcnR5IGxpc3QgaXMgb25seSB1c2VkIGJ5IG5vbi1yZWZlcmVuY2UgY291bnRlZCByb290cyAqLworCXN0cnVjdCBsaXN0X2hlYWQgZGlydHlfbGlzdDsKKworCXNwaW5sb2NrX3QgbGlzdF9sb2NrOworCXN0cnVjdCBsaXN0X2hlYWQgZGVhZF9saXN0OworCXN0cnVjdCBsaXN0X2hlYWQgb3JwaGFuX2xpc3Q7CisKKwkvKgorCSAqIHJpZ2h0IG5vdyB0aGlzIGp1c3QgZ2V0cyB1c2VkIHNvIHRoYXQgYSByb290IGhhcyBpdHMgb3duIGRldmlkCisJICogZm9yIHN0YXQuICBJdCBtYXkgYmUgdXNlZCBmb3IgbW9yZSBsYXRlcgorCSAqLworCXN0cnVjdCBzdXBlcl9ibG9jayBhbm9uX3N1cGVyOworfTsKKworLyoKKworICogaW5vZGUgaXRlbXMgaGF2ZSB0aGUgZGF0YSB0eXBpY2FsbHkgcmV0dXJuZWQgZnJvbSBzdGF0IGFuZCBzdG9yZSBvdGhlcgorICogaW5mbyBhYm91dCBvYmplY3QgY2hhcmFjdGVyaXN0aWNzLiAgVGhlcmUgaXMgb25lIGZvciBldmVyeSBmaWxlIGFuZCBkaXIgaW4KKyAqIHRoZSBGUworICovCisjZGVmaW5lIEJUUkZTX0lOT0RFX0lURU1fS0VZCQkxCisjZGVmaW5lIEJUUkZTX0lOT0RFX1JFRl9LRVkJCTEyCisjZGVmaW5lIEJUUkZTX1hBVFRSX0lURU1fS0VZCQkyNAorI2RlZmluZSBCVFJGU19PUlBIQU5fSVRFTV9LRVkJCTQ4CisvKiByZXNlcnZlIDItMTUgY2xvc2UgdG8gdGhlIGlub2RlIGZvciBsYXRlciBmbGV4aWJpbGl0eSAqLworCisvKgorICogZGlyIGl0ZW1zIGFyZSB0aGUgbmFtZSAtPiBpbm9kZSBwb2ludGVycyBpbiBhIGRpcmVjdG9yeS4gIFRoZXJlIGlzIG9uZQorICogZm9yIGV2ZXJ5IG5hbWUgaW4gYSBkaXJlY3RvcnkuCisgKi8KKyNkZWZpbmUgQlRSRlNfRElSX0xPR19JVEVNX0tFWSAgNjAKKyNkZWZpbmUgQlRSRlNfRElSX0xPR19JTkRFWF9LRVkgNzIKKyNkZWZpbmUgQlRSRlNfRElSX0lURU1fS0VZCTg0CisjZGVmaW5lIEJUUkZTX0RJUl9JTkRFWF9LRVkJOTYKKy8qCisgKiBleHRlbnQgZGF0YSBpcyBmb3IgZmlsZSBkYXRhCisgKi8KKyNkZWZpbmUgQlRSRlNfRVhURU5UX0RBVEFfS0VZCTEwOAorCisvKgorICogZXh0ZW50IGNzdW1zIGFyZSBzdG9yZWQgaW4gYSBzZXBhcmF0ZSB0cmVlIGFuZCBob2xkIGNzdW1zIGZvcgorICogYW4gZW50aXJlIGV4dGVudCBvbiBkaXNrLgorICovCisjZGVmaW5lIEJUUkZTX0VYVEVOVF9DU1VNX0tFWQkxMjgKKworLyoKKyAqIHJvb3QgaXRlbXMgcG9pbnQgdG8gdHJlZSByb290cy4gIFRoZXJlIGFyZSB0eXBpY2FsbHkgaW4gdGhlIHJvb3QKKyAqIHRyZWUgdXNlZCBieSB0aGUgc3VwZXIgYmxvY2sgdG8gZmluZCBhbGwgdGhlIG90aGVyIHRyZWVzCisgKi8KKyNkZWZpbmUgQlRSRlNfUk9PVF9JVEVNX0tFWQkxMzIKKworLyoKKyAqIHJvb3QgYmFja3JlZnMgdGllIHN1YnZvbHMgYW5kIHNuYXBzaG90cyB0byB0aGUgZGlyZWN0b3J5IGVudHJpZXMgdGhhdAorICogcmVmZXJlbmNlIHRoZW0KKyAqLworI2RlZmluZSBCVFJGU19ST09UX0JBQ0tSRUZfS0VZCTE0NAorCisvKgorICogcm9vdCByZWZzIG1ha2UgYSBmYXN0IGluZGV4IGZvciBsaXN0aW5nIGFsbCBvZiB0aGUgc25hcHNob3RzIGFuZAorICogc3Vidm9sdW1lcyByZWZlcmVuY2VkIGJ5IGEgZ2l2ZW4gcm9vdC4gIFRoZXkgcG9pbnQgZGlyZWN0bHkgdG8gdGhlCisgKiBkaXJlY3RvcnkgaXRlbSBpbiB0aGUgcm9vdCB0aGF0IHJlZmVyZW5jZXMgdGhlIHN1YnZvbAorICovCisjZGVmaW5lIEJUUkZTX1JPT1RfUkVGX0tFWQkxNTYKKworLyoKKyAqIGV4dGVudCBpdGVtcyBhcmUgaW4gdGhlIGV4dGVudCBtYXAgdHJlZS4gIFRoZXNlIHJlY29yZCB3aGljaCBibG9ja3MKKyAqIGFyZSB1c2VkLCBhbmQgaG93IG1hbnkgcmVmZXJlbmNlcyB0aGVyZSBhcmUgdG8gZWFjaCBibG9jaworICovCisjZGVmaW5lIEJUUkZTX0VYVEVOVF9JVEVNX0tFWQkxNjgKKyNkZWZpbmUgQlRSRlNfRVhURU5UX1JFRl9LRVkJMTgwCisKKy8qCisgKiBibG9jayBncm91cHMgZ2l2ZSB1cyBoaW50cyBpbnRvIHRoZSBleHRlbnQgYWxsb2NhdGlvbiB0cmVlcy4gIFdoaWNoCisgKiBibG9ja3MgYXJlIGZyZWUgZXRjIGV0YworICovCisjZGVmaW5lIEJUUkZTX0JMT0NLX0dST1VQX0lURU1fS0VZIDE5MgorCisjZGVmaW5lIEJUUkZTX0RFVl9FWFRFTlRfS0VZCTIwNAorI2RlZmluZSBCVFJGU19ERVZfSVRFTV9LRVkJMjE2CisjZGVmaW5lIEJUUkZTX0NIVU5LX0lURU1fS0VZCTIyOAorCisvKgorICogc3RyaW5nIGl0ZW1zIGFyZSBmb3IgZGVidWdnaW5nLiAgVGhleSBqdXN0IHN0b3JlIGEgc2hvcnQgc3RyaW5nIG9mCisgKiBkYXRhIGluIHRoZSBGUworICovCisjZGVmaW5lIEJUUkZTX1NUUklOR19JVEVNX0tFWQkyNTMKKworI2RlZmluZSBCVFJGU19NT1VOVF9OT0RBVEFTVU0JCSgxIDw8IDApCisjZGVmaW5lIEJUUkZTX01PVU5UX05PREFUQUNPVwkJKDEgPDwgMSkKKyNkZWZpbmUgQlRSRlNfTU9VTlRfTk9CQVJSSUVSCQkoMSA8PCAyKQorI2RlZmluZSBCVFJGU19NT1VOVF9TU0QJCQkoMSA8PCAzKQorI2RlZmluZSBCVFJGU19NT1VOVF9ERUdSQURFRAkJKDEgPDwgNCkKKyNkZWZpbmUgQlRSRlNfTU9VTlRfQ09NUFJFU1MJCSgxIDw8IDUpCisKKyNkZWZpbmUgYnRyZnNfY2xlYXJfb3B0KG8sIG9wdCkJCSgobykgJj0gfkJUUkZTX01PVU5UXyMjb3B0KQorI2RlZmluZSBidHJmc19zZXRfb3B0KG8sIG9wdCkJCSgobykgfD0gQlRSRlNfTU9VTlRfIyNvcHQpCisjZGVmaW5lIGJ0cmZzX3Rlc3Rfb3B0KHJvb3QsIG9wdCkJKChyb290KS0+ZnNfaW5mby0+bW91bnRfb3B0ICYgXAorCQkJCQkgQlRSRlNfTU9VTlRfIyNvcHQpCisvKgorICogSW5vZGUgZmxhZ3MKKyAqLworI2RlZmluZSBCVFJGU19JTk9ERV9OT0RBVEFTVU0JCSgxIDw8IDApCisjZGVmaW5lIEJUUkZTX0lOT0RFX05PREFUQUNPVwkJKDEgPDwgMSkKKyNkZWZpbmUgQlRSRlNfSU5PREVfUkVBRE9OTFkJCSgxIDw8IDIpCisjZGVmaW5lIEJUUkZTX0lOT0RFX05PQ09NUFJFU1MJCSgxIDw8IDMpCisjZGVmaW5lIEJUUkZTX0lOT0RFX1BSRUFMTE9DCQkoMSA8PCA0KQorI2RlZmluZSBidHJmc19jbGVhcl9mbGFnKGlub2RlLCBmbGFnKQkoQlRSRlNfSShpbm9kZSktPmZsYWdzICY9IFwKKwkJCQkJIH5CVFJGU19JTk9ERV8jI2ZsYWcpCisjZGVmaW5lIGJ0cmZzX3NldF9mbGFnKGlub2RlLCBmbGFnKQkoQlRSRlNfSShpbm9kZSktPmZsYWdzIHw9IFwKKwkJCQkJIEJUUkZTX0lOT0RFXyMjZmxhZykKKyNkZWZpbmUgYnRyZnNfdGVzdF9mbGFnKGlub2RlLCBmbGFnKQkoQlRSRlNfSShpbm9kZSktPmZsYWdzICYgXAorCQkJCQkgQlRSRlNfSU5PREVfIyNmbGFnKQorLyogc29tZSBtYWNyb3MgdG8gZ2VuZXJhdGUgc2V0L2dldCBmdW5jcyBmb3IgdGhlIHN0cnVjdCBmaWVsZHMuICBUaGlzCisgKiBhc3N1bWVzIHRoZXJlIGlzIGEgbGVmb29fdG9fY3B1IGZvciBldmVyeSB0eXBlLCBzbyBsZXRzIG1ha2UgYSBzaW1wbGUKKyAqIG9uZSBmb3IgdTg6CisgKi8KKyNkZWZpbmUgbGU4X3RvX2NwdSh2KSAodikKKyNkZWZpbmUgY3B1X3RvX2xlOCh2KSAodikKKyNkZWZpbmUgX19sZTggdTgKKworI2RlZmluZSByZWFkX2ViX21lbWJlcihlYiwgcHRyLCB0eXBlLCBtZW1iZXIsIHJlc3VsdCkgKAkJCVwKKwlyZWFkX2V4dGVudF9idWZmZXIoZWIsIChjaGFyICopKHJlc3VsdCksCQkJXAorCQkJICAgKCh1bnNpZ25lZCBsb25nKShwdHIpKSArCQkJXAorCQkJICAgIG9mZnNldG9mKHR5cGUsIG1lbWJlciksCQkJXAorCQkJICAgc2l6ZW9mKCgodHlwZSAqKTApLT5tZW1iZXIpKSkKKworI2RlZmluZSB3cml0ZV9lYl9tZW1iZXIoZWIsIHB0ciwgdHlwZSwgbWVtYmVyLCByZXN1bHQpICgJCVwKKwl3cml0ZV9leHRlbnRfYnVmZmVyKGViLCAoY2hhciAqKShyZXN1bHQpLAkJCVwKKwkJCSAgICgodW5zaWduZWQgbG9uZykocHRyKSkgKwkJCVwKKwkJCSAgICBvZmZzZXRvZih0eXBlLCBtZW1iZXIpLAkJCVwKKwkJCSAgIHNpemVvZigoKHR5cGUgKikwKS0+bWVtYmVyKSkpCisKKyNpZm5kZWYgQlRSRlNfU0VUR0VUX0ZVTkNTCisjZGVmaW5lIEJUUkZTX1NFVEdFVF9GVU5DUyhuYW1lLCB0eXBlLCBtZW1iZXIsIGJpdHMpCQkJXAordSMjYml0cyBidHJmc18jI25hbWUoc3RydWN0IGV4dGVudF9idWZmZXIgKmViLCB0eXBlICpzKTsJCVwKK3ZvaWQgYnRyZnNfc2V0XyMjbmFtZShzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqZWIsIHR5cGUgKnMsIHUjI2JpdHMgdmFsKTsKKyNlbmRpZgorCisjZGVmaW5lIEJUUkZTX1NFVEdFVF9IRUFERVJfRlVOQ1MobmFtZSwgdHlwZSwgbWVtYmVyLCBiaXRzKQkJXAorc3RhdGljIGlubGluZSB1IyNiaXRzIGJ0cmZzXyMjbmFtZShzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqZWIpCQlcCit7CQkJCQkJCQkJXAorCXR5cGUgKnAgPSBrbWFwX2F0b21pYyhlYi0+Zmlyc3RfcGFnZSwgS01fVVNFUjApOwkJXAorCXUjI2JpdHMgcmVzID0gbGUjI2JpdHMjI190b19jcHUocC0+bWVtYmVyKTsJCQlcCisJa3VubWFwX2F0b21pYyhwLCBLTV9VU0VSMCk7CQkJCQlcCisJcmV0dXJuIHJlczsJCQkJCQkJXAorfQkJCQkJCQkJCVwKK3N0YXRpYyBpbmxpbmUgdm9pZCBidHJmc19zZXRfIyNuYW1lKHN0cnVjdCBleHRlbnRfYnVmZmVyICplYiwJCVwKKwkJCQkgICAgdSMjYml0cyB2YWwpCQkJXAorewkJCQkJCQkJCVwKKwl0eXBlICpwID0ga21hcF9hdG9taWMoZWItPmZpcnN0X3BhZ2UsIEtNX1VTRVIwKTsJCVwKKwlwLT5tZW1iZXIgPSBjcHVfdG9fbGUjI2JpdHModmFsKTsJCQkJXAorCWt1bm1hcF9hdG9taWMocCwgS01fVVNFUjApOwkJCQkJXAorfQorCisjZGVmaW5lIEJUUkZTX1NFVEdFVF9TVEFDS19GVU5DUyhuYW1lLCB0eXBlLCBtZW1iZXIsIGJpdHMpCQlcCitzdGF0aWMgaW5saW5lIHUjI2JpdHMgYnRyZnNfIyNuYW1lKHR5cGUgKnMpCQkJCVwKK3sJCQkJCQkJCQlcCisJcmV0dXJuIGxlIyNiaXRzIyNfdG9fY3B1KHMtPm1lbWJlcik7CQkJCVwKK30JCQkJCQkJCQlcCitzdGF0aWMgaW5saW5lIHZvaWQgYnRyZnNfc2V0XyMjbmFtZSh0eXBlICpzLCB1IyNiaXRzIHZhbCkJCVwKK3sJCQkJCQkJCQlcCisJcy0+bWVtYmVyID0gY3B1X3RvX2xlIyNiaXRzKHZhbCk7CQkJCVwKK30KKworQlRSRlNfU0VUR0VUX0ZVTkNTKGRldmljZV90eXBlLCBzdHJ1Y3QgYnRyZnNfZGV2X2l0ZW0sIHR5cGUsIDY0KTsKK0JUUkZTX1NFVEdFVF9GVU5DUyhkZXZpY2VfdG90YWxfYnl0ZXMsIHN0cnVjdCBidHJmc19kZXZfaXRlbSwgdG90YWxfYnl0ZXMsIDY0KTsKK0JUUkZTX1NFVEdFVF9GVU5DUyhkZXZpY2VfYnl0ZXNfdXNlZCwgc3RydWN0IGJ0cmZzX2Rldl9pdGVtLCBieXRlc191c2VkLCA2NCk7CitCVFJGU19TRVRHRVRfRlVOQ1MoZGV2aWNlX2lvX2FsaWduLCBzdHJ1Y3QgYnRyZnNfZGV2X2l0ZW0sIGlvX2FsaWduLCAzMik7CitCVFJGU19TRVRHRVRfRlVOQ1MoZGV2aWNlX2lvX3dpZHRoLCBzdHJ1Y3QgYnRyZnNfZGV2X2l0ZW0sIGlvX3dpZHRoLCAzMik7CitCVFJGU19TRVRHRVRfRlVOQ1MoZGV2aWNlX3N0YXJ0X29mZnNldCwgc3RydWN0IGJ0cmZzX2Rldl9pdGVtLAorCQkgICBzdGFydF9vZmZzZXQsIDY0KTsKK0JUUkZTX1NFVEdFVF9GVU5DUyhkZXZpY2Vfc2VjdG9yX3NpemUsIHN0cnVjdCBidHJmc19kZXZfaXRlbSwgc2VjdG9yX3NpemUsIDMyKTsKK0JUUkZTX1NFVEdFVF9GVU5DUyhkZXZpY2VfaWQsIHN0cnVjdCBidHJmc19kZXZfaXRlbSwgZGV2aWQsIDY0KTsKK0JUUkZTX1NFVEdFVF9GVU5DUyhkZXZpY2VfZ3JvdXAsIHN0cnVjdCBidHJmc19kZXZfaXRlbSwgZGV2X2dyb3VwLCAzMik7CitCVFJGU19TRVRHRVRfRlVOQ1MoZGV2aWNlX3NlZWtfc3BlZWQsIHN0cnVjdCBidHJmc19kZXZfaXRlbSwgc2Vla19zcGVlZCwgOCk7CitCVFJGU19TRVRHRVRfRlVOQ1MoZGV2aWNlX2JhbmR3aWR0aCwgc3RydWN0IGJ0cmZzX2Rldl9pdGVtLCBiYW5kd2lkdGgsIDgpOworQlRSRlNfU0VUR0VUX0ZVTkNTKGRldmljZV9nZW5lcmF0aW9uLCBzdHJ1Y3QgYnRyZnNfZGV2X2l0ZW0sIGdlbmVyYXRpb24sIDY0KTsKKworQlRSRlNfU0VUR0VUX1NUQUNLX0ZVTkNTKHN0YWNrX2RldmljZV90eXBlLCBzdHJ1Y3QgYnRyZnNfZGV2X2l0ZW0sIHR5cGUsIDY0KTsKK0JUUkZTX1NFVEdFVF9TVEFDS19GVU5DUyhzdGFja19kZXZpY2VfdG90YWxfYnl0ZXMsIHN0cnVjdCBidHJmc19kZXZfaXRlbSwKKwkJCSB0b3RhbF9ieXRlcywgNjQpOworQlRSRlNfU0VUR0VUX1NUQUNLX0ZVTkNTKHN0YWNrX2RldmljZV9ieXRlc191c2VkLCBzdHJ1Y3QgYnRyZnNfZGV2X2l0ZW0sCisJCQkgYnl0ZXNfdXNlZCwgNjQpOworQlRSRlNfU0VUR0VUX1NUQUNLX0ZVTkNTKHN0YWNrX2RldmljZV9pb19hbGlnbiwgc3RydWN0IGJ0cmZzX2Rldl9pdGVtLAorCQkJIGlvX2FsaWduLCAzMik7CitCVFJGU19TRVRHRVRfU1RBQ0tfRlVOQ1Moc3RhY2tfZGV2aWNlX2lvX3dpZHRoLCBzdHJ1Y3QgYnRyZnNfZGV2X2l0ZW0sCisJCQkgaW9fd2lkdGgsIDMyKTsKK0JUUkZTX1NFVEdFVF9TVEFDS19GVU5DUyhzdGFja19kZXZpY2Vfc2VjdG9yX3NpemUsIHN0cnVjdCBidHJmc19kZXZfaXRlbSwKKwkJCSBzZWN0b3Jfc2l6ZSwgMzIpOworQlRSRlNfU0VUR0VUX1NUQUNLX0ZVTkNTKHN0YWNrX2RldmljZV9pZCwgc3RydWN0IGJ0cmZzX2Rldl9pdGVtLCBkZXZpZCwgNjQpOworQlRSRlNfU0VUR0VUX1NUQUNLX0ZVTkNTKHN0YWNrX2RldmljZV9ncm91cCwgc3RydWN0IGJ0cmZzX2Rldl9pdGVtLAorCQkJIGRldl9ncm91cCwgMzIpOworQlRSRlNfU0VUR0VUX1NUQUNLX0ZVTkNTKHN0YWNrX2RldmljZV9zZWVrX3NwZWVkLCBzdHJ1Y3QgYnRyZnNfZGV2X2l0ZW0sCisJCQkgc2Vla19zcGVlZCwgOCk7CitCVFJGU19TRVRHRVRfU1RBQ0tfRlVOQ1Moc3RhY2tfZGV2aWNlX2JhbmR3aWR0aCwgc3RydWN0IGJ0cmZzX2Rldl9pdGVtLAorCQkJIGJhbmR3aWR0aCwgOCk7CitCVFJGU19TRVRHRVRfU1RBQ0tfRlVOQ1Moc3RhY2tfZGV2aWNlX2dlbmVyYXRpb24sIHN0cnVjdCBidHJmc19kZXZfaXRlbSwKKwkJCSBnZW5lcmF0aW9uLCA2NCk7CisKK3N0YXRpYyBpbmxpbmUgY2hhciAqYnRyZnNfZGV2aWNlX3V1aWQoc3RydWN0IGJ0cmZzX2Rldl9pdGVtICpkKQoreworCXJldHVybiAoY2hhciAqKWQgKyBvZmZzZXRvZihzdHJ1Y3QgYnRyZnNfZGV2X2l0ZW0sIHV1aWQpOworfQorCitzdGF0aWMgaW5saW5lIGNoYXIgKmJ0cmZzX2RldmljZV9mc2lkKHN0cnVjdCBidHJmc19kZXZfaXRlbSAqZCkKK3sKKwlyZXR1cm4gKGNoYXIgKilkICsgb2Zmc2V0b2Yoc3RydWN0IGJ0cmZzX2Rldl9pdGVtLCBmc2lkKTsKK30KKworQlRSRlNfU0VUR0VUX0ZVTkNTKGNodW5rX2xlbmd0aCwgc3RydWN0IGJ0cmZzX2NodW5rLCBsZW5ndGgsIDY0KTsKK0JUUkZTX1NFVEdFVF9GVU5DUyhjaHVua19vd25lciwgc3RydWN0IGJ0cmZzX2NodW5rLCBvd25lciwgNjQpOworQlRSRlNfU0VUR0VUX0ZVTkNTKGNodW5rX3N0cmlwZV9sZW4sIHN0cnVjdCBidHJmc19jaHVuaywgc3RyaXBlX2xlbiwgNjQpOworQlRSRlNfU0VUR0VUX0ZVTkNTKGNodW5rX2lvX2FsaWduLCBzdHJ1Y3QgYnRyZnNfY2h1bmssIGlvX2FsaWduLCAzMik7CitCVFJGU19TRVRHRVRfRlVOQ1MoY2h1bmtfaW9fd2lkdGgsIHN0cnVjdCBidHJmc19jaHVuaywgaW9fd2lkdGgsIDMyKTsKK0JUUkZTX1NFVEdFVF9GVU5DUyhjaHVua19zZWN0b3Jfc2l6ZSwgc3RydWN0IGJ0cmZzX2NodW5rLCBzZWN0b3Jfc2l6ZSwgMzIpOworQlRSRlNfU0VUR0VUX0ZVTkNTKGNodW5rX3R5cGUsIHN0cnVjdCBidHJmc19jaHVuaywgdHlwZSwgNjQpOworQlRSRlNfU0VUR0VUX0ZVTkNTKGNodW5rX251bV9zdHJpcGVzLCBzdHJ1Y3QgYnRyZnNfY2h1bmssIG51bV9zdHJpcGVzLCAxNik7CitCVFJGU19TRVRHRVRfRlVOQ1MoY2h1bmtfc3ViX3N0cmlwZXMsIHN0cnVjdCBidHJmc19jaHVuaywgc3ViX3N0cmlwZXMsIDE2KTsKK0JUUkZTX1NFVEdFVF9GVU5DUyhzdHJpcGVfZGV2aWQsIHN0cnVjdCBidHJmc19zdHJpcGUsIGRldmlkLCA2NCk7CitCVFJGU19TRVRHRVRfRlVOQ1Moc3RyaXBlX29mZnNldCwgc3RydWN0IGJ0cmZzX3N0cmlwZSwgb2Zmc2V0LCA2NCk7CisKK3N0YXRpYyBpbmxpbmUgY2hhciAqYnRyZnNfc3RyaXBlX2Rldl91dWlkKHN0cnVjdCBidHJmc19zdHJpcGUgKnMpCit7CisJcmV0dXJuIChjaGFyICopcyArIG9mZnNldG9mKHN0cnVjdCBidHJmc19zdHJpcGUsIGRldl91dWlkKTsKK30KKworQlRSRlNfU0VUR0VUX1NUQUNLX0ZVTkNTKHN0YWNrX2NodW5rX2xlbmd0aCwgc3RydWN0IGJ0cmZzX2NodW5rLCBsZW5ndGgsIDY0KTsKK0JUUkZTX1NFVEdFVF9TVEFDS19GVU5DUyhzdGFja19jaHVua19vd25lciwgc3RydWN0IGJ0cmZzX2NodW5rLCBvd25lciwgNjQpOworQlRSRlNfU0VUR0VUX1NUQUNLX0ZVTkNTKHN0YWNrX2NodW5rX3N0cmlwZV9sZW4sIHN0cnVjdCBidHJmc19jaHVuaywKKwkJCSBzdHJpcGVfbGVuLCA2NCk7CitCVFJGU19TRVRHRVRfU1RBQ0tfRlVOQ1Moc3RhY2tfY2h1bmtfaW9fYWxpZ24sIHN0cnVjdCBidHJmc19jaHVuaywKKwkJCSBpb19hbGlnbiwgMzIpOworQlRSRlNfU0VUR0VUX1NUQUNLX0ZVTkNTKHN0YWNrX2NodW5rX2lvX3dpZHRoLCBzdHJ1Y3QgYnRyZnNfY2h1bmssCisJCQkgaW9fd2lkdGgsIDMyKTsKK0JUUkZTX1NFVEdFVF9TVEFDS19GVU5DUyhzdGFja19jaHVua19zZWN0b3Jfc2l6ZSwgc3RydWN0IGJ0cmZzX2NodW5rLAorCQkJIHNlY3Rvcl9zaXplLCAzMik7CitCVFJGU19TRVRHRVRfU1RBQ0tfRlVOQ1Moc3RhY2tfY2h1bmtfdHlwZSwgc3RydWN0IGJ0cmZzX2NodW5rLCB0eXBlLCA2NCk7CitCVFJGU19TRVRHRVRfU1RBQ0tfRlVOQ1Moc3RhY2tfY2h1bmtfbnVtX3N0cmlwZXMsIHN0cnVjdCBidHJmc19jaHVuaywKKwkJCSBudW1fc3RyaXBlcywgMTYpOworQlRSRlNfU0VUR0VUX1NUQUNLX0ZVTkNTKHN0YWNrX2NodW5rX3N1Yl9zdHJpcGVzLCBzdHJ1Y3QgYnRyZnNfY2h1bmssCisJCQkgc3ViX3N0cmlwZXMsIDE2KTsKK0JUUkZTX1NFVEdFVF9TVEFDS19GVU5DUyhzdGFja19zdHJpcGVfZGV2aWQsIHN0cnVjdCBidHJmc19zdHJpcGUsIGRldmlkLCA2NCk7CitCVFJGU19TRVRHRVRfU1RBQ0tfRlVOQ1Moc3RhY2tfc3RyaXBlX29mZnNldCwgc3RydWN0IGJ0cmZzX3N0cmlwZSwgb2Zmc2V0LCA2NCk7CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGJ0cmZzX3N0cmlwZSAqYnRyZnNfc3RyaXBlX25yKHN0cnVjdCBidHJmc19jaHVuayAqYywKKwkJCQkJCSAgIGludCBucikKK3sKKwl1bnNpZ25lZCBsb25nIG9mZnNldCA9ICh1bnNpZ25lZCBsb25nKWM7CisJb2Zmc2V0ICs9IG9mZnNldG9mKHN0cnVjdCBidHJmc19jaHVuaywgc3RyaXBlKTsKKwlvZmZzZXQgKz0gbnIgKiBzaXplb2Yoc3RydWN0IGJ0cmZzX3N0cmlwZSk7CisJcmV0dXJuIChzdHJ1Y3QgYnRyZnNfc3RyaXBlICopb2Zmc2V0OworfQorCitzdGF0aWMgaW5saW5lIGNoYXIgKmJ0cmZzX3N0cmlwZV9kZXZfdXVpZF9ucihzdHJ1Y3QgYnRyZnNfY2h1bmsgKmMsIGludCBucikKK3sKKwlyZXR1cm4gYnRyZnNfc3RyaXBlX2Rldl91dWlkKGJ0cmZzX3N0cmlwZV9ucihjLCBucikpOworfQorCitzdGF0aWMgaW5saW5lIHU2NCBidHJmc19zdHJpcGVfb2Zmc2V0X25yKHN0cnVjdCBleHRlbnRfYnVmZmVyICplYiwKKwkJCQkJIHN0cnVjdCBidHJmc19jaHVuayAqYywgaW50IG5yKQoreworCXJldHVybiBidHJmc19zdHJpcGVfb2Zmc2V0KGViLCBidHJmc19zdHJpcGVfbnIoYywgbnIpKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGJ0cmZzX3NldF9zdHJpcGVfb2Zmc2V0X25yKHN0cnVjdCBleHRlbnRfYnVmZmVyICplYiwKKwkJCQkJICAgICBzdHJ1Y3QgYnRyZnNfY2h1bmsgKmMsIGludCBuciwKKwkJCQkJICAgICB1NjQgdmFsKQoreworCWJ0cmZzX3NldF9zdHJpcGVfb2Zmc2V0KGViLCBidHJmc19zdHJpcGVfbnIoYywgbnIpLCB2YWwpOworfQorCitzdGF0aWMgaW5saW5lIHU2NCBidHJmc19zdHJpcGVfZGV2aWRfbnIoc3RydWN0IGV4dGVudF9idWZmZXIgKmViLAorCQkJCQkgc3RydWN0IGJ0cmZzX2NodW5rICpjLCBpbnQgbnIpCit7CisJcmV0dXJuIGJ0cmZzX3N0cmlwZV9kZXZpZChlYiwgYnRyZnNfc3RyaXBlX25yKGMsIG5yKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBidHJmc19zZXRfc3RyaXBlX2RldmlkX25yKHN0cnVjdCBleHRlbnRfYnVmZmVyICplYiwKKwkJCQkJICAgICBzdHJ1Y3QgYnRyZnNfY2h1bmsgKmMsIGludCBuciwKKwkJCQkJICAgICB1NjQgdmFsKQoreworCWJ0cmZzX3NldF9zdHJpcGVfZGV2aWQoZWIsIGJ0cmZzX3N0cmlwZV9ucihjLCBuciksIHZhbCk7Cit9CisKKy8qIHN0cnVjdCBidHJmc19ibG9ja19ncm91cF9pdGVtICovCitCVFJGU19TRVRHRVRfU1RBQ0tfRlVOQ1MoYmxvY2tfZ3JvdXBfdXNlZCwgc3RydWN0IGJ0cmZzX2Jsb2NrX2dyb3VwX2l0ZW0sCisJCQkgdXNlZCwgNjQpOworQlRSRlNfU0VUR0VUX0ZVTkNTKGRpc2tfYmxvY2tfZ3JvdXBfdXNlZCwgc3RydWN0IGJ0cmZzX2Jsb2NrX2dyb3VwX2l0ZW0sCisJCQkgdXNlZCwgNjQpOworQlRSRlNfU0VUR0VUX1NUQUNLX0ZVTkNTKGJsb2NrX2dyb3VwX2NodW5rX29iamVjdGlkLAorCQkJc3RydWN0IGJ0cmZzX2Jsb2NrX2dyb3VwX2l0ZW0sIGNodW5rX29iamVjdGlkLCA2NCk7CisKK0JUUkZTX1NFVEdFVF9GVU5DUyhkaXNrX2Jsb2NrX2dyb3VwX2NodW5rX29iamVjdGlkLAorCQkgICBzdHJ1Y3QgYnRyZnNfYmxvY2tfZ3JvdXBfaXRlbSwgY2h1bmtfb2JqZWN0aWQsIDY0KTsKK0JUUkZTX1NFVEdFVF9GVU5DUyhkaXNrX2Jsb2NrX2dyb3VwX2ZsYWdzLAorCQkgICBzdHJ1Y3QgYnRyZnNfYmxvY2tfZ3JvdXBfaXRlbSwgZmxhZ3MsIDY0KTsKK0JUUkZTX1NFVEdFVF9TVEFDS19GVU5DUyhibG9ja19ncm91cF9mbGFncywKKwkJCXN0cnVjdCBidHJmc19ibG9ja19ncm91cF9pdGVtLCBmbGFncywgNjQpOworCisvKiBzdHJ1Y3QgYnRyZnNfaW5vZGVfcmVmICovCitCVFJGU19TRVRHRVRfRlVOQ1MoaW5vZGVfcmVmX25hbWVfbGVuLCBzdHJ1Y3QgYnRyZnNfaW5vZGVfcmVmLCBuYW1lX2xlbiwgMTYpOworQlRSRlNfU0VUR0VUX0ZVTkNTKGlub2RlX3JlZl9pbmRleCwgc3RydWN0IGJ0cmZzX2lub2RlX3JlZiwgaW5kZXgsIDY0KTsKKworLyogc3RydWN0IGJ0cmZzX2lub2RlX2l0ZW0gKi8KK0JUUkZTX1NFVEdFVF9GVU5DUyhpbm9kZV9nZW5lcmF0aW9uLCBzdHJ1Y3QgYnRyZnNfaW5vZGVfaXRlbSwgZ2VuZXJhdGlvbiwgNjQpOworQlRSRlNfU0VUR0VUX0ZVTkNTKGlub2RlX3NlcXVlbmNlLCBzdHJ1Y3QgYnRyZnNfaW5vZGVfaXRlbSwgc2VxdWVuY2UsIDY0KTsKK0JUUkZTX1NFVEdFVF9GVU5DUyhpbm9kZV90cmFuc2lkLCBzdHJ1Y3QgYnRyZnNfaW5vZGVfaXRlbSwgdHJhbnNpZCwgNjQpOworQlRSRlNfU0VUR0VUX0ZVTkNTKGlub2RlX3NpemUsIHN0cnVjdCBidHJmc19pbm9kZV9pdGVtLCBzaXplLCA2NCk7CitCVFJGU19TRVRHRVRfRlVOQ1MoaW5vZGVfbmJ5dGVzLCBzdHJ1Y3QgYnRyZnNfaW5vZGVfaXRlbSwgbmJ5dGVzLCA2NCk7CitCVFJGU19TRVRHRVRfRlVOQ1MoaW5vZGVfYmxvY2tfZ3JvdXAsIHN0cnVjdCBidHJmc19pbm9kZV9pdGVtLCBibG9ja19ncm91cCwgNjQpOworQlRSRlNfU0VUR0VUX0ZVTkNTKGlub2RlX25saW5rLCBzdHJ1Y3QgYnRyZnNfaW5vZGVfaXRlbSwgbmxpbmssIDMyKTsKK0JUUkZTX1NFVEdFVF9GVU5DUyhpbm9kZV91aWQsIHN0cnVjdCBidHJmc19pbm9kZV9pdGVtLCB1aWQsIDMyKTsKK0JUUkZTX1NFVEdFVF9GVU5DUyhpbm9kZV9naWQsIHN0cnVjdCBidHJmc19pbm9kZV9pdGVtLCBnaWQsIDMyKTsKK0JUUkZTX1NFVEdFVF9GVU5DUyhpbm9kZV9tb2RlLCBzdHJ1Y3QgYnRyZnNfaW5vZGVfaXRlbSwgbW9kZSwgMzIpOworQlRSRlNfU0VUR0VUX0ZVTkNTKGlub2RlX3JkZXYsIHN0cnVjdCBidHJmc19pbm9kZV9pdGVtLCByZGV2LCA2NCk7CitCVFJGU19TRVRHRVRfRlVOQ1MoaW5vZGVfZmxhZ3MsIHN0cnVjdCBidHJmc19pbm9kZV9pdGVtLCBmbGFncywgNjQpOworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBidHJmc190aW1lc3BlYyAqCitidHJmc19pbm9kZV9hdGltZShzdHJ1Y3QgYnRyZnNfaW5vZGVfaXRlbSAqaW5vZGVfaXRlbSkKK3sKKwl1bnNpZ25lZCBsb25nIHB0ciA9ICh1bnNpZ25lZCBsb25nKWlub2RlX2l0ZW07CisJcHRyICs9IG9mZnNldG9mKHN0cnVjdCBidHJmc19pbm9kZV9pdGVtLCBhdGltZSk7CisJcmV0dXJuIChzdHJ1Y3QgYnRyZnNfdGltZXNwZWMgKilwdHI7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGJ0cmZzX3RpbWVzcGVjICoKK2J0cmZzX2lub2RlX210aW1lKHN0cnVjdCBidHJmc19pbm9kZV9pdGVtICppbm9kZV9pdGVtKQoreworCXVuc2lnbmVkIGxvbmcgcHRyID0gKHVuc2lnbmVkIGxvbmcpaW5vZGVfaXRlbTsKKwlwdHIgKz0gb2Zmc2V0b2Yoc3RydWN0IGJ0cmZzX2lub2RlX2l0ZW0sIG10aW1lKTsKKwlyZXR1cm4gKHN0cnVjdCBidHJmc190aW1lc3BlYyAqKXB0cjsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgYnRyZnNfdGltZXNwZWMgKgorYnRyZnNfaW5vZGVfY3RpbWUoc3RydWN0IGJ0cmZzX2lub2RlX2l0ZW0gKmlub2RlX2l0ZW0pCit7CisJdW5zaWduZWQgbG9uZyBwdHIgPSAodW5zaWduZWQgbG9uZylpbm9kZV9pdGVtOworCXB0ciArPSBvZmZzZXRvZihzdHJ1Y3QgYnRyZnNfaW5vZGVfaXRlbSwgY3RpbWUpOworCXJldHVybiAoc3RydWN0IGJ0cmZzX3RpbWVzcGVjICopcHRyOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBidHJmc190aW1lc3BlYyAqCitidHJmc19pbm9kZV9vdGltZShzdHJ1Y3QgYnRyZnNfaW5vZGVfaXRlbSAqaW5vZGVfaXRlbSkKK3sKKwl1bnNpZ25lZCBsb25nIHB0ciA9ICh1bnNpZ25lZCBsb25nKWlub2RlX2l0ZW07CisJcHRyICs9IG9mZnNldG9mKHN0cnVjdCBidHJmc19pbm9kZV9pdGVtLCBvdGltZSk7CisJcmV0dXJuIChzdHJ1Y3QgYnRyZnNfdGltZXNwZWMgKilwdHI7Cit9CisKK0JUUkZTX1NFVEdFVF9GVU5DUyh0aW1lc3BlY19zZWMsIHN0cnVjdCBidHJmc190aW1lc3BlYywgc2VjLCA2NCk7CitCVFJGU19TRVRHRVRfRlVOQ1ModGltZXNwZWNfbnNlYywgc3RydWN0IGJ0cmZzX3RpbWVzcGVjLCBuc2VjLCAzMik7CisKKy8qIHN0cnVjdCBidHJmc19kZXZfZXh0ZW50ICovCitCVFJGU19TRVRHRVRfRlVOQ1MoZGV2X2V4dGVudF9jaHVua190cmVlLCBzdHJ1Y3QgYnRyZnNfZGV2X2V4dGVudCwKKwkJICAgY2h1bmtfdHJlZSwgNjQpOworQlRSRlNfU0VUR0VUX0ZVTkNTKGRldl9leHRlbnRfY2h1bmtfb2JqZWN0aWQsIHN0cnVjdCBidHJmc19kZXZfZXh0ZW50LAorCQkgICBjaHVua19vYmplY3RpZCwgNjQpOworQlRSRlNfU0VUR0VUX0ZVTkNTKGRldl9leHRlbnRfY2h1bmtfb2Zmc2V0LCBzdHJ1Y3QgYnRyZnNfZGV2X2V4dGVudCwKKwkJICAgY2h1bmtfb2Zmc2V0LCA2NCk7CitCVFJGU19TRVRHRVRfRlVOQ1MoZGV2X2V4dGVudF9sZW5ndGgsIHN0cnVjdCBidHJmc19kZXZfZXh0ZW50LCBsZW5ndGgsIDY0KTsKKworc3RhdGljIGlubGluZSB1OCAqYnRyZnNfZGV2X2V4dGVudF9jaHVua190cmVlX3V1aWQoc3RydWN0IGJ0cmZzX2Rldl9leHRlbnQgKmRldikKK3sKKwl1bnNpZ25lZCBsb25nIHB0ciA9IG9mZnNldG9mKHN0cnVjdCBidHJmc19kZXZfZXh0ZW50LCBjaHVua190cmVlX3V1aWQpOworCXJldHVybiAodTggKikoKHVuc2lnbmVkIGxvbmcpZGV2ICsgcHRyKTsKK30KKworLyogc3RydWN0IGJ0cmZzX2V4dGVudF9yZWYgKi8KK0JUUkZTX1NFVEdFVF9GVU5DUyhyZWZfcm9vdCwgc3RydWN0IGJ0cmZzX2V4dGVudF9yZWYsIHJvb3QsIDY0KTsKK0JUUkZTX1NFVEdFVF9GVU5DUyhyZWZfZ2VuZXJhdGlvbiwgc3RydWN0IGJ0cmZzX2V4dGVudF9yZWYsIGdlbmVyYXRpb24sIDY0KTsKK0JUUkZTX1NFVEdFVF9GVU5DUyhyZWZfb2JqZWN0aWQsIHN0cnVjdCBidHJmc19leHRlbnRfcmVmLCBvYmplY3RpZCwgNjQpOworQlRSRlNfU0VUR0VUX0ZVTkNTKHJlZl9udW1fcmVmcywgc3RydWN0IGJ0cmZzX2V4dGVudF9yZWYsIG51bV9yZWZzLCAzMik7CisKK0JUUkZTX1NFVEdFVF9TVEFDS19GVU5DUyhzdGFja19yZWZfcm9vdCwgc3RydWN0IGJ0cmZzX2V4dGVudF9yZWYsIHJvb3QsIDY0KTsKK0JUUkZTX1NFVEdFVF9TVEFDS19GVU5DUyhzdGFja19yZWZfZ2VuZXJhdGlvbiwgc3RydWN0IGJ0cmZzX2V4dGVudF9yZWYsCisJCQkgZ2VuZXJhdGlvbiwgNjQpOworQlRSRlNfU0VUR0VUX1NUQUNLX0ZVTkNTKHN0YWNrX3JlZl9vYmplY3RpZCwgc3RydWN0IGJ0cmZzX2V4dGVudF9yZWYsCisJCQkgb2JqZWN0aWQsIDY0KTsKK0JUUkZTX1NFVEdFVF9TVEFDS19GVU5DUyhzdGFja19yZWZfbnVtX3JlZnMsIHN0cnVjdCBidHJmc19leHRlbnRfcmVmLAorCQkJIG51bV9yZWZzLCAzMik7CisKKy8qIHN0cnVjdCBidHJmc19leHRlbnRfaXRlbSAqLworQlRSRlNfU0VUR0VUX0ZVTkNTKGV4dGVudF9yZWZzLCBzdHJ1Y3QgYnRyZnNfZXh0ZW50X2l0ZW0sIHJlZnMsIDMyKTsKK0JUUkZTX1NFVEdFVF9TVEFDS19GVU5DUyhzdGFja19leHRlbnRfcmVmcywgc3RydWN0IGJ0cmZzX2V4dGVudF9pdGVtLAorCQkJIHJlZnMsIDMyKTsKKworLyogc3RydWN0IGJ0cmZzX25vZGUgKi8KK0JUUkZTX1NFVEdFVF9GVU5DUyhrZXlfYmxvY2twdHIsIHN0cnVjdCBidHJmc19rZXlfcHRyLCBibG9ja3B0ciwgNjQpOworQlRSRlNfU0VUR0VUX0ZVTkNTKGtleV9nZW5lcmF0aW9uLCBzdHJ1Y3QgYnRyZnNfa2V5X3B0ciwgZ2VuZXJhdGlvbiwgNjQpOworCitzdGF0aWMgaW5saW5lIHU2NCBidHJmc19ub2RlX2Jsb2NrcHRyKHN0cnVjdCBleHRlbnRfYnVmZmVyICplYiwgaW50IG5yKQoreworCXVuc2lnbmVkIGxvbmcgcHRyOworCXB0ciA9IG9mZnNldG9mKHN0cnVjdCBidHJmc19ub2RlLCBwdHJzKSArCisJCXNpemVvZihzdHJ1Y3QgYnRyZnNfa2V5X3B0cikgKiBucjsKKwlyZXR1cm4gYnRyZnNfa2V5X2Jsb2NrcHRyKGViLCAoc3RydWN0IGJ0cmZzX2tleV9wdHIgKilwdHIpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYnRyZnNfc2V0X25vZGVfYmxvY2twdHIoc3RydWN0IGV4dGVudF9idWZmZXIgKmViLAorCQkJCQkgICBpbnQgbnIsIHU2NCB2YWwpCit7CisJdW5zaWduZWQgbG9uZyBwdHI7CisJcHRyID0gb2Zmc2V0b2Yoc3RydWN0IGJ0cmZzX25vZGUsIHB0cnMpICsKKwkJc2l6ZW9mKHN0cnVjdCBidHJmc19rZXlfcHRyKSAqIG5yOworCWJ0cmZzX3NldF9rZXlfYmxvY2twdHIoZWIsIChzdHJ1Y3QgYnRyZnNfa2V5X3B0ciAqKXB0ciwgdmFsKTsKK30KKworc3RhdGljIGlubGluZSB1NjQgYnRyZnNfbm9kZV9wdHJfZ2VuZXJhdGlvbihzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqZWIsIGludCBucikKK3sKKwl1bnNpZ25lZCBsb25nIHB0cjsKKwlwdHIgPSBvZmZzZXRvZihzdHJ1Y3QgYnRyZnNfbm9kZSwgcHRycykgKworCQlzaXplb2Yoc3RydWN0IGJ0cmZzX2tleV9wdHIpICogbnI7CisJcmV0dXJuIGJ0cmZzX2tleV9nZW5lcmF0aW9uKGViLCAoc3RydWN0IGJ0cmZzX2tleV9wdHIgKilwdHIpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYnRyZnNfc2V0X25vZGVfcHRyX2dlbmVyYXRpb24oc3RydWN0IGV4dGVudF9idWZmZXIgKmViLAorCQkJCQkJIGludCBuciwgdTY0IHZhbCkKK3sKKwl1bnNpZ25lZCBsb25nIHB0cjsKKwlwdHIgPSBvZmZzZXRvZihzdHJ1Y3QgYnRyZnNfbm9kZSwgcHRycykgKworCQlzaXplb2Yoc3RydWN0IGJ0cmZzX2tleV9wdHIpICogbnI7CisJYnRyZnNfc2V0X2tleV9nZW5lcmF0aW9uKGViLCAoc3RydWN0IGJ0cmZzX2tleV9wdHIgKilwdHIsIHZhbCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBidHJmc19ub2RlX2tleV9wdHJfb2Zmc2V0KGludCBucikKK3sKKwlyZXR1cm4gb2Zmc2V0b2Yoc3RydWN0IGJ0cmZzX25vZGUsIHB0cnMpICsKKwkJc2l6ZW9mKHN0cnVjdCBidHJmc19rZXlfcHRyKSAqIG5yOworfQorCit2b2lkIGJ0cmZzX25vZGVfa2V5KHN0cnVjdCBleHRlbnRfYnVmZmVyICplYiwKKwkJICAgIHN0cnVjdCBidHJmc19kaXNrX2tleSAqZGlza19rZXksIGludCBucik7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBidHJmc19zZXRfbm9kZV9rZXkoc3RydWN0IGV4dGVudF9idWZmZXIgKmViLAorCQkJCSAgICAgIHN0cnVjdCBidHJmc19kaXNrX2tleSAqZGlza19rZXksIGludCBucikKK3sKKwl1bnNpZ25lZCBsb25nIHB0cjsKKwlwdHIgPSBidHJmc19ub2RlX2tleV9wdHJfb2Zmc2V0KG5yKTsKKwl3cml0ZV9lYl9tZW1iZXIoZWIsIChzdHJ1Y3QgYnRyZnNfa2V5X3B0ciAqKXB0ciwKKwkJICAgICAgIHN0cnVjdCBidHJmc19rZXlfcHRyLCBrZXksIGRpc2tfa2V5KTsKK30KKworLyogc3RydWN0IGJ0cmZzX2l0ZW0gKi8KK0JUUkZTX1NFVEdFVF9GVU5DUyhpdGVtX29mZnNldCwgc3RydWN0IGJ0cmZzX2l0ZW0sIG9mZnNldCwgMzIpOworQlRSRlNfU0VUR0VUX0ZVTkNTKGl0ZW1fc2l6ZSwgc3RydWN0IGJ0cmZzX2l0ZW0sIHNpemUsIDMyKTsKKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGJ0cmZzX2l0ZW1fbnJfb2Zmc2V0KGludCBucikKK3sKKwlyZXR1cm4gb2Zmc2V0b2Yoc3RydWN0IGJ0cmZzX2xlYWYsIGl0ZW1zKSArCisJCXNpemVvZihzdHJ1Y3QgYnRyZnNfaXRlbSkgKiBucjsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgYnRyZnNfaXRlbSAqYnRyZnNfaXRlbV9ucihzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqZWIsCisJCQkJCSAgICAgICBpbnQgbnIpCit7CisJcmV0dXJuIChzdHJ1Y3QgYnRyZnNfaXRlbSAqKWJ0cmZzX2l0ZW1fbnJfb2Zmc2V0KG5yKTsKK30KKworc3RhdGljIGlubGluZSB1MzIgYnRyZnNfaXRlbV9lbmQoc3RydWN0IGV4dGVudF9idWZmZXIgKmViLAorCQkJCSBzdHJ1Y3QgYnRyZnNfaXRlbSAqaXRlbSkKK3sKKwlyZXR1cm4gYnRyZnNfaXRlbV9vZmZzZXQoZWIsIGl0ZW0pICsgYnRyZnNfaXRlbV9zaXplKGViLCBpdGVtKTsKK30KKworc3RhdGljIGlubGluZSB1MzIgYnRyZnNfaXRlbV9lbmRfbnIoc3RydWN0IGV4dGVudF9idWZmZXIgKmViLCBpbnQgbnIpCit7CisJcmV0dXJuIGJ0cmZzX2l0ZW1fZW5kKGViLCBidHJmc19pdGVtX25yKGViLCBucikpOworfQorCitzdGF0aWMgaW5saW5lIHUzMiBidHJmc19pdGVtX29mZnNldF9ucihzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqZWIsIGludCBucikKK3sKKwlyZXR1cm4gYnRyZnNfaXRlbV9vZmZzZXQoZWIsIGJ0cmZzX2l0ZW1fbnIoZWIsIG5yKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIGJ0cmZzX2l0ZW1fc2l6ZV9ucihzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqZWIsIGludCBucikKK3sKKwlyZXR1cm4gYnRyZnNfaXRlbV9zaXplKGViLCBidHJmc19pdGVtX25yKGViLCBucikpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYnRyZnNfaXRlbV9rZXkoc3RydWN0IGV4dGVudF9idWZmZXIgKmViLAorCQkJICAgc3RydWN0IGJ0cmZzX2Rpc2tfa2V5ICpkaXNrX2tleSwgaW50IG5yKQoreworCXN0cnVjdCBidHJmc19pdGVtICppdGVtID0gYnRyZnNfaXRlbV9ucihlYiwgbnIpOworCXJlYWRfZWJfbWVtYmVyKGViLCBpdGVtLCBzdHJ1Y3QgYnRyZnNfaXRlbSwga2V5LCBkaXNrX2tleSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBidHJmc19zZXRfaXRlbV9rZXkoc3RydWN0IGV4dGVudF9idWZmZXIgKmViLAorCQkJICAgICAgIHN0cnVjdCBidHJmc19kaXNrX2tleSAqZGlza19rZXksIGludCBucikKK3sKKwlzdHJ1Y3QgYnRyZnNfaXRlbSAqaXRlbSA9IGJ0cmZzX2l0ZW1fbnIoZWIsIG5yKTsKKwl3cml0ZV9lYl9tZW1iZXIoZWIsIGl0ZW0sIHN0cnVjdCBidHJmc19pdGVtLCBrZXksIGRpc2tfa2V5KTsKK30KKworQlRSRlNfU0VUR0VUX0ZVTkNTKGRpcl9sb2dfZW5kLCBzdHJ1Y3QgYnRyZnNfZGlyX2xvZ19pdGVtLCBlbmQsIDY0KTsKKworLyoKKyAqIHN0cnVjdCBidHJmc19yb290X3JlZgorICovCitCVFJGU19TRVRHRVRfRlVOQ1Mocm9vdF9yZWZfZGlyaWQsIHN0cnVjdCBidHJmc19yb290X3JlZiwgZGlyaWQsIDY0KTsKK0JUUkZTX1NFVEdFVF9GVU5DUyhyb290X3JlZl9zZXF1ZW5jZSwgc3RydWN0IGJ0cmZzX3Jvb3RfcmVmLCBzZXF1ZW5jZSwgNjQpOworQlRSRlNfU0VUR0VUX0ZVTkNTKHJvb3RfcmVmX25hbWVfbGVuLCBzdHJ1Y3QgYnRyZnNfcm9vdF9yZWYsIG5hbWVfbGVuLCAxNik7CisKKy8qIHN0cnVjdCBidHJmc19kaXJfaXRlbSAqLworQlRSRlNfU0VUR0VUX0ZVTkNTKGRpcl9kYXRhX2xlbiwgc3RydWN0IGJ0cmZzX2Rpcl9pdGVtLCBkYXRhX2xlbiwgMTYpOworQlRSRlNfU0VUR0VUX0ZVTkNTKGRpcl90eXBlLCBzdHJ1Y3QgYnRyZnNfZGlyX2l0ZW0sIHR5cGUsIDgpOworQlRSRlNfU0VUR0VUX0ZVTkNTKGRpcl9uYW1lX2xlbiwgc3RydWN0IGJ0cmZzX2Rpcl9pdGVtLCBuYW1lX2xlbiwgMTYpOworQlRSRlNfU0VUR0VUX0ZVTkNTKGRpcl90cmFuc2lkLCBzdHJ1Y3QgYnRyZnNfZGlyX2l0ZW0sIHRyYW5zaWQsIDY0KTsKKworc3RhdGljIGlubGluZSB2b2lkIGJ0cmZzX2Rpcl9pdGVtX2tleShzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqZWIsCisJCQkJICAgICAgc3RydWN0IGJ0cmZzX2Rpcl9pdGVtICppdGVtLAorCQkJCSAgICAgIHN0cnVjdCBidHJmc19kaXNrX2tleSAqa2V5KQoreworCXJlYWRfZWJfbWVtYmVyKGViLCBpdGVtLCBzdHJ1Y3QgYnRyZnNfZGlyX2l0ZW0sIGxvY2F0aW9uLCBrZXkpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYnRyZnNfc2V0X2Rpcl9pdGVtX2tleShzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqZWIsCisJCQkJCSAgc3RydWN0IGJ0cmZzX2Rpcl9pdGVtICppdGVtLAorCQkJCQkgIHN0cnVjdCBidHJmc19kaXNrX2tleSAqa2V5KQoreworCXdyaXRlX2ViX21lbWJlcihlYiwgaXRlbSwgc3RydWN0IGJ0cmZzX2Rpcl9pdGVtLCBsb2NhdGlvbiwga2V5KTsKK30KKworLyogc3RydWN0IGJ0cmZzX2Rpc2tfa2V5ICovCitCVFJGU19TRVRHRVRfU1RBQ0tfRlVOQ1MoZGlza19rZXlfb2JqZWN0aWQsIHN0cnVjdCBidHJmc19kaXNrX2tleSwKKwkJCSBvYmplY3RpZCwgNjQpOworQlRSRlNfU0VUR0VUX1NUQUNLX0ZVTkNTKGRpc2tfa2V5X29mZnNldCwgc3RydWN0IGJ0cmZzX2Rpc2tfa2V5LCBvZmZzZXQsIDY0KTsKK0JUUkZTX1NFVEdFVF9TVEFDS19GVU5DUyhkaXNrX2tleV90eXBlLCBzdHJ1Y3QgYnRyZnNfZGlza19rZXksIHR5cGUsIDgpOworCitzdGF0aWMgaW5saW5lIHZvaWQgYnRyZnNfZGlza19rZXlfdG9fY3B1KHN0cnVjdCBidHJmc19rZXkgKmNwdSwKKwkJCQkJIHN0cnVjdCBidHJmc19kaXNrX2tleSAqZGlzaykKK3sKKwljcHUtPm9mZnNldCA9IGxlNjRfdG9fY3B1KGRpc2stPm9mZnNldCk7CisJY3B1LT50eXBlID0gZGlzay0+dHlwZTsKKwljcHUtPm9iamVjdGlkID0gbGU2NF90b19jcHUoZGlzay0+b2JqZWN0aWQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYnRyZnNfY3B1X2tleV90b19kaXNrKHN0cnVjdCBidHJmc19kaXNrX2tleSAqZGlzaywKKwkJCQkJIHN0cnVjdCBidHJmc19rZXkgKmNwdSkKK3sKKwlkaXNrLT5vZmZzZXQgPSBjcHVfdG9fbGU2NChjcHUtPm9mZnNldCk7CisJZGlzay0+dHlwZSA9IGNwdS0+dHlwZTsKKwlkaXNrLT5vYmplY3RpZCA9IGNwdV90b19sZTY0KGNwdS0+b2JqZWN0aWQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYnRyZnNfbm9kZV9rZXlfdG9fY3B1KHN0cnVjdCBleHRlbnRfYnVmZmVyICplYiwKKwkJCQkgIHN0cnVjdCBidHJmc19rZXkgKmtleSwgaW50IG5yKQoreworCXN0cnVjdCBidHJmc19kaXNrX2tleSBkaXNrX2tleTsKKwlidHJmc19ub2RlX2tleShlYiwgJmRpc2tfa2V5LCBucik7CisJYnRyZnNfZGlza19rZXlfdG9fY3B1KGtleSwgJmRpc2tfa2V5KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGJ0cmZzX2l0ZW1fa2V5X3RvX2NwdShzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqZWIsCisJCQkJICBzdHJ1Y3QgYnRyZnNfa2V5ICprZXksIGludCBucikKK3sKKwlzdHJ1Y3QgYnRyZnNfZGlza19rZXkgZGlza19rZXk7CisJYnRyZnNfaXRlbV9rZXkoZWIsICZkaXNrX2tleSwgbnIpOworCWJ0cmZzX2Rpc2tfa2V5X3RvX2NwdShrZXksICZkaXNrX2tleSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBidHJmc19kaXJfaXRlbV9rZXlfdG9fY3B1KHN0cnVjdCBleHRlbnRfYnVmZmVyICplYiwKKwkJCQkgICAgICBzdHJ1Y3QgYnRyZnNfZGlyX2l0ZW0gKml0ZW0sCisJCQkJICAgICAgc3RydWN0IGJ0cmZzX2tleSAqa2V5KQoreworCXN0cnVjdCBidHJmc19kaXNrX2tleSBkaXNrX2tleTsKKwlidHJmc19kaXJfaXRlbV9rZXkoZWIsIGl0ZW0sICZkaXNrX2tleSk7CisJYnRyZnNfZGlza19rZXlfdG9fY3B1KGtleSwgJmRpc2tfa2V5KTsKK30KKworCitzdGF0aWMgaW5saW5lIHU4IGJ0cmZzX2tleV90eXBlKHN0cnVjdCBidHJmc19rZXkgKmtleSkKK3sKKwlyZXR1cm4ga2V5LT50eXBlOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYnRyZnNfc2V0X2tleV90eXBlKHN0cnVjdCBidHJmc19rZXkgKmtleSwgdTggdmFsKQoreworCWtleS0+dHlwZSA9IHZhbDsKK30KKworLyogc3RydWN0IGJ0cmZzX2hlYWRlciAqLworQlRSRlNfU0VUR0VUX0hFQURFUl9GVU5DUyhoZWFkZXJfYnl0ZW5yLCBzdHJ1Y3QgYnRyZnNfaGVhZGVyLCBieXRlbnIsIDY0KTsKK0JUUkZTX1NFVEdFVF9IRUFERVJfRlVOQ1MoaGVhZGVyX2dlbmVyYXRpb24sIHN0cnVjdCBidHJmc19oZWFkZXIsCisJCQkgIGdlbmVyYXRpb24sIDY0KTsKK0JUUkZTX1NFVEdFVF9IRUFERVJfRlVOQ1MoaGVhZGVyX293bmVyLCBzdHJ1Y3QgYnRyZnNfaGVhZGVyLCBvd25lciwgNjQpOworQlRSRlNfU0VUR0VUX0hFQURFUl9GVU5DUyhoZWFkZXJfbnJpdGVtcywgc3RydWN0IGJ0cmZzX2hlYWRlciwgbnJpdGVtcywgMzIpOworQlRSRlNfU0VUR0VUX0hFQURFUl9GVU5DUyhoZWFkZXJfZmxhZ3MsIHN0cnVjdCBidHJmc19oZWFkZXIsIGZsYWdzLCA2NCk7CitCVFJGU19TRVRHRVRfSEVBREVSX0ZVTkNTKGhlYWRlcl9sZXZlbCwgc3RydWN0IGJ0cmZzX2hlYWRlciwgbGV2ZWwsIDgpOworCitzdGF0aWMgaW5saW5lIGludCBidHJmc19oZWFkZXJfZmxhZyhzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqZWIsIHU2NCBmbGFnKQoreworCXJldHVybiAoYnRyZnNfaGVhZGVyX2ZsYWdzKGViKSAmIGZsYWcpID09IGZsYWc7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGJ0cmZzX3NldF9oZWFkZXJfZmxhZyhzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqZWIsIHU2NCBmbGFnKQoreworCXU2NCBmbGFncyA9IGJ0cmZzX2hlYWRlcl9mbGFncyhlYik7CisJYnRyZnNfc2V0X2hlYWRlcl9mbGFncyhlYiwgZmxhZ3MgfCBmbGFnKTsKKwlyZXR1cm4gKGZsYWdzICYgZmxhZykgPT0gZmxhZzsKK30KKworc3RhdGljIGlubGluZSBpbnQgYnRyZnNfY2xlYXJfaGVhZGVyX2ZsYWcoc3RydWN0IGV4dGVudF9idWZmZXIgKmViLCB1NjQgZmxhZykKK3sKKwl1NjQgZmxhZ3MgPSBidHJmc19oZWFkZXJfZmxhZ3MoZWIpOworCWJ0cmZzX3NldF9oZWFkZXJfZmxhZ3MoZWIsIGZsYWdzICYgfmZsYWcpOworCXJldHVybiAoZmxhZ3MgJiBmbGFnKSA9PSBmbGFnOworfQorCitzdGF0aWMgaW5saW5lIHU4ICpidHJmc19oZWFkZXJfZnNpZChzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqZWIpCit7CisJdW5zaWduZWQgbG9uZyBwdHIgPSBvZmZzZXRvZihzdHJ1Y3QgYnRyZnNfaGVhZGVyLCBmc2lkKTsKKwlyZXR1cm4gKHU4ICopcHRyOworfQorCitzdGF0aWMgaW5saW5lIHU4ICpidHJmc19oZWFkZXJfY2h1bmtfdHJlZV91dWlkKHN0cnVjdCBleHRlbnRfYnVmZmVyICplYikKK3sKKwl1bnNpZ25lZCBsb25nIHB0ciA9IG9mZnNldG9mKHN0cnVjdCBidHJmc19oZWFkZXIsIGNodW5rX3RyZWVfdXVpZCk7CisJcmV0dXJuICh1OCAqKXB0cjsKK30KKworc3RhdGljIGlubGluZSB1OCAqYnRyZnNfc3VwZXJfZnNpZChzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqZWIpCit7CisJdW5zaWduZWQgbG9uZyBwdHIgPSBvZmZzZXRvZihzdHJ1Y3QgYnRyZnNfc3VwZXJfYmxvY2ssIGZzaWQpOworCXJldHVybiAodTggKilwdHI7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTggKmJ0cmZzX2hlYWRlcl9jc3VtKHN0cnVjdCBleHRlbnRfYnVmZmVyICplYikKK3sKKwl1bnNpZ25lZCBsb25nIHB0ciA9IG9mZnNldG9mKHN0cnVjdCBidHJmc19oZWFkZXIsIGNzdW0pOworCXJldHVybiAodTggKilwdHI7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGJ0cmZzX25vZGUgKmJ0cmZzX2J1ZmZlcl9ub2RlKHN0cnVjdCBleHRlbnRfYnVmZmVyICplYikKK3sKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgYnRyZnNfbGVhZiAqYnRyZnNfYnVmZmVyX2xlYWYoc3RydWN0IGV4dGVudF9idWZmZXIgKmViKQoreworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBidHJmc19oZWFkZXIgKmJ0cmZzX2J1ZmZlcl9oZWFkZXIoc3RydWN0IGV4dGVudF9idWZmZXIgKmViKQoreworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW5saW5lIGludCBidHJmc19pc19sZWFmKHN0cnVjdCBleHRlbnRfYnVmZmVyICplYikKK3sKKwlyZXR1cm4gYnRyZnNfaGVhZGVyX2xldmVsKGViKSA9PSAwOworfQorCisvKiBzdHJ1Y3QgYnRyZnNfcm9vdF9pdGVtICovCitCVFJGU19TRVRHRVRfRlVOQ1MoZGlza19yb290X2dlbmVyYXRpb24sIHN0cnVjdCBidHJmc19yb290X2l0ZW0sCisJCSAgIGdlbmVyYXRpb24sIDY0KTsKK0JUUkZTX1NFVEdFVF9GVU5DUyhkaXNrX3Jvb3RfcmVmcywgc3RydWN0IGJ0cmZzX3Jvb3RfaXRlbSwgcmVmcywgMzIpOworQlRSRlNfU0VUR0VUX0ZVTkNTKGRpc2tfcm9vdF9ieXRlbnIsIHN0cnVjdCBidHJmc19yb290X2l0ZW0sIGJ5dGVuciwgNjQpOworQlRSRlNfU0VUR0VUX0ZVTkNTKGRpc2tfcm9vdF9sZXZlbCwgc3RydWN0IGJ0cmZzX3Jvb3RfaXRlbSwgbGV2ZWwsIDgpOworCitCVFJGU19TRVRHRVRfU1RBQ0tfRlVOQ1Mocm9vdF9nZW5lcmF0aW9uLCBzdHJ1Y3QgYnRyZnNfcm9vdF9pdGVtLAorCQkJIGdlbmVyYXRpb24sIDY0KTsKK0JUUkZTX1NFVEdFVF9TVEFDS19GVU5DUyhyb290X2J5dGVuciwgc3RydWN0IGJ0cmZzX3Jvb3RfaXRlbSwgYnl0ZW5yLCA2NCk7CitCVFJGU19TRVRHRVRfU1RBQ0tfRlVOQ1Mocm9vdF9sZXZlbCwgc3RydWN0IGJ0cmZzX3Jvb3RfaXRlbSwgbGV2ZWwsIDgpOworQlRSRlNfU0VUR0VUX1NUQUNLX0ZVTkNTKHJvb3RfZGlyaWQsIHN0cnVjdCBidHJmc19yb290X2l0ZW0sIHJvb3RfZGlyaWQsIDY0KTsKK0JUUkZTX1NFVEdFVF9TVEFDS19GVU5DUyhyb290X3JlZnMsIHN0cnVjdCBidHJmc19yb290X2l0ZW0sIHJlZnMsIDMyKTsKK0JUUkZTX1NFVEdFVF9TVEFDS19GVU5DUyhyb290X2ZsYWdzLCBzdHJ1Y3QgYnRyZnNfcm9vdF9pdGVtLCBmbGFncywgNjQpOworQlRSRlNfU0VUR0VUX1NUQUNLX0ZVTkNTKHJvb3RfdXNlZCwgc3RydWN0IGJ0cmZzX3Jvb3RfaXRlbSwgYnl0ZXNfdXNlZCwgNjQpOworQlRSRlNfU0VUR0VUX1NUQUNLX0ZVTkNTKHJvb3RfbGltaXQsIHN0cnVjdCBidHJmc19yb290X2l0ZW0sIGJ5dGVfbGltaXQsIDY0KTsKK0JUUkZTX1NFVEdFVF9TVEFDS19GVU5DUyhyb290X2xhc3Rfc25hcHNob3QsIHN0cnVjdCBidHJmc19yb290X2l0ZW0sCisJCQkgbGFzdF9zbmFwc2hvdCwgNjQpOworCisvKiBzdHJ1Y3QgYnRyZnNfc3VwZXJfYmxvY2sgKi8KKworQlRSRlNfU0VUR0VUX1NUQUNLX0ZVTkNTKHN1cGVyX2J5dGVuciwgc3RydWN0IGJ0cmZzX3N1cGVyX2Jsb2NrLCBieXRlbnIsIDY0KTsKK0JUUkZTX1NFVEdFVF9TVEFDS19GVU5DUyhzdXBlcl9mbGFncywgc3RydWN0IGJ0cmZzX3N1cGVyX2Jsb2NrLCBmbGFncywgNjQpOworQlRSRlNfU0VUR0VUX1NUQUNLX0ZVTkNTKHN1cGVyX2dlbmVyYXRpb24sIHN0cnVjdCBidHJmc19zdXBlcl9ibG9jaywKKwkJCSBnZW5lcmF0aW9uLCA2NCk7CitCVFJGU19TRVRHRVRfU1RBQ0tfRlVOQ1Moc3VwZXJfcm9vdCwgc3RydWN0IGJ0cmZzX3N1cGVyX2Jsb2NrLCByb290LCA2NCk7CitCVFJGU19TRVRHRVRfU1RBQ0tfRlVOQ1Moc3VwZXJfc3lzX2FycmF5X3NpemUsCisJCQkgc3RydWN0IGJ0cmZzX3N1cGVyX2Jsb2NrLCBzeXNfY2h1bmtfYXJyYXlfc2l6ZSwgMzIpOworQlRSRlNfU0VUR0VUX1NUQUNLX0ZVTkNTKHN1cGVyX2NodW5rX3Jvb3RfZ2VuZXJhdGlvbiwKKwkJCSBzdHJ1Y3QgYnRyZnNfc3VwZXJfYmxvY2ssIGNodW5rX3Jvb3RfZ2VuZXJhdGlvbiwgNjQpOworQlRSRlNfU0VUR0VUX1NUQUNLX0ZVTkNTKHN1cGVyX3Jvb3RfbGV2ZWwsIHN0cnVjdCBidHJmc19zdXBlcl9ibG9jaywKKwkJCSByb290X2xldmVsLCA4KTsKK0JUUkZTX1NFVEdFVF9TVEFDS19GVU5DUyhzdXBlcl9jaHVua19yb290LCBzdHJ1Y3QgYnRyZnNfc3VwZXJfYmxvY2ssCisJCQkgY2h1bmtfcm9vdCwgNjQpOworQlRSRlNfU0VUR0VUX1NUQUNLX0ZVTkNTKHN1cGVyX2NodW5rX3Jvb3RfbGV2ZWwsIHN0cnVjdCBidHJmc19zdXBlcl9ibG9jaywKKwkJCSBjaHVua19yb290X2xldmVsLCA4KTsKK0JUUkZTX1NFVEdFVF9TVEFDS19GVU5DUyhzdXBlcl9sb2dfcm9vdCwgc3RydWN0IGJ0cmZzX3N1cGVyX2Jsb2NrLAorCQkJIGxvZ19yb290LCA2NCk7CitCVFJGU19TRVRHRVRfU1RBQ0tfRlVOQ1Moc3VwZXJfbG9nX3Jvb3RfdHJhbnNpZCwgc3RydWN0IGJ0cmZzX3N1cGVyX2Jsb2NrLAorCQkJIGxvZ19yb290X3RyYW5zaWQsIDY0KTsKK0JUUkZTX1NFVEdFVF9TVEFDS19GVU5DUyhzdXBlcl9sb2dfcm9vdF9sZXZlbCwgc3RydWN0IGJ0cmZzX3N1cGVyX2Jsb2NrLAorCQkJIGxvZ19yb290X2xldmVsLCA4KTsKK0JUUkZTX1NFVEdFVF9TVEFDS19GVU5DUyhzdXBlcl90b3RhbF9ieXRlcywgc3RydWN0IGJ0cmZzX3N1cGVyX2Jsb2NrLAorCQkJIHRvdGFsX2J5dGVzLCA2NCk7CitCVFJGU19TRVRHRVRfU1RBQ0tfRlVOQ1Moc3VwZXJfYnl0ZXNfdXNlZCwgc3RydWN0IGJ0cmZzX3N1cGVyX2Jsb2NrLAorCQkJIGJ5dGVzX3VzZWQsIDY0KTsKK0JUUkZTX1NFVEdFVF9TVEFDS19GVU5DUyhzdXBlcl9zZWN0b3JzaXplLCBzdHJ1Y3QgYnRyZnNfc3VwZXJfYmxvY2ssCisJCQkgc2VjdG9yc2l6ZSwgMzIpOworQlRSRlNfU0VUR0VUX1NUQUNLX0ZVTkNTKHN1cGVyX25vZGVzaXplLCBzdHJ1Y3QgYnRyZnNfc3VwZXJfYmxvY2ssCisJCQkgbm9kZXNpemUsIDMyKTsKK0JUUkZTX1NFVEdFVF9TVEFDS19GVU5DUyhzdXBlcl9sZWFmc2l6ZSwgc3RydWN0IGJ0cmZzX3N1cGVyX2Jsb2NrLAorCQkJIGxlYWZzaXplLCAzMik7CitCVFJGU19TRVRHRVRfU1RBQ0tfRlVOQ1Moc3VwZXJfc3RyaXBlc2l6ZSwgc3RydWN0IGJ0cmZzX3N1cGVyX2Jsb2NrLAorCQkJIHN0cmlwZXNpemUsIDMyKTsKK0JUUkZTX1NFVEdFVF9TVEFDS19GVU5DUyhzdXBlcl9yb290X2Rpciwgc3RydWN0IGJ0cmZzX3N1cGVyX2Jsb2NrLAorCQkJIHJvb3RfZGlyX29iamVjdGlkLCA2NCk7CitCVFJGU19TRVRHRVRfU1RBQ0tfRlVOQ1Moc3VwZXJfbnVtX2RldmljZXMsIHN0cnVjdCBidHJmc19zdXBlcl9ibG9jaywKKwkJCSBudW1fZGV2aWNlcywgNjQpOworQlRSRlNfU0VUR0VUX1NUQUNLX0ZVTkNTKHN1cGVyX2NvbXBhdF9mbGFncywgc3RydWN0IGJ0cmZzX3N1cGVyX2Jsb2NrLAorCQkJIGNvbXBhdF9mbGFncywgNjQpOworQlRSRlNfU0VUR0VUX1NUQUNLX0ZVTkNTKHN1cGVyX2NvbXBhdF9yb19mbGFncywgc3RydWN0IGJ0cmZzX3N1cGVyX2Jsb2NrLAorCQkJIGNvbXBhdF9mbGFncywgNjQpOworQlRSRlNfU0VUR0VUX1NUQUNLX0ZVTkNTKHN1cGVyX2luY29tcGF0X2ZsYWdzLCBzdHJ1Y3QgYnRyZnNfc3VwZXJfYmxvY2ssCisJCQkgaW5jb21wYXRfZmxhZ3MsIDY0KTsKK0JUUkZTX1NFVEdFVF9TVEFDS19GVU5DUyhzdXBlcl9jc3VtX3R5cGUsIHN0cnVjdCBidHJmc19zdXBlcl9ibG9jaywKKwkJCSBjc3VtX3R5cGUsIDE2KTsKKworc3RhdGljIGlubGluZSBpbnQgYnRyZnNfc3VwZXJfY3N1bV9zaXplKHN0cnVjdCBidHJmc19zdXBlcl9ibG9jayAqcykKK3sKKwlpbnQgdCA9IGJ0cmZzX3N1cGVyX2NzdW1fdHlwZShzKTsKKwlCVUdfT04odCA+PSBBUlJBWV9TSVpFKGJ0cmZzX2NzdW1fc2l6ZXMpKTsKKwlyZXR1cm4gYnRyZnNfY3N1bV9zaXplc1t0XTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGJ0cmZzX2xlYWZfZGF0YShzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqbCkKK3sKKwlyZXR1cm4gb2Zmc2V0b2Yoc3RydWN0IGJ0cmZzX2xlYWYsIGl0ZW1zKTsKK30KKworLyogc3RydWN0IGJ0cmZzX2ZpbGVfZXh0ZW50X2l0ZW0gKi8KK0JUUkZTX1NFVEdFVF9GVU5DUyhmaWxlX2V4dGVudF90eXBlLCBzdHJ1Y3QgYnRyZnNfZmlsZV9leHRlbnRfaXRlbSwgdHlwZSwgOCk7CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZworYnRyZnNfZmlsZV9leHRlbnRfaW5saW5lX3N0YXJ0KHN0cnVjdCBidHJmc19maWxlX2V4dGVudF9pdGVtICplKQoreworCXVuc2lnbmVkIGxvbmcgb2Zmc2V0ID0gKHVuc2lnbmVkIGxvbmcpZTsKKwlvZmZzZXQgKz0gb2Zmc2V0b2Yoc3RydWN0IGJ0cmZzX2ZpbGVfZXh0ZW50X2l0ZW0sIGRpc2tfYnl0ZW5yKTsKKwlyZXR1cm4gb2Zmc2V0OworfQorCitzdGF0aWMgaW5saW5lIHUzMiBidHJmc19maWxlX2V4dGVudF9jYWxjX2lubGluZV9zaXplKHUzMiBkYXRhc2l6ZSkKK3sKKwlyZXR1cm4gb2Zmc2V0b2Yoc3RydWN0IGJ0cmZzX2ZpbGVfZXh0ZW50X2l0ZW0sIGRpc2tfYnl0ZW5yKSArIGRhdGFzaXplOworfQorCitCVFJGU19TRVRHRVRfRlVOQ1MoZmlsZV9leHRlbnRfZGlza19ieXRlbnIsIHN0cnVjdCBidHJmc19maWxlX2V4dGVudF9pdGVtLAorCQkgICBkaXNrX2J5dGVuciwgNjQpOworQlRSRlNfU0VUR0VUX0ZVTkNTKGZpbGVfZXh0ZW50X2dlbmVyYXRpb24sIHN0cnVjdCBidHJmc19maWxlX2V4dGVudF9pdGVtLAorCQkgICBnZW5lcmF0aW9uLCA2NCk7CitCVFJGU19TRVRHRVRfRlVOQ1MoZmlsZV9leHRlbnRfZGlza19udW1fYnl0ZXMsIHN0cnVjdCBidHJmc19maWxlX2V4dGVudF9pdGVtLAorCQkgICBkaXNrX251bV9ieXRlcywgNjQpOworQlRSRlNfU0VUR0VUX0ZVTkNTKGZpbGVfZXh0ZW50X29mZnNldCwgc3RydWN0IGJ0cmZzX2ZpbGVfZXh0ZW50X2l0ZW0sCisJCSAgb2Zmc2V0LCA2NCk7CitCVFJGU19TRVRHRVRfRlVOQ1MoZmlsZV9leHRlbnRfbnVtX2J5dGVzLCBzdHJ1Y3QgYnRyZnNfZmlsZV9leHRlbnRfaXRlbSwKKwkJICAgbnVtX2J5dGVzLCA2NCk7CitCVFJGU19TRVRHRVRfRlVOQ1MoZmlsZV9leHRlbnRfcmFtX2J5dGVzLCBzdHJ1Y3QgYnRyZnNfZmlsZV9leHRlbnRfaXRlbSwKKwkJICAgcmFtX2J5dGVzLCA2NCk7CitCVFJGU19TRVRHRVRfRlVOQ1MoZmlsZV9leHRlbnRfY29tcHJlc3Npb24sIHN0cnVjdCBidHJmc19maWxlX2V4dGVudF9pdGVtLAorCQkgICBjb21wcmVzc2lvbiwgOCk7CitCVFJGU19TRVRHRVRfRlVOQ1MoZmlsZV9leHRlbnRfZW5jcnlwdGlvbiwgc3RydWN0IGJ0cmZzX2ZpbGVfZXh0ZW50X2l0ZW0sCisJCSAgIGVuY3J5cHRpb24sIDgpOworQlRSRlNfU0VUR0VUX0ZVTkNTKGZpbGVfZXh0ZW50X290aGVyX2VuY29kaW5nLCBzdHJ1Y3QgYnRyZnNfZmlsZV9leHRlbnRfaXRlbSwKKwkJICAgb3RoZXJfZW5jb2RpbmcsIDE2KTsKKworLyogdGhpcyByZXR1cm5zIHRoZSBudW1iZXIgb2YgZmlsZSBieXRlcyByZXByZXNlbnRlZCBieSB0aGUgaW5saW5lIGl0ZW0uCisgKiBJZiBhbiBpdGVtIGlzIGNvbXByZXNzZWQsIHRoaXMgaXMgdGhlIHVuY29tcHJlc3NlZCBzaXplCisgKi8KK3N0YXRpYyBpbmxpbmUgdTMyIGJ0cmZzX2ZpbGVfZXh0ZW50X2lubGluZV9sZW4oc3RydWN0IGV4dGVudF9idWZmZXIgKmViLAorCQkJCQkgICAgICAgc3RydWN0IGJ0cmZzX2ZpbGVfZXh0ZW50X2l0ZW0gKmUpCit7CisJcmV0dXJuIGJ0cmZzX2ZpbGVfZXh0ZW50X3JhbV9ieXRlcyhlYiwgZSk7Cit9CisKKy8qCisgKiB0aGlzIHJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyB1c2VkIGJ5IHRoZSBpdGVtIG9uIGRpc2ssIG1pbnVzIHRoZQorICogc2l6ZSBvZiBhbnkgZXh0ZW50IGhlYWRlcnMuICBJZiBhIGZpbGUgaXMgY29tcHJlc3NlZCBvbiBkaXNrLCB0aGlzIGlzCisgKiB0aGUgY29tcHJlc3NlZCBzaXplCisgKi8KK3N0YXRpYyBpbmxpbmUgdTMyIGJ0cmZzX2ZpbGVfZXh0ZW50X2lubGluZV9pdGVtX2xlbihzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqZWIsCisJCQkJCQkgICAgc3RydWN0IGJ0cmZzX2l0ZW0gKmUpCit7CisJdW5zaWduZWQgbG9uZyBvZmZzZXQ7CisJb2Zmc2V0ID0gb2Zmc2V0b2Yoc3RydWN0IGJ0cmZzX2ZpbGVfZXh0ZW50X2l0ZW0sIGRpc2tfYnl0ZW5yKTsKKwlyZXR1cm4gYnRyZnNfaXRlbV9zaXplKGViLCBlKSAtIG9mZnNldDsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgYnRyZnNfcm9vdCAqYnRyZnNfc2Ioc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlyZXR1cm4gc2ItPnNfZnNfaW5mbzsKK30KKworc3RhdGljIGlubGluZSBpbnQgYnRyZnNfc2V0X3Jvb3RfbmFtZShzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwKKwkJCQkgICAgICBjb25zdCBjaGFyICpuYW1lLCBpbnQgbGVuKQoreworCS8qIGlmIHdlIGFscmVhZHkgaGF2ZSBhIG5hbWUganVzdCBmcmVlIGl0ICovCisJa2ZyZWUocm9vdC0+bmFtZSk7CisKKwlyb290LT5uYW1lID0ga21hbGxvYyhsZW4rMSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFyb290LT5uYW1lKQorCQlyZXR1cm4gLUVOT01FTTsKKworCW1lbWNweShyb290LT5uYW1lLCBuYW1lLCBsZW4pOworCXJvb3QtPm5hbWVbbGVuXSA9ICdcMCc7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB1MzIgYnRyZnNfbGV2ZWxfc2l6ZShzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwgaW50IGxldmVsKQoreworCWlmIChsZXZlbCA9PSAwKQorCQlyZXR1cm4gcm9vdC0+bGVhZnNpemU7CisJcmV0dXJuIHJvb3QtPm5vZGVzaXplOworfQorCisvKiBoZWxwZXIgZnVuY3Rpb24gdG8gY2FzdCBpbnRvIHRoZSBkYXRhIGFyZWEgb2YgdGhlIGxlYWYuICovCisjZGVmaW5lIGJ0cmZzX2l0ZW1fcHRyKGxlYWYsIHNsb3QsIHR5cGUpIFwKKwkoKHR5cGUgKikoYnRyZnNfbGVhZl9kYXRhKGxlYWYpICsgXAorCWJ0cmZzX2l0ZW1fb2Zmc2V0X25yKGxlYWYsIHNsb3QpKSkKKworI2RlZmluZSBidHJmc19pdGVtX3B0cl9vZmZzZXQobGVhZiwgc2xvdCkgXAorCSgodW5zaWduZWQgbG9uZykoYnRyZnNfbGVhZl9kYXRhKGxlYWYpICsgXAorCWJ0cmZzX2l0ZW1fb2Zmc2V0X25yKGxlYWYsIHNsb3QpKSkKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgZGVudHJ5ICpmZGVudHJ5KHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiBmaWxlLT5mX3BhdGguZGVudHJ5OworfQorCisvKiBleHRlbnQtdHJlZS5jICovCitpbnQgYnRyZnNfbG9va3VwX2V4dGVudChzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwgdTY0IHN0YXJ0LCB1NjQgbGVuKTsKK2ludCBidHJmc19sb29rdXBfZXh0ZW50X3JlZihzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKKwkJCSAgICBzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwgdTY0IGJ5dGVuciwKKwkJCSAgICB1NjQgbnVtX2J5dGVzLCB1MzIgKnJlZnMpOworaW50IGJ0cmZzX3VwZGF0ZV9waW5uZWRfZXh0ZW50cyhzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwKKwkJCQl1NjQgYnl0ZW5yLCB1NjQgbnVtLCBpbnQgcGluKTsKK2ludCBidHJmc19kcm9wX2xlYWZfcmVmKHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAorCQkJc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsIHN0cnVjdCBleHRlbnRfYnVmZmVyICpsZWFmKTsKK2ludCBidHJmc19jcm9zc19yZWZfZXhpc3Qoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCisJCQkgIHN0cnVjdCBidHJmc19yb290ICpyb290LCB1NjQgb2JqZWN0aWQsIHU2NCBieXRlbnIpOworaW50IGJ0cmZzX2V4dGVudF9wb3N0X29wKHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAorCQkJIHN0cnVjdCBidHJmc19yb290ICpyb290KTsKK2ludCBidHJmc19jb3B5X3Bpbm5lZChzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwgc3RydWN0IGV4dGVudF9pb190cmVlICpjb3B5KTsKK3N0cnVjdCBidHJmc19ibG9ja19ncm91cF9jYWNoZSAqYnRyZnNfbG9va3VwX2Jsb2NrX2dyb3VwKAorCQkJCQkJIHN0cnVjdCBidHJmc19mc19pbmZvICppbmZvLAorCQkJCQkJIHU2NCBieXRlbnIpOwordTY0IGJ0cmZzX2ZpbmRfYmxvY2tfZ3JvdXAoc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsCisJCQkgICB1NjQgc2VhcmNoX3N0YXJ0LCB1NjQgc2VhcmNoX2hpbnQsIGludCBvd25lcik7CitzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqYnRyZnNfYWxsb2NfZnJlZV9ibG9jayhzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKKwkJCQkJICAgICBzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwKKwkJCQkJICAgICB1MzIgYmxvY2tzaXplLCB1NjQgcGFyZW50LAorCQkJCQkgICAgIHU2NCByb290X29iamVjdGlkLAorCQkJCQkgICAgIHU2NCByZWZfZ2VuZXJhdGlvbiwKKwkJCQkJICAgICBpbnQgbGV2ZWwsCisJCQkJCSAgICAgdTY0IGhpbnQsCisJCQkJCSAgICAgdTY0IGVtcHR5X3NpemUpOworc3RydWN0IGV4dGVudF9idWZmZXIgKmJ0cmZzX2luaXRfbmV3X2J1ZmZlcihzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKKwkJCQkJICAgIHN0cnVjdCBidHJmc19yb290ICpyb290LAorCQkJCQkgICAgdTY0IGJ5dGVuciwgdTMyIGJsb2Nrc2l6ZSk7CitpbnQgYnRyZnNfYWxsb2NfZXh0ZW50KHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAorCQkgICAgICAgc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsCisJCSAgICAgICB1NjQgbnVtX2J5dGVzLCB1NjQgcGFyZW50LCB1NjQgbWluX2J5dGVzLAorCQkgICAgICAgdTY0IHJvb3Rfb2JqZWN0aWQsIHU2NCByZWZfZ2VuZXJhdGlvbiwKKwkJICAgICAgIHU2NCBvd25lciwgdTY0IGVtcHR5X3NpemUsIHU2NCBoaW50X2J5dGUsCisJCSAgICAgICB1NjQgc2VhcmNoX2VuZCwgc3RydWN0IGJ0cmZzX2tleSAqaW5zLCB1NjQgZGF0YSk7CitpbnQgYnRyZnNfYWxsb2NfcmVzZXJ2ZWRfZXh0ZW50KHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAorCQkJCXN0cnVjdCBidHJmc19yb290ICpyb290LCB1NjQgcGFyZW50LAorCQkJCXU2NCByb290X29iamVjdGlkLCB1NjQgcmVmX2dlbmVyYXRpb24sCisJCQkJdTY0IG93bmVyLCBzdHJ1Y3QgYnRyZnNfa2V5ICppbnMpOworaW50IGJ0cmZzX2FsbG9jX2xvZ2dlZF9leHRlbnQoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCisJCQkJc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsIHU2NCBwYXJlbnQsCisJCQkJdTY0IHJvb3Rfb2JqZWN0aWQsIHU2NCByZWZfZ2VuZXJhdGlvbiwKKwkJCQl1NjQgb3duZXIsIHN0cnVjdCBidHJmc19rZXkgKmlucyk7CitpbnQgYnRyZnNfcmVzZXJ2ZV9leHRlbnQoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCisJCQkJICBzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwKKwkJCQkgIHU2NCBudW1fYnl0ZXMsIHU2NCBtaW5fYWxsb2Nfc2l6ZSwKKwkJCQkgIHU2NCBlbXB0eV9zaXplLCB1NjQgaGludF9ieXRlLAorCQkJCSAgdTY0IHNlYXJjaF9lbmQsIHN0cnVjdCBidHJmc19rZXkgKmlucywKKwkJCQkgIHU2NCBkYXRhKTsKK2ludCBidHJmc19pbmNfcmVmKHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLCBzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwKKwkJICBzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqb3JpZ19idWYsIHN0cnVjdCBleHRlbnRfYnVmZmVyICpidWYsCisJCSAgdTMyICpucl9leHRlbnRzKTsKK2ludCBidHJmc19jYWNoZV9yZWYoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsIHN0cnVjdCBidHJmc19yb290ICpyb290LAorCQkgICAgc3RydWN0IGV4dGVudF9idWZmZXIgKmJ1ZiwgdTMyIG5yX2V4dGVudHMpOworaW50IGJ0cmZzX3VwZGF0ZV9yZWYoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCisJCSAgICAgc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsIHN0cnVjdCBleHRlbnRfYnVmZmVyICpvcmlnX2J1ZiwKKwkJICAgICBzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqYnVmLCBpbnQgc3RhcnRfc2xvdCwgaW50IG5yKTsKK2ludCBidHJmc19mcmVlX2V4dGVudChzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKKwkJICAgICAgc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsCisJCSAgICAgIHU2NCBieXRlbnIsIHU2NCBudW1fYnl0ZXMsIHU2NCBwYXJlbnQsCisJCSAgICAgIHU2NCByb290X29iamVjdGlkLCB1NjQgcmVmX2dlbmVyYXRpb24sCisJCSAgICAgIHU2NCBvd25lcl9vYmplY3RpZCwgaW50IHBpbik7CitpbnQgYnRyZnNfZnJlZV9yZXNlcnZlZF9leHRlbnQoc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsIHU2NCBzdGFydCwgdTY0IGxlbik7CitpbnQgYnRyZnNfZmluaXNoX2V4dGVudF9jb21taXQoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCisJCQkgICAgICAgc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsCisJCQkgICAgICAgc3RydWN0IGV4dGVudF9pb190cmVlICp1bnBpbik7CitpbnQgYnRyZnNfaW5jX2V4dGVudF9yZWYoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCisJCQkgc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsCisJCQkgdTY0IGJ5dGVuciwgdTY0IG51bV9ieXRlcywgdTY0IHBhcmVudCwKKwkJCSB1NjQgcm9vdF9vYmplY3RpZCwgdTY0IHJlZl9nZW5lcmF0aW9uLAorCQkJIHU2NCBvd25lcl9vYmplY3RpZCk7CitpbnQgYnRyZnNfdXBkYXRlX2V4dGVudF9yZWYoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCisJCQkgICAgc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsIHU2NCBieXRlbnIsCisJCQkgICAgdTY0IG9yaWdfcGFyZW50LCB1NjQgcGFyZW50LAorCQkJICAgIHU2NCByb290X29iamVjdGlkLCB1NjQgcmVmX2dlbmVyYXRpb24sCisJCQkgICAgdTY0IG93bmVyX29iamVjdGlkKTsKK2ludCBidHJmc193cml0ZV9kaXJ0eV9ibG9ja19ncm91cHMoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCisJCQkJICAgIHN0cnVjdCBidHJmc19yb290ICpyb290KTsKK2ludCBidHJmc19leHRlbnRfcmVhZG9ubHkoc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsIHU2NCBieXRlbnIpOworaW50IGJ0cmZzX2ZyZWVfYmxvY2tfZ3JvdXBzKHN0cnVjdCBidHJmc19mc19pbmZvICppbmZvKTsKK2ludCBidHJmc19yZWFkX2Jsb2NrX2dyb3VwcyhzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCk7CitpbnQgYnRyZnNfbWFrZV9ibG9ja19ncm91cChzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKKwkJCSAgIHN0cnVjdCBidHJmc19yb290ICpyb290LCB1NjQgYnl0ZXNfdXNlZCwKKwkJCSAgIHU2NCB0eXBlLCB1NjQgY2h1bmtfb2JqZWN0aWQsIHU2NCBjaHVua19vZmZzZXQsCisJCQkgICB1NjQgc2l6ZSk7CitpbnQgYnRyZnNfcmVtb3ZlX2Jsb2NrX2dyb3VwKHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAorCQkJICAgICBzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwgdTY0IGdyb3VwX3N0YXJ0KTsKK2ludCBidHJmc19yZWxvY2F0ZV9ibG9ja19ncm91cChzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwgdTY0IGdyb3VwX3N0YXJ0KTsKK2ludCBidHJmc19mcmVlX3JlbG9jX3Jvb3Qoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCisJCQkgIHN0cnVjdCBidHJmc19yb290ICpyb290KTsKK2ludCBidHJmc19kcm9wX2RlYWRfcmVsb2Nfcm9vdHMoc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QpOworaW50IGJ0cmZzX3JlbG9jX3RyZWVfY2FjaGVfcmVmKHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAorCQkJICAgICAgIHN0cnVjdCBidHJmc19yb290ICpyb290LAorCQkJICAgICAgIHN0cnVjdCBleHRlbnRfYnVmZmVyICpidWYsIHU2NCBvcmlnX3N0YXJ0KTsKK2ludCBidHJmc19hZGRfZGVhZF9yZWxvY19yb290KHN0cnVjdCBidHJmc19yb290ICpyb290KTsKK2ludCBidHJmc19jbGVhbnVwX3JlbG9jX3RyZWVzKHN0cnVjdCBidHJmc19yb290ICpyb290KTsKK2ludCBidHJmc19yZWxvY19jbG9uZV9jc3VtcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1NjQgZmlsZV9wb3MsIHU2NCBsZW4pOwordTY0IGJ0cmZzX3JlZHVjZV9hbGxvY19wcm9maWxlKHN0cnVjdCBidHJmc19yb290ICpyb290LCB1NjQgZmxhZ3MpOworLyogY3RyZWUuYyAqLworaW50IGJ0cmZzX3ByZXZpb3VzX2l0ZW0oc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsCisJCQlzdHJ1Y3QgYnRyZnNfcGF0aCAqcGF0aCwgdTY0IG1pbl9vYmplY3RpZCwKKwkJCWludCB0eXBlKTsKK2ludCBidHJmc19tZXJnZV9wYXRoKHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAorCQkgICAgIHN0cnVjdCBidHJmc19yb290ICpyb290LAorCQkgICAgIHN0cnVjdCBidHJmc19rZXkgKm5vZGVfa2V5cywKKwkJICAgICB1NjQgKm5vZGVzLCBpbnQgbG93ZXN0X2xldmVsKTsKK2ludCBidHJmc19zZXRfaXRlbV9rZXlfc2FmZShzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKKwkJCSAgICBzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwgc3RydWN0IGJ0cmZzX3BhdGggKnBhdGgsCisJCQkgICAgc3RydWN0IGJ0cmZzX2tleSAqbmV3X2tleSk7CitzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqYnRyZnNfcm9vdF9ub2RlKHN0cnVjdCBidHJmc19yb290ICpyb290KTsKK3N0cnVjdCBleHRlbnRfYnVmZmVyICpidHJmc19sb2NrX3Jvb3Rfbm9kZShzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCk7CitpbnQgYnRyZnNfZmluZF9uZXh0X2tleShzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwgc3RydWN0IGJ0cmZzX3BhdGggKnBhdGgsCisJCQlzdHJ1Y3QgYnRyZnNfa2V5ICprZXksIGludCBsb3dlc3RfbGV2ZWwsCisJCQlpbnQgY2FjaGVfb25seSwgdTY0IG1pbl90cmFucyk7CitpbnQgYnRyZnNfc2VhcmNoX2ZvcndhcmQoc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsIHN0cnVjdCBidHJmc19rZXkgKm1pbl9rZXksCisJCQkgc3RydWN0IGJ0cmZzX2tleSAqbWF4X2tleSwKKwkJCSBzdHJ1Y3QgYnRyZnNfcGF0aCAqcGF0aCwgaW50IGNhY2hlX29ubHksCisJCQkgdTY0IG1pbl90cmFucyk7CitpbnQgYnRyZnNfY293X2Jsb2NrKHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAorCQkgICAgc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsIHN0cnVjdCBleHRlbnRfYnVmZmVyICpidWYsCisJCSAgICBzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqcGFyZW50LCBpbnQgcGFyZW50X3Nsb3QsCisJCSAgICBzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqKmNvd19yZXQsIHU2NCBwcmVhbGxvY19kZXN0KTsKK2ludCBidHJmc19jb3B5X3Jvb3Qoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCisJCSAgICAgIHN0cnVjdCBidHJmc19yb290ICpyb290LAorCQkgICAgICBzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqYnVmLAorCQkgICAgICBzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqKmNvd19yZXQsIHU2NCBuZXdfcm9vdF9vYmplY3RpZCk7CitpbnQgYnRyZnNfZXh0ZW5kX2l0ZW0oc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsIHN0cnVjdCBidHJmc19yb290CisJCSAgICAgICpyb290LCBzdHJ1Y3QgYnRyZnNfcGF0aCAqcGF0aCwgdTMyIGRhdGFfc2l6ZSk7CitpbnQgYnRyZnNfdHJ1bmNhdGVfaXRlbShzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKKwkJCXN0cnVjdCBidHJmc19yb290ICpyb290LAorCQkJc3RydWN0IGJ0cmZzX3BhdGggKnBhdGgsCisJCQl1MzIgbmV3X3NpemUsIGludCBmcm9tX2VuZCk7CitpbnQgYnRyZnNfc3BsaXRfaXRlbShzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKKwkJICAgICBzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwKKwkJICAgICBzdHJ1Y3QgYnRyZnNfcGF0aCAqcGF0aCwKKwkJICAgICBzdHJ1Y3QgYnRyZnNfa2V5ICpuZXdfa2V5LAorCQkgICAgIHVuc2lnbmVkIGxvbmcgc3BsaXRfb2Zmc2V0KTsKK2ludCBidHJmc19zZWFyY2hfc2xvdChzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywgc3RydWN0IGJ0cmZzX3Jvb3QKKwkJICAgICAgKnJvb3QsIHN0cnVjdCBidHJmc19rZXkgKmtleSwgc3RydWN0IGJ0cmZzX3BhdGggKnAsIGludAorCQkgICAgICBpbnNfbGVuLCBpbnQgY293KTsKK2ludCBidHJmc19yZWFsbG9jX25vZGUoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCisJCSAgICAgICBzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwgc3RydWN0IGV4dGVudF9idWZmZXIgKnBhcmVudCwKKwkJICAgICAgIGludCBzdGFydF9zbG90LCBpbnQgY2FjaGVfb25seSwgdTY0ICpsYXN0X3JldCwKKwkJICAgICAgIHN0cnVjdCBidHJmc19rZXkgKnByb2dyZXNzKTsKK3ZvaWQgYnRyZnNfcmVsZWFzZV9wYXRoKHN0cnVjdCBidHJmc19yb290ICpyb290LCBzdHJ1Y3QgYnRyZnNfcGF0aCAqcCk7CitzdHJ1Y3QgYnRyZnNfcGF0aCAqYnRyZnNfYWxsb2NfcGF0aCh2b2lkKTsKK3ZvaWQgYnRyZnNfZnJlZV9wYXRoKHN0cnVjdCBidHJmc19wYXRoICpwKTsKK3ZvaWQgYnRyZnNfaW5pdF9wYXRoKHN0cnVjdCBidHJmc19wYXRoICpwKTsKK2ludCBidHJmc19kZWxfaXRlbXMoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsIHN0cnVjdCBidHJmc19yb290ICpyb290LAorCQkgICBzdHJ1Y3QgYnRyZnNfcGF0aCAqcGF0aCwgaW50IHNsb3QsIGludCBucik7CitpbnQgYnRyZnNfZGVsX2xlYWYoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCisJCQkgICAgc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsCisJCQkgICAgc3RydWN0IGJ0cmZzX3BhdGggKnBhdGgsIHU2NCBieXRlbnIpOworc3RhdGljIGlubGluZSBpbnQgYnRyZnNfZGVsX2l0ZW0oc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCisJCQkJIHN0cnVjdCBidHJmc19yb290ICpyb290LAorCQkJCSBzdHJ1Y3QgYnRyZnNfcGF0aCAqcGF0aCkKK3sKKwlyZXR1cm4gYnRyZnNfZGVsX2l0ZW1zKHRyYW5zLCByb290LCBwYXRoLCBwYXRoLT5zbG90c1swXSwgMSk7Cit9CisKK2ludCBidHJmc19pbnNlcnRfaXRlbShzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywgc3RydWN0IGJ0cmZzX3Jvb3QKKwkJICAgICAgKnJvb3QsIHN0cnVjdCBidHJmc19rZXkgKmtleSwgdm9pZCAqZGF0YSwgdTMyIGRhdGFfc2l6ZSk7CitpbnQgYnRyZnNfaW5zZXJ0X3NvbWVfaXRlbXMoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCisJCQkgICAgc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsCisJCQkgICAgc3RydWN0IGJ0cmZzX3BhdGggKnBhdGgsCisJCQkgICAgc3RydWN0IGJ0cmZzX2tleSAqY3B1X2tleSwgdTMyICpkYXRhX3NpemUsCisJCQkgICAgaW50IG5yKTsKK2ludCBidHJmc19pbnNlcnRfZW1wdHlfaXRlbXMoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCisJCQkgICAgIHN0cnVjdCBidHJmc19yb290ICpyb290LAorCQkJICAgICBzdHJ1Y3QgYnRyZnNfcGF0aCAqcGF0aCwKKwkJCSAgICAgc3RydWN0IGJ0cmZzX2tleSAqY3B1X2tleSwgdTMyICpkYXRhX3NpemUsIGludCBucik7CisKK3N0YXRpYyBpbmxpbmUgaW50IGJ0cmZzX2luc2VydF9lbXB0eV9pdGVtKHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAorCQkJCQkgIHN0cnVjdCBidHJmc19yb290ICpyb290LAorCQkJCQkgIHN0cnVjdCBidHJmc19wYXRoICpwYXRoLAorCQkJCQkgIHN0cnVjdCBidHJmc19rZXkgKmtleSwKKwkJCQkJICB1MzIgZGF0YV9zaXplKQoreworCXJldHVybiBidHJmc19pbnNlcnRfZW1wdHlfaXRlbXModHJhbnMsIHJvb3QsIHBhdGgsIGtleSwgJmRhdGFfc2l6ZSwgMSk7Cit9CisKK2ludCBidHJmc19uZXh0X2xlYWYoc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsIHN0cnVjdCBidHJmc19wYXRoICpwYXRoKTsKK2ludCBidHJmc19wcmV2X2xlYWYoc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsIHN0cnVjdCBidHJmc19wYXRoICpwYXRoKTsKK2ludCBidHJmc19sZWFmX2ZyZWVfc3BhY2Uoc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsIHN0cnVjdCBleHRlbnRfYnVmZmVyICpsZWFmKTsKK2ludCBidHJmc19kcm9wX3NuYXBzaG90KHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLCBzdHJ1Y3QgYnRyZnNfcm9vdAorCQkJKnJvb3QpOworaW50IGJ0cmZzX2Ryb3Bfc3VidHJlZShzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKKwkJCXN0cnVjdCBidHJmc19yb290ICpyb290LAorCQkJc3RydWN0IGV4dGVudF9idWZmZXIgKm5vZGUsCisJCQlzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqcGFyZW50KTsKKy8qIHJvb3QtaXRlbS5jICovCitpbnQgYnRyZnNfZmluZF9yb290X3JlZihzdHJ1Y3QgYnRyZnNfcm9vdCAqdHJlZV9yb290LAorCQkgICBzdHJ1Y3QgYnRyZnNfcGF0aCAqcGF0aCwKKwkJICAgdTY0IHJvb3RfaWQsIHU2NCByZWZfaWQpOworaW50IGJ0cmZzX2FkZF9yb290X3JlZihzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKKwkJICAgICAgIHN0cnVjdCBidHJmc19yb290ICp0cmVlX3Jvb3QsCisJCSAgICAgICB1NjQgcm9vdF9pZCwgdTggdHlwZSwgdTY0IHJlZl9pZCwKKwkJICAgICAgIHU2NCBkaXJpZCwgdTY0IHNlcXVlbmNlLAorCQkgICAgICAgY29uc3QgY2hhciAqbmFtZSwgaW50IG5hbWVfbGVuKTsKK2ludCBidHJmc19kZWxfcm9vdChzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywgc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsCisJCSAgIHN0cnVjdCBidHJmc19rZXkgKmtleSk7CitpbnQgYnRyZnNfaW5zZXJ0X3Jvb3Qoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsIHN0cnVjdCBidHJmc19yb290CisJCSAgICAgICpyb290LCBzdHJ1Y3QgYnRyZnNfa2V5ICprZXksIHN0cnVjdCBidHJmc19yb290X2l0ZW0KKwkJICAgICAgKml0ZW0pOworaW50IGJ0cmZzX3VwZGF0ZV9yb290KHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLCBzdHJ1Y3QgYnRyZnNfcm9vdAorCQkgICAgICAqcm9vdCwgc3RydWN0IGJ0cmZzX2tleSAqa2V5LCBzdHJ1Y3QgYnRyZnNfcm9vdF9pdGVtCisJCSAgICAgICppdGVtKTsKK2ludCBidHJmc19maW5kX2xhc3Rfcm9vdChzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwgdTY0IG9iamVjdGlkLCBzdHJ1Y3QKKwkJCSBidHJmc19yb290X2l0ZW0gKml0ZW0sIHN0cnVjdCBidHJmc19rZXkgKmtleSk7CitpbnQgYnRyZnNfc2VhcmNoX3Jvb3Qoc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsIHU2NCBzZWFyY2hfc3RhcnQsCisJCSAgICAgIHU2NCAqZm91bmRfb2JqZWN0aWQpOworaW50IGJ0cmZzX2ZpbmRfZGVhZF9yb290cyhzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwgdTY0IG9iamVjdGlkLAorCQkJICBzdHJ1Y3QgYnRyZnNfcm9vdCAqbGF0ZXN0X3Jvb3QpOworLyogZGlyLWl0ZW0uYyAqLworaW50IGJ0cmZzX2luc2VydF9kaXJfaXRlbShzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKKwkJCSAgc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkgIGludCBuYW1lX2xlbiwgdTY0IGRpciwKKwkJCSAgc3RydWN0IGJ0cmZzX2tleSAqbG9jYXRpb24sIHU4IHR5cGUsIHU2NCBpbmRleCk7CitzdHJ1Y3QgYnRyZnNfZGlyX2l0ZW0gKmJ0cmZzX2xvb2t1cF9kaXJfaXRlbShzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKKwkJCQkJICAgICBzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwKKwkJCQkJICAgICBzdHJ1Y3QgYnRyZnNfcGF0aCAqcGF0aCwgdTY0IGRpciwKKwkJCQkJICAgICBjb25zdCBjaGFyICpuYW1lLCBpbnQgbmFtZV9sZW4sCisJCQkJCSAgICAgaW50IG1vZCk7CitzdHJ1Y3QgYnRyZnNfZGlyX2l0ZW0gKgorYnRyZnNfbG9va3VwX2Rpcl9pbmRleF9pdGVtKHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAorCQkJICAgIHN0cnVjdCBidHJmc19yb290ICpyb290LAorCQkJICAgIHN0cnVjdCBidHJmc19wYXRoICpwYXRoLCB1NjQgZGlyLAorCQkJICAgIHU2NCBvYmplY3RpZCwgY29uc3QgY2hhciAqbmFtZSwgaW50IG5hbWVfbGVuLAorCQkJICAgIGludCBtb2QpOworc3RydWN0IGJ0cmZzX2Rpcl9pdGVtICpidHJmc19tYXRjaF9kaXJfaXRlbV9uYW1lKHN0cnVjdCBidHJmc19yb290ICpyb290LAorCQkJICAgICAgc3RydWN0IGJ0cmZzX3BhdGggKnBhdGgsCisJCQkgICAgICBjb25zdCBjaGFyICpuYW1lLCBpbnQgbmFtZV9sZW4pOworaW50IGJ0cmZzX2RlbGV0ZV9vbmVfZGlyX25hbWUoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCisJCQkgICAgICBzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwKKwkJCSAgICAgIHN0cnVjdCBidHJmc19wYXRoICpwYXRoLAorCQkJICAgICAgc3RydWN0IGJ0cmZzX2Rpcl9pdGVtICpkaSk7CitpbnQgYnRyZnNfaW5zZXJ0X3hhdHRyX2l0ZW0oc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCisJCQkgICAgc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkgICAgdTE2IG5hbWVfbGVuLCBjb25zdCB2b2lkICpkYXRhLCB1MTYgZGF0YV9sZW4sCisJCQkgICAgdTY0IGRpcik7CitzdHJ1Y3QgYnRyZnNfZGlyX2l0ZW0gKmJ0cmZzX2xvb2t1cF94YXR0cihzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKKwkJCQkJICBzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwKKwkJCQkJICBzdHJ1Y3QgYnRyZnNfcGF0aCAqcGF0aCwgdTY0IGRpciwKKwkJCQkJICBjb25zdCBjaGFyICpuYW1lLCB1MTYgbmFtZV9sZW4sCisJCQkJCSAgaW50IG1vZCk7CisKKy8qIG9ycGhhbi5jICovCitpbnQgYnRyZnNfaW5zZXJ0X29ycGhhbl9pdGVtKHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAorCQkJICAgICBzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwgdTY0IG9mZnNldCk7CitpbnQgYnRyZnNfZGVsX29ycGhhbl9pdGVtKHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAorCQkJICBzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwgdTY0IG9mZnNldCk7CisKKy8qIGlub2RlLW1hcC5jICovCitpbnQgYnRyZnNfZmluZF9mcmVlX29iamVjdGlkKHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAorCQkJICAgICBzdHJ1Y3QgYnRyZnNfcm9vdCAqZnNfcm9vdCwKKwkJCSAgICAgdTY0IGRpcmlkLCB1NjQgKm9iamVjdGlkKTsKK2ludCBidHJmc19maW5kX2hpZ2hlc3RfaW5vZGUoc3RydWN0IGJ0cmZzX3Jvb3QgKmZzX3Jvb3QsIHU2NCAqb2JqZWN0aWQpOworCisvKiBpbm9kZS1pdGVtLmMgKi8KK2ludCBidHJmc19pbnNlcnRfaW5vZGVfcmVmKHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAorCQkJICAgc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsCisJCQkgICBjb25zdCBjaGFyICpuYW1lLCBpbnQgbmFtZV9sZW4sCisJCQkgICB1NjQgaW5vZGVfb2JqZWN0aWQsIHU2NCByZWZfb2JqZWN0aWQsIHU2NCBpbmRleCk7CitpbnQgYnRyZnNfZGVsX2lub2RlX3JlZihzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKKwkJCSAgIHN0cnVjdCBidHJmc19yb290ICpyb290LAorCQkJICAgY29uc3QgY2hhciAqbmFtZSwgaW50IG5hbWVfbGVuLAorCQkJICAgdTY0IGlub2RlX29iamVjdGlkLCB1NjQgcmVmX29iamVjdGlkLCB1NjQgKmluZGV4KTsKK2ludCBidHJmc19pbnNlcnRfZW1wdHlfaW5vZGUoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCisJCQkgICAgIHN0cnVjdCBidHJmc19yb290ICpyb290LAorCQkJICAgICBzdHJ1Y3QgYnRyZnNfcGF0aCAqcGF0aCwgdTY0IG9iamVjdGlkKTsKK2ludCBidHJmc19sb29rdXBfaW5vZGUoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsIHN0cnVjdCBidHJmc19yb290CisJCSAgICAgICAqcm9vdCwgc3RydWN0IGJ0cmZzX3BhdGggKnBhdGgsCisJCSAgICAgICBzdHJ1Y3QgYnRyZnNfa2V5ICpsb2NhdGlvbiwgaW50IG1vZCk7CisKKy8qIGZpbGUtaXRlbS5jICovCitpbnQgYnRyZnNfZGVsX2NzdW1zKHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAorCQkgICAgc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsIHU2NCBieXRlbnIsIHU2NCBsZW4pOworaW50IGJ0cmZzX2xvb2t1cF9iaW9fc3VtcyhzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwgc3RydWN0IGlub2RlICppbm9kZSwKKwkJCSAgc3RydWN0IGJpbyAqYmlvLCB1MzIgKmRzdCk7CitpbnQgYnRyZnNfaW5zZXJ0X2ZpbGVfZXh0ZW50KHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAorCQkJICAgICBzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwKKwkJCSAgICAgdTY0IG9iamVjdGlkLCB1NjQgcG9zLAorCQkJICAgICB1NjQgZGlza19vZmZzZXQsIHU2NCBkaXNrX251bV9ieXRlcywKKwkJCSAgICAgdTY0IG51bV9ieXRlcywgdTY0IG9mZnNldCwgdTY0IHJhbV9ieXRlcywKKwkJCSAgICAgdTggY29tcHJlc3Npb24sIHU4IGVuY3J5cHRpb24sIHUxNiBvdGhlcl9lbmNvZGluZyk7CitpbnQgYnRyZnNfbG9va3VwX2ZpbGVfZXh0ZW50KHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAorCQkJICAgICBzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwKKwkJCSAgICAgc3RydWN0IGJ0cmZzX3BhdGggKnBhdGgsIHU2NCBvYmplY3RpZCwKKwkJCSAgICAgdTY0IGJ5dGVuciwgaW50IG1vZCk7CitpbnQgYnRyZnNfY3N1bV9maWxlX2Jsb2NrcyhzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKKwkJCSAgIHN0cnVjdCBidHJmc19yb290ICpyb290LAorCQkJICAgc3RydWN0IGJ0cmZzX29yZGVyZWRfc3VtICpzdW1zKTsKK2ludCBidHJmc19jc3VtX29uZV9iaW8oc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCSAgICAgICBzdHJ1Y3QgYmlvICpiaW8sIHU2NCBmaWxlX3N0YXJ0LCBpbnQgY29udGlnKTsKK2ludCBidHJmc19jc3VtX2ZpbGVfYnl0ZXMoc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkgIHU2NCBzdGFydCwgdW5zaWduZWQgbG9uZyBsZW4pOworc3RydWN0IGJ0cmZzX2NzdW1faXRlbSAqYnRyZnNfbG9va3VwX2NzdW0oc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCisJCQkJCSAgc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsCisJCQkJCSAgc3RydWN0IGJ0cmZzX3BhdGggKnBhdGgsCisJCQkJCSAgdTY0IGJ5dGVuciwgaW50IGNvdyk7CitpbnQgYnRyZnNfY3N1bV90cnVuY2F0ZShzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKKwkJCXN0cnVjdCBidHJmc19yb290ICpyb290LCBzdHJ1Y3QgYnRyZnNfcGF0aCAqcGF0aCwKKwkJCXU2NCBpc2l6ZSk7CitpbnQgYnRyZnNfbG9va3VwX2NzdW1zX3JhbmdlKHN0cnVjdCBidHJmc19yb290ICpyb290LCB1NjQgc3RhcnQsCisJCQkgICAgIHU2NCBlbmQsIHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QpOworLyogaW5vZGUuYyAqLworCisvKiBSSEVMIGFuZCBFTCBrZXJuZWxzIGhhdmUgYSBwYXRjaCB0aGF0IHJlbmFtZXMgUEdfY2hlY2tlZCB0byBGc01pc2MgKi8KKyNpZiBkZWZpbmVkKENsZWFyUGFnZUZzTWlzYykgJiYgIWRlZmluZWQoQ2xlYXJQYWdlQ2hlY2tlZCkKKyNkZWZpbmUgQ2xlYXJQYWdlQ2hlY2tlZCBDbGVhclBhZ2VGc01pc2MKKyNkZWZpbmUgU2V0UGFnZUNoZWNrZWQgU2V0UGFnZUZzTWlzYworI2RlZmluZSBQYWdlQ2hlY2tlZCBQYWdlRnNNaXNjCisjZW5kaWYKKworc3RydWN0IGlub2RlICpidHJmc19sb29rdXBfZGVudHJ5KHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpOworaW50IGJ0cmZzX3NldF9pbm9kZV9pbmRleChzdHJ1Y3QgaW5vZGUgKmRpciwgdTY0ICppbmRleCk7CitpbnQgYnRyZnNfdW5saW5rX2lub2RlKHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAorCQkgICAgICAgc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsCisJCSAgICAgICBzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGlub2RlICppbm9kZSwKKwkJICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIGludCBuYW1lX2xlbik7CitpbnQgYnRyZnNfYWRkX2xpbmsoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCisJCSAgIHN0cnVjdCBpbm9kZSAqcGFyZW50X2lub2RlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkgICBjb25zdCBjaGFyICpuYW1lLCBpbnQgbmFtZV9sZW4sIGludCBhZGRfYmFja3JlZiwgdTY0IGluZGV4KTsKK2ludCBidHJmc190cnVuY2F0ZV9pbm9kZV9pdGVtcyhzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKKwkJCSAgICAgICBzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwKKwkJCSAgICAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1NjQgbmV3X3NpemUsCisJCQkgICAgICAgdTMyIG1pbl90eXBlKTsKKworaW50IGJ0cmZzX3N0YXJ0X2RlbGFsbG9jX2lub2RlcyhzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCk7CitpbnQgYnRyZnNfc2V0X2V4dGVudF9kZWxhbGxvYyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1NjQgc3RhcnQsIHU2NCBlbmQpOworaW50IGJ0cmZzX3dyaXRlcGFnZXMoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsCisJCSAgICAgc3RydWN0IHdyaXRlYmFja19jb250cm9sICp3YmMpOworaW50IGJ0cmZzX2NyZWF0ZV9zdWJ2b2xfcm9vdChzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKKwkJCSAgICAgc3RydWN0IGJ0cmZzX3Jvb3QgKm5ld19yb290LCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksCisJCQkgICAgIHU2NCBuZXdfZGlyaWQsIHU2NCBhbGxvY19oaW50KTsKK2ludCBidHJmc19tZXJnZV9iaW9faG9vayhzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgbG9uZyBvZmZzZXQsCisJCQkgc2l6ZV90IHNpemUsIHN0cnVjdCBiaW8gKmJpbywgdW5zaWduZWQgbG9uZyBiaW9fZmxhZ3MpOworCit1bnNpZ25lZCBsb25nIGJ0cmZzX2ZvcmNlX3JhKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLAorCQkJICAgICAgc3RydWN0IGZpbGVfcmFfc3RhdGUgKnJhLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCSAgICAgIHBnb2ZmX3Qgb2Zmc2V0LCBwZ29mZl90IGxhc3RfaW5kZXgpOworaW50IGJ0cmZzX2NoZWNrX2ZyZWVfc3BhY2Uoc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsIHU2NCBudW1fcmVxdWlyZWQsCisJCQkgICBpbnQgZm9yX2RlbCk7CitpbnQgYnRyZnNfcGFnZV9ta3dyaXRlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCBzdHJ1Y3QgcGFnZSAqcGFnZSk7CitpbnQgYnRyZnNfcmVhZHBhZ2Uoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBwYWdlICpwYWdlKTsKK3ZvaWQgYnRyZnNfZGVsZXRlX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpOwordm9pZCBidHJmc19wdXRfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSk7Cit2b2lkIGJ0cmZzX3JlYWRfbG9ja2VkX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpOworaW50IGJ0cmZzX3dyaXRlX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCB3YWl0KTsKK3ZvaWQgYnRyZnNfZGlydHlfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSk7CitzdHJ1Y3QgaW5vZGUgKmJ0cmZzX2FsbG9jX2lub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpOwordm9pZCBidHJmc19kZXN0cm95X2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpOworaW50IGJ0cmZzX2luaXRfY2FjaGVwKHZvaWQpOwordm9pZCBidHJmc19kZXN0cm95X2NhY2hlcCh2b2lkKTsKK2xvbmcgYnRyZnNfaW9jdGxfdHJhbnNfZW5kKHN0cnVjdCBmaWxlICpmaWxlKTsKK3N0cnVjdCBpbm9kZSAqYnRyZnNfaWxvb2t1cChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsIHU2NCBvYmplY3RpZCwKKwkJCSAgICBzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwgaW50IHdhaXQpOworc3RydWN0IGlub2RlICpidHJmc19pZ2V0X2xvY2tlZChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsIHU2NCBvYmplY3RpZCwKKwkJCQlzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCk7CitzdHJ1Y3QgaW5vZGUgKmJ0cmZzX2lnZXQoc3RydWN0IHN1cGVyX2Jsb2NrICpzLCBzdHJ1Y3QgYnRyZnNfa2V5ICpsb2NhdGlvbiwKKwkJCSBzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwgaW50ICppc19uZXcpOworaW50IGJ0cmZzX2NvbW1pdF93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHBhZ2UgKnBhZ2UsCisJCSAgICAgICB1bnNpZ25lZCBmcm9tLCB1bnNpZ25lZCB0byk7CitzdHJ1Y3QgZXh0ZW50X21hcCAqYnRyZnNfZ2V0X2V4dGVudChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgcGFnZSAqcGFnZSwKKwkJCQkgICAgc2l6ZV90IHBhZ2Vfb2Zmc2V0LCB1NjQgc3RhcnQsIHU2NCBlbmQsCisJCQkJICAgIGludCBjcmVhdGUpOworaW50IGJ0cmZzX3VwZGF0ZV9pbm9kZShzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKKwkJCSAgICAgIHN0cnVjdCBidHJmc19yb290ICpyb290LAorCQkJICAgICAgc3RydWN0IGlub2RlICppbm9kZSk7CitpbnQgYnRyZnNfb3JwaGFuX2FkZChzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywgc3RydWN0IGlub2RlICppbm9kZSk7CitpbnQgYnRyZnNfb3JwaGFuX2RlbChzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywgc3RydWN0IGlub2RlICppbm9kZSk7Cit2b2lkIGJ0cmZzX29ycGhhbl9jbGVhbnVwKHN0cnVjdCBidHJmc19yb290ICpyb290KTsKK2ludCBidHJmc19jb250X2V4cGFuZChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBsb2ZmX3Qgc2l6ZSk7CisKKy8qIGlvY3RsLmMgKi8KK2xvbmcgYnRyZnNfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKKworLyogZmlsZS5jICovCitpbnQgYnRyZnNfc3luY19maWxlKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGludCBkYXRhc3luYyk7CitpbnQgYnRyZnNfZHJvcF9leHRlbnRfY2FjaGUoc3RydWN0IGlub2RlICppbm9kZSwgdTY0IHN0YXJ0LCB1NjQgZW5kLAorCQkJICAgIGludCBza2lwX3Bpbm5lZCk7CitpbnQgYnRyZnNfY2hlY2tfZmlsZShzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwgc3RydWN0IGlub2RlICppbm9kZSk7CitleHRlcm4gc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBidHJmc19maWxlX29wZXJhdGlvbnM7CitpbnQgYnRyZnNfZHJvcF9leHRlbnRzKHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAorCQkgICAgICAgc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCSAgICAgICB1NjQgc3RhcnQsIHU2NCBlbmQsIHU2NCBpbmxpbmVfbGltaXQsIHU2NCAqaGludF9ibG9jayk7CitpbnQgYnRyZnNfbWFya19leHRlbnRfd3JpdHRlbihzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKKwkJCSAgICAgIHN0cnVjdCBidHJmc19yb290ICpyb290LAorCQkJICAgICAgc3RydWN0IGlub2RlICppbm9kZSwgdTY0IHN0YXJ0LCB1NjQgZW5kKTsKK2ludCBidHJmc19yZWxlYXNlX2ZpbGUoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpOworCisvKiB0cmVlLWRlZnJhZy5jICovCitpbnQgYnRyZnNfZGVmcmFnX2xlYXZlcyhzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKKwkJCXN0cnVjdCBidHJmc19yb290ICpyb290LCBpbnQgY2FjaGVfb25seSk7CisKKy8qIHN5c2ZzLmMgKi8KK2ludCBidHJmc19pbml0X3N5c2ZzKHZvaWQpOwordm9pZCBidHJmc19leGl0X3N5c2ZzKHZvaWQpOworaW50IGJ0cmZzX3N5c2ZzX2FkZF9zdXBlcihzdHJ1Y3QgYnRyZnNfZnNfaW5mbyAqZnMpOworaW50IGJ0cmZzX3N5c2ZzX2FkZF9yb290KHN0cnVjdCBidHJmc19yb290ICpyb290KTsKK3ZvaWQgYnRyZnNfc3lzZnNfZGVsX3Jvb3Qoc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QpOwordm9pZCBidHJmc19zeXNmc19kZWxfc3VwZXIoc3RydWN0IGJ0cmZzX2ZzX2luZm8gKnJvb3QpOworCisvKiB4YXR0ci5jICovCitzc2l6ZV90IGJ0cmZzX2xpc3R4YXR0cihzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGNoYXIgKmJ1ZmZlciwgc2l6ZV90IHNpemUpOworCisvKiBzdXBlci5jICovCit1NjQgYnRyZnNfcGFyc2Vfc2l6ZShjaGFyICpzdHIpOworaW50IGJ0cmZzX3BhcnNlX29wdGlvbnMoc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsIGNoYXIgKm9wdGlvbnMpOworaW50IGJ0cmZzX3N5bmNfZnMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IHdhaXQpOworCisvKiBhY2wuYyAqLworaW50IGJ0cmZzX2NoZWNrX2FjbChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgbWFzayk7CitpbnQgYnRyZnNfaW5pdF9hY2woc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGlub2RlICpkaXIpOworaW50IGJ0cmZzX2FjbF9jaG1vZChzdHJ1Y3QgaW5vZGUgKmlub2RlKTsKKworLyogZnJlZS1zcGFjZS1jYWNoZS5jICovCitpbnQgYnRyZnNfYWRkX2ZyZWVfc3BhY2Uoc3RydWN0IGJ0cmZzX2Jsb2NrX2dyb3VwX2NhY2hlICpibG9ja19ncm91cCwKKwkJCSB1NjQgYnl0ZW5yLCB1NjQgc2l6ZSk7CitpbnQgYnRyZnNfYWRkX2ZyZWVfc3BhY2VfbG9jayhzdHJ1Y3QgYnRyZnNfYmxvY2tfZ3JvdXBfY2FjaGUgKmJsb2NrX2dyb3VwLAorCQkJICAgICAgdTY0IG9mZnNldCwgdTY0IGJ5dGVzKTsKK2ludCBidHJmc19yZW1vdmVfZnJlZV9zcGFjZShzdHJ1Y3QgYnRyZnNfYmxvY2tfZ3JvdXBfY2FjaGUgKmJsb2NrX2dyb3VwLAorCQkJICAgIHU2NCBieXRlbnIsIHU2NCBzaXplKTsKK2ludCBidHJmc19yZW1vdmVfZnJlZV9zcGFjZV9sb2NrKHN0cnVjdCBidHJmc19ibG9ja19ncm91cF9jYWNoZSAqYmxvY2tfZ3JvdXAsCisJCQkJIHU2NCBvZmZzZXQsIHU2NCBieXRlcyk7Cit2b2lkIGJ0cmZzX3JlbW92ZV9mcmVlX3NwYWNlX2NhY2hlKHN0cnVjdCBidHJmc19ibG9ja19ncm91cF9jYWNoZQorCQkJCSAgICpibG9ja19ncm91cCk7CitzdHJ1Y3QgYnRyZnNfZnJlZV9zcGFjZSAqYnRyZnNfZmluZF9mcmVlX3NwYWNlKHN0cnVjdCBidHJmc19ibG9ja19ncm91cF9jYWNoZQorCQkJCQkgICAgICAgKmJsb2NrX2dyb3VwLCB1NjQgb2Zmc2V0LAorCQkJCQkgICAgICAgdTY0IGJ5dGVzKTsKK3ZvaWQgYnRyZnNfZHVtcF9mcmVlX3NwYWNlKHN0cnVjdCBidHJmc19ibG9ja19ncm91cF9jYWNoZSAqYmxvY2tfZ3JvdXAsCisJCQkgICB1NjQgYnl0ZXMpOwordTY0IGJ0cmZzX2Jsb2NrX2dyb3VwX2ZyZWVfc3BhY2Uoc3RydWN0IGJ0cmZzX2Jsb2NrX2dyb3VwX2NhY2hlICpibG9ja19ncm91cCk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2ZzL2J0cmZzL2Rpci1pdGVtLmMgYi9mcy9idHJmcy9kaXItaXRlbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyNmEwYjIKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9idHJmcy9kaXItaXRlbS5jCkBAIC0wLDAgKzEsMzg2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE9yYWNsZS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIHYyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCisgKiBCb3N0b24sIE1BIDAyMTExMC0xMzA3LCBVU0EuCisgKi8KKworI2luY2x1ZGUgImN0cmVlLmgiCisjaW5jbHVkZSAiZGlzay1pby5oIgorI2luY2x1ZGUgImhhc2guaCIKKyNpbmNsdWRlICJ0cmFuc2FjdGlvbi5oIgorCisvKgorICogaW5zZXJ0IGEgbmFtZSBpbnRvIGEgZGlyZWN0b3J5LCBkb2luZyBvdmVyZmxvdyBwcm9wZXJseSBpZiB0aGVyZSBpcyBhIGhhc2gKKyAqIGNvbGxpc2lvbi4gIGRhdGFfc2l6ZSBpbmRpY2F0ZXMgaG93IGJpZyB0aGUgaXRlbSBpbnNlcnRlZCBzaG91bGQgYmUuICBPbgorICogc3VjY2VzcyBhIHN0cnVjdCBidHJmc19kaXJfaXRlbSBwb2ludGVyIGlzIHJldHVybmVkLCBvdGhlcndpc2UgaXQgaXMKKyAqIGFuIEVSUl9QVFIuCisgKgorICogVGhlIG5hbWUgaXMgbm90IGNvcGllZCBpbnRvIHRoZSBkaXIgaXRlbSwgeW91IGhhdmUgdG8gZG8gdGhhdCB5b3Vyc2VsZi4KKyAqLworc3RhdGljIHN0cnVjdCBidHJmc19kaXJfaXRlbSAqaW5zZXJ0X3dpdGhfb3ZlcmZsb3coc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZQorCQkJCQkJICAgKnRyYW5zLAorCQkJCQkJICAgc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsCisJCQkJCQkgICBzdHJ1Y3QgYnRyZnNfcGF0aCAqcGF0aCwKKwkJCQkJCSAgIHN0cnVjdCBidHJmc19rZXkgKmNwdV9rZXksCisJCQkJCQkgICB1MzIgZGF0YV9zaXplLAorCQkJCQkJICAgY29uc3QgY2hhciAqbmFtZSwKKwkJCQkJCSAgIGludCBuYW1lX2xlbikKK3sKKwlpbnQgcmV0OworCWNoYXIgKnB0cjsKKwlzdHJ1Y3QgYnRyZnNfaXRlbSAqaXRlbTsKKwlzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqbGVhZjsKKworCXJldCA9IGJ0cmZzX2luc2VydF9lbXB0eV9pdGVtKHRyYW5zLCByb290LCBwYXRoLCBjcHVfa2V5LCBkYXRhX3NpemUpOworCWlmIChyZXQgPT0gLUVFWElTVCkgeworCQlzdHJ1Y3QgYnRyZnNfZGlyX2l0ZW0gKmRpOworCQlkaSA9IGJ0cmZzX21hdGNoX2Rpcl9pdGVtX25hbWUocm9vdCwgcGF0aCwgbmFtZSwgbmFtZV9sZW4pOworCQlpZiAoZGkpCisJCQlyZXR1cm4gRVJSX1BUUigtRUVYSVNUKTsKKwkJcmV0ID0gYnRyZnNfZXh0ZW5kX2l0ZW0odHJhbnMsIHJvb3QsIHBhdGgsIGRhdGFfc2l6ZSk7CisJCVdBUk5fT04ocmV0ID4gMCk7CisJfQorCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gRVJSX1BUUihyZXQpOworCVdBUk5fT04ocmV0ID4gMCk7CisJbGVhZiA9IHBhdGgtPm5vZGVzWzBdOworCWl0ZW0gPSBidHJmc19pdGVtX25yKGxlYWYsIHBhdGgtPnNsb3RzWzBdKTsKKwlwdHIgPSBidHJmc19pdGVtX3B0cihsZWFmLCBwYXRoLT5zbG90c1swXSwgY2hhcik7CisJQlVHX09OKGRhdGFfc2l6ZSA+IGJ0cmZzX2l0ZW1fc2l6ZShsZWFmLCBpdGVtKSk7CisJcHRyICs9IGJ0cmZzX2l0ZW1fc2l6ZShsZWFmLCBpdGVtKSAtIGRhdGFfc2l6ZTsKKwlyZXR1cm4gKHN0cnVjdCBidHJmc19kaXJfaXRlbSAqKXB0cjsKK30KKworLyoKKyAqIHhhdHRycyB3b3JrIGEgbG90IGxpa2UgZGlyZWN0b3JpZXMsIHRoaXMgaW5zZXJ0cyBhbiB4YXR0ciBpdGVtCisgKiBpbnRvIHRoZSB0cmVlCisgKi8KK2ludCBidHJmc19pbnNlcnRfeGF0dHJfaXRlbShzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKKwkJCSAgICBzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwgY29uc3QgY2hhciAqbmFtZSwKKwkJCSAgICB1MTYgbmFtZV9sZW4sIGNvbnN0IHZvaWQgKmRhdGEsIHUxNiBkYXRhX2xlbiwKKwkJCSAgICB1NjQgZGlyKQoreworCWludCByZXQgPSAwOworCXN0cnVjdCBidHJmc19wYXRoICpwYXRoOworCXN0cnVjdCBidHJmc19kaXJfaXRlbSAqZGlyX2l0ZW07CisJdW5zaWduZWQgbG9uZyBuYW1lX3B0ciwgZGF0YV9wdHI7CisJc3RydWN0IGJ0cmZzX2tleSBrZXksIGxvY2F0aW9uOworCXN0cnVjdCBidHJmc19kaXNrX2tleSBkaXNrX2tleTsKKwlzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqbGVhZjsKKwl1MzIgZGF0YV9zaXplOworCisJa2V5Lm9iamVjdGlkID0gZGlyOworCWJ0cmZzX3NldF9rZXlfdHlwZSgma2V5LCBCVFJGU19YQVRUUl9JVEVNX0tFWSk7CisJa2V5Lm9mZnNldCA9IGJ0cmZzX25hbWVfaGFzaChuYW1lLCBuYW1lX2xlbik7CisJcGF0aCA9IGJ0cmZzX2FsbG9jX3BhdGgoKTsKKwlpZiAoIXBhdGgpCisJCXJldHVybiAtRU5PTUVNOworCWlmIChuYW1lX2xlbiArIGRhdGFfbGVuICsgc2l6ZW9mKHN0cnVjdCBidHJmc19kaXJfaXRlbSkgPgorCSAgICBCVFJGU19MRUFGX0RBVEFfU0laRShyb290KSAtIHNpemVvZihzdHJ1Y3QgYnRyZnNfaXRlbSkpCisJCXJldHVybiAtRU5PU1BDOworCisJZGF0YV9zaXplID0gc2l6ZW9mKCpkaXJfaXRlbSkgKyBuYW1lX2xlbiArIGRhdGFfbGVuOworCWRpcl9pdGVtID0gaW5zZXJ0X3dpdGhfb3ZlcmZsb3codHJhbnMsIHJvb3QsIHBhdGgsICZrZXksIGRhdGFfc2l6ZSwKKwkJCQkJbmFtZSwgbmFtZV9sZW4pOworCS8qCisJICogRklYTUU6IGF0IHNvbWUgcG9pbnQgd2Ugc2hvdWxkIGhhbmRsZSB4YXR0cidzIHRoYXQgYXJlIGxhcmdlciB0aGFuCisJICogd2hhdCB3ZSBjYW4gZml0IGluIG91ciBsZWFmLiAgV2Ugc2V0IGxvY2F0aW9uIHRvIE5VTEwgYi9jIHdlIGFyZW50CisJICogcG9pbnRpbmcgYXQgYW55dGhpbmcgZWxzZSwgdGhhdCB3aWxsIGNoYW5nZSBpZiB3ZSBzdG9yZSB0aGUgeGF0dHIKKwkgKiBkYXRhIGluIGEgc2VwYXJhdGUgaW5vZGUuCisJICovCisJQlVHX09OKElTX0VSUihkaXJfaXRlbSkpOworCW1lbXNldCgmbG9jYXRpb24sIDAsIHNpemVvZihsb2NhdGlvbikpOworCisJbGVhZiA9IHBhdGgtPm5vZGVzWzBdOworCWJ0cmZzX2NwdV9rZXlfdG9fZGlzaygmZGlza19rZXksICZsb2NhdGlvbik7CisJYnRyZnNfc2V0X2Rpcl9pdGVtX2tleShsZWFmLCBkaXJfaXRlbSwgJmRpc2tfa2V5KTsKKwlidHJmc19zZXRfZGlyX3R5cGUobGVhZiwgZGlyX2l0ZW0sIEJUUkZTX0ZUX1hBVFRSKTsKKwlidHJmc19zZXRfZGlyX25hbWVfbGVuKGxlYWYsIGRpcl9pdGVtLCBuYW1lX2xlbik7CisJYnRyZnNfc2V0X2Rpcl90cmFuc2lkKGxlYWYsIGRpcl9pdGVtLCB0cmFucy0+dHJhbnNpZCk7CisJYnRyZnNfc2V0X2Rpcl9kYXRhX2xlbihsZWFmLCBkaXJfaXRlbSwgZGF0YV9sZW4pOworCW5hbWVfcHRyID0gKHVuc2lnbmVkIGxvbmcpKGRpcl9pdGVtICsgMSk7CisJZGF0YV9wdHIgPSAodW5zaWduZWQgbG9uZykoKGNoYXIgKiluYW1lX3B0ciArIG5hbWVfbGVuKTsKKworCXdyaXRlX2V4dGVudF9idWZmZXIobGVhZiwgbmFtZSwgbmFtZV9wdHIsIG5hbWVfbGVuKTsKKwl3cml0ZV9leHRlbnRfYnVmZmVyKGxlYWYsIGRhdGEsIGRhdGFfcHRyLCBkYXRhX2xlbik7CisJYnRyZnNfbWFya19idWZmZXJfZGlydHkocGF0aC0+bm9kZXNbMF0pOworCisJYnRyZnNfZnJlZV9wYXRoKHBhdGgpOworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBpbnNlcnQgYSBkaXJlY3RvcnkgaXRlbSBpbiB0aGUgdHJlZSwgZG9pbmcgYWxsIHRoZSBtYWdpYyBmb3IKKyAqIGJvdGggaW5kZXhlcy4gJ2RpcicgaW5kaWNhdGVzIHdoaWNoIG9iamVjdGlkIHRvIGluc2VydCBpdCBpbnRvLAorICogJ2xvY2F0aW9uJyBpcyB0aGUga2V5IHRvIHN0dWZmIGludG8gdGhlIGRpcmVjdG9yeSBpdGVtLCAndHlwZScgaXMgdGhlCisgKiB0eXBlIG9mIHRoZSBpbm9kZSB3ZSdyZSBwb2ludGluZyB0bywgYW5kICdpbmRleCcgaXMgdGhlIHNlcXVlbmNlIG51bWJlcgorICogdG8gdXNlIGZvciB0aGUgc2Vjb25kIGluZGV4IChpZiBvbmUgaXMgY3JlYXRlZCkuCisgKi8KK2ludCBidHJmc19pbnNlcnRfZGlyX2l0ZW0oc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsIHN0cnVjdCBidHJmc19yb290CisJCQkgICpyb290LCBjb25zdCBjaGFyICpuYW1lLCBpbnQgbmFtZV9sZW4sIHU2NCBkaXIsCisJCQkgIHN0cnVjdCBidHJmc19rZXkgKmxvY2F0aW9uLCB1OCB0eXBlLCB1NjQgaW5kZXgpCit7CisJaW50IHJldCA9IDA7CisJaW50IHJldDIgPSAwOworCXN0cnVjdCBidHJmc19wYXRoICpwYXRoOworCXN0cnVjdCBidHJmc19kaXJfaXRlbSAqZGlyX2l0ZW07CisJc3RydWN0IGV4dGVudF9idWZmZXIgKmxlYWY7CisJdW5zaWduZWQgbG9uZyBuYW1lX3B0cjsKKwlzdHJ1Y3QgYnRyZnNfa2V5IGtleTsKKwlzdHJ1Y3QgYnRyZnNfZGlza19rZXkgZGlza19rZXk7CisJdTMyIGRhdGFfc2l6ZTsKKworCWtleS5vYmplY3RpZCA9IGRpcjsKKwlidHJmc19zZXRfa2V5X3R5cGUoJmtleSwgQlRSRlNfRElSX0lURU1fS0VZKTsKKwlrZXkub2Zmc2V0ID0gYnRyZnNfbmFtZV9oYXNoKG5hbWUsIG5hbWVfbGVuKTsKKwlwYXRoID0gYnRyZnNfYWxsb2NfcGF0aCgpOworCWRhdGFfc2l6ZSA9IHNpemVvZigqZGlyX2l0ZW0pICsgbmFtZV9sZW47CisJZGlyX2l0ZW0gPSBpbnNlcnRfd2l0aF9vdmVyZmxvdyh0cmFucywgcm9vdCwgcGF0aCwgJmtleSwgZGF0YV9zaXplLAorCQkJCQluYW1lLCBuYW1lX2xlbik7CisJaWYgKElTX0VSUihkaXJfaXRlbSkpIHsKKwkJcmV0ID0gUFRSX0VSUihkaXJfaXRlbSk7CisJCWlmIChyZXQgPT0gLUVFWElTVCkKKwkJCWdvdG8gc2Vjb25kX2luc2VydDsKKwkJZ290byBvdXQ7CisJfQorCisJbGVhZiA9IHBhdGgtPm5vZGVzWzBdOworCWJ0cmZzX2NwdV9rZXlfdG9fZGlzaygmZGlza19rZXksIGxvY2F0aW9uKTsKKwlidHJmc19zZXRfZGlyX2l0ZW1fa2V5KGxlYWYsIGRpcl9pdGVtLCAmZGlza19rZXkpOworCWJ0cmZzX3NldF9kaXJfdHlwZShsZWFmLCBkaXJfaXRlbSwgdHlwZSk7CisJYnRyZnNfc2V0X2Rpcl9kYXRhX2xlbihsZWFmLCBkaXJfaXRlbSwgMCk7CisJYnRyZnNfc2V0X2Rpcl9uYW1lX2xlbihsZWFmLCBkaXJfaXRlbSwgbmFtZV9sZW4pOworCWJ0cmZzX3NldF9kaXJfdHJhbnNpZChsZWFmLCBkaXJfaXRlbSwgdHJhbnMtPnRyYW5zaWQpOworCW5hbWVfcHRyID0gKHVuc2lnbmVkIGxvbmcpKGRpcl9pdGVtICsgMSk7CisKKwl3cml0ZV9leHRlbnRfYnVmZmVyKGxlYWYsIG5hbWUsIG5hbWVfcHRyLCBuYW1lX2xlbik7CisJYnRyZnNfbWFya19idWZmZXJfZGlydHkobGVhZik7CisKK3NlY29uZF9pbnNlcnQ6CisJLyogRklYTUUsIHVzZSBzb21lIHJlYWwgZmxhZyBmb3Igc2VsZWN0aW5nIHRoZSBleHRyYSBpbmRleCAqLworCWlmIChyb290ID09IHJvb3QtPmZzX2luZm8tPnRyZWVfcm9vdCkgeworCQlyZXQgPSAwOworCQlnb3RvIG91dDsKKwl9CisJYnRyZnNfcmVsZWFzZV9wYXRoKHJvb3QsIHBhdGgpOworCisJYnRyZnNfc2V0X2tleV90eXBlKCZrZXksIEJUUkZTX0RJUl9JTkRFWF9LRVkpOworCWtleS5vZmZzZXQgPSBpbmRleDsKKwlkaXJfaXRlbSA9IGluc2VydF93aXRoX292ZXJmbG93KHRyYW5zLCByb290LCBwYXRoLCAma2V5LCBkYXRhX3NpemUsCisJCQkJCW5hbWUsIG5hbWVfbGVuKTsKKwlpZiAoSVNfRVJSKGRpcl9pdGVtKSkgeworCQlyZXQyID0gUFRSX0VSUihkaXJfaXRlbSk7CisJCWdvdG8gb3V0OworCX0KKwlsZWFmID0gcGF0aC0+bm9kZXNbMF07CisJYnRyZnNfY3B1X2tleV90b19kaXNrKCZkaXNrX2tleSwgbG9jYXRpb24pOworCWJ0cmZzX3NldF9kaXJfaXRlbV9rZXkobGVhZiwgZGlyX2l0ZW0sICZkaXNrX2tleSk7CisJYnRyZnNfc2V0X2Rpcl90eXBlKGxlYWYsIGRpcl9pdGVtLCB0eXBlKTsKKwlidHJmc19zZXRfZGlyX2RhdGFfbGVuKGxlYWYsIGRpcl9pdGVtLCAwKTsKKwlidHJmc19zZXRfZGlyX25hbWVfbGVuKGxlYWYsIGRpcl9pdGVtLCBuYW1lX2xlbik7CisJYnRyZnNfc2V0X2Rpcl90cmFuc2lkKGxlYWYsIGRpcl9pdGVtLCB0cmFucy0+dHJhbnNpZCk7CisJbmFtZV9wdHIgPSAodW5zaWduZWQgbG9uZykoZGlyX2l0ZW0gKyAxKTsKKwl3cml0ZV9leHRlbnRfYnVmZmVyKGxlYWYsIG5hbWUsIG5hbWVfcHRyLCBuYW1lX2xlbik7CisJYnRyZnNfbWFya19idWZmZXJfZGlydHkobGVhZik7CitvdXQ6CisJYnRyZnNfZnJlZV9wYXRoKHBhdGgpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisJaWYgKHJldDIpCisJCXJldHVybiByZXQyOworCXJldHVybiAwOworfQorCisvKgorICogbG9va3VwIGEgZGlyZWN0b3J5IGl0ZW0gYmFzZWQgb24gbmFtZS4gICdkaXInIGlzIHRoZSBvYmplY3RpZAorICogd2UncmUgc2VhcmNoaW5nIGluLCBhbmQgJ21vZCcgdGVsbHMgdXMgaWYgeW91IHBsYW4gb24gZGVsZXRpbmcgdGhlCisgKiBpdGVtICh1c2UgbW9kIDwgMCkgb3IgY2hhbmdpbmcgdGhlIG9wdGlvbnMgKHVzZSBtb2QgPiAwKQorICovCitzdHJ1Y3QgYnRyZnNfZGlyX2l0ZW0gKmJ0cmZzX2xvb2t1cF9kaXJfaXRlbShzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKKwkJCQkJICAgICBzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwKKwkJCQkJICAgICBzdHJ1Y3QgYnRyZnNfcGF0aCAqcGF0aCwgdTY0IGRpciwKKwkJCQkJICAgICBjb25zdCBjaGFyICpuYW1lLCBpbnQgbmFtZV9sZW4sCisJCQkJCSAgICAgaW50IG1vZCkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBidHJmc19rZXkga2V5OworCWludCBpbnNfbGVuID0gbW9kIDwgMCA/IC0xIDogMDsKKwlpbnQgY293ID0gbW9kICE9IDA7CisJc3RydWN0IGJ0cmZzX2tleSBmb3VuZF9rZXk7CisJc3RydWN0IGV4dGVudF9idWZmZXIgKmxlYWY7CisKKwlrZXkub2JqZWN0aWQgPSBkaXI7CisJYnRyZnNfc2V0X2tleV90eXBlKCZrZXksIEJUUkZTX0RJUl9JVEVNX0tFWSk7CisKKwlrZXkub2Zmc2V0ID0gYnRyZnNfbmFtZV9oYXNoKG5hbWUsIG5hbWVfbGVuKTsKKworCXJldCA9IGJ0cmZzX3NlYXJjaF9zbG90KHRyYW5zLCByb290LCAma2V5LCBwYXRoLCBpbnNfbGVuLCBjb3cpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gRVJSX1BUUihyZXQpOworCWlmIChyZXQgPiAwKSB7CisJCWlmIChwYXRoLT5zbG90c1swXSA9PSAwKQorCQkJcmV0dXJuIE5VTEw7CisJCXBhdGgtPnNsb3RzWzBdLS07CisJfQorCisJbGVhZiA9IHBhdGgtPm5vZGVzWzBdOworCWJ0cmZzX2l0ZW1fa2V5X3RvX2NwdShsZWFmLCAmZm91bmRfa2V5LCBwYXRoLT5zbG90c1swXSk7CisKKwlpZiAoZm91bmRfa2V5Lm9iamVjdGlkICE9IGRpciB8fAorCSAgICBidHJmc19rZXlfdHlwZSgmZm91bmRfa2V5KSAhPSBCVFJGU19ESVJfSVRFTV9LRVkgfHwKKwkgICAgZm91bmRfa2V5Lm9mZnNldCAhPSBrZXkub2Zmc2V0KQorCQlyZXR1cm4gTlVMTDsKKworCXJldHVybiBidHJmc19tYXRjaF9kaXJfaXRlbV9uYW1lKHJvb3QsIHBhdGgsIG5hbWUsIG5hbWVfbGVuKTsKK30KKworLyoKKyAqIGxvb2t1cCBhIGRpcmVjdG9yeSBpdGVtIGJhc2VkIG9uIGluZGV4LiAgJ2RpcicgaXMgdGhlIG9iamVjdGlkCisgKiB3ZSdyZSBzZWFyY2hpbmcgaW4sIGFuZCAnbW9kJyB0ZWxscyB1cyBpZiB5b3UgcGxhbiBvbiBkZWxldGluZyB0aGUKKyAqIGl0ZW0gKHVzZSBtb2QgPCAwKSBvciBjaGFuZ2luZyB0aGUgb3B0aW9ucyAodXNlIG1vZCA+IDApCisgKgorICogVGhlIG5hbWUgaXMgdXNlZCB0byBtYWtlIHN1cmUgdGhlIGluZGV4IHJlYWxseSBwb2ludHMgdG8gdGhlIG5hbWUgeW91IHdlcmUKKyAqIGxvb2tpbmcgZm9yLgorICovCitzdHJ1Y3QgYnRyZnNfZGlyX2l0ZW0gKgorYnRyZnNfbG9va3VwX2Rpcl9pbmRleF9pdGVtKHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAorCQkJICAgIHN0cnVjdCBidHJmc19yb290ICpyb290LAorCQkJICAgIHN0cnVjdCBidHJmc19wYXRoICpwYXRoLCB1NjQgZGlyLAorCQkJICAgIHU2NCBvYmplY3RpZCwgY29uc3QgY2hhciAqbmFtZSwgaW50IG5hbWVfbGVuLAorCQkJICAgIGludCBtb2QpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgYnRyZnNfa2V5IGtleTsKKwlpbnQgaW5zX2xlbiA9IG1vZCA8IDAgPyAtMSA6IDA7CisJaW50IGNvdyA9IG1vZCAhPSAwOworCisJa2V5Lm9iamVjdGlkID0gZGlyOworCWJ0cmZzX3NldF9rZXlfdHlwZSgma2V5LCBCVFJGU19ESVJfSU5ERVhfS0VZKTsKKwlrZXkub2Zmc2V0ID0gb2JqZWN0aWQ7CisKKwlyZXQgPSBidHJmc19zZWFyY2hfc2xvdCh0cmFucywgcm9vdCwgJmtleSwgcGF0aCwgaW5zX2xlbiwgY293KTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIEVSUl9QVFIocmV0KTsKKwlpZiAocmV0ID4gMCkKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT0VOVCk7CisJcmV0dXJuIGJ0cmZzX21hdGNoX2Rpcl9pdGVtX25hbWUocm9vdCwgcGF0aCwgbmFtZSwgbmFtZV9sZW4pOworfQorCitzdHJ1Y3QgYnRyZnNfZGlyX2l0ZW0gKmJ0cmZzX2xvb2t1cF94YXR0cihzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKKwkJCQkJICBzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwKKwkJCQkJICBzdHJ1Y3QgYnRyZnNfcGF0aCAqcGF0aCwgdTY0IGRpciwKKwkJCQkJICBjb25zdCBjaGFyICpuYW1lLCB1MTYgbmFtZV9sZW4sCisJCQkJCSAgaW50IG1vZCkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBidHJmc19rZXkga2V5OworCWludCBpbnNfbGVuID0gbW9kIDwgMCA/IC0xIDogMDsKKwlpbnQgY293ID0gbW9kICE9IDA7CisJc3RydWN0IGJ0cmZzX2tleSBmb3VuZF9rZXk7CisJc3RydWN0IGV4dGVudF9idWZmZXIgKmxlYWY7CisKKwlrZXkub2JqZWN0aWQgPSBkaXI7CisJYnRyZnNfc2V0X2tleV90eXBlKCZrZXksIEJUUkZTX1hBVFRSX0lURU1fS0VZKTsKKwlrZXkub2Zmc2V0ID0gYnRyZnNfbmFtZV9oYXNoKG5hbWUsIG5hbWVfbGVuKTsKKwlyZXQgPSBidHJmc19zZWFyY2hfc2xvdCh0cmFucywgcm9vdCwgJmtleSwgcGF0aCwgaW5zX2xlbiwgY293KTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIEVSUl9QVFIocmV0KTsKKwlpZiAocmV0ID4gMCkgeworCQlpZiAocGF0aC0+c2xvdHNbMF0gPT0gMCkKKwkJCXJldHVybiBOVUxMOworCQlwYXRoLT5zbG90c1swXS0tOworCX0KKworCWxlYWYgPSBwYXRoLT5ub2Rlc1swXTsKKwlidHJmc19pdGVtX2tleV90b19jcHUobGVhZiwgJmZvdW5kX2tleSwgcGF0aC0+c2xvdHNbMF0pOworCisJaWYgKGZvdW5kX2tleS5vYmplY3RpZCAhPSBkaXIgfHwKKwkgICAgYnRyZnNfa2V5X3R5cGUoJmZvdW5kX2tleSkgIT0gQlRSRlNfWEFUVFJfSVRFTV9LRVkgfHwKKwkgICAgZm91bmRfa2V5Lm9mZnNldCAhPSBrZXkub2Zmc2V0KQorCQlyZXR1cm4gTlVMTDsKKworCXJldHVybiBidHJmc19tYXRjaF9kaXJfaXRlbV9uYW1lKHJvb3QsIHBhdGgsIG5hbWUsIG5hbWVfbGVuKTsKK30KKworLyoKKyAqIGhlbHBlciBmdW5jdGlvbiB0byBsb29rIGF0IHRoZSBkaXJlY3RvcnkgaXRlbSBwb2ludGVkIHRvIGJ5ICdwYXRoJworICogdGhpcyB3YWxrcyB0aHJvdWdoIGFsbCB0aGUgZW50cmllcyBpbiBhIGRpciBpdGVtIGFuZCBmaW5kcyBvbmUKKyAqIGZvciBhIHNwZWNpZmljIG5hbWUuCisgKi8KK3N0cnVjdCBidHJmc19kaXJfaXRlbSAqYnRyZnNfbWF0Y2hfZGlyX2l0ZW1fbmFtZShzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwKKwkJCSAgICAgIHN0cnVjdCBidHJmc19wYXRoICpwYXRoLAorCQkJICAgICAgY29uc3QgY2hhciAqbmFtZSwgaW50IG5hbWVfbGVuKQoreworCXN0cnVjdCBidHJmc19kaXJfaXRlbSAqZGlyX2l0ZW07CisJdW5zaWduZWQgbG9uZyBuYW1lX3B0cjsKKwl1MzIgdG90YWxfbGVuOworCXUzMiBjdXIgPSAwOworCXUzMiB0aGlzX2xlbjsKKwlzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqbGVhZjsKKworCWxlYWYgPSBwYXRoLT5ub2Rlc1swXTsKKwlkaXJfaXRlbSA9IGJ0cmZzX2l0ZW1fcHRyKGxlYWYsIHBhdGgtPnNsb3RzWzBdLCBzdHJ1Y3QgYnRyZnNfZGlyX2l0ZW0pOworCXRvdGFsX2xlbiA9IGJ0cmZzX2l0ZW1fc2l6ZV9ucihsZWFmLCBwYXRoLT5zbG90c1swXSk7CisJd2hpbGUgKGN1ciA8IHRvdGFsX2xlbikgeworCQl0aGlzX2xlbiA9IHNpemVvZigqZGlyX2l0ZW0pICsKKwkJCWJ0cmZzX2Rpcl9uYW1lX2xlbihsZWFmLCBkaXJfaXRlbSkgKworCQkJYnRyZnNfZGlyX2RhdGFfbGVuKGxlYWYsIGRpcl9pdGVtKTsKKwkJbmFtZV9wdHIgPSAodW5zaWduZWQgbG9uZykoZGlyX2l0ZW0gKyAxKTsKKworCQlpZiAoYnRyZnNfZGlyX25hbWVfbGVuKGxlYWYsIGRpcl9pdGVtKSA9PSBuYW1lX2xlbiAmJgorCQkgICAgbWVtY21wX2V4dGVudF9idWZmZXIobGVhZiwgbmFtZSwgbmFtZV9wdHIsIG5hbWVfbGVuKSA9PSAwKQorCQkJcmV0dXJuIGRpcl9pdGVtOworCisJCWN1ciArPSB0aGlzX2xlbjsKKwkJZGlyX2l0ZW0gPSAoc3RydWN0IGJ0cmZzX2Rpcl9pdGVtICopKChjaGFyICopZGlyX2l0ZW0gKworCQkJCQkJICAgICB0aGlzX2xlbik7CisJfQorCXJldHVybiBOVUxMOworfQorCisvKgorICogZ2l2ZW4gYSBwb2ludGVyIGludG8gYSBkaXJlY3RvcnkgaXRlbSwgZGVsZXRlIGl0LiAgVGhpcworICogaGFuZGxlcyBpdGVtcyB0aGF0IGhhdmUgbW9yZSB0aGFuIG9uZSBlbnRyeSBpbiB0aGVtLgorICovCitpbnQgYnRyZnNfZGVsZXRlX29uZV9kaXJfbmFtZShzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKKwkJCSAgICAgIHN0cnVjdCBidHJmc19yb290ICpyb290LAorCQkJICAgICAgc3RydWN0IGJ0cmZzX3BhdGggKnBhdGgsCisJCQkgICAgICBzdHJ1Y3QgYnRyZnNfZGlyX2l0ZW0gKmRpKQoreworCisJc3RydWN0IGV4dGVudF9idWZmZXIgKmxlYWY7CisJdTMyIHN1Yl9pdGVtX2xlbjsKKwl1MzIgaXRlbV9sZW47CisJaW50IHJldCA9IDA7CisKKwlsZWFmID0gcGF0aC0+bm9kZXNbMF07CisJc3ViX2l0ZW1fbGVuID0gc2l6ZW9mKCpkaSkgKyBidHJmc19kaXJfbmFtZV9sZW4obGVhZiwgZGkpICsKKwkJYnRyZnNfZGlyX2RhdGFfbGVuKGxlYWYsIGRpKTsKKwlpdGVtX2xlbiA9IGJ0cmZzX2l0ZW1fc2l6ZV9ucihsZWFmLCBwYXRoLT5zbG90c1swXSk7CisJaWYgKHN1Yl9pdGVtX2xlbiA9PSBpdGVtX2xlbikgeworCQlyZXQgPSBidHJmc19kZWxfaXRlbSh0cmFucywgcm9vdCwgcGF0aCk7CisJfSBlbHNlIHsKKwkJLyogTUFSS0VSICovCisJCXVuc2lnbmVkIGxvbmcgcHRyID0gKHVuc2lnbmVkIGxvbmcpZGk7CisJCXVuc2lnbmVkIGxvbmcgc3RhcnQ7CisKKwkJc3RhcnQgPSBidHJmc19pdGVtX3B0cl9vZmZzZXQobGVhZiwgcGF0aC0+c2xvdHNbMF0pOworCQltZW1tb3ZlX2V4dGVudF9idWZmZXIobGVhZiwgcHRyLCBwdHIgKyBzdWJfaXRlbV9sZW4sCisJCQlpdGVtX2xlbiAtIChwdHIgKyBzdWJfaXRlbV9sZW4gLSBzdGFydCkpOworCQlyZXQgPSBidHJmc190cnVuY2F0ZV9pdGVtKHRyYW5zLCByb290LCBwYXRoLAorCQkJCQkgIGl0ZW1fbGVuIC0gc3ViX2l0ZW1fbGVuLCAxKTsKKwl9CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9mcy9idHJmcy9kaXNrLWlvLmMgYi9mcy9idHJmcy9kaXNrLWlvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODFhMzEzOAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2J0cmZzL2Rpc2staW8uYwpAQCAtMCwwICsxLDIzNDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgT3JhY2xlLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgdjIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKKyAqIEJvc3RvbiwgTUEgMDIxMTEwLTEzMDcsIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvc2NhdHRlcmxpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9zd2FwLmg+CisjaW5jbHVkZSA8bGludXgvcmFkaXgtdHJlZS5oPgorI2luY2x1ZGUgPGxpbnV4L3dyaXRlYmFjay5oPgorI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZyZWV6ZXIuaD4KKyNpbmNsdWRlICJjb21wYXQuaCIKKyNpbmNsdWRlICJjcmMzMmMuaCIKKyNpbmNsdWRlICJjdHJlZS5oIgorI2luY2x1ZGUgImRpc2staW8uaCIKKyNpbmNsdWRlICJ0cmFuc2FjdGlvbi5oIgorI2luY2x1ZGUgImJ0cmZzX2lub2RlLmgiCisjaW5jbHVkZSAidm9sdW1lcy5oIgorI2luY2x1ZGUgInByaW50LXRyZWUuaCIKKyNpbmNsdWRlICJhc3luYy10aHJlYWQuaCIKKyNpbmNsdWRlICJsb2NraW5nLmgiCisjaW5jbHVkZSAicmVmLWNhY2hlLmgiCisjaW5jbHVkZSAidHJlZS1sb2cuaCIKKworc3RhdGljIHN0cnVjdCBleHRlbnRfaW9fb3BzIGJ0cmVlX2V4dGVudF9pb19vcHM7CitzdGF0aWMgdm9pZCBlbmRfd29ya3F1ZXVlX2ZuKHN0cnVjdCBidHJmc193b3JrICp3b3JrKTsKKworLyoKKyAqIGVuZF9pb193cSBzdHJ1Y3RzIGFyZSB1c2VkIHRvIGRvIHByb2Nlc3NpbmcgaW4gdGFzayBjb250ZXh0IHdoZW4gYW4gSU8gaXMKKyAqIGNvbXBsZXRlLiAgVGhpcyBpcyB1c2VkIGR1cmluZyByZWFkcyB0byB2ZXJpZnkgY2hlY2tzdW1zLCBhbmQgaXQgaXMgdXNlZAorICogYnkgd3JpdGVzIHRvIGluc2VydCBtZXRhZGF0YSBmb3IgbmV3IGZpbGUgZXh0ZW50cyBhZnRlciBJTyBpcyBjb21wbGV0ZS4KKyAqLworc3RydWN0IGVuZF9pb193cSB7CisJc3RydWN0IGJpbyAqYmlvOworCWJpb19lbmRfaW9fdCAqZW5kX2lvOworCXZvaWQgKnByaXZhdGU7CisJc3RydWN0IGJ0cmZzX2ZzX2luZm8gKmluZm87CisJaW50IGVycm9yOworCWludCBtZXRhZGF0YTsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJc3RydWN0IGJ0cmZzX3dvcmsgd29yazsKK307CisKKy8qCisgKiBhc3luYyBzdWJtaXQgYmlvcyBhcmUgdXNlZCB0byBvZmZsb2FkIGV4cGVuc2l2ZSBjaGVja3N1bW1pbmcKKyAqIG9udG8gdGhlIHdvcmtlciB0aHJlYWRzLiAgVGhleSBjaGVja3N1bSBmaWxlIGFuZCBtZXRhZGF0YSBiaW9zCisgKiBqdXN0IGJlZm9yZSB0aGV5IGFyZSBzZW50IGRvd24gdGhlIElPIHN0YWNrLgorICovCitzdHJ1Y3QgYXN5bmNfc3VibWl0X2JpbyB7CisJc3RydWN0IGlub2RlICppbm9kZTsKKwlzdHJ1Y3QgYmlvICpiaW87CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCWV4dGVudF9zdWJtaXRfYmlvX2hvb2tfdCAqc3VibWl0X2Jpb19zdGFydDsKKwlleHRlbnRfc3VibWl0X2Jpb19ob29rX3QgKnN1Ym1pdF9iaW9fZG9uZTsKKwlpbnQgcnc7CisJaW50IG1pcnJvcl9udW07CisJdW5zaWduZWQgbG9uZyBiaW9fZmxhZ3M7CisJc3RydWN0IGJ0cmZzX3dvcmsgd29yazsKK307CisKKy8qCisgKiBleHRlbnRzIG9uIHRoZSBidHJlZSBpbm9kZSBhcmUgcHJldHR5IHNpbXBsZSwgdGhlcmUncyBvbmUgZXh0ZW50CisgKiB0aGF0IGNvdmVycyB0aGUgZW50aXJlIGRldmljZQorICovCitzdGF0aWMgc3RydWN0IGV4dGVudF9tYXAgKmJ0cmVlX2dldF9leHRlbnQoc3RydWN0IGlub2RlICppbm9kZSwKKwkJc3RydWN0IHBhZ2UgKnBhZ2UsIHNpemVfdCBwYWdlX29mZnNldCwgdTY0IHN0YXJ0LCB1NjQgbGVuLAorCQlpbnQgY3JlYXRlKQoreworCXN0cnVjdCBleHRlbnRfbWFwX3RyZWUgKmVtX3RyZWUgPSAmQlRSRlNfSShpbm9kZSktPmV4dGVudF90cmVlOworCXN0cnVjdCBleHRlbnRfbWFwICplbTsKKwlpbnQgcmV0OworCisJc3Bpbl9sb2NrKCZlbV90cmVlLT5sb2NrKTsKKwllbSA9IGxvb2t1cF9leHRlbnRfbWFwcGluZyhlbV90cmVlLCBzdGFydCwgbGVuKTsKKwlpZiAoZW0pIHsKKwkJZW0tPmJkZXYgPQorCQkJQlRSRlNfSShpbm9kZSktPnJvb3QtPmZzX2luZm8tPmZzX2RldmljZXMtPmxhdGVzdF9iZGV2OworCQlzcGluX3VubG9jaygmZW1fdHJlZS0+bG9jayk7CisJCWdvdG8gb3V0OworCX0KKwlzcGluX3VubG9jaygmZW1fdHJlZS0+bG9jayk7CisKKwllbSA9IGFsbG9jX2V4dGVudF9tYXAoR0ZQX05PRlMpOworCWlmICghZW0pIHsKKwkJZW0gPSBFUlJfUFRSKC1FTk9NRU0pOworCQlnb3RvIG91dDsKKwl9CisJZW0tPnN0YXJ0ID0gMDsKKwllbS0+bGVuID0gKHU2NCktMTsKKwllbS0+YmxvY2tfbGVuID0gKHU2NCktMTsKKwllbS0+YmxvY2tfc3RhcnQgPSAwOworCWVtLT5iZGV2ID0gQlRSRlNfSShpbm9kZSktPnJvb3QtPmZzX2luZm8tPmZzX2RldmljZXMtPmxhdGVzdF9iZGV2OworCisJc3Bpbl9sb2NrKCZlbV90cmVlLT5sb2NrKTsKKwlyZXQgPSBhZGRfZXh0ZW50X21hcHBpbmcoZW1fdHJlZSwgZW0pOworCWlmIChyZXQgPT0gLUVFWElTVCkgeworCQl1NjQgZmFpbGVkX3N0YXJ0ID0gZW0tPnN0YXJ0OworCQl1NjQgZmFpbGVkX2xlbiA9IGVtLT5sZW47CisKKwkJZnJlZV9leHRlbnRfbWFwKGVtKTsKKwkJZW0gPSBsb29rdXBfZXh0ZW50X21hcHBpbmcoZW1fdHJlZSwgc3RhcnQsIGxlbik7CisJCWlmIChlbSkgeworCQkJcmV0ID0gMDsKKwkJfSBlbHNlIHsKKwkJCWVtID0gbG9va3VwX2V4dGVudF9tYXBwaW5nKGVtX3RyZWUsIGZhaWxlZF9zdGFydCwKKwkJCQkJCSAgIGZhaWxlZF9sZW4pOworCQkJcmV0ID0gLUVJTzsKKwkJfQorCX0gZWxzZSBpZiAocmV0KSB7CisJCWZyZWVfZXh0ZW50X21hcChlbSk7CisJCWVtID0gTlVMTDsKKwl9CisJc3Bpbl91bmxvY2soJmVtX3RyZWUtPmxvY2spOworCisJaWYgKHJldCkKKwkJZW0gPSBFUlJfUFRSKHJldCk7CitvdXQ6CisJcmV0dXJuIGVtOworfQorCit1MzIgYnRyZnNfY3N1bV9kYXRhKHN0cnVjdCBidHJmc19yb290ICpyb290LCBjaGFyICpkYXRhLCB1MzIgc2VlZCwgc2l6ZV90IGxlbikKK3sKKwlyZXR1cm4gYnRyZnNfY3JjMzJjKHNlZWQsIGRhdGEsIGxlbik7Cit9CisKK3ZvaWQgYnRyZnNfY3N1bV9maW5hbCh1MzIgY3JjLCBjaGFyICpyZXN1bHQpCit7CisJKihfX2xlMzIgKilyZXN1bHQgPSB+Y3B1X3RvX2xlMzIoY3JjKTsKK30KKworLyoKKyAqIGNvbXB1dGUgdGhlIGNzdW0gZm9yIGEgYnRyZWUgYmxvY2ssIGFuZCBlaXRoZXIgdmVyaWZ5IGl0IG9yIHdyaXRlIGl0CisgKiBpbnRvIHRoZSBjc3VtIGZpZWxkIG9mIHRoZSBibG9jay4KKyAqLworc3RhdGljIGludCBjc3VtX3RyZWVfYmxvY2soc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsIHN0cnVjdCBleHRlbnRfYnVmZmVyICpidWYsCisJCQkgICBpbnQgdmVyaWZ5KQoreworCXUxNiBjc3VtX3NpemUgPQorCQlidHJmc19zdXBlcl9jc3VtX3NpemUoJnJvb3QtPmZzX2luZm8tPnN1cGVyX2NvcHkpOworCWNoYXIgKnJlc3VsdCA9IE5VTEw7CisJdW5zaWduZWQgbG9uZyBsZW47CisJdW5zaWduZWQgbG9uZyBjdXJfbGVuOworCXVuc2lnbmVkIGxvbmcgb2Zmc2V0ID0gQlRSRlNfQ1NVTV9TSVpFOworCWNoYXIgKm1hcF90b2tlbiA9IE5VTEw7CisJY2hhciAqa2FkZHI7CisJdW5zaWduZWQgbG9uZyBtYXBfc3RhcnQ7CisJdW5zaWduZWQgbG9uZyBtYXBfbGVuOworCWludCBlcnI7CisJdTMyIGNyYyA9IH4odTMyKTA7CisJdW5zaWduZWQgbG9uZyBpbmxpbmVfcmVzdWx0OworCisJbGVuID0gYnVmLT5sZW4gLSBvZmZzZXQ7CisJd2hpbGUgKGxlbiA+IDApIHsKKwkJZXJyID0gbWFwX3ByaXZhdGVfZXh0ZW50X2J1ZmZlcihidWYsIG9mZnNldCwgMzIsCisJCQkJCSZtYXBfdG9rZW4sICZrYWRkciwKKwkJCQkJJm1hcF9zdGFydCwgJm1hcF9sZW4sIEtNX1VTRVIwKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiAxOworCQljdXJfbGVuID0gbWluKGxlbiwgbWFwX2xlbiAtIChvZmZzZXQgLSBtYXBfc3RhcnQpKTsKKwkJY3JjID0gYnRyZnNfY3N1bV9kYXRhKHJvb3QsIGthZGRyICsgb2Zmc2V0IC0gbWFwX3N0YXJ0LAorCQkJCSAgICAgIGNyYywgY3VyX2xlbik7CisJCWxlbiAtPSBjdXJfbGVuOworCQlvZmZzZXQgKz0gY3VyX2xlbjsKKwkJdW5tYXBfZXh0ZW50X2J1ZmZlcihidWYsIG1hcF90b2tlbiwgS01fVVNFUjApOworCX0KKwlpZiAoY3N1bV9zaXplID4gc2l6ZW9mKGlubGluZV9yZXN1bHQpKSB7CisJCXJlc3VsdCA9IGt6YWxsb2MoY3N1bV9zaXplICogc2l6ZW9mKGNoYXIpLCBHRlBfTk9GUyk7CisJCWlmICghcmVzdWx0KQorCQkJcmV0dXJuIDE7CisJfSBlbHNlIHsKKwkJcmVzdWx0ID0gKGNoYXIgKikmaW5saW5lX3Jlc3VsdDsKKwl9CisKKwlidHJmc19jc3VtX2ZpbmFsKGNyYywgcmVzdWx0KTsKKworCWlmICh2ZXJpZnkpIHsKKwkJaWYgKG1lbWNtcF9leHRlbnRfYnVmZmVyKGJ1ZiwgcmVzdWx0LCAwLCBjc3VtX3NpemUpKSB7CisJCQl1MzIgdmFsOworCQkJdTMyIGZvdW5kID0gMDsKKwkJCW1lbWNweSgmZm91bmQsIHJlc3VsdCwgY3N1bV9zaXplKTsKKworCQkJcmVhZF9leHRlbnRfYnVmZmVyKGJ1ZiwgJnZhbCwgMCwgY3N1bV9zaXplKTsKKwkJCXByaW50ayhLRVJOX0lORk8gImJ0cmZzOiAlcyBjaGVja3N1bSB2ZXJpZnkgZmFpbGVkICIKKwkJCSAgICAgICAib24gJWxsdSB3YW50ZWQgJVggZm91bmQgJVggbGV2ZWwgJWRcbiIsCisJCQkgICAgICAgcm9vdC0+ZnNfaW5mby0+c2ItPnNfaWQsCisJCQkgICAgICAgYnVmLT5zdGFydCwgdmFsLCBmb3VuZCwgYnRyZnNfaGVhZGVyX2xldmVsKGJ1ZikpOworCQkJaWYgKHJlc3VsdCAhPSAoY2hhciAqKSZpbmxpbmVfcmVzdWx0KQorCQkJCWtmcmVlKHJlc3VsdCk7CisJCQlyZXR1cm4gMTsKKwkJfQorCX0gZWxzZSB7CisJCXdyaXRlX2V4dGVudF9idWZmZXIoYnVmLCByZXN1bHQsIDAsIGNzdW1fc2l6ZSk7CisJfQorCWlmIChyZXN1bHQgIT0gKGNoYXIgKikmaW5saW5lX3Jlc3VsdCkKKwkJa2ZyZWUocmVzdWx0KTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIHdlIGNhbid0IGNvbnNpZGVyIGEgZ2l2ZW4gYmxvY2sgdXAgdG8gZGF0ZSB1bmxlc3MgdGhlIHRyYW5zaWQgb2YgdGhlCisgKiBibG9jayBtYXRjaGVzIHRoZSB0cmFuc2lkIGluIHRoZSBwYXJlbnQgbm9kZSdzIHBvaW50ZXIuICBUaGlzIGlzIGhvdyB3ZQorICogZGV0ZWN0IGJsb2NrcyB0aGF0IGVpdGhlciBkaWRuJ3QgZ2V0IHdyaXR0ZW4gYXQgYWxsIG9yIGdvdCB3cml0dGVuCisgKiBpbiB0aGUgd3JvbmcgcGxhY2UuCisgKi8KK3N0YXRpYyBpbnQgdmVyaWZ5X3BhcmVudF90cmFuc2lkKHN0cnVjdCBleHRlbnRfaW9fdHJlZSAqaW9fdHJlZSwKKwkJCQkgc3RydWN0IGV4dGVudF9idWZmZXIgKmViLCB1NjQgcGFyZW50X3RyYW5zaWQpCit7CisJaW50IHJldDsKKworCWlmICghcGFyZW50X3RyYW5zaWQgfHwgYnRyZnNfaGVhZGVyX2dlbmVyYXRpb24oZWIpID09IHBhcmVudF90cmFuc2lkKQorCQlyZXR1cm4gMDsKKworCWxvY2tfZXh0ZW50KGlvX3RyZWUsIGViLT5zdGFydCwgZWItPnN0YXJ0ICsgZWItPmxlbiAtIDEsIEdGUF9OT0ZTKTsKKwlpZiAoZXh0ZW50X2J1ZmZlcl91cHRvZGF0ZShpb190cmVlLCBlYikgJiYKKwkgICAgYnRyZnNfaGVhZGVyX2dlbmVyYXRpb24oZWIpID09IHBhcmVudF90cmFuc2lkKSB7CisJCXJldCA9IDA7CisJCWdvdG8gb3V0OworCX0KKwlwcmludGsoInBhcmVudCB0cmFuc2lkIHZlcmlmeSBmYWlsZWQgb24gJWxsdSB3YW50ZWQgJWxsdSBmb3VuZCAlbGx1XG4iLAorCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKWViLT5zdGFydCwKKwkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylwYXJlbnRfdHJhbnNpZCwKKwkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylidHJmc19oZWFkZXJfZ2VuZXJhdGlvbihlYikpOworCXJldCA9IDE7CisJY2xlYXJfZXh0ZW50X2J1ZmZlcl91cHRvZGF0ZShpb190cmVlLCBlYik7CitvdXQ6CisJdW5sb2NrX2V4dGVudChpb190cmVlLCBlYi0+c3RhcnQsIGViLT5zdGFydCArIGViLT5sZW4gLSAxLAorCQkgICAgICBHRlBfTk9GUyk7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIGhlbHBlciB0byByZWFkIGEgZ2l2ZW4gdHJlZSBibG9jaywgZG9pbmcgcmV0cmllcyBhcyByZXF1aXJlZCB3aGVuCisgKiB0aGUgY2hlY2tzdW1zIGRvbid0IG1hdGNoIGFuZCB3ZSBoYXZlIGFsdGVybmF0ZSBtaXJyb3JzIHRvIHRyeS4KKyAqLworc3RhdGljIGludCBidHJlZV9yZWFkX2V4dGVudF9idWZmZXJfcGFnZXMoc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsCisJCQkJCSAgc3RydWN0IGV4dGVudF9idWZmZXIgKmViLAorCQkJCQkgIHU2NCBzdGFydCwgdTY0IHBhcmVudF90cmFuc2lkKQoreworCXN0cnVjdCBleHRlbnRfaW9fdHJlZSAqaW9fdHJlZTsKKwlpbnQgcmV0OworCWludCBudW1fY29waWVzID0gMDsKKwlpbnQgbWlycm9yX251bSA9IDA7CisKKwlpb190cmVlID0gJkJUUkZTX0kocm9vdC0+ZnNfaW5mby0+YnRyZWVfaW5vZGUpLT5pb190cmVlOworCXdoaWxlICgxKSB7CisJCXJldCA9IHJlYWRfZXh0ZW50X2J1ZmZlcl9wYWdlcyhpb190cmVlLCBlYiwgc3RhcnQsIDEsCisJCQkJCSAgICAgICBidHJlZV9nZXRfZXh0ZW50LCBtaXJyb3JfbnVtKTsKKwkJaWYgKCFyZXQgJiYKKwkJICAgICF2ZXJpZnlfcGFyZW50X3RyYW5zaWQoaW9fdHJlZSwgZWIsIHBhcmVudF90cmFuc2lkKSkKKwkJCXJldHVybiByZXQ7CisKKwkJbnVtX2NvcGllcyA9IGJ0cmZzX251bV9jb3BpZXMoJnJvb3QtPmZzX2luZm8tPm1hcHBpbmdfdHJlZSwKKwkJCQkJICAgICAgZWItPnN0YXJ0LCBlYi0+bGVuKTsKKwkJaWYgKG51bV9jb3BpZXMgPT0gMSkKKwkJCXJldHVybiByZXQ7CisKKwkJbWlycm9yX251bSsrOworCQlpZiAobWlycm9yX251bSA+IG51bV9jb3BpZXMpCisJCQlyZXR1cm4gcmV0OworCX0KKwlyZXR1cm4gLUVJTzsKK30KKworLyoKKyAqIGNoZWNrc3VtIGEgZGlydHkgdHJlZSBibG9jayBiZWZvcmUgSU8uICBUaGlzIGhhcyBleHRyYSBjaGVja3MgdG8gbWFrZSBzdXJlCisgKiB3ZSBvbmx5IGZpbGwgaW4gdGhlIGNoZWNrc3VtIGZpZWxkIGluIHRoZSBmaXJzdCBwYWdlIG9mIGEgbXVsdGktcGFnZSBibG9jaworICovCisKK3N0YXRpYyBpbnQgY3N1bV9kaXJ0eV9idWZmZXIoc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsIHN0cnVjdCBwYWdlICpwYWdlKQoreworCXN0cnVjdCBleHRlbnRfaW9fdHJlZSAqdHJlZTsKKwl1NjQgc3RhcnQgPSAodTY0KXBhZ2UtPmluZGV4IDw8IFBBR0VfQ0FDSEVfU0hJRlQ7CisJdTY0IGZvdW5kX3N0YXJ0OworCWludCBmb3VuZF9sZXZlbDsKKwl1bnNpZ25lZCBsb25nIGxlbjsKKwlzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqZWI7CisJaW50IHJldDsKKworCXRyZWUgPSAmQlRSRlNfSShwYWdlLT5tYXBwaW5nLT5ob3N0KS0+aW9fdHJlZTsKKworCWlmIChwYWdlLT5wcml2YXRlID09IEVYVEVOVF9QQUdFX1BSSVZBVEUpCisJCWdvdG8gb3V0OworCWlmICghcGFnZS0+cHJpdmF0ZSkKKwkJZ290byBvdXQ7CisJbGVuID0gcGFnZS0+cHJpdmF0ZSA+PiAyOworCVdBUk5fT04obGVuID09IDApOworCisJZWIgPSBhbGxvY19leHRlbnRfYnVmZmVyKHRyZWUsIHN0YXJ0LCBsZW4sIHBhZ2UsIEdGUF9OT0ZTKTsKKwlyZXQgPSBidHJlZV9yZWFkX2V4dGVudF9idWZmZXJfcGFnZXMocm9vdCwgZWIsIHN0YXJ0ICsgUEFHRV9DQUNIRV9TSVpFLAorCQkJCQkgICAgIGJ0cmZzX2hlYWRlcl9nZW5lcmF0aW9uKGViKSk7CisJQlVHX09OKHJldCk7CisJZm91bmRfc3RhcnQgPSBidHJmc19oZWFkZXJfYnl0ZW5yKGViKTsKKwlpZiAoZm91bmRfc3RhcnQgIT0gc3RhcnQpIHsKKwkJV0FSTl9PTigxKTsKKwkJZ290byBlcnI7CisJfQorCWlmIChlYi0+Zmlyc3RfcGFnZSAhPSBwYWdlKSB7CisJCVdBUk5fT04oMSk7CisJCWdvdG8gZXJyOworCX0KKwlpZiAoIVBhZ2VVcHRvZGF0ZShwYWdlKSkgeworCQlXQVJOX09OKDEpOworCQlnb3RvIGVycjsKKwl9CisJZm91bmRfbGV2ZWwgPSBidHJmc19oZWFkZXJfbGV2ZWwoZWIpOworCisJY3N1bV90cmVlX2Jsb2NrKHJvb3QsIGViLCAwKTsKK2VycjoKKwlmcmVlX2V4dGVudF9idWZmZXIoZWIpOworb3V0OgorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNoZWNrX3RyZWVfYmxvY2tfZnNpZChzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwKKwkJCQkgc3RydWN0IGV4dGVudF9idWZmZXIgKmViKQoreworCXN0cnVjdCBidHJmc19mc19kZXZpY2VzICpmc19kZXZpY2VzID0gcm9vdC0+ZnNfaW5mby0+ZnNfZGV2aWNlczsKKwl1OCBmc2lkW0JUUkZTX1VVSURfU0laRV07CisJaW50IHJldCA9IDE7CisKKwlyZWFkX2V4dGVudF9idWZmZXIoZWIsIGZzaWQsICh1bnNpZ25lZCBsb25nKWJ0cmZzX2hlYWRlcl9mc2lkKGViKSwKKwkJCSAgIEJUUkZTX0ZTSURfU0laRSk7CisJd2hpbGUgKGZzX2RldmljZXMpIHsKKwkJaWYgKCFtZW1jbXAoZnNpZCwgZnNfZGV2aWNlcy0+ZnNpZCwgQlRSRlNfRlNJRF9TSVpFKSkgeworCQkJcmV0ID0gMDsKKwkJCWJyZWFrOworCQl9CisJCWZzX2RldmljZXMgPSBmc19kZXZpY2VzLT5zZWVkOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGJ0cmVlX3JlYWRwYWdlX2VuZF9pb19ob29rKHN0cnVjdCBwYWdlICpwYWdlLCB1NjQgc3RhcnQsIHU2NCBlbmQsCisJCQkgICAgICAgc3RydWN0IGV4dGVudF9zdGF0ZSAqc3RhdGUpCit7CisJc3RydWN0IGV4dGVudF9pb190cmVlICp0cmVlOworCXU2NCBmb3VuZF9zdGFydDsKKwlpbnQgZm91bmRfbGV2ZWw7CisJdW5zaWduZWQgbG9uZyBsZW47CisJc3RydWN0IGV4dGVudF9idWZmZXIgKmViOworCXN0cnVjdCBidHJmc19yb290ICpyb290ID0gQlRSRlNfSShwYWdlLT5tYXBwaW5nLT5ob3N0KS0+cm9vdDsKKwlpbnQgcmV0ID0gMDsKKworCXRyZWUgPSAmQlRSRlNfSShwYWdlLT5tYXBwaW5nLT5ob3N0KS0+aW9fdHJlZTsKKwlpZiAocGFnZS0+cHJpdmF0ZSA9PSBFWFRFTlRfUEFHRV9QUklWQVRFKQorCQlnb3RvIG91dDsKKwlpZiAoIXBhZ2UtPnByaXZhdGUpCisJCWdvdG8gb3V0OworCisJbGVuID0gcGFnZS0+cHJpdmF0ZSA+PiAyOworCVdBUk5fT04obGVuID09IDApOworCisJZWIgPSBhbGxvY19leHRlbnRfYnVmZmVyKHRyZWUsIHN0YXJ0LCBsZW4sIHBhZ2UsIEdGUF9OT0ZTKTsKKworCWZvdW5kX3N0YXJ0ID0gYnRyZnNfaGVhZGVyX2J5dGVucihlYik7CisJaWYgKGZvdW5kX3N0YXJ0ICE9IHN0YXJ0KSB7CisJCXByaW50ayhLRVJOX0lORk8gImJ0cmZzIGJhZCB0cmVlIGJsb2NrIHN0YXJ0ICVsbHUgJWxsdVxuIiwKKwkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpZm91bmRfc3RhcnQsCisJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKWViLT5zdGFydCk7CisJCXJldCA9IC1FSU87CisJCWdvdG8gZXJyOworCX0KKwlpZiAoZWItPmZpcnN0X3BhZ2UgIT0gcGFnZSkgeworCQlwcmludGsoS0VSTl9JTkZPICJidHJmcyBiYWQgZmlyc3QgcGFnZSAlbHUgJWx1XG4iLAorCQkgICAgICAgZWItPmZpcnN0X3BhZ2UtPmluZGV4LCBwYWdlLT5pbmRleCk7CisJCVdBUk5fT04oMSk7CisJCXJldCA9IC1FSU87CisJCWdvdG8gZXJyOworCX0KKwlpZiAoY2hlY2tfdHJlZV9ibG9ja19mc2lkKHJvb3QsIGViKSkgeworCQlwcmludGsoS0VSTl9JTkZPICJidHJmcyBiYWQgZnNpZCBvbiBibG9jayAlbGx1XG4iLAorCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyllYi0+c3RhcnQpOworCQlyZXQgPSAtRUlPOworCQlnb3RvIGVycjsKKwl9CisJZm91bmRfbGV2ZWwgPSBidHJmc19oZWFkZXJfbGV2ZWwoZWIpOworCisJcmV0ID0gY3N1bV90cmVlX2Jsb2NrKHJvb3QsIGViLCAxKTsKKwlpZiAocmV0KQorCQlyZXQgPSAtRUlPOworCisJZW5kID0gbWluX3QodTY0LCBlYi0+bGVuLCBQQUdFX0NBQ0hFX1NJWkUpOworCWVuZCA9IGViLT5zdGFydCArIGVuZCAtIDE7CitlcnI6CisJZnJlZV9leHRlbnRfYnVmZmVyKGViKTsKK291dDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBlbmRfd29ya3F1ZXVlX2JpbyhzdHJ1Y3QgYmlvICpiaW8sIGludCBlcnIpCit7CisJc3RydWN0IGVuZF9pb193cSAqZW5kX2lvX3dxID0gYmlvLT5iaV9wcml2YXRlOworCXN0cnVjdCBidHJmc19mc19pbmZvICpmc19pbmZvOworCisJZnNfaW5mbyA9IGVuZF9pb193cS0+aW5mbzsKKwllbmRfaW9fd3EtPmVycm9yID0gZXJyOworCWVuZF9pb193cS0+d29yay5mdW5jID0gZW5kX3dvcmtxdWV1ZV9mbjsKKwllbmRfaW9fd3EtPndvcmsuZmxhZ3MgPSAwOworCisJaWYgKGJpby0+YmlfcncgJiAoMSA8PCBCSU9fUlcpKSB7CisJCWlmIChlbmRfaW9fd3EtPm1ldGFkYXRhKQorCQkJYnRyZnNfcXVldWVfd29ya2VyKCZmc19pbmZvLT5lbmRpb19tZXRhX3dyaXRlX3dvcmtlcnMsCisJCQkJCSAgICZlbmRfaW9fd3EtPndvcmspOworCQllbHNlCisJCQlidHJmc19xdWV1ZV93b3JrZXIoJmZzX2luZm8tPmVuZGlvX3dyaXRlX3dvcmtlcnMsCisJCQkJCSAgICZlbmRfaW9fd3EtPndvcmspOworCX0gZWxzZSB7CisJCWlmIChlbmRfaW9fd3EtPm1ldGFkYXRhKQorCQkJYnRyZnNfcXVldWVfd29ya2VyKCZmc19pbmZvLT5lbmRpb19tZXRhX3dvcmtlcnMsCisJCQkJCSAgICZlbmRfaW9fd3EtPndvcmspOworCQllbHNlCisJCQlidHJmc19xdWV1ZV93b3JrZXIoJmZzX2luZm8tPmVuZGlvX3dvcmtlcnMsCisJCQkJCSAgICZlbmRfaW9fd3EtPndvcmspOworCX0KK30KKworaW50IGJ0cmZzX2Jpb193cV9lbmRfaW8oc3RydWN0IGJ0cmZzX2ZzX2luZm8gKmluZm8sIHN0cnVjdCBiaW8gKmJpbywKKwkJCWludCBtZXRhZGF0YSkKK3sKKwlzdHJ1Y3QgZW5kX2lvX3dxICplbmRfaW9fd3E7CisJZW5kX2lvX3dxID0ga21hbGxvYyhzaXplb2YoKmVuZF9pb193cSksIEdGUF9OT0ZTKTsKKwlpZiAoIWVuZF9pb193cSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwllbmRfaW9fd3EtPnByaXZhdGUgPSBiaW8tPmJpX3ByaXZhdGU7CisJZW5kX2lvX3dxLT5lbmRfaW8gPSBiaW8tPmJpX2VuZF9pbzsKKwllbmRfaW9fd3EtPmluZm8gPSBpbmZvOworCWVuZF9pb193cS0+ZXJyb3IgPSAwOworCWVuZF9pb193cS0+YmlvID0gYmlvOworCWVuZF9pb193cS0+bWV0YWRhdGEgPSBtZXRhZGF0YTsKKworCWJpby0+YmlfcHJpdmF0ZSA9IGVuZF9pb193cTsKKwliaW8tPmJpX2VuZF9pbyA9IGVuZF93b3JrcXVldWVfYmlvOworCXJldHVybiAwOworfQorCit1bnNpZ25lZCBsb25nIGJ0cmZzX2FzeW5jX3N1Ym1pdF9saW1pdChzdHJ1Y3QgYnRyZnNfZnNfaW5mbyAqaW5mbykKK3sKKwl1bnNpZ25lZCBsb25nIGxpbWl0ID0gbWluX3QodW5zaWduZWQgbG9uZywKKwkJCQkgICAgaW5mby0+d29ya2Vycy5tYXhfd29ya2VycywKKwkJCQkgICAgaW5mby0+ZnNfZGV2aWNlcy0+b3Blbl9kZXZpY2VzKTsKKwlyZXR1cm4gMjU2ICogbGltaXQ7Cit9CisKK2ludCBidHJmc19jb25nZXN0ZWRfYXN5bmMoc3RydWN0IGJ0cmZzX2ZzX2luZm8gKmluZm8sIGludCBpb2RvbmUpCit7CisJcmV0dXJuIGF0b21pY19yZWFkKCZpbmZvLT5ucl9hc3luY19iaW9zKSA+CisJCWJ0cmZzX2FzeW5jX3N1Ym1pdF9saW1pdChpbmZvKTsKK30KKworc3RhdGljIHZvaWQgcnVuX29uZV9hc3luY19zdGFydChzdHJ1Y3QgYnRyZnNfd29yayAqd29yaykKK3sKKwlzdHJ1Y3QgYnRyZnNfZnNfaW5mbyAqZnNfaW5mbzsKKwlzdHJ1Y3QgYXN5bmNfc3VibWl0X2JpbyAqYXN5bmM7CisKKwlhc3luYyA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgIGFzeW5jX3N1Ym1pdF9iaW8sIHdvcmspOworCWZzX2luZm8gPSBCVFJGU19JKGFzeW5jLT5pbm9kZSktPnJvb3QtPmZzX2luZm87CisJYXN5bmMtPnN1Ym1pdF9iaW9fc3RhcnQoYXN5bmMtPmlub2RlLCBhc3luYy0+cncsIGFzeW5jLT5iaW8sCisJCQkgICAgICAgYXN5bmMtPm1pcnJvcl9udW0sIGFzeW5jLT5iaW9fZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBydW5fb25lX2FzeW5jX2RvbmUoc3RydWN0IGJ0cmZzX3dvcmsgKndvcmspCit7CisJc3RydWN0IGJ0cmZzX2ZzX2luZm8gKmZzX2luZm87CisJc3RydWN0IGFzeW5jX3N1Ym1pdF9iaW8gKmFzeW5jOworCWludCBsaW1pdDsKKworCWFzeW5jID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCAgYXN5bmNfc3VibWl0X2Jpbywgd29yayk7CisJZnNfaW5mbyA9IEJUUkZTX0koYXN5bmMtPmlub2RlKS0+cm9vdC0+ZnNfaW5mbzsKKworCWxpbWl0ID0gYnRyZnNfYXN5bmNfc3VibWl0X2xpbWl0KGZzX2luZm8pOworCWxpbWl0ID0gbGltaXQgKiAyIC8gMzsKKworCWF0b21pY19kZWMoJmZzX2luZm8tPm5yX2FzeW5jX3N1Ym1pdHMpOworCisJaWYgKGF0b21pY19yZWFkKCZmc19pbmZvLT5ucl9hc3luY19zdWJtaXRzKSA8IGxpbWl0ICYmCisJICAgIHdhaXRxdWV1ZV9hY3RpdmUoJmZzX2luZm8tPmFzeW5jX3N1Ym1pdF93YWl0KSkKKwkJd2FrZV91cCgmZnNfaW5mby0+YXN5bmNfc3VibWl0X3dhaXQpOworCisJYXN5bmMtPnN1Ym1pdF9iaW9fZG9uZShhc3luYy0+aW5vZGUsIGFzeW5jLT5ydywgYXN5bmMtPmJpbywKKwkJCSAgICAgICBhc3luYy0+bWlycm9yX251bSwgYXN5bmMtPmJpb19mbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIHJ1bl9vbmVfYXN5bmNfZnJlZShzdHJ1Y3QgYnRyZnNfd29yayAqd29yaykKK3sKKwlzdHJ1Y3QgYXN5bmNfc3VibWl0X2JpbyAqYXN5bmM7CisKKwlhc3luYyA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgIGFzeW5jX3N1Ym1pdF9iaW8sIHdvcmspOworCWtmcmVlKGFzeW5jKTsKK30KKworaW50IGJ0cmZzX3dxX3N1Ym1pdF9iaW8oc3RydWN0IGJ0cmZzX2ZzX2luZm8gKmZzX2luZm8sIHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQlpbnQgcncsIHN0cnVjdCBiaW8gKmJpbywgaW50IG1pcnJvcl9udW0sCisJCQl1bnNpZ25lZCBsb25nIGJpb19mbGFncywKKwkJCWV4dGVudF9zdWJtaXRfYmlvX2hvb2tfdCAqc3VibWl0X2Jpb19zdGFydCwKKwkJCWV4dGVudF9zdWJtaXRfYmlvX2hvb2tfdCAqc3VibWl0X2Jpb19kb25lKQoreworCXN0cnVjdCBhc3luY19zdWJtaXRfYmlvICphc3luYzsKKworCWFzeW5jID0ga21hbGxvYyhzaXplb2YoKmFzeW5jKSwgR0ZQX05PRlMpOworCWlmICghYXN5bmMpCisJCXJldHVybiAtRU5PTUVNOworCisJYXN5bmMtPmlub2RlID0gaW5vZGU7CisJYXN5bmMtPnJ3ID0gcnc7CisJYXN5bmMtPmJpbyA9IGJpbzsKKwlhc3luYy0+bWlycm9yX251bSA9IG1pcnJvcl9udW07CisJYXN5bmMtPnN1Ym1pdF9iaW9fc3RhcnQgPSBzdWJtaXRfYmlvX3N0YXJ0OworCWFzeW5jLT5zdWJtaXRfYmlvX2RvbmUgPSBzdWJtaXRfYmlvX2RvbmU7CisKKwlhc3luYy0+d29yay5mdW5jID0gcnVuX29uZV9hc3luY19zdGFydDsKKwlhc3luYy0+d29yay5vcmRlcmVkX2Z1bmMgPSBydW5fb25lX2FzeW5jX2RvbmU7CisJYXN5bmMtPndvcmsub3JkZXJlZF9mcmVlID0gcnVuX29uZV9hc3luY19mcmVlOworCisJYXN5bmMtPndvcmsuZmxhZ3MgPSAwOworCWFzeW5jLT5iaW9fZmxhZ3MgPSBiaW9fZmxhZ3M7CisKKwlhdG9taWNfaW5jKCZmc19pbmZvLT5ucl9hc3luY19zdWJtaXRzKTsKKwlidHJmc19xdWV1ZV93b3JrZXIoJmZzX2luZm8tPndvcmtlcnMsICZhc3luYy0+d29yayk7CisjaWYgMAorCWludCBsaW1pdCA9IGJ0cmZzX2FzeW5jX3N1Ym1pdF9saW1pdChmc19pbmZvKTsKKwlpZiAoYXRvbWljX3JlYWQoJmZzX2luZm8tPm5yX2FzeW5jX3N1Ym1pdHMpID4gbGltaXQpIHsKKwkJd2FpdF9ldmVudF90aW1lb3V0KGZzX2luZm8tPmFzeW5jX3N1Ym1pdF93YWl0LAorCQkJICAgKGF0b21pY19yZWFkKCZmc19pbmZvLT5ucl9hc3luY19zdWJtaXRzKSA8IGxpbWl0KSwKKwkJCSAgIEhaLzEwKTsKKworCQl3YWl0X2V2ZW50X3RpbWVvdXQoZnNfaW5mby0+YXN5bmNfc3VibWl0X3dhaXQsCisJCQkgICAoYXRvbWljX3JlYWQoJmZzX2luZm8tPm5yX2FzeW5jX2Jpb3MpIDwgbGltaXQpLAorCQkJICAgSFovMTApOworCX0KKyNlbmRpZgorCXdoaWxlIChhdG9taWNfcmVhZCgmZnNfaW5mby0+YXN5bmNfc3VibWl0X2RyYWluaW5nKSAmJgorCSAgICAgIGF0b21pY19yZWFkKCZmc19pbmZvLT5ucl9hc3luY19zdWJtaXRzKSkgeworCQl3YWl0X2V2ZW50KGZzX2luZm8tPmFzeW5jX3N1Ym1pdF93YWl0LAorCQkJICAgKGF0b21pY19yZWFkKCZmc19pbmZvLT5ucl9hc3luY19zdWJtaXRzKSA9PSAwKSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYnRyZWVfY3N1bV9vbmVfYmlvKHN0cnVjdCBiaW8gKmJpbykKK3sKKwlzdHJ1Y3QgYmlvX3ZlYyAqYnZlYyA9IGJpby0+YmlfaW9fdmVjOworCWludCBiaW9faW5kZXggPSAwOworCXN0cnVjdCBidHJmc19yb290ICpyb290OworCisJV0FSTl9PTihiaW8tPmJpX3ZjbnQgPD0gMCk7CisJd2hpbGUgKGJpb19pbmRleCA8IGJpby0+YmlfdmNudCkgeworCQlyb290ID0gQlRSRlNfSShidmVjLT5idl9wYWdlLT5tYXBwaW5nLT5ob3N0KS0+cm9vdDsKKwkJY3N1bV9kaXJ0eV9idWZmZXIocm9vdCwgYnZlYy0+YnZfcGFnZSk7CisJCWJpb19pbmRleCsrOworCQlidmVjKys7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9fYnRyZWVfc3VibWl0X2Jpb19zdGFydChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgcncsCisJCQkJICAgIHN0cnVjdCBiaW8gKmJpbywgaW50IG1pcnJvcl9udW0sCisJCQkJICAgIHVuc2lnbmVkIGxvbmcgYmlvX2ZsYWdzKQoreworCS8qCisJICogd2hlbiB3ZSdyZSBjYWxsZWQgZm9yIGEgd3JpdGUsIHdlJ3JlIGFscmVhZHkgaW4gdGhlIGFzeW5jCisJICogc3VibWlzc2lvbiBjb250ZXh0LiAgSnVzdCBqdW1wIGludG8gYnRyZnNfbWFwX2JpbworCSAqLworCWJ0cmVlX2NzdW1fb25lX2JpbyhiaW8pOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9fYnRyZWVfc3VibWl0X2Jpb19kb25lKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBydywgc3RydWN0IGJpbyAqYmlvLAorCQkJCSBpbnQgbWlycm9yX251bSwgdW5zaWduZWQgbG9uZyBiaW9fZmxhZ3MpCit7CisJLyoKKwkgKiB3aGVuIHdlJ3JlIGNhbGxlZCBmb3IgYSB3cml0ZSwgd2UncmUgYWxyZWFkeSBpbiB0aGUgYXN5bmMKKwkgKiBzdWJtaXNzaW9uIGNvbnRleHQuICBKdXN0IGp1bXAgaW50byBidHJmc19tYXBfYmlvCisJICovCisJcmV0dXJuIGJ0cmZzX21hcF9iaW8oQlRSRlNfSShpbm9kZSktPnJvb3QsIHJ3LCBiaW8sIG1pcnJvcl9udW0sIDEpOworfQorCitzdGF0aWMgaW50IGJ0cmVlX3N1Ym1pdF9iaW9faG9vayhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgcncsIHN0cnVjdCBiaW8gKmJpbywKKwkJCQkgaW50IG1pcnJvcl9udW0sIHVuc2lnbmVkIGxvbmcgYmlvX2ZsYWdzKQoreworCWludCByZXQ7CisKKwlyZXQgPSBidHJmc19iaW9fd3FfZW5kX2lvKEJUUkZTX0koaW5vZGUpLT5yb290LT5mc19pbmZvLAorCQkJCQkgIGJpbywgMSk7CisJQlVHX09OKHJldCk7CisKKwlpZiAoIShydyAmICgxIDw8IEJJT19SVykpKSB7CisJCS8qCisJCSAqIGNhbGxlZCBmb3IgYSByZWFkLCBkbyB0aGUgc2V0dXAgc28gdGhhdCBjaGVja3N1bSB2YWxpZGF0aW9uCisJCSAqIGNhbiBoYXBwZW4gaW4gdGhlIGFzeW5jIGtlcm5lbCB0aHJlYWRzCisJCSAqLworCQlyZXR1cm4gYnRyZnNfbWFwX2JpbyhCVFJGU19JKGlub2RlKS0+cm9vdCwgcncsIGJpbywKKwkJCQkgICAgIG1pcnJvcl9udW0sIDApOworCX0KKwkvKgorCSAqIGt0aHJlYWQgaGVscGVycyBhcmUgdXNlZCB0byBzdWJtaXQgd3JpdGVzIHNvIHRoYXQgY2hlY2tzdW1taW5nCisJICogY2FuIGhhcHBlbiBpbiBwYXJhbGxlbCBhY3Jvc3MgYWxsIENQVXMKKwkgKi8KKwlyZXR1cm4gYnRyZnNfd3Ffc3VibWl0X2JpbyhCVFJGU19JKGlub2RlKS0+cm9vdC0+ZnNfaW5mbywKKwkJCQkgICBpbm9kZSwgcncsIGJpbywgbWlycm9yX251bSwgMCwKKwkJCQkgICBfX2J0cmVlX3N1Ym1pdF9iaW9fc3RhcnQsCisJCQkJICAgX19idHJlZV9zdWJtaXRfYmlvX2RvbmUpOworfQorCitzdGF0aWMgaW50IGJ0cmVlX3dyaXRlcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSwgc3RydWN0IHdyaXRlYmFja19jb250cm9sICp3YmMpCit7CisJc3RydWN0IGV4dGVudF9pb190cmVlICp0cmVlOworCXRyZWUgPSAmQlRSRlNfSShwYWdlLT5tYXBwaW5nLT5ob3N0KS0+aW9fdHJlZTsKKworCWlmIChjdXJyZW50LT5mbGFncyAmIFBGX01FTUFMTE9DKSB7CisJCXJlZGlydHlfcGFnZV9mb3Jfd3JpdGVwYWdlKHdiYywgcGFnZSk7CisJCXVubG9ja19wYWdlKHBhZ2UpOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIGV4dGVudF93cml0ZV9mdWxsX3BhZ2UodHJlZSwgcGFnZSwgYnRyZWVfZ2V0X2V4dGVudCwgd2JjKTsKK30KKworc3RhdGljIGludCBidHJlZV93cml0ZXBhZ2VzKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLAorCQkJICAgIHN0cnVjdCB3cml0ZWJhY2tfY29udHJvbCAqd2JjKQoreworCXN0cnVjdCBleHRlbnRfaW9fdHJlZSAqdHJlZTsKKwl0cmVlID0gJkJUUkZTX0kobWFwcGluZy0+aG9zdCktPmlvX3RyZWU7CisJaWYgKHdiYy0+c3luY19tb2RlID09IFdCX1NZTkNfTk9ORSkgeworCQl1NjQgbnVtX2RpcnR5OworCQl1NjQgc3RhcnQgPSAwOworCQl1bnNpZ25lZCBsb25nIHRocmVzaCA9IDMyICogMTAyNCAqIDEwMjQ7CisKKwkJaWYgKHdiYy0+Zm9yX2t1cGRhdGUpCisJCQlyZXR1cm4gMDsKKworCQludW1fZGlydHkgPSBjb3VudF9yYW5nZV9iaXRzKHRyZWUsICZzdGFydCwgKHU2NCktMSwKKwkJCQkJICAgICB0aHJlc2gsIEVYVEVOVF9ESVJUWSk7CisJCWlmIChudW1fZGlydHkgPCB0aHJlc2gpCisJCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIGV4dGVudF93cml0ZXBhZ2VzKHRyZWUsIG1hcHBpbmcsIGJ0cmVlX2dldF9leHRlbnQsIHdiYyk7Cit9CisKK3N0YXRpYyBpbnQgYnRyZWVfcmVhZHBhZ2Uoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBwYWdlICpwYWdlKQoreworCXN0cnVjdCBleHRlbnRfaW9fdHJlZSAqdHJlZTsKKwl0cmVlID0gJkJUUkZTX0kocGFnZS0+bWFwcGluZy0+aG9zdCktPmlvX3RyZWU7CisJcmV0dXJuIGV4dGVudF9yZWFkX2Z1bGxfcGFnZSh0cmVlLCBwYWdlLCBidHJlZV9nZXRfZXh0ZW50KTsKK30KKworc3RhdGljIGludCBidHJlZV9yZWxlYXNlcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSwgZ2ZwX3QgZ2ZwX2ZsYWdzKQoreworCXN0cnVjdCBleHRlbnRfaW9fdHJlZSAqdHJlZTsKKwlzdHJ1Y3QgZXh0ZW50X21hcF90cmVlICptYXA7CisJaW50IHJldDsKKworCWlmIChQYWdlV3JpdGViYWNrKHBhZ2UpIHx8IFBhZ2VEaXJ0eShwYWdlKSkKKwkJcmV0dXJuIDA7CisKKwl0cmVlID0gJkJUUkZTX0kocGFnZS0+bWFwcGluZy0+aG9zdCktPmlvX3RyZWU7CisJbWFwID0gJkJUUkZTX0kocGFnZS0+bWFwcGluZy0+aG9zdCktPmV4dGVudF90cmVlOworCisJcmV0ID0gdHJ5X3JlbGVhc2VfZXh0ZW50X3N0YXRlKG1hcCwgdHJlZSwgcGFnZSwgZ2ZwX2ZsYWdzKTsKKwlpZiAoIXJldCkKKwkJcmV0dXJuIDA7CisKKwlyZXQgPSB0cnlfcmVsZWFzZV9leHRlbnRfYnVmZmVyKHRyZWUsIHBhZ2UpOworCWlmIChyZXQgPT0gMSkgeworCQlDbGVhclBhZ2VQcml2YXRlKHBhZ2UpOworCQlzZXRfcGFnZV9wcml2YXRlKHBhZ2UsIDApOworCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgYnRyZWVfaW52YWxpZGF0ZXBhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0KQoreworCXN0cnVjdCBleHRlbnRfaW9fdHJlZSAqdHJlZTsKKwl0cmVlID0gJkJUUkZTX0kocGFnZS0+bWFwcGluZy0+aG9zdCktPmlvX3RyZWU7CisJZXh0ZW50X2ludmFsaWRhdGVwYWdlKHRyZWUsIHBhZ2UsIG9mZnNldCk7CisJYnRyZWVfcmVsZWFzZXBhZ2UocGFnZSwgR0ZQX05PRlMpOworCWlmIChQYWdlUHJpdmF0ZShwYWdlKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJidHJmcyB3YXJuaW5nIHBhZ2UgcHJpdmF0ZSBub3QgemVybyAiCisJCSAgICAgICAib24gcGFnZSAlbGx1XG4iLCAodW5zaWduZWQgbG9uZyBsb25nKXBhZ2Vfb2Zmc2V0KHBhZ2UpKTsKKwkJQ2xlYXJQYWdlUHJpdmF0ZShwYWdlKTsKKwkJc2V0X3BhZ2VfcHJpdmF0ZShwYWdlLCAwKTsKKwkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOworCX0KK30KKworI2lmIDAKK3N0YXRpYyBpbnQgYnRyZWVfd3JpdGVwYWdlKHN0cnVjdCBwYWdlICpwYWdlLCBzdHJ1Y3Qgd3JpdGViYWNrX2NvbnRyb2wgKndiYykKK3sKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCXN0cnVjdCBidHJmc19yb290ICpyb290ID0gQlRSRlNfSShwYWdlLT5tYXBwaW5nLT5ob3N0KS0+cm9vdDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmhlYWQ7CisJaWYgKCFwYWdlX2hhc19idWZmZXJzKHBhZ2UpKSB7CisJCWNyZWF0ZV9lbXB0eV9idWZmZXJzKHBhZ2UsIHJvb3QtPmZzX2luZm8tPnNiLT5zX2Jsb2Nrc2l6ZSwKKwkJCQkJKDEgPDwgQkhfRGlydHkpfCgxIDw8IEJIX1VwdG9kYXRlKSk7CisJfQorCWhlYWQgPSBwYWdlX2J1ZmZlcnMocGFnZSk7CisJYmggPSBoZWFkOworCWRvIHsKKwkJaWYgKGJ1ZmZlcl9kaXJ0eShiaCkpCisJCQljc3VtX3RyZWVfYmxvY2socm9vdCwgYmgsIDApOworCQliaCA9IGJoLT5iX3RoaXNfcGFnZTsKKwl9IHdoaWxlIChiaCAhPSBoZWFkKTsKKwlyZXR1cm4gYmxvY2tfd3JpdGVfZnVsbF9wYWdlKHBhZ2UsIGJ0cmVlX2dldF9ibG9jaywgd2JjKTsKK30KKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyBidHJlZV9hb3BzID0geworCS5yZWFkcGFnZQk9IGJ0cmVlX3JlYWRwYWdlLAorCS53cml0ZXBhZ2UJPSBidHJlZV93cml0ZXBhZ2UsCisJLndyaXRlcGFnZXMJPSBidHJlZV93cml0ZXBhZ2VzLAorCS5yZWxlYXNlcGFnZQk9IGJ0cmVlX3JlbGVhc2VwYWdlLAorCS5pbnZhbGlkYXRlcGFnZSA9IGJ0cmVlX2ludmFsaWRhdGVwYWdlLAorCS5zeW5jX3BhZ2UJPSBibG9ja19zeW5jX3BhZ2UsCit9OworCitpbnQgcmVhZGFoZWFkX3RyZWVfYmxvY2soc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsIHU2NCBieXRlbnIsIHUzMiBibG9ja3NpemUsCisJCQkgdTY0IHBhcmVudF90cmFuc2lkKQoreworCXN0cnVjdCBleHRlbnRfYnVmZmVyICpidWYgPSBOVUxMOworCXN0cnVjdCBpbm9kZSAqYnRyZWVfaW5vZGUgPSByb290LT5mc19pbmZvLT5idHJlZV9pbm9kZTsKKwlpbnQgcmV0ID0gMDsKKworCWJ1ZiA9IGJ0cmZzX2ZpbmRfY3JlYXRlX3RyZWVfYmxvY2socm9vdCwgYnl0ZW5yLCBibG9ja3NpemUpOworCWlmICghYnVmKQorCQlyZXR1cm4gMDsKKwlyZWFkX2V4dGVudF9idWZmZXJfcGFnZXMoJkJUUkZTX0koYnRyZWVfaW5vZGUpLT5pb190cmVlLAorCQkJCSBidWYsIDAsIDAsIGJ0cmVlX2dldF9leHRlbnQsIDApOworCWZyZWVfZXh0ZW50X2J1ZmZlcihidWYpOworCXJldHVybiByZXQ7Cit9CisKK3N0cnVjdCBleHRlbnRfYnVmZmVyICpidHJmc19maW5kX3RyZWVfYmxvY2soc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsCisJCQkJCSAgICB1NjQgYnl0ZW5yLCB1MzIgYmxvY2tzaXplKQoreworCXN0cnVjdCBpbm9kZSAqYnRyZWVfaW5vZGUgPSByb290LT5mc19pbmZvLT5idHJlZV9pbm9kZTsKKwlzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqZWI7CisJZWIgPSBmaW5kX2V4dGVudF9idWZmZXIoJkJUUkZTX0koYnRyZWVfaW5vZGUpLT5pb190cmVlLAorCQkJCWJ5dGVuciwgYmxvY2tzaXplLCBHRlBfTk9GUyk7CisJcmV0dXJuIGViOworfQorCitzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqYnRyZnNfZmluZF9jcmVhdGVfdHJlZV9ibG9jayhzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwKKwkJCQkJCSB1NjQgYnl0ZW5yLCB1MzIgYmxvY2tzaXplKQoreworCXN0cnVjdCBpbm9kZSAqYnRyZWVfaW5vZGUgPSByb290LT5mc19pbmZvLT5idHJlZV9pbm9kZTsKKwlzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqZWI7CisKKwllYiA9IGFsbG9jX2V4dGVudF9idWZmZXIoJkJUUkZTX0koYnRyZWVfaW5vZGUpLT5pb190cmVlLAorCQkJCSBieXRlbnIsIGJsb2Nrc2l6ZSwgTlVMTCwgR0ZQX05PRlMpOworCXJldHVybiBlYjsKK30KKworCitpbnQgYnRyZnNfd3JpdGVfdHJlZV9ibG9jayhzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqYnVmKQoreworCXJldHVybiBidHJmc19mZGF0YXdyaXRlX3JhbmdlKGJ1Zi0+Zmlyc3RfcGFnZS0+bWFwcGluZywgYnVmLT5zdGFydCwKKwkJCQkgICAgICBidWYtPnN0YXJ0ICsgYnVmLT5sZW4gLSAxLCBXQl9TWU5DX0FMTCk7Cit9CisKK2ludCBidHJmc193YWl0X3RyZWVfYmxvY2tfd3JpdGViYWNrKHN0cnVjdCBleHRlbnRfYnVmZmVyICpidWYpCit7CisJcmV0dXJuIGJ0cmZzX3dhaXRfb25fcGFnZV93cml0ZWJhY2tfcmFuZ2UoYnVmLT5maXJzdF9wYWdlLT5tYXBwaW5nLAorCQkJCSAgYnVmLT5zdGFydCwgYnVmLT5zdGFydCArIGJ1Zi0+bGVuIC0gMSk7Cit9CisKK3N0cnVjdCBleHRlbnRfYnVmZmVyICpyZWFkX3RyZWVfYmxvY2soc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsIHU2NCBieXRlbnIsCisJCQkJICAgICAgdTMyIGJsb2Nrc2l6ZSwgdTY0IHBhcmVudF90cmFuc2lkKQoreworCXN0cnVjdCBleHRlbnRfYnVmZmVyICpidWYgPSBOVUxMOworCXN0cnVjdCBpbm9kZSAqYnRyZWVfaW5vZGUgPSByb290LT5mc19pbmZvLT5idHJlZV9pbm9kZTsKKwlzdHJ1Y3QgZXh0ZW50X2lvX3RyZWUgKmlvX3RyZWU7CisJaW50IHJldDsKKworCWlvX3RyZWUgPSAmQlRSRlNfSShidHJlZV9pbm9kZSktPmlvX3RyZWU7CisKKwlidWYgPSBidHJmc19maW5kX2NyZWF0ZV90cmVlX2Jsb2NrKHJvb3QsIGJ5dGVuciwgYmxvY2tzaXplKTsKKwlpZiAoIWJ1ZikKKwkJcmV0dXJuIE5VTEw7CisKKwlyZXQgPSBidHJlZV9yZWFkX2V4dGVudF9idWZmZXJfcGFnZXMocm9vdCwgYnVmLCAwLCBwYXJlbnRfdHJhbnNpZCk7CisKKwlpZiAocmV0ID09IDApCisJCWJ1Zi0+ZmxhZ3MgfD0gRVhURU5UX1VQVE9EQVRFOworCWVsc2UKKwkJV0FSTl9PTigxKTsKKwlyZXR1cm4gYnVmOworCit9CisKK2ludCBjbGVhbl90cmVlX2Jsb2NrKHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLCBzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwKKwkJICAgICBzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqYnVmKQoreworCXN0cnVjdCBpbm9kZSAqYnRyZWVfaW5vZGUgPSByb290LT5mc19pbmZvLT5idHJlZV9pbm9kZTsKKwlpZiAoYnRyZnNfaGVhZGVyX2dlbmVyYXRpb24oYnVmKSA9PQorCSAgICByb290LT5mc19pbmZvLT5ydW5uaW5nX3RyYW5zYWN0aW9uLT50cmFuc2lkKSB7CisJCVdBUk5fT04oIWJ0cmZzX3RyZWVfbG9ja2VkKGJ1ZikpOworCQljbGVhcl9leHRlbnRfYnVmZmVyX2RpcnR5KCZCVFJGU19JKGJ0cmVlX2lub2RlKS0+aW9fdHJlZSwKKwkJCQkJICBidWYpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX3NldHVwX3Jvb3QodTMyIG5vZGVzaXplLCB1MzIgbGVhZnNpemUsIHUzMiBzZWN0b3JzaXplLAorCQkJdTMyIHN0cmlwZXNpemUsIHN0cnVjdCBidHJmc19yb290ICpyb290LAorCQkJc3RydWN0IGJ0cmZzX2ZzX2luZm8gKmZzX2luZm8sCisJCQl1NjQgb2JqZWN0aWQpCit7CisJcm9vdC0+bm9kZSA9IE5VTEw7CisJcm9vdC0+Y29tbWl0X3Jvb3QgPSBOVUxMOworCXJvb3QtPnJlZl90cmVlID0gTlVMTDsKKwlyb290LT5zZWN0b3JzaXplID0gc2VjdG9yc2l6ZTsKKwlyb290LT5ub2Rlc2l6ZSA9IG5vZGVzaXplOworCXJvb3QtPmxlYWZzaXplID0gbGVhZnNpemU7CisJcm9vdC0+c3RyaXBlc2l6ZSA9IHN0cmlwZXNpemU7CisJcm9vdC0+cmVmX2Nvd3MgPSAwOworCXJvb3QtPnRyYWNrX2RpcnR5ID0gMDsKKworCXJvb3QtPmZzX2luZm8gPSBmc19pbmZvOworCXJvb3QtPm9iamVjdGlkID0gb2JqZWN0aWQ7CisJcm9vdC0+bGFzdF90cmFucyA9IDA7CisJcm9vdC0+aGlnaGVzdF9pbm9kZSA9IDA7CisJcm9vdC0+bGFzdF9pbm9kZV9hbGxvYyA9IDA7CisJcm9vdC0+bmFtZSA9IE5VTEw7CisJcm9vdC0+aW5fc3lzZnMgPSAwOworCisJSU5JVF9MSVNUX0hFQUQoJnJvb3QtPmRpcnR5X2xpc3QpOworCUlOSVRfTElTVF9IRUFEKCZyb290LT5vcnBoYW5fbGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJnJvb3QtPmRlYWRfbGlzdCk7CisJc3Bpbl9sb2NrX2luaXQoJnJvb3QtPm5vZGVfbG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJnJvb3QtPmxpc3RfbG9jayk7CisJbXV0ZXhfaW5pdCgmcm9vdC0+b2JqZWN0aWRfbXV0ZXgpOworCW11dGV4X2luaXQoJnJvb3QtPmxvZ19tdXRleCk7CisJZXh0ZW50X2lvX3RyZWVfaW5pdCgmcm9vdC0+ZGlydHlfbG9nX3BhZ2VzLAorCQkJICAgICBmc19pbmZvLT5idHJlZV9pbm9kZS0+aV9tYXBwaW5nLCBHRlBfTk9GUyk7CisKKwlidHJmc19sZWFmX3JlZl90cmVlX2luaXQoJnJvb3QtPnJlZl90cmVlX3N0cnVjdCk7CisJcm9vdC0+cmVmX3RyZWUgPSAmcm9vdC0+cmVmX3RyZWVfc3RydWN0OworCisJbWVtc2V0KCZyb290LT5yb290X2tleSwgMCwgc2l6ZW9mKHJvb3QtPnJvb3Rfa2V5KSk7CisJbWVtc2V0KCZyb290LT5yb290X2l0ZW0sIDAsIHNpemVvZihyb290LT5yb290X2l0ZW0pKTsKKwltZW1zZXQoJnJvb3QtPmRlZnJhZ19wcm9ncmVzcywgMCwgc2l6ZW9mKHJvb3QtPmRlZnJhZ19wcm9ncmVzcykpOworCW1lbXNldCgmcm9vdC0+cm9vdF9rb2JqLCAwLCBzaXplb2Yocm9vdC0+cm9vdF9rb2JqKSk7CisJcm9vdC0+ZGVmcmFnX3RyYW5zX3N0YXJ0ID0gZnNfaW5mby0+Z2VuZXJhdGlvbjsKKwlpbml0X2NvbXBsZXRpb24oJnJvb3QtPmtvYmpfdW5yZWdpc3Rlcik7CisJcm9vdC0+ZGVmcmFnX3J1bm5pbmcgPSAwOworCXJvb3QtPmRlZnJhZ19sZXZlbCA9IDA7CisJcm9vdC0+cm9vdF9rZXkub2JqZWN0aWQgPSBvYmplY3RpZDsKKwlyb290LT5hbm9uX3N1cGVyLnNfcm9vdCA9IE5VTEw7CisJcm9vdC0+YW5vbl9zdXBlci5zX2RldiA9IDA7CisJSU5JVF9MSVNUX0hFQUQoJnJvb3QtPmFub25fc3VwZXIuc19saXN0KTsKKwlJTklUX0xJU1RfSEVBRCgmcm9vdC0+YW5vbl9zdXBlci5zX2luc3RhbmNlcyk7CisJaW5pdF9yd3NlbSgmcm9vdC0+YW5vbl9zdXBlci5zX3Vtb3VudCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmaW5kX2FuZF9zZXR1cF9yb290KHN0cnVjdCBidHJmc19yb290ICp0cmVlX3Jvb3QsCisJCQkgICAgICAgc3RydWN0IGJ0cmZzX2ZzX2luZm8gKmZzX2luZm8sCisJCQkgICAgICAgdTY0IG9iamVjdGlkLAorCQkJICAgICAgIHN0cnVjdCBidHJmc19yb290ICpyb290KQoreworCWludCByZXQ7CisJdTMyIGJsb2Nrc2l6ZTsKKwl1NjQgZ2VuZXJhdGlvbjsKKworCV9fc2V0dXBfcm9vdCh0cmVlX3Jvb3QtPm5vZGVzaXplLCB0cmVlX3Jvb3QtPmxlYWZzaXplLAorCQkgICAgIHRyZWVfcm9vdC0+c2VjdG9yc2l6ZSwgdHJlZV9yb290LT5zdHJpcGVzaXplLAorCQkgICAgIHJvb3QsIGZzX2luZm8sIG9iamVjdGlkKTsKKwlyZXQgPSBidHJmc19maW5kX2xhc3Rfcm9vdCh0cmVlX3Jvb3QsIG9iamVjdGlkLAorCQkJCSAgICZyb290LT5yb290X2l0ZW0sICZyb290LT5yb290X2tleSk7CisJQlVHX09OKHJldCk7CisKKwlnZW5lcmF0aW9uID0gYnRyZnNfcm9vdF9nZW5lcmF0aW9uKCZyb290LT5yb290X2l0ZW0pOworCWJsb2Nrc2l6ZSA9IGJ0cmZzX2xldmVsX3NpemUocm9vdCwgYnRyZnNfcm9vdF9sZXZlbCgmcm9vdC0+cm9vdF9pdGVtKSk7CisJcm9vdC0+bm9kZSA9IHJlYWRfdHJlZV9ibG9jayhyb290LCBidHJmc19yb290X2J5dGVucigmcm9vdC0+cm9vdF9pdGVtKSwKKwkJCQkgICAgIGJsb2Nrc2l6ZSwgZ2VuZXJhdGlvbik7CisJQlVHX09OKCFyb290LT5ub2RlKTsKKwlyZXR1cm4gMDsKK30KKworaW50IGJ0cmZzX2ZyZWVfbG9nX3Jvb3RfdHJlZShzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKKwkJCSAgICAgc3RydWN0IGJ0cmZzX2ZzX2luZm8gKmZzX2luZm8pCit7CisJc3RydWN0IGV4dGVudF9idWZmZXIgKmViOworCXN0cnVjdCBidHJmc19yb290ICpsb2dfcm9vdF90cmVlID0gZnNfaW5mby0+bG9nX3Jvb3RfdHJlZTsKKwl1NjQgc3RhcnQgPSAwOworCXU2NCBlbmQgPSAwOworCWludCByZXQ7CisKKwlpZiAoIWxvZ19yb290X3RyZWUpCisJCXJldHVybiAwOworCisJd2hpbGUgKDEpIHsKKwkJcmV0ID0gZmluZF9maXJzdF9leHRlbnRfYml0KCZsb2dfcm9vdF90cmVlLT5kaXJ0eV9sb2dfcGFnZXMsCisJCQkJICAgIDAsICZzdGFydCwgJmVuZCwgRVhURU5UX0RJUlRZKTsKKwkJaWYgKHJldCkKKwkJCWJyZWFrOworCisJCWNsZWFyX2V4dGVudF9kaXJ0eSgmbG9nX3Jvb3RfdHJlZS0+ZGlydHlfbG9nX3BhZ2VzLAorCQkJCSAgIHN0YXJ0LCBlbmQsIEdGUF9OT0ZTKTsKKwl9CisJZWIgPSBmc19pbmZvLT5sb2dfcm9vdF90cmVlLT5ub2RlOworCisJV0FSTl9PTihidHJmc19oZWFkZXJfbGV2ZWwoZWIpICE9IDApOworCVdBUk5fT04oYnRyZnNfaGVhZGVyX25yaXRlbXMoZWIpICE9IDApOworCisJcmV0ID0gYnRyZnNfZnJlZV9yZXNlcnZlZF9leHRlbnQoZnNfaW5mby0+dHJlZV9yb290LAorCQkJCWViLT5zdGFydCwgZWItPmxlbik7CisJQlVHX09OKHJldCk7CisKKwlmcmVlX2V4dGVudF9idWZmZXIoZWIpOworCWtmcmVlKGZzX2luZm8tPmxvZ19yb290X3RyZWUpOworCWZzX2luZm8tPmxvZ19yb290X3RyZWUgPSBOVUxMOworCXJldHVybiAwOworfQorCitpbnQgYnRyZnNfaW5pdF9sb2dfcm9vdF90cmVlKHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAorCQkJICAgICBzdHJ1Y3QgYnRyZnNfZnNfaW5mbyAqZnNfaW5mbykKK3sKKwlzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdDsKKwlzdHJ1Y3QgYnRyZnNfcm9vdCAqdHJlZV9yb290ID0gZnNfaW5mby0+dHJlZV9yb290OworCisJcm9vdCA9IGt6YWxsb2Moc2l6ZW9mKCpyb290KSwgR0ZQX05PRlMpOworCWlmICghcm9vdCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlfX3NldHVwX3Jvb3QodHJlZV9yb290LT5ub2Rlc2l6ZSwgdHJlZV9yb290LT5sZWFmc2l6ZSwKKwkJICAgICB0cmVlX3Jvb3QtPnNlY3RvcnNpemUsIHRyZWVfcm9vdC0+c3RyaXBlc2l6ZSwKKwkJICAgICByb290LCBmc19pbmZvLCBCVFJGU19UUkVFX0xPR19PQkpFQ1RJRCk7CisKKwlyb290LT5yb290X2tleS5vYmplY3RpZCA9IEJUUkZTX1RSRUVfTE9HX09CSkVDVElEOworCXJvb3QtPnJvb3Rfa2V5LnR5cGUgPSBCVFJGU19ST09UX0lURU1fS0VZOworCXJvb3QtPnJvb3Rfa2V5Lm9mZnNldCA9IEJUUkZTX1RSRUVfTE9HX09CSkVDVElEOworCXJvb3QtPnJlZl9jb3dzID0gMDsKKworCXJvb3QtPm5vZGUgPSBidHJmc19hbGxvY19mcmVlX2Jsb2NrKHRyYW5zLCByb290LCByb290LT5sZWFmc2l6ZSwKKwkJCQkJICAgIDAsIEJUUkZTX1RSRUVfTE9HX09CSkVDVElELAorCQkJCQkgICAgdHJhbnMtPnRyYW5zaWQsIDAsIDAsIDApOworCisJYnRyZnNfc2V0X2hlYWRlcl9ucml0ZW1zKHJvb3QtPm5vZGUsIDApOworCWJ0cmZzX3NldF9oZWFkZXJfbGV2ZWwocm9vdC0+bm9kZSwgMCk7CisJYnRyZnNfc2V0X2hlYWRlcl9ieXRlbnIocm9vdC0+bm9kZSwgcm9vdC0+bm9kZS0+c3RhcnQpOworCWJ0cmZzX3NldF9oZWFkZXJfZ2VuZXJhdGlvbihyb290LT5ub2RlLCB0cmFucy0+dHJhbnNpZCk7CisJYnRyZnNfc2V0X2hlYWRlcl9vd25lcihyb290LT5ub2RlLCBCVFJGU19UUkVFX0xPR19PQkpFQ1RJRCk7CisKKwl3cml0ZV9leHRlbnRfYnVmZmVyKHJvb3QtPm5vZGUsIHJvb3QtPmZzX2luZm8tPmZzaWQsCisJCQkgICAgKHVuc2lnbmVkIGxvbmcpYnRyZnNfaGVhZGVyX2ZzaWQocm9vdC0+bm9kZSksCisJCQkgICAgQlRSRlNfRlNJRF9TSVpFKTsKKwlidHJmc19tYXJrX2J1ZmZlcl9kaXJ0eShyb290LT5ub2RlKTsKKwlidHJmc190cmVlX3VubG9jayhyb290LT5ub2RlKTsKKwlmc19pbmZvLT5sb2dfcm9vdF90cmVlID0gcm9vdDsKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IGJ0cmZzX3Jvb3QgKmJ0cmZzX3JlYWRfZnNfcm9vdF9ub19yYWRpeChzdHJ1Y3QgYnRyZnNfcm9vdCAqdHJlZV9yb290LAorCQkJCQkgICAgICAgc3RydWN0IGJ0cmZzX2tleSAqbG9jYXRpb24pCit7CisJc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3Q7CisJc3RydWN0IGJ0cmZzX2ZzX2luZm8gKmZzX2luZm8gPSB0cmVlX3Jvb3QtPmZzX2luZm87CisJc3RydWN0IGJ0cmZzX3BhdGggKnBhdGg7CisJc3RydWN0IGV4dGVudF9idWZmZXIgKmw7CisJdTY0IGhpZ2hlc3RfaW5vZGU7CisJdTY0IGdlbmVyYXRpb247CisJdTMyIGJsb2Nrc2l6ZTsKKwlpbnQgcmV0ID0gMDsKKworCXJvb3QgPSBremFsbG9jKHNpemVvZigqcm9vdCksIEdGUF9OT0ZTKTsKKwlpZiAoIXJvb3QpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCWlmIChsb2NhdGlvbi0+b2Zmc2V0ID09ICh1NjQpLTEpIHsKKwkJcmV0ID0gZmluZF9hbmRfc2V0dXBfcm9vdCh0cmVlX3Jvb3QsIGZzX2luZm8sCisJCQkJCSAgbG9jYXRpb24tPm9iamVjdGlkLCByb290KTsKKwkJaWYgKHJldCkgeworCQkJa2ZyZWUocm9vdCk7CisJCQlyZXR1cm4gRVJSX1BUUihyZXQpOworCQl9CisJCWdvdG8gaW5zZXJ0OworCX0KKworCV9fc2V0dXBfcm9vdCh0cmVlX3Jvb3QtPm5vZGVzaXplLCB0cmVlX3Jvb3QtPmxlYWZzaXplLAorCQkgICAgIHRyZWVfcm9vdC0+c2VjdG9yc2l6ZSwgdHJlZV9yb290LT5zdHJpcGVzaXplLAorCQkgICAgIHJvb3QsIGZzX2luZm8sIGxvY2F0aW9uLT5vYmplY3RpZCk7CisKKwlwYXRoID0gYnRyZnNfYWxsb2NfcGF0aCgpOworCUJVR19PTighcGF0aCk7CisJcmV0ID0gYnRyZnNfc2VhcmNoX3Nsb3QoTlVMTCwgdHJlZV9yb290LCBsb2NhdGlvbiwgcGF0aCwgMCwgMCk7CisJaWYgKHJldCAhPSAwKSB7CisJCWlmIChyZXQgPiAwKQorCQkJcmV0ID0gLUVOT0VOVDsKKwkJZ290byBvdXQ7CisJfQorCWwgPSBwYXRoLT5ub2Rlc1swXTsKKwlyZWFkX2V4dGVudF9idWZmZXIobCwgJnJvb3QtPnJvb3RfaXRlbSwKKwkgICAgICAgYnRyZnNfaXRlbV9wdHJfb2Zmc2V0KGwsIHBhdGgtPnNsb3RzWzBdKSwKKwkgICAgICAgc2l6ZW9mKHJvb3QtPnJvb3RfaXRlbSkpOworCW1lbWNweSgmcm9vdC0+cm9vdF9rZXksIGxvY2F0aW9uLCBzaXplb2YoKmxvY2F0aW9uKSk7CisJcmV0ID0gMDsKK291dDoKKwlidHJmc19yZWxlYXNlX3BhdGgocm9vdCwgcGF0aCk7CisJYnRyZnNfZnJlZV9wYXRoKHBhdGgpOworCWlmIChyZXQpIHsKKwkJa2ZyZWUocm9vdCk7CisJCXJldHVybiBFUlJfUFRSKHJldCk7CisJfQorCWdlbmVyYXRpb24gPSBidHJmc19yb290X2dlbmVyYXRpb24oJnJvb3QtPnJvb3RfaXRlbSk7CisJYmxvY2tzaXplID0gYnRyZnNfbGV2ZWxfc2l6ZShyb290LCBidHJmc19yb290X2xldmVsKCZyb290LT5yb290X2l0ZW0pKTsKKwlyb290LT5ub2RlID0gcmVhZF90cmVlX2Jsb2NrKHJvb3QsIGJ0cmZzX3Jvb3RfYnl0ZW5yKCZyb290LT5yb290X2l0ZW0pLAorCQkJCSAgICAgYmxvY2tzaXplLCBnZW5lcmF0aW9uKTsKKwlCVUdfT04oIXJvb3QtPm5vZGUpOworaW5zZXJ0OgorCWlmIChsb2NhdGlvbi0+b2JqZWN0aWQgIT0gQlRSRlNfVFJFRV9MT0dfT0JKRUNUSUQpIHsKKwkJcm9vdC0+cmVmX2Nvd3MgPSAxOworCQlyZXQgPSBidHJmc19maW5kX2hpZ2hlc3RfaW5vZGUocm9vdCwgJmhpZ2hlc3RfaW5vZGUpOworCQlpZiAocmV0ID09IDApIHsKKwkJCXJvb3QtPmhpZ2hlc3RfaW5vZGUgPSBoaWdoZXN0X2lub2RlOworCQkJcm9vdC0+bGFzdF9pbm9kZV9hbGxvYyA9IGhpZ2hlc3RfaW5vZGU7CisJCX0KKwl9CisJcmV0dXJuIHJvb3Q7Cit9CisKK3N0cnVjdCBidHJmc19yb290ICpidHJmc19sb29rdXBfZnNfcm9vdChzdHJ1Y3QgYnRyZnNfZnNfaW5mbyAqZnNfaW5mbywKKwkJCQkJdTY0IHJvb3Rfb2JqZWN0aWQpCit7CisJc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3Q7CisKKwlpZiAocm9vdF9vYmplY3RpZCA9PSBCVFJGU19ST09UX1RSRUVfT0JKRUNUSUQpCisJCXJldHVybiBmc19pbmZvLT50cmVlX3Jvb3Q7CisJaWYgKHJvb3Rfb2JqZWN0aWQgPT0gQlRSRlNfRVhURU5UX1RSRUVfT0JKRUNUSUQpCisJCXJldHVybiBmc19pbmZvLT5leHRlbnRfcm9vdDsKKworCXJvb3QgPSByYWRpeF90cmVlX2xvb2t1cCgmZnNfaW5mby0+ZnNfcm9vdHNfcmFkaXgsCisJCQkJICh1bnNpZ25lZCBsb25nKXJvb3Rfb2JqZWN0aWQpOworCXJldHVybiByb290OworfQorCitzdHJ1Y3QgYnRyZnNfcm9vdCAqYnRyZnNfcmVhZF9mc19yb290X25vX25hbWUoc3RydWN0IGJ0cmZzX2ZzX2luZm8gKmZzX2luZm8sCisJCQkJCSAgICAgIHN0cnVjdCBidHJmc19rZXkgKmxvY2F0aW9uKQoreworCXN0cnVjdCBidHJmc19yb290ICpyb290OworCWludCByZXQ7CisKKwlpZiAobG9jYXRpb24tPm9iamVjdGlkID09IEJUUkZTX1JPT1RfVFJFRV9PQkpFQ1RJRCkKKwkJcmV0dXJuIGZzX2luZm8tPnRyZWVfcm9vdDsKKwlpZiAobG9jYXRpb24tPm9iamVjdGlkID09IEJUUkZTX0VYVEVOVF9UUkVFX09CSkVDVElEKQorCQlyZXR1cm4gZnNfaW5mby0+ZXh0ZW50X3Jvb3Q7CisJaWYgKGxvY2F0aW9uLT5vYmplY3RpZCA9PSBCVFJGU19DSFVOS19UUkVFX09CSkVDVElEKQorCQlyZXR1cm4gZnNfaW5mby0+Y2h1bmtfcm9vdDsKKwlpZiAobG9jYXRpb24tPm9iamVjdGlkID09IEJUUkZTX0RFVl9UUkVFX09CSkVDVElEKQorCQlyZXR1cm4gZnNfaW5mby0+ZGV2X3Jvb3Q7CisJaWYgKGxvY2F0aW9uLT5vYmplY3RpZCA9PSBCVFJGU19DU1VNX1RSRUVfT0JKRUNUSUQpCisJCXJldHVybiBmc19pbmZvLT5jc3VtX3Jvb3Q7CisKKwlyb290ID0gcmFkaXhfdHJlZV9sb29rdXAoJmZzX2luZm8tPmZzX3Jvb3RzX3JhZGl4LAorCQkJCSAodW5zaWduZWQgbG9uZylsb2NhdGlvbi0+b2JqZWN0aWQpOworCWlmIChyb290KQorCQlyZXR1cm4gcm9vdDsKKworCXJvb3QgPSBidHJmc19yZWFkX2ZzX3Jvb3Rfbm9fcmFkaXgoZnNfaW5mby0+dHJlZV9yb290LCBsb2NhdGlvbik7CisJaWYgKElTX0VSUihyb290KSkKKwkJcmV0dXJuIHJvb3Q7CisKKwlzZXRfYW5vbl9zdXBlcigmcm9vdC0+YW5vbl9zdXBlciwgTlVMTCk7CisKKwlyZXQgPSByYWRpeF90cmVlX2luc2VydCgmZnNfaW5mby0+ZnNfcm9vdHNfcmFkaXgsCisJCQkJKHVuc2lnbmVkIGxvbmcpcm9vdC0+cm9vdF9rZXkub2JqZWN0aWQsCisJCQkJcm9vdCk7CisJaWYgKHJldCkgeworCQlmcmVlX2V4dGVudF9idWZmZXIocm9vdC0+bm9kZSk7CisJCWtmcmVlKHJvb3QpOworCQlyZXR1cm4gRVJSX1BUUihyZXQpOworCX0KKwlpZiAoIShmc19pbmZvLT5zYi0+c19mbGFncyAmIE1TX1JET05MWSkpIHsKKwkJcmV0ID0gYnRyZnNfZmluZF9kZWFkX3Jvb3RzKGZzX2luZm8tPnRyZWVfcm9vdCwKKwkJCQkJICAgIHJvb3QtPnJvb3Rfa2V5Lm9iamVjdGlkLCByb290KTsKKwkJQlVHX09OKHJldCk7CisJCWJ0cmZzX29ycGhhbl9jbGVhbnVwKHJvb3QpOworCX0KKwlyZXR1cm4gcm9vdDsKK30KKworc3RydWN0IGJ0cmZzX3Jvb3QgKmJ0cmZzX3JlYWRfZnNfcm9vdChzdHJ1Y3QgYnRyZnNfZnNfaW5mbyAqZnNfaW5mbywKKwkJCQkgICAgICBzdHJ1Y3QgYnRyZnNfa2V5ICpsb2NhdGlvbiwKKwkJCQkgICAgICBjb25zdCBjaGFyICpuYW1lLCBpbnQgbmFtZWxlbikKK3sKKwlzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdDsKKwlpbnQgcmV0OworCisJcm9vdCA9IGJ0cmZzX3JlYWRfZnNfcm9vdF9ub19uYW1lKGZzX2luZm8sIGxvY2F0aW9uKTsKKwlpZiAoIXJvb3QpCisJCXJldHVybiBOVUxMOworCisJaWYgKHJvb3QtPmluX3N5c2ZzKQorCQlyZXR1cm4gcm9vdDsKKworCXJldCA9IGJ0cmZzX3NldF9yb290X25hbWUocm9vdCwgbmFtZSwgbmFtZWxlbik7CisJaWYgKHJldCkgeworCQlmcmVlX2V4dGVudF9idWZmZXIocm9vdC0+bm9kZSk7CisJCWtmcmVlKHJvb3QpOworCQlyZXR1cm4gRVJSX1BUUihyZXQpOworCX0KKyNpZiAwCisJcmV0ID0gYnRyZnNfc3lzZnNfYWRkX3Jvb3Qocm9vdCk7CisJaWYgKHJldCkgeworCQlmcmVlX2V4dGVudF9idWZmZXIocm9vdC0+bm9kZSk7CisJCWtmcmVlKHJvb3QtPm5hbWUpOworCQlrZnJlZShyb290KTsKKwkJcmV0dXJuIEVSUl9QVFIocmV0KTsKKwl9CisjZW5kaWYKKwlyb290LT5pbl9zeXNmcyA9IDE7CisJcmV0dXJuIHJvb3Q7Cit9CisKK3N0YXRpYyBpbnQgYnRyZnNfY29uZ2VzdGVkX2ZuKHZvaWQgKmNvbmdlc3RlZF9kYXRhLCBpbnQgYmRpX2JpdHMpCit7CisJc3RydWN0IGJ0cmZzX2ZzX2luZm8gKmluZm8gPSAoc3RydWN0IGJ0cmZzX2ZzX2luZm8gKiljb25nZXN0ZWRfZGF0YTsKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpjdXI7CisJc3RydWN0IGJ0cmZzX2RldmljZSAqZGV2aWNlOworCXN0cnVjdCBiYWNraW5nX2Rldl9pbmZvICpiZGk7CisjaWYgMAorCWlmICgoYmRpX2JpdHMgJiAoMSA8PCBCRElfd3JpdGVfY29uZ2VzdGVkKSkgJiYKKwkgICAgYnRyZnNfY29uZ2VzdGVkX2FzeW5jKGluZm8sIDApKQorCQlyZXR1cm4gMTsKKyNlbmRpZgorCWxpc3RfZm9yX2VhY2goY3VyLCAmaW5mby0+ZnNfZGV2aWNlcy0+ZGV2aWNlcykgeworCQlkZXZpY2UgPSBsaXN0X2VudHJ5KGN1ciwgc3RydWN0IGJ0cmZzX2RldmljZSwgZGV2X2xpc3QpOworCQlpZiAoIWRldmljZS0+YmRldikKKwkJCWNvbnRpbnVlOworCQliZGkgPSBibGtfZ2V0X2JhY2tpbmdfZGV2X2luZm8oZGV2aWNlLT5iZGV2KTsKKwkJaWYgKGJkaSAmJiBiZGlfY29uZ2VzdGVkKGJkaSwgYmRpX2JpdHMpKSB7CisJCQlyZXQgPSAxOworCQkJYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIHRoaXMgdW5wbHVncyBldmVyeSBkZXZpY2Ugb24gdGhlIGJveCwgYW5kIGl0IGlzIG9ubHkgdXNlZCB3aGVuIHBhZ2UKKyAqIGlzIG51bGwKKyAqLworc3RhdGljIHZvaWQgX191bnBsdWdfaW9fZm4oc3RydWN0IGJhY2tpbmdfZGV2X2luZm8gKmJkaSwgc3RydWN0IHBhZ2UgKnBhZ2UpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqY3VyOworCXN0cnVjdCBidHJmc19kZXZpY2UgKmRldmljZTsKKwlzdHJ1Y3QgYnRyZnNfZnNfaW5mbyAqaW5mbzsKKworCWluZm8gPSAoc3RydWN0IGJ0cmZzX2ZzX2luZm8gKiliZGktPnVucGx1Z19pb19kYXRhOworCWxpc3RfZm9yX2VhY2goY3VyLCAmaW5mby0+ZnNfZGV2aWNlcy0+ZGV2aWNlcykgeworCQlkZXZpY2UgPSBsaXN0X2VudHJ5KGN1ciwgc3RydWN0IGJ0cmZzX2RldmljZSwgZGV2X2xpc3QpOworCQlpZiAoIWRldmljZS0+YmRldikKKwkJCWNvbnRpbnVlOworCisJCWJkaSA9IGJsa19nZXRfYmFja2luZ19kZXZfaW5mbyhkZXZpY2UtPmJkZXYpOworCQlpZiAoYmRpLT51bnBsdWdfaW9fZm4pCisJCQliZGktPnVucGx1Z19pb19mbihiZGksIHBhZ2UpOworCX0KK30KKworc3RhdGljIHZvaWQgYnRyZnNfdW5wbHVnX2lvX2ZuKHN0cnVjdCBiYWNraW5nX2Rldl9pbmZvICpiZGksIHN0cnVjdCBwYWdlICpwYWdlKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisJc3RydWN0IGV4dGVudF9tYXBfdHJlZSAqZW1fdHJlZTsKKwlzdHJ1Y3QgZXh0ZW50X21hcCAqZW07CisJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmc7CisJdTY0IG9mZnNldDsKKworCS8qIHRoZSBnZW5lcmljIE9fRElSRUNUIHJlYWQgY29kZSBkb2VzIHRoaXMgKi8KKwlpZiAoMSB8fCAhcGFnZSkgeworCQlfX3VucGx1Z19pb19mbihiZGksIHBhZ2UpOworCQlyZXR1cm47CisJfQorCisJLyoKKwkgKiBwYWdlLT5tYXBwaW5nIG1heSBjaGFuZ2UgYXQgYW55IHRpbWUuICBHZXQgYSBjb25zaXN0ZW50IGNvcHkKKwkgKiBhbmQgdXNlIHRoYXQgZm9yIGV2ZXJ5dGhpbmcgYmVsb3cKKwkgKi8KKwlzbXBfbWIoKTsKKwltYXBwaW5nID0gcGFnZS0+bWFwcGluZzsKKwlpZiAoIW1hcHBpbmcpCisJCXJldHVybjsKKworCWlub2RlID0gbWFwcGluZy0+aG9zdDsKKworCS8qCisJICogZG9uJ3QgZG8gdGhlIGV4cGVuc2l2ZSBzZWFyY2hpbmcgZm9yIGEgc21hbGwgbnVtYmVyIG9mCisJICogZGV2aWNlcworCSAqLworCWlmIChCVFJGU19JKGlub2RlKS0+cm9vdC0+ZnNfaW5mby0+ZnNfZGV2aWNlcy0+b3Blbl9kZXZpY2VzIDw9IDIpIHsKKwkJX191bnBsdWdfaW9fZm4oYmRpLCBwYWdlKTsKKwkJcmV0dXJuOworCX0KKworCW9mZnNldCA9IHBhZ2Vfb2Zmc2V0KHBhZ2UpOworCisJZW1fdHJlZSA9ICZCVFJGU19JKGlub2RlKS0+ZXh0ZW50X3RyZWU7CisJc3Bpbl9sb2NrKCZlbV90cmVlLT5sb2NrKTsKKwllbSA9IGxvb2t1cF9leHRlbnRfbWFwcGluZyhlbV90cmVlLCBvZmZzZXQsIFBBR0VfQ0FDSEVfU0laRSk7CisJc3Bpbl91bmxvY2soJmVtX3RyZWUtPmxvY2spOworCWlmICghZW0pIHsKKwkJX191bnBsdWdfaW9fZm4oYmRpLCBwYWdlKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChlbS0+YmxvY2tfc3RhcnQgPj0gRVhURU5UX01BUF9MQVNUX0JZVEUpIHsKKwkJZnJlZV9leHRlbnRfbWFwKGVtKTsKKwkJX191bnBsdWdfaW9fZm4oYmRpLCBwYWdlKTsKKwkJcmV0dXJuOworCX0KKwlvZmZzZXQgPSBvZmZzZXQgLSBlbS0+c3RhcnQ7CisJYnRyZnNfdW5wbHVnX3BhZ2UoJkJUUkZTX0koaW5vZGUpLT5yb290LT5mc19pbmZvLT5tYXBwaW5nX3RyZWUsCisJCQkgIGVtLT5ibG9ja19zdGFydCArIG9mZnNldCwgcGFnZSk7CisJZnJlZV9leHRlbnRfbWFwKGVtKTsKK30KKworc3RhdGljIGludCBzZXR1cF9iZGkoc3RydWN0IGJ0cmZzX2ZzX2luZm8gKmluZm8sIHN0cnVjdCBiYWNraW5nX2Rldl9pbmZvICpiZGkpCit7CisJYmRpX2luaXQoYmRpKTsKKwliZGktPnJhX3BhZ2VzCT0gZGVmYXVsdF9iYWNraW5nX2Rldl9pbmZvLnJhX3BhZ2VzOworCWJkaS0+c3RhdGUJCT0gMDsKKwliZGktPmNhcGFiaWxpdGllcwk9IGRlZmF1bHRfYmFja2luZ19kZXZfaW5mby5jYXBhYmlsaXRpZXM7CisJYmRpLT51bnBsdWdfaW9fZm4JPSBidHJmc191bnBsdWdfaW9fZm47CisJYmRpLT51bnBsdWdfaW9fZGF0YQk9IGluZm87CisJYmRpLT5jb25nZXN0ZWRfZm4JPSBidHJmc19jb25nZXN0ZWRfZm47CisJYmRpLT5jb25nZXN0ZWRfZGF0YQk9IGluZm87CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYmlvX3JlYWR5X2Zvcl9jc3VtKHN0cnVjdCBiaW8gKmJpbykKK3sKKwl1NjQgbGVuZ3RoID0gMDsKKwl1NjQgYnVmX2xlbiA9IDA7CisJdTY0IHN0YXJ0ID0gMDsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwlzdHJ1Y3QgZXh0ZW50X2lvX3RyZWUgKmlvX3RyZWUgPSBOVUxMOworCXN0cnVjdCBidHJmc19mc19pbmZvICppbmZvID0gTlVMTDsKKwlzdHJ1Y3QgYmlvX3ZlYyAqYnZlYzsKKwlpbnQgaTsKKwlpbnQgcmV0OworCisJYmlvX2Zvcl9lYWNoX3NlZ21lbnQoYnZlYywgYmlvLCBpKSB7CisJCXBhZ2UgPSBidmVjLT5idl9wYWdlOworCQlpZiAocGFnZS0+cHJpdmF0ZSA9PSBFWFRFTlRfUEFHRV9QUklWQVRFKSB7CisJCQlsZW5ndGggKz0gYnZlYy0+YnZfbGVuOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFwYWdlLT5wcml2YXRlKSB7CisJCQlsZW5ndGggKz0gYnZlYy0+YnZfbGVuOworCQkJY29udGludWU7CisJCX0KKwkJbGVuZ3RoID0gYnZlYy0+YnZfbGVuOworCQlidWZfbGVuID0gcGFnZS0+cHJpdmF0ZSA+PiAyOworCQlzdGFydCA9IHBhZ2Vfb2Zmc2V0KHBhZ2UpICsgYnZlYy0+YnZfb2Zmc2V0OworCQlpb190cmVlID0gJkJUUkZTX0kocGFnZS0+bWFwcGluZy0+aG9zdCktPmlvX3RyZWU7CisJCWluZm8gPSBCVFJGU19JKHBhZ2UtPm1hcHBpbmctPmhvc3QpLT5yb290LT5mc19pbmZvOworCX0KKwkvKiBhcmUgd2UgZnVsbHkgY29udGFpbmVkIGluIHRoaXMgYmlvPyAqLworCWlmIChidWZfbGVuIDw9IGxlbmd0aCkKKwkJcmV0dXJuIDE7CisKKwlyZXQgPSBleHRlbnRfcmFuZ2VfdXB0b2RhdGUoaW9fdHJlZSwgc3RhcnQgKyBsZW5ndGgsCisJCQkJICAgIHN0YXJ0ICsgYnVmX2xlbiAtIDEpOworCWlmIChyZXQgPT0gMSkKKwkJcmV0dXJuIHJldDsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogY2FsbGVkIGJ5IHRoZSBrdGhyZWFkIGhlbHBlciBmdW5jdGlvbnMgdG8gZmluYWxseSBjYWxsIHRoZSBiaW8gZW5kX2lvCisgKiBmdW5jdGlvbnMuICBUaGlzIGlzIHdoZXJlIHJlYWQgY2hlY2tzdW0gdmVyaWZpY2F0aW9uIGFjdHVhbGx5IGhhcHBlbnMKKyAqLworc3RhdGljIHZvaWQgZW5kX3dvcmtxdWV1ZV9mbihzdHJ1Y3QgYnRyZnNfd29yayAqd29yaykKK3sKKwlzdHJ1Y3QgYmlvICpiaW87CisJc3RydWN0IGVuZF9pb193cSAqZW5kX2lvX3dxOworCXN0cnVjdCBidHJmc19mc19pbmZvICpmc19pbmZvOworCWludCBlcnJvcjsKKworCWVuZF9pb193cSA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgZW5kX2lvX3dxLCB3b3JrKTsKKwliaW8gPSBlbmRfaW9fd3EtPmJpbzsKKwlmc19pbmZvID0gZW5kX2lvX3dxLT5pbmZvOworCisJLyogbWV0YWRhdGEgYmlvIHJlYWRzIGFyZSBzcGVjaWFsIGJlY2F1c2UgdGhlIHdob2xlIHRyZWUgYmxvY2sgbXVzdAorCSAqIGJlIGNoZWNrc3VtbWVkIGF0IG9uY2UuICBUaGlzIG1ha2VzIHN1cmUgdGhlIGVudGlyZSBibG9jayBpcyBpbgorCSAqIHJhbSBhbmQgdXAgdG8gZGF0ZSBiZWZvcmUgdHJ5aW5nIHRvIHZlcmlmeSB0aGluZ3MuICBGb3IKKwkgKiBibG9ja3NpemUgPD0gcGFnZXNpemUsIGl0IGlzIGJhc2ljYWxseSBhIG5vb3AKKwkgKi8KKwlpZiAoIShiaW8tPmJpX3J3ICYgKDEgPDwgQklPX1JXKSkgJiYgZW5kX2lvX3dxLT5tZXRhZGF0YSAmJgorCSAgICAhYmlvX3JlYWR5X2Zvcl9jc3VtKGJpbykpIHsKKwkJYnRyZnNfcXVldWVfd29ya2VyKCZmc19pbmZvLT5lbmRpb19tZXRhX3dvcmtlcnMsCisJCQkJICAgJmVuZF9pb193cS0+d29yayk7CisJCXJldHVybjsKKwl9CisJZXJyb3IgPSBlbmRfaW9fd3EtPmVycm9yOworCWJpby0+YmlfcHJpdmF0ZSA9IGVuZF9pb193cS0+cHJpdmF0ZTsKKwliaW8tPmJpX2VuZF9pbyA9IGVuZF9pb193cS0+ZW5kX2lvOworCWtmcmVlKGVuZF9pb193cSk7CisJYmlvX2VuZGlvKGJpbywgZXJyb3IpOworfQorCitzdGF0aWMgaW50IGNsZWFuZXJfa3RocmVhZCh2b2lkICphcmcpCit7CisJc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QgPSBhcmc7CisKKwlkbyB7CisJCXNtcF9tYigpOworCQlpZiAocm9vdC0+ZnNfaW5mby0+Y2xvc2luZykKKwkJCWJyZWFrOworCisJCXZmc19jaGVja19mcm96ZW4ocm9vdC0+ZnNfaW5mby0+c2IsIFNCX0ZSRUVaRV9XUklURSk7CisJCW11dGV4X2xvY2soJnJvb3QtPmZzX2luZm8tPmNsZWFuZXJfbXV0ZXgpOworCQlidHJmc19jbGVhbl9vbGRfc25hcHNob3RzKHJvb3QpOworCQltdXRleF91bmxvY2soJnJvb3QtPmZzX2luZm8tPmNsZWFuZXJfbXV0ZXgpOworCisJCWlmIChmcmVlemluZyhjdXJyZW50KSkgeworCQkJcmVmcmlnZXJhdG9yKCk7CisJCX0gZWxzZSB7CisJCQlzbXBfbWIoKTsKKwkJCWlmIChyb290LT5mc19pbmZvLT5jbG9zaW5nKQorCQkJCWJyZWFrOworCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJCXNjaGVkdWxlKCk7CisJCQlfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisJCX0KKwl9IHdoaWxlICgha3RocmVhZF9zaG91bGRfc3RvcCgpKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0cmFuc2FjdGlvbl9rdGhyZWFkKHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCA9IGFyZzsKKwlzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFuczsKKwlzdHJ1Y3QgYnRyZnNfdHJhbnNhY3Rpb24gKmN1cjsKKwl1bnNpZ25lZCBsb25nIG5vdzsKKwl1bnNpZ25lZCBsb25nIGRlbGF5OworCWludCByZXQ7CisKKwlkbyB7CisJCXNtcF9tYigpOworCQlpZiAocm9vdC0+ZnNfaW5mby0+Y2xvc2luZykKKwkJCWJyZWFrOworCisJCWRlbGF5ID0gSFogKiAzMDsKKwkJdmZzX2NoZWNrX2Zyb3plbihyb290LT5mc19pbmZvLT5zYiwgU0JfRlJFRVpFX1dSSVRFKTsKKwkJbXV0ZXhfbG9jaygmcm9vdC0+ZnNfaW5mby0+dHJhbnNhY3Rpb25fa3RocmVhZF9tdXRleCk7CisKKwkJaWYgKHJvb3QtPmZzX2luZm8tPnRvdGFsX3JlZl9jYWNoZV9zaXplID4gMjAgKiAxMDI0ICogMTAyNCkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiYnRyZnM6IHRvdGFsIHJlZmVyZW5jZSBjYWNoZSAiCisJCQkgICAgICAgInNpemUgJWxsdVxuIiwKKwkJCSAgICAgICByb290LT5mc19pbmZvLT50b3RhbF9yZWZfY2FjaGVfc2l6ZSk7CisJCX0KKworCQltdXRleF9sb2NrKCZyb290LT5mc19pbmZvLT50cmFuc19tdXRleCk7CisJCWN1ciA9IHJvb3QtPmZzX2luZm8tPnJ1bm5pbmdfdHJhbnNhY3Rpb247CisJCWlmICghY3VyKSB7CisJCQltdXRleF91bmxvY2soJnJvb3QtPmZzX2luZm8tPnRyYW5zX211dGV4KTsKKwkJCWdvdG8gc2xlZXA7CisJCX0KKworCQlub3cgPSBnZXRfc2Vjb25kcygpOworCQlpZiAobm93IDwgY3VyLT5zdGFydF90aW1lIHx8IG5vdyAtIGN1ci0+c3RhcnRfdGltZSA8IDMwKSB7CisJCQltdXRleF91bmxvY2soJnJvb3QtPmZzX2luZm8tPnRyYW5zX211dGV4KTsKKwkJCWRlbGF5ID0gSFogKiA1OworCQkJZ290byBzbGVlcDsKKwkJfQorCQltdXRleF91bmxvY2soJnJvb3QtPmZzX2luZm8tPnRyYW5zX211dGV4KTsKKwkJdHJhbnMgPSBidHJmc19zdGFydF90cmFuc2FjdGlvbihyb290LCAxKTsKKwkJcmV0ID0gYnRyZnNfY29tbWl0X3RyYW5zYWN0aW9uKHRyYW5zLCByb290KTsKK3NsZWVwOgorCQl3YWtlX3VwX3Byb2Nlc3Mocm9vdC0+ZnNfaW5mby0+Y2xlYW5lcl9rdGhyZWFkKTsKKwkJbXV0ZXhfdW5sb2NrKCZyb290LT5mc19pbmZvLT50cmFuc2FjdGlvbl9rdGhyZWFkX211dGV4KTsKKworCQlpZiAoZnJlZXppbmcoY3VycmVudCkpIHsKKwkJCXJlZnJpZ2VyYXRvcigpOworCQl9IGVsc2UgeworCQkJaWYgKHJvb3QtPmZzX2luZm8tPmNsb3NpbmcpCisJCQkJYnJlYWs7CisJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQkJc2NoZWR1bGVfdGltZW91dChkZWxheSk7CisJCQlfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisJCX0KKwl9IHdoaWxlICgha3RocmVhZF9zaG91bGRfc3RvcCgpKTsKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IGJ0cmZzX3Jvb3QgKm9wZW5fY3RyZWUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwkJCSAgICAgIHN0cnVjdCBidHJmc19mc19kZXZpY2VzICpmc19kZXZpY2VzLAorCQkJICAgICAgY2hhciAqb3B0aW9ucykKK3sKKwl1MzIgc2VjdG9yc2l6ZTsKKwl1MzIgbm9kZXNpemU7CisJdTMyIGxlYWZzaXplOworCXUzMiBibG9ja3NpemU7CisJdTMyIHN0cmlwZXNpemU7CisJdTY0IGdlbmVyYXRpb247CisJdTY0IGZlYXR1cmVzOworCXN0cnVjdCBidHJmc19rZXkgbG9jYXRpb247CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKwlzdHJ1Y3QgYnRyZnNfcm9vdCAqZXh0ZW50X3Jvb3QgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYnRyZnNfcm9vdCksCisJCQkJCQkgR0ZQX05PRlMpOworCXN0cnVjdCBidHJmc19yb290ICpjc3VtX3Jvb3QgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYnRyZnNfcm9vdCksCisJCQkJCQkgR0ZQX05PRlMpOworCXN0cnVjdCBidHJmc19yb290ICp0cmVlX3Jvb3QgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYnRyZnNfcm9vdCksCisJCQkJCSAgICAgICBHRlBfTk9GUyk7CisJc3RydWN0IGJ0cmZzX2ZzX2luZm8gKmZzX2luZm8gPSBremFsbG9jKHNpemVvZigqZnNfaW5mbyksCisJCQkJCQlHRlBfTk9GUyk7CisJc3RydWN0IGJ0cmZzX3Jvb3QgKmNodW5rX3Jvb3QgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYnRyZnNfcm9vdCksCisJCQkJCQlHRlBfTk9GUyk7CisJc3RydWN0IGJ0cmZzX3Jvb3QgKmRldl9yb290ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGJ0cmZzX3Jvb3QpLAorCQkJCQkgICAgICBHRlBfTk9GUyk7CisJc3RydWN0IGJ0cmZzX3Jvb3QgKmxvZ190cmVlX3Jvb3Q7CisKKwlpbnQgcmV0OworCWludCBlcnIgPSAtRUlOVkFMOworCisJc3RydWN0IGJ0cmZzX3N1cGVyX2Jsb2NrICpkaXNrX3N1cGVyOworCisJaWYgKCFleHRlbnRfcm9vdCB8fCAhdHJlZV9yb290IHx8ICFmc19pbmZvIHx8CisJICAgICFjaHVua19yb290IHx8ICFkZXZfcm9vdCB8fCAhY3N1bV9yb290KSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZmFpbDsKKwl9CisJSU5JVF9SQURJWF9UUkVFKCZmc19pbmZvLT5mc19yb290c19yYWRpeCwgR0ZQX05PRlMpOworCUlOSVRfTElTVF9IRUFEKCZmc19pbmZvLT50cmFuc19saXN0KTsKKwlJTklUX0xJU1RfSEVBRCgmZnNfaW5mby0+ZGVhZF9yb290cyk7CisJSU5JVF9MSVNUX0hFQUQoJmZzX2luZm8tPmhhc2hlcnMpOworCUlOSVRfTElTVF9IRUFEKCZmc19pbmZvLT5kZWxhbGxvY19pbm9kZXMpOworCXNwaW5fbG9ja19pbml0KCZmc19pbmZvLT5oYXNoX2xvY2spOworCXNwaW5fbG9ja19pbml0KCZmc19pbmZvLT5kZWxhbGxvY19sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmZnNfaW5mby0+bmV3X3RyYW5zX2xvY2spOworCXNwaW5fbG9ja19pbml0KCZmc19pbmZvLT5yZWZfY2FjaGVfbG9jayk7CisKKwlpbml0X2NvbXBsZXRpb24oJmZzX2luZm8tPmtvYmpfdW5yZWdpc3Rlcik7CisJZnNfaW5mby0+dHJlZV9yb290ID0gdHJlZV9yb290OworCWZzX2luZm8tPmV4dGVudF9yb290ID0gZXh0ZW50X3Jvb3Q7CisJZnNfaW5mby0+Y3N1bV9yb290ID0gY3N1bV9yb290OworCWZzX2luZm8tPmNodW5rX3Jvb3QgPSBjaHVua19yb290OworCWZzX2luZm8tPmRldl9yb290ID0gZGV2X3Jvb3Q7CisJZnNfaW5mby0+ZnNfZGV2aWNlcyA9IGZzX2RldmljZXM7CisJSU5JVF9MSVNUX0hFQUQoJmZzX2luZm8tPmRpcnR5X2Nvd29ubHlfcm9vdHMpOworCUlOSVRfTElTVF9IRUFEKCZmc19pbmZvLT5zcGFjZV9pbmZvKTsKKwlidHJmc19tYXBwaW5nX2luaXQoJmZzX2luZm8tPm1hcHBpbmdfdHJlZSk7CisJYXRvbWljX3NldCgmZnNfaW5mby0+bnJfYXN5bmNfc3VibWl0cywgMCk7CisJYXRvbWljX3NldCgmZnNfaW5mby0+YXN5bmNfZGVsYWxsb2NfcGFnZXMsIDApOworCWF0b21pY19zZXQoJmZzX2luZm8tPmFzeW5jX3N1Ym1pdF9kcmFpbmluZywgMCk7CisJYXRvbWljX3NldCgmZnNfaW5mby0+bnJfYXN5bmNfYmlvcywgMCk7CisJYXRvbWljX3NldCgmZnNfaW5mby0+dGhyb3R0bGVzLCAwKTsKKwlhdG9taWNfc2V0KCZmc19pbmZvLT50aHJvdHRsZV9nZW4sIDApOworCWZzX2luZm8tPnNiID0gc2I7CisJZnNfaW5mby0+bWF4X2V4dGVudCA9ICh1NjQpLTE7CisJZnNfaW5mby0+bWF4X2lubGluZSA9IDgxOTIgKiAxMDI0OworCXNldHVwX2JkaShmc19pbmZvLCAmZnNfaW5mby0+YmRpKTsKKwlmc19pbmZvLT5idHJlZV9pbm9kZSA9IG5ld19pbm9kZShzYik7CisJZnNfaW5mby0+YnRyZWVfaW5vZGUtPmlfaW5vID0gMTsKKwlmc19pbmZvLT5idHJlZV9pbm9kZS0+aV9ubGluayA9IDE7CisKKwlmc19pbmZvLT50aHJlYWRfcG9vbF9zaXplID0gbWluX3QodW5zaWduZWQgbG9uZywKKwkJCQkJICBudW1fb25saW5lX2NwdXMoKSArIDIsIDgpOworCisJSU5JVF9MSVNUX0hFQUQoJmZzX2luZm8tPm9yZGVyZWRfZXh0ZW50cyk7CisJc3Bpbl9sb2NrX2luaXQoJmZzX2luZm8tPm9yZGVyZWRfZXh0ZW50X2xvY2spOworCisJc2ItPnNfYmxvY2tzaXplID0gNDA5NjsKKwlzYi0+c19ibG9ja3NpemVfYml0cyA9IGJsa3NpemVfYml0cyg0MDk2KTsKKworCS8qCisJICogd2Ugc2V0IHRoZSBpX3NpemUgb24gdGhlIGJ0cmVlIGlub2RlIHRvIHRoZSBtYXggcG9zc2libGUgaW50LgorCSAqIHRoZSByZWFsIGVuZCBvZiB0aGUgYWRkcmVzcyBzcGFjZSBpcyBkZXRlcm1pbmVkIGJ5IGFsbCBvZgorCSAqIHRoZSBkZXZpY2VzIGluIHRoZSBzeXN0ZW0KKwkgKi8KKwlmc19pbmZvLT5idHJlZV9pbm9kZS0+aV9zaXplID0gT0ZGU0VUX01BWDsKKwlmc19pbmZvLT5idHJlZV9pbm9kZS0+aV9tYXBwaW5nLT5hX29wcyA9ICZidHJlZV9hb3BzOworCWZzX2luZm8tPmJ0cmVlX2lub2RlLT5pX21hcHBpbmctPmJhY2tpbmdfZGV2X2luZm8gPSAmZnNfaW5mby0+YmRpOworCisJZXh0ZW50X2lvX3RyZWVfaW5pdCgmQlRSRlNfSShmc19pbmZvLT5idHJlZV9pbm9kZSktPmlvX3RyZWUsCisJCQkgICAgIGZzX2luZm8tPmJ0cmVlX2lub2RlLT5pX21hcHBpbmcsCisJCQkgICAgIEdGUF9OT0ZTKTsKKwlleHRlbnRfbWFwX3RyZWVfaW5pdCgmQlRSRlNfSShmc19pbmZvLT5idHJlZV9pbm9kZSktPmV4dGVudF90cmVlLAorCQkJICAgICBHRlBfTk9GUyk7CisKKwlCVFJGU19JKGZzX2luZm8tPmJ0cmVlX2lub2RlKS0+aW9fdHJlZS5vcHMgPSAmYnRyZWVfZXh0ZW50X2lvX29wczsKKworCXNwaW5fbG9ja19pbml0KCZmc19pbmZvLT5ibG9ja19ncm91cF9jYWNoZV9sb2NrKTsKKwlmc19pbmZvLT5ibG9ja19ncm91cF9jYWNoZV90cmVlLnJiX25vZGUgPSBOVUxMOworCisJZXh0ZW50X2lvX3RyZWVfaW5pdCgmZnNfaW5mby0+cGlubmVkX2V4dGVudHMsCisJCQkgICAgIGZzX2luZm8tPmJ0cmVlX2lub2RlLT5pX21hcHBpbmcsIEdGUF9OT0ZTKTsKKwlleHRlbnRfaW9fdHJlZV9pbml0KCZmc19pbmZvLT5wZW5kaW5nX2RlbCwKKwkJCSAgICAgZnNfaW5mby0+YnRyZWVfaW5vZGUtPmlfbWFwcGluZywgR0ZQX05PRlMpOworCWV4dGVudF9pb190cmVlX2luaXQoJmZzX2luZm8tPmV4dGVudF9pbnMsCisJCQkgICAgIGZzX2luZm8tPmJ0cmVlX2lub2RlLT5pX21hcHBpbmcsIEdGUF9OT0ZTKTsKKwlmc19pbmZvLT5kb19iYXJyaWVycyA9IDE7CisKKwlJTklUX0xJU1RfSEVBRCgmZnNfaW5mby0+ZGVhZF9yZWxvY19yb290cyk7CisJYnRyZnNfbGVhZl9yZWZfdHJlZV9pbml0KCZmc19pbmZvLT5yZWxvY19yZWZfdHJlZSk7CisJYnRyZnNfbGVhZl9yZWZfdHJlZV9pbml0KCZmc19pbmZvLT5zaGFyZWRfcmVmX3RyZWUpOworCisJQlRSRlNfSShmc19pbmZvLT5idHJlZV9pbm9kZSktPnJvb3QgPSB0cmVlX3Jvb3Q7CisJbWVtc2V0KCZCVFJGU19JKGZzX2luZm8tPmJ0cmVlX2lub2RlKS0+bG9jYXRpb24sIDAsCisJICAgICAgIHNpemVvZihzdHJ1Y3QgYnRyZnNfa2V5KSk7CisJaW5zZXJ0X2lub2RlX2hhc2goZnNfaW5mby0+YnRyZWVfaW5vZGUpOworCisJbXV0ZXhfaW5pdCgmZnNfaW5mby0+dHJhbnNfbXV0ZXgpOworCW11dGV4X2luaXQoJmZzX2luZm8tPnRyZWVfbG9nX211dGV4KTsKKwltdXRleF9pbml0KCZmc19pbmZvLT5kcm9wX211dGV4KTsKKwltdXRleF9pbml0KCZmc19pbmZvLT5leHRlbnRfaW5zX211dGV4KTsKKwltdXRleF9pbml0KCZmc19pbmZvLT5waW5uZWRfbXV0ZXgpOworCW11dGV4X2luaXQoJmZzX2luZm8tPmNodW5rX211dGV4KTsKKwltdXRleF9pbml0KCZmc19pbmZvLT50cmFuc2FjdGlvbl9rdGhyZWFkX211dGV4KTsKKwltdXRleF9pbml0KCZmc19pbmZvLT5jbGVhbmVyX211dGV4KTsKKwltdXRleF9pbml0KCZmc19pbmZvLT52b2x1bWVfbXV0ZXgpOworCW11dGV4X2luaXQoJmZzX2luZm8tPnRyZWVfcmVsb2NfbXV0ZXgpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmZzX2luZm8tPnRyYW5zYWN0aW9uX3Rocm90dGxlKTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZmc19pbmZvLT50cmFuc2FjdGlvbl93YWl0KTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZmc19pbmZvLT5hc3luY19zdWJtaXRfd2FpdCk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmZnNfaW5mby0+dHJlZV9sb2dfd2FpdCk7CisJYXRvbWljX3NldCgmZnNfaW5mby0+dHJlZV9sb2dfY29tbWl0LCAwKTsKKwlhdG9taWNfc2V0KCZmc19pbmZvLT50cmVlX2xvZ193cml0ZXJzLCAwKTsKKwlmc19pbmZvLT50cmVlX2xvZ190cmFuc2lkID0gMDsKKworCV9fc2V0dXBfcm9vdCg0MDk2LCA0MDk2LCA0MDk2LCA0MDk2LCB0cmVlX3Jvb3QsCisJCSAgICAgZnNfaW5mbywgQlRSRlNfUk9PVF9UUkVFX09CSkVDVElEKTsKKworCisJYmggPSBidHJmc19yZWFkX2Rldl9zdXBlcihmc19kZXZpY2VzLT5sYXRlc3RfYmRldik7CisJaWYgKCFiaCkKKwkJZ290byBmYWlsX2lwdXQ7CisKKwltZW1jcHkoJmZzX2luZm8tPnN1cGVyX2NvcHksIGJoLT5iX2RhdGEsIHNpemVvZihmc19pbmZvLT5zdXBlcl9jb3B5KSk7CisJbWVtY3B5KCZmc19pbmZvLT5zdXBlcl9mb3JfY29tbWl0LCAmZnNfaW5mby0+c3VwZXJfY29weSwKKwkgICAgICAgc2l6ZW9mKGZzX2luZm8tPnN1cGVyX2Zvcl9jb21taXQpKTsKKwlicmVsc2UoYmgpOworCisJbWVtY3B5KGZzX2luZm8tPmZzaWQsIGZzX2luZm8tPnN1cGVyX2NvcHkuZnNpZCwgQlRSRlNfRlNJRF9TSVpFKTsKKworCWRpc2tfc3VwZXIgPSAmZnNfaW5mby0+c3VwZXJfY29weTsKKwlpZiAoIWJ0cmZzX3N1cGVyX3Jvb3QoZGlza19zdXBlcikpCisJCWdvdG8gZmFpbF9pcHV0OworCisJcmV0ID0gYnRyZnNfcGFyc2Vfb3B0aW9ucyh0cmVlX3Jvb3QsIG9wdGlvbnMpOworCWlmIChyZXQpIHsKKwkJZXJyID0gcmV0OworCQlnb3RvIGZhaWxfaXB1dDsKKwl9CisKKwlmZWF0dXJlcyA9IGJ0cmZzX3N1cGVyX2luY29tcGF0X2ZsYWdzKGRpc2tfc3VwZXIpICYKKwkJfkJUUkZTX0ZFQVRVUkVfSU5DT01QQVRfU1VQUDsKKwlpZiAoZmVhdHVyZXMpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJCVFJGUzogY291bGRuJ3QgbW91bnQgYmVjYXVzZSBvZiAiCisJCSAgICAgICAidW5zdXBwb3J0ZWQgb3B0aW9uYWwgZmVhdHVyZXMgKCVMeCkuXG4iLAorCQkgICAgICAgZmVhdHVyZXMpOworCQllcnIgPSAtRUlOVkFMOworCQlnb3RvIGZhaWxfaXB1dDsKKwl9CisKKwlmZWF0dXJlcyA9IGJ0cmZzX3N1cGVyX2NvbXBhdF9yb19mbGFncyhkaXNrX3N1cGVyKSAmCisJCX5CVFJGU19GRUFUVVJFX0NPTVBBVF9ST19TVVBQOworCWlmICghKHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSAmJiBmZWF0dXJlcykgeworCQlwcmludGsoS0VSTl9FUlIgIkJUUkZTOiBjb3VsZG4ndCBtb3VudCBSRFdSIGJlY2F1c2Ugb2YgIgorCQkgICAgICAgInVuc3VwcG9ydGVkIG9wdGlvbiBmZWF0dXJlcyAoJUx4KS5cbiIsCisJCSAgICAgICBmZWF0dXJlcyk7CisJCWVyciA9IC1FSU5WQUw7CisJCWdvdG8gZmFpbF9pcHV0OworCX0KKworCS8qCisJICogd2UgbmVlZCB0byBzdGFydCBhbGwgdGhlIGVuZF9pbyB3b3JrZXJzIHVwIGZyb250IGJlY2F1c2UgdGhlCisJICogcXVldWUgd29yayBmdW5jdGlvbiBnZXRzIGNhbGxlZCBhdCBpbnRlcnJ1cHQgdGltZSwgYW5kIHNvIGl0CisJICogY2Fubm90IGR5bmFtaWNhbGx5IGdyb3cuCisJICovCisJYnRyZnNfaW5pdF93b3JrZXJzKCZmc19pbmZvLT53b3JrZXJzLCAid29ya2VyIiwKKwkJCSAgIGZzX2luZm8tPnRocmVhZF9wb29sX3NpemUpOworCisJYnRyZnNfaW5pdF93b3JrZXJzKCZmc19pbmZvLT5kZWxhbGxvY193b3JrZXJzLCAiZGVsYWxsb2MiLAorCQkJICAgZnNfaW5mby0+dGhyZWFkX3Bvb2xfc2l6ZSk7CisKKwlidHJmc19pbml0X3dvcmtlcnMoJmZzX2luZm8tPnN1Ym1pdF93b3JrZXJzLCAic3VibWl0IiwKKwkJCSAgIG1pbl90KHU2NCwgZnNfZGV2aWNlcy0+bnVtX2RldmljZXMsCisJCQkgICBmc19pbmZvLT50aHJlYWRfcG9vbF9zaXplKSk7CisKKwkvKiBhIGhpZ2hlciBpZGxlIHRocmVzaCBvbiB0aGUgc3VibWl0IHdvcmtlcnMgbWFrZXMgaXQgbXVjaCBtb3JlCisJICogbGlrZWx5IHRoYXQgYmlvcyB3aWxsIGJlIHNlbmQgZG93biBpbiBhIHNhbmUgb3JkZXIgdG8gdGhlCisJICogZGV2aWNlcworCSAqLworCWZzX2luZm8tPnN1Ym1pdF93b3JrZXJzLmlkbGVfdGhyZXNoID0gNjQ7CisKKwlmc19pbmZvLT53b3JrZXJzLmlkbGVfdGhyZXNoID0gMTY7CisJZnNfaW5mby0+d29ya2Vycy5vcmRlcmVkID0gMTsKKworCWZzX2luZm8tPmRlbGFsbG9jX3dvcmtlcnMuaWRsZV90aHJlc2ggPSAyOworCWZzX2luZm8tPmRlbGFsbG9jX3dvcmtlcnMub3JkZXJlZCA9IDE7CisKKwlidHJmc19pbml0X3dvcmtlcnMoJmZzX2luZm8tPmZpeHVwX3dvcmtlcnMsICJmaXh1cCIsIDEpOworCWJ0cmZzX2luaXRfd29ya2VycygmZnNfaW5mby0+ZW5kaW9fd29ya2VycywgImVuZGlvIiwKKwkJCSAgIGZzX2luZm8tPnRocmVhZF9wb29sX3NpemUpOworCWJ0cmZzX2luaXRfd29ya2VycygmZnNfaW5mby0+ZW5kaW9fbWV0YV93b3JrZXJzLCAiZW5kaW8tbWV0YSIsCisJCQkgICBmc19pbmZvLT50aHJlYWRfcG9vbF9zaXplKTsKKwlidHJmc19pbml0X3dvcmtlcnMoJmZzX2luZm8tPmVuZGlvX21ldGFfd3JpdGVfd29ya2VycywKKwkJCSAgICJlbmRpby1tZXRhLXdyaXRlIiwgZnNfaW5mby0+dGhyZWFkX3Bvb2xfc2l6ZSk7CisJYnRyZnNfaW5pdF93b3JrZXJzKCZmc19pbmZvLT5lbmRpb193cml0ZV93b3JrZXJzLCAiZW5kaW8td3JpdGUiLAorCQkJICAgZnNfaW5mby0+dGhyZWFkX3Bvb2xfc2l6ZSk7CisKKwkvKgorCSAqIGVuZGlvcyBhcmUgbGFyZ2VseSBwYXJhbGxlbCBhbmQgc2hvdWxkIGhhdmUgYSB2ZXJ5CisJICogbG93IGlkbGUgdGhyZXNoCisJICovCisJZnNfaW5mby0+ZW5kaW9fd29ya2Vycy5pZGxlX3RocmVzaCA9IDQ7CisJZnNfaW5mby0+ZW5kaW9fd3JpdGVfd29ya2Vycy5pZGxlX3RocmVzaCA9IDY0OworCWZzX2luZm8tPmVuZGlvX21ldGFfd3JpdGVfd29ya2Vycy5pZGxlX3RocmVzaCA9IDY0OworCisJYnRyZnNfc3RhcnRfd29ya2VycygmZnNfaW5mby0+d29ya2VycywgMSk7CisJYnRyZnNfc3RhcnRfd29ya2VycygmZnNfaW5mby0+c3VibWl0X3dvcmtlcnMsIDEpOworCWJ0cmZzX3N0YXJ0X3dvcmtlcnMoJmZzX2luZm8tPmRlbGFsbG9jX3dvcmtlcnMsIDEpOworCWJ0cmZzX3N0YXJ0X3dvcmtlcnMoJmZzX2luZm8tPmZpeHVwX3dvcmtlcnMsIDEpOworCWJ0cmZzX3N0YXJ0X3dvcmtlcnMoJmZzX2luZm8tPmVuZGlvX3dvcmtlcnMsIGZzX2luZm8tPnRocmVhZF9wb29sX3NpemUpOworCWJ0cmZzX3N0YXJ0X3dvcmtlcnMoJmZzX2luZm8tPmVuZGlvX21ldGFfd29ya2VycywKKwkJCSAgICBmc19pbmZvLT50aHJlYWRfcG9vbF9zaXplKTsKKwlidHJmc19zdGFydF93b3JrZXJzKCZmc19pbmZvLT5lbmRpb19tZXRhX3dyaXRlX3dvcmtlcnMsCisJCQkgICAgZnNfaW5mby0+dGhyZWFkX3Bvb2xfc2l6ZSk7CisJYnRyZnNfc3RhcnRfd29ya2VycygmZnNfaW5mby0+ZW5kaW9fd3JpdGVfd29ya2VycywKKwkJCSAgICBmc19pbmZvLT50aHJlYWRfcG9vbF9zaXplKTsKKworCWZzX2luZm8tPmJkaS5yYV9wYWdlcyAqPSBidHJmc19zdXBlcl9udW1fZGV2aWNlcyhkaXNrX3N1cGVyKTsKKwlmc19pbmZvLT5iZGkucmFfcGFnZXMgPSBtYXgoZnNfaW5mby0+YmRpLnJhX3BhZ2VzLAorCQkJCSAgICA0ICogMTAyNCAqIDEwMjQgLyBQQUdFX0NBQ0hFX1NJWkUpOworCisJbm9kZXNpemUgPSBidHJmc19zdXBlcl9ub2Rlc2l6ZShkaXNrX3N1cGVyKTsKKwlsZWFmc2l6ZSA9IGJ0cmZzX3N1cGVyX2xlYWZzaXplKGRpc2tfc3VwZXIpOworCXNlY3RvcnNpemUgPSBidHJmc19zdXBlcl9zZWN0b3JzaXplKGRpc2tfc3VwZXIpOworCXN0cmlwZXNpemUgPSBidHJmc19zdXBlcl9zdHJpcGVzaXplKGRpc2tfc3VwZXIpOworCXRyZWVfcm9vdC0+bm9kZXNpemUgPSBub2Rlc2l6ZTsKKwl0cmVlX3Jvb3QtPmxlYWZzaXplID0gbGVhZnNpemU7CisJdHJlZV9yb290LT5zZWN0b3JzaXplID0gc2VjdG9yc2l6ZTsKKwl0cmVlX3Jvb3QtPnN0cmlwZXNpemUgPSBzdHJpcGVzaXplOworCisJc2ItPnNfYmxvY2tzaXplID0gc2VjdG9yc2l6ZTsKKwlzYi0+c19ibG9ja3NpemVfYml0cyA9IGJsa3NpemVfYml0cyhzZWN0b3JzaXplKTsKKworCWlmIChzdHJuY21wKChjaGFyICopKCZkaXNrX3N1cGVyLT5tYWdpYyksIEJUUkZTX01BR0lDLAorCQkgICAgc2l6ZW9mKGRpc2tfc3VwZXItPm1hZ2ljKSkpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiYnRyZnM6IHZhbGlkIEZTIG5vdCBmb3VuZCBvbiAlc1xuIiwgc2ItPnNfaWQpOworCQlnb3RvIGZhaWxfc2JfYnVmZmVyOworCX0KKworCW11dGV4X2xvY2soJmZzX2luZm8tPmNodW5rX211dGV4KTsKKwlyZXQgPSBidHJmc19yZWFkX3N5c19hcnJheSh0cmVlX3Jvb3QpOworCW11dGV4X3VubG9jaygmZnNfaW5mby0+Y2h1bmtfbXV0ZXgpOworCWlmIChyZXQpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiYnRyZnM6IGZhaWxlZCB0byByZWFkIHRoZSBzeXN0ZW0gIgorCQkgICAgICAgImFycmF5IG9uICVzXG4iLCBzYi0+c19pZCk7CisJCWdvdG8gZmFpbF9zeXNfYXJyYXk7CisJfQorCisJYmxvY2tzaXplID0gYnRyZnNfbGV2ZWxfc2l6ZSh0cmVlX3Jvb3QsCisJCQkJICAgICBidHJmc19zdXBlcl9jaHVua19yb290X2xldmVsKGRpc2tfc3VwZXIpKTsKKwlnZW5lcmF0aW9uID0gYnRyZnNfc3VwZXJfY2h1bmtfcm9vdF9nZW5lcmF0aW9uKGRpc2tfc3VwZXIpOworCisJX19zZXR1cF9yb290KG5vZGVzaXplLCBsZWFmc2l6ZSwgc2VjdG9yc2l6ZSwgc3RyaXBlc2l6ZSwKKwkJICAgICBjaHVua19yb290LCBmc19pbmZvLCBCVFJGU19DSFVOS19UUkVFX09CSkVDVElEKTsKKworCWNodW5rX3Jvb3QtPm5vZGUgPSByZWFkX3RyZWVfYmxvY2soY2h1bmtfcm9vdCwKKwkJCQkJICAgYnRyZnNfc3VwZXJfY2h1bmtfcm9vdChkaXNrX3N1cGVyKSwKKwkJCQkJICAgYmxvY2tzaXplLCBnZW5lcmF0aW9uKTsKKwlCVUdfT04oIWNodW5rX3Jvb3QtPm5vZGUpOworCisJcmVhZF9leHRlbnRfYnVmZmVyKGNodW5rX3Jvb3QtPm5vZGUsIGZzX2luZm8tPmNodW5rX3RyZWVfdXVpZCwKKwkgICAodW5zaWduZWQgbG9uZylidHJmc19oZWFkZXJfY2h1bmtfdHJlZV91dWlkKGNodW5rX3Jvb3QtPm5vZGUpLAorCSAgIEJUUkZTX1VVSURfU0laRSk7CisKKwltdXRleF9sb2NrKCZmc19pbmZvLT5jaHVua19tdXRleCk7CisJcmV0ID0gYnRyZnNfcmVhZF9jaHVua190cmVlKGNodW5rX3Jvb3QpOworCW11dGV4X3VubG9jaygmZnNfaW5mby0+Y2h1bmtfbXV0ZXgpOworCWlmIChyZXQpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiYnRyZnM6IGZhaWxlZCB0byByZWFkIGNodW5rIHRyZWUgb24gJXNcbiIsCisJCSAgICAgICBzYi0+c19pZCk7CisJCWdvdG8gZmFpbF9jaHVua19yb290OworCX0KKworCWJ0cmZzX2Nsb3NlX2V4dHJhX2RldmljZXMoZnNfZGV2aWNlcyk7CisKKwlibG9ja3NpemUgPSBidHJmc19sZXZlbF9zaXplKHRyZWVfcm9vdCwKKwkJCQkgICAgIGJ0cmZzX3N1cGVyX3Jvb3RfbGV2ZWwoZGlza19zdXBlcikpOworCWdlbmVyYXRpb24gPSBidHJmc19zdXBlcl9nZW5lcmF0aW9uKGRpc2tfc3VwZXIpOworCisJdHJlZV9yb290LT5ub2RlID0gcmVhZF90cmVlX2Jsb2NrKHRyZWVfcm9vdCwKKwkJCQkJICBidHJmc19zdXBlcl9yb290KGRpc2tfc3VwZXIpLAorCQkJCQkgIGJsb2Nrc2l6ZSwgZ2VuZXJhdGlvbik7CisJaWYgKCF0cmVlX3Jvb3QtPm5vZGUpCisJCWdvdG8gZmFpbF9jaHVua19yb290OworCisKKwlyZXQgPSBmaW5kX2FuZF9zZXR1cF9yb290KHRyZWVfcm9vdCwgZnNfaW5mbywKKwkJCQkgIEJUUkZTX0VYVEVOVF9UUkVFX09CSkVDVElELCBleHRlbnRfcm9vdCk7CisJaWYgKHJldCkKKwkJZ290byBmYWlsX3RyZWVfcm9vdDsKKwlleHRlbnRfcm9vdC0+dHJhY2tfZGlydHkgPSAxOworCisJcmV0ID0gZmluZF9hbmRfc2V0dXBfcm9vdCh0cmVlX3Jvb3QsIGZzX2luZm8sCisJCQkJICBCVFJGU19ERVZfVFJFRV9PQkpFQ1RJRCwgZGV2X3Jvb3QpOworCWRldl9yb290LT50cmFja19kaXJ0eSA9IDE7CisKKwlpZiAocmV0KQorCQlnb3RvIGZhaWxfZXh0ZW50X3Jvb3Q7CisKKwlyZXQgPSBmaW5kX2FuZF9zZXR1cF9yb290KHRyZWVfcm9vdCwgZnNfaW5mbywKKwkJCQkgIEJUUkZTX0NTVU1fVFJFRV9PQkpFQ1RJRCwgY3N1bV9yb290KTsKKwlpZiAocmV0KQorCQlnb3RvIGZhaWxfZXh0ZW50X3Jvb3Q7CisKKwljc3VtX3Jvb3QtPnRyYWNrX2RpcnR5ID0gMTsKKworCWJ0cmZzX3JlYWRfYmxvY2tfZ3JvdXBzKGV4dGVudF9yb290KTsKKworCWZzX2luZm8tPmdlbmVyYXRpb24gPSBnZW5lcmF0aW9uOworCWZzX2luZm8tPmxhc3RfdHJhbnNfY29tbWl0dGVkID0gZ2VuZXJhdGlvbjsKKwlmc19pbmZvLT5kYXRhX2FsbG9jX3Byb2ZpbGUgPSAodTY0KS0xOworCWZzX2luZm8tPm1ldGFkYXRhX2FsbG9jX3Byb2ZpbGUgPSAodTY0KS0xOworCWZzX2luZm8tPnN5c3RlbV9hbGxvY19wcm9maWxlID0gZnNfaW5mby0+bWV0YWRhdGFfYWxsb2NfcHJvZmlsZTsKKwlmc19pbmZvLT5jbGVhbmVyX2t0aHJlYWQgPSBrdGhyZWFkX3J1bihjbGVhbmVyX2t0aHJlYWQsIHRyZWVfcm9vdCwKKwkJCQkJICAgICAgICJidHJmcy1jbGVhbmVyIik7CisJaWYgKCFmc19pbmZvLT5jbGVhbmVyX2t0aHJlYWQpCisJCWdvdG8gZmFpbF9jc3VtX3Jvb3Q7CisKKwlmc19pbmZvLT50cmFuc2FjdGlvbl9rdGhyZWFkID0ga3RocmVhZF9ydW4odHJhbnNhY3Rpb25fa3RocmVhZCwKKwkJCQkJCSAgIHRyZWVfcm9vdCwKKwkJCQkJCSAgICJidHJmcy10cmFuc2FjdGlvbiIpOworCWlmICghZnNfaW5mby0+dHJhbnNhY3Rpb25fa3RocmVhZCkKKwkJZ290byBmYWlsX2NsZWFuZXI7CisKKwlpZiAoYnRyZnNfc3VwZXJfbG9nX3Jvb3QoZGlza19zdXBlcikgIT0gMCkgeworCQl1NjQgYnl0ZW5yID0gYnRyZnNfc3VwZXJfbG9nX3Jvb3QoZGlza19zdXBlcik7CisKKwkJaWYgKGZzX2RldmljZXMtPnJ3X2RldmljZXMgPT0gMCkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiQnRyZnMgbG9nIHJlcGxheSByZXF1aXJlZCAiCisJCQkgICAgICAgIm9uIFJPIG1lZGlhXG4iKTsKKwkJCWVyciA9IC1FSU87CisJCQlnb3RvIGZhaWxfdHJhbnNfa3RocmVhZDsKKwkJfQorCQlibG9ja3NpemUgPQorCQkgICAgIGJ0cmZzX2xldmVsX3NpemUodHJlZV9yb290LAorCQkJCSAgICAgIGJ0cmZzX3N1cGVyX2xvZ19yb290X2xldmVsKGRpc2tfc3VwZXIpKTsKKworCQlsb2dfdHJlZV9yb290ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGJ0cmZzX3Jvb3QpLAorCQkJCQkJICAgICAgR0ZQX05PRlMpOworCisJCV9fc2V0dXBfcm9vdChub2Rlc2l6ZSwgbGVhZnNpemUsIHNlY3RvcnNpemUsIHN0cmlwZXNpemUsCisJCQkgICAgIGxvZ190cmVlX3Jvb3QsIGZzX2luZm8sIEJUUkZTX1RSRUVfTE9HX09CSkVDVElEKTsKKworCQlsb2dfdHJlZV9yb290LT5ub2RlID0gcmVhZF90cmVlX2Jsb2NrKHRyZWVfcm9vdCwgYnl0ZW5yLAorCQkJCQkJICAgICAgYmxvY2tzaXplLAorCQkJCQkJICAgICAgZ2VuZXJhdGlvbiArIDEpOworCQlyZXQgPSBidHJmc19yZWNvdmVyX2xvZ190cmVlcyhsb2dfdHJlZV9yb290KTsKKwkJQlVHX09OKHJldCk7CisKKwkJaWYgKHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSB7CisJCQlyZXQgPSAgYnRyZnNfY29tbWl0X3N1cGVyKHRyZWVfcm9vdCk7CisJCQlCVUdfT04ocmV0KTsKKwkJfQorCX0KKworCWlmICghKHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSkgeworCQlyZXQgPSBidHJmc19jbGVhbnVwX3JlbG9jX3RyZWVzKHRyZWVfcm9vdCk7CisJCUJVR19PTihyZXQpOworCX0KKworCWxvY2F0aW9uLm9iamVjdGlkID0gQlRSRlNfRlNfVFJFRV9PQkpFQ1RJRDsKKwlsb2NhdGlvbi50eXBlID0gQlRSRlNfUk9PVF9JVEVNX0tFWTsKKwlsb2NhdGlvbi5vZmZzZXQgPSAodTY0KS0xOworCisJZnNfaW5mby0+ZnNfcm9vdCA9IGJ0cmZzX3JlYWRfZnNfcm9vdF9ub19uYW1lKGZzX2luZm8sICZsb2NhdGlvbik7CisJaWYgKCFmc19pbmZvLT5mc19yb290KQorCQlnb3RvIGZhaWxfdHJhbnNfa3RocmVhZDsKKwlyZXR1cm4gdHJlZV9yb290OworCitmYWlsX3RyYW5zX2t0aHJlYWQ6CisJa3RocmVhZF9zdG9wKGZzX2luZm8tPnRyYW5zYWN0aW9uX2t0aHJlYWQpOworZmFpbF9jbGVhbmVyOgorCWt0aHJlYWRfc3RvcChmc19pbmZvLT5jbGVhbmVyX2t0aHJlYWQpOworCisJLyoKKwkgKiBtYWtlIHN1cmUgd2UncmUgZG9uZSB3aXRoIHRoZSBidHJlZSBpbm9kZSBiZWZvcmUgd2Ugc3RvcCBvdXIKKwkgKiBrdGhyZWFkcworCSAqLworCWZpbGVtYXBfd3JpdGVfYW5kX3dhaXQoZnNfaW5mby0+YnRyZWVfaW5vZGUtPmlfbWFwcGluZyk7CisJaW52YWxpZGF0ZV9pbm9kZV9wYWdlczIoZnNfaW5mby0+YnRyZWVfaW5vZGUtPmlfbWFwcGluZyk7CisKK2ZhaWxfY3N1bV9yb290OgorCWZyZWVfZXh0ZW50X2J1ZmZlcihjc3VtX3Jvb3QtPm5vZGUpOworZmFpbF9leHRlbnRfcm9vdDoKKwlmcmVlX2V4dGVudF9idWZmZXIoZXh0ZW50X3Jvb3QtPm5vZGUpOworZmFpbF90cmVlX3Jvb3Q6CisJZnJlZV9leHRlbnRfYnVmZmVyKHRyZWVfcm9vdC0+bm9kZSk7CitmYWlsX2NodW5rX3Jvb3Q6CisJZnJlZV9leHRlbnRfYnVmZmVyKGNodW5rX3Jvb3QtPm5vZGUpOworZmFpbF9zeXNfYXJyYXk6CisJZnJlZV9leHRlbnRfYnVmZmVyKGRldl9yb290LT5ub2RlKTsKK2ZhaWxfc2JfYnVmZmVyOgorCWJ0cmZzX3N0b3Bfd29ya2VycygmZnNfaW5mby0+Zml4dXBfd29ya2Vycyk7CisJYnRyZnNfc3RvcF93b3JrZXJzKCZmc19pbmZvLT5kZWxhbGxvY193b3JrZXJzKTsKKwlidHJmc19zdG9wX3dvcmtlcnMoJmZzX2luZm8tPndvcmtlcnMpOworCWJ0cmZzX3N0b3Bfd29ya2VycygmZnNfaW5mby0+ZW5kaW9fd29ya2Vycyk7CisJYnRyZnNfc3RvcF93b3JrZXJzKCZmc19pbmZvLT5lbmRpb19tZXRhX3dvcmtlcnMpOworCWJ0cmZzX3N0b3Bfd29ya2VycygmZnNfaW5mby0+ZW5kaW9fbWV0YV93cml0ZV93b3JrZXJzKTsKKwlidHJmc19zdG9wX3dvcmtlcnMoJmZzX2luZm8tPmVuZGlvX3dyaXRlX3dvcmtlcnMpOworCWJ0cmZzX3N0b3Bfd29ya2VycygmZnNfaW5mby0+c3VibWl0X3dvcmtlcnMpOworZmFpbF9pcHV0OgorCWludmFsaWRhdGVfaW5vZGVfcGFnZXMyKGZzX2luZm8tPmJ0cmVlX2lub2RlLT5pX21hcHBpbmcpOworCWlwdXQoZnNfaW5mby0+YnRyZWVfaW5vZGUpOworZmFpbDoKKwlidHJmc19jbG9zZV9kZXZpY2VzKGZzX2luZm8tPmZzX2RldmljZXMpOworCWJ0cmZzX21hcHBpbmdfdHJlZV9mcmVlKCZmc19pbmZvLT5tYXBwaW5nX3RyZWUpOworCisJa2ZyZWUoZXh0ZW50X3Jvb3QpOworCWtmcmVlKHRyZWVfcm9vdCk7CisJYmRpX2Rlc3Ryb3koJmZzX2luZm8tPmJkaSk7CisJa2ZyZWUoZnNfaW5mbyk7CisJa2ZyZWUoY2h1bmtfcm9vdCk7CisJa2ZyZWUoZGV2X3Jvb3QpOworCWtmcmVlKGNzdW1fcm9vdCk7CisJcmV0dXJuIEVSUl9QVFIoZXJyKTsKK30KKworc3RhdGljIHZvaWQgYnRyZnNfZW5kX2J1ZmZlcl93cml0ZV9zeW5jKHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsIGludCB1cHRvZGF0ZSkKK3sKKwljaGFyIGJbQkRFVk5BTUVfU0laRV07CisKKwlpZiAodXB0b2RhdGUpIHsKKwkJc2V0X2J1ZmZlcl91cHRvZGF0ZShiaCk7CisJfSBlbHNlIHsKKwkJaWYgKCFidWZmZXJfZW9wbm90c3VwcChiaCkgJiYgcHJpbnRrX3JhdGVsaW1pdCgpKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJsb3N0IHBhZ2Ugd3JpdGUgZHVlIHRvICIKKwkJCQkJIkkvTyBlcnJvciBvbiAlc1xuIiwKKwkJCQkgICAgICAgYmRldm5hbWUoYmgtPmJfYmRldiwgYikpOworCQl9CisJCS8qIG5vdGUsIHdlIGRvbnQnIHNldF9idWZmZXJfd3JpdGVfaW9fZXJyb3IgYmVjYXVzZSB3ZSBoYXZlCisJCSAqIG91ciBvd24gd2F5cyBvZiBkZWFsaW5nIHdpdGggdGhlIElPIGVycm9ycworCQkgKi8KKwkJY2xlYXJfYnVmZmVyX3VwdG9kYXRlKGJoKTsKKwl9CisJdW5sb2NrX2J1ZmZlcihiaCk7CisJcHV0X2JoKGJoKTsKK30KKworc3RydWN0IGJ1ZmZlcl9oZWFkICpidHJmc19yZWFkX2Rldl9zdXBlcihzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2KQoreworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpsYXRlc3QgPSBOVUxMOworCXN0cnVjdCBidHJmc19zdXBlcl9ibG9jayAqc3VwZXI7CisJaW50IGk7CisJdTY0IHRyYW5zaWQgPSAwOworCXU2NCBieXRlbnI7CisKKwkvKiB3ZSB3b3VsZCBsaWtlIHRvIGNoZWNrIGFsbCB0aGUgc3VwZXJzLCBidXQgdGhhdCB3b3VsZCBtYWtlCisJICogYSBidHJmcyBtb3VudCBzdWNjZWVkIGFmdGVyIGEgbWtmcyBmcm9tIGEgZGlmZmVyZW50IEZTLgorCSAqIFNvLCB3ZSBuZWVkIHRvIGFkZCBhIHNwZWNpYWwgbW91bnQgb3B0aW9uIHRvIHNjYW4gZm9yCisJICogbGF0ZXIgc3VwZXJzLCB1c2luZyBCVFJGU19TVVBFUl9NSVJST1JfTUFYIGluc3RlYWQKKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgMTsgaSsrKSB7CisJCWJ5dGVuciA9IGJ0cmZzX3NiX29mZnNldChpKTsKKwkJaWYgKGJ5dGVuciArIDQwOTYgPj0gaV9zaXplX3JlYWQoYmRldi0+YmRfaW5vZGUpKQorCQkJYnJlYWs7CisJCWJoID0gX19icmVhZChiZGV2LCBieXRlbnIgLyA0MDk2LCA0MDk2KTsKKwkJaWYgKCFiaCkKKwkJCWNvbnRpbnVlOworCisJCXN1cGVyID0gKHN0cnVjdCBidHJmc19zdXBlcl9ibG9jayAqKWJoLT5iX2RhdGE7CisJCWlmIChidHJmc19zdXBlcl9ieXRlbnIoc3VwZXIpICE9IGJ5dGVuciB8fAorCQkgICAgc3RybmNtcCgoY2hhciAqKSgmc3VwZXItPm1hZ2ljKSwgQlRSRlNfTUFHSUMsCisJCQkgICAgc2l6ZW9mKHN1cGVyLT5tYWdpYykpKSB7CisJCQlicmVsc2UoYmgpOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAoIWxhdGVzdCB8fCBidHJmc19zdXBlcl9nZW5lcmF0aW9uKHN1cGVyKSA+IHRyYW5zaWQpIHsKKwkJCWJyZWxzZShsYXRlc3QpOworCQkJbGF0ZXN0ID0gYmg7CisJCQl0cmFuc2lkID0gYnRyZnNfc3VwZXJfZ2VuZXJhdGlvbihzdXBlcik7CisJCX0gZWxzZSB7CisJCQlicmVsc2UoYmgpOworCQl9CisJfQorCXJldHVybiBsYXRlc3Q7Cit9CisKK3N0YXRpYyBpbnQgd3JpdGVfZGV2X3N1cGVycyhzdHJ1Y3QgYnRyZnNfZGV2aWNlICpkZXZpY2UsCisJCQkgICAgc3RydWN0IGJ0cmZzX3N1cGVyX2Jsb2NrICpzYiwKKwkJCSAgICBpbnQgZG9fYmFycmllcnMsIGludCB3YWl0LCBpbnQgbWF4X21pcnJvcnMpCit7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKwlpbnQgaTsKKwlpbnQgcmV0OworCWludCBlcnJvcnMgPSAwOworCXUzMiBjcmM7CisJdTY0IGJ5dGVucjsKKwlpbnQgbGFzdF9iYXJyaWVyID0gMDsKKworCWlmIChtYXhfbWlycm9ycyA9PSAwKQorCQltYXhfbWlycm9ycyA9IEJUUkZTX1NVUEVSX01JUlJPUl9NQVg7CisKKwkvKiBtYWtlIHN1cmUgb25seSB0aGUgbGFzdCBzdWJtaXRfYmggZG9lcyBhIGJhcnJpZXIgKi8KKwlpZiAoZG9fYmFycmllcnMpIHsKKwkJZm9yIChpID0gMDsgaSA8IG1heF9taXJyb3JzOyBpKyspIHsKKwkJCWJ5dGVuciA9IGJ0cmZzX3NiX29mZnNldChpKTsKKwkJCWlmIChieXRlbnIgKyBCVFJGU19TVVBFUl9JTkZPX1NJWkUgPj0KKwkJCSAgICBkZXZpY2UtPnRvdGFsX2J5dGVzKQorCQkJCWJyZWFrOworCQkJbGFzdF9iYXJyaWVyID0gaTsKKwkJfQorCX0KKworCWZvciAoaSA9IDA7IGkgPCBtYXhfbWlycm9yczsgaSsrKSB7CisJCWJ5dGVuciA9IGJ0cmZzX3NiX29mZnNldChpKTsKKwkJaWYgKGJ5dGVuciArIEJUUkZTX1NVUEVSX0lORk9fU0laRSA+PSBkZXZpY2UtPnRvdGFsX2J5dGVzKQorCQkJYnJlYWs7CisKKwkJaWYgKHdhaXQpIHsKKwkJCWJoID0gX19maW5kX2dldF9ibG9jayhkZXZpY2UtPmJkZXYsIGJ5dGVuciAvIDQwOTYsCisJCQkJCSAgICAgIEJUUkZTX1NVUEVSX0lORk9fU0laRSk7CisJCQlCVUdfT04oIWJoKTsKKwkJCWJyZWxzZShiaCk7CisJCQl3YWl0X29uX2J1ZmZlcihiaCk7CisJCQlpZiAoYnVmZmVyX3VwdG9kYXRlKGJoKSkgeworCQkJCWJyZWxzZShiaCk7CisJCQkJY29udGludWU7CisJCQl9CisJCX0gZWxzZSB7CisJCQlidHJmc19zZXRfc3VwZXJfYnl0ZW5yKHNiLCBieXRlbnIpOworCisJCQljcmMgPSB+KHUzMikwOworCQkJY3JjID0gYnRyZnNfY3N1bV9kYXRhKE5VTEwsIChjaGFyICopc2IgKworCQkJCQkgICAgICBCVFJGU19DU1VNX1NJWkUsIGNyYywKKwkJCQkJICAgICAgQlRSRlNfU1VQRVJfSU5GT19TSVpFIC0KKwkJCQkJICAgICAgQlRSRlNfQ1NVTV9TSVpFKTsKKwkJCWJ0cmZzX2NzdW1fZmluYWwoY3JjLCBzYi0+Y3N1bSk7CisKKwkJCWJoID0gX19nZXRibGsoZGV2aWNlLT5iZGV2LCBieXRlbnIgLyA0MDk2LAorCQkJCSAgICAgIEJUUkZTX1NVUEVSX0lORk9fU0laRSk7CisJCQltZW1jcHkoYmgtPmJfZGF0YSwgc2IsIEJUUkZTX1NVUEVSX0lORk9fU0laRSk7CisKKwkJCXNldF9idWZmZXJfdXB0b2RhdGUoYmgpOworCQkJZ2V0X2JoKGJoKTsKKwkJCWxvY2tfYnVmZmVyKGJoKTsKKwkJCWJoLT5iX2VuZF9pbyA9IGJ0cmZzX2VuZF9idWZmZXJfd3JpdGVfc3luYzsKKwkJfQorCisJCWlmIChpID09IGxhc3RfYmFycmllciAmJiBkb19iYXJyaWVycyAmJiBkZXZpY2UtPmJhcnJpZXJzKSB7CisJCQlyZXQgPSBzdWJtaXRfYmgoV1JJVEVfQkFSUklFUiwgYmgpOworCQkJaWYgKHJldCA9PSAtRU9QTk9UU1VQUCkgeworCQkJCXByaW50aygiYnRyZnM6IGRpc2FibGluZyBiYXJyaWVycyBvbiBkZXYgJXNcbiIsCisJCQkJICAgICAgIGRldmljZS0+bmFtZSk7CisJCQkJc2V0X2J1ZmZlcl91cHRvZGF0ZShiaCk7CisJCQkJZGV2aWNlLT5iYXJyaWVycyA9IDA7CisJCQkJZ2V0X2JoKGJoKTsKKwkJCQlsb2NrX2J1ZmZlcihiaCk7CisJCQkJcmV0ID0gc3VibWl0X2JoKFdSSVRFLCBiaCk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlyZXQgPSBzdWJtaXRfYmgoV1JJVEUsIGJoKTsKKwkJfQorCisJCWlmICghcmV0ICYmIHdhaXQpIHsKKwkJCXdhaXRfb25fYnVmZmVyKGJoKTsKKwkJCWlmICghYnVmZmVyX3VwdG9kYXRlKGJoKSkKKwkJCQllcnJvcnMrKzsKKwkJfSBlbHNlIGlmIChyZXQpIHsKKwkJCWVycm9ycysrOworCQl9CisJCWlmICh3YWl0KQorCQkJYnJlbHNlKGJoKTsKKwl9CisJcmV0dXJuIGVycm9ycyA8IGkgPyAwIDogLTE7Cit9CisKK2ludCB3cml0ZV9hbGxfc3VwZXJzKHN0cnVjdCBidHJmc19yb290ICpyb290LCBpbnQgbWF4X21pcnJvcnMpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqY3VyOworCXN0cnVjdCBsaXN0X2hlYWQgKmhlYWQgPSAmcm9vdC0+ZnNfaW5mby0+ZnNfZGV2aWNlcy0+ZGV2aWNlczsKKwlzdHJ1Y3QgYnRyZnNfZGV2aWNlICpkZXY7CisJc3RydWN0IGJ0cmZzX3N1cGVyX2Jsb2NrICpzYjsKKwlzdHJ1Y3QgYnRyZnNfZGV2X2l0ZW0gKmRldl9pdGVtOworCWludCByZXQ7CisJaW50IGRvX2JhcnJpZXJzOworCWludCBtYXhfZXJyb3JzOworCWludCB0b3RhbF9lcnJvcnMgPSAwOworCXU2NCBmbGFnczsKKworCW1heF9lcnJvcnMgPSBidHJmc19zdXBlcl9udW1fZGV2aWNlcygmcm9vdC0+ZnNfaW5mby0+c3VwZXJfY29weSkgLSAxOworCWRvX2JhcnJpZXJzID0gIWJ0cmZzX3Rlc3Rfb3B0KHJvb3QsIE5PQkFSUklFUik7CisKKwlzYiA9ICZyb290LT5mc19pbmZvLT5zdXBlcl9mb3JfY29tbWl0OworCWRldl9pdGVtID0gJnNiLT5kZXZfaXRlbTsKKwlsaXN0X2Zvcl9lYWNoKGN1ciwgaGVhZCkgeworCQlkZXYgPSBsaXN0X2VudHJ5KGN1ciwgc3RydWN0IGJ0cmZzX2RldmljZSwgZGV2X2xpc3QpOworCQlpZiAoIWRldi0+YmRldikgeworCQkJdG90YWxfZXJyb3JzKys7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIWRldi0+aW5fZnNfbWV0YWRhdGEgfHwgIWRldi0+d3JpdGVhYmxlKQorCQkJY29udGludWU7CisKKwkJYnRyZnNfc2V0X3N0YWNrX2RldmljZV9nZW5lcmF0aW9uKGRldl9pdGVtLCAwKTsKKwkJYnRyZnNfc2V0X3N0YWNrX2RldmljZV90eXBlKGRldl9pdGVtLCBkZXYtPnR5cGUpOworCQlidHJmc19zZXRfc3RhY2tfZGV2aWNlX2lkKGRldl9pdGVtLCBkZXYtPmRldmlkKTsKKwkJYnRyZnNfc2V0X3N0YWNrX2RldmljZV90b3RhbF9ieXRlcyhkZXZfaXRlbSwgZGV2LT50b3RhbF9ieXRlcyk7CisJCWJ0cmZzX3NldF9zdGFja19kZXZpY2VfYnl0ZXNfdXNlZChkZXZfaXRlbSwgZGV2LT5ieXRlc191c2VkKTsKKwkJYnRyZnNfc2V0X3N0YWNrX2RldmljZV9pb19hbGlnbihkZXZfaXRlbSwgZGV2LT5pb19hbGlnbik7CisJCWJ0cmZzX3NldF9zdGFja19kZXZpY2VfaW9fd2lkdGgoZGV2X2l0ZW0sIGRldi0+aW9fd2lkdGgpOworCQlidHJmc19zZXRfc3RhY2tfZGV2aWNlX3NlY3Rvcl9zaXplKGRldl9pdGVtLCBkZXYtPnNlY3Rvcl9zaXplKTsKKwkJbWVtY3B5KGRldl9pdGVtLT51dWlkLCBkZXYtPnV1aWQsIEJUUkZTX1VVSURfU0laRSk7CisJCW1lbWNweShkZXZfaXRlbS0+ZnNpZCwgZGV2LT5mc19kZXZpY2VzLT5mc2lkLCBCVFJGU19VVUlEX1NJWkUpOworCisJCWZsYWdzID0gYnRyZnNfc3VwZXJfZmxhZ3Moc2IpOworCQlidHJmc19zZXRfc3VwZXJfZmxhZ3Moc2IsIGZsYWdzIHwgQlRSRlNfSEVBREVSX0ZMQUdfV1JJVFRFTik7CisKKwkJcmV0ID0gd3JpdGVfZGV2X3N1cGVycyhkZXYsIHNiLCBkb19iYXJyaWVycywgMCwgbWF4X21pcnJvcnMpOworCQlpZiAocmV0KQorCQkJdG90YWxfZXJyb3JzKys7CisJfQorCWlmICh0b3RhbF9lcnJvcnMgPiBtYXhfZXJyb3JzKSB7CisJCXByaW50ayhLRVJOX0VSUiAiYnRyZnM6ICVkIGVycm9ycyB3aGlsZSB3cml0aW5nIHN1cGVyc1xuIiwKKwkJICAgICAgIHRvdGFsX2Vycm9ycyk7CisJCUJVRygpOworCX0KKworCXRvdGFsX2Vycm9ycyA9IDA7CisJbGlzdF9mb3JfZWFjaChjdXIsIGhlYWQpIHsKKwkJZGV2ID0gbGlzdF9lbnRyeShjdXIsIHN0cnVjdCBidHJmc19kZXZpY2UsIGRldl9saXN0KTsKKwkJaWYgKCFkZXYtPmJkZXYpCisJCQljb250aW51ZTsKKwkJaWYgKCFkZXYtPmluX2ZzX21ldGFkYXRhIHx8ICFkZXYtPndyaXRlYWJsZSkKKwkJCWNvbnRpbnVlOworCisJCXJldCA9IHdyaXRlX2Rldl9zdXBlcnMoZGV2LCBzYiwgZG9fYmFycmllcnMsIDEsIG1heF9taXJyb3JzKTsKKwkJaWYgKHJldCkKKwkJCXRvdGFsX2Vycm9ycysrOworCX0KKwlpZiAodG90YWxfZXJyb3JzID4gbWF4X2Vycm9ycykgeworCQlwcmludGsoS0VSTl9FUlIgImJ0cmZzOiAlZCBlcnJvcnMgd2hpbGUgd3JpdGluZyBzdXBlcnNcbiIsCisJCSAgICAgICB0b3RhbF9lcnJvcnMpOworCQlCVUcoKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK2ludCB3cml0ZV9jdHJlZV9zdXBlcihzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKKwkJICAgICAgc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsIGludCBtYXhfbWlycm9ycykKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gd3JpdGVfYWxsX3N1cGVycyhyb290LCBtYXhfbWlycm9ycyk7CisJcmV0dXJuIHJldDsKK30KKworaW50IGJ0cmZzX2ZyZWVfZnNfcm9vdChzdHJ1Y3QgYnRyZnNfZnNfaW5mbyAqZnNfaW5mbywgc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QpCit7CisJcmFkaXhfdHJlZV9kZWxldGUoJmZzX2luZm8tPmZzX3Jvb3RzX3JhZGl4LAorCQkJICAodW5zaWduZWQgbG9uZylyb290LT5yb290X2tleS5vYmplY3RpZCk7CisJaWYgKHJvb3QtPmFub25fc3VwZXIuc19kZXYpIHsKKwkJZG93bl93cml0ZSgmcm9vdC0+YW5vbl9zdXBlci5zX3Vtb3VudCk7CisJCWtpbGxfYW5vbl9zdXBlcigmcm9vdC0+YW5vbl9zdXBlcik7CisJfQorCWlmIChyb290LT5ub2RlKQorCQlmcmVlX2V4dGVudF9idWZmZXIocm9vdC0+bm9kZSk7CisJaWYgKHJvb3QtPmNvbW1pdF9yb290KQorCQlmcmVlX2V4dGVudF9idWZmZXIocm9vdC0+Y29tbWl0X3Jvb3QpOworCWtmcmVlKHJvb3QtPm5hbWUpOworCWtmcmVlKHJvb3QpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRlbF9mc19yb290cyhzdHJ1Y3QgYnRyZnNfZnNfaW5mbyAqZnNfaW5mbykKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBidHJmc19yb290ICpnYW5nWzhdOworCWludCBpOworCisJd2hpbGUgKDEpIHsKKwkJcmV0ID0gcmFkaXhfdHJlZV9nYW5nX2xvb2t1cCgmZnNfaW5mby0+ZnNfcm9vdHNfcmFkaXgsCisJCQkJCSAgICAgKHZvaWQgKiopZ2FuZywgMCwKKwkJCQkJICAgICBBUlJBWV9TSVpFKGdhbmcpKTsKKwkJaWYgKCFyZXQpCisJCQlicmVhazsKKwkJZm9yIChpID0gMDsgaSA8IHJldDsgaSsrKQorCQkJYnRyZnNfZnJlZV9mc19yb290KGZzX2luZm8sIGdhbmdbaV0pOworCX0KKwlyZXR1cm4gMDsKK30KKworaW50IGJ0cmZzX2NsZWFudXBfZnNfcm9vdHMoc3RydWN0IGJ0cmZzX2ZzX2luZm8gKmZzX2luZm8pCit7CisJdTY0IHJvb3Rfb2JqZWN0aWQgPSAwOworCXN0cnVjdCBidHJmc19yb290ICpnYW5nWzhdOworCWludCBpOworCWludCByZXQ7CisKKwl3aGlsZSAoMSkgeworCQlyZXQgPSByYWRpeF90cmVlX2dhbmdfbG9va3VwKCZmc19pbmZvLT5mc19yb290c19yYWRpeCwKKwkJCQkJICAgICAodm9pZCAqKilnYW5nLCByb290X29iamVjdGlkLAorCQkJCQkgICAgIEFSUkFZX1NJWkUoZ2FuZykpOworCQlpZiAoIXJldCkKKwkJCWJyZWFrOworCQlmb3IgKGkgPSAwOyBpIDwgcmV0OyBpKyspIHsKKwkJCXJvb3Rfb2JqZWN0aWQgPSBnYW5nW2ldLT5yb290X2tleS5vYmplY3RpZDsKKwkJCXJldCA9IGJ0cmZzX2ZpbmRfZGVhZF9yb290cyhmc19pbmZvLT50cmVlX3Jvb3QsCisJCQkJCQkgICAgcm9vdF9vYmplY3RpZCwgZ2FuZ1tpXSk7CisJCQlCVUdfT04ocmV0KTsKKwkJCWJ0cmZzX29ycGhhbl9jbGVhbnVwKGdhbmdbaV0pOworCQl9CisJCXJvb3Rfb2JqZWN0aWQrKzsKKwl9CisJcmV0dXJuIDA7Cit9CisKK2ludCBidHJmc19jb21taXRfc3VwZXIoc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QpCit7CisJc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnM7CisJaW50IHJldDsKKworCW11dGV4X2xvY2soJnJvb3QtPmZzX2luZm8tPmNsZWFuZXJfbXV0ZXgpOworCWJ0cmZzX2NsZWFuX29sZF9zbmFwc2hvdHMocm9vdCk7CisJbXV0ZXhfdW5sb2NrKCZyb290LT5mc19pbmZvLT5jbGVhbmVyX211dGV4KTsKKwl0cmFucyA9IGJ0cmZzX3N0YXJ0X3RyYW5zYWN0aW9uKHJvb3QsIDEpOworCXJldCA9IGJ0cmZzX2NvbW1pdF90cmFuc2FjdGlvbih0cmFucywgcm9vdCk7CisJQlVHX09OKHJldCk7CisJLyogcnVuIGNvbW1pdCBhZ2FpbiB0byBkcm9wIHRoZSBvcmlnaW5hbCBzbmFwc2hvdCAqLworCXRyYW5zID0gYnRyZnNfc3RhcnRfdHJhbnNhY3Rpb24ocm9vdCwgMSk7CisJYnRyZnNfY29tbWl0X3RyYW5zYWN0aW9uKHRyYW5zLCByb290KTsKKwlyZXQgPSBidHJmc193cml0ZV9hbmRfd2FpdF90cmFuc2FjdGlvbihOVUxMLCByb290KTsKKwlCVUdfT04ocmV0KTsKKworCXJldCA9IHdyaXRlX2N0cmVlX3N1cGVyKE5VTEwsIHJvb3QsIDApOworCXJldHVybiByZXQ7Cit9CisKK2ludCBjbG9zZV9jdHJlZShzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCkKK3sKKwlzdHJ1Y3QgYnRyZnNfZnNfaW5mbyAqZnNfaW5mbyA9IHJvb3QtPmZzX2luZm87CisJaW50IHJldDsKKworCWZzX2luZm8tPmNsb3NpbmcgPSAxOworCXNtcF9tYigpOworCisJa3RocmVhZF9zdG9wKHJvb3QtPmZzX2luZm8tPnRyYW5zYWN0aW9uX2t0aHJlYWQpOworCWt0aHJlYWRfc3RvcChyb290LT5mc19pbmZvLT5jbGVhbmVyX2t0aHJlYWQpOworCisJaWYgKCEoZnNfaW5mby0+c2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkpKSB7CisJCXJldCA9ICBidHJmc19jb21taXRfc3VwZXIocm9vdCk7CisJCWlmIChyZXQpCisJCQlwcmludGsoS0VSTl9FUlIgImJ0cmZzOiBjb21taXQgc3VwZXIgcmV0ICVkXG4iLCByZXQpOworCX0KKworCWlmIChmc19pbmZvLT5kZWxhbGxvY19ieXRlcykgeworCQlwcmludGsoS0VSTl9JTkZPICJidHJmczogYXQgdW5tb3VudCBkZWxhbGxvYyBjb3VudCAlbGx1XG4iLAorCQkgICAgICAgZnNfaW5mby0+ZGVsYWxsb2NfYnl0ZXMpOworCX0KKwlpZiAoZnNfaW5mby0+dG90YWxfcmVmX2NhY2hlX3NpemUpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiYnRyZnM6IGF0IHVtb3VudCByZWZlcmVuY2UgY2FjaGUgc2l6ZSAlbGx1XG4iLAorCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylmc19pbmZvLT50b3RhbF9yZWZfY2FjaGVfc2l6ZSk7CisJfQorCisJaWYgKGZzX2luZm8tPmV4dGVudF9yb290LT5ub2RlKQorCQlmcmVlX2V4dGVudF9idWZmZXIoZnNfaW5mby0+ZXh0ZW50X3Jvb3QtPm5vZGUpOworCisJaWYgKGZzX2luZm8tPnRyZWVfcm9vdC0+bm9kZSkKKwkJZnJlZV9leHRlbnRfYnVmZmVyKGZzX2luZm8tPnRyZWVfcm9vdC0+bm9kZSk7CisKKwlpZiAocm9vdC0+ZnNfaW5mby0+Y2h1bmtfcm9vdC0+bm9kZSkKKwkJZnJlZV9leHRlbnRfYnVmZmVyKHJvb3QtPmZzX2luZm8tPmNodW5rX3Jvb3QtPm5vZGUpOworCisJaWYgKHJvb3QtPmZzX2luZm8tPmRldl9yb290LT5ub2RlKQorCQlmcmVlX2V4dGVudF9idWZmZXIocm9vdC0+ZnNfaW5mby0+ZGV2X3Jvb3QtPm5vZGUpOworCisJaWYgKHJvb3QtPmZzX2luZm8tPmNzdW1fcm9vdC0+bm9kZSkKKwkJZnJlZV9leHRlbnRfYnVmZmVyKHJvb3QtPmZzX2luZm8tPmNzdW1fcm9vdC0+bm9kZSk7CisKKwlidHJmc19mcmVlX2Jsb2NrX2dyb3Vwcyhyb290LT5mc19pbmZvKTsKKworCWRlbF9mc19yb290cyhmc19pbmZvKTsKKworCWlwdXQoZnNfaW5mby0+YnRyZWVfaW5vZGUpOworCisJYnRyZnNfc3RvcF93b3JrZXJzKCZmc19pbmZvLT5maXh1cF93b3JrZXJzKTsKKwlidHJmc19zdG9wX3dvcmtlcnMoJmZzX2luZm8tPmRlbGFsbG9jX3dvcmtlcnMpOworCWJ0cmZzX3N0b3Bfd29ya2VycygmZnNfaW5mby0+d29ya2Vycyk7CisJYnRyZnNfc3RvcF93b3JrZXJzKCZmc19pbmZvLT5lbmRpb193b3JrZXJzKTsKKwlidHJmc19zdG9wX3dvcmtlcnMoJmZzX2luZm8tPmVuZGlvX21ldGFfd29ya2Vycyk7CisJYnRyZnNfc3RvcF93b3JrZXJzKCZmc19pbmZvLT5lbmRpb19tZXRhX3dyaXRlX3dvcmtlcnMpOworCWJ0cmZzX3N0b3Bfd29ya2VycygmZnNfaW5mby0+ZW5kaW9fd3JpdGVfd29ya2Vycyk7CisJYnRyZnNfc3RvcF93b3JrZXJzKCZmc19pbmZvLT5zdWJtaXRfd29ya2Vycyk7CisKKyNpZiAwCisJd2hpbGUgKCFsaXN0X2VtcHR5KCZmc19pbmZvLT5oYXNoZXJzKSkgeworCQlzdHJ1Y3QgYnRyZnNfaGFzaGVyICpoYXNoZXI7CisJCWhhc2hlciA9IGxpc3RfZW50cnkoZnNfaW5mby0+aGFzaGVycy5uZXh0LCBzdHJ1Y3QgYnRyZnNfaGFzaGVyLAorCQkJCSAgICBoYXNoZXJzKTsKKwkJbGlzdF9kZWwoJmhhc2hlci0+aGFzaGVycyk7CisJCWNyeXB0b19mcmVlX2hhc2goJmZzX2luZm8tPmhhc2hfdGZtKTsKKwkJa2ZyZWUoaGFzaGVyKTsKKwl9CisjZW5kaWYKKwlidHJmc19jbG9zZV9kZXZpY2VzKGZzX2luZm8tPmZzX2RldmljZXMpOworCWJ0cmZzX21hcHBpbmdfdHJlZV9mcmVlKCZmc19pbmZvLT5tYXBwaW5nX3RyZWUpOworCisJYmRpX2Rlc3Ryb3koJmZzX2luZm8tPmJkaSk7CisKKwlrZnJlZShmc19pbmZvLT5leHRlbnRfcm9vdCk7CisJa2ZyZWUoZnNfaW5mby0+dHJlZV9yb290KTsKKwlrZnJlZShmc19pbmZvLT5jaHVua19yb290KTsKKwlrZnJlZShmc19pbmZvLT5kZXZfcm9vdCk7CisJa2ZyZWUoZnNfaW5mby0+Y3N1bV9yb290KTsKKwlyZXR1cm4gMDsKK30KKworaW50IGJ0cmZzX2J1ZmZlcl91cHRvZGF0ZShzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqYnVmLCB1NjQgcGFyZW50X3RyYW5zaWQpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgaW5vZGUgKmJ0cmVlX2lub2RlID0gYnVmLT5maXJzdF9wYWdlLT5tYXBwaW5nLT5ob3N0OworCisJcmV0ID0gZXh0ZW50X2J1ZmZlcl91cHRvZGF0ZSgmQlRSRlNfSShidHJlZV9pbm9kZSktPmlvX3RyZWUsIGJ1Zik7CisJaWYgKCFyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSB2ZXJpZnlfcGFyZW50X3RyYW5zaWQoJkJUUkZTX0koYnRyZWVfaW5vZGUpLT5pb190cmVlLCBidWYsCisJCQkJICAgIHBhcmVudF90cmFuc2lkKTsKKwlyZXR1cm4gIXJldDsKK30KKworaW50IGJ0cmZzX3NldF9idWZmZXJfdXB0b2RhdGUoc3RydWN0IGV4dGVudF9idWZmZXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaW5vZGUgKmJ0cmVlX2lub2RlID0gYnVmLT5maXJzdF9wYWdlLT5tYXBwaW5nLT5ob3N0OworCXJldHVybiBzZXRfZXh0ZW50X2J1ZmZlcl91cHRvZGF0ZSgmQlRSRlNfSShidHJlZV9pbm9kZSktPmlvX3RyZWUsCisJCQkJCSAgYnVmKTsKK30KKwordm9pZCBidHJmc19tYXJrX2J1ZmZlcl9kaXJ0eShzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqYnVmKQoreworCXN0cnVjdCBidHJmc19yb290ICpyb290ID0gQlRSRlNfSShidWYtPmZpcnN0X3BhZ2UtPm1hcHBpbmctPmhvc3QpLT5yb290OworCXU2NCB0cmFuc2lkID0gYnRyZnNfaGVhZGVyX2dlbmVyYXRpb24oYnVmKTsKKwlzdHJ1Y3QgaW5vZGUgKmJ0cmVlX2lub2RlID0gcm9vdC0+ZnNfaW5mby0+YnRyZWVfaW5vZGU7CisKKwlXQVJOX09OKCFidHJmc190cmVlX2xvY2tlZChidWYpKTsKKwlpZiAodHJhbnNpZCAhPSByb290LT5mc19pbmZvLT5nZW5lcmF0aW9uKSB7CisJCXByaW50ayhLRVJOX0NSSVQgImJ0cmZzIHRyYW5zaWQgbWlzbWF0Y2ggYnVmZmVyICVsbHUsICIKKwkJICAgICAgICJmb3VuZCAlbGx1IHJ1bm5pbmcgJWxsdVxuIiwKKwkJCSh1bnNpZ25lZCBsb25nIGxvbmcpYnVmLT5zdGFydCwKKwkJCSh1bnNpZ25lZCBsb25nIGxvbmcpdHJhbnNpZCwKKwkJCSh1bnNpZ25lZCBsb25nIGxvbmcpcm9vdC0+ZnNfaW5mby0+Z2VuZXJhdGlvbik7CisJCVdBUk5fT04oMSk7CisJfQorCXNldF9leHRlbnRfYnVmZmVyX2RpcnR5KCZCVFJGU19JKGJ0cmVlX2lub2RlKS0+aW9fdHJlZSwgYnVmKTsKK30KKwordm9pZCBidHJmc19idHJlZV9iYWxhbmNlX2RpcnR5KHN0cnVjdCBidHJmc19yb290ICpyb290LCB1bnNpZ25lZCBsb25nIG5yKQoreworCS8qCisJICogbG9va3MgYXMgdGhvdWdoIG9sZGVyIGtlcm5lbHMgY2FuIGdldCBpbnRvIHRyb3VibGUgd2l0aAorCSAqIHRoaXMgY29kZSwgdGhleSBlbmQgdXAgc3R1Y2sgaW4gYmFsYW5jZV9kaXJ0eV9wYWdlcyBmb3JldmVyCisJICovCisJc3RydWN0IGV4dGVudF9pb190cmVlICp0cmVlOworCXU2NCBudW1fZGlydHk7CisJdTY0IHN0YXJ0ID0gMDsKKwl1bnNpZ25lZCBsb25nIHRocmVzaCA9IDMyICogMTAyNCAqIDEwMjQ7CisJdHJlZSA9ICZCVFJGU19JKHJvb3QtPmZzX2luZm8tPmJ0cmVlX2lub2RlKS0+aW9fdHJlZTsKKworCWlmIChjdXJyZW50X2lzX3BkZmx1c2goKSB8fCBjdXJyZW50LT5mbGFncyAmIFBGX01FTUFMTE9DKQorCQlyZXR1cm47CisKKwludW1fZGlydHkgPSBjb3VudF9yYW5nZV9iaXRzKHRyZWUsICZzdGFydCwgKHU2NCktMSwKKwkJCQkgICAgIHRocmVzaCwgRVhURU5UX0RJUlRZKTsKKwlpZiAobnVtX2RpcnR5ID4gdGhyZXNoKSB7CisJCWJhbGFuY2VfZGlydHlfcGFnZXNfcmF0ZWxpbWl0ZWRfbnIoCisJCQkJICAgcm9vdC0+ZnNfaW5mby0+YnRyZWVfaW5vZGUtPmlfbWFwcGluZywgMSk7CisJfQorCXJldHVybjsKK30KKworaW50IGJ0cmZzX3JlYWRfYnVmZmVyKHN0cnVjdCBleHRlbnRfYnVmZmVyICpidWYsIHU2NCBwYXJlbnRfdHJhbnNpZCkKK3sKKwlzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCA9IEJUUkZTX0koYnVmLT5maXJzdF9wYWdlLT5tYXBwaW5nLT5ob3N0KS0+cm9vdDsKKwlpbnQgcmV0OworCXJldCA9IGJ0cmVlX3JlYWRfZXh0ZW50X2J1ZmZlcl9wYWdlcyhyb290LCBidWYsIDAsIHBhcmVudF90cmFuc2lkKTsKKwlpZiAocmV0ID09IDApCisJCWJ1Zi0+ZmxhZ3MgfD0gRVhURU5UX1VQVE9EQVRFOworCXJldHVybiByZXQ7Cit9CisKK2ludCBidHJlZV9sb2NrX3BhZ2VfaG9vayhzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gcGFnZS0+bWFwcGluZy0+aG9zdDsKKwlzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCA9IEJUUkZTX0koaW5vZGUpLT5yb290OworCXN0cnVjdCBleHRlbnRfaW9fdHJlZSAqaW9fdHJlZSA9ICZCVFJGU19JKGlub2RlKS0+aW9fdHJlZTsKKwlzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqZWI7CisJdW5zaWduZWQgbG9uZyBsZW47CisJdTY0IGJ5dGVuciA9IHBhZ2Vfb2Zmc2V0KHBhZ2UpOworCisJaWYgKHBhZ2UtPnByaXZhdGUgPT0gRVhURU5UX1BBR0VfUFJJVkFURSkKKwkJZ290byBvdXQ7CisKKwlsZW4gPSBwYWdlLT5wcml2YXRlID4+IDI7CisJZWIgPSBmaW5kX2V4dGVudF9idWZmZXIoaW9fdHJlZSwgYnl0ZW5yLCBsZW4sIEdGUF9OT0ZTKTsKKwlpZiAoIWViKQorCQlnb3RvIG91dDsKKworCWJ0cmZzX3RyZWVfbG9jayhlYik7CisJc3Bpbl9sb2NrKCZyb290LT5mc19pbmZvLT5oYXNoX2xvY2spOworCWJ0cmZzX3NldF9oZWFkZXJfZmxhZyhlYiwgQlRSRlNfSEVBREVSX0ZMQUdfV1JJVFRFTik7CisJc3Bpbl91bmxvY2soJnJvb3QtPmZzX2luZm8tPmhhc2hfbG9jayk7CisJYnRyZnNfdHJlZV91bmxvY2soZWIpOworCWZyZWVfZXh0ZW50X2J1ZmZlcihlYik7CitvdXQ6CisJbG9ja19wYWdlKHBhZ2UpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGV4dGVudF9pb19vcHMgYnRyZWVfZXh0ZW50X2lvX29wcyA9IHsKKwkud3JpdGVfY2FjaGVfcGFnZXNfbG9ja19ob29rID0gYnRyZWVfbG9ja19wYWdlX2hvb2ssCisJLnJlYWRwYWdlX2VuZF9pb19ob29rID0gYnRyZWVfcmVhZHBhZ2VfZW5kX2lvX2hvb2ssCisJLnN1Ym1pdF9iaW9faG9vayA9IGJ0cmVlX3N1Ym1pdF9iaW9faG9vaywKKwkvKiBub3RlIHdlJ3JlIHNoYXJpbmcgd2l0aCBpbm9kZS5jIGZvciB0aGUgbWVyZ2UgYmlvIGhvb2sgKi8KKwkubWVyZ2VfYmlvX2hvb2sgPSBidHJmc19tZXJnZV9iaW9faG9vaywKK307CmRpZmYgLS1naXQgYS9mcy9idHJmcy9kaXNrLWlvLmggYi9mcy9idHJmcy9kaXNrLWlvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzBmZjQwNAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2J0cmZzL2Rpc2staW8uaApAQCAtMCwwICsxLDEwMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBPcmFjbGUuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSB2MiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorICogQm9zdG9uLCBNQSAwMjExMTAtMTMwNywgVVNBLgorICovCisKKyNpZm5kZWYgX19ESVNLSU9fXworI2RlZmluZSBfX0RJU0tJT19fCisKKyNkZWZpbmUgQlRSRlNfU1VQRVJfSU5GT19PRkZTRVQgKDY0ICogMTAyNCkKKyNkZWZpbmUgQlRSRlNfU1VQRVJfSU5GT19TSVpFIDQwOTYKKworI2RlZmluZSBCVFJGU19TVVBFUl9NSVJST1JfTUFYCSAzCisjZGVmaW5lIEJUUkZTX1NVUEVSX01JUlJPUl9TSElGVCAxMgorCitzdGF0aWMgaW5saW5lIHU2NCBidHJmc19zYl9vZmZzZXQoaW50IG1pcnJvcikKK3sKKwl1NjQgc3RhcnQgPSAxNiAqIDEwMjQ7CisJaWYgKG1pcnJvcikKKwkJcmV0dXJuIHN0YXJ0IDw8IChCVFJGU19TVVBFUl9NSVJST1JfU0hJRlQgKiBtaXJyb3IpOworCXJldHVybiBCVFJGU19TVVBFUl9JTkZPX09GRlNFVDsKK30KKworc3RydWN0IGJ0cmZzX2RldmljZTsKK3N0cnVjdCBidHJmc19mc19kZXZpY2VzOworCitzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqcmVhZF90cmVlX2Jsb2NrKHN0cnVjdCBidHJmc19yb290ICpyb290LCB1NjQgYnl0ZW5yLAorCQkJCSAgICAgIHUzMiBibG9ja3NpemUsIHU2NCBwYXJlbnRfdHJhbnNpZCk7CitpbnQgcmVhZGFoZWFkX3RyZWVfYmxvY2soc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsIHU2NCBieXRlbnIsIHUzMiBibG9ja3NpemUsCisJCQkgdTY0IHBhcmVudF90cmFuc2lkKTsKK3N0cnVjdCBleHRlbnRfYnVmZmVyICpidHJmc19maW5kX2NyZWF0ZV90cmVlX2Jsb2NrKHN0cnVjdCBidHJmc19yb290ICpyb290LAorCQkJCQkJICAgdTY0IGJ5dGVuciwgdTMyIGJsb2Nrc2l6ZSk7CitpbnQgY2xlYW5fdHJlZV9ibG9jayhzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKKwkJICAgICBzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwgc3RydWN0IGV4dGVudF9idWZmZXIgKmJ1Zik7CitzdHJ1Y3QgYnRyZnNfcm9vdCAqb3Blbl9jdHJlZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAorCQkJICAgICAgc3RydWN0IGJ0cmZzX2ZzX2RldmljZXMgKmZzX2RldmljZXMsCisJCQkgICAgICBjaGFyICpvcHRpb25zKTsKK2ludCBjbG9zZV9jdHJlZShzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCk7CitpbnQgd3JpdGVfY3RyZWVfc3VwZXIoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCisJCSAgICAgIHN0cnVjdCBidHJmc19yb290ICpyb290LCBpbnQgbWF4X21pcnJvcnMpOworc3RydWN0IGJ1ZmZlcl9oZWFkICpidHJmc19yZWFkX2Rldl9zdXBlcihzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2KTsKK2ludCBidHJmc19jb21taXRfc3VwZXIoc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QpOworc3RydWN0IGV4dGVudF9idWZmZXIgKmJ0cmZzX2ZpbmRfdHJlZV9ibG9jayhzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwKKwkJCQkJICAgIHU2NCBieXRlbnIsIHUzMiBibG9ja3NpemUpOworc3RydWN0IGJ0cmZzX3Jvb3QgKmJ0cmZzX2xvb2t1cF9mc19yb290KHN0cnVjdCBidHJmc19mc19pbmZvICpmc19pbmZvLAorCQkJCQl1NjQgcm9vdF9vYmplY3RpZCk7CitzdHJ1Y3QgYnRyZnNfcm9vdCAqYnRyZnNfcmVhZF9mc19yb290KHN0cnVjdCBidHJmc19mc19pbmZvICpmc19pbmZvLAorCQkJCSAgICAgIHN0cnVjdCBidHJmc19rZXkgKmxvY2F0aW9uLAorCQkJCSAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIGludCBuYW1lbGVuKTsKK3N0cnVjdCBidHJmc19yb290ICpidHJmc19yZWFkX2ZzX3Jvb3Rfbm9fcmFkaXgoc3RydWN0IGJ0cmZzX3Jvb3QgKnRyZWVfcm9vdCwKKwkJCQkJICAgICAgIHN0cnVjdCBidHJmc19rZXkgKmxvY2F0aW9uKTsKK3N0cnVjdCBidHJmc19yb290ICpidHJmc19yZWFkX2ZzX3Jvb3Rfbm9fbmFtZShzdHJ1Y3QgYnRyZnNfZnNfaW5mbyAqZnNfaW5mbywKKwkJCQkJICAgICAgc3RydWN0IGJ0cmZzX2tleSAqbG9jYXRpb24pOworaW50IGJ0cmZzX2NsZWFudXBfZnNfcm9vdHMoc3RydWN0IGJ0cmZzX2ZzX2luZm8gKmZzX2luZm8pOworaW50IGJ0cmZzX2luc2VydF9kZXZfcmFkaXgoc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsCisJCQkgICBzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LAorCQkJICAgdTY0IGRldmljZV9pZCwKKwkJCSAgIHU2NCBibG9ja19zdGFydCwKKwkJCSAgIHU2NCBudW1fYmxvY2tzKTsKK3ZvaWQgYnRyZnNfYnRyZWVfYmFsYW5jZV9kaXJ0eShzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwgdW5zaWduZWQgbG9uZyBucik7CitpbnQgYnRyZnNfZnJlZV9mc19yb290KHN0cnVjdCBidHJmc19mc19pbmZvICpmc19pbmZvLCBzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCk7Cit2b2lkIGJ0cmZzX21hcmtfYnVmZmVyX2RpcnR5KHN0cnVjdCBleHRlbnRfYnVmZmVyICpidWYpOworaW50IGJ0cmZzX2J1ZmZlcl91cHRvZGF0ZShzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqYnVmLCB1NjQgcGFyZW50X3RyYW5zaWQpOworaW50IGJ0cmZzX3NldF9idWZmZXJfdXB0b2RhdGUoc3RydWN0IGV4dGVudF9idWZmZXIgKmJ1Zik7CitpbnQgd2FpdF9vbl90cmVlX2Jsb2NrX3dyaXRlYmFjayhzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwKKwkJCQkgc3RydWN0IGV4dGVudF9idWZmZXIgKmJ1Zik7CitpbnQgYnRyZnNfcmVhZF9idWZmZXIoc3RydWN0IGV4dGVudF9idWZmZXIgKmJ1ZiwgdTY0IHBhcmVudF90cmFuc2lkKTsKK3UzMiBidHJmc19jc3VtX2RhdGEoc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsIGNoYXIgKmRhdGEsIHUzMiBzZWVkLCBzaXplX3QgbGVuKTsKK3ZvaWQgYnRyZnNfY3N1bV9maW5hbCh1MzIgY3JjLCBjaGFyICpyZXN1bHQpOworaW50IGJ0cmZzX29wZW5fZGV2aWNlKHN0cnVjdCBidHJmc19kZXZpY2UgKmRldik7CitpbnQgYnRyZnNfdmVyaWZ5X2Jsb2NrX2NzdW0oc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsCisJCQkgICAgc3RydWN0IGV4dGVudF9idWZmZXIgKmJ1Zik7CitpbnQgYnRyZnNfYmlvX3dxX2VuZF9pbyhzdHJ1Y3QgYnRyZnNfZnNfaW5mbyAqaW5mbywgc3RydWN0IGJpbyAqYmlvLAorCQkJaW50IG1ldGFkYXRhKTsKK2ludCBidHJmc193cV9zdWJtaXRfYmlvKHN0cnVjdCBidHJmc19mc19pbmZvICpmc19pbmZvLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJaW50IHJ3LCBzdHJ1Y3QgYmlvICpiaW8sIGludCBtaXJyb3JfbnVtLAorCQkJdW5zaWduZWQgbG9uZyBiaW9fZmxhZ3MsCisJCQlleHRlbnRfc3VibWl0X2Jpb19ob29rX3QgKnN1Ym1pdF9iaW9fc3RhcnQsCisJCQlleHRlbnRfc3VibWl0X2Jpb19ob29rX3QgKnN1Ym1pdF9iaW9fZG9uZSk7CisKK2ludCBidHJmc19jb25nZXN0ZWRfYXN5bmMoc3RydWN0IGJ0cmZzX2ZzX2luZm8gKmluZm8sIGludCBpb2RvbmUpOwordW5zaWduZWQgbG9uZyBidHJmc19hc3luY19zdWJtaXRfbGltaXQoc3RydWN0IGJ0cmZzX2ZzX2luZm8gKmluZm8pOworaW50IGJ0cmZzX3dyaXRlX3RyZWVfYmxvY2soc3RydWN0IGV4dGVudF9idWZmZXIgKmJ1Zik7CitpbnQgYnRyZnNfd2FpdF90cmVlX2Jsb2NrX3dyaXRlYmFjayhzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqYnVmKTsKK2ludCBidHJmc19mcmVlX2xvZ19yb290X3RyZWUoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCisJCQkgICAgIHN0cnVjdCBidHJmc19mc19pbmZvICpmc19pbmZvKTsKK2ludCBidHJmc19pbml0X2xvZ19yb290X3RyZWUoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCisJCQkgICAgIHN0cnVjdCBidHJmc19mc19pbmZvICpmc19pbmZvKTsKK2ludCBidHJlZV9sb2NrX3BhZ2VfaG9vayhzdHJ1Y3QgcGFnZSAqcGFnZSk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2ZzL2J0cmZzL2V4cG9ydC5jIGIvZnMvYnRyZnMvZXhwb3J0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODUzMTVkMgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2J0cmZzL2V4cG9ydC5jCkBAIC0wLDAgKzEsMjAzIEBACisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgImN0cmVlLmgiCisjaW5jbHVkZSAiZGlzay1pby5oIgorI2luY2x1ZGUgImJ0cmZzX2lub2RlLmgiCisjaW5jbHVkZSAicHJpbnQtdHJlZS5oIgorI2luY2x1ZGUgImV4cG9ydC5oIgorI2luY2x1ZGUgImNvbXBhdC5oIgorCisjZGVmaW5lIEJUUkZTX0ZJRF9TSVpFX05PTl9DT05ORUNUQUJMRSAob2Zmc2V0b2Yoc3RydWN0IGJ0cmZzX2ZpZCwgXAorCQkJCQkJIHBhcmVudF9vYmplY3RpZCkgLyA0KQorI2RlZmluZSBCVFJGU19GSURfU0laRV9DT05ORUNUQUJMRSAob2Zmc2V0b2Yoc3RydWN0IGJ0cmZzX2ZpZCwgXAorCQkJCQkgICAgIHBhcmVudF9yb290X29iamVjdGlkKSAvIDQpCisjZGVmaW5lIEJUUkZTX0ZJRF9TSVpFX0NPTk5FQ1RBQkxFX1JPT1QgKHNpemVvZihzdHJ1Y3QgYnRyZnNfZmlkKSAvIDQpCisKK3N0YXRpYyBpbnQgYnRyZnNfZW5jb2RlX2ZoKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgdTMyICpmaCwgaW50ICptYXhfbGVuLAorCQkJICAgaW50IGNvbm5lY3RhYmxlKQoreworCXN0cnVjdCBidHJmc19maWQgKmZpZCA9IChzdHJ1Y3QgYnRyZnNfZmlkICopZmg7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKwlpbnQgbGVuID0gKm1heF9sZW47CisJaW50IHR5cGU7CisKKwlpZiAoKGxlbiA8IEJUUkZTX0ZJRF9TSVpFX05PTl9DT05ORUNUQUJMRSkgfHwKKwkgICAgKGNvbm5lY3RhYmxlICYmIGxlbiA8IEJUUkZTX0ZJRF9TSVpFX0NPTk5FQ1RBQkxFKSkKKwkJcmV0dXJuIDI1NTsKKworCWxlbiAgPSBCVFJGU19GSURfU0laRV9OT05fQ09OTkVDVEFCTEU7CisJdHlwZSA9IEZJTEVJRF9CVFJGU19XSVRIT1VUX1BBUkVOVDsKKworCWZpZC0+b2JqZWN0aWQgPSBCVFJGU19JKGlub2RlKS0+bG9jYXRpb24ub2JqZWN0aWQ7CisJZmlkLT5yb290X29iamVjdGlkID0gQlRSRlNfSShpbm9kZSktPnJvb3QtPm9iamVjdGlkOworCWZpZC0+Z2VuID0gaW5vZGUtPmlfZ2VuZXJhdGlvbjsKKworCWlmIChjb25uZWN0YWJsZSAmJiAhU19JU0RJUihpbm9kZS0+aV9tb2RlKSkgeworCQlzdHJ1Y3QgaW5vZGUgKnBhcmVudDsKKwkJdTY0IHBhcmVudF9yb290X2lkOworCisJCXNwaW5fbG9jaygmZGVudHJ5LT5kX2xvY2spOworCisJCXBhcmVudCA9IGRlbnRyeS0+ZF9wYXJlbnQtPmRfaW5vZGU7CisJCWZpZC0+cGFyZW50X29iamVjdGlkID0gQlRSRlNfSShwYXJlbnQpLT5sb2NhdGlvbi5vYmplY3RpZDsKKwkJZmlkLT5wYXJlbnRfZ2VuID0gcGFyZW50LT5pX2dlbmVyYXRpb247CisJCXBhcmVudF9yb290X2lkID0gQlRSRlNfSShwYXJlbnQpLT5yb290LT5vYmplY3RpZDsKKworCQlzcGluX3VubG9jaygmZGVudHJ5LT5kX2xvY2spOworCisJCWlmIChwYXJlbnRfcm9vdF9pZCAhPSBmaWQtPnJvb3Rfb2JqZWN0aWQpIHsKKwkJCWZpZC0+cGFyZW50X3Jvb3Rfb2JqZWN0aWQgPSBwYXJlbnRfcm9vdF9pZDsKKwkJCWxlbiA9IEJUUkZTX0ZJRF9TSVpFX0NPTk5FQ1RBQkxFX1JPT1Q7CisJCQl0eXBlID0gRklMRUlEX0JUUkZTX1dJVEhfUEFSRU5UX1JPT1Q7CisJCX0gZWxzZSB7CisJCQlsZW4gPSBCVFJGU19GSURfU0laRV9DT05ORUNUQUJMRTsKKwkJCXR5cGUgPSBGSUxFSURfQlRSRlNfV0lUSF9QQVJFTlQ7CisJCX0KKwl9CisKKwkqbWF4X2xlbiA9IGxlbjsKKwlyZXR1cm4gdHlwZTsKK30KKworc3RhdGljIHN0cnVjdCBkZW50cnkgKmJ0cmZzX2dldF9kZW50cnkoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdTY0IG9iamVjdGlkLAorCQkJCSAgICAgICB1NjQgcm9vdF9vYmplY3RpZCwgdTMyIGdlbmVyYXRpb24pCit7CisJc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3Q7CisJc3RydWN0IGlub2RlICppbm9kZTsKKwlzdHJ1Y3QgYnRyZnNfa2V5IGtleTsKKworCWtleS5vYmplY3RpZCA9IHJvb3Rfb2JqZWN0aWQ7CisJYnRyZnNfc2V0X2tleV90eXBlKCZrZXksIEJUUkZTX1JPT1RfSVRFTV9LRVkpOworCWtleS5vZmZzZXQgPSAodTY0KS0xOworCisJcm9vdCA9IGJ0cmZzX3JlYWRfZnNfcm9vdF9ub19uYW1lKGJ0cmZzX3NiKHNiKS0+ZnNfaW5mbywgJmtleSk7CisJaWYgKElTX0VSUihyb290KSkKKwkJcmV0dXJuIEVSUl9DQVNUKHJvb3QpOworCisJa2V5Lm9iamVjdGlkID0gb2JqZWN0aWQ7CisJYnRyZnNfc2V0X2tleV90eXBlKCZrZXksIEJUUkZTX0lOT0RFX0lURU1fS0VZKTsKKwlrZXkub2Zmc2V0ID0gMDsKKworCWlub2RlID0gYnRyZnNfaWdldChzYiwgJmtleSwgcm9vdCwgTlVMTCk7CisJaWYgKElTX0VSUihpbm9kZSkpCisJCXJldHVybiAodm9pZCAqKWlub2RlOworCisJaWYgKGdlbmVyYXRpb24gIT0gaW5vZGUtPmlfZ2VuZXJhdGlvbikgeworCQlpcHV0KGlub2RlKTsKKwkJcmV0dXJuIEVSUl9QVFIoLUVTVEFMRSk7CisJfQorCisJcmV0dXJuIGRfb2J0YWluX2FsaWFzKGlub2RlKTsKK30KKworc3RhdGljIHN0cnVjdCBkZW50cnkgKmJ0cmZzX2ZoX3RvX3BhcmVudChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3QgZmlkICpmaCwKKwkJCQkJIGludCBmaF9sZW4sIGludCBmaF90eXBlKQoreworCXN0cnVjdCBidHJmc19maWQgKmZpZCA9IChzdHJ1Y3QgYnRyZnNfZmlkICopIGZoOworCXU2NCBvYmplY3RpZCwgcm9vdF9vYmplY3RpZDsKKwl1MzIgZ2VuZXJhdGlvbjsKKworCWlmIChmaF90eXBlID09IEZJTEVJRF9CVFJGU19XSVRIX1BBUkVOVCkgeworCQlpZiAoZmhfbGVuICE9ICBCVFJGU19GSURfU0laRV9DT05ORUNUQUJMRSkKKwkJCXJldHVybiBOVUxMOworCQlyb290X29iamVjdGlkID0gZmlkLT5yb290X29iamVjdGlkOworCX0gZWxzZSBpZiAoZmhfdHlwZSA9PSBGSUxFSURfQlRSRlNfV0lUSF9QQVJFTlRfUk9PVCkgeworCQlpZiAoZmhfbGVuICE9IEJUUkZTX0ZJRF9TSVpFX0NPTk5FQ1RBQkxFX1JPT1QpCisJCQlyZXR1cm4gTlVMTDsKKwkJcm9vdF9vYmplY3RpZCA9IGZpZC0+cGFyZW50X3Jvb3Rfb2JqZWN0aWQ7CisJfSBlbHNlCisJCXJldHVybiBOVUxMOworCisJb2JqZWN0aWQgPSBmaWQtPnBhcmVudF9vYmplY3RpZDsKKwlnZW5lcmF0aW9uID0gZmlkLT5wYXJlbnRfZ2VuOworCisJcmV0dXJuIGJ0cmZzX2dldF9kZW50cnkoc2IsIG9iamVjdGlkLCByb290X29iamVjdGlkLCBnZW5lcmF0aW9uKTsKK30KKworc3RhdGljIHN0cnVjdCBkZW50cnkgKmJ0cmZzX2ZoX3RvX2RlbnRyeShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3QgZmlkICpmaCwKKwkJCQkJIGludCBmaF9sZW4sIGludCBmaF90eXBlKQoreworCXN0cnVjdCBidHJmc19maWQgKmZpZCA9IChzdHJ1Y3QgYnRyZnNfZmlkICopIGZoOworCXU2NCBvYmplY3RpZCwgcm9vdF9vYmplY3RpZDsKKwl1MzIgZ2VuZXJhdGlvbjsKKworCWlmICgoZmhfdHlwZSAhPSBGSUxFSURfQlRSRlNfV0lUSF9QQVJFTlQgfHwKKwkgICAgIGZoX2xlbiAhPSBCVFJGU19GSURfU0laRV9DT05ORUNUQUJMRSkgJiYKKwkgICAgKGZoX3R5cGUgIT0gRklMRUlEX0JUUkZTX1dJVEhfUEFSRU5UX1JPT1QgfHwKKwkgICAgIGZoX2xlbiAhPSBCVFJGU19GSURfU0laRV9DT05ORUNUQUJMRV9ST09UKSAmJgorCSAgICAoZmhfdHlwZSAhPSBGSUxFSURfQlRSRlNfV0lUSE9VVF9QQVJFTlQgfHwKKwkgICAgIGZoX2xlbiAhPSBCVFJGU19GSURfU0laRV9OT05fQ09OTkVDVEFCTEUpKQorCQlyZXR1cm4gTlVMTDsKKworCW9iamVjdGlkID0gZmlkLT5vYmplY3RpZDsKKwlyb290X29iamVjdGlkID0gZmlkLT5yb290X29iamVjdGlkOworCWdlbmVyYXRpb24gPSBmaWQtPmdlbjsKKworCXJldHVybiBidHJmc19nZXRfZGVudHJ5KHNiLCBvYmplY3RpZCwgcm9vdF9vYmplY3RpZCwgZ2VuZXJhdGlvbik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpidHJmc19nZXRfcGFyZW50KHN0cnVjdCBkZW50cnkgKmNoaWxkKQoreworCXN0cnVjdCBpbm9kZSAqZGlyID0gY2hpbGQtPmRfaW5vZGU7CisJc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QgPSBCVFJGU19JKGRpciktPnJvb3Q7CisJc3RydWN0IGJ0cmZzX2tleSBrZXk7CisJc3RydWN0IGJ0cmZzX3BhdGggKnBhdGg7CisJc3RydWN0IGV4dGVudF9idWZmZXIgKmxlYWY7CisJaW50IHNsb3Q7CisJdTY0IG9iamVjdGlkOworCWludCByZXQ7CisKKwlwYXRoID0gYnRyZnNfYWxsb2NfcGF0aCgpOworCisJa2V5Lm9iamVjdGlkID0gZGlyLT5pX2lubzsKKwlidHJmc19zZXRfa2V5X3R5cGUoJmtleSwgQlRSRlNfSU5PREVfUkVGX0tFWSk7CisJa2V5Lm9mZnNldCA9ICh1NjQpLTE7CisKKwlyZXQgPSBidHJmc19zZWFyY2hfc2xvdChOVUxMLCByb290LCAma2V5LCBwYXRoLCAwLCAwKTsKKwlpZiAocmV0IDwgMCkgeworCQkvKiBFcnJvciAqLworCQlidHJmc19mcmVlX3BhdGgocGF0aCk7CisJCXJldHVybiBFUlJfUFRSKHJldCk7CisJfQorCWxlYWYgPSBwYXRoLT5ub2Rlc1swXTsKKwlzbG90ID0gcGF0aC0+c2xvdHNbMF07CisJaWYgKHJldCkgeworCQkvKiBidHJmc19zZWFyY2hfc2xvdCgpIHJldHVybnMgdGhlIHNsb3Qgd2hlcmUgd2UnZCB3YW50IHRvCisJCSAgIGluc2VydCBhIGJhY2tyZWYgZm9yIHBhcmVudCBpbm9kZSAjMHhGRkZGRkZGRkZGRkZGRkZGLgorCQkgICBUaGUgX3JlYWxfIGJhY2tyZWYsIHRlbGxpbmcgdXMgd2hhdCB0aGUgcGFyZW50IGlub2RlCisJCSAgIF9hY3R1YWxseV8gaXMsIHdpbGwgYmUgaW4gdGhlIHNsb3QgX2JlZm9yZV8gdGhlIG9uZQorCQkgICB0aGF0IGJ0cmZzX3NlYXJjaF9zbG90KCkgcmV0dXJucy4gKi8KKwkJaWYgKCFzbG90KSB7CisJCQkvKiBVbmxlc3MgdGhlcmUgaXMgX25vXyBrZXkgaW4gdGhlIHRyZWUgYmVmb3JlLi4uICovCisJCQlidHJmc19mcmVlX3BhdGgocGF0aCk7CisJCQlyZXR1cm4gRVJSX1BUUigtRUlPKTsKKwkJfQorCQlzbG90LS07CisJfQorCisJYnRyZnNfaXRlbV9rZXlfdG9fY3B1KGxlYWYsICZrZXksIHNsb3QpOworCWJ0cmZzX2ZyZWVfcGF0aChwYXRoKTsKKworCWlmIChrZXkub2JqZWN0aWQgIT0gZGlyLT5pX2lubyB8fCBrZXkudHlwZSAhPSBCVFJGU19JTk9ERV9SRUZfS0VZKQorCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKKworCW9iamVjdGlkID0ga2V5Lm9mZnNldDsKKworCS8qIElmIHdlIGFyZSBhbHJlYWR5IGF0IHRoZSByb290IG9mIGEgc3Vidm9sLCByZXR1cm4gdGhlIHJlYWwgcm9vdCAqLworCWlmIChvYmplY3RpZCA9PSBkaXItPmlfaW5vKQorCQlyZXR1cm4gZGdldChkaXItPmlfc2ItPnNfcm9vdCk7CisKKwkvKiBCdWlsZCBhIG5ldyBrZXkgZm9yIHRoZSBpbm9kZSBpdGVtICovCisJa2V5Lm9iamVjdGlkID0gb2JqZWN0aWQ7CisJYnRyZnNfc2V0X2tleV90eXBlKCZrZXksIEJUUkZTX0lOT0RFX0lURU1fS0VZKTsKKwlrZXkub2Zmc2V0ID0gMDsKKworCXJldHVybiBkX29idGFpbl9hbGlhcyhidHJmc19pZ2V0KHJvb3QtPmZzX2luZm8tPnNiLCAma2V5LCByb290LCBOVUxMKSk7Cit9CisKK2NvbnN0IHN0cnVjdCBleHBvcnRfb3BlcmF0aW9ucyBidHJmc19leHBvcnRfb3BzID0geworCS5lbmNvZGVfZmgJPSBidHJmc19lbmNvZGVfZmgsCisJLmZoX3RvX2RlbnRyeQk9IGJ0cmZzX2ZoX3RvX2RlbnRyeSwKKwkuZmhfdG9fcGFyZW50CT0gYnRyZnNfZmhfdG9fcGFyZW50LAorCS5nZXRfcGFyZW50CT0gYnRyZnNfZ2V0X3BhcmVudCwKK307CmRpZmYgLS1naXQgYS9mcy9idHJmcy9leHBvcnQuaCBiL2ZzL2J0cmZzL2V4cG9ydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3NDM0OGEKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9idHJmcy9leHBvcnQuaApAQCAtMCwwICsxLDE5IEBACisjaWZuZGVmIEJUUkZTX0VYUE9SVF9ICisjZGVmaW5lIEJUUkZTX0VYUE9SVF9ICisKKyNpbmNsdWRlIDxsaW51eC9leHBvcnRmcy5oPgorCitleHRlcm4gY29uc3Qgc3RydWN0IGV4cG9ydF9vcGVyYXRpb25zIGJ0cmZzX2V4cG9ydF9vcHM7CisKK3N0cnVjdCBidHJmc19maWQgeworCXU2NCBvYmplY3RpZDsKKwl1NjQgcm9vdF9vYmplY3RpZDsKKwl1MzIgZ2VuOworCisJdTY0IHBhcmVudF9vYmplY3RpZDsKKwl1MzIgcGFyZW50X2dlbjsKKworCXU2NCBwYXJlbnRfcm9vdF9vYmplY3RpZDsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2ZzL2J0cmZzL2V4dGVudC10cmVlLmMgYi9mcy9idHJmcy9leHRlbnQtdHJlZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5M2RhNjUKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9idHJmcy9leHRlbnQtdHJlZS5jCkBAIC0wLDAgKzEsNTk4NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBPcmFjbGUuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSB2MiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorICogQm9zdG9uLCBNQSAwMjExMTAtMTMwNywgVVNBLgorICovCisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisjaW5jbHVkZSA8bGludXgvd3JpdGViYWNrLmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgImNvbXBhdC5oIgorI2luY2x1ZGUgImhhc2guaCIKKyNpbmNsdWRlICJjcmMzMmMuaCIKKyNpbmNsdWRlICJjdHJlZS5oIgorI2luY2x1ZGUgImRpc2staW8uaCIKKyNpbmNsdWRlICJwcmludC10cmVlLmgiCisjaW5jbHVkZSAidHJhbnNhY3Rpb24uaCIKKyNpbmNsdWRlICJ2b2x1bWVzLmgiCisjaW5jbHVkZSAibG9ja2luZy5oIgorI2luY2x1ZGUgInJlZi1jYWNoZS5oIgorI2luY2x1ZGUgImNvbXBhdC5oIgorCisjZGVmaW5lIFBFTkRJTkdfRVhURU5UX0lOU0VSVCAwCisjZGVmaW5lIFBFTkRJTkdfRVhURU5UX0RFTEVURSAxCisjZGVmaW5lIFBFTkRJTkdfQkFDS1JFRl9VUERBVEUgMgorCitzdHJ1Y3QgcGVuZGluZ19leHRlbnRfb3AgeworCWludCB0eXBlOworCXU2NCBieXRlbnI7CisJdTY0IG51bV9ieXRlczsKKwl1NjQgcGFyZW50OworCXU2NCBvcmlnX3BhcmVudDsKKwl1NjQgZ2VuZXJhdGlvbjsKKwl1NjQgb3JpZ19nZW5lcmF0aW9uOworCWludCBsZXZlbDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJaW50IGRlbDsKK307CisKK3N0YXRpYyBpbnQgZmluaXNoX2N1cnJlbnRfaW5zZXJ0KHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAorCQkJCSBzdHJ1Y3QgYnRyZnNfcm9vdCAqZXh0ZW50X3Jvb3QsIGludCBhbGwpOworc3RhdGljIGludCBkZWxfcGVuZGluZ19leHRlbnRzKHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAorCQkJICAgICAgIHN0cnVjdCBidHJmc19yb290ICpleHRlbnRfcm9vdCwgaW50IGFsbCk7CitzdGF0aWMgaW50IHBpbl9kb3duX2J5dGVzKHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAorCQkJICBzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwKKwkJCSAgdTY0IGJ5dGVuciwgdTY0IG51bV9ieXRlcywgaW50IGlzX2RhdGEpOworc3RhdGljIGludCB1cGRhdGVfYmxvY2tfZ3JvdXAoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCisJCQkgICAgICBzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwKKwkJCSAgICAgIHU2NCBieXRlbnIsIHU2NCBudW1fYnl0ZXMsIGludCBhbGxvYywKKwkJCSAgICAgIGludCBtYXJrX2ZyZWUpOworCitzdGF0aWMgaW50IGJsb2NrX2dyb3VwX2JpdHMoc3RydWN0IGJ0cmZzX2Jsb2NrX2dyb3VwX2NhY2hlICpjYWNoZSwgdTY0IGJpdHMpCit7CisJcmV0dXJuIChjYWNoZS0+ZmxhZ3MgJiBiaXRzKSA9PSBiaXRzOworfQorCisvKgorICogdGhpcyBhZGRzIHRoZSBibG9jayBncm91cCB0byB0aGUgZnNfaW5mbyByYiB0cmVlIGZvciB0aGUgYmxvY2sgZ3JvdXAKKyAqIGNhY2hlCisgKi8KK3N0YXRpYyBpbnQgYnRyZnNfYWRkX2Jsb2NrX2dyb3VwX2NhY2hlKHN0cnVjdCBidHJmc19mc19pbmZvICppbmZvLAorCQkJCXN0cnVjdCBidHJmc19ibG9ja19ncm91cF9jYWNoZSAqYmxvY2tfZ3JvdXApCit7CisJc3RydWN0IHJiX25vZGUgKipwOworCXN0cnVjdCByYl9ub2RlICpwYXJlbnQgPSBOVUxMOworCXN0cnVjdCBidHJmc19ibG9ja19ncm91cF9jYWNoZSAqY2FjaGU7CisKKwlzcGluX2xvY2soJmluZm8tPmJsb2NrX2dyb3VwX2NhY2hlX2xvY2spOworCXAgPSAmaW5mby0+YmxvY2tfZ3JvdXBfY2FjaGVfdHJlZS5yYl9ub2RlOworCisJd2hpbGUgKCpwKSB7CisJCXBhcmVudCA9ICpwOworCQljYWNoZSA9IHJiX2VudHJ5KHBhcmVudCwgc3RydWN0IGJ0cmZzX2Jsb2NrX2dyb3VwX2NhY2hlLAorCQkJCSBjYWNoZV9ub2RlKTsKKwkJaWYgKGJsb2NrX2dyb3VwLT5rZXkub2JqZWN0aWQgPCBjYWNoZS0+a2V5Lm9iamVjdGlkKSB7CisJCQlwID0gJigqcCktPnJiX2xlZnQ7CisJCX0gZWxzZSBpZiAoYmxvY2tfZ3JvdXAtPmtleS5vYmplY3RpZCA+IGNhY2hlLT5rZXkub2JqZWN0aWQpIHsKKwkJCXAgPSAmKCpwKS0+cmJfcmlnaHQ7CisJCX0gZWxzZSB7CisJCQlzcGluX3VubG9jaygmaW5mby0+YmxvY2tfZ3JvdXBfY2FjaGVfbG9jayk7CisJCQlyZXR1cm4gLUVFWElTVDsKKwkJfQorCX0KKworCXJiX2xpbmtfbm9kZSgmYmxvY2tfZ3JvdXAtPmNhY2hlX25vZGUsIHBhcmVudCwgcCk7CisJcmJfaW5zZXJ0X2NvbG9yKCZibG9ja19ncm91cC0+Y2FjaGVfbm9kZSwKKwkJCSZpbmZvLT5ibG9ja19ncm91cF9jYWNoZV90cmVlKTsKKwlzcGluX3VubG9jaygmaW5mby0+YmxvY2tfZ3JvdXBfY2FjaGVfbG9jayk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFRoaXMgd2lsbCByZXR1cm4gdGhlIGJsb2NrIGdyb3VwIGF0IG9yIGFmdGVyIGJ5dGVuciBpZiBjb250YWlucyBpcyAwLCBlbHNlCisgKiBpdCB3aWxsIHJldHVybiB0aGUgYmxvY2sgZ3JvdXAgdGhhdCBjb250YWlucyB0aGUgYnl0ZW5yCisgKi8KK3N0YXRpYyBzdHJ1Y3QgYnRyZnNfYmxvY2tfZ3JvdXBfY2FjaGUgKgorYmxvY2tfZ3JvdXBfY2FjaGVfdHJlZV9zZWFyY2goc3RydWN0IGJ0cmZzX2ZzX2luZm8gKmluZm8sIHU2NCBieXRlbnIsCisJCQkgICAgICBpbnQgY29udGFpbnMpCit7CisJc3RydWN0IGJ0cmZzX2Jsb2NrX2dyb3VwX2NhY2hlICpjYWNoZSwgKnJldCA9IE5VTEw7CisJc3RydWN0IHJiX25vZGUgKm47CisJdTY0IGVuZCwgc3RhcnQ7CisKKwlzcGluX2xvY2soJmluZm8tPmJsb2NrX2dyb3VwX2NhY2hlX2xvY2spOworCW4gPSBpbmZvLT5ibG9ja19ncm91cF9jYWNoZV90cmVlLnJiX25vZGU7CisKKwl3aGlsZSAobikgeworCQljYWNoZSA9IHJiX2VudHJ5KG4sIHN0cnVjdCBidHJmc19ibG9ja19ncm91cF9jYWNoZSwKKwkJCQkgY2FjaGVfbm9kZSk7CisJCWVuZCA9IGNhY2hlLT5rZXkub2JqZWN0aWQgKyBjYWNoZS0+a2V5Lm9mZnNldCAtIDE7CisJCXN0YXJ0ID0gY2FjaGUtPmtleS5vYmplY3RpZDsKKworCQlpZiAoYnl0ZW5yIDwgc3RhcnQpIHsKKwkJCWlmICghY29udGFpbnMgJiYgKCFyZXQgfHwgc3RhcnQgPCByZXQtPmtleS5vYmplY3RpZCkpCisJCQkJcmV0ID0gY2FjaGU7CisJCQluID0gbi0+cmJfbGVmdDsKKwkJfSBlbHNlIGlmIChieXRlbnIgPiBzdGFydCkgeworCQkJaWYgKGNvbnRhaW5zICYmIGJ5dGVuciA8PSBlbmQpIHsKKwkJCQlyZXQgPSBjYWNoZTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCW4gPSBuLT5yYl9yaWdodDsKKwkJfSBlbHNlIHsKKwkJCXJldCA9IGNhY2hlOworCQkJYnJlYWs7CisJCX0KKwl9CisJaWYgKHJldCkKKwkJYXRvbWljX2luYygmcmV0LT5jb3VudCk7CisJc3Bpbl91bmxvY2soJmluZm8tPmJsb2NrX2dyb3VwX2NhY2hlX2xvY2spOworCisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIHRoaXMgaXMgb25seSBjYWxsZWQgYnkgY2FjaGVfYmxvY2tfZ3JvdXAsIHNpbmNlIHdlIGNvdWxkIGhhdmUgZnJlZWQgZXh0ZW50cworICogd2UgbmVlZCB0byBjaGVjayB0aGUgcGlubmVkX2V4dGVudHMgZm9yIGFueSBleHRlbnRzIHRoYXQgY2FuJ3QgYmUgdXNlZCB5ZXQKKyAqIHNpbmNlIHRoZWlyIGZyZWUgc3BhY2Ugd2lsbCBiZSByZWxlYXNlZCBhcyBzb29uIGFzIHRoZSB0cmFuc2FjdGlvbiBjb21taXRzLgorICovCitzdGF0aWMgaW50IGFkZF9uZXdfZnJlZV9zcGFjZShzdHJ1Y3QgYnRyZnNfYmxvY2tfZ3JvdXBfY2FjaGUgKmJsb2NrX2dyb3VwLAorCQkJICAgICAgc3RydWN0IGJ0cmZzX2ZzX2luZm8gKmluZm8sIHU2NCBzdGFydCwgdTY0IGVuZCkKK3sKKwl1NjQgZXh0ZW50X3N0YXJ0LCBleHRlbnRfZW5kLCBzaXplOworCWludCByZXQ7CisKKwltdXRleF9sb2NrKCZpbmZvLT5waW5uZWRfbXV0ZXgpOworCXdoaWxlIChzdGFydCA8IGVuZCkgeworCQlyZXQgPSBmaW5kX2ZpcnN0X2V4dGVudF9iaXQoJmluZm8tPnBpbm5lZF9leHRlbnRzLCBzdGFydCwKKwkJCQkJICAgICZleHRlbnRfc3RhcnQsICZleHRlbnRfZW5kLAorCQkJCQkgICAgRVhURU5UX0RJUlRZKTsKKwkJaWYgKHJldCkKKwkJCWJyZWFrOworCisJCWlmIChleHRlbnRfc3RhcnQgPT0gc3RhcnQpIHsKKwkJCXN0YXJ0ID0gZXh0ZW50X2VuZCArIDE7CisJCX0gZWxzZSBpZiAoZXh0ZW50X3N0YXJ0ID4gc3RhcnQgJiYgZXh0ZW50X3N0YXJ0IDwgZW5kKSB7CisJCQlzaXplID0gZXh0ZW50X3N0YXJ0IC0gc3RhcnQ7CisJCQlyZXQgPSBidHJmc19hZGRfZnJlZV9zcGFjZShibG9ja19ncm91cCwgc3RhcnQsCisJCQkJCQkgICBzaXplKTsKKwkJCUJVR19PTihyZXQpOworCQkJc3RhcnQgPSBleHRlbnRfZW5kICsgMTsKKwkJfSBlbHNlIHsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKHN0YXJ0IDwgZW5kKSB7CisJCXNpemUgPSBlbmQgLSBzdGFydDsKKwkJcmV0ID0gYnRyZnNfYWRkX2ZyZWVfc3BhY2UoYmxvY2tfZ3JvdXAsIHN0YXJ0LCBzaXplKTsKKwkJQlVHX09OKHJldCk7CisJfQorCW11dGV4X3VubG9jaygmaW5mby0+cGlubmVkX211dGV4KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJlbW92ZV9zYl9mcm9tX2NhY2hlKHN0cnVjdCBidHJmc19yb290ICpyb290LAorCQkJCXN0cnVjdCBidHJmc19ibG9ja19ncm91cF9jYWNoZSAqY2FjaGUpCit7CisJdTY0IGJ5dGVucjsKKwl1NjQgKmxvZ2ljYWw7CisJaW50IHN0cmlwZV9sZW47CisJaW50IGksIG5yLCByZXQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgQlRSRlNfU1VQRVJfTUlSUk9SX01BWDsgaSsrKSB7CisJCWJ5dGVuciA9IGJ0cmZzX3NiX29mZnNldChpKTsKKwkJcmV0ID0gYnRyZnNfcm1hcF9ibG9jaygmcm9vdC0+ZnNfaW5mby0+bWFwcGluZ190cmVlLAorCQkJCSAgICAgICBjYWNoZS0+a2V5Lm9iamVjdGlkLCBieXRlbnIsIDAsCisJCQkJICAgICAgICZsb2dpY2FsLCAmbnIsICZzdHJpcGVfbGVuKTsKKwkJQlVHX09OKHJldCk7CisJCXdoaWxlIChuci0tKSB7CisJCQlidHJmc19yZW1vdmVfZnJlZV9zcGFjZShjYWNoZSwgbG9naWNhbFtucl0sCisJCQkJCQlzdHJpcGVfbGVuKTsKKwkJfQorCQlrZnJlZShsb2dpY2FsKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY2FjaGVfYmxvY2tfZ3JvdXAoc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsCisJCQkgICAgIHN0cnVjdCBidHJmc19ibG9ja19ncm91cF9jYWNoZSAqYmxvY2tfZ3JvdXApCit7CisJc3RydWN0IGJ0cmZzX3BhdGggKnBhdGg7CisJaW50IHJldCA9IDA7CisJc3RydWN0IGJ0cmZzX2tleSBrZXk7CisJc3RydWN0IGV4dGVudF9idWZmZXIgKmxlYWY7CisJaW50IHNsb3Q7CisJdTY0IGxhc3Q7CisKKwlpZiAoIWJsb2NrX2dyb3VwKQorCQlyZXR1cm4gMDsKKworCXJvb3QgPSByb290LT5mc19pbmZvLT5leHRlbnRfcm9vdDsKKworCWlmIChibG9ja19ncm91cC0+Y2FjaGVkKQorCQlyZXR1cm4gMDsKKworCXBhdGggPSBidHJmc19hbGxvY19wYXRoKCk7CisJaWYgKCFwYXRoKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXBhdGgtPnJlYWRhID0gMjsKKwkvKgorCSAqIHdlIGdldCBpbnRvIGRlYWRsb2NrcyB3aXRoIHBhdGhzIGhlbGQgYnkgY2FsbGVycyBvZiB0aGlzIGZ1bmN0aW9uLgorCSAqIHNpbmNlIHRoZSBhbGxvY19tdXRleCBpcyBwcm90ZWN0aW5nIHRoaW5ncyByaWdodCBub3csIGp1c3QKKwkgKiBza2lwIHRoZSBsb2NraW5nIGhlcmUKKwkgKi8KKwlwYXRoLT5za2lwX2xvY2tpbmcgPSAxOworCWxhc3QgPSBtYXhfdCh1NjQsIGJsb2NrX2dyb3VwLT5rZXkub2JqZWN0aWQsIEJUUkZTX1NVUEVSX0lORk9fT0ZGU0VUKTsKKwlrZXkub2JqZWN0aWQgPSBsYXN0OworCWtleS5vZmZzZXQgPSAwOworCWJ0cmZzX3NldF9rZXlfdHlwZSgma2V5LCBCVFJGU19FWFRFTlRfSVRFTV9LRVkpOworCXJldCA9IGJ0cmZzX3NlYXJjaF9zbG90KE5VTEwsIHJvb3QsICZrZXksIHBhdGgsIDAsIDApOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycjsKKworCXdoaWxlICgxKSB7CisJCWxlYWYgPSBwYXRoLT5ub2Rlc1swXTsKKwkJc2xvdCA9IHBhdGgtPnNsb3RzWzBdOworCQlpZiAoc2xvdCA+PSBidHJmc19oZWFkZXJfbnJpdGVtcyhsZWFmKSkgeworCQkJcmV0ID0gYnRyZnNfbmV4dF9sZWFmKHJvb3QsIHBhdGgpOworCQkJaWYgKHJldCA8IDApCisJCQkJZ290byBlcnI7CisJCQlpZiAocmV0ID09IDApCisJCQkJY29udGludWU7CisJCQllbHNlCisJCQkJYnJlYWs7CisJCX0KKwkJYnRyZnNfaXRlbV9rZXlfdG9fY3B1KGxlYWYsICZrZXksIHNsb3QpOworCQlpZiAoa2V5Lm9iamVjdGlkIDwgYmxvY2tfZ3JvdXAtPmtleS5vYmplY3RpZCkKKwkJCWdvdG8gbmV4dDsKKworCQlpZiAoa2V5Lm9iamVjdGlkID49IGJsb2NrX2dyb3VwLT5rZXkub2JqZWN0aWQgKworCQkgICAgYmxvY2tfZ3JvdXAtPmtleS5vZmZzZXQpCisJCQlicmVhazsKKworCQlpZiAoYnRyZnNfa2V5X3R5cGUoJmtleSkgPT0gQlRSRlNfRVhURU5UX0lURU1fS0VZKSB7CisJCQlhZGRfbmV3X2ZyZWVfc3BhY2UoYmxvY2tfZ3JvdXAsIHJvb3QtPmZzX2luZm8sIGxhc3QsCisJCQkJCSAgIGtleS5vYmplY3RpZCk7CisKKwkJCWxhc3QgPSBrZXkub2JqZWN0aWQgKyBrZXkub2Zmc2V0OworCQl9CituZXh0OgorCQlwYXRoLT5zbG90c1swXSsrOworCX0KKworCWFkZF9uZXdfZnJlZV9zcGFjZShibG9ja19ncm91cCwgcm9vdC0+ZnNfaW5mbywgbGFzdCwKKwkJCSAgIGJsb2NrX2dyb3VwLT5rZXkub2JqZWN0aWQgKworCQkJICAgYmxvY2tfZ3JvdXAtPmtleS5vZmZzZXQpOworCisJcmVtb3ZlX3NiX2Zyb21fY2FjaGUocm9vdCwgYmxvY2tfZ3JvdXApOworCWJsb2NrX2dyb3VwLT5jYWNoZWQgPSAxOworCXJldCA9IDA7CitlcnI6CisJYnRyZnNfZnJlZV9wYXRoKHBhdGgpOworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiByZXR1cm4gdGhlIGJsb2NrIGdyb3VwIHRoYXQgc3RhcnRzIGF0IG9yIGFmdGVyIGJ5dGVucgorICovCitzdGF0aWMgc3RydWN0IGJ0cmZzX2Jsb2NrX2dyb3VwX2NhY2hlICoKK2J0cmZzX2xvb2t1cF9maXJzdF9ibG9ja19ncm91cChzdHJ1Y3QgYnRyZnNfZnNfaW5mbyAqaW5mbywgdTY0IGJ5dGVucikKK3sKKwlzdHJ1Y3QgYnRyZnNfYmxvY2tfZ3JvdXBfY2FjaGUgKmNhY2hlOworCisJY2FjaGUgPSBibG9ja19ncm91cF9jYWNoZV90cmVlX3NlYXJjaChpbmZvLCBieXRlbnIsIDApOworCisJcmV0dXJuIGNhY2hlOworfQorCisvKgorICogcmV0dXJuIHRoZSBibG9jayBncm91cCB0aGF0IGNvbnRhaW5zIHRlaCBnaXZlbiBieXRlbnIKKyAqLworc3RydWN0IGJ0cmZzX2Jsb2NrX2dyb3VwX2NhY2hlICpidHJmc19sb29rdXBfYmxvY2tfZ3JvdXAoCisJCQkJCQkgc3RydWN0IGJ0cmZzX2ZzX2luZm8gKmluZm8sCisJCQkJCQkgdTY0IGJ5dGVucikKK3sKKwlzdHJ1Y3QgYnRyZnNfYmxvY2tfZ3JvdXBfY2FjaGUgKmNhY2hlOworCisJY2FjaGUgPSBibG9ja19ncm91cF9jYWNoZV90cmVlX3NlYXJjaChpbmZvLCBieXRlbnIsIDEpOworCisJcmV0dXJuIGNhY2hlOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcHV0X2Jsb2NrX2dyb3VwKHN0cnVjdCBidHJmc19ibG9ja19ncm91cF9jYWNoZSAqY2FjaGUpCit7CisJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJmNhY2hlLT5jb3VudCkpCisJCWtmcmVlKGNhY2hlKTsKK30KKworc3RhdGljIHN0cnVjdCBidHJmc19zcGFjZV9pbmZvICpfX2ZpbmRfc3BhY2VfaW5mbyhzdHJ1Y3QgYnRyZnNfZnNfaW5mbyAqaW5mbywKKwkJCQkJCSAgdTY0IGZsYWdzKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKmhlYWQgPSAmaW5mby0+c3BhY2VfaW5mbzsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpjdXI7CisJc3RydWN0IGJ0cmZzX3NwYWNlX2luZm8gKmZvdW5kOworCWxpc3RfZm9yX2VhY2goY3VyLCBoZWFkKSB7CisJCWZvdW5kID0gbGlzdF9lbnRyeShjdXIsIHN0cnVjdCBidHJmc19zcGFjZV9pbmZvLCBsaXN0KTsKKwkJaWYgKGZvdW5kLT5mbGFncyA9PSBmbGFncykKKwkJCXJldHVybiBmb3VuZDsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB1NjQgZGl2X2ZhY3Rvcih1NjQgbnVtLCBpbnQgZmFjdG9yKQoreworCWlmIChmYWN0b3IgPT0gMTApCisJCXJldHVybiBudW07CisJbnVtICo9IGZhY3RvcjsKKwlkb19kaXYobnVtLCAxMCk7CisJcmV0dXJuIG51bTsKK30KKwordTY0IGJ0cmZzX2ZpbmRfYmxvY2tfZ3JvdXAoc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsCisJCQkgICB1NjQgc2VhcmNoX3N0YXJ0LCB1NjQgc2VhcmNoX2hpbnQsIGludCBvd25lcikKK3sKKwlzdHJ1Y3QgYnRyZnNfYmxvY2tfZ3JvdXBfY2FjaGUgKmNhY2hlOworCXU2NCB1c2VkOworCXU2NCBsYXN0ID0gbWF4KHNlYXJjaF9oaW50LCBzZWFyY2hfc3RhcnQpOworCXU2NCBncm91cF9zdGFydCA9IDA7CisJaW50IGZ1bGxfc2VhcmNoID0gMDsKKwlpbnQgZmFjdG9yID0gOTsKKwlpbnQgd3JhcHBlZCA9IDA7CithZ2FpbjoKKwl3aGlsZSAoMSkgeworCQljYWNoZSA9IGJ0cmZzX2xvb2t1cF9maXJzdF9ibG9ja19ncm91cChyb290LT5mc19pbmZvLCBsYXN0KTsKKwkJaWYgKCFjYWNoZSkKKwkJCWJyZWFrOworCisJCXNwaW5fbG9jaygmY2FjaGUtPmxvY2spOworCQlsYXN0ID0gY2FjaGUtPmtleS5vYmplY3RpZCArIGNhY2hlLT5rZXkub2Zmc2V0OworCQl1c2VkID0gYnRyZnNfYmxvY2tfZ3JvdXBfdXNlZCgmY2FjaGUtPml0ZW0pOworCisJCWlmICgoZnVsbF9zZWFyY2ggfHwgIWNhY2hlLT5ybykgJiYKKwkJICAgIGJsb2NrX2dyb3VwX2JpdHMoY2FjaGUsIEJUUkZTX0JMT0NLX0dST1VQX01FVEFEQVRBKSkgeworCQkJaWYgKHVzZWQgKyBjYWNoZS0+cGlubmVkICsgY2FjaGUtPnJlc2VydmVkIDwKKwkJCSAgICBkaXZfZmFjdG9yKGNhY2hlLT5rZXkub2Zmc2V0LCBmYWN0b3IpKSB7CisJCQkJZ3JvdXBfc3RhcnQgPSBjYWNoZS0+a2V5Lm9iamVjdGlkOworCQkJCXNwaW5fdW5sb2NrKCZjYWNoZS0+bG9jayk7CisJCQkJcHV0X2Jsb2NrX2dyb3VwKGNhY2hlKTsKKwkJCQlnb3RvIGZvdW5kOworCQkJfQorCQl9CisJCXNwaW5fdW5sb2NrKCZjYWNoZS0+bG9jayk7CisJCXB1dF9ibG9ja19ncm91cChjYWNoZSk7CisJCWNvbmRfcmVzY2hlZCgpOworCX0KKwlpZiAoIXdyYXBwZWQpIHsKKwkJbGFzdCA9IHNlYXJjaF9zdGFydDsKKwkJd3JhcHBlZCA9IDE7CisJCWdvdG8gYWdhaW47CisJfQorCWlmICghZnVsbF9zZWFyY2ggJiYgZmFjdG9yIDwgMTApIHsKKwkJbGFzdCA9IHNlYXJjaF9zdGFydDsKKwkJZnVsbF9zZWFyY2ggPSAxOworCQlmYWN0b3IgPSAxMDsKKwkJZ290byBhZ2FpbjsKKwl9Citmb3VuZDoKKwlyZXR1cm4gZ3JvdXBfc3RhcnQ7Cit9CisKKy8qIHNpbXBsZSBoZWxwZXIgdG8gc2VhcmNoIGZvciBhbiBleGlzdGluZyBleHRlbnQgYXQgYSBnaXZlbiBvZmZzZXQgKi8KK2ludCBidHJmc19sb29rdXBfZXh0ZW50KHN0cnVjdCBidHJmc19yb290ICpyb290LCB1NjQgc3RhcnQsIHU2NCBsZW4pCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgYnRyZnNfa2V5IGtleTsKKwlzdHJ1Y3QgYnRyZnNfcGF0aCAqcGF0aDsKKworCXBhdGggPSBidHJmc19hbGxvY19wYXRoKCk7CisJQlVHX09OKCFwYXRoKTsKKwlrZXkub2JqZWN0aWQgPSBzdGFydDsKKwlrZXkub2Zmc2V0ID0gbGVuOworCWJ0cmZzX3NldF9rZXlfdHlwZSgma2V5LCBCVFJGU19FWFRFTlRfSVRFTV9LRVkpOworCXJldCA9IGJ0cmZzX3NlYXJjaF9zbG90KE5VTEwsIHJvb3QtPmZzX2luZm8tPmV4dGVudF9yb290LCAma2V5LCBwYXRoLAorCQkJCTAsIDApOworCWJ0cmZzX2ZyZWVfcGF0aChwYXRoKTsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogQmFjayByZWZlcmVuY2UgcnVsZXMuICBCYWNrIHJlZnMgaGF2ZSB0aHJlZSBtYWluIGdvYWxzOgorICoKKyAqIDEpIGRpZmZlcmVudGlhdGUgYmV0d2VlbiBhbGwgaG9sZGVycyBvZiByZWZlcmVuY2VzIHRvIGFuIGV4dGVudCBzbyB0aGF0CisgKiAgICB3aGVuIGEgcmVmZXJlbmNlIGlzIGRyb3BwZWQgd2UgY2FuIG1ha2Ugc3VyZSBpdCB3YXMgYSB2YWxpZCByZWZlcmVuY2UKKyAqICAgIGJlZm9yZSBmcmVlaW5nIHRoZSBleHRlbnQuCisgKgorICogMikgUHJvdmlkZSBlbm91Z2ggaW5mb3JtYXRpb24gdG8gcXVpY2tseSBmaW5kIHRoZSBob2xkZXJzIG9mIGFuIGV4dGVudAorICogICAgaWYgd2Ugbm90aWNlIGEgZ2l2ZW4gYmxvY2sgaXMgY29ycnVwdGVkIG9yIGJhZC4KKyAqCisgKiAzKSBNYWtlIGl0IGVhc3kgdG8gbWlncmF0ZSBibG9ja3MgZm9yIEZTIHNocmlua2luZyBvciBzdG9yYWdlIHBvb2wKKyAqICAgIG1haW50ZW5hbmNlLiAgVGhpcyBpcyBhY3R1YWxseSB0aGUgc2FtZSBhcyAjMiwgYnV0IHdpdGggYSBzbGlnaHRseQorICogICAgZGlmZmVyZW50IHVzZSBjYXNlLgorICoKKyAqIEZpbGUgZXh0ZW50cyBjYW4gYmUgcmVmZXJlbmNlZCBieToKKyAqCisgKiAtIG11bHRpcGxlIHNuYXBzaG90cywgc3Vidm9sdW1lcywgb3IgZGlmZmVyZW50IGdlbmVyYXRpb25zIGluIG9uZSBzdWJ2b2wKKyAqIC0gZGlmZmVyZW50IGZpbGVzIGluc2lkZSBhIHNpbmdsZSBzdWJ2b2x1bWUKKyAqIC0gZGlmZmVyZW50IG9mZnNldHMgaW5zaWRlIGEgZmlsZSAoYm9va2VuZCBleHRlbnRzIGluIGZpbGUuYykKKyAqCisgKiBUaGUgZXh0ZW50IHJlZiBzdHJ1Y3R1cmUgaGFzIGZpZWxkcyBmb3I6CisgKgorICogLSBPYmplY3RpZCBvZiB0aGUgc3Vidm9sdW1lIHJvb3QKKyAqIC0gR2VuZXJhdGlvbiBudW1iZXIgb2YgdGhlIHRyZWUgaG9sZGluZyB0aGUgcmVmZXJlbmNlCisgKiAtIG9iamVjdGlkIG9mIHRoZSBmaWxlIGhvbGRpbmcgdGhlIHJlZmVyZW5jZQorICogLSBudW1iZXIgb2YgcmVmZXJlbmNlcyBob2xkaW5nIGJ5IHBhcmVudCBub2RlIChhbHdheSAxIGZvciB0cmVlIGJsb2NrcykKKyAqCisgKiBCdHJlZSBsZWFmIG1heSBob2xkIG11bHRpcGxlIHJlZmVyZW5jZXMgdG8gYSBmaWxlIGV4dGVudC4gSW4gbW9zdCBjYXNlcywKKyAqIHRoZXNlIHJlZmVyZW5jZXMgYXJlIGZyb20gc2FtZSBmaWxlIGFuZCB0aGUgY29ycmVzcG9uZGluZyBvZmZzZXRzIGluc2lkZQorICogdGhlIGZpbGUgYXJlIGNsb3NlIHRvZ2V0aGVyLgorICoKKyAqIFdoZW4gYSBmaWxlIGV4dGVudCBpcyBhbGxvY2F0ZWQgdGhlIGZpZWxkcyBhcmUgZmlsbGVkIGluOgorICogICAgIChyb290X2tleS5vYmplY3RpZCwgdHJhbnMtPnRyYW5zaWQsIGlub2RlIG9iamVjdGlkLCAxKQorICoKKyAqIFdoZW4gYSBsZWFmIGlzIGNvdydkIG5ldyByZWZlcmVuY2VzIGFyZSBhZGRlZCBmb3IgZXZlcnkgZmlsZSBleHRlbnQgZm91bmQKKyAqIGluIHRoZSBsZWFmLiAgSXQgbG9va3Mgc2ltaWxhciB0byB0aGUgY3JlYXRlIGNhc2UsIGJ1dCB0cmFucy0+dHJhbnNpZCB3aWxsCisgKiBiZSBkaWZmZXJlbnQgd2hlbiB0aGUgYmxvY2sgaXMgY293J2QuCisgKgorICogICAgIChyb290X2tleS5vYmplY3RpZCwgdHJhbnMtPnRyYW5zaWQsIGlub2RlIG9iamVjdGlkLAorICogICAgICBudW1iZXIgb2YgcmVmZXJlbmNlcyBpbiB0aGUgbGVhZikKKyAqCisgKiBXaGVuIGEgZmlsZSBleHRlbnQgaXMgcmVtb3ZlZCBlaXRoZXIgZHVyaW5nIHNuYXBzaG90IGRlbGV0aW9uIG9yCisgKiBmaWxlIHRydW5jYXRpb24sIHdlIGZpbmQgdGhlIGNvcnJlc3BvbmRpbmcgYmFjayByZWZlcmVuY2UgYW5kIGNoZWNrCisgKiB0aGUgZm9sbG93aW5nIGZpZWxkczoKKyAqCisgKiAgICAgKGJ0cmZzX2hlYWRlcl9vd25lcihsZWFmKSwgYnRyZnNfaGVhZGVyX2dlbmVyYXRpb24obGVhZiksCisgKiAgICAgIGlub2RlIG9iamVjdGlkKQorICoKKyAqIEJ0cmVlIGV4dGVudHMgY2FuIGJlIHJlZmVyZW5jZWQgYnk6CisgKgorICogLSBEaWZmZXJlbnQgc3Vidm9sdW1lcworICogLSBEaWZmZXJlbnQgZ2VuZXJhdGlvbnMgb2YgdGhlIHNhbWUgc3Vidm9sdW1lCisgKgorICogV2hlbiBhIHRyZWUgYmxvY2sgaXMgY3JlYXRlZCwgYmFjayByZWZlcmVuY2VzIGFyZSBpbnNlcnRlZDoKKyAqCisgKiAocm9vdC0+cm9vdF9rZXkub2JqZWN0aWQsIHRyYW5zLT50cmFuc2lkLCBsZXZlbCwgMSkKKyAqCisgKiBXaGVuIGEgdHJlZSBibG9jayBpcyBjb3cnZCwgbmV3IGJhY2sgcmVmZXJlbmNlcyBhcmUgYWRkZWQgZm9yIGFsbCB0aGUKKyAqIGJsb2NrcyBpdCBwb2ludHMgdG8uIElmIHRoZSB0cmVlIGJsb2NrIGlzbid0IGluIHJlZmVyZW5jZSBjb3VudGVkIHJvb3QsCisgKiB0aGUgb2xkIGJhY2sgcmVmZXJlbmNlcyBhcmUgcmVtb3ZlZC4gVGhlc2UgbmV3IGJhY2sgcmVmZXJlbmNlcyBhcmUgb2YKKyAqIHRoZSBmb3JtICh0cmFucy0+dHJhbnNpZCB3aWxsIGhhdmUgaW5jcmVhc2VkIHNpbmNlIGNyZWF0aW9uKToKKyAqCisgKiAocm9vdC0+cm9vdF9rZXkub2JqZWN0aWQsIHRyYW5zLT50cmFuc2lkLCBsZXZlbCwgMSkKKyAqCisgKiBXaGVuIGEgYmFja3JlZiBpcyBpbiBkZWxldGluZywgdGhlIGZvbGxvd2luZyBmaWVsZHMgYXJlIGNoZWNrZWQ6CisgKgorICogaWYgYmFja3JlZiB3YXMgZm9yIGEgdHJlZSByb290OgorICogICAgIChidHJmc19oZWFkZXJfb3duZXIoaXRzZWxmKSwgYnRyZnNfaGVhZGVyX2dlbmVyYXRpb24oaXRzZWxmKSwgbGV2ZWwpCisgKiBlbHNlCisgKiAgICAgKGJ0cmZzX2hlYWRlcl9vd25lcihwYXJlbnQpLCBidHJmc19oZWFkZXJfZ2VuZXJhdGlvbihwYXJlbnQpLCBsZXZlbCkKKyAqCisgKiBCYWNrIFJlZmVyZW5jZSBLZXkgY29tcG9zaW5nOgorICoKKyAqIFRoZSBrZXkgb2JqZWN0aWQgY29ycmVzcG9uZHMgdG8gdGhlIGZpcnN0IGJ5dGUgaW4gdGhlIGV4dGVudCwgdGhlIGtleQorICogdHlwZSBpcyBzZXQgdG8gQlRSRlNfRVhURU5UX1JFRl9LRVksIGFuZCB0aGUga2V5IG9mZnNldCBpcyB0aGUgZmlyc3QKKyAqIGJ5dGUgb2YgcGFyZW50IGV4dGVudC4gSWYgYSBleHRlbnQgaXMgdHJlZSByb290LCB0aGUga2V5IG9mZnNldCBpcyBzZXQKKyAqIHRvIHRoZSBrZXkgb2JqZWN0aWQuCisgKi8KKworc3RhdGljIG5vaW5saW5lIGludCBsb29rdXBfZXh0ZW50X2JhY2tyZWYoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCisJCQkJCSAgc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsCisJCQkJCSAgc3RydWN0IGJ0cmZzX3BhdGggKnBhdGgsCisJCQkJCSAgdTY0IGJ5dGVuciwgdTY0IHBhcmVudCwKKwkJCQkJICB1NjQgcmVmX3Jvb3QsIHU2NCByZWZfZ2VuZXJhdGlvbiwKKwkJCQkJICB1NjQgb3duZXJfb2JqZWN0aWQsIGludCBkZWwpCit7CisJc3RydWN0IGJ0cmZzX2tleSBrZXk7CisJc3RydWN0IGJ0cmZzX2V4dGVudF9yZWYgKnJlZjsKKwlzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqbGVhZjsKKwl1NjQgcmVmX29iamVjdGlkOworCWludCByZXQ7CisKKwlrZXkub2JqZWN0aWQgPSBieXRlbnI7CisJa2V5LnR5cGUgPSBCVFJGU19FWFRFTlRfUkVGX0tFWTsKKwlrZXkub2Zmc2V0ID0gcGFyZW50OworCisJcmV0ID0gYnRyZnNfc2VhcmNoX3Nsb3QodHJhbnMsIHJvb3QsICZrZXksIHBhdGgsIGRlbCA/IC0xIDogMCwgMSk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0OworCWlmIChyZXQgPiAwKSB7CisJCXJldCA9IC1FTk9FTlQ7CisJCWdvdG8gb3V0OworCX0KKworCWxlYWYgPSBwYXRoLT5ub2Rlc1swXTsKKwlyZWYgPSBidHJmc19pdGVtX3B0cihsZWFmLCBwYXRoLT5zbG90c1swXSwgc3RydWN0IGJ0cmZzX2V4dGVudF9yZWYpOworCXJlZl9vYmplY3RpZCA9IGJ0cmZzX3JlZl9vYmplY3RpZChsZWFmLCByZWYpOworCWlmIChidHJmc19yZWZfcm9vdChsZWFmLCByZWYpICE9IHJlZl9yb290IHx8CisJICAgIGJ0cmZzX3JlZl9nZW5lcmF0aW9uKGxlYWYsIHJlZikgIT0gcmVmX2dlbmVyYXRpb24gfHwKKwkgICAgKHJlZl9vYmplY3RpZCAhPSBvd25lcl9vYmplY3RpZCAmJgorCSAgICAgcmVmX29iamVjdGlkICE9IEJUUkZTX01VTFRJUExFX09CSkVDVElEUykpIHsKKwkJcmV0ID0gLUVJTzsKKwkJV0FSTl9PTigxKTsKKwkJZ290byBvdXQ7CisJfQorCXJldCA9IDA7CitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIHVwZGF0ZXMgYWxsIHRoZSBiYWNrcmVmcyB0aGF0IGFyZSBwZW5kaW5nIG9uIHVwZGF0ZV9saXN0IGZvciB0aGUKKyAqIGV4dGVudF9yb290CisgKi8KK3N0YXRpYyBub2lubGluZSBpbnQgdXBkYXRlX2JhY2tyZWZzKHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAorCQkJCSAgICBzdHJ1Y3QgYnRyZnNfcm9vdCAqZXh0ZW50X3Jvb3QsCisJCQkJICAgIHN0cnVjdCBidHJmc19wYXRoICpwYXRoLAorCQkJCSAgICBzdHJ1Y3QgbGlzdF9oZWFkICp1cGRhdGVfbGlzdCkKK3sKKwlzdHJ1Y3QgYnRyZnNfa2V5IGtleTsKKwlzdHJ1Y3QgYnRyZnNfZXh0ZW50X3JlZiAqcmVmOworCXN0cnVjdCBidHJmc19mc19pbmZvICppbmZvID0gZXh0ZW50X3Jvb3QtPmZzX2luZm87CisJc3RydWN0IHBlbmRpbmdfZXh0ZW50X29wICpvcDsKKwlzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqbGVhZjsKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpjdXIgPSB1cGRhdGVfbGlzdC0+bmV4dDsKKwl1NjQgcmVmX29iamVjdGlkOworCXU2NCByZWZfcm9vdCA9IGV4dGVudF9yb290LT5yb290X2tleS5vYmplY3RpZDsKKworCW9wID0gbGlzdF9lbnRyeShjdXIsIHN0cnVjdCBwZW5kaW5nX2V4dGVudF9vcCwgbGlzdCk7CisKK3NlYXJjaDoKKwlrZXkub2JqZWN0aWQgPSBvcC0+Ynl0ZW5yOworCWtleS50eXBlID0gQlRSRlNfRVhURU5UX1JFRl9LRVk7CisJa2V5Lm9mZnNldCA9IG9wLT5vcmlnX3BhcmVudDsKKworCXJldCA9IGJ0cmZzX3NlYXJjaF9zbG90KHRyYW5zLCBleHRlbnRfcm9vdCwgJmtleSwgcGF0aCwgMCwgMSk7CisJQlVHX09OKHJldCk7CisKKwlsZWFmID0gcGF0aC0+bm9kZXNbMF07CisKK2xvb3A6CisJcmVmID0gYnRyZnNfaXRlbV9wdHIobGVhZiwgcGF0aC0+c2xvdHNbMF0sIHN0cnVjdCBidHJmc19leHRlbnRfcmVmKTsKKworCXJlZl9vYmplY3RpZCA9IGJ0cmZzX3JlZl9vYmplY3RpZChsZWFmLCByZWYpOworCisJaWYgKGJ0cmZzX3JlZl9yb290KGxlYWYsIHJlZikgIT0gcmVmX3Jvb3QgfHwKKwkgICAgYnRyZnNfcmVmX2dlbmVyYXRpb24obGVhZiwgcmVmKSAhPSBvcC0+b3JpZ19nZW5lcmF0aW9uIHx8CisJICAgIChyZWZfb2JqZWN0aWQgIT0gb3AtPmxldmVsICYmCisJICAgICByZWZfb2JqZWN0aWQgIT0gQlRSRlNfTVVMVElQTEVfT0JKRUNUSURTKSkgeworCQlwcmludGsoS0VSTl9FUlIgImJ0cmZzIGNvdWxkbid0IGZpbmQgJWxsdSwgcGFyZW50ICVsbHUsICIKKwkJICAgICAgICJyb290ICVsbHUsIG93bmVyICV1XG4iLAorCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylvcC0+Ynl0ZW5yLAorCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylvcC0+b3JpZ19wYXJlbnQsCisJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKXJlZl9yb290LCBvcC0+bGV2ZWwpOworCQlidHJmc19wcmludF9sZWFmKGV4dGVudF9yb290LCBsZWFmKTsKKwkJQlVHKCk7CisJfQorCisJa2V5Lm9iamVjdGlkID0gb3AtPmJ5dGVucjsKKwlrZXkub2Zmc2V0ID0gb3AtPnBhcmVudDsKKwlrZXkudHlwZSA9IEJUUkZTX0VYVEVOVF9SRUZfS0VZOworCXJldCA9IGJ0cmZzX3NldF9pdGVtX2tleV9zYWZlKHRyYW5zLCBleHRlbnRfcm9vdCwgcGF0aCwgJmtleSk7CisJQlVHX09OKHJldCk7CisJcmVmID0gYnRyZnNfaXRlbV9wdHIobGVhZiwgcGF0aC0+c2xvdHNbMF0sIHN0cnVjdCBidHJmc19leHRlbnRfcmVmKTsKKwlidHJmc19zZXRfcmVmX2dlbmVyYXRpb24obGVhZiwgcmVmLCBvcC0+Z2VuZXJhdGlvbik7CisKKwljdXIgPSBjdXItPm5leHQ7CisKKwlsaXN0X2RlbF9pbml0KCZvcC0+bGlzdCk7CisJdW5sb2NrX2V4dGVudCgmaW5mby0+ZXh0ZW50X2lucywgb3AtPmJ5dGVuciwKKwkJICAgICAgb3AtPmJ5dGVuciArIG9wLT5udW1fYnl0ZXMgLSAxLCBHRlBfTk9GUyk7CisJa2ZyZWUob3ApOworCisJaWYgKGN1ciA9PSB1cGRhdGVfbGlzdCkgeworCQlidHJmc19tYXJrX2J1ZmZlcl9kaXJ0eShwYXRoLT5ub2Rlc1swXSk7CisJCWJ0cmZzX3JlbGVhc2VfcGF0aChleHRlbnRfcm9vdCwgcGF0aCk7CisJCWdvdG8gb3V0OworCX0KKworCW9wID0gbGlzdF9lbnRyeShjdXIsIHN0cnVjdCBwZW5kaW5nX2V4dGVudF9vcCwgbGlzdCk7CisKKwlwYXRoLT5zbG90c1swXSsrOworCXdoaWxlIChwYXRoLT5zbG90c1swXSA8IGJ0cmZzX2hlYWRlcl9ucml0ZW1zKGxlYWYpKSB7CisJCWJ0cmZzX2l0ZW1fa2V5X3RvX2NwdShsZWFmLCAma2V5LCBwYXRoLT5zbG90c1swXSk7CisJCWlmIChrZXkub2JqZWN0aWQgPT0gb3AtPmJ5dGVuciAmJgorCQkgICAga2V5LnR5cGUgPT0gQlRSRlNfRVhURU5UX1JFRl9LRVkpCisJCQlnb3RvIGxvb3A7CisJCXBhdGgtPnNsb3RzWzBdKys7CisJfQorCisJYnRyZnNfbWFya19idWZmZXJfZGlydHkocGF0aC0+bm9kZXNbMF0pOworCWJ0cmZzX3JlbGVhc2VfcGF0aChleHRlbnRfcm9vdCwgcGF0aCk7CisJZ290byBzZWFyY2g7CisKK291dDoKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIG5vaW5saW5lIGludCBpbnNlcnRfZXh0ZW50cyhzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKKwkJCQkgICBzdHJ1Y3QgYnRyZnNfcm9vdCAqZXh0ZW50X3Jvb3QsCisJCQkJICAgc3RydWN0IGJ0cmZzX3BhdGggKnBhdGgsCisJCQkJICAgc3RydWN0IGxpc3RfaGVhZCAqaW5zZXJ0X2xpc3QsIGludCBucikKK3sKKwlzdHJ1Y3QgYnRyZnNfa2V5ICprZXlzOworCXUzMiAqZGF0YV9zaXplOworCXN0cnVjdCBwZW5kaW5nX2V4dGVudF9vcCAqb3A7CisJc3RydWN0IGV4dGVudF9idWZmZXIgKmxlYWY7CisJc3RydWN0IGxpc3RfaGVhZCAqY3VyID0gaW5zZXJ0X2xpc3QtPm5leHQ7CisJc3RydWN0IGJ0cmZzX2ZzX2luZm8gKmluZm8gPSBleHRlbnRfcm9vdC0+ZnNfaW5mbzsKKwl1NjQgcmVmX3Jvb3QgPSBleHRlbnRfcm9vdC0+cm9vdF9rZXkub2JqZWN0aWQ7CisJaW50IGkgPSAwLCBsYXN0ID0gMCwgcmV0OworCWludCB0b3RhbCA9IG5yICogMjsKKworCWlmICghbnIpCisJCXJldHVybiAwOworCisJa2V5cyA9IGt6YWxsb2ModG90YWwgKiBzaXplb2Yoc3RydWN0IGJ0cmZzX2tleSksIEdGUF9OT0ZTKTsKKwlpZiAoIWtleXMpCisJCXJldHVybiAtRU5PTUVNOworCisJZGF0YV9zaXplID0ga3phbGxvYyh0b3RhbCAqIHNpemVvZih1MzIpLCBHRlBfTk9GUyk7CisJaWYgKCFkYXRhX3NpemUpIHsKKwkJa2ZyZWUoa2V5cyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWxpc3RfZm9yX2VhY2hfZW50cnkob3AsIGluc2VydF9saXN0LCBsaXN0KSB7CisJCWtleXNbaV0ub2JqZWN0aWQgPSBvcC0+Ynl0ZW5yOworCQlrZXlzW2ldLm9mZnNldCA9IG9wLT5udW1fYnl0ZXM7CisJCWtleXNbaV0udHlwZSA9IEJUUkZTX0VYVEVOVF9JVEVNX0tFWTsKKwkJZGF0YV9zaXplW2ldID0gc2l6ZW9mKHN0cnVjdCBidHJmc19leHRlbnRfaXRlbSk7CisJCWkrKzsKKworCQlrZXlzW2ldLm9iamVjdGlkID0gb3AtPmJ5dGVucjsKKwkJa2V5c1tpXS5vZmZzZXQgPSBvcC0+cGFyZW50OworCQlrZXlzW2ldLnR5cGUgPSBCVFJGU19FWFRFTlRfUkVGX0tFWTsKKwkJZGF0YV9zaXplW2ldID0gc2l6ZW9mKHN0cnVjdCBidHJmc19leHRlbnRfcmVmKTsKKwkJaSsrOworCX0KKworCW9wID0gbGlzdF9lbnRyeShjdXIsIHN0cnVjdCBwZW5kaW5nX2V4dGVudF9vcCwgbGlzdCk7CisJaSA9IDA7CisJd2hpbGUgKGkgPCB0b3RhbCkgeworCQlpbnQgYzsKKwkJcmV0ID0gYnRyZnNfaW5zZXJ0X3NvbWVfaXRlbXModHJhbnMsIGV4dGVudF9yb290LCBwYXRoLAorCQkJCQkgICAgICBrZXlzK2ksIGRhdGFfc2l6ZStpLCB0b3RhbC1pKTsKKwkJQlVHX09OKHJldCA8IDApOworCisJCWlmIChsYXN0ICYmIHJldCA+IDEpCisJCQlCVUcoKTsKKworCQlsZWFmID0gcGF0aC0+bm9kZXNbMF07CisJCWZvciAoYyA9IDA7IGMgPCByZXQ7IGMrKykgeworCQkJaW50IHJlZl9maXJzdCA9IGtleXNbaV0udHlwZSA9PSBCVFJGU19FWFRFTlRfUkVGX0tFWTsKKworCQkJLyoKKwkJCSAqIGlmIHRoZSBmaXJzdCBpdGVtIHdlIGluc2VydGVkIHdhcyBhIGJhY2tyZWYsIHRoZW4KKwkJCSAqIHRoZSBFWFRFTlRfSVRFTSB3aWxsIGJlIHRoZSBvZGQgYydzLCBlbHNlIGl0IHdpbGwKKwkJCSAqIGJlIHRoZSBldmVuIGMncworCQkJICovCisJCQlpZiAoKHJlZl9maXJzdCAmJiAoYyAlIDIpKSB8fAorCQkJICAgICghcmVmX2ZpcnN0ICYmICEoYyAlIDIpKSkgeworCQkJCXN0cnVjdCBidHJmc19leHRlbnRfaXRlbSAqaXRtOworCisJCQkJaXRtID0gYnRyZnNfaXRlbV9wdHIobGVhZiwgcGF0aC0+c2xvdHNbMF0gKyBjLAorCQkJCQkJICAgICBzdHJ1Y3QgYnRyZnNfZXh0ZW50X2l0ZW0pOworCQkJCWJ0cmZzX3NldF9leHRlbnRfcmVmcyhwYXRoLT5ub2Rlc1swXSwgaXRtLCAxKTsKKwkJCQlvcC0+ZGVsKys7CisJCQl9IGVsc2UgeworCQkJCXN0cnVjdCBidHJmc19leHRlbnRfcmVmICpyZWY7CisKKwkJCQlyZWYgPSBidHJmc19pdGVtX3B0cihsZWFmLCBwYXRoLT5zbG90c1swXSArIGMsCisJCQkJCQkgICAgIHN0cnVjdCBidHJmc19leHRlbnRfcmVmKTsKKwkJCQlidHJmc19zZXRfcmVmX3Jvb3QobGVhZiwgcmVmLCByZWZfcm9vdCk7CisJCQkJYnRyZnNfc2V0X3JlZl9nZW5lcmF0aW9uKGxlYWYsIHJlZiwKKwkJCQkJCQkgb3AtPmdlbmVyYXRpb24pOworCQkJCWJ0cmZzX3NldF9yZWZfb2JqZWN0aWQobGVhZiwgcmVmLCBvcC0+bGV2ZWwpOworCQkJCWJ0cmZzX3NldF9yZWZfbnVtX3JlZnMobGVhZiwgcmVmLCAxKTsKKwkJCQlvcC0+ZGVsKys7CisJCQl9CisKKwkJCS8qCisJCQkgKiB1c2luZyBkZWwgdG8gc2VlIHdoZW4gaXRzIG9rIHRvIGZyZWUgdXAgdGhlCisJCQkgKiBwZW5kaW5nX2V4dGVudF9vcC4gIEluIHRoZSBjYXNlIHdoZXJlIHdlIGluc2VydCB0aGUKKwkJCSAqIGxhc3QgaXRlbSBvbiB0aGUgbGlzdCBpbiBvcmRlciB0byBoZWxwIGRvIGJhdGNoaW5nCisJCQkgKiB3ZSBuZWVkIHRvIG5vdCBmcmVlIHRoZSBleHRlbnQgb3AgdW50aWwgd2UgYWN0dWFsbHkKKwkJCSAqIGluc2VydCB0aGUgZXh0ZW50X2l0ZW0KKwkJCSAqLworCQkJaWYgKG9wLT5kZWwgPT0gMikgeworCQkJCXVubG9ja19leHRlbnQoJmluZm8tPmV4dGVudF9pbnMsIG9wLT5ieXRlbnIsCisJCQkJCSAgICAgIG9wLT5ieXRlbnIgKyBvcC0+bnVtX2J5dGVzIC0gMSwKKwkJCQkJICAgICAgR0ZQX05PRlMpOworCQkJCWN1ciA9IGN1ci0+bmV4dDsKKwkJCQlsaXN0X2RlbF9pbml0KCZvcC0+bGlzdCk7CisJCQkJa2ZyZWUob3ApOworCQkJCWlmIChjdXIgIT0gaW5zZXJ0X2xpc3QpCisJCQkJCW9wID0gbGlzdF9lbnRyeShjdXIsCisJCQkJCQlzdHJ1Y3QgcGVuZGluZ19leHRlbnRfb3AsCisJCQkJCQlsaXN0KTsKKwkJCX0KKwkJfQorCQlidHJmc19tYXJrX2J1ZmZlcl9kaXJ0eShsZWFmKTsKKwkJYnRyZnNfcmVsZWFzZV9wYXRoKGV4dGVudF9yb290LCBwYXRoKTsKKworCQkvKgorCQkgKiBPayBiYWNrcmVmJ3MgYW5kIGl0ZW1zIHVzdWFsbHkgZ28gcmlnaHQgbmV4dCB0byBlYWNob3RoZXIsCisJCSAqIGJ1dCBpZiB3ZSBjb3VsZCBvbmx5IGluc2VydCAxIGl0ZW0gdGhhdCBtZWFucyB0aGF0IHdlCisJCSAqIGluc2VydGVkIG9uIHRoZSBlbmQgb2YgYSBsZWFmLCBhbmQgd2UgaGF2ZSBubyBpZGVhIHdoYXQgbWF5CisJCSAqIGJlIG9uIHRoZSBuZXh0IGxlYWYgc28gd2UganVzdCBwbGF5IGl0IHNhZmUuICBJbiBvcmRlciB0bworCQkgKiB0cnkgYW5kIGhlbHAgdGhpcyBjYXNlIHdlIGluc2VydCB0aGUgbGFzdCB0aGluZyBvbiBvdXIKKwkJICogaW5zZXJ0IGxpc3Qgc28gaG9wZWZ1bGx5IGl0IHdpbGwgZW5kIHVwIGJlaW5nIHRoZSBsYXN0CisJCSAqIHRoaW5nIG9uIHRoZSBsZWFmIGFuZCBldmVyeXRoaW5nIGVsc2Ugd2lsbCBiZSBiZWZvcmUgaXQsCisJCSAqIHdoaWNoIHdpbGwgbGV0IHVzIGluc2VydCBhIHdob2xlIGJ1bmNoIG9mIGl0ZW1zIGF0IHRoZSBzYW1lCisJCSAqIHRpbWUuCisJCSAqLworCQlpZiAocmV0ID09IDEgJiYgIWxhc3QgJiYgKGkgKyByZXQgPCB0b3RhbCkpIHsKKwkJCS8qCisJCQkgKiBsYXN0OiB3aGVyZSB3ZSB3aWxsIHBpY2sgdXAgdGhlIG5leHQgdGltZSBhcm91bmQKKwkJCSAqIGk6IG91ciBjdXJyZW50IGtleSB0byBpbnNlcnQsIHdpbGwgYmUgdG90YWwgLSAxCisJCQkgKiBjdXI6IHRoZSBjdXJyZW50IG9wIHdlIGFyZSBzY3Jld2luZyB3aXRoCisJCQkgKiBvcDogZHVoCisJCQkgKi8KKwkJCWxhc3QgPSBpICsgcmV0OworCQkJaSA9IHRvdGFsIC0gMTsKKwkJCWN1ciA9IGluc2VydF9saXN0LT5wcmV2OworCQkJb3AgPSBsaXN0X2VudHJ5KGN1ciwgc3RydWN0IHBlbmRpbmdfZXh0ZW50X29wLCBsaXN0KTsKKwkJfSBlbHNlIGlmIChsYXN0KSB7CisJCQkvKgorCQkJICogb2sgd2Ugc3VjY2Vzc2Z1bGx5IGluc2VydGVkIHRoZSBsYXN0IGl0ZW0gb24gdGhlCisJCQkgKiBsaXN0LCBsZXRzIHJlc2V0IGV2ZXJ5dGhpbmcKKwkJCSAqCisJCQkgKiBpOiBvdXIgY3VycmVudCBrZXkgdG8gaW5zZXJ0LCBzbyB3aGVyZSB3ZSBsZWZ0IG9mZgorCQkJICogICAgbGFzdCB0aW1lCisJCQkgKiBsYXN0OiBkb25lIHdpdGggdGhpcworCQkJICogY3VyOiB0aGUgb3Agd2UgYXJlIG1lc3Npbmcgd2l0aAorCQkJICogb3A6IGR1aAorCQkJICogdG90YWw6IHNpbmNlIHdlIGluc2VydGVkIHRoZSBsYXN0IGtleSwgd2UgbmVlZCB0bworCQkJICogICAgICAgIGRlY3JlbWVudCB0b3RhbCBzbyB3ZSBkb250IG92ZXJmbG93CisJCQkgKi8KKwkJCWkgPSBsYXN0OworCQkJbGFzdCA9IDA7CisJCQl0b3RhbC0tOworCQkJaWYgKGkgPCB0b3RhbCkgeworCQkJCWN1ciA9IGluc2VydF9saXN0LT5uZXh0OworCQkJCW9wID0gbGlzdF9lbnRyeShjdXIsIHN0cnVjdCBwZW5kaW5nX2V4dGVudF9vcCwKKwkJCQkJCWxpc3QpOworCQkJfQorCQl9IGVsc2UgeworCQkJaSArPSByZXQ7CisJCX0KKworCQljb25kX3Jlc2NoZWQoKTsKKwl9CisJcmV0ID0gMDsKKwlrZnJlZShrZXlzKTsKKwlrZnJlZShkYXRhX3NpemUpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBub2lubGluZSBpbnQgaW5zZXJ0X2V4dGVudF9iYWNrcmVmKHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAorCQkJCQkgIHN0cnVjdCBidHJmc19yb290ICpyb290LAorCQkJCQkgIHN0cnVjdCBidHJmc19wYXRoICpwYXRoLAorCQkJCQkgIHU2NCBieXRlbnIsIHU2NCBwYXJlbnQsCisJCQkJCSAgdTY0IHJlZl9yb290LCB1NjQgcmVmX2dlbmVyYXRpb24sCisJCQkJCSAgdTY0IG93bmVyX29iamVjdGlkKQoreworCXN0cnVjdCBidHJmc19rZXkga2V5OworCXN0cnVjdCBleHRlbnRfYnVmZmVyICpsZWFmOworCXN0cnVjdCBidHJmc19leHRlbnRfcmVmICpyZWY7CisJdTMyIG51bV9yZWZzOworCWludCByZXQ7CisKKwlrZXkub2JqZWN0aWQgPSBieXRlbnI7CisJa2V5LnR5cGUgPSBCVFJGU19FWFRFTlRfUkVGX0tFWTsKKwlrZXkub2Zmc2V0ID0gcGFyZW50OworCisJcmV0ID0gYnRyZnNfaW5zZXJ0X2VtcHR5X2l0ZW0odHJhbnMsIHJvb3QsIHBhdGgsICZrZXksIHNpemVvZigqcmVmKSk7CisJaWYgKHJldCA9PSAwKSB7CisJCWxlYWYgPSBwYXRoLT5ub2Rlc1swXTsKKwkJcmVmID0gYnRyZnNfaXRlbV9wdHIobGVhZiwgcGF0aC0+c2xvdHNbMF0sCisJCQkJICAgICBzdHJ1Y3QgYnRyZnNfZXh0ZW50X3JlZik7CisJCWJ0cmZzX3NldF9yZWZfcm9vdChsZWFmLCByZWYsIHJlZl9yb290KTsKKwkJYnRyZnNfc2V0X3JlZl9nZW5lcmF0aW9uKGxlYWYsIHJlZiwgcmVmX2dlbmVyYXRpb24pOworCQlidHJmc19zZXRfcmVmX29iamVjdGlkKGxlYWYsIHJlZiwgb3duZXJfb2JqZWN0aWQpOworCQlidHJmc19zZXRfcmVmX251bV9yZWZzKGxlYWYsIHJlZiwgMSk7CisJfSBlbHNlIGlmIChyZXQgPT0gLUVFWElTVCkgeworCQl1NjQgZXhpc3Rpbmdfb3duZXI7CisJCUJVR19PTihvd25lcl9vYmplY3RpZCA8IEJUUkZTX0ZJUlNUX0ZSRUVfT0JKRUNUSUQpOworCQlsZWFmID0gcGF0aC0+bm9kZXNbMF07CisJCXJlZiA9IGJ0cmZzX2l0ZW1fcHRyKGxlYWYsIHBhdGgtPnNsb3RzWzBdLAorCQkJCSAgICAgc3RydWN0IGJ0cmZzX2V4dGVudF9yZWYpOworCQlpZiAoYnRyZnNfcmVmX3Jvb3QobGVhZiwgcmVmKSAhPSByZWZfcm9vdCB8fAorCQkgICAgYnRyZnNfcmVmX2dlbmVyYXRpb24obGVhZiwgcmVmKSAhPSByZWZfZ2VuZXJhdGlvbikgeworCQkJcmV0ID0gLUVJTzsKKwkJCVdBUk5fT04oMSk7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCW51bV9yZWZzID0gYnRyZnNfcmVmX251bV9yZWZzKGxlYWYsIHJlZik7CisJCUJVR19PTihudW1fcmVmcyA9PSAwKTsKKwkJYnRyZnNfc2V0X3JlZl9udW1fcmVmcyhsZWFmLCByZWYsIG51bV9yZWZzICsgMSk7CisKKwkJZXhpc3Rpbmdfb3duZXIgPSBidHJmc19yZWZfb2JqZWN0aWQobGVhZiwgcmVmKTsKKwkJaWYgKGV4aXN0aW5nX293bmVyICE9IG93bmVyX29iamVjdGlkICYmCisJCSAgICBleGlzdGluZ19vd25lciAhPSBCVFJGU19NVUxUSVBMRV9PQkpFQ1RJRFMpIHsKKwkJCWJ0cmZzX3NldF9yZWZfb2JqZWN0aWQobGVhZiwgcmVmLAorCQkJCQlCVFJGU19NVUxUSVBMRV9PQkpFQ1RJRFMpOworCQl9CisJCXJldCA9IDA7CisJfSBlbHNlIHsKKwkJZ290byBvdXQ7CisJfQorCWJ0cmZzX21hcmtfYnVmZmVyX2RpcnR5KHBhdGgtPm5vZGVzWzBdKTsKK291dDoKKwlidHJmc19yZWxlYXNlX3BhdGgocm9vdCwgcGF0aCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIG5vaW5saW5lIGludCByZW1vdmVfZXh0ZW50X2JhY2tyZWYoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCisJCQkJCSAgc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsCisJCQkJCSAgc3RydWN0IGJ0cmZzX3BhdGggKnBhdGgpCit7CisJc3RydWN0IGV4dGVudF9idWZmZXIgKmxlYWY7CisJc3RydWN0IGJ0cmZzX2V4dGVudF9yZWYgKnJlZjsKKwl1MzIgbnVtX3JlZnM7CisJaW50IHJldCA9IDA7CisKKwlsZWFmID0gcGF0aC0+bm9kZXNbMF07CisJcmVmID0gYnRyZnNfaXRlbV9wdHIobGVhZiwgcGF0aC0+c2xvdHNbMF0sIHN0cnVjdCBidHJmc19leHRlbnRfcmVmKTsKKwludW1fcmVmcyA9IGJ0cmZzX3JlZl9udW1fcmVmcyhsZWFmLCByZWYpOworCUJVR19PTihudW1fcmVmcyA9PSAwKTsKKwludW1fcmVmcyAtPSAxOworCWlmIChudW1fcmVmcyA9PSAwKSB7CisJCXJldCA9IGJ0cmZzX2RlbF9pdGVtKHRyYW5zLCByb290LCBwYXRoKTsKKwl9IGVsc2UgeworCQlidHJmc19zZXRfcmVmX251bV9yZWZzKGxlYWYsIHJlZiwgbnVtX3JlZnMpOworCQlidHJmc19tYXJrX2J1ZmZlcl9kaXJ0eShsZWFmKTsKKwl9CisJYnRyZnNfcmVsZWFzZV9wYXRoKHJvb3QsIHBhdGgpOworCXJldHVybiByZXQ7Cit9CisKKyNpZmRlZiBCSU9fUldfRElTQ0FSRAorc3RhdGljIHZvaWQgYnRyZnNfaXNzdWVfZGlzY2FyZChzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LAorCQkJCXU2NCBzdGFydCwgdTY0IGxlbikKK3sKKwlibGtkZXZfaXNzdWVfZGlzY2FyZChiZGV2LCBzdGFydCA+PiA5LCBsZW4gPj4gOSwgR0ZQX0tFUk5FTCk7Cit9CisjZW5kaWYKKworc3RhdGljIGludCBidHJmc19kaXNjYXJkX2V4dGVudChzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwgdTY0IGJ5dGVuciwKKwkJCQl1NjQgbnVtX2J5dGVzKQoreworI2lmZGVmIEJJT19SV19ESVNDQVJECisJaW50IHJldDsKKwl1NjQgbWFwX2xlbmd0aCA9IG51bV9ieXRlczsKKwlzdHJ1Y3QgYnRyZnNfbXVsdGlfYmlvICptdWx0aSA9IE5VTEw7CisKKwkvKiBUZWxsIHRoZSBibG9jayBkZXZpY2UocykgdGhhdCB0aGUgc2VjdG9ycyBjYW4gYmUgZGlzY2FyZGVkICovCisJcmV0ID0gYnRyZnNfbWFwX2Jsb2NrKCZyb290LT5mc19pbmZvLT5tYXBwaW5nX3RyZWUsIFJFQUQsCisJCQkgICAgICBieXRlbnIsICZtYXBfbGVuZ3RoLCAmbXVsdGksIDApOworCWlmICghcmV0KSB7CisJCXN0cnVjdCBidHJmc19iaW9fc3RyaXBlICpzdHJpcGUgPSBtdWx0aS0+c3RyaXBlczsKKwkJaW50IGk7CisKKwkJaWYgKG1hcF9sZW5ndGggPiBudW1fYnl0ZXMpCisJCQltYXBfbGVuZ3RoID0gbnVtX2J5dGVzOworCisJCWZvciAoaSA9IDA7IGkgPCBtdWx0aS0+bnVtX3N0cmlwZXM7IGkrKywgc3RyaXBlKyspIHsKKwkJCWJ0cmZzX2lzc3VlX2Rpc2NhcmQoc3RyaXBlLT5kZXYtPmJkZXYsCisJCQkJCSAgICBzdHJpcGUtPnBoeXNpY2FsLAorCQkJCQkgICAgbWFwX2xlbmd0aCk7CisJCX0KKwkJa2ZyZWUobXVsdGkpOworCX0KKworCXJldHVybiByZXQ7CisjZWxzZQorCXJldHVybiAwOworI2VuZGlmCit9CisKK3N0YXRpYyBub2lubGluZSBpbnQgZnJlZV9leHRlbnRzKHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAorCQkJCSBzdHJ1Y3QgYnRyZnNfcm9vdCAqZXh0ZW50X3Jvb3QsCisJCQkJIHN0cnVjdCBsaXN0X2hlYWQgKmRlbF9saXN0KQoreworCXN0cnVjdCBidHJmc19mc19pbmZvICppbmZvID0gZXh0ZW50X3Jvb3QtPmZzX2luZm87CisJc3RydWN0IGJ0cmZzX3BhdGggKnBhdGg7CisJc3RydWN0IGJ0cmZzX2tleSBrZXksIGZvdW5kX2tleTsKKwlzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqbGVhZjsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpjdXI7CisJc3RydWN0IHBlbmRpbmdfZXh0ZW50X29wICpvcDsKKwlzdHJ1Y3QgYnRyZnNfZXh0ZW50X2l0ZW0gKmVpOworCWludCByZXQsIG51bV90b19kZWwsIGV4dGVudF9zbG90ID0gMCwgZm91bmRfZXh0ZW50ID0gMDsKKwl1MzIgcmVmczsKKwl1NjQgYnl0ZXNfZnJlZWQgPSAwOworCisJcGF0aCA9IGJ0cmZzX2FsbG9jX3BhdGgoKTsKKwlpZiAoIXBhdGgpCisJCXJldHVybiAtRU5PTUVNOworCXBhdGgtPnJlYWRhID0gMTsKKworc2VhcmNoOgorCS8qIHNlYXJjaCBmb3IgdGhlIGJhY2tyZWYgZm9yIHRoZSBjdXJyZW50IHJlZiB3ZSB3YW50IHRvIGRlbGV0ZSAqLworCWN1ciA9IGRlbF9saXN0LT5uZXh0OworCW9wID0gbGlzdF9lbnRyeShjdXIsIHN0cnVjdCBwZW5kaW5nX2V4dGVudF9vcCwgbGlzdCk7CisJcmV0ID0gbG9va3VwX2V4dGVudF9iYWNrcmVmKHRyYW5zLCBleHRlbnRfcm9vdCwgcGF0aCwgb3AtPmJ5dGVuciwKKwkJCQkgICAgb3AtPm9yaWdfcGFyZW50LAorCQkJCSAgICBleHRlbnRfcm9vdC0+cm9vdF9rZXkub2JqZWN0aWQsCisJCQkJICAgIG9wLT5vcmlnX2dlbmVyYXRpb24sIG9wLT5sZXZlbCwgMSk7CisJaWYgKHJldCkgeworCQlwcmludGsoS0VSTl9FUlIgImJ0cmZzIHVuYWJsZSB0byBmaW5kIGJhY2tyZWYgYnl0ZSBuciAlbGx1ICIKKwkJICAgICAgICJyb290ICVsbHUgZ2VuICVsbHUgb3duZXIgJXVcbiIsCisJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKW9wLT5ieXRlbnIsCisJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKWV4dGVudF9yb290LT5yb290X2tleS5vYmplY3RpZCwKKwkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpb3AtPm9yaWdfZ2VuZXJhdGlvbiwgb3AtPmxldmVsKTsKKwkJYnRyZnNfcHJpbnRfbGVhZihleHRlbnRfcm9vdCwgcGF0aC0+bm9kZXNbMF0pOworCQlXQVJOX09OKDEpOworCQlnb3RvIG91dDsKKwl9CisKKwlleHRlbnRfc2xvdCA9IHBhdGgtPnNsb3RzWzBdOworCW51bV90b19kZWwgPSAxOworCWZvdW5kX2V4dGVudCA9IDA7CisKKwkvKgorCSAqIGlmIHdlIGFyZW4ndCB0aGUgZmlyc3QgaXRlbSBvbiB0aGUgbGVhZiB3ZSBjYW4gbW92ZSBiYWNrIG9uZSBhbmQgc2VlCisJICogaWYgb3VyIHJlZiBpcyByaWdodCBuZXh0IHRvIG91ciBleHRlbnQgaXRlbQorCSAqLworCWlmIChsaWtlbHkoZXh0ZW50X3Nsb3QpKSB7CisJCWV4dGVudF9zbG90LS07CisJCWJ0cmZzX2l0ZW1fa2V5X3RvX2NwdShwYXRoLT5ub2Rlc1swXSwgJmZvdW5kX2tleSwKKwkJCQkgICAgICBleHRlbnRfc2xvdCk7CisJCWlmIChmb3VuZF9rZXkub2JqZWN0aWQgPT0gb3AtPmJ5dGVuciAmJgorCQkgICAgZm91bmRfa2V5LnR5cGUgPT0gQlRSRlNfRVhURU5UX0lURU1fS0VZICYmCisJCSAgICBmb3VuZF9rZXkub2Zmc2V0ID09IG9wLT5udW1fYnl0ZXMpIHsKKwkJCW51bV90b19kZWwrKzsKKwkJCWZvdW5kX2V4dGVudCA9IDE7CisJCX0KKwl9CisKKwkvKgorCSAqIGlmIHdlIGRpZG4ndCBmaW5kIHRoZSBleHRlbnQgd2UgbmVlZCB0byBkZWxldGUgdGhlIGJhY2tyZWYgYW5kIHRoZW4KKwkgKiBzZWFyY2ggZm9yIHRoZSBleHRlbnQgaXRlbSBrZXkgc28gd2UgY2FuIHVwZGF0ZSBpdHMgcmVmIGNvdW50CisJICovCisJaWYgKCFmb3VuZF9leHRlbnQpIHsKKwkJa2V5Lm9iamVjdGlkID0gb3AtPmJ5dGVucjsKKwkJa2V5LnR5cGUgPSBCVFJGU19FWFRFTlRfSVRFTV9LRVk7CisJCWtleS5vZmZzZXQgPSBvcC0+bnVtX2J5dGVzOworCisJCXJldCA9IHJlbW92ZV9leHRlbnRfYmFja3JlZih0cmFucywgZXh0ZW50X3Jvb3QsIHBhdGgpOworCQlCVUdfT04ocmV0KTsKKwkJYnRyZnNfcmVsZWFzZV9wYXRoKGV4dGVudF9yb290LCBwYXRoKTsKKwkJcmV0ID0gYnRyZnNfc2VhcmNoX3Nsb3QodHJhbnMsIGV4dGVudF9yb290LCAma2V5LCBwYXRoLCAtMSwgMSk7CisJCUJVR19PTihyZXQpOworCQlleHRlbnRfc2xvdCA9IHBhdGgtPnNsb3RzWzBdOworCX0KKworCS8qIHRoaXMgaXMgd2hlcmUgd2UgdXBkYXRlIHRoZSByZWYgY291bnQgZm9yIHRoZSBleHRlbnQgKi8KKwlsZWFmID0gcGF0aC0+bm9kZXNbMF07CisJZWkgPSBidHJmc19pdGVtX3B0cihsZWFmLCBleHRlbnRfc2xvdCwgc3RydWN0IGJ0cmZzX2V4dGVudF9pdGVtKTsKKwlyZWZzID0gYnRyZnNfZXh0ZW50X3JlZnMobGVhZiwgZWkpOworCUJVR19PTihyZWZzID09IDApOworCXJlZnMtLTsKKwlidHJmc19zZXRfZXh0ZW50X3JlZnMobGVhZiwgZWksIHJlZnMpOworCisJYnRyZnNfbWFya19idWZmZXJfZGlydHkobGVhZik7CisKKwkvKgorCSAqIFRoaXMgZXh0ZW50IG5lZWRzIGRlbGV0aW5nLiAgVGhlIHJlYXNvbiBjdXJfc2xvdCBpcyBleHRlbnRfc2xvdCArCisJICogbnVtX3RvX2RlbCBpcyBiZWNhdXNlIGV4dGVudF9zbG90IHBvaW50cyB0byB0aGUgc2xvdCB3aGVyZSB0aGUgZXh0ZW50CisJICogaXMsIGFuZCBpZiB0aGUgYmFja3JlZiB3YXMgbm90IHJpZ2h0IG5leHQgdG8gdGhlIGV4dGVudCB3ZSB3aWxsIGJlCisJICogZGVsZXRpbmcgYXQgbGVhc3QgMSBpdGVtLCBhbmQgd2lsbCB3YW50IHRvIHN0YXJ0IHNlYXJjaGluZyBhdCB0aGUKKwkgKiBzbG90IGRpcmVjdGx5IG5leHQgdG8gZXh0ZW50X3Nsb3QuICBIb3dldmVyIGlmIHdlIGRpZCBmaW5kIHRoZQorCSAqIGJhY2tyZWYgbmV4dCB0byB0aGUgZXh0ZW50IGl0ZW0gdGhlbSB3ZSB3aWxsIGJlIGRlbGV0aW5nIGF0IGxlYXN0IDIKKwkgKiBpdGVtcyBhbmQgd2lsbCB3YW50IHRvIHN0YXJ0IHNlYXJjaGluZyBkaXJlY3RseSBhZnRlciB0aGUgcmVmIHNsb3QKKwkgKi8KKwlpZiAoIXJlZnMpIHsKKwkJc3RydWN0IGxpc3RfaGVhZCAqcG9zLCAqbiwgKmVuZDsKKwkJaW50IGN1cl9zbG90ID0gZXh0ZW50X3Nsb3QrbnVtX3RvX2RlbDsKKwkJdTY0IHN1cGVyX3VzZWQ7CisJCXU2NCByb290X3VzZWQ7CisKKwkJcGF0aC0+c2xvdHNbMF0gPSBleHRlbnRfc2xvdDsKKwkJYnl0ZXNfZnJlZWQgPSBvcC0+bnVtX2J5dGVzOworCisJCW11dGV4X2xvY2soJmluZm8tPnBpbm5lZF9tdXRleCk7CisJCXJldCA9IHBpbl9kb3duX2J5dGVzKHRyYW5zLCBleHRlbnRfcm9vdCwgb3AtPmJ5dGVuciwKKwkJCQkgICAgIG9wLT5udW1fYnl0ZXMsIG9wLT5sZXZlbCA+PQorCQkJCSAgICAgQlRSRlNfRklSU1RfRlJFRV9PQkpFQ1RJRCk7CisJCW11dGV4X3VubG9jaygmaW5mby0+cGlubmVkX211dGV4KTsKKwkJQlVHX09OKHJldCA8IDApOworCQlvcC0+ZGVsID0gcmV0OworCisJCS8qCisJCSAqIHdlIG5lZWQgdG8gc2VlIGlmIHdlIGNhbiBkZWxldGUgbXVsdGlwbGUgdGhpbmdzIGF0IG9uY2UsIHNvCisJCSAqIHN0YXJ0IGxvb3BpbmcgdGhyb3VnaCB0aGUgbGlzdCBvZiBleHRlbnRzIHdlIGFyZSB3YW50aW5nIHRvCisJCSAqIGRlbGV0ZSBhbmQgc2VlIGlmIHRoZWlyIGV4dGVudC9iYWNrcmVmJ3MgYXJlIHJpZ2h0IG5leHQgdG8KKwkJICogZWFjaG90aGVyIGFuZCB0aGUgZXh0ZW50cyBvbmx5IGhhdmUgMSByZWYKKwkJICovCisJCWZvciAocG9zID0gY3VyLT5uZXh0OyBwb3MgIT0gZGVsX2xpc3Q7IHBvcyA9IHBvcy0+bmV4dCkgeworCQkJc3RydWN0IHBlbmRpbmdfZXh0ZW50X29wICp0bXA7CisKKwkJCXRtcCA9IGxpc3RfZW50cnkocG9zLCBzdHJ1Y3QgcGVuZGluZ19leHRlbnRfb3AsIGxpc3QpOworCisJCQkvKiB3ZSBvbmx5IHdhbnQgdG8gZGVsZXRlIGV4dGVudCtyZWYgYXQgdGhpcyBzdGFnZSAqLworCQkJaWYgKGN1cl9zbG90ID49IGJ0cmZzX2hlYWRlcl9ucml0ZW1zKGxlYWYpIC0gMSkKKwkJCQlicmVhazsKKworCQkJYnRyZnNfaXRlbV9rZXlfdG9fY3B1KGxlYWYsICZmb3VuZF9rZXksIGN1cl9zbG90KTsKKwkJCWlmIChmb3VuZF9rZXkub2JqZWN0aWQgIT0gdG1wLT5ieXRlbnIgfHwKKwkJCSAgICBmb3VuZF9rZXkudHlwZSAhPSBCVFJGU19FWFRFTlRfSVRFTV9LRVkgfHwKKwkJCSAgICBmb3VuZF9rZXkub2Zmc2V0ICE9IHRtcC0+bnVtX2J5dGVzKQorCQkJCWJyZWFrOworCisJCQkvKiBjaGVjayB0byBtYWtlIHN1cmUgdGhpcyBleHRlbnQgb25seSBoYXMgb25lIHJlZiAqLworCQkJZWkgPSBidHJmc19pdGVtX3B0cihsZWFmLCBjdXJfc2xvdCwKKwkJCQkJICAgIHN0cnVjdCBidHJmc19leHRlbnRfaXRlbSk7CisJCQlpZiAoYnRyZnNfZXh0ZW50X3JlZnMobGVhZiwgZWkpICE9IDEpCisJCQkJYnJlYWs7CisKKwkJCWJ0cmZzX2l0ZW1fa2V5X3RvX2NwdShsZWFmLCAmZm91bmRfa2V5LCBjdXJfc2xvdCsxKTsKKwkJCWlmIChmb3VuZF9rZXkub2JqZWN0aWQgIT0gdG1wLT5ieXRlbnIgfHwKKwkJCSAgICBmb3VuZF9rZXkudHlwZSAhPSBCVFJGU19FWFRFTlRfUkVGX0tFWSB8fAorCQkJICAgIGZvdW5kX2tleS5vZmZzZXQgIT0gdG1wLT5vcmlnX3BhcmVudCkKKwkJCQlicmVhazsKKworCQkJLyoKKwkJCSAqIHRoZSByZWYgaXMgcmlnaHQgbmV4dCB0byB0aGUgZXh0ZW50LCB3ZSBjYW4gc2V0IHRoZQorCQkJICogcmVmIGNvdW50IHRvIDAgc2luY2Ugd2Ugd2lsbCBkZWxldGUgdGhlbSBib3RoIG5vdworCQkJICovCisJCQlidHJmc19zZXRfZXh0ZW50X3JlZnMobGVhZiwgZWksIDApOworCisJCQkvKiBwaW4gZG93biB0aGUgYnl0ZXMgZm9yIHRoaXMgZXh0ZW50ICovCisJCQltdXRleF9sb2NrKCZpbmZvLT5waW5uZWRfbXV0ZXgpOworCQkJcmV0ID0gcGluX2Rvd25fYnl0ZXModHJhbnMsIGV4dGVudF9yb290LCB0bXAtPmJ5dGVuciwKKwkJCQkJICAgICB0bXAtPm51bV9ieXRlcywgdG1wLT5sZXZlbCA+PQorCQkJCQkgICAgIEJUUkZTX0ZJUlNUX0ZSRUVfT0JKRUNUSUQpOworCQkJbXV0ZXhfdW5sb2NrKCZpbmZvLT5waW5uZWRfbXV0ZXgpOworCQkJQlVHX09OKHJldCA8IDApOworCisJCQkvKgorCQkJICogdXNlIHRoZSBkZWwgZmllbGQgdG8gdGVsbCBpZiB3ZSBuZWVkIHRvIGdvIGFoZWFkIGFuZAorCQkJICogZnJlZSB1cCB0aGUgZXh0ZW50IHdoZW4gd2UgZGVsZXRlIHRoZSBpdGVtIG9yIG5vdC4KKwkJCSAqLworCQkJdG1wLT5kZWwgPSByZXQ7CisJCQlieXRlc19mcmVlZCArPSB0bXAtPm51bV9ieXRlczsKKworCQkJbnVtX3RvX2RlbCArPSAyOworCQkJY3VyX3Nsb3QgKz0gMjsKKwkJfQorCQllbmQgPSBwb3M7CisKKwkJLyogdXBkYXRlIHRoZSBmcmVlIHNwYWNlIGNvdW50ZXJzICovCisJCXNwaW5fbG9jaygmaW5mby0+ZGVsYWxsb2NfbG9jayk7CisJCXN1cGVyX3VzZWQgPSBidHJmc19zdXBlcl9ieXRlc191c2VkKCZpbmZvLT5zdXBlcl9jb3B5KTsKKwkJYnRyZnNfc2V0X3N1cGVyX2J5dGVzX3VzZWQoJmluZm8tPnN1cGVyX2NvcHksCisJCQkJCSAgIHN1cGVyX3VzZWQgLSBieXRlc19mcmVlZCk7CisKKwkJcm9vdF91c2VkID0gYnRyZnNfcm9vdF91c2VkKCZleHRlbnRfcm9vdC0+cm9vdF9pdGVtKTsKKwkJYnRyZnNfc2V0X3Jvb3RfdXNlZCgmZXh0ZW50X3Jvb3QtPnJvb3RfaXRlbSwKKwkJCQkgICAgcm9vdF91c2VkIC0gYnl0ZXNfZnJlZWQpOworCQlzcGluX3VubG9jaygmaW5mby0+ZGVsYWxsb2NfbG9jayk7CisKKwkJLyogZGVsZXRlIHRoZSBpdGVtcyAqLworCQlyZXQgPSBidHJmc19kZWxfaXRlbXModHJhbnMsIGV4dGVudF9yb290LCBwYXRoLAorCQkJCSAgICAgIHBhdGgtPnNsb3RzWzBdLCBudW1fdG9fZGVsKTsKKwkJQlVHX09OKHJldCk7CisKKwkJLyoKKwkJICogbG9vcCB0aHJvdWdoIHRoZSBleHRlbnRzIHdlIGRlbGV0ZWQgYW5kIGRvIHRoZSBjbGVhbnVwIHdvcmsKKwkJICogb24gdGhlbQorCQkgKi8KKwkJZm9yIChwb3MgPSBjdXIsIG4gPSBwb3MtPm5leHQ7IHBvcyAhPSBlbmQ7CisJCSAgICAgcG9zID0gbiwgbiA9IHBvcy0+bmV4dCkgeworCQkJc3RydWN0IHBlbmRpbmdfZXh0ZW50X29wICp0bXA7CisJCQl0bXAgPSBsaXN0X2VudHJ5KHBvcywgc3RydWN0IHBlbmRpbmdfZXh0ZW50X29wLCBsaXN0KTsKKworCQkJLyoKKwkJCSAqIHJlbWVtYmVyIHRtcC0+ZGVsIHRlbGxzIHVzIHdldGhlciBvciBub3Qgd2UgcGlubmVkCisJCQkgKiBkb3duIHRoZSBleHRlbnQKKwkJCSAqLworCQkJcmV0ID0gdXBkYXRlX2Jsb2NrX2dyb3VwKHRyYW5zLCBleHRlbnRfcm9vdCwKKwkJCQkJCSB0bXAtPmJ5dGVuciwgdG1wLT5udW1fYnl0ZXMsIDAsCisJCQkJCQkgdG1wLT5kZWwpOworCQkJQlVHX09OKHJldCk7CisKKwkJCWxpc3RfZGVsX2luaXQoJnRtcC0+bGlzdCk7CisJCQl1bmxvY2tfZXh0ZW50KCZpbmZvLT5leHRlbnRfaW5zLCB0bXAtPmJ5dGVuciwKKwkJCQkgICAgICB0bXAtPmJ5dGVuciArIHRtcC0+bnVtX2J5dGVzIC0gMSwKKwkJCQkgICAgICBHRlBfTk9GUyk7CisJCQlrZnJlZSh0bXApOworCQl9CisJfSBlbHNlIGlmIChyZWZzICYmIGZvdW5kX2V4dGVudCkgeworCQkvKgorCQkgKiB0aGUgcmVmIGFuZCBleHRlbnQgd2VyZSByaWdodCBuZXh0IHRvIGVhY2hvdGhlciwgYnV0IHRoZQorCQkgKiBleHRlbnQgc3RpbGwgaGFzIGEgcmVmLCBzbyBqdXN0IGZyZWUgdGhlIGJhY2tyZWYgYW5kIGtlZXAKKwkJICogZ29pbmcKKwkJICovCisJCXJldCA9IHJlbW92ZV9leHRlbnRfYmFja3JlZih0cmFucywgZXh0ZW50X3Jvb3QsIHBhdGgpOworCQlCVUdfT04ocmV0KTsKKworCQlsaXN0X2RlbF9pbml0KCZvcC0+bGlzdCk7CisJCXVubG9ja19leHRlbnQoJmluZm8tPmV4dGVudF9pbnMsIG9wLT5ieXRlbnIsCisJCQkgICAgICBvcC0+Ynl0ZW5yICsgb3AtPm51bV9ieXRlcyAtIDEsIEdGUF9OT0ZTKTsKKwkJa2ZyZWUob3ApOworCX0gZWxzZSB7CisJCS8qCisJCSAqIHRoZSBleHRlbnQgaGFzIG11bHRpcGxlIHJlZnMgYW5kIHRoZSBiYWNrcmVmIHdlIHdlcmUgbG9va2luZworCQkgKiBmb3Igd2FzIG5vdCByaWdodCBuZXh0IHRvIGl0LCBzbyBqdXN0IHVubG9jayBhbmQgZ28gbmV4dCwKKwkJICogd2UncmUgZ29vZCB0byBnbworCQkgKi8KKwkJbGlzdF9kZWxfaW5pdCgmb3AtPmxpc3QpOworCQl1bmxvY2tfZXh0ZW50KCZpbmZvLT5leHRlbnRfaW5zLCBvcC0+Ynl0ZW5yLAorCQkJICAgICAgb3AtPmJ5dGVuciArIG9wLT5udW1fYnl0ZXMgLSAxLCBHRlBfTk9GUyk7CisJCWtmcmVlKG9wKTsKKwl9CisKKwlidHJmc19yZWxlYXNlX3BhdGgoZXh0ZW50X3Jvb3QsIHBhdGgpOworCWlmICghbGlzdF9lbXB0eShkZWxfbGlzdCkpCisJCWdvdG8gc2VhcmNoOworCitvdXQ6CisJYnRyZnNfZnJlZV9wYXRoKHBhdGgpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19idHJmc191cGRhdGVfZXh0ZW50X3JlZihzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKKwkJCQkgICAgIHN0cnVjdCBidHJmc19yb290ICpyb290LCB1NjQgYnl0ZW5yLAorCQkJCSAgICAgdTY0IG9yaWdfcGFyZW50LCB1NjQgcGFyZW50LAorCQkJCSAgICAgdTY0IG9yaWdfcm9vdCwgdTY0IHJlZl9yb290LAorCQkJCSAgICAgdTY0IG9yaWdfZ2VuZXJhdGlvbiwgdTY0IHJlZl9nZW5lcmF0aW9uLAorCQkJCSAgICAgdTY0IG93bmVyX29iamVjdGlkKQoreworCWludCByZXQ7CisJc3RydWN0IGJ0cmZzX3Jvb3QgKmV4dGVudF9yb290ID0gcm9vdC0+ZnNfaW5mby0+ZXh0ZW50X3Jvb3Q7CisJc3RydWN0IGJ0cmZzX3BhdGggKnBhdGg7CisKKwlpZiAocm9vdCA9PSByb290LT5mc19pbmZvLT5leHRlbnRfcm9vdCkgeworCQlzdHJ1Y3QgcGVuZGluZ19leHRlbnRfb3AgKmV4dGVudF9vcDsKKwkJdTY0IG51bV9ieXRlczsKKworCQlCVUdfT04ob3duZXJfb2JqZWN0aWQgPj0gQlRSRlNfTUFYX0xFVkVMKTsKKwkJbnVtX2J5dGVzID0gYnRyZnNfbGV2ZWxfc2l6ZShyb290LCAoaW50KW93bmVyX29iamVjdGlkKTsKKwkJbXV0ZXhfbG9jaygmcm9vdC0+ZnNfaW5mby0+ZXh0ZW50X2luc19tdXRleCk7CisJCWlmICh0ZXN0X3JhbmdlX2JpdCgmcm9vdC0+ZnNfaW5mby0+ZXh0ZW50X2lucywgYnl0ZW5yLAorCQkJCWJ5dGVuciArIG51bV9ieXRlcyAtIDEsIEVYVEVOVF9XUklURUJBQ0ssIDApKSB7CisJCQl1NjQgcHJpdjsKKwkJCXJldCA9IGdldF9zdGF0ZV9wcml2YXRlKCZyb290LT5mc19pbmZvLT5leHRlbnRfaW5zLAorCQkJCQkJYnl0ZW5yLCAmcHJpdik7CisJCQlCVUdfT04ocmV0KTsKKwkJCWV4dGVudF9vcCA9IChzdHJ1Y3QgcGVuZGluZ19leHRlbnRfb3AgKikKKwkJCQkJCQkodW5zaWduZWQgbG9uZylwcml2OworCQkJQlVHX09OKGV4dGVudF9vcC0+cGFyZW50ICE9IG9yaWdfcGFyZW50KTsKKwkJCUJVR19PTihleHRlbnRfb3AtPmdlbmVyYXRpb24gIT0gb3JpZ19nZW5lcmF0aW9uKTsKKworCQkJZXh0ZW50X29wLT5wYXJlbnQgPSBwYXJlbnQ7CisJCQlleHRlbnRfb3AtPmdlbmVyYXRpb24gPSByZWZfZ2VuZXJhdGlvbjsKKwkJfSBlbHNlIHsKKwkJCWV4dGVudF9vcCA9IGttYWxsb2Moc2l6ZW9mKCpleHRlbnRfb3ApLCBHRlBfTk9GUyk7CisJCQlCVUdfT04oIWV4dGVudF9vcCk7CisKKwkJCWV4dGVudF9vcC0+dHlwZSA9IFBFTkRJTkdfQkFDS1JFRl9VUERBVEU7CisJCQlleHRlbnRfb3AtPmJ5dGVuciA9IGJ5dGVucjsKKwkJCWV4dGVudF9vcC0+bnVtX2J5dGVzID0gbnVtX2J5dGVzOworCQkJZXh0ZW50X29wLT5wYXJlbnQgPSBwYXJlbnQ7CisJCQlleHRlbnRfb3AtPm9yaWdfcGFyZW50ID0gb3JpZ19wYXJlbnQ7CisJCQlleHRlbnRfb3AtPmdlbmVyYXRpb24gPSByZWZfZ2VuZXJhdGlvbjsKKwkJCWV4dGVudF9vcC0+b3JpZ19nZW5lcmF0aW9uID0gb3JpZ19nZW5lcmF0aW9uOworCQkJZXh0ZW50X29wLT5sZXZlbCA9IChpbnQpb3duZXJfb2JqZWN0aWQ7CisJCQlJTklUX0xJU1RfSEVBRCgmZXh0ZW50X29wLT5saXN0KTsKKwkJCWV4dGVudF9vcC0+ZGVsID0gMDsKKworCQkJc2V0X2V4dGVudF9iaXRzKCZyb290LT5mc19pbmZvLT5leHRlbnRfaW5zLAorCQkJCQlieXRlbnIsIGJ5dGVuciArIG51bV9ieXRlcyAtIDEsCisJCQkJCUVYVEVOVF9XUklURUJBQ0ssIEdGUF9OT0ZTKTsKKwkJCXNldF9zdGF0ZV9wcml2YXRlKCZyb290LT5mc19pbmZvLT5leHRlbnRfaW5zLAorCQkJCQkgIGJ5dGVuciwgKHVuc2lnbmVkIGxvbmcpZXh0ZW50X29wKTsKKwkJfQorCQltdXRleF91bmxvY2soJnJvb3QtPmZzX2luZm8tPmV4dGVudF9pbnNfbXV0ZXgpOworCQlyZXR1cm4gMDsKKwl9CisKKwlwYXRoID0gYnRyZnNfYWxsb2NfcGF0aCgpOworCWlmICghcGF0aCkKKwkJcmV0dXJuIC1FTk9NRU07CisJcmV0ID0gbG9va3VwX2V4dGVudF9iYWNrcmVmKHRyYW5zLCBleHRlbnRfcm9vdCwgcGF0aCwKKwkJCQkgICAgYnl0ZW5yLCBvcmlnX3BhcmVudCwgb3JpZ19yb290LAorCQkJCSAgICBvcmlnX2dlbmVyYXRpb24sIG93bmVyX29iamVjdGlkLCAxKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKwlyZXQgPSByZW1vdmVfZXh0ZW50X2JhY2tyZWYodHJhbnMsIGV4dGVudF9yb290LCBwYXRoKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKwlyZXQgPSBpbnNlcnRfZXh0ZW50X2JhY2tyZWYodHJhbnMsIGV4dGVudF9yb290LCBwYXRoLCBieXRlbnIsCisJCQkJICAgIHBhcmVudCwgcmVmX3Jvb3QsIHJlZl9nZW5lcmF0aW9uLAorCQkJCSAgICBvd25lcl9vYmplY3RpZCk7CisJQlVHX09OKHJldCk7CisJZmluaXNoX2N1cnJlbnRfaW5zZXJ0KHRyYW5zLCBleHRlbnRfcm9vdCwgMCk7CisJZGVsX3BlbmRpbmdfZXh0ZW50cyh0cmFucywgZXh0ZW50X3Jvb3QsIDApOworb3V0OgorCWJ0cmZzX2ZyZWVfcGF0aChwYXRoKTsKKwlyZXR1cm4gcmV0OworfQorCitpbnQgYnRyZnNfdXBkYXRlX2V4dGVudF9yZWYoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCisJCQkgICAgc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsIHU2NCBieXRlbnIsCisJCQkgICAgdTY0IG9yaWdfcGFyZW50LCB1NjQgcGFyZW50LAorCQkJICAgIHU2NCByZWZfcm9vdCwgdTY0IHJlZl9nZW5lcmF0aW9uLAorCQkJICAgIHU2NCBvd25lcl9vYmplY3RpZCkKK3sKKwlpbnQgcmV0OworCWlmIChyZWZfcm9vdCA9PSBCVFJGU19UUkVFX0xPR19PQkpFQ1RJRCAmJgorCSAgICBvd25lcl9vYmplY3RpZCA8IEJUUkZTX0ZJUlNUX0ZSRUVfT0JKRUNUSUQpCisJCXJldHVybiAwOworCXJldCA9IF9fYnRyZnNfdXBkYXRlX2V4dGVudF9yZWYodHJhbnMsIHJvb3QsIGJ5dGVuciwgb3JpZ19wYXJlbnQsCisJCQkJCXBhcmVudCwgcmVmX3Jvb3QsIHJlZl9yb290LAorCQkJCQlyZWZfZ2VuZXJhdGlvbiwgcmVmX2dlbmVyYXRpb24sCisJCQkJCW93bmVyX29iamVjdGlkKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9fYnRyZnNfaW5jX2V4dGVudF9yZWYoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCisJCQkJICBzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwgdTY0IGJ5dGVuciwKKwkJCQkgIHU2NCBvcmlnX3BhcmVudCwgdTY0IHBhcmVudCwKKwkJCQkgIHU2NCBvcmlnX3Jvb3QsIHU2NCByZWZfcm9vdCwKKwkJCQkgIHU2NCBvcmlnX2dlbmVyYXRpb24sIHU2NCByZWZfZ2VuZXJhdGlvbiwKKwkJCQkgIHU2NCBvd25lcl9vYmplY3RpZCkKK3sKKwlzdHJ1Y3QgYnRyZnNfcGF0aCAqcGF0aDsKKwlpbnQgcmV0OworCXN0cnVjdCBidHJmc19rZXkga2V5OworCXN0cnVjdCBleHRlbnRfYnVmZmVyICpsOworCXN0cnVjdCBidHJmc19leHRlbnRfaXRlbSAqaXRlbTsKKwl1MzIgcmVmczsKKworCXBhdGggPSBidHJmc19hbGxvY19wYXRoKCk7CisJaWYgKCFwYXRoKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXBhdGgtPnJlYWRhID0gMTsKKwlrZXkub2JqZWN0aWQgPSBieXRlbnI7CisJa2V5LnR5cGUgPSBCVFJGU19FWFRFTlRfSVRFTV9LRVk7CisJa2V5Lm9mZnNldCA9ICh1NjQpLTE7CisKKwlyZXQgPSBidHJmc19zZWFyY2hfc2xvdCh0cmFucywgcm9vdC0+ZnNfaW5mby0+ZXh0ZW50X3Jvb3QsICZrZXksIHBhdGgsCisJCQkJMCwgMSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisJQlVHX09OKHJldCA9PSAwIHx8IHBhdGgtPnNsb3RzWzBdID09IDApOworCisJcGF0aC0+c2xvdHNbMF0tLTsKKwlsID0gcGF0aC0+bm9kZXNbMF07CisKKwlidHJmc19pdGVtX2tleV90b19jcHUobCwgJmtleSwgcGF0aC0+c2xvdHNbMF0pOworCWlmIChrZXkub2JqZWN0aWQgIT0gYnl0ZW5yKSB7CisJCWJ0cmZzX3ByaW50X2xlYWYocm9vdC0+ZnNfaW5mby0+ZXh0ZW50X3Jvb3QsIHBhdGgtPm5vZGVzWzBdKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJidHJmcyB3YW50ZWQgJWxsdSBmb3VuZCAlbGx1XG4iLAorCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylieXRlbnIsCisJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKWtleS5vYmplY3RpZCk7CisJCUJVRygpOworCX0KKwlCVUdfT04oa2V5LnR5cGUgIT0gQlRSRlNfRVhURU5UX0lURU1fS0VZKTsKKworCWl0ZW0gPSBidHJmc19pdGVtX3B0cihsLCBwYXRoLT5zbG90c1swXSwgc3RydWN0IGJ0cmZzX2V4dGVudF9pdGVtKTsKKwlyZWZzID0gYnRyZnNfZXh0ZW50X3JlZnMobCwgaXRlbSk7CisJYnRyZnNfc2V0X2V4dGVudF9yZWZzKGwsIGl0ZW0sIHJlZnMgKyAxKTsKKwlidHJmc19tYXJrX2J1ZmZlcl9kaXJ0eShwYXRoLT5ub2Rlc1swXSk7CisKKwlidHJmc19yZWxlYXNlX3BhdGgocm9vdC0+ZnNfaW5mby0+ZXh0ZW50X3Jvb3QsIHBhdGgpOworCisJcGF0aC0+cmVhZGEgPSAxOworCXJldCA9IGluc2VydF9leHRlbnRfYmFja3JlZih0cmFucywgcm9vdC0+ZnNfaW5mby0+ZXh0ZW50X3Jvb3QsCisJCQkJICAgIHBhdGgsIGJ5dGVuciwgcGFyZW50LAorCQkJCSAgICByZWZfcm9vdCwgcmVmX2dlbmVyYXRpb24sCisJCQkJICAgIG93bmVyX29iamVjdGlkKTsKKwlCVUdfT04ocmV0KTsKKwlmaW5pc2hfY3VycmVudF9pbnNlcnQodHJhbnMsIHJvb3QtPmZzX2luZm8tPmV4dGVudF9yb290LCAwKTsKKwlkZWxfcGVuZGluZ19leHRlbnRzKHRyYW5zLCByb290LT5mc19pbmZvLT5leHRlbnRfcm9vdCwgMCk7CisKKwlidHJmc19mcmVlX3BhdGgocGF0aCk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBidHJmc19pbmNfZXh0ZW50X3JlZihzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKKwkJCSBzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwKKwkJCSB1NjQgYnl0ZW5yLCB1NjQgbnVtX2J5dGVzLCB1NjQgcGFyZW50LAorCQkJIHU2NCByZWZfcm9vdCwgdTY0IHJlZl9nZW5lcmF0aW9uLAorCQkJIHU2NCBvd25lcl9vYmplY3RpZCkKK3sKKwlpbnQgcmV0OworCWlmIChyZWZfcm9vdCA9PSBCVFJGU19UUkVFX0xPR19PQkpFQ1RJRCAmJgorCSAgICBvd25lcl9vYmplY3RpZCA8IEJUUkZTX0ZJUlNUX0ZSRUVfT0JKRUNUSUQpCisJCXJldHVybiAwOworCXJldCA9IF9fYnRyZnNfaW5jX2V4dGVudF9yZWYodHJhbnMsIHJvb3QsIGJ5dGVuciwgMCwgcGFyZW50LAorCQkJCSAgICAgMCwgcmVmX3Jvb3QsIDAsIHJlZl9nZW5lcmF0aW9uLAorCQkJCSAgICAgb3duZXJfb2JqZWN0aWQpOworCXJldHVybiByZXQ7Cit9CisKK2ludCBidHJmc19leHRlbnRfcG9zdF9vcChzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKKwkJCSBzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCkKK3sKKwlmaW5pc2hfY3VycmVudF9pbnNlcnQodHJhbnMsIHJvb3QtPmZzX2luZm8tPmV4dGVudF9yb290LCAxKTsKKwlkZWxfcGVuZGluZ19leHRlbnRzKHRyYW5zLCByb290LT5mc19pbmZvLT5leHRlbnRfcm9vdCwgMSk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBidHJmc19sb29rdXBfZXh0ZW50X3JlZihzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKKwkJCSAgICBzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwgdTY0IGJ5dGVuciwKKwkJCSAgICB1NjQgbnVtX2J5dGVzLCB1MzIgKnJlZnMpCit7CisJc3RydWN0IGJ0cmZzX3BhdGggKnBhdGg7CisJaW50IHJldDsKKwlzdHJ1Y3QgYnRyZnNfa2V5IGtleTsKKwlzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqbDsKKwlzdHJ1Y3QgYnRyZnNfZXh0ZW50X2l0ZW0gKml0ZW07CisKKwlXQVJOX09OKG51bV9ieXRlcyA8IHJvb3QtPnNlY3RvcnNpemUpOworCXBhdGggPSBidHJmc19hbGxvY19wYXRoKCk7CisJcGF0aC0+cmVhZGEgPSAxOworCWtleS5vYmplY3RpZCA9IGJ5dGVucjsKKwlrZXkub2Zmc2V0ID0gbnVtX2J5dGVzOworCWJ0cmZzX3NldF9rZXlfdHlwZSgma2V5LCBCVFJGU19FWFRFTlRfSVRFTV9LRVkpOworCXJldCA9IGJ0cmZzX3NlYXJjaF9zbG90KHRyYW5zLCByb290LT5mc19pbmZvLT5leHRlbnRfcm9vdCwgJmtleSwgcGF0aCwKKwkJCQkwLCAwKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXQ7CisJaWYgKHJldCAhPSAwKSB7CisJCWJ0cmZzX3ByaW50X2xlYWYocm9vdCwgcGF0aC0+bm9kZXNbMF0pOworCQlwcmludGsoS0VSTl9JTkZPICJidHJmcyBmYWlsZWQgdG8gZmluZCBibG9jayBudW1iZXIgJWxsdVxuIiwKKwkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpYnl0ZW5yKTsKKwkJQlVHKCk7CisJfQorCWwgPSBwYXRoLT5ub2Rlc1swXTsKKwlpdGVtID0gYnRyZnNfaXRlbV9wdHIobCwgcGF0aC0+c2xvdHNbMF0sIHN0cnVjdCBidHJmc19leHRlbnRfaXRlbSk7CisJKnJlZnMgPSBidHJmc19leHRlbnRfcmVmcyhsLCBpdGVtKTsKK291dDoKKwlidHJmc19mcmVlX3BhdGgocGF0aCk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBidHJmc19jcm9zc19yZWZfZXhpc3Qoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCisJCQkgIHN0cnVjdCBidHJmc19yb290ICpyb290LCB1NjQgb2JqZWN0aWQsIHU2NCBieXRlbnIpCit7CisJc3RydWN0IGJ0cmZzX3Jvb3QgKmV4dGVudF9yb290ID0gcm9vdC0+ZnNfaW5mby0+ZXh0ZW50X3Jvb3Q7CisJc3RydWN0IGJ0cmZzX3BhdGggKnBhdGg7CisJc3RydWN0IGV4dGVudF9idWZmZXIgKmxlYWY7CisJc3RydWN0IGJ0cmZzX2V4dGVudF9yZWYgKnJlZl9pdGVtOworCXN0cnVjdCBidHJmc19rZXkga2V5OworCXN0cnVjdCBidHJmc19rZXkgZm91bmRfa2V5OworCXU2NCByZWZfcm9vdDsKKwl1NjQgbGFzdF9zbmFwc2hvdDsKKwl1MzIgbnJpdGVtczsKKwlpbnQgcmV0OworCisJa2V5Lm9iamVjdGlkID0gYnl0ZW5yOworCWtleS5vZmZzZXQgPSAodTY0KS0xOworCWtleS50eXBlID0gQlRSRlNfRVhURU5UX0lURU1fS0VZOworCisJcGF0aCA9IGJ0cmZzX2FsbG9jX3BhdGgoKTsKKwlyZXQgPSBidHJmc19zZWFyY2hfc2xvdChOVUxMLCBleHRlbnRfcm9vdCwgJmtleSwgcGF0aCwgMCwgMCk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0OworCUJVR19PTihyZXQgPT0gMCk7CisKKwlyZXQgPSAtRU5PRU5UOworCWlmIChwYXRoLT5zbG90c1swXSA9PSAwKQorCQlnb3RvIG91dDsKKworCXBhdGgtPnNsb3RzWzBdLS07CisJbGVhZiA9IHBhdGgtPm5vZGVzWzBdOworCWJ0cmZzX2l0ZW1fa2V5X3RvX2NwdShsZWFmLCAmZm91bmRfa2V5LCBwYXRoLT5zbG90c1swXSk7CisKKwlpZiAoZm91bmRfa2V5Lm9iamVjdGlkICE9IGJ5dGVuciB8fAorCSAgICBmb3VuZF9rZXkudHlwZSAhPSBCVFJGU19FWFRFTlRfSVRFTV9LRVkpCisJCWdvdG8gb3V0OworCisJbGFzdF9zbmFwc2hvdCA9IGJ0cmZzX3Jvb3RfbGFzdF9zbmFwc2hvdCgmcm9vdC0+cm9vdF9pdGVtKTsKKwl3aGlsZSAoMSkgeworCQlsZWFmID0gcGF0aC0+bm9kZXNbMF07CisJCW5yaXRlbXMgPSBidHJmc19oZWFkZXJfbnJpdGVtcyhsZWFmKTsKKwkJaWYgKHBhdGgtPnNsb3RzWzBdID49IG5yaXRlbXMpIHsKKwkJCXJldCA9IGJ0cmZzX25leHRfbGVhZihleHRlbnRfcm9vdCwgcGF0aCk7CisJCQlpZiAocmV0IDwgMCkKKwkJCQlnb3RvIG91dDsKKwkJCWlmIChyZXQgPT0gMCkKKwkJCQljb250aW51ZTsKKwkJCWJyZWFrOworCQl9CisJCWJ0cmZzX2l0ZW1fa2V5X3RvX2NwdShsZWFmLCAmZm91bmRfa2V5LCBwYXRoLT5zbG90c1swXSk7CisJCWlmIChmb3VuZF9rZXkub2JqZWN0aWQgIT0gYnl0ZW5yKQorCQkJYnJlYWs7CisKKwkJaWYgKGZvdW5kX2tleS50eXBlICE9IEJUUkZTX0VYVEVOVF9SRUZfS0VZKSB7CisJCQlwYXRoLT5zbG90c1swXSsrOworCQkJY29udGludWU7CisJCX0KKworCQlyZWZfaXRlbSA9IGJ0cmZzX2l0ZW1fcHRyKGxlYWYsIHBhdGgtPnNsb3RzWzBdLAorCQkJCQkgIHN0cnVjdCBidHJmc19leHRlbnRfcmVmKTsKKwkJcmVmX3Jvb3QgPSBidHJmc19yZWZfcm9vdChsZWFmLCByZWZfaXRlbSk7CisJCWlmICgocmVmX3Jvb3QgIT0gcm9vdC0+cm9vdF9rZXkub2JqZWN0aWQgJiYKKwkJICAgICByZWZfcm9vdCAhPSBCVFJGU19UUkVFX0xPR19PQkpFQ1RJRCkgfHwKKwkJICAgICBvYmplY3RpZCAhPSBidHJmc19yZWZfb2JqZWN0aWQobGVhZiwgcmVmX2l0ZW0pKSB7CisJCQlyZXQgPSAxOworCQkJZ290byBvdXQ7CisJCX0KKwkJaWYgKGJ0cmZzX3JlZl9nZW5lcmF0aW9uKGxlYWYsIHJlZl9pdGVtKSA8PSBsYXN0X3NuYXBzaG90KSB7CisJCQlyZXQgPSAxOworCQkJZ290byBvdXQ7CisJCX0KKworCQlwYXRoLT5zbG90c1swXSsrOworCX0KKwlyZXQgPSAwOworb3V0OgorCWJ0cmZzX2ZyZWVfcGF0aChwYXRoKTsKKwlyZXR1cm4gcmV0OworfQorCitpbnQgYnRyZnNfY2FjaGVfcmVmKHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLCBzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwKKwkJICAgIHN0cnVjdCBleHRlbnRfYnVmZmVyICpidWYsIHUzMiBucl9leHRlbnRzKQoreworCXN0cnVjdCBidHJmc19rZXkga2V5OworCXN0cnVjdCBidHJmc19maWxlX2V4dGVudF9pdGVtICpmaTsKKwl1NjQgcm9vdF9nZW47CisJdTMyIG5yaXRlbXM7CisJaW50IGk7CisJaW50IGxldmVsOworCWludCByZXQgPSAwOworCWludCBzaGFyZWQgPSAwOworCisJaWYgKCFyb290LT5yZWZfY293cykKKwkJcmV0dXJuIDA7CisKKwlpZiAocm9vdC0+cm9vdF9rZXkub2JqZWN0aWQgIT0gQlRSRlNfVFJFRV9SRUxPQ19PQkpFQ1RJRCkgeworCQlzaGFyZWQgPSAwOworCQlyb290X2dlbiA9IHJvb3QtPnJvb3Rfa2V5Lm9mZnNldDsKKwl9IGVsc2UgeworCQlzaGFyZWQgPSAxOworCQlyb290X2dlbiA9IHRyYW5zLT50cmFuc2lkIC0gMTsKKwl9CisKKwlsZXZlbCA9IGJ0cmZzX2hlYWRlcl9sZXZlbChidWYpOworCW5yaXRlbXMgPSBidHJmc19oZWFkZXJfbnJpdGVtcyhidWYpOworCisJaWYgKGxldmVsID09IDApIHsKKwkJc3RydWN0IGJ0cmZzX2xlYWZfcmVmICpyZWY7CisJCXN0cnVjdCBidHJmc19leHRlbnRfaW5mbyAqaW5mbzsKKworCQlyZWYgPSBidHJmc19hbGxvY19sZWFmX3JlZihyb290LCBucl9leHRlbnRzKTsKKwkJaWYgKCFyZWYpIHsKKwkJCXJldCA9IC1FTk9NRU07CisJCQlnb3RvIG91dDsKKwkJfQorCisJCXJlZi0+cm9vdF9nZW4gPSByb290X2dlbjsKKwkJcmVmLT5ieXRlbnIgPSBidWYtPnN0YXJ0OworCQlyZWYtPm93bmVyID0gYnRyZnNfaGVhZGVyX293bmVyKGJ1Zik7CisJCXJlZi0+Z2VuZXJhdGlvbiA9IGJ0cmZzX2hlYWRlcl9nZW5lcmF0aW9uKGJ1Zik7CisJCXJlZi0+bnJpdGVtcyA9IG5yX2V4dGVudHM7CisJCWluZm8gPSByZWYtPmV4dGVudHM7CisKKwkJZm9yIChpID0gMDsgbnJfZXh0ZW50cyA+IDAgJiYgaSA8IG5yaXRlbXM7IGkrKykgeworCQkJdTY0IGRpc2tfYnl0ZW5yOworCQkJYnRyZnNfaXRlbV9rZXlfdG9fY3B1KGJ1ZiwgJmtleSwgaSk7CisJCQlpZiAoYnRyZnNfa2V5X3R5cGUoJmtleSkgIT0gQlRSRlNfRVhURU5UX0RBVEFfS0VZKQorCQkJCWNvbnRpbnVlOworCQkJZmkgPSBidHJmc19pdGVtX3B0cihidWYsIGksCisJCQkJCSAgICBzdHJ1Y3QgYnRyZnNfZmlsZV9leHRlbnRfaXRlbSk7CisJCQlpZiAoYnRyZnNfZmlsZV9leHRlbnRfdHlwZShidWYsIGZpKSA9PQorCQkJICAgIEJUUkZTX0ZJTEVfRVhURU5UX0lOTElORSkKKwkJCQljb250aW51ZTsKKwkJCWRpc2tfYnl0ZW5yID0gYnRyZnNfZmlsZV9leHRlbnRfZGlza19ieXRlbnIoYnVmLCBmaSk7CisJCQlpZiAoZGlza19ieXRlbnIgPT0gMCkKKwkJCQljb250aW51ZTsKKworCQkJaW5mby0+Ynl0ZW5yID0gZGlza19ieXRlbnI7CisJCQlpbmZvLT5udW1fYnl0ZXMgPQorCQkJCWJ0cmZzX2ZpbGVfZXh0ZW50X2Rpc2tfbnVtX2J5dGVzKGJ1ZiwgZmkpOworCQkJaW5mby0+b2JqZWN0aWQgPSBrZXkub2JqZWN0aWQ7CisJCQlpbmZvLT5vZmZzZXQgPSBrZXkub2Zmc2V0OworCQkJaW5mbysrOworCQl9CisKKwkJcmV0ID0gYnRyZnNfYWRkX2xlYWZfcmVmKHJvb3QsIHJlZiwgc2hhcmVkKTsKKwkJaWYgKHJldCA9PSAtRUVYSVNUICYmIHNoYXJlZCkgeworCQkJc3RydWN0IGJ0cmZzX2xlYWZfcmVmICpvbGQ7CisJCQlvbGQgPSBidHJmc19sb29rdXBfbGVhZl9yZWYocm9vdCwgcmVmLT5ieXRlbnIpOworCQkJQlVHX09OKCFvbGQpOworCQkJYnRyZnNfcmVtb3ZlX2xlYWZfcmVmKHJvb3QsIG9sZCk7CisJCQlidHJmc19mcmVlX2xlYWZfcmVmKHJvb3QsIG9sZCk7CisJCQlyZXQgPSBidHJmc19hZGRfbGVhZl9yZWYocm9vdCwgcmVmLCBzaGFyZWQpOworCQl9CisJCVdBUk5fT04ocmV0KTsKKwkJYnRyZnNfZnJlZV9sZWFmX3JlZihyb290LCByZWYpOworCX0KK291dDoKKwlyZXR1cm4gcmV0OworfQorCitpbnQgYnRyZnNfaW5jX3JlZihzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywgc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsCisJCSAgc3RydWN0IGV4dGVudF9idWZmZXIgKm9yaWdfYnVmLCBzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqYnVmLAorCQkgIHUzMiAqbnJfZXh0ZW50cykKK3sKKwl1NjQgYnl0ZW5yOworCXU2NCByZWZfcm9vdDsKKwl1NjQgb3JpZ19yb290OworCXU2NCByZWZfZ2VuZXJhdGlvbjsKKwl1NjQgb3JpZ19nZW5lcmF0aW9uOworCXUzMiBucml0ZW1zOworCXUzMiBucl9maWxlX2V4dGVudHMgPSAwOworCXN0cnVjdCBidHJmc19rZXkga2V5OworCXN0cnVjdCBidHJmc19maWxlX2V4dGVudF9pdGVtICpmaTsKKwlpbnQgaTsKKwlpbnQgbGV2ZWw7CisJaW50IHJldCA9IDA7CisJaW50IGZhaWxpID0gMDsKKwlpbnQgKCpwcm9jZXNzX2Z1bmMpKHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKiwgc3RydWN0IGJ0cmZzX3Jvb3QgKiwKKwkJCSAgICB1NjQsIHU2NCwgdTY0LCB1NjQsIHU2NCwgdTY0LCB1NjQsIHU2NCk7CisKKwlyZWZfcm9vdCA9IGJ0cmZzX2hlYWRlcl9vd25lcihidWYpOworCXJlZl9nZW5lcmF0aW9uID0gYnRyZnNfaGVhZGVyX2dlbmVyYXRpb24oYnVmKTsKKwlvcmlnX3Jvb3QgPSBidHJmc19oZWFkZXJfb3duZXIob3JpZ19idWYpOworCW9yaWdfZ2VuZXJhdGlvbiA9IGJ0cmZzX2hlYWRlcl9nZW5lcmF0aW9uKG9yaWdfYnVmKTsKKworCW5yaXRlbXMgPSBidHJmc19oZWFkZXJfbnJpdGVtcyhidWYpOworCWxldmVsID0gYnRyZnNfaGVhZGVyX2xldmVsKGJ1Zik7CisKKwlpZiAocm9vdC0+cmVmX2Nvd3MpIHsKKwkJcHJvY2Vzc19mdW5jID0gX19idHJmc19pbmNfZXh0ZW50X3JlZjsKKwl9IGVsc2UgeworCQlpZiAobGV2ZWwgPT0gMCAmJgorCQkgICAgcm9vdC0+cm9vdF9rZXkub2JqZWN0aWQgIT0gQlRSRlNfVFJFRV9MT0dfT0JKRUNUSUQpCisJCQlnb3RvIG91dDsKKwkJaWYgKGxldmVsICE9IDAgJiYKKwkJICAgIHJvb3QtPnJvb3Rfa2V5Lm9iamVjdGlkID09IEJUUkZTX1RSRUVfTE9HX09CSkVDVElEKQorCQkJZ290byBvdXQ7CisJCXByb2Nlc3NfZnVuYyA9IF9fYnRyZnNfdXBkYXRlX2V4dGVudF9yZWY7CisJfQorCisJZm9yIChpID0gMDsgaSA8IG5yaXRlbXM7IGkrKykgeworCQljb25kX3Jlc2NoZWQoKTsKKwkJaWYgKGxldmVsID09IDApIHsKKwkJCWJ0cmZzX2l0ZW1fa2V5X3RvX2NwdShidWYsICZrZXksIGkpOworCQkJaWYgKGJ0cmZzX2tleV90eXBlKCZrZXkpICE9IEJUUkZTX0VYVEVOVF9EQVRBX0tFWSkKKwkJCQljb250aW51ZTsKKwkJCWZpID0gYnRyZnNfaXRlbV9wdHIoYnVmLCBpLAorCQkJCQkgICAgc3RydWN0IGJ0cmZzX2ZpbGVfZXh0ZW50X2l0ZW0pOworCQkJaWYgKGJ0cmZzX2ZpbGVfZXh0ZW50X3R5cGUoYnVmLCBmaSkgPT0KKwkJCSAgICBCVFJGU19GSUxFX0VYVEVOVF9JTkxJTkUpCisJCQkJY29udGludWU7CisJCQlieXRlbnIgPSBidHJmc19maWxlX2V4dGVudF9kaXNrX2J5dGVucihidWYsIGZpKTsKKwkJCWlmIChieXRlbnIgPT0gMCkKKwkJCQljb250aW51ZTsKKworCQkJbnJfZmlsZV9leHRlbnRzKys7CisKKwkJCXJldCA9IHByb2Nlc3NfZnVuYyh0cmFucywgcm9vdCwgYnl0ZW5yLAorCQkJCQkgICBvcmlnX2J1Zi0+c3RhcnQsIGJ1Zi0+c3RhcnQsCisJCQkJCSAgIG9yaWdfcm9vdCwgcmVmX3Jvb3QsCisJCQkJCSAgIG9yaWdfZ2VuZXJhdGlvbiwgcmVmX2dlbmVyYXRpb24sCisJCQkJCSAgIGtleS5vYmplY3RpZCk7CisKKwkJCWlmIChyZXQpIHsKKwkJCQlmYWlsaSA9IGk7CisJCQkJV0FSTl9PTigxKTsKKwkJCQlnb3RvIGZhaWw7CisJCQl9CisJCX0gZWxzZSB7CisJCQlieXRlbnIgPSBidHJmc19ub2RlX2Jsb2NrcHRyKGJ1ZiwgaSk7CisJCQlyZXQgPSBwcm9jZXNzX2Z1bmModHJhbnMsIHJvb3QsIGJ5dGVuciwKKwkJCQkJICAgb3JpZ19idWYtPnN0YXJ0LCBidWYtPnN0YXJ0LAorCQkJCQkgICBvcmlnX3Jvb3QsIHJlZl9yb290LAorCQkJCQkgICBvcmlnX2dlbmVyYXRpb24sIHJlZl9nZW5lcmF0aW9uLAorCQkJCQkgICBsZXZlbCAtIDEpOworCQkJaWYgKHJldCkgeworCQkJCWZhaWxpID0gaTsKKwkJCQlXQVJOX09OKDEpOworCQkJCWdvdG8gZmFpbDsKKwkJCX0KKwkJfQorCX0KK291dDoKKwlpZiAobnJfZXh0ZW50cykgeworCQlpZiAobGV2ZWwgPT0gMCkKKwkJCSpucl9leHRlbnRzID0gbnJfZmlsZV9leHRlbnRzOworCQllbHNlCisJCQkqbnJfZXh0ZW50cyA9IG5yaXRlbXM7CisJfQorCXJldHVybiAwOworZmFpbDoKKwlXQVJOX09OKDEpOworCXJldHVybiByZXQ7Cit9CisKK2ludCBidHJmc191cGRhdGVfcmVmKHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAorCQkgICAgIHN0cnVjdCBidHJmc19yb290ICpyb290LCBzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqb3JpZ19idWYsCisJCSAgICAgc3RydWN0IGV4dGVudF9idWZmZXIgKmJ1ZiwgaW50IHN0YXJ0X3Nsb3QsIGludCBucikKKworeworCXU2NCBieXRlbnI7CisJdTY0IHJlZl9yb290OworCXU2NCBvcmlnX3Jvb3Q7CisJdTY0IHJlZl9nZW5lcmF0aW9uOworCXU2NCBvcmlnX2dlbmVyYXRpb247CisJc3RydWN0IGJ0cmZzX2tleSBrZXk7CisJc3RydWN0IGJ0cmZzX2ZpbGVfZXh0ZW50X2l0ZW0gKmZpOworCWludCBpOworCWludCByZXQ7CisJaW50IHNsb3Q7CisJaW50IGxldmVsOworCisJQlVHX09OKHN0YXJ0X3Nsb3QgPCAwKTsKKwlCVUdfT04oc3RhcnRfc2xvdCArIG5yID4gYnRyZnNfaGVhZGVyX25yaXRlbXMoYnVmKSk7CisKKwlyZWZfcm9vdCA9IGJ0cmZzX2hlYWRlcl9vd25lcihidWYpOworCXJlZl9nZW5lcmF0aW9uID0gYnRyZnNfaGVhZGVyX2dlbmVyYXRpb24oYnVmKTsKKwlvcmlnX3Jvb3QgPSBidHJmc19oZWFkZXJfb3duZXIob3JpZ19idWYpOworCW9yaWdfZ2VuZXJhdGlvbiA9IGJ0cmZzX2hlYWRlcl9nZW5lcmF0aW9uKG9yaWdfYnVmKTsKKwlsZXZlbCA9IGJ0cmZzX2hlYWRlcl9sZXZlbChidWYpOworCisJaWYgKCFyb290LT5yZWZfY293cykgeworCQlpZiAobGV2ZWwgPT0gMCAmJgorCQkgICAgcm9vdC0+cm9vdF9rZXkub2JqZWN0aWQgIT0gQlRSRlNfVFJFRV9MT0dfT0JKRUNUSUQpCisJCQlyZXR1cm4gMDsKKwkJaWYgKGxldmVsICE9IDAgJiYKKwkJICAgIHJvb3QtPnJvb3Rfa2V5Lm9iamVjdGlkID09IEJUUkZTX1RSRUVfTE9HX09CSkVDVElEKQorCQkJcmV0dXJuIDA7CisJfQorCisJZm9yIChpID0gMCwgc2xvdCA9IHN0YXJ0X3Nsb3Q7IGkgPCBucjsgaSsrLCBzbG90KyspIHsKKwkJY29uZF9yZXNjaGVkKCk7CisJCWlmIChsZXZlbCA9PSAwKSB7CisJCQlidHJmc19pdGVtX2tleV90b19jcHUoYnVmLCAma2V5LCBzbG90KTsKKwkJCWlmIChidHJmc19rZXlfdHlwZSgma2V5KSAhPSBCVFJGU19FWFRFTlRfREFUQV9LRVkpCisJCQkJY29udGludWU7CisJCQlmaSA9IGJ0cmZzX2l0ZW1fcHRyKGJ1Ziwgc2xvdCwKKwkJCQkJICAgIHN0cnVjdCBidHJmc19maWxlX2V4dGVudF9pdGVtKTsKKwkJCWlmIChidHJmc19maWxlX2V4dGVudF90eXBlKGJ1ZiwgZmkpID09CisJCQkgICAgQlRSRlNfRklMRV9FWFRFTlRfSU5MSU5FKQorCQkJCWNvbnRpbnVlOworCQkJYnl0ZW5yID0gYnRyZnNfZmlsZV9leHRlbnRfZGlza19ieXRlbnIoYnVmLCBmaSk7CisJCQlpZiAoYnl0ZW5yID09IDApCisJCQkJY29udGludWU7CisJCQlyZXQgPSBfX2J0cmZzX3VwZGF0ZV9leHRlbnRfcmVmKHRyYW5zLCByb290LCBieXRlbnIsCisJCQkJCSAgICBvcmlnX2J1Zi0+c3RhcnQsIGJ1Zi0+c3RhcnQsCisJCQkJCSAgICBvcmlnX3Jvb3QsIHJlZl9yb290LAorCQkJCQkgICAgb3JpZ19nZW5lcmF0aW9uLCByZWZfZ2VuZXJhdGlvbiwKKwkJCQkJICAgIGtleS5vYmplY3RpZCk7CisJCQlpZiAocmV0KQorCQkJCWdvdG8gZmFpbDsKKwkJfSBlbHNlIHsKKwkJCWJ5dGVuciA9IGJ0cmZzX25vZGVfYmxvY2twdHIoYnVmLCBzbG90KTsKKwkJCXJldCA9IF9fYnRyZnNfdXBkYXRlX2V4dGVudF9yZWYodHJhbnMsIHJvb3QsIGJ5dGVuciwKKwkJCQkJICAgIG9yaWdfYnVmLT5zdGFydCwgYnVmLT5zdGFydCwKKwkJCQkJICAgIG9yaWdfcm9vdCwgcmVmX3Jvb3QsCisJCQkJCSAgICBvcmlnX2dlbmVyYXRpb24sIHJlZl9nZW5lcmF0aW9uLAorCQkJCQkgICAgbGV2ZWwgLSAxKTsKKwkJCWlmIChyZXQpCisJCQkJZ290byBmYWlsOworCQl9CisJfQorCXJldHVybiAwOworZmFpbDoKKwlXQVJOX09OKDEpOworCXJldHVybiAtMTsKK30KKworc3RhdGljIGludCB3cml0ZV9vbmVfY2FjaGVfZ3JvdXAoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCisJCQkJIHN0cnVjdCBidHJmc19yb290ICpyb290LAorCQkJCSBzdHJ1Y3QgYnRyZnNfcGF0aCAqcGF0aCwKKwkJCQkgc3RydWN0IGJ0cmZzX2Jsb2NrX2dyb3VwX2NhY2hlICpjYWNoZSkKK3sKKwlpbnQgcmV0OworCWludCBwZW5kaW5nX3JldDsKKwlzdHJ1Y3QgYnRyZnNfcm9vdCAqZXh0ZW50X3Jvb3QgPSByb290LT5mc19pbmZvLT5leHRlbnRfcm9vdDsKKwl1bnNpZ25lZCBsb25nIGJpOworCXN0cnVjdCBleHRlbnRfYnVmZmVyICpsZWFmOworCisJcmV0ID0gYnRyZnNfc2VhcmNoX3Nsb3QodHJhbnMsIGV4dGVudF9yb290LCAmY2FjaGUtPmtleSwgcGF0aCwgMCwgMSk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZmFpbDsKKwlCVUdfT04ocmV0KTsKKworCWxlYWYgPSBwYXRoLT5ub2Rlc1swXTsKKwliaSA9IGJ0cmZzX2l0ZW1fcHRyX29mZnNldChsZWFmLCBwYXRoLT5zbG90c1swXSk7CisJd3JpdGVfZXh0ZW50X2J1ZmZlcihsZWFmLCAmY2FjaGUtPml0ZW0sIGJpLCBzaXplb2YoY2FjaGUtPml0ZW0pKTsKKwlidHJmc19tYXJrX2J1ZmZlcl9kaXJ0eShsZWFmKTsKKwlidHJmc19yZWxlYXNlX3BhdGgoZXh0ZW50X3Jvb3QsIHBhdGgpOworZmFpbDoKKwlmaW5pc2hfY3VycmVudF9pbnNlcnQodHJhbnMsIGV4dGVudF9yb290LCAwKTsKKwlwZW5kaW5nX3JldCA9IGRlbF9wZW5kaW5nX2V4dGVudHModHJhbnMsIGV4dGVudF9yb290LCAwKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCWlmIChwZW5kaW5nX3JldCkKKwkJcmV0dXJuIHBlbmRpbmdfcmV0OworCXJldHVybiAwOworCit9CisKK2ludCBidHJmc193cml0ZV9kaXJ0eV9ibG9ja19ncm91cHMoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCisJCQkJICAgc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QpCit7CisJc3RydWN0IGJ0cmZzX2Jsb2NrX2dyb3VwX2NhY2hlICpjYWNoZSwgKmVudHJ5OworCXN0cnVjdCByYl9ub2RlICpuOworCWludCBlcnIgPSAwOworCWludCB3ZXJyID0gMDsKKwlzdHJ1Y3QgYnRyZnNfcGF0aCAqcGF0aDsKKwl1NjQgbGFzdCA9IDA7CisKKwlwYXRoID0gYnRyZnNfYWxsb2NfcGF0aCgpOworCWlmICghcGF0aCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwl3aGlsZSAoMSkgeworCQljYWNoZSA9IE5VTEw7CisJCXNwaW5fbG9jaygmcm9vdC0+ZnNfaW5mby0+YmxvY2tfZ3JvdXBfY2FjaGVfbG9jayk7CisJCWZvciAobiA9IHJiX2ZpcnN0KCZyb290LT5mc19pbmZvLT5ibG9ja19ncm91cF9jYWNoZV90cmVlKTsKKwkJICAgICBuOyBuID0gcmJfbmV4dChuKSkgeworCQkJZW50cnkgPSByYl9lbnRyeShuLCBzdHJ1Y3QgYnRyZnNfYmxvY2tfZ3JvdXBfY2FjaGUsCisJCQkJCSBjYWNoZV9ub2RlKTsKKwkJCWlmIChlbnRyeS0+ZGlydHkpIHsKKwkJCQljYWNoZSA9IGVudHJ5OworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCXNwaW5fdW5sb2NrKCZyb290LT5mc19pbmZvLT5ibG9ja19ncm91cF9jYWNoZV9sb2NrKTsKKworCQlpZiAoIWNhY2hlKQorCQkJYnJlYWs7CisKKwkJY2FjaGUtPmRpcnR5ID0gMDsKKwkJbGFzdCArPSBjYWNoZS0+a2V5Lm9mZnNldDsKKworCQllcnIgPSB3cml0ZV9vbmVfY2FjaGVfZ3JvdXAodHJhbnMsIHJvb3QsCisJCQkJCSAgICBwYXRoLCBjYWNoZSk7CisJCS8qCisJCSAqIGlmIHdlIGZhaWwgdG8gd3JpdGUgdGhlIGNhY2hlIGdyb3VwLCB3ZSB3YW50CisJCSAqIHRvIGtlZXAgaXQgbWFya2VkIGRpcnR5IGluIGhvcGVzIHRoYXQgYSBsYXRlcgorCQkgKiB3cml0ZSB3aWxsIHdvcmsKKwkJICovCisJCWlmIChlcnIpIHsKKwkJCXdlcnIgPSBlcnI7CisJCQljb250aW51ZTsKKwkJfQorCX0KKwlidHJmc19mcmVlX3BhdGgocGF0aCk7CisJcmV0dXJuIHdlcnI7Cit9CisKK2ludCBidHJmc19leHRlbnRfcmVhZG9ubHkoc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsIHU2NCBieXRlbnIpCit7CisJc3RydWN0IGJ0cmZzX2Jsb2NrX2dyb3VwX2NhY2hlICpibG9ja19ncm91cDsKKwlpbnQgcmVhZG9ubHkgPSAwOworCisJYmxvY2tfZ3JvdXAgPSBidHJmc19sb29rdXBfYmxvY2tfZ3JvdXAocm9vdC0+ZnNfaW5mbywgYnl0ZW5yKTsKKwlpZiAoIWJsb2NrX2dyb3VwIHx8IGJsb2NrX2dyb3VwLT5ybykKKwkJcmVhZG9ubHkgPSAxOworCWlmIChibG9ja19ncm91cCkKKwkJcHV0X2Jsb2NrX2dyb3VwKGJsb2NrX2dyb3VwKTsKKwlyZXR1cm4gcmVhZG9ubHk7Cit9CisKK3N0YXRpYyBpbnQgdXBkYXRlX3NwYWNlX2luZm8oc3RydWN0IGJ0cmZzX2ZzX2luZm8gKmluZm8sIHU2NCBmbGFncywKKwkJCSAgICAgdTY0IHRvdGFsX2J5dGVzLCB1NjQgYnl0ZXNfdXNlZCwKKwkJCSAgICAgc3RydWN0IGJ0cmZzX3NwYWNlX2luZm8gKipzcGFjZV9pbmZvKQoreworCXN0cnVjdCBidHJmc19zcGFjZV9pbmZvICpmb3VuZDsKKworCWZvdW5kID0gX19maW5kX3NwYWNlX2luZm8oaW5mbywgZmxhZ3MpOworCWlmIChmb3VuZCkgeworCQlzcGluX2xvY2soJmZvdW5kLT5sb2NrKTsKKwkJZm91bmQtPnRvdGFsX2J5dGVzICs9IHRvdGFsX2J5dGVzOworCQlmb3VuZC0+Ynl0ZXNfdXNlZCArPSBieXRlc191c2VkOworCQlmb3VuZC0+ZnVsbCA9IDA7CisJCXNwaW5fdW5sb2NrKCZmb3VuZC0+bG9jayk7CisJCSpzcGFjZV9pbmZvID0gZm91bmQ7CisJCXJldHVybiAwOworCX0KKwlmb3VuZCA9IGt6YWxsb2Moc2l6ZW9mKCpmb3VuZCksIEdGUF9OT0ZTKTsKKwlpZiAoIWZvdW5kKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWxpc3RfYWRkKCZmb3VuZC0+bGlzdCwgJmluZm8tPnNwYWNlX2luZm8pOworCUlOSVRfTElTVF9IRUFEKCZmb3VuZC0+YmxvY2tfZ3JvdXBzKTsKKwlpbml0X3J3c2VtKCZmb3VuZC0+Z3JvdXBzX3NlbSk7CisJc3Bpbl9sb2NrX2luaXQoJmZvdW5kLT5sb2NrKTsKKwlmb3VuZC0+ZmxhZ3MgPSBmbGFnczsKKwlmb3VuZC0+dG90YWxfYnl0ZXMgPSB0b3RhbF9ieXRlczsKKwlmb3VuZC0+Ynl0ZXNfdXNlZCA9IGJ5dGVzX3VzZWQ7CisJZm91bmQtPmJ5dGVzX3Bpbm5lZCA9IDA7CisJZm91bmQtPmJ5dGVzX3Jlc2VydmVkID0gMDsKKwlmb3VuZC0+Ynl0ZXNfcmVhZG9ubHkgPSAwOworCWZvdW5kLT5mdWxsID0gMDsKKwlmb3VuZC0+Zm9yY2VfYWxsb2MgPSAwOworCSpzcGFjZV9pbmZvID0gZm91bmQ7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9hdmFpbF9hbGxvY19iaXRzKHN0cnVjdCBidHJmc19mc19pbmZvICpmc19pbmZvLCB1NjQgZmxhZ3MpCit7CisJdTY0IGV4dHJhX2ZsYWdzID0gZmxhZ3MgJiAoQlRSRlNfQkxPQ0tfR1JPVVBfUkFJRDAgfAorCQkJCSAgIEJUUkZTX0JMT0NLX0dST1VQX1JBSUQxIHwKKwkJCQkgICBCVFJGU19CTE9DS19HUk9VUF9SQUlEMTAgfAorCQkJCSAgIEJUUkZTX0JMT0NLX0dST1VQX0RVUCk7CisJaWYgKGV4dHJhX2ZsYWdzKSB7CisJCWlmIChmbGFncyAmIEJUUkZTX0JMT0NLX0dST1VQX0RBVEEpCisJCQlmc19pbmZvLT5hdmFpbF9kYXRhX2FsbG9jX2JpdHMgfD0gZXh0cmFfZmxhZ3M7CisJCWlmIChmbGFncyAmIEJUUkZTX0JMT0NLX0dST1VQX01FVEFEQVRBKQorCQkJZnNfaW5mby0+YXZhaWxfbWV0YWRhdGFfYWxsb2NfYml0cyB8PSBleHRyYV9mbGFnczsKKwkJaWYgKGZsYWdzICYgQlRSRlNfQkxPQ0tfR1JPVVBfU1lTVEVNKQorCQkJZnNfaW5mby0+YXZhaWxfc3lzdGVtX2FsbG9jX2JpdHMgfD0gZXh0cmFfZmxhZ3M7CisJfQorfQorCitzdGF0aWMgdm9pZCBzZXRfYmxvY2tfZ3JvdXBfcmVhZG9ubHkoc3RydWN0IGJ0cmZzX2Jsb2NrX2dyb3VwX2NhY2hlICpjYWNoZSkKK3sKKwlzcGluX2xvY2soJmNhY2hlLT5zcGFjZV9pbmZvLT5sb2NrKTsKKwlzcGluX2xvY2soJmNhY2hlLT5sb2NrKTsKKwlpZiAoIWNhY2hlLT5ybykgeworCQljYWNoZS0+c3BhY2VfaW5mby0+Ynl0ZXNfcmVhZG9ubHkgKz0gY2FjaGUtPmtleS5vZmZzZXQgLQorCQkJCQlidHJmc19ibG9ja19ncm91cF91c2VkKCZjYWNoZS0+aXRlbSk7CisJCWNhY2hlLT5ybyA9IDE7CisJfQorCXNwaW5fdW5sb2NrKCZjYWNoZS0+bG9jayk7CisJc3Bpbl91bmxvY2soJmNhY2hlLT5zcGFjZV9pbmZvLT5sb2NrKTsKK30KKwordTY0IGJ0cmZzX3JlZHVjZV9hbGxvY19wcm9maWxlKHN0cnVjdCBidHJmc19yb290ICpyb290LCB1NjQgZmxhZ3MpCit7CisJdTY0IG51bV9kZXZpY2VzID0gcm9vdC0+ZnNfaW5mby0+ZnNfZGV2aWNlcy0+cndfZGV2aWNlczsKKworCWlmIChudW1fZGV2aWNlcyA9PSAxKQorCQlmbGFncyAmPSB+KEJUUkZTX0JMT0NLX0dST1VQX1JBSUQxIHwgQlRSRlNfQkxPQ0tfR1JPVVBfUkFJRDApOworCWlmIChudW1fZGV2aWNlcyA8IDQpCisJCWZsYWdzICY9IH5CVFJGU19CTE9DS19HUk9VUF9SQUlEMTA7CisKKwlpZiAoKGZsYWdzICYgQlRSRlNfQkxPQ0tfR1JPVVBfRFVQKSAmJgorCSAgICAoZmxhZ3MgJiAoQlRSRlNfQkxPQ0tfR1JPVVBfUkFJRDEgfAorCQkgICAgICBCVFJGU19CTE9DS19HUk9VUF9SQUlEMTApKSkgeworCQlmbGFncyAmPSB+QlRSRlNfQkxPQ0tfR1JPVVBfRFVQOworCX0KKworCWlmICgoZmxhZ3MgJiBCVFJGU19CTE9DS19HUk9VUF9SQUlEMSkgJiYKKwkgICAgKGZsYWdzICYgQlRSRlNfQkxPQ0tfR1JPVVBfUkFJRDEwKSkgeworCQlmbGFncyAmPSB+QlRSRlNfQkxPQ0tfR1JPVVBfUkFJRDE7CisJfQorCisJaWYgKChmbGFncyAmIEJUUkZTX0JMT0NLX0dST1VQX1JBSUQwKSAmJgorCSAgICAoKGZsYWdzICYgQlRSRlNfQkxPQ0tfR1JPVVBfUkFJRDEpIHwKKwkgICAgIChmbGFncyAmIEJUUkZTX0JMT0NLX0dST1VQX1JBSUQxMCkgfAorCSAgICAgKGZsYWdzICYgQlRSRlNfQkxPQ0tfR1JPVVBfRFVQKSkpCisJCWZsYWdzICY9IH5CVFJGU19CTE9DS19HUk9VUF9SQUlEMDsKKwlyZXR1cm4gZmxhZ3M7Cit9CisKK3N0YXRpYyBpbnQgZG9fY2h1bmtfYWxsb2Moc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCisJCQkgIHN0cnVjdCBidHJmc19yb290ICpleHRlbnRfcm9vdCwgdTY0IGFsbG9jX2J5dGVzLAorCQkJICB1NjQgZmxhZ3MsIGludCBmb3JjZSkKK3sKKwlzdHJ1Y3QgYnRyZnNfc3BhY2VfaW5mbyAqc3BhY2VfaW5mbzsKKwl1NjQgdGhyZXNoOworCWludCByZXQgPSAwOworCisJbXV0ZXhfbG9jaygmZXh0ZW50X3Jvb3QtPmZzX2luZm8tPmNodW5rX211dGV4KTsKKworCWZsYWdzID0gYnRyZnNfcmVkdWNlX2FsbG9jX3Byb2ZpbGUoZXh0ZW50X3Jvb3QsIGZsYWdzKTsKKworCXNwYWNlX2luZm8gPSBfX2ZpbmRfc3BhY2VfaW5mbyhleHRlbnRfcm9vdC0+ZnNfaW5mbywgZmxhZ3MpOworCWlmICghc3BhY2VfaW5mbykgeworCQlyZXQgPSB1cGRhdGVfc3BhY2VfaW5mbyhleHRlbnRfcm9vdC0+ZnNfaW5mbywgZmxhZ3MsCisJCQkJCTAsIDAsICZzcGFjZV9pbmZvKTsKKwkJQlVHX09OKHJldCk7CisJfQorCUJVR19PTighc3BhY2VfaW5mbyk7CisKKwlzcGluX2xvY2soJnNwYWNlX2luZm8tPmxvY2spOworCWlmIChzcGFjZV9pbmZvLT5mb3JjZV9hbGxvYykgeworCQlmb3JjZSA9IDE7CisJCXNwYWNlX2luZm8tPmZvcmNlX2FsbG9jID0gMDsKKwl9CisJaWYgKHNwYWNlX2luZm8tPmZ1bGwpIHsKKwkJc3Bpbl91bmxvY2soJnNwYWNlX2luZm8tPmxvY2spOworCQlnb3RvIG91dDsKKwl9CisKKwl0aHJlc2ggPSBzcGFjZV9pbmZvLT50b3RhbF9ieXRlcyAtIHNwYWNlX2luZm8tPmJ5dGVzX3JlYWRvbmx5OworCXRocmVzaCA9IGRpdl9mYWN0b3IodGhyZXNoLCA2KTsKKwlpZiAoIWZvcmNlICYmCisJICAgKHNwYWNlX2luZm8tPmJ5dGVzX3VzZWQgKyBzcGFjZV9pbmZvLT5ieXRlc19waW5uZWQgKworCSAgICBzcGFjZV9pbmZvLT5ieXRlc19yZXNlcnZlZCArIGFsbG9jX2J5dGVzKSA8IHRocmVzaCkgeworCQlzcGluX3VubG9jaygmc3BhY2VfaW5mby0+bG9jayk7CisJCWdvdG8gb3V0OworCX0KKwlzcGluX3VubG9jaygmc3BhY2VfaW5mby0+bG9jayk7CisKKwlyZXQgPSBidHJmc19hbGxvY19jaHVuayh0cmFucywgZXh0ZW50X3Jvb3QsIGZsYWdzKTsKKwlpZiAocmV0KQorCQlzcGFjZV9pbmZvLT5mdWxsID0gMTsKK291dDoKKwltdXRleF91bmxvY2soJmV4dGVudF9yb290LT5mc19pbmZvLT5jaHVua19tdXRleCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB1cGRhdGVfYmxvY2tfZ3JvdXAoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCisJCQkgICAgICBzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwKKwkJCSAgICAgIHU2NCBieXRlbnIsIHU2NCBudW1fYnl0ZXMsIGludCBhbGxvYywKKwkJCSAgICAgIGludCBtYXJrX2ZyZWUpCit7CisJc3RydWN0IGJ0cmZzX2Jsb2NrX2dyb3VwX2NhY2hlICpjYWNoZTsKKwlzdHJ1Y3QgYnRyZnNfZnNfaW5mbyAqaW5mbyA9IHJvb3QtPmZzX2luZm87CisJdTY0IHRvdGFsID0gbnVtX2J5dGVzOworCXU2NCBvbGRfdmFsOworCXU2NCBieXRlX2luX2dyb3VwOworCisJd2hpbGUgKHRvdGFsKSB7CisJCWNhY2hlID0gYnRyZnNfbG9va3VwX2Jsb2NrX2dyb3VwKGluZm8sIGJ5dGVucik7CisJCWlmICghY2FjaGUpCisJCQlyZXR1cm4gLTE7CisJCWJ5dGVfaW5fZ3JvdXAgPSBieXRlbnIgLSBjYWNoZS0+a2V5Lm9iamVjdGlkOworCQlXQVJOX09OKGJ5dGVfaW5fZ3JvdXAgPiBjYWNoZS0+a2V5Lm9mZnNldCk7CisKKwkJc3Bpbl9sb2NrKCZjYWNoZS0+c3BhY2VfaW5mby0+bG9jayk7CisJCXNwaW5fbG9jaygmY2FjaGUtPmxvY2spOworCQljYWNoZS0+ZGlydHkgPSAxOworCQlvbGRfdmFsID0gYnRyZnNfYmxvY2tfZ3JvdXBfdXNlZCgmY2FjaGUtPml0ZW0pOworCQludW1fYnl0ZXMgPSBtaW4odG90YWwsIGNhY2hlLT5rZXkub2Zmc2V0IC0gYnl0ZV9pbl9ncm91cCk7CisJCWlmIChhbGxvYykgeworCQkJb2xkX3ZhbCArPSBudW1fYnl0ZXM7CisJCQljYWNoZS0+c3BhY2VfaW5mby0+Ynl0ZXNfdXNlZCArPSBudW1fYnl0ZXM7CisJCQlpZiAoY2FjaGUtPnJvKQorCQkJCWNhY2hlLT5zcGFjZV9pbmZvLT5ieXRlc19yZWFkb25seSAtPSBudW1fYnl0ZXM7CisJCQlidHJmc19zZXRfYmxvY2tfZ3JvdXBfdXNlZCgmY2FjaGUtPml0ZW0sIG9sZF92YWwpOworCQkJc3Bpbl91bmxvY2soJmNhY2hlLT5sb2NrKTsKKwkJCXNwaW5fdW5sb2NrKCZjYWNoZS0+c3BhY2VfaW5mby0+bG9jayk7CisJCX0gZWxzZSB7CisJCQlvbGRfdmFsIC09IG51bV9ieXRlczsKKwkJCWNhY2hlLT5zcGFjZV9pbmZvLT5ieXRlc191c2VkIC09IG51bV9ieXRlczsKKwkJCWlmIChjYWNoZS0+cm8pCisJCQkJY2FjaGUtPnNwYWNlX2luZm8tPmJ5dGVzX3JlYWRvbmx5ICs9IG51bV9ieXRlczsKKwkJCWJ0cmZzX3NldF9ibG9ja19ncm91cF91c2VkKCZjYWNoZS0+aXRlbSwgb2xkX3ZhbCk7CisJCQlzcGluX3VubG9jaygmY2FjaGUtPmxvY2spOworCQkJc3Bpbl91bmxvY2soJmNhY2hlLT5zcGFjZV9pbmZvLT5sb2NrKTsKKwkJCWlmIChtYXJrX2ZyZWUpIHsKKwkJCQlpbnQgcmV0OworCisJCQkJcmV0ID0gYnRyZnNfZGlzY2FyZF9leHRlbnQocm9vdCwgYnl0ZW5yLAorCQkJCQkJCSAgIG51bV9ieXRlcyk7CisJCQkJV0FSTl9PTihyZXQpOworCisJCQkJcmV0ID0gYnRyZnNfYWRkX2ZyZWVfc3BhY2UoY2FjaGUsIGJ5dGVuciwKKwkJCQkJCQkgICBudW1fYnl0ZXMpOworCQkJCVdBUk5fT04ocmV0KTsKKwkJCX0KKwkJfQorCQlwdXRfYmxvY2tfZ3JvdXAoY2FjaGUpOworCQl0b3RhbCAtPSBudW1fYnl0ZXM7CisJCWJ5dGVuciArPSBudW1fYnl0ZXM7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdTY0IGZpcnN0X2xvZ2ljYWxfYnl0ZShzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwgdTY0IHNlYXJjaF9zdGFydCkKK3sKKwlzdHJ1Y3QgYnRyZnNfYmxvY2tfZ3JvdXBfY2FjaGUgKmNhY2hlOworCXU2NCBieXRlbnI7CisKKwljYWNoZSA9IGJ0cmZzX2xvb2t1cF9maXJzdF9ibG9ja19ncm91cChyb290LT5mc19pbmZvLCBzZWFyY2hfc3RhcnQpOworCWlmICghY2FjaGUpCisJCXJldHVybiAwOworCisJYnl0ZW5yID0gY2FjaGUtPmtleS5vYmplY3RpZDsKKwlwdXRfYmxvY2tfZ3JvdXAoY2FjaGUpOworCisJcmV0dXJuIGJ5dGVucjsKK30KKworaW50IGJ0cmZzX3VwZGF0ZV9waW5uZWRfZXh0ZW50cyhzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwKKwkJCQl1NjQgYnl0ZW5yLCB1NjQgbnVtLCBpbnQgcGluKQoreworCXU2NCBsZW47CisJc3RydWN0IGJ0cmZzX2Jsb2NrX2dyb3VwX2NhY2hlICpjYWNoZTsKKwlzdHJ1Y3QgYnRyZnNfZnNfaW5mbyAqZnNfaW5mbyA9IHJvb3QtPmZzX2luZm87CisKKwlXQVJOX09OKCFtdXRleF9pc19sb2NrZWQoJnJvb3QtPmZzX2luZm8tPnBpbm5lZF9tdXRleCkpOworCWlmIChwaW4pIHsKKwkJc2V0X2V4dGVudF9kaXJ0eSgmZnNfaW5mby0+cGlubmVkX2V4dGVudHMsCisJCQkJYnl0ZW5yLCBieXRlbnIgKyBudW0gLSAxLCBHRlBfTk9GUyk7CisJfSBlbHNlIHsKKwkJY2xlYXJfZXh0ZW50X2RpcnR5KCZmc19pbmZvLT5waW5uZWRfZXh0ZW50cywKKwkJCQlieXRlbnIsIGJ5dGVuciArIG51bSAtIDEsIEdGUF9OT0ZTKTsKKwl9CisJd2hpbGUgKG51bSA+IDApIHsKKwkJY2FjaGUgPSBidHJmc19sb29rdXBfYmxvY2tfZ3JvdXAoZnNfaW5mbywgYnl0ZW5yKTsKKwkJQlVHX09OKCFjYWNoZSk7CisJCWxlbiA9IG1pbihudW0sIGNhY2hlLT5rZXkub2Zmc2V0IC0KKwkJCSAgKGJ5dGVuciAtIGNhY2hlLT5rZXkub2JqZWN0aWQpKTsKKwkJaWYgKHBpbikgeworCQkJc3Bpbl9sb2NrKCZjYWNoZS0+c3BhY2VfaW5mby0+bG9jayk7CisJCQlzcGluX2xvY2soJmNhY2hlLT5sb2NrKTsKKwkJCWNhY2hlLT5waW5uZWQgKz0gbGVuOworCQkJY2FjaGUtPnNwYWNlX2luZm8tPmJ5dGVzX3Bpbm5lZCArPSBsZW47CisJCQlzcGluX3VubG9jaygmY2FjaGUtPmxvY2spOworCQkJc3Bpbl91bmxvY2soJmNhY2hlLT5zcGFjZV9pbmZvLT5sb2NrKTsKKwkJCWZzX2luZm8tPnRvdGFsX3Bpbm5lZCArPSBsZW47CisJCX0gZWxzZSB7CisJCQlzcGluX2xvY2soJmNhY2hlLT5zcGFjZV9pbmZvLT5sb2NrKTsKKwkJCXNwaW5fbG9jaygmY2FjaGUtPmxvY2spOworCQkJY2FjaGUtPnBpbm5lZCAtPSBsZW47CisJCQljYWNoZS0+c3BhY2VfaW5mby0+Ynl0ZXNfcGlubmVkIC09IGxlbjsKKwkJCXNwaW5fdW5sb2NrKCZjYWNoZS0+bG9jayk7CisJCQlzcGluX3VubG9jaygmY2FjaGUtPnNwYWNlX2luZm8tPmxvY2spOworCQkJZnNfaW5mby0+dG90YWxfcGlubmVkIC09IGxlbjsKKwkJCWlmIChjYWNoZS0+Y2FjaGVkKQorCQkJCWJ0cmZzX2FkZF9mcmVlX3NwYWNlKGNhY2hlLCBieXRlbnIsIGxlbik7CisJCX0KKwkJcHV0X2Jsb2NrX2dyb3VwKGNhY2hlKTsKKwkJYnl0ZW5yICs9IGxlbjsKKwkJbnVtIC09IGxlbjsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdXBkYXRlX3Jlc2VydmVkX2V4dGVudHMoc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsCisJCQkJICAgdTY0IGJ5dGVuciwgdTY0IG51bSwgaW50IHJlc2VydmUpCit7CisJdTY0IGxlbjsKKwlzdHJ1Y3QgYnRyZnNfYmxvY2tfZ3JvdXBfY2FjaGUgKmNhY2hlOworCXN0cnVjdCBidHJmc19mc19pbmZvICpmc19pbmZvID0gcm9vdC0+ZnNfaW5mbzsKKworCXdoaWxlIChudW0gPiAwKSB7CisJCWNhY2hlID0gYnRyZnNfbG9va3VwX2Jsb2NrX2dyb3VwKGZzX2luZm8sIGJ5dGVucik7CisJCUJVR19PTighY2FjaGUpOworCQlsZW4gPSBtaW4obnVtLCBjYWNoZS0+a2V5Lm9mZnNldCAtCisJCQkgIChieXRlbnIgLSBjYWNoZS0+a2V5Lm9iamVjdGlkKSk7CisKKwkJc3Bpbl9sb2NrKCZjYWNoZS0+c3BhY2VfaW5mby0+bG9jayk7CisJCXNwaW5fbG9jaygmY2FjaGUtPmxvY2spOworCQlpZiAocmVzZXJ2ZSkgeworCQkJY2FjaGUtPnJlc2VydmVkICs9IGxlbjsKKwkJCWNhY2hlLT5zcGFjZV9pbmZvLT5ieXRlc19yZXNlcnZlZCArPSBsZW47CisJCX0gZWxzZSB7CisJCQljYWNoZS0+cmVzZXJ2ZWQgLT0gbGVuOworCQkJY2FjaGUtPnNwYWNlX2luZm8tPmJ5dGVzX3Jlc2VydmVkIC09IGxlbjsKKwkJfQorCQlzcGluX3VubG9jaygmY2FjaGUtPmxvY2spOworCQlzcGluX3VubG9jaygmY2FjaGUtPnNwYWNlX2luZm8tPmxvY2spOworCQlwdXRfYmxvY2tfZ3JvdXAoY2FjaGUpOworCQlieXRlbnIgKz0gbGVuOworCQludW0gLT0gbGVuOworCX0KKwlyZXR1cm4gMDsKK30KKworaW50IGJ0cmZzX2NvcHlfcGlubmVkKHN0cnVjdCBidHJmc19yb290ICpyb290LCBzdHJ1Y3QgZXh0ZW50X2lvX3RyZWUgKmNvcHkpCit7CisJdTY0IGxhc3QgPSAwOworCXU2NCBzdGFydDsKKwl1NjQgZW5kOworCXN0cnVjdCBleHRlbnRfaW9fdHJlZSAqcGlubmVkX2V4dGVudHMgPSAmcm9vdC0+ZnNfaW5mby0+cGlubmVkX2V4dGVudHM7CisJaW50IHJldDsKKworCW11dGV4X2xvY2soJnJvb3QtPmZzX2luZm8tPnBpbm5lZF9tdXRleCk7CisJd2hpbGUgKDEpIHsKKwkJcmV0ID0gZmluZF9maXJzdF9leHRlbnRfYml0KHBpbm5lZF9leHRlbnRzLCBsYXN0LAorCQkJCQkgICAgJnN0YXJ0LCAmZW5kLCBFWFRFTlRfRElSVFkpOworCQlpZiAocmV0KQorCQkJYnJlYWs7CisJCXNldF9leHRlbnRfZGlydHkoY29weSwgc3RhcnQsIGVuZCwgR0ZQX05PRlMpOworCQlsYXN0ID0gZW5kICsgMTsKKwl9CisJbXV0ZXhfdW5sb2NrKCZyb290LT5mc19pbmZvLT5waW5uZWRfbXV0ZXgpOworCXJldHVybiAwOworfQorCitpbnQgYnRyZnNfZmluaXNoX2V4dGVudF9jb21taXQoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCisJCQkgICAgICAgc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsCisJCQkgICAgICAgc3RydWN0IGV4dGVudF9pb190cmVlICp1bnBpbikKK3sKKwl1NjQgc3RhcnQ7CisJdTY0IGVuZDsKKwlpbnQgcmV0OworCisJbXV0ZXhfbG9jaygmcm9vdC0+ZnNfaW5mby0+cGlubmVkX211dGV4KTsKKwl3aGlsZSAoMSkgeworCQlyZXQgPSBmaW5kX2ZpcnN0X2V4dGVudF9iaXQodW5waW4sIDAsICZzdGFydCwgJmVuZCwKKwkJCQkJICAgIEVYVEVOVF9ESVJUWSk7CisJCWlmIChyZXQpCisJCQlicmVhazsKKworCQlyZXQgPSBidHJmc19kaXNjYXJkX2V4dGVudChyb290LCBzdGFydCwgZW5kICsgMSAtIHN0YXJ0KTsKKworCQlidHJmc191cGRhdGVfcGlubmVkX2V4dGVudHMocm9vdCwgc3RhcnQsIGVuZCArIDEgLSBzdGFydCwgMCk7CisJCWNsZWFyX2V4dGVudF9kaXJ0eSh1bnBpbiwgc3RhcnQsIGVuZCwgR0ZQX05PRlMpOworCisJCWlmIChuZWVkX3Jlc2NoZWQoKSkgeworCQkJbXV0ZXhfdW5sb2NrKCZyb290LT5mc19pbmZvLT5waW5uZWRfbXV0ZXgpOworCQkJY29uZF9yZXNjaGVkKCk7CisJCQltdXRleF9sb2NrKCZyb290LT5mc19pbmZvLT5waW5uZWRfbXV0ZXgpOworCQl9CisJfQorCW11dGV4X3VubG9jaygmcm9vdC0+ZnNfaW5mby0+cGlubmVkX211dGV4KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGZpbmlzaF9jdXJyZW50X2luc2VydChzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKKwkJCQkgc3RydWN0IGJ0cmZzX3Jvb3QgKmV4dGVudF9yb290LCBpbnQgYWxsKQoreworCXU2NCBzdGFydDsKKwl1NjQgZW5kOworCXU2NCBwcml2OworCXU2NCBzZWFyY2ggPSAwOworCXU2NCBza2lwcGVkID0gMDsKKwlzdHJ1Y3QgYnRyZnNfZnNfaW5mbyAqaW5mbyA9IGV4dGVudF9yb290LT5mc19pbmZvOworCXN0cnVjdCBidHJmc19wYXRoICpwYXRoOworCXN0cnVjdCBwZW5kaW5nX2V4dGVudF9vcCAqZXh0ZW50X29wLCAqdG1wOworCXN0cnVjdCBsaXN0X2hlYWQgaW5zZXJ0X2xpc3QsIHVwZGF0ZV9saXN0OworCWludCByZXQ7CisJaW50IG51bV9pbnNlcnRzID0gMCwgbWF4X2luc2VydHM7CisKKwlwYXRoID0gYnRyZnNfYWxsb2NfcGF0aCgpOworCUlOSVRfTElTVF9IRUFEKCZpbnNlcnRfbGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJnVwZGF0ZV9saXN0KTsKKworCW1heF9pbnNlcnRzID0gZXh0ZW50X3Jvb3QtPmxlYWZzaXplIC8KKwkJKDIgKiBzaXplb2Yoc3RydWN0IGJ0cmZzX2tleSkgKyAyICogc2l6ZW9mKHN0cnVjdCBidHJmc19pdGVtKSArCisJCSBzaXplb2Yoc3RydWN0IGJ0cmZzX2V4dGVudF9yZWYpICsKKwkJIHNpemVvZihzdHJ1Y3QgYnRyZnNfZXh0ZW50X2l0ZW0pKTsKK2FnYWluOgorCW11dGV4X2xvY2soJmluZm8tPmV4dGVudF9pbnNfbXV0ZXgpOworCXdoaWxlICgxKSB7CisJCXJldCA9IGZpbmRfZmlyc3RfZXh0ZW50X2JpdCgmaW5mby0+ZXh0ZW50X2lucywgc2VhcmNoLCAmc3RhcnQsCisJCQkJCSAgICAmZW5kLCBFWFRFTlRfV1JJVEVCQUNLKTsKKwkJaWYgKHJldCkgeworCQkJaWYgKHNraXBwZWQgJiYgYWxsICYmICFudW1faW5zZXJ0cykgeworCQkJCXNraXBwZWQgPSAwOworCQkJCXNlYXJjaCA9IDA7CisJCQkJY29udGludWU7CisJCQl9CisJCQltdXRleF91bmxvY2soJmluZm8tPmV4dGVudF9pbnNfbXV0ZXgpOworCQkJYnJlYWs7CisJCX0KKworCQlyZXQgPSB0cnlfbG9ja19leHRlbnQoJmluZm8tPmV4dGVudF9pbnMsIHN0YXJ0LCBlbmQsIEdGUF9OT0ZTKTsKKwkJaWYgKCFyZXQpIHsKKwkJCXNraXBwZWQgPSAxOworCQkJc2VhcmNoID0gZW5kICsgMTsKKwkJCWlmIChuZWVkX3Jlc2NoZWQoKSkgeworCQkJCW11dGV4X3VubG9jaygmaW5mby0+ZXh0ZW50X2luc19tdXRleCk7CisJCQkJY29uZF9yZXNjaGVkKCk7CisJCQkJbXV0ZXhfbG9jaygmaW5mby0+ZXh0ZW50X2luc19tdXRleCk7CisJCQl9CisJCQljb250aW51ZTsKKwkJfQorCisJCXJldCA9IGdldF9zdGF0ZV9wcml2YXRlKCZpbmZvLT5leHRlbnRfaW5zLCBzdGFydCwgJnByaXYpOworCQlCVUdfT04ocmV0KTsKKwkJZXh0ZW50X29wID0gKHN0cnVjdCBwZW5kaW5nX2V4dGVudF9vcCAqKSh1bnNpZ25lZCBsb25nKSBwcml2OworCisJCWlmIChleHRlbnRfb3AtPnR5cGUgPT0gUEVORElOR19FWFRFTlRfSU5TRVJUKSB7CisJCQludW1faW5zZXJ0cysrOworCQkJbGlzdF9hZGRfdGFpbCgmZXh0ZW50X29wLT5saXN0LCAmaW5zZXJ0X2xpc3QpOworCQkJc2VhcmNoID0gZW5kICsgMTsKKwkJCWlmIChudW1faW5zZXJ0cyA9PSBtYXhfaW5zZXJ0cykgeworCQkJCW11dGV4X3VubG9jaygmaW5mby0+ZXh0ZW50X2luc19tdXRleCk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0gZWxzZSBpZiAoZXh0ZW50X29wLT50eXBlID09IFBFTkRJTkdfQkFDS1JFRl9VUERBVEUpIHsKKwkJCWxpc3RfYWRkX3RhaWwoJmV4dGVudF9vcC0+bGlzdCwgJnVwZGF0ZV9saXN0KTsKKwkJCXNlYXJjaCA9IGVuZCArIDE7CisJCX0gZWxzZSB7CisJCQlCVUcoKTsKKwkJfQorCX0KKworCS8qCisJICogcHJvY2VzcyB0aGUgdXBkYXRlIGxpc3QsIGNsZWFyIHRoZSB3cml0ZWJhY2sgYml0IGZvciBpdCwgYW5kIGlmCisJICogc29tZWJvZHkgbWFya2VkIHRoaXMgdGhpbmcgZm9yIGRlbGV0aW9uIHRoZW4ganVzdCB1bmxvY2sgaXQgYW5kIGJlCisJICogZG9uZSwgdGhlIGZyZWVfZXh0ZW50cyB3aWxsIGhhbmRsZSBpdAorCSAqLworCW11dGV4X2xvY2soJmluZm8tPmV4dGVudF9pbnNfbXV0ZXgpOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShleHRlbnRfb3AsIHRtcCwgJnVwZGF0ZV9saXN0LCBsaXN0KSB7CisJCWNsZWFyX2V4dGVudF9iaXRzKCZpbmZvLT5leHRlbnRfaW5zLCBleHRlbnRfb3AtPmJ5dGVuciwKKwkJCQkgIGV4dGVudF9vcC0+Ynl0ZW5yICsgZXh0ZW50X29wLT5udW1fYnl0ZXMgLSAxLAorCQkJCSAgRVhURU5UX1dSSVRFQkFDSywgR0ZQX05PRlMpOworCQlpZiAoZXh0ZW50X29wLT5kZWwpIHsKKwkJCWxpc3RfZGVsX2luaXQoJmV4dGVudF9vcC0+bGlzdCk7CisJCQl1bmxvY2tfZXh0ZW50KCZpbmZvLT5leHRlbnRfaW5zLCBleHRlbnRfb3AtPmJ5dGVuciwKKwkJCQkgICAgICBleHRlbnRfb3AtPmJ5dGVuciArIGV4dGVudF9vcC0+bnVtX2J5dGVzCisJCQkJICAgICAgLSAxLCBHRlBfTk9GUyk7CisJCQlrZnJlZShleHRlbnRfb3ApOworCQl9CisJfQorCW11dGV4X3VubG9jaygmaW5mby0+ZXh0ZW50X2luc19tdXRleCk7CisKKwkvKgorCSAqIHN0aWxsIGhhdmUgdGhpbmdzIGxlZnQgb24gdGhlIHVwZGF0ZSBsaXN0LCBnbyBhaGVhZCBhbiB1cGRhdGUKKwkgKiBldmVyeXRoaW5nCisJICovCisJaWYgKCFsaXN0X2VtcHR5KCZ1cGRhdGVfbGlzdCkpIHsKKwkJcmV0ID0gdXBkYXRlX2JhY2tyZWZzKHRyYW5zLCBleHRlbnRfcm9vdCwgcGF0aCwgJnVwZGF0ZV9saXN0KTsKKwkJQlVHX09OKHJldCk7CisJfQorCisJLyoKKwkgKiBpZiBubyBpbnNlcnRzIG5lZWQgdG8gYmUgZG9uZSwgYnV0IHdlIHNraXBwZWQgc29tZSBleHRlbnRzIGFuZCB3ZQorCSAqIG5lZWQgdG8gbWFrZSBzdXJlIGV2ZXJ5dGhpbmcgaXMgY2xlYW5lZCB0aGVuIHJlc2V0IGV2ZXJ5dGhpbmcgYW5kCisJICogZ28gYmFjayB0byB0aGUgYmVnaW5uaW5nCisJICovCisJaWYgKCFudW1faW5zZXJ0cyAmJiBhbGwgJiYgc2tpcHBlZCkgeworCQlzZWFyY2ggPSAwOworCQlza2lwcGVkID0gMDsKKwkJSU5JVF9MSVNUX0hFQUQoJnVwZGF0ZV9saXN0KTsKKwkJSU5JVF9MSVNUX0hFQUQoJmluc2VydF9saXN0KTsKKwkJZ290byBhZ2FpbjsKKwl9IGVsc2UgaWYgKCFudW1faW5zZXJ0cykgeworCQlnb3RvIG91dDsKKwl9CisKKwkvKgorCSAqIHByb2Nlc3MgdGhlIGluc2VydCBleHRlbnRzIGxpc3QuICBBZ2FpbiBpZiB3ZSBhcmUgZGVsZXRpbmcgdGhpcworCSAqIGV4dGVudCwgdGhlbiBqdXN0IHVubG9jayBpdCwgcGluIGRvd24gdGhlIGJ5dGVzIGlmIG5lZWQgYmUsIGFuZCBiZQorCSAqIGRvbmUgd2l0aCBpdC4gIFNhdmVzIHVzIGZyb20gaGF2aW5nIHRvIGFjdHVhbGx5IGluc2VydCB0aGUgZXh0ZW50CisJICogaW50byB0aGUgdHJlZSBhbmQgdGhlbiBzdWJzZXF1ZW50bHkgY29tZSBhbG9uZyBhbmQgZGVsZXRlIGl0CisJICovCisJbXV0ZXhfbG9jaygmaW5mby0+ZXh0ZW50X2luc19tdXRleCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGV4dGVudF9vcCwgdG1wLCAmaW5zZXJ0X2xpc3QsIGxpc3QpIHsKKwkJY2xlYXJfZXh0ZW50X2JpdHMoJmluZm8tPmV4dGVudF9pbnMsIGV4dGVudF9vcC0+Ynl0ZW5yLAorCQkJCSAgZXh0ZW50X29wLT5ieXRlbnIgKyBleHRlbnRfb3AtPm51bV9ieXRlcyAtIDEsCisJCQkJICBFWFRFTlRfV1JJVEVCQUNLLCBHRlBfTk9GUyk7CisJCWlmIChleHRlbnRfb3AtPmRlbCkgeworCQkJdTY0IHVzZWQ7CisJCQlsaXN0X2RlbF9pbml0KCZleHRlbnRfb3AtPmxpc3QpOworCQkJdW5sb2NrX2V4dGVudCgmaW5mby0+ZXh0ZW50X2lucywgZXh0ZW50X29wLT5ieXRlbnIsCisJCQkJICAgICAgZXh0ZW50X29wLT5ieXRlbnIgKyBleHRlbnRfb3AtPm51bV9ieXRlcworCQkJCSAgICAgIC0gMSwgR0ZQX05PRlMpOworCisJCQltdXRleF9sb2NrKCZleHRlbnRfcm9vdC0+ZnNfaW5mby0+cGlubmVkX211dGV4KTsKKwkJCXJldCA9IHBpbl9kb3duX2J5dGVzKHRyYW5zLCBleHRlbnRfcm9vdCwKKwkJCQkJICAgICBleHRlbnRfb3AtPmJ5dGVuciwKKwkJCQkJICAgICBleHRlbnRfb3AtPm51bV9ieXRlcywgMCk7CisJCQltdXRleF91bmxvY2soJmV4dGVudF9yb290LT5mc19pbmZvLT5waW5uZWRfbXV0ZXgpOworCisJCQlzcGluX2xvY2soJmluZm8tPmRlbGFsbG9jX2xvY2spOworCQkJdXNlZCA9IGJ0cmZzX3N1cGVyX2J5dGVzX3VzZWQoJmluZm8tPnN1cGVyX2NvcHkpOworCQkJYnRyZnNfc2V0X3N1cGVyX2J5dGVzX3VzZWQoJmluZm8tPnN1cGVyX2NvcHksCisJCQkJCXVzZWQgLSBleHRlbnRfb3AtPm51bV9ieXRlcyk7CisJCQl1c2VkID0gYnRyZnNfcm9vdF91c2VkKCZleHRlbnRfcm9vdC0+cm9vdF9pdGVtKTsKKwkJCWJ0cmZzX3NldF9yb290X3VzZWQoJmV4dGVudF9yb290LT5yb290X2l0ZW0sCisJCQkJCXVzZWQgLSBleHRlbnRfb3AtPm51bV9ieXRlcyk7CisJCQlzcGluX3VubG9jaygmaW5mby0+ZGVsYWxsb2NfbG9jayk7CisKKwkJCXJldCA9IHVwZGF0ZV9ibG9ja19ncm91cCh0cmFucywgZXh0ZW50X3Jvb3QsCisJCQkJCQkgZXh0ZW50X29wLT5ieXRlbnIsCisJCQkJCQkgZXh0ZW50X29wLT5udW1fYnl0ZXMsCisJCQkJCQkgMCwgcmV0ID4gMCk7CisJCQlCVUdfT04ocmV0KTsKKwkJCWtmcmVlKGV4dGVudF9vcCk7CisJCQludW1faW5zZXJ0cy0tOworCQl9CisJfQorCW11dGV4X3VubG9jaygmaW5mby0+ZXh0ZW50X2luc19tdXRleCk7CisKKwlyZXQgPSBpbnNlcnRfZXh0ZW50cyh0cmFucywgZXh0ZW50X3Jvb3QsIHBhdGgsICZpbnNlcnRfbGlzdCwKKwkJCSAgICAgbnVtX2luc2VydHMpOworCUJVR19PTihyZXQpOworCisJLyoKKwkgKiBpZiB3ZSBicm9rZSBvdXQgb2YgdGhlIGxvb3AgaW4gb3JkZXIgdG8gaW5zZXJ0IHN0dWZmIGJlY2F1c2Ugd2UgaGl0CisJICogdGhlIG1heGltdW0gbnVtYmVyIG9mIGluc2VydHMgYXQgYSB0aW1lIHdlIGNhbiBoYW5kbGUsIHRoZW4gbG9vcAorCSAqIGJhY2sgYW5kIHBpY2sgdXAgd2hlcmUgd2UgbGVmdCBvZmYKKwkgKi8KKwlpZiAobnVtX2luc2VydHMgPT0gbWF4X2luc2VydHMpIHsKKwkJSU5JVF9MSVNUX0hFQUQoJmluc2VydF9saXN0KTsKKwkJSU5JVF9MSVNUX0hFQUQoJnVwZGF0ZV9saXN0KTsKKwkJbnVtX2luc2VydHMgPSAwOworCQlnb3RvIGFnYWluOworCX0KKworCS8qCisJICogYWdhaW4sIGlmIHdlIG5lZWQgdG8gbWFrZSBhYnNvbHV0ZWx5IHN1cmUgdGhlcmUgYXJlIG5vIG1vcmUgcGVuZGluZworCSAqIGV4dGVudCBvcGVyYXRpb25zIGxlZnQgYW5kIHdlIGtub3cgdGhhdCB3ZSBza2lwcGVkIHNvbWUsIGdvIGJhY2sgdG8KKwkgKiB0aGUgYmVnaW5uaW5nIGFuZCBkbyBpdCBhbGwgYWdhaW4KKwkgKi8KKwlpZiAoYWxsICYmIHNraXBwZWQpIHsKKwkJSU5JVF9MSVNUX0hFQUQoJmluc2VydF9saXN0KTsKKwkJSU5JVF9MSVNUX0hFQUQoJnVwZGF0ZV9saXN0KTsKKwkJc2VhcmNoID0gMDsKKwkJc2tpcHBlZCA9IDA7CisJCW51bV9pbnNlcnRzID0gMDsKKwkJZ290byBhZ2FpbjsKKwl9CitvdXQ6CisJYnRyZnNfZnJlZV9wYXRoKHBhdGgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBpbl9kb3duX2J5dGVzKHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAorCQkJICBzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwKKwkJCSAgdTY0IGJ5dGVuciwgdTY0IG51bV9ieXRlcywgaW50IGlzX2RhdGEpCit7CisJaW50IGVyciA9IDA7CisJc3RydWN0IGV4dGVudF9idWZmZXIgKmJ1ZjsKKworCWlmIChpc19kYXRhKQorCQlnb3RvIHBpbml0OworCisJYnVmID0gYnRyZnNfZmluZF90cmVlX2Jsb2NrKHJvb3QsIGJ5dGVuciwgbnVtX2J5dGVzKTsKKwlpZiAoIWJ1ZikKKwkJZ290byBwaW5pdDsKKworCS8qIHdlIGNhbiByZXVzZSBhIGJsb2NrIGlmIGl0IGhhc24ndCBiZWVuIHdyaXR0ZW4KKwkgKiBhbmQgaXQgaXMgZnJvbSB0aGlzIHRyYW5zYWN0aW9uLiAgV2UgY2FuJ3QKKwkgKiByZXVzZSBhbnl0aGluZyBmcm9tIHRoZSB0cmVlIGxvZyByb290IGJlY2F1c2UKKwkgKiBpdCBoYXMgdGlueSBzdWItdHJhbnNhY3Rpb25zLgorCSAqLworCWlmIChidHJmc19idWZmZXJfdXB0b2RhdGUoYnVmLCAwKSAmJgorCSAgICBidHJmc190cnlfdHJlZV9sb2NrKGJ1ZikpIHsKKwkJdTY0IGhlYWRlcl9vd25lciA9IGJ0cmZzX2hlYWRlcl9vd25lcihidWYpOworCQl1NjQgaGVhZGVyX3RyYW5zaWQgPSBidHJmc19oZWFkZXJfZ2VuZXJhdGlvbihidWYpOworCQlpZiAoaGVhZGVyX293bmVyICE9IEJUUkZTX1RSRUVfTE9HX09CSkVDVElEICYmCisJCSAgICBoZWFkZXJfb3duZXIgIT0gQlRSRlNfVFJFRV9SRUxPQ19PQkpFQ1RJRCAmJgorCQkgICAgaGVhZGVyX3RyYW5zaWQgPT0gdHJhbnMtPnRyYW5zaWQgJiYKKwkJICAgICFidHJmc19oZWFkZXJfZmxhZyhidWYsIEJUUkZTX0hFQURFUl9GTEFHX1dSSVRURU4pKSB7CisJCQljbGVhbl90cmVlX2Jsb2NrKE5VTEwsIHJvb3QsIGJ1Zik7CisJCQlidHJmc190cmVlX3VubG9jayhidWYpOworCQkJZnJlZV9leHRlbnRfYnVmZmVyKGJ1Zik7CisJCQlyZXR1cm4gMTsKKwkJfQorCQlidHJmc190cmVlX3VubG9jayhidWYpOworCX0KKwlmcmVlX2V4dGVudF9idWZmZXIoYnVmKTsKK3Bpbml0OgorCWJ0cmZzX3VwZGF0ZV9waW5uZWRfZXh0ZW50cyhyb290LCBieXRlbnIsIG51bV9ieXRlcywgMSk7CisKKwlCVUdfT04oZXJyIDwgMCk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiByZW1vdmUgYW4gZXh0ZW50IGZyb20gdGhlIHJvb3QsIHJldHVybnMgMCBvbiBzdWNjZXNzCisgKi8KK3N0YXRpYyBpbnQgX19mcmVlX2V4dGVudChzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKKwkJCSBzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwKKwkJCSB1NjQgYnl0ZW5yLCB1NjQgbnVtX2J5dGVzLCB1NjQgcGFyZW50LAorCQkJIHU2NCByb290X29iamVjdGlkLCB1NjQgcmVmX2dlbmVyYXRpb24sCisJCQkgdTY0IG93bmVyX29iamVjdGlkLCBpbnQgcGluLCBpbnQgbWFya19mcmVlKQoreworCXN0cnVjdCBidHJmc19wYXRoICpwYXRoOworCXN0cnVjdCBidHJmc19rZXkga2V5OworCXN0cnVjdCBidHJmc19mc19pbmZvICppbmZvID0gcm9vdC0+ZnNfaW5mbzsKKwlzdHJ1Y3QgYnRyZnNfcm9vdCAqZXh0ZW50X3Jvb3QgPSBpbmZvLT5leHRlbnRfcm9vdDsKKwlzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqbGVhZjsKKwlpbnQgcmV0OworCWludCBleHRlbnRfc2xvdCA9IDA7CisJaW50IGZvdW5kX2V4dGVudCA9IDA7CisJaW50IG51bV90b19kZWwgPSAxOworCXN0cnVjdCBidHJmc19leHRlbnRfaXRlbSAqZWk7CisJdTMyIHJlZnM7CisKKwlrZXkub2JqZWN0aWQgPSBieXRlbnI7CisJYnRyZnNfc2V0X2tleV90eXBlKCZrZXksIEJUUkZTX0VYVEVOVF9JVEVNX0tFWSk7CisJa2V5Lm9mZnNldCA9IG51bV9ieXRlczsKKwlwYXRoID0gYnRyZnNfYWxsb2NfcGF0aCgpOworCWlmICghcGF0aCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlwYXRoLT5yZWFkYSA9IDE7CisJcmV0ID0gbG9va3VwX2V4dGVudF9iYWNrcmVmKHRyYW5zLCBleHRlbnRfcm9vdCwgcGF0aCwKKwkJCQkgICAgYnl0ZW5yLCBwYXJlbnQsIHJvb3Rfb2JqZWN0aWQsCisJCQkJICAgIHJlZl9nZW5lcmF0aW9uLCBvd25lcl9vYmplY3RpZCwgMSk7CisJaWYgKHJldCA9PSAwKSB7CisJCXN0cnVjdCBidHJmc19rZXkgZm91bmRfa2V5OworCQlleHRlbnRfc2xvdCA9IHBhdGgtPnNsb3RzWzBdOworCQl3aGlsZSAoZXh0ZW50X3Nsb3QgPiAwKSB7CisJCQlleHRlbnRfc2xvdC0tOworCQkJYnRyZnNfaXRlbV9rZXlfdG9fY3B1KHBhdGgtPm5vZGVzWzBdLCAmZm91bmRfa2V5LAorCQkJCQkgICAgICBleHRlbnRfc2xvdCk7CisJCQlpZiAoZm91bmRfa2V5Lm9iamVjdGlkICE9IGJ5dGVucikKKwkJCQlicmVhazsKKwkJCWlmIChmb3VuZF9rZXkudHlwZSA9PSBCVFJGU19FWFRFTlRfSVRFTV9LRVkgJiYKKwkJCSAgICBmb3VuZF9rZXkub2Zmc2V0ID09IG51bV9ieXRlcykgeworCQkJCWZvdW5kX2V4dGVudCA9IDE7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAocGF0aC0+c2xvdHNbMF0gLSBleHRlbnRfc2xvdCA+IDUpCisJCQkJYnJlYWs7CisJCX0KKwkJaWYgKCFmb3VuZF9leHRlbnQpIHsKKwkJCXJldCA9IHJlbW92ZV9leHRlbnRfYmFja3JlZih0cmFucywgZXh0ZW50X3Jvb3QsIHBhdGgpOworCQkJQlVHX09OKHJldCk7CisJCQlidHJmc19yZWxlYXNlX3BhdGgoZXh0ZW50X3Jvb3QsIHBhdGgpOworCQkJcmV0ID0gYnRyZnNfc2VhcmNoX3Nsb3QodHJhbnMsIGV4dGVudF9yb290LAorCQkJCQkJJmtleSwgcGF0aCwgLTEsIDEpOworCQkJaWYgKHJldCkgeworCQkJCXByaW50ayhLRVJOX0VSUiAidW1tLCBnb3QgJWQgYmFjayBmcm9tIHNlYXJjaCIKKwkJCQkgICAgICAgIiwgd2FzIGxvb2tpbmcgZm9yICVsbHVcbiIsIHJldCwKKwkJCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylieXRlbnIpOworCQkJCWJ0cmZzX3ByaW50X2xlYWYoZXh0ZW50X3Jvb3QsIHBhdGgtPm5vZGVzWzBdKTsKKwkJCX0KKwkJCUJVR19PTihyZXQpOworCQkJZXh0ZW50X3Nsb3QgPSBwYXRoLT5zbG90c1swXTsKKwkJfQorCX0gZWxzZSB7CisJCWJ0cmZzX3ByaW50X2xlYWYoZXh0ZW50X3Jvb3QsIHBhdGgtPm5vZGVzWzBdKTsKKwkJV0FSTl9PTigxKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJidHJmcyB1bmFibGUgdG8gZmluZCByZWYgYnl0ZSBuciAlbGx1ICIKKwkJICAgICAgICJyb290ICVsbHUgZ2VuICVsbHUgb3duZXIgJWxsdVxuIiwKKwkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpYnl0ZW5yLAorCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylyb290X29iamVjdGlkLAorCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylyZWZfZ2VuZXJhdGlvbiwKKwkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpb3duZXJfb2JqZWN0aWQpOworCX0KKworCWxlYWYgPSBwYXRoLT5ub2Rlc1swXTsKKwllaSA9IGJ0cmZzX2l0ZW1fcHRyKGxlYWYsIGV4dGVudF9zbG90LAorCQkJICAgIHN0cnVjdCBidHJmc19leHRlbnRfaXRlbSk7CisJcmVmcyA9IGJ0cmZzX2V4dGVudF9yZWZzKGxlYWYsIGVpKTsKKwlCVUdfT04ocmVmcyA9PSAwKTsKKwlyZWZzIC09IDE7CisJYnRyZnNfc2V0X2V4dGVudF9yZWZzKGxlYWYsIGVpLCByZWZzKTsKKworCWJ0cmZzX21hcmtfYnVmZmVyX2RpcnR5KGxlYWYpOworCisJaWYgKHJlZnMgPT0gMCAmJiBmb3VuZF9leHRlbnQgJiYgcGF0aC0+c2xvdHNbMF0gPT0gZXh0ZW50X3Nsb3QgKyAxKSB7CisJCXN0cnVjdCBidHJmc19leHRlbnRfcmVmICpyZWY7CisJCXJlZiA9IGJ0cmZzX2l0ZW1fcHRyKGxlYWYsIHBhdGgtPnNsb3RzWzBdLAorCQkJCSAgICAgc3RydWN0IGJ0cmZzX2V4dGVudF9yZWYpOworCQlCVUdfT04oYnRyZnNfcmVmX251bV9yZWZzKGxlYWYsIHJlZikgIT0gMSk7CisJCS8qIGlmIHRoZSBiYWNrIHJlZiBhbmQgdGhlIGV4dGVudCBhcmUgbmV4dCB0byBlYWNoIG90aGVyCisJCSAqIHRoZXkgZ2V0IGRlbGV0ZWQgYmVsb3cgaW4gb25lIHNob3QKKwkJICovCisJCXBhdGgtPnNsb3RzWzBdID0gZXh0ZW50X3Nsb3Q7CisJCW51bV90b19kZWwgPSAyOworCX0gZWxzZSBpZiAoZm91bmRfZXh0ZW50KSB7CisJCS8qIG90aGVyd2lzZSBkZWxldGUgdGhlIGV4dGVudCBiYWNrIHJlZiAqLworCQlyZXQgPSByZW1vdmVfZXh0ZW50X2JhY2tyZWYodHJhbnMsIGV4dGVudF9yb290LCBwYXRoKTsKKwkJQlVHX09OKHJldCk7CisJCS8qIGlmIHJlZnMgYXJlIDAsIHdlIG5lZWQgdG8gc2V0dXAgdGhlIHBhdGggZm9yIGRlbGV0aW9uICovCisJCWlmIChyZWZzID09IDApIHsKKwkJCWJ0cmZzX3JlbGVhc2VfcGF0aChleHRlbnRfcm9vdCwgcGF0aCk7CisJCQlyZXQgPSBidHJmc19zZWFyY2hfc2xvdCh0cmFucywgZXh0ZW50X3Jvb3QsICZrZXksIHBhdGgsCisJCQkJCQktMSwgMSk7CisJCQlCVUdfT04ocmV0KTsKKwkJfQorCX0KKworCWlmIChyZWZzID09IDApIHsKKwkJdTY0IHN1cGVyX3VzZWQ7CisJCXU2NCByb290X3VzZWQ7CisKKwkJaWYgKHBpbikgeworCQkJbXV0ZXhfbG9jaygmcm9vdC0+ZnNfaW5mby0+cGlubmVkX211dGV4KTsKKwkJCXJldCA9IHBpbl9kb3duX2J5dGVzKHRyYW5zLCByb290LCBieXRlbnIsIG51bV9ieXRlcywKKwkJCQlvd25lcl9vYmplY3RpZCA+PSBCVFJGU19GSVJTVF9GUkVFX09CSkVDVElEKTsKKwkJCW11dGV4X3VubG9jaygmcm9vdC0+ZnNfaW5mby0+cGlubmVkX211dGV4KTsKKwkJCWlmIChyZXQgPiAwKQorCQkJCW1hcmtfZnJlZSA9IDE7CisJCQlCVUdfT04ocmV0IDwgMCk7CisJCX0KKwkJLyogYmxvY2sgYWNjb3VudGluZyBmb3Igc3VwZXIgYmxvY2sgKi8KKwkJc3Bpbl9sb2NrKCZpbmZvLT5kZWxhbGxvY19sb2NrKTsKKwkJc3VwZXJfdXNlZCA9IGJ0cmZzX3N1cGVyX2J5dGVzX3VzZWQoJmluZm8tPnN1cGVyX2NvcHkpOworCQlidHJmc19zZXRfc3VwZXJfYnl0ZXNfdXNlZCgmaW5mby0+c3VwZXJfY29weSwKKwkJCQkJICAgc3VwZXJfdXNlZCAtIG51bV9ieXRlcyk7CisKKwkJLyogYmxvY2sgYWNjb3VudGluZyBmb3Igcm9vdCBpdGVtICovCisJCXJvb3RfdXNlZCA9IGJ0cmZzX3Jvb3RfdXNlZCgmcm9vdC0+cm9vdF9pdGVtKTsKKwkJYnRyZnNfc2V0X3Jvb3RfdXNlZCgmcm9vdC0+cm9vdF9pdGVtLAorCQkJCQkgICByb290X3VzZWQgLSBudW1fYnl0ZXMpOworCQlzcGluX3VubG9jaygmaW5mby0+ZGVsYWxsb2NfbG9jayk7CisJCXJldCA9IGJ0cmZzX2RlbF9pdGVtcyh0cmFucywgZXh0ZW50X3Jvb3QsIHBhdGgsIHBhdGgtPnNsb3RzWzBdLAorCQkJCSAgICAgIG51bV90b19kZWwpOworCQlCVUdfT04ocmV0KTsKKwkJYnRyZnNfcmVsZWFzZV9wYXRoKGV4dGVudF9yb290LCBwYXRoKTsKKworCQlpZiAob3duZXJfb2JqZWN0aWQgPj0gQlRSRlNfRklSU1RfRlJFRV9PQkpFQ1RJRCkgeworCQkJcmV0ID0gYnRyZnNfZGVsX2NzdW1zKHRyYW5zLCByb290LCBieXRlbnIsIG51bV9ieXRlcyk7CisJCQlCVUdfT04ocmV0KTsKKwkJfQorCisJCXJldCA9IHVwZGF0ZV9ibG9ja19ncm91cCh0cmFucywgcm9vdCwgYnl0ZW5yLCBudW1fYnl0ZXMsIDAsCisJCQkJCSBtYXJrX2ZyZWUpOworCQlCVUdfT04ocmV0KTsKKwl9CisJYnRyZnNfZnJlZV9wYXRoKHBhdGgpOworCWZpbmlzaF9jdXJyZW50X2luc2VydCh0cmFucywgZXh0ZW50X3Jvb3QsIDApOworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBmaW5kIGFsbCB0aGUgYmxvY2tzIG1hcmtlZCBhcyBwZW5kaW5nIGluIHRoZSByYWRpeCB0cmVlIGFuZCByZW1vdmUKKyAqIHRoZW0gZnJvbSB0aGUgZXh0ZW50IG1hcAorICovCitzdGF0aWMgaW50IGRlbF9wZW5kaW5nX2V4dGVudHMoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCisJCQkgICAgICAgc3RydWN0IGJ0cmZzX3Jvb3QgKmV4dGVudF9yb290LCBpbnQgYWxsKQoreworCWludCByZXQ7CisJaW50IGVyciA9IDA7CisJdTY0IHN0YXJ0OworCXU2NCBlbmQ7CisJdTY0IHByaXY7CisJdTY0IHNlYXJjaCA9IDA7CisJaW50IG5yID0gMCwgc2tpcHBlZCA9IDA7CisJc3RydWN0IGV4dGVudF9pb190cmVlICpwZW5kaW5nX2RlbDsKKwlzdHJ1Y3QgZXh0ZW50X2lvX3RyZWUgKmV4dGVudF9pbnM7CisJc3RydWN0IHBlbmRpbmdfZXh0ZW50X29wICpleHRlbnRfb3A7CisJc3RydWN0IGJ0cmZzX2ZzX2luZm8gKmluZm8gPSBleHRlbnRfcm9vdC0+ZnNfaW5mbzsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGRlbGV0ZV9saXN0OworCisJSU5JVF9MSVNUX0hFQUQoJmRlbGV0ZV9saXN0KTsKKwlleHRlbnRfaW5zID0gJmV4dGVudF9yb290LT5mc19pbmZvLT5leHRlbnRfaW5zOworCXBlbmRpbmdfZGVsID0gJmV4dGVudF9yb290LT5mc19pbmZvLT5wZW5kaW5nX2RlbDsKKworYWdhaW46CisJbXV0ZXhfbG9jaygmaW5mby0+ZXh0ZW50X2luc19tdXRleCk7CisJd2hpbGUgKDEpIHsKKwkJcmV0ID0gZmluZF9maXJzdF9leHRlbnRfYml0KHBlbmRpbmdfZGVsLCBzZWFyY2gsICZzdGFydCwgJmVuZCwKKwkJCQkJICAgIEVYVEVOVF9XUklURUJBQ0spOworCQlpZiAocmV0KSB7CisJCQlpZiAoYWxsICYmIHNraXBwZWQgJiYgIW5yKSB7CisJCQkJc2VhcmNoID0gMDsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCW11dGV4X3VubG9jaygmaW5mby0+ZXh0ZW50X2luc19tdXRleCk7CisJCQlicmVhazsKKwkJfQorCisJCXJldCA9IHRyeV9sb2NrX2V4dGVudChleHRlbnRfaW5zLCBzdGFydCwgZW5kLCBHRlBfTk9GUyk7CisJCWlmICghcmV0KSB7CisJCQlzZWFyY2ggPSBlbmQrMTsKKwkJCXNraXBwZWQgPSAxOworCisJCQlpZiAobmVlZF9yZXNjaGVkKCkpIHsKKwkJCQltdXRleF91bmxvY2soJmluZm8tPmV4dGVudF9pbnNfbXV0ZXgpOworCQkJCWNvbmRfcmVzY2hlZCgpOworCQkJCW11dGV4X2xvY2soJmluZm8tPmV4dGVudF9pbnNfbXV0ZXgpOworCQkJfQorCisJCQljb250aW51ZTsKKwkJfQorCQlCVUdfT04ocmV0IDwgMCk7CisKKwkJcmV0ID0gZ2V0X3N0YXRlX3ByaXZhdGUocGVuZGluZ19kZWwsIHN0YXJ0LCAmcHJpdik7CisJCUJVR19PTihyZXQpOworCQlleHRlbnRfb3AgPSAoc3RydWN0IHBlbmRpbmdfZXh0ZW50X29wICopKHVuc2lnbmVkIGxvbmcpcHJpdjsKKworCQljbGVhcl9leHRlbnRfYml0cyhwZW5kaW5nX2RlbCwgc3RhcnQsIGVuZCwgRVhURU5UX1dSSVRFQkFDSywKKwkJCQkgIEdGUF9OT0ZTKTsKKwkJaWYgKCF0ZXN0X3JhbmdlX2JpdChleHRlbnRfaW5zLCBzdGFydCwgZW5kLAorCQkJCSAgICBFWFRFTlRfV1JJVEVCQUNLLCAwKSkgeworCQkJbGlzdF9hZGRfdGFpbCgmZXh0ZW50X29wLT5saXN0LCAmZGVsZXRlX2xpc3QpOworCQkJbnIrKzsKKwkJfSBlbHNlIHsKKwkJCWtmcmVlKGV4dGVudF9vcCk7CisKKwkJCXJldCA9IGdldF9zdGF0ZV9wcml2YXRlKCZpbmZvLT5leHRlbnRfaW5zLCBzdGFydCwKKwkJCQkJCSZwcml2KTsKKwkJCUJVR19PTihyZXQpOworCQkJZXh0ZW50X29wID0gKHN0cnVjdCBwZW5kaW5nX2V4dGVudF9vcCAqKQorCQkJCQkJKHVuc2lnbmVkIGxvbmcpcHJpdjsKKworCQkJY2xlYXJfZXh0ZW50X2JpdHMoJmluZm8tPmV4dGVudF9pbnMsIHN0YXJ0LCBlbmQsCisJCQkJCSAgRVhURU5UX1dSSVRFQkFDSywgR0ZQX05PRlMpOworCisJCQlpZiAoZXh0ZW50X29wLT50eXBlID09IFBFTkRJTkdfQkFDS1JFRl9VUERBVEUpIHsKKwkJCQlsaXN0X2FkZF90YWlsKCZleHRlbnRfb3AtPmxpc3QsICZkZWxldGVfbGlzdCk7CisJCQkJc2VhcmNoID0gZW5kICsgMTsKKwkJCQlucisrOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQltdXRleF9sb2NrKCZleHRlbnRfcm9vdC0+ZnNfaW5mby0+cGlubmVkX211dGV4KTsKKwkJCXJldCA9IHBpbl9kb3duX2J5dGVzKHRyYW5zLCBleHRlbnRfcm9vdCwgc3RhcnQsCisJCQkJCSAgICAgZW5kICsgMSAtIHN0YXJ0LCAwKTsKKwkJCW11dGV4X3VubG9jaygmZXh0ZW50X3Jvb3QtPmZzX2luZm8tPnBpbm5lZF9tdXRleCk7CisKKwkJCXJldCA9IHVwZGF0ZV9ibG9ja19ncm91cCh0cmFucywgZXh0ZW50X3Jvb3QsIHN0YXJ0LAorCQkJCQkJZW5kICsgMSAtIHN0YXJ0LCAwLCByZXQgPiAwKTsKKworCQkJdW5sb2NrX2V4dGVudChleHRlbnRfaW5zLCBzdGFydCwgZW5kLCBHRlBfTk9GUyk7CisJCQlCVUdfT04ocmV0KTsKKwkJCWtmcmVlKGV4dGVudF9vcCk7CisJCX0KKwkJaWYgKHJldCkKKwkJCWVyciA9IHJldDsKKworCQlzZWFyY2ggPSBlbmQgKyAxOworCisJCWlmIChuZWVkX3Jlc2NoZWQoKSkgeworCQkJbXV0ZXhfdW5sb2NrKCZpbmZvLT5leHRlbnRfaW5zX211dGV4KTsKKwkJCWNvbmRfcmVzY2hlZCgpOworCQkJbXV0ZXhfbG9jaygmaW5mby0+ZXh0ZW50X2luc19tdXRleCk7CisJCX0KKwl9CisKKwlpZiAobnIpIHsKKwkJcmV0ID0gZnJlZV9leHRlbnRzKHRyYW5zLCBleHRlbnRfcm9vdCwgJmRlbGV0ZV9saXN0KTsKKwkJQlVHX09OKHJldCk7CisJfQorCisJaWYgKGFsbCAmJiBza2lwcGVkKSB7CisJCUlOSVRfTElTVF9IRUFEKCZkZWxldGVfbGlzdCk7CisJCXNlYXJjaCA9IDA7CisJCW5yID0gMDsKKwkJZ290byBhZ2FpbjsKKwl9CisKKwlyZXR1cm4gZXJyOworfQorCisvKgorICogcmVtb3ZlIGFuIGV4dGVudCBmcm9tIHRoZSByb290LCByZXR1cm5zIDAgb24gc3VjY2VzcworICovCitzdGF0aWMgaW50IF9fYnRyZnNfZnJlZV9leHRlbnQoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCisJCQkgICAgICAgc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsCisJCQkgICAgICAgdTY0IGJ5dGVuciwgdTY0IG51bV9ieXRlcywgdTY0IHBhcmVudCwKKwkJCSAgICAgICB1NjQgcm9vdF9vYmplY3RpZCwgdTY0IHJlZl9nZW5lcmF0aW9uLAorCQkJICAgICAgIHU2NCBvd25lcl9vYmplY3RpZCwgaW50IHBpbikKK3sKKwlzdHJ1Y3QgYnRyZnNfcm9vdCAqZXh0ZW50X3Jvb3QgPSByb290LT5mc19pbmZvLT5leHRlbnRfcm9vdDsKKwlpbnQgcGVuZGluZ19yZXQ7CisJaW50IHJldDsKKworCVdBUk5fT04obnVtX2J5dGVzIDwgcm9vdC0+c2VjdG9yc2l6ZSk7CisJaWYgKHJvb3QgPT0gZXh0ZW50X3Jvb3QpIHsKKwkJc3RydWN0IHBlbmRpbmdfZXh0ZW50X29wICpleHRlbnRfb3AgPSBOVUxMOworCisJCW11dGV4X2xvY2soJnJvb3QtPmZzX2luZm8tPmV4dGVudF9pbnNfbXV0ZXgpOworCQlpZiAodGVzdF9yYW5nZV9iaXQoJnJvb3QtPmZzX2luZm8tPmV4dGVudF9pbnMsIGJ5dGVuciwKKwkJCQlieXRlbnIgKyBudW1fYnl0ZXMgLSAxLCBFWFRFTlRfV1JJVEVCQUNLLCAwKSkgeworCQkJdTY0IHByaXY7CisJCQlyZXQgPSBnZXRfc3RhdGVfcHJpdmF0ZSgmcm9vdC0+ZnNfaW5mby0+ZXh0ZW50X2lucywKKwkJCQkJCWJ5dGVuciwgJnByaXYpOworCQkJQlVHX09OKHJldCk7CisJCQlleHRlbnRfb3AgPSAoc3RydWN0IHBlbmRpbmdfZXh0ZW50X29wICopCisJCQkJCQkodW5zaWduZWQgbG9uZylwcml2OworCisJCQlleHRlbnRfb3AtPmRlbCA9IDE7CisJCQlpZiAoZXh0ZW50X29wLT50eXBlID09IFBFTkRJTkdfRVhURU5UX0lOU0VSVCkgeworCQkJCW11dGV4X3VubG9jaygmcm9vdC0+ZnNfaW5mby0+ZXh0ZW50X2luc19tdXRleCk7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCX0KKworCQlpZiAoZXh0ZW50X29wKSB7CisJCQlyZWZfZ2VuZXJhdGlvbiA9IGV4dGVudF9vcC0+b3JpZ19nZW5lcmF0aW9uOworCQkJcGFyZW50ID0gZXh0ZW50X29wLT5vcmlnX3BhcmVudDsKKwkJfQorCisJCWV4dGVudF9vcCA9IGttYWxsb2Moc2l6ZW9mKCpleHRlbnRfb3ApLCBHRlBfTk9GUyk7CisJCUJVR19PTighZXh0ZW50X29wKTsKKworCQlleHRlbnRfb3AtPnR5cGUgPSBQRU5ESU5HX0VYVEVOVF9ERUxFVEU7CisJCWV4dGVudF9vcC0+Ynl0ZW5yID0gYnl0ZW5yOworCQlleHRlbnRfb3AtPm51bV9ieXRlcyA9IG51bV9ieXRlczsKKwkJZXh0ZW50X29wLT5wYXJlbnQgPSBwYXJlbnQ7CisJCWV4dGVudF9vcC0+b3JpZ19wYXJlbnQgPSBwYXJlbnQ7CisJCWV4dGVudF9vcC0+Z2VuZXJhdGlvbiA9IHJlZl9nZW5lcmF0aW9uOworCQlleHRlbnRfb3AtPm9yaWdfZ2VuZXJhdGlvbiA9IHJlZl9nZW5lcmF0aW9uOworCQlleHRlbnRfb3AtPmxldmVsID0gKGludClvd25lcl9vYmplY3RpZDsKKwkJSU5JVF9MSVNUX0hFQUQoJmV4dGVudF9vcC0+bGlzdCk7CisJCWV4dGVudF9vcC0+ZGVsID0gMDsKKworCQlzZXRfZXh0ZW50X2JpdHMoJnJvb3QtPmZzX2luZm8tPnBlbmRpbmdfZGVsLAorCQkJCWJ5dGVuciwgYnl0ZW5yICsgbnVtX2J5dGVzIC0gMSwKKwkJCQlFWFRFTlRfV1JJVEVCQUNLLCBHRlBfTk9GUyk7CisJCXNldF9zdGF0ZV9wcml2YXRlKCZyb290LT5mc19pbmZvLT5wZW5kaW5nX2RlbCwKKwkJCQkgIGJ5dGVuciwgKHVuc2lnbmVkIGxvbmcpZXh0ZW50X29wKTsKKwkJbXV0ZXhfdW5sb2NrKCZyb290LT5mc19pbmZvLT5leHRlbnRfaW5zX211dGV4KTsKKwkJcmV0dXJuIDA7CisJfQorCS8qIGlmIG1ldGFkYXRhIGFsd2F5cyBwaW4gKi8KKwlpZiAob3duZXJfb2JqZWN0aWQgPCBCVFJGU19GSVJTVF9GUkVFX09CSkVDVElEKSB7CisJCWlmIChyb290LT5yb290X2tleS5vYmplY3RpZCA9PSBCVFJGU19UUkVFX0xPR19PQkpFQ1RJRCkgeworCQkJc3RydWN0IGJ0cmZzX2Jsb2NrX2dyb3VwX2NhY2hlICpjYWNoZTsKKworCQkJLyogYnRyZnNfZnJlZV9yZXNlcnZlZF9leHRlbnQgKi8KKwkJCWNhY2hlID0gYnRyZnNfbG9va3VwX2Jsb2NrX2dyb3VwKHJvb3QtPmZzX2luZm8sIGJ5dGVucik7CisJCQlCVUdfT04oIWNhY2hlKTsKKwkJCWJ0cmZzX2FkZF9mcmVlX3NwYWNlKGNhY2hlLCBieXRlbnIsIG51bV9ieXRlcyk7CisJCQlwdXRfYmxvY2tfZ3JvdXAoY2FjaGUpOworCQkJdXBkYXRlX3Jlc2VydmVkX2V4dGVudHMocm9vdCwgYnl0ZW5yLCBudW1fYnl0ZXMsIDApOworCQkJcmV0dXJuIDA7CisJCX0KKwkJcGluID0gMTsKKwl9CisKKwkvKiBpZiBkYXRhIHBpbiB3aGVuIGFueSB0cmFuc2FjdGlvbiBoYXMgY29tbWl0dGVkIHRoaXMgKi8KKwlpZiAocmVmX2dlbmVyYXRpb24gIT0gdHJhbnMtPnRyYW5zaWQpCisJCXBpbiA9IDE7CisKKwlyZXQgPSBfX2ZyZWVfZXh0ZW50KHRyYW5zLCByb290LCBieXRlbnIsIG51bV9ieXRlcywgcGFyZW50LAorCQkJICAgIHJvb3Rfb2JqZWN0aWQsIHJlZl9nZW5lcmF0aW9uLAorCQkJICAgIG93bmVyX29iamVjdGlkLCBwaW4sIHBpbiA9PSAwKTsKKworCWZpbmlzaF9jdXJyZW50X2luc2VydCh0cmFucywgcm9vdC0+ZnNfaW5mby0+ZXh0ZW50X3Jvb3QsIDApOworCXBlbmRpbmdfcmV0ID0gZGVsX3BlbmRpbmdfZXh0ZW50cyh0cmFucywgcm9vdC0+ZnNfaW5mby0+ZXh0ZW50X3Jvb3QsIDApOworCXJldHVybiByZXQgPyByZXQgOiBwZW5kaW5nX3JldDsKK30KKworaW50IGJ0cmZzX2ZyZWVfZXh0ZW50KHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAorCQkgICAgICBzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwKKwkJICAgICAgdTY0IGJ5dGVuciwgdTY0IG51bV9ieXRlcywgdTY0IHBhcmVudCwKKwkJICAgICAgdTY0IHJvb3Rfb2JqZWN0aWQsIHU2NCByZWZfZ2VuZXJhdGlvbiwKKwkJICAgICAgdTY0IG93bmVyX29iamVjdGlkLCBpbnQgcGluKQoreworCWludCByZXQ7CisKKwlyZXQgPSBfX2J0cmZzX2ZyZWVfZXh0ZW50KHRyYW5zLCByb290LCBieXRlbnIsIG51bV9ieXRlcywgcGFyZW50LAorCQkJCSAgcm9vdF9vYmplY3RpZCwgcmVmX2dlbmVyYXRpb24sCisJCQkJICBvd25lcl9vYmplY3RpZCwgcGluKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdTY0IHN0cmlwZV9hbGlnbihzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwgdTY0IHZhbCkKK3sKKwl1NjQgbWFzayA9ICgodTY0KXJvb3QtPnN0cmlwZXNpemUgLSAxKTsKKwl1NjQgcmV0ID0gKHZhbCArIG1hc2spICYgfm1hc2s7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIHdhbGtzIHRoZSBidHJlZSBvZiBhbGxvY2F0ZWQgZXh0ZW50cyBhbmQgZmluZCBhIGhvbGUgb2YgYSBnaXZlbiBzaXplLgorICogVGhlIGtleSBpbnMgaXMgY2hhbmdlZCB0byByZWNvcmQgdGhlIGhvbGU6CisgKiBpbnMtPm9iamVjdGlkID09IGJsb2NrIHN0YXJ0CisgKiBpbnMtPmZsYWdzID0gQlRSRlNfRVhURU5UX0lURU1fS0VZCisgKiBpbnMtPm9mZnNldCA9PSBudW1iZXIgb2YgYmxvY2tzCisgKiBBbnkgYXZhaWxhYmxlIGJsb2NrcyBiZWZvcmUgc2VhcmNoX3N0YXJ0IGFyZSBza2lwcGVkLgorICovCitzdGF0aWMgbm9pbmxpbmUgaW50IGZpbmRfZnJlZV9leHRlbnQoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCisJCQkJICAgICBzdHJ1Y3QgYnRyZnNfcm9vdCAqb3JpZ19yb290LAorCQkJCSAgICAgdTY0IG51bV9ieXRlcywgdTY0IGVtcHR5X3NpemUsCisJCQkJICAgICB1NjQgc2VhcmNoX3N0YXJ0LCB1NjQgc2VhcmNoX2VuZCwKKwkJCQkgICAgIHU2NCBoaW50X2J5dGUsIHN0cnVjdCBidHJmc19rZXkgKmlucywKKwkJCQkgICAgIHU2NCBleGNsdWRlX3N0YXJ0LCB1NjQgZXhjbHVkZV9uciwKKwkJCQkgICAgIGludCBkYXRhKQoreworCWludCByZXQgPSAwOworCXN0cnVjdCBidHJmc19yb290ICpyb290ID0gb3JpZ19yb290LT5mc19pbmZvLT5leHRlbnRfcm9vdDsKKwl1NjQgdG90YWxfbmVlZGVkID0gbnVtX2J5dGVzOworCXU2NCAqbGFzdF9wdHIgPSBOVUxMOworCXU2NCBsYXN0X3dhbnRlZCA9IDA7CisJc3RydWN0IGJ0cmZzX2Jsb2NrX2dyb3VwX2NhY2hlICpibG9ja19ncm91cCA9IE5VTEw7CisJaW50IGNodW5rX2FsbG9jX2RvbmUgPSAwOworCWludCBlbXB0eV9jbHVzdGVyID0gMiAqIDEwMjQgKiAxMDI0OworCWludCBhbGxvd2VkX2NodW5rX2FsbG9jID0gMDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkID0gTlVMTCwgKmN1ciA9IE5VTEw7CisJaW50IGxvb3AgPSAwOworCWludCBleHRyYV9sb29wID0gMDsKKwlzdHJ1Y3QgYnRyZnNfc3BhY2VfaW5mbyAqc3BhY2VfaW5mbzsKKworCVdBUk5fT04obnVtX2J5dGVzIDwgcm9vdC0+c2VjdG9yc2l6ZSk7CisJYnRyZnNfc2V0X2tleV90eXBlKGlucywgQlRSRlNfRVhURU5UX0lURU1fS0VZKTsKKwlpbnMtPm9iamVjdGlkID0gMDsKKwlpbnMtPm9mZnNldCA9IDA7CisKKwlpZiAob3JpZ19yb290LT5yZWZfY293cyB8fCBlbXB0eV9zaXplKQorCQlhbGxvd2VkX2NodW5rX2FsbG9jID0gMTsKKworCWlmIChkYXRhICYgQlRSRlNfQkxPQ0tfR1JPVVBfTUVUQURBVEEpIHsKKwkJbGFzdF9wdHIgPSAmcm9vdC0+ZnNfaW5mby0+bGFzdF9hbGxvYzsKKwkJZW1wdHlfY2x1c3RlciA9IDY0ICogMTAyNDsKKwl9CisKKwlpZiAoKGRhdGEgJiBCVFJGU19CTE9DS19HUk9VUF9EQVRBKSAmJiBidHJmc190ZXN0X29wdChyb290LCBTU0QpKQorCQlsYXN0X3B0ciA9ICZyb290LT5mc19pbmZvLT5sYXN0X2RhdGFfYWxsb2M7CisKKwlpZiAobGFzdF9wdHIpIHsKKwkJaWYgKCpsYXN0X3B0cikgeworCQkJaGludF9ieXRlID0gKmxhc3RfcHRyOworCQkJbGFzdF93YW50ZWQgPSAqbGFzdF9wdHI7CisJCX0gZWxzZQorCQkJZW1wdHlfc2l6ZSArPSBlbXB0eV9jbHVzdGVyOworCX0gZWxzZSB7CisJCWVtcHR5X2NsdXN0ZXIgPSAwOworCX0KKwlzZWFyY2hfc3RhcnQgPSBtYXgoc2VhcmNoX3N0YXJ0LCBmaXJzdF9sb2dpY2FsX2J5dGUocm9vdCwgMCkpOworCXNlYXJjaF9zdGFydCA9IG1heChzZWFyY2hfc3RhcnQsIGhpbnRfYnl0ZSk7CisKKwlpZiAobGFzdF93YW50ZWQgJiYgc2VhcmNoX3N0YXJ0ICE9IGxhc3Rfd2FudGVkKSB7CisJCWxhc3Rfd2FudGVkID0gMDsKKwkJZW1wdHlfc2l6ZSArPSBlbXB0eV9jbHVzdGVyOworCX0KKworCXRvdGFsX25lZWRlZCArPSBlbXB0eV9zaXplOworCWJsb2NrX2dyb3VwID0gYnRyZnNfbG9va3VwX2Jsb2NrX2dyb3VwKHJvb3QtPmZzX2luZm8sIHNlYXJjaF9zdGFydCk7CisJaWYgKCFibG9ja19ncm91cCkKKwkJYmxvY2tfZ3JvdXAgPSBidHJmc19sb29rdXBfZmlyc3RfYmxvY2tfZ3JvdXAocm9vdC0+ZnNfaW5mbywKKwkJCQkJCQkgICAgIHNlYXJjaF9zdGFydCk7CisJc3BhY2VfaW5mbyA9IF9fZmluZF9zcGFjZV9pbmZvKHJvb3QtPmZzX2luZm8sIGRhdGEpOworCisJZG93bl9yZWFkKCZzcGFjZV9pbmZvLT5ncm91cHNfc2VtKTsKKwl3aGlsZSAoMSkgeworCQlzdHJ1Y3QgYnRyZnNfZnJlZV9zcGFjZSAqZnJlZV9zcGFjZTsKKwkJLyoKKwkJICogdGhlIG9ubHkgd2F5IHRoaXMgaGFwcGVucyBpZiBvdXIgaGludCBwb2ludHMgdG8gYSBibG9jaworCQkgKiBncm91cCB0aGF0cyBub3Qgb2YgdGhlIHByb3BlciB0eXBlLCB3aGlsZSBsb29waW5nIHRoaXMKKwkJICogc2hvdWxkIG5ldmVyIGhhcHBlbgorCQkgKi8KKwkJaWYgKGVtcHR5X3NpemUpCisJCQlleHRyYV9sb29wID0gMTsKKworCQlpZiAoIWJsb2NrX2dyb3VwKQorCQkJZ290byBuZXdfZ3JvdXBfbm9fbG9jazsKKworCQlpZiAodW5saWtlbHkoIWJsb2NrX2dyb3VwLT5jYWNoZWQpKSB7CisJCQltdXRleF9sb2NrKCZibG9ja19ncm91cC0+Y2FjaGVfbXV0ZXgpOworCQkJcmV0ID0gY2FjaGVfYmxvY2tfZ3JvdXAocm9vdCwgYmxvY2tfZ3JvdXApOworCQkJbXV0ZXhfdW5sb2NrKCZibG9ja19ncm91cC0+Y2FjaGVfbXV0ZXgpOworCQkJaWYgKHJldCkKKwkJCQlicmVhazsKKwkJfQorCisJCW11dGV4X2xvY2soJmJsb2NrX2dyb3VwLT5hbGxvY19tdXRleCk7CisJCWlmICh1bmxpa2VseSghYmxvY2tfZ3JvdXBfYml0cyhibG9ja19ncm91cCwgZGF0YSkpKQorCQkJZ290byBuZXdfZ3JvdXA7CisKKwkJaWYgKHVubGlrZWx5KGJsb2NrX2dyb3VwLT5ybykpCisJCQlnb3RvIG5ld19ncm91cDsKKworCQlmcmVlX3NwYWNlID0gYnRyZnNfZmluZF9mcmVlX3NwYWNlKGJsb2NrX2dyb3VwLCBzZWFyY2hfc3RhcnQsCisJCQkJCQkgICB0b3RhbF9uZWVkZWQpOworCQlpZiAoZnJlZV9zcGFjZSkgeworCQkJdTY0IHN0YXJ0ID0gYmxvY2tfZ3JvdXAtPmtleS5vYmplY3RpZDsKKwkJCXU2NCBlbmQgPSBibG9ja19ncm91cC0+a2V5Lm9iamVjdGlkICsKKwkJCQlibG9ja19ncm91cC0+a2V5Lm9mZnNldDsKKworCQkJc2VhcmNoX3N0YXJ0ID0gc3RyaXBlX2FsaWduKHJvb3QsIGZyZWVfc3BhY2UtPm9mZnNldCk7CisKKwkJCS8qIG1vdmUgb24gdG8gdGhlIG5leHQgZ3JvdXAgKi8KKwkJCWlmIChzZWFyY2hfc3RhcnQgKyBudW1fYnl0ZXMgPj0gc2VhcmNoX2VuZCkKKwkJCQlnb3RvIG5ld19ncm91cDsKKworCQkJLyogbW92ZSBvbiB0byB0aGUgbmV4dCBncm91cCAqLworCQkJaWYgKHNlYXJjaF9zdGFydCArIG51bV9ieXRlcyA+IGVuZCkKKwkJCQlnb3RvIG5ld19ncm91cDsKKworCQkJaWYgKGxhc3Rfd2FudGVkICYmIHNlYXJjaF9zdGFydCAhPSBsYXN0X3dhbnRlZCkgeworCQkJCXRvdGFsX25lZWRlZCArPSBlbXB0eV9jbHVzdGVyOworCQkJCWVtcHR5X3NpemUgKz0gZW1wdHlfY2x1c3RlcjsKKwkJCQlsYXN0X3dhbnRlZCA9IDA7CisJCQkJLyoKKwkJCQkgKiBpZiBzZWFyY2hfc3RhcnQgaXMgc3RpbGwgaW4gdGhpcyBibG9jayBncm91cAorCQkJCSAqIHRoZW4gd2UganVzdCByZS1zZWFyY2ggdGhpcyBibG9jayBncm91cAorCQkJCSAqLworCQkJCWlmIChzZWFyY2hfc3RhcnQgPj0gc3RhcnQgJiYKKwkJCQkgICAgc2VhcmNoX3N0YXJ0IDwgZW5kKSB7CisJCQkJCW11dGV4X3VubG9jaygmYmxvY2tfZ3JvdXAtPmFsbG9jX211dGV4KTsKKwkJCQkJY29udGludWU7CisJCQkJfQorCisJCQkJLyogZWxzZSB3ZSBnbyB0byB0aGUgbmV4dCBibG9jayBncm91cCAqLworCQkJCWdvdG8gbmV3X2dyb3VwOworCQkJfQorCisJCQlpZiAoZXhjbHVkZV9uciA+IDAgJiYKKwkJCSAgICAoc2VhcmNoX3N0YXJ0ICsgbnVtX2J5dGVzID4gZXhjbHVkZV9zdGFydCAmJgorCQkJICAgICBzZWFyY2hfc3RhcnQgPCBleGNsdWRlX3N0YXJ0ICsgZXhjbHVkZV9ucikpIHsKKwkJCQlzZWFyY2hfc3RhcnQgPSBleGNsdWRlX3N0YXJ0ICsgZXhjbHVkZV9ucjsKKwkJCQkvKgorCQkJCSAqIGlmIHNlYXJjaF9zdGFydCBpcyBzdGlsbCBpbiB0aGlzIGJsb2NrIGdyb3VwCisJCQkJICogdGhlbiB3ZSBqdXN0IHJlLXNlYXJjaCB0aGlzIGJsb2NrIGdyb3VwCisJCQkJICovCisJCQkJaWYgKHNlYXJjaF9zdGFydCA+PSBzdGFydCAmJgorCQkJCSAgICBzZWFyY2hfc3RhcnQgPCBlbmQpIHsKKwkJCQkJbXV0ZXhfdW5sb2NrKCZibG9ja19ncm91cC0+YWxsb2NfbXV0ZXgpOworCQkJCQlsYXN0X3dhbnRlZCA9IDA7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKworCQkJCS8qIGVsc2Ugd2UgZ28gdG8gdGhlIG5leHQgYmxvY2sgZ3JvdXAgKi8KKwkJCQlnb3RvIG5ld19ncm91cDsKKwkJCX0KKworCQkJaW5zLT5vYmplY3RpZCA9IHNlYXJjaF9zdGFydDsKKwkJCWlucy0+b2Zmc2V0ID0gbnVtX2J5dGVzOworCisJCQlidHJmc19yZW1vdmVfZnJlZV9zcGFjZV9sb2NrKGJsb2NrX2dyb3VwLCBzZWFyY2hfc3RhcnQsCisJCQkJCQkgICAgIG51bV9ieXRlcyk7CisJCQkvKiB3ZSBhcmUgYWxsIGdvb2QsIGxldHMgcmV0dXJuICovCisJCQltdXRleF91bmxvY2soJmJsb2NrX2dyb3VwLT5hbGxvY19tdXRleCk7CisJCQlicmVhazsKKwkJfQorbmV3X2dyb3VwOgorCQltdXRleF91bmxvY2soJmJsb2NrX2dyb3VwLT5hbGxvY19tdXRleCk7CisJCXB1dF9ibG9ja19ncm91cChibG9ja19ncm91cCk7CisJCWJsb2NrX2dyb3VwID0gTlVMTDsKK25ld19ncm91cF9ub19sb2NrOgorCQkvKiBkb24ndCB0cnkgdG8gY29tcGFyZSBuZXcgYWxsb2NhdGlvbnMgYWdhaW5zdCB0aGUKKwkJICogbGFzdCBhbGxvY2F0aW9uIGFueSBtb3JlCisJCSAqLworCQlsYXN0X3dhbnRlZCA9IDA7CisKKwkJLyoKKwkJICogSGVyZSdzIGhvdyB0aGlzIHdvcmtzLgorCQkgKiBsb29wID09IDA6IHdlIHdlcmUgc2VhcmNoaW5nIGEgYmxvY2sgZ3JvdXAgdmlhIGEgaGludAorCQkgKgkJYW5kIGRpZG4ndCBmaW5kIGFueXRoaW5nLCBzbyB3ZSBzdGFydCBhdAorCQkgKgkJdGhlIGhlYWQgb2YgdGhlIGJsb2NrIGdyb3VwcyBhbmQga2VlcCBzZWFyY2hpbmcKKwkJICogbG9vcCA9PSAxOiB3ZSdyZSBzZWFyY2hpbmcgdGhyb3VnaCBhbGwgb2YgdGhlIGJsb2NrIGdyb3VwcworCQkgKgkJaWYgd2UgaGl0IHRoZSBoZWFkIGFnYWluIHdlIGhhdmUgc2VhcmNoZWQKKwkJICoJCWFsbCBvZiB0aGUgYmxvY2sgZ3JvdXBzIGZvciB0aGlzIHNwYWNlIGFuZCB3ZQorCQkgKgkJbmVlZCB0byB0cnkgYW5kIGFsbG9jYXRlLCBpZiB3ZSBjYW50IGVycm9yIG91dC4KKwkJICogbG9vcCA9PSAyOiB3ZSBhbGxvY2F0ZWQgbW9yZSBzcGFjZSBhbmQgYXJlIGxvb3BpbmcgdGhyb3VnaAorCQkgKgkJYWxsIG9mIHRoZSBibG9jayBncm91cHMgYWdhaW4uCisJCSAqLworCQlpZiAobG9vcCA9PSAwKSB7CisJCQloZWFkID0gJnNwYWNlX2luZm8tPmJsb2NrX2dyb3VwczsKKwkJCWN1ciA9IGhlYWQtPm5leHQ7CisJCQlsb29wKys7CisJCX0gZWxzZSBpZiAobG9vcCA9PSAxICYmIGN1ciA9PSBoZWFkKSB7CisJCQlpbnQga2VlcF9nb2luZzsKKworCQkJLyogYXQgdGhpcyBwb2ludCB3ZSBnaXZlIHVwIG9uIHRoZSBlbXB0eV9zaXplCisJCQkgKiBhbGxvY2F0aW9ucyBhbmQganVzdCB0cnkgdG8gYWxsb2NhdGUgdGhlIG1pbgorCQkJICogc3BhY2UuCisJCQkgKgorCQkJICogVGhlIGV4dHJhX2xvb3AgZmllbGQgd2FzIHNldCBpZiBhbiBlbXB0eV9zaXplCisJCQkgKiBhbGxvY2F0aW9uIHdhcyBhdHRlbXB0ZWQgYWJvdmUsIGFuZCBpZiB0aGlzCisJCQkgKiBpcyB0cnkgd2UgbmVlZCB0byB0cnkgdGhlIGxvb3AgYWdhaW4gd2l0aG91dAorCQkJICogdGhlIGFkZGl0aW9uYWwgZW1wdHlfc2l6ZS4KKwkJCSAqLworCQkJdG90YWxfbmVlZGVkIC09IGVtcHR5X3NpemU7CisJCQllbXB0eV9zaXplID0gMDsKKwkJCWtlZXBfZ29pbmcgPSBleHRyYV9sb29wOworCQkJbG9vcCsrOworCisJCQlpZiAoYWxsb3dlZF9jaHVua19hbGxvYyAmJiAhY2h1bmtfYWxsb2NfZG9uZSkgeworCQkJCXVwX3JlYWQoJnNwYWNlX2luZm8tPmdyb3Vwc19zZW0pOworCQkJCXJldCA9IGRvX2NodW5rX2FsbG9jKHRyYW5zLCByb290LCBudW1fYnl0ZXMgKworCQkJCQkJICAgICAyICogMTAyNCAqIDEwMjQsIGRhdGEsIDEpOworCQkJCWRvd25fcmVhZCgmc3BhY2VfaW5mby0+Z3JvdXBzX3NlbSk7CisJCQkJaWYgKHJldCA8IDApCisJCQkJCWdvdG8gbG9vcF9jaGVjazsKKwkJCQloZWFkID0gJnNwYWNlX2luZm8tPmJsb2NrX2dyb3VwczsKKwkJCQkvKgorCQkJCSAqIHdlJ3ZlIGFsbG9jYXRlZCBhIG5ldyBjaHVuaywga2VlcAorCQkJCSAqIHRyeWluZworCQkJCSAqLworCQkJCWtlZXBfZ29pbmcgPSAxOworCQkJCWNodW5rX2FsbG9jX2RvbmUgPSAxOworCQkJfSBlbHNlIGlmICghYWxsb3dlZF9jaHVua19hbGxvYykgeworCQkJCXNwYWNlX2luZm8tPmZvcmNlX2FsbG9jID0gMTsKKwkJCX0KK2xvb3BfY2hlY2s6CisJCQlpZiAoa2VlcF9nb2luZykgeworCQkJCWN1ciA9IGhlYWQtPm5leHQ7CisJCQkJZXh0cmFfbG9vcCA9IDA7CisJCQl9IGVsc2UgeworCQkJCWJyZWFrOworCQkJfQorCQl9IGVsc2UgaWYgKGN1ciA9PSBoZWFkKSB7CisJCQlicmVhazsKKwkJfQorCisJCWJsb2NrX2dyb3VwID0gbGlzdF9lbnRyeShjdXIsIHN0cnVjdCBidHJmc19ibG9ja19ncm91cF9jYWNoZSwKKwkJCQkJIGxpc3QpOworCQlhdG9taWNfaW5jKCZibG9ja19ncm91cC0+Y291bnQpOworCisJCXNlYXJjaF9zdGFydCA9IGJsb2NrX2dyb3VwLT5rZXkub2JqZWN0aWQ7CisJCWN1ciA9IGN1ci0+bmV4dDsKKwl9CisKKwkvKiB3ZSBmb3VuZCB3aGF0IHdlIG5lZWRlZCAqLworCWlmIChpbnMtPm9iamVjdGlkKSB7CisJCWlmICghKGRhdGEgJiBCVFJGU19CTE9DS19HUk9VUF9EQVRBKSkKKwkJCXRyYW5zLT5ibG9ja19ncm91cCA9IGJsb2NrX2dyb3VwLT5rZXkub2JqZWN0aWQ7CisKKwkJaWYgKGxhc3RfcHRyKQorCQkJKmxhc3RfcHRyID0gaW5zLT5vYmplY3RpZCArIGlucy0+b2Zmc2V0OworCQlyZXQgPSAwOworCX0gZWxzZSBpZiAoIXJldCkgeworCQlwcmludGsoS0VSTl9FUlIgImJ0cmZzIHNlYXJjaGluZyBmb3IgJWxsdSBieXRlcywgIgorCQkgICAgICAgIm51bV9ieXRlcyAlbGx1LCBsb29wICVkLCBhbGxvd2VkX2FsbG9jICVkXG4iLAorCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyl0b3RhbF9uZWVkZWQsCisJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKW51bV9ieXRlcywKKwkJICAgICAgIGxvb3AsIGFsbG93ZWRfY2h1bmtfYWxsb2MpOworCQlyZXQgPSAtRU5PU1BDOworCX0KKwlpZiAoYmxvY2tfZ3JvdXApCisJCXB1dF9ibG9ja19ncm91cChibG9ja19ncm91cCk7CisKKwl1cF9yZWFkKCZzcGFjZV9pbmZvLT5ncm91cHNfc2VtKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBkdW1wX3NwYWNlX2luZm8oc3RydWN0IGJ0cmZzX3NwYWNlX2luZm8gKmluZm8sIHU2NCBieXRlcykKK3sKKwlzdHJ1Y3QgYnRyZnNfYmxvY2tfZ3JvdXBfY2FjaGUgKmNhY2hlOworCXN0cnVjdCBsaXN0X2hlYWQgKmw7CisKKwlwcmludGsoS0VSTl9JTkZPICJzcGFjZV9pbmZvIGhhcyAlbGx1IGZyZWUsIGlzICVzZnVsbFxuIiwKKwkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykoaW5mby0+dG90YWxfYnl0ZXMgLSBpbmZvLT5ieXRlc191c2VkIC0KKwkJCQkgICAgaW5mby0+Ynl0ZXNfcGlubmVkIC0gaW5mby0+Ynl0ZXNfcmVzZXJ2ZWQpLAorCSAgICAgICAoaW5mby0+ZnVsbCkgPyAiIiA6ICJub3QgIik7CisKKwlkb3duX3JlYWQoJmluZm8tPmdyb3Vwc19zZW0pOworCWxpc3RfZm9yX2VhY2gobCwgJmluZm8tPmJsb2NrX2dyb3VwcykgeworCQljYWNoZSA9IGxpc3RfZW50cnkobCwgc3RydWN0IGJ0cmZzX2Jsb2NrX2dyb3VwX2NhY2hlLCBsaXN0KTsKKwkJc3Bpbl9sb2NrKCZjYWNoZS0+bG9jayk7CisJCXByaW50ayhLRVJOX0lORk8gImJsb2NrIGdyb3VwICVsbHUgaGFzICVsbHUgYnl0ZXMsICVsbHUgdXNlZCAiCisJCSAgICAgICAiJWxsdSBwaW5uZWQgJWxsdSByZXNlcnZlZFxuIiwKKwkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpY2FjaGUtPmtleS5vYmplY3RpZCwKKwkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpY2FjaGUtPmtleS5vZmZzZXQsCisJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKWJ0cmZzX2Jsb2NrX2dyb3VwX3VzZWQoJmNhY2hlLT5pdGVtKSwKKwkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpY2FjaGUtPnBpbm5lZCwKKwkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpY2FjaGUtPnJlc2VydmVkKTsKKwkJYnRyZnNfZHVtcF9mcmVlX3NwYWNlKGNhY2hlLCBieXRlcyk7CisJCXNwaW5fdW5sb2NrKCZjYWNoZS0+bG9jayk7CisJfQorCXVwX3JlYWQoJmluZm8tPmdyb3Vwc19zZW0pOworfQorCitzdGF0aWMgaW50IF9fYnRyZnNfcmVzZXJ2ZV9leHRlbnQoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCisJCQkJICBzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwKKwkJCQkgIHU2NCBudW1fYnl0ZXMsIHU2NCBtaW5fYWxsb2Nfc2l6ZSwKKwkJCQkgIHU2NCBlbXB0eV9zaXplLCB1NjQgaGludF9ieXRlLAorCQkJCSAgdTY0IHNlYXJjaF9lbmQsIHN0cnVjdCBidHJmc19rZXkgKmlucywKKwkJCQkgIHU2NCBkYXRhKQoreworCWludCByZXQ7CisJdTY0IHNlYXJjaF9zdGFydCA9IDA7CisJdTY0IGFsbG9jX3Byb2ZpbGU7CisJc3RydWN0IGJ0cmZzX2ZzX2luZm8gKmluZm8gPSByb290LT5mc19pbmZvOworCisJaWYgKGRhdGEpIHsKKwkJYWxsb2NfcHJvZmlsZSA9IGluZm8tPmF2YWlsX2RhdGFfYWxsb2NfYml0cyAmCisJCQlpbmZvLT5kYXRhX2FsbG9jX3Byb2ZpbGU7CisJCWRhdGEgPSBCVFJGU19CTE9DS19HUk9VUF9EQVRBIHwgYWxsb2NfcHJvZmlsZTsKKwl9IGVsc2UgaWYgKHJvb3QgPT0gcm9vdC0+ZnNfaW5mby0+Y2h1bmtfcm9vdCkgeworCQlhbGxvY19wcm9maWxlID0gaW5mby0+YXZhaWxfc3lzdGVtX2FsbG9jX2JpdHMgJgorCQkJaW5mby0+c3lzdGVtX2FsbG9jX3Byb2ZpbGU7CisJCWRhdGEgPSBCVFJGU19CTE9DS19HUk9VUF9TWVNURU0gfCBhbGxvY19wcm9maWxlOworCX0gZWxzZSB7CisJCWFsbG9jX3Byb2ZpbGUgPSBpbmZvLT5hdmFpbF9tZXRhZGF0YV9hbGxvY19iaXRzICYKKwkJCWluZm8tPm1ldGFkYXRhX2FsbG9jX3Byb2ZpbGU7CisJCWRhdGEgPSBCVFJGU19CTE9DS19HUk9VUF9NRVRBREFUQSB8IGFsbG9jX3Byb2ZpbGU7CisJfQorYWdhaW46CisJZGF0YSA9IGJ0cmZzX3JlZHVjZV9hbGxvY19wcm9maWxlKHJvb3QsIGRhdGEpOworCS8qCisJICogdGhlIG9ubHkgcGxhY2UgdGhhdCBzZXRzIGVtcHR5X3NpemUgaXMgYnRyZnNfcmVhbGxvY19ub2RlLCB3aGljaAorCSAqIGlzIG5vdCBjYWxsZWQgcmVjdXJzaXZlbHkgb24gYWxsb2NhdGlvbnMKKwkgKi8KKwlpZiAoZW1wdHlfc2l6ZSB8fCByb290LT5yZWZfY293cykgeworCQlpZiAoIShkYXRhICYgQlRSRlNfQkxPQ0tfR1JPVVBfTUVUQURBVEEpKSB7CisJCQlyZXQgPSBkb19jaHVua19hbGxvYyh0cmFucywgcm9vdC0+ZnNfaW5mby0+ZXh0ZW50X3Jvb3QsCisJCQkJICAgICAyICogMTAyNCAqIDEwMjQsCisJCQkJICAgICBCVFJGU19CTE9DS19HUk9VUF9NRVRBREFUQSB8CisJCQkJICAgICAoaW5mby0+bWV0YWRhdGFfYWxsb2NfcHJvZmlsZSAmCisJCQkJICAgICAgaW5mby0+YXZhaWxfbWV0YWRhdGFfYWxsb2NfYml0cyksIDApOworCQl9CisJCXJldCA9IGRvX2NodW5rX2FsbG9jKHRyYW5zLCByb290LT5mc19pbmZvLT5leHRlbnRfcm9vdCwKKwkJCQkgICAgIG51bV9ieXRlcyArIDIgKiAxMDI0ICogMTAyNCwgZGF0YSwgMCk7CisJfQorCisJV0FSTl9PTihudW1fYnl0ZXMgPCByb290LT5zZWN0b3JzaXplKTsKKwlyZXQgPSBmaW5kX2ZyZWVfZXh0ZW50KHRyYW5zLCByb290LCBudW1fYnl0ZXMsIGVtcHR5X3NpemUsCisJCQkgICAgICAgc2VhcmNoX3N0YXJ0LCBzZWFyY2hfZW5kLCBoaW50X2J5dGUsIGlucywKKwkJCSAgICAgICB0cmFucy0+YWxsb2NfZXhjbHVkZV9zdGFydCwKKwkJCSAgICAgICB0cmFucy0+YWxsb2NfZXhjbHVkZV9uciwgZGF0YSk7CisKKwlpZiAocmV0ID09IC1FTk9TUEMgJiYgbnVtX2J5dGVzID4gbWluX2FsbG9jX3NpemUpIHsKKwkJbnVtX2J5dGVzID0gbnVtX2J5dGVzID4+IDE7CisJCW51bV9ieXRlcyA9IG51bV9ieXRlcyAmIH4ocm9vdC0+c2VjdG9yc2l6ZSAtIDEpOworCQludW1fYnl0ZXMgPSBtYXgobnVtX2J5dGVzLCBtaW5fYWxsb2Nfc2l6ZSk7CisJCWRvX2NodW5rX2FsbG9jKHRyYW5zLCByb290LT5mc19pbmZvLT5leHRlbnRfcm9vdCwKKwkJCSAgICAgICBudW1fYnl0ZXMsIGRhdGEsIDEpOworCQlnb3RvIGFnYWluOworCX0KKwlpZiAocmV0KSB7CisJCXN0cnVjdCBidHJmc19zcGFjZV9pbmZvICpzaW5mbzsKKworCQlzaW5mbyA9IF9fZmluZF9zcGFjZV9pbmZvKHJvb3QtPmZzX2luZm8sIGRhdGEpOworCQlwcmludGsoS0VSTl9FUlIgImJ0cmZzIGFsbG9jYXRpb24gZmFpbGVkIGZsYWdzICVsbHUsICIKKwkJICAgICAgICJ3YW50ZWQgJWxsdVxuIiwgKHVuc2lnbmVkIGxvbmcgbG9uZylkYXRhLAorCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyludW1fYnl0ZXMpOworCQlkdW1wX3NwYWNlX2luZm8oc2luZm8sIG51bV9ieXRlcyk7CisJCUJVRygpOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK2ludCBidHJmc19mcmVlX3Jlc2VydmVkX2V4dGVudChzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwgdTY0IHN0YXJ0LCB1NjQgbGVuKQoreworCXN0cnVjdCBidHJmc19ibG9ja19ncm91cF9jYWNoZSAqY2FjaGU7CisJaW50IHJldCA9IDA7CisKKwljYWNoZSA9IGJ0cmZzX2xvb2t1cF9ibG9ja19ncm91cChyb290LT5mc19pbmZvLCBzdGFydCk7CisJaWYgKCFjYWNoZSkgeworCQlwcmludGsoS0VSTl9FUlIgIlVuYWJsZSB0byBmaW5kIGJsb2NrIGdyb3VwIGZvciAlbGx1XG4iLAorCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylzdGFydCk7CisJCXJldHVybiAtRU5PU1BDOworCX0KKworCXJldCA9IGJ0cmZzX2Rpc2NhcmRfZXh0ZW50KHJvb3QsIHN0YXJ0LCBsZW4pOworCisJYnRyZnNfYWRkX2ZyZWVfc3BhY2UoY2FjaGUsIHN0YXJ0LCBsZW4pOworCXB1dF9ibG9ja19ncm91cChjYWNoZSk7CisJdXBkYXRlX3Jlc2VydmVkX2V4dGVudHMocm9vdCwgc3RhcnQsIGxlbiwgMCk7CisKKwlyZXR1cm4gcmV0OworfQorCitpbnQgYnRyZnNfcmVzZXJ2ZV9leHRlbnQoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCisJCQkJICBzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwKKwkJCQkgIHU2NCBudW1fYnl0ZXMsIHU2NCBtaW5fYWxsb2Nfc2l6ZSwKKwkJCQkgIHU2NCBlbXB0eV9zaXplLCB1NjQgaGludF9ieXRlLAorCQkJCSAgdTY0IHNlYXJjaF9lbmQsIHN0cnVjdCBidHJmc19rZXkgKmlucywKKwkJCQkgIHU2NCBkYXRhKQoreworCWludCByZXQ7CisJcmV0ID0gX19idHJmc19yZXNlcnZlX2V4dGVudCh0cmFucywgcm9vdCwgbnVtX2J5dGVzLCBtaW5fYWxsb2Nfc2l6ZSwKKwkJCQkgICAgIGVtcHR5X3NpemUsIGhpbnRfYnl0ZSwgc2VhcmNoX2VuZCwgaW5zLAorCQkJCSAgICAgZGF0YSk7CisJdXBkYXRlX3Jlc2VydmVkX2V4dGVudHMocm9vdCwgaW5zLT5vYmplY3RpZCwgaW5zLT5vZmZzZXQsIDEpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19idHJmc19hbGxvY19yZXNlcnZlZF9leHRlbnQoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCisJCQkJCSBzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwgdTY0IHBhcmVudCwKKwkJCQkJIHU2NCByb290X29iamVjdGlkLCB1NjQgcmVmX2dlbmVyYXRpb24sCisJCQkJCSB1NjQgb3duZXIsIHN0cnVjdCBidHJmc19rZXkgKmlucykKK3sKKwlpbnQgcmV0OworCWludCBwZW5kaW5nX3JldDsKKwl1NjQgc3VwZXJfdXNlZDsKKwl1NjQgcm9vdF91c2VkOworCXU2NCBudW1fYnl0ZXMgPSBpbnMtPm9mZnNldDsKKwl1MzIgc2l6ZXNbMl07CisJc3RydWN0IGJ0cmZzX2ZzX2luZm8gKmluZm8gPSByb290LT5mc19pbmZvOworCXN0cnVjdCBidHJmc19yb290ICpleHRlbnRfcm9vdCA9IGluZm8tPmV4dGVudF9yb290OworCXN0cnVjdCBidHJmc19leHRlbnRfaXRlbSAqZXh0ZW50X2l0ZW07CisJc3RydWN0IGJ0cmZzX2V4dGVudF9yZWYgKnJlZjsKKwlzdHJ1Y3QgYnRyZnNfcGF0aCAqcGF0aDsKKwlzdHJ1Y3QgYnRyZnNfa2V5IGtleXNbMl07CisKKwlpZiAocGFyZW50ID09IDApCisJCXBhcmVudCA9IGlucy0+b2JqZWN0aWQ7CisKKwkvKiBibG9jayBhY2NvdW50aW5nIGZvciBzdXBlciBibG9jayAqLworCXNwaW5fbG9jaygmaW5mby0+ZGVsYWxsb2NfbG9jayk7CisJc3VwZXJfdXNlZCA9IGJ0cmZzX3N1cGVyX2J5dGVzX3VzZWQoJmluZm8tPnN1cGVyX2NvcHkpOworCWJ0cmZzX3NldF9zdXBlcl9ieXRlc191c2VkKCZpbmZvLT5zdXBlcl9jb3B5LCBzdXBlcl91c2VkICsgbnVtX2J5dGVzKTsKKworCS8qIGJsb2NrIGFjY291bnRpbmcgZm9yIHJvb3QgaXRlbSAqLworCXJvb3RfdXNlZCA9IGJ0cmZzX3Jvb3RfdXNlZCgmcm9vdC0+cm9vdF9pdGVtKTsKKwlidHJmc19zZXRfcm9vdF91c2VkKCZyb290LT5yb290X2l0ZW0sIHJvb3RfdXNlZCArIG51bV9ieXRlcyk7CisJc3Bpbl91bmxvY2soJmluZm8tPmRlbGFsbG9jX2xvY2spOworCisJaWYgKHJvb3QgPT0gZXh0ZW50X3Jvb3QpIHsKKwkJc3RydWN0IHBlbmRpbmdfZXh0ZW50X29wICpleHRlbnRfb3A7CisKKwkJZXh0ZW50X29wID0ga21hbGxvYyhzaXplb2YoKmV4dGVudF9vcCksIEdGUF9OT0ZTKTsKKwkJQlVHX09OKCFleHRlbnRfb3ApOworCisJCWV4dGVudF9vcC0+dHlwZSA9IFBFTkRJTkdfRVhURU5UX0lOU0VSVDsKKwkJZXh0ZW50X29wLT5ieXRlbnIgPSBpbnMtPm9iamVjdGlkOworCQlleHRlbnRfb3AtPm51bV9ieXRlcyA9IGlucy0+b2Zmc2V0OworCQlleHRlbnRfb3AtPnBhcmVudCA9IHBhcmVudDsKKwkJZXh0ZW50X29wLT5vcmlnX3BhcmVudCA9IDA7CisJCWV4dGVudF9vcC0+Z2VuZXJhdGlvbiA9IHJlZl9nZW5lcmF0aW9uOworCQlleHRlbnRfb3AtPm9yaWdfZ2VuZXJhdGlvbiA9IDA7CisJCWV4dGVudF9vcC0+bGV2ZWwgPSAoaW50KW93bmVyOworCQlJTklUX0xJU1RfSEVBRCgmZXh0ZW50X29wLT5saXN0KTsKKwkJZXh0ZW50X29wLT5kZWwgPSAwOworCisJCW11dGV4X2xvY2soJnJvb3QtPmZzX2luZm8tPmV4dGVudF9pbnNfbXV0ZXgpOworCQlzZXRfZXh0ZW50X2JpdHMoJnJvb3QtPmZzX2luZm8tPmV4dGVudF9pbnMsIGlucy0+b2JqZWN0aWQsCisJCQkJaW5zLT5vYmplY3RpZCArIGlucy0+b2Zmc2V0IC0gMSwKKwkJCQlFWFRFTlRfV1JJVEVCQUNLLCBHRlBfTk9GUyk7CisJCXNldF9zdGF0ZV9wcml2YXRlKCZyb290LT5mc19pbmZvLT5leHRlbnRfaW5zLAorCQkJCSAgaW5zLT5vYmplY3RpZCwgKHVuc2lnbmVkIGxvbmcpZXh0ZW50X29wKTsKKwkJbXV0ZXhfdW5sb2NrKCZyb290LT5mc19pbmZvLT5leHRlbnRfaW5zX211dGV4KTsKKwkJZ290byB1cGRhdGVfYmxvY2s7CisJfQorCisJbWVtY3B5KCZrZXlzWzBdLCBpbnMsIHNpemVvZigqaW5zKSk7CisJa2V5c1sxXS5vYmplY3RpZCA9IGlucy0+b2JqZWN0aWQ7CisJa2V5c1sxXS50eXBlID0gQlRSRlNfRVhURU5UX1JFRl9LRVk7CisJa2V5c1sxXS5vZmZzZXQgPSBwYXJlbnQ7CisJc2l6ZXNbMF0gPSBzaXplb2YoKmV4dGVudF9pdGVtKTsKKwlzaXplc1sxXSA9IHNpemVvZigqcmVmKTsKKworCXBhdGggPSBidHJmc19hbGxvY19wYXRoKCk7CisJQlVHX09OKCFwYXRoKTsKKworCXJldCA9IGJ0cmZzX2luc2VydF9lbXB0eV9pdGVtcyh0cmFucywgZXh0ZW50X3Jvb3QsIHBhdGgsIGtleXMsCisJCQkJICAgICAgIHNpemVzLCAyKTsKKwlCVUdfT04ocmV0KTsKKworCWV4dGVudF9pdGVtID0gYnRyZnNfaXRlbV9wdHIocGF0aC0+bm9kZXNbMF0sIHBhdGgtPnNsb3RzWzBdLAorCQkJCSAgICAgc3RydWN0IGJ0cmZzX2V4dGVudF9pdGVtKTsKKwlidHJmc19zZXRfZXh0ZW50X3JlZnMocGF0aC0+bm9kZXNbMF0sIGV4dGVudF9pdGVtLCAxKTsKKwlyZWYgPSBidHJmc19pdGVtX3B0cihwYXRoLT5ub2Rlc1swXSwgcGF0aC0+c2xvdHNbMF0gKyAxLAorCQkJICAgICBzdHJ1Y3QgYnRyZnNfZXh0ZW50X3JlZik7CisKKwlidHJmc19zZXRfcmVmX3Jvb3QocGF0aC0+bm9kZXNbMF0sIHJlZiwgcm9vdF9vYmplY3RpZCk7CisJYnRyZnNfc2V0X3JlZl9nZW5lcmF0aW9uKHBhdGgtPm5vZGVzWzBdLCByZWYsIHJlZl9nZW5lcmF0aW9uKTsKKwlidHJmc19zZXRfcmVmX29iamVjdGlkKHBhdGgtPm5vZGVzWzBdLCByZWYsIG93bmVyKTsKKwlidHJmc19zZXRfcmVmX251bV9yZWZzKHBhdGgtPm5vZGVzWzBdLCByZWYsIDEpOworCisJYnRyZnNfbWFya19idWZmZXJfZGlydHkocGF0aC0+bm9kZXNbMF0pOworCisJdHJhbnMtPmFsbG9jX2V4Y2x1ZGVfc3RhcnQgPSAwOworCXRyYW5zLT5hbGxvY19leGNsdWRlX25yID0gMDsKKwlidHJmc19mcmVlX3BhdGgocGF0aCk7CisJZmluaXNoX2N1cnJlbnRfaW5zZXJ0KHRyYW5zLCBleHRlbnRfcm9vdCwgMCk7CisJcGVuZGluZ19yZXQgPSBkZWxfcGVuZGluZ19leHRlbnRzKHRyYW5zLCBleHRlbnRfcm9vdCwgMCk7CisKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKwlpZiAocGVuZGluZ19yZXQpIHsKKwkJcmV0ID0gcGVuZGluZ19yZXQ7CisJCWdvdG8gb3V0OworCX0KKwordXBkYXRlX2Jsb2NrOgorCXJldCA9IHVwZGF0ZV9ibG9ja19ncm91cCh0cmFucywgcm9vdCwgaW5zLT5vYmplY3RpZCwKKwkJCQkgaW5zLT5vZmZzZXQsIDEsIDApOworCWlmIChyZXQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJidHJmcyB1cGRhdGUgYmxvY2sgZ3JvdXAgZmFpbGVkIGZvciAlbGx1ICIKKwkJICAgICAgICIlbGx1XG4iLCAodW5zaWduZWQgbG9uZyBsb25nKWlucy0+b2JqZWN0aWQsCisJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKWlucy0+b2Zmc2V0KTsKKwkJQlVHKCk7CisJfQorb3V0OgorCXJldHVybiByZXQ7Cit9CisKK2ludCBidHJmc19hbGxvY19yZXNlcnZlZF9leHRlbnQoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCisJCQkJc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsIHU2NCBwYXJlbnQsCisJCQkJdTY0IHJvb3Rfb2JqZWN0aWQsIHU2NCByZWZfZ2VuZXJhdGlvbiwKKwkJCQl1NjQgb3duZXIsIHN0cnVjdCBidHJmc19rZXkgKmlucykKK3sKKwlpbnQgcmV0OworCisJaWYgKHJvb3Rfb2JqZWN0aWQgPT0gQlRSRlNfVFJFRV9MT0dfT0JKRUNUSUQpCisJCXJldHVybiAwOworCXJldCA9IF9fYnRyZnNfYWxsb2NfcmVzZXJ2ZWRfZXh0ZW50KHRyYW5zLCByb290LCBwYXJlbnQsIHJvb3Rfb2JqZWN0aWQsCisJCQkJCSAgICByZWZfZ2VuZXJhdGlvbiwgb3duZXIsIGlucyk7CisJdXBkYXRlX3Jlc2VydmVkX2V4dGVudHMocm9vdCwgaW5zLT5vYmplY3RpZCwgaW5zLT5vZmZzZXQsIDApOworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiB0aGlzIGlzIHVzZWQgYnkgdGhlIHRyZWUgbG9nZ2luZyByZWNvdmVyeSBjb2RlLiAgSXQgcmVjb3JkcyB0aGF0CisgKiBhbiBleHRlbnQgaGFzIGJlZW4gYWxsb2NhdGVkIGFuZCBtYWtlcyBzdXJlIHRvIGNsZWFyIHRoZSBmcmVlCisgKiBzcGFjZSBjYWNoZSBiaXRzIGFzIHdlbGwKKyAqLworaW50IGJ0cmZzX2FsbG9jX2xvZ2dlZF9leHRlbnQoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCisJCQkJc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsIHU2NCBwYXJlbnQsCisJCQkJdTY0IHJvb3Rfb2JqZWN0aWQsIHU2NCByZWZfZ2VuZXJhdGlvbiwKKwkJCQl1NjQgb3duZXIsIHN0cnVjdCBidHJmc19rZXkgKmlucykKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBidHJmc19ibG9ja19ncm91cF9jYWNoZSAqYmxvY2tfZ3JvdXA7CisKKwlibG9ja19ncm91cCA9IGJ0cmZzX2xvb2t1cF9ibG9ja19ncm91cChyb290LT5mc19pbmZvLCBpbnMtPm9iamVjdGlkKTsKKwltdXRleF9sb2NrKCZibG9ja19ncm91cC0+Y2FjaGVfbXV0ZXgpOworCWNhY2hlX2Jsb2NrX2dyb3VwKHJvb3QsIGJsb2NrX2dyb3VwKTsKKwltdXRleF91bmxvY2soJmJsb2NrX2dyb3VwLT5jYWNoZV9tdXRleCk7CisKKwlyZXQgPSBidHJmc19yZW1vdmVfZnJlZV9zcGFjZShibG9ja19ncm91cCwgaW5zLT5vYmplY3RpZCwKKwkJCQkgICAgICBpbnMtPm9mZnNldCk7CisJQlVHX09OKHJldCk7CisJcHV0X2Jsb2NrX2dyb3VwKGJsb2NrX2dyb3VwKTsKKwlyZXQgPSBfX2J0cmZzX2FsbG9jX3Jlc2VydmVkX2V4dGVudCh0cmFucywgcm9vdCwgcGFyZW50LCByb290X29iamVjdGlkLAorCQkJCQkgICAgcmVmX2dlbmVyYXRpb24sIG93bmVyLCBpbnMpOworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBmaW5kcyBhIGZyZWUgZXh0ZW50IGFuZCBkb2VzIGFsbCB0aGUgZGlydHkgd29yayByZXF1aXJlZCBmb3IgYWxsb2NhdGlvbgorICogcmV0dXJucyB0aGUga2V5IGZvciB0aGUgZXh0ZW50IHRocm91Z2ggaW5zLCBhbmQgYSB0cmVlIGJ1ZmZlciBmb3IKKyAqIHRoZSBmaXJzdCBibG9jayBvZiB0aGUgZXh0ZW50IHRocm91Z2ggYnVmLgorICoKKyAqIHJldHVybnMgMCBpZiBldmVyeXRoaW5nIHdvcmtlZCwgbm9uLXplcm8gb3RoZXJ3aXNlLgorICovCitpbnQgYnRyZnNfYWxsb2NfZXh0ZW50KHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAorCQkgICAgICAgc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsCisJCSAgICAgICB1NjQgbnVtX2J5dGVzLCB1NjQgcGFyZW50LCB1NjQgbWluX2FsbG9jX3NpemUsCisJCSAgICAgICB1NjQgcm9vdF9vYmplY3RpZCwgdTY0IHJlZl9nZW5lcmF0aW9uLAorCQkgICAgICAgdTY0IG93bmVyX29iamVjdGlkLCB1NjQgZW1wdHlfc2l6ZSwgdTY0IGhpbnRfYnl0ZSwKKwkJICAgICAgIHU2NCBzZWFyY2hfZW5kLCBzdHJ1Y3QgYnRyZnNfa2V5ICppbnMsIHU2NCBkYXRhKQoreworCWludCByZXQ7CisKKwlyZXQgPSBfX2J0cmZzX3Jlc2VydmVfZXh0ZW50KHRyYW5zLCByb290LCBudW1fYnl0ZXMsCisJCQkJICAgICBtaW5fYWxsb2Nfc2l6ZSwgZW1wdHlfc2l6ZSwgaGludF9ieXRlLAorCQkJCSAgICAgc2VhcmNoX2VuZCwgaW5zLCBkYXRhKTsKKwlCVUdfT04ocmV0KTsKKwlpZiAocm9vdF9vYmplY3RpZCAhPSBCVFJGU19UUkVFX0xPR19PQkpFQ1RJRCkgeworCQlyZXQgPSBfX2J0cmZzX2FsbG9jX3Jlc2VydmVkX2V4dGVudCh0cmFucywgcm9vdCwgcGFyZW50LAorCQkJCQlyb290X29iamVjdGlkLCByZWZfZ2VuZXJhdGlvbiwKKwkJCQkJb3duZXJfb2JqZWN0aWQsIGlucyk7CisJCUJVR19PTihyZXQpOworCisJfSBlbHNlIHsKKwkJdXBkYXRlX3Jlc2VydmVkX2V4dGVudHMocm9vdCwgaW5zLT5vYmplY3RpZCwgaW5zLT5vZmZzZXQsIDEpOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqYnRyZnNfaW5pdF9uZXdfYnVmZmVyKHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAorCQkJCQkgICAgc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsCisJCQkJCSAgICB1NjQgYnl0ZW5yLCB1MzIgYmxvY2tzaXplKQoreworCXN0cnVjdCBleHRlbnRfYnVmZmVyICpidWY7CisKKwlidWYgPSBidHJmc19maW5kX2NyZWF0ZV90cmVlX2Jsb2NrKHJvb3QsIGJ5dGVuciwgYmxvY2tzaXplKTsKKwlpZiAoIWJ1ZikKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisJYnRyZnNfc2V0X2hlYWRlcl9nZW5lcmF0aW9uKGJ1ZiwgdHJhbnMtPnRyYW5zaWQpOworCWJ0cmZzX3RyZWVfbG9jayhidWYpOworCWNsZWFuX3RyZWVfYmxvY2sodHJhbnMsIHJvb3QsIGJ1Zik7CisJYnRyZnNfc2V0X2J1ZmZlcl91cHRvZGF0ZShidWYpOworCWlmIChyb290LT5yb290X2tleS5vYmplY3RpZCA9PSBCVFJGU19UUkVFX0xPR19PQkpFQ1RJRCkgeworCQlzZXRfZXh0ZW50X2RpcnR5KCZyb290LT5kaXJ0eV9sb2dfcGFnZXMsIGJ1Zi0+c3RhcnQsCisJCQkgYnVmLT5zdGFydCArIGJ1Zi0+bGVuIC0gMSwgR0ZQX05PRlMpOworCX0gZWxzZSB7CisJCXNldF9leHRlbnRfZGlydHkoJnRyYW5zLT50cmFuc2FjdGlvbi0+ZGlydHlfcGFnZXMsIGJ1Zi0+c3RhcnQsCisJCQkgYnVmLT5zdGFydCArIGJ1Zi0+bGVuIC0gMSwgR0ZQX05PRlMpOworCX0KKwl0cmFucy0+YmxvY2tzX3VzZWQrKzsKKwlyZXR1cm4gYnVmOworfQorCisvKgorICogaGVscGVyIGZ1bmN0aW9uIHRvIGFsbG9jYXRlIGEgYmxvY2sgZm9yIGEgZ2l2ZW4gdHJlZQorICogcmV0dXJucyB0aGUgdHJlZSBidWZmZXIgb3IgTlVMTC4KKyAqLworc3RydWN0IGV4dGVudF9idWZmZXIgKmJ0cmZzX2FsbG9jX2ZyZWVfYmxvY2soc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCisJCQkJCSAgICAgc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsCisJCQkJCSAgICAgdTMyIGJsb2Nrc2l6ZSwgdTY0IHBhcmVudCwKKwkJCQkJICAgICB1NjQgcm9vdF9vYmplY3RpZCwKKwkJCQkJICAgICB1NjQgcmVmX2dlbmVyYXRpb24sCisJCQkJCSAgICAgaW50IGxldmVsLAorCQkJCQkgICAgIHU2NCBoaW50LAorCQkJCQkgICAgIHU2NCBlbXB0eV9zaXplKQoreworCXN0cnVjdCBidHJmc19rZXkgaW5zOworCWludCByZXQ7CisJc3RydWN0IGV4dGVudF9idWZmZXIgKmJ1ZjsKKworCXJldCA9IGJ0cmZzX2FsbG9jX2V4dGVudCh0cmFucywgcm9vdCwgYmxvY2tzaXplLCBwYXJlbnQsIGJsb2Nrc2l6ZSwKKwkJCQkgcm9vdF9vYmplY3RpZCwgcmVmX2dlbmVyYXRpb24sIGxldmVsLAorCQkJCSBlbXB0eV9zaXplLCBoaW50LCAodTY0KS0xLCAmaW5zLCAwKTsKKwlpZiAocmV0KSB7CisJCUJVR19PTihyZXQgPiAwKTsKKwkJcmV0dXJuIEVSUl9QVFIocmV0KTsKKwl9CisKKwlidWYgPSBidHJmc19pbml0X25ld19idWZmZXIodHJhbnMsIHJvb3QsIGlucy5vYmplY3RpZCwgYmxvY2tzaXplKTsKKwlyZXR1cm4gYnVmOworfQorCitpbnQgYnRyZnNfZHJvcF9sZWFmX3JlZihzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKKwkJCXN0cnVjdCBidHJmc19yb290ICpyb290LCBzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqbGVhZikKK3sKKwl1NjQgbGVhZl9vd25lcjsKKwl1NjQgbGVhZl9nZW5lcmF0aW9uOworCXN0cnVjdCBidHJmc19rZXkga2V5OworCXN0cnVjdCBidHJmc19maWxlX2V4dGVudF9pdGVtICpmaTsKKwlpbnQgaTsKKwlpbnQgbnJpdGVtczsKKwlpbnQgcmV0OworCisJQlVHX09OKCFidHJmc19pc19sZWFmKGxlYWYpKTsKKwlucml0ZW1zID0gYnRyZnNfaGVhZGVyX25yaXRlbXMobGVhZik7CisJbGVhZl9vd25lciA9IGJ0cmZzX2hlYWRlcl9vd25lcihsZWFmKTsKKwlsZWFmX2dlbmVyYXRpb24gPSBidHJmc19oZWFkZXJfZ2VuZXJhdGlvbihsZWFmKTsKKworCWZvciAoaSA9IDA7IGkgPCBucml0ZW1zOyBpKyspIHsKKwkJdTY0IGRpc2tfYnl0ZW5yOworCQljb25kX3Jlc2NoZWQoKTsKKworCQlidHJmc19pdGVtX2tleV90b19jcHUobGVhZiwgJmtleSwgaSk7CisJCWlmIChidHJmc19rZXlfdHlwZSgma2V5KSAhPSBCVFJGU19FWFRFTlRfREFUQV9LRVkpCisJCQljb250aW51ZTsKKwkJZmkgPSBidHJmc19pdGVtX3B0cihsZWFmLCBpLCBzdHJ1Y3QgYnRyZnNfZmlsZV9leHRlbnRfaXRlbSk7CisJCWlmIChidHJmc19maWxlX2V4dGVudF90eXBlKGxlYWYsIGZpKSA9PQorCQkgICAgQlRSRlNfRklMRV9FWFRFTlRfSU5MSU5FKQorCQkJY29udGludWU7CisJCS8qCisJCSAqIEZJWE1FIG1ha2Ugc3VyZSB0byBpbnNlcnQgYSB0cmFucyByZWNvcmQgdGhhdAorCQkgKiByZXBlYXRzIHRoZSBzbmFwc2hvdCBkZWwgb24gY3Jhc2gKKwkJICovCisJCWRpc2tfYnl0ZW5yID0gYnRyZnNfZmlsZV9leHRlbnRfZGlza19ieXRlbnIobGVhZiwgZmkpOworCQlpZiAoZGlza19ieXRlbnIgPT0gMCkKKwkJCWNvbnRpbnVlOworCisJCXJldCA9IF9fYnRyZnNfZnJlZV9leHRlbnQodHJhbnMsIHJvb3QsIGRpc2tfYnl0ZW5yLAorCQkJCWJ0cmZzX2ZpbGVfZXh0ZW50X2Rpc2tfbnVtX2J5dGVzKGxlYWYsIGZpKSwKKwkJCQlsZWFmLT5zdGFydCwgbGVhZl9vd25lciwgbGVhZl9nZW5lcmF0aW9uLAorCQkJCWtleS5vYmplY3RpZCwgMCk7CisJCUJVR19PTihyZXQpOworCisJCWF0b21pY19pbmMoJnJvb3QtPmZzX2luZm8tPnRocm90dGxlX2dlbik7CisJCXdha2VfdXAoJnJvb3QtPmZzX2luZm8tPnRyYW5zYWN0aW9uX3Rocm90dGxlKTsKKwkJY29uZF9yZXNjaGVkKCk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgbm9pbmxpbmUgaW50IGNhY2hlX2Ryb3BfbGVhZl9yZWYoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCisJCQkJCXN0cnVjdCBidHJmc19yb290ICpyb290LAorCQkJCQlzdHJ1Y3QgYnRyZnNfbGVhZl9yZWYgKnJlZikKK3sKKwlpbnQgaTsKKwlpbnQgcmV0OworCXN0cnVjdCBidHJmc19leHRlbnRfaW5mbyAqaW5mbyA9IHJlZi0+ZXh0ZW50czsKKworCWZvciAoaSA9IDA7IGkgPCByZWYtPm5yaXRlbXM7IGkrKykgeworCQlyZXQgPSBfX2J0cmZzX2ZyZWVfZXh0ZW50KHRyYW5zLCByb290LCBpbmZvLT5ieXRlbnIsCisJCQkJCSAgaW5mby0+bnVtX2J5dGVzLCByZWYtPmJ5dGVuciwKKwkJCQkJICByZWYtPm93bmVyLCByZWYtPmdlbmVyYXRpb24sCisJCQkJCSAgaW5mby0+b2JqZWN0aWQsIDApOworCisJCWF0b21pY19pbmMoJnJvb3QtPmZzX2luZm8tPnRocm90dGxlX2dlbik7CisJCXdha2VfdXAoJnJvb3QtPmZzX2luZm8tPnRyYW5zYWN0aW9uX3Rocm90dGxlKTsKKwkJY29uZF9yZXNjaGVkKCk7CisKKwkJQlVHX09OKHJldCk7CisJCWluZm8rKzsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkcm9wX3NuYXBfbG9va3VwX3JlZmNvdW50KHN0cnVjdCBidHJmc19yb290ICpyb290LCB1NjQgc3RhcnQsCisJCQkJICAgICB1NjQgbGVuLCB1MzIgKnJlZnMpCit7CisJaW50IHJldDsKKworCXJldCA9IGJ0cmZzX2xvb2t1cF9leHRlbnRfcmVmKE5VTEwsIHJvb3QsIHN0YXJ0LCBsZW4sIHJlZnMpOworCUJVR19PTihyZXQpOworCisjaWYgMCAvKiBzb21lIGRlYnVnZ2luZyBjb2RlIGluIGNhc2Ugd2Ugc2VlIHByb2JsZW1zIGhlcmUgKi8KKwkvKiBpZiB0aGUgcmVmcyBjb3VudCBpcyBvbmUsIGl0IHdvbid0IGdldCBpbmNyZWFzZWQgYWdhaW4uICBCdXQKKwkgKiBpZiB0aGUgcmVmIGNvdW50IGlzID4gMSwgc29tZW9uZSBtYXkgYmUgZGVjcmVhc2luZyBpdCBhdAorCSAqIHRoZSBzYW1lIHRpbWUgd2UgYXJlLgorCSAqLworCWlmICgqcmVmcyAhPSAxKSB7CisJCXN0cnVjdCBleHRlbnRfYnVmZmVyICplYiA9IE5VTEw7CisJCWViID0gYnRyZnNfZmluZF9jcmVhdGVfdHJlZV9ibG9jayhyb290LCBzdGFydCwgbGVuKTsKKwkJaWYgKGViKQorCQkJYnRyZnNfdHJlZV9sb2NrKGViKTsKKworCQltdXRleF9sb2NrKCZyb290LT5mc19pbmZvLT5hbGxvY19tdXRleCk7CisJCXJldCA9IGxvb2t1cF9leHRlbnRfcmVmKE5VTEwsIHJvb3QsIHN0YXJ0LCBsZW4sIHJlZnMpOworCQlCVUdfT04ocmV0KTsKKwkJbXV0ZXhfdW5sb2NrKCZyb290LT5mc19pbmZvLT5hbGxvY19tdXRleCk7CisKKwkJaWYgKGViKSB7CisJCQlidHJmc190cmVlX3VubG9jayhlYik7CisJCQlmcmVlX2V4dGVudF9idWZmZXIoZWIpOworCQl9CisJCWlmICgqcmVmcyA9PSAxKSB7CisJCQlwcmludGsoS0VSTl9FUlIgImJ0cmZzIGJsb2NrICVsbHUgd2VudCBkb3duIHRvIG9uZSAiCisJCQkgICAgICAgImR1cmluZyBkcm9wX3NuYXBcbiIsICh1bnNpZ25lZCBsb25nIGxvbmcpc3RhcnQpOworCQl9CisKKwl9CisjZW5kaWYKKworCWNvbmRfcmVzY2hlZCgpOworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBoZWxwZXIgZnVuY3Rpb24gZm9yIGRyb3Bfc25hcHNob3QsIHRoaXMgd2Fsa3MgZG93biB0aGUgdHJlZSBkcm9wcGluZyByZWYKKyAqIGNvdW50cyBhcyBpdCBnb2VzLgorICovCitzdGF0aWMgbm9pbmxpbmUgaW50IHdhbGtfZG93bl90cmVlKHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAorCQkJCSAgIHN0cnVjdCBidHJmc19yb290ICpyb290LAorCQkJCSAgIHN0cnVjdCBidHJmc19wYXRoICpwYXRoLCBpbnQgKmxldmVsKQoreworCXU2NCByb290X293bmVyOworCXU2NCByb290X2dlbjsKKwl1NjQgYnl0ZW5yOworCXU2NCBwdHJfZ2VuOworCXN0cnVjdCBleHRlbnRfYnVmZmVyICpuZXh0OworCXN0cnVjdCBleHRlbnRfYnVmZmVyICpjdXI7CisJc3RydWN0IGV4dGVudF9idWZmZXIgKnBhcmVudDsKKwlzdHJ1Y3QgYnRyZnNfbGVhZl9yZWYgKnJlZjsKKwl1MzIgYmxvY2tzaXplOworCWludCByZXQ7CisJdTMyIHJlZnM7CisKKwlXQVJOX09OKCpsZXZlbCA8IDApOworCVdBUk5fT04oKmxldmVsID49IEJUUkZTX01BWF9MRVZFTCk7CisJcmV0ID0gZHJvcF9zbmFwX2xvb2t1cF9yZWZjb3VudChyb290LCBwYXRoLT5ub2Rlc1sqbGV2ZWxdLT5zdGFydCwKKwkJCQlwYXRoLT5ub2Rlc1sqbGV2ZWxdLT5sZW4sICZyZWZzKTsKKwlCVUdfT04ocmV0KTsKKwlpZiAocmVmcyA+IDEpCisJCWdvdG8gb3V0OworCisJLyoKKwkgKiB3YWxrIGRvd24gdG8gdGhlIGxhc3Qgbm9kZSBsZXZlbCBhbmQgZnJlZSBhbGwgdGhlIGxlYXZlcworCSAqLworCXdoaWxlICgqbGV2ZWwgPj0gMCkgeworCQlXQVJOX09OKCpsZXZlbCA8IDApOworCQlXQVJOX09OKCpsZXZlbCA+PSBCVFJGU19NQVhfTEVWRUwpOworCQljdXIgPSBwYXRoLT5ub2Rlc1sqbGV2ZWxdOworCisJCWlmIChidHJmc19oZWFkZXJfbGV2ZWwoY3VyKSAhPSAqbGV2ZWwpCisJCQlXQVJOX09OKDEpOworCisJCWlmIChwYXRoLT5zbG90c1sqbGV2ZWxdID49CisJCSAgICBidHJmc19oZWFkZXJfbnJpdGVtcyhjdXIpKQorCQkJYnJlYWs7CisJCWlmICgqbGV2ZWwgPT0gMCkgeworCQkJcmV0ID0gYnRyZnNfZHJvcF9sZWFmX3JlZih0cmFucywgcm9vdCwgY3VyKTsKKwkJCUJVR19PTihyZXQpOworCQkJYnJlYWs7CisJCX0KKwkJYnl0ZW5yID0gYnRyZnNfbm9kZV9ibG9ja3B0cihjdXIsIHBhdGgtPnNsb3RzWypsZXZlbF0pOworCQlwdHJfZ2VuID0gYnRyZnNfbm9kZV9wdHJfZ2VuZXJhdGlvbihjdXIsIHBhdGgtPnNsb3RzWypsZXZlbF0pOworCQlibG9ja3NpemUgPSBidHJmc19sZXZlbF9zaXplKHJvb3QsICpsZXZlbCAtIDEpOworCisJCXJldCA9IGRyb3Bfc25hcF9sb29rdXBfcmVmY291bnQocm9vdCwgYnl0ZW5yLCBibG9ja3NpemUsICZyZWZzKTsKKwkJQlVHX09OKHJldCk7CisJCWlmIChyZWZzICE9IDEpIHsKKwkJCXBhcmVudCA9IHBhdGgtPm5vZGVzWypsZXZlbF07CisJCQlyb290X293bmVyID0gYnRyZnNfaGVhZGVyX293bmVyKHBhcmVudCk7CisJCQlyb290X2dlbiA9IGJ0cmZzX2hlYWRlcl9nZW5lcmF0aW9uKHBhcmVudCk7CisJCQlwYXRoLT5zbG90c1sqbGV2ZWxdKys7CisKKwkJCXJldCA9IF9fYnRyZnNfZnJlZV9leHRlbnQodHJhbnMsIHJvb3QsIGJ5dGVuciwKKwkJCQkJCWJsb2Nrc2l6ZSwgcGFyZW50LT5zdGFydCwKKwkJCQkJCXJvb3Rfb3duZXIsIHJvb3RfZ2VuLAorCQkJCQkJKmxldmVsIC0gMSwgMSk7CisJCQlCVUdfT04ocmV0KTsKKworCQkJYXRvbWljX2luYygmcm9vdC0+ZnNfaW5mby0+dGhyb3R0bGVfZ2VuKTsKKwkJCXdha2VfdXAoJnJvb3QtPmZzX2luZm8tPnRyYW5zYWN0aW9uX3Rocm90dGxlKTsKKwkJCWNvbmRfcmVzY2hlZCgpOworCisJCQljb250aW51ZTsKKwkJfQorCQkvKgorCQkgKiBhdCB0aGlzIHBvaW50LCB3ZSBoYXZlIGEgc2luZ2xlIHJlZiwgYW5kIHNpbmNlIHRoZQorCQkgKiBvbmx5IHBsYWNlIHJlZmVyZW5jaW5nIHRoaXMgZXh0ZW50IGlzIGEgZGVhZCByb290CisJCSAqIHRoZSByZWZlcmVuY2UgY291bnQgc2hvdWxkIG5ldmVyIGdvIGhpZ2hlci4KKwkJICogU28sIHdlIGRvbid0IG5lZWQgdG8gY2hlY2sgaXQgYWdhaW4KKwkJICovCisJCWlmICgqbGV2ZWwgPT0gMSkgeworCQkJcmVmID0gYnRyZnNfbG9va3VwX2xlYWZfcmVmKHJvb3QsIGJ5dGVucik7CisJCQlpZiAocmVmICYmIHJlZi0+Z2VuZXJhdGlvbiAhPSBwdHJfZ2VuKSB7CisJCQkJYnRyZnNfZnJlZV9sZWFmX3JlZihyb290LCByZWYpOworCQkJCXJlZiA9IE5VTEw7CisJCQl9CisJCQlpZiAocmVmKSB7CisJCQkJcmV0ID0gY2FjaGVfZHJvcF9sZWFmX3JlZih0cmFucywgcm9vdCwgcmVmKTsKKwkJCQlCVUdfT04ocmV0KTsKKwkJCQlidHJmc19yZW1vdmVfbGVhZl9yZWYocm9vdCwgcmVmKTsKKwkJCQlidHJmc19mcmVlX2xlYWZfcmVmKHJvb3QsIHJlZik7CisJCQkJKmxldmVsID0gMDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQluZXh0ID0gYnRyZnNfZmluZF90cmVlX2Jsb2NrKHJvb3QsIGJ5dGVuciwgYmxvY2tzaXplKTsKKwkJaWYgKCFuZXh0IHx8ICFidHJmc19idWZmZXJfdXB0b2RhdGUobmV4dCwgcHRyX2dlbikpIHsKKwkJCWZyZWVfZXh0ZW50X2J1ZmZlcihuZXh0KTsKKworCQkJbmV4dCA9IHJlYWRfdHJlZV9ibG9jayhyb290LCBieXRlbnIsIGJsb2Nrc2l6ZSwKKwkJCQkJICAgICAgIHB0cl9nZW4pOworCQkJY29uZF9yZXNjaGVkKCk7CisjaWYgMAorCQkJLyoKKwkJCSAqIHRoaXMgaXMgYSBkZWJ1Z2dpbmcgY2hlY2sgYW5kIGNhbiBnbyBhd2F5CisJCQkgKiB0aGUgcmVmIHNob3VsZCBuZXZlciBnbyBhbGwgdGhlIHdheSBkb3duIHRvIDEKKwkJCSAqIGF0IHRoaXMgcG9pbnQKKwkJCSAqLworCQkJcmV0ID0gbG9va3VwX2V4dGVudF9yZWYoTlVMTCwgcm9vdCwgYnl0ZW5yLCBibG9ja3NpemUsCisJCQkJCQkmcmVmcyk7CisJCQlCVUdfT04ocmV0KTsKKwkJCVdBUk5fT04ocmVmcyAhPSAxKTsKKyNlbmRpZgorCQl9CisJCVdBUk5fT04oKmxldmVsIDw9IDApOworCQlpZiAocGF0aC0+bm9kZXNbKmxldmVsLTFdKQorCQkJZnJlZV9leHRlbnRfYnVmZmVyKHBhdGgtPm5vZGVzWypsZXZlbC0xXSk7CisJCXBhdGgtPm5vZGVzWypsZXZlbC0xXSA9IG5leHQ7CisJCSpsZXZlbCA9IGJ0cmZzX2hlYWRlcl9sZXZlbChuZXh0KTsKKwkJcGF0aC0+c2xvdHNbKmxldmVsXSA9IDA7CisJCWNvbmRfcmVzY2hlZCgpOworCX0KK291dDoKKwlXQVJOX09OKCpsZXZlbCA8IDApOworCVdBUk5fT04oKmxldmVsID49IEJUUkZTX01BWF9MRVZFTCk7CisKKwlpZiAocGF0aC0+bm9kZXNbKmxldmVsXSA9PSByb290LT5ub2RlKSB7CisJCXBhcmVudCA9IHBhdGgtPm5vZGVzWypsZXZlbF07CisJCWJ5dGVuciA9IHBhdGgtPm5vZGVzWypsZXZlbF0tPnN0YXJ0OworCX0gZWxzZSB7CisJCXBhcmVudCA9IHBhdGgtPm5vZGVzWypsZXZlbCArIDFdOworCQlieXRlbnIgPSBidHJmc19ub2RlX2Jsb2NrcHRyKHBhcmVudCwgcGF0aC0+c2xvdHNbKmxldmVsICsgMV0pOworCX0KKworCWJsb2Nrc2l6ZSA9IGJ0cmZzX2xldmVsX3NpemUocm9vdCwgKmxldmVsKTsKKwlyb290X293bmVyID0gYnRyZnNfaGVhZGVyX293bmVyKHBhcmVudCk7CisJcm9vdF9nZW4gPSBidHJmc19oZWFkZXJfZ2VuZXJhdGlvbihwYXJlbnQpOworCisJcmV0ID0gX19idHJmc19mcmVlX2V4dGVudCh0cmFucywgcm9vdCwgYnl0ZW5yLCBibG9ja3NpemUsCisJCQkJICBwYXJlbnQtPnN0YXJ0LCByb290X293bmVyLCByb290X2dlbiwKKwkJCQkgICpsZXZlbCwgMSk7CisJZnJlZV9leHRlbnRfYnVmZmVyKHBhdGgtPm5vZGVzWypsZXZlbF0pOworCXBhdGgtPm5vZGVzWypsZXZlbF0gPSBOVUxMOworCSpsZXZlbCArPSAxOworCUJVR19PTihyZXQpOworCisJY29uZF9yZXNjaGVkKCk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBoZWxwZXIgZnVuY3Rpb24gZm9yIGRyb3Bfc3VidHJlZSwgdGhpcyBmdW5jdGlvbiBpcyBzaW1pbGFyIHRvCisgKiB3YWxrX2Rvd25fdHJlZS4gVGhlIG1haW4gZGlmZmVyZW5jZSBpcyB0aGF0IGl0IGNoZWNrcyByZWZlcmVuY2UKKyAqIGNvdW50cyB3aGlsZSB0cmVlIGJsb2NrcyBhcmUgbG9ja2VkLgorICovCitzdGF0aWMgbm9pbmxpbmUgaW50IHdhbGtfZG93bl9zdWJ0cmVlKHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAorCQkJCSAgICAgIHN0cnVjdCBidHJmc19yb290ICpyb290LAorCQkJCSAgICAgIHN0cnVjdCBidHJmc19wYXRoICpwYXRoLCBpbnQgKmxldmVsKQoreworCXN0cnVjdCBleHRlbnRfYnVmZmVyICpuZXh0OworCXN0cnVjdCBleHRlbnRfYnVmZmVyICpjdXI7CisJc3RydWN0IGV4dGVudF9idWZmZXIgKnBhcmVudDsKKwl1NjQgYnl0ZW5yOworCXU2NCBwdHJfZ2VuOworCXUzMiBibG9ja3NpemU7CisJdTMyIHJlZnM7CisJaW50IHJldDsKKworCWN1ciA9IHBhdGgtPm5vZGVzWypsZXZlbF07CisJcmV0ID0gYnRyZnNfbG9va3VwX2V4dGVudF9yZWYodHJhbnMsIHJvb3QsIGN1ci0+c3RhcnQsIGN1ci0+bGVuLAorCQkJCSAgICAgICZyZWZzKTsKKwlCVUdfT04ocmV0KTsKKwlpZiAocmVmcyA+IDEpCisJCWdvdG8gb3V0OworCisJd2hpbGUgKCpsZXZlbCA+PSAwKSB7CisJCWN1ciA9IHBhdGgtPm5vZGVzWypsZXZlbF07CisJCWlmICgqbGV2ZWwgPT0gMCkgeworCQkJcmV0ID0gYnRyZnNfZHJvcF9sZWFmX3JlZih0cmFucywgcm9vdCwgY3VyKTsKKwkJCUJVR19PTihyZXQpOworCQkJY2xlYW5fdHJlZV9ibG9jayh0cmFucywgcm9vdCwgY3VyKTsKKwkJCWJyZWFrOworCQl9CisJCWlmIChwYXRoLT5zbG90c1sqbGV2ZWxdID49IGJ0cmZzX2hlYWRlcl9ucml0ZW1zKGN1cikpIHsKKwkJCWNsZWFuX3RyZWVfYmxvY2sodHJhbnMsIHJvb3QsIGN1cik7CisJCQlicmVhazsKKwkJfQorCisJCWJ5dGVuciA9IGJ0cmZzX25vZGVfYmxvY2twdHIoY3VyLCBwYXRoLT5zbG90c1sqbGV2ZWxdKTsKKwkJYmxvY2tzaXplID0gYnRyZnNfbGV2ZWxfc2l6ZShyb290LCAqbGV2ZWwgLSAxKTsKKwkJcHRyX2dlbiA9IGJ0cmZzX25vZGVfcHRyX2dlbmVyYXRpb24oY3VyLCBwYXRoLT5zbG90c1sqbGV2ZWxdKTsKKworCQluZXh0ID0gcmVhZF90cmVlX2Jsb2NrKHJvb3QsIGJ5dGVuciwgYmxvY2tzaXplLCBwdHJfZ2VuKTsKKwkJYnRyZnNfdHJlZV9sb2NrKG5leHQpOworCisJCXJldCA9IGJ0cmZzX2xvb2t1cF9leHRlbnRfcmVmKHRyYW5zLCByb290LCBieXRlbnIsIGJsb2Nrc2l6ZSwKKwkJCQkJICAgICAgJnJlZnMpOworCQlCVUdfT04ocmV0KTsKKwkJaWYgKHJlZnMgPiAxKSB7CisJCQlwYXJlbnQgPSBwYXRoLT5ub2Rlc1sqbGV2ZWxdOworCQkJcmV0ID0gYnRyZnNfZnJlZV9leHRlbnQodHJhbnMsIHJvb3QsIGJ5dGVuciwKKwkJCQkJYmxvY2tzaXplLCBwYXJlbnQtPnN0YXJ0LAorCQkJCQlidHJmc19oZWFkZXJfb3duZXIocGFyZW50KSwKKwkJCQkJYnRyZnNfaGVhZGVyX2dlbmVyYXRpb24ocGFyZW50KSwKKwkJCQkJKmxldmVsIC0gMSwgMSk7CisJCQlCVUdfT04ocmV0KTsKKwkJCXBhdGgtPnNsb3RzWypsZXZlbF0rKzsKKwkJCWJ0cmZzX3RyZWVfdW5sb2NrKG5leHQpOworCQkJZnJlZV9leHRlbnRfYnVmZmVyKG5leHQpOworCQkJY29udGludWU7CisJCX0KKworCQkqbGV2ZWwgPSBidHJmc19oZWFkZXJfbGV2ZWwobmV4dCk7CisJCXBhdGgtPm5vZGVzWypsZXZlbF0gPSBuZXh0OworCQlwYXRoLT5zbG90c1sqbGV2ZWxdID0gMDsKKwkJcGF0aC0+bG9ja3NbKmxldmVsXSA9IDE7CisJCWNvbmRfcmVzY2hlZCgpOworCX0KK291dDoKKwlwYXJlbnQgPSBwYXRoLT5ub2Rlc1sqbGV2ZWwgKyAxXTsKKwlieXRlbnIgPSBwYXRoLT5ub2Rlc1sqbGV2ZWxdLT5zdGFydDsKKwlibG9ja3NpemUgPSBwYXRoLT5ub2Rlc1sqbGV2ZWxdLT5sZW47CisKKwlyZXQgPSBidHJmc19mcmVlX2V4dGVudCh0cmFucywgcm9vdCwgYnl0ZW5yLCBibG9ja3NpemUsCisJCQlwYXJlbnQtPnN0YXJ0LCBidHJmc19oZWFkZXJfb3duZXIocGFyZW50KSwKKwkJCWJ0cmZzX2hlYWRlcl9nZW5lcmF0aW9uKHBhcmVudCksICpsZXZlbCwgMSk7CisJQlVHX09OKHJldCk7CisKKwlpZiAocGF0aC0+bG9ja3NbKmxldmVsXSkgeworCQlidHJmc190cmVlX3VubG9jayhwYXRoLT5ub2Rlc1sqbGV2ZWxdKTsKKwkJcGF0aC0+bG9ja3NbKmxldmVsXSA9IDA7CisJfQorCWZyZWVfZXh0ZW50X2J1ZmZlcihwYXRoLT5ub2Rlc1sqbGV2ZWxdKTsKKwlwYXRoLT5ub2Rlc1sqbGV2ZWxdID0gTlVMTDsKKwkqbGV2ZWwgKz0gMTsKKwljb25kX3Jlc2NoZWQoKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGhlbHBlciBmb3IgZHJvcHBpbmcgc25hcHNob3RzLiAgVGhpcyB3YWxrcyBiYWNrIHVwIHRoZSB0cmVlIGluIHRoZSBwYXRoCisgKiB0byBmaW5kIHRoZSBmaXJzdCBub2RlIGhpZ2hlciB1cCB3aGVyZSB3ZSBoYXZlbid0IHlldCBnb25lIHRocm91Z2gKKyAqIGFsbCB0aGUgc2xvdHMKKyAqLworc3RhdGljIG5vaW5saW5lIGludCB3YWxrX3VwX3RyZWUoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCisJCQkJIHN0cnVjdCBidHJmc19yb290ICpyb290LAorCQkJCSBzdHJ1Y3QgYnRyZnNfcGF0aCAqcGF0aCwKKwkJCQkgaW50ICpsZXZlbCwgaW50IG1heF9sZXZlbCkKK3sKKwl1NjQgcm9vdF9vd25lcjsKKwl1NjQgcm9vdF9nZW47CisJc3RydWN0IGJ0cmZzX3Jvb3RfaXRlbSAqcm9vdF9pdGVtID0gJnJvb3QtPnJvb3RfaXRlbTsKKwlpbnQgaTsKKwlpbnQgc2xvdDsKKwlpbnQgcmV0OworCisJZm9yIChpID0gKmxldmVsOyBpIDwgbWF4X2xldmVsICYmIHBhdGgtPm5vZGVzW2ldOyBpKyspIHsKKwkJc2xvdCA9IHBhdGgtPnNsb3RzW2ldOworCQlpZiAoc2xvdCA8IGJ0cmZzX2hlYWRlcl9ucml0ZW1zKHBhdGgtPm5vZGVzW2ldKSAtIDEpIHsKKwkJCXN0cnVjdCBleHRlbnRfYnVmZmVyICpub2RlOworCQkJc3RydWN0IGJ0cmZzX2Rpc2tfa2V5IGRpc2tfa2V5OworCQkJbm9kZSA9IHBhdGgtPm5vZGVzW2ldOworCQkJcGF0aC0+c2xvdHNbaV0rKzsKKwkJCSpsZXZlbCA9IGk7CisJCQlXQVJOX09OKCpsZXZlbCA9PSAwKTsKKwkJCWJ0cmZzX25vZGVfa2V5KG5vZGUsICZkaXNrX2tleSwgcGF0aC0+c2xvdHNbaV0pOworCQkJbWVtY3B5KCZyb290X2l0ZW0tPmRyb3BfcHJvZ3Jlc3MsCisJCQkgICAgICAgJmRpc2tfa2V5LCBzaXplb2YoZGlza19rZXkpKTsKKwkJCXJvb3RfaXRlbS0+ZHJvcF9sZXZlbCA9IGk7CisJCQlyZXR1cm4gMDsKKwkJfSBlbHNlIHsKKwkJCXN0cnVjdCBleHRlbnRfYnVmZmVyICpwYXJlbnQ7CisJCQlpZiAocGF0aC0+bm9kZXNbKmxldmVsXSA9PSByb290LT5ub2RlKQorCQkJCXBhcmVudCA9IHBhdGgtPm5vZGVzWypsZXZlbF07CisJCQllbHNlCisJCQkJcGFyZW50ID0gcGF0aC0+bm9kZXNbKmxldmVsICsgMV07CisKKwkJCXJvb3Rfb3duZXIgPSBidHJmc19oZWFkZXJfb3duZXIocGFyZW50KTsKKwkJCXJvb3RfZ2VuID0gYnRyZnNfaGVhZGVyX2dlbmVyYXRpb24ocGFyZW50KTsKKworCQkJY2xlYW5fdHJlZV9ibG9jayh0cmFucywgcm9vdCwgcGF0aC0+bm9kZXNbKmxldmVsXSk7CisJCQlyZXQgPSBidHJmc19mcmVlX2V4dGVudCh0cmFucywgcm9vdCwKKwkJCQkJCXBhdGgtPm5vZGVzWypsZXZlbF0tPnN0YXJ0LAorCQkJCQkJcGF0aC0+bm9kZXNbKmxldmVsXS0+bGVuLAorCQkJCQkJcGFyZW50LT5zdGFydCwgcm9vdF9vd25lciwKKwkJCQkJCXJvb3RfZ2VuLCAqbGV2ZWwsIDEpOworCQkJQlVHX09OKHJldCk7CisJCQlpZiAocGF0aC0+bG9ja3NbKmxldmVsXSkgeworCQkJCWJ0cmZzX3RyZWVfdW5sb2NrKHBhdGgtPm5vZGVzWypsZXZlbF0pOworCQkJCXBhdGgtPmxvY2tzWypsZXZlbF0gPSAwOworCQkJfQorCQkJZnJlZV9leHRlbnRfYnVmZmVyKHBhdGgtPm5vZGVzWypsZXZlbF0pOworCQkJcGF0aC0+bm9kZXNbKmxldmVsXSA9IE5VTEw7CisJCQkqbGV2ZWwgPSBpICsgMTsKKwkJfQorCX0KKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIGRyb3AgdGhlIHJlZmVyZW5jZSBjb3VudCBvbiB0aGUgdHJlZSByb290ZWQgYXQgJ3NuYXAnLiAgVGhpcyB0cmF2ZXJzZXMKKyAqIHRoZSB0cmVlIGZyZWVpbmcgYW55IGJsb2NrcyB0aGF0IGhhdmUgYSByZWYgY291bnQgb2YgemVybyBhZnRlciBiZWluZworICogZGVjcmVtZW50ZWQuCisgKi8KK2ludCBidHJmc19kcm9wX3NuYXBzaG90KHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLCBzdHJ1Y3QgYnRyZnNfcm9vdAorCQkJKnJvb3QpCit7CisJaW50IHJldCA9IDA7CisJaW50IHdyZXQ7CisJaW50IGxldmVsOworCXN0cnVjdCBidHJmc19wYXRoICpwYXRoOworCWludCBpOworCWludCBvcmlnX2xldmVsOworCXN0cnVjdCBidHJmc19yb290X2l0ZW0gKnJvb3RfaXRlbSA9ICZyb290LT5yb290X2l0ZW07CisKKwlXQVJOX09OKCFtdXRleF9pc19sb2NrZWQoJnJvb3QtPmZzX2luZm8tPmRyb3BfbXV0ZXgpKTsKKwlwYXRoID0gYnRyZnNfYWxsb2NfcGF0aCgpOworCUJVR19PTighcGF0aCk7CisKKwlsZXZlbCA9IGJ0cmZzX2hlYWRlcl9sZXZlbChyb290LT5ub2RlKTsKKwlvcmlnX2xldmVsID0gbGV2ZWw7CisJaWYgKGJ0cmZzX2Rpc2tfa2V5X29iamVjdGlkKCZyb290X2l0ZW0tPmRyb3BfcHJvZ3Jlc3MpID09IDApIHsKKwkJcGF0aC0+bm9kZXNbbGV2ZWxdID0gcm9vdC0+bm9kZTsKKwkJZXh0ZW50X2J1ZmZlcl9nZXQocm9vdC0+bm9kZSk7CisJCXBhdGgtPnNsb3RzW2xldmVsXSA9IDA7CisJfSBlbHNlIHsKKwkJc3RydWN0IGJ0cmZzX2tleSBrZXk7CisJCXN0cnVjdCBidHJmc19kaXNrX2tleSBmb3VuZF9rZXk7CisJCXN0cnVjdCBleHRlbnRfYnVmZmVyICpub2RlOworCisJCWJ0cmZzX2Rpc2tfa2V5X3RvX2NwdSgma2V5LCAmcm9vdF9pdGVtLT5kcm9wX3Byb2dyZXNzKTsKKwkJbGV2ZWwgPSByb290X2l0ZW0tPmRyb3BfbGV2ZWw7CisJCXBhdGgtPmxvd2VzdF9sZXZlbCA9IGxldmVsOworCQl3cmV0ID0gYnRyZnNfc2VhcmNoX3Nsb3QoTlVMTCwgcm9vdCwgJmtleSwgcGF0aCwgMCwgMCk7CisJCWlmICh3cmV0IDwgMCkgeworCQkJcmV0ID0gd3JldDsKKwkJCWdvdG8gb3V0OworCQl9CisJCW5vZGUgPSBwYXRoLT5ub2Rlc1tsZXZlbF07CisJCWJ0cmZzX25vZGVfa2V5KG5vZGUsICZmb3VuZF9rZXksIHBhdGgtPnNsb3RzW2xldmVsXSk7CisJCVdBUk5fT04obWVtY21wKCZmb3VuZF9rZXksICZyb290X2l0ZW0tPmRyb3BfcHJvZ3Jlc3MsCisJCQkgICAgICAgc2l6ZW9mKGZvdW5kX2tleSkpKTsKKwkJLyoKKwkJICogdW5sb2NrIG91ciBwYXRoLCB0aGlzIGlzIHNhZmUgYmVjYXVzZSBvbmx5IHRoaXMKKwkJICogZnVuY3Rpb24gaXMgYWxsb3dlZCB0byBkZWxldGUgdGhpcyBzbmFwc2hvdAorCQkgKi8KKwkJZm9yIChpID0gMDsgaSA8IEJUUkZTX01BWF9MRVZFTDsgaSsrKSB7CisJCQlpZiAocGF0aC0+bm9kZXNbaV0gJiYgcGF0aC0+bG9ja3NbaV0pIHsKKwkJCQlwYXRoLT5sb2Nrc1tpXSA9IDA7CisJCQkJYnRyZnNfdHJlZV91bmxvY2socGF0aC0+bm9kZXNbaV0pOworCQkJfQorCQl9CisJfQorCXdoaWxlICgxKSB7CisJCXdyZXQgPSB3YWxrX2Rvd25fdHJlZSh0cmFucywgcm9vdCwgcGF0aCwgJmxldmVsKTsKKwkJaWYgKHdyZXQgPiAwKQorCQkJYnJlYWs7CisJCWlmICh3cmV0IDwgMCkKKwkJCXJldCA9IHdyZXQ7CisKKwkJd3JldCA9IHdhbGtfdXBfdHJlZSh0cmFucywgcm9vdCwgcGF0aCwgJmxldmVsLAorCQkJCSAgICBCVFJGU19NQVhfTEVWRUwpOworCQlpZiAod3JldCA+IDApCisJCQlicmVhazsKKwkJaWYgKHdyZXQgPCAwKQorCQkJcmV0ID0gd3JldDsKKwkJaWYgKHRyYW5zLT50cmFuc2FjdGlvbi0+aW5fY29tbWl0KSB7CisJCQlyZXQgPSAtRUFHQUlOOworCQkJYnJlYWs7CisJCX0KKwkJYXRvbWljX2luYygmcm9vdC0+ZnNfaW5mby0+dGhyb3R0bGVfZ2VuKTsKKwkJd2FrZV91cCgmcm9vdC0+ZnNfaW5mby0+dHJhbnNhY3Rpb25fdGhyb3R0bGUpOworCX0KKwlmb3IgKGkgPSAwOyBpIDw9IG9yaWdfbGV2ZWw7IGkrKykgeworCQlpZiAocGF0aC0+bm9kZXNbaV0pIHsKKwkJCWZyZWVfZXh0ZW50X2J1ZmZlcihwYXRoLT5ub2Rlc1tpXSk7CisJCQlwYXRoLT5ub2Rlc1tpXSA9IE5VTEw7CisJCX0KKwl9CitvdXQ6CisJYnRyZnNfZnJlZV9wYXRoKHBhdGgpOworCXJldHVybiByZXQ7Cit9CisKK2ludCBidHJmc19kcm9wX3N1YnRyZWUoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCisJCQlzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwKKwkJCXN0cnVjdCBleHRlbnRfYnVmZmVyICpub2RlLAorCQkJc3RydWN0IGV4dGVudF9idWZmZXIgKnBhcmVudCkKK3sKKwlzdHJ1Y3QgYnRyZnNfcGF0aCAqcGF0aDsKKwlpbnQgbGV2ZWw7CisJaW50IHBhcmVudF9sZXZlbDsKKwlpbnQgcmV0ID0gMDsKKwlpbnQgd3JldDsKKworCXBhdGggPSBidHJmc19hbGxvY19wYXRoKCk7CisJQlVHX09OKCFwYXRoKTsKKworCUJVR19PTighYnRyZnNfdHJlZV9sb2NrZWQocGFyZW50KSk7CisJcGFyZW50X2xldmVsID0gYnRyZnNfaGVhZGVyX2xldmVsKHBhcmVudCk7CisJZXh0ZW50X2J1ZmZlcl9nZXQocGFyZW50KTsKKwlwYXRoLT5ub2Rlc1twYXJlbnRfbGV2ZWxdID0gcGFyZW50OworCXBhdGgtPnNsb3RzW3BhcmVudF9sZXZlbF0gPSBidHJmc19oZWFkZXJfbnJpdGVtcyhwYXJlbnQpOworCisJQlVHX09OKCFidHJmc190cmVlX2xvY2tlZChub2RlKSk7CisJbGV2ZWwgPSBidHJmc19oZWFkZXJfbGV2ZWwobm9kZSk7CisJZXh0ZW50X2J1ZmZlcl9nZXQobm9kZSk7CisJcGF0aC0+bm9kZXNbbGV2ZWxdID0gbm9kZTsKKwlwYXRoLT5zbG90c1tsZXZlbF0gPSAwOworCisJd2hpbGUgKDEpIHsKKwkJd3JldCA9IHdhbGtfZG93bl9zdWJ0cmVlKHRyYW5zLCByb290LCBwYXRoLCAmbGV2ZWwpOworCQlpZiAod3JldCA8IDApCisJCQlyZXQgPSB3cmV0OworCQlpZiAod3JldCAhPSAwKQorCQkJYnJlYWs7CisKKwkJd3JldCA9IHdhbGtfdXBfdHJlZSh0cmFucywgcm9vdCwgcGF0aCwgJmxldmVsLCBwYXJlbnRfbGV2ZWwpOworCQlpZiAod3JldCA8IDApCisJCQlyZXQgPSB3cmV0OworCQlpZiAod3JldCAhPSAwKQorCQkJYnJlYWs7CisJfQorCisJYnRyZnNfZnJlZV9wYXRoKHBhdGgpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGNhbGNfcmEodW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBsYXN0LAorCQkJICAgICB1bnNpZ25lZCBsb25nIG5yKQoreworCXJldHVybiBtaW4obGFzdCwgc3RhcnQgKyBuciAtIDEpOworfQorCitzdGF0aWMgbm9pbmxpbmUgaW50IHJlbG9jYXRlX2lub2RlX3BhZ2VzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHU2NCBzdGFydCwKKwkJCQkJIHU2NCBsZW4pCit7CisJdTY0IHBhZ2Vfc3RhcnQ7CisJdTY0IHBhZ2VfZW5kOworCXVuc2lnbmVkIGxvbmcgZmlyc3RfaW5kZXg7CisJdW5zaWduZWQgbG9uZyBsYXN0X2luZGV4OworCXVuc2lnbmVkIGxvbmcgaTsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwlzdHJ1Y3QgZXh0ZW50X2lvX3RyZWUgKmlvX3RyZWUgPSAmQlRSRlNfSShpbm9kZSktPmlvX3RyZWU7CisJc3RydWN0IGZpbGVfcmFfc3RhdGUgKnJhOworCXN0cnVjdCBidHJmc19vcmRlcmVkX2V4dGVudCAqb3JkZXJlZDsKKwl1bnNpZ25lZCBpbnQgdG90YWxfcmVhZCA9IDA7CisJdW5zaWduZWQgaW50IHRvdGFsX2RpcnR5ID0gMDsKKwlpbnQgcmV0ID0gMDsKKworCXJhID0ga3phbGxvYyhzaXplb2YoKnJhKSwgR0ZQX05PRlMpOworCisJbXV0ZXhfbG9jaygmaW5vZGUtPmlfbXV0ZXgpOworCWZpcnN0X2luZGV4ID0gc3RhcnQgPj4gUEFHRV9DQUNIRV9TSElGVDsKKwlsYXN0X2luZGV4ID0gKHN0YXJ0ICsgbGVuIC0gMSkgPj4gUEFHRV9DQUNIRV9TSElGVDsKKworCS8qIG1ha2Ugc3VyZSB0aGUgZGlydHkgdHJpY2sgcGxheWVkIGJ5IHRoZSBjYWxsZXIgd29yayAqLworCXJldCA9IGludmFsaWRhdGVfaW5vZGVfcGFnZXMyX3JhbmdlKGlub2RlLT5pX21hcHBpbmcsCisJCQkJCSAgICBmaXJzdF9pbmRleCwgbGFzdF9pbmRleCk7CisJaWYgKHJldCkKKwkJZ290byBvdXRfdW5sb2NrOworCisJZmlsZV9yYV9zdGF0ZV9pbml0KHJhLCBpbm9kZS0+aV9tYXBwaW5nKTsKKworCWZvciAoaSA9IGZpcnN0X2luZGV4IDsgaSA8PSBsYXN0X2luZGV4OyBpKyspIHsKKwkJaWYgKHRvdGFsX3JlYWQgJSByYS0+cmFfcGFnZXMgPT0gMCkgeworCQkJYnRyZnNfZm9yY2VfcmEoaW5vZGUtPmlfbWFwcGluZywgcmEsIE5VTEwsIGksCisJCQkJICAgICAgIGNhbGNfcmEoaSwgbGFzdF9pbmRleCwgcmEtPnJhX3BhZ2VzKSk7CisJCX0KKwkJdG90YWxfcmVhZCsrOworYWdhaW46CisJCWlmICgoKHU2NClpIDw8IFBBR0VfQ0FDSEVfU0hJRlQpID4gaV9zaXplX3JlYWQoaW5vZGUpKQorCQkJQlVHX09OKDEpOworCQlwYWdlID0gZ3JhYl9jYWNoZV9wYWdlKGlub2RlLT5pX21hcHBpbmcsIGkpOworCQlpZiAoIXBhZ2UpIHsKKwkJCXJldCA9IC1FTk9NRU07CisJCQlnb3RvIG91dF91bmxvY2s7CisJCX0KKwkJaWYgKCFQYWdlVXB0b2RhdGUocGFnZSkpIHsKKwkJCWJ0cmZzX3JlYWRwYWdlKE5VTEwsIHBhZ2UpOworCQkJbG9ja19wYWdlKHBhZ2UpOworCQkJaWYgKCFQYWdlVXB0b2RhdGUocGFnZSkpIHsKKwkJCQl1bmxvY2tfcGFnZShwYWdlKTsKKwkJCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CisJCQkJcmV0ID0gLUVJTzsKKwkJCQlnb3RvIG91dF91bmxvY2s7CisJCQl9CisJCX0KKwkJd2FpdF9vbl9wYWdlX3dyaXRlYmFjayhwYWdlKTsKKworCQlwYWdlX3N0YXJ0ID0gKHU2NClwYWdlLT5pbmRleCA8PCBQQUdFX0NBQ0hFX1NISUZUOworCQlwYWdlX2VuZCA9IHBhZ2Vfc3RhcnQgKyBQQUdFX0NBQ0hFX1NJWkUgLSAxOworCQlsb2NrX2V4dGVudChpb190cmVlLCBwYWdlX3N0YXJ0LCBwYWdlX2VuZCwgR0ZQX05PRlMpOworCisJCW9yZGVyZWQgPSBidHJmc19sb29rdXBfb3JkZXJlZF9leHRlbnQoaW5vZGUsIHBhZ2Vfc3RhcnQpOworCQlpZiAob3JkZXJlZCkgeworCQkJdW5sb2NrX2V4dGVudChpb190cmVlLCBwYWdlX3N0YXJ0LCBwYWdlX2VuZCwgR0ZQX05PRlMpOworCQkJdW5sb2NrX3BhZ2UocGFnZSk7CisJCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CisJCQlidHJmc19zdGFydF9vcmRlcmVkX2V4dGVudChpbm9kZSwgb3JkZXJlZCwgMSk7CisJCQlidHJmc19wdXRfb3JkZXJlZF9leHRlbnQob3JkZXJlZCk7CisJCQlnb3RvIGFnYWluOworCQl9CisJCXNldF9wYWdlX2V4dGVudF9tYXBwZWQocGFnZSk7CisKKwkJaWYgKGkgPT0gZmlyc3RfaW5kZXgpCisJCQlzZXRfZXh0ZW50X2JpdHMoaW9fdHJlZSwgcGFnZV9zdGFydCwgcGFnZV9lbmQsCisJCQkJCUVYVEVOVF9CT1VOREFSWSwgR0ZQX05PRlMpOworCQlidHJmc19zZXRfZXh0ZW50X2RlbGFsbG9jKGlub2RlLCBwYWdlX3N0YXJ0LCBwYWdlX2VuZCk7CisKKwkJc2V0X3BhZ2VfZGlydHkocGFnZSk7CisJCXRvdGFsX2RpcnR5Kys7CisKKwkJdW5sb2NrX2V4dGVudChpb190cmVlLCBwYWdlX3N0YXJ0LCBwYWdlX2VuZCwgR0ZQX05PRlMpOworCQl1bmxvY2tfcGFnZShwYWdlKTsKKwkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOworCX0KKworb3V0X3VubG9jazoKKwlrZnJlZShyYSk7CisJbXV0ZXhfdW5sb2NrKCZpbm9kZS0+aV9tdXRleCk7CisJYmFsYW5jZV9kaXJ0eV9wYWdlc19yYXRlbGltaXRlZF9ucihpbm9kZS0+aV9tYXBwaW5nLCB0b3RhbF9kaXJ0eSk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIG5vaW5saW5lIGludCByZWxvY2F0ZV9kYXRhX2V4dGVudChzdHJ1Y3QgaW5vZGUgKnJlbG9jX2lub2RlLAorCQkJCQkgc3RydWN0IGJ0cmZzX2tleSAqZXh0ZW50X2tleSwKKwkJCQkJIHU2NCBvZmZzZXQpCit7CisJc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QgPSBCVFJGU19JKHJlbG9jX2lub2RlKS0+cm9vdDsKKwlzdHJ1Y3QgZXh0ZW50X21hcF90cmVlICplbV90cmVlID0gJkJUUkZTX0kocmVsb2NfaW5vZGUpLT5leHRlbnRfdHJlZTsKKwlzdHJ1Y3QgZXh0ZW50X21hcCAqZW07CisJdTY0IHN0YXJ0ID0gZXh0ZW50X2tleS0+b2JqZWN0aWQgLSBvZmZzZXQ7CisJdTY0IGVuZCA9IHN0YXJ0ICsgZXh0ZW50X2tleS0+b2Zmc2V0IC0gMTsKKworCWVtID0gYWxsb2NfZXh0ZW50X21hcChHRlBfTk9GUyk7CisJQlVHX09OKCFlbSB8fCBJU19FUlIoZW0pKTsKKworCWVtLT5zdGFydCA9IHN0YXJ0OworCWVtLT5sZW4gPSBleHRlbnRfa2V5LT5vZmZzZXQ7CisJZW0tPmJsb2NrX2xlbiA9IGV4dGVudF9rZXktPm9mZnNldDsKKwllbS0+YmxvY2tfc3RhcnQgPSBleHRlbnRfa2V5LT5vYmplY3RpZDsKKwllbS0+YmRldiA9IHJvb3QtPmZzX2luZm8tPmZzX2RldmljZXMtPmxhdGVzdF9iZGV2OworCXNldF9iaXQoRVhURU5UX0ZMQUdfUElOTkVELCAmZW0tPmZsYWdzKTsKKworCS8qIHNldHVwIGV4dGVudCBtYXAgdG8gY2hlYXQgYnRyZnNfcmVhZHBhZ2UgKi8KKwlsb2NrX2V4dGVudCgmQlRSRlNfSShyZWxvY19pbm9kZSktPmlvX3RyZWUsIHN0YXJ0LCBlbmQsIEdGUF9OT0ZTKTsKKwl3aGlsZSAoMSkgeworCQlpbnQgcmV0OworCQlzcGluX2xvY2soJmVtX3RyZWUtPmxvY2spOworCQlyZXQgPSBhZGRfZXh0ZW50X21hcHBpbmcoZW1fdHJlZSwgZW0pOworCQlzcGluX3VubG9jaygmZW1fdHJlZS0+bG9jayk7CisJCWlmIChyZXQgIT0gLUVFWElTVCkgeworCQkJZnJlZV9leHRlbnRfbWFwKGVtKTsKKwkJCWJyZWFrOworCQl9CisJCWJ0cmZzX2Ryb3BfZXh0ZW50X2NhY2hlKHJlbG9jX2lub2RlLCBzdGFydCwgZW5kLCAwKTsKKwl9CisJdW5sb2NrX2V4dGVudCgmQlRSRlNfSShyZWxvY19pbm9kZSktPmlvX3RyZWUsIHN0YXJ0LCBlbmQsIEdGUF9OT0ZTKTsKKworCXJldHVybiByZWxvY2F0ZV9pbm9kZV9wYWdlcyhyZWxvY19pbm9kZSwgc3RhcnQsIGV4dGVudF9rZXktPm9mZnNldCk7Cit9CisKK3N0cnVjdCBidHJmc19yZWZfcGF0aCB7CisJdTY0IGV4dGVudF9zdGFydDsKKwl1NjQgbm9kZXNbQlRSRlNfTUFYX0xFVkVMXTsKKwl1NjQgcm9vdF9vYmplY3RpZDsKKwl1NjQgcm9vdF9nZW5lcmF0aW9uOworCXU2NCBvd25lcl9vYmplY3RpZDsKKwl1MzIgbnVtX3JlZnM7CisJaW50IGxvd2VzdF9sZXZlbDsKKwlpbnQgY3VycmVudF9sZXZlbDsKKwlpbnQgc2hhcmVkX2xldmVsOworCisJc3RydWN0IGJ0cmZzX2tleSBub2RlX2tleXNbQlRSRlNfTUFYX0xFVkVMXTsKKwl1NjQgbmV3X25vZGVzW0JUUkZTX01BWF9MRVZFTF07Cit9OworCitzdHJ1Y3QgZGlza19leHRlbnQgeworCXU2NCByYW1fYnl0ZXM7CisJdTY0IGRpc2tfYnl0ZW5yOworCXU2NCBkaXNrX251bV9ieXRlczsKKwl1NjQgb2Zmc2V0OworCXU2NCBudW1fYnl0ZXM7CisJdTggY29tcHJlc3Npb247CisJdTggZW5jcnlwdGlvbjsKKwl1MTYgb3RoZXJfZW5jb2Rpbmc7Cit9OworCitzdGF0aWMgaW50IGlzX2Nvd29ubHlfcm9vdCh1NjQgcm9vdF9vYmplY3RpZCkKK3sKKwlpZiAocm9vdF9vYmplY3RpZCA9PSBCVFJGU19ST09UX1RSRUVfT0JKRUNUSUQgfHwKKwkgICAgcm9vdF9vYmplY3RpZCA9PSBCVFJGU19FWFRFTlRfVFJFRV9PQkpFQ1RJRCB8fAorCSAgICByb290X29iamVjdGlkID09IEJUUkZTX0NIVU5LX1RSRUVfT0JKRUNUSUQgfHwKKwkgICAgcm9vdF9vYmplY3RpZCA9PSBCVFJGU19ERVZfVFJFRV9PQkpFQ1RJRCB8fAorCSAgICByb290X29iamVjdGlkID09IEJUUkZTX1RSRUVfTE9HX09CSkVDVElEIHx8CisJICAgIHJvb3Rfb2JqZWN0aWQgPT0gQlRSRlNfQ1NVTV9UUkVFX09CSkVDVElEKQorCQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIG5vaW5saW5lIGludCBfX25leHRfcmVmX3BhdGgoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCisJCQkJICAgIHN0cnVjdCBidHJmc19yb290ICpleHRlbnRfcm9vdCwKKwkJCQkgICAgc3RydWN0IGJ0cmZzX3JlZl9wYXRoICpyZWZfcGF0aCwKKwkJCQkgICAgaW50IGZpcnN0X3RpbWUpCit7CisJc3RydWN0IGV4dGVudF9idWZmZXIgKmxlYWY7CisJc3RydWN0IGJ0cmZzX3BhdGggKnBhdGg7CisJc3RydWN0IGJ0cmZzX2V4dGVudF9yZWYgKnJlZjsKKwlzdHJ1Y3QgYnRyZnNfa2V5IGtleTsKKwlzdHJ1Y3QgYnRyZnNfa2V5IGZvdW5kX2tleTsKKwl1NjQgYnl0ZW5yOworCXUzMiBucml0ZW1zOworCWludCBsZXZlbDsKKwlpbnQgcmV0ID0gMTsKKworCXBhdGggPSBidHJmc19hbGxvY19wYXRoKCk7CisJaWYgKCFwYXRoKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWlmIChmaXJzdF90aW1lKSB7CisJCXJlZl9wYXRoLT5sb3dlc3RfbGV2ZWwgPSAtMTsKKwkJcmVmX3BhdGgtPmN1cnJlbnRfbGV2ZWwgPSAtMTsKKwkJcmVmX3BhdGgtPnNoYXJlZF9sZXZlbCA9IC0xOworCQlnb3RvIHdhbGtfdXA7CisJfQord2Fsa19kb3duOgorCWxldmVsID0gcmVmX3BhdGgtPmN1cnJlbnRfbGV2ZWwgLSAxOworCXdoaWxlIChsZXZlbCA+PSAtMSkgeworCQl1NjQgcGFyZW50OworCQlpZiAobGV2ZWwgPCByZWZfcGF0aC0+bG93ZXN0X2xldmVsKQorCQkJYnJlYWs7CisKKwkJaWYgKGxldmVsID49IDApCisJCQlieXRlbnIgPSByZWZfcGF0aC0+bm9kZXNbbGV2ZWxdOworCQllbHNlCisJCQlieXRlbnIgPSByZWZfcGF0aC0+ZXh0ZW50X3N0YXJ0OworCQlCVUdfT04oYnl0ZW5yID09IDApOworCisJCXBhcmVudCA9IHJlZl9wYXRoLT5ub2Rlc1tsZXZlbCArIDFdOworCQlyZWZfcGF0aC0+bm9kZXNbbGV2ZWwgKyAxXSA9IDA7CisJCXJlZl9wYXRoLT5jdXJyZW50X2xldmVsID0gbGV2ZWw7CisJCUJVR19PTihwYXJlbnQgPT0gMCk7CisKKwkJa2V5Lm9iamVjdGlkID0gYnl0ZW5yOworCQlrZXkub2Zmc2V0ID0gcGFyZW50ICsgMTsKKwkJa2V5LnR5cGUgPSBCVFJGU19FWFRFTlRfUkVGX0tFWTsKKworCQlyZXQgPSBidHJmc19zZWFyY2hfc2xvdCh0cmFucywgZXh0ZW50X3Jvb3QsICZrZXksIHBhdGgsIDAsIDApOworCQlpZiAocmV0IDwgMCkKKwkJCWdvdG8gb3V0OworCQlCVUdfT04ocmV0ID09IDApOworCisJCWxlYWYgPSBwYXRoLT5ub2Rlc1swXTsKKwkJbnJpdGVtcyA9IGJ0cmZzX2hlYWRlcl9ucml0ZW1zKGxlYWYpOworCQlpZiAocGF0aC0+c2xvdHNbMF0gPj0gbnJpdGVtcykgeworCQkJcmV0ID0gYnRyZnNfbmV4dF9sZWFmKGV4dGVudF9yb290LCBwYXRoKTsKKwkJCWlmIChyZXQgPCAwKQorCQkJCWdvdG8gb3V0OworCQkJaWYgKHJldCA+IDApCisJCQkJZ290byBuZXh0OworCQkJbGVhZiA9IHBhdGgtPm5vZGVzWzBdOworCQl9CisKKwkJYnRyZnNfaXRlbV9rZXlfdG9fY3B1KGxlYWYsICZmb3VuZF9rZXksIHBhdGgtPnNsb3RzWzBdKTsKKwkJaWYgKGZvdW5kX2tleS5vYmplY3RpZCA9PSBieXRlbnIgJiYKKwkJICAgIGZvdW5kX2tleS50eXBlID09IEJUUkZTX0VYVEVOVF9SRUZfS0VZKSB7CisJCQlpZiAobGV2ZWwgPCByZWZfcGF0aC0+c2hhcmVkX2xldmVsKQorCQkJCXJlZl9wYXRoLT5zaGFyZWRfbGV2ZWwgPSBsZXZlbDsKKwkJCWdvdG8gZm91bmQ7CisJCX0KK25leHQ6CisJCWxldmVsLS07CisJCWJ0cmZzX3JlbGVhc2VfcGF0aChleHRlbnRfcm9vdCwgcGF0aCk7CisJCWNvbmRfcmVzY2hlZCgpOworCX0KKwkvKiByZWFjaGVkIGxvd2VzdCBsZXZlbCAqLworCXJldCA9IDE7CisJZ290byBvdXQ7Cit3YWxrX3VwOgorCWxldmVsID0gcmVmX3BhdGgtPmN1cnJlbnRfbGV2ZWw7CisJd2hpbGUgKGxldmVsIDwgQlRSRlNfTUFYX0xFVkVMIC0gMSkgeworCQl1NjQgcmVmX29iamVjdGlkOworCisJCWlmIChsZXZlbCA+PSAwKQorCQkJYnl0ZW5yID0gcmVmX3BhdGgtPm5vZGVzW2xldmVsXTsKKwkJZWxzZQorCQkJYnl0ZW5yID0gcmVmX3BhdGgtPmV4dGVudF9zdGFydDsKKworCQlCVUdfT04oYnl0ZW5yID09IDApOworCisJCWtleS5vYmplY3RpZCA9IGJ5dGVucjsKKwkJa2V5Lm9mZnNldCA9IDA7CisJCWtleS50eXBlID0gQlRSRlNfRVhURU5UX1JFRl9LRVk7CisKKwkJcmV0ID0gYnRyZnNfc2VhcmNoX3Nsb3QodHJhbnMsIGV4dGVudF9yb290LCAma2V5LCBwYXRoLCAwLCAwKTsKKwkJaWYgKHJldCA8IDApCisJCQlnb3RvIG91dDsKKworCQlsZWFmID0gcGF0aC0+bm9kZXNbMF07CisJCW5yaXRlbXMgPSBidHJmc19oZWFkZXJfbnJpdGVtcyhsZWFmKTsKKwkJaWYgKHBhdGgtPnNsb3RzWzBdID49IG5yaXRlbXMpIHsKKwkJCXJldCA9IGJ0cmZzX25leHRfbGVhZihleHRlbnRfcm9vdCwgcGF0aCk7CisJCQlpZiAocmV0IDwgMCkKKwkJCQlnb3RvIG91dDsKKwkJCWlmIChyZXQgPiAwKSB7CisJCQkJLyogdGhlIGV4dGVudCB3YXMgZnJlZWQgYnkgc29tZW9uZSAqLworCQkJCWlmIChyZWZfcGF0aC0+bG93ZXN0X2xldmVsID09IGxldmVsKQorCQkJCQlnb3RvIG91dDsKKwkJCQlidHJmc19yZWxlYXNlX3BhdGgoZXh0ZW50X3Jvb3QsIHBhdGgpOworCQkJCWdvdG8gd2Fsa19kb3duOworCQkJfQorCQkJbGVhZiA9IHBhdGgtPm5vZGVzWzBdOworCQl9CisKKwkJYnRyZnNfaXRlbV9rZXlfdG9fY3B1KGxlYWYsICZmb3VuZF9rZXksIHBhdGgtPnNsb3RzWzBdKTsKKwkJaWYgKGZvdW5kX2tleS5vYmplY3RpZCAhPSBieXRlbnIgfHwKKwkJCQlmb3VuZF9rZXkudHlwZSAhPSBCVFJGU19FWFRFTlRfUkVGX0tFWSkgeworCQkJLyogdGhlIGV4dGVudCB3YXMgZnJlZWQgYnkgc29tZW9uZSAqLworCQkJaWYgKHJlZl9wYXRoLT5sb3dlc3RfbGV2ZWwgPT0gbGV2ZWwpIHsKKwkJCQlyZXQgPSAxOworCQkJCWdvdG8gb3V0OworCQkJfQorCQkJYnRyZnNfcmVsZWFzZV9wYXRoKGV4dGVudF9yb290LCBwYXRoKTsKKwkJCWdvdG8gd2Fsa19kb3duOworCQl9Citmb3VuZDoKKwkJcmVmID0gYnRyZnNfaXRlbV9wdHIobGVhZiwgcGF0aC0+c2xvdHNbMF0sCisJCQkJc3RydWN0IGJ0cmZzX2V4dGVudF9yZWYpOworCQlyZWZfb2JqZWN0aWQgPSBidHJmc19yZWZfb2JqZWN0aWQobGVhZiwgcmVmKTsKKwkJaWYgKHJlZl9vYmplY3RpZCA8IEJUUkZTX0ZJUlNUX0ZSRUVfT0JKRUNUSUQpIHsKKwkJCWlmIChmaXJzdF90aW1lKSB7CisJCQkJbGV2ZWwgPSAoaW50KXJlZl9vYmplY3RpZDsKKwkJCQlCVUdfT04obGV2ZWwgPj0gQlRSRlNfTUFYX0xFVkVMKTsKKwkJCQlyZWZfcGF0aC0+bG93ZXN0X2xldmVsID0gbGV2ZWw7CisJCQkJcmVmX3BhdGgtPmN1cnJlbnRfbGV2ZWwgPSBsZXZlbDsKKwkJCQlyZWZfcGF0aC0+bm9kZXNbbGV2ZWxdID0gYnl0ZW5yOworCQkJfSBlbHNlIHsKKwkJCQlXQVJOX09OKHJlZl9vYmplY3RpZCAhPSBsZXZlbCk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlXQVJOX09OKGxldmVsICE9IC0xKTsKKwkJfQorCQlmaXJzdF90aW1lID0gMDsKKworCQlpZiAocmVmX3BhdGgtPmxvd2VzdF9sZXZlbCA9PSBsZXZlbCkgeworCQkJcmVmX3BhdGgtPm93bmVyX29iamVjdGlkID0gcmVmX29iamVjdGlkOworCQkJcmVmX3BhdGgtPm51bV9yZWZzID0gYnRyZnNfcmVmX251bV9yZWZzKGxlYWYsIHJlZik7CisJCX0KKworCQkvKgorCQkgKiB0aGUgYmxvY2sgaXMgdHJlZSByb290IG9yIHRoZSBibG9jayBpc24ndCBpbiByZWZlcmVuY2UKKwkJICogY291bnRlZCB0cmVlLgorCQkgKi8KKwkJaWYgKGZvdW5kX2tleS5vYmplY3RpZCA9PSBmb3VuZF9rZXkub2Zmc2V0IHx8CisJCSAgICBpc19jb3dvbmx5X3Jvb3QoYnRyZnNfcmVmX3Jvb3QobGVhZiwgcmVmKSkpIHsKKwkJCXJlZl9wYXRoLT5yb290X29iamVjdGlkID0gYnRyZnNfcmVmX3Jvb3QobGVhZiwgcmVmKTsKKwkJCXJlZl9wYXRoLT5yb290X2dlbmVyYXRpb24gPQorCQkJCWJ0cmZzX3JlZl9nZW5lcmF0aW9uKGxlYWYsIHJlZik7CisJCQlpZiAobGV2ZWwgPCAwKSB7CisJCQkJLyogc3BlY2lhbCByZWZlcmVuY2UgZnJvbSB0aGUgdHJlZSBsb2cgKi8KKwkJCQlyZWZfcGF0aC0+bm9kZXNbMF0gPSBmb3VuZF9rZXkub2Zmc2V0OworCQkJCXJlZl9wYXRoLT5jdXJyZW50X2xldmVsID0gMDsKKwkJCX0KKwkJCXJldCA9IDA7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCWxldmVsKys7CisJCUJVR19PTihyZWZfcGF0aC0+bm9kZXNbbGV2ZWxdICE9IDApOworCQlyZWZfcGF0aC0+bm9kZXNbbGV2ZWxdID0gZm91bmRfa2V5Lm9mZnNldDsKKwkJcmVmX3BhdGgtPmN1cnJlbnRfbGV2ZWwgPSBsZXZlbDsKKworCQkvKgorCQkgKiB0aGUgcmVmZXJlbmNlIHdhcyBjcmVhdGVkIGluIHRoZSBydW5uaW5nIHRyYW5zYWN0aW9uLAorCQkgKiBubyBuZWVkIHRvIGNvbnRpbnVlIHdhbGtpbmcgdXAuCisJCSAqLworCQlpZiAoYnRyZnNfcmVmX2dlbmVyYXRpb24obGVhZiwgcmVmKSA9PSB0cmFucy0+dHJhbnNpZCkgeworCQkJcmVmX3BhdGgtPnJvb3Rfb2JqZWN0aWQgPSBidHJmc19yZWZfcm9vdChsZWFmLCByZWYpOworCQkJcmVmX3BhdGgtPnJvb3RfZ2VuZXJhdGlvbiA9CisJCQkJYnRyZnNfcmVmX2dlbmVyYXRpb24obGVhZiwgcmVmKTsKKwkJCXJldCA9IDA7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCWJ0cmZzX3JlbGVhc2VfcGF0aChleHRlbnRfcm9vdCwgcGF0aCk7CisJCWNvbmRfcmVzY2hlZCgpOworCX0KKwkvKiByZWFjaGVkIG1heCB0cmVlIGxldmVsLCBidXQgbm8gdHJlZSByb290IGZvdW5kLiAqLworCUJVRygpOworb3V0OgorCWJ0cmZzX2ZyZWVfcGF0aChwYXRoKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGJ0cmZzX2ZpcnN0X3JlZl9wYXRoKHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAorCQkJCXN0cnVjdCBidHJmc19yb290ICpleHRlbnRfcm9vdCwKKwkJCQlzdHJ1Y3QgYnRyZnNfcmVmX3BhdGggKnJlZl9wYXRoLAorCQkJCXU2NCBleHRlbnRfc3RhcnQpCit7CisJbWVtc2V0KHJlZl9wYXRoLCAwLCBzaXplb2YoKnJlZl9wYXRoKSk7CisJcmVmX3BhdGgtPmV4dGVudF9zdGFydCA9IGV4dGVudF9zdGFydDsKKworCXJldHVybiBfX25leHRfcmVmX3BhdGgodHJhbnMsIGV4dGVudF9yb290LCByZWZfcGF0aCwgMSk7Cit9CisKK3N0YXRpYyBpbnQgYnRyZnNfbmV4dF9yZWZfcGF0aChzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKKwkJCSAgICAgICBzdHJ1Y3QgYnRyZnNfcm9vdCAqZXh0ZW50X3Jvb3QsCisJCQkgICAgICAgc3RydWN0IGJ0cmZzX3JlZl9wYXRoICpyZWZfcGF0aCkKK3sKKwlyZXR1cm4gX19uZXh0X3JlZl9wYXRoKHRyYW5zLCBleHRlbnRfcm9vdCwgcmVmX3BhdGgsIDApOworfQorCitzdGF0aWMgbm9pbmxpbmUgaW50IGdldF9uZXdfbG9jYXRpb25zKHN0cnVjdCBpbm9kZSAqcmVsb2NfaW5vZGUsCisJCQkJICAgICAgc3RydWN0IGJ0cmZzX2tleSAqZXh0ZW50X2tleSwKKwkJCQkgICAgICB1NjQgb2Zmc2V0LCBpbnQgbm9fZnJhZ21lbnQsCisJCQkJICAgICAgc3RydWN0IGRpc2tfZXh0ZW50ICoqZXh0ZW50cywKKwkJCQkgICAgICBpbnQgKm5yX2V4dGVudHMpCit7CisJc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QgPSBCVFJGU19JKHJlbG9jX2lub2RlKS0+cm9vdDsKKwlzdHJ1Y3QgYnRyZnNfcGF0aCAqcGF0aDsKKwlzdHJ1Y3QgYnRyZnNfZmlsZV9leHRlbnRfaXRlbSAqZmk7CisJc3RydWN0IGV4dGVudF9idWZmZXIgKmxlYWY7CisJc3RydWN0IGRpc2tfZXh0ZW50ICpleHRzID0gKmV4dGVudHM7CisJc3RydWN0IGJ0cmZzX2tleSBmb3VuZF9rZXk7CisJdTY0IGN1cl9wb3M7CisJdTY0IGxhc3RfYnl0ZTsKKwl1MzIgbnJpdGVtczsKKwlpbnQgbnIgPSAwOworCWludCBtYXggPSAqbnJfZXh0ZW50czsKKwlpbnQgcmV0OworCisJV0FSTl9PTighbm9fZnJhZ21lbnQgJiYgKmV4dGVudHMpOworCWlmICghZXh0cykgeworCQltYXggPSAxOworCQlleHRzID0ga21hbGxvYyhzaXplb2YoKmV4dHMpICogbWF4LCBHRlBfTk9GUyk7CisJCWlmICghZXh0cykKKwkJCXJldHVybiAtRU5PTUVNOworCX0KKworCXBhdGggPSBidHJmc19hbGxvY19wYXRoKCk7CisJQlVHX09OKCFwYXRoKTsKKworCWN1cl9wb3MgPSBleHRlbnRfa2V5LT5vYmplY3RpZCAtIG9mZnNldDsKKwlsYXN0X2J5dGUgPSBleHRlbnRfa2V5LT5vYmplY3RpZCArIGV4dGVudF9rZXktPm9mZnNldDsKKwlyZXQgPSBidHJmc19sb29rdXBfZmlsZV9leHRlbnQoTlVMTCwgcm9vdCwgcGF0aCwgcmVsb2NfaW5vZGUtPmlfaW5vLAorCQkJCSAgICAgICBjdXJfcG9zLCAwKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXQ7CisJaWYgKHJldCA+IDApIHsKKwkJcmV0ID0gLUVOT0VOVDsKKwkJZ290byBvdXQ7CisJfQorCisJd2hpbGUgKDEpIHsKKwkJbGVhZiA9IHBhdGgtPm5vZGVzWzBdOworCQlucml0ZW1zID0gYnRyZnNfaGVhZGVyX25yaXRlbXMobGVhZik7CisJCWlmIChwYXRoLT5zbG90c1swXSA+PSBucml0ZW1zKSB7CisJCQlyZXQgPSBidHJmc19uZXh0X2xlYWYocm9vdCwgcGF0aCk7CisJCQlpZiAocmV0IDwgMCkKKwkJCQlnb3RvIG91dDsKKwkJCWlmIChyZXQgPiAwKQorCQkJCWJyZWFrOworCQkJbGVhZiA9IHBhdGgtPm5vZGVzWzBdOworCQl9CisKKwkJYnRyZnNfaXRlbV9rZXlfdG9fY3B1KGxlYWYsICZmb3VuZF9rZXksIHBhdGgtPnNsb3RzWzBdKTsKKwkJaWYgKGZvdW5kX2tleS5vZmZzZXQgIT0gY3VyX3BvcyB8fAorCQkgICAgZm91bmRfa2V5LnR5cGUgIT0gQlRSRlNfRVhURU5UX0RBVEFfS0VZIHx8CisJCSAgICBmb3VuZF9rZXkub2JqZWN0aWQgIT0gcmVsb2NfaW5vZGUtPmlfaW5vKQorCQkJYnJlYWs7CisKKwkJZmkgPSBidHJmc19pdGVtX3B0cihsZWFmLCBwYXRoLT5zbG90c1swXSwKKwkJCQkgICAgc3RydWN0IGJ0cmZzX2ZpbGVfZXh0ZW50X2l0ZW0pOworCQlpZiAoYnRyZnNfZmlsZV9leHRlbnRfdHlwZShsZWFmLCBmaSkgIT0KKwkJICAgIEJUUkZTX0ZJTEVfRVhURU5UX1JFRyB8fAorCQkgICAgYnRyZnNfZmlsZV9leHRlbnRfZGlza19ieXRlbnIobGVhZiwgZmkpID09IDApCisJCQlicmVhazsKKworCQlpZiAobnIgPT0gbWF4KSB7CisJCQlzdHJ1Y3QgZGlza19leHRlbnQgKm9sZCA9IGV4dHM7CisJCQltYXggKj0gMjsKKwkJCWV4dHMgPSBremFsbG9jKHNpemVvZigqZXh0cykgKiBtYXgsIEdGUF9OT0ZTKTsKKwkJCW1lbWNweShleHRzLCBvbGQsIHNpemVvZigqZXh0cykgKiBucik7CisJCQlpZiAob2xkICE9ICpleHRlbnRzKQorCQkJCWtmcmVlKG9sZCk7CisJCX0KKworCQlleHRzW25yXS5kaXNrX2J5dGVuciA9CisJCQlidHJmc19maWxlX2V4dGVudF9kaXNrX2J5dGVucihsZWFmLCBmaSk7CisJCWV4dHNbbnJdLmRpc2tfbnVtX2J5dGVzID0KKwkJCWJ0cmZzX2ZpbGVfZXh0ZW50X2Rpc2tfbnVtX2J5dGVzKGxlYWYsIGZpKTsKKwkJZXh0c1tucl0ub2Zmc2V0ID0gYnRyZnNfZmlsZV9leHRlbnRfb2Zmc2V0KGxlYWYsIGZpKTsKKwkJZXh0c1tucl0ubnVtX2J5dGVzID0gYnRyZnNfZmlsZV9leHRlbnRfbnVtX2J5dGVzKGxlYWYsIGZpKTsKKwkJZXh0c1tucl0ucmFtX2J5dGVzID0gYnRyZnNfZmlsZV9leHRlbnRfcmFtX2J5dGVzKGxlYWYsIGZpKTsKKwkJZXh0c1tucl0uY29tcHJlc3Npb24gPSBidHJmc19maWxlX2V4dGVudF9jb21wcmVzc2lvbihsZWFmLCBmaSk7CisJCWV4dHNbbnJdLmVuY3J5cHRpb24gPSBidHJmc19maWxlX2V4dGVudF9lbmNyeXB0aW9uKGxlYWYsIGZpKTsKKwkJZXh0c1tucl0ub3RoZXJfZW5jb2RpbmcgPSBidHJmc19maWxlX2V4dGVudF9vdGhlcl9lbmNvZGluZyhsZWFmLAorCQkJCQkJCQkJICAgZmkpOworCQlCVUdfT04oZXh0c1tucl0ub2Zmc2V0ID4gMCk7CisJCUJVR19PTihleHRzW25yXS5jb21wcmVzc2lvbiB8fCBleHRzW25yXS5lbmNyeXB0aW9uKTsKKwkJQlVHX09OKGV4dHNbbnJdLm51bV9ieXRlcyAhPSBleHRzW25yXS5kaXNrX251bV9ieXRlcyk7CisKKwkJY3VyX3BvcyArPSBleHRzW25yXS5udW1fYnl0ZXM7CisJCW5yKys7CisKKwkJaWYgKGN1cl9wb3MgKyBvZmZzZXQgPj0gbGFzdF9ieXRlKQorCQkJYnJlYWs7CisKKwkJaWYgKG5vX2ZyYWdtZW50KSB7CisJCQlyZXQgPSAxOworCQkJZ290byBvdXQ7CisJCX0KKwkJcGF0aC0+c2xvdHNbMF0rKzsKKwl9CisKKwlCVUdfT04oY3VyX3BvcyArIG9mZnNldCA+IGxhc3RfYnl0ZSk7CisJaWYgKGN1cl9wb3MgKyBvZmZzZXQgPCBsYXN0X2J5dGUpIHsKKwkJcmV0ID0gLUVOT0VOVDsKKwkJZ290byBvdXQ7CisJfQorCXJldCA9IDA7CitvdXQ6CisJYnRyZnNfZnJlZV9wYXRoKHBhdGgpOworCWlmIChyZXQpIHsKKwkJaWYgKGV4dHMgIT0gKmV4dGVudHMpCisJCQlrZnJlZShleHRzKTsKKwl9IGVsc2UgeworCQkqZXh0ZW50cyA9IGV4dHM7CisJCSpucl9leHRlbnRzID0gbnI7CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBub2lubGluZSBpbnQgcmVwbGFjZV9vbmVfZXh0ZW50KHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAorCQkJCQlzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwKKwkJCQkJc3RydWN0IGJ0cmZzX3BhdGggKnBhdGgsCisJCQkJCXN0cnVjdCBidHJmc19rZXkgKmV4dGVudF9rZXksCisJCQkJCXN0cnVjdCBidHJmc19rZXkgKmxlYWZfa2V5LAorCQkJCQlzdHJ1Y3QgYnRyZnNfcmVmX3BhdGggKnJlZl9wYXRoLAorCQkJCQlzdHJ1Y3QgZGlza19leHRlbnQgKm5ld19leHRlbnRzLAorCQkJCQlpbnQgbnJfZXh0ZW50cykKK3sKKwlzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqbGVhZjsKKwlzdHJ1Y3QgYnRyZnNfZmlsZV9leHRlbnRfaXRlbSAqZmk7CisJc3RydWN0IGlub2RlICppbm9kZSA9IE5VTEw7CisJc3RydWN0IGJ0cmZzX2tleSBrZXk7CisJdTY0IGxvY2tfc3RhcnQgPSAwOworCXU2NCBsb2NrX2VuZCA9IDA7CisJdTY0IG51bV9ieXRlczsKKwl1NjQgZXh0X29mZnNldDsKKwl1NjQgZmlyc3RfcG9zOworCXUzMiBucml0ZW1zOworCWludCBucl9zY2FuZWQgPSAwOworCWludCBleHRlbnRfbG9ja2VkID0gMDsKKwlpbnQgZXh0ZW50X3R5cGU7CisJaW50IHJldDsKKworCW1lbWNweSgma2V5LCBsZWFmX2tleSwgc2l6ZW9mKGtleSkpOworCWZpcnN0X3BvcyA9IElOVF9MSU1JVChsb2ZmX3QpIC0gZXh0ZW50X2tleS0+b2Zmc2V0OworCWlmIChyZWZfcGF0aC0+b3duZXJfb2JqZWN0aWQgIT0gQlRSRlNfTVVMVElQTEVfT0JKRUNUSURTKSB7CisJCWlmIChrZXkub2JqZWN0aWQgPCByZWZfcGF0aC0+b3duZXJfb2JqZWN0aWQgfHwKKwkJICAgIChrZXkub2JqZWN0aWQgPT0gcmVmX3BhdGgtPm93bmVyX29iamVjdGlkICYmCisJCSAgICAga2V5LnR5cGUgPCBCVFJGU19FWFRFTlRfREFUQV9LRVkpKSB7CisJCQlrZXkub2JqZWN0aWQgPSByZWZfcGF0aC0+b3duZXJfb2JqZWN0aWQ7CisJCQlrZXkudHlwZSA9IEJUUkZTX0VYVEVOVF9EQVRBX0tFWTsKKwkJCWtleS5vZmZzZXQgPSAwOworCQl9CisJfQorCisJd2hpbGUgKDEpIHsKKwkJcmV0ID0gYnRyZnNfc2VhcmNoX3Nsb3QodHJhbnMsIHJvb3QsICZrZXksIHBhdGgsIDAsIDEpOworCQlpZiAocmV0IDwgMCkKKwkJCWdvdG8gb3V0OworCisJCWxlYWYgPSBwYXRoLT5ub2Rlc1swXTsKKwkJbnJpdGVtcyA9IGJ0cmZzX2hlYWRlcl9ucml0ZW1zKGxlYWYpOworbmV4dDoKKwkJaWYgKGV4dGVudF9sb2NrZWQgJiYgcmV0ID4gMCkgeworCQkJLyoKKwkJCSAqIHRoZSBmaWxlIGV4dGVudCBpdGVtIHdhcyBtb2RpZmllZCBieSBzb21lb25lCisJCQkgKiBiZWZvcmUgdGhlIGV4dGVudCBnb3QgbG9ja2VkLgorCQkJICovCisJCQl1bmxvY2tfZXh0ZW50KCZCVFJGU19JKGlub2RlKS0+aW9fdHJlZSwgbG9ja19zdGFydCwKKwkJCQkgICAgICBsb2NrX2VuZCwgR0ZQX05PRlMpOworCQkJZXh0ZW50X2xvY2tlZCA9IDA7CisJCX0KKworCQlpZiAocGF0aC0+c2xvdHNbMF0gPj0gbnJpdGVtcykgeworCQkJaWYgKCsrbnJfc2NhbmVkID4gMikKKwkJCQlicmVhazsKKworCQkJQlVHX09OKGV4dGVudF9sb2NrZWQpOworCQkJcmV0ID0gYnRyZnNfbmV4dF9sZWFmKHJvb3QsIHBhdGgpOworCQkJaWYgKHJldCA8IDApCisJCQkJZ290byBvdXQ7CisJCQlpZiAocmV0ID4gMCkKKwkJCQlicmVhazsKKwkJCWxlYWYgPSBwYXRoLT5ub2Rlc1swXTsKKwkJCW5yaXRlbXMgPSBidHJmc19oZWFkZXJfbnJpdGVtcyhsZWFmKTsKKwkJfQorCisJCWJ0cmZzX2l0ZW1fa2V5X3RvX2NwdShsZWFmLCAma2V5LCBwYXRoLT5zbG90c1swXSk7CisKKwkJaWYgKHJlZl9wYXRoLT5vd25lcl9vYmplY3RpZCAhPSBCVFJGU19NVUxUSVBMRV9PQkpFQ1RJRFMpIHsKKwkJCWlmICgoa2V5Lm9iamVjdGlkID4gcmVmX3BhdGgtPm93bmVyX29iamVjdGlkKSB8fAorCQkJICAgIChrZXkub2JqZWN0aWQgPT0gcmVmX3BhdGgtPm93bmVyX29iamVjdGlkICYmCisJCQkgICAgIGtleS50eXBlID4gQlRSRlNfRVhURU5UX0RBVEFfS0VZKSB8fAorCQkJICAgIChrZXkub2Zmc2V0ID49IGZpcnN0X3BvcyArIGV4dGVudF9rZXktPm9mZnNldCkpCisJCQkJYnJlYWs7CisJCX0KKworCQlpZiAoaW5vZGUgJiYga2V5Lm9iamVjdGlkICE9IGlub2RlLT5pX2lubykgeworCQkJQlVHX09OKGV4dGVudF9sb2NrZWQpOworCQkJYnRyZnNfcmVsZWFzZV9wYXRoKHJvb3QsIHBhdGgpOworCQkJbXV0ZXhfdW5sb2NrKCZpbm9kZS0+aV9tdXRleCk7CisJCQlpcHV0KGlub2RlKTsKKwkJCWlub2RlID0gTlVMTDsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKGtleS50eXBlICE9IEJUUkZTX0VYVEVOVF9EQVRBX0tFWSkgeworCQkJcGF0aC0+c2xvdHNbMF0rKzsKKwkJCXJldCA9IDE7CisJCQlnb3RvIG5leHQ7CisJCX0KKwkJZmkgPSBidHJmc19pdGVtX3B0cihsZWFmLCBwYXRoLT5zbG90c1swXSwKKwkJCQkgICAgc3RydWN0IGJ0cmZzX2ZpbGVfZXh0ZW50X2l0ZW0pOworCQlleHRlbnRfdHlwZSA9IGJ0cmZzX2ZpbGVfZXh0ZW50X3R5cGUobGVhZiwgZmkpOworCQlpZiAoKGV4dGVudF90eXBlICE9IEJUUkZTX0ZJTEVfRVhURU5UX1JFRyAmJgorCQkgICAgIGV4dGVudF90eXBlICE9IEJUUkZTX0ZJTEVfRVhURU5UX1BSRUFMTE9DKSB8fAorCQkgICAgKGJ0cmZzX2ZpbGVfZXh0ZW50X2Rpc2tfYnl0ZW5yKGxlYWYsIGZpKSAhPQorCQkgICAgIGV4dGVudF9rZXktPm9iamVjdGlkKSkgeworCQkJcGF0aC0+c2xvdHNbMF0rKzsKKwkJCXJldCA9IDE7CisJCQlnb3RvIG5leHQ7CisJCX0KKworCQludW1fYnl0ZXMgPSBidHJmc19maWxlX2V4dGVudF9udW1fYnl0ZXMobGVhZiwgZmkpOworCQlleHRfb2Zmc2V0ID0gYnRyZnNfZmlsZV9leHRlbnRfb2Zmc2V0KGxlYWYsIGZpKTsKKworCQlpZiAoZmlyc3RfcG9zID4ga2V5Lm9mZnNldCAtIGV4dF9vZmZzZXQpCisJCQlmaXJzdF9wb3MgPSBrZXkub2Zmc2V0IC0gZXh0X29mZnNldDsKKworCQlpZiAoIWV4dGVudF9sb2NrZWQpIHsKKwkJCWxvY2tfc3RhcnQgPSBrZXkub2Zmc2V0OworCQkJbG9ja19lbmQgPSBsb2NrX3N0YXJ0ICsgbnVtX2J5dGVzIC0gMTsKKwkJfSBlbHNlIHsKKwkJCWlmIChsb2NrX3N0YXJ0ID4ga2V5Lm9mZnNldCB8fAorCQkJICAgIGxvY2tfZW5kICsgMSA8IGtleS5vZmZzZXQgKyBudW1fYnl0ZXMpIHsKKwkJCQl1bmxvY2tfZXh0ZW50KCZCVFJGU19JKGlub2RlKS0+aW9fdHJlZSwKKwkJCQkJICAgICAgbG9ja19zdGFydCwgbG9ja19lbmQsIEdGUF9OT0ZTKTsKKwkJCQlleHRlbnRfbG9ja2VkID0gMDsKKwkJCX0KKwkJfQorCisJCWlmICghaW5vZGUpIHsKKwkJCWJ0cmZzX3JlbGVhc2VfcGF0aChyb290LCBwYXRoKTsKKworCQkJaW5vZGUgPSBidHJmc19pZ2V0X2xvY2tlZChyb290LT5mc19pbmZvLT5zYiwKKwkJCQkJCSAga2V5Lm9iamVjdGlkLCByb290KTsKKwkJCWlmIChpbm9kZS0+aV9zdGF0ZSAmIElfTkVXKSB7CisJCQkJQlRSRlNfSShpbm9kZSktPnJvb3QgPSByb290OworCQkJCUJUUkZTX0koaW5vZGUpLT5sb2NhdGlvbi5vYmplY3RpZCA9CisJCQkJCWtleS5vYmplY3RpZDsKKwkJCQlCVFJGU19JKGlub2RlKS0+bG9jYXRpb24udHlwZSA9CisJCQkJCUJUUkZTX0lOT0RFX0lURU1fS0VZOworCQkJCUJUUkZTX0koaW5vZGUpLT5sb2NhdGlvbi5vZmZzZXQgPSAwOworCQkJCWJ0cmZzX3JlYWRfbG9ja2VkX2lub2RlKGlub2RlKTsKKwkJCQl1bmxvY2tfbmV3X2lub2RlKGlub2RlKTsKKwkJCX0KKwkJCS8qCisJCQkgKiBzb21lIGNvZGUgY2FsbCBidHJmc19jb21taXRfdHJhbnNhY3Rpb24gd2hpbGUKKwkJCSAqIGhvbGRpbmcgdGhlIGlfbXV0ZXgsIHNvIHdlIGNhbid0IHVzZSBtdXRleF9sb2NrCisJCQkgKiBoZXJlLgorCQkJICovCisJCQlpZiAoaXNfYmFkX2lub2RlKGlub2RlKSB8fAorCQkJICAgICFtdXRleF90cnlsb2NrKCZpbm9kZS0+aV9tdXRleCkpIHsKKwkJCQlpcHV0KGlub2RlKTsKKwkJCQlpbm9kZSA9IE5VTEw7CisJCQkJa2V5Lm9mZnNldCA9ICh1NjQpLTE7CisJCQkJZ290byBza2lwOworCQkJfQorCQl9CisKKwkJaWYgKCFleHRlbnRfbG9ja2VkKSB7CisJCQlzdHJ1Y3QgYnRyZnNfb3JkZXJlZF9leHRlbnQgKm9yZGVyZWQ7CisKKwkJCWJ0cmZzX3JlbGVhc2VfcGF0aChyb290LCBwYXRoKTsKKworCQkJbG9ja19leHRlbnQoJkJUUkZTX0koaW5vZGUpLT5pb190cmVlLCBsb2NrX3N0YXJ0LAorCQkJCSAgICBsb2NrX2VuZCwgR0ZQX05PRlMpOworCQkJb3JkZXJlZCA9IGJ0cmZzX2xvb2t1cF9maXJzdF9vcmRlcmVkX2V4dGVudChpbm9kZSwKKwkJCQkJCQkJICAgIGxvY2tfZW5kKTsKKwkJCWlmIChvcmRlcmVkICYmCisJCQkgICAgb3JkZXJlZC0+ZmlsZV9vZmZzZXQgPD0gbG9ja19lbmQgJiYKKwkJCSAgICBvcmRlcmVkLT5maWxlX29mZnNldCArIG9yZGVyZWQtPmxlbiA+IGxvY2tfc3RhcnQpIHsKKwkJCQl1bmxvY2tfZXh0ZW50KCZCVFJGU19JKGlub2RlKS0+aW9fdHJlZSwKKwkJCQkJICAgICAgbG9ja19zdGFydCwgbG9ja19lbmQsIEdGUF9OT0ZTKTsKKwkJCQlidHJmc19zdGFydF9vcmRlcmVkX2V4dGVudChpbm9kZSwgb3JkZXJlZCwgMSk7CisJCQkJYnRyZnNfcHV0X29yZGVyZWRfZXh0ZW50KG9yZGVyZWQpOworCQkJCWtleS5vZmZzZXQgKz0gbnVtX2J5dGVzOworCQkJCWdvdG8gc2tpcDsKKwkJCX0KKwkJCWlmIChvcmRlcmVkKQorCQkJCWJ0cmZzX3B1dF9vcmRlcmVkX2V4dGVudChvcmRlcmVkKTsKKworCQkJZXh0ZW50X2xvY2tlZCA9IDE7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmIChucl9leHRlbnRzID09IDEpIHsKKwkJCS8qIHVwZGF0ZSBleHRlbnQgcG9pbnRlciBpbiBwbGFjZSAqLworCQkJYnRyZnNfc2V0X2ZpbGVfZXh0ZW50X2Rpc2tfYnl0ZW5yKGxlYWYsIGZpLAorCQkJCQkJbmV3X2V4dGVudHNbMF0uZGlza19ieXRlbnIpOworCQkJYnRyZnNfc2V0X2ZpbGVfZXh0ZW50X2Rpc2tfbnVtX2J5dGVzKGxlYWYsIGZpLAorCQkJCQkJbmV3X2V4dGVudHNbMF0uZGlza19udW1fYnl0ZXMpOworCQkJYnRyZnNfbWFya19idWZmZXJfZGlydHkobGVhZik7CisKKwkJCWJ0cmZzX2Ryb3BfZXh0ZW50X2NhY2hlKGlub2RlLCBrZXkub2Zmc2V0LAorCQkJCQkJa2V5Lm9mZnNldCArIG51bV9ieXRlcyAtIDEsIDApOworCisJCQlyZXQgPSBidHJmc19pbmNfZXh0ZW50X3JlZih0cmFucywgcm9vdCwKKwkJCQkJCW5ld19leHRlbnRzWzBdLmRpc2tfYnl0ZW5yLAorCQkJCQkJbmV3X2V4dGVudHNbMF0uZGlza19udW1fYnl0ZXMsCisJCQkJCQlsZWFmLT5zdGFydCwKKwkJCQkJCXJvb3QtPnJvb3Rfa2V5Lm9iamVjdGlkLAorCQkJCQkJdHJhbnMtPnRyYW5zaWQsCisJCQkJCQlrZXkub2JqZWN0aWQpOworCQkJQlVHX09OKHJldCk7CisKKwkJCXJldCA9IGJ0cmZzX2ZyZWVfZXh0ZW50KHRyYW5zLCByb290LAorCQkJCQkJZXh0ZW50X2tleS0+b2JqZWN0aWQsCisJCQkJCQlleHRlbnRfa2V5LT5vZmZzZXQsCisJCQkJCQlsZWFmLT5zdGFydCwKKwkJCQkJCWJ0cmZzX2hlYWRlcl9vd25lcihsZWFmKSwKKwkJCQkJCWJ0cmZzX2hlYWRlcl9nZW5lcmF0aW9uKGxlYWYpLAorCQkJCQkJa2V5Lm9iamVjdGlkLCAwKTsKKwkJCUJVR19PTihyZXQpOworCisJCQlidHJmc19yZWxlYXNlX3BhdGgocm9vdCwgcGF0aCk7CisJCQlrZXkub2Zmc2V0ICs9IG51bV9ieXRlczsKKwkJfSBlbHNlIHsKKwkJCUJVR19PTigxKTsKKyNpZiAwCisJCQl1NjQgYWxsb2NfaGludDsKKwkJCXU2NCBleHRlbnRfbGVuOworCQkJaW50IGk7CisJCQkvKgorCQkJICogZHJvcCBvbGQgZXh0ZW50IHBvaW50ZXIgYXQgZmlyc3QsIHRoZW4gaW5zZXJ0IHRoZQorCQkJICogbmV3IHBvaW50ZXJzIG9uZSBieWUgb25lCisJCQkgKi8KKwkJCWJ0cmZzX3JlbGVhc2VfcGF0aChyb290LCBwYXRoKTsKKwkJCXJldCA9IGJ0cmZzX2Ryb3BfZXh0ZW50cyh0cmFucywgcm9vdCwgaW5vZGUsIGtleS5vZmZzZXQsCisJCQkJCQkga2V5Lm9mZnNldCArIG51bV9ieXRlcywKKwkJCQkJCSBrZXkub2Zmc2V0LCAmYWxsb2NfaGludCk7CisJCQlCVUdfT04ocmV0KTsKKworCQkJZm9yIChpID0gMDsgaSA8IG5yX2V4dGVudHM7IGkrKykgeworCQkJCWlmIChleHRfb2Zmc2V0ID49IG5ld19leHRlbnRzW2ldLm51bV9ieXRlcykgeworCQkJCQlleHRfb2Zmc2V0IC09IG5ld19leHRlbnRzW2ldLm51bV9ieXRlczsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJCWV4dGVudF9sZW4gPSBtaW4obmV3X2V4dGVudHNbaV0ubnVtX2J5dGVzIC0KKwkJCQkJCSBleHRfb2Zmc2V0LCBudW1fYnl0ZXMpOworCisJCQkJcmV0ID0gYnRyZnNfaW5zZXJ0X2VtcHR5X2l0ZW0odHJhbnMsIHJvb3QsCisJCQkJCQkJICAgICAgcGF0aCwgJmtleSwKKwkJCQkJCQkgICAgICBzaXplb2YoKmZpKSk7CisJCQkJQlVHX09OKHJldCk7CisKKwkJCQlsZWFmID0gcGF0aC0+bm9kZXNbMF07CisJCQkJZmkgPSBidHJmc19pdGVtX3B0cihsZWFmLCBwYXRoLT5zbG90c1swXSwKKwkJCQkJCXN0cnVjdCBidHJmc19maWxlX2V4dGVudF9pdGVtKTsKKwkJCQlidHJmc19zZXRfZmlsZV9leHRlbnRfZ2VuZXJhdGlvbihsZWFmLCBmaSwKKwkJCQkJCQl0cmFucy0+dHJhbnNpZCk7CisJCQkJYnRyZnNfc2V0X2ZpbGVfZXh0ZW50X3R5cGUobGVhZiwgZmksCisJCQkJCQkJQlRSRlNfRklMRV9FWFRFTlRfUkVHKTsKKwkJCQlidHJmc19zZXRfZmlsZV9leHRlbnRfZGlza19ieXRlbnIobGVhZiwgZmksCisJCQkJCQluZXdfZXh0ZW50c1tpXS5kaXNrX2J5dGVucik7CisJCQkJYnRyZnNfc2V0X2ZpbGVfZXh0ZW50X2Rpc2tfbnVtX2J5dGVzKGxlYWYsIGZpLAorCQkJCQkJbmV3X2V4dGVudHNbaV0uZGlza19udW1fYnl0ZXMpOworCQkJCWJ0cmZzX3NldF9maWxlX2V4dGVudF9yYW1fYnl0ZXMobGVhZiwgZmksCisJCQkJCQluZXdfZXh0ZW50c1tpXS5yYW1fYnl0ZXMpOworCisJCQkJYnRyZnNfc2V0X2ZpbGVfZXh0ZW50X2NvbXByZXNzaW9uKGxlYWYsIGZpLAorCQkJCQkJbmV3X2V4dGVudHNbaV0uY29tcHJlc3Npb24pOworCQkJCWJ0cmZzX3NldF9maWxlX2V4dGVudF9lbmNyeXB0aW9uKGxlYWYsIGZpLAorCQkJCQkJbmV3X2V4dGVudHNbaV0uZW5jcnlwdGlvbik7CisJCQkJYnRyZnNfc2V0X2ZpbGVfZXh0ZW50X290aGVyX2VuY29kaW5nKGxlYWYsIGZpLAorCQkJCQkJbmV3X2V4dGVudHNbaV0ub3RoZXJfZW5jb2RpbmcpOworCisJCQkJYnRyZnNfc2V0X2ZpbGVfZXh0ZW50X251bV9ieXRlcyhsZWFmLCBmaSwKKwkJCQkJCQlleHRlbnRfbGVuKTsKKwkJCQlleHRfb2Zmc2V0ICs9IG5ld19leHRlbnRzW2ldLm9mZnNldDsKKwkJCQlidHJmc19zZXRfZmlsZV9leHRlbnRfb2Zmc2V0KGxlYWYsIGZpLAorCQkJCQkJCWV4dF9vZmZzZXQpOworCQkJCWJ0cmZzX21hcmtfYnVmZmVyX2RpcnR5KGxlYWYpOworCisJCQkJYnRyZnNfZHJvcF9leHRlbnRfY2FjaGUoaW5vZGUsIGtleS5vZmZzZXQsCisJCQkJCQlrZXkub2Zmc2V0ICsgZXh0ZW50X2xlbiAtIDEsIDApOworCisJCQkJcmV0ID0gYnRyZnNfaW5jX2V4dGVudF9yZWYodHJhbnMsIHJvb3QsCisJCQkJCQluZXdfZXh0ZW50c1tpXS5kaXNrX2J5dGVuciwKKwkJCQkJCW5ld19leHRlbnRzW2ldLmRpc2tfbnVtX2J5dGVzLAorCQkJCQkJbGVhZi0+c3RhcnQsCisJCQkJCQlyb290LT5yb290X2tleS5vYmplY3RpZCwKKwkJCQkJCXRyYW5zLT50cmFuc2lkLCBrZXkub2JqZWN0aWQpOworCQkJCUJVR19PTihyZXQpOworCQkJCWJ0cmZzX3JlbGVhc2VfcGF0aChyb290LCBwYXRoKTsKKworCQkJCWlub2RlX2FkZF9ieXRlcyhpbm9kZSwgZXh0ZW50X2xlbik7CisKKwkJCQlleHRfb2Zmc2V0ID0gMDsKKwkJCQludW1fYnl0ZXMgLT0gZXh0ZW50X2xlbjsKKwkJCQlrZXkub2Zmc2V0ICs9IGV4dGVudF9sZW47CisKKwkJCQlpZiAobnVtX2J5dGVzID09IDApCisJCQkJCWJyZWFrOworCQkJfQorCQkJQlVHX09OKGkgPj0gbnJfZXh0ZW50cyk7CisjZW5kaWYKKwkJfQorCisJCWlmIChleHRlbnRfbG9ja2VkKSB7CisJCQl1bmxvY2tfZXh0ZW50KCZCVFJGU19JKGlub2RlKS0+aW9fdHJlZSwgbG9ja19zdGFydCwKKwkJCQkgICAgICBsb2NrX2VuZCwgR0ZQX05PRlMpOworCQkJZXh0ZW50X2xvY2tlZCA9IDA7CisJCX0KK3NraXA6CisJCWlmIChyZWZfcGF0aC0+b3duZXJfb2JqZWN0aWQgIT0gQlRSRlNfTVVMVElQTEVfT0JKRUNUSURTICYmCisJCSAgICBrZXkub2Zmc2V0ID49IGZpcnN0X3BvcyArIGV4dGVudF9rZXktPm9mZnNldCkKKwkJCWJyZWFrOworCisJCWNvbmRfcmVzY2hlZCgpOworCX0KKwlyZXQgPSAwOworb3V0OgorCWJ0cmZzX3JlbGVhc2VfcGF0aChyb290LCBwYXRoKTsKKwlpZiAoaW5vZGUpIHsKKwkJbXV0ZXhfdW5sb2NrKCZpbm9kZS0+aV9tdXRleCk7CisJCWlmIChleHRlbnRfbG9ja2VkKSB7CisJCQl1bmxvY2tfZXh0ZW50KCZCVFJGU19JKGlub2RlKS0+aW9fdHJlZSwgbG9ja19zdGFydCwKKwkJCQkgICAgICBsb2NrX2VuZCwgR0ZQX05PRlMpOworCQl9CisJCWlwdXQoaW5vZGUpOworCX0KKwlyZXR1cm4gcmV0OworfQorCitpbnQgYnRyZnNfcmVsb2NfdHJlZV9jYWNoZV9yZWYoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCisJCQkgICAgICAgc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsCisJCQkgICAgICAgc3RydWN0IGV4dGVudF9idWZmZXIgKmJ1ZiwgdTY0IG9yaWdfc3RhcnQpCit7CisJaW50IGxldmVsOworCWludCByZXQ7CisKKwlCVUdfT04oYnRyZnNfaGVhZGVyX2dlbmVyYXRpb24oYnVmKSAhPSB0cmFucy0+dHJhbnNpZCk7CisJQlVHX09OKHJvb3QtPnJvb3Rfa2V5Lm9iamVjdGlkICE9IEJUUkZTX1RSRUVfUkVMT0NfT0JKRUNUSUQpOworCisJbGV2ZWwgPSBidHJmc19oZWFkZXJfbGV2ZWwoYnVmKTsKKwlpZiAobGV2ZWwgPT0gMCkgeworCQlzdHJ1Y3QgYnRyZnNfbGVhZl9yZWYgKnJlZjsKKwkJc3RydWN0IGJ0cmZzX2xlYWZfcmVmICpvcmlnX3JlZjsKKworCQlvcmlnX3JlZiA9IGJ0cmZzX2xvb2t1cF9sZWFmX3JlZihyb290LCBvcmlnX3N0YXJ0KTsKKwkJaWYgKCFvcmlnX3JlZikKKwkJCXJldHVybiAtRU5PRU5UOworCisJCXJlZiA9IGJ0cmZzX2FsbG9jX2xlYWZfcmVmKHJvb3QsIG9yaWdfcmVmLT5ucml0ZW1zKTsKKwkJaWYgKCFyZWYpIHsKKwkJCWJ0cmZzX2ZyZWVfbGVhZl9yZWYocm9vdCwgb3JpZ19yZWYpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKworCQlyZWYtPm5yaXRlbXMgPSBvcmlnX3JlZi0+bnJpdGVtczsKKwkJbWVtY3B5KHJlZi0+ZXh0ZW50cywgb3JpZ19yZWYtPmV4dGVudHMsCisJCQlzaXplb2YocmVmLT5leHRlbnRzWzBdKSAqIHJlZi0+bnJpdGVtcyk7CisKKwkJYnRyZnNfZnJlZV9sZWFmX3JlZihyb290LCBvcmlnX3JlZik7CisKKwkJcmVmLT5yb290X2dlbiA9IHRyYW5zLT50cmFuc2lkOworCQlyZWYtPmJ5dGVuciA9IGJ1Zi0+c3RhcnQ7CisJCXJlZi0+b3duZXIgPSBidHJmc19oZWFkZXJfb3duZXIoYnVmKTsKKwkJcmVmLT5nZW5lcmF0aW9uID0gYnRyZnNfaGVhZGVyX2dlbmVyYXRpb24oYnVmKTsKKwkJcmV0ID0gYnRyZnNfYWRkX2xlYWZfcmVmKHJvb3QsIHJlZiwgMCk7CisJCVdBUk5fT04ocmV0KTsKKwkJYnRyZnNfZnJlZV9sZWFmX3JlZihyb290LCByZWYpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIG5vaW5saW5lIGludCBpbnZhbGlkYXRlX2V4dGVudF9jYWNoZShzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwKKwkJCQkJc3RydWN0IGV4dGVudF9idWZmZXIgKmxlYWYsCisJCQkJCXN0cnVjdCBidHJmc19ibG9ja19ncm91cF9jYWNoZSAqZ3JvdXAsCisJCQkJCXN0cnVjdCBidHJmc19yb290ICp0YXJnZXRfcm9vdCkKK3sKKwlzdHJ1Y3QgYnRyZnNfa2V5IGtleTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gTlVMTDsKKwlzdHJ1Y3QgYnRyZnNfZmlsZV9leHRlbnRfaXRlbSAqZmk7CisJdTY0IG51bV9ieXRlczsKKwl1NjQgc2tpcF9vYmplY3RpZCA9IDA7CisJdTMyIG5yaXRlbXM7CisJdTMyIGk7CisKKwlucml0ZW1zID0gYnRyZnNfaGVhZGVyX25yaXRlbXMobGVhZik7CisJZm9yIChpID0gMDsgaSA8IG5yaXRlbXM7IGkrKykgeworCQlidHJmc19pdGVtX2tleV90b19jcHUobGVhZiwgJmtleSwgaSk7CisJCWlmIChrZXkub2JqZWN0aWQgPT0gc2tpcF9vYmplY3RpZCB8fAorCQkgICAga2V5LnR5cGUgIT0gQlRSRlNfRVhURU5UX0RBVEFfS0VZKQorCQkJY29udGludWU7CisJCWZpID0gYnRyZnNfaXRlbV9wdHIobGVhZiwgaSwgc3RydWN0IGJ0cmZzX2ZpbGVfZXh0ZW50X2l0ZW0pOworCQlpZiAoYnRyZnNfZmlsZV9leHRlbnRfdHlwZShsZWFmLCBmaSkgPT0KKwkJICAgIEJUUkZTX0ZJTEVfRVhURU5UX0lOTElORSkKKwkJCWNvbnRpbnVlOworCQlpZiAoYnRyZnNfZmlsZV9leHRlbnRfZGlza19ieXRlbnIobGVhZiwgZmkpID09IDApCisJCQljb250aW51ZTsKKwkJaWYgKCFpbm9kZSB8fCBpbm9kZS0+aV9pbm8gIT0ga2V5Lm9iamVjdGlkKSB7CisJCQlpcHV0KGlub2RlKTsKKwkJCWlub2RlID0gYnRyZnNfaWxvb2t1cCh0YXJnZXRfcm9vdC0+ZnNfaW5mby0+c2IsCisJCQkJCSAgICAgIGtleS5vYmplY3RpZCwgdGFyZ2V0X3Jvb3QsIDEpOworCQl9CisJCWlmICghaW5vZGUpIHsKKwkJCXNraXBfb2JqZWN0aWQgPSBrZXkub2JqZWN0aWQ7CisJCQljb250aW51ZTsKKwkJfQorCQludW1fYnl0ZXMgPSBidHJmc19maWxlX2V4dGVudF9udW1fYnl0ZXMobGVhZiwgZmkpOworCisJCWxvY2tfZXh0ZW50KCZCVFJGU19JKGlub2RlKS0+aW9fdHJlZSwga2V5Lm9mZnNldCwKKwkJCSAgICBrZXkub2Zmc2V0ICsgbnVtX2J5dGVzIC0gMSwgR0ZQX05PRlMpOworCQlidHJmc19kcm9wX2V4dGVudF9jYWNoZShpbm9kZSwga2V5Lm9mZnNldCwKKwkJCQkJa2V5Lm9mZnNldCArIG51bV9ieXRlcyAtIDEsIDEpOworCQl1bmxvY2tfZXh0ZW50KCZCVFJGU19JKGlub2RlKS0+aW9fdHJlZSwga2V5Lm9mZnNldCwKKwkJCSAgICAgIGtleS5vZmZzZXQgKyBudW1fYnl0ZXMgLSAxLCBHRlBfTk9GUyk7CisJCWNvbmRfcmVzY2hlZCgpOworCX0KKwlpcHV0KGlub2RlKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIG5vaW5saW5lIGludCByZXBsYWNlX2V4dGVudHNfaW5fbGVhZihzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKKwkJCQkJc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsCisJCQkJCXN0cnVjdCBleHRlbnRfYnVmZmVyICpsZWFmLAorCQkJCQlzdHJ1Y3QgYnRyZnNfYmxvY2tfZ3JvdXBfY2FjaGUgKmdyb3VwLAorCQkJCQlzdHJ1Y3QgaW5vZGUgKnJlbG9jX2lub2RlKQoreworCXN0cnVjdCBidHJmc19rZXkga2V5OworCXN0cnVjdCBidHJmc19rZXkgZXh0ZW50X2tleTsKKwlzdHJ1Y3QgYnRyZnNfZmlsZV9leHRlbnRfaXRlbSAqZmk7CisJc3RydWN0IGJ0cmZzX2xlYWZfcmVmICpyZWY7CisJc3RydWN0IGRpc2tfZXh0ZW50ICpuZXdfZXh0ZW50OworCXU2NCBieXRlbnI7CisJdTY0IG51bV9ieXRlczsKKwl1MzIgbnJpdGVtczsKKwl1MzIgaTsKKwlpbnQgZXh0X2luZGV4OworCWludCBucl9leHRlbnQ7CisJaW50IHJldDsKKworCW5ld19leHRlbnQgPSBrbWFsbG9jKHNpemVvZigqbmV3X2V4dGVudCksIEdGUF9OT0ZTKTsKKwlCVUdfT04oIW5ld19leHRlbnQpOworCisJcmVmID0gYnRyZnNfbG9va3VwX2xlYWZfcmVmKHJvb3QsIGxlYWYtPnN0YXJ0KTsKKwlCVUdfT04oIXJlZik7CisKKwlleHRfaW5kZXggPSAtMTsKKwlucml0ZW1zID0gYnRyZnNfaGVhZGVyX25yaXRlbXMobGVhZik7CisJZm9yIChpID0gMDsgaSA8IG5yaXRlbXM7IGkrKykgeworCQlidHJmc19pdGVtX2tleV90b19jcHUobGVhZiwgJmtleSwgaSk7CisJCWlmIChidHJmc19rZXlfdHlwZSgma2V5KSAhPSBCVFJGU19FWFRFTlRfREFUQV9LRVkpCisJCQljb250aW51ZTsKKwkJZmkgPSBidHJmc19pdGVtX3B0cihsZWFmLCBpLCBzdHJ1Y3QgYnRyZnNfZmlsZV9leHRlbnRfaXRlbSk7CisJCWlmIChidHJmc19maWxlX2V4dGVudF90eXBlKGxlYWYsIGZpKSA9PQorCQkgICAgQlRSRlNfRklMRV9FWFRFTlRfSU5MSU5FKQorCQkJY29udGludWU7CisJCWJ5dGVuciA9IGJ0cmZzX2ZpbGVfZXh0ZW50X2Rpc2tfYnl0ZW5yKGxlYWYsIGZpKTsKKwkJbnVtX2J5dGVzID0gYnRyZnNfZmlsZV9leHRlbnRfZGlza19udW1fYnl0ZXMobGVhZiwgZmkpOworCQlpZiAoYnl0ZW5yID09IDApCisJCQljb250aW51ZTsKKworCQlleHRfaW5kZXgrKzsKKwkJaWYgKGJ5dGVuciA+PSBncm91cC0+a2V5Lm9iamVjdGlkICsgZ3JvdXAtPmtleS5vZmZzZXQgfHwKKwkJICAgIGJ5dGVuciArIG51bV9ieXRlcyA8PSBncm91cC0+a2V5Lm9iamVjdGlkKQorCQkJY29udGludWU7CisKKwkJZXh0ZW50X2tleS5vYmplY3RpZCA9IGJ5dGVucjsKKwkJZXh0ZW50X2tleS5vZmZzZXQgPSBudW1fYnl0ZXM7CisJCWV4dGVudF9rZXkudHlwZSA9IEJUUkZTX0VYVEVOVF9JVEVNX0tFWTsKKwkJbnJfZXh0ZW50ID0gMTsKKwkJcmV0ID0gZ2V0X25ld19sb2NhdGlvbnMocmVsb2NfaW5vZGUsICZleHRlbnRfa2V5LAorCQkJCQlncm91cC0+a2V5Lm9iamVjdGlkLCAxLAorCQkJCQkmbmV3X2V4dGVudCwgJm5yX2V4dGVudCk7CisJCWlmIChyZXQgPiAwKQorCQkJY29udGludWU7CisJCUJVR19PTihyZXQgPCAwKTsKKworCQlCVUdfT04ocmVmLT5leHRlbnRzW2V4dF9pbmRleF0uYnl0ZW5yICE9IGJ5dGVucik7CisJCUJVR19PTihyZWYtPmV4dGVudHNbZXh0X2luZGV4XS5udW1fYnl0ZXMgIT0gbnVtX2J5dGVzKTsKKwkJcmVmLT5leHRlbnRzW2V4dF9pbmRleF0uYnl0ZW5yID0gbmV3X2V4dGVudC0+ZGlza19ieXRlbnI7CisJCXJlZi0+ZXh0ZW50c1tleHRfaW5kZXhdLm51bV9ieXRlcyA9IG5ld19leHRlbnQtPmRpc2tfbnVtX2J5dGVzOworCisJCWJ0cmZzX3NldF9maWxlX2V4dGVudF9kaXNrX2J5dGVucihsZWFmLCBmaSwKKwkJCQkJCW5ld19leHRlbnQtPmRpc2tfYnl0ZW5yKTsKKwkJYnRyZnNfc2V0X2ZpbGVfZXh0ZW50X2Rpc2tfbnVtX2J5dGVzKGxlYWYsIGZpLAorCQkJCQkJbmV3X2V4dGVudC0+ZGlza19udW1fYnl0ZXMpOworCQlidHJmc19tYXJrX2J1ZmZlcl9kaXJ0eShsZWFmKTsKKworCQlyZXQgPSBidHJmc19pbmNfZXh0ZW50X3JlZih0cmFucywgcm9vdCwKKwkJCQkJbmV3X2V4dGVudC0+ZGlza19ieXRlbnIsCisJCQkJCW5ld19leHRlbnQtPmRpc2tfbnVtX2J5dGVzLAorCQkJCQlsZWFmLT5zdGFydCwKKwkJCQkJcm9vdC0+cm9vdF9rZXkub2JqZWN0aWQsCisJCQkJCXRyYW5zLT50cmFuc2lkLCBrZXkub2JqZWN0aWQpOworCQlCVUdfT04ocmV0KTsKKwkJcmV0ID0gYnRyZnNfZnJlZV9leHRlbnQodHJhbnMsIHJvb3QsCisJCQkJCWJ5dGVuciwgbnVtX2J5dGVzLCBsZWFmLT5zdGFydCwKKwkJCQkJYnRyZnNfaGVhZGVyX293bmVyKGxlYWYpLAorCQkJCQlidHJmc19oZWFkZXJfZ2VuZXJhdGlvbihsZWFmKSwKKwkJCQkJa2V5Lm9iamVjdGlkLCAwKTsKKwkJQlVHX09OKHJldCk7CisJCWNvbmRfcmVzY2hlZCgpOworCX0KKwlrZnJlZShuZXdfZXh0ZW50KTsKKwlCVUdfT04oZXh0X2luZGV4ICsgMSAhPSByZWYtPm5yaXRlbXMpOworCWJ0cmZzX2ZyZWVfbGVhZl9yZWYocm9vdCwgcmVmKTsKKwlyZXR1cm4gMDsKK30KKworaW50IGJ0cmZzX2ZyZWVfcmVsb2Nfcm9vdChzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKKwkJCSAgc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QpCit7CisJc3RydWN0IGJ0cmZzX3Jvb3QgKnJlbG9jX3Jvb3Q7CisJaW50IHJldDsKKworCWlmIChyb290LT5yZWxvY19yb290KSB7CisJCXJlbG9jX3Jvb3QgPSByb290LT5yZWxvY19yb290OworCQlyb290LT5yZWxvY19yb290ID0gTlVMTDsKKwkJbGlzdF9hZGQoJnJlbG9jX3Jvb3QtPmRlYWRfbGlzdCwKKwkJCSAmcm9vdC0+ZnNfaW5mby0+ZGVhZF9yZWxvY19yb290cyk7CisKKwkJYnRyZnNfc2V0X3Jvb3RfYnl0ZW5yKCZyZWxvY19yb290LT5yb290X2l0ZW0sCisJCQkJICAgICAgcmVsb2Nfcm9vdC0+bm9kZS0+c3RhcnQpOworCQlidHJmc19zZXRfcm9vdF9sZXZlbCgmcm9vdC0+cm9vdF9pdGVtLAorCQkJCSAgICAgYnRyZnNfaGVhZGVyX2xldmVsKHJlbG9jX3Jvb3QtPm5vZGUpKTsKKwkJbWVtc2V0KCZyZWxvY19yb290LT5yb290X2l0ZW0uZHJvcF9wcm9ncmVzcywgMCwKKwkJCXNpemVvZihzdHJ1Y3QgYnRyZnNfZGlza19rZXkpKTsKKwkJcmVsb2Nfcm9vdC0+cm9vdF9pdGVtLmRyb3BfbGV2ZWwgPSAwOworCisJCXJldCA9IGJ0cmZzX3VwZGF0ZV9yb290KHRyYW5zLCByb290LT5mc19pbmZvLT50cmVlX3Jvb3QsCisJCQkJCSZyZWxvY19yb290LT5yb290X2tleSwKKwkJCQkJJnJlbG9jX3Jvb3QtPnJvb3RfaXRlbSk7CisJCUJVR19PTihyZXQpOworCX0KKwlyZXR1cm4gMDsKK30KKworaW50IGJ0cmZzX2Ryb3BfZGVhZF9yZWxvY19yb290cyhzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCkKK3sKKwlzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFuczsKKwlzdHJ1Y3QgYnRyZnNfcm9vdCAqcmVsb2Nfcm9vdDsKKwlzdHJ1Y3QgYnRyZnNfcm9vdCAqcHJldl9yb290ID0gTlVMTDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGRlYWRfcm9vdHM7CisJaW50IHJldDsKKwl1bnNpZ25lZCBsb25nIG5yOworCisJSU5JVF9MSVNUX0hFQUQoJmRlYWRfcm9vdHMpOworCWxpc3Rfc3BsaWNlX2luaXQoJnJvb3QtPmZzX2luZm8tPmRlYWRfcmVsb2Nfcm9vdHMsICZkZWFkX3Jvb3RzKTsKKworCXdoaWxlICghbGlzdF9lbXB0eSgmZGVhZF9yb290cykpIHsKKwkJcmVsb2Nfcm9vdCA9IGxpc3RfZW50cnkoZGVhZF9yb290cy5wcmV2LAorCQkJCQlzdHJ1Y3QgYnRyZnNfcm9vdCwgZGVhZF9saXN0KTsKKwkJbGlzdF9kZWxfaW5pdCgmcmVsb2Nfcm9vdC0+ZGVhZF9saXN0KTsKKworCQlCVUdfT04ocmVsb2Nfcm9vdC0+Y29tbWl0X3Jvb3QgIT0gTlVMTCk7CisJCXdoaWxlICgxKSB7CisJCQl0cmFucyA9IGJ0cmZzX2pvaW5fdHJhbnNhY3Rpb24ocm9vdCwgMSk7CisJCQlCVUdfT04oIXRyYW5zKTsKKworCQkJbXV0ZXhfbG9jaygmcm9vdC0+ZnNfaW5mby0+ZHJvcF9tdXRleCk7CisJCQlyZXQgPSBidHJmc19kcm9wX3NuYXBzaG90KHRyYW5zLCByZWxvY19yb290KTsKKwkJCWlmIChyZXQgIT0gLUVBR0FJTikKKwkJCQlicmVhazsKKwkJCW11dGV4X3VubG9jaygmcm9vdC0+ZnNfaW5mby0+ZHJvcF9tdXRleCk7CisKKwkJCW5yID0gdHJhbnMtPmJsb2Nrc191c2VkOworCQkJcmV0ID0gYnRyZnNfZW5kX3RyYW5zYWN0aW9uKHRyYW5zLCByb290KTsKKwkJCUJVR19PTihyZXQpOworCQkJYnRyZnNfYnRyZWVfYmFsYW5jZV9kaXJ0eShyb290LCBucik7CisJCX0KKworCQlmcmVlX2V4dGVudF9idWZmZXIocmVsb2Nfcm9vdC0+bm9kZSk7CisKKwkJcmV0ID0gYnRyZnNfZGVsX3Jvb3QodHJhbnMsIHJvb3QtPmZzX2luZm8tPnRyZWVfcm9vdCwKKwkJCQkgICAgICZyZWxvY19yb290LT5yb290X2tleSk7CisJCUJVR19PTihyZXQpOworCQltdXRleF91bmxvY2soJnJvb3QtPmZzX2luZm8tPmRyb3BfbXV0ZXgpOworCisJCW5yID0gdHJhbnMtPmJsb2Nrc191c2VkOworCQlyZXQgPSBidHJmc19lbmRfdHJhbnNhY3Rpb24odHJhbnMsIHJvb3QpOworCQlCVUdfT04ocmV0KTsKKwkJYnRyZnNfYnRyZWVfYmFsYW5jZV9kaXJ0eShyb290LCBucik7CisKKwkJa2ZyZWUocHJldl9yb290KTsKKwkJcHJldl9yb290ID0gcmVsb2Nfcm9vdDsKKwl9CisJaWYgKHByZXZfcm9vdCkgeworCQlidHJmc19yZW1vdmVfbGVhZl9yZWZzKHByZXZfcm9vdCwgKHU2NCktMSwgMCk7CisJCWtmcmVlKHByZXZfcm9vdCk7CisJfQorCXJldHVybiAwOworfQorCitpbnQgYnRyZnNfYWRkX2RlYWRfcmVsb2Nfcm9vdChzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCkKK3sKKwlsaXN0X2FkZCgmcm9vdC0+ZGVhZF9saXN0LCAmcm9vdC0+ZnNfaW5mby0+ZGVhZF9yZWxvY19yb290cyk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBidHJmc19jbGVhbnVwX3JlbG9jX3RyZWVzKHN0cnVjdCBidHJmc19yb290ICpyb290KQoreworCXN0cnVjdCBidHJmc19yb290ICpyZWxvY19yb290OworCXN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zOworCXN0cnVjdCBidHJmc19rZXkgbG9jYXRpb247CisJaW50IGZvdW5kOworCWludCByZXQ7CisKKwltdXRleF9sb2NrKCZyb290LT5mc19pbmZvLT50cmVlX3JlbG9jX211dGV4KTsKKwlyZXQgPSBidHJmc19maW5kX2RlYWRfcm9vdHMocm9vdCwgQlRSRlNfVFJFRV9SRUxPQ19PQkpFQ1RJRCwgTlVMTCk7CisJQlVHX09OKHJldCk7CisJZm91bmQgPSAhbGlzdF9lbXB0eSgmcm9vdC0+ZnNfaW5mby0+ZGVhZF9yZWxvY19yb290cyk7CisJbXV0ZXhfdW5sb2NrKCZyb290LT5mc19pbmZvLT50cmVlX3JlbG9jX211dGV4KTsKKworCWlmIChmb3VuZCkgeworCQl0cmFucyA9IGJ0cmZzX3N0YXJ0X3RyYW5zYWN0aW9uKHJvb3QsIDEpOworCQlCVUdfT04oIXRyYW5zKTsKKwkJcmV0ID0gYnRyZnNfY29tbWl0X3RyYW5zYWN0aW9uKHRyYW5zLCByb290KTsKKwkJQlVHX09OKHJldCk7CisJfQorCisJbG9jYXRpb24ub2JqZWN0aWQgPSBCVFJGU19EQVRBX1JFTE9DX1RSRUVfT0JKRUNUSUQ7CisJbG9jYXRpb24ub2Zmc2V0ID0gKHU2NCktMTsKKwlsb2NhdGlvbi50eXBlID0gQlRSRlNfUk9PVF9JVEVNX0tFWTsKKworCXJlbG9jX3Jvb3QgPSBidHJmc19yZWFkX2ZzX3Jvb3Rfbm9fbmFtZShyb290LT5mc19pbmZvLCAmbG9jYXRpb24pOworCUJVR19PTighcmVsb2Nfcm9vdCk7CisJYnRyZnNfb3JwaGFuX2NsZWFudXAocmVsb2Nfcm9vdCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBub2lubGluZSBpbnQgaW5pdF9yZWxvY190cmVlKHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAorCQkJCSAgICBzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCkKK3sKKwlzdHJ1Y3QgYnRyZnNfcm9vdCAqcmVsb2Nfcm9vdDsKKwlzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqZWI7CisJc3RydWN0IGJ0cmZzX3Jvb3RfaXRlbSAqcm9vdF9pdGVtOworCXN0cnVjdCBidHJmc19rZXkgcm9vdF9rZXk7CisJaW50IHJldDsKKworCUJVR19PTighcm9vdC0+cmVmX2Nvd3MpOworCWlmIChyb290LT5yZWxvY19yb290KQorCQlyZXR1cm4gMDsKKworCXJvb3RfaXRlbSA9IGttYWxsb2Moc2l6ZW9mKCpyb290X2l0ZW0pLCBHRlBfTk9GUyk7CisJQlVHX09OKCFyb290X2l0ZW0pOworCisJcmV0ID0gYnRyZnNfY29weV9yb290KHRyYW5zLCByb290LCByb290LT5jb21taXRfcm9vdCwKKwkJCSAgICAgICZlYiwgQlRSRlNfVFJFRV9SRUxPQ19PQkpFQ1RJRCk7CisJQlVHX09OKHJldCk7CisKKwlyb290X2tleS5vYmplY3RpZCA9IEJUUkZTX1RSRUVfUkVMT0NfT0JKRUNUSUQ7CisJcm9vdF9rZXkub2Zmc2V0ID0gcm9vdC0+cm9vdF9rZXkub2JqZWN0aWQ7CisJcm9vdF9rZXkudHlwZSA9IEJUUkZTX1JPT1RfSVRFTV9LRVk7CisKKwltZW1jcHkocm9vdF9pdGVtLCAmcm9vdC0+cm9vdF9pdGVtLCBzaXplb2Yocm9vdF9pdGVtKSk7CisJYnRyZnNfc2V0X3Jvb3RfcmVmcyhyb290X2l0ZW0sIDApOworCWJ0cmZzX3NldF9yb290X2J5dGVucihyb290X2l0ZW0sIGViLT5zdGFydCk7CisJYnRyZnNfc2V0X3Jvb3RfbGV2ZWwocm9vdF9pdGVtLCBidHJmc19oZWFkZXJfbGV2ZWwoZWIpKTsKKwlidHJmc19zZXRfcm9vdF9nZW5lcmF0aW9uKHJvb3RfaXRlbSwgdHJhbnMtPnRyYW5zaWQpOworCisJYnRyZnNfdHJlZV91bmxvY2soZWIpOworCWZyZWVfZXh0ZW50X2J1ZmZlcihlYik7CisKKwlyZXQgPSBidHJmc19pbnNlcnRfcm9vdCh0cmFucywgcm9vdC0+ZnNfaW5mby0+dHJlZV9yb290LAorCQkJCSZyb290X2tleSwgcm9vdF9pdGVtKTsKKwlCVUdfT04ocmV0KTsKKwlrZnJlZShyb290X2l0ZW0pOworCisJcmVsb2Nfcm9vdCA9IGJ0cmZzX3JlYWRfZnNfcm9vdF9ub19yYWRpeChyb290LT5mc19pbmZvLT50cmVlX3Jvb3QsCisJCQkJCQkgJnJvb3Rfa2V5KTsKKwlCVUdfT04oIXJlbG9jX3Jvb3QpOworCXJlbG9jX3Jvb3QtPmxhc3RfdHJhbnMgPSB0cmFucy0+dHJhbnNpZDsKKwlyZWxvY19yb290LT5jb21taXRfcm9vdCA9IE5VTEw7CisJcmVsb2Nfcm9vdC0+cmVmX3RyZWUgPSAmcm9vdC0+ZnNfaW5mby0+cmVsb2NfcmVmX3RyZWU7CisKKwlyb290LT5yZWxvY19yb290ID0gcmVsb2Nfcm9vdDsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIENvcmUgZnVuY3Rpb24gb2Ygc3BhY2UgYmFsYW5jZS4KKyAqCisgKiBUaGUgaWRlYSBpcyB1c2luZyByZWxvYyB0cmVlcyB0byByZWxvY2F0ZSB0cmVlIGJsb2NrcyBpbiByZWZlcmVuY2UKKyAqIGNvdW50ZWQgcm9vdHMuIFRoZXJlIGlzIG9uZSByZWxvYyB0cmVlIGZvciBlYWNoIHN1YnZvbCwgYW5kIGFsbAorICogcmVsb2MgdHJlZXMgc2hhcmUgc2FtZSByb290IGtleSBvYmplY3RpZC4gUmVsb2MgdHJlZXMgYXJlIHNuYXBzaG90cworICogb2YgdGhlIGxhdGVzdCBjb21taXR0ZWQgcm9vdHMgb2Ygc3Vidm9scyAocm9vdC0+Y29tbWl0X3Jvb3QpLgorICoKKyAqIFRvIHJlbG9jYXRlIGEgdHJlZSBibG9jayByZWZlcmVuY2VkIGJ5IGEgc3Vidm9sLCB0aGVyZSBhcmUgdHdvIHN0ZXBzLgorICogQ09XIHRoZSBibG9jayB0aHJvdWdoIHN1YnZvbCdzIHJlbG9jIHRyZWUsIHRoZW4gdXBkYXRlIGJsb2NrIHBvaW50ZXIKKyAqIGluIHRoZSBzdWJ2b2wgdG8gcG9pbnQgdG8gdGhlIG5ldyBibG9jay4gU2luY2UgYWxsIHJlbG9jIHRyZWVzIHNoYXJlCisgKiBzYW1lIHJvb3Qga2V5IG9iamVjdGlkLCBkb2luZyBzcGVjaWFsIGhhbmRpbmcgZm9yIHRyZWUgYmxvY2tzIG93bmVkCisgKiBieSB0aGVtIGlzIGVhc3kuIE9uY2UgYSB0cmVlIGJsb2NrIGhhcyBiZWVuIENPV2VkIGluIG9uZSByZWxvYyB0cmVlLAorICogd2UgY2FuIHVzZSB0aGUgcmVzdWx0aW5nIG5ldyBibG9jayBkaXJlY3RseSB3aGVuIHRoZSBzYW1lIGJsb2NrIGlzCisgKiByZXF1aXJlZCB0byBDT1cgYWdhaW4gdGhyb3VnaCBvdGhlciByZWxvYyB0cmVlcy4gQnkgdGhpcyB3YXksIHJlbG9jYXRlZAorICogdHJlZSBibG9ja3MgYXJlIHNoYXJlZCBiZXR3ZWVuIHJlbG9jIHRyZWVzLCBzbyB0aGV5IGFyZSBhbHNvIHNoYXJlZAorICogYmV0d2VlbiBzdWJ2b2xzLgorICovCitzdGF0aWMgbm9pbmxpbmUgaW50IHJlbG9jYXRlX29uZV9wYXRoKHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAorCQkJCSAgICAgIHN0cnVjdCBidHJmc19yb290ICpyb290LAorCQkJCSAgICAgIHN0cnVjdCBidHJmc19wYXRoICpwYXRoLAorCQkJCSAgICAgIHN0cnVjdCBidHJmc19rZXkgKmZpcnN0X2tleSwKKwkJCQkgICAgICBzdHJ1Y3QgYnRyZnNfcmVmX3BhdGggKnJlZl9wYXRoLAorCQkJCSAgICAgIHN0cnVjdCBidHJmc19ibG9ja19ncm91cF9jYWNoZSAqZ3JvdXAsCisJCQkJICAgICAgc3RydWN0IGlub2RlICpyZWxvY19pbm9kZSkKK3sKKwlzdHJ1Y3QgYnRyZnNfcm9vdCAqcmVsb2Nfcm9vdDsKKwlzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqZWIgPSBOVUxMOworCXN0cnVjdCBidHJmc19rZXkgKmtleXM7CisJdTY0ICpub2RlczsKKwlpbnQgbGV2ZWw7CisJaW50IHNoYXJlZF9sZXZlbDsKKwlpbnQgbG93ZXN0X2xldmVsID0gMDsKKwlpbnQgcmV0OworCisJaWYgKHJlZl9wYXRoLT5vd25lcl9vYmplY3RpZCA8IEJUUkZTX0ZJUlNUX0ZSRUVfT0JKRUNUSUQpCisJCWxvd2VzdF9sZXZlbCA9IHJlZl9wYXRoLT5vd25lcl9vYmplY3RpZDsKKworCWlmICghcm9vdC0+cmVmX2Nvd3MpIHsKKwkJcGF0aC0+bG93ZXN0X2xldmVsID0gbG93ZXN0X2xldmVsOworCQlyZXQgPSBidHJmc19zZWFyY2hfc2xvdCh0cmFucywgcm9vdCwgZmlyc3Rfa2V5LCBwYXRoLCAwLCAxKTsKKwkJQlVHX09OKHJldCA8IDApOworCQlwYXRoLT5sb3dlc3RfbGV2ZWwgPSAwOworCQlidHJmc19yZWxlYXNlX3BhdGgocm9vdCwgcGF0aCk7CisJCXJldHVybiAwOworCX0KKworCW11dGV4X2xvY2soJnJvb3QtPmZzX2luZm8tPnRyZWVfcmVsb2NfbXV0ZXgpOworCXJldCA9IGluaXRfcmVsb2NfdHJlZSh0cmFucywgcm9vdCk7CisJQlVHX09OKHJldCk7CisJcmVsb2Nfcm9vdCA9IHJvb3QtPnJlbG9jX3Jvb3Q7CisKKwlzaGFyZWRfbGV2ZWwgPSByZWZfcGF0aC0+c2hhcmVkX2xldmVsOworCXJlZl9wYXRoLT5zaGFyZWRfbGV2ZWwgPSBCVFJGU19NQVhfTEVWRUwgLSAxOworCisJa2V5cyA9IHJlZl9wYXRoLT5ub2RlX2tleXM7CisJbm9kZXMgPSByZWZfcGF0aC0+bmV3X25vZGVzOworCW1lbXNldCgma2V5c1tzaGFyZWRfbGV2ZWwgKyAxXSwgMCwKKwkgICAgICAgc2l6ZW9mKCprZXlzKSAqIChCVFJGU19NQVhfTEVWRUwgLSBzaGFyZWRfbGV2ZWwgLSAxKSk7CisJbWVtc2V0KCZub2Rlc1tzaGFyZWRfbGV2ZWwgKyAxXSwgMCwKKwkgICAgICAgc2l6ZW9mKCpub2RlcykgKiAoQlRSRlNfTUFYX0xFVkVMIC0gc2hhcmVkX2xldmVsIC0gMSkpOworCisJaWYgKG5vZGVzW2xvd2VzdF9sZXZlbF0gPT0gMCkgeworCQlwYXRoLT5sb3dlc3RfbGV2ZWwgPSBsb3dlc3RfbGV2ZWw7CisJCXJldCA9IGJ0cmZzX3NlYXJjaF9zbG90KHRyYW5zLCByZWxvY19yb290LCBmaXJzdF9rZXksIHBhdGgsCisJCQkJCTAsIDEpOworCQlCVUdfT04ocmV0KTsKKwkJZm9yIChsZXZlbCA9IGxvd2VzdF9sZXZlbDsgbGV2ZWwgPCBCVFJGU19NQVhfTEVWRUw7IGxldmVsKyspIHsKKwkJCWViID0gcGF0aC0+bm9kZXNbbGV2ZWxdOworCQkJaWYgKCFlYiB8fCBlYiA9PSByZWxvY19yb290LT5ub2RlKQorCQkJCWJyZWFrOworCQkJbm9kZXNbbGV2ZWxdID0gZWItPnN0YXJ0OworCQkJaWYgKGxldmVsID09IDApCisJCQkJYnRyZnNfaXRlbV9rZXlfdG9fY3B1KGViLCAma2V5c1tsZXZlbF0sIDApOworCQkJZWxzZQorCQkJCWJ0cmZzX25vZGVfa2V5X3RvX2NwdShlYiwgJmtleXNbbGV2ZWxdLCAwKTsKKwkJfQorCQlpZiAobm9kZXNbMF0gJiYKKwkJICAgIHJlZl9wYXRoLT5vd25lcl9vYmplY3RpZCA+PSBCVFJGU19GSVJTVF9GUkVFX09CSkVDVElEKSB7CisJCQllYiA9IHBhdGgtPm5vZGVzWzBdOworCQkJcmV0ID0gcmVwbGFjZV9leHRlbnRzX2luX2xlYWYodHJhbnMsIHJlbG9jX3Jvb3QsIGViLAorCQkJCQkJICAgICAgZ3JvdXAsIHJlbG9jX2lub2RlKTsKKwkJCUJVR19PTihyZXQpOworCQl9CisJCWJ0cmZzX3JlbGVhc2VfcGF0aChyZWxvY19yb290LCBwYXRoKTsKKwl9IGVsc2UgeworCQlyZXQgPSBidHJmc19tZXJnZV9wYXRoKHRyYW5zLCByZWxvY19yb290LCBrZXlzLCBub2RlcywKKwkJCQkgICAgICAgbG93ZXN0X2xldmVsKTsKKwkJQlVHX09OKHJldCk7CisJfQorCisJLyoKKwkgKiByZXBsYWNlIHRyZWUgYmxvY2tzIGluIHRoZSBmcyB0cmVlIHdpdGggdHJlZSBibG9ja3MgaW4KKwkgKiB0aGUgcmVsb2MgdHJlZS4KKwkgKi8KKwlyZXQgPSBidHJmc19tZXJnZV9wYXRoKHRyYW5zLCByb290LCBrZXlzLCBub2RlcywgbG93ZXN0X2xldmVsKTsKKwlCVUdfT04ocmV0IDwgMCk7CisKKwlpZiAocmVmX3BhdGgtPm93bmVyX29iamVjdGlkID49IEJUUkZTX0ZJUlNUX0ZSRUVfT0JKRUNUSUQpIHsKKwkJcmV0ID0gYnRyZnNfc2VhcmNoX3Nsb3QodHJhbnMsIHJlbG9jX3Jvb3QsIGZpcnN0X2tleSwgcGF0aCwKKwkJCQkJMCwgMCk7CisJCUJVR19PTihyZXQpOworCQlleHRlbnRfYnVmZmVyX2dldChwYXRoLT5ub2Rlc1swXSk7CisJCWViID0gcGF0aC0+bm9kZXNbMF07CisJCWJ0cmZzX3JlbGVhc2VfcGF0aChyZWxvY19yb290LCBwYXRoKTsKKwkJcmV0ID0gaW52YWxpZGF0ZV9leHRlbnRfY2FjaGUocmVsb2Nfcm9vdCwgZWIsIGdyb3VwLCByb290KTsKKwkJQlVHX09OKHJldCk7CisJCWZyZWVfZXh0ZW50X2J1ZmZlcihlYik7CisJfQorCisJbXV0ZXhfdW5sb2NrKCZyb290LT5mc19pbmZvLT50cmVlX3JlbG9jX211dGV4KTsKKwlwYXRoLT5sb3dlc3RfbGV2ZWwgPSAwOworCXJldHVybiAwOworfQorCitzdGF0aWMgbm9pbmxpbmUgaW50IHJlbG9jYXRlX3RyZWVfYmxvY2soc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCisJCQkJCXN0cnVjdCBidHJmc19yb290ICpyb290LAorCQkJCQlzdHJ1Y3QgYnRyZnNfcGF0aCAqcGF0aCwKKwkJCQkJc3RydWN0IGJ0cmZzX2tleSAqZmlyc3Rfa2V5LAorCQkJCQlzdHJ1Y3QgYnRyZnNfcmVmX3BhdGggKnJlZl9wYXRoKQoreworCWludCByZXQ7CisKKwlyZXQgPSByZWxvY2F0ZV9vbmVfcGF0aCh0cmFucywgcm9vdCwgcGF0aCwgZmlyc3Rfa2V5LAorCQkJCXJlZl9wYXRoLCBOVUxMLCBOVUxMKTsKKwlCVUdfT04ocmV0KTsKKworCWlmIChyb290ID09IHJvb3QtPmZzX2luZm8tPmV4dGVudF9yb290KQorCQlidHJmc19leHRlbnRfcG9zdF9vcCh0cmFucywgcm9vdCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIG5vaW5saW5lIGludCBkZWxfZXh0ZW50X3plcm8oc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCisJCQkJICAgIHN0cnVjdCBidHJmc19yb290ICpleHRlbnRfcm9vdCwKKwkJCQkgICAgc3RydWN0IGJ0cmZzX3BhdGggKnBhdGgsCisJCQkJICAgIHN0cnVjdCBidHJmc19rZXkgKmV4dGVudF9rZXkpCit7CisJaW50IHJldDsKKworCXJldCA9IGJ0cmZzX3NlYXJjaF9zbG90KHRyYW5zLCBleHRlbnRfcm9vdCwgZXh0ZW50X2tleSwgcGF0aCwgLTEsIDEpOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCXJldCA9IGJ0cmZzX2RlbF9pdGVtKHRyYW5zLCBleHRlbnRfcm9vdCwgcGF0aCk7CitvdXQ6CisJYnRyZnNfcmVsZWFzZV9wYXRoKGV4dGVudF9yb290LCBwYXRoKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgbm9pbmxpbmUgc3RydWN0IGJ0cmZzX3Jvb3QgKnJlYWRfcmVmX3Jvb3Qoc3RydWN0IGJ0cmZzX2ZzX2luZm8gKmZzX2luZm8sCisJCQkJCQlzdHJ1Y3QgYnRyZnNfcmVmX3BhdGggKnJlZl9wYXRoKQoreworCXN0cnVjdCBidHJmc19rZXkgcm9vdF9rZXk7CisKKwlyb290X2tleS5vYmplY3RpZCA9IHJlZl9wYXRoLT5yb290X29iamVjdGlkOworCXJvb3Rfa2V5LnR5cGUgPSBCVFJGU19ST09UX0lURU1fS0VZOworCWlmIChpc19jb3dvbmx5X3Jvb3QocmVmX3BhdGgtPnJvb3Rfb2JqZWN0aWQpKQorCQlyb290X2tleS5vZmZzZXQgPSAwOworCWVsc2UKKwkJcm9vdF9rZXkub2Zmc2V0ID0gKHU2NCktMTsKKworCXJldHVybiBidHJmc19yZWFkX2ZzX3Jvb3Rfbm9fbmFtZShmc19pbmZvLCAmcm9vdF9rZXkpOworfQorCitzdGF0aWMgbm9pbmxpbmUgaW50IHJlbG9jYXRlX29uZV9leHRlbnQoc3RydWN0IGJ0cmZzX3Jvb3QgKmV4dGVudF9yb290LAorCQkJCQlzdHJ1Y3QgYnRyZnNfcGF0aCAqcGF0aCwKKwkJCQkJc3RydWN0IGJ0cmZzX2tleSAqZXh0ZW50X2tleSwKKwkJCQkJc3RydWN0IGJ0cmZzX2Jsb2NrX2dyb3VwX2NhY2hlICpncm91cCwKKwkJCQkJc3RydWN0IGlub2RlICpyZWxvY19pbm9kZSwgaW50IHBhc3MpCit7CisJc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnM7CisJc3RydWN0IGJ0cmZzX3Jvb3QgKmZvdW5kX3Jvb3Q7CisJc3RydWN0IGJ0cmZzX3JlZl9wYXRoICpyZWZfcGF0aCA9IE5VTEw7CisJc3RydWN0IGRpc2tfZXh0ZW50ICpuZXdfZXh0ZW50cyA9IE5VTEw7CisJaW50IG5yX2V4dGVudHMgPSAwOworCWludCBsb29wczsKKwlpbnQgcmV0OworCWludCBsZXZlbDsKKwlzdHJ1Y3QgYnRyZnNfa2V5IGZpcnN0X2tleTsKKwl1NjQgcHJldl9ibG9jayA9IDA7CisKKworCXRyYW5zID0gYnRyZnNfc3RhcnRfdHJhbnNhY3Rpb24oZXh0ZW50X3Jvb3QsIDEpOworCUJVR19PTighdHJhbnMpOworCisJaWYgKGV4dGVudF9rZXktPm9iamVjdGlkID09IDApIHsKKwkJcmV0ID0gZGVsX2V4dGVudF96ZXJvKHRyYW5zLCBleHRlbnRfcm9vdCwgcGF0aCwgZXh0ZW50X2tleSk7CisJCWdvdG8gb3V0OworCX0KKworCXJlZl9wYXRoID0ga21hbGxvYyhzaXplb2YoKnJlZl9wYXRoKSwgR0ZQX05PRlMpOworCWlmICghcmVmX3BhdGgpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBvdXQ7CisJfQorCisJZm9yIChsb29wcyA9IDA7IDsgbG9vcHMrKykgeworCQlpZiAobG9vcHMgPT0gMCkgeworCQkJcmV0ID0gYnRyZnNfZmlyc3RfcmVmX3BhdGgodHJhbnMsIGV4dGVudF9yb290LCByZWZfcGF0aCwKKwkJCQkJCSAgIGV4dGVudF9rZXktPm9iamVjdGlkKTsKKwkJfSBlbHNlIHsKKwkJCXJldCA9IGJ0cmZzX25leHRfcmVmX3BhdGgodHJhbnMsIGV4dGVudF9yb290LCByZWZfcGF0aCk7CisJCX0KKwkJaWYgKHJldCA8IDApCisJCQlnb3RvIG91dDsKKwkJaWYgKHJldCA+IDApCisJCQlicmVhazsKKworCQlpZiAocmVmX3BhdGgtPnJvb3Rfb2JqZWN0aWQgPT0gQlRSRlNfVFJFRV9MT0dfT0JKRUNUSUQgfHwKKwkJICAgIHJlZl9wYXRoLT5yb290X29iamVjdGlkID09IEJUUkZTX1RSRUVfUkVMT0NfT0JKRUNUSUQpCisJCQljb250aW51ZTsKKworCQlmb3VuZF9yb290ID0gcmVhZF9yZWZfcm9vdChleHRlbnRfcm9vdC0+ZnNfaW5mbywgcmVmX3BhdGgpOworCQlCVUdfT04oIWZvdW5kX3Jvb3QpOworCQkvKgorCQkgKiBmb3IgcmVmZXJlbmNlIGNvdW50ZWQgdHJlZSwgb25seSBwcm9jZXNzIHJlZmVyZW5jZSBwYXRocworCQkgKiByb290ZWQgYXQgdGhlIGxhdGVzdCBjb21taXR0ZWQgcm9vdC4KKwkJICovCisJCWlmIChmb3VuZF9yb290LT5yZWZfY293cyAmJgorCQkgICAgcmVmX3BhdGgtPnJvb3RfZ2VuZXJhdGlvbiAhPSBmb3VuZF9yb290LT5yb290X2tleS5vZmZzZXQpCisJCQljb250aW51ZTsKKworCQlpZiAocmVmX3BhdGgtPm93bmVyX29iamVjdGlkID49IEJUUkZTX0ZJUlNUX0ZSRUVfT0JKRUNUSUQpIHsKKwkJCWlmIChwYXNzID09IDApIHsKKwkJCQkvKgorCQkJCSAqIGNvcHkgZGF0YSBleHRlbnRzIHRvIG5ldyBsb2NhdGlvbnMKKwkJCQkgKi8KKwkJCQl1NjQgZ3JvdXBfc3RhcnQgPSBncm91cC0+a2V5Lm9iamVjdGlkOworCQkJCXJldCA9IHJlbG9jYXRlX2RhdGFfZXh0ZW50KHJlbG9jX2lub2RlLAorCQkJCQkJCSAgIGV4dGVudF9rZXksCisJCQkJCQkJICAgZ3JvdXBfc3RhcnQpOworCQkJCWlmIChyZXQgPCAwKQorCQkJCQlnb3RvIG91dDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWxldmVsID0gMDsKKwkJfSBlbHNlIHsKKwkJCWxldmVsID0gcmVmX3BhdGgtPm93bmVyX29iamVjdGlkOworCQl9CisKKwkJaWYgKHByZXZfYmxvY2sgIT0gcmVmX3BhdGgtPm5vZGVzW2xldmVsXSkgeworCQkJc3RydWN0IGV4dGVudF9idWZmZXIgKmViOworCQkJdTY0IGJsb2NrX3N0YXJ0ID0gcmVmX3BhdGgtPm5vZGVzW2xldmVsXTsKKwkJCXU2NCBibG9ja19zaXplID0gYnRyZnNfbGV2ZWxfc2l6ZShmb3VuZF9yb290LCBsZXZlbCk7CisKKwkJCWViID0gcmVhZF90cmVlX2Jsb2NrKGZvdW5kX3Jvb3QsIGJsb2NrX3N0YXJ0LAorCQkJCQkgICAgIGJsb2NrX3NpemUsIDApOworCQkJYnRyZnNfdHJlZV9sb2NrKGViKTsKKwkJCUJVR19PTihsZXZlbCAhPSBidHJmc19oZWFkZXJfbGV2ZWwoZWIpKTsKKworCQkJaWYgKGxldmVsID09IDApCisJCQkJYnRyZnNfaXRlbV9rZXlfdG9fY3B1KGViLCAmZmlyc3Rfa2V5LCAwKTsKKwkJCWVsc2UKKwkJCQlidHJmc19ub2RlX2tleV90b19jcHUoZWIsICZmaXJzdF9rZXksIDApOworCisJCQlidHJmc190cmVlX3VubG9jayhlYik7CisJCQlmcmVlX2V4dGVudF9idWZmZXIoZWIpOworCQkJcHJldl9ibG9jayA9IGJsb2NrX3N0YXJ0OworCQl9CisKKwkJYnRyZnNfcmVjb3JkX3Jvb3RfaW5fdHJhbnMoZm91bmRfcm9vdCk7CisJCWlmIChyZWZfcGF0aC0+b3duZXJfb2JqZWN0aWQgPj0gQlRSRlNfRklSU1RfRlJFRV9PQkpFQ1RJRCkgeworCQkJLyoKKwkJCSAqIHRyeSB0byB1cGRhdGUgZGF0YSBleHRlbnQgcmVmZXJlbmNlcyB3aGlsZQorCQkJICoga2VlcGluZyBtZXRhZGF0YSBzaGFyZWQgYmV0d2VlbiBzbmFwc2hvdHMuCisJCQkgKi8KKwkJCWlmIChwYXNzID09IDEpIHsKKwkJCQlyZXQgPSByZWxvY2F0ZV9vbmVfcGF0aCh0cmFucywgZm91bmRfcm9vdCwKKwkJCQkJCXBhdGgsICZmaXJzdF9rZXksIHJlZl9wYXRoLAorCQkJCQkJZ3JvdXAsIHJlbG9jX2lub2RlKTsKKwkJCQlpZiAocmV0IDwgMCkKKwkJCQkJZ290byBvdXQ7CisJCQkJY29udGludWU7CisJCQl9CisJCQkvKgorCQkJICogdXNlIGZhbGxiYWNrIG1ldGhvZCB0byBwcm9jZXNzIHRoZSByZW1haW5pbmcKKwkJCSAqIHJlZmVyZW5jZXMuCisJCQkgKi8KKwkJCWlmICghbmV3X2V4dGVudHMpIHsKKwkJCQl1NjQgZ3JvdXBfc3RhcnQgPSBncm91cC0+a2V5Lm9iamVjdGlkOworCQkJCW5ld19leHRlbnRzID0ga21hbGxvYyhzaXplb2YoKm5ld19leHRlbnRzKSwKKwkJCQkJCSAgICAgIEdGUF9OT0ZTKTsKKwkJCQlucl9leHRlbnRzID0gMTsKKwkJCQlyZXQgPSBnZXRfbmV3X2xvY2F0aW9ucyhyZWxvY19pbm9kZSwKKwkJCQkJCQlleHRlbnRfa2V5LAorCQkJCQkJCWdyb3VwX3N0YXJ0LCAxLAorCQkJCQkJCSZuZXdfZXh0ZW50cywKKwkJCQkJCQkmbnJfZXh0ZW50cyk7CisJCQkJaWYgKHJldCkKKwkJCQkJZ290byBvdXQ7CisJCQl9CisJCQlyZXQgPSByZXBsYWNlX29uZV9leHRlbnQodHJhbnMsIGZvdW5kX3Jvb3QsCisJCQkJCQlwYXRoLCBleHRlbnRfa2V5LAorCQkJCQkJJmZpcnN0X2tleSwgcmVmX3BhdGgsCisJCQkJCQluZXdfZXh0ZW50cywgbnJfZXh0ZW50cyk7CisJCX0gZWxzZSB7CisJCQlyZXQgPSByZWxvY2F0ZV90cmVlX2Jsb2NrKHRyYW5zLCBmb3VuZF9yb290LCBwYXRoLAorCQkJCQkJICAmZmlyc3Rfa2V5LCByZWZfcGF0aCk7CisJCX0KKwkJaWYgKHJldCA8IDApCisJCQlnb3RvIG91dDsKKwl9CisJcmV0ID0gMDsKK291dDoKKwlidHJmc19lbmRfdHJhbnNhY3Rpb24odHJhbnMsIGV4dGVudF9yb290KTsKKwlrZnJlZShuZXdfZXh0ZW50cyk7CisJa2ZyZWUocmVmX3BhdGgpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB1NjQgdXBkYXRlX2Jsb2NrX2dyb3VwX2ZsYWdzKHN0cnVjdCBidHJmc19yb290ICpyb290LCB1NjQgZmxhZ3MpCit7CisJdTY0IG51bV9kZXZpY2VzOworCXU2NCBzdHJpcHBlZCA9IEJUUkZTX0JMT0NLX0dST1VQX1JBSUQwIHwKKwkJQlRSRlNfQkxPQ0tfR1JPVVBfUkFJRDEgfCBCVFJGU19CTE9DS19HUk9VUF9SQUlEMTA7CisKKwludW1fZGV2aWNlcyA9IHJvb3QtPmZzX2luZm8tPmZzX2RldmljZXMtPnJ3X2RldmljZXM7CisJaWYgKG51bV9kZXZpY2VzID09IDEpIHsKKwkJc3RyaXBwZWQgfD0gQlRSRlNfQkxPQ0tfR1JPVVBfRFVQOworCQlzdHJpcHBlZCA9IGZsYWdzICYgfnN0cmlwcGVkOworCisJCS8qIHR1cm4gcmFpZDAgaW50byBzaW5nbGUgZGV2aWNlIGNodW5rcyAqLworCQlpZiAoZmxhZ3MgJiBCVFJGU19CTE9DS19HUk9VUF9SQUlEMCkKKwkJCXJldHVybiBzdHJpcHBlZDsKKworCQkvKiB0dXJuIG1pcnJvcmluZyBpbnRvIGR1cGxpY2F0aW9uICovCisJCWlmIChmbGFncyAmIChCVFJGU19CTE9DS19HUk9VUF9SQUlEMSB8CisJCQkgICAgIEJUUkZTX0JMT0NLX0dST1VQX1JBSUQxMCkpCisJCQlyZXR1cm4gc3RyaXBwZWQgfCBCVFJGU19CTE9DS19HUk9VUF9EVVA7CisJCXJldHVybiBmbGFnczsKKwl9IGVsc2UgeworCQkvKiB0aGV5IGFscmVhZHkgaGFkIHJhaWQgb24gaGVyZSwganVzdCByZXR1cm4gKi8KKwkJaWYgKGZsYWdzICYgc3RyaXBwZWQpCisJCQlyZXR1cm4gZmxhZ3M7CisKKwkJc3RyaXBwZWQgfD0gQlRSRlNfQkxPQ0tfR1JPVVBfRFVQOworCQlzdHJpcHBlZCA9IGZsYWdzICYgfnN0cmlwcGVkOworCisJCS8qIHN3aXRjaCBkdXBsaWNhdGVkIGJsb2NrcyB3aXRoIHJhaWQxICovCisJCWlmIChmbGFncyAmIEJUUkZTX0JMT0NLX0dST1VQX0RVUCkKKwkJCXJldHVybiBzdHJpcHBlZCB8IEJUUkZTX0JMT0NLX0dST1VQX1JBSUQxOworCisJCS8qIHR1cm4gc2luZ2xlIGRldmljZSBjaHVua3MgaW50byByYWlkMCAqLworCQlyZXR1cm4gc3RyaXBwZWQgfCBCVFJGU19CTE9DS19HUk9VUF9SQUlEMDsKKwl9CisJcmV0dXJuIGZsYWdzOworfQorCitzdGF0aWMgaW50IF9fYWxsb2NfY2h1bmtfZm9yX3NocmluayhzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwKKwkJICAgICBzdHJ1Y3QgYnRyZnNfYmxvY2tfZ3JvdXBfY2FjaGUgKnNocmlua19ibG9ja19ncm91cCwKKwkJICAgICBpbnQgZm9yY2UpCit7CisJc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnM7CisJdTY0IG5ld19hbGxvY19mbGFnczsKKwl1NjQgY2FsYzsKKworCXNwaW5fbG9jaygmc2hyaW5rX2Jsb2NrX2dyb3VwLT5sb2NrKTsKKwlpZiAoYnRyZnNfYmxvY2tfZ3JvdXBfdXNlZCgmc2hyaW5rX2Jsb2NrX2dyb3VwLT5pdGVtKSA+IDApIHsKKwkJc3Bpbl91bmxvY2soJnNocmlua19ibG9ja19ncm91cC0+bG9jayk7CisKKwkJdHJhbnMgPSBidHJmc19zdGFydF90cmFuc2FjdGlvbihyb290LCAxKTsKKwkJc3Bpbl9sb2NrKCZzaHJpbmtfYmxvY2tfZ3JvdXAtPmxvY2spOworCisJCW5ld19hbGxvY19mbGFncyA9IHVwZGF0ZV9ibG9ja19ncm91cF9mbGFncyhyb290LAorCQkJCQkJICAgc2hyaW5rX2Jsb2NrX2dyb3VwLT5mbGFncyk7CisJCWlmIChuZXdfYWxsb2NfZmxhZ3MgIT0gc2hyaW5rX2Jsb2NrX2dyb3VwLT5mbGFncykgeworCQkJY2FsYyA9CisJCQkgICAgIGJ0cmZzX2Jsb2NrX2dyb3VwX3VzZWQoJnNocmlua19ibG9ja19ncm91cC0+aXRlbSk7CisJCX0gZWxzZSB7CisJCQljYWxjID0gc2hyaW5rX2Jsb2NrX2dyb3VwLT5rZXkub2Zmc2V0OworCQl9CisJCXNwaW5fdW5sb2NrKCZzaHJpbmtfYmxvY2tfZ3JvdXAtPmxvY2spOworCisJCWRvX2NodW5rX2FsbG9jKHRyYW5zLCByb290LT5mc19pbmZvLT5leHRlbnRfcm9vdCwKKwkJCSAgICAgICBjYWxjICsgMiAqIDEwMjQgKiAxMDI0LCBuZXdfYWxsb2NfZmxhZ3MsIGZvcmNlKTsKKworCQlidHJmc19lbmRfdHJhbnNhY3Rpb24odHJhbnMsIHJvb3QpOworCX0gZWxzZQorCQlzcGluX3VubG9jaygmc2hyaW5rX2Jsb2NrX2dyb3VwLT5sb2NrKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2luc2VydF9vcnBoYW5faW5vZGUoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCisJCQkJIHN0cnVjdCBidHJmc19yb290ICpyb290LAorCQkJCSB1NjQgb2JqZWN0aWQsIHU2NCBzaXplKQoreworCXN0cnVjdCBidHJmc19wYXRoICpwYXRoOworCXN0cnVjdCBidHJmc19pbm9kZV9pdGVtICppdGVtOworCXN0cnVjdCBleHRlbnRfYnVmZmVyICpsZWFmOworCWludCByZXQ7CisKKwlwYXRoID0gYnRyZnNfYWxsb2NfcGF0aCgpOworCWlmICghcGF0aCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyZXQgPSBidHJmc19pbnNlcnRfZW1wdHlfaW5vZGUodHJhbnMsIHJvb3QsIHBhdGgsIG9iamVjdGlkKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKworCWxlYWYgPSBwYXRoLT5ub2Rlc1swXTsKKwlpdGVtID0gYnRyZnNfaXRlbV9wdHIobGVhZiwgcGF0aC0+c2xvdHNbMF0sIHN0cnVjdCBidHJmc19pbm9kZV9pdGVtKTsKKwltZW1zZXRfZXh0ZW50X2J1ZmZlcihsZWFmLCAwLCAodW5zaWduZWQgbG9uZylpdGVtLCBzaXplb2YoKml0ZW0pKTsKKwlidHJmc19zZXRfaW5vZGVfZ2VuZXJhdGlvbihsZWFmLCBpdGVtLCAxKTsKKwlidHJmc19zZXRfaW5vZGVfc2l6ZShsZWFmLCBpdGVtLCBzaXplKTsKKwlidHJmc19zZXRfaW5vZGVfbW9kZShsZWFmLCBpdGVtLCBTX0lGUkVHIHwgMDYwMCk7CisJYnRyZnNfc2V0X2lub2RlX2ZsYWdzKGxlYWYsIGl0ZW0sIEJUUkZTX0lOT0RFX05PQ09NUFJFU1MpOworCWJ0cmZzX21hcmtfYnVmZmVyX2RpcnR5KGxlYWYpOworCWJ0cmZzX3JlbGVhc2VfcGF0aChyb290LCBwYXRoKTsKK291dDoKKwlidHJmc19mcmVlX3BhdGgocGF0aCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIG5vaW5saW5lIHN0cnVjdCBpbm9kZSAqY3JlYXRlX3JlbG9jX2lub2RlKHN0cnVjdCBidHJmc19mc19pbmZvICpmc19pbmZvLAorCQkJCQlzdHJ1Y3QgYnRyZnNfYmxvY2tfZ3JvdXBfY2FjaGUgKmdyb3VwKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBOVUxMOworCXN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zOworCXN0cnVjdCBidHJmc19yb290ICpyb290OworCXN0cnVjdCBidHJmc19rZXkgcm9vdF9rZXk7CisJdTY0IG9iamVjdGlkID0gQlRSRlNfRklSU1RfRlJFRV9PQkpFQ1RJRDsKKwlpbnQgZXJyID0gMDsKKworCXJvb3Rfa2V5Lm9iamVjdGlkID0gQlRSRlNfREFUQV9SRUxPQ19UUkVFX09CSkVDVElEOworCXJvb3Rfa2V5LnR5cGUgPSBCVFJGU19ST09UX0lURU1fS0VZOworCXJvb3Rfa2V5Lm9mZnNldCA9ICh1NjQpLTE7CisJcm9vdCA9IGJ0cmZzX3JlYWRfZnNfcm9vdF9ub19uYW1lKGZzX2luZm8sICZyb290X2tleSk7CisJaWYgKElTX0VSUihyb290KSkKKwkJcmV0dXJuIEVSUl9DQVNUKHJvb3QpOworCisJdHJhbnMgPSBidHJmc19zdGFydF90cmFuc2FjdGlvbihyb290LCAxKTsKKwlCVUdfT04oIXRyYW5zKTsKKworCWVyciA9IGJ0cmZzX2ZpbmRfZnJlZV9vYmplY3RpZCh0cmFucywgcm9vdCwgb2JqZWN0aWQsICZvYmplY3RpZCk7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisKKwllcnIgPSBfX2luc2VydF9vcnBoYW5faW5vZGUodHJhbnMsIHJvb3QsIG9iamVjdGlkLCBncm91cC0+a2V5Lm9mZnNldCk7CisJQlVHX09OKGVycik7CisKKwllcnIgPSBidHJmc19pbnNlcnRfZmlsZV9leHRlbnQodHJhbnMsIHJvb3QsIG9iamVjdGlkLCAwLCAwLCAwLAorCQkJCSAgICAgICBncm91cC0+a2V5Lm9mZnNldCwgMCwgZ3JvdXAtPmtleS5vZmZzZXQsCisJCQkJICAgICAgIDAsIDAsIDApOworCUJVR19PTihlcnIpOworCisJaW5vZGUgPSBidHJmc19pZ2V0X2xvY2tlZChyb290LT5mc19pbmZvLT5zYiwgb2JqZWN0aWQsIHJvb3QpOworCWlmIChpbm9kZS0+aV9zdGF0ZSAmIElfTkVXKSB7CisJCUJUUkZTX0koaW5vZGUpLT5yb290ID0gcm9vdDsKKwkJQlRSRlNfSShpbm9kZSktPmxvY2F0aW9uLm9iamVjdGlkID0gb2JqZWN0aWQ7CisJCUJUUkZTX0koaW5vZGUpLT5sb2NhdGlvbi50eXBlID0gQlRSRlNfSU5PREVfSVRFTV9LRVk7CisJCUJUUkZTX0koaW5vZGUpLT5sb2NhdGlvbi5vZmZzZXQgPSAwOworCQlidHJmc19yZWFkX2xvY2tlZF9pbm9kZShpbm9kZSk7CisJCXVubG9ja19uZXdfaW5vZGUoaW5vZGUpOworCQlCVUdfT04oaXNfYmFkX2lub2RlKGlub2RlKSk7CisJfSBlbHNlIHsKKwkJQlVHX09OKDEpOworCX0KKwlCVFJGU19JKGlub2RlKS0+aW5kZXhfY250ID0gZ3JvdXAtPmtleS5vYmplY3RpZDsKKworCWVyciA9IGJ0cmZzX29ycGhhbl9hZGQodHJhbnMsIGlub2RlKTsKK291dDoKKwlidHJmc19lbmRfdHJhbnNhY3Rpb24odHJhbnMsIHJvb3QpOworCWlmIChlcnIpIHsKKwkJaWYgKGlub2RlKQorCQkJaXB1dChpbm9kZSk7CisJCWlub2RlID0gRVJSX1BUUihlcnIpOworCX0KKwlyZXR1cm4gaW5vZGU7Cit9CisKK2ludCBidHJmc19yZWxvY19jbG9uZV9jc3VtcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1NjQgZmlsZV9wb3MsIHU2NCBsZW4pCit7CisKKwlzdHJ1Y3QgYnRyZnNfb3JkZXJlZF9zdW0gKnN1bXM7CisJc3RydWN0IGJ0cmZzX3NlY3Rvcl9zdW0gKnNlY3Rvcl9zdW07CisJc3RydWN0IGJ0cmZzX29yZGVyZWRfZXh0ZW50ICpvcmRlcmVkOworCXN0cnVjdCBidHJmc19yb290ICpyb290ID0gQlRSRlNfSShpbm9kZSktPnJvb3Q7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCXNpemVfdCBvZmZzZXQ7CisJaW50IHJldDsKKwl1NjQgZGlza19ieXRlbnI7CisKKwlJTklUX0xJU1RfSEVBRCgmbGlzdCk7CisKKwlvcmRlcmVkID0gYnRyZnNfbG9va3VwX29yZGVyZWRfZXh0ZW50KGlub2RlLCBmaWxlX3Bvcyk7CisJQlVHX09OKG9yZGVyZWQtPmZpbGVfb2Zmc2V0ICE9IGZpbGVfcG9zIHx8IG9yZGVyZWQtPmxlbiAhPSBsZW4pOworCisJZGlza19ieXRlbnIgPSBmaWxlX3BvcyArIEJUUkZTX0koaW5vZGUpLT5pbmRleF9jbnQ7CisJcmV0ID0gYnRyZnNfbG9va3VwX2NzdW1zX3JhbmdlKHJvb3QtPmZzX2luZm8tPmNzdW1fcm9vdCwgZGlza19ieXRlbnIsCisJCQkJICAgICAgIGRpc2tfYnl0ZW5yICsgbGVuIC0gMSwgJmxpc3QpOworCisJd2hpbGUgKCFsaXN0X2VtcHR5KCZsaXN0KSkgeworCQlzdW1zID0gbGlzdF9lbnRyeShsaXN0Lm5leHQsIHN0cnVjdCBidHJmc19vcmRlcmVkX3N1bSwgbGlzdCk7CisJCWxpc3RfZGVsX2luaXQoJnN1bXMtPmxpc3QpOworCisJCXNlY3Rvcl9zdW0gPSBzdW1zLT5zdW1zOworCQlzdW1zLT5ieXRlbnIgPSBvcmRlcmVkLT5zdGFydDsKKworCQlvZmZzZXQgPSAwOworCQl3aGlsZSAob2Zmc2V0IDwgc3Vtcy0+bGVuKSB7CisJCQlzZWN0b3Jfc3VtLT5ieXRlbnIgKz0gb3JkZXJlZC0+c3RhcnQgLSBkaXNrX2J5dGVucjsKKwkJCXNlY3Rvcl9zdW0rKzsKKwkJCW9mZnNldCArPSByb290LT5zZWN0b3JzaXplOworCQl9CisKKwkJYnRyZnNfYWRkX29yZGVyZWRfc3VtKGlub2RlLCBvcmRlcmVkLCBzdW1zKTsKKwl9CisJYnRyZnNfcHV0X29yZGVyZWRfZXh0ZW50KG9yZGVyZWQpOworCXJldHVybiAwOworfQorCitpbnQgYnRyZnNfcmVsb2NhdGVfYmxvY2tfZ3JvdXAoc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsIHU2NCBncm91cF9zdGFydCkKK3sKKwlzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFuczsKKwlzdHJ1Y3QgYnRyZnNfcGF0aCAqcGF0aDsKKwlzdHJ1Y3QgYnRyZnNfZnNfaW5mbyAqaW5mbyA9IHJvb3QtPmZzX2luZm87CisJc3RydWN0IGV4dGVudF9idWZmZXIgKmxlYWY7CisJc3RydWN0IGlub2RlICpyZWxvY19pbm9kZTsKKwlzdHJ1Y3QgYnRyZnNfYmxvY2tfZ3JvdXBfY2FjaGUgKmJsb2NrX2dyb3VwOworCXN0cnVjdCBidHJmc19rZXkga2V5OworCXU2NCBza2lwcGVkOworCXU2NCBjdXJfYnl0ZTsKKwl1NjQgdG90YWxfZm91bmQ7CisJdTMyIG5yaXRlbXM7CisJaW50IHJldDsKKwlpbnQgcHJvZ3Jlc3M7CisJaW50IHBhc3MgPSAwOworCisJcm9vdCA9IHJvb3QtPmZzX2luZm8tPmV4dGVudF9yb290OworCisJYmxvY2tfZ3JvdXAgPSBidHJmc19sb29rdXBfYmxvY2tfZ3JvdXAoaW5mbywgZ3JvdXBfc3RhcnQpOworCUJVR19PTighYmxvY2tfZ3JvdXApOworCisJcHJpbnRrKEtFUk5fSU5GTyAiYnRyZnMgcmVsb2NhdGluZyBibG9jayBncm91cCAlbGx1IGZsYWdzICVsbHVcbiIsCisJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpYmxvY2tfZ3JvdXAtPmtleS5vYmplY3RpZCwKKwkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylibG9ja19ncm91cC0+ZmxhZ3MpOworCisJcGF0aCA9IGJ0cmZzX2FsbG9jX3BhdGgoKTsKKwlCVUdfT04oIXBhdGgpOworCisJcmVsb2NfaW5vZGUgPSBjcmVhdGVfcmVsb2NfaW5vZGUoaW5mbywgYmxvY2tfZ3JvdXApOworCUJVR19PTihJU19FUlIocmVsb2NfaW5vZGUpKTsKKworCV9fYWxsb2NfY2h1bmtfZm9yX3Nocmluayhyb290LCBibG9ja19ncm91cCwgMSk7CisJc2V0X2Jsb2NrX2dyb3VwX3JlYWRvbmx5KGJsb2NrX2dyb3VwKTsKKworCWJ0cmZzX3N0YXJ0X2RlbGFsbG9jX2lub2RlcyhpbmZvLT50cmVlX3Jvb3QpOworCWJ0cmZzX3dhaXRfb3JkZXJlZF9leHRlbnRzKGluZm8tPnRyZWVfcm9vdCwgMCk7CithZ2FpbjoKKwlza2lwcGVkID0gMDsKKwl0b3RhbF9mb3VuZCA9IDA7CisJcHJvZ3Jlc3MgPSAwOworCWtleS5vYmplY3RpZCA9IGJsb2NrX2dyb3VwLT5rZXkub2JqZWN0aWQ7CisJa2V5Lm9mZnNldCA9IDA7CisJa2V5LnR5cGUgPSAwOworCWN1cl9ieXRlID0ga2V5Lm9iamVjdGlkOworCisJdHJhbnMgPSBidHJmc19zdGFydF90cmFuc2FjdGlvbihpbmZvLT50cmVlX3Jvb3QsIDEpOworCWJ0cmZzX2NvbW1pdF90cmFuc2FjdGlvbih0cmFucywgaW5mby0+dHJlZV9yb290KTsKKworCW11dGV4X2xvY2soJnJvb3QtPmZzX2luZm8tPmNsZWFuZXJfbXV0ZXgpOworCWJ0cmZzX2NsZWFuX29sZF9zbmFwc2hvdHMoaW5mby0+dHJlZV9yb290KTsKKwlidHJmc19yZW1vdmVfbGVhZl9yZWZzKGluZm8tPnRyZWVfcm9vdCwgKHU2NCktMSwgMSk7CisJbXV0ZXhfdW5sb2NrKCZyb290LT5mc19pbmZvLT5jbGVhbmVyX211dGV4KTsKKworCXdoaWxlICgxKSB7CisJCXJldCA9IGJ0cmZzX3NlYXJjaF9zbG90KE5VTEwsIHJvb3QsICZrZXksIHBhdGgsIDAsIDApOworCQlpZiAocmV0IDwgMCkKKwkJCWdvdG8gb3V0OworbmV4dDoKKwkJbGVhZiA9IHBhdGgtPm5vZGVzWzBdOworCQlucml0ZW1zID0gYnRyZnNfaGVhZGVyX25yaXRlbXMobGVhZik7CisJCWlmIChwYXRoLT5zbG90c1swXSA+PSBucml0ZW1zKSB7CisJCQlyZXQgPSBidHJmc19uZXh0X2xlYWYocm9vdCwgcGF0aCk7CisJCQlpZiAocmV0IDwgMCkKKwkJCQlnb3RvIG91dDsKKwkJCWlmIChyZXQgPT0gMSkgeworCQkJCXJldCA9IDA7CisJCQkJYnJlYWs7CisJCQl9CisJCQlsZWFmID0gcGF0aC0+bm9kZXNbMF07CisJCQlucml0ZW1zID0gYnRyZnNfaGVhZGVyX25yaXRlbXMobGVhZik7CisJCX0KKworCQlidHJmc19pdGVtX2tleV90b19jcHUobGVhZiwgJmtleSwgcGF0aC0+c2xvdHNbMF0pOworCisJCWlmIChrZXkub2JqZWN0aWQgPj0gYmxvY2tfZ3JvdXAtPmtleS5vYmplY3RpZCArCisJCSAgICBibG9ja19ncm91cC0+a2V5Lm9mZnNldCkKKwkJCWJyZWFrOworCisJCWlmIChwcm9ncmVzcyAmJiBuZWVkX3Jlc2NoZWQoKSkgeworCQkJYnRyZnNfcmVsZWFzZV9wYXRoKHJvb3QsIHBhdGgpOworCQkJY29uZF9yZXNjaGVkKCk7CisJCQlwcm9ncmVzcyA9IDA7CisJCQljb250aW51ZTsKKwkJfQorCQlwcm9ncmVzcyA9IDE7CisKKwkJaWYgKGJ0cmZzX2tleV90eXBlKCZrZXkpICE9IEJUUkZTX0VYVEVOVF9JVEVNX0tFWSB8fAorCQkgICAga2V5Lm9iamVjdGlkICsga2V5Lm9mZnNldCA8PSBjdXJfYnl0ZSkgeworCQkJcGF0aC0+c2xvdHNbMF0rKzsKKwkJCWdvdG8gbmV4dDsKKwkJfQorCisJCXRvdGFsX2ZvdW5kKys7CisJCWN1cl9ieXRlID0ga2V5Lm9iamVjdGlkICsga2V5Lm9mZnNldDsKKwkJYnRyZnNfcmVsZWFzZV9wYXRoKHJvb3QsIHBhdGgpOworCisJCV9fYWxsb2NfY2h1bmtfZm9yX3Nocmluayhyb290LCBibG9ja19ncm91cCwgMCk7CisJCXJldCA9IHJlbG9jYXRlX29uZV9leHRlbnQocm9vdCwgcGF0aCwgJmtleSwgYmxvY2tfZ3JvdXAsCisJCQkJCSAgcmVsb2NfaW5vZGUsIHBhc3MpOworCQlCVUdfT04ocmV0IDwgMCk7CisJCWlmIChyZXQgPiAwKQorCQkJc2tpcHBlZCsrOworCisJCWtleS5vYmplY3RpZCA9IGN1cl9ieXRlOworCQlrZXkudHlwZSA9IDA7CisJCWtleS5vZmZzZXQgPSAwOworCX0KKworCWJ0cmZzX3JlbGVhc2VfcGF0aChyb290LCBwYXRoKTsKKworCWlmIChwYXNzID09IDApIHsKKwkJYnRyZnNfd2FpdF9vcmRlcmVkX3JhbmdlKHJlbG9jX2lub2RlLCAwLCAodTY0KS0xKTsKKwkJaW52YWxpZGF0ZV9tYXBwaW5nX3BhZ2VzKHJlbG9jX2lub2RlLT5pX21hcHBpbmcsIDAsIC0xKTsKKwl9CisKKwlpZiAodG90YWxfZm91bmQgPiAwKSB7CisJCXByaW50ayhLRVJOX0lORk8gImJ0cmZzIGZvdW5kICVsbHUgZXh0ZW50cyBpbiBwYXNzICVkXG4iLAorCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyl0b3RhbF9mb3VuZCwgcGFzcyk7CisJCXBhc3MrKzsKKwkJaWYgKHRvdGFsX2ZvdW5kID09IHNraXBwZWQgJiYgcGFzcyA+IDIpIHsKKwkJCWlwdXQocmVsb2NfaW5vZGUpOworCQkJcmVsb2NfaW5vZGUgPSBjcmVhdGVfcmVsb2NfaW5vZGUoaW5mbywgYmxvY2tfZ3JvdXApOworCQkJcGFzcyA9IDA7CisJCX0KKwkJZ290byBhZ2FpbjsKKwl9CisKKwkvKiBkZWxldGUgcmVsb2NfaW5vZGUgKi8KKwlpcHV0KHJlbG9jX2lub2RlKTsKKworCS8qIHVucGluIGV4dGVudHMgaW4gdGhpcyByYW5nZSAqLworCXRyYW5zID0gYnRyZnNfc3RhcnRfdHJhbnNhY3Rpb24oaW5mby0+dHJlZV9yb290LCAxKTsKKwlidHJmc19jb21taXRfdHJhbnNhY3Rpb24odHJhbnMsIGluZm8tPnRyZWVfcm9vdCk7CisKKwlzcGluX2xvY2soJmJsb2NrX2dyb3VwLT5sb2NrKTsKKwlXQVJOX09OKGJsb2NrX2dyb3VwLT5waW5uZWQgPiAwKTsKKwlXQVJOX09OKGJsb2NrX2dyb3VwLT5yZXNlcnZlZCA+IDApOworCVdBUk5fT04oYnRyZnNfYmxvY2tfZ3JvdXBfdXNlZCgmYmxvY2tfZ3JvdXAtPml0ZW0pID4gMCk7CisJc3Bpbl91bmxvY2soJmJsb2NrX2dyb3VwLT5sb2NrKTsKKwlwdXRfYmxvY2tfZ3JvdXAoYmxvY2tfZ3JvdXApOworCXJldCA9IDA7CitvdXQ6CisJYnRyZnNfZnJlZV9wYXRoKHBhdGgpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZmluZF9maXJzdF9ibG9ja19ncm91cChzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwKKwkJc3RydWN0IGJ0cmZzX3BhdGggKnBhdGgsIHN0cnVjdCBidHJmc19rZXkgKmtleSkKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgYnRyZnNfa2V5IGZvdW5kX2tleTsKKwlzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqbGVhZjsKKwlpbnQgc2xvdDsKKworCXJldCA9IGJ0cmZzX3NlYXJjaF9zbG90KE5VTEwsIHJvb3QsIGtleSwgcGF0aCwgMCwgMCk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0OworCisJd2hpbGUgKDEpIHsKKwkJc2xvdCA9IHBhdGgtPnNsb3RzWzBdOworCQlsZWFmID0gcGF0aC0+bm9kZXNbMF07CisJCWlmIChzbG90ID49IGJ0cmZzX2hlYWRlcl9ucml0ZW1zKGxlYWYpKSB7CisJCQlyZXQgPSBidHJmc19uZXh0X2xlYWYocm9vdCwgcGF0aCk7CisJCQlpZiAocmV0ID09IDApCisJCQkJY29udGludWU7CisJCQlpZiAocmV0IDwgMCkKKwkJCQlnb3RvIG91dDsKKwkJCWJyZWFrOworCQl9CisJCWJ0cmZzX2l0ZW1fa2V5X3RvX2NwdShsZWFmLCAmZm91bmRfa2V5LCBzbG90KTsKKworCQlpZiAoZm91bmRfa2V5Lm9iamVjdGlkID49IGtleS0+b2JqZWN0aWQgJiYKKwkJICAgIGZvdW5kX2tleS50eXBlID09IEJUUkZTX0JMT0NLX0dST1VQX0lURU1fS0VZKSB7CisJCQlyZXQgPSAwOworCQkJZ290byBvdXQ7CisJCX0KKwkJcGF0aC0+c2xvdHNbMF0rKzsKKwl9CisJcmV0ID0gLUVOT0VOVDsKK291dDoKKwlyZXR1cm4gcmV0OworfQorCitpbnQgYnRyZnNfZnJlZV9ibG9ja19ncm91cHMoc3RydWN0IGJ0cmZzX2ZzX2luZm8gKmluZm8pCit7CisJc3RydWN0IGJ0cmZzX2Jsb2NrX2dyb3VwX2NhY2hlICpibG9ja19ncm91cDsKKwlzdHJ1Y3QgcmJfbm9kZSAqbjsKKworCXNwaW5fbG9jaygmaW5mby0+YmxvY2tfZ3JvdXBfY2FjaGVfbG9jayk7CisJd2hpbGUgKChuID0gcmJfbGFzdCgmaW5mby0+YmxvY2tfZ3JvdXBfY2FjaGVfdHJlZSkpICE9IE5VTEwpIHsKKwkJYmxvY2tfZ3JvdXAgPSByYl9lbnRyeShuLCBzdHJ1Y3QgYnRyZnNfYmxvY2tfZ3JvdXBfY2FjaGUsCisJCQkJICAgICAgIGNhY2hlX25vZGUpOworCQlyYl9lcmFzZSgmYmxvY2tfZ3JvdXAtPmNhY2hlX25vZGUsCisJCQkgJmluZm8tPmJsb2NrX2dyb3VwX2NhY2hlX3RyZWUpOworCQlzcGluX3VubG9jaygmaW5mby0+YmxvY2tfZ3JvdXBfY2FjaGVfbG9jayk7CisKKwkJYnRyZnNfcmVtb3ZlX2ZyZWVfc3BhY2VfY2FjaGUoYmxvY2tfZ3JvdXApOworCQlkb3duX3dyaXRlKCZibG9ja19ncm91cC0+c3BhY2VfaW5mby0+Z3JvdXBzX3NlbSk7CisJCWxpc3RfZGVsKCZibG9ja19ncm91cC0+bGlzdCk7CisJCXVwX3dyaXRlKCZibG9ja19ncm91cC0+c3BhY2VfaW5mby0+Z3JvdXBzX3NlbSk7CisKKwkJV0FSTl9PTihhdG9taWNfcmVhZCgmYmxvY2tfZ3JvdXAtPmNvdW50KSAhPSAxKTsKKwkJa2ZyZWUoYmxvY2tfZ3JvdXApOworCisJCXNwaW5fbG9jaygmaW5mby0+YmxvY2tfZ3JvdXBfY2FjaGVfbG9jayk7CisJfQorCXNwaW5fdW5sb2NrKCZpbmZvLT5ibG9ja19ncm91cF9jYWNoZV9sb2NrKTsKKwlyZXR1cm4gMDsKK30KKworaW50IGJ0cmZzX3JlYWRfYmxvY2tfZ3JvdXBzKHN0cnVjdCBidHJmc19yb290ICpyb290KQoreworCXN0cnVjdCBidHJmc19wYXRoICpwYXRoOworCWludCByZXQ7CisJc3RydWN0IGJ0cmZzX2Jsb2NrX2dyb3VwX2NhY2hlICpjYWNoZTsKKwlzdHJ1Y3QgYnRyZnNfZnNfaW5mbyAqaW5mbyA9IHJvb3QtPmZzX2luZm87CisJc3RydWN0IGJ0cmZzX3NwYWNlX2luZm8gKnNwYWNlX2luZm87CisJc3RydWN0IGJ0cmZzX2tleSBrZXk7CisJc3RydWN0IGJ0cmZzX2tleSBmb3VuZF9rZXk7CisJc3RydWN0IGV4dGVudF9idWZmZXIgKmxlYWY7CisKKwlyb290ID0gaW5mby0+ZXh0ZW50X3Jvb3Q7CisJa2V5Lm9iamVjdGlkID0gMDsKKwlrZXkub2Zmc2V0ID0gMDsKKwlidHJmc19zZXRfa2V5X3R5cGUoJmtleSwgQlRSRlNfQkxPQ0tfR1JPVVBfSVRFTV9LRVkpOworCXBhdGggPSBidHJmc19hbGxvY19wYXRoKCk7CisJaWYgKCFwYXRoKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXdoaWxlICgxKSB7CisJCXJldCA9IGZpbmRfZmlyc3RfYmxvY2tfZ3JvdXAocm9vdCwgcGF0aCwgJmtleSk7CisJCWlmIChyZXQgPiAwKSB7CisJCQlyZXQgPSAwOworCQkJZ290byBlcnJvcjsKKwkJfQorCQlpZiAocmV0ICE9IDApCisJCQlnb3RvIGVycm9yOworCisJCWxlYWYgPSBwYXRoLT5ub2Rlc1swXTsKKwkJYnRyZnNfaXRlbV9rZXlfdG9fY3B1KGxlYWYsICZmb3VuZF9rZXksIHBhdGgtPnNsb3RzWzBdKTsKKwkJY2FjaGUgPSBremFsbG9jKHNpemVvZigqY2FjaGUpLCBHRlBfTk9GUyk7CisJCWlmICghY2FjaGUpIHsKKwkJCXJldCA9IC1FTk9NRU07CisJCQlicmVhazsKKwkJfQorCisJCWF0b21pY19zZXQoJmNhY2hlLT5jb3VudCwgMSk7CisJCXNwaW5fbG9ja19pbml0KCZjYWNoZS0+bG9jayk7CisJCW11dGV4X2luaXQoJmNhY2hlLT5hbGxvY19tdXRleCk7CisJCW11dGV4X2luaXQoJmNhY2hlLT5jYWNoZV9tdXRleCk7CisJCUlOSVRfTElTVF9IRUFEKCZjYWNoZS0+bGlzdCk7CisJCXJlYWRfZXh0ZW50X2J1ZmZlcihsZWFmLCAmY2FjaGUtPml0ZW0sCisJCQkJICAgYnRyZnNfaXRlbV9wdHJfb2Zmc2V0KGxlYWYsIHBhdGgtPnNsb3RzWzBdKSwKKwkJCQkgICBzaXplb2YoY2FjaGUtPml0ZW0pKTsKKwkJbWVtY3B5KCZjYWNoZS0+a2V5LCAmZm91bmRfa2V5LCBzaXplb2YoZm91bmRfa2V5KSk7CisKKwkJa2V5Lm9iamVjdGlkID0gZm91bmRfa2V5Lm9iamVjdGlkICsgZm91bmRfa2V5Lm9mZnNldDsKKwkJYnRyZnNfcmVsZWFzZV9wYXRoKHJvb3QsIHBhdGgpOworCQljYWNoZS0+ZmxhZ3MgPSBidHJmc19ibG9ja19ncm91cF9mbGFncygmY2FjaGUtPml0ZW0pOworCisJCXJldCA9IHVwZGF0ZV9zcGFjZV9pbmZvKGluZm8sIGNhY2hlLT5mbGFncywgZm91bmRfa2V5Lm9mZnNldCwKKwkJCQkJYnRyZnNfYmxvY2tfZ3JvdXBfdXNlZCgmY2FjaGUtPml0ZW0pLAorCQkJCQkmc3BhY2VfaW5mbyk7CisJCUJVR19PTihyZXQpOworCQljYWNoZS0+c3BhY2VfaW5mbyA9IHNwYWNlX2luZm87CisJCWRvd25fd3JpdGUoJnNwYWNlX2luZm8tPmdyb3Vwc19zZW0pOworCQlsaXN0X2FkZF90YWlsKCZjYWNoZS0+bGlzdCwgJnNwYWNlX2luZm8tPmJsb2NrX2dyb3Vwcyk7CisJCXVwX3dyaXRlKCZzcGFjZV9pbmZvLT5ncm91cHNfc2VtKTsKKworCQlyZXQgPSBidHJmc19hZGRfYmxvY2tfZ3JvdXBfY2FjaGUocm9vdC0+ZnNfaW5mbywgY2FjaGUpOworCQlCVUdfT04ocmV0KTsKKworCQlzZXRfYXZhaWxfYWxsb2NfYml0cyhyb290LT5mc19pbmZvLCBjYWNoZS0+ZmxhZ3MpOworCQlpZiAoYnRyZnNfY2h1bmtfcmVhZG9ubHkocm9vdCwgY2FjaGUtPmtleS5vYmplY3RpZCkpCisJCQlzZXRfYmxvY2tfZ3JvdXBfcmVhZG9ubHkoY2FjaGUpOworCX0KKwlyZXQgPSAwOworZXJyb3I6CisJYnRyZnNfZnJlZV9wYXRoKHBhdGgpOworCXJldHVybiByZXQ7Cit9CisKK2ludCBidHJmc19tYWtlX2Jsb2NrX2dyb3VwKHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAorCQkJICAgc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsIHU2NCBieXRlc191c2VkLAorCQkJICAgdTY0IHR5cGUsIHU2NCBjaHVua19vYmplY3RpZCwgdTY0IGNodW5rX29mZnNldCwKKwkJCSAgIHU2NCBzaXplKQoreworCWludCByZXQ7CisJc3RydWN0IGJ0cmZzX3Jvb3QgKmV4dGVudF9yb290OworCXN0cnVjdCBidHJmc19ibG9ja19ncm91cF9jYWNoZSAqY2FjaGU7CisKKwlleHRlbnRfcm9vdCA9IHJvb3QtPmZzX2luZm8tPmV4dGVudF9yb290OworCisJcm9vdC0+ZnNfaW5mby0+bGFzdF90cmFuc19uZXdfYmxvY2tncm91cCA9IHRyYW5zLT50cmFuc2lkOworCisJY2FjaGUgPSBremFsbG9jKHNpemVvZigqY2FjaGUpLCBHRlBfTk9GUyk7CisJaWYgKCFjYWNoZSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwljYWNoZS0+a2V5Lm9iamVjdGlkID0gY2h1bmtfb2Zmc2V0OworCWNhY2hlLT5rZXkub2Zmc2V0ID0gc2l6ZTsKKwljYWNoZS0+a2V5LnR5cGUgPSBCVFJGU19CTE9DS19HUk9VUF9JVEVNX0tFWTsKKwlhdG9taWNfc2V0KCZjYWNoZS0+Y291bnQsIDEpOworCXNwaW5fbG9ja19pbml0KCZjYWNoZS0+bG9jayk7CisJbXV0ZXhfaW5pdCgmY2FjaGUtPmFsbG9jX211dGV4KTsKKwltdXRleF9pbml0KCZjYWNoZS0+Y2FjaGVfbXV0ZXgpOworCUlOSVRfTElTVF9IRUFEKCZjYWNoZS0+bGlzdCk7CisKKwlidHJmc19zZXRfYmxvY2tfZ3JvdXBfdXNlZCgmY2FjaGUtPml0ZW0sIGJ5dGVzX3VzZWQpOworCWJ0cmZzX3NldF9ibG9ja19ncm91cF9jaHVua19vYmplY3RpZCgmY2FjaGUtPml0ZW0sIGNodW5rX29iamVjdGlkKTsKKwljYWNoZS0+ZmxhZ3MgPSB0eXBlOworCWJ0cmZzX3NldF9ibG9ja19ncm91cF9mbGFncygmY2FjaGUtPml0ZW0sIHR5cGUpOworCisJcmV0ID0gdXBkYXRlX3NwYWNlX2luZm8ocm9vdC0+ZnNfaW5mbywgY2FjaGUtPmZsYWdzLCBzaXplLCBieXRlc191c2VkLAorCQkJCSZjYWNoZS0+c3BhY2VfaW5mbyk7CisJQlVHX09OKHJldCk7CisJZG93bl93cml0ZSgmY2FjaGUtPnNwYWNlX2luZm8tPmdyb3Vwc19zZW0pOworCWxpc3RfYWRkX3RhaWwoJmNhY2hlLT5saXN0LCAmY2FjaGUtPnNwYWNlX2luZm8tPmJsb2NrX2dyb3Vwcyk7CisJdXBfd3JpdGUoJmNhY2hlLT5zcGFjZV9pbmZvLT5ncm91cHNfc2VtKTsKKworCXJldCA9IGJ0cmZzX2FkZF9ibG9ja19ncm91cF9jYWNoZShyb290LT5mc19pbmZvLCBjYWNoZSk7CisJQlVHX09OKHJldCk7CisKKwlyZXQgPSBidHJmc19pbnNlcnRfaXRlbSh0cmFucywgZXh0ZW50X3Jvb3QsICZjYWNoZS0+a2V5LCAmY2FjaGUtPml0ZW0sCisJCQkJc2l6ZW9mKGNhY2hlLT5pdGVtKSk7CisJQlVHX09OKHJldCk7CisKKwlmaW5pc2hfY3VycmVudF9pbnNlcnQodHJhbnMsIGV4dGVudF9yb290LCAwKTsKKwlyZXQgPSBkZWxfcGVuZGluZ19leHRlbnRzKHRyYW5zLCBleHRlbnRfcm9vdCwgMCk7CisJQlVHX09OKHJldCk7CisJc2V0X2F2YWlsX2FsbG9jX2JpdHMoZXh0ZW50X3Jvb3QtPmZzX2luZm8sIHR5cGUpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBidHJmc19yZW1vdmVfYmxvY2tfZ3JvdXAoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCisJCQkgICAgIHN0cnVjdCBidHJmc19yb290ICpyb290LCB1NjQgZ3JvdXBfc3RhcnQpCit7CisJc3RydWN0IGJ0cmZzX3BhdGggKnBhdGg7CisJc3RydWN0IGJ0cmZzX2Jsb2NrX2dyb3VwX2NhY2hlICpibG9ja19ncm91cDsKKwlzdHJ1Y3QgYnRyZnNfa2V5IGtleTsKKwlpbnQgcmV0OworCisJcm9vdCA9IHJvb3QtPmZzX2luZm8tPmV4dGVudF9yb290OworCisJYmxvY2tfZ3JvdXAgPSBidHJmc19sb29rdXBfYmxvY2tfZ3JvdXAocm9vdC0+ZnNfaW5mbywgZ3JvdXBfc3RhcnQpOworCUJVR19PTighYmxvY2tfZ3JvdXApOworCUJVR19PTighYmxvY2tfZ3JvdXAtPnJvKTsKKworCW1lbWNweSgma2V5LCAmYmxvY2tfZ3JvdXAtPmtleSwgc2l6ZW9mKGtleSkpOworCisJcGF0aCA9IGJ0cmZzX2FsbG9jX3BhdGgoKTsKKwlCVUdfT04oIXBhdGgpOworCisJYnRyZnNfcmVtb3ZlX2ZyZWVfc3BhY2VfY2FjaGUoYmxvY2tfZ3JvdXApOworCXJiX2VyYXNlKCZibG9ja19ncm91cC0+Y2FjaGVfbm9kZSwKKwkJICZyb290LT5mc19pbmZvLT5ibG9ja19ncm91cF9jYWNoZV90cmVlKTsKKwlkb3duX3dyaXRlKCZibG9ja19ncm91cC0+c3BhY2VfaW5mby0+Z3JvdXBzX3NlbSk7CisJbGlzdF9kZWwoJmJsb2NrX2dyb3VwLT5saXN0KTsKKwl1cF93cml0ZSgmYmxvY2tfZ3JvdXAtPnNwYWNlX2luZm8tPmdyb3Vwc19zZW0pOworCisJc3Bpbl9sb2NrKCZibG9ja19ncm91cC0+c3BhY2VfaW5mby0+bG9jayk7CisJYmxvY2tfZ3JvdXAtPnNwYWNlX2luZm8tPnRvdGFsX2J5dGVzIC09IGJsb2NrX2dyb3VwLT5rZXkub2Zmc2V0OworCWJsb2NrX2dyb3VwLT5zcGFjZV9pbmZvLT5ieXRlc19yZWFkb25seSAtPSBibG9ja19ncm91cC0+a2V5Lm9mZnNldDsKKwlzcGluX3VubG9jaygmYmxvY2tfZ3JvdXAtPnNwYWNlX2luZm8tPmxvY2spOworCWJsb2NrX2dyb3VwLT5zcGFjZV9pbmZvLT5mdWxsID0gMDsKKworCXB1dF9ibG9ja19ncm91cChibG9ja19ncm91cCk7CisJcHV0X2Jsb2NrX2dyb3VwKGJsb2NrX2dyb3VwKTsKKworCXJldCA9IGJ0cmZzX3NlYXJjaF9zbG90KHRyYW5zLCByb290LCAma2V5LCBwYXRoLCAtMSwgMSk7CisJaWYgKHJldCA+IDApCisJCXJldCA9IC1FSU87CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0OworCisJcmV0ID0gYnRyZnNfZGVsX2l0ZW0odHJhbnMsIHJvb3QsIHBhdGgpOworb3V0OgorCWJ0cmZzX2ZyZWVfcGF0aChwYXRoKTsKKwlyZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvZnMvYnRyZnMvZXh0ZW50X2lvLmMgYi9mcy9idHJmcy9leHRlbnRfaW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDg2ZDQwCi0tLSAvZGV2L251bGwKKysrIGIvZnMvYnRyZnMvZXh0ZW50X2lvLmMKQEAgLTAsMCArMSwzNzE3IEBACisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2Jpby5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvZ2ZwLmg+CisjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L3BhZ2UtZmxhZ3MuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L3N3YXAuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvd3JpdGViYWNrLmg+CisjaW5jbHVkZSA8bGludXgvcGFnZXZlYy5oPgorI2luY2x1ZGUgImV4dGVudF9pby5oIgorI2luY2x1ZGUgImV4dGVudF9tYXAuaCIKKyNpbmNsdWRlICJjb21wYXQuaCIKKyNpbmNsdWRlICJjdHJlZS5oIgorI2luY2x1ZGUgImJ0cmZzX2lub2RlLmgiCisKKy8qIHRlbXBvcmFyeSBkZWZpbmUgdW50aWwgZXh0ZW50X21hcCBtb3ZlcyBvdXQgb2YgYnRyZnMgKi8KK3N0cnVjdCBrbWVtX2NhY2hlICpidHJmc19jYWNoZV9jcmVhdGUoY29uc3QgY2hhciAqbmFtZSwgc2l6ZV90IHNpemUsCisJCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgZXh0cmFfZmxhZ3MsCisJCQkJICAgICAgIHZvaWQgKCpjdG9yKSh2b2lkICosIHN0cnVjdCBrbWVtX2NhY2hlICosCisJCQkJCQkgICAgdW5zaWduZWQgbG9uZykpOworCitzdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKmV4dGVudF9zdGF0ZV9jYWNoZTsKK3N0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqZXh0ZW50X2J1ZmZlcl9jYWNoZTsKKworc3RhdGljIExJU1RfSEVBRChidWZmZXJzKTsKK3N0YXRpYyBMSVNUX0hFQUQoc3RhdGVzKTsKKworI2RlZmluZSBMRUFLX0RFQlVHIDAKKyNpZmRlZiBMRUFLX0RFQlVHCitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGxlYWtfbG9jayk7CisjZW5kaWYKKworI2RlZmluZSBCVUZGRVJfTFJVX01BWCA2NAorCitzdHJ1Y3QgdHJlZV9lbnRyeSB7CisJdTY0IHN0YXJ0OworCXU2NCBlbmQ7CisJc3RydWN0IHJiX25vZGUgcmJfbm9kZTsKK307CisKK3N0cnVjdCBleHRlbnRfcGFnZV9kYXRhIHsKKwlzdHJ1Y3QgYmlvICpiaW87CisJc3RydWN0IGV4dGVudF9pb190cmVlICp0cmVlOworCWdldF9leHRlbnRfdCAqZ2V0X2V4dGVudDsKKworCS8qIHRlbGxzIHdyaXRlcGFnZSBub3QgdG8gbG9jayB0aGUgc3RhdGUgYml0cyBmb3IgdGhpcyByYW5nZQorCSAqIGl0IHN0aWxsIGRvZXMgdGhlIHVubG9ja2luZworCSAqLworCWludCBleHRlbnRfbG9ja2VkOworfTsKKworaW50IF9faW5pdCBleHRlbnRfaW9faW5pdCh2b2lkKQoreworCWV4dGVudF9zdGF0ZV9jYWNoZSA9IGJ0cmZzX2NhY2hlX2NyZWF0ZSgiZXh0ZW50X3N0YXRlIiwKKwkJCQkJICAgIHNpemVvZihzdHJ1Y3QgZXh0ZW50X3N0YXRlKSwgMCwKKwkJCQkJICAgIE5VTEwpOworCWlmICghZXh0ZW50X3N0YXRlX2NhY2hlKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWV4dGVudF9idWZmZXJfY2FjaGUgPSBidHJmc19jYWNoZV9jcmVhdGUoImV4dGVudF9idWZmZXJzIiwKKwkJCQkJICAgIHNpemVvZihzdHJ1Y3QgZXh0ZW50X2J1ZmZlciksIDAsCisJCQkJCSAgICBOVUxMKTsKKwlpZiAoIWV4dGVudF9idWZmZXJfY2FjaGUpCisJCWdvdG8gZnJlZV9zdGF0ZV9jYWNoZTsKKwlyZXR1cm4gMDsKKworZnJlZV9zdGF0ZV9jYWNoZToKKwlrbWVtX2NhY2hlX2Rlc3Ryb3koZXh0ZW50X3N0YXRlX2NhY2hlKTsKKwlyZXR1cm4gLUVOT01FTTsKK30KKwordm9pZCBleHRlbnRfaW9fZXhpdCh2b2lkKQoreworCXN0cnVjdCBleHRlbnRfc3RhdGUgKnN0YXRlOworCXN0cnVjdCBleHRlbnRfYnVmZmVyICplYjsKKworCXdoaWxlICghbGlzdF9lbXB0eSgmc3RhdGVzKSkgeworCQlzdGF0ZSA9IGxpc3RfZW50cnkoc3RhdGVzLm5leHQsIHN0cnVjdCBleHRlbnRfc3RhdGUsIGxlYWtfbGlzdCk7CisJCXByaW50ayhLRVJOX0VSUiAiYnRyZnMgc3RhdGUgbGVhazogc3RhcnQgJWxsdSBlbmQgJWxsdSAiCisJCSAgICAgICAic3RhdGUgJWx1IGluIHRyZWUgJXAgcmVmcyAlZFxuIiwKKwkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpc3RhdGUtPnN0YXJ0LAorCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylzdGF0ZS0+ZW5kLAorCQkgICAgICAgc3RhdGUtPnN0YXRlLCBzdGF0ZS0+dHJlZSwgYXRvbWljX3JlYWQoJnN0YXRlLT5yZWZzKSk7CisJCWxpc3RfZGVsKCZzdGF0ZS0+bGVha19saXN0KTsKKwkJa21lbV9jYWNoZV9mcmVlKGV4dGVudF9zdGF0ZV9jYWNoZSwgc3RhdGUpOworCisJfQorCisJd2hpbGUgKCFsaXN0X2VtcHR5KCZidWZmZXJzKSkgeworCQllYiA9IGxpc3RfZW50cnkoYnVmZmVycy5uZXh0LCBzdHJ1Y3QgZXh0ZW50X2J1ZmZlciwgbGVha19saXN0KTsKKwkJcHJpbnRrKEtFUk5fRVJSICJidHJmcyBidWZmZXIgbGVhayBzdGFydCAlbGx1IGxlbiAlbHUgIgorCQkgICAgICAgInJlZnMgJWRcbiIsICh1bnNpZ25lZCBsb25nIGxvbmcpZWItPnN0YXJ0LAorCQkgICAgICAgZWItPmxlbiwgYXRvbWljX3JlYWQoJmViLT5yZWZzKSk7CisJCWxpc3RfZGVsKCZlYi0+bGVha19saXN0KTsKKwkJa21lbV9jYWNoZV9mcmVlKGV4dGVudF9idWZmZXJfY2FjaGUsIGViKTsKKwl9CisJaWYgKGV4dGVudF9zdGF0ZV9jYWNoZSkKKwkJa21lbV9jYWNoZV9kZXN0cm95KGV4dGVudF9zdGF0ZV9jYWNoZSk7CisJaWYgKGV4dGVudF9idWZmZXJfY2FjaGUpCisJCWttZW1fY2FjaGVfZGVzdHJveShleHRlbnRfYnVmZmVyX2NhY2hlKTsKK30KKwordm9pZCBleHRlbnRfaW9fdHJlZV9pbml0KHN0cnVjdCBleHRlbnRfaW9fdHJlZSAqdHJlZSwKKwkJCSAgc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsIGdmcF90IG1hc2spCit7CisJdHJlZS0+c3RhdGUucmJfbm9kZSA9IE5VTEw7CisJdHJlZS0+YnVmZmVyLnJiX25vZGUgPSBOVUxMOworCXRyZWUtPm9wcyA9IE5VTEw7CisJdHJlZS0+ZGlydHlfYnl0ZXMgPSAwOworCXNwaW5fbG9ja19pbml0KCZ0cmVlLT5sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmdHJlZS0+YnVmZmVyX2xvY2spOworCXRyZWUtPm1hcHBpbmcgPSBtYXBwaW5nOworfQorCitzdGF0aWMgc3RydWN0IGV4dGVudF9zdGF0ZSAqYWxsb2NfZXh0ZW50X3N0YXRlKGdmcF90IG1hc2spCit7CisJc3RydWN0IGV4dGVudF9zdGF0ZSAqc3RhdGU7CisjaWZkZWYgTEVBS19ERUJVRworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisjZW5kaWYKKworCXN0YXRlID0ga21lbV9jYWNoZV9hbGxvYyhleHRlbnRfc3RhdGVfY2FjaGUsIG1hc2spOworCWlmICghc3RhdGUpCisJCXJldHVybiBzdGF0ZTsKKwlzdGF0ZS0+c3RhdGUgPSAwOworCXN0YXRlLT5wcml2YXRlID0gMDsKKwlzdGF0ZS0+dHJlZSA9IE5VTEw7CisjaWZkZWYgTEVBS19ERUJVRworCXNwaW5fbG9ja19pcnFzYXZlKCZsZWFrX2xvY2ssIGZsYWdzKTsKKwlsaXN0X2FkZCgmc3RhdGUtPmxlYWtfbGlzdCwgJnN0YXRlcyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbGVha19sb2NrLCBmbGFncyk7CisjZW5kaWYKKwlhdG9taWNfc2V0KCZzdGF0ZS0+cmVmcywgMSk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmc3RhdGUtPndxKTsKKwlyZXR1cm4gc3RhdGU7Cit9CisKK3N0YXRpYyB2b2lkIGZyZWVfZXh0ZW50X3N0YXRlKHN0cnVjdCBleHRlbnRfc3RhdGUgKnN0YXRlKQoreworCWlmICghc3RhdGUpCisJCXJldHVybjsKKwlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmc3RhdGUtPnJlZnMpKSB7CisjaWZkZWYgTEVBS19ERUJVRworCQl1bnNpZ25lZCBsb25nIGZsYWdzOworI2VuZGlmCisJCVdBUk5fT04oc3RhdGUtPnRyZWUpOworI2lmZGVmIExFQUtfREVCVUcKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmxlYWtfbG9jaywgZmxhZ3MpOworCQlsaXN0X2RlbCgmc3RhdGUtPmxlYWtfbGlzdCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxlYWtfbG9jaywgZmxhZ3MpOworI2VuZGlmCisJCWttZW1fY2FjaGVfZnJlZShleHRlbnRfc3RhdGVfY2FjaGUsIHN0YXRlKTsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcmJfbm9kZSAqdHJlZV9pbnNlcnQoc3RydWN0IHJiX3Jvb3QgKnJvb3QsIHU2NCBvZmZzZXQsCisJCQkJICAgc3RydWN0IHJiX25vZGUgKm5vZGUpCit7CisJc3RydWN0IHJiX25vZGUgKipwID0gJnJvb3QtPnJiX25vZGU7CisJc3RydWN0IHJiX25vZGUgKnBhcmVudCA9IE5VTEw7CisJc3RydWN0IHRyZWVfZW50cnkgKmVudHJ5OworCisJd2hpbGUgKCpwKSB7CisJCXBhcmVudCA9ICpwOworCQllbnRyeSA9IHJiX2VudHJ5KHBhcmVudCwgc3RydWN0IHRyZWVfZW50cnksIHJiX25vZGUpOworCisJCWlmIChvZmZzZXQgPCBlbnRyeS0+c3RhcnQpCisJCQlwID0gJigqcCktPnJiX2xlZnQ7CisJCWVsc2UgaWYgKG9mZnNldCA+IGVudHJ5LT5lbmQpCisJCQlwID0gJigqcCktPnJiX3JpZ2h0OworCQllbHNlCisJCQlyZXR1cm4gcGFyZW50OworCX0KKworCWVudHJ5ID0gcmJfZW50cnkobm9kZSwgc3RydWN0IHRyZWVfZW50cnksIHJiX25vZGUpOworCXJiX2xpbmtfbm9kZShub2RlLCBwYXJlbnQsIHApOworCXJiX2luc2VydF9jb2xvcihub2RlLCByb290KTsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHN0cnVjdCByYl9ub2RlICpfX2V0cmVlX3NlYXJjaChzdHJ1Y3QgZXh0ZW50X2lvX3RyZWUgKnRyZWUsIHU2NCBvZmZzZXQsCisJCQkJICAgICBzdHJ1Y3QgcmJfbm9kZSAqKnByZXZfcmV0LAorCQkJCSAgICAgc3RydWN0IHJiX25vZGUgKipuZXh0X3JldCkKK3sKKwlzdHJ1Y3QgcmJfcm9vdCAqcm9vdCA9ICZ0cmVlLT5zdGF0ZTsKKwlzdHJ1Y3QgcmJfbm9kZSAqbiA9IHJvb3QtPnJiX25vZGU7CisJc3RydWN0IHJiX25vZGUgKnByZXYgPSBOVUxMOworCXN0cnVjdCByYl9ub2RlICpvcmlnX3ByZXYgPSBOVUxMOworCXN0cnVjdCB0cmVlX2VudHJ5ICplbnRyeTsKKwlzdHJ1Y3QgdHJlZV9lbnRyeSAqcHJldl9lbnRyeSA9IE5VTEw7CisKKwl3aGlsZSAobikgeworCQllbnRyeSA9IHJiX2VudHJ5KG4sIHN0cnVjdCB0cmVlX2VudHJ5LCByYl9ub2RlKTsKKwkJcHJldiA9IG47CisJCXByZXZfZW50cnkgPSBlbnRyeTsKKworCQlpZiAob2Zmc2V0IDwgZW50cnktPnN0YXJ0KQorCQkJbiA9IG4tPnJiX2xlZnQ7CisJCWVsc2UgaWYgKG9mZnNldCA+IGVudHJ5LT5lbmQpCisJCQluID0gbi0+cmJfcmlnaHQ7CisJCWVsc2UKKwkJCXJldHVybiBuOworCX0KKworCWlmIChwcmV2X3JldCkgeworCQlvcmlnX3ByZXYgPSBwcmV2OworCQl3aGlsZSAocHJldiAmJiBvZmZzZXQgPiBwcmV2X2VudHJ5LT5lbmQpIHsKKwkJCXByZXYgPSByYl9uZXh0KHByZXYpOworCQkJcHJldl9lbnRyeSA9IHJiX2VudHJ5KHByZXYsIHN0cnVjdCB0cmVlX2VudHJ5LCByYl9ub2RlKTsKKwkJfQorCQkqcHJldl9yZXQgPSBwcmV2OworCQlwcmV2ID0gb3JpZ19wcmV2OworCX0KKworCWlmIChuZXh0X3JldCkgeworCQlwcmV2X2VudHJ5ID0gcmJfZW50cnkocHJldiwgc3RydWN0IHRyZWVfZW50cnksIHJiX25vZGUpOworCQl3aGlsZSAocHJldiAmJiBvZmZzZXQgPCBwcmV2X2VudHJ5LT5zdGFydCkgeworCQkJcHJldiA9IHJiX3ByZXYocHJldik7CisJCQlwcmV2X2VudHJ5ID0gcmJfZW50cnkocHJldiwgc3RydWN0IHRyZWVfZW50cnksIHJiX25vZGUpOworCQl9CisJCSpuZXh0X3JldCA9IHByZXY7CisJfQorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCByYl9ub2RlICp0cmVlX3NlYXJjaChzdHJ1Y3QgZXh0ZW50X2lvX3RyZWUgKnRyZWUsCisJCQkJCSAgdTY0IG9mZnNldCkKK3sKKwlzdHJ1Y3QgcmJfbm9kZSAqcHJldiA9IE5VTEw7CisJc3RydWN0IHJiX25vZGUgKnJldDsKKworCXJldCA9IF9fZXRyZWVfc2VhcmNoKHRyZWUsIG9mZnNldCwgJnByZXYsIE5VTEwpOworCWlmICghcmV0KQorCQlyZXR1cm4gcHJldjsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3RydWN0IGV4dGVudF9idWZmZXIgKmJ1ZmZlcl90cmVlX2luc2VydChzdHJ1Y3QgZXh0ZW50X2lvX3RyZWUgKnRyZWUsCisJCQkJCSAgdTY0IG9mZnNldCwgc3RydWN0IHJiX25vZGUgKm5vZGUpCit7CisJc3RydWN0IHJiX3Jvb3QgKnJvb3QgPSAmdHJlZS0+YnVmZmVyOworCXN0cnVjdCByYl9ub2RlICoqcCA9ICZyb290LT5yYl9ub2RlOworCXN0cnVjdCByYl9ub2RlICpwYXJlbnQgPSBOVUxMOworCXN0cnVjdCBleHRlbnRfYnVmZmVyICplYjsKKworCXdoaWxlICgqcCkgeworCQlwYXJlbnQgPSAqcDsKKwkJZWIgPSByYl9lbnRyeShwYXJlbnQsIHN0cnVjdCBleHRlbnRfYnVmZmVyLCByYl9ub2RlKTsKKworCQlpZiAob2Zmc2V0IDwgZWItPnN0YXJ0KQorCQkJcCA9ICYoKnApLT5yYl9sZWZ0OworCQllbHNlIGlmIChvZmZzZXQgPiBlYi0+c3RhcnQpCisJCQlwID0gJigqcCktPnJiX3JpZ2h0OworCQllbHNlCisJCQlyZXR1cm4gZWI7CisJfQorCisJcmJfbGlua19ub2RlKG5vZGUsIHBhcmVudCwgcCk7CisJcmJfaW5zZXJ0X2NvbG9yKG5vZGUsIHJvb3QpOworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgc3RydWN0IGV4dGVudF9idWZmZXIgKmJ1ZmZlcl9zZWFyY2goc3RydWN0IGV4dGVudF9pb190cmVlICp0cmVlLAorCQkJCQkgICB1NjQgb2Zmc2V0KQoreworCXN0cnVjdCByYl9yb290ICpyb290ID0gJnRyZWUtPmJ1ZmZlcjsKKwlzdHJ1Y3QgcmJfbm9kZSAqbiA9IHJvb3QtPnJiX25vZGU7CisJc3RydWN0IGV4dGVudF9idWZmZXIgKmViOworCisJd2hpbGUgKG4pIHsKKwkJZWIgPSByYl9lbnRyeShuLCBzdHJ1Y3QgZXh0ZW50X2J1ZmZlciwgcmJfbm9kZSk7CisJCWlmIChvZmZzZXQgPCBlYi0+c3RhcnQpCisJCQluID0gbi0+cmJfbGVmdDsKKwkJZWxzZSBpZiAob2Zmc2V0ID4gZWItPnN0YXJ0KQorCQkJbiA9IG4tPnJiX3JpZ2h0OworCQllbHNlCisJCQlyZXR1cm4gZWI7CisJfQorCXJldHVybiBOVUxMOworfQorCisvKgorICogdXRpbGl0eSBmdW5jdGlvbiB0byBsb29rIGZvciBtZXJnZSBjYW5kaWRhdGVzIGluc2lkZSBhIGdpdmVuIHJhbmdlLgorICogQW55IGV4dGVudHMgd2l0aCBtYXRjaGluZyBzdGF0ZSBhcmUgbWVyZ2VkIHRvZ2V0aGVyIGludG8gYSBzaW5nbGUKKyAqIGV4dGVudCBpbiB0aGUgdHJlZS4gIEV4dGVudHMgd2l0aCBFWFRFTlRfSU8gaW4gdGhlaXIgc3RhdGUgZmllbGQKKyAqIGFyZSBub3QgbWVyZ2VkIGJlY2F1c2UgdGhlIGVuZF9pbyBoYW5kbGVycyBuZWVkIHRvIGJlIGFibGUgdG8gZG8KKyAqIG9wZXJhdGlvbnMgb24gdGhlbSB3aXRob3V0IHNsZWVwaW5nIChvciBkb2luZyBhbGxvY2F0aW9ucy9zcGxpdHMpLgorICoKKyAqIFRoaXMgc2hvdWxkIGJlIGNhbGxlZCB3aXRoIHRoZSB0cmVlIGxvY2sgaGVsZC4KKyAqLworc3RhdGljIGludCBtZXJnZV9zdGF0ZShzdHJ1Y3QgZXh0ZW50X2lvX3RyZWUgKnRyZWUsCisJCSAgICAgICBzdHJ1Y3QgZXh0ZW50X3N0YXRlICpzdGF0ZSkKK3sKKwlzdHJ1Y3QgZXh0ZW50X3N0YXRlICpvdGhlcjsKKwlzdHJ1Y3QgcmJfbm9kZSAqb3RoZXJfbm9kZTsKKworCWlmIChzdGF0ZS0+c3RhdGUgJiAoRVhURU5UX0lPQklUUyB8IEVYVEVOVF9CT1VOREFSWSkpCisJCXJldHVybiAwOworCisJb3RoZXJfbm9kZSA9IHJiX3ByZXYoJnN0YXRlLT5yYl9ub2RlKTsKKwlpZiAob3RoZXJfbm9kZSkgeworCQlvdGhlciA9IHJiX2VudHJ5KG90aGVyX25vZGUsIHN0cnVjdCBleHRlbnRfc3RhdGUsIHJiX25vZGUpOworCQlpZiAob3RoZXItPmVuZCA9PSBzdGF0ZS0+c3RhcnQgLSAxICYmCisJCSAgICBvdGhlci0+c3RhdGUgPT0gc3RhdGUtPnN0YXRlKSB7CisJCQlzdGF0ZS0+c3RhcnQgPSBvdGhlci0+c3RhcnQ7CisJCQlvdGhlci0+dHJlZSA9IE5VTEw7CisJCQlyYl9lcmFzZSgmb3RoZXItPnJiX25vZGUsICZ0cmVlLT5zdGF0ZSk7CisJCQlmcmVlX2V4dGVudF9zdGF0ZShvdGhlcik7CisJCX0KKwl9CisJb3RoZXJfbm9kZSA9IHJiX25leHQoJnN0YXRlLT5yYl9ub2RlKTsKKwlpZiAob3RoZXJfbm9kZSkgeworCQlvdGhlciA9IHJiX2VudHJ5KG90aGVyX25vZGUsIHN0cnVjdCBleHRlbnRfc3RhdGUsIHJiX25vZGUpOworCQlpZiAob3RoZXItPnN0YXJ0ID09IHN0YXRlLT5lbmQgKyAxICYmCisJCSAgICBvdGhlci0+c3RhdGUgPT0gc3RhdGUtPnN0YXRlKSB7CisJCQlvdGhlci0+c3RhcnQgPSBzdGF0ZS0+c3RhcnQ7CisJCQlzdGF0ZS0+dHJlZSA9IE5VTEw7CisJCQlyYl9lcmFzZSgmc3RhdGUtPnJiX25vZGUsICZ0cmVlLT5zdGF0ZSk7CisJCQlmcmVlX2V4dGVudF9zdGF0ZShzdGF0ZSk7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9zdGF0ZV9jYihzdHJ1Y3QgZXh0ZW50X2lvX3RyZWUgKnRyZWUsCisJCQkgc3RydWN0IGV4dGVudF9zdGF0ZSAqc3RhdGUsCisJCQkgdW5zaWduZWQgbG9uZyBiaXRzKQoreworCWlmICh0cmVlLT5vcHMgJiYgdHJlZS0+b3BzLT5zZXRfYml0X2hvb2spIHsKKwkJdHJlZS0+b3BzLT5zZXRfYml0X2hvb2sodHJlZS0+bWFwcGluZy0+aG9zdCwgc3RhdGUtPnN0YXJ0LAorCQkJCQlzdGF0ZS0+ZW5kLCBzdGF0ZS0+c3RhdGUsIGJpdHMpOworCX0KK30KKworc3RhdGljIHZvaWQgY2xlYXJfc3RhdGVfY2Ioc3RydWN0IGV4dGVudF9pb190cmVlICp0cmVlLAorCQkJICAgc3RydWN0IGV4dGVudF9zdGF0ZSAqc3RhdGUsCisJCQkgICB1bnNpZ25lZCBsb25nIGJpdHMpCit7CisJaWYgKHRyZWUtPm9wcyAmJiB0cmVlLT5vcHMtPmNsZWFyX2JpdF9ob29rKSB7CisJCXRyZWUtPm9wcy0+Y2xlYXJfYml0X2hvb2sodHJlZS0+bWFwcGluZy0+aG9zdCwgc3RhdGUtPnN0YXJ0LAorCQkJCQkgIHN0YXRlLT5lbmQsIHN0YXRlLT5zdGF0ZSwgYml0cyk7CisJfQorfQorCisvKgorICogaW5zZXJ0IGFuIGV4dGVudF9zdGF0ZSBzdHJ1Y3QgaW50byB0aGUgdHJlZS4gICdiaXRzJyBhcmUgc2V0IG9uIHRoZQorICogc3RydWN0IGJlZm9yZSBpdCBpcyBpbnNlcnRlZC4KKyAqCisgKiBUaGlzIG1heSByZXR1cm4gLUVFWElTVCBpZiB0aGUgZXh0ZW50IGlzIGFscmVhZHkgdGhlcmUsIGluIHdoaWNoIGNhc2UgdGhlCisgKiBzdGF0ZSBzdHJ1Y3QgaXMgZnJlZWQuCisgKgorICogVGhlIHRyZWUgbG9jayBpcyBub3QgdGFrZW4gaW50ZXJuYWxseS4gIFRoaXMgaXMgYSB1dGlsaXR5IGZ1bmN0aW9uIGFuZAorICogcHJvYmFibHkgaXNuJ3Qgd2hhdCB5b3Ugd2FudCB0byBjYWxsIChzZWUgc2V0L2NsZWFyX2V4dGVudF9iaXQpLgorICovCitzdGF0aWMgaW50IGluc2VydF9zdGF0ZShzdHJ1Y3QgZXh0ZW50X2lvX3RyZWUgKnRyZWUsCisJCQlzdHJ1Y3QgZXh0ZW50X3N0YXRlICpzdGF0ZSwgdTY0IHN0YXJ0LCB1NjQgZW5kLAorCQkJaW50IGJpdHMpCit7CisJc3RydWN0IHJiX25vZGUgKm5vZGU7CisKKwlpZiAoZW5kIDwgc3RhcnQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJidHJmcyBlbmQgPCBzdGFydCAlbGx1ICVsbHVcbiIsCisJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKWVuZCwKKwkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpc3RhcnQpOworCQlXQVJOX09OKDEpOworCX0KKwlpZiAoYml0cyAmIEVYVEVOVF9ESVJUWSkKKwkJdHJlZS0+ZGlydHlfYnl0ZXMgKz0gZW5kIC0gc3RhcnQgKyAxOworCXNldF9zdGF0ZV9jYih0cmVlLCBzdGF0ZSwgYml0cyk7CisJc3RhdGUtPnN0YXRlIHw9IGJpdHM7CisJc3RhdGUtPnN0YXJ0ID0gc3RhcnQ7CisJc3RhdGUtPmVuZCA9IGVuZDsKKwlub2RlID0gdHJlZV9pbnNlcnQoJnRyZWUtPnN0YXRlLCBlbmQsICZzdGF0ZS0+cmJfbm9kZSk7CisJaWYgKG5vZGUpIHsKKwkJc3RydWN0IGV4dGVudF9zdGF0ZSAqZm91bmQ7CisJCWZvdW5kID0gcmJfZW50cnkobm9kZSwgc3RydWN0IGV4dGVudF9zdGF0ZSwgcmJfbm9kZSk7CisJCXByaW50ayhLRVJOX0VSUiAiYnRyZnMgZm91bmQgbm9kZSAlbGx1ICVsbHUgb24gaW5zZXJ0IG9mICIKKwkJICAgICAgICIlbGx1ICVsbHVcbiIsICh1bnNpZ25lZCBsb25nIGxvbmcpZm91bmQtPnN0YXJ0LAorCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylmb3VuZC0+ZW5kLAorCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylzdGFydCwgKHVuc2lnbmVkIGxvbmcgbG9uZyllbmQpOworCQlmcmVlX2V4dGVudF9zdGF0ZShzdGF0ZSk7CisJCXJldHVybiAtRUVYSVNUOworCX0KKwlzdGF0ZS0+dHJlZSA9IHRyZWU7CisJbWVyZ2Vfc3RhdGUodHJlZSwgc3RhdGUpOworCXJldHVybiAwOworfQorCisvKgorICogc3BsaXQgYSBnaXZlbiBleHRlbnQgc3RhdGUgc3RydWN0IGluIHR3bywgaW5zZXJ0aW5nIHRoZSBwcmVhbGxvY2F0ZWQKKyAqIHN0cnVjdCAncHJlYWxsb2MnIGFzIHRoZSBuZXdseSBjcmVhdGVkIHNlY29uZCBoYWxmLiAgJ3NwbGl0JyBpbmRpY2F0ZXMgYW4KKyAqIG9mZnNldCBpbnNpZGUgJ29yaWcnIHdoZXJlIGl0IHNob3VsZCBiZSBzcGxpdC4KKyAqCisgKiBCZWZvcmUgY2FsbGluZywKKyAqIHRoZSB0cmVlIGhhcyAnb3JpZycgYXQgW29yaWctPnN0YXJ0LCBvcmlnLT5lbmRdLiAgQWZ0ZXIgY2FsbGluZywgdGhlcmUKKyAqIGFyZSB0d28gZXh0ZW50IHN0YXRlIHN0cnVjdHMgaW4gdGhlIHRyZWU6CisgKiBwcmVhbGxvYzogW29yaWctPnN0YXJ0LCBzcGxpdCAtIDFdCisgKiBvcmlnOiBbIHNwbGl0LCBvcmlnLT5lbmQgXQorICoKKyAqIFRoZSB0cmVlIGxvY2tzIGFyZSBub3QgdGFrZW4gYnkgdGhpcyBmdW5jdGlvbi4gVGhleSBuZWVkIHRvIGJlIGhlbGQKKyAqIGJ5IHRoZSBjYWxsZXIuCisgKi8KK3N0YXRpYyBpbnQgc3BsaXRfc3RhdGUoc3RydWN0IGV4dGVudF9pb190cmVlICp0cmVlLCBzdHJ1Y3QgZXh0ZW50X3N0YXRlICpvcmlnLAorCQkgICAgICAgc3RydWN0IGV4dGVudF9zdGF0ZSAqcHJlYWxsb2MsIHU2NCBzcGxpdCkKK3sKKwlzdHJ1Y3QgcmJfbm9kZSAqbm9kZTsKKwlwcmVhbGxvYy0+c3RhcnQgPSBvcmlnLT5zdGFydDsKKwlwcmVhbGxvYy0+ZW5kID0gc3BsaXQgLSAxOworCXByZWFsbG9jLT5zdGF0ZSA9IG9yaWctPnN0YXRlOworCW9yaWctPnN0YXJ0ID0gc3BsaXQ7CisKKwlub2RlID0gdHJlZV9pbnNlcnQoJnRyZWUtPnN0YXRlLCBwcmVhbGxvYy0+ZW5kLCAmcHJlYWxsb2MtPnJiX25vZGUpOworCWlmIChub2RlKSB7CisJCXN0cnVjdCBleHRlbnRfc3RhdGUgKmZvdW5kOworCQlmb3VuZCA9IHJiX2VudHJ5KG5vZGUsIHN0cnVjdCBleHRlbnRfc3RhdGUsIHJiX25vZGUpOworCQlmcmVlX2V4dGVudF9zdGF0ZShwcmVhbGxvYyk7CisJCXJldHVybiAtRUVYSVNUOworCX0KKwlwcmVhbGxvYy0+dHJlZSA9IHRyZWU7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiB1dGlsaXR5IGZ1bmN0aW9uIHRvIGNsZWFyIHNvbWUgYml0cyBpbiBhbiBleHRlbnQgc3RhdGUgc3RydWN0LgorICogaXQgd2lsbCBvcHRpb25hbGx5IHdha2UgdXAgYW55IG9uZSB3YWl0aW5nIG9uIHRoaXMgc3RhdGUgKHdha2UgPT0gMSksIG9yCisgKiBmb3JjaWJseSByZW1vdmUgdGhlIHN0YXRlIGZyb20gdGhlIHRyZWUgKGRlbGV0ZSA9PSAxKS4KKyAqCisgKiBJZiBubyBiaXRzIGFyZSBzZXQgb24gdGhlIHN0YXRlIHN0cnVjdCBhZnRlciBjbGVhcmluZyB0aGluZ3MsIHRoZQorICogc3RydWN0IGlzIGZyZWVkIGFuZCByZW1vdmVkIGZyb20gdGhlIHRyZWUKKyAqLworc3RhdGljIGludCBjbGVhcl9zdGF0ZV9iaXQoc3RydWN0IGV4dGVudF9pb190cmVlICp0cmVlLAorCQkJICAgIHN0cnVjdCBleHRlbnRfc3RhdGUgKnN0YXRlLCBpbnQgYml0cywgaW50IHdha2UsCisJCQkgICAgaW50IGRlbGV0ZSkKK3sKKwlpbnQgcmV0ID0gc3RhdGUtPnN0YXRlICYgYml0czsKKworCWlmICgoYml0cyAmIEVYVEVOVF9ESVJUWSkgJiYgKHN0YXRlLT5zdGF0ZSAmIEVYVEVOVF9ESVJUWSkpIHsKKwkJdTY0IHJhbmdlID0gc3RhdGUtPmVuZCAtIHN0YXRlLT5zdGFydCArIDE7CisJCVdBUk5fT04ocmFuZ2UgPiB0cmVlLT5kaXJ0eV9ieXRlcyk7CisJCXRyZWUtPmRpcnR5X2J5dGVzIC09IHJhbmdlOworCX0KKwljbGVhcl9zdGF0ZV9jYih0cmVlLCBzdGF0ZSwgYml0cyk7CisJc3RhdGUtPnN0YXRlICY9IH5iaXRzOworCWlmICh3YWtlKQorCQl3YWtlX3VwKCZzdGF0ZS0+d3EpOworCWlmIChkZWxldGUgfHwgc3RhdGUtPnN0YXRlID09IDApIHsKKwkJaWYgKHN0YXRlLT50cmVlKSB7CisJCQljbGVhcl9zdGF0ZV9jYih0cmVlLCBzdGF0ZSwgc3RhdGUtPnN0YXRlKTsKKwkJCXJiX2VyYXNlKCZzdGF0ZS0+cmJfbm9kZSwgJnRyZWUtPnN0YXRlKTsKKwkJCXN0YXRlLT50cmVlID0gTlVMTDsKKwkJCWZyZWVfZXh0ZW50X3N0YXRlKHN0YXRlKTsKKwkJfSBlbHNlIHsKKwkJCVdBUk5fT04oMSk7CisJCX0KKwl9IGVsc2UgeworCQltZXJnZV9zdGF0ZSh0cmVlLCBzdGF0ZSk7CisJfQorCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBjbGVhciBzb21lIGJpdHMgb24gYSByYW5nZSBpbiB0aGUgdHJlZS4gIFRoaXMgbWF5IHJlcXVpcmUgc3BsaXR0aW5nCisgKiBvciBpbnNlcnRpbmcgZWxlbWVudHMgaW4gdGhlIHRyZWUsIHNvIHRoZSBnZnAgbWFzayBpcyB1c2VkIHRvCisgKiBpbmRpY2F0ZSB3aGljaCBhbGxvY2F0aW9ucyBvciBzbGVlcGluZyBhcmUgYWxsb3dlZC4KKyAqCisgKiBwYXNzICd3YWtlJyA9PSAxIHRvIGtpY2sgYW55IHNsZWVwZXJzLCBhbmQgJ2RlbGV0ZScgPT0gMSB0byByZW1vdmUKKyAqIHRoZSBnaXZlbiByYW5nZSBmcm9tIHRoZSB0cmVlIHJlZ2FyZGxlc3Mgb2Ygc3RhdGUgKGllIGZvciB0cnVuY2F0ZSkuCisgKgorICogdGhlIHJhbmdlIFtzdGFydCwgZW5kXSBpcyBpbmNsdXNpdmUuCisgKgorICogVGhpcyB0YWtlcyB0aGUgdHJlZSBsb2NrLCBhbmQgcmV0dXJucyA8IDAgb24gZXJyb3IsID4gMCBpZiBhbnkgb2YgdGhlCisgKiBiaXRzIHdlcmUgYWxyZWFkeSBzZXQsIG9yIHplcm8gaWYgbm9uZSBvZiB0aGUgYml0cyB3ZXJlIGFscmVhZHkgc2V0LgorICovCitpbnQgY2xlYXJfZXh0ZW50X2JpdChzdHJ1Y3QgZXh0ZW50X2lvX3RyZWUgKnRyZWUsIHU2NCBzdGFydCwgdTY0IGVuZCwKKwkJICAgICBpbnQgYml0cywgaW50IHdha2UsIGludCBkZWxldGUsIGdmcF90IG1hc2spCit7CisJc3RydWN0IGV4dGVudF9zdGF0ZSAqc3RhdGU7CisJc3RydWN0IGV4dGVudF9zdGF0ZSAqcHJlYWxsb2MgPSBOVUxMOworCXN0cnVjdCByYl9ub2RlICpub2RlOworCWludCBlcnI7CisJaW50IHNldCA9IDA7CisKK2FnYWluOgorCWlmICghcHJlYWxsb2MgJiYgKG1hc2sgJiBfX0dGUF9XQUlUKSkgeworCQlwcmVhbGxvYyA9IGFsbG9jX2V4dGVudF9zdGF0ZShtYXNrKTsKKwkJaWYgKCFwcmVhbGxvYykKKwkJCXJldHVybiAtRU5PTUVNOworCX0KKworCXNwaW5fbG9jaygmdHJlZS0+bG9jayk7CisJLyoKKwkgKiB0aGlzIHNlYXJjaCB3aWxsIGZpbmQgdGhlIGV4dGVudHMgdGhhdCBlbmQgYWZ0ZXIKKwkgKiBvdXIgcmFuZ2Ugc3RhcnRzCisJICovCisJbm9kZSA9IHRyZWVfc2VhcmNoKHRyZWUsIHN0YXJ0KTsKKwlpZiAoIW5vZGUpCisJCWdvdG8gb3V0OworCXN0YXRlID0gcmJfZW50cnkobm9kZSwgc3RydWN0IGV4dGVudF9zdGF0ZSwgcmJfbm9kZSk7CisJaWYgKHN0YXRlLT5zdGFydCA+IGVuZCkKKwkJZ290byBvdXQ7CisJV0FSTl9PTihzdGF0ZS0+ZW5kIDwgc3RhcnQpOworCisJLyoKKwkgKiAgICAgfCAtLS0tIGRlc2lyZWQgcmFuZ2UgLS0tLSB8CisJICogIHwgc3RhdGUgfCBvcgorCSAqICB8IC0tLS0tLS0tLS0tLS0gc3RhdGUgLS0tLS0tLS0tLS0tLS0gfAorCSAqCisJICogV2UgbmVlZCB0byBzcGxpdCB0aGUgZXh0ZW50IHdlIGZvdW5kLCBhbmQgbWF5IGZsaXAKKwkgKiBiaXRzIG9uIHNlY29uZCBoYWxmLgorCSAqCisJICogSWYgdGhlIGV4dGVudCB3ZSBmb3VuZCBleHRlbmRzIHBhc3Qgb3VyIHJhbmdlLCB3ZQorCSAqIGp1c3Qgc3BsaXQgYW5kIHNlYXJjaCBhZ2Fpbi4gIEl0J2xsIGdldCBzcGxpdCBhZ2FpbgorCSAqIHRoZSBuZXh0IHRpbWUgdGhvdWdoLgorCSAqCisJICogSWYgdGhlIGV4dGVudCB3ZSBmb3VuZCBpcyBpbnNpZGUgb3VyIHJhbmdlLCB3ZSBjbGVhcgorCSAqIHRoZSBkZXNpcmVkIGJpdCBvbiBpdC4KKwkgKi8KKworCWlmIChzdGF0ZS0+c3RhcnQgPCBzdGFydCkgeworCQlpZiAoIXByZWFsbG9jKQorCQkJcHJlYWxsb2MgPSBhbGxvY19leHRlbnRfc3RhdGUoR0ZQX0FUT01JQyk7CisJCWVyciA9IHNwbGl0X3N0YXRlKHRyZWUsIHN0YXRlLCBwcmVhbGxvYywgc3RhcnQpOworCQlCVUdfT04oZXJyID09IC1FRVhJU1QpOworCQlwcmVhbGxvYyA9IE5VTEw7CisJCWlmIChlcnIpCisJCQlnb3RvIG91dDsKKwkJaWYgKHN0YXRlLT5lbmQgPD0gZW5kKSB7CisJCQlzdGFydCA9IHN0YXRlLT5lbmQgKyAxOworCQkJc2V0IHw9IGNsZWFyX3N0YXRlX2JpdCh0cmVlLCBzdGF0ZSwgYml0cywKKwkJCQkJd2FrZSwgZGVsZXRlKTsKKwkJfSBlbHNlIHsKKwkJCXN0YXJ0ID0gc3RhdGUtPnN0YXJ0OworCQl9CisJCWdvdG8gc2VhcmNoX2FnYWluOworCX0KKwkvKgorCSAqIHwgLS0tLSBkZXNpcmVkIHJhbmdlIC0tLS0gfAorCSAqICAgICAgICAgICAgICAgICAgICAgICAgfCBzdGF0ZSB8CisJICogV2UgbmVlZCB0byBzcGxpdCB0aGUgZXh0ZW50LCBhbmQgY2xlYXIgdGhlIGJpdAorCSAqIG9uIHRoZSBmaXJzdCBoYWxmCisJICovCisJaWYgKHN0YXRlLT5zdGFydCA8PSBlbmQgJiYgc3RhdGUtPmVuZCA+IGVuZCkgeworCQlpZiAoIXByZWFsbG9jKQorCQkJcHJlYWxsb2MgPSBhbGxvY19leHRlbnRfc3RhdGUoR0ZQX0FUT01JQyk7CisJCWVyciA9IHNwbGl0X3N0YXRlKHRyZWUsIHN0YXRlLCBwcmVhbGxvYywgZW5kICsgMSk7CisJCUJVR19PTihlcnIgPT0gLUVFWElTVCk7CisKKwkJaWYgKHdha2UpCisJCQl3YWtlX3VwKCZzdGF0ZS0+d3EpOworCQlzZXQgfD0gY2xlYXJfc3RhdGVfYml0KHRyZWUsIHByZWFsbG9jLCBiaXRzLAorCQkJCSAgICAgICB3YWtlLCBkZWxldGUpOworCQlwcmVhbGxvYyA9IE5VTEw7CisJCWdvdG8gb3V0OworCX0KKworCXN0YXJ0ID0gc3RhdGUtPmVuZCArIDE7CisJc2V0IHw9IGNsZWFyX3N0YXRlX2JpdCh0cmVlLCBzdGF0ZSwgYml0cywgd2FrZSwgZGVsZXRlKTsKKwlnb3RvIHNlYXJjaF9hZ2FpbjsKKworb3V0OgorCXNwaW5fdW5sb2NrKCZ0cmVlLT5sb2NrKTsKKwlpZiAocHJlYWxsb2MpCisJCWZyZWVfZXh0ZW50X3N0YXRlKHByZWFsbG9jKTsKKworCXJldHVybiBzZXQ7CisKK3NlYXJjaF9hZ2FpbjoKKwlpZiAoc3RhcnQgPiBlbmQpCisJCWdvdG8gb3V0OworCXNwaW5fdW5sb2NrKCZ0cmVlLT5sb2NrKTsKKwlpZiAobWFzayAmIF9fR0ZQX1dBSVQpCisJCWNvbmRfcmVzY2hlZCgpOworCWdvdG8gYWdhaW47Cit9CisKK3N0YXRpYyBpbnQgd2FpdF9vbl9zdGF0ZShzdHJ1Y3QgZXh0ZW50X2lvX3RyZWUgKnRyZWUsCisJCQkgc3RydWN0IGV4dGVudF9zdGF0ZSAqc3RhdGUpCisJCV9fcmVsZWFzZXModHJlZS0+bG9jaykKKwkJX19hY3F1aXJlcyh0cmVlLT5sb2NrKQoreworCURFRklORV9XQUlUKHdhaXQpOworCXByZXBhcmVfdG9fd2FpdCgmc3RhdGUtPndxLCAmd2FpdCwgVEFTS19VTklOVEVSUlVQVElCTEUpOworCXNwaW5fdW5sb2NrKCZ0cmVlLT5sb2NrKTsKKwlzY2hlZHVsZSgpOworCXNwaW5fbG9jaygmdHJlZS0+bG9jayk7CisJZmluaXNoX3dhaXQoJnN0YXRlLT53cSwgJndhaXQpOworCXJldHVybiAwOworfQorCisvKgorICogd2FpdHMgZm9yIG9uZSBvciBtb3JlIGJpdHMgdG8gY2xlYXIgb24gYSByYW5nZSBpbiB0aGUgc3RhdGUgdHJlZS4KKyAqIFRoZSByYW5nZSBbc3RhcnQsIGVuZF0gaXMgaW5jbHVzaXZlLgorICogVGhlIHRyZWUgbG9jayBpcyB0YWtlbiBieSB0aGlzIGZ1bmN0aW9uCisgKi8KK2ludCB3YWl0X2V4dGVudF9iaXQoc3RydWN0IGV4dGVudF9pb190cmVlICp0cmVlLCB1NjQgc3RhcnQsIHU2NCBlbmQsIGludCBiaXRzKQoreworCXN0cnVjdCBleHRlbnRfc3RhdGUgKnN0YXRlOworCXN0cnVjdCByYl9ub2RlICpub2RlOworCisJc3Bpbl9sb2NrKCZ0cmVlLT5sb2NrKTsKK2FnYWluOgorCXdoaWxlICgxKSB7CisJCS8qCisJCSAqIHRoaXMgc2VhcmNoIHdpbGwgZmluZCBhbGwgdGhlIGV4dGVudHMgdGhhdCBlbmQgYWZ0ZXIKKwkJICogb3VyIHJhbmdlIHN0YXJ0cworCQkgKi8KKwkJbm9kZSA9IHRyZWVfc2VhcmNoKHRyZWUsIHN0YXJ0KTsKKwkJaWYgKCFub2RlKQorCQkJYnJlYWs7CisKKwkJc3RhdGUgPSByYl9lbnRyeShub2RlLCBzdHJ1Y3QgZXh0ZW50X3N0YXRlLCByYl9ub2RlKTsKKworCQlpZiAoc3RhdGUtPnN0YXJ0ID4gZW5kKQorCQkJZ290byBvdXQ7CisKKwkJaWYgKHN0YXRlLT5zdGF0ZSAmIGJpdHMpIHsKKwkJCXN0YXJ0ID0gc3RhdGUtPnN0YXJ0OworCQkJYXRvbWljX2luYygmc3RhdGUtPnJlZnMpOworCQkJd2FpdF9vbl9zdGF0ZSh0cmVlLCBzdGF0ZSk7CisJCQlmcmVlX2V4dGVudF9zdGF0ZShzdGF0ZSk7CisJCQlnb3RvIGFnYWluOworCQl9CisJCXN0YXJ0ID0gc3RhdGUtPmVuZCArIDE7CisKKwkJaWYgKHN0YXJ0ID4gZW5kKQorCQkJYnJlYWs7CisKKwkJaWYgKG5lZWRfcmVzY2hlZCgpKSB7CisJCQlzcGluX3VubG9jaygmdHJlZS0+bG9jayk7CisJCQljb25kX3Jlc2NoZWQoKTsKKwkJCXNwaW5fbG9jaygmdHJlZS0+bG9jayk7CisJCX0KKwl9CitvdXQ6CisJc3Bpbl91bmxvY2soJnRyZWUtPmxvY2spOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzZXRfc3RhdGVfYml0cyhzdHJ1Y3QgZXh0ZW50X2lvX3RyZWUgKnRyZWUsCisJCQkgICBzdHJ1Y3QgZXh0ZW50X3N0YXRlICpzdGF0ZSwKKwkJCSAgIGludCBiaXRzKQoreworCWlmICgoYml0cyAmIEVYVEVOVF9ESVJUWSkgJiYgIShzdGF0ZS0+c3RhdGUgJiBFWFRFTlRfRElSVFkpKSB7CisJCXU2NCByYW5nZSA9IHN0YXRlLT5lbmQgLSBzdGF0ZS0+c3RhcnQgKyAxOworCQl0cmVlLT5kaXJ0eV9ieXRlcyArPSByYW5nZTsKKwl9CisJc2V0X3N0YXRlX2NiKHRyZWUsIHN0YXRlLCBiaXRzKTsKKwlzdGF0ZS0+c3RhdGUgfD0gYml0czsKK30KKworLyoKKyAqIHNldCBzb21lIGJpdHMgb24gYSByYW5nZSBpbiB0aGUgdHJlZS4gIFRoaXMgbWF5IHJlcXVpcmUgYWxsb2NhdGlvbnMKKyAqIG9yIHNsZWVwaW5nLCBzbyB0aGUgZ2ZwIG1hc2sgaXMgdXNlZCB0byBpbmRpY2F0ZSB3aGF0IGlzIGFsbG93ZWQuCisgKgorICogSWYgJ2V4Y2x1c2l2ZScgPT0gMSwgdGhpcyB3aWxsIGZhaWwgd2l0aCAtRUVYSVNUIGlmIHNvbWUgcGFydCBvZiB0aGUKKyAqIHJhbmdlIGFscmVhZHkgaGFzIHRoZSBkZXNpcmVkIGJpdHMgc2V0LiAgVGhlIHN0YXJ0IG9mIHRoZSBleGlzdGluZworICogcmFuZ2UgaXMgcmV0dXJuZWQgaW4gZmFpbGVkX3N0YXJ0IGluIHRoaXMgY2FzZS4KKyAqCisgKiBbc3RhcnQsIGVuZF0gaXMgaW5jbHVzaXZlCisgKiBUaGlzIHRha2VzIHRoZSB0cmVlIGxvY2suCisgKi8KK3N0YXRpYyBpbnQgc2V0X2V4dGVudF9iaXQoc3RydWN0IGV4dGVudF9pb190cmVlICp0cmVlLCB1NjQgc3RhcnQsIHU2NCBlbmQsCisJCQkgIGludCBiaXRzLCBpbnQgZXhjbHVzaXZlLCB1NjQgKmZhaWxlZF9zdGFydCwKKwkJCSAgZ2ZwX3QgbWFzaykKK3sKKwlzdHJ1Y3QgZXh0ZW50X3N0YXRlICpzdGF0ZTsKKwlzdHJ1Y3QgZXh0ZW50X3N0YXRlICpwcmVhbGxvYyA9IE5VTEw7CisJc3RydWN0IHJiX25vZGUgKm5vZGU7CisJaW50IGVyciA9IDA7CisJaW50IHNldDsKKwl1NjQgbGFzdF9zdGFydDsKKwl1NjQgbGFzdF9lbmQ7CithZ2FpbjoKKwlpZiAoIXByZWFsbG9jICYmIChtYXNrICYgX19HRlBfV0FJVCkpIHsKKwkJcHJlYWxsb2MgPSBhbGxvY19leHRlbnRfc3RhdGUobWFzayk7CisJCWlmICghcHJlYWxsb2MpCisJCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlzcGluX2xvY2soJnRyZWUtPmxvY2spOworCS8qCisJICogdGhpcyBzZWFyY2ggd2lsbCBmaW5kIGFsbCB0aGUgZXh0ZW50cyB0aGF0IGVuZCBhZnRlcgorCSAqIG91ciByYW5nZSBzdGFydHMuCisJICovCisJbm9kZSA9IHRyZWVfc2VhcmNoKHRyZWUsIHN0YXJ0KTsKKwlpZiAoIW5vZGUpIHsKKwkJZXJyID0gaW5zZXJ0X3N0YXRlKHRyZWUsIHByZWFsbG9jLCBzdGFydCwgZW5kLCBiaXRzKTsKKwkJcHJlYWxsb2MgPSBOVUxMOworCQlCVUdfT04oZXJyID09IC1FRVhJU1QpOworCQlnb3RvIG91dDsKKwl9CisKKwlzdGF0ZSA9IHJiX2VudHJ5KG5vZGUsIHN0cnVjdCBleHRlbnRfc3RhdGUsIHJiX25vZGUpOworCWxhc3Rfc3RhcnQgPSBzdGF0ZS0+c3RhcnQ7CisJbGFzdF9lbmQgPSBzdGF0ZS0+ZW5kOworCisJLyoKKwkgKiB8IC0tLS0gZGVzaXJlZCByYW5nZSAtLS0tIHwKKwkgKiB8IHN0YXRlIHwKKwkgKgorCSAqIEp1c3QgbG9jayB3aGF0IHdlIGZvdW5kIGFuZCBrZWVwIGdvaW5nCisJICovCisJaWYgKHN0YXRlLT5zdGFydCA9PSBzdGFydCAmJiBzdGF0ZS0+ZW5kIDw9IGVuZCkgeworCQlzZXQgPSBzdGF0ZS0+c3RhdGUgJiBiaXRzOworCQlpZiAoc2V0ICYmIGV4Y2x1c2l2ZSkgeworCQkJKmZhaWxlZF9zdGFydCA9IHN0YXRlLT5zdGFydDsKKwkJCWVyciA9IC1FRVhJU1Q7CisJCQlnb3RvIG91dDsKKwkJfQorCQlzZXRfc3RhdGVfYml0cyh0cmVlLCBzdGF0ZSwgYml0cyk7CisJCXN0YXJ0ID0gc3RhdGUtPmVuZCArIDE7CisJCW1lcmdlX3N0YXRlKHRyZWUsIHN0YXRlKTsKKwkJZ290byBzZWFyY2hfYWdhaW47CisJfQorCisJLyoKKwkgKiAgICAgfCAtLS0tIGRlc2lyZWQgcmFuZ2UgLS0tLSB8CisJICogfCBzdGF0ZSB8CisJICogICBvcgorCSAqIHwgLS0tLS0tLS0tLS0tLSBzdGF0ZSAtLS0tLS0tLS0tLS0tLSB8CisJICoKKwkgKiBXZSBuZWVkIHRvIHNwbGl0IHRoZSBleHRlbnQgd2UgZm91bmQsIGFuZCBtYXkgZmxpcCBiaXRzIG9uCisJICogc2Vjb25kIGhhbGYuCisJICoKKwkgKiBJZiB0aGUgZXh0ZW50IHdlIGZvdW5kIGV4dGVuZHMgcGFzdCBvdXIKKwkgKiByYW5nZSwgd2UganVzdCBzcGxpdCBhbmQgc2VhcmNoIGFnYWluLiAgSXQnbGwgZ2V0IHNwbGl0CisJICogYWdhaW4gdGhlIG5leHQgdGltZSB0aG91Z2guCisJICoKKwkgKiBJZiB0aGUgZXh0ZW50IHdlIGZvdW5kIGlzIGluc2lkZSBvdXIgcmFuZ2UsIHdlIHNldCB0aGUKKwkgKiBkZXNpcmVkIGJpdCBvbiBpdC4KKwkgKi8KKwlpZiAoc3RhdGUtPnN0YXJ0IDwgc3RhcnQpIHsKKwkJc2V0ID0gc3RhdGUtPnN0YXRlICYgYml0czsKKwkJaWYgKGV4Y2x1c2l2ZSAmJiBzZXQpIHsKKwkJCSpmYWlsZWRfc3RhcnQgPSBzdGFydDsKKwkJCWVyciA9IC1FRVhJU1Q7CisJCQlnb3RvIG91dDsKKwkJfQorCQllcnIgPSBzcGxpdF9zdGF0ZSh0cmVlLCBzdGF0ZSwgcHJlYWxsb2MsIHN0YXJ0KTsKKwkJQlVHX09OKGVyciA9PSAtRUVYSVNUKTsKKwkJcHJlYWxsb2MgPSBOVUxMOworCQlpZiAoZXJyKQorCQkJZ290byBvdXQ7CisJCWlmIChzdGF0ZS0+ZW5kIDw9IGVuZCkgeworCQkJc2V0X3N0YXRlX2JpdHModHJlZSwgc3RhdGUsIGJpdHMpOworCQkJc3RhcnQgPSBzdGF0ZS0+ZW5kICsgMTsKKwkJCW1lcmdlX3N0YXRlKHRyZWUsIHN0YXRlKTsKKwkJfSBlbHNlIHsKKwkJCXN0YXJ0ID0gc3RhdGUtPnN0YXJ0OworCQl9CisJCWdvdG8gc2VhcmNoX2FnYWluOworCX0KKwkvKgorCSAqIHwgLS0tLSBkZXNpcmVkIHJhbmdlIC0tLS0gfAorCSAqICAgICB8IHN0YXRlIHwgb3IgICAgICAgICAgICAgICB8IHN0YXRlIHwKKwkgKgorCSAqIFRoZXJlJ3MgYSBob2xlLCB3ZSBuZWVkIHRvIGluc2VydCBzb21ldGhpbmcgaW4gaXQgYW5kCisJICogaWdub3JlIHRoZSBleHRlbnQgd2UgZm91bmQuCisJICovCisJaWYgKHN0YXRlLT5zdGFydCA+IHN0YXJ0KSB7CisJCXU2NCB0aGlzX2VuZDsKKwkJaWYgKGVuZCA8IGxhc3Rfc3RhcnQpCisJCQl0aGlzX2VuZCA9IGVuZDsKKwkJZWxzZQorCQkJdGhpc19lbmQgPSBsYXN0X3N0YXJ0IC0gMTsKKwkJZXJyID0gaW5zZXJ0X3N0YXRlKHRyZWUsIHByZWFsbG9jLCBzdGFydCwgdGhpc19lbmQsCisJCQkJICAgYml0cyk7CisJCXByZWFsbG9jID0gTlVMTDsKKwkJQlVHX09OKGVyciA9PSAtRUVYSVNUKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gb3V0OworCQlzdGFydCA9IHRoaXNfZW5kICsgMTsKKwkJZ290byBzZWFyY2hfYWdhaW47CisJfQorCS8qCisJICogfCAtLS0tIGRlc2lyZWQgcmFuZ2UgLS0tLSB8CisJICogICAgICAgICAgICAgICAgICAgICAgICB8IHN0YXRlIHwKKwkgKiBXZSBuZWVkIHRvIHNwbGl0IHRoZSBleHRlbnQsIGFuZCBzZXQgdGhlIGJpdAorCSAqIG9uIHRoZSBmaXJzdCBoYWxmCisJICovCisJaWYgKHN0YXRlLT5zdGFydCA8PSBlbmQgJiYgc3RhdGUtPmVuZCA+IGVuZCkgeworCQlzZXQgPSBzdGF0ZS0+c3RhdGUgJiBiaXRzOworCQlpZiAoZXhjbHVzaXZlICYmIHNldCkgeworCQkJKmZhaWxlZF9zdGFydCA9IHN0YXJ0OworCQkJZXJyID0gLUVFWElTVDsKKwkJCWdvdG8gb3V0OworCQl9CisJCWVyciA9IHNwbGl0X3N0YXRlKHRyZWUsIHN0YXRlLCBwcmVhbGxvYywgZW5kICsgMSk7CisJCUJVR19PTihlcnIgPT0gLUVFWElTVCk7CisKKwkJc2V0X3N0YXRlX2JpdHModHJlZSwgcHJlYWxsb2MsIGJpdHMpOworCQltZXJnZV9zdGF0ZSh0cmVlLCBwcmVhbGxvYyk7CisJCXByZWFsbG9jID0gTlVMTDsKKwkJZ290byBvdXQ7CisJfQorCisJZ290byBzZWFyY2hfYWdhaW47CisKK291dDoKKwlzcGluX3VubG9jaygmdHJlZS0+bG9jayk7CisJaWYgKHByZWFsbG9jKQorCQlmcmVlX2V4dGVudF9zdGF0ZShwcmVhbGxvYyk7CisKKwlyZXR1cm4gZXJyOworCitzZWFyY2hfYWdhaW46CisJaWYgKHN0YXJ0ID4gZW5kKQorCQlnb3RvIG91dDsKKwlzcGluX3VubG9jaygmdHJlZS0+bG9jayk7CisJaWYgKG1hc2sgJiBfX0dGUF9XQUlUKQorCQljb25kX3Jlc2NoZWQoKTsKKwlnb3RvIGFnYWluOworfQorCisvKiB3cmFwcGVycyBhcm91bmQgc2V0L2NsZWFyIGV4dGVudCBiaXQgKi8KK2ludCBzZXRfZXh0ZW50X2RpcnR5KHN0cnVjdCBleHRlbnRfaW9fdHJlZSAqdHJlZSwgdTY0IHN0YXJ0LCB1NjQgZW5kLAorCQkgICAgIGdmcF90IG1hc2spCit7CisJcmV0dXJuIHNldF9leHRlbnRfYml0KHRyZWUsIHN0YXJ0LCBlbmQsIEVYVEVOVF9ESVJUWSwgMCwgTlVMTCwKKwkJCSAgICAgIG1hc2spOworfQorCitpbnQgc2V0X2V4dGVudF9vcmRlcmVkKHN0cnVjdCBleHRlbnRfaW9fdHJlZSAqdHJlZSwgdTY0IHN0YXJ0LCB1NjQgZW5kLAorCQkgICAgICAgZ2ZwX3QgbWFzaykKK3sKKwlyZXR1cm4gc2V0X2V4dGVudF9iaXQodHJlZSwgc3RhcnQsIGVuZCwgRVhURU5UX09SREVSRUQsIDAsIE5VTEwsIG1hc2spOworfQorCitpbnQgc2V0X2V4dGVudF9iaXRzKHN0cnVjdCBleHRlbnRfaW9fdHJlZSAqdHJlZSwgdTY0IHN0YXJ0LCB1NjQgZW5kLAorCQkgICAgaW50IGJpdHMsIGdmcF90IG1hc2spCit7CisJcmV0dXJuIHNldF9leHRlbnRfYml0KHRyZWUsIHN0YXJ0LCBlbmQsIGJpdHMsIDAsIE5VTEwsCisJCQkgICAgICBtYXNrKTsKK30KKworaW50IGNsZWFyX2V4dGVudF9iaXRzKHN0cnVjdCBleHRlbnRfaW9fdHJlZSAqdHJlZSwgdTY0IHN0YXJ0LCB1NjQgZW5kLAorCQkgICAgICBpbnQgYml0cywgZ2ZwX3QgbWFzaykKK3sKKwlyZXR1cm4gY2xlYXJfZXh0ZW50X2JpdCh0cmVlLCBzdGFydCwgZW5kLCBiaXRzLCAwLCAwLCBtYXNrKTsKK30KKworaW50IHNldF9leHRlbnRfZGVsYWxsb2Moc3RydWN0IGV4dGVudF9pb190cmVlICp0cmVlLCB1NjQgc3RhcnQsIHU2NCBlbmQsCisJCSAgICAgZ2ZwX3QgbWFzaykKK3sKKwlyZXR1cm4gc2V0X2V4dGVudF9iaXQodHJlZSwgc3RhcnQsIGVuZCwKKwkJCSAgICAgIEVYVEVOVF9ERUxBTExPQyB8IEVYVEVOVF9ESVJUWSwKKwkJCSAgICAgIDAsIE5VTEwsIG1hc2spOworfQorCitpbnQgY2xlYXJfZXh0ZW50X2RpcnR5KHN0cnVjdCBleHRlbnRfaW9fdHJlZSAqdHJlZSwgdTY0IHN0YXJ0LCB1NjQgZW5kLAorCQkgICAgICAgZ2ZwX3QgbWFzaykKK3sKKwlyZXR1cm4gY2xlYXJfZXh0ZW50X2JpdCh0cmVlLCBzdGFydCwgZW5kLAorCQkJCUVYVEVOVF9ESVJUWSB8IEVYVEVOVF9ERUxBTExPQywgMCwgMCwgbWFzayk7Cit9CisKK2ludCBjbGVhcl9leHRlbnRfb3JkZXJlZChzdHJ1Y3QgZXh0ZW50X2lvX3RyZWUgKnRyZWUsIHU2NCBzdGFydCwgdTY0IGVuZCwKKwkJCSBnZnBfdCBtYXNrKQoreworCXJldHVybiBjbGVhcl9leHRlbnRfYml0KHRyZWUsIHN0YXJ0LCBlbmQsIEVYVEVOVF9PUkRFUkVELCAxLCAwLCBtYXNrKTsKK30KKworaW50IHNldF9leHRlbnRfbmV3KHN0cnVjdCBleHRlbnRfaW9fdHJlZSAqdHJlZSwgdTY0IHN0YXJ0LCB1NjQgZW5kLAorCQkgICAgIGdmcF90IG1hc2spCit7CisJcmV0dXJuIHNldF9leHRlbnRfYml0KHRyZWUsIHN0YXJ0LCBlbmQsIEVYVEVOVF9ORVcsIDAsIE5VTEwsCisJCQkgICAgICBtYXNrKTsKK30KKworc3RhdGljIGludCBjbGVhcl9leHRlbnRfbmV3KHN0cnVjdCBleHRlbnRfaW9fdHJlZSAqdHJlZSwgdTY0IHN0YXJ0LCB1NjQgZW5kLAorCQkgICAgICAgZ2ZwX3QgbWFzaykKK3sKKwlyZXR1cm4gY2xlYXJfZXh0ZW50X2JpdCh0cmVlLCBzdGFydCwgZW5kLCBFWFRFTlRfTkVXLCAwLCAwLCBtYXNrKTsKK30KKworaW50IHNldF9leHRlbnRfdXB0b2RhdGUoc3RydWN0IGV4dGVudF9pb190cmVlICp0cmVlLCB1NjQgc3RhcnQsIHU2NCBlbmQsCisJCQlnZnBfdCBtYXNrKQoreworCXJldHVybiBzZXRfZXh0ZW50X2JpdCh0cmVlLCBzdGFydCwgZW5kLCBFWFRFTlRfVVBUT0RBVEUsIDAsIE5VTEwsCisJCQkgICAgICBtYXNrKTsKK30KKworc3RhdGljIGludCBjbGVhcl9leHRlbnRfdXB0b2RhdGUoc3RydWN0IGV4dGVudF9pb190cmVlICp0cmVlLCB1NjQgc3RhcnQsCisJCQkJIHU2NCBlbmQsIGdmcF90IG1hc2spCit7CisJcmV0dXJuIGNsZWFyX2V4dGVudF9iaXQodHJlZSwgc3RhcnQsIGVuZCwgRVhURU5UX1VQVE9EQVRFLCAwLCAwLCBtYXNrKTsKK30KKworc3RhdGljIGludCBzZXRfZXh0ZW50X3dyaXRlYmFjayhzdHJ1Y3QgZXh0ZW50X2lvX3RyZWUgKnRyZWUsIHU2NCBzdGFydCwgdTY0IGVuZCwKKwkJCSBnZnBfdCBtYXNrKQoreworCXJldHVybiBzZXRfZXh0ZW50X2JpdCh0cmVlLCBzdGFydCwgZW5kLCBFWFRFTlRfV1JJVEVCQUNLLAorCQkJICAgICAgMCwgTlVMTCwgbWFzayk7Cit9CisKK3N0YXRpYyBpbnQgY2xlYXJfZXh0ZW50X3dyaXRlYmFjayhzdHJ1Y3QgZXh0ZW50X2lvX3RyZWUgKnRyZWUsIHU2NCBzdGFydCwKKwkJCQkgIHU2NCBlbmQsIGdmcF90IG1hc2spCit7CisJcmV0dXJuIGNsZWFyX2V4dGVudF9iaXQodHJlZSwgc3RhcnQsIGVuZCwgRVhURU5UX1dSSVRFQkFDSywgMSwgMCwgbWFzayk7Cit9CisKK2ludCB3YWl0X29uX2V4dGVudF93cml0ZWJhY2soc3RydWN0IGV4dGVudF9pb190cmVlICp0cmVlLCB1NjQgc3RhcnQsIHU2NCBlbmQpCit7CisJcmV0dXJuIHdhaXRfZXh0ZW50X2JpdCh0cmVlLCBzdGFydCwgZW5kLCBFWFRFTlRfV1JJVEVCQUNLKTsKK30KKworLyoKKyAqIGVpdGhlciBpbnNlcnQgb3IgbG9jayBzdGF0ZSBzdHJ1Y3QgYmV0d2VlbiBzdGFydCBhbmQgZW5kIHVzZSBtYXNrIHRvIHRlbGwKKyAqIHVzIGlmIHdhaXRpbmcgaXMgZGVzaXJlZC4KKyAqLworaW50IGxvY2tfZXh0ZW50KHN0cnVjdCBleHRlbnRfaW9fdHJlZSAqdHJlZSwgdTY0IHN0YXJ0LCB1NjQgZW5kLCBnZnBfdCBtYXNrKQoreworCWludCBlcnI7CisJdTY0IGZhaWxlZF9zdGFydDsKKwl3aGlsZSAoMSkgeworCQllcnIgPSBzZXRfZXh0ZW50X2JpdCh0cmVlLCBzdGFydCwgZW5kLCBFWFRFTlRfTE9DS0VELCAxLAorCQkJCSAgICAgJmZhaWxlZF9zdGFydCwgbWFzayk7CisJCWlmIChlcnIgPT0gLUVFWElTVCAmJiAobWFzayAmIF9fR0ZQX1dBSVQpKSB7CisJCQl3YWl0X2V4dGVudF9iaXQodHJlZSwgZmFpbGVkX3N0YXJ0LCBlbmQsIEVYVEVOVF9MT0NLRUQpOworCQkJc3RhcnQgPSBmYWlsZWRfc3RhcnQ7CisJCX0gZWxzZSB7CisJCQlicmVhazsKKwkJfQorCQlXQVJOX09OKHN0YXJ0ID4gZW5kKTsKKwl9CisJcmV0dXJuIGVycjsKK30KKworaW50IHRyeV9sb2NrX2V4dGVudChzdHJ1Y3QgZXh0ZW50X2lvX3RyZWUgKnRyZWUsIHU2NCBzdGFydCwgdTY0IGVuZCwKKwkJICAgIGdmcF90IG1hc2spCit7CisJaW50IGVycjsKKwl1NjQgZmFpbGVkX3N0YXJ0OworCisJZXJyID0gc2V0X2V4dGVudF9iaXQodHJlZSwgc3RhcnQsIGVuZCwgRVhURU5UX0xPQ0tFRCwgMSwKKwkJCSAgICAgJmZhaWxlZF9zdGFydCwgbWFzayk7CisJaWYgKGVyciA9PSAtRUVYSVNUKSB7CisJCWlmIChmYWlsZWRfc3RhcnQgPiBzdGFydCkKKwkJCWNsZWFyX2V4dGVudF9iaXQodHJlZSwgc3RhcnQsIGZhaWxlZF9zdGFydCAtIDEsCisJCQkJCSBFWFRFTlRfTE9DS0VELCAxLCAwLCBtYXNrKTsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiAxOworfQorCitpbnQgdW5sb2NrX2V4dGVudChzdHJ1Y3QgZXh0ZW50X2lvX3RyZWUgKnRyZWUsIHU2NCBzdGFydCwgdTY0IGVuZCwKKwkJICBnZnBfdCBtYXNrKQoreworCXJldHVybiBjbGVhcl9leHRlbnRfYml0KHRyZWUsIHN0YXJ0LCBlbmQsIEVYVEVOVF9MT0NLRUQsIDEsIDAsIG1hc2spOworfQorCisvKgorICogaGVscGVyIGZ1bmN0aW9uIHRvIHNldCBwYWdlcyBhbmQgZXh0ZW50cyBpbiB0aGUgdHJlZSBkaXJ0eQorICovCitpbnQgc2V0X3JhbmdlX2RpcnR5KHN0cnVjdCBleHRlbnRfaW9fdHJlZSAqdHJlZSwgdTY0IHN0YXJ0LCB1NjQgZW5kKQoreworCXVuc2lnbmVkIGxvbmcgaW5kZXggPSBzdGFydCA+PiBQQUdFX0NBQ0hFX1NISUZUOworCXVuc2lnbmVkIGxvbmcgZW5kX2luZGV4ID0gZW5kID4+IFBBR0VfQ0FDSEVfU0hJRlQ7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisKKwl3aGlsZSAoaW5kZXggPD0gZW5kX2luZGV4KSB7CisJCXBhZ2UgPSBmaW5kX2dldF9wYWdlKHRyZWUtPm1hcHBpbmcsIGluZGV4KTsKKwkJQlVHX09OKCFwYWdlKTsKKwkJX19zZXRfcGFnZV9kaXJ0eV9ub2J1ZmZlcnMocGFnZSk7CisJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKKwkJaW5kZXgrKzsKKwl9CisJc2V0X2V4dGVudF9kaXJ0eSh0cmVlLCBzdGFydCwgZW5kLCBHRlBfTk9GUyk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBoZWxwZXIgZnVuY3Rpb24gdG8gc2V0IGJvdGggcGFnZXMgYW5kIGV4dGVudHMgaW4gdGhlIHRyZWUgd3JpdGViYWNrCisgKi8KK3N0YXRpYyBpbnQgc2V0X3JhbmdlX3dyaXRlYmFjayhzdHJ1Y3QgZXh0ZW50X2lvX3RyZWUgKnRyZWUsIHU2NCBzdGFydCwgdTY0IGVuZCkKK3sKKwl1bnNpZ25lZCBsb25nIGluZGV4ID0gc3RhcnQgPj4gUEFHRV9DQUNIRV9TSElGVDsKKwl1bnNpZ25lZCBsb25nIGVuZF9pbmRleCA9IGVuZCA+PiBQQUdFX0NBQ0hFX1NISUZUOworCXN0cnVjdCBwYWdlICpwYWdlOworCisJd2hpbGUgKGluZGV4IDw9IGVuZF9pbmRleCkgeworCQlwYWdlID0gZmluZF9nZXRfcGFnZSh0cmVlLT5tYXBwaW5nLCBpbmRleCk7CisJCUJVR19PTighcGFnZSk7CisJCXNldF9wYWdlX3dyaXRlYmFjayhwYWdlKTsKKwkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOworCQlpbmRleCsrOworCX0KKwlzZXRfZXh0ZW50X3dyaXRlYmFjayh0cmVlLCBzdGFydCwgZW5kLCBHRlBfTk9GUyk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBmaW5kIHRoZSBmaXJzdCBvZmZzZXQgaW4gdGhlIGlvIHRyZWUgd2l0aCAnYml0cycgc2V0LiB6ZXJvIGlzCisgKiByZXR1cm5lZCBpZiB3ZSBmaW5kIHNvbWV0aGluZywgYW5kICpzdGFydF9yZXQgYW5kICplbmRfcmV0IGFyZQorICogc2V0IHRvIHJlZmxlY3QgdGhlIHN0YXRlIHN0cnVjdCB0aGF0IHdhcyBmb3VuZC4KKyAqCisgKiBJZiBub3RoaW5nIHdhcyBmb3VuZCwgMSBpcyByZXR1cm5lZCwgPCAwIG9uIGVycm9yCisgKi8KK2ludCBmaW5kX2ZpcnN0X2V4dGVudF9iaXQoc3RydWN0IGV4dGVudF9pb190cmVlICp0cmVlLCB1NjQgc3RhcnQsCisJCQkgIHU2NCAqc3RhcnRfcmV0LCB1NjQgKmVuZF9yZXQsIGludCBiaXRzKQoreworCXN0cnVjdCByYl9ub2RlICpub2RlOworCXN0cnVjdCBleHRlbnRfc3RhdGUgKnN0YXRlOworCWludCByZXQgPSAxOworCisJc3Bpbl9sb2NrKCZ0cmVlLT5sb2NrKTsKKwkvKgorCSAqIHRoaXMgc2VhcmNoIHdpbGwgZmluZCBhbGwgdGhlIGV4dGVudHMgdGhhdCBlbmQgYWZ0ZXIKKwkgKiBvdXIgcmFuZ2Ugc3RhcnRzLgorCSAqLworCW5vZGUgPSB0cmVlX3NlYXJjaCh0cmVlLCBzdGFydCk7CisJaWYgKCFub2RlKQorCQlnb3RvIG91dDsKKworCXdoaWxlICgxKSB7CisJCXN0YXRlID0gcmJfZW50cnkobm9kZSwgc3RydWN0IGV4dGVudF9zdGF0ZSwgcmJfbm9kZSk7CisJCWlmIChzdGF0ZS0+ZW5kID49IHN0YXJ0ICYmIChzdGF0ZS0+c3RhdGUgJiBiaXRzKSkgeworCQkJKnN0YXJ0X3JldCA9IHN0YXRlLT5zdGFydDsKKwkJCSplbmRfcmV0ID0gc3RhdGUtPmVuZDsKKwkJCXJldCA9IDA7CisJCQlicmVhazsKKwkJfQorCQlub2RlID0gcmJfbmV4dChub2RlKTsKKwkJaWYgKCFub2RlKQorCQkJYnJlYWs7CisJfQorb3V0OgorCXNwaW5fdW5sb2NrKCZ0cmVlLT5sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCisvKiBmaW5kIHRoZSBmaXJzdCBzdGF0ZSBzdHJ1Y3Qgd2l0aCAnYml0cycgc2V0IGFmdGVyICdzdGFydCcsIGFuZAorICogcmV0dXJuIGl0LiAgdHJlZS0+bG9jayBtdXN0IGJlIGhlbGQuICBOVUxMIHdpbGwgcmV0dXJuZWQgaWYKKyAqIG5vdGhpbmcgd2FzIGZvdW5kIGFmdGVyICdzdGFydCcKKyAqLworc3RydWN0IGV4dGVudF9zdGF0ZSAqZmluZF9maXJzdF9leHRlbnRfYml0X3N0YXRlKHN0cnVjdCBleHRlbnRfaW9fdHJlZSAqdHJlZSwKKwkJCQkJCSB1NjQgc3RhcnQsIGludCBiaXRzKQoreworCXN0cnVjdCByYl9ub2RlICpub2RlOworCXN0cnVjdCBleHRlbnRfc3RhdGUgKnN0YXRlOworCisJLyoKKwkgKiB0aGlzIHNlYXJjaCB3aWxsIGZpbmQgYWxsIHRoZSBleHRlbnRzIHRoYXQgZW5kIGFmdGVyCisJICogb3VyIHJhbmdlIHN0YXJ0cy4KKwkgKi8KKwlub2RlID0gdHJlZV9zZWFyY2godHJlZSwgc3RhcnQpOworCWlmICghbm9kZSkKKwkJZ290byBvdXQ7CisKKwl3aGlsZSAoMSkgeworCQlzdGF0ZSA9IHJiX2VudHJ5KG5vZGUsIHN0cnVjdCBleHRlbnRfc3RhdGUsIHJiX25vZGUpOworCQlpZiAoc3RhdGUtPmVuZCA+PSBzdGFydCAmJiAoc3RhdGUtPnN0YXRlICYgYml0cykpCisJCQlyZXR1cm4gc3RhdGU7CisKKwkJbm9kZSA9IHJiX25leHQobm9kZSk7CisJCWlmICghbm9kZSkKKwkJCWJyZWFrOworCX0KK291dDoKKwlyZXR1cm4gTlVMTDsKK30KKworLyoKKyAqIGZpbmQgYSBjb250aWd1b3VzIHJhbmdlIG9mIGJ5dGVzIGluIHRoZSBmaWxlIG1hcmtlZCBhcyBkZWxhbGxvYywgbm90CisgKiBtb3JlIHRoYW4gJ21heF9ieXRlcycuICBzdGFydCBhbmQgZW5kIGFyZSB1c2VkIHRvIHJldHVybiB0aGUgcmFuZ2UsCisgKgorICogMSBpcyByZXR1cm5lZCBpZiB3ZSBmaW5kIHNvbWV0aGluZywgMCBpZiBub3RoaW5nIHdhcyBpbiB0aGUgdHJlZQorICovCitzdGF0aWMgbm9pbmxpbmUgdTY0IGZpbmRfZGVsYWxsb2NfcmFuZ2Uoc3RydWN0IGV4dGVudF9pb190cmVlICp0cmVlLAorCQkJCQl1NjQgKnN0YXJ0LCB1NjQgKmVuZCwgdTY0IG1heF9ieXRlcykKK3sKKwlzdHJ1Y3QgcmJfbm9kZSAqbm9kZTsKKwlzdHJ1Y3QgZXh0ZW50X3N0YXRlICpzdGF0ZTsKKwl1NjQgY3VyX3N0YXJ0ID0gKnN0YXJ0OworCXU2NCBmb3VuZCA9IDA7CisJdTY0IHRvdGFsX2J5dGVzID0gMDsKKworCXNwaW5fbG9jaygmdHJlZS0+bG9jayk7CisKKwkvKgorCSAqIHRoaXMgc2VhcmNoIHdpbGwgZmluZCBhbGwgdGhlIGV4dGVudHMgdGhhdCBlbmQgYWZ0ZXIKKwkgKiBvdXIgcmFuZ2Ugc3RhcnRzLgorCSAqLworCW5vZGUgPSB0cmVlX3NlYXJjaCh0cmVlLCBjdXJfc3RhcnQpOworCWlmICghbm9kZSkgeworCQlpZiAoIWZvdW5kKQorCQkJKmVuZCA9ICh1NjQpLTE7CisJCWdvdG8gb3V0OworCX0KKworCXdoaWxlICgxKSB7CisJCXN0YXRlID0gcmJfZW50cnkobm9kZSwgc3RydWN0IGV4dGVudF9zdGF0ZSwgcmJfbm9kZSk7CisJCWlmIChmb3VuZCAmJiAoc3RhdGUtPnN0YXJ0ICE9IGN1cl9zdGFydCB8fAorCQkJICAgICAgKHN0YXRlLT5zdGF0ZSAmIEVYVEVOVF9CT1VOREFSWSkpKSB7CisJCQlnb3RvIG91dDsKKwkJfQorCQlpZiAoIShzdGF0ZS0+c3RhdGUgJiBFWFRFTlRfREVMQUxMT0MpKSB7CisJCQlpZiAoIWZvdW5kKQorCQkJCSplbmQgPSBzdGF0ZS0+ZW5kOworCQkJZ290byBvdXQ7CisJCX0KKwkJaWYgKCFmb3VuZCkKKwkJCSpzdGFydCA9IHN0YXRlLT5zdGFydDsKKwkJZm91bmQrKzsKKwkJKmVuZCA9IHN0YXRlLT5lbmQ7CisJCWN1cl9zdGFydCA9IHN0YXRlLT5lbmQgKyAxOworCQlub2RlID0gcmJfbmV4dChub2RlKTsKKwkJaWYgKCFub2RlKQorCQkJYnJlYWs7CisJCXRvdGFsX2J5dGVzICs9IHN0YXRlLT5lbmQgLSBzdGF0ZS0+c3RhcnQgKyAxOworCQlpZiAodG90YWxfYnl0ZXMgPj0gbWF4X2J5dGVzKQorCQkJYnJlYWs7CisJfQorb3V0OgorCXNwaW5fdW5sb2NrKCZ0cmVlLT5sb2NrKTsKKwlyZXR1cm4gZm91bmQ7Cit9CisKK3N0YXRpYyBub2lubGluZSBpbnQgX191bmxvY2tfZm9yX2RlbGFsbG9jKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJCSAgc3RydWN0IHBhZ2UgKmxvY2tlZF9wYWdlLAorCQkJCQkgIHU2NCBzdGFydCwgdTY0IGVuZCkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBwYWdlICpwYWdlc1sxNl07CisJdW5zaWduZWQgbG9uZyBpbmRleCA9IHN0YXJ0ID4+IFBBR0VfQ0FDSEVfU0hJRlQ7CisJdW5zaWduZWQgbG9uZyBlbmRfaW5kZXggPSBlbmQgPj4gUEFHRV9DQUNIRV9TSElGVDsKKwl1bnNpZ25lZCBsb25nIG5yX3BhZ2VzID0gZW5kX2luZGV4IC0gaW5kZXggKyAxOworCWludCBpOworCisJaWYgKGluZGV4ID09IGxvY2tlZF9wYWdlLT5pbmRleCAmJiBlbmRfaW5kZXggPT0gaW5kZXgpCisJCXJldHVybiAwOworCisJd2hpbGUgKG5yX3BhZ2VzID4gMCkgeworCQlyZXQgPSBmaW5kX2dldF9wYWdlc19jb250aWcoaW5vZGUtPmlfbWFwcGluZywgaW5kZXgsCisJCQkJICAgICBtaW5fdCh1bnNpZ25lZCBsb25nLCBucl9wYWdlcywKKwkJCQkgICAgIEFSUkFZX1NJWkUocGFnZXMpKSwgcGFnZXMpOworCQlmb3IgKGkgPSAwOyBpIDwgcmV0OyBpKyspIHsKKwkJCWlmIChwYWdlc1tpXSAhPSBsb2NrZWRfcGFnZSkKKwkJCQl1bmxvY2tfcGFnZShwYWdlc1tpXSk7CisJCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZXNbaV0pOworCQl9CisJCW5yX3BhZ2VzIC09IHJldDsKKwkJaW5kZXggKz0gcmV0OworCQljb25kX3Jlc2NoZWQoKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBub2lubGluZSBpbnQgbG9ja19kZWxhbGxvY19wYWdlcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCQlzdHJ1Y3QgcGFnZSAqbG9ja2VkX3BhZ2UsCisJCQkJCXU2NCBkZWxhbGxvY19zdGFydCwKKwkJCQkJdTY0IGRlbGFsbG9jX2VuZCkKK3sKKwl1bnNpZ25lZCBsb25nIGluZGV4ID0gZGVsYWxsb2Nfc3RhcnQgPj4gUEFHRV9DQUNIRV9TSElGVDsKKwl1bnNpZ25lZCBsb25nIHN0YXJ0X2luZGV4ID0gaW5kZXg7CisJdW5zaWduZWQgbG9uZyBlbmRfaW5kZXggPSBkZWxhbGxvY19lbmQgPj4gUEFHRV9DQUNIRV9TSElGVDsKKwl1bnNpZ25lZCBsb25nIHBhZ2VzX2xvY2tlZCA9IDA7CisJc3RydWN0IHBhZ2UgKnBhZ2VzWzE2XTsKKwl1bnNpZ25lZCBsb25nIG5ycGFnZXM7CisJaW50IHJldDsKKwlpbnQgaTsKKworCS8qIHRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGxvY2tpbmcgdGhlIHN0YXJ0IGluZGV4ICovCisJaWYgKGluZGV4ID09IGxvY2tlZF9wYWdlLT5pbmRleCAmJiBpbmRleCA9PSBlbmRfaW5kZXgpCisJCXJldHVybiAwOworCisJLyogc2tpcCB0aGUgcGFnZSBhdCB0aGUgc3RhcnQgaW5kZXggKi8KKwlucnBhZ2VzID0gZW5kX2luZGV4IC0gaW5kZXggKyAxOworCXdoaWxlIChucnBhZ2VzID4gMCkgeworCQlyZXQgPSBmaW5kX2dldF9wYWdlc19jb250aWcoaW5vZGUtPmlfbWFwcGluZywgaW5kZXgsCisJCQkJICAgICBtaW5fdCh1bnNpZ25lZCBsb25nLAorCQkJCSAgICAgbnJwYWdlcywgQVJSQVlfU0laRShwYWdlcykpLCBwYWdlcyk7CisJCWlmIChyZXQgPT0gMCkgeworCQkJcmV0ID0gLUVBR0FJTjsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCQkvKiBub3cgd2UgaGF2ZSBhbiBhcnJheSBvZiBwYWdlcywgbG9jayB0aGVtIGFsbCAqLworCQlmb3IgKGkgPSAwOyBpIDwgcmV0OyBpKyspIHsKKwkJCS8qCisJCQkgKiB0aGUgY2FsbGVyIGlzIHRha2luZyByZXNwb25zaWJpbGl0eSBmb3IKKwkJCSAqIGxvY2tlZF9wYWdlCisJCQkgKi8KKwkJCWlmIChwYWdlc1tpXSAhPSBsb2NrZWRfcGFnZSkgeworCQkJCWxvY2tfcGFnZShwYWdlc1tpXSk7CisJCQkJaWYgKCFQYWdlRGlydHkocGFnZXNbaV0pIHx8CisJCQkJICAgIHBhZ2VzW2ldLT5tYXBwaW5nICE9IGlub2RlLT5pX21hcHBpbmcpIHsKKwkJCQkJcmV0ID0gLUVBR0FJTjsKKwkJCQkJdW5sb2NrX3BhZ2UocGFnZXNbaV0pOworCQkJCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZXNbaV0pOworCQkJCQlnb3RvIGRvbmU7CisJCQkJfQorCQkJfQorCQkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2VzW2ldKTsKKwkJCXBhZ2VzX2xvY2tlZCsrOworCQl9CisJCW5ycGFnZXMgLT0gcmV0OworCQlpbmRleCArPSByZXQ7CisJCWNvbmRfcmVzY2hlZCgpOworCX0KKwlyZXQgPSAwOworZG9uZToKKwlpZiAocmV0ICYmIHBhZ2VzX2xvY2tlZCkgeworCQlfX3VubG9ja19mb3JfZGVsYWxsb2MoaW5vZGUsIGxvY2tlZF9wYWdlLAorCQkJICAgICAgZGVsYWxsb2Nfc3RhcnQsCisJCQkgICAgICAoKHU2NCkoc3RhcnRfaW5kZXggKyBwYWdlc19sb2NrZWQgLSAxKSkgPDwKKwkJCSAgICAgIFBBR0VfQ0FDSEVfU0hJRlQpOworCX0KKwlyZXR1cm4gcmV0OworfQorCisvKgorICogZmluZCBhIGNvbnRpZ3VvdXMgcmFuZ2Ugb2YgYnl0ZXMgaW4gdGhlIGZpbGUgbWFya2VkIGFzIGRlbGFsbG9jLCBub3QKKyAqIG1vcmUgdGhhbiAnbWF4X2J5dGVzJy4gIHN0YXJ0IGFuZCBlbmQgYXJlIHVzZWQgdG8gcmV0dXJuIHRoZSByYW5nZSwKKyAqCisgKiAxIGlzIHJldHVybmVkIGlmIHdlIGZpbmQgc29tZXRoaW5nLCAwIGlmIG5vdGhpbmcgd2FzIGluIHRoZSB0cmVlCisgKi8KK3N0YXRpYyBub2lubGluZSB1NjQgZmluZF9sb2NrX2RlbGFsbG9jX3JhbmdlKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJCSAgICAgc3RydWN0IGV4dGVudF9pb190cmVlICp0cmVlLAorCQkJCQkgICAgIHN0cnVjdCBwYWdlICpsb2NrZWRfcGFnZSwKKwkJCQkJICAgICB1NjQgKnN0YXJ0LCB1NjQgKmVuZCwKKwkJCQkJICAgICB1NjQgbWF4X2J5dGVzKQoreworCXU2NCBkZWxhbGxvY19zdGFydDsKKwl1NjQgZGVsYWxsb2NfZW5kOworCXU2NCBmb3VuZDsKKwlpbnQgcmV0OworCWludCBsb29wcyA9IDA7CisKK2FnYWluOgorCS8qIHN0ZXAgb25lLCBmaW5kIGEgYnVuY2ggb2YgZGVsYWxsb2MgYnl0ZXMgc3RhcnRpbmcgYXQgc3RhcnQgKi8KKwlkZWxhbGxvY19zdGFydCA9ICpzdGFydDsKKwlkZWxhbGxvY19lbmQgPSAwOworCWZvdW5kID0gZmluZF9kZWxhbGxvY19yYW5nZSh0cmVlLCAmZGVsYWxsb2Nfc3RhcnQsICZkZWxhbGxvY19lbmQsCisJCQkJICAgIG1heF9ieXRlcyk7CisJaWYgKCFmb3VuZCB8fCBkZWxhbGxvY19lbmQgPD0gKnN0YXJ0KSB7CisJCSpzdGFydCA9IGRlbGFsbG9jX3N0YXJ0OworCQkqZW5kID0gZGVsYWxsb2NfZW5kOworCQlyZXR1cm4gZm91bmQ7CisJfQorCisJLyoKKwkgKiBzdGFydCBjb21lcyBmcm9tIHRoZSBvZmZzZXQgb2YgbG9ja2VkX3BhZ2UuICBXZSBoYXZlIHRvIGxvY2sKKwkgKiBwYWdlcyBpbiBvcmRlciwgc28gd2UgY2FuJ3QgcHJvY2VzcyBkZWxhbGxvYyBieXRlcyBiZWZvcmUKKwkgKiBsb2NrZWRfcGFnZQorCSAqLworCWlmIChkZWxhbGxvY19zdGFydCA8ICpzdGFydCkKKwkJZGVsYWxsb2Nfc3RhcnQgPSAqc3RhcnQ7CisKKwkvKgorCSAqIG1ha2Ugc3VyZSB0byBsaW1pdCB0aGUgbnVtYmVyIG9mIHBhZ2VzIHdlIHRyeSB0byBsb2NrIGRvd24KKwkgKiBpZiB3ZSdyZSBsb29waW5nLgorCSAqLworCWlmIChkZWxhbGxvY19lbmQgKyAxIC0gZGVsYWxsb2Nfc3RhcnQgPiBtYXhfYnl0ZXMgJiYgbG9vcHMpCisJCWRlbGFsbG9jX2VuZCA9IGRlbGFsbG9jX3N0YXJ0ICsgUEFHRV9DQUNIRV9TSVpFIC0gMTsKKworCS8qIHN0ZXAgdHdvLCBsb2NrIGFsbCB0aGUgcGFnZXMgYWZ0ZXIgdGhlIHBhZ2UgdGhhdCBoYXMgc3RhcnQgKi8KKwlyZXQgPSBsb2NrX2RlbGFsbG9jX3BhZ2VzKGlub2RlLCBsb2NrZWRfcGFnZSwKKwkJCQkgIGRlbGFsbG9jX3N0YXJ0LCBkZWxhbGxvY19lbmQpOworCWlmIChyZXQgPT0gLUVBR0FJTikgeworCQkvKiBzb21lIG9mIHRoZSBwYWdlcyBhcmUgZ29uZSwgbGV0cyBhdm9pZCBsb29waW5nIGJ5CisJCSAqIHNob3J0ZW5pbmcgdGhlIHNpemUgb2YgdGhlIGRlbGFsbG9jIHJhbmdlIHdlJ3JlIHNlYXJjaGluZworCQkgKi8KKwkJaWYgKCFsb29wcykgeworCQkJdW5zaWduZWQgbG9uZyBvZmZzZXQgPSAoKnN0YXJ0KSAmIChQQUdFX0NBQ0hFX1NJWkUgLSAxKTsKKwkJCW1heF9ieXRlcyA9IFBBR0VfQ0FDSEVfU0laRSAtIG9mZnNldDsKKwkJCWxvb3BzID0gMTsKKwkJCWdvdG8gYWdhaW47CisJCX0gZWxzZSB7CisJCQlmb3VuZCA9IDA7CisJCQlnb3RvIG91dF9mYWlsZWQ7CisJCX0KKwl9CisJQlVHX09OKHJldCk7CisKKwkvKiBzdGVwIHRocmVlLCBsb2NrIHRoZSBzdGF0ZSBiaXRzIGZvciB0aGUgd2hvbGUgcmFuZ2UgKi8KKwlsb2NrX2V4dGVudCh0cmVlLCBkZWxhbGxvY19zdGFydCwgZGVsYWxsb2NfZW5kLCBHRlBfTk9GUyk7CisKKwkvKiB0aGVuIHRlc3QgdG8gbWFrZSBzdXJlIGl0IGlzIGFsbCBzdGlsbCBkZWxhbGxvYyAqLworCXJldCA9IHRlc3RfcmFuZ2VfYml0KHRyZWUsIGRlbGFsbG9jX3N0YXJ0LCBkZWxhbGxvY19lbmQsCisJCQkgICAgIEVYVEVOVF9ERUxBTExPQywgMSk7CisJaWYgKCFyZXQpIHsKKwkJdW5sb2NrX2V4dGVudCh0cmVlLCBkZWxhbGxvY19zdGFydCwgZGVsYWxsb2NfZW5kLCBHRlBfTk9GUyk7CisJCV9fdW5sb2NrX2Zvcl9kZWxhbGxvYyhpbm9kZSwgbG9ja2VkX3BhZ2UsCisJCQkgICAgICBkZWxhbGxvY19zdGFydCwgZGVsYWxsb2NfZW5kKTsKKwkJY29uZF9yZXNjaGVkKCk7CisJCWdvdG8gYWdhaW47CisJfQorCSpzdGFydCA9IGRlbGFsbG9jX3N0YXJ0OworCSplbmQgPSBkZWxhbGxvY19lbmQ7CitvdXRfZmFpbGVkOgorCXJldHVybiBmb3VuZDsKK30KKworaW50IGV4dGVudF9jbGVhcl91bmxvY2tfZGVsYWxsb2Moc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQlzdHJ1Y3QgZXh0ZW50X2lvX3RyZWUgKnRyZWUsCisJCQkJdTY0IHN0YXJ0LCB1NjQgZW5kLCBzdHJ1Y3QgcGFnZSAqbG9ja2VkX3BhZ2UsCisJCQkJaW50IHVubG9ja19wYWdlcywKKwkJCQlpbnQgY2xlYXJfdW5sb2NrLAorCQkJCWludCBjbGVhcl9kZWxhbGxvYywgaW50IGNsZWFyX2RpcnR5LAorCQkJCWludCBzZXRfd3JpdGViYWNrLAorCQkJCWludCBlbmRfd3JpdGViYWNrKQoreworCWludCByZXQ7CisJc3RydWN0IHBhZ2UgKnBhZ2VzWzE2XTsKKwl1bnNpZ25lZCBsb25nIGluZGV4ID0gc3RhcnQgPj4gUEFHRV9DQUNIRV9TSElGVDsKKwl1bnNpZ25lZCBsb25nIGVuZF9pbmRleCA9IGVuZCA+PiBQQUdFX0NBQ0hFX1NISUZUOworCXVuc2lnbmVkIGxvbmcgbnJfcGFnZXMgPSBlbmRfaW5kZXggLSBpbmRleCArIDE7CisJaW50IGk7CisJaW50IGNsZWFyX2JpdHMgPSAwOworCisJaWYgKGNsZWFyX3VubG9jaykKKwkJY2xlYXJfYml0cyB8PSBFWFRFTlRfTE9DS0VEOworCWlmIChjbGVhcl9kaXJ0eSkKKwkJY2xlYXJfYml0cyB8PSBFWFRFTlRfRElSVFk7CisKKwlpZiAoY2xlYXJfZGVsYWxsb2MpCisJCWNsZWFyX2JpdHMgfD0gRVhURU5UX0RFTEFMTE9DOworCisJY2xlYXJfZXh0ZW50X2JpdCh0cmVlLCBzdGFydCwgZW5kLCBjbGVhcl9iaXRzLCAxLCAwLCBHRlBfTk9GUyk7CisJaWYgKCEodW5sb2NrX3BhZ2VzIHx8IGNsZWFyX2RpcnR5IHx8IHNldF93cml0ZWJhY2sgfHwgZW5kX3dyaXRlYmFjaykpCisJCXJldHVybiAwOworCisJd2hpbGUgKG5yX3BhZ2VzID4gMCkgeworCQlyZXQgPSBmaW5kX2dldF9wYWdlc19jb250aWcoaW5vZGUtPmlfbWFwcGluZywgaW5kZXgsCisJCQkJICAgICBtaW5fdCh1bnNpZ25lZCBsb25nLAorCQkJCSAgICAgbnJfcGFnZXMsIEFSUkFZX1NJWkUocGFnZXMpKSwgcGFnZXMpOworCQlmb3IgKGkgPSAwOyBpIDwgcmV0OyBpKyspIHsKKwkJCWlmIChwYWdlc1tpXSA9PSBsb2NrZWRfcGFnZSkgeworCQkJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlc1tpXSk7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoY2xlYXJfZGlydHkpCisJCQkJY2xlYXJfcGFnZV9kaXJ0eV9mb3JfaW8ocGFnZXNbaV0pOworCQkJaWYgKHNldF93cml0ZWJhY2spCisJCQkJc2V0X3BhZ2Vfd3JpdGViYWNrKHBhZ2VzW2ldKTsKKwkJCWlmIChlbmRfd3JpdGViYWNrKQorCQkJCWVuZF9wYWdlX3dyaXRlYmFjayhwYWdlc1tpXSk7CisJCQlpZiAodW5sb2NrX3BhZ2VzKQorCQkJCXVubG9ja19wYWdlKHBhZ2VzW2ldKTsKKwkJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlc1tpXSk7CisJCX0KKwkJbnJfcGFnZXMgLT0gcmV0OworCQlpbmRleCArPSByZXQ7CisJCWNvbmRfcmVzY2hlZCgpOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGNvdW50IHRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIHRyZWUgdGhhdCBoYXZlIGEgZ2l2ZW4gYml0KHMpCisgKiBzZXQuICBUaGlzIGNhbiBiZSBmYWlybHkgc2xvdywgZXhjZXB0IGZvciBFWFRFTlRfRElSVFkgd2hpY2ggaXMKKyAqIGNhY2hlZC4gIFRoZSB0b3RhbCBudW1iZXIgZm91bmQgaXMgcmV0dXJuZWQuCisgKi8KK3U2NCBjb3VudF9yYW5nZV9iaXRzKHN0cnVjdCBleHRlbnRfaW9fdHJlZSAqdHJlZSwKKwkJICAgICB1NjQgKnN0YXJ0LCB1NjQgc2VhcmNoX2VuZCwgdTY0IG1heF9ieXRlcywKKwkJICAgICB1bnNpZ25lZCBsb25nIGJpdHMpCit7CisJc3RydWN0IHJiX25vZGUgKm5vZGU7CisJc3RydWN0IGV4dGVudF9zdGF0ZSAqc3RhdGU7CisJdTY0IGN1cl9zdGFydCA9ICpzdGFydDsKKwl1NjQgdG90YWxfYnl0ZXMgPSAwOworCWludCBmb3VuZCA9IDA7CisKKwlpZiAoc2VhcmNoX2VuZCA8PSBjdXJfc3RhcnQpIHsKKwkJV0FSTl9PTigxKTsKKwkJcmV0dXJuIDA7CisJfQorCisJc3Bpbl9sb2NrKCZ0cmVlLT5sb2NrKTsKKwlpZiAoY3VyX3N0YXJ0ID09IDAgJiYgYml0cyA9PSBFWFRFTlRfRElSVFkpIHsKKwkJdG90YWxfYnl0ZXMgPSB0cmVlLT5kaXJ0eV9ieXRlczsKKwkJZ290byBvdXQ7CisJfQorCS8qCisJICogdGhpcyBzZWFyY2ggd2lsbCBmaW5kIGFsbCB0aGUgZXh0ZW50cyB0aGF0IGVuZCBhZnRlcgorCSAqIG91ciByYW5nZSBzdGFydHMuCisJICovCisJbm9kZSA9IHRyZWVfc2VhcmNoKHRyZWUsIGN1cl9zdGFydCk7CisJaWYgKCFub2RlKQorCQlnb3RvIG91dDsKKworCXdoaWxlICgxKSB7CisJCXN0YXRlID0gcmJfZW50cnkobm9kZSwgc3RydWN0IGV4dGVudF9zdGF0ZSwgcmJfbm9kZSk7CisJCWlmIChzdGF0ZS0+c3RhcnQgPiBzZWFyY2hfZW5kKQorCQkJYnJlYWs7CisJCWlmIChzdGF0ZS0+ZW5kID49IGN1cl9zdGFydCAmJiAoc3RhdGUtPnN0YXRlICYgYml0cykpIHsKKwkJCXRvdGFsX2J5dGVzICs9IG1pbihzZWFyY2hfZW5kLCBzdGF0ZS0+ZW5kKSArIDEgLQorCQkJCSAgICAgICBtYXgoY3VyX3N0YXJ0LCBzdGF0ZS0+c3RhcnQpOworCQkJaWYgKHRvdGFsX2J5dGVzID49IG1heF9ieXRlcykKKwkJCQlicmVhazsKKwkJCWlmICghZm91bmQpIHsKKwkJCQkqc3RhcnQgPSBzdGF0ZS0+c3RhcnQ7CisJCQkJZm91bmQgPSAxOworCQkJfQorCQl9CisJCW5vZGUgPSByYl9uZXh0KG5vZGUpOworCQlpZiAoIW5vZGUpCisJCQlicmVhazsKKwl9CitvdXQ6CisJc3Bpbl91bmxvY2soJnRyZWUtPmxvY2spOworCXJldHVybiB0b3RhbF9ieXRlczsKK30KKworI2lmIDAKKy8qCisgKiBoZWxwZXIgZnVuY3Rpb24gdG8gbG9jayBib3RoIHBhZ2VzIGFuZCBleHRlbnRzIGluIHRoZSB0cmVlLgorICogcGFnZXMgbXVzdCBiZSBsb2NrZWQgZmlyc3QuCisgKi8KK3N0YXRpYyBpbnQgbG9ja19yYW5nZShzdHJ1Y3QgZXh0ZW50X2lvX3RyZWUgKnRyZWUsIHU2NCBzdGFydCwgdTY0IGVuZCkKK3sKKwl1bnNpZ25lZCBsb25nIGluZGV4ID0gc3RhcnQgPj4gUEFHRV9DQUNIRV9TSElGVDsKKwl1bnNpZ25lZCBsb25nIGVuZF9pbmRleCA9IGVuZCA+PiBQQUdFX0NBQ0hFX1NISUZUOworCXN0cnVjdCBwYWdlICpwYWdlOworCWludCBlcnI7CisKKwl3aGlsZSAoaW5kZXggPD0gZW5kX2luZGV4KSB7CisJCXBhZ2UgPSBncmFiX2NhY2hlX3BhZ2UodHJlZS0+bWFwcGluZywgaW5kZXgpOworCQlpZiAoIXBhZ2UpIHsKKwkJCWVyciA9IC1FTk9NRU07CisJCQlnb3RvIGZhaWxlZDsKKwkJfQorCQlpZiAoSVNfRVJSKHBhZ2UpKSB7CisJCQllcnIgPSBQVFJfRVJSKHBhZ2UpOworCQkJZ290byBmYWlsZWQ7CisJCX0KKwkJaW5kZXgrKzsKKwl9CisJbG9ja19leHRlbnQodHJlZSwgc3RhcnQsIGVuZCwgR0ZQX05PRlMpOworCXJldHVybiAwOworCitmYWlsZWQ6CisJLyoKKwkgKiB3ZSBmYWlsZWQgYWJvdmUgaW4gZ2V0dGluZyB0aGUgcGFnZSBhdCAnaW5kZXgnLCBzbyB3ZSB1bmRvIGhlcmUKKwkgKiB1cCB0byBidXQgbm90IGluY2x1ZGluZyB0aGUgcGFnZSBhdCAnaW5kZXgnCisJICovCisJZW5kX2luZGV4ID0gaW5kZXg7CisJaW5kZXggPSBzdGFydCA+PiBQQUdFX0NBQ0hFX1NISUZUOworCXdoaWxlIChpbmRleCA8IGVuZF9pbmRleCkgeworCQlwYWdlID0gZmluZF9nZXRfcGFnZSh0cmVlLT5tYXBwaW5nLCBpbmRleCk7CisJCXVubG9ja19wYWdlKHBhZ2UpOworCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CisJCWluZGV4Kys7CisJfQorCXJldHVybiBlcnI7Cit9CisKKy8qCisgKiBoZWxwZXIgZnVuY3Rpb24gdG8gdW5sb2NrIGJvdGggcGFnZXMgYW5kIGV4dGVudHMgaW4gdGhlIHRyZWUuCisgKi8KK3N0YXRpYyBpbnQgdW5sb2NrX3JhbmdlKHN0cnVjdCBleHRlbnRfaW9fdHJlZSAqdHJlZSwgdTY0IHN0YXJ0LCB1NjQgZW5kKQoreworCXVuc2lnbmVkIGxvbmcgaW5kZXggPSBzdGFydCA+PiBQQUdFX0NBQ0hFX1NISUZUOworCXVuc2lnbmVkIGxvbmcgZW5kX2luZGV4ID0gZW5kID4+IFBBR0VfQ0FDSEVfU0hJRlQ7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisKKwl3aGlsZSAoaW5kZXggPD0gZW5kX2luZGV4KSB7CisJCXBhZ2UgPSBmaW5kX2dldF9wYWdlKHRyZWUtPm1hcHBpbmcsIGluZGV4KTsKKwkJdW5sb2NrX3BhZ2UocGFnZSk7CisJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKKwkJaW5kZXgrKzsKKwl9CisJdW5sb2NrX2V4dGVudCh0cmVlLCBzdGFydCwgZW5kLCBHRlBfTk9GUyk7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworLyoKKyAqIHNldCB0aGUgcHJpdmF0ZSBmaWVsZCBmb3IgYSBnaXZlbiBieXRlIG9mZnNldCBpbiB0aGUgdHJlZS4gIElmIHRoZXJlIGlzbid0CisgKiBhbiBleHRlbnRfc3RhdGUgdGhlcmUgYWxyZWFkeSwgdGhpcyBkb2VzIG5vdGhpbmcuCisgKi8KK2ludCBzZXRfc3RhdGVfcHJpdmF0ZShzdHJ1Y3QgZXh0ZW50X2lvX3RyZWUgKnRyZWUsIHU2NCBzdGFydCwgdTY0IHByaXZhdGUpCit7CisJc3RydWN0IHJiX25vZGUgKm5vZGU7CisJc3RydWN0IGV4dGVudF9zdGF0ZSAqc3RhdGU7CisJaW50IHJldCA9IDA7CisKKwlzcGluX2xvY2soJnRyZWUtPmxvY2spOworCS8qCisJICogdGhpcyBzZWFyY2ggd2lsbCBmaW5kIGFsbCB0aGUgZXh0ZW50cyB0aGF0IGVuZCBhZnRlcgorCSAqIG91ciByYW5nZSBzdGFydHMuCisJICovCisJbm9kZSA9IHRyZWVfc2VhcmNoKHRyZWUsIHN0YXJ0KTsKKwlpZiAoIW5vZGUpIHsKKwkJcmV0ID0gLUVOT0VOVDsKKwkJZ290byBvdXQ7CisJfQorCXN0YXRlID0gcmJfZW50cnkobm9kZSwgc3RydWN0IGV4dGVudF9zdGF0ZSwgcmJfbm9kZSk7CisJaWYgKHN0YXRlLT5zdGFydCAhPSBzdGFydCkgeworCQlyZXQgPSAtRU5PRU5UOworCQlnb3RvIG91dDsKKwl9CisJc3RhdGUtPnByaXZhdGUgPSBwcml2YXRlOworb3V0OgorCXNwaW5fdW5sb2NrKCZ0cmVlLT5sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCitpbnQgZ2V0X3N0YXRlX3ByaXZhdGUoc3RydWN0IGV4dGVudF9pb190cmVlICp0cmVlLCB1NjQgc3RhcnQsIHU2NCAqcHJpdmF0ZSkKK3sKKwlzdHJ1Y3QgcmJfbm9kZSAqbm9kZTsKKwlzdHJ1Y3QgZXh0ZW50X3N0YXRlICpzdGF0ZTsKKwlpbnQgcmV0ID0gMDsKKworCXNwaW5fbG9jaygmdHJlZS0+bG9jayk7CisJLyoKKwkgKiB0aGlzIHNlYXJjaCB3aWxsIGZpbmQgYWxsIHRoZSBleHRlbnRzIHRoYXQgZW5kIGFmdGVyCisJICogb3VyIHJhbmdlIHN0YXJ0cy4KKwkgKi8KKwlub2RlID0gdHJlZV9zZWFyY2godHJlZSwgc3RhcnQpOworCWlmICghbm9kZSkgeworCQlyZXQgPSAtRU5PRU5UOworCQlnb3RvIG91dDsKKwl9CisJc3RhdGUgPSByYl9lbnRyeShub2RlLCBzdHJ1Y3QgZXh0ZW50X3N0YXRlLCByYl9ub2RlKTsKKwlpZiAoc3RhdGUtPnN0YXJ0ICE9IHN0YXJ0KSB7CisJCXJldCA9IC1FTk9FTlQ7CisJCWdvdG8gb3V0OworCX0KKwkqcHJpdmF0ZSA9IHN0YXRlLT5wcml2YXRlOworb3V0OgorCXNwaW5fdW5sb2NrKCZ0cmVlLT5sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogc2VhcmNoZXMgYSByYW5nZSBpbiB0aGUgc3RhdGUgdHJlZSBmb3IgYSBnaXZlbiBtYXNrLgorICogSWYgJ2ZpbGxlZCcgPT0gMSwgdGhpcyByZXR1cm5zIDEgb25seSBpZiBldmVyeSBleHRlbnQgaW4gdGhlIHRyZWUKKyAqIGhhcyB0aGUgYml0cyBzZXQuICBPdGhlcndpc2UsIDEgaXMgcmV0dXJuZWQgaWYgYW55IGJpdCBpbiB0aGUKKyAqIHJhbmdlIGlzIGZvdW5kIHNldC4KKyAqLworaW50IHRlc3RfcmFuZ2VfYml0KHN0cnVjdCBleHRlbnRfaW9fdHJlZSAqdHJlZSwgdTY0IHN0YXJ0LCB1NjQgZW5kLAorCQkgICBpbnQgYml0cywgaW50IGZpbGxlZCkKK3sKKwlzdHJ1Y3QgZXh0ZW50X3N0YXRlICpzdGF0ZSA9IE5VTEw7CisJc3RydWN0IHJiX25vZGUgKm5vZGU7CisJaW50IGJpdHNldCA9IDA7CisKKwlzcGluX2xvY2soJnRyZWUtPmxvY2spOworCW5vZGUgPSB0cmVlX3NlYXJjaCh0cmVlLCBzdGFydCk7CisJd2hpbGUgKG5vZGUgJiYgc3RhcnQgPD0gZW5kKSB7CisJCXN0YXRlID0gcmJfZW50cnkobm9kZSwgc3RydWN0IGV4dGVudF9zdGF0ZSwgcmJfbm9kZSk7CisKKwkJaWYgKGZpbGxlZCAmJiBzdGF0ZS0+c3RhcnQgPiBzdGFydCkgeworCQkJYml0c2V0ID0gMDsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKHN0YXRlLT5zdGFydCA+IGVuZCkKKwkJCWJyZWFrOworCisJCWlmIChzdGF0ZS0+c3RhdGUgJiBiaXRzKSB7CisJCQliaXRzZXQgPSAxOworCQkJaWYgKCFmaWxsZWQpCisJCQkJYnJlYWs7CisJCX0gZWxzZSBpZiAoZmlsbGVkKSB7CisJCQliaXRzZXQgPSAwOworCQkJYnJlYWs7CisJCX0KKwkJc3RhcnQgPSBzdGF0ZS0+ZW5kICsgMTsKKwkJaWYgKHN0YXJ0ID4gZW5kKQorCQkJYnJlYWs7CisJCW5vZGUgPSByYl9uZXh0KG5vZGUpOworCQlpZiAoIW5vZGUpIHsKKwkJCWlmIChmaWxsZWQpCisJCQkJYml0c2V0ID0gMDsKKwkJCWJyZWFrOworCQl9CisJfQorCXNwaW5fdW5sb2NrKCZ0cmVlLT5sb2NrKTsKKwlyZXR1cm4gYml0c2V0OworfQorCisvKgorICogaGVscGVyIGZ1bmN0aW9uIHRvIHNldCBhIGdpdmVuIHBhZ2UgdXAgdG8gZGF0ZSBpZiBhbGwgdGhlCisgKiBleHRlbnRzIGluIHRoZSB0cmVlIGZvciB0aGF0IHBhZ2UgYXJlIHVwIHRvIGRhdGUKKyAqLworc3RhdGljIGludCBjaGVja19wYWdlX3VwdG9kYXRlKHN0cnVjdCBleHRlbnRfaW9fdHJlZSAqdHJlZSwKKwkJCSAgICAgICBzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwl1NjQgc3RhcnQgPSAodTY0KXBhZ2UtPmluZGV4IDw8IFBBR0VfQ0FDSEVfU0hJRlQ7CisJdTY0IGVuZCA9IHN0YXJ0ICsgUEFHRV9DQUNIRV9TSVpFIC0gMTsKKwlpZiAodGVzdF9yYW5nZV9iaXQodHJlZSwgc3RhcnQsIGVuZCwgRVhURU5UX1VQVE9EQVRFLCAxKSkKKwkJU2V0UGFnZVVwdG9kYXRlKHBhZ2UpOworCXJldHVybiAwOworfQorCisvKgorICogaGVscGVyIGZ1bmN0aW9uIHRvIHVubG9jayBhIHBhZ2UgaWYgYWxsIHRoZSBleHRlbnRzIGluIHRoZSB0cmVlCisgKiBmb3IgdGhhdCBwYWdlIGFyZSB1bmxvY2tlZAorICovCitzdGF0aWMgaW50IGNoZWNrX3BhZ2VfbG9ja2VkKHN0cnVjdCBleHRlbnRfaW9fdHJlZSAqdHJlZSwKKwkJCSAgICAgc3RydWN0IHBhZ2UgKnBhZ2UpCit7CisJdTY0IHN0YXJ0ID0gKHU2NClwYWdlLT5pbmRleCA8PCBQQUdFX0NBQ0hFX1NISUZUOworCXU2NCBlbmQgPSBzdGFydCArIFBBR0VfQ0FDSEVfU0laRSAtIDE7CisJaWYgKCF0ZXN0X3JhbmdlX2JpdCh0cmVlLCBzdGFydCwgZW5kLCBFWFRFTlRfTE9DS0VELCAwKSkKKwkJdW5sb2NrX3BhZ2UocGFnZSk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBoZWxwZXIgZnVuY3Rpb24gdG8gZW5kIHBhZ2Ugd3JpdGViYWNrIGlmIGFsbCB0aGUgZXh0ZW50cworICogaW4gdGhlIHRyZWUgZm9yIHRoYXQgcGFnZSBhcmUgZG9uZSB3aXRoIHdyaXRlYmFjaworICovCitzdGF0aWMgaW50IGNoZWNrX3BhZ2Vfd3JpdGViYWNrKHN0cnVjdCBleHRlbnRfaW9fdHJlZSAqdHJlZSwKKwkJCSAgICAgc3RydWN0IHBhZ2UgKnBhZ2UpCit7CisJdTY0IHN0YXJ0ID0gKHU2NClwYWdlLT5pbmRleCA8PCBQQUdFX0NBQ0hFX1NISUZUOworCXU2NCBlbmQgPSBzdGFydCArIFBBR0VfQ0FDSEVfU0laRSAtIDE7CisJaWYgKCF0ZXN0X3JhbmdlX2JpdCh0cmVlLCBzdGFydCwgZW5kLCBFWFRFTlRfV1JJVEVCQUNLLCAwKSkKKwkJZW5kX3BhZ2Vfd3JpdGViYWNrKHBhZ2UpOworCXJldHVybiAwOworfQorCisvKiBsb3RzIGFuZCBsb3RzIG9mIHJvb20gZm9yIHBlcmZvcm1hbmNlIGZpeGVzIGluIHRoZSBlbmRfYmlvIGZ1bmNzICovCisKKy8qCisgKiBhZnRlciBhIHdyaXRlcGFnZSBJTyBpcyBkb25lLCB3ZSBuZWVkIHRvOgorICogY2xlYXIgdGhlIHVwdG9kYXRlIGJpdHMgb24gZXJyb3IKKyAqIGNsZWFyIHRoZSB3cml0ZWJhY2sgYml0cyBpbiB0aGUgZXh0ZW50IHRyZWUgZm9yIHRoaXMgSU8KKyAqIGVuZF9wYWdlX3dyaXRlYmFjayBpZiB0aGUgcGFnZSBoYXMgbm8gbW9yZSBwZW5kaW5nIElPCisgKgorICogU2NoZWR1bGluZyBpcyBub3QgYWxsb3dlZCwgc28gdGhlIGV4dGVudCBzdGF0ZSB0cmVlIGlzIGV4cGVjdGVkCisgKiB0byBoYXZlIG9uZSBhbmQgb25seSBvbmUgb2JqZWN0IGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBJTy4KKyAqLworc3RhdGljIHZvaWQgZW5kX2Jpb19leHRlbnRfd3JpdGVwYWdlKHN0cnVjdCBiaW8gKmJpbywgaW50IGVycikKK3sKKwlpbnQgdXB0b2RhdGUgPSBlcnIgPT0gMDsKKwlzdHJ1Y3QgYmlvX3ZlYyAqYnZlYyA9IGJpby0+YmlfaW9fdmVjICsgYmlvLT5iaV92Y250IC0gMTsKKwlzdHJ1Y3QgZXh0ZW50X2lvX3RyZWUgKnRyZWU7CisJdTY0IHN0YXJ0OworCXU2NCBlbmQ7CisJaW50IHdob2xlX3BhZ2U7CisJaW50IHJldDsKKworCWRvIHsKKwkJc3RydWN0IHBhZ2UgKnBhZ2UgPSBidmVjLT5idl9wYWdlOworCQl0cmVlID0gJkJUUkZTX0kocGFnZS0+bWFwcGluZy0+aG9zdCktPmlvX3RyZWU7CisKKwkJc3RhcnQgPSAoKHU2NClwYWdlLT5pbmRleCA8PCBQQUdFX0NBQ0hFX1NISUZUKSArCisJCQkgYnZlYy0+YnZfb2Zmc2V0OworCQllbmQgPSBzdGFydCArIGJ2ZWMtPmJ2X2xlbiAtIDE7CisKKwkJaWYgKGJ2ZWMtPmJ2X29mZnNldCA9PSAwICYmIGJ2ZWMtPmJ2X2xlbiA9PSBQQUdFX0NBQ0hFX1NJWkUpCisJCQl3aG9sZV9wYWdlID0gMTsKKwkJZWxzZQorCQkJd2hvbGVfcGFnZSA9IDA7CisKKwkJaWYgKC0tYnZlYyA+PSBiaW8tPmJpX2lvX3ZlYykKKwkJCXByZWZldGNodygmYnZlYy0+YnZfcGFnZS0+ZmxhZ3MpOworCQlpZiAodHJlZS0+b3BzICYmIHRyZWUtPm9wcy0+d3JpdGVwYWdlX2VuZF9pb19ob29rKSB7CisJCQlyZXQgPSB0cmVlLT5vcHMtPndyaXRlcGFnZV9lbmRfaW9faG9vayhwYWdlLCBzdGFydCwKKwkJCQkJCSAgICAgICBlbmQsIE5VTEwsIHVwdG9kYXRlKTsKKwkJCWlmIChyZXQpCisJCQkJdXB0b2RhdGUgPSAwOworCQl9CisKKwkJaWYgKCF1cHRvZGF0ZSAmJiB0cmVlLT5vcHMgJiYKKwkJICAgIHRyZWUtPm9wcy0+d3JpdGVwYWdlX2lvX2ZhaWxlZF9ob29rKSB7CisJCQlyZXQgPSB0cmVlLT5vcHMtPndyaXRlcGFnZV9pb19mYWlsZWRfaG9vayhiaW8sIHBhZ2UsCisJCQkJCQkJIHN0YXJ0LCBlbmQsIE5VTEwpOworCQkJaWYgKHJldCA9PSAwKSB7CisJCQkJdXB0b2RhdGUgPSAoZXJyID09IDApOworCQkJCWNvbnRpbnVlOworCQkJfQorCQl9CisKKwkJaWYgKCF1cHRvZGF0ZSkgeworCQkJY2xlYXJfZXh0ZW50X3VwdG9kYXRlKHRyZWUsIHN0YXJ0LCBlbmQsIEdGUF9BVE9NSUMpOworCQkJQ2xlYXJQYWdlVXB0b2RhdGUocGFnZSk7CisJCQlTZXRQYWdlRXJyb3IocGFnZSk7CisJCX0KKworCQljbGVhcl9leHRlbnRfd3JpdGViYWNrKHRyZWUsIHN0YXJ0LCBlbmQsIEdGUF9BVE9NSUMpOworCisJCWlmICh3aG9sZV9wYWdlKQorCQkJZW5kX3BhZ2Vfd3JpdGViYWNrKHBhZ2UpOworCQllbHNlCisJCQljaGVja19wYWdlX3dyaXRlYmFjayh0cmVlLCBwYWdlKTsKKwl9IHdoaWxlIChidmVjID49IGJpby0+YmlfaW9fdmVjKTsKKworCWJpb19wdXQoYmlvKTsKK30KKworLyoKKyAqIGFmdGVyIGEgcmVhZHBhZ2UgSU8gaXMgZG9uZSwgd2UgbmVlZCB0bzoKKyAqIGNsZWFyIHRoZSB1cHRvZGF0ZSBiaXRzIG9uIGVycm9yCisgKiBzZXQgdGhlIHVwdG9kYXRlIGJpdHMgaWYgdGhpbmdzIHdvcmtlZAorICogc2V0IHRoZSBwYWdlIHVwIHRvIGRhdGUgaWYgYWxsIGV4dGVudHMgaW4gdGhlIHRyZWUgYXJlIHVwdG9kYXRlCisgKiBjbGVhciB0aGUgbG9jayBiaXQgaW4gdGhlIGV4dGVudCB0cmVlCisgKiB1bmxvY2sgdGhlIHBhZ2UgaWYgdGhlcmUgYXJlIG5vIG90aGVyIGV4dGVudHMgbG9ja2VkIGZvciBpdAorICoKKyAqIFNjaGVkdWxpbmcgaXMgbm90IGFsbG93ZWQsIHNvIHRoZSBleHRlbnQgc3RhdGUgdHJlZSBpcyBleHBlY3RlZAorICogdG8gaGF2ZSBvbmUgYW5kIG9ubHkgb25lIG9iamVjdCBjb3JyZXNwb25kaW5nIHRvIHRoaXMgSU8uCisgKi8KK3N0YXRpYyB2b2lkIGVuZF9iaW9fZXh0ZW50X3JlYWRwYWdlKHN0cnVjdCBiaW8gKmJpbywgaW50IGVycikKK3sKKwlpbnQgdXB0b2RhdGUgPSB0ZXN0X2JpdChCSU9fVVBUT0RBVEUsICZiaW8tPmJpX2ZsYWdzKTsKKwlzdHJ1Y3QgYmlvX3ZlYyAqYnZlYyA9IGJpby0+YmlfaW9fdmVjICsgYmlvLT5iaV92Y250IC0gMTsKKwlzdHJ1Y3QgZXh0ZW50X2lvX3RyZWUgKnRyZWU7CisJdTY0IHN0YXJ0OworCXU2NCBlbmQ7CisJaW50IHdob2xlX3BhZ2U7CisJaW50IHJldDsKKworCWlmIChlcnIpCisJCXVwdG9kYXRlID0gMDsKKworCWRvIHsKKwkJc3RydWN0IHBhZ2UgKnBhZ2UgPSBidmVjLT5idl9wYWdlOworCQl0cmVlID0gJkJUUkZTX0kocGFnZS0+bWFwcGluZy0+aG9zdCktPmlvX3RyZWU7CisKKwkJc3RhcnQgPSAoKHU2NClwYWdlLT5pbmRleCA8PCBQQUdFX0NBQ0hFX1NISUZUKSArCisJCQlidmVjLT5idl9vZmZzZXQ7CisJCWVuZCA9IHN0YXJ0ICsgYnZlYy0+YnZfbGVuIC0gMTsKKworCQlpZiAoYnZlYy0+YnZfb2Zmc2V0ID09IDAgJiYgYnZlYy0+YnZfbGVuID09IFBBR0VfQ0FDSEVfU0laRSkKKwkJCXdob2xlX3BhZ2UgPSAxOworCQllbHNlCisJCQl3aG9sZV9wYWdlID0gMDsKKworCQlpZiAoLS1idmVjID49IGJpby0+YmlfaW9fdmVjKQorCQkJcHJlZmV0Y2h3KCZidmVjLT5idl9wYWdlLT5mbGFncyk7CisKKwkJaWYgKHVwdG9kYXRlICYmIHRyZWUtPm9wcyAmJiB0cmVlLT5vcHMtPnJlYWRwYWdlX2VuZF9pb19ob29rKSB7CisJCQlyZXQgPSB0cmVlLT5vcHMtPnJlYWRwYWdlX2VuZF9pb19ob29rKHBhZ2UsIHN0YXJ0LCBlbmQsCisJCQkJCQkJICAgICAgTlVMTCk7CisJCQlpZiAocmV0KQorCQkJCXVwdG9kYXRlID0gMDsKKwkJfQorCQlpZiAoIXVwdG9kYXRlICYmIHRyZWUtPm9wcyAmJgorCQkgICAgdHJlZS0+b3BzLT5yZWFkcGFnZV9pb19mYWlsZWRfaG9vaykgeworCQkJcmV0ID0gdHJlZS0+b3BzLT5yZWFkcGFnZV9pb19mYWlsZWRfaG9vayhiaW8sIHBhZ2UsCisJCQkJCQkJIHN0YXJ0LCBlbmQsIE5VTEwpOworCQkJaWYgKHJldCA9PSAwKSB7CisJCQkJdXB0b2RhdGUgPQorCQkJCQl0ZXN0X2JpdChCSU9fVVBUT0RBVEUsICZiaW8tPmJpX2ZsYWdzKTsKKwkJCQlpZiAoZXJyKQorCQkJCQl1cHRvZGF0ZSA9IDA7CisJCQkJY29udGludWU7CisJCQl9CisJCX0KKworCQlpZiAodXB0b2RhdGUpIHsKKwkJCXNldF9leHRlbnRfdXB0b2RhdGUodHJlZSwgc3RhcnQsIGVuZCwKKwkJCQkJICAgIEdGUF9BVE9NSUMpOworCQl9CisJCXVubG9ja19leHRlbnQodHJlZSwgc3RhcnQsIGVuZCwgR0ZQX0FUT01JQyk7CisKKwkJaWYgKHdob2xlX3BhZ2UpIHsKKwkJCWlmICh1cHRvZGF0ZSkgeworCQkJCVNldFBhZ2VVcHRvZGF0ZShwYWdlKTsKKwkJCX0gZWxzZSB7CisJCQkJQ2xlYXJQYWdlVXB0b2RhdGUocGFnZSk7CisJCQkJU2V0UGFnZUVycm9yKHBhZ2UpOworCQkJfQorCQkJdW5sb2NrX3BhZ2UocGFnZSk7CisJCX0gZWxzZSB7CisJCQlpZiAodXB0b2RhdGUpIHsKKwkJCQljaGVja19wYWdlX3VwdG9kYXRlKHRyZWUsIHBhZ2UpOworCQkJfSBlbHNlIHsKKwkJCQlDbGVhclBhZ2VVcHRvZGF0ZShwYWdlKTsKKwkJCQlTZXRQYWdlRXJyb3IocGFnZSk7CisJCQl9CisJCQljaGVja19wYWdlX2xvY2tlZCh0cmVlLCBwYWdlKTsKKwkJfQorCX0gd2hpbGUgKGJ2ZWMgPj0gYmlvLT5iaV9pb192ZWMpOworCisJYmlvX3B1dChiaW8pOworfQorCisvKgorICogSU8gZG9uZSBmcm9tIHByZXBhcmVfd3JpdGUgaXMgcHJldHR5IHNpbXBsZSwgd2UganVzdCB1bmxvY2sKKyAqIHRoZSBzdHJ1Y3RzIGluIHRoZSBleHRlbnQgdHJlZSB3aGVuIGRvbmUsIGFuZCBzZXQgdGhlIHVwdG9kYXRlIGJpdHMKKyAqIGFzIGFwcHJvcHJpYXRlLgorICovCitzdGF0aWMgdm9pZCBlbmRfYmlvX2V4dGVudF9wcmVwYXJld3JpdGUoc3RydWN0IGJpbyAqYmlvLCBpbnQgZXJyKQoreworCWNvbnN0IGludCB1cHRvZGF0ZSA9IHRlc3RfYml0KEJJT19VUFRPREFURSwgJmJpby0+YmlfZmxhZ3MpOworCXN0cnVjdCBiaW9fdmVjICpidmVjID0gYmlvLT5iaV9pb192ZWMgKyBiaW8tPmJpX3ZjbnQgLSAxOworCXN0cnVjdCBleHRlbnRfaW9fdHJlZSAqdHJlZTsKKwl1NjQgc3RhcnQ7CisJdTY0IGVuZDsKKworCWRvIHsKKwkJc3RydWN0IHBhZ2UgKnBhZ2UgPSBidmVjLT5idl9wYWdlOworCQl0cmVlID0gJkJUUkZTX0kocGFnZS0+bWFwcGluZy0+aG9zdCktPmlvX3RyZWU7CisKKwkJc3RhcnQgPSAoKHU2NClwYWdlLT5pbmRleCA8PCBQQUdFX0NBQ0hFX1NISUZUKSArCisJCQlidmVjLT5idl9vZmZzZXQ7CisJCWVuZCA9IHN0YXJ0ICsgYnZlYy0+YnZfbGVuIC0gMTsKKworCQlpZiAoLS1idmVjID49IGJpby0+YmlfaW9fdmVjKQorCQkJcHJlZmV0Y2h3KCZidmVjLT5idl9wYWdlLT5mbGFncyk7CisKKwkJaWYgKHVwdG9kYXRlKSB7CisJCQlzZXRfZXh0ZW50X3VwdG9kYXRlKHRyZWUsIHN0YXJ0LCBlbmQsIEdGUF9BVE9NSUMpOworCQl9IGVsc2UgeworCQkJQ2xlYXJQYWdlVXB0b2RhdGUocGFnZSk7CisJCQlTZXRQYWdlRXJyb3IocGFnZSk7CisJCX0KKworCQl1bmxvY2tfZXh0ZW50KHRyZWUsIHN0YXJ0LCBlbmQsIEdGUF9BVE9NSUMpOworCisJfSB3aGlsZSAoYnZlYyA+PSBiaW8tPmJpX2lvX3ZlYyk7CisKKwliaW9fcHV0KGJpbyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYmlvICoKK2V4dGVudF9iaW9fYWxsb2Moc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwgdTY0IGZpcnN0X3NlY3RvciwgaW50IG5yX3ZlY3MsCisJCSBnZnBfdCBnZnBfZmxhZ3MpCit7CisJc3RydWN0IGJpbyAqYmlvOworCisJYmlvID0gYmlvX2FsbG9jKGdmcF9mbGFncywgbnJfdmVjcyk7CisKKwlpZiAoYmlvID09IE5VTEwgJiYgKGN1cnJlbnQtPmZsYWdzICYgUEZfTUVNQUxMT0MpKSB7CisJCXdoaWxlICghYmlvICYmIChucl92ZWNzIC89IDIpKQorCQkJYmlvID0gYmlvX2FsbG9jKGdmcF9mbGFncywgbnJfdmVjcyk7CisJfQorCisJaWYgKGJpbykgeworCQliaW8tPmJpX3NpemUgPSAwOworCQliaW8tPmJpX2JkZXYgPSBiZGV2OworCQliaW8tPmJpX3NlY3RvciA9IGZpcnN0X3NlY3RvcjsKKwl9CisJcmV0dXJuIGJpbzsKK30KKworc3RhdGljIGludCBzdWJtaXRfb25lX2JpbyhpbnQgcncsIHN0cnVjdCBiaW8gKmJpbywgaW50IG1pcnJvcl9udW0sCisJCQkgIHVuc2lnbmVkIGxvbmcgYmlvX2ZsYWdzKQoreworCWludCByZXQgPSAwOworCXN0cnVjdCBiaW9fdmVjICpidmVjID0gYmlvLT5iaV9pb192ZWMgKyBiaW8tPmJpX3ZjbnQgLSAxOworCXN0cnVjdCBwYWdlICpwYWdlID0gYnZlYy0+YnZfcGFnZTsKKwlzdHJ1Y3QgZXh0ZW50X2lvX3RyZWUgKnRyZWUgPSBiaW8tPmJpX3ByaXZhdGU7CisJdTY0IHN0YXJ0OworCXU2NCBlbmQ7CisKKwlzdGFydCA9ICgodTY0KXBhZ2UtPmluZGV4IDw8IFBBR0VfQ0FDSEVfU0hJRlQpICsgYnZlYy0+YnZfb2Zmc2V0OworCWVuZCA9IHN0YXJ0ICsgYnZlYy0+YnZfbGVuIC0gMTsKKworCWJpby0+YmlfcHJpdmF0ZSA9IE5VTEw7CisKKwliaW9fZ2V0KGJpbyk7CisKKwlpZiAodHJlZS0+b3BzICYmIHRyZWUtPm9wcy0+c3VibWl0X2Jpb19ob29rKQorCQl0cmVlLT5vcHMtPnN1Ym1pdF9iaW9faG9vayhwYWdlLT5tYXBwaW5nLT5ob3N0LCBydywgYmlvLAorCQkJCQkgICBtaXJyb3JfbnVtLCBiaW9fZmxhZ3MpOworCWVsc2UKKwkJc3VibWl0X2JpbyhydywgYmlvKTsKKwlpZiAoYmlvX2ZsYWdnZWQoYmlvLCBCSU9fRU9QTk9UU1VQUCkpCisJCXJldCA9IC1FT1BOT1RTVVBQOworCWJpb19wdXQoYmlvKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHN1Ym1pdF9leHRlbnRfcGFnZShpbnQgcncsIHN0cnVjdCBleHRlbnRfaW9fdHJlZSAqdHJlZSwKKwkJCSAgICAgIHN0cnVjdCBwYWdlICpwYWdlLCBzZWN0b3JfdCBzZWN0b3IsCisJCQkgICAgICBzaXplX3Qgc2l6ZSwgdW5zaWduZWQgbG9uZyBvZmZzZXQsCisJCQkgICAgICBzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LAorCQkJICAgICAgc3RydWN0IGJpbyAqKmJpb19yZXQsCisJCQkgICAgICB1bnNpZ25lZCBsb25nIG1heF9wYWdlcywKKwkJCSAgICAgIGJpb19lbmRfaW9fdCBlbmRfaW9fZnVuYywKKwkJCSAgICAgIGludCBtaXJyb3JfbnVtLAorCQkJICAgICAgdW5zaWduZWQgbG9uZyBwcmV2X2Jpb19mbGFncywKKwkJCSAgICAgIHVuc2lnbmVkIGxvbmcgYmlvX2ZsYWdzKQoreworCWludCByZXQgPSAwOworCXN0cnVjdCBiaW8gKmJpbzsKKwlpbnQgbnI7CisJaW50IGNvbnRpZyA9IDA7CisJaW50IHRoaXNfY29tcHJlc3NlZCA9IGJpb19mbGFncyAmIEVYVEVOVF9CSU9fQ09NUFJFU1NFRDsKKwlpbnQgb2xkX2NvbXByZXNzZWQgPSBwcmV2X2Jpb19mbGFncyAmIEVYVEVOVF9CSU9fQ09NUFJFU1NFRDsKKwlzaXplX3QgcGFnZV9zaXplID0gbWluX3Qoc2l6ZV90LCBzaXplLCBQQUdFX0NBQ0hFX1NJWkUpOworCisJaWYgKGJpb19yZXQgJiYgKmJpb19yZXQpIHsKKwkJYmlvID0gKmJpb19yZXQ7CisJCWlmIChvbGRfY29tcHJlc3NlZCkKKwkJCWNvbnRpZyA9IGJpby0+Ymlfc2VjdG9yID09IHNlY3RvcjsKKwkJZWxzZQorCQkJY29udGlnID0gYmlvLT5iaV9zZWN0b3IgKyAoYmlvLT5iaV9zaXplID4+IDkpID09CisJCQkJc2VjdG9yOworCisJCWlmIChwcmV2X2Jpb19mbGFncyAhPSBiaW9fZmxhZ3MgfHwgIWNvbnRpZyB8fAorCQkgICAgKHRyZWUtPm9wcyAmJiB0cmVlLT5vcHMtPm1lcmdlX2Jpb19ob29rICYmCisJCSAgICAgdHJlZS0+b3BzLT5tZXJnZV9iaW9faG9vayhwYWdlLCBvZmZzZXQsIHBhZ2Vfc2l6ZSwgYmlvLAorCQkJCQkgICAgICAgYmlvX2ZsYWdzKSkgfHwKKwkJICAgIGJpb19hZGRfcGFnZShiaW8sIHBhZ2UsIHBhZ2Vfc2l6ZSwgb2Zmc2V0KSA8IHBhZ2Vfc2l6ZSkgeworCQkJcmV0ID0gc3VibWl0X29uZV9iaW8ocncsIGJpbywgbWlycm9yX251bSwKKwkJCQkJICAgICBwcmV2X2Jpb19mbGFncyk7CisJCQliaW8gPSBOVUxMOworCQl9IGVsc2UgeworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisJaWYgKHRoaXNfY29tcHJlc3NlZCkKKwkJbnIgPSBCSU9fTUFYX1BBR0VTOworCWVsc2UKKwkJbnIgPSBiaW9fZ2V0X25yX3ZlY3MoYmRldik7CisKKwliaW8gPSBleHRlbnRfYmlvX2FsbG9jKGJkZXYsIHNlY3RvciwgbnIsIEdGUF9OT0ZTIHwgX19HRlBfSElHSCk7CisKKwliaW9fYWRkX3BhZ2UoYmlvLCBwYWdlLCBwYWdlX3NpemUsIG9mZnNldCk7CisJYmlvLT5iaV9lbmRfaW8gPSBlbmRfaW9fZnVuYzsKKwliaW8tPmJpX3ByaXZhdGUgPSB0cmVlOworCisJaWYgKGJpb19yZXQpCisJCSpiaW9fcmV0ID0gYmlvOworCWVsc2UKKwkJcmV0ID0gc3VibWl0X29uZV9iaW8ocncsIGJpbywgbWlycm9yX251bSwgYmlvX2ZsYWdzKTsKKworCXJldHVybiByZXQ7Cit9CisKK3ZvaWQgc2V0X3BhZ2VfZXh0ZW50X21hcHBlZChzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwlpZiAoIVBhZ2VQcml2YXRlKHBhZ2UpKSB7CisJCVNldFBhZ2VQcml2YXRlKHBhZ2UpOworCQlwYWdlX2NhY2hlX2dldChwYWdlKTsKKwkJc2V0X3BhZ2VfcHJpdmF0ZShwYWdlLCBFWFRFTlRfUEFHRV9QUklWQVRFKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHNldF9wYWdlX2V4dGVudF9oZWFkKHN0cnVjdCBwYWdlICpwYWdlLCB1bnNpZ25lZCBsb25nIGxlbikKK3sKKwlzZXRfcGFnZV9wcml2YXRlKHBhZ2UsIEVYVEVOVF9QQUdFX1BSSVZBVEVfRklSU1RfUEFHRSB8IGxlbiA8PCAyKTsKK30KKworLyoKKyAqIGJhc2ljIHJlYWRwYWdlIGltcGxlbWVudGF0aW9uLiAgTG9ja2VkIGV4dGVudCBzdGF0ZSBzdHJ1Y3RzIGFyZSBpbnNlcnRlZAorICogaW50byB0aGUgdHJlZSB0aGF0IGFyZSByZW1vdmVkIHdoZW4gdGhlIElPIGlzIGRvbmUgKGJ5IHRoZSBlbmRfaW8KKyAqIGhhbmRsZXJzKQorICovCitzdGF0aWMgaW50IF9fZXh0ZW50X3JlYWRfZnVsbF9wYWdlKHN0cnVjdCBleHRlbnRfaW9fdHJlZSAqdHJlZSwKKwkJCQkgICBzdHJ1Y3QgcGFnZSAqcGFnZSwKKwkJCQkgICBnZXRfZXh0ZW50X3QgKmdldF9leHRlbnQsCisJCQkJICAgc3RydWN0IGJpbyAqKmJpbywgaW50IG1pcnJvcl9udW0sCisJCQkJICAgdW5zaWduZWQgbG9uZyAqYmlvX2ZsYWdzKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBwYWdlLT5tYXBwaW5nLT5ob3N0OworCXU2NCBzdGFydCA9ICh1NjQpcGFnZS0+aW5kZXggPDwgUEFHRV9DQUNIRV9TSElGVDsKKwl1NjQgcGFnZV9lbmQgPSBzdGFydCArIFBBR0VfQ0FDSEVfU0laRSAtIDE7CisJdTY0IGVuZDsKKwl1NjQgY3VyID0gc3RhcnQ7CisJdTY0IGV4dGVudF9vZmZzZXQ7CisJdTY0IGxhc3RfYnl0ZSA9IGlfc2l6ZV9yZWFkKGlub2RlKTsKKwl1NjQgYmxvY2tfc3RhcnQ7CisJdTY0IGN1cl9lbmQ7CisJc2VjdG9yX3Qgc2VjdG9yOworCXN0cnVjdCBleHRlbnRfbWFwICplbTsKKwlzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2OworCWludCByZXQ7CisJaW50IG5yID0gMDsKKwlzaXplX3QgcGFnZV9vZmZzZXQgPSAwOworCXNpemVfdCBpb3NpemU7CisJc2l6ZV90IGRpc2tfaW9fc2l6ZTsKKwlzaXplX3QgYmxvY2tzaXplID0gaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplOworCXVuc2lnbmVkIGxvbmcgdGhpc19iaW9fZmxhZyA9IDA7CisKKwlzZXRfcGFnZV9leHRlbnRfbWFwcGVkKHBhZ2UpOworCisJZW5kID0gcGFnZV9lbmQ7CisJbG9ja19leHRlbnQodHJlZSwgc3RhcnQsIGVuZCwgR0ZQX05PRlMpOworCisJaWYgKHBhZ2UtPmluZGV4ID09IGxhc3RfYnl0ZSA+PiBQQUdFX0NBQ0hFX1NISUZUKSB7CisJCWNoYXIgKnVzZXJwYWdlOworCQlzaXplX3QgemVyb19vZmZzZXQgPSBsYXN0X2J5dGUgJiAoUEFHRV9DQUNIRV9TSVpFIC0gMSk7CisKKwkJaWYgKHplcm9fb2Zmc2V0KSB7CisJCQlpb3NpemUgPSBQQUdFX0NBQ0hFX1NJWkUgLSB6ZXJvX29mZnNldDsKKwkJCXVzZXJwYWdlID0ga21hcF9hdG9taWMocGFnZSwgS01fVVNFUjApOworCQkJbWVtc2V0KHVzZXJwYWdlICsgemVyb19vZmZzZXQsIDAsIGlvc2l6ZSk7CisJCQlmbHVzaF9kY2FjaGVfcGFnZShwYWdlKTsKKwkJCWt1bm1hcF9hdG9taWModXNlcnBhZ2UsIEtNX1VTRVIwKTsKKwkJfQorCX0KKwl3aGlsZSAoY3VyIDw9IGVuZCkgeworCQlpZiAoY3VyID49IGxhc3RfYnl0ZSkgeworCQkJY2hhciAqdXNlcnBhZ2U7CisJCQlpb3NpemUgPSBQQUdFX0NBQ0hFX1NJWkUgLSBwYWdlX29mZnNldDsKKwkJCXVzZXJwYWdlID0ga21hcF9hdG9taWMocGFnZSwgS01fVVNFUjApOworCQkJbWVtc2V0KHVzZXJwYWdlICsgcGFnZV9vZmZzZXQsIDAsIGlvc2l6ZSk7CisJCQlmbHVzaF9kY2FjaGVfcGFnZShwYWdlKTsKKwkJCWt1bm1hcF9hdG9taWModXNlcnBhZ2UsIEtNX1VTRVIwKTsKKwkJCXNldF9leHRlbnRfdXB0b2RhdGUodHJlZSwgY3VyLCBjdXIgKyBpb3NpemUgLSAxLAorCQkJCQkgICAgR0ZQX05PRlMpOworCQkJdW5sb2NrX2V4dGVudCh0cmVlLCBjdXIsIGN1ciArIGlvc2l6ZSAtIDEsIEdGUF9OT0ZTKTsKKwkJCWJyZWFrOworCQl9CisJCWVtID0gZ2V0X2V4dGVudChpbm9kZSwgcGFnZSwgcGFnZV9vZmZzZXQsIGN1ciwKKwkJCQllbmQgLSBjdXIgKyAxLCAwKTsKKwkJaWYgKElTX0VSUihlbSkgfHwgIWVtKSB7CisJCQlTZXRQYWdlRXJyb3IocGFnZSk7CisJCQl1bmxvY2tfZXh0ZW50KHRyZWUsIGN1ciwgZW5kLCBHRlBfTk9GUyk7CisJCQlicmVhazsKKwkJfQorCQlleHRlbnRfb2Zmc2V0ID0gY3VyIC0gZW0tPnN0YXJ0OworCQlCVUdfT04oZXh0ZW50X21hcF9lbmQoZW0pIDw9IGN1cik7CisJCUJVR19PTihlbmQgPCBjdXIpOworCisJCWlmICh0ZXN0X2JpdChFWFRFTlRfRkxBR19DT01QUkVTU0VELCAmZW0tPmZsYWdzKSkKKwkJCXRoaXNfYmlvX2ZsYWcgPSBFWFRFTlRfQklPX0NPTVBSRVNTRUQ7CisKKwkJaW9zaXplID0gbWluKGV4dGVudF9tYXBfZW5kKGVtKSAtIGN1ciwgZW5kIC0gY3VyICsgMSk7CisJCWN1cl9lbmQgPSBtaW4oZXh0ZW50X21hcF9lbmQoZW0pIC0gMSwgZW5kKTsKKwkJaW9zaXplID0gKGlvc2l6ZSArIGJsb2Nrc2l6ZSAtIDEpICYgfigodTY0KWJsb2Nrc2l6ZSAtIDEpOworCQlpZiAodGhpc19iaW9fZmxhZyAmIEVYVEVOVF9CSU9fQ09NUFJFU1NFRCkgeworCQkJZGlza19pb19zaXplID0gZW0tPmJsb2NrX2xlbjsKKwkJCXNlY3RvciA9IGVtLT5ibG9ja19zdGFydCA+PiA5OworCQl9IGVsc2UgeworCQkJc2VjdG9yID0gKGVtLT5ibG9ja19zdGFydCArIGV4dGVudF9vZmZzZXQpID4+IDk7CisJCQlkaXNrX2lvX3NpemUgPSBpb3NpemU7CisJCX0KKwkJYmRldiA9IGVtLT5iZGV2OworCQlibG9ja19zdGFydCA9IGVtLT5ibG9ja19zdGFydDsKKwkJaWYgKHRlc3RfYml0KEVYVEVOVF9GTEFHX1BSRUFMTE9DLCAmZW0tPmZsYWdzKSkKKwkJCWJsb2NrX3N0YXJ0ID0gRVhURU5UX01BUF9IT0xFOworCQlmcmVlX2V4dGVudF9tYXAoZW0pOworCQllbSA9IE5VTEw7CisKKwkJLyogd2UndmUgZm91bmQgYSBob2xlLCBqdXN0IHplcm8gYW5kIGdvIG9uICovCisJCWlmIChibG9ja19zdGFydCA9PSBFWFRFTlRfTUFQX0hPTEUpIHsKKwkJCWNoYXIgKnVzZXJwYWdlOworCQkJdXNlcnBhZ2UgPSBrbWFwX2F0b21pYyhwYWdlLCBLTV9VU0VSMCk7CisJCQltZW1zZXQodXNlcnBhZ2UgKyBwYWdlX29mZnNldCwgMCwgaW9zaXplKTsKKwkJCWZsdXNoX2RjYWNoZV9wYWdlKHBhZ2UpOworCQkJa3VubWFwX2F0b21pYyh1c2VycGFnZSwgS01fVVNFUjApOworCisJCQlzZXRfZXh0ZW50X3VwdG9kYXRlKHRyZWUsIGN1ciwgY3VyICsgaW9zaXplIC0gMSwKKwkJCQkJICAgIEdGUF9OT0ZTKTsKKwkJCXVubG9ja19leHRlbnQodHJlZSwgY3VyLCBjdXIgKyBpb3NpemUgLSAxLCBHRlBfTk9GUyk7CisJCQljdXIgPSBjdXIgKyBpb3NpemU7CisJCQlwYWdlX29mZnNldCArPSBpb3NpemU7CisJCQljb250aW51ZTsKKwkJfQorCQkvKiB0aGUgZ2V0X2V4dGVudCBmdW5jdGlvbiBhbHJlYWR5IGNvcGllZCBpbnRvIHRoZSBwYWdlICovCisJCWlmICh0ZXN0X3JhbmdlX2JpdCh0cmVlLCBjdXIsIGN1cl9lbmQsIEVYVEVOVF9VUFRPREFURSwgMSkpIHsKKwkJCWNoZWNrX3BhZ2VfdXB0b2RhdGUodHJlZSwgcGFnZSk7CisJCQl1bmxvY2tfZXh0ZW50KHRyZWUsIGN1ciwgY3VyICsgaW9zaXplIC0gMSwgR0ZQX05PRlMpOworCQkJY3VyID0gY3VyICsgaW9zaXplOworCQkJcGFnZV9vZmZzZXQgKz0gaW9zaXplOworCQkJY29udGludWU7CisJCX0KKwkJLyogd2UgaGF2ZSBhbiBpbmxpbmUgZXh0ZW50IGJ1dCBpdCBkaWRuJ3QgZ2V0IG1hcmtlZCB1cAorCQkgKiB0byBkYXRlLiAgRXJyb3Igb3V0CisJCSAqLworCQlpZiAoYmxvY2tfc3RhcnQgPT0gRVhURU5UX01BUF9JTkxJTkUpIHsKKwkJCVNldFBhZ2VFcnJvcihwYWdlKTsKKwkJCXVubG9ja19leHRlbnQodHJlZSwgY3VyLCBjdXIgKyBpb3NpemUgLSAxLCBHRlBfTk9GUyk7CisJCQljdXIgPSBjdXIgKyBpb3NpemU7CisJCQlwYWdlX29mZnNldCArPSBpb3NpemU7CisJCQljb250aW51ZTsKKwkJfQorCisJCXJldCA9IDA7CisJCWlmICh0cmVlLT5vcHMgJiYgdHJlZS0+b3BzLT5yZWFkcGFnZV9pb19ob29rKSB7CisJCQlyZXQgPSB0cmVlLT5vcHMtPnJlYWRwYWdlX2lvX2hvb2socGFnZSwgY3VyLAorCQkJCQkJCSAgY3VyICsgaW9zaXplIC0gMSk7CisJCX0KKwkJaWYgKCFyZXQpIHsKKwkJCXVuc2lnbmVkIGxvbmcgcG5yID0gKGxhc3RfYnl0ZSA+PiBQQUdFX0NBQ0hFX1NISUZUKSArIDE7CisJCQlwbnIgLT0gcGFnZS0+aW5kZXg7CisJCQlyZXQgPSBzdWJtaXRfZXh0ZW50X3BhZ2UoUkVBRCwgdHJlZSwgcGFnZSwKKwkJCQkJIHNlY3RvciwgZGlza19pb19zaXplLCBwYWdlX29mZnNldCwKKwkJCQkJIGJkZXYsIGJpbywgcG5yLAorCQkJCQkgZW5kX2Jpb19leHRlbnRfcmVhZHBhZ2UsIG1pcnJvcl9udW0sCisJCQkJCSAqYmlvX2ZsYWdzLAorCQkJCQkgdGhpc19iaW9fZmxhZyk7CisJCQlucisrOworCQkJKmJpb19mbGFncyA9IHRoaXNfYmlvX2ZsYWc7CisJCX0KKwkJaWYgKHJldCkKKwkJCVNldFBhZ2VFcnJvcihwYWdlKTsKKwkJY3VyID0gY3VyICsgaW9zaXplOworCQlwYWdlX29mZnNldCArPSBpb3NpemU7CisJfQorCWlmICghbnIpIHsKKwkJaWYgKCFQYWdlRXJyb3IocGFnZSkpCisJCQlTZXRQYWdlVXB0b2RhdGUocGFnZSk7CisJCXVubG9ja19wYWdlKHBhZ2UpOworCX0KKwlyZXR1cm4gMDsKK30KKworaW50IGV4dGVudF9yZWFkX2Z1bGxfcGFnZShzdHJ1Y3QgZXh0ZW50X2lvX3RyZWUgKnRyZWUsIHN0cnVjdCBwYWdlICpwYWdlLAorCQkJICAgIGdldF9leHRlbnRfdCAqZ2V0X2V4dGVudCkKK3sKKwlzdHJ1Y3QgYmlvICpiaW8gPSBOVUxMOworCXVuc2lnbmVkIGxvbmcgYmlvX2ZsYWdzID0gMDsKKwlpbnQgcmV0OworCisJcmV0ID0gX19leHRlbnRfcmVhZF9mdWxsX3BhZ2UodHJlZSwgcGFnZSwgZ2V0X2V4dGVudCwgJmJpbywgMCwKKwkJCQkgICAgICAmYmlvX2ZsYWdzKTsKKwlpZiAoYmlvKQorCQlzdWJtaXRfb25lX2JpbyhSRUFELCBiaW8sIDAsIGJpb19mbGFncyk7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIHRoZSB3cml0ZXBhZ2Ugc2VtYW50aWNzIGFyZSBzaW1pbGFyIHRvIHJlZ3VsYXIgd3JpdGVwYWdlLiAgZXh0ZW50CisgKiByZWNvcmRzIGFyZSBpbnNlcnRlZCB0byBsb2NrIHJhbmdlcyBpbiB0aGUgdHJlZSwgYW5kIGFzIGRpcnR5IGFyZWFzCisgKiBhcmUgZm91bmQsIHRoZXkgYXJlIG1hcmtlZCB3cml0ZWJhY2suICBUaGVuIHRoZSBsb2NrIGJpdHMgYXJlIHJlbW92ZWQKKyAqIGFuZCB0aGUgZW5kX2lvIGhhbmRsZXIgY2xlYXJzIHRoZSB3cml0ZWJhY2sgcmFuZ2VzCisgKi8KK3N0YXRpYyBpbnQgX19leHRlbnRfd3JpdGVwYWdlKHN0cnVjdCBwYWdlICpwYWdlLCBzdHJ1Y3Qgd3JpdGViYWNrX2NvbnRyb2wgKndiYywKKwkJCSAgICAgIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IHBhZ2UtPm1hcHBpbmctPmhvc3Q7CisJc3RydWN0IGV4dGVudF9wYWdlX2RhdGEgKmVwZCA9IGRhdGE7CisJc3RydWN0IGV4dGVudF9pb190cmVlICp0cmVlID0gZXBkLT50cmVlOworCXU2NCBzdGFydCA9ICh1NjQpcGFnZS0+aW5kZXggPDwgUEFHRV9DQUNIRV9TSElGVDsKKwl1NjQgZGVsYWxsb2Nfc3RhcnQ7CisJdTY0IHBhZ2VfZW5kID0gc3RhcnQgKyBQQUdFX0NBQ0hFX1NJWkUgLSAxOworCXU2NCBlbmQ7CisJdTY0IGN1ciA9IHN0YXJ0OworCXU2NCBleHRlbnRfb2Zmc2V0OworCXU2NCBsYXN0X2J5dGUgPSBpX3NpemVfcmVhZChpbm9kZSk7CisJdTY0IGJsb2NrX3N0YXJ0OworCXU2NCBpb3NpemU7CisJdTY0IHVubG9ja19zdGFydDsKKwlzZWN0b3JfdCBzZWN0b3I7CisJc3RydWN0IGV4dGVudF9tYXAgKmVtOworCXN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXY7CisJaW50IHJldDsKKwlpbnQgbnIgPSAwOworCXNpemVfdCBwZ19vZmZzZXQgPSAwOworCXNpemVfdCBibG9ja3NpemU7CisJbG9mZl90IGlfc2l6ZSA9IGlfc2l6ZV9yZWFkKGlub2RlKTsKKwl1bnNpZ25lZCBsb25nIGVuZF9pbmRleCA9IGlfc2l6ZSA+PiBQQUdFX0NBQ0hFX1NISUZUOworCXU2NCBucl9kZWxhbGxvYzsKKwl1NjQgZGVsYWxsb2NfZW5kOworCWludCBwYWdlX3N0YXJ0ZWQ7CisJaW50IGNvbXByZXNzZWQ7CisJdW5zaWduZWQgbG9uZyBucl93cml0dGVuID0gMDsKKworCVdBUk5fT04oIVBhZ2VMb2NrZWQocGFnZSkpOworCXBnX29mZnNldCA9IGlfc2l6ZSAmIChQQUdFX0NBQ0hFX1NJWkUgLSAxKTsKKwlpZiAocGFnZS0+aW5kZXggPiBlbmRfaW5kZXggfHwKKwkgICAocGFnZS0+aW5kZXggPT0gZW5kX2luZGV4ICYmICFwZ19vZmZzZXQpKSB7CisJCXBhZ2UtPm1hcHBpbmctPmFfb3BzLT5pbnZhbGlkYXRlcGFnZShwYWdlLCAwKTsKKwkJdW5sb2NrX3BhZ2UocGFnZSk7CisJCXJldHVybiAwOworCX0KKworCWlmIChwYWdlLT5pbmRleCA9PSBlbmRfaW5kZXgpIHsKKwkJY2hhciAqdXNlcnBhZ2U7CisKKwkJdXNlcnBhZ2UgPSBrbWFwX2F0b21pYyhwYWdlLCBLTV9VU0VSMCk7CisJCW1lbXNldCh1c2VycGFnZSArIHBnX29mZnNldCwgMCwKKwkJICAgICAgIFBBR0VfQ0FDSEVfU0laRSAtIHBnX29mZnNldCk7CisJCWt1bm1hcF9hdG9taWModXNlcnBhZ2UsIEtNX1VTRVIwKTsKKwkJZmx1c2hfZGNhY2hlX3BhZ2UocGFnZSk7CisJfQorCXBnX29mZnNldCA9IDA7CisKKwlzZXRfcGFnZV9leHRlbnRfbWFwcGVkKHBhZ2UpOworCisJZGVsYWxsb2Nfc3RhcnQgPSBzdGFydDsKKwlkZWxhbGxvY19lbmQgPSAwOworCXBhZ2Vfc3RhcnRlZCA9IDA7CisJaWYgKCFlcGQtPmV4dGVudF9sb2NrZWQpIHsKKwkJd2hpbGUgKGRlbGFsbG9jX2VuZCA8IHBhZ2VfZW5kKSB7CisJCQlucl9kZWxhbGxvYyA9IGZpbmRfbG9ja19kZWxhbGxvY19yYW5nZShpbm9kZSwgdHJlZSwKKwkJCQkJCSAgICAgICBwYWdlLAorCQkJCQkJICAgICAgICZkZWxhbGxvY19zdGFydCwKKwkJCQkJCSAgICAgICAmZGVsYWxsb2NfZW5kLAorCQkJCQkJICAgICAgIDEyOCAqIDEwMjQgKiAxMDI0KTsKKwkJCWlmIChucl9kZWxhbGxvYyA9PSAwKSB7CisJCQkJZGVsYWxsb2Nfc3RhcnQgPSBkZWxhbGxvY19lbmQgKyAxOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJdHJlZS0+b3BzLT5maWxsX2RlbGFsbG9jKGlub2RlLCBwYWdlLCBkZWxhbGxvY19zdGFydCwKKwkJCQkJCSBkZWxhbGxvY19lbmQsICZwYWdlX3N0YXJ0ZWQsCisJCQkJCQkgJm5yX3dyaXR0ZW4pOworCQkJZGVsYWxsb2Nfc3RhcnQgPSBkZWxhbGxvY19lbmQgKyAxOworCQl9CisKKwkJLyogZGlkIHRoZSBmaWxsIGRlbGFsbG9jIGZ1bmN0aW9uIGFscmVhZHkgdW5sb2NrIGFuZCBzdGFydAorCQkgKiB0aGUgSU8/CisJCSAqLworCQlpZiAocGFnZV9zdGFydGVkKSB7CisJCQlyZXQgPSAwOworCQkJZ290byB1cGRhdGVfbnJfd3JpdHRlbjsKKwkJfQorCX0KKwlsb2NrX2V4dGVudCh0cmVlLCBzdGFydCwgcGFnZV9lbmQsIEdGUF9OT0ZTKTsKKworCXVubG9ja19zdGFydCA9IHN0YXJ0OworCisJaWYgKHRyZWUtPm9wcyAmJiB0cmVlLT5vcHMtPndyaXRlcGFnZV9zdGFydF9ob29rKSB7CisJCXJldCA9IHRyZWUtPm9wcy0+d3JpdGVwYWdlX3N0YXJ0X2hvb2socGFnZSwgc3RhcnQsCisJCQkJCQkgICAgICBwYWdlX2VuZCk7CisJCWlmIChyZXQgPT0gLUVBR0FJTikgeworCQkJdW5sb2NrX2V4dGVudCh0cmVlLCBzdGFydCwgcGFnZV9lbmQsIEdGUF9OT0ZTKTsKKwkJCXJlZGlydHlfcGFnZV9mb3Jfd3JpdGVwYWdlKHdiYywgcGFnZSk7CisJCQl1bmxvY2tfcGFnZShwYWdlKTsKKwkJCXJldCA9IDA7CisJCQlnb3RvIHVwZGF0ZV9ucl93cml0dGVuOworCQl9CisJfQorCisJbnJfd3JpdHRlbisrOworCisJZW5kID0gcGFnZV9lbmQ7CisJaWYgKHRlc3RfcmFuZ2VfYml0KHRyZWUsIHN0YXJ0LCBwYWdlX2VuZCwgRVhURU5UX0RFTEFMTE9DLCAwKSkKKwkJcHJpbnRrKEtFUk5fRVJSICJidHJmcyBkZWxhbGxvYyBiaXRzIGFmdGVyIGxvY2tfZXh0ZW50XG4iKTsKKworCWlmIChsYXN0X2J5dGUgPD0gc3RhcnQpIHsKKwkJY2xlYXJfZXh0ZW50X2RpcnR5KHRyZWUsIHN0YXJ0LCBwYWdlX2VuZCwgR0ZQX05PRlMpOworCQl1bmxvY2tfZXh0ZW50KHRyZWUsIHN0YXJ0LCBwYWdlX2VuZCwgR0ZQX05PRlMpOworCQlpZiAodHJlZS0+b3BzICYmIHRyZWUtPm9wcy0+d3JpdGVwYWdlX2VuZF9pb19ob29rKQorCQkJdHJlZS0+b3BzLT53cml0ZXBhZ2VfZW5kX2lvX2hvb2socGFnZSwgc3RhcnQsCisJCQkJCQkJIHBhZ2VfZW5kLCBOVUxMLCAxKTsKKwkJdW5sb2NrX3N0YXJ0ID0gcGFnZV9lbmQgKyAxOworCQlnb3RvIGRvbmU7CisJfQorCisJc2V0X2V4dGVudF91cHRvZGF0ZSh0cmVlLCBzdGFydCwgcGFnZV9lbmQsIEdGUF9OT0ZTKTsKKwlibG9ja3NpemUgPSBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemU7CisKKwl3aGlsZSAoY3VyIDw9IGVuZCkgeworCQlpZiAoY3VyID49IGxhc3RfYnl0ZSkgeworCQkJY2xlYXJfZXh0ZW50X2RpcnR5KHRyZWUsIGN1ciwgcGFnZV9lbmQsIEdGUF9OT0ZTKTsKKwkJCXVubG9ja19leHRlbnQodHJlZSwgdW5sb2NrX3N0YXJ0LCBwYWdlX2VuZCwgR0ZQX05PRlMpOworCQkJaWYgKHRyZWUtPm9wcyAmJiB0cmVlLT5vcHMtPndyaXRlcGFnZV9lbmRfaW9faG9vaykKKwkJCQl0cmVlLT5vcHMtPndyaXRlcGFnZV9lbmRfaW9faG9vayhwYWdlLCBjdXIsCisJCQkJCQkJIHBhZ2VfZW5kLCBOVUxMLCAxKTsKKwkJCXVubG9ja19zdGFydCA9IHBhZ2VfZW5kICsgMTsKKwkJCWJyZWFrOworCQl9CisJCWVtID0gZXBkLT5nZXRfZXh0ZW50KGlub2RlLCBwYWdlLCBwZ19vZmZzZXQsIGN1ciwKKwkJCQkgICAgIGVuZCAtIGN1ciArIDEsIDEpOworCQlpZiAoSVNfRVJSKGVtKSB8fCAhZW0pIHsKKwkJCVNldFBhZ2VFcnJvcihwYWdlKTsKKwkJCWJyZWFrOworCQl9CisKKwkJZXh0ZW50X29mZnNldCA9IGN1ciAtIGVtLT5zdGFydDsKKwkJQlVHX09OKGV4dGVudF9tYXBfZW5kKGVtKSA8PSBjdXIpOworCQlCVUdfT04oZW5kIDwgY3VyKTsKKwkJaW9zaXplID0gbWluKGV4dGVudF9tYXBfZW5kKGVtKSAtIGN1ciwgZW5kIC0gY3VyICsgMSk7CisJCWlvc2l6ZSA9IChpb3NpemUgKyBibG9ja3NpemUgLSAxKSAmIH4oKHU2NClibG9ja3NpemUgLSAxKTsKKwkJc2VjdG9yID0gKGVtLT5ibG9ja19zdGFydCArIGV4dGVudF9vZmZzZXQpID4+IDk7CisJCWJkZXYgPSBlbS0+YmRldjsKKwkJYmxvY2tfc3RhcnQgPSBlbS0+YmxvY2tfc3RhcnQ7CisJCWNvbXByZXNzZWQgPSB0ZXN0X2JpdChFWFRFTlRfRkxBR19DT01QUkVTU0VELCAmZW0tPmZsYWdzKTsKKwkJZnJlZV9leHRlbnRfbWFwKGVtKTsKKwkJZW0gPSBOVUxMOworCisJCS8qCisJCSAqIGNvbXByZXNzZWQgYW5kIGlubGluZSBleHRlbnRzIGFyZSB3cml0dGVuIHRocm91Z2ggb3RoZXIKKwkJICogcGF0aHMgaW4gdGhlIEZTCisJCSAqLworCQlpZiAoY29tcHJlc3NlZCB8fCBibG9ja19zdGFydCA9PSBFWFRFTlRfTUFQX0hPTEUgfHwKKwkJICAgIGJsb2NrX3N0YXJ0ID09IEVYVEVOVF9NQVBfSU5MSU5FKSB7CisJCQljbGVhcl9leHRlbnRfZGlydHkodHJlZSwgY3VyLAorCQkJCQkgICBjdXIgKyBpb3NpemUgLSAxLCBHRlBfTk9GUyk7CisKKwkJCXVubG9ja19leHRlbnQodHJlZSwgdW5sb2NrX3N0YXJ0LCBjdXIgKyBpb3NpemUgLSAxLAorCQkJCSAgICAgIEdGUF9OT0ZTKTsKKworCQkJLyoKKwkJCSAqIGVuZF9pbyBub3RpZmljYXRpb24gZG9lcyBub3QgaGFwcGVuIGhlcmUgZm9yCisJCQkgKiBjb21wcmVzc2VkIGV4dGVudHMKKwkJCSAqLworCQkJaWYgKCFjb21wcmVzc2VkICYmIHRyZWUtPm9wcyAmJgorCQkJICAgIHRyZWUtPm9wcy0+d3JpdGVwYWdlX2VuZF9pb19ob29rKQorCQkJCXRyZWUtPm9wcy0+d3JpdGVwYWdlX2VuZF9pb19ob29rKHBhZ2UsIGN1ciwKKwkJCQkJCQkgY3VyICsgaW9zaXplIC0gMSwKKwkJCQkJCQkgTlVMTCwgMSk7CisJCQllbHNlIGlmIChjb21wcmVzc2VkKSB7CisJCQkJLyogd2UgZG9uJ3Qgd2FudCB0byBlbmRfcGFnZV93cml0ZWJhY2sgb24KKwkJCQkgKiBhIGNvbXByZXNzZWQgZXh0ZW50LiAgdGhpcyBoYXBwZW5zCisJCQkJICogZWxzZXdoZXJlCisJCQkJICovCisJCQkJbnIrKzsKKwkJCX0KKworCQkJY3VyICs9IGlvc2l6ZTsKKwkJCXBnX29mZnNldCArPSBpb3NpemU7CisJCQl1bmxvY2tfc3RhcnQgPSBjdXI7CisJCQljb250aW51ZTsKKwkJfQorCQkvKiBsZWF2ZSB0aGlzIG91dCB1bnRpbCB3ZSBoYXZlIGEgcGFnZV9ta3dyaXRlIGNhbGwgKi8KKwkJaWYgKDAgJiYgIXRlc3RfcmFuZ2VfYml0KHRyZWUsIGN1ciwgY3VyICsgaW9zaXplIC0gMSwKKwkJCQkgICBFWFRFTlRfRElSVFksIDApKSB7CisJCQljdXIgPSBjdXIgKyBpb3NpemU7CisJCQlwZ19vZmZzZXQgKz0gaW9zaXplOworCQkJY29udGludWU7CisJCX0KKworCQljbGVhcl9leHRlbnRfZGlydHkodHJlZSwgY3VyLCBjdXIgKyBpb3NpemUgLSAxLCBHRlBfTk9GUyk7CisJCWlmICh0cmVlLT5vcHMgJiYgdHJlZS0+b3BzLT53cml0ZXBhZ2VfaW9faG9vaykgeworCQkJcmV0ID0gdHJlZS0+b3BzLT53cml0ZXBhZ2VfaW9faG9vayhwYWdlLCBjdXIsCisJCQkJCQljdXIgKyBpb3NpemUgLSAxKTsKKwkJfSBlbHNlIHsKKwkJCXJldCA9IDA7CisJCX0KKwkJaWYgKHJldCkgeworCQkJU2V0UGFnZUVycm9yKHBhZ2UpOworCQl9IGVsc2UgeworCQkJdW5zaWduZWQgbG9uZyBtYXhfbnIgPSBlbmRfaW5kZXggKyAxOworCisJCQlzZXRfcmFuZ2Vfd3JpdGViYWNrKHRyZWUsIGN1ciwgY3VyICsgaW9zaXplIC0gMSk7CisJCQlpZiAoIVBhZ2VXcml0ZWJhY2socGFnZSkpIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgImJ0cmZzIHdhcm5pbmcgcGFnZSAlbHUgbm90ICIKKwkJCQkgICAgICAgIndyaXRlYmFjaywgY3VyICVsbHUgZW5kICVsbHVcbiIsCisJCQkJICAgICAgIHBhZ2UtPmluZGV4LCAodW5zaWduZWQgbG9uZyBsb25nKWN1ciwKKwkJCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyllbmQpOworCQkJfQorCisJCQlyZXQgPSBzdWJtaXRfZXh0ZW50X3BhZ2UoV1JJVEUsIHRyZWUsIHBhZ2UsIHNlY3RvciwKKwkJCQkJCSBpb3NpemUsIHBnX29mZnNldCwgYmRldiwKKwkJCQkJCSAmZXBkLT5iaW8sIG1heF9uciwKKwkJCQkJCSBlbmRfYmlvX2V4dGVudF93cml0ZXBhZ2UsCisJCQkJCQkgMCwgMCwgMCk7CisJCQlpZiAocmV0KQorCQkJCVNldFBhZ2VFcnJvcihwYWdlKTsKKwkJfQorCQljdXIgPSBjdXIgKyBpb3NpemU7CisJCXBnX29mZnNldCArPSBpb3NpemU7CisJCW5yKys7CisJfQorZG9uZToKKwlpZiAobnIgPT0gMCkgeworCQkvKiBtYWtlIHN1cmUgdGhlIG1hcHBpbmcgdGFnIGZvciBwYWdlIGRpcnR5IGdldHMgY2xlYXJlZCAqLworCQlzZXRfcGFnZV93cml0ZWJhY2socGFnZSk7CisJCWVuZF9wYWdlX3dyaXRlYmFjayhwYWdlKTsKKwl9CisJaWYgKHVubG9ja19zdGFydCA8PSBwYWdlX2VuZCkKKwkJdW5sb2NrX2V4dGVudCh0cmVlLCB1bmxvY2tfc3RhcnQsIHBhZ2VfZW5kLCBHRlBfTk9GUyk7CisJdW5sb2NrX3BhZ2UocGFnZSk7CisKK3VwZGF0ZV9ucl93cml0dGVuOgorCXdiYy0+bnJfdG9fd3JpdGUgLT0gbnJfd3JpdHRlbjsKKwlpZiAod2JjLT5yYW5nZV9jeWNsaWMgfHwgKHdiYy0+bnJfdG9fd3JpdGUgPiAwICYmCisJICAgIHdiYy0+cmFuZ2Vfc3RhcnQgPT0gMCAmJiB3YmMtPnJhbmdlX2VuZCA9PSBMTE9OR19NQVgpKQorCQlwYWdlLT5tYXBwaW5nLT53cml0ZWJhY2tfaW5kZXggPSBwYWdlLT5pbmRleCArIG5yX3dyaXR0ZW47CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogd3JpdGVfY2FjaGVfcGFnZXMgLSB3YWxrIHRoZSBsaXN0IG9mIGRpcnR5IHBhZ2VzIG9mIHRoZSBnaXZlbiBhZGRyZXNzIHNwYWNlIGFuZCB3cml0ZSBhbGwgb2YgdGhlbS4KKyAqIEBtYXBwaW5nOiBhZGRyZXNzIHNwYWNlIHN0cnVjdHVyZSB0byB3cml0ZQorICogQHdiYzogc3VidHJhY3QgdGhlIG51bWJlciBvZiB3cml0dGVuIHBhZ2VzIGZyb20gKkB3YmMtPm5yX3RvX3dyaXRlCisgKiBAd3JpdGVwYWdlOiBmdW5jdGlvbiBjYWxsZWQgZm9yIGVhY2ggcGFnZQorICogQGRhdGE6IGRhdGEgcGFzc2VkIHRvIHdyaXRlcGFnZSBmdW5jdGlvbgorICoKKyAqIElmIGEgcGFnZSBpcyBhbHJlYWR5IHVuZGVyIEkvTywgd3JpdGVfY2FjaGVfcGFnZXMoKSBza2lwcyBpdCwgZXZlbgorICogaWYgaXQncyBkaXJ0eS4gIFRoaXMgaXMgZGVzaXJhYmxlIGJlaGF2aW91ciBmb3IgbWVtb3J5LWNsZWFuaW5nIHdyaXRlYmFjaywKKyAqIGJ1dCBpdCBpcyBJTkNPUlJFQ1QgZm9yIGRhdGEtaW50ZWdyaXR5IHN5c3RlbSBjYWxscyBzdWNoIGFzIGZzeW5jKCkuICBmc3luYygpCisgKiBhbmQgbXN5bmMoKSBuZWVkIHRvIGd1YXJhbnRlZSB0aGF0IGFsbCB0aGUgZGF0YSB3aGljaCB3YXMgZGlydHkgYXQgdGhlIHRpbWUKKyAqIHRoZSBjYWxsIHdhcyBtYWRlIGdldCBuZXcgSS9PIHN0YXJ0ZWQgYWdhaW5zdCB0aGVtLiAgSWYgd2JjLT5zeW5jX21vZGUgaXMKKyAqIFdCX1NZTkNfQUxMIHRoZW4gd2Ugd2VyZSBjYWxsZWQgZm9yIGRhdGEgaW50ZWdyaXR5IGFuZCB3ZSBtdXN0IHdhaXQgZm9yCisgKiBleGlzdGluZyBJTyB0byBjb21wbGV0ZS4KKyAqLworc3RhdGljIGludCBleHRlbnRfd3JpdGVfY2FjaGVfcGFnZXMoc3RydWN0IGV4dGVudF9pb190cmVlICp0cmVlLAorCQkJICAgICBzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywKKwkJCSAgICAgc3RydWN0IHdyaXRlYmFja19jb250cm9sICp3YmMsCisJCQkgICAgIHdyaXRlcGFnZV90IHdyaXRlcGFnZSwgdm9pZCAqZGF0YSwKKwkJCSAgICAgdm9pZCAoKmZsdXNoX2ZuKSh2b2lkICopKQoreworCXN0cnVjdCBiYWNraW5nX2Rldl9pbmZvICpiZGkgPSBtYXBwaW5nLT5iYWNraW5nX2Rldl9pbmZvOworCWludCByZXQgPSAwOworCWludCBkb25lID0gMDsKKwlzdHJ1Y3QgcGFnZXZlYyBwdmVjOworCWludCBucl9wYWdlczsKKwlwZ29mZl90IGluZGV4OworCXBnb2ZmX3QgZW5kOwkJLyogSW5jbHVzaXZlICovCisJaW50IHNjYW5uZWQgPSAwOworCWludCByYW5nZV93aG9sZSA9IDA7CisKKwlpZiAod2JjLT5ub25ibG9ja2luZyAmJiBiZGlfd3JpdGVfY29uZ2VzdGVkKGJkaSkpIHsKKwkJd2JjLT5lbmNvdW50ZXJlZF9jb25nZXN0aW9uID0gMTsKKwkJcmV0dXJuIDA7CisJfQorCisJcGFnZXZlY19pbml0KCZwdmVjLCAwKTsKKwlpZiAod2JjLT5yYW5nZV9jeWNsaWMpIHsKKwkJaW5kZXggPSBtYXBwaW5nLT53cml0ZWJhY2tfaW5kZXg7IC8qIFN0YXJ0IGZyb20gcHJldiBvZmZzZXQgKi8KKwkJZW5kID0gLTE7CisJfSBlbHNlIHsKKwkJaW5kZXggPSB3YmMtPnJhbmdlX3N0YXJ0ID4+IFBBR0VfQ0FDSEVfU0hJRlQ7CisJCWVuZCA9IHdiYy0+cmFuZ2VfZW5kID4+IFBBR0VfQ0FDSEVfU0hJRlQ7CisJCWlmICh3YmMtPnJhbmdlX3N0YXJ0ID09IDAgJiYgd2JjLT5yYW5nZV9lbmQgPT0gTExPTkdfTUFYKQorCQkJcmFuZ2Vfd2hvbGUgPSAxOworCQlzY2FubmVkID0gMTsKKwl9CityZXRyeToKKwl3aGlsZSAoIWRvbmUgJiYgKGluZGV4IDw9IGVuZCkgJiYKKwkgICAgICAgKG5yX3BhZ2VzID0gcGFnZXZlY19sb29rdXBfdGFnKCZwdmVjLCBtYXBwaW5nLCAmaW5kZXgsCisJCQkgICAgICBQQUdFQ0FDSEVfVEFHX0RJUlRZLCBtaW4oZW5kIC0gaW5kZXgsCisJCQkJICAocGdvZmZfdClQQUdFVkVDX1NJWkUtMSkgKyAxKSkpIHsKKwkJdW5zaWduZWQgaTsKKworCQlzY2FubmVkID0gMTsKKwkJZm9yIChpID0gMDsgaSA8IG5yX3BhZ2VzOyBpKyspIHsKKwkJCXN0cnVjdCBwYWdlICpwYWdlID0gcHZlYy5wYWdlc1tpXTsKKworCQkJLyoKKwkJCSAqIEF0IHRoaXMgcG9pbnQgd2UgaG9sZCBuZWl0aGVyIG1hcHBpbmctPnRyZWVfbG9jayBub3IKKwkJCSAqIGxvY2sgb24gdGhlIHBhZ2UgaXRzZWxmOiB0aGUgcGFnZSBtYXkgYmUgdHJ1bmNhdGVkIG9yCisJCQkgKiBpbnZhbGlkYXRlZCAoY2hhbmdpbmcgcGFnZS0+bWFwcGluZyB0byBOVUxMKSwgb3IgZXZlbgorCQkJICogc3dpenpsZWQgYmFjayBmcm9tIHN3YXBwZXJfc3BhY2UgdG8gdG1wZnMgZmlsZQorCQkJICogbWFwcGluZworCQkJICovCisJCQlpZiAodHJlZS0+b3BzICYmIHRyZWUtPm9wcy0+d3JpdGVfY2FjaGVfcGFnZXNfbG9ja19ob29rKQorCQkJCXRyZWUtPm9wcy0+d3JpdGVfY2FjaGVfcGFnZXNfbG9ja19ob29rKHBhZ2UpOworCQkJZWxzZQorCQkJCWxvY2tfcGFnZShwYWdlKTsKKworCQkJaWYgKHVubGlrZWx5KHBhZ2UtPm1hcHBpbmcgIT0gbWFwcGluZykpIHsKKwkJCQl1bmxvY2tfcGFnZShwYWdlKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJaWYgKCF3YmMtPnJhbmdlX2N5Y2xpYyAmJiBwYWdlLT5pbmRleCA+IGVuZCkgeworCQkJCWRvbmUgPSAxOworCQkJCXVubG9ja19wYWdlKHBhZ2UpOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQlpZiAod2JjLT5zeW5jX21vZGUgIT0gV0JfU1lOQ19OT05FKSB7CisJCQkJaWYgKFBhZ2VXcml0ZWJhY2socGFnZSkpCisJCQkJCWZsdXNoX2ZuKGRhdGEpOworCQkJCXdhaXRfb25fcGFnZV93cml0ZWJhY2socGFnZSk7CisJCQl9CisKKwkJCWlmIChQYWdlV3JpdGViYWNrKHBhZ2UpIHx8CisJCQkgICAgIWNsZWFyX3BhZ2VfZGlydHlfZm9yX2lvKHBhZ2UpKSB7CisJCQkJdW5sb2NrX3BhZ2UocGFnZSk7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCXJldCA9ICgqd3JpdGVwYWdlKShwYWdlLCB3YmMsIGRhdGEpOworCisJCQlpZiAodW5saWtlbHkocmV0ID09IEFPUF9XUklURVBBR0VfQUNUSVZBVEUpKSB7CisJCQkJdW5sb2NrX3BhZ2UocGFnZSk7CisJCQkJcmV0ID0gMDsKKwkJCX0KKwkJCWlmIChyZXQgfHwgd2JjLT5ucl90b193cml0ZSA8PSAwKQorCQkJCWRvbmUgPSAxOworCQkJaWYgKHdiYy0+bm9uYmxvY2tpbmcgJiYgYmRpX3dyaXRlX2Nvbmdlc3RlZChiZGkpKSB7CisJCQkJd2JjLT5lbmNvdW50ZXJlZF9jb25nZXN0aW9uID0gMTsKKwkJCQlkb25lID0gMTsKKwkJCX0KKwkJfQorCQlwYWdldmVjX3JlbGVhc2UoJnB2ZWMpOworCQljb25kX3Jlc2NoZWQoKTsKKwl9CisJaWYgKCFzY2FubmVkICYmICFkb25lKSB7CisJCS8qCisJCSAqIFdlIGhpdCB0aGUgbGFzdCBwYWdlIGFuZCB0aGVyZSBpcyBtb3JlIHdvcmsgdG8gYmUgZG9uZTogd3JhcAorCQkgKiBiYWNrIHRvIHRoZSBzdGFydCBvZiB0aGUgZmlsZQorCQkgKi8KKwkJc2Nhbm5lZCA9IDE7CisJCWluZGV4ID0gMDsKKwkJZ290byByZXRyeTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIG5vaW5saW5lIHZvaWQgZmx1c2hfd3JpdGVfYmlvKHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGV4dGVudF9wYWdlX2RhdGEgKmVwZCA9IGRhdGE7CisJaWYgKGVwZC0+YmlvKSB7CisJCXN1Ym1pdF9vbmVfYmlvKFdSSVRFLCBlcGQtPmJpbywgMCwgMCk7CisJCWVwZC0+YmlvID0gTlVMTDsKKwl9Cit9CisKK2ludCBleHRlbnRfd3JpdGVfZnVsbF9wYWdlKHN0cnVjdCBleHRlbnRfaW9fdHJlZSAqdHJlZSwgc3RydWN0IHBhZ2UgKnBhZ2UsCisJCQkgIGdldF9leHRlbnRfdCAqZ2V0X2V4dGVudCwKKwkJCSAgc3RydWN0IHdyaXRlYmFja19jb250cm9sICp3YmMpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IHBhZ2UtPm1hcHBpbmc7CisJc3RydWN0IGV4dGVudF9wYWdlX2RhdGEgZXBkID0geworCQkuYmlvID0gTlVMTCwKKwkJLnRyZWUgPSB0cmVlLAorCQkuZ2V0X2V4dGVudCA9IGdldF9leHRlbnQsCisJCS5leHRlbnRfbG9ja2VkID0gMCwKKwl9OworCXN0cnVjdCB3cml0ZWJhY2tfY29udHJvbCB3YmNfd3JpdGVwYWdlcyA9IHsKKwkJLmJkaQkJPSB3YmMtPmJkaSwKKwkJLnN5bmNfbW9kZQk9IFdCX1NZTkNfTk9ORSwKKwkJLm9sZGVyX3RoYW5fdGhpcyA9IE5VTEwsCisJCS5ucl90b193cml0ZQk9IDY0LAorCQkucmFuZ2Vfc3RhcnQJPSBwYWdlX29mZnNldChwYWdlKSArIFBBR0VfQ0FDSEVfU0laRSwKKwkJLnJhbmdlX2VuZAk9IChsb2ZmX3QpLTEsCisJfTsKKworCisJcmV0ID0gX19leHRlbnRfd3JpdGVwYWdlKHBhZ2UsIHdiYywgJmVwZCk7CisKKwlleHRlbnRfd3JpdGVfY2FjaGVfcGFnZXModHJlZSwgbWFwcGluZywgJndiY193cml0ZXBhZ2VzLAorCQkJCSBfX2V4dGVudF93cml0ZXBhZ2UsICZlcGQsIGZsdXNoX3dyaXRlX2Jpbyk7CisJaWYgKGVwZC5iaW8pCisJCXN1Ym1pdF9vbmVfYmlvKFdSSVRFLCBlcGQuYmlvLCAwLCAwKTsKKwlyZXR1cm4gcmV0OworfQorCitpbnQgZXh0ZW50X3dyaXRlX2xvY2tlZF9yYW5nZShzdHJ1Y3QgZXh0ZW50X2lvX3RyZWUgKnRyZWUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkgICAgICB1NjQgc3RhcnQsIHU2NCBlbmQsIGdldF9leHRlbnRfdCAqZ2V0X2V4dGVudCwKKwkJCSAgICAgIGludCBtb2RlKQoreworCWludCByZXQgPSAwOworCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gaW5vZGUtPmlfbWFwcGluZzsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwl1bnNpZ25lZCBsb25nIG5yX3BhZ2VzID0gKGVuZCAtIHN0YXJ0ICsgUEFHRV9DQUNIRV9TSVpFKSA+PgorCQlQQUdFX0NBQ0hFX1NISUZUOworCisJc3RydWN0IGV4dGVudF9wYWdlX2RhdGEgZXBkID0geworCQkuYmlvID0gTlVMTCwKKwkJLnRyZWUgPSB0cmVlLAorCQkuZ2V0X2V4dGVudCA9IGdldF9leHRlbnQsCisJCS5leHRlbnRfbG9ja2VkID0gMSwKKwl9OworCXN0cnVjdCB3cml0ZWJhY2tfY29udHJvbCB3YmNfd3JpdGVwYWdlcyA9IHsKKwkJLmJkaQkJPSBpbm9kZS0+aV9tYXBwaW5nLT5iYWNraW5nX2Rldl9pbmZvLAorCQkuc3luY19tb2RlCT0gbW9kZSwKKwkJLm9sZGVyX3RoYW5fdGhpcyA9IE5VTEwsCisJCS5ucl90b193cml0ZQk9IG5yX3BhZ2VzICogMiwKKwkJLnJhbmdlX3N0YXJ0CT0gc3RhcnQsCisJCS5yYW5nZV9lbmQJPSBlbmQgKyAxLAorCX07CisKKwl3aGlsZSAoc3RhcnQgPD0gZW5kKSB7CisJCXBhZ2UgPSBmaW5kX2dldF9wYWdlKG1hcHBpbmcsIHN0YXJ0ID4+IFBBR0VfQ0FDSEVfU0hJRlQpOworCQlpZiAoY2xlYXJfcGFnZV9kaXJ0eV9mb3JfaW8ocGFnZSkpCisJCQlyZXQgPSBfX2V4dGVudF93cml0ZXBhZ2UocGFnZSwgJndiY193cml0ZXBhZ2VzLCAmZXBkKTsKKwkJZWxzZSB7CisJCQlpZiAodHJlZS0+b3BzICYmIHRyZWUtPm9wcy0+d3JpdGVwYWdlX2VuZF9pb19ob29rKQorCQkJCXRyZWUtPm9wcy0+d3JpdGVwYWdlX2VuZF9pb19ob29rKHBhZ2UsIHN0YXJ0LAorCQkJCQkJIHN0YXJ0ICsgUEFHRV9DQUNIRV9TSVpFIC0gMSwKKwkJCQkJCSBOVUxMLCAxKTsKKwkJCXVubG9ja19wYWdlKHBhZ2UpOworCQl9CisJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKKwkJc3RhcnQgKz0gUEFHRV9DQUNIRV9TSVpFOworCX0KKworCWlmIChlcGQuYmlvKQorCQlzdWJtaXRfb25lX2JpbyhXUklURSwgZXBkLmJpbywgMCwgMCk7CisJcmV0dXJuIHJldDsKK30KKworaW50IGV4dGVudF93cml0ZXBhZ2VzKHN0cnVjdCBleHRlbnRfaW9fdHJlZSAqdHJlZSwKKwkJICAgICAgc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsCisJCSAgICAgIGdldF9leHRlbnRfdCAqZ2V0X2V4dGVudCwKKwkJICAgICAgc3RydWN0IHdyaXRlYmFja19jb250cm9sICp3YmMpCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IGV4dGVudF9wYWdlX2RhdGEgZXBkID0geworCQkuYmlvID0gTlVMTCwKKwkJLnRyZWUgPSB0cmVlLAorCQkuZ2V0X2V4dGVudCA9IGdldF9leHRlbnQsCisJCS5leHRlbnRfbG9ja2VkID0gMCwKKwl9OworCisJcmV0ID0gZXh0ZW50X3dyaXRlX2NhY2hlX3BhZ2VzKHRyZWUsIG1hcHBpbmcsIHdiYywKKwkJCQkgICAgICAgX19leHRlbnRfd3JpdGVwYWdlLCAmZXBkLAorCQkJCSAgICAgICBmbHVzaF93cml0ZV9iaW8pOworCWlmIChlcGQuYmlvKQorCQlzdWJtaXRfb25lX2JpbyhXUklURSwgZXBkLmJpbywgMCwgMCk7CisJcmV0dXJuIHJldDsKK30KKworaW50IGV4dGVudF9yZWFkcGFnZXMoc3RydWN0IGV4dGVudF9pb190cmVlICp0cmVlLAorCQkgICAgIHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLAorCQkgICAgIHN0cnVjdCBsaXN0X2hlYWQgKnBhZ2VzLCB1bnNpZ25lZCBucl9wYWdlcywKKwkJICAgICBnZXRfZXh0ZW50X3QgZ2V0X2V4dGVudCkKK3sKKwlzdHJ1Y3QgYmlvICpiaW8gPSBOVUxMOworCXVuc2lnbmVkIHBhZ2VfaWR4OworCXN0cnVjdCBwYWdldmVjIHB2ZWM7CisJdW5zaWduZWQgbG9uZyBiaW9fZmxhZ3MgPSAwOworCisJcGFnZXZlY19pbml0KCZwdmVjLCAwKTsKKwlmb3IgKHBhZ2VfaWR4ID0gMDsgcGFnZV9pZHggPCBucl9wYWdlczsgcGFnZV9pZHgrKykgeworCQlzdHJ1Y3QgcGFnZSAqcGFnZSA9IGxpc3RfZW50cnkocGFnZXMtPnByZXYsIHN0cnVjdCBwYWdlLCBscnUpOworCisJCXByZWZldGNodygmcGFnZS0+ZmxhZ3MpOworCQlsaXN0X2RlbCgmcGFnZS0+bHJ1KTsKKwkJLyoKKwkJICogd2hhdCB3ZSB3YW50IHRvIGRvIGhlcmUgaXMgY2FsbCBhZGRfdG9fcGFnZV9jYWNoZV9scnUsCisJCSAqIGJ1dCB0aGF0IGlzbid0IGV4cG9ydGVkLCBzbyB3ZSByZXByb2R1Y2UgaXQgaGVyZQorCQkgKi8KKwkJaWYgKCFhZGRfdG9fcGFnZV9jYWNoZShwYWdlLCBtYXBwaW5nLAorCQkJCQlwYWdlLT5pbmRleCwgR0ZQX0tFUk5FTCkpIHsKKworCQkJLyogb3BlbiBjb2Rpbmcgb2YgbHJ1X2NhY2hlX2FkZCwgYWxzbyBub3QgZXhwb3J0ZWQgKi8KKwkJCXBhZ2VfY2FjaGVfZ2V0KHBhZ2UpOworCQkJaWYgKCFwYWdldmVjX2FkZCgmcHZlYywgcGFnZSkpCisJCQkJX19wYWdldmVjX2xydV9hZGRfZmlsZSgmcHZlYyk7CisJCQlfX2V4dGVudF9yZWFkX2Z1bGxfcGFnZSh0cmVlLCBwYWdlLCBnZXRfZXh0ZW50LAorCQkJCQkJJmJpbywgMCwgJmJpb19mbGFncyk7CisJCX0KKwkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOworCX0KKwlpZiAocGFnZXZlY19jb3VudCgmcHZlYykpCisJCV9fcGFnZXZlY19scnVfYWRkX2ZpbGUoJnB2ZWMpOworCUJVR19PTighbGlzdF9lbXB0eShwYWdlcykpOworCWlmIChiaW8pCisJCXN1Ym1pdF9vbmVfYmlvKFJFQUQsIGJpbywgMCwgYmlvX2ZsYWdzKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGJhc2ljIGludmFsaWRhdGVwYWdlIGNvZGUsIHRoaXMgd2FpdHMgb24gYW55IGxvY2tlZCBvciB3cml0ZWJhY2sKKyAqIHJhbmdlcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBwYWdlLCBhbmQgdGhlbiBkZWxldGVzIGFueSBleHRlbnQgc3RhdGUKKyAqIHJlY29yZHMgZnJvbSB0aGUgdHJlZQorICovCitpbnQgZXh0ZW50X2ludmFsaWRhdGVwYWdlKHN0cnVjdCBleHRlbnRfaW9fdHJlZSAqdHJlZSwKKwkJCSAgc3RydWN0IHBhZ2UgKnBhZ2UsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0KQoreworCXU2NCBzdGFydCA9ICgodTY0KXBhZ2UtPmluZGV4IDw8IFBBR0VfQ0FDSEVfU0hJRlQpOworCXU2NCBlbmQgPSBzdGFydCArIFBBR0VfQ0FDSEVfU0laRSAtIDE7CisJc2l6ZV90IGJsb2Nrc2l6ZSA9IHBhZ2UtPm1hcHBpbmctPmhvc3QtPmlfc2ItPnNfYmxvY2tzaXplOworCisJc3RhcnQgKz0gKG9mZnNldCArIGJsb2Nrc2l6ZSAtIDEpICYgfihibG9ja3NpemUgLSAxKTsKKwlpZiAoc3RhcnQgPiBlbmQpCisJCXJldHVybiAwOworCisJbG9ja19leHRlbnQodHJlZSwgc3RhcnQsIGVuZCwgR0ZQX05PRlMpOworCXdhaXRfb25fZXh0ZW50X3dyaXRlYmFjayh0cmVlLCBzdGFydCwgZW5kKTsKKwljbGVhcl9leHRlbnRfYml0KHRyZWUsIHN0YXJ0LCBlbmQsCisJCQkgRVhURU5UX0xPQ0tFRCB8IEVYVEVOVF9ESVJUWSB8IEVYVEVOVF9ERUxBTExPQywKKwkJCSAxLCAxLCBHRlBfTk9GUyk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBzaW1wbGUgY29tbWl0X3dyaXRlIGNhbGwsIHNldF9yYW5nZV9kaXJ0eSBpcyB1c2VkIHRvIG1hcmsgYm90aAorICogdGhlIHBhZ2VzIGFuZCB0aGUgZXh0ZW50IHJlY29yZHMgYXMgZGlydHkKKyAqLworaW50IGV4dGVudF9jb21taXRfd3JpdGUoc3RydWN0IGV4dGVudF9pb190cmVlICp0cmVlLAorCQkJc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IHBhZ2UgKnBhZ2UsCisJCQl1bnNpZ25lZCBmcm9tLCB1bnNpZ25lZCB0bykKK3sKKwlsb2ZmX3QgcG9zID0gKChsb2ZmX3QpcGFnZS0+aW5kZXggPDwgUEFHRV9DQUNIRV9TSElGVCkgKyB0bzsKKworCXNldF9wYWdlX2V4dGVudF9tYXBwZWQocGFnZSk7CisJc2V0X3BhZ2VfZGlydHkocGFnZSk7CisKKwlpZiAocG9zID4gaW5vZGUtPmlfc2l6ZSkgeworCQlpX3NpemVfd3JpdGUoaW5vZGUsIHBvcyk7CisJCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOworCX0KKwlyZXR1cm4gMDsKK30KKworaW50IGV4dGVudF9wcmVwYXJlX3dyaXRlKHN0cnVjdCBleHRlbnRfaW9fdHJlZSAqdHJlZSwKKwkJCSBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgcGFnZSAqcGFnZSwKKwkJCSB1bnNpZ25lZCBmcm9tLCB1bnNpZ25lZCB0bywgZ2V0X2V4dGVudF90ICpnZXRfZXh0ZW50KQoreworCXU2NCBwYWdlX3N0YXJ0ID0gKHU2NClwYWdlLT5pbmRleCA8PCBQQUdFX0NBQ0hFX1NISUZUOworCXU2NCBwYWdlX2VuZCA9IHBhZ2Vfc3RhcnQgKyBQQUdFX0NBQ0hFX1NJWkUgLSAxOworCXU2NCBibG9ja19zdGFydDsKKwl1NjQgb3JpZ19ibG9ja19zdGFydDsKKwl1NjQgYmxvY2tfZW5kOworCXU2NCBjdXJfZW5kOworCXN0cnVjdCBleHRlbnRfbWFwICplbTsKKwl1bnNpZ25lZCBibG9ja3NpemUgPSAxIDw8IGlub2RlLT5pX2Jsa2JpdHM7CisJc2l6ZV90IHBhZ2Vfb2Zmc2V0ID0gMDsKKwlzaXplX3QgYmxvY2tfb2ZmX3N0YXJ0OworCXNpemVfdCBibG9ja19vZmZfZW5kOworCWludCBlcnIgPSAwOworCWludCBpb2NvdW50ID0gMDsKKwlpbnQgcmV0ID0gMDsKKwlpbnQgaXNuZXc7CisKKwlzZXRfcGFnZV9leHRlbnRfbWFwcGVkKHBhZ2UpOworCisJYmxvY2tfc3RhcnQgPSAocGFnZV9zdGFydCArIGZyb20pICYgfigodTY0KWJsb2Nrc2l6ZSAtIDEpOworCWJsb2NrX2VuZCA9IChwYWdlX3N0YXJ0ICsgdG8gLSAxKSB8IChibG9ja3NpemUgLSAxKTsKKwlvcmlnX2Jsb2NrX3N0YXJ0ID0gYmxvY2tfc3RhcnQ7CisKKwlsb2NrX2V4dGVudCh0cmVlLCBwYWdlX3N0YXJ0LCBwYWdlX2VuZCwgR0ZQX05PRlMpOworCXdoaWxlIChibG9ja19zdGFydCA8PSBibG9ja19lbmQpIHsKKwkJZW0gPSBnZXRfZXh0ZW50KGlub2RlLCBwYWdlLCBwYWdlX29mZnNldCwgYmxvY2tfc3RhcnQsCisJCQkJYmxvY2tfZW5kIC0gYmxvY2tfc3RhcnQgKyAxLCAxKTsKKwkJaWYgKElTX0VSUihlbSkgfHwgIWVtKQorCQkJZ290byBlcnI7CisKKwkJY3VyX2VuZCA9IG1pbihibG9ja19lbmQsIGV4dGVudF9tYXBfZW5kKGVtKSAtIDEpOworCQlibG9ja19vZmZfc3RhcnQgPSBibG9ja19zdGFydCAmIChQQUdFX0NBQ0hFX1NJWkUgLSAxKTsKKwkJYmxvY2tfb2ZmX2VuZCA9IGJsb2NrX29mZl9zdGFydCArIGJsb2Nrc2l6ZTsKKwkJaXNuZXcgPSBjbGVhcl9leHRlbnRfbmV3KHRyZWUsIGJsb2NrX3N0YXJ0LCBjdXJfZW5kLCBHRlBfTk9GUyk7CisKKwkJaWYgKCFQYWdlVXB0b2RhdGUocGFnZSkgJiYgaXNuZXcgJiYKKwkJICAgIChibG9ja19vZmZfZW5kID4gdG8gfHwgYmxvY2tfb2ZmX3N0YXJ0IDwgZnJvbSkpIHsKKwkJCXZvaWQgKmthZGRyOworCisJCQlrYWRkciA9IGttYXBfYXRvbWljKHBhZ2UsIEtNX1VTRVIwKTsKKwkJCWlmIChibG9ja19vZmZfZW5kID4gdG8pCisJCQkJbWVtc2V0KGthZGRyICsgdG8sIDAsIGJsb2NrX29mZl9lbmQgLSB0byk7CisJCQlpZiAoYmxvY2tfb2ZmX3N0YXJ0IDwgZnJvbSkKKwkJCQltZW1zZXQoa2FkZHIgKyBibG9ja19vZmZfc3RhcnQsIDAsCisJCQkJICAgICAgIGZyb20gLSBibG9ja19vZmZfc3RhcnQpOworCQkJZmx1c2hfZGNhY2hlX3BhZ2UocGFnZSk7CisJCQlrdW5tYXBfYXRvbWljKGthZGRyLCBLTV9VU0VSMCk7CisJCX0KKwkJaWYgKChlbS0+YmxvY2tfc3RhcnQgIT0gRVhURU5UX01BUF9IT0xFICYmCisJCSAgICAgZW0tPmJsb2NrX3N0YXJ0ICE9IEVYVEVOVF9NQVBfSU5MSU5FKSAmJgorCQkgICAgIWlzbmV3ICYmICFQYWdlVXB0b2RhdGUocGFnZSkgJiYKKwkJICAgIChibG9ja19vZmZfZW5kID4gdG8gfHwgYmxvY2tfb2ZmX3N0YXJ0IDwgZnJvbSkgJiYKKwkJICAgICF0ZXN0X3JhbmdlX2JpdCh0cmVlLCBibG9ja19zdGFydCwgY3VyX2VuZCwKKwkJCQkgICAgRVhURU5UX1VQVE9EQVRFLCAxKSkgeworCQkJdTY0IHNlY3RvcjsKKwkJCXU2NCBleHRlbnRfb2Zmc2V0ID0gYmxvY2tfc3RhcnQgLSBlbS0+c3RhcnQ7CisJCQlzaXplX3QgaW9zaXplOworCQkJc2VjdG9yID0gKGVtLT5ibG9ja19zdGFydCArIGV4dGVudF9vZmZzZXQpID4+IDk7CisJCQlpb3NpemUgPSAoY3VyX2VuZCAtIGJsb2NrX3N0YXJ0ICsgYmxvY2tzaXplKSAmCisJCQkJfigodTY0KWJsb2Nrc2l6ZSAtIDEpOworCQkJLyoKKwkJCSAqIHdlJ3ZlIGFscmVhZHkgZ290IHRoZSBleHRlbnQgbG9ja2VkLCBidXQgd2UKKwkJCSAqIG5lZWQgdG8gc3BsaXQgdGhlIHN0YXRlIHN1Y2ggdGhhdCBvdXIgZW5kX2JpbworCQkJICogaGFuZGxlciBjYW4gY2xlYXIgdGhlIGxvY2suCisJCQkgKi8KKwkJCXNldF9leHRlbnRfYml0KHRyZWUsIGJsb2NrX3N0YXJ0LAorCQkJCSAgICAgICBibG9ja19zdGFydCArIGlvc2l6ZSAtIDEsCisJCQkJICAgICAgIEVYVEVOVF9MT0NLRUQsIDAsIE5VTEwsIEdGUF9OT0ZTKTsKKwkJCXJldCA9IHN1Ym1pdF9leHRlbnRfcGFnZShSRUFELCB0cmVlLCBwYWdlLAorCQkJCQkgc2VjdG9yLCBpb3NpemUsIHBhZ2Vfb2Zmc2V0LCBlbS0+YmRldiwKKwkJCQkJIE5VTEwsIDEsCisJCQkJCSBlbmRfYmlvX2V4dGVudF9wcmVwYXJld3JpdGUsIDAsCisJCQkJCSAwLCAwKTsKKwkJCWlvY291bnQrKzsKKwkJCWJsb2NrX3N0YXJ0ID0gYmxvY2tfc3RhcnQgKyBpb3NpemU7CisJCX0gZWxzZSB7CisJCQlzZXRfZXh0ZW50X3VwdG9kYXRlKHRyZWUsIGJsb2NrX3N0YXJ0LCBjdXJfZW5kLAorCQkJCQkgICAgR0ZQX05PRlMpOworCQkJdW5sb2NrX2V4dGVudCh0cmVlLCBibG9ja19zdGFydCwgY3VyX2VuZCwgR0ZQX05PRlMpOworCQkJYmxvY2tfc3RhcnQgPSBjdXJfZW5kICsgMTsKKwkJfQorCQlwYWdlX29mZnNldCA9IGJsb2NrX3N0YXJ0ICYgKFBBR0VfQ0FDSEVfU0laRSAtIDEpOworCQlmcmVlX2V4dGVudF9tYXAoZW0pOworCX0KKwlpZiAoaW9jb3VudCkgeworCQl3YWl0X2V4dGVudF9iaXQodHJlZSwgb3JpZ19ibG9ja19zdGFydCwKKwkJCQlibG9ja19lbmQsIEVYVEVOVF9MT0NLRUQpOworCX0KKwljaGVja19wYWdlX3VwdG9kYXRlKHRyZWUsIHBhZ2UpOworZXJyOgorCS8qIEZJWE1FLCB6ZXJvIG91dCBuZXdseSBhbGxvY2F0ZWQgYmxvY2tzIG9uIGVycm9yICovCisJcmV0dXJuIGVycjsKK30KKworLyoKKyAqIGEgaGVscGVyIGZvciByZWxlYXNlcGFnZSwgdGhpcyB0ZXN0cyBmb3IgYXJlYXMgb2YgdGhlIHBhZ2UgdGhhdAorICogYXJlIGxvY2tlZCBvciB1bmRlciBJTyBhbmQgZHJvcHMgdGhlIHJlbGF0ZWQgc3RhdGUgYml0cyBpZiBpdCBpcyBzYWZlCisgKiB0byBkcm9wIHRoZSBwYWdlLgorICovCitpbnQgdHJ5X3JlbGVhc2VfZXh0ZW50X3N0YXRlKHN0cnVjdCBleHRlbnRfbWFwX3RyZWUgKm1hcCwKKwkJCSAgICAgc3RydWN0IGV4dGVudF9pb190cmVlICp0cmVlLCBzdHJ1Y3QgcGFnZSAqcGFnZSwKKwkJCSAgICAgZ2ZwX3QgbWFzaykKK3sKKwl1NjQgc3RhcnQgPSAodTY0KXBhZ2UtPmluZGV4IDw8IFBBR0VfQ0FDSEVfU0hJRlQ7CisJdTY0IGVuZCA9IHN0YXJ0ICsgUEFHRV9DQUNIRV9TSVpFIC0gMTsKKwlpbnQgcmV0ID0gMTsKKworCWlmICh0ZXN0X3JhbmdlX2JpdCh0cmVlLCBzdGFydCwgZW5kLAorCQkJICAgRVhURU5UX0lPQklUUyB8IEVYVEVOVF9PUkRFUkVELCAwKSkKKwkJcmV0ID0gMDsKKwllbHNlIHsKKwkJaWYgKChtYXNrICYgR0ZQX05PRlMpID09IEdGUF9OT0ZTKQorCQkJbWFzayA9IEdGUF9OT0ZTOworCQljbGVhcl9leHRlbnRfYml0KHRyZWUsIHN0YXJ0LCBlbmQsIEVYVEVOVF9VUFRPREFURSwKKwkJCQkgMSwgMSwgbWFzayk7CisJfQorCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBhIGhlbHBlciBmb3IgcmVsZWFzZXBhZ2UuICBBcyBsb25nIGFzIHRoZXJlIGFyZSBubyBsb2NrZWQgZXh0ZW50cworICogaW4gdGhlIHJhbmdlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHBhZ2UsIGJvdGggc3RhdGUgcmVjb3JkcyBhbmQgZXh0ZW50CisgKiBtYXAgcmVjb3JkcyBhcmUgcmVtb3ZlZAorICovCitpbnQgdHJ5X3JlbGVhc2VfZXh0ZW50X21hcHBpbmcoc3RydWN0IGV4dGVudF9tYXBfdHJlZSAqbWFwLAorCQkJICAgICAgIHN0cnVjdCBleHRlbnRfaW9fdHJlZSAqdHJlZSwgc3RydWN0IHBhZ2UgKnBhZ2UsCisJCQkgICAgICAgZ2ZwX3QgbWFzaykKK3sKKwlzdHJ1Y3QgZXh0ZW50X21hcCAqZW07CisJdTY0IHN0YXJ0ID0gKHU2NClwYWdlLT5pbmRleCA8PCBQQUdFX0NBQ0hFX1NISUZUOworCXU2NCBlbmQgPSBzdGFydCArIFBBR0VfQ0FDSEVfU0laRSAtIDE7CisKKwlpZiAoKG1hc2sgJiBfX0dGUF9XQUlUKSAmJgorCSAgICBwYWdlLT5tYXBwaW5nLT5ob3N0LT5pX3NpemUgPiAxNiAqIDEwMjQgKiAxMDI0KSB7CisJCXU2NCBsZW47CisJCXdoaWxlIChzdGFydCA8PSBlbmQpIHsKKwkJCWxlbiA9IGVuZCAtIHN0YXJ0ICsgMTsKKwkJCXNwaW5fbG9jaygmbWFwLT5sb2NrKTsKKwkJCWVtID0gbG9va3VwX2V4dGVudF9tYXBwaW5nKG1hcCwgc3RhcnQsIGxlbik7CisJCQlpZiAoIWVtIHx8IElTX0VSUihlbSkpIHsKKwkJCQlzcGluX3VubG9jaygmbWFwLT5sb2NrKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmICh0ZXN0X2JpdChFWFRFTlRfRkxBR19QSU5ORUQsICZlbS0+ZmxhZ3MpIHx8CisJCQkgICAgZW0tPnN0YXJ0ICE9IHN0YXJ0KSB7CisJCQkJc3Bpbl91bmxvY2soJm1hcC0+bG9jayk7CisJCQkJZnJlZV9leHRlbnRfbWFwKGVtKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmICghdGVzdF9yYW5nZV9iaXQodHJlZSwgZW0tPnN0YXJ0LAorCQkJCQkgICAgZXh0ZW50X21hcF9lbmQoZW0pIC0gMSwKKwkJCQkJICAgIEVYVEVOVF9MT0NLRUQgfCBFWFRFTlRfV1JJVEVCQUNLIHwKKwkJCQkJICAgIEVYVEVOVF9PUkRFUkVELAorCQkJCQkgICAgMCkpIHsKKwkJCQlyZW1vdmVfZXh0ZW50X21hcHBpbmcobWFwLCBlbSk7CisJCQkJLyogb25jZSBmb3IgdGhlIHJiIHRyZWUgKi8KKwkJCQlmcmVlX2V4dGVudF9tYXAoZW0pOworCQkJfQorCQkJc3RhcnQgPSBleHRlbnRfbWFwX2VuZChlbSk7CisJCQlzcGluX3VubG9jaygmbWFwLT5sb2NrKTsKKworCQkJLyogb25jZSBmb3IgdXMgKi8KKwkJCWZyZWVfZXh0ZW50X21hcChlbSk7CisJCX0KKwl9CisJcmV0dXJuIHRyeV9yZWxlYXNlX2V4dGVudF9zdGF0ZShtYXAsIHRyZWUsIHBhZ2UsIG1hc2spOworfQorCitzZWN0b3JfdCBleHRlbnRfYm1hcChzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywgc2VjdG9yX3QgaWJsb2NrLAorCQlnZXRfZXh0ZW50X3QgKmdldF9leHRlbnQpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IG1hcHBpbmctPmhvc3Q7CisJdTY0IHN0YXJ0ID0gaWJsb2NrIDw8IGlub2RlLT5pX2Jsa2JpdHM7CisJc2VjdG9yX3Qgc2VjdG9yID0gMDsKKwlzaXplX3QgYmxrc2l6ZSA9ICgxIDw8IGlub2RlLT5pX2Jsa2JpdHMpOworCXN0cnVjdCBleHRlbnRfbWFwICplbTsKKworCWxvY2tfZXh0ZW50KCZCVFJGU19JKGlub2RlKS0+aW9fdHJlZSwgc3RhcnQsIHN0YXJ0ICsgYmxrc2l6ZSAtIDEsCisJCSAgICBHRlBfTk9GUyk7CisJZW0gPSBnZXRfZXh0ZW50KGlub2RlLCBOVUxMLCAwLCBzdGFydCwgYmxrc2l6ZSwgMCk7CisJdW5sb2NrX2V4dGVudCgmQlRSRlNfSShpbm9kZSktPmlvX3RyZWUsIHN0YXJ0LCBzdGFydCArIGJsa3NpemUgLSAxLAorCQkgICAgICBHRlBfTk9GUyk7CisJaWYgKCFlbSB8fCBJU19FUlIoZW0pKQorCQlyZXR1cm4gMDsKKworCWlmIChlbS0+YmxvY2tfc3RhcnQgPiBFWFRFTlRfTUFQX0xBU1RfQllURSkKKwkJZ290byBvdXQ7CisKKwlzZWN0b3IgPSAoZW0tPmJsb2NrX3N0YXJ0ICsgc3RhcnQgLSBlbS0+c3RhcnQpID4+IGlub2RlLT5pX2Jsa2JpdHM7CitvdXQ6CisJZnJlZV9leHRlbnRfbWFwKGVtKTsKKwlyZXR1cm4gc2VjdG9yOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBwYWdlICpleHRlbnRfYnVmZmVyX3BhZ2Uoc3RydWN0IGV4dGVudF9idWZmZXIgKmViLAorCQkJCQkgICAgICB1bnNpZ25lZCBsb25nIGkpCit7CisJc3RydWN0IHBhZ2UgKnA7CisJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmc7CisKKwlpZiAoaSA9PSAwKQorCQlyZXR1cm4gZWItPmZpcnN0X3BhZ2U7CisJaSArPSBlYi0+c3RhcnQgPj4gUEFHRV9DQUNIRV9TSElGVDsKKwltYXBwaW5nID0gZWItPmZpcnN0X3BhZ2UtPm1hcHBpbmc7CisJaWYgKCFtYXBwaW5nKQorCQlyZXR1cm4gTlVMTDsKKworCS8qCisJICogZXh0ZW50X2J1ZmZlcl9wYWdlIGlzIG9ubHkgY2FsbGVkIGFmdGVyIHBpbm5pbmcgdGhlIHBhZ2UKKwkgKiBieSBpbmNyZWFzaW5nIHRoZSByZWZlcmVuY2UgY291bnQuICBTbyB3ZSBrbm93IHRoZSBwYWdlIG11c3QKKwkgKiBiZSBpbiB0aGUgcmFkaXggdHJlZS4KKwkgKi8KKwlyY3VfcmVhZF9sb2NrKCk7CisJcCA9IHJhZGl4X3RyZWVfbG9va3VwKCZtYXBwaW5nLT5wYWdlX3RyZWUsIGkpOworCXJjdV9yZWFkX3VubG9jaygpOworCisJcmV0dXJuIHA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBudW1fZXh0ZW50X3BhZ2VzKHU2NCBzdGFydCwgdTY0IGxlbikKK3sKKwlyZXR1cm4gKChzdGFydCArIGxlbiArIFBBR0VfQ0FDSEVfU0laRSAtIDEpID4+IFBBR0VfQ0FDSEVfU0hJRlQpIC0KKwkJKHN0YXJ0ID4+IFBBR0VfQ0FDSEVfU0hJRlQpOworfQorCitzdGF0aWMgc3RydWN0IGV4dGVudF9idWZmZXIgKl9fYWxsb2NfZXh0ZW50X2J1ZmZlcihzdHJ1Y3QgZXh0ZW50X2lvX3RyZWUgKnRyZWUsCisJCQkJCQkgICB1NjQgc3RhcnQsCisJCQkJCQkgICB1bnNpZ25lZCBsb25nIGxlbiwKKwkJCQkJCSAgIGdmcF90IG1hc2spCit7CisJc3RydWN0IGV4dGVudF9idWZmZXIgKmViID0gTlVMTDsKKyNpZmRlZiBMRUFLX0RFQlVHCisJdW5zaWduZWQgbG9uZyBmbGFnczsKKyNlbmRpZgorCisJZWIgPSBrbWVtX2NhY2hlX3phbGxvYyhleHRlbnRfYnVmZmVyX2NhY2hlLCBtYXNrKTsKKwllYi0+c3RhcnQgPSBzdGFydDsKKwllYi0+bGVuID0gbGVuOworCW11dGV4X2luaXQoJmViLT5tdXRleCk7CisjaWZkZWYgTEVBS19ERUJVRworCXNwaW5fbG9ja19pcnFzYXZlKCZsZWFrX2xvY2ssIGZsYWdzKTsKKwlsaXN0X2FkZCgmZWItPmxlYWtfbGlzdCwgJmJ1ZmZlcnMpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxlYWtfbG9jaywgZmxhZ3MpOworI2VuZGlmCisJYXRvbWljX3NldCgmZWItPnJlZnMsIDEpOworCisJcmV0dXJuIGViOworfQorCitzdGF0aWMgdm9pZCBfX2ZyZWVfZXh0ZW50X2J1ZmZlcihzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqZWIpCit7CisjaWZkZWYgTEVBS19ERUJVRworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmxlYWtfbG9jaywgZmxhZ3MpOworCWxpc3RfZGVsKCZlYi0+bGVha19saXN0KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsZWFrX2xvY2ssIGZsYWdzKTsKKyNlbmRpZgorCWttZW1fY2FjaGVfZnJlZShleHRlbnRfYnVmZmVyX2NhY2hlLCBlYik7Cit9CisKK3N0cnVjdCBleHRlbnRfYnVmZmVyICphbGxvY19leHRlbnRfYnVmZmVyKHN0cnVjdCBleHRlbnRfaW9fdHJlZSAqdHJlZSwKKwkJCQkJICB1NjQgc3RhcnQsIHVuc2lnbmVkIGxvbmcgbGVuLAorCQkJCQkgIHN0cnVjdCBwYWdlICpwYWdlMCwKKwkJCQkJICBnZnBfdCBtYXNrKQoreworCXVuc2lnbmVkIGxvbmcgbnVtX3BhZ2VzID0gbnVtX2V4dGVudF9wYWdlcyhzdGFydCwgbGVuKTsKKwl1bnNpZ25lZCBsb25nIGk7CisJdW5zaWduZWQgbG9uZyBpbmRleCA9IHN0YXJ0ID4+IFBBR0VfQ0FDSEVfU0hJRlQ7CisJc3RydWN0IGV4dGVudF9idWZmZXIgKmViOworCXN0cnVjdCBleHRlbnRfYnVmZmVyICpleGlzdHMgPSBOVUxMOworCXN0cnVjdCBwYWdlICpwOworCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gdHJlZS0+bWFwcGluZzsKKwlpbnQgdXB0b2RhdGUgPSAxOworCisJc3Bpbl9sb2NrKCZ0cmVlLT5idWZmZXJfbG9jayk7CisJZWIgPSBidWZmZXJfc2VhcmNoKHRyZWUsIHN0YXJ0KTsKKwlpZiAoZWIpIHsKKwkJYXRvbWljX2luYygmZWItPnJlZnMpOworCQlzcGluX3VubG9jaygmdHJlZS0+YnVmZmVyX2xvY2spOworCQltYXJrX3BhZ2VfYWNjZXNzZWQoZWItPmZpcnN0X3BhZ2UpOworCQlyZXR1cm4gZWI7CisJfQorCXNwaW5fdW5sb2NrKCZ0cmVlLT5idWZmZXJfbG9jayk7CisKKwllYiA9IF9fYWxsb2NfZXh0ZW50X2J1ZmZlcih0cmVlLCBzdGFydCwgbGVuLCBtYXNrKTsKKwlpZiAoIWViKQorCQlyZXR1cm4gTlVMTDsKKworCWlmIChwYWdlMCkgeworCQllYi0+Zmlyc3RfcGFnZSA9IHBhZ2UwOworCQlpID0gMTsKKwkJaW5kZXgrKzsKKwkJcGFnZV9jYWNoZV9nZXQocGFnZTApOworCQltYXJrX3BhZ2VfYWNjZXNzZWQocGFnZTApOworCQlzZXRfcGFnZV9leHRlbnRfbWFwcGVkKHBhZ2UwKTsKKwkJc2V0X3BhZ2VfZXh0ZW50X2hlYWQocGFnZTAsIGxlbik7CisJCXVwdG9kYXRlID0gUGFnZVVwdG9kYXRlKHBhZ2UwKTsKKwl9IGVsc2UgeworCQlpID0gMDsKKwl9CisJZm9yICg7IGkgPCBudW1fcGFnZXM7IGkrKywgaW5kZXgrKykgeworCQlwID0gZmluZF9vcl9jcmVhdGVfcGFnZShtYXBwaW5nLCBpbmRleCwgbWFzayB8IF9fR0ZQX0hJR0hNRU0pOworCQlpZiAoIXApIHsKKwkJCVdBUk5fT04oMSk7CisJCQlnb3RvIGZyZWVfZWI7CisJCX0KKwkJc2V0X3BhZ2VfZXh0ZW50X21hcHBlZChwKTsKKwkJbWFya19wYWdlX2FjY2Vzc2VkKHApOworCQlpZiAoaSA9PSAwKSB7CisJCQllYi0+Zmlyc3RfcGFnZSA9IHA7CisJCQlzZXRfcGFnZV9leHRlbnRfaGVhZChwLCBsZW4pOworCQl9IGVsc2UgeworCQkJc2V0X3BhZ2VfcHJpdmF0ZShwLCBFWFRFTlRfUEFHRV9QUklWQVRFKTsKKwkJfQorCQlpZiAoIVBhZ2VVcHRvZGF0ZShwKSkKKwkJCXVwdG9kYXRlID0gMDsKKwkJdW5sb2NrX3BhZ2UocCk7CisJfQorCWlmICh1cHRvZGF0ZSkKKwkJZWItPmZsYWdzIHw9IEVYVEVOVF9VUFRPREFURTsKKwllYi0+ZmxhZ3MgfD0gRVhURU5UX0JVRkZFUl9GSUxMRUQ7CisKKwlzcGluX2xvY2soJnRyZWUtPmJ1ZmZlcl9sb2NrKTsKKwlleGlzdHMgPSBidWZmZXJfdHJlZV9pbnNlcnQodHJlZSwgc3RhcnQsICZlYi0+cmJfbm9kZSk7CisJaWYgKGV4aXN0cykgeworCQkvKiBhZGQgb25lIHJlZmVyZW5jZSBmb3IgdGhlIGNhbGxlciAqLworCQlhdG9taWNfaW5jKCZleGlzdHMtPnJlZnMpOworCQlzcGluX3VubG9jaygmdHJlZS0+YnVmZmVyX2xvY2spOworCQlnb3RvIGZyZWVfZWI7CisJfQorCXNwaW5fdW5sb2NrKCZ0cmVlLT5idWZmZXJfbG9jayk7CisKKwkvKiBhZGQgb25lIHJlZmVyZW5jZSBmb3IgdGhlIHRyZWUgKi8KKwlhdG9taWNfaW5jKCZlYi0+cmVmcyk7CisJcmV0dXJuIGViOworCitmcmVlX2ViOgorCWlmICghYXRvbWljX2RlY19hbmRfdGVzdCgmZWItPnJlZnMpKQorCQlyZXR1cm4gZXhpc3RzOworCWZvciAoaW5kZXggPSAxOyBpbmRleCA8IGk7IGluZGV4KyspCisJCXBhZ2VfY2FjaGVfcmVsZWFzZShleHRlbnRfYnVmZmVyX3BhZ2UoZWIsIGluZGV4KSk7CisJcGFnZV9jYWNoZV9yZWxlYXNlKGV4dGVudF9idWZmZXJfcGFnZShlYiwgMCkpOworCV9fZnJlZV9leHRlbnRfYnVmZmVyKGViKTsKKwlyZXR1cm4gZXhpc3RzOworfQorCitzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqZmluZF9leHRlbnRfYnVmZmVyKHN0cnVjdCBleHRlbnRfaW9fdHJlZSAqdHJlZSwKKwkJCQkJIHU2NCBzdGFydCwgdW5zaWduZWQgbG9uZyBsZW4sCisJCQkJCSAgZ2ZwX3QgbWFzaykKK3sKKwlzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqZWI7CisKKwlzcGluX2xvY2soJnRyZWUtPmJ1ZmZlcl9sb2NrKTsKKwllYiA9IGJ1ZmZlcl9zZWFyY2godHJlZSwgc3RhcnQpOworCWlmIChlYikKKwkJYXRvbWljX2luYygmZWItPnJlZnMpOworCXNwaW5fdW5sb2NrKCZ0cmVlLT5idWZmZXJfbG9jayk7CisKKwlpZiAoZWIpCisJCW1hcmtfcGFnZV9hY2Nlc3NlZChlYi0+Zmlyc3RfcGFnZSk7CisKKwlyZXR1cm4gZWI7Cit9CisKK3ZvaWQgZnJlZV9leHRlbnRfYnVmZmVyKHN0cnVjdCBleHRlbnRfYnVmZmVyICplYikKK3sKKwlpZiAoIWViKQorCQlyZXR1cm47CisKKwlpZiAoIWF0b21pY19kZWNfYW5kX3Rlc3QoJmViLT5yZWZzKSkKKwkJcmV0dXJuOworCisJV0FSTl9PTigxKTsKK30KKworaW50IGNsZWFyX2V4dGVudF9idWZmZXJfZGlydHkoc3RydWN0IGV4dGVudF9pb190cmVlICp0cmVlLAorCQkJICAgICAgc3RydWN0IGV4dGVudF9idWZmZXIgKmViKQoreworCWludCBzZXQ7CisJdW5zaWduZWQgbG9uZyBpOworCXVuc2lnbmVkIGxvbmcgbnVtX3BhZ2VzOworCXN0cnVjdCBwYWdlICpwYWdlOworCisJdTY0IHN0YXJ0ID0gZWItPnN0YXJ0OworCXU2NCBlbmQgPSBzdGFydCArIGViLT5sZW4gLSAxOworCisJc2V0ID0gY2xlYXJfZXh0ZW50X2RpcnR5KHRyZWUsIHN0YXJ0LCBlbmQsIEdGUF9OT0ZTKTsKKwludW1fcGFnZXMgPSBudW1fZXh0ZW50X3BhZ2VzKGViLT5zdGFydCwgZWItPmxlbik7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX3BhZ2VzOyBpKyspIHsKKwkJcGFnZSA9IGV4dGVudF9idWZmZXJfcGFnZShlYiwgaSk7CisJCWlmICghc2V0ICYmICFQYWdlRGlydHkocGFnZSkpCisJCQljb250aW51ZTsKKworCQlsb2NrX3BhZ2UocGFnZSk7CisJCWlmIChpID09IDApCisJCQlzZXRfcGFnZV9leHRlbnRfaGVhZChwYWdlLCBlYi0+bGVuKTsKKwkJZWxzZQorCQkJc2V0X3BhZ2VfcHJpdmF0ZShwYWdlLCBFWFRFTlRfUEFHRV9QUklWQVRFKTsKKworCQkvKgorCQkgKiBpZiB3ZSdyZSBvbiB0aGUgbGFzdCBwYWdlIG9yIHRoZSBmaXJzdCBwYWdlIGFuZCB0aGUKKwkJICogYmxvY2sgaXNuJ3QgYWxpZ25lZCBvbiBhIHBhZ2UgYm91bmRhcnksIGRvIGV4dHJhIGNoZWNrcworCQkgKiB0byBtYWtlIHN1cmUgd2UgZG9uJ3QgY2xlYW4gcGFnZSB0aGF0IGlzIHBhcnRpYWxseSBkaXJ0eQorCQkgKi8KKwkJaWYgKChpID09IDAgJiYgKGViLT5zdGFydCAmIChQQUdFX0NBQ0hFX1NJWkUgLSAxKSkpIHx8CisJCSAgICAoKGkgPT0gbnVtX3BhZ2VzIC0gMSkgJiYKKwkJICAgICAoKGViLT5zdGFydCArIGViLT5sZW4pICYgKFBBR0VfQ0FDSEVfU0laRSAtIDEpKSkpIHsKKwkJCXN0YXJ0ID0gKHU2NClwYWdlLT5pbmRleCA8PCBQQUdFX0NBQ0hFX1NISUZUOworCQkJZW5kICA9IHN0YXJ0ICsgUEFHRV9DQUNIRV9TSVpFIC0gMTsKKwkJCWlmICh0ZXN0X3JhbmdlX2JpdCh0cmVlLCBzdGFydCwgZW5kLAorCQkJCQkgICBFWFRFTlRfRElSVFksIDApKSB7CisJCQkJdW5sb2NrX3BhZ2UocGFnZSk7CisJCQkJY29udGludWU7CisJCQl9CisJCX0KKwkJY2xlYXJfcGFnZV9kaXJ0eV9mb3JfaW8ocGFnZSk7CisJCXNwaW5fbG9ja19pcnEoJnBhZ2UtPm1hcHBpbmctPnRyZWVfbG9jayk7CisJCWlmICghUGFnZURpcnR5KHBhZ2UpKSB7CisJCQlyYWRpeF90cmVlX3RhZ19jbGVhcigmcGFnZS0+bWFwcGluZy0+cGFnZV90cmVlLAorCQkJCQkJcGFnZV9pbmRleChwYWdlKSwKKwkJCQkJCVBBR0VDQUNIRV9UQUdfRElSVFkpOworCQl9CisJCXNwaW5fdW5sb2NrX2lycSgmcGFnZS0+bWFwcGluZy0+dHJlZV9sb2NrKTsKKwkJdW5sb2NrX3BhZ2UocGFnZSk7CisJfQorCXJldHVybiAwOworfQorCitpbnQgd2FpdF9vbl9leHRlbnRfYnVmZmVyX3dyaXRlYmFjayhzdHJ1Y3QgZXh0ZW50X2lvX3RyZWUgKnRyZWUsCisJCQkJICAgIHN0cnVjdCBleHRlbnRfYnVmZmVyICplYikKK3sKKwlyZXR1cm4gd2FpdF9vbl9leHRlbnRfd3JpdGViYWNrKHRyZWUsIGViLT5zdGFydCwKKwkJCQkJZWItPnN0YXJ0ICsgZWItPmxlbiAtIDEpOworfQorCitpbnQgc2V0X2V4dGVudF9idWZmZXJfZGlydHkoc3RydWN0IGV4dGVudF9pb190cmVlICp0cmVlLAorCQkJICAgICBzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqZWIpCit7CisJdW5zaWduZWQgbG9uZyBpOworCXVuc2lnbmVkIGxvbmcgbnVtX3BhZ2VzOworCisJbnVtX3BhZ2VzID0gbnVtX2V4dGVudF9wYWdlcyhlYi0+c3RhcnQsIGViLT5sZW4pOworCWZvciAoaSA9IDA7IGkgPCBudW1fcGFnZXM7IGkrKykgeworCQlzdHJ1Y3QgcGFnZSAqcGFnZSA9IGV4dGVudF9idWZmZXJfcGFnZShlYiwgaSk7CisJCS8qIHdyaXRlcGFnZSBtYXkgbmVlZCB0byBkbyBzb21ldGhpbmcgc3BlY2lhbCBmb3IgdGhlCisJCSAqIGZpcnN0IHBhZ2UsIHdlIGhhdmUgdG8gbWFrZSBzdXJlIHBhZ2UtPnByaXZhdGUgaXMKKwkJICogcHJvcGVybHkgc2V0LiAgcmVsZWFzZXBhZ2UgbWF5IGRyb3AgcGFnZS0+cHJpdmF0ZQorCQkgKiBvbiB1cyBpZiB0aGUgcGFnZSBpc24ndCBhbHJlYWR5IGRpcnR5LgorCQkgKi8KKwkJbG9ja19wYWdlKHBhZ2UpOworCQlpZiAoaSA9PSAwKSB7CisJCQlzZXRfcGFnZV9leHRlbnRfaGVhZChwYWdlLCBlYi0+bGVuKTsKKwkJfSBlbHNlIGlmIChQYWdlUHJpdmF0ZShwYWdlKSAmJgorCQkJICAgcGFnZS0+cHJpdmF0ZSAhPSBFWFRFTlRfUEFHRV9QUklWQVRFKSB7CisJCQlzZXRfcGFnZV9leHRlbnRfbWFwcGVkKHBhZ2UpOworCQl9CisJCV9fc2V0X3BhZ2VfZGlydHlfbm9idWZmZXJzKGV4dGVudF9idWZmZXJfcGFnZShlYiwgaSkpOworCQlzZXRfZXh0ZW50X2RpcnR5KHRyZWUsIHBhZ2Vfb2Zmc2V0KHBhZ2UpLAorCQkJCSBwYWdlX29mZnNldChwYWdlKSArIFBBR0VfQ0FDSEVfU0laRSAtIDEsCisJCQkJIEdGUF9OT0ZTKTsKKwkJdW5sb2NrX3BhZ2UocGFnZSk7CisJfQorCXJldHVybiAwOworfQorCitpbnQgY2xlYXJfZXh0ZW50X2J1ZmZlcl91cHRvZGF0ZShzdHJ1Y3QgZXh0ZW50X2lvX3RyZWUgKnRyZWUsCisJCQkJc3RydWN0IGV4dGVudF9idWZmZXIgKmViKQoreworCXVuc2lnbmVkIGxvbmcgaTsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwl1bnNpZ25lZCBsb25nIG51bV9wYWdlczsKKworCW51bV9wYWdlcyA9IG51bV9leHRlbnRfcGFnZXMoZWItPnN0YXJ0LCBlYi0+bGVuKTsKKwllYi0+ZmxhZ3MgJj0gfkVYVEVOVF9VUFRPREFURTsKKworCWNsZWFyX2V4dGVudF91cHRvZGF0ZSh0cmVlLCBlYi0+c3RhcnQsIGViLT5zdGFydCArIGViLT5sZW4gLSAxLAorCQkJICAgICAgR0ZQX05PRlMpOworCWZvciAoaSA9IDA7IGkgPCBudW1fcGFnZXM7IGkrKykgeworCQlwYWdlID0gZXh0ZW50X2J1ZmZlcl9wYWdlKGViLCBpKTsKKwkJaWYgKHBhZ2UpCisJCQlDbGVhclBhZ2VVcHRvZGF0ZShwYWdlKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK2ludCBzZXRfZXh0ZW50X2J1ZmZlcl91cHRvZGF0ZShzdHJ1Y3QgZXh0ZW50X2lvX3RyZWUgKnRyZWUsCisJCQkJc3RydWN0IGV4dGVudF9idWZmZXIgKmViKQoreworCXVuc2lnbmVkIGxvbmcgaTsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwl1bnNpZ25lZCBsb25nIG51bV9wYWdlczsKKworCW51bV9wYWdlcyA9IG51bV9leHRlbnRfcGFnZXMoZWItPnN0YXJ0LCBlYi0+bGVuKTsKKworCXNldF9leHRlbnRfdXB0b2RhdGUodHJlZSwgZWItPnN0YXJ0LCBlYi0+c3RhcnQgKyBlYi0+bGVuIC0gMSwKKwkJCSAgICBHRlBfTk9GUyk7CisJZm9yIChpID0gMDsgaSA8IG51bV9wYWdlczsgaSsrKSB7CisJCXBhZ2UgPSBleHRlbnRfYnVmZmVyX3BhZ2UoZWIsIGkpOworCQlpZiAoKGkgPT0gMCAmJiAoZWItPnN0YXJ0ICYgKFBBR0VfQ0FDSEVfU0laRSAtIDEpKSkgfHwKKwkJICAgICgoaSA9PSBudW1fcGFnZXMgLSAxKSAmJgorCQkgICAgICgoZWItPnN0YXJ0ICsgZWItPmxlbikgJiAoUEFHRV9DQUNIRV9TSVpFIC0gMSkpKSkgeworCQkJY2hlY2tfcGFnZV91cHRvZGF0ZSh0cmVlLCBwYWdlKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCVNldFBhZ2VVcHRvZGF0ZShwYWdlKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK2ludCBleHRlbnRfcmFuZ2VfdXB0b2RhdGUoc3RydWN0IGV4dGVudF9pb190cmVlICp0cmVlLAorCQkJICB1NjQgc3RhcnQsIHU2NCBlbmQpCit7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisJaW50IHJldDsKKwlpbnQgcGdfdXB0b2RhdGUgPSAxOworCWludCB1cHRvZGF0ZTsKKwl1bnNpZ25lZCBsb25nIGluZGV4OworCisJcmV0ID0gdGVzdF9yYW5nZV9iaXQodHJlZSwgc3RhcnQsIGVuZCwgRVhURU5UX1VQVE9EQVRFLCAxKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gMTsKKwl3aGlsZSAoc3RhcnQgPD0gZW5kKSB7CisJCWluZGV4ID0gc3RhcnQgPj4gUEFHRV9DQUNIRV9TSElGVDsKKwkJcGFnZSA9IGZpbmRfZ2V0X3BhZ2UodHJlZS0+bWFwcGluZywgaW5kZXgpOworCQl1cHRvZGF0ZSA9IFBhZ2VVcHRvZGF0ZShwYWdlKTsKKwkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOworCQlpZiAoIXVwdG9kYXRlKSB7CisJCQlwZ191cHRvZGF0ZSA9IDA7CisJCQlicmVhazsKKwkJfQorCQlzdGFydCArPSBQQUdFX0NBQ0hFX1NJWkU7CisJfQorCXJldHVybiBwZ191cHRvZGF0ZTsKK30KKworaW50IGV4dGVudF9idWZmZXJfdXB0b2RhdGUoc3RydWN0IGV4dGVudF9pb190cmVlICp0cmVlLAorCQkJICAgc3RydWN0IGV4dGVudF9idWZmZXIgKmViKQoreworCWludCByZXQgPSAwOworCXVuc2lnbmVkIGxvbmcgbnVtX3BhZ2VzOworCXVuc2lnbmVkIGxvbmcgaTsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwlpbnQgcGdfdXB0b2RhdGUgPSAxOworCisJaWYgKGViLT5mbGFncyAmIEVYVEVOVF9VUFRPREFURSkKKwkJcmV0dXJuIDE7CisKKwlyZXQgPSB0ZXN0X3JhbmdlX2JpdCh0cmVlLCBlYi0+c3RhcnQsIGViLT5zdGFydCArIGViLT5sZW4gLSAxLAorCQkJICAgRVhURU5UX1VQVE9EQVRFLCAxKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJbnVtX3BhZ2VzID0gbnVtX2V4dGVudF9wYWdlcyhlYi0+c3RhcnQsIGViLT5sZW4pOworCWZvciAoaSA9IDA7IGkgPCBudW1fcGFnZXM7IGkrKykgeworCQlwYWdlID0gZXh0ZW50X2J1ZmZlcl9wYWdlKGViLCBpKTsKKwkJaWYgKCFQYWdlVXB0b2RhdGUocGFnZSkpIHsKKwkJCXBnX3VwdG9kYXRlID0gMDsKKwkJCWJyZWFrOworCQl9CisJfQorCXJldHVybiBwZ191cHRvZGF0ZTsKK30KKworaW50IHJlYWRfZXh0ZW50X2J1ZmZlcl9wYWdlcyhzdHJ1Y3QgZXh0ZW50X2lvX3RyZWUgKnRyZWUsCisJCQkgICAgIHN0cnVjdCBleHRlbnRfYnVmZmVyICplYiwKKwkJCSAgICAgdTY0IHN0YXJ0LCBpbnQgd2FpdCwKKwkJCSAgICAgZ2V0X2V4dGVudF90ICpnZXRfZXh0ZW50LCBpbnQgbWlycm9yX251bSkKK3sKKwl1bnNpZ25lZCBsb25nIGk7CisJdW5zaWduZWQgbG9uZyBzdGFydF9pOworCXN0cnVjdCBwYWdlICpwYWdlOworCWludCBlcnI7CisJaW50IHJldCA9IDA7CisJaW50IGxvY2tlZF9wYWdlcyA9IDA7CisJaW50IGFsbF91cHRvZGF0ZSA9IDE7CisJaW50IGluY19hbGxfcGFnZXMgPSAwOworCXVuc2lnbmVkIGxvbmcgbnVtX3BhZ2VzOworCXN0cnVjdCBiaW8gKmJpbyA9IE5VTEw7CisJdW5zaWduZWQgbG9uZyBiaW9fZmxhZ3MgPSAwOworCisJaWYgKGViLT5mbGFncyAmIEVYVEVOVF9VUFRPREFURSkKKwkJcmV0dXJuIDA7CisKKwlpZiAodGVzdF9yYW5nZV9iaXQodHJlZSwgZWItPnN0YXJ0LCBlYi0+c3RhcnQgKyBlYi0+bGVuIC0gMSwKKwkJCSAgIEVYVEVOVF9VUFRPREFURSwgMSkpIHsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKHN0YXJ0KSB7CisJCVdBUk5fT04oc3RhcnQgPCBlYi0+c3RhcnQpOworCQlzdGFydF9pID0gKHN0YXJ0ID4+IFBBR0VfQ0FDSEVfU0hJRlQpIC0KKwkJCShlYi0+c3RhcnQgPj4gUEFHRV9DQUNIRV9TSElGVCk7CisJfSBlbHNlIHsKKwkJc3RhcnRfaSA9IDA7CisJfQorCisJbnVtX3BhZ2VzID0gbnVtX2V4dGVudF9wYWdlcyhlYi0+c3RhcnQsIGViLT5sZW4pOworCWZvciAoaSA9IHN0YXJ0X2k7IGkgPCBudW1fcGFnZXM7IGkrKykgeworCQlwYWdlID0gZXh0ZW50X2J1ZmZlcl9wYWdlKGViLCBpKTsKKwkJaWYgKCF3YWl0KSB7CisJCQlpZiAoIXRyeWxvY2tfcGFnZShwYWdlKSkKKwkJCQlnb3RvIHVubG9ja19leGl0OworCQl9IGVsc2UgeworCQkJbG9ja19wYWdlKHBhZ2UpOworCQl9CisJCWxvY2tlZF9wYWdlcysrOworCQlpZiAoIVBhZ2VVcHRvZGF0ZShwYWdlKSkKKwkJCWFsbF91cHRvZGF0ZSA9IDA7CisJfQorCWlmIChhbGxfdXB0b2RhdGUpIHsKKwkJaWYgKHN0YXJ0X2kgPT0gMCkKKwkJCWViLT5mbGFncyB8PSBFWFRFTlRfVVBUT0RBVEU7CisJCWdvdG8gdW5sb2NrX2V4aXQ7CisJfQorCisJZm9yIChpID0gc3RhcnRfaTsgaSA8IG51bV9wYWdlczsgaSsrKSB7CisJCXBhZ2UgPSBleHRlbnRfYnVmZmVyX3BhZ2UoZWIsIGkpOworCQlpZiAoaW5jX2FsbF9wYWdlcykKKwkJCXBhZ2VfY2FjaGVfZ2V0KHBhZ2UpOworCQlpZiAoIVBhZ2VVcHRvZGF0ZShwYWdlKSkgeworCQkJaWYgKHN0YXJ0X2kgPT0gMCkKKwkJCQlpbmNfYWxsX3BhZ2VzID0gMTsKKwkJCUNsZWFyUGFnZUVycm9yKHBhZ2UpOworCQkJZXJyID0gX19leHRlbnRfcmVhZF9mdWxsX3BhZ2UodHJlZSwgcGFnZSwKKwkJCQkJCSAgICAgIGdldF9leHRlbnQsICZiaW8sCisJCQkJCQkgICAgICBtaXJyb3JfbnVtLCAmYmlvX2ZsYWdzKTsKKwkJCWlmIChlcnIpCisJCQkJcmV0ID0gZXJyOworCQl9IGVsc2UgeworCQkJdW5sb2NrX3BhZ2UocGFnZSk7CisJCX0KKwl9CisKKwlpZiAoYmlvKQorCQlzdWJtaXRfb25lX2JpbyhSRUFELCBiaW8sIG1pcnJvcl9udW0sIGJpb19mbGFncyk7CisKKwlpZiAocmV0IHx8ICF3YWl0KQorCQlyZXR1cm4gcmV0OworCisJZm9yIChpID0gc3RhcnRfaTsgaSA8IG51bV9wYWdlczsgaSsrKSB7CisJCXBhZ2UgPSBleHRlbnRfYnVmZmVyX3BhZ2UoZWIsIGkpOworCQl3YWl0X29uX3BhZ2VfbG9ja2VkKHBhZ2UpOworCQlpZiAoIVBhZ2VVcHRvZGF0ZShwYWdlKSkKKwkJCXJldCA9IC1FSU87CisJfQorCisJaWYgKCFyZXQpCisJCWViLT5mbGFncyB8PSBFWFRFTlRfVVBUT0RBVEU7CisJcmV0dXJuIHJldDsKKwordW5sb2NrX2V4aXQ6CisJaSA9IHN0YXJ0X2k7CisJd2hpbGUgKGxvY2tlZF9wYWdlcyA+IDApIHsKKwkJcGFnZSA9IGV4dGVudF9idWZmZXJfcGFnZShlYiwgaSk7CisJCWkrKzsKKwkJdW5sb2NrX3BhZ2UocGFnZSk7CisJCWxvY2tlZF9wYWdlcy0tOworCX0KKwlyZXR1cm4gcmV0OworfQorCit2b2lkIHJlYWRfZXh0ZW50X2J1ZmZlcihzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqZWIsIHZvaWQgKmRzdHYsCisJCQl1bnNpZ25lZCBsb25nIHN0YXJ0LAorCQkJdW5zaWduZWQgbG9uZyBsZW4pCit7CisJc2l6ZV90IGN1cjsKKwlzaXplX3Qgb2Zmc2V0OworCXN0cnVjdCBwYWdlICpwYWdlOworCWNoYXIgKmthZGRyOworCWNoYXIgKmRzdCA9IChjaGFyICopZHN0djsKKwlzaXplX3Qgc3RhcnRfb2Zmc2V0ID0gZWItPnN0YXJ0ICYgKCh1NjQpUEFHRV9DQUNIRV9TSVpFIC0gMSk7CisJdW5zaWduZWQgbG9uZyBpID0gKHN0YXJ0X29mZnNldCArIHN0YXJ0KSA+PiBQQUdFX0NBQ0hFX1NISUZUOworCisJV0FSTl9PTihzdGFydCA+IGViLT5sZW4pOworCVdBUk5fT04oc3RhcnQgKyBsZW4gPiBlYi0+c3RhcnQgKyBlYi0+bGVuKTsKKworCW9mZnNldCA9IChzdGFydF9vZmZzZXQgKyBzdGFydCkgJiAoKHVuc2lnbmVkIGxvbmcpUEFHRV9DQUNIRV9TSVpFIC0gMSk7CisKKwl3aGlsZSAobGVuID4gMCkgeworCQlwYWdlID0gZXh0ZW50X2J1ZmZlcl9wYWdlKGViLCBpKTsKKworCQljdXIgPSBtaW4obGVuLCAoUEFHRV9DQUNIRV9TSVpFIC0gb2Zmc2V0KSk7CisJCWthZGRyID0ga21hcF9hdG9taWMocGFnZSwgS01fVVNFUjEpOworCQltZW1jcHkoZHN0LCBrYWRkciArIG9mZnNldCwgY3VyKTsKKwkJa3VubWFwX2F0b21pYyhrYWRkciwgS01fVVNFUjEpOworCisJCWRzdCArPSBjdXI7CisJCWxlbiAtPSBjdXI7CisJCW9mZnNldCA9IDA7CisJCWkrKzsKKwl9Cit9CisKK2ludCBtYXBfcHJpdmF0ZV9leHRlbnRfYnVmZmVyKHN0cnVjdCBleHRlbnRfYnVmZmVyICplYiwgdW5zaWduZWQgbG9uZyBzdGFydCwKKwkJCSAgICAgICB1bnNpZ25lZCBsb25nIG1pbl9sZW4sIGNoYXIgKip0b2tlbiwgY2hhciAqKm1hcCwKKwkJCSAgICAgICB1bnNpZ25lZCBsb25nICptYXBfc3RhcnQsCisJCQkgICAgICAgdW5zaWduZWQgbG9uZyAqbWFwX2xlbiwgaW50IGttKQoreworCXNpemVfdCBvZmZzZXQgPSBzdGFydCAmIChQQUdFX0NBQ0hFX1NJWkUgLSAxKTsKKwljaGFyICprYWRkcjsKKwlzdHJ1Y3QgcGFnZSAqcDsKKwlzaXplX3Qgc3RhcnRfb2Zmc2V0ID0gZWItPnN0YXJ0ICYgKCh1NjQpUEFHRV9DQUNIRV9TSVpFIC0gMSk7CisJdW5zaWduZWQgbG9uZyBpID0gKHN0YXJ0X29mZnNldCArIHN0YXJ0KSA+PiBQQUdFX0NBQ0hFX1NISUZUOworCXVuc2lnbmVkIGxvbmcgZW5kX2kgPSAoc3RhcnRfb2Zmc2V0ICsgc3RhcnQgKyBtaW5fbGVuIC0gMSkgPj4KKwkJUEFHRV9DQUNIRV9TSElGVDsKKworCWlmIChpICE9IGVuZF9pKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChpID09IDApIHsKKwkJb2Zmc2V0ID0gc3RhcnRfb2Zmc2V0OworCQkqbWFwX3N0YXJ0ID0gMDsKKwl9IGVsc2UgeworCQlvZmZzZXQgPSAwOworCQkqbWFwX3N0YXJ0ID0gKCh1NjQpaSA8PCBQQUdFX0NBQ0hFX1NISUZUKSAtIHN0YXJ0X29mZnNldDsKKwl9CisKKwlpZiAoc3RhcnQgKyBtaW5fbGVuID4gZWItPmxlbikgeworCQlwcmludGsoS0VSTl9FUlIgImJ0cmZzIGJhZCBtYXBwaW5nIGViIHN0YXJ0ICVsbHUgbGVuICVsdSwgIgorCQkgICAgICAgIndhbnRlZCAlbHUgJWx1XG4iLCAodW5zaWduZWQgbG9uZyBsb25nKWViLT5zdGFydCwKKwkJICAgICAgIGViLT5sZW4sIHN0YXJ0LCBtaW5fbGVuKTsKKwkJV0FSTl9PTigxKTsKKwl9CisKKwlwID0gZXh0ZW50X2J1ZmZlcl9wYWdlKGViLCBpKTsKKwlrYWRkciA9IGttYXBfYXRvbWljKHAsIGttKTsKKwkqdG9rZW4gPSBrYWRkcjsKKwkqbWFwID0ga2FkZHIgKyBvZmZzZXQ7CisJKm1hcF9sZW4gPSBQQUdFX0NBQ0hFX1NJWkUgLSBvZmZzZXQ7CisJcmV0dXJuIDA7Cit9CisKK2ludCBtYXBfZXh0ZW50X2J1ZmZlcihzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqZWIsIHVuc2lnbmVkIGxvbmcgc3RhcnQsCisJCSAgICAgIHVuc2lnbmVkIGxvbmcgbWluX2xlbiwKKwkJICAgICAgY2hhciAqKnRva2VuLCBjaGFyICoqbWFwLAorCQkgICAgICB1bnNpZ25lZCBsb25nICptYXBfc3RhcnQsCisJCSAgICAgIHVuc2lnbmVkIGxvbmcgKm1hcF9sZW4sIGludCBrbSkKK3sKKwlpbnQgZXJyOworCWludCBzYXZlID0gMDsKKwlpZiAoZWItPm1hcF90b2tlbikgeworCQl1bm1hcF9leHRlbnRfYnVmZmVyKGViLCBlYi0+bWFwX3Rva2VuLCBrbSk7CisJCWViLT5tYXBfdG9rZW4gPSBOVUxMOworCQlzYXZlID0gMTsKKwkJV0FSTl9PTighbXV0ZXhfaXNfbG9ja2VkKCZlYi0+bXV0ZXgpKTsKKwl9CisJZXJyID0gbWFwX3ByaXZhdGVfZXh0ZW50X2J1ZmZlcihlYiwgc3RhcnQsIG1pbl9sZW4sIHRva2VuLCBtYXAsCisJCQkJICAgICAgIG1hcF9zdGFydCwgbWFwX2xlbiwga20pOworCWlmICghZXJyICYmIHNhdmUpIHsKKwkJZWItPm1hcF90b2tlbiA9ICp0b2tlbjsKKwkJZWItPmthZGRyID0gKm1hcDsKKwkJZWItPm1hcF9zdGFydCA9ICptYXBfc3RhcnQ7CisJCWViLT5tYXBfbGVuID0gKm1hcF9sZW47CisJfQorCXJldHVybiBlcnI7Cit9CisKK3ZvaWQgdW5tYXBfZXh0ZW50X2J1ZmZlcihzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqZWIsIGNoYXIgKnRva2VuLCBpbnQga20pCit7CisJa3VubWFwX2F0b21pYyh0b2tlbiwga20pOworfQorCitpbnQgbWVtY21wX2V4dGVudF9idWZmZXIoc3RydWN0IGV4dGVudF9idWZmZXIgKmViLCBjb25zdCB2b2lkICpwdHJ2LAorCQkJICB1bnNpZ25lZCBsb25nIHN0YXJ0LAorCQkJICB1bnNpZ25lZCBsb25nIGxlbikKK3sKKwlzaXplX3QgY3VyOworCXNpemVfdCBvZmZzZXQ7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisJY2hhciAqa2FkZHI7CisJY2hhciAqcHRyID0gKGNoYXIgKilwdHJ2OworCXNpemVfdCBzdGFydF9vZmZzZXQgPSBlYi0+c3RhcnQgJiAoKHU2NClQQUdFX0NBQ0hFX1NJWkUgLSAxKTsKKwl1bnNpZ25lZCBsb25nIGkgPSAoc3RhcnRfb2Zmc2V0ICsgc3RhcnQpID4+IFBBR0VfQ0FDSEVfU0hJRlQ7CisJaW50IHJldCA9IDA7CisKKwlXQVJOX09OKHN0YXJ0ID4gZWItPmxlbik7CisJV0FSTl9PTihzdGFydCArIGxlbiA+IGViLT5zdGFydCArIGViLT5sZW4pOworCisJb2Zmc2V0ID0gKHN0YXJ0X29mZnNldCArIHN0YXJ0KSAmICgodW5zaWduZWQgbG9uZylQQUdFX0NBQ0hFX1NJWkUgLSAxKTsKKworCXdoaWxlIChsZW4gPiAwKSB7CisJCXBhZ2UgPSBleHRlbnRfYnVmZmVyX3BhZ2UoZWIsIGkpOworCisJCWN1ciA9IG1pbihsZW4sIChQQUdFX0NBQ0hFX1NJWkUgLSBvZmZzZXQpKTsKKworCQlrYWRkciA9IGttYXBfYXRvbWljKHBhZ2UsIEtNX1VTRVIwKTsKKwkJcmV0ID0gbWVtY21wKHB0ciwga2FkZHIgKyBvZmZzZXQsIGN1cik7CisJCWt1bm1hcF9hdG9taWMoa2FkZHIsIEtNX1VTRVIwKTsKKwkJaWYgKHJldCkKKwkJCWJyZWFrOworCisJCXB0ciArPSBjdXI7CisJCWxlbiAtPSBjdXI7CisJCW9mZnNldCA9IDA7CisJCWkrKzsKKwl9CisJcmV0dXJuIHJldDsKK30KKwordm9pZCB3cml0ZV9leHRlbnRfYnVmZmVyKHN0cnVjdCBleHRlbnRfYnVmZmVyICplYiwgY29uc3Qgdm9pZCAqc3JjdiwKKwkJCSB1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGxlbikKK3sKKwlzaXplX3QgY3VyOworCXNpemVfdCBvZmZzZXQ7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisJY2hhciAqa2FkZHI7CisJY2hhciAqc3JjID0gKGNoYXIgKilzcmN2OworCXNpemVfdCBzdGFydF9vZmZzZXQgPSBlYi0+c3RhcnQgJiAoKHU2NClQQUdFX0NBQ0hFX1NJWkUgLSAxKTsKKwl1bnNpZ25lZCBsb25nIGkgPSAoc3RhcnRfb2Zmc2V0ICsgc3RhcnQpID4+IFBBR0VfQ0FDSEVfU0hJRlQ7CisKKwlXQVJOX09OKHN0YXJ0ID4gZWItPmxlbik7CisJV0FSTl9PTihzdGFydCArIGxlbiA+IGViLT5zdGFydCArIGViLT5sZW4pOworCisJb2Zmc2V0ID0gKHN0YXJ0X29mZnNldCArIHN0YXJ0KSAmICgodW5zaWduZWQgbG9uZylQQUdFX0NBQ0hFX1NJWkUgLSAxKTsKKworCXdoaWxlIChsZW4gPiAwKSB7CisJCXBhZ2UgPSBleHRlbnRfYnVmZmVyX3BhZ2UoZWIsIGkpOworCQlXQVJOX09OKCFQYWdlVXB0b2RhdGUocGFnZSkpOworCisJCWN1ciA9IG1pbihsZW4sIFBBR0VfQ0FDSEVfU0laRSAtIG9mZnNldCk7CisJCWthZGRyID0ga21hcF9hdG9taWMocGFnZSwgS01fVVNFUjEpOworCQltZW1jcHkoa2FkZHIgKyBvZmZzZXQsIHNyYywgY3VyKTsKKwkJa3VubWFwX2F0b21pYyhrYWRkciwgS01fVVNFUjEpOworCisJCXNyYyArPSBjdXI7CisJCWxlbiAtPSBjdXI7CisJCW9mZnNldCA9IDA7CisJCWkrKzsKKwl9Cit9CisKK3ZvaWQgbWVtc2V0X2V4dGVudF9idWZmZXIoc3RydWN0IGV4dGVudF9idWZmZXIgKmViLCBjaGFyIGMsCisJCQkgIHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgbGVuKQoreworCXNpemVfdCBjdXI7CisJc2l6ZV90IG9mZnNldDsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwljaGFyICprYWRkcjsKKwlzaXplX3Qgc3RhcnRfb2Zmc2V0ID0gZWItPnN0YXJ0ICYgKCh1NjQpUEFHRV9DQUNIRV9TSVpFIC0gMSk7CisJdW5zaWduZWQgbG9uZyBpID0gKHN0YXJ0X29mZnNldCArIHN0YXJ0KSA+PiBQQUdFX0NBQ0hFX1NISUZUOworCisJV0FSTl9PTihzdGFydCA+IGViLT5sZW4pOworCVdBUk5fT04oc3RhcnQgKyBsZW4gPiBlYi0+c3RhcnQgKyBlYi0+bGVuKTsKKworCW9mZnNldCA9IChzdGFydF9vZmZzZXQgKyBzdGFydCkgJiAoKHVuc2lnbmVkIGxvbmcpUEFHRV9DQUNIRV9TSVpFIC0gMSk7CisKKwl3aGlsZSAobGVuID4gMCkgeworCQlwYWdlID0gZXh0ZW50X2J1ZmZlcl9wYWdlKGViLCBpKTsKKwkJV0FSTl9PTighUGFnZVVwdG9kYXRlKHBhZ2UpKTsKKworCQljdXIgPSBtaW4obGVuLCBQQUdFX0NBQ0hFX1NJWkUgLSBvZmZzZXQpOworCQlrYWRkciA9IGttYXBfYXRvbWljKHBhZ2UsIEtNX1VTRVIwKTsKKwkJbWVtc2V0KGthZGRyICsgb2Zmc2V0LCBjLCBjdXIpOworCQlrdW5tYXBfYXRvbWljKGthZGRyLCBLTV9VU0VSMCk7CisKKwkJbGVuIC09IGN1cjsKKwkJb2Zmc2V0ID0gMDsKKwkJaSsrOworCX0KK30KKwordm9pZCBjb3B5X2V4dGVudF9idWZmZXIoc3RydWN0IGV4dGVudF9idWZmZXIgKmRzdCwgc3RydWN0IGV4dGVudF9idWZmZXIgKnNyYywKKwkJCXVuc2lnbmVkIGxvbmcgZHN0X29mZnNldCwgdW5zaWduZWQgbG9uZyBzcmNfb2Zmc2V0LAorCQkJdW5zaWduZWQgbG9uZyBsZW4pCit7CisJdTY0IGRzdF9sZW4gPSBkc3QtPmxlbjsKKwlzaXplX3QgY3VyOworCXNpemVfdCBvZmZzZXQ7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisJY2hhciAqa2FkZHI7CisJc2l6ZV90IHN0YXJ0X29mZnNldCA9IGRzdC0+c3RhcnQgJiAoKHU2NClQQUdFX0NBQ0hFX1NJWkUgLSAxKTsKKwl1bnNpZ25lZCBsb25nIGkgPSAoc3RhcnRfb2Zmc2V0ICsgZHN0X29mZnNldCkgPj4gUEFHRV9DQUNIRV9TSElGVDsKKworCVdBUk5fT04oc3JjLT5sZW4gIT0gZHN0X2xlbik7CisKKwlvZmZzZXQgPSAoc3RhcnRfb2Zmc2V0ICsgZHN0X29mZnNldCkgJgorCQkoKHVuc2lnbmVkIGxvbmcpUEFHRV9DQUNIRV9TSVpFIC0gMSk7CisKKwl3aGlsZSAobGVuID4gMCkgeworCQlwYWdlID0gZXh0ZW50X2J1ZmZlcl9wYWdlKGRzdCwgaSk7CisJCVdBUk5fT04oIVBhZ2VVcHRvZGF0ZShwYWdlKSk7CisKKwkJY3VyID0gbWluKGxlbiwgKHVuc2lnbmVkIGxvbmcpKFBBR0VfQ0FDSEVfU0laRSAtIG9mZnNldCkpOworCisJCWthZGRyID0ga21hcF9hdG9taWMocGFnZSwgS01fVVNFUjApOworCQlyZWFkX2V4dGVudF9idWZmZXIoc3JjLCBrYWRkciArIG9mZnNldCwgc3JjX29mZnNldCwgY3VyKTsKKwkJa3VubWFwX2F0b21pYyhrYWRkciwgS01fVVNFUjApOworCisJCXNyY19vZmZzZXQgKz0gY3VyOworCQlsZW4gLT0gY3VyOworCQlvZmZzZXQgPSAwOworCQlpKys7CisJfQorfQorCitzdGF0aWMgdm9pZCBtb3ZlX3BhZ2VzKHN0cnVjdCBwYWdlICpkc3RfcGFnZSwgc3RydWN0IHBhZ2UgKnNyY19wYWdlLAorCQkgICAgICAgdW5zaWduZWQgbG9uZyBkc3Rfb2ZmLCB1bnNpZ25lZCBsb25nIHNyY19vZmYsCisJCSAgICAgICB1bnNpZ25lZCBsb25nIGxlbikKK3sKKwljaGFyICpkc3Rfa2FkZHIgPSBrbWFwX2F0b21pYyhkc3RfcGFnZSwgS01fVVNFUjApOworCWlmIChkc3RfcGFnZSA9PSBzcmNfcGFnZSkgeworCQltZW1tb3ZlKGRzdF9rYWRkciArIGRzdF9vZmYsIGRzdF9rYWRkciArIHNyY19vZmYsIGxlbik7CisJfSBlbHNlIHsKKwkJY2hhciAqc3JjX2thZGRyID0ga21hcF9hdG9taWMoc3JjX3BhZ2UsIEtNX1VTRVIxKTsKKwkJY2hhciAqcCA9IGRzdF9rYWRkciArIGRzdF9vZmYgKyBsZW47CisJCWNoYXIgKnMgPSBzcmNfa2FkZHIgKyBzcmNfb2ZmICsgbGVuOworCisJCXdoaWxlIChsZW4tLSkKKwkJCSotLXAgPSAqLS1zOworCisJCWt1bm1hcF9hdG9taWMoc3JjX2thZGRyLCBLTV9VU0VSMSk7CisJfQorCWt1bm1hcF9hdG9taWMoZHN0X2thZGRyLCBLTV9VU0VSMCk7Cit9CisKK3N0YXRpYyB2b2lkIGNvcHlfcGFnZXMoc3RydWN0IHBhZ2UgKmRzdF9wYWdlLCBzdHJ1Y3QgcGFnZSAqc3JjX3BhZ2UsCisJCSAgICAgICB1bnNpZ25lZCBsb25nIGRzdF9vZmYsIHVuc2lnbmVkIGxvbmcgc3JjX29mZiwKKwkJICAgICAgIHVuc2lnbmVkIGxvbmcgbGVuKQoreworCWNoYXIgKmRzdF9rYWRkciA9IGttYXBfYXRvbWljKGRzdF9wYWdlLCBLTV9VU0VSMCk7CisJY2hhciAqc3JjX2thZGRyOworCisJaWYgKGRzdF9wYWdlICE9IHNyY19wYWdlKQorCQlzcmNfa2FkZHIgPSBrbWFwX2F0b21pYyhzcmNfcGFnZSwgS01fVVNFUjEpOworCWVsc2UKKwkJc3JjX2thZGRyID0gZHN0X2thZGRyOworCisJbWVtY3B5KGRzdF9rYWRkciArIGRzdF9vZmYsIHNyY19rYWRkciArIHNyY19vZmYsIGxlbik7CisJa3VubWFwX2F0b21pYyhkc3Rfa2FkZHIsIEtNX1VTRVIwKTsKKwlpZiAoZHN0X3BhZ2UgIT0gc3JjX3BhZ2UpCisJCWt1bm1hcF9hdG9taWMoc3JjX2thZGRyLCBLTV9VU0VSMSk7Cit9CisKK3ZvaWQgbWVtY3B5X2V4dGVudF9idWZmZXIoc3RydWN0IGV4dGVudF9idWZmZXIgKmRzdCwgdW5zaWduZWQgbG9uZyBkc3Rfb2Zmc2V0LAorCQkJICAgdW5zaWduZWQgbG9uZyBzcmNfb2Zmc2V0LCB1bnNpZ25lZCBsb25nIGxlbikKK3sKKwlzaXplX3QgY3VyOworCXNpemVfdCBkc3Rfb2ZmX2luX3BhZ2U7CisJc2l6ZV90IHNyY19vZmZfaW5fcGFnZTsKKwlzaXplX3Qgc3RhcnRfb2Zmc2V0ID0gZHN0LT5zdGFydCAmICgodTY0KVBBR0VfQ0FDSEVfU0laRSAtIDEpOworCXVuc2lnbmVkIGxvbmcgZHN0X2k7CisJdW5zaWduZWQgbG9uZyBzcmNfaTsKKworCWlmIChzcmNfb2Zmc2V0ICsgbGVuID4gZHN0LT5sZW4pIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJidHJmcyBtZW1tb3ZlIGJvZ3VzIHNyY19vZmZzZXQgJWx1IG1vdmUgIgorCQkgICAgICAgImxlbiAlbHUgZHN0IGxlbiAlbHVcbiIsIHNyY19vZmZzZXQsIGxlbiwgZHN0LT5sZW4pOworCQlCVUdfT04oMSk7CisJfQorCWlmIChkc3Rfb2Zmc2V0ICsgbGVuID4gZHN0LT5sZW4pIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJidHJmcyBtZW1tb3ZlIGJvZ3VzIGRzdF9vZmZzZXQgJWx1IG1vdmUgIgorCQkgICAgICAgImxlbiAlbHUgZHN0IGxlbiAlbHVcbiIsIGRzdF9vZmZzZXQsIGxlbiwgZHN0LT5sZW4pOworCQlCVUdfT04oMSk7CisJfQorCisJd2hpbGUgKGxlbiA+IDApIHsKKwkJZHN0X29mZl9pbl9wYWdlID0gKHN0YXJ0X29mZnNldCArIGRzdF9vZmZzZXQpICYKKwkJCSgodW5zaWduZWQgbG9uZylQQUdFX0NBQ0hFX1NJWkUgLSAxKTsKKwkJc3JjX29mZl9pbl9wYWdlID0gKHN0YXJ0X29mZnNldCArIHNyY19vZmZzZXQpICYKKwkJCSgodW5zaWduZWQgbG9uZylQQUdFX0NBQ0hFX1NJWkUgLSAxKTsKKworCQlkc3RfaSA9IChzdGFydF9vZmZzZXQgKyBkc3Rfb2Zmc2V0KSA+PiBQQUdFX0NBQ0hFX1NISUZUOworCQlzcmNfaSA9IChzdGFydF9vZmZzZXQgKyBzcmNfb2Zmc2V0KSA+PiBQQUdFX0NBQ0hFX1NISUZUOworCisJCWN1ciA9IG1pbihsZW4sICh1bnNpZ25lZCBsb25nKShQQUdFX0NBQ0hFX1NJWkUgLQorCQkJCQkgICAgICAgc3JjX29mZl9pbl9wYWdlKSk7CisJCWN1ciA9IG1pbl90KHVuc2lnbmVkIGxvbmcsIGN1ciwKKwkJCSh1bnNpZ25lZCBsb25nKShQQUdFX0NBQ0hFX1NJWkUgLSBkc3Rfb2ZmX2luX3BhZ2UpKTsKKworCQljb3B5X3BhZ2VzKGV4dGVudF9idWZmZXJfcGFnZShkc3QsIGRzdF9pKSwKKwkJCSAgIGV4dGVudF9idWZmZXJfcGFnZShkc3QsIHNyY19pKSwKKwkJCSAgIGRzdF9vZmZfaW5fcGFnZSwgc3JjX29mZl9pbl9wYWdlLCBjdXIpOworCisJCXNyY19vZmZzZXQgKz0gY3VyOworCQlkc3Rfb2Zmc2V0ICs9IGN1cjsKKwkJbGVuIC09IGN1cjsKKwl9Cit9CisKK3ZvaWQgbWVtbW92ZV9leHRlbnRfYnVmZmVyKHN0cnVjdCBleHRlbnRfYnVmZmVyICpkc3QsIHVuc2lnbmVkIGxvbmcgZHN0X29mZnNldCwKKwkJCSAgIHVuc2lnbmVkIGxvbmcgc3JjX29mZnNldCwgdW5zaWduZWQgbG9uZyBsZW4pCit7CisJc2l6ZV90IGN1cjsKKwlzaXplX3QgZHN0X29mZl9pbl9wYWdlOworCXNpemVfdCBzcmNfb2ZmX2luX3BhZ2U7CisJdW5zaWduZWQgbG9uZyBkc3RfZW5kID0gZHN0X29mZnNldCArIGxlbiAtIDE7CisJdW5zaWduZWQgbG9uZyBzcmNfZW5kID0gc3JjX29mZnNldCArIGxlbiAtIDE7CisJc2l6ZV90IHN0YXJ0X29mZnNldCA9IGRzdC0+c3RhcnQgJiAoKHU2NClQQUdFX0NBQ0hFX1NJWkUgLSAxKTsKKwl1bnNpZ25lZCBsb25nIGRzdF9pOworCXVuc2lnbmVkIGxvbmcgc3JjX2k7CisKKwlpZiAoc3JjX29mZnNldCArIGxlbiA+IGRzdC0+bGVuKSB7CisJCXByaW50ayhLRVJOX0VSUiAiYnRyZnMgbWVtbW92ZSBib2d1cyBzcmNfb2Zmc2V0ICVsdSBtb3ZlICIKKwkJICAgICAgICJsZW4gJWx1IGxlbiAlbHVcbiIsIHNyY19vZmZzZXQsIGxlbiwgZHN0LT5sZW4pOworCQlCVUdfT04oMSk7CisJfQorCWlmIChkc3Rfb2Zmc2V0ICsgbGVuID4gZHN0LT5sZW4pIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJidHJmcyBtZW1tb3ZlIGJvZ3VzIGRzdF9vZmZzZXQgJWx1IG1vdmUgIgorCQkgICAgICAgImxlbiAlbHUgbGVuICVsdVxuIiwgZHN0X29mZnNldCwgbGVuLCBkc3QtPmxlbik7CisJCUJVR19PTigxKTsKKwl9CisJaWYgKGRzdF9vZmZzZXQgPCBzcmNfb2Zmc2V0KSB7CisJCW1lbWNweV9leHRlbnRfYnVmZmVyKGRzdCwgZHN0X29mZnNldCwgc3JjX29mZnNldCwgbGVuKTsKKwkJcmV0dXJuOworCX0KKwl3aGlsZSAobGVuID4gMCkgeworCQlkc3RfaSA9IChzdGFydF9vZmZzZXQgKyBkc3RfZW5kKSA+PiBQQUdFX0NBQ0hFX1NISUZUOworCQlzcmNfaSA9IChzdGFydF9vZmZzZXQgKyBzcmNfZW5kKSA+PiBQQUdFX0NBQ0hFX1NISUZUOworCisJCWRzdF9vZmZfaW5fcGFnZSA9IChzdGFydF9vZmZzZXQgKyBkc3RfZW5kKSAmCisJCQkoKHVuc2lnbmVkIGxvbmcpUEFHRV9DQUNIRV9TSVpFIC0gMSk7CisJCXNyY19vZmZfaW5fcGFnZSA9IChzdGFydF9vZmZzZXQgKyBzcmNfZW5kKSAmCisJCQkoKHVuc2lnbmVkIGxvbmcpUEFHRV9DQUNIRV9TSVpFIC0gMSk7CisKKwkJY3VyID0gbWluX3QodW5zaWduZWQgbG9uZywgbGVuLCBzcmNfb2ZmX2luX3BhZ2UgKyAxKTsKKwkJY3VyID0gbWluKGN1ciwgZHN0X29mZl9pbl9wYWdlICsgMSk7CisJCW1vdmVfcGFnZXMoZXh0ZW50X2J1ZmZlcl9wYWdlKGRzdCwgZHN0X2kpLAorCQkJICAgZXh0ZW50X2J1ZmZlcl9wYWdlKGRzdCwgc3JjX2kpLAorCQkJICAgZHN0X29mZl9pbl9wYWdlIC0gY3VyICsgMSwKKwkJCSAgIHNyY19vZmZfaW5fcGFnZSAtIGN1ciArIDEsIGN1cik7CisKKwkJZHN0X2VuZCAtPSBjdXI7CisJCXNyY19lbmQgLT0gY3VyOworCQlsZW4gLT0gY3VyOworCX0KK30KKworaW50IHRyeV9yZWxlYXNlX2V4dGVudF9idWZmZXIoc3RydWN0IGV4dGVudF9pb190cmVlICp0cmVlLCBzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwl1NjQgc3RhcnQgPSBwYWdlX29mZnNldChwYWdlKTsKKwlzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqZWI7CisJaW50IHJldCA9IDE7CisJdW5zaWduZWQgbG9uZyBpOworCXVuc2lnbmVkIGxvbmcgbnVtX3BhZ2VzOworCisJc3Bpbl9sb2NrKCZ0cmVlLT5idWZmZXJfbG9jayk7CisJZWIgPSBidWZmZXJfc2VhcmNoKHRyZWUsIHN0YXJ0KTsKKwlpZiAoIWViKQorCQlnb3RvIG91dDsKKworCWlmIChhdG9taWNfcmVhZCgmZWItPnJlZnMpID4gMSkgeworCQlyZXQgPSAwOworCQlnb3RvIG91dDsKKwl9CisJLyogYXQgdGhpcyBwb2ludCB3ZSBjYW4gc2FmZWx5IHJlbGVhc2UgdGhlIGV4dGVudCBidWZmZXIgKi8KKwludW1fcGFnZXMgPSBudW1fZXh0ZW50X3BhZ2VzKGViLT5zdGFydCwgZWItPmxlbik7CisJZm9yIChpID0gMDsgaSA8IG51bV9wYWdlczsgaSsrKQorCQlwYWdlX2NhY2hlX3JlbGVhc2UoZXh0ZW50X2J1ZmZlcl9wYWdlKGViLCBpKSk7CisJcmJfZXJhc2UoJmViLT5yYl9ub2RlLCAmdHJlZS0+YnVmZmVyKTsKKwlfX2ZyZWVfZXh0ZW50X2J1ZmZlcihlYik7CitvdXQ6CisJc3Bpbl91bmxvY2soJnRyZWUtPmJ1ZmZlcl9sb2NrKTsKKwlyZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvZnMvYnRyZnMvZXh0ZW50X2lvLmggYi9mcy9idHJmcy9leHRlbnRfaW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNWI0ODNhCi0tLSAvZGV2L251bGwKKysrIGIvZnMvYnRyZnMvZXh0ZW50X2lvLmgKQEAgLTAsMCArMSwyNjkgQEAKKyNpZm5kZWYgX19FWFRFTlRJT19fCisjZGVmaW5lIF9fRVhURU5USU9fXworCisjaW5jbHVkZSA8bGludXgvcmJ0cmVlLmg+CisKKy8qIGJpdHMgZm9yIHRoZSBleHRlbnQgc3RhdGUgKi8KKyNkZWZpbmUgRVhURU5UX0RJUlRZIDEKKyNkZWZpbmUgRVhURU5UX1dSSVRFQkFDSyAoMSA8PCAxKQorI2RlZmluZSBFWFRFTlRfVVBUT0RBVEUgKDEgPDwgMikKKyNkZWZpbmUgRVhURU5UX0xPQ0tFRCAoMSA8PCAzKQorI2RlZmluZSBFWFRFTlRfTkVXICgxIDw8IDQpCisjZGVmaW5lIEVYVEVOVF9ERUxBTExPQyAoMSA8PCA1KQorI2RlZmluZSBFWFRFTlRfREVGUkFHICgxIDw8IDYpCisjZGVmaW5lIEVYVEVOVF9ERUZSQUdfRE9ORSAoMSA8PCA3KQorI2RlZmluZSBFWFRFTlRfQlVGRkVSX0ZJTExFRCAoMSA8PCA4KQorI2RlZmluZSBFWFRFTlRfT1JERVJFRCAoMSA8PCA5KQorI2RlZmluZSBFWFRFTlRfT1JERVJFRF9NRVRBREFUQSAoMSA8PCAxMCkKKyNkZWZpbmUgRVhURU5UX0JPVU5EQVJZICgxIDw8IDExKQorI2RlZmluZSBFWFRFTlRfTk9EQVRBU1VNICgxIDw8IDEyKQorI2RlZmluZSBFWFRFTlRfSU9CSVRTIChFWFRFTlRfTE9DS0VEIHwgRVhURU5UX1dSSVRFQkFDSykKKworLyogZmxhZ3MgZm9yIGJpbyBzdWJtaXNzaW9uICovCisjZGVmaW5lIEVYVEVOVF9CSU9fQ09NUFJFU1NFRCAxCisKKy8qCisgKiBwYWdlLT5wcml2YXRlIHZhbHVlcy4gIEV2ZXJ5IHBhZ2UgdGhhdCBpcyBjb250cm9sbGVkIGJ5IHRoZSBleHRlbnQKKyAqIG1hcCBoYXMgcGFnZS0+cHJpdmF0ZSBzZXQgdG8gb25lLgorICovCisjZGVmaW5lIEVYVEVOVF9QQUdFX1BSSVZBVEUgMQorI2RlZmluZSBFWFRFTlRfUEFHRV9QUklWQVRFX0ZJUlNUX1BBR0UgMworCitzdHJ1Y3QgZXh0ZW50X3N0YXRlOworCit0eXBlZGVmCWludCAoZXh0ZW50X3N1Ym1pdF9iaW9faG9va190KShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgcncsCisJCQkJICAgICAgIHN0cnVjdCBiaW8gKmJpbywgaW50IG1pcnJvcl9udW0sCisJCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgYmlvX2ZsYWdzKTsKK3N0cnVjdCBleHRlbnRfaW9fb3BzIHsKKwlpbnQgKCpmaWxsX2RlbGFsbG9jKShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgcGFnZSAqbG9ja2VkX3BhZ2UsCisJCQkgICAgIHU2NCBzdGFydCwgdTY0IGVuZCwgaW50ICpwYWdlX3N0YXJ0ZWQsCisJCQkgICAgIHVuc2lnbmVkIGxvbmcgKm5yX3dyaXR0ZW4pOworCWludCAoKndyaXRlcGFnZV9zdGFydF9ob29rKShzdHJ1Y3QgcGFnZSAqcGFnZSwgdTY0IHN0YXJ0LCB1NjQgZW5kKTsKKwlpbnQgKCp3cml0ZXBhZ2VfaW9faG9vaykoc3RydWN0IHBhZ2UgKnBhZ2UsIHU2NCBzdGFydCwgdTY0IGVuZCk7CisJZXh0ZW50X3N1Ym1pdF9iaW9faG9va190ICpzdWJtaXRfYmlvX2hvb2s7CisJaW50ICgqbWVyZ2VfYmlvX2hvb2spKHN0cnVjdCBwYWdlICpwYWdlLCB1bnNpZ25lZCBsb25nIG9mZnNldCwKKwkJCSAgICAgIHNpemVfdCBzaXplLCBzdHJ1Y3QgYmlvICpiaW8sCisJCQkgICAgICB1bnNpZ25lZCBsb25nIGJpb19mbGFncyk7CisJaW50ICgqcmVhZHBhZ2VfaW9faG9vaykoc3RydWN0IHBhZ2UgKnBhZ2UsIHU2NCBzdGFydCwgdTY0IGVuZCk7CisJaW50ICgqcmVhZHBhZ2VfaW9fZmFpbGVkX2hvb2spKHN0cnVjdCBiaW8gKmJpbywgc3RydWN0IHBhZ2UgKnBhZ2UsCisJCQkJICAgICAgIHU2NCBzdGFydCwgdTY0IGVuZCwKKwkJCQkgICAgICAgc3RydWN0IGV4dGVudF9zdGF0ZSAqc3RhdGUpOworCWludCAoKndyaXRlcGFnZV9pb19mYWlsZWRfaG9vaykoc3RydWN0IGJpbyAqYmlvLCBzdHJ1Y3QgcGFnZSAqcGFnZSwKKwkJCQkJdTY0IHN0YXJ0LCB1NjQgZW5kLAorCQkJCSAgICAgICBzdHJ1Y3QgZXh0ZW50X3N0YXRlICpzdGF0ZSk7CisJaW50ICgqcmVhZHBhZ2VfZW5kX2lvX2hvb2spKHN0cnVjdCBwYWdlICpwYWdlLCB1NjQgc3RhcnQsIHU2NCBlbmQsCisJCQkJICAgIHN0cnVjdCBleHRlbnRfc3RhdGUgKnN0YXRlKTsKKwlpbnQgKCp3cml0ZXBhZ2VfZW5kX2lvX2hvb2spKHN0cnVjdCBwYWdlICpwYWdlLCB1NjQgc3RhcnQsIHU2NCBlbmQsCisJCQkJICAgICAgc3RydWN0IGV4dGVudF9zdGF0ZSAqc3RhdGUsIGludCB1cHRvZGF0ZSk7CisJaW50ICgqc2V0X2JpdF9ob29rKShzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1NjQgc3RhcnQsIHU2NCBlbmQsCisJCQkgICAgdW5zaWduZWQgbG9uZyBvbGQsIHVuc2lnbmVkIGxvbmcgYml0cyk7CisJaW50ICgqY2xlYXJfYml0X2hvb2spKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHU2NCBzdGFydCwgdTY0IGVuZCwKKwkJCSAgICB1bnNpZ25lZCBsb25nIG9sZCwgdW5zaWduZWQgbG9uZyBiaXRzKTsKKwlpbnQgKCp3cml0ZV9jYWNoZV9wYWdlc19sb2NrX2hvb2spKHN0cnVjdCBwYWdlICpwYWdlKTsKK307CisKK3N0cnVjdCBleHRlbnRfaW9fdHJlZSB7CisJc3RydWN0IHJiX3Jvb3Qgc3RhdGU7CisJc3RydWN0IHJiX3Jvb3QgYnVmZmVyOworCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nOworCXU2NCBkaXJ0eV9ieXRlczsKKwlzcGlubG9ja190IGxvY2s7CisJc3BpbmxvY2tfdCBidWZmZXJfbG9jazsKKwlzdHJ1Y3QgZXh0ZW50X2lvX29wcyAqb3BzOworfTsKKworc3RydWN0IGV4dGVudF9zdGF0ZSB7CisJdTY0IHN0YXJ0OworCXU2NCBlbmQ7IC8qIGluY2x1c2l2ZSAqLworCXN0cnVjdCByYl9ub2RlIHJiX25vZGU7CisJc3RydWN0IGV4dGVudF9pb190cmVlICp0cmVlOworCXdhaXRfcXVldWVfaGVhZF90IHdxOworCWF0b21pY190IHJlZnM7CisJdW5zaWduZWQgbG9uZyBzdGF0ZTsKKworCS8qIGZvciB1c2UgYnkgdGhlIEZTICovCisJdTY0IHByaXZhdGU7CisKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxlYWtfbGlzdDsKK307CisKK3N0cnVjdCBleHRlbnRfYnVmZmVyIHsKKwl1NjQgc3RhcnQ7CisJdW5zaWduZWQgbG9uZyBsZW47CisJY2hhciAqbWFwX3Rva2VuOworCWNoYXIgKmthZGRyOworCXVuc2lnbmVkIGxvbmcgbWFwX3N0YXJ0OworCXVuc2lnbmVkIGxvbmcgbWFwX2xlbjsKKwlzdHJ1Y3QgcGFnZSAqZmlyc3RfcGFnZTsKKwlhdG9taWNfdCByZWZzOworCWludCBmbGFnczsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxlYWtfbGlzdDsKKwlzdHJ1Y3QgcmJfbm9kZSByYl9ub2RlOworCXN0cnVjdCBtdXRleCBtdXRleDsKK307CisKK3N0cnVjdCBleHRlbnRfbWFwX3RyZWU7CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGV4dGVudF9zdGF0ZSAqZXh0ZW50X3N0YXRlX25leHQoc3RydWN0IGV4dGVudF9zdGF0ZSAqc3RhdGUpCit7CisJc3RydWN0IHJiX25vZGUgKm5vZGU7CisJbm9kZSA9IHJiX25leHQoJnN0YXRlLT5yYl9ub2RlKTsKKwlpZiAoIW5vZGUpCisJCXJldHVybiBOVUxMOworCXJldHVybiByYl9lbnRyeShub2RlLCBzdHJ1Y3QgZXh0ZW50X3N0YXRlLCByYl9ub2RlKTsKK30KKwordHlwZWRlZiBzdHJ1Y3QgZXh0ZW50X21hcCAqKGdldF9leHRlbnRfdCkoc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQkJICBzdHJ1Y3QgcGFnZSAqcGFnZSwKKwkJCQkJICBzaXplX3QgcGFnZV9vZmZzZXQsCisJCQkJCSAgdTY0IHN0YXJ0LCB1NjQgbGVuLAorCQkJCQkgIGludCBjcmVhdGUpOworCit2b2lkIGV4dGVudF9pb190cmVlX2luaXQoc3RydWN0IGV4dGVudF9pb190cmVlICp0cmVlLAorCQkJICBzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywgZ2ZwX3QgbWFzayk7CitpbnQgdHJ5X3JlbGVhc2VfZXh0ZW50X21hcHBpbmcoc3RydWN0IGV4dGVudF9tYXBfdHJlZSAqbWFwLAorCQkJICAgICAgIHN0cnVjdCBleHRlbnRfaW9fdHJlZSAqdHJlZSwgc3RydWN0IHBhZ2UgKnBhZ2UsCisJCQkgICAgICAgZ2ZwX3QgbWFzayk7CitpbnQgdHJ5X3JlbGVhc2VfZXh0ZW50X2J1ZmZlcihzdHJ1Y3QgZXh0ZW50X2lvX3RyZWUgKnRyZWUsIHN0cnVjdCBwYWdlICpwYWdlKTsKK2ludCB0cnlfcmVsZWFzZV9leHRlbnRfc3RhdGUoc3RydWN0IGV4dGVudF9tYXBfdHJlZSAqbWFwLAorCQkJICAgICBzdHJ1Y3QgZXh0ZW50X2lvX3RyZWUgKnRyZWUsIHN0cnVjdCBwYWdlICpwYWdlLAorCQkJICAgICBnZnBfdCBtYXNrKTsKK2ludCBsb2NrX2V4dGVudChzdHJ1Y3QgZXh0ZW50X2lvX3RyZWUgKnRyZWUsIHU2NCBzdGFydCwgdTY0IGVuZCwgZ2ZwX3QgbWFzayk7CitpbnQgdW5sb2NrX2V4dGVudChzdHJ1Y3QgZXh0ZW50X2lvX3RyZWUgKnRyZWUsIHU2NCBzdGFydCwgdTY0IGVuZCwgZ2ZwX3QgbWFzayk7CitpbnQgdHJ5X2xvY2tfZXh0ZW50KHN0cnVjdCBleHRlbnRfaW9fdHJlZSAqdHJlZSwgdTY0IHN0YXJ0LCB1NjQgZW5kLAorCQkgICAgZ2ZwX3QgbWFzayk7CitpbnQgZXh0ZW50X3JlYWRfZnVsbF9wYWdlKHN0cnVjdCBleHRlbnRfaW9fdHJlZSAqdHJlZSwgc3RydWN0IHBhZ2UgKnBhZ2UsCisJCQkgIGdldF9leHRlbnRfdCAqZ2V0X2V4dGVudCk7CitpbnQgX19pbml0IGV4dGVudF9pb19pbml0KHZvaWQpOwordm9pZCBleHRlbnRfaW9fZXhpdCh2b2lkKTsKKwordTY0IGNvdW50X3JhbmdlX2JpdHMoc3RydWN0IGV4dGVudF9pb190cmVlICp0cmVlLAorCQkgICAgIHU2NCAqc3RhcnQsIHU2NCBzZWFyY2hfZW5kLAorCQkgICAgIHU2NCBtYXhfYnl0ZXMsIHVuc2lnbmVkIGxvbmcgYml0cyk7CisKK2ludCB0ZXN0X3JhbmdlX2JpdChzdHJ1Y3QgZXh0ZW50X2lvX3RyZWUgKnRyZWUsIHU2NCBzdGFydCwgdTY0IGVuZCwKKwkJICAgaW50IGJpdHMsIGludCBmaWxsZWQpOworaW50IGNsZWFyX2V4dGVudF9iaXRzKHN0cnVjdCBleHRlbnRfaW9fdHJlZSAqdHJlZSwgdTY0IHN0YXJ0LCB1NjQgZW5kLAorCQkgICAgICBpbnQgYml0cywgZ2ZwX3QgbWFzayk7CitpbnQgY2xlYXJfZXh0ZW50X2JpdChzdHJ1Y3QgZXh0ZW50X2lvX3RyZWUgKnRyZWUsIHU2NCBzdGFydCwgdTY0IGVuZCwKKwkJICAgICBpbnQgYml0cywgaW50IHdha2UsIGludCBkZWxldGUsIGdmcF90IG1hc2spOworaW50IHNldF9leHRlbnRfYml0cyhzdHJ1Y3QgZXh0ZW50X2lvX3RyZWUgKnRyZWUsIHU2NCBzdGFydCwgdTY0IGVuZCwKKwkJICAgIGludCBiaXRzLCBnZnBfdCBtYXNrKTsKK2ludCBzZXRfZXh0ZW50X3VwdG9kYXRlKHN0cnVjdCBleHRlbnRfaW9fdHJlZSAqdHJlZSwgdTY0IHN0YXJ0LCB1NjQgZW5kLAorCQkJZ2ZwX3QgbWFzayk7CitpbnQgc2V0X2V4dGVudF9uZXcoc3RydWN0IGV4dGVudF9pb190cmVlICp0cmVlLCB1NjQgc3RhcnQsIHU2NCBlbmQsCisJCSAgIGdmcF90IG1hc2spOworaW50IHNldF9leHRlbnRfZGlydHkoc3RydWN0IGV4dGVudF9pb190cmVlICp0cmVlLCB1NjQgc3RhcnQsIHU2NCBlbmQsCisJCSAgICAgZ2ZwX3QgbWFzayk7CitpbnQgY2xlYXJfZXh0ZW50X2RpcnR5KHN0cnVjdCBleHRlbnRfaW9fdHJlZSAqdHJlZSwgdTY0IHN0YXJ0LCB1NjQgZW5kLAorCQkgICAgICAgZ2ZwX3QgbWFzayk7CitpbnQgY2xlYXJfZXh0ZW50X29yZGVyZWQoc3RydWN0IGV4dGVudF9pb190cmVlICp0cmVlLCB1NjQgc3RhcnQsIHU2NCBlbmQsCisJCSAgICAgICBnZnBfdCBtYXNrKTsKK2ludCBjbGVhcl9leHRlbnRfb3JkZXJlZF9tZXRhZGF0YShzdHJ1Y3QgZXh0ZW50X2lvX3RyZWUgKnRyZWUsIHU2NCBzdGFydCwKKwkJCQkgIHU2NCBlbmQsIGdmcF90IG1hc2spOworaW50IHNldF9leHRlbnRfZGVsYWxsb2Moc3RydWN0IGV4dGVudF9pb190cmVlICp0cmVlLCB1NjQgc3RhcnQsIHU2NCBlbmQsCisJCSAgICAgZ2ZwX3QgbWFzayk7CitpbnQgc2V0X2V4dGVudF9vcmRlcmVkKHN0cnVjdCBleHRlbnRfaW9fdHJlZSAqdHJlZSwgdTY0IHN0YXJ0LCB1NjQgZW5kLAorCQkgICAgIGdmcF90IG1hc2spOworaW50IGZpbmRfZmlyc3RfZXh0ZW50X2JpdChzdHJ1Y3QgZXh0ZW50X2lvX3RyZWUgKnRyZWUsIHU2NCBzdGFydCwKKwkJCSAgdTY0ICpzdGFydF9yZXQsIHU2NCAqZW5kX3JldCwgaW50IGJpdHMpOworc3RydWN0IGV4dGVudF9zdGF0ZSAqZmluZF9maXJzdF9leHRlbnRfYml0X3N0YXRlKHN0cnVjdCBleHRlbnRfaW9fdHJlZSAqdHJlZSwKKwkJCQkJCSB1NjQgc3RhcnQsIGludCBiaXRzKTsKK2ludCBleHRlbnRfaW52YWxpZGF0ZXBhZ2Uoc3RydWN0IGV4dGVudF9pb190cmVlICp0cmVlLAorCQkJICBzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgbG9uZyBvZmZzZXQpOworaW50IGV4dGVudF93cml0ZV9mdWxsX3BhZ2Uoc3RydWN0IGV4dGVudF9pb190cmVlICp0cmVlLCBzdHJ1Y3QgcGFnZSAqcGFnZSwKKwkJCSAgZ2V0X2V4dGVudF90ICpnZXRfZXh0ZW50LAorCQkJICBzdHJ1Y3Qgd3JpdGViYWNrX2NvbnRyb2wgKndiYyk7CitpbnQgZXh0ZW50X3dyaXRlX2xvY2tlZF9yYW5nZShzdHJ1Y3QgZXh0ZW50X2lvX3RyZWUgKnRyZWUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkgICAgICB1NjQgc3RhcnQsIHU2NCBlbmQsIGdldF9leHRlbnRfdCAqZ2V0X2V4dGVudCwKKwkJCSAgICAgIGludCBtb2RlKTsKK2ludCBleHRlbnRfd3JpdGVwYWdlcyhzdHJ1Y3QgZXh0ZW50X2lvX3RyZWUgKnRyZWUsCisJCSAgICAgIHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLAorCQkgICAgICBnZXRfZXh0ZW50X3QgKmdldF9leHRlbnQsCisJCSAgICAgIHN0cnVjdCB3cml0ZWJhY2tfY29udHJvbCAqd2JjKTsKK2ludCBleHRlbnRfcmVhZHBhZ2VzKHN0cnVjdCBleHRlbnRfaW9fdHJlZSAqdHJlZSwKKwkJICAgICBzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywKKwkJICAgICBzdHJ1Y3QgbGlzdF9oZWFkICpwYWdlcywgdW5zaWduZWQgbnJfcGFnZXMsCisJCSAgICAgZ2V0X2V4dGVudF90IGdldF9leHRlbnQpOworaW50IGV4dGVudF9wcmVwYXJlX3dyaXRlKHN0cnVjdCBleHRlbnRfaW9fdHJlZSAqdHJlZSwKKwkJCSBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgcGFnZSAqcGFnZSwKKwkJCSB1bnNpZ25lZCBmcm9tLCB1bnNpZ25lZCB0bywgZ2V0X2V4dGVudF90ICpnZXRfZXh0ZW50KTsKK2ludCBleHRlbnRfY29tbWl0X3dyaXRlKHN0cnVjdCBleHRlbnRfaW9fdHJlZSAqdHJlZSwKKwkJCXN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBwYWdlICpwYWdlLAorCQkJdW5zaWduZWQgZnJvbSwgdW5zaWduZWQgdG8pOworc2VjdG9yX3QgZXh0ZW50X2JtYXAoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsIHNlY3Rvcl90IGlibG9jaywKKwkJZ2V0X2V4dGVudF90ICpnZXRfZXh0ZW50KTsKK2ludCBzZXRfcmFuZ2VfZGlydHkoc3RydWN0IGV4dGVudF9pb190cmVlICp0cmVlLCB1NjQgc3RhcnQsIHU2NCBlbmQpOworaW50IHNldF9zdGF0ZV9wcml2YXRlKHN0cnVjdCBleHRlbnRfaW9fdHJlZSAqdHJlZSwgdTY0IHN0YXJ0LCB1NjQgcHJpdmF0ZSk7CitpbnQgZ2V0X3N0YXRlX3ByaXZhdGUoc3RydWN0IGV4dGVudF9pb190cmVlICp0cmVlLCB1NjQgc3RhcnQsIHU2NCAqcHJpdmF0ZSk7Cit2b2lkIHNldF9wYWdlX2V4dGVudF9tYXBwZWQoc3RydWN0IHBhZ2UgKnBhZ2UpOworCitzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqYWxsb2NfZXh0ZW50X2J1ZmZlcihzdHJ1Y3QgZXh0ZW50X2lvX3RyZWUgKnRyZWUsCisJCQkJCSAgdTY0IHN0YXJ0LCB1bnNpZ25lZCBsb25nIGxlbiwKKwkJCQkJICBzdHJ1Y3QgcGFnZSAqcGFnZTAsCisJCQkJCSAgZ2ZwX3QgbWFzayk7CitzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqZmluZF9leHRlbnRfYnVmZmVyKHN0cnVjdCBleHRlbnRfaW9fdHJlZSAqdHJlZSwKKwkJCQkJIHU2NCBzdGFydCwgdW5zaWduZWQgbG9uZyBsZW4sCisJCQkJCSAgZ2ZwX3QgbWFzayk7Cit2b2lkIGZyZWVfZXh0ZW50X2J1ZmZlcihzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqZWIpOworaW50IHJlYWRfZXh0ZW50X2J1ZmZlcl9wYWdlcyhzdHJ1Y3QgZXh0ZW50X2lvX3RyZWUgKnRyZWUsCisJCQkgICAgIHN0cnVjdCBleHRlbnRfYnVmZmVyICplYiwgdTY0IHN0YXJ0LCBpbnQgd2FpdCwKKwkJCSAgICAgZ2V0X2V4dGVudF90ICpnZXRfZXh0ZW50LCBpbnQgbWlycm9yX251bSk7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBleHRlbnRfYnVmZmVyX2dldChzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqZWIpCit7CisJYXRvbWljX2luYygmZWItPnJlZnMpOworfQorCitpbnQgbWVtY21wX2V4dGVudF9idWZmZXIoc3RydWN0IGV4dGVudF9idWZmZXIgKmViLCBjb25zdCB2b2lkICpwdHJ2LAorCQkJICB1bnNpZ25lZCBsb25nIHN0YXJ0LAorCQkJICB1bnNpZ25lZCBsb25nIGxlbik7Cit2b2lkIHJlYWRfZXh0ZW50X2J1ZmZlcihzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqZWIsIHZvaWQgKmRzdCwKKwkJCXVuc2lnbmVkIGxvbmcgc3RhcnQsCisJCQl1bnNpZ25lZCBsb25nIGxlbik7Cit2b2lkIHdyaXRlX2V4dGVudF9idWZmZXIoc3RydWN0IGV4dGVudF9idWZmZXIgKmViLCBjb25zdCB2b2lkICpzcmMsCisJCQkgdW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBsZW4pOwordm9pZCBjb3B5X2V4dGVudF9idWZmZXIoc3RydWN0IGV4dGVudF9idWZmZXIgKmRzdCwgc3RydWN0IGV4dGVudF9idWZmZXIgKnNyYywKKwkJCXVuc2lnbmVkIGxvbmcgZHN0X29mZnNldCwgdW5zaWduZWQgbG9uZyBzcmNfb2Zmc2V0LAorCQkJdW5zaWduZWQgbG9uZyBsZW4pOwordm9pZCBtZW1jcHlfZXh0ZW50X2J1ZmZlcihzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqZHN0LCB1bnNpZ25lZCBsb25nIGRzdF9vZmZzZXQsCisJCQkgICB1bnNpZ25lZCBsb25nIHNyY19vZmZzZXQsIHVuc2lnbmVkIGxvbmcgbGVuKTsKK3ZvaWQgbWVtbW92ZV9leHRlbnRfYnVmZmVyKHN0cnVjdCBleHRlbnRfYnVmZmVyICpkc3QsIHVuc2lnbmVkIGxvbmcgZHN0X29mZnNldCwKKwkJCSAgIHVuc2lnbmVkIGxvbmcgc3JjX29mZnNldCwgdW5zaWduZWQgbG9uZyBsZW4pOwordm9pZCBtZW1zZXRfZXh0ZW50X2J1ZmZlcihzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqZWIsIGNoYXIgYywKKwkJCSAgdW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBsZW4pOworaW50IHdhaXRfb25fZXh0ZW50X2J1ZmZlcl93cml0ZWJhY2soc3RydWN0IGV4dGVudF9pb190cmVlICp0cmVlLAorCQkJCSAgICBzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqZWIpOworaW50IHdhaXRfb25fZXh0ZW50X3dyaXRlYmFjayhzdHJ1Y3QgZXh0ZW50X2lvX3RyZWUgKnRyZWUsIHU2NCBzdGFydCwgdTY0IGVuZCk7CitpbnQgd2FpdF9leHRlbnRfYml0KHN0cnVjdCBleHRlbnRfaW9fdHJlZSAqdHJlZSwgdTY0IHN0YXJ0LCB1NjQgZW5kLCBpbnQgYml0cyk7CitpbnQgY2xlYXJfZXh0ZW50X2J1ZmZlcl9kaXJ0eShzdHJ1Y3QgZXh0ZW50X2lvX3RyZWUgKnRyZWUsCisJCQkgICAgICBzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqZWIpOworaW50IHNldF9leHRlbnRfYnVmZmVyX2RpcnR5KHN0cnVjdCBleHRlbnRfaW9fdHJlZSAqdHJlZSwKKwkJCSAgICAgc3RydWN0IGV4dGVudF9idWZmZXIgKmViKTsKK2ludCBzZXRfZXh0ZW50X2J1ZmZlcl91cHRvZGF0ZShzdHJ1Y3QgZXh0ZW50X2lvX3RyZWUgKnRyZWUsCisJCQkgICAgICAgc3RydWN0IGV4dGVudF9idWZmZXIgKmViKTsKK2ludCBjbGVhcl9leHRlbnRfYnVmZmVyX3VwdG9kYXRlKHN0cnVjdCBleHRlbnRfaW9fdHJlZSAqdHJlZSwKKwkJCQlzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqZWIpOworaW50IGV4dGVudF9idWZmZXJfdXB0b2RhdGUoc3RydWN0IGV4dGVudF9pb190cmVlICp0cmVlLAorCQkJICAgc3RydWN0IGV4dGVudF9idWZmZXIgKmViKTsKK2ludCBtYXBfZXh0ZW50X2J1ZmZlcihzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqZWIsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LAorCQkgICAgICB1bnNpZ25lZCBsb25nIG1pbl9sZW4sIGNoYXIgKip0b2tlbiwgY2hhciAqKm1hcCwKKwkJICAgICAgdW5zaWduZWQgbG9uZyAqbWFwX3N0YXJ0LAorCQkgICAgICB1bnNpZ25lZCBsb25nICptYXBfbGVuLCBpbnQga20pOworaW50IG1hcF9wcml2YXRlX2V4dGVudF9idWZmZXIoc3RydWN0IGV4dGVudF9idWZmZXIgKmViLCB1bnNpZ25lZCBsb25nIG9mZnNldCwKKwkJICAgICAgdW5zaWduZWQgbG9uZyBtaW5fbGVuLCBjaGFyICoqdG9rZW4sIGNoYXIgKiptYXAsCisJCSAgICAgIHVuc2lnbmVkIGxvbmcgKm1hcF9zdGFydCwKKwkJICAgICAgdW5zaWduZWQgbG9uZyAqbWFwX2xlbiwgaW50IGttKTsKK3ZvaWQgdW5tYXBfZXh0ZW50X2J1ZmZlcihzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqZWIsIGNoYXIgKnRva2VuLCBpbnQga20pOworaW50IHJlbGVhc2VfZXh0ZW50X2J1ZmZlcl90YWlsX3BhZ2VzKHN0cnVjdCBleHRlbnRfYnVmZmVyICplYik7CitpbnQgZXh0ZW50X3JhbmdlX3VwdG9kYXRlKHN0cnVjdCBleHRlbnRfaW9fdHJlZSAqdHJlZSwKKwkJCSAgdTY0IHN0YXJ0LCB1NjQgZW5kKTsKK2ludCBleHRlbnRfY2xlYXJfdW5sb2NrX2RlbGFsbG9jKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJc3RydWN0IGV4dGVudF9pb190cmVlICp0cmVlLAorCQkJCXU2NCBzdGFydCwgdTY0IGVuZCwgc3RydWN0IHBhZ2UgKmxvY2tlZF9wYWdlLAorCQkJCWludCB1bmxvY2tfcGFnZSwKKwkJCQlpbnQgY2xlYXJfdW5sb2NrLAorCQkJCWludCBjbGVhcl9kZWxhbGxvYywgaW50IGNsZWFyX2RpcnR5LAorCQkJCWludCBzZXRfd3JpdGViYWNrLAorCQkJCWludCBlbmRfd3JpdGViYWNrKTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZnMvYnRyZnMvZXh0ZW50X21hcC5jIGIvZnMvYnRyZnMvZXh0ZW50X21hcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhODNlMzMKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9idHJmcy9leHRlbnRfbWFwLmMKQEAgLTAsMCArMSwzNTEgQEAKKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9nZnAuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvaGFyZGlycS5oPgorI2luY2x1ZGUgImV4dGVudF9tYXAuaCIKKworLyogdGVtcG9yYXJ5IGRlZmluZSB1bnRpbCBleHRlbnRfbWFwIG1vdmVzIG91dCBvZiBidHJmcyAqLworc3RydWN0IGttZW1fY2FjaGUgKmJ0cmZzX2NhY2hlX2NyZWF0ZShjb25zdCBjaGFyICpuYW1lLCBzaXplX3Qgc2l6ZSwKKwkJCQkgICAgICAgdW5zaWduZWQgbG9uZyBleHRyYV9mbGFncywKKwkJCQkgICAgICAgdm9pZCAoKmN0b3IpKHZvaWQgKiwgc3RydWN0IGttZW1fY2FjaGUgKiwKKwkJCQkJCSAgICB1bnNpZ25lZCBsb25nKSk7CisKK3N0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqZXh0ZW50X21hcF9jYWNoZTsKKworaW50IF9faW5pdCBleHRlbnRfbWFwX2luaXQodm9pZCkKK3sKKwlleHRlbnRfbWFwX2NhY2hlID0gYnRyZnNfY2FjaGVfY3JlYXRlKCJleHRlbnRfbWFwIiwKKwkJCQkJICAgIHNpemVvZihzdHJ1Y3QgZXh0ZW50X21hcCksIDAsCisJCQkJCSAgICBOVUxMKTsKKwlpZiAoIWV4dGVudF9tYXBfY2FjaGUpCisJCXJldHVybiAtRU5PTUVNOworCXJldHVybiAwOworfQorCit2b2lkIGV4dGVudF9tYXBfZXhpdCh2b2lkKQoreworCWlmIChleHRlbnRfbWFwX2NhY2hlKQorCQlrbWVtX2NhY2hlX2Rlc3Ryb3koZXh0ZW50X21hcF9jYWNoZSk7Cit9CisKKy8qKgorICogZXh0ZW50X21hcF90cmVlX2luaXQgLSBpbml0aWFsaXplIGV4dGVudCBtYXAgdHJlZQorICogQHRyZWU6CQl0cmVlIHRvIGluaXRpYWxpemUKKyAqIEBtYXNrOgkJZmxhZ3MgZm9yIG1lbW9yeSBhbGxvY2F0aW9ucyBkdXJpbmcgdHJlZSBvcGVyYXRpb25zCisgKgorICogSW5pdGlhbGl6ZSB0aGUgZXh0ZW50IHRyZWUgQHRyZWUuICBTaG91bGQgYmUgY2FsbGVkIGZvciBlYWNoIG5ldyBpbm9kZQorICogb3Igb3RoZXIgdXNlciBvZiB0aGUgZXh0ZW50X21hcCBpbnRlcmZhY2UuCisgKi8KK3ZvaWQgZXh0ZW50X21hcF90cmVlX2luaXQoc3RydWN0IGV4dGVudF9tYXBfdHJlZSAqdHJlZSwgZ2ZwX3QgbWFzaykKK3sKKwl0cmVlLT5tYXAucmJfbm9kZSA9IE5VTEw7CisJc3Bpbl9sb2NrX2luaXQoJnRyZWUtPmxvY2spOworfQorRVhQT1JUX1NZTUJPTChleHRlbnRfbWFwX3RyZWVfaW5pdCk7CisKKy8qKgorICogYWxsb2NfZXh0ZW50X21hcCAtIGFsbG9jYXRlIG5ldyBleHRlbnQgbWFwIHN0cnVjdHVyZQorICogQG1hc2s6CW1lbW9yeSBhbGxvY2F0aW9uIGZsYWdzCisgKgorICogQWxsb2NhdGUgYSBuZXcgZXh0ZW50X21hcCBzdHJ1Y3R1cmUuICBUaGUgbmV3IHN0cnVjdHVyZSBpcworICogcmV0dXJuZWQgd2l0aCBhIHJlZmVyZW5jZSBjb3VudCBvZiBvbmUgYW5kIG5lZWRzIHRvIGJlCisgKiBmcmVlZCB1c2luZyBmcmVlX2V4dGVudF9tYXAoKQorICovCitzdHJ1Y3QgZXh0ZW50X21hcCAqYWxsb2NfZXh0ZW50X21hcChnZnBfdCBtYXNrKQoreworCXN0cnVjdCBleHRlbnRfbWFwICplbTsKKwllbSA9IGttZW1fY2FjaGVfYWxsb2MoZXh0ZW50X21hcF9jYWNoZSwgbWFzayk7CisJaWYgKCFlbSB8fCBJU19FUlIoZW0pKQorCQlyZXR1cm4gZW07CisJZW0tPmluX3RyZWUgPSAwOworCWVtLT5mbGFncyA9IDA7CisJYXRvbWljX3NldCgmZW0tPnJlZnMsIDEpOworCXJldHVybiBlbTsKK30KK0VYUE9SVF9TWU1CT0woYWxsb2NfZXh0ZW50X21hcCk7CisKKy8qKgorICogZnJlZV9leHRlbnRfbWFwIC0gZHJvcCByZWZlcmVuY2UgY291bnQgb2YgYW4gZXh0ZW50X21hcAorICogQGVtOgkJZXh0ZW50IG1hcCBiZWVpbmcgcmVsZWFzZWFkCisgKgorICogRHJvcHMgdGhlIHJlZmVyZW5jZSBvdXQgb24gQGVtIGJ5IG9uZSBhbmQgZnJlZSB0aGUgc3RydWN0dXJlCisgKiBpZiB0aGUgcmVmZXJlbmNlIGNvdW50IGhpdHMgemVyby4KKyAqLwordm9pZCBmcmVlX2V4dGVudF9tYXAoc3RydWN0IGV4dGVudF9tYXAgKmVtKQoreworCWlmICghZW0pCisJCXJldHVybjsKKwlXQVJOX09OKGF0b21pY19yZWFkKCZlbS0+cmVmcykgPT0gMCk7CisJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJmVtLT5yZWZzKSkgeworCQlXQVJOX09OKGVtLT5pbl90cmVlKTsKKwkJa21lbV9jYWNoZV9mcmVlKGV4dGVudF9tYXBfY2FjaGUsIGVtKTsKKwl9Cit9CitFWFBPUlRfU1lNQk9MKGZyZWVfZXh0ZW50X21hcCk7CisKK3N0YXRpYyBzdHJ1Y3QgcmJfbm9kZSAqdHJlZV9pbnNlcnQoc3RydWN0IHJiX3Jvb3QgKnJvb3QsIHU2NCBvZmZzZXQsCisJCQkJICAgc3RydWN0IHJiX25vZGUgKm5vZGUpCit7CisJc3RydWN0IHJiX25vZGUgKipwID0gJnJvb3QtPnJiX25vZGU7CisJc3RydWN0IHJiX25vZGUgKnBhcmVudCA9IE5VTEw7CisJc3RydWN0IGV4dGVudF9tYXAgKmVudHJ5OworCisJd2hpbGUgKCpwKSB7CisJCXBhcmVudCA9ICpwOworCQllbnRyeSA9IHJiX2VudHJ5KHBhcmVudCwgc3RydWN0IGV4dGVudF9tYXAsIHJiX25vZGUpOworCisJCVdBUk5fT04oIWVudHJ5LT5pbl90cmVlKTsKKworCQlpZiAob2Zmc2V0IDwgZW50cnktPnN0YXJ0KQorCQkJcCA9ICYoKnApLT5yYl9sZWZ0OworCQllbHNlIGlmIChvZmZzZXQgPj0gZXh0ZW50X21hcF9lbmQoZW50cnkpKQorCQkJcCA9ICYoKnApLT5yYl9yaWdodDsKKwkJZWxzZQorCQkJcmV0dXJuIHBhcmVudDsKKwl9CisKKwllbnRyeSA9IHJiX2VudHJ5KG5vZGUsIHN0cnVjdCBleHRlbnRfbWFwLCByYl9ub2RlKTsKKwllbnRyeS0+aW5fdHJlZSA9IDE7CisJcmJfbGlua19ub2RlKG5vZGUsIHBhcmVudCwgcCk7CisJcmJfaW5zZXJ0X2NvbG9yKG5vZGUsIHJvb3QpOworCXJldHVybiBOVUxMOworfQorCisvKgorICogc2VhcmNoIHRocm91Z2ggdGhlIHRyZWUgZm9yIGFuIGV4dGVudF9tYXAgd2l0aCBhIGdpdmVuIG9mZnNldC4gIElmCisgKiBpdCBjYW4ndCBiZSBmb3VuZCwgdHJ5IHRvIGZpbmQgc29tZSBuZWlnaGJvcmluZyBleHRlbnRzCisgKi8KK3N0YXRpYyBzdHJ1Y3QgcmJfbm9kZSAqX190cmVlX3NlYXJjaChzdHJ1Y3QgcmJfcm9vdCAqcm9vdCwgdTY0IG9mZnNldCwKKwkJCQkgICAgIHN0cnVjdCByYl9ub2RlICoqcHJldl9yZXQsCisJCQkJICAgICBzdHJ1Y3QgcmJfbm9kZSAqKm5leHRfcmV0KQoreworCXN0cnVjdCByYl9ub2RlICpuID0gcm9vdC0+cmJfbm9kZTsKKwlzdHJ1Y3QgcmJfbm9kZSAqcHJldiA9IE5VTEw7CisJc3RydWN0IHJiX25vZGUgKm9yaWdfcHJldiA9IE5VTEw7CisJc3RydWN0IGV4dGVudF9tYXAgKmVudHJ5OworCXN0cnVjdCBleHRlbnRfbWFwICpwcmV2X2VudHJ5ID0gTlVMTDsKKworCXdoaWxlIChuKSB7CisJCWVudHJ5ID0gcmJfZW50cnkobiwgc3RydWN0IGV4dGVudF9tYXAsIHJiX25vZGUpOworCQlwcmV2ID0gbjsKKwkJcHJldl9lbnRyeSA9IGVudHJ5OworCisJCVdBUk5fT04oIWVudHJ5LT5pbl90cmVlKTsKKworCQlpZiAob2Zmc2V0IDwgZW50cnktPnN0YXJ0KQorCQkJbiA9IG4tPnJiX2xlZnQ7CisJCWVsc2UgaWYgKG9mZnNldCA+PSBleHRlbnRfbWFwX2VuZChlbnRyeSkpCisJCQluID0gbi0+cmJfcmlnaHQ7CisJCWVsc2UKKwkJCXJldHVybiBuOworCX0KKworCWlmIChwcmV2X3JldCkgeworCQlvcmlnX3ByZXYgPSBwcmV2OworCQl3aGlsZSAocHJldiAmJiBvZmZzZXQgPj0gZXh0ZW50X21hcF9lbmQocHJldl9lbnRyeSkpIHsKKwkJCXByZXYgPSByYl9uZXh0KHByZXYpOworCQkJcHJldl9lbnRyeSA9IHJiX2VudHJ5KHByZXYsIHN0cnVjdCBleHRlbnRfbWFwLCByYl9ub2RlKTsKKwkJfQorCQkqcHJldl9yZXQgPSBwcmV2OworCQlwcmV2ID0gb3JpZ19wcmV2OworCX0KKworCWlmIChuZXh0X3JldCkgeworCQlwcmV2X2VudHJ5ID0gcmJfZW50cnkocHJldiwgc3RydWN0IGV4dGVudF9tYXAsIHJiX25vZGUpOworCQl3aGlsZSAocHJldiAmJiBvZmZzZXQgPCBwcmV2X2VudHJ5LT5zdGFydCkgeworCQkJcHJldiA9IHJiX3ByZXYocHJldik7CisJCQlwcmV2X2VudHJ5ID0gcmJfZW50cnkocHJldiwgc3RydWN0IGV4dGVudF9tYXAsIHJiX25vZGUpOworCQl9CisJCSpuZXh0X3JldCA9IHByZXY7CisJfQorCXJldHVybiBOVUxMOworfQorCisvKgorICogbG9vayBmb3IgYW4gb2Zmc2V0IGluIHRoZSB0cmVlLCBhbmQgaWYgaXQgY2FuJ3QgYmUgZm91bmQsIHJldHVybgorICogdGhlIGZpcnN0IG9mZnNldCB3ZSBjYW4gZmluZCBzbWFsbGVyIHRoYW4gJ29mZnNldCcuCisgKi8KK3N0YXRpYyBpbmxpbmUgc3RydWN0IHJiX25vZGUgKnRyZWVfc2VhcmNoKHN0cnVjdCByYl9yb290ICpyb290LCB1NjQgb2Zmc2V0KQoreworCXN0cnVjdCByYl9ub2RlICpwcmV2OworCXN0cnVjdCByYl9ub2RlICpyZXQ7CisJcmV0ID0gX190cmVlX3NlYXJjaChyb290LCBvZmZzZXQsICZwcmV2LCBOVUxMKTsKKwlpZiAoIXJldCkKKwkJcmV0dXJuIHByZXY7CisJcmV0dXJuIHJldDsKK30KKworLyogY2hlY2sgdG8gc2VlIGlmIHR3byBleHRlbnRfbWFwIHN0cnVjdHMgYXJlIGFkamFjZW50IGFuZCBzYWZlIHRvIG1lcmdlICovCitzdGF0aWMgaW50IG1lcmdhYmxlX21hcHMoc3RydWN0IGV4dGVudF9tYXAgKnByZXYsIHN0cnVjdCBleHRlbnRfbWFwICpuZXh0KQoreworCWlmICh0ZXN0X2JpdChFWFRFTlRfRkxBR19QSU5ORUQsICZwcmV2LT5mbGFncykpCisJCXJldHVybiAwOworCisJLyoKKwkgKiBkb24ndCBtZXJnZSBjb21wcmVzc2VkIGV4dGVudHMsIHdlIG5lZWQgdG8ga25vdyB0aGVpcgorCSAqIGFjdHVhbCBzaXplCisJICovCisJaWYgKHRlc3RfYml0KEVYVEVOVF9GTEFHX0NPTVBSRVNTRUQsICZwcmV2LT5mbGFncykpCisJCXJldHVybiAwOworCisJaWYgKGV4dGVudF9tYXBfZW5kKHByZXYpID09IG5leHQtPnN0YXJ0ICYmCisJICAgIHByZXYtPmZsYWdzID09IG5leHQtPmZsYWdzICYmCisJICAgIHByZXYtPmJkZXYgPT0gbmV4dC0+YmRldiAmJgorCSAgICAoKG5leHQtPmJsb2NrX3N0YXJ0ID09IEVYVEVOVF9NQVBfSE9MRSAmJgorCSAgICAgIHByZXYtPmJsb2NrX3N0YXJ0ID09IEVYVEVOVF9NQVBfSE9MRSkgfHwKKwkgICAgIChuZXh0LT5ibG9ja19zdGFydCA9PSBFWFRFTlRfTUFQX0lOTElORSAmJgorCSAgICAgIHByZXYtPmJsb2NrX3N0YXJ0ID09IEVYVEVOVF9NQVBfSU5MSU5FKSB8fAorCSAgICAgKG5leHQtPmJsb2NrX3N0YXJ0ID09IEVYVEVOVF9NQVBfREVMQUxMT0MgJiYKKwkgICAgICBwcmV2LT5ibG9ja19zdGFydCA9PSBFWFRFTlRfTUFQX0RFTEFMTE9DKSB8fAorCSAgICAgKG5leHQtPmJsb2NrX3N0YXJ0IDwgRVhURU5UX01BUF9MQVNUX0JZVEUgLSAxICYmCisJICAgICAgbmV4dC0+YmxvY2tfc3RhcnQgPT0gZXh0ZW50X21hcF9ibG9ja19lbmQocHJldikpKSkgeworCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogYWRkX2V4dGVudF9tYXBwaW5nIC0gYWRkIG5ldyBleHRlbnQgbWFwIHRvIHRoZSBleHRlbnQgdHJlZQorICogQHRyZWU6CXRyZWUgdG8gaW5zZXJ0IG5ldyBtYXAgaW4KKyAqIEBlbToJCW1hcCB0byBpbnNlcnQKKyAqCisgKiBJbnNlcnQgQGVtIGludG8gQHRyZWUgb3IgcGVyZm9ybSBhIHNpbXBsZSBmb3J3YXJkL2JhY2t3YXJkIG1lcmdlIHdpdGgKKyAqIGV4aXN0aW5nIG1hcHBpbmdzLiAgVGhlIGV4dGVudF9tYXAgc3RydWN0IHBhc3NlZCBpbiB3aWxsIGJlIGluc2VydGVkCisgKiBpbnRvIHRoZSB0cmVlIGRpcmVjdGx5LCB3aXRoIGFuIGFkZGl0aW9uYWwgcmVmZXJlbmNlIHRha2VuLCBvciBhCisgKiByZWZlcmVuY2UgZHJvcHBlZCBpZiB0aGUgbWVyZ2UgYXR0ZW1wdCB3YXMgc3VjZXNzZnVsbC4KKyAqLworaW50IGFkZF9leHRlbnRfbWFwcGluZyhzdHJ1Y3QgZXh0ZW50X21hcF90cmVlICp0cmVlLAorCQkgICAgICAgc3RydWN0IGV4dGVudF9tYXAgKmVtKQoreworCWludCByZXQgPSAwOworCXN0cnVjdCBleHRlbnRfbWFwICptZXJnZSA9IE5VTEw7CisJc3RydWN0IHJiX25vZGUgKnJiOworCXN0cnVjdCBleHRlbnRfbWFwICpleGlzdDsKKworCWV4aXN0ID0gbG9va3VwX2V4dGVudF9tYXBwaW5nKHRyZWUsIGVtLT5zdGFydCwgZW0tPmxlbik7CisJaWYgKGV4aXN0KSB7CisJCWZyZWVfZXh0ZW50X21hcChleGlzdCk7CisJCXJldCA9IC1FRVhJU1Q7CisJCWdvdG8gb3V0OworCX0KKwlhc3NlcnRfc3Bpbl9sb2NrZWQoJnRyZWUtPmxvY2spOworCXJiID0gdHJlZV9pbnNlcnQoJnRyZWUtPm1hcCwgZW0tPnN0YXJ0LCAmZW0tPnJiX25vZGUpOworCWlmIChyYikgeworCQlyZXQgPSAtRUVYSVNUOworCQlmcmVlX2V4dGVudF9tYXAobWVyZ2UpOworCQlnb3RvIG91dDsKKwl9CisJYXRvbWljX2luYygmZW0tPnJlZnMpOworCWlmIChlbS0+c3RhcnQgIT0gMCkgeworCQlyYiA9IHJiX3ByZXYoJmVtLT5yYl9ub2RlKTsKKwkJaWYgKHJiKQorCQkJbWVyZ2UgPSByYl9lbnRyeShyYiwgc3RydWN0IGV4dGVudF9tYXAsIHJiX25vZGUpOworCQlpZiAocmIgJiYgbWVyZ2FibGVfbWFwcyhtZXJnZSwgZW0pKSB7CisJCQllbS0+c3RhcnQgPSBtZXJnZS0+c3RhcnQ7CisJCQllbS0+bGVuICs9IG1lcmdlLT5sZW47CisJCQllbS0+YmxvY2tfbGVuICs9IG1lcmdlLT5ibG9ja19sZW47CisJCQllbS0+YmxvY2tfc3RhcnQgPSBtZXJnZS0+YmxvY2tfc3RhcnQ7CisJCQltZXJnZS0+aW5fdHJlZSA9IDA7CisJCQlyYl9lcmFzZSgmbWVyZ2UtPnJiX25vZGUsICZ0cmVlLT5tYXApOworCQkJZnJlZV9leHRlbnRfbWFwKG1lcmdlKTsKKwkJfQorCSB9CisJcmIgPSByYl9uZXh0KCZlbS0+cmJfbm9kZSk7CisJaWYgKHJiKQorCQltZXJnZSA9IHJiX2VudHJ5KHJiLCBzdHJ1Y3QgZXh0ZW50X21hcCwgcmJfbm9kZSk7CisJaWYgKHJiICYmIG1lcmdhYmxlX21hcHMoZW0sIG1lcmdlKSkgeworCQllbS0+bGVuICs9IG1lcmdlLT5sZW47CisJCWVtLT5ibG9ja19sZW4gKz0gbWVyZ2UtPmxlbjsKKwkJcmJfZXJhc2UoJm1lcmdlLT5yYl9ub2RlLCAmdHJlZS0+bWFwKTsKKwkJbWVyZ2UtPmluX3RyZWUgPSAwOworCQlmcmVlX2V4dGVudF9tYXAobWVyZ2UpOworCX0KK291dDoKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTChhZGRfZXh0ZW50X21hcHBpbmcpOworCisvKiBzaW1wbGUgaGVscGVyIHRvIGRvIG1hdGggYXJvdW5kIHRoZSBlbmQgb2YgYW4gZXh0ZW50LCBoYW5kbGluZyB3cmFwICovCitzdGF0aWMgdTY0IHJhbmdlX2VuZCh1NjQgc3RhcnQsIHU2NCBsZW4pCit7CisJaWYgKHN0YXJ0ICsgbGVuIDwgc3RhcnQpCisJCXJldHVybiAodTY0KS0xOworCXJldHVybiBzdGFydCArIGxlbjsKK30KKworLyoqCisgKiBsb29rdXBfZXh0ZW50X21hcHBpbmcgLSBsb29rdXAgZXh0ZW50X21hcAorICogQHRyZWU6CXRyZWUgdG8gbG9va3VwIGluCisgKiBAc3RhcnQ6CWJ5dGUgb2Zmc2V0IHRvIHN0YXJ0IHRoZSBzZWFyY2gKKyAqIEBsZW46CWxlbmd0aCBvZiB0aGUgbG9va3VwIHJhbmdlCisgKgorICogRmluZCBhbmQgcmV0dXJuIHRoZSBmaXJzdCBleHRlbnRfbWFwIHN0cnVjdCBpbiBAdHJlZSB0aGF0IGludGVyc2VjdHMgdGhlCisgKiBbc3RhcnQsIGxlbl0gcmFuZ2UuICBUaGVyZSBtYXkgYmUgYWRkaXRpb25hbCBvYmplY3RzIGluIHRoZSB0cmVlIHRoYXQKKyAqIGludGVyc2VjdCwgc28gY2hlY2sgdGhlIG9iamVjdCByZXR1cm5lZCBjYXJlZnVsbHkgdG8gbWFrZSBzdXJlIHRoYXQgbm8KKyAqIGFkZGl0aW9uYWwgbG9va3VwcyBhcmUgbmVlZGVkLgorICovCitzdHJ1Y3QgZXh0ZW50X21hcCAqbG9va3VwX2V4dGVudF9tYXBwaW5nKHN0cnVjdCBleHRlbnRfbWFwX3RyZWUgKnRyZWUsCisJCQkJCSB1NjQgc3RhcnQsIHU2NCBsZW4pCit7CisJc3RydWN0IGV4dGVudF9tYXAgKmVtOworCXN0cnVjdCByYl9ub2RlICpyYl9ub2RlOworCXN0cnVjdCByYl9ub2RlICpwcmV2ID0gTlVMTDsKKwlzdHJ1Y3QgcmJfbm9kZSAqbmV4dCA9IE5VTEw7CisJdTY0IGVuZCA9IHJhbmdlX2VuZChzdGFydCwgbGVuKTsKKworCWFzc2VydF9zcGluX2xvY2tlZCgmdHJlZS0+bG9jayk7CisJcmJfbm9kZSA9IF9fdHJlZV9zZWFyY2goJnRyZWUtPm1hcCwgc3RhcnQsICZwcmV2LCAmbmV4dCk7CisJaWYgKCFyYl9ub2RlICYmIHByZXYpIHsKKwkJZW0gPSByYl9lbnRyeShwcmV2LCBzdHJ1Y3QgZXh0ZW50X21hcCwgcmJfbm9kZSk7CisJCWlmIChlbmQgPiBlbS0+c3RhcnQgJiYgc3RhcnQgPCBleHRlbnRfbWFwX2VuZChlbSkpCisJCQlnb3RvIGZvdW5kOworCX0KKwlpZiAoIXJiX25vZGUgJiYgbmV4dCkgeworCQllbSA9IHJiX2VudHJ5KG5leHQsIHN0cnVjdCBleHRlbnRfbWFwLCByYl9ub2RlKTsKKwkJaWYgKGVuZCA+IGVtLT5zdGFydCAmJiBzdGFydCA8IGV4dGVudF9tYXBfZW5kKGVtKSkKKwkJCWdvdG8gZm91bmQ7CisJfQorCWlmICghcmJfbm9kZSkgeworCQllbSA9IE5VTEw7CisJCWdvdG8gb3V0OworCX0KKwlpZiAoSVNfRVJSKHJiX25vZGUpKSB7CisJCWVtID0gRVJSX1BUUihQVFJfRVJSKHJiX25vZGUpKTsKKwkJZ290byBvdXQ7CisJfQorCWVtID0gcmJfZW50cnkocmJfbm9kZSwgc3RydWN0IGV4dGVudF9tYXAsIHJiX25vZGUpOworCWlmIChlbmQgPiBlbS0+c3RhcnQgJiYgc3RhcnQgPCBleHRlbnRfbWFwX2VuZChlbSkpCisJCWdvdG8gZm91bmQ7CisKKwllbSA9IE5VTEw7CisJZ290byBvdXQ7CisKK2ZvdW5kOgorCWF0b21pY19pbmMoJmVtLT5yZWZzKTsKK291dDoKKwlyZXR1cm4gZW07Cit9CitFWFBPUlRfU1lNQk9MKGxvb2t1cF9leHRlbnRfbWFwcGluZyk7CisKKy8qKgorICogcmVtb3ZlX2V4dGVudF9tYXBwaW5nIC0gcmVtb3ZlcyBhbiBleHRlbnRfbWFwIGZyb20gdGhlIGV4dGVudCB0cmVlCisgKiBAdHJlZToJZXh0ZW50IHRyZWUgdG8gcmVtb3ZlIGZyb20KKyAqIEBlbToJCWV4dGVudCBtYXAgYmVlaW5nIHJlbW92ZWQKKyAqCisgKiBSZW1vdmVzIEBlbSBmcm9tIEB0cmVlLiAgTm8gcmVmZXJlbmNlIGNvdW50cyBhcmUgZHJvcHBlZCwgYW5kIG5vIGNoZWNrcworICogYXJlIGRvbmUgdG8gc2VlIGlmIHRoZSByYW5nZSBpcyBpbiB1c2UKKyAqLworaW50IHJlbW92ZV9leHRlbnRfbWFwcGluZyhzdHJ1Y3QgZXh0ZW50X21hcF90cmVlICp0cmVlLCBzdHJ1Y3QgZXh0ZW50X21hcCAqZW0pCit7CisJaW50IHJldCA9IDA7CisKKwlXQVJOX09OKHRlc3RfYml0KEVYVEVOVF9GTEFHX1BJTk5FRCwgJmVtLT5mbGFncykpOworCWFzc2VydF9zcGluX2xvY2tlZCgmdHJlZS0+bG9jayk7CisJcmJfZXJhc2UoJmVtLT5yYl9ub2RlLCAmdHJlZS0+bWFwKTsKKwllbS0+aW5fdHJlZSA9IDA7CisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0wocmVtb3ZlX2V4dGVudF9tYXBwaW5nKTsKZGlmZiAtLWdpdCBhL2ZzL2J0cmZzL2V4dGVudF9tYXAuaCBiL2ZzL2J0cmZzL2V4dGVudF9tYXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjZlZWVmCi0tLSAvZGV2L251bGwKKysrIGIvZnMvYnRyZnMvZXh0ZW50X21hcC5oCkBAIC0wLDAgKzEsNjIgQEAKKyNpZm5kZWYgX19FWFRFTlRNQVBfXworI2RlZmluZSBfX0VYVEVOVE1BUF9fCisKKyNpbmNsdWRlIDxsaW51eC9yYnRyZWUuaD4KKworI2RlZmluZSBFWFRFTlRfTUFQX0xBU1RfQllURSAodTY0KS00CisjZGVmaW5lIEVYVEVOVF9NQVBfSE9MRSAodTY0KS0zCisjZGVmaW5lIEVYVEVOVF9NQVBfSU5MSU5FICh1NjQpLTIKKyNkZWZpbmUgRVhURU5UX01BUF9ERUxBTExPQyAodTY0KS0xCisKKy8qIGJpdHMgZm9yIHRoZSBmbGFncyBmaWVsZCAqLworI2RlZmluZSBFWFRFTlRfRkxBR19QSU5ORUQgMCAvKiB0aGlzIGVudHJ5IG5vdCB5ZXQgb24gZGlzaywgZG9uJ3QgZnJlZSBpdCAqLworI2RlZmluZSBFWFRFTlRfRkxBR19DT01QUkVTU0VEIDEKKyNkZWZpbmUgRVhURU5UX0ZMQUdfVkFDQU5DWSAyIC8qIG5vIGZpbGUgZXh0ZW50IGl0ZW0gZm91bmQgKi8KKyNkZWZpbmUgRVhURU5UX0ZMQUdfUFJFQUxMT0MgMyAvKiBwcmUtYWxsb2NhdGVkIGV4dGVudCAqLworCitzdHJ1Y3QgZXh0ZW50X21hcCB7CisJc3RydWN0IHJiX25vZGUgcmJfbm9kZTsKKworCS8qIGFsbCBvZiB0aGVzZSBhcmUgaW4gYnl0ZXMgKi8KKwl1NjQgc3RhcnQ7CisJdTY0IGxlbjsKKwl1NjQgb3JpZ19zdGFydDsKKwl1NjQgYmxvY2tfc3RhcnQ7CisJdTY0IGJsb2NrX2xlbjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXY7CisJYXRvbWljX3QgcmVmczsKKwlpbnQgaW5fdHJlZTsKK307CisKK3N0cnVjdCBleHRlbnRfbWFwX3RyZWUgeworCXN0cnVjdCByYl9yb290IG1hcDsKKwlzcGlubG9ja190IGxvY2s7Cit9OworCitzdGF0aWMgaW5saW5lIHU2NCBleHRlbnRfbWFwX2VuZChzdHJ1Y3QgZXh0ZW50X21hcCAqZW0pCit7CisJaWYgKGVtLT5zdGFydCArIGVtLT5sZW4gPCBlbS0+c3RhcnQpCisJCXJldHVybiAodTY0KS0xOworCXJldHVybiBlbS0+c3RhcnQgKyBlbS0+bGVuOworfQorCitzdGF0aWMgaW5saW5lIHU2NCBleHRlbnRfbWFwX2Jsb2NrX2VuZChzdHJ1Y3QgZXh0ZW50X21hcCAqZW0pCit7CisJaWYgKGVtLT5ibG9ja19zdGFydCArIGVtLT5ibG9ja19sZW4gPCBlbS0+YmxvY2tfc3RhcnQpCisJCXJldHVybiAodTY0KS0xOworCXJldHVybiBlbS0+YmxvY2tfc3RhcnQgKyBlbS0+YmxvY2tfbGVuOworfQorCit2b2lkIGV4dGVudF9tYXBfdHJlZV9pbml0KHN0cnVjdCBleHRlbnRfbWFwX3RyZWUgKnRyZWUsIGdmcF90IG1hc2spOworc3RydWN0IGV4dGVudF9tYXAgKmxvb2t1cF9leHRlbnRfbWFwcGluZyhzdHJ1Y3QgZXh0ZW50X21hcF90cmVlICp0cmVlLAorCQkJCQkgdTY0IHN0YXJ0LCB1NjQgbGVuKTsKK2ludCBhZGRfZXh0ZW50X21hcHBpbmcoc3RydWN0IGV4dGVudF9tYXBfdHJlZSAqdHJlZSwKKwkJICAgICAgIHN0cnVjdCBleHRlbnRfbWFwICplbSk7CitpbnQgcmVtb3ZlX2V4dGVudF9tYXBwaW5nKHN0cnVjdCBleHRlbnRfbWFwX3RyZWUgKnRyZWUsIHN0cnVjdCBleHRlbnRfbWFwICplbSk7CisKK3N0cnVjdCBleHRlbnRfbWFwICphbGxvY19leHRlbnRfbWFwKGdmcF90IG1hc2spOwordm9pZCBmcmVlX2V4dGVudF9tYXAoc3RydWN0IGV4dGVudF9tYXAgKmVtKTsKK2ludCBfX2luaXQgZXh0ZW50X21hcF9pbml0KHZvaWQpOwordm9pZCBleHRlbnRfbWFwX2V4aXQodm9pZCk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2ZzL2J0cmZzL2ZpbGUtaXRlbS5jIGIvZnMvYnRyZnMvZmlsZS1pdGVtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTY0NjUyNAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2J0cmZzL2ZpbGUtaXRlbS5jCkBAIC0wLDAgKzEsODMxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE9yYWNsZS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIHYyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCisgKiBCb3N0b24sIE1BIDAyMTExMC0xMzA3LCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2Jpby5oPgorI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+CisjaW5jbHVkZSAiY3RyZWUuaCIKKyNpbmNsdWRlICJkaXNrLWlvLmgiCisjaW5jbHVkZSAidHJhbnNhY3Rpb24uaCIKKyNpbmNsdWRlICJwcmludC10cmVlLmgiCisKKyNkZWZpbmUgTUFYX0NTVU1fSVRFTVMociwgc2l6ZSkgKCgoKEJUUkZTX0xFQUZfREFUQV9TSVpFKHIpIC0gXAorCQkJCSAgIHNpemVvZihzdHJ1Y3QgYnRyZnNfaXRlbSkgKiAyKSAvIFwKKwkJCQkgIHNpemUpIC0gMSkpCisKKyNkZWZpbmUgTUFYX09SREVSRURfU1VNX0JZVEVTKHIpICgoUEFHRV9TSVpFIC0gXAorCQkJCSAgIHNpemVvZihzdHJ1Y3QgYnRyZnNfb3JkZXJlZF9zdW0pKSAvIFwKKwkJCQkgICBzaXplb2Yoc3RydWN0IGJ0cmZzX3NlY3Rvcl9zdW0pICogXAorCQkJCSAgIChyKS0+c2VjdG9yc2l6ZSAtIChyKS0+c2VjdG9yc2l6ZSkKKworaW50IGJ0cmZzX2luc2VydF9maWxlX2V4dGVudChzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKKwkJCSAgICAgc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsCisJCQkgICAgIHU2NCBvYmplY3RpZCwgdTY0IHBvcywKKwkJCSAgICAgdTY0IGRpc2tfb2Zmc2V0LCB1NjQgZGlza19udW1fYnl0ZXMsCisJCQkgICAgIHU2NCBudW1fYnl0ZXMsIHU2NCBvZmZzZXQsIHU2NCByYW1fYnl0ZXMsCisJCQkgICAgIHU4IGNvbXByZXNzaW9uLCB1OCBlbmNyeXB0aW9uLCB1MTYgb3RoZXJfZW5jb2RpbmcpCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IGJ0cmZzX2ZpbGVfZXh0ZW50X2l0ZW0gKml0ZW07CisJc3RydWN0IGJ0cmZzX2tleSBmaWxlX2tleTsKKwlzdHJ1Y3QgYnRyZnNfcGF0aCAqcGF0aDsKKwlzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqbGVhZjsKKworCXBhdGggPSBidHJmc19hbGxvY19wYXRoKCk7CisJQlVHX09OKCFwYXRoKTsKKwlmaWxlX2tleS5vYmplY3RpZCA9IG9iamVjdGlkOworCWZpbGVfa2V5Lm9mZnNldCA9IHBvczsKKwlidHJmc19zZXRfa2V5X3R5cGUoJmZpbGVfa2V5LCBCVFJGU19FWFRFTlRfREFUQV9LRVkpOworCisJcmV0ID0gYnRyZnNfaW5zZXJ0X2VtcHR5X2l0ZW0odHJhbnMsIHJvb3QsIHBhdGgsICZmaWxlX2tleSwKKwkJCQkgICAgICBzaXplb2YoKml0ZW0pKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXQ7CisJQlVHX09OKHJldCk7CisJbGVhZiA9IHBhdGgtPm5vZGVzWzBdOworCWl0ZW0gPSBidHJmc19pdGVtX3B0cihsZWFmLCBwYXRoLT5zbG90c1swXSwKKwkJCSAgICAgIHN0cnVjdCBidHJmc19maWxlX2V4dGVudF9pdGVtKTsKKwlidHJmc19zZXRfZmlsZV9leHRlbnRfZGlza19ieXRlbnIobGVhZiwgaXRlbSwgZGlza19vZmZzZXQpOworCWJ0cmZzX3NldF9maWxlX2V4dGVudF9kaXNrX251bV9ieXRlcyhsZWFmLCBpdGVtLCBkaXNrX251bV9ieXRlcyk7CisJYnRyZnNfc2V0X2ZpbGVfZXh0ZW50X29mZnNldChsZWFmLCBpdGVtLCBvZmZzZXQpOworCWJ0cmZzX3NldF9maWxlX2V4dGVudF9udW1fYnl0ZXMobGVhZiwgaXRlbSwgbnVtX2J5dGVzKTsKKwlidHJmc19zZXRfZmlsZV9leHRlbnRfcmFtX2J5dGVzKGxlYWYsIGl0ZW0sIHJhbV9ieXRlcyk7CisJYnRyZnNfc2V0X2ZpbGVfZXh0ZW50X2dlbmVyYXRpb24obGVhZiwgaXRlbSwgdHJhbnMtPnRyYW5zaWQpOworCWJ0cmZzX3NldF9maWxlX2V4dGVudF90eXBlKGxlYWYsIGl0ZW0sIEJUUkZTX0ZJTEVfRVhURU5UX1JFRyk7CisJYnRyZnNfc2V0X2ZpbGVfZXh0ZW50X2NvbXByZXNzaW9uKGxlYWYsIGl0ZW0sIGNvbXByZXNzaW9uKTsKKwlidHJmc19zZXRfZmlsZV9leHRlbnRfZW5jcnlwdGlvbihsZWFmLCBpdGVtLCBlbmNyeXB0aW9uKTsKKwlidHJmc19zZXRfZmlsZV9leHRlbnRfb3RoZXJfZW5jb2RpbmcobGVhZiwgaXRlbSwgb3RoZXJfZW5jb2RpbmcpOworCisJYnRyZnNfbWFya19idWZmZXJfZGlydHkobGVhZik7CitvdXQ6CisJYnRyZnNfZnJlZV9wYXRoKHBhdGgpOworCXJldHVybiByZXQ7Cit9CisKK3N0cnVjdCBidHJmc19jc3VtX2l0ZW0gKmJ0cmZzX2xvb2t1cF9jc3VtKHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAorCQkJCQkgIHN0cnVjdCBidHJmc19yb290ICpyb290LAorCQkJCQkgIHN0cnVjdCBidHJmc19wYXRoICpwYXRoLAorCQkJCQkgIHU2NCBieXRlbnIsIGludCBjb3cpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgYnRyZnNfa2V5IGZpbGVfa2V5OworCXN0cnVjdCBidHJmc19rZXkgZm91bmRfa2V5OworCXN0cnVjdCBidHJmc19jc3VtX2l0ZW0gKml0ZW07CisJc3RydWN0IGV4dGVudF9idWZmZXIgKmxlYWY7CisJdTY0IGNzdW1fb2Zmc2V0ID0gMDsKKwl1MTYgY3N1bV9zaXplID0KKwkJYnRyZnNfc3VwZXJfY3N1bV9zaXplKCZyb290LT5mc19pbmZvLT5zdXBlcl9jb3B5KTsKKwlpbnQgY3N1bXNfaW5faXRlbTsKKworCWZpbGVfa2V5Lm9iamVjdGlkID0gQlRSRlNfRVhURU5UX0NTVU1fT0JKRUNUSUQ7CisJZmlsZV9rZXkub2Zmc2V0ID0gYnl0ZW5yOworCWJ0cmZzX3NldF9rZXlfdHlwZSgmZmlsZV9rZXksIEJUUkZTX0VYVEVOVF9DU1VNX0tFWSk7CisJcmV0ID0gYnRyZnNfc2VhcmNoX3Nsb3QodHJhbnMsIHJvb3QsICZmaWxlX2tleSwgcGF0aCwgMCwgY293KTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBmYWlsOworCWxlYWYgPSBwYXRoLT5ub2Rlc1swXTsKKwlpZiAocmV0ID4gMCkgeworCQlyZXQgPSAxOworCQlpZiAocGF0aC0+c2xvdHNbMF0gPT0gMCkKKwkJCWdvdG8gZmFpbDsKKwkJcGF0aC0+c2xvdHNbMF0tLTsKKwkJYnRyZnNfaXRlbV9rZXlfdG9fY3B1KGxlYWYsICZmb3VuZF9rZXksIHBhdGgtPnNsb3RzWzBdKTsKKwkJaWYgKGJ0cmZzX2tleV90eXBlKCZmb3VuZF9rZXkpICE9IEJUUkZTX0VYVEVOVF9DU1VNX0tFWSkKKwkJCWdvdG8gZmFpbDsKKworCQljc3VtX29mZnNldCA9IChieXRlbnIgLSBmb3VuZF9rZXkub2Zmc2V0KSA+PgorCQkJCXJvb3QtPmZzX2luZm8tPnNiLT5zX2Jsb2Nrc2l6ZV9iaXRzOworCQljc3Vtc19pbl9pdGVtID0gYnRyZnNfaXRlbV9zaXplX25yKGxlYWYsIHBhdGgtPnNsb3RzWzBdKTsKKwkJY3N1bXNfaW5faXRlbSAvPSBjc3VtX3NpemU7CisKKwkJaWYgKGNzdW1fb2Zmc2V0ID49IGNzdW1zX2luX2l0ZW0pIHsKKwkJCXJldCA9IC1FRkJJRzsKKwkJCWdvdG8gZmFpbDsKKwkJfQorCX0KKwlpdGVtID0gYnRyZnNfaXRlbV9wdHIobGVhZiwgcGF0aC0+c2xvdHNbMF0sIHN0cnVjdCBidHJmc19jc3VtX2l0ZW0pOworCWl0ZW0gPSAoc3RydWN0IGJ0cmZzX2NzdW1faXRlbSAqKSgodW5zaWduZWQgY2hhciAqKWl0ZW0gKworCQkJCQkgIGNzdW1fb2Zmc2V0ICogY3N1bV9zaXplKTsKKwlyZXR1cm4gaXRlbTsKK2ZhaWw6CisJaWYgKHJldCA+IDApCisJCXJldCA9IC1FTk9FTlQ7CisJcmV0dXJuIEVSUl9QVFIocmV0KTsKK30KKworCitpbnQgYnRyZnNfbG9va3VwX2ZpbGVfZXh0ZW50KHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAorCQkJICAgICBzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwKKwkJCSAgICAgc3RydWN0IGJ0cmZzX3BhdGggKnBhdGgsIHU2NCBvYmplY3RpZCwKKwkJCSAgICAgdTY0IG9mZnNldCwgaW50IG1vZCkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBidHJmc19rZXkgZmlsZV9rZXk7CisJaW50IGluc19sZW4gPSBtb2QgPCAwID8gLTEgOiAwOworCWludCBjb3cgPSBtb2QgIT0gMDsKKworCWZpbGVfa2V5Lm9iamVjdGlkID0gb2JqZWN0aWQ7CisJZmlsZV9rZXkub2Zmc2V0ID0gb2Zmc2V0OworCWJ0cmZzX3NldF9rZXlfdHlwZSgmZmlsZV9rZXksIEJUUkZTX0VYVEVOVF9EQVRBX0tFWSk7CisJcmV0ID0gYnRyZnNfc2VhcmNoX3Nsb3QodHJhbnMsIHJvb3QsICZmaWxlX2tleSwgcGF0aCwgaW5zX2xlbiwgY293KTsKKwlyZXR1cm4gcmV0OworfQorCisKK2ludCBidHJmc19sb29rdXBfYmlvX3N1bXMoc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkgIHN0cnVjdCBiaW8gKmJpbywgdTMyICpkc3QpCit7CisJdTMyIHN1bTsKKwlzdHJ1Y3QgYmlvX3ZlYyAqYnZlYyA9IGJpby0+YmlfaW9fdmVjOworCWludCBiaW9faW5kZXggPSAwOworCXU2NCBvZmZzZXQ7CisJdTY0IGl0ZW1fc3RhcnRfb2Zmc2V0ID0gMDsKKwl1NjQgaXRlbV9sYXN0X29mZnNldCA9IDA7CisJdTY0IGRpc2tfYnl0ZW5yOworCXUzMiBkaWZmOworCXUxNiBjc3VtX3NpemUgPQorCQlidHJmc19zdXBlcl9jc3VtX3NpemUoJnJvb3QtPmZzX2luZm8tPnN1cGVyX2NvcHkpOworCWludCByZXQ7CisJc3RydWN0IGJ0cmZzX3BhdGggKnBhdGg7CisJc3RydWN0IGJ0cmZzX2NzdW1faXRlbSAqaXRlbSA9IE5VTEw7CisJc3RydWN0IGV4dGVudF9pb190cmVlICppb190cmVlID0gJkJUUkZTX0koaW5vZGUpLT5pb190cmVlOworCisJcGF0aCA9IGJ0cmZzX2FsbG9jX3BhdGgoKTsKKwlpZiAoYmlvLT5iaV9zaXplID4gUEFHRV9DQUNIRV9TSVpFICogOCkKKwkJcGF0aC0+cmVhZGEgPSAyOworCisJV0FSTl9PTihiaW8tPmJpX3ZjbnQgPD0gMCk7CisKKwlkaXNrX2J5dGVuciA9ICh1NjQpYmlvLT5iaV9zZWN0b3IgPDwgOTsKKwl3aGlsZSAoYmlvX2luZGV4IDwgYmlvLT5iaV92Y250KSB7CisJCW9mZnNldCA9IHBhZ2Vfb2Zmc2V0KGJ2ZWMtPmJ2X3BhZ2UpICsgYnZlYy0+YnZfb2Zmc2V0OworCQlyZXQgPSBidHJmc19maW5kX29yZGVyZWRfc3VtKGlub2RlLCBvZmZzZXQsIGRpc2tfYnl0ZW5yLCAmc3VtKTsKKwkJaWYgKHJldCA9PSAwKQorCQkJZ290byBmb3VuZDsKKworCQlpZiAoIWl0ZW0gfHwgZGlza19ieXRlbnIgPCBpdGVtX3N0YXJ0X29mZnNldCB8fAorCQkgICAgZGlza19ieXRlbnIgPj0gaXRlbV9sYXN0X29mZnNldCkgeworCQkJc3RydWN0IGJ0cmZzX2tleSBmb3VuZF9rZXk7CisJCQl1MzIgaXRlbV9zaXplOworCisJCQlpZiAoaXRlbSkKKwkJCQlidHJmc19yZWxlYXNlX3BhdGgocm9vdCwgcGF0aCk7CisJCQlpdGVtID0gYnRyZnNfbG9va3VwX2NzdW0oTlVMTCwgcm9vdC0+ZnNfaW5mby0+Y3N1bV9yb290LAorCQkJCQkJIHBhdGgsIGRpc2tfYnl0ZW5yLCAwKTsKKwkJCWlmIChJU19FUlIoaXRlbSkpIHsKKwkJCQlyZXQgPSBQVFJfRVJSKGl0ZW0pOworCQkJCWlmIChyZXQgPT0gLUVOT0VOVCB8fCByZXQgPT0gLUVGQklHKQorCQkJCQlyZXQgPSAwOworCQkJCXN1bSA9IDA7CisJCQkJaWYgKEJUUkZTX0koaW5vZGUpLT5yb290LT5yb290X2tleS5vYmplY3RpZCA9PQorCQkJCSAgICBCVFJGU19EQVRBX1JFTE9DX1RSRUVfT0JKRUNUSUQpIHsKKwkJCQkJc2V0X2V4dGVudF9iaXRzKGlvX3RyZWUsIG9mZnNldCwKKwkJCQkJCW9mZnNldCArIGJ2ZWMtPmJ2X2xlbiAtIDEsCisJCQkJCQlFWFRFTlRfTk9EQVRBU1VNLCBHRlBfTk9GUyk7CisJCQkJfSBlbHNlIHsKKwkJCQkJcHJpbnRrKEtFUk5fSU5GTyAiYnRyZnMgbm8gY3N1bSBmb3VuZCAiCisJCQkJCSAgICAgICAiZm9yIGlub2RlICVsdSBzdGFydCAlbGx1XG4iLAorCQkJCQkgICAgICAgaW5vZGUtPmlfaW5vLAorCQkJCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylvZmZzZXQpOworCQkJCX0KKwkJCQlpdGVtID0gTlVMTDsKKwkJCQlidHJmc19yZWxlYXNlX3BhdGgocm9vdCwgcGF0aCk7CisJCQkJZ290byBmb3VuZDsKKwkJCX0KKwkJCWJ0cmZzX2l0ZW1fa2V5X3RvX2NwdShwYXRoLT5ub2Rlc1swXSwgJmZvdW5kX2tleSwKKwkJCQkJICAgICAgcGF0aC0+c2xvdHNbMF0pOworCisJCQlpdGVtX3N0YXJ0X29mZnNldCA9IGZvdW5kX2tleS5vZmZzZXQ7CisJCQlpdGVtX3NpemUgPSBidHJmc19pdGVtX3NpemVfbnIocGF0aC0+bm9kZXNbMF0sCisJCQkJCQkgICAgICAgcGF0aC0+c2xvdHNbMF0pOworCQkJaXRlbV9sYXN0X29mZnNldCA9IGl0ZW1fc3RhcnRfb2Zmc2V0ICsKKwkJCQkoaXRlbV9zaXplIC8gY3N1bV9zaXplKSAqCisJCQkJcm9vdC0+c2VjdG9yc2l6ZTsKKwkJCWl0ZW0gPSBidHJmc19pdGVtX3B0cihwYXRoLT5ub2Rlc1swXSwgcGF0aC0+c2xvdHNbMF0sCisJCQkJCSAgICAgIHN0cnVjdCBidHJmc19jc3VtX2l0ZW0pOworCQl9CisJCS8qCisJCSAqIHRoaXMgYnl0ZSByYW5nZSBtdXN0IGJlIGFibGUgdG8gZml0IGluc2lkZQorCQkgKiBhIHNpbmdsZSBsZWFmIHNvIGl0IHdpbGwgYWxzbyBmaXQgaW5zaWRlIGEgdTMyCisJCSAqLworCQlkaWZmID0gZGlza19ieXRlbnIgLSBpdGVtX3N0YXJ0X29mZnNldDsKKwkJZGlmZiA9IGRpZmYgLyByb290LT5zZWN0b3JzaXplOworCQlkaWZmID0gZGlmZiAqIGNzdW1fc2l6ZTsKKworCQlyZWFkX2V4dGVudF9idWZmZXIocGF0aC0+bm9kZXNbMF0sICZzdW0sCisJCQkJICAgKCh1bnNpZ25lZCBsb25nKWl0ZW0pICsgZGlmZiwKKwkJCQkgICBjc3VtX3NpemUpOworZm91bmQ6CisJCWlmIChkc3QpCisJCQkqZHN0KysgPSBzdW07CisJCWVsc2UKKwkJCXNldF9zdGF0ZV9wcml2YXRlKGlvX3RyZWUsIG9mZnNldCwgc3VtKTsKKwkJZGlza19ieXRlbnIgKz0gYnZlYy0+YnZfbGVuOworCQliaW9faW5kZXgrKzsKKwkJYnZlYysrOworCX0KKwlidHJmc19mcmVlX3BhdGgocGF0aCk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBidHJmc19sb29rdXBfY3N1bXNfcmFuZ2Uoc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsIHU2NCBzdGFydCwgdTY0IGVuZCwKKwkJCSAgICAgc3RydWN0IGxpc3RfaGVhZCAqbGlzdCkKK3sKKwlzdHJ1Y3QgYnRyZnNfa2V5IGtleTsKKwlzdHJ1Y3QgYnRyZnNfcGF0aCAqcGF0aDsKKwlzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqbGVhZjsKKwlzdHJ1Y3QgYnRyZnNfb3JkZXJlZF9zdW0gKnN1bXM7CisJc3RydWN0IGJ0cmZzX3NlY3Rvcl9zdW0gKnNlY3Rvcl9zdW07CisJc3RydWN0IGJ0cmZzX2NzdW1faXRlbSAqaXRlbTsKKwl1bnNpZ25lZCBsb25nIG9mZnNldDsKKwlpbnQgcmV0OworCXNpemVfdCBzaXplOworCXU2NCBjc3VtX2VuZDsKKwl1MTYgY3N1bV9zaXplID0gYnRyZnNfc3VwZXJfY3N1bV9zaXplKCZyb290LT5mc19pbmZvLT5zdXBlcl9jb3B5KTsKKworCXBhdGggPSBidHJmc19hbGxvY19wYXRoKCk7CisJQlVHX09OKCFwYXRoKTsKKworCWtleS5vYmplY3RpZCA9IEJUUkZTX0VYVEVOVF9DU1VNX09CSkVDVElEOworCWtleS5vZmZzZXQgPSBzdGFydDsKKwlrZXkudHlwZSA9IEJUUkZTX0VYVEVOVF9DU1VNX0tFWTsKKworCXJldCA9IGJ0cmZzX3NlYXJjaF9zbG90KE5VTEwsIHJvb3QsICZrZXksIHBhdGgsIDAsIDApOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGZhaWw7CisJaWYgKHJldCA+IDAgJiYgcGF0aC0+c2xvdHNbMF0gPiAwKSB7CisJCWxlYWYgPSBwYXRoLT5ub2Rlc1swXTsKKwkJYnRyZnNfaXRlbV9rZXlfdG9fY3B1KGxlYWYsICZrZXksIHBhdGgtPnNsb3RzWzBdIC0gMSk7CisJCWlmIChrZXkub2JqZWN0aWQgPT0gQlRSRlNfRVhURU5UX0NTVU1fT0JKRUNUSUQgJiYKKwkJICAgIGtleS50eXBlID09IEJUUkZTX0VYVEVOVF9DU1VNX0tFWSkgeworCQkJb2Zmc2V0ID0gKHN0YXJ0IC0ga2V5Lm9mZnNldCkgPj4KKwkJCQkgcm9vdC0+ZnNfaW5mby0+c2ItPnNfYmxvY2tzaXplX2JpdHM7CisJCQlpZiAob2Zmc2V0ICogY3N1bV9zaXplIDwKKwkJCSAgICBidHJmc19pdGVtX3NpemVfbnIobGVhZiwgcGF0aC0+c2xvdHNbMF0gLSAxKSkKKwkJCQlwYXRoLT5zbG90c1swXS0tOworCQl9CisJfQorCisJd2hpbGUgKHN0YXJ0IDw9IGVuZCkgeworCQlsZWFmID0gcGF0aC0+bm9kZXNbMF07CisJCWlmIChwYXRoLT5zbG90c1swXSA+PSBidHJmc19oZWFkZXJfbnJpdGVtcyhsZWFmKSkgeworCQkJcmV0ID0gYnRyZnNfbmV4dF9sZWFmKHJvb3QsIHBhdGgpOworCQkJaWYgKHJldCA8IDApCisJCQkJZ290byBmYWlsOworCQkJaWYgKHJldCA+IDApCisJCQkJYnJlYWs7CisJCQlsZWFmID0gcGF0aC0+bm9kZXNbMF07CisJCX0KKworCQlidHJmc19pdGVtX2tleV90b19jcHUobGVhZiwgJmtleSwgcGF0aC0+c2xvdHNbMF0pOworCQlpZiAoa2V5Lm9iamVjdGlkICE9IEJUUkZTX0VYVEVOVF9DU1VNX09CSkVDVElEIHx8CisJCSAgICBrZXkudHlwZSAhPSBCVFJGU19FWFRFTlRfQ1NVTV9LRVkpCisJCQlicmVhazsKKworCQlidHJmc19pdGVtX2tleV90b19jcHUobGVhZiwgJmtleSwgcGF0aC0+c2xvdHNbMF0pOworCQlpZiAoa2V5Lm9mZnNldCA+IGVuZCkKKwkJCWJyZWFrOworCisJCWlmIChrZXkub2Zmc2V0ID4gc3RhcnQpCisJCQlzdGFydCA9IGtleS5vZmZzZXQ7CisKKwkJc2l6ZSA9IGJ0cmZzX2l0ZW1fc2l6ZV9ucihsZWFmLCBwYXRoLT5zbG90c1swXSk7CisJCWNzdW1fZW5kID0ga2V5Lm9mZnNldCArIChzaXplIC8gY3N1bV9zaXplKSAqIHJvb3QtPnNlY3RvcnNpemU7CisJCWlmIChjc3VtX2VuZCA8PSBzdGFydCkgeworCQkJcGF0aC0+c2xvdHNbMF0rKzsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJY3N1bV9lbmQgPSBtaW4oY3N1bV9lbmQsIGVuZCArIDEpOworCQlpdGVtID0gYnRyZnNfaXRlbV9wdHIocGF0aC0+bm9kZXNbMF0sIHBhdGgtPnNsb3RzWzBdLAorCQkJCSAgICAgIHN0cnVjdCBidHJmc19jc3VtX2l0ZW0pOworCQl3aGlsZSAoc3RhcnQgPCBjc3VtX2VuZCkgeworCQkJc2l6ZSA9IG1pbl90KHNpemVfdCwgY3N1bV9lbmQgLSBzdGFydCwKKwkJCQkJTUFYX09SREVSRURfU1VNX0JZVEVTKHJvb3QpKTsKKwkJCXN1bXMgPSBremFsbG9jKGJ0cmZzX29yZGVyZWRfc3VtX3NpemUocm9vdCwgc2l6ZSksCisJCQkJCUdGUF9OT0ZTKTsKKwkJCUJVR19PTighc3Vtcyk7CisKKwkJCXNlY3Rvcl9zdW0gPSBzdW1zLT5zdW1zOworCQkJc3Vtcy0+Ynl0ZW5yID0gc3RhcnQ7CisJCQlzdW1zLT5sZW4gPSBzaXplOworCisJCQlvZmZzZXQgPSAoc3RhcnQgLSBrZXkub2Zmc2V0KSA+PgorCQkJCXJvb3QtPmZzX2luZm8tPnNiLT5zX2Jsb2Nrc2l6ZV9iaXRzOworCQkJb2Zmc2V0ICo9IGNzdW1fc2l6ZTsKKworCQkJd2hpbGUgKHNpemUgPiAwKSB7CisJCQkJcmVhZF9leHRlbnRfYnVmZmVyKHBhdGgtPm5vZGVzWzBdLAorCQkJCQkJJnNlY3Rvcl9zdW0tPnN1bSwKKwkJCQkJCSgodW5zaWduZWQgbG9uZylpdGVtKSArCisJCQkJCQlvZmZzZXQsIGNzdW1fc2l6ZSk7CisJCQkJc2VjdG9yX3N1bS0+Ynl0ZW5yID0gc3RhcnQ7CisKKwkJCQlzaXplIC09IHJvb3QtPnNlY3RvcnNpemU7CisJCQkJc3RhcnQgKz0gcm9vdC0+c2VjdG9yc2l6ZTsKKwkJCQlvZmZzZXQgKz0gY3N1bV9zaXplOworCQkJCXNlY3Rvcl9zdW0rKzsKKwkJCX0KKwkJCWxpc3RfYWRkX3RhaWwoJnN1bXMtPmxpc3QsIGxpc3QpOworCQl9CisJCXBhdGgtPnNsb3RzWzBdKys7CisJfQorCXJldCA9IDA7CitmYWlsOgorCWJ0cmZzX2ZyZWVfcGF0aChwYXRoKTsKKwlyZXR1cm4gcmV0OworfQorCitpbnQgYnRyZnNfY3N1bV9vbmVfYmlvKHN0cnVjdCBidHJmc19yb290ICpyb290LCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkgICAgICAgc3RydWN0IGJpbyAqYmlvLCB1NjQgZmlsZV9zdGFydCwgaW50IGNvbnRpZykKK3sKKwlzdHJ1Y3QgYnRyZnNfb3JkZXJlZF9zdW0gKnN1bXM7CisJc3RydWN0IGJ0cmZzX3NlY3Rvcl9zdW0gKnNlY3Rvcl9zdW07CisJc3RydWN0IGJ0cmZzX29yZGVyZWRfZXh0ZW50ICpvcmRlcmVkOworCWNoYXIgKmRhdGE7CisJc3RydWN0IGJpb192ZWMgKmJ2ZWMgPSBiaW8tPmJpX2lvX3ZlYzsKKwlpbnQgYmlvX2luZGV4ID0gMDsKKwl1bnNpZ25lZCBsb25nIHRvdGFsX2J5dGVzID0gMDsKKwl1bnNpZ25lZCBsb25nIHRoaXNfc3VtX2J5dGVzID0gMDsKKwl1NjQgb2Zmc2V0OworCXU2NCBkaXNrX2J5dGVucjsKKworCVdBUk5fT04oYmlvLT5iaV92Y250IDw9IDApOworCXN1bXMgPSBremFsbG9jKGJ0cmZzX29yZGVyZWRfc3VtX3NpemUocm9vdCwgYmlvLT5iaV9zaXplKSwgR0ZQX05PRlMpOworCWlmICghc3VtcykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlzZWN0b3Jfc3VtID0gc3Vtcy0+c3VtczsKKwlkaXNrX2J5dGVuciA9ICh1NjQpYmlvLT5iaV9zZWN0b3IgPDwgOTsKKwlzdW1zLT5sZW4gPSBiaW8tPmJpX3NpemU7CisJSU5JVF9MSVNUX0hFQUQoJnN1bXMtPmxpc3QpOworCisJaWYgKGNvbnRpZykKKwkJb2Zmc2V0ID0gZmlsZV9zdGFydDsKKwllbHNlCisJCW9mZnNldCA9IHBhZ2Vfb2Zmc2V0KGJ2ZWMtPmJ2X3BhZ2UpICsgYnZlYy0+YnZfb2Zmc2V0OworCisJb3JkZXJlZCA9IGJ0cmZzX2xvb2t1cF9vcmRlcmVkX2V4dGVudChpbm9kZSwgb2Zmc2V0KTsKKwlCVUdfT04oIW9yZGVyZWQpOworCXN1bXMtPmJ5dGVuciA9IG9yZGVyZWQtPnN0YXJ0OworCisJd2hpbGUgKGJpb19pbmRleCA8IGJpby0+YmlfdmNudCkgeworCQlpZiAoIWNvbnRpZykKKwkJCW9mZnNldCA9IHBhZ2Vfb2Zmc2V0KGJ2ZWMtPmJ2X3BhZ2UpICsgYnZlYy0+YnZfb2Zmc2V0OworCisJCWlmICghY29udGlnICYmIChvZmZzZXQgPj0gb3JkZXJlZC0+ZmlsZV9vZmZzZXQgKyBvcmRlcmVkLT5sZW4gfHwKKwkJICAgIG9mZnNldCA8IG9yZGVyZWQtPmZpbGVfb2Zmc2V0KSkgeworCQkJdW5zaWduZWQgbG9uZyBieXRlc19sZWZ0OworCQkJc3Vtcy0+bGVuID0gdGhpc19zdW1fYnl0ZXM7CisJCQl0aGlzX3N1bV9ieXRlcyA9IDA7CisJCQlidHJmc19hZGRfb3JkZXJlZF9zdW0oaW5vZGUsIG9yZGVyZWQsIHN1bXMpOworCQkJYnRyZnNfcHV0X29yZGVyZWRfZXh0ZW50KG9yZGVyZWQpOworCisJCQlieXRlc19sZWZ0ID0gYmlvLT5iaV9zaXplIC0gdG90YWxfYnl0ZXM7CisKKwkJCXN1bXMgPSBremFsbG9jKGJ0cmZzX29yZGVyZWRfc3VtX3NpemUocm9vdCwgYnl0ZXNfbGVmdCksCisJCQkJICAgICAgIEdGUF9OT0ZTKTsKKwkJCUJVR19PTighc3Vtcyk7CisJCQlzZWN0b3Jfc3VtID0gc3Vtcy0+c3VtczsKKwkJCXN1bXMtPmxlbiA9IGJ5dGVzX2xlZnQ7CisJCQlvcmRlcmVkID0gYnRyZnNfbG9va3VwX29yZGVyZWRfZXh0ZW50KGlub2RlLCBvZmZzZXQpOworCQkJQlVHX09OKCFvcmRlcmVkKTsKKwkJCXN1bXMtPmJ5dGVuciA9IG9yZGVyZWQtPnN0YXJ0OworCQl9CisKKwkJZGF0YSA9IGttYXBfYXRvbWljKGJ2ZWMtPmJ2X3BhZ2UsIEtNX1VTRVIwKTsKKwkJc2VjdG9yX3N1bS0+c3VtID0gfih1MzIpMDsKKwkJc2VjdG9yX3N1bS0+c3VtID0gYnRyZnNfY3N1bV9kYXRhKHJvb3QsCisJCQkJCQkgIGRhdGEgKyBidmVjLT5idl9vZmZzZXQsCisJCQkJCQkgIHNlY3Rvcl9zdW0tPnN1bSwKKwkJCQkJCSAgYnZlYy0+YnZfbGVuKTsKKwkJa3VubWFwX2F0b21pYyhkYXRhLCBLTV9VU0VSMCk7CisJCWJ0cmZzX2NzdW1fZmluYWwoc2VjdG9yX3N1bS0+c3VtLAorCQkJCSAoY2hhciAqKSZzZWN0b3Jfc3VtLT5zdW0pOworCQlzZWN0b3Jfc3VtLT5ieXRlbnIgPSBkaXNrX2J5dGVucjsKKworCQlzZWN0b3Jfc3VtKys7CisJCWJpb19pbmRleCsrOworCQl0b3RhbF9ieXRlcyArPSBidmVjLT5idl9sZW47CisJCXRoaXNfc3VtX2J5dGVzICs9IGJ2ZWMtPmJ2X2xlbjsKKwkJZGlza19ieXRlbnIgKz0gYnZlYy0+YnZfbGVuOworCQlvZmZzZXQgKz0gYnZlYy0+YnZfbGVuOworCQlidmVjKys7CisJfQorCXRoaXNfc3VtX2J5dGVzID0gMDsKKwlidHJmc19hZGRfb3JkZXJlZF9zdW0oaW5vZGUsIG9yZGVyZWQsIHN1bXMpOworCWJ0cmZzX3B1dF9vcmRlcmVkX2V4dGVudChvcmRlcmVkKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGhlbHBlciBmdW5jdGlvbiBmb3IgY3N1bSByZW1vdmFsLCB0aGlzIGV4cGVjdHMgdGhlCisgKiBrZXkgdG8gZGVzY3JpYmUgdGhlIGNzdW0gcG9pbnRlZCB0byBieSB0aGUgcGF0aCwgYW5kIGl0IGV4cGVjdHMKKyAqIHRoZSBjc3VtIHRvIG92ZXJsYXAgdGhlIHJhbmdlIFtieXRlbnIsIGxlbl0KKyAqCisgKiBUaGUgY3N1bSBzaG91bGQgbm90IGJlIGVudGlyZWx5IGNvbnRhaW5lZCBpbiB0aGUgcmFuZ2UgYW5kIHRoZQorICogcmFuZ2Ugc2hvdWxkIG5vdCBiZSBlbnRpcmVseSBjb250YWluZWQgaW4gdGhlIGNzdW0uCisgKgorICogVGhpcyBjYWxscyBidHJmc190cnVuY2F0ZV9pdGVtIHdpdGggdGhlIGNvcnJlY3QgYXJncyBiYXNlZCBvbiB0aGUKKyAqIG92ZXJsYXAsIGFuZCBmaXhlcyB1cCB0aGUga2V5IGFzIHJlcXVpcmVkLgorICovCitzdGF0aWMgbm9pbmxpbmUgaW50IHRydW5jYXRlX29uZV9jc3VtKHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAorCQkJCSAgICAgIHN0cnVjdCBidHJmc19yb290ICpyb290LAorCQkJCSAgICAgIHN0cnVjdCBidHJmc19wYXRoICpwYXRoLAorCQkJCSAgICAgIHN0cnVjdCBidHJmc19rZXkgKmtleSwKKwkJCQkgICAgICB1NjQgYnl0ZW5yLCB1NjQgbGVuKQoreworCXN0cnVjdCBleHRlbnRfYnVmZmVyICpsZWFmOworCXUxNiBjc3VtX3NpemUgPQorCQlidHJmc19zdXBlcl9jc3VtX3NpemUoJnJvb3QtPmZzX2luZm8tPnN1cGVyX2NvcHkpOworCXU2NCBjc3VtX2VuZDsKKwl1NjQgZW5kX2J5dGUgPSBieXRlbnIgKyBsZW47CisJdTMyIGJsb2Nrc2l6ZV9iaXRzID0gcm9vdC0+ZnNfaW5mby0+c2ItPnNfYmxvY2tzaXplX2JpdHM7CisJaW50IHJldDsKKworCWxlYWYgPSBwYXRoLT5ub2Rlc1swXTsKKwljc3VtX2VuZCA9IGJ0cmZzX2l0ZW1fc2l6ZV9ucihsZWFmLCBwYXRoLT5zbG90c1swXSkgLyBjc3VtX3NpemU7CisJY3N1bV9lbmQgPDw9IHJvb3QtPmZzX2luZm8tPnNiLT5zX2Jsb2Nrc2l6ZV9iaXRzOworCWNzdW1fZW5kICs9IGtleS0+b2Zmc2V0OworCisJaWYgKGtleS0+b2Zmc2V0IDwgYnl0ZW5yICYmIGNzdW1fZW5kIDw9IGVuZF9ieXRlKSB7CisJCS8qCisJCSAqICAgICAgICAgWyBieXRlbnIgLSBsZW4gXQorCQkgKiAgICAgICAgIFsgICBdCisJCSAqICAgW2NzdW0gICAgIF0KKwkJICogICBBIHNpbXBsZSB0cnVuY2F0ZSBvZmYgdGhlIGVuZCBvZiB0aGUgaXRlbQorCQkgKi8KKwkJdTMyIG5ld19zaXplID0gKGJ5dGVuciAtIGtleS0+b2Zmc2V0KSA+PiBibG9ja3NpemVfYml0czsKKwkJbmV3X3NpemUgKj0gY3N1bV9zaXplOworCQlyZXQgPSBidHJmc190cnVuY2F0ZV9pdGVtKHRyYW5zLCByb290LCBwYXRoLCBuZXdfc2l6ZSwgMSk7CisJCUJVR19PTihyZXQpOworCX0gZWxzZSBpZiAoa2V5LT5vZmZzZXQgPj0gYnl0ZW5yICYmIGNzdW1fZW5kID4gZW5kX2J5dGUgJiYKKwkJICAgZW5kX2J5dGUgPiBrZXktPm9mZnNldCkgeworCQkvKgorCQkgKiAgICAgICAgIFsgYnl0ZW5yIC0gbGVuIF0KKwkJICogICAgICAgICAgICAgICAgIFsgXQorCQkgKiAgICAgICAgICAgICAgICAgW2NzdW0gICAgIF0KKwkJICogd2UgbmVlZCB0byB0cnVuY2F0ZSBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGNzdW0KKwkJICovCisJCXUzMiBuZXdfc2l6ZSA9IChjc3VtX2VuZCAtIGVuZF9ieXRlKSA+PiBibG9ja3NpemVfYml0czsKKwkJbmV3X3NpemUgKj0gY3N1bV9zaXplOworCisJCXJldCA9IGJ0cmZzX3RydW5jYXRlX2l0ZW0odHJhbnMsIHJvb3QsIHBhdGgsIG5ld19zaXplLCAwKTsKKwkJQlVHX09OKHJldCk7CisKKwkJa2V5LT5vZmZzZXQgPSBlbmRfYnl0ZTsKKwkJcmV0ID0gYnRyZnNfc2V0X2l0ZW1fa2V5X3NhZmUodHJhbnMsIHJvb3QsIHBhdGgsIGtleSk7CisJCUJVR19PTihyZXQpOworCX0gZWxzZSB7CisJCUJVRygpOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGRlbGV0ZXMgdGhlIGNzdW0gaXRlbXMgZnJvbSB0aGUgY3N1bSB0cmVlIGZvciBhIGdpdmVuCisgKiByYW5nZSBvZiBieXRlcy4KKyAqLworaW50IGJ0cmZzX2RlbF9jc3VtcyhzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKKwkJICAgIHN0cnVjdCBidHJmc19yb290ICpyb290LCB1NjQgYnl0ZW5yLCB1NjQgbGVuKQoreworCXN0cnVjdCBidHJmc19wYXRoICpwYXRoOworCXN0cnVjdCBidHJmc19rZXkga2V5OworCXU2NCBlbmRfYnl0ZSA9IGJ5dGVuciArIGxlbjsKKwl1NjQgY3N1bV9lbmQ7CisJc3RydWN0IGV4dGVudF9idWZmZXIgKmxlYWY7CisJaW50IHJldDsKKwl1MTYgY3N1bV9zaXplID0KKwkJYnRyZnNfc3VwZXJfY3N1bV9zaXplKCZyb290LT5mc19pbmZvLT5zdXBlcl9jb3B5KTsKKwlpbnQgYmxvY2tzaXplX2JpdHMgPSByb290LT5mc19pbmZvLT5zYi0+c19ibG9ja3NpemVfYml0czsKKworCXJvb3QgPSByb290LT5mc19pbmZvLT5jc3VtX3Jvb3Q7CisKKwlwYXRoID0gYnRyZnNfYWxsb2NfcGF0aCgpOworCisJd2hpbGUgKDEpIHsKKwkJa2V5Lm9iamVjdGlkID0gQlRSRlNfRVhURU5UX0NTVU1fT0JKRUNUSUQ7CisJCWtleS5vZmZzZXQgPSBlbmRfYnl0ZSAtIDE7CisJCWtleS50eXBlID0gQlRSRlNfRVhURU5UX0NTVU1fS0VZOworCisJCXJldCA9IGJ0cmZzX3NlYXJjaF9zbG90KHRyYW5zLCByb290LCAma2V5LCBwYXRoLCAtMSwgMSk7CisJCWlmIChyZXQgPiAwKSB7CisJCQlpZiAocGF0aC0+c2xvdHNbMF0gPT0gMCkKKwkJCQlnb3RvIG91dDsKKwkJCXBhdGgtPnNsb3RzWzBdLS07CisJCX0KKwkJbGVhZiA9IHBhdGgtPm5vZGVzWzBdOworCQlidHJmc19pdGVtX2tleV90b19jcHUobGVhZiwgJmtleSwgcGF0aC0+c2xvdHNbMF0pOworCisJCWlmIChrZXkub2JqZWN0aWQgIT0gQlRSRlNfRVhURU5UX0NTVU1fT0JKRUNUSUQgfHwKKwkJICAgIGtleS50eXBlICE9IEJUUkZTX0VYVEVOVF9DU1VNX0tFWSkgeworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoa2V5Lm9mZnNldCA+PSBlbmRfYnl0ZSkKKwkJCWJyZWFrOworCisJCWNzdW1fZW5kID0gYnRyZnNfaXRlbV9zaXplX25yKGxlYWYsIHBhdGgtPnNsb3RzWzBdKSAvIGNzdW1fc2l6ZTsKKwkJY3N1bV9lbmQgPDw9IGJsb2Nrc2l6ZV9iaXRzOworCQljc3VtX2VuZCArPSBrZXkub2Zmc2V0OworCisJCS8qIHRoaXMgY3N1bSBlbmRzIGJlZm9yZSB3ZSBzdGFydCwgd2UncmUgZG9uZSAqLworCQlpZiAoY3N1bV9lbmQgPD0gYnl0ZW5yKQorCQkJYnJlYWs7CisKKwkJLyogZGVsZXRlIHRoZSBlbnRpcmUgaXRlbSwgaXQgaXMgaW5zaWRlIG91ciByYW5nZSAqLworCQlpZiAoa2V5Lm9mZnNldCA+PSBieXRlbnIgJiYgY3N1bV9lbmQgPD0gZW5kX2J5dGUpIHsKKwkJCXJldCA9IGJ0cmZzX2RlbF9pdGVtKHRyYW5zLCByb290LCBwYXRoKTsKKwkJCUJVR19PTihyZXQpOworCQkJaWYgKGtleS5vZmZzZXQgPT0gYnl0ZW5yKQorCQkJCWJyZWFrOworCQl9IGVsc2UgaWYgKGtleS5vZmZzZXQgPCBieXRlbnIgJiYgY3N1bV9lbmQgPiBlbmRfYnl0ZSkgeworCQkJdW5zaWduZWQgbG9uZyBvZmZzZXQ7CisJCQl1bnNpZ25lZCBsb25nIHNoaWZ0X2xlbjsKKwkJCXVuc2lnbmVkIGxvbmcgaXRlbV9vZmZzZXQ7CisJCQkvKgorCQkJICogICAgICAgIFsgYnl0ZW5yIC0gbGVuIF0KKwkJCSAqICAgICBbY3N1bSAgICAgICAgICAgICAgICBdCisJCQkgKgorCQkJICogT3VyIGJ5dGVzIGFyZSBpbiB0aGUgbWlkZGxlIG9mIHRoZSBjc3VtLAorCQkJICogd2UgbmVlZCB0byBzcGxpdCB0aGlzIGl0ZW0gYW5kIGluc2VydCBhIG5ldyBvbmUuCisJCQkgKgorCQkJICogQnV0IHdlIGNhbid0IGRyb3AgdGhlIHBhdGggYmVjYXVzZSB0aGUKKwkJCSAqIGNzdW0gY291bGQgY2hhbmdlLCBnZXQgcmVtb3ZlZCwgZXh0ZW5kZWQgZXRjLgorCQkJICoKKwkJCSAqIFRoZSB0cmljayBoZXJlIGlzIHRoZSBtYXggc2l6ZSBvZiBhIGNzdW0gaXRlbSBsZWF2ZXMKKwkJCSAqIGVub3VnaCByb29tIGluIHRoZSB0cmVlIGJsb2NrIGZvciBhIHNpbmdsZQorCQkJICogaXRlbSBoZWFkZXIuICBTbywgd2Ugc3BsaXQgdGhlIGl0ZW0gaW4gcGxhY2UsCisJCQkgKiBhZGRpbmcgYSBuZXcgaGVhZGVyIHBvaW50aW5nIHRvIHRoZSBleGlzdGluZworCQkJICogYnl0ZXMuICBUaGVuIHdlIGxvb3AgYXJvdW5kIGFnYWluIGFuZCB3ZSBoYXZlCisJCQkgKiBhIG5pY2VseSBmb3JtZWQgY3N1bSBpdGVtIHRoYXQgd2UgY2FuIG5lYXRseQorCQkJICogdHJ1bmNhdGUuCisJCQkgKi8KKwkJCW9mZnNldCA9IChieXRlbnIgLSBrZXkub2Zmc2V0KSA+PiBibG9ja3NpemVfYml0czsKKwkJCW9mZnNldCAqPSBjc3VtX3NpemU7CisKKwkJCXNoaWZ0X2xlbiA9IChsZW4gPj4gYmxvY2tzaXplX2JpdHMpICogY3N1bV9zaXplOworCisJCQlpdGVtX29mZnNldCA9IGJ0cmZzX2l0ZW1fcHRyX29mZnNldChsZWFmLAorCQkJCQkJCSAgICBwYXRoLT5zbG90c1swXSk7CisKKwkJCW1lbXNldF9leHRlbnRfYnVmZmVyKGxlYWYsIDAsIGl0ZW1fb2Zmc2V0ICsgb2Zmc2V0LAorCQkJCQkgICAgIHNoaWZ0X2xlbik7CisJCQlrZXkub2Zmc2V0ID0gYnl0ZW5yOworCisJCQkvKgorCQkJICogYnRyZnNfc3BsaXRfaXRlbSByZXR1cm5zIC1FQUdBSU4gd2hlbiB0aGUKKwkJCSAqIGl0ZW0gY2hhbmdlZCBzaXplIG9yIGtleQorCQkJICovCisJCQlyZXQgPSBidHJmc19zcGxpdF9pdGVtKHRyYW5zLCByb290LCBwYXRoLCAma2V5LCBvZmZzZXQpOworCQkJQlVHX09OKHJldCAmJiByZXQgIT0gLUVBR0FJTik7CisKKwkJCWtleS5vZmZzZXQgPSBlbmRfYnl0ZSAtIDE7CisJCX0gZWxzZSB7CisJCQlyZXQgPSB0cnVuY2F0ZV9vbmVfY3N1bSh0cmFucywgcm9vdCwgcGF0aCwKKwkJCQkJCSZrZXksIGJ5dGVuciwgbGVuKTsKKwkJCUJVR19PTihyZXQpOworCQkJaWYgKGtleS5vZmZzZXQgPCBieXRlbnIpCisJCQkJYnJlYWs7CisJCX0KKwkJYnRyZnNfcmVsZWFzZV9wYXRoKHJvb3QsIHBhdGgpOworCX0KK291dDoKKwlidHJmc19mcmVlX3BhdGgocGF0aCk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBidHJmc19jc3VtX2ZpbGVfYmxvY2tzKHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAorCQkJICAgc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsCisJCQkgICBzdHJ1Y3QgYnRyZnNfb3JkZXJlZF9zdW0gKnN1bXMpCit7CisJdTY0IGJ5dGVucjsKKwlpbnQgcmV0OworCXN0cnVjdCBidHJmc19rZXkgZmlsZV9rZXk7CisJc3RydWN0IGJ0cmZzX2tleSBmb3VuZF9rZXk7CisJdTY0IG5leHRfb2Zmc2V0OworCXU2NCB0b3RhbF9ieXRlcyA9IDA7CisJaW50IGZvdW5kX25leHQ7CisJc3RydWN0IGJ0cmZzX3BhdGggKnBhdGg7CisJc3RydWN0IGJ0cmZzX2NzdW1faXRlbSAqaXRlbTsKKwlzdHJ1Y3QgYnRyZnNfY3N1bV9pdGVtICppdGVtX2VuZDsKKwlzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqbGVhZiA9IE5VTEw7CisJdTY0IGNzdW1fb2Zmc2V0OworCXN0cnVjdCBidHJmc19zZWN0b3Jfc3VtICpzZWN0b3Jfc3VtOworCXUzMiBucml0ZW1zOworCXUzMiBpbnNfc2l6ZTsKKwljaGFyICplYl9tYXA7CisJY2hhciAqZWJfdG9rZW47CisJdW5zaWduZWQgbG9uZyBtYXBfbGVuOworCXVuc2lnbmVkIGxvbmcgbWFwX3N0YXJ0OworCXUxNiBjc3VtX3NpemUgPQorCQlidHJmc19zdXBlcl9jc3VtX3NpemUoJnJvb3QtPmZzX2luZm8tPnN1cGVyX2NvcHkpOworCisJcGF0aCA9IGJ0cmZzX2FsbG9jX3BhdGgoKTsKKwlCVUdfT04oIXBhdGgpOworCXNlY3Rvcl9zdW0gPSBzdW1zLT5zdW1zOworYWdhaW46CisJbmV4dF9vZmZzZXQgPSAodTY0KS0xOworCWZvdW5kX25leHQgPSAwOworCWZpbGVfa2V5Lm9iamVjdGlkID0gQlRSRlNfRVhURU5UX0NTVU1fT0JKRUNUSUQ7CisJZmlsZV9rZXkub2Zmc2V0ID0gc2VjdG9yX3N1bS0+Ynl0ZW5yOworCWJ5dGVuciA9IHNlY3Rvcl9zdW0tPmJ5dGVucjsKKwlidHJmc19zZXRfa2V5X3R5cGUoJmZpbGVfa2V5LCBCVFJGU19FWFRFTlRfQ1NVTV9LRVkpOworCisJaXRlbSA9IGJ0cmZzX2xvb2t1cF9jc3VtKHRyYW5zLCByb290LCBwYXRoLCBzZWN0b3Jfc3VtLT5ieXRlbnIsIDEpOworCWlmICghSVNfRVJSKGl0ZW0pKSB7CisJCWxlYWYgPSBwYXRoLT5ub2Rlc1swXTsKKwkJcmV0ID0gMDsKKwkJZ290byBmb3VuZDsKKwl9CisJcmV0ID0gUFRSX0VSUihpdGVtKTsKKwlpZiAocmV0ID09IC1FRkJJRykgeworCQl1MzIgaXRlbV9zaXplOworCQkvKiB3ZSBmb3VuZCBvbmUsIGJ1dCBpdCBpc24ndCBiaWcgZW5vdWdoIHlldCAqLworCQlsZWFmID0gcGF0aC0+bm9kZXNbMF07CisJCWl0ZW1fc2l6ZSA9IGJ0cmZzX2l0ZW1fc2l6ZV9ucihsZWFmLCBwYXRoLT5zbG90c1swXSk7CisJCWlmICgoaXRlbV9zaXplIC8gY3N1bV9zaXplKSA+PQorCQkgICAgTUFYX0NTVU1fSVRFTVMocm9vdCwgY3N1bV9zaXplKSkgeworCQkJLyogYWxyZWFkeSBhdCBtYXggc2l6ZSwgbWFrZSBhIG5ldyBvbmUgKi8KKwkJCWdvdG8gaW5zZXJ0OworCQl9CisJfSBlbHNlIHsKKwkJaW50IHNsb3QgPSBwYXRoLT5zbG90c1swXSArIDE7CisJCS8qIHdlIGRpZG4ndCBmaW5kIGEgY3N1bSBpdGVtLCBpbnNlcnQgb25lICovCisJCW5yaXRlbXMgPSBidHJmc19oZWFkZXJfbnJpdGVtcyhwYXRoLT5ub2Rlc1swXSk7CisJCWlmIChwYXRoLT5zbG90c1swXSA+PSBucml0ZW1zIC0gMSkgeworCQkJcmV0ID0gYnRyZnNfbmV4dF9sZWFmKHJvb3QsIHBhdGgpOworCQkJaWYgKHJldCA9PSAxKQorCQkJCWZvdW5kX25leHQgPSAxOworCQkJaWYgKHJldCAhPSAwKQorCQkJCWdvdG8gaW5zZXJ0OworCQkJc2xvdCA9IDA7CisJCX0KKwkJYnRyZnNfaXRlbV9rZXlfdG9fY3B1KHBhdGgtPm5vZGVzWzBdLCAmZm91bmRfa2V5LCBzbG90KTsKKwkJaWYgKGZvdW5kX2tleS5vYmplY3RpZCAhPSBCVFJGU19FWFRFTlRfQ1NVTV9PQkpFQ1RJRCB8fAorCQkgICAgZm91bmRfa2V5LnR5cGUgIT0gQlRSRlNfRVhURU5UX0NTVU1fS0VZKSB7CisJCQlmb3VuZF9uZXh0ID0gMTsKKwkJCWdvdG8gaW5zZXJ0OworCQl9CisJCW5leHRfb2Zmc2V0ID0gZm91bmRfa2V5Lm9mZnNldDsKKwkJZm91bmRfbmV4dCA9IDE7CisJCWdvdG8gaW5zZXJ0OworCX0KKworCS8qCisJICogYXQgdGhpcyBwb2ludCwgd2Uga25vdyB0aGUgdHJlZSBoYXMgYW4gaXRlbSwgYnV0IGl0IGlzbid0IGJpZworCSAqIGVub3VnaCB5ZXQgdG8gcHV0IG91ciBjc3VtIGluLiAgR3JvdyBpdAorCSAqLworCWJ0cmZzX3JlbGVhc2VfcGF0aChyb290LCBwYXRoKTsKKwlyZXQgPSBidHJmc19zZWFyY2hfc2xvdCh0cmFucywgcm9vdCwgJmZpbGVfa2V5LCBwYXRoLAorCQkJCWNzdW1fc2l6ZSwgMSk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZmFpbF91bmxvY2s7CisKKwlpZiAocmV0ID4gMCkgeworCQlpZiAocGF0aC0+c2xvdHNbMF0gPT0gMCkKKwkJCWdvdG8gaW5zZXJ0OworCQlwYXRoLT5zbG90c1swXS0tOworCX0KKworCWxlYWYgPSBwYXRoLT5ub2Rlc1swXTsKKwlidHJmc19pdGVtX2tleV90b19jcHUobGVhZiwgJmZvdW5kX2tleSwgcGF0aC0+c2xvdHNbMF0pOworCWNzdW1fb2Zmc2V0ID0gKGJ5dGVuciAtIGZvdW5kX2tleS5vZmZzZXQpID4+CisJCQlyb290LT5mc19pbmZvLT5zYi0+c19ibG9ja3NpemVfYml0czsKKworCWlmIChidHJmc19rZXlfdHlwZSgmZm91bmRfa2V5KSAhPSBCVFJGU19FWFRFTlRfQ1NVTV9LRVkgfHwKKwkgICAgZm91bmRfa2V5Lm9iamVjdGlkICE9IEJUUkZTX0VYVEVOVF9DU1VNX09CSkVDVElEIHx8CisJICAgIGNzdW1fb2Zmc2V0ID49IE1BWF9DU1VNX0lURU1TKHJvb3QsIGNzdW1fc2l6ZSkpIHsKKwkJZ290byBpbnNlcnQ7CisJfQorCisJaWYgKGNzdW1fb2Zmc2V0ID49IGJ0cmZzX2l0ZW1fc2l6ZV9ucihsZWFmLCBwYXRoLT5zbG90c1swXSkgLworCSAgICBjc3VtX3NpemUpIHsKKwkJdTMyIGRpZmYgPSAoY3N1bV9vZmZzZXQgKyAxKSAqIGNzdW1fc2l6ZTsKKworCQkvKgorCQkgKiBpcyB0aGUgaXRlbSBiaWcgZW5vdWdoIGFscmVhZHk/ICB3ZSBkcm9wcGVkIG91ciBsb2NrCisJCSAqIGJlZm9yZSBhbmQgbmVlZCB0byByZWNoZWNrCisJCSAqLworCQlpZiAoZGlmZiA8IGJ0cmZzX2l0ZW1fc2l6ZV9ucihsZWFmLCBwYXRoLT5zbG90c1swXSkpCisJCQlnb3RvIGNzdW07CisKKwkJZGlmZiA9IGRpZmYgLSBidHJmc19pdGVtX3NpemVfbnIobGVhZiwgcGF0aC0+c2xvdHNbMF0pOworCQlpZiAoZGlmZiAhPSBjc3VtX3NpemUpCisJCQlnb3RvIGluc2VydDsKKworCQlyZXQgPSBidHJmc19leHRlbmRfaXRlbSh0cmFucywgcm9vdCwgcGF0aCwgZGlmZik7CisJCUJVR19PTihyZXQpOworCQlnb3RvIGNzdW07CisJfQorCitpbnNlcnQ6CisJYnRyZnNfcmVsZWFzZV9wYXRoKHJvb3QsIHBhdGgpOworCWNzdW1fb2Zmc2V0ID0gMDsKKwlpZiAoZm91bmRfbmV4dCkgeworCQl1NjQgdG1wID0gdG90YWxfYnl0ZXMgKyByb290LT5zZWN0b3JzaXplOworCQl1NjQgbmV4dF9zZWN0b3IgPSBzZWN0b3Jfc3VtLT5ieXRlbnI7CisJCXN0cnVjdCBidHJmc19zZWN0b3Jfc3VtICpuZXh0ID0gc2VjdG9yX3N1bSArIDE7CisKKwkJd2hpbGUgKHRtcCA8IHN1bXMtPmxlbikgeworCQkJaWYgKG5leHRfc2VjdG9yICsgcm9vdC0+c2VjdG9yc2l6ZSAhPSBuZXh0LT5ieXRlbnIpCisJCQkJYnJlYWs7CisJCQl0bXAgKz0gcm9vdC0+c2VjdG9yc2l6ZTsKKwkJCW5leHRfc2VjdG9yID0gbmV4dC0+Ynl0ZW5yOworCQkJbmV4dCsrOworCQl9CisJCXRtcCA9IG1pbih0bXAsIG5leHRfb2Zmc2V0IC0gZmlsZV9rZXkub2Zmc2V0KTsKKwkJdG1wID4+PSByb290LT5mc19pbmZvLT5zYi0+c19ibG9ja3NpemVfYml0czsKKwkJdG1wID0gbWF4KCh1NjQpMSwgdG1wKTsKKwkJdG1wID0gbWluKHRtcCwgKHU2NClNQVhfQ1NVTV9JVEVNUyhyb290LCBjc3VtX3NpemUpKTsKKwkJaW5zX3NpemUgPSBjc3VtX3NpemUgKiB0bXA7CisJfSBlbHNlIHsKKwkJaW5zX3NpemUgPSBjc3VtX3NpemU7CisJfQorCXJldCA9IGJ0cmZzX2luc2VydF9lbXB0eV9pdGVtKHRyYW5zLCByb290LCBwYXRoLCAmZmlsZV9rZXksCisJCQkJICAgICAgaW5zX3NpemUpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGZhaWxfdW5sb2NrOworCWlmIChyZXQgIT0gMCkgeworCQlXQVJOX09OKDEpOworCQlnb3RvIGZhaWxfdW5sb2NrOworCX0KK2NzdW06CisJbGVhZiA9IHBhdGgtPm5vZGVzWzBdOworCWl0ZW0gPSBidHJmc19pdGVtX3B0cihsZWFmLCBwYXRoLT5zbG90c1swXSwgc3RydWN0IGJ0cmZzX2NzdW1faXRlbSk7CisJcmV0ID0gMDsKKwlpdGVtID0gKHN0cnVjdCBidHJmc19jc3VtX2l0ZW0gKikoKHVuc2lnbmVkIGNoYXIgKilpdGVtICsKKwkJCQkJICBjc3VtX29mZnNldCAqIGNzdW1fc2l6ZSk7Citmb3VuZDoKKwlpdGVtX2VuZCA9IGJ0cmZzX2l0ZW1fcHRyKGxlYWYsIHBhdGgtPnNsb3RzWzBdLCBzdHJ1Y3QgYnRyZnNfY3N1bV9pdGVtKTsKKwlpdGVtX2VuZCA9IChzdHJ1Y3QgYnRyZnNfY3N1bV9pdGVtICopKCh1bnNpZ25lZCBjaGFyICopaXRlbV9lbmQgKworCQkJCSAgICAgIGJ0cmZzX2l0ZW1fc2l6ZV9ucihsZWFmLCBwYXRoLT5zbG90c1swXSkpOworCWViX3Rva2VuID0gTlVMTDsKKwljb25kX3Jlc2NoZWQoKTsKK25leHRfc2VjdG9yOgorCisJaWYgKCFlYl90b2tlbiB8fAorCSAgICh1bnNpZ25lZCBsb25nKWl0ZW0gKyBjc3VtX3NpemUgPj0gbWFwX3N0YXJ0ICsgbWFwX2xlbikgeworCQlpbnQgZXJyOworCisJCWlmIChlYl90b2tlbikKKwkJCXVubWFwX2V4dGVudF9idWZmZXIobGVhZiwgZWJfdG9rZW4sIEtNX1VTRVIxKTsKKwkJZWJfdG9rZW4gPSBOVUxMOworCQllcnIgPSBtYXBfcHJpdmF0ZV9leHRlbnRfYnVmZmVyKGxlYWYsICh1bnNpZ25lZCBsb25nKWl0ZW0sCisJCQkJCQljc3VtX3NpemUsCisJCQkJCQkmZWJfdG9rZW4sICZlYl9tYXAsCisJCQkJCQkmbWFwX3N0YXJ0LCAmbWFwX2xlbiwgS01fVVNFUjEpOworCQlpZiAoZXJyKQorCQkJZWJfdG9rZW4gPSBOVUxMOworCX0KKwlpZiAoZWJfdG9rZW4pIHsKKwkJbWVtY3B5KGViX3Rva2VuICsgKCh1bnNpZ25lZCBsb25nKWl0ZW0gJiAoUEFHRV9DQUNIRV9TSVpFIC0gMSkpLAorCQkgICAgICAgJnNlY3Rvcl9zdW0tPnN1bSwgY3N1bV9zaXplKTsKKwl9IGVsc2UgeworCQl3cml0ZV9leHRlbnRfYnVmZmVyKGxlYWYsICZzZWN0b3Jfc3VtLT5zdW0sCisJCQkJICAgICh1bnNpZ25lZCBsb25nKWl0ZW0sIGNzdW1fc2l6ZSk7CisJfQorCisJdG90YWxfYnl0ZXMgKz0gcm9vdC0+c2VjdG9yc2l6ZTsKKwlzZWN0b3Jfc3VtKys7CisJaWYgKHRvdGFsX2J5dGVzIDwgc3Vtcy0+bGVuKSB7CisJCWl0ZW0gPSAoc3RydWN0IGJ0cmZzX2NzdW1faXRlbSAqKSgoY2hhciAqKWl0ZW0gKworCQkJCQkJICBjc3VtX3NpemUpOworCQlpZiAoaXRlbSA8IGl0ZW1fZW5kICYmIGJ5dGVuciArIFBBR0VfQ0FDSEVfU0laRSA9PQorCQkgICAgc2VjdG9yX3N1bS0+Ynl0ZW5yKSB7CisJCQlieXRlbnIgPSBzZWN0b3Jfc3VtLT5ieXRlbnI7CisJCQlnb3RvIG5leHRfc2VjdG9yOworCQl9CisJfQorCWlmIChlYl90b2tlbikgeworCQl1bm1hcF9leHRlbnRfYnVmZmVyKGxlYWYsIGViX3Rva2VuLCBLTV9VU0VSMSk7CisJCWViX3Rva2VuID0gTlVMTDsKKwl9CisJYnRyZnNfbWFya19idWZmZXJfZGlydHkocGF0aC0+bm9kZXNbMF0pOworCWNvbmRfcmVzY2hlZCgpOworCWlmICh0b3RhbF9ieXRlcyA8IHN1bXMtPmxlbikgeworCQlidHJmc19yZWxlYXNlX3BhdGgocm9vdCwgcGF0aCk7CisJCWdvdG8gYWdhaW47CisJfQorb3V0OgorCWJ0cmZzX2ZyZWVfcGF0aChwYXRoKTsKKwlyZXR1cm4gcmV0OworCitmYWlsX3VubG9jazoKKwlnb3RvIG91dDsKK30KZGlmZiAtLWdpdCBhL2ZzL2J0cmZzL2ZpbGUuYyBiL2ZzL2J0cmZzL2ZpbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDI2ODMzCi0tLSAvZGV2L251bGwKKysrIGIvZnMvYnRyZnMvZmlsZS5jCkBAIC0wLDAgKzEsMTI4OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBPcmFjbGUuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSB2MiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorICogQm9zdG9uLCBNQSAwMjExMTAtMTMwNywgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2JhY2tpbmctZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvbXBhZ2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zd2FwLmg+CisjaW5jbHVkZSA8bGludXgvd3JpdGViYWNrLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdGZzLmg+CisjaW5jbHVkZSA8bGludXgvY29tcGF0Lmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgImN0cmVlLmgiCisjaW5jbHVkZSAiZGlzay1pby5oIgorI2luY2x1ZGUgInRyYW5zYWN0aW9uLmgiCisjaW5jbHVkZSAiYnRyZnNfaW5vZGUuaCIKKyNpbmNsdWRlICJpb2N0bC5oIgorI2luY2x1ZGUgInByaW50LXRyZWUuaCIKKyNpbmNsdWRlICJ0cmVlLWxvZy5oIgorI2luY2x1ZGUgImxvY2tpbmcuaCIKKyNpbmNsdWRlICJjb21wYXQuaCIKKworCisvKiBzaW1wbGUgaGVscGVyIHRvIGZhdWx0IGluIHBhZ2VzIGFuZCBjb3B5LiAgVGhpcyBzaG91bGQgZ28gYXdheQorICogYW5kIGJlIHJlcGxhY2VkIHdpdGggY2FsbHMgaW50byBnZW5lcmljIGNvZGUuCisgKi8KK3N0YXRpYyBub2lubGluZSBpbnQgYnRyZnNfY29weV9mcm9tX3VzZXIobG9mZl90IHBvcywgaW50IG51bV9wYWdlcywKKwkJCQkJIGludCB3cml0ZV9ieXRlcywKKwkJCQkJIHN0cnVjdCBwYWdlICoqcHJlcGFyZWRfcGFnZXMsCisJCQkJCSBjb25zdCBjaGFyIF9fdXNlciAqYnVmKQoreworCWxvbmcgcGFnZV9mYXVsdCA9IDA7CisJaW50IGk7CisJaW50IG9mZnNldCA9IHBvcyAmIChQQUdFX0NBQ0hFX1NJWkUgLSAxKTsKKworCWZvciAoaSA9IDA7IGkgPCBudW1fcGFnZXMgJiYgd3JpdGVfYnl0ZXMgPiAwOyBpKyssIG9mZnNldCA9IDApIHsKKwkJc2l6ZV90IGNvdW50ID0gbWluX3Qoc2l6ZV90LAorCQkJCSAgICAgUEFHRV9DQUNIRV9TSVpFIC0gb2Zmc2V0LCB3cml0ZV9ieXRlcyk7CisJCXN0cnVjdCBwYWdlICpwYWdlID0gcHJlcGFyZWRfcGFnZXNbaV07CisJCWZhdWx0X2luX3BhZ2VzX3JlYWRhYmxlKGJ1ZiwgY291bnQpOworCisJCS8qIENvcHkgZGF0YSBmcm9tIHVzZXJzcGFjZSB0byB0aGUgY3VycmVudCBwYWdlICovCisJCWttYXAocGFnZSk7CisJCXBhZ2VfZmF1bHQgPSBfX2NvcHlfZnJvbV91c2VyKHBhZ2VfYWRkcmVzcyhwYWdlKSArIG9mZnNldCwKKwkJCQkJICAgICAgYnVmLCBjb3VudCk7CisJCS8qIEZsdXNoIHByb2Nlc3NvcidzIGRjYWNoZSBmb3IgdGhpcyBwYWdlICovCisJCWZsdXNoX2RjYWNoZV9wYWdlKHBhZ2UpOworCQlrdW5tYXAocGFnZSk7CisJCWJ1ZiArPSBjb3VudDsKKwkJd3JpdGVfYnl0ZXMgLT0gY291bnQ7CisKKwkJaWYgKHBhZ2VfZmF1bHQpCisJCQlicmVhazsKKwl9CisJcmV0dXJuIHBhZ2VfZmF1bHQgPyAtRUZBVUxUIDogMDsKK30KKworLyoKKyAqIHVubG9ja3MgcGFnZXMgYWZ0ZXIgYnRyZnNfZmlsZV93cml0ZSBpcyBkb25lIHdpdGggdGhlbQorICovCitzdGF0aWMgbm9pbmxpbmUgdm9pZCBidHJmc19kcm9wX3BhZ2VzKHN0cnVjdCBwYWdlICoqcGFnZXMsIHNpemVfdCBudW1fcGFnZXMpCit7CisJc2l6ZV90IGk7CisJZm9yIChpID0gMDsgaSA8IG51bV9wYWdlczsgaSsrKSB7CisJCWlmICghcGFnZXNbaV0pCisJCQlicmVhazsKKwkJLyogcGFnZSBjaGVja2VkIGlzIHNvbWUgbWFnaWMgYXJvdW5kIGZpbmRpbmcgcGFnZXMgdGhhdAorCQkgKiBoYXZlIGJlZW4gbW9kaWZpZWQgd2l0aG91dCBnb2luZyB0aHJvdWdoIGJ0cmZzX3NldF9wYWdlX2RpcnR5CisJCSAqIGNsZWFyIGl0IGhlcmUKKwkJICovCisJCUNsZWFyUGFnZUNoZWNrZWQocGFnZXNbaV0pOworCQl1bmxvY2tfcGFnZShwYWdlc1tpXSk7CisJCW1hcmtfcGFnZV9hY2Nlc3NlZChwYWdlc1tpXSk7CisJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlc1tpXSk7CisJfQorfQorCisvKgorICogYWZ0ZXIgY29weV9mcm9tX3VzZXIsIHBhZ2VzIG5lZWQgdG8gYmUgZGlydGllZCBhbmQgd2UgbmVlZCB0byBtYWtlCisgKiBzdXJlIGhvbGVzIGFyZSBjcmVhdGVkIGJldHdlZW4gdGhlIGN1cnJlbnQgRU9GIGFuZCB0aGUgc3RhcnQgb2YKKyAqIGFueSBuZXh0IGV4dGVudHMgKGlmIHJlcXVpcmVkKS4KKyAqCisgKiB0aGlzIGFsc28gbWFrZXMgdGhlIGRlY2lzaW9uIGFib3V0IGNyZWF0aW5nIGFuIGlubGluZSBleHRlbnQgdnMKKyAqIGRvaW5nIHJlYWwgZGF0YSBleHRlbnRzLCBtYXJraW5nIHBhZ2VzIGRpcnR5IGFuZCBkZWxhbGxvYyBhcyByZXF1aXJlZC4KKyAqLworc3RhdGljIG5vaW5saW5lIGludCBkaXJ0eV9hbmRfcmVsZWFzZV9wYWdlcyhzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKKwkJCQkgICBzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwKKwkJCQkgICBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCQkgICBzdHJ1Y3QgcGFnZSAqKnBhZ2VzLAorCQkJCSAgIHNpemVfdCBudW1fcGFnZXMsCisJCQkJICAgbG9mZl90IHBvcywKKwkJCQkgICBzaXplX3Qgd3JpdGVfYnl0ZXMpCit7CisJaW50IGVyciA9IDA7CisJaW50IGk7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGZkZW50cnkoZmlsZSktPmRfaW5vZGU7CisJc3RydWN0IGV4dGVudF9pb190cmVlICppb190cmVlID0gJkJUUkZTX0koaW5vZGUpLT5pb190cmVlOworCXU2NCBoaW50X2J5dGU7CisJdTY0IG51bV9ieXRlczsKKwl1NjQgc3RhcnRfcG9zOworCXU2NCBlbmRfb2ZfbGFzdF9ibG9jazsKKwl1NjQgZW5kX3BvcyA9IHBvcyArIHdyaXRlX2J5dGVzOworCWxvZmZfdCBpc2l6ZSA9IGlfc2l6ZV9yZWFkKGlub2RlKTsKKworCXN0YXJ0X3BvcyA9IHBvcyAmIH4oKHU2NClyb290LT5zZWN0b3JzaXplIC0gMSk7CisJbnVtX2J5dGVzID0gKHdyaXRlX2J5dGVzICsgcG9zIC0gc3RhcnRfcG9zICsKKwkJICAgIHJvb3QtPnNlY3RvcnNpemUgLSAxKSAmIH4oKHU2NClyb290LT5zZWN0b3JzaXplIC0gMSk7CisKKwllbmRfb2ZfbGFzdF9ibG9jayA9IHN0YXJ0X3BvcyArIG51bV9ieXRlcyAtIDE7CisKKwlsb2NrX2V4dGVudChpb190cmVlLCBzdGFydF9wb3MsIGVuZF9vZl9sYXN0X2Jsb2NrLCBHRlBfTk9GUyk7CisJdHJhbnMgPSBidHJmc19qb2luX3RyYW5zYWN0aW9uKHJvb3QsIDEpOworCWlmICghdHJhbnMpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBvdXRfdW5sb2NrOworCX0KKwlidHJmc19zZXRfdHJhbnNfYmxvY2tfZ3JvdXAodHJhbnMsIGlub2RlKTsKKwloaW50X2J5dGUgPSAwOworCisJc2V0X2V4dGVudF91cHRvZGF0ZShpb190cmVlLCBzdGFydF9wb3MsIGVuZF9vZl9sYXN0X2Jsb2NrLCBHRlBfTk9GUyk7CisKKwkvKiBjaGVjayBmb3IgcmVzZXJ2ZWQgZXh0ZW50cyBvbiBlYWNoIHBhZ2UsIHdlIGRvbid0IHdhbnQKKwkgKiB0byByZXNldCB0aGUgZGVsYWxsb2MgYml0IG9uIHRoaW5ncyB0aGF0IGFscmVhZHkgaGF2ZQorCSAqIGV4dGVudHMgcmVzZXJ2ZWQuCisJICovCisJYnRyZnNfc2V0X2V4dGVudF9kZWxhbGxvYyhpbm9kZSwgc3RhcnRfcG9zLCBlbmRfb2ZfbGFzdF9ibG9jayk7CisJZm9yIChpID0gMDsgaSA8IG51bV9wYWdlczsgaSsrKSB7CisJCXN0cnVjdCBwYWdlICpwID0gcGFnZXNbaV07CisJCVNldFBhZ2VVcHRvZGF0ZShwKTsKKwkJQ2xlYXJQYWdlQ2hlY2tlZChwKTsKKwkJc2V0X3BhZ2VfZGlydHkocCk7CisJfQorCWlmIChlbmRfcG9zID4gaXNpemUpIHsKKwkJaV9zaXplX3dyaXRlKGlub2RlLCBlbmRfcG9zKTsKKwkJYnRyZnNfdXBkYXRlX2lub2RlKHRyYW5zLCByb290LCBpbm9kZSk7CisJfQorCWVyciA9IGJ0cmZzX2VuZF90cmFuc2FjdGlvbih0cmFucywgcm9vdCk7CitvdXRfdW5sb2NrOgorCXVubG9ja19leHRlbnQoaW9fdHJlZSwgc3RhcnRfcG9zLCBlbmRfb2ZfbGFzdF9ibG9jaywgR0ZQX05PRlMpOworCXJldHVybiBlcnI7Cit9CisKKy8qCisgKiB0aGlzIGRyb3BzIGFsbCB0aGUgZXh0ZW50cyBpbiB0aGUgY2FjaGUgdGhhdCBpbnRlcnNlY3QgdGhlIHJhbmdlCisgKiBbc3RhcnQsIGVuZF0uICBFeGlzdGluZyBleHRlbnRzIGFyZSBzcGxpdCBhcyByZXF1aXJlZC4KKyAqLworaW50IGJ0cmZzX2Ryb3BfZXh0ZW50X2NhY2hlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHU2NCBzdGFydCwgdTY0IGVuZCwKKwkJCSAgICBpbnQgc2tpcF9waW5uZWQpCit7CisJc3RydWN0IGV4dGVudF9tYXAgKmVtOworCXN0cnVjdCBleHRlbnRfbWFwICpzcGxpdCA9IE5VTEw7CisJc3RydWN0IGV4dGVudF9tYXAgKnNwbGl0MiA9IE5VTEw7CisJc3RydWN0IGV4dGVudF9tYXBfdHJlZSAqZW1fdHJlZSA9ICZCVFJGU19JKGlub2RlKS0+ZXh0ZW50X3RyZWU7CisJdTY0IGxlbiA9IGVuZCAtIHN0YXJ0ICsgMTsKKwlpbnQgcmV0OworCWludCB0ZXN0ZW5kID0gMTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBjb21wcmVzc2VkID0gMDsKKworCVdBUk5fT04oZW5kIDwgc3RhcnQpOworCWlmIChlbmQgPT0gKHU2NCktMSkgeworCQlsZW4gPSAodTY0KS0xOworCQl0ZXN0ZW5kID0gMDsKKwl9CisJd2hpbGUgKDEpIHsKKwkJaWYgKCFzcGxpdCkKKwkJCXNwbGl0ID0gYWxsb2NfZXh0ZW50X21hcChHRlBfTk9GUyk7CisJCWlmICghc3BsaXQyKQorCQkJc3BsaXQyID0gYWxsb2NfZXh0ZW50X21hcChHRlBfTk9GUyk7CisKKwkJc3Bpbl9sb2NrKCZlbV90cmVlLT5sb2NrKTsKKwkJZW0gPSBsb29rdXBfZXh0ZW50X21hcHBpbmcoZW1fdHJlZSwgc3RhcnQsIGxlbik7CisJCWlmICghZW0pIHsKKwkJCXNwaW5fdW5sb2NrKCZlbV90cmVlLT5sb2NrKTsKKwkJCWJyZWFrOworCQl9CisJCWZsYWdzID0gZW0tPmZsYWdzOworCQlpZiAoc2tpcF9waW5uZWQgJiYgdGVzdF9iaXQoRVhURU5UX0ZMQUdfUElOTkVELCAmZW0tPmZsYWdzKSkgeworCQkJc3Bpbl91bmxvY2soJmVtX3RyZWUtPmxvY2spOworCQkJaWYgKGVtLT5zdGFydCA8PSBzdGFydCAmJgorCQkJICAgICghdGVzdGVuZCB8fCBlbS0+c3RhcnQgKyBlbS0+bGVuID49IHN0YXJ0ICsgbGVuKSkgeworCQkJCWZyZWVfZXh0ZW50X21hcChlbSk7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoc3RhcnQgPCBlbS0+c3RhcnQpIHsKKwkJCQlsZW4gPSBlbS0+c3RhcnQgLSBzdGFydDsKKwkJCX0gZWxzZSB7CisJCQkJbGVuID0gc3RhcnQgKyBsZW4gLSAoZW0tPnN0YXJ0ICsgZW0tPmxlbik7CisJCQkJc3RhcnQgPSBlbS0+c3RhcnQgKyBlbS0+bGVuOworCQkJfQorCQkJZnJlZV9leHRlbnRfbWFwKGVtKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWNvbXByZXNzZWQgPSB0ZXN0X2JpdChFWFRFTlRfRkxBR19DT01QUkVTU0VELCAmZW0tPmZsYWdzKTsKKwkJY2xlYXJfYml0KEVYVEVOVF9GTEFHX1BJTk5FRCwgJmVtLT5mbGFncyk7CisJCXJlbW92ZV9leHRlbnRfbWFwcGluZyhlbV90cmVlLCBlbSk7CisKKwkJaWYgKGVtLT5ibG9ja19zdGFydCA8IEVYVEVOVF9NQVBfTEFTVF9CWVRFICYmCisJCSAgICBlbS0+c3RhcnQgPCBzdGFydCkgeworCQkJc3BsaXQtPnN0YXJ0ID0gZW0tPnN0YXJ0OworCQkJc3BsaXQtPmxlbiA9IHN0YXJ0IC0gZW0tPnN0YXJ0OworCQkJc3BsaXQtPm9yaWdfc3RhcnQgPSBlbS0+b3JpZ19zdGFydDsKKwkJCXNwbGl0LT5ibG9ja19zdGFydCA9IGVtLT5ibG9ja19zdGFydDsKKworCQkJaWYgKGNvbXByZXNzZWQpCisJCQkJc3BsaXQtPmJsb2NrX2xlbiA9IGVtLT5ibG9ja19sZW47CisJCQllbHNlCisJCQkJc3BsaXQtPmJsb2NrX2xlbiA9IHNwbGl0LT5sZW47CisKKwkJCXNwbGl0LT5iZGV2ID0gZW0tPmJkZXY7CisJCQlzcGxpdC0+ZmxhZ3MgPSBmbGFnczsKKwkJCXJldCA9IGFkZF9leHRlbnRfbWFwcGluZyhlbV90cmVlLCBzcGxpdCk7CisJCQlCVUdfT04ocmV0KTsKKwkJCWZyZWVfZXh0ZW50X21hcChzcGxpdCk7CisJCQlzcGxpdCA9IHNwbGl0MjsKKwkJCXNwbGl0MiA9IE5VTEw7CisJCX0KKwkJaWYgKGVtLT5ibG9ja19zdGFydCA8IEVYVEVOVF9NQVBfTEFTVF9CWVRFICYmCisJCSAgICB0ZXN0ZW5kICYmIGVtLT5zdGFydCArIGVtLT5sZW4gPiBzdGFydCArIGxlbikgeworCQkJdTY0IGRpZmYgPSBzdGFydCArIGxlbiAtIGVtLT5zdGFydDsKKworCQkJc3BsaXQtPnN0YXJ0ID0gc3RhcnQgKyBsZW47CisJCQlzcGxpdC0+bGVuID0gZW0tPnN0YXJ0ICsgZW0tPmxlbiAtIChzdGFydCArIGxlbik7CisJCQlzcGxpdC0+YmRldiA9IGVtLT5iZGV2OworCQkJc3BsaXQtPmZsYWdzID0gZmxhZ3M7CisKKwkJCWlmIChjb21wcmVzc2VkKSB7CisJCQkJc3BsaXQtPmJsb2NrX2xlbiA9IGVtLT5ibG9ja19sZW47CisJCQkJc3BsaXQtPmJsb2NrX3N0YXJ0ID0gZW0tPmJsb2NrX3N0YXJ0OworCQkJCXNwbGl0LT5vcmlnX3N0YXJ0ID0gZW0tPm9yaWdfc3RhcnQ7CisJCQl9IGVsc2UgeworCQkJCXNwbGl0LT5ibG9ja19sZW4gPSBzcGxpdC0+bGVuOworCQkJCXNwbGl0LT5ibG9ja19zdGFydCA9IGVtLT5ibG9ja19zdGFydCArIGRpZmY7CisJCQkJc3BsaXQtPm9yaWdfc3RhcnQgPSBzcGxpdC0+c3RhcnQ7CisJCQl9CisKKwkJCXJldCA9IGFkZF9leHRlbnRfbWFwcGluZyhlbV90cmVlLCBzcGxpdCk7CisJCQlCVUdfT04ocmV0KTsKKwkJCWZyZWVfZXh0ZW50X21hcChzcGxpdCk7CisJCQlzcGxpdCA9IE5VTEw7CisJCX0KKwkJc3Bpbl91bmxvY2soJmVtX3RyZWUtPmxvY2spOworCisJCS8qIG9uY2UgZm9yIHVzICovCisJCWZyZWVfZXh0ZW50X21hcChlbSk7CisJCS8qIG9uY2UgZm9yIHRoZSB0cmVlKi8KKwkJZnJlZV9leHRlbnRfbWFwKGVtKTsKKwl9CisJaWYgKHNwbGl0KQorCQlmcmVlX2V4dGVudF9tYXAoc3BsaXQpOworCWlmIChzcGxpdDIpCisJCWZyZWVfZXh0ZW50X21hcChzcGxpdDIpOworCXJldHVybiAwOworfQorCitpbnQgYnRyZnNfY2hlY2tfZmlsZShzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwgc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlyZXR1cm4gMDsKKyNpZiAwCisJc3RydWN0IGJ0cmZzX3BhdGggKnBhdGg7CisJc3RydWN0IGJ0cmZzX2tleSBmb3VuZF9rZXk7CisJc3RydWN0IGV4dGVudF9idWZmZXIgKmxlYWY7CisJc3RydWN0IGJ0cmZzX2ZpbGVfZXh0ZW50X2l0ZW0gKmV4dGVudDsKKwl1NjQgbGFzdF9vZmZzZXQgPSAwOworCWludCBucml0ZW1zOworCWludCBzbG90OworCWludCBmb3VuZF90eXBlOworCWludCByZXQ7CisJaW50IGVyciA9IDA7CisJdTY0IGV4dGVudF9lbmQgPSAwOworCisJcGF0aCA9IGJ0cmZzX2FsbG9jX3BhdGgoKTsKKwlyZXQgPSBidHJmc19sb29rdXBfZmlsZV9leHRlbnQoTlVMTCwgcm9vdCwgcGF0aCwgaW5vZGUtPmlfaW5vLAorCQkJCSAgICAgICBsYXN0X29mZnNldCwgMCk7CisJd2hpbGUgKDEpIHsKKwkJbnJpdGVtcyA9IGJ0cmZzX2hlYWRlcl9ucml0ZW1zKHBhdGgtPm5vZGVzWzBdKTsKKwkJaWYgKHBhdGgtPnNsb3RzWzBdID49IG5yaXRlbXMpIHsKKwkJCXJldCA9IGJ0cmZzX25leHRfbGVhZihyb290LCBwYXRoKTsKKwkJCWlmIChyZXQpCisJCQkJZ290byBvdXQ7CisJCQlucml0ZW1zID0gYnRyZnNfaGVhZGVyX25yaXRlbXMocGF0aC0+bm9kZXNbMF0pOworCQl9CisJCXNsb3QgPSBwYXRoLT5zbG90c1swXTsKKwkJbGVhZiA9IHBhdGgtPm5vZGVzWzBdOworCQlidHJmc19pdGVtX2tleV90b19jcHUobGVhZiwgJmZvdW5kX2tleSwgc2xvdCk7CisJCWlmIChmb3VuZF9rZXkub2JqZWN0aWQgIT0gaW5vZGUtPmlfaW5vKQorCQkJYnJlYWs7CisJCWlmIChmb3VuZF9rZXkudHlwZSAhPSBCVFJGU19FWFRFTlRfREFUQV9LRVkpCisJCQlnb3RvIG91dDsKKworCQlpZiAoZm91bmRfa2V5Lm9mZnNldCA8IGxhc3Rfb2Zmc2V0KSB7CisJCQlXQVJOX09OKDEpOworCQkJYnRyZnNfcHJpbnRfbGVhZihyb290LCBsZWFmKTsKKwkJCXByaW50ayhLRVJOX0VSUiAiaW5vZGUgJWx1IGZvdW5kIG9mZnNldCAlbGx1ICIKKwkJCSAgICAgICAiZXhwZWN0ZWQgJWxsdVxuIiwgaW5vZGUtPmlfaW5vLAorCQkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpZm91bmRfa2V5Lm9mZnNldCwKKwkJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKWxhc3Rfb2Zmc2V0KTsKKwkJCWVyciA9IDE7CisJCQlnb3RvIG91dDsKKwkJfQorCQlleHRlbnQgPSBidHJmc19pdGVtX3B0cihsZWFmLCBzbG90LAorCQkJCQlzdHJ1Y3QgYnRyZnNfZmlsZV9leHRlbnRfaXRlbSk7CisJCWZvdW5kX3R5cGUgPSBidHJmc19maWxlX2V4dGVudF90eXBlKGxlYWYsIGV4dGVudCk7CisJCWlmIChmb3VuZF90eXBlID09IEJUUkZTX0ZJTEVfRVhURU5UX1JFRykgeworCQkJZXh0ZW50X2VuZCA9IGZvdW5kX2tleS5vZmZzZXQgKworCQkJICAgICBidHJmc19maWxlX2V4dGVudF9udW1fYnl0ZXMobGVhZiwgZXh0ZW50KTsKKwkJfSBlbHNlIGlmIChmb3VuZF90eXBlID09IEJUUkZTX0ZJTEVfRVhURU5UX0lOTElORSkgeworCQkJc3RydWN0IGJ0cmZzX2l0ZW0gKml0ZW07CisJCQlpdGVtID0gYnRyZnNfaXRlbV9ucihsZWFmLCBzbG90KTsKKwkJCWV4dGVudF9lbmQgPSBmb3VuZF9rZXkub2Zmc2V0ICsKKwkJCSAgICAgYnRyZnNfZmlsZV9leHRlbnRfaW5saW5lX2xlbihsZWFmLCBleHRlbnQpOworCQkJZXh0ZW50X2VuZCA9IChleHRlbnRfZW5kICsgcm9vdC0+c2VjdG9yc2l6ZSAtIDEpICYKKwkJCQl+KCh1NjQpcm9vdC0+c2VjdG9yc2l6ZSAtIDEpOworCQl9CisJCWxhc3Rfb2Zmc2V0ID0gZXh0ZW50X2VuZDsKKwkJcGF0aC0+c2xvdHNbMF0rKzsKKwl9CisJaWYgKDAgJiYgbGFzdF9vZmZzZXQgPCBpbm9kZS0+aV9zaXplKSB7CisJCVdBUk5fT04oMSk7CisJCWJ0cmZzX3ByaW50X2xlYWYocm9vdCwgbGVhZik7CisJCXByaW50ayhLRVJOX0VSUiAiaW5vZGUgJWx1IGZvdW5kIG9mZnNldCAlbGx1IHNpemUgJWxsdVxuIiwKKwkJICAgICAgIGlub2RlLT5pX2lubywgKHVuc2lnbmVkIGxvbmcgbG9uZylsYXN0X29mZnNldCwKKwkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpaW5vZGUtPmlfc2l6ZSk7CisJCWVyciA9IDE7CisKKwl9CitvdXQ6CisJYnRyZnNfZnJlZV9wYXRoKHBhdGgpOworCXJldHVybiBlcnI7CisjZW5kaWYKK30KKworLyoKKyAqIHRoaXMgaXMgdmVyeSBjb21wbGV4LCBidXQgdGhlIGJhc2ljIGlkZWEgaXMgdG8gZHJvcCBhbGwgZXh0ZW50cworICogaW4gdGhlIHJhbmdlIHN0YXJ0IC0gZW5kLiAgaGludF9ibG9jayBpcyBmaWxsZWQgaW4gd2l0aCBhIGJsb2NrIG51bWJlcgorICogdGhhdCB3b3VsZCBiZSBhIGdvb2QgaGludCB0byB0aGUgYmxvY2sgYWxsb2NhdG9yIGZvciB0aGlzIGZpbGUuCisgKgorICogSWYgYW4gZXh0ZW50IGludGVyc2VjdHMgdGhlIHJhbmdlIGJ1dCBpcyBub3QgZW50aXJlbHkgaW5zaWRlIHRoZSByYW5nZQorICogaXQgaXMgZWl0aGVyIHRydW5jYXRlZCBvciBzcGxpdC4gIEFueXRoaW5nIGVudGlyZWx5IGluc2lkZSB0aGUgcmFuZ2UKKyAqIGlzIGRlbGV0ZWQgZnJvbSB0aGUgdHJlZS4KKyAqCisgKiBpbmxpbmVfbGltaXQgaXMgdXNlZCB0byB0ZWxsIHRoaXMgY29kZSB3aGljaCBvZmZzZXRzIGluIHRoZSBmaWxlIHRvIGtlZXAKKyAqIGlmIHRoZXkgY29udGFpbiBpbmxpbmUgZXh0ZW50cy4KKyAqLworbm9pbmxpbmUgaW50IGJ0cmZzX2Ryb3BfZXh0ZW50cyhzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKKwkJICAgICAgIHN0cnVjdCBidHJmc19yb290ICpyb290LCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkgICAgICAgdTY0IHN0YXJ0LCB1NjQgZW5kLCB1NjQgaW5saW5lX2xpbWl0LCB1NjQgKmhpbnRfYnl0ZSkKK3sKKwl1NjQgZXh0ZW50X2VuZCA9IDA7CisJdTY0IGxvY2tlZF9lbmQgPSBlbmQ7CisJdTY0IHNlYXJjaF9zdGFydCA9IHN0YXJ0OworCXU2NCBsZWFmX3N0YXJ0OworCXU2NCByYW1fYnl0ZXMgPSAwOworCXU2NCBvcmlnX3BhcmVudCA9IDA7CisJdTY0IGRpc2tfYnl0ZW5yID0gMDsKKwl1OCBjb21wcmVzc2lvbjsKKwl1OCBlbmNyeXB0aW9uOworCXUxNiBvdGhlcl9lbmNvZGluZyA9IDA7CisJdTY0IHJvb3RfZ2VuOworCXU2NCByb290X293bmVyOworCXN0cnVjdCBleHRlbnRfYnVmZmVyICpsZWFmOworCXN0cnVjdCBidHJmc19maWxlX2V4dGVudF9pdGVtICpleHRlbnQ7CisJc3RydWN0IGJ0cmZzX3BhdGggKnBhdGg7CisJc3RydWN0IGJ0cmZzX2tleSBrZXk7CisJc3RydWN0IGJ0cmZzX2ZpbGVfZXh0ZW50X2l0ZW0gb2xkOworCWludCBrZWVwOworCWludCBzbG90OworCWludCBib29rZW5kOworCWludCBmb3VuZF90eXBlID0gMDsKKwlpbnQgZm91bmRfZXh0ZW50OworCWludCBmb3VuZF9pbmxpbmU7CisJaW50IHJlY293OworCWludCByZXQ7CisKKwlpbmxpbmVfbGltaXQgPSAwOworCWJ0cmZzX2Ryb3BfZXh0ZW50X2NhY2hlKGlub2RlLCBzdGFydCwgZW5kIC0gMSwgMCk7CisKKwlwYXRoID0gYnRyZnNfYWxsb2NfcGF0aCgpOworCWlmICghcGF0aCkKKwkJcmV0dXJuIC1FTk9NRU07CisJd2hpbGUgKDEpIHsKKwkJcmVjb3cgPSAwOworCQlidHJmc19yZWxlYXNlX3BhdGgocm9vdCwgcGF0aCk7CisJCXJldCA9IGJ0cmZzX2xvb2t1cF9maWxlX2V4dGVudCh0cmFucywgcm9vdCwgcGF0aCwgaW5vZGUtPmlfaW5vLAorCQkJCQkgICAgICAgc2VhcmNoX3N0YXJ0LCAtMSk7CisJCWlmIChyZXQgPCAwKQorCQkJZ290byBvdXQ7CisJCWlmIChyZXQgPiAwKSB7CisJCQlpZiAocGF0aC0+c2xvdHNbMF0gPT0gMCkgeworCQkJCXJldCA9IDA7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCQlwYXRoLT5zbG90c1swXS0tOworCQl9CituZXh0X3Nsb3Q6CisJCWtlZXAgPSAwOworCQlib29rZW5kID0gMDsKKwkJZm91bmRfZXh0ZW50ID0gMDsKKwkJZm91bmRfaW5saW5lID0gMDsKKwkJbGVhZl9zdGFydCA9IDA7CisJCXJvb3RfZ2VuID0gMDsKKwkJcm9vdF9vd25lciA9IDA7CisJCWNvbXByZXNzaW9uID0gMDsKKwkJZW5jcnlwdGlvbiA9IDA7CisJCWV4dGVudCA9IE5VTEw7CisJCWxlYWYgPSBwYXRoLT5ub2Rlc1swXTsKKwkJc2xvdCA9IHBhdGgtPnNsb3RzWzBdOworCQlyZXQgPSAwOworCQlidHJmc19pdGVtX2tleV90b19jcHUobGVhZiwgJmtleSwgc2xvdCk7CisJCWlmIChidHJmc19rZXlfdHlwZSgma2V5KSA9PSBCVFJGU19FWFRFTlRfREFUQV9LRVkgJiYKKwkJICAgIGtleS5vZmZzZXQgPj0gZW5kKSB7CisJCQlnb3RvIG91dDsKKwkJfQorCQlpZiAoYnRyZnNfa2V5X3R5cGUoJmtleSkgPiBCVFJGU19FWFRFTlRfREFUQV9LRVkgfHwKKwkJICAgIGtleS5vYmplY3RpZCAhPSBpbm9kZS0+aV9pbm8pIHsKKwkJCWdvdG8gb3V0OworCQl9CisJCWlmIChyZWNvdykgeworCQkJc2VhcmNoX3N0YXJ0ID0gbWF4KGtleS5vZmZzZXQsIHN0YXJ0KTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChidHJmc19rZXlfdHlwZSgma2V5KSA9PSBCVFJGU19FWFRFTlRfREFUQV9LRVkpIHsKKwkJCWV4dGVudCA9IGJ0cmZzX2l0ZW1fcHRyKGxlYWYsIHNsb3QsCisJCQkJCQlzdHJ1Y3QgYnRyZnNfZmlsZV9leHRlbnRfaXRlbSk7CisJCQlmb3VuZF90eXBlID0gYnRyZnNfZmlsZV9leHRlbnRfdHlwZShsZWFmLCBleHRlbnQpOworCQkJY29tcHJlc3Npb24gPSBidHJmc19maWxlX2V4dGVudF9jb21wcmVzc2lvbihsZWFmLAorCQkJCQkJCQkgICAgZXh0ZW50KTsKKwkJCWVuY3J5cHRpb24gPSBidHJmc19maWxlX2V4dGVudF9lbmNyeXB0aW9uKGxlYWYsCisJCQkJCQkJCSAgZXh0ZW50KTsKKwkJCW90aGVyX2VuY29kaW5nID0gYnRyZnNfZmlsZV9leHRlbnRfb3RoZXJfZW5jb2RpbmcobGVhZiwKKwkJCQkJCQkJICBleHRlbnQpOworCQkJaWYgKGZvdW5kX3R5cGUgPT0gQlRSRlNfRklMRV9FWFRFTlRfUkVHIHx8CisJCQkgICAgZm91bmRfdHlwZSA9PSBCVFJGU19GSUxFX0VYVEVOVF9QUkVBTExPQykgeworCQkJCWV4dGVudF9lbmQgPQorCQkJCSAgICAgYnRyZnNfZmlsZV9leHRlbnRfZGlza19ieXRlbnIobGVhZiwKKwkJCQkJCQkJICAgZXh0ZW50KTsKKwkJCQlpZiAoZXh0ZW50X2VuZCkKKwkJCQkJKmhpbnRfYnl0ZSA9IGV4dGVudF9lbmQ7CisKKwkJCQlleHRlbnRfZW5kID0ga2V5Lm9mZnNldCArCisJCQkJICAgICBidHJmc19maWxlX2V4dGVudF9udW1fYnl0ZXMobGVhZiwgZXh0ZW50KTsKKwkJCQlyYW1fYnl0ZXMgPSBidHJmc19maWxlX2V4dGVudF9yYW1fYnl0ZXMobGVhZiwKKwkJCQkJCQkJZXh0ZW50KTsKKwkJCQlmb3VuZF9leHRlbnQgPSAxOworCQkJfSBlbHNlIGlmIChmb3VuZF90eXBlID09IEJUUkZTX0ZJTEVfRVhURU5UX0lOTElORSkgeworCQkJCWZvdW5kX2lubGluZSA9IDE7CisJCQkJZXh0ZW50X2VuZCA9IGtleS5vZmZzZXQgKworCQkJCSAgICAgYnRyZnNfZmlsZV9leHRlbnRfaW5saW5lX2xlbihsZWFmLCBleHRlbnQpOworCQkJfQorCQl9IGVsc2UgeworCQkJZXh0ZW50X2VuZCA9IHNlYXJjaF9zdGFydDsKKwkJfQorCisJCS8qIHdlIGZvdW5kIG5vdGhpbmcgd2UgY2FuIGRyb3AgKi8KKwkJaWYgKCghZm91bmRfZXh0ZW50ICYmICFmb3VuZF9pbmxpbmUpIHx8CisJCSAgICBzZWFyY2hfc3RhcnQgPj0gZXh0ZW50X2VuZCkgeworCQkJaW50IG5leHRyZXQ7CisJCQl1MzIgbnJpdGVtczsKKwkJCW5yaXRlbXMgPSBidHJmc19oZWFkZXJfbnJpdGVtcyhsZWFmKTsKKwkJCWlmIChzbG90ID49IG5yaXRlbXMgLSAxKSB7CisJCQkJbmV4dHJldCA9IGJ0cmZzX25leHRfbGVhZihyb290LCBwYXRoKTsKKwkJCQlpZiAobmV4dHJldCkKKwkJCQkJZ290byBvdXQ7CisJCQkJcmVjb3cgPSAxOworCQkJfSBlbHNlIHsKKwkJCQlwYXRoLT5zbG90c1swXSsrOworCQkJfQorCQkJZ290byBuZXh0X3Nsb3Q7CisJCX0KKworCQlpZiAoZW5kIDw9IGV4dGVudF9lbmQgJiYgc3RhcnQgPj0ga2V5Lm9mZnNldCAmJiBmb3VuZF9pbmxpbmUpCisJCQkqaGludF9ieXRlID0gRVhURU5UX01BUF9JTkxJTkU7CisKKwkJaWYgKGZvdW5kX2V4dGVudCkgeworCQkJcmVhZF9leHRlbnRfYnVmZmVyKGxlYWYsICZvbGQsICh1bnNpZ25lZCBsb25nKWV4dGVudCwKKwkJCQkJICAgc2l6ZW9mKG9sZCkpOworCQkJcm9vdF9nZW4gPSBidHJmc19oZWFkZXJfZ2VuZXJhdGlvbihsZWFmKTsKKwkJCXJvb3Rfb3duZXIgPSBidHJmc19oZWFkZXJfb3duZXIobGVhZik7CisJCQlsZWFmX3N0YXJ0ID0gbGVhZi0+c3RhcnQ7CisJCX0KKworCQlpZiAoZW5kIDwgZXh0ZW50X2VuZCAmJiBlbmQgPj0ga2V5Lm9mZnNldCkgeworCQkJYm9va2VuZCA9IDE7CisJCQlpZiAoZm91bmRfaW5saW5lICYmIHN0YXJ0IDw9IGtleS5vZmZzZXQpCisJCQkJa2VlcCA9IDE7CisJCX0KKworCQlpZiAoYm9va2VuZCAmJiBmb3VuZF9leHRlbnQpIHsKKwkJCWlmIChsb2NrZWRfZW5kIDwgZXh0ZW50X2VuZCkgeworCQkJCXJldCA9IHRyeV9sb2NrX2V4dGVudCgmQlRSRlNfSShpbm9kZSktPmlvX3RyZWUsCisJCQkJCQlsb2NrZWRfZW5kLCBleHRlbnRfZW5kIC0gMSwKKwkJCQkJCUdGUF9OT0ZTKTsKKwkJCQlpZiAoIXJldCkgeworCQkJCQlidHJmc19yZWxlYXNlX3BhdGgocm9vdCwgcGF0aCk7CisJCQkJCWxvY2tfZXh0ZW50KCZCVFJGU19JKGlub2RlKS0+aW9fdHJlZSwKKwkJCQkJCWxvY2tlZF9lbmQsIGV4dGVudF9lbmQgLSAxLAorCQkJCQkJR0ZQX05PRlMpOworCQkJCQlsb2NrZWRfZW5kID0gZXh0ZW50X2VuZDsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJCWxvY2tlZF9lbmQgPSBleHRlbnRfZW5kOworCQkJfQorCQkJb3JpZ19wYXJlbnQgPSBwYXRoLT5ub2Rlc1swXS0+c3RhcnQ7CisJCQlkaXNrX2J5dGVuciA9IGxlNjRfdG9fY3B1KG9sZC5kaXNrX2J5dGVucik7CisJCQlpZiAoZGlza19ieXRlbnIgIT0gMCkgeworCQkJCXJldCA9IGJ0cmZzX2luY19leHRlbnRfcmVmKHRyYW5zLCByb290LAorCQkJCQkgICBkaXNrX2J5dGVuciwKKwkJCQkJICAgbGU2NF90b19jcHUob2xkLmRpc2tfbnVtX2J5dGVzKSwKKwkJCQkJICAgb3JpZ19wYXJlbnQsIHJvb3QtPnJvb3Rfa2V5Lm9iamVjdGlkLAorCQkJCQkgICB0cmFucy0+dHJhbnNpZCwgaW5vZGUtPmlfaW5vKTsKKwkJCQlCVUdfT04ocmV0KTsKKwkJCX0KKwkJfQorCisJCWlmIChmb3VuZF9pbmxpbmUpIHsKKwkJCXU2NCBtYXNrID0gcm9vdC0+c2VjdG9yc2l6ZSAtIDE7CisJCQlzZWFyY2hfc3RhcnQgPSAoZXh0ZW50X2VuZCArIG1hc2spICYgfm1hc2s7CisJCX0gZWxzZQorCQkJc2VhcmNoX3N0YXJ0ID0gZXh0ZW50X2VuZDsKKworCQkvKiB0cnVuY2F0ZSBleGlzdGluZyBleHRlbnQgKi8KKwkJaWYgKHN0YXJ0ID4ga2V5Lm9mZnNldCkgeworCQkJdTY0IG5ld19udW07CisJCQl1NjQgb2xkX251bTsKKwkJCWtlZXAgPSAxOworCQkJV0FSTl9PTihzdGFydCAmIChyb290LT5zZWN0b3JzaXplIC0gMSkpOworCQkJaWYgKGZvdW5kX2V4dGVudCkgeworCQkJCW5ld19udW0gPSBzdGFydCAtIGtleS5vZmZzZXQ7CisJCQkJb2xkX251bSA9IGJ0cmZzX2ZpbGVfZXh0ZW50X251bV9ieXRlcyhsZWFmLAorCQkJCQkJCQkgICAgICBleHRlbnQpOworCQkJCSpoaW50X2J5dGUgPQorCQkJCQlidHJmc19maWxlX2V4dGVudF9kaXNrX2J5dGVucihsZWFmLAorCQkJCQkJCQkgICAgICBleHRlbnQpOworCQkJCWlmIChidHJmc19maWxlX2V4dGVudF9kaXNrX2J5dGVucihsZWFmLAorCQkJCQkJCQkgIGV4dGVudCkpIHsKKwkJCQkJaW5vZGVfc3ViX2J5dGVzKGlub2RlLCBvbGRfbnVtIC0KKwkJCQkJCQluZXdfbnVtKTsKKwkJCQl9CisJCQkJYnRyZnNfc2V0X2ZpbGVfZXh0ZW50X251bV9ieXRlcyhsZWFmLAorCQkJCQkJCWV4dGVudCwgbmV3X251bSk7CisJCQkJYnRyZnNfbWFya19idWZmZXJfZGlydHkobGVhZik7CisJCQl9IGVsc2UgaWYgKGtleS5vZmZzZXQgPCBpbmxpbmVfbGltaXQgJiYKKwkJCQkgICAoZW5kID4gZXh0ZW50X2VuZCkgJiYKKwkJCQkgICAoaW5saW5lX2xpbWl0IDwgZXh0ZW50X2VuZCkpIHsKKwkJCQl1MzIgbmV3X3NpemU7CisJCQkJbmV3X3NpemUgPSBidHJmc19maWxlX2V4dGVudF9jYWxjX2lubGluZV9zaXplKAorCQkJCQkJICAgaW5saW5lX2xpbWl0IC0ga2V5Lm9mZnNldCk7CisJCQkJaW5vZGVfc3ViX2J5dGVzKGlub2RlLCBleHRlbnRfZW5kIC0KKwkJCQkJCWlubGluZV9saW1pdCk7CisJCQkJYnRyZnNfc2V0X2ZpbGVfZXh0ZW50X3JhbV9ieXRlcyhsZWFmLCBleHRlbnQsCisJCQkJCQkJbmV3X3NpemUpOworCQkJCWlmICghY29tcHJlc3Npb24gJiYgIWVuY3J5cHRpb24pIHsKKwkJCQkJYnRyZnNfdHJ1bmNhdGVfaXRlbSh0cmFucywgcm9vdCwgcGF0aCwKKwkJCQkJCQkgICAgbmV3X3NpemUsIDEpOworCQkJCX0KKwkJCX0KKwkJfQorCQkvKiBkZWxldGUgdGhlIGVudGlyZSBleHRlbnQgKi8KKwkJaWYgKCFrZWVwKSB7CisJCQlpZiAoZm91bmRfaW5saW5lKQorCQkJCWlub2RlX3N1Yl9ieXRlcyhpbm9kZSwgZXh0ZW50X2VuZCAtCisJCQkJCQlrZXkub2Zmc2V0KTsKKwkJCXJldCA9IGJ0cmZzX2RlbF9pdGVtKHRyYW5zLCByb290LCBwYXRoKTsKKwkJCS8qIFRPRE8gdXBkYXRlIHByb2dyZXNzIG1hcmtlciBhbmQgcmV0dXJuICovCisJCQlCVUdfT04ocmV0KTsKKwkJCWV4dGVudCA9IE5VTEw7CisJCQlidHJmc19yZWxlYXNlX3BhdGgocm9vdCwgcGF0aCk7CisJCQkvKiB0aGUgZXh0ZW50IHdpbGwgYmUgZnJlZWQgbGF0ZXIgKi8KKwkJfQorCQlpZiAoYm9va2VuZCAmJiBmb3VuZF9pbmxpbmUgJiYgc3RhcnQgPD0ga2V5Lm9mZnNldCkgeworCQkJdTMyIG5ld19zaXplOworCQkJbmV3X3NpemUgPSBidHJmc19maWxlX2V4dGVudF9jYWxjX2lubGluZV9zaXplKAorCQkJCQkJICAgZXh0ZW50X2VuZCAtIGVuZCk7CisJCQlpbm9kZV9zdWJfYnl0ZXMoaW5vZGUsIGVuZCAtIGtleS5vZmZzZXQpOworCQkJYnRyZnNfc2V0X2ZpbGVfZXh0ZW50X3JhbV9ieXRlcyhsZWFmLCBleHRlbnQsCisJCQkJCQkJbmV3X3NpemUpOworCQkJaWYgKCFjb21wcmVzc2lvbiAmJiAhZW5jcnlwdGlvbikKKwkJCQlyZXQgPSBidHJmc190cnVuY2F0ZV9pdGVtKHRyYW5zLCByb290LCBwYXRoLAorCQkJCQkJCSAgbmV3X3NpemUsIDApOworCQkJQlVHX09OKHJldCk7CisJCX0KKwkJLyogY3JlYXRlIGJvb2tlbmQsIHNwbGl0dGluZyB0aGUgZXh0ZW50IGluIHR3byAqLworCQlpZiAoYm9va2VuZCAmJiBmb3VuZF9leHRlbnQpIHsKKwkJCXN0cnVjdCBidHJmc19rZXkgaW5zOworCQkJaW5zLm9iamVjdGlkID0gaW5vZGUtPmlfaW5vOworCQkJaW5zLm9mZnNldCA9IGVuZDsKKwkJCWJ0cmZzX3NldF9rZXlfdHlwZSgmaW5zLCBCVFJGU19FWFRFTlRfREFUQV9LRVkpOworCisJCQlidHJmc19yZWxlYXNlX3BhdGgocm9vdCwgcGF0aCk7CisJCQlyZXQgPSBidHJmc19pbnNlcnRfZW1wdHlfaXRlbSh0cmFucywgcm9vdCwgcGF0aCwgJmlucywKKwkJCQkJCSAgICAgIHNpemVvZigqZXh0ZW50KSk7CisJCQlCVUdfT04ocmV0KTsKKworCQkJbGVhZiA9IHBhdGgtPm5vZGVzWzBdOworCQkJZXh0ZW50ID0gYnRyZnNfaXRlbV9wdHIobGVhZiwgcGF0aC0+c2xvdHNbMF0sCisJCQkJCQlzdHJ1Y3QgYnRyZnNfZmlsZV9leHRlbnRfaXRlbSk7CisJCQl3cml0ZV9leHRlbnRfYnVmZmVyKGxlYWYsICZvbGQsCisJCQkJCSAgICAodW5zaWduZWQgbG9uZylleHRlbnQsIHNpemVvZihvbGQpKTsKKworCQkJYnRyZnNfc2V0X2ZpbGVfZXh0ZW50X2NvbXByZXNzaW9uKGxlYWYsIGV4dGVudCwKKwkJCQkJCQkgIGNvbXByZXNzaW9uKTsKKwkJCWJ0cmZzX3NldF9maWxlX2V4dGVudF9lbmNyeXB0aW9uKGxlYWYsIGV4dGVudCwKKwkJCQkJCQkgZW5jcnlwdGlvbik7CisJCQlidHJmc19zZXRfZmlsZV9leHRlbnRfb3RoZXJfZW5jb2RpbmcobGVhZiwgZXh0ZW50LAorCQkJCQkJCSAgICAgb3RoZXJfZW5jb2RpbmcpOworCQkJYnRyZnNfc2V0X2ZpbGVfZXh0ZW50X29mZnNldChsZWFmLCBleHRlbnQsCisJCQkJICAgIGxlNjRfdG9fY3B1KG9sZC5vZmZzZXQpICsgZW5kIC0ga2V5Lm9mZnNldCk7CisJCQlXQVJOX09OKGxlNjRfdG9fY3B1KG9sZC5udW1fYnl0ZXMpIDwKKwkJCQkoZXh0ZW50X2VuZCAtIGVuZCkpOworCQkJYnRyZnNfc2V0X2ZpbGVfZXh0ZW50X251bV9ieXRlcyhsZWFmLCBleHRlbnQsCisJCQkJCQkJZXh0ZW50X2VuZCAtIGVuZCk7CisKKwkJCS8qCisJCQkgKiBzZXQgdGhlIHJhbSBieXRlcyB0byB0aGUgc2l6ZSBvZiB0aGUgZnVsbCBleHRlbnQKKwkJCSAqIGJlZm9yZSBzcGxpdHRpbmcuICBUaGlzIGlzIGEgd29yc3QgY2FzZSBmbGFnLAorCQkJICogYnV0IGl0cyB0aGUgYmVzdCB3ZSBjYW4gZG8gYmVjYXVzZSB3ZSBkb24ndCBrbm93CisJCQkgKiBob3cgc3BsaXR0aW5nIGFmZmVjdHMgY29tcHJlc3Npb24KKwkJCSAqLworCQkJYnRyZnNfc2V0X2ZpbGVfZXh0ZW50X3JhbV9ieXRlcyhsZWFmLCBleHRlbnQsCisJCQkJCQkJcmFtX2J5dGVzKTsKKwkJCWJ0cmZzX3NldF9maWxlX2V4dGVudF90eXBlKGxlYWYsIGV4dGVudCwgZm91bmRfdHlwZSk7CisKKwkJCWJ0cmZzX21hcmtfYnVmZmVyX2RpcnR5KHBhdGgtPm5vZGVzWzBdKTsKKworCQkJaWYgKGRpc2tfYnl0ZW5yICE9IDApIHsKKwkJCQlyZXQgPSBidHJmc191cGRhdGVfZXh0ZW50X3JlZih0cmFucywgcm9vdCwKKwkJCQkJCWRpc2tfYnl0ZW5yLCBvcmlnX3BhcmVudCwKKwkJCQkJCWxlYWYtPnN0YXJ0LAorCQkJCQkJcm9vdC0+cm9vdF9rZXkub2JqZWN0aWQsCisJCQkJCQl0cmFucy0+dHJhbnNpZCwgaW5zLm9iamVjdGlkKTsKKworCQkJCUJVR19PTihyZXQpOworCQkJfQorCQkJYnRyZnNfcmVsZWFzZV9wYXRoKHJvb3QsIHBhdGgpOworCQkJaWYgKGRpc2tfYnl0ZW5yICE9IDApCisJCQkJaW5vZGVfYWRkX2J5dGVzKGlub2RlLCBleHRlbnRfZW5kIC0gZW5kKTsKKwkJfQorCisJCWlmIChmb3VuZF9leHRlbnQgJiYgIWtlZXApIHsKKwkJCXU2NCBvbGRfZGlza19ieXRlbnIgPSBsZTY0X3RvX2NwdShvbGQuZGlza19ieXRlbnIpOworCisJCQlpZiAob2xkX2Rpc2tfYnl0ZW5yICE9IDApIHsKKwkJCQlpbm9kZV9zdWJfYnl0ZXMoaW5vZGUsCisJCQkJCQlsZTY0X3RvX2NwdShvbGQubnVtX2J5dGVzKSk7CisJCQkJcmV0ID0gYnRyZnNfZnJlZV9leHRlbnQodHJhbnMsIHJvb3QsCisJCQkJCQlvbGRfZGlza19ieXRlbnIsCisJCQkJCQlsZTY0X3RvX2NwdShvbGQuZGlza19udW1fYnl0ZXMpLAorCQkJCQkJbGVhZl9zdGFydCwgcm9vdF9vd25lciwKKwkJCQkJCXJvb3RfZ2VuLCBrZXkub2JqZWN0aWQsIDApOworCQkJCUJVR19PTihyZXQpOworCQkJCSpoaW50X2J5dGUgPSBvbGRfZGlza19ieXRlbnI7CisJCQl9CisJCX0KKworCQlpZiAoc2VhcmNoX3N0YXJ0ID49IGVuZCkgeworCQkJcmV0ID0gMDsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorb3V0OgorCWJ0cmZzX2ZyZWVfcGF0aChwYXRoKTsKKwlpZiAobG9ja2VkX2VuZCA+IGVuZCkgeworCQl1bmxvY2tfZXh0ZW50KCZCVFJGU19JKGlub2RlKS0+aW9fdHJlZSwgZW5kLCBsb2NrZWRfZW5kIC0gMSwKKwkJCSAgICAgIEdGUF9OT0ZTKTsKKwl9CisJYnRyZnNfY2hlY2tfZmlsZShyb290LCBpbm9kZSk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBleHRlbnRfbWVyZ2VhYmxlKHN0cnVjdCBleHRlbnRfYnVmZmVyICpsZWFmLCBpbnQgc2xvdCwKKwkJCSAgICB1NjQgb2JqZWN0aWQsIHU2NCBieXRlbnIsIHU2NCAqc3RhcnQsIHU2NCAqZW5kKQoreworCXN0cnVjdCBidHJmc19maWxlX2V4dGVudF9pdGVtICpmaTsKKwlzdHJ1Y3QgYnRyZnNfa2V5IGtleTsKKwl1NjQgZXh0ZW50X2VuZDsKKworCWlmIChzbG90IDwgMCB8fCBzbG90ID49IGJ0cmZzX2hlYWRlcl9ucml0ZW1zKGxlYWYpKQorCQlyZXR1cm4gMDsKKworCWJ0cmZzX2l0ZW1fa2V5X3RvX2NwdShsZWFmLCAma2V5LCBzbG90KTsKKwlpZiAoa2V5Lm9iamVjdGlkICE9IG9iamVjdGlkIHx8IGtleS50eXBlICE9IEJUUkZTX0VYVEVOVF9EQVRBX0tFWSkKKwkJcmV0dXJuIDA7CisKKwlmaSA9IGJ0cmZzX2l0ZW1fcHRyKGxlYWYsIHNsb3QsIHN0cnVjdCBidHJmc19maWxlX2V4dGVudF9pdGVtKTsKKwlpZiAoYnRyZnNfZmlsZV9leHRlbnRfdHlwZShsZWFmLCBmaSkgIT0gQlRSRlNfRklMRV9FWFRFTlRfUkVHIHx8CisJICAgIGJ0cmZzX2ZpbGVfZXh0ZW50X2Rpc2tfYnl0ZW5yKGxlYWYsIGZpKSAhPSBieXRlbnIgfHwKKwkgICAgYnRyZnNfZmlsZV9leHRlbnRfY29tcHJlc3Npb24obGVhZiwgZmkpIHx8CisJICAgIGJ0cmZzX2ZpbGVfZXh0ZW50X2VuY3J5cHRpb24obGVhZiwgZmkpIHx8CisJICAgIGJ0cmZzX2ZpbGVfZXh0ZW50X290aGVyX2VuY29kaW5nKGxlYWYsIGZpKSkKKwkJcmV0dXJuIDA7CisKKwlleHRlbnRfZW5kID0ga2V5Lm9mZnNldCArIGJ0cmZzX2ZpbGVfZXh0ZW50X251bV9ieXRlcyhsZWFmLCBmaSk7CisJaWYgKCgqc3RhcnQgJiYgKnN0YXJ0ICE9IGtleS5vZmZzZXQpIHx8ICgqZW5kICYmICplbmQgIT0gZXh0ZW50X2VuZCkpCisJCXJldHVybiAwOworCisJKnN0YXJ0ID0ga2V5Lm9mZnNldDsKKwkqZW5kID0gZXh0ZW50X2VuZDsKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIE1hcmsgZXh0ZW50IGluIHRoZSByYW5nZSBzdGFydCAtIGVuZCBhcyB3cml0dGVuLgorICoKKyAqIFRoaXMgY2hhbmdlcyBleHRlbnQgdHlwZSBmcm9tICdwcmUtYWxsb2NhdGVkJyB0byAncmVndWxhcicuIElmIG9ubHkKKyAqIHBhcnQgb2YgZXh0ZW50IGlzIG1hcmtlZCBhcyB3cml0dGVuLCB0aGUgZXh0ZW50IHdpbGwgYmUgc3BsaXQgaW50bworICogdHdvIG9yIHRocmVlLgorICovCitpbnQgYnRyZnNfbWFya19leHRlbnRfd3JpdHRlbihzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKKwkJCSAgICAgIHN0cnVjdCBidHJmc19yb290ICpyb290LAorCQkJICAgICAgc3RydWN0IGlub2RlICppbm9kZSwgdTY0IHN0YXJ0LCB1NjQgZW5kKQoreworCXN0cnVjdCBleHRlbnRfYnVmZmVyICpsZWFmOworCXN0cnVjdCBidHJmc19wYXRoICpwYXRoOworCXN0cnVjdCBidHJmc19maWxlX2V4dGVudF9pdGVtICpmaTsKKwlzdHJ1Y3QgYnRyZnNfa2V5IGtleTsKKwl1NjQgYnl0ZW5yOworCXU2NCBudW1fYnl0ZXM7CisJdTY0IGV4dGVudF9lbmQ7CisJdTY0IGV4dGVudF9vZmZzZXQ7CisJdTY0IG90aGVyX3N0YXJ0OworCXU2NCBvdGhlcl9lbmQ7CisJdTY0IHNwbGl0ID0gc3RhcnQ7CisJdTY0IGxvY2tlZF9lbmQgPSBlbmQ7CisJdTY0IG9yaWdfcGFyZW50OworCWludCBleHRlbnRfdHlwZTsKKwlpbnQgc3BsaXRfZW5kID0gMTsKKwlpbnQgcmV0OworCisJYnRyZnNfZHJvcF9leHRlbnRfY2FjaGUoaW5vZGUsIHN0YXJ0LCBlbmQgLSAxLCAwKTsKKworCXBhdGggPSBidHJmc19hbGxvY19wYXRoKCk7CisJQlVHX09OKCFwYXRoKTsKK2FnYWluOgorCWtleS5vYmplY3RpZCA9IGlub2RlLT5pX2lubzsKKwlrZXkudHlwZSA9IEJUUkZTX0VYVEVOVF9EQVRBX0tFWTsKKwlpZiAoc3BsaXQgPT0gc3RhcnQpCisJCWtleS5vZmZzZXQgPSBzcGxpdDsKKwllbHNlCisJCWtleS5vZmZzZXQgPSBzcGxpdCAtIDE7CisKKwlyZXQgPSBidHJmc19zZWFyY2hfc2xvdCh0cmFucywgcm9vdCwgJmtleSwgcGF0aCwgLTEsIDEpOworCWlmIChyZXQgPiAwICYmIHBhdGgtPnNsb3RzWzBdID4gMCkKKwkJcGF0aC0+c2xvdHNbMF0tLTsKKworCWxlYWYgPSBwYXRoLT5ub2Rlc1swXTsKKwlidHJmc19pdGVtX2tleV90b19jcHUobGVhZiwgJmtleSwgcGF0aC0+c2xvdHNbMF0pOworCUJVR19PTihrZXkub2JqZWN0aWQgIT0gaW5vZGUtPmlfaW5vIHx8CisJICAgICAgIGtleS50eXBlICE9IEJUUkZTX0VYVEVOVF9EQVRBX0tFWSk7CisJZmkgPSBidHJmc19pdGVtX3B0cihsZWFmLCBwYXRoLT5zbG90c1swXSwKKwkJCSAgICBzdHJ1Y3QgYnRyZnNfZmlsZV9leHRlbnRfaXRlbSk7CisJZXh0ZW50X3R5cGUgPSBidHJmc19maWxlX2V4dGVudF90eXBlKGxlYWYsIGZpKTsKKwlCVUdfT04oZXh0ZW50X3R5cGUgIT0gQlRSRlNfRklMRV9FWFRFTlRfUFJFQUxMT0MpOworCWV4dGVudF9lbmQgPSBrZXkub2Zmc2V0ICsgYnRyZnNfZmlsZV9leHRlbnRfbnVtX2J5dGVzKGxlYWYsIGZpKTsKKwlCVUdfT04oa2V5Lm9mZnNldCA+IHN0YXJ0IHx8IGV4dGVudF9lbmQgPCBlbmQpOworCisJYnl0ZW5yID0gYnRyZnNfZmlsZV9leHRlbnRfZGlza19ieXRlbnIobGVhZiwgZmkpOworCW51bV9ieXRlcyA9IGJ0cmZzX2ZpbGVfZXh0ZW50X2Rpc2tfbnVtX2J5dGVzKGxlYWYsIGZpKTsKKwlleHRlbnRfb2Zmc2V0ID0gYnRyZnNfZmlsZV9leHRlbnRfb2Zmc2V0KGxlYWYsIGZpKTsKKworCWlmIChrZXkub2Zmc2V0ID09IHN0YXJ0KQorCQlzcGxpdCA9IGVuZDsKKworCWlmIChrZXkub2Zmc2V0ID09IHN0YXJ0ICYmIGV4dGVudF9lbmQgPT0gZW5kKSB7CisJCWludCBkZWxfbnIgPSAwOworCQlpbnQgZGVsX3Nsb3QgPSAwOworCQl1NjQgbGVhZl9vd25lciA9IGJ0cmZzX2hlYWRlcl9vd25lcihsZWFmKTsKKwkJdTY0IGxlYWZfZ2VuID0gYnRyZnNfaGVhZGVyX2dlbmVyYXRpb24obGVhZik7CisJCW90aGVyX3N0YXJ0ID0gZW5kOworCQlvdGhlcl9lbmQgPSAwOworCQlpZiAoZXh0ZW50X21lcmdlYWJsZShsZWFmLCBwYXRoLT5zbG90c1swXSArIDEsIGlub2RlLT5pX2lubywKKwkJCQkgICAgIGJ5dGVuciwgJm90aGVyX3N0YXJ0LCAmb3RoZXJfZW5kKSkgeworCQkJZXh0ZW50X2VuZCA9IG90aGVyX2VuZDsKKwkJCWRlbF9zbG90ID0gcGF0aC0+c2xvdHNbMF0gKyAxOworCQkJZGVsX25yKys7CisJCQlyZXQgPSBidHJmc19mcmVlX2V4dGVudCh0cmFucywgcm9vdCwgYnl0ZW5yLCBudW1fYnl0ZXMsCisJCQkJCQlsZWFmLT5zdGFydCwgbGVhZl9vd25lciwKKwkJCQkJCWxlYWZfZ2VuLCBpbm9kZS0+aV9pbm8sIDApOworCQkJQlVHX09OKHJldCk7CisJCX0KKwkJb3RoZXJfc3RhcnQgPSAwOworCQlvdGhlcl9lbmQgPSBzdGFydDsKKwkJaWYgKGV4dGVudF9tZXJnZWFibGUobGVhZiwgcGF0aC0+c2xvdHNbMF0gLSAxLCBpbm9kZS0+aV9pbm8sCisJCQkJICAgICBieXRlbnIsICZvdGhlcl9zdGFydCwgJm90aGVyX2VuZCkpIHsKKwkJCWtleS5vZmZzZXQgPSBvdGhlcl9zdGFydDsKKwkJCWRlbF9zbG90ID0gcGF0aC0+c2xvdHNbMF07CisJCQlkZWxfbnIrKzsKKwkJCXJldCA9IGJ0cmZzX2ZyZWVfZXh0ZW50KHRyYW5zLCByb290LCBieXRlbnIsIG51bV9ieXRlcywKKwkJCQkJCWxlYWYtPnN0YXJ0LCBsZWFmX293bmVyLAorCQkJCQkJbGVhZl9nZW4sIGlub2RlLT5pX2lubywgMCk7CisJCQlCVUdfT04ocmV0KTsKKwkJfQorCQlzcGxpdF9lbmQgPSAwOworCQlpZiAoZGVsX25yID09IDApIHsKKwkJCWJ0cmZzX3NldF9maWxlX2V4dGVudF90eXBlKGxlYWYsIGZpLAorCQkJCQkJICAgQlRSRlNfRklMRV9FWFRFTlRfUkVHKTsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCisJCWZpID0gYnRyZnNfaXRlbV9wdHIobGVhZiwgZGVsX3Nsb3QgLSAxLAorCQkJCSAgICBzdHJ1Y3QgYnRyZnNfZmlsZV9leHRlbnRfaXRlbSk7CisJCWJ0cmZzX3NldF9maWxlX2V4dGVudF90eXBlKGxlYWYsIGZpLCBCVFJGU19GSUxFX0VYVEVOVF9SRUcpOworCQlidHJmc19zZXRfZmlsZV9leHRlbnRfbnVtX2J5dGVzKGxlYWYsIGZpLAorCQkJCQkJZXh0ZW50X2VuZCAtIGtleS5vZmZzZXQpOworCQlidHJmc19tYXJrX2J1ZmZlcl9kaXJ0eShsZWFmKTsKKworCQlyZXQgPSBidHJmc19kZWxfaXRlbXModHJhbnMsIHJvb3QsIHBhdGgsIGRlbF9zbG90LCBkZWxfbnIpOworCQlCVUdfT04ocmV0KTsKKwkJZ290byBkb25lOworCX0gZWxzZSBpZiAoc3BsaXQgPT0gc3RhcnQpIHsKKwkJaWYgKGxvY2tlZF9lbmQgPCBleHRlbnRfZW5kKSB7CisJCQlyZXQgPSB0cnlfbG9ja19leHRlbnQoJkJUUkZTX0koaW5vZGUpLT5pb190cmVlLAorCQkJCQlsb2NrZWRfZW5kLCBleHRlbnRfZW5kIC0gMSwgR0ZQX05PRlMpOworCQkJaWYgKCFyZXQpIHsKKwkJCQlidHJmc19yZWxlYXNlX3BhdGgocm9vdCwgcGF0aCk7CisJCQkJbG9ja19leHRlbnQoJkJUUkZTX0koaW5vZGUpLT5pb190cmVlLAorCQkJCQlsb2NrZWRfZW5kLCBleHRlbnRfZW5kIC0gMSwgR0ZQX05PRlMpOworCQkJCWxvY2tlZF9lbmQgPSBleHRlbnRfZW5kOworCQkJCWdvdG8gYWdhaW47CisJCQl9CisJCQlsb2NrZWRfZW5kID0gZXh0ZW50X2VuZDsKKwkJfQorCQlidHJmc19zZXRfZmlsZV9leHRlbnRfbnVtX2J5dGVzKGxlYWYsIGZpLCBzcGxpdCAtIGtleS5vZmZzZXQpOworCQlleHRlbnRfb2Zmc2V0ICs9IHNwbGl0IC0ga2V5Lm9mZnNldDsKKwl9IGVsc2UgIHsKKwkJQlVHX09OKGtleS5vZmZzZXQgIT0gc3RhcnQpOworCQlidHJmc19zZXRfZmlsZV9leHRlbnRfb2Zmc2V0KGxlYWYsIGZpLCBleHRlbnRfb2Zmc2V0ICsKKwkJCQkJICAgICBzcGxpdCAtIGtleS5vZmZzZXQpOworCQlidHJmc19zZXRfZmlsZV9leHRlbnRfbnVtX2J5dGVzKGxlYWYsIGZpLCBleHRlbnRfZW5kIC0gc3BsaXQpOworCQlrZXkub2Zmc2V0ID0gc3BsaXQ7CisJCWJ0cmZzX3NldF9pdGVtX2tleV9zYWZlKHRyYW5zLCByb290LCBwYXRoLCAma2V5KTsKKwkJZXh0ZW50X2VuZCA9IHNwbGl0OworCX0KKworCWlmIChleHRlbnRfZW5kID09IGVuZCkgeworCQlzcGxpdF9lbmQgPSAwOworCQlleHRlbnRfdHlwZSA9IEJUUkZTX0ZJTEVfRVhURU5UX1JFRzsKKwl9CisJaWYgKGV4dGVudF9lbmQgPT0gZW5kICYmIHNwbGl0ID09IHN0YXJ0KSB7CisJCW90aGVyX3N0YXJ0ID0gZW5kOworCQlvdGhlcl9lbmQgPSAwOworCQlpZiAoZXh0ZW50X21lcmdlYWJsZShsZWFmLCBwYXRoLT5zbG90c1swXSArIDEsIGlub2RlLT5pX2lubywKKwkJCQkgICAgIGJ5dGVuciwgJm90aGVyX3N0YXJ0LCAmb3RoZXJfZW5kKSkgeworCQkJcGF0aC0+c2xvdHNbMF0rKzsKKwkJCWZpID0gYnRyZnNfaXRlbV9wdHIobGVhZiwgcGF0aC0+c2xvdHNbMF0sCisJCQkJCSAgICBzdHJ1Y3QgYnRyZnNfZmlsZV9leHRlbnRfaXRlbSk7CisJCQlrZXkub2Zmc2V0ID0gc3BsaXQ7CisJCQlidHJmc19zZXRfaXRlbV9rZXlfc2FmZSh0cmFucywgcm9vdCwgcGF0aCwgJmtleSk7CisJCQlidHJmc19zZXRfZmlsZV9leHRlbnRfb2Zmc2V0KGxlYWYsIGZpLCBleHRlbnRfb2Zmc2V0KTsKKwkJCWJ0cmZzX3NldF9maWxlX2V4dGVudF9udW1fYnl0ZXMobGVhZiwgZmksCisJCQkJCQkJb3RoZXJfZW5kIC0gc3BsaXQpOworCQkJZ290byBkb25lOworCQl9CisJfQorCWlmIChleHRlbnRfZW5kID09IGVuZCAmJiBzcGxpdCA9PSBlbmQpIHsKKwkJb3RoZXJfc3RhcnQgPSAwOworCQlvdGhlcl9lbmQgPSBzdGFydDsKKwkJaWYgKGV4dGVudF9tZXJnZWFibGUobGVhZiwgcGF0aC0+c2xvdHNbMF0gLSAxICwgaW5vZGUtPmlfaW5vLAorCQkJCSAgICAgYnl0ZW5yLCAmb3RoZXJfc3RhcnQsICZvdGhlcl9lbmQpKSB7CisJCQlwYXRoLT5zbG90c1swXS0tOworCQkJZmkgPSBidHJmc19pdGVtX3B0cihsZWFmLCBwYXRoLT5zbG90c1swXSwKKwkJCQkJICAgIHN0cnVjdCBidHJmc19maWxlX2V4dGVudF9pdGVtKTsKKwkJCWJ0cmZzX3NldF9maWxlX2V4dGVudF9udW1fYnl0ZXMobGVhZiwgZmksIGV4dGVudF9lbmQgLQorCQkJCQkJCW90aGVyX3N0YXJ0KTsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCX0KKworCWJ0cmZzX21hcmtfYnVmZmVyX2RpcnR5KGxlYWYpOworCisJb3JpZ19wYXJlbnQgPSBsZWFmLT5zdGFydDsKKwlyZXQgPSBidHJmc19pbmNfZXh0ZW50X3JlZih0cmFucywgcm9vdCwgYnl0ZW5yLCBudW1fYnl0ZXMsCisJCQkJICAgb3JpZ19wYXJlbnQsIHJvb3QtPnJvb3Rfa2V5Lm9iamVjdGlkLAorCQkJCSAgIHRyYW5zLT50cmFuc2lkLCBpbm9kZS0+aV9pbm8pOworCUJVR19PTihyZXQpOworCWJ0cmZzX3JlbGVhc2VfcGF0aChyb290LCBwYXRoKTsKKworCWtleS5vZmZzZXQgPSBzdGFydDsKKwlyZXQgPSBidHJmc19pbnNlcnRfZW1wdHlfaXRlbSh0cmFucywgcm9vdCwgcGF0aCwgJmtleSwgc2l6ZW9mKCpmaSkpOworCUJVR19PTihyZXQpOworCisJbGVhZiA9IHBhdGgtPm5vZGVzWzBdOworCWZpID0gYnRyZnNfaXRlbV9wdHIobGVhZiwgcGF0aC0+c2xvdHNbMF0sCisJCQkgICAgc3RydWN0IGJ0cmZzX2ZpbGVfZXh0ZW50X2l0ZW0pOworCWJ0cmZzX3NldF9maWxlX2V4dGVudF9nZW5lcmF0aW9uKGxlYWYsIGZpLCB0cmFucy0+dHJhbnNpZCk7CisJYnRyZnNfc2V0X2ZpbGVfZXh0ZW50X3R5cGUobGVhZiwgZmksIGV4dGVudF90eXBlKTsKKwlidHJmc19zZXRfZmlsZV9leHRlbnRfZGlza19ieXRlbnIobGVhZiwgZmksIGJ5dGVucik7CisJYnRyZnNfc2V0X2ZpbGVfZXh0ZW50X2Rpc2tfbnVtX2J5dGVzKGxlYWYsIGZpLCBudW1fYnl0ZXMpOworCWJ0cmZzX3NldF9maWxlX2V4dGVudF9vZmZzZXQobGVhZiwgZmksIGV4dGVudF9vZmZzZXQpOworCWJ0cmZzX3NldF9maWxlX2V4dGVudF9udW1fYnl0ZXMobGVhZiwgZmksIGV4dGVudF9lbmQgLSBrZXkub2Zmc2V0KTsKKwlidHJmc19zZXRfZmlsZV9leHRlbnRfcmFtX2J5dGVzKGxlYWYsIGZpLCBudW1fYnl0ZXMpOworCWJ0cmZzX3NldF9maWxlX2V4dGVudF9jb21wcmVzc2lvbihsZWFmLCBmaSwgMCk7CisJYnRyZnNfc2V0X2ZpbGVfZXh0ZW50X2VuY3J5cHRpb24obGVhZiwgZmksIDApOworCWJ0cmZzX3NldF9maWxlX2V4dGVudF9vdGhlcl9lbmNvZGluZyhsZWFmLCBmaSwgMCk7CisKKwlpZiAob3JpZ19wYXJlbnQgIT0gbGVhZi0+c3RhcnQpIHsKKwkJcmV0ID0gYnRyZnNfdXBkYXRlX2V4dGVudF9yZWYodHJhbnMsIHJvb3QsIGJ5dGVuciwKKwkJCQkJICAgICAgb3JpZ19wYXJlbnQsIGxlYWYtPnN0YXJ0LAorCQkJCQkgICAgICByb290LT5yb290X2tleS5vYmplY3RpZCwKKwkJCQkJICAgICAgdHJhbnMtPnRyYW5zaWQsIGlub2RlLT5pX2lubyk7CisJCUJVR19PTihyZXQpOworCX0KK2RvbmU6CisJYnRyZnNfbWFya19idWZmZXJfZGlydHkobGVhZik7CisJYnRyZnNfcmVsZWFzZV9wYXRoKHJvb3QsIHBhdGgpOworCWlmIChzcGxpdF9lbmQgJiYgc3BsaXQgPT0gc3RhcnQpIHsKKwkJc3BsaXQgPSBlbmQ7CisJCWdvdG8gYWdhaW47CisJfQorCWlmIChsb2NrZWRfZW5kID4gZW5kKSB7CisJCXVubG9ja19leHRlbnQoJkJUUkZTX0koaW5vZGUpLT5pb190cmVlLCBlbmQsIGxvY2tlZF9lbmQgLSAxLAorCQkJICAgICAgR0ZQX05PRlMpOworCX0KKwlidHJmc19mcmVlX3BhdGgocGF0aCk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiB0aGlzIGdldHMgcGFnZXMgaW50byB0aGUgcGFnZSBjYWNoZSBhbmQgbG9ja3MgdGhlbSBkb3duLCBpdCBhbHNvIHByb3Blcmx5CisgKiB3YWl0cyBmb3IgZGF0YT1vcmRlcmVkIGV4dGVudHMgdG8gZmluaXNoIGJlZm9yZSBhbGxvd2luZyB0aGUgcGFnZXMgdG8gYmUKKyAqIG1vZGlmaWVkLgorICovCitzdGF0aWMgbm9pbmxpbmUgaW50IHByZXBhcmVfcGFnZXMoc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsIHN0cnVjdCBmaWxlICpmaWxlLAorCQkJIHN0cnVjdCBwYWdlICoqcGFnZXMsIHNpemVfdCBudW1fcGFnZXMsCisJCQkgbG9mZl90IHBvcywgdW5zaWduZWQgbG9uZyBmaXJzdF9pbmRleCwKKwkJCSB1bnNpZ25lZCBsb25nIGxhc3RfaW5kZXgsIHNpemVfdCB3cml0ZV9ieXRlcykKK3sKKwlpbnQgaTsKKwl1bnNpZ25lZCBsb25nIGluZGV4ID0gcG9zID4+IFBBR0VfQ0FDSEVfU0hJRlQ7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGZkZW50cnkoZmlsZSktPmRfaW5vZGU7CisJaW50IGVyciA9IDA7CisJdTY0IHN0YXJ0X3BvczsKKwl1NjQgbGFzdF9wb3M7CisKKwlzdGFydF9wb3MgPSBwb3MgJiB+KCh1NjQpcm9vdC0+c2VjdG9yc2l6ZSAtIDEpOworCWxhc3RfcG9zID0gKCh1NjQpaW5kZXggKyBudW1fcGFnZXMpIDw8IFBBR0VfQ0FDSEVfU0hJRlQ7CisKKwlpZiAoc3RhcnRfcG9zID4gaW5vZGUtPmlfc2l6ZSkgeworCQllcnIgPSBidHJmc19jb250X2V4cGFuZChpbm9kZSwgc3RhcnRfcG9zKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisJfQorCisJbWVtc2V0KHBhZ2VzLCAwLCBudW1fcGFnZXMgKiBzaXplb2Yoc3RydWN0IHBhZ2UgKikpOworYWdhaW46CisJZm9yIChpID0gMDsgaSA8IG51bV9wYWdlczsgaSsrKSB7CisJCXBhZ2VzW2ldID0gZ3JhYl9jYWNoZV9wYWdlKGlub2RlLT5pX21hcHBpbmcsIGluZGV4ICsgaSk7CisJCWlmICghcGFnZXNbaV0pIHsKKwkJCWVyciA9IC1FTk9NRU07CisJCQlCVUdfT04oMSk7CisJCX0KKwkJd2FpdF9vbl9wYWdlX3dyaXRlYmFjayhwYWdlc1tpXSk7CisJfQorCWlmIChzdGFydF9wb3MgPCBpbm9kZS0+aV9zaXplKSB7CisJCXN0cnVjdCBidHJmc19vcmRlcmVkX2V4dGVudCAqb3JkZXJlZDsKKwkJbG9ja19leHRlbnQoJkJUUkZTX0koaW5vZGUpLT5pb190cmVlLAorCQkJICAgIHN0YXJ0X3BvcywgbGFzdF9wb3MgLSAxLCBHRlBfTk9GUyk7CisJCW9yZGVyZWQgPSBidHJmc19sb29rdXBfZmlyc3Rfb3JkZXJlZF9leHRlbnQoaW5vZGUsCisJCQkJCQkJICAgIGxhc3RfcG9zIC0gMSk7CisJCWlmIChvcmRlcmVkICYmCisJCSAgICBvcmRlcmVkLT5maWxlX29mZnNldCArIG9yZGVyZWQtPmxlbiA+IHN0YXJ0X3BvcyAmJgorCQkgICAgb3JkZXJlZC0+ZmlsZV9vZmZzZXQgPCBsYXN0X3BvcykgeworCQkJYnRyZnNfcHV0X29yZGVyZWRfZXh0ZW50KG9yZGVyZWQpOworCQkJdW5sb2NrX2V4dGVudCgmQlRSRlNfSShpbm9kZSktPmlvX3RyZWUsCisJCQkJICAgICAgc3RhcnRfcG9zLCBsYXN0X3BvcyAtIDEsIEdGUF9OT0ZTKTsKKwkJCWZvciAoaSA9IDA7IGkgPCBudW1fcGFnZXM7IGkrKykgeworCQkJCXVubG9ja19wYWdlKHBhZ2VzW2ldKTsKKwkJCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZXNbaV0pOworCQkJfQorCQkJYnRyZnNfd2FpdF9vcmRlcmVkX3JhbmdlKGlub2RlLCBzdGFydF9wb3MsCisJCQkJCQkgbGFzdF9wb3MgLSBzdGFydF9wb3MpOworCQkJZ290byBhZ2FpbjsKKwkJfQorCQlpZiAob3JkZXJlZCkKKwkJCWJ0cmZzX3B1dF9vcmRlcmVkX2V4dGVudChvcmRlcmVkKTsKKworCQljbGVhcl9leHRlbnRfYml0cygmQlRSRlNfSShpbm9kZSktPmlvX3RyZWUsIHN0YXJ0X3BvcywKKwkJCQkgIGxhc3RfcG9zIC0gMSwgRVhURU5UX0RJUlRZIHwgRVhURU5UX0RFTEFMTE9DLAorCQkJCSAgR0ZQX05PRlMpOworCQl1bmxvY2tfZXh0ZW50KCZCVFJGU19JKGlub2RlKS0+aW9fdHJlZSwKKwkJCSAgICAgIHN0YXJ0X3BvcywgbGFzdF9wb3MgLSAxLCBHRlBfTk9GUyk7CisJfQorCWZvciAoaSA9IDA7IGkgPCBudW1fcGFnZXM7IGkrKykgeworCQljbGVhcl9wYWdlX2RpcnR5X2Zvcl9pbyhwYWdlc1tpXSk7CisJCXNldF9wYWdlX2V4dGVudF9tYXBwZWQocGFnZXNbaV0pOworCQlXQVJOX09OKCFQYWdlTG9ja2VkKHBhZ2VzW2ldKSk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgc3NpemVfdCBidHJmc19maWxlX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLAorCQkJCXNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCWxvZmZfdCBwb3M7CisJbG9mZl90IHN0YXJ0X3BvczsKKwlzc2l6ZV90IG51bV93cml0dGVuID0gMDsKKwlzc2l6ZV90IGVyciA9IDA7CisJaW50IHJldCA9IDA7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGZkZW50cnkoZmlsZSktPmRfaW5vZGU7CisJc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QgPSBCVFJGU19JKGlub2RlKS0+cm9vdDsKKwlzdHJ1Y3QgcGFnZSAqKnBhZ2VzID0gTlVMTDsKKwlpbnQgbnJwdHJzOworCXN0cnVjdCBwYWdlICpwaW5uZWRbMl07CisJdW5zaWduZWQgbG9uZyBmaXJzdF9pbmRleDsKKwl1bnNpZ25lZCBsb25nIGxhc3RfaW5kZXg7CisJaW50IHdpbGxfd3JpdGU7CisKKwl3aWxsX3dyaXRlID0gKChmaWxlLT5mX2ZsYWdzICYgT19TWU5DKSB8fCBJU19TWU5DKGlub2RlKSB8fAorCQkgICAgICAoZmlsZS0+Zl9mbGFncyAmIE9fRElSRUNUKSk7CisKKwlucnB0cnMgPSBtaW4oKGNvdW50ICsgUEFHRV9DQUNIRV9TSVpFIC0gMSkgLyBQQUdFX0NBQ0hFX1NJWkUsCisJCSAgICAgUEFHRV9DQUNIRV9TSVpFIC8gKHNpemVvZihzdHJ1Y3QgcGFnZSAqKSkpOworCXBpbm5lZFswXSA9IE5VTEw7CisJcGlubmVkWzFdID0gTlVMTDsKKworCXBvcyA9ICpwcG9zOworCXN0YXJ0X3BvcyA9IHBvczsKKworCXZmc19jaGVja19mcm96ZW4oaW5vZGUtPmlfc2IsIFNCX0ZSRUVaRV9XUklURSk7CisJY3VycmVudC0+YmFja2luZ19kZXZfaW5mbyA9IGlub2RlLT5pX21hcHBpbmctPmJhY2tpbmdfZGV2X2luZm87CisJZXJyID0gZ2VuZXJpY193cml0ZV9jaGVja3MoZmlsZSwgJnBvcywgJmNvdW50LCBTX0lTQkxLKGlub2RlLT5pX21vZGUpKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dF9ub2xvY2s7CisJaWYgKGNvdW50ID09IDApCisJCWdvdG8gb3V0X25vbG9jazsKKworCWVyciA9IGZpbGVfcmVtb3ZlX3N1aWQoZmlsZSk7CisJaWYgKGVycikKKwkJZ290byBvdXRfbm9sb2NrOworCWZpbGVfdXBkYXRlX3RpbWUoZmlsZSk7CisKKwlwYWdlcyA9IGttYWxsb2MobnJwdHJzICogc2l6ZW9mKHN0cnVjdCBwYWdlICopLCBHRlBfS0VSTkVMKTsKKworCW11dGV4X2xvY2soJmlub2RlLT5pX211dGV4KTsKKwlCVFJGU19JKGlub2RlKS0+c2VxdWVuY2UrKzsKKwlmaXJzdF9pbmRleCA9IHBvcyA+PiBQQUdFX0NBQ0hFX1NISUZUOworCWxhc3RfaW5kZXggPSAocG9zICsgY291bnQpID4+IFBBR0VfQ0FDSEVfU0hJRlQ7CisKKwkvKgorCSAqIHRoZXJlIGFyZSBsb3RzIG9mIGJldHRlciB3YXlzIHRvIGRvIHRoaXMsIGJ1dCB0aGlzIGNvZGUKKwkgKiBtYWtlcyBzdXJlIHRoZSBmaXJzdCBhbmQgbGFzdCBwYWdlIGluIHRoZSBmaWxlIHJhbmdlIGFyZQorCSAqIHVwIHRvIGRhdGUgYW5kIHJlYWR5IGZvciBjb3cKKwkgKi8KKwlpZiAoKHBvcyAmIChQQUdFX0NBQ0hFX1NJWkUgLSAxKSkpIHsKKwkJcGlubmVkWzBdID0gZ3JhYl9jYWNoZV9wYWdlKGlub2RlLT5pX21hcHBpbmcsIGZpcnN0X2luZGV4KTsKKwkJaWYgKCFQYWdlVXB0b2RhdGUocGlubmVkWzBdKSkgeworCQkJcmV0ID0gYnRyZnNfcmVhZHBhZ2UoTlVMTCwgcGlubmVkWzBdKTsKKwkJCUJVR19PTihyZXQpOworCQkJd2FpdF9vbl9wYWdlX2xvY2tlZChwaW5uZWRbMF0pOworCQl9IGVsc2UgeworCQkJdW5sb2NrX3BhZ2UocGlubmVkWzBdKTsKKwkJfQorCX0KKwlpZiAoKHBvcyArIGNvdW50KSAmIChQQUdFX0NBQ0hFX1NJWkUgLSAxKSkgeworCQlwaW5uZWRbMV0gPSBncmFiX2NhY2hlX3BhZ2UoaW5vZGUtPmlfbWFwcGluZywgbGFzdF9pbmRleCk7CisJCWlmICghUGFnZVVwdG9kYXRlKHBpbm5lZFsxXSkpIHsKKwkJCXJldCA9IGJ0cmZzX3JlYWRwYWdlKE5VTEwsIHBpbm5lZFsxXSk7CisJCQlCVUdfT04ocmV0KTsKKwkJCXdhaXRfb25fcGFnZV9sb2NrZWQocGlubmVkWzFdKTsKKwkJfSBlbHNlIHsKKwkJCXVubG9ja19wYWdlKHBpbm5lZFsxXSk7CisJCX0KKwl9CisKKwl3aGlsZSAoY291bnQgPiAwKSB7CisJCXNpemVfdCBvZmZzZXQgPSBwb3MgJiAoUEFHRV9DQUNIRV9TSVpFIC0gMSk7CisJCXNpemVfdCB3cml0ZV9ieXRlcyA9IG1pbihjb3VudCwgbnJwdHJzICoKKwkJCQkJKHNpemVfdClQQUdFX0NBQ0hFX1NJWkUgLQorCQkJCQkgb2Zmc2V0KTsKKwkJc2l6ZV90IG51bV9wYWdlcyA9ICh3cml0ZV9ieXRlcyArIFBBR0VfQ0FDSEVfU0laRSAtIDEpID4+CisJCQkJCVBBR0VfQ0FDSEVfU0hJRlQ7CisKKwkJV0FSTl9PTihudW1fcGFnZXMgPiBucnB0cnMpOworCQltZW1zZXQocGFnZXMsIDAsIHNpemVvZihzdHJ1Y3QgcGFnZSAqKSAqIG5ycHRycyk7CisKKwkJcmV0ID0gYnRyZnNfY2hlY2tfZnJlZV9zcGFjZShyb290LCB3cml0ZV9ieXRlcywgMCk7CisJCWlmIChyZXQpCisJCQlnb3RvIG91dDsKKworCQlyZXQgPSBwcmVwYXJlX3BhZ2VzKHJvb3QsIGZpbGUsIHBhZ2VzLCBudW1fcGFnZXMsCisJCQkJICAgIHBvcywgZmlyc3RfaW5kZXgsIGxhc3RfaW5kZXgsCisJCQkJICAgIHdyaXRlX2J5dGVzKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gb3V0OworCisJCXJldCA9IGJ0cmZzX2NvcHlfZnJvbV91c2VyKHBvcywgbnVtX3BhZ2VzLAorCQkJCQkgICB3cml0ZV9ieXRlcywgcGFnZXMsIGJ1Zik7CisJCWlmIChyZXQpIHsKKwkJCWJ0cmZzX2Ryb3BfcGFnZXMocGFnZXMsIG51bV9wYWdlcyk7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCXJldCA9IGRpcnR5X2FuZF9yZWxlYXNlX3BhZ2VzKE5VTEwsIHJvb3QsIGZpbGUsIHBhZ2VzLAorCQkJCQkgICAgICBudW1fcGFnZXMsIHBvcywgd3JpdGVfYnl0ZXMpOworCQlidHJmc19kcm9wX3BhZ2VzKHBhZ2VzLCBudW1fcGFnZXMpOworCQlpZiAocmV0KQorCQkJZ290byBvdXQ7CisKKwkJaWYgKHdpbGxfd3JpdGUpIHsKKwkJCWJ0cmZzX2ZkYXRhd3JpdGVfcmFuZ2UoaW5vZGUtPmlfbWFwcGluZywgcG9zLAorCQkJCQkgICAgICAgcG9zICsgd3JpdGVfYnl0ZXMgLSAxLAorCQkJCQkgICAgICAgV0JfU1lOQ19OT05FKTsKKwkJfSBlbHNlIHsKKwkJCWJhbGFuY2VfZGlydHlfcGFnZXNfcmF0ZWxpbWl0ZWRfbnIoaW5vZGUtPmlfbWFwcGluZywKKwkJCQkJCQkgICBudW1fcGFnZXMpOworCQkJaWYgKG51bV9wYWdlcyA8CisJCQkgICAgKHJvb3QtPmxlYWZzaXplID4+IFBBR0VfQ0FDSEVfU0hJRlQpICsgMSkKKwkJCQlidHJmc19idHJlZV9iYWxhbmNlX2RpcnR5KHJvb3QsIDEpOworCQkJYnRyZnNfdGhyb3R0bGUocm9vdCk7CisJCX0KKworCQlidWYgKz0gd3JpdGVfYnl0ZXM7CisJCWNvdW50IC09IHdyaXRlX2J5dGVzOworCQlwb3MgKz0gd3JpdGVfYnl0ZXM7CisJCW51bV93cml0dGVuICs9IHdyaXRlX2J5dGVzOworCisJCWNvbmRfcmVzY2hlZCgpOworCX0KK291dDoKKwltdXRleF91bmxvY2soJmlub2RlLT5pX211dGV4KTsKKworb3V0X25vbG9jazoKKwlrZnJlZShwYWdlcyk7CisJaWYgKHBpbm5lZFswXSkKKwkJcGFnZV9jYWNoZV9yZWxlYXNlKHBpbm5lZFswXSk7CisJaWYgKHBpbm5lZFsxXSkKKwkJcGFnZV9jYWNoZV9yZWxlYXNlKHBpbm5lZFsxXSk7CisJKnBwb3MgPSBwb3M7CisKKwlpZiAobnVtX3dyaXR0ZW4gPiAwICYmIHdpbGxfd3JpdGUpIHsKKwkJc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnM7CisKKwkJZXJyID0gYnRyZnNfd2FpdF9vcmRlcmVkX3JhbmdlKGlub2RlLCBzdGFydF9wb3MsIG51bV93cml0dGVuKTsKKwkJaWYgKGVycikKKwkJCW51bV93cml0dGVuID0gZXJyOworCisJCWlmICgoZmlsZS0+Zl9mbGFncyAmIE9fU1lOQykgfHwgSVNfU1lOQyhpbm9kZSkpIHsKKwkJCXRyYW5zID0gYnRyZnNfc3RhcnRfdHJhbnNhY3Rpb24ocm9vdCwgMSk7CisJCQlyZXQgPSBidHJmc19sb2dfZGVudHJ5X3NhZmUodHJhbnMsIHJvb3QsCisJCQkJCQkgICAgZmlsZS0+Zl9kZW50cnkpOworCQkJaWYgKHJldCA9PSAwKSB7CisJCQkJYnRyZnNfc3luY19sb2codHJhbnMsIHJvb3QpOworCQkJCWJ0cmZzX2VuZF90cmFuc2FjdGlvbih0cmFucywgcm9vdCk7CisJCQl9IGVsc2UgeworCQkJCWJ0cmZzX2NvbW1pdF90cmFuc2FjdGlvbih0cmFucywgcm9vdCk7CisJCQl9CisJCX0KKwkJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX0RJUkVDVCkgeworCQkJaW52YWxpZGF0ZV9tYXBwaW5nX3BhZ2VzKGlub2RlLT5pX21hcHBpbmcsCisJCQkgICAgICBzdGFydF9wb3MgPj4gUEFHRV9DQUNIRV9TSElGVCwKKwkJCSAgICAgKHN0YXJ0X3BvcyArIG51bV93cml0dGVuIC0gMSkgPj4gUEFHRV9DQUNIRV9TSElGVCk7CisJCX0KKwl9CisJY3VycmVudC0+YmFja2luZ19kZXZfaW5mbyA9IE5VTEw7CisJcmV0dXJuIG51bV93cml0dGVuID8gbnVtX3dyaXR0ZW4gOiBlcnI7Cit9CisKK2ludCBidHJmc19yZWxlYXNlX2ZpbGUoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApCit7CisJaWYgKGZpbHAtPnByaXZhdGVfZGF0YSkKKwkJYnRyZnNfaW9jdGxfdHJhbnNfZW5kKGZpbHApOworCXJldHVybiAwOworfQorCisvKgorICogZnN5bmMgY2FsbCBmb3IgYm90aCBmaWxlcyBhbmQgZGlyZWN0b3JpZXMuICBUaGlzIGxvZ3MgdGhlIGlub2RlIGludG8KKyAqIHRoZSB0cmVlIGxvZyBpbnN0ZWFkIG9mIGZvcmNpbmcgZnVsbCBjb21taXRzIHdoZW5ldmVyIHBvc3NpYmxlLgorICoKKyAqIEl0IG5lZWRzIHRvIGNhbGwgZmlsZW1hcF9mZGF0YXdhaXQgc28gdGhhdCBhbGwgb3JkZXJlZCBleHRlbnQgdXBkYXRlcyBhcmUKKyAqIGluIHRoZSBtZXRhZGF0YSBidHJlZSBhcmUgdXAgdG8gZGF0ZSBmb3IgY29weWluZyB0byB0aGUgbG9nLgorICoKKyAqIEl0IGRyb3BzIHRoZSBpbm9kZSBtdXRleCBiZWZvcmUgZG9pbmcgdGhlIHRyZWUgbG9nIGNvbW1pdC4gIFRoaXMgaXMgYW4KKyAqIGltcG9ydGFudCBvcHRpbWl6YXRpb24gZm9yIGRpcmVjdG9yaWVzIGJlY2F1c2UgaG9sZGluZyB0aGUgbXV0ZXggcHJldmVudHMKKyAqIG5ldyBvcGVyYXRpb25zIG9uIHRoZSBkaXIgd2hpbGUgd2Ugd3JpdGUgdG8gZGlzay4KKyAqLworaW50IGJ0cmZzX3N5bmNfZmlsZShzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBpbnQgZGF0YXN5bmMpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCA9IEJUUkZTX0koaW5vZGUpLT5yb290OworCWludCByZXQgPSAwOworCXN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zOworCisJLyoKKwkgKiBjaGVjayB0aGUgdHJhbnNhY3Rpb24gdGhhdCBsYXN0IG1vZGlmaWVkIHRoaXMgaW5vZGUKKwkgKiBhbmQgc2VlIGlmIGl0cyBhbHJlYWR5IGJlZW4gY29tbWl0dGVkCisJICovCisJaWYgKCFCVFJGU19JKGlub2RlKS0+bGFzdF90cmFucykKKwkJZ290byBvdXQ7CisKKwltdXRleF9sb2NrKCZyb290LT5mc19pbmZvLT50cmFuc19tdXRleCk7CisJaWYgKEJUUkZTX0koaW5vZGUpLT5sYXN0X3RyYW5zIDw9CisJICAgIHJvb3QtPmZzX2luZm8tPmxhc3RfdHJhbnNfY29tbWl0dGVkKSB7CisJCUJUUkZTX0koaW5vZGUpLT5sYXN0X3RyYW5zID0gMDsKKwkJbXV0ZXhfdW5sb2NrKCZyb290LT5mc19pbmZvLT50cmFuc19tdXRleCk7CisJCWdvdG8gb3V0OworCX0KKwltdXRleF91bmxvY2soJnJvb3QtPmZzX2luZm8tPnRyYW5zX211dGV4KTsKKworCXJvb3QtPmZzX2luZm8tPnRyZWVfbG9nX2JhdGNoKys7CisJZmlsZW1hcF9mZGF0YXdyaXRlKGlub2RlLT5pX21hcHBpbmcpOworCWJ0cmZzX3dhaXRfb3JkZXJlZF9yYW5nZShpbm9kZSwgMCwgKHU2NCktMSk7CisJcm9vdC0+ZnNfaW5mby0+dHJlZV9sb2dfYmF0Y2grKzsKKworCS8qCisJICogb2sgd2UgaGF2ZW4ndCBjb21taXR0ZWQgdGhlIHRyYW5zYWN0aW9uIHlldCwgbGV0cyBkbyBhIGNvbW1pdAorCSAqLworCWlmIChmaWxlLT5wcml2YXRlX2RhdGEpCisJCWJ0cmZzX2lvY3RsX3RyYW5zX2VuZChmaWxlKTsKKworCXRyYW5zID0gYnRyZnNfc3RhcnRfdHJhbnNhY3Rpb24ocm9vdCwgMSk7CisJaWYgKCF0cmFucykgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIG91dDsKKwl9CisKKwlyZXQgPSBidHJmc19sb2dfZGVudHJ5X3NhZmUodHJhbnMsIHJvb3QsIGZpbGUtPmZfZGVudHJ5KTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXQ7CisKKwkvKiB3ZSd2ZSBsb2dnZWQgYWxsIHRoZSBpdGVtcyBhbmQgbm93IGhhdmUgYSBjb25zaXN0ZW50CisJICogdmVyc2lvbiBvZiB0aGUgZmlsZSBpbiB0aGUgbG9nLiAgSXQgaXMgcG9zc2libGUgdGhhdAorCSAqIHNvbWVvbmUgd2lsbCBjb21lIGluIGFuZCBtb2RpZnkgdGhlIGZpbGUsIGJ1dCB0aGF0J3MKKwkgKiBmaW5lIGJlY2F1c2UgdGhlIGxvZyBpcyBjb25zaXN0ZW50IG9uIGRpc2ssIGFuZCB3ZQorCSAqIGhhdmUgcmVmZXJlbmNlcyB0byBhbGwgb2YgdGhlIGZpbGUncyBleHRlbnRzCisJICoKKwkgKiBJdCBpcyBwb3NzaWJsZSB0aGF0IHNvbWVvbmUgd2lsbCBjb21lIGluIGFuZCBsb2cgdGhlCisJICogZmlsZSBhZ2FpbiwgYnV0IHRoYXQgd2lsbCBlbmQgdXAgdXNpbmcgdGhlIHN5bmNocm9uaXphdGlvbgorCSAqIGluc2lkZSBidHJmc19zeW5jX2xvZyB0byBrZWVwIHRoaW5ncyBzYWZlLgorCSAqLworCW11dGV4X3VubG9jaygmZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUtPmlfbXV0ZXgpOworCisJaWYgKHJldCA+IDApIHsKKwkJcmV0ID0gYnRyZnNfY29tbWl0X3RyYW5zYWN0aW9uKHRyYW5zLCByb290KTsKKwl9IGVsc2UgeworCQlidHJmc19zeW5jX2xvZyh0cmFucywgcm9vdCk7CisJCXJldCA9IGJ0cmZzX2VuZF90cmFuc2FjdGlvbih0cmFucywgcm9vdCk7CisJfQorCW11dGV4X2xvY2soJmZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLT5pX211dGV4KTsKK291dDoKKwlyZXR1cm4gcmV0ID4gMCA/IEVJTyA6IHJldDsKK30KKworc3RhdGljIHN0cnVjdCB2bV9vcGVyYXRpb25zX3N0cnVjdCBidHJmc19maWxlX3ZtX29wcyA9IHsKKwkuZmF1bHQJCT0gZmlsZW1hcF9mYXVsdCwKKwkucGFnZV9ta3dyaXRlCT0gYnRyZnNfcGFnZV9ta3dyaXRlLAorfTsKKworc3RhdGljIGludCBidHJmc19maWxlX21tYXAoc3RydWN0IGZpbGUJKmZpbHAsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQoreworCXZtYS0+dm1fb3BzID0gJmJ0cmZzX2ZpbGVfdm1fb3BzOworCWZpbGVfYWNjZXNzZWQoZmlscCk7CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBmaWxlX29wZXJhdGlvbnMgYnRyZnNfZmlsZV9vcGVyYXRpb25zID0geworCS5sbHNlZWsJCT0gZ2VuZXJpY19maWxlX2xsc2VlaywKKwkucmVhZAkJPSBkb19zeW5jX3JlYWQsCisJLmFpb19yZWFkICAgICAgID0gZ2VuZXJpY19maWxlX2Fpb19yZWFkLAorCS5zcGxpY2VfcmVhZAk9IGdlbmVyaWNfZmlsZV9zcGxpY2VfcmVhZCwKKwkud3JpdGUJCT0gYnRyZnNfZmlsZV93cml0ZSwKKwkubW1hcAkJPSBidHJmc19maWxlX21tYXAsCisJLm9wZW4JCT0gZ2VuZXJpY19maWxlX29wZW4sCisJLnJlbGVhc2UJPSBidHJmc19yZWxlYXNlX2ZpbGUsCisJLmZzeW5jCQk9IGJ0cmZzX3N5bmNfZmlsZSwKKwkudW5sb2NrZWRfaW9jdGwJPSBidHJmc19pb2N0bCwKKyNpZmRlZiBDT05GSUdfQ09NUEFUCisJLmNvbXBhdF9pb2N0bAk9IGJ0cmZzX2lvY3RsLAorI2VuZGlmCit9OwpkaWZmIC0tZ2l0IGEvZnMvYnRyZnMvZnJlZS1zcGFjZS1jYWNoZS5jIGIvZnMvYnRyZnMvZnJlZS1zcGFjZS1jYWNoZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxZTVmMGUKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9idHJmcy9mcmVlLXNwYWNlLWNhY2hlLmMKQEAgLTAsMCArMSw0OTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggUmVkIEhhdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIHYyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCisgKiBCb3N0b24sIE1BIDAyMTExMC0xMzA3LCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSAiY3RyZWUuaCIKKworc3RhdGljIGludCB0cmVlX2luc2VydF9vZmZzZXQoc3RydWN0IHJiX3Jvb3QgKnJvb3QsIHU2NCBvZmZzZXQsCisJCQkgICAgICBzdHJ1Y3QgcmJfbm9kZSAqbm9kZSkKK3sKKwlzdHJ1Y3QgcmJfbm9kZSAqKnAgPSAmcm9vdC0+cmJfbm9kZTsKKwlzdHJ1Y3QgcmJfbm9kZSAqcGFyZW50ID0gTlVMTDsKKwlzdHJ1Y3QgYnRyZnNfZnJlZV9zcGFjZSAqaW5mbzsKKworCXdoaWxlICgqcCkgeworCQlwYXJlbnQgPSAqcDsKKwkJaW5mbyA9IHJiX2VudHJ5KHBhcmVudCwgc3RydWN0IGJ0cmZzX2ZyZWVfc3BhY2UsIG9mZnNldF9pbmRleCk7CisKKwkJaWYgKG9mZnNldCA8IGluZm8tPm9mZnNldCkKKwkJCXAgPSAmKCpwKS0+cmJfbGVmdDsKKwkJZWxzZSBpZiAob2Zmc2V0ID4gaW5mby0+b2Zmc2V0KQorCQkJcCA9ICYoKnApLT5yYl9yaWdodDsKKwkJZWxzZQorCQkJcmV0dXJuIC1FRVhJU1Q7CisJfQorCisJcmJfbGlua19ub2RlKG5vZGUsIHBhcmVudCwgcCk7CisJcmJfaW5zZXJ0X2NvbG9yKG5vZGUsIHJvb3QpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdHJlZV9pbnNlcnRfYnl0ZXMoc3RydWN0IHJiX3Jvb3QgKnJvb3QsIHU2NCBieXRlcywKKwkJCSAgICAgc3RydWN0IHJiX25vZGUgKm5vZGUpCit7CisJc3RydWN0IHJiX25vZGUgKipwID0gJnJvb3QtPnJiX25vZGU7CisJc3RydWN0IHJiX25vZGUgKnBhcmVudCA9IE5VTEw7CisJc3RydWN0IGJ0cmZzX2ZyZWVfc3BhY2UgKmluZm87CisKKwl3aGlsZSAoKnApIHsKKwkJcGFyZW50ID0gKnA7CisJCWluZm8gPSByYl9lbnRyeShwYXJlbnQsIHN0cnVjdCBidHJmc19mcmVlX3NwYWNlLCBieXRlc19pbmRleCk7CisKKwkJaWYgKGJ5dGVzIDwgaW5mby0+Ynl0ZXMpCisJCQlwID0gJigqcCktPnJiX2xlZnQ7CisJCWVsc2UKKwkJCXAgPSAmKCpwKS0+cmJfcmlnaHQ7CisJfQorCisJcmJfbGlua19ub2RlKG5vZGUsIHBhcmVudCwgcCk7CisJcmJfaW5zZXJ0X2NvbG9yKG5vZGUsIHJvb3QpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBzZWFyY2hlcyB0aGUgdHJlZSBmb3IgdGhlIGdpdmVuIG9mZnNldC4gIElmIGNvbnRhaW5zIGlzIHNldCB3ZSB3aWxsIHJldHVybgorICogdGhlIGZyZWUgc3BhY2UgdGhhdCBjb250YWlucyB0aGUgZ2l2ZW4gb2Zmc2V0LiAgSWYgY29udGFpbnMgaXMgbm90IHNldCB3ZQorICogd2lsbCByZXR1cm4gdGhlIGZyZWUgc3BhY2UgdGhhdCBzdGFydHMgYXQgb3IgYWZ0ZXIgdGhlIGdpdmVuIG9mZnNldCBhbmQgaXMKKyAqIGF0IGxlYXN0IGJ5dGVzIGxvbmcuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgYnRyZnNfZnJlZV9zcGFjZSAqdHJlZV9zZWFyY2hfb2Zmc2V0KHN0cnVjdCByYl9yb290ICpyb290LAorCQkJCQkJICAgdTY0IG9mZnNldCwgdTY0IGJ5dGVzLAorCQkJCQkJICAgaW50IGNvbnRhaW5zKQoreworCXN0cnVjdCByYl9ub2RlICpuID0gcm9vdC0+cmJfbm9kZTsKKwlzdHJ1Y3QgYnRyZnNfZnJlZV9zcGFjZSAqZW50cnksICpyZXQgPSBOVUxMOworCisJd2hpbGUgKG4pIHsKKwkJZW50cnkgPSByYl9lbnRyeShuLCBzdHJ1Y3QgYnRyZnNfZnJlZV9zcGFjZSwgb2Zmc2V0X2luZGV4KTsKKworCQlpZiAob2Zmc2V0IDwgZW50cnktPm9mZnNldCkgeworCQkJaWYgKCFjb250YWlucyAmJgorCQkJICAgICghcmV0IHx8IGVudHJ5LT5vZmZzZXQgPCByZXQtPm9mZnNldCkgJiYKKwkJCSAgICAoYnl0ZXMgPD0gZW50cnktPmJ5dGVzKSkKKwkJCQlyZXQgPSBlbnRyeTsKKwkJCW4gPSBuLT5yYl9sZWZ0OworCQl9IGVsc2UgaWYgKG9mZnNldCA+IGVudHJ5LT5vZmZzZXQpIHsKKwkJCWlmICgoZW50cnktPm9mZnNldCArIGVudHJ5LT5ieXRlcyAtIDEpID49IG9mZnNldCAmJgorCQkJICAgIGJ5dGVzIDw9IGVudHJ5LT5ieXRlcykgeworCQkJCXJldCA9IGVudHJ5OworCQkJCWJyZWFrOworCQkJfQorCQkJbiA9IG4tPnJiX3JpZ2h0OworCQl9IGVsc2UgeworCQkJaWYgKGJ5dGVzID4gZW50cnktPmJ5dGVzKSB7CisJCQkJbiA9IG4tPnJiX3JpZ2h0OworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJcmV0ID0gZW50cnk7CisJCQlicmVhazsKKwkJfQorCX0KKworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiByZXR1cm4gYSBjaHVuayBhdCBsZWFzdCBieXRlcyBzaXplLCBhcyBjbG9zZSB0byBvZmZzZXQgdGhhdCB3ZSBjYW4gZ2V0LgorICovCitzdGF0aWMgc3RydWN0IGJ0cmZzX2ZyZWVfc3BhY2UgKnRyZWVfc2VhcmNoX2J5dGVzKHN0cnVjdCByYl9yb290ICpyb290LAorCQkJCQkJICB1NjQgb2Zmc2V0LCB1NjQgYnl0ZXMpCit7CisJc3RydWN0IHJiX25vZGUgKm4gPSByb290LT5yYl9ub2RlOworCXN0cnVjdCBidHJmc19mcmVlX3NwYWNlICplbnRyeSwgKnJldCA9IE5VTEw7CisKKwl3aGlsZSAobikgeworCQllbnRyeSA9IHJiX2VudHJ5KG4sIHN0cnVjdCBidHJmc19mcmVlX3NwYWNlLCBieXRlc19pbmRleCk7CisKKwkJaWYgKGJ5dGVzIDwgZW50cnktPmJ5dGVzKSB7CisJCQkvKgorCQkJICogV2UgcHJlZmVyIHRvIGdldCBhIGhvbGUgc2l6ZSBhcyBjbG9zZSB0byB0aGUgc2l6ZSB3ZQorCQkJICogYXJlIGFza2luZyBmb3Igc28gd2UgZG9uJ3QgdGFrZSBzbWFsbCBzbGl2ZXJzIG91dCBvZgorCQkJICogaHVnZSBob2xlcywgYnV0IHdlIGFsc28gd2FudCB0byBnZXQgYXMgY2xvc2UgdG8gdGhlCisJCQkgKiBvZmZzZXQgYXMgcG9zc2libGUgc28gd2UgZG9uJ3QgaGF2ZSBhIHdob2xlIGxvdCBvZgorCQkJICogZnJhZ21lbnRhdGlvbi4KKwkJCSAqLworCQkJaWYgKG9mZnNldCA8PSBlbnRyeS0+b2Zmc2V0KSB7CisJCQkJaWYgKCFyZXQpCisJCQkJCXJldCA9IGVudHJ5OworCQkJCWVsc2UgaWYgKGVudHJ5LT5ieXRlcyA8IHJldC0+Ynl0ZXMpCisJCQkJCXJldCA9IGVudHJ5OworCQkJCWVsc2UgaWYgKGVudHJ5LT5vZmZzZXQgPCByZXQtPm9mZnNldCkKKwkJCQkJcmV0ID0gZW50cnk7CisJCQl9CisJCQluID0gbi0+cmJfbGVmdDsKKwkJfSBlbHNlIGlmIChieXRlcyA+IGVudHJ5LT5ieXRlcykgeworCQkJbiA9IG4tPnJiX3JpZ2h0OworCQl9IGVsc2UgeworCQkJLyoKKwkJCSAqIE9rIHdlIG1heSBoYXZlIG11bHRpcGxlIGNodW5rcyBvZiB0aGUgd2FudGVkIHNpemUsCisJCQkgKiBzbyB3ZSBkb24ndCB3YW50IHRvIHRha2UgdGhlIGZpcnN0IG9uZSB3ZSBmaW5kLCB3ZQorCQkJICogd2FudCB0byB0YWtlIHRoZSBvbmUgY2xvc2VzdCB0byBvdXIgZ2l2ZW4gb2Zmc2V0LCBzbworCQkJICoga2VlcCBzZWFyY2hpbmcganVzdCBpbiBjYXNlIHRoZXJlcyBhIGJldHRlciBtYXRjaC4KKwkJCSAqLworCQkJbiA9IG4tPnJiX3JpZ2h0OworCQkJaWYgKG9mZnNldCA+IGVudHJ5LT5vZmZzZXQpCisJCQkJY29udGludWU7CisJCQllbHNlIGlmICghcmV0IHx8IGVudHJ5LT5vZmZzZXQgPCByZXQtPm9mZnNldCkKKwkJCQlyZXQgPSBlbnRyeTsKKwkJfQorCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIHVubGlua19mcmVlX3NwYWNlKHN0cnVjdCBidHJmc19ibG9ja19ncm91cF9jYWNoZSAqYmxvY2tfZ3JvdXAsCisJCQkgICAgICBzdHJ1Y3QgYnRyZnNfZnJlZV9zcGFjZSAqaW5mbykKK3sKKwlyYl9lcmFzZSgmaW5mby0+b2Zmc2V0X2luZGV4LCAmYmxvY2tfZ3JvdXAtPmZyZWVfc3BhY2Vfb2Zmc2V0KTsKKwlyYl9lcmFzZSgmaW5mby0+Ynl0ZXNfaW5kZXgsICZibG9ja19ncm91cC0+ZnJlZV9zcGFjZV9ieXRlcyk7Cit9CisKK3N0YXRpYyBpbnQgbGlua19mcmVlX3NwYWNlKHN0cnVjdCBidHJmc19ibG9ja19ncm91cF9jYWNoZSAqYmxvY2tfZ3JvdXAsCisJCQkgICBzdHJ1Y3QgYnRyZnNfZnJlZV9zcGFjZSAqaW5mbykKK3sKKwlpbnQgcmV0ID0gMDsKKworCisJcmV0ID0gdHJlZV9pbnNlcnRfb2Zmc2V0KCZibG9ja19ncm91cC0+ZnJlZV9zcGFjZV9vZmZzZXQsIGluZm8tPm9mZnNldCwKKwkJCQkgJmluZm8tPm9mZnNldF9pbmRleCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IHRyZWVfaW5zZXJ0X2J5dGVzKCZibG9ja19ncm91cC0+ZnJlZV9zcGFjZV9ieXRlcywgaW5mby0+Ynl0ZXMsCisJCQkJJmluZm8tPmJ5dGVzX2luZGV4KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfX2J0cmZzX2FkZF9mcmVlX3NwYWNlKHN0cnVjdCBidHJmc19ibG9ja19ncm91cF9jYWNoZSAqYmxvY2tfZ3JvdXAsCisJCQkJICB1NjQgb2Zmc2V0LCB1NjQgYnl0ZXMpCit7CisJc3RydWN0IGJ0cmZzX2ZyZWVfc3BhY2UgKnJpZ2h0X2luZm87CisJc3RydWN0IGJ0cmZzX2ZyZWVfc3BhY2UgKmxlZnRfaW5mbzsKKwlzdHJ1Y3QgYnRyZnNfZnJlZV9zcGFjZSAqaW5mbyA9IE5VTEw7CisJc3RydWN0IGJ0cmZzX2ZyZWVfc3BhY2UgKmFsbG9jX2luZm87CisJaW50IHJldCA9IDA7CisKKwlhbGxvY19pbmZvID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGJ0cmZzX2ZyZWVfc3BhY2UpLCBHRlBfTk9GUyk7CisJaWYgKCFhbGxvY19pbmZvKQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qCisJICogZmlyc3Qgd2Ugd2FudCB0byBzZWUgaWYgdGhlcmUgaXMgZnJlZSBzcGFjZSBhZGphY2VudCB0byB0aGUgcmFuZ2Ugd2UKKwkgKiBhcmUgYWRkaW5nLCBpZiB0aGVyZSBpcyByZW1vdmUgdGhhdCBzdHJ1Y3QgYW5kIGFkZCBhIG5ldyBvbmUgdG8KKwkgKiBjb3ZlciB0aGUgZW50aXJlIHJhbmdlCisJICovCisJcmlnaHRfaW5mbyA9IHRyZWVfc2VhcmNoX29mZnNldCgmYmxvY2tfZ3JvdXAtPmZyZWVfc3BhY2Vfb2Zmc2V0LAorCQkJCQlvZmZzZXQrYnl0ZXMsIDAsIDEpOworCWxlZnRfaW5mbyA9IHRyZWVfc2VhcmNoX29mZnNldCgmYmxvY2tfZ3JvdXAtPmZyZWVfc3BhY2Vfb2Zmc2V0LAorCQkJCSAgICAgICBvZmZzZXQtMSwgMCwgMSk7CisKKwlpZiAocmlnaHRfaW5mbyAmJiByaWdodF9pbmZvLT5vZmZzZXQgPT0gb2Zmc2V0K2J5dGVzKSB7CisJCXVubGlua19mcmVlX3NwYWNlKGJsb2NrX2dyb3VwLCByaWdodF9pbmZvKTsKKwkJaW5mbyA9IHJpZ2h0X2luZm87CisJCWluZm8tPm9mZnNldCA9IG9mZnNldDsKKwkJaW5mby0+Ynl0ZXMgKz0gYnl0ZXM7CisJfSBlbHNlIGlmIChyaWdodF9pbmZvICYmIHJpZ2h0X2luZm8tPm9mZnNldCAhPSBvZmZzZXQrYnl0ZXMpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJidHJmcyBhZGRpbmcgc3BhY2UgaW4gdGhlIG1pZGRsZSBvZiBhbiAiCisJCSAgICAgICAiZXhpc3RpbmcgZnJlZSBzcGFjZSBhcmVhLiBleGlzdGluZzogIgorCQkgICAgICAgIm9mZnNldD0lbGx1LCBieXRlcz0lbGx1LiBuZXc6IG9mZnNldD0lbGx1LCAiCisJCSAgICAgICAiYnl0ZXM9JWxsdVxuIiwgKHVuc2lnbmVkIGxvbmcgbG9uZylyaWdodF9pbmZvLT5vZmZzZXQsCisJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKXJpZ2h0X2luZm8tPmJ5dGVzLAorCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylvZmZzZXQsCisJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKWJ5dGVzKTsKKwkJQlVHKCk7CisJfQorCisJaWYgKGxlZnRfaW5mbykgeworCQl1bmxpbmtfZnJlZV9zcGFjZShibG9ja19ncm91cCwgbGVmdF9pbmZvKTsKKworCQlpZiAodW5saWtlbHkoKGxlZnRfaW5mby0+b2Zmc2V0ICsgbGVmdF9pbmZvLT5ieXRlcykgIT0KKwkJCSAgICAgb2Zmc2V0KSkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJidHJmcyBmcmVlIHNwYWNlIHRvIHRoZSBsZWZ0ICIKKwkJCSAgICAgICAib2YgbmV3IGZyZWUgc3BhY2UgaXNuJ3QgIgorCQkJICAgICAgICJxdWl0ZSByaWdodC4gZXhpc3Rpbmc6IG9mZnNldD0lbGx1LCAiCisJCQkgICAgICAgImJ5dGVzPSVsbHUuIG5ldzogb2Zmc2V0PSVsbHUsIGJ5dGVzPSVsbHVcbiIsCisJCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylsZWZ0X2luZm8tPm9mZnNldCwKKwkJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKWxlZnRfaW5mby0+Ynl0ZXMsCisJCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylvZmZzZXQsCisJCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylieXRlcyk7CisJCQlCVUcoKTsKKwkJfQorCisJCWlmIChpbmZvKSB7CisJCQlpbmZvLT5vZmZzZXQgPSBsZWZ0X2luZm8tPm9mZnNldDsKKwkJCWluZm8tPmJ5dGVzICs9IGxlZnRfaW5mby0+Ynl0ZXM7CisJCQlrZnJlZShsZWZ0X2luZm8pOworCQl9IGVsc2UgeworCQkJaW5mbyA9IGxlZnRfaW5mbzsKKwkJCWluZm8tPmJ5dGVzICs9IGJ5dGVzOworCQl9CisJfQorCisJaWYgKGluZm8pIHsKKwkJcmV0ID0gbGlua19mcmVlX3NwYWNlKGJsb2NrX2dyb3VwLCBpbmZvKTsKKwkJaWYgKCFyZXQpCisJCQlpbmZvID0gTlVMTDsKKwkJZ290byBvdXQ7CisJfQorCisJaW5mbyA9IGFsbG9jX2luZm87CisJYWxsb2NfaW5mbyA9IE5VTEw7CisJaW5mby0+b2Zmc2V0ID0gb2Zmc2V0OworCWluZm8tPmJ5dGVzID0gYnl0ZXM7CisKKwlyZXQgPSBsaW5rX2ZyZWVfc3BhY2UoYmxvY2tfZ3JvdXAsIGluZm8pOworCWlmIChyZXQpCisJCWtmcmVlKGluZm8pOworb3V0OgorCWlmIChyZXQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJidHJmczogdW5hYmxlIHRvIGFkZCBmcmVlIHNwYWNlIDolZFxuIiwgcmV0KTsKKwkJaWYgKHJldCA9PSAtRUVYSVNUKQorCQkJQlVHKCk7CisJfQorCisJa2ZyZWUoYWxsb2NfaW5mbyk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50CitfX2J0cmZzX3JlbW92ZV9mcmVlX3NwYWNlKHN0cnVjdCBidHJmc19ibG9ja19ncm91cF9jYWNoZSAqYmxvY2tfZ3JvdXAsCisJCQkgIHU2NCBvZmZzZXQsIHU2NCBieXRlcykKK3sKKwlzdHJ1Y3QgYnRyZnNfZnJlZV9zcGFjZSAqaW5mbzsKKwlpbnQgcmV0ID0gMDsKKworCWluZm8gPSB0cmVlX3NlYXJjaF9vZmZzZXQoJmJsb2NrX2dyb3VwLT5mcmVlX3NwYWNlX29mZnNldCwgb2Zmc2V0LCAwLAorCQkJCSAgMSk7CisKKwlpZiAoaW5mbyAmJiBpbmZvLT5vZmZzZXQgPT0gb2Zmc2V0KSB7CisJCWlmIChpbmZvLT5ieXRlcyA8IGJ5dGVzKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIkZvdW5kIGZyZWUgc3BhY2UgYXQgJWxsdSwgc2l6ZSAlbGx1LCIKKwkJCSAgICAgICAidHJ5aW5nIHRvIHVzZSAlbGx1XG4iLAorCQkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpaW5mby0+b2Zmc2V0LAorCQkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpaW5mby0+Ynl0ZXMsCisJCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylieXRlcyk7CisJCQlXQVJOX09OKDEpOworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWdvdG8gb3V0OworCQl9CisJCXVubGlua19mcmVlX3NwYWNlKGJsb2NrX2dyb3VwLCBpbmZvKTsKKworCQlpZiAoaW5mby0+Ynl0ZXMgPT0gYnl0ZXMpIHsKKwkJCWtmcmVlKGluZm8pOworCQkJZ290byBvdXQ7CisJCX0KKworCQlpbmZvLT5vZmZzZXQgKz0gYnl0ZXM7CisJCWluZm8tPmJ5dGVzIC09IGJ5dGVzOworCisJCXJldCA9IGxpbmtfZnJlZV9zcGFjZShibG9ja19ncm91cCwgaW5mbyk7CisJCUJVR19PTihyZXQpOworCX0gZWxzZSBpZiAoaW5mbyAmJiBpbmZvLT5vZmZzZXQgPCBvZmZzZXQgJiYKKwkJICAgaW5mby0+b2Zmc2V0ICsgaW5mby0+Ynl0ZXMgPj0gb2Zmc2V0ICsgYnl0ZXMpIHsKKwkJdTY0IG9sZF9zdGFydCA9IGluZm8tPm9mZnNldDsKKwkJLyoKKwkJICogd2UncmUgZnJlZWluZyBzcGFjZSBpbiB0aGUgbWlkZGxlIG9mIHRoZSBpbmZvLAorCQkgKiB0aGlzIGNhbiBoYXBwZW4gZHVyaW5nIHRyZWUgbG9nIHJlcGxheQorCQkgKgorCQkgKiBmaXJzdCB1bmxpbmsgdGhlIG9sZCBpbmZvIGFuZCB0aGVuCisJCSAqIGluc2VydCBpdCBhZ2FpbiBhZnRlciB0aGUgaG9sZSB3ZSdyZSBjcmVhdGluZworCQkgKi8KKwkJdW5saW5rX2ZyZWVfc3BhY2UoYmxvY2tfZ3JvdXAsIGluZm8pOworCQlpZiAob2Zmc2V0ICsgYnl0ZXMgPCBpbmZvLT5vZmZzZXQgKyBpbmZvLT5ieXRlcykgeworCQkJdTY0IG9sZF9lbmQgPSBpbmZvLT5vZmZzZXQgKyBpbmZvLT5ieXRlczsKKworCQkJaW5mby0+b2Zmc2V0ID0gb2Zmc2V0ICsgYnl0ZXM7CisJCQlpbmZvLT5ieXRlcyA9IG9sZF9lbmQgLSBpbmZvLT5vZmZzZXQ7CisJCQlyZXQgPSBsaW5rX2ZyZWVfc3BhY2UoYmxvY2tfZ3JvdXAsIGluZm8pOworCQkJQlVHX09OKHJldCk7CisJCX0gZWxzZSB7CisJCQkvKiB0aGUgaG9sZSB3ZSdyZSBjcmVhdGluZyBlbmRzIGF0IHRoZSBlbmQKKwkJCSAqIG9mIHRoZSBpbmZvIHN0cnVjdCwganVzdCBmcmVlIHRoZSBpbmZvCisJCQkgKi8KKwkJCWtmcmVlKGluZm8pOworCQl9CisKKwkJLyogc3RlcCB0d28sIGluc2VydCBhIG5ldyBpbmZvIHN0cnVjdCB0byBjb3ZlciBhbnl0aGluZworCQkgKiBiZWZvcmUgdGhlIGhvbGUKKwkJICovCisJCXJldCA9IF9fYnRyZnNfYWRkX2ZyZWVfc3BhY2UoYmxvY2tfZ3JvdXAsIG9sZF9zdGFydCwKKwkJCQkJICAgICBvZmZzZXQgLSBvbGRfc3RhcnQpOworCQlCVUdfT04ocmV0KTsKKwl9IGVsc2UgeworCQlXQVJOX09OKDEpOworCX0KK291dDoKKwlyZXR1cm4gcmV0OworfQorCitpbnQgYnRyZnNfYWRkX2ZyZWVfc3BhY2Uoc3RydWN0IGJ0cmZzX2Jsb2NrX2dyb3VwX2NhY2hlICpibG9ja19ncm91cCwKKwkJCSB1NjQgb2Zmc2V0LCB1NjQgYnl0ZXMpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgYnRyZnNfZnJlZV9zcGFjZSAqc3A7CisKKwltdXRleF9sb2NrKCZibG9ja19ncm91cC0+YWxsb2NfbXV0ZXgpOworCXJldCA9IF9fYnRyZnNfYWRkX2ZyZWVfc3BhY2UoYmxvY2tfZ3JvdXAsIG9mZnNldCwgYnl0ZXMpOworCXNwID0gdHJlZV9zZWFyY2hfb2Zmc2V0KCZibG9ja19ncm91cC0+ZnJlZV9zcGFjZV9vZmZzZXQsIG9mZnNldCwgMCwgMSk7CisJQlVHX09OKCFzcCk7CisJbXV0ZXhfdW5sb2NrKCZibG9ja19ncm91cC0+YWxsb2NfbXV0ZXgpOworCisJcmV0dXJuIHJldDsKK30KKworaW50IGJ0cmZzX2FkZF9mcmVlX3NwYWNlX2xvY2soc3RydWN0IGJ0cmZzX2Jsb2NrX2dyb3VwX2NhY2hlICpibG9ja19ncm91cCwKKwkJCSAgICAgIHU2NCBvZmZzZXQsIHU2NCBieXRlcykKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBidHJmc19mcmVlX3NwYWNlICpzcDsKKworCXJldCA9IF9fYnRyZnNfYWRkX2ZyZWVfc3BhY2UoYmxvY2tfZ3JvdXAsIG9mZnNldCwgYnl0ZXMpOworCXNwID0gdHJlZV9zZWFyY2hfb2Zmc2V0KCZibG9ja19ncm91cC0+ZnJlZV9zcGFjZV9vZmZzZXQsIG9mZnNldCwgMCwgMSk7CisJQlVHX09OKCFzcCk7CisKKwlyZXR1cm4gcmV0OworfQorCitpbnQgYnRyZnNfcmVtb3ZlX2ZyZWVfc3BhY2Uoc3RydWN0IGJ0cmZzX2Jsb2NrX2dyb3VwX2NhY2hlICpibG9ja19ncm91cCwKKwkJCSAgICB1NjQgb2Zmc2V0LCB1NjQgYnl0ZXMpCit7CisJaW50IHJldCA9IDA7CisKKwltdXRleF9sb2NrKCZibG9ja19ncm91cC0+YWxsb2NfbXV0ZXgpOworCXJldCA9IF9fYnRyZnNfcmVtb3ZlX2ZyZWVfc3BhY2UoYmxvY2tfZ3JvdXAsIG9mZnNldCwgYnl0ZXMpOworCW11dGV4X3VubG9jaygmYmxvY2tfZ3JvdXAtPmFsbG9jX211dGV4KTsKKworCXJldHVybiByZXQ7Cit9CisKK2ludCBidHJmc19yZW1vdmVfZnJlZV9zcGFjZV9sb2NrKHN0cnVjdCBidHJmc19ibG9ja19ncm91cF9jYWNoZSAqYmxvY2tfZ3JvdXAsCisJCQkJIHU2NCBvZmZzZXQsIHU2NCBieXRlcykKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gX19idHJmc19yZW1vdmVfZnJlZV9zcGFjZShibG9ja19ncm91cCwgb2Zmc2V0LCBieXRlcyk7CisKKwlyZXR1cm4gcmV0OworfQorCit2b2lkIGJ0cmZzX2R1bXBfZnJlZV9zcGFjZShzdHJ1Y3QgYnRyZnNfYmxvY2tfZ3JvdXBfY2FjaGUgKmJsb2NrX2dyb3VwLAorCQkJICAgdTY0IGJ5dGVzKQoreworCXN0cnVjdCBidHJmc19mcmVlX3NwYWNlICppbmZvOworCXN0cnVjdCByYl9ub2RlICpuOworCWludCBjb3VudCA9IDA7CisKKwlmb3IgKG4gPSByYl9maXJzdCgmYmxvY2tfZ3JvdXAtPmZyZWVfc3BhY2Vfb2Zmc2V0KTsgbjsgbiA9IHJiX25leHQobikpIHsKKwkJaW5mbyA9IHJiX2VudHJ5KG4sIHN0cnVjdCBidHJmc19mcmVlX3NwYWNlLCBvZmZzZXRfaW5kZXgpOworCQlpZiAoaW5mby0+Ynl0ZXMgPj0gYnl0ZXMpCisJCQljb3VudCsrOworCX0KKwlwcmludGsoS0VSTl9JTkZPICIlZCBibG9ja3Mgb2YgZnJlZSBzcGFjZSBhdCBvciBiaWdnZXIgdGhhbiBieXRlcyBpcyIKKwkgICAgICAgIlxuIiwgY291bnQpOworfQorCit1NjQgYnRyZnNfYmxvY2tfZ3JvdXBfZnJlZV9zcGFjZShzdHJ1Y3QgYnRyZnNfYmxvY2tfZ3JvdXBfY2FjaGUgKmJsb2NrX2dyb3VwKQoreworCXN0cnVjdCBidHJmc19mcmVlX3NwYWNlICppbmZvOworCXN0cnVjdCByYl9ub2RlICpuOworCXU2NCByZXQgPSAwOworCisJZm9yIChuID0gcmJfZmlyc3QoJmJsb2NrX2dyb3VwLT5mcmVlX3NwYWNlX29mZnNldCk7IG47CisJICAgICBuID0gcmJfbmV4dChuKSkgeworCQlpbmZvID0gcmJfZW50cnkobiwgc3RydWN0IGJ0cmZzX2ZyZWVfc3BhY2UsIG9mZnNldF9pbmRleCk7CisJCXJldCArPSBpbmZvLT5ieXRlczsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCit2b2lkIGJ0cmZzX3JlbW92ZV9mcmVlX3NwYWNlX2NhY2hlKHN0cnVjdCBidHJmc19ibG9ja19ncm91cF9jYWNoZSAqYmxvY2tfZ3JvdXApCit7CisJc3RydWN0IGJ0cmZzX2ZyZWVfc3BhY2UgKmluZm87CisJc3RydWN0IHJiX25vZGUgKm5vZGU7CisKKwltdXRleF9sb2NrKCZibG9ja19ncm91cC0+YWxsb2NfbXV0ZXgpOworCXdoaWxlICgobm9kZSA9IHJiX2xhc3QoJmJsb2NrX2dyb3VwLT5mcmVlX3NwYWNlX2J5dGVzKSkgIT0gTlVMTCkgeworCQlpbmZvID0gcmJfZW50cnkobm9kZSwgc3RydWN0IGJ0cmZzX2ZyZWVfc3BhY2UsIGJ5dGVzX2luZGV4KTsKKwkJdW5saW5rX2ZyZWVfc3BhY2UoYmxvY2tfZ3JvdXAsIGluZm8pOworCQlrZnJlZShpbmZvKTsKKwkJaWYgKG5lZWRfcmVzY2hlZCgpKSB7CisJCQltdXRleF91bmxvY2soJmJsb2NrX2dyb3VwLT5hbGxvY19tdXRleCk7CisJCQljb25kX3Jlc2NoZWQoKTsKKwkJCW11dGV4X2xvY2soJmJsb2NrX2dyb3VwLT5hbGxvY19tdXRleCk7CisJCX0KKwl9CisJbXV0ZXhfdW5sb2NrKCZibG9ja19ncm91cC0+YWxsb2NfbXV0ZXgpOworfQorCisjaWYgMAorc3RhdGljIHN0cnVjdCBidHJmc19mcmVlX3NwYWNlICpidHJmc19maW5kX2ZyZWVfc3BhY2Vfb2Zmc2V0KHN0cnVjdAorCQkJCQkJICAgICAgYnRyZnNfYmxvY2tfZ3JvdXBfY2FjaGUKKwkJCQkJCSAgICAgICpibG9ja19ncm91cCwgdTY0IG9mZnNldCwKKwkJCQkJCSAgICAgIHU2NCBieXRlcykKK3sKKwlzdHJ1Y3QgYnRyZnNfZnJlZV9zcGFjZSAqcmV0OworCisJbXV0ZXhfbG9jaygmYmxvY2tfZ3JvdXAtPmFsbG9jX211dGV4KTsKKwlyZXQgPSB0cmVlX3NlYXJjaF9vZmZzZXQoJmJsb2NrX2dyb3VwLT5mcmVlX3NwYWNlX29mZnNldCwgb2Zmc2V0LAorCQkJCSBieXRlcywgMCk7CisJbXV0ZXhfdW5sb2NrKCZibG9ja19ncm91cC0+YWxsb2NfbXV0ZXgpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0cnVjdCBidHJmc19mcmVlX3NwYWNlICpidHJmc19maW5kX2ZyZWVfc3BhY2VfYnl0ZXMoc3RydWN0CisJCQkJCQkgICAgIGJ0cmZzX2Jsb2NrX2dyb3VwX2NhY2hlCisJCQkJCQkgICAgICpibG9ja19ncm91cCwgdTY0IG9mZnNldCwKKwkJCQkJCSAgICAgdTY0IGJ5dGVzKQoreworCXN0cnVjdCBidHJmc19mcmVlX3NwYWNlICpyZXQ7CisKKwltdXRleF9sb2NrKCZibG9ja19ncm91cC0+YWxsb2NfbXV0ZXgpOworCisJcmV0ID0gdHJlZV9zZWFyY2hfYnl0ZXMoJmJsb2NrX2dyb3VwLT5mcmVlX3NwYWNlX2J5dGVzLCBvZmZzZXQsIGJ5dGVzKTsKKwltdXRleF91bmxvY2soJmJsb2NrX2dyb3VwLT5hbGxvY19tdXRleCk7CisKKwlyZXR1cm4gcmV0OworfQorI2VuZGlmCisKK3N0cnVjdCBidHJmc19mcmVlX3NwYWNlICpidHJmc19maW5kX2ZyZWVfc3BhY2Uoc3RydWN0IGJ0cmZzX2Jsb2NrX2dyb3VwX2NhY2hlCisJCQkJCSAgICAgICAqYmxvY2tfZ3JvdXAsIHU2NCBvZmZzZXQsCisJCQkJCSAgICAgICB1NjQgYnl0ZXMpCit7CisJc3RydWN0IGJ0cmZzX2ZyZWVfc3BhY2UgKnJldCA9IE5VTEw7CisKKwlyZXQgPSB0cmVlX3NlYXJjaF9vZmZzZXQoJmJsb2NrX2dyb3VwLT5mcmVlX3NwYWNlX29mZnNldCwgb2Zmc2V0LAorCQkJCSBieXRlcywgMCk7CisJaWYgKCFyZXQpCisJCXJldCA9IHRyZWVfc2VhcmNoX2J5dGVzKCZibG9ja19ncm91cC0+ZnJlZV9zcGFjZV9ieXRlcywKKwkJCQkJb2Zmc2V0LCBieXRlcyk7CisKKwlyZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvZnMvYnRyZnMvaGFzaC5oIGIvZnMvYnRyZnMvaGFzaC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhMDIwYjIKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9idHJmcy9oYXNoLmgKQEAgLTAsMCArMSwyNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBPcmFjbGUuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSB2MiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorICogQm9zdG9uLCBNQSAwMjExMTAtMTMwNywgVVNBLgorICovCisKKyNpZm5kZWYgX19IQVNIX18KKyNkZWZpbmUgX19IQVNIX18KKworI2luY2x1ZGUgImNyYzMyYy5oIgorc3RhdGljIGlubGluZSB1NjQgYnRyZnNfbmFtZV9oYXNoKGNvbnN0IGNoYXIgKm5hbWUsIGludCBsZW4pCit7CisJcmV0dXJuIGJ0cmZzX2NyYzMyYygodTMyKX4xLCBuYW1lLCBsZW4pOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9mcy9idHJmcy9pbm9kZS1pdGVtLmMgYi9mcy9idHJmcy9pbm9kZS1pdGVtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Q0NmZhMQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2J0cmZzL2lub2RlLWl0ZW0uYwpAQCAtMCwwICsxLDIwNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBPcmFjbGUuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSB2MiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorICogQm9zdG9uLCBNQSAwMjExMTAtMTMwNywgVVNBLgorICovCisKKyNpbmNsdWRlICJjdHJlZS5oIgorI2luY2x1ZGUgImRpc2staW8uaCIKKyNpbmNsdWRlICJ0cmFuc2FjdGlvbi5oIgorCitzdGF0aWMgaW50IGZpbmRfbmFtZV9pbl9iYWNrcmVmKHN0cnVjdCBidHJmc19wYXRoICpwYXRoLCBjb25zdCBjaGFyICpuYW1lLAorCQkJIGludCBuYW1lX2xlbiwgc3RydWN0IGJ0cmZzX2lub2RlX3JlZiAqKnJlZl9yZXQpCit7CisJc3RydWN0IGV4dGVudF9idWZmZXIgKmxlYWY7CisJc3RydWN0IGJ0cmZzX2lub2RlX3JlZiAqcmVmOworCXVuc2lnbmVkIGxvbmcgcHRyOworCXVuc2lnbmVkIGxvbmcgbmFtZV9wdHI7CisJdTMyIGl0ZW1fc2l6ZTsKKwl1MzIgY3VyX29mZnNldCA9IDA7CisJaW50IGxlbjsKKworCWxlYWYgPSBwYXRoLT5ub2Rlc1swXTsKKwlpdGVtX3NpemUgPSBidHJmc19pdGVtX3NpemVfbnIobGVhZiwgcGF0aC0+c2xvdHNbMF0pOworCXB0ciA9IGJ0cmZzX2l0ZW1fcHRyX29mZnNldChsZWFmLCBwYXRoLT5zbG90c1swXSk7CisJd2hpbGUgKGN1cl9vZmZzZXQgPCBpdGVtX3NpemUpIHsKKwkJcmVmID0gKHN0cnVjdCBidHJmc19pbm9kZV9yZWYgKikocHRyICsgY3VyX29mZnNldCk7CisJCWxlbiA9IGJ0cmZzX2lub2RlX3JlZl9uYW1lX2xlbihsZWFmLCByZWYpOworCQluYW1lX3B0ciA9ICh1bnNpZ25lZCBsb25nKShyZWYgKyAxKTsKKwkJY3VyX29mZnNldCArPSBsZW4gKyBzaXplb2YoKnJlZik7CisJCWlmIChsZW4gIT0gbmFtZV9sZW4pCisJCQljb250aW51ZTsKKwkJaWYgKG1lbWNtcF9leHRlbnRfYnVmZmVyKGxlYWYsIG5hbWUsIG5hbWVfcHRyLCBuYW1lX2xlbikgPT0gMCkgeworCQkJKnJlZl9yZXQgPSByZWY7CisJCQlyZXR1cm4gMTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworaW50IGJ0cmZzX2RlbF9pbm9kZV9yZWYoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCisJCQkgICBzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwKKwkJCSAgIGNvbnN0IGNoYXIgKm5hbWUsIGludCBuYW1lX2xlbiwKKwkJCSAgIHU2NCBpbm9kZV9vYmplY3RpZCwgdTY0IHJlZl9vYmplY3RpZCwgdTY0ICppbmRleCkKK3sKKwlzdHJ1Y3QgYnRyZnNfcGF0aCAqcGF0aDsKKwlzdHJ1Y3QgYnRyZnNfa2V5IGtleTsKKwlzdHJ1Y3QgYnRyZnNfaW5vZGVfcmVmICpyZWY7CisJc3RydWN0IGV4dGVudF9idWZmZXIgKmxlYWY7CisJdW5zaWduZWQgbG9uZyBwdHI7CisJdW5zaWduZWQgbG9uZyBpdGVtX3N0YXJ0OworCXUzMiBpdGVtX3NpemU7CisJdTMyIHN1Yl9pdGVtX2xlbjsKKwlpbnQgcmV0OworCWludCBkZWxfbGVuID0gbmFtZV9sZW4gKyBzaXplb2YoKnJlZik7CisKKwlrZXkub2JqZWN0aWQgPSBpbm9kZV9vYmplY3RpZDsKKwlrZXkub2Zmc2V0ID0gcmVmX29iamVjdGlkOworCWJ0cmZzX3NldF9rZXlfdHlwZSgma2V5LCBCVFJGU19JTk9ERV9SRUZfS0VZKTsKKworCXBhdGggPSBidHJmc19hbGxvY19wYXRoKCk7CisJaWYgKCFwYXRoKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJldCA9IGJ0cmZzX3NlYXJjaF9zbG90KHRyYW5zLCByb290LCAma2V5LCBwYXRoLCAtMSwgMSk7CisJaWYgKHJldCA+IDApIHsKKwkJcmV0ID0gLUVOT0VOVDsKKwkJZ290byBvdXQ7CisJfSBlbHNlIGlmIChyZXQgPCAwKSB7CisJCWdvdG8gb3V0OworCX0KKwlpZiAoIWZpbmRfbmFtZV9pbl9iYWNrcmVmKHBhdGgsIG5hbWUsIG5hbWVfbGVuLCAmcmVmKSkgeworCQlyZXQgPSAtRU5PRU5UOworCQlnb3RvIG91dDsKKwl9CisJbGVhZiA9IHBhdGgtPm5vZGVzWzBdOworCWl0ZW1fc2l6ZSA9IGJ0cmZzX2l0ZW1fc2l6ZV9ucihsZWFmLCBwYXRoLT5zbG90c1swXSk7CisKKwlpZiAoaW5kZXgpCisJCSppbmRleCA9IGJ0cmZzX2lub2RlX3JlZl9pbmRleChsZWFmLCByZWYpOworCisJaWYgKGRlbF9sZW4gPT0gaXRlbV9zaXplKSB7CisJCXJldCA9IGJ0cmZzX2RlbF9pdGVtKHRyYW5zLCByb290LCBwYXRoKTsKKwkJZ290byBvdXQ7CisJfQorCXB0ciA9ICh1bnNpZ25lZCBsb25nKXJlZjsKKwlzdWJfaXRlbV9sZW4gPSBuYW1lX2xlbiArIHNpemVvZigqcmVmKTsKKwlpdGVtX3N0YXJ0ID0gYnRyZnNfaXRlbV9wdHJfb2Zmc2V0KGxlYWYsIHBhdGgtPnNsb3RzWzBdKTsKKwltZW1tb3ZlX2V4dGVudF9idWZmZXIobGVhZiwgcHRyLCBwdHIgKyBzdWJfaXRlbV9sZW4sCisJCQkgICAgICBpdGVtX3NpemUgLSAocHRyICsgc3ViX2l0ZW1fbGVuIC0gaXRlbV9zdGFydCkpOworCXJldCA9IGJ0cmZzX3RydW5jYXRlX2l0ZW0odHJhbnMsIHJvb3QsIHBhdGgsCisJCQkJICBpdGVtX3NpemUgLSBzdWJfaXRlbV9sZW4sIDEpOworCUJVR19PTihyZXQpOworb3V0OgorCWJ0cmZzX2ZyZWVfcGF0aChwYXRoKTsKKwlyZXR1cm4gcmV0OworfQorCitpbnQgYnRyZnNfaW5zZXJ0X2lub2RlX3JlZihzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKKwkJCSAgIHN0cnVjdCBidHJmc19yb290ICpyb290LAorCQkJICAgY29uc3QgY2hhciAqbmFtZSwgaW50IG5hbWVfbGVuLAorCQkJICAgdTY0IGlub2RlX29iamVjdGlkLCB1NjQgcmVmX29iamVjdGlkLCB1NjQgaW5kZXgpCit7CisJc3RydWN0IGJ0cmZzX3BhdGggKnBhdGg7CisJc3RydWN0IGJ0cmZzX2tleSBrZXk7CisJc3RydWN0IGJ0cmZzX2lub2RlX3JlZiAqcmVmOworCXVuc2lnbmVkIGxvbmcgcHRyOworCWludCByZXQ7CisJaW50IGluc19sZW4gPSBuYW1lX2xlbiArIHNpemVvZigqcmVmKTsKKworCWtleS5vYmplY3RpZCA9IGlub2RlX29iamVjdGlkOworCWtleS5vZmZzZXQgPSByZWZfb2JqZWN0aWQ7CisJYnRyZnNfc2V0X2tleV90eXBlKCZrZXksIEJUUkZTX0lOT0RFX1JFRl9LRVkpOworCisJcGF0aCA9IGJ0cmZzX2FsbG9jX3BhdGgoKTsKKwlpZiAoIXBhdGgpCisJCXJldHVybiAtRU5PTUVNOworCisJcmV0ID0gYnRyZnNfaW5zZXJ0X2VtcHR5X2l0ZW0odHJhbnMsIHJvb3QsIHBhdGgsICZrZXksCisJCQkJICAgICAgaW5zX2xlbik7CisJaWYgKHJldCA9PSAtRUVYSVNUKSB7CisJCXUzMiBvbGRfc2l6ZTsKKworCQlpZiAoZmluZF9uYW1lX2luX2JhY2tyZWYocGF0aCwgbmFtZSwgbmFtZV9sZW4sICZyZWYpKQorCQkJZ290byBvdXQ7CisKKwkJb2xkX3NpemUgPSBidHJmc19pdGVtX3NpemVfbnIocGF0aC0+bm9kZXNbMF0sIHBhdGgtPnNsb3RzWzBdKTsKKwkJcmV0ID0gYnRyZnNfZXh0ZW5kX2l0ZW0odHJhbnMsIHJvb3QsIHBhdGgsIGluc19sZW4pOworCQlCVUdfT04ocmV0KTsKKwkJcmVmID0gYnRyZnNfaXRlbV9wdHIocGF0aC0+bm9kZXNbMF0sIHBhdGgtPnNsb3RzWzBdLAorCQkJCSAgICAgc3RydWN0IGJ0cmZzX2lub2RlX3JlZik7CisJCXJlZiA9IChzdHJ1Y3QgYnRyZnNfaW5vZGVfcmVmICopKCh1bnNpZ25lZCBsb25nKXJlZiArIG9sZF9zaXplKTsKKwkJYnRyZnNfc2V0X2lub2RlX3JlZl9uYW1lX2xlbihwYXRoLT5ub2Rlc1swXSwgcmVmLCBuYW1lX2xlbik7CisJCWJ0cmZzX3NldF9pbm9kZV9yZWZfaW5kZXgocGF0aC0+bm9kZXNbMF0sIHJlZiwgaW5kZXgpOworCQlwdHIgPSAodW5zaWduZWQgbG9uZykocmVmICsgMSk7CisJCXJldCA9IDA7CisJfSBlbHNlIGlmIChyZXQgPCAwKSB7CisJCWdvdG8gb3V0OworCX0gZWxzZSB7CisJCXJlZiA9IGJ0cmZzX2l0ZW1fcHRyKHBhdGgtPm5vZGVzWzBdLCBwYXRoLT5zbG90c1swXSwKKwkJCQkgICAgIHN0cnVjdCBidHJmc19pbm9kZV9yZWYpOworCQlidHJmc19zZXRfaW5vZGVfcmVmX25hbWVfbGVuKHBhdGgtPm5vZGVzWzBdLCByZWYsIG5hbWVfbGVuKTsKKwkJYnRyZnNfc2V0X2lub2RlX3JlZl9pbmRleChwYXRoLT5ub2Rlc1swXSwgcmVmLCBpbmRleCk7CisJCXB0ciA9ICh1bnNpZ25lZCBsb25nKShyZWYgKyAxKTsKKwl9CisJd3JpdGVfZXh0ZW50X2J1ZmZlcihwYXRoLT5ub2Rlc1swXSwgbmFtZSwgcHRyLCBuYW1lX2xlbik7CisJYnRyZnNfbWFya19idWZmZXJfZGlydHkocGF0aC0+bm9kZXNbMF0pOworCitvdXQ6CisJYnRyZnNfZnJlZV9wYXRoKHBhdGgpOworCXJldHVybiByZXQ7Cit9CisKK2ludCBidHJmc19pbnNlcnRfZW1wdHlfaW5vZGUoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCisJCQkgICAgIHN0cnVjdCBidHJmc19yb290ICpyb290LAorCQkJICAgICBzdHJ1Y3QgYnRyZnNfcGF0aCAqcGF0aCwgdTY0IG9iamVjdGlkKQoreworCXN0cnVjdCBidHJmc19rZXkga2V5OworCWludCByZXQ7CisJa2V5Lm9iamVjdGlkID0gb2JqZWN0aWQ7CisJYnRyZnNfc2V0X2tleV90eXBlKCZrZXksIEJUUkZTX0lOT0RFX0lURU1fS0VZKTsKKwlrZXkub2Zmc2V0ID0gMDsKKworCXJldCA9IGJ0cmZzX2luc2VydF9lbXB0eV9pdGVtKHRyYW5zLCByb290LCBwYXRoLCAma2V5LAorCQkJCSAgICAgIHNpemVvZihzdHJ1Y3QgYnRyZnNfaW5vZGVfaXRlbSkpOworCWlmIChyZXQgPT0gMCAmJiBvYmplY3RpZCA+IHJvb3QtPmhpZ2hlc3RfaW5vZGUpCisJCXJvb3QtPmhpZ2hlc3RfaW5vZGUgPSBvYmplY3RpZDsKKwlyZXR1cm4gcmV0OworfQorCitpbnQgYnRyZnNfbG9va3VwX2lub2RlKHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLCBzdHJ1Y3QgYnRyZnNfcm9vdAorCQkgICAgICAgKnJvb3QsIHN0cnVjdCBidHJmc19wYXRoICpwYXRoLAorCQkgICAgICAgc3RydWN0IGJ0cmZzX2tleSAqbG9jYXRpb24sIGludCBtb2QpCit7CisJaW50IGluc19sZW4gPSBtb2QgPCAwID8gLTEgOiAwOworCWludCBjb3cgPSBtb2QgIT0gMDsKKwlpbnQgcmV0OworCWludCBzbG90OworCXN0cnVjdCBleHRlbnRfYnVmZmVyICpsZWFmOworCXN0cnVjdCBidHJmc19rZXkgZm91bmRfa2V5OworCisJcmV0ID0gYnRyZnNfc2VhcmNoX3Nsb3QodHJhbnMsIHJvb3QsIGxvY2F0aW9uLCBwYXRoLCBpbnNfbGVuLCBjb3cpOworCWlmIChyZXQgPiAwICYmIGJ0cmZzX2tleV90eXBlKGxvY2F0aW9uKSA9PSBCVFJGU19ST09UX0lURU1fS0VZICYmCisJICAgIGxvY2F0aW9uLT5vZmZzZXQgPT0gKHU2NCktMSAmJiBwYXRoLT5zbG90c1swXSAhPSAwKSB7CisJCXNsb3QgPSBwYXRoLT5zbG90c1swXSAtIDE7CisJCWxlYWYgPSBwYXRoLT5ub2Rlc1swXTsKKwkJYnRyZnNfaXRlbV9rZXlfdG9fY3B1KGxlYWYsICZmb3VuZF9rZXksIHNsb3QpOworCQlpZiAoZm91bmRfa2V5Lm9iamVjdGlkID09IGxvY2F0aW9uLT5vYmplY3RpZCAmJgorCQkgICAgYnRyZnNfa2V5X3R5cGUoJmZvdW5kX2tleSkgPT0gYnRyZnNfa2V5X3R5cGUobG9jYXRpb24pKSB7CisJCQlwYXRoLT5zbG90c1swXS0tOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisJcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL2ZzL2J0cmZzL2lub2RlLW1hcC5jIGIvZnMvYnRyZnMvaW5vZGUtbWFwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmFhNzk4NwotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2J0cmZzL2lub2RlLW1hcC5jCkBAIC0wLDAgKzEsMTQ0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE9yYWNsZS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIHYyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCisgKiBCb3N0b24sIE1BIDAyMTExMC0xMzA3LCBVU0EuCisgKi8KKworI2luY2x1ZGUgImN0cmVlLmgiCisjaW5jbHVkZSAiZGlzay1pby5oIgorI2luY2x1ZGUgInRyYW5zYWN0aW9uLmgiCisKK2ludCBidHJmc19maW5kX2hpZ2hlc3RfaW5vZGUoc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsIHU2NCAqb2JqZWN0aWQpCit7CisJc3RydWN0IGJ0cmZzX3BhdGggKnBhdGg7CisJaW50IHJldDsKKwlzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqbDsKKwlzdHJ1Y3QgYnRyZnNfa2V5IHNlYXJjaF9rZXk7CisJc3RydWN0IGJ0cmZzX2tleSBmb3VuZF9rZXk7CisJaW50IHNsb3Q7CisKKwlwYXRoID0gYnRyZnNfYWxsb2NfcGF0aCgpOworCUJVR19PTighcGF0aCk7CisKKwlzZWFyY2hfa2V5Lm9iamVjdGlkID0gQlRSRlNfTEFTVF9GUkVFX09CSkVDVElEOworCXNlYXJjaF9rZXkudHlwZSA9IC0xOworCXNlYXJjaF9rZXkub2Zmc2V0ID0gKHU2NCktMTsKKwlyZXQgPSBidHJmc19zZWFyY2hfc2xvdChOVUxMLCByb290LCAmc2VhcmNoX2tleSwgcGF0aCwgMCwgMCk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyb3I7CisJQlVHX09OKHJldCA9PSAwKTsKKwlpZiAocGF0aC0+c2xvdHNbMF0gPiAwKSB7CisJCXNsb3QgPSBwYXRoLT5zbG90c1swXSAtIDE7CisJCWwgPSBwYXRoLT5ub2Rlc1swXTsKKwkJYnRyZnNfaXRlbV9rZXlfdG9fY3B1KGwsICZmb3VuZF9rZXksIHNsb3QpOworCQkqb2JqZWN0aWQgPSBmb3VuZF9rZXkub2JqZWN0aWQ7CisJfSBlbHNlIHsKKwkJKm9iamVjdGlkID0gQlRSRlNfRklSU1RfRlJFRV9PQkpFQ1RJRDsKKwl9CisJcmV0ID0gMDsKK2Vycm9yOgorCWJ0cmZzX2ZyZWVfcGF0aChwYXRoKTsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogd2Fsa3MgdGhlIGJ0cmVlIG9mIGFsbG9jYXRlZCBpbm9kZXMgYW5kIGZpbmQgYSBob2xlLgorICovCitpbnQgYnRyZnNfZmluZF9mcmVlX29iamVjdGlkKHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAorCQkJICAgICBzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwKKwkJCSAgICAgdTY0IGRpcmlkLCB1NjQgKm9iamVjdGlkKQoreworCXN0cnVjdCBidHJmc19wYXRoICpwYXRoOworCXN0cnVjdCBidHJmc19rZXkga2V5OworCWludCByZXQ7CisJaW50IHNsb3QgPSAwOworCXU2NCBsYXN0X2lubyA9IDA7CisJaW50IHN0YXJ0X2ZvdW5kOworCXN0cnVjdCBleHRlbnRfYnVmZmVyICpsOworCXN0cnVjdCBidHJmc19rZXkgc2VhcmNoX2tleTsKKwl1NjQgc2VhcmNoX3N0YXJ0ID0gZGlyaWQ7CisKKwltdXRleF9sb2NrKCZyb290LT5vYmplY3RpZF9tdXRleCk7CisJaWYgKHJvb3QtPmxhc3RfaW5vZGVfYWxsb2MgPj0gQlRSRlNfRklSU1RfRlJFRV9PQkpFQ1RJRCAmJgorCSAgICByb290LT5sYXN0X2lub2RlX2FsbG9jIDwgQlRSRlNfTEFTVF9GUkVFX09CSkVDVElEKSB7CisJCSpvYmplY3RpZCA9ICsrcm9vdC0+bGFzdF9pbm9kZV9hbGxvYzsKKwkJbXV0ZXhfdW5sb2NrKCZyb290LT5vYmplY3RpZF9tdXRleCk7CisJCXJldHVybiAwOworCX0KKwlwYXRoID0gYnRyZnNfYWxsb2NfcGF0aCgpOworCUJVR19PTighcGF0aCk7CisJc2VhcmNoX3N0YXJ0ID0gbWF4KHNlYXJjaF9zdGFydCwgQlRSRlNfRklSU1RfRlJFRV9PQkpFQ1RJRCk7CisJc2VhcmNoX2tleS5vYmplY3RpZCA9IHNlYXJjaF9zdGFydDsKKwlzZWFyY2hfa2V5LnR5cGUgPSAwOworCXNlYXJjaF9rZXkub2Zmc2V0ID0gMDsKKworCWJ0cmZzX2luaXRfcGF0aChwYXRoKTsKKwlzdGFydF9mb3VuZCA9IDA7CisJcmV0ID0gYnRyZnNfc2VhcmNoX3Nsb3QodHJhbnMsIHJvb3QsICZzZWFyY2hfa2V5LCBwYXRoLCAwLCAwKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnJvcjsKKworCXdoaWxlICgxKSB7CisJCWwgPSBwYXRoLT5ub2Rlc1swXTsKKwkJc2xvdCA9IHBhdGgtPnNsb3RzWzBdOworCQlpZiAoc2xvdCA+PSBidHJmc19oZWFkZXJfbnJpdGVtcyhsKSkgeworCQkJcmV0ID0gYnRyZnNfbmV4dF9sZWFmKHJvb3QsIHBhdGgpOworCQkJaWYgKHJldCA9PSAwKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKHJldCA8IDApCisJCQkJZ290byBlcnJvcjsKKwkJCWlmICghc3RhcnRfZm91bmQpIHsKKwkJCQkqb2JqZWN0aWQgPSBzZWFyY2hfc3RhcnQ7CisJCQkJc3RhcnRfZm91bmQgPSAxOworCQkJCWdvdG8gZm91bmQ7CisJCQl9CisJCQkqb2JqZWN0aWQgPSBsYXN0X2lubyA+IHNlYXJjaF9zdGFydCA/CisJCQkJbGFzdF9pbm8gOiBzZWFyY2hfc3RhcnQ7CisJCQlnb3RvIGZvdW5kOworCQl9CisJCWJ0cmZzX2l0ZW1fa2V5X3RvX2NwdShsLCAma2V5LCBzbG90KTsKKwkJaWYgKGtleS5vYmplY3RpZCA+PSBzZWFyY2hfc3RhcnQpIHsKKwkJCWlmIChzdGFydF9mb3VuZCkgeworCQkJCWlmIChsYXN0X2lubyA8IHNlYXJjaF9zdGFydCkKKwkJCQkJbGFzdF9pbm8gPSBzZWFyY2hfc3RhcnQ7CisJCQkJaWYgKGtleS5vYmplY3RpZCA+IGxhc3RfaW5vKSB7CisJCQkJCSpvYmplY3RpZCA9IGxhc3RfaW5vOworCQkJCQlnb3RvIGZvdW5kOworCQkJCX0KKwkJCX0gZWxzZSBpZiAoa2V5Lm9iamVjdGlkID4gc2VhcmNoX3N0YXJ0KSB7CisJCQkJKm9iamVjdGlkID0gc2VhcmNoX3N0YXJ0OworCQkJCWdvdG8gZm91bmQ7CisJCQl9CisJCX0KKwkJaWYgKGtleS5vYmplY3RpZCA+PSBCVFJGU19MQVNUX0ZSRUVfT0JKRUNUSUQpCisJCQlicmVhazsKKworCQlzdGFydF9mb3VuZCA9IDE7CisJCWxhc3RfaW5vID0ga2V5Lm9iamVjdGlkICsgMTsKKwkJcGF0aC0+c2xvdHNbMF0rKzsKKwl9CisJQlVHX09OKDEpOworZm91bmQ6CisJYnRyZnNfcmVsZWFzZV9wYXRoKHJvb3QsIHBhdGgpOworCWJ0cmZzX2ZyZWVfcGF0aChwYXRoKTsKKwlCVUdfT04oKm9iamVjdGlkIDwgc2VhcmNoX3N0YXJ0KTsKKwltdXRleF91bmxvY2soJnJvb3QtPm9iamVjdGlkX211dGV4KTsKKwlyZXR1cm4gMDsKK2Vycm9yOgorCWJ0cmZzX3JlbGVhc2VfcGF0aChyb290LCBwYXRoKTsKKwlidHJmc19mcmVlX3BhdGgocGF0aCk7CisJbXV0ZXhfdW5sb2NrKCZyb290LT5vYmplY3RpZF9tdXRleCk7CisJcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL2ZzL2J0cmZzL2lub2RlLmMgYi9mcy9idHJmcy9pbm9kZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhZGZlMDUKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9idHJmcy9pbm9kZS5jCkBAIC0wLDAgKzEsNTAzNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBPcmFjbGUuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSB2MiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorICogQm9zdG9uLCBNQSAwMjExMTAtMTMwNywgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9iaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2JhY2tpbmctZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvbXBhZ2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zd2FwLmg+CisjaW5jbHVkZSA8bGludXgvd3JpdGViYWNrLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdGZzLmg+CisjaW5jbHVkZSA8bGludXgvY29tcGF0Lmg+CisjaW5jbHVkZSA8bGludXgvYml0X3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L3hhdHRyLmg+CisjaW5jbHVkZSA8bGludXgvcG9zaXhfYWNsLmg+CisjaW5jbHVkZSA8bGludXgvZmFsbG9jLmg+CisjaW5jbHVkZSAiY29tcGF0LmgiCisjaW5jbHVkZSAiY3RyZWUuaCIKKyNpbmNsdWRlICJkaXNrLWlvLmgiCisjaW5jbHVkZSAidHJhbnNhY3Rpb24uaCIKKyNpbmNsdWRlICJidHJmc19pbm9kZS5oIgorI2luY2x1ZGUgImlvY3RsLmgiCisjaW5jbHVkZSAicHJpbnQtdHJlZS5oIgorI2luY2x1ZGUgInZvbHVtZXMuaCIKKyNpbmNsdWRlICJvcmRlcmVkLWRhdGEuaCIKKyNpbmNsdWRlICJ4YXR0ci5oIgorI2luY2x1ZGUgInRyZWUtbG9nLmgiCisjaW5jbHVkZSAicmVmLWNhY2hlLmgiCisjaW5jbHVkZSAiY29tcHJlc3Npb24uaCIKKworc3RydWN0IGJ0cmZzX2lnZXRfYXJncyB7CisJdTY0IGlubzsKKwlzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdDsKK307CisKK3N0YXRpYyBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBidHJmc19kaXJfaW5vZGVfb3BlcmF0aW9uczsKK3N0YXRpYyBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBidHJmc19zeW1saW5rX2lub2RlX29wZXJhdGlvbnM7CitzdGF0aWMgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgYnRyZnNfZGlyX3JvX2lub2RlX29wZXJhdGlvbnM7CitzdGF0aWMgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgYnRyZnNfc3BlY2lhbF9pbm9kZV9vcGVyYXRpb25zOworc3RhdGljIHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGJ0cmZzX2ZpbGVfaW5vZGVfb3BlcmF0aW9uczsKK3N0YXRpYyBzdHJ1Y3QgYWRkcmVzc19zcGFjZV9vcGVyYXRpb25zIGJ0cmZzX2FvcHM7CitzdGF0aWMgc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyBidHJmc19zeW1saW5rX2FvcHM7CitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBidHJmc19kaXJfZmlsZV9vcGVyYXRpb25zOworc3RhdGljIHN0cnVjdCBleHRlbnRfaW9fb3BzIGJ0cmZzX2V4dGVudF9pb19vcHM7CisKK3N0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqYnRyZnNfaW5vZGVfY2FjaGVwOworc3RydWN0IGttZW1fY2FjaGUgKmJ0cmZzX3RyYW5zX2hhbmRsZV9jYWNoZXA7CitzdHJ1Y3Qga21lbV9jYWNoZSAqYnRyZnNfdHJhbnNhY3Rpb25fY2FjaGVwOworc3RydWN0IGttZW1fY2FjaGUgKmJ0cmZzX2JpdF9yYWRpeF9jYWNoZXA7CitzdHJ1Y3Qga21lbV9jYWNoZSAqYnRyZnNfcGF0aF9jYWNoZXA7CisKKyNkZWZpbmUgU19TSElGVCAxMgorc3RhdGljIHVuc2lnbmVkIGNoYXIgYnRyZnNfdHlwZV9ieV9tb2RlW1NfSUZNVCA+PiBTX1NISUZUXSA9IHsKKwlbU19JRlJFRyA+PiBTX1NISUZUXQk9IEJUUkZTX0ZUX1JFR19GSUxFLAorCVtTX0lGRElSID4+IFNfU0hJRlRdCT0gQlRSRlNfRlRfRElSLAorCVtTX0lGQ0hSID4+IFNfU0hJRlRdCT0gQlRSRlNfRlRfQ0hSREVWLAorCVtTX0lGQkxLID4+IFNfU0hJRlRdCT0gQlRSRlNfRlRfQkxLREVWLAorCVtTX0lGSUZPID4+IFNfU0hJRlRdCT0gQlRSRlNfRlRfRklGTywKKwlbU19JRlNPQ0sgPj4gU19TSElGVF0JPSBCVFJGU19GVF9TT0NLLAorCVtTX0lGTE5LID4+IFNfU0hJRlRdCT0gQlRSRlNfRlRfU1lNTElOSywKK307CisKK3N0YXRpYyB2b2lkIGJ0cmZzX3RydW5jYXRlKHN0cnVjdCBpbm9kZSAqaW5vZGUpOworc3RhdGljIGludCBidHJmc19maW5pc2hfb3JkZXJlZF9pbyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1NjQgc3RhcnQsIHU2NCBlbmQpOworc3RhdGljIG5vaW5saW5lIGludCBjb3dfZmlsZV9yYW5nZShzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCSAgIHN0cnVjdCBwYWdlICpsb2NrZWRfcGFnZSwKKwkJCQkgICB1NjQgc3RhcnQsIHU2NCBlbmQsIGludCAqcGFnZV9zdGFydGVkLAorCQkJCSAgIHVuc2lnbmVkIGxvbmcgKm5yX3dyaXR0ZW4sIGludCB1bmxvY2spOworCisvKgorICogYSB2ZXJ5IGxhbWUgYXR0ZW1wdCBhdCBzdG9wcGluZyB3cml0ZXMgd2hlbiB0aGUgRlMgaXMgODUlIGZ1bGwuICBUaGVyZQorICogYXJlIGNvdW50bGVzcyB3YXlzIHRoaXMgaXMgaW5jb3JyZWN0LCBidXQgaXQgaXMgYmV0dGVyIHRoYW4gbm90aGluZy4KKyAqLworaW50IGJ0cmZzX2NoZWNrX2ZyZWVfc3BhY2Uoc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsIHU2NCBudW1fcmVxdWlyZWQsCisJCQkgICBpbnQgZm9yX2RlbCkKK3sKKwl1NjQgdG90YWw7CisJdTY0IHVzZWQ7CisJdTY0IHRocmVzaDsKKwlpbnQgcmV0ID0gMDsKKworCXNwaW5fbG9jaygmcm9vdC0+ZnNfaW5mby0+ZGVsYWxsb2NfbG9jayk7CisJdG90YWwgPSBidHJmc19zdXBlcl90b3RhbF9ieXRlcygmcm9vdC0+ZnNfaW5mby0+c3VwZXJfY29weSk7CisJdXNlZCA9IGJ0cmZzX3N1cGVyX2J5dGVzX3VzZWQoJnJvb3QtPmZzX2luZm8tPnN1cGVyX2NvcHkpOworCWlmIChmb3JfZGVsKQorCQl0aHJlc2ggPSB0b3RhbCAqIDkwOworCWVsc2UKKwkJdGhyZXNoID0gdG90YWwgKiA4NTsKKworCWRvX2Rpdih0aHJlc2gsIDEwMCk7CisKKwlpZiAodXNlZCArIHJvb3QtPmZzX2luZm8tPmRlbGFsbG9jX2J5dGVzICsgbnVtX3JlcXVpcmVkID4gdGhyZXNoKQorCQlyZXQgPSAtRU5PU1BDOworCXNwaW5fdW5sb2NrKCZyb290LT5mc19pbmZvLT5kZWxhbGxvY19sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogdGhpcyBkb2VzIGFsbCB0aGUgaGFyZCB3b3JrIGZvciBpbnNlcnRpbmcgYW4gaW5saW5lIGV4dGVudCBpbnRvCisgKiB0aGUgYnRyZWUuICBUaGUgY2FsbGVyIHNob3VsZCBoYXZlIGRvbmUgYSBidHJmc19kcm9wX2V4dGVudHMgc28gdGhhdAorICogbm8gb3ZlcmxhcHBpbmcgaW5saW5lIGl0ZW1zIGV4aXN0IGluIHRoZSBidHJlZQorICovCitzdGF0aWMgbm9pbmxpbmUgaW50IGluc2VydF9pbmxpbmVfZXh0ZW50KHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAorCQkJCXN0cnVjdCBidHJmc19yb290ICpyb290LCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCXU2NCBzdGFydCwgc2l6ZV90IHNpemUsIHNpemVfdCBjb21wcmVzc2VkX3NpemUsCisJCQkJc3RydWN0IHBhZ2UgKipjb21wcmVzc2VkX3BhZ2VzKQoreworCXN0cnVjdCBidHJmc19rZXkga2V5OworCXN0cnVjdCBidHJmc19wYXRoICpwYXRoOworCXN0cnVjdCBleHRlbnRfYnVmZmVyICpsZWFmOworCXN0cnVjdCBwYWdlICpwYWdlID0gTlVMTDsKKwljaGFyICprYWRkcjsKKwl1bnNpZ25lZCBsb25nIHB0cjsKKwlzdHJ1Y3QgYnRyZnNfZmlsZV9leHRlbnRfaXRlbSAqZWk7CisJaW50IGVyciA9IDA7CisJaW50IHJldDsKKwlzaXplX3QgY3VyX3NpemUgPSBzaXplOworCXNpemVfdCBkYXRhc2l6ZTsKKwl1bnNpZ25lZCBsb25nIG9mZnNldDsKKwlpbnQgdXNlX2NvbXByZXNzID0gMDsKKworCWlmIChjb21wcmVzc2VkX3NpemUgJiYgY29tcHJlc3NlZF9wYWdlcykgeworCQl1c2VfY29tcHJlc3MgPSAxOworCQljdXJfc2l6ZSA9IGNvbXByZXNzZWRfc2l6ZTsKKwl9CisKKwlwYXRoID0gYnRyZnNfYWxsb2NfcGF0aCgpOworCWlmICghcGF0aCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlidHJmc19zZXRfdHJhbnNfYmxvY2tfZ3JvdXAodHJhbnMsIGlub2RlKTsKKworCWtleS5vYmplY3RpZCA9IGlub2RlLT5pX2lubzsKKwlrZXkub2Zmc2V0ID0gc3RhcnQ7CisJYnRyZnNfc2V0X2tleV90eXBlKCZrZXksIEJUUkZTX0VYVEVOVF9EQVRBX0tFWSk7CisJZGF0YXNpemUgPSBidHJmc19maWxlX2V4dGVudF9jYWxjX2lubGluZV9zaXplKGN1cl9zaXplKTsKKworCWlub2RlX2FkZF9ieXRlcyhpbm9kZSwgc2l6ZSk7CisJcmV0ID0gYnRyZnNfaW5zZXJ0X2VtcHR5X2l0ZW0odHJhbnMsIHJvb3QsIHBhdGgsICZrZXksCisJCQkJICAgICAgZGF0YXNpemUpOworCUJVR19PTihyZXQpOworCWlmIChyZXQpIHsKKwkJZXJyID0gcmV0OworCQlnb3RvIGZhaWw7CisJfQorCWxlYWYgPSBwYXRoLT5ub2Rlc1swXTsKKwllaSA9IGJ0cmZzX2l0ZW1fcHRyKGxlYWYsIHBhdGgtPnNsb3RzWzBdLAorCQkJICAgIHN0cnVjdCBidHJmc19maWxlX2V4dGVudF9pdGVtKTsKKwlidHJmc19zZXRfZmlsZV9leHRlbnRfZ2VuZXJhdGlvbihsZWFmLCBlaSwgdHJhbnMtPnRyYW5zaWQpOworCWJ0cmZzX3NldF9maWxlX2V4dGVudF90eXBlKGxlYWYsIGVpLCBCVFJGU19GSUxFX0VYVEVOVF9JTkxJTkUpOworCWJ0cmZzX3NldF9maWxlX2V4dGVudF9lbmNyeXB0aW9uKGxlYWYsIGVpLCAwKTsKKwlidHJmc19zZXRfZmlsZV9leHRlbnRfb3RoZXJfZW5jb2RpbmcobGVhZiwgZWksIDApOworCWJ0cmZzX3NldF9maWxlX2V4dGVudF9yYW1fYnl0ZXMobGVhZiwgZWksIHNpemUpOworCXB0ciA9IGJ0cmZzX2ZpbGVfZXh0ZW50X2lubGluZV9zdGFydChlaSk7CisKKwlpZiAodXNlX2NvbXByZXNzKSB7CisJCXN0cnVjdCBwYWdlICpjcGFnZTsKKwkJaW50IGkgPSAwOworCQl3aGlsZSAoY29tcHJlc3NlZF9zaXplID4gMCkgeworCQkJY3BhZ2UgPSBjb21wcmVzc2VkX3BhZ2VzW2ldOworCQkJY3VyX3NpemUgPSBtaW5fdCh1bnNpZ25lZCBsb25nLCBjb21wcmVzc2VkX3NpemUsCisJCQkJICAgICAgIFBBR0VfQ0FDSEVfU0laRSk7CisKKwkJCWthZGRyID0ga21hcChjcGFnZSk7CisJCQl3cml0ZV9leHRlbnRfYnVmZmVyKGxlYWYsIGthZGRyLCBwdHIsIGN1cl9zaXplKTsKKwkJCWt1bm1hcChjcGFnZSk7CisKKwkJCWkrKzsKKwkJCXB0ciArPSBjdXJfc2l6ZTsKKwkJCWNvbXByZXNzZWRfc2l6ZSAtPSBjdXJfc2l6ZTsKKwkJfQorCQlidHJmc19zZXRfZmlsZV9leHRlbnRfY29tcHJlc3Npb24obGVhZiwgZWksCisJCQkJCQkgIEJUUkZTX0NPTVBSRVNTX1pMSUIpOworCX0gZWxzZSB7CisJCXBhZ2UgPSBmaW5kX2dldF9wYWdlKGlub2RlLT5pX21hcHBpbmcsCisJCQkJICAgICBzdGFydCA+PiBQQUdFX0NBQ0hFX1NISUZUKTsKKwkJYnRyZnNfc2V0X2ZpbGVfZXh0ZW50X2NvbXByZXNzaW9uKGxlYWYsIGVpLCAwKTsKKwkJa2FkZHIgPSBrbWFwX2F0b21pYyhwYWdlLCBLTV9VU0VSMCk7CisJCW9mZnNldCA9IHN0YXJ0ICYgKFBBR0VfQ0FDSEVfU0laRSAtIDEpOworCQl3cml0ZV9leHRlbnRfYnVmZmVyKGxlYWYsIGthZGRyICsgb2Zmc2V0LCBwdHIsIHNpemUpOworCQlrdW5tYXBfYXRvbWljKGthZGRyLCBLTV9VU0VSMCk7CisJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKKwl9CisJYnRyZnNfbWFya19idWZmZXJfZGlydHkobGVhZik7CisJYnRyZnNfZnJlZV9wYXRoKHBhdGgpOworCisJQlRSRlNfSShpbm9kZSktPmRpc2tfaV9zaXplID0gaW5vZGUtPmlfc2l6ZTsKKwlidHJmc191cGRhdGVfaW5vZGUodHJhbnMsIHJvb3QsIGlub2RlKTsKKwlyZXR1cm4gMDsKK2ZhaWw6CisJYnRyZnNfZnJlZV9wYXRoKHBhdGgpOworCXJldHVybiBlcnI7Cit9CisKKworLyoKKyAqIGNvbmRpdGlvbmFsbHkgaW5zZXJ0IGFuIGlubGluZSBleHRlbnQgaW50byB0aGUgZmlsZS4gIFRoaXMKKyAqIGRvZXMgdGhlIGNoZWNrcyByZXF1aXJlZCB0byBtYWtlIHN1cmUgdGhlIGRhdGEgaXMgc21hbGwgZW5vdWdoCisgKiB0byBmaXQgYXMgYW4gaW5saW5lIGV4dGVudC4KKyAqLworc3RhdGljIGludCBjb3dfZmlsZV9yYW5nZV9pbmxpbmUoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCisJCQkJIHN0cnVjdCBidHJmc19yb290ICpyb290LAorCQkJCSBzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1NjQgc3RhcnQsIHU2NCBlbmQsCisJCQkJIHNpemVfdCBjb21wcmVzc2VkX3NpemUsCisJCQkJIHN0cnVjdCBwYWdlICoqY29tcHJlc3NlZF9wYWdlcykKK3sKKwl1NjQgaXNpemUgPSBpX3NpemVfcmVhZChpbm9kZSk7CisJdTY0IGFjdHVhbF9lbmQgPSBtaW4oZW5kICsgMSwgaXNpemUpOworCXU2NCBpbmxpbmVfbGVuID0gYWN0dWFsX2VuZCAtIHN0YXJ0OworCXU2NCBhbGlnbmVkX2VuZCA9IChlbmQgKyByb290LT5zZWN0b3JzaXplIC0gMSkgJgorCQkJfigodTY0KXJvb3QtPnNlY3RvcnNpemUgLSAxKTsKKwl1NjQgaGludF9ieXRlOworCXU2NCBkYXRhX2xlbiA9IGlubGluZV9sZW47CisJaW50IHJldDsKKworCWlmIChjb21wcmVzc2VkX3NpemUpCisJCWRhdGFfbGVuID0gY29tcHJlc3NlZF9zaXplOworCisJaWYgKHN0YXJ0ID4gMCB8fAorCSAgICBhY3R1YWxfZW5kID49IFBBR0VfQ0FDSEVfU0laRSB8fAorCSAgICBkYXRhX2xlbiA+PSBCVFJGU19NQVhfSU5MSU5FX0RBVEFfU0laRShyb290KSB8fAorCSAgICAoIWNvbXByZXNzZWRfc2l6ZSAmJgorCSAgICAoYWN0dWFsX2VuZCAmIChyb290LT5zZWN0b3JzaXplIC0gMSkpID09IDApIHx8CisJICAgIGVuZCArIDEgPCBpc2l6ZSB8fAorCSAgICBkYXRhX2xlbiA+IHJvb3QtPmZzX2luZm8tPm1heF9pbmxpbmUpIHsKKwkJcmV0dXJuIDE7CisJfQorCisJcmV0ID0gYnRyZnNfZHJvcF9leHRlbnRzKHRyYW5zLCByb290LCBpbm9kZSwgc3RhcnQsCisJCQkJIGFsaWduZWRfZW5kLCBzdGFydCwgJmhpbnRfYnl0ZSk7CisJQlVHX09OKHJldCk7CisKKwlpZiAoaXNpemUgPiBhY3R1YWxfZW5kKQorCQlpbmxpbmVfbGVuID0gbWluX3QodTY0LCBpc2l6ZSwgYWN0dWFsX2VuZCk7CisJcmV0ID0gaW5zZXJ0X2lubGluZV9leHRlbnQodHJhbnMsIHJvb3QsIGlub2RlLCBzdGFydCwKKwkJCQkgICBpbmxpbmVfbGVuLCBjb21wcmVzc2VkX3NpemUsCisJCQkJICAgY29tcHJlc3NlZF9wYWdlcyk7CisJQlVHX09OKHJldCk7CisJYnRyZnNfZHJvcF9leHRlbnRfY2FjaGUoaW5vZGUsIHN0YXJ0LCBhbGlnbmVkX2VuZCwgMCk7CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBhc3luY19leHRlbnQgeworCXU2NCBzdGFydDsKKwl1NjQgcmFtX3NpemU7CisJdTY0IGNvbXByZXNzZWRfc2l6ZTsKKwlzdHJ1Y3QgcGFnZSAqKnBhZ2VzOworCXVuc2lnbmVkIGxvbmcgbnJfcGFnZXM7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworfTsKKworc3RydWN0IGFzeW5jX2NvdyB7CisJc3RydWN0IGlub2RlICppbm9kZTsKKwlzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdDsKKwlzdHJ1Y3QgcGFnZSAqbG9ja2VkX3BhZ2U7CisJdTY0IHN0YXJ0OworCXU2NCBlbmQ7CisJc3RydWN0IGxpc3RfaGVhZCBleHRlbnRzOworCXN0cnVjdCBidHJmc193b3JrIHdvcms7Cit9OworCitzdGF0aWMgbm9pbmxpbmUgaW50IGFkZF9hc3luY19leHRlbnQoc3RydWN0IGFzeW5jX2NvdyAqY293LAorCQkJCSAgICAgdTY0IHN0YXJ0LCB1NjQgcmFtX3NpemUsCisJCQkJICAgICB1NjQgY29tcHJlc3NlZF9zaXplLAorCQkJCSAgICAgc3RydWN0IHBhZ2UgKipwYWdlcywKKwkJCQkgICAgIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMpCit7CisJc3RydWN0IGFzeW5jX2V4dGVudCAqYXN5bmNfZXh0ZW50OworCisJYXN5bmNfZXh0ZW50ID0ga21hbGxvYyhzaXplb2YoKmFzeW5jX2V4dGVudCksIEdGUF9OT0ZTKTsKKwlhc3luY19leHRlbnQtPnN0YXJ0ID0gc3RhcnQ7CisJYXN5bmNfZXh0ZW50LT5yYW1fc2l6ZSA9IHJhbV9zaXplOworCWFzeW5jX2V4dGVudC0+Y29tcHJlc3NlZF9zaXplID0gY29tcHJlc3NlZF9zaXplOworCWFzeW5jX2V4dGVudC0+cGFnZXMgPSBwYWdlczsKKwlhc3luY19leHRlbnQtPm5yX3BhZ2VzID0gbnJfcGFnZXM7CisJbGlzdF9hZGRfdGFpbCgmYXN5bmNfZXh0ZW50LT5saXN0LCAmY293LT5leHRlbnRzKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIHdlIGNyZWF0ZSBjb21wcmVzc2VkIGV4dGVudHMgaW4gdHdvIHBoYXNlcy4gIFRoZSBmaXJzdAorICogcGhhc2UgY29tcHJlc3NlcyBhIHJhbmdlIG9mIHBhZ2VzIHRoYXQgaGF2ZSBhbHJlYWR5IGJlZW4KKyAqIGxvY2tlZCAoYm90aCBwYWdlcyBhbmQgc3RhdGUgYml0cyBhcmUgbG9ja2VkKS4KKyAqCisgKiBUaGlzIGlzIGRvbmUgaW5zaWRlIGFuIG9yZGVyZWQgd29yayBxdWV1ZSwgYW5kIHRoZSBjb21wcmVzc2lvbgorICogaXMgc3ByZWFkIGFjcm9zcyBtYW55IGNwdXMuICBUaGUgYWN0dWFsIElPIHN1Ym1pc3Npb24gaXMgc3RlcAorICogdHdvLCBhbmQgdGhlIG9yZGVyZWQgd29yayBxdWV1ZSB0YWtlcyBjYXJlIG9mIG1ha2luZyBzdXJlIHRoYXQKKyAqIGhhcHBlbnMgaW4gdGhlIHNhbWUgb3JkZXIgdGhpbmdzIHdlcmUgcHV0IG9udG8gdGhlIHF1ZXVlIGJ5CisgKiB3cml0ZXBhZ2VzIGFuZCBmcmllbmRzLgorICoKKyAqIElmIHRoaXMgY29kZSBmaW5kcyBpdCBjYW4ndCBnZXQgZ29vZCBjb21wcmVzc2lvbiwgaXQgcHV0cyBhbgorICogZW50cnkgb250byB0aGUgd29yayBxdWV1ZSB0byB3cml0ZSB0aGUgdW5jb21wcmVzc2VkIGJ5dGVzLiAgVGhpcworICogbWFrZXMgc3VyZSB0aGF0IGJvdGggY29tcHJlc3NlZCBpbm9kZXMgYW5kIHVuY29tcHJlc3NlZCBpbm9kZXMKKyAqIGFyZSB3cml0dGVuIGluIHRoZSBzYW1lIG9yZGVyIHRoYXQgcGRmbHVzaCBzZW50IHRoZW0gZG93bi4KKyAqLworc3RhdGljIG5vaW5saW5lIGludCBjb21wcmVzc19maWxlX3JhbmdlKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJCXN0cnVjdCBwYWdlICpsb2NrZWRfcGFnZSwKKwkJCQkJdTY0IHN0YXJ0LCB1NjQgZW5kLAorCQkJCQlzdHJ1Y3QgYXN5bmNfY293ICphc3luY19jb3csCisJCQkJCWludCAqbnVtX2FkZGVkKQoreworCXN0cnVjdCBidHJmc19yb290ICpyb290ID0gQlRSRlNfSShpbm9kZSktPnJvb3Q7CisJc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnM7CisJdTY0IG51bV9ieXRlczsKKwl1NjQgb3JpZ19zdGFydDsKKwl1NjQgZGlza19udW1fYnl0ZXM7CisJdTY0IGJsb2Nrc2l6ZSA9IHJvb3QtPnNlY3RvcnNpemU7CisJdTY0IGFjdHVhbF9lbmQ7CisJdTY0IGlzaXplID0gaV9zaXplX3JlYWQoaW5vZGUpOworCWludCByZXQgPSAwOworCXN0cnVjdCBwYWdlICoqcGFnZXMgPSBOVUxMOworCXVuc2lnbmVkIGxvbmcgbnJfcGFnZXM7CisJdW5zaWduZWQgbG9uZyBucl9wYWdlc19yZXQgPSAwOworCXVuc2lnbmVkIGxvbmcgdG90YWxfY29tcHJlc3NlZCA9IDA7CisJdW5zaWduZWQgbG9uZyB0b3RhbF9pbiA9IDA7CisJdW5zaWduZWQgbG9uZyBtYXhfY29tcHJlc3NlZCA9IDEyOCAqIDEwMjQ7CisJdW5zaWduZWQgbG9uZyBtYXhfdW5jb21wcmVzc2VkID0gMTI4ICogMTAyNDsKKwlpbnQgaTsKKwlpbnQgd2lsbF9jb21wcmVzczsKKworCW9yaWdfc3RhcnQgPSBzdGFydDsKKworCWFjdHVhbF9lbmQgPSBtaW5fdCh1NjQsIGlzaXplLCBlbmQgKyAxKTsKK2FnYWluOgorCXdpbGxfY29tcHJlc3MgPSAwOworCW5yX3BhZ2VzID0gKGVuZCA+PiBQQUdFX0NBQ0hFX1NISUZUKSAtIChzdGFydCA+PiBQQUdFX0NBQ0hFX1NISUZUKSArIDE7CisJbnJfcGFnZXMgPSBtaW4obnJfcGFnZXMsICgxMjggKiAxMDI0VUwpIC8gUEFHRV9DQUNIRV9TSVpFKTsKKworCXRvdGFsX2NvbXByZXNzZWQgPSBhY3R1YWxfZW5kIC0gc3RhcnQ7CisKKwkvKiB3ZSB3YW50IHRvIG1ha2Ugc3VyZSB0aGF0IGFtb3VudCBvZiByYW0gcmVxdWlyZWQgdG8gdW5jb21wcmVzcworCSAqIGFuIGV4dGVudCBpcyByZWFzb25hYmxlLCBzbyB3ZSBsaW1pdCB0aGUgdG90YWwgc2l6ZSBpbiByYW0KKwkgKiBvZiBhIGNvbXByZXNzZWQgZXh0ZW50IHRvIDEyOGsuICBUaGlzIGlzIGEgY3J1Y2lhbCBudW1iZXIKKwkgKiBiZWNhdXNlIGl0IGFsc28gY29udHJvbHMgaG93IGVhc2lseSB3ZSBjYW4gc3ByZWFkIHJlYWRzIGFjcm9zcworCSAqIGNwdXMgZm9yIGRlY29tcHJlc3Npb24uCisJICoKKwkgKiBXZSBhbHNvIHdhbnQgdG8gbWFrZSBzdXJlIHRoZSBhbW91bnQgb2YgSU8gcmVxdWlyZWQgdG8gZG8KKwkgKiBhIHJhbmRvbSByZWFkIGlzIHJlYXNvbmFibHkgc21hbGwsIHNvIHdlIGxpbWl0IHRoZSBzaXplIG9mCisJICogYSBjb21wcmVzc2VkIGV4dGVudCB0byAxMjhrLgorCSAqLworCXRvdGFsX2NvbXByZXNzZWQgPSBtaW4odG90YWxfY29tcHJlc3NlZCwgbWF4X3VuY29tcHJlc3NlZCk7CisJbnVtX2J5dGVzID0gKGVuZCAtIHN0YXJ0ICsgYmxvY2tzaXplKSAmIH4oYmxvY2tzaXplIC0gMSk7CisJbnVtX2J5dGVzID0gbWF4KGJsb2Nrc2l6ZSwgIG51bV9ieXRlcyk7CisJZGlza19udW1fYnl0ZXMgPSBudW1fYnl0ZXM7CisJdG90YWxfaW4gPSAwOworCXJldCA9IDA7CisKKwkvKgorCSAqIHdlIGRvIGNvbXByZXNzaW9uIGZvciBtb3VudCAtbyBjb21wcmVzcyBhbmQgd2hlbiB0aGUKKwkgKiBpbm9kZSBoYXMgbm90IGJlZW4gZmxhZ2dlZCBhcyBub2NvbXByZXNzLiAgVGhpcyBmbGFnIGNhbgorCSAqIGNoYW5nZSBhdCBhbnkgdGltZSBpZiB3ZSBkaXNjb3ZlciBiYWQgY29tcHJlc3Npb24gcmF0aW9zLgorCSAqLworCWlmICghYnRyZnNfdGVzdF9mbGFnKGlub2RlLCBOT0NPTVBSRVNTKSAmJgorCSAgICBidHJmc190ZXN0X29wdChyb290LCBDT01QUkVTUykpIHsKKwkJV0FSTl9PTihwYWdlcyk7CisJCXBhZ2VzID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHBhZ2UgKikgKiBucl9wYWdlcywgR0ZQX05PRlMpOworCisJCXJldCA9IGJ0cmZzX3psaWJfY29tcHJlc3NfcGFnZXMoaW5vZGUtPmlfbWFwcGluZywgc3RhcnQsCisJCQkJCQl0b3RhbF9jb21wcmVzc2VkLCBwYWdlcywKKwkJCQkJCW5yX3BhZ2VzLCAmbnJfcGFnZXNfcmV0LAorCQkJCQkJJnRvdGFsX2luLAorCQkJCQkJJnRvdGFsX2NvbXByZXNzZWQsCisJCQkJCQltYXhfY29tcHJlc3NlZCk7CisKKwkJaWYgKCFyZXQpIHsKKwkJCXVuc2lnbmVkIGxvbmcgb2Zmc2V0ID0gdG90YWxfY29tcHJlc3NlZCAmCisJCQkJKFBBR0VfQ0FDSEVfU0laRSAtIDEpOworCQkJc3RydWN0IHBhZ2UgKnBhZ2UgPSBwYWdlc1tucl9wYWdlc19yZXQgLSAxXTsKKwkJCWNoYXIgKmthZGRyOworCisJCQkvKiB6ZXJvIHRoZSB0YWlsIGVuZCBvZiB0aGUgbGFzdCBwYWdlLCB3ZSBtaWdodCBiZQorCQkJICogc2VuZGluZyBpdCBkb3duIHRvIGRpc2sKKwkJCSAqLworCQkJaWYgKG9mZnNldCkgeworCQkJCWthZGRyID0ga21hcF9hdG9taWMocGFnZSwgS01fVVNFUjApOworCQkJCW1lbXNldChrYWRkciArIG9mZnNldCwgMCwKKwkJCQkgICAgICAgUEFHRV9DQUNIRV9TSVpFIC0gb2Zmc2V0KTsKKwkJCQlrdW5tYXBfYXRvbWljKGthZGRyLCBLTV9VU0VSMCk7CisJCQl9CisJCQl3aWxsX2NvbXByZXNzID0gMTsKKwkJfQorCX0KKwlpZiAoc3RhcnQgPT0gMCkgeworCQl0cmFucyA9IGJ0cmZzX2pvaW5fdHJhbnNhY3Rpb24ocm9vdCwgMSk7CisJCUJVR19PTighdHJhbnMpOworCQlidHJmc19zZXRfdHJhbnNfYmxvY2tfZ3JvdXAodHJhbnMsIGlub2RlKTsKKworCQkvKiBsZXRzIHRyeSB0byBtYWtlIGFuIGlubGluZSBleHRlbnQgKi8KKwkJaWYgKHJldCB8fCB0b3RhbF9pbiA8IChhY3R1YWxfZW5kIC0gc3RhcnQpKSB7CisJCQkvKiB3ZSBkaWRuJ3QgY29tcHJlc3MgdGhlIGVudGlyZSByYW5nZSwgdHJ5CisJCQkgKiB0byBtYWtlIGFuIHVuY29tcHJlc3NlZCBpbmxpbmUgZXh0ZW50LgorCQkJICovCisJCQlyZXQgPSBjb3dfZmlsZV9yYW5nZV9pbmxpbmUodHJhbnMsIHJvb3QsIGlub2RlLAorCQkJCQkJICAgIHN0YXJ0LCBlbmQsIDAsIE5VTEwpOworCQl9IGVsc2UgeworCQkJLyogdHJ5IG1ha2luZyBhIGNvbXByZXNzZWQgaW5saW5lIGV4dGVudCAqLworCQkJcmV0ID0gY293X2ZpbGVfcmFuZ2VfaW5saW5lKHRyYW5zLCByb290LCBpbm9kZSwKKwkJCQkJCSAgICBzdGFydCwgZW5kLAorCQkJCQkJICAgIHRvdGFsX2NvbXByZXNzZWQsIHBhZ2VzKTsKKwkJfQorCQlidHJmc19lbmRfdHJhbnNhY3Rpb24odHJhbnMsIHJvb3QpOworCQlpZiAocmV0ID09IDApIHsKKwkJCS8qCisJCQkgKiBpbmxpbmUgZXh0ZW50IGNyZWF0aW9uIHdvcmtlZCwgd2UgZG9uJ3QgbmVlZAorCQkJICogdG8gY3JlYXRlIGFueSBtb3JlIGFzeW5jIHdvcmsgaXRlbXMuICBVbmxvY2sKKwkJCSAqIGFuZCBmcmVlIHVwIG91ciB0ZW1wIHBhZ2VzLgorCQkJICovCisJCQlleHRlbnRfY2xlYXJfdW5sb2NrX2RlbGFsbG9jKGlub2RlLAorCQkJCQkJICAgICAmQlRSRlNfSShpbm9kZSktPmlvX3RyZWUsCisJCQkJCQkgICAgIHN0YXJ0LCBlbmQsIE5VTEwsIDEsIDAsCisJCQkJCQkgICAgIDAsIDEsIDEsIDEpOworCQkJcmV0ID0gMDsKKwkJCWdvdG8gZnJlZV9wYWdlc19vdXQ7CisJCX0KKwl9CisKKwlpZiAod2lsbF9jb21wcmVzcykgeworCQkvKgorCQkgKiB3ZSBhcmVuJ3QgZG9pbmcgYW4gaW5saW5lIGV4dGVudCByb3VuZCB0aGUgY29tcHJlc3NlZCBzaXplCisJCSAqIHVwIHRvIGEgYmxvY2sgc2l6ZSBib3VuZGFyeSBzbyB0aGUgYWxsb2NhdG9yIGRvZXMgc2FuZQorCQkgKiB0aGluZ3MKKwkJICovCisJCXRvdGFsX2NvbXByZXNzZWQgPSAodG90YWxfY29tcHJlc3NlZCArIGJsb2Nrc2l6ZSAtIDEpICYKKwkJCX4oYmxvY2tzaXplIC0gMSk7CisKKwkJLyoKKwkJICogb25lIGxhc3QgY2hlY2sgdG8gbWFrZSBzdXJlIHRoZSBjb21wcmVzc2lvbiBpcyByZWFsbHkgYQorCQkgKiB3aW4sIGNvbXBhcmUgdGhlIHBhZ2UgY291bnQgcmVhZCB3aXRoIHRoZSBibG9ja3Mgb24gZGlzaworCQkgKi8KKwkJdG90YWxfaW4gPSAodG90YWxfaW4gKyBQQUdFX0NBQ0hFX1NJWkUgLSAxKSAmCisJCQl+KFBBR0VfQ0FDSEVfU0laRSAtIDEpOworCQlpZiAodG90YWxfY29tcHJlc3NlZCA+PSB0b3RhbF9pbikgeworCQkJd2lsbF9jb21wcmVzcyA9IDA7CisJCX0gZWxzZSB7CisJCQlkaXNrX251bV9ieXRlcyA9IHRvdGFsX2NvbXByZXNzZWQ7CisJCQludW1fYnl0ZXMgPSB0b3RhbF9pbjsKKwkJfQorCX0KKwlpZiAoIXdpbGxfY29tcHJlc3MgJiYgcGFnZXMpIHsKKwkJLyoKKwkJICogdGhlIGNvbXByZXNzaW9uIGNvZGUgcmFuIGJ1dCBmYWlsZWQgdG8gbWFrZSB0aGluZ3Mgc21hbGxlciwKKwkJICogZnJlZSBhbnkgcGFnZXMgaXQgYWxsb2NhdGVkIGFuZCBvdXIgcGFnZSBwb2ludGVyIGFycmF5CisJCSAqLworCQlmb3IgKGkgPSAwOyBpIDwgbnJfcGFnZXNfcmV0OyBpKyspIHsKKwkJCVdBUk5fT04ocGFnZXNbaV0tPm1hcHBpbmcpOworCQkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2VzW2ldKTsKKwkJfQorCQlrZnJlZShwYWdlcyk7CisJCXBhZ2VzID0gTlVMTDsKKwkJdG90YWxfY29tcHJlc3NlZCA9IDA7CisJCW5yX3BhZ2VzX3JldCA9IDA7CisKKwkJLyogZmxhZyB0aGUgZmlsZSBzbyB3ZSBkb24ndCBjb21wcmVzcyBpbiB0aGUgZnV0dXJlICovCisJCWJ0cmZzX3NldF9mbGFnKGlub2RlLCBOT0NPTVBSRVNTKTsKKwl9CisJaWYgKHdpbGxfY29tcHJlc3MpIHsKKwkJKm51bV9hZGRlZCArPSAxOworCisJCS8qIHRoZSBhc3luYyB3b3JrIHF1ZXVlcyB3aWxsIHRha2UgY2FyZSBvZiBkb2luZyBhY3R1YWwKKwkJICogYWxsb2NhdGlvbiBvbiBkaXNrIGZvciB0aGVzZSBjb21wcmVzc2VkIHBhZ2VzLAorCQkgKiBhbmQgd2lsbCBzdWJtaXQgdGhlbSB0byB0aGUgZWxldmF0b3IuCisJCSAqLworCQlhZGRfYXN5bmNfZXh0ZW50KGFzeW5jX2Nvdywgc3RhcnQsIG51bV9ieXRlcywKKwkJCQkgdG90YWxfY29tcHJlc3NlZCwgcGFnZXMsIG5yX3BhZ2VzX3JldCk7CisKKwkJaWYgKHN0YXJ0ICsgbnVtX2J5dGVzIDwgZW5kICYmIHN0YXJ0ICsgbnVtX2J5dGVzIDwgYWN0dWFsX2VuZCkgeworCQkJc3RhcnQgKz0gbnVtX2J5dGVzOworCQkJcGFnZXMgPSBOVUxMOworCQkJY29uZF9yZXNjaGVkKCk7CisJCQlnb3RvIGFnYWluOworCQl9CisJfSBlbHNlIHsKKwkJLyoKKwkJICogTm8gY29tcHJlc3Npb24sIGJ1dCB3ZSBzdGlsbCBuZWVkIHRvIHdyaXRlIHRoZSBwYWdlcyBpbgorCQkgKiB0aGUgZmlsZSB3ZSd2ZSBiZWVuIGdpdmVuIHNvIGZhci4gIHJlZGlydHkgdGhlIGxvY2tlZAorCQkgKiBwYWdlIGlmIGl0IGNvcnJlc3BvbmRzIHRvIG91ciBleHRlbnQgYW5kIHNldCB0aGluZ3MgdXAKKwkJICogZm9yIHRoZSBhc3luYyB3b3JrIHF1ZXVlIHRvIHJ1biBjb3dfZmlsZV9yYW5nZSB0byBkbworCQkgKiB0aGUgbm9ybWFsIGRlbGFsbG9jIGRhbmNlCisJCSAqLworCQlpZiAocGFnZV9vZmZzZXQobG9ja2VkX3BhZ2UpID49IHN0YXJ0ICYmCisJCSAgICBwYWdlX29mZnNldChsb2NrZWRfcGFnZSkgPD0gZW5kKSB7CisJCQlfX3NldF9wYWdlX2RpcnR5X25vYnVmZmVycyhsb2NrZWRfcGFnZSk7CisJCQkvKiB1bmxvY2tlZCBsYXRlciBvbiBpbiB0aGUgYXN5bmMgaGFuZGxlcnMgKi8KKwkJfQorCQlhZGRfYXN5bmNfZXh0ZW50KGFzeW5jX2Nvdywgc3RhcnQsIGVuZCAtIHN0YXJ0ICsgMSwgMCwgTlVMTCwgMCk7CisJCSpudW1fYWRkZWQgKz0gMTsKKwl9CisKK291dDoKKwlyZXR1cm4gMDsKKworZnJlZV9wYWdlc19vdXQ6CisJZm9yIChpID0gMDsgaSA8IG5yX3BhZ2VzX3JldDsgaSsrKSB7CisJCVdBUk5fT04ocGFnZXNbaV0tPm1hcHBpbmcpOworCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZXNbaV0pOworCX0KKwlrZnJlZShwYWdlcyk7CisKKwlnb3RvIG91dDsKK30KKworLyoKKyAqIHBoYXNlIHR3byBvZiBjb21wcmVzc2VkIHdyaXRlYmFjay4gIFRoaXMgaXMgdGhlIG9yZGVyZWQgcG9ydGlvbgorICogb2YgdGhlIGNvZGUsIHdoaWNoIG9ubHkgZ2V0cyBjYWxsZWQgaW4gdGhlIG9yZGVyIHRoZSB3b3JrIHdhcworICogcXVldWVkLiAgV2Ugd2FsayBhbGwgdGhlIGFzeW5jIGV4dGVudHMgY3JlYXRlZCBieSBjb21wcmVzc19maWxlX3JhbmdlCisgKiBhbmQgc2VuZCB0aGVtIGRvd24gdG8gdGhlIGRpc2suCisgKi8KK3N0YXRpYyBub2lubGluZSBpbnQgc3VibWl0X2NvbXByZXNzZWRfZXh0ZW50cyhzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCQkgICAgICBzdHJ1Y3QgYXN5bmNfY293ICphc3luY19jb3cpCit7CisJc3RydWN0IGFzeW5jX2V4dGVudCAqYXN5bmNfZXh0ZW50OworCXU2NCBhbGxvY19oaW50ID0gMDsKKwlzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFuczsKKwlzdHJ1Y3QgYnRyZnNfa2V5IGluczsKKwlzdHJ1Y3QgZXh0ZW50X21hcCAqZW07CisJc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QgPSBCVFJGU19JKGlub2RlKS0+cm9vdDsKKwlzdHJ1Y3QgZXh0ZW50X21hcF90cmVlICplbV90cmVlID0gJkJUUkZTX0koaW5vZGUpLT5leHRlbnRfdHJlZTsKKwlzdHJ1Y3QgZXh0ZW50X2lvX3RyZWUgKmlvX3RyZWU7CisJaW50IHJldDsKKworCWlmIChsaXN0X2VtcHR5KCZhc3luY19jb3ctPmV4dGVudHMpKQorCQlyZXR1cm4gMDsKKworCXRyYW5zID0gYnRyZnNfam9pbl90cmFuc2FjdGlvbihyb290LCAxKTsKKworCXdoaWxlICghbGlzdF9lbXB0eSgmYXN5bmNfY293LT5leHRlbnRzKSkgeworCQlhc3luY19leHRlbnQgPSBsaXN0X2VudHJ5KGFzeW5jX2Nvdy0+ZXh0ZW50cy5uZXh0LAorCQkJCQkgIHN0cnVjdCBhc3luY19leHRlbnQsIGxpc3QpOworCQlsaXN0X2RlbCgmYXN5bmNfZXh0ZW50LT5saXN0KTsKKworCQlpb190cmVlID0gJkJUUkZTX0koaW5vZGUpLT5pb190cmVlOworCisJCS8qIGRpZCB0aGUgY29tcHJlc3Npb24gY29kZSBmYWxsIGJhY2sgdG8gdW5jb21wcmVzc2VkIElPPyAqLworCQlpZiAoIWFzeW5jX2V4dGVudC0+cGFnZXMpIHsKKwkJCWludCBwYWdlX3N0YXJ0ZWQgPSAwOworCQkJdW5zaWduZWQgbG9uZyBucl93cml0dGVuID0gMDsKKworCQkJbG9ja19leHRlbnQoaW9fdHJlZSwgYXN5bmNfZXh0ZW50LT5zdGFydCwKKwkJCQkgICAgYXN5bmNfZXh0ZW50LT5zdGFydCArCisJCQkJICAgIGFzeW5jX2V4dGVudC0+cmFtX3NpemUgLSAxLCBHRlBfTk9GUyk7CisKKwkJCS8qIGFsbG9jYXRlIGJsb2NrcyAqLworCQkJY293X2ZpbGVfcmFuZ2UoaW5vZGUsIGFzeW5jX2Nvdy0+bG9ja2VkX3BhZ2UsCisJCQkJICAgICAgIGFzeW5jX2V4dGVudC0+c3RhcnQsCisJCQkJICAgICAgIGFzeW5jX2V4dGVudC0+c3RhcnQgKworCQkJCSAgICAgICBhc3luY19leHRlbnQtPnJhbV9zaXplIC0gMSwKKwkJCQkgICAgICAgJnBhZ2Vfc3RhcnRlZCwgJm5yX3dyaXR0ZW4sIDApOworCisJCQkvKgorCQkJICogaWYgcGFnZV9zdGFydGVkLCBjb3dfZmlsZV9yYW5nZSBpbnNlcnRlZCBhbgorCQkJICogaW5saW5lIGV4dGVudCBhbmQgdG9vayBjYXJlIG9mIGFsbCB0aGUgdW5sb2NraW5nCisJCQkgKiBhbmQgSU8gZm9yIHVzLiAgT3RoZXJ3aXNlLCB3ZSBuZWVkIHRvIHN1Ym1pdAorCQkJICogYWxsIHRob3NlIHBhZ2VzIGRvd24gdG8gdGhlIGRyaXZlLgorCQkJICovCisJCQlpZiAoIXBhZ2Vfc3RhcnRlZCkKKwkJCQlleHRlbnRfd3JpdGVfbG9ja2VkX3JhbmdlKGlvX3RyZWUsCisJCQkJCQkgIGlub2RlLCBhc3luY19leHRlbnQtPnN0YXJ0LAorCQkJCQkJICBhc3luY19leHRlbnQtPnN0YXJ0ICsKKwkJCQkJCSAgYXN5bmNfZXh0ZW50LT5yYW1fc2l6ZSAtIDEsCisJCQkJCQkgIGJ0cmZzX2dldF9leHRlbnQsCisJCQkJCQkgIFdCX1NZTkNfQUxMKTsKKwkJCWtmcmVlKGFzeW5jX2V4dGVudCk7CisJCQljb25kX3Jlc2NoZWQoKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJbG9ja19leHRlbnQoaW9fdHJlZSwgYXN5bmNfZXh0ZW50LT5zdGFydCwKKwkJCSAgICBhc3luY19leHRlbnQtPnN0YXJ0ICsgYXN5bmNfZXh0ZW50LT5yYW1fc2l6ZSAtIDEsCisJCQkgICAgR0ZQX05PRlMpOworCQkvKgorCQkgKiBoZXJlIHdlJ3JlIGRvaW5nIGFsbG9jYXRpb24gYW5kIHdyaXRlYmFjayBvZiB0aGUKKwkJICogY29tcHJlc3NlZCBwYWdlcworCQkgKi8KKwkJYnRyZnNfZHJvcF9leHRlbnRfY2FjaGUoaW5vZGUsIGFzeW5jX2V4dGVudC0+c3RhcnQsCisJCQkJCWFzeW5jX2V4dGVudC0+c3RhcnQgKworCQkJCQlhc3luY19leHRlbnQtPnJhbV9zaXplIC0gMSwgMCk7CisKKwkJcmV0ID0gYnRyZnNfcmVzZXJ2ZV9leHRlbnQodHJhbnMsIHJvb3QsCisJCQkJCSAgIGFzeW5jX2V4dGVudC0+Y29tcHJlc3NlZF9zaXplLAorCQkJCQkgICBhc3luY19leHRlbnQtPmNvbXByZXNzZWRfc2l6ZSwKKwkJCQkJICAgMCwgYWxsb2NfaGludCwKKwkJCQkJICAgKHU2NCktMSwgJmlucywgMSk7CisJCUJVR19PTihyZXQpOworCQllbSA9IGFsbG9jX2V4dGVudF9tYXAoR0ZQX05PRlMpOworCQllbS0+c3RhcnQgPSBhc3luY19leHRlbnQtPnN0YXJ0OworCQllbS0+bGVuID0gYXN5bmNfZXh0ZW50LT5yYW1fc2l6ZTsKKwkJZW0tPm9yaWdfc3RhcnQgPSBlbS0+c3RhcnQ7CisKKwkJZW0tPmJsb2NrX3N0YXJ0ID0gaW5zLm9iamVjdGlkOworCQllbS0+YmxvY2tfbGVuID0gaW5zLm9mZnNldDsKKwkJZW0tPmJkZXYgPSByb290LT5mc19pbmZvLT5mc19kZXZpY2VzLT5sYXRlc3RfYmRldjsKKwkJc2V0X2JpdChFWFRFTlRfRkxBR19QSU5ORUQsICZlbS0+ZmxhZ3MpOworCQlzZXRfYml0KEVYVEVOVF9GTEFHX0NPTVBSRVNTRUQsICZlbS0+ZmxhZ3MpOworCisJCXdoaWxlICgxKSB7CisJCQlzcGluX2xvY2soJmVtX3RyZWUtPmxvY2spOworCQkJcmV0ID0gYWRkX2V4dGVudF9tYXBwaW5nKGVtX3RyZWUsIGVtKTsKKwkJCXNwaW5fdW5sb2NrKCZlbV90cmVlLT5sb2NrKTsKKwkJCWlmIChyZXQgIT0gLUVFWElTVCkgeworCQkJCWZyZWVfZXh0ZW50X21hcChlbSk7CisJCQkJYnJlYWs7CisJCQl9CisJCQlidHJmc19kcm9wX2V4dGVudF9jYWNoZShpbm9kZSwgYXN5bmNfZXh0ZW50LT5zdGFydCwKKwkJCQkJCWFzeW5jX2V4dGVudC0+c3RhcnQgKworCQkJCQkJYXN5bmNfZXh0ZW50LT5yYW1fc2l6ZSAtIDEsIDApOworCQl9CisKKwkJcmV0ID0gYnRyZnNfYWRkX29yZGVyZWRfZXh0ZW50KGlub2RlLCBhc3luY19leHRlbnQtPnN0YXJ0LAorCQkJCQkgICAgICAgaW5zLm9iamVjdGlkLAorCQkJCQkgICAgICAgYXN5bmNfZXh0ZW50LT5yYW1fc2l6ZSwKKwkJCQkJICAgICAgIGlucy5vZmZzZXQsCisJCQkJCSAgICAgICBCVFJGU19PUkRFUkVEX0NPTVBSRVNTRUQpOworCQlCVUdfT04ocmV0KTsKKworCQlidHJmc19lbmRfdHJhbnNhY3Rpb24odHJhbnMsIHJvb3QpOworCisJCS8qCisJCSAqIGNsZWFyIGRpcnR5LCBzZXQgd3JpdGViYWNrIGFuZCB1bmxvY2sgdGhlIHBhZ2VzLgorCQkgKi8KKwkJZXh0ZW50X2NsZWFyX3VubG9ja19kZWxhbGxvYyhpbm9kZSwKKwkJCQkJICAgICAmQlRSRlNfSShpbm9kZSktPmlvX3RyZWUsCisJCQkJCSAgICAgYXN5bmNfZXh0ZW50LT5zdGFydCwKKwkJCQkJICAgICBhc3luY19leHRlbnQtPnN0YXJ0ICsKKwkJCQkJICAgICBhc3luY19leHRlbnQtPnJhbV9zaXplIC0gMSwKKwkJCQkJICAgICBOVUxMLCAxLCAxLCAwLCAxLCAxLCAwKTsKKworCQlyZXQgPSBidHJmc19zdWJtaXRfY29tcHJlc3NlZF93cml0ZShpbm9kZSwKKwkJCQkgICAgYXN5bmNfZXh0ZW50LT5zdGFydCwKKwkJCQkgICAgYXN5bmNfZXh0ZW50LT5yYW1fc2l6ZSwKKwkJCQkgICAgaW5zLm9iamVjdGlkLAorCQkJCSAgICBpbnMub2Zmc2V0LCBhc3luY19leHRlbnQtPnBhZ2VzLAorCQkJCSAgICBhc3luY19leHRlbnQtPm5yX3BhZ2VzKTsKKworCQlCVUdfT04ocmV0KTsKKwkJdHJhbnMgPSBidHJmc19qb2luX3RyYW5zYWN0aW9uKHJvb3QsIDEpOworCQlhbGxvY19oaW50ID0gaW5zLm9iamVjdGlkICsgaW5zLm9mZnNldDsKKwkJa2ZyZWUoYXN5bmNfZXh0ZW50KTsKKwkJY29uZF9yZXNjaGVkKCk7CisJfQorCisJYnRyZnNfZW5kX3RyYW5zYWN0aW9uKHRyYW5zLCByb290KTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIHdoZW4gZXh0ZW50X2lvLmMgZmluZHMgYSBkZWxheWVkIGFsbG9jYXRpb24gcmFuZ2UgaW4gdGhlIGZpbGUsCisgKiB0aGUgY2FsbCBiYWNrcyBlbmQgdXAgaW4gdGhpcyBjb2RlLiAgVGhlIGJhc2ljIGlkZWEgaXMgdG8KKyAqIGFsbG9jYXRlIGV4dGVudHMgb24gZGlzayBmb3IgdGhlIHJhbmdlLCBhbmQgY3JlYXRlIG9yZGVyZWQgZGF0YSBzdHJ1Y3RzCisgKiBpbiByYW0gdG8gdHJhY2sgdGhvc2UgZXh0ZW50cy4KKyAqCisgKiBsb2NrZWRfcGFnZSBpcyB0aGUgcGFnZSB0aGF0IHdyaXRlcGFnZSBoYWQgbG9ja2VkIGFscmVhZHkuICBXZSB1c2UKKyAqIGl0IHRvIG1ha2Ugc3VyZSB3ZSBkb24ndCBkbyBleHRyYSBsb2NrcyBvciB1bmxvY2tzLgorICoKKyAqICpwYWdlX3N0YXJ0ZWQgaXMgc2V0IHRvIG9uZSBpZiB3ZSB1bmxvY2sgbG9ja2VkX3BhZ2UgYW5kIGRvIGV2ZXJ5dGhpbmcKKyAqIHJlcXVpcmVkIHRvIHN0YXJ0IElPIG9uIGl0LiAgSXQgbWF5IGJlIGNsZWFuIGFuZCBhbHJlYWR5IGRvbmUgd2l0aAorICogSU8gd2hlbiB3ZSByZXR1cm4uCisgKi8KK3N0YXRpYyBub2lubGluZSBpbnQgY293X2ZpbGVfcmFuZ2Uoc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQkgICBzdHJ1Y3QgcGFnZSAqbG9ja2VkX3BhZ2UsCisJCQkJICAgdTY0IHN0YXJ0LCB1NjQgZW5kLCBpbnQgKnBhZ2Vfc3RhcnRlZCwKKwkJCQkgICB1bnNpZ25lZCBsb25nICpucl93cml0dGVuLAorCQkJCSAgIGludCB1bmxvY2spCit7CisJc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QgPSBCVFJGU19JKGlub2RlKS0+cm9vdDsKKwlzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFuczsKKwl1NjQgYWxsb2NfaGludCA9IDA7CisJdTY0IG51bV9ieXRlczsKKwl1bnNpZ25lZCBsb25nIHJhbV9zaXplOworCXU2NCBkaXNrX251bV9ieXRlczsKKwl1NjQgY3VyX2FsbG9jX3NpemU7CisJdTY0IGJsb2Nrc2l6ZSA9IHJvb3QtPnNlY3RvcnNpemU7CisJdTY0IGFjdHVhbF9lbmQ7CisJdTY0IGlzaXplID0gaV9zaXplX3JlYWQoaW5vZGUpOworCXN0cnVjdCBidHJmc19rZXkgaW5zOworCXN0cnVjdCBleHRlbnRfbWFwICplbTsKKwlzdHJ1Y3QgZXh0ZW50X21hcF90cmVlICplbV90cmVlID0gJkJUUkZTX0koaW5vZGUpLT5leHRlbnRfdHJlZTsKKwlpbnQgcmV0ID0gMDsKKworCXRyYW5zID0gYnRyZnNfam9pbl90cmFuc2FjdGlvbihyb290LCAxKTsKKwlCVUdfT04oIXRyYW5zKTsKKwlidHJmc19zZXRfdHJhbnNfYmxvY2tfZ3JvdXAodHJhbnMsIGlub2RlKTsKKworCWFjdHVhbF9lbmQgPSBtaW5fdCh1NjQsIGlzaXplLCBlbmQgKyAxKTsKKworCW51bV9ieXRlcyA9IChlbmQgLSBzdGFydCArIGJsb2Nrc2l6ZSkgJiB+KGJsb2Nrc2l6ZSAtIDEpOworCW51bV9ieXRlcyA9IG1heChibG9ja3NpemUsICBudW1fYnl0ZXMpOworCWRpc2tfbnVtX2J5dGVzID0gbnVtX2J5dGVzOworCXJldCA9IDA7CisKKwlpZiAoc3RhcnQgPT0gMCkgeworCQkvKiBsZXRzIHRyeSB0byBtYWtlIGFuIGlubGluZSBleHRlbnQgKi8KKwkJcmV0ID0gY293X2ZpbGVfcmFuZ2VfaW5saW5lKHRyYW5zLCByb290LCBpbm9kZSwKKwkJCQkJICAgIHN0YXJ0LCBlbmQsIDAsIE5VTEwpOworCQlpZiAocmV0ID09IDApIHsKKwkJCWV4dGVudF9jbGVhcl91bmxvY2tfZGVsYWxsb2MoaW5vZGUsCisJCQkJCQkgICAgICZCVFJGU19JKGlub2RlKS0+aW9fdHJlZSwKKwkJCQkJCSAgICAgc3RhcnQsIGVuZCwgTlVMTCwgMSwgMSwKKwkJCQkJCSAgICAgMSwgMSwgMSwgMSk7CisJCQkqbnJfd3JpdHRlbiA9ICpucl93cml0dGVuICsKKwkJCSAgICAgKGVuZCAtIHN0YXJ0ICsgUEFHRV9DQUNIRV9TSVpFKSAvIFBBR0VfQ0FDSEVfU0laRTsKKwkJCSpwYWdlX3N0YXJ0ZWQgPSAxOworCQkJcmV0ID0gMDsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCisJQlVHX09OKGRpc2tfbnVtX2J5dGVzID4KKwkgICAgICAgYnRyZnNfc3VwZXJfdG90YWxfYnl0ZXMoJnJvb3QtPmZzX2luZm8tPnN1cGVyX2NvcHkpKTsKKworCWJ0cmZzX2Ryb3BfZXh0ZW50X2NhY2hlKGlub2RlLCBzdGFydCwgc3RhcnQgKyBudW1fYnl0ZXMgLSAxLCAwKTsKKworCXdoaWxlIChkaXNrX251bV9ieXRlcyA+IDApIHsKKwkJY3VyX2FsbG9jX3NpemUgPSBtaW4oZGlza19udW1fYnl0ZXMsIHJvb3QtPmZzX2luZm8tPm1heF9leHRlbnQpOworCQlyZXQgPSBidHJmc19yZXNlcnZlX2V4dGVudCh0cmFucywgcm9vdCwgY3VyX2FsbG9jX3NpemUsCisJCQkJCSAgIHJvb3QtPnNlY3RvcnNpemUsIDAsIGFsbG9jX2hpbnQsCisJCQkJCSAgICh1NjQpLTEsICZpbnMsIDEpOworCQlCVUdfT04ocmV0KTsKKworCQllbSA9IGFsbG9jX2V4dGVudF9tYXAoR0ZQX05PRlMpOworCQllbS0+c3RhcnQgPSBzdGFydDsKKwkJZW0tPm9yaWdfc3RhcnQgPSBlbS0+c3RhcnQ7CisKKwkJcmFtX3NpemUgPSBpbnMub2Zmc2V0OworCQllbS0+bGVuID0gaW5zLm9mZnNldDsKKworCQllbS0+YmxvY2tfc3RhcnQgPSBpbnMub2JqZWN0aWQ7CisJCWVtLT5ibG9ja19sZW4gPSBpbnMub2Zmc2V0OworCQllbS0+YmRldiA9IHJvb3QtPmZzX2luZm8tPmZzX2RldmljZXMtPmxhdGVzdF9iZGV2OworCQlzZXRfYml0KEVYVEVOVF9GTEFHX1BJTk5FRCwgJmVtLT5mbGFncyk7CisKKwkJd2hpbGUgKDEpIHsKKwkJCXNwaW5fbG9jaygmZW1fdHJlZS0+bG9jayk7CisJCQlyZXQgPSBhZGRfZXh0ZW50X21hcHBpbmcoZW1fdHJlZSwgZW0pOworCQkJc3Bpbl91bmxvY2soJmVtX3RyZWUtPmxvY2spOworCQkJaWYgKHJldCAhPSAtRUVYSVNUKSB7CisJCQkJZnJlZV9leHRlbnRfbWFwKGVtKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWJ0cmZzX2Ryb3BfZXh0ZW50X2NhY2hlKGlub2RlLCBzdGFydCwKKwkJCQkJCXN0YXJ0ICsgcmFtX3NpemUgLSAxLCAwKTsKKwkJfQorCisJCWN1cl9hbGxvY19zaXplID0gaW5zLm9mZnNldDsKKwkJcmV0ID0gYnRyZnNfYWRkX29yZGVyZWRfZXh0ZW50KGlub2RlLCBzdGFydCwgaW5zLm9iamVjdGlkLAorCQkJCQkgICAgICAgcmFtX3NpemUsIGN1cl9hbGxvY19zaXplLCAwKTsKKwkJQlVHX09OKHJldCk7CisKKwkJaWYgKHJvb3QtPnJvb3Rfa2V5Lm9iamVjdGlkID09CisJCSAgICBCVFJGU19EQVRBX1JFTE9DX1RSRUVfT0JKRUNUSUQpIHsKKwkJCXJldCA9IGJ0cmZzX3JlbG9jX2Nsb25lX2NzdW1zKGlub2RlLCBzdGFydCwKKwkJCQkJCSAgICAgIGN1cl9hbGxvY19zaXplKTsKKwkJCUJVR19PTihyZXQpOworCQl9CisKKwkJaWYgKGRpc2tfbnVtX2J5dGVzIDwgY3VyX2FsbG9jX3NpemUpCisJCQlicmVhazsKKworCQkvKiB3ZSdyZSBub3QgZG9pbmcgY29tcHJlc3NlZCBJTywgZG9uJ3QgdW5sb2NrIHRoZSBmaXJzdAorCQkgKiBwYWdlICh3aGljaCB0aGUgY2FsbGVyIGV4cGVjdHMgdG8gc3RheSBsb2NrZWQpLCBkb24ndAorCQkgKiBjbGVhciBhbnkgZGlydHkgYml0cyBhbmQgZG9uJ3Qgc2V0IGFueSB3cml0ZWJhY2sgYml0cworCQkgKi8KKwkJZXh0ZW50X2NsZWFyX3VubG9ja19kZWxhbGxvYyhpbm9kZSwgJkJUUkZTX0koaW5vZGUpLT5pb190cmVlLAorCQkJCQkgICAgIHN0YXJ0LCBzdGFydCArIHJhbV9zaXplIC0gMSwKKwkJCQkJICAgICBsb2NrZWRfcGFnZSwgdW5sb2NrLCAxLAorCQkJCQkgICAgIDEsIDAsIDAsIDApOworCQlkaXNrX251bV9ieXRlcyAtPSBjdXJfYWxsb2Nfc2l6ZTsKKwkJbnVtX2J5dGVzIC09IGN1cl9hbGxvY19zaXplOworCQlhbGxvY19oaW50ID0gaW5zLm9iamVjdGlkICsgaW5zLm9mZnNldDsKKwkJc3RhcnQgKz0gY3VyX2FsbG9jX3NpemU7CisJfQorb3V0OgorCXJldCA9IDA7CisJYnRyZnNfZW5kX3RyYW5zYWN0aW9uKHRyYW5zLCByb290KTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiB3b3JrIHF1ZXVlIGNhbGwgYmFjayB0byBzdGFydGVkIGNvbXByZXNzaW9uIG9uIGEgZmlsZSBhbmQgcGFnZXMKKyAqLworc3RhdGljIG5vaW5saW5lIHZvaWQgYXN5bmNfY293X3N0YXJ0KHN0cnVjdCBidHJmc193b3JrICp3b3JrKQoreworCXN0cnVjdCBhc3luY19jb3cgKmFzeW5jX2NvdzsKKwlpbnQgbnVtX2FkZGVkID0gMDsKKwlhc3luY19jb3cgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGFzeW5jX2Nvdywgd29yayk7CisKKwljb21wcmVzc19maWxlX3JhbmdlKGFzeW5jX2Nvdy0+aW5vZGUsIGFzeW5jX2Nvdy0+bG9ja2VkX3BhZ2UsCisJCQkgICAgYXN5bmNfY293LT5zdGFydCwgYXN5bmNfY293LT5lbmQsIGFzeW5jX2NvdywKKwkJCSAgICAmbnVtX2FkZGVkKTsKKwlpZiAobnVtX2FkZGVkID09IDApCisJCWFzeW5jX2Nvdy0+aW5vZGUgPSBOVUxMOworfQorCisvKgorICogd29yayBxdWV1ZSBjYWxsIGJhY2sgdG8gc3VibWl0IHByZXZpb3VzbHkgY29tcHJlc3NlZCBwYWdlcworICovCitzdGF0aWMgbm9pbmxpbmUgdm9pZCBhc3luY19jb3dfc3VibWl0KHN0cnVjdCBidHJmc193b3JrICp3b3JrKQoreworCXN0cnVjdCBhc3luY19jb3cgKmFzeW5jX2NvdzsKKwlzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdDsKKwl1bnNpZ25lZCBsb25nIG5yX3BhZ2VzOworCisJYXN5bmNfY293ID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBhc3luY19jb3csIHdvcmspOworCisJcm9vdCA9IGFzeW5jX2Nvdy0+cm9vdDsKKwlucl9wYWdlcyA9IChhc3luY19jb3ctPmVuZCAtIGFzeW5jX2Nvdy0+c3RhcnQgKyBQQUdFX0NBQ0hFX1NJWkUpID4+CisJCVBBR0VfQ0FDSEVfU0hJRlQ7CisKKwlhdG9taWNfc3ViKG5yX3BhZ2VzLCAmcm9vdC0+ZnNfaW5mby0+YXN5bmNfZGVsYWxsb2NfcGFnZXMpOworCisJaWYgKGF0b21pY19yZWFkKCZyb290LT5mc19pbmZvLT5hc3luY19kZWxhbGxvY19wYWdlcykgPAorCSAgICA1ICogMTA0MiAqIDEwMjQgJiYKKwkgICAgd2FpdHF1ZXVlX2FjdGl2ZSgmcm9vdC0+ZnNfaW5mby0+YXN5bmNfc3VibWl0X3dhaXQpKQorCQl3YWtlX3VwKCZyb290LT5mc19pbmZvLT5hc3luY19zdWJtaXRfd2FpdCk7CisKKwlpZiAoYXN5bmNfY293LT5pbm9kZSkKKwkJc3VibWl0X2NvbXByZXNzZWRfZXh0ZW50cyhhc3luY19jb3ctPmlub2RlLCBhc3luY19jb3cpOworfQorCitzdGF0aWMgbm9pbmxpbmUgdm9pZCBhc3luY19jb3dfZnJlZShzdHJ1Y3QgYnRyZnNfd29yayAqd29yaykKK3sKKwlzdHJ1Y3QgYXN5bmNfY293ICphc3luY19jb3c7CisJYXN5bmNfY293ID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBhc3luY19jb3csIHdvcmspOworCWtmcmVlKGFzeW5jX2Nvdyk7Cit9CisKK3N0YXRpYyBpbnQgY293X2ZpbGVfcmFuZ2VfYXN5bmMoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IHBhZ2UgKmxvY2tlZF9wYWdlLAorCQkJCXU2NCBzdGFydCwgdTY0IGVuZCwgaW50ICpwYWdlX3N0YXJ0ZWQsCisJCQkJdW5zaWduZWQgbG9uZyAqbnJfd3JpdHRlbikKK3sKKwlzdHJ1Y3QgYXN5bmNfY293ICphc3luY19jb3c7CisJc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QgPSBCVFJGU19JKGlub2RlKS0+cm9vdDsKKwl1bnNpZ25lZCBsb25nIG5yX3BhZ2VzOworCXU2NCBjdXJfZW5kOworCWludCBsaW1pdCA9IDEwICogMTAyNCAqIDEwNDI7CisKKwlpZiAoIWJ0cmZzX3Rlc3Rfb3B0KHJvb3QsIENPTVBSRVNTKSkgeworCQlyZXR1cm4gY293X2ZpbGVfcmFuZ2UoaW5vZGUsIGxvY2tlZF9wYWdlLCBzdGFydCwgZW5kLAorCQkJCSAgICAgIHBhZ2Vfc3RhcnRlZCwgbnJfd3JpdHRlbiwgMSk7CisJfQorCisJY2xlYXJfZXh0ZW50X2JpdCgmQlRSRlNfSShpbm9kZSktPmlvX3RyZWUsIHN0YXJ0LCBlbmQsIEVYVEVOVF9MT0NLRUQgfAorCQkJIEVYVEVOVF9ERUxBTExPQywgMSwgMCwgR0ZQX05PRlMpOworCXdoaWxlIChzdGFydCA8IGVuZCkgeworCQlhc3luY19jb3cgPSBrbWFsbG9jKHNpemVvZigqYXN5bmNfY293KSwgR0ZQX05PRlMpOworCQlhc3luY19jb3ctPmlub2RlID0gaW5vZGU7CisJCWFzeW5jX2Nvdy0+cm9vdCA9IHJvb3Q7CisJCWFzeW5jX2Nvdy0+bG9ja2VkX3BhZ2UgPSBsb2NrZWRfcGFnZTsKKwkJYXN5bmNfY293LT5zdGFydCA9IHN0YXJ0OworCisJCWlmIChidHJmc190ZXN0X2ZsYWcoaW5vZGUsIE5PQ09NUFJFU1MpKQorCQkJY3VyX2VuZCA9IGVuZDsKKwkJZWxzZQorCQkJY3VyX2VuZCA9IG1pbihlbmQsIHN0YXJ0ICsgNTEyICogMTAyNCAtIDEpOworCisJCWFzeW5jX2Nvdy0+ZW5kID0gY3VyX2VuZDsKKwkJSU5JVF9MSVNUX0hFQUQoJmFzeW5jX2Nvdy0+ZXh0ZW50cyk7CisKKwkJYXN5bmNfY293LT53b3JrLmZ1bmMgPSBhc3luY19jb3dfc3RhcnQ7CisJCWFzeW5jX2Nvdy0+d29yay5vcmRlcmVkX2Z1bmMgPSBhc3luY19jb3dfc3VibWl0OworCQlhc3luY19jb3ctPndvcmsub3JkZXJlZF9mcmVlID0gYXN5bmNfY293X2ZyZWU7CisJCWFzeW5jX2Nvdy0+d29yay5mbGFncyA9IDA7CisKKwkJbnJfcGFnZXMgPSAoY3VyX2VuZCAtIHN0YXJ0ICsgUEFHRV9DQUNIRV9TSVpFKSA+PgorCQkJUEFHRV9DQUNIRV9TSElGVDsKKwkJYXRvbWljX2FkZChucl9wYWdlcywgJnJvb3QtPmZzX2luZm8tPmFzeW5jX2RlbGFsbG9jX3BhZ2VzKTsKKworCQlidHJmc19xdWV1ZV93b3JrZXIoJnJvb3QtPmZzX2luZm8tPmRlbGFsbG9jX3dvcmtlcnMsCisJCQkJICAgJmFzeW5jX2Nvdy0+d29yayk7CisKKwkJaWYgKGF0b21pY19yZWFkKCZyb290LT5mc19pbmZvLT5hc3luY19kZWxhbGxvY19wYWdlcykgPiBsaW1pdCkgeworCQkJd2FpdF9ldmVudChyb290LT5mc19pbmZvLT5hc3luY19zdWJtaXRfd2FpdCwKKwkJCSAgIChhdG9taWNfcmVhZCgmcm9vdC0+ZnNfaW5mby0+YXN5bmNfZGVsYWxsb2NfcGFnZXMpIDwKKwkJCSAgICBsaW1pdCkpOworCQl9CisKKwkJd2hpbGUgKGF0b21pY19yZWFkKCZyb290LT5mc19pbmZvLT5hc3luY19zdWJtaXRfZHJhaW5pbmcpICYmCisJCSAgICAgIGF0b21pY19yZWFkKCZyb290LT5mc19pbmZvLT5hc3luY19kZWxhbGxvY19wYWdlcykpIHsKKwkJCXdhaXRfZXZlbnQocm9vdC0+ZnNfaW5mby0+YXN5bmNfc3VibWl0X3dhaXQsCisJCQkgIChhdG9taWNfcmVhZCgmcm9vdC0+ZnNfaW5mby0+YXN5bmNfZGVsYWxsb2NfcGFnZXMpID09CisJCQkgICAwKSk7CisJCX0KKworCQkqbnJfd3JpdHRlbiArPSBucl9wYWdlczsKKwkJc3RhcnQgPSBjdXJfZW5kICsgMTsKKwl9CisJKnBhZ2Vfc3RhcnRlZCA9IDE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBub2lubGluZSBpbnQgY3N1bV9leGlzdF9pbl9yYW5nZShzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwKKwkJCQkJdTY0IGJ5dGVuciwgdTY0IG51bV9ieXRlcykKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBidHJmc19vcmRlcmVkX3N1bSAqc3VtczsKKwlMSVNUX0hFQUQobGlzdCk7CisKKwlyZXQgPSBidHJmc19sb29rdXBfY3N1bXNfcmFuZ2Uocm9vdC0+ZnNfaW5mby0+Y3N1bV9yb290LCBieXRlbnIsCisJCQkJICAgICAgIGJ5dGVuciArIG51bV9ieXRlcyAtIDEsICZsaXN0KTsKKwlpZiAocmV0ID09IDAgJiYgbGlzdF9lbXB0eSgmbGlzdCkpCisJCXJldHVybiAwOworCisJd2hpbGUgKCFsaXN0X2VtcHR5KCZsaXN0KSkgeworCQlzdW1zID0gbGlzdF9lbnRyeShsaXN0Lm5leHQsIHN0cnVjdCBidHJmc19vcmRlcmVkX3N1bSwgbGlzdCk7CisJCWxpc3RfZGVsKCZzdW1zLT5saXN0KTsKKwkJa2ZyZWUoc3Vtcyk7CisJfQorCXJldHVybiAxOworfQorCisvKgorICogd2hlbiBub3djb3cgd3JpdGViYWNrIGNhbGwgYmFjay4gIFRoaXMgY2hlY2tzIGZvciBzbmFwc2hvdHMgb3IgQ09XIGNvcGllcworICogb2YgdGhlIGV4dGVudHMgdGhhdCBleGlzdCBpbiB0aGUgZmlsZSwgYW5kIENPV3MgdGhlIGZpbGUgYXMgcmVxdWlyZWQuCisgKgorICogSWYgbm8gY293IGNvcGllcyBvciBzbmFwc2hvdHMgZXhpc3QsIHdlIHdyaXRlIGRpcmVjdGx5IHRvIHRoZSBleGlzdGluZworICogYmxvY2tzIG9uIGRpc2sKKyAqLworc3RhdGljIGludCBydW5fZGVsYWxsb2Nfbm9jb3coc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IHBhZ2UgKmxvY2tlZF9wYWdlLAorCQkJICAgICAgdTY0IHN0YXJ0LCB1NjQgZW5kLCBpbnQgKnBhZ2Vfc3RhcnRlZCwgaW50IGZvcmNlLAorCQkJICAgICAgdW5zaWduZWQgbG9uZyAqbnJfd3JpdHRlbikKK3sKKwlzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCA9IEJUUkZTX0koaW5vZGUpLT5yb290OworCXN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zOworCXN0cnVjdCBleHRlbnRfYnVmZmVyICpsZWFmOworCXN0cnVjdCBidHJmc19wYXRoICpwYXRoOworCXN0cnVjdCBidHJmc19maWxlX2V4dGVudF9pdGVtICpmaTsKKwlzdHJ1Y3QgYnRyZnNfa2V5IGZvdW5kX2tleTsKKwl1NjQgY293X3N0YXJ0OworCXU2NCBjdXJfb2Zmc2V0OworCXU2NCBleHRlbnRfZW5kOworCXU2NCBkaXNrX2J5dGVucjsKKwl1NjQgbnVtX2J5dGVzOworCWludCBleHRlbnRfdHlwZTsKKwlpbnQgcmV0OworCWludCB0eXBlOworCWludCBub2NvdzsKKwlpbnQgY2hlY2tfcHJldiA9IDE7CisKKwlwYXRoID0gYnRyZnNfYWxsb2NfcGF0aCgpOworCUJVR19PTighcGF0aCk7CisJdHJhbnMgPSBidHJmc19qb2luX3RyYW5zYWN0aW9uKHJvb3QsIDEpOworCUJVR19PTighdHJhbnMpOworCisJY293X3N0YXJ0ID0gKHU2NCktMTsKKwljdXJfb2Zmc2V0ID0gc3RhcnQ7CisJd2hpbGUgKDEpIHsKKwkJcmV0ID0gYnRyZnNfbG9va3VwX2ZpbGVfZXh0ZW50KHRyYW5zLCByb290LCBwYXRoLCBpbm9kZS0+aV9pbm8sCisJCQkJCSAgICAgICBjdXJfb2Zmc2V0LCAwKTsKKwkJQlVHX09OKHJldCA8IDApOworCQlpZiAocmV0ID4gMCAmJiBwYXRoLT5zbG90c1swXSA+IDAgJiYgY2hlY2tfcHJldikgeworCQkJbGVhZiA9IHBhdGgtPm5vZGVzWzBdOworCQkJYnRyZnNfaXRlbV9rZXlfdG9fY3B1KGxlYWYsICZmb3VuZF9rZXksCisJCQkJCSAgICAgIHBhdGgtPnNsb3RzWzBdIC0gMSk7CisJCQlpZiAoZm91bmRfa2V5Lm9iamVjdGlkID09IGlub2RlLT5pX2lubyAmJgorCQkJICAgIGZvdW5kX2tleS50eXBlID09IEJUUkZTX0VYVEVOVF9EQVRBX0tFWSkKKwkJCQlwYXRoLT5zbG90c1swXS0tOworCQl9CisJCWNoZWNrX3ByZXYgPSAwOworbmV4dF9zbG90OgorCQlsZWFmID0gcGF0aC0+bm9kZXNbMF07CisJCWlmIChwYXRoLT5zbG90c1swXSA+PSBidHJmc19oZWFkZXJfbnJpdGVtcyhsZWFmKSkgeworCQkJcmV0ID0gYnRyZnNfbmV4dF9sZWFmKHJvb3QsIHBhdGgpOworCQkJaWYgKHJldCA8IDApCisJCQkJQlVHX09OKDEpOworCQkJaWYgKHJldCA+IDApCisJCQkJYnJlYWs7CisJCQlsZWFmID0gcGF0aC0+bm9kZXNbMF07CisJCX0KKworCQlub2NvdyA9IDA7CisJCWRpc2tfYnl0ZW5yID0gMDsKKwkJbnVtX2J5dGVzID0gMDsKKwkJYnRyZnNfaXRlbV9rZXlfdG9fY3B1KGxlYWYsICZmb3VuZF9rZXksIHBhdGgtPnNsb3RzWzBdKTsKKworCQlpZiAoZm91bmRfa2V5Lm9iamVjdGlkID4gaW5vZGUtPmlfaW5vIHx8CisJCSAgICBmb3VuZF9rZXkudHlwZSA+IEJUUkZTX0VYVEVOVF9EQVRBX0tFWSB8fAorCQkgICAgZm91bmRfa2V5Lm9mZnNldCA+IGVuZCkKKwkJCWJyZWFrOworCisJCWlmIChmb3VuZF9rZXkub2Zmc2V0ID4gY3VyX29mZnNldCkgeworCQkJZXh0ZW50X2VuZCA9IGZvdW5kX2tleS5vZmZzZXQ7CisJCQlnb3RvIG91dF9jaGVjazsKKwkJfQorCisJCWZpID0gYnRyZnNfaXRlbV9wdHIobGVhZiwgcGF0aC0+c2xvdHNbMF0sCisJCQkJICAgIHN0cnVjdCBidHJmc19maWxlX2V4dGVudF9pdGVtKTsKKwkJZXh0ZW50X3R5cGUgPSBidHJmc19maWxlX2V4dGVudF90eXBlKGxlYWYsIGZpKTsKKworCQlpZiAoZXh0ZW50X3R5cGUgPT0gQlRSRlNfRklMRV9FWFRFTlRfUkVHIHx8CisJCSAgICBleHRlbnRfdHlwZSA9PSBCVFJGU19GSUxFX0VYVEVOVF9QUkVBTExPQykgeworCQkJZGlza19ieXRlbnIgPSBidHJmc19maWxlX2V4dGVudF9kaXNrX2J5dGVucihsZWFmLCBmaSk7CisJCQlleHRlbnRfZW5kID0gZm91bmRfa2V5Lm9mZnNldCArCisJCQkJYnRyZnNfZmlsZV9leHRlbnRfbnVtX2J5dGVzKGxlYWYsIGZpKTsKKwkJCWlmIChleHRlbnRfZW5kIDw9IHN0YXJ0KSB7CisJCQkJcGF0aC0+c2xvdHNbMF0rKzsKKwkJCQlnb3RvIG5leHRfc2xvdDsKKwkJCX0KKwkJCWlmIChkaXNrX2J5dGVuciA9PSAwKQorCQkJCWdvdG8gb3V0X2NoZWNrOworCQkJaWYgKGJ0cmZzX2ZpbGVfZXh0ZW50X2NvbXByZXNzaW9uKGxlYWYsIGZpKSB8fAorCQkJICAgIGJ0cmZzX2ZpbGVfZXh0ZW50X2VuY3J5cHRpb24obGVhZiwgZmkpIHx8CisJCQkgICAgYnRyZnNfZmlsZV9leHRlbnRfb3RoZXJfZW5jb2RpbmcobGVhZiwgZmkpKQorCQkJCWdvdG8gb3V0X2NoZWNrOworCQkJaWYgKGV4dGVudF90eXBlID09IEJUUkZTX0ZJTEVfRVhURU5UX1JFRyAmJiAhZm9yY2UpCisJCQkJZ290byBvdXRfY2hlY2s7CisJCQlpZiAoYnRyZnNfZXh0ZW50X3JlYWRvbmx5KHJvb3QsIGRpc2tfYnl0ZW5yKSkKKwkJCQlnb3RvIG91dF9jaGVjazsKKwkJCWlmIChidHJmc19jcm9zc19yZWZfZXhpc3QodHJhbnMsIHJvb3QsIGlub2RlLT5pX2lubywKKwkJCQkJCSAgZGlza19ieXRlbnIpKQorCQkJCWdvdG8gb3V0X2NoZWNrOworCQkJZGlza19ieXRlbnIgKz0gYnRyZnNfZmlsZV9leHRlbnRfb2Zmc2V0KGxlYWYsIGZpKTsKKwkJCWRpc2tfYnl0ZW5yICs9IGN1cl9vZmZzZXQgLSBmb3VuZF9rZXkub2Zmc2V0OworCQkJbnVtX2J5dGVzID0gbWluKGVuZCArIDEsIGV4dGVudF9lbmQpIC0gY3VyX29mZnNldDsKKwkJCS8qCisJCQkgKiBmb3JjZSBjb3cgaWYgY3N1bSBleGlzdHMgaW4gdGhlIHJhbmdlLgorCQkJICogdGhpcyBlbnN1cmUgdGhhdCBjc3VtIGZvciBhIGdpdmVuIGV4dGVudCBhcmUKKwkJCSAqIGVpdGhlciB2YWxpZCBvciBkbyBub3QgZXhpc3QuCisJCQkgKi8KKwkJCWlmIChjc3VtX2V4aXN0X2luX3JhbmdlKHJvb3QsIGRpc2tfYnl0ZW5yLCBudW1fYnl0ZXMpKQorCQkJCWdvdG8gb3V0X2NoZWNrOworCQkJbm9jb3cgPSAxOworCQl9IGVsc2UgaWYgKGV4dGVudF90eXBlID09IEJUUkZTX0ZJTEVfRVhURU5UX0lOTElORSkgeworCQkJZXh0ZW50X2VuZCA9IGZvdW5kX2tleS5vZmZzZXQgKworCQkJCWJ0cmZzX2ZpbGVfZXh0ZW50X2lubGluZV9sZW4obGVhZiwgZmkpOworCQkJZXh0ZW50X2VuZCA9IEFMSUdOKGV4dGVudF9lbmQsIHJvb3QtPnNlY3RvcnNpemUpOworCQl9IGVsc2UgeworCQkJQlVHX09OKDEpOworCQl9CitvdXRfY2hlY2s6CisJCWlmIChleHRlbnRfZW5kIDw9IHN0YXJ0KSB7CisJCQlwYXRoLT5zbG90c1swXSsrOworCQkJZ290byBuZXh0X3Nsb3Q7CisJCX0KKwkJaWYgKCFub2NvdykgeworCQkJaWYgKGNvd19zdGFydCA9PSAodTY0KS0xKQorCQkJCWNvd19zdGFydCA9IGN1cl9vZmZzZXQ7CisJCQljdXJfb2Zmc2V0ID0gZXh0ZW50X2VuZDsKKwkJCWlmIChjdXJfb2Zmc2V0ID4gZW5kKQorCQkJCWJyZWFrOworCQkJcGF0aC0+c2xvdHNbMF0rKzsKKwkJCWdvdG8gbmV4dF9zbG90OworCQl9CisKKwkJYnRyZnNfcmVsZWFzZV9wYXRoKHJvb3QsIHBhdGgpOworCQlpZiAoY293X3N0YXJ0ICE9ICh1NjQpLTEpIHsKKwkJCXJldCA9IGNvd19maWxlX3JhbmdlKGlub2RlLCBsb2NrZWRfcGFnZSwgY293X3N0YXJ0LAorCQkJCQlmb3VuZF9rZXkub2Zmc2V0IC0gMSwgcGFnZV9zdGFydGVkLAorCQkJCQlucl93cml0dGVuLCAxKTsKKwkJCUJVR19PTihyZXQpOworCQkJY293X3N0YXJ0ID0gKHU2NCktMTsKKwkJfQorCisJCWlmIChleHRlbnRfdHlwZSA9PSBCVFJGU19GSUxFX0VYVEVOVF9QUkVBTExPQykgeworCQkJc3RydWN0IGV4dGVudF9tYXAgKmVtOworCQkJc3RydWN0IGV4dGVudF9tYXBfdHJlZSAqZW1fdHJlZTsKKwkJCWVtX3RyZWUgPSAmQlRSRlNfSShpbm9kZSktPmV4dGVudF90cmVlOworCQkJZW0gPSBhbGxvY19leHRlbnRfbWFwKEdGUF9OT0ZTKTsKKwkJCWVtLT5zdGFydCA9IGN1cl9vZmZzZXQ7CisJCQllbS0+b3JpZ19zdGFydCA9IGVtLT5zdGFydDsKKwkJCWVtLT5sZW4gPSBudW1fYnl0ZXM7CisJCQllbS0+YmxvY2tfbGVuID0gbnVtX2J5dGVzOworCQkJZW0tPmJsb2NrX3N0YXJ0ID0gZGlza19ieXRlbnI7CisJCQllbS0+YmRldiA9IHJvb3QtPmZzX2luZm8tPmZzX2RldmljZXMtPmxhdGVzdF9iZGV2OworCQkJc2V0X2JpdChFWFRFTlRfRkxBR19QSU5ORUQsICZlbS0+ZmxhZ3MpOworCQkJd2hpbGUgKDEpIHsKKwkJCQlzcGluX2xvY2soJmVtX3RyZWUtPmxvY2spOworCQkJCXJldCA9IGFkZF9leHRlbnRfbWFwcGluZyhlbV90cmVlLCBlbSk7CisJCQkJc3Bpbl91bmxvY2soJmVtX3RyZWUtPmxvY2spOworCQkJCWlmIChyZXQgIT0gLUVFWElTVCkgeworCQkJCQlmcmVlX2V4dGVudF9tYXAoZW0pOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJYnRyZnNfZHJvcF9leHRlbnRfY2FjaGUoaW5vZGUsIGVtLT5zdGFydCwKKwkJCQkJCWVtLT5zdGFydCArIGVtLT5sZW4gLSAxLCAwKTsKKwkJCX0KKwkJCXR5cGUgPSBCVFJGU19PUkRFUkVEX1BSRUFMTE9DOworCQl9IGVsc2UgeworCQkJdHlwZSA9IEJUUkZTX09SREVSRURfTk9DT1c7CisJCX0KKworCQlyZXQgPSBidHJmc19hZGRfb3JkZXJlZF9leHRlbnQoaW5vZGUsIGN1cl9vZmZzZXQsIGRpc2tfYnl0ZW5yLAorCQkJCQkgICAgICAgbnVtX2J5dGVzLCBudW1fYnl0ZXMsIHR5cGUpOworCQlCVUdfT04ocmV0KTsKKworCQlleHRlbnRfY2xlYXJfdW5sb2NrX2RlbGFsbG9jKGlub2RlLCAmQlRSRlNfSShpbm9kZSktPmlvX3RyZWUsCisJCQkJCWN1cl9vZmZzZXQsIGN1cl9vZmZzZXQgKyBudW1fYnl0ZXMgLSAxLAorCQkJCQlsb2NrZWRfcGFnZSwgMSwgMSwgMSwgMCwgMCwgMCk7CisJCWN1cl9vZmZzZXQgPSBleHRlbnRfZW5kOworCQlpZiAoY3VyX29mZnNldCA+IGVuZCkKKwkJCWJyZWFrOworCX0KKwlidHJmc19yZWxlYXNlX3BhdGgocm9vdCwgcGF0aCk7CisKKwlpZiAoY3VyX29mZnNldCA8PSBlbmQgJiYgY293X3N0YXJ0ID09ICh1NjQpLTEpCisJCWNvd19zdGFydCA9IGN1cl9vZmZzZXQ7CisJaWYgKGNvd19zdGFydCAhPSAodTY0KS0xKSB7CisJCXJldCA9IGNvd19maWxlX3JhbmdlKGlub2RlLCBsb2NrZWRfcGFnZSwgY293X3N0YXJ0LCBlbmQsCisJCQkJICAgICBwYWdlX3N0YXJ0ZWQsIG5yX3dyaXR0ZW4sIDEpOworCQlCVUdfT04ocmV0KTsKKwl9CisKKwlyZXQgPSBidHJmc19lbmRfdHJhbnNhY3Rpb24odHJhbnMsIHJvb3QpOworCUJVR19PTihyZXQpOworCWJ0cmZzX2ZyZWVfcGF0aChwYXRoKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGV4dGVudF9pby5jIGNhbGwgYmFjayB0byBkbyBkZWxheWVkIGFsbG9jYXRpb24gcHJvY2Vzc2luZworICovCitzdGF0aWMgaW50IHJ1bl9kZWxhbGxvY19yYW5nZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgcGFnZSAqbG9ja2VkX3BhZ2UsCisJCQkgICAgICB1NjQgc3RhcnQsIHU2NCBlbmQsIGludCAqcGFnZV9zdGFydGVkLAorCQkJICAgICAgdW5zaWduZWQgbG9uZyAqbnJfd3JpdHRlbikKK3sKKwlpbnQgcmV0OworCisJaWYgKGJ0cmZzX3Rlc3RfZmxhZyhpbm9kZSwgTk9EQVRBQ09XKSkKKwkJcmV0ID0gcnVuX2RlbGFsbG9jX25vY293KGlub2RlLCBsb2NrZWRfcGFnZSwgc3RhcnQsIGVuZCwKKwkJCQkJIHBhZ2Vfc3RhcnRlZCwgMSwgbnJfd3JpdHRlbik7CisJZWxzZSBpZiAoYnRyZnNfdGVzdF9mbGFnKGlub2RlLCBQUkVBTExPQykpCisJCXJldCA9IHJ1bl9kZWxhbGxvY19ub2Nvdyhpbm9kZSwgbG9ja2VkX3BhZ2UsIHN0YXJ0LCBlbmQsCisJCQkJCSBwYWdlX3N0YXJ0ZWQsIDAsIG5yX3dyaXR0ZW4pOworCWVsc2UKKwkJcmV0ID0gY293X2ZpbGVfcmFuZ2VfYXN5bmMoaW5vZGUsIGxvY2tlZF9wYWdlLCBzdGFydCwgZW5kLAorCQkJCQkgICBwYWdlX3N0YXJ0ZWQsIG5yX3dyaXR0ZW4pOworCisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIGV4dGVudF9pby5jIHNldF9iaXRfaG9vaywgdXNlZCB0byB0cmFjayBkZWxheWVkIGFsbG9jYXRpb24KKyAqIGJ5dGVzIGluIHRoaXMgZmlsZSwgYW5kIHRvIG1haW50YWluIHRoZSBsaXN0IG9mIGlub2RlcyB0aGF0CisgKiBoYXZlIHBlbmRpbmcgZGVsYWxsb2Mgd29yayB0byBiZSBkb25lLgorICovCitzdGF0aWMgaW50IGJ0cmZzX3NldF9iaXRfaG9vayhzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1NjQgc3RhcnQsIHU2NCBlbmQsCisJCSAgICAgICB1bnNpZ25lZCBsb25nIG9sZCwgdW5zaWduZWQgbG9uZyBiaXRzKQoreworCS8qCisJICogc2V0X2JpdCBhbmQgY2xlYXIgYml0IGhvb2tzIG5vcm1hbGx5IHJlcXVpcmUgX2lycXNhdmUvcmVzdG9yZQorCSAqIGJ1dCBpbiB0aGlzIGNhc2UsIHdlIGFyZSBvbmx5IHRlc3RlaW5nIGZvciB0aGUgREVMQUxMT0MKKwkgKiBiaXQsIHdoaWNoIGlzIG9ubHkgc2V0IG9yIGNsZWFyZWQgd2l0aCBpcnFzIG9uCisJICovCisJaWYgKCEob2xkICYgRVhURU5UX0RFTEFMTE9DKSAmJiAoYml0cyAmIEVYVEVOVF9ERUxBTExPQykpIHsKKwkJc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QgPSBCVFJGU19JKGlub2RlKS0+cm9vdDsKKwkJc3Bpbl9sb2NrKCZyb290LT5mc19pbmZvLT5kZWxhbGxvY19sb2NrKTsKKwkJQlRSRlNfSShpbm9kZSktPmRlbGFsbG9jX2J5dGVzICs9IGVuZCAtIHN0YXJ0ICsgMTsKKwkJcm9vdC0+ZnNfaW5mby0+ZGVsYWxsb2NfYnl0ZXMgKz0gZW5kIC0gc3RhcnQgKyAxOworCQlpZiAobGlzdF9lbXB0eSgmQlRSRlNfSShpbm9kZSktPmRlbGFsbG9jX2lub2RlcykpIHsKKwkJCWxpc3RfYWRkX3RhaWwoJkJUUkZTX0koaW5vZGUpLT5kZWxhbGxvY19pbm9kZXMsCisJCQkJICAgICAgJnJvb3QtPmZzX2luZm8tPmRlbGFsbG9jX2lub2Rlcyk7CisJCX0KKwkJc3Bpbl91bmxvY2soJnJvb3QtPmZzX2luZm8tPmRlbGFsbG9jX2xvY2spOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGV4dGVudF9pby5jIGNsZWFyX2JpdF9ob29rLCBzZWUgc2V0X2JpdF9ob29rIGZvciB3aHkKKyAqLworc3RhdGljIGludCBidHJmc19jbGVhcl9iaXRfaG9vayhzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1NjQgc3RhcnQsIHU2NCBlbmQsCisJCQkgdW5zaWduZWQgbG9uZyBvbGQsIHVuc2lnbmVkIGxvbmcgYml0cykKK3sKKwkvKgorCSAqIHNldF9iaXQgYW5kIGNsZWFyIGJpdCBob29rcyBub3JtYWxseSByZXF1aXJlIF9pcnFzYXZlL3Jlc3RvcmUKKwkgKiBidXQgaW4gdGhpcyBjYXNlLCB3ZSBhcmUgb25seSB0ZXN0ZWluZyBmb3IgdGhlIERFTEFMTE9DCisJICogYml0LCB3aGljaCBpcyBvbmx5IHNldCBvciBjbGVhcmVkIHdpdGggaXJxcyBvbgorCSAqLworCWlmICgob2xkICYgRVhURU5UX0RFTEFMTE9DKSAmJiAoYml0cyAmIEVYVEVOVF9ERUxBTExPQykpIHsKKwkJc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QgPSBCVFJGU19JKGlub2RlKS0+cm9vdDsKKworCQlzcGluX2xvY2soJnJvb3QtPmZzX2luZm8tPmRlbGFsbG9jX2xvY2spOworCQlpZiAoZW5kIC0gc3RhcnQgKyAxID4gcm9vdC0+ZnNfaW5mby0+ZGVsYWxsb2NfYnl0ZXMpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gImJ0cmZzIHdhcm5pbmc6IGRlbGFsbG9jIGFjY291bnQgIgorCQkJICAgICAgICIlbGx1ICVsbHVcbiIsCisJCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyllbmQgLSBzdGFydCArIDEsCisJCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykKKwkJCSAgICAgICByb290LT5mc19pbmZvLT5kZWxhbGxvY19ieXRlcyk7CisJCQlyb290LT5mc19pbmZvLT5kZWxhbGxvY19ieXRlcyA9IDA7CisJCQlCVFJGU19JKGlub2RlKS0+ZGVsYWxsb2NfYnl0ZXMgPSAwOworCQl9IGVsc2UgeworCQkJcm9vdC0+ZnNfaW5mby0+ZGVsYWxsb2NfYnl0ZXMgLT0gZW5kIC0gc3RhcnQgKyAxOworCQkJQlRSRlNfSShpbm9kZSktPmRlbGFsbG9jX2J5dGVzIC09IGVuZCAtIHN0YXJ0ICsgMTsKKwkJfQorCQlpZiAoQlRSRlNfSShpbm9kZSktPmRlbGFsbG9jX2J5dGVzID09IDAgJiYKKwkJICAgICFsaXN0X2VtcHR5KCZCVFJGU19JKGlub2RlKS0+ZGVsYWxsb2NfaW5vZGVzKSkgeworCQkJbGlzdF9kZWxfaW5pdCgmQlRSRlNfSShpbm9kZSktPmRlbGFsbG9jX2lub2Rlcyk7CisJCX0KKwkJc3Bpbl91bmxvY2soJnJvb3QtPmZzX2luZm8tPmRlbGFsbG9jX2xvY2spOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGV4dGVudF9pby5jIG1lcmdlX2Jpb19ob29rLCB0aGlzIG11c3QgY2hlY2sgdGhlIGNodW5rIHRyZWUgdG8gbWFrZSBzdXJlCisgKiB3ZSBkb24ndCBjcmVhdGUgYmlvcyB0aGF0IHNwYW4gc3RyaXBlcyBvciBjaHVua3MKKyAqLworaW50IGJ0cmZzX21lcmdlX2Jpb19ob29rKHN0cnVjdCBwYWdlICpwYWdlLCB1bnNpZ25lZCBsb25nIG9mZnNldCwKKwkJCSBzaXplX3Qgc2l6ZSwgc3RydWN0IGJpbyAqYmlvLAorCQkJIHVuc2lnbmVkIGxvbmcgYmlvX2ZsYWdzKQoreworCXN0cnVjdCBidHJmc19yb290ICpyb290ID0gQlRSRlNfSShwYWdlLT5tYXBwaW5nLT5ob3N0KS0+cm9vdDsKKwlzdHJ1Y3QgYnRyZnNfbWFwcGluZ190cmVlICptYXBfdHJlZTsKKwl1NjQgbG9naWNhbCA9ICh1NjQpYmlvLT5iaV9zZWN0b3IgPDwgOTsKKwl1NjQgbGVuZ3RoID0gMDsKKwl1NjQgbWFwX2xlbmd0aDsKKwlpbnQgcmV0OworCisJaWYgKGJpb19mbGFncyAmIEVYVEVOVF9CSU9fQ09NUFJFU1NFRCkKKwkJcmV0dXJuIDA7CisKKwlsZW5ndGggPSBiaW8tPmJpX3NpemU7CisJbWFwX3RyZWUgPSAmcm9vdC0+ZnNfaW5mby0+bWFwcGluZ190cmVlOworCW1hcF9sZW5ndGggPSBsZW5ndGg7CisJcmV0ID0gYnRyZnNfbWFwX2Jsb2NrKG1hcF90cmVlLCBSRUFELCBsb2dpY2FsLAorCQkJICAgICAgJm1hcF9sZW5ndGgsIE5VTEwsIDApOworCisJaWYgKG1hcF9sZW5ndGggPCBsZW5ndGggKyBzaXplKQorCQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGluIG9yZGVyIHRvIGluc2VydCBjaGVja3N1bXMgaW50byB0aGUgbWV0YWRhdGEgaW4gbGFyZ2UgY2h1bmtzLAorICogd2Ugd2FpdCB1bnRpbCBiaW8gc3VibWlzc2lvbiB0aW1lLiAgIEFsbCB0aGUgcGFnZXMgaW4gdGhlIGJpbyBhcmUKKyAqIGNoZWNrc3VtbWVkIGFuZCBzdW1zIGFyZSBhdHRhY2hlZCBvbnRvIHRoZSBvcmRlcmVkIGV4dGVudCByZWNvcmQuCisgKgorICogQXQgSU8gY29tcGxldGlvbiB0aW1lIHRoZSBjdW1zIGF0dGFjaGVkIG9uIHRoZSBvcmRlcmVkIGV4dGVudCByZWNvcmQKKyAqIGFyZSBpbnNlcnRlZCBpbnRvIHRoZSBidHJlZQorICovCitzdGF0aWMgaW50IF9fYnRyZnNfc3VibWl0X2Jpb19zdGFydChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgcncsCisJCQkJICAgIHN0cnVjdCBiaW8gKmJpbywgaW50IG1pcnJvcl9udW0sCisJCQkJICAgIHVuc2lnbmVkIGxvbmcgYmlvX2ZsYWdzKQoreworCXN0cnVjdCBidHJmc19yb290ICpyb290ID0gQlRSRlNfSShpbm9kZSktPnJvb3Q7CisJaW50IHJldCA9IDA7CisKKwlyZXQgPSBidHJmc19jc3VtX29uZV9iaW8ocm9vdCwgaW5vZGUsIGJpbywgMCwgMCk7CisJQlVHX09OKHJldCk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBpbiBvcmRlciB0byBpbnNlcnQgY2hlY2tzdW1zIGludG8gdGhlIG1ldGFkYXRhIGluIGxhcmdlIGNodW5rcywKKyAqIHdlIHdhaXQgdW50aWwgYmlvIHN1Ym1pc3Npb24gdGltZS4gICBBbGwgdGhlIHBhZ2VzIGluIHRoZSBiaW8gYXJlCisgKiBjaGVja3N1bW1lZCBhbmQgc3VtcyBhcmUgYXR0YWNoZWQgb250byB0aGUgb3JkZXJlZCBleHRlbnQgcmVjb3JkLgorICoKKyAqIEF0IElPIGNvbXBsZXRpb24gdGltZSB0aGUgY3VtcyBhdHRhY2hlZCBvbiB0aGUgb3JkZXJlZCBleHRlbnQgcmVjb3JkCisgKiBhcmUgaW5zZXJ0ZWQgaW50byB0aGUgYnRyZWUKKyAqLworc3RhdGljIGludCBfX2J0cmZzX3N1Ym1pdF9iaW9fZG9uZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgcncsIHN0cnVjdCBiaW8gKmJpbywKKwkJCSAgaW50IG1pcnJvcl9udW0sIHVuc2lnbmVkIGxvbmcgYmlvX2ZsYWdzKQoreworCXN0cnVjdCBidHJmc19yb290ICpyb290ID0gQlRSRlNfSShpbm9kZSktPnJvb3Q7CisJcmV0dXJuIGJ0cmZzX21hcF9iaW8ocm9vdCwgcncsIGJpbywgbWlycm9yX251bSwgMSk7Cit9CisKKy8qCisgKiBleHRlbnRfaW8uYyBzdWJtaXNzaW9uIGhvb2suIFRoaXMgZG9lcyB0aGUgcmlnaHQgdGhpbmcgZm9yIGNzdW0gY2FsY3VsYXRpb24KKyAqIG9uIHdyaXRlLCBvciByZWFkaW5nIHRoZSBjc3VtcyBmcm9tIHRoZSB0cmVlIGJlZm9yZSBhIHJlYWQKKyAqLworc3RhdGljIGludCBidHJmc19zdWJtaXRfYmlvX2hvb2soc3RydWN0IGlub2RlICppbm9kZSwgaW50IHJ3LCBzdHJ1Y3QgYmlvICpiaW8sCisJCQkgIGludCBtaXJyb3JfbnVtLCB1bnNpZ25lZCBsb25nIGJpb19mbGFncykKK3sKKwlzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCA9IEJUUkZTX0koaW5vZGUpLT5yb290OworCWludCByZXQgPSAwOworCWludCBza2lwX3N1bTsKKworCXNraXBfc3VtID0gYnRyZnNfdGVzdF9mbGFnKGlub2RlLCBOT0RBVEFTVU0pOworCisJcmV0ID0gYnRyZnNfYmlvX3dxX2VuZF9pbyhyb290LT5mc19pbmZvLCBiaW8sIDApOworCUJVR19PTihyZXQpOworCisJaWYgKCEocncgJiAoMSA8PCBCSU9fUlcpKSkgeworCQlpZiAoYmlvX2ZsYWdzICYgRVhURU5UX0JJT19DT01QUkVTU0VEKSB7CisJCQlyZXR1cm4gYnRyZnNfc3VibWl0X2NvbXByZXNzZWRfcmVhZChpbm9kZSwgYmlvLAorCQkJCQkJICAgIG1pcnJvcl9udW0sIGJpb19mbGFncyk7CisJCX0gZWxzZSBpZiAoIXNraXBfc3VtKQorCQkJYnRyZnNfbG9va3VwX2Jpb19zdW1zKHJvb3QsIGlub2RlLCBiaW8sIE5VTEwpOworCQlnb3RvIG1hcGl0OworCX0gZWxzZSBpZiAoIXNraXBfc3VtKSB7CisJCS8qIGNzdW0gaXRlbXMgaGF2ZSBhbHJlYWR5IGJlZW4gY2xvbmVkICovCisJCWlmIChyb290LT5yb290X2tleS5vYmplY3RpZCA9PSBCVFJGU19EQVRBX1JFTE9DX1RSRUVfT0JKRUNUSUQpCisJCQlnb3RvIG1hcGl0OworCQkvKiB3ZSdyZSBkb2luZyBhIHdyaXRlLCBkbyB0aGUgYXN5bmMgY2hlY2tzdW1taW5nICovCisJCXJldHVybiBidHJmc193cV9zdWJtaXRfYmlvKEJUUkZTX0koaW5vZGUpLT5yb290LT5mc19pbmZvLAorCQkJCSAgIGlub2RlLCBydywgYmlvLCBtaXJyb3JfbnVtLAorCQkJCSAgIGJpb19mbGFncywgX19idHJmc19zdWJtaXRfYmlvX3N0YXJ0LAorCQkJCSAgIF9fYnRyZnNfc3VibWl0X2Jpb19kb25lKTsKKwl9CisKK21hcGl0OgorCXJldHVybiBidHJmc19tYXBfYmlvKHJvb3QsIHJ3LCBiaW8sIG1pcnJvcl9udW0sIDApOworfQorCisvKgorICogZ2l2ZW4gYSBsaXN0IG9mIG9yZGVyZWQgc3VtcyByZWNvcmQgdGhlbSBpbiB0aGUgaW5vZGUuICBUaGlzIGhhcHBlbnMKKyAqIGF0IElPIGNvbXBsZXRpb24gdGltZSBiYXNlZCBvbiBzdW1zIGNhbGN1bGF0ZWQgYXQgYmlvIHN1Ym1pc3Npb24gdGltZS4KKyAqLworc3RhdGljIG5vaW5saW5lIGludCBhZGRfcGVuZGluZ19jc3VtcyhzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKKwkJCSAgICAgc3RydWN0IGlub2RlICppbm9kZSwgdTY0IGZpbGVfb2Zmc2V0LAorCQkJICAgICBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0KQoreworCXN0cnVjdCBsaXN0X2hlYWQgKmN1cjsKKwlzdHJ1Y3QgYnRyZnNfb3JkZXJlZF9zdW0gKnN1bTsKKworCWJ0cmZzX3NldF90cmFuc19ibG9ja19ncm91cCh0cmFucywgaW5vZGUpOworCWxpc3RfZm9yX2VhY2goY3VyLCBsaXN0KSB7CisJCXN1bSA9IGxpc3RfZW50cnkoY3VyLCBzdHJ1Y3QgYnRyZnNfb3JkZXJlZF9zdW0sIGxpc3QpOworCQlidHJmc19jc3VtX2ZpbGVfYmxvY2tzKHRyYW5zLAorCQkgICAgICAgQlRSRlNfSShpbm9kZSktPnJvb3QtPmZzX2luZm8tPmNzdW1fcm9vdCwgc3VtKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK2ludCBidHJmc19zZXRfZXh0ZW50X2RlbGFsbG9jKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHU2NCBzdGFydCwgdTY0IGVuZCkKK3sKKwlpZiAoKGVuZCAmIChQQUdFX0NBQ0hFX1NJWkUgLSAxKSkgPT0gMCkKKwkJV0FSTl9PTigxKTsKKwlyZXR1cm4gc2V0X2V4dGVudF9kZWxhbGxvYygmQlRSRlNfSShpbm9kZSktPmlvX3RyZWUsIHN0YXJ0LCBlbmQsCisJCQkJICAgR0ZQX05PRlMpOworfQorCisvKiBzZWUgYnRyZnNfd3JpdGVwYWdlX3N0YXJ0X2hvb2sgZm9yIGRldGFpbHMgb24gd2h5IHRoaXMgaXMgcmVxdWlyZWQgKi8KK3N0cnVjdCBidHJmc193cml0ZXBhZ2VfZml4dXAgeworCXN0cnVjdCBwYWdlICpwYWdlOworCXN0cnVjdCBidHJmc193b3JrIHdvcms7Cit9OworCitzdGF0aWMgdm9pZCBidHJmc193cml0ZXBhZ2VfZml4dXBfd29ya2VyKHN0cnVjdCBidHJmc193b3JrICp3b3JrKQoreworCXN0cnVjdCBidHJmc193cml0ZXBhZ2VfZml4dXAgKmZpeHVwOworCXN0cnVjdCBidHJmc19vcmRlcmVkX2V4dGVudCAqb3JkZXJlZDsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCXU2NCBwYWdlX3N0YXJ0OworCXU2NCBwYWdlX2VuZDsKKworCWZpeHVwID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBidHJmc193cml0ZXBhZ2VfZml4dXAsIHdvcmspOworCXBhZ2UgPSBmaXh1cC0+cGFnZTsKK2FnYWluOgorCWxvY2tfcGFnZShwYWdlKTsKKwlpZiAoIXBhZ2UtPm1hcHBpbmcgfHwgIVBhZ2VEaXJ0eShwYWdlKSB8fCAhUGFnZUNoZWNrZWQocGFnZSkpIHsKKwkJQ2xlYXJQYWdlQ2hlY2tlZChwYWdlKTsKKwkJZ290byBvdXRfcGFnZTsKKwl9CisKKwlpbm9kZSA9IHBhZ2UtPm1hcHBpbmctPmhvc3Q7CisJcGFnZV9zdGFydCA9IHBhZ2Vfb2Zmc2V0KHBhZ2UpOworCXBhZ2VfZW5kID0gcGFnZV9vZmZzZXQocGFnZSkgKyBQQUdFX0NBQ0hFX1NJWkUgLSAxOworCisJbG9ja19leHRlbnQoJkJUUkZTX0koaW5vZGUpLT5pb190cmVlLCBwYWdlX3N0YXJ0LCBwYWdlX2VuZCwgR0ZQX05PRlMpOworCisJLyogYWxyZWFkeSBvcmRlcmVkPyBXZSdyZSBkb25lICovCisJaWYgKHRlc3RfcmFuZ2VfYml0KCZCVFJGU19JKGlub2RlKS0+aW9fdHJlZSwgcGFnZV9zdGFydCwgcGFnZV9lbmQsCisJCQkgICAgIEVYVEVOVF9PUkRFUkVELCAwKSkgeworCQlnb3RvIG91dDsKKwl9CisKKwlvcmRlcmVkID0gYnRyZnNfbG9va3VwX29yZGVyZWRfZXh0ZW50KGlub2RlLCBwYWdlX3N0YXJ0KTsKKwlpZiAob3JkZXJlZCkgeworCQl1bmxvY2tfZXh0ZW50KCZCVFJGU19JKGlub2RlKS0+aW9fdHJlZSwgcGFnZV9zdGFydCwKKwkJCSAgICAgIHBhZ2VfZW5kLCBHRlBfTk9GUyk7CisJCXVubG9ja19wYWdlKHBhZ2UpOworCQlidHJmc19zdGFydF9vcmRlcmVkX2V4dGVudChpbm9kZSwgb3JkZXJlZCwgMSk7CisJCWdvdG8gYWdhaW47CisJfQorCisJYnRyZnNfc2V0X2V4dGVudF9kZWxhbGxvYyhpbm9kZSwgcGFnZV9zdGFydCwgcGFnZV9lbmQpOworCUNsZWFyUGFnZUNoZWNrZWQocGFnZSk7CitvdXQ6CisJdW5sb2NrX2V4dGVudCgmQlRSRlNfSShpbm9kZSktPmlvX3RyZWUsIHBhZ2Vfc3RhcnQsIHBhZ2VfZW5kLCBHRlBfTk9GUyk7CitvdXRfcGFnZToKKwl1bmxvY2tfcGFnZShwYWdlKTsKKwlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7Cit9CisKKy8qCisgKiBUaGVyZSBhcmUgYSBmZXcgcGF0aHMgaW4gdGhlIGhpZ2hlciBsYXllcnMgb2YgdGhlIGtlcm5lbCB0aGF0IGRpcmVjdGx5CisgKiBzZXQgdGhlIHBhZ2UgZGlydHkgYml0IHdpdGhvdXQgYXNraW5nIHRoZSBmaWxlc3lzdGVtIGlmIGl0IGlzIGEKKyAqIGdvb2QgaWRlYS4gIFRoaXMgY2F1c2VzIHByb2JsZW1zIGJlY2F1c2Ugd2Ugd2FudCB0byBtYWtlIHN1cmUgQ09XCisgKiBwcm9wZXJseSBoYXBwZW5zIGFuZCB0aGUgZGF0YT1vcmRlcmVkIHJ1bGVzIGFyZSBmb2xsb3dlZC4KKyAqCisgKiBJbiBvdXIgY2FzZSBhbnkgcmFuZ2UgdGhhdCBkb2Vzbid0IGhhdmUgdGhlIE9SREVSRUQgYml0IHNldAorICogaGFzbid0IGJlZW4gcHJvcGVybHkgc2V0dXAgZm9yIElPLiAgV2Uga2ljayBvZmYgYW4gYXN5bmMgcHJvY2VzcworICogdG8gZml4IGl0IHVwLiAgVGhlIGFzeW5jIGhlbHBlciB3aWxsIHdhaXQgZm9yIG9yZGVyZWQgZXh0ZW50cywgc2V0CisgKiB0aGUgZGVsYWxsb2MgYml0IGFuZCBtYWtlIGl0IHNhZmUgdG8gd3JpdGUgdGhlIHBhZ2UuCisgKi8KK3N0YXRpYyBpbnQgYnRyZnNfd3JpdGVwYWdlX3N0YXJ0X2hvb2soc3RydWN0IHBhZ2UgKnBhZ2UsIHU2NCBzdGFydCwgdTY0IGVuZCkKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gcGFnZS0+bWFwcGluZy0+aG9zdDsKKwlzdHJ1Y3QgYnRyZnNfd3JpdGVwYWdlX2ZpeHVwICpmaXh1cDsKKwlzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCA9IEJUUkZTX0koaW5vZGUpLT5yb290OworCWludCByZXQ7CisKKwlyZXQgPSB0ZXN0X3JhbmdlX2JpdCgmQlRSRlNfSShpbm9kZSktPmlvX3RyZWUsIHN0YXJ0LCBlbmQsCisJCQkgICAgIEVYVEVOVF9PUkRFUkVELCAwKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gMDsKKworCWlmIChQYWdlQ2hlY2tlZChwYWdlKSkKKwkJcmV0dXJuIC1FQUdBSU47CisKKwlmaXh1cCA9IGt6YWxsb2Moc2l6ZW9mKCpmaXh1cCksIEdGUF9OT0ZTKTsKKwlpZiAoIWZpeHVwKQorCQlyZXR1cm4gLUVBR0FJTjsKKworCVNldFBhZ2VDaGVja2VkKHBhZ2UpOworCXBhZ2VfY2FjaGVfZ2V0KHBhZ2UpOworCWZpeHVwLT53b3JrLmZ1bmMgPSBidHJmc193cml0ZXBhZ2VfZml4dXBfd29ya2VyOworCWZpeHVwLT5wYWdlID0gcGFnZTsKKwlidHJmc19xdWV1ZV93b3JrZXIoJnJvb3QtPmZzX2luZm8tPmZpeHVwX3dvcmtlcnMsICZmaXh1cC0+d29yayk7CisJcmV0dXJuIC1FQUdBSU47Cit9CisKK3N0YXRpYyBpbnQgaW5zZXJ0X3Jlc2VydmVkX2ZpbGVfZXh0ZW50KHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAorCQkJCSAgICAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1NjQgZmlsZV9wb3MsCisJCQkJICAgICAgIHU2NCBkaXNrX2J5dGVuciwgdTY0IGRpc2tfbnVtX2J5dGVzLAorCQkJCSAgICAgICB1NjQgbnVtX2J5dGVzLCB1NjQgcmFtX2J5dGVzLAorCQkJCSAgICAgICB1OCBjb21wcmVzc2lvbiwgdTggZW5jcnlwdGlvbiwKKwkJCQkgICAgICAgdTE2IG90aGVyX2VuY29kaW5nLCBpbnQgZXh0ZW50X3R5cGUpCit7CisJc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QgPSBCVFJGU19JKGlub2RlKS0+cm9vdDsKKwlzdHJ1Y3QgYnRyZnNfZmlsZV9leHRlbnRfaXRlbSAqZmk7CisJc3RydWN0IGJ0cmZzX3BhdGggKnBhdGg7CisJc3RydWN0IGV4dGVudF9idWZmZXIgKmxlYWY7CisJc3RydWN0IGJ0cmZzX2tleSBpbnM7CisJdTY0IGhpbnQ7CisJaW50IHJldDsKKworCXBhdGggPSBidHJmc19hbGxvY19wYXRoKCk7CisJQlVHX09OKCFwYXRoKTsKKworCXJldCA9IGJ0cmZzX2Ryb3BfZXh0ZW50cyh0cmFucywgcm9vdCwgaW5vZGUsIGZpbGVfcG9zLAorCQkJCSBmaWxlX3BvcyArIG51bV9ieXRlcywgZmlsZV9wb3MsICZoaW50KTsKKwlCVUdfT04ocmV0KTsKKworCWlucy5vYmplY3RpZCA9IGlub2RlLT5pX2lubzsKKwlpbnMub2Zmc2V0ID0gZmlsZV9wb3M7CisJaW5zLnR5cGUgPSBCVFJGU19FWFRFTlRfREFUQV9LRVk7CisJcmV0ID0gYnRyZnNfaW5zZXJ0X2VtcHR5X2l0ZW0odHJhbnMsIHJvb3QsIHBhdGgsICZpbnMsIHNpemVvZigqZmkpKTsKKwlCVUdfT04ocmV0KTsKKwlsZWFmID0gcGF0aC0+bm9kZXNbMF07CisJZmkgPSBidHJmc19pdGVtX3B0cihsZWFmLCBwYXRoLT5zbG90c1swXSwKKwkJCSAgICBzdHJ1Y3QgYnRyZnNfZmlsZV9leHRlbnRfaXRlbSk7CisJYnRyZnNfc2V0X2ZpbGVfZXh0ZW50X2dlbmVyYXRpb24obGVhZiwgZmksIHRyYW5zLT50cmFuc2lkKTsKKwlidHJmc19zZXRfZmlsZV9leHRlbnRfdHlwZShsZWFmLCBmaSwgZXh0ZW50X3R5cGUpOworCWJ0cmZzX3NldF9maWxlX2V4dGVudF9kaXNrX2J5dGVucihsZWFmLCBmaSwgZGlza19ieXRlbnIpOworCWJ0cmZzX3NldF9maWxlX2V4dGVudF9kaXNrX251bV9ieXRlcyhsZWFmLCBmaSwgZGlza19udW1fYnl0ZXMpOworCWJ0cmZzX3NldF9maWxlX2V4dGVudF9vZmZzZXQobGVhZiwgZmksIDApOworCWJ0cmZzX3NldF9maWxlX2V4dGVudF9udW1fYnl0ZXMobGVhZiwgZmksIG51bV9ieXRlcyk7CisJYnRyZnNfc2V0X2ZpbGVfZXh0ZW50X3JhbV9ieXRlcyhsZWFmLCBmaSwgcmFtX2J5dGVzKTsKKwlidHJmc19zZXRfZmlsZV9leHRlbnRfY29tcHJlc3Npb24obGVhZiwgZmksIGNvbXByZXNzaW9uKTsKKwlidHJmc19zZXRfZmlsZV9leHRlbnRfZW5jcnlwdGlvbihsZWFmLCBmaSwgZW5jcnlwdGlvbik7CisJYnRyZnNfc2V0X2ZpbGVfZXh0ZW50X290aGVyX2VuY29kaW5nKGxlYWYsIGZpLCBvdGhlcl9lbmNvZGluZyk7CisJYnRyZnNfbWFya19idWZmZXJfZGlydHkobGVhZik7CisKKwlpbm9kZV9hZGRfYnl0ZXMoaW5vZGUsIG51bV9ieXRlcyk7CisJYnRyZnNfZHJvcF9leHRlbnRfY2FjaGUoaW5vZGUsIGZpbGVfcG9zLCBmaWxlX3BvcyArIG51bV9ieXRlcyAtIDEsIDApOworCisJaW5zLm9iamVjdGlkID0gZGlza19ieXRlbnI7CisJaW5zLm9mZnNldCA9IGRpc2tfbnVtX2J5dGVzOworCWlucy50eXBlID0gQlRSRlNfRVhURU5UX0lURU1fS0VZOworCXJldCA9IGJ0cmZzX2FsbG9jX3Jlc2VydmVkX2V4dGVudCh0cmFucywgcm9vdCwgbGVhZi0+c3RhcnQsCisJCQkJCSAgcm9vdC0+cm9vdF9rZXkub2JqZWN0aWQsCisJCQkJCSAgdHJhbnMtPnRyYW5zaWQsIGlub2RlLT5pX2lubywgJmlucyk7CisJQlVHX09OKHJldCk7CisKKwlidHJmc19mcmVlX3BhdGgocGF0aCk7CisJcmV0dXJuIDA7Cit9CisKKy8qIGFzIG9yZGVyZWQgZGF0YSBJTyBmaW5pc2hlcywgdGhpcyBnZXRzIGNhbGxlZCBzbyB3ZSBjYW4gZmluaXNoCisgKiBhbiBvcmRlcmVkIGV4dGVudCBpZiB0aGUgcmFuZ2Ugb2YgYnl0ZXMgaW4gdGhlIGZpbGUgaXQgY292ZXJzIGFyZQorICogZnVsbHkgd3JpdHRlbi4KKyAqLworc3RhdGljIGludCBidHJmc19maW5pc2hfb3JkZXJlZF9pbyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1NjQgc3RhcnQsIHU2NCBlbmQpCit7CisJc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QgPSBCVFJGU19JKGlub2RlKS0+cm9vdDsKKwlzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFuczsKKwlzdHJ1Y3QgYnRyZnNfb3JkZXJlZF9leHRlbnQgKm9yZGVyZWRfZXh0ZW50OworCXN0cnVjdCBleHRlbnRfaW9fdHJlZSAqaW9fdHJlZSA9ICZCVFJGU19JKGlub2RlKS0+aW9fdHJlZTsKKwlpbnQgY29tcHJlc3NlZCA9IDA7CisJaW50IHJldDsKKworCXJldCA9IGJ0cmZzX2RlY190ZXN0X29yZGVyZWRfcGVuZGluZyhpbm9kZSwgc3RhcnQsIGVuZCAtIHN0YXJ0ICsgMSk7CisJaWYgKCFyZXQpCisJCXJldHVybiAwOworCisJdHJhbnMgPSBidHJmc19qb2luX3RyYW5zYWN0aW9uKHJvb3QsIDEpOworCisJb3JkZXJlZF9leHRlbnQgPSBidHJmc19sb29rdXBfb3JkZXJlZF9leHRlbnQoaW5vZGUsIHN0YXJ0KTsKKwlCVUdfT04oIW9yZGVyZWRfZXh0ZW50KTsKKwlpZiAodGVzdF9iaXQoQlRSRlNfT1JERVJFRF9OT0NPVywgJm9yZGVyZWRfZXh0ZW50LT5mbGFncykpCisJCWdvdG8gbm9jb3c7CisKKwlsb2NrX2V4dGVudChpb190cmVlLCBvcmRlcmVkX2V4dGVudC0+ZmlsZV9vZmZzZXQsCisJCSAgICBvcmRlcmVkX2V4dGVudC0+ZmlsZV9vZmZzZXQgKyBvcmRlcmVkX2V4dGVudC0+bGVuIC0gMSwKKwkJICAgIEdGUF9OT0ZTKTsKKworCWlmICh0ZXN0X2JpdChCVFJGU19PUkRFUkVEX0NPTVBSRVNTRUQsICZvcmRlcmVkX2V4dGVudC0+ZmxhZ3MpKQorCQljb21wcmVzc2VkID0gMTsKKwlpZiAodGVzdF9iaXQoQlRSRlNfT1JERVJFRF9QUkVBTExPQywgJm9yZGVyZWRfZXh0ZW50LT5mbGFncykpIHsKKwkJQlVHX09OKGNvbXByZXNzZWQpOworCQlyZXQgPSBidHJmc19tYXJrX2V4dGVudF93cml0dGVuKHRyYW5zLCByb290LCBpbm9kZSwKKwkJCQkJCW9yZGVyZWRfZXh0ZW50LT5maWxlX29mZnNldCwKKwkJCQkJCW9yZGVyZWRfZXh0ZW50LT5maWxlX29mZnNldCArCisJCQkJCQlvcmRlcmVkX2V4dGVudC0+bGVuKTsKKwkJQlVHX09OKHJldCk7CisJfSBlbHNlIHsKKwkJcmV0ID0gaW5zZXJ0X3Jlc2VydmVkX2ZpbGVfZXh0ZW50KHRyYW5zLCBpbm9kZSwKKwkJCQkJCW9yZGVyZWRfZXh0ZW50LT5maWxlX29mZnNldCwKKwkJCQkJCW9yZGVyZWRfZXh0ZW50LT5zdGFydCwKKwkJCQkJCW9yZGVyZWRfZXh0ZW50LT5kaXNrX2xlbiwKKwkJCQkJCW9yZGVyZWRfZXh0ZW50LT5sZW4sCisJCQkJCQlvcmRlcmVkX2V4dGVudC0+bGVuLAorCQkJCQkJY29tcHJlc3NlZCwgMCwgMCwKKwkJCQkJCUJUUkZTX0ZJTEVfRVhURU5UX1JFRyk7CisJCUJVR19PTihyZXQpOworCX0KKwl1bmxvY2tfZXh0ZW50KGlvX3RyZWUsIG9yZGVyZWRfZXh0ZW50LT5maWxlX29mZnNldCwKKwkJICAgIG9yZGVyZWRfZXh0ZW50LT5maWxlX29mZnNldCArIG9yZGVyZWRfZXh0ZW50LT5sZW4gLSAxLAorCQkgICAgR0ZQX05PRlMpOworbm9jb3c6CisJYWRkX3BlbmRpbmdfY3N1bXModHJhbnMsIGlub2RlLCBvcmRlcmVkX2V4dGVudC0+ZmlsZV9vZmZzZXQsCisJCQkgICZvcmRlcmVkX2V4dGVudC0+bGlzdCk7CisKKwltdXRleF9sb2NrKCZCVFJGU19JKGlub2RlKS0+ZXh0ZW50X211dGV4KTsKKwlidHJmc19vcmRlcmVkX3VwZGF0ZV9pX3NpemUoaW5vZGUsIG9yZGVyZWRfZXh0ZW50KTsKKwlidHJmc191cGRhdGVfaW5vZGUodHJhbnMsIHJvb3QsIGlub2RlKTsKKwlidHJmc19yZW1vdmVfb3JkZXJlZF9leHRlbnQoaW5vZGUsIG9yZGVyZWRfZXh0ZW50KTsKKwltdXRleF91bmxvY2soJkJUUkZTX0koaW5vZGUpLT5leHRlbnRfbXV0ZXgpOworCisJLyogb25jZSBmb3IgdXMgKi8KKwlidHJmc19wdXRfb3JkZXJlZF9leHRlbnQob3JkZXJlZF9leHRlbnQpOworCS8qIG9uY2UgZm9yIHRoZSB0cmVlICovCisJYnRyZnNfcHV0X29yZGVyZWRfZXh0ZW50KG9yZGVyZWRfZXh0ZW50KTsKKworCWJ0cmZzX2VuZF90cmFuc2FjdGlvbih0cmFucywgcm9vdCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYnRyZnNfd3JpdGVwYWdlX2VuZF9pb19ob29rKHN0cnVjdCBwYWdlICpwYWdlLCB1NjQgc3RhcnQsIHU2NCBlbmQsCisJCQkJc3RydWN0IGV4dGVudF9zdGF0ZSAqc3RhdGUsIGludCB1cHRvZGF0ZSkKK3sKKwlyZXR1cm4gYnRyZnNfZmluaXNoX29yZGVyZWRfaW8ocGFnZS0+bWFwcGluZy0+aG9zdCwgc3RhcnQsIGVuZCk7Cit9CisKKy8qCisgKiBXaGVuIElPIGZhaWxzLCBlaXRoZXIgd2l0aCBFSU8gb3IgY3N1bSB2ZXJpZmljYXRpb24gZmFpbHMsIHdlCisgKiB0cnkgb3RoZXIgbWlycm9ycyB0aGF0IG1pZ2h0IGhhdmUgYSBnb29kIGNvcHkgb2YgdGhlIGRhdGEuICBUaGlzCisgKiBpb19mYWlsdXJlX3JlY29yZCBpcyB1c2VkIHRvIHJlY29yZCBzdGF0ZSBhcyB3ZSBnbyB0aHJvdWdoIGFsbCB0aGUKKyAqIG1pcnJvcnMuICBJZiBhbm90aGVyIG1pcnJvciBoYXMgZ29vZCBkYXRhLCB0aGUgcGFnZSBpcyBzZXQgdXAgdG8gZGF0ZQorICogYW5kIHRoaW5ncyBjb250aW51ZS4gIElmIGEgZ29vZCBtaXJyb3IgY2FuJ3QgYmUgZm91bmQsIHRoZSBvcmlnaW5hbAorICogYmlvIGVuZF9pbyBjYWxsYmFjayBpcyBjYWxsZWQgdG8gaW5kaWNhdGUgdGhpbmdzIGhhdmUgZmFpbGVkLgorICovCitzdHJ1Y3QgaW9fZmFpbHVyZV9yZWNvcmQgeworCXN0cnVjdCBwYWdlICpwYWdlOworCXU2NCBzdGFydDsKKwl1NjQgbGVuOworCXU2NCBsb2dpY2FsOworCXVuc2lnbmVkIGxvbmcgYmlvX2ZsYWdzOworCWludCBsYXN0X21pcnJvcjsKK307CisKK3N0YXRpYyBpbnQgYnRyZnNfaW9fZmFpbGVkX2hvb2soc3RydWN0IGJpbyAqZmFpbGVkX2JpbywKKwkJCSBzdHJ1Y3QgcGFnZSAqcGFnZSwgdTY0IHN0YXJ0LCB1NjQgZW5kLAorCQkJIHN0cnVjdCBleHRlbnRfc3RhdGUgKnN0YXRlKQoreworCXN0cnVjdCBpb19mYWlsdXJlX3JlY29yZCAqZmFpbHJlYyA9IE5VTEw7CisJdTY0IHByaXZhdGU7CisJc3RydWN0IGV4dGVudF9tYXAgKmVtOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBwYWdlLT5tYXBwaW5nLT5ob3N0OworCXN0cnVjdCBleHRlbnRfaW9fdHJlZSAqZmFpbHVyZV90cmVlID0gJkJUUkZTX0koaW5vZGUpLT5pb19mYWlsdXJlX3RyZWU7CisJc3RydWN0IGV4dGVudF9tYXBfdHJlZSAqZW1fdHJlZSA9ICZCVFJGU19JKGlub2RlKS0+ZXh0ZW50X3RyZWU7CisJc3RydWN0IGJpbyAqYmlvOworCWludCBudW1fY29waWVzOworCWludCByZXQ7CisJaW50IHJ3OworCXU2NCBsb2dpY2FsOworCisJcmV0ID0gZ2V0X3N0YXRlX3ByaXZhdGUoZmFpbHVyZV90cmVlLCBzdGFydCwgJnByaXZhdGUpOworCWlmIChyZXQpIHsKKwkJZmFpbHJlYyA9IGttYWxsb2Moc2l6ZW9mKCpmYWlscmVjKSwgR0ZQX05PRlMpOworCQlpZiAoIWZhaWxyZWMpCisJCQlyZXR1cm4gLUVOT01FTTsKKwkJZmFpbHJlYy0+c3RhcnQgPSBzdGFydDsKKwkJZmFpbHJlYy0+bGVuID0gZW5kIC0gc3RhcnQgKyAxOworCQlmYWlscmVjLT5sYXN0X21pcnJvciA9IDA7CisJCWZhaWxyZWMtPmJpb19mbGFncyA9IDA7CisKKwkJc3Bpbl9sb2NrKCZlbV90cmVlLT5sb2NrKTsKKwkJZW0gPSBsb29rdXBfZXh0ZW50X21hcHBpbmcoZW1fdHJlZSwgc3RhcnQsIGZhaWxyZWMtPmxlbik7CisJCWlmIChlbS0+c3RhcnQgPiBzdGFydCB8fCBlbS0+c3RhcnQgKyBlbS0+bGVuIDwgc3RhcnQpIHsKKwkJCWZyZWVfZXh0ZW50X21hcChlbSk7CisJCQllbSA9IE5VTEw7CisJCX0KKwkJc3Bpbl91bmxvY2soJmVtX3RyZWUtPmxvY2spOworCisJCWlmICghZW0gfHwgSVNfRVJSKGVtKSkgeworCQkJa2ZyZWUoZmFpbHJlYyk7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCQlsb2dpY2FsID0gc3RhcnQgLSBlbS0+c3RhcnQ7CisJCWxvZ2ljYWwgPSBlbS0+YmxvY2tfc3RhcnQgKyBsb2dpY2FsOworCQlpZiAodGVzdF9iaXQoRVhURU5UX0ZMQUdfQ09NUFJFU1NFRCwgJmVtLT5mbGFncykpIHsKKwkJCWxvZ2ljYWwgPSBlbS0+YmxvY2tfc3RhcnQ7CisJCQlmYWlscmVjLT5iaW9fZmxhZ3MgPSBFWFRFTlRfQklPX0NPTVBSRVNTRUQ7CisJCX0KKwkJZmFpbHJlYy0+bG9naWNhbCA9IGxvZ2ljYWw7CisJCWZyZWVfZXh0ZW50X21hcChlbSk7CisJCXNldF9leHRlbnRfYml0cyhmYWlsdXJlX3RyZWUsIHN0YXJ0LCBlbmQsIEVYVEVOVF9MT0NLRUQgfAorCQkJCUVYVEVOVF9ESVJUWSwgR0ZQX05PRlMpOworCQlzZXRfc3RhdGVfcHJpdmF0ZShmYWlsdXJlX3RyZWUsIHN0YXJ0LAorCQkJCSAodTY0KSh1bnNpZ25lZCBsb25nKWZhaWxyZWMpOworCX0gZWxzZSB7CisJCWZhaWxyZWMgPSAoc3RydWN0IGlvX2ZhaWx1cmVfcmVjb3JkICopKHVuc2lnbmVkIGxvbmcpcHJpdmF0ZTsKKwl9CisJbnVtX2NvcGllcyA9IGJ0cmZzX251bV9jb3BpZXMoCisJCQkgICAgICAmQlRSRlNfSShpbm9kZSktPnJvb3QtPmZzX2luZm8tPm1hcHBpbmdfdHJlZSwKKwkJCSAgICAgIGZhaWxyZWMtPmxvZ2ljYWwsIGZhaWxyZWMtPmxlbik7CisJZmFpbHJlYy0+bGFzdF9taXJyb3IrKzsKKwlpZiAoIXN0YXRlKSB7CisJCXNwaW5fbG9jaygmQlRSRlNfSShpbm9kZSktPmlvX3RyZWUubG9jayk7CisJCXN0YXRlID0gZmluZF9maXJzdF9leHRlbnRfYml0X3N0YXRlKCZCVFJGU19JKGlub2RlKS0+aW9fdHJlZSwKKwkJCQkJCSAgICBmYWlscmVjLT5zdGFydCwKKwkJCQkJCSAgICBFWFRFTlRfTE9DS0VEKTsKKwkJaWYgKHN0YXRlICYmIHN0YXRlLT5zdGFydCAhPSBmYWlscmVjLT5zdGFydCkKKwkJCXN0YXRlID0gTlVMTDsKKwkJc3Bpbl91bmxvY2soJkJUUkZTX0koaW5vZGUpLT5pb190cmVlLmxvY2spOworCX0KKwlpZiAoIXN0YXRlIHx8IGZhaWxyZWMtPmxhc3RfbWlycm9yID4gbnVtX2NvcGllcykgeworCQlzZXRfc3RhdGVfcHJpdmF0ZShmYWlsdXJlX3RyZWUsIGZhaWxyZWMtPnN0YXJ0LCAwKTsKKwkJY2xlYXJfZXh0ZW50X2JpdHMoZmFpbHVyZV90cmVlLCBmYWlscmVjLT5zdGFydCwKKwkJCQkgIGZhaWxyZWMtPnN0YXJ0ICsgZmFpbHJlYy0+bGVuIC0gMSwKKwkJCQkgIEVYVEVOVF9MT0NLRUQgfCBFWFRFTlRfRElSVFksIEdGUF9OT0ZTKTsKKwkJa2ZyZWUoZmFpbHJlYyk7CisJCXJldHVybiAtRUlPOworCX0KKwliaW8gPSBiaW9fYWxsb2MoR0ZQX05PRlMsIDEpOworCWJpby0+YmlfcHJpdmF0ZSA9IHN0YXRlOworCWJpby0+YmlfZW5kX2lvID0gZmFpbGVkX2Jpby0+YmlfZW5kX2lvOworCWJpby0+Ymlfc2VjdG9yID0gZmFpbHJlYy0+bG9naWNhbCA+PiA5OworCWJpby0+YmlfYmRldiA9IGZhaWxlZF9iaW8tPmJpX2JkZXY7CisJYmlvLT5iaV9zaXplID0gMDsKKworCWJpb19hZGRfcGFnZShiaW8sIHBhZ2UsIGZhaWxyZWMtPmxlbiwgc3RhcnQgLSBwYWdlX29mZnNldChwYWdlKSk7CisJaWYgKGZhaWxlZF9iaW8tPmJpX3J3ICYgKDEgPDwgQklPX1JXKSkKKwkJcncgPSBXUklURTsKKwllbHNlCisJCXJ3ID0gUkVBRDsKKworCUJUUkZTX0koaW5vZGUpLT5pb190cmVlLm9wcy0+c3VibWl0X2Jpb19ob29rKGlub2RlLCBydywgYmlvLAorCQkJCQkJICAgICAgZmFpbHJlYy0+bGFzdF9taXJyb3IsCisJCQkJCQkgICAgICBmYWlscmVjLT5iaW9fZmxhZ3MpOworCXJldHVybiAwOworfQorCisvKgorICogZWFjaCB0aW1lIGFuIElPIGZpbmlzaGVzLCB3ZSBkbyBhIGZhc3QgY2hlY2sgaW4gdGhlIElPIGZhaWx1cmUgdHJlZQorICogdG8gc2VlIGlmIHdlIG5lZWQgdG8gcHJvY2VzcyBvciBjbGVhbiB1cCBhbiBpb19mYWlsdXJlX3JlY29yZAorICovCitzdGF0aWMgaW50IGJ0cmZzX2NsZWFuX2lvX2ZhaWx1cmVzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHU2NCBzdGFydCkKK3sKKwl1NjQgcHJpdmF0ZTsKKwl1NjQgcHJpdmF0ZV9mYWlsdXJlOworCXN0cnVjdCBpb19mYWlsdXJlX3JlY29yZCAqZmFpbHVyZTsKKwlpbnQgcmV0OworCisJcHJpdmF0ZSA9IDA7CisJaWYgKGNvdW50X3JhbmdlX2JpdHMoJkJUUkZTX0koaW5vZGUpLT5pb19mYWlsdXJlX3RyZWUsICZwcml2YXRlLAorCQkJICAgICAodTY0KS0xLCAxLCBFWFRFTlRfRElSVFkpKSB7CisJCXJldCA9IGdldF9zdGF0ZV9wcml2YXRlKCZCVFJGU19JKGlub2RlKS0+aW9fZmFpbHVyZV90cmVlLAorCQkJCQlzdGFydCwgJnByaXZhdGVfZmFpbHVyZSk7CisJCWlmIChyZXQgPT0gMCkgeworCQkJZmFpbHVyZSA9IChzdHJ1Y3QgaW9fZmFpbHVyZV9yZWNvcmQgKikodW5zaWduZWQgbG9uZykKKwkJCQkgICBwcml2YXRlX2ZhaWx1cmU7CisJCQlzZXRfc3RhdGVfcHJpdmF0ZSgmQlRSRlNfSShpbm9kZSktPmlvX2ZhaWx1cmVfdHJlZSwKKwkJCQkJICBmYWlsdXJlLT5zdGFydCwgMCk7CisJCQljbGVhcl9leHRlbnRfYml0cygmQlRSRlNfSShpbm9kZSktPmlvX2ZhaWx1cmVfdHJlZSwKKwkJCQkJICBmYWlsdXJlLT5zdGFydCwKKwkJCQkJICBmYWlsdXJlLT5zdGFydCArIGZhaWx1cmUtPmxlbiAtIDEsCisJCQkJCSAgRVhURU5UX0RJUlRZIHwgRVhURU5UX0xPQ0tFRCwKKwkJCQkJICBHRlBfTk9GUyk7CisJCQlrZnJlZShmYWlsdXJlKTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIHdoZW4gcmVhZHMgYXJlIGRvbmUsIHdlIG5lZWQgdG8gY2hlY2sgY3N1bXMgdG8gdmVyaWZ5IHRoZSBkYXRhIGlzIGNvcnJlY3QKKyAqIGlmIHRoZXJlJ3MgYSBtYXRjaCwgd2UgYWxsb3cgdGhlIGJpbyB0byBmaW5pc2guICBJZiBub3QsIHdlIGdvIHRocm91Z2gKKyAqIHRoZSBpb19mYWlsdXJlX3JlY29yZCByb3V0aW5lcyB0byBmaW5kIGdvb2QgY29waWVzCisgKi8KK3N0YXRpYyBpbnQgYnRyZnNfcmVhZHBhZ2VfZW5kX2lvX2hvb2soc3RydWN0IHBhZ2UgKnBhZ2UsIHU2NCBzdGFydCwgdTY0IGVuZCwKKwkJCSAgICAgICBzdHJ1Y3QgZXh0ZW50X3N0YXRlICpzdGF0ZSkKK3sKKwlzaXplX3Qgb2Zmc2V0ID0gc3RhcnQgLSAoKHU2NClwYWdlLT5pbmRleCA8PCBQQUdFX0NBQ0hFX1NISUZUKTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gcGFnZS0+bWFwcGluZy0+aG9zdDsKKwlzdHJ1Y3QgZXh0ZW50X2lvX3RyZWUgKmlvX3RyZWUgPSAmQlRSRlNfSShpbm9kZSktPmlvX3RyZWU7CisJY2hhciAqa2FkZHI7CisJdTY0IHByaXZhdGUgPSB+KHUzMikwOworCWludCByZXQ7CisJc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QgPSBCVFJGU19JKGlub2RlKS0+cm9vdDsKKwl1MzIgY3N1bSA9IH4odTMyKTA7CisKKwlpZiAoUGFnZUNoZWNrZWQocGFnZSkpIHsKKwkJQ2xlYXJQYWdlQ2hlY2tlZChwYWdlKTsKKwkJZ290byBnb29kOworCX0KKwlpZiAoYnRyZnNfdGVzdF9mbGFnKGlub2RlLCBOT0RBVEFTVU0pKQorCQlyZXR1cm4gMDsKKworCWlmIChyb290LT5yb290X2tleS5vYmplY3RpZCA9PSBCVFJGU19EQVRBX1JFTE9DX1RSRUVfT0JKRUNUSUQgJiYKKwkgICAgdGVzdF9yYW5nZV9iaXQoaW9fdHJlZSwgc3RhcnQsIGVuZCwgRVhURU5UX05PREFUQVNVTSwgMSkpIHsKKwkJY2xlYXJfZXh0ZW50X2JpdHMoaW9fdHJlZSwgc3RhcnQsIGVuZCwgRVhURU5UX05PREFUQVNVTSwKKwkJCQkgIEdGUF9OT0ZTKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKHN0YXRlICYmIHN0YXRlLT5zdGFydCA9PSBzdGFydCkgeworCQlwcml2YXRlID0gc3RhdGUtPnByaXZhdGU7CisJCXJldCA9IDA7CisJfSBlbHNlIHsKKwkJcmV0ID0gZ2V0X3N0YXRlX3ByaXZhdGUoaW9fdHJlZSwgc3RhcnQsICZwcml2YXRlKTsKKwl9CisJa2FkZHIgPSBrbWFwX2F0b21pYyhwYWdlLCBLTV9VU0VSMCk7CisJaWYgKHJldCkKKwkJZ290byB6ZXJvaXQ7CisKKwljc3VtID0gYnRyZnNfY3N1bV9kYXRhKHJvb3QsIGthZGRyICsgb2Zmc2V0LCBjc3VtLCAgZW5kIC0gc3RhcnQgKyAxKTsKKwlidHJmc19jc3VtX2ZpbmFsKGNzdW0sIChjaGFyICopJmNzdW0pOworCWlmIChjc3VtICE9IHByaXZhdGUpCisJCWdvdG8gemVyb2l0OworCisJa3VubWFwX2F0b21pYyhrYWRkciwgS01fVVNFUjApOworZ29vZDoKKwkvKiBpZiB0aGUgaW8gZmFpbHVyZSB0cmVlIGZvciB0aGlzIGlub2RlIGlzIG5vbi1lbXB0eSwKKwkgKiBjaGVjayB0byBzZWUgaWYgd2UndmUgcmVjb3ZlcmVkIGZyb20gYSBmYWlsZWQgSU8KKwkgKi8KKwlidHJmc19jbGVhbl9pb19mYWlsdXJlcyhpbm9kZSwgc3RhcnQpOworCXJldHVybiAwOworCit6ZXJvaXQ6CisJcHJpbnRrKEtFUk5fSU5GTyAiYnRyZnMgY3N1bSBmYWlsZWQgaW5vICVsdSBvZmYgJWxsdSBjc3VtICV1ICIKKwkgICAgICAgInByaXZhdGUgJWxsdVxuIiwgcGFnZS0+bWFwcGluZy0+aG9zdC0+aV9pbm8sCisJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpc3RhcnQsIGNzdW0sCisJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpcHJpdmF0ZSk7CisJbWVtc2V0KGthZGRyICsgb2Zmc2V0LCAxLCBlbmQgLSBzdGFydCArIDEpOworCWZsdXNoX2RjYWNoZV9wYWdlKHBhZ2UpOworCWt1bm1hcF9hdG9taWMoa2FkZHIsIEtNX1VTRVIwKTsKKwlpZiAocHJpdmF0ZSA9PSAwKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gLUVJTzsKK30KKworLyoKKyAqIFRoaXMgY3JlYXRlcyBhbiBvcnBoYW4gZW50cnkgZm9yIHRoZSBnaXZlbiBpbm9kZSBpbiBjYXNlIHNvbWV0aGluZyBnb2VzCisgKiB3cm9uZyBpbiB0aGUgbWlkZGxlIG9mIGFuIHVubGluay90cnVuY2F0ZS4KKyAqLworaW50IGJ0cmZzX29ycGhhbl9hZGQoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsIHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QgPSBCVFJGU19JKGlub2RlKS0+cm9vdDsKKwlpbnQgcmV0ID0gMDsKKworCXNwaW5fbG9jaygmcm9vdC0+bGlzdF9sb2NrKTsKKworCS8qIGFscmVhZHkgb24gdGhlIG9ycGhhbiBsaXN0LCB3ZSdyZSBnb29kICovCisJaWYgKCFsaXN0X2VtcHR5KCZCVFJGU19JKGlub2RlKS0+aV9vcnBoYW4pKSB7CisJCXNwaW5fdW5sb2NrKCZyb290LT5saXN0X2xvY2spOworCQlyZXR1cm4gMDsKKwl9CisKKwlsaXN0X2FkZCgmQlRSRlNfSShpbm9kZSktPmlfb3JwaGFuLCAmcm9vdC0+b3JwaGFuX2xpc3QpOworCisJc3Bpbl91bmxvY2soJnJvb3QtPmxpc3RfbG9jayk7CisKKwkvKgorCSAqIGluc2VydCBhbiBvcnBoYW4gaXRlbSB0byB0cmFjayB0aGlzIHVubGlua2VkL3RydW5jYXRlZCBmaWxlCisJICovCisJcmV0ID0gYnRyZnNfaW5zZXJ0X29ycGhhbl9pdGVtKHRyYW5zLCByb290LCBpbm9kZS0+aV9pbm8pOworCisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIFdlIGhhdmUgZG9uZSB0aGUgdHJ1bmNhdGUvZGVsZXRlIHNvIHdlIGNhbiBnbyBhaGVhZCBhbmQgcmVtb3ZlIHRoZSBvcnBoYW4KKyAqIGl0ZW0gZm9yIHRoaXMgcGFydGljdWxhciBpbm9kZS4KKyAqLworaW50IGJ0cmZzX29ycGhhbl9kZWwoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsIHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QgPSBCVFJGU19JKGlub2RlKS0+cm9vdDsKKwlpbnQgcmV0ID0gMDsKKworCXNwaW5fbG9jaygmcm9vdC0+bGlzdF9sb2NrKTsKKworCWlmIChsaXN0X2VtcHR5KCZCVFJGU19JKGlub2RlKS0+aV9vcnBoYW4pKSB7CisJCXNwaW5fdW5sb2NrKCZyb290LT5saXN0X2xvY2spOworCQlyZXR1cm4gMDsKKwl9CisKKwlsaXN0X2RlbF9pbml0KCZCVFJGU19JKGlub2RlKS0+aV9vcnBoYW4pOworCWlmICghdHJhbnMpIHsKKwkJc3Bpbl91bmxvY2soJnJvb3QtPmxpc3RfbG9jayk7CisJCXJldHVybiAwOworCX0KKworCXNwaW5fdW5sb2NrKCZyb290LT5saXN0X2xvY2spOworCisJcmV0ID0gYnRyZnNfZGVsX29ycGhhbl9pdGVtKHRyYW5zLCByb290LCBpbm9kZS0+aV9pbm8pOworCisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIHRoaXMgY2xlYW5zIHVwIGFueSBvcnBoYW5zIHRoYXQgbWF5IGJlIGxlZnQgb24gdGhlIGxpc3QgZnJvbSB0aGUgbGFzdCB1c2UKKyAqIG9mIHRoaXMgcm9vdC4KKyAqLwordm9pZCBidHJmc19vcnBoYW5fY2xlYW51cChzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCkKK3sKKwlzdHJ1Y3QgYnRyZnNfcGF0aCAqcGF0aDsKKwlzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqbGVhZjsKKwlzdHJ1Y3QgYnRyZnNfaXRlbSAqaXRlbTsKKwlzdHJ1Y3QgYnRyZnNfa2V5IGtleSwgZm91bmRfa2V5OworCXN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zOworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisJaW50IHJldCA9IDAsIG5yX3VubGluayA9IDAsIG5yX3RydW5jYXRlID0gMDsKKworCXBhdGggPSBidHJmc19hbGxvY19wYXRoKCk7CisJaWYgKCFwYXRoKQorCQlyZXR1cm47CisJcGF0aC0+cmVhZGEgPSAtMTsKKworCWtleS5vYmplY3RpZCA9IEJUUkZTX09SUEhBTl9PQkpFQ1RJRDsKKwlidHJmc19zZXRfa2V5X3R5cGUoJmtleSwgQlRSRlNfT1JQSEFOX0lURU1fS0VZKTsKKwlrZXkub2Zmc2V0ID0gKHU2NCktMTsKKworCisJd2hpbGUgKDEpIHsKKwkJcmV0ID0gYnRyZnNfc2VhcmNoX3Nsb3QoTlVMTCwgcm9vdCwgJmtleSwgcGF0aCwgMCwgMCk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIkVycm9yIHNlYXJjaGluZyBzbG90IGZvciBvcnBoYW46ICVkIgorCQkJICAgICAgICJcbiIsIHJldCk7CisJCQlicmVhazsKKwkJfQorCisJCS8qCisJCSAqIGlmIHJldCA9PSAwIG1lYW5zIHdlIGZvdW5kIHdoYXQgd2Ugd2VyZSBzZWFyY2hpbmcgZm9yLCB3aGljaAorCQkgKiBpcyB3ZWlyZCwgYnV0IHBvc3NpYmxlLCBzbyBvbmx5IHNjcmV3IHdpdGggcGF0aCBpZiB3ZSBkaWRudAorCQkgKiBmaW5kIHRoZSBrZXkgYW5kIHNlZSBpZiB3ZSBoYXZlIHN0dWZmIHRoYXQgbWF0Y2hlcworCQkgKi8KKwkJaWYgKHJldCA+IDApIHsKKwkJCWlmIChwYXRoLT5zbG90c1swXSA9PSAwKQorCQkJCWJyZWFrOworCQkJcGF0aC0+c2xvdHNbMF0tLTsKKwkJfQorCisJCS8qIHB1bGwgb3V0IHRoZSBpdGVtICovCisJCWxlYWYgPSBwYXRoLT5ub2Rlc1swXTsKKwkJaXRlbSA9IGJ0cmZzX2l0ZW1fbnIobGVhZiwgcGF0aC0+c2xvdHNbMF0pOworCQlidHJmc19pdGVtX2tleV90b19jcHUobGVhZiwgJmZvdW5kX2tleSwgcGF0aC0+c2xvdHNbMF0pOworCisJCS8qIG1ha2Ugc3VyZSB0aGUgaXRlbSBtYXRjaGVzIHdoYXQgd2Ugd2FudCAqLworCQlpZiAoZm91bmRfa2V5Lm9iamVjdGlkICE9IEJUUkZTX09SUEhBTl9PQkpFQ1RJRCkKKwkJCWJyZWFrOworCQlpZiAoYnRyZnNfa2V5X3R5cGUoJmZvdW5kX2tleSkgIT0gQlRSRlNfT1JQSEFOX0lURU1fS0VZKQorCQkJYnJlYWs7CisKKwkJLyogcmVsZWFzZSB0aGUgcGF0aCBzaW5jZSB3ZSdyZSBkb25lIHdpdGggaXQgKi8KKwkJYnRyZnNfcmVsZWFzZV9wYXRoKHJvb3QsIHBhdGgpOworCisJCS8qCisJCSAqIHRoaXMgaXMgd2hlcmUgd2UgYXJlIGJhc2ljYWxseSBidHJmc19sb29rdXAsIHdpdGhvdXQgdGhlCisJCSAqIGNyb3NzaW5nIHJvb3QgdGhpbmcuICB3ZSBzdG9yZSB0aGUgaW5vZGUgbnVtYmVyIGluIHRoZQorCQkgKiBvZmZzZXQgb2YgdGhlIG9ycGhhbiBpdGVtLgorCQkgKi8KKwkJaW5vZGUgPSBidHJmc19pZ2V0X2xvY2tlZChyb290LT5mc19pbmZvLT5zYiwKKwkJCQkJICBmb3VuZF9rZXkub2Zmc2V0LCByb290KTsKKwkJaWYgKCFpbm9kZSkKKwkJCWJyZWFrOworCisJCWlmIChpbm9kZS0+aV9zdGF0ZSAmIElfTkVXKSB7CisJCQlCVFJGU19JKGlub2RlKS0+cm9vdCA9IHJvb3Q7CisKKwkJCS8qIGhhdmUgdG8gc2V0IHRoZSBsb2NhdGlvbiBtYW51YWxseSAqLworCQkJQlRSRlNfSShpbm9kZSktPmxvY2F0aW9uLm9iamVjdGlkID0gaW5vZGUtPmlfaW5vOworCQkJQlRSRlNfSShpbm9kZSktPmxvY2F0aW9uLnR5cGUgPSBCVFJGU19JTk9ERV9JVEVNX0tFWTsKKwkJCUJUUkZTX0koaW5vZGUpLT5sb2NhdGlvbi5vZmZzZXQgPSAwOworCisJCQlidHJmc19yZWFkX2xvY2tlZF9pbm9kZShpbm9kZSk7CisJCQl1bmxvY2tfbmV3X2lub2RlKGlub2RlKTsKKwkJfQorCisJCS8qCisJCSAqIGFkZCB0aGlzIGlub2RlIHRvIHRoZSBvcnBoYW4gbGlzdCBzbyBidHJmc19vcnBoYW5fZGVsIGRvZXMKKwkJICogdGhlIHByb3BlciB0aGluZyB3aGVuIHdlIGhpdCBpdAorCQkgKi8KKwkJc3Bpbl9sb2NrKCZyb290LT5saXN0X2xvY2spOworCQlsaXN0X2FkZCgmQlRSRlNfSShpbm9kZSktPmlfb3JwaGFuLCAmcm9vdC0+b3JwaGFuX2xpc3QpOworCQlzcGluX3VubG9jaygmcm9vdC0+bGlzdF9sb2NrKTsKKworCQkvKgorCQkgKiBpZiB0aGlzIGlzIGEgYmFkIGlub2RlLCBtZWFucyB3ZSBhY3R1YWxseSBzdWNjZWVkZWQgaW4KKwkJICogcmVtb3ZpbmcgdGhlIGlub2RlLCBidXQgbm90IHRoZSBvcnBoYW4gcmVjb3JkLCB3aGljaCBtZWFucworCQkgKiB3ZSBuZWVkIHRvIG1hbnVhbGx5IGRlbGV0ZSB0aGUgb3JwaGFuIHNpbmNlIGlwdXQgd2lsbCBqdXN0CisJCSAqIGRvIGEgZGVzdHJveV9pbm9kZQorCQkgKi8KKwkJaWYgKGlzX2JhZF9pbm9kZShpbm9kZSkpIHsKKwkJCXRyYW5zID0gYnRyZnNfc3RhcnRfdHJhbnNhY3Rpb24ocm9vdCwgMSk7CisJCQlidHJmc19vcnBoYW5fZGVsKHRyYW5zLCBpbm9kZSk7CisJCQlidHJmc19lbmRfdHJhbnNhY3Rpb24odHJhbnMsIHJvb3QpOworCQkJaXB1dChpbm9kZSk7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIGlmIHdlIGhhdmUgbGlua3MsIHRoaXMgd2FzIGEgdHJ1bmNhdGUsIGxldHMgZG8gdGhhdCAqLworCQlpZiAoaW5vZGUtPmlfbmxpbmspIHsKKwkJCW5yX3RydW5jYXRlKys7CisJCQlidHJmc190cnVuY2F0ZShpbm9kZSk7CisJCX0gZWxzZSB7CisJCQlucl91bmxpbmsrKzsKKwkJfQorCisJCS8qIHRoaXMgd2lsbCBkbyBkZWxldGVfaW5vZGUgYW5kIGV2ZXJ5dGhpbmcgZm9yIHVzICovCisJCWlwdXQoaW5vZGUpOworCX0KKworCWlmIChucl91bmxpbmspCisJCXByaW50ayhLRVJOX0lORk8gImJ0cmZzOiB1bmxpbmtlZCAlZCBvcnBoYW5zXG4iLCBucl91bmxpbmspOworCWlmIChucl90cnVuY2F0ZSkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiYnRyZnM6IHRydW5jYXRlZCAlZCBvcnBoYW5zXG4iLCBucl90cnVuY2F0ZSk7CisKKwlidHJmc19mcmVlX3BhdGgocGF0aCk7Cit9CisKKy8qCisgKiByZWFkIGFuIGlub2RlIGZyb20gdGhlIGJ0cmVlIGludG8gdGhlIGluLW1lbW9yeSBpbm9kZQorICovCit2b2lkIGJ0cmZzX3JlYWRfbG9ja2VkX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJc3RydWN0IGJ0cmZzX3BhdGggKnBhdGg7CisJc3RydWN0IGV4dGVudF9idWZmZXIgKmxlYWY7CisJc3RydWN0IGJ0cmZzX2lub2RlX2l0ZW0gKmlub2RlX2l0ZW07CisJc3RydWN0IGJ0cmZzX3RpbWVzcGVjICp0c3BlYzsKKwlzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCA9IEJUUkZTX0koaW5vZGUpLT5yb290OworCXN0cnVjdCBidHJmc19rZXkgbG9jYXRpb247CisJdTY0IGFsbG9jX2dyb3VwX2Jsb2NrOworCXUzMiByZGV2OworCWludCByZXQ7CisKKwlwYXRoID0gYnRyZnNfYWxsb2NfcGF0aCgpOworCUJVR19PTighcGF0aCk7CisJbWVtY3B5KCZsb2NhdGlvbiwgJkJUUkZTX0koaW5vZGUpLT5sb2NhdGlvbiwgc2l6ZW9mKGxvY2F0aW9uKSk7CisKKwlyZXQgPSBidHJmc19sb29rdXBfaW5vZGUoTlVMTCwgcm9vdCwgcGF0aCwgJmxvY2F0aW9uLCAwKTsKKwlpZiAocmV0KQorCQlnb3RvIG1ha2VfYmFkOworCisJbGVhZiA9IHBhdGgtPm5vZGVzWzBdOworCWlub2RlX2l0ZW0gPSBidHJmc19pdGVtX3B0cihsZWFmLCBwYXRoLT5zbG90c1swXSwKKwkJCQkgICAgc3RydWN0IGJ0cmZzX2lub2RlX2l0ZW0pOworCisJaW5vZGUtPmlfbW9kZSA9IGJ0cmZzX2lub2RlX21vZGUobGVhZiwgaW5vZGVfaXRlbSk7CisJaW5vZGUtPmlfbmxpbmsgPSBidHJmc19pbm9kZV9ubGluayhsZWFmLCBpbm9kZV9pdGVtKTsKKwlpbm9kZS0+aV91aWQgPSBidHJmc19pbm9kZV91aWQobGVhZiwgaW5vZGVfaXRlbSk7CisJaW5vZGUtPmlfZ2lkID0gYnRyZnNfaW5vZGVfZ2lkKGxlYWYsIGlub2RlX2l0ZW0pOworCWJ0cmZzX2lfc2l6ZV93cml0ZShpbm9kZSwgYnRyZnNfaW5vZGVfc2l6ZShsZWFmLCBpbm9kZV9pdGVtKSk7CisKKwl0c3BlYyA9IGJ0cmZzX2lub2RlX2F0aW1lKGlub2RlX2l0ZW0pOworCWlub2RlLT5pX2F0aW1lLnR2X3NlYyA9IGJ0cmZzX3RpbWVzcGVjX3NlYyhsZWFmLCB0c3BlYyk7CisJaW5vZGUtPmlfYXRpbWUudHZfbnNlYyA9IGJ0cmZzX3RpbWVzcGVjX25zZWMobGVhZiwgdHNwZWMpOworCisJdHNwZWMgPSBidHJmc19pbm9kZV9tdGltZShpbm9kZV9pdGVtKTsKKwlpbm9kZS0+aV9tdGltZS50dl9zZWMgPSBidHJmc190aW1lc3BlY19zZWMobGVhZiwgdHNwZWMpOworCWlub2RlLT5pX210aW1lLnR2X25zZWMgPSBidHJmc190aW1lc3BlY19uc2VjKGxlYWYsIHRzcGVjKTsKKworCXRzcGVjID0gYnRyZnNfaW5vZGVfY3RpbWUoaW5vZGVfaXRlbSk7CisJaW5vZGUtPmlfY3RpbWUudHZfc2VjID0gYnRyZnNfdGltZXNwZWNfc2VjKGxlYWYsIHRzcGVjKTsKKwlpbm9kZS0+aV9jdGltZS50dl9uc2VjID0gYnRyZnNfdGltZXNwZWNfbnNlYyhsZWFmLCB0c3BlYyk7CisKKwlpbm9kZV9zZXRfYnl0ZXMoaW5vZGUsIGJ0cmZzX2lub2RlX25ieXRlcyhsZWFmLCBpbm9kZV9pdGVtKSk7CisJQlRSRlNfSShpbm9kZSktPmdlbmVyYXRpb24gPSBidHJmc19pbm9kZV9nZW5lcmF0aW9uKGxlYWYsIGlub2RlX2l0ZW0pOworCUJUUkZTX0koaW5vZGUpLT5zZXF1ZW5jZSA9IGJ0cmZzX2lub2RlX3NlcXVlbmNlKGxlYWYsIGlub2RlX2l0ZW0pOworCWlub2RlLT5pX2dlbmVyYXRpb24gPSBCVFJGU19JKGlub2RlKS0+Z2VuZXJhdGlvbjsKKwlpbm9kZS0+aV9yZGV2ID0gMDsKKwlyZGV2ID0gYnRyZnNfaW5vZGVfcmRldihsZWFmLCBpbm9kZV9pdGVtKTsKKworCUJUUkZTX0koaW5vZGUpLT5pbmRleF9jbnQgPSAodTY0KS0xOworCUJUUkZTX0koaW5vZGUpLT5mbGFncyA9IGJ0cmZzX2lub2RlX2ZsYWdzKGxlYWYsIGlub2RlX2l0ZW0pOworCisJYWxsb2NfZ3JvdXBfYmxvY2sgPSBidHJmc19pbm9kZV9ibG9ja19ncm91cChsZWFmLCBpbm9kZV9pdGVtKTsKKwlCVFJGU19JKGlub2RlKS0+YmxvY2tfZ3JvdXAgPSBidHJmc19maW5kX2Jsb2NrX2dyb3VwKHJvb3QsIDAsCisJCQkJCQlhbGxvY19ncm91cF9ibG9jaywgMCk7CisJYnRyZnNfZnJlZV9wYXRoKHBhdGgpOworCWlub2RlX2l0ZW0gPSBOVUxMOworCisJc3dpdGNoIChpbm9kZS0+aV9tb2RlICYgU19JRk1UKSB7CisJY2FzZSBTX0lGUkVHOgorCQlpbm9kZS0+aV9tYXBwaW5nLT5hX29wcyA9ICZidHJmc19hb3BzOworCQlpbm9kZS0+aV9tYXBwaW5nLT5iYWNraW5nX2Rldl9pbmZvID0gJnJvb3QtPmZzX2luZm8tPmJkaTsKKwkJQlRSRlNfSShpbm9kZSktPmlvX3RyZWUub3BzID0gJmJ0cmZzX2V4dGVudF9pb19vcHM7CisJCWlub2RlLT5pX2ZvcCA9ICZidHJmc19maWxlX29wZXJhdGlvbnM7CisJCWlub2RlLT5pX29wID0gJmJ0cmZzX2ZpbGVfaW5vZGVfb3BlcmF0aW9uczsKKwkJYnJlYWs7CisJY2FzZSBTX0lGRElSOgorCQlpbm9kZS0+aV9mb3AgPSAmYnRyZnNfZGlyX2ZpbGVfb3BlcmF0aW9uczsKKwkJaWYgKHJvb3QgPT0gcm9vdC0+ZnNfaW5mby0+dHJlZV9yb290KQorCQkJaW5vZGUtPmlfb3AgPSAmYnRyZnNfZGlyX3JvX2lub2RlX29wZXJhdGlvbnM7CisJCWVsc2UKKwkJCWlub2RlLT5pX29wID0gJmJ0cmZzX2Rpcl9pbm9kZV9vcGVyYXRpb25zOworCQlicmVhazsKKwljYXNlIFNfSUZMTks6CisJCWlub2RlLT5pX29wID0gJmJ0cmZzX3N5bWxpbmtfaW5vZGVfb3BlcmF0aW9uczsKKwkJaW5vZGUtPmlfbWFwcGluZy0+YV9vcHMgPSAmYnRyZnNfc3ltbGlua19hb3BzOworCQlpbm9kZS0+aV9tYXBwaW5nLT5iYWNraW5nX2Rldl9pbmZvID0gJnJvb3QtPmZzX2luZm8tPmJkaTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJaW5pdF9zcGVjaWFsX2lub2RlKGlub2RlLCBpbm9kZS0+aV9tb2RlLCByZGV2KTsKKwkJYnJlYWs7CisJfQorCXJldHVybjsKKworbWFrZV9iYWQ6CisJYnRyZnNfZnJlZV9wYXRoKHBhdGgpOworCW1ha2VfYmFkX2lub2RlKGlub2RlKTsKK30KKworLyoKKyAqIGdpdmVuIGEgbGVhZiBhbmQgYW4gaW5vZGUsIGNvcHkgdGhlIGlub2RlIGZpZWxkcyBpbnRvIHRoZSBsZWFmCisgKi8KK3N0YXRpYyB2b2lkIGZpbGxfaW5vZGVfaXRlbShzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKKwkJCSAgICBzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqbGVhZiwKKwkJCSAgICBzdHJ1Y3QgYnRyZnNfaW5vZGVfaXRlbSAqaXRlbSwKKwkJCSAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCWJ0cmZzX3NldF9pbm9kZV91aWQobGVhZiwgaXRlbSwgaW5vZGUtPmlfdWlkKTsKKwlidHJmc19zZXRfaW5vZGVfZ2lkKGxlYWYsIGl0ZW0sIGlub2RlLT5pX2dpZCk7CisJYnRyZnNfc2V0X2lub2RlX3NpemUobGVhZiwgaXRlbSwgQlRSRlNfSShpbm9kZSktPmRpc2tfaV9zaXplKTsKKwlidHJmc19zZXRfaW5vZGVfbW9kZShsZWFmLCBpdGVtLCBpbm9kZS0+aV9tb2RlKTsKKwlidHJmc19zZXRfaW5vZGVfbmxpbmsobGVhZiwgaXRlbSwgaW5vZGUtPmlfbmxpbmspOworCisJYnRyZnNfc2V0X3RpbWVzcGVjX3NlYyhsZWFmLCBidHJmc19pbm9kZV9hdGltZShpdGVtKSwKKwkJCSAgICAgICBpbm9kZS0+aV9hdGltZS50dl9zZWMpOworCWJ0cmZzX3NldF90aW1lc3BlY19uc2VjKGxlYWYsIGJ0cmZzX2lub2RlX2F0aW1lKGl0ZW0pLAorCQkJCWlub2RlLT5pX2F0aW1lLnR2X25zZWMpOworCisJYnRyZnNfc2V0X3RpbWVzcGVjX3NlYyhsZWFmLCBidHJmc19pbm9kZV9tdGltZShpdGVtKSwKKwkJCSAgICAgICBpbm9kZS0+aV9tdGltZS50dl9zZWMpOworCWJ0cmZzX3NldF90aW1lc3BlY19uc2VjKGxlYWYsIGJ0cmZzX2lub2RlX210aW1lKGl0ZW0pLAorCQkJCWlub2RlLT5pX210aW1lLnR2X25zZWMpOworCisJYnRyZnNfc2V0X3RpbWVzcGVjX3NlYyhsZWFmLCBidHJmc19pbm9kZV9jdGltZShpdGVtKSwKKwkJCSAgICAgICBpbm9kZS0+aV9jdGltZS50dl9zZWMpOworCWJ0cmZzX3NldF90aW1lc3BlY19uc2VjKGxlYWYsIGJ0cmZzX2lub2RlX2N0aW1lKGl0ZW0pLAorCQkJCWlub2RlLT5pX2N0aW1lLnR2X25zZWMpOworCisJYnRyZnNfc2V0X2lub2RlX25ieXRlcyhsZWFmLCBpdGVtLCBpbm9kZV9nZXRfYnl0ZXMoaW5vZGUpKTsKKwlidHJmc19zZXRfaW5vZGVfZ2VuZXJhdGlvbihsZWFmLCBpdGVtLCBCVFJGU19JKGlub2RlKS0+Z2VuZXJhdGlvbik7CisJYnRyZnNfc2V0X2lub2RlX3NlcXVlbmNlKGxlYWYsIGl0ZW0sIEJUUkZTX0koaW5vZGUpLT5zZXF1ZW5jZSk7CisJYnRyZnNfc2V0X2lub2RlX3RyYW5zaWQobGVhZiwgaXRlbSwgdHJhbnMtPnRyYW5zaWQpOworCWJ0cmZzX3NldF9pbm9kZV9yZGV2KGxlYWYsIGl0ZW0sIGlub2RlLT5pX3JkZXYpOworCWJ0cmZzX3NldF9pbm9kZV9mbGFncyhsZWFmLCBpdGVtLCBCVFJGU19JKGlub2RlKS0+ZmxhZ3MpOworCWJ0cmZzX3NldF9pbm9kZV9ibG9ja19ncm91cChsZWFmLCBpdGVtLCBCVFJGU19JKGlub2RlKS0+YmxvY2tfZ3JvdXApOworfQorCisvKgorICogY29weSBldmVyeXRoaW5nIGluIHRoZSBpbi1tZW1vcnkgaW5vZGUgaW50byB0aGUgYnRyZWUuCisgKi8KK25vaW5saW5lIGludCBidHJmc191cGRhdGVfaW5vZGUoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCisJCQkJc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsIHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJc3RydWN0IGJ0cmZzX2lub2RlX2l0ZW0gKmlub2RlX2l0ZW07CisJc3RydWN0IGJ0cmZzX3BhdGggKnBhdGg7CisJc3RydWN0IGV4dGVudF9idWZmZXIgKmxlYWY7CisJaW50IHJldDsKKworCXBhdGggPSBidHJmc19hbGxvY19wYXRoKCk7CisJQlVHX09OKCFwYXRoKTsKKwlyZXQgPSBidHJmc19sb29rdXBfaW5vZGUodHJhbnMsIHJvb3QsIHBhdGgsCisJCQkJICZCVFJGU19JKGlub2RlKS0+bG9jYXRpb24sIDEpOworCWlmIChyZXQpIHsKKwkJaWYgKHJldCA+IDApCisJCQlyZXQgPSAtRU5PRU5UOworCQlnb3RvIGZhaWxlZDsKKwl9CisKKwlsZWFmID0gcGF0aC0+bm9kZXNbMF07CisJaW5vZGVfaXRlbSA9IGJ0cmZzX2l0ZW1fcHRyKGxlYWYsIHBhdGgtPnNsb3RzWzBdLAorCQkJCSAgc3RydWN0IGJ0cmZzX2lub2RlX2l0ZW0pOworCisJZmlsbF9pbm9kZV9pdGVtKHRyYW5zLCBsZWFmLCBpbm9kZV9pdGVtLCBpbm9kZSk7CisJYnRyZnNfbWFya19idWZmZXJfZGlydHkobGVhZik7CisJYnRyZnNfc2V0X2lub2RlX2xhc3RfdHJhbnModHJhbnMsIGlub2RlKTsKKwlyZXQgPSAwOworZmFpbGVkOgorCWJ0cmZzX2ZyZWVfcGF0aChwYXRoKTsKKwlyZXR1cm4gcmV0OworfQorCisKKy8qCisgKiB1bmxpbmsgaGVscGVyIHRoYXQgZ2V0cyB1c2VkIGhlcmUgaW4gaW5vZGUuYyBhbmQgaW4gdGhlIHRyZWUgbG9nZ2luZworICogcmVjb3ZlcnkgY29kZS4gIEl0IHJlbW92ZSBhIGxpbmsgaW4gYSBkaXJlY3Rvcnkgd2l0aCBhIGdpdmVuIG5hbWUsIGFuZAorICogYWxzbyBkcm9wcyB0aGUgYmFjayByZWZzIGluIHRoZSBpbm9kZSB0byB0aGUgZGlyZWN0b3J5CisgKi8KK2ludCBidHJmc191bmxpbmtfaW5vZGUoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCisJCSAgICAgICBzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwKKwkJICAgICAgIHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkgICAgICAgY29uc3QgY2hhciAqbmFtZSwgaW50IG5hbWVfbGVuKQoreworCXN0cnVjdCBidHJmc19wYXRoICpwYXRoOworCWludCByZXQgPSAwOworCXN0cnVjdCBleHRlbnRfYnVmZmVyICpsZWFmOworCXN0cnVjdCBidHJmc19kaXJfaXRlbSAqZGk7CisJc3RydWN0IGJ0cmZzX2tleSBrZXk7CisJdTY0IGluZGV4OworCisJcGF0aCA9IGJ0cmZzX2FsbG9jX3BhdGgoKTsKKwlpZiAoIXBhdGgpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnI7CisJfQorCisJZGkgPSBidHJmc19sb29rdXBfZGlyX2l0ZW0odHJhbnMsIHJvb3QsIHBhdGgsIGRpci0+aV9pbm8sCisJCQkJICAgIG5hbWUsIG5hbWVfbGVuLCAtMSk7CisJaWYgKElTX0VSUihkaSkpIHsKKwkJcmV0ID0gUFRSX0VSUihkaSk7CisJCWdvdG8gZXJyOworCX0KKwlpZiAoIWRpKSB7CisJCXJldCA9IC1FTk9FTlQ7CisJCWdvdG8gZXJyOworCX0KKwlsZWFmID0gcGF0aC0+bm9kZXNbMF07CisJYnRyZnNfZGlyX2l0ZW1fa2V5X3RvX2NwdShsZWFmLCBkaSwgJmtleSk7CisJcmV0ID0gYnRyZnNfZGVsZXRlX29uZV9kaXJfbmFtZSh0cmFucywgcm9vdCwgcGF0aCwgZGkpOworCWlmIChyZXQpCisJCWdvdG8gZXJyOworCWJ0cmZzX3JlbGVhc2VfcGF0aChyb290LCBwYXRoKTsKKworCXJldCA9IGJ0cmZzX2RlbF9pbm9kZV9yZWYodHJhbnMsIHJvb3QsIG5hbWUsIG5hbWVfbGVuLAorCQkJCSAgaW5vZGUtPmlfaW5vLAorCQkJCSAgZGlyLT5pX2lubywgJmluZGV4KTsKKwlpZiAocmV0KSB7CisJCXByaW50ayhLRVJOX0lORk8gImJ0cmZzIGZhaWxlZCB0byBkZWxldGUgcmVmZXJlbmNlIHRvICUuKnMsICIKKwkJICAgICAgICJpbm9kZSAlbHUgcGFyZW50ICVsdVxuIiwgbmFtZV9sZW4sIG5hbWUsCisJCSAgICAgICBpbm9kZS0+aV9pbm8sIGRpci0+aV9pbm8pOworCQlnb3RvIGVycjsKKwl9CisKKwlkaSA9IGJ0cmZzX2xvb2t1cF9kaXJfaW5kZXhfaXRlbSh0cmFucywgcm9vdCwgcGF0aCwgZGlyLT5pX2lubywKKwkJCQkJIGluZGV4LCBuYW1lLCBuYW1lX2xlbiwgLTEpOworCWlmIChJU19FUlIoZGkpKSB7CisJCXJldCA9IFBUUl9FUlIoZGkpOworCQlnb3RvIGVycjsKKwl9CisJaWYgKCFkaSkgeworCQlyZXQgPSAtRU5PRU5UOworCQlnb3RvIGVycjsKKwl9CisJcmV0ID0gYnRyZnNfZGVsZXRlX29uZV9kaXJfbmFtZSh0cmFucywgcm9vdCwgcGF0aCwgZGkpOworCWJ0cmZzX3JlbGVhc2VfcGF0aChyb290LCBwYXRoKTsKKworCXJldCA9IGJ0cmZzX2RlbF9pbm9kZV9yZWZfaW5fbG9nKHRyYW5zLCByb290LCBuYW1lLCBuYW1lX2xlbiwKKwkJCQkJIGlub2RlLCBkaXItPmlfaW5vKTsKKwlCVUdfT04ocmV0ICE9IDAgJiYgcmV0ICE9IC1FTk9FTlQpOworCWlmIChyZXQgIT0gLUVOT0VOVCkKKwkJQlRSRlNfSShkaXIpLT5sb2dfZGlydHlfdHJhbnMgPSB0cmFucy0+dHJhbnNpZDsKKworCXJldCA9IGJ0cmZzX2RlbF9kaXJfZW50cmllc19pbl9sb2codHJhbnMsIHJvb3QsIG5hbWUsIG5hbWVfbGVuLAorCQkJCQkgICBkaXIsIGluZGV4KTsKKwlCVUdfT04ocmV0KTsKK2VycjoKKwlidHJmc19mcmVlX3BhdGgocGF0aCk7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisKKwlidHJmc19pX3NpemVfd3JpdGUoZGlyLCBkaXItPmlfc2l6ZSAtIG5hbWVfbGVuICogMik7CisJaW5vZGUtPmlfY3RpbWUgPSBkaXItPmlfbXRpbWUgPSBkaXItPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUU7CisJYnRyZnNfdXBkYXRlX2lub2RlKHRyYW5zLCByb290LCBkaXIpOworCWJ0cmZzX2Ryb3BfbmxpbmsoaW5vZGUpOworCXJldCA9IGJ0cmZzX3VwZGF0ZV9pbm9kZSh0cmFucywgcm9vdCwgaW5vZGUpOworCWRpci0+aV9zYi0+c19kaXJ0ID0gMTsKK291dDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGJ0cmZzX3VubGluayhzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5KQoreworCXN0cnVjdCBidHJmc19yb290ICpyb290OworCXN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CisJaW50IHJldDsKKwl1bnNpZ25lZCBsb25nIG5yID0gMDsKKworCXJvb3QgPSBCVFJGU19JKGRpciktPnJvb3Q7CisKKwlyZXQgPSBidHJmc19jaGVja19mcmVlX3NwYWNlKHJvb3QsIDEsIDEpOworCWlmIChyZXQpCisJCWdvdG8gZmFpbDsKKworCXRyYW5zID0gYnRyZnNfc3RhcnRfdHJhbnNhY3Rpb24ocm9vdCwgMSk7CisKKwlidHJmc19zZXRfdHJhbnNfYmxvY2tfZ3JvdXAodHJhbnMsIGRpcik7CisJcmV0ID0gYnRyZnNfdW5saW5rX2lub2RlKHRyYW5zLCByb290LCBkaXIsIGRlbnRyeS0+ZF9pbm9kZSwKKwkJCQkgZGVudHJ5LT5kX25hbWUubmFtZSwgZGVudHJ5LT5kX25hbWUubGVuKTsKKworCWlmIChpbm9kZS0+aV9ubGluayA9PSAwKQorCQlyZXQgPSBidHJmc19vcnBoYW5fYWRkKHRyYW5zLCBpbm9kZSk7CisKKwluciA9IHRyYW5zLT5ibG9ja3NfdXNlZDsKKworCWJ0cmZzX2VuZF90cmFuc2FjdGlvbl90aHJvdHRsZSh0cmFucywgcm9vdCk7CitmYWlsOgorCWJ0cmZzX2J0cmVlX2JhbGFuY2VfZGlydHkocm9vdCwgbnIpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYnRyZnNfcm1kaXIoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZGVudHJ5LT5kX2lub2RlOworCWludCBlcnIgPSAwOworCWludCByZXQ7CisJc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QgPSBCVFJGU19JKGRpciktPnJvb3Q7CisJc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnM7CisJdW5zaWduZWQgbG9uZyBuciA9IDA7CisKKwkvKgorCSAqIHRoZSBGSVJTVF9GUkVFX09CSkVDVElEIGNoZWNrIG1ha2VzIHN1cmUgd2UgZG9uJ3QgdHJ5IHRvIHJtZGlyCisJICogdGhlIHJvb3Qgb2YgYSBzdWJ2b2x1bWUgb3Igc25hcHNob3QKKwkgKi8KKwlpZiAoaW5vZGUtPmlfc2l6ZSA+IEJUUkZTX0VNUFRZX0RJUl9TSVpFIHx8CisJICAgIGlub2RlLT5pX2lubyA9PSBCVFJGU19GSVJTVF9GUkVFX09CSkVDVElEKSB7CisJCXJldHVybiAtRU5PVEVNUFRZOworCX0KKworCXJldCA9IGJ0cmZzX2NoZWNrX2ZyZWVfc3BhY2Uocm9vdCwgMSwgMSk7CisJaWYgKHJldCkKKwkJZ290byBmYWlsOworCisJdHJhbnMgPSBidHJmc19zdGFydF90cmFuc2FjdGlvbihyb290LCAxKTsKKwlidHJmc19zZXRfdHJhbnNfYmxvY2tfZ3JvdXAodHJhbnMsIGRpcik7CisKKwllcnIgPSBidHJmc19vcnBoYW5fYWRkKHRyYW5zLCBpbm9kZSk7CisJaWYgKGVycikKKwkJZ290byBmYWlsX3RyYW5zOworCisJLyogbm93IHRoZSBkaXJlY3RvcnkgaXMgZW1wdHkgKi8KKwllcnIgPSBidHJmc191bmxpbmtfaW5vZGUodHJhbnMsIHJvb3QsIGRpciwgZGVudHJ5LT5kX2lub2RlLAorCQkJCSBkZW50cnktPmRfbmFtZS5uYW1lLCBkZW50cnktPmRfbmFtZS5sZW4pOworCWlmICghZXJyKQorCQlidHJmc19pX3NpemVfd3JpdGUoaW5vZGUsIDApOworCitmYWlsX3RyYW5zOgorCW5yID0gdHJhbnMtPmJsb2Nrc191c2VkOworCXJldCA9IGJ0cmZzX2VuZF90cmFuc2FjdGlvbl90aHJvdHRsZSh0cmFucywgcm9vdCk7CitmYWlsOgorCWJ0cmZzX2J0cmVlX2JhbGFuY2VfZGlydHkocm9vdCwgbnIpOworCisJaWYgKHJldCAmJiAhZXJyKQorCQllcnIgPSByZXQ7CisJcmV0dXJuIGVycjsKK30KKworI2lmIDAKKy8qCisgKiB3aGVuIHRydW5jYXRpbmcgYnl0ZXMgaW4gYSBmaWxlLCBpdCBpcyBwb3NzaWJsZSB0byBhdm9pZCByZWFkaW5nCisgKiB0aGUgbGVhdmVzIHRoYXQgY29udGFpbiBvbmx5IGNoZWNrc3VtIGl0ZW1zLiAgVGhpcyBjYW4gYmUgdGhlCisgKiBtYWpvcml0eSBvZiB0aGUgSU8gcmVxdWlyZWQgdG8gZGVsZXRlIGEgbGFyZ2UgZmlsZSwgYnV0IGl0IG11c3QKKyAqIGJlIGRvbmUgY2FyZWZ1bGx5LgorICoKKyAqIFRoZSBrZXlzIGluIHRoZSBsZXZlbCBqdXN0IGFib3ZlIHRoZSBsZWF2ZXMgYXJlIGNoZWNrZWQgdG8gbWFrZSBzdXJlCisgKiB0aGUgbG93ZXN0IGtleSBpbiBhIGdpdmVuIGxlYWYgaXMgYSBjc3VtIGtleSwgYW5kIHN0YXJ0cyBhdCBhbiBvZmZzZXQKKyAqIGFmdGVyIHRoZSBuZXcgIHNpemUuCisgKgorICogVGhlbiB0aGUga2V5IGZvciB0aGUgbmV4dCBsZWFmIGlzIGNoZWNrZWQgdG8gbWFrZSBzdXJlIGl0IGFsc28gaGFzCisgKiBhIGNoZWNrc3VtIGl0ZW0gZm9yIHRoZSBzYW1lIGZpbGUuICBJZiBpdCBkb2VzLCB3ZSBrbm93IG91ciB0YXJnZXQgbGVhZgorICogY29udGFpbnMgb25seSBjaGVja3N1bSBpdGVtcywgYW5kIGl0IGNhbiBiZSBzYWZlbHkgZnJlZWQgd2l0aG91dCByZWFkaW5nCisgKiBpdC4KKyAqCisgKiBUaGlzIGlzIGp1c3QgYW4gb3B0aW1pemF0aW9uIHRhcmdldGVkIGF0IGxhcmdlIGZpbGVzLiAgSXQgbWF5IGRvCisgKiBub3RoaW5nLiAgSXQgd2lsbCByZXR1cm4gMCB1bmxlc3MgdGhpbmdzIHdlbnQgYmFkbHkuCisgKi8KK3N0YXRpYyBub2lubGluZSBpbnQgZHJvcF9jc3VtX2xlYXZlcyhzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKKwkJCQkgICAgIHN0cnVjdCBidHJmc19yb290ICpyb290LAorCQkJCSAgICAgc3RydWN0IGJ0cmZzX3BhdGggKnBhdGgsCisJCQkJICAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1NjQgbmV3X3NpemUpCit7CisJc3RydWN0IGJ0cmZzX2tleSBrZXk7CisJaW50IHJldDsKKwlpbnQgbnJpdGVtczsKKwlzdHJ1Y3QgYnRyZnNfa2V5IGZvdW5kX2tleTsKKwlzdHJ1Y3QgYnRyZnNfa2V5IG90aGVyX2tleTsKKwlzdHJ1Y3QgYnRyZnNfbGVhZl9yZWYgKnJlZjsKKwl1NjQgbGVhZl9nZW47CisJdTY0IGxlYWZfc3RhcnQ7CisKKwlwYXRoLT5sb3dlc3RfbGV2ZWwgPSAxOworCWtleS5vYmplY3RpZCA9IGlub2RlLT5pX2lubzsKKwlrZXkudHlwZSA9IEJUUkZTX0NTVU1fSVRFTV9LRVk7CisJa2V5Lm9mZnNldCA9IG5ld19zaXplOworYWdhaW46CisJcmV0ID0gYnRyZnNfc2VhcmNoX3Nsb3QodHJhbnMsIHJvb3QsICZrZXksIHBhdGgsIC0xLCAxKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXQ7CisKKwlpZiAocGF0aC0+bm9kZXNbMV0gPT0gTlVMTCkgeworCQlyZXQgPSAwOworCQlnb3RvIG91dDsKKwl9CisJcmV0ID0gMDsKKwlidHJmc19ub2RlX2tleV90b19jcHUocGF0aC0+bm9kZXNbMV0sICZmb3VuZF9rZXksIHBhdGgtPnNsb3RzWzFdKTsKKwlucml0ZW1zID0gYnRyZnNfaGVhZGVyX25yaXRlbXMocGF0aC0+bm9kZXNbMV0pOworCisJaWYgKCFucml0ZW1zKQorCQlnb3RvIG91dDsKKworCWlmIChwYXRoLT5zbG90c1sxXSA+PSBucml0ZW1zKQorCQlnb3RvIG5leHRfbm9kZTsKKworCS8qIGRpZCB3ZSBmaW5kIGEga2V5IGdyZWF0ZXIgdGhhbiBhbnl0aGluZyB3ZSB3YW50IHRvIGRlbGV0ZT8gKi8KKwlpZiAoZm91bmRfa2V5Lm9iamVjdGlkID4gaW5vZGUtPmlfaW5vIHx8CisJICAgKGZvdW5kX2tleS5vYmplY3RpZCA9PSBpbm9kZS0+aV9pbm8gJiYgZm91bmRfa2V5LnR5cGUgPiBrZXkudHlwZSkpCisJCWdvdG8gb3V0OworCisJLyogd2UgY2hlY2sgdGhlIG5leHQga2V5IGluIHRoZSBub2RlIHRvIG1ha2Ugc3VyZSB0aGUgbGVhdmUgY29udGFpbnMKKwkgKiBvbmx5IGNoZWNrc3VtIGl0ZW1zLiAgVGhpcyBjb21wYXJpc29uIGRvZXNuJ3Qgd29yayBpZiBvdXIKKwkgKiBsZWFmIGlzIHRoZSBsYXN0IG9uZSBpbiB0aGUgbm9kZQorCSAqLworCWlmIChwYXRoLT5zbG90c1sxXSArIDEgPj0gbnJpdGVtcykgeworbmV4dF9ub2RlOgorCQkvKiBzZWFyY2ggZm9yd2FyZCBmcm9tIHRoZSBsYXN0IGtleSBpbiB0aGUgbm9kZSwgdGhpcworCQkgKiB3aWxsIGJyaW5nIHVzIGludG8gdGhlIG5leHQgbm9kZSBpbiB0aGUgdHJlZQorCQkgKi8KKwkJYnRyZnNfbm9kZV9rZXlfdG9fY3B1KHBhdGgtPm5vZGVzWzFdLCAmZm91bmRfa2V5LCBucml0ZW1zIC0gMSk7CisKKwkJLyogdW5saWtlbHksIGJ1dCB3ZSBpbmMgYmVsb3csIHNvIGNoZWNrIHRvIGJlIHNhZmUgKi8KKwkJaWYgKGZvdW5kX2tleS5vZmZzZXQgPT0gKHU2NCktMSkKKwkJCWdvdG8gb3V0OworCisJCS8qIHNlYXJjaF9mb3J3YXJkIG5lZWRzIGEgcGF0aCB3aXRoIGxvY2tzIGhlbGQsIGRvIHRoZQorCQkgKiBzZWFyY2ggYWdhaW4gZm9yIHRoZSBvcmlnaW5hbCBrZXkuICBJdCBpcyBwb3NzaWJsZQorCQkgKiB0aGlzIHdpbGwgcmFjZSB3aXRoIGEgYmFsYW5jZSBhbmQgcmV0dXJuIGEgcGF0aCB0aGF0CisJCSAqIHdlIGNvdWxkIG1vZGlmeSwgYnV0IHRoaXMgZHJvcCBpcyBqdXN0IGFuIG9wdGltaXphdGlvbgorCQkgKiBhbmQgaXMgYWxsb3dlZCB0byBtaXNzIHNvbWUgbGVhdmVzLgorCQkgKi8KKwkJYnRyZnNfcmVsZWFzZV9wYXRoKHJvb3QsIHBhdGgpOworCQlmb3VuZF9rZXkub2Zmc2V0Kys7CisKKwkJLyogc2V0dXAgYSBtYXgga2V5IGZvciBzZWFyY2hfZm9yd2FyZCAqLworCQlvdGhlcl9rZXkub2Zmc2V0ID0gKHU2NCktMTsKKwkJb3RoZXJfa2V5LnR5cGUgPSBrZXkudHlwZTsKKwkJb3RoZXJfa2V5Lm9iamVjdGlkID0ga2V5Lm9iamVjdGlkOworCisJCXBhdGgtPmtlZXBfbG9ja3MgPSAxOworCQlyZXQgPSBidHJmc19zZWFyY2hfZm9yd2FyZChyb290LCAmZm91bmRfa2V5LCAmb3RoZXJfa2V5LAorCQkJCQkgICBwYXRoLCAwLCAwKTsKKwkJcGF0aC0+a2VlcF9sb2NrcyA9IDA7CisJCWlmIChyZXQgfHwgZm91bmRfa2V5Lm9iamVjdGlkICE9IGtleS5vYmplY3RpZCB8fAorCQkgICAgZm91bmRfa2V5LnR5cGUgIT0ga2V5LnR5cGUpIHsKKwkJCXJldCA9IDA7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCWtleS5vZmZzZXQgPSBmb3VuZF9rZXkub2Zmc2V0OworCQlidHJmc19yZWxlYXNlX3BhdGgocm9vdCwgcGF0aCk7CisJCWNvbmRfcmVzY2hlZCgpOworCQlnb3RvIGFnYWluOworCX0KKworCS8qIHdlIGtub3cgdGhlcmUncyBvbmUgbW9yZSBzbG90IGFmdGVyIHVzIGluIHRoZSB0cmVlLAorCSAqIHJlYWQgdGhhdCBrZXkgc28gd2UgY2FuIHZlcmlmeSBpdCBpcyBhbHNvIGEgY2hlY2tzdW0gaXRlbQorCSAqLworCWJ0cmZzX25vZGVfa2V5X3RvX2NwdShwYXRoLT5ub2Rlc1sxXSwgJm90aGVyX2tleSwgcGF0aC0+c2xvdHNbMV0gKyAxKTsKKworCWlmIChmb3VuZF9rZXkub2JqZWN0aWQgPCBpbm9kZS0+aV9pbm8pCisJCWdvdG8gbmV4dF9rZXk7CisKKwlpZiAoZm91bmRfa2V5LnR5cGUgIT0ga2V5LnR5cGUgfHwgZm91bmRfa2V5Lm9mZnNldCA8IG5ld19zaXplKQorCQlnb3RvIG5leHRfa2V5OworCisJLyoKKwkgKiBpZiB0aGUga2V5IGZvciB0aGUgbmV4dCBsZWFmIGlzbid0IGEgY3N1bSBrZXkgZnJvbSB0aGlzIG9iamVjdGlkLAorCSAqIHdlIGNhbid0IGJlIHN1cmUgdGhlcmUgYXJlbid0IGdvb2QgaXRlbXMgaW5zaWRlIHRoaXMgbGVhZi4KKwkgKiBCYWlsIG91dAorCSAqLworCWlmIChvdGhlcl9rZXkub2JqZWN0aWQgIT0gaW5vZGUtPmlfaW5vIHx8IG90aGVyX2tleS50eXBlICE9IGtleS50eXBlKQorCQlnb3RvIG91dDsKKworCWxlYWZfc3RhcnQgPSBidHJmc19ub2RlX2Jsb2NrcHRyKHBhdGgtPm5vZGVzWzFdLCBwYXRoLT5zbG90c1sxXSk7CisJbGVhZl9nZW4gPSBidHJmc19ub2RlX3B0cl9nZW5lcmF0aW9uKHBhdGgtPm5vZGVzWzFdLCBwYXRoLT5zbG90c1sxXSk7CisJLyoKKwkgKiBpdCBpcyBzYWZlIHRvIGRlbGV0ZSB0aGlzIGxlYWYsIGl0IGNvbnRhaW5zIG9ubHkKKwkgKiBjc3VtIGl0ZW1zIGZyb20gdGhpcyBpbm9kZSBhdCBhbiBvZmZzZXQgPj0gbmV3X3NpemUKKwkgKi8KKwlyZXQgPSBidHJmc19kZWxfbGVhZih0cmFucywgcm9vdCwgcGF0aCwgbGVhZl9zdGFydCk7CisJQlVHX09OKHJldCk7CisKKwlpZiAocm9vdC0+cmVmX2Nvd3MgJiYgbGVhZl9nZW4gPCB0cmFucy0+dHJhbnNpZCkgeworCQlyZWYgPSBidHJmc19hbGxvY19sZWFmX3JlZihyb290LCAwKTsKKwkJaWYgKHJlZikgeworCQkJcmVmLT5yb290X2dlbiA9IHJvb3QtPnJvb3Rfa2V5Lm9mZnNldDsKKwkJCXJlZi0+Ynl0ZW5yID0gbGVhZl9zdGFydDsKKwkJCXJlZi0+b3duZXIgPSAwOworCQkJcmVmLT5nZW5lcmF0aW9uID0gbGVhZl9nZW47CisJCQlyZWYtPm5yaXRlbXMgPSAwOworCisJCQlyZXQgPSBidHJmc19hZGRfbGVhZl9yZWYocm9vdCwgcmVmLCAwKTsKKwkJCVdBUk5fT04ocmV0KTsKKwkJCWJ0cmZzX2ZyZWVfbGVhZl9yZWYocm9vdCwgcmVmKTsKKwkJfSBlbHNlIHsKKwkJCVdBUk5fT04oMSk7CisJCX0KKwl9CituZXh0X2tleToKKwlidHJmc19yZWxlYXNlX3BhdGgocm9vdCwgcGF0aCk7CisKKwlpZiAob3RoZXJfa2V5Lm9iamVjdGlkID09IGlub2RlLT5pX2lubyAmJgorCSAgICBvdGhlcl9rZXkudHlwZSA9PSBrZXkudHlwZSAmJiBvdGhlcl9rZXkub2Zmc2V0ID4ga2V5Lm9mZnNldCkgeworCQlrZXkub2Zmc2V0ID0gb3RoZXJfa2V5Lm9mZnNldDsKKwkJY29uZF9yZXNjaGVkKCk7CisJCWdvdG8gYWdhaW47CisJfQorCXJldCA9IDA7CitvdXQ6CisJLyogZml4dXAgYW55IGNoYW5nZXMgd2UndmUgbWFkZSB0byB0aGUgcGF0aCAqLworCXBhdGgtPmxvd2VzdF9sZXZlbCA9IDA7CisJcGF0aC0+a2VlcF9sb2NrcyA9IDA7CisJYnRyZnNfcmVsZWFzZV9wYXRoKHJvb3QsIHBhdGgpOworCXJldHVybiByZXQ7Cit9CisKKyNlbmRpZgorCisvKgorICogdGhpcyBjYW4gdHJ1bmNhdGUgYXdheSBleHRlbnQgaXRlbXMsIGNzdW0gaXRlbXMgYW5kIGRpcmVjdG9yeSBpdGVtcy4KKyAqIEl0IHN0YXJ0cyBhdCBhIGhpZ2ggb2Zmc2V0IGFuZCByZW1vdmVzIGtleXMgdW50aWwgaXQgY2FuJ3QgZmluZAorICogYW55IGhpZ2hlciB0aGFuIG5ld19zaXplCisgKgorICogY3N1bSBpdGVtcyB0aGF0IGNyb3NzIHRoZSBuZXcgaV9zaXplIGFyZSB0cnVuY2F0ZWQgdG8gdGhlIG5ldyBzaXplCisgKiBhcyB3ZWxsLgorICoKKyAqIG1pbl90eXBlIGlzIHRoZSBtaW5pbXVtIGtleSB0eXBlIHRvIHRydW5jYXRlIGRvd24gdG8uICBJZiBzZXQgdG8gMCwgdGhpcworICogd2lsbCBraWxsIGFsbCB0aGUgaXRlbXMgb24gdGhpcyBpbm9kZSwgaW5jbHVkaW5nIHRoZSBJTk9ERV9JVEVNX0tFWS4KKyAqLworbm9pbmxpbmUgaW50IGJ0cmZzX3RydW5jYXRlX2lub2RlX2l0ZW1zKHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAorCQkJCQlzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwKKwkJCQkJc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQkJdTY0IG5ld19zaXplLCB1MzIgbWluX3R5cGUpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgYnRyZnNfcGF0aCAqcGF0aDsKKwlzdHJ1Y3QgYnRyZnNfa2V5IGtleTsKKwlzdHJ1Y3QgYnRyZnNfa2V5IGZvdW5kX2tleTsKKwl1MzIgZm91bmRfdHlwZTsKKwlzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqbGVhZjsKKwlzdHJ1Y3QgYnRyZnNfZmlsZV9leHRlbnRfaXRlbSAqZmk7CisJdTY0IGV4dGVudF9zdGFydCA9IDA7CisJdTY0IGV4dGVudF9udW1fYnl0ZXMgPSAwOworCXU2NCBpdGVtX2VuZCA9IDA7CisJdTY0IHJvb3RfZ2VuID0gMDsKKwl1NjQgcm9vdF9vd25lciA9IDA7CisJaW50IGZvdW5kX2V4dGVudDsKKwlpbnQgZGVsX2l0ZW07CisJaW50IHBlbmRpbmdfZGVsX25yID0gMDsKKwlpbnQgcGVuZGluZ19kZWxfc2xvdCA9IDA7CisJaW50IGV4dGVudF90eXBlID0gLTE7CisJaW50IGVuY29kaW5nOworCXU2NCBtYXNrID0gcm9vdC0+c2VjdG9yc2l6ZSAtIDE7CisKKwlpZiAocm9vdC0+cmVmX2Nvd3MpCisJCWJ0cmZzX2Ryb3BfZXh0ZW50X2NhY2hlKGlub2RlLCBuZXdfc2l6ZSAmICh+bWFzayksICh1NjQpLTEsIDApOworCXBhdGggPSBidHJmc19hbGxvY19wYXRoKCk7CisJcGF0aC0+cmVhZGEgPSAtMTsKKwlCVUdfT04oIXBhdGgpOworCisJLyogRklYTUUsIGFkZCByZWRvIGxpbmsgdG8gdHJlZSBzbyB3ZSBkb24ndCBsZWFrIG9uIGNyYXNoICovCisJa2V5Lm9iamVjdGlkID0gaW5vZGUtPmlfaW5vOworCWtleS5vZmZzZXQgPSAodTY0KS0xOworCWtleS50eXBlID0gKHU4KS0xOworCisJYnRyZnNfaW5pdF9wYXRoKHBhdGgpOworCitzZWFyY2hfYWdhaW46CisJcmV0ID0gYnRyZnNfc2VhcmNoX3Nsb3QodHJhbnMsIHJvb3QsICZrZXksIHBhdGgsIC0xLCAxKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnJvcjsKKworCWlmIChyZXQgPiAwKSB7CisJCS8qIHRoZXJlIGFyZSBubyBpdGVtcyBpbiB0aGUgdHJlZSBmb3IgdXMgdG8gdHJ1bmNhdGUsIHdlJ3JlCisJCSAqIGRvbmUKKwkJICovCisJCWlmIChwYXRoLT5zbG90c1swXSA9PSAwKSB7CisJCQlyZXQgPSAwOworCQkJZ290byBlcnJvcjsKKwkJfQorCQlwYXRoLT5zbG90c1swXS0tOworCX0KKworCXdoaWxlICgxKSB7CisJCWZpID0gTlVMTDsKKwkJbGVhZiA9IHBhdGgtPm5vZGVzWzBdOworCQlidHJmc19pdGVtX2tleV90b19jcHUobGVhZiwgJmZvdW5kX2tleSwgcGF0aC0+c2xvdHNbMF0pOworCQlmb3VuZF90eXBlID0gYnRyZnNfa2V5X3R5cGUoJmZvdW5kX2tleSk7CisJCWVuY29kaW5nID0gMDsKKworCQlpZiAoZm91bmRfa2V5Lm9iamVjdGlkICE9IGlub2RlLT5pX2lubykKKwkJCWJyZWFrOworCisJCWlmIChmb3VuZF90eXBlIDwgbWluX3R5cGUpCisJCQlicmVhazsKKworCQlpdGVtX2VuZCA9IGZvdW5kX2tleS5vZmZzZXQ7CisJCWlmIChmb3VuZF90eXBlID09IEJUUkZTX0VYVEVOVF9EQVRBX0tFWSkgeworCQkJZmkgPSBidHJmc19pdGVtX3B0cihsZWFmLCBwYXRoLT5zbG90c1swXSwKKwkJCQkJICAgIHN0cnVjdCBidHJmc19maWxlX2V4dGVudF9pdGVtKTsKKwkJCWV4dGVudF90eXBlID0gYnRyZnNfZmlsZV9leHRlbnRfdHlwZShsZWFmLCBmaSk7CisJCQllbmNvZGluZyA9IGJ0cmZzX2ZpbGVfZXh0ZW50X2NvbXByZXNzaW9uKGxlYWYsIGZpKTsKKwkJCWVuY29kaW5nIHw9IGJ0cmZzX2ZpbGVfZXh0ZW50X2VuY3J5cHRpb24obGVhZiwgZmkpOworCQkJZW5jb2RpbmcgfD0gYnRyZnNfZmlsZV9leHRlbnRfb3RoZXJfZW5jb2RpbmcobGVhZiwgZmkpOworCisJCQlpZiAoZXh0ZW50X3R5cGUgIT0gQlRSRlNfRklMRV9FWFRFTlRfSU5MSU5FKSB7CisJCQkJaXRlbV9lbmQgKz0KKwkJCQkgICAgYnRyZnNfZmlsZV9leHRlbnRfbnVtX2J5dGVzKGxlYWYsIGZpKTsKKwkJCX0gZWxzZSBpZiAoZXh0ZW50X3R5cGUgPT0gQlRSRlNfRklMRV9FWFRFTlRfSU5MSU5FKSB7CisJCQkJaXRlbV9lbmQgKz0gYnRyZnNfZmlsZV9leHRlbnRfaW5saW5lX2xlbihsZWFmLAorCQkJCQkJCQkJIGZpKTsKKwkJCX0KKwkJCWl0ZW1fZW5kLS07CisJCX0KKwkJaWYgKGl0ZW1fZW5kIDwgbmV3X3NpemUpIHsKKwkJCWlmIChmb3VuZF90eXBlID09IEJUUkZTX0RJUl9JVEVNX0tFWSkKKwkJCQlmb3VuZF90eXBlID0gQlRSRlNfSU5PREVfSVRFTV9LRVk7CisJCQllbHNlIGlmIChmb3VuZF90eXBlID09IEJUUkZTX0VYVEVOVF9JVEVNX0tFWSkKKwkJCQlmb3VuZF90eXBlID0gQlRSRlNfRVhURU5UX0RBVEFfS0VZOworCQkJZWxzZSBpZiAoZm91bmRfdHlwZSA9PSBCVFJGU19FWFRFTlRfREFUQV9LRVkpCisJCQkJZm91bmRfdHlwZSA9IEJUUkZTX1hBVFRSX0lURU1fS0VZOworCQkJZWxzZSBpZiAoZm91bmRfdHlwZSA9PSBCVFJGU19YQVRUUl9JVEVNX0tFWSkKKwkJCQlmb3VuZF90eXBlID0gQlRSRlNfSU5PREVfUkVGX0tFWTsKKwkJCWVsc2UgaWYgKGZvdW5kX3R5cGUpCisJCQkJZm91bmRfdHlwZS0tOworCQkJZWxzZQorCQkJCWJyZWFrOworCQkJYnRyZnNfc2V0X2tleV90eXBlKCZrZXksIGZvdW5kX3R5cGUpOworCQkJZ290byBuZXh0OworCQl9CisJCWlmIChmb3VuZF9rZXkub2Zmc2V0ID49IG5ld19zaXplKQorCQkJZGVsX2l0ZW0gPSAxOworCQllbHNlCisJCQlkZWxfaXRlbSA9IDA7CisJCWZvdW5kX2V4dGVudCA9IDA7CisKKwkJLyogRklYTUUsIHNocmluayB0aGUgZXh0ZW50IGlmIHRoZSByZWYgY291bnQgaXMgb25seSAxICovCisJCWlmIChmb3VuZF90eXBlICE9IEJUUkZTX0VYVEVOVF9EQVRBX0tFWSkKKwkJCWdvdG8gZGVsZXRlOworCisJCWlmIChleHRlbnRfdHlwZSAhPSBCVFJGU19GSUxFX0VYVEVOVF9JTkxJTkUpIHsKKwkJCXU2NCBudW1fZGVjOworCQkJZXh0ZW50X3N0YXJ0ID0gYnRyZnNfZmlsZV9leHRlbnRfZGlza19ieXRlbnIobGVhZiwgZmkpOworCQkJaWYgKCFkZWxfaXRlbSAmJiAhZW5jb2RpbmcpIHsKKwkJCQl1NjQgb3JpZ19udW1fYnl0ZXMgPQorCQkJCQlidHJmc19maWxlX2V4dGVudF9udW1fYnl0ZXMobGVhZiwgZmkpOworCQkJCWV4dGVudF9udW1fYnl0ZXMgPSBuZXdfc2l6ZSAtCisJCQkJCWZvdW5kX2tleS5vZmZzZXQgKyByb290LT5zZWN0b3JzaXplIC0gMTsKKwkJCQlleHRlbnRfbnVtX2J5dGVzID0gZXh0ZW50X251bV9ieXRlcyAmCisJCQkJCX4oKHU2NClyb290LT5zZWN0b3JzaXplIC0gMSk7CisJCQkJYnRyZnNfc2V0X2ZpbGVfZXh0ZW50X251bV9ieXRlcyhsZWFmLCBmaSwKKwkJCQkJCQkgZXh0ZW50X251bV9ieXRlcyk7CisJCQkJbnVtX2RlYyA9IChvcmlnX251bV9ieXRlcyAtCisJCQkJCSAgIGV4dGVudF9udW1fYnl0ZXMpOworCQkJCWlmIChyb290LT5yZWZfY293cyAmJiBleHRlbnRfc3RhcnQgIT0gMCkKKwkJCQkJaW5vZGVfc3ViX2J5dGVzKGlub2RlLCBudW1fZGVjKTsKKwkJCQlidHJmc19tYXJrX2J1ZmZlcl9kaXJ0eShsZWFmKTsKKwkJCX0gZWxzZSB7CisJCQkJZXh0ZW50X251bV9ieXRlcyA9CisJCQkJCWJ0cmZzX2ZpbGVfZXh0ZW50X2Rpc2tfbnVtX2J5dGVzKGxlYWYsCisJCQkJCQkJCQkgZmkpOworCQkJCS8qIEZJWE1FIGJsb2Nrc2l6ZSAhPSA0MDk2ICovCisJCQkJbnVtX2RlYyA9IGJ0cmZzX2ZpbGVfZXh0ZW50X251bV9ieXRlcyhsZWFmLCBmaSk7CisJCQkJaWYgKGV4dGVudF9zdGFydCAhPSAwKSB7CisJCQkJCWZvdW5kX2V4dGVudCA9IDE7CisJCQkJCWlmIChyb290LT5yZWZfY293cykKKwkJCQkJCWlub2RlX3N1Yl9ieXRlcyhpbm9kZSwgbnVtX2RlYyk7CisJCQkJfQorCQkJCXJvb3RfZ2VuID0gYnRyZnNfaGVhZGVyX2dlbmVyYXRpb24obGVhZik7CisJCQkJcm9vdF9vd25lciA9IGJ0cmZzX2hlYWRlcl9vd25lcihsZWFmKTsKKwkJCX0KKwkJfSBlbHNlIGlmIChleHRlbnRfdHlwZSA9PSBCVFJGU19GSUxFX0VYVEVOVF9JTkxJTkUpIHsKKwkJCS8qCisJCQkgKiB3ZSBjYW4ndCB0cnVuY2F0ZSBpbmxpbmUgaXRlbXMgdGhhdCBoYXZlIGhhZAorCQkJICogc3BlY2lhbCBlbmNvZGluZ3MKKwkJCSAqLworCQkJaWYgKCFkZWxfaXRlbSAmJgorCQkJICAgIGJ0cmZzX2ZpbGVfZXh0ZW50X2NvbXByZXNzaW9uKGxlYWYsIGZpKSA9PSAwICYmCisJCQkgICAgYnRyZnNfZmlsZV9leHRlbnRfZW5jcnlwdGlvbihsZWFmLCBmaSkgPT0gMCAmJgorCQkJICAgIGJ0cmZzX2ZpbGVfZXh0ZW50X290aGVyX2VuY29kaW5nKGxlYWYsIGZpKSA9PSAwKSB7CisJCQkJdTMyIHNpemUgPSBuZXdfc2l6ZSAtIGZvdW5kX2tleS5vZmZzZXQ7CisKKwkJCQlpZiAocm9vdC0+cmVmX2Nvd3MpIHsKKwkJCQkJaW5vZGVfc3ViX2J5dGVzKGlub2RlLCBpdGVtX2VuZCArIDEgLQorCQkJCQkJCW5ld19zaXplKTsKKwkJCQl9CisJCQkJc2l6ZSA9CisJCQkJICAgIGJ0cmZzX2ZpbGVfZXh0ZW50X2NhbGNfaW5saW5lX3NpemUoc2l6ZSk7CisJCQkJcmV0ID0gYnRyZnNfdHJ1bmNhdGVfaXRlbSh0cmFucywgcm9vdCwgcGF0aCwKKwkJCQkJCQkgIHNpemUsIDEpOworCQkJCUJVR19PTihyZXQpOworCQkJfSBlbHNlIGlmIChyb290LT5yZWZfY293cykgeworCQkJCWlub2RlX3N1Yl9ieXRlcyhpbm9kZSwgaXRlbV9lbmQgKyAxIC0KKwkJCQkJCWZvdW5kX2tleS5vZmZzZXQpOworCQkJfQorCQl9CitkZWxldGU6CisJCWlmIChkZWxfaXRlbSkgeworCQkJaWYgKCFwZW5kaW5nX2RlbF9ucikgeworCQkJCS8qIG5vIHBlbmRpbmcgeWV0LCBhZGQgb3Vyc2VsdmVzICovCisJCQkJcGVuZGluZ19kZWxfc2xvdCA9IHBhdGgtPnNsb3RzWzBdOworCQkJCXBlbmRpbmdfZGVsX25yID0gMTsKKwkJCX0gZWxzZSBpZiAocGVuZGluZ19kZWxfbnIgJiYKKwkJCQkgICBwYXRoLT5zbG90c1swXSArIDEgPT0gcGVuZGluZ19kZWxfc2xvdCkgeworCQkJCS8qIGhvcCBvbiB0aGUgcGVuZGluZyBjaHVuayAqLworCQkJCXBlbmRpbmdfZGVsX25yKys7CisJCQkJcGVuZGluZ19kZWxfc2xvdCA9IHBhdGgtPnNsb3RzWzBdOworCQkJfSBlbHNlIHsKKwkJCQlCVUcoKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWJyZWFrOworCQl9CisJCWlmIChmb3VuZF9leHRlbnQpIHsKKwkJCXJldCA9IGJ0cmZzX2ZyZWVfZXh0ZW50KHRyYW5zLCByb290LCBleHRlbnRfc3RhcnQsCisJCQkJCQlleHRlbnRfbnVtX2J5dGVzLAorCQkJCQkJbGVhZi0+c3RhcnQsIHJvb3Rfb3duZXIsCisJCQkJCQlyb290X2dlbiwgaW5vZGUtPmlfaW5vLCAwKTsKKwkJCUJVR19PTihyZXQpOworCQl9CituZXh0OgorCQlpZiAocGF0aC0+c2xvdHNbMF0gPT0gMCkgeworCQkJaWYgKHBlbmRpbmdfZGVsX25yKQorCQkJCWdvdG8gZGVsX3BlbmRpbmc7CisJCQlidHJmc19yZWxlYXNlX3BhdGgocm9vdCwgcGF0aCk7CisJCQlnb3RvIHNlYXJjaF9hZ2FpbjsKKwkJfQorCisJCXBhdGgtPnNsb3RzWzBdLS07CisJCWlmIChwZW5kaW5nX2RlbF9uciAmJgorCQkgICAgcGF0aC0+c2xvdHNbMF0gKyAxICE9IHBlbmRpbmdfZGVsX3Nsb3QpIHsKKwkJCXN0cnVjdCBidHJmc19rZXkgZGVidWc7CitkZWxfcGVuZGluZzoKKwkJCWJ0cmZzX2l0ZW1fa2V5X3RvX2NwdShwYXRoLT5ub2Rlc1swXSwgJmRlYnVnLAorCQkJCQkgICAgICBwZW5kaW5nX2RlbF9zbG90KTsKKwkJCXJldCA9IGJ0cmZzX2RlbF9pdGVtcyh0cmFucywgcm9vdCwgcGF0aCwKKwkJCQkJICAgICAgcGVuZGluZ19kZWxfc2xvdCwKKwkJCQkJICAgICAgcGVuZGluZ19kZWxfbnIpOworCQkJQlVHX09OKHJldCk7CisJCQlwZW5kaW5nX2RlbF9uciA9IDA7CisJCQlidHJmc19yZWxlYXNlX3BhdGgocm9vdCwgcGF0aCk7CisJCQlnb3RvIHNlYXJjaF9hZ2FpbjsKKwkJfQorCX0KKwlyZXQgPSAwOworZXJyb3I6CisJaWYgKHBlbmRpbmdfZGVsX25yKSB7CisJCXJldCA9IGJ0cmZzX2RlbF9pdGVtcyh0cmFucywgcm9vdCwgcGF0aCwgcGVuZGluZ19kZWxfc2xvdCwKKwkJCQkgICAgICBwZW5kaW5nX2RlbF9ucik7CisJfQorCWJ0cmZzX2ZyZWVfcGF0aChwYXRoKTsKKwlpbm9kZS0+aV9zYi0+c19kaXJ0ID0gMTsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogdGFrZW4gZnJvbSBibG9ja190cnVuY2F0ZV9wYWdlLCBidXQgZG9lcyBjb3cgYXMgaXQgemVyb3Mgb3V0CisgKiBhbnkgYnl0ZXMgbGVmdCBpbiB0aGUgbGFzdCBwYWdlIGluIHRoZSBmaWxlLgorICovCitzdGF0aWMgaW50IGJ0cmZzX3RydW5jYXRlX3BhZ2Uoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsIGxvZmZfdCBmcm9tKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBtYXBwaW5nLT5ob3N0OworCXN0cnVjdCBidHJmc19yb290ICpyb290ID0gQlRSRlNfSShpbm9kZSktPnJvb3Q7CisJc3RydWN0IGV4dGVudF9pb190cmVlICppb190cmVlID0gJkJUUkZTX0koaW5vZGUpLT5pb190cmVlOworCXN0cnVjdCBidHJmc19vcmRlcmVkX2V4dGVudCAqb3JkZXJlZDsKKwljaGFyICprYWRkcjsKKwl1MzIgYmxvY2tzaXplID0gcm9vdC0+c2VjdG9yc2l6ZTsKKwlwZ29mZl90IGluZGV4ID0gZnJvbSA+PiBQQUdFX0NBQ0hFX1NISUZUOworCXVuc2lnbmVkIG9mZnNldCA9IGZyb20gJiAoUEFHRV9DQUNIRV9TSVpFLTEpOworCXN0cnVjdCBwYWdlICpwYWdlOworCWludCByZXQgPSAwOworCXU2NCBwYWdlX3N0YXJ0OworCXU2NCBwYWdlX2VuZDsKKworCWlmICgob2Zmc2V0ICYgKGJsb2Nrc2l6ZSAtIDEpKSA9PSAwKQorCQlnb3RvIG91dDsKKworCXJldCA9IC1FTk9NRU07CithZ2FpbjoKKwlwYWdlID0gZ3JhYl9jYWNoZV9wYWdlKG1hcHBpbmcsIGluZGV4KTsKKwlpZiAoIXBhZ2UpCisJCWdvdG8gb3V0OworCisJcGFnZV9zdGFydCA9IHBhZ2Vfb2Zmc2V0KHBhZ2UpOworCXBhZ2VfZW5kID0gcGFnZV9zdGFydCArIFBBR0VfQ0FDSEVfU0laRSAtIDE7CisKKwlpZiAoIVBhZ2VVcHRvZGF0ZShwYWdlKSkgeworCQlyZXQgPSBidHJmc19yZWFkcGFnZShOVUxMLCBwYWdlKTsKKwkJbG9ja19wYWdlKHBhZ2UpOworCQlpZiAocGFnZS0+bWFwcGluZyAhPSBtYXBwaW5nKSB7CisJCQl1bmxvY2tfcGFnZShwYWdlKTsKKwkJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKKwkJCWdvdG8gYWdhaW47CisJCX0KKwkJaWYgKCFQYWdlVXB0b2RhdGUocGFnZSkpIHsKKwkJCXJldCA9IC1FSU87CisJCQlnb3RvIG91dF91bmxvY2s7CisJCX0KKwl9CisJd2FpdF9vbl9wYWdlX3dyaXRlYmFjayhwYWdlKTsKKworCWxvY2tfZXh0ZW50KGlvX3RyZWUsIHBhZ2Vfc3RhcnQsIHBhZ2VfZW5kLCBHRlBfTk9GUyk7CisJc2V0X3BhZ2VfZXh0ZW50X21hcHBlZChwYWdlKTsKKworCW9yZGVyZWQgPSBidHJmc19sb29rdXBfb3JkZXJlZF9leHRlbnQoaW5vZGUsIHBhZ2Vfc3RhcnQpOworCWlmIChvcmRlcmVkKSB7CisJCXVubG9ja19leHRlbnQoaW9fdHJlZSwgcGFnZV9zdGFydCwgcGFnZV9lbmQsIEdGUF9OT0ZTKTsKKwkJdW5sb2NrX3BhZ2UocGFnZSk7CisJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKKwkJYnRyZnNfc3RhcnRfb3JkZXJlZF9leHRlbnQoaW5vZGUsIG9yZGVyZWQsIDEpOworCQlidHJmc19wdXRfb3JkZXJlZF9leHRlbnQob3JkZXJlZCk7CisJCWdvdG8gYWdhaW47CisJfQorCisJYnRyZnNfc2V0X2V4dGVudF9kZWxhbGxvYyhpbm9kZSwgcGFnZV9zdGFydCwgcGFnZV9lbmQpOworCXJldCA9IDA7CisJaWYgKG9mZnNldCAhPSBQQUdFX0NBQ0hFX1NJWkUpIHsKKwkJa2FkZHIgPSBrbWFwKHBhZ2UpOworCQltZW1zZXQoa2FkZHIgKyBvZmZzZXQsIDAsIFBBR0VfQ0FDSEVfU0laRSAtIG9mZnNldCk7CisJCWZsdXNoX2RjYWNoZV9wYWdlKHBhZ2UpOworCQlrdW5tYXAocGFnZSk7CisJfQorCUNsZWFyUGFnZUNoZWNrZWQocGFnZSk7CisJc2V0X3BhZ2VfZGlydHkocGFnZSk7CisJdW5sb2NrX2V4dGVudChpb190cmVlLCBwYWdlX3N0YXJ0LCBwYWdlX2VuZCwgR0ZQX05PRlMpOworCitvdXRfdW5sb2NrOgorCXVubG9ja19wYWdlKHBhZ2UpOworCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKK291dDoKKwlyZXR1cm4gcmV0OworfQorCitpbnQgYnRyZnNfY29udF9leHBhbmQoc3RydWN0IGlub2RlICppbm9kZSwgbG9mZl90IHNpemUpCit7CisJc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnM7CisJc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QgPSBCVFJGU19JKGlub2RlKS0+cm9vdDsKKwlzdHJ1Y3QgZXh0ZW50X2lvX3RyZWUgKmlvX3RyZWUgPSAmQlRSRlNfSShpbm9kZSktPmlvX3RyZWU7CisJc3RydWN0IGV4dGVudF9tYXAgKmVtOworCXU2NCBtYXNrID0gcm9vdC0+c2VjdG9yc2l6ZSAtIDE7CisJdTY0IGhvbGVfc3RhcnQgPSAoaW5vZGUtPmlfc2l6ZSArIG1hc2spICYgfm1hc2s7CisJdTY0IGJsb2NrX2VuZCA9IChzaXplICsgbWFzaykgJiB+bWFzazsKKwl1NjQgbGFzdF9ieXRlOworCXU2NCBjdXJfb2Zmc2V0OworCXU2NCBob2xlX3NpemU7CisJaW50IGVycjsKKworCWlmIChzaXplIDw9IGhvbGVfc3RhcnQpCisJCXJldHVybiAwOworCisJZXJyID0gYnRyZnNfY2hlY2tfZnJlZV9zcGFjZShyb290LCAxLCAwKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJYnRyZnNfdHJ1bmNhdGVfcGFnZShpbm9kZS0+aV9tYXBwaW5nLCBpbm9kZS0+aV9zaXplKTsKKworCXdoaWxlICgxKSB7CisJCXN0cnVjdCBidHJmc19vcmRlcmVkX2V4dGVudCAqb3JkZXJlZDsKKwkJYnRyZnNfd2FpdF9vcmRlcmVkX3JhbmdlKGlub2RlLCBob2xlX3N0YXJ0LAorCQkJCQkgYmxvY2tfZW5kIC0gaG9sZV9zdGFydCk7CisJCWxvY2tfZXh0ZW50KGlvX3RyZWUsIGhvbGVfc3RhcnQsIGJsb2NrX2VuZCAtIDEsIEdGUF9OT0ZTKTsKKwkJb3JkZXJlZCA9IGJ0cmZzX2xvb2t1cF9vcmRlcmVkX2V4dGVudChpbm9kZSwgaG9sZV9zdGFydCk7CisJCWlmICghb3JkZXJlZCkKKwkJCWJyZWFrOworCQl1bmxvY2tfZXh0ZW50KGlvX3RyZWUsIGhvbGVfc3RhcnQsIGJsb2NrX2VuZCAtIDEsIEdGUF9OT0ZTKTsKKwkJYnRyZnNfcHV0X29yZGVyZWRfZXh0ZW50KG9yZGVyZWQpOworCX0KKworCXRyYW5zID0gYnRyZnNfc3RhcnRfdHJhbnNhY3Rpb24ocm9vdCwgMSk7CisJYnRyZnNfc2V0X3RyYW5zX2Jsb2NrX2dyb3VwKHRyYW5zLCBpbm9kZSk7CisKKwljdXJfb2Zmc2V0ID0gaG9sZV9zdGFydDsKKwl3aGlsZSAoMSkgeworCQllbSA9IGJ0cmZzX2dldF9leHRlbnQoaW5vZGUsIE5VTEwsIDAsIGN1cl9vZmZzZXQsCisJCQkJYmxvY2tfZW5kIC0gY3VyX29mZnNldCwgMCk7CisJCUJVR19PTihJU19FUlIoZW0pIHx8ICFlbSk7CisJCWxhc3RfYnl0ZSA9IG1pbihleHRlbnRfbWFwX2VuZChlbSksIGJsb2NrX2VuZCk7CisJCWxhc3RfYnl0ZSA9IChsYXN0X2J5dGUgKyBtYXNrKSAmIH5tYXNrOworCQlpZiAodGVzdF9iaXQoRVhURU5UX0ZMQUdfVkFDQU5DWSwgJmVtLT5mbGFncykpIHsKKwkJCXU2NCBoaW50X2J5dGUgPSAwOworCQkJaG9sZV9zaXplID0gbGFzdF9ieXRlIC0gY3VyX29mZnNldDsKKwkJCWVyciA9IGJ0cmZzX2Ryb3BfZXh0ZW50cyh0cmFucywgcm9vdCwgaW5vZGUsCisJCQkJCQkgY3VyX29mZnNldCwKKwkJCQkJCSBjdXJfb2Zmc2V0ICsgaG9sZV9zaXplLAorCQkJCQkJIGN1cl9vZmZzZXQsICZoaW50X2J5dGUpOworCQkJaWYgKGVycikKKwkJCQlicmVhazsKKwkJCWVyciA9IGJ0cmZzX2luc2VydF9maWxlX2V4dGVudCh0cmFucywgcm9vdCwKKwkJCQkJaW5vZGUtPmlfaW5vLCBjdXJfb2Zmc2V0LCAwLAorCQkJCQkwLCBob2xlX3NpemUsIDAsIGhvbGVfc2l6ZSwKKwkJCQkJMCwgMCwgMCk7CisJCQlidHJmc19kcm9wX2V4dGVudF9jYWNoZShpbm9kZSwgaG9sZV9zdGFydCwKKwkJCQkJbGFzdF9ieXRlIC0gMSwgMCk7CisJCX0KKwkJZnJlZV9leHRlbnRfbWFwKGVtKTsKKwkJY3VyX29mZnNldCA9IGxhc3RfYnl0ZTsKKwkJaWYgKGVyciB8fCBjdXJfb2Zmc2V0ID49IGJsb2NrX2VuZCkKKwkJCWJyZWFrOworCX0KKworCWJ0cmZzX2VuZF90cmFuc2FjdGlvbih0cmFucywgcm9vdCk7CisJdW5sb2NrX2V4dGVudChpb190cmVlLCBob2xlX3N0YXJ0LCBibG9ja19lbmQgLSAxLCBHRlBfTk9GUyk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBidHJmc19zZXRhdHRyKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGlhdHRyICphdHRyKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CisJaW50IGVycjsKKworCWVyciA9IGlub2RlX2NoYW5nZV9vayhpbm9kZSwgYXR0cik7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCWlmIChTX0lTUkVHKGlub2RlLT5pX21vZGUpICYmCisJICAgIGF0dHItPmlhX3ZhbGlkICYgQVRUUl9TSVpFICYmIGF0dHItPmlhX3NpemUgPiBpbm9kZS0+aV9zaXplKSB7CisJCWVyciA9IGJ0cmZzX2NvbnRfZXhwYW5kKGlub2RlLCBhdHRyLT5pYV9zaXplKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisJfQorCisJZXJyID0gaW5vZGVfc2V0YXR0cihpbm9kZSwgYXR0cik7CisKKwlpZiAoIWVyciAmJiAoKGF0dHItPmlhX3ZhbGlkICYgQVRUUl9NT0RFKSkpCisJCWVyciA9IGJ0cmZzX2FjbF9jaG1vZChpbm9kZSk7CisJcmV0dXJuIGVycjsKK30KKwordm9pZCBidHJmc19kZWxldGVfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFuczsKKwlzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCA9IEJUUkZTX0koaW5vZGUpLT5yb290OworCXVuc2lnbmVkIGxvbmcgbnI7CisJaW50IHJldDsKKworCXRydW5jYXRlX2lub2RlX3BhZ2VzKCZpbm9kZS0+aV9kYXRhLCAwKTsKKwlpZiAoaXNfYmFkX2lub2RlKGlub2RlKSkgeworCQlidHJmc19vcnBoYW5fZGVsKE5VTEwsIGlub2RlKTsKKwkJZ290byBub19kZWxldGU7CisJfQorCWJ0cmZzX3dhaXRfb3JkZXJlZF9yYW5nZShpbm9kZSwgMCwgKHU2NCktMSk7CisKKwlidHJmc19pX3NpemVfd3JpdGUoaW5vZGUsIDApOworCXRyYW5zID0gYnRyZnNfam9pbl90cmFuc2FjdGlvbihyb290LCAxKTsKKworCWJ0cmZzX3NldF90cmFuc19ibG9ja19ncm91cCh0cmFucywgaW5vZGUpOworCXJldCA9IGJ0cmZzX3RydW5jYXRlX2lub2RlX2l0ZW1zKHRyYW5zLCByb290LCBpbm9kZSwgaW5vZGUtPmlfc2l6ZSwgMCk7CisJaWYgKHJldCkgeworCQlidHJmc19vcnBoYW5fZGVsKE5VTEwsIGlub2RlKTsKKwkJZ290byBub19kZWxldGVfbG9jazsKKwl9CisKKwlidHJmc19vcnBoYW5fZGVsKHRyYW5zLCBpbm9kZSk7CisKKwluciA9IHRyYW5zLT5ibG9ja3NfdXNlZDsKKwljbGVhcl9pbm9kZShpbm9kZSk7CisKKwlidHJmc19lbmRfdHJhbnNhY3Rpb24odHJhbnMsIHJvb3QpOworCWJ0cmZzX2J0cmVlX2JhbGFuY2VfZGlydHkocm9vdCwgbnIpOworCXJldHVybjsKKworbm9fZGVsZXRlX2xvY2s6CisJbnIgPSB0cmFucy0+YmxvY2tzX3VzZWQ7CisJYnRyZnNfZW5kX3RyYW5zYWN0aW9uKHRyYW5zLCByb290KTsKKwlidHJmc19idHJlZV9iYWxhbmNlX2RpcnR5KHJvb3QsIG5yKTsKK25vX2RlbGV0ZToKKwljbGVhcl9pbm9kZShpbm9kZSk7Cit9CisKKy8qCisgKiB0aGlzIHJldHVybnMgdGhlIGtleSBmb3VuZCBpbiB0aGUgZGlyIGVudHJ5IGluIHRoZSBsb2NhdGlvbiBwb2ludGVyLgorICogSWYgbm8gZGlyIGVudHJpZXMgd2VyZSBmb3VuZCwgbG9jYXRpb24tPm9iamVjdGlkIGlzIDAuCisgKi8KK3N0YXRpYyBpbnQgYnRyZnNfaW5vZGVfYnlfbmFtZShzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LAorCQkJICAgICAgIHN0cnVjdCBidHJmc19rZXkgKmxvY2F0aW9uKQoreworCWNvbnN0IGNoYXIgKm5hbWUgPSBkZW50cnktPmRfbmFtZS5uYW1lOworCWludCBuYW1lbGVuID0gZGVudHJ5LT5kX25hbWUubGVuOworCXN0cnVjdCBidHJmc19kaXJfaXRlbSAqZGk7CisJc3RydWN0IGJ0cmZzX3BhdGggKnBhdGg7CisJc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QgPSBCVFJGU19JKGRpciktPnJvb3Q7CisJaW50IHJldCA9IDA7CisKKwlwYXRoID0gYnRyZnNfYWxsb2NfcGF0aCgpOworCUJVR19PTighcGF0aCk7CisKKwlkaSA9IGJ0cmZzX2xvb2t1cF9kaXJfaXRlbShOVUxMLCByb290LCBwYXRoLCBkaXItPmlfaW5vLCBuYW1lLAorCQkJCSAgICBuYW1lbGVuLCAwKTsKKwlpZiAoSVNfRVJSKGRpKSkKKwkJcmV0ID0gUFRSX0VSUihkaSk7CisKKwlpZiAoIWRpIHx8IElTX0VSUihkaSkpCisJCWdvdG8gb3V0X2VycjsKKworCWJ0cmZzX2Rpcl9pdGVtX2tleV90b19jcHUocGF0aC0+bm9kZXNbMF0sIGRpLCBsb2NhdGlvbik7CitvdXQ6CisJYnRyZnNfZnJlZV9wYXRoKHBhdGgpOworCXJldHVybiByZXQ7CitvdXRfZXJyOgorCWxvY2F0aW9uLT5vYmplY3RpZCA9IDA7CisJZ290byBvdXQ7Cit9CisKKy8qCisgKiB3aGVuIHdlIGhpdCBhIHRyZWUgcm9vdCBpbiBhIGRpcmVjdG9yeSwgdGhlIGJ0cmZzIHBhcnQgb2YgdGhlIGlub2RlCisgKiBuZWVkcyB0byBiZSBjaGFuZ2VkIHRvIHJlZmxlY3QgdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoZSB0cmVlIHJvb3QuICBUaGlzCisgKiBpcyBraW5kIG9mIGxpa2UgY3Jvc3NpbmcgYSBtb3VudCBwb2ludC4KKyAqLworc3RhdGljIGludCBmaXh1cF90cmVlX3Jvb3RfbG9jYXRpb24oc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsCisJCQkgICAgIHN0cnVjdCBidHJmc19rZXkgKmxvY2F0aW9uLAorCQkJICAgICBzdHJ1Y3QgYnRyZnNfcm9vdCAqKnN1Yl9yb290LAorCQkJICAgICBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCit7CisJc3RydWN0IGJ0cmZzX3Jvb3RfaXRlbSAqcmk7CisKKwlpZiAoYnRyZnNfa2V5X3R5cGUobG9jYXRpb24pICE9IEJUUkZTX1JPT1RfSVRFTV9LRVkpCisJCXJldHVybiAwOworCWlmIChsb2NhdGlvbi0+b2JqZWN0aWQgPT0gQlRSRlNfUk9PVF9UUkVFX09CSkVDVElEKQorCQlyZXR1cm4gMDsKKworCSpzdWJfcm9vdCA9IGJ0cmZzX3JlYWRfZnNfcm9vdChyb290LT5mc19pbmZvLCBsb2NhdGlvbiwKKwkJCQkJZGVudHJ5LT5kX25hbWUubmFtZSwKKwkJCQkJZGVudHJ5LT5kX25hbWUubGVuKTsKKwlpZiAoSVNfRVJSKCpzdWJfcm9vdCkpCisJCXJldHVybiBQVFJfRVJSKCpzdWJfcm9vdCk7CisKKwlyaSA9ICYoKnN1Yl9yb290KS0+cm9vdF9pdGVtOworCWxvY2F0aW9uLT5vYmplY3RpZCA9IGJ0cmZzX3Jvb3RfZGlyaWQocmkpOworCWJ0cmZzX3NldF9rZXlfdHlwZShsb2NhdGlvbiwgQlRSRlNfSU5PREVfSVRFTV9LRVkpOworCWxvY2F0aW9uLT5vZmZzZXQgPSAwOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBub2lubGluZSB2b2lkIGluaXRfYnRyZnNfaShzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXN0cnVjdCBidHJmc19pbm9kZSAqYmkgPSBCVFJGU19JKGlub2RlKTsKKworCWJpLT5pX2FjbCA9IE5VTEw7CisJYmktPmlfZGVmYXVsdF9hY2wgPSBOVUxMOworCisJYmktPmdlbmVyYXRpb24gPSAwOworCWJpLT5zZXF1ZW5jZSA9IDA7CisJYmktPmxhc3RfdHJhbnMgPSAwOworCWJpLT5sb2dnZWRfdHJhbnMgPSAwOworCWJpLT5kZWxhbGxvY19ieXRlcyA9IDA7CisJYmktPmRpc2tfaV9zaXplID0gMDsKKwliaS0+ZmxhZ3MgPSAwOworCWJpLT5pbmRleF9jbnQgPSAodTY0KS0xOworCWJpLT5sb2dfZGlydHlfdHJhbnMgPSAwOworCWV4dGVudF9tYXBfdHJlZV9pbml0KCZCVFJGU19JKGlub2RlKS0+ZXh0ZW50X3RyZWUsIEdGUF9OT0ZTKTsKKwlleHRlbnRfaW9fdHJlZV9pbml0KCZCVFJGU19JKGlub2RlKS0+aW9fdHJlZSwKKwkJCSAgICAgaW5vZGUtPmlfbWFwcGluZywgR0ZQX05PRlMpOworCWV4dGVudF9pb190cmVlX2luaXQoJkJUUkZTX0koaW5vZGUpLT5pb19mYWlsdXJlX3RyZWUsCisJCQkgICAgIGlub2RlLT5pX21hcHBpbmcsIEdGUF9OT0ZTKTsKKwlJTklUX0xJU1RfSEVBRCgmQlRSRlNfSShpbm9kZSktPmRlbGFsbG9jX2lub2Rlcyk7CisJYnRyZnNfb3JkZXJlZF9pbm9kZV90cmVlX2luaXQoJkJUUkZTX0koaW5vZGUpLT5vcmRlcmVkX3RyZWUpOworCW11dGV4X2luaXQoJkJUUkZTX0koaW5vZGUpLT5leHRlbnRfbXV0ZXgpOworCW11dGV4X2luaXQoJkJUUkZTX0koaW5vZGUpLT5sb2dfbXV0ZXgpOworfQorCitzdGF0aWMgaW50IGJ0cmZzX2luaXRfbG9ja2VkX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHZvaWQgKnApCit7CisJc3RydWN0IGJ0cmZzX2lnZXRfYXJncyAqYXJncyA9IHA7CisJaW5vZGUtPmlfaW5vID0gYXJncy0+aW5vOworCWluaXRfYnRyZnNfaShpbm9kZSk7CisJQlRSRlNfSShpbm9kZSktPnJvb3QgPSBhcmdzLT5yb290OworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGJ0cmZzX2ZpbmRfYWN0b3Ioc3RydWN0IGlub2RlICppbm9kZSwgdm9pZCAqb3BhcXVlKQoreworCXN0cnVjdCBidHJmc19pZ2V0X2FyZ3MgKmFyZ3MgPSBvcGFxdWU7CisJcmV0dXJuIGFyZ3MtPmlubyA9PSBpbm9kZS0+aV9pbm8gJiYKKwkJYXJncy0+cm9vdCA9PSBCVFJGU19JKGlub2RlKS0+cm9vdDsKK30KKworc3RydWN0IGlub2RlICpidHJmc19pbG9va3VwKHN0cnVjdCBzdXBlcl9ibG9jayAqcywgdTY0IG9iamVjdGlkLAorCQkJICAgIHN0cnVjdCBidHJmc19yb290ICpyb290LCBpbnQgd2FpdCkKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCXN0cnVjdCBidHJmc19pZ2V0X2FyZ3MgYXJnczsKKwlhcmdzLmlubyA9IG9iamVjdGlkOworCWFyZ3Mucm9vdCA9IHJvb3Q7CisKKwlpZiAod2FpdCkgeworCQlpbm9kZSA9IGlsb29rdXA1KHMsIG9iamVjdGlkLCBidHJmc19maW5kX2FjdG9yLAorCQkJCSAodm9pZCAqKSZhcmdzKTsKKwl9IGVsc2UgeworCQlpbm9kZSA9IGlsb29rdXA1X25vd2FpdChzLCBvYmplY3RpZCwgYnRyZnNfZmluZF9hY3RvciwKKwkJCQkJKHZvaWQgKikmYXJncyk7CisJfQorCXJldHVybiBpbm9kZTsKK30KKworc3RydWN0IGlub2RlICpidHJmc19pZ2V0X2xvY2tlZChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsIHU2NCBvYmplY3RpZCwKKwkJCQlzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCkKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCXN0cnVjdCBidHJmc19pZ2V0X2FyZ3MgYXJnczsKKwlhcmdzLmlubyA9IG9iamVjdGlkOworCWFyZ3Mucm9vdCA9IHJvb3Q7CisKKwlpbm9kZSA9IGlnZXQ1X2xvY2tlZChzLCBvYmplY3RpZCwgYnRyZnNfZmluZF9hY3RvciwKKwkJCSAgICAgYnRyZnNfaW5pdF9sb2NrZWRfaW5vZGUsCisJCQkgICAgICh2b2lkICopJmFyZ3MpOworCXJldHVybiBpbm9kZTsKK30KKworLyogR2V0IGFuIGlub2RlIG9iamVjdCBnaXZlbiBpdHMgbG9jYXRpb24gYW5kIGNvcnJlc3BvbmRpbmcgcm9vdC4KKyAqIFJldHVybnMgaW4gKmlzX25ldyBpZiB0aGUgaW5vZGUgd2FzIHJlYWQgZnJvbSBkaXNrCisgKi8KK3N0cnVjdCBpbm9kZSAqYnRyZnNfaWdldChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsIHN0cnVjdCBidHJmc19rZXkgKmxvY2F0aW9uLAorCQkJIHN0cnVjdCBidHJmc19yb290ICpyb290LCBpbnQgKmlzX25ldykKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCisJaW5vZGUgPSBidHJmc19pZ2V0X2xvY2tlZChzLCBsb2NhdGlvbi0+b2JqZWN0aWQsIHJvb3QpOworCWlmICghaW5vZGUpCisJCXJldHVybiBFUlJfUFRSKC1FQUNDRVMpOworCisJaWYgKGlub2RlLT5pX3N0YXRlICYgSV9ORVcpIHsKKwkJQlRSRlNfSShpbm9kZSktPnJvb3QgPSByb290OworCQltZW1jcHkoJkJUUkZTX0koaW5vZGUpLT5sb2NhdGlvbiwgbG9jYXRpb24sIHNpemVvZigqbG9jYXRpb24pKTsKKwkJYnRyZnNfcmVhZF9sb2NrZWRfaW5vZGUoaW5vZGUpOworCQl1bmxvY2tfbmV3X2lub2RlKGlub2RlKTsKKwkJaWYgKGlzX25ldykKKwkJCSppc19uZXcgPSAxOworCX0gZWxzZSB7CisJCWlmIChpc19uZXcpCisJCQkqaXNfbmV3ID0gMDsKKwl9CisKKwlyZXR1cm4gaW5vZGU7Cit9CisKK3N0cnVjdCBpbm9kZSAqYnRyZnNfbG9va3VwX2RlbnRyeShzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5KQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisJc3RydWN0IGJ0cmZzX2lub2RlICpiaSA9IEJUUkZTX0koZGlyKTsKKwlzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCA9IGJpLT5yb290OworCXN0cnVjdCBidHJmc19yb290ICpzdWJfcm9vdCA9IHJvb3Q7CisJc3RydWN0IGJ0cmZzX2tleSBsb2NhdGlvbjsKKwlpbnQgcmV0LCBuZXc7CisKKwlpZiAoZGVudHJ5LT5kX25hbWUubGVuID4gQlRSRlNfTkFNRV9MRU4pCisJCXJldHVybiBFUlJfUFRSKC1FTkFNRVRPT0xPTkcpOworCisJcmV0ID0gYnRyZnNfaW5vZGVfYnlfbmFtZShkaXIsIGRlbnRyeSwgJmxvY2F0aW9uKTsKKworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gRVJSX1BUUihyZXQpOworCisJaW5vZGUgPSBOVUxMOworCWlmIChsb2NhdGlvbi5vYmplY3RpZCkgeworCQlyZXQgPSBmaXh1cF90cmVlX3Jvb3RfbG9jYXRpb24ocm9vdCwgJmxvY2F0aW9uLCAmc3ViX3Jvb3QsCisJCQkJCQlkZW50cnkpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiBFUlJfUFRSKHJldCk7CisJCWlmIChyZXQgPiAwKQorCQkJcmV0dXJuIEVSUl9QVFIoLUVOT0VOVCk7CisJCWlub2RlID0gYnRyZnNfaWdldChkaXItPmlfc2IsICZsb2NhdGlvbiwgc3ViX3Jvb3QsICZuZXcpOworCQlpZiAoSVNfRVJSKGlub2RlKSkKKwkJCXJldHVybiBFUlJfQ0FTVChpbm9kZSk7CisJfQorCXJldHVybiBpbm9kZTsKK30KKworc3RhdGljIHN0cnVjdCBkZW50cnkgKmJ0cmZzX2xvb2t1cChzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LAorCQkJCSAgIHN0cnVjdCBuYW1laWRhdGEgKm5kKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisKKwlpZiAoZGVudHJ5LT5kX25hbWUubGVuID4gQlRSRlNfTkFNRV9MRU4pCisJCXJldHVybiBFUlJfUFRSKC1FTkFNRVRPT0xPTkcpOworCisJaW5vZGUgPSBidHJmc19sb29rdXBfZGVudHJ5KGRpciwgZGVudHJ5KTsKKwlpZiAoSVNfRVJSKGlub2RlKSkKKwkJcmV0dXJuIEVSUl9DQVNUKGlub2RlKTsKKworCXJldHVybiBkX3NwbGljZV9hbGlhcyhpbm9kZSwgZGVudHJ5KTsKK30KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgYnRyZnNfZmlsZXR5cGVfdGFibGVbXSA9IHsKKwlEVF9VTktOT1dOLCBEVF9SRUcsIERUX0RJUiwgRFRfQ0hSLCBEVF9CTEssIERUX0ZJRk8sIERUX1NPQ0ssIERUX0xOSworfTsKKworc3RhdGljIGludCBidHJmc19yZWFsX3JlYWRkaXIoc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgKmRpcmVudCwKKwkJCSAgICAgIGZpbGxkaXJfdCBmaWxsZGlyKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCA9IEJUUkZTX0koaW5vZGUpLT5yb290OworCXN0cnVjdCBidHJmc19pdGVtICppdGVtOworCXN0cnVjdCBidHJmc19kaXJfaXRlbSAqZGk7CisJc3RydWN0IGJ0cmZzX2tleSBrZXk7CisJc3RydWN0IGJ0cmZzX2tleSBmb3VuZF9rZXk7CisJc3RydWN0IGJ0cmZzX3BhdGggKnBhdGg7CisJaW50IHJldDsKKwl1MzIgbnJpdGVtczsKKwlzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqbGVhZjsKKwlpbnQgc2xvdDsKKwlpbnQgYWR2YW5jZTsKKwl1bnNpZ25lZCBjaGFyIGRfdHlwZTsKKwlpbnQgb3ZlciA9IDA7CisJdTMyIGRpX2N1cjsKKwl1MzIgZGlfdG90YWw7CisJdTMyIGRpX2xlbjsKKwlpbnQga2V5X3R5cGUgPSBCVFJGU19ESVJfSU5ERVhfS0VZOworCWNoYXIgdG1wX25hbWVbMzJdOworCWNoYXIgKm5hbWVfcHRyOworCWludCBuYW1lX2xlbjsKKworCS8qIEZJWE1FLCB1c2UgYSByZWFsIGZsYWcgZm9yIGRlY2lkaW5nIGFib3V0IHRoZSBrZXkgdHlwZSAqLworCWlmIChyb290LT5mc19pbmZvLT50cmVlX3Jvb3QgPT0gcm9vdCkKKwkJa2V5X3R5cGUgPSBCVFJGU19ESVJfSVRFTV9LRVk7CisKKwkvKiBzcGVjaWFsIGNhc2UgZm9yICIuIiAqLworCWlmIChmaWxwLT5mX3BvcyA9PSAwKSB7CisJCW92ZXIgPSBmaWxsZGlyKGRpcmVudCwgIi4iLCAxLAorCQkJICAgICAgIDEsIGlub2RlLT5pX2lubywKKwkJCSAgICAgICBEVF9ESVIpOworCQlpZiAob3ZlcikKKwkJCXJldHVybiAwOworCQlmaWxwLT5mX3BvcyA9IDE7CisJfQorCS8qIHNwZWNpYWwgY2FzZSBmb3IgLi4sIGp1c3QgdXNlIHRoZSBiYWNrIHJlZiAqLworCWlmIChmaWxwLT5mX3BvcyA9PSAxKSB7CisJCXU2NCBwaW5vID0gcGFyZW50X2lubyhmaWxwLT5mX3BhdGguZGVudHJ5KTsKKwkJb3ZlciA9IGZpbGxkaXIoZGlyZW50LCAiLi4iLCAyLAorCQkJICAgICAgIDIsIHBpbm8sIERUX0RJUik7CisJCWlmIChvdmVyKQorCQkJcmV0dXJuIDA7CisJCWZpbHAtPmZfcG9zID0gMjsKKwl9CisJcGF0aCA9IGJ0cmZzX2FsbG9jX3BhdGgoKTsKKwlwYXRoLT5yZWFkYSA9IDI7CisKKwlidHJmc19zZXRfa2V5X3R5cGUoJmtleSwga2V5X3R5cGUpOworCWtleS5vZmZzZXQgPSBmaWxwLT5mX3BvczsKKwlrZXkub2JqZWN0aWQgPSBpbm9kZS0+aV9pbm87CisKKwlyZXQgPSBidHJmc19zZWFyY2hfc2xvdChOVUxMLCByb290LCAma2V5LCBwYXRoLCAwLCAwKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnI7CisJYWR2YW5jZSA9IDA7CisKKwl3aGlsZSAoMSkgeworCQlsZWFmID0gcGF0aC0+bm9kZXNbMF07CisJCW5yaXRlbXMgPSBidHJmc19oZWFkZXJfbnJpdGVtcyhsZWFmKTsKKwkJc2xvdCA9IHBhdGgtPnNsb3RzWzBdOworCQlpZiAoYWR2YW5jZSB8fCBzbG90ID49IG5yaXRlbXMpIHsKKwkJCWlmIChzbG90ID49IG5yaXRlbXMgLSAxKSB7CisJCQkJcmV0ID0gYnRyZnNfbmV4dF9sZWFmKHJvb3QsIHBhdGgpOworCQkJCWlmIChyZXQpCisJCQkJCWJyZWFrOworCQkJCWxlYWYgPSBwYXRoLT5ub2Rlc1swXTsKKwkJCQlucml0ZW1zID0gYnRyZnNfaGVhZGVyX25yaXRlbXMobGVhZik7CisJCQkJc2xvdCA9IHBhdGgtPnNsb3RzWzBdOworCQkJfSBlbHNlIHsKKwkJCQlzbG90Kys7CisJCQkJcGF0aC0+c2xvdHNbMF0rKzsKKwkJCX0KKwkJfQorCisJCWFkdmFuY2UgPSAxOworCQlpdGVtID0gYnRyZnNfaXRlbV9ucihsZWFmLCBzbG90KTsKKwkJYnRyZnNfaXRlbV9rZXlfdG9fY3B1KGxlYWYsICZmb3VuZF9rZXksIHNsb3QpOworCisJCWlmIChmb3VuZF9rZXkub2JqZWN0aWQgIT0ga2V5Lm9iamVjdGlkKQorCQkJYnJlYWs7CisJCWlmIChidHJmc19rZXlfdHlwZSgmZm91bmRfa2V5KSAhPSBrZXlfdHlwZSkKKwkJCWJyZWFrOworCQlpZiAoZm91bmRfa2V5Lm9mZnNldCA8IGZpbHAtPmZfcG9zKQorCQkJY29udGludWU7CisKKwkJZmlscC0+Zl9wb3MgPSBmb3VuZF9rZXkub2Zmc2V0OworCisJCWRpID0gYnRyZnNfaXRlbV9wdHIobGVhZiwgc2xvdCwgc3RydWN0IGJ0cmZzX2Rpcl9pdGVtKTsKKwkJZGlfY3VyID0gMDsKKwkJZGlfdG90YWwgPSBidHJmc19pdGVtX3NpemUobGVhZiwgaXRlbSk7CisKKwkJd2hpbGUgKGRpX2N1ciA8IGRpX3RvdGFsKSB7CisJCQlzdHJ1Y3QgYnRyZnNfa2V5IGxvY2F0aW9uOworCisJCQluYW1lX2xlbiA9IGJ0cmZzX2Rpcl9uYW1lX2xlbihsZWFmLCBkaSk7CisJCQlpZiAobmFtZV9sZW4gPD0gc2l6ZW9mKHRtcF9uYW1lKSkgeworCQkJCW5hbWVfcHRyID0gdG1wX25hbWU7CisJCQl9IGVsc2UgeworCQkJCW5hbWVfcHRyID0ga21hbGxvYyhuYW1lX2xlbiwgR0ZQX05PRlMpOworCQkJCWlmICghbmFtZV9wdHIpIHsKKwkJCQkJcmV0ID0gLUVOT01FTTsKKwkJCQkJZ290byBlcnI7CisJCQkJfQorCQkJfQorCQkJcmVhZF9leHRlbnRfYnVmZmVyKGxlYWYsIG5hbWVfcHRyLAorCQkJCQkgICAodW5zaWduZWQgbG9uZykoZGkgKyAxKSwgbmFtZV9sZW4pOworCisJCQlkX3R5cGUgPSBidHJmc19maWxldHlwZV90YWJsZVtidHJmc19kaXJfdHlwZShsZWFmLCBkaSldOworCQkJYnRyZnNfZGlyX2l0ZW1fa2V5X3RvX2NwdShsZWFmLCBkaSwgJmxvY2F0aW9uKTsKKworCQkJLyogaXMgdGhpcyBhIHJlZmVyZW5jZSB0byBvdXIgb3duIHNuYXBzaG90PyBJZiBzbworCQkJICogc2tpcCBpdAorCQkJICovCisJCQlpZiAobG9jYXRpb24udHlwZSA9PSBCVFJGU19ST09UX0lURU1fS0VZICYmCisJCQkgICAgbG9jYXRpb24ub2JqZWN0aWQgPT0gcm9vdC0+cm9vdF9rZXkub2JqZWN0aWQpIHsKKwkJCQlvdmVyID0gMDsKKwkJCQlnb3RvIHNraXA7CisJCQl9CisJCQlvdmVyID0gZmlsbGRpcihkaXJlbnQsIG5hbWVfcHRyLCBuYW1lX2xlbiwKKwkJCQkgICAgICAgZm91bmRfa2V5Lm9mZnNldCwgbG9jYXRpb24ub2JqZWN0aWQsCisJCQkJICAgICAgIGRfdHlwZSk7CisKK3NraXA6CisJCQlpZiAobmFtZV9wdHIgIT0gdG1wX25hbWUpCisJCQkJa2ZyZWUobmFtZV9wdHIpOworCisJCQlpZiAob3ZlcikKKwkJCQlnb3RvIG5vcG9zOworCQkJZGlfbGVuID0gYnRyZnNfZGlyX25hbWVfbGVuKGxlYWYsIGRpKSArCisJCQkJIGJ0cmZzX2Rpcl9kYXRhX2xlbihsZWFmLCBkaSkgKyBzaXplb2YoKmRpKTsKKwkJCWRpX2N1ciArPSBkaV9sZW47CisJCQlkaSA9IChzdHJ1Y3QgYnRyZnNfZGlyX2l0ZW0gKikoKGNoYXIgKilkaSArIGRpX2xlbik7CisJCX0KKwl9CisKKwkvKiBSZWFjaGVkIGVuZCBvZiBkaXJlY3Rvcnkvcm9vdC4gQnVtcCBwb3MgcGFzdCB0aGUgbGFzdCBpdGVtLiAqLworCWlmIChrZXlfdHlwZSA9PSBCVFJGU19ESVJfSU5ERVhfS0VZKQorCQlmaWxwLT5mX3BvcyA9IElOVF9MSU1JVCh0eXBlb2YoZmlscC0+Zl9wb3MpKTsKKwllbHNlCisJCWZpbHAtPmZfcG9zKys7Citub3BvczoKKwlyZXQgPSAwOworZXJyOgorCWJ0cmZzX2ZyZWVfcGF0aChwYXRoKTsKKwlyZXR1cm4gcmV0OworfQorCitpbnQgYnRyZnNfd3JpdGVfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSwgaW50IHdhaXQpCit7CisJc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QgPSBCVFJGU19JKGlub2RlKS0+cm9vdDsKKwlzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFuczsKKwlpbnQgcmV0ID0gMDsKKworCWlmIChyb290LT5mc19pbmZvLT5idHJlZV9pbm9kZSA9PSBpbm9kZSkKKwkJcmV0dXJuIDA7CisKKwlpZiAod2FpdCkgeworCQl0cmFucyA9IGJ0cmZzX2pvaW5fdHJhbnNhY3Rpb24ocm9vdCwgMSk7CisJCWJ0cmZzX3NldF90cmFuc19ibG9ja19ncm91cCh0cmFucywgaW5vZGUpOworCQlyZXQgPSBidHJmc19jb21taXRfdHJhbnNhY3Rpb24odHJhbnMsIHJvb3QpOworCX0KKwlyZXR1cm4gcmV0OworfQorCisvKgorICogVGhpcyBpcyBzb21ld2hhdCBleHBlbnNpdmUsIHVwZGF0aW5nIHRoZSB0cmVlIGV2ZXJ5IHRpbWUgdGhlCisgKiBpbm9kZSBjaGFuZ2VzLiAgQnV0LCBpdCBpcyBtb3N0IGxpa2VseSB0byBmaW5kIHRoZSBpbm9kZSBpbiBjYWNoZS4KKyAqIEZJWE1FLCBuZWVkcyBtb3JlIGJlbmNobWFya2luZy4uLnRoZXJlIGFyZSBubyByZWFzb25zIG90aGVyIHRoYW4gcGVyZm9ybWFuY2UKKyAqIHRvIGtlZXAgb3IgZHJvcCB0aGlzIGNvZGUuCisgKi8KK3ZvaWQgYnRyZnNfZGlydHlfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCA9IEJUUkZTX0koaW5vZGUpLT5yb290OworCXN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zOworCisJdHJhbnMgPSBidHJmc19qb2luX3RyYW5zYWN0aW9uKHJvb3QsIDEpOworCWJ0cmZzX3NldF90cmFuc19ibG9ja19ncm91cCh0cmFucywgaW5vZGUpOworCWJ0cmZzX3VwZGF0ZV9pbm9kZSh0cmFucywgcm9vdCwgaW5vZGUpOworCWJ0cmZzX2VuZF90cmFuc2FjdGlvbih0cmFucywgcm9vdCk7Cit9CisKKy8qCisgKiBmaW5kIHRoZSBoaWdoZXN0IGV4aXN0aW5nIHNlcXVlbmNlIG51bWJlciBpbiBhIGRpcmVjdG9yeQorICogYW5kIHRoZW4gc2V0IHRoZSBpbi1tZW1vcnkgaW5kZXhfY250IHZhcmlhYmxlIHRvIHJlZmxlY3QKKyAqIGZyZWUgc2VxdWVuY2UgbnVtYmVycworICovCitzdGF0aWMgaW50IGJ0cmZzX3NldF9pbm9kZV9pbmRleF9jb3VudChzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXN0cnVjdCBidHJmc19yb290ICpyb290ID0gQlRSRlNfSShpbm9kZSktPnJvb3Q7CisJc3RydWN0IGJ0cmZzX2tleSBrZXksIGZvdW5kX2tleTsKKwlzdHJ1Y3QgYnRyZnNfcGF0aCAqcGF0aDsKKwlzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqbGVhZjsKKwlpbnQgcmV0OworCisJa2V5Lm9iamVjdGlkID0gaW5vZGUtPmlfaW5vOworCWJ0cmZzX3NldF9rZXlfdHlwZSgma2V5LCBCVFJGU19ESVJfSU5ERVhfS0VZKTsKKwlrZXkub2Zmc2V0ID0gKHU2NCktMTsKKworCXBhdGggPSBidHJmc19hbGxvY19wYXRoKCk7CisJaWYgKCFwYXRoKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJldCA9IGJ0cmZzX3NlYXJjaF9zbG90KE5VTEwsIHJvb3QsICZrZXksIHBhdGgsIDAsIDApOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dDsKKwkvKiBGSVhNRTogd2Ugc2hvdWxkIGJlIGFibGUgdG8gaGFuZGxlIHRoaXMgKi8KKwlpZiAocmV0ID09IDApCisJCWdvdG8gb3V0OworCXJldCA9IDA7CisKKwkvKgorCSAqIE1BR0lDIE5VTUJFUiBFWFBMQU5BVElPTjoKKwkgKiBzaW5jZSB3ZSBzZWFyY2ggYSBkaXJlY3RvcnkgYmFzZWQgb24gZl9wb3Mgd2UgaGF2ZSB0byBzdGFydCBhdCAyCisJICogc2luY2UgJy4nIGFuZCAnLi4nIGhhdmUgZl9wb3Mgb2YgMCBhbmQgMSByZXNwZWN0aXZlbHksIHNvIGV2ZXJ5Ym9keQorCSAqIGVsc2UgaGFzIHRvIHN0YXJ0IGF0IDIKKwkgKi8KKwlpZiAocGF0aC0+c2xvdHNbMF0gPT0gMCkgeworCQlCVFJGU19JKGlub2RlKS0+aW5kZXhfY250ID0gMjsKKwkJZ290byBvdXQ7CisJfQorCisJcGF0aC0+c2xvdHNbMF0tLTsKKworCWxlYWYgPSBwYXRoLT5ub2Rlc1swXTsKKwlidHJmc19pdGVtX2tleV90b19jcHUobGVhZiwgJmZvdW5kX2tleSwgcGF0aC0+c2xvdHNbMF0pOworCisJaWYgKGZvdW5kX2tleS5vYmplY3RpZCAhPSBpbm9kZS0+aV9pbm8gfHwKKwkgICAgYnRyZnNfa2V5X3R5cGUoJmZvdW5kX2tleSkgIT0gQlRSRlNfRElSX0lOREVYX0tFWSkgeworCQlCVFJGU19JKGlub2RlKS0+aW5kZXhfY250ID0gMjsKKwkJZ290byBvdXQ7CisJfQorCisJQlRSRlNfSShpbm9kZSktPmluZGV4X2NudCA9IGZvdW5kX2tleS5vZmZzZXQgKyAxOworb3V0OgorCWJ0cmZzX2ZyZWVfcGF0aChwYXRoKTsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogaGVscGVyIHRvIGZpbmQgYSBmcmVlIHNlcXVlbmNlIG51bWJlciBpbiBhIGdpdmVuIGRpcmVjdG9yeS4gIFRoaXMgY3VycmVudAorICogY29kZSBpcyB2ZXJ5IHNpbXBsZSwgbGF0ZXIgdmVyc2lvbnMgd2lsbCBkbyBzbWFydGVyIHRoaW5ncyBpbiB0aGUgYnRyZWUKKyAqLworaW50IGJ0cmZzX3NldF9pbm9kZV9pbmRleChzdHJ1Y3QgaW5vZGUgKmRpciwgdTY0ICppbmRleCkKK3sKKwlpbnQgcmV0ID0gMDsKKworCWlmIChCVFJGU19JKGRpciktPmluZGV4X2NudCA9PSAodTY0KS0xKSB7CisJCXJldCA9IGJ0cmZzX3NldF9pbm9kZV9pbmRleF9jb3VudChkaXIpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwl9CisKKwkqaW5kZXggPSBCVFJGU19JKGRpciktPmluZGV4X2NudDsKKwlCVFJGU19JKGRpciktPmluZGV4X2NudCsrOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0cnVjdCBpbm9kZSAqYnRyZnNfbmV3X2lub2RlKHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAorCQkJCSAgICAgc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsCisJCQkJICAgICBzdHJ1Y3QgaW5vZGUgKmRpciwKKwkJCQkgICAgIGNvbnN0IGNoYXIgKm5hbWUsIGludCBuYW1lX2xlbiwKKwkJCQkgICAgIHU2NCByZWZfb2JqZWN0aWQsIHU2NCBvYmplY3RpZCwKKwkJCQkgICAgIHU2NCBhbGxvY19oaW50LCBpbnQgbW9kZSwgdTY0ICppbmRleCkKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCXN0cnVjdCBidHJmc19pbm9kZV9pdGVtICppbm9kZV9pdGVtOworCXN0cnVjdCBidHJmc19rZXkgKmxvY2F0aW9uOworCXN0cnVjdCBidHJmc19wYXRoICpwYXRoOworCXN0cnVjdCBidHJmc19pbm9kZV9yZWYgKnJlZjsKKwlzdHJ1Y3QgYnRyZnNfa2V5IGtleVsyXTsKKwl1MzIgc2l6ZXNbMl07CisJdW5zaWduZWQgbG9uZyBwdHI7CisJaW50IHJldDsKKwlpbnQgb3duZXI7CisKKwlwYXRoID0gYnRyZnNfYWxsb2NfcGF0aCgpOworCUJVR19PTighcGF0aCk7CisKKwlpbm9kZSA9IG5ld19pbm9kZShyb290LT5mc19pbmZvLT5zYik7CisJaWYgKCFpbm9kZSkKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwlpZiAoZGlyKSB7CisJCXJldCA9IGJ0cmZzX3NldF9pbm9kZV9pbmRleChkaXIsIGluZGV4KTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiBFUlJfUFRSKHJldCk7CisJfQorCS8qCisJICogaW5kZXhfY250IGlzIGlnbm9yZWQgZm9yIGV2ZXJ5dGhpbmcgYnV0IGEgZGlyLAorCSAqIGJ0cmZzX2dldF9pbm9kZV9pbmRleF9jb3VudCBoYXMgYW4gZXhwbGFuYXRpb24gZm9yIHRoZSBtYWdpYworCSAqIG51bWJlcgorCSAqLworCWluaXRfYnRyZnNfaShpbm9kZSk7CisJQlRSRlNfSShpbm9kZSktPmluZGV4X2NudCA9IDI7CisJQlRSRlNfSShpbm9kZSktPnJvb3QgPSByb290OworCUJUUkZTX0koaW5vZGUpLT5nZW5lcmF0aW9uID0gdHJhbnMtPnRyYW5zaWQ7CisKKwlpZiAobW9kZSAmIFNfSUZESVIpCisJCW93bmVyID0gMDsKKwllbHNlCisJCW93bmVyID0gMTsKKwlCVFJGU19JKGlub2RlKS0+YmxvY2tfZ3JvdXAgPQorCQkJYnRyZnNfZmluZF9ibG9ja19ncm91cChyb290LCAwLCBhbGxvY19oaW50LCBvd25lcik7CisJaWYgKChtb2RlICYgU19JRlJFRykpIHsKKwkJaWYgKGJ0cmZzX3Rlc3Rfb3B0KHJvb3QsIE5PREFUQVNVTSkpCisJCQlidHJmc19zZXRfZmxhZyhpbm9kZSwgTk9EQVRBU1VNKTsKKwkJaWYgKGJ0cmZzX3Rlc3Rfb3B0KHJvb3QsIE5PREFUQUNPVykpCisJCQlidHJmc19zZXRfZmxhZyhpbm9kZSwgTk9EQVRBQ09XKTsKKwl9CisKKwlrZXlbMF0ub2JqZWN0aWQgPSBvYmplY3RpZDsKKwlidHJmc19zZXRfa2V5X3R5cGUoJmtleVswXSwgQlRSRlNfSU5PREVfSVRFTV9LRVkpOworCWtleVswXS5vZmZzZXQgPSAwOworCisJa2V5WzFdLm9iamVjdGlkID0gb2JqZWN0aWQ7CisJYnRyZnNfc2V0X2tleV90eXBlKCZrZXlbMV0sIEJUUkZTX0lOT0RFX1JFRl9LRVkpOworCWtleVsxXS5vZmZzZXQgPSByZWZfb2JqZWN0aWQ7CisKKwlzaXplc1swXSA9IHNpemVvZihzdHJ1Y3QgYnRyZnNfaW5vZGVfaXRlbSk7CisJc2l6ZXNbMV0gPSBuYW1lX2xlbiArIHNpemVvZigqcmVmKTsKKworCXJldCA9IGJ0cmZzX2luc2VydF9lbXB0eV9pdGVtcyh0cmFucywgcm9vdCwgcGF0aCwga2V5LCBzaXplcywgMik7CisJaWYgKHJldCAhPSAwKQorCQlnb3RvIGZhaWw7CisKKwlpZiAob2JqZWN0aWQgPiByb290LT5oaWdoZXN0X2lub2RlKQorCQlyb290LT5oaWdoZXN0X2lub2RlID0gb2JqZWN0aWQ7CisKKwlpbm9kZS0+aV91aWQgPSBjdXJyZW50X2ZzdWlkKCk7CisJaW5vZGUtPmlfZ2lkID0gY3VycmVudF9mc2dpZCgpOworCWlub2RlLT5pX21vZGUgPSBtb2RlOworCWlub2RlLT5pX2lubyA9IG9iamVjdGlkOworCWlub2RlX3NldF9ieXRlcyhpbm9kZSwgMCk7CisJaW5vZGUtPmlfbXRpbWUgPSBpbm9kZS0+aV9hdGltZSA9IGlub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FOworCWlub2RlX2l0ZW0gPSBidHJmc19pdGVtX3B0cihwYXRoLT5ub2Rlc1swXSwgcGF0aC0+c2xvdHNbMF0sCisJCQkJICBzdHJ1Y3QgYnRyZnNfaW5vZGVfaXRlbSk7CisJZmlsbF9pbm9kZV9pdGVtKHRyYW5zLCBwYXRoLT5ub2Rlc1swXSwgaW5vZGVfaXRlbSwgaW5vZGUpOworCisJcmVmID0gYnRyZnNfaXRlbV9wdHIocGF0aC0+bm9kZXNbMF0sIHBhdGgtPnNsb3RzWzBdICsgMSwKKwkJCSAgICAgc3RydWN0IGJ0cmZzX2lub2RlX3JlZik7CisJYnRyZnNfc2V0X2lub2RlX3JlZl9uYW1lX2xlbihwYXRoLT5ub2Rlc1swXSwgcmVmLCBuYW1lX2xlbik7CisJYnRyZnNfc2V0X2lub2RlX3JlZl9pbmRleChwYXRoLT5ub2Rlc1swXSwgcmVmLCAqaW5kZXgpOworCXB0ciA9ICh1bnNpZ25lZCBsb25nKShyZWYgKyAxKTsKKwl3cml0ZV9leHRlbnRfYnVmZmVyKHBhdGgtPm5vZGVzWzBdLCBuYW1lLCBwdHIsIG5hbWVfbGVuKTsKKworCWJ0cmZzX21hcmtfYnVmZmVyX2RpcnR5KHBhdGgtPm5vZGVzWzBdKTsKKwlidHJmc19mcmVlX3BhdGgocGF0aCk7CisKKwlsb2NhdGlvbiA9ICZCVFJGU19JKGlub2RlKS0+bG9jYXRpb247CisJbG9jYXRpb24tPm9iamVjdGlkID0gb2JqZWN0aWQ7CisJbG9jYXRpb24tPm9mZnNldCA9IDA7CisJYnRyZnNfc2V0X2tleV90eXBlKGxvY2F0aW9uLCBCVFJGU19JTk9ERV9JVEVNX0tFWSk7CisKKwlpbnNlcnRfaW5vZGVfaGFzaChpbm9kZSk7CisJcmV0dXJuIGlub2RlOworZmFpbDoKKwlpZiAoZGlyKQorCQlCVFJGU19JKGRpciktPmluZGV4X2NudC0tOworCWJ0cmZzX2ZyZWVfcGF0aChwYXRoKTsKKwlyZXR1cm4gRVJSX1BUUihyZXQpOworfQorCitzdGF0aWMgaW5saW5lIHU4IGJ0cmZzX2lub2RlX3R5cGUoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlyZXR1cm4gYnRyZnNfdHlwZV9ieV9tb2RlWyhpbm9kZS0+aV9tb2RlICYgU19JRk1UKSA+PiBTX1NISUZUXTsKK30KKworLyoKKyAqIHV0aWxpdHkgZnVuY3Rpb24gdG8gYWRkICdpbm9kZScgaW50byAncGFyZW50X2lub2RlJyB3aXRoCisgKiBhIGdpdmUgbmFtZSBhbmQgYSBnaXZlbiBzZXF1ZW5jZSBudW1iZXIuCisgKiBpZiAnYWRkX2JhY2tyZWYnIGlzIHRydWUsIGFsc28gaW5zZXJ0IGEgYmFja3JlZiBmcm9tIHRoZQorICogaW5vZGUgdG8gdGhlIHBhcmVudCBkaXJlY3RvcnkuCisgKi8KK2ludCBidHJmc19hZGRfbGluayhzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKKwkJICAgc3RydWN0IGlub2RlICpwYXJlbnRfaW5vZGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCSAgIGNvbnN0IGNoYXIgKm5hbWUsIGludCBuYW1lX2xlbiwgaW50IGFkZF9iYWNrcmVmLCB1NjQgaW5kZXgpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgYnRyZnNfa2V5IGtleTsKKwlzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCA9IEJUUkZTX0kocGFyZW50X2lub2RlKS0+cm9vdDsKKworCWtleS5vYmplY3RpZCA9IGlub2RlLT5pX2lubzsKKwlidHJmc19zZXRfa2V5X3R5cGUoJmtleSwgQlRSRlNfSU5PREVfSVRFTV9LRVkpOworCWtleS5vZmZzZXQgPSAwOworCisJcmV0ID0gYnRyZnNfaW5zZXJ0X2Rpcl9pdGVtKHRyYW5zLCByb290LCBuYW1lLCBuYW1lX2xlbiwKKwkJCQkgICAgcGFyZW50X2lub2RlLT5pX2lubywKKwkJCQkgICAgJmtleSwgYnRyZnNfaW5vZGVfdHlwZShpbm9kZSksCisJCQkJICAgIGluZGV4KTsKKwlpZiAocmV0ID09IDApIHsKKwkJaWYgKGFkZF9iYWNrcmVmKSB7CisJCQlyZXQgPSBidHJmc19pbnNlcnRfaW5vZGVfcmVmKHRyYW5zLCByb290LAorCQkJCQkJICAgICBuYW1lLCBuYW1lX2xlbiwKKwkJCQkJCSAgICAgaW5vZGUtPmlfaW5vLAorCQkJCQkJICAgICBwYXJlbnRfaW5vZGUtPmlfaW5vLAorCQkJCQkJICAgICBpbmRleCk7CisJCX0KKwkJYnRyZnNfaV9zaXplX3dyaXRlKHBhcmVudF9pbm9kZSwgcGFyZW50X2lub2RlLT5pX3NpemUgKworCQkJCSAgIG5hbWVfbGVuICogMik7CisJCXBhcmVudF9pbm9kZS0+aV9tdGltZSA9IHBhcmVudF9pbm9kZS0+aV9jdGltZSA9IENVUlJFTlRfVElNRTsKKwkJcmV0ID0gYnRyZnNfdXBkYXRlX2lub2RlKHRyYW5zLCByb290LCBwYXJlbnRfaW5vZGUpOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGJ0cmZzX2FkZF9ub25kaXIoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCisJCQkgICAgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJICAgIGludCBiYWNrcmVmLCB1NjQgaW5kZXgpCit7CisJaW50IGVyciA9IGJ0cmZzX2FkZF9saW5rKHRyYW5zLCBkZW50cnktPmRfcGFyZW50LT5kX2lub2RlLAorCQkJCSBpbm9kZSwgZGVudHJ5LT5kX25hbWUubmFtZSwKKwkJCQkgZGVudHJ5LT5kX25hbWUubGVuLCBiYWNrcmVmLCBpbmRleCk7CisJaWYgKCFlcnIpIHsKKwkJZF9pbnN0YW50aWF0ZShkZW50cnksIGlub2RlKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChlcnIgPiAwKQorCQllcnIgPSAtRUVYSVNUOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgYnRyZnNfbWtub2Qoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwKKwkJCWludCBtb2RlLCBkZXZfdCByZGV2KQoreworCXN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zOworCXN0cnVjdCBidHJmc19yb290ICpyb290ID0gQlRSRlNfSShkaXIpLT5yb290OworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBOVUxMOworCWludCBlcnI7CisJaW50IGRyb3BfaW5vZGUgPSAwOworCXU2NCBvYmplY3RpZDsKKwl1bnNpZ25lZCBsb25nIG5yID0gMDsKKwl1NjQgaW5kZXggPSAwOworCisJaWYgKCFuZXdfdmFsaWRfZGV2KHJkZXYpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWVyciA9IGJ0cmZzX2NoZWNrX2ZyZWVfc3BhY2Uocm9vdCwgMSwgMCk7CisJaWYgKGVycikKKwkJZ290byBmYWlsOworCisJdHJhbnMgPSBidHJmc19zdGFydF90cmFuc2FjdGlvbihyb290LCAxKTsKKwlidHJmc19zZXRfdHJhbnNfYmxvY2tfZ3JvdXAodHJhbnMsIGRpcik7CisKKwllcnIgPSBidHJmc19maW5kX2ZyZWVfb2JqZWN0aWQodHJhbnMsIHJvb3QsIGRpci0+aV9pbm8sICZvYmplY3RpZCk7CisJaWYgKGVycikgeworCQllcnIgPSAtRU5PU1BDOworCQlnb3RvIG91dF91bmxvY2s7CisJfQorCisJaW5vZGUgPSBidHJmc19uZXdfaW5vZGUodHJhbnMsIHJvb3QsIGRpciwgZGVudHJ5LT5kX25hbWUubmFtZSwKKwkJCQlkZW50cnktPmRfbmFtZS5sZW4sCisJCQkJZGVudHJ5LT5kX3BhcmVudC0+ZF9pbm9kZS0+aV9pbm8sIG9iamVjdGlkLAorCQkJCUJUUkZTX0koZGlyKS0+YmxvY2tfZ3JvdXAsIG1vZGUsICZpbmRleCk7CisJZXJyID0gUFRSX0VSUihpbm9kZSk7CisJaWYgKElTX0VSUihpbm9kZSkpCisJCWdvdG8gb3V0X3VubG9jazsKKworCWVyciA9IGJ0cmZzX2luaXRfYWNsKGlub2RlLCBkaXIpOworCWlmIChlcnIpIHsKKwkJZHJvcF9pbm9kZSA9IDE7CisJCWdvdG8gb3V0X3VubG9jazsKKwl9CisKKwlidHJmc19zZXRfdHJhbnNfYmxvY2tfZ3JvdXAodHJhbnMsIGlub2RlKTsKKwllcnIgPSBidHJmc19hZGRfbm9uZGlyKHRyYW5zLCBkZW50cnksIGlub2RlLCAwLCBpbmRleCk7CisJaWYgKGVycikKKwkJZHJvcF9pbm9kZSA9IDE7CisJZWxzZSB7CisJCWlub2RlLT5pX29wID0gJmJ0cmZzX3NwZWNpYWxfaW5vZGVfb3BlcmF0aW9uczsKKwkJaW5pdF9zcGVjaWFsX2lub2RlKGlub2RlLCBpbm9kZS0+aV9tb2RlLCByZGV2KTsKKwkJYnRyZnNfdXBkYXRlX2lub2RlKHRyYW5zLCByb290LCBpbm9kZSk7CisJfQorCWRpci0+aV9zYi0+c19kaXJ0ID0gMTsKKwlidHJmc191cGRhdGVfaW5vZGVfYmxvY2tfZ3JvdXAodHJhbnMsIGlub2RlKTsKKwlidHJmc191cGRhdGVfaW5vZGVfYmxvY2tfZ3JvdXAodHJhbnMsIGRpcik7CitvdXRfdW5sb2NrOgorCW5yID0gdHJhbnMtPmJsb2Nrc191c2VkOworCWJ0cmZzX2VuZF90cmFuc2FjdGlvbl90aHJvdHRsZSh0cmFucywgcm9vdCk7CitmYWlsOgorCWlmIChkcm9wX2lub2RlKSB7CisJCWlub2RlX2RlY19saW5rX2NvdW50KGlub2RlKTsKKwkJaXB1dChpbm9kZSk7CisJfQorCWJ0cmZzX2J0cmVlX2JhbGFuY2VfZGlydHkocm9vdCwgbnIpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgYnRyZnNfY3JlYXRlKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksCisJCQlpbnQgbW9kZSwgc3RydWN0IG5hbWVpZGF0YSAqbmQpCit7CisJc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnM7CisJc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QgPSBCVFJGU19JKGRpciktPnJvb3Q7CisJc3RydWN0IGlub2RlICppbm9kZSA9IE5VTEw7CisJaW50IGVycjsKKwlpbnQgZHJvcF9pbm9kZSA9IDA7CisJdW5zaWduZWQgbG9uZyBuciA9IDA7CisJdTY0IG9iamVjdGlkOworCXU2NCBpbmRleCA9IDA7CisKKwllcnIgPSBidHJmc19jaGVja19mcmVlX3NwYWNlKHJvb3QsIDEsIDApOworCWlmIChlcnIpCisJCWdvdG8gZmFpbDsKKwl0cmFucyA9IGJ0cmZzX3N0YXJ0X3RyYW5zYWN0aW9uKHJvb3QsIDEpOworCWJ0cmZzX3NldF90cmFuc19ibG9ja19ncm91cCh0cmFucywgZGlyKTsKKworCWVyciA9IGJ0cmZzX2ZpbmRfZnJlZV9vYmplY3RpZCh0cmFucywgcm9vdCwgZGlyLT5pX2lubywgJm9iamVjdGlkKTsKKwlpZiAoZXJyKSB7CisJCWVyciA9IC1FTk9TUEM7CisJCWdvdG8gb3V0X3VubG9jazsKKwl9CisKKwlpbm9kZSA9IGJ0cmZzX25ld19pbm9kZSh0cmFucywgcm9vdCwgZGlyLCBkZW50cnktPmRfbmFtZS5uYW1lLAorCQkJCWRlbnRyeS0+ZF9uYW1lLmxlbiwKKwkJCQlkZW50cnktPmRfcGFyZW50LT5kX2lub2RlLT5pX2lubywKKwkJCQlvYmplY3RpZCwgQlRSRlNfSShkaXIpLT5ibG9ja19ncm91cCwgbW9kZSwKKwkJCQkmaW5kZXgpOworCWVyciA9IFBUUl9FUlIoaW5vZGUpOworCWlmIChJU19FUlIoaW5vZGUpKQorCQlnb3RvIG91dF91bmxvY2s7CisKKwllcnIgPSBidHJmc19pbml0X2FjbChpbm9kZSwgZGlyKTsKKwlpZiAoZXJyKSB7CisJCWRyb3BfaW5vZGUgPSAxOworCQlnb3RvIG91dF91bmxvY2s7CisJfQorCisJYnRyZnNfc2V0X3RyYW5zX2Jsb2NrX2dyb3VwKHRyYW5zLCBpbm9kZSk7CisJZXJyID0gYnRyZnNfYWRkX25vbmRpcih0cmFucywgZGVudHJ5LCBpbm9kZSwgMCwgaW5kZXgpOworCWlmIChlcnIpCisJCWRyb3BfaW5vZGUgPSAxOworCWVsc2UgeworCQlpbm9kZS0+aV9tYXBwaW5nLT5hX29wcyA9ICZidHJmc19hb3BzOworCQlpbm9kZS0+aV9tYXBwaW5nLT5iYWNraW5nX2Rldl9pbmZvID0gJnJvb3QtPmZzX2luZm8tPmJkaTsKKwkJaW5vZGUtPmlfZm9wID0gJmJ0cmZzX2ZpbGVfb3BlcmF0aW9uczsKKwkJaW5vZGUtPmlfb3AgPSAmYnRyZnNfZmlsZV9pbm9kZV9vcGVyYXRpb25zOworCQlCVFJGU19JKGlub2RlKS0+aW9fdHJlZS5vcHMgPSAmYnRyZnNfZXh0ZW50X2lvX29wczsKKwl9CisJZGlyLT5pX3NiLT5zX2RpcnQgPSAxOworCWJ0cmZzX3VwZGF0ZV9pbm9kZV9ibG9ja19ncm91cCh0cmFucywgaW5vZGUpOworCWJ0cmZzX3VwZGF0ZV9pbm9kZV9ibG9ja19ncm91cCh0cmFucywgZGlyKTsKK291dF91bmxvY2s6CisJbnIgPSB0cmFucy0+YmxvY2tzX3VzZWQ7CisJYnRyZnNfZW5kX3RyYW5zYWN0aW9uX3Rocm90dGxlKHRyYW5zLCByb290KTsKK2ZhaWw6CisJaWYgKGRyb3BfaW5vZGUpIHsKKwkJaW5vZGVfZGVjX2xpbmtfY291bnQoaW5vZGUpOworCQlpcHV0KGlub2RlKTsKKwl9CisJYnRyZnNfYnRyZWVfYmFsYW5jZV9kaXJ0eShyb290LCBucik7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBidHJmc19saW5rKHN0cnVjdCBkZW50cnkgKm9sZF9kZW50cnksIHN0cnVjdCBpbm9kZSAqZGlyLAorCQkgICAgICBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCit7CisJc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnM7CisJc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QgPSBCVFJGU19JKGRpciktPnJvb3Q7CisJc3RydWN0IGlub2RlICppbm9kZSA9IG9sZF9kZW50cnktPmRfaW5vZGU7CisJdTY0IGluZGV4OworCXVuc2lnbmVkIGxvbmcgbnIgPSAwOworCWludCBlcnI7CisJaW50IGRyb3BfaW5vZGUgPSAwOworCisJaWYgKGlub2RlLT5pX25saW5rID09IDApCisJCXJldHVybiAtRU5PRU5UOworCisJYnRyZnNfaW5jX25saW5rKGlub2RlKTsKKwllcnIgPSBidHJmc19jaGVja19mcmVlX3NwYWNlKHJvb3QsIDEsIDApOworCWlmIChlcnIpCisJCWdvdG8gZmFpbDsKKwllcnIgPSBidHJmc19zZXRfaW5vZGVfaW5kZXgoZGlyLCAmaW5kZXgpOworCWlmIChlcnIpCisJCWdvdG8gZmFpbDsKKworCXRyYW5zID0gYnRyZnNfc3RhcnRfdHJhbnNhY3Rpb24ocm9vdCwgMSk7CisKKwlidHJmc19zZXRfdHJhbnNfYmxvY2tfZ3JvdXAodHJhbnMsIGRpcik7CisJYXRvbWljX2luYygmaW5vZGUtPmlfY291bnQpOworCisJZXJyID0gYnRyZnNfYWRkX25vbmRpcih0cmFucywgZGVudHJ5LCBpbm9kZSwgMSwgaW5kZXgpOworCisJaWYgKGVycikKKwkJZHJvcF9pbm9kZSA9IDE7CisKKwlkaXItPmlfc2ItPnNfZGlydCA9IDE7CisJYnRyZnNfdXBkYXRlX2lub2RlX2Jsb2NrX2dyb3VwKHRyYW5zLCBkaXIpOworCWVyciA9IGJ0cmZzX3VwZGF0ZV9pbm9kZSh0cmFucywgcm9vdCwgaW5vZGUpOworCisJaWYgKGVycikKKwkJZHJvcF9pbm9kZSA9IDE7CisKKwluciA9IHRyYW5zLT5ibG9ja3NfdXNlZDsKKwlidHJmc19lbmRfdHJhbnNhY3Rpb25fdGhyb3R0bGUodHJhbnMsIHJvb3QpOworZmFpbDoKKwlpZiAoZHJvcF9pbm9kZSkgeworCQlpbm9kZV9kZWNfbGlua19jb3VudChpbm9kZSk7CisJCWlwdXQoaW5vZGUpOworCX0KKwlidHJmc19idHJlZV9iYWxhbmNlX2RpcnR5KHJvb3QsIG5yKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGJ0cmZzX21rZGlyKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGludCBtb2RlKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBOVUxMOworCXN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zOworCXN0cnVjdCBidHJmc19yb290ICpyb290ID0gQlRSRlNfSShkaXIpLT5yb290OworCWludCBlcnIgPSAwOworCWludCBkcm9wX29uX2VyciA9IDA7CisJdTY0IG9iamVjdGlkID0gMDsKKwl1NjQgaW5kZXggPSAwOworCXVuc2lnbmVkIGxvbmcgbnIgPSAxOworCisJZXJyID0gYnRyZnNfY2hlY2tfZnJlZV9zcGFjZShyb290LCAxLCAwKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dF91bmxvY2s7CisKKwl0cmFucyA9IGJ0cmZzX3N0YXJ0X3RyYW5zYWN0aW9uKHJvb3QsIDEpOworCWJ0cmZzX3NldF90cmFuc19ibG9ja19ncm91cCh0cmFucywgZGlyKTsKKworCWlmIChJU19FUlIodHJhbnMpKSB7CisJCWVyciA9IFBUUl9FUlIodHJhbnMpOworCQlnb3RvIG91dF91bmxvY2s7CisJfQorCisJZXJyID0gYnRyZnNfZmluZF9mcmVlX29iamVjdGlkKHRyYW5zLCByb290LCBkaXItPmlfaW5vLCAmb2JqZWN0aWQpOworCWlmIChlcnIpIHsKKwkJZXJyID0gLUVOT1NQQzsKKwkJZ290byBvdXRfdW5sb2NrOworCX0KKworCWlub2RlID0gYnRyZnNfbmV3X2lub2RlKHRyYW5zLCByb290LCBkaXIsIGRlbnRyeS0+ZF9uYW1lLm5hbWUsCisJCQkJZGVudHJ5LT5kX25hbWUubGVuLAorCQkJCWRlbnRyeS0+ZF9wYXJlbnQtPmRfaW5vZGUtPmlfaW5vLCBvYmplY3RpZCwKKwkJCQlCVFJGU19JKGRpciktPmJsb2NrX2dyb3VwLCBTX0lGRElSIHwgbW9kZSwKKwkJCQkmaW5kZXgpOworCWlmIChJU19FUlIoaW5vZGUpKSB7CisJCWVyciA9IFBUUl9FUlIoaW5vZGUpOworCQlnb3RvIG91dF9mYWlsOworCX0KKworCWRyb3Bfb25fZXJyID0gMTsKKworCWVyciA9IGJ0cmZzX2luaXRfYWNsKGlub2RlLCBkaXIpOworCWlmIChlcnIpCisJCWdvdG8gb3V0X2ZhaWw7CisKKwlpbm9kZS0+aV9vcCA9ICZidHJmc19kaXJfaW5vZGVfb3BlcmF0aW9uczsKKwlpbm9kZS0+aV9mb3AgPSAmYnRyZnNfZGlyX2ZpbGVfb3BlcmF0aW9uczsKKwlidHJmc19zZXRfdHJhbnNfYmxvY2tfZ3JvdXAodHJhbnMsIGlub2RlKTsKKworCWJ0cmZzX2lfc2l6ZV93cml0ZShpbm9kZSwgMCk7CisJZXJyID0gYnRyZnNfdXBkYXRlX2lub2RlKHRyYW5zLCByb290LCBpbm9kZSk7CisJaWYgKGVycikKKwkJZ290byBvdXRfZmFpbDsKKworCWVyciA9IGJ0cmZzX2FkZF9saW5rKHRyYW5zLCBkZW50cnktPmRfcGFyZW50LT5kX2lub2RlLAorCQkJCSBpbm9kZSwgZGVudHJ5LT5kX25hbWUubmFtZSwKKwkJCQkgZGVudHJ5LT5kX25hbWUubGVuLCAwLCBpbmRleCk7CisJaWYgKGVycikKKwkJZ290byBvdXRfZmFpbDsKKworCWRfaW5zdGFudGlhdGUoZGVudHJ5LCBpbm9kZSk7CisJZHJvcF9vbl9lcnIgPSAwOworCWRpci0+aV9zYi0+c19kaXJ0ID0gMTsKKwlidHJmc191cGRhdGVfaW5vZGVfYmxvY2tfZ3JvdXAodHJhbnMsIGlub2RlKTsKKwlidHJmc191cGRhdGVfaW5vZGVfYmxvY2tfZ3JvdXAodHJhbnMsIGRpcik7CisKK291dF9mYWlsOgorCW5yID0gdHJhbnMtPmJsb2Nrc191c2VkOworCWJ0cmZzX2VuZF90cmFuc2FjdGlvbl90aHJvdHRsZSh0cmFucywgcm9vdCk7CisKK291dF91bmxvY2s6CisJaWYgKGRyb3Bfb25fZXJyKQorCQlpcHV0KGlub2RlKTsKKwlidHJmc19idHJlZV9iYWxhbmNlX2RpcnR5KHJvb3QsIG5yKTsKKwlyZXR1cm4gZXJyOworfQorCisvKiBoZWxwZXIgZm9yIGJ0ZnNfZ2V0X2V4dGVudC4gIEdpdmVuIGFuIGV4aXN0aW5nIGV4dGVudCBpbiB0aGUgdHJlZSwKKyAqIGFuZCBhbiBleHRlbnQgdGhhdCB5b3Ugd2FudCB0byBpbnNlcnQsIGRlYWwgd2l0aCBvdmVybGFwIGFuZCBpbnNlcnQKKyAqIHRoZSBuZXcgZXh0ZW50IGludG8gdGhlIHRyZWUuCisgKi8KK3N0YXRpYyBpbnQgbWVyZ2VfZXh0ZW50X21hcHBpbmcoc3RydWN0IGV4dGVudF9tYXBfdHJlZSAqZW1fdHJlZSwKKwkJCQlzdHJ1Y3QgZXh0ZW50X21hcCAqZXhpc3RpbmcsCisJCQkJc3RydWN0IGV4dGVudF9tYXAgKmVtLAorCQkJCXU2NCBtYXBfc3RhcnQsIHU2NCBtYXBfbGVuKQoreworCXU2NCBzdGFydF9kaWZmOworCisJQlVHX09OKG1hcF9zdGFydCA8IGVtLT5zdGFydCB8fCBtYXBfc3RhcnQgPj0gZXh0ZW50X21hcF9lbmQoZW0pKTsKKwlzdGFydF9kaWZmID0gbWFwX3N0YXJ0IC0gZW0tPnN0YXJ0OworCWVtLT5zdGFydCA9IG1hcF9zdGFydDsKKwllbS0+bGVuID0gbWFwX2xlbjsKKwlpZiAoZW0tPmJsb2NrX3N0YXJ0IDwgRVhURU5UX01BUF9MQVNUX0JZVEUgJiYKKwkgICAgIXRlc3RfYml0KEVYVEVOVF9GTEFHX0NPTVBSRVNTRUQsICZlbS0+ZmxhZ3MpKSB7CisJCWVtLT5ibG9ja19zdGFydCArPSBzdGFydF9kaWZmOworCQllbS0+YmxvY2tfbGVuIC09IHN0YXJ0X2RpZmY7CisJfQorCXJldHVybiBhZGRfZXh0ZW50X21hcHBpbmcoZW1fdHJlZSwgZW0pOworfQorCitzdGF0aWMgbm9pbmxpbmUgaW50IHVuY29tcHJlc3NfaW5saW5lKHN0cnVjdCBidHJmc19wYXRoICpwYXRoLAorCQkJCSAgICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBwYWdlICpwYWdlLAorCQkJCSAgICAgIHNpemVfdCBwZ19vZmZzZXQsIHU2NCBleHRlbnRfb2Zmc2V0LAorCQkJCSAgICAgIHN0cnVjdCBidHJmc19maWxlX2V4dGVudF9pdGVtICppdGVtKQoreworCWludCByZXQ7CisJc3RydWN0IGV4dGVudF9idWZmZXIgKmxlYWYgPSBwYXRoLT5ub2Rlc1swXTsKKwljaGFyICp0bXA7CisJc2l6ZV90IG1heF9zaXplOworCXVuc2lnbmVkIGxvbmcgaW5saW5lX3NpemU7CisJdW5zaWduZWQgbG9uZyBwdHI7CisKKwlXQVJOX09OKHBnX29mZnNldCAhPSAwKTsKKwltYXhfc2l6ZSA9IGJ0cmZzX2ZpbGVfZXh0ZW50X3JhbV9ieXRlcyhsZWFmLCBpdGVtKTsKKwlpbmxpbmVfc2l6ZSA9IGJ0cmZzX2ZpbGVfZXh0ZW50X2lubGluZV9pdGVtX2xlbihsZWFmLAorCQkJCQlidHJmc19pdGVtX25yKGxlYWYsIHBhdGgtPnNsb3RzWzBdKSk7CisJdG1wID0ga21hbGxvYyhpbmxpbmVfc2l6ZSwgR0ZQX05PRlMpOworCXB0ciA9IGJ0cmZzX2ZpbGVfZXh0ZW50X2lubGluZV9zdGFydChpdGVtKTsKKworCXJlYWRfZXh0ZW50X2J1ZmZlcihsZWFmLCB0bXAsIHB0ciwgaW5saW5lX3NpemUpOworCisJbWF4X3NpemUgPSBtaW5fdCh1bnNpZ25lZCBsb25nLCBQQUdFX0NBQ0hFX1NJWkUsIG1heF9zaXplKTsKKwlyZXQgPSBidHJmc196bGliX2RlY29tcHJlc3ModG1wLCBwYWdlLCBleHRlbnRfb2Zmc2V0LAorCQkJCSAgICBpbmxpbmVfc2l6ZSwgbWF4X3NpemUpOworCWlmIChyZXQpIHsKKwkJY2hhciAqa2FkZHIgPSBrbWFwX2F0b21pYyhwYWdlLCBLTV9VU0VSMCk7CisJCXVuc2lnbmVkIGxvbmcgY29weV9zaXplID0gbWluX3QodTY0LAorCQkJCSAgUEFHRV9DQUNIRV9TSVpFIC0gcGdfb2Zmc2V0LAorCQkJCSAgbWF4X3NpemUgLSBleHRlbnRfb2Zmc2V0KTsKKwkJbWVtc2V0KGthZGRyICsgcGdfb2Zmc2V0LCAwLCBjb3B5X3NpemUpOworCQlrdW5tYXBfYXRvbWljKGthZGRyLCBLTV9VU0VSMCk7CisJfQorCWtmcmVlKHRtcCk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBhIGJpdCBzY2FyeSwgdGhpcyBkb2VzIGV4dGVudCBtYXBwaW5nIGZyb20gbG9naWNhbCBmaWxlIG9mZnNldCB0byB0aGUgZGlzay4KKyAqIHRoZSB1Z2x5IHBhcnRzIGNvbWUgZnJvbSBtZXJnaW5nIGV4dGVudHMgZnJvbSB0aGUgZGlzayB3aXRoIHRoZSBpbi1yYW0KKyAqIHJlcHJlc2VudGF0aW9uLiAgVGhpcyBnZXRzIG1vcmUgY29tcGxleCBiZWNhdXNlIG9mIHRoZSBkYXRhPW9yZGVyZWQgY29kZSwKKyAqIHdoZXJlIHRoZSBpbi1yYW0gZXh0ZW50cyBtaWdodCBiZSBsb2NrZWQgcGVuZGluZyBkYXRhPW9yZGVyZWQgY29tcGxldGlvbi4KKyAqCisgKiBUaGlzIGFsc28gY29waWVzIGlubGluZSBleHRlbnRzIGRpcmVjdGx5IGludG8gdGhlIHBhZ2UuCisgKi8KKworc3RydWN0IGV4dGVudF9tYXAgKmJ0cmZzX2dldF9leHRlbnQoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IHBhZ2UgKnBhZ2UsCisJCQkJICAgIHNpemVfdCBwZ19vZmZzZXQsIHU2NCBzdGFydCwgdTY0IGxlbiwKKwkJCQkgICAgaW50IGNyZWF0ZSkKK3sKKwlpbnQgcmV0OworCWludCBlcnIgPSAwOworCXU2NCBieXRlbnI7CisJdTY0IGV4dGVudF9zdGFydCA9IDA7CisJdTY0IGV4dGVudF9lbmQgPSAwOworCXU2NCBvYmplY3RpZCA9IGlub2RlLT5pX2lubzsKKwl1MzIgZm91bmRfdHlwZTsKKwlzdHJ1Y3QgYnRyZnNfcGF0aCAqcGF0aCA9IE5VTEw7CisJc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QgPSBCVFJGU19JKGlub2RlKS0+cm9vdDsKKwlzdHJ1Y3QgYnRyZnNfZmlsZV9leHRlbnRfaXRlbSAqaXRlbTsKKwlzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqbGVhZjsKKwlzdHJ1Y3QgYnRyZnNfa2V5IGZvdW5kX2tleTsKKwlzdHJ1Y3QgZXh0ZW50X21hcCAqZW0gPSBOVUxMOworCXN0cnVjdCBleHRlbnRfbWFwX3RyZWUgKmVtX3RyZWUgPSAmQlRSRlNfSShpbm9kZSktPmV4dGVudF90cmVlOworCXN0cnVjdCBleHRlbnRfaW9fdHJlZSAqaW9fdHJlZSA9ICZCVFJGU19JKGlub2RlKS0+aW9fdHJlZTsKKwlzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucyA9IE5VTEw7CisJaW50IGNvbXByZXNzZWQ7CisKK2FnYWluOgorCXNwaW5fbG9jaygmZW1fdHJlZS0+bG9jayk7CisJZW0gPSBsb29rdXBfZXh0ZW50X21hcHBpbmcoZW1fdHJlZSwgc3RhcnQsIGxlbik7CisJaWYgKGVtKQorCQllbS0+YmRldiA9IHJvb3QtPmZzX2luZm8tPmZzX2RldmljZXMtPmxhdGVzdF9iZGV2OworCXNwaW5fdW5sb2NrKCZlbV90cmVlLT5sb2NrKTsKKworCWlmIChlbSkgeworCQlpZiAoZW0tPnN0YXJ0ID4gc3RhcnQgfHwgZW0tPnN0YXJ0ICsgZW0tPmxlbiA8PSBzdGFydCkKKwkJCWZyZWVfZXh0ZW50X21hcChlbSk7CisJCWVsc2UgaWYgKGVtLT5ibG9ja19zdGFydCA9PSBFWFRFTlRfTUFQX0lOTElORSAmJiBwYWdlKQorCQkJZnJlZV9leHRlbnRfbWFwKGVtKTsKKwkJZWxzZQorCQkJZ290byBvdXQ7CisJfQorCWVtID0gYWxsb2NfZXh0ZW50X21hcChHRlBfTk9GUyk7CisJaWYgKCFlbSkgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIG91dDsKKwl9CisJZW0tPmJkZXYgPSByb290LT5mc19pbmZvLT5mc19kZXZpY2VzLT5sYXRlc3RfYmRldjsKKwllbS0+c3RhcnQgPSBFWFRFTlRfTUFQX0hPTEU7CisJZW0tPm9yaWdfc3RhcnQgPSBFWFRFTlRfTUFQX0hPTEU7CisJZW0tPmxlbiA9ICh1NjQpLTE7CisJZW0tPmJsb2NrX2xlbiA9ICh1NjQpLTE7CisKKwlpZiAoIXBhdGgpIHsKKwkJcGF0aCA9IGJ0cmZzX2FsbG9jX3BhdGgoKTsKKwkJQlVHX09OKCFwYXRoKTsKKwl9CisKKwlyZXQgPSBidHJmc19sb29rdXBfZmlsZV9leHRlbnQodHJhbnMsIHJvb3QsIHBhdGgsCisJCQkJICAgICAgIG9iamVjdGlkLCBzdGFydCwgdHJhbnMgIT0gTlVMTCk7CisJaWYgKHJldCA8IDApIHsKKwkJZXJyID0gcmV0OworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAocmV0ICE9IDApIHsKKwkJaWYgKHBhdGgtPnNsb3RzWzBdID09IDApCisJCQlnb3RvIG5vdF9mb3VuZDsKKwkJcGF0aC0+c2xvdHNbMF0tLTsKKwl9CisKKwlsZWFmID0gcGF0aC0+bm9kZXNbMF07CisJaXRlbSA9IGJ0cmZzX2l0ZW1fcHRyKGxlYWYsIHBhdGgtPnNsb3RzWzBdLAorCQkJICAgICAgc3RydWN0IGJ0cmZzX2ZpbGVfZXh0ZW50X2l0ZW0pOworCS8qIGFyZSB3ZSBpbnNpZGUgdGhlIGV4dGVudCB0aGF0IHdhcyBmb3VuZD8gKi8KKwlidHJmc19pdGVtX2tleV90b19jcHUobGVhZiwgJmZvdW5kX2tleSwgcGF0aC0+c2xvdHNbMF0pOworCWZvdW5kX3R5cGUgPSBidHJmc19rZXlfdHlwZSgmZm91bmRfa2V5KTsKKwlpZiAoZm91bmRfa2V5Lm9iamVjdGlkICE9IG9iamVjdGlkIHx8CisJICAgIGZvdW5kX3R5cGUgIT0gQlRSRlNfRVhURU5UX0RBVEFfS0VZKSB7CisJCWdvdG8gbm90X2ZvdW5kOworCX0KKworCWZvdW5kX3R5cGUgPSBidHJmc19maWxlX2V4dGVudF90eXBlKGxlYWYsIGl0ZW0pOworCWV4dGVudF9zdGFydCA9IGZvdW5kX2tleS5vZmZzZXQ7CisJY29tcHJlc3NlZCA9IGJ0cmZzX2ZpbGVfZXh0ZW50X2NvbXByZXNzaW9uKGxlYWYsIGl0ZW0pOworCWlmIChmb3VuZF90eXBlID09IEJUUkZTX0ZJTEVfRVhURU5UX1JFRyB8fAorCSAgICBmb3VuZF90eXBlID09IEJUUkZTX0ZJTEVfRVhURU5UX1BSRUFMTE9DKSB7CisJCWV4dGVudF9lbmQgPSBleHRlbnRfc3RhcnQgKworCQkgICAgICAgYnRyZnNfZmlsZV9leHRlbnRfbnVtX2J5dGVzKGxlYWYsIGl0ZW0pOworCX0gZWxzZSBpZiAoZm91bmRfdHlwZSA9PSBCVFJGU19GSUxFX0VYVEVOVF9JTkxJTkUpIHsKKwkJc2l6ZV90IHNpemU7CisJCXNpemUgPSBidHJmc19maWxlX2V4dGVudF9pbmxpbmVfbGVuKGxlYWYsIGl0ZW0pOworCQlleHRlbnRfZW5kID0gKGV4dGVudF9zdGFydCArIHNpemUgKyByb290LT5zZWN0b3JzaXplIC0gMSkgJgorCQkJfigodTY0KXJvb3QtPnNlY3RvcnNpemUgLSAxKTsKKwl9CisKKwlpZiAoc3RhcnQgPj0gZXh0ZW50X2VuZCkgeworCQlwYXRoLT5zbG90c1swXSsrOworCQlpZiAocGF0aC0+c2xvdHNbMF0gPj0gYnRyZnNfaGVhZGVyX25yaXRlbXMobGVhZikpIHsKKwkJCXJldCA9IGJ0cmZzX25leHRfbGVhZihyb290LCBwYXRoKTsKKwkJCWlmIChyZXQgPCAwKSB7CisJCQkJZXJyID0gcmV0OworCQkJCWdvdG8gb3V0OworCQkJfQorCQkJaWYgKHJldCA+IDApCisJCQkJZ290byBub3RfZm91bmQ7CisJCQlsZWFmID0gcGF0aC0+bm9kZXNbMF07CisJCX0KKwkJYnRyZnNfaXRlbV9rZXlfdG9fY3B1KGxlYWYsICZmb3VuZF9rZXksIHBhdGgtPnNsb3RzWzBdKTsKKwkJaWYgKGZvdW5kX2tleS5vYmplY3RpZCAhPSBvYmplY3RpZCB8fAorCQkgICAgZm91bmRfa2V5LnR5cGUgIT0gQlRSRlNfRVhURU5UX0RBVEFfS0VZKQorCQkJZ290byBub3RfZm91bmQ7CisJCWlmIChzdGFydCArIGxlbiA8PSBmb3VuZF9rZXkub2Zmc2V0KQorCQkJZ290byBub3RfZm91bmQ7CisJCWVtLT5zdGFydCA9IHN0YXJ0OworCQllbS0+bGVuID0gZm91bmRfa2V5Lm9mZnNldCAtIHN0YXJ0OworCQlnb3RvIG5vdF9mb3VuZF9lbTsKKwl9CisKKwlpZiAoZm91bmRfdHlwZSA9PSBCVFJGU19GSUxFX0VYVEVOVF9SRUcgfHwKKwkgICAgZm91bmRfdHlwZSA9PSBCVFJGU19GSUxFX0VYVEVOVF9QUkVBTExPQykgeworCQllbS0+c3RhcnQgPSBleHRlbnRfc3RhcnQ7CisJCWVtLT5sZW4gPSBleHRlbnRfZW5kIC0gZXh0ZW50X3N0YXJ0OworCQllbS0+b3JpZ19zdGFydCA9IGV4dGVudF9zdGFydCAtCisJCQkJIGJ0cmZzX2ZpbGVfZXh0ZW50X29mZnNldChsZWFmLCBpdGVtKTsKKwkJYnl0ZW5yID0gYnRyZnNfZmlsZV9leHRlbnRfZGlza19ieXRlbnIobGVhZiwgaXRlbSk7CisJCWlmIChieXRlbnIgPT0gMCkgeworCQkJZW0tPmJsb2NrX3N0YXJ0ID0gRVhURU5UX01BUF9IT0xFOworCQkJZ290byBpbnNlcnQ7CisJCX0KKwkJaWYgKGNvbXByZXNzZWQpIHsKKwkJCXNldF9iaXQoRVhURU5UX0ZMQUdfQ09NUFJFU1NFRCwgJmVtLT5mbGFncyk7CisJCQllbS0+YmxvY2tfc3RhcnQgPSBieXRlbnI7CisJCQllbS0+YmxvY2tfbGVuID0gYnRyZnNfZmlsZV9leHRlbnRfZGlza19udW1fYnl0ZXMobGVhZiwKKwkJCQkJCQkJCSBpdGVtKTsKKwkJfSBlbHNlIHsKKwkJCWJ5dGVuciArPSBidHJmc19maWxlX2V4dGVudF9vZmZzZXQobGVhZiwgaXRlbSk7CisJCQllbS0+YmxvY2tfc3RhcnQgPSBieXRlbnI7CisJCQllbS0+YmxvY2tfbGVuID0gZW0tPmxlbjsKKwkJCWlmIChmb3VuZF90eXBlID09IEJUUkZTX0ZJTEVfRVhURU5UX1BSRUFMTE9DKQorCQkJCXNldF9iaXQoRVhURU5UX0ZMQUdfUFJFQUxMT0MsICZlbS0+ZmxhZ3MpOworCQl9CisJCWdvdG8gaW5zZXJ0OworCX0gZWxzZSBpZiAoZm91bmRfdHlwZSA9PSBCVFJGU19GSUxFX0VYVEVOVF9JTkxJTkUpIHsKKwkJdW5zaWduZWQgbG9uZyBwdHI7CisJCWNoYXIgKm1hcDsKKwkJc2l6ZV90IHNpemU7CisJCXNpemVfdCBleHRlbnRfb2Zmc2V0OworCQlzaXplX3QgY29weV9zaXplOworCisJCWVtLT5ibG9ja19zdGFydCA9IEVYVEVOVF9NQVBfSU5MSU5FOworCQlpZiAoIXBhZ2UgfHwgY3JlYXRlKSB7CisJCQllbS0+c3RhcnQgPSBleHRlbnRfc3RhcnQ7CisJCQllbS0+bGVuID0gZXh0ZW50X2VuZCAtIGV4dGVudF9zdGFydDsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJc2l6ZSA9IGJ0cmZzX2ZpbGVfZXh0ZW50X2lubGluZV9sZW4obGVhZiwgaXRlbSk7CisJCWV4dGVudF9vZmZzZXQgPSBwYWdlX29mZnNldChwYWdlKSArIHBnX29mZnNldCAtIGV4dGVudF9zdGFydDsKKwkJY29weV9zaXplID0gbWluX3QodTY0LCBQQUdFX0NBQ0hFX1NJWkUgLSBwZ19vZmZzZXQsCisJCQkJc2l6ZSAtIGV4dGVudF9vZmZzZXQpOworCQllbS0+c3RhcnQgPSBleHRlbnRfc3RhcnQgKyBleHRlbnRfb2Zmc2V0OworCQllbS0+bGVuID0gKGNvcHlfc2l6ZSArIHJvb3QtPnNlY3RvcnNpemUgLSAxKSAmCisJCQl+KCh1NjQpcm9vdC0+c2VjdG9yc2l6ZSAtIDEpOworCQllbS0+b3JpZ19zdGFydCA9IEVYVEVOVF9NQVBfSU5MSU5FOworCQlpZiAoY29tcHJlc3NlZCkKKwkJCXNldF9iaXQoRVhURU5UX0ZMQUdfQ09NUFJFU1NFRCwgJmVtLT5mbGFncyk7CisJCXB0ciA9IGJ0cmZzX2ZpbGVfZXh0ZW50X2lubGluZV9zdGFydChpdGVtKSArIGV4dGVudF9vZmZzZXQ7CisJCWlmIChjcmVhdGUgPT0gMCAmJiAhUGFnZVVwdG9kYXRlKHBhZ2UpKSB7CisJCQlpZiAoYnRyZnNfZmlsZV9leHRlbnRfY29tcHJlc3Npb24obGVhZiwgaXRlbSkgPT0KKwkJCSAgICBCVFJGU19DT01QUkVTU19aTElCKSB7CisJCQkJcmV0ID0gdW5jb21wcmVzc19pbmxpbmUocGF0aCwgaW5vZGUsIHBhZ2UsCisJCQkJCQkJcGdfb2Zmc2V0LAorCQkJCQkJCWV4dGVudF9vZmZzZXQsIGl0ZW0pOworCQkJCUJVR19PTihyZXQpOworCQkJfSBlbHNlIHsKKwkJCQltYXAgPSBrbWFwKHBhZ2UpOworCQkJCXJlYWRfZXh0ZW50X2J1ZmZlcihsZWFmLCBtYXAgKyBwZ19vZmZzZXQsIHB0ciwKKwkJCQkJCSAgIGNvcHlfc2l6ZSk7CisJCQkJa3VubWFwKHBhZ2UpOworCQkJfQorCQkJZmx1c2hfZGNhY2hlX3BhZ2UocGFnZSk7CisJCX0gZWxzZSBpZiAoY3JlYXRlICYmIFBhZ2VVcHRvZGF0ZShwYWdlKSkgeworCQkJaWYgKCF0cmFucykgeworCQkJCWt1bm1hcChwYWdlKTsKKwkJCQlmcmVlX2V4dGVudF9tYXAoZW0pOworCQkJCWVtID0gTlVMTDsKKwkJCQlidHJmc19yZWxlYXNlX3BhdGgocm9vdCwgcGF0aCk7CisJCQkJdHJhbnMgPSBidHJmc19qb2luX3RyYW5zYWN0aW9uKHJvb3QsIDEpOworCQkJCWdvdG8gYWdhaW47CisJCQl9CisJCQltYXAgPSBrbWFwKHBhZ2UpOworCQkJd3JpdGVfZXh0ZW50X2J1ZmZlcihsZWFmLCBtYXAgKyBwZ19vZmZzZXQsIHB0ciwKKwkJCQkJICAgIGNvcHlfc2l6ZSk7CisJCQlrdW5tYXAocGFnZSk7CisJCQlidHJmc19tYXJrX2J1ZmZlcl9kaXJ0eShsZWFmKTsKKwkJfQorCQlzZXRfZXh0ZW50X3VwdG9kYXRlKGlvX3RyZWUsIGVtLT5zdGFydCwKKwkJCQkgICAgZXh0ZW50X21hcF9lbmQoZW0pIC0gMSwgR0ZQX05PRlMpOworCQlnb3RvIGluc2VydDsKKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9FUlIgImJ0cmZzIHVua25vd24gZm91bmRfdHlwZSAlZFxuIiwgZm91bmRfdHlwZSk7CisJCVdBUk5fT04oMSk7CisJfQorbm90X2ZvdW5kOgorCWVtLT5zdGFydCA9IHN0YXJ0OworCWVtLT5sZW4gPSBsZW47Citub3RfZm91bmRfZW06CisJZW0tPmJsb2NrX3N0YXJ0ID0gRVhURU5UX01BUF9IT0xFOworCXNldF9iaXQoRVhURU5UX0ZMQUdfVkFDQU5DWSwgJmVtLT5mbGFncyk7CitpbnNlcnQ6CisJYnRyZnNfcmVsZWFzZV9wYXRoKHJvb3QsIHBhdGgpOworCWlmIChlbS0+c3RhcnQgPiBzdGFydCB8fCBleHRlbnRfbWFwX2VuZChlbSkgPD0gc3RhcnQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJCdHJmczogYmFkIGV4dGVudCEgZW06IFslbGx1ICVsbHVdIHBhc3NlZCAiCisJCSAgICAgICAiWyVsbHUgJWxsdV1cbiIsICh1bnNpZ25lZCBsb25nIGxvbmcpZW0tPnN0YXJ0LAorCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyllbS0+bGVuLAorCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylzdGFydCwKKwkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpbGVuKTsKKwkJZXJyID0gLUVJTzsKKwkJZ290byBvdXQ7CisJfQorCisJZXJyID0gMDsKKwlzcGluX2xvY2soJmVtX3RyZWUtPmxvY2spOworCXJldCA9IGFkZF9leHRlbnRfbWFwcGluZyhlbV90cmVlLCBlbSk7CisJLyogaXQgaXMgcG9zc2libGUgdGhhdCBzb21lb25lIGluc2VydGVkIHRoZSBleHRlbnQgaW50byB0aGUgdHJlZQorCSAqIHdoaWxlIHdlIGhhZCB0aGUgbG9jayBkcm9wcGVkLiAgSXQgaXMgYWxzbyBwb3NzaWJsZSB0aGF0CisJICogYW4gb3ZlcmxhcHBpbmcgbWFwIGV4aXN0cyBpbiB0aGUgdHJlZQorCSAqLworCWlmIChyZXQgPT0gLUVFWElTVCkgeworCQlzdHJ1Y3QgZXh0ZW50X21hcCAqZXhpc3Rpbmc7CisKKwkJcmV0ID0gMDsKKworCQlleGlzdGluZyA9IGxvb2t1cF9leHRlbnRfbWFwcGluZyhlbV90cmVlLCBzdGFydCwgbGVuKTsKKwkJaWYgKGV4aXN0aW5nICYmIChleGlzdGluZy0+c3RhcnQgPiBzdGFydCB8fAorCQkgICAgZXhpc3RpbmctPnN0YXJ0ICsgZXhpc3RpbmctPmxlbiA8PSBzdGFydCkpIHsKKwkJCWZyZWVfZXh0ZW50X21hcChleGlzdGluZyk7CisJCQlleGlzdGluZyA9IE5VTEw7CisJCX0KKwkJaWYgKCFleGlzdGluZykgeworCQkJZXhpc3RpbmcgPSBsb29rdXBfZXh0ZW50X21hcHBpbmcoZW1fdHJlZSwgZW0tPnN0YXJ0LAorCQkJCQkJCSBlbS0+bGVuKTsKKwkJCWlmIChleGlzdGluZykgeworCQkJCWVyciA9IG1lcmdlX2V4dGVudF9tYXBwaW5nKGVtX3RyZWUsIGV4aXN0aW5nLAorCQkJCQkJCSAgIGVtLCBzdGFydCwKKwkJCQkJCQkgICByb290LT5zZWN0b3JzaXplKTsKKwkJCQlmcmVlX2V4dGVudF9tYXAoZXhpc3RpbmcpOworCQkJCWlmIChlcnIpIHsKKwkJCQkJZnJlZV9leHRlbnRfbWFwKGVtKTsKKwkJCQkJZW0gPSBOVUxMOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJZXJyID0gLUVJTzsKKwkJCQlmcmVlX2V4dGVudF9tYXAoZW0pOworCQkJCWVtID0gTlVMTDsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWZyZWVfZXh0ZW50X21hcChlbSk7CisJCQllbSA9IGV4aXN0aW5nOworCQkJZXJyID0gMDsKKwkJfQorCX0KKwlzcGluX3VubG9jaygmZW1fdHJlZS0+bG9jayk7CitvdXQ6CisJaWYgKHBhdGgpCisJCWJ0cmZzX2ZyZWVfcGF0aChwYXRoKTsKKwlpZiAodHJhbnMpIHsKKwkJcmV0ID0gYnRyZnNfZW5kX3RyYW5zYWN0aW9uKHRyYW5zLCByb290KTsKKwkJaWYgKCFlcnIpCisJCQllcnIgPSByZXQ7CisJfQorCWlmIChlcnIpIHsKKwkJZnJlZV9leHRlbnRfbWFwKGVtKTsKKwkJV0FSTl9PTigxKTsKKwkJcmV0dXJuIEVSUl9QVFIoZXJyKTsKKwl9CisJcmV0dXJuIGVtOworfQorCitzdGF0aWMgc3NpemVfdCBidHJmc19kaXJlY3RfSU8oaW50IHJ3LCBzdHJ1Y3Qga2lvY2IgKmlvY2IsCisJCQljb25zdCBzdHJ1Y3QgaW92ZWMgKmlvdiwgbG9mZl90IG9mZnNldCwKKwkJCXVuc2lnbmVkIGxvbmcgbnJfc2VncykKK3sKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIHNlY3Rvcl90IGJ0cmZzX2JtYXAoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsIHNlY3Rvcl90IGlibG9jaykKK3sKKwlyZXR1cm4gZXh0ZW50X2JtYXAobWFwcGluZywgaWJsb2NrLCBidHJmc19nZXRfZXh0ZW50KTsKK30KKworaW50IGJ0cmZzX3JlYWRwYWdlKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwlzdHJ1Y3QgZXh0ZW50X2lvX3RyZWUgKnRyZWU7CisJdHJlZSA9ICZCVFJGU19JKHBhZ2UtPm1hcHBpbmctPmhvc3QpLT5pb190cmVlOworCXJldHVybiBleHRlbnRfcmVhZF9mdWxsX3BhZ2UodHJlZSwgcGFnZSwgYnRyZnNfZ2V0X2V4dGVudCk7Cit9CisKK3N0YXRpYyBpbnQgYnRyZnNfd3JpdGVwYWdlKHN0cnVjdCBwYWdlICpwYWdlLCBzdHJ1Y3Qgd3JpdGViYWNrX2NvbnRyb2wgKndiYykKK3sKKwlzdHJ1Y3QgZXh0ZW50X2lvX3RyZWUgKnRyZWU7CisKKworCWlmIChjdXJyZW50LT5mbGFncyAmIFBGX01FTUFMTE9DKSB7CisJCXJlZGlydHlfcGFnZV9mb3Jfd3JpdGVwYWdlKHdiYywgcGFnZSk7CisJCXVubG9ja19wYWdlKHBhZ2UpOworCQlyZXR1cm4gMDsKKwl9CisJdHJlZSA9ICZCVFJGU19JKHBhZ2UtPm1hcHBpbmctPmhvc3QpLT5pb190cmVlOworCXJldHVybiBleHRlbnRfd3JpdGVfZnVsbF9wYWdlKHRyZWUsIHBhZ2UsIGJ0cmZzX2dldF9leHRlbnQsIHdiYyk7Cit9CisKK2ludCBidHJmc193cml0ZXBhZ2VzKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLAorCQkgICAgIHN0cnVjdCB3cml0ZWJhY2tfY29udHJvbCAqd2JjKQoreworCXN0cnVjdCBleHRlbnRfaW9fdHJlZSAqdHJlZTsKKworCXRyZWUgPSAmQlRSRlNfSShtYXBwaW5nLT5ob3N0KS0+aW9fdHJlZTsKKwlyZXR1cm4gZXh0ZW50X3dyaXRlcGFnZXModHJlZSwgbWFwcGluZywgYnRyZnNfZ2V0X2V4dGVudCwgd2JjKTsKK30KKworc3RhdGljIGludAorYnRyZnNfcmVhZHBhZ2VzKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywKKwkJc3RydWN0IGxpc3RfaGVhZCAqcGFnZXMsIHVuc2lnbmVkIG5yX3BhZ2VzKQoreworCXN0cnVjdCBleHRlbnRfaW9fdHJlZSAqdHJlZTsKKwl0cmVlID0gJkJUUkZTX0kobWFwcGluZy0+aG9zdCktPmlvX3RyZWU7CisJcmV0dXJuIGV4dGVudF9yZWFkcGFnZXModHJlZSwgbWFwcGluZywgcGFnZXMsIG5yX3BhZ2VzLAorCQkJCWJ0cmZzX2dldF9leHRlbnQpOworfQorc3RhdGljIGludCBfX2J0cmZzX3JlbGVhc2VwYWdlKHN0cnVjdCBwYWdlICpwYWdlLCBnZnBfdCBnZnBfZmxhZ3MpCit7CisJc3RydWN0IGV4dGVudF9pb190cmVlICp0cmVlOworCXN0cnVjdCBleHRlbnRfbWFwX3RyZWUgKm1hcDsKKwlpbnQgcmV0OworCisJdHJlZSA9ICZCVFJGU19JKHBhZ2UtPm1hcHBpbmctPmhvc3QpLT5pb190cmVlOworCW1hcCA9ICZCVFJGU19JKHBhZ2UtPm1hcHBpbmctPmhvc3QpLT5leHRlbnRfdHJlZTsKKwlyZXQgPSB0cnlfcmVsZWFzZV9leHRlbnRfbWFwcGluZyhtYXAsIHRyZWUsIHBhZ2UsIGdmcF9mbGFncyk7CisJaWYgKHJldCA9PSAxKSB7CisJCUNsZWFyUGFnZVByaXZhdGUocGFnZSk7CisJCXNldF9wYWdlX3ByaXZhdGUocGFnZSwgMCk7CisJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBidHJmc19yZWxlYXNlcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSwgZ2ZwX3QgZ2ZwX2ZsYWdzKQoreworCWlmIChQYWdlV3JpdGViYWNrKHBhZ2UpIHx8IFBhZ2VEaXJ0eShwYWdlKSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIF9fYnRyZnNfcmVsZWFzZXBhZ2UocGFnZSwgZ2ZwX2ZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgYnRyZnNfaW52YWxpZGF0ZXBhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0KQoreworCXN0cnVjdCBleHRlbnRfaW9fdHJlZSAqdHJlZTsKKwlzdHJ1Y3QgYnRyZnNfb3JkZXJlZF9leHRlbnQgKm9yZGVyZWQ7CisJdTY0IHBhZ2Vfc3RhcnQgPSBwYWdlX29mZnNldChwYWdlKTsKKwl1NjQgcGFnZV9lbmQgPSBwYWdlX3N0YXJ0ICsgUEFHRV9DQUNIRV9TSVpFIC0gMTsKKworCXdhaXRfb25fcGFnZV93cml0ZWJhY2socGFnZSk7CisJdHJlZSA9ICZCVFJGU19JKHBhZ2UtPm1hcHBpbmctPmhvc3QpLT5pb190cmVlOworCWlmIChvZmZzZXQpIHsKKwkJYnRyZnNfcmVsZWFzZXBhZ2UocGFnZSwgR0ZQX05PRlMpOworCQlyZXR1cm47CisJfQorCisJbG9ja19leHRlbnQodHJlZSwgcGFnZV9zdGFydCwgcGFnZV9lbmQsIEdGUF9OT0ZTKTsKKwlvcmRlcmVkID0gYnRyZnNfbG9va3VwX29yZGVyZWRfZXh0ZW50KHBhZ2UtPm1hcHBpbmctPmhvc3QsCisJCQkJCSAgIHBhZ2Vfb2Zmc2V0KHBhZ2UpKTsKKwlpZiAob3JkZXJlZCkgeworCQkvKgorCQkgKiBJTyBvbiB0aGlzIHBhZ2Ugd2lsbCBuZXZlciBiZSBzdGFydGVkLCBzbyB3ZSBuZWVkCisJCSAqIHRvIGFjY291bnQgZm9yIGFueSBvcmRlcmVkIGV4dGVudHMgbm93CisJCSAqLworCQljbGVhcl9leHRlbnRfYml0KHRyZWUsIHBhZ2Vfc3RhcnQsIHBhZ2VfZW5kLAorCQkJCSBFWFRFTlRfRElSVFkgfCBFWFRFTlRfREVMQUxMT0MgfAorCQkJCSBFWFRFTlRfTE9DS0VELCAxLCAwLCBHRlBfTk9GUyk7CisJCWJ0cmZzX2ZpbmlzaF9vcmRlcmVkX2lvKHBhZ2UtPm1hcHBpbmctPmhvc3QsCisJCQkJCXBhZ2Vfc3RhcnQsIHBhZ2VfZW5kKTsKKwkJYnRyZnNfcHV0X29yZGVyZWRfZXh0ZW50KG9yZGVyZWQpOworCQlsb2NrX2V4dGVudCh0cmVlLCBwYWdlX3N0YXJ0LCBwYWdlX2VuZCwgR0ZQX05PRlMpOworCX0KKwljbGVhcl9leHRlbnRfYml0KHRyZWUsIHBhZ2Vfc3RhcnQsIHBhZ2VfZW5kLAorCQkgRVhURU5UX0xPQ0tFRCB8IEVYVEVOVF9ESVJUWSB8IEVYVEVOVF9ERUxBTExPQyB8CisJCSBFWFRFTlRfT1JERVJFRCwKKwkJIDEsIDEsIEdGUF9OT0ZTKTsKKwlfX2J0cmZzX3JlbGVhc2VwYWdlKHBhZ2UsIEdGUF9OT0ZTKTsKKworCUNsZWFyUGFnZUNoZWNrZWQocGFnZSk7CisJaWYgKFBhZ2VQcml2YXRlKHBhZ2UpKSB7CisJCUNsZWFyUGFnZVByaXZhdGUocGFnZSk7CisJCXNldF9wYWdlX3ByaXZhdGUocGFnZSwgMCk7CisJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKKwl9Cit9CisKKy8qCisgKiBidHJmc19wYWdlX21rd3JpdGUoKSBpcyBub3QgYWxsb3dlZCB0byBjaGFuZ2UgdGhlIGZpbGUgc2l6ZSBhcyBpdCBnZXRzCisgKiBjYWxsZWQgZnJvbSBhIHBhZ2UgZmF1bHQgaGFuZGxlciB3aGVuIGEgcGFnZSBpcyBmaXJzdCBkaXJ0aWVkLiBIZW5jZSB3ZSBtdXN0CisgKiBiZSBjYXJlZnVsIHRvIGNoZWNrIGZvciBFT0YgY29uZGl0aW9ucyBoZXJlLiBXZSBzZXQgdGhlIHBhZ2UgdXAgY29ycmVjdGx5CisgKiBmb3IgYSB3cml0dGVuIHBhZ2Ugd2hpY2ggbWVhbnMgd2UgZ2V0IEVOT1NQQyBjaGVja2luZyB3aGVuIHdyaXRpbmcgaW50bworICogaG9sZXMgYW5kIGNvcnJlY3QgZGVsYWxsb2MgYW5kIHVud3JpdHRlbiBleHRlbnQgbWFwcGluZyBvbiBmaWxlc3lzdGVtcyB0aGF0CisgKiBzdXBwb3J0IHRoZXNlIGZlYXR1cmVzLgorICoKKyAqIFdlIGFyZSBub3QgYWxsb3dlZCB0byB0YWtlIHRoZSBpX211dGV4IGhlcmUgc28gd2UgaGF2ZSB0byBwbGF5IGdhbWVzIHRvCisgKiBwcm90ZWN0IGFnYWluc3QgdHJ1bmNhdGUgcmFjZXMgYXMgdGhlIHBhZ2UgY291bGQgbm93IGJlIGJleW9uZCBFT0YuICBCZWNhdXNlCisgKiB2bXRydW5jYXRlKCkgd3JpdGVzIHRoZSBpbm9kZSBzaXplIGJlZm9yZSByZW1vdmluZyBwYWdlcywgb25jZSB3ZSBoYXZlIHRoZQorICogcGFnZSBsb2NrIHdlIGNhbiBkZXRlcm1pbmUgc2FmZWx5IGlmIHRoZSBwYWdlIGlzIGJleW9uZCBFT0YuIElmIGl0IGlzIG5vdAorICogYmV5b25kIEVPRiwgdGhlbiB0aGUgcGFnZSBpcyBndWFyYW50ZWVkIHNhZmUgYWdhaW5zdCB0cnVuY2F0aW9uIHVudGlsIHdlCisgKiB1bmxvY2sgdGhlIHBhZ2UuCisgKi8KK2ludCBidHJmc19wYWdlX21rd3JpdGUoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHN0cnVjdCBwYWdlICpwYWdlKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmZGVudHJ5KHZtYS0+dm1fZmlsZSktPmRfaW5vZGU7CisJc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QgPSBCVFJGU19JKGlub2RlKS0+cm9vdDsKKwlzdHJ1Y3QgZXh0ZW50X2lvX3RyZWUgKmlvX3RyZWUgPSAmQlRSRlNfSShpbm9kZSktPmlvX3RyZWU7CisJc3RydWN0IGJ0cmZzX29yZGVyZWRfZXh0ZW50ICpvcmRlcmVkOworCWNoYXIgKmthZGRyOworCXVuc2lnbmVkIGxvbmcgemVyb19zdGFydDsKKwlsb2ZmX3Qgc2l6ZTsKKwlpbnQgcmV0OworCXU2NCBwYWdlX3N0YXJ0OworCXU2NCBwYWdlX2VuZDsKKworCXJldCA9IGJ0cmZzX2NoZWNrX2ZyZWVfc3BhY2Uocm9vdCwgUEFHRV9DQUNIRV9TSVpFLCAwKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKworCXJldCA9IC1FSU5WQUw7CithZ2FpbjoKKwlsb2NrX3BhZ2UocGFnZSk7CisJc2l6ZSA9IGlfc2l6ZV9yZWFkKGlub2RlKTsKKwlwYWdlX3N0YXJ0ID0gcGFnZV9vZmZzZXQocGFnZSk7CisJcGFnZV9lbmQgPSBwYWdlX3N0YXJ0ICsgUEFHRV9DQUNIRV9TSVpFIC0gMTsKKworCWlmICgocGFnZS0+bWFwcGluZyAhPSBpbm9kZS0+aV9tYXBwaW5nKSB8fAorCSAgICAocGFnZV9zdGFydCA+PSBzaXplKSkgeworCQkvKiBwYWdlIGdvdCB0cnVuY2F0ZWQgb3V0IGZyb20gdW5kZXJuZWF0aCB1cyAqLworCQlnb3RvIG91dF91bmxvY2s7CisJfQorCXdhaXRfb25fcGFnZV93cml0ZWJhY2socGFnZSk7CisKKwlsb2NrX2V4dGVudChpb190cmVlLCBwYWdlX3N0YXJ0LCBwYWdlX2VuZCwgR0ZQX05PRlMpOworCXNldF9wYWdlX2V4dGVudF9tYXBwZWQocGFnZSk7CisKKwkvKgorCSAqIHdlIGNhbid0IHNldCB0aGUgZGVsYWxsb2MgYml0cyBpZiB0aGVyZSBhcmUgcGVuZGluZyBvcmRlcmVkCisJICogZXh0ZW50cy4gIERyb3Agb3VyIGxvY2tzIGFuZCB3YWl0IGZvciB0aGVtIHRvIGZpbmlzaAorCSAqLworCW9yZGVyZWQgPSBidHJmc19sb29rdXBfb3JkZXJlZF9leHRlbnQoaW5vZGUsIHBhZ2Vfc3RhcnQpOworCWlmIChvcmRlcmVkKSB7CisJCXVubG9ja19leHRlbnQoaW9fdHJlZSwgcGFnZV9zdGFydCwgcGFnZV9lbmQsIEdGUF9OT0ZTKTsKKwkJdW5sb2NrX3BhZ2UocGFnZSk7CisJCWJ0cmZzX3N0YXJ0X29yZGVyZWRfZXh0ZW50KGlub2RlLCBvcmRlcmVkLCAxKTsKKwkJYnRyZnNfcHV0X29yZGVyZWRfZXh0ZW50KG9yZGVyZWQpOworCQlnb3RvIGFnYWluOworCX0KKworCWJ0cmZzX3NldF9leHRlbnRfZGVsYWxsb2MoaW5vZGUsIHBhZ2Vfc3RhcnQsIHBhZ2VfZW5kKTsKKwlyZXQgPSAwOworCisJLyogcGFnZSBpcyB3aG9sbHkgb3IgcGFydGlhbGx5IGluc2lkZSBFT0YgKi8KKwlpZiAocGFnZV9zdGFydCArIFBBR0VfQ0FDSEVfU0laRSA+IHNpemUpCisJCXplcm9fc3RhcnQgPSBzaXplICYgflBBR0VfQ0FDSEVfTUFTSzsKKwllbHNlCisJCXplcm9fc3RhcnQgPSBQQUdFX0NBQ0hFX1NJWkU7CisKKwlpZiAoemVyb19zdGFydCAhPSBQQUdFX0NBQ0hFX1NJWkUpIHsKKwkJa2FkZHIgPSBrbWFwKHBhZ2UpOworCQltZW1zZXQoa2FkZHIgKyB6ZXJvX3N0YXJ0LCAwLCBQQUdFX0NBQ0hFX1NJWkUgLSB6ZXJvX3N0YXJ0KTsKKwkJZmx1c2hfZGNhY2hlX3BhZ2UocGFnZSk7CisJCWt1bm1hcChwYWdlKTsKKwl9CisJQ2xlYXJQYWdlQ2hlY2tlZChwYWdlKTsKKwlzZXRfcGFnZV9kaXJ0eShwYWdlKTsKKwl1bmxvY2tfZXh0ZW50KGlvX3RyZWUsIHBhZ2Vfc3RhcnQsIHBhZ2VfZW5kLCBHRlBfTk9GUyk7CisKK291dF91bmxvY2s6CisJdW5sb2NrX3BhZ2UocGFnZSk7CitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgYnRyZnNfdHJ1bmNhdGUoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCA9IEJUUkZTX0koaW5vZGUpLT5yb290OworCWludCByZXQ7CisJc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnM7CisJdW5zaWduZWQgbG9uZyBucjsKKwl1NjQgbWFzayA9IHJvb3QtPnNlY3RvcnNpemUgLSAxOworCisJaWYgKCFTX0lTUkVHKGlub2RlLT5pX21vZGUpKQorCQlyZXR1cm47CisJaWYgKElTX0FQUEVORChpbm9kZSkgfHwgSVNfSU1NVVRBQkxFKGlub2RlKSkKKwkJcmV0dXJuOworCisJYnRyZnNfdHJ1bmNhdGVfcGFnZShpbm9kZS0+aV9tYXBwaW5nLCBpbm9kZS0+aV9zaXplKTsKKwlidHJmc193YWl0X29yZGVyZWRfcmFuZ2UoaW5vZGUsIGlub2RlLT5pX3NpemUgJiAofm1hc2spLCAodTY0KS0xKTsKKworCXRyYW5zID0gYnRyZnNfc3RhcnRfdHJhbnNhY3Rpb24ocm9vdCwgMSk7CisJYnRyZnNfc2V0X3RyYW5zX2Jsb2NrX2dyb3VwKHRyYW5zLCBpbm9kZSk7CisJYnRyZnNfaV9zaXplX3dyaXRlKGlub2RlLCBpbm9kZS0+aV9zaXplKTsKKworCXJldCA9IGJ0cmZzX29ycGhhbl9hZGQodHJhbnMsIGlub2RlKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKwkvKiBGSVhNRSwgYWRkIHJlZG8gbGluayB0byB0cmVlIHNvIHdlIGRvbid0IGxlYWsgb24gY3Jhc2ggKi8KKwlyZXQgPSBidHJmc190cnVuY2F0ZV9pbm9kZV9pdGVtcyh0cmFucywgcm9vdCwgaW5vZGUsIGlub2RlLT5pX3NpemUsCisJCQkJICAgICAgQlRSRlNfRVhURU5UX0RBVEFfS0VZKTsKKwlidHJmc191cGRhdGVfaW5vZGUodHJhbnMsIHJvb3QsIGlub2RlKTsKKworCXJldCA9IGJ0cmZzX29ycGhhbl9kZWwodHJhbnMsIGlub2RlKTsKKwlCVUdfT04ocmV0KTsKKworb3V0OgorCW5yID0gdHJhbnMtPmJsb2Nrc191c2VkOworCXJldCA9IGJ0cmZzX2VuZF90cmFuc2FjdGlvbl90aHJvdHRsZSh0cmFucywgcm9vdCk7CisJQlVHX09OKHJldCk7CisJYnRyZnNfYnRyZWVfYmFsYW5jZV9kaXJ0eShyb290LCBucik7Cit9CisKKy8qCisgKiBjcmVhdGUgYSBuZXcgc3Vidm9sdW1lIGRpcmVjdG9yeS9pbm9kZSAoaGVscGVyIGZvciB0aGUgaW9jdGwpLgorICovCitpbnQgYnRyZnNfY3JlYXRlX3N1YnZvbF9yb290KHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAorCQkJICAgICBzdHJ1Y3QgYnRyZnNfcm9vdCAqbmV3X3Jvb3QsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwKKwkJCSAgICAgdTY0IG5ld19kaXJpZCwgdTY0IGFsbG9jX2hpbnQpCit7CisJc3RydWN0IGlub2RlICppbm9kZTsKKwlpbnQgZXJyb3I7CisJdTY0IGluZGV4ID0gMDsKKworCWlub2RlID0gYnRyZnNfbmV3X2lub2RlKHRyYW5zLCBuZXdfcm9vdCwgTlVMTCwgIi4uIiwgMiwgbmV3X2RpcmlkLAorCQkJCW5ld19kaXJpZCwgYWxsb2NfaGludCwgU19JRkRJUiB8IDA3MDAsICZpbmRleCk7CisJaWYgKElTX0VSUihpbm9kZSkpCisJCXJldHVybiBQVFJfRVJSKGlub2RlKTsKKwlpbm9kZS0+aV9vcCA9ICZidHJmc19kaXJfaW5vZGVfb3BlcmF0aW9uczsKKwlpbm9kZS0+aV9mb3AgPSAmYnRyZnNfZGlyX2ZpbGVfb3BlcmF0aW9uczsKKworCWlub2RlLT5pX25saW5rID0gMTsKKwlidHJmc19pX3NpemVfd3JpdGUoaW5vZGUsIDApOworCisJZXJyb3IgPSBidHJmc191cGRhdGVfaW5vZGUodHJhbnMsIG5ld19yb290LCBpbm9kZSk7CisJaWYgKGVycm9yKQorCQlyZXR1cm4gZXJyb3I7CisKKwlkX2luc3RhbnRpYXRlKGRlbnRyeSwgaW5vZGUpOworCXJldHVybiAwOworfQorCisvKiBoZWxwZXIgZnVuY3Rpb24gZm9yIGZpbGUgZGVmcmFnIGFuZCBzcGFjZSBiYWxhbmNpbmcuICBUaGlzCisgKiBmb3JjZXMgcmVhZGFoZWFkIG9uIGEgZ2l2ZW4gcmFuZ2Ugb2YgYnl0ZXMgaW4gYW4gaW5vZGUKKyAqLwordW5zaWduZWQgbG9uZyBidHJmc19mb3JjZV9yYShzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywKKwkJCSAgICAgIHN0cnVjdCBmaWxlX3JhX3N0YXRlICpyYSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCQkgICAgICBwZ29mZl90IG9mZnNldCwgcGdvZmZfdCBsYXN0X2luZGV4KQoreworCXBnb2ZmX3QgcmVxX3NpemUgPSBsYXN0X2luZGV4IC0gb2Zmc2V0ICsgMTsKKworCXBhZ2VfY2FjaGVfc3luY19yZWFkYWhlYWQobWFwcGluZywgcmEsIGZpbGUsIG9mZnNldCwgcmVxX3NpemUpOworCXJldHVybiBvZmZzZXQgKyByZXFfc2l6ZTsKK30KKworc3RydWN0IGlub2RlICpidHJmc19hbGxvY19pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCXN0cnVjdCBidHJmc19pbm9kZSAqZWk7CisKKwllaSA9IGttZW1fY2FjaGVfYWxsb2MoYnRyZnNfaW5vZGVfY2FjaGVwLCBHRlBfTk9GUyk7CisJaWYgKCFlaSkKKwkJcmV0dXJuIE5VTEw7CisJZWktPmxhc3RfdHJhbnMgPSAwOworCWVpLT5sb2dnZWRfdHJhbnMgPSAwOworCWJ0cmZzX29yZGVyZWRfaW5vZGVfdHJlZV9pbml0KCZlaS0+b3JkZXJlZF90cmVlKTsKKwllaS0+aV9hY2wgPSBCVFJGU19BQ0xfTk9UX0NBQ0hFRDsKKwllaS0+aV9kZWZhdWx0X2FjbCA9IEJUUkZTX0FDTF9OT1RfQ0FDSEVEOworCUlOSVRfTElTVF9IRUFEKCZlaS0+aV9vcnBoYW4pOworCXJldHVybiAmZWktPnZmc19pbm9kZTsKK30KKwordm9pZCBidHJmc19kZXN0cm95X2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJc3RydWN0IGJ0cmZzX29yZGVyZWRfZXh0ZW50ICpvcmRlcmVkOworCVdBUk5fT04oIWxpc3RfZW1wdHkoJmlub2RlLT5pX2RlbnRyeSkpOworCVdBUk5fT04oaW5vZGUtPmlfZGF0YS5ucnBhZ2VzKTsKKworCWlmIChCVFJGU19JKGlub2RlKS0+aV9hY2wgJiYKKwkgICAgQlRSRlNfSShpbm9kZSktPmlfYWNsICE9IEJUUkZTX0FDTF9OT1RfQ0FDSEVEKQorCQlwb3NpeF9hY2xfcmVsZWFzZShCVFJGU19JKGlub2RlKS0+aV9hY2wpOworCWlmIChCVFJGU19JKGlub2RlKS0+aV9kZWZhdWx0X2FjbCAmJgorCSAgICBCVFJGU19JKGlub2RlKS0+aV9kZWZhdWx0X2FjbCAhPSBCVFJGU19BQ0xfTk9UX0NBQ0hFRCkKKwkJcG9zaXhfYWNsX3JlbGVhc2UoQlRSRlNfSShpbm9kZSktPmlfZGVmYXVsdF9hY2wpOworCisJc3Bpbl9sb2NrKCZCVFJGU19JKGlub2RlKS0+cm9vdC0+bGlzdF9sb2NrKTsKKwlpZiAoIWxpc3RfZW1wdHkoJkJUUkZTX0koaW5vZGUpLT5pX29ycGhhbikpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJCVFJGUzogaW5vZGUgJWx1OiBpbm9kZSBzdGlsbCBvbiB0aGUgb3JwaGFuIgorCQkgICAgICAgIiBsaXN0XG4iLCBpbm9kZS0+aV9pbm8pOworCQlkdW1wX3N0YWNrKCk7CisJfQorCXNwaW5fdW5sb2NrKCZCVFJGU19JKGlub2RlKS0+cm9vdC0+bGlzdF9sb2NrKTsKKworCXdoaWxlICgxKSB7CisJCW9yZGVyZWQgPSBidHJmc19sb29rdXBfZmlyc3Rfb3JkZXJlZF9leHRlbnQoaW5vZGUsICh1NjQpLTEpOworCQlpZiAoIW9yZGVyZWQpCisJCQlicmVhazsKKwkJZWxzZSB7CisJCQlwcmludGsoS0VSTl9FUlIgImJ0cmZzIGZvdW5kIG9yZGVyZWQgIgorCQkJICAgICAgICJleHRlbnQgJWxsdSAlbGx1IG9uIGlub2RlIGNsZWFudXBcbiIsCisJCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylvcmRlcmVkLT5maWxlX29mZnNldCwKKwkJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKW9yZGVyZWQtPmxlbik7CisJCQlidHJmc19yZW1vdmVfb3JkZXJlZF9leHRlbnQoaW5vZGUsIG9yZGVyZWQpOworCQkJYnRyZnNfcHV0X29yZGVyZWRfZXh0ZW50KG9yZGVyZWQpOworCQkJYnRyZnNfcHV0X29yZGVyZWRfZXh0ZW50KG9yZGVyZWQpOworCQl9CisJfQorCWJ0cmZzX2Ryb3BfZXh0ZW50X2NhY2hlKGlub2RlLCAwLCAodTY0KS0xLCAwKTsKKwlrbWVtX2NhY2hlX2ZyZWUoYnRyZnNfaW5vZGVfY2FjaGVwLCBCVFJGU19JKGlub2RlKSk7Cit9CisKK3N0YXRpYyB2b2lkIGluaXRfb25jZSh2b2lkICpmb28pCit7CisJc3RydWN0IGJ0cmZzX2lub2RlICplaSA9IChzdHJ1Y3QgYnRyZnNfaW5vZGUgKikgZm9vOworCisJaW5vZGVfaW5pdF9vbmNlKCZlaS0+dmZzX2lub2RlKTsKK30KKwordm9pZCBidHJmc19kZXN0cm95X2NhY2hlcCh2b2lkKQoreworCWlmIChidHJmc19pbm9kZV9jYWNoZXApCisJCWttZW1fY2FjaGVfZGVzdHJveShidHJmc19pbm9kZV9jYWNoZXApOworCWlmIChidHJmc190cmFuc19oYW5kbGVfY2FjaGVwKQorCQlrbWVtX2NhY2hlX2Rlc3Ryb3koYnRyZnNfdHJhbnNfaGFuZGxlX2NhY2hlcCk7CisJaWYgKGJ0cmZzX3RyYW5zYWN0aW9uX2NhY2hlcCkKKwkJa21lbV9jYWNoZV9kZXN0cm95KGJ0cmZzX3RyYW5zYWN0aW9uX2NhY2hlcCk7CisJaWYgKGJ0cmZzX2JpdF9yYWRpeF9jYWNoZXApCisJCWttZW1fY2FjaGVfZGVzdHJveShidHJmc19iaXRfcmFkaXhfY2FjaGVwKTsKKwlpZiAoYnRyZnNfcGF0aF9jYWNoZXApCisJCWttZW1fY2FjaGVfZGVzdHJveShidHJmc19wYXRoX2NhY2hlcCk7Cit9CisKK3N0cnVjdCBrbWVtX2NhY2hlICpidHJmc19jYWNoZV9jcmVhdGUoY29uc3QgY2hhciAqbmFtZSwgc2l6ZV90IHNpemUsCisJCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgZXh0cmFfZmxhZ3MsCisJCQkJICAgICAgIHZvaWQgKCpjdG9yKSh2b2lkICopKQoreworCXJldHVybiBrbWVtX2NhY2hlX2NyZWF0ZShuYW1lLCBzaXplLCAwLCAoU0xBQl9SRUNMQUlNX0FDQ09VTlQgfAorCQkJCSBTTEFCX01FTV9TUFJFQUQgfCBleHRyYV9mbGFncyksIGN0b3IpOworfQorCitpbnQgYnRyZnNfaW5pdF9jYWNoZXAodm9pZCkKK3sKKwlidHJmc19pbm9kZV9jYWNoZXAgPSBidHJmc19jYWNoZV9jcmVhdGUoImJ0cmZzX2lub2RlX2NhY2hlIiwKKwkJCQkJICBzaXplb2Yoc3RydWN0IGJ0cmZzX2lub2RlKSwKKwkJCQkJICAwLCBpbml0X29uY2UpOworCWlmICghYnRyZnNfaW5vZGVfY2FjaGVwKQorCQlnb3RvIGZhaWw7CisJYnRyZnNfdHJhbnNfaGFuZGxlX2NhY2hlcCA9CisJCQlidHJmc19jYWNoZV9jcmVhdGUoImJ0cmZzX3RyYW5zX2hhbmRsZV9jYWNoZSIsCisJCQkJCSAgIHNpemVvZihzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlKSwKKwkJCQkJICAgMCwgTlVMTCk7CisJaWYgKCFidHJmc190cmFuc19oYW5kbGVfY2FjaGVwKQorCQlnb3RvIGZhaWw7CisJYnRyZnNfdHJhbnNhY3Rpb25fY2FjaGVwID0gYnRyZnNfY2FjaGVfY3JlYXRlKCJidHJmc190cmFuc2FjdGlvbl9jYWNoZSIsCisJCQkJCSAgICAgc2l6ZW9mKHN0cnVjdCBidHJmc190cmFuc2FjdGlvbiksCisJCQkJCSAgICAgMCwgTlVMTCk7CisJaWYgKCFidHJmc190cmFuc2FjdGlvbl9jYWNoZXApCisJCWdvdG8gZmFpbDsKKwlidHJmc19wYXRoX2NhY2hlcCA9IGJ0cmZzX2NhY2hlX2NyZWF0ZSgiYnRyZnNfcGF0aF9jYWNoZSIsCisJCQkJCSBzaXplb2Yoc3RydWN0IGJ0cmZzX3BhdGgpLAorCQkJCQkgMCwgTlVMTCk7CisJaWYgKCFidHJmc19wYXRoX2NhY2hlcCkKKwkJZ290byBmYWlsOworCWJ0cmZzX2JpdF9yYWRpeF9jYWNoZXAgPSBidHJmc19jYWNoZV9jcmVhdGUoImJ0cmZzX3JhZGl4IiwgMjU2LAorCQkJCQkgICAgICBTTEFCX0RFU1RST1lfQllfUkNVLCBOVUxMKTsKKwlpZiAoIWJ0cmZzX2JpdF9yYWRpeF9jYWNoZXApCisJCWdvdG8gZmFpbDsKKwlyZXR1cm4gMDsKK2ZhaWw6CisJYnRyZnNfZGVzdHJveV9jYWNoZXAoKTsKKwlyZXR1cm4gLUVOT01FTTsKK30KKworc3RhdGljIGludCBidHJmc19nZXRhdHRyKHN0cnVjdCB2ZnNtb3VudCAqbW50LAorCQkJIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGtzdGF0ICpzdGF0KQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CisJZ2VuZXJpY19maWxsYXR0cihpbm9kZSwgc3RhdCk7CisJc3RhdC0+ZGV2ID0gQlRSRlNfSShpbm9kZSktPnJvb3QtPmFub25fc3VwZXIuc19kZXY7CisJc3RhdC0+Ymxrc2l6ZSA9IFBBR0VfQ0FDSEVfU0laRTsKKwlzdGF0LT5ibG9ja3MgPSAoaW5vZGVfZ2V0X2J5dGVzKGlub2RlKSArCisJCQlCVFJGU19JKGlub2RlKS0+ZGVsYWxsb2NfYnl0ZXMpID4+IDk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYnRyZnNfcmVuYW1lKHN0cnVjdCBpbm9kZSAqb2xkX2Rpciwgc3RydWN0IGRlbnRyeSAqb2xkX2RlbnRyeSwKKwkJCSAgIHN0cnVjdCBpbm9kZSAqbmV3X2Rpciwgc3RydWN0IGRlbnRyeSAqbmV3X2RlbnRyeSkKK3sKKwlzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFuczsKKwlzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCA9IEJUUkZTX0kob2xkX2RpciktPnJvb3Q7CisJc3RydWN0IGlub2RlICpuZXdfaW5vZGUgPSBuZXdfZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBpbm9kZSAqb2xkX2lub2RlID0gb2xkX2RlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgdGltZXNwZWMgY3RpbWUgPSBDVVJSRU5UX1RJTUU7CisJdTY0IGluZGV4ID0gMDsKKwlpbnQgcmV0OworCisJLyogd2UncmUgbm90IGFsbG93ZWQgdG8gcmVuYW1lIGJldHdlZW4gc3Vidm9sdW1lcyAqLworCWlmIChCVFJGU19JKG9sZF9pbm9kZSktPnJvb3QtPnJvb3Rfa2V5Lm9iamVjdGlkICE9CisJICAgIEJUUkZTX0kobmV3X2RpciktPnJvb3QtPnJvb3Rfa2V5Lm9iamVjdGlkKQorCQlyZXR1cm4gLUVYREVWOworCisJaWYgKFNfSVNESVIob2xkX2lub2RlLT5pX21vZGUpICYmIG5ld19pbm9kZSAmJgorCSAgICBuZXdfaW5vZGUtPmlfc2l6ZSA+IEJUUkZTX0VNUFRZX0RJUl9TSVpFKSB7CisJCXJldHVybiAtRU5PVEVNUFRZOworCX0KKworCS8qIHRvIHJlbmFtZSBhIHNuYXBzaG90IG9yIHN1YnZvbHVtZSwgd2UgbmVlZCB0byBqdWdnbGUgdGhlCisJICogYmFja3JlZnMuICBUaGlzIGlzbid0IGNvZGVkIHlldAorCSAqLworCWlmIChvbGRfaW5vZGUtPmlfaW5vID09IEJUUkZTX0ZJUlNUX0ZSRUVfT0JKRUNUSUQpCisJCXJldHVybiAtRVhERVY7CisKKwlyZXQgPSBidHJmc19jaGVja19mcmVlX3NwYWNlKHJvb3QsIDEsIDApOworCWlmIChyZXQpCisJCWdvdG8gb3V0X3VubG9jazsKKworCXRyYW5zID0gYnRyZnNfc3RhcnRfdHJhbnNhY3Rpb24ocm9vdCwgMSk7CisKKwlidHJmc19zZXRfdHJhbnNfYmxvY2tfZ3JvdXAodHJhbnMsIG5ld19kaXIpOworCisJYnRyZnNfaW5jX25saW5rKG9sZF9kZW50cnktPmRfaW5vZGUpOworCW9sZF9kaXItPmlfY3RpbWUgPSBvbGRfZGlyLT5pX210aW1lID0gY3RpbWU7CisJbmV3X2Rpci0+aV9jdGltZSA9IG5ld19kaXItPmlfbXRpbWUgPSBjdGltZTsKKwlvbGRfaW5vZGUtPmlfY3RpbWUgPSBjdGltZTsKKworCXJldCA9IGJ0cmZzX3VubGlua19pbm9kZSh0cmFucywgcm9vdCwgb2xkX2Rpciwgb2xkX2RlbnRyeS0+ZF9pbm9kZSwKKwkJCQkgb2xkX2RlbnRyeS0+ZF9uYW1lLm5hbWUsCisJCQkJIG9sZF9kZW50cnktPmRfbmFtZS5sZW4pOworCWlmIChyZXQpCisJCWdvdG8gb3V0X2ZhaWw7CisKKwlpZiAobmV3X2lub2RlKSB7CisJCW5ld19pbm9kZS0+aV9jdGltZSA9IENVUlJFTlRfVElNRTsKKwkJcmV0ID0gYnRyZnNfdW5saW5rX2lub2RlKHRyYW5zLCByb290LCBuZXdfZGlyLAorCQkJCQkgbmV3X2RlbnRyeS0+ZF9pbm9kZSwKKwkJCQkJIG5ld19kZW50cnktPmRfbmFtZS5uYW1lLAorCQkJCQkgbmV3X2RlbnRyeS0+ZF9uYW1lLmxlbik7CisJCWlmIChyZXQpCisJCQlnb3RvIG91dF9mYWlsOworCQlpZiAobmV3X2lub2RlLT5pX25saW5rID09IDApIHsKKwkJCXJldCA9IGJ0cmZzX29ycGhhbl9hZGQodHJhbnMsIG5ld19kZW50cnktPmRfaW5vZGUpOworCQkJaWYgKHJldCkKKwkJCQlnb3RvIG91dF9mYWlsOworCQl9CisKKwl9CisJcmV0ID0gYnRyZnNfc2V0X2lub2RlX2luZGV4KG5ld19kaXIsICZpbmRleCk7CisJaWYgKHJldCkKKwkJZ290byBvdXRfZmFpbDsKKworCXJldCA9IGJ0cmZzX2FkZF9saW5rKHRyYW5zLCBuZXdfZGVudHJ5LT5kX3BhcmVudC0+ZF9pbm9kZSwKKwkJCSAgICAgb2xkX2lub2RlLCBuZXdfZGVudHJ5LT5kX25hbWUubmFtZSwKKwkJCSAgICAgbmV3X2RlbnRyeS0+ZF9uYW1lLmxlbiwgMSwgaW5kZXgpOworCWlmIChyZXQpCisJCWdvdG8gb3V0X2ZhaWw7CisKK291dF9mYWlsOgorCWJ0cmZzX2VuZF90cmFuc2FjdGlvbl90aHJvdHRsZSh0cmFucywgcm9vdCk7CitvdXRfdW5sb2NrOgorCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBzb21lIGZhaXJseSBzbG93IGNvZGUgdGhhdCBuZWVkcyBvcHRpbWl6YXRpb24uIFRoaXMgd2Fsa3MgdGhlIGxpc3QKKyAqIG9mIGFsbCB0aGUgaW5vZGVzIHdpdGggcGVuZGluZyBkZWxhbGxvYyBhbmQgZm9yY2VzIHRoZW0gdG8gZGlzay4KKyAqLworaW50IGJ0cmZzX3N0YXJ0X2RlbGFsbG9jX2lub2RlcyhzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkID0gJnJvb3QtPmZzX2luZm8tPmRlbGFsbG9jX2lub2RlczsKKwlzdHJ1Y3QgYnRyZnNfaW5vZGUgKmJpbm9kZTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCisJaWYgKHJvb3QtPmZzX2luZm8tPnNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKQorCQlyZXR1cm4gLUVST0ZTOworCisJc3Bpbl9sb2NrKCZyb290LT5mc19pbmZvLT5kZWxhbGxvY19sb2NrKTsKKwl3aGlsZSAoIWxpc3RfZW1wdHkoaGVhZCkpIHsKKwkJYmlub2RlID0gbGlzdF9lbnRyeShoZWFkLT5uZXh0LCBzdHJ1Y3QgYnRyZnNfaW5vZGUsCisJCQkJICAgIGRlbGFsbG9jX2lub2Rlcyk7CisJCWlub2RlID0gaWdyYWIoJmJpbm9kZS0+dmZzX2lub2RlKTsKKwkJaWYgKCFpbm9kZSkKKwkJCWxpc3RfZGVsX2luaXQoJmJpbm9kZS0+ZGVsYWxsb2NfaW5vZGVzKTsKKwkJc3Bpbl91bmxvY2soJnJvb3QtPmZzX2luZm8tPmRlbGFsbG9jX2xvY2spOworCQlpZiAoaW5vZGUpIHsKKwkJCWZpbGVtYXBfZmx1c2goaW5vZGUtPmlfbWFwcGluZyk7CisJCQlpcHV0KGlub2RlKTsKKwkJfQorCQljb25kX3Jlc2NoZWQoKTsKKwkJc3Bpbl9sb2NrKCZyb290LT5mc19pbmZvLT5kZWxhbGxvY19sb2NrKTsKKwl9CisJc3Bpbl91bmxvY2soJnJvb3QtPmZzX2luZm8tPmRlbGFsbG9jX2xvY2spOworCisJLyogdGhlIGZpbGVtYXBfZmx1c2ggd2lsbCBxdWV1ZSBJTyBpbnRvIHRoZSB3b3JrZXIgdGhyZWFkcywgYnV0CisJICogd2UgaGF2ZSB0byBtYWtlIHN1cmUgdGhlIElPIGlzIGFjdHVhbGx5IHN0YXJ0ZWQgYW5kIHRoYXQKKwkgKiBvcmRlcmVkIGV4dGVudHMgZ2V0IGNyZWF0ZWQgYmVmb3JlIHdlIHJldHVybgorCSAqLworCWF0b21pY19pbmMoJnJvb3QtPmZzX2luZm8tPmFzeW5jX3N1Ym1pdF9kcmFpbmluZyk7CisJd2hpbGUgKGF0b21pY19yZWFkKCZyb290LT5mc19pbmZvLT5ucl9hc3luY19zdWJtaXRzKSB8fAorCSAgICAgIGF0b21pY19yZWFkKCZyb290LT5mc19pbmZvLT5hc3luY19kZWxhbGxvY19wYWdlcykpIHsKKwkJd2FpdF9ldmVudChyb290LT5mc19pbmZvLT5hc3luY19zdWJtaXRfd2FpdCwKKwkJICAgKGF0b21pY19yZWFkKCZyb290LT5mc19pbmZvLT5ucl9hc3luY19zdWJtaXRzKSA9PSAwICYmCisJCSAgICBhdG9taWNfcmVhZCgmcm9vdC0+ZnNfaW5mby0+YXN5bmNfZGVsYWxsb2NfcGFnZXMpID09IDApKTsKKwl9CisJYXRvbWljX2RlYygmcm9vdC0+ZnNfaW5mby0+YXN5bmNfc3VibWl0X2RyYWluaW5nKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBidHJmc19zeW1saW5rKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksCisJCQkgY29uc3QgY2hhciAqc3ltbmFtZSkKK3sKKwlzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFuczsKKwlzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCA9IEJUUkZTX0koZGlyKS0+cm9vdDsKKwlzdHJ1Y3QgYnRyZnNfcGF0aCAqcGF0aDsKKwlzdHJ1Y3QgYnRyZnNfa2V5IGtleTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gTlVMTDsKKwlpbnQgZXJyOworCWludCBkcm9wX2lub2RlID0gMDsKKwl1NjQgb2JqZWN0aWQ7CisJdTY0IGluZGV4ID0gMCA7CisJaW50IG5hbWVfbGVuOworCWludCBkYXRhc2l6ZTsKKwl1bnNpZ25lZCBsb25nIHB0cjsKKwlzdHJ1Y3QgYnRyZnNfZmlsZV9leHRlbnRfaXRlbSAqZWk7CisJc3RydWN0IGV4dGVudF9idWZmZXIgKmxlYWY7CisJdW5zaWduZWQgbG9uZyBuciA9IDA7CisKKwluYW1lX2xlbiA9IHN0cmxlbihzeW1uYW1lKSArIDE7CisJaWYgKG5hbWVfbGVuID4gQlRSRlNfTUFYX0lOTElORV9EQVRBX1NJWkUocm9vdCkpCisJCXJldHVybiAtRU5BTUVUT09MT05HOworCisJZXJyID0gYnRyZnNfY2hlY2tfZnJlZV9zcGFjZShyb290LCAxLCAwKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dF9mYWlsOworCisJdHJhbnMgPSBidHJmc19zdGFydF90cmFuc2FjdGlvbihyb290LCAxKTsKKwlidHJmc19zZXRfdHJhbnNfYmxvY2tfZ3JvdXAodHJhbnMsIGRpcik7CisKKwllcnIgPSBidHJmc19maW5kX2ZyZWVfb2JqZWN0aWQodHJhbnMsIHJvb3QsIGRpci0+aV9pbm8sICZvYmplY3RpZCk7CisJaWYgKGVycikgeworCQllcnIgPSAtRU5PU1BDOworCQlnb3RvIG91dF91bmxvY2s7CisJfQorCisJaW5vZGUgPSBidHJmc19uZXdfaW5vZGUodHJhbnMsIHJvb3QsIGRpciwgZGVudHJ5LT5kX25hbWUubmFtZSwKKwkJCQlkZW50cnktPmRfbmFtZS5sZW4sCisJCQkJZGVudHJ5LT5kX3BhcmVudC0+ZF9pbm9kZS0+aV9pbm8sIG9iamVjdGlkLAorCQkJCUJUUkZTX0koZGlyKS0+YmxvY2tfZ3JvdXAsIFNfSUZMTkt8U19JUldYVUdPLAorCQkJCSZpbmRleCk7CisJZXJyID0gUFRSX0VSUihpbm9kZSk7CisJaWYgKElTX0VSUihpbm9kZSkpCisJCWdvdG8gb3V0X3VubG9jazsKKworCWVyciA9IGJ0cmZzX2luaXRfYWNsKGlub2RlLCBkaXIpOworCWlmIChlcnIpIHsKKwkJZHJvcF9pbm9kZSA9IDE7CisJCWdvdG8gb3V0X3VubG9jazsKKwl9CisKKwlidHJmc19zZXRfdHJhbnNfYmxvY2tfZ3JvdXAodHJhbnMsIGlub2RlKTsKKwllcnIgPSBidHJmc19hZGRfbm9uZGlyKHRyYW5zLCBkZW50cnksIGlub2RlLCAwLCBpbmRleCk7CisJaWYgKGVycikKKwkJZHJvcF9pbm9kZSA9IDE7CisJZWxzZSB7CisJCWlub2RlLT5pX21hcHBpbmctPmFfb3BzID0gJmJ0cmZzX2FvcHM7CisJCWlub2RlLT5pX21hcHBpbmctPmJhY2tpbmdfZGV2X2luZm8gPSAmcm9vdC0+ZnNfaW5mby0+YmRpOworCQlpbm9kZS0+aV9mb3AgPSAmYnRyZnNfZmlsZV9vcGVyYXRpb25zOworCQlpbm9kZS0+aV9vcCA9ICZidHJmc19maWxlX2lub2RlX29wZXJhdGlvbnM7CisJCUJUUkZTX0koaW5vZGUpLT5pb190cmVlLm9wcyA9ICZidHJmc19leHRlbnRfaW9fb3BzOworCX0KKwlkaXItPmlfc2ItPnNfZGlydCA9IDE7CisJYnRyZnNfdXBkYXRlX2lub2RlX2Jsb2NrX2dyb3VwKHRyYW5zLCBpbm9kZSk7CisJYnRyZnNfdXBkYXRlX2lub2RlX2Jsb2NrX2dyb3VwKHRyYW5zLCBkaXIpOworCWlmIChkcm9wX2lub2RlKQorCQlnb3RvIG91dF91bmxvY2s7CisKKwlwYXRoID0gYnRyZnNfYWxsb2NfcGF0aCgpOworCUJVR19PTighcGF0aCk7CisJa2V5Lm9iamVjdGlkID0gaW5vZGUtPmlfaW5vOworCWtleS5vZmZzZXQgPSAwOworCWJ0cmZzX3NldF9rZXlfdHlwZSgma2V5LCBCVFJGU19FWFRFTlRfREFUQV9LRVkpOworCWRhdGFzaXplID0gYnRyZnNfZmlsZV9leHRlbnRfY2FsY19pbmxpbmVfc2l6ZShuYW1lX2xlbik7CisJZXJyID0gYnRyZnNfaW5zZXJ0X2VtcHR5X2l0ZW0odHJhbnMsIHJvb3QsIHBhdGgsICZrZXksCisJCQkJICAgICAgZGF0YXNpemUpOworCWlmIChlcnIpIHsKKwkJZHJvcF9pbm9kZSA9IDE7CisJCWdvdG8gb3V0X3VubG9jazsKKwl9CisJbGVhZiA9IHBhdGgtPm5vZGVzWzBdOworCWVpID0gYnRyZnNfaXRlbV9wdHIobGVhZiwgcGF0aC0+c2xvdHNbMF0sCisJCQkgICAgc3RydWN0IGJ0cmZzX2ZpbGVfZXh0ZW50X2l0ZW0pOworCWJ0cmZzX3NldF9maWxlX2V4dGVudF9nZW5lcmF0aW9uKGxlYWYsIGVpLCB0cmFucy0+dHJhbnNpZCk7CisJYnRyZnNfc2V0X2ZpbGVfZXh0ZW50X3R5cGUobGVhZiwgZWksCisJCQkJICAgQlRSRlNfRklMRV9FWFRFTlRfSU5MSU5FKTsKKwlidHJmc19zZXRfZmlsZV9leHRlbnRfZW5jcnlwdGlvbihsZWFmLCBlaSwgMCk7CisJYnRyZnNfc2V0X2ZpbGVfZXh0ZW50X2NvbXByZXNzaW9uKGxlYWYsIGVpLCAwKTsKKwlidHJmc19zZXRfZmlsZV9leHRlbnRfb3RoZXJfZW5jb2RpbmcobGVhZiwgZWksIDApOworCWJ0cmZzX3NldF9maWxlX2V4dGVudF9yYW1fYnl0ZXMobGVhZiwgZWksIG5hbWVfbGVuKTsKKworCXB0ciA9IGJ0cmZzX2ZpbGVfZXh0ZW50X2lubGluZV9zdGFydChlaSk7CisJd3JpdGVfZXh0ZW50X2J1ZmZlcihsZWFmLCBzeW1uYW1lLCBwdHIsIG5hbWVfbGVuKTsKKwlidHJmc19tYXJrX2J1ZmZlcl9kaXJ0eShsZWFmKTsKKwlidHJmc19mcmVlX3BhdGgocGF0aCk7CisKKwlpbm9kZS0+aV9vcCA9ICZidHJmc19zeW1saW5rX2lub2RlX29wZXJhdGlvbnM7CisJaW5vZGUtPmlfbWFwcGluZy0+YV9vcHMgPSAmYnRyZnNfc3ltbGlua19hb3BzOworCWlub2RlLT5pX21hcHBpbmctPmJhY2tpbmdfZGV2X2luZm8gPSAmcm9vdC0+ZnNfaW5mby0+YmRpOworCWlub2RlX3NldF9ieXRlcyhpbm9kZSwgbmFtZV9sZW4pOworCWJ0cmZzX2lfc2l6ZV93cml0ZShpbm9kZSwgbmFtZV9sZW4gLSAxKTsKKwllcnIgPSBidHJmc191cGRhdGVfaW5vZGUodHJhbnMsIHJvb3QsIGlub2RlKTsKKwlpZiAoZXJyKQorCQlkcm9wX2lub2RlID0gMTsKKworb3V0X3VubG9jazoKKwluciA9IHRyYW5zLT5ibG9ja3NfdXNlZDsKKwlidHJmc19lbmRfdHJhbnNhY3Rpb25fdGhyb3R0bGUodHJhbnMsIHJvb3QpOworb3V0X2ZhaWw6CisJaWYgKGRyb3BfaW5vZGUpIHsKKwkJaW5vZGVfZGVjX2xpbmtfY291bnQoaW5vZGUpOworCQlpcHV0KGlub2RlKTsKKwl9CisJYnRyZnNfYnRyZWVfYmFsYW5jZV9kaXJ0eShyb290LCBucik7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBwcmVhbGxvY19maWxlX3JhbmdlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHU2NCBzdGFydCwgdTY0IGVuZCwKKwkJCSAgICAgICB1NjQgYWxsb2NfaGludCwgaW50IG1vZGUpCit7CisJc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnM7CisJc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QgPSBCVFJGU19JKGlub2RlKS0+cm9vdDsKKwlzdHJ1Y3QgYnRyZnNfa2V5IGluczsKKwl1NjQgYWxsb2Nfc2l6ZTsKKwl1NjQgY3VyX29mZnNldCA9IHN0YXJ0OworCXU2NCBudW1fYnl0ZXMgPSBlbmQgLSBzdGFydDsKKwlpbnQgcmV0ID0gMDsKKworCXRyYW5zID0gYnRyZnNfam9pbl90cmFuc2FjdGlvbihyb290LCAxKTsKKwlCVUdfT04oIXRyYW5zKTsKKwlidHJmc19zZXRfdHJhbnNfYmxvY2tfZ3JvdXAodHJhbnMsIGlub2RlKTsKKworCXdoaWxlIChudW1fYnl0ZXMgPiAwKSB7CisJCWFsbG9jX3NpemUgPSBtaW4obnVtX2J5dGVzLCByb290LT5mc19pbmZvLT5tYXhfZXh0ZW50KTsKKwkJcmV0ID0gYnRyZnNfcmVzZXJ2ZV9leHRlbnQodHJhbnMsIHJvb3QsIGFsbG9jX3NpemUsCisJCQkJCSAgIHJvb3QtPnNlY3RvcnNpemUsIDAsIGFsbG9jX2hpbnQsCisJCQkJCSAgICh1NjQpLTEsICZpbnMsIDEpOworCQlpZiAocmV0KSB7CisJCQlXQVJOX09OKDEpOworCQkJZ290byBvdXQ7CisJCX0KKwkJcmV0ID0gaW5zZXJ0X3Jlc2VydmVkX2ZpbGVfZXh0ZW50KHRyYW5zLCBpbm9kZSwKKwkJCQkJCSAgY3VyX29mZnNldCwgaW5zLm9iamVjdGlkLAorCQkJCQkJICBpbnMub2Zmc2V0LCBpbnMub2Zmc2V0LAorCQkJCQkJICBpbnMub2Zmc2V0LCAwLCAwLCAwLAorCQkJCQkJICBCVFJGU19GSUxFX0VYVEVOVF9QUkVBTExPQyk7CisJCUJVR19PTihyZXQpOworCQludW1fYnl0ZXMgLT0gaW5zLm9mZnNldDsKKwkJY3VyX29mZnNldCArPSBpbnMub2Zmc2V0OworCQlhbGxvY19oaW50ID0gaW5zLm9iamVjdGlkICsgaW5zLm9mZnNldDsKKwl9CitvdXQ6CisJaWYgKGN1cl9vZmZzZXQgPiBzdGFydCkgeworCQlpbm9kZS0+aV9jdGltZSA9IENVUlJFTlRfVElNRTsKKwkJYnRyZnNfc2V0X2ZsYWcoaW5vZGUsIFBSRUFMTE9DKTsKKwkJaWYgKCEobW9kZSAmIEZBTExPQ19GTF9LRUVQX1NJWkUpICYmCisJCSAgICBjdXJfb2Zmc2V0ID4gaV9zaXplX3JlYWQoaW5vZGUpKQorCQkJYnRyZnNfaV9zaXplX3dyaXRlKGlub2RlLCBjdXJfb2Zmc2V0KTsKKwkJcmV0ID0gYnRyZnNfdXBkYXRlX2lub2RlKHRyYW5zLCByb290LCBpbm9kZSk7CisJCUJVR19PTihyZXQpOworCX0KKworCWJ0cmZzX2VuZF90cmFuc2FjdGlvbih0cmFucywgcm9vdCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGxvbmcgYnRyZnNfZmFsbG9jYXRlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBtb2RlLAorCQkJICAgIGxvZmZfdCBvZmZzZXQsIGxvZmZfdCBsZW4pCit7CisJdTY0IGN1cl9vZmZzZXQ7CisJdTY0IGxhc3RfYnl0ZTsKKwl1NjQgYWxsb2Nfc3RhcnQ7CisJdTY0IGFsbG9jX2VuZDsKKwl1NjQgYWxsb2NfaGludCA9IDA7CisJdTY0IG1hc2sgPSBCVFJGU19JKGlub2RlKS0+cm9vdC0+c2VjdG9yc2l6ZSAtIDE7CisJc3RydWN0IGV4dGVudF9tYXAgKmVtOworCWludCByZXQ7CisKKwlhbGxvY19zdGFydCA9IG9mZnNldCAmIH5tYXNrOworCWFsbG9jX2VuZCA9ICAob2Zmc2V0ICsgbGVuICsgbWFzaykgJiB+bWFzazsKKworCW11dGV4X2xvY2soJmlub2RlLT5pX211dGV4KTsKKwlpZiAoYWxsb2Nfc3RhcnQgPiBpbm9kZS0+aV9zaXplKSB7CisJCXJldCA9IGJ0cmZzX2NvbnRfZXhwYW5kKGlub2RlLCBhbGxvY19zdGFydCk7CisJCWlmIChyZXQpCisJCQlnb3RvIG91dDsKKwl9CisKKwl3aGlsZSAoMSkgeworCQlzdHJ1Y3QgYnRyZnNfb3JkZXJlZF9leHRlbnQgKm9yZGVyZWQ7CisJCWxvY2tfZXh0ZW50KCZCVFJGU19JKGlub2RlKS0+aW9fdHJlZSwgYWxsb2Nfc3RhcnQsCisJCQkgICAgYWxsb2NfZW5kIC0gMSwgR0ZQX05PRlMpOworCQlvcmRlcmVkID0gYnRyZnNfbG9va3VwX2ZpcnN0X29yZGVyZWRfZXh0ZW50KGlub2RlLAorCQkJCQkJCSAgICBhbGxvY19lbmQgLSAxKTsKKwkJaWYgKG9yZGVyZWQgJiYKKwkJICAgIG9yZGVyZWQtPmZpbGVfb2Zmc2V0ICsgb3JkZXJlZC0+bGVuID4gYWxsb2Nfc3RhcnQgJiYKKwkJICAgIG9yZGVyZWQtPmZpbGVfb2Zmc2V0IDwgYWxsb2NfZW5kKSB7CisJCQlidHJmc19wdXRfb3JkZXJlZF9leHRlbnQob3JkZXJlZCk7CisJCQl1bmxvY2tfZXh0ZW50KCZCVFJGU19JKGlub2RlKS0+aW9fdHJlZSwKKwkJCQkgICAgICBhbGxvY19zdGFydCwgYWxsb2NfZW5kIC0gMSwgR0ZQX05PRlMpOworCQkJYnRyZnNfd2FpdF9vcmRlcmVkX3JhbmdlKGlub2RlLCBhbGxvY19zdGFydCwKKwkJCQkJCSBhbGxvY19lbmQgLSBhbGxvY19zdGFydCk7CisJCX0gZWxzZSB7CisJCQlpZiAob3JkZXJlZCkKKwkJCQlidHJmc19wdXRfb3JkZXJlZF9leHRlbnQob3JkZXJlZCk7CisJCQlicmVhazsKKwkJfQorCX0KKworCWN1cl9vZmZzZXQgPSBhbGxvY19zdGFydDsKKwl3aGlsZSAoMSkgeworCQllbSA9IGJ0cmZzX2dldF9leHRlbnQoaW5vZGUsIE5VTEwsIDAsIGN1cl9vZmZzZXQsCisJCQkJICAgICAgYWxsb2NfZW5kIC0gY3VyX29mZnNldCwgMCk7CisJCUJVR19PTihJU19FUlIoZW0pIHx8ICFlbSk7CisJCWxhc3RfYnl0ZSA9IG1pbihleHRlbnRfbWFwX2VuZChlbSksIGFsbG9jX2VuZCk7CisJCWxhc3RfYnl0ZSA9IChsYXN0X2J5dGUgKyBtYXNrKSAmIH5tYXNrOworCQlpZiAoZW0tPmJsb2NrX3N0YXJ0ID09IEVYVEVOVF9NQVBfSE9MRSkgeworCQkJcmV0ID0gcHJlYWxsb2NfZmlsZV9yYW5nZShpbm9kZSwgY3VyX29mZnNldCwKKwkJCQkJbGFzdF9ieXRlLCBhbGxvY19oaW50LCBtb2RlKTsKKwkJCWlmIChyZXQgPCAwKSB7CisJCQkJZnJlZV9leHRlbnRfbWFwKGVtKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpZiAoZW0tPmJsb2NrX3N0YXJ0IDw9IEVYVEVOVF9NQVBfTEFTVF9CWVRFKQorCQkJYWxsb2NfaGludCA9IGVtLT5ibG9ja19zdGFydDsKKwkJZnJlZV9leHRlbnRfbWFwKGVtKTsKKworCQljdXJfb2Zmc2V0ID0gbGFzdF9ieXRlOworCQlpZiAoY3VyX29mZnNldCA+PSBhbGxvY19lbmQpIHsKKwkJCXJldCA9IDA7CisJCQlicmVhazsKKwkJfQorCX0KKwl1bmxvY2tfZXh0ZW50KCZCVFJGU19JKGlub2RlKS0+aW9fdHJlZSwgYWxsb2Nfc3RhcnQsIGFsbG9jX2VuZCAtIDEsCisJCSAgICAgIEdGUF9OT0ZTKTsKK291dDoKKwltdXRleF91bmxvY2soJmlub2RlLT5pX211dGV4KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGJ0cmZzX3NldF9wYWdlX2RpcnR5KHN0cnVjdCBwYWdlICpwYWdlKQoreworCXJldHVybiBfX3NldF9wYWdlX2RpcnR5X25vYnVmZmVycyhwYWdlKTsKK30KKworc3RhdGljIGludCBidHJmc19wZXJtaXNzaW9uKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBtYXNrKQoreworCWlmIChidHJmc190ZXN0X2ZsYWcoaW5vZGUsIFJFQURPTkxZKSAmJiAobWFzayAmIE1BWV9XUklURSkpCisJCXJldHVybiAtRUFDQ0VTOworCXJldHVybiBnZW5lcmljX3Blcm1pc3Npb24oaW5vZGUsIG1hc2ssIGJ0cmZzX2NoZWNrX2FjbCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBidHJmc19kaXJfaW5vZGVfb3BlcmF0aW9ucyA9IHsKKwkuZ2V0YXR0cgk9IGJ0cmZzX2dldGF0dHIsCisJLmxvb2t1cAkJPSBidHJmc19sb29rdXAsCisJLmNyZWF0ZQkJPSBidHJmc19jcmVhdGUsCisJLnVubGluawkJPSBidHJmc191bmxpbmssCisJLmxpbmsJCT0gYnRyZnNfbGluaywKKwkubWtkaXIJCT0gYnRyZnNfbWtkaXIsCisJLnJtZGlyCQk9IGJ0cmZzX3JtZGlyLAorCS5yZW5hbWUJCT0gYnRyZnNfcmVuYW1lLAorCS5zeW1saW5rCT0gYnRyZnNfc3ltbGluaywKKwkuc2V0YXR0cgk9IGJ0cmZzX3NldGF0dHIsCisJLm1rbm9kCQk9IGJ0cmZzX21rbm9kLAorCS5zZXR4YXR0cgk9IGJ0cmZzX3NldHhhdHRyLAorCS5nZXR4YXR0cgk9IGJ0cmZzX2dldHhhdHRyLAorCS5saXN0eGF0dHIJPSBidHJmc19saXN0eGF0dHIsCisJLnJlbW92ZXhhdHRyCT0gYnRyZnNfcmVtb3ZleGF0dHIsCisJLnBlcm1pc3Npb24JPSBidHJmc19wZXJtaXNzaW9uLAorfTsKK3N0YXRpYyBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBidHJmc19kaXJfcm9faW5vZGVfb3BlcmF0aW9ucyA9IHsKKwkubG9va3VwCQk9IGJ0cmZzX2xvb2t1cCwKKwkucGVybWlzc2lvbgk9IGJ0cmZzX3Blcm1pc3Npb24sCit9Oworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYnRyZnNfZGlyX2ZpbGVfb3BlcmF0aW9ucyA9IHsKKwkubGxzZWVrCQk9IGdlbmVyaWNfZmlsZV9sbHNlZWssCisJLnJlYWQJCT0gZ2VuZXJpY19yZWFkX2RpciwKKwkucmVhZGRpcgk9IGJ0cmZzX3JlYWxfcmVhZGRpciwKKwkudW5sb2NrZWRfaW9jdGwJPSBidHJmc19pb2N0bCwKKyNpZmRlZiBDT05GSUdfQ09NUEFUCisJLmNvbXBhdF9pb2N0bAk9IGJ0cmZzX2lvY3RsLAorI2VuZGlmCisJLnJlbGVhc2UgICAgICAgID0gYnRyZnNfcmVsZWFzZV9maWxlLAorCS5mc3luYwkJPSBidHJmc19zeW5jX2ZpbGUsCit9OworCitzdGF0aWMgc3RydWN0IGV4dGVudF9pb19vcHMgYnRyZnNfZXh0ZW50X2lvX29wcyA9IHsKKwkuZmlsbF9kZWxhbGxvYyA9IHJ1bl9kZWxhbGxvY19yYW5nZSwKKwkuc3VibWl0X2Jpb19ob29rID0gYnRyZnNfc3VibWl0X2Jpb19ob29rLAorCS5tZXJnZV9iaW9faG9vayA9IGJ0cmZzX21lcmdlX2Jpb19ob29rLAorCS5yZWFkcGFnZV9lbmRfaW9faG9vayA9IGJ0cmZzX3JlYWRwYWdlX2VuZF9pb19ob29rLAorCS53cml0ZXBhZ2VfZW5kX2lvX2hvb2sgPSBidHJmc193cml0ZXBhZ2VfZW5kX2lvX2hvb2ssCisJLndyaXRlcGFnZV9zdGFydF9ob29rID0gYnRyZnNfd3JpdGVwYWdlX3N0YXJ0X2hvb2ssCisJLnJlYWRwYWdlX2lvX2ZhaWxlZF9ob29rID0gYnRyZnNfaW9fZmFpbGVkX2hvb2ssCisJLnNldF9iaXRfaG9vayA9IGJ0cmZzX3NldF9iaXRfaG9vaywKKwkuY2xlYXJfYml0X2hvb2sgPSBidHJmc19jbGVhcl9iaXRfaG9vaywKK307CisKK3N0YXRpYyBzdHJ1Y3QgYWRkcmVzc19zcGFjZV9vcGVyYXRpb25zIGJ0cmZzX2FvcHMgPSB7CisJLnJlYWRwYWdlCT0gYnRyZnNfcmVhZHBhZ2UsCisJLndyaXRlcGFnZQk9IGJ0cmZzX3dyaXRlcGFnZSwKKwkud3JpdGVwYWdlcwk9IGJ0cmZzX3dyaXRlcGFnZXMsCisJLnJlYWRwYWdlcwk9IGJ0cmZzX3JlYWRwYWdlcywKKwkuc3luY19wYWdlCT0gYmxvY2tfc3luY19wYWdlLAorCS5ibWFwCQk9IGJ0cmZzX2JtYXAsCisJLmRpcmVjdF9JTwk9IGJ0cmZzX2RpcmVjdF9JTywKKwkuaW52YWxpZGF0ZXBhZ2UgPSBidHJmc19pbnZhbGlkYXRlcGFnZSwKKwkucmVsZWFzZXBhZ2UJPSBidHJmc19yZWxlYXNlcGFnZSwKKwkuc2V0X3BhZ2VfZGlydHkJPSBidHJmc19zZXRfcGFnZV9kaXJ0eSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYWRkcmVzc19zcGFjZV9vcGVyYXRpb25zIGJ0cmZzX3N5bWxpbmtfYW9wcyA9IHsKKwkucmVhZHBhZ2UJPSBidHJmc19yZWFkcGFnZSwKKwkud3JpdGVwYWdlCT0gYnRyZnNfd3JpdGVwYWdlLAorCS5pbnZhbGlkYXRlcGFnZSA9IGJ0cmZzX2ludmFsaWRhdGVwYWdlLAorCS5yZWxlYXNlcGFnZQk9IGJ0cmZzX3JlbGVhc2VwYWdlLAorfTsKKworc3RhdGljIHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGJ0cmZzX2ZpbGVfaW5vZGVfb3BlcmF0aW9ucyA9IHsKKwkudHJ1bmNhdGUJPSBidHJmc190cnVuY2F0ZSwKKwkuZ2V0YXR0cgk9IGJ0cmZzX2dldGF0dHIsCisJLnNldGF0dHIJPSBidHJmc19zZXRhdHRyLAorCS5zZXR4YXR0cgk9IGJ0cmZzX3NldHhhdHRyLAorCS5nZXR4YXR0cgk9IGJ0cmZzX2dldHhhdHRyLAorCS5saXN0eGF0dHIgICAgICA9IGJ0cmZzX2xpc3R4YXR0ciwKKwkucmVtb3ZleGF0dHIJPSBidHJmc19yZW1vdmV4YXR0ciwKKwkucGVybWlzc2lvbgk9IGJ0cmZzX3Blcm1pc3Npb24sCisJLmZhbGxvY2F0ZQk9IGJ0cmZzX2ZhbGxvY2F0ZSwKK307CitzdGF0aWMgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgYnRyZnNfc3BlY2lhbF9pbm9kZV9vcGVyYXRpb25zID0geworCS5nZXRhdHRyCT0gYnRyZnNfZ2V0YXR0ciwKKwkuc2V0YXR0cgk9IGJ0cmZzX3NldGF0dHIsCisJLnBlcm1pc3Npb24JPSBidHJmc19wZXJtaXNzaW9uLAorCS5zZXR4YXR0cgk9IGJ0cmZzX3NldHhhdHRyLAorCS5nZXR4YXR0cgk9IGJ0cmZzX2dldHhhdHRyLAorCS5saXN0eGF0dHIJPSBidHJmc19saXN0eGF0dHIsCisJLnJlbW92ZXhhdHRyCT0gYnRyZnNfcmVtb3ZleGF0dHIsCit9Oworc3RhdGljIHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGJ0cmZzX3N5bWxpbmtfaW5vZGVfb3BlcmF0aW9ucyA9IHsKKwkucmVhZGxpbmsJPSBnZW5lcmljX3JlYWRsaW5rLAorCS5mb2xsb3dfbGluawk9IHBhZ2VfZm9sbG93X2xpbmtfbGlnaHQsCisJLnB1dF9saW5rCT0gcGFnZV9wdXRfbGluaywKKwkucGVybWlzc2lvbgk9IGJ0cmZzX3Blcm1pc3Npb24sCit9OwpkaWZmIC0tZ2l0IGEvZnMvYnRyZnMvaW9jdGwuYyBiL2ZzL2J0cmZzL2lvY3RsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzJhYTMzZQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2J0cmZzL2lvY3RsLmMKQEAgLTAsMCArMSwxMTMyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE9yYWNsZS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIHYyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCisgKiBCb3N0b24sIE1BIDAyMTExMC0xMzA3LCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2Jpby5oPgorI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CisjaW5jbHVkZSA8bGludXgvZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvZnNub3RpZnkuaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9iYWNraW5nLWRldi5oPgorI2luY2x1ZGUgPGxpbnV4L21vdW50Lmg+CisjaW5jbHVkZSA8bGludXgvbXBhZ2UuaD4KKyNpbmNsdWRlIDxsaW51eC9uYW1laS5oPgorI2luY2x1ZGUgPGxpbnV4L3N3YXAuaD4KKyNpbmNsdWRlIDxsaW51eC93cml0ZWJhY2suaD4KKyNpbmNsdWRlIDxsaW51eC9zdGF0ZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9jb21wYXQuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRfc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9zZWN1cml0eS5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxsaW51eC94YXR0ci5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKyNpbmNsdWRlICJjb21wYXQuaCIKKyNpbmNsdWRlICJjdHJlZS5oIgorI2luY2x1ZGUgImRpc2staW8uaCIKKyNpbmNsdWRlICJ0cmFuc2FjdGlvbi5oIgorI2luY2x1ZGUgImJ0cmZzX2lub2RlLmgiCisjaW5jbHVkZSAiaW9jdGwuaCIKKyNpbmNsdWRlICJwcmludC10cmVlLmgiCisjaW5jbHVkZSAidm9sdW1lcy5oIgorI2luY2x1ZGUgImxvY2tpbmcuaCIKKworCisKK3N0YXRpYyBub2lubGluZSBpbnQgY3JlYXRlX3N1YnZvbChzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwKKwkJCQkgIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwKKwkJCQkgIGNoYXIgKm5hbWUsIGludCBuYW1lbGVuKQoreworCXN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zOworCXN0cnVjdCBidHJmc19rZXkga2V5OworCXN0cnVjdCBidHJmc19yb290X2l0ZW0gcm9vdF9pdGVtOworCXN0cnVjdCBidHJmc19pbm9kZV9pdGVtICppbm9kZV9pdGVtOworCXN0cnVjdCBleHRlbnRfYnVmZmVyICpsZWFmOworCXN0cnVjdCBidHJmc19yb290ICpuZXdfcm9vdCA9IHJvb3Q7CisJc3RydWN0IGlub2RlICpkaXI7CisJaW50IHJldDsKKwlpbnQgZXJyOworCXU2NCBvYmplY3RpZDsKKwl1NjQgbmV3X2RpcmlkID0gQlRSRlNfRklSU1RfRlJFRV9PQkpFQ1RJRDsKKwl1NjQgaW5kZXggPSAwOworCXVuc2lnbmVkIGxvbmcgbnIgPSAxOworCisJcmV0ID0gYnRyZnNfY2hlY2tfZnJlZV9zcGFjZShyb290LCAxLCAwKTsKKwlpZiAocmV0KQorCQlnb3RvIGZhaWxfY29tbWl0OworCisJdHJhbnMgPSBidHJmc19zdGFydF90cmFuc2FjdGlvbihyb290LCAxKTsKKwlCVUdfT04oIXRyYW5zKTsKKworCXJldCA9IGJ0cmZzX2ZpbmRfZnJlZV9vYmplY3RpZCh0cmFucywgcm9vdC0+ZnNfaW5mby0+dHJlZV9yb290LAorCQkJCSAgICAgICAwLCAmb2JqZWN0aWQpOworCWlmIChyZXQpCisJCWdvdG8gZmFpbDsKKworCWxlYWYgPSBidHJmc19hbGxvY19mcmVlX2Jsb2NrKHRyYW5zLCByb290LCByb290LT5sZWFmc2l6ZSwgMCwKKwkJCQkgICAgICBvYmplY3RpZCwgdHJhbnMtPnRyYW5zaWQsIDAsIDAsIDApOworCWlmIChJU19FUlIobGVhZikpIHsKKwkJcmV0ID0gUFRSX0VSUihsZWFmKTsKKwkJZ290byBmYWlsOworCX0KKworCWJ0cmZzX3NldF9oZWFkZXJfbnJpdGVtcyhsZWFmLCAwKTsKKwlidHJmc19zZXRfaGVhZGVyX2xldmVsKGxlYWYsIDApOworCWJ0cmZzX3NldF9oZWFkZXJfYnl0ZW5yKGxlYWYsIGxlYWYtPnN0YXJ0KTsKKwlidHJmc19zZXRfaGVhZGVyX2dlbmVyYXRpb24obGVhZiwgdHJhbnMtPnRyYW5zaWQpOworCWJ0cmZzX3NldF9oZWFkZXJfb3duZXIobGVhZiwgb2JqZWN0aWQpOworCisJd3JpdGVfZXh0ZW50X2J1ZmZlcihsZWFmLCByb290LT5mc19pbmZvLT5mc2lkLAorCQkJICAgICh1bnNpZ25lZCBsb25nKWJ0cmZzX2hlYWRlcl9mc2lkKGxlYWYpLAorCQkJICAgIEJUUkZTX0ZTSURfU0laRSk7CisJYnRyZnNfbWFya19idWZmZXJfZGlydHkobGVhZik7CisKKwlpbm9kZV9pdGVtID0gJnJvb3RfaXRlbS5pbm9kZTsKKwltZW1zZXQoaW5vZGVfaXRlbSwgMCwgc2l6ZW9mKCppbm9kZV9pdGVtKSk7CisJaW5vZGVfaXRlbS0+Z2VuZXJhdGlvbiA9IGNwdV90b19sZTY0KDEpOworCWlub2RlX2l0ZW0tPnNpemUgPSBjcHVfdG9fbGU2NCgzKTsKKwlpbm9kZV9pdGVtLT5ubGluayA9IGNwdV90b19sZTMyKDEpOworCWlub2RlX2l0ZW0tPm5ieXRlcyA9IGNwdV90b19sZTY0KHJvb3QtPmxlYWZzaXplKTsKKwlpbm9kZV9pdGVtLT5tb2RlID0gY3B1X3RvX2xlMzIoU19JRkRJUiB8IDA3NTUpOworCisJYnRyZnNfc2V0X3Jvb3RfYnl0ZW5yKCZyb290X2l0ZW0sIGxlYWYtPnN0YXJ0KTsKKwlidHJmc19zZXRfcm9vdF9nZW5lcmF0aW9uKCZyb290X2l0ZW0sIHRyYW5zLT50cmFuc2lkKTsKKwlidHJmc19zZXRfcm9vdF9sZXZlbCgmcm9vdF9pdGVtLCAwKTsKKwlidHJmc19zZXRfcm9vdF9yZWZzKCZyb290X2l0ZW0sIDEpOworCWJ0cmZzX3NldF9yb290X3VzZWQoJnJvb3RfaXRlbSwgMCk7CisJYnRyZnNfc2V0X3Jvb3RfbGFzdF9zbmFwc2hvdCgmcm9vdF9pdGVtLCAwKTsKKworCW1lbXNldCgmcm9vdF9pdGVtLmRyb3BfcHJvZ3Jlc3MsIDAsIHNpemVvZihyb290X2l0ZW0uZHJvcF9wcm9ncmVzcykpOworCXJvb3RfaXRlbS5kcm9wX2xldmVsID0gMDsKKworCWJ0cmZzX3RyZWVfdW5sb2NrKGxlYWYpOworCWZyZWVfZXh0ZW50X2J1ZmZlcihsZWFmKTsKKwlsZWFmID0gTlVMTDsKKworCWJ0cmZzX3NldF9yb290X2RpcmlkKCZyb290X2l0ZW0sIG5ld19kaXJpZCk7CisKKwlrZXkub2JqZWN0aWQgPSBvYmplY3RpZDsKKwlrZXkub2Zmc2V0ID0gMTsKKwlidHJmc19zZXRfa2V5X3R5cGUoJmtleSwgQlRSRlNfUk9PVF9JVEVNX0tFWSk7CisJcmV0ID0gYnRyZnNfaW5zZXJ0X3Jvb3QodHJhbnMsIHJvb3QtPmZzX2luZm8tPnRyZWVfcm9vdCwgJmtleSwKKwkJCQkmcm9vdF9pdGVtKTsKKwlpZiAocmV0KQorCQlnb3RvIGZhaWw7CisKKwkvKgorCSAqIGluc2VydCB0aGUgZGlyZWN0b3J5IGl0ZW0KKwkgKi8KKwlrZXkub2Zmc2V0ID0gKHU2NCktMTsKKwlkaXIgPSBkZW50cnktPmRfcGFyZW50LT5kX2lub2RlOworCXJldCA9IGJ0cmZzX3NldF9pbm9kZV9pbmRleChkaXIsICZpbmRleCk7CisJQlVHX09OKHJldCk7CisKKwlyZXQgPSBidHJmc19pbnNlcnRfZGlyX2l0ZW0odHJhbnMsIHJvb3QsCisJCQkJICAgIG5hbWUsIG5hbWVsZW4sIGRpci0+aV9pbm8sICZrZXksCisJCQkJICAgIEJUUkZTX0ZUX0RJUiwgaW5kZXgpOworCWlmIChyZXQpCisJCWdvdG8gZmFpbDsKKworCWJ0cmZzX2lfc2l6ZV93cml0ZShkaXIsIGRpci0+aV9zaXplICsgbmFtZWxlbiAqIDIpOworCXJldCA9IGJ0cmZzX3VwZGF0ZV9pbm9kZSh0cmFucywgcm9vdCwgZGlyKTsKKwlCVUdfT04ocmV0KTsKKworCS8qIGFkZCB0aGUgYmFja3JlZiBmaXJzdCAqLworCXJldCA9IGJ0cmZzX2FkZF9yb290X3JlZih0cmFucywgcm9vdC0+ZnNfaW5mby0+dHJlZV9yb290LAorCQkJCSBvYmplY3RpZCwgQlRSRlNfUk9PVF9CQUNLUkVGX0tFWSwKKwkJCQkgcm9vdC0+cm9vdF9rZXkub2JqZWN0aWQsCisJCQkJIGRpci0+aV9pbm8sIGluZGV4LCBuYW1lLCBuYW1lbGVuKTsKKworCUJVR19PTihyZXQpOworCisJLyogbm93IGFkZCB0aGUgZm9yd2FyZCByZWYgKi8KKwlyZXQgPSBidHJmc19hZGRfcm9vdF9yZWYodHJhbnMsIHJvb3QtPmZzX2luZm8tPnRyZWVfcm9vdCwKKwkJCQkgcm9vdC0+cm9vdF9rZXkub2JqZWN0aWQsIEJUUkZTX1JPT1RfUkVGX0tFWSwKKwkJCQkgb2JqZWN0aWQsCisJCQkJIGRpci0+aV9pbm8sIGluZGV4LCBuYW1lLCBuYW1lbGVuKTsKKworCUJVR19PTihyZXQpOworCisJcmV0ID0gYnRyZnNfY29tbWl0X3RyYW5zYWN0aW9uKHRyYW5zLCByb290KTsKKwlpZiAocmV0KQorCQlnb3RvIGZhaWxfY29tbWl0OworCisJbmV3X3Jvb3QgPSBidHJmc19yZWFkX2ZzX3Jvb3Rfbm9fbmFtZShyb290LT5mc19pbmZvLCAma2V5KTsKKwlCVUdfT04oIW5ld19yb290KTsKKworCXRyYW5zID0gYnRyZnNfc3RhcnRfdHJhbnNhY3Rpb24obmV3X3Jvb3QsIDEpOworCUJVR19PTighdHJhbnMpOworCisJcmV0ID0gYnRyZnNfY3JlYXRlX3N1YnZvbF9yb290KHRyYW5zLCBuZXdfcm9vdCwgZGVudHJ5LCBuZXdfZGlyaWQsCisJCQkJICAgICAgIEJUUkZTX0koZGlyKS0+YmxvY2tfZ3JvdXApOworCWlmIChyZXQpCisJCWdvdG8gZmFpbDsKKworZmFpbDoKKwluciA9IHRyYW5zLT5ibG9ja3NfdXNlZDsKKwllcnIgPSBidHJmc19jb21taXRfdHJhbnNhY3Rpb24odHJhbnMsIG5ld19yb290KTsKKwlpZiAoZXJyICYmICFyZXQpCisJCXJldCA9IGVycjsKK2ZhaWxfY29tbWl0OgorCWJ0cmZzX2J0cmVlX2JhbGFuY2VfZGlydHkocm9vdCwgbnIpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgY3JlYXRlX3NuYXBzaG90KHN0cnVjdCBidHJmc19yb290ICpyb290LCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksCisJCQkgICBjaGFyICpuYW1lLCBpbnQgbmFtZWxlbikKK3sKKwlzdHJ1Y3QgYnRyZnNfcGVuZGluZ19zbmFwc2hvdCAqcGVuZGluZ19zbmFwc2hvdDsKKwlzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFuczsKKwlpbnQgcmV0ID0gMDsKKwlpbnQgZXJyOworCXVuc2lnbmVkIGxvbmcgbnIgPSAwOworCisJaWYgKCFyb290LT5yZWZfY293cykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXQgPSBidHJmc19jaGVja19mcmVlX3NwYWNlKHJvb3QsIDEsIDApOworCWlmIChyZXQpCisJCWdvdG8gZmFpbF91bmxvY2s7CisKKwlwZW5kaW5nX3NuYXBzaG90ID0ga3phbGxvYyhzaXplb2YoKnBlbmRpbmdfc25hcHNob3QpLCBHRlBfTk9GUyk7CisJaWYgKCFwZW5kaW5nX3NuYXBzaG90KSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZmFpbF91bmxvY2s7CisJfQorCXBlbmRpbmdfc25hcHNob3QtPm5hbWUgPSBrbWFsbG9jKG5hbWVsZW4gKyAxLCBHRlBfTk9GUyk7CisJaWYgKCFwZW5kaW5nX3NuYXBzaG90LT5uYW1lKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWtmcmVlKHBlbmRpbmdfc25hcHNob3QpOworCQlnb3RvIGZhaWxfdW5sb2NrOworCX0KKwltZW1jcHkocGVuZGluZ19zbmFwc2hvdC0+bmFtZSwgbmFtZSwgbmFtZWxlbik7CisJcGVuZGluZ19zbmFwc2hvdC0+bmFtZVtuYW1lbGVuXSA9ICdcMCc7CisJcGVuZGluZ19zbmFwc2hvdC0+ZGVudHJ5ID0gZGVudHJ5OworCXRyYW5zID0gYnRyZnNfc3RhcnRfdHJhbnNhY3Rpb24ocm9vdCwgMSk7CisJQlVHX09OKCF0cmFucyk7CisJcGVuZGluZ19zbmFwc2hvdC0+cm9vdCA9IHJvb3Q7CisJbGlzdF9hZGQoJnBlbmRpbmdfc25hcHNob3QtPmxpc3QsCisJCSAmdHJhbnMtPnRyYW5zYWN0aW9uLT5wZW5kaW5nX3NuYXBzaG90cyk7CisJZXJyID0gYnRyZnNfY29tbWl0X3RyYW5zYWN0aW9uKHRyYW5zLCByb290KTsKKworZmFpbF91bmxvY2s6CisJYnRyZnNfYnRyZWVfYmFsYW5jZV9kaXJ0eShyb290LCBucik7CisJcmV0dXJuIHJldDsKK30KKworLyogY29weSBvZiBtYXlfY3JlYXRlIGluIGZzL25hbWVpLmMoKSAqLworc3RhdGljIGlubGluZSBpbnQgYnRyZnNfbWF5X2NyZWF0ZShzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqY2hpbGQpCit7CisJaWYgKGNoaWxkLT5kX2lub2RlKQorCQlyZXR1cm4gLUVFWElTVDsKKwlpZiAoSVNfREVBRERJUihkaXIpKQorCQlyZXR1cm4gLUVOT0VOVDsKKwlyZXR1cm4gaW5vZGVfcGVybWlzc2lvbihkaXIsIE1BWV9XUklURSB8IE1BWV9FWEVDKTsKK30KKworLyoKKyAqIENyZWF0ZSBhIG5ldyBzdWJ2b2x1bWUgYmVsb3cgQHBhcmVudC4gIFRoaXMgaXMgbGFyZ2VseSBtb2RlbGVkIGFmdGVyCisgKiBzeXNfbWtkaXJhdCBhbmQgdmZzX21rZGlyLCBidXQgd2Ugb25seSBkbyBhIHNpbmdsZSBjb21wb25lbnQgbG9va3VwCisgKiBpbnNpZGUgdGhpcyBmaWxlc3lzdGVtIHNvIGl0J3MgcXVpdGUgYSBiaXQgc2ltcGxlci4KKyAqLworc3RhdGljIG5vaW5saW5lIGludCBidHJmc19ta3N1YnZvbChzdHJ1Y3QgcGF0aCAqcGFyZW50LCBjaGFyICpuYW1lLAorCQkJCSAgIGludCBtb2RlLCBpbnQgbmFtZWxlbiwKKwkJCQkgICBzdHJ1Y3QgYnRyZnNfcm9vdCAqc25hcF9zcmMpCit7CisJc3RydWN0IGRlbnRyeSAqZGVudHJ5OworCWludCBlcnJvcjsKKworCW11dGV4X2xvY2tfbmVzdGVkKCZwYXJlbnQtPmRlbnRyeS0+ZF9pbm9kZS0+aV9tdXRleCwgSV9NVVRFWF9QQVJFTlQpOworCisJZGVudHJ5ID0gbG9va3VwX29uZV9sZW4obmFtZSwgcGFyZW50LT5kZW50cnksIG5hbWVsZW4pOworCWVycm9yID0gUFRSX0VSUihkZW50cnkpOworCWlmIChJU19FUlIoZGVudHJ5KSkKKwkJZ290byBvdXRfdW5sb2NrOworCisJZXJyb3IgPSAtRUVYSVNUOworCWlmIChkZW50cnktPmRfaW5vZGUpCisJCWdvdG8gb3V0X2RwdXQ7CisKKwlpZiAoIUlTX1BPU0lYQUNMKHBhcmVudC0+ZGVudHJ5LT5kX2lub2RlKSkKKwkJbW9kZSAmPSB+Y3VycmVudC0+ZnMtPnVtYXNrOworCisJZXJyb3IgPSBtbnRfd2FudF93cml0ZShwYXJlbnQtPm1udCk7CisJaWYgKGVycm9yKQorCQlnb3RvIG91dF9kcHV0OworCisJZXJyb3IgPSBidHJmc19tYXlfY3JlYXRlKHBhcmVudC0+ZGVudHJ5LT5kX2lub2RlLCBkZW50cnkpOworCWlmIChlcnJvcikKKwkJZ290byBvdXRfZHJvcF93cml0ZTsKKworCS8qCisJICogQWN0dWFsbHkgcGVyZm9ybSB0aGUgbG93LWxldmVsIHN1YnZvbHVtZSBjcmVhdGlvbiBhZnRlciBhbGwKKwkgKiB0aGlzIFZGUyBmdXp6LgorCSAqCisJICogRXZlbnR1YWxseSB3ZSB3YW50IHRvIHBhc3MgaW4gYW4gaW5vZGUgdW5kZXIgd2hpY2ggd2UgY3JlYXRlIHRoaXMKKwkgKiBzdWJ2b2x1bWUsIGJ1dCBmb3Igbm93IGFsbCBhcmUgdW5kZXIgdGhlIGZpbGVzeXN0ZW0gcm9vdC4KKwkgKgorCSAqIEFsc28gd2Ugc2hvdWxkIHBhc3Mgb24gdGhlIG1vZGUgZXZlbnR1YWxseSB0byBhbGxvdyBjcmVhdGluZyBuZXcKKwkgKiBzdWJ2b2x1bWUgd2l0aCBzcGVjaWZpYyBtb2RlIGJpdHMuCisJICovCisJaWYgKHNuYXBfc3JjKSB7CisJCXN0cnVjdCBkZW50cnkgKmRpciA9IGRlbnRyeS0+ZF9wYXJlbnQ7CisJCXN0cnVjdCBkZW50cnkgKnRlc3QgPSBkaXItPmRfcGFyZW50OworCQlzdHJ1Y3QgYnRyZnNfcGF0aCAqcGF0aCA9IGJ0cmZzX2FsbG9jX3BhdGgoKTsKKwkJaW50IHJldDsKKwkJdTY0IHRlc3Rfb2lkOworCQl1NjQgcGFyZW50X29pZCA9IEJUUkZTX0koZGlyLT5kX2lub2RlKS0+cm9vdC0+cm9vdF9rZXkub2JqZWN0aWQ7CisKKwkJdGVzdF9vaWQgPSBzbmFwX3NyYy0+cm9vdF9rZXkub2JqZWN0aWQ7CisKKwkJcmV0ID0gYnRyZnNfZmluZF9yb290X3JlZihzbmFwX3NyYy0+ZnNfaW5mby0+dHJlZV9yb290LAorCQkJCQkgIHBhdGgsIHBhcmVudF9vaWQsIHRlc3Rfb2lkKTsKKwkJaWYgKHJldCA9PSAwKQorCQkJZ290byBjcmVhdGU7CisJCWJ0cmZzX3JlbGVhc2VfcGF0aChzbmFwX3NyYy0+ZnNfaW5mby0+dHJlZV9yb290LCBwYXRoKTsKKworCQkvKiB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSB3ZSBhcmVuJ3QgY3JlYXRpbmcgYSBkaXJlY3RvcnkgbG9vcAorCQkgKiBieSB0YWtpbmcgYSBzbmFwc2hvdCBvZiBzb21ldGhpbmcgdGhhdCBoYXMgb3VyIGN1cnJlbnQKKwkJICogc3Vidm9sIGluIGl0cyBkaXJlY3RvcnkgdHJlZS4gIFNvLCB0aGlzIGxvb3BzIHRocm91Z2gKKwkJICogdGhlIGRlbnRyaWVzIGFuZCBjaGVja3MgdGhlIGZvcndhcmQgcmVmcyBmb3IgZWFjaCBzdWJ2b2x1bWUKKwkJICogdG8gc2VlIGlmIGlzIHJlZmVyZW5jZXMgdGhlIHN1YnZvbHVtZSB3aGVyZSB3ZSBhcmUKKwkJICogcGxhY2luZyB0aGlzIG5ldyBzbmFwc2hvdC4KKwkJICovCisJCXdoaWxlICgxKSB7CisJCQlpZiAoIXRlc3QgfHwKKwkJCSAgICBkaXIgPT0gc25hcF9zcmMtPmZzX2luZm8tPnNiLT5zX3Jvb3QgfHwKKwkJCSAgICB0ZXN0ID09IHNuYXBfc3JjLT5mc19pbmZvLT5zYi0+c19yb290IHx8CisJCQkgICAgdGVzdC0+ZF9pbm9kZS0+aV9zYiAhPSBzbmFwX3NyYy0+ZnNfaW5mby0+c2IpIHsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmIChTX0lTTE5LKHRlc3QtPmRfaW5vZGUtPmlfbW9kZSkpIHsKKwkJCQlwcmludGsoS0VSTl9JTkZPICJCdHJmcyBzeW1saW5rIGluIHNuYXBzaG90ICIKKwkJCQkgICAgICAgInBhdGgsIGZhaWxlZFxuIik7CisJCQkJZXJyb3IgPSAtRU1MSU5LOworCQkJCWJ0cmZzX2ZyZWVfcGF0aChwYXRoKTsKKwkJCQlnb3RvIG91dF9kcm9wX3dyaXRlOworCQkJfQorCQkJdGVzdF9vaWQgPQorCQkJCUJUUkZTX0kodGVzdC0+ZF9pbm9kZSktPnJvb3QtPnJvb3Rfa2V5Lm9iamVjdGlkOworCQkJcmV0ID0gYnRyZnNfZmluZF9yb290X3JlZihzbmFwX3NyYy0+ZnNfaW5mby0+dHJlZV9yb290LAorCQkJCSAgcGF0aCwgdGVzdF9vaWQsIHBhcmVudF9vaWQpOworCQkJaWYgKHJldCA9PSAwKSB7CisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiQnRyZnMgc25hcHNob3QgY3JlYXRpb24gIgorCQkJCSAgICAgICAiZmFpbGVkLCBsb29waW5nXG4iKTsKKwkJCQllcnJvciA9IC1FTUxJTks7CisJCQkJYnRyZnNfZnJlZV9wYXRoKHBhdGgpOworCQkJCWdvdG8gb3V0X2Ryb3Bfd3JpdGU7CisJCQl9CisJCQlidHJmc19yZWxlYXNlX3BhdGgoc25hcF9zcmMtPmZzX2luZm8tPnRyZWVfcm9vdCwgcGF0aCk7CisJCQl0ZXN0ID0gdGVzdC0+ZF9wYXJlbnQ7CisJCX0KK2NyZWF0ZToKKwkJYnRyZnNfZnJlZV9wYXRoKHBhdGgpOworCQllcnJvciA9IGNyZWF0ZV9zbmFwc2hvdChzbmFwX3NyYywgZGVudHJ5LCBuYW1lLCBuYW1lbGVuKTsKKwl9IGVsc2UgeworCQllcnJvciA9IGNyZWF0ZV9zdWJ2b2woQlRSRlNfSShwYXJlbnQtPmRlbnRyeS0+ZF9pbm9kZSktPnJvb3QsCisJCQkJICAgICAgZGVudHJ5LCBuYW1lLCBuYW1lbGVuKTsKKwl9CisJaWYgKGVycm9yKQorCQlnb3RvIG91dF9kcm9wX3dyaXRlOworCisJZnNub3RpZnlfbWtkaXIocGFyZW50LT5kZW50cnktPmRfaW5vZGUsIGRlbnRyeSk7CitvdXRfZHJvcF93cml0ZToKKwltbnRfZHJvcF93cml0ZShwYXJlbnQtPm1udCk7CitvdXRfZHB1dDoKKwlkcHV0KGRlbnRyeSk7CitvdXRfdW5sb2NrOgorCW11dGV4X3VubG9jaygmcGFyZW50LT5kZW50cnktPmRfaW5vZGUtPmlfbXV0ZXgpOworCXJldHVybiBlcnJvcjsKK30KKworCitzdGF0aWMgaW50IGJ0cmZzX2RlZnJhZ19maWxlKHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmZGVudHJ5KGZpbGUpLT5kX2lub2RlOworCXN0cnVjdCBidHJmc19yb290ICpyb290ID0gQlRSRlNfSShpbm9kZSktPnJvb3Q7CisJc3RydWN0IGV4dGVudF9pb190cmVlICppb190cmVlID0gJkJUUkZTX0koaW5vZGUpLT5pb190cmVlOworCXN0cnVjdCBidHJmc19vcmRlcmVkX2V4dGVudCAqb3JkZXJlZDsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwl1bnNpZ25lZCBsb25nIGxhc3RfaW5kZXg7CisJdW5zaWduZWQgbG9uZyByYV9wYWdlcyA9IHJvb3QtPmZzX2luZm8tPmJkaS5yYV9wYWdlczsKKwl1bnNpZ25lZCBsb25nIHRvdGFsX3JlYWQgPSAwOworCXU2NCBwYWdlX3N0YXJ0OworCXU2NCBwYWdlX2VuZDsKKwl1bnNpZ25lZCBsb25nIGk7CisJaW50IHJldDsKKworCXJldCA9IGJ0cmZzX2NoZWNrX2ZyZWVfc3BhY2Uocm9vdCwgaW5vZGUtPmlfc2l6ZSwgMCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIC1FTk9TUEM7CisKKwltdXRleF9sb2NrKCZpbm9kZS0+aV9tdXRleCk7CisJbGFzdF9pbmRleCA9IGlub2RlLT5pX3NpemUgPj4gUEFHRV9DQUNIRV9TSElGVDsKKwlmb3IgKGkgPSAwOyBpIDw9IGxhc3RfaW5kZXg7IGkrKykgeworCQlpZiAodG90YWxfcmVhZCAlIHJhX3BhZ2VzID09IDApIHsKKwkJCWJ0cmZzX2ZvcmNlX3JhKGlub2RlLT5pX21hcHBpbmcsICZmaWxlLT5mX3JhLCBmaWxlLCBpLAorCQkJCSAgICAgICBtaW4obGFzdF9pbmRleCwgaSArIHJhX3BhZ2VzIC0gMSkpOworCQl9CisJCXRvdGFsX3JlYWQrKzsKK2FnYWluOgorCQlwYWdlID0gZ3JhYl9jYWNoZV9wYWdlKGlub2RlLT5pX21hcHBpbmcsIGkpOworCQlpZiAoIXBhZ2UpCisJCQlnb3RvIG91dF91bmxvY2s7CisJCWlmICghUGFnZVVwdG9kYXRlKHBhZ2UpKSB7CisJCQlidHJmc19yZWFkcGFnZShOVUxMLCBwYWdlKTsKKwkJCWxvY2tfcGFnZShwYWdlKTsKKwkJCWlmICghUGFnZVVwdG9kYXRlKHBhZ2UpKSB7CisJCQkJdW5sb2NrX3BhZ2UocGFnZSk7CisJCQkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOworCQkJCWdvdG8gb3V0X3VubG9jazsKKwkJCX0KKwkJfQorCisJCXdhaXRfb25fcGFnZV93cml0ZWJhY2socGFnZSk7CisKKwkJcGFnZV9zdGFydCA9ICh1NjQpcGFnZS0+aW5kZXggPDwgUEFHRV9DQUNIRV9TSElGVDsKKwkJcGFnZV9lbmQgPSBwYWdlX3N0YXJ0ICsgUEFHRV9DQUNIRV9TSVpFIC0gMTsKKwkJbG9ja19leHRlbnQoaW9fdHJlZSwgcGFnZV9zdGFydCwgcGFnZV9lbmQsIEdGUF9OT0ZTKTsKKworCQlvcmRlcmVkID0gYnRyZnNfbG9va3VwX29yZGVyZWRfZXh0ZW50KGlub2RlLCBwYWdlX3N0YXJ0KTsKKwkJaWYgKG9yZGVyZWQpIHsKKwkJCXVubG9ja19leHRlbnQoaW9fdHJlZSwgcGFnZV9zdGFydCwgcGFnZV9lbmQsIEdGUF9OT0ZTKTsKKwkJCXVubG9ja19wYWdlKHBhZ2UpOworCQkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOworCQkJYnRyZnNfc3RhcnRfb3JkZXJlZF9leHRlbnQoaW5vZGUsIG9yZGVyZWQsIDEpOworCQkJYnRyZnNfcHV0X29yZGVyZWRfZXh0ZW50KG9yZGVyZWQpOworCQkJZ290byBhZ2FpbjsKKwkJfQorCQlzZXRfcGFnZV9leHRlbnRfbWFwcGVkKHBhZ2UpOworCisJCS8qCisJCSAqIHRoaXMgbWFrZXMgc3VyZSBwYWdlX21rd3JpdGUgaXMgY2FsbGVkIG9uIHRoZQorCQkgKiBwYWdlIGlmIGl0IGlzIGRpcnRpZWQgYWdhaW4gbGF0ZXIKKwkJICovCisJCWNsZWFyX3BhZ2VfZGlydHlfZm9yX2lvKHBhZ2UpOworCisJCWJ0cmZzX3NldF9leHRlbnRfZGVsYWxsb2MoaW5vZGUsIHBhZ2Vfc3RhcnQsIHBhZ2VfZW5kKTsKKworCQl1bmxvY2tfZXh0ZW50KGlvX3RyZWUsIHBhZ2Vfc3RhcnQsIHBhZ2VfZW5kLCBHRlBfTk9GUyk7CisJCXNldF9wYWdlX2RpcnR5KHBhZ2UpOworCQl1bmxvY2tfcGFnZShwYWdlKTsKKwkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOworCQliYWxhbmNlX2RpcnR5X3BhZ2VzX3JhdGVsaW1pdGVkX25yKGlub2RlLT5pX21hcHBpbmcsIDEpOworCX0KKworb3V0X3VubG9jazoKKwltdXRleF91bmxvY2soJmlub2RlLT5pX211dGV4KTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIENhbGxlZCBpbnNpZGUgdHJhbnNhY3Rpb24sIHNvIHVzZSBHRlBfTk9GUworICovCisKK3N0YXRpYyBpbnQgYnRyZnNfaW9jdGxfcmVzaXplKHN0cnVjdCBidHJmc19yb290ICpyb290LCB2b2lkIF9fdXNlciAqYXJnKQoreworCXU2NCBuZXdfc2l6ZTsKKwl1NjQgb2xkX3NpemU7CisJdTY0IGRldmlkID0gMTsKKwlzdHJ1Y3QgYnRyZnNfaW9jdGxfdm9sX2FyZ3MgKnZvbF9hcmdzOworCXN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zOworCXN0cnVjdCBidHJmc19kZXZpY2UgKmRldmljZSA9IE5VTEw7CisJY2hhciAqc2l6ZXN0cjsKKwljaGFyICpkZXZzdHIgPSBOVUxMOworCWludCByZXQgPSAwOworCWludCBuYW1lbGVuOworCWludCBtb2QgPSAwOworCisJaWYgKHJvb3QtPmZzX2luZm8tPnNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKQorCQlyZXR1cm4gLUVST0ZTOworCisJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQorCQlyZXR1cm4gLUVQRVJNOworCisJdm9sX2FyZ3MgPSBrbWFsbG9jKHNpemVvZigqdm9sX2FyZ3MpLCBHRlBfTk9GUyk7CisKKwlpZiAoIXZvbF9hcmdzKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWlmIChjb3B5X2Zyb21fdXNlcih2b2xfYXJncywgYXJnLCBzaXplb2YoKnZvbF9hcmdzKSkpIHsKKwkJcmV0ID0gLUVGQVVMVDsKKwkJZ290byBvdXQ7CisJfQorCisJdm9sX2FyZ3MtPm5hbWVbQlRSRlNfUEFUSF9OQU1FX01BWF0gPSAnXDAnOworCW5hbWVsZW4gPSBzdHJsZW4odm9sX2FyZ3MtPm5hbWUpOworCisJbXV0ZXhfbG9jaygmcm9vdC0+ZnNfaW5mby0+dm9sdW1lX211dGV4KTsKKwlzaXplc3RyID0gdm9sX2FyZ3MtPm5hbWU7CisJZGV2c3RyID0gc3RyY2hyKHNpemVzdHIsICc6Jyk7CisJaWYgKGRldnN0cikgeworCQljaGFyICplbmQ7CisJCXNpemVzdHIgPSBkZXZzdHIgKyAxOworCQkqZGV2c3RyID0gJ1wwJzsKKwkJZGV2c3RyID0gdm9sX2FyZ3MtPm5hbWU7CisJCWRldmlkID0gc2ltcGxlX3N0cnRvdWxsKGRldnN0ciwgJmVuZCwgMTApOworCQlwcmludGsoS0VSTl9JTkZPICJyZXNpemluZyBkZXZpZCAlbGx1XG4iLCBkZXZpZCk7CisJfQorCWRldmljZSA9IGJ0cmZzX2ZpbmRfZGV2aWNlKHJvb3QsIGRldmlkLCBOVUxMLCBOVUxMKTsKKwlpZiAoIWRldmljZSkgeworCQlwcmludGsoS0VSTl9JTkZPICJyZXNpemVyIHVuYWJsZSB0byBmaW5kIGRldmljZSAlbGx1XG4iLCBkZXZpZCk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gb3V0X3VubG9jazsKKwl9CisJaWYgKCFzdHJjbXAoc2l6ZXN0ciwgIm1heCIpKQorCQluZXdfc2l6ZSA9IGRldmljZS0+YmRldi0+YmRfaW5vZGUtPmlfc2l6ZTsKKwllbHNlIHsKKwkJaWYgKHNpemVzdHJbMF0gPT0gJy0nKSB7CisJCQltb2QgPSAtMTsKKwkJCXNpemVzdHIrKzsKKwkJfSBlbHNlIGlmIChzaXplc3RyWzBdID09ICcrJykgeworCQkJbW9kID0gMTsKKwkJCXNpemVzdHIrKzsKKwkJfQorCQluZXdfc2l6ZSA9IGJ0cmZzX3BhcnNlX3NpemUoc2l6ZXN0cik7CisJCWlmIChuZXdfc2l6ZSA9PSAwKSB7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJZ290byBvdXRfdW5sb2NrOworCQl9CisJfQorCisJb2xkX3NpemUgPSBkZXZpY2UtPnRvdGFsX2J5dGVzOworCisJaWYgKG1vZCA8IDApIHsKKwkJaWYgKG5ld19zaXplID4gb2xkX3NpemUpIHsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlnb3RvIG91dF91bmxvY2s7CisJCX0KKwkJbmV3X3NpemUgPSBvbGRfc2l6ZSAtIG5ld19zaXplOworCX0gZWxzZSBpZiAobW9kID4gMCkgeworCQluZXdfc2l6ZSA9IG9sZF9zaXplICsgbmV3X3NpemU7CisJfQorCisJaWYgKG5ld19zaXplIDwgMjU2ICogMTAyNCAqIDEwMjQpIHsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBvdXRfdW5sb2NrOworCX0KKwlpZiAobmV3X3NpemUgPiBkZXZpY2UtPmJkZXYtPmJkX2lub2RlLT5pX3NpemUpIHsKKwkJcmV0ID0gLUVGQklHOworCQlnb3RvIG91dF91bmxvY2s7CisJfQorCisJZG9fZGl2KG5ld19zaXplLCByb290LT5zZWN0b3JzaXplKTsKKwluZXdfc2l6ZSAqPSByb290LT5zZWN0b3JzaXplOworCisJcHJpbnRrKEtFUk5fSU5GTyAibmV3IHNpemUgZm9yICVzIGlzICVsbHVcbiIsCisJCWRldmljZS0+bmFtZSwgKHVuc2lnbmVkIGxvbmcgbG9uZyluZXdfc2l6ZSk7CisKKwlpZiAobmV3X3NpemUgPiBvbGRfc2l6ZSkgeworCQl0cmFucyA9IGJ0cmZzX3N0YXJ0X3RyYW5zYWN0aW9uKHJvb3QsIDEpOworCQlyZXQgPSBidHJmc19ncm93X2RldmljZSh0cmFucywgZGV2aWNlLCBuZXdfc2l6ZSk7CisJCWJ0cmZzX2NvbW1pdF90cmFuc2FjdGlvbih0cmFucywgcm9vdCk7CisJfSBlbHNlIHsKKwkJcmV0ID0gYnRyZnNfc2hyaW5rX2RldmljZShkZXZpY2UsIG5ld19zaXplKTsKKwl9CisKK291dF91bmxvY2s6CisJbXV0ZXhfdW5sb2NrKCZyb290LT5mc19pbmZvLT52b2x1bWVfbXV0ZXgpOworb3V0OgorCWtmcmVlKHZvbF9hcmdzKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgbm9pbmxpbmUgaW50IGJ0cmZzX2lvY3RsX3NuYXBfY3JlYXRlKHN0cnVjdCBmaWxlICpmaWxlLAorCQkJCQkgICAgdm9pZCBfX3VzZXIgKmFyZywgaW50IHN1YnZvbCkKK3sKKwlzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCA9IEJUUkZTX0koZmRlbnRyeShmaWxlKS0+ZF9pbm9kZSktPnJvb3Q7CisJc3RydWN0IGJ0cmZzX2lvY3RsX3ZvbF9hcmdzICp2b2xfYXJnczsKKwlzdHJ1Y3QgYnRyZnNfZGlyX2l0ZW0gKmRpOworCXN0cnVjdCBidHJmc19wYXRoICpwYXRoOworCXN0cnVjdCBmaWxlICpzcmNfZmlsZTsKKwl1NjQgcm9vdF9kaXJpZDsKKwlpbnQgbmFtZWxlbjsKKwlpbnQgcmV0ID0gMDsKKworCWlmIChyb290LT5mc19pbmZvLT5zYi0+c19mbGFncyAmIE1TX1JET05MWSkKKwkJcmV0dXJuIC1FUk9GUzsKKworCXZvbF9hcmdzID0ga21hbGxvYyhzaXplb2YoKnZvbF9hcmdzKSwgR0ZQX05PRlMpOworCisJaWYgKCF2b2xfYXJncykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpZiAoY29weV9mcm9tX3VzZXIodm9sX2FyZ3MsIGFyZywgc2l6ZW9mKCp2b2xfYXJncykpKSB7CisJCXJldCA9IC1FRkFVTFQ7CisJCWdvdG8gb3V0OworCX0KKworCXZvbF9hcmdzLT5uYW1lW0JUUkZTX1BBVEhfTkFNRV9NQVhdID0gJ1wwJzsKKwluYW1lbGVuID0gc3RybGVuKHZvbF9hcmdzLT5uYW1lKTsKKwlpZiAoc3RyY2hyKHZvbF9hcmdzLT5uYW1lLCAnLycpKSB7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKworCXBhdGggPSBidHJmc19hbGxvY19wYXRoKCk7CisJaWYgKCFwYXRoKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gb3V0OworCX0KKworCXJvb3RfZGlyaWQgPSByb290LT5mc19pbmZvLT5zYi0+c19yb290LT5kX2lub2RlLT5pX2lubywKKwlkaSA9IGJ0cmZzX2xvb2t1cF9kaXJfaXRlbShOVUxMLCByb290LT5mc19pbmZvLT50cmVlX3Jvb3QsCisJCQkgICAgcGF0aCwgcm9vdF9kaXJpZCwKKwkJCSAgICB2b2xfYXJncy0+bmFtZSwgbmFtZWxlbiwgMCk7CisJYnRyZnNfZnJlZV9wYXRoKHBhdGgpOworCisJaWYgKGRpICYmICFJU19FUlIoZGkpKSB7CisJCXJldCA9IC1FRVhJU1Q7CisJCWdvdG8gb3V0OworCX0KKworCWlmIChJU19FUlIoZGkpKSB7CisJCXJldCA9IFBUUl9FUlIoZGkpOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoc3Vidm9sKSB7CisJCXJldCA9IGJ0cmZzX21rc3Vidm9sKCZmaWxlLT5mX3BhdGgsIHZvbF9hcmdzLT5uYW1lLAorCQkJCSAgICAgZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZS0+aV9tb2RlLAorCQkJCSAgICAgbmFtZWxlbiwgTlVMTCk7CisJfSBlbHNlIHsKKwkJc3RydWN0IGlub2RlICpzcmNfaW5vZGU7CisJCXNyY19maWxlID0gZmdldCh2b2xfYXJncy0+ZmQpOworCQlpZiAoIXNyY19maWxlKSB7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJZ290byBvdXQ7CisJCX0KKworCQlzcmNfaW5vZGUgPSBzcmNfZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZTsKKwkJaWYgKHNyY19pbm9kZS0+aV9zYiAhPSBmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlLT5pX3NiKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICJidHJmczogU25hcHNob3Qgc3JjIGZyb20gIgorCQkJICAgICAgICJhbm90aGVyIEZTXG4iKTsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlmcHV0KHNyY19maWxlKTsKKwkJCWdvdG8gb3V0OworCQl9CisJCXJldCA9IGJ0cmZzX21rc3Vidm9sKCZmaWxlLT5mX3BhdGgsIHZvbF9hcmdzLT5uYW1lLAorCQkJICAgICBmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlLT5pX21vZGUsCisJCQkgICAgIG5hbWVsZW4sIEJUUkZTX0koc3JjX2lub2RlKS0+cm9vdCk7CisJCWZwdXQoc3JjX2ZpbGUpOworCX0KKworb3V0OgorCWtmcmVlKHZvbF9hcmdzKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGJ0cmZzX2lvY3RsX2RlZnJhZyhzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmRlbnRyeShmaWxlKS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCA9IEJUUkZTX0koaW5vZGUpLT5yb290OworCWludCByZXQ7CisKKwlyZXQgPSBtbnRfd2FudF93cml0ZShmaWxlLT5mX3BhdGgubW50KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJc3dpdGNoIChpbm9kZS0+aV9tb2RlICYgU19JRk1UKSB7CisJY2FzZSBTX0lGRElSOgorCQlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpIHsKKwkJCXJldCA9IC1FUEVSTTsKKwkJCWdvdG8gb3V0OworCQl9CisJCWJ0cmZzX2RlZnJhZ19yb290KHJvb3QsIDApOworCQlidHJmc19kZWZyYWdfcm9vdChyb290LT5mc19pbmZvLT5leHRlbnRfcm9vdCwgMCk7CisJCWJyZWFrOworCWNhc2UgU19JRlJFRzoKKwkJaWYgKCEoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpKSB7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJZ290byBvdXQ7CisJCX0KKwkJYnRyZnNfZGVmcmFnX2ZpbGUoZmlsZSk7CisJCWJyZWFrOworCX0KK291dDoKKwltbnRfZHJvcF93cml0ZShmaWxlLT5mX3BhdGgubW50KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgbG9uZyBidHJmc19pb2N0bF9hZGRfZGV2KHN0cnVjdCBidHJmc19yb290ICpyb290LCB2b2lkIF9fdXNlciAqYXJnKQoreworCXN0cnVjdCBidHJmc19pb2N0bF92b2xfYXJncyAqdm9sX2FyZ3M7CisJaW50IHJldDsKKworCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKKwkJcmV0dXJuIC1FUEVSTTsKKworCXZvbF9hcmdzID0ga21hbGxvYyhzaXplb2YoKnZvbF9hcmdzKSwgR0ZQX05PRlMpOworCisJaWYgKCF2b2xfYXJncykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpZiAoY29weV9mcm9tX3VzZXIodm9sX2FyZ3MsIGFyZywgc2l6ZW9mKCp2b2xfYXJncykpKSB7CisJCXJldCA9IC1FRkFVTFQ7CisJCWdvdG8gb3V0OworCX0KKwl2b2xfYXJncy0+bmFtZVtCVFJGU19QQVRIX05BTUVfTUFYXSA9ICdcMCc7CisJcmV0ID0gYnRyZnNfaW5pdF9uZXdfZGV2aWNlKHJvb3QsIHZvbF9hcmdzLT5uYW1lKTsKKworb3V0OgorCWtmcmVlKHZvbF9hcmdzKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgbG9uZyBidHJmc19pb2N0bF9ybV9kZXYoc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsIHZvaWQgX191c2VyICphcmcpCit7CisJc3RydWN0IGJ0cmZzX2lvY3RsX3ZvbF9hcmdzICp2b2xfYXJnczsKKwlpbnQgcmV0OworCisJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQorCQlyZXR1cm4gLUVQRVJNOworCisJaWYgKHJvb3QtPmZzX2luZm8tPnNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKQorCQlyZXR1cm4gLUVST0ZTOworCisJdm9sX2FyZ3MgPSBrbWFsbG9jKHNpemVvZigqdm9sX2FyZ3MpLCBHRlBfTk9GUyk7CisKKwlpZiAoIXZvbF9hcmdzKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWlmIChjb3B5X2Zyb21fdXNlcih2b2xfYXJncywgYXJnLCBzaXplb2YoKnZvbF9hcmdzKSkpIHsKKwkJcmV0ID0gLUVGQVVMVDsKKwkJZ290byBvdXQ7CisJfQorCXZvbF9hcmdzLT5uYW1lW0JUUkZTX1BBVEhfTkFNRV9NQVhdID0gJ1wwJzsKKwlyZXQgPSBidHJmc19ybV9kZXZpY2Uocm9vdCwgdm9sX2FyZ3MtPm5hbWUpOworCitvdXQ6CisJa2ZyZWUodm9sX2FyZ3MpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBsb25nIGJ0cmZzX2lvY3RsX2Nsb25lKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBsb25nIHNyY2ZkLAorCQl1NjQgb2ZmLCB1NjQgb2xlbiwgdTY0IGRlc3RvZmYpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGZkZW50cnkoZmlsZSktPmRfaW5vZGU7CisJc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QgPSBCVFJGU19JKGlub2RlKS0+cm9vdDsKKwlzdHJ1Y3QgZmlsZSAqc3JjX2ZpbGU7CisJc3RydWN0IGlub2RlICpzcmM7CisJc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnM7CisJc3RydWN0IGJ0cmZzX3BhdGggKnBhdGg7CisJc3RydWN0IGV4dGVudF9idWZmZXIgKmxlYWY7CisJY2hhciAqYnVmOworCXN0cnVjdCBidHJmc19rZXkga2V5OworCXUzMiBucml0ZW1zOworCWludCBzbG90OworCWludCByZXQ7CisJdTY0IGxlbiA9IG9sZW47CisJdTY0IGJzID0gcm9vdC0+ZnNfaW5mby0+c2ItPnNfYmxvY2tzaXplOworCXU2NCBoaW50X2J5dGU7CisKKwkvKgorCSAqIFRPRE86CisJICogLSBzcGxpdCBjb21wcmVzc2VkIGlubGluZSBleHRlbnRzLiAgYW5ub3lpbmc6IHdlIG5lZWQgdG8KKwkgKiAgIGRlY29tcHJlc3MgaW50byBkZXN0aW5hdGlvbidzIGFkZHJlc3Nfc3BhY2UgKHRoZSBmaWxlIG9mZnNldAorCSAqICAgbWF5IGNoYW5nZSwgc28gc291cmNlIG1hcHBpbmcgd29uJ3QgZG8pLCB0aGVuIHJlY29tcHJlc3MgKG9yCisJICogICBvdGhlcndpc2UgcmVpbnNlcnQpIGEgc3VicmFuZ2UuCisJICogLSBhbGxvdyByYW5nZXMgd2l0aGluIHRoZSBzYW1lIGZpbGUgdG8gYmUgY2xvbmVkIChwcm92aWRlZAorCSAqICAgdGhleSBkb24ndCBvdmVybGFwKT8KKwkgKi8KKworCS8qIHRoZSBkZXN0aW5hdGlvbiBtdXN0IGJlIG9wZW5lZCBmb3Igd3JpdGluZyAqLworCWlmICghKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXQgPSBtbnRfd2FudF93cml0ZShmaWxlLT5mX3BhdGgubW50KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJc3JjX2ZpbGUgPSBmZ2V0KHNyY2ZkKTsKKwlpZiAoIXNyY19maWxlKSB7CisJCXJldCA9IC1FQkFERjsKKwkJZ290byBvdXRfZHJvcF93cml0ZTsKKwl9CisJc3JjID0gc3JjX2ZpbGUtPmZfZGVudHJ5LT5kX2lub2RlOworCisJcmV0ID0gLUVJTlZBTDsKKwlpZiAoc3JjID09IGlub2RlKQorCQlnb3RvIG91dF9mcHV0OworCisJcmV0ID0gLUVJU0RJUjsKKwlpZiAoU19JU0RJUihzcmMtPmlfbW9kZSkgfHwgU19JU0RJUihpbm9kZS0+aV9tb2RlKSkKKwkJZ290byBvdXRfZnB1dDsKKworCXJldCA9IC1FWERFVjsKKwlpZiAoc3JjLT5pX3NiICE9IGlub2RlLT5pX3NiIHx8IEJUUkZTX0koc3JjKS0+cm9vdCAhPSByb290KQorCQlnb3RvIG91dF9mcHV0OworCisJcmV0ID0gLUVOT01FTTsKKwlidWYgPSB2bWFsbG9jKGJ0cmZzX2xldmVsX3NpemUocm9vdCwgMCkpOworCWlmICghYnVmKQorCQlnb3RvIG91dF9mcHV0OworCisJcGF0aCA9IGJ0cmZzX2FsbG9jX3BhdGgoKTsKKwlpZiAoIXBhdGgpIHsKKwkJdmZyZWUoYnVmKTsKKwkJZ290byBvdXRfZnB1dDsKKwl9CisJcGF0aC0+cmVhZGEgPSAyOworCisJaWYgKGlub2RlIDwgc3JjKSB7CisJCW11dGV4X2xvY2soJmlub2RlLT5pX211dGV4KTsKKwkJbXV0ZXhfbG9jaygmc3JjLT5pX211dGV4KTsKKwl9IGVsc2UgeworCQltdXRleF9sb2NrKCZzcmMtPmlfbXV0ZXgpOworCQltdXRleF9sb2NrKCZpbm9kZS0+aV9tdXRleCk7CisJfQorCisJLyogZGV0ZXJtaW5lIHJhbmdlIHRvIGNsb25lICovCisJcmV0ID0gLUVJTlZBTDsKKwlpZiAob2ZmID49IHNyYy0+aV9zaXplIHx8IG9mZiArIGxlbiA+IHNyYy0+aV9zaXplKQorCQlnb3RvIG91dF91bmxvY2s7CisJaWYgKGxlbiA9PSAwKQorCQlvbGVuID0gbGVuID0gc3JjLT5pX3NpemUgLSBvZmY7CisJLyogaWYgd2UgZXh0ZW5kIHRvIGVvZiwgY29udGludWUgdG8gYmxvY2sgYm91bmRhcnkgKi8KKwlpZiAob2ZmICsgbGVuID09IHNyYy0+aV9zaXplKQorCQlsZW4gPSAoKHNyYy0+aV9zaXplICsgYnMtMSkgJiB+KGJzLTEpKQorCQkJLSBvZmY7CisKKwkvKiB2ZXJpZnkgdGhlIGVuZCByZXN1bHQgaXMgYmxvY2sgYWxpZ25lZCAqLworCWlmICgob2ZmICYgKGJzLTEpKSB8fAorCSAgICAoKG9mZiArIGxlbikgJiAoYnMtMSkpKQorCQlnb3RvIG91dF91bmxvY2s7CisKKwkvKiBkbyBhbnkgcGVuZGluZyBkZWxhbGxvYy9jc3VtIGNhbGMgb24gc3JjLCBvbmUgd2F5IG9yCisJICAgYW5vdGhlciwgYW5kIGxvY2sgZmlsZSBjb250ZW50ICovCisJd2hpbGUgKDEpIHsKKwkJc3RydWN0IGJ0cmZzX29yZGVyZWRfZXh0ZW50ICpvcmRlcmVkOworCQlsb2NrX2V4dGVudCgmQlRSRlNfSShzcmMpLT5pb190cmVlLCBvZmYsIG9mZitsZW4sIEdGUF9OT0ZTKTsKKwkJb3JkZXJlZCA9IGJ0cmZzX2xvb2t1cF9maXJzdF9vcmRlcmVkX2V4dGVudChpbm9kZSwgb2ZmK2xlbik7CisJCWlmIChCVFJGU19JKHNyYyktPmRlbGFsbG9jX2J5dGVzID09IDAgJiYgIW9yZGVyZWQpCisJCQlicmVhazsKKwkJdW5sb2NrX2V4dGVudCgmQlRSRlNfSShzcmMpLT5pb190cmVlLCBvZmYsIG9mZitsZW4sIEdGUF9OT0ZTKTsKKwkJaWYgKG9yZGVyZWQpCisJCQlidHJmc19wdXRfb3JkZXJlZF9leHRlbnQob3JkZXJlZCk7CisJCWJ0cmZzX3dhaXRfb3JkZXJlZF9yYW5nZShzcmMsIG9mZiwgb2ZmK2xlbik7CisJfQorCisJdHJhbnMgPSBidHJmc19zdGFydF90cmFuc2FjdGlvbihyb290LCAxKTsKKwlCVUdfT04oIXRyYW5zKTsKKworCS8qIHB1bmNoIGhvbGUgaW4gZGVzdGluYXRpb24gZmlyc3QgKi8KKwlidHJmc19kcm9wX2V4dGVudHModHJhbnMsIHJvb3QsIGlub2RlLCBvZmYsIG9mZitsZW4sIDAsICZoaW50X2J5dGUpOworCisJLyogY2xvbmUgZGF0YSAqLworCWtleS5vYmplY3RpZCA9IHNyYy0+aV9pbm87CisJa2V5LnR5cGUgPSBCVFJGU19FWFRFTlRfREFUQV9LRVk7CisJa2V5Lm9mZnNldCA9IDA7CisKKwl3aGlsZSAoMSkgeworCQkvKgorCQkgKiBub3RlIHRoZSBrZXkgd2lsbCBjaGFuZ2UgdHlwZSBhcyB3ZSB3YWxrIHRocm91Z2ggdGhlCisJCSAqIHRyZWUuCisJCSAqLworCQlyZXQgPSBidHJmc19zZWFyY2hfc2xvdCh0cmFucywgcm9vdCwgJmtleSwgcGF0aCwgMCwgMCk7CisJCWlmIChyZXQgPCAwKQorCQkJZ290byBvdXQ7CisKKwkJbnJpdGVtcyA9IGJ0cmZzX2hlYWRlcl9ucml0ZW1zKHBhdGgtPm5vZGVzWzBdKTsKKwkJaWYgKHBhdGgtPnNsb3RzWzBdID49IG5yaXRlbXMpIHsKKwkJCXJldCA9IGJ0cmZzX25leHRfbGVhZihyb290LCBwYXRoKTsKKwkJCWlmIChyZXQgPCAwKQorCQkJCWdvdG8gb3V0OworCQkJaWYgKHJldCA+IDApCisJCQkJYnJlYWs7CisJCQlucml0ZW1zID0gYnRyZnNfaGVhZGVyX25yaXRlbXMocGF0aC0+bm9kZXNbMF0pOworCQl9CisJCWxlYWYgPSBwYXRoLT5ub2Rlc1swXTsKKwkJc2xvdCA9IHBhdGgtPnNsb3RzWzBdOworCisJCWJ0cmZzX2l0ZW1fa2V5X3RvX2NwdShsZWFmLCAma2V5LCBzbG90KTsKKwkJaWYgKGJ0cmZzX2tleV90eXBlKCZrZXkpID4gQlRSRlNfRVhURU5UX0RBVEFfS0VZIHx8CisJCSAgICBrZXkub2JqZWN0aWQgIT0gc3JjLT5pX2lubykKKwkJCWJyZWFrOworCisJCWlmIChidHJmc19rZXlfdHlwZSgma2V5KSA9PSBCVFJGU19FWFRFTlRfREFUQV9LRVkpIHsKKwkJCXN0cnVjdCBidHJmc19maWxlX2V4dGVudF9pdGVtICpleHRlbnQ7CisJCQlpbnQgdHlwZTsKKwkJCXUzMiBzaXplOworCQkJc3RydWN0IGJ0cmZzX2tleSBuZXdfa2V5OworCQkJdTY0IGRpc2tvID0gMCwgZGlza2wgPSAwOworCQkJdTY0IGRhdGFvID0gMCwgZGF0YWwgPSAwOworCQkJdTggY29tcDsKKworCQkJc2l6ZSA9IGJ0cmZzX2l0ZW1fc2l6ZV9ucihsZWFmLCBzbG90KTsKKwkJCXJlYWRfZXh0ZW50X2J1ZmZlcihsZWFmLCBidWYsCisJCQkJCSAgIGJ0cmZzX2l0ZW1fcHRyX29mZnNldChsZWFmLCBzbG90KSwKKwkJCQkJICAgc2l6ZSk7CisKKwkJCWV4dGVudCA9IGJ0cmZzX2l0ZW1fcHRyKGxlYWYsIHNsb3QsCisJCQkJCQlzdHJ1Y3QgYnRyZnNfZmlsZV9leHRlbnRfaXRlbSk7CisJCQljb21wID0gYnRyZnNfZmlsZV9leHRlbnRfY29tcHJlc3Npb24obGVhZiwgZXh0ZW50KTsKKwkJCXR5cGUgPSBidHJmc19maWxlX2V4dGVudF90eXBlKGxlYWYsIGV4dGVudCk7CisJCQlpZiAodHlwZSA9PSBCVFJGU19GSUxFX0VYVEVOVF9SRUcpIHsKKwkJCQlkaXNrbyA9IGJ0cmZzX2ZpbGVfZXh0ZW50X2Rpc2tfYnl0ZW5yKGxlYWYsCisJCQkJCQkJCSAgICAgIGV4dGVudCk7CisJCQkJZGlza2wgPSBidHJmc19maWxlX2V4dGVudF9kaXNrX251bV9ieXRlcyhsZWFmLAorCQkJCQkJCQkgZXh0ZW50KTsKKwkJCQlkYXRhbyA9IGJ0cmZzX2ZpbGVfZXh0ZW50X29mZnNldChsZWFmLCBleHRlbnQpOworCQkJCWRhdGFsID0gYnRyZnNfZmlsZV9leHRlbnRfbnVtX2J5dGVzKGxlYWYsCisJCQkJCQkJCSAgICBleHRlbnQpOworCQkJfSBlbHNlIGlmICh0eXBlID09IEJUUkZTX0ZJTEVfRVhURU5UX0lOTElORSkgeworCQkJCS8qIHRha2UgdXBwZXIgYm91bmQsIG1heSBiZSBjb21wcmVzc2VkICovCisJCQkJZGF0YWwgPSBidHJmc19maWxlX2V4dGVudF9yYW1fYnl0ZXMobGVhZiwKKwkJCQkJCQkJICAgIGV4dGVudCk7CisJCQl9CisJCQlidHJmc19yZWxlYXNlX3BhdGgocm9vdCwgcGF0aCk7CisKKwkJCWlmIChrZXkub2Zmc2V0ICsgZGF0YWwgPCBvZmYgfHwKKwkJCSAgICBrZXkub2Zmc2V0ID49IG9mZitsZW4pCisJCQkJZ290byBuZXh0OworCisJCQltZW1jcHkoJm5ld19rZXksICZrZXksIHNpemVvZihuZXdfa2V5KSk7CisJCQluZXdfa2V5Lm9iamVjdGlkID0gaW5vZGUtPmlfaW5vOworCQkJbmV3X2tleS5vZmZzZXQgPSBrZXkub2Zmc2V0ICsgZGVzdG9mZiAtIG9mZjsKKworCQkJaWYgKHR5cGUgPT0gQlRSRlNfRklMRV9FWFRFTlRfUkVHKSB7CisJCQkJcmV0ID0gYnRyZnNfaW5zZXJ0X2VtcHR5X2l0ZW0odHJhbnMsIHJvb3QsIHBhdGgsCisJCQkJCQkJICAgICAgJm5ld19rZXksIHNpemUpOworCQkJCWlmIChyZXQpCisJCQkJCWdvdG8gb3V0OworCisJCQkJbGVhZiA9IHBhdGgtPm5vZGVzWzBdOworCQkJCXNsb3QgPSBwYXRoLT5zbG90c1swXTsKKwkJCQl3cml0ZV9leHRlbnRfYnVmZmVyKGxlYWYsIGJ1ZiwKKwkJCQkJICAgIGJ0cmZzX2l0ZW1fcHRyX29mZnNldChsZWFmLCBzbG90KSwKKwkJCQkJICAgIHNpemUpOworCisJCQkJZXh0ZW50ID0gYnRyZnNfaXRlbV9wdHIobGVhZiwgc2xvdCwKKwkJCQkJCXN0cnVjdCBidHJmc19maWxlX2V4dGVudF9pdGVtKTsKKworCQkJCWlmIChvZmYgPiBrZXkub2Zmc2V0KSB7CisJCQkJCWRhdGFvICs9IG9mZiAtIGtleS5vZmZzZXQ7CisJCQkJCWRhdGFsIC09IG9mZiAtIGtleS5vZmZzZXQ7CisJCQkJfQorCQkJCWlmIChrZXkub2Zmc2V0ICsgZGF0YW8gKyBkYXRhbCArIGtleS5vZmZzZXQgPgorCQkJCSAgICBvZmYgKyBsZW4pCisJCQkJCWRhdGFsID0gb2ZmICsgbGVuIC0ga2V5Lm9mZnNldCAtIGRhdGFvOworCQkJCS8qIGRpc2tvID09IDAgbWVhbnMgaXQncyBhIGhvbGUgKi8KKwkJCQlpZiAoIWRpc2tvKQorCQkJCQlkYXRhbyA9IDA7CisKKwkJCQlidHJmc19zZXRfZmlsZV9leHRlbnRfb2Zmc2V0KGxlYWYsIGV4dGVudCwKKwkJCQkJCQkgICAgIGRhdGFvKTsKKwkJCQlidHJmc19zZXRfZmlsZV9leHRlbnRfbnVtX2J5dGVzKGxlYWYsIGV4dGVudCwKKwkJCQkJCQkJZGF0YWwpOworCQkJCWlmIChkaXNrbykgeworCQkJCQlpbm9kZV9hZGRfYnl0ZXMoaW5vZGUsIGRhdGFsKTsKKwkJCQkJcmV0ID0gYnRyZnNfaW5jX2V4dGVudF9yZWYodHJhbnMsIHJvb3QsCisJCQkJCQkgICBkaXNrbywgZGlza2wsIGxlYWYtPnN0YXJ0LAorCQkJCQkJICAgcm9vdC0+cm9vdF9rZXkub2JqZWN0aWQsCisJCQkJCQkgICB0cmFucy0+dHJhbnNpZCwKKwkJCQkJCSAgIGlub2RlLT5pX2lubyk7CisJCQkJCUJVR19PTihyZXQpOworCQkJCX0KKwkJCX0gZWxzZSBpZiAodHlwZSA9PSBCVFJGU19GSUxFX0VYVEVOVF9JTkxJTkUpIHsKKwkJCQl1NjQgc2tpcCA9IDA7CisJCQkJdTY0IHRyaW0gPSAwOworCQkJCWlmIChvZmYgPiBrZXkub2Zmc2V0KSB7CisJCQkJCXNraXAgPSBvZmYgLSBrZXkub2Zmc2V0OworCQkJCQluZXdfa2V5Lm9mZnNldCArPSBza2lwOworCQkJCX0KKworCQkJCWlmIChrZXkub2Zmc2V0ICsgZGF0YWwgPiBvZmYrbGVuKQorCQkJCQl0cmltID0ga2V5Lm9mZnNldCArIGRhdGFsIC0gKG9mZitsZW4pOworCisJCQkJaWYgKGNvbXAgJiYgKHNraXAgfHwgdHJpbSkpIHsKKwkJCQkJcmV0ID0gLUVJTlZBTDsKKwkJCQkJZ290byBvdXQ7CisJCQkJfQorCQkJCXNpemUgLT0gc2tpcCArIHRyaW07CisJCQkJZGF0YWwgLT0gc2tpcCArIHRyaW07CisJCQkJcmV0ID0gYnRyZnNfaW5zZXJ0X2VtcHR5X2l0ZW0odHJhbnMsIHJvb3QsIHBhdGgsCisJCQkJCQkJICAgICAgJm5ld19rZXksIHNpemUpOworCQkJCWlmIChyZXQpCisJCQkJCWdvdG8gb3V0OworCisJCQkJaWYgKHNraXApIHsKKwkJCQkJdTMyIHN0YXJ0ID0KKwkJCQkJICBidHJmc19maWxlX2V4dGVudF9jYWxjX2lubGluZV9zaXplKDApOworCQkJCQltZW1tb3ZlKGJ1ZitzdGFydCwgYnVmK3N0YXJ0K3NraXAsCisJCQkJCQlkYXRhbCk7CisJCQkJfQorCisJCQkJbGVhZiA9IHBhdGgtPm5vZGVzWzBdOworCQkJCXNsb3QgPSBwYXRoLT5zbG90c1swXTsKKwkJCQl3cml0ZV9leHRlbnRfYnVmZmVyKGxlYWYsIGJ1ZiwKKwkJCQkJICAgIGJ0cmZzX2l0ZW1fcHRyX29mZnNldChsZWFmLCBzbG90KSwKKwkJCQkJICAgIHNpemUpOworCQkJCWlub2RlX2FkZF9ieXRlcyhpbm9kZSwgZGF0YWwpOworCQkJfQorCisJCQlidHJmc19tYXJrX2J1ZmZlcl9kaXJ0eShsZWFmKTsKKwkJfQorCituZXh0OgorCQlidHJmc19yZWxlYXNlX3BhdGgocm9vdCwgcGF0aCk7CisJCWtleS5vZmZzZXQrKzsKKwl9CisJcmV0ID0gMDsKK291dDoKKwlidHJmc19yZWxlYXNlX3BhdGgocm9vdCwgcGF0aCk7CisJaWYgKHJldCA9PSAwKSB7CisJCWlub2RlLT5pX210aW1lID0gaW5vZGUtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUU7CisJCWlmIChkZXN0b2ZmICsgb2xlbiA+IGlub2RlLT5pX3NpemUpCisJCQlidHJmc19pX3NpemVfd3JpdGUoaW5vZGUsIGRlc3RvZmYgKyBvbGVuKTsKKwkJQlRSRlNfSShpbm9kZSktPmZsYWdzID0gQlRSRlNfSShzcmMpLT5mbGFnczsKKwkJcmV0ID0gYnRyZnNfdXBkYXRlX2lub2RlKHRyYW5zLCByb290LCBpbm9kZSk7CisJfQorCWJ0cmZzX2VuZF90cmFuc2FjdGlvbih0cmFucywgcm9vdCk7CisJdW5sb2NrX2V4dGVudCgmQlRSRlNfSShzcmMpLT5pb190cmVlLCBvZmYsIG9mZitsZW4sIEdGUF9OT0ZTKTsKKwlpZiAocmV0KQorCQl2bXRydW5jYXRlKGlub2RlLCAwKTsKK291dF91bmxvY2s6CisJbXV0ZXhfdW5sb2NrKCZzcmMtPmlfbXV0ZXgpOworCW11dGV4X3VubG9jaygmaW5vZGUtPmlfbXV0ZXgpOworCXZmcmVlKGJ1Zik7CisJYnRyZnNfZnJlZV9wYXRoKHBhdGgpOworb3V0X2ZwdXQ6CisJZnB1dChzcmNfZmlsZSk7CitvdXRfZHJvcF93cml0ZToKKwltbnRfZHJvcF93cml0ZShmaWxlLT5mX3BhdGgubW50KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgbG9uZyBidHJmc19pb2N0bF9jbG9uZV9yYW5nZShzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCBfX3VzZXIgKmFyZ3ApCit7CisJc3RydWN0IGJ0cmZzX2lvY3RsX2Nsb25lX3JhbmdlX2FyZ3MgYXJnczsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmYXJncywgYXJncCwgc2l6ZW9mKGFyZ3MpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0dXJuIGJ0cmZzX2lvY3RsX2Nsb25lKGZpbGUsIGFyZ3Muc3JjX2ZkLCBhcmdzLnNyY19vZmZzZXQsCisJCQkJIGFyZ3Muc3JjX2xlbmd0aCwgYXJncy5kZXN0X29mZnNldCk7Cit9CisKKy8qCisgKiB0aGVyZSBhcmUgbWFueSB3YXlzIHRoZSB0cmFuc19zdGFydCBhbmQgdHJhbnNfZW5kIGlvY3RscyBjYW4gbGVhZAorICogdG8gZGVhZGxvY2tzLiAgVGhleSBzaG91bGQgb25seSBiZSB1c2VkIGJ5IGFwcGxpY2F0aW9ucyB0aGF0CisgKiBiYXNpY2FsbHkgb3duIHRoZSBtYWNoaW5lLCBhbmQgaGF2ZSBhIHZlcnkgaW4gZGVwdGggdW5kZXJzdGFuZGluZworICogb2YgYWxsIHRoZSBwb3NzaWJsZSBkZWFkbG9ja3MgYW5kIGVub3NwYyBwcm9ibGVtcy4KKyAqLworc3RhdGljIGxvbmcgYnRyZnNfaW9jdGxfdHJhbnNfc3RhcnQoc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGZkZW50cnkoZmlsZSktPmRfaW5vZGU7CisJc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QgPSBCVFJGU19JKGlub2RlKS0+cm9vdDsKKwlzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFuczsKKwlpbnQgcmV0ID0gMDsKKworCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKKwkJcmV0dXJuIC1FUEVSTTsKKworCWlmIChmaWxlLT5wcml2YXRlX2RhdGEpIHsKKwkJcmV0ID0gLUVJTlBST0dSRVNTOworCQlnb3RvIG91dDsKKwl9CisKKwlyZXQgPSBtbnRfd2FudF93cml0ZShmaWxlLT5mX3BhdGgubW50KTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKworCW11dGV4X2xvY2soJnJvb3QtPmZzX2luZm8tPnRyYW5zX211dGV4KTsKKwlyb290LT5mc19pbmZvLT5vcGVuX2lvY3RsX3RyYW5zKys7CisJbXV0ZXhfdW5sb2NrKCZyb290LT5mc19pbmZvLT50cmFuc19tdXRleCk7CisKKwl0cmFucyA9IGJ0cmZzX3N0YXJ0X2lvY3RsX3RyYW5zYWN0aW9uKHJvb3QsIDApOworCWlmICh0cmFucykKKwkJZmlsZS0+cHJpdmF0ZV9kYXRhID0gdHJhbnM7CisJZWxzZQorCQlyZXQgPSAtRU5PTUVNOworCS8qcHJpbnRrKEtFUk5fSU5GTyAiYnRyZnNfaW9jdGxfdHJhbnNfc3RhcnQgb24gJXBcbiIsIGZpbGUpOyovCitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIHRoZXJlIGFyZSBtYW55IHdheXMgdGhlIHRyYW5zX3N0YXJ0IGFuZCB0cmFuc19lbmQgaW9jdGxzIGNhbiBsZWFkCisgKiB0byBkZWFkbG9ja3MuICBUaGV5IHNob3VsZCBvbmx5IGJlIHVzZWQgYnkgYXBwbGljYXRpb25zIHRoYXQKKyAqIGJhc2ljYWxseSBvd24gdGhlIG1hY2hpbmUsIGFuZCBoYXZlIGEgdmVyeSBpbiBkZXB0aCB1bmRlcnN0YW5kaW5nCisgKiBvZiBhbGwgdGhlIHBvc3NpYmxlIGRlYWRsb2NrcyBhbmQgZW5vc3BjIHByb2JsZW1zLgorICovCitsb25nIGJ0cmZzX2lvY3RsX3RyYW5zX2VuZChzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmRlbnRyeShmaWxlKS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCA9IEJUUkZTX0koaW5vZGUpLT5yb290OworCXN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zOworCWludCByZXQgPSAwOworCisJdHJhbnMgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJaWYgKCF0cmFucykgeworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisJYnRyZnNfZW5kX3RyYW5zYWN0aW9uKHRyYW5zLCByb290KTsKKwlmaWxlLT5wcml2YXRlX2RhdGEgPSBOVUxMOworCisJbXV0ZXhfbG9jaygmcm9vdC0+ZnNfaW5mby0+dHJhbnNfbXV0ZXgpOworCXJvb3QtPmZzX2luZm8tPm9wZW5faW9jdGxfdHJhbnMtLTsKKwltdXRleF91bmxvY2soJnJvb3QtPmZzX2luZm8tPnRyYW5zX211dGV4KTsKKworCW1udF9kcm9wX3dyaXRlKGZpbGUtPmZfcGF0aC5tbnQpOworCitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworbG9uZyBidHJmc19pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50CisJCWNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QgPSBCVFJGU19JKGZkZW50cnkoZmlsZSktPmRfaW5vZGUpLT5yb290OworCXZvaWQgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIEJUUkZTX0lPQ19TTkFQX0NSRUFURToKKwkJcmV0dXJuIGJ0cmZzX2lvY3RsX3NuYXBfY3JlYXRlKGZpbGUsIGFyZ3AsIDApOworCWNhc2UgQlRSRlNfSU9DX1NVQlZPTF9DUkVBVEU6CisJCXJldHVybiBidHJmc19pb2N0bF9zbmFwX2NyZWF0ZShmaWxlLCBhcmdwLCAxKTsKKwljYXNlIEJUUkZTX0lPQ19ERUZSQUc6CisJCXJldHVybiBidHJmc19pb2N0bF9kZWZyYWcoZmlsZSk7CisJY2FzZSBCVFJGU19JT0NfUkVTSVpFOgorCQlyZXR1cm4gYnRyZnNfaW9jdGxfcmVzaXplKHJvb3QsIGFyZ3ApOworCWNhc2UgQlRSRlNfSU9DX0FERF9ERVY6CisJCXJldHVybiBidHJmc19pb2N0bF9hZGRfZGV2KHJvb3QsIGFyZ3ApOworCWNhc2UgQlRSRlNfSU9DX1JNX0RFVjoKKwkJcmV0dXJuIGJ0cmZzX2lvY3RsX3JtX2Rldihyb290LCBhcmdwKTsKKwljYXNlIEJUUkZTX0lPQ19CQUxBTkNFOgorCQlyZXR1cm4gYnRyZnNfYmFsYW5jZShyb290LT5mc19pbmZvLT5kZXZfcm9vdCk7CisJY2FzZSBCVFJGU19JT0NfQ0xPTkU6CisJCXJldHVybiBidHJmc19pb2N0bF9jbG9uZShmaWxlLCBhcmcsIDAsIDAsIDApOworCWNhc2UgQlRSRlNfSU9DX0NMT05FX1JBTkdFOgorCQlyZXR1cm4gYnRyZnNfaW9jdGxfY2xvbmVfcmFuZ2UoZmlsZSwgYXJncCk7CisJY2FzZSBCVFJGU19JT0NfVFJBTlNfU1RBUlQ6CisJCXJldHVybiBidHJmc19pb2N0bF90cmFuc19zdGFydChmaWxlKTsKKwljYXNlIEJUUkZTX0lPQ19UUkFOU19FTkQ6CisJCXJldHVybiBidHJmc19pb2N0bF90cmFuc19lbmQoZmlsZSk7CisJY2FzZSBCVFJGU19JT0NfU1lOQzoKKwkJYnRyZnNfc3luY19mcyhmaWxlLT5mX2RlbnRyeS0+ZF9zYiwgMSk7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAtRU5PVFRZOworfQpkaWZmIC0tZ2l0IGEvZnMvYnRyZnMvaW9jdGwuaCBiL2ZzL2J0cmZzL2lvY3RsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjMyMGIxMAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2J0cmZzL2lvY3RsLmgKQEAgLTAsMCArMSw2OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBPcmFjbGUuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSB2MiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorICogQm9zdG9uLCBNQSAwMjExMTAtMTMwNywgVVNBLgorICovCisKKyNpZm5kZWYgX19JT0NUTF8KKyNkZWZpbmUgX19JT0NUTF8KKyNpbmNsdWRlIDxsaW51eC9pb2N0bC5oPgorCisjZGVmaW5lIEJUUkZTX0lPQ1RMX01BR0lDIDB4OTQKKyNkZWZpbmUgQlRSRlNfVk9MX05BTUVfTUFYIDI1NQorI2RlZmluZSBCVFJGU19QQVRIX05BTUVfTUFYIDQwODcKKworLyogdGhpcyBzaG91bGQgYmUgNGsgKi8KK3N0cnVjdCBidHJmc19pb2N0bF92b2xfYXJncyB7CisJX19zNjQgZmQ7CisJY2hhciBuYW1lW0JUUkZTX1BBVEhfTkFNRV9NQVggKyAxXTsKK307CisKK3N0cnVjdCBidHJmc19pb2N0bF9jbG9uZV9yYW5nZV9hcmdzIHsKKyAgX19zNjQgc3JjX2ZkOworICBfX3U2NCBzcmNfb2Zmc2V0LCBzcmNfbGVuZ3RoOworICBfX3U2NCBkZXN0X29mZnNldDsKK307CisKKyNkZWZpbmUgQlRSRlNfSU9DX1NOQVBfQ1JFQVRFIF9JT1coQlRSRlNfSU9DVExfTUFHSUMsIDEsIFwKKwkJCQkgICBzdHJ1Y3QgYnRyZnNfaW9jdGxfdm9sX2FyZ3MpCisjZGVmaW5lIEJUUkZTX0lPQ19ERUZSQUcgX0lPVyhCVFJGU19JT0NUTF9NQUdJQywgMiwgXAorCQkJCSAgIHN0cnVjdCBidHJmc19pb2N0bF92b2xfYXJncykKKyNkZWZpbmUgQlRSRlNfSU9DX1JFU0laRSBfSU9XKEJUUkZTX0lPQ1RMX01BR0lDLCAzLCBcCisJCQkJICAgc3RydWN0IGJ0cmZzX2lvY3RsX3ZvbF9hcmdzKQorI2RlZmluZSBCVFJGU19JT0NfU0NBTl9ERVYgX0lPVyhCVFJGU19JT0NUTF9NQUdJQywgNCwgXAorCQkJCSAgIHN0cnVjdCBidHJmc19pb2N0bF92b2xfYXJncykKKy8qIHRyYW5zIHN0YXJ0IGFuZCB0cmFucyBlbmQgYXJlIGRhbmdlcm91cywgYW5kIG9ubHkgZm9yCisgKiB1c2UgYnkgYXBwbGljYXRpb25zIHRoYXQga25vdyBob3cgdG8gYXZvaWQgdGhlCisgKiByZXN1bHRpbmcgZGVhZGxvY2tzCisgKi8KKyNkZWZpbmUgQlRSRlNfSU9DX1RSQU5TX1NUQVJUICBfSU8oQlRSRlNfSU9DVExfTUFHSUMsIDYpCisjZGVmaW5lIEJUUkZTX0lPQ19UUkFOU19FTkQgICAgX0lPKEJUUkZTX0lPQ1RMX01BR0lDLCA3KQorI2RlZmluZSBCVFJGU19JT0NfU1lOQyAgICAgICAgIF9JTyhCVFJGU19JT0NUTF9NQUdJQywgOCkKKworI2RlZmluZSBCVFJGU19JT0NfQ0xPTkUgICAgICAgIF9JT1coQlRSRlNfSU9DVExfTUFHSUMsIDksIGludCkKKyNkZWZpbmUgQlRSRlNfSU9DX0FERF9ERVYgX0lPVyhCVFJGU19JT0NUTF9NQUdJQywgMTAsIFwKKwkJCQkgICBzdHJ1Y3QgYnRyZnNfaW9jdGxfdm9sX2FyZ3MpCisjZGVmaW5lIEJUUkZTX0lPQ19STV9ERVYgX0lPVyhCVFJGU19JT0NUTF9NQUdJQywgMTEsIFwKKwkJCQkgICBzdHJ1Y3QgYnRyZnNfaW9jdGxfdm9sX2FyZ3MpCisjZGVmaW5lIEJUUkZTX0lPQ19CQUxBTkNFIF9JT1coQlRSRlNfSU9DVExfTUFHSUMsIDEyLCBcCisJCQkJICAgc3RydWN0IGJ0cmZzX2lvY3RsX3ZvbF9hcmdzKQorCisjZGVmaW5lIEJUUkZTX0lPQ19DTE9ORV9SQU5HRSBfSU9XKEJUUkZTX0lPQ1RMX01BR0lDLCAxMywgXAorCQkJCSAgc3RydWN0IGJ0cmZzX2lvY3RsX2Nsb25lX3JhbmdlX2FyZ3MpCisKKyNkZWZpbmUgQlRSRlNfSU9DX1NVQlZPTF9DUkVBVEUgX0lPVyhCVFJGU19JT0NUTF9NQUdJQywgMTQsIFwKKwkJCQkgICBzdHJ1Y3QgYnRyZnNfaW9jdGxfdm9sX2FyZ3MpCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZnMvYnRyZnMvbG9ja2luZy5jIGIvZnMvYnRyZnMvbG9ja2luZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5YmFlNzcKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9idHJmcy9sb2NraW5nLmMKQEAgLTAsMCArMSw4OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBPcmFjbGUuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSB2MiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorICogQm9zdG9uLCBNQSAwMjExMTAtMTMwNywgVVNBLgorICovCisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9nZnAuaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdlLWZsYWdzLmg+CisjaW5jbHVkZSA8YXNtL2J1Zy5oPgorI2luY2x1ZGUgImN0cmVlLmgiCisjaW5jbHVkZSAiZXh0ZW50X2lvLmgiCisjaW5jbHVkZSAibG9ja2luZy5oIgorCisvKgorICogbG9ja3MgdGhlIHBlciBidWZmZXIgbXV0ZXggaW4gYW4gZXh0ZW50IGJ1ZmZlci4gIFRoaXMgdXNlcyBhZGFwdGl2ZSBsb2NrcworICogYW5kIHRoZSBzcGluIGlzIG5vdCB0dW5lZCB2ZXJ5IGV4dGVuc2l2ZWx5LiAgVGhlIHNwaW5uaW5nIGRvZXMgbWFrZSBhIGJpZworICogZGlmZmVyZW5jZSBpbiBhbG1vc3QgZXZlcnkgd29ya2xvYWQsIGJ1dCBzcGlubmluZyBmb3IgdGhlIHJpZ2h0IGFtb3VudCBvZgorICogdGltZSBuZWVkcyBzb21lIGhlbHAuCisgKgorICogSW4gZ2VuZXJhbCwgd2Ugd2FudCB0byBzcGluIGFzIGxvbmcgYXMgdGhlIGxvY2sgaG9sZGVyIGlzIGRvaW5nIGJ0cmVlCisgKiBzZWFyY2hlcywgYW5kIHdlIHNob3VsZCBnaXZlIHVwIGlmIHRoZXkgYXJlIGluIG1vcmUgZXhwZW5zaXZlIGNvZGUuCisgKi8KKworaW50IGJ0cmZzX3RyZWVfbG9jayhzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqZWIpCit7CisJaW50IGk7CisKKwlpZiAobXV0ZXhfdHJ5bG9jaygmZWItPm11dGV4KSkKKwkJcmV0dXJuIDA7CisJZm9yIChpID0gMDsgaSA8IDUxMjsgaSsrKSB7CisJCWNwdV9yZWxheCgpOworCQlpZiAobXV0ZXhfdHJ5bG9jaygmZWItPm11dGV4KSkKKwkJCXJldHVybiAwOworCX0KKwljcHVfcmVsYXgoKTsKKwltdXRleF9sb2NrX25lc3RlZCgmZWItPm11dGV4LCBCVFJGU19NQVhfTEVWRUwgLSBidHJmc19oZWFkZXJfbGV2ZWwoZWIpKTsKKwlyZXR1cm4gMDsKK30KKworaW50IGJ0cmZzX3RyeV90cmVlX2xvY2soc3RydWN0IGV4dGVudF9idWZmZXIgKmViKQoreworCXJldHVybiBtdXRleF90cnlsb2NrKCZlYi0+bXV0ZXgpOworfQorCitpbnQgYnRyZnNfdHJlZV91bmxvY2soc3RydWN0IGV4dGVudF9idWZmZXIgKmViKQoreworCW11dGV4X3VubG9jaygmZWItPm11dGV4KTsKKwlyZXR1cm4gMDsKK30KKworaW50IGJ0cmZzX3RyZWVfbG9ja2VkKHN0cnVjdCBleHRlbnRfYnVmZmVyICplYikKK3sKKwlyZXR1cm4gbXV0ZXhfaXNfbG9ja2VkKCZlYi0+bXV0ZXgpOworfQorCisvKgorICogYnRyZnNfc2VhcmNoX3Nsb3QgdXNlcyB0aGlzIHRvIGRlY2lkZSBpZiBpdCBzaG91bGQgZHJvcCBpdHMgbG9ja3MKKyAqIGJlZm9yZSBkb2luZyBzb21ldGhpbmcgZXhwZW5zaXZlIGxpa2UgYWxsb2NhdGluZyBmcmVlIGJsb2NrcyBmb3IgY293LgorICovCitpbnQgYnRyZnNfcGF0aF9sb2NrX3dhaXRpbmcoc3RydWN0IGJ0cmZzX3BhdGggKnBhdGgsIGludCBsZXZlbCkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqZWI7CisJZm9yIChpID0gbGV2ZWw7IGkgPD0gbGV2ZWwgKyAxICYmIGkgPCBCVFJGU19NQVhfTEVWRUw7IGkrKykgeworCQllYiA9IHBhdGgtPm5vZGVzW2ldOworCQlpZiAoIWViKQorCQkJYnJlYWs7CisJCXNtcF9tYigpOworCQlpZiAoIWxpc3RfZW1wdHkoJmViLT5tdXRleC53YWl0X2xpc3QpKQorCQkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCmRpZmYgLS1naXQgYS9mcy9idHJmcy9sb2NraW5nLmggYi9mcy9idHJmcy9sb2NraW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmMxZmFlZgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2J0cmZzL2xvY2tpbmcuaApAQCAtMCwwICsxLDI3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IE9yYWNsZS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIHYyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCisgKiBCb3N0b24sIE1BIDAyMTExMC0xMzA3LCBVU0EuCisgKi8KKworI2lmbmRlZiBfX0JUUkZTX0xPQ0tJTkdfCisjZGVmaW5lIF9fQlRSRlNfTE9DS0lOR18KKworaW50IGJ0cmZzX3RyZWVfbG9jayhzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqZWIpOworaW50IGJ0cmZzX3RyZWVfdW5sb2NrKHN0cnVjdCBleHRlbnRfYnVmZmVyICplYik7CitpbnQgYnRyZnNfdHJlZV9sb2NrZWQoc3RydWN0IGV4dGVudF9idWZmZXIgKmViKTsKK2ludCBidHJmc190cnlfdHJlZV9sb2NrKHN0cnVjdCBleHRlbnRfYnVmZmVyICplYik7CitpbnQgYnRyZnNfcGF0aF9sb2NrX3dhaXRpbmcoc3RydWN0IGJ0cmZzX3BhdGggKnBhdGgsIGludCBsZXZlbCk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2ZzL2J0cmZzL29yZGVyZWQtZGF0YS5jIGIvZnMvYnRyZnMvb3JkZXJlZC1kYXRhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTIwOTQwMQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2J0cmZzL29yZGVyZWQtZGF0YS5jCkBAIC0wLDAgKzEsNzMwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE9yYWNsZS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIHYyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCisgKiBCb3N0b24sIE1BIDAyMTExMC0xMzA3LCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2dmcC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC93cml0ZWJhY2suaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdldmVjLmg+CisjaW5jbHVkZSAiY3RyZWUuaCIKKyNpbmNsdWRlICJ0cmFuc2FjdGlvbi5oIgorI2luY2x1ZGUgImJ0cmZzX2lub2RlLmgiCisjaW5jbHVkZSAiZXh0ZW50X2lvLmgiCisKK3N0YXRpYyB1NjQgZW50cnlfZW5kKHN0cnVjdCBidHJmc19vcmRlcmVkX2V4dGVudCAqZW50cnkpCit7CisJaWYgKGVudHJ5LT5maWxlX29mZnNldCArIGVudHJ5LT5sZW4gPCBlbnRyeS0+ZmlsZV9vZmZzZXQpCisJCXJldHVybiAodTY0KS0xOworCXJldHVybiBlbnRyeS0+ZmlsZV9vZmZzZXQgKyBlbnRyeS0+bGVuOworfQorCisvKiByZXR1cm5zIE5VTEwgaWYgdGhlIGluc2VydGlvbiB3b3JrZWQsIG9yIGl0IHJldHVybnMgdGhlIG5vZGUgaXQgZGlkIGZpbmQKKyAqIGluIHRoZSB0cmVlCisgKi8KK3N0YXRpYyBzdHJ1Y3QgcmJfbm9kZSAqdHJlZV9pbnNlcnQoc3RydWN0IHJiX3Jvb3QgKnJvb3QsIHU2NCBmaWxlX29mZnNldCwKKwkJCQkgICBzdHJ1Y3QgcmJfbm9kZSAqbm9kZSkKK3sKKwlzdHJ1Y3QgcmJfbm9kZSAqKnAgPSAmcm9vdC0+cmJfbm9kZTsKKwlzdHJ1Y3QgcmJfbm9kZSAqcGFyZW50ID0gTlVMTDsKKwlzdHJ1Y3QgYnRyZnNfb3JkZXJlZF9leHRlbnQgKmVudHJ5OworCisJd2hpbGUgKCpwKSB7CisJCXBhcmVudCA9ICpwOworCQllbnRyeSA9IHJiX2VudHJ5KHBhcmVudCwgc3RydWN0IGJ0cmZzX29yZGVyZWRfZXh0ZW50LCByYl9ub2RlKTsKKworCQlpZiAoZmlsZV9vZmZzZXQgPCBlbnRyeS0+ZmlsZV9vZmZzZXQpCisJCQlwID0gJigqcCktPnJiX2xlZnQ7CisJCWVsc2UgaWYgKGZpbGVfb2Zmc2V0ID49IGVudHJ5X2VuZChlbnRyeSkpCisJCQlwID0gJigqcCktPnJiX3JpZ2h0OworCQllbHNlCisJCQlyZXR1cm4gcGFyZW50OworCX0KKworCXJiX2xpbmtfbm9kZShub2RlLCBwYXJlbnQsIHApOworCXJiX2luc2VydF9jb2xvcihub2RlLCByb290KTsKKwlyZXR1cm4gTlVMTDsKK30KKworLyoKKyAqIGxvb2sgZm9yIGEgZ2l2ZW4gb2Zmc2V0IGluIHRoZSB0cmVlLCBhbmQgaWYgaXQgY2FuJ3QgYmUgZm91bmQgcmV0dXJuIHRoZQorICogZmlyc3QgbGVzc2VyIG9mZnNldAorICovCitzdGF0aWMgc3RydWN0IHJiX25vZGUgKl9fdHJlZV9zZWFyY2goc3RydWN0IHJiX3Jvb3QgKnJvb3QsIHU2NCBmaWxlX29mZnNldCwKKwkJCQkgICAgIHN0cnVjdCByYl9ub2RlICoqcHJldl9yZXQpCit7CisJc3RydWN0IHJiX25vZGUgKm4gPSByb290LT5yYl9ub2RlOworCXN0cnVjdCByYl9ub2RlICpwcmV2ID0gTlVMTDsKKwlzdHJ1Y3QgcmJfbm9kZSAqdGVzdDsKKwlzdHJ1Y3QgYnRyZnNfb3JkZXJlZF9leHRlbnQgKmVudHJ5OworCXN0cnVjdCBidHJmc19vcmRlcmVkX2V4dGVudCAqcHJldl9lbnRyeSA9IE5VTEw7CisKKwl3aGlsZSAobikgeworCQllbnRyeSA9IHJiX2VudHJ5KG4sIHN0cnVjdCBidHJmc19vcmRlcmVkX2V4dGVudCwgcmJfbm9kZSk7CisJCXByZXYgPSBuOworCQlwcmV2X2VudHJ5ID0gZW50cnk7CisKKwkJaWYgKGZpbGVfb2Zmc2V0IDwgZW50cnktPmZpbGVfb2Zmc2V0KQorCQkJbiA9IG4tPnJiX2xlZnQ7CisJCWVsc2UgaWYgKGZpbGVfb2Zmc2V0ID49IGVudHJ5X2VuZChlbnRyeSkpCisJCQluID0gbi0+cmJfcmlnaHQ7CisJCWVsc2UKKwkJCXJldHVybiBuOworCX0KKwlpZiAoIXByZXZfcmV0KQorCQlyZXR1cm4gTlVMTDsKKworCXdoaWxlIChwcmV2ICYmIGZpbGVfb2Zmc2V0ID49IGVudHJ5X2VuZChwcmV2X2VudHJ5KSkgeworCQl0ZXN0ID0gcmJfbmV4dChwcmV2KTsKKwkJaWYgKCF0ZXN0KQorCQkJYnJlYWs7CisJCXByZXZfZW50cnkgPSByYl9lbnRyeSh0ZXN0LCBzdHJ1Y3QgYnRyZnNfb3JkZXJlZF9leHRlbnQsCisJCQkJICAgICAgcmJfbm9kZSk7CisJCWlmIChmaWxlX29mZnNldCA8IGVudHJ5X2VuZChwcmV2X2VudHJ5KSkKKwkJCWJyZWFrOworCisJCXByZXYgPSB0ZXN0OworCX0KKwlpZiAocHJldikKKwkJcHJldl9lbnRyeSA9IHJiX2VudHJ5KHByZXYsIHN0cnVjdCBidHJmc19vcmRlcmVkX2V4dGVudCwKKwkJCQkgICAgICByYl9ub2RlKTsKKwl3aGlsZSAocHJldiAmJiBmaWxlX29mZnNldCA8IGVudHJ5X2VuZChwcmV2X2VudHJ5KSkgeworCQl0ZXN0ID0gcmJfcHJldihwcmV2KTsKKwkJaWYgKCF0ZXN0KQorCQkJYnJlYWs7CisJCXByZXZfZW50cnkgPSByYl9lbnRyeSh0ZXN0LCBzdHJ1Y3QgYnRyZnNfb3JkZXJlZF9leHRlbnQsCisJCQkJICAgICAgcmJfbm9kZSk7CisJCXByZXYgPSB0ZXN0OworCX0KKwkqcHJldl9yZXQgPSBwcmV2OworCXJldHVybiBOVUxMOworfQorCisvKgorICogaGVscGVyIHRvIGNoZWNrIGlmIGEgZ2l2ZW4gb2Zmc2V0IGlzIGluc2lkZSBhIGdpdmVuIGVudHJ5CisgKi8KK3N0YXRpYyBpbnQgb2Zmc2V0X2luX2VudHJ5KHN0cnVjdCBidHJmc19vcmRlcmVkX2V4dGVudCAqZW50cnksIHU2NCBmaWxlX29mZnNldCkKK3sKKwlpZiAoZmlsZV9vZmZzZXQgPCBlbnRyeS0+ZmlsZV9vZmZzZXQgfHwKKwkgICAgZW50cnktPmZpbGVfb2Zmc2V0ICsgZW50cnktPmxlbiA8PSBmaWxlX29mZnNldCkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBsb29rIGZpbmQgdGhlIGZpcnN0IG9yZGVyZWQgc3RydWN0IHRoYXQgaGFzIHRoaXMgb2Zmc2V0LCBvdGhlcndpc2UKKyAqIHRoZSBmaXJzdCBvbmUgbGVzcyB0aGFuIHRoaXMgb2Zmc2V0CisgKi8KK3N0YXRpYyBpbmxpbmUgc3RydWN0IHJiX25vZGUgKnRyZWVfc2VhcmNoKHN0cnVjdCBidHJmc19vcmRlcmVkX2lub2RlX3RyZWUgKnRyZWUsCisJCQkJCSAgdTY0IGZpbGVfb2Zmc2V0KQoreworCXN0cnVjdCByYl9yb290ICpyb290ID0gJnRyZWUtPnRyZWU7CisJc3RydWN0IHJiX25vZGUgKnByZXY7CisJc3RydWN0IHJiX25vZGUgKnJldDsKKwlzdHJ1Y3QgYnRyZnNfb3JkZXJlZF9leHRlbnQgKmVudHJ5OworCisJaWYgKHRyZWUtPmxhc3QpIHsKKwkJZW50cnkgPSByYl9lbnRyeSh0cmVlLT5sYXN0LCBzdHJ1Y3QgYnRyZnNfb3JkZXJlZF9leHRlbnQsCisJCQkJIHJiX25vZGUpOworCQlpZiAob2Zmc2V0X2luX2VudHJ5KGVudHJ5LCBmaWxlX29mZnNldCkpCisJCQlyZXR1cm4gdHJlZS0+bGFzdDsKKwl9CisJcmV0ID0gX190cmVlX3NlYXJjaChyb290LCBmaWxlX29mZnNldCwgJnByZXYpOworCWlmICghcmV0KQorCQlyZXQgPSBwcmV2OworCWlmIChyZXQpCisJCXRyZWUtPmxhc3QgPSByZXQ7CisJcmV0dXJuIHJldDsKK30KKworLyogYWxsb2NhdGUgYW5kIGFkZCBhIG5ldyBvcmRlcmVkX2V4dGVudCBpbnRvIHRoZSBwZXItaW5vZGUgdHJlZS4KKyAqIGZpbGVfb2Zmc2V0IGlzIHRoZSBsb2dpY2FsIG9mZnNldCBpbiB0aGUgZmlsZQorICoKKyAqIHN0YXJ0IGlzIHRoZSBkaXNrIGJsb2NrIG51bWJlciBvZiBhbiBleHRlbnQgYWxyZWFkeSByZXNlcnZlZCBpbiB0aGUKKyAqIGV4dGVudCBhbGxvY2F0aW9uIHRyZWUKKyAqCisgKiBsZW4gaXMgdGhlIGxlbmd0aCBvZiB0aGUgZXh0ZW50CisgKgorICogVGhpcyBhbHNvIHNldHMgdGhlIEVYVEVOVF9PUkRFUkVEIGJpdCBvbiB0aGUgcmFuZ2UgaW4gdGhlIGlub2RlLgorICoKKyAqIFRoZSB0cmVlIGlzIGdpdmVuIGEgc2luZ2xlIHJlZmVyZW5jZSBvbiB0aGUgb3JkZXJlZCBleHRlbnQgdGhhdCB3YXMKKyAqIGluc2VydGVkLgorICovCitpbnQgYnRyZnNfYWRkX29yZGVyZWRfZXh0ZW50KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHU2NCBmaWxlX29mZnNldCwKKwkJCSAgICAgdTY0IHN0YXJ0LCB1NjQgbGVuLCB1NjQgZGlza19sZW4sIGludCB0eXBlKQoreworCXN0cnVjdCBidHJmc19vcmRlcmVkX2lub2RlX3RyZWUgKnRyZWU7CisJc3RydWN0IHJiX25vZGUgKm5vZGU7CisJc3RydWN0IGJ0cmZzX29yZGVyZWRfZXh0ZW50ICplbnRyeTsKKworCXRyZWUgPSAmQlRSRlNfSShpbm9kZSktPm9yZGVyZWRfdHJlZTsKKwllbnRyeSA9IGt6YWxsb2Moc2l6ZW9mKCplbnRyeSksIEdGUF9OT0ZTKTsKKwlpZiAoIWVudHJ5KQorCQlyZXR1cm4gLUVOT01FTTsKKworCW11dGV4X2xvY2soJnRyZWUtPm11dGV4KTsKKwllbnRyeS0+ZmlsZV9vZmZzZXQgPSBmaWxlX29mZnNldDsKKwllbnRyeS0+c3RhcnQgPSBzdGFydDsKKwllbnRyeS0+bGVuID0gbGVuOworCWVudHJ5LT5kaXNrX2xlbiA9IGRpc2tfbGVuOworCWVudHJ5LT5pbm9kZSA9IGlub2RlOworCWlmICh0eXBlICE9IEJUUkZTX09SREVSRURfSU9fRE9ORSAmJiB0eXBlICE9IEJUUkZTX09SREVSRURfQ09NUExFVEUpCisJCXNldF9iaXQodHlwZSwgJmVudHJ5LT5mbGFncyk7CisKKwkvKiBvbmUgcmVmIGZvciB0aGUgdHJlZSAqLworCWF0b21pY19zZXQoJmVudHJ5LT5yZWZzLCAxKTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZlbnRyeS0+d2FpdCk7CisJSU5JVF9MSVNUX0hFQUQoJmVudHJ5LT5saXN0KTsKKwlJTklUX0xJU1RfSEVBRCgmZW50cnktPnJvb3RfZXh0ZW50X2xpc3QpOworCisJbm9kZSA9IHRyZWVfaW5zZXJ0KCZ0cmVlLT50cmVlLCBmaWxlX29mZnNldCwKKwkJCSAgICZlbnRyeS0+cmJfbm9kZSk7CisJQlVHX09OKG5vZGUpOworCisJc2V0X2V4dGVudF9vcmRlcmVkKCZCVFJGU19JKGlub2RlKS0+aW9fdHJlZSwgZmlsZV9vZmZzZXQsCisJCQkgICBlbnRyeV9lbmQoZW50cnkpIC0gMSwgR0ZQX05PRlMpOworCisJc3Bpbl9sb2NrKCZCVFJGU19JKGlub2RlKS0+cm9vdC0+ZnNfaW5mby0+b3JkZXJlZF9leHRlbnRfbG9jayk7CisJbGlzdF9hZGRfdGFpbCgmZW50cnktPnJvb3RfZXh0ZW50X2xpc3QsCisJCSAgICAgICZCVFJGU19JKGlub2RlKS0+cm9vdC0+ZnNfaW5mby0+b3JkZXJlZF9leHRlbnRzKTsKKwlzcGluX3VubG9jaygmQlRSRlNfSShpbm9kZSktPnJvb3QtPmZzX2luZm8tPm9yZGVyZWRfZXh0ZW50X2xvY2spOworCisJbXV0ZXhfdW5sb2NrKCZ0cmVlLT5tdXRleCk7CisJQlVHX09OKG5vZGUpOworCXJldHVybiAwOworfQorCisvKgorICogQWRkIGEgc3RydWN0IGJ0cmZzX29yZGVyZWRfc3VtIGludG8gdGhlIGxpc3Qgb2YgY2hlY2tzdW1zIHRvIGJlIGluc2VydGVkCisgKiB3aGVuIGFuIG9yZGVyZWQgZXh0ZW50IGlzIGZpbmlzaGVkLiAgSWYgdGhlIGxpc3QgY292ZXJzIG1vcmUgdGhhbiBvbmUKKyAqIG9yZGVyZWQgZXh0ZW50LCBpdCBpcyBzcGxpdCBhY3Jvc3MgbXVsdGlwbGVzLgorICovCitpbnQgYnRyZnNfYWRkX29yZGVyZWRfc3VtKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkgIHN0cnVjdCBidHJmc19vcmRlcmVkX2V4dGVudCAqZW50cnksCisJCQkgIHN0cnVjdCBidHJmc19vcmRlcmVkX3N1bSAqc3VtKQoreworCXN0cnVjdCBidHJmc19vcmRlcmVkX2lub2RlX3RyZWUgKnRyZWU7CisKKwl0cmVlID0gJkJUUkZTX0koaW5vZGUpLT5vcmRlcmVkX3RyZWU7CisJbXV0ZXhfbG9jaygmdHJlZS0+bXV0ZXgpOworCWxpc3RfYWRkX3RhaWwoJnN1bS0+bGlzdCwgJmVudHJ5LT5saXN0KTsKKwltdXRleF91bmxvY2soJnRyZWUtPm11dGV4KTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIHRoaXMgaXMgdXNlZCB0byBhY2NvdW50IGZvciBmaW5pc2hlZCBJTyBhY3Jvc3MgYSBnaXZlbiByYW5nZQorICogb2YgdGhlIGZpbGUuICBUaGUgSU8gc2hvdWxkIG5vdCBzcGFuIG9yZGVyZWQgZXh0ZW50cy4gIElmCisgKiBhIGdpdmVuIG9yZGVyZWRfZXh0ZW50IGlzIGNvbXBsZXRlbHkgZG9uZSwgMSBpcyByZXR1cm5lZCwgb3RoZXJ3aXNlCisgKiAwLgorICoKKyAqIHRlc3RfYW5kX3NldF9iaXQgb24gYSBmbGFnIGluIHRoZSBzdHJ1Y3QgYnRyZnNfb3JkZXJlZF9leHRlbnQgaXMgdXNlZAorICogdG8gbWFrZSBzdXJlIHRoaXMgZnVuY3Rpb24gb25seSByZXR1cm5zIDEgb25jZSBmb3IgYSBnaXZlbiBvcmRlcmVkIGV4dGVudC4KKyAqLworaW50IGJ0cmZzX2RlY190ZXN0X29yZGVyZWRfcGVuZGluZyhzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCSAgIHU2NCBmaWxlX29mZnNldCwgdTY0IGlvX3NpemUpCit7CisJc3RydWN0IGJ0cmZzX29yZGVyZWRfaW5vZGVfdHJlZSAqdHJlZTsKKwlzdHJ1Y3QgcmJfbm9kZSAqbm9kZTsKKwlzdHJ1Y3QgYnRyZnNfb3JkZXJlZF9leHRlbnQgKmVudHJ5OworCXN0cnVjdCBleHRlbnRfaW9fdHJlZSAqaW9fdHJlZSA9ICZCVFJGU19JKGlub2RlKS0+aW9fdHJlZTsKKwlpbnQgcmV0OworCisJdHJlZSA9ICZCVFJGU19JKGlub2RlKS0+b3JkZXJlZF90cmVlOworCW11dGV4X2xvY2soJnRyZWUtPm11dGV4KTsKKwljbGVhcl9leHRlbnRfb3JkZXJlZChpb190cmVlLCBmaWxlX29mZnNldCwgZmlsZV9vZmZzZXQgKyBpb19zaXplIC0gMSwKKwkJCSAgICAgR0ZQX05PRlMpOworCW5vZGUgPSB0cmVlX3NlYXJjaCh0cmVlLCBmaWxlX29mZnNldCk7CisJaWYgKCFub2RlKSB7CisJCXJldCA9IDE7CisJCWdvdG8gb3V0OworCX0KKworCWVudHJ5ID0gcmJfZW50cnkobm9kZSwgc3RydWN0IGJ0cmZzX29yZGVyZWRfZXh0ZW50LCByYl9ub2RlKTsKKwlpZiAoIW9mZnNldF9pbl9lbnRyeShlbnRyeSwgZmlsZV9vZmZzZXQpKSB7CisJCXJldCA9IDE7CisJCWdvdG8gb3V0OworCX0KKworCXJldCA9IHRlc3RfcmFuZ2VfYml0KGlvX3RyZWUsIGVudHJ5LT5maWxlX29mZnNldCwKKwkJCSAgICAgZW50cnktPmZpbGVfb2Zmc2V0ICsgZW50cnktPmxlbiAtIDEsCisJCQkgICAgIEVYVEVOVF9PUkRFUkVELCAwKTsKKwlpZiAocmV0ID09IDApCisJCXJldCA9IHRlc3RfYW5kX3NldF9iaXQoQlRSRlNfT1JERVJFRF9JT19ET05FLCAmZW50cnktPmZsYWdzKTsKK291dDoKKwltdXRleF91bmxvY2soJnRyZWUtPm11dGV4KTsKKwlyZXR1cm4gcmV0ID09IDA7Cit9CisKKy8qCisgKiB1c2VkIHRvIGRyb3AgYSByZWZlcmVuY2Ugb24gYW4gb3JkZXJlZCBleHRlbnQuICBUaGlzIHdpbGwgZnJlZQorICogdGhlIGV4dGVudCBpZiB0aGUgbGFzdCByZWZlcmVuY2UgaXMgZHJvcHBlZAorICovCitpbnQgYnRyZnNfcHV0X29yZGVyZWRfZXh0ZW50KHN0cnVjdCBidHJmc19vcmRlcmVkX2V4dGVudCAqZW50cnkpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqY3VyOworCXN0cnVjdCBidHJmc19vcmRlcmVkX3N1bSAqc3VtOworCisJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJmVudHJ5LT5yZWZzKSkgeworCQl3aGlsZSAoIWxpc3RfZW1wdHkoJmVudHJ5LT5saXN0KSkgeworCQkJY3VyID0gZW50cnktPmxpc3QubmV4dDsKKwkJCXN1bSA9IGxpc3RfZW50cnkoY3VyLCBzdHJ1Y3QgYnRyZnNfb3JkZXJlZF9zdW0sIGxpc3QpOworCQkJbGlzdF9kZWwoJnN1bS0+bGlzdCk7CisJCQlrZnJlZShzdW0pOworCQl9CisJCWtmcmVlKGVudHJ5KTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiByZW1vdmUgYW4gb3JkZXJlZCBleHRlbnQgZnJvbSB0aGUgdHJlZS4gIE5vIHJlZmVyZW5jZXMgYXJlIGRyb3BwZWQKKyAqIGJ1dCwgYW55b25lIHdhaXRpbmcgb24gdGhpcyBleHRlbnQgaXMgd29rZW4gdXAuCisgKi8KK2ludCBidHJmc19yZW1vdmVfb3JkZXJlZF9leHRlbnQoc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQlzdHJ1Y3QgYnRyZnNfb3JkZXJlZF9leHRlbnQgKmVudHJ5KQoreworCXN0cnVjdCBidHJmc19vcmRlcmVkX2lub2RlX3RyZWUgKnRyZWU7CisJc3RydWN0IHJiX25vZGUgKm5vZGU7CisKKwl0cmVlID0gJkJUUkZTX0koaW5vZGUpLT5vcmRlcmVkX3RyZWU7CisJbXV0ZXhfbG9jaygmdHJlZS0+bXV0ZXgpOworCW5vZGUgPSAmZW50cnktPnJiX25vZGU7CisJcmJfZXJhc2Uobm9kZSwgJnRyZWUtPnRyZWUpOworCXRyZWUtPmxhc3QgPSBOVUxMOworCXNldF9iaXQoQlRSRlNfT1JERVJFRF9DT01QTEVURSwgJmVudHJ5LT5mbGFncyk7CisKKwlzcGluX2xvY2soJkJUUkZTX0koaW5vZGUpLT5yb290LT5mc19pbmZvLT5vcmRlcmVkX2V4dGVudF9sb2NrKTsKKwlsaXN0X2RlbF9pbml0KCZlbnRyeS0+cm9vdF9leHRlbnRfbGlzdCk7CisJc3Bpbl91bmxvY2soJkJUUkZTX0koaW5vZGUpLT5yb290LT5mc19pbmZvLT5vcmRlcmVkX2V4dGVudF9sb2NrKTsKKworCW11dGV4X3VubG9jaygmdHJlZS0+bXV0ZXgpOworCXdha2VfdXAoJmVudHJ5LT53YWl0KTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIHdhaXQgZm9yIGFsbCB0aGUgb3JkZXJlZCBleHRlbnRzIGluIGEgcm9vdC4gIFRoaXMgaXMgZG9uZSB3aGVuIGJhbGFuY2luZworICogc3BhY2UgYmV0d2VlbiBkcml2ZXMuCisgKi8KK2ludCBidHJmc193YWl0X29yZGVyZWRfZXh0ZW50cyhzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwgaW50IG5vY293X29ubHkpCit7CisJc3RydWN0IGxpc3RfaGVhZCBzcGxpY2U7CisJc3RydWN0IGxpc3RfaGVhZCAqY3VyOworCXN0cnVjdCBidHJmc19vcmRlcmVkX2V4dGVudCAqb3JkZXJlZDsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCisJSU5JVF9MSVNUX0hFQUQoJnNwbGljZSk7CisKKwlzcGluX2xvY2soJnJvb3QtPmZzX2luZm8tPm9yZGVyZWRfZXh0ZW50X2xvY2spOworCWxpc3Rfc3BsaWNlX2luaXQoJnJvb3QtPmZzX2luZm8tPm9yZGVyZWRfZXh0ZW50cywgJnNwbGljZSk7CisJd2hpbGUgKCFsaXN0X2VtcHR5KCZzcGxpY2UpKSB7CisJCWN1ciA9IHNwbGljZS5uZXh0OworCQlvcmRlcmVkID0gbGlzdF9lbnRyeShjdXIsIHN0cnVjdCBidHJmc19vcmRlcmVkX2V4dGVudCwKKwkJCQkgICAgIHJvb3RfZXh0ZW50X2xpc3QpOworCQlpZiAobm9jb3dfb25seSAmJgorCQkgICAgIXRlc3RfYml0KEJUUkZTX09SREVSRURfTk9DT1csICZvcmRlcmVkLT5mbGFncykgJiYKKwkJICAgICF0ZXN0X2JpdChCVFJGU19PUkRFUkVEX1BSRUFMTE9DLCAmb3JkZXJlZC0+ZmxhZ3MpKSB7CisJCQlsaXN0X21vdmUoJm9yZGVyZWQtPnJvb3RfZXh0ZW50X2xpc3QsCisJCQkJICAmcm9vdC0+ZnNfaW5mby0+b3JkZXJlZF9leHRlbnRzKTsKKwkJCWNvbmRfcmVzY2hlZF9sb2NrKCZyb290LT5mc19pbmZvLT5vcmRlcmVkX2V4dGVudF9sb2NrKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJbGlzdF9kZWxfaW5pdCgmb3JkZXJlZC0+cm9vdF9leHRlbnRfbGlzdCk7CisJCWF0b21pY19pbmMoJm9yZGVyZWQtPnJlZnMpOworCisJCS8qCisJCSAqIHRoZSBpbm9kZSBtYXkgYmUgZ2V0dGluZyBmcmVlZCAoaW4gc3lzX3VubGluayBwYXRoKS4KKwkJICovCisJCWlub2RlID0gaWdyYWIob3JkZXJlZC0+aW5vZGUpOworCisJCXNwaW5fdW5sb2NrKCZyb290LT5mc19pbmZvLT5vcmRlcmVkX2V4dGVudF9sb2NrKTsKKworCQlpZiAoaW5vZGUpIHsKKwkJCWJ0cmZzX3N0YXJ0X29yZGVyZWRfZXh0ZW50KGlub2RlLCBvcmRlcmVkLCAxKTsKKwkJCWJ0cmZzX3B1dF9vcmRlcmVkX2V4dGVudChvcmRlcmVkKTsKKwkJCWlwdXQoaW5vZGUpOworCQl9IGVsc2UgeworCQkJYnRyZnNfcHV0X29yZGVyZWRfZXh0ZW50KG9yZGVyZWQpOworCQl9CisKKwkJc3Bpbl9sb2NrKCZyb290LT5mc19pbmZvLT5vcmRlcmVkX2V4dGVudF9sb2NrKTsKKwl9CisJc3Bpbl91bmxvY2soJnJvb3QtPmZzX2luZm8tPm9yZGVyZWRfZXh0ZW50X2xvY2spOworCXJldHVybiAwOworfQorCisvKgorICogVXNlZCB0byBzdGFydCBJTyBvciB3YWl0IGZvciBhIGdpdmVuIG9yZGVyZWQgZXh0ZW50IHRvIGZpbmlzaC4KKyAqCisgKiBJZiB3YWl0IGlzIG9uZSwgdGhpcyBlZmZlY3RpdmVseSB3YWl0cyBvbiBwYWdlIHdyaXRlYmFjayBmb3IgYWxsIHRoZSBwYWdlcworICogaW4gdGhlIGV4dGVudCwgYW5kIGl0IHdhaXRzIG9uIHRoZSBpbyBjb21wbGV0aW9uIGNvZGUgdG8gaW5zZXJ0CisgKiBtZXRhZGF0YSBpbnRvIHRoZSBidHJlZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBleHRlbnQKKyAqLwordm9pZCBidHJmc19zdGFydF9vcmRlcmVkX2V4dGVudChzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCSAgICAgICBzdHJ1Y3QgYnRyZnNfb3JkZXJlZF9leHRlbnQgKmVudHJ5LAorCQkJCSAgICAgICBpbnQgd2FpdCkKK3sKKwl1NjQgc3RhcnQgPSBlbnRyeS0+ZmlsZV9vZmZzZXQ7CisJdTY0IGVuZCA9IHN0YXJ0ICsgZW50cnktPmxlbiAtIDE7CisKKwkvKgorCSAqIHBhZ2VzIGluIHRoZSByYW5nZSBjYW4gYmUgZGlydHksIGNsZWFuIG9yIHdyaXRlYmFjay4gIFdlCisJICogc3RhcnQgSU8gb24gYW55IGRpcnR5IG9uZXMgc28gdGhlIHdhaXQgZG9lc24ndCBzdGFsbCB3YWl0aW5nCisJICogZm9yIHBkZmx1c2ggdG8gZmluZCB0aGVtCisJICovCisJYnRyZnNfZmRhdGF3cml0ZV9yYW5nZShpbm9kZS0+aV9tYXBwaW5nLCBzdGFydCwgZW5kLCBXQl9TWU5DX0FMTCk7CisJaWYgKHdhaXQpIHsKKwkJd2FpdF9ldmVudChlbnRyeS0+d2FpdCwgdGVzdF9iaXQoQlRSRlNfT1JERVJFRF9DT01QTEVURSwKKwkJCQkJCSAmZW50cnktPmZsYWdzKSk7CisJfQorfQorCisvKgorICogVXNlZCB0byB3YWl0IG9uIG9yZGVyZWQgZXh0ZW50cyBhY3Jvc3MgYSBsYXJnZSByYW5nZSBvZiBieXRlcy4KKyAqLworaW50IGJ0cmZzX3dhaXRfb3JkZXJlZF9yYW5nZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1NjQgc3RhcnQsIHU2NCBsZW4pCit7CisJdTY0IGVuZDsKKwl1NjQgb3JpZ19lbmQ7CisJdTY0IHdhaXRfZW5kOworCXN0cnVjdCBidHJmc19vcmRlcmVkX2V4dGVudCAqb3JkZXJlZDsKKworCWlmIChzdGFydCArIGxlbiA8IHN0YXJ0KSB7CisJCW9yaWdfZW5kID0gSU5UX0xJTUlUKGxvZmZfdCk7CisJfSBlbHNlIHsKKwkJb3JpZ19lbmQgPSBzdGFydCArIGxlbiAtIDE7CisJCWlmIChvcmlnX2VuZCA+IElOVF9MSU1JVChsb2ZmX3QpKQorCQkJb3JpZ19lbmQgPSBJTlRfTElNSVQobG9mZl90KTsKKwl9CisJd2FpdF9lbmQgPSBvcmlnX2VuZDsKK2FnYWluOgorCS8qIHN0YXJ0IElPIGFjcm9zcyB0aGUgcmFuZ2UgZmlyc3QgdG8gaW5zdGFudGlhdGUgYW55IGRlbGFsbG9jCisJICogZXh0ZW50cworCSAqLworCWJ0cmZzX2ZkYXRhd3JpdGVfcmFuZ2UoaW5vZGUtPmlfbWFwcGluZywgc3RhcnQsIG9yaWdfZW5kLCBXQl9TWU5DX05PTkUpOworCisJLyogVGhlIGNvbXByZXNzaW9uIGNvZGUgd2lsbCBsZWF2ZSBwYWdlcyBsb2NrZWQgYnV0IHJldHVybiBmcm9tCisJICogd3JpdGVwYWdlIHdpdGhvdXQgc2V0dGluZyB0aGUgcGFnZSB3cml0ZWJhY2suICBTdGFydGluZyBhZ2FpbgorCSAqIHdpdGggV0JfU1lOQ19BTEwgd2lsbCBlbmQgdXAgd2FpdGluZyBmb3IgdGhlIElPIHRvIGFjdHVhbGx5IHN0YXJ0LgorCSAqLworCWJ0cmZzX2ZkYXRhd3JpdGVfcmFuZ2UoaW5vZGUtPmlfbWFwcGluZywgc3RhcnQsIG9yaWdfZW5kLCBXQl9TWU5DX0FMTCk7CisKKwlidHJmc193YWl0X29uX3BhZ2Vfd3JpdGViYWNrX3JhbmdlKGlub2RlLT5pX21hcHBpbmcsCisJCQkJCSAgIHN0YXJ0ID4+IFBBR0VfQ0FDSEVfU0hJRlQsCisJCQkJCSAgIG9yaWdfZW5kID4+IFBBR0VfQ0FDSEVfU0hJRlQpOworCisJZW5kID0gb3JpZ19lbmQ7CisJd2hpbGUgKDEpIHsKKwkJb3JkZXJlZCA9IGJ0cmZzX2xvb2t1cF9maXJzdF9vcmRlcmVkX2V4dGVudChpbm9kZSwgZW5kKTsKKwkJaWYgKCFvcmRlcmVkKQorCQkJYnJlYWs7CisJCWlmIChvcmRlcmVkLT5maWxlX29mZnNldCA+IG9yaWdfZW5kKSB7CisJCQlidHJmc19wdXRfb3JkZXJlZF9leHRlbnQob3JkZXJlZCk7CisJCQlicmVhazsKKwkJfQorCQlpZiAob3JkZXJlZC0+ZmlsZV9vZmZzZXQgKyBvcmRlcmVkLT5sZW4gPCBzdGFydCkgeworCQkJYnRyZnNfcHV0X29yZGVyZWRfZXh0ZW50KG9yZGVyZWQpOworCQkJYnJlYWs7CisJCX0KKwkJYnRyZnNfc3RhcnRfb3JkZXJlZF9leHRlbnQoaW5vZGUsIG9yZGVyZWQsIDEpOworCQllbmQgPSBvcmRlcmVkLT5maWxlX29mZnNldDsKKwkJYnRyZnNfcHV0X29yZGVyZWRfZXh0ZW50KG9yZGVyZWQpOworCQlpZiAoZW5kID09IDAgfHwgZW5kID09IHN0YXJ0KQorCQkJYnJlYWs7CisJCWVuZC0tOworCX0KKwlpZiAodGVzdF9yYW5nZV9iaXQoJkJUUkZTX0koaW5vZGUpLT5pb190cmVlLCBzdGFydCwgb3JpZ19lbmQsCisJCQkgICBFWFRFTlRfT1JERVJFRCB8IEVYVEVOVF9ERUxBTExPQywgMCkpIHsKKwkJc2NoZWR1bGVfdGltZW91dCgxKTsKKwkJZ290byBhZ2FpbjsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBmaW5kIGFuIG9yZGVyZWQgZXh0ZW50IGNvcnJlc3BvbmRpbmcgdG8gZmlsZV9vZmZzZXQuICByZXR1cm4gTlVMTCBpZgorICogbm90aGluZyBpcyBmb3VuZCwgb3RoZXJ3aXNlIHRha2UgYSByZWZlcmVuY2Ugb24gdGhlIGV4dGVudCBhbmQgcmV0dXJuIGl0CisgKi8KK3N0cnVjdCBidHJmc19vcmRlcmVkX2V4dGVudCAqYnRyZnNfbG9va3VwX29yZGVyZWRfZXh0ZW50KHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJCQkJIHU2NCBmaWxlX29mZnNldCkKK3sKKwlzdHJ1Y3QgYnRyZnNfb3JkZXJlZF9pbm9kZV90cmVlICp0cmVlOworCXN0cnVjdCByYl9ub2RlICpub2RlOworCXN0cnVjdCBidHJmc19vcmRlcmVkX2V4dGVudCAqZW50cnkgPSBOVUxMOworCisJdHJlZSA9ICZCVFJGU19JKGlub2RlKS0+b3JkZXJlZF90cmVlOworCW11dGV4X2xvY2soJnRyZWUtPm11dGV4KTsKKwlub2RlID0gdHJlZV9zZWFyY2godHJlZSwgZmlsZV9vZmZzZXQpOworCWlmICghbm9kZSkKKwkJZ290byBvdXQ7CisKKwllbnRyeSA9IHJiX2VudHJ5KG5vZGUsIHN0cnVjdCBidHJmc19vcmRlcmVkX2V4dGVudCwgcmJfbm9kZSk7CisJaWYgKCFvZmZzZXRfaW5fZW50cnkoZW50cnksIGZpbGVfb2Zmc2V0KSkKKwkJZW50cnkgPSBOVUxMOworCWlmIChlbnRyeSkKKwkJYXRvbWljX2luYygmZW50cnktPnJlZnMpOworb3V0OgorCW11dGV4X3VubG9jaygmdHJlZS0+bXV0ZXgpOworCXJldHVybiBlbnRyeTsKK30KKworLyoKKyAqIGxvb2t1cCBhbmQgcmV0dXJuIGFueSBleHRlbnQgYmVmb3JlICdmaWxlX29mZnNldCcuICBOVUxMIGlzIHJldHVybmVkCisgKiBpZiBub25lIGlzIGZvdW5kCisgKi8KK3N0cnVjdCBidHJmc19vcmRlcmVkX2V4dGVudCAqCitidHJmc19sb29rdXBfZmlyc3Rfb3JkZXJlZF9leHRlbnQoc3RydWN0IGlub2RlICppbm9kZSwgdTY0IGZpbGVfb2Zmc2V0KQoreworCXN0cnVjdCBidHJmc19vcmRlcmVkX2lub2RlX3RyZWUgKnRyZWU7CisJc3RydWN0IHJiX25vZGUgKm5vZGU7CisJc3RydWN0IGJ0cmZzX29yZGVyZWRfZXh0ZW50ICplbnRyeSA9IE5VTEw7CisKKwl0cmVlID0gJkJUUkZTX0koaW5vZGUpLT5vcmRlcmVkX3RyZWU7CisJbXV0ZXhfbG9jaygmdHJlZS0+bXV0ZXgpOworCW5vZGUgPSB0cmVlX3NlYXJjaCh0cmVlLCBmaWxlX29mZnNldCk7CisJaWYgKCFub2RlKQorCQlnb3RvIG91dDsKKworCWVudHJ5ID0gcmJfZW50cnkobm9kZSwgc3RydWN0IGJ0cmZzX29yZGVyZWRfZXh0ZW50LCByYl9ub2RlKTsKKwlhdG9taWNfaW5jKCZlbnRyeS0+cmVmcyk7CitvdXQ6CisJbXV0ZXhfdW5sb2NrKCZ0cmVlLT5tdXRleCk7CisJcmV0dXJuIGVudHJ5OworfQorCisvKgorICogQWZ0ZXIgYW4gZXh0ZW50IGlzIGRvbmUsIGNhbGwgdGhpcyB0byBjb25kaXRpb25hbGx5IHVwZGF0ZSB0aGUgb24gZGlzaworICogaV9zaXplLiAgaV9zaXplIGlzIHVwZGF0ZWQgdG8gY292ZXIgYW55IGZ1bGx5IHdyaXR0ZW4gcGFydCBvZiB0aGUgZmlsZS4KKyAqLworaW50IGJ0cmZzX29yZGVyZWRfdXBkYXRlX2lfc2l6ZShzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCXN0cnVjdCBidHJmc19vcmRlcmVkX2V4dGVudCAqb3JkZXJlZCkKK3sKKwlzdHJ1Y3QgYnRyZnNfb3JkZXJlZF9pbm9kZV90cmVlICp0cmVlID0gJkJUUkZTX0koaW5vZGUpLT5vcmRlcmVkX3RyZWU7CisJc3RydWN0IGV4dGVudF9pb190cmVlICppb190cmVlID0gJkJUUkZTX0koaW5vZGUpLT5pb190cmVlOworCXU2NCBkaXNrX2lfc2l6ZTsKKwl1NjQgbmV3X2lfc2l6ZTsKKwl1NjQgaV9zaXplX3Rlc3Q7CisJc3RydWN0IHJiX25vZGUgKm5vZGU7CisJc3RydWN0IGJ0cmZzX29yZGVyZWRfZXh0ZW50ICp0ZXN0OworCisJbXV0ZXhfbG9jaygmdHJlZS0+bXV0ZXgpOworCWRpc2tfaV9zaXplID0gQlRSRlNfSShpbm9kZSktPmRpc2tfaV9zaXplOworCisJLyoKKwkgKiBpZiB0aGUgZGlzayBpX3NpemUgaXMgYWxyZWFkeSBhdCB0aGUgaW5vZGUtPmlfc2l6ZSwgb3IKKwkgKiB0aGlzIG9yZGVyZWQgZXh0ZW50IGlzIGluc2lkZSB0aGUgZGlzayBpX3NpemUsIHdlJ3JlIGRvbmUKKwkgKi8KKwlpZiAoZGlza19pX3NpemUgPj0gaW5vZGUtPmlfc2l6ZSB8fAorCSAgICBvcmRlcmVkLT5maWxlX29mZnNldCArIG9yZGVyZWQtPmxlbiA8PSBkaXNrX2lfc2l6ZSkgeworCQlnb3RvIG91dDsKKwl9CisKKwkvKgorCSAqIHdlIGNhbid0IHVwZGF0ZSB0aGUgZGlza19pc2l6ZSBpZiB0aGVyZSBhcmUgZGVsYWxsb2MgYnl0ZXMKKwkgKiBiZXR3ZWVuIGRpc2tfaV9zaXplIGFuZCAgdGhpcyBvcmRlcmVkIGV4dGVudAorCSAqLworCWlmICh0ZXN0X3JhbmdlX2JpdChpb190cmVlLCBkaXNrX2lfc2l6ZSwKKwkJCSAgIG9yZGVyZWQtPmZpbGVfb2Zmc2V0ICsgb3JkZXJlZC0+bGVuIC0gMSwKKwkJCSAgIEVYVEVOVF9ERUxBTExPQywgMCkpIHsKKwkJZ290byBvdXQ7CisJfQorCS8qCisJICogd2FsayBiYWNrd2FyZCBmcm9tIHRoaXMgb3JkZXJlZCBleHRlbnQgdG8gZGlza19pX3NpemUuCisJICogaWYgd2UgZmluZCBhbiBvcmRlcmVkIGV4dGVudCB0aGVuIHdlIGNhbid0IHVwZGF0ZSBkaXNrIGlfc2l6ZQorCSAqIHlldAorCSAqLworCW5vZGUgPSAmb3JkZXJlZC0+cmJfbm9kZTsKKwl3aGlsZSAoMSkgeworCQlub2RlID0gcmJfcHJldihub2RlKTsKKwkJaWYgKCFub2RlKQorCQkJYnJlYWs7CisJCXRlc3QgPSByYl9lbnRyeShub2RlLCBzdHJ1Y3QgYnRyZnNfb3JkZXJlZF9leHRlbnQsIHJiX25vZGUpOworCQlpZiAodGVzdC0+ZmlsZV9vZmZzZXQgKyB0ZXN0LT5sZW4gPD0gZGlza19pX3NpemUpCisJCQlicmVhazsKKwkJaWYgKHRlc3QtPmZpbGVfb2Zmc2V0ID49IGlub2RlLT5pX3NpemUpCisJCQlicmVhazsKKwkJaWYgKHRlc3QtPmZpbGVfb2Zmc2V0ID49IGRpc2tfaV9zaXplKQorCQkJZ290byBvdXQ7CisJfQorCW5ld19pX3NpemUgPSBtaW5fdCh1NjQsIGVudHJ5X2VuZChvcmRlcmVkKSwgaV9zaXplX3JlYWQoaW5vZGUpKTsKKworCS8qCisJICogYXQgdGhpcyBwb2ludCwgd2Uga25vdyB3ZSBjYW4gc2FmZWx5IHVwZGF0ZSBpX3NpemUgdG8gYXQgbGVhc3QKKwkgKiB0aGUgb2Zmc2V0IGZyb20gdGhpcyBvcmRlcmVkIGV4dGVudC4gIEJ1dCwgd2UgbmVlZCB0bworCSAqIHdhbGsgZm9yd2FyZCBhbmQgc2VlIGlmIGlvcyBmcm9tIGhpZ2hlciB1cCBpbiB0aGUgZmlsZSBoYXZlCisJICogZmluaXNoZWQuCisJICovCisJbm9kZSA9IHJiX25leHQoJm9yZGVyZWQtPnJiX25vZGUpOworCWlfc2l6ZV90ZXN0ID0gMDsKKwlpZiAobm9kZSkgeworCQkvKgorCQkgKiBkbyB3ZSBoYXZlIGFuIGFyZWEgd2hlcmUgSU8gbWlnaHQgaGF2ZSBmaW5pc2hlZAorCQkgKiBiZXR3ZWVuIG91ciBvcmRlcmVkIGV4dGVudCBhbmQgdGhlIG5leHQgb25lLgorCQkgKi8KKwkJdGVzdCA9IHJiX2VudHJ5KG5vZGUsIHN0cnVjdCBidHJmc19vcmRlcmVkX2V4dGVudCwgcmJfbm9kZSk7CisJCWlmICh0ZXN0LT5maWxlX29mZnNldCA+IGVudHJ5X2VuZChvcmRlcmVkKSkKKwkJCWlfc2l6ZV90ZXN0ID0gdGVzdC0+ZmlsZV9vZmZzZXQ7CisJfSBlbHNlIHsKKwkJaV9zaXplX3Rlc3QgPSBpX3NpemVfcmVhZChpbm9kZSk7CisJfQorCisJLyoKKwkgKiBpX3NpemVfdGVzdCBpcyB0aGUgZW5kIG9mIGEgcmVnaW9uIGFmdGVyIHRoaXMgb3JkZXJlZAorCSAqIGV4dGVudCB3aGVyZSB0aGVyZSBhcmUgbm8gb3JkZXJlZCBleHRlbnRzLiAgQXMgbG9uZyBhcyB0aGVyZQorCSAqIGFyZSBubyBkZWxhbGxvYyBieXRlcyBpbiB0aGlzIGFyZWEsIGl0IGlzIHNhZmUgdG8gdXBkYXRlCisJICogZGlza19pX3NpemUgdG8gdGhlIGVuZCBvZiB0aGUgcmVnaW9uLgorCSAqLworCWlmIChpX3NpemVfdGVzdCA+IGVudHJ5X2VuZChvcmRlcmVkKSAmJgorCSAgICAhdGVzdF9yYW5nZV9iaXQoaW9fdHJlZSwgZW50cnlfZW5kKG9yZGVyZWQpLCBpX3NpemVfdGVzdCAtIDEsCisJCQkgICBFWFRFTlRfREVMQUxMT0MsIDApKSB7CisJCW5ld19pX3NpemUgPSBtaW5fdCh1NjQsIGlfc2l6ZV90ZXN0LCBpX3NpemVfcmVhZChpbm9kZSkpOworCX0KKwlCVFJGU19JKGlub2RlKS0+ZGlza19pX3NpemUgPSBuZXdfaV9zaXplOworb3V0OgorCW11dGV4X3VubG9jaygmdHJlZS0+bXV0ZXgpOworCXJldHVybiAwOworfQorCisvKgorICogc2VhcmNoIHRoZSBvcmRlcmVkIGV4dGVudHMgZm9yIG9uZSBjb3JyZXNwb25kaW5nIHRvICdvZmZzZXQnIGFuZAorICogdHJ5IHRvIGZpbmQgYSBjaGVja3N1bS4gIFRoaXMgaXMgdXNlZCBiZWNhdXNlIHdlIGFsbG93IHBhZ2VzIHRvCisgKiBiZSByZWNsYWltZWQgYmVmb3JlIHRoZWlyIGNoZWNrc3VtIGlzIGFjdHVhbGx5IHB1dCBpbnRvIHRoZSBidHJlZQorICovCitpbnQgYnRyZnNfZmluZF9vcmRlcmVkX3N1bShzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1NjQgb2Zmc2V0LCB1NjQgZGlza19ieXRlbnIsCisJCQkgICB1MzIgKnN1bSkKK3sKKwlzdHJ1Y3QgYnRyZnNfb3JkZXJlZF9zdW0gKm9yZGVyZWRfc3VtOworCXN0cnVjdCBidHJmc19zZWN0b3Jfc3VtICpzZWN0b3Jfc3VtczsKKwlzdHJ1Y3QgYnRyZnNfb3JkZXJlZF9leHRlbnQgKm9yZGVyZWQ7CisJc3RydWN0IGJ0cmZzX29yZGVyZWRfaW5vZGVfdHJlZSAqdHJlZSA9ICZCVFJGU19JKGlub2RlKS0+b3JkZXJlZF90cmVlOworCXN0cnVjdCBsaXN0X2hlYWQgKmN1cjsKKwl1bnNpZ25lZCBsb25nIG51bV9zZWN0b3JzOworCXVuc2lnbmVkIGxvbmcgaTsKKwl1MzIgc2VjdG9yc2l6ZSA9IEJUUkZTX0koaW5vZGUpLT5yb290LT5zZWN0b3JzaXplOworCWludCByZXQgPSAxOworCisJb3JkZXJlZCA9IGJ0cmZzX2xvb2t1cF9vcmRlcmVkX2V4dGVudChpbm9kZSwgb2Zmc2V0KTsKKwlpZiAoIW9yZGVyZWQpCisJCXJldHVybiAxOworCisJbXV0ZXhfbG9jaygmdHJlZS0+bXV0ZXgpOworCWxpc3RfZm9yX2VhY2hfcHJldihjdXIsICZvcmRlcmVkLT5saXN0KSB7CisJCW9yZGVyZWRfc3VtID0gbGlzdF9lbnRyeShjdXIsIHN0cnVjdCBidHJmc19vcmRlcmVkX3N1bSwgbGlzdCk7CisJCWlmIChkaXNrX2J5dGVuciA+PSBvcmRlcmVkX3N1bS0+Ynl0ZW5yKSB7CisJCQludW1fc2VjdG9ycyA9IG9yZGVyZWRfc3VtLT5sZW4gLyBzZWN0b3JzaXplOworCQkJc2VjdG9yX3N1bXMgPSBvcmRlcmVkX3N1bS0+c3VtczsKKwkJCWZvciAoaSA9IDA7IGkgPCBudW1fc2VjdG9yczsgaSsrKSB7CisJCQkJaWYgKHNlY3Rvcl9zdW1zW2ldLmJ5dGVuciA9PSBkaXNrX2J5dGVucikgeworCQkJCQkqc3VtID0gc2VjdG9yX3N1bXNbaV0uc3VtOworCQkJCQlyZXQgPSAwOworCQkJCQlnb3RvIG91dDsKKwkJCQl9CisJCQl9CisJCX0KKwl9CitvdXQ6CisJbXV0ZXhfdW5sb2NrKCZ0cmVlLT5tdXRleCk7CisJYnRyZnNfcHV0X29yZGVyZWRfZXh0ZW50KG9yZGVyZWQpOworCXJldHVybiByZXQ7Cit9CisKKworLyoqCisgKiB0YWtlbiBmcm9tIG1tL2ZpbGVtYXAuYyBiZWNhdXNlIGl0IGlzbid0IGV4cG9ydGVkCisgKgorICogX19maWxlbWFwX2ZkYXRhd3JpdGVfcmFuZ2UgLSBzdGFydCB3cml0ZWJhY2sgb24gbWFwcGluZyBkaXJ0eSBwYWdlcyBpbiByYW5nZQorICogQG1hcHBpbmc6CWFkZHJlc3Mgc3BhY2Ugc3RydWN0dXJlIHRvIHdyaXRlCisgKiBAc3RhcnQ6CW9mZnNldCBpbiBieXRlcyB3aGVyZSB0aGUgcmFuZ2Ugc3RhcnRzCisgKiBAZW5kOglvZmZzZXQgaW4gYnl0ZXMgd2hlcmUgdGhlIHJhbmdlIGVuZHMgKGluY2x1c2l2ZSkKKyAqIEBzeW5jX21vZGU6CWVuYWJsZSBzeW5jaHJvbm91cyBvcGVyYXRpb24KKyAqCisgKiBTdGFydCB3cml0ZWJhY2sgYWdhaW5zdCBhbGwgb2YgYSBtYXBwaW5nJ3MgZGlydHkgcGFnZXMgdGhhdCBsaWUKKyAqIHdpdGhpbiB0aGUgYnl0ZSBvZmZzZXRzIDxzdGFydCwgZW5kPiBpbmNsdXNpdmUuCisgKgorICogSWYgc3luY19tb2RlIGlzIFdCX1NZTkNfQUxMIHRoZW4gdGhpcyBpcyBhICJkYXRhIGludGVncml0eSIgb3BlcmF0aW9uLCBhcworICogb3Bwb3NlZCB0byBhIHJlZ3VsYXIgbWVtb3J5IGNsZWFuc2luZyB3cml0ZWJhY2suICBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuCisgKiB0aGVzZSB0d28gb3BlcmF0aW9ucyBpcyB0aGF0IGlmIGEgZGlydHkgcGFnZS9idWZmZXIgaXMgZW5jb3VudGVyZWQsIGl0IG11c3QKKyAqIGJlIHdhaXRlZCB1cG9uLCBhbmQgbm90IGp1c3Qgc2tpcHBlZCBvdmVyLgorICovCitpbnQgYnRyZnNfZmRhdGF3cml0ZV9yYW5nZShzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywgbG9mZl90IHN0YXJ0LAorCQkJICAgbG9mZl90IGVuZCwgaW50IHN5bmNfbW9kZSkKK3sKKwlzdHJ1Y3Qgd3JpdGViYWNrX2NvbnRyb2wgd2JjID0geworCQkuc3luY19tb2RlID0gc3luY19tb2RlLAorCQkubnJfdG9fd3JpdGUgPSBtYXBwaW5nLT5ucnBhZ2VzICogMiwKKwkJLnJhbmdlX3N0YXJ0ID0gc3RhcnQsCisJCS5yYW5nZV9lbmQgPSBlbmQsCisJCS5mb3Jfd3JpdGVwYWdlcyA9IDEsCisJfTsKKwlyZXR1cm4gYnRyZnNfd3JpdGVwYWdlcyhtYXBwaW5nLCAmd2JjKTsKK30KKworLyoqCisgKiB0YWtlbiBmcm9tIG1tL2ZpbGVtYXAuYyBiZWNhdXNlIGl0IGlzbid0IGV4cG9ydGVkCisgKgorICogd2FpdF9vbl9wYWdlX3dyaXRlYmFja19yYW5nZSAtIHdhaXQgZm9yIHdyaXRlYmFjayB0byBjb21wbGV0ZQorICogQG1hcHBpbmc6CXRhcmdldCBhZGRyZXNzX3NwYWNlCisgKiBAc3RhcnQ6CWJlZ2lubmluZyBwYWdlIGluZGV4CisgKiBAZW5kOgllbmRpbmcgcGFnZSBpbmRleAorICoKKyAqIFdhaXQgZm9yIHdyaXRlYmFjayB0byBjb21wbGV0ZSBhZ2FpbnN0IHBhZ2VzIGluZGV4ZWQgYnkgc3RhcnQtPmVuZAorICogaW5jbHVzaXZlCisgKi8KK2ludCBidHJmc193YWl0X29uX3BhZ2Vfd3JpdGViYWNrX3JhbmdlKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLAorCQkJCSAgICAgICBwZ29mZl90IHN0YXJ0LCBwZ29mZl90IGVuZCkKK3sKKwlzdHJ1Y3QgcGFnZXZlYyBwdmVjOworCWludCBucl9wYWdlczsKKwlpbnQgcmV0ID0gMDsKKwlwZ29mZl90IGluZGV4OworCisJaWYgKGVuZCA8IHN0YXJ0KQorCQlyZXR1cm4gMDsKKworCXBhZ2V2ZWNfaW5pdCgmcHZlYywgMCk7CisJaW5kZXggPSBzdGFydDsKKwl3aGlsZSAoKGluZGV4IDw9IGVuZCkgJiYKKwkJCShucl9wYWdlcyA9IHBhZ2V2ZWNfbG9va3VwX3RhZygmcHZlYywgbWFwcGluZywgJmluZGV4LAorCQkJUEFHRUNBQ0hFX1RBR19XUklURUJBQ0ssCisJCQltaW4oZW5kIC0gaW5kZXgsIChwZ29mZl90KVBBR0VWRUNfU0laRS0xKSArIDEpKSAhPSAwKSB7CisJCXVuc2lnbmVkIGk7CisKKwkJZm9yIChpID0gMDsgaSA8IG5yX3BhZ2VzOyBpKyspIHsKKwkJCXN0cnVjdCBwYWdlICpwYWdlID0gcHZlYy5wYWdlc1tpXTsKKworCQkJLyogdW50aWwgcmFkaXggdHJlZSBsb29rdXAgYWNjZXB0cyBlbmRfaW5kZXggKi8KKwkJCWlmIChwYWdlLT5pbmRleCA+IGVuZCkKKwkJCQljb250aW51ZTsKKworCQkJd2FpdF9vbl9wYWdlX3dyaXRlYmFjayhwYWdlKTsKKwkJCWlmIChQYWdlRXJyb3IocGFnZSkpCisJCQkJcmV0ID0gLUVJTzsKKwkJfQorCQlwYWdldmVjX3JlbGVhc2UoJnB2ZWMpOworCQljb25kX3Jlc2NoZWQoKTsKKwl9CisKKwkvKiBDaGVjayBmb3Igb3V0c3RhbmRpbmcgd3JpdGUgZXJyb3JzICovCisJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChBU19FTk9TUEMsICZtYXBwaW5nLT5mbGFncykpCisJCXJldCA9IC1FTk9TUEM7CisJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChBU19FSU8sICZtYXBwaW5nLT5mbGFncykpCisJCXJldCA9IC1FSU87CisKKwlyZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvZnMvYnRyZnMvb3JkZXJlZC1kYXRhLmggYi9mcy9idHJmcy9vcmRlcmVkLWRhdGEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjY2ZDVlCi0tLSAvZGV2L251bGwKKysrIGIvZnMvYnRyZnMvb3JkZXJlZC1kYXRhLmgKQEAgLTAsMCArMSwxNTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgT3JhY2xlLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgdjIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKKyAqIEJvc3RvbiwgTUEgMDIxMTEwLTEzMDcsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fQlRSRlNfT1JERVJFRF9EQVRBX18KKyNkZWZpbmUgX19CVFJGU19PUkRFUkVEX0RBVEFfXworCisvKiBvbmUgb2YgdGhlc2UgcGVyIGlub2RlICovCitzdHJ1Y3QgYnRyZnNfb3JkZXJlZF9pbm9kZV90cmVlIHsKKwlzdHJ1Y3QgbXV0ZXggbXV0ZXg7CisJc3RydWN0IHJiX3Jvb3QgdHJlZTsKKwlzdHJ1Y3QgcmJfbm9kZSAqbGFzdDsKK307CisKKy8qCisgKiB0aGVzZSBhcmUgdXNlZCB0byBjb2xsZWN0IGNoZWNrc3VtcyBkb25lIGp1c3QgYmVmb3JlIGJpb3Mgc3VibWlzc2lvbi4KKyAqIFRoZXkgYXJlIGF0dGFjaGVkIHZpYSBhIGxpc3QgaW50byB0aGUgb3JkZXJlZCBleHRlbnQsIGFuZAorICogY2hlY2tzdW0gaXRlbXMgYXJlIGluc2VydGVkIGludG8gdGhlIHRyZWUgYWZ0ZXIgYWxsIHRoZSBibG9ja3MgaW4KKyAqIHRoZSBvcmRlcmVkIGV4dGVudCBhcmUgb24gZGlzaworICovCitzdHJ1Y3QgYnRyZnNfc2VjdG9yX3N1bSB7CisJLyogYnl0ZW5yIG9uIGRpc2sgKi8KKwl1NjQgYnl0ZW5yOworCXUzMiBzdW07Cit9OworCitzdHJ1Y3QgYnRyZnNfb3JkZXJlZF9zdW0geworCS8qIGJ5dGVuciBpcyB0aGUgc3RhcnQgb2YgdGhpcyBleHRlbnQgb24gZGlzayAqLworCXU2NCBieXRlbnI7CisKKwkvKgorCSAqIHRoaXMgaXMgdGhlIGxlbmd0aCBpbiBieXRlcyBjb3ZlcmVkIGJ5IHRoZSBzdW1zIGFycmF5IGJlbG93LgorCSAqLworCXVuc2lnbmVkIGxvbmcgbGVuOworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwkvKiBsYXN0IGZpZWxkIGlzIGEgdmFyaWFibGUgbGVuZ3RoIGFycmF5IG9mIGJ0cmZzX3NlY3Rvcl9zdW1zICovCisJc3RydWN0IGJ0cmZzX3NlY3Rvcl9zdW0gc3Vtc1tdOworfTsKKworLyoKKyAqIGJpdHMgZm9yIHRoZSBmbGFncyBmaWVsZDoKKyAqCisgKiBCVFJGU19PUkRFUkVEX0lPX0RPTkUgaXMgc2V0IHdoZW4gYWxsIG9mIHRoZSBibG9ja3MgYXJlIHdyaXR0ZW4uCisgKiBJdCBpcyB1c2VkIHRvIG1ha2Ugc3VyZSBtZXRhZGF0YSBpcyBpbnNlcnRlZCBpbnRvIHRoZSB0cmVlIG9ubHkgb25jZQorICogcGVyIGV4dGVudC4KKyAqCisgKiBCVFJGU19PUkRFUkVEX0NPTVBMRVRFIGlzIHNldCB3aGVuIHRoZSBleHRlbnQgaXMgcmVtb3ZlZCBmcm9tIHRoZQorICogcmJ0cmVlLCBqdXN0IGJlZm9yZSB3YWtpbmcgYW55IHdhaXRlcnMuICBJdCBpcyB1c2VkIHRvIGluZGljYXRlIHRoZQorICogSU8gaXMgZG9uZSBhbmQgYW55IG1ldGFkYXRhIGlzIGluc2VydGVkIGludG8gdGhlIHRyZWUuCisgKi8KKyNkZWZpbmUgQlRSRlNfT1JERVJFRF9JT19ET05FIDAgLyogc2V0IHdoZW4gYWxsIHRoZSBwYWdlcyBhcmUgd3JpdHRlbiAqLworCisjZGVmaW5lIEJUUkZTX09SREVSRURfQ09NUExFVEUgMSAvKiBzZXQgd2hlbiByZW1vdmVkIGZyb20gdGhlIHRyZWUgKi8KKworI2RlZmluZSBCVFJGU19PUkRFUkVEX05PQ09XIDIgLyogc2V0IHdoZW4gd2Ugd2FudCB0byB3cml0ZSBpbiBwbGFjZSAqLworCisjZGVmaW5lIEJUUkZTX09SREVSRURfQ09NUFJFU1NFRCAzIC8qIHdyaXRpbmcgYSBjb21wcmVzc2VkIGV4dGVudCAqLworCisjZGVmaW5lIEJUUkZTX09SREVSRURfUFJFQUxMT0MgNCAvKiBzZXQgd2hlbiB3cml0aW5nIHRvIHByZWFsbG9jZWQgZXh0ZW50ICovCisKK3N0cnVjdCBidHJmc19vcmRlcmVkX2V4dGVudCB7CisJLyogbG9naWNhbCBvZmZzZXQgaW4gdGhlIGZpbGUgKi8KKwl1NjQgZmlsZV9vZmZzZXQ7CisKKwkvKiBkaXNrIGJ5dGUgbnVtYmVyICovCisJdTY0IHN0YXJ0OworCisJLyogcmFtIGxlbmd0aCBvZiB0aGUgZXh0ZW50IGluIGJ5dGVzICovCisJdTY0IGxlbjsKKworCS8qIGV4dGVudCBsZW5ndGggb24gZGlzayAqLworCXU2NCBkaXNrX2xlbjsKKworCS8qIGZsYWdzIChkZXNjcmliZWQgYWJvdmUpICovCisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8qIHJlZmVyZW5jZSBjb3VudCAqLworCWF0b21pY190IHJlZnM7CisKKwkvKiB0aGUgaW5vZGUgd2UgYmVsb25nIHRvICovCisJc3RydWN0IGlub2RlICppbm9kZTsKKworCS8qIGxpc3Qgb2YgY2hlY2tzdW1zIGZvciBpbnNlcnRpb24gd2hlbiB0aGUgZXh0ZW50IGlvIGlzIGRvbmUgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisKKwkvKiB1c2VkIHRvIHdhaXQgZm9yIHRoZSBCVFJGU19PUkRFUkVEX0NPTVBMRVRFIGJpdCAqLworCXdhaXRfcXVldWVfaGVhZF90IHdhaXQ7CisKKwkvKiBvdXIgZnJpZW5kbHkgcmJ0cmVlIGVudHJ5ICovCisJc3RydWN0IHJiX25vZGUgcmJfbm9kZTsKKworCS8qIGEgcGVyIHJvb3QgbGlzdCBvZiBhbGwgdGhlIHBlbmRpbmcgb3JkZXJlZCBleHRlbnRzICovCisJc3RydWN0IGxpc3RfaGVhZCByb290X2V4dGVudF9saXN0OworfTsKKworCisvKgorICogY2FsY3VsYXRlcyB0aGUgdG90YWwgc2l6ZSB5b3UgbmVlZCB0byBhbGxvY2F0ZSBmb3IgYW4gb3JkZXJlZCBzdW0KKyAqIHN0cnVjdHVyZSBzcGFubmluZyAnYnl0ZXMnIGluIHRoZSBmaWxlCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGJ0cmZzX29yZGVyZWRfc3VtX3NpemUoc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsCisJCQkJCSB1bnNpZ25lZCBsb25nIGJ5dGVzKQoreworCXVuc2lnbmVkIGxvbmcgbnVtX3NlY3RvcnMgPSAoYnl0ZXMgKyByb290LT5zZWN0b3JzaXplIC0gMSkgLworCQlyb290LT5zZWN0b3JzaXplOworCW51bV9zZWN0b3JzKys7CisJcmV0dXJuIHNpemVvZihzdHJ1Y3QgYnRyZnNfb3JkZXJlZF9zdW0pICsKKwkJbnVtX3NlY3RvcnMgKiBzaXplb2Yoc3RydWN0IGJ0cmZzX3NlY3Rvcl9zdW0pOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK2J0cmZzX29yZGVyZWRfaW5vZGVfdHJlZV9pbml0KHN0cnVjdCBidHJmc19vcmRlcmVkX2lub2RlX3RyZWUgKnQpCit7CisJbXV0ZXhfaW5pdCgmdC0+bXV0ZXgpOworCXQtPnRyZWUucmJfbm9kZSA9IE5VTEw7CisJdC0+bGFzdCA9IE5VTEw7Cit9CisKK2ludCBidHJmc19wdXRfb3JkZXJlZF9leHRlbnQoc3RydWN0IGJ0cmZzX29yZGVyZWRfZXh0ZW50ICplbnRyeSk7CitpbnQgYnRyZnNfcmVtb3ZlX29yZGVyZWRfZXh0ZW50KHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJc3RydWN0IGJ0cmZzX29yZGVyZWRfZXh0ZW50ICplbnRyeSk7CitpbnQgYnRyZnNfZGVjX3Rlc3Rfb3JkZXJlZF9wZW5kaW5nKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJICAgICAgIHU2NCBmaWxlX29mZnNldCwgdTY0IGlvX3NpemUpOworaW50IGJ0cmZzX2FkZF9vcmRlcmVkX2V4dGVudChzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1NjQgZmlsZV9vZmZzZXQsCisJCQkgICAgIHU2NCBzdGFydCwgdTY0IGxlbiwgdTY0IGRpc2tfbGVuLCBpbnQgdHllcCk7CitpbnQgYnRyZnNfYWRkX29yZGVyZWRfc3VtKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkgIHN0cnVjdCBidHJmc19vcmRlcmVkX2V4dGVudCAqZW50cnksCisJCQkgIHN0cnVjdCBidHJmc19vcmRlcmVkX3N1bSAqc3VtKTsKK3N0cnVjdCBidHJmc19vcmRlcmVkX2V4dGVudCAqYnRyZnNfbG9va3VwX29yZGVyZWRfZXh0ZW50KHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJCQkJIHU2NCBmaWxlX29mZnNldCk7Cit2b2lkIGJ0cmZzX3N0YXJ0X29yZGVyZWRfZXh0ZW50KHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJc3RydWN0IGJ0cmZzX29yZGVyZWRfZXh0ZW50ICplbnRyeSwgaW50IHdhaXQpOworaW50IGJ0cmZzX3dhaXRfb3JkZXJlZF9yYW5nZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1NjQgc3RhcnQsIHU2NCBsZW4pOworc3RydWN0IGJ0cmZzX29yZGVyZWRfZXh0ZW50ICoKK2J0cmZzX2xvb2t1cF9maXJzdF9vcmRlcmVkX2V4dGVudChzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgdTY0IGZpbGVfb2Zmc2V0KTsKK2ludCBidHJmc19vcmRlcmVkX3VwZGF0ZV9pX3NpemUoc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQlzdHJ1Y3QgYnRyZnNfb3JkZXJlZF9leHRlbnQgKm9yZGVyZWQpOworaW50IGJ0cmZzX2ZpbmRfb3JkZXJlZF9zdW0oc3RydWN0IGlub2RlICppbm9kZSwgdTY0IG9mZnNldCwgdTY0IGRpc2tfYnl0ZW5yLCB1MzIgKnN1bSk7CitpbnQgYnRyZnNfd2FpdF9vbl9wYWdlX3dyaXRlYmFja19yYW5nZShzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywKKwkJCQkgICAgICAgcGdvZmZfdCBzdGFydCwgcGdvZmZfdCBlbmQpOworaW50IGJ0cmZzX2ZkYXRhd3JpdGVfcmFuZ2Uoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsIGxvZmZfdCBzdGFydCwKKwkJCSAgIGxvZmZfdCBlbmQsIGludCBzeW5jX21vZGUpOworaW50IGJ0cmZzX3dhaXRfb3JkZXJlZF9leHRlbnRzKHN0cnVjdCBidHJmc19yb290ICpyb290LCBpbnQgbm9jb3dfb25seSk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2ZzL2J0cmZzL29ycGhhbi5jIGIvZnMvYnRyZnMvb3JwaGFuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2MwZDUyYQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2J0cmZzL29ycGhhbi5jCkBAIC0wLDAgKzEsNjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggUmVkIEhhdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIHYyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCisgKiBCb3N0b24sIE1BIDAyMTExMC0xMzA3LCBVU0EuCisgKi8KKworI2luY2x1ZGUgImN0cmVlLmgiCisjaW5jbHVkZSAiZGlzay1pby5oIgorCitpbnQgYnRyZnNfaW5zZXJ0X29ycGhhbl9pdGVtKHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAorCQkJICAgICBzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwgdTY0IG9mZnNldCkKK3sKKwlzdHJ1Y3QgYnRyZnNfcGF0aCAqcGF0aDsKKwlzdHJ1Y3QgYnRyZnNfa2V5IGtleTsKKwlpbnQgcmV0ID0gMDsKKworCWtleS5vYmplY3RpZCA9IEJUUkZTX09SUEhBTl9PQkpFQ1RJRDsKKwlidHJmc19zZXRfa2V5X3R5cGUoJmtleSwgQlRSRlNfT1JQSEFOX0lURU1fS0VZKTsKKwlrZXkub2Zmc2V0ID0gb2Zmc2V0OworCisJcGF0aCA9IGJ0cmZzX2FsbG9jX3BhdGgoKTsKKwlpZiAoIXBhdGgpCisJCXJldHVybiAtRU5PTUVNOworCisJcmV0ID0gYnRyZnNfaW5zZXJ0X2VtcHR5X2l0ZW0odHJhbnMsIHJvb3QsIHBhdGgsICZrZXksIDApOworCisJYnRyZnNfZnJlZV9wYXRoKHBhdGgpOworCXJldHVybiByZXQ7Cit9CisKK2ludCBidHJmc19kZWxfb3JwaGFuX2l0ZW0oc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCisJCQkgIHN0cnVjdCBidHJmc19yb290ICpyb290LCB1NjQgb2Zmc2V0KQoreworCXN0cnVjdCBidHJmc19wYXRoICpwYXRoOworCXN0cnVjdCBidHJmc19rZXkga2V5OworCWludCByZXQgPSAwOworCisJa2V5Lm9iamVjdGlkID0gQlRSRlNfT1JQSEFOX09CSkVDVElEOworCWJ0cmZzX3NldF9rZXlfdHlwZSgma2V5LCBCVFJGU19PUlBIQU5fSVRFTV9LRVkpOworCWtleS5vZmZzZXQgPSBvZmZzZXQ7CisKKwlwYXRoID0gYnRyZnNfYWxsb2NfcGF0aCgpOworCWlmICghcGF0aCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyZXQgPSBidHJmc19zZWFyY2hfc2xvdCh0cmFucywgcm9vdCwgJmtleSwgcGF0aCwgLTEsIDEpOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCisJcmV0ID0gYnRyZnNfZGVsX2l0ZW0odHJhbnMsIHJvb3QsIHBhdGgpOworCitvdXQ6CisJYnRyZnNfZnJlZV9wYXRoKHBhdGgpOworCXJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9mcy9idHJmcy9wcmludC10cmVlLmMgYi9mcy9idHJmcy9wcmludC10cmVlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWY4ZjIxOAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2J0cmZzL3ByaW50LXRyZWUuYwpAQCAtMCwwICsxLDIxNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBPcmFjbGUuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSB2MiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorICogQm9zdG9uLCBNQSAwMjExMTAtMTMwNywgVVNBLgorICovCisKKyNpbmNsdWRlICJjdHJlZS5oIgorI2luY2x1ZGUgImRpc2staW8uaCIKKyNpbmNsdWRlICJwcmludC10cmVlLmgiCisKK3N0YXRpYyB2b2lkIHByaW50X2NodW5rKHN0cnVjdCBleHRlbnRfYnVmZmVyICplYiwgc3RydWN0IGJ0cmZzX2NodW5rICpjaHVuaykKK3sKKwlpbnQgbnVtX3N0cmlwZXMgPSBidHJmc19jaHVua19udW1fc3RyaXBlcyhlYiwgY2h1bmspOworCWludCBpOworCXByaW50ayhLRVJOX0lORk8gIlx0XHRjaHVuayBsZW5ndGggJWxsdSBvd25lciAlbGx1IHR5cGUgJWxsdSAiCisJICAgICAgICJudW1fc3RyaXBlcyAlZFxuIiwKKwkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylidHJmc19jaHVua19sZW5ndGgoZWIsIGNodW5rKSwKKwkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylidHJmc19jaHVua19vd25lcihlYiwgY2h1bmspLAorCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKWJ0cmZzX2NodW5rX3R5cGUoZWIsIGNodW5rKSwKKwkgICAgICAgbnVtX3N0cmlwZXMpOworCWZvciAoaSA9IDAgOyBpIDwgbnVtX3N0cmlwZXMgOyBpKyspIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiXHRcdFx0c3RyaXBlICVkIGRldmlkICVsbHUgb2Zmc2V0ICVsbHVcbiIsIGksCisJCSAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpYnRyZnNfc3RyaXBlX2RldmlkX25yKGViLCBjaHVuaywgaSksCisJCSAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpYnRyZnNfc3RyaXBlX29mZnNldF9ucihlYiwgY2h1bmssIGkpKTsKKwl9Cit9CitzdGF0aWMgdm9pZCBwcmludF9kZXZfaXRlbShzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqZWIsCisJCQkgICBzdHJ1Y3QgYnRyZnNfZGV2X2l0ZW0gKmRldl9pdGVtKQoreworCXByaW50ayhLRVJOX0lORk8gIlx0XHRkZXYgaXRlbSBkZXZpZCAlbGx1ICIKKwkgICAgICAgInRvdGFsX2J5dGVzICVsbHUgYnl0ZXMgdXNlZCAlbGx1XG4iLAorCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKWJ0cmZzX2RldmljZV9pZChlYiwgZGV2X2l0ZW0pLAorCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKWJ0cmZzX2RldmljZV90b3RhbF9ieXRlcyhlYiwgZGV2X2l0ZW0pLAorCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKWJ0cmZzX2RldmljZV9ieXRlc191c2VkKGViLCBkZXZfaXRlbSkpOworfQordm9pZCBidHJmc19wcmludF9sZWFmKHN0cnVjdCBidHJmc19yb290ICpyb290LCBzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqbCkKK3sKKwlpbnQgaTsKKwl1MzIgbnIgPSBidHJmc19oZWFkZXJfbnJpdGVtcyhsKTsKKwlzdHJ1Y3QgYnRyZnNfaXRlbSAqaXRlbTsKKwlzdHJ1Y3QgYnRyZnNfZXh0ZW50X2l0ZW0gKmVpOworCXN0cnVjdCBidHJmc19yb290X2l0ZW0gKnJpOworCXN0cnVjdCBidHJmc19kaXJfaXRlbSAqZGk7CisJc3RydWN0IGJ0cmZzX2lub2RlX2l0ZW0gKmlpOworCXN0cnVjdCBidHJmc19ibG9ja19ncm91cF9pdGVtICpiaTsKKwlzdHJ1Y3QgYnRyZnNfZmlsZV9leHRlbnRfaXRlbSAqZmk7CisJc3RydWN0IGJ0cmZzX2tleSBrZXk7CisJc3RydWN0IGJ0cmZzX2tleSBmb3VuZF9rZXk7CisJc3RydWN0IGJ0cmZzX2V4dGVudF9yZWYgKnJlZjsKKwlzdHJ1Y3QgYnRyZnNfZGV2X2V4dGVudCAqZGV2X2V4dGVudDsKKwl1MzIgdHlwZTsKKworCXByaW50ayhLRVJOX0lORk8gImxlYWYgJWxsdSB0b3RhbCBwdHJzICVkIGZyZWUgc3BhY2UgJWRcbiIsCisJCSh1bnNpZ25lZCBsb25nIGxvbmcpYnRyZnNfaGVhZGVyX2J5dGVucihsKSwgbnIsCisJCWJ0cmZzX2xlYWZfZnJlZV9zcGFjZShyb290LCBsKSk7CisJZm9yIChpID0gMCA7IGkgPCBuciA7IGkrKykgeworCQlpdGVtID0gYnRyZnNfaXRlbV9ucihsLCBpKTsKKwkJYnRyZnNfaXRlbV9rZXlfdG9fY3B1KGwsICZrZXksIGkpOworCQl0eXBlID0gYnRyZnNfa2V5X3R5cGUoJmtleSk7CisJCXByaW50ayhLRVJOX0lORk8gIlx0aXRlbSAlZCBrZXkgKCVsbHUgJXggJWxsdSkgaXRlbW9mZiAlZCAiCisJCSAgICAgICAiaXRlbXNpemUgJWRcbiIsCisJCQlpLAorCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylrZXkub2JqZWN0aWQsIHR5cGUsCisJCQkodW5zaWduZWQgbG9uZyBsb25nKWtleS5vZmZzZXQsCisJCQlidHJmc19pdGVtX29mZnNldChsLCBpdGVtKSwgYnRyZnNfaXRlbV9zaXplKGwsIGl0ZW0pKTsKKwkJc3dpdGNoICh0eXBlKSB7CisJCWNhc2UgQlRSRlNfSU5PREVfSVRFTV9LRVk6CisJCQlpaSA9IGJ0cmZzX2l0ZW1fcHRyKGwsIGksIHN0cnVjdCBidHJmc19pbm9kZV9pdGVtKTsKKwkJCXByaW50ayhLRVJOX0lORk8gIlx0XHRpbm9kZSBnZW5lcmF0aW9uICVsbHUgc2l6ZSAlbGx1ICIKKwkJCSAgICAgICAibW9kZSAlb1xuIiwKKwkJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKQorCQkJICAgICAgIGJ0cmZzX2lub2RlX2dlbmVyYXRpb24obCwgaWkpLAorCQkJICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylidHJmc19pbm9kZV9zaXplKGwsIGlpKSwKKwkJCSAgICAgICBidHJmc19pbm9kZV9tb2RlKGwsIGlpKSk7CisJCQlicmVhazsKKwkJY2FzZSBCVFJGU19ESVJfSVRFTV9LRVk6CisJCQlkaSA9IGJ0cmZzX2l0ZW1fcHRyKGwsIGksIHN0cnVjdCBidHJmc19kaXJfaXRlbSk7CisJCQlidHJmc19kaXJfaXRlbV9rZXlfdG9fY3B1KGwsIGRpLCAmZm91bmRfa2V5KTsKKwkJCXByaW50ayhLRVJOX0lORk8gIlx0XHRkaXIgb2lkICVsbHUgdHlwZSAldVxuIiwKKwkJCQkodW5zaWduZWQgbG9uZyBsb25nKWZvdW5kX2tleS5vYmplY3RpZCwKKwkJCQlidHJmc19kaXJfdHlwZShsLCBkaSkpOworCQkJYnJlYWs7CisJCWNhc2UgQlRSRlNfUk9PVF9JVEVNX0tFWToKKwkJCXJpID0gYnRyZnNfaXRlbV9wdHIobCwgaSwgc3RydWN0IGJ0cmZzX3Jvb3RfaXRlbSk7CisJCQlwcmludGsoS0VSTl9JTkZPICJcdFx0cm9vdCBkYXRhIGJ5dGVuciAlbGx1IHJlZnMgJXVcbiIsCisJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZykKKwkJCQlidHJmc19kaXNrX3Jvb3RfYnl0ZW5yKGwsIHJpKSwKKwkJCQlidHJmc19kaXNrX3Jvb3RfcmVmcyhsLCByaSkpOworCQkJYnJlYWs7CisJCWNhc2UgQlRSRlNfRVhURU5UX0lURU1fS0VZOgorCQkJZWkgPSBidHJmc19pdGVtX3B0cihsLCBpLCBzdHJ1Y3QgYnRyZnNfZXh0ZW50X2l0ZW0pOworCQkJcHJpbnRrKEtFUk5fSU5GTyAiXHRcdGV4dGVudCBkYXRhIHJlZnMgJXVcbiIsCisJCQkJYnRyZnNfZXh0ZW50X3JlZnMobCwgZWkpKTsKKwkJCWJyZWFrOworCQljYXNlIEJUUkZTX0VYVEVOVF9SRUZfS0VZOgorCQkJcmVmID0gYnRyZnNfaXRlbV9wdHIobCwgaSwgc3RydWN0IGJ0cmZzX2V4dGVudF9yZWYpOworCQkJcHJpbnRrKEtFUk5fSU5GTyAiXHRcdGV4dGVudCBiYWNrIHJlZiByb290ICVsbHUgIgorCQkJICAgICAgICJnZW4gJWxsdSBvd25lciAlbGx1IG51bV9yZWZzICVsdVxuIiwKKwkJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKWJ0cmZzX3JlZl9yb290KGwsIHJlZiksCisJCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylidHJmc19yZWZfZ2VuZXJhdGlvbihsLCByZWYpLAorCQkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpYnRyZnNfcmVmX29iamVjdGlkKGwsIHJlZiksCisJCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpYnRyZnNfcmVmX251bV9yZWZzKGwsIHJlZikpOworCQkJYnJlYWs7CisKKwkJY2FzZSBCVFJGU19FWFRFTlRfREFUQV9LRVk6CisJCQlmaSA9IGJ0cmZzX2l0ZW1fcHRyKGwsIGksCisJCQkJCSAgICBzdHJ1Y3QgYnRyZnNfZmlsZV9leHRlbnRfaXRlbSk7CisJCQlpZiAoYnRyZnNfZmlsZV9leHRlbnRfdHlwZShsLCBmaSkgPT0KKwkJCSAgICBCVFJGU19GSUxFX0VYVEVOVF9JTkxJTkUpIHsKKwkJCQlwcmludGsoS0VSTl9JTkZPICJcdFx0aW5saW5lIGV4dGVudCBkYXRhICIKKwkJCQkgICAgICAgInNpemUgJXVcbiIsCisJCQkJICAgICAgIGJ0cmZzX2ZpbGVfZXh0ZW50X2lubGluZV9sZW4obCwgZmkpKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXByaW50ayhLRVJOX0lORk8gIlx0XHRleHRlbnQgZGF0YSBkaXNrIGJ5dGVuciAlbGx1ICIKKwkJCSAgICAgICAibnIgJWxsdVxuIiwKKwkJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKQorCQkJICAgICAgIGJ0cmZzX2ZpbGVfZXh0ZW50X2Rpc2tfYnl0ZW5yKGwsIGZpKSwKKwkJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKQorCQkJICAgICAgIGJ0cmZzX2ZpbGVfZXh0ZW50X2Rpc2tfbnVtX2J5dGVzKGwsIGZpKSk7CisJCQlwcmludGsoS0VSTl9JTkZPICJcdFx0ZXh0ZW50IGRhdGEgb2Zmc2V0ICVsbHUgIgorCQkJICAgICAgICJuciAlbGx1IHJhbSAlbGx1XG4iLAorCQkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpCisJCQkgICAgICAgYnRyZnNfZmlsZV9leHRlbnRfb2Zmc2V0KGwsIGZpKSwKKwkJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKQorCQkJICAgICAgIGJ0cmZzX2ZpbGVfZXh0ZW50X251bV9ieXRlcyhsLCBmaSksCisJCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykKKwkJCSAgICAgICBidHJmc19maWxlX2V4dGVudF9yYW1fYnl0ZXMobCwgZmkpKTsKKwkJCWJyZWFrOworCQljYXNlIEJUUkZTX0JMT0NLX0dST1VQX0lURU1fS0VZOgorCQkJYmkgPSBidHJmc19pdGVtX3B0cihsLCBpLAorCQkJCQkgICAgc3RydWN0IGJ0cmZzX2Jsb2NrX2dyb3VwX2l0ZW0pOworCQkJcHJpbnRrKEtFUk5fSU5GTyAiXHRcdGJsb2NrIGdyb3VwIHVzZWQgJWxsdVxuIiwKKwkJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKQorCQkJICAgICAgIGJ0cmZzX2Rpc2tfYmxvY2tfZ3JvdXBfdXNlZChsLCBiaSkpOworCQkJYnJlYWs7CisJCWNhc2UgQlRSRlNfQ0hVTktfSVRFTV9LRVk6CisJCQlwcmludF9jaHVuayhsLCBidHJmc19pdGVtX3B0cihsLCBpLAorCQkJCQkJICAgICAgc3RydWN0IGJ0cmZzX2NodW5rKSk7CisJCQlicmVhazsKKwkJY2FzZSBCVFJGU19ERVZfSVRFTV9LRVk6CisJCQlwcmludF9kZXZfaXRlbShsLCBidHJmc19pdGVtX3B0cihsLCBpLAorCQkJCQlzdHJ1Y3QgYnRyZnNfZGV2X2l0ZW0pKTsKKwkJCWJyZWFrOworCQljYXNlIEJUUkZTX0RFVl9FWFRFTlRfS0VZOgorCQkJZGV2X2V4dGVudCA9IGJ0cmZzX2l0ZW1fcHRyKGwsIGksCisJCQkJCQkgICAgc3RydWN0IGJ0cmZzX2Rldl9leHRlbnQpOworCQkJcHJpbnRrKEtFUk5fSU5GTyAiXHRcdGRldiBleHRlbnQgY2h1bmtfdHJlZSAlbGx1XG4iCisJCQkgICAgICAgIlx0XHRjaHVuayBvYmplY3RpZCAlbGx1IGNodW5rIG9mZnNldCAlbGx1ICIKKwkJCSAgICAgICAibGVuZ3RoICVsbHVcbiIsCisJCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykKKwkJCSAgICAgICBidHJmc19kZXZfZXh0ZW50X2NodW5rX3RyZWUobCwgZGV2X2V4dGVudCksCisJCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykKKwkJCSAgICAgICBidHJmc19kZXZfZXh0ZW50X2NodW5rX29iamVjdGlkKGwsIGRldl9leHRlbnQpLAorCQkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpCisJCQkgICAgICAgYnRyZnNfZGV2X2V4dGVudF9jaHVua19vZmZzZXQobCwgZGV2X2V4dGVudCksCisJCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykKKwkJCSAgICAgICBidHJmc19kZXZfZXh0ZW50X2xlbmd0aChsLCBkZXZfZXh0ZW50KSk7CisJCX07CisJfQorfQorCit2b2lkIGJ0cmZzX3ByaW50X3RyZWUoc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsIHN0cnVjdCBleHRlbnRfYnVmZmVyICpjKQoreworCWludCBpOyB1MzIgbnI7CisJc3RydWN0IGJ0cmZzX2tleSBrZXk7CisJaW50IGxldmVsOworCisJaWYgKCFjKQorCQlyZXR1cm47CisJbnIgPSBidHJmc19oZWFkZXJfbnJpdGVtcyhjKTsKKwlsZXZlbCA9IGJ0cmZzX2hlYWRlcl9sZXZlbChjKTsKKwlpZiAobGV2ZWwgPT0gMCkgeworCQlidHJmc19wcmludF9sZWFmKHJvb3QsIGMpOworCQlyZXR1cm47CisJfQorCXByaW50ayhLRVJOX0lORk8gIm5vZGUgJWxsdSBsZXZlbCAlZCB0b3RhbCBwdHJzICVkIGZyZWUgc3BjICV1XG4iLAorCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKWJ0cmZzX2hlYWRlcl9ieXRlbnIoYyksCisJICAgICAgIGJ0cmZzX2hlYWRlcl9sZXZlbChjKSwgbnIsCisJICAgICAgICh1MzIpQlRSRlNfTk9ERVBUUlNfUEVSX0JMT0NLKHJvb3QpIC0gbnIpOworCWZvciAoaSA9IDA7IGkgPCBucjsgaSsrKSB7CisJCWJ0cmZzX25vZGVfa2V5X3RvX2NwdShjLCAma2V5LCBpKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiXHRrZXkgJWQgKCVsbHUgJXUgJWxsdSkgYmxvY2sgJWxsdVxuIiwKKwkJICAgICAgIGksCisJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKWtleS5vYmplY3RpZCwKKwkJICAgICAgIGtleS50eXBlLAorCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylrZXkub2Zmc2V0LAorCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylidHJmc19ub2RlX2Jsb2NrcHRyKGMsIGkpKTsKKwl9CisJZm9yIChpID0gMDsgaSA8IG5yOyBpKyspIHsKKwkJc3RydWN0IGV4dGVudF9idWZmZXIgKm5leHQgPSByZWFkX3RyZWVfYmxvY2socm9vdCwKKwkJCQkJYnRyZnNfbm9kZV9ibG9ja3B0cihjLCBpKSwKKwkJCQkJYnRyZnNfbGV2ZWxfc2l6ZShyb290LCBsZXZlbCAtIDEpLAorCQkJCQlidHJmc19ub2RlX3B0cl9nZW5lcmF0aW9uKGMsIGkpKTsKKwkJaWYgKGJ0cmZzX2lzX2xlYWYobmV4dCkgJiYKKwkJICAgIGJ0cmZzX2hlYWRlcl9sZXZlbChjKSAhPSAxKQorCQkJQlVHKCk7CisJCWlmIChidHJmc19oZWFkZXJfbGV2ZWwobmV4dCkgIT0KKwkJCWJ0cmZzX2hlYWRlcl9sZXZlbChjKSAtIDEpCisJCQlCVUcoKTsKKwkJYnRyZnNfcHJpbnRfdHJlZShyb290LCBuZXh0KTsKKwkJZnJlZV9leHRlbnRfYnVmZmVyKG5leHQpOworCX0KK30KZGlmZiAtLWdpdCBhL2ZzL2J0cmZzL3ByaW50LXRyZWUuaCBiL2ZzL2J0cmZzL3ByaW50LXRyZWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTc1ZWZlCi0tLSAvZGV2L251bGwKKysrIGIvZnMvYnRyZnMvcHJpbnQtdHJlZS5oCkBAIC0wLDAgKzEsMjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgT3JhY2xlLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgdjIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKKyAqIEJvc3RvbiwgTUEgMDIxMTEwLTEzMDcsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fUFJJTlRfVFJFRV8KKyNkZWZpbmUgX19QUklOVF9UUkVFXwordm9pZCBidHJmc19wcmludF9sZWFmKHN0cnVjdCBidHJmc19yb290ICpyb290LCBzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqbCk7Cit2b2lkIGJ0cmZzX3ByaW50X3RyZWUoc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsIHN0cnVjdCBleHRlbnRfYnVmZmVyICp0KTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZnMvYnRyZnMvcmVmLWNhY2hlLmMgYi9mcy9idHJmcy9yZWYtY2FjaGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjBhY2M0Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvYnRyZnMvcmVmLWNhY2hlLmMKQEAgLTAsMCArMSwyMzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggT3JhY2xlLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgdjIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKKyAqIEJvc3RvbiwgTUEgMDIxMTEwLTEzMDcsIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlICJjdHJlZS5oIgorI2luY2x1ZGUgInJlZi1jYWNoZS5oIgorI2luY2x1ZGUgInRyYW5zYWN0aW9uLmgiCisKKy8qCisgKiBsZWFmIHJlZnMgYXJlIHVzZWQgdG8gY2FjaGUgdGhlIGluZm9ybWF0aW9uIGFib3V0IHdoaWNoIGV4dGVudHMKKyAqIGEgZ2l2ZW4gbGVhZiBoYXMgcmVmZXJlbmNlcyBvbi4gIFRoaXMgYWxsb3dzIHVzIHRvIHByb2Nlc3MgdGhhdCBsZWFmCisgKiBpbiBidHJmc19kcm9wX3NuYXBzaG90IHdpdGhvdXQgbmVlZGluZyB0byByZWFkIGl0IGJhY2sgZnJvbSBkaXNrLgorICovCisKKy8qCisgKiBrbWFsbG9jIGEgbGVhZiByZWZlcmVuY2Ugc3RydWN0IGFuZCB1cGRhdGUgdGhlIGNvdW50ZXJzIGZvciB0aGUKKyAqIHRvdGFsIHJlZiBjYWNoZSBzaXplCisgKi8KK3N0cnVjdCBidHJmc19sZWFmX3JlZiAqYnRyZnNfYWxsb2NfbGVhZl9yZWYoc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsCisJCQkJCSAgICBpbnQgbnJfZXh0ZW50cykKK3sKKwlzdHJ1Y3QgYnRyZnNfbGVhZl9yZWYgKnJlZjsKKwlzaXplX3Qgc2l6ZSA9IGJ0cmZzX2xlYWZfcmVmX3NpemUobnJfZXh0ZW50cyk7CisKKwlyZWYgPSBrbWFsbG9jKHNpemUsIEdGUF9OT0ZTKTsKKwlpZiAocmVmKSB7CisJCXNwaW5fbG9jaygmcm9vdC0+ZnNfaW5mby0+cmVmX2NhY2hlX2xvY2spOworCQlyb290LT5mc19pbmZvLT50b3RhbF9yZWZfY2FjaGVfc2l6ZSArPSBzaXplOworCQlzcGluX3VubG9jaygmcm9vdC0+ZnNfaW5mby0+cmVmX2NhY2hlX2xvY2spOworCisJCW1lbXNldChyZWYsIDAsIHNpemVvZigqcmVmKSk7CisJCWF0b21pY19zZXQoJnJlZi0+dXNhZ2UsIDEpOworCQlJTklUX0xJU1RfSEVBRCgmcmVmLT5saXN0KTsKKwl9CisJcmV0dXJuIHJlZjsKK30KKworLyoKKyAqIGZyZWUgYSBsZWFmIHJlZmVyZW5jZSBzdHJ1Y3QgYW5kIHVwZGF0ZSB0aGUgY291bnRlcnMgZm9yIHRoZQorICogdG90YWwgcmVmIGNhY2hlIHNpemUKKyAqLwordm9pZCBidHJmc19mcmVlX2xlYWZfcmVmKHN0cnVjdCBidHJmc19yb290ICpyb290LCBzdHJ1Y3QgYnRyZnNfbGVhZl9yZWYgKnJlZikKK3sKKwlpZiAoIXJlZikKKwkJcmV0dXJuOworCVdBUk5fT04oYXRvbWljX3JlYWQoJnJlZi0+dXNhZ2UpID09IDApOworCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZyZWYtPnVzYWdlKSkgeworCQlzaXplX3Qgc2l6ZSA9IGJ0cmZzX2xlYWZfcmVmX3NpemUocmVmLT5ucml0ZW1zKTsKKworCQlCVUdfT04ocmVmLT5pbl90cmVlKTsKKwkJa2ZyZWUocmVmKTsKKworCQlzcGluX2xvY2soJnJvb3QtPmZzX2luZm8tPnJlZl9jYWNoZV9sb2NrKTsKKwkJcm9vdC0+ZnNfaW5mby0+dG90YWxfcmVmX2NhY2hlX3NpemUgLT0gc2l6ZTsKKwkJc3Bpbl91bmxvY2soJnJvb3QtPmZzX2luZm8tPnJlZl9jYWNoZV9sb2NrKTsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcmJfbm9kZSAqdHJlZV9pbnNlcnQoc3RydWN0IHJiX3Jvb3QgKnJvb3QsIHU2NCBieXRlbnIsCisJCQkJICAgc3RydWN0IHJiX25vZGUgKm5vZGUpCit7CisJc3RydWN0IHJiX25vZGUgKipwID0gJnJvb3QtPnJiX25vZGU7CisJc3RydWN0IHJiX25vZGUgKnBhcmVudCA9IE5VTEw7CisJc3RydWN0IGJ0cmZzX2xlYWZfcmVmICplbnRyeTsKKworCXdoaWxlICgqcCkgeworCQlwYXJlbnQgPSAqcDsKKwkJZW50cnkgPSByYl9lbnRyeShwYXJlbnQsIHN0cnVjdCBidHJmc19sZWFmX3JlZiwgcmJfbm9kZSk7CisKKwkJaWYgKGJ5dGVuciA8IGVudHJ5LT5ieXRlbnIpCisJCQlwID0gJigqcCktPnJiX2xlZnQ7CisJCWVsc2UgaWYgKGJ5dGVuciA+IGVudHJ5LT5ieXRlbnIpCisJCQlwID0gJigqcCktPnJiX3JpZ2h0OworCQllbHNlCisJCQlyZXR1cm4gcGFyZW50OworCX0KKworCWVudHJ5ID0gcmJfZW50cnkobm9kZSwgc3RydWN0IGJ0cmZzX2xlYWZfcmVmLCByYl9ub2RlKTsKKwlyYl9saW5rX25vZGUobm9kZSwgcGFyZW50LCBwKTsKKwlyYl9pbnNlcnRfY29sb3Iobm9kZSwgcm9vdCk7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcmJfbm9kZSAqdHJlZV9zZWFyY2goc3RydWN0IHJiX3Jvb3QgKnJvb3QsIHU2NCBieXRlbnIpCit7CisJc3RydWN0IHJiX25vZGUgKm4gPSByb290LT5yYl9ub2RlOworCXN0cnVjdCBidHJmc19sZWFmX3JlZiAqZW50cnk7CisKKwl3aGlsZSAobikgeworCQllbnRyeSA9IHJiX2VudHJ5KG4sIHN0cnVjdCBidHJmc19sZWFmX3JlZiwgcmJfbm9kZSk7CisJCVdBUk5fT04oIWVudHJ5LT5pbl90cmVlKTsKKworCQlpZiAoYnl0ZW5yIDwgZW50cnktPmJ5dGVucikKKwkJCW4gPSBuLT5yYl9sZWZ0OworCQllbHNlIGlmIChieXRlbnIgPiBlbnRyeS0+Ynl0ZW5yKQorCQkJbiA9IG4tPnJiX3JpZ2h0OworCQllbHNlCisJCQlyZXR1cm4gbjsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK2ludCBidHJmc19yZW1vdmVfbGVhZl9yZWZzKHN0cnVjdCBidHJmc19yb290ICpyb290LCB1NjQgbWF4X3Jvb3RfZ2VuLAorCQkJICAgaW50IHNoYXJlZCkKK3sKKwlzdHJ1Y3QgYnRyZnNfbGVhZl9yZWYgKnJlZiA9IE5VTEw7CisJc3RydWN0IGJ0cmZzX2xlYWZfcmVmX3RyZWUgKnRyZWUgPSByb290LT5yZWZfdHJlZTsKKworCWlmIChzaGFyZWQpCisJCXRyZWUgPSAmcm9vdC0+ZnNfaW5mby0+c2hhcmVkX3JlZl90cmVlOworCWlmICghdHJlZSkKKwkJcmV0dXJuIDA7CisKKwlzcGluX2xvY2soJnRyZWUtPmxvY2spOworCXdoaWxlICghbGlzdF9lbXB0eSgmdHJlZS0+bGlzdCkpIHsKKwkJcmVmID0gbGlzdF9lbnRyeSh0cmVlLT5saXN0Lm5leHQsIHN0cnVjdCBidHJmc19sZWFmX3JlZiwgbGlzdCk7CisJCUJVR19PTihyZWYtPnRyZWUgIT0gdHJlZSk7CisJCWlmIChyZWYtPnJvb3RfZ2VuID4gbWF4X3Jvb3RfZ2VuKQorCQkJYnJlYWs7CisJCWlmICgheGNoZygmcmVmLT5pbl90cmVlLCAwKSkgeworCQkJY29uZF9yZXNjaGVkX2xvY2soJnRyZWUtPmxvY2spOworCQkJY29udGludWU7CisJCX0KKworCQlyYl9lcmFzZSgmcmVmLT5yYl9ub2RlLCAmdHJlZS0+cm9vdCk7CisJCWxpc3RfZGVsX2luaXQoJnJlZi0+bGlzdCk7CisKKwkJc3Bpbl91bmxvY2soJnRyZWUtPmxvY2spOworCQlidHJmc19mcmVlX2xlYWZfcmVmKHJvb3QsIHJlZik7CisJCWNvbmRfcmVzY2hlZCgpOworCQlzcGluX2xvY2soJnRyZWUtPmxvY2spOworCX0KKwlzcGluX3VubG9jaygmdHJlZS0+bG9jayk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBmaW5kIHRoZSBsZWFmIHJlZiBmb3IgYSBnaXZlbiBleHRlbnQuICBUaGlzIHJldHVybnMgdGhlIHJlZiBzdHJ1Y3Qgd2l0aAorICogYSB1c2FnZSByZWZlcmVuY2UgaW5jcmVtZW50ZWQKKyAqLworc3RydWN0IGJ0cmZzX2xlYWZfcmVmICpidHJmc19sb29rdXBfbGVhZl9yZWYoc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsCisJCQkJCSAgICAgdTY0IGJ5dGVucikKK3sKKwlzdHJ1Y3QgcmJfbm9kZSAqcmI7CisJc3RydWN0IGJ0cmZzX2xlYWZfcmVmICpyZWYgPSBOVUxMOworCXN0cnVjdCBidHJmc19sZWFmX3JlZl90cmVlICp0cmVlID0gcm9vdC0+cmVmX3RyZWU7CithZ2FpbjoKKwlpZiAodHJlZSkgeworCQlzcGluX2xvY2soJnRyZWUtPmxvY2spOworCQlyYiA9IHRyZWVfc2VhcmNoKCZ0cmVlLT5yb290LCBieXRlbnIpOworCQlpZiAocmIpCisJCQlyZWYgPSByYl9lbnRyeShyYiwgc3RydWN0IGJ0cmZzX2xlYWZfcmVmLCByYl9ub2RlKTsKKwkJaWYgKHJlZikKKwkJCWF0b21pY19pbmMoJnJlZi0+dXNhZ2UpOworCQlzcGluX3VubG9jaygmdHJlZS0+bG9jayk7CisJCWlmIChyZWYpCisJCQlyZXR1cm4gcmVmOworCX0KKwlpZiAodHJlZSAhPSAmcm9vdC0+ZnNfaW5mby0+c2hhcmVkX3JlZl90cmVlKSB7CisJCXRyZWUgPSAmcm9vdC0+ZnNfaW5mby0+c2hhcmVkX3JlZl90cmVlOworCQlnb3RvIGFnYWluOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworLyoKKyAqIGFkZCBhIGZ1bGx5IGZpbGxlZCBpbiBsZWFmIHJlZiBzdHJ1Y3QKKyAqIHJlbW92ZSBhbGwgdGhlIHJlZnMgb2xkZXIgdGhhbiBhIGdpdmVuIHJvb3QgZ2VuZXJhdGlvbgorICovCitpbnQgYnRyZnNfYWRkX2xlYWZfcmVmKHN0cnVjdCBidHJmc19yb290ICpyb290LCBzdHJ1Y3QgYnRyZnNfbGVhZl9yZWYgKnJlZiwKKwkJICAgICAgIGludCBzaGFyZWQpCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IHJiX25vZGUgKnJiOworCXN0cnVjdCBidHJmc19sZWFmX3JlZl90cmVlICp0cmVlID0gcm9vdC0+cmVmX3RyZWU7CisKKwlpZiAoc2hhcmVkKQorCQl0cmVlID0gJnJvb3QtPmZzX2luZm8tPnNoYXJlZF9yZWZfdHJlZTsKKworCXNwaW5fbG9jaygmdHJlZS0+bG9jayk7CisJcmIgPSB0cmVlX2luc2VydCgmdHJlZS0+cm9vdCwgcmVmLT5ieXRlbnIsICZyZWYtPnJiX25vZGUpOworCWlmIChyYikgeworCQlyZXQgPSAtRUVYSVNUOworCX0gZWxzZSB7CisJCWF0b21pY19pbmMoJnJlZi0+dXNhZ2UpOworCQlyZWYtPnRyZWUgPSB0cmVlOworCQlyZWYtPmluX3RyZWUgPSAxOworCQlsaXN0X2FkZF90YWlsKCZyZWYtPmxpc3QsICZ0cmVlLT5saXN0KTsKKwl9CisJc3Bpbl91bmxvY2soJnRyZWUtPmxvY2spOworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiByZW1vdmUgYSBzaW5nbGUgbGVhZiByZWYgZnJvbSB0aGUgdHJlZS4gIFRoaXMgZHJvcHMgdGhlIHJlZiBoZWxkIGJ5IHRoZSB0cmVlCisgKiBvbmx5CisgKi8KK2ludCBidHJmc19yZW1vdmVfbGVhZl9yZWYoc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsIHN0cnVjdCBidHJmc19sZWFmX3JlZiAqcmVmKQoreworCXN0cnVjdCBidHJmc19sZWFmX3JlZl90cmVlICp0cmVlOworCisJaWYgKCF4Y2hnKCZyZWYtPmluX3RyZWUsIDApKQorCQlyZXR1cm4gMDsKKworCXRyZWUgPSByZWYtPnRyZWU7CisJc3Bpbl9sb2NrKCZ0cmVlLT5sb2NrKTsKKworCXJiX2VyYXNlKCZyZWYtPnJiX25vZGUsICZ0cmVlLT5yb290KTsKKwlsaXN0X2RlbF9pbml0KCZyZWYtPmxpc3QpOworCisJc3Bpbl91bmxvY2soJnRyZWUtPmxvY2spOworCisJYnRyZnNfZnJlZV9sZWFmX3JlZihyb290LCByZWYpOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZnMvYnRyZnMvcmVmLWNhY2hlLmggYi9mcy9idHJmcy9yZWYtY2FjaGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNmYzMTgzCi0tLSAvZGV2L251bGwKKysrIGIvZnMvYnRyZnMvcmVmLWNhY2hlLmgKQEAgLTAsMCArMSw3NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBPcmFjbGUuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSB2MiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorICogQm9zdG9uLCBNQSAwMjExMTAtMTMwNywgVVNBLgorICovCisjaWZuZGVmIF9fUkVGQ0FDSEVfXworI2RlZmluZSBfX1JFRkNBQ0hFX18KKworc3RydWN0IGJ0cmZzX2V4dGVudF9pbmZvIHsKKwkvKiBieXRlbnIgYW5kIG51bV9ieXRlcyBmaW5kIHRoZSBleHRlbnQgaW4gdGhlIGV4dGVudCBhbGxvY2F0aW9uIHRyZWUgKi8KKwl1NjQgYnl0ZW5yOworCXU2NCBudW1fYnl0ZXM7CisKKwkvKiBvYmplY3RpZCBhbmQgb2Zmc2V0IGZpbmQgdGhlIGJhY2sgcmVmZXJlbmNlIGZvciB0aGUgZmlsZSAqLworCXU2NCBvYmplY3RpZDsKKwl1NjQgb2Zmc2V0OworfTsKKworc3RydWN0IGJ0cmZzX2xlYWZfcmVmIHsKKwlzdHJ1Y3QgcmJfbm9kZSByYl9ub2RlOworCXN0cnVjdCBidHJmc19sZWFmX3JlZl90cmVlICp0cmVlOworCWludCBpbl90cmVlOworCWF0b21pY190IHVzYWdlOworCisJdTY0IHJvb3RfZ2VuOworCXU2NCBieXRlbnI7CisJdTY0IG93bmVyOworCXU2NCBnZW5lcmF0aW9uOworCWludCBucml0ZW1zOworCisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCXN0cnVjdCBidHJmc19leHRlbnRfaW5mbyBleHRlbnRzW107Cit9OworCitzdGF0aWMgaW5saW5lIHNpemVfdCBidHJmc19sZWFmX3JlZl9zaXplKGludCBucl9leHRlbnRzKQoreworCXJldHVybiBzaXplb2Yoc3RydWN0IGJ0cmZzX2xlYWZfcmVmKSArCisJICAgICAgIHNpemVvZihzdHJ1Y3QgYnRyZnNfZXh0ZW50X2luZm8pICogbnJfZXh0ZW50czsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGJ0cmZzX2xlYWZfcmVmX3RyZWVfaW5pdChzdHJ1Y3QgYnRyZnNfbGVhZl9yZWZfdHJlZSAqdHJlZSkKK3sKKwl0cmVlLT5yb290LnJiX25vZGUgPSBOVUxMOworCUlOSVRfTElTVF9IRUFEKCZ0cmVlLT5saXN0KTsKKwlzcGluX2xvY2tfaW5pdCgmdHJlZS0+bG9jayk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGJ0cmZzX2xlYWZfcmVmX3RyZWVfZW1wdHkoc3RydWN0IGJ0cmZzX2xlYWZfcmVmX3RyZWUgKnRyZWUpCit7CisJcmV0dXJuIFJCX0VNUFRZX1JPT1QoJnRyZWUtPnJvb3QpOworfQorCit2b2lkIGJ0cmZzX2xlYWZfcmVmX3RyZWVfaW5pdChzdHJ1Y3QgYnRyZnNfbGVhZl9yZWZfdHJlZSAqdHJlZSk7CitzdHJ1Y3QgYnRyZnNfbGVhZl9yZWYgKmJ0cmZzX2FsbG9jX2xlYWZfcmVmKHN0cnVjdCBidHJmc19yb290ICpyb290LAorCQkJCQkgICAgaW50IG5yX2V4dGVudHMpOwordm9pZCBidHJmc19mcmVlX2xlYWZfcmVmKHN0cnVjdCBidHJmc19yb290ICpyb290LCBzdHJ1Y3QgYnRyZnNfbGVhZl9yZWYgKnJlZik7CitzdHJ1Y3QgYnRyZnNfbGVhZl9yZWYgKmJ0cmZzX2xvb2t1cF9sZWFmX3JlZihzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwKKwkJCQkJICAgICB1NjQgYnl0ZW5yKTsKK2ludCBidHJmc19hZGRfbGVhZl9yZWYoc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsIHN0cnVjdCBidHJmc19sZWFmX3JlZiAqcmVmLAorCQkgICAgICAgaW50IHNoYXJlZCk7CitpbnQgYnRyZnNfcmVtb3ZlX2xlYWZfcmVmcyhzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwgdTY0IG1heF9yb290X2dlbiwKKwkJCSAgIGludCBzaGFyZWQpOworaW50IGJ0cmZzX3JlbW92ZV9sZWFmX3JlZihzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwgc3RydWN0IGJ0cmZzX2xlYWZfcmVmICpyZWYpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2ZzL2J0cmZzL3Jvb3QtdHJlZS5jIGIvZnMvYnRyZnMvcm9vdC10cmVlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQ4NjUwZAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2J0cmZzL3Jvb3QtdHJlZS5jCkBAIC0wLDAgKzEsMzY2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE9yYWNsZS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIHYyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCisgKiBCb3N0b24sIE1BIDAyMTExMC0xMzA3LCBVU0EuCisgKi8KKworI2luY2x1ZGUgImN0cmVlLmgiCisjaW5jbHVkZSAidHJhbnNhY3Rpb24uaCIKKyNpbmNsdWRlICJkaXNrLWlvLmgiCisjaW5jbHVkZSAicHJpbnQtdHJlZS5oIgorCisvKgorICogIHNlYXJjaCBmb3J3YXJkIGZvciBhIHJvb3QsIHN0YXJ0aW5nIHdpdGggb2JqZWN0aWQgJ3NlYXJjaF9zdGFydCcKKyAqICBpZiBhIHJvb3Qga2V5IGlzIGZvdW5kLCB0aGUgb2JqZWN0aWQgd2UgZmluZCBpcyBmaWxsZWQgaW50byAnZm91bmRfb2JqZWN0aWQnCisgKiAgYW5kIDAgaXMgcmV0dXJuZWQuICA8IDAgaXMgcmV0dXJuZWQgb24gZXJyb3IsIDEgaWYgdGhlcmUgaXMgbm90aGluZworICogIGxlZnQgaW4gdGhlIHRyZWUuCisgKi8KK2ludCBidHJmc19zZWFyY2hfcm9vdChzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwgdTY0IHNlYXJjaF9zdGFydCwKKwkJICAgICAgdTY0ICpmb3VuZF9vYmplY3RpZCkKK3sKKwlzdHJ1Y3QgYnRyZnNfcGF0aCAqcGF0aDsKKwlzdHJ1Y3QgYnRyZnNfa2V5IHNlYXJjaF9rZXk7CisJaW50IHJldDsKKworCXJvb3QgPSByb290LT5mc19pbmZvLT50cmVlX3Jvb3Q7CisJc2VhcmNoX2tleS5vYmplY3RpZCA9IHNlYXJjaF9zdGFydDsKKwlzZWFyY2hfa2V5LnR5cGUgPSAodTgpLTE7CisJc2VhcmNoX2tleS5vZmZzZXQgPSAodTY0KS0xOworCisJcGF0aCA9IGJ0cmZzX2FsbG9jX3BhdGgoKTsKKwlCVUdfT04oIXBhdGgpOworYWdhaW46CisJcmV0ID0gYnRyZnNfc2VhcmNoX3Nsb3QoTlVMTCwgcm9vdCwgJnNlYXJjaF9rZXksIHBhdGgsIDAsIDApOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dDsKKwlpZiAocmV0ID09IDApIHsKKwkJcmV0ID0gMTsKKwkJZ290byBvdXQ7CisJfQorCWlmIChwYXRoLT5zbG90c1swXSA+PSBidHJmc19oZWFkZXJfbnJpdGVtcyhwYXRoLT5ub2Rlc1swXSkpIHsKKwkJcmV0ID0gYnRyZnNfbmV4dF9sZWFmKHJvb3QsIHBhdGgpOworCQlpZiAocmV0KQorCQkJZ290byBvdXQ7CisJfQorCWJ0cmZzX2l0ZW1fa2V5X3RvX2NwdShwYXRoLT5ub2Rlc1swXSwgJnNlYXJjaF9rZXksIHBhdGgtPnNsb3RzWzBdKTsKKwlpZiAoc2VhcmNoX2tleS50eXBlICE9IEJUUkZTX1JPT1RfSVRFTV9LRVkpIHsKKwkJc2VhcmNoX2tleS5vZmZzZXQrKzsKKwkJYnRyZnNfcmVsZWFzZV9wYXRoKHJvb3QsIHBhdGgpOworCQlnb3RvIGFnYWluOworCX0KKwlyZXQgPSAwOworCSpmb3VuZF9vYmplY3RpZCA9IHNlYXJjaF9rZXkub2JqZWN0aWQ7CisKK291dDoKKwlidHJmc19mcmVlX3BhdGgocGF0aCk7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIGxvb2t1cCB0aGUgcm9vdCB3aXRoIHRoZSBoaWdoZXN0IG9mZnNldCBmb3IgYSBnaXZlbiBvYmplY3RpZC4gIFRoZSBrZXkgd2UgZG8KKyAqIGZpbmQgaXMgY29waWVkIGludG8gJ2tleScuICBJZiB3ZSBmaW5kIHNvbWV0aGluZyByZXR1cm4gMCwgb3RoZXJ3aXNlIDEsIDwgMAorICogb24gZXJyb3IuCisgKi8KK2ludCBidHJmc19maW5kX2xhc3Rfcm9vdChzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwgdTY0IG9iamVjdGlkLAorCQkJc3RydWN0IGJ0cmZzX3Jvb3RfaXRlbSAqaXRlbSwgc3RydWN0IGJ0cmZzX2tleSAqa2V5KQoreworCXN0cnVjdCBidHJmc19wYXRoICpwYXRoOworCXN0cnVjdCBidHJmc19rZXkgc2VhcmNoX2tleTsKKwlzdHJ1Y3QgYnRyZnNfa2V5IGZvdW5kX2tleTsKKwlzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqbDsKKwlpbnQgcmV0OworCWludCBzbG90OworCisJc2VhcmNoX2tleS5vYmplY3RpZCA9IG9iamVjdGlkOworCXNlYXJjaF9rZXkudHlwZSA9IEJUUkZTX1JPT1RfSVRFTV9LRVk7CisJc2VhcmNoX2tleS5vZmZzZXQgPSAodTY0KS0xOworCisJcGF0aCA9IGJ0cmZzX2FsbG9jX3BhdGgoKTsKKwlCVUdfT04oIXBhdGgpOworCXJldCA9IGJ0cmZzX3NlYXJjaF9zbG90KE5VTEwsIHJvb3QsICZzZWFyY2hfa2V5LCBwYXRoLCAwLCAwKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXQ7CisKKwlCVUdfT04ocmV0ID09IDApOworCWwgPSBwYXRoLT5ub2Rlc1swXTsKKwlCVUdfT04ocGF0aC0+c2xvdHNbMF0gPT0gMCk7CisJc2xvdCA9IHBhdGgtPnNsb3RzWzBdIC0gMTsKKwlidHJmc19pdGVtX2tleV90b19jcHUobCwgJmZvdW5kX2tleSwgc2xvdCk7CisJaWYgKGZvdW5kX2tleS5vYmplY3RpZCAhPSBvYmplY3RpZCkgeworCQlyZXQgPSAxOworCQlnb3RvIG91dDsKKwl9CisJcmVhZF9leHRlbnRfYnVmZmVyKGwsIGl0ZW0sIGJ0cmZzX2l0ZW1fcHRyX29mZnNldChsLCBzbG90KSwKKwkJCSAgIHNpemVvZigqaXRlbSkpOworCW1lbWNweShrZXksICZmb3VuZF9rZXksIHNpemVvZihmb3VuZF9rZXkpKTsKKwlyZXQgPSAwOworb3V0OgorCWJ0cmZzX2ZyZWVfcGF0aChwYXRoKTsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogY29weSB0aGUgZGF0YSBpbiAnaXRlbScgaW50byB0aGUgYnRyZWUKKyAqLworaW50IGJ0cmZzX3VwZGF0ZV9yb290KHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLCBzdHJ1Y3QgYnRyZnNfcm9vdAorCQkgICAgICAqcm9vdCwgc3RydWN0IGJ0cmZzX2tleSAqa2V5LCBzdHJ1Y3QgYnRyZnNfcm9vdF9pdGVtCisJCSAgICAgICppdGVtKQoreworCXN0cnVjdCBidHJmc19wYXRoICpwYXRoOworCXN0cnVjdCBleHRlbnRfYnVmZmVyICpsOworCWludCByZXQ7CisJaW50IHNsb3Q7CisJdW5zaWduZWQgbG9uZyBwdHI7CisKKwlwYXRoID0gYnRyZnNfYWxsb2NfcGF0aCgpOworCUJVR19PTighcGF0aCk7CisJcmV0ID0gYnRyZnNfc2VhcmNoX3Nsb3QodHJhbnMsIHJvb3QsIGtleSwgcGF0aCwgMCwgMSk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0OworCisJaWYgKHJldCAhPSAwKSB7CisJCWJ0cmZzX3ByaW50X2xlYWYocm9vdCwgcGF0aC0+bm9kZXNbMF0pOworCQlwcmludGsoS0VSTl9DUklUICJ1bmFibGUgdG8gdXBkYXRlIHJvb3Qga2V5ICVsbHUgJXUgJWxsdVxuIiwKKwkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpa2V5LT5vYmplY3RpZCwga2V5LT50eXBlLAorCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylrZXktPm9mZnNldCk7CisJCUJVR19PTigxKTsKKwl9CisKKwlsID0gcGF0aC0+bm9kZXNbMF07CisJc2xvdCA9IHBhdGgtPnNsb3RzWzBdOworCXB0ciA9IGJ0cmZzX2l0ZW1fcHRyX29mZnNldChsLCBzbG90KTsKKwl3cml0ZV9leHRlbnRfYnVmZmVyKGwsIGl0ZW0sIHB0ciwgc2l6ZW9mKCppdGVtKSk7CisJYnRyZnNfbWFya19idWZmZXJfZGlydHkocGF0aC0+bm9kZXNbMF0pOworb3V0OgorCWJ0cmZzX3JlbGVhc2VfcGF0aChyb290LCBwYXRoKTsKKwlidHJmc19mcmVlX3BhdGgocGF0aCk7CisJcmV0dXJuIHJldDsKK30KKworaW50IGJ0cmZzX2luc2VydF9yb290KHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLCBzdHJ1Y3QgYnRyZnNfcm9vdAorCQkgICAgICAqcm9vdCwgc3RydWN0IGJ0cmZzX2tleSAqa2V5LCBzdHJ1Y3QgYnRyZnNfcm9vdF9pdGVtCisJCSAgICAgICppdGVtKQoreworCWludCByZXQ7CisJcmV0ID0gYnRyZnNfaW5zZXJ0X2l0ZW0odHJhbnMsIHJvb3QsIGtleSwgaXRlbSwgc2l6ZW9mKCppdGVtKSk7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIGF0IG1vdW50IHRpbWUgd2Ugd2FudCB0byBmaW5kIGFsbCB0aGUgb2xkIHRyYW5zYWN0aW9uIHNuYXBzaG90cyB0aGF0IHdlcmUgaW4KKyAqIHRoZSBwcm9jZXNzIG9mIGJlaW5nIGRlbGV0ZWQgaWYgd2UgY3Jhc2hlZC4gIFRoaXMgaXMgYW55IHJvb3QgaXRlbSB3aXRoIGFuCisgKiBvZmZzZXQgbG93ZXIgdGhhbiB0aGUgbGF0ZXN0IHJvb3QuICBUaGV5IG5lZWQgdG8gYmUgcXVldWVkIGZvciBkZWxldGlvbiB0bworICogZmluaXNoIHdoYXQgd2FzIGhhcHBlbmluZyB3aGVuIHdlIGNyYXNoZWQuCisgKi8KK2ludCBidHJmc19maW5kX2RlYWRfcm9vdHMoc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsIHU2NCBvYmplY3RpZCwKKwkJCSAgc3RydWN0IGJ0cmZzX3Jvb3QgKmxhdGVzdCkKK3sKKwlzdHJ1Y3QgYnRyZnNfcm9vdCAqZGVhZF9yb290OworCXN0cnVjdCBidHJmc19pdGVtICppdGVtOworCXN0cnVjdCBidHJmc19yb290X2l0ZW0gKnJpOworCXN0cnVjdCBidHJmc19rZXkga2V5OworCXN0cnVjdCBidHJmc19rZXkgZm91bmRfa2V5OworCXN0cnVjdCBidHJmc19wYXRoICpwYXRoOworCWludCByZXQ7CisJdTMyIG5yaXRlbXM7CisJc3RydWN0IGV4dGVudF9idWZmZXIgKmxlYWY7CisJaW50IHNsb3Q7CisKKwlrZXkub2JqZWN0aWQgPSBvYmplY3RpZDsKKwlidHJmc19zZXRfa2V5X3R5cGUoJmtleSwgQlRSRlNfUk9PVF9JVEVNX0tFWSk7CisJa2V5Lm9mZnNldCA9IDA7CisJcGF0aCA9IGJ0cmZzX2FsbG9jX3BhdGgoKTsKKwlpZiAoIXBhdGgpCisJCXJldHVybiAtRU5PTUVNOworCithZ2FpbjoKKwlyZXQgPSBidHJmc19zZWFyY2hfc2xvdChOVUxMLCByb290LCAma2V5LCBwYXRoLCAwLCAwKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnI7CisJd2hpbGUgKDEpIHsKKwkJbGVhZiA9IHBhdGgtPm5vZGVzWzBdOworCQlucml0ZW1zID0gYnRyZnNfaGVhZGVyX25yaXRlbXMobGVhZik7CisJCXNsb3QgPSBwYXRoLT5zbG90c1swXTsKKwkJaWYgKHNsb3QgPj0gbnJpdGVtcykgeworCQkJcmV0ID0gYnRyZnNfbmV4dF9sZWFmKHJvb3QsIHBhdGgpOworCQkJaWYgKHJldCkKKwkJCQlicmVhazsKKwkJCWxlYWYgPSBwYXRoLT5ub2Rlc1swXTsKKwkJCW5yaXRlbXMgPSBidHJmc19oZWFkZXJfbnJpdGVtcyhsZWFmKTsKKwkJCXNsb3QgPSBwYXRoLT5zbG90c1swXTsKKwkJfQorCQlpdGVtID0gYnRyZnNfaXRlbV9ucihsZWFmLCBzbG90KTsKKwkJYnRyZnNfaXRlbV9rZXlfdG9fY3B1KGxlYWYsICZrZXksIHNsb3QpOworCQlpZiAoYnRyZnNfa2V5X3R5cGUoJmtleSkgIT0gQlRSRlNfUk9PVF9JVEVNX0tFWSkKKwkJCWdvdG8gbmV4dDsKKworCQlpZiAoa2V5Lm9iamVjdGlkIDwgb2JqZWN0aWQpCisJCQlnb3RvIG5leHQ7CisKKwkJaWYgKGtleS5vYmplY3RpZCA+IG9iamVjdGlkKQorCQkJYnJlYWs7CisKKwkJcmkgPSBidHJmc19pdGVtX3B0cihsZWFmLCBzbG90LCBzdHJ1Y3QgYnRyZnNfcm9vdF9pdGVtKTsKKwkJaWYgKGJ0cmZzX2Rpc2tfcm9vdF9yZWZzKGxlYWYsIHJpKSAhPSAwKQorCQkJZ290byBuZXh0OworCisJCW1lbWNweSgmZm91bmRfa2V5LCAma2V5LCBzaXplb2Yoa2V5KSk7CisJCWtleS5vZmZzZXQrKzsKKwkJYnRyZnNfcmVsZWFzZV9wYXRoKHJvb3QsIHBhdGgpOworCQlkZWFkX3Jvb3QgPQorCQkJYnRyZnNfcmVhZF9mc19yb290X25vX3JhZGl4KHJvb3QtPmZzX2luZm8tPnRyZWVfcm9vdCwKKwkJCQkJCSAgICAmZm91bmRfa2V5KTsKKwkJaWYgKElTX0VSUihkZWFkX3Jvb3QpKSB7CisJCQlyZXQgPSBQVFJfRVJSKGRlYWRfcm9vdCk7CisJCQlnb3RvIGVycjsKKwkJfQorCisJCWlmIChvYmplY3RpZCA9PSBCVFJGU19UUkVFX1JFTE9DX09CSkVDVElEKQorCQkJcmV0ID0gYnRyZnNfYWRkX2RlYWRfcmVsb2Nfcm9vdChkZWFkX3Jvb3QpOworCQllbHNlCisJCQlyZXQgPSBidHJmc19hZGRfZGVhZF9yb290KGRlYWRfcm9vdCwgbGF0ZXN0KTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZXJyOworCQlnb3RvIGFnYWluOworbmV4dDoKKwkJc2xvdCsrOworCQlwYXRoLT5zbG90c1swXSsrOworCX0KKwlyZXQgPSAwOworZXJyOgorCWJ0cmZzX2ZyZWVfcGF0aChwYXRoKTsKKwlyZXR1cm4gcmV0OworfQorCisvKiBkcm9wIHRoZSByb290IGl0ZW0gZm9yICdrZXknIGZyb20gJ3Jvb3QnICovCitpbnQgYnRyZnNfZGVsX3Jvb3Qoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsIHN0cnVjdCBidHJmc19yb290ICpyb290LAorCQkgICBzdHJ1Y3QgYnRyZnNfa2V5ICprZXkpCit7CisJc3RydWN0IGJ0cmZzX3BhdGggKnBhdGg7CisJaW50IHJldDsKKwl1MzIgcmVmczsKKwlzdHJ1Y3QgYnRyZnNfcm9vdF9pdGVtICpyaTsKKwlzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqbGVhZjsKKworCXBhdGggPSBidHJmc19hbGxvY19wYXRoKCk7CisJQlVHX09OKCFwYXRoKTsKKwlyZXQgPSBidHJmc19zZWFyY2hfc2xvdCh0cmFucywgcm9vdCwga2V5LCBwYXRoLCAtMSwgMSk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0OworCisJQlVHX09OKHJldCAhPSAwKTsKKwlsZWFmID0gcGF0aC0+bm9kZXNbMF07CisJcmkgPSBidHJmc19pdGVtX3B0cihsZWFmLCBwYXRoLT5zbG90c1swXSwgc3RydWN0IGJ0cmZzX3Jvb3RfaXRlbSk7CisKKwlyZWZzID0gYnRyZnNfZGlza19yb290X3JlZnMobGVhZiwgcmkpOworCUJVR19PTihyZWZzICE9IDApOworCXJldCA9IGJ0cmZzX2RlbF9pdGVtKHRyYW5zLCByb290LCBwYXRoKTsKK291dDoKKwlidHJmc19yZWxlYXNlX3BhdGgocm9vdCwgcGF0aCk7CisJYnRyZnNfZnJlZV9wYXRoKHBhdGgpOworCXJldHVybiByZXQ7Cit9CisKKyNpZiAwIC8qIHRoaXMgd2lsbCBnZXQgdXNlZCB3aGVuIHNuYXBzaG90IGRlbGV0aW9uIGlzIGltcGxlbWVudGVkICovCitpbnQgYnRyZnNfZGVsX3Jvb3RfcmVmKHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAorCQkgICAgICAgc3RydWN0IGJ0cmZzX3Jvb3QgKnRyZWVfcm9vdCwKKwkJICAgICAgIHU2NCByb290X2lkLCB1OCB0eXBlLCB1NjQgcmVmX2lkKQoreworCXN0cnVjdCBidHJmc19rZXkga2V5OworCWludCByZXQ7CisJc3RydWN0IGJ0cmZzX3BhdGggKnBhdGg7CisKKwlwYXRoID0gYnRyZnNfYWxsb2NfcGF0aCgpOworCisJa2V5Lm9iamVjdGlkID0gcm9vdF9pZDsKKwlrZXkudHlwZSA9IHR5cGU7CisJa2V5Lm9mZnNldCA9IHJlZl9pZDsKKworCXJldCA9IGJ0cmZzX3NlYXJjaF9zbG90KHRyYW5zLCB0cmVlX3Jvb3QsICZrZXksIHBhdGgsIC0xLCAxKTsKKwlCVUdfT04ocmV0KTsKKworCXJldCA9IGJ0cmZzX2RlbF9pdGVtKHRyYW5zLCB0cmVlX3Jvb3QsIHBhdGgpOworCUJVR19PTihyZXQpOworCisJYnRyZnNfZnJlZV9wYXRoKHBhdGgpOworCXJldHVybiByZXQ7Cit9CisjZW5kaWYKKworaW50IGJ0cmZzX2ZpbmRfcm9vdF9yZWYoc3RydWN0IGJ0cmZzX3Jvb3QgKnRyZWVfcm9vdCwKKwkJICAgc3RydWN0IGJ0cmZzX3BhdGggKnBhdGgsCisJCSAgIHU2NCByb290X2lkLCB1NjQgcmVmX2lkKQoreworCXN0cnVjdCBidHJmc19rZXkga2V5OworCWludCByZXQ7CisKKwlrZXkub2JqZWN0aWQgPSByb290X2lkOworCWtleS50eXBlID0gQlRSRlNfUk9PVF9SRUZfS0VZOworCWtleS5vZmZzZXQgPSByZWZfaWQ7CisKKwlyZXQgPSBidHJmc19zZWFyY2hfc2xvdChOVUxMLCB0cmVlX3Jvb3QsICZrZXksIHBhdGgsIDAsIDApOworCXJldHVybiByZXQ7Cit9CisKKworLyoKKyAqIGFkZCBhIGJ0cmZzX3Jvb3RfcmVmIGl0ZW0uICB0eXBlIGlzIGVpdGhlciBCVFJGU19ST09UX1JFRl9LRVkKKyAqIG9yIEJUUkZTX1JPT1RfQkFDS1JFRl9LRVkuCisgKgorICogVGhlIGRpcmlkLCBzZXF1ZW5jZSwgbmFtZSBhbmQgbmFtZV9sZW4gcmVmZXIgdG8gdGhlIGRpcmVjdG9yeSBlbnRyeQorICogdGhhdCBpcyByZWZlcmVuY2luZyB0aGUgcm9vdC4KKyAqCisgKiBGb3IgYSBmb3J3YXJkIHJlZiwgdGhlIHJvb3RfaWQgaXMgdGhlIGlkIG9mIHRoZSB0cmVlIHJlZmVyZW5jaW5nCisgKiB0aGUgcm9vdCBhbmQgcmVmX2lkIGlzIHRoZSBpZCBvZiB0aGUgc3Vidm9sICBvciBzbmFwc2hvdC4KKyAqCisgKiBGb3IgYSBiYWNrIHJlZiB0aGUgcm9vdF9pZCBpcyB0aGUgaWQgb2YgdGhlIHN1YnZvbCBvciBzbmFwc2hvdCBhbmQKKyAqIHJlZl9pZCBpcyB0aGUgaWQgb2YgdGhlIHRyZWUgcmVmZXJlbmNpbmcgaXQuCisgKi8KK2ludCBidHJmc19hZGRfcm9vdF9yZWYoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCisJCSAgICAgICBzdHJ1Y3QgYnRyZnNfcm9vdCAqdHJlZV9yb290LAorCQkgICAgICAgdTY0IHJvb3RfaWQsIHU4IHR5cGUsIHU2NCByZWZfaWQsCisJCSAgICAgICB1NjQgZGlyaWQsIHU2NCBzZXF1ZW5jZSwKKwkJICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIGludCBuYW1lX2xlbikKK3sKKwlzdHJ1Y3QgYnRyZnNfa2V5IGtleTsKKwlpbnQgcmV0OworCXN0cnVjdCBidHJmc19wYXRoICpwYXRoOworCXN0cnVjdCBidHJmc19yb290X3JlZiAqcmVmOworCXN0cnVjdCBleHRlbnRfYnVmZmVyICpsZWFmOworCXVuc2lnbmVkIGxvbmcgcHRyOworCisKKwlwYXRoID0gYnRyZnNfYWxsb2NfcGF0aCgpOworCisJa2V5Lm9iamVjdGlkID0gcm9vdF9pZDsKKwlrZXkudHlwZSA9IHR5cGU7CisJa2V5Lm9mZnNldCA9IHJlZl9pZDsKKworCXJldCA9IGJ0cmZzX2luc2VydF9lbXB0eV9pdGVtKHRyYW5zLCB0cmVlX3Jvb3QsIHBhdGgsICZrZXksCisJCQkJICAgICAgc2l6ZW9mKCpyZWYpICsgbmFtZV9sZW4pOworCUJVR19PTihyZXQpOworCisJbGVhZiA9IHBhdGgtPm5vZGVzWzBdOworCXJlZiA9IGJ0cmZzX2l0ZW1fcHRyKGxlYWYsIHBhdGgtPnNsb3RzWzBdLCBzdHJ1Y3QgYnRyZnNfcm9vdF9yZWYpOworCWJ0cmZzX3NldF9yb290X3JlZl9kaXJpZChsZWFmLCByZWYsIGRpcmlkKTsKKwlidHJmc19zZXRfcm9vdF9yZWZfc2VxdWVuY2UobGVhZiwgcmVmLCBzZXF1ZW5jZSk7CisJYnRyZnNfc2V0X3Jvb3RfcmVmX25hbWVfbGVuKGxlYWYsIHJlZiwgbmFtZV9sZW4pOworCXB0ciA9ICh1bnNpZ25lZCBsb25nKShyZWYgKyAxKTsKKwl3cml0ZV9leHRlbnRfYnVmZmVyKGxlYWYsIG5hbWUsIHB0ciwgbmFtZV9sZW4pOworCWJ0cmZzX21hcmtfYnVmZmVyX2RpcnR5KGxlYWYpOworCisJYnRyZnNfZnJlZV9wYXRoKHBhdGgpOworCXJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9mcy9idHJmcy9zdHJ1Y3QtZnVuY3MuYyBiL2ZzL2J0cmZzL3N0cnVjdC1mdW5jcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwZjdlY2EKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9idHJmcy9zdHJ1Y3QtZnVuY3MuYwpAQCAtMCwwICsxLDEzOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBPcmFjbGUuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSB2MiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorICogQm9zdG9uLCBNQSAwMjExMTAtMTMwNywgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+CisKKy8qIHRoaXMgaXMgc29tZSBkZWVwbHkgbmFzdHkgY29kZS4gIGN0cmVlLmggaGFzIGEgZGlmZmVyZW50CisgKiBkZWZpbml0aW9uIGZvciB0aGlzIEJUUkZTX1NFVEdFVF9GVU5DUyBtYWNybywgYmVoaW5kIGEgI2lmbmRlZgorICoKKyAqIFRoZSBlbmQgcmVzdWx0IGlzIHRoYXQgYW55b25lIHdobyAjaW5jbHVkZXMgY3RyZWUuaCBnZXRzIGEKKyAqIGRlY2xhcmF0aW9uIGZvciB0aGUgYnRyZnNfc2V0X2ZvbyBmdW5jdGlvbnMgYW5kIGJ0cmZzX2ZvbyBmdW5jdGlvbnMKKyAqCisgKiBUaGlzIGZpbGUgZGVjbGFyZXMgdGhlIG1hY3JvcyBhbmQgdGhlbiAjaW5jbHVkZXMgY3RyZWUuaCwgd2hpY2ggcmVzdWx0cworICogaW4gY3BwIGNyZWF0aW5nIHRoZSBmdW5jdGlvbiBoZXJlIGJhc2VkIG9uIHRoZSB0ZW1wbGF0ZSBiZWxvdy4KKyAqCisgKiBUaGVzZSBzZXRnZXQgZnVuY3Rpb25zIGRvIGFsbCB0aGUgZXh0ZW50X2J1ZmZlciByZWxhdGVkIG1hcHBpbmcKKyAqIHJlcXVpcmVkIHRvIGVmZmljaWVudGx5IHJlYWQgYW5kIHdyaXRlIHNwZWNpZmljIGZpZWxkcyBpbiB0aGUgZXh0ZW50CisgKiBidWZmZXJzLiAgRXZlcnkgcG9pbnRlciB0byBtZXRhZGF0YSBpdGVtcyBpbiBidHJmcyBpcyByZWFsbHkganVzdAorICogYW4gdW5zaWduZWQgbG9uZyBvZmZzZXQgaW50byB0aGUgZXh0ZW50IGJ1ZmZlciB3aGljaCBoYXMgYmVlbgorICogY2FzdCB0byBhIHNwZWNpZmljIHR5cGUuICBUaGlzIGdpdmVzIHVzIGFsbCB0aGUgZ2NjIHR5cGUgY2hlY2tpbmcuCisgKgorICogVGhlIGV4dGVudCBidWZmZXIgYXBpIGlzIHVzZWQgdG8gZG8gYWxsIHRoZSBrbWFwcGluZyBhbmQgcGFnZQorICogc3Bhbm5pbmcgd29yayByZXF1aXJlZCB0byBnZXQgZXh0ZW50IGJ1ZmZlcnMgaW4gaGlnaG1lbSBhbmQgaGF2ZQorICogYSBtZXRhZGF0YSBibG9ja3NpemUgZGlmZmVyZW50IGZyb20gdGhlIHBhZ2Ugc2l6ZS4KKyAqCisgKiBUaGUgbWFjcm8gc3RhcnRzIHdpdGggYSBzaW1wbGUgZnVuY3Rpb24gcHJvdG90eXBlIGRlY2xhcmF0aW9uIHNvIHRoYXQKKyAqIHNwYXJzZSB3b24ndCBjb21wbGFpbiBhYm91dCBpdCBiZWluZyBzdGF0aWMuCisgKi8KKworI2RlZmluZSBCVFJGU19TRVRHRVRfRlVOQ1MobmFtZSwgdHlwZSwgbWVtYmVyLCBiaXRzKQkJCVwKK3UjI2JpdHMgYnRyZnNfIyNuYW1lKHN0cnVjdCBleHRlbnRfYnVmZmVyICplYiwgdHlwZSAqcyk7CQlcCit2b2lkIGJ0cmZzX3NldF8jI25hbWUoc3RydWN0IGV4dGVudF9idWZmZXIgKmViLCB0eXBlICpzLCB1IyNiaXRzIHZhbCk7CVwKK3UjI2JpdHMgYnRyZnNfIyNuYW1lKHN0cnVjdCBleHRlbnRfYnVmZmVyICplYiwJCQkJXAorCQkJCSAgIHR5cGUgKnMpCQkJCVwKK3sJCQkJCQkJCQlcCisJdW5zaWduZWQgbG9uZyBwYXJ0X29mZnNldCA9ICh1bnNpZ25lZCBsb25nKXM7CQkJXAorCXVuc2lnbmVkIGxvbmcgb2Zmc2V0ID0gcGFydF9vZmZzZXQgKyBvZmZzZXRvZih0eXBlLCBtZW1iZXIpOwlcCisJdHlwZSAqcDsJCQkJCQkJXAorCS8qIHVnbHksIGJ1dCB3ZSB3YW50IHRoZSBmYXN0IHBhdGggaGVyZSAqLwkJCVwKKwlpZiAoZWItPm1hcF90b2tlbiAmJiBvZmZzZXQgPj0gZWItPm1hcF9zdGFydCAmJgkJCVwKKwkgICAgb2Zmc2V0ICsgc2l6ZW9mKCgodHlwZSAqKTApLT5tZW1iZXIpIDw9IGViLT5tYXBfc3RhcnQgKwlcCisJICAgIGViLT5tYXBfbGVuKSB7CQkJCQkJXAorCQlwID0gKHR5cGUgKikoZWItPmthZGRyICsgcGFydF9vZmZzZXQgLSBlYi0+bWFwX3N0YXJ0KTsJXAorCQlyZXR1cm4gbGUjI2JpdHMjI190b19jcHUocC0+bWVtYmVyKTsJCQlcCisJfQkJCQkJCQkJXAorCXsJCQkJCQkJCVwKKwkJaW50IGVycjsJCQkJCQlcCisJCWNoYXIgKm1hcF90b2tlbjsJCQkJCVwKKwkJY2hhciAqa2FkZHI7CQkJCQkJXAorCQlpbnQgdW5tYXBfb25fZXhpdCA9IChlYi0+bWFwX3Rva2VuID09IE5VTEwpOwkJXAorCQl1bnNpZ25lZCBsb25nIG1hcF9zdGFydDsJCQkJXAorCQl1bnNpZ25lZCBsb25nIG1hcF9sZW47CQkJCQlcCisJCXUjI2JpdHMgcmVzOwkJCQkJCVwKKwkJZXJyID0gbWFwX2V4dGVudF9idWZmZXIoZWIsIG9mZnNldCwJCQlcCisJCQkJc2l6ZW9mKCgodHlwZSAqKTApLT5tZW1iZXIpLAkJXAorCQkJCSZtYXBfdG9rZW4sICZrYWRkciwJCQlcCisJCQkJJm1hcF9zdGFydCwgJm1hcF9sZW4sIEtNX1VTRVIxKTsJXAorCQlpZiAoZXJyKSB7CQkJCQkJXAorCQkJX19sZSMjYml0cyBsZXJlczsJCQkJXAorCQkJcmVhZF9lYl9tZW1iZXIoZWIsIHMsIHR5cGUsIG1lbWJlciwgJmxlcmVzKTsJXAorCQkJcmV0dXJuIGxlIyNiaXRzIyNfdG9fY3B1KGxlcmVzKTsJCVwKKwkJfQkJCQkJCQlcCisJCXAgPSAodHlwZSAqKShrYWRkciArIHBhcnRfb2Zmc2V0IC0gbWFwX3N0YXJ0KTsJCVwKKwkJcmVzID0gbGUjI2JpdHMjI190b19jcHUocC0+bWVtYmVyKTsJCQlcCisJCWlmICh1bm1hcF9vbl9leGl0KQkJCQkJXAorCQkJdW5tYXBfZXh0ZW50X2J1ZmZlcihlYiwgbWFwX3Rva2VuLCBLTV9VU0VSMSk7CVwKKwkJcmV0dXJuIHJlczsJCQkJCQlcCisJfQkJCQkJCQkJXAorfQkJCQkJCQkJCVwKK3ZvaWQgYnRyZnNfc2V0XyMjbmFtZShzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqZWIsCQkJCVwKKwkJCQkgICAgdHlwZSAqcywgdSMjYml0cyB2YWwpCQlcCit7CQkJCQkJCQkJXAorCXVuc2lnbmVkIGxvbmcgcGFydF9vZmZzZXQgPSAodW5zaWduZWQgbG9uZylzOwkJCVwKKwl1bnNpZ25lZCBsb25nIG9mZnNldCA9IHBhcnRfb2Zmc2V0ICsgb2Zmc2V0b2YodHlwZSwgbWVtYmVyKTsJXAorCXR5cGUgKnA7CQkJCQkJCVwKKwkvKiB1Z2x5LCBidXQgd2Ugd2FudCB0aGUgZmFzdCBwYXRoIGhlcmUgKi8JCQlcCisJaWYgKGViLT5tYXBfdG9rZW4gJiYgb2Zmc2V0ID49IGViLT5tYXBfc3RhcnQgJiYJCQlcCisJICAgIG9mZnNldCArIHNpemVvZigoKHR5cGUgKikwKS0+bWVtYmVyKSA8PSBlYi0+bWFwX3N0YXJ0ICsJXAorCSAgICBlYi0+bWFwX2xlbikgewkJCQkJCVwKKwkJcCA9ICh0eXBlICopKGViLT5rYWRkciArIHBhcnRfb2Zmc2V0IC0gZWItPm1hcF9zdGFydCk7CVwKKwkJcC0+bWVtYmVyID0gY3B1X3RvX2xlIyNiaXRzKHZhbCk7CQkJXAorCQlyZXR1cm47CQkJCQkJCVwKKwl9CQkJCQkJCQlcCisJewkJCQkJCQkJXAorCQlpbnQgZXJyOwkJCQkJCVwKKwkJY2hhciAqbWFwX3Rva2VuOwkJCQkJXAorCQljaGFyICprYWRkcjsJCQkJCQlcCisJCWludCB1bm1hcF9vbl9leGl0ID0gKGViLT5tYXBfdG9rZW4gPT0gTlVMTCk7CQlcCisJCXVuc2lnbmVkIGxvbmcgbWFwX3N0YXJ0OwkJCQlcCisJCXVuc2lnbmVkIGxvbmcgbWFwX2xlbjsJCQkJCVwKKwkJZXJyID0gbWFwX2V4dGVudF9idWZmZXIoZWIsIG9mZnNldCwJCQlcCisJCQkJc2l6ZW9mKCgodHlwZSAqKTApLT5tZW1iZXIpLAkJXAorCQkJCSZtYXBfdG9rZW4sICZrYWRkciwJCQlcCisJCQkJJm1hcF9zdGFydCwgJm1hcF9sZW4sIEtNX1VTRVIxKTsJXAorCQlpZiAoZXJyKSB7CQkJCQkJXAorCQkJX19sZSMjYml0cyB2YWwyOwkJCQlcCisJCQl2YWwyID0gY3B1X3RvX2xlIyNiaXRzKHZhbCk7CQkJXAorCQkJd3JpdGVfZWJfbWVtYmVyKGViLCBzLCB0eXBlLCBtZW1iZXIsICZ2YWwyKTsJXAorCQkJcmV0dXJuOwkJCQkJCVwKKwkJfQkJCQkJCQlcCisJCXAgPSAodHlwZSAqKShrYWRkciArIHBhcnRfb2Zmc2V0IC0gbWFwX3N0YXJ0KTsJCVwKKwkJcC0+bWVtYmVyID0gY3B1X3RvX2xlIyNiaXRzKHZhbCk7CQkJXAorCQlpZiAodW5tYXBfb25fZXhpdCkJCQkJCVwKKwkJCXVubWFwX2V4dGVudF9idWZmZXIoZWIsIG1hcF90b2tlbiwgS01fVVNFUjEpOwlcCisJfQkJCQkJCQkJXAorfQorCisjaW5jbHVkZSAiY3RyZWUuaCIKKwordm9pZCBidHJmc19ub2RlX2tleShzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqZWIsCisJCSAgICBzdHJ1Y3QgYnRyZnNfZGlza19rZXkgKmRpc2tfa2V5LCBpbnQgbnIpCit7CisJdW5zaWduZWQgbG9uZyBwdHIgPSBidHJmc19ub2RlX2tleV9wdHJfb2Zmc2V0KG5yKTsKKwlpZiAoZWItPm1hcF90b2tlbiAmJiBwdHIgPj0gZWItPm1hcF9zdGFydCAmJgorCSAgICBwdHIgKyBzaXplb2YoKmRpc2tfa2V5KSA8PSBlYi0+bWFwX3N0YXJ0ICsgZWItPm1hcF9sZW4pIHsKKwkJbWVtY3B5KGRpc2tfa2V5LCBlYi0+a2FkZHIgKyBwdHIgLSBlYi0+bWFwX3N0YXJ0LAorCQkJc2l6ZW9mKCpkaXNrX2tleSkpOworCQlyZXR1cm47CisJfSBlbHNlIGlmIChlYi0+bWFwX3Rva2VuKSB7CisJCXVubWFwX2V4dGVudF9idWZmZXIoZWIsIGViLT5tYXBfdG9rZW4sIEtNX1VTRVIxKTsKKwkJZWItPm1hcF90b2tlbiA9IE5VTEw7CisJfQorCXJlYWRfZWJfbWVtYmVyKGViLCAoc3RydWN0IGJ0cmZzX2tleV9wdHIgKilwdHIsCisJCSAgICAgICBzdHJ1Y3QgYnRyZnNfa2V5X3B0ciwga2V5LCBkaXNrX2tleSk7Cit9CmRpZmYgLS1naXQgYS9mcy9idHJmcy9zdXBlci5jIGIvZnMvYnRyZnMvc3VwZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjlmYjNiCi0tLSAvZGV2L251bGwKKysrIGIvZnMvYnRyZnMvc3VwZXIuYwpAQCAtMCwwICsxLDcyMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBPcmFjbGUuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSB2MiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorICogQm9zdG9uLCBNQSAwMjExMTAtMTMwNywgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvYmFja2luZy1kZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9tb3VudC5oPgorI2luY2x1ZGUgPGxpbnV4L21wYWdlLmg+CisjaW5jbHVkZSA8bGludXgvc3dhcC5oPgorI2luY2x1ZGUgPGxpbnV4L3dyaXRlYmFjay5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YXRmcy5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBhdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BhcnNlci5oPgorI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CisjaW5jbHVkZSA8bGludXgvbmFtZWkuaD4KKyNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L21hZ2ljLmg+CisjaW5jbHVkZSAiY29tcGF0LmgiCisjaW5jbHVkZSAiY3RyZWUuaCIKKyNpbmNsdWRlICJkaXNrLWlvLmgiCisjaW5jbHVkZSAidHJhbnNhY3Rpb24uaCIKKyNpbmNsdWRlICJidHJmc19pbm9kZS5oIgorI2luY2x1ZGUgImlvY3RsLmgiCisjaW5jbHVkZSAicHJpbnQtdHJlZS5oIgorI2luY2x1ZGUgInhhdHRyLmgiCisjaW5jbHVkZSAidm9sdW1lcy5oIgorI2luY2x1ZGUgInZlcnNpb24uaCIKKyNpbmNsdWRlICJleHBvcnQuaCIKKyNpbmNsdWRlICJjb21wcmVzc2lvbi5oIgorCisKK3N0YXRpYyBzdHJ1Y3Qgc3VwZXJfb3BlcmF0aW9ucyBidHJmc19zdXBlcl9vcHM7CisKK3N0YXRpYyB2b2lkIGJ0cmZzX3B1dF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCXN0cnVjdCBidHJmc19yb290ICpyb290ID0gYnRyZnNfc2Ioc2IpOworCWludCByZXQ7CisKKwlyZXQgPSBjbG9zZV9jdHJlZShyb290KTsKKwlzYi0+c19mc19pbmZvID0gTlVMTDsKK30KKworZW51bSB7CisJT3B0X2RlZ3JhZGVkLCBPcHRfc3Vidm9sLCBPcHRfZGV2aWNlLCBPcHRfbm9kYXRhc3VtLCBPcHRfbm9kYXRhY293LAorCU9wdF9tYXhfZXh0ZW50LCBPcHRfbWF4X2lubGluZSwgT3B0X2FsbG9jX3N0YXJ0LCBPcHRfbm9iYXJyaWVyLAorCU9wdF9zc2QsIE9wdF90aHJlYWRfcG9vbCwgT3B0X25vYWNsLCAgT3B0X2NvbXByZXNzLCBPcHRfZXJyLAorfTsKKworc3RhdGljIG1hdGNoX3RhYmxlX3QgdG9rZW5zID0geworCXtPcHRfZGVncmFkZWQsICJkZWdyYWRlZCJ9LAorCXtPcHRfc3Vidm9sLCAic3Vidm9sPSVzIn0sCisJe09wdF9kZXZpY2UsICJkZXZpY2U9JXMifSwKKwl7T3B0X25vZGF0YXN1bSwgIm5vZGF0YXN1bSJ9LAorCXtPcHRfbm9kYXRhY293LCAibm9kYXRhY293In0sCisJe09wdF9ub2JhcnJpZXIsICJub2JhcnJpZXIifSwKKwl7T3B0X21heF9leHRlbnQsICJtYXhfZXh0ZW50PSVzIn0sCisJe09wdF9tYXhfaW5saW5lLCAibWF4X2lubGluZT0lcyJ9LAorCXtPcHRfYWxsb2Nfc3RhcnQsICJhbGxvY19zdGFydD0lcyJ9LAorCXtPcHRfdGhyZWFkX3Bvb2wsICJ0aHJlYWRfcG9vbD0lZCJ9LAorCXtPcHRfY29tcHJlc3MsICJjb21wcmVzcyJ9LAorCXtPcHRfc3NkLCAic3NkIn0sCisJe09wdF9ub2FjbCwgIm5vYWNsIn0sCisJe09wdF9lcnIsIE5VTEx9LAorfTsKKwordTY0IGJ0cmZzX3BhcnNlX3NpemUoY2hhciAqc3RyKQoreworCXU2NCByZXM7CisJaW50IG11bHQgPSAxOworCWNoYXIgKmVuZDsKKwljaGFyIGxhc3Q7CisKKwlyZXMgPSBzaW1wbGVfc3RydG91bChzdHIsICZlbmQsIDEwKTsKKworCWxhc3QgPSBlbmRbMF07CisJaWYgKGlzYWxwaGEobGFzdCkpIHsKKwkJbGFzdCA9IHRvbG93ZXIobGFzdCk7CisJCXN3aXRjaCAobGFzdCkgeworCQljYXNlICdnJzoKKwkJCW11bHQgKj0gMTAyNDsKKwkJY2FzZSAnbSc6CisJCQltdWx0ICo9IDEwMjQ7CisJCWNhc2UgJ2snOgorCQkJbXVsdCAqPSAxMDI0OworCQl9CisJCXJlcyA9IHJlcyAqIG11bHQ7CisJfQorCXJldHVybiByZXM7Cit9CisKKy8qCisgKiBSZWd1bGFyIG1vdW50IG9wdGlvbnMgcGFyc2VyLiAgRXZlcnl0aGluZyB0aGF0IGlzIG5lZWRlZCBvbmx5IHdoZW4KKyAqIHJlYWRpbmcgaW4gYSBuZXcgc3VwZXJibG9jayBpcyBwYXJzZWQgaGVyZS4KKyAqLworaW50IGJ0cmZzX3BhcnNlX29wdGlvbnMoc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsIGNoYXIgKm9wdGlvbnMpCit7CisJc3RydWN0IGJ0cmZzX2ZzX2luZm8gKmluZm8gPSByb290LT5mc19pbmZvOworCXN1YnN0cmluZ190IGFyZ3NbTUFYX09QVF9BUkdTXTsKKwljaGFyICpwLCAqbnVtOworCWludCBpbnRhcmc7CisKKwlpZiAoIW9wdGlvbnMpCisJCXJldHVybiAwOworCisJLyoKKwkgKiBzdHJzZXAgY2hhbmdlcyB0aGUgc3RyaW5nLCBkdXBsaWNhdGUgaXQgYmVjYXVzZSBwYXJzZV9vcHRpb25zCisJICogZ2V0cyBjYWxsZWQgdHdpY2UKKwkgKi8KKwlvcHRpb25zID0ga3N0cmR1cChvcHRpb25zLCBHRlBfTk9GUyk7CisJaWYgKCFvcHRpb25zKQorCQlyZXR1cm4gLUVOT01FTTsKKworCisJd2hpbGUgKChwID0gc3Ryc2VwKCZvcHRpb25zLCAiLCIpKSAhPSBOVUxMKSB7CisJCWludCB0b2tlbjsKKwkJaWYgKCEqcCkKKwkJCWNvbnRpbnVlOworCisJCXRva2VuID0gbWF0Y2hfdG9rZW4ocCwgdG9rZW5zLCBhcmdzKTsKKwkJc3dpdGNoICh0b2tlbikgeworCQljYXNlIE9wdF9kZWdyYWRlZDoKKwkJCXByaW50ayhLRVJOX0lORk8gImJ0cmZzOiBhbGxvd2luZyBkZWdyYWRlZCBtb3VudHNcbiIpOworCQkJYnRyZnNfc2V0X29wdChpbmZvLT5tb3VudF9vcHQsIERFR1JBREVEKTsKKwkJCWJyZWFrOworCQljYXNlIE9wdF9zdWJ2b2w6CisJCWNhc2UgT3B0X2RldmljZToKKwkJCS8qCisJCQkgKiBUaGVzZSBhcmUgcGFyc2VkIGJ5IGJ0cmZzX3BhcnNlX2Vhcmx5X29wdGlvbnMKKwkJCSAqIGFuZCBjYW4gYmUgaGFwcGlseSBpZ25vcmVkIGhlcmUuCisJCQkgKi8KKwkJCWJyZWFrOworCQljYXNlIE9wdF9ub2RhdGFzdW06CisJCQlwcmludGsoS0VSTl9JTkZPICJidHJmczogc2V0dGluZyBub2RhdGFjc3VtXG4iKTsKKwkJCWJ0cmZzX3NldF9vcHQoaW5mby0+bW91bnRfb3B0LCBOT0RBVEFTVU0pOworCQkJYnJlYWs7CisJCWNhc2UgT3B0X25vZGF0YWNvdzoKKwkJCXByaW50ayhLRVJOX0lORk8gImJ0cmZzOiBzZXR0aW5nIG5vZGF0YWNvd1xuIik7CisJCQlidHJmc19zZXRfb3B0KGluZm8tPm1vdW50X29wdCwgTk9EQVRBQ09XKTsKKwkJCWJ0cmZzX3NldF9vcHQoaW5mby0+bW91bnRfb3B0LCBOT0RBVEFTVU0pOworCQkJYnJlYWs7CisJCWNhc2UgT3B0X2NvbXByZXNzOgorCQkJcHJpbnRrKEtFUk5fSU5GTyAiYnRyZnM6IHVzZSBjb21wcmVzc2lvblxuIik7CisJCQlidHJmc19zZXRfb3B0KGluZm8tPm1vdW50X29wdCwgQ09NUFJFU1MpOworCQkJYnJlYWs7CisJCWNhc2UgT3B0X3NzZDoKKwkJCXByaW50ayhLRVJOX0lORk8gImJ0cmZzOiB1c2Ugc3NkIGFsbG9jYXRpb24gc2NoZW1lXG4iKTsKKwkJCWJ0cmZzX3NldF9vcHQoaW5mby0+bW91bnRfb3B0LCBTU0QpOworCQkJYnJlYWs7CisJCWNhc2UgT3B0X25vYmFycmllcjoKKwkJCXByaW50ayhLRVJOX0lORk8gImJ0cmZzOiB0dXJuaW5nIG9mZiBiYXJyaWVyc1xuIik7CisJCQlidHJmc19zZXRfb3B0KGluZm8tPm1vdW50X29wdCwgTk9CQVJSSUVSKTsKKwkJCWJyZWFrOworCQljYXNlIE9wdF90aHJlYWRfcG9vbDoKKwkJCWludGFyZyA9IDA7CisJCQltYXRjaF9pbnQoJmFyZ3NbMF0sICZpbnRhcmcpOworCQkJaWYgKGludGFyZykgeworCQkJCWluZm8tPnRocmVhZF9wb29sX3NpemUgPSBpbnRhcmc7CisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiYnRyZnM6IHRocmVhZCBwb29sICVkXG4iLAorCQkJCSAgICAgICBpbmZvLT50aHJlYWRfcG9vbF9zaXplKTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIE9wdF9tYXhfZXh0ZW50OgorCQkJbnVtID0gbWF0Y2hfc3RyZHVwKCZhcmdzWzBdKTsKKwkJCWlmIChudW0pIHsKKwkJCQlpbmZvLT5tYXhfZXh0ZW50ID0gYnRyZnNfcGFyc2Vfc2l6ZShudW0pOworCQkJCWtmcmVlKG51bSk7CisKKwkJCQlpbmZvLT5tYXhfZXh0ZW50ID0gbWF4X3QodTY0LAorCQkJCQlpbmZvLT5tYXhfZXh0ZW50LCByb290LT5zZWN0b3JzaXplKTsKKwkJCQlwcmludGsoS0VSTl9JTkZPICJidHJmczogbWF4X2V4dGVudCBhdCAlbGx1XG4iLAorCQkJCSAgICAgICBpbmZvLT5tYXhfZXh0ZW50KTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIE9wdF9tYXhfaW5saW5lOgorCQkJbnVtID0gbWF0Y2hfc3RyZHVwKCZhcmdzWzBdKTsKKwkJCWlmIChudW0pIHsKKwkJCQlpbmZvLT5tYXhfaW5saW5lID0gYnRyZnNfcGFyc2Vfc2l6ZShudW0pOworCQkJCWtmcmVlKG51bSk7CisKKwkJCQlpZiAoaW5mby0+bWF4X2lubGluZSkgeworCQkJCQlpbmZvLT5tYXhfaW5saW5lID0gbWF4X3QodTY0LAorCQkJCQkJaW5mby0+bWF4X2lubGluZSwKKwkJCQkJCXJvb3QtPnNlY3RvcnNpemUpOworCQkJCX0KKwkJCQlwcmludGsoS0VSTl9JTkZPICJidHJmczogbWF4X2lubGluZSBhdCAlbGx1XG4iLAorCQkJCQlpbmZvLT5tYXhfaW5saW5lKTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIE9wdF9hbGxvY19zdGFydDoKKwkJCW51bSA9IG1hdGNoX3N0cmR1cCgmYXJnc1swXSk7CisJCQlpZiAobnVtKSB7CisJCQkJaW5mby0+YWxsb2Nfc3RhcnQgPSBidHJmc19wYXJzZV9zaXplKG51bSk7CisJCQkJa2ZyZWUobnVtKTsKKwkJCQlwcmludGsoS0VSTl9JTkZPCisJCQkJCSJidHJmczogYWxsb2NhdGlvbnMgc3RhcnQgYXQgJWxsdVxuIiwKKwkJCQkJaW5mby0+YWxsb2Nfc3RhcnQpOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgT3B0X25vYWNsOgorCQkJcm9vdC0+ZnNfaW5mby0+c2ItPnNfZmxhZ3MgJj0gfk1TX1BPU0lYQUNMOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCX0KKwlrZnJlZShvcHRpb25zKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFBhcnNlIG1vdW50IG9wdGlvbnMgdGhhdCBhcmUgcmVxdWlyZWQgZWFybHkgaW4gdGhlIG1vdW50IHByb2Nlc3MuCisgKgorICogQWxsIG90aGVyIG9wdGlvbnMgd2lsbCBiZSBwYXJzZWQgb24gbXVjaCBsYXRlciBpbiB0aGUgbW91bnQgcHJvY2VzcyBhbmQKKyAqIG9ubHkgd2hlbiB3ZSBuZWVkIHRvIGFsbG9jYXRlIGEgbmV3IHN1cGVyIGJsb2NrLgorICovCitzdGF0aWMgaW50IGJ0cmZzX3BhcnNlX2Vhcmx5X29wdGlvbnMoY29uc3QgY2hhciAqb3B0aW9ucywgZm1vZGVfdCBmbGFncywKKwkJdm9pZCAqaG9sZGVyLCBjaGFyICoqc3Vidm9sX25hbWUsCisJCXN0cnVjdCBidHJmc19mc19kZXZpY2VzICoqZnNfZGV2aWNlcykKK3sKKwlzdWJzdHJpbmdfdCBhcmdzW01BWF9PUFRfQVJHU107CisJY2hhciAqb3B0cywgKnA7CisJaW50IGVycm9yID0gMDsKKworCWlmICghb3B0aW9ucykKKwkJZ290byBvdXQ7CisKKwkvKgorCSAqIHN0cnNlcCBjaGFuZ2VzIHRoZSBzdHJpbmcsIGR1cGxpY2F0ZSBpdCBiZWNhdXNlIHBhcnNlX29wdGlvbnMKKwkgKiBnZXRzIGNhbGxlZCB0d2ljZQorCSAqLworCW9wdHMgPSBrc3RyZHVwKG9wdGlvbnMsIEdGUF9LRVJORUwpOworCWlmICghb3B0cykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwl3aGlsZSAoKHAgPSBzdHJzZXAoJm9wdHMsICIsIikpICE9IE5VTEwpIHsKKwkJaW50IHRva2VuOworCQlpZiAoISpwKQorCQkJY29udGludWU7CisKKwkJdG9rZW4gPSBtYXRjaF90b2tlbihwLCB0b2tlbnMsIGFyZ3MpOworCQlzd2l0Y2ggKHRva2VuKSB7CisJCWNhc2UgT3B0X3N1YnZvbDoKKwkJCSpzdWJ2b2xfbmFtZSA9IG1hdGNoX3N0cmR1cCgmYXJnc1swXSk7CisJCQlicmVhazsKKwkJY2FzZSBPcHRfZGV2aWNlOgorCQkJZXJyb3IgPSBidHJmc19zY2FuX29uZV9kZXZpY2UobWF0Y2hfc3RyZHVwKCZhcmdzWzBdKSwKKwkJCQkJZmxhZ3MsIGhvbGRlciwgZnNfZGV2aWNlcyk7CisJCQlpZiAoZXJyb3IpCisJCQkJZ290byBvdXRfZnJlZV9vcHRzOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCX0KKworIG91dF9mcmVlX29wdHM6CisJa2ZyZWUob3B0cyk7Cisgb3V0OgorCS8qCisJICogSWYgbm8gc3Vidm9sdW1lIG5hbWUgaXMgc3BlY2lmaWVkIHdlIHVzZSB0aGUgZGVmYXVsdCBvbmUuICBBbGxvY2F0ZQorCSAqIGEgY29weSBvZiB0aGUgc3RyaW5nICIuIiBoZXJlIHNvIHRoYXQgY29kZSBsYXRlciBpbiB0aGUKKwkgKiBtb3VudCBwYXRoIGRvZXNuJ3QgY2FyZSBpZiBpdCdzIHRoZSBkZWZhdWx0IHZvbHVtZSBvciBhbm90aGVyIG9uZS4KKwkgKi8KKwlpZiAoISpzdWJ2b2xfbmFtZSkgeworCQkqc3Vidm9sX25hbWUgPSBrc3RyZHVwKCIuIiwgR0ZQX0tFUk5FTCk7CisJCWlmICghKnN1YnZvbF9uYW1lKQorCQkJcmV0dXJuIC1FTk9NRU07CisJfQorCXJldHVybiBlcnJvcjsKK30KKworc3RhdGljIGludCBidHJmc19maWxsX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCisJCQkgICAgc3RydWN0IGJ0cmZzX2ZzX2RldmljZXMgKmZzX2RldmljZXMsCisJCQkgICAgdm9pZCAqZGF0YSwgaW50IHNpbGVudCkKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCXN0cnVjdCBkZW50cnkgKnJvb3RfZGVudHJ5OworCXN0cnVjdCBidHJmc19zdXBlcl9ibG9jayAqZGlza19zdXBlcjsKKwlzdHJ1Y3QgYnRyZnNfcm9vdCAqdHJlZV9yb290OworCXN0cnVjdCBidHJmc19pbm9kZSAqYmk7CisJaW50IGVycjsKKworCXNiLT5zX21heGJ5dGVzID0gTUFYX0xGU19GSUxFU0laRTsKKwlzYi0+c19tYWdpYyA9IEJUUkZTX1NVUEVSX01BR0lDOworCXNiLT5zX29wID0gJmJ0cmZzX3N1cGVyX29wczsKKwlzYi0+c19leHBvcnRfb3AgPSAmYnRyZnNfZXhwb3J0X29wczsKKwlzYi0+c194YXR0ciA9IGJ0cmZzX3hhdHRyX2hhbmRsZXJzOworCXNiLT5zX3RpbWVfZ3JhbiA9IDE7CisJc2ItPnNfZmxhZ3MgfD0gTVNfUE9TSVhBQ0w7CisKKwl0cmVlX3Jvb3QgPSBvcGVuX2N0cmVlKHNiLCBmc19kZXZpY2VzLCAoY2hhciAqKWRhdGEpOworCisJaWYgKElTX0VSUih0cmVlX3Jvb3QpKSB7CisJCXByaW50aygiYnRyZnM6IG9wZW5fY3RyZWUgZmFpbGVkXG4iKTsKKwkJcmV0dXJuIFBUUl9FUlIodHJlZV9yb290KTsKKwl9CisJc2ItPnNfZnNfaW5mbyA9IHRyZWVfcm9vdDsKKwlkaXNrX3N1cGVyID0gJnRyZWVfcm9vdC0+ZnNfaW5mby0+c3VwZXJfY29weTsKKwlpbm9kZSA9IGJ0cmZzX2lnZXRfbG9ja2VkKHNiLCBCVFJGU19GSVJTVF9GUkVFX09CSkVDVElELAorCQkJCSAgdHJlZV9yb290LT5mc19pbmZvLT5mc19yb290KTsKKwliaSA9IEJUUkZTX0koaW5vZGUpOworCWJpLT5sb2NhdGlvbi5vYmplY3RpZCA9IGlub2RlLT5pX2lubzsKKwliaS0+bG9jYXRpb24ub2Zmc2V0ID0gMDsKKwliaS0+cm9vdCA9IHRyZWVfcm9vdC0+ZnNfaW5mby0+ZnNfcm9vdDsKKworCWJ0cmZzX3NldF9rZXlfdHlwZSgmYmktPmxvY2F0aW9uLCBCVFJGU19JTk9ERV9JVEVNX0tFWSk7CisKKwlpZiAoIWlub2RlKSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZmFpbF9jbG9zZTsKKwl9CisJaWYgKGlub2RlLT5pX3N0YXRlICYgSV9ORVcpIHsKKwkJYnRyZnNfcmVhZF9sb2NrZWRfaW5vZGUoaW5vZGUpOworCQl1bmxvY2tfbmV3X2lub2RlKGlub2RlKTsKKwl9CisKKwlyb290X2RlbnRyeSA9IGRfYWxsb2Nfcm9vdChpbm9kZSk7CisJaWYgKCFyb290X2RlbnRyeSkgeworCQlpcHV0KGlub2RlKTsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBmYWlsX2Nsb3NlOworCX0KKyNpZiAwCisJLyogdGhpcyBkb2VzIHRoZSBzdXBlciBrb2JqIGF0IHRoZSBzYW1lIHRpbWUgKi8KKwllcnIgPSBidHJmc19zeXNmc19hZGRfc3VwZXIodHJlZV9yb290LT5mc19pbmZvKTsKKwlpZiAoZXJyKQorCQlnb3RvIGZhaWxfY2xvc2U7CisjZW5kaWYKKworCXNiLT5zX3Jvb3QgPSByb290X2RlbnRyeTsKKworCXNhdmVfbW91bnRfb3B0aW9ucyhzYiwgZGF0YSk7CisJcmV0dXJuIDA7CisKK2ZhaWxfY2xvc2U6CisJY2xvc2VfY3RyZWUodHJlZV9yb290KTsKKwlyZXR1cm4gZXJyOworfQorCitpbnQgYnRyZnNfc3luY19mcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgd2FpdCkKK3sKKwlzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFuczsKKwlzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdDsKKwlpbnQgcmV0OworCXJvb3QgPSBidHJmc19zYihzYik7CisKKwlpZiAoc2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkpCisJCXJldHVybiAwOworCisJc2ItPnNfZGlydCA9IDA7CisJaWYgKCF3YWl0KSB7CisJCWZpbGVtYXBfZmx1c2gocm9vdC0+ZnNfaW5mby0+YnRyZWVfaW5vZGUtPmlfbWFwcGluZyk7CisJCXJldHVybiAwOworCX0KKworCWJ0cmZzX3N0YXJ0X2RlbGFsbG9jX2lub2Rlcyhyb290KTsKKwlidHJmc193YWl0X29yZGVyZWRfZXh0ZW50cyhyb290LCAwKTsKKworCWJ0cmZzX2NsZWFuX29sZF9zbmFwc2hvdHMocm9vdCk7CisJdHJhbnMgPSBidHJmc19zdGFydF90cmFuc2FjdGlvbihyb290LCAxKTsKKwlyZXQgPSBidHJmc19jb21taXRfdHJhbnNhY3Rpb24odHJhbnMsIHJvb3QpOworCXNiLT5zX2RpcnQgPSAwOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGJ0cmZzX3dyaXRlX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJc2ItPnNfZGlydCA9IDA7Cit9CisKK3N0YXRpYyBpbnQgYnRyZnNfdGVzdF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGJ0cmZzX2ZzX2RldmljZXMgKnRlc3RfZnNfZGV2aWNlcyA9IGRhdGE7CisJc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QgPSBidHJmc19zYihzKTsKKworCXJldHVybiByb290LT5mc19pbmZvLT5mc19kZXZpY2VzID09IHRlc3RfZnNfZGV2aWNlczsKK30KKworLyoKKyAqIEZpbmQgYSBzdXBlcmJsb2NrIGZvciB0aGUgZ2l2ZW4gZGV2aWNlIC8gbW91bnQgcG9pbnQuCisgKgorICogTm90ZTogIFRoaXMgaXMgYmFzZWQgb24gZ2V0X3NiX2JkZXYgZnJvbSBmcy9zdXBlci5jIHdpdGggYSBmZXcgYWRkaXRpb25zCisgKgkgIGZvciBtdWx0aXBsZSBkZXZpY2Ugc2V0dXAuICBNYWtlIHN1cmUgdG8ga2VlcCBpdCBpbiBzeW5jLgorICovCitzdGF0aWMgaW50IGJ0cmZzX2dldF9zYihzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZnNfdHlwZSwgaW50IGZsYWdzLAorCQljb25zdCBjaGFyICpkZXZfbmFtZSwgdm9pZCAqZGF0YSwgc3RydWN0IHZmc21vdW50ICptbnQpCit7CisJY2hhciAqc3Vidm9sX25hbWUgPSBOVUxMOworCXN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYgPSBOVUxMOworCXN0cnVjdCBzdXBlcl9ibG9jayAqczsKKwlzdHJ1Y3QgZGVudHJ5ICpyb290OworCXN0cnVjdCBidHJmc19mc19kZXZpY2VzICpmc19kZXZpY2VzID0gTlVMTDsKKwlmbW9kZV90IG1vZGUgPSBGTU9ERV9SRUFEOworCWludCBlcnJvciA9IDA7CisKKwlpZiAoIShmbGFncyAmIE1TX1JET05MWSkpCisJCW1vZGUgfD0gRk1PREVfV1JJVEU7CisKKwllcnJvciA9IGJ0cmZzX3BhcnNlX2Vhcmx5X29wdGlvbnMoZGF0YSwgbW9kZSwgZnNfdHlwZSwKKwkJCQkJICAmc3Vidm9sX25hbWUsICZmc19kZXZpY2VzKTsKKwlpZiAoZXJyb3IpCisJCXJldHVybiBlcnJvcjsKKworCWVycm9yID0gYnRyZnNfc2Nhbl9vbmVfZGV2aWNlKGRldl9uYW1lLCBtb2RlLCBmc190eXBlLCAmZnNfZGV2aWNlcyk7CisJaWYgKGVycm9yKQorCQlnb3RvIGVycm9yX2ZyZWVfc3Vidm9sX25hbWU7CisKKwllcnJvciA9IGJ0cmZzX29wZW5fZGV2aWNlcyhmc19kZXZpY2VzLCBtb2RlLCBmc190eXBlKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gZXJyb3JfZnJlZV9zdWJ2b2xfbmFtZTsKKworCWlmICghKGZsYWdzICYgTVNfUkRPTkxZKSAmJiBmc19kZXZpY2VzLT5yd19kZXZpY2VzID09IDApIHsKKwkJZXJyb3IgPSAtRUFDQ0VTOworCQlnb3RvIGVycm9yX2Nsb3NlX2RldmljZXM7CisJfQorCisJYmRldiA9IGZzX2RldmljZXMtPmxhdGVzdF9iZGV2OworCXMgPSBzZ2V0KGZzX3R5cGUsIGJ0cmZzX3Rlc3Rfc3VwZXIsIHNldF9hbm9uX3N1cGVyLCBmc19kZXZpY2VzKTsKKwlpZiAoSVNfRVJSKHMpKQorCQlnb3RvIGVycm9yX3M7CisKKwlpZiAocy0+c19yb290KSB7CisJCWlmICgoZmxhZ3MgXiBzLT5zX2ZsYWdzKSAmIE1TX1JET05MWSkgeworCQkJdXBfd3JpdGUoJnMtPnNfdW1vdW50KTsKKwkJCWRlYWN0aXZhdGVfc3VwZXIocyk7CisJCQllcnJvciA9IC1FQlVTWTsKKwkJCWdvdG8gZXJyb3JfY2xvc2VfZGV2aWNlczsKKwkJfQorCisJCWJ0cmZzX2Nsb3NlX2RldmljZXMoZnNfZGV2aWNlcyk7CisJfSBlbHNlIHsKKwkJY2hhciBiW0JERVZOQU1FX1NJWkVdOworCisJCXMtPnNfZmxhZ3MgPSBmbGFnczsKKwkJc3RybGNweShzLT5zX2lkLCBiZGV2bmFtZShiZGV2LCBiKSwgc2l6ZW9mKHMtPnNfaWQpKTsKKwkJZXJyb3IgPSBidHJmc19maWxsX3N1cGVyKHMsIGZzX2RldmljZXMsIGRhdGEsCisJCQkJCSBmbGFncyAmIE1TX1NJTEVOVCA/IDEgOiAwKTsKKwkJaWYgKGVycm9yKSB7CisJCQl1cF93cml0ZSgmcy0+c191bW91bnQpOworCQkJZGVhY3RpdmF0ZV9zdXBlcihzKTsKKwkJCWdvdG8gZXJyb3JfZnJlZV9zdWJ2b2xfbmFtZTsKKwkJfQorCisJCWJ0cmZzX3NiKHMpLT5mc19pbmZvLT5iZGV2X2hvbGRlciA9IGZzX3R5cGU7CisJCXMtPnNfZmxhZ3MgfD0gTVNfQUNUSVZFOworCX0KKworCWlmICghc3RyY21wKHN1YnZvbF9uYW1lLCAiLiIpKQorCQlyb290ID0gZGdldChzLT5zX3Jvb3QpOworCWVsc2UgeworCQltdXRleF9sb2NrKCZzLT5zX3Jvb3QtPmRfaW5vZGUtPmlfbXV0ZXgpOworCQlyb290ID0gbG9va3VwX29uZV9sZW4oc3Vidm9sX25hbWUsIHMtPnNfcm9vdCwKKwkJCQkgICAgICBzdHJsZW4oc3Vidm9sX25hbWUpKTsKKwkJbXV0ZXhfdW5sb2NrKCZzLT5zX3Jvb3QtPmRfaW5vZGUtPmlfbXV0ZXgpOworCisJCWlmIChJU19FUlIocm9vdCkpIHsKKwkJCXVwX3dyaXRlKCZzLT5zX3Vtb3VudCk7CisJCQlkZWFjdGl2YXRlX3N1cGVyKHMpOworCQkJZXJyb3IgPSBQVFJfRVJSKHJvb3QpOworCQkJZ290byBlcnJvcl9mcmVlX3N1YnZvbF9uYW1lOworCQl9CisJCWlmICghcm9vdC0+ZF9pbm9kZSkgeworCQkJZHB1dChyb290KTsKKwkJCXVwX3dyaXRlKCZzLT5zX3Vtb3VudCk7CisJCQlkZWFjdGl2YXRlX3N1cGVyKHMpOworCQkJZXJyb3IgPSAtRU5YSU87CisJCQlnb3RvIGVycm9yX2ZyZWVfc3Vidm9sX25hbWU7CisJCX0KKwl9CisKKwltbnQtPm1udF9zYiA9IHM7CisJbW50LT5tbnRfcm9vdCA9IHJvb3Q7CisKKwlrZnJlZShzdWJ2b2xfbmFtZSk7CisJcmV0dXJuIDA7CisKK2Vycm9yX3M6CisJZXJyb3IgPSBQVFJfRVJSKHMpOworZXJyb3JfY2xvc2VfZGV2aWNlczoKKwlidHJmc19jbG9zZV9kZXZpY2VzKGZzX2RldmljZXMpOworZXJyb3JfZnJlZV9zdWJ2b2xfbmFtZToKKwlrZnJlZShzdWJ2b2xfbmFtZSk7CisJcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgaW50IGJ0cmZzX3JlbW91bnQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50ICpmbGFncywgY2hhciAqZGF0YSkKK3sKKwlzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCA9IGJ0cmZzX3NiKHNiKTsKKwlpbnQgcmV0OworCisJaWYgKCgqZmxhZ3MgJiBNU19SRE9OTFkpID09IChzYi0+c19mbGFncyAmIE1TX1JET05MWSkpCisJCXJldHVybiAwOworCisJaWYgKCpmbGFncyAmIE1TX1JET05MWSkgeworCQlzYi0+c19mbGFncyB8PSBNU19SRE9OTFk7CisKKwkJcmV0ID0gIGJ0cmZzX2NvbW1pdF9zdXBlcihyb290KTsKKwkJV0FSTl9PTihyZXQpOworCX0gZWxzZSB7CisJCWlmIChyb290LT5mc19pbmZvLT5mc19kZXZpY2VzLT5yd19kZXZpY2VzID09IDApCisJCQlyZXR1cm4gLUVBQ0NFUzsKKworCQlpZiAoYnRyZnNfc3VwZXJfbG9nX3Jvb3QoJnJvb3QtPmZzX2luZm8tPnN1cGVyX2NvcHkpICE9IDApCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlyZXQgPSBidHJmc19jbGVhbnVwX3JlbG9jX3RyZWVzKHJvb3QpOworCQlXQVJOX09OKHJldCk7CisKKwkJcmV0ID0gYnRyZnNfY2xlYW51cF9mc19yb290cyhyb290LT5mc19pbmZvKTsKKwkJV0FSTl9PTihyZXQpOworCisJCXNiLT5zX2ZsYWdzICY9IH5NU19SRE9OTFk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYnRyZnNfc3RhdGZzKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGtzdGF0ZnMgKmJ1ZikKK3sKKwlzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCA9IGJ0cmZzX3NiKGRlbnRyeS0+ZF9zYik7CisJc3RydWN0IGJ0cmZzX3N1cGVyX2Jsb2NrICpkaXNrX3N1cGVyID0gJnJvb3QtPmZzX2luZm8tPnN1cGVyX2NvcHk7CisJaW50IGJpdHMgPSBkZW50cnktPmRfc2ItPnNfYmxvY2tzaXplX2JpdHM7CisJX19iZTMyICpmc2lkID0gKF9fYmUzMiAqKXJvb3QtPmZzX2luZm8tPmZzaWQ7CisKKwlidWYtPmZfbmFtZWxlbiA9IEJUUkZTX05BTUVfTEVOOworCWJ1Zi0+Zl9ibG9ja3MgPSBidHJmc19zdXBlcl90b3RhbF9ieXRlcyhkaXNrX3N1cGVyKSA+PiBiaXRzOworCWJ1Zi0+Zl9iZnJlZSA9IGJ1Zi0+Zl9ibG9ja3MgLQorCQkoYnRyZnNfc3VwZXJfYnl0ZXNfdXNlZChkaXNrX3N1cGVyKSA+PiBiaXRzKTsKKwlidWYtPmZfYmF2YWlsID0gYnVmLT5mX2JmcmVlOworCWJ1Zi0+Zl9ic2l6ZSA9IGRlbnRyeS0+ZF9zYi0+c19ibG9ja3NpemU7CisJYnVmLT5mX3R5cGUgPSBCVFJGU19TVVBFUl9NQUdJQzsKKworCS8qIFdlIHRyZWF0IGl0IGFzIGNvbnN0YW50IGVuZGlhbm5lc3MgKGl0IGRvZXNuJ3QgbWF0dGVyIF93aGljaF8pCisJICAgYmVjYXVzZSB3ZSB3YW50IHRoZSBmc2lkIHRvIGNvbWUgb3V0IHRoZSBzYW1lIHdoZXRoZXIgbW91bnRlZAorCSAgIG9uIGEgYmlnLWVuZGlhbiBvciBsaXR0bGUtZW5kaWFuIGhvc3QgKi8KKwlidWYtPmZfZnNpZC52YWxbMF0gPSBiZTMyX3RvX2NwdShmc2lkWzBdKSBeIGJlMzJfdG9fY3B1KGZzaWRbMl0pOworCWJ1Zi0+Zl9mc2lkLnZhbFsxXSA9IGJlMzJfdG9fY3B1KGZzaWRbMV0pIF4gYmUzMl90b19jcHUoZnNpZFszXSk7CisJLyogTWFzayBpbiB0aGUgcm9vdCBvYmplY3QgSUQgdG9vLCB0byBkaXNhbWJpZ3VhdGUgc3Vidm9scyAqLworCWJ1Zi0+Zl9mc2lkLnZhbFswXSBePSBCVFJGU19JKGRlbnRyeS0+ZF9pbm9kZSktPnJvb3QtPm9iamVjdGlkID4+IDMyOworCWJ1Zi0+Zl9mc2lkLnZhbFsxXSBePSBCVFJGU19JKGRlbnRyeS0+ZF9pbm9kZSktPnJvb3QtPm9iamVjdGlkOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSBidHJmc19mc190eXBlID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkubmFtZQkJPSAiYnRyZnMiLAorCS5nZXRfc2IJCT0gYnRyZnNfZ2V0X3NiLAorCS5raWxsX3NiCT0ga2lsbF9hbm9uX3N1cGVyLAorCS5mc19mbGFncwk9IEZTX1JFUVVJUkVTX0RFViwKK307CisKKy8qCisgKiB1c2VkIGJ5IGJ0cmZzY3RsIHRvIHNjYW4gZGV2aWNlcyB3aGVuIG5vIEZTIGlzIG1vdW50ZWQKKyAqLworc3RhdGljIGxvbmcgYnRyZnNfY29udHJvbF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKKwkJCQl1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgYnRyZnNfaW9jdGxfdm9sX2FyZ3MgKnZvbDsKKwlzdHJ1Y3QgYnRyZnNfZnNfZGV2aWNlcyAqZnNfZGV2aWNlczsKKwlpbnQgcmV0ID0gLUVOT1RUWTsKKwlpbnQgbGVuOworCisJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQorCQlyZXR1cm4gLUVQRVJNOworCisJdm9sID0ga21hbGxvYyhzaXplb2YoKnZvbCksIEdGUF9LRVJORUwpOworCWlmIChjb3B5X2Zyb21fdXNlcih2b2wsICh2b2lkIF9fdXNlciAqKWFyZywgc2l6ZW9mKCp2b2wpKSkgeworCQlyZXQgPSAtRUZBVUxUOworCQlnb3RvIG91dDsKKwl9CisJbGVuID0gc3Rybmxlbih2b2wtPm5hbWUsIEJUUkZTX1BBVEhfTkFNRV9NQVgpOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIEJUUkZTX0lPQ19TQ0FOX0RFVjoKKwkJcmV0ID0gYnRyZnNfc2Nhbl9vbmVfZGV2aWNlKHZvbC0+bmFtZSwgRk1PREVfUkVBRCwKKwkJCQkJICAgICZidHJmc19mc190eXBlLCAmZnNfZGV2aWNlcyk7CisJCWJyZWFrOworCX0KK291dDoKKwlrZnJlZSh2b2wpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYnRyZnNfZnJlZXplKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QgPSBidHJmc19zYihzYik7CisJbXV0ZXhfbG9jaygmcm9vdC0+ZnNfaW5mby0+dHJhbnNhY3Rpb25fa3RocmVhZF9tdXRleCk7CisJbXV0ZXhfbG9jaygmcm9vdC0+ZnNfaW5mby0+Y2xlYW5lcl9tdXRleCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYnRyZnNfdW5mcmVlemUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCA9IGJ0cmZzX3NiKHNiKTsKKwltdXRleF91bmxvY2soJnJvb3QtPmZzX2luZm8tPmNsZWFuZXJfbXV0ZXgpOworCW11dGV4X3VubG9jaygmcm9vdC0+ZnNfaW5mby0+dHJhbnNhY3Rpb25fa3RocmVhZF9tdXRleCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3VwZXJfb3BlcmF0aW9ucyBidHJmc19zdXBlcl9vcHMgPSB7CisJLmRlbGV0ZV9pbm9kZQk9IGJ0cmZzX2RlbGV0ZV9pbm9kZSwKKwkucHV0X3N1cGVyCT0gYnRyZnNfcHV0X3N1cGVyLAorCS53cml0ZV9zdXBlcgk9IGJ0cmZzX3dyaXRlX3N1cGVyLAorCS5zeW5jX2ZzCT0gYnRyZnNfc3luY19mcywKKwkuc2hvd19vcHRpb25zCT0gZ2VuZXJpY19zaG93X29wdGlvbnMsCisJLndyaXRlX2lub2RlCT0gYnRyZnNfd3JpdGVfaW5vZGUsCisJLmRpcnR5X2lub2RlCT0gYnRyZnNfZGlydHlfaW5vZGUsCisJLmFsbG9jX2lub2RlCT0gYnRyZnNfYWxsb2NfaW5vZGUsCisJLmRlc3Ryb3lfaW5vZGUJPSBidHJmc19kZXN0cm95X2lub2RlLAorCS5zdGF0ZnMJCT0gYnRyZnNfc3RhdGZzLAorCS5yZW1vdW50X2ZzCT0gYnRyZnNfcmVtb3VudCwKKwkuZnJlZXplX2ZzCT0gYnRyZnNfZnJlZXplLAorCS51bmZyZWV6ZV9mcwk9IGJ0cmZzX3VuZnJlZXplLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYnRyZnNfY3RsX2ZvcHMgPSB7CisJLnVubG9ja2VkX2lvY3RsCSA9IGJ0cmZzX2NvbnRyb2xfaW9jdGwsCisJLmNvbXBhdF9pb2N0bCA9IGJ0cmZzX2NvbnRyb2xfaW9jdGwsCisJLm93bmVyCSA9IFRISVNfTU9EVUxFLAorfTsKKworc3RhdGljIHN0cnVjdCBtaXNjZGV2aWNlIGJ0cmZzX21pc2MgPSB7CisJLm1pbm9yCQk9IE1JU0NfRFlOQU1JQ19NSU5PUiwKKwkubmFtZQkJPSAiYnRyZnMtY29udHJvbCIsCisJLmZvcHMJCT0gJmJ0cmZzX2N0bF9mb3BzCit9OworCitzdGF0aWMgaW50IGJ0cmZzX2ludGVyZmFjZV9pbml0KHZvaWQpCit7CisJcmV0dXJuIG1pc2NfcmVnaXN0ZXIoJmJ0cmZzX21pc2MpOworfQorCitzdGF0aWMgdm9pZCBidHJmc19pbnRlcmZhY2VfZXhpdCh2b2lkKQoreworCWlmIChtaXNjX2RlcmVnaXN0ZXIoJmJ0cmZzX21pc2MpIDwgMCkKKwkJcHJpbnRrKEtFUk5fSU5GTyAibWlzY19kZXJlZ2lzdGVyIGZhaWxlZCBmb3IgY29udHJvbCBkZXZpY2UiKTsKK30KKworc3RhdGljIGludCBfX2luaXQgaW5pdF9idHJmc19mcyh2b2lkKQoreworCWludCBlcnI7CisKKwllcnIgPSBidHJmc19pbml0X3N5c2ZzKCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCWVyciA9IGJ0cmZzX2luaXRfY2FjaGVwKCk7CisJaWYgKGVycikKKwkJZ290byBmcmVlX3N5c2ZzOworCisJZXJyID0gZXh0ZW50X2lvX2luaXQoKTsKKwlpZiAoZXJyKQorCQlnb3RvIGZyZWVfY2FjaGVwOworCisJZXJyID0gZXh0ZW50X21hcF9pbml0KCk7CisJaWYgKGVycikKKwkJZ290byBmcmVlX2V4dGVudF9pbzsKKworCWVyciA9IGJ0cmZzX2ludGVyZmFjZV9pbml0KCk7CisJaWYgKGVycikKKwkJZ290byBmcmVlX2V4dGVudF9tYXA7CisKKwllcnIgPSByZWdpc3Rlcl9maWxlc3lzdGVtKCZidHJmc19mc190eXBlKTsKKwlpZiAoZXJyKQorCQlnb3RvIHVucmVnaXN0ZXJfaW9jdGw7CisKKwlwcmludGsoS0VSTl9JTkZPICIlcyBsb2FkZWRcbiIsIEJUUkZTX0JVSUxEX1ZFUlNJT04pOworCXJldHVybiAwOworCit1bnJlZ2lzdGVyX2lvY3RsOgorCWJ0cmZzX2ludGVyZmFjZV9leGl0KCk7CitmcmVlX2V4dGVudF9tYXA6CisJZXh0ZW50X21hcF9leGl0KCk7CitmcmVlX2V4dGVudF9pbzoKKwlleHRlbnRfaW9fZXhpdCgpOworZnJlZV9jYWNoZXA6CisJYnRyZnNfZGVzdHJveV9jYWNoZXAoKTsKK2ZyZWVfc3lzZnM6CisJYnRyZnNfZXhpdF9zeXNmcygpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBleGl0X2J0cmZzX2ZzKHZvaWQpCit7CisJYnRyZnNfZGVzdHJveV9jYWNoZXAoKTsKKwlleHRlbnRfbWFwX2V4aXQoKTsKKwlleHRlbnRfaW9fZXhpdCgpOworCWJ0cmZzX2ludGVyZmFjZV9leGl0KCk7CisJdW5yZWdpc3Rlcl9maWxlc3lzdGVtKCZidHJmc19mc190eXBlKTsKKwlidHJmc19leGl0X3N5c2ZzKCk7CisJYnRyZnNfY2xlYW51cF9mc191dWlkcygpOworCWJ0cmZzX3psaWJfZXhpdCgpOworfQorCittb2R1bGVfaW5pdChpbml0X2J0cmZzX2ZzKQorbW9kdWxlX2V4aXQoZXhpdF9idHJmc19mcykKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZnMvYnRyZnMvc3lzZnMuYyBiL2ZzL2J0cmZzL3N5c2ZzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTI0MGI2ZgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2J0cmZzL3N5c2ZzLmMKQEAgLTAsMCArMSwyNjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgT3JhY2xlLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgdjIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKKyAqIEJvc3RvbiwgTUEgMDIxMTEwLTEzMDcsIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+CisjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rb2JqZWN0Lmg+CisKKyNpbmNsdWRlICJjdHJlZS5oIgorI2luY2x1ZGUgImRpc2staW8uaCIKKyNpbmNsdWRlICJ0cmFuc2FjdGlvbi5oIgorCitzdGF0aWMgc3NpemVfdCByb290X2Jsb2Nrc191c2VkX3Nob3coc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsIGNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlbGx1XG4iLAorCQkodW5zaWduZWQgbG9uZyBsb25nKWJ0cmZzX3Jvb3RfdXNlZCgmcm9vdC0+cm9vdF9pdGVtKSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHJvb3RfYmxvY2tfbGltaXRfc2hvdyhzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwgY2hhciAqYnVmKQoreworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVsbHVcbiIsCisJCSh1bnNpZ25lZCBsb25nIGxvbmcpYnRyZnNfcm9vdF9saW1pdCgmcm9vdC0+cm9vdF9pdGVtKSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHN1cGVyX2Jsb2Nrc191c2VkX3Nob3coc3RydWN0IGJ0cmZzX2ZzX2luZm8gKmZzLCBjaGFyICpidWYpCit7CisKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlbGx1XG4iLAorCQkodW5zaWduZWQgbG9uZyBsb25nKWJ0cmZzX3N1cGVyX2J5dGVzX3VzZWQoJmZzLT5zdXBlcl9jb3B5KSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHN1cGVyX3RvdGFsX2Jsb2Nrc19zaG93KHN0cnVjdCBidHJmc19mc19pbmZvICpmcywgY2hhciAqYnVmKQoreworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVsbHVcbiIsCisJCSh1bnNpZ25lZCBsb25nIGxvbmcpYnRyZnNfc3VwZXJfdG90YWxfYnl0ZXMoJmZzLT5zdXBlcl9jb3B5KSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHN1cGVyX2Jsb2Nrc2l6ZV9zaG93KHN0cnVjdCBidHJmc19mc19pbmZvICpmcywgY2hhciAqYnVmKQoreworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVsbHVcbiIsCisJCSh1bnNpZ25lZCBsb25nIGxvbmcpYnRyZnNfc3VwZXJfc2VjdG9yc2l6ZSgmZnMtPnN1cGVyX2NvcHkpKTsKK30KKworLyogdGhpcyBpcyBmb3Igcm9vdCBhdHRycyAoc3Vidm9scy9zbmFwc2hvdHMpICovCitzdHJ1Y3QgYnRyZnNfcm9vdF9hdHRyIHsKKwlzdHJ1Y3QgYXR0cmlidXRlIGF0dHI7CisJc3NpemVfdCAoKnNob3cpKHN0cnVjdCBidHJmc19yb290ICosIGNoYXIgKik7CisJc3NpemVfdCAoKnN0b3JlKShzdHJ1Y3QgYnRyZnNfcm9vdCAqLCBjb25zdCBjaGFyICosIHNpemVfdCk7Cit9OworCisjZGVmaW5lIFJPT1RfQVRUUihuYW1lLCBtb2RlLCBzaG93LCBzdG9yZSkgXAorc3RhdGljIHN0cnVjdCBidHJmc19yb290X2F0dHIgYnRyZnNfcm9vdF9hdHRyXyMjbmFtZSA9IF9fQVRUUihuYW1lLCBtb2RlLCBcCisJCQkJCQkJICAgICAgc2hvdywgc3RvcmUpCisKK1JPT1RfQVRUUihibG9ja3NfdXNlZCwJMDQ0NCwJcm9vdF9ibG9ja3NfdXNlZF9zaG93LAlOVUxMKTsKK1JPT1RfQVRUUihibG9ja19saW1pdCwJMDY0NCwJcm9vdF9ibG9ja19saW1pdF9zaG93LAlOVUxMKTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmJ0cmZzX3Jvb3RfYXR0cnNbXSA9IHsKKwkmYnRyZnNfcm9vdF9hdHRyX2Jsb2Nrc191c2VkLmF0dHIsCisJJmJ0cmZzX3Jvb3RfYXR0cl9ibG9ja19saW1pdC5hdHRyLAorCU5VTEwsCit9OworCisvKiB0aGlzIGlzIGZvciBzdXBlciBhdHRycyAoYWN0dWFsIGZ1bGwgZnMpICovCitzdHJ1Y3QgYnRyZnNfc3VwZXJfYXR0ciB7CisJc3RydWN0IGF0dHJpYnV0ZSBhdHRyOworCXNzaXplX3QgKCpzaG93KShzdHJ1Y3QgYnRyZnNfZnNfaW5mbyAqLCBjaGFyICopOworCXNzaXplX3QgKCpzdG9yZSkoc3RydWN0IGJ0cmZzX2ZzX2luZm8gKiwgY29uc3QgY2hhciAqLCBzaXplX3QpOworfTsKKworI2RlZmluZSBTVVBFUl9BVFRSKG5hbWUsIG1vZGUsIHNob3csIHN0b3JlKSBcCitzdGF0aWMgc3RydWN0IGJ0cmZzX3N1cGVyX2F0dHIgYnRyZnNfc3VwZXJfYXR0cl8jI25hbWUgPSBfX0FUVFIobmFtZSwgbW9kZSwgXAorCQkJCQkJCQlzaG93LCBzdG9yZSkKKworU1VQRVJfQVRUUihibG9ja3NfdXNlZCwJCTA0NDQsCXN1cGVyX2Jsb2Nrc191c2VkX3Nob3csCQlOVUxMKTsKK1NVUEVSX0FUVFIodG90YWxfYmxvY2tzLAkwNDQ0LAlzdXBlcl90b3RhbF9ibG9ja3Nfc2hvdywJTlVMTCk7CitTVVBFUl9BVFRSKGJsb2Nrc2l6ZSwJCTA0NDQsCXN1cGVyX2Jsb2Nrc2l6ZV9zaG93LAkJTlVMTCk7CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpidHJmc19zdXBlcl9hdHRyc1tdID0geworCSZidHJmc19zdXBlcl9hdHRyX2Jsb2Nrc191c2VkLmF0dHIsCisJJmJ0cmZzX3N1cGVyX2F0dHJfdG90YWxfYmxvY2tzLmF0dHIsCisJJmJ0cmZzX3N1cGVyX2F0dHJfYmxvY2tzaXplLmF0dHIsCisJTlVMTCwKK307CisKK3N0YXRpYyBzc2l6ZV90IGJ0cmZzX3N1cGVyX2F0dHJfc2hvdyhzdHJ1Y3Qga29iamVjdCAqa29iaiwKKwkJCQkgICAgc3RydWN0IGF0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBidHJmc19mc19pbmZvICpmcyA9IGNvbnRhaW5lcl9vZihrb2JqLCBzdHJ1Y3QgYnRyZnNfZnNfaW5mbywKKwkJCQkJCXN1cGVyX2tvYmopOworCXN0cnVjdCBidHJmc19zdXBlcl9hdHRyICphID0gY29udGFpbmVyX29mKGF0dHIsCisJCQkJCQkgIHN0cnVjdCBidHJmc19zdXBlcl9hdHRyLAorCQkJCQkJICBhdHRyKTsKKworCXJldHVybiBhLT5zaG93ID8gYS0+c2hvdyhmcywgYnVmKSA6IDA7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGJ0cmZzX3N1cGVyX2F0dHJfc3RvcmUoc3RydWN0IGtvYmplY3QgKmtvYmosCisJCQkJICAgICBzdHJ1Y3QgYXR0cmlidXRlICphdHRyLAorCQkJCSAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgbGVuKQoreworCXN0cnVjdCBidHJmc19mc19pbmZvICpmcyA9IGNvbnRhaW5lcl9vZihrb2JqLCBzdHJ1Y3QgYnRyZnNfZnNfaW5mbywKKwkJCQkJCXN1cGVyX2tvYmopOworCXN0cnVjdCBidHJmc19zdXBlcl9hdHRyICphID0gY29udGFpbmVyX29mKGF0dHIsCisJCQkJCQkgIHN0cnVjdCBidHJmc19zdXBlcl9hdHRyLAorCQkJCQkJICBhdHRyKTsKKworCXJldHVybiBhLT5zdG9yZSA/IGEtPnN0b3JlKGZzLCBidWYsIGxlbikgOiAwOworfQorCitzdGF0aWMgc3NpemVfdCBidHJmc19yb290X2F0dHJfc2hvdyhzdHJ1Y3Qga29iamVjdCAqa29iaiwKKwkJCQkgICAgc3RydWN0IGF0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBidHJmc19yb290ICpyb290ID0gY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBidHJmc19yb290LAorCQkJCQkJcm9vdF9rb2JqKTsKKwlzdHJ1Y3QgYnRyZnNfcm9vdF9hdHRyICphID0gY29udGFpbmVyX29mKGF0dHIsCisJCQkJCQkgc3RydWN0IGJ0cmZzX3Jvb3RfYXR0ciwKKwkJCQkJCSBhdHRyKTsKKworCXJldHVybiBhLT5zaG93ID8gYS0+c2hvdyhyb290LCBidWYpIDogMDsKK30KKworc3RhdGljIHNzaXplX3QgYnRyZnNfcm9vdF9hdHRyX3N0b3JlKHN0cnVjdCBrb2JqZWN0ICprb2JqLAorCQkJCSAgICAgc3RydWN0IGF0dHJpYnV0ZSAqYXR0ciwKKwkJCQkgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCA9IGNvbnRhaW5lcl9vZihrb2JqLCBzdHJ1Y3QgYnRyZnNfcm9vdCwKKwkJCQkJCXJvb3Rfa29iaik7CisJc3RydWN0IGJ0cmZzX3Jvb3RfYXR0ciAqYSA9IGNvbnRhaW5lcl9vZihhdHRyLAorCQkJCQkJIHN0cnVjdCBidHJmc19yb290X2F0dHIsCisJCQkJCQkgYXR0cik7CisJcmV0dXJuIGEtPnN0b3JlID8gYS0+c3RvcmUocm9vdCwgYnVmLCBsZW4pIDogMDsKK30KKworc3RhdGljIHZvaWQgYnRyZnNfc3VwZXJfcmVsZWFzZShzdHJ1Y3Qga29iamVjdCAqa29iaikKK3sKKwlzdHJ1Y3QgYnRyZnNfZnNfaW5mbyAqZnMgPSBjb250YWluZXJfb2Yoa29iaiwgc3RydWN0IGJ0cmZzX2ZzX2luZm8sCisJCQkJCQlzdXBlcl9rb2JqKTsKKwljb21wbGV0ZSgmZnMtPmtvYmpfdW5yZWdpc3Rlcik7Cit9CisKK3N0YXRpYyB2b2lkIGJ0cmZzX3Jvb3RfcmVsZWFzZShzdHJ1Y3Qga29iamVjdCAqa29iaikKK3sKKwlzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCA9IGNvbnRhaW5lcl9vZihrb2JqLCBzdHJ1Y3QgYnRyZnNfcm9vdCwKKwkJCQkJCXJvb3Rfa29iaik7CisJY29tcGxldGUoJnJvb3QtPmtvYmpfdW5yZWdpc3Rlcik7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3lzZnNfb3BzIGJ0cmZzX3N1cGVyX2F0dHJfb3BzID0geworCS5zaG93CT0gYnRyZnNfc3VwZXJfYXR0cl9zaG93LAorCS5zdG9yZQk9IGJ0cmZzX3N1cGVyX2F0dHJfc3RvcmUsCit9OworCitzdGF0aWMgc3RydWN0IHN5c2ZzX29wcyBidHJmc19yb290X2F0dHJfb3BzID0geworCS5zaG93CT0gYnRyZnNfcm9vdF9hdHRyX3Nob3csCisJLnN0b3JlCT0gYnRyZnNfcm9vdF9hdHRyX3N0b3JlLAorfTsKKworc3RhdGljIHN0cnVjdCBrb2JqX3R5cGUgYnRyZnNfcm9vdF9rdHlwZSA9IHsKKwkuZGVmYXVsdF9hdHRycwk9IGJ0cmZzX3Jvb3RfYXR0cnMsCisJLnN5c2ZzX29wcwk9ICZidHJmc19yb290X2F0dHJfb3BzLAorCS5yZWxlYXNlCT0gYnRyZnNfcm9vdF9yZWxlYXNlLAorfTsKKworc3RhdGljIHN0cnVjdCBrb2JqX3R5cGUgYnRyZnNfc3VwZXJfa3R5cGUgPSB7CisJLmRlZmF1bHRfYXR0cnMJPSBidHJmc19zdXBlcl9hdHRycywKKwkuc3lzZnNfb3BzCT0gJmJ0cmZzX3N1cGVyX2F0dHJfb3BzLAorCS5yZWxlYXNlCT0gYnRyZnNfc3VwZXJfcmVsZWFzZSwKK307CisKKy8qIC9zeXMvZnMvYnRyZnMvIGVudHJ5ICovCitzdGF0aWMgc3RydWN0IGtzZXQgKmJ0cmZzX2tzZXQ7CisKK2ludCBidHJmc19zeXNmc19hZGRfc3VwZXIoc3RydWN0IGJ0cmZzX2ZzX2luZm8gKmZzKQoreworCWludCBlcnJvcjsKKwljaGFyICpuYW1lOworCWNoYXIgYzsKKwlpbnQgbGVuID0gc3RybGVuKGZzLT5zYi0+c19pZCkgKyAxOworCWludCBpOworCisJbmFtZSA9IGttYWxsb2MobGVuLCBHRlBfTk9GUyk7CisJaWYgKCFuYW1lKSB7CisJCWVycm9yID0gLUVOT01FTTsKKwkJZ290byBmYWlsOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworCQljID0gZnMtPnNiLT5zX2lkW2ldOworCQlpZiAoYyA9PSAnLycgfHwgYyA9PSAnXFwnKQorCQkJYyA9ICchJzsKKwkJbmFtZVtpXSA9IGM7CisJfQorCW5hbWVbbGVuXSA9ICdcMCc7CisKKwlmcy0+c3VwZXJfa29iai5rc2V0ID0gYnRyZnNfa3NldDsKKwllcnJvciA9IGtvYmplY3RfaW5pdF9hbmRfYWRkKCZmcy0+c3VwZXJfa29iaiwgJmJ0cmZzX3N1cGVyX2t0eXBlLAorCQkJCSAgICAgTlVMTCwgIiVzIiwgbmFtZSk7CisJa2ZyZWUobmFtZSk7CisJaWYgKGVycm9yKQorCQlnb3RvIGZhaWw7CisKKwlyZXR1cm4gMDsKKworZmFpbDoKKwlwcmludGsoS0VSTl9FUlIgImJ0cmZzOiBzeXNmcyBjcmVhdGlvbiBmb3Igc3VwZXIgZmFpbGVkXG4iKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKK2ludCBidHJmc19zeXNmc19hZGRfcm9vdChzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCkKK3sKKwlpbnQgZXJyb3I7CisKKwllcnJvciA9IGtvYmplY3RfaW5pdF9hbmRfYWRkKCZyb290LT5yb290X2tvYmosICZidHJmc19yb290X2t0eXBlLAorCQkJCSAgICAgJnJvb3QtPmZzX2luZm8tPnN1cGVyX2tvYmosCisJCQkJICAgICAiJXMiLCByb290LT5uYW1lKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gZmFpbDsKKworCXJldHVybiAwOworCitmYWlsOgorCXByaW50ayhLRVJOX0VSUiAiYnRyZnM6IHN5c2ZzIGNyZWF0aW9uIGZvciByb290IGZhaWxlZFxuIik7CisJcmV0dXJuIGVycm9yOworfQorCit2b2lkIGJ0cmZzX3N5c2ZzX2RlbF9yb290KHN0cnVjdCBidHJmc19yb290ICpyb290KQoreworCWtvYmplY3RfcHV0KCZyb290LT5yb290X2tvYmopOworCXdhaXRfZm9yX2NvbXBsZXRpb24oJnJvb3QtPmtvYmpfdW5yZWdpc3Rlcik7Cit9CisKK3ZvaWQgYnRyZnNfc3lzZnNfZGVsX3N1cGVyKHN0cnVjdCBidHJmc19mc19pbmZvICpmcykKK3sKKwlrb2JqZWN0X3B1dCgmZnMtPnN1cGVyX2tvYmopOworCXdhaXRfZm9yX2NvbXBsZXRpb24oJmZzLT5rb2JqX3VucmVnaXN0ZXIpOworfQorCitpbnQgYnRyZnNfaW5pdF9zeXNmcyh2b2lkKQoreworCWJ0cmZzX2tzZXQgPSBrc2V0X2NyZWF0ZV9hbmRfYWRkKCJidHJmcyIsIE5VTEwsIGZzX2tvYmopOworCWlmICghYnRyZnNfa3NldCkKKwkJcmV0dXJuIC1FTk9NRU07CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgYnRyZnNfZXhpdF9zeXNmcyh2b2lkKQoreworCWtzZXRfdW5yZWdpc3RlcihidHJmc19rc2V0KTsKK30KKwpkaWZmIC0tZ2l0IGEvZnMvYnRyZnMvdHJhbnNhY3Rpb24uYyBiL2ZzL2J0cmZzL3RyYW5zYWN0aW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGEwOGY5NAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2J0cmZzL3RyYW5zYWN0aW9uLmMKQEAgLTAsMCArMSwxMDk3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE9yYWNsZS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIHYyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCisgKiBCb3N0b24sIE1BIDAyMTExMC0xMzA3LCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC93cml0ZWJhY2suaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSAiY3RyZWUuaCIKKyNpbmNsdWRlICJkaXNrLWlvLmgiCisjaW5jbHVkZSAidHJhbnNhY3Rpb24uaCIKKyNpbmNsdWRlICJsb2NraW5nLmgiCisjaW5jbHVkZSAicmVmLWNhY2hlLmgiCisjaW5jbHVkZSAidHJlZS1sb2cuaCIKKworI2RlZmluZSBCVFJGU19ST09UX1RSQU5TX1RBRyAwCisKK3N0YXRpYyBub2lubGluZSB2b2lkIHB1dF90cmFuc2FjdGlvbihzdHJ1Y3QgYnRyZnNfdHJhbnNhY3Rpb24gKnRyYW5zYWN0aW9uKQoreworCVdBUk5fT04odHJhbnNhY3Rpb24tPnVzZV9jb3VudCA9PSAwKTsKKwl0cmFuc2FjdGlvbi0+dXNlX2NvdW50LS07CisJaWYgKHRyYW5zYWN0aW9uLT51c2VfY291bnQgPT0gMCkgeworCQlsaXN0X2RlbF9pbml0KCZ0cmFuc2FjdGlvbi0+bGlzdCk7CisJCW1lbXNldCh0cmFuc2FjdGlvbiwgMCwgc2l6ZW9mKCp0cmFuc2FjdGlvbikpOworCQlrbWVtX2NhY2hlX2ZyZWUoYnRyZnNfdHJhbnNhY3Rpb25fY2FjaGVwLCB0cmFuc2FjdGlvbik7CisJfQorfQorCisvKgorICogZWl0aGVyIGFsbG9jYXRlIGEgbmV3IHRyYW5zYWN0aW9uIG9yIGhvcCBpbnRvIHRoZSBleGlzdGluZyBvbmUKKyAqLworc3RhdGljIG5vaW5saW5lIGludCBqb2luX3RyYW5zYWN0aW9uKHN0cnVjdCBidHJmc19yb290ICpyb290KQoreworCXN0cnVjdCBidHJmc190cmFuc2FjdGlvbiAqY3VyX3RyYW5zOworCWN1cl90cmFucyA9IHJvb3QtPmZzX2luZm8tPnJ1bm5pbmdfdHJhbnNhY3Rpb247CisJaWYgKCFjdXJfdHJhbnMpIHsKKwkJY3VyX3RyYW5zID0ga21lbV9jYWNoZV9hbGxvYyhidHJmc190cmFuc2FjdGlvbl9jYWNoZXAsCisJCQkJCSAgICAgR0ZQX05PRlMpOworCQlCVUdfT04oIWN1cl90cmFucyk7CisJCXJvb3QtPmZzX2luZm8tPmdlbmVyYXRpb24rKzsKKwkJcm9vdC0+ZnNfaW5mby0+bGFzdF9hbGxvYyA9IDA7CisJCXJvb3QtPmZzX2luZm8tPmxhc3RfZGF0YV9hbGxvYyA9IDA7CisJCWN1cl90cmFucy0+bnVtX3dyaXRlcnMgPSAxOworCQljdXJfdHJhbnMtPm51bV9qb2luZWQgPSAwOworCQljdXJfdHJhbnMtPnRyYW5zaWQgPSByb290LT5mc19pbmZvLT5nZW5lcmF0aW9uOworCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZjdXJfdHJhbnMtPndyaXRlcl93YWl0KTsKKwkJaW5pdF93YWl0cXVldWVfaGVhZCgmY3VyX3RyYW5zLT5jb21taXRfd2FpdCk7CisJCWN1cl90cmFucy0+aW5fY29tbWl0ID0gMDsKKwkJY3VyX3RyYW5zLT5ibG9ja2VkID0gMDsKKwkJY3VyX3RyYW5zLT51c2VfY291bnQgPSAxOworCQljdXJfdHJhbnMtPmNvbW1pdF9kb25lID0gMDsKKwkJY3VyX3RyYW5zLT5zdGFydF90aW1lID0gZ2V0X3NlY29uZHMoKTsKKwkJSU5JVF9MSVNUX0hFQUQoJmN1cl90cmFucy0+cGVuZGluZ19zbmFwc2hvdHMpOworCQlsaXN0X2FkZF90YWlsKCZjdXJfdHJhbnMtPmxpc3QsICZyb290LT5mc19pbmZvLT50cmFuc19saXN0KTsKKwkJZXh0ZW50X2lvX3RyZWVfaW5pdCgmY3VyX3RyYW5zLT5kaXJ0eV9wYWdlcywKKwkJCQkgICAgIHJvb3QtPmZzX2luZm8tPmJ0cmVlX2lub2RlLT5pX21hcHBpbmcsCisJCQkJICAgICBHRlBfTk9GUyk7CisJCXNwaW5fbG9jaygmcm9vdC0+ZnNfaW5mby0+bmV3X3RyYW5zX2xvY2spOworCQlyb290LT5mc19pbmZvLT5ydW5uaW5nX3RyYW5zYWN0aW9uID0gY3VyX3RyYW5zOworCQlzcGluX3VubG9jaygmcm9vdC0+ZnNfaW5mby0+bmV3X3RyYW5zX2xvY2spOworCX0gZWxzZSB7CisJCWN1cl90cmFucy0+bnVtX3dyaXRlcnMrKzsKKwkJY3VyX3RyYW5zLT5udW1fam9pbmVkKys7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiB0aGlzIGRvZXMgYWxsIHRoZSByZWNvcmQga2VlcGluZyByZXF1aXJlZCB0byBtYWtlIHN1cmUgdGhhdCBhIHJlZmVyZW5jZQorICogY291bnRlZCByb290IGlzIHByb3Blcmx5IHJlY29yZGVkIGluIGEgZ2l2ZW4gdHJhbnNhY3Rpb24uICBUaGlzIGlzIHJlcXVpcmVkCisgKiB0byBtYWtlIHN1cmUgdGhlIG9sZCByb290IGZyb20gYmVmb3JlIHdlIGpvaW5lZCB0aGUgdHJhbnNhY3Rpb24gaXMgZGVsZXRlZAorICogd2hlbiB0aGUgdHJhbnNhY3Rpb24gY29tbWl0cworICovCitub2lubGluZSBpbnQgYnRyZnNfcmVjb3JkX3Jvb3RfaW5fdHJhbnMoc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QpCit7CisJc3RydWN0IGJ0cmZzX2RpcnR5X3Jvb3QgKmRpcnR5OworCXU2NCBydW5uaW5nX3RyYW5zX2lkID0gcm9vdC0+ZnNfaW5mby0+cnVubmluZ190cmFuc2FjdGlvbi0+dHJhbnNpZDsKKwlpZiAocm9vdC0+cmVmX2Nvd3MgJiYgcm9vdC0+bGFzdF90cmFucyA8IHJ1bm5pbmdfdHJhbnNfaWQpIHsKKwkJV0FSTl9PTihyb290ID09IHJvb3QtPmZzX2luZm8tPmV4dGVudF9yb290KTsKKwkJaWYgKHJvb3QtPnJvb3RfaXRlbS5yZWZzICE9IDApIHsKKwkJCXJhZGl4X3RyZWVfdGFnX3NldCgmcm9vdC0+ZnNfaW5mby0+ZnNfcm9vdHNfcmFkaXgsCisJCQkJICAgKHVuc2lnbmVkIGxvbmcpcm9vdC0+cm9vdF9rZXkub2JqZWN0aWQsCisJCQkJICAgQlRSRlNfUk9PVF9UUkFOU19UQUcpOworCisJCQlkaXJ0eSA9IGttYWxsb2Moc2l6ZW9mKCpkaXJ0eSksIEdGUF9OT0ZTKTsKKwkJCUJVR19PTighZGlydHkpOworCQkJZGlydHktPnJvb3QgPSBrbWFsbG9jKHNpemVvZigqZGlydHktPnJvb3QpLCBHRlBfTk9GUyk7CisJCQlCVUdfT04oIWRpcnR5LT5yb290KTsKKwkJCWRpcnR5LT5sYXRlc3Rfcm9vdCA9IHJvb3Q7CisJCQlJTklUX0xJU1RfSEVBRCgmZGlydHktPmxpc3QpOworCisJCQlyb290LT5jb21taXRfcm9vdCA9IGJ0cmZzX3Jvb3Rfbm9kZShyb290KTsKKworCQkJbWVtY3B5KGRpcnR5LT5yb290LCByb290LCBzaXplb2YoKnJvb3QpKTsKKwkJCXNwaW5fbG9ja19pbml0KCZkaXJ0eS0+cm9vdC0+bm9kZV9sb2NrKTsKKwkJCXNwaW5fbG9ja19pbml0KCZkaXJ0eS0+cm9vdC0+bGlzdF9sb2NrKTsKKwkJCW11dGV4X2luaXQoJmRpcnR5LT5yb290LT5vYmplY3RpZF9tdXRleCk7CisJCQltdXRleF9pbml0KCZkaXJ0eS0+cm9vdC0+bG9nX211dGV4KTsKKwkJCUlOSVRfTElTVF9IRUFEKCZkaXJ0eS0+cm9vdC0+ZGVhZF9saXN0KTsKKwkJCWRpcnR5LT5yb290LT5ub2RlID0gcm9vdC0+Y29tbWl0X3Jvb3Q7CisJCQlkaXJ0eS0+cm9vdC0+Y29tbWl0X3Jvb3QgPSBOVUxMOworCisJCQlzcGluX2xvY2soJnJvb3QtPmxpc3RfbG9jayk7CisJCQlsaXN0X2FkZCgmZGlydHktPnJvb3QtPmRlYWRfbGlzdCwgJnJvb3QtPmRlYWRfbGlzdCk7CisJCQlzcGluX3VubG9jaygmcm9vdC0+bGlzdF9sb2NrKTsKKworCQkJcm9vdC0+ZGlydHlfcm9vdCA9IGRpcnR5OworCQl9IGVsc2UgeworCQkJV0FSTl9PTigxKTsKKwkJfQorCQlyb290LT5sYXN0X3RyYW5zID0gcnVubmluZ190cmFuc19pZDsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIHdhaXQgZm9yIGNvbW1pdCBhZ2FpbnN0IHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uIHRvIGJlY29tZSB1bmJsb2NrZWQKKyAqIHdoZW4gdGhpcyBpcyBkb25lLCBpdCBpcyBzYWZlIHRvIHN0YXJ0IGEgbmV3IHRyYW5zYWN0aW9uLCBidXQgdGhlIGN1cnJlbnQKKyAqIHRyYW5zYWN0aW9uIG1pZ2h0IG5vdCBiZSBmdWxseSBvbiBkaXNrLgorICovCitzdGF0aWMgdm9pZCB3YWl0X2N1cnJlbnRfdHJhbnMoc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QpCit7CisJc3RydWN0IGJ0cmZzX3RyYW5zYWN0aW9uICpjdXJfdHJhbnM7CisKKwljdXJfdHJhbnMgPSByb290LT5mc19pbmZvLT5ydW5uaW5nX3RyYW5zYWN0aW9uOworCWlmIChjdXJfdHJhbnMgJiYgY3VyX3RyYW5zLT5ibG9ja2VkKSB7CisJCURFRklORV9XQUlUKHdhaXQpOworCQljdXJfdHJhbnMtPnVzZV9jb3VudCsrOworCQl3aGlsZSAoMSkgeworCQkJcHJlcGFyZV90b193YWl0KCZyb290LT5mc19pbmZvLT50cmFuc2FjdGlvbl93YWl0LCAmd2FpdCwKKwkJCQkJVEFTS19VTklOVEVSUlVQVElCTEUpOworCQkJaWYgKGN1cl90cmFucy0+YmxvY2tlZCkgeworCQkJCW11dGV4X3VubG9jaygmcm9vdC0+ZnNfaW5mby0+dHJhbnNfbXV0ZXgpOworCQkJCXNjaGVkdWxlKCk7CisJCQkJbXV0ZXhfbG9jaygmcm9vdC0+ZnNfaW5mby0+dHJhbnNfbXV0ZXgpOworCQkJCWZpbmlzaF93YWl0KCZyb290LT5mc19pbmZvLT50cmFuc2FjdGlvbl93YWl0LAorCQkJCQkgICAgJndhaXQpOworCQkJfSBlbHNlIHsKKwkJCQlmaW5pc2hfd2FpdCgmcm9vdC0+ZnNfaW5mby0+dHJhbnNhY3Rpb25fd2FpdCwKKwkJCQkJICAgICZ3YWl0KTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlwdXRfdHJhbnNhY3Rpb24oY3VyX3RyYW5zKTsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICpzdGFydF90cmFuc2FjdGlvbihzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwKKwkJCQkJICAgICBpbnQgbnVtX2Jsb2NrcywgaW50IHdhaXQpCit7CisJc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqaCA9CisJCWttZW1fY2FjaGVfYWxsb2MoYnRyZnNfdHJhbnNfaGFuZGxlX2NhY2hlcCwgR0ZQX05PRlMpOworCWludCByZXQ7CisKKwltdXRleF9sb2NrKCZyb290LT5mc19pbmZvLT50cmFuc19tdXRleCk7CisJaWYgKCFyb290LT5mc19pbmZvLT5sb2dfcm9vdF9yZWNvdmVyaW5nICYmCisJICAgICgod2FpdCA9PSAxICYmICFyb290LT5mc19pbmZvLT5vcGVuX2lvY3RsX3RyYW5zKSB8fCB3YWl0ID09IDIpKQorCQl3YWl0X2N1cnJlbnRfdHJhbnMocm9vdCk7CisJcmV0ID0gam9pbl90cmFuc2FjdGlvbihyb290KTsKKwlCVUdfT04ocmV0KTsKKworCWJ0cmZzX3JlY29yZF9yb290X2luX3RyYW5zKHJvb3QpOworCWgtPnRyYW5zaWQgPSByb290LT5mc19pbmZvLT5ydW5uaW5nX3RyYW5zYWN0aW9uLT50cmFuc2lkOworCWgtPnRyYW5zYWN0aW9uID0gcm9vdC0+ZnNfaW5mby0+cnVubmluZ190cmFuc2FjdGlvbjsKKwloLT5ibG9ja3NfcmVzZXJ2ZWQgPSBudW1fYmxvY2tzOworCWgtPmJsb2Nrc191c2VkID0gMDsKKwloLT5ibG9ja19ncm91cCA9IDA7CisJaC0+YWxsb2NfZXhjbHVkZV9uciA9IDA7CisJaC0+YWxsb2NfZXhjbHVkZV9zdGFydCA9IDA7CisJcm9vdC0+ZnNfaW5mby0+cnVubmluZ190cmFuc2FjdGlvbi0+dXNlX2NvdW50Kys7CisJbXV0ZXhfdW5sb2NrKCZyb290LT5mc19pbmZvLT50cmFuc19tdXRleCk7CisJcmV0dXJuIGg7Cit9CisKK3N0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKmJ0cmZzX3N0YXJ0X3RyYW5zYWN0aW9uKHN0cnVjdCBidHJmc19yb290ICpyb290LAorCQkJCQkJICAgaW50IG51bV9ibG9ja3MpCit7CisJcmV0dXJuIHN0YXJ0X3RyYW5zYWN0aW9uKHJvb3QsIG51bV9ibG9ja3MsIDEpOworfQorc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqYnRyZnNfam9pbl90cmFuc2FjdGlvbihzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwKKwkJCQkJCSAgIGludCBudW1fYmxvY2tzKQoreworCXJldHVybiBzdGFydF90cmFuc2FjdGlvbihyb290LCBudW1fYmxvY2tzLCAwKTsKK30KKworc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqYnRyZnNfc3RhcnRfaW9jdGxfdHJhbnNhY3Rpb24oc3RydWN0IGJ0cmZzX3Jvb3QgKnIsCisJCQkJCQkJIGludCBudW1fYmxvY2tzKQoreworCXJldHVybiBzdGFydF90cmFuc2FjdGlvbihyLCBudW1fYmxvY2tzLCAyKTsKK30KKworLyogd2FpdCBmb3IgYSB0cmFuc2FjdGlvbiBjb21taXQgdG8gYmUgZnVsbHkgY29tcGxldGUgKi8KK3N0YXRpYyBub2lubGluZSBpbnQgd2FpdF9mb3JfY29tbWl0KHN0cnVjdCBidHJmc19yb290ICpyb290LAorCQkJCSAgICBzdHJ1Y3QgYnRyZnNfdHJhbnNhY3Rpb24gKmNvbW1pdCkKK3sKKwlERUZJTkVfV0FJVCh3YWl0KTsKKwltdXRleF9sb2NrKCZyb290LT5mc19pbmZvLT50cmFuc19tdXRleCk7CisJd2hpbGUgKCFjb21taXQtPmNvbW1pdF9kb25lKSB7CisJCXByZXBhcmVfdG9fd2FpdCgmY29tbWl0LT5jb21taXRfd2FpdCwgJndhaXQsCisJCQkJVEFTS19VTklOVEVSUlVQVElCTEUpOworCQlpZiAoY29tbWl0LT5jb21taXRfZG9uZSkKKwkJCWJyZWFrOworCQltdXRleF91bmxvY2soJnJvb3QtPmZzX2luZm8tPnRyYW5zX211dGV4KTsKKwkJc2NoZWR1bGUoKTsKKwkJbXV0ZXhfbG9jaygmcm9vdC0+ZnNfaW5mby0+dHJhbnNfbXV0ZXgpOworCX0KKwltdXRleF91bmxvY2soJnJvb3QtPmZzX2luZm8tPnRyYW5zX211dGV4KTsKKwlmaW5pc2hfd2FpdCgmY29tbWl0LT5jb21taXRfd2FpdCwgJndhaXQpOworCXJldHVybiAwOworfQorCisvKgorICogcmF0ZSBsaW1pdCBhZ2FpbnN0IHRoZSBkcm9wX3NuYXBzaG90IGNvZGUuICBUaGlzIGhlbHBzIHRvIHNsb3cgZG93biBuZXcKKyAqIG9wZXJhdGlvbnMgaWYgdGhlIGRyb3Bfc25hcHNob3QgY29kZSBpc24ndCBhYmxlIHRvIGtlZXAgdXAuCisgKi8KK3N0YXRpYyB2b2lkIHRocm90dGxlX29uX2Ryb3BzKHN0cnVjdCBidHJmc19yb290ICpyb290KQoreworCXN0cnVjdCBidHJmc19mc19pbmZvICppbmZvID0gcm9vdC0+ZnNfaW5mbzsKKwlpbnQgaGFyZGVyX2NvdW50ID0gMDsKKworaGFyZGVyOgorCWlmIChhdG9taWNfcmVhZCgmaW5mby0+dGhyb3R0bGVzKSkgeworCQlERUZJTkVfV0FJVCh3YWl0KTsKKwkJaW50IHRocjsKKwkJdGhyID0gYXRvbWljX3JlYWQoJmluZm8tPnRocm90dGxlX2dlbik7CisKKwkJZG8geworCQkJcHJlcGFyZV90b193YWl0KCZpbmZvLT50cmFuc2FjdGlvbl90aHJvdHRsZSwKKwkJCQkJJndhaXQsIFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwkJCWlmICghYXRvbWljX3JlYWQoJmluZm8tPnRocm90dGxlcykpIHsKKwkJCQlmaW5pc2hfd2FpdCgmaW5mby0+dHJhbnNhY3Rpb25fdGhyb3R0bGUsICZ3YWl0KTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXNjaGVkdWxlKCk7CisJCQlmaW5pc2hfd2FpdCgmaW5mby0+dHJhbnNhY3Rpb25fdGhyb3R0bGUsICZ3YWl0KTsKKwkJfSB3aGlsZSAodGhyID09IGF0b21pY19yZWFkKCZpbmZvLT50aHJvdHRsZV9nZW4pKTsKKwkJaGFyZGVyX2NvdW50Kys7CisKKwkJaWYgKHJvb3QtPmZzX2luZm8tPnRvdGFsX3JlZl9jYWNoZV9zaXplID4gMSAqIDEwMjQgKiAxMDI0ICYmCisJCSAgICBoYXJkZXJfY291bnQgPCAyKQorCQkJZ290byBoYXJkZXI7CisKKwkJaWYgKHJvb3QtPmZzX2luZm8tPnRvdGFsX3JlZl9jYWNoZV9zaXplID4gNSAqIDEwMjQgKiAxMDI0ICYmCisJCSAgICBoYXJkZXJfY291bnQgPCAxMCkKKwkJCWdvdG8gaGFyZGVyOworCisJCWlmIChyb290LT5mc19pbmZvLT50b3RhbF9yZWZfY2FjaGVfc2l6ZSA+IDEwICogMTAyNCAqIDEwMjQgJiYKKwkJICAgIGhhcmRlcl9jb3VudCA8IDIwKQorCQkJZ290byBoYXJkZXI7CisJfQorfQorCit2b2lkIGJ0cmZzX3Rocm90dGxlKHN0cnVjdCBidHJmc19yb290ICpyb290KQoreworCW11dGV4X2xvY2soJnJvb3QtPmZzX2luZm8tPnRyYW5zX211dGV4KTsKKwlpZiAoIXJvb3QtPmZzX2luZm8tPm9wZW5faW9jdGxfdHJhbnMpCisJCXdhaXRfY3VycmVudF90cmFucyhyb290KTsKKwltdXRleF91bmxvY2soJnJvb3QtPmZzX2luZm8tPnRyYW5zX211dGV4KTsKKworCXRocm90dGxlX29uX2Ryb3BzKHJvb3QpOworfQorCitzdGF0aWMgaW50IF9fYnRyZnNfZW5kX3RyYW5zYWN0aW9uKHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAorCQkJICBzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwgaW50IHRocm90dGxlKQoreworCXN0cnVjdCBidHJmc190cmFuc2FjdGlvbiAqY3VyX3RyYW5zOworCXN0cnVjdCBidHJmc19mc19pbmZvICppbmZvID0gcm9vdC0+ZnNfaW5mbzsKKworCW11dGV4X2xvY2soJmluZm8tPnRyYW5zX211dGV4KTsKKwljdXJfdHJhbnMgPSBpbmZvLT5ydW5uaW5nX3RyYW5zYWN0aW9uOworCVdBUk5fT04oY3VyX3RyYW5zICE9IHRyYW5zLT50cmFuc2FjdGlvbik7CisJV0FSTl9PTihjdXJfdHJhbnMtPm51bV93cml0ZXJzIDwgMSk7CisJY3VyX3RyYW5zLT5udW1fd3JpdGVycy0tOworCisJaWYgKHdhaXRxdWV1ZV9hY3RpdmUoJmN1cl90cmFucy0+d3JpdGVyX3dhaXQpKQorCQl3YWtlX3VwKCZjdXJfdHJhbnMtPndyaXRlcl93YWl0KTsKKwlwdXRfdHJhbnNhY3Rpb24oY3VyX3RyYW5zKTsKKwltdXRleF91bmxvY2soJmluZm8tPnRyYW5zX211dGV4KTsKKwltZW1zZXQodHJhbnMsIDAsIHNpemVvZigqdHJhbnMpKTsKKwlrbWVtX2NhY2hlX2ZyZWUoYnRyZnNfdHJhbnNfaGFuZGxlX2NhY2hlcCwgdHJhbnMpOworCisJaWYgKHRocm90dGxlKQorCQl0aHJvdHRsZV9vbl9kcm9wcyhyb290KTsKKworCXJldHVybiAwOworfQorCitpbnQgYnRyZnNfZW5kX3RyYW5zYWN0aW9uKHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAorCQkJICBzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCkKK3sKKwlyZXR1cm4gX19idHJmc19lbmRfdHJhbnNhY3Rpb24odHJhbnMsIHJvb3QsIDApOworfQorCitpbnQgYnRyZnNfZW5kX3RyYW5zYWN0aW9uX3Rocm90dGxlKHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAorCQkJCSAgIHN0cnVjdCBidHJmc19yb290ICpyb290KQoreworCXJldHVybiBfX2J0cmZzX2VuZF90cmFuc2FjdGlvbih0cmFucywgcm9vdCwgMSk7Cit9CisKKy8qCisgKiB3aGVuIGJ0cmVlIGJsb2NrcyBhcmUgYWxsb2NhdGVkLCB0aGV5IGhhdmUgc29tZSBjb3JyZXNwb25kaW5nIGJpdHMgc2V0IGZvcgorICogdGhlbSBpbiBvbmUgb2YgdHdvIGV4dGVudF9pbyB0cmVlcy4gIFRoaXMgaXMgdXNlZCB0byBtYWtlIHN1cmUgYWxsIG9mCisgKiB0aG9zZSBleHRlbnRzIGFyZSBvbiBkaXNrIGZvciB0cmFuc2FjdGlvbiBvciBsb2cgY29tbWl0CisgKi8KK2ludCBidHJmc193cml0ZV9hbmRfd2FpdF9tYXJrZWRfZXh0ZW50cyhzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwKKwkJCQkJc3RydWN0IGV4dGVudF9pb190cmVlICpkaXJ0eV9wYWdlcykKK3sKKwlpbnQgcmV0OworCWludCBlcnIgPSAwOworCWludCB3ZXJyID0gMDsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwlzdHJ1Y3QgaW5vZGUgKmJ0cmVlX2lub2RlID0gcm9vdC0+ZnNfaW5mby0+YnRyZWVfaW5vZGU7CisJdTY0IHN0YXJ0ID0gMDsKKwl1NjQgZW5kOworCXVuc2lnbmVkIGxvbmcgaW5kZXg7CisKKwl3aGlsZSAoMSkgeworCQlyZXQgPSBmaW5kX2ZpcnN0X2V4dGVudF9iaXQoZGlydHlfcGFnZXMsIHN0YXJ0LCAmc3RhcnQsICZlbmQsCisJCQkJCSAgICBFWFRFTlRfRElSVFkpOworCQlpZiAocmV0KQorCQkJYnJlYWs7CisJCXdoaWxlIChzdGFydCA8PSBlbmQpIHsKKwkJCWNvbmRfcmVzY2hlZCgpOworCisJCQlpbmRleCA9IHN0YXJ0ID4+IFBBR0VfQ0FDSEVfU0hJRlQ7CisJCQlzdGFydCA9ICh1NjQpKGluZGV4ICsgMSkgPDwgUEFHRV9DQUNIRV9TSElGVDsKKwkJCXBhZ2UgPSBmaW5kX2dldF9wYWdlKGJ0cmVlX2lub2RlLT5pX21hcHBpbmcsIGluZGV4KTsKKwkJCWlmICghcGFnZSkKKwkJCQljb250aW51ZTsKKworCQkJYnRyZWVfbG9ja19wYWdlX2hvb2socGFnZSk7CisJCQlpZiAoIXBhZ2UtPm1hcHBpbmcpIHsKKwkJCQl1bmxvY2tfcGFnZShwYWdlKTsKKwkJCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCWlmIChQYWdlV3JpdGViYWNrKHBhZ2UpKSB7CisJCQkJaWYgKFBhZ2VEaXJ0eShwYWdlKSkKKwkJCQkJd2FpdF9vbl9wYWdlX3dyaXRlYmFjayhwYWdlKTsKKwkJCQllbHNlIHsKKwkJCQkJdW5sb2NrX3BhZ2UocGFnZSk7CisJCQkJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJfQorCQkJZXJyID0gd3JpdGVfb25lX3BhZ2UocGFnZSwgMCk7CisJCQlpZiAoZXJyKQorCQkJCXdlcnIgPSBlcnI7CisJCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CisJCX0KKwl9CisJd2hpbGUgKDEpIHsKKwkJcmV0ID0gZmluZF9maXJzdF9leHRlbnRfYml0KGRpcnR5X3BhZ2VzLCAwLCAmc3RhcnQsICZlbmQsCisJCQkJCSAgICBFWFRFTlRfRElSVFkpOworCQlpZiAocmV0KQorCQkJYnJlYWs7CisKKwkJY2xlYXJfZXh0ZW50X2RpcnR5KGRpcnR5X3BhZ2VzLCBzdGFydCwgZW5kLCBHRlBfTk9GUyk7CisJCXdoaWxlIChzdGFydCA8PSBlbmQpIHsKKwkJCWluZGV4ID0gc3RhcnQgPj4gUEFHRV9DQUNIRV9TSElGVDsKKwkJCXN0YXJ0ID0gKHU2NCkoaW5kZXggKyAxKSA8PCBQQUdFX0NBQ0hFX1NISUZUOworCQkJcGFnZSA9IGZpbmRfZ2V0X3BhZ2UoYnRyZWVfaW5vZGUtPmlfbWFwcGluZywgaW5kZXgpOworCQkJaWYgKCFwYWdlKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKFBhZ2VEaXJ0eShwYWdlKSkgeworCQkJCWJ0cmVlX2xvY2tfcGFnZV9ob29rKHBhZ2UpOworCQkJCXdhaXRfb25fcGFnZV93cml0ZWJhY2socGFnZSk7CisJCQkJZXJyID0gd3JpdGVfb25lX3BhZ2UocGFnZSwgMCk7CisJCQkJaWYgKGVycikKKwkJCQkJd2VyciA9IGVycjsKKwkJCX0KKwkJCXdhaXRfb25fcGFnZV93cml0ZWJhY2socGFnZSk7CisJCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CisJCQljb25kX3Jlc2NoZWQoKTsKKwkJfQorCX0KKwlpZiAoZXJyKQorCQl3ZXJyID0gZXJyOworCXJldHVybiB3ZXJyOworfQorCitpbnQgYnRyZnNfd3JpdGVfYW5kX3dhaXRfdHJhbnNhY3Rpb24oc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCisJCQkJICAgICBzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCkKK3sKKwlpZiAoIXRyYW5zIHx8ICF0cmFucy0+dHJhbnNhY3Rpb24pIHsKKwkJc3RydWN0IGlub2RlICpidHJlZV9pbm9kZTsKKwkJYnRyZWVfaW5vZGUgPSByb290LT5mc19pbmZvLT5idHJlZV9pbm9kZTsKKwkJcmV0dXJuIGZpbGVtYXBfd3JpdGVfYW5kX3dhaXQoYnRyZWVfaW5vZGUtPmlfbWFwcGluZyk7CisJfQorCXJldHVybiBidHJmc193cml0ZV9hbmRfd2FpdF9tYXJrZWRfZXh0ZW50cyhyb290LAorCQkJCQkgICAmdHJhbnMtPnRyYW5zYWN0aW9uLT5kaXJ0eV9wYWdlcyk7Cit9CisKKy8qCisgKiB0aGlzIGlzIHVzZWQgdG8gdXBkYXRlIHRoZSByb290IHBvaW50ZXIgaW4gdGhlIHRyZWUgb2YgdHJlZSByb290cy4KKyAqCisgKiBCdXQsIGluIHRoZSBjYXNlIG9mIHRoZSBleHRlbnQgYWxsb2NhdGlvbiB0cmVlLCB1cGRhdGluZyB0aGUgcm9vdAorICogcG9pbnRlciBtYXkgYWxsb2NhdGUgYmxvY2tzIHdoaWNoIG1heSBjaGFuZ2UgdGhlIHJvb3Qgb2YgdGhlIGV4dGVudAorICogYWxsb2NhdGlvbiB0cmVlLgorICoKKyAqIFNvLCB0aGlzIGxvb3BzIGFuZCByZXBlYXRzIGFuZCBtYWtlcyBzdXJlIHRoZSBjb3dvbmx5IHJvb3QgZGlkbid0CisgKiBjaGFuZ2Ugd2hpbGUgdGhlIHJvb3QgcG9pbnRlciB3YXMgYmVpbmcgdXBkYXRlZCBpbiB0aGUgbWV0YWRhdGEuCisgKi8KK3N0YXRpYyBpbnQgdXBkYXRlX2Nvd29ubHlfcm9vdChzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKKwkJCSAgICAgICBzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCkKK3sKKwlpbnQgcmV0OworCXU2NCBvbGRfcm9vdF9ieXRlbnI7CisJc3RydWN0IGJ0cmZzX3Jvb3QgKnRyZWVfcm9vdCA9IHJvb3QtPmZzX2luZm8tPnRyZWVfcm9vdDsKKworCWJ0cmZzX2V4dGVudF9wb3N0X29wKHRyYW5zLCByb290KTsKKwlidHJmc193cml0ZV9kaXJ0eV9ibG9ja19ncm91cHModHJhbnMsIHJvb3QpOworCWJ0cmZzX2V4dGVudF9wb3N0X29wKHRyYW5zLCByb290KTsKKworCXdoaWxlICgxKSB7CisJCW9sZF9yb290X2J5dGVuciA9IGJ0cmZzX3Jvb3RfYnl0ZW5yKCZyb290LT5yb290X2l0ZW0pOworCQlpZiAob2xkX3Jvb3RfYnl0ZW5yID09IHJvb3QtPm5vZGUtPnN0YXJ0KQorCQkJYnJlYWs7CisJCWJ0cmZzX3NldF9yb290X2J5dGVucigmcm9vdC0+cm9vdF9pdGVtLAorCQkJCSAgICAgICByb290LT5ub2RlLT5zdGFydCk7CisJCWJ0cmZzX3NldF9yb290X2xldmVsKCZyb290LT5yb290X2l0ZW0sCisJCQkJICAgICBidHJmc19oZWFkZXJfbGV2ZWwocm9vdC0+bm9kZSkpOworCQlidHJmc19zZXRfcm9vdF9nZW5lcmF0aW9uKCZyb290LT5yb290X2l0ZW0sIHRyYW5zLT50cmFuc2lkKTsKKworCQlidHJmc19leHRlbnRfcG9zdF9vcCh0cmFucywgcm9vdCk7CisKKwkJcmV0ID0gYnRyZnNfdXBkYXRlX3Jvb3QodHJhbnMsIHRyZWVfcm9vdCwKKwkJCQkJJnJvb3QtPnJvb3Rfa2V5LAorCQkJCQkmcm9vdC0+cm9vdF9pdGVtKTsKKwkJQlVHX09OKHJldCk7CisJCWJ0cmZzX3dyaXRlX2RpcnR5X2Jsb2NrX2dyb3Vwcyh0cmFucywgcm9vdCk7CisJCWJ0cmZzX2V4dGVudF9wb3N0X29wKHRyYW5zLCByb290KTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiB1cGRhdGUgYWxsIHRoZSBjb3dvbmx5IHRyZWUgcm9vdHMgb24gZGlzaworICovCitpbnQgYnRyZnNfY29tbWl0X3RyZWVfcm9vdHMoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCisJCQkgICAgc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QpCit7CisJc3RydWN0IGJ0cmZzX2ZzX2luZm8gKmZzX2luZm8gPSByb290LT5mc19pbmZvOworCXN0cnVjdCBsaXN0X2hlYWQgKm5leHQ7CisJc3RydWN0IGV4dGVudF9idWZmZXIgKmViOworCisJYnRyZnNfZXh0ZW50X3Bvc3Rfb3AodHJhbnMsIGZzX2luZm8tPnRyZWVfcm9vdCk7CisKKwllYiA9IGJ0cmZzX2xvY2tfcm9vdF9ub2RlKGZzX2luZm8tPnRyZWVfcm9vdCk7CisJYnRyZnNfY293X2Jsb2NrKHRyYW5zLCBmc19pbmZvLT50cmVlX3Jvb3QsIGViLCBOVUxMLCAwLCAmZWIsIDApOworCWJ0cmZzX3RyZWVfdW5sb2NrKGViKTsKKwlmcmVlX2V4dGVudF9idWZmZXIoZWIpOworCisJYnRyZnNfZXh0ZW50X3Bvc3Rfb3AodHJhbnMsIGZzX2luZm8tPnRyZWVfcm9vdCk7CisKKwl3aGlsZSAoIWxpc3RfZW1wdHkoJmZzX2luZm8tPmRpcnR5X2Nvd29ubHlfcm9vdHMpKSB7CisJCW5leHQgPSBmc19pbmZvLT5kaXJ0eV9jb3dvbmx5X3Jvb3RzLm5leHQ7CisJCWxpc3RfZGVsX2luaXQobmV4dCk7CisJCXJvb3QgPSBsaXN0X2VudHJ5KG5leHQsIHN0cnVjdCBidHJmc19yb290LCBkaXJ0eV9saXN0KTsKKworCQl1cGRhdGVfY293b25seV9yb290KHRyYW5zLCByb290KTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBkZWFkIHJvb3RzIGFyZSBvbGQgc25hcHNob3RzIHRoYXQgbmVlZCB0byBiZSBkZWxldGVkLiAgVGhpcyBhbGxvY2F0ZXMKKyAqIGEgZGlydHkgcm9vdCBzdHJ1Y3QgYW5kIGFkZHMgaXQgaW50byB0aGUgbGlzdCBvZiBkZWFkIHJvb3RzIHRoYXQgbmVlZCB0bworICogYmUgZGVsZXRlZAorICovCitpbnQgYnRyZnNfYWRkX2RlYWRfcm9vdChzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwgc3RydWN0IGJ0cmZzX3Jvb3QgKmxhdGVzdCkKK3sKKwlzdHJ1Y3QgYnRyZnNfZGlydHlfcm9vdCAqZGlydHk7CisKKwlkaXJ0eSA9IGttYWxsb2Moc2l6ZW9mKCpkaXJ0eSksIEdGUF9OT0ZTKTsKKwlpZiAoIWRpcnR5KQorCQlyZXR1cm4gLUVOT01FTTsKKwlkaXJ0eS0+cm9vdCA9IHJvb3Q7CisJZGlydHktPmxhdGVzdF9yb290ID0gbGF0ZXN0OworCisJbXV0ZXhfbG9jaygmcm9vdC0+ZnNfaW5mby0+dHJhbnNfbXV0ZXgpOworCWxpc3RfYWRkKCZkaXJ0eS0+bGlzdCwgJmxhdGVzdC0+ZnNfaW5mby0+ZGVhZF9yb290cyk7CisJbXV0ZXhfdW5sb2NrKCZyb290LT5mc19pbmZvLT50cmFuc19tdXRleCk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBhdCB0cmFuc2FjdGlvbiBjb21taXQgdGltZSB3ZSBuZWVkIHRvIHNjaGVkdWxlIHRoZSBvbGQgcm9vdHMgZm9yCisgKiBkZWxldGlvbiB2aWEgYnRyZnNfZHJvcF9zbmFwc2hvdC4gIFRoaXMgcnVucyB0aHJvdWdoIGFsbCB0aGUKKyAqIHJlZmVyZW5jZSBjb3VudGVkIHJvb3RzIHRoYXQgd2VyZSBtb2RpZmllZCBpbiB0aGUgY3VycmVudAorICogdHJhbnNhY3Rpb24gYW5kIHB1dHMgdGhlbSBpbnRvIHRoZSBkcm9wIGxpc3QKKyAqLworc3RhdGljIG5vaW5saW5lIGludCBhZGRfZGlydHlfcm9vdHMoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCisJCQkJICAgIHN0cnVjdCByYWRpeF90cmVlX3Jvb3QgKnJhZGl4LAorCQkJCSAgICBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0KQoreworCXN0cnVjdCBidHJmc19kaXJ0eV9yb290ICpkaXJ0eTsKKwlzdHJ1Y3QgYnRyZnNfcm9vdCAqZ2FuZ1s4XTsKKwlzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdDsKKwlpbnQgaTsKKwlpbnQgcmV0OworCWludCBlcnIgPSAwOworCXUzMiByZWZzOworCisJd2hpbGUgKDEpIHsKKwkJcmV0ID0gcmFkaXhfdHJlZV9nYW5nX2xvb2t1cF90YWcocmFkaXgsICh2b2lkICoqKWdhbmcsIDAsCisJCQkJCQkgQVJSQVlfU0laRShnYW5nKSwKKwkJCQkJCSBCVFJGU19ST09UX1RSQU5TX1RBRyk7CisJCWlmIChyZXQgPT0gMCkKKwkJCWJyZWFrOworCQlmb3IgKGkgPSAwOyBpIDwgcmV0OyBpKyspIHsKKwkJCXJvb3QgPSBnYW5nW2ldOworCQkJcmFkaXhfdHJlZV90YWdfY2xlYXIocmFkaXgsCisJCQkJICAgICAodW5zaWduZWQgbG9uZylyb290LT5yb290X2tleS5vYmplY3RpZCwKKwkJCQkgICAgIEJUUkZTX1JPT1RfVFJBTlNfVEFHKTsKKworCQkJQlVHX09OKCFyb290LT5yZWZfdHJlZSk7CisJCQlkaXJ0eSA9IHJvb3QtPmRpcnR5X3Jvb3Q7CisKKwkJCWJ0cmZzX2ZyZWVfbG9nKHRyYW5zLCByb290KTsKKwkJCWJ0cmZzX2ZyZWVfcmVsb2Nfcm9vdCh0cmFucywgcm9vdCk7CisKKwkJCWlmIChyb290LT5jb21taXRfcm9vdCA9PSByb290LT5ub2RlKSB7CisJCQkJV0FSTl9PTihyb290LT5ub2RlLT5zdGFydCAhPQorCQkJCQlidHJmc19yb290X2J5dGVucigmcm9vdC0+cm9vdF9pdGVtKSk7CisKKwkJCQlmcmVlX2V4dGVudF9idWZmZXIocm9vdC0+Y29tbWl0X3Jvb3QpOworCQkJCXJvb3QtPmNvbW1pdF9yb290ID0gTlVMTDsKKwkJCQlyb290LT5kaXJ0eV9yb290ID0gTlVMTDsKKworCQkJCXNwaW5fbG9jaygmcm9vdC0+bGlzdF9sb2NrKTsKKwkJCQlsaXN0X2RlbF9pbml0KCZkaXJ0eS0+cm9vdC0+ZGVhZF9saXN0KTsKKwkJCQlzcGluX3VubG9jaygmcm9vdC0+bGlzdF9sb2NrKTsKKworCQkJCWtmcmVlKGRpcnR5LT5yb290KTsKKwkJCQlrZnJlZShkaXJ0eSk7CisKKwkJCQkvKiBtYWtlIHN1cmUgdG8gdXBkYXRlIHRoZSByb290IG9uIGRpc2sKKwkJCQkgKiBzbyB3ZSBnZXQgYW55IHVwZGF0ZXMgdG8gdGhlIGJsb2NrIHVzZWQKKwkJCQkgKiBjb3VudHMKKwkJCQkgKi8KKwkJCQllcnIgPSBidHJmc191cGRhdGVfcm9vdCh0cmFucywKKwkJCQkJCXJvb3QtPmZzX2luZm8tPnRyZWVfcm9vdCwKKwkJCQkJCSZyb290LT5yb290X2tleSwKKwkJCQkJCSZyb290LT5yb290X2l0ZW0pOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQltZW1zZXQoJnJvb3QtPnJvb3RfaXRlbS5kcm9wX3Byb2dyZXNzLCAwLAorCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgYnRyZnNfZGlza19rZXkpKTsKKwkJCXJvb3QtPnJvb3RfaXRlbS5kcm9wX2xldmVsID0gMDsKKwkJCXJvb3QtPmNvbW1pdF9yb290ID0gTlVMTDsKKwkJCXJvb3QtPmRpcnR5X3Jvb3QgPSBOVUxMOworCQkJcm9vdC0+cm9vdF9rZXkub2Zmc2V0ID0gcm9vdC0+ZnNfaW5mby0+Z2VuZXJhdGlvbjsKKwkJCWJ0cmZzX3NldF9yb290X2J5dGVucigmcm9vdC0+cm9vdF9pdGVtLAorCQkJCQkgICAgICByb290LT5ub2RlLT5zdGFydCk7CisJCQlidHJmc19zZXRfcm9vdF9sZXZlbCgmcm9vdC0+cm9vdF9pdGVtLAorCQkJCQkgICAgIGJ0cmZzX2hlYWRlcl9sZXZlbChyb290LT5ub2RlKSk7CisJCQlidHJmc19zZXRfcm9vdF9nZW5lcmF0aW9uKCZyb290LT5yb290X2l0ZW0sCisJCQkJCQkgIHJvb3QtPnJvb3Rfa2V5Lm9mZnNldCk7CisKKwkJCWVyciA9IGJ0cmZzX2luc2VydF9yb290KHRyYW5zLCByb290LT5mc19pbmZvLT50cmVlX3Jvb3QsCisJCQkJCQkmcm9vdC0+cm9vdF9rZXksCisJCQkJCQkmcm9vdC0+cm9vdF9pdGVtKTsKKwkJCWlmIChlcnIpCisJCQkJYnJlYWs7CisKKwkJCXJlZnMgPSBidHJmc19yb290X3JlZnMoJmRpcnR5LT5yb290LT5yb290X2l0ZW0pOworCQkJYnRyZnNfc2V0X3Jvb3RfcmVmcygmZGlydHktPnJvb3QtPnJvb3RfaXRlbSwgcmVmcyAtIDEpOworCQkJZXJyID0gYnRyZnNfdXBkYXRlX3Jvb3QodHJhbnMsIHJvb3QtPmZzX2luZm8tPnRyZWVfcm9vdCwKKwkJCQkJCSZkaXJ0eS0+cm9vdC0+cm9vdF9rZXksCisJCQkJCQkmZGlydHktPnJvb3QtPnJvb3RfaXRlbSk7CisKKwkJCUJVR19PTihlcnIpOworCQkJaWYgKHJlZnMgPT0gMSkgeworCQkJCWxpc3RfYWRkKCZkaXJ0eS0+bGlzdCwgbGlzdCk7CisJCQl9IGVsc2UgeworCQkJCVdBUk5fT04oMSk7CisJCQkJZnJlZV9leHRlbnRfYnVmZmVyKGRpcnR5LT5yb290LT5ub2RlKTsKKwkJCQlrZnJlZShkaXJ0eS0+cm9vdCk7CisJCQkJa2ZyZWUoZGlydHkpOworCQkJfQorCQl9CisJfQorCXJldHVybiBlcnI7Cit9CisKKy8qCisgKiBkZWZyYWcgYSBnaXZlbiBidHJlZS4gIElmIGNhY2hlb25seSA9PSAxLCB0aGlzIHdvbid0IHJlYWQgZnJvbSB0aGUgZGlzaywKKyAqIG90aGVyd2lzZSBldmVyeSBsZWFmIGluIHRoZSBidHJlZSBpcyByZWFkIGFuZCBkZWZyYWdnZWQuCisgKi8KK2ludCBidHJmc19kZWZyYWdfcm9vdChzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwgaW50IGNhY2hlb25seSkKK3sKKwlzdHJ1Y3QgYnRyZnNfZnNfaW5mbyAqaW5mbyA9IHJvb3QtPmZzX2luZm87CisJaW50IHJldDsKKwlzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFuczsKKwl1bnNpZ25lZCBsb25nIG5yOworCisJc21wX21iKCk7CisJaWYgKHJvb3QtPmRlZnJhZ19ydW5uaW5nKQorCQlyZXR1cm4gMDsKKwl0cmFucyA9IGJ0cmZzX3N0YXJ0X3RyYW5zYWN0aW9uKHJvb3QsIDEpOworCXdoaWxlICgxKSB7CisJCXJvb3QtPmRlZnJhZ19ydW5uaW5nID0gMTsKKwkJcmV0ID0gYnRyZnNfZGVmcmFnX2xlYXZlcyh0cmFucywgcm9vdCwgY2FjaGVvbmx5KTsKKwkJbnIgPSB0cmFucy0+YmxvY2tzX3VzZWQ7CisJCWJ0cmZzX2VuZF90cmFuc2FjdGlvbih0cmFucywgcm9vdCk7CisJCWJ0cmZzX2J0cmVlX2JhbGFuY2VfZGlydHkoaW5mby0+dHJlZV9yb290LCBucik7CisJCWNvbmRfcmVzY2hlZCgpOworCisJCXRyYW5zID0gYnRyZnNfc3RhcnRfdHJhbnNhY3Rpb24ocm9vdCwgMSk7CisJCWlmIChyb290LT5mc19pbmZvLT5jbG9zaW5nIHx8IHJldCAhPSAtRUFHQUlOKQorCQkJYnJlYWs7CisJfQorCXJvb3QtPmRlZnJhZ19ydW5uaW5nID0gMDsKKwlzbXBfbWIoKTsKKwlidHJmc19lbmRfdHJhbnNhY3Rpb24odHJhbnMsIHJvb3QpOworCXJldHVybiAwOworfQorCisvKgorICogR2l2ZW4gYSBsaXN0IG9mIHJvb3RzIHRoYXQgbmVlZCB0byBiZSBkZWxldGVkLCBjYWxsIGJ0cmZzX2Ryb3Bfc25hcHNob3Qgb24KKyAqIGFsbCBvZiB0aGVtCisgKi8KK3N0YXRpYyBub2lubGluZSBpbnQgZHJvcF9kaXJ0eV9yb290cyhzdHJ1Y3QgYnRyZnNfcm9vdCAqdHJlZV9yb290LAorCQkJCSAgICAgc3RydWN0IGxpc3RfaGVhZCAqbGlzdCkKK3sKKwlzdHJ1Y3QgYnRyZnNfZGlydHlfcm9vdCAqZGlydHk7CisJc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnM7CisJdW5zaWduZWQgbG9uZyBucjsKKwl1NjQgbnVtX2J5dGVzOworCXU2NCBieXRlc191c2VkOworCXU2NCBtYXhfdXNlbGVzczsKKwlpbnQgcmV0ID0gMDsKKwlpbnQgZXJyOworCisJd2hpbGUgKCFsaXN0X2VtcHR5KGxpc3QpKSB7CisJCXN0cnVjdCBidHJmc19yb290ICpyb290OworCisJCWRpcnR5ID0gbGlzdF9lbnRyeShsaXN0LT5wcmV2LCBzdHJ1Y3QgYnRyZnNfZGlydHlfcm9vdCwgbGlzdCk7CisJCWxpc3RfZGVsX2luaXQoJmRpcnR5LT5saXN0KTsKKworCQludW1fYnl0ZXMgPSBidHJmc19yb290X3VzZWQoJmRpcnR5LT5yb290LT5yb290X2l0ZW0pOworCQlyb290ID0gZGlydHktPmxhdGVzdF9yb290OworCQlhdG9taWNfaW5jKCZyb290LT5mc19pbmZvLT50aHJvdHRsZXMpOworCisJCXdoaWxlICgxKSB7CisJCQl0cmFucyA9IGJ0cmZzX3N0YXJ0X3RyYW5zYWN0aW9uKHRyZWVfcm9vdCwgMSk7CisJCQltdXRleF9sb2NrKCZyb290LT5mc19pbmZvLT5kcm9wX211dGV4KTsKKwkJCXJldCA9IGJ0cmZzX2Ryb3Bfc25hcHNob3QodHJhbnMsIGRpcnR5LT5yb290KTsKKwkJCWlmIChyZXQgIT0gLUVBR0FJTikKKwkJCQlicmVhazsKKwkJCW11dGV4X3VubG9jaygmcm9vdC0+ZnNfaW5mby0+ZHJvcF9tdXRleCk7CisKKwkJCWVyciA9IGJ0cmZzX3VwZGF0ZV9yb290KHRyYW5zLAorCQkJCQl0cmVlX3Jvb3QsCisJCQkJCSZkaXJ0eS0+cm9vdC0+cm9vdF9rZXksCisJCQkJCSZkaXJ0eS0+cm9vdC0+cm9vdF9pdGVtKTsKKwkJCWlmIChlcnIpCisJCQkJcmV0ID0gZXJyOworCQkJbnIgPSB0cmFucy0+YmxvY2tzX3VzZWQ7CisJCQlyZXQgPSBidHJmc19lbmRfdHJhbnNhY3Rpb24odHJhbnMsIHRyZWVfcm9vdCk7CisJCQlCVUdfT04ocmV0KTsKKworCQkJYnRyZnNfYnRyZWVfYmFsYW5jZV9kaXJ0eSh0cmVlX3Jvb3QsIG5yKTsKKwkJCWNvbmRfcmVzY2hlZCgpOworCQl9CisJCUJVR19PTihyZXQpOworCQlhdG9taWNfZGVjKCZyb290LT5mc19pbmZvLT50aHJvdHRsZXMpOworCQl3YWtlX3VwKCZyb290LT5mc19pbmZvLT50cmFuc2FjdGlvbl90aHJvdHRsZSk7CisKKwkJbnVtX2J5dGVzIC09IGJ0cmZzX3Jvb3RfdXNlZCgmZGlydHktPnJvb3QtPnJvb3RfaXRlbSk7CisJCWJ5dGVzX3VzZWQgPSBidHJmc19yb290X3VzZWQoJnJvb3QtPnJvb3RfaXRlbSk7CisJCWlmIChudW1fYnl0ZXMpIHsKKwkJCWJ0cmZzX3JlY29yZF9yb290X2luX3RyYW5zKHJvb3QpOworCQkJYnRyZnNfc2V0X3Jvb3RfdXNlZCgmcm9vdC0+cm9vdF9pdGVtLAorCQkJCQkgICAgYnl0ZXNfdXNlZCAtIG51bV9ieXRlcyk7CisJCX0KKworCQlyZXQgPSBidHJmc19kZWxfcm9vdCh0cmFucywgdHJlZV9yb290LCAmZGlydHktPnJvb3QtPnJvb3Rfa2V5KTsKKwkJaWYgKHJldCkgeworCQkJQlVHKCk7CisJCQlicmVhazsKKwkJfQorCQltdXRleF91bmxvY2soJnJvb3QtPmZzX2luZm8tPmRyb3BfbXV0ZXgpOworCisJCXNwaW5fbG9jaygmcm9vdC0+bGlzdF9sb2NrKTsKKwkJbGlzdF9kZWxfaW5pdCgmZGlydHktPnJvb3QtPmRlYWRfbGlzdCk7CisJCWlmICghbGlzdF9lbXB0eSgmcm9vdC0+ZGVhZF9saXN0KSkgeworCQkJc3RydWN0IGJ0cmZzX3Jvb3QgKm9sZGVzdDsKKwkJCW9sZGVzdCA9IGxpc3RfZW50cnkocm9vdC0+ZGVhZF9saXN0LnByZXYsCisJCQkJCSAgICBzdHJ1Y3QgYnRyZnNfcm9vdCwgZGVhZF9saXN0KTsKKwkJCW1heF91c2VsZXNzID0gb2xkZXN0LT5yb290X2tleS5vZmZzZXQgLSAxOworCQl9IGVsc2UgeworCQkJbWF4X3VzZWxlc3MgPSByb290LT5yb290X2tleS5vZmZzZXQgLSAxOworCQl9CisJCXNwaW5fdW5sb2NrKCZyb290LT5saXN0X2xvY2spOworCisJCW5yID0gdHJhbnMtPmJsb2Nrc191c2VkOworCQlyZXQgPSBidHJmc19lbmRfdHJhbnNhY3Rpb24odHJhbnMsIHRyZWVfcm9vdCk7CisJCUJVR19PTihyZXQpOworCisJCXJldCA9IGJ0cmZzX3JlbW92ZV9sZWFmX3JlZnMocm9vdCwgbWF4X3VzZWxlc3MsIDApOworCQlCVUdfT04ocmV0KTsKKworCQlmcmVlX2V4dGVudF9idWZmZXIoZGlydHktPnJvb3QtPm5vZGUpOworCQlrZnJlZShkaXJ0eS0+cm9vdCk7CisJCWtmcmVlKGRpcnR5KTsKKworCQlidHJmc19idHJlZV9iYWxhbmNlX2RpcnR5KHRyZWVfcm9vdCwgbnIpOworCQljb25kX3Jlc2NoZWQoKTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIG5ldyBzbmFwc2hvdHMgbmVlZCB0byBiZSBjcmVhdGVkIGF0IGEgdmVyeSBzcGVjaWZpYyB0aW1lIGluIHRoZQorICogdHJhbnNhY3Rpb24gY29tbWl0LiAgVGhpcyBkb2VzIHRoZSBhY3R1YWwgY3JlYXRpb24KKyAqLworc3RhdGljIG5vaW5saW5lIGludCBjcmVhdGVfcGVuZGluZ19zbmFwc2hvdChzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKKwkJCQkgICBzdHJ1Y3QgYnRyZnNfZnNfaW5mbyAqZnNfaW5mbywKKwkJCQkgICBzdHJ1Y3QgYnRyZnNfcGVuZGluZ19zbmFwc2hvdCAqcGVuZGluZykKK3sKKwlzdHJ1Y3QgYnRyZnNfa2V5IGtleTsKKwlzdHJ1Y3QgYnRyZnNfcm9vdF9pdGVtICpuZXdfcm9vdF9pdGVtOworCXN0cnVjdCBidHJmc19yb290ICp0cmVlX3Jvb3QgPSBmc19pbmZvLT50cmVlX3Jvb3Q7CisJc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QgPSBwZW5kaW5nLT5yb290OworCXN0cnVjdCBleHRlbnRfYnVmZmVyICp0bXA7CisJc3RydWN0IGV4dGVudF9idWZmZXIgKm9sZDsKKwlpbnQgcmV0OworCXU2NCBvYmplY3RpZDsKKworCW5ld19yb290X2l0ZW0gPSBrbWFsbG9jKHNpemVvZigqbmV3X3Jvb3RfaXRlbSksIEdGUF9OT0ZTKTsKKwlpZiAoIW5ld19yb290X2l0ZW0pIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBmYWlsOworCX0KKwlyZXQgPSBidHJmc19maW5kX2ZyZWVfb2JqZWN0aWQodHJhbnMsIHRyZWVfcm9vdCwgMCwgJm9iamVjdGlkKTsKKwlpZiAocmV0KQorCQlnb3RvIGZhaWw7CisKKwlidHJmc19yZWNvcmRfcm9vdF9pbl90cmFucyhyb290KTsKKwlidHJmc19zZXRfcm9vdF9sYXN0X3NuYXBzaG90KCZyb290LT5yb290X2l0ZW0sIHRyYW5zLT50cmFuc2lkKTsKKwltZW1jcHkobmV3X3Jvb3RfaXRlbSwgJnJvb3QtPnJvb3RfaXRlbSwgc2l6ZW9mKCpuZXdfcm9vdF9pdGVtKSk7CisKKwlrZXkub2JqZWN0aWQgPSBvYmplY3RpZDsKKwlrZXkub2Zmc2V0ID0gdHJhbnMtPnRyYW5zaWQ7CisJYnRyZnNfc2V0X2tleV90eXBlKCZrZXksIEJUUkZTX1JPT1RfSVRFTV9LRVkpOworCisJb2xkID0gYnRyZnNfbG9ja19yb290X25vZGUocm9vdCk7CisJYnRyZnNfY293X2Jsb2NrKHRyYW5zLCByb290LCBvbGQsIE5VTEwsIDAsICZvbGQsIDApOworCisJYnRyZnNfY29weV9yb290KHRyYW5zLCByb290LCBvbGQsICZ0bXAsIG9iamVjdGlkKTsKKwlidHJmc190cmVlX3VubG9jayhvbGQpOworCWZyZWVfZXh0ZW50X2J1ZmZlcihvbGQpOworCisJYnRyZnNfc2V0X3Jvb3RfYnl0ZW5yKG5ld19yb290X2l0ZW0sIHRtcC0+c3RhcnQpOworCWJ0cmZzX3NldF9yb290X2xldmVsKG5ld19yb290X2l0ZW0sIGJ0cmZzX2hlYWRlcl9sZXZlbCh0bXApKTsKKwlidHJmc19zZXRfcm9vdF9nZW5lcmF0aW9uKG5ld19yb290X2l0ZW0sIHRyYW5zLT50cmFuc2lkKTsKKwlyZXQgPSBidHJmc19pbnNlcnRfcm9vdCh0cmFucywgcm9vdC0+ZnNfaW5mby0+dHJlZV9yb290LCAma2V5LAorCQkJCW5ld19yb290X2l0ZW0pOworCWJ0cmZzX3RyZWVfdW5sb2NrKHRtcCk7CisJZnJlZV9leHRlbnRfYnVmZmVyKHRtcCk7CisJaWYgKHJldCkKKwkJZ290byBmYWlsOworCisJa2V5Lm9mZnNldCA9ICh1NjQpLTE7CisJbWVtY3B5KCZwZW5kaW5nLT5yb290X2tleSwgJmtleSwgc2l6ZW9mKGtleSkpOworZmFpbDoKKwlrZnJlZShuZXdfcm9vdF9pdGVtKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgbm9pbmxpbmUgaW50IGZpbmlzaF9wZW5kaW5nX3NuYXBzaG90KHN0cnVjdCBidHJmc19mc19pbmZvICpmc19pbmZvLAorCQkJCSAgIHN0cnVjdCBidHJmc19wZW5kaW5nX3NuYXBzaG90ICpwZW5kaW5nKQoreworCWludCByZXQ7CisJaW50IG5hbWVsZW47CisJdTY0IGluZGV4ID0gMDsKKwlzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFuczsKKwlzdHJ1Y3QgaW5vZGUgKnBhcmVudF9pbm9kZTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCXN0cnVjdCBidHJmc19yb290ICpwYXJlbnRfcm9vdDsKKworCXBhcmVudF9pbm9kZSA9IHBlbmRpbmctPmRlbnRyeS0+ZF9wYXJlbnQtPmRfaW5vZGU7CisJcGFyZW50X3Jvb3QgPSBCVFJGU19JKHBhcmVudF9pbm9kZSktPnJvb3Q7CisJdHJhbnMgPSBidHJmc19qb2luX3RyYW5zYWN0aW9uKHBhcmVudF9yb290LCAxKTsKKworCS8qCisJICogaW5zZXJ0IHRoZSBkaXJlY3RvcnkgaXRlbQorCSAqLworCW5hbWVsZW4gPSBzdHJsZW4ocGVuZGluZy0+bmFtZSk7CisJcmV0ID0gYnRyZnNfc2V0X2lub2RlX2luZGV4KHBhcmVudF9pbm9kZSwgJmluZGV4KTsKKwlyZXQgPSBidHJmc19pbnNlcnRfZGlyX2l0ZW0odHJhbnMsIHBhcmVudF9yb290LAorCQkJICAgIHBlbmRpbmctPm5hbWUsIG5hbWVsZW4sCisJCQkgICAgcGFyZW50X2lub2RlLT5pX2lubywKKwkJCSAgICAmcGVuZGluZy0+cm9vdF9rZXksIEJUUkZTX0ZUX0RJUiwgaW5kZXgpOworCisJaWYgKHJldCkKKwkJZ290byBmYWlsOworCisJYnRyZnNfaV9zaXplX3dyaXRlKHBhcmVudF9pbm9kZSwgcGFyZW50X2lub2RlLT5pX3NpemUgKyBuYW1lbGVuICogMik7CisJcmV0ID0gYnRyZnNfdXBkYXRlX2lub2RlKHRyYW5zLCBwYXJlbnRfcm9vdCwgcGFyZW50X2lub2RlKTsKKwlCVUdfT04ocmV0KTsKKworCS8qIGFkZCB0aGUgYmFja3JlZiBmaXJzdCAqLworCXJldCA9IGJ0cmZzX2FkZF9yb290X3JlZih0cmFucywgcGFyZW50X3Jvb3QtPmZzX2luZm8tPnRyZWVfcm9vdCwKKwkJCQkgcGVuZGluZy0+cm9vdF9rZXkub2JqZWN0aWQsCisJCQkJIEJUUkZTX1JPT1RfQkFDS1JFRl9LRVksCisJCQkJIHBhcmVudF9yb290LT5yb290X2tleS5vYmplY3RpZCwKKwkJCQkgcGFyZW50X2lub2RlLT5pX2lubywgaW5kZXgsIHBlbmRpbmctPm5hbWUsCisJCQkJIG5hbWVsZW4pOworCisJQlVHX09OKHJldCk7CisKKwkvKiBub3cgYWRkIHRoZSBmb3J3YXJkIHJlZiAqLworCXJldCA9IGJ0cmZzX2FkZF9yb290X3JlZih0cmFucywgcGFyZW50X3Jvb3QtPmZzX2luZm8tPnRyZWVfcm9vdCwKKwkJCQkgcGFyZW50X3Jvb3QtPnJvb3Rfa2V5Lm9iamVjdGlkLAorCQkJCSBCVFJGU19ST09UX1JFRl9LRVksCisJCQkJIHBlbmRpbmctPnJvb3Rfa2V5Lm9iamVjdGlkLAorCQkJCSBwYXJlbnRfaW5vZGUtPmlfaW5vLCBpbmRleCwgcGVuZGluZy0+bmFtZSwKKwkJCQkgbmFtZWxlbik7CisKKwlpbm9kZSA9IGJ0cmZzX2xvb2t1cF9kZW50cnkocGFyZW50X2lub2RlLCBwZW5kaW5nLT5kZW50cnkpOworCWRfaW5zdGFudGlhdGUocGVuZGluZy0+ZGVudHJ5LCBpbm9kZSk7CitmYWlsOgorCWJ0cmZzX2VuZF90cmFuc2FjdGlvbih0cmFucywgZnNfaW5mby0+ZnNfcm9vdCk7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIGNyZWF0ZSBhbGwgdGhlIHNuYXBzaG90cyB3ZSd2ZSBzY2hlZHVsZWQgZm9yIGNyZWF0aW9uCisgKi8KK3N0YXRpYyBub2lubGluZSBpbnQgY3JlYXRlX3BlbmRpbmdfc25hcHNob3RzKHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAorCQkJCQkgICAgIHN0cnVjdCBidHJmc19mc19pbmZvICpmc19pbmZvKQoreworCXN0cnVjdCBidHJmc19wZW5kaW5nX3NuYXBzaG90ICpwZW5kaW5nOworCXN0cnVjdCBsaXN0X2hlYWQgKmhlYWQgPSAmdHJhbnMtPnRyYW5zYWN0aW9uLT5wZW5kaW5nX3NuYXBzaG90czsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpjdXI7CisJaW50IHJldDsKKworCWxpc3RfZm9yX2VhY2goY3VyLCBoZWFkKSB7CisJCXBlbmRpbmcgPSBsaXN0X2VudHJ5KGN1ciwgc3RydWN0IGJ0cmZzX3BlbmRpbmdfc25hcHNob3QsIGxpc3QpOworCQlyZXQgPSBjcmVhdGVfcGVuZGluZ19zbmFwc2hvdCh0cmFucywgZnNfaW5mbywgcGVuZGluZyk7CisJCUJVR19PTihyZXQpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIG5vaW5saW5lIGludCBmaW5pc2hfcGVuZGluZ19zbmFwc2hvdHMoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCisJCQkJCSAgICAgc3RydWN0IGJ0cmZzX2ZzX2luZm8gKmZzX2luZm8pCit7CisJc3RydWN0IGJ0cmZzX3BlbmRpbmdfc25hcHNob3QgKnBlbmRpbmc7CisJc3RydWN0IGxpc3RfaGVhZCAqaGVhZCA9ICZ0cmFucy0+dHJhbnNhY3Rpb24tPnBlbmRpbmdfc25hcHNob3RzOworCWludCByZXQ7CisKKwl3aGlsZSAoIWxpc3RfZW1wdHkoaGVhZCkpIHsKKwkJcGVuZGluZyA9IGxpc3RfZW50cnkoaGVhZC0+bmV4dCwKKwkJCQkgICAgIHN0cnVjdCBidHJmc19wZW5kaW5nX3NuYXBzaG90LCBsaXN0KTsKKwkJcmV0ID0gZmluaXNoX3BlbmRpbmdfc25hcHNob3QoZnNfaW5mbywgcGVuZGluZyk7CisJCUJVR19PTihyZXQpOworCQlsaXN0X2RlbCgmcGVuZGluZy0+bGlzdCk7CisJCWtmcmVlKHBlbmRpbmctPm5hbWUpOworCQlrZnJlZShwZW5kaW5nKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK2ludCBidHJmc19jb21taXRfdHJhbnNhY3Rpb24oc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCisJCQkgICAgIHN0cnVjdCBidHJmc19yb290ICpyb290KQoreworCXVuc2lnbmVkIGxvbmcgam9pbmVkID0gMDsKKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQgPSAxOworCXN0cnVjdCBidHJmc190cmFuc2FjdGlvbiAqY3VyX3RyYW5zOworCXN0cnVjdCBidHJmc190cmFuc2FjdGlvbiAqcHJldl90cmFucyA9IE5VTEw7CisJc3RydWN0IGJ0cmZzX3Jvb3QgKmNodW5rX3Jvb3QgPSByb290LT5mc19pbmZvLT5jaHVua19yb290OworCXN0cnVjdCBsaXN0X2hlYWQgZGlydHlfZnNfcm9vdHM7CisJc3RydWN0IGV4dGVudF9pb190cmVlICpwaW5uZWRfY29weTsKKwlERUZJTkVfV0FJVCh3YWl0KTsKKwlpbnQgcmV0OworCisJSU5JVF9MSVNUX0hFQUQoJmRpcnR5X2ZzX3Jvb3RzKTsKKwltdXRleF9sb2NrKCZyb290LT5mc19pbmZvLT50cmFuc19tdXRleCk7CisJaWYgKHRyYW5zLT50cmFuc2FjdGlvbi0+aW5fY29tbWl0KSB7CisJCWN1cl90cmFucyA9IHRyYW5zLT50cmFuc2FjdGlvbjsKKwkJdHJhbnMtPnRyYW5zYWN0aW9uLT51c2VfY291bnQrKzsKKwkJbXV0ZXhfdW5sb2NrKCZyb290LT5mc19pbmZvLT50cmFuc19tdXRleCk7CisJCWJ0cmZzX2VuZF90cmFuc2FjdGlvbih0cmFucywgcm9vdCk7CisKKwkJcmV0ID0gd2FpdF9mb3JfY29tbWl0KHJvb3QsIGN1cl90cmFucyk7CisJCUJVR19PTihyZXQpOworCisJCW11dGV4X2xvY2soJnJvb3QtPmZzX2luZm8tPnRyYW5zX211dGV4KTsKKwkJcHV0X3RyYW5zYWN0aW9uKGN1cl90cmFucyk7CisJCW11dGV4X3VubG9jaygmcm9vdC0+ZnNfaW5mby0+dHJhbnNfbXV0ZXgpOworCisJCXJldHVybiAwOworCX0KKworCXBpbm5lZF9jb3B5ID0ga21hbGxvYyhzaXplb2YoKnBpbm5lZF9jb3B5KSwgR0ZQX05PRlMpOworCWlmICghcGlubmVkX2NvcHkpCisJCXJldHVybiAtRU5PTUVNOworCisJZXh0ZW50X2lvX3RyZWVfaW5pdChwaW5uZWRfY29weSwKKwkJCSAgICAgcm9vdC0+ZnNfaW5mby0+YnRyZWVfaW5vZGUtPmlfbWFwcGluZywgR0ZQX05PRlMpOworCisJdHJhbnMtPnRyYW5zYWN0aW9uLT5pbl9jb21taXQgPSAxOworCXRyYW5zLT50cmFuc2FjdGlvbi0+YmxvY2tlZCA9IDE7CisJY3VyX3RyYW5zID0gdHJhbnMtPnRyYW5zYWN0aW9uOworCWlmIChjdXJfdHJhbnMtPmxpc3QucHJldiAhPSAmcm9vdC0+ZnNfaW5mby0+dHJhbnNfbGlzdCkgeworCQlwcmV2X3RyYW5zID0gbGlzdF9lbnRyeShjdXJfdHJhbnMtPmxpc3QucHJldiwKKwkJCQkJc3RydWN0IGJ0cmZzX3RyYW5zYWN0aW9uLCBsaXN0KTsKKwkJaWYgKCFwcmV2X3RyYW5zLT5jb21taXRfZG9uZSkgeworCQkJcHJldl90cmFucy0+dXNlX2NvdW50Kys7CisJCQltdXRleF91bmxvY2soJnJvb3QtPmZzX2luZm8tPnRyYW5zX211dGV4KTsKKworCQkJd2FpdF9mb3JfY29tbWl0KHJvb3QsIHByZXZfdHJhbnMpOworCisJCQltdXRleF9sb2NrKCZyb290LT5mc19pbmZvLT50cmFuc19tdXRleCk7CisJCQlwdXRfdHJhbnNhY3Rpb24ocHJldl90cmFucyk7CisJCX0KKwl9CisKKwlkbyB7CisJCWludCBzbmFwX3BlbmRpbmcgPSAwOworCQlqb2luZWQgPSBjdXJfdHJhbnMtPm51bV9qb2luZWQ7CisJCWlmICghbGlzdF9lbXB0eSgmdHJhbnMtPnRyYW5zYWN0aW9uLT5wZW5kaW5nX3NuYXBzaG90cykpCisJCQlzbmFwX3BlbmRpbmcgPSAxOworCisJCVdBUk5fT04oY3VyX3RyYW5zICE9IHRyYW5zLT50cmFuc2FjdGlvbik7CisJCXByZXBhcmVfdG9fd2FpdCgmY3VyX3RyYW5zLT53cml0ZXJfd2FpdCwgJndhaXQsCisJCQkJVEFTS19VTklOVEVSUlVQVElCTEUpOworCisJCWlmIChjdXJfdHJhbnMtPm51bV93cml0ZXJzID4gMSkKKwkJCXRpbWVvdXQgPSBNQVhfU0NIRURVTEVfVElNRU9VVDsKKwkJZWxzZQorCQkJdGltZW91dCA9IDE7CisKKwkJbXV0ZXhfdW5sb2NrKCZyb290LT5mc19pbmZvLT50cmFuc19tdXRleCk7CisKKwkJaWYgKHNuYXBfcGVuZGluZykgeworCQkJcmV0ID0gYnRyZnNfd2FpdF9vcmRlcmVkX2V4dGVudHMocm9vdCwgMSk7CisJCQlCVUdfT04ocmV0KTsKKwkJfQorCisJCXNjaGVkdWxlX3RpbWVvdXQodGltZW91dCk7CisKKwkJbXV0ZXhfbG9jaygmcm9vdC0+ZnNfaW5mby0+dHJhbnNfbXV0ZXgpOworCQlmaW5pc2hfd2FpdCgmY3VyX3RyYW5zLT53cml0ZXJfd2FpdCwgJndhaXQpOworCX0gd2hpbGUgKGN1cl90cmFucy0+bnVtX3dyaXRlcnMgPiAxIHx8CisJCSAoY3VyX3RyYW5zLT5udW1fam9pbmVkICE9IGpvaW5lZCkpOworCisJcmV0ID0gY3JlYXRlX3BlbmRpbmdfc25hcHNob3RzKHRyYW5zLCByb290LT5mc19pbmZvKTsKKwlCVUdfT04ocmV0KTsKKworCVdBUk5fT04oY3VyX3RyYW5zICE9IHRyYW5zLT50cmFuc2FjdGlvbik7CisKKwkvKiBidHJmc19jb21taXRfdHJlZV9yb290cyBpcyByZXNwb25zaWJsZSBmb3IgZ2V0dGluZyB0aGUKKwkgKiB2YXJpb3VzIHJvb3RzIGNvbnNpc3RlbnQgd2l0aCBlYWNoIG90aGVyLiAgRXZlcnkgcG9pbnRlcgorCSAqIGluIHRoZSB0cmVlIG9mIHRyZWUgcm9vdHMgaGFzIHRvIHBvaW50IHRvIHRoZSBtb3N0IHVwIHRvIGRhdGUKKwkgKiByb290IGZvciBldmVyeSBzdWJ2b2x1bWUgYW5kIG90aGVyIHRyZWUuICBTbywgd2UgaGF2ZSB0byBrZWVwCisJICogdGhlIHRyZWUgbG9nZ2luZyBjb2RlIGZyb20ganVtcGluZyBpbiBhbmQgY2hhbmdpbmcgYW55CisJICogb2YgdGhlIHRyZWVzLgorCSAqCisJICogQXQgdGhpcyBwb2ludCBpbiB0aGUgY29tbWl0LCB0aGVyZSBjYW4ndCBiZSBhbnkgdHJlZS1sb2cKKwkgKiB3cml0ZXJzLCBidXQgYSBsaXR0bGUgbG93ZXIgZG93biB3ZSBkcm9wIHRoZSB0cmFucyBtdXRleAorCSAqIGFuZCBsZXQgbmV3IHBlb3BsZSBpbi4gIEJ5IGhvbGRpbmcgdGhlIHRyZWVfbG9nX211dGV4CisJICogZnJvbSBub3cgdW50aWwgYWZ0ZXIgdGhlIHN1cGVyIGlzIHdyaXR0ZW4sIHdlIGF2b2lkIHJhY2VzCisJICogd2l0aCB0aGUgdHJlZS1sb2cgY29kZS4KKwkgKi8KKwltdXRleF9sb2NrKCZyb290LT5mc19pbmZvLT50cmVlX2xvZ19tdXRleCk7CisJLyoKKwkgKiBrZWVwIHRyZWUgcmVsb2MgY29kZSBmcm9tIGFkZGluZyBuZXcgcmVsb2MgdHJlZXMKKwkgKi8KKwltdXRleF9sb2NrKCZyb290LT5mc19pbmZvLT50cmVlX3JlbG9jX211dGV4KTsKKworCisJcmV0ID0gYWRkX2RpcnR5X3Jvb3RzKHRyYW5zLCAmcm9vdC0+ZnNfaW5mby0+ZnNfcm9vdHNfcmFkaXgsCisJCQkgICAgICAmZGlydHlfZnNfcm9vdHMpOworCUJVR19PTihyZXQpOworCisJLyogYWRkX2RpcnR5X3Jvb3RzIGdldHMgcmlkIG9mIGFsbCB0aGUgdHJlZSBsb2cgcm9vdHMsIGl0IGlzIG5vdworCSAqIHNhZmUgdG8gZnJlZSB0aGUgcm9vdCBvZiB0cmVlIGxvZyByb290cworCSAqLworCWJ0cmZzX2ZyZWVfbG9nX3Jvb3RfdHJlZSh0cmFucywgcm9vdC0+ZnNfaW5mbyk7CisKKwlyZXQgPSBidHJmc19jb21taXRfdHJlZV9yb290cyh0cmFucywgcm9vdCk7CisJQlVHX09OKHJldCk7CisKKwljdXJfdHJhbnMgPSByb290LT5mc19pbmZvLT5ydW5uaW5nX3RyYW5zYWN0aW9uOworCXNwaW5fbG9jaygmcm9vdC0+ZnNfaW5mby0+bmV3X3RyYW5zX2xvY2spOworCXJvb3QtPmZzX2luZm8tPnJ1bm5pbmdfdHJhbnNhY3Rpb24gPSBOVUxMOworCXNwaW5fdW5sb2NrKCZyb290LT5mc19pbmZvLT5uZXdfdHJhbnNfbG9jayk7CisJYnRyZnNfc2V0X3N1cGVyX2dlbmVyYXRpb24oJnJvb3QtPmZzX2luZm8tPnN1cGVyX2NvcHksCisJCQkJICAgY3VyX3RyYW5zLT50cmFuc2lkKTsKKwlidHJmc19zZXRfc3VwZXJfcm9vdCgmcm9vdC0+ZnNfaW5mby0+c3VwZXJfY29weSwKKwkJCSAgICAgcm9vdC0+ZnNfaW5mby0+dHJlZV9yb290LT5ub2RlLT5zdGFydCk7CisJYnRyZnNfc2V0X3N1cGVyX3Jvb3RfbGV2ZWwoJnJvb3QtPmZzX2luZm8tPnN1cGVyX2NvcHksCisJCQkgICBidHJmc19oZWFkZXJfbGV2ZWwocm9vdC0+ZnNfaW5mby0+dHJlZV9yb290LT5ub2RlKSk7CisKKwlidHJmc19zZXRfc3VwZXJfY2h1bmtfcm9vdCgmcm9vdC0+ZnNfaW5mby0+c3VwZXJfY29weSwKKwkJCQkgICBjaHVua19yb290LT5ub2RlLT5zdGFydCk7CisJYnRyZnNfc2V0X3N1cGVyX2NodW5rX3Jvb3RfbGV2ZWwoJnJvb3QtPmZzX2luZm8tPnN1cGVyX2NvcHksCisJCQkJCSBidHJmc19oZWFkZXJfbGV2ZWwoY2h1bmtfcm9vdC0+bm9kZSkpOworCWJ0cmZzX3NldF9zdXBlcl9jaHVua19yb290X2dlbmVyYXRpb24oJnJvb3QtPmZzX2luZm8tPnN1cGVyX2NvcHksCisJCQkJYnRyZnNfaGVhZGVyX2dlbmVyYXRpb24oY2h1bmtfcm9vdC0+bm9kZSkpOworCisJaWYgKCFyb290LT5mc19pbmZvLT5sb2dfcm9vdF9yZWNvdmVyaW5nKSB7CisJCWJ0cmZzX3NldF9zdXBlcl9sb2dfcm9vdCgmcm9vdC0+ZnNfaW5mby0+c3VwZXJfY29weSwgMCk7CisJCWJ0cmZzX3NldF9zdXBlcl9sb2dfcm9vdF9sZXZlbCgmcm9vdC0+ZnNfaW5mby0+c3VwZXJfY29weSwgMCk7CisJfQorCisJbWVtY3B5KCZyb290LT5mc19pbmZvLT5zdXBlcl9mb3JfY29tbWl0LCAmcm9vdC0+ZnNfaW5mby0+c3VwZXJfY29weSwKKwkgICAgICAgc2l6ZW9mKHJvb3QtPmZzX2luZm8tPnN1cGVyX2NvcHkpKTsKKworCWJ0cmZzX2NvcHlfcGlubmVkKHJvb3QsIHBpbm5lZF9jb3B5KTsKKworCXRyYW5zLT50cmFuc2FjdGlvbi0+YmxvY2tlZCA9IDA7CisJd2FrZV91cCgmcm9vdC0+ZnNfaW5mby0+dHJhbnNhY3Rpb25fdGhyb3R0bGUpOworCXdha2VfdXAoJnJvb3QtPmZzX2luZm8tPnRyYW5zYWN0aW9uX3dhaXQpOworCisJbXV0ZXhfdW5sb2NrKCZyb290LT5mc19pbmZvLT50cmFuc19tdXRleCk7CisJcmV0ID0gYnRyZnNfd3JpdGVfYW5kX3dhaXRfdHJhbnNhY3Rpb24odHJhbnMsIHJvb3QpOworCUJVR19PTihyZXQpOworCXdyaXRlX2N0cmVlX3N1cGVyKHRyYW5zLCByb290LCAwKTsKKworCS8qCisJICogdGhlIHN1cGVyIGlzIHdyaXR0ZW4sIHdlIGNhbiBzYWZlbHkgYWxsb3cgdGhlIHRyZWUtbG9nZ2VycworCSAqIHRvIGdvIGFib3V0IHRoZWlyIGJ1c2luZXNzCisJICovCisJbXV0ZXhfdW5sb2NrKCZyb290LT5mc19pbmZvLT50cmVlX2xvZ19tdXRleCk7CisKKwlidHJmc19maW5pc2hfZXh0ZW50X2NvbW1pdCh0cmFucywgcm9vdCwgcGlubmVkX2NvcHkpOworCWtmcmVlKHBpbm5lZF9jb3B5KTsKKworCWJ0cmZzX2Ryb3BfZGVhZF9yZWxvY19yb290cyhyb290KTsKKwltdXRleF91bmxvY2soJnJvb3QtPmZzX2luZm8tPnRyZWVfcmVsb2NfbXV0ZXgpOworCisJLyogZG8gdGhlIGRpcmVjdG9yeSBpbnNlcnRzIG9mIGFueSBwZW5kaW5nIHNuYXBzaG90IGNyZWF0aW9ucyAqLworCWZpbmlzaF9wZW5kaW5nX3NuYXBzaG90cyh0cmFucywgcm9vdC0+ZnNfaW5mbyk7CisKKwltdXRleF9sb2NrKCZyb290LT5mc19pbmZvLT50cmFuc19tdXRleCk7CisKKwljdXJfdHJhbnMtPmNvbW1pdF9kb25lID0gMTsKKwlyb290LT5mc19pbmZvLT5sYXN0X3RyYW5zX2NvbW1pdHRlZCA9IGN1cl90cmFucy0+dHJhbnNpZDsKKwl3YWtlX3VwKCZjdXJfdHJhbnMtPmNvbW1pdF93YWl0KTsKKworCXB1dF90cmFuc2FjdGlvbihjdXJfdHJhbnMpOworCXB1dF90cmFuc2FjdGlvbihjdXJfdHJhbnMpOworCisJbGlzdF9zcGxpY2VfaW5pdCgmZGlydHlfZnNfcm9vdHMsICZyb290LT5mc19pbmZvLT5kZWFkX3Jvb3RzKTsKKwlpZiAocm9vdC0+ZnNfaW5mby0+Y2xvc2luZykKKwkJbGlzdF9zcGxpY2VfaW5pdCgmcm9vdC0+ZnNfaW5mby0+ZGVhZF9yb290cywgJmRpcnR5X2ZzX3Jvb3RzKTsKKworCW11dGV4X3VubG9jaygmcm9vdC0+ZnNfaW5mby0+dHJhbnNfbXV0ZXgpOworCisJa21lbV9jYWNoZV9mcmVlKGJ0cmZzX3RyYW5zX2hhbmRsZV9jYWNoZXAsIHRyYW5zKTsKKworCWlmIChyb290LT5mc19pbmZvLT5jbG9zaW5nKQorCQlkcm9wX2RpcnR5X3Jvb3RzKHJvb3QtPmZzX2luZm8tPnRyZWVfcm9vdCwgJmRpcnR5X2ZzX3Jvb3RzKTsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogaW50ZXJmYWNlIGZ1bmN0aW9uIHRvIGRlbGV0ZSBhbGwgdGhlIHNuYXBzaG90cyB3ZSBoYXZlIHNjaGVkdWxlZCBmb3IgZGVsZXRpb24KKyAqLworaW50IGJ0cmZzX2NsZWFuX29sZF9zbmFwc2hvdHMoc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QpCit7CisJc3RydWN0IGxpc3RfaGVhZCBkaXJ0eV9yb290czsKKwlJTklUX0xJU1RfSEVBRCgmZGlydHlfcm9vdHMpOworYWdhaW46CisJbXV0ZXhfbG9jaygmcm9vdC0+ZnNfaW5mby0+dHJhbnNfbXV0ZXgpOworCWxpc3Rfc3BsaWNlX2luaXQoJnJvb3QtPmZzX2luZm8tPmRlYWRfcm9vdHMsICZkaXJ0eV9yb290cyk7CisJbXV0ZXhfdW5sb2NrKCZyb290LT5mc19pbmZvLT50cmFuc19tdXRleCk7CisKKwlpZiAoIWxpc3RfZW1wdHkoJmRpcnR5X3Jvb3RzKSkgeworCQlkcm9wX2RpcnR5X3Jvb3RzKHJvb3QsICZkaXJ0eV9yb290cyk7CisJCWdvdG8gYWdhaW47CisJfQorCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZnMvYnRyZnMvdHJhbnNhY3Rpb24uaCBiL2ZzL2J0cmZzL3RyYW5zYWN0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWEyOTIxMQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2J0cmZzL3RyYW5zYWN0aW9uLmgKQEAgLTAsMCArMSwxMDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgT3JhY2xlLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgdjIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKKyAqIEJvc3RvbiwgTUEgMDIxMTEwLTEzMDcsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fQlRSRlNfVFJBTlNBQ1RJT05fXworI2RlZmluZSBfX0JUUkZTX1RSQU5TQUNUSU9OX18KKyNpbmNsdWRlICJidHJmc19pbm9kZS5oIgorCitzdHJ1Y3QgYnRyZnNfdHJhbnNhY3Rpb24geworCXU2NCB0cmFuc2lkOworCXVuc2lnbmVkIGxvbmcgbnVtX3dyaXRlcnM7CisJdW5zaWduZWQgbG9uZyBudW1fam9pbmVkOworCWludCBpbl9jb21taXQ7CisJaW50IHVzZV9jb3VudDsKKwlpbnQgY29tbWl0X2RvbmU7CisJaW50IGJsb2NrZWQ7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCXN0cnVjdCBleHRlbnRfaW9fdHJlZSBkaXJ0eV9wYWdlczsKKwl1bnNpZ25lZCBsb25nIHN0YXJ0X3RpbWU7CisJd2FpdF9xdWV1ZV9oZWFkX3Qgd3JpdGVyX3dhaXQ7CisJd2FpdF9xdWV1ZV9oZWFkX3QgY29tbWl0X3dhaXQ7CisJc3RydWN0IGxpc3RfaGVhZCBwZW5kaW5nX3NuYXBzaG90czsKK307CisKK3N0cnVjdCBidHJmc190cmFuc19oYW5kbGUgeworCXU2NCB0cmFuc2lkOworCXVuc2lnbmVkIGxvbmcgYmxvY2tzX3Jlc2VydmVkOworCXVuc2lnbmVkIGxvbmcgYmxvY2tzX3VzZWQ7CisJc3RydWN0IGJ0cmZzX3RyYW5zYWN0aW9uICp0cmFuc2FjdGlvbjsKKwl1NjQgYmxvY2tfZ3JvdXA7CisJdTY0IGFsbG9jX2V4Y2x1ZGVfc3RhcnQ7CisJdTY0IGFsbG9jX2V4Y2x1ZGVfbnI7Cit9OworCitzdHJ1Y3QgYnRyZnNfcGVuZGluZ19zbmFwc2hvdCB7CisJc3RydWN0IGRlbnRyeSAqZGVudHJ5OworCXN0cnVjdCBidHJmc19yb290ICpyb290OworCWNoYXIgKm5hbWU7CisJc3RydWN0IGJ0cmZzX2tleSByb290X2tleTsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Cit9OworCitzdHJ1Y3QgYnRyZnNfZGlydHlfcm9vdCB7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCXN0cnVjdCBidHJmc19yb290ICpyb290OworCXN0cnVjdCBidHJmc19yb290ICpsYXRlc3Rfcm9vdDsKK307CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBidHJmc19zZXRfdHJhbnNfYmxvY2tfZ3JvdXAoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCisJCQkJCSAgICAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXRyYW5zLT5ibG9ja19ncm91cCA9IEJUUkZTX0koaW5vZGUpLT5ibG9ja19ncm91cDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGJ0cmZzX3VwZGF0ZV9pbm9kZV9ibG9ja19ncm91cCgKKwkJCQkJICBzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKKwkJCQkJICBzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCUJUUkZTX0koaW5vZGUpLT5ibG9ja19ncm91cCA9IHRyYW5zLT5ibG9ja19ncm91cDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGJ0cmZzX3NldF9pbm9kZV9sYXN0X3RyYW5zKHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAorCQkJCQkgICAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCUJUUkZTX0koaW5vZGUpLT5sYXN0X3RyYW5zID0gdHJhbnMtPnRyYW5zYWN0aW9uLT50cmFuc2lkOworfQorCitpbnQgYnRyZnNfZW5kX3RyYW5zYWN0aW9uKHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAorCQkJICBzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCk7CitzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICpidHJmc19zdGFydF90cmFuc2FjdGlvbihzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwKKwkJCQkJCSAgIGludCBudW1fYmxvY2tzKTsKK3N0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKmJ0cmZzX2pvaW5fdHJhbnNhY3Rpb24oc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsCisJCQkJCQkgICBpbnQgbnVtX2Jsb2Nrcyk7CitzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICpidHJmc19zdGFydF9pb2N0bF90cmFuc2FjdGlvbihzdHJ1Y3QgYnRyZnNfcm9vdCAqciwKKwkJCQkJCSAgIGludCBudW1fYmxvY2tzKTsKK2ludCBidHJmc193cml0ZV9hbmRfd2FpdF90cmFuc2FjdGlvbihzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKKwkJCQkgICAgIHN0cnVjdCBidHJmc19yb290ICpyb290KTsKK2ludCBidHJmc19jb21taXRfdHJlZV9yb290cyhzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKKwkJCSAgICBzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCk7CisKK2ludCBidHJmc19hZGRfZGVhZF9yb290KHN0cnVjdCBidHJmc19yb290ICpyb290LCBzdHJ1Y3QgYnRyZnNfcm9vdCAqbGF0ZXN0KTsKK2ludCBidHJmc19kZWZyYWdfcm9vdChzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwgaW50IGNhY2hlb25seSk7CitpbnQgYnRyZnNfY2xlYW5fb2xkX3NuYXBzaG90cyhzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCk7CitpbnQgYnRyZnNfY29tbWl0X3RyYW5zYWN0aW9uKHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAorCQkJICAgICBzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCk7CitpbnQgYnRyZnNfZW5kX3RyYW5zYWN0aW9uX3Rocm90dGxlKHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAorCQkJCSAgIHN0cnVjdCBidHJmc19yb290ICpyb290KTsKK3ZvaWQgYnRyZnNfdGhyb3R0bGUoc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QpOworaW50IGJ0cmZzX3JlY29yZF9yb290X2luX3RyYW5zKHN0cnVjdCBidHJmc19yb290ICpyb290KTsKK2ludCBidHJmc193cml0ZV9hbmRfd2FpdF9tYXJrZWRfZXh0ZW50cyhzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwKKwkJCQkJc3RydWN0IGV4dGVudF9pb190cmVlICpkaXJ0eV9wYWdlcyk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2ZzL2J0cmZzL3RyZWUtZGVmcmFnLmMgYi9mcy9idHJmcy90cmVlLWRlZnJhZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlODM1OGMKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9idHJmcy90cmVlLWRlZnJhZy5jCkBAIC0wLDAgKzEsMTQ3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE9yYWNsZS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIHYyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCisgKiBCb3N0b24sIE1BIDAyMTExMC0xMzA3LCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSAiY3RyZWUuaCIKKyNpbmNsdWRlICJkaXNrLWlvLmgiCisjaW5jbHVkZSAicHJpbnQtdHJlZS5oIgorI2luY2x1ZGUgInRyYW5zYWN0aW9uLmgiCisjaW5jbHVkZSAibG9ja2luZy5oIgorCisvKiBkZWZyYWcgYWxsIHRoZSBsZWF2ZXMgaW4gYSBnaXZlbiBidHJlZS4gIElmIGNhY2hlX29ubHkgPT0gMSwgZG9uJ3QgcmVhZAorICogdGhpbmdzIGZyb20gZGlzaywgb3RoZXJ3aXNlIHJlYWQgYWxsIHRoZSBsZWF2ZXMgYW5kIHRyeSB0byBnZXQga2V5IG9yZGVyIHRvCisgKiBiZXR0ZXIgcmVmbGVjdCBkaXNrIG9yZGVyCisgKi8KKworaW50IGJ0cmZzX2RlZnJhZ19sZWF2ZXMoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCisJCQlzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwgaW50IGNhY2hlX29ubHkpCit7CisJc3RydWN0IGJ0cmZzX3BhdGggKnBhdGggPSBOVUxMOworCXN0cnVjdCBidHJmc19rZXkga2V5OworCWludCByZXQgPSAwOworCWludCB3cmV0OworCWludCBsZXZlbDsKKwlpbnQgb3JpZ19sZXZlbDsKKwlpbnQgaXNfZXh0ZW50ID0gMDsKKwlpbnQgbmV4dF9rZXlfcmV0ID0gMDsKKwl1NjQgbGFzdF9yZXQgPSAwOworCXU2NCBtaW5fdHJhbnMgPSAwOworCisJaWYgKGNhY2hlX29ubHkpCisJCWdvdG8gb3V0OworCisJaWYgKHJvb3QtPmZzX2luZm8tPmV4dGVudF9yb290ID09IHJvb3QpIHsKKwkJLyoKKwkJICogdGhlcmUncyByZWN1cnNpb24gaGVyZSByaWdodCBub3cgaW4gdGhlIHRyZWUgbG9ja2luZywKKwkJICogd2UgY2FuJ3QgZGVmcmFnIHRoZSBleHRlbnQgcm9vdCB3aXRob3V0IGRlYWRsb2NrCisJCSAqLworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAocm9vdC0+cmVmX2Nvd3MgPT0gMCAmJiAhaXNfZXh0ZW50KQorCQlnb3RvIG91dDsKKworCWlmIChidHJmc190ZXN0X29wdChyb290LCBTU0QpKQorCQlnb3RvIG91dDsKKworCXBhdGggPSBidHJmc19hbGxvY19wYXRoKCk7CisJaWYgKCFwYXRoKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWxldmVsID0gYnRyZnNfaGVhZGVyX2xldmVsKHJvb3QtPm5vZGUpOworCW9yaWdfbGV2ZWwgPSBsZXZlbDsKKworCWlmIChsZXZlbCA9PSAwKQorCQlnb3RvIG91dDsKKworCWlmIChyb290LT5kZWZyYWdfcHJvZ3Jlc3Mub2JqZWN0aWQgPT0gMCkgeworCQlzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqcm9vdF9ub2RlOworCQl1MzIgbnJpdGVtczsKKworCQlyb290X25vZGUgPSBidHJmc19sb2NrX3Jvb3Rfbm9kZShyb290KTsKKwkJbnJpdGVtcyA9IGJ0cmZzX2hlYWRlcl9ucml0ZW1zKHJvb3Rfbm9kZSk7CisJCXJvb3QtPmRlZnJhZ19tYXgub2JqZWN0aWQgPSAwOworCQkvKiBmcm9tIGFib3ZlIHdlIGtub3cgdGhpcyBpcyBub3QgYSBsZWFmICovCisJCWJ0cmZzX25vZGVfa2V5X3RvX2NwdShyb290X25vZGUsICZyb290LT5kZWZyYWdfbWF4LAorCQkJCSAgICAgIG5yaXRlbXMgLSAxKTsKKwkJYnRyZnNfdHJlZV91bmxvY2socm9vdF9ub2RlKTsKKwkJZnJlZV9leHRlbnRfYnVmZmVyKHJvb3Rfbm9kZSk7CisJCW1lbXNldCgma2V5LCAwLCBzaXplb2Yoa2V5KSk7CisJfSBlbHNlIHsKKwkJbWVtY3B5KCZrZXksICZyb290LT5kZWZyYWdfcHJvZ3Jlc3MsIHNpemVvZihrZXkpKTsKKwl9CisKKwlwYXRoLT5rZWVwX2xvY2tzID0gMTsKKwlpZiAoY2FjaGVfb25seSkKKwkJbWluX3RyYW5zID0gcm9vdC0+ZGVmcmFnX3RyYW5zX3N0YXJ0OworCisJcmV0ID0gYnRyZnNfc2VhcmNoX2ZvcndhcmQocm9vdCwgJmtleSwgTlVMTCwgcGF0aCwKKwkJCQkgICBjYWNoZV9vbmx5LCBtaW5fdHJhbnMpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dDsKKwlpZiAocmV0ID4gMCkgeworCQlyZXQgPSAwOworCQlnb3RvIG91dDsKKwl9CisJYnRyZnNfcmVsZWFzZV9wYXRoKHJvb3QsIHBhdGgpOworCXdyZXQgPSBidHJmc19zZWFyY2hfc2xvdCh0cmFucywgcm9vdCwgJmtleSwgcGF0aCwgMCwgMSk7CisKKwlpZiAod3JldCA8IDApIHsKKwkJcmV0ID0gd3JldDsKKwkJZ290byBvdXQ7CisJfQorCWlmICghcGF0aC0+bm9kZXNbMV0pIHsKKwkJcmV0ID0gMDsKKwkJZ290byBvdXQ7CisJfQorCXBhdGgtPnNsb3RzWzFdID0gYnRyZnNfaGVhZGVyX25yaXRlbXMocGF0aC0+bm9kZXNbMV0pOworCW5leHRfa2V5X3JldCA9IGJ0cmZzX2ZpbmRfbmV4dF9rZXkocm9vdCwgcGF0aCwgJmtleSwgMSwgY2FjaGVfb25seSwKKwkJCQkJICAgbWluX3RyYW5zKTsKKwlyZXQgPSBidHJmc19yZWFsbG9jX25vZGUodHJhbnMsIHJvb3QsCisJCQkJIHBhdGgtPm5vZGVzWzFdLCAwLAorCQkJCSBjYWNoZV9vbmx5LCAmbGFzdF9yZXQsCisJCQkJICZyb290LT5kZWZyYWdfcHJvZ3Jlc3MpOworCVdBUk5fT04ocmV0ICYmIHJldCAhPSAtRUFHQUlOKTsKKwlpZiAobmV4dF9rZXlfcmV0ID09IDApIHsKKwkJbWVtY3B5KCZyb290LT5kZWZyYWdfcHJvZ3Jlc3MsICZrZXksIHNpemVvZihrZXkpKTsKKwkJcmV0ID0gLUVBR0FJTjsKKwl9CisKKwlidHJmc19yZWxlYXNlX3BhdGgocm9vdCwgcGF0aCk7CisJaWYgKGlzX2V4dGVudCkKKwkJYnRyZnNfZXh0ZW50X3Bvc3Rfb3AodHJhbnMsIHJvb3QpOworb3V0OgorCWlmIChwYXRoKQorCQlidHJmc19mcmVlX3BhdGgocGF0aCk7CisJaWYgKHJldCA9PSAtRUFHQUlOKSB7CisJCWlmIChyb290LT5kZWZyYWdfbWF4Lm9iamVjdGlkID4gcm9vdC0+ZGVmcmFnX3Byb2dyZXNzLm9iamVjdGlkKQorCQkJZ290byBkb25lOworCQlpZiAocm9vdC0+ZGVmcmFnX21heC50eXBlID4gcm9vdC0+ZGVmcmFnX3Byb2dyZXNzLnR5cGUpCisJCQlnb3RvIGRvbmU7CisJCWlmIChyb290LT5kZWZyYWdfbWF4Lm9mZnNldCA+IHJvb3QtPmRlZnJhZ19wcm9ncmVzcy5vZmZzZXQpCisJCQlnb3RvIGRvbmU7CisJCXJldCA9IDA7CisJfQorZG9uZToKKwlpZiAocmV0ICE9IC1FQUdBSU4pIHsKKwkJbWVtc2V0KCZyb290LT5kZWZyYWdfcHJvZ3Jlc3MsIDAsCisJCSAgICAgICBzaXplb2Yocm9vdC0+ZGVmcmFnX3Byb2dyZXNzKSk7CisJCXJvb3QtPmRlZnJhZ190cmFuc19zdGFydCA9IHRyYW5zLT50cmFuc2lkOworCX0KKwlyZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvZnMvYnRyZnMvdHJlZS1sb2cuYyBiL2ZzL2J0cmZzL3RyZWUtbG9nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDgxY2RhMgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2J0cmZzL3RyZWUtbG9nLmMKQEAgLTAsMCArMSwyODk4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IE9yYWNsZS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIHYyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCisgKiBCb3N0b24sIE1BIDAyMTExMC0xMzA3LCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSAiY3RyZWUuaCIKKyNpbmNsdWRlICJ0cmFuc2FjdGlvbi5oIgorI2luY2x1ZGUgImRpc2staW8uaCIKKyNpbmNsdWRlICJsb2NraW5nLmgiCisjaW5jbHVkZSAicHJpbnQtdHJlZS5oIgorI2luY2x1ZGUgImNvbXBhdC5oIgorI2luY2x1ZGUgInRyZWUtbG9nLmgiCisKKy8qIG1hZ2ljIHZhbHVlcyBmb3IgdGhlIGlub2RlX29ubHkgZmllbGQgaW4gYnRyZnNfbG9nX2lub2RlOgorICoKKyAqIExPR19JTk9ERV9BTEwgbWVhbnMgdG8gbG9nIGV2ZXJ5dGhpbmcKKyAqIExPR19JTk9ERV9FWElTVFMgbWVhbnMgdG8gbG9nIGp1c3QgZW5vdWdoIHRvIHJlY3JlYXRlIHRoZSBpbm9kZQorICogZHVyaW5nIGxvZyByZXBsYXkKKyAqLworI2RlZmluZSBMT0dfSU5PREVfQUxMIDAKKyNkZWZpbmUgTE9HX0lOT0RFX0VYSVNUUyAxCisKKy8qCisgKiBzdGFnZXMgZm9yIHRoZSB0cmVlIHdhbGtpbmcuICBUaGUgZmlyc3QKKyAqIHN0YWdlICgwKSBpcyB0byBvbmx5IHBpbiBkb3duIHRoZSBibG9ja3Mgd2UgZmluZAorICogdGhlIHNlY29uZCBzdGFnZSAoMSkgaXMgdG8gbWFrZSBzdXJlIHRoYXQgYWxsIHRoZSBpbm9kZXMKKyAqIHdlIGZpbmQgaW4gdGhlIGxvZyBhcmUgY3JlYXRlZCBpbiB0aGUgc3Vidm9sdW1lLgorICoKKyAqIFRoZSBsYXN0IHN0YWdlIGlzIHRvIGRlYWwgd2l0aCBkaXJlY3RvcmllcyBhbmQgbGlua3MgYW5kIGV4dGVudHMKKyAqIGFuZCBhbGwgdGhlIG90aGVyIGZ1biBzZW1hbnRpY3MKKyAqLworI2RlZmluZSBMT0dfV0FMS19QSU5fT05MWSAwCisjZGVmaW5lIExPR19XQUxLX1JFUExBWV9JTk9ERVMgMQorI2RlZmluZSBMT0dfV0FMS19SRVBMQVlfQUxMIDIKKworc3RhdGljIGludCBfX2J0cmZzX2xvZ19pbm9kZShzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKKwkJCSAgICAgc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkgICAgIGludCBpbm9kZV9vbmx5KTsKK3N0YXRpYyBpbnQgbGlua190b19maXh1cF9kaXIoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCisJCQkgICAgIHN0cnVjdCBidHJmc19yb290ICpyb290LAorCQkJICAgICBzdHJ1Y3QgYnRyZnNfcGF0aCAqcGF0aCwgdTY0IG9iamVjdGlkKTsKKworLyoKKyAqIHRyZWUgbG9nZ2luZyBpcyBhIHNwZWNpYWwgd3JpdGUgYWhlYWQgbG9nIHVzZWQgdG8gbWFrZSBzdXJlIHRoYXQKKyAqIGZzeW5jcyBhbmQgT19TWU5DcyBjYW4gaGFwcGVuIHdpdGhvdXQgZG9pbmcgZnVsbCB0cmVlIGNvbW1pdHMuCisgKgorICogRnVsbCB0cmVlIGNvbW1pdHMgYXJlIGV4cGVuc2l2ZSBiZWNhdXNlIHRoZXkgcmVxdWlyZSBjb21tb25seQorICogbW9kaWZpZWQgYmxvY2tzIHRvIGJlIHJlY293ZWQsIGNyZWF0aW5nIG1hbnkgZGlydHkgcGFnZXMgaW4gdGhlCisgKiBleHRlbnQgdHJlZSBhbiA0eC02eCBoaWdoZXIgd3JpdGUgbG9hZCB0aGFuIGV4dDMuCisgKgorICogSW5zdGVhZCBvZiBkb2luZyBhIHRyZWUgY29tbWl0IG9uIGV2ZXJ5IGZzeW5jLCB3ZSB1c2UgdGhlCisgKiBrZXkgcmFuZ2VzIGFuZCB0cmFuc2FjdGlvbiBpZHMgdG8gZmluZCBpdGVtcyBmb3IgYSBnaXZlbiBmaWxlIG9yIGRpcmVjdG9yeQorICogdGhhdCBoYXZlIGNoYW5nZWQgaW4gdGhpcyB0cmFuc2FjdGlvbi4gIFRob3NlIGl0ZW1zIGFyZSBjb3BpZWQgaW50bworICogYSBzcGVjaWFsIHRyZWUgKG9uZSBwZXIgc3Vidm9sdW1lIHJvb3QpLCB0aGF0IHRyZWUgaXMgd3JpdHRlbiB0byBkaXNrCisgKiBhbmQgdGhlbiB0aGUgZnN5bmMgaXMgY29uc2lkZXJlZCBjb21wbGV0ZS4KKyAqCisgKiBBZnRlciBhIGNyYXNoLCBpdGVtcyBhcmUgY29waWVkIG91dCBvZiB0aGUgbG9nLXRyZWUgYmFjayBpbnRvIHRoZQorICogc3Vidm9sdW1lIHRyZWUuICBBbnkgZmlsZSBkYXRhIGV4dGVudHMgZm91bmQgYXJlIHJlY29yZGVkIGluIHRoZSBleHRlbnQKKyAqIGFsbG9jYXRpb24gdHJlZSwgYW5kIHRoZSBsb2ctdHJlZSBmcmVlZC4KKyAqCisgKiBUaGUgbG9nIHRyZWUgaXMgcmVhZCB0aHJlZSB0aW1lcywgb25jZSB0byBwaW4gZG93biBhbGwgdGhlIGV4dGVudHMgaXQgaXMKKyAqIHVzaW5nIGluIHJhbSBhbmQgb25jZSwgb25jZSB0byBjcmVhdGUgYWxsIHRoZSBpbm9kZXMgbG9nZ2VkIGluIHRoZSB0cmVlCisgKiBhbmQgb25jZSB0byBkbyBhbGwgdGhlIG90aGVyIGl0ZW1zLgorICovCisKKy8qCisgKiBidHJmc19hZGRfbG9nX3RyZWUgYWRkcyBhIG5ldyBwZXItc3Vidm9sdW1lIGxvZyB0cmVlIGludG8gdGhlCisgKiB0cmVlIG9mIGxvZyB0cmVlIHJvb3RzLiAgVGhpcyBtdXN0IGJlIGNhbGxlZCB3aXRoIGEgdHJlZSBsb2cgdHJhbnNhY3Rpb24KKyAqIHJ1bm5pbmcgKHNlZSBzdGFydF9sb2dfdHJhbnMpLgorICovCitzdGF0aWMgaW50IGJ0cmZzX2FkZF9sb2dfdHJlZShzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKKwkJICAgICAgc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QpCit7CisJc3RydWN0IGJ0cmZzX2tleSBrZXk7CisJc3RydWN0IGJ0cmZzX3Jvb3RfaXRlbSByb290X2l0ZW07CisJc3RydWN0IGJ0cmZzX2lub2RlX2l0ZW0gKmlub2RlX2l0ZW07CisJc3RydWN0IGV4dGVudF9idWZmZXIgKmxlYWY7CisJc3RydWN0IGJ0cmZzX3Jvb3QgKm5ld19yb290ID0gcm9vdDsKKwlpbnQgcmV0OworCXU2NCBvYmplY3RpZCA9IHJvb3QtPnJvb3Rfa2V5Lm9iamVjdGlkOworCisJbGVhZiA9IGJ0cmZzX2FsbG9jX2ZyZWVfYmxvY2sodHJhbnMsIHJvb3QsIHJvb3QtPmxlYWZzaXplLCAwLAorCQkJCSAgICAgIEJUUkZTX1RSRUVfTE9HX09CSkVDVElELAorCQkJCSAgICAgIHRyYW5zLT50cmFuc2lkLCAwLCAwLCAwKTsKKwlpZiAoSVNfRVJSKGxlYWYpKSB7CisJCXJldCA9IFBUUl9FUlIobGVhZik7CisJCXJldHVybiByZXQ7CisJfQorCisJYnRyZnNfc2V0X2hlYWRlcl9ucml0ZW1zKGxlYWYsIDApOworCWJ0cmZzX3NldF9oZWFkZXJfbGV2ZWwobGVhZiwgMCk7CisJYnRyZnNfc2V0X2hlYWRlcl9ieXRlbnIobGVhZiwgbGVhZi0+c3RhcnQpOworCWJ0cmZzX3NldF9oZWFkZXJfZ2VuZXJhdGlvbihsZWFmLCB0cmFucy0+dHJhbnNpZCk7CisJYnRyZnNfc2V0X2hlYWRlcl9vd25lcihsZWFmLCBCVFJGU19UUkVFX0xPR19PQkpFQ1RJRCk7CisKKwl3cml0ZV9leHRlbnRfYnVmZmVyKGxlYWYsIHJvb3QtPmZzX2luZm8tPmZzaWQsCisJCQkgICAgKHVuc2lnbmVkIGxvbmcpYnRyZnNfaGVhZGVyX2ZzaWQobGVhZiksCisJCQkgICAgQlRSRlNfRlNJRF9TSVpFKTsKKwlidHJmc19tYXJrX2J1ZmZlcl9kaXJ0eShsZWFmKTsKKworCWlub2RlX2l0ZW0gPSAmcm9vdF9pdGVtLmlub2RlOworCW1lbXNldChpbm9kZV9pdGVtLCAwLCBzaXplb2YoKmlub2RlX2l0ZW0pKTsKKwlpbm9kZV9pdGVtLT5nZW5lcmF0aW9uID0gY3B1X3RvX2xlNjQoMSk7CisJaW5vZGVfaXRlbS0+c2l6ZSA9IGNwdV90b19sZTY0KDMpOworCWlub2RlX2l0ZW0tPm5saW5rID0gY3B1X3RvX2xlMzIoMSk7CisJaW5vZGVfaXRlbS0+bmJ5dGVzID0gY3B1X3RvX2xlNjQocm9vdC0+bGVhZnNpemUpOworCWlub2RlX2l0ZW0tPm1vZGUgPSBjcHVfdG9fbGUzMihTX0lGRElSIHwgMDc1NSk7CisKKwlidHJmc19zZXRfcm9vdF9ieXRlbnIoJnJvb3RfaXRlbSwgbGVhZi0+c3RhcnQpOworCWJ0cmZzX3NldF9yb290X2dlbmVyYXRpb24oJnJvb3RfaXRlbSwgdHJhbnMtPnRyYW5zaWQpOworCWJ0cmZzX3NldF9yb290X2xldmVsKCZyb290X2l0ZW0sIDApOworCWJ0cmZzX3NldF9yb290X3JlZnMoJnJvb3RfaXRlbSwgMCk7CisJYnRyZnNfc2V0X3Jvb3RfdXNlZCgmcm9vdF9pdGVtLCAwKTsKKworCW1lbXNldCgmcm9vdF9pdGVtLmRyb3BfcHJvZ3Jlc3MsIDAsIHNpemVvZihyb290X2l0ZW0uZHJvcF9wcm9ncmVzcykpOworCXJvb3RfaXRlbS5kcm9wX2xldmVsID0gMDsKKworCWJ0cmZzX3RyZWVfdW5sb2NrKGxlYWYpOworCWZyZWVfZXh0ZW50X2J1ZmZlcihsZWFmKTsKKwlsZWFmID0gTlVMTDsKKworCWJ0cmZzX3NldF9yb290X2RpcmlkKCZyb290X2l0ZW0sIDApOworCisJa2V5Lm9iamVjdGlkID0gQlRSRlNfVFJFRV9MT0dfT0JKRUNUSUQ7CisJa2V5Lm9mZnNldCA9IG9iamVjdGlkOworCWJ0cmZzX3NldF9rZXlfdHlwZSgma2V5LCBCVFJGU19ST09UX0lURU1fS0VZKTsKKwlyZXQgPSBidHJmc19pbnNlcnRfcm9vdCh0cmFucywgcm9vdC0+ZnNfaW5mby0+bG9nX3Jvb3RfdHJlZSwgJmtleSwKKwkJCQkmcm9vdF9pdGVtKTsKKwlpZiAocmV0KQorCQlnb3RvIGZhaWw7CisKKwluZXdfcm9vdCA9IGJ0cmZzX3JlYWRfZnNfcm9vdF9ub19yYWRpeChyb290LT5mc19pbmZvLT5sb2dfcm9vdF90cmVlLAorCQkJCQkgICAgICAgJmtleSk7CisJQlVHX09OKCFuZXdfcm9vdCk7CisKKwlXQVJOX09OKHJvb3QtPmxvZ19yb290KTsKKwlyb290LT5sb2dfcm9vdCA9IG5ld19yb290OworCisJLyoKKwkgKiBsb2cgdHJlZXMgZG8gbm90IGdldCByZWZlcmVuY2UgY291bnRlZCBiZWNhdXNlIHRoZXkgZ28gYXdheQorCSAqIGJlZm9yZSBhIHJlYWwgY29tbWl0IGlzIGFjdHVhbGx5IGRvbmUuICBUaGV5IGRvIHN0b3JlIHBvaW50ZXJzCisJICogdG8gZmlsZSBkYXRhIGV4dGVudHMsIGFuZCB0aG9zZSByZWZlcmVuY2UgY291bnRzIHN0aWxsIGdldAorCSAqIHVwZGF0ZWQgKGFsb25nIHdpdGggYmFjayByZWZzIHRvIHRoZSBsb2cgdHJlZSkuCisJICovCisJbmV3X3Jvb3QtPnJlZl9jb3dzID0gMDsKKwluZXdfcm9vdC0+bGFzdF90cmFucyA9IHRyYW5zLT50cmFuc2lkOworCisJLyoKKwkgKiB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGUgcm9vdCBibG9jayBmb3IgdGhpcyBuZXcgdHJlZQorCSAqIGlzIG1hcmtlZCBhcyBkaXJ0eSBpbiB0aGUgZGlydHlfbG9nX3BhZ2VzIHRyZWUuICBUaGlzCisJICogaXMgaG93IGl0IGdldHMgZmx1c2hlZCBkb3duIHRvIGRpc2sgYXQgdHJlZSBsb2cgY29tbWl0IHRpbWUuCisJICoKKwkgKiB0aGUgdHJlZSBsb2dnaW5nIG11dGV4IGtlZXBzIG90aGVycyBmcm9tIGNvbWluZyBpbiBhbmQgY2hhbmdpbmcKKwkgKiB0aGUgbmV3X3Jvb3QtPm5vZGUsIHNvIHdlIGNhbiBzYWZlbHkgYWNjZXNzIGl0IGhlcmUKKwkgKi8KKwlzZXRfZXh0ZW50X2RpcnR5KCZuZXdfcm9vdC0+ZGlydHlfbG9nX3BhZ2VzLCBuZXdfcm9vdC0+bm9kZS0+c3RhcnQsCisJCQkgbmV3X3Jvb3QtPm5vZGUtPnN0YXJ0ICsgbmV3X3Jvb3QtPm5vZGUtPmxlbiAtIDEsCisJCQkgR0ZQX05PRlMpOworCitmYWlsOgorCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBzdGFydCBhIHN1YiB0cmFuc2FjdGlvbiBhbmQgc2V0dXAgdGhlIGxvZyB0cmVlCisgKiB0aGlzIGluY3JlbWVudHMgdGhlIGxvZyB0cmVlIHdyaXRlciBjb3VudCB0byBtYWtlIHRoZSBwZW9wbGUKKyAqIHN5bmNpbmcgdGhlIHRyZWUgd2FpdCBmb3IgdXMgdG8gZmluaXNoCisgKi8KK3N0YXRpYyBpbnQgc3RhcnRfbG9nX3RyYW5zKHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAorCQkJICAgc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QpCit7CisJaW50IHJldDsKKwltdXRleF9sb2NrKCZyb290LT5mc19pbmZvLT50cmVlX2xvZ19tdXRleCk7CisJaWYgKCFyb290LT5mc19pbmZvLT5sb2dfcm9vdF90cmVlKSB7CisJCXJldCA9IGJ0cmZzX2luaXRfbG9nX3Jvb3RfdHJlZSh0cmFucywgcm9vdC0+ZnNfaW5mbyk7CisJCUJVR19PTihyZXQpOworCX0KKwlpZiAoIXJvb3QtPmxvZ19yb290KSB7CisJCXJldCA9IGJ0cmZzX2FkZF9sb2dfdHJlZSh0cmFucywgcm9vdCk7CisJCUJVR19PTihyZXQpOworCX0KKwlhdG9taWNfaW5jKCZyb290LT5mc19pbmZvLT50cmVlX2xvZ193cml0ZXJzKTsKKwlyb290LT5mc19pbmZvLT50cmVlX2xvZ19iYXRjaCsrOworCW11dGV4X3VubG9jaygmcm9vdC0+ZnNfaW5mby0+dHJlZV9sb2dfbXV0ZXgpOworCXJldHVybiAwOworfQorCisvKgorICogcmV0dXJucyAwIGlmIHRoZXJlIHdhcyBhIGxvZyB0cmFuc2FjdGlvbiBydW5uaW5nIGFuZCB3ZSB3ZXJlIGFibGUKKyAqIHRvIGpvaW4sIG9yIHJldHVybnMgLUVOT0VOVCBpZiB0aGVyZSB3ZXJlIG5vdCB0cmFuc2FjdGlvbnMKKyAqIGluIHByb2dyZXNzCisgKi8KK3N0YXRpYyBpbnQgam9pbl9ydW5uaW5nX2xvZ190cmFucyhzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCkKK3sKKwlpbnQgcmV0ID0gLUVOT0VOVDsKKworCXNtcF9tYigpOworCWlmICghcm9vdC0+bG9nX3Jvb3QpCisJCXJldHVybiAtRU5PRU5UOworCisJbXV0ZXhfbG9jaygmcm9vdC0+ZnNfaW5mby0+dHJlZV9sb2dfbXV0ZXgpOworCWlmIChyb290LT5sb2dfcm9vdCkgeworCQlyZXQgPSAwOworCQlhdG9taWNfaW5jKCZyb290LT5mc19pbmZvLT50cmVlX2xvZ193cml0ZXJzKTsKKwkJcm9vdC0+ZnNfaW5mby0+dHJlZV9sb2dfYmF0Y2grKzsKKwl9CisJbXV0ZXhfdW5sb2NrKCZyb290LT5mc19pbmZvLT50cmVlX2xvZ19tdXRleCk7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIGluZGljYXRlIHdlJ3JlIGRvbmUgbWFraW5nIGNoYW5nZXMgdG8gdGhlIGxvZyB0cmVlCisgKiBhbmQgd2FrZSB1cCBhbnlvbmUgd2FpdGluZyB0byBkbyBhIHN5bmMKKyAqLworc3RhdGljIGludCBlbmRfbG9nX3RyYW5zKHN0cnVjdCBidHJmc19yb290ICpyb290KQoreworCWF0b21pY19kZWMoJnJvb3QtPmZzX2luZm8tPnRyZWVfbG9nX3dyaXRlcnMpOworCXNtcF9tYigpOworCWlmICh3YWl0cXVldWVfYWN0aXZlKCZyb290LT5mc19pbmZvLT50cmVlX2xvZ193YWl0KSkKKwkJd2FrZV91cCgmcm9vdC0+ZnNfaW5mby0+dHJlZV9sb2dfd2FpdCk7CisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqIHRoZSB3YWxrIGNvbnRyb2wgc3RydWN0IGlzIHVzZWQgdG8gcGFzcyBzdGF0ZSBkb3duIHRoZSBjaGFpbiB3aGVuCisgKiBwcm9jZXNzaW5nIHRoZSBsb2cgdHJlZS4gIFRoZSBzdGFnZSBmaWVsZCB0ZWxscyB1cyB3aGljaCBwYXJ0CisgKiBvZiB0aGUgbG9nIHRyZWUgcHJvY2Vzc2luZyB3ZSBhcmUgY3VycmVudGx5IGRvaW5nLiAgVGhlIG90aGVycworICogYXJlIHN0YXRlIGZpZWxkcyB1c2VkIGZvciB0aGF0IHNwZWNpZmljIHBhcnQKKyAqLworc3RydWN0IHdhbGtfY29udHJvbCB7CisJLyogc2hvdWxkIHdlIGZyZWUgdGhlIGV4dGVudCBvbiBkaXNrIHdoZW4gZG9uZT8gIFRoaXMgaXMgdXNlZAorCSAqIGF0IHRyYW5zYWN0aW9uIGNvbW1pdCB0aW1lIHdoaWxlIGZyZWVpbmcgYSBsb2cgdHJlZQorCSAqLworCWludCBmcmVlOworCisJLyogc2hvdWxkIHdlIHdyaXRlIG91dCB0aGUgZXh0ZW50IGJ1ZmZlcj8gIFRoaXMgaXMgdXNlZAorCSAqIHdoaWxlIGZsdXNoaW5nIHRoZSBsb2cgdHJlZSB0byBkaXNrIGR1cmluZyBhIHN5bmMKKwkgKi8KKwlpbnQgd3JpdGU7CisKKwkvKiBzaG91bGQgd2Ugd2FpdCBmb3IgdGhlIGV4dGVudCBidWZmZXIgaW8gdG8gZmluaXNoPyAgQWxzbyB1c2VkCisJICogd2hpbGUgZmx1c2hpbmcgdGhlIGxvZyB0cmVlIHRvIGRpc2sgZm9yIGEgc3luYworCSAqLworCWludCB3YWl0OworCisJLyogcGluIG9ubHkgd2Fsaywgd2UgcmVjb3JkIHdoaWNoIGV4dGVudHMgb24gZGlzayBiZWxvbmcgdG8gdGhlCisJICogbG9nIHRyZWVzCisJICovCisJaW50IHBpbjsKKworCS8qIHdoYXQgc3RhZ2Ugb2YgdGhlIHJlcGxheSBjb2RlIHdlJ3JlIGN1cnJlbnRseSBpbiAqLworCWludCBzdGFnZTsKKworCS8qIHRoZSByb290IHdlIGFyZSBjdXJyZW50bHkgcmVwbGF5aW5nICovCisJc3RydWN0IGJ0cmZzX3Jvb3QgKnJlcGxheV9kZXN0OworCisJLyogdGhlIHRyYW5zIGhhbmRsZSBmb3IgdGhlIGN1cnJlbnQgcmVwbGF5ICovCisJc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnM7CisKKwkvKiB0aGUgZnVuY3Rpb24gdGhhdCBnZXRzIHVzZWQgdG8gcHJvY2VzcyBibG9ja3Mgd2UgZmluZCBpbiB0aGUKKwkgKiB0cmVlLiAgTm90ZSB0aGUgZXh0ZW50X2J1ZmZlciBtaWdodCBub3QgYmUgdXAgdG8gZGF0ZSB3aGVuIGl0IGlzCisJICogcGFzc2VkIGluLCBhbmQgaXQgbXVzdCBiZSBjaGVja2VkIG9yIHJlYWQgaWYgeW91IG5lZWQgdGhlIGRhdGEKKwkgKiBpbnNpZGUgaXQKKwkgKi8KKwlpbnQgKCpwcm9jZXNzX2Z1bmMpKHN0cnVjdCBidHJmc19yb290ICpsb2csIHN0cnVjdCBleHRlbnRfYnVmZmVyICplYiwKKwkJCSAgICBzdHJ1Y3Qgd2Fsa19jb250cm9sICp3YywgdTY0IGdlbik7Cit9OworCisvKgorICogcHJvY2Vzc19mdW5jIHVzZWQgdG8gcGluIGRvd24gZXh0ZW50cywgd3JpdGUgdGhlbSBvciB3YWl0IG9uIHRoZW0KKyAqLworc3RhdGljIGludCBwcm9jZXNzX29uZV9idWZmZXIoc3RydWN0IGJ0cmZzX3Jvb3QgKmxvZywKKwkJCSAgICAgIHN0cnVjdCBleHRlbnRfYnVmZmVyICplYiwKKwkJCSAgICAgIHN0cnVjdCB3YWxrX2NvbnRyb2wgKndjLCB1NjQgZ2VuKQoreworCWlmICh3Yy0+cGluKSB7CisJCW11dGV4X2xvY2soJmxvZy0+ZnNfaW5mby0+cGlubmVkX211dGV4KTsKKwkJYnRyZnNfdXBkYXRlX3Bpbm5lZF9leHRlbnRzKGxvZy0+ZnNfaW5mby0+ZXh0ZW50X3Jvb3QsCisJCQkJCSAgICBlYi0+c3RhcnQsIGViLT5sZW4sIDEpOworCQltdXRleF91bmxvY2soJmxvZy0+ZnNfaW5mby0+cGlubmVkX211dGV4KTsKKwl9CisKKwlpZiAoYnRyZnNfYnVmZmVyX3VwdG9kYXRlKGViLCBnZW4pKSB7CisJCWlmICh3Yy0+d3JpdGUpCisJCQlidHJmc193cml0ZV90cmVlX2Jsb2NrKGViKTsKKwkJaWYgKHdjLT53YWl0KQorCQkJYnRyZnNfd2FpdF90cmVlX2Jsb2NrX3dyaXRlYmFjayhlYik7CisJfQorCXJldHVybiAwOworfQorCisvKgorICogSXRlbSBvdmVyd3JpdGUgdXNlZCBieSByZXBsYXkgYW5kIHRyZWUgbG9nZ2luZy4gIGViLCBzbG90IGFuZCBrZXkgYWxsIHJlZmVyCisgKiB0byB0aGUgc3JjIGRhdGEgd2UgYXJlIGNvcHlpbmcgb3V0LgorICoKKyAqIHJvb3QgaXMgdGhlIHRyZWUgd2UgYXJlIGNvcHlpbmcgaW50bywgYW5kIHBhdGggaXMgYSBzY3JhdGNoCisgKiBwYXRoIGZvciB1c2UgaW4gdGhpcyBmdW5jdGlvbiAoaXQgc2hvdWxkIGJlIHJlbGVhc2VkIG9uIGVudHJ5IGFuZAorICogd2lsbCBiZSByZWxlYXNlZCBvbiBleGl0KS4KKyAqCisgKiBJZiB0aGUga2V5IGlzIGFscmVhZHkgaW4gdGhlIGRlc3RpbmF0aW9uIHRyZWUgdGhlIGV4aXN0aW5nIGl0ZW0gaXMKKyAqIG92ZXJ3cml0dGVuLiAgSWYgdGhlIGV4aXN0aW5nIGl0ZW0gaXNuJ3QgYmlnIGVub3VnaCwgaXQgaXMgZXh0ZW5kZWQuCisgKiBJZiBpdCBpcyB0b28gbGFyZ2UsIGl0IGlzIHRydW5jYXRlZC4KKyAqCisgKiBJZiB0aGUga2V5IGlzbid0IGluIHRoZSBkZXN0aW5hdGlvbiB5ZXQsIGEgbmV3IGl0ZW0gaXMgaW5zZXJ0ZWQuCisgKi8KK3N0YXRpYyBub2lubGluZSBpbnQgb3ZlcndyaXRlX2l0ZW0oc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCisJCQkJICAgc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsCisJCQkJICAgc3RydWN0IGJ0cmZzX3BhdGggKnBhdGgsCisJCQkJICAgc3RydWN0IGV4dGVudF9idWZmZXIgKmViLCBpbnQgc2xvdCwKKwkJCQkgICBzdHJ1Y3QgYnRyZnNfa2V5ICprZXkpCit7CisJaW50IHJldDsKKwl1MzIgaXRlbV9zaXplOworCXU2NCBzYXZlZF9pX3NpemUgPSAwOworCWludCBzYXZlX29sZF9pX3NpemUgPSAwOworCXVuc2lnbmVkIGxvbmcgc3JjX3B0cjsKKwl1bnNpZ25lZCBsb25nIGRzdF9wdHI7CisJaW50IG92ZXJ3cml0ZV9yb290ID0gMDsKKworCWlmIChyb290LT5yb290X2tleS5vYmplY3RpZCAhPSBCVFJGU19UUkVFX0xPR19PQkpFQ1RJRCkKKwkJb3ZlcndyaXRlX3Jvb3QgPSAxOworCisJaXRlbV9zaXplID0gYnRyZnNfaXRlbV9zaXplX25yKGViLCBzbG90KTsKKwlzcmNfcHRyID0gYnRyZnNfaXRlbV9wdHJfb2Zmc2V0KGViLCBzbG90KTsKKworCS8qIGxvb2sgZm9yIHRoZSBrZXkgaW4gdGhlIGRlc3RpbmF0aW9uIHRyZWUgKi8KKwlyZXQgPSBidHJmc19zZWFyY2hfc2xvdChOVUxMLCByb290LCBrZXksIHBhdGgsIDAsIDApOworCWlmIChyZXQgPT0gMCkgeworCQljaGFyICpzcmNfY29weTsKKwkJY2hhciAqZHN0X2NvcHk7CisJCXUzMiBkc3Rfc2l6ZSA9IGJ0cmZzX2l0ZW1fc2l6ZV9ucihwYXRoLT5ub2Rlc1swXSwKKwkJCQkJCSAgcGF0aC0+c2xvdHNbMF0pOworCQlpZiAoZHN0X3NpemUgIT0gaXRlbV9zaXplKQorCQkJZ290byBpbnNlcnQ7CisKKwkJaWYgKGl0ZW1fc2l6ZSA9PSAwKSB7CisJCQlidHJmc19yZWxlYXNlX3BhdGgocm9vdCwgcGF0aCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlkc3RfY29weSA9IGttYWxsb2MoaXRlbV9zaXplLCBHRlBfTk9GUyk7CisJCXNyY19jb3B5ID0ga21hbGxvYyhpdGVtX3NpemUsIEdGUF9OT0ZTKTsKKworCQlyZWFkX2V4dGVudF9idWZmZXIoZWIsIHNyY19jb3B5LCBzcmNfcHRyLCBpdGVtX3NpemUpOworCisJCWRzdF9wdHIgPSBidHJmc19pdGVtX3B0cl9vZmZzZXQocGF0aC0+bm9kZXNbMF0sIHBhdGgtPnNsb3RzWzBdKTsKKwkJcmVhZF9leHRlbnRfYnVmZmVyKHBhdGgtPm5vZGVzWzBdLCBkc3RfY29weSwgZHN0X3B0ciwKKwkJCQkgICBpdGVtX3NpemUpOworCQlyZXQgPSBtZW1jbXAoZHN0X2NvcHksIHNyY19jb3B5LCBpdGVtX3NpemUpOworCisJCWtmcmVlKGRzdF9jb3B5KTsKKwkJa2ZyZWUoc3JjX2NvcHkpOworCQkvKgorCQkgKiB0aGV5IGhhdmUgdGhlIHNhbWUgY29udGVudHMsIGp1c3QgcmV0dXJuLCB0aGlzIHNhdmVzCisJCSAqIHVzIGZyb20gY293aW5nIGJsb2NrcyBpbiB0aGUgZGVzdGluYXRpb24gdHJlZSBhbmQgZG9pbmcKKwkJICogZXh0cmEgd3JpdGVzIHRoYXQgbWF5IG5vdCBoYXZlIGJlZW4gZG9uZSBieSBhIHByZXZpb3VzCisJCSAqIHN5bmMKKwkJICovCisJCWlmIChyZXQgPT0gMCkgeworCQkJYnRyZnNfcmVsZWFzZV9wYXRoKHJvb3QsIHBhdGgpOworCQkJcmV0dXJuIDA7CisJCX0KKworCX0KK2luc2VydDoKKwlidHJmc19yZWxlYXNlX3BhdGgocm9vdCwgcGF0aCk7CisJLyogdHJ5IHRvIGluc2VydCB0aGUga2V5IGludG8gdGhlIGRlc3RpbmF0aW9uIHRyZWUgKi8KKwlyZXQgPSBidHJmc19pbnNlcnRfZW1wdHlfaXRlbSh0cmFucywgcm9vdCwgcGF0aCwKKwkJCQkgICAgICBrZXksIGl0ZW1fc2l6ZSk7CisKKwkvKiBtYWtlIHN1cmUgYW55IGV4aXN0aW5nIGl0ZW0gaXMgdGhlIGNvcnJlY3Qgc2l6ZSAqLworCWlmIChyZXQgPT0gLUVFWElTVCkgeworCQl1MzIgZm91bmRfc2l6ZTsKKwkJZm91bmRfc2l6ZSA9IGJ0cmZzX2l0ZW1fc2l6ZV9ucihwYXRoLT5ub2Rlc1swXSwKKwkJCQkJCXBhdGgtPnNsb3RzWzBdKTsKKwkJaWYgKGZvdW5kX3NpemUgPiBpdGVtX3NpemUpIHsKKwkJCWJ0cmZzX3RydW5jYXRlX2l0ZW0odHJhbnMsIHJvb3QsIHBhdGgsIGl0ZW1fc2l6ZSwgMSk7CisJCX0gZWxzZSBpZiAoZm91bmRfc2l6ZSA8IGl0ZW1fc2l6ZSkgeworCQkJcmV0ID0gYnRyZnNfZXh0ZW5kX2l0ZW0odHJhbnMsIHJvb3QsIHBhdGgsCisJCQkJCQlpdGVtX3NpemUgLSBmb3VuZF9zaXplKTsKKwkJCUJVR19PTihyZXQpOworCQl9CisJfSBlbHNlIGlmIChyZXQpIHsKKwkJQlVHKCk7CisJfQorCWRzdF9wdHIgPSBidHJmc19pdGVtX3B0cl9vZmZzZXQocGF0aC0+bm9kZXNbMF0sCisJCQkJCXBhdGgtPnNsb3RzWzBdKTsKKworCS8qIGRvbid0IG92ZXJ3cml0ZSBhbiBleGlzdGluZyBpbm9kZSBpZiB0aGUgZ2VuZXJhdGlvbiBudW1iZXIKKwkgKiB3YXMgbG9nZ2VkIGFzIHplcm8uICBUaGlzIGlzIGRvbmUgd2hlbiB0aGUgdHJlZSBsb2dnaW5nIGNvZGUKKwkgKiBpcyBqdXN0IGxvZ2dpbmcgYW4gaW5vZGUgdG8gbWFrZSBzdXJlIGl0IGV4aXN0cyBhZnRlciByZWNvdmVyeS4KKwkgKgorCSAqIEFsc28sIGRvbid0IG92ZXJ3cml0ZSBpX3NpemUgb24gZGlyZWN0b3JpZXMgZHVyaW5nIHJlcGxheS4KKwkgKiBsb2cgcmVwbGF5IGluc2VydHMgYW5kIHJlbW92ZXMgZGlyZWN0b3J5IGl0ZW1zIGJhc2VkIG9uIHRoZQorCSAqIHN0YXRlIG9mIHRoZSB0cmVlIGZvdW5kIGluIHRoZSBzdWJ2b2x1bWUsIGFuZCBpX3NpemUgaXMgbW9kaWZpZWQKKwkgKiBhcyBpdCBnb2VzCisJICovCisJaWYgKGtleS0+dHlwZSA9PSBCVFJGU19JTk9ERV9JVEVNX0tFWSAmJiByZXQgPT0gLUVFWElTVCkgeworCQlzdHJ1Y3QgYnRyZnNfaW5vZGVfaXRlbSAqc3JjX2l0ZW07CisJCXN0cnVjdCBidHJmc19pbm9kZV9pdGVtICpkc3RfaXRlbTsKKworCQlzcmNfaXRlbSA9IChzdHJ1Y3QgYnRyZnNfaW5vZGVfaXRlbSAqKXNyY19wdHI7CisJCWRzdF9pdGVtID0gKHN0cnVjdCBidHJmc19pbm9kZV9pdGVtICopZHN0X3B0cjsKKworCQlpZiAoYnRyZnNfaW5vZGVfZ2VuZXJhdGlvbihlYiwgc3JjX2l0ZW0pID09IDApCisJCQlnb3RvIG5vX2NvcHk7CisKKwkJaWYgKG92ZXJ3cml0ZV9yb290ICYmCisJCSAgICBTX0lTRElSKGJ0cmZzX2lub2RlX21vZGUoZWIsIHNyY19pdGVtKSkgJiYKKwkJICAgIFNfSVNESVIoYnRyZnNfaW5vZGVfbW9kZShwYXRoLT5ub2Rlc1swXSwgZHN0X2l0ZW0pKSkgeworCQkJc2F2ZV9vbGRfaV9zaXplID0gMTsKKwkJCXNhdmVkX2lfc2l6ZSA9IGJ0cmZzX2lub2RlX3NpemUocGF0aC0+bm9kZXNbMF0sCisJCQkJCQkJZHN0X2l0ZW0pOworCQl9CisJfQorCisJY29weV9leHRlbnRfYnVmZmVyKHBhdGgtPm5vZGVzWzBdLCBlYiwgZHN0X3B0ciwKKwkJCSAgIHNyY19wdHIsIGl0ZW1fc2l6ZSk7CisKKwlpZiAoc2F2ZV9vbGRfaV9zaXplKSB7CisJCXN0cnVjdCBidHJmc19pbm9kZV9pdGVtICpkc3RfaXRlbTsKKwkJZHN0X2l0ZW0gPSAoc3RydWN0IGJ0cmZzX2lub2RlX2l0ZW0gKilkc3RfcHRyOworCQlidHJmc19zZXRfaW5vZGVfc2l6ZShwYXRoLT5ub2Rlc1swXSwgZHN0X2l0ZW0sIHNhdmVkX2lfc2l6ZSk7CisJfQorCisJLyogbWFrZSBzdXJlIHRoZSBnZW5lcmF0aW9uIGlzIGZpbGxlZCBpbiAqLworCWlmIChrZXktPnR5cGUgPT0gQlRSRlNfSU5PREVfSVRFTV9LRVkpIHsKKwkJc3RydWN0IGJ0cmZzX2lub2RlX2l0ZW0gKmRzdF9pdGVtOworCQlkc3RfaXRlbSA9IChzdHJ1Y3QgYnRyZnNfaW5vZGVfaXRlbSAqKWRzdF9wdHI7CisJCWlmIChidHJmc19pbm9kZV9nZW5lcmF0aW9uKHBhdGgtPm5vZGVzWzBdLCBkc3RfaXRlbSkgPT0gMCkgeworCQkJYnRyZnNfc2V0X2lub2RlX2dlbmVyYXRpb24ocGF0aC0+bm9kZXNbMF0sIGRzdF9pdGVtLAorCQkJCQkJICAgdHJhbnMtPnRyYW5zaWQpOworCQl9CisJfQorbm9fY29weToKKwlidHJmc19tYXJrX2J1ZmZlcl9kaXJ0eShwYXRoLT5ub2Rlc1swXSk7CisJYnRyZnNfcmVsZWFzZV9wYXRoKHJvb3QsIHBhdGgpOworCXJldHVybiAwOworfQorCisvKgorICogc2ltcGxlIGhlbHBlciB0byByZWFkIGFuIGlub2RlIG9mZiB0aGUgZGlzayBmcm9tIGEgZ2l2ZW4gcm9vdAorICogVGhpcyBjYW4gb25seSBiZSBjYWxsZWQgZm9yIHN1YnZvbHVtZSByb290cyBhbmQgbm90IGZvciB0aGUgbG9nCisgKi8KK3N0YXRpYyBub2lubGluZSBzdHJ1Y3QgaW5vZGUgKnJlYWRfb25lX2lub2RlKHN0cnVjdCBidHJmc19yb290ICpyb290LAorCQkJCQkgICAgIHU2NCBvYmplY3RpZCkKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCWlub2RlID0gYnRyZnNfaWdldF9sb2NrZWQocm9vdC0+ZnNfaW5mby0+c2IsIG9iamVjdGlkLCByb290KTsKKwlpZiAoaW5vZGUtPmlfc3RhdGUgJiBJX05FVykgeworCQlCVFJGU19JKGlub2RlKS0+cm9vdCA9IHJvb3Q7CisJCUJUUkZTX0koaW5vZGUpLT5sb2NhdGlvbi5vYmplY3RpZCA9IG9iamVjdGlkOworCQlCVFJGU19JKGlub2RlKS0+bG9jYXRpb24udHlwZSA9IEJUUkZTX0lOT0RFX0lURU1fS0VZOworCQlCVFJGU19JKGlub2RlKS0+bG9jYXRpb24ub2Zmc2V0ID0gMDsKKwkJYnRyZnNfcmVhZF9sb2NrZWRfaW5vZGUoaW5vZGUpOworCQl1bmxvY2tfbmV3X2lub2RlKGlub2RlKTsKKworCX0KKwlpZiAoaXNfYmFkX2lub2RlKGlub2RlKSkgeworCQlpcHV0KGlub2RlKTsKKwkJaW5vZGUgPSBOVUxMOworCX0KKwlyZXR1cm4gaW5vZGU7Cit9CisKKy8qIHJlcGxheXMgYSBzaW5nbGUgZXh0ZW50IGluICdlYicgYXQgJ3Nsb3QnIHdpdGggJ2tleScgaW50byB0aGUKKyAqIHN1YnZvbHVtZSAncm9vdCcuICBwYXRoIGlzIHJlbGVhc2VkIG9uIGVudHJ5IGFuZCBzaG91bGQgYmUgcmVsZWFzZWQKKyAqIG9uIGV4aXQuCisgKgorICogZXh0ZW50cyBpbiB0aGUgbG9nIHRyZWUgaGF2ZSBub3QgYmVlbiBhbGxvY2F0ZWQgb3V0IG9mIHRoZSBleHRlbnQKKyAqIHRyZWUgeWV0LiAgU28sIHRoaXMgY29tcGxldGVzIHRoZSBhbGxvY2F0aW9uLCB0YWtpbmcgYSByZWZlcmVuY2UKKyAqIGFzIHJlcXVpcmVkIGlmIHRoZSBleHRlbnQgYWxyZWFkeSBleGlzdHMgb3IgY3JlYXRpbmcgYSBuZXcgZXh0ZW50CisgKiBpZiBpdCBpc24ndCBpbiB0aGUgZXh0ZW50IGFsbG9jYXRpb24gdHJlZSB5ZXQuCisgKgorICogVGhlIGV4dGVudCBpcyBpbnNlcnRlZCBpbnRvIHRoZSBmaWxlLCBkcm9wcGluZyBhbnkgZXhpc3RpbmcgZXh0ZW50cworICogZnJvbSB0aGUgZmlsZSB0aGF0IG92ZXJsYXAgdGhlIG5ldyBvbmUuCisgKi8KK3N0YXRpYyBub2lubGluZSBpbnQgcmVwbGF5X29uZV9leHRlbnQoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCisJCQkJICAgICAgc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsCisJCQkJICAgICAgc3RydWN0IGJ0cmZzX3BhdGggKnBhdGgsCisJCQkJICAgICAgc3RydWN0IGV4dGVudF9idWZmZXIgKmViLCBpbnQgc2xvdCwKKwkJCQkgICAgICBzdHJ1Y3QgYnRyZnNfa2V5ICprZXkpCit7CisJaW50IGZvdW5kX3R5cGU7CisJdTY0IG1hc2sgPSByb290LT5zZWN0b3JzaXplIC0gMTsKKwl1NjQgZXh0ZW50X2VuZDsKKwl1NjQgYWxsb2NfaGludDsKKwl1NjQgc3RhcnQgPSBrZXktPm9mZnNldDsKKwl1NjQgc2F2ZWRfbmJ5dGVzOworCXN0cnVjdCBidHJmc19maWxlX2V4dGVudF9pdGVtICppdGVtOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBOVUxMOworCXVuc2lnbmVkIGxvbmcgc2l6ZTsKKwlpbnQgcmV0ID0gMDsKKworCWl0ZW0gPSBidHJmc19pdGVtX3B0cihlYiwgc2xvdCwgc3RydWN0IGJ0cmZzX2ZpbGVfZXh0ZW50X2l0ZW0pOworCWZvdW5kX3R5cGUgPSBidHJmc19maWxlX2V4dGVudF90eXBlKGViLCBpdGVtKTsKKworCWlmIChmb3VuZF90eXBlID09IEJUUkZTX0ZJTEVfRVhURU5UX1JFRyB8fAorCSAgICBmb3VuZF90eXBlID09IEJUUkZTX0ZJTEVfRVhURU5UX1BSRUFMTE9DKQorCQlleHRlbnRfZW5kID0gc3RhcnQgKyBidHJmc19maWxlX2V4dGVudF9udW1fYnl0ZXMoZWIsIGl0ZW0pOworCWVsc2UgaWYgKGZvdW5kX3R5cGUgPT0gQlRSRlNfRklMRV9FWFRFTlRfSU5MSU5FKSB7CisJCXNpemUgPSBidHJmc19maWxlX2V4dGVudF9pbmxpbmVfbGVuKGViLCBpdGVtKTsKKwkJZXh0ZW50X2VuZCA9IChzdGFydCArIHNpemUgKyBtYXNrKSAmIH5tYXNrOworCX0gZWxzZSB7CisJCXJldCA9IDA7CisJCWdvdG8gb3V0OworCX0KKworCWlub2RlID0gcmVhZF9vbmVfaW5vZGUocm9vdCwga2V5LT5vYmplY3RpZCk7CisJaWYgKCFpbm9kZSkgeworCQlyZXQgPSAtRUlPOworCQlnb3RvIG91dDsKKwl9CisKKwkvKgorCSAqIGZpcnN0IGNoZWNrIHRvIHNlZSBpZiB3ZSBhbHJlYWR5IGhhdmUgdGhpcyBleHRlbnQgaW4gdGhlCisJICogZmlsZS4gIFRoaXMgbXVzdCBiZSBkb25lIGJlZm9yZSB0aGUgYnRyZnNfZHJvcF9leHRlbnRzIHJ1bgorCSAqIHNvIHdlIGRvbid0IHRyeSB0byBkcm9wIHRoaXMgZXh0ZW50LgorCSAqLworCXJldCA9IGJ0cmZzX2xvb2t1cF9maWxlX2V4dGVudCh0cmFucywgcm9vdCwgcGF0aCwgaW5vZGUtPmlfaW5vLAorCQkJCSAgICAgICBzdGFydCwgMCk7CisKKwlpZiAocmV0ID09IDAgJiYKKwkgICAgKGZvdW5kX3R5cGUgPT0gQlRSRlNfRklMRV9FWFRFTlRfUkVHIHx8CisJICAgICBmb3VuZF90eXBlID09IEJUUkZTX0ZJTEVfRVhURU5UX1BSRUFMTE9DKSkgeworCQlzdHJ1Y3QgYnRyZnNfZmlsZV9leHRlbnRfaXRlbSBjbXAxOworCQlzdHJ1Y3QgYnRyZnNfZmlsZV9leHRlbnRfaXRlbSBjbXAyOworCQlzdHJ1Y3QgYnRyZnNfZmlsZV9leHRlbnRfaXRlbSAqZXhpc3Rpbmc7CisJCXN0cnVjdCBleHRlbnRfYnVmZmVyICpsZWFmOworCisJCWxlYWYgPSBwYXRoLT5ub2Rlc1swXTsKKwkJZXhpc3RpbmcgPSBidHJmc19pdGVtX3B0cihsZWFmLCBwYXRoLT5zbG90c1swXSwKKwkJCQkJICBzdHJ1Y3QgYnRyZnNfZmlsZV9leHRlbnRfaXRlbSk7CisKKwkJcmVhZF9leHRlbnRfYnVmZmVyKGViLCAmY21wMSwgKHVuc2lnbmVkIGxvbmcpaXRlbSwKKwkJCQkgICBzaXplb2YoY21wMSkpOworCQlyZWFkX2V4dGVudF9idWZmZXIobGVhZiwgJmNtcDIsICh1bnNpZ25lZCBsb25nKWV4aXN0aW5nLAorCQkJCSAgIHNpemVvZihjbXAyKSk7CisKKwkJLyoKKwkJICogd2UgYWxyZWFkeSBoYXZlIGEgcG9pbnRlciB0byB0aGlzIGV4YWN0IGV4dGVudCwKKwkJICogd2UgZG9uJ3QgaGF2ZSB0byBkbyBhbnl0aGluZworCQkgKi8KKwkJaWYgKG1lbWNtcCgmY21wMSwgJmNtcDIsIHNpemVvZihjbXAxKSkgPT0gMCkgeworCQkJYnRyZnNfcmVsZWFzZV9wYXRoKHJvb3QsIHBhdGgpOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisJYnRyZnNfcmVsZWFzZV9wYXRoKHJvb3QsIHBhdGgpOworCisJc2F2ZWRfbmJ5dGVzID0gaW5vZGVfZ2V0X2J5dGVzKGlub2RlKTsKKwkvKiBkcm9wIGFueSBvdmVybGFwcGluZyBleHRlbnRzICovCisJcmV0ID0gYnRyZnNfZHJvcF9leHRlbnRzKHRyYW5zLCByb290LCBpbm9kZSwKKwkJCSBzdGFydCwgZXh0ZW50X2VuZCwgc3RhcnQsICZhbGxvY19oaW50KTsKKwlCVUdfT04ocmV0KTsKKworCWlmIChmb3VuZF90eXBlID09IEJUUkZTX0ZJTEVfRVhURU5UX1JFRyB8fAorCSAgICBmb3VuZF90eXBlID09IEJUUkZTX0ZJTEVfRVhURU5UX1BSRUFMTE9DKSB7CisJCXVuc2lnbmVkIGxvbmcgZGVzdF9vZmZzZXQ7CisJCXN0cnVjdCBidHJmc19rZXkgaW5zOworCisJCXJldCA9IGJ0cmZzX2luc2VydF9lbXB0eV9pdGVtKHRyYW5zLCByb290LCBwYXRoLCBrZXksCisJCQkJCSAgICAgIHNpemVvZigqaXRlbSkpOworCQlCVUdfT04ocmV0KTsKKwkJZGVzdF9vZmZzZXQgPSBidHJmc19pdGVtX3B0cl9vZmZzZXQocGF0aC0+bm9kZXNbMF0sCisJCQkJCQkgICAgcGF0aC0+c2xvdHNbMF0pOworCQljb3B5X2V4dGVudF9idWZmZXIocGF0aC0+bm9kZXNbMF0sIGViLCBkZXN0X29mZnNldCwKKwkJCQkodW5zaWduZWQgbG9uZylpdGVtLCAgc2l6ZW9mKCppdGVtKSk7CisKKwkJaW5zLm9iamVjdGlkID0gYnRyZnNfZmlsZV9leHRlbnRfZGlza19ieXRlbnIoZWIsIGl0ZW0pOworCQlpbnMub2Zmc2V0ID0gYnRyZnNfZmlsZV9leHRlbnRfZGlza19udW1fYnl0ZXMoZWIsIGl0ZW0pOworCQlpbnMudHlwZSA9IEJUUkZTX0VYVEVOVF9JVEVNX0tFWTsKKworCQlpZiAoaW5zLm9iamVjdGlkID4gMCkgeworCQkJdTY0IGNzdW1fc3RhcnQ7CisJCQl1NjQgY3N1bV9lbmQ7CisJCQlMSVNUX0hFQUQob3JkZXJlZF9zdW1zKTsKKwkJCS8qCisJCQkgKiBpcyB0aGlzIGV4dGVudCBhbHJlYWR5IGFsbG9jYXRlZCBpbiB0aGUgZXh0ZW50CisJCQkgKiBhbGxvY2F0aW9uIHRyZWU/ICBJZiBzbywganVzdCBhZGQgYSByZWZlcmVuY2UKKwkJCSAqLworCQkJcmV0ID0gYnRyZnNfbG9va3VwX2V4dGVudChyb290LCBpbnMub2JqZWN0aWQsCisJCQkJCQlpbnMub2Zmc2V0KTsKKwkJCWlmIChyZXQgPT0gMCkgeworCQkJCXJldCA9IGJ0cmZzX2luY19leHRlbnRfcmVmKHRyYW5zLCByb290LAorCQkJCQkJaW5zLm9iamVjdGlkLCBpbnMub2Zmc2V0LAorCQkJCQkJcGF0aC0+bm9kZXNbMF0tPnN0YXJ0LAorCQkJCQkJcm9vdC0+cm9vdF9rZXkub2JqZWN0aWQsCisJCQkJCQl0cmFucy0+dHJhbnNpZCwga2V5LT5vYmplY3RpZCk7CisJCQl9IGVsc2UgeworCQkJCS8qCisJCQkJICogaW5zZXJ0IHRoZSBleHRlbnQgcG9pbnRlciBpbiB0aGUgZXh0ZW50CisJCQkJICogYWxsb2NhdGlvbiB0cmVlCisJCQkJICovCisJCQkJcmV0ID0gYnRyZnNfYWxsb2NfbG9nZ2VkX2V4dGVudCh0cmFucywgcm9vdCwKKwkJCQkJCXBhdGgtPm5vZGVzWzBdLT5zdGFydCwKKwkJCQkJCXJvb3QtPnJvb3Rfa2V5Lm9iamVjdGlkLAorCQkJCQkJdHJhbnMtPnRyYW5zaWQsIGtleS0+b2JqZWN0aWQsCisJCQkJCQkmaW5zKTsKKwkJCQlCVUdfT04ocmV0KTsKKwkJCX0KKwkJCWJ0cmZzX3JlbGVhc2VfcGF0aChyb290LCBwYXRoKTsKKworCQkJaWYgKGJ0cmZzX2ZpbGVfZXh0ZW50X2NvbXByZXNzaW9uKGViLCBpdGVtKSkgeworCQkJCWNzdW1fc3RhcnQgPSBpbnMub2JqZWN0aWQ7CisJCQkJY3N1bV9lbmQgPSBjc3VtX3N0YXJ0ICsgaW5zLm9mZnNldDsKKwkJCX0gZWxzZSB7CisJCQkJY3N1bV9zdGFydCA9IGlucy5vYmplY3RpZCArCisJCQkJCWJ0cmZzX2ZpbGVfZXh0ZW50X29mZnNldChlYiwgaXRlbSk7CisJCQkJY3N1bV9lbmQgPSBjc3VtX3N0YXJ0ICsKKwkJCQkJYnRyZnNfZmlsZV9leHRlbnRfbnVtX2J5dGVzKGViLCBpdGVtKTsKKwkJCX0KKworCQkJcmV0ID0gYnRyZnNfbG9va3VwX2NzdW1zX3JhbmdlKHJvb3QtPmxvZ19yb290LAorCQkJCQkJY3N1bV9zdGFydCwgY3N1bV9lbmQgLSAxLAorCQkJCQkJJm9yZGVyZWRfc3Vtcyk7CisJCQlCVUdfT04ocmV0KTsKKwkJCXdoaWxlICghbGlzdF9lbXB0eSgmb3JkZXJlZF9zdW1zKSkgeworCQkJCXN0cnVjdCBidHJmc19vcmRlcmVkX3N1bSAqc3VtczsKKwkJCQlzdW1zID0gbGlzdF9lbnRyeShvcmRlcmVkX3N1bXMubmV4dCwKKwkJCQkJCXN0cnVjdCBidHJmc19vcmRlcmVkX3N1bSwKKwkJCQkJCWxpc3QpOworCQkJCXJldCA9IGJ0cmZzX2NzdW1fZmlsZV9ibG9ja3ModHJhbnMsCisJCQkJCQlyb290LT5mc19pbmZvLT5jc3VtX3Jvb3QsCisJCQkJCQlzdW1zKTsKKwkJCQlCVUdfT04ocmV0KTsKKwkJCQlsaXN0X2RlbCgmc3Vtcy0+bGlzdCk7CisJCQkJa2ZyZWUoc3Vtcyk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlidHJmc19yZWxlYXNlX3BhdGgocm9vdCwgcGF0aCk7CisJCX0KKwl9IGVsc2UgaWYgKGZvdW5kX3R5cGUgPT0gQlRSRlNfRklMRV9FWFRFTlRfSU5MSU5FKSB7CisJCS8qIGlubGluZSBleHRlbnRzIGFyZSBlYXN5LCB3ZSBqdXN0IG92ZXJ3cml0ZSB0aGVtICovCisJCXJldCA9IG92ZXJ3cml0ZV9pdGVtKHRyYW5zLCByb290LCBwYXRoLCBlYiwgc2xvdCwga2V5KTsKKwkJQlVHX09OKHJldCk7CisJfQorCisJaW5vZGVfc2V0X2J5dGVzKGlub2RlLCBzYXZlZF9uYnl0ZXMpOworCWJ0cmZzX3VwZGF0ZV9pbm9kZSh0cmFucywgcm9vdCwgaW5vZGUpOworb3V0OgorCWlmIChpbm9kZSkKKwkJaXB1dChpbm9kZSk7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIHdoZW4gY2xlYW5pbmcgdXAgY29uZmxpY3RzIGJldHdlZW4gdGhlIGRpcmVjdG9yeSBuYW1lcyBpbiB0aGUKKyAqIHN1YnZvbHVtZSwgZGlyZWN0b3J5IG5hbWVzIGluIHRoZSBsb2cgYW5kIGRpcmVjdG9yeSBuYW1lcyBpbiB0aGUKKyAqIGlub2RlIGJhY2sgcmVmZXJlbmNlcywgd2UgbWF5IGhhdmUgdG8gdW5saW5rIGlub2RlcyBmcm9tIGRpcmVjdG9yaWVzLgorICoKKyAqIFRoaXMgaXMgYSBoZWxwZXIgZnVuY3Rpb24gdG8gZG8gdGhlIHVubGluayBvZiBhIHNwZWNpZmljIGRpcmVjdG9yeQorICogaXRlbQorICovCitzdGF0aWMgbm9pbmxpbmUgaW50IGRyb3Bfb25lX2Rpcl9pdGVtKHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAorCQkJCSAgICAgIHN0cnVjdCBidHJmc19yb290ICpyb290LAorCQkJCSAgICAgIHN0cnVjdCBidHJmc19wYXRoICpwYXRoLAorCQkJCSAgICAgIHN0cnVjdCBpbm9kZSAqZGlyLAorCQkJCSAgICAgIHN0cnVjdCBidHJmc19kaXJfaXRlbSAqZGkpCit7CisJc3RydWN0IGlub2RlICppbm9kZTsKKwljaGFyICpuYW1lOworCWludCBuYW1lX2xlbjsKKwlzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqbGVhZjsKKwlzdHJ1Y3QgYnRyZnNfa2V5IGxvY2F0aW9uOworCWludCByZXQ7CisKKwlsZWFmID0gcGF0aC0+bm9kZXNbMF07CisKKwlidHJmc19kaXJfaXRlbV9rZXlfdG9fY3B1KGxlYWYsIGRpLCAmbG9jYXRpb24pOworCW5hbWVfbGVuID0gYnRyZnNfZGlyX25hbWVfbGVuKGxlYWYsIGRpKTsKKwluYW1lID0ga21hbGxvYyhuYW1lX2xlbiwgR0ZQX05PRlMpOworCXJlYWRfZXh0ZW50X2J1ZmZlcihsZWFmLCBuYW1lLCAodW5zaWduZWQgbG9uZykoZGkgKyAxKSwgbmFtZV9sZW4pOworCWJ0cmZzX3JlbGVhc2VfcGF0aChyb290LCBwYXRoKTsKKworCWlub2RlID0gcmVhZF9vbmVfaW5vZGUocm9vdCwgbG9jYXRpb24ub2JqZWN0aWQpOworCUJVR19PTighaW5vZGUpOworCisJcmV0ID0gbGlua190b19maXh1cF9kaXIodHJhbnMsIHJvb3QsIHBhdGgsIGxvY2F0aW9uLm9iamVjdGlkKTsKKwlCVUdfT04ocmV0KTsKKwlyZXQgPSBidHJmc191bmxpbmtfaW5vZGUodHJhbnMsIHJvb3QsIGRpciwgaW5vZGUsIG5hbWUsIG5hbWVfbGVuKTsKKwlCVUdfT04ocmV0KTsKKwlrZnJlZShuYW1lKTsKKworCWlwdXQoaW5vZGUpOworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBoZWxwZXIgZnVuY3Rpb24gdG8gc2VlIGlmIGEgZ2l2ZW4gbmFtZSBhbmQgc2VxdWVuY2UgbnVtYmVyIGZvdW5kCisgKiBpbiBhbiBpbm9kZSBiYWNrIHJlZmVyZW5jZSBhcmUgYWxyZWFkeSBpbiBhIGRpcmVjdG9yeSBhbmQgY29ycmVjdGx5CisgKiBwb2ludCB0byB0aGlzIGlub2RlCisgKi8KK3N0YXRpYyBub2lubGluZSBpbnQgaW5vZGVfaW5fZGlyKHN0cnVjdCBidHJmc19yb290ICpyb290LAorCQkJCSBzdHJ1Y3QgYnRyZnNfcGF0aCAqcGF0aCwKKwkJCQkgdTY0IGRpcmlkLCB1NjQgb2JqZWN0aWQsIHU2NCBpbmRleCwKKwkJCQkgY29uc3QgY2hhciAqbmFtZSwgaW50IG5hbWVfbGVuKQoreworCXN0cnVjdCBidHJmc19kaXJfaXRlbSAqZGk7CisJc3RydWN0IGJ0cmZzX2tleSBsb2NhdGlvbjsKKwlpbnQgbWF0Y2ggPSAwOworCisJZGkgPSBidHJmc19sb29rdXBfZGlyX2luZGV4X2l0ZW0oTlVMTCwgcm9vdCwgcGF0aCwgZGlyaWQsCisJCQkJCSBpbmRleCwgbmFtZSwgbmFtZV9sZW4sIDApOworCWlmIChkaSAmJiAhSVNfRVJSKGRpKSkgeworCQlidHJmc19kaXJfaXRlbV9rZXlfdG9fY3B1KHBhdGgtPm5vZGVzWzBdLCBkaSwgJmxvY2F0aW9uKTsKKwkJaWYgKGxvY2F0aW9uLm9iamVjdGlkICE9IG9iamVjdGlkKQorCQkJZ290byBvdXQ7CisJfSBlbHNlCisJCWdvdG8gb3V0OworCWJ0cmZzX3JlbGVhc2VfcGF0aChyb290LCBwYXRoKTsKKworCWRpID0gYnRyZnNfbG9va3VwX2Rpcl9pdGVtKE5VTEwsIHJvb3QsIHBhdGgsIGRpcmlkLCBuYW1lLCBuYW1lX2xlbiwgMCk7CisJaWYgKGRpICYmICFJU19FUlIoZGkpKSB7CisJCWJ0cmZzX2Rpcl9pdGVtX2tleV90b19jcHUocGF0aC0+bm9kZXNbMF0sIGRpLCAmbG9jYXRpb24pOworCQlpZiAobG9jYXRpb24ub2JqZWN0aWQgIT0gb2JqZWN0aWQpCisJCQlnb3RvIG91dDsKKwl9IGVsc2UKKwkJZ290byBvdXQ7CisJbWF0Y2ggPSAxOworb3V0OgorCWJ0cmZzX3JlbGVhc2VfcGF0aChyb290LCBwYXRoKTsKKwlyZXR1cm4gbWF0Y2g7Cit9CisKKy8qCisgKiBoZWxwZXIgZnVuY3Rpb24gdG8gY2hlY2sgYSBsb2cgdHJlZSBmb3IgYSBuYW1lZCBiYWNrIHJlZmVyZW5jZSBpbgorICogYW4gaW5vZGUuICBUaGlzIGlzIHVzZWQgdG8gZGVjaWRlIGlmIGEgYmFjayByZWZlcmVuY2UgdGhhdCBpcworICogZm91bmQgaW4gdGhlIHN1YnZvbHVtZSBjb25mbGljdHMgd2l0aCB3aGF0IHdlIGZpbmQgaW4gdGhlIGxvZy4KKyAqCisgKiBpbm9kZSBiYWNrcmVmZXJlbmNlcyBtYXkgaGF2ZSBtdWx0aXBsZSByZWZzIGluIGEgc2luZ2xlIGl0ZW0sCisgKiBkdXJpbmcgcmVwbGF5IHdlIHByb2Nlc3Mgb25lIHJlZmVyZW5jZSBhdCBhIHRpbWUsIGFuZCB3ZSBkb24ndAorICogd2FudCB0byBkZWxldGUgdmFsaWQgbGlua3MgdG8gYSBmaWxlIGZyb20gdGhlIHN1YnZvbHVtZSBpZiB0aGF0CisgKiBsaW5rIGlzIGFsc28gaW4gdGhlIGxvZy4KKyAqLworc3RhdGljIG5vaW5saW5lIGludCBiYWNrcmVmX2luX2xvZyhzdHJ1Y3QgYnRyZnNfcm9vdCAqbG9nLAorCQkJCSAgIHN0cnVjdCBidHJmc19rZXkgKmtleSwKKwkJCQkgICBjaGFyICpuYW1lLCBpbnQgbmFtZWxlbikKK3sKKwlzdHJ1Y3QgYnRyZnNfcGF0aCAqcGF0aDsKKwlzdHJ1Y3QgYnRyZnNfaW5vZGVfcmVmICpyZWY7CisJdW5zaWduZWQgbG9uZyBwdHI7CisJdW5zaWduZWQgbG9uZyBwdHJfZW5kOworCXVuc2lnbmVkIGxvbmcgbmFtZV9wdHI7CisJaW50IGZvdW5kX25hbWVfbGVuOworCWludCBpdGVtX3NpemU7CisJaW50IHJldDsKKwlpbnQgbWF0Y2ggPSAwOworCisJcGF0aCA9IGJ0cmZzX2FsbG9jX3BhdGgoKTsKKwlyZXQgPSBidHJmc19zZWFyY2hfc2xvdChOVUxMLCBsb2csIGtleSwgcGF0aCwgMCwgMCk7CisJaWYgKHJldCAhPSAwKQorCQlnb3RvIG91dDsKKworCWl0ZW1fc2l6ZSA9IGJ0cmZzX2l0ZW1fc2l6ZV9ucihwYXRoLT5ub2Rlc1swXSwgcGF0aC0+c2xvdHNbMF0pOworCXB0ciA9IGJ0cmZzX2l0ZW1fcHRyX29mZnNldChwYXRoLT5ub2Rlc1swXSwgcGF0aC0+c2xvdHNbMF0pOworCXB0cl9lbmQgPSBwdHIgKyBpdGVtX3NpemU7CisJd2hpbGUgKHB0ciA8IHB0cl9lbmQpIHsKKwkJcmVmID0gKHN0cnVjdCBidHJmc19pbm9kZV9yZWYgKilwdHI7CisJCWZvdW5kX25hbWVfbGVuID0gYnRyZnNfaW5vZGVfcmVmX25hbWVfbGVuKHBhdGgtPm5vZGVzWzBdLCByZWYpOworCQlpZiAoZm91bmRfbmFtZV9sZW4gPT0gbmFtZWxlbikgeworCQkJbmFtZV9wdHIgPSAodW5zaWduZWQgbG9uZykocmVmICsgMSk7CisJCQlyZXQgPSBtZW1jbXBfZXh0ZW50X2J1ZmZlcihwYXRoLT5ub2Rlc1swXSwgbmFtZSwKKwkJCQkJCSAgIG5hbWVfcHRyLCBuYW1lbGVuKTsKKwkJCWlmIChyZXQgPT0gMCkgeworCQkJCW1hdGNoID0gMTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJfQorCQlwdHIgPSAodW5zaWduZWQgbG9uZykocmVmICsgMSkgKyBmb3VuZF9uYW1lX2xlbjsKKwl9CitvdXQ6CisJYnRyZnNfZnJlZV9wYXRoKHBhdGgpOworCXJldHVybiBtYXRjaDsKK30KKworCisvKgorICogcmVwbGF5IG9uZSBpbm9kZSBiYWNrIHJlZmVyZW5jZSBpdGVtIGZvdW5kIGluIHRoZSBsb2cgdHJlZS4KKyAqIGViLCBzbG90IGFuZCBrZXkgcmVmZXIgdG8gdGhlIGJ1ZmZlciBhbmQga2V5IGZvdW5kIGluIHRoZSBsb2cgdHJlZS4KKyAqIHJvb3QgaXMgdGhlIGRlc3RpbmF0aW9uIHdlIGFyZSByZXBsYXlpbmcgaW50bywgYW5kIHBhdGggaXMgZm9yIHRlbXAKKyAqIHVzZSBieSB0aGlzIGZ1bmN0aW9uLiAgKGl0IHNob3VsZCBiZSByZWxlYXNlZCBvbiByZXR1cm4pLgorICovCitzdGF0aWMgbm9pbmxpbmUgaW50IGFkZF9pbm9kZV9yZWYoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCisJCQkJICBzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwKKwkJCQkgIHN0cnVjdCBidHJmc19yb290ICpsb2csCisJCQkJICBzdHJ1Y3QgYnRyZnNfcGF0aCAqcGF0aCwKKwkJCQkgIHN0cnVjdCBleHRlbnRfYnVmZmVyICplYiwgaW50IHNsb3QsCisJCQkJICBzdHJ1Y3QgYnRyZnNfa2V5ICprZXkpCit7CisJc3RydWN0IGlub2RlICpkaXI7CisJaW50IHJldDsKKwlzdHJ1Y3QgYnRyZnNfa2V5IGxvY2F0aW9uOworCXN0cnVjdCBidHJmc19pbm9kZV9yZWYgKnJlZjsKKwlzdHJ1Y3QgYnRyZnNfZGlyX2l0ZW0gKmRpOworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisJY2hhciAqbmFtZTsKKwlpbnQgbmFtZWxlbjsKKwl1bnNpZ25lZCBsb25nIHJlZl9wdHI7CisJdW5zaWduZWQgbG9uZyByZWZfZW5kOworCisJbG9jYXRpb24ub2JqZWN0aWQgPSBrZXktPm9iamVjdGlkOworCWxvY2F0aW9uLnR5cGUgPSBCVFJGU19JTk9ERV9JVEVNX0tFWTsKKwlsb2NhdGlvbi5vZmZzZXQgPSAwOworCisJLyoKKwkgKiBpdCBpcyBwb3NzaWJsZSB0aGF0IHdlIGRpZG4ndCBsb2cgYWxsIHRoZSBwYXJlbnQgZGlyZWN0b3JpZXMKKwkgKiBmb3IgYSBnaXZlbiBpbm9kZS4gIElmIHdlIGRvbid0IGZpbmQgdGhlIGRpciwganVzdCBkb24ndAorCSAqIGNvcHkgdGhlIGJhY2sgcmVmIGluLiAgVGhlIGxpbmsgY291bnQgZml4dXAgY29kZSB3aWxsIHRha2UKKwkgKiBjYXJlIG9mIHRoZSByZXN0CisJICovCisJZGlyID0gcmVhZF9vbmVfaW5vZGUocm9vdCwga2V5LT5vZmZzZXQpOworCWlmICghZGlyKQorCQlyZXR1cm4gLUVOT0VOVDsKKworCWlub2RlID0gcmVhZF9vbmVfaW5vZGUocm9vdCwga2V5LT5vYmplY3RpZCk7CisJQlVHX09OKCFkaXIpOworCisJcmVmX3B0ciA9IGJ0cmZzX2l0ZW1fcHRyX29mZnNldChlYiwgc2xvdCk7CisJcmVmX2VuZCA9IHJlZl9wdHIgKyBidHJmc19pdGVtX3NpemVfbnIoZWIsIHNsb3QpOworCithZ2FpbjoKKwlyZWYgPSAoc3RydWN0IGJ0cmZzX2lub2RlX3JlZiAqKXJlZl9wdHI7CisKKwluYW1lbGVuID0gYnRyZnNfaW5vZGVfcmVmX25hbWVfbGVuKGViLCByZWYpOworCW5hbWUgPSBrbWFsbG9jKG5hbWVsZW4sIEdGUF9OT0ZTKTsKKwlCVUdfT04oIW5hbWUpOworCisJcmVhZF9leHRlbnRfYnVmZmVyKGViLCBuYW1lLCAodW5zaWduZWQgbG9uZykocmVmICsgMSksIG5hbWVsZW4pOworCisJLyogaWYgd2UgYWxyZWFkeSBoYXZlIGEgcGVyZmVjdCBtYXRjaCwgd2UncmUgZG9uZSAqLworCWlmIChpbm9kZV9pbl9kaXIocm9vdCwgcGF0aCwgZGlyLT5pX2lubywgaW5vZGUtPmlfaW5vLAorCQkJIGJ0cmZzX2lub2RlX3JlZl9pbmRleChlYiwgcmVmKSwKKwkJCSBuYW1lLCBuYW1lbGVuKSkgeworCQlnb3RvIG91dDsKKwl9CisKKwkvKgorCSAqIGxvb2sgZm9yIGEgY29uZmxpY3RpbmcgYmFjayByZWZlcmVuY2UgaW4gdGhlIG1ldGFkYXRhLgorCSAqIGlmIHdlIGZpbmQgb25lIHdlIGhhdmUgdG8gdW5saW5rIHRoYXQgbmFtZSBvZiB0aGUgZmlsZQorCSAqIGJlZm9yZSB3ZSBhZGQgb3VyIG5ldyBsaW5rLiAgTGF0ZXIgb24sIHdlIG92ZXJ3cml0ZSBhbnkKKwkgKiBleGlzdGluZyBiYWNrIHJlZmVyZW5jZSwgYW5kIHdlIGRvbid0IHdhbnQgdG8gY3JlYXRlCisJICogZGFuZ2xpbmcgcG9pbnRlcnMgaW4gdGhlIGRpcmVjdG9yeS4KKwkgKi8KK2NvbmZsaWN0X2FnYWluOgorCXJldCA9IGJ0cmZzX3NlYXJjaF9zbG90KE5VTEwsIHJvb3QsIGtleSwgcGF0aCwgMCwgMCk7CisJaWYgKHJldCA9PSAwKSB7CisJCWNoYXIgKnZpY3RpbV9uYW1lOworCQlpbnQgdmljdGltX25hbWVfbGVuOworCQlzdHJ1Y3QgYnRyZnNfaW5vZGVfcmVmICp2aWN0aW1fcmVmOworCQl1bnNpZ25lZCBsb25nIHB0cjsKKwkJdW5zaWduZWQgbG9uZyBwdHJfZW5kOworCQlzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqbGVhZiA9IHBhdGgtPm5vZGVzWzBdOworCisJCS8qIGFyZSB3ZSB0cnlpbmcgdG8gb3ZlcndyaXRlIGEgYmFjayByZWYgZm9yIHRoZSByb290IGRpcmVjdG9yeQorCQkgKiBpZiBzbywganVzdCBqdW1wIG91dCwgd2UncmUgZG9uZQorCQkgKi8KKwkJaWYgKGtleS0+b2JqZWN0aWQgPT0ga2V5LT5vZmZzZXQpCisJCQlnb3RvIG91dF9ub3dyaXRlOworCisJCS8qIGNoZWNrIGFsbCB0aGUgbmFtZXMgaW4gdGhpcyBiYWNrIHJlZmVyZW5jZSB0byBzZWUKKwkJICogaWYgdGhleSBhcmUgaW4gdGhlIGxvZy4gIGlmIHNvLCB3ZSBhbGxvdyB0aGVtIHRvIHN0YXkKKwkJICogb3RoZXJ3aXNlIHRoZXkgbXVzdCBiZSB1bmxpbmtlZCBhcyBhIGNvbmZsaWN0CisJCSAqLworCQlwdHIgPSBidHJmc19pdGVtX3B0cl9vZmZzZXQobGVhZiwgcGF0aC0+c2xvdHNbMF0pOworCQlwdHJfZW5kID0gcHRyICsgYnRyZnNfaXRlbV9zaXplX25yKGxlYWYsIHBhdGgtPnNsb3RzWzBdKTsKKwkJd2hpbGUgKHB0ciA8IHB0cl9lbmQpIHsKKwkJCXZpY3RpbV9yZWYgPSAoc3RydWN0IGJ0cmZzX2lub2RlX3JlZiAqKXB0cjsKKwkJCXZpY3RpbV9uYW1lX2xlbiA9IGJ0cmZzX2lub2RlX3JlZl9uYW1lX2xlbihsZWFmLAorCQkJCQkJCQkgICB2aWN0aW1fcmVmKTsKKwkJCXZpY3RpbV9uYW1lID0ga21hbGxvYyh2aWN0aW1fbmFtZV9sZW4sIEdGUF9OT0ZTKTsKKwkJCUJVR19PTighdmljdGltX25hbWUpOworCisJCQlyZWFkX2V4dGVudF9idWZmZXIobGVhZiwgdmljdGltX25hbWUsCisJCQkJCSAgICh1bnNpZ25lZCBsb25nKSh2aWN0aW1fcmVmICsgMSksCisJCQkJCSAgIHZpY3RpbV9uYW1lX2xlbik7CisKKwkJCWlmICghYmFja3JlZl9pbl9sb2cobG9nLCBrZXksIHZpY3RpbV9uYW1lLAorCQkJCQkgICAgdmljdGltX25hbWVfbGVuKSkgeworCQkJCWJ0cmZzX2luY19ubGluayhpbm9kZSk7CisJCQkJYnRyZnNfcmVsZWFzZV9wYXRoKHJvb3QsIHBhdGgpOworCQkJCXJldCA9IGJ0cmZzX3VubGlua19pbm9kZSh0cmFucywgcm9vdCwgZGlyLAorCQkJCQkJCSBpbm9kZSwgdmljdGltX25hbWUsCisJCQkJCQkJIHZpY3RpbV9uYW1lX2xlbik7CisJCQkJa2ZyZWUodmljdGltX25hbWUpOworCQkJCWJ0cmZzX3JlbGVhc2VfcGF0aChyb290LCBwYXRoKTsKKwkJCQlnb3RvIGNvbmZsaWN0X2FnYWluOworCQkJfQorCQkJa2ZyZWUodmljdGltX25hbWUpOworCQkJcHRyID0gKHVuc2lnbmVkIGxvbmcpKHZpY3RpbV9yZWYgKyAxKSArIHZpY3RpbV9uYW1lX2xlbjsKKwkJfQorCQlCVUdfT04ocmV0KTsKKwl9CisJYnRyZnNfcmVsZWFzZV9wYXRoKHJvb3QsIHBhdGgpOworCisJLyogbG9vayBmb3IgYSBjb25mbGljdGluZyBzZXF1ZW5jZSBudW1iZXIgKi8KKwlkaSA9IGJ0cmZzX2xvb2t1cF9kaXJfaW5kZXhfaXRlbSh0cmFucywgcm9vdCwgcGF0aCwgZGlyLT5pX2lubywKKwkJCQkJIGJ0cmZzX2lub2RlX3JlZl9pbmRleChlYiwgcmVmKSwKKwkJCQkJIG5hbWUsIG5hbWVsZW4sIDApOworCWlmIChkaSAmJiAhSVNfRVJSKGRpKSkgeworCQlyZXQgPSBkcm9wX29uZV9kaXJfaXRlbSh0cmFucywgcm9vdCwgcGF0aCwgZGlyLCBkaSk7CisJCUJVR19PTihyZXQpOworCX0KKwlidHJmc19yZWxlYXNlX3BhdGgocm9vdCwgcGF0aCk7CisKKworCS8qIGxvb2sgZm9yIGEgY29uZmxpY3RpbmcgbmFtZSAqLworCWRpID0gYnRyZnNfbG9va3VwX2Rpcl9pdGVtKHRyYW5zLCByb290LCBwYXRoLCBkaXItPmlfaW5vLAorCQkJCSAgIG5hbWUsIG5hbWVsZW4sIDApOworCWlmIChkaSAmJiAhSVNfRVJSKGRpKSkgeworCQlyZXQgPSBkcm9wX29uZV9kaXJfaXRlbSh0cmFucywgcm9vdCwgcGF0aCwgZGlyLCBkaSk7CisJCUJVR19PTihyZXQpOworCX0KKwlidHJmc19yZWxlYXNlX3BhdGgocm9vdCwgcGF0aCk7CisKKwkvKiBpbnNlcnQgb3VyIG5hbWUgKi8KKwlyZXQgPSBidHJmc19hZGRfbGluayh0cmFucywgZGlyLCBpbm9kZSwgbmFtZSwgbmFtZWxlbiwgMCwKKwkJCSAgICAgYnRyZnNfaW5vZGVfcmVmX2luZGV4KGViLCByZWYpKTsKKwlCVUdfT04ocmV0KTsKKworCWJ0cmZzX3VwZGF0ZV9pbm9kZSh0cmFucywgcm9vdCwgaW5vZGUpOworCitvdXQ6CisJcmVmX3B0ciA9ICh1bnNpZ25lZCBsb25nKShyZWYgKyAxKSArIG5hbWVsZW47CisJa2ZyZWUobmFtZSk7CisJaWYgKHJlZl9wdHIgPCByZWZfZW5kKQorCQlnb3RvIGFnYWluOworCisJLyogZmluYWxseSB3cml0ZSB0aGUgYmFjayByZWZlcmVuY2UgaW4gdGhlIGlub2RlICovCisJcmV0ID0gb3ZlcndyaXRlX2l0ZW0odHJhbnMsIHJvb3QsIHBhdGgsIGViLCBzbG90LCBrZXkpOworCUJVR19PTihyZXQpOworCitvdXRfbm93cml0ZToKKwlidHJmc19yZWxlYXNlX3BhdGgocm9vdCwgcGF0aCk7CisJaXB1dChkaXIpOworCWlwdXQoaW5vZGUpOworCXJldHVybiAwOworfQorCisvKgorICogVGhlcmUgYXJlIGEgZmV3IGNvcm5lcnMgd2hlcmUgdGhlIGxpbmsgY291bnQgb2YgdGhlIGZpbGUgY2FuJ3QKKyAqIGJlIHByb3Blcmx5IG1haW50YWluZWQgZHVyaW5nIHJlcGxheS4gIFNvLCBpbnN0ZWFkIG9mIGFkZGluZworICogbG90cyBvZiBjb21wbGV4aXR5IHRvIHRoZSBsb2cgY29kZSwgd2UganVzdCBzY2FuIHRoZSBiYWNrcmVmcworICogZm9yIGFueSBmaWxlIHRoYXQgaGFzIGJlZW4gdGhyb3VnaCByZXBsYXkuCisgKgorICogVGhlIHNjYW4gd2lsbCB1cGRhdGUgdGhlIGxpbmsgY291bnQgb24gdGhlIGlub2RlIHRvIHJlZmxlY3QgdGhlCisgKiBudW1iZXIgb2YgYmFjayByZWZzIGZvdW5kLiAgSWYgaXQgZ29lcyBkb3duIHRvIHplcm8sIHRoZSBpcHV0CisgKiB3aWxsIGZyZWUgdGhlIGlub2RlLgorICovCitzdGF0aWMgbm9pbmxpbmUgaW50IGZpeHVwX2lub2RlX2xpbmtfY291bnQoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCisJCQkJCSAgIHN0cnVjdCBidHJmc19yb290ICpyb290LAorCQkJCQkgICBzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXN0cnVjdCBidHJmc19wYXRoICpwYXRoOworCWludCByZXQ7CisJc3RydWN0IGJ0cmZzX2tleSBrZXk7CisJdTY0IG5saW5rID0gMDsKKwl1bnNpZ25lZCBsb25nIHB0cjsKKwl1bnNpZ25lZCBsb25nIHB0cl9lbmQ7CisJaW50IG5hbWVfbGVuOworCisJa2V5Lm9iamVjdGlkID0gaW5vZGUtPmlfaW5vOworCWtleS50eXBlID0gQlRSRlNfSU5PREVfUkVGX0tFWTsKKwlrZXkub2Zmc2V0ID0gKHU2NCktMTsKKworCXBhdGggPSBidHJmc19hbGxvY19wYXRoKCk7CisKKwl3aGlsZSAoMSkgeworCQlyZXQgPSBidHJmc19zZWFyY2hfc2xvdChOVUxMLCByb290LCAma2V5LCBwYXRoLCAwLCAwKTsKKwkJaWYgKHJldCA8IDApCisJCQlicmVhazsKKwkJaWYgKHJldCA+IDApIHsKKwkJCWlmIChwYXRoLT5zbG90c1swXSA9PSAwKQorCQkJCWJyZWFrOworCQkJcGF0aC0+c2xvdHNbMF0tLTsKKwkJfQorCQlidHJmc19pdGVtX2tleV90b19jcHUocGF0aC0+bm9kZXNbMF0sICZrZXksCisJCQkJICAgICAgcGF0aC0+c2xvdHNbMF0pOworCQlpZiAoa2V5Lm9iamVjdGlkICE9IGlub2RlLT5pX2lubyB8fAorCQkgICAga2V5LnR5cGUgIT0gQlRSRlNfSU5PREVfUkVGX0tFWSkKKwkJCWJyZWFrOworCQlwdHIgPSBidHJmc19pdGVtX3B0cl9vZmZzZXQocGF0aC0+bm9kZXNbMF0sIHBhdGgtPnNsb3RzWzBdKTsKKwkJcHRyX2VuZCA9IHB0ciArIGJ0cmZzX2l0ZW1fc2l6ZV9ucihwYXRoLT5ub2Rlc1swXSwKKwkJCQkJCSAgIHBhdGgtPnNsb3RzWzBdKTsKKwkJd2hpbGUgKHB0ciA8IHB0cl9lbmQpIHsKKwkJCXN0cnVjdCBidHJmc19pbm9kZV9yZWYgKnJlZjsKKworCQkJcmVmID0gKHN0cnVjdCBidHJmc19pbm9kZV9yZWYgKilwdHI7CisJCQluYW1lX2xlbiA9IGJ0cmZzX2lub2RlX3JlZl9uYW1lX2xlbihwYXRoLT5ub2Rlc1swXSwKKwkJCQkJCQkgICAgcmVmKTsKKwkJCXB0ciA9ICh1bnNpZ25lZCBsb25nKShyZWYgKyAxKSArIG5hbWVfbGVuOworCQkJbmxpbmsrKzsKKwkJfQorCisJCWlmIChrZXkub2Zmc2V0ID09IDApCisJCQlicmVhazsKKwkJa2V5Lm9mZnNldC0tOworCQlidHJmc19yZWxlYXNlX3BhdGgocm9vdCwgcGF0aCk7CisJfQorCWJ0cmZzX2ZyZWVfcGF0aChwYXRoKTsKKwlpZiAobmxpbmsgIT0gaW5vZGUtPmlfbmxpbmspIHsKKwkJaW5vZGUtPmlfbmxpbmsgPSBubGluazsKKwkJYnRyZnNfdXBkYXRlX2lub2RlKHRyYW5zLCByb290LCBpbm9kZSk7CisJfQorCUJUUkZTX0koaW5vZGUpLT5pbmRleF9jbnQgPSAodTY0KS0xOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBub2lubGluZSBpbnQgZml4dXBfaW5vZGVfbGlua19jb3VudHMoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCisJCQkJCSAgICBzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwKKwkJCQkJICAgIHN0cnVjdCBidHJmc19wYXRoICpwYXRoKQoreworCWludCByZXQ7CisJc3RydWN0IGJ0cmZzX2tleSBrZXk7CisJc3RydWN0IGlub2RlICppbm9kZTsKKworCWtleS5vYmplY3RpZCA9IEJUUkZTX1RSRUVfTE9HX0ZJWFVQX09CSkVDVElEOworCWtleS50eXBlID0gQlRSRlNfT1JQSEFOX0lURU1fS0VZOworCWtleS5vZmZzZXQgPSAodTY0KS0xOworCXdoaWxlICgxKSB7CisJCXJldCA9IGJ0cmZzX3NlYXJjaF9zbG90KHRyYW5zLCByb290LCAma2V5LCBwYXRoLCAtMSwgMSk7CisJCWlmIChyZXQgPCAwKQorCQkJYnJlYWs7CisKKwkJaWYgKHJldCA9PSAxKSB7CisJCQlpZiAocGF0aC0+c2xvdHNbMF0gPT0gMCkKKwkJCQlicmVhazsKKwkJCXBhdGgtPnNsb3RzWzBdLS07CisJCX0KKworCQlidHJmc19pdGVtX2tleV90b19jcHUocGF0aC0+bm9kZXNbMF0sICZrZXksIHBhdGgtPnNsb3RzWzBdKTsKKwkJaWYgKGtleS5vYmplY3RpZCAhPSBCVFJGU19UUkVFX0xPR19GSVhVUF9PQkpFQ1RJRCB8fAorCQkgICAga2V5LnR5cGUgIT0gQlRSRlNfT1JQSEFOX0lURU1fS0VZKQorCQkJYnJlYWs7CisKKwkJcmV0ID0gYnRyZnNfZGVsX2l0ZW0odHJhbnMsIHJvb3QsIHBhdGgpOworCQlCVUdfT04ocmV0KTsKKworCQlidHJmc19yZWxlYXNlX3BhdGgocm9vdCwgcGF0aCk7CisJCWlub2RlID0gcmVhZF9vbmVfaW5vZGUocm9vdCwga2V5Lm9mZnNldCk7CisJCUJVR19PTighaW5vZGUpOworCisJCXJldCA9IGZpeHVwX2lub2RlX2xpbmtfY291bnQodHJhbnMsIHJvb3QsIGlub2RlKTsKKwkJQlVHX09OKHJldCk7CisKKwkJaXB1dChpbm9kZSk7CisKKwkJaWYgKGtleS5vZmZzZXQgPT0gMCkKKwkJCWJyZWFrOworCQlrZXkub2Zmc2V0LS07CisJfQorCWJ0cmZzX3JlbGVhc2VfcGF0aChyb290LCBwYXRoKTsKKwlyZXR1cm4gMDsKK30KKworCisvKgorICogcmVjb3JkIGEgZ2l2ZW4gaW5vZGUgaW4gdGhlIGZpeHVwIGRpciBzbyB3ZSBjYW4gY2hlY2sgaXRzIGxpbmsKKyAqIGNvdW50IHdoZW4gcmVwbGF5IGlzIGRvbmUuICBUaGUgbGluayBjb3VudCBpcyBpbmNyZW1lbnRlZCBoZXJlCisgKiBzbyB0aGUgaW5vZGUgd29uJ3QgZ28gYXdheSB1bnRpbCB3ZSBjaGVjayBpdAorICovCitzdGF0aWMgbm9pbmxpbmUgaW50IGxpbmtfdG9fZml4dXBfZGlyKHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAorCQkJCSAgICAgIHN0cnVjdCBidHJmc19yb290ICpyb290LAorCQkJCSAgICAgIHN0cnVjdCBidHJmc19wYXRoICpwYXRoLAorCQkJCSAgICAgIHU2NCBvYmplY3RpZCkKK3sKKwlzdHJ1Y3QgYnRyZnNfa2V5IGtleTsKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCisJaW5vZGUgPSByZWFkX29uZV9pbm9kZShyb290LCBvYmplY3RpZCk7CisJQlVHX09OKCFpbm9kZSk7CisKKwlrZXkub2JqZWN0aWQgPSBCVFJGU19UUkVFX0xPR19GSVhVUF9PQkpFQ1RJRDsKKwlidHJmc19zZXRfa2V5X3R5cGUoJmtleSwgQlRSRlNfT1JQSEFOX0lURU1fS0VZKTsKKwlrZXkub2Zmc2V0ID0gb2JqZWN0aWQ7CisKKwlyZXQgPSBidHJmc19pbnNlcnRfZW1wdHlfaXRlbSh0cmFucywgcm9vdCwgcGF0aCwgJmtleSwgMCk7CisKKwlidHJmc19yZWxlYXNlX3BhdGgocm9vdCwgcGF0aCk7CisJaWYgKHJldCA9PSAwKSB7CisJCWJ0cmZzX2luY19ubGluayhpbm9kZSk7CisJCWJ0cmZzX3VwZGF0ZV9pbm9kZSh0cmFucywgcm9vdCwgaW5vZGUpOworCX0gZWxzZSBpZiAocmV0ID09IC1FRVhJU1QpIHsKKwkJcmV0ID0gMDsKKwl9IGVsc2UgeworCQlCVUcoKTsKKwl9CisJaXB1dChpbm9kZSk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogd2hlbiByZXBsYXlpbmcgdGhlIGxvZyBmb3IgYSBkaXJlY3RvcnksIHdlIG9ubHkgaW5zZXJ0IG5hbWVzCisgKiBmb3IgaW5vZGVzIHRoYXQgYWN0dWFsbHkgZXhpc3QuICBUaGlzIG1lYW5zIGFuIGZzeW5jIG9uIGEgZGlyZWN0b3J5CisgKiBkb2VzIG5vdCBpbXBsaWNpdGx5IGZzeW5jIGFsbCB0aGUgbmV3IGZpbGVzIGluIGl0CisgKi8KK3N0YXRpYyBub2lubGluZSBpbnQgaW5zZXJ0X29uZV9uYW1lKHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAorCQkJCSAgICBzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwKKwkJCQkgICAgc3RydWN0IGJ0cmZzX3BhdGggKnBhdGgsCisJCQkJICAgIHU2NCBkaXJpZCwgdTY0IGluZGV4LAorCQkJCSAgICBjaGFyICpuYW1lLCBpbnQgbmFtZV9sZW4sIHU4IHR5cGUsCisJCQkJICAgIHN0cnVjdCBidHJmc19rZXkgKmxvY2F0aW9uKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisJc3RydWN0IGlub2RlICpkaXI7CisJaW50IHJldDsKKworCWlub2RlID0gcmVhZF9vbmVfaW5vZGUocm9vdCwgbG9jYXRpb24tPm9iamVjdGlkKTsKKwlpZiAoIWlub2RlKQorCQlyZXR1cm4gLUVOT0VOVDsKKworCWRpciA9IHJlYWRfb25lX2lub2RlKHJvb3QsIGRpcmlkKTsKKwlpZiAoIWRpcikgeworCQlpcHV0KGlub2RlKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCXJldCA9IGJ0cmZzX2FkZF9saW5rKHRyYW5zLCBkaXIsIGlub2RlLCBuYW1lLCBuYW1lX2xlbiwgMSwgaW5kZXgpOworCisJLyogRklYTUUsIHB1dCBpbm9kZSBpbnRvIEZJWFVQIGxpc3QgKi8KKworCWlwdXQoaW5vZGUpOworCWlwdXQoZGlyKTsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogdGFrZSBhIHNpbmdsZSBlbnRyeSBpbiBhIGxvZyBkaXJlY3RvcnkgaXRlbSBhbmQgcmVwbGF5IGl0IGludG8KKyAqIHRoZSBzdWJ2b2x1bWUuCisgKgorICogaWYgYSBjb25mbGljdGluZyBpdGVtIGV4aXN0cyBpbiB0aGUgc3ViZGlyZWN0b3J5IGFscmVhZHksCisgKiB0aGUgaW5vZGUgaXQgcG9pbnRzIHRvIGlzIHVubGlua2VkIGFuZCBwdXQgaW50byB0aGUgbGluayBjb3VudAorICogZml4IHVwIHRyZWUuCisgKgorICogSWYgYSBuYW1lIGZyb20gdGhlIGxvZyBwb2ludHMgdG8gYSBmaWxlIG9yIGRpcmVjdG9yeSB0aGF0IGRvZXMKKyAqIG5vdCBleGlzdCBpbiB0aGUgRlMsIGl0IGlzIHNraXBwZWQuICBmc3luY3Mgb24gZGlyZWN0b3JpZXMKKyAqIGRvIG5vdCBmb3JjZSBkb3duIGlub2RlcyBpbnNpZGUgdGhhdCBkaXJlY3RvcnksIGp1c3QgY2hhbmdlcyB0byB0aGUKKyAqIG5hbWVzIG9yIHVubGlua3MgaW4gYSBkaXJlY3RvcnkuCisgKi8KK3N0YXRpYyBub2lubGluZSBpbnQgcmVwbGF5X29uZV9uYW1lKHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAorCQkJCSAgICBzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwKKwkJCQkgICAgc3RydWN0IGJ0cmZzX3BhdGggKnBhdGgsCisJCQkJICAgIHN0cnVjdCBleHRlbnRfYnVmZmVyICplYiwKKwkJCQkgICAgc3RydWN0IGJ0cmZzX2Rpcl9pdGVtICpkaSwKKwkJCQkgICAgc3RydWN0IGJ0cmZzX2tleSAqa2V5KQoreworCWNoYXIgKm5hbWU7CisJaW50IG5hbWVfbGVuOworCXN0cnVjdCBidHJmc19kaXJfaXRlbSAqZHN0X2RpOworCXN0cnVjdCBidHJmc19rZXkgZm91bmRfa2V5OworCXN0cnVjdCBidHJmc19rZXkgbG9nX2tleTsKKwlzdHJ1Y3QgaW5vZGUgKmRpcjsKKwl1OCBsb2dfdHlwZTsKKwlpbnQgZXhpc3RzOworCWludCByZXQ7CisKKwlkaXIgPSByZWFkX29uZV9pbm9kZShyb290LCBrZXktPm9iamVjdGlkKTsKKwlCVUdfT04oIWRpcik7CisKKwluYW1lX2xlbiA9IGJ0cmZzX2Rpcl9uYW1lX2xlbihlYiwgZGkpOworCW5hbWUgPSBrbWFsbG9jKG5hbWVfbGVuLCBHRlBfTk9GUyk7CisJbG9nX3R5cGUgPSBidHJmc19kaXJfdHlwZShlYiwgZGkpOworCXJlYWRfZXh0ZW50X2J1ZmZlcihlYiwgbmFtZSwgKHVuc2lnbmVkIGxvbmcpKGRpICsgMSksCisJCSAgIG5hbWVfbGVuKTsKKworCWJ0cmZzX2Rpcl9pdGVtX2tleV90b19jcHUoZWIsIGRpLCAmbG9nX2tleSk7CisJZXhpc3RzID0gYnRyZnNfbG9va3VwX2lub2RlKHRyYW5zLCByb290LCBwYXRoLCAmbG9nX2tleSwgMCk7CisJaWYgKGV4aXN0cyA9PSAwKQorCQlleGlzdHMgPSAxOworCWVsc2UKKwkJZXhpc3RzID0gMDsKKwlidHJmc19yZWxlYXNlX3BhdGgocm9vdCwgcGF0aCk7CisKKwlpZiAoa2V5LT50eXBlID09IEJUUkZTX0RJUl9JVEVNX0tFWSkgeworCQlkc3RfZGkgPSBidHJmc19sb29rdXBfZGlyX2l0ZW0odHJhbnMsIHJvb3QsIHBhdGgsIGtleS0+b2JqZWN0aWQsCisJCQkJICAgICAgIG5hbWUsIG5hbWVfbGVuLCAxKTsKKwl9IGVsc2UgaWYgKGtleS0+dHlwZSA9PSBCVFJGU19ESVJfSU5ERVhfS0VZKSB7CisJCWRzdF9kaSA9IGJ0cmZzX2xvb2t1cF9kaXJfaW5kZXhfaXRlbSh0cmFucywgcm9vdCwgcGF0aCwKKwkJCQkJCSAgICAga2V5LT5vYmplY3RpZCwKKwkJCQkJCSAgICAga2V5LT5vZmZzZXQsIG5hbWUsCisJCQkJCQkgICAgIG5hbWVfbGVuLCAxKTsKKwl9IGVsc2UgeworCQlCVUcoKTsKKwl9CisJaWYgKCFkc3RfZGkgfHwgSVNfRVJSKGRzdF9kaSkpIHsKKwkJLyogd2UgbmVlZCBhIHNlcXVlbmNlIG51bWJlciB0byBpbnNlcnQsIHNvIHdlIG9ubHkKKwkJICogZG8gaW5zZXJ0cyBmb3IgdGhlIEJUUkZTX0RJUl9JTkRFWF9LRVkgdHlwZXMKKwkJICovCisJCWlmIChrZXktPnR5cGUgIT0gQlRSRlNfRElSX0lOREVYX0tFWSkKKwkJCWdvdG8gb3V0OworCQlnb3RvIGluc2VydDsKKwl9CisKKwlidHJmc19kaXJfaXRlbV9rZXlfdG9fY3B1KHBhdGgtPm5vZGVzWzBdLCBkc3RfZGksICZmb3VuZF9rZXkpOworCS8qIHRoZSBleGlzdGluZyBpdGVtIG1hdGNoZXMgdGhlIGxvZ2dlZCBpdGVtICovCisJaWYgKGZvdW5kX2tleS5vYmplY3RpZCA9PSBsb2dfa2V5Lm9iamVjdGlkICYmCisJICAgIGZvdW5kX2tleS50eXBlID09IGxvZ19rZXkudHlwZSAmJgorCSAgICBmb3VuZF9rZXkub2Zmc2V0ID09IGxvZ19rZXkub2Zmc2V0ICYmCisJICAgIGJ0cmZzX2Rpcl90eXBlKHBhdGgtPm5vZGVzWzBdLCBkc3RfZGkpID09IGxvZ190eXBlKSB7CisJCWdvdG8gb3V0OworCX0KKworCS8qCisJICogZG9uJ3QgZHJvcCB0aGUgY29uZmxpY3RpbmcgZGlyZWN0b3J5IGVudHJ5IGlmIHRoZSBpbm9kZQorCSAqIGZvciB0aGUgbmV3IGVudHJ5IGRvZXNuJ3QgZXhpc3QKKwkgKi8KKwlpZiAoIWV4aXN0cykKKwkJZ290byBvdXQ7CisKKwlyZXQgPSBkcm9wX29uZV9kaXJfaXRlbSh0cmFucywgcm9vdCwgcGF0aCwgZGlyLCBkc3RfZGkpOworCUJVR19PTihyZXQpOworCisJaWYgKGtleS0+dHlwZSA9PSBCVFJGU19ESVJfSU5ERVhfS0VZKQorCQlnb3RvIGluc2VydDsKK291dDoKKwlidHJmc19yZWxlYXNlX3BhdGgocm9vdCwgcGF0aCk7CisJa2ZyZWUobmFtZSk7CisJaXB1dChkaXIpOworCXJldHVybiAwOworCitpbnNlcnQ6CisJYnRyZnNfcmVsZWFzZV9wYXRoKHJvb3QsIHBhdGgpOworCXJldCA9IGluc2VydF9vbmVfbmFtZSh0cmFucywgcm9vdCwgcGF0aCwga2V5LT5vYmplY3RpZCwga2V5LT5vZmZzZXQsCisJCQkgICAgICBuYW1lLCBuYW1lX2xlbiwgbG9nX3R5cGUsICZsb2dfa2V5KTsKKworCWlmIChyZXQgJiYgcmV0ICE9IC1FTk9FTlQpCisJCUJVRygpOworCWdvdG8gb3V0OworfQorCisvKgorICogZmluZCBhbGwgdGhlIG5hbWVzIGluIGEgZGlyZWN0b3J5IGl0ZW0gYW5kIHJlY29uY2lsZSB0aGVtIGludG8KKyAqIHRoZSBzdWJ2b2x1bWUuICBPbmx5IEJUUkZTX0RJUl9JVEVNX0tFWSB0eXBlcyB3aWxsIGhhdmUgbW9yZSB0aGFuCisgKiBvbmUgbmFtZSBpbiBhIGRpcmVjdG9yeSBpdGVtLCBidXQgdGhlIHNhbWUgY29kZSBnZXRzIHVzZWQgZm9yCisgKiBib3RoIGRpcmVjdG9yeSBpbmRleCB0eXBlcworICovCitzdGF0aWMgbm9pbmxpbmUgaW50IHJlcGxheV9vbmVfZGlyX2l0ZW0oc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCisJCQkJCXN0cnVjdCBidHJmc19yb290ICpyb290LAorCQkJCQlzdHJ1Y3QgYnRyZnNfcGF0aCAqcGF0aCwKKwkJCQkJc3RydWN0IGV4dGVudF9idWZmZXIgKmViLCBpbnQgc2xvdCwKKwkJCQkJc3RydWN0IGJ0cmZzX2tleSAqa2V5KQoreworCWludCByZXQ7CisJdTMyIGl0ZW1fc2l6ZSA9IGJ0cmZzX2l0ZW1fc2l6ZV9ucihlYiwgc2xvdCk7CisJc3RydWN0IGJ0cmZzX2Rpcl9pdGVtICpkaTsKKwlpbnQgbmFtZV9sZW47CisJdW5zaWduZWQgbG9uZyBwdHI7CisJdW5zaWduZWQgbG9uZyBwdHJfZW5kOworCisJcHRyID0gYnRyZnNfaXRlbV9wdHJfb2Zmc2V0KGViLCBzbG90KTsKKwlwdHJfZW5kID0gcHRyICsgaXRlbV9zaXplOworCXdoaWxlIChwdHIgPCBwdHJfZW5kKSB7CisJCWRpID0gKHN0cnVjdCBidHJmc19kaXJfaXRlbSAqKXB0cjsKKwkJbmFtZV9sZW4gPSBidHJmc19kaXJfbmFtZV9sZW4oZWIsIGRpKTsKKwkJcmV0ID0gcmVwbGF5X29uZV9uYW1lKHRyYW5zLCByb290LCBwYXRoLCBlYiwgZGksIGtleSk7CisJCUJVR19PTihyZXQpOworCQlwdHIgPSAodW5zaWduZWQgbG9uZykoZGkgKyAxKTsKKwkJcHRyICs9IG5hbWVfbGVuOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGRpcmVjdG9yeSByZXBsYXkgaGFzIHR3byBwYXJ0cy4gIFRoZXJlIGFyZSB0aGUgc3RhbmRhcmQgZGlyZWN0b3J5CisgKiBpdGVtcyBpbiB0aGUgbG9nIGNvcGllZCBmcm9tIHRoZSBzdWJ2b2x1bWUsIGFuZCByYW5nZSBpdGVtcworICogY3JlYXRlZCBpbiB0aGUgbG9nIHdoaWxlIHRoZSBzdWJ2b2x1bWUgd2FzIGxvZ2dlZC4KKyAqCisgKiBUaGUgcmFuZ2UgaXRlbXMgdGVsbCB1cyB3aGljaCBwYXJ0cyBvZiB0aGUga2V5IHNwYWNlIHRoZSBsb2cKKyAqIGlzIGF1dGhvcml0YXRpdmUgZm9yLiAgRHVyaW5nIHJlcGxheSwgaWYgYSBrZXkgaW4gdGhlIHN1YnZvbHVtZQorICogZGlyZWN0b3J5IGlzIGluIGEgbG9nZ2VkIHJhbmdlIGl0ZW0sIGJ1dCBub3QgYWN0dWFsbHkgaW4gdGhlIGxvZworICogdGhhdCBtZWFucyBpdCB3YXMgZGVsZXRlZCBmcm9tIHRoZSBkaXJlY3RvcnkgYmVmb3JlIHRoZSBmc3luYworICogYW5kIHNob3VsZCBiZSByZW1vdmVkLgorICovCitzdGF0aWMgbm9pbmxpbmUgaW50IGZpbmRfZGlyX3JhbmdlKHN0cnVjdCBidHJmc19yb290ICpyb290LAorCQkJCSAgIHN0cnVjdCBidHJmc19wYXRoICpwYXRoLAorCQkJCSAgIHU2NCBkaXJpZCwgaW50IGtleV90eXBlLAorCQkJCSAgIHU2NCAqc3RhcnRfcmV0LCB1NjQgKmVuZF9yZXQpCit7CisJc3RydWN0IGJ0cmZzX2tleSBrZXk7CisJdTY0IGZvdW5kX2VuZDsKKwlzdHJ1Y3QgYnRyZnNfZGlyX2xvZ19pdGVtICppdGVtOworCWludCByZXQ7CisJaW50IG5yaXRlbXM7CisKKwlpZiAoKnN0YXJ0X3JldCA9PSAodTY0KS0xKQorCQlyZXR1cm4gMTsKKworCWtleS5vYmplY3RpZCA9IGRpcmlkOworCWtleS50eXBlID0ga2V5X3R5cGU7CisJa2V5Lm9mZnNldCA9ICpzdGFydF9yZXQ7CisKKwlyZXQgPSBidHJmc19zZWFyY2hfc2xvdChOVUxMLCByb290LCAma2V5LCBwYXRoLCAwLCAwKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXQ7CisJaWYgKHJldCA+IDApIHsKKwkJaWYgKHBhdGgtPnNsb3RzWzBdID09IDApCisJCQlnb3RvIG91dDsKKwkJcGF0aC0+c2xvdHNbMF0tLTsKKwl9CisJaWYgKHJldCAhPSAwKQorCQlidHJmc19pdGVtX2tleV90b19jcHUocGF0aC0+bm9kZXNbMF0sICZrZXksIHBhdGgtPnNsb3RzWzBdKTsKKworCWlmIChrZXkudHlwZSAhPSBrZXlfdHlwZSB8fCBrZXkub2JqZWN0aWQgIT0gZGlyaWQpIHsKKwkJcmV0ID0gMTsKKwkJZ290byBuZXh0OworCX0KKwlpdGVtID0gYnRyZnNfaXRlbV9wdHIocGF0aC0+bm9kZXNbMF0sIHBhdGgtPnNsb3RzWzBdLAorCQkJICAgICAgc3RydWN0IGJ0cmZzX2Rpcl9sb2dfaXRlbSk7CisJZm91bmRfZW5kID0gYnRyZnNfZGlyX2xvZ19lbmQocGF0aC0+bm9kZXNbMF0sIGl0ZW0pOworCisJaWYgKCpzdGFydF9yZXQgPj0ga2V5Lm9mZnNldCAmJiAqc3RhcnRfcmV0IDw9IGZvdW5kX2VuZCkgeworCQlyZXQgPSAwOworCQkqc3RhcnRfcmV0ID0ga2V5Lm9mZnNldDsKKwkJKmVuZF9yZXQgPSBmb3VuZF9lbmQ7CisJCWdvdG8gb3V0OworCX0KKwlyZXQgPSAxOworbmV4dDoKKwkvKiBjaGVjayB0aGUgbmV4dCBzbG90IGluIHRoZSB0cmVlIHRvIHNlZSBpZiBpdCBpcyBhIHZhbGlkIGl0ZW0gKi8KKwlucml0ZW1zID0gYnRyZnNfaGVhZGVyX25yaXRlbXMocGF0aC0+bm9kZXNbMF0pOworCWlmIChwYXRoLT5zbG90c1swXSA+PSBucml0ZW1zKSB7CisJCXJldCA9IGJ0cmZzX25leHRfbGVhZihyb290LCBwYXRoKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gb3V0OworCX0gZWxzZSB7CisJCXBhdGgtPnNsb3RzWzBdKys7CisJfQorCisJYnRyZnNfaXRlbV9rZXlfdG9fY3B1KHBhdGgtPm5vZGVzWzBdLCAma2V5LCBwYXRoLT5zbG90c1swXSk7CisKKwlpZiAoa2V5LnR5cGUgIT0ga2V5X3R5cGUgfHwga2V5Lm9iamVjdGlkICE9IGRpcmlkKSB7CisJCXJldCA9IDE7CisJCWdvdG8gb3V0OworCX0KKwlpdGVtID0gYnRyZnNfaXRlbV9wdHIocGF0aC0+bm9kZXNbMF0sIHBhdGgtPnNsb3RzWzBdLAorCQkJICAgICAgc3RydWN0IGJ0cmZzX2Rpcl9sb2dfaXRlbSk7CisJZm91bmRfZW5kID0gYnRyZnNfZGlyX2xvZ19lbmQocGF0aC0+bm9kZXNbMF0sIGl0ZW0pOworCSpzdGFydF9yZXQgPSBrZXkub2Zmc2V0OworCSplbmRfcmV0ID0gZm91bmRfZW5kOworCXJldCA9IDA7CitvdXQ6CisJYnRyZnNfcmVsZWFzZV9wYXRoKHJvb3QsIHBhdGgpOworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiB0aGlzIGxvb2tzIGZvciBhIGdpdmVuIGRpcmVjdG9yeSBpdGVtIGluIHRoZSBsb2cuICBJZiB0aGUgZGlyZWN0b3J5CisgKiBpdGVtIGlzIG5vdCBpbiB0aGUgbG9nLCB0aGUgaXRlbSBpcyByZW1vdmVkIGFuZCB0aGUgaW5vZGUgaXQgcG9pbnRzCisgKiB0byBpcyB1bmxpbmtlZAorICovCitzdGF0aWMgbm9pbmxpbmUgaW50IGNoZWNrX2l0ZW1faW5fbG9nKHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAorCQkJCSAgICAgIHN0cnVjdCBidHJmc19yb290ICpyb290LAorCQkJCSAgICAgIHN0cnVjdCBidHJmc19yb290ICpsb2csCisJCQkJICAgICAgc3RydWN0IGJ0cmZzX3BhdGggKnBhdGgsCisJCQkJICAgICAgc3RydWN0IGJ0cmZzX3BhdGggKmxvZ19wYXRoLAorCQkJCSAgICAgIHN0cnVjdCBpbm9kZSAqZGlyLAorCQkJCSAgICAgIHN0cnVjdCBidHJmc19rZXkgKmRpcl9rZXkpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqZWI7CisJaW50IHNsb3Q7CisJdTMyIGl0ZW1fc2l6ZTsKKwlzdHJ1Y3QgYnRyZnNfZGlyX2l0ZW0gKmRpOworCXN0cnVjdCBidHJmc19kaXJfaXRlbSAqbG9nX2RpOworCWludCBuYW1lX2xlbjsKKwl1bnNpZ25lZCBsb25nIHB0cjsKKwl1bnNpZ25lZCBsb25nIHB0cl9lbmQ7CisJY2hhciAqbmFtZTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCXN0cnVjdCBidHJmc19rZXkgbG9jYXRpb247CisKK2FnYWluOgorCWViID0gcGF0aC0+bm9kZXNbMF07CisJc2xvdCA9IHBhdGgtPnNsb3RzWzBdOworCWl0ZW1fc2l6ZSA9IGJ0cmZzX2l0ZW1fc2l6ZV9ucihlYiwgc2xvdCk7CisJcHRyID0gYnRyZnNfaXRlbV9wdHJfb2Zmc2V0KGViLCBzbG90KTsKKwlwdHJfZW5kID0gcHRyICsgaXRlbV9zaXplOworCXdoaWxlIChwdHIgPCBwdHJfZW5kKSB7CisJCWRpID0gKHN0cnVjdCBidHJmc19kaXJfaXRlbSAqKXB0cjsKKwkJbmFtZV9sZW4gPSBidHJmc19kaXJfbmFtZV9sZW4oZWIsIGRpKTsKKwkJbmFtZSA9IGttYWxsb2MobmFtZV9sZW4sIEdGUF9OT0ZTKTsKKwkJaWYgKCFuYW1lKSB7CisJCQlyZXQgPSAtRU5PTUVNOworCQkJZ290byBvdXQ7CisJCX0KKwkJcmVhZF9leHRlbnRfYnVmZmVyKGViLCBuYW1lLCAodW5zaWduZWQgbG9uZykoZGkgKyAxKSwKKwkJCQkgIG5hbWVfbGVuKTsKKwkJbG9nX2RpID0gTlVMTDsKKwkJaWYgKGRpcl9rZXktPnR5cGUgPT0gQlRSRlNfRElSX0lURU1fS0VZKSB7CisJCQlsb2dfZGkgPSBidHJmc19sb29rdXBfZGlyX2l0ZW0odHJhbnMsIGxvZywgbG9nX3BhdGgsCisJCQkJCQkgICAgICAgZGlyX2tleS0+b2JqZWN0aWQsCisJCQkJCQkgICAgICAgbmFtZSwgbmFtZV9sZW4sIDApOworCQl9IGVsc2UgaWYgKGRpcl9rZXktPnR5cGUgPT0gQlRSRlNfRElSX0lOREVYX0tFWSkgeworCQkJbG9nX2RpID0gYnRyZnNfbG9va3VwX2Rpcl9pbmRleF9pdGVtKHRyYW5zLCBsb2csCisJCQkJCQkgICAgIGxvZ19wYXRoLAorCQkJCQkJICAgICBkaXJfa2V5LT5vYmplY3RpZCwKKwkJCQkJCSAgICAgZGlyX2tleS0+b2Zmc2V0LAorCQkJCQkJICAgICBuYW1lLCBuYW1lX2xlbiwgMCk7CisJCX0KKwkJaWYgKCFsb2dfZGkgfHwgSVNfRVJSKGxvZ19kaSkpIHsKKwkJCWJ0cmZzX2Rpcl9pdGVtX2tleV90b19jcHUoZWIsIGRpLCAmbG9jYXRpb24pOworCQkJYnRyZnNfcmVsZWFzZV9wYXRoKHJvb3QsIHBhdGgpOworCQkJYnRyZnNfcmVsZWFzZV9wYXRoKGxvZywgbG9nX3BhdGgpOworCQkJaW5vZGUgPSByZWFkX29uZV9pbm9kZShyb290LCBsb2NhdGlvbi5vYmplY3RpZCk7CisJCQlCVUdfT04oIWlub2RlKTsKKworCQkJcmV0ID0gbGlua190b19maXh1cF9kaXIodHJhbnMsIHJvb3QsCisJCQkJCQlwYXRoLCBsb2NhdGlvbi5vYmplY3RpZCk7CisJCQlCVUdfT04ocmV0KTsKKwkJCWJ0cmZzX2luY19ubGluayhpbm9kZSk7CisJCQlyZXQgPSBidHJmc191bmxpbmtfaW5vZGUodHJhbnMsIHJvb3QsIGRpciwgaW5vZGUsCisJCQkJCQkgbmFtZSwgbmFtZV9sZW4pOworCQkJQlVHX09OKHJldCk7CisJCQlrZnJlZShuYW1lKTsKKwkJCWlwdXQoaW5vZGUpOworCisJCQkvKiB0aGVyZSBtaWdodCBzdGlsbCBiZSBtb3JlIG5hbWVzIHVuZGVyIHRoaXMga2V5CisJCQkgKiBjaGVjayBhbmQgcmVwZWF0IGlmIHJlcXVpcmVkCisJCQkgKi8KKwkJCXJldCA9IGJ0cmZzX3NlYXJjaF9zbG90KE5VTEwsIHJvb3QsIGRpcl9rZXksIHBhdGgsCisJCQkJCQkwLCAwKTsKKwkJCWlmIChyZXQgPT0gMCkKKwkJCQlnb3RvIGFnYWluOworCQkJcmV0ID0gMDsKKwkJCWdvdG8gb3V0OworCQl9CisJCWJ0cmZzX3JlbGVhc2VfcGF0aChsb2csIGxvZ19wYXRoKTsKKwkJa2ZyZWUobmFtZSk7CisKKwkJcHRyID0gKHVuc2lnbmVkIGxvbmcpKGRpICsgMSk7CisJCXB0ciArPSBuYW1lX2xlbjsKKwl9CisJcmV0ID0gMDsKK291dDoKKwlidHJmc19yZWxlYXNlX3BhdGgocm9vdCwgcGF0aCk7CisJYnRyZnNfcmVsZWFzZV9wYXRoKGxvZywgbG9nX3BhdGgpOworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBkZWxldGlvbiByZXBsYXkgaGFwcGVucyBiZWZvcmUgd2UgY29weSBhbnkgbmV3IGRpcmVjdG9yeSBpdGVtcworICogb3V0IG9mIHRoZSBsb2cgb3Igb3V0IG9mIGJhY2tyZWZlcmVuY2VzIGZyb20gaW5vZGVzLiAgSXQKKyAqIHNjYW5zIHRoZSBsb2cgdG8gZmluZCByYW5nZXMgb2Yga2V5cyB0aGF0IGxvZyBpcyBhdXRob3JpdGF0aXZlIGZvciwKKyAqIGFuZCB0aGVuIHNjYW5zIHRoZSBkaXJlY3RvcnkgdG8gZmluZCBpdGVtcyBpbiB0aG9zZSByYW5nZXMgdGhhdCBhcmUKKyAqIG5vdCBwcmVzZW50IGluIHRoZSBsb2cuCisgKgorICogQW55dGhpbmcgd2UgZG9uJ3QgZmluZCBpbiB0aGUgbG9nIGlzIHVubGlua2VkIGFuZCByZW1vdmVkIGZyb20gdGhlCisgKiBkaXJlY3RvcnkuCisgKi8KK3N0YXRpYyBub2lubGluZSBpbnQgcmVwbGF5X2Rpcl9kZWxldGVzKHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAorCQkJCSAgICAgICBzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwKKwkJCQkgICAgICAgc3RydWN0IGJ0cmZzX3Jvb3QgKmxvZywKKwkJCQkgICAgICAgc3RydWN0IGJ0cmZzX3BhdGggKnBhdGgsCisJCQkJICAgICAgIHU2NCBkaXJpZCkKK3sKKwl1NjQgcmFuZ2Vfc3RhcnQ7CisJdTY0IHJhbmdlX2VuZDsKKwlpbnQga2V5X3R5cGUgPSBCVFJGU19ESVJfTE9HX0lURU1fS0VZOworCWludCByZXQgPSAwOworCXN0cnVjdCBidHJmc19rZXkgZGlyX2tleTsKKwlzdHJ1Y3QgYnRyZnNfa2V5IGZvdW5kX2tleTsKKwlzdHJ1Y3QgYnRyZnNfcGF0aCAqbG9nX3BhdGg7CisJc3RydWN0IGlub2RlICpkaXI7CisKKwlkaXJfa2V5Lm9iamVjdGlkID0gZGlyaWQ7CisJZGlyX2tleS50eXBlID0gQlRSRlNfRElSX0lURU1fS0VZOworCWxvZ19wYXRoID0gYnRyZnNfYWxsb2NfcGF0aCgpOworCWlmICghbG9nX3BhdGgpCisJCXJldHVybiAtRU5PTUVNOworCisJZGlyID0gcmVhZF9vbmVfaW5vZGUocm9vdCwgZGlyaWQpOworCS8qIGl0IGlzbid0IGFuIGVycm9yIGlmIHRoZSBpbm9kZSBpc24ndCB0aGVyZSwgdGhhdCBjYW4gaGFwcGVuCisJICogYmVjYXVzZSB3ZSByZXBsYXkgdGhlIGRlbGV0ZXMgYmVmb3JlIHdlIGNvcHkgaW4gdGhlIGlub2RlIGl0ZW0KKwkgKiBmcm9tIHRoZSBsb2cKKwkgKi8KKwlpZiAoIWRpcikgeworCQlidHJmc19mcmVlX3BhdGgobG9nX3BhdGgpOworCQlyZXR1cm4gMDsKKwl9CithZ2FpbjoKKwlyYW5nZV9zdGFydCA9IDA7CisJcmFuZ2VfZW5kID0gMDsKKwl3aGlsZSAoMSkgeworCQlyZXQgPSBmaW5kX2Rpcl9yYW5nZShsb2csIHBhdGgsIGRpcmlkLCBrZXlfdHlwZSwKKwkJCQkgICAgICZyYW5nZV9zdGFydCwgJnJhbmdlX2VuZCk7CisJCWlmIChyZXQgIT0gMCkKKwkJCWJyZWFrOworCisJCWRpcl9rZXkub2Zmc2V0ID0gcmFuZ2Vfc3RhcnQ7CisJCXdoaWxlICgxKSB7CisJCQlpbnQgbnJpdGVtczsKKwkJCXJldCA9IGJ0cmZzX3NlYXJjaF9zbG90KE5VTEwsIHJvb3QsICZkaXJfa2V5LCBwYXRoLAorCQkJCQkJMCwgMCk7CisJCQlpZiAocmV0IDwgMCkKKwkJCQlnb3RvIG91dDsKKworCQkJbnJpdGVtcyA9IGJ0cmZzX2hlYWRlcl9ucml0ZW1zKHBhdGgtPm5vZGVzWzBdKTsKKwkJCWlmIChwYXRoLT5zbG90c1swXSA+PSBucml0ZW1zKSB7CisJCQkJcmV0ID0gYnRyZnNfbmV4dF9sZWFmKHJvb3QsIHBhdGgpOworCQkJCWlmIChyZXQpCisJCQkJCWJyZWFrOworCQkJfQorCQkJYnRyZnNfaXRlbV9rZXlfdG9fY3B1KHBhdGgtPm5vZGVzWzBdLCAmZm91bmRfa2V5LAorCQkJCQkgICAgICBwYXRoLT5zbG90c1swXSk7CisJCQlpZiAoZm91bmRfa2V5Lm9iamVjdGlkICE9IGRpcmlkIHx8CisJCQkgICAgZm91bmRfa2V5LnR5cGUgIT0gZGlyX2tleS50eXBlKQorCQkJCWdvdG8gbmV4dF90eXBlOworCisJCQlpZiAoZm91bmRfa2V5Lm9mZnNldCA+IHJhbmdlX2VuZCkKKwkJCQlicmVhazsKKworCQkJcmV0ID0gY2hlY2tfaXRlbV9pbl9sb2codHJhbnMsIHJvb3QsIGxvZywgcGF0aCwKKwkJCQkJCWxvZ19wYXRoLCBkaXIsICZmb3VuZF9rZXkpOworCQkJQlVHX09OKHJldCk7CisJCQlpZiAoZm91bmRfa2V5Lm9mZnNldCA9PSAodTY0KS0xKQorCQkJCWJyZWFrOworCQkJZGlyX2tleS5vZmZzZXQgPSBmb3VuZF9rZXkub2Zmc2V0ICsgMTsKKwkJfQorCQlidHJmc19yZWxlYXNlX3BhdGgocm9vdCwgcGF0aCk7CisJCWlmIChyYW5nZV9lbmQgPT0gKHU2NCktMSkKKwkJCWJyZWFrOworCQlyYW5nZV9zdGFydCA9IHJhbmdlX2VuZCArIDE7CisJfQorCituZXh0X3R5cGU6CisJcmV0ID0gMDsKKwlpZiAoa2V5X3R5cGUgPT0gQlRSRlNfRElSX0xPR19JVEVNX0tFWSkgeworCQlrZXlfdHlwZSA9IEJUUkZTX0RJUl9MT0dfSU5ERVhfS0VZOworCQlkaXJfa2V5LnR5cGUgPSBCVFJGU19ESVJfSU5ERVhfS0VZOworCQlidHJmc19yZWxlYXNlX3BhdGgocm9vdCwgcGF0aCk7CisJCWdvdG8gYWdhaW47CisJfQorb3V0OgorCWJ0cmZzX3JlbGVhc2VfcGF0aChyb290LCBwYXRoKTsKKwlidHJmc19mcmVlX3BhdGgobG9nX3BhdGgpOworCWlwdXQoZGlyKTsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogdGhlIHByb2Nlc3NfZnVuYyB1c2VkIHRvIHJlcGxheSBpdGVtcyBmcm9tIHRoZSBsb2cgdHJlZS4gIFRoaXMKKyAqIGdldHMgY2FsbGVkIGluIHR3byBkaWZmZXJlbnQgc3RhZ2VzLiAgVGhlIGZpcnN0IHN0YWdlIGp1c3QgbG9va3MKKyAqIGZvciBpbm9kZXMgYW5kIG1ha2VzIHN1cmUgdGhleSBhcmUgYWxsIGNvcGllZCBpbnRvIHRoZSBzdWJ2b2x1bWUuCisgKgorICogVGhlIHNlY29uZCBzdGFnZSBjb3BpZXMgYWxsIHRoZSBvdGhlciBpdGVtIHR5cGVzIGZyb20gdGhlIGxvZyBpbnRvCisgKiB0aGUgc3Vidm9sdW1lLiAgVGhlIHR3byBzdGFnZSBhcHByb2FjaCBpcyBzbG93ZXIsIGJ1dCBnZXRzIHJpZCBvZgorICogbG90cyBvZiBjb21wbGV4aXR5IGFyb3VuZCBpbm9kZXMgcmVmZXJlbmNpbmcgb3RoZXIgaW5vZGVzIHRoYXQgZXhpc3QKKyAqIG9ubHkgaW4gdGhlIGxvZyAocmVmZXJlbmNlcyBjb21lIGZyb20gZWl0aGVyIGRpcmVjdG9yeSBpdGVtcyBvciBpbm9kZQorICogYmFjayByZWZzKS4KKyAqLworc3RhdGljIGludCByZXBsYXlfb25lX2J1ZmZlcihzdHJ1Y3QgYnRyZnNfcm9vdCAqbG9nLCBzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqZWIsCisJCQkgICAgIHN0cnVjdCB3YWxrX2NvbnRyb2wgKndjLCB1NjQgZ2VuKQoreworCWludCBucml0ZW1zOworCXN0cnVjdCBidHJmc19wYXRoICpwYXRoOworCXN0cnVjdCBidHJmc19yb290ICpyb290ID0gd2MtPnJlcGxheV9kZXN0OworCXN0cnVjdCBidHJmc19rZXkga2V5OworCXUzMiBpdGVtX3NpemU7CisJaW50IGxldmVsOworCWludCBpOworCWludCByZXQ7CisKKwlidHJmc19yZWFkX2J1ZmZlcihlYiwgZ2VuKTsKKworCWxldmVsID0gYnRyZnNfaGVhZGVyX2xldmVsKGViKTsKKworCWlmIChsZXZlbCAhPSAwKQorCQlyZXR1cm4gMDsKKworCXBhdGggPSBidHJmc19hbGxvY19wYXRoKCk7CisJQlVHX09OKCFwYXRoKTsKKworCW5yaXRlbXMgPSBidHJmc19oZWFkZXJfbnJpdGVtcyhlYik7CisJZm9yIChpID0gMDsgaSA8IG5yaXRlbXM7IGkrKykgeworCQlidHJmc19pdGVtX2tleV90b19jcHUoZWIsICZrZXksIGkpOworCQlpdGVtX3NpemUgPSBidHJmc19pdGVtX3NpemVfbnIoZWIsIGkpOworCisJCS8qIGlub2RlIGtleXMgYXJlIGRvbmUgZHVyaW5nIHRoZSBmaXJzdCBzdGFnZSAqLworCQlpZiAoa2V5LnR5cGUgPT0gQlRSRlNfSU5PREVfSVRFTV9LRVkgJiYKKwkJICAgIHdjLT5zdGFnZSA9PSBMT0dfV0FMS19SRVBMQVlfSU5PREVTKSB7CisJCQlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCQkJc3RydWN0IGJ0cmZzX2lub2RlX2l0ZW0gKmlub2RlX2l0ZW07CisJCQl1MzIgbW9kZTsKKworCQkJaW5vZGVfaXRlbSA9IGJ0cmZzX2l0ZW1fcHRyKGViLCBpLAorCQkJCQkgICAgc3RydWN0IGJ0cmZzX2lub2RlX2l0ZW0pOworCQkJbW9kZSA9IGJ0cmZzX2lub2RlX21vZGUoZWIsIGlub2RlX2l0ZW0pOworCQkJaWYgKFNfSVNESVIobW9kZSkpIHsKKwkJCQlyZXQgPSByZXBsYXlfZGlyX2RlbGV0ZXMod2MtPnRyYW5zLAorCQkJCQkgcm9vdCwgbG9nLCBwYXRoLCBrZXkub2JqZWN0aWQpOworCQkJCUJVR19PTihyZXQpOworCQkJfQorCQkJcmV0ID0gb3ZlcndyaXRlX2l0ZW0od2MtPnRyYW5zLCByb290LCBwYXRoLAorCQkJCQkgICAgIGViLCBpLCAma2V5KTsKKwkJCUJVR19PTihyZXQpOworCisJCQkvKiBmb3IgcmVndWxhciBmaWxlcywgdHJ1bmNhdGUgYXdheQorCQkJICogZXh0ZW50cyBwYXN0IHRoZSBuZXcgRU9GCisJCQkgKi8KKwkJCWlmIChTX0lTUkVHKG1vZGUpKSB7CisJCQkJaW5vZGUgPSByZWFkX29uZV9pbm9kZShyb290LAorCQkJCQkJICAgICAgIGtleS5vYmplY3RpZCk7CisJCQkJQlVHX09OKCFpbm9kZSk7CisKKwkJCQlyZXQgPSBidHJmc190cnVuY2F0ZV9pbm9kZV9pdGVtcyh3Yy0+dHJhbnMsCisJCQkJCXJvb3QsIGlub2RlLCBpbm9kZS0+aV9zaXplLAorCQkJCQlCVFJGU19FWFRFTlRfREFUQV9LRVkpOworCQkJCUJVR19PTihyZXQpOworCQkJCWlwdXQoaW5vZGUpOworCQkJfQorCQkJcmV0ID0gbGlua190b19maXh1cF9kaXIod2MtPnRyYW5zLCByb290LAorCQkJCQkJcGF0aCwga2V5Lm9iamVjdGlkKTsKKwkJCUJVR19PTihyZXQpOworCQl9CisJCWlmICh3Yy0+c3RhZ2UgPCBMT0dfV0FMS19SRVBMQVlfQUxMKQorCQkJY29udGludWU7CisKKwkJLyogdGhlc2Uga2V5cyBhcmUgc2ltcGx5IGNvcGllZCAqLworCQlpZiAoa2V5LnR5cGUgPT0gQlRSRlNfWEFUVFJfSVRFTV9LRVkpIHsKKwkJCXJldCA9IG92ZXJ3cml0ZV9pdGVtKHdjLT50cmFucywgcm9vdCwgcGF0aCwKKwkJCQkJICAgICBlYiwgaSwgJmtleSk7CisJCQlCVUdfT04ocmV0KTsKKwkJfSBlbHNlIGlmIChrZXkudHlwZSA9PSBCVFJGU19JTk9ERV9SRUZfS0VZKSB7CisJCQlyZXQgPSBhZGRfaW5vZGVfcmVmKHdjLT50cmFucywgcm9vdCwgbG9nLCBwYXRoLAorCQkJCQkgICAgZWIsIGksICZrZXkpOworCQkJQlVHX09OKHJldCAmJiByZXQgIT0gLUVOT0VOVCk7CisJCX0gZWxzZSBpZiAoa2V5LnR5cGUgPT0gQlRSRlNfRVhURU5UX0RBVEFfS0VZKSB7CisJCQlyZXQgPSByZXBsYXlfb25lX2V4dGVudCh3Yy0+dHJhbnMsIHJvb3QsIHBhdGgsCisJCQkJCQllYiwgaSwgJmtleSk7CisJCQlCVUdfT04ocmV0KTsKKwkJfSBlbHNlIGlmIChrZXkudHlwZSA9PSBCVFJGU19ESVJfSVRFTV9LRVkgfHwKKwkJCSAgIGtleS50eXBlID09IEJUUkZTX0RJUl9JTkRFWF9LRVkpIHsKKwkJCXJldCA9IHJlcGxheV9vbmVfZGlyX2l0ZW0od2MtPnRyYW5zLCByb290LCBwYXRoLAorCQkJCQkJICBlYiwgaSwgJmtleSk7CisJCQlCVUdfT04ocmV0KTsKKwkJfQorCX0KKwlidHJmc19mcmVlX3BhdGgocGF0aCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBub2lubGluZSBpbnQgd2Fsa19kb3duX2xvZ190cmVlKHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAorCQkJCSAgIHN0cnVjdCBidHJmc19yb290ICpyb290LAorCQkJCSAgIHN0cnVjdCBidHJmc19wYXRoICpwYXRoLCBpbnQgKmxldmVsLAorCQkJCSAgIHN0cnVjdCB3YWxrX2NvbnRyb2wgKndjKQoreworCXU2NCByb290X293bmVyOworCXU2NCByb290X2dlbjsKKwl1NjQgYnl0ZW5yOworCXU2NCBwdHJfZ2VuOworCXN0cnVjdCBleHRlbnRfYnVmZmVyICpuZXh0OworCXN0cnVjdCBleHRlbnRfYnVmZmVyICpjdXI7CisJc3RydWN0IGV4dGVudF9idWZmZXIgKnBhcmVudDsKKwl1MzIgYmxvY2tzaXplOworCWludCByZXQgPSAwOworCisJV0FSTl9PTigqbGV2ZWwgPCAwKTsKKwlXQVJOX09OKCpsZXZlbCA+PSBCVFJGU19NQVhfTEVWRUwpOworCisJd2hpbGUgKCpsZXZlbCA+IDApIHsKKwkJV0FSTl9PTigqbGV2ZWwgPCAwKTsKKwkJV0FSTl9PTigqbGV2ZWwgPj0gQlRSRlNfTUFYX0xFVkVMKTsKKwkJY3VyID0gcGF0aC0+bm9kZXNbKmxldmVsXTsKKworCQlpZiAoYnRyZnNfaGVhZGVyX2xldmVsKGN1cikgIT0gKmxldmVsKQorCQkJV0FSTl9PTigxKTsKKworCQlpZiAocGF0aC0+c2xvdHNbKmxldmVsXSA+PQorCQkgICAgYnRyZnNfaGVhZGVyX25yaXRlbXMoY3VyKSkKKwkJCWJyZWFrOworCisJCWJ5dGVuciA9IGJ0cmZzX25vZGVfYmxvY2twdHIoY3VyLCBwYXRoLT5zbG90c1sqbGV2ZWxdKTsKKwkJcHRyX2dlbiA9IGJ0cmZzX25vZGVfcHRyX2dlbmVyYXRpb24oY3VyLCBwYXRoLT5zbG90c1sqbGV2ZWxdKTsKKwkJYmxvY2tzaXplID0gYnRyZnNfbGV2ZWxfc2l6ZShyb290LCAqbGV2ZWwgLSAxKTsKKworCQlwYXJlbnQgPSBwYXRoLT5ub2Rlc1sqbGV2ZWxdOworCQlyb290X293bmVyID0gYnRyZnNfaGVhZGVyX293bmVyKHBhcmVudCk7CisJCXJvb3RfZ2VuID0gYnRyZnNfaGVhZGVyX2dlbmVyYXRpb24ocGFyZW50KTsKKworCQluZXh0ID0gYnRyZnNfZmluZF9jcmVhdGVfdHJlZV9ibG9jayhyb290LCBieXRlbnIsIGJsb2Nrc2l6ZSk7CisKKwkJd2MtPnByb2Nlc3NfZnVuYyhyb290LCBuZXh0LCB3YywgcHRyX2dlbik7CisKKwkJaWYgKCpsZXZlbCA9PSAxKSB7CisJCQlwYXRoLT5zbG90c1sqbGV2ZWxdKys7CisJCQlpZiAod2MtPmZyZWUpIHsKKwkJCQlidHJmc19yZWFkX2J1ZmZlcihuZXh0LCBwdHJfZ2VuKTsKKworCQkJCWJ0cmZzX3RyZWVfbG9jayhuZXh0KTsKKwkJCQljbGVhbl90cmVlX2Jsb2NrKHRyYW5zLCByb290LCBuZXh0KTsKKwkJCQlidHJmc193YWl0X3RyZWVfYmxvY2tfd3JpdGViYWNrKG5leHQpOworCQkJCWJ0cmZzX3RyZWVfdW5sb2NrKG5leHQpOworCisJCQkJcmV0ID0gYnRyZnNfZHJvcF9sZWFmX3JlZih0cmFucywgcm9vdCwgbmV4dCk7CisJCQkJQlVHX09OKHJldCk7CisKKwkJCQlXQVJOX09OKHJvb3Rfb3duZXIgIT0KKwkJCQkJQlRSRlNfVFJFRV9MT0dfT0JKRUNUSUQpOworCQkJCXJldCA9IGJ0cmZzX2ZyZWVfcmVzZXJ2ZWRfZXh0ZW50KHJvb3QsCisJCQkJCQkJIGJ5dGVuciwgYmxvY2tzaXplKTsKKwkJCQlCVUdfT04ocmV0KTsKKwkJCX0KKwkJCWZyZWVfZXh0ZW50X2J1ZmZlcihuZXh0KTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWJ0cmZzX3JlYWRfYnVmZmVyKG5leHQsIHB0cl9nZW4pOworCisJCVdBUk5fT04oKmxldmVsIDw9IDApOworCQlpZiAocGF0aC0+bm9kZXNbKmxldmVsLTFdKQorCQkJZnJlZV9leHRlbnRfYnVmZmVyKHBhdGgtPm5vZGVzWypsZXZlbC0xXSk7CisJCXBhdGgtPm5vZGVzWypsZXZlbC0xXSA9IG5leHQ7CisJCSpsZXZlbCA9IGJ0cmZzX2hlYWRlcl9sZXZlbChuZXh0KTsKKwkJcGF0aC0+c2xvdHNbKmxldmVsXSA9IDA7CisJCWNvbmRfcmVzY2hlZCgpOworCX0KKwlXQVJOX09OKCpsZXZlbCA8IDApOworCVdBUk5fT04oKmxldmVsID49IEJUUkZTX01BWF9MRVZFTCk7CisKKwlpZiAocGF0aC0+bm9kZXNbKmxldmVsXSA9PSByb290LT5ub2RlKQorCQlwYXJlbnQgPSBwYXRoLT5ub2Rlc1sqbGV2ZWxdOworCWVsc2UKKwkJcGFyZW50ID0gcGF0aC0+bm9kZXNbKmxldmVsICsgMV07CisKKwlieXRlbnIgPSBwYXRoLT5ub2Rlc1sqbGV2ZWxdLT5zdGFydDsKKworCWJsb2Nrc2l6ZSA9IGJ0cmZzX2xldmVsX3NpemUocm9vdCwgKmxldmVsKTsKKwlyb290X293bmVyID0gYnRyZnNfaGVhZGVyX293bmVyKHBhcmVudCk7CisJcm9vdF9nZW4gPSBidHJmc19oZWFkZXJfZ2VuZXJhdGlvbihwYXJlbnQpOworCisJd2MtPnByb2Nlc3NfZnVuYyhyb290LCBwYXRoLT5ub2Rlc1sqbGV2ZWxdLCB3YywKKwkJCSBidHJmc19oZWFkZXJfZ2VuZXJhdGlvbihwYXRoLT5ub2Rlc1sqbGV2ZWxdKSk7CisKKwlpZiAod2MtPmZyZWUpIHsKKwkJbmV4dCA9IHBhdGgtPm5vZGVzWypsZXZlbF07CisJCWJ0cmZzX3RyZWVfbG9jayhuZXh0KTsKKwkJY2xlYW5fdHJlZV9ibG9jayh0cmFucywgcm9vdCwgbmV4dCk7CisJCWJ0cmZzX3dhaXRfdHJlZV9ibG9ja193cml0ZWJhY2sobmV4dCk7CisJCWJ0cmZzX3RyZWVfdW5sb2NrKG5leHQpOworCisJCWlmICgqbGV2ZWwgPT0gMCkgeworCQkJcmV0ID0gYnRyZnNfZHJvcF9sZWFmX3JlZih0cmFucywgcm9vdCwgbmV4dCk7CisJCQlCVUdfT04ocmV0KTsKKwkJfQorCQlXQVJOX09OKHJvb3Rfb3duZXIgIT0gQlRSRlNfVFJFRV9MT0dfT0JKRUNUSUQpOworCQlyZXQgPSBidHJmc19mcmVlX3Jlc2VydmVkX2V4dGVudChyb290LCBieXRlbnIsIGJsb2Nrc2l6ZSk7CisJCUJVR19PTihyZXQpOworCX0KKwlmcmVlX2V4dGVudF9idWZmZXIocGF0aC0+bm9kZXNbKmxldmVsXSk7CisJcGF0aC0+bm9kZXNbKmxldmVsXSA9IE5VTEw7CisJKmxldmVsICs9IDE7CisKKwljb25kX3Jlc2NoZWQoKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIG5vaW5saW5lIGludCB3YWxrX3VwX2xvZ190cmVlKHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAorCQkJCSBzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwKKwkJCQkgc3RydWN0IGJ0cmZzX3BhdGggKnBhdGgsIGludCAqbGV2ZWwsCisJCQkJIHN0cnVjdCB3YWxrX2NvbnRyb2wgKndjKQoreworCXU2NCByb290X293bmVyOworCXU2NCByb290X2dlbjsKKwlpbnQgaTsKKwlpbnQgc2xvdDsKKwlpbnQgcmV0OworCisJZm9yIChpID0gKmxldmVsOyBpIDwgQlRSRlNfTUFYX0xFVkVMIC0gMSAmJiBwYXRoLT5ub2Rlc1tpXTsgaSsrKSB7CisJCXNsb3QgPSBwYXRoLT5zbG90c1tpXTsKKwkJaWYgKHNsb3QgPCBidHJmc19oZWFkZXJfbnJpdGVtcyhwYXRoLT5ub2Rlc1tpXSkgLSAxKSB7CisJCQlzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqbm9kZTsKKwkJCW5vZGUgPSBwYXRoLT5ub2Rlc1tpXTsKKwkJCXBhdGgtPnNsb3RzW2ldKys7CisJCQkqbGV2ZWwgPSBpOworCQkJV0FSTl9PTigqbGV2ZWwgPT0gMCk7CisJCQlyZXR1cm4gMDsKKwkJfSBlbHNlIHsKKwkJCXN0cnVjdCBleHRlbnRfYnVmZmVyICpwYXJlbnQ7CisJCQlpZiAocGF0aC0+bm9kZXNbKmxldmVsXSA9PSByb290LT5ub2RlKQorCQkJCXBhcmVudCA9IHBhdGgtPm5vZGVzWypsZXZlbF07CisJCQllbHNlCisJCQkJcGFyZW50ID0gcGF0aC0+bm9kZXNbKmxldmVsICsgMV07CisKKwkJCXJvb3Rfb3duZXIgPSBidHJmc19oZWFkZXJfb3duZXIocGFyZW50KTsKKwkJCXJvb3RfZ2VuID0gYnRyZnNfaGVhZGVyX2dlbmVyYXRpb24ocGFyZW50KTsKKwkJCXdjLT5wcm9jZXNzX2Z1bmMocm9vdCwgcGF0aC0+bm9kZXNbKmxldmVsXSwgd2MsCisJCQkJIGJ0cmZzX2hlYWRlcl9nZW5lcmF0aW9uKHBhdGgtPm5vZGVzWypsZXZlbF0pKTsKKwkJCWlmICh3Yy0+ZnJlZSkgeworCQkJCXN0cnVjdCBleHRlbnRfYnVmZmVyICpuZXh0OworCisJCQkJbmV4dCA9IHBhdGgtPm5vZGVzWypsZXZlbF07CisKKwkJCQlidHJmc190cmVlX2xvY2sobmV4dCk7CisJCQkJY2xlYW5fdHJlZV9ibG9jayh0cmFucywgcm9vdCwgbmV4dCk7CisJCQkJYnRyZnNfd2FpdF90cmVlX2Jsb2NrX3dyaXRlYmFjayhuZXh0KTsKKwkJCQlidHJmc190cmVlX3VubG9jayhuZXh0KTsKKworCQkJCWlmICgqbGV2ZWwgPT0gMCkgeworCQkJCQlyZXQgPSBidHJmc19kcm9wX2xlYWZfcmVmKHRyYW5zLCByb290LAorCQkJCQkJCQkgIG5leHQpOworCQkJCQlCVUdfT04ocmV0KTsKKwkJCQl9CisKKwkJCQlXQVJOX09OKHJvb3Rfb3duZXIgIT0gQlRSRlNfVFJFRV9MT0dfT0JKRUNUSUQpOworCQkJCXJldCA9IGJ0cmZzX2ZyZWVfcmVzZXJ2ZWRfZXh0ZW50KHJvb3QsCisJCQkJCQlwYXRoLT5ub2Rlc1sqbGV2ZWxdLT5zdGFydCwKKwkJCQkJCXBhdGgtPm5vZGVzWypsZXZlbF0tPmxlbik7CisJCQkJQlVHX09OKHJldCk7CisJCQl9CisJCQlmcmVlX2V4dGVudF9idWZmZXIocGF0aC0+bm9kZXNbKmxldmVsXSk7CisJCQlwYXRoLT5ub2Rlc1sqbGV2ZWxdID0gTlVMTDsKKwkJCSpsZXZlbCA9IGkgKyAxOworCQl9CisJfQorCXJldHVybiAxOworfQorCisvKgorICogZHJvcCB0aGUgcmVmZXJlbmNlIGNvdW50IG9uIHRoZSB0cmVlIHJvb3RlZCBhdCAnc25hcCcuICBUaGlzIHRyYXZlcnNlcworICogdGhlIHRyZWUgZnJlZWluZyBhbnkgYmxvY2tzIHRoYXQgaGF2ZSBhIHJlZiBjb3VudCBvZiB6ZXJvIGFmdGVyIGJlaW5nCisgKiBkZWNyZW1lbnRlZC4KKyAqLworc3RhdGljIGludCB3YWxrX2xvZ190cmVlKHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAorCQkJIHN0cnVjdCBidHJmc19yb290ICpsb2csIHN0cnVjdCB3YWxrX2NvbnRyb2wgKndjKQoreworCWludCByZXQgPSAwOworCWludCB3cmV0OworCWludCBsZXZlbDsKKwlzdHJ1Y3QgYnRyZnNfcGF0aCAqcGF0aDsKKwlpbnQgaTsKKwlpbnQgb3JpZ19sZXZlbDsKKworCXBhdGggPSBidHJmc19hbGxvY19wYXRoKCk7CisJQlVHX09OKCFwYXRoKTsKKworCWxldmVsID0gYnRyZnNfaGVhZGVyX2xldmVsKGxvZy0+bm9kZSk7CisJb3JpZ19sZXZlbCA9IGxldmVsOworCXBhdGgtPm5vZGVzW2xldmVsXSA9IGxvZy0+bm9kZTsKKwlleHRlbnRfYnVmZmVyX2dldChsb2ctPm5vZGUpOworCXBhdGgtPnNsb3RzW2xldmVsXSA9IDA7CisKKwl3aGlsZSAoMSkgeworCQl3cmV0ID0gd2Fsa19kb3duX2xvZ190cmVlKHRyYW5zLCBsb2csIHBhdGgsICZsZXZlbCwgd2MpOworCQlpZiAod3JldCA+IDApCisJCQlicmVhazsKKwkJaWYgKHdyZXQgPCAwKQorCQkJcmV0ID0gd3JldDsKKworCQl3cmV0ID0gd2Fsa191cF9sb2dfdHJlZSh0cmFucywgbG9nLCBwYXRoLCAmbGV2ZWwsIHdjKTsKKwkJaWYgKHdyZXQgPiAwKQorCQkJYnJlYWs7CisJCWlmICh3cmV0IDwgMCkKKwkJCXJldCA9IHdyZXQ7CisJfQorCisJLyogd2FzIHRoZSByb290IG5vZGUgcHJvY2Vzc2VkPyBpZiBub3QsIGNhdGNoIGl0IGhlcmUgKi8KKwlpZiAocGF0aC0+bm9kZXNbb3JpZ19sZXZlbF0pIHsKKwkJd2MtPnByb2Nlc3NfZnVuYyhsb2csIHBhdGgtPm5vZGVzW29yaWdfbGV2ZWxdLCB3YywKKwkJCSBidHJmc19oZWFkZXJfZ2VuZXJhdGlvbihwYXRoLT5ub2Rlc1tvcmlnX2xldmVsXSkpOworCQlpZiAod2MtPmZyZWUpIHsKKwkJCXN0cnVjdCBleHRlbnRfYnVmZmVyICpuZXh0OworCisJCQluZXh0ID0gcGF0aC0+bm9kZXNbb3JpZ19sZXZlbF07CisKKwkJCWJ0cmZzX3RyZWVfbG9jayhuZXh0KTsKKwkJCWNsZWFuX3RyZWVfYmxvY2sodHJhbnMsIGxvZywgbmV4dCk7CisJCQlidHJmc193YWl0X3RyZWVfYmxvY2tfd3JpdGViYWNrKG5leHQpOworCQkJYnRyZnNfdHJlZV91bmxvY2sobmV4dCk7CisKKwkJCWlmIChvcmlnX2xldmVsID09IDApIHsKKwkJCQlyZXQgPSBidHJmc19kcm9wX2xlYWZfcmVmKHRyYW5zLCBsb2csCisJCQkJCQkJICBuZXh0KTsKKwkJCQlCVUdfT04ocmV0KTsKKwkJCX0KKwkJCVdBUk5fT04obG9nLT5yb290X2tleS5vYmplY3RpZCAhPQorCQkJCUJUUkZTX1RSRUVfTE9HX09CSkVDVElEKTsKKwkJCXJldCA9IGJ0cmZzX2ZyZWVfcmVzZXJ2ZWRfZXh0ZW50KGxvZywgbmV4dC0+c3RhcnQsCisJCQkJCQkJIG5leHQtPmxlbik7CisJCQlCVUdfT04ocmV0KTsKKwkJfQorCX0KKworCWZvciAoaSA9IDA7IGkgPD0gb3JpZ19sZXZlbDsgaSsrKSB7CisJCWlmIChwYXRoLT5ub2Rlc1tpXSkgeworCQkJZnJlZV9leHRlbnRfYnVmZmVyKHBhdGgtPm5vZGVzW2ldKTsKKwkJCXBhdGgtPm5vZGVzW2ldID0gTlVMTDsKKwkJfQorCX0KKwlidHJmc19mcmVlX3BhdGgocGF0aCk7CisJaWYgKHdjLT5mcmVlKQorCQlmcmVlX2V4dGVudF9idWZmZXIobG9nLT5ub2RlKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHdhaXRfbG9nX2NvbW1pdChzdHJ1Y3QgYnRyZnNfcm9vdCAqbG9nKQoreworCURFRklORV9XQUlUKHdhaXQpOworCXU2NCB0cmFuc2lkID0gbG9nLT5mc19pbmZvLT50cmVlX2xvZ190cmFuc2lkOworCisJZG8geworCQlwcmVwYXJlX3RvX3dhaXQoJmxvZy0+ZnNfaW5mby0+dHJlZV9sb2dfd2FpdCwgJndhaXQsCisJCQkJVEFTS19VTklOVEVSUlVQVElCTEUpOworCQltdXRleF91bmxvY2soJmxvZy0+ZnNfaW5mby0+dHJlZV9sb2dfbXV0ZXgpOworCQlpZiAoYXRvbWljX3JlYWQoJmxvZy0+ZnNfaW5mby0+dHJlZV9sb2dfY29tbWl0KSkKKwkJCXNjaGVkdWxlKCk7CisJCWZpbmlzaF93YWl0KCZsb2ctPmZzX2luZm8tPnRyZWVfbG9nX3dhaXQsICZ3YWl0KTsKKwkJbXV0ZXhfbG9jaygmbG9nLT5mc19pbmZvLT50cmVlX2xvZ19tdXRleCk7CisJfSB3aGlsZSAodHJhbnNpZCA9PSBsb2ctPmZzX2luZm8tPnRyZWVfbG9nX3RyYW5zaWQgJiYKKwkJYXRvbWljX3JlYWQoJmxvZy0+ZnNfaW5mby0+dHJlZV9sb2dfY29tbWl0KSk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBidHJmc19zeW5jX2xvZyBkb2VzIHNlbmRzIGEgZ2l2ZW4gdHJlZSBsb2cgZG93biB0byB0aGUgZGlzayBhbmQKKyAqIHVwZGF0ZXMgdGhlIHN1cGVyIGJsb2NrcyB0byByZWNvcmQgaXQuICBXaGVuIHRoaXMgY2FsbCBpcyBkb25lLAorICogeW91IGtub3cgdGhhdCBhbnkgaW5vZGVzIHByZXZpb3VzbHkgbG9nZ2VkIGFyZSBzYWZlbHkgb24gZGlzaworICovCitpbnQgYnRyZnNfc3luY19sb2coc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCisJCSAgIHN0cnVjdCBidHJmc19yb290ICpyb290KQoreworCWludCByZXQ7CisJdW5zaWduZWQgbG9uZyBiYXRjaDsKKwlzdHJ1Y3QgYnRyZnNfcm9vdCAqbG9nID0gcm9vdC0+bG9nX3Jvb3Q7CisKKwltdXRleF9sb2NrKCZsb2ctPmZzX2luZm8tPnRyZWVfbG9nX211dGV4KTsKKwlpZiAoYXRvbWljX3JlYWQoJmxvZy0+ZnNfaW5mby0+dHJlZV9sb2dfY29tbWl0KSkgeworCQl3YWl0X2xvZ19jb21taXQobG9nKTsKKwkJZ290byBvdXQ7CisJfQorCWF0b21pY19zZXQoJmxvZy0+ZnNfaW5mby0+dHJlZV9sb2dfY29tbWl0LCAxKTsKKworCXdoaWxlICgxKSB7CisJCWJhdGNoID0gbG9nLT5mc19pbmZvLT50cmVlX2xvZ19iYXRjaDsKKwkJbXV0ZXhfdW5sb2NrKCZsb2ctPmZzX2luZm8tPnRyZWVfbG9nX211dGV4KTsKKwkJc2NoZWR1bGVfdGltZW91dF91bmludGVycnVwdGlibGUoMSk7CisJCW11dGV4X2xvY2soJmxvZy0+ZnNfaW5mby0+dHJlZV9sb2dfbXV0ZXgpOworCisJCXdoaWxlIChhdG9taWNfcmVhZCgmbG9nLT5mc19pbmZvLT50cmVlX2xvZ193cml0ZXJzKSkgeworCQkJREVGSU5FX1dBSVQod2FpdCk7CisJCQlwcmVwYXJlX3RvX3dhaXQoJmxvZy0+ZnNfaW5mby0+dHJlZV9sb2dfd2FpdCwgJndhaXQsCisJCQkJCVRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwkJCW11dGV4X3VubG9jaygmbG9nLT5mc19pbmZvLT50cmVlX2xvZ19tdXRleCk7CisJCQlpZiAoYXRvbWljX3JlYWQoJmxvZy0+ZnNfaW5mby0+dHJlZV9sb2dfd3JpdGVycykpCisJCQkJc2NoZWR1bGUoKTsKKwkJCW11dGV4X2xvY2soJmxvZy0+ZnNfaW5mby0+dHJlZV9sb2dfbXV0ZXgpOworCQkJZmluaXNoX3dhaXQoJmxvZy0+ZnNfaW5mby0+dHJlZV9sb2dfd2FpdCwgJndhaXQpOworCQl9CisJCWlmIChiYXRjaCA9PSBsb2ctPmZzX2luZm8tPnRyZWVfbG9nX2JhdGNoKQorCQkJYnJlYWs7CisJfQorCisJcmV0ID0gYnRyZnNfd3JpdGVfYW5kX3dhaXRfbWFya2VkX2V4dGVudHMobG9nLCAmbG9nLT5kaXJ0eV9sb2dfcGFnZXMpOworCUJVR19PTihyZXQpOworCXJldCA9IGJ0cmZzX3dyaXRlX2FuZF93YWl0X21hcmtlZF9leHRlbnRzKHJvb3QtPmZzX2luZm8tPmxvZ19yb290X3RyZWUsCisJCQkgICAgICAgJnJvb3QtPmZzX2luZm8tPmxvZ19yb290X3RyZWUtPmRpcnR5X2xvZ19wYWdlcyk7CisJQlVHX09OKHJldCk7CisKKwlidHJmc19zZXRfc3VwZXJfbG9nX3Jvb3QoJnJvb3QtPmZzX2luZm8tPnN1cGVyX2Zvcl9jb21taXQsCisJCQkJIGxvZy0+ZnNfaW5mby0+bG9nX3Jvb3RfdHJlZS0+bm9kZS0+c3RhcnQpOworCWJ0cmZzX3NldF9zdXBlcl9sb2dfcm9vdF9sZXZlbCgmcm9vdC0+ZnNfaW5mby0+c3VwZXJfZm9yX2NvbW1pdCwKKwkJICAgICAgIGJ0cmZzX2hlYWRlcl9sZXZlbChsb2ctPmZzX2luZm8tPmxvZ19yb290X3RyZWUtPm5vZGUpKTsKKworCXdyaXRlX2N0cmVlX3N1cGVyKHRyYW5zLCBsb2ctPmZzX2luZm8tPnRyZWVfcm9vdCwgMik7CisJbG9nLT5mc19pbmZvLT50cmVlX2xvZ190cmFuc2lkKys7CisJbG9nLT5mc19pbmZvLT50cmVlX2xvZ19iYXRjaCA9IDA7CisJYXRvbWljX3NldCgmbG9nLT5mc19pbmZvLT50cmVlX2xvZ19jb21taXQsIDApOworCXNtcF9tYigpOworCWlmICh3YWl0cXVldWVfYWN0aXZlKCZsb2ctPmZzX2luZm8tPnRyZWVfbG9nX3dhaXQpKQorCQl3YWtlX3VwKCZsb2ctPmZzX2luZm8tPnRyZWVfbG9nX3dhaXQpOworb3V0OgorCW11dGV4X3VubG9jaygmbG9nLT5mc19pbmZvLT50cmVlX2xvZ19tdXRleCk7CisJcmV0dXJuIDA7Cit9CisKKy8qICogZnJlZSBhbGwgdGhlIGV4dGVudHMgdXNlZCBieSB0aGUgdHJlZSBsb2cuICBUaGlzIHNob3VsZCBiZSBjYWxsZWQKKyAqIGF0IGNvbW1pdCB0aW1lIG9mIHRoZSBmdWxsIHRyYW5zYWN0aW9uCisgKi8KK2ludCBidHJmc19mcmVlX2xvZyhzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywgc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgYnRyZnNfcm9vdCAqbG9nOworCXN0cnVjdCBrZXk7CisJdTY0IHN0YXJ0OworCXU2NCBlbmQ7CisJc3RydWN0IHdhbGtfY29udHJvbCB3YyA9IHsKKwkJLmZyZWUgPSAxLAorCQkucHJvY2Vzc19mdW5jID0gcHJvY2Vzc19vbmVfYnVmZmVyCisJfTsKKworCWlmICghcm9vdC0+bG9nX3Jvb3QgfHwgcm9vdC0+ZnNfaW5mby0+bG9nX3Jvb3RfcmVjb3ZlcmluZykKKwkJcmV0dXJuIDA7CisKKwlsb2cgPSByb290LT5sb2dfcm9vdDsKKwlyZXQgPSB3YWxrX2xvZ190cmVlKHRyYW5zLCBsb2csICZ3Yyk7CisJQlVHX09OKHJldCk7CisKKwl3aGlsZSAoMSkgeworCQlyZXQgPSBmaW5kX2ZpcnN0X2V4dGVudF9iaXQoJmxvZy0+ZGlydHlfbG9nX3BhZ2VzLAorCQkJCSAgICAwLCAmc3RhcnQsICZlbmQsIEVYVEVOVF9ESVJUWSk7CisJCWlmIChyZXQpCisJCQlicmVhazsKKworCQljbGVhcl9leHRlbnRfZGlydHkoJmxvZy0+ZGlydHlfbG9nX3BhZ2VzLAorCQkJCSAgIHN0YXJ0LCBlbmQsIEdGUF9OT0ZTKTsKKwl9CisKKwlsb2cgPSByb290LT5sb2dfcm9vdDsKKwlyZXQgPSBidHJmc19kZWxfcm9vdCh0cmFucywgcm9vdC0+ZnNfaW5mby0+bG9nX3Jvb3RfdHJlZSwKKwkJCSAgICAgJmxvZy0+cm9vdF9rZXkpOworCUJVR19PTihyZXQpOworCXJvb3QtPmxvZ19yb290ID0gTlVMTDsKKwlrZnJlZShyb290LT5sb2dfcm9vdCk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBoZWxwZXIgZnVuY3Rpb24gdG8gdXBkYXRlIHRoZSBpdGVtIGZvciBhIGdpdmVuIHN1YnZvbHVtZXMgbG9nIHJvb3QKKyAqIGluIHRoZSB0cmVlIG9mIGxvZyByb290cworICovCitzdGF0aWMgaW50IHVwZGF0ZV9sb2dfcm9vdChzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKKwkJCSAgIHN0cnVjdCBidHJmc19yb290ICpsb2cpCit7CisJdTY0IGJ5dGVuciA9IGJ0cmZzX3Jvb3RfYnl0ZW5yKCZsb2ctPnJvb3RfaXRlbSk7CisJaW50IHJldDsKKworCWlmIChsb2ctPm5vZGUtPnN0YXJ0ID09IGJ5dGVucikKKwkJcmV0dXJuIDA7CisKKwlidHJmc19zZXRfcm9vdF9ieXRlbnIoJmxvZy0+cm9vdF9pdGVtLCBsb2ctPm5vZGUtPnN0YXJ0KTsKKwlidHJmc19zZXRfcm9vdF9nZW5lcmF0aW9uKCZsb2ctPnJvb3RfaXRlbSwgdHJhbnMtPnRyYW5zaWQpOworCWJ0cmZzX3NldF9yb290X2xldmVsKCZsb2ctPnJvb3RfaXRlbSwgYnRyZnNfaGVhZGVyX2xldmVsKGxvZy0+bm9kZSkpOworCXJldCA9IGJ0cmZzX3VwZGF0ZV9yb290KHRyYW5zLCBsb2ctPmZzX2luZm8tPmxvZ19yb290X3RyZWUsCisJCQkJJmxvZy0+cm9vdF9rZXksICZsb2ctPnJvb3RfaXRlbSk7CisJQlVHX09OKHJldCk7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIElmIGJvdGggYSBmaWxlIGFuZCBkaXJlY3RvcnkgYXJlIGxvZ2dlZCwgYW5kIHVubGlua3Mgb3IgcmVuYW1lcyBhcmUKKyAqIG1peGVkIGluLCB3ZSBoYXZlIGEgZmV3IGludGVyZXN0aW5nIGNvcm5lcnM6CisgKgorICogY3JlYXRlIGZpbGUgWCBpbiBkaXIgWQorICogbGluayBmaWxlIFggdG8gWC5saW5rIGluIGRpciBZCisgKiBmc3luYyBmaWxlIFgKKyAqIHVubGluayBmaWxlIFggYnV0IGxlYXZlIFgubGluaworICogZnN5bmMgZGlyIFkKKyAqCisgKiBBZnRlciBhIGNyYXNoIHdlIHdvdWxkIGV4cGVjdCBvbmx5IFgubGluayB0byBleGlzdC4gIEJ1dCBmaWxlIFgKKyAqIGRpZG4ndCBnZXQgZnN5bmMnZCBhZ2FpbiBzbyB0aGUgbG9nIGhhcyBiYWNrIHJlZnMgZm9yIFggYW5kIFgubGluay4KKyAqCisgKiBXZSBzb2x2ZSB0aGlzIGJ5IHJlbW92aW5nIGRpcmVjdG9yeSBlbnRyaWVzIGFuZCBpbm9kZSBiYWNrcmVmcyBmcm9tIHRoZQorICogbG9nIHdoZW4gYSBmaWxlIHRoYXQgd2FzIGxvZ2dlZCBpbiB0aGUgY3VycmVudCB0cmFuc2FjdGlvbiBpcworICogdW5saW5rZWQuICBBbnkgbGF0ZXIgZnN5bmMgd2lsbCBpbmNsdWRlIHRoZSB1cGRhdGVkIGxvZyBlbnRyaWVzLCBhbmQKKyAqIHdlJ2xsIGJlIGFibGUgdG8gcmVjb25zdHJ1Y3QgdGhlIHByb3BlciBkaXJlY3RvcnkgaXRlbXMgZnJvbSBiYWNrcmVmcy4KKyAqCisgKiBUaGlzIG9wdGltaXphdGlvbnMgYWxsb3dzIHVzIHRvIGF2b2lkIHJlbG9nZ2luZyB0aGUgZW50aXJlIGlub2RlCisgKiBvciB0aGUgZW50aXJlIGRpcmVjdG9yeS4KKyAqLworaW50IGJ0cmZzX2RlbF9kaXJfZW50cmllc19pbl9sb2coc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCisJCQkJIHN0cnVjdCBidHJmc19yb290ICpyb290LAorCQkJCSBjb25zdCBjaGFyICpuYW1lLCBpbnQgbmFtZV9sZW4sCisJCQkJIHN0cnVjdCBpbm9kZSAqZGlyLCB1NjQgaW5kZXgpCit7CisJc3RydWN0IGJ0cmZzX3Jvb3QgKmxvZzsKKwlzdHJ1Y3QgYnRyZnNfZGlyX2l0ZW0gKmRpOworCXN0cnVjdCBidHJmc19wYXRoICpwYXRoOworCWludCByZXQ7CisJaW50IGJ5dGVzX2RlbCA9IDA7CisKKwlpZiAoQlRSRlNfSShkaXIpLT5sb2dnZWRfdHJhbnMgPCB0cmFucy0+dHJhbnNpZCkKKwkJcmV0dXJuIDA7CisKKwlyZXQgPSBqb2luX3J1bm5pbmdfbG9nX3RyYW5zKHJvb3QpOworCWlmIChyZXQpCisJCXJldHVybiAwOworCisJbXV0ZXhfbG9jaygmQlRSRlNfSShkaXIpLT5sb2dfbXV0ZXgpOworCisJbG9nID0gcm9vdC0+bG9nX3Jvb3Q7CisJcGF0aCA9IGJ0cmZzX2FsbG9jX3BhdGgoKTsKKwlkaSA9IGJ0cmZzX2xvb2t1cF9kaXJfaXRlbSh0cmFucywgbG9nLCBwYXRoLCBkaXItPmlfaW5vLAorCQkJCSAgIG5hbWUsIG5hbWVfbGVuLCAtMSk7CisJaWYgKGRpICYmICFJU19FUlIoZGkpKSB7CisJCXJldCA9IGJ0cmZzX2RlbGV0ZV9vbmVfZGlyX25hbWUodHJhbnMsIGxvZywgcGF0aCwgZGkpOworCQlieXRlc19kZWwgKz0gbmFtZV9sZW47CisJCUJVR19PTihyZXQpOworCX0KKwlidHJmc19yZWxlYXNlX3BhdGgobG9nLCBwYXRoKTsKKwlkaSA9IGJ0cmZzX2xvb2t1cF9kaXJfaW5kZXhfaXRlbSh0cmFucywgbG9nLCBwYXRoLCBkaXItPmlfaW5vLAorCQkJCQkgaW5kZXgsIG5hbWUsIG5hbWVfbGVuLCAtMSk7CisJaWYgKGRpICYmICFJU19FUlIoZGkpKSB7CisJCXJldCA9IGJ0cmZzX2RlbGV0ZV9vbmVfZGlyX25hbWUodHJhbnMsIGxvZywgcGF0aCwgZGkpOworCQlieXRlc19kZWwgKz0gbmFtZV9sZW47CisJCUJVR19PTihyZXQpOworCX0KKworCS8qIHVwZGF0ZSB0aGUgZGlyZWN0b3J5IHNpemUgaW4gdGhlIGxvZyB0byByZWZsZWN0IHRoZSBuYW1lcworCSAqIHdlIGhhdmUgcmVtb3ZlZAorCSAqLworCWlmIChieXRlc19kZWwpIHsKKwkJc3RydWN0IGJ0cmZzX2tleSBrZXk7CisKKwkJa2V5Lm9iamVjdGlkID0gZGlyLT5pX2lubzsKKwkJa2V5Lm9mZnNldCA9IDA7CisJCWtleS50eXBlID0gQlRSRlNfSU5PREVfSVRFTV9LRVk7CisJCWJ0cmZzX3JlbGVhc2VfcGF0aChsb2csIHBhdGgpOworCisJCXJldCA9IGJ0cmZzX3NlYXJjaF9zbG90KHRyYW5zLCBsb2csICZrZXksIHBhdGgsIDAsIDEpOworCQlpZiAocmV0ID09IDApIHsKKwkJCXN0cnVjdCBidHJmc19pbm9kZV9pdGVtICppdGVtOworCQkJdTY0IGlfc2l6ZTsKKworCQkJaXRlbSA9IGJ0cmZzX2l0ZW1fcHRyKHBhdGgtPm5vZGVzWzBdLCBwYXRoLT5zbG90c1swXSwKKwkJCQkJICAgICAgc3RydWN0IGJ0cmZzX2lub2RlX2l0ZW0pOworCQkJaV9zaXplID0gYnRyZnNfaW5vZGVfc2l6ZShwYXRoLT5ub2Rlc1swXSwgaXRlbSk7CisJCQlpZiAoaV9zaXplID4gYnl0ZXNfZGVsKQorCQkJCWlfc2l6ZSAtPSBieXRlc19kZWw7CisJCQllbHNlCisJCQkJaV9zaXplID0gMDsKKwkJCWJ0cmZzX3NldF9pbm9kZV9zaXplKHBhdGgtPm5vZGVzWzBdLCBpdGVtLCBpX3NpemUpOworCQkJYnRyZnNfbWFya19idWZmZXJfZGlydHkocGF0aC0+bm9kZXNbMF0pOworCQl9IGVsc2UKKwkJCXJldCA9IDA7CisJCWJ0cmZzX3JlbGVhc2VfcGF0aChsb2csIHBhdGgpOworCX0KKworCWJ0cmZzX2ZyZWVfcGF0aChwYXRoKTsKKwltdXRleF91bmxvY2soJkJUUkZTX0koZGlyKS0+bG9nX211dGV4KTsKKwllbmRfbG9nX3RyYW5zKHJvb3QpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIHNlZSBjb21tZW50cyBmb3IgYnRyZnNfZGVsX2Rpcl9lbnRyaWVzX2luX2xvZyAqLworaW50IGJ0cmZzX2RlbF9pbm9kZV9yZWZfaW5fbG9nKHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAorCQkJICAgICAgIHN0cnVjdCBidHJmc19yb290ICpyb290LAorCQkJICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIGludCBuYW1lX2xlbiwKKwkJCSAgICAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1NjQgZGlyaWQpCit7CisJc3RydWN0IGJ0cmZzX3Jvb3QgKmxvZzsKKwl1NjQgaW5kZXg7CisJaW50IHJldDsKKworCWlmIChCVFJGU19JKGlub2RlKS0+bG9nZ2VkX3RyYW5zIDwgdHJhbnMtPnRyYW5zaWQpCisJCXJldHVybiAwOworCisJcmV0ID0gam9pbl9ydW5uaW5nX2xvZ190cmFucyhyb290KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gMDsKKwlsb2cgPSByb290LT5sb2dfcm9vdDsKKwltdXRleF9sb2NrKCZCVFJGU19JKGlub2RlKS0+bG9nX211dGV4KTsKKworCXJldCA9IGJ0cmZzX2RlbF9pbm9kZV9yZWYodHJhbnMsIGxvZywgbmFtZSwgbmFtZV9sZW4sIGlub2RlLT5pX2lubywKKwkJCQkgIGRpcmlkLCAmaW5kZXgpOworCW11dGV4X3VubG9jaygmQlRSRlNfSShpbm9kZSktPmxvZ19tdXRleCk7CisJZW5kX2xvZ190cmFucyhyb290KTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBjcmVhdGVzIGEgcmFuZ2UgaXRlbSBpbiB0aGUgbG9nIGZvciAnZGlyaWQnLiAgZmlyc3Rfb2Zmc2V0IGFuZAorICogbGFzdF9vZmZzZXQgdGVsbCB1cyB3aGljaCBwYXJ0cyBvZiB0aGUga2V5IHNwYWNlIHRoZSBsb2cgc2hvdWxkCisgKiBiZSBjb25zaWRlcmVkIGF1dGhvcml0YXRpdmUgZm9yLgorICovCitzdGF0aWMgbm9pbmxpbmUgaW50IGluc2VydF9kaXJfbG9nX2tleShzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKKwkJCQkgICAgICAgc3RydWN0IGJ0cmZzX3Jvb3QgKmxvZywKKwkJCQkgICAgICAgc3RydWN0IGJ0cmZzX3BhdGggKnBhdGgsCisJCQkJICAgICAgIGludCBrZXlfdHlwZSwgdTY0IGRpcmlkLAorCQkJCSAgICAgICB1NjQgZmlyc3Rfb2Zmc2V0LCB1NjQgbGFzdF9vZmZzZXQpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgYnRyZnNfa2V5IGtleTsKKwlzdHJ1Y3QgYnRyZnNfZGlyX2xvZ19pdGVtICppdGVtOworCisJa2V5Lm9iamVjdGlkID0gZGlyaWQ7CisJa2V5Lm9mZnNldCA9IGZpcnN0X29mZnNldDsKKwlpZiAoa2V5X3R5cGUgPT0gQlRSRlNfRElSX0lURU1fS0VZKQorCQlrZXkudHlwZSA9IEJUUkZTX0RJUl9MT0dfSVRFTV9LRVk7CisJZWxzZQorCQlrZXkudHlwZSA9IEJUUkZTX0RJUl9MT0dfSU5ERVhfS0VZOworCXJldCA9IGJ0cmZzX2luc2VydF9lbXB0eV9pdGVtKHRyYW5zLCBsb2csIHBhdGgsICZrZXksIHNpemVvZigqaXRlbSkpOworCUJVR19PTihyZXQpOworCisJaXRlbSA9IGJ0cmZzX2l0ZW1fcHRyKHBhdGgtPm5vZGVzWzBdLCBwYXRoLT5zbG90c1swXSwKKwkJCSAgICAgIHN0cnVjdCBidHJmc19kaXJfbG9nX2l0ZW0pOworCWJ0cmZzX3NldF9kaXJfbG9nX2VuZChwYXRoLT5ub2Rlc1swXSwgaXRlbSwgbGFzdF9vZmZzZXQpOworCWJ0cmZzX21hcmtfYnVmZmVyX2RpcnR5KHBhdGgtPm5vZGVzWzBdKTsKKwlidHJmc19yZWxlYXNlX3BhdGgobG9nLCBwYXRoKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGxvZyBhbGwgdGhlIGl0ZW1zIGluY2x1ZGVkIGluIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uIGZvciBhIGdpdmVuCisgKiBkaXJlY3RvcnkuICBUaGlzIGFsc28gY3JlYXRlcyB0aGUgcmFuZ2UgaXRlbXMgaW4gdGhlIGxvZyB0cmVlIHJlcXVpcmVkCisgKiB0byByZXBsYXkgYW55dGhpbmcgZGVsZXRlZCBiZWZvcmUgdGhlIGZzeW5jCisgKi8KK3N0YXRpYyBub2lubGluZSBpbnQgbG9nX2Rpcl9pdGVtcyhzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKKwkJCSAgc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkgIHN0cnVjdCBidHJmc19wYXRoICpwYXRoLAorCQkJICBzdHJ1Y3QgYnRyZnNfcGF0aCAqZHN0X3BhdGgsIGludCBrZXlfdHlwZSwKKwkJCSAgdTY0IG1pbl9vZmZzZXQsIHU2NCAqbGFzdF9vZmZzZXRfcmV0KQoreworCXN0cnVjdCBidHJmc19rZXkgbWluX2tleTsKKwlzdHJ1Y3QgYnRyZnNfa2V5IG1heF9rZXk7CisJc3RydWN0IGJ0cmZzX3Jvb3QgKmxvZyA9IHJvb3QtPmxvZ19yb290OworCXN0cnVjdCBleHRlbnRfYnVmZmVyICpzcmM7CisJaW50IHJldDsKKwlpbnQgaTsKKwlpbnQgbnJpdGVtczsKKwl1NjQgZmlyc3Rfb2Zmc2V0ID0gbWluX29mZnNldDsKKwl1NjQgbGFzdF9vZmZzZXQgPSAodTY0KS0xOworCisJbG9nID0gcm9vdC0+bG9nX3Jvb3Q7CisJbWF4X2tleS5vYmplY3RpZCA9IGlub2RlLT5pX2lubzsKKwltYXhfa2V5Lm9mZnNldCA9ICh1NjQpLTE7CisJbWF4X2tleS50eXBlID0ga2V5X3R5cGU7CisKKwltaW5fa2V5Lm9iamVjdGlkID0gaW5vZGUtPmlfaW5vOworCW1pbl9rZXkudHlwZSA9IGtleV90eXBlOworCW1pbl9rZXkub2Zmc2V0ID0gbWluX29mZnNldDsKKworCXBhdGgtPmtlZXBfbG9ja3MgPSAxOworCisJcmV0ID0gYnRyZnNfc2VhcmNoX2ZvcndhcmQocm9vdCwgJm1pbl9rZXksICZtYXhfa2V5LAorCQkJCSAgIHBhdGgsIDAsIHRyYW5zLT50cmFuc2lkKTsKKworCS8qCisJICogd2UgZGlkbid0IGZpbmQgYW55dGhpbmcgZnJvbSB0aGlzIHRyYW5zYWN0aW9uLCBzZWUgaWYgdGhlcmUKKwkgKiBpcyBhbnl0aGluZyBhdCBhbGwKKwkgKi8KKwlpZiAocmV0ICE9IDAgfHwgbWluX2tleS5vYmplY3RpZCAhPSBpbm9kZS0+aV9pbm8gfHwKKwkgICAgbWluX2tleS50eXBlICE9IGtleV90eXBlKSB7CisJCW1pbl9rZXkub2JqZWN0aWQgPSBpbm9kZS0+aV9pbm87CisJCW1pbl9rZXkudHlwZSA9IGtleV90eXBlOworCQltaW5fa2V5Lm9mZnNldCA9ICh1NjQpLTE7CisJCWJ0cmZzX3JlbGVhc2VfcGF0aChyb290LCBwYXRoKTsKKwkJcmV0ID0gYnRyZnNfc2VhcmNoX3Nsb3QoTlVMTCwgcm9vdCwgJm1pbl9rZXksIHBhdGgsIDAsIDApOworCQlpZiAocmV0IDwgMCkgeworCQkJYnRyZnNfcmVsZWFzZV9wYXRoKHJvb3QsIHBhdGgpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCQlyZXQgPSBidHJmc19wcmV2aW91c19pdGVtKHJvb3QsIHBhdGgsIGlub2RlLT5pX2lubywga2V5X3R5cGUpOworCisJCS8qIGlmIHJldCA9PSAwIHRoZXJlIGFyZSBpdGVtcyBmb3IgdGhpcyB0eXBlLAorCQkgKiBjcmVhdGUgYSByYW5nZSB0byB0ZWxsIHVzIHRoZSBsYXN0IGtleSBvZiB0aGlzIHR5cGUuCisJCSAqIG90aGVyd2lzZSwgdGhlcmUgYXJlIG5vIGl0ZW1zIGluIHRoaXMgZGlyZWN0b3J5IGFmdGVyCisJCSAqICptaW5fb2Zmc2V0LCBhbmQgd2UgY3JlYXRlIGEgcmFuZ2UgdG8gaW5kaWNhdGUgdGhhdC4KKwkJICovCisJCWlmIChyZXQgPT0gMCkgeworCQkJc3RydWN0IGJ0cmZzX2tleSB0bXA7CisJCQlidHJmc19pdGVtX2tleV90b19jcHUocGF0aC0+bm9kZXNbMF0sICZ0bXAsCisJCQkJCSAgICAgIHBhdGgtPnNsb3RzWzBdKTsKKwkJCWlmIChrZXlfdHlwZSA9PSB0bXAudHlwZSkKKwkJCQlmaXJzdF9vZmZzZXQgPSBtYXgobWluX29mZnNldCwgdG1wLm9mZnNldCkgKyAxOworCQl9CisJCWdvdG8gZG9uZTsKKwl9CisKKwkvKiBnbyBiYWNrd2FyZCB0byBmaW5kIGFueSBwcmV2aW91cyBrZXkgKi8KKwlyZXQgPSBidHJmc19wcmV2aW91c19pdGVtKHJvb3QsIHBhdGgsIGlub2RlLT5pX2lubywga2V5X3R5cGUpOworCWlmIChyZXQgPT0gMCkgeworCQlzdHJ1Y3QgYnRyZnNfa2V5IHRtcDsKKwkJYnRyZnNfaXRlbV9rZXlfdG9fY3B1KHBhdGgtPm5vZGVzWzBdLCAmdG1wLCBwYXRoLT5zbG90c1swXSk7CisJCWlmIChrZXlfdHlwZSA9PSB0bXAudHlwZSkgeworCQkJZmlyc3Rfb2Zmc2V0ID0gdG1wLm9mZnNldDsKKwkJCXJldCA9IG92ZXJ3cml0ZV9pdGVtKHRyYW5zLCBsb2csIGRzdF9wYXRoLAorCQkJCQkgICAgIHBhdGgtPm5vZGVzWzBdLCBwYXRoLT5zbG90c1swXSwKKwkJCQkJICAgICAmdG1wKTsKKwkJfQorCX0KKwlidHJmc19yZWxlYXNlX3BhdGgocm9vdCwgcGF0aCk7CisKKwkvKiBmaW5kIHRoZSBmaXJzdCBrZXkgZnJvbSB0aGlzIHRyYW5zYWN0aW9uIGFnYWluICovCisJcmV0ID0gYnRyZnNfc2VhcmNoX3Nsb3QoTlVMTCwgcm9vdCwgJm1pbl9rZXksIHBhdGgsIDAsIDApOworCWlmIChyZXQgIT0gMCkgeworCQlXQVJOX09OKDEpOworCQlnb3RvIGRvbmU7CisJfQorCisJLyoKKwkgKiB3ZSBoYXZlIGEgYmxvY2sgZnJvbSB0aGlzIHRyYW5zYWN0aW9uLCBsb2cgZXZlcnkgaXRlbSBpbiBpdAorCSAqIGZyb20gb3VyIGRpcmVjdG9yeQorCSAqLworCXdoaWxlICgxKSB7CisJCXN0cnVjdCBidHJmc19rZXkgdG1wOworCQlzcmMgPSBwYXRoLT5ub2Rlc1swXTsKKwkJbnJpdGVtcyA9IGJ0cmZzX2hlYWRlcl9ucml0ZW1zKHNyYyk7CisJCWZvciAoaSA9IHBhdGgtPnNsb3RzWzBdOyBpIDwgbnJpdGVtczsgaSsrKSB7CisJCQlidHJmc19pdGVtX2tleV90b19jcHUoc3JjLCAmbWluX2tleSwgaSk7CisKKwkJCWlmIChtaW5fa2V5Lm9iamVjdGlkICE9IGlub2RlLT5pX2lubyB8fAorCQkJICAgIG1pbl9rZXkudHlwZSAhPSBrZXlfdHlwZSkKKwkJCQlnb3RvIGRvbmU7CisJCQlyZXQgPSBvdmVyd3JpdGVfaXRlbSh0cmFucywgbG9nLCBkc3RfcGF0aCwgc3JjLCBpLAorCQkJCQkgICAgICZtaW5fa2V5KTsKKwkJCUJVR19PTihyZXQpOworCQl9CisJCXBhdGgtPnNsb3RzWzBdID0gbnJpdGVtczsKKworCQkvKgorCQkgKiBsb29rIGFoZWFkIHRvIHRoZSBuZXh0IGl0ZW0gYW5kIHNlZSBpZiBpdCBpcyBhbHNvCisJCSAqIGZyb20gdGhpcyBkaXJlY3RvcnkgYW5kIGZyb20gdGhpcyB0cmFuc2FjdGlvbgorCQkgKi8KKwkJcmV0ID0gYnRyZnNfbmV4dF9sZWFmKHJvb3QsIHBhdGgpOworCQlpZiAocmV0ID09IDEpIHsKKwkJCWxhc3Rfb2Zmc2V0ID0gKHU2NCktMTsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCQlidHJmc19pdGVtX2tleV90b19jcHUocGF0aC0+bm9kZXNbMF0sICZ0bXAsIHBhdGgtPnNsb3RzWzBdKTsKKwkJaWYgKHRtcC5vYmplY3RpZCAhPSBpbm9kZS0+aV9pbm8gfHwgdG1wLnR5cGUgIT0ga2V5X3R5cGUpIHsKKwkJCWxhc3Rfb2Zmc2V0ID0gKHU2NCktMTsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCQlpZiAoYnRyZnNfaGVhZGVyX2dlbmVyYXRpb24ocGF0aC0+bm9kZXNbMF0pICE9IHRyYW5zLT50cmFuc2lkKSB7CisJCQlyZXQgPSBvdmVyd3JpdGVfaXRlbSh0cmFucywgbG9nLCBkc3RfcGF0aCwKKwkJCQkJICAgICBwYXRoLT5ub2Rlc1swXSwgcGF0aC0+c2xvdHNbMF0sCisJCQkJCSAgICAgJnRtcCk7CisKKwkJCUJVR19PTihyZXQpOworCQkJbGFzdF9vZmZzZXQgPSB0bXAub2Zmc2V0OworCQkJZ290byBkb25lOworCQl9CisJfQorZG9uZToKKwkqbGFzdF9vZmZzZXRfcmV0ID0gbGFzdF9vZmZzZXQ7CisJYnRyZnNfcmVsZWFzZV9wYXRoKHJvb3QsIHBhdGgpOworCWJ0cmZzX3JlbGVhc2VfcGF0aChsb2csIGRzdF9wYXRoKTsKKworCS8qIGluc2VydCB0aGUgbG9nIHJhbmdlIGtleXMgdG8gaW5kaWNhdGUgd2hlcmUgdGhlIGxvZyBpcyB2YWxpZCAqLworCXJldCA9IGluc2VydF9kaXJfbG9nX2tleSh0cmFucywgbG9nLCBwYXRoLCBrZXlfdHlwZSwgaW5vZGUtPmlfaW5vLAorCQkJCSBmaXJzdF9vZmZzZXQsIGxhc3Rfb2Zmc2V0KTsKKwlCVUdfT04ocmV0KTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGxvZ2dpbmcgZGlyZWN0b3JpZXMgaXMgdmVyeSBzaW1pbGFyIHRvIGxvZ2dpbmcgaW5vZGVzLCBXZSBmaW5kIGFsbCB0aGUgaXRlbXMKKyAqIGZyb20gdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb24gYW5kIHdyaXRlIHRoZW0gdG8gdGhlIGxvZy4KKyAqCisgKiBUaGUgcmVjb3ZlcnkgY29kZSBzY2FucyB0aGUgZGlyZWN0b3J5IGluIHRoZSBzdWJ2b2x1bWUsIGFuZCBpZiBpdCBmaW5kcyBhCisgKiBrZXkgaW4gdGhlIHJhbmdlIGxvZ2dlZCB0aGF0IGlzIG5vdCBwcmVzZW50IGluIHRoZSBsb2cgdHJlZSwgdGhlbiBpdCBtZWFucworICogdGhhdCBkaXIgZW50cnkgd2FzIHVubGlua2VkIGR1cmluZyB0aGUgdHJhbnNhY3Rpb24uCisgKgorICogSW4gb3JkZXIgZm9yIHRoYXQgc2NhbiB0byB3b3JrLCB3ZSBtdXN0IGluY2x1ZGUgb25lIGtleSBzbWFsbGVyIHRoYW4KKyAqIHRoZSBzbWFsbGVzdCBsb2dnZWQgYnkgdGhpcyB0cmFuc2FjdGlvbiBhbmQgb25lIGtleSBsYXJnZXIgdGhhbiB0aGUgbGFyZ2VzdAorICoga2V5IGxvZ2dlZCBieSB0aGlzIHRyYW5zYWN0aW9uLgorICovCitzdGF0aWMgbm9pbmxpbmUgaW50IGxvZ19kaXJlY3RvcnlfY2hhbmdlcyhzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKKwkJCSAgc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkgIHN0cnVjdCBidHJmc19wYXRoICpwYXRoLAorCQkJICBzdHJ1Y3QgYnRyZnNfcGF0aCAqZHN0X3BhdGgpCit7CisJdTY0IG1pbl9rZXk7CisJdTY0IG1heF9rZXk7CisJaW50IHJldDsKKwlpbnQga2V5X3R5cGUgPSBCVFJGU19ESVJfSVRFTV9LRVk7CisKK2FnYWluOgorCW1pbl9rZXkgPSAwOworCW1heF9rZXkgPSAwOworCXdoaWxlICgxKSB7CisJCXJldCA9IGxvZ19kaXJfaXRlbXModHJhbnMsIHJvb3QsIGlub2RlLCBwYXRoLAorCQkJCSAgICBkc3RfcGF0aCwga2V5X3R5cGUsIG1pbl9rZXksCisJCQkJICAgICZtYXhfa2V5KTsKKwkJQlVHX09OKHJldCk7CisJCWlmIChtYXhfa2V5ID09ICh1NjQpLTEpCisJCQlicmVhazsKKwkJbWluX2tleSA9IG1heF9rZXkgKyAxOworCX0KKworCWlmIChrZXlfdHlwZSA9PSBCVFJGU19ESVJfSVRFTV9LRVkpIHsKKwkJa2V5X3R5cGUgPSBCVFJGU19ESVJfSU5ERVhfS0VZOworCQlnb3RvIGFnYWluOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGEgaGVscGVyIGZ1bmN0aW9uIHRvIGRyb3AgaXRlbXMgZnJvbSB0aGUgbG9nIGJlZm9yZSB3ZSByZWxvZyBhbgorICogaW5vZGUuICBtYXhfa2V5X3R5cGUgaW5kaWNhdGVzIHRoZSBoaWdoZXN0IGl0ZW0gdHlwZSB0byByZW1vdmUuCisgKiBUaGlzIGNhbm5vdCBiZSBydW4gZm9yIGZpbGUgZGF0YSBleHRlbnRzIGJlY2F1c2UgaXQgZG9lcyBub3QKKyAqIGZyZWUgdGhlIGV4dGVudHMgdGhleSBwb2ludCB0by4KKyAqLworc3RhdGljIGludCBkcm9wX29iamVjdGlkX2l0ZW1zKHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAorCQkJCSAgc3RydWN0IGJ0cmZzX3Jvb3QgKmxvZywKKwkJCQkgIHN0cnVjdCBidHJmc19wYXRoICpwYXRoLAorCQkJCSAgdTY0IG9iamVjdGlkLCBpbnQgbWF4X2tleV90eXBlKQoreworCWludCByZXQ7CisJc3RydWN0IGJ0cmZzX2tleSBrZXk7CisJc3RydWN0IGJ0cmZzX2tleSBmb3VuZF9rZXk7CisKKwlrZXkub2JqZWN0aWQgPSBvYmplY3RpZDsKKwlrZXkudHlwZSA9IG1heF9rZXlfdHlwZTsKKwlrZXkub2Zmc2V0ID0gKHU2NCktMTsKKworCXdoaWxlICgxKSB7CisJCXJldCA9IGJ0cmZzX3NlYXJjaF9zbG90KHRyYW5zLCBsb2csICZrZXksIHBhdGgsIC0xLCAxKTsKKworCQlpZiAocmV0ICE9IDEpCisJCQlicmVhazsKKworCQlpZiAocGF0aC0+c2xvdHNbMF0gPT0gMCkKKwkJCWJyZWFrOworCisJCXBhdGgtPnNsb3RzWzBdLS07CisJCWJ0cmZzX2l0ZW1fa2V5X3RvX2NwdShwYXRoLT5ub2Rlc1swXSwgJmZvdW5kX2tleSwKKwkJCQkgICAgICBwYXRoLT5zbG90c1swXSk7CisKKwkJaWYgKGZvdW5kX2tleS5vYmplY3RpZCAhPSBvYmplY3RpZCkKKwkJCWJyZWFrOworCisJCXJldCA9IGJ0cmZzX2RlbF9pdGVtKHRyYW5zLCBsb2csIHBhdGgpOworCQlCVUdfT04ocmV0KTsKKwkJYnRyZnNfcmVsZWFzZV9wYXRoKGxvZywgcGF0aCk7CisJfQorCWJ0cmZzX3JlbGVhc2VfcGF0aChsb2csIHBhdGgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgbm9pbmxpbmUgaW50IGNvcHlfaXRlbXMoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCisJCQkgICAgICAgc3RydWN0IGJ0cmZzX3Jvb3QgKmxvZywKKwkJCSAgICAgICBzdHJ1Y3QgYnRyZnNfcGF0aCAqZHN0X3BhdGgsCisJCQkgICAgICAgc3RydWN0IGV4dGVudF9idWZmZXIgKnNyYywKKwkJCSAgICAgICBpbnQgc3RhcnRfc2xvdCwgaW50IG5yLCBpbnQgaW5vZGVfb25seSkKK3sKKwl1bnNpZ25lZCBsb25nIHNyY19vZmZzZXQ7CisJdW5zaWduZWQgbG9uZyBkc3Rfb2Zmc2V0OworCXN0cnVjdCBidHJmc19maWxlX2V4dGVudF9pdGVtICpleHRlbnQ7CisJc3RydWN0IGJ0cmZzX2lub2RlX2l0ZW0gKmlub2RlX2l0ZW07CisJaW50IHJldDsKKwlzdHJ1Y3QgYnRyZnNfa2V5ICppbnNfa2V5czsKKwl1MzIgKmluc19zaXplczsKKwljaGFyICppbnNfZGF0YTsKKwlpbnQgaTsKKwlzdHJ1Y3QgbGlzdF9oZWFkIG9yZGVyZWRfc3VtczsKKworCUlOSVRfTElTVF9IRUFEKCZvcmRlcmVkX3N1bXMpOworCisJaW5zX2RhdGEgPSBrbWFsbG9jKG5yICogc2l6ZW9mKHN0cnVjdCBidHJmc19rZXkpICsKKwkJCSAgIG5yICogc2l6ZW9mKHUzMiksIEdGUF9OT0ZTKTsKKwlpbnNfc2l6ZXMgPSAodTMyICopaW5zX2RhdGE7CisJaW5zX2tleXMgPSAoc3RydWN0IGJ0cmZzX2tleSAqKShpbnNfZGF0YSArIG5yICogc2l6ZW9mKHUzMikpOworCisJZm9yIChpID0gMDsgaSA8IG5yOyBpKyspIHsKKwkJaW5zX3NpemVzW2ldID0gYnRyZnNfaXRlbV9zaXplX25yKHNyYywgaSArIHN0YXJ0X3Nsb3QpOworCQlidHJmc19pdGVtX2tleV90b19jcHUoc3JjLCBpbnNfa2V5cyArIGksIGkgKyBzdGFydF9zbG90KTsKKwl9CisJcmV0ID0gYnRyZnNfaW5zZXJ0X2VtcHR5X2l0ZW1zKHRyYW5zLCBsb2csIGRzdF9wYXRoLAorCQkJCSAgICAgICBpbnNfa2V5cywgaW5zX3NpemVzLCBucik7CisJQlVHX09OKHJldCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnI7IGkrKykgeworCQlkc3Rfb2Zmc2V0ID0gYnRyZnNfaXRlbV9wdHJfb2Zmc2V0KGRzdF9wYXRoLT5ub2Rlc1swXSwKKwkJCQkJCSAgIGRzdF9wYXRoLT5zbG90c1swXSk7CisKKwkJc3JjX29mZnNldCA9IGJ0cmZzX2l0ZW1fcHRyX29mZnNldChzcmMsIHN0YXJ0X3Nsb3QgKyBpKTsKKworCQljb3B5X2V4dGVudF9idWZmZXIoZHN0X3BhdGgtPm5vZGVzWzBdLCBzcmMsIGRzdF9vZmZzZXQsCisJCQkJICAgc3JjX29mZnNldCwgaW5zX3NpemVzW2ldKTsKKworCQlpZiAoaW5vZGVfb25seSA9PSBMT0dfSU5PREVfRVhJU1RTICYmCisJCSAgICBpbnNfa2V5c1tpXS50eXBlID09IEJUUkZTX0lOT0RFX0lURU1fS0VZKSB7CisJCQlpbm9kZV9pdGVtID0gYnRyZnNfaXRlbV9wdHIoZHN0X3BhdGgtPm5vZGVzWzBdLAorCQkJCQkJICAgIGRzdF9wYXRoLT5zbG90c1swXSwKKwkJCQkJCSAgICBzdHJ1Y3QgYnRyZnNfaW5vZGVfaXRlbSk7CisJCQlidHJmc19zZXRfaW5vZGVfc2l6ZShkc3RfcGF0aC0+bm9kZXNbMF0sIGlub2RlX2l0ZW0sIDApOworCisJCQkvKiBzZXQgdGhlIGdlbmVyYXRpb24gdG8gemVybyBzbyB0aGUgcmVjb3ZlciBjb2RlCisJCQkgKiBjYW4gdGVsbCB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGFuIGxvZ2dpbmcKKwkJCSAqIGp1c3QgdG8gc2F5ICd0aGlzIGlub2RlIGV4aXN0cycgYW5kIGEgbG9nZ2luZworCQkJICogdG8gc2F5ICd1cGRhdGUgdGhpcyBpbm9kZSB3aXRoIHRoZXNlIHZhbHVlcycKKwkJCSAqLworCQkJYnRyZnNfc2V0X2lub2RlX2dlbmVyYXRpb24oZHN0X3BhdGgtPm5vZGVzWzBdLAorCQkJCQkJICAgaW5vZGVfaXRlbSwgMCk7CisJCX0KKwkJLyogdGFrZSBhIHJlZmVyZW5jZSBvbiBmaWxlIGRhdGEgZXh0ZW50cyBzbyB0aGF0IHRydW5jYXRlcworCQkgKiBvciBkZWxldGVzIG9mIHRoaXMgaW5vZGUgZG9uJ3QgaGF2ZSB0byByZWxvZyB0aGUgaW5vZGUKKwkJICogYWdhaW4KKwkJICovCisJCWlmIChidHJmc19rZXlfdHlwZShpbnNfa2V5cyArIGkpID09IEJUUkZTX0VYVEVOVF9EQVRBX0tFWSkgeworCQkJaW50IGZvdW5kX3R5cGU7CisJCQlleHRlbnQgPSBidHJmc19pdGVtX3B0cihzcmMsIHN0YXJ0X3Nsb3QgKyBpLAorCQkJCQkJc3RydWN0IGJ0cmZzX2ZpbGVfZXh0ZW50X2l0ZW0pOworCisJCQlmb3VuZF90eXBlID0gYnRyZnNfZmlsZV9leHRlbnRfdHlwZShzcmMsIGV4dGVudCk7CisJCQlpZiAoZm91bmRfdHlwZSA9PSBCVFJGU19GSUxFX0VYVEVOVF9SRUcgfHwKKwkJCSAgICBmb3VuZF90eXBlID09IEJUUkZTX0ZJTEVfRVhURU5UX1BSRUFMTE9DKSB7CisJCQkJdTY0IGRzID0gYnRyZnNfZmlsZV9leHRlbnRfZGlza19ieXRlbnIoc3JjLAorCQkJCQkJCQkgICBleHRlbnQpOworCQkJCXU2NCBkbCA9IGJ0cmZzX2ZpbGVfZXh0ZW50X2Rpc2tfbnVtX2J5dGVzKHNyYywKKwkJCQkJCQkJICAgICAgZXh0ZW50KTsKKwkJCQl1NjQgY3MgPSBidHJmc19maWxlX2V4dGVudF9vZmZzZXQoc3JjLCBleHRlbnQpOworCQkJCXU2NCBjbCA9IGJ0cmZzX2ZpbGVfZXh0ZW50X251bV9ieXRlcyhzcmMsCisJCQkJCQkJCSAgICAgZXh0ZW50KTs7CisJCQkJaWYgKGJ0cmZzX2ZpbGVfZXh0ZW50X2NvbXByZXNzaW9uKHNyYywKKwkJCQkJCQkJICBleHRlbnQpKSB7CisJCQkJCWNzID0gMDsKKwkJCQkJY2wgPSBkbDsKKwkJCQl9CisJCQkJLyogZHMgPT0gMCBpcyBhIGhvbGUgKi8KKwkJCQlpZiAoZHMgIT0gMCkgeworCQkJCQlyZXQgPSBidHJmc19pbmNfZXh0ZW50X3JlZih0cmFucywgbG9nLAorCQkJCQkJICAgZHMsIGRsLAorCQkJCQkJICAgZHN0X3BhdGgtPm5vZGVzWzBdLT5zdGFydCwKKwkJCQkJCSAgIEJUUkZTX1RSRUVfTE9HX09CSkVDVElELAorCQkJCQkJICAgdHJhbnMtPnRyYW5zaWQsCisJCQkJCQkgICBpbnNfa2V5c1tpXS5vYmplY3RpZCk7CisJCQkJCUJVR19PTihyZXQpOworCQkJCQlyZXQgPSBidHJmc19sb29rdXBfY3N1bXNfcmFuZ2UoCisJCQkJCQkgICBsb2ctPmZzX2luZm8tPmNzdW1fcm9vdCwKKwkJCQkJCSAgIGRzICsgY3MsIGRzICsgY3MgKyBjbCAtIDEsCisJCQkJCQkgICAmb3JkZXJlZF9zdW1zKTsKKwkJCQkJQlVHX09OKHJldCk7CisJCQkJfQorCQkJfQorCQl9CisJCWRzdF9wYXRoLT5zbG90c1swXSsrOworCX0KKworCWJ0cmZzX21hcmtfYnVmZmVyX2RpcnR5KGRzdF9wYXRoLT5ub2Rlc1swXSk7CisJYnRyZnNfcmVsZWFzZV9wYXRoKGxvZywgZHN0X3BhdGgpOworCWtmcmVlKGluc19kYXRhKTsKKworCS8qCisJICogd2UgaGF2ZSB0byBkbyB0aGlzIGFmdGVyIHRoZSBsb29wIGFib3ZlIHRvIGF2b2lkIGNoYW5naW5nIHRoZQorCSAqIGxvZyB0cmVlIHdoaWxlIHRyeWluZyB0byBjaGFuZ2UgdGhlIGxvZyB0cmVlLgorCSAqLworCXdoaWxlICghbGlzdF9lbXB0eSgmb3JkZXJlZF9zdW1zKSkgeworCQlzdHJ1Y3QgYnRyZnNfb3JkZXJlZF9zdW0gKnN1bXMgPSBsaXN0X2VudHJ5KG9yZGVyZWRfc3Vtcy5uZXh0LAorCQkJCQkJICAgc3RydWN0IGJ0cmZzX29yZGVyZWRfc3VtLAorCQkJCQkJICAgbGlzdCk7CisJCXJldCA9IGJ0cmZzX2NzdW1fZmlsZV9ibG9ja3ModHJhbnMsIGxvZywgc3Vtcyk7CisJCUJVR19PTihyZXQpOworCQlsaXN0X2RlbCgmc3Vtcy0+bGlzdCk7CisJCWtmcmVlKHN1bXMpOworCX0KKwlyZXR1cm4gMDsKK30KKworLyogbG9nIGEgc2luZ2xlIGlub2RlIGluIHRoZSB0cmVlIGxvZy4KKyAqIEF0IGxlYXN0IG9uZSBwYXJlbnQgZGlyZWN0b3J5IGZvciB0aGlzIGlub2RlIG11c3QgZXhpc3QgaW4gdGhlIHRyZWUKKyAqIG9yIGJlIGxvZ2dlZCBhbHJlYWR5LgorICoKKyAqIEFueSBpdGVtcyBmcm9tIHRoaXMgaW5vZGUgY2hhbmdlZCBieSB0aGUgY3VycmVudCB0cmFuc2FjdGlvbiBhcmUgY29waWVkCisgKiB0byB0aGUgbG9nIHRyZWUuICBBbiBleHRyYSByZWZlcmVuY2UgaXMgdGFrZW4gb24gYW55IGV4dGVudHMgaW4gdGhpcworICogZmlsZSwgYWxsb3dpbmcgdXMgdG8gYXZvaWQgYSB3aG9sZSBwaWxlIG9mIGNvcm5lciBjYXNlcyBhcm91bmQgbG9nZ2luZworICogYmxvY2tzIHRoYXQgaGF2ZSBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgdHJlZS4KKyAqCisgKiBTZWUgTE9HX0lOT0RFX0FMTCBhbmQgcmVsYXRlZCBkZWZpbmVzIGZvciBhIGRlc2NyaXB0aW9uIG9mIHdoYXQgaW5vZGVfb25seQorICogZG9lcy4KKyAqCisgKiBUaGlzIGhhbmRsZXMgYm90aCBmaWxlcyBhbmQgZGlyZWN0b3JpZXMuCisgKi8KK3N0YXRpYyBpbnQgX19idHJmc19sb2dfaW5vZGUoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCisJCQkgICAgIHN0cnVjdCBidHJmc19yb290ICpyb290LCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJICAgICBpbnQgaW5vZGVfb25seSkKK3sKKwlzdHJ1Y3QgYnRyZnNfcGF0aCAqcGF0aDsKKwlzdHJ1Y3QgYnRyZnNfcGF0aCAqZHN0X3BhdGg7CisJc3RydWN0IGJ0cmZzX2tleSBtaW5fa2V5OworCXN0cnVjdCBidHJmc19rZXkgbWF4X2tleTsKKwlzdHJ1Y3QgYnRyZnNfcm9vdCAqbG9nID0gcm9vdC0+bG9nX3Jvb3Q7CisJc3RydWN0IGV4dGVudF9idWZmZXIgKnNyYyA9IE5VTEw7CisJdTMyIHNpemU7CisJaW50IHJldDsKKwlpbnQgbnJpdGVtczsKKwlpbnQgaW5zX3N0YXJ0X3Nsb3QgPSAwOworCWludCBpbnNfbnI7CisKKwlsb2cgPSByb290LT5sb2dfcm9vdDsKKworCXBhdGggPSBidHJmc19hbGxvY19wYXRoKCk7CisJZHN0X3BhdGggPSBidHJmc19hbGxvY19wYXRoKCk7CisKKwltaW5fa2V5Lm9iamVjdGlkID0gaW5vZGUtPmlfaW5vOworCW1pbl9rZXkudHlwZSA9IEJUUkZTX0lOT0RFX0lURU1fS0VZOworCW1pbl9rZXkub2Zmc2V0ID0gMDsKKworCW1heF9rZXkub2JqZWN0aWQgPSBpbm9kZS0+aV9pbm87CisJaWYgKGlub2RlX29ubHkgPT0gTE9HX0lOT0RFX0VYSVNUUyB8fCBTX0lTRElSKGlub2RlLT5pX21vZGUpKQorCQltYXhfa2V5LnR5cGUgPSBCVFJGU19YQVRUUl9JVEVNX0tFWTsKKwllbHNlCisJCW1heF9rZXkudHlwZSA9ICh1OCktMTsKKwltYXhfa2V5Lm9mZnNldCA9ICh1NjQpLTE7CisKKwkvKgorCSAqIGlmIHRoaXMgaW5vZGUgaGFzIGFscmVhZHkgYmVlbiBsb2dnZWQgYW5kIHdlJ3JlIGluIGlub2RlX29ubHkKKwkgKiBtb2RlLCB3ZSBkb24ndCB3YW50IHRvIGRlbGV0ZSB0aGUgdGhpbmdzIHRoYXQgaGF2ZSBhbHJlYWR5CisJICogYmVlbiB3cml0dGVuIHRvIHRoZSBsb2cuCisJICoKKwkgKiBCdXQsIGlmIHRoZSBpbm9kZSBoYXMgYmVlbiB0aHJvdWdoIGFuIGlub2RlX29ubHkgbG9nLAorCSAqIHRoZSBsb2dnZWRfdHJhbnMgZmllbGQgaXMgbm90IHNldC4gIFRoaXMgYWxsb3dzIHVzIHRvIGNhdGNoCisJICogYW55IG5ldyBuYW1lcyBmb3IgdGhpcyBpbm9kZSBpbiB0aGUgYmFja3JlZnMgYnkgbG9nZ2luZyBpdAorCSAqIGFnYWluCisJICovCisJaWYgKGlub2RlX29ubHkgPT0gTE9HX0lOT0RFX0VYSVNUUyAmJgorCSAgICBCVFJGU19JKGlub2RlKS0+bG9nZ2VkX3RyYW5zID09IHRyYW5zLT50cmFuc2lkKSB7CisJCWJ0cmZzX2ZyZWVfcGF0aChwYXRoKTsKKwkJYnRyZnNfZnJlZV9wYXRoKGRzdF9wYXRoKTsKKwkJZ290byBvdXQ7CisJfQorCW11dGV4X2xvY2soJkJUUkZTX0koaW5vZGUpLT5sb2dfbXV0ZXgpOworCisJLyoKKwkgKiBhIGJydXRlIGZvcmNlIGFwcHJvYWNoIHRvIG1ha2luZyBzdXJlIHdlIGdldCB0aGUgbW9zdCB1cHRvZGF0ZQorCSAqIGNvcGllcyBvZiBldmVyeXRoaW5nLgorCSAqLworCWlmIChTX0lTRElSKGlub2RlLT5pX21vZGUpKSB7CisJCWludCBtYXhfa2V5X3R5cGUgPSBCVFJGU19ESVJfTE9HX0lOREVYX0tFWTsKKworCQlpZiAoaW5vZGVfb25seSA9PSBMT0dfSU5PREVfRVhJU1RTKQorCQkJbWF4X2tleV90eXBlID0gQlRSRlNfWEFUVFJfSVRFTV9LRVk7CisJCXJldCA9IGRyb3Bfb2JqZWN0aWRfaXRlbXModHJhbnMsIGxvZywgcGF0aCwKKwkJCQkJICBpbm9kZS0+aV9pbm8sIG1heF9rZXlfdHlwZSk7CisJfSBlbHNlIHsKKwkJcmV0ID0gYnRyZnNfdHJ1bmNhdGVfaW5vZGVfaXRlbXModHJhbnMsIGxvZywgaW5vZGUsIDAsIDApOworCX0KKwlCVUdfT04ocmV0KTsKKwlwYXRoLT5rZWVwX2xvY2tzID0gMTsKKworCXdoaWxlICgxKSB7CisJCWluc19uciA9IDA7CisJCXJldCA9IGJ0cmZzX3NlYXJjaF9mb3J3YXJkKHJvb3QsICZtaW5fa2V5LCAmbWF4X2tleSwKKwkJCQkJICAgcGF0aCwgMCwgdHJhbnMtPnRyYW5zaWQpOworCQlpZiAocmV0ICE9IDApCisJCQlicmVhazsKK2FnYWluOgorCQkvKiBub3RlLCBpbnNfbnIgbWlnaHQgYmUgPiAwIGhlcmUsIGNsZWFudXAgb3V0c2lkZSB0aGUgbG9vcCAqLworCQlpZiAobWluX2tleS5vYmplY3RpZCAhPSBpbm9kZS0+aV9pbm8pCisJCQlicmVhazsKKwkJaWYgKG1pbl9rZXkudHlwZSA+IG1heF9rZXkudHlwZSkKKwkJCWJyZWFrOworCisJCXNyYyA9IHBhdGgtPm5vZGVzWzBdOworCQlzaXplID0gYnRyZnNfaXRlbV9zaXplX25yKHNyYywgcGF0aC0+c2xvdHNbMF0pOworCQlpZiAoaW5zX25yICYmIGluc19zdGFydF9zbG90ICsgaW5zX25yID09IHBhdGgtPnNsb3RzWzBdKSB7CisJCQlpbnNfbnIrKzsKKwkJCWdvdG8gbmV4dF9zbG90OworCQl9IGVsc2UgaWYgKCFpbnNfbnIpIHsKKwkJCWluc19zdGFydF9zbG90ID0gcGF0aC0+c2xvdHNbMF07CisJCQlpbnNfbnIgPSAxOworCQkJZ290byBuZXh0X3Nsb3Q7CisJCX0KKworCQlyZXQgPSBjb3B5X2l0ZW1zKHRyYW5zLCBsb2csIGRzdF9wYXRoLCBzcmMsIGluc19zdGFydF9zbG90LAorCQkJCSBpbnNfbnIsIGlub2RlX29ubHkpOworCQlCVUdfT04ocmV0KTsKKwkJaW5zX25yID0gMTsKKwkJaW5zX3N0YXJ0X3Nsb3QgPSBwYXRoLT5zbG90c1swXTsKK25leHRfc2xvdDoKKworCQlucml0ZW1zID0gYnRyZnNfaGVhZGVyX25yaXRlbXMocGF0aC0+bm9kZXNbMF0pOworCQlwYXRoLT5zbG90c1swXSsrOworCQlpZiAocGF0aC0+c2xvdHNbMF0gPCBucml0ZW1zKSB7CisJCQlidHJmc19pdGVtX2tleV90b19jcHUocGF0aC0+bm9kZXNbMF0sICZtaW5fa2V5LAorCQkJCQkgICAgICBwYXRoLT5zbG90c1swXSk7CisJCQlnb3RvIGFnYWluOworCQl9CisJCWlmIChpbnNfbnIpIHsKKwkJCXJldCA9IGNvcHlfaXRlbXModHJhbnMsIGxvZywgZHN0X3BhdGgsIHNyYywKKwkJCQkJIGluc19zdGFydF9zbG90LAorCQkJCQkgaW5zX25yLCBpbm9kZV9vbmx5KTsKKwkJCUJVR19PTihyZXQpOworCQkJaW5zX25yID0gMDsKKwkJfQorCQlidHJmc19yZWxlYXNlX3BhdGgocm9vdCwgcGF0aCk7CisKKwkJaWYgKG1pbl9rZXkub2Zmc2V0IDwgKHU2NCktMSkKKwkJCW1pbl9rZXkub2Zmc2V0Kys7CisJCWVsc2UgaWYgKG1pbl9rZXkudHlwZSA8ICh1OCktMSkKKwkJCW1pbl9rZXkudHlwZSsrOworCQllbHNlIGlmIChtaW5fa2V5Lm9iamVjdGlkIDwgKHU2NCktMSkKKwkJCW1pbl9rZXkub2JqZWN0aWQrKzsKKwkJZWxzZQorCQkJYnJlYWs7CisJfQorCWlmIChpbnNfbnIpIHsKKwkJcmV0ID0gY29weV9pdGVtcyh0cmFucywgbG9nLCBkc3RfcGF0aCwgc3JjLAorCQkJCSBpbnNfc3RhcnRfc2xvdCwKKwkJCQkgaW5zX25yLCBpbm9kZV9vbmx5KTsKKwkJQlVHX09OKHJldCk7CisJCWluc19uciA9IDA7CisJfQorCVdBUk5fT04oaW5zX25yKTsKKwlpZiAoaW5vZGVfb25seSA9PSBMT0dfSU5PREVfQUxMICYmIFNfSVNESVIoaW5vZGUtPmlfbW9kZSkpIHsKKwkJYnRyZnNfcmVsZWFzZV9wYXRoKHJvb3QsIHBhdGgpOworCQlidHJmc19yZWxlYXNlX3BhdGgobG9nLCBkc3RfcGF0aCk7CisJCUJUUkZTX0koaW5vZGUpLT5sb2dfZGlydHlfdHJhbnMgPSAwOworCQlyZXQgPSBsb2dfZGlyZWN0b3J5X2NoYW5nZXModHJhbnMsIHJvb3QsIGlub2RlLCBwYXRoLCBkc3RfcGF0aCk7CisJCUJVR19PTihyZXQpOworCX0KKwlCVFJGU19JKGlub2RlKS0+bG9nZ2VkX3RyYW5zID0gdHJhbnMtPnRyYW5zaWQ7CisJbXV0ZXhfdW5sb2NrKCZCVFJGU19JKGlub2RlKS0+bG9nX211dGV4KTsKKworCWJ0cmZzX2ZyZWVfcGF0aChwYXRoKTsKKwlidHJmc19mcmVlX3BhdGgoZHN0X3BhdGgpOworCisJbXV0ZXhfbG9jaygmcm9vdC0+ZnNfaW5mby0+dHJlZV9sb2dfbXV0ZXgpOworCXJldCA9IHVwZGF0ZV9sb2dfcm9vdCh0cmFucywgbG9nKTsKKwlCVUdfT04ocmV0KTsKKwltdXRleF91bmxvY2soJnJvb3QtPmZzX2luZm8tPnRyZWVfbG9nX211dGV4KTsKK291dDoKKwlyZXR1cm4gMDsKK30KKworaW50IGJ0cmZzX2xvZ19pbm9kZShzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKKwkJICAgIHN0cnVjdCBidHJmc19yb290ICpyb290LCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkgICAgaW50IGlub2RlX29ubHkpCit7CisJaW50IHJldDsKKworCXN0YXJ0X2xvZ190cmFucyh0cmFucywgcm9vdCk7CisJcmV0ID0gX19idHJmc19sb2dfaW5vZGUodHJhbnMsIHJvb3QsIGlub2RlLCBpbm9kZV9vbmx5KTsKKwllbmRfbG9nX3RyYW5zKHJvb3QpOworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBoZWxwZXIgZnVuY3Rpb24gYXJvdW5kIGJ0cmZzX2xvZ19pbm9kZSB0byBtYWtlIHN1cmUgbmV3bHkgY3JlYXRlZAorICogcGFyZW50IGRpcmVjdG9yaWVzIGFsc28gZW5kIHVwIGluIHRoZSBsb2cuICBBIG1pbmltYWwgaW5vZGUgYW5kIGJhY2tyZWYKKyAqIG9ubHkgbG9nZ2luZyBpcyBkb25lIG9mIGFueSBwYXJlbnQgZGlyZWN0b3JpZXMgdGhhdCBhcmUgb2xkZXIgdGhhbgorICogdGhlIGxhc3QgY29tbWl0dGVkIHRyYW5zYWN0aW9uCisgKi8KK2ludCBidHJmc19sb2dfZGVudHJ5KHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAorCQkgICAgc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKK3sKKwlpbnQgaW5vZGVfb25seSA9IExPR19JTk9ERV9BTEw7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYjsKKwlpbnQgcmV0OworCisJc3RhcnRfbG9nX3RyYW5zKHRyYW5zLCByb290KTsKKwlzYiA9IGRlbnRyeS0+ZF9pbm9kZS0+aV9zYjsKKwl3aGlsZSAoMSkgeworCQlyZXQgPSBfX2J0cmZzX2xvZ19pbm9kZSh0cmFucywgcm9vdCwgZGVudHJ5LT5kX2lub2RlLAorCQkJCQlpbm9kZV9vbmx5KTsKKwkJQlVHX09OKHJldCk7CisJCWlub2RlX29ubHkgPSBMT0dfSU5PREVfRVhJU1RTOworCisJCWRlbnRyeSA9IGRlbnRyeS0+ZF9wYXJlbnQ7CisJCWlmICghZGVudHJ5IHx8ICFkZW50cnktPmRfaW5vZGUgfHwgc2IgIT0gZGVudHJ5LT5kX2lub2RlLT5pX3NiKQorCQkJYnJlYWs7CisKKwkJaWYgKEJUUkZTX0koZGVudHJ5LT5kX2lub2RlKS0+Z2VuZXJhdGlvbiA8PQorCQkgICAgcm9vdC0+ZnNfaW5mby0+bGFzdF90cmFuc19jb21taXR0ZWQpCisJCQlicmVhazsKKwl9CisJZW5kX2xvZ190cmFucyhyb290KTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGl0IGlzIG5vdCBzYWZlIHRvIGxvZyBkZW50cnkgaWYgdGhlIGNodW5rIHJvb3QgaGFzIGFkZGVkIG5ldworICogY2h1bmtzLiAgVGhpcyByZXR1cm5zIDAgaWYgdGhlIGRlbnRyeSB3YXMgbG9nZ2VkLCBhbmQgMSBvdGhlcndpc2UuCisgKiBJZiB0aGlzIHJldHVybnMgMSwgeW91IG11c3QgY29tbWl0IHRoZSB0cmFuc2FjdGlvbiB0byBzYWZlbHkgZ2V0IHlvdXIKKyAqIGRhdGEgb24gZGlzay4KKyAqLworaW50IGJ0cmZzX2xvZ19kZW50cnlfc2FmZShzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKKwkJCSAgc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKK3sKKwl1NjQgZ2VuOworCWdlbiA9IHJvb3QtPmZzX2luZm8tPmxhc3RfdHJhbnNfbmV3X2Jsb2NrZ3JvdXA7CisJaWYgKGdlbiA+IHJvb3QtPmZzX2luZm8tPmxhc3RfdHJhbnNfY29tbWl0dGVkKQorCQlyZXR1cm4gMTsKKwllbHNlCisJCXJldHVybiBidHJmc19sb2dfZGVudHJ5KHRyYW5zLCByb290LCBkZW50cnkpOworfQorCisvKgorICogc2hvdWxkIGJlIGNhbGxlZCBkdXJpbmcgbW91bnQgdG8gcmVjb3ZlciBhbnkgcmVwbGF5IGFueSBsb2cgdHJlZXMKKyAqIGZyb20gdGhlIEZTCisgKi8KK2ludCBidHJmc19yZWNvdmVyX2xvZ190cmVlcyhzdHJ1Y3QgYnRyZnNfcm9vdCAqbG9nX3Jvb3RfdHJlZSkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBidHJmc19wYXRoICpwYXRoOworCXN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zOworCXN0cnVjdCBidHJmc19rZXkga2V5OworCXN0cnVjdCBidHJmc19rZXkgZm91bmRfa2V5OworCXN0cnVjdCBidHJmc19rZXkgdG1wX2tleTsKKwlzdHJ1Y3QgYnRyZnNfcm9vdCAqbG9nOworCXN0cnVjdCBidHJmc19mc19pbmZvICpmc19pbmZvID0gbG9nX3Jvb3RfdHJlZS0+ZnNfaW5mbzsKKwl1NjQgaGlnaGVzdF9pbm9kZTsKKwlzdHJ1Y3Qgd2Fsa19jb250cm9sIHdjID0geworCQkucHJvY2Vzc19mdW5jID0gcHJvY2Vzc19vbmVfYnVmZmVyLAorCQkuc3RhZ2UgPSAwLAorCX07CisKKwlmc19pbmZvLT5sb2dfcm9vdF9yZWNvdmVyaW5nID0gMTsKKwlwYXRoID0gYnRyZnNfYWxsb2NfcGF0aCgpOworCUJVR19PTighcGF0aCk7CisKKwl0cmFucyA9IGJ0cmZzX3N0YXJ0X3RyYW5zYWN0aW9uKGZzX2luZm8tPnRyZWVfcm9vdCwgMSk7CisKKwl3Yy50cmFucyA9IHRyYW5zOworCXdjLnBpbiA9IDE7CisKKwl3YWxrX2xvZ190cmVlKHRyYW5zLCBsb2dfcm9vdF90cmVlLCAmd2MpOworCithZ2FpbjoKKwlrZXkub2JqZWN0aWQgPSBCVFJGU19UUkVFX0xPR19PQkpFQ1RJRDsKKwlrZXkub2Zmc2V0ID0gKHU2NCktMTsKKwlidHJmc19zZXRfa2V5X3R5cGUoJmtleSwgQlRSRlNfUk9PVF9JVEVNX0tFWSk7CisKKwl3aGlsZSAoMSkgeworCQlyZXQgPSBidHJmc19zZWFyY2hfc2xvdChOVUxMLCBsb2dfcm9vdF90cmVlLCAma2V5LCBwYXRoLCAwLCAwKTsKKwkJaWYgKHJldCA8IDApCisJCQlicmVhazsKKwkJaWYgKHJldCA+IDApIHsKKwkJCWlmIChwYXRoLT5zbG90c1swXSA9PSAwKQorCQkJCWJyZWFrOworCQkJcGF0aC0+c2xvdHNbMF0tLTsKKwkJfQorCQlidHJmc19pdGVtX2tleV90b19jcHUocGF0aC0+bm9kZXNbMF0sICZmb3VuZF9rZXksCisJCQkJICAgICAgcGF0aC0+c2xvdHNbMF0pOworCQlidHJmc19yZWxlYXNlX3BhdGgobG9nX3Jvb3RfdHJlZSwgcGF0aCk7CisJCWlmIChmb3VuZF9rZXkub2JqZWN0aWQgIT0gQlRSRlNfVFJFRV9MT0dfT0JKRUNUSUQpCisJCQlicmVhazsKKworCQlsb2cgPSBidHJmc19yZWFkX2ZzX3Jvb3Rfbm9fcmFkaXgobG9nX3Jvb3RfdHJlZSwKKwkJCQkJCSAgJmZvdW5kX2tleSk7CisJCUJVR19PTighbG9nKTsKKworCisJCXRtcF9rZXkub2JqZWN0aWQgPSBmb3VuZF9rZXkub2Zmc2V0OworCQl0bXBfa2V5LnR5cGUgPSBCVFJGU19ST09UX0lURU1fS0VZOworCQl0bXBfa2V5Lm9mZnNldCA9ICh1NjQpLTE7CisKKwkJd2MucmVwbGF5X2Rlc3QgPSBidHJmc19yZWFkX2ZzX3Jvb3Rfbm9fbmFtZShmc19pbmZvLCAmdG1wX2tleSk7CisJCUJVR19PTighd2MucmVwbGF5X2Rlc3QpOworCisJCXdjLnJlcGxheV9kZXN0LT5sb2dfcm9vdCA9IGxvZzsKKwkJYnRyZnNfcmVjb3JkX3Jvb3RfaW5fdHJhbnMod2MucmVwbGF5X2Rlc3QpOworCQlyZXQgPSB3YWxrX2xvZ190cmVlKHRyYW5zLCBsb2csICZ3Yyk7CisJCUJVR19PTihyZXQpOworCisJCWlmICh3Yy5zdGFnZSA9PSBMT0dfV0FMS19SRVBMQVlfQUxMKSB7CisJCQlyZXQgPSBmaXh1cF9pbm9kZV9saW5rX2NvdW50cyh0cmFucywgd2MucmVwbGF5X2Rlc3QsCisJCQkJCQkgICAgICBwYXRoKTsKKwkJCUJVR19PTihyZXQpOworCQl9CisJCXJldCA9IGJ0cmZzX2ZpbmRfaGlnaGVzdF9pbm9kZSh3Yy5yZXBsYXlfZGVzdCwgJmhpZ2hlc3RfaW5vZGUpOworCQlpZiAocmV0ID09IDApIHsKKwkJCXdjLnJlcGxheV9kZXN0LT5oaWdoZXN0X2lub2RlID0gaGlnaGVzdF9pbm9kZTsKKwkJCXdjLnJlcGxheV9kZXN0LT5sYXN0X2lub2RlX2FsbG9jID0gaGlnaGVzdF9pbm9kZTsKKwkJfQorCisJCWtleS5vZmZzZXQgPSBmb3VuZF9rZXkub2Zmc2V0IC0gMTsKKwkJd2MucmVwbGF5X2Rlc3QtPmxvZ19yb290ID0gTlVMTDsKKwkJZnJlZV9leHRlbnRfYnVmZmVyKGxvZy0+bm9kZSk7CisJCWtmcmVlKGxvZyk7CisKKwkJaWYgKGZvdW5kX2tleS5vZmZzZXQgPT0gMCkKKwkJCWJyZWFrOworCX0KKwlidHJmc19yZWxlYXNlX3BhdGgobG9nX3Jvb3RfdHJlZSwgcGF0aCk7CisKKwkvKiBzdGVwIG9uZSBpcyB0byBwaW4gaXQgYWxsLCBzdGVwIHR3byBpcyB0byByZXBsYXkganVzdCBpbm9kZXMgKi8KKwlpZiAod2MucGluKSB7CisJCXdjLnBpbiA9IDA7CisJCXdjLnByb2Nlc3NfZnVuYyA9IHJlcGxheV9vbmVfYnVmZmVyOworCQl3Yy5zdGFnZSA9IExPR19XQUxLX1JFUExBWV9JTk9ERVM7CisJCWdvdG8gYWdhaW47CisJfQorCS8qIHN0ZXAgdGhyZWUgaXMgdG8gcmVwbGF5IGV2ZXJ5dGhpbmcgKi8KKwlpZiAod2Muc3RhZ2UgPCBMT0dfV0FMS19SRVBMQVlfQUxMKSB7CisJCXdjLnN0YWdlKys7CisJCWdvdG8gYWdhaW47CisJfQorCisJYnRyZnNfZnJlZV9wYXRoKHBhdGgpOworCisJZnJlZV9leHRlbnRfYnVmZmVyKGxvZ19yb290X3RyZWUtPm5vZGUpOworCWxvZ19yb290X3RyZWUtPmxvZ19yb290ID0gTlVMTDsKKwlmc19pbmZvLT5sb2dfcm9vdF9yZWNvdmVyaW5nID0gMDsKKworCS8qIHN0ZXAgNDogY29tbWl0IHRoZSB0cmFuc2FjdGlvbiwgd2hpY2ggYWxzbyB1bnBpbnMgdGhlIGJsb2NrcyAqLworCWJ0cmZzX2NvbW1pdF90cmFuc2FjdGlvbih0cmFucywgZnNfaW5mby0+dHJlZV9yb290KTsKKworCWtmcmVlKGxvZ19yb290X3RyZWUpOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZnMvYnRyZnMvdHJlZS1sb2cuaCBiL2ZzL2J0cmZzL3RyZWUtbG9nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjk0MDliMwotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2J0cmZzL3RyZWUtbG9nLmgKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBPcmFjbGUuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSB2MiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorICogQm9zdG9uLCBNQSAwMjExMTAtMTMwNywgVVNBLgorICovCisKKyNpZm5kZWYgX19UUkVFX0xPR18KKyNkZWZpbmUgX19UUkVFX0xPR18KKworaW50IGJ0cmZzX3N5bmNfbG9nKHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAorCQkgICBzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCk7CitpbnQgYnRyZnNfZnJlZV9sb2coc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsIHN0cnVjdCBidHJmc19yb290ICpyb290KTsKK2ludCBidHJmc19sb2dfZGVudHJ5KHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAorCQkgICAgc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSk7CitpbnQgYnRyZnNfcmVjb3Zlcl9sb2dfdHJlZXMoc3RydWN0IGJ0cmZzX3Jvb3QgKnRyZWVfcm9vdCk7CitpbnQgYnRyZnNfbG9nX2RlbnRyeV9zYWZlKHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAorCQkJICBzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwgc3RydWN0IGRlbnRyeSAqZGVudHJ5KTsKK2ludCBidHJmc19sb2dfaW5vZGUoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCisJCSAgICBzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwgc3RydWN0IGlub2RlICppbm9kZSwKKwkJICAgIGludCBpbm9kZV9vbmx5KTsKK2ludCBidHJmc19kZWxfZGlyX2VudHJpZXNfaW5fbG9nKHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAorCQkJCSBzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwKKwkJCQkgY29uc3QgY2hhciAqbmFtZSwgaW50IG5hbWVfbGVuLAorCQkJCSBzdHJ1Y3QgaW5vZGUgKmRpciwgdTY0IGluZGV4KTsKK2ludCBidHJmc19kZWxfaW5vZGVfcmVmX2luX2xvZyhzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKKwkJCSAgICAgICBzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwKKwkJCSAgICAgICBjb25zdCBjaGFyICpuYW1lLCBpbnQgbmFtZV9sZW4sCisJCQkgICAgICAgc3RydWN0IGlub2RlICppbm9kZSwgdTY0IGRpcmlkKTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZnMvYnRyZnMvdmVyc2lvbi5oIGIvZnMvYnRyZnMvdmVyc2lvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliZjM5NDYKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9idHJmcy92ZXJzaW9uLmgKQEAgLTAsMCArMSw0IEBACisjaWZuZGVmIF9fQlRSRlNfVkVSU0lPTl9ICisjZGVmaW5lIF9fQlRSRlNfVkVSU0lPTl9ICisjZGVmaW5lIEJUUkZTX0JVSUxEX1ZFUlNJT04gIkJ0cmZzIgorI2VuZGlmCmRpZmYgLS1naXQgYS9mcy9idHJmcy92ZXJzaW9uLnNoIGIvZnMvYnRyZnMvdmVyc2lvbi5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xY2ExOTUyCi0tLSAvZGV2L251bGwKKysrIGIvZnMvYnRyZnMvdmVyc2lvbi5zaApAQCAtMCwwICsxLDQzIEBACisjIS9iaW4vYmFzaAorIworIyBkZXRlcm1pbmUtdmVyc2lvbiAtLSByZXBvcnQgYSB1c2VmdWwgdmVyc2lvbiBmb3IgcmVsZWFzZXMKKyMKKyMgQ29weXJpZ2h0IDIwMDgsIEFyb24gR3JpZmZpcyA8YWdyaWZmaXNAbjAxc2UubmV0PgorIyBDb3B5cmlnaHQgMjAwOCwgT3JhY2xlCisjIFJlbGVhc2VkIHVuZGVyIHRoZSBHTlUgR1BMdjIKKyAKK3Y9InYwLjE2IgorCit3aGljaCBnaXQgJj4gL2Rldi9udWxsCitpZiBbICQ/ID09IDAgXTsgdGhlbgorICAgIGdpdCBicmFuY2ggPiYgL2Rldi9udWxsCisgICAgaWYgWyAkPyA9PSAwIF07IHRoZW4KKwkgICAgaWYgaGVhZD1gZ2l0IHJldi1wYXJzZSAtLXZlcmlmeSBIRUFEIDI+L2Rldi9udWxsYDsgdGhlbgorCQlpZiB0YWc9YGdpdCBkZXNjcmliZSAtLXRhZ3MgMj4vZGV2L251bGxgOyB0aGVuCisJCSAgICB2PSIkdGFnIgorCQlmaQorCisJCSMgQXJlIHRoZXJlIHVuY29tbWl0dGVkIGNoYW5nZXM/CisJCWdpdCB1cGRhdGUtaW5kZXggLS1yZWZyZXNoIC0tdW5tZXJnZWQgPiAvZGV2L251bGwKKwkJaWYgZ2l0IGRpZmYtaW5kZXggLS1uYW1lLW9ubHkgSEVBRCB8IFwKKwkJICAgIGdyZXAgLXYgIl5zY3JpcHRzL3BhY2thZ2UiIFwKKwkJICAgIHwgcmVhZCBkdW1teTsgdGhlbgorCQkgICAgdj0iJHYiLWRpcnR5CisJCWZpCisJICAgIGZpCisgICAgZmkKK2ZpCisgCitlY2hvICIjaWZuZGVmIF9fQlVJTERfVkVSU0lPTiIgPiAuYnVpbGQtdmVyc2lvbi5oCitlY2hvICIjZGVmaW5lIF9fQlVJTERfVkVSU0lPTiIgPj4gLmJ1aWxkLXZlcnNpb24uaAorZWNobyAiI2RlZmluZSBCVFJGU19CVUlMRF9WRVJTSU9OIFwiQnRyZnMgJHZcIiIgPj4gLmJ1aWxkLXZlcnNpb24uaAorZWNobyAiI2VuZGlmIiA+PiAuYnVpbGQtdmVyc2lvbi5oCisKK2RpZmYgLXEgdmVyc2lvbi5oIC5idWlsZC12ZXJzaW9uLmggPiYgL2Rldi9udWxsCisKK2lmIFsgJD8gPT0gMCBdOyB0aGVuCisgICAgcm0gLmJ1aWxkLXZlcnNpb24uaAorICAgIGV4aXQgMAorZmkKKworbXYgLmJ1aWxkLXZlcnNpb24uaCB2ZXJzaW9uLmgKZGlmZiAtLWdpdCBhL2ZzL2J0cmZzL3ZvbHVtZXMuYyBiL2ZzL2J0cmZzL3ZvbHVtZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDUxZTFjCi0tLSAvZGV2L251bGwKKysrIGIvZnMvYnRyZnMvdm9sdW1lcy5jCkBAIC0wLDAgKzEsMzIxOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBPcmFjbGUuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSB2MiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorICogQm9zdG9uLCBNQSAwMjExMTAtMTMwNywgVVNBLgorICovCisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9iaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxhc20vZGl2NjQuaD4KKyNpbmNsdWRlICJjb21wYXQuaCIKKyNpbmNsdWRlICJjdHJlZS5oIgorI2luY2x1ZGUgImV4dGVudF9tYXAuaCIKKyNpbmNsdWRlICJkaXNrLWlvLmgiCisjaW5jbHVkZSAidHJhbnNhY3Rpb24uaCIKKyNpbmNsdWRlICJwcmludC10cmVlLmgiCisjaW5jbHVkZSAidm9sdW1lcy5oIgorI2luY2x1ZGUgImFzeW5jLXRocmVhZC5oIgorCitzdHJ1Y3QgbWFwX2xvb2t1cCB7CisJdTY0IHR5cGU7CisJaW50IGlvX2FsaWduOworCWludCBpb193aWR0aDsKKwlpbnQgc3RyaXBlX2xlbjsKKwlpbnQgc2VjdG9yX3NpemU7CisJaW50IG51bV9zdHJpcGVzOworCWludCBzdWJfc3RyaXBlczsKKwlzdHJ1Y3QgYnRyZnNfYmlvX3N0cmlwZSBzdHJpcGVzW107Cit9OworCitzdGF0aWMgaW50IGluaXRfZmlyc3RfcndfZGV2aWNlKHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAorCQkJCXN0cnVjdCBidHJmc19yb290ICpyb290LAorCQkJCXN0cnVjdCBidHJmc19kZXZpY2UgKmRldmljZSk7CitzdGF0aWMgaW50IGJ0cmZzX3JlbG9jYXRlX3N5c19jaHVua3Moc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QpOworCisjZGVmaW5lIG1hcF9sb29rdXBfc2l6ZShuKSAoc2l6ZW9mKHN0cnVjdCBtYXBfbG9va3VwKSArIFwKKwkJCSAgICAoc2l6ZW9mKHN0cnVjdCBidHJmc19iaW9fc3RyaXBlKSAqIChuKSkpCisKK3N0YXRpYyBERUZJTkVfTVVURVgodXVpZF9tdXRleCk7CitzdGF0aWMgTElTVF9IRUFEKGZzX3V1aWRzKTsKKwordm9pZCBidHJmc19sb2NrX3ZvbHVtZXModm9pZCkKK3sKKwltdXRleF9sb2NrKCZ1dWlkX211dGV4KTsKK30KKwordm9pZCBidHJmc191bmxvY2tfdm9sdW1lcyh2b2lkKQoreworCW11dGV4X3VubG9jaygmdXVpZF9tdXRleCk7Cit9CisKK3N0YXRpYyB2b2lkIGxvY2tfY2h1bmtzKHN0cnVjdCBidHJmc19yb290ICpyb290KQoreworCW11dGV4X2xvY2soJnJvb3QtPmZzX2luZm8tPmNodW5rX211dGV4KTsKK30KKworc3RhdGljIHZvaWQgdW5sb2NrX2NodW5rcyhzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCkKK3sKKwltdXRleF91bmxvY2soJnJvb3QtPmZzX2luZm8tPmNodW5rX211dGV4KTsKK30KKworc3RhdGljIHZvaWQgZnJlZV9mc19kZXZpY2VzKHN0cnVjdCBidHJmc19mc19kZXZpY2VzICpmc19kZXZpY2VzKQoreworCXN0cnVjdCBidHJmc19kZXZpY2UgKmRldmljZTsKKwlXQVJOX09OKGZzX2RldmljZXMtPm9wZW5lZCk7CisJd2hpbGUgKCFsaXN0X2VtcHR5KCZmc19kZXZpY2VzLT5kZXZpY2VzKSkgeworCQlkZXZpY2UgPSBsaXN0X2VudHJ5KGZzX2RldmljZXMtPmRldmljZXMubmV4dCwKKwkJCQkgICAgc3RydWN0IGJ0cmZzX2RldmljZSwgZGV2X2xpc3QpOworCQlsaXN0X2RlbCgmZGV2aWNlLT5kZXZfbGlzdCk7CisJCWtmcmVlKGRldmljZS0+bmFtZSk7CisJCWtmcmVlKGRldmljZSk7CisJfQorCWtmcmVlKGZzX2RldmljZXMpOworfQorCitpbnQgYnRyZnNfY2xlYW51cF9mc191dWlkcyh2b2lkKQoreworCXN0cnVjdCBidHJmc19mc19kZXZpY2VzICpmc19kZXZpY2VzOworCisJd2hpbGUgKCFsaXN0X2VtcHR5KCZmc191dWlkcykpIHsKKwkJZnNfZGV2aWNlcyA9IGxpc3RfZW50cnkoZnNfdXVpZHMubmV4dCwKKwkJCQkJc3RydWN0IGJ0cmZzX2ZzX2RldmljZXMsIGxpc3QpOworCQlsaXN0X2RlbCgmZnNfZGV2aWNlcy0+bGlzdCk7CisJCWZyZWVfZnNfZGV2aWNlcyhmc19kZXZpY2VzKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBub2lubGluZSBzdHJ1Y3QgYnRyZnNfZGV2aWNlICpfX2ZpbmRfZGV2aWNlKHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQsCisJCQkJCQkgICB1NjQgZGV2aWQsIHU4ICp1dWlkKQoreworCXN0cnVjdCBidHJmc19kZXZpY2UgKmRldjsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpjdXI7CisKKwlsaXN0X2Zvcl9lYWNoKGN1ciwgaGVhZCkgeworCQlkZXYgPSBsaXN0X2VudHJ5KGN1ciwgc3RydWN0IGJ0cmZzX2RldmljZSwgZGV2X2xpc3QpOworCQlpZiAoZGV2LT5kZXZpZCA9PSBkZXZpZCAmJgorCQkgICAgKCF1dWlkIHx8ICFtZW1jbXAoZGV2LT51dWlkLCB1dWlkLCBCVFJGU19VVUlEX1NJWkUpKSkgeworCQkJcmV0dXJuIGRldjsKKwkJfQorCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIG5vaW5saW5lIHN0cnVjdCBidHJmc19mc19kZXZpY2VzICpmaW5kX2ZzaWQodTggKmZzaWQpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqY3VyOworCXN0cnVjdCBidHJmc19mc19kZXZpY2VzICpmc19kZXZpY2VzOworCisJbGlzdF9mb3JfZWFjaChjdXIsICZmc191dWlkcykgeworCQlmc19kZXZpY2VzID0gbGlzdF9lbnRyeShjdXIsIHN0cnVjdCBidHJmc19mc19kZXZpY2VzLCBsaXN0KTsKKwkJaWYgKG1lbWNtcChmc2lkLCBmc19kZXZpY2VzLT5mc2lkLCBCVFJGU19GU0lEX1NJWkUpID09IDApCisJCQlyZXR1cm4gZnNfZGV2aWNlczsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qCisgKiB3ZSB0cnkgdG8gY29sbGVjdCBwZW5kaW5nIGJpb3MgZm9yIGEgZGV2aWNlIHNvIHdlIGRvbid0IGdldCBhIGxhcmdlCisgKiBudW1iZXIgb2YgcHJvY3Mgc2VuZGluZyBiaW9zIGRvd24gdG8gdGhlIHNhbWUgZGV2aWNlLiAgVGhpcyBncmVhdGx5CisgKiBpbXByb3ZlcyB0aGUgc2NoZWR1bGVycyBhYmlsaXR5IHRvIGNvbGxlY3QgYW5kIG1lcmdlIHRoZSBiaW9zLgorICoKKyAqIEJ1dCwgaXQgYWxzbyB0dXJucyBpbnRvIGEgbG9uZyBsaXN0IG9mIGJpb3MgdG8gcHJvY2VzcyBhbmQgdGhhdCBpcyBzdXJlCisgKiB0byBldmVudHVhbGx5IG1ha2UgdGhlIHdvcmtlciB0aHJlYWQgYmxvY2suICBUaGUgc29sdXRpb24gaGVyZSBpcyB0bworICogbWFrZSBzb21lIHByb2dyZXNzIGFuZCB0aGVuIHB1dCB0aGlzIHdvcmsgc3RydWN0IGJhY2sgYXQgdGhlIGVuZCBvZgorICogdGhlIGxpc3QgaWYgdGhlIGJsb2NrIGRldmljZSBpcyBjb25nZXN0ZWQuICBUaGlzIHdheSwgbXVsdGlwbGUgZGV2aWNlcworICogY2FuIG1ha2UgcHJvZ3Jlc3MgZnJvbSBhIHNpbmdsZSB3b3JrZXIgdGhyZWFkLgorICovCitzdGF0aWMgbm9pbmxpbmUgaW50IHJ1bl9zY2hlZHVsZWRfYmlvcyhzdHJ1Y3QgYnRyZnNfZGV2aWNlICpkZXZpY2UpCit7CisJc3RydWN0IGJpbyAqcGVuZGluZzsKKwlzdHJ1Y3QgYmFja2luZ19kZXZfaW5mbyAqYmRpOworCXN0cnVjdCBidHJmc19mc19pbmZvICpmc19pbmZvOworCXN0cnVjdCBiaW8gKnRhaWw7CisJc3RydWN0IGJpbyAqY3VyOworCWludCBhZ2FpbiA9IDA7CisJdW5zaWduZWQgbG9uZyBudW1fcnVuID0gMDsKKwl1bnNpZ25lZCBsb25nIGxpbWl0OworCisJYmRpID0gZGV2aWNlLT5iZGV2LT5iZF9pbm9kZS0+aV9tYXBwaW5nLT5iYWNraW5nX2Rldl9pbmZvOworCWZzX2luZm8gPSBkZXZpY2UtPmRldl9yb290LT5mc19pbmZvOworCWxpbWl0ID0gYnRyZnNfYXN5bmNfc3VibWl0X2xpbWl0KGZzX2luZm8pOworCWxpbWl0ID0gbGltaXQgKiAyIC8gMzsKKworbG9vcDoKKwlzcGluX2xvY2soJmRldmljZS0+aW9fbG9jayk7CisKKwkvKiB0YWtlIGFsbCB0aGUgYmlvcyBvZmYgdGhlIGxpc3QgYXQgb25jZSBhbmQgcHJvY2VzcyB0aGVtCisJICogbGF0ZXIgb24gKHdpdGhvdXQgdGhlIGxvY2sgaGVsZCkuICBCdXQsIHJlbWVtYmVyIHRoZQorCSAqIHRhaWwgYW5kIG90aGVyIHBvaW50ZXJzIHNvIHRoZSBiaW9zIGNhbiBiZSBwcm9wZXJseSByZWluc2VydGVkCisJICogaW50byB0aGUgbGlzdCBpZiB3ZSBoaXQgY29uZ2VzdGlvbgorCSAqLworCXBlbmRpbmcgPSBkZXZpY2UtPnBlbmRpbmdfYmlvczsKKwl0YWlsID0gZGV2aWNlLT5wZW5kaW5nX2Jpb190YWlsOworCVdBUk5fT04ocGVuZGluZyAmJiAhdGFpbCk7CisJZGV2aWNlLT5wZW5kaW5nX2Jpb3MgPSBOVUxMOworCWRldmljZS0+cGVuZGluZ19iaW9fdGFpbCA9IE5VTEw7CisKKwkvKgorCSAqIGlmIHBlbmRpbmcgd2FzIG51bGwgdGhpcyB0aW1lIGFyb3VuZCwgbm8gYmlvcyBuZWVkIHByb2Nlc3NpbmcKKwkgKiBhdCBhbGwgYW5kIHdlIGNhbiBzdG9wLiAgT3RoZXJ3aXNlIGl0J2xsIGxvb3AgYmFjayB1cCBhZ2FpbgorCSAqIGFuZCBkbyBhbiBhZGRpdGlvbmFsIGNoZWNrIHNvIG5vIGJpb3MgYXJlIG1pc3NlZC4KKwkgKgorCSAqIGRldmljZS0+cnVubmluZ19wZW5kaW5nIGlzIHVzZWQgdG8gc3luY2hyb25pemUgd2l0aCB0aGUKKwkgKiBzY2hlZHVsZV9iaW8gY29kZS4KKwkgKi8KKwlpZiAocGVuZGluZykgeworCQlhZ2FpbiA9IDE7CisJCWRldmljZS0+cnVubmluZ19wZW5kaW5nID0gMTsKKwl9IGVsc2UgeworCQlhZ2FpbiA9IDA7CisJCWRldmljZS0+cnVubmluZ19wZW5kaW5nID0gMDsKKwl9CisJc3Bpbl91bmxvY2soJmRldmljZS0+aW9fbG9jayk7CisKKwl3aGlsZSAocGVuZGluZykgeworCQljdXIgPSBwZW5kaW5nOworCQlwZW5kaW5nID0gcGVuZGluZy0+YmlfbmV4dDsKKwkJY3VyLT5iaV9uZXh0ID0gTlVMTDsKKwkJYXRvbWljX2RlYygmZnNfaW5mby0+bnJfYXN5bmNfYmlvcyk7CisKKwkJaWYgKGF0b21pY19yZWFkKCZmc19pbmZvLT5ucl9hc3luY19iaW9zKSA8IGxpbWl0ICYmCisJCSAgICB3YWl0cXVldWVfYWN0aXZlKCZmc19pbmZvLT5hc3luY19zdWJtaXRfd2FpdCkpCisJCQl3YWtlX3VwKCZmc19pbmZvLT5hc3luY19zdWJtaXRfd2FpdCk7CisKKwkJQlVHX09OKGF0b21pY19yZWFkKCZjdXItPmJpX2NudCkgPT0gMCk7CisJCWJpb19nZXQoY3VyKTsKKwkJc3VibWl0X2JpbyhjdXItPmJpX3J3LCBjdXIpOworCQliaW9fcHV0KGN1cik7CisJCW51bV9ydW4rKzsKKworCQkvKgorCQkgKiB3ZSBtYWRlIHByb2dyZXNzLCB0aGVyZSBpcyBtb3JlIHdvcmsgdG8gZG8gYW5kIHRoZSBiZGkKKwkJICogaXMgbm93IGNvbmdlc3RlZC4gIEJhY2sgb2ZmIGFuZCBsZXQgb3RoZXIgd29yayBzdHJ1Y3RzCisJCSAqIHJ1biBpbnN0ZWFkCisJCSAqLworCQlpZiAocGVuZGluZyAmJiBiZGlfd3JpdGVfY29uZ2VzdGVkKGJkaSkgJiYKKwkJICAgIGZzX2luZm8tPmZzX2RldmljZXMtPm9wZW5fZGV2aWNlcyA+IDEpIHsKKwkJCXN0cnVjdCBiaW8gKm9sZF9oZWFkOworCisJCQlzcGluX2xvY2soJmRldmljZS0+aW9fbG9jayk7CisKKwkJCW9sZF9oZWFkID0gZGV2aWNlLT5wZW5kaW5nX2Jpb3M7CisJCQlkZXZpY2UtPnBlbmRpbmdfYmlvcyA9IHBlbmRpbmc7CisJCQlpZiAoZGV2aWNlLT5wZW5kaW5nX2Jpb190YWlsKQorCQkJCXRhaWwtPmJpX25leHQgPSBvbGRfaGVhZDsKKwkJCWVsc2UKKwkJCQlkZXZpY2UtPnBlbmRpbmdfYmlvX3RhaWwgPSB0YWlsOworCQkJZGV2aWNlLT5ydW5uaW5nX3BlbmRpbmcgPSAwOworCisJCQlzcGluX3VubG9jaygmZGV2aWNlLT5pb19sb2NrKTsKKwkJCWJ0cmZzX3JlcXVldWVfd29yaygmZGV2aWNlLT53b3JrKTsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCX0KKwlpZiAoYWdhaW4pCisJCWdvdG8gbG9vcDsKK2RvbmU6CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHBlbmRpbmdfYmlvc19mbihzdHJ1Y3QgYnRyZnNfd29yayAqd29yaykKK3sKKwlzdHJ1Y3QgYnRyZnNfZGV2aWNlICpkZXZpY2U7CisKKwlkZXZpY2UgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGJ0cmZzX2RldmljZSwgd29yayk7CisJcnVuX3NjaGVkdWxlZF9iaW9zKGRldmljZSk7Cit9CisKK3N0YXRpYyBub2lubGluZSBpbnQgZGV2aWNlX2xpc3RfYWRkKGNvbnN0IGNoYXIgKnBhdGgsCisJCQkgICBzdHJ1Y3QgYnRyZnNfc3VwZXJfYmxvY2sgKmRpc2tfc3VwZXIsCisJCQkgICB1NjQgZGV2aWQsIHN0cnVjdCBidHJmc19mc19kZXZpY2VzICoqZnNfZGV2aWNlc19yZXQpCit7CisJc3RydWN0IGJ0cmZzX2RldmljZSAqZGV2aWNlOworCXN0cnVjdCBidHJmc19mc19kZXZpY2VzICpmc19kZXZpY2VzOworCXU2NCBmb3VuZF90cmFuc2lkID0gYnRyZnNfc3VwZXJfZ2VuZXJhdGlvbihkaXNrX3N1cGVyKTsKKworCWZzX2RldmljZXMgPSBmaW5kX2ZzaWQoZGlza19zdXBlci0+ZnNpZCk7CisJaWYgKCFmc19kZXZpY2VzKSB7CisJCWZzX2RldmljZXMgPSBremFsbG9jKHNpemVvZigqZnNfZGV2aWNlcyksIEdGUF9OT0ZTKTsKKwkJaWYgKCFmc19kZXZpY2VzKQorCQkJcmV0dXJuIC1FTk9NRU07CisJCUlOSVRfTElTVF9IRUFEKCZmc19kZXZpY2VzLT5kZXZpY2VzKTsKKwkJSU5JVF9MSVNUX0hFQUQoJmZzX2RldmljZXMtPmFsbG9jX2xpc3QpOworCQlsaXN0X2FkZCgmZnNfZGV2aWNlcy0+bGlzdCwgJmZzX3V1aWRzKTsKKwkJbWVtY3B5KGZzX2RldmljZXMtPmZzaWQsIGRpc2tfc3VwZXItPmZzaWQsIEJUUkZTX0ZTSURfU0laRSk7CisJCWZzX2RldmljZXMtPmxhdGVzdF9kZXZpZCA9IGRldmlkOworCQlmc19kZXZpY2VzLT5sYXRlc3RfdHJhbnMgPSBmb3VuZF90cmFuc2lkOworCQlkZXZpY2UgPSBOVUxMOworCX0gZWxzZSB7CisJCWRldmljZSA9IF9fZmluZF9kZXZpY2UoJmZzX2RldmljZXMtPmRldmljZXMsIGRldmlkLAorCQkJCSAgICAgICBkaXNrX3N1cGVyLT5kZXZfaXRlbS51dWlkKTsKKwl9CisJaWYgKCFkZXZpY2UpIHsKKwkJaWYgKGZzX2RldmljZXMtPm9wZW5lZCkKKwkJCXJldHVybiAtRUJVU1k7CisKKwkJZGV2aWNlID0ga3phbGxvYyhzaXplb2YoKmRldmljZSksIEdGUF9OT0ZTKTsKKwkJaWYgKCFkZXZpY2UpIHsKKwkJCS8qIHdlIGNhbiBzYWZlbHkgbGVhdmUgdGhlIGZzX2RldmljZXMgZW50cnkgYXJvdW5kICovCisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCQlkZXZpY2UtPmRldmlkID0gZGV2aWQ7CisJCWRldmljZS0+d29yay5mdW5jID0gcGVuZGluZ19iaW9zX2ZuOworCQltZW1jcHkoZGV2aWNlLT51dWlkLCBkaXNrX3N1cGVyLT5kZXZfaXRlbS51dWlkLAorCQkgICAgICAgQlRSRlNfVVVJRF9TSVpFKTsKKwkJZGV2aWNlLT5iYXJyaWVycyA9IDE7CisJCXNwaW5fbG9ja19pbml0KCZkZXZpY2UtPmlvX2xvY2spOworCQlkZXZpY2UtPm5hbWUgPSBrc3RyZHVwKHBhdGgsIEdGUF9OT0ZTKTsKKwkJaWYgKCFkZXZpY2UtPm5hbWUpIHsKKwkJCWtmcmVlKGRldmljZSk7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCQlJTklUX0xJU1RfSEVBRCgmZGV2aWNlLT5kZXZfYWxsb2NfbGlzdCk7CisJCWxpc3RfYWRkKCZkZXZpY2UtPmRldl9saXN0LCAmZnNfZGV2aWNlcy0+ZGV2aWNlcyk7CisJCWRldmljZS0+ZnNfZGV2aWNlcyA9IGZzX2RldmljZXM7CisJCWZzX2RldmljZXMtPm51bV9kZXZpY2VzKys7CisJfQorCisJaWYgKGZvdW5kX3RyYW5zaWQgPiBmc19kZXZpY2VzLT5sYXRlc3RfdHJhbnMpIHsKKwkJZnNfZGV2aWNlcy0+bGF0ZXN0X2RldmlkID0gZGV2aWQ7CisJCWZzX2RldmljZXMtPmxhdGVzdF90cmFucyA9IGZvdW5kX3RyYW5zaWQ7CisJfQorCSpmc19kZXZpY2VzX3JldCA9IGZzX2RldmljZXM7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYnRyZnNfZnNfZGV2aWNlcyAqY2xvbmVfZnNfZGV2aWNlcyhzdHJ1Y3QgYnRyZnNfZnNfZGV2aWNlcyAqb3JpZykKK3sKKwlzdHJ1Y3QgYnRyZnNfZnNfZGV2aWNlcyAqZnNfZGV2aWNlczsKKwlzdHJ1Y3QgYnRyZnNfZGV2aWNlICpkZXZpY2U7CisJc3RydWN0IGJ0cmZzX2RldmljZSAqb3JpZ19kZXY7CisKKwlmc19kZXZpY2VzID0ga3phbGxvYyhzaXplb2YoKmZzX2RldmljZXMpLCBHRlBfTk9GUyk7CisJaWYgKCFmc19kZXZpY2VzKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKworCUlOSVRfTElTVF9IRUFEKCZmc19kZXZpY2VzLT5kZXZpY2VzKTsKKwlJTklUX0xJU1RfSEVBRCgmZnNfZGV2aWNlcy0+YWxsb2NfbGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJmZzX2RldmljZXMtPmxpc3QpOworCWZzX2RldmljZXMtPmxhdGVzdF9kZXZpZCA9IG9yaWctPmxhdGVzdF9kZXZpZDsKKwlmc19kZXZpY2VzLT5sYXRlc3RfdHJhbnMgPSBvcmlnLT5sYXRlc3RfdHJhbnM7CisJbWVtY3B5KGZzX2RldmljZXMtPmZzaWQsIG9yaWctPmZzaWQsIHNpemVvZihmc19kZXZpY2VzLT5mc2lkKSk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KG9yaWdfZGV2LCAmb3JpZy0+ZGV2aWNlcywgZGV2X2xpc3QpIHsKKwkJZGV2aWNlID0ga3phbGxvYyhzaXplb2YoKmRldmljZSksIEdGUF9OT0ZTKTsKKwkJaWYgKCFkZXZpY2UpCisJCQlnb3RvIGVycm9yOworCisJCWRldmljZS0+bmFtZSA9IGtzdHJkdXAob3JpZ19kZXYtPm5hbWUsIEdGUF9OT0ZTKTsKKwkJaWYgKCFkZXZpY2UtPm5hbWUpCisJCQlnb3RvIGVycm9yOworCisJCWRldmljZS0+ZGV2aWQgPSBvcmlnX2Rldi0+ZGV2aWQ7CisJCWRldmljZS0+d29yay5mdW5jID0gcGVuZGluZ19iaW9zX2ZuOworCQltZW1jcHkoZGV2aWNlLT51dWlkLCBvcmlnX2Rldi0+dXVpZCwgc2l6ZW9mKGRldmljZS0+dXVpZCkpOworCQlkZXZpY2UtPmJhcnJpZXJzID0gMTsKKwkJc3Bpbl9sb2NrX2luaXQoJmRldmljZS0+aW9fbG9jayk7CisJCUlOSVRfTElTVF9IRUFEKCZkZXZpY2UtPmRldl9saXN0KTsKKwkJSU5JVF9MSVNUX0hFQUQoJmRldmljZS0+ZGV2X2FsbG9jX2xpc3QpOworCisJCWxpc3RfYWRkKCZkZXZpY2UtPmRldl9saXN0LCAmZnNfZGV2aWNlcy0+ZGV2aWNlcyk7CisJCWRldmljZS0+ZnNfZGV2aWNlcyA9IGZzX2RldmljZXM7CisJCWZzX2RldmljZXMtPm51bV9kZXZpY2VzKys7CisJfQorCXJldHVybiBmc19kZXZpY2VzOworZXJyb3I6CisJZnJlZV9mc19kZXZpY2VzKGZzX2RldmljZXMpOworCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworfQorCitpbnQgYnRyZnNfY2xvc2VfZXh0cmFfZGV2aWNlcyhzdHJ1Y3QgYnRyZnNfZnNfZGV2aWNlcyAqZnNfZGV2aWNlcykKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICp0bXA7CisJc3RydWN0IGxpc3RfaGVhZCAqY3VyOworCXN0cnVjdCBidHJmc19kZXZpY2UgKmRldmljZTsKKworCW11dGV4X2xvY2soJnV1aWRfbXV0ZXgpOworYWdhaW46CisJbGlzdF9mb3JfZWFjaF9zYWZlKGN1ciwgdG1wLCAmZnNfZGV2aWNlcy0+ZGV2aWNlcykgeworCQlkZXZpY2UgPSBsaXN0X2VudHJ5KGN1ciwgc3RydWN0IGJ0cmZzX2RldmljZSwgZGV2X2xpc3QpOworCQlpZiAoZGV2aWNlLT5pbl9mc19tZXRhZGF0YSkKKwkJCWNvbnRpbnVlOworCisJCWlmIChkZXZpY2UtPmJkZXYpIHsKKwkJCWNsb3NlX2JkZXZfZXhjbHVzaXZlKGRldmljZS0+YmRldiwgZGV2aWNlLT5tb2RlKTsKKwkJCWRldmljZS0+YmRldiA9IE5VTEw7CisJCQlmc19kZXZpY2VzLT5vcGVuX2RldmljZXMtLTsKKwkJfQorCQlpZiAoZGV2aWNlLT53cml0ZWFibGUpIHsKKwkJCWxpc3RfZGVsX2luaXQoJmRldmljZS0+ZGV2X2FsbG9jX2xpc3QpOworCQkJZGV2aWNlLT53cml0ZWFibGUgPSAwOworCQkJZnNfZGV2aWNlcy0+cndfZGV2aWNlcy0tOworCQl9CisJCWxpc3RfZGVsX2luaXQoJmRldmljZS0+ZGV2X2xpc3QpOworCQlmc19kZXZpY2VzLT5udW1fZGV2aWNlcy0tOworCQlrZnJlZShkZXZpY2UtPm5hbWUpOworCQlrZnJlZShkZXZpY2UpOworCX0KKworCWlmIChmc19kZXZpY2VzLT5zZWVkKSB7CisJCWZzX2RldmljZXMgPSBmc19kZXZpY2VzLT5zZWVkOworCQlnb3RvIGFnYWluOworCX0KKworCW11dGV4X3VubG9jaygmdXVpZF9tdXRleCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19idHJmc19jbG9zZV9kZXZpY2VzKHN0cnVjdCBidHJmc19mc19kZXZpY2VzICpmc19kZXZpY2VzKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKmN1cjsKKwlzdHJ1Y3QgYnRyZnNfZGV2aWNlICpkZXZpY2U7CisKKwlpZiAoLS1mc19kZXZpY2VzLT5vcGVuZWQgPiAwKQorCQlyZXR1cm4gMDsKKworCWxpc3RfZm9yX2VhY2goY3VyLCAmZnNfZGV2aWNlcy0+ZGV2aWNlcykgeworCQlkZXZpY2UgPSBsaXN0X2VudHJ5KGN1ciwgc3RydWN0IGJ0cmZzX2RldmljZSwgZGV2X2xpc3QpOworCQlpZiAoZGV2aWNlLT5iZGV2KSB7CisJCQljbG9zZV9iZGV2X2V4Y2x1c2l2ZShkZXZpY2UtPmJkZXYsIGRldmljZS0+bW9kZSk7CisJCQlmc19kZXZpY2VzLT5vcGVuX2RldmljZXMtLTsKKwkJfQorCQlpZiAoZGV2aWNlLT53cml0ZWFibGUpIHsKKwkJCWxpc3RfZGVsX2luaXQoJmRldmljZS0+ZGV2X2FsbG9jX2xpc3QpOworCQkJZnNfZGV2aWNlcy0+cndfZGV2aWNlcy0tOworCQl9CisKKwkJZGV2aWNlLT5iZGV2ID0gTlVMTDsKKwkJZGV2aWNlLT53cml0ZWFibGUgPSAwOworCQlkZXZpY2UtPmluX2ZzX21ldGFkYXRhID0gMDsKKwl9CisJV0FSTl9PTihmc19kZXZpY2VzLT5vcGVuX2RldmljZXMpOworCVdBUk5fT04oZnNfZGV2aWNlcy0+cndfZGV2aWNlcyk7CisJZnNfZGV2aWNlcy0+b3BlbmVkID0gMDsKKwlmc19kZXZpY2VzLT5zZWVkaW5nID0gMDsKKworCXJldHVybiAwOworfQorCitpbnQgYnRyZnNfY2xvc2VfZGV2aWNlcyhzdHJ1Y3QgYnRyZnNfZnNfZGV2aWNlcyAqZnNfZGV2aWNlcykKK3sKKwlzdHJ1Y3QgYnRyZnNfZnNfZGV2aWNlcyAqc2VlZF9kZXZpY2VzID0gTlVMTDsKKwlpbnQgcmV0OworCisJbXV0ZXhfbG9jaygmdXVpZF9tdXRleCk7CisJcmV0ID0gX19idHJmc19jbG9zZV9kZXZpY2VzKGZzX2RldmljZXMpOworCWlmICghZnNfZGV2aWNlcy0+b3BlbmVkKSB7CisJCXNlZWRfZGV2aWNlcyA9IGZzX2RldmljZXMtPnNlZWQ7CisJCWZzX2RldmljZXMtPnNlZWQgPSBOVUxMOworCX0KKwltdXRleF91bmxvY2soJnV1aWRfbXV0ZXgpOworCisJd2hpbGUgKHNlZWRfZGV2aWNlcykgeworCQlmc19kZXZpY2VzID0gc2VlZF9kZXZpY2VzOworCQlzZWVkX2RldmljZXMgPSBmc19kZXZpY2VzLT5zZWVkOworCQlfX2J0cmZzX2Nsb3NlX2RldmljZXMoZnNfZGV2aWNlcyk7CisJCWZyZWVfZnNfZGV2aWNlcyhmc19kZXZpY2VzKTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfX2J0cmZzX29wZW5fZGV2aWNlcyhzdHJ1Y3QgYnRyZnNfZnNfZGV2aWNlcyAqZnNfZGV2aWNlcywKKwkJCQlmbW9kZV90IGZsYWdzLCB2b2lkICpob2xkZXIpCit7CisJc3RydWN0IGJsb2NrX2RldmljZSAqYmRldjsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkID0gJmZzX2RldmljZXMtPmRldmljZXM7CisJc3RydWN0IGxpc3RfaGVhZCAqY3VyOworCXN0cnVjdCBidHJmc19kZXZpY2UgKmRldmljZTsKKwlzdHJ1Y3QgYmxvY2tfZGV2aWNlICpsYXRlc3RfYmRldiA9IE5VTEw7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKwlzdHJ1Y3QgYnRyZnNfc3VwZXJfYmxvY2sgKmRpc2tfc3VwZXI7CisJdTY0IGxhdGVzdF9kZXZpZCA9IDA7CisJdTY0IGxhdGVzdF90cmFuc2lkID0gMDsKKwl1NjQgZGV2aWQ7CisJaW50IHNlZWRpbmcgPSAxOworCWludCByZXQgPSAwOworCisJbGlzdF9mb3JfZWFjaChjdXIsIGhlYWQpIHsKKwkJZGV2aWNlID0gbGlzdF9lbnRyeShjdXIsIHN0cnVjdCBidHJmc19kZXZpY2UsIGRldl9saXN0KTsKKwkJaWYgKGRldmljZS0+YmRldikKKwkJCWNvbnRpbnVlOworCQlpZiAoIWRldmljZS0+bmFtZSkKKwkJCWNvbnRpbnVlOworCisJCWJkZXYgPSBvcGVuX2JkZXZfZXhjbHVzaXZlKGRldmljZS0+bmFtZSwgZmxhZ3MsIGhvbGRlcik7CisJCWlmIChJU19FUlIoYmRldikpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIm9wZW4gJXMgZmFpbGVkXG4iLCBkZXZpY2UtPm5hbWUpOworCQkJZ290byBlcnJvcjsKKwkJfQorCQlzZXRfYmxvY2tzaXplKGJkZXYsIDQwOTYpOworCisJCWJoID0gYnRyZnNfcmVhZF9kZXZfc3VwZXIoYmRldik7CisJCWlmICghYmgpCisJCQlnb3RvIGVycm9yX2Nsb3NlOworCisJCWRpc2tfc3VwZXIgPSAoc3RydWN0IGJ0cmZzX3N1cGVyX2Jsb2NrICopYmgtPmJfZGF0YTsKKwkJZGV2aWQgPSBsZTY0X3RvX2NwdShkaXNrX3N1cGVyLT5kZXZfaXRlbS5kZXZpZCk7CisJCWlmIChkZXZpZCAhPSBkZXZpY2UtPmRldmlkKQorCQkJZ290byBlcnJvcl9icmVsc2U7CisKKwkJaWYgKG1lbWNtcChkZXZpY2UtPnV1aWQsIGRpc2tfc3VwZXItPmRldl9pdGVtLnV1aWQsCisJCQkgICBCVFJGU19VVUlEX1NJWkUpKQorCQkJZ290byBlcnJvcl9icmVsc2U7CisKKwkJZGV2aWNlLT5nZW5lcmF0aW9uID0gYnRyZnNfc3VwZXJfZ2VuZXJhdGlvbihkaXNrX3N1cGVyKTsKKwkJaWYgKCFsYXRlc3RfdHJhbnNpZCB8fCBkZXZpY2UtPmdlbmVyYXRpb24gPiBsYXRlc3RfdHJhbnNpZCkgeworCQkJbGF0ZXN0X2RldmlkID0gZGV2aWQ7CisJCQlsYXRlc3RfdHJhbnNpZCA9IGRldmljZS0+Z2VuZXJhdGlvbjsKKwkJCWxhdGVzdF9iZGV2ID0gYmRldjsKKwkJfQorCisJCWlmIChidHJmc19zdXBlcl9mbGFncyhkaXNrX3N1cGVyKSAmIEJUUkZTX1NVUEVSX0ZMQUdfU0VFRElORykgeworCQkJZGV2aWNlLT53cml0ZWFibGUgPSAwOworCQl9IGVsc2UgeworCQkJZGV2aWNlLT53cml0ZWFibGUgPSAhYmRldl9yZWFkX29ubHkoYmRldik7CisJCQlzZWVkaW5nID0gMDsKKwkJfQorCisJCWRldmljZS0+YmRldiA9IGJkZXY7CisJCWRldmljZS0+aW5fZnNfbWV0YWRhdGEgPSAwOworCQlkZXZpY2UtPm1vZGUgPSBmbGFnczsKKworCQlmc19kZXZpY2VzLT5vcGVuX2RldmljZXMrKzsKKwkJaWYgKGRldmljZS0+d3JpdGVhYmxlKSB7CisJCQlmc19kZXZpY2VzLT5yd19kZXZpY2VzKys7CisJCQlsaXN0X2FkZCgmZGV2aWNlLT5kZXZfYWxsb2NfbGlzdCwKKwkJCQkgJmZzX2RldmljZXMtPmFsbG9jX2xpc3QpOworCQl9CisJCWNvbnRpbnVlOworCitlcnJvcl9icmVsc2U6CisJCWJyZWxzZShiaCk7CitlcnJvcl9jbG9zZToKKwkJY2xvc2VfYmRldl9leGNsdXNpdmUoYmRldiwgRk1PREVfUkVBRCk7CitlcnJvcjoKKwkJY29udGludWU7CisJfQorCWlmIChmc19kZXZpY2VzLT5vcGVuX2RldmljZXMgPT0gMCkgeworCQlyZXQgPSAtRUlPOworCQlnb3RvIG91dDsKKwl9CisJZnNfZGV2aWNlcy0+c2VlZGluZyA9IHNlZWRpbmc7CisJZnNfZGV2aWNlcy0+b3BlbmVkID0gMTsKKwlmc19kZXZpY2VzLT5sYXRlc3RfYmRldiA9IGxhdGVzdF9iZGV2OworCWZzX2RldmljZXMtPmxhdGVzdF9kZXZpZCA9IGxhdGVzdF9kZXZpZDsKKwlmc19kZXZpY2VzLT5sYXRlc3RfdHJhbnMgPSBsYXRlc3RfdHJhbnNpZDsKKwlmc19kZXZpY2VzLT50b3RhbF9yd19ieXRlcyA9IDA7CitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworaW50IGJ0cmZzX29wZW5fZGV2aWNlcyhzdHJ1Y3QgYnRyZnNfZnNfZGV2aWNlcyAqZnNfZGV2aWNlcywKKwkJICAgICAgIGZtb2RlX3QgZmxhZ3MsIHZvaWQgKmhvbGRlcikKK3sKKwlpbnQgcmV0OworCisJbXV0ZXhfbG9jaygmdXVpZF9tdXRleCk7CisJaWYgKGZzX2RldmljZXMtPm9wZW5lZCkgeworCQlmc19kZXZpY2VzLT5vcGVuZWQrKzsKKwkJcmV0ID0gMDsKKwl9IGVsc2UgeworCQlyZXQgPSBfX2J0cmZzX29wZW5fZGV2aWNlcyhmc19kZXZpY2VzLCBmbGFncywgaG9sZGVyKTsKKwl9CisJbXV0ZXhfdW5sb2NrKCZ1dWlkX211dGV4KTsKKwlyZXR1cm4gcmV0OworfQorCitpbnQgYnRyZnNfc2Nhbl9vbmVfZGV2aWNlKGNvbnN0IGNoYXIgKnBhdGgsIGZtb2RlX3QgZmxhZ3MsIHZvaWQgKmhvbGRlciwKKwkJCSAgc3RydWN0IGJ0cmZzX2ZzX2RldmljZXMgKipmc19kZXZpY2VzX3JldCkKK3sKKwlzdHJ1Y3QgYnRyZnNfc3VwZXJfYmxvY2sgKmRpc2tfc3VwZXI7CisJc3RydWN0IGJsb2NrX2RldmljZSAqYmRldjsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCWludCByZXQ7CisJdTY0IGRldmlkOworCXU2NCB0cmFuc2lkOworCisJbXV0ZXhfbG9jaygmdXVpZF9tdXRleCk7CisKKwliZGV2ID0gb3Blbl9iZGV2X2V4Y2x1c2l2ZShwYXRoLCBmbGFncywgaG9sZGVyKTsKKworCWlmIChJU19FUlIoYmRldikpIHsKKwkJcmV0ID0gUFRSX0VSUihiZGV2KTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlyZXQgPSBzZXRfYmxvY2tzaXplKGJkZXYsIDQwOTYpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfY2xvc2U7CisJYmggPSBidHJmc19yZWFkX2Rldl9zdXBlcihiZGV2KTsKKwlpZiAoIWJoKSB7CisJCXJldCA9IC1FSU87CisJCWdvdG8gZXJyb3JfY2xvc2U7CisJfQorCWRpc2tfc3VwZXIgPSAoc3RydWN0IGJ0cmZzX3N1cGVyX2Jsb2NrICopYmgtPmJfZGF0YTsKKwlkZXZpZCA9IGxlNjRfdG9fY3B1KGRpc2tfc3VwZXItPmRldl9pdGVtLmRldmlkKTsKKwl0cmFuc2lkID0gYnRyZnNfc3VwZXJfZ2VuZXJhdGlvbihkaXNrX3N1cGVyKTsKKwlpZiAoZGlza19zdXBlci0+bGFiZWxbMF0pCisJCXByaW50ayhLRVJOX0lORk8gImRldmljZSBsYWJlbCAlcyAiLCBkaXNrX3N1cGVyLT5sYWJlbCk7CisJZWxzZSB7CisJCS8qIEZJWE1FLCBtYWtlIGEgcmVhZGwgdXVpZCBwYXJzZXIgKi8KKwkJcHJpbnRrKEtFUk5fSU5GTyAiZGV2aWNlIGZzaWQgJWxseC0lbGx4ICIsCisJCSAgICAgICAqKHVuc2lnbmVkIGxvbmcgbG9uZyAqKWRpc2tfc3VwZXItPmZzaWQsCisJCSAgICAgICAqKHVuc2lnbmVkIGxvbmcgbG9uZyAqKShkaXNrX3N1cGVyLT5mc2lkICsgOCkpOworCX0KKwlwcmludGsoS0VSTl9JTkZPICJkZXZpZCAlbGx1IHRyYW5zaWQgJWxsdSAlc1xuIiwKKwkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylkZXZpZCwgKHVuc2lnbmVkIGxvbmcgbG9uZyl0cmFuc2lkLCBwYXRoKTsKKwlyZXQgPSBkZXZpY2VfbGlzdF9hZGQocGF0aCwgZGlza19zdXBlciwgZGV2aWQsIGZzX2RldmljZXNfcmV0KTsKKworCWJyZWxzZShiaCk7CitlcnJvcl9jbG9zZToKKwljbG9zZV9iZGV2X2V4Y2x1c2l2ZShiZGV2LCBmbGFncyk7CitlcnJvcjoKKwltdXRleF91bmxvY2soJnV1aWRfbXV0ZXgpOworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiB0aGlzIHVzZXMgYSBwcmV0dHkgc2ltcGxlIHNlYXJjaCwgdGhlIGV4cGVjdGF0aW9uIGlzIHRoYXQgaXQgaXMKKyAqIGNhbGxlZCB2ZXJ5IGluZnJlcXVlbnRseSBhbmQgdGhhdCBhIGdpdmVuIGRldmljZSBoYXMgYSBzbWFsbCBudW1iZXIKKyAqIG9mIGV4dGVudHMKKyAqLworc3RhdGljIG5vaW5saW5lIGludCBmaW5kX2ZyZWVfZGV2X2V4dGVudChzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKKwkJCQkJIHN0cnVjdCBidHJmc19kZXZpY2UgKmRldmljZSwKKwkJCQkJIHU2NCBudW1fYnl0ZXMsIHU2NCAqc3RhcnQpCit7CisJc3RydWN0IGJ0cmZzX2tleSBrZXk7CisJc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QgPSBkZXZpY2UtPmRldl9yb290OworCXN0cnVjdCBidHJmc19kZXZfZXh0ZW50ICpkZXZfZXh0ZW50ID0gTlVMTDsKKwlzdHJ1Y3QgYnRyZnNfcGF0aCAqcGF0aDsKKwl1NjQgaG9sZV9zaXplID0gMDsKKwl1NjQgbGFzdF9ieXRlID0gMDsKKwl1NjQgc2VhcmNoX3N0YXJ0ID0gMDsKKwl1NjQgc2VhcmNoX2VuZCA9IGRldmljZS0+dG90YWxfYnl0ZXM7CisJaW50IHJldDsKKwlpbnQgc2xvdCA9IDA7CisJaW50IHN0YXJ0X2ZvdW5kOworCXN0cnVjdCBleHRlbnRfYnVmZmVyICpsOworCisJcGF0aCA9IGJ0cmZzX2FsbG9jX3BhdGgoKTsKKwlpZiAoIXBhdGgpCisJCXJldHVybiAtRU5PTUVNOworCXBhdGgtPnJlYWRhID0gMjsKKwlzdGFydF9mb3VuZCA9IDA7CisKKwkvKiBGSVhNRSB1c2UgbGFzdCBmcmVlIG9mIHNvbWUga2luZCAqLworCisJLyogd2UgZG9uJ3Qgd2FudCB0byBvdmVyd3JpdGUgdGhlIHN1cGVyYmxvY2sgb24gdGhlIGRyaXZlLAorCSAqIHNvIHdlIG1ha2Ugc3VyZSB0byBzdGFydCBhdCBhbiBvZmZzZXQgb2YgYXQgbGVhc3QgMU1CCisJICovCisJc2VhcmNoX3N0YXJ0ID0gbWF4KCh1NjQpMTAyNCAqIDEwMjQsIHNlYXJjaF9zdGFydCk7CisKKwlpZiAocm9vdC0+ZnNfaW5mby0+YWxsb2Nfc3RhcnQgKyBudW1fYnl0ZXMgPD0gZGV2aWNlLT50b3RhbF9ieXRlcykKKwkJc2VhcmNoX3N0YXJ0ID0gbWF4KHJvb3QtPmZzX2luZm8tPmFsbG9jX3N0YXJ0LCBzZWFyY2hfc3RhcnQpOworCisJa2V5Lm9iamVjdGlkID0gZGV2aWNlLT5kZXZpZDsKKwlrZXkub2Zmc2V0ID0gc2VhcmNoX3N0YXJ0OworCWtleS50eXBlID0gQlRSRlNfREVWX0VYVEVOVF9LRVk7CisJcmV0ID0gYnRyZnNfc2VhcmNoX3Nsb3QodHJhbnMsIHJvb3QsICZrZXksIHBhdGgsIDAsIDApOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycm9yOworCXJldCA9IGJ0cmZzX3ByZXZpb3VzX2l0ZW0ocm9vdCwgcGF0aCwgMCwga2V5LnR5cGUpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycm9yOworCWwgPSBwYXRoLT5ub2Rlc1swXTsKKwlidHJmc19pdGVtX2tleV90b19jcHUobCwgJmtleSwgcGF0aC0+c2xvdHNbMF0pOworCXdoaWxlICgxKSB7CisJCWwgPSBwYXRoLT5ub2Rlc1swXTsKKwkJc2xvdCA9IHBhdGgtPnNsb3RzWzBdOworCQlpZiAoc2xvdCA+PSBidHJmc19oZWFkZXJfbnJpdGVtcyhsKSkgeworCQkJcmV0ID0gYnRyZnNfbmV4dF9sZWFmKHJvb3QsIHBhdGgpOworCQkJaWYgKHJldCA9PSAwKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKHJldCA8IDApCisJCQkJZ290byBlcnJvcjsKK25vX21vcmVfaXRlbXM6CisJCQlpZiAoIXN0YXJ0X2ZvdW5kKSB7CisJCQkJaWYgKHNlYXJjaF9zdGFydCA+PSBzZWFyY2hfZW5kKSB7CisJCQkJCXJldCA9IC1FTk9TUEM7CisJCQkJCWdvdG8gZXJyb3I7CisJCQkJfQorCQkJCSpzdGFydCA9IHNlYXJjaF9zdGFydDsKKwkJCQlzdGFydF9mb3VuZCA9IDE7CisJCQkJZ290byBjaGVja19wZW5kaW5nOworCQkJfQorCQkJKnN0YXJ0ID0gbGFzdF9ieXRlID4gc2VhcmNoX3N0YXJ0ID8KKwkJCQlsYXN0X2J5dGUgOiBzZWFyY2hfc3RhcnQ7CisJCQlpZiAoc2VhcmNoX2VuZCA8PSAqc3RhcnQpIHsKKwkJCQlyZXQgPSAtRU5PU1BDOworCQkJCWdvdG8gZXJyb3I7CisJCQl9CisJCQlnb3RvIGNoZWNrX3BlbmRpbmc7CisJCX0KKwkJYnRyZnNfaXRlbV9rZXlfdG9fY3B1KGwsICZrZXksIHNsb3QpOworCisJCWlmIChrZXkub2JqZWN0aWQgPCBkZXZpY2UtPmRldmlkKQorCQkJZ290byBuZXh0OworCisJCWlmIChrZXkub2JqZWN0aWQgPiBkZXZpY2UtPmRldmlkKQorCQkJZ290byBub19tb3JlX2l0ZW1zOworCisJCWlmIChrZXkub2Zmc2V0ID49IHNlYXJjaF9zdGFydCAmJiBrZXkub2Zmc2V0ID4gbGFzdF9ieXRlICYmCisJCSAgICBzdGFydF9mb3VuZCkgeworCQkJaWYgKGxhc3RfYnl0ZSA8IHNlYXJjaF9zdGFydCkKKwkJCQlsYXN0X2J5dGUgPSBzZWFyY2hfc3RhcnQ7CisJCQlob2xlX3NpemUgPSBrZXkub2Zmc2V0IC0gbGFzdF9ieXRlOworCQkJaWYgKGtleS5vZmZzZXQgPiBsYXN0X2J5dGUgJiYKKwkJCSAgICBob2xlX3NpemUgPj0gbnVtX2J5dGVzKSB7CisJCQkJKnN0YXJ0ID0gbGFzdF9ieXRlOworCQkJCWdvdG8gY2hlY2tfcGVuZGluZzsKKwkJCX0KKwkJfQorCQlpZiAoYnRyZnNfa2V5X3R5cGUoJmtleSkgIT0gQlRSRlNfREVWX0VYVEVOVF9LRVkpCisJCQlnb3RvIG5leHQ7CisKKwkJc3RhcnRfZm91bmQgPSAxOworCQlkZXZfZXh0ZW50ID0gYnRyZnNfaXRlbV9wdHIobCwgc2xvdCwgc3RydWN0IGJ0cmZzX2Rldl9leHRlbnQpOworCQlsYXN0X2J5dGUgPSBrZXkub2Zmc2V0ICsgYnRyZnNfZGV2X2V4dGVudF9sZW5ndGgobCwgZGV2X2V4dGVudCk7CituZXh0OgorCQlwYXRoLT5zbG90c1swXSsrOworCQljb25kX3Jlc2NoZWQoKTsKKwl9CitjaGVja19wZW5kaW5nOgorCS8qIHdlIGhhdmUgdG8gbWFrZSBzdXJlIHdlIGRpZG4ndCBmaW5kIGFuIGV4dGVudCB0aGF0IGhhcyBhbHJlYWR5CisJICogYmVlbiBhbGxvY2F0ZWQgYnkgdGhlIG1hcCB0cmVlIG9yIHRoZSBvcmlnaW5hbCBhbGxvY2F0aW9uCisJICovCisJQlVHX09OKCpzdGFydCA8IHNlYXJjaF9zdGFydCk7CisKKwlpZiAoKnN0YXJ0ICsgbnVtX2J5dGVzID4gc2VhcmNoX2VuZCkgeworCQlyZXQgPSAtRU5PU1BDOworCQlnb3RvIGVycm9yOworCX0KKwkvKiBjaGVjayBmb3IgcGVuZGluZyBpbnNlcnRzIGhlcmUgKi8KKwlyZXQgPSAwOworCitlcnJvcjoKKwlidHJmc19mcmVlX3BhdGgocGF0aCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBidHJmc19mcmVlX2Rldl9leHRlbnQoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCisJCQkgIHN0cnVjdCBidHJmc19kZXZpY2UgKmRldmljZSwKKwkJCSAgdTY0IHN0YXJ0KQoreworCWludCByZXQ7CisJc3RydWN0IGJ0cmZzX3BhdGggKnBhdGg7CisJc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QgPSBkZXZpY2UtPmRldl9yb290OworCXN0cnVjdCBidHJmc19rZXkga2V5OworCXN0cnVjdCBidHJmc19rZXkgZm91bmRfa2V5OworCXN0cnVjdCBleHRlbnRfYnVmZmVyICpsZWFmID0gTlVMTDsKKwlzdHJ1Y3QgYnRyZnNfZGV2X2V4dGVudCAqZXh0ZW50ID0gTlVMTDsKKworCXBhdGggPSBidHJmc19hbGxvY19wYXRoKCk7CisJaWYgKCFwYXRoKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWtleS5vYmplY3RpZCA9IGRldmljZS0+ZGV2aWQ7CisJa2V5Lm9mZnNldCA9IHN0YXJ0OworCWtleS50eXBlID0gQlRSRlNfREVWX0VYVEVOVF9LRVk7CisKKwlyZXQgPSBidHJmc19zZWFyY2hfc2xvdCh0cmFucywgcm9vdCwgJmtleSwgcGF0aCwgLTEsIDEpOworCWlmIChyZXQgPiAwKSB7CisJCXJldCA9IGJ0cmZzX3ByZXZpb3VzX2l0ZW0ocm9vdCwgcGF0aCwga2V5Lm9iamVjdGlkLAorCQkJCQkgIEJUUkZTX0RFVl9FWFRFTlRfS0VZKTsKKwkJQlVHX09OKHJldCk7CisJCWxlYWYgPSBwYXRoLT5ub2Rlc1swXTsKKwkJYnRyZnNfaXRlbV9rZXlfdG9fY3B1KGxlYWYsICZmb3VuZF9rZXksIHBhdGgtPnNsb3RzWzBdKTsKKwkJZXh0ZW50ID0gYnRyZnNfaXRlbV9wdHIobGVhZiwgcGF0aC0+c2xvdHNbMF0sCisJCQkJCXN0cnVjdCBidHJmc19kZXZfZXh0ZW50KTsKKwkJQlVHX09OKGZvdW5kX2tleS5vZmZzZXQgPiBzdGFydCB8fCBmb3VuZF9rZXkub2Zmc2V0ICsKKwkJICAgICAgIGJ0cmZzX2Rldl9leHRlbnRfbGVuZ3RoKGxlYWYsIGV4dGVudCkgPCBzdGFydCk7CisJCXJldCA9IDA7CisJfSBlbHNlIGlmIChyZXQgPT0gMCkgeworCQlsZWFmID0gcGF0aC0+bm9kZXNbMF07CisJCWV4dGVudCA9IGJ0cmZzX2l0ZW1fcHRyKGxlYWYsIHBhdGgtPnNsb3RzWzBdLAorCQkJCQlzdHJ1Y3QgYnRyZnNfZGV2X2V4dGVudCk7CisJfQorCUJVR19PTihyZXQpOworCisJaWYgKGRldmljZS0+Ynl0ZXNfdXNlZCA+IDApCisJCWRldmljZS0+Ynl0ZXNfdXNlZCAtPSBidHJmc19kZXZfZXh0ZW50X2xlbmd0aChsZWFmLCBleHRlbnQpOworCXJldCA9IGJ0cmZzX2RlbF9pdGVtKHRyYW5zLCByb290LCBwYXRoKTsKKwlCVUdfT04ocmV0KTsKKworCWJ0cmZzX2ZyZWVfcGF0aChwYXRoKTsKKwlyZXR1cm4gcmV0OworfQorCitpbnQgYnRyZnNfYWxsb2NfZGV2X2V4dGVudChzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKKwkJCSAgIHN0cnVjdCBidHJmc19kZXZpY2UgKmRldmljZSwKKwkJCSAgIHU2NCBjaHVua190cmVlLCB1NjQgY2h1bmtfb2JqZWN0aWQsCisJCQkgICB1NjQgY2h1bmtfb2Zmc2V0LCB1NjQgc3RhcnQsIHU2NCBudW1fYnl0ZXMpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgYnRyZnNfcGF0aCAqcGF0aDsKKwlzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCA9IGRldmljZS0+ZGV2X3Jvb3Q7CisJc3RydWN0IGJ0cmZzX2Rldl9leHRlbnQgKmV4dGVudDsKKwlzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqbGVhZjsKKwlzdHJ1Y3QgYnRyZnNfa2V5IGtleTsKKworCVdBUk5fT04oIWRldmljZS0+aW5fZnNfbWV0YWRhdGEpOworCXBhdGggPSBidHJmc19hbGxvY19wYXRoKCk7CisJaWYgKCFwYXRoKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWtleS5vYmplY3RpZCA9IGRldmljZS0+ZGV2aWQ7CisJa2V5Lm9mZnNldCA9IHN0YXJ0OworCWtleS50eXBlID0gQlRSRlNfREVWX0VYVEVOVF9LRVk7CisJcmV0ID0gYnRyZnNfaW5zZXJ0X2VtcHR5X2l0ZW0odHJhbnMsIHJvb3QsIHBhdGgsICZrZXksCisJCQkJICAgICAgc2l6ZW9mKCpleHRlbnQpKTsKKwlCVUdfT04ocmV0KTsKKworCWxlYWYgPSBwYXRoLT5ub2Rlc1swXTsKKwlleHRlbnQgPSBidHJmc19pdGVtX3B0cihsZWFmLCBwYXRoLT5zbG90c1swXSwKKwkJCQlzdHJ1Y3QgYnRyZnNfZGV2X2V4dGVudCk7CisJYnRyZnNfc2V0X2Rldl9leHRlbnRfY2h1bmtfdHJlZShsZWFmLCBleHRlbnQsIGNodW5rX3RyZWUpOworCWJ0cmZzX3NldF9kZXZfZXh0ZW50X2NodW5rX29iamVjdGlkKGxlYWYsIGV4dGVudCwgY2h1bmtfb2JqZWN0aWQpOworCWJ0cmZzX3NldF9kZXZfZXh0ZW50X2NodW5rX29mZnNldChsZWFmLCBleHRlbnQsIGNodW5rX29mZnNldCk7CisKKwl3cml0ZV9leHRlbnRfYnVmZmVyKGxlYWYsIHJvb3QtPmZzX2luZm8tPmNodW5rX3RyZWVfdXVpZCwKKwkJICAgICh1bnNpZ25lZCBsb25nKWJ0cmZzX2Rldl9leHRlbnRfY2h1bmtfdHJlZV91dWlkKGV4dGVudCksCisJCSAgICBCVFJGU19VVUlEX1NJWkUpOworCisJYnRyZnNfc2V0X2Rldl9leHRlbnRfbGVuZ3RoKGxlYWYsIGV4dGVudCwgbnVtX2J5dGVzKTsKKwlidHJmc19tYXJrX2J1ZmZlcl9kaXJ0eShsZWFmKTsKKwlidHJmc19mcmVlX3BhdGgocGF0aCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIG5vaW5saW5lIGludCBmaW5kX25leHRfY2h1bmsoc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsCisJCQkJICAgIHU2NCBvYmplY3RpZCwgdTY0ICpvZmZzZXQpCit7CisJc3RydWN0IGJ0cmZzX3BhdGggKnBhdGg7CisJaW50IHJldDsKKwlzdHJ1Y3QgYnRyZnNfa2V5IGtleTsKKwlzdHJ1Y3QgYnRyZnNfY2h1bmsgKmNodW5rOworCXN0cnVjdCBidHJmc19rZXkgZm91bmRfa2V5OworCisJcGF0aCA9IGJ0cmZzX2FsbG9jX3BhdGgoKTsKKwlCVUdfT04oIXBhdGgpOworCisJa2V5Lm9iamVjdGlkID0gb2JqZWN0aWQ7CisJa2V5Lm9mZnNldCA9ICh1NjQpLTE7CisJa2V5LnR5cGUgPSBCVFJGU19DSFVOS19JVEVNX0tFWTsKKworCXJldCA9IGJ0cmZzX3NlYXJjaF9zbG90KE5VTEwsIHJvb3QsICZrZXksIHBhdGgsIDAsIDApOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycm9yOworCisJQlVHX09OKHJldCA9PSAwKTsKKworCXJldCA9IGJ0cmZzX3ByZXZpb3VzX2l0ZW0ocm9vdCwgcGF0aCwgMCwgQlRSRlNfQ0hVTktfSVRFTV9LRVkpOworCWlmIChyZXQpIHsKKwkJKm9mZnNldCA9IDA7CisJfSBlbHNlIHsKKwkJYnRyZnNfaXRlbV9rZXlfdG9fY3B1KHBhdGgtPm5vZGVzWzBdLCAmZm91bmRfa2V5LAorCQkJCSAgICAgIHBhdGgtPnNsb3RzWzBdKTsKKwkJaWYgKGZvdW5kX2tleS5vYmplY3RpZCAhPSBvYmplY3RpZCkKKwkJCSpvZmZzZXQgPSAwOworCQllbHNlIHsKKwkJCWNodW5rID0gYnRyZnNfaXRlbV9wdHIocGF0aC0+bm9kZXNbMF0sIHBhdGgtPnNsb3RzWzBdLAorCQkJCQkgICAgICAgc3RydWN0IGJ0cmZzX2NodW5rKTsKKwkJCSpvZmZzZXQgPSBmb3VuZF9rZXkub2Zmc2V0ICsKKwkJCQlidHJmc19jaHVua19sZW5ndGgocGF0aC0+bm9kZXNbMF0sIGNodW5rKTsKKwkJfQorCX0KKwlyZXQgPSAwOworZXJyb3I6CisJYnRyZnNfZnJlZV9wYXRoKHBhdGgpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBub2lubGluZSBpbnQgZmluZF9uZXh0X2RldmlkKHN0cnVjdCBidHJmc19yb290ICpyb290LCB1NjQgKm9iamVjdGlkKQoreworCWludCByZXQ7CisJc3RydWN0IGJ0cmZzX2tleSBrZXk7CisJc3RydWN0IGJ0cmZzX2tleSBmb3VuZF9rZXk7CisJc3RydWN0IGJ0cmZzX3BhdGggKnBhdGg7CisKKwlyb290ID0gcm9vdC0+ZnNfaW5mby0+Y2h1bmtfcm9vdDsKKworCXBhdGggPSBidHJmc19hbGxvY19wYXRoKCk7CisJaWYgKCFwYXRoKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWtleS5vYmplY3RpZCA9IEJUUkZTX0RFVl9JVEVNU19PQkpFQ1RJRDsKKwlrZXkudHlwZSA9IEJUUkZTX0RFVl9JVEVNX0tFWTsKKwlrZXkub2Zmc2V0ID0gKHU2NCktMTsKKworCXJldCA9IGJ0cmZzX3NlYXJjaF9zbG90KE5VTEwsIHJvb3QsICZrZXksIHBhdGgsIDAsIDApOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycm9yOworCisJQlVHX09OKHJldCA9PSAwKTsKKworCXJldCA9IGJ0cmZzX3ByZXZpb3VzX2l0ZW0ocm9vdCwgcGF0aCwgQlRSRlNfREVWX0lURU1TX09CSkVDVElELAorCQkJCSAgQlRSRlNfREVWX0lURU1fS0VZKTsKKwlpZiAocmV0KSB7CisJCSpvYmplY3RpZCA9IDE7CisJfSBlbHNlIHsKKwkJYnRyZnNfaXRlbV9rZXlfdG9fY3B1KHBhdGgtPm5vZGVzWzBdLCAmZm91bmRfa2V5LAorCQkJCSAgICAgIHBhdGgtPnNsb3RzWzBdKTsKKwkJKm9iamVjdGlkID0gZm91bmRfa2V5Lm9mZnNldCArIDE7CisJfQorCXJldCA9IDA7CitlcnJvcjoKKwlidHJmc19mcmVlX3BhdGgocGF0aCk7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIHRoZSBkZXZpY2UgaW5mb3JtYXRpb24gaXMgc3RvcmVkIGluIHRoZSBjaHVuayByb290CisgKiB0aGUgYnRyZnNfZGV2aWNlIHN0cnVjdCBzaG91bGQgYmUgZnVsbHkgZmlsbGVkIGluCisgKi8KK2ludCBidHJmc19hZGRfZGV2aWNlKHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAorCQkgICAgIHN0cnVjdCBidHJmc19yb290ICpyb290LAorCQkgICAgIHN0cnVjdCBidHJmc19kZXZpY2UgKmRldmljZSkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBidHJmc19wYXRoICpwYXRoOworCXN0cnVjdCBidHJmc19kZXZfaXRlbSAqZGV2X2l0ZW07CisJc3RydWN0IGV4dGVudF9idWZmZXIgKmxlYWY7CisJc3RydWN0IGJ0cmZzX2tleSBrZXk7CisJdW5zaWduZWQgbG9uZyBwdHI7CisKKwlyb290ID0gcm9vdC0+ZnNfaW5mby0+Y2h1bmtfcm9vdDsKKworCXBhdGggPSBidHJmc19hbGxvY19wYXRoKCk7CisJaWYgKCFwYXRoKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWtleS5vYmplY3RpZCA9IEJUUkZTX0RFVl9JVEVNU19PQkpFQ1RJRDsKKwlrZXkudHlwZSA9IEJUUkZTX0RFVl9JVEVNX0tFWTsKKwlrZXkub2Zmc2V0ID0gZGV2aWNlLT5kZXZpZDsKKworCXJldCA9IGJ0cmZzX2luc2VydF9lbXB0eV9pdGVtKHRyYW5zLCByb290LCBwYXRoLCAma2V5LAorCQkJCSAgICAgIHNpemVvZigqZGV2X2l0ZW0pKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKworCWxlYWYgPSBwYXRoLT5ub2Rlc1swXTsKKwlkZXZfaXRlbSA9IGJ0cmZzX2l0ZW1fcHRyKGxlYWYsIHBhdGgtPnNsb3RzWzBdLCBzdHJ1Y3QgYnRyZnNfZGV2X2l0ZW0pOworCisJYnRyZnNfc2V0X2RldmljZV9pZChsZWFmLCBkZXZfaXRlbSwgZGV2aWNlLT5kZXZpZCk7CisJYnRyZnNfc2V0X2RldmljZV9nZW5lcmF0aW9uKGxlYWYsIGRldl9pdGVtLCAwKTsKKwlidHJmc19zZXRfZGV2aWNlX3R5cGUobGVhZiwgZGV2X2l0ZW0sIGRldmljZS0+dHlwZSk7CisJYnRyZnNfc2V0X2RldmljZV9pb19hbGlnbihsZWFmLCBkZXZfaXRlbSwgZGV2aWNlLT5pb19hbGlnbik7CisJYnRyZnNfc2V0X2RldmljZV9pb193aWR0aChsZWFmLCBkZXZfaXRlbSwgZGV2aWNlLT5pb193aWR0aCk7CisJYnRyZnNfc2V0X2RldmljZV9zZWN0b3Jfc2l6ZShsZWFmLCBkZXZfaXRlbSwgZGV2aWNlLT5zZWN0b3Jfc2l6ZSk7CisJYnRyZnNfc2V0X2RldmljZV90b3RhbF9ieXRlcyhsZWFmLCBkZXZfaXRlbSwgZGV2aWNlLT50b3RhbF9ieXRlcyk7CisJYnRyZnNfc2V0X2RldmljZV9ieXRlc191c2VkKGxlYWYsIGRldl9pdGVtLCBkZXZpY2UtPmJ5dGVzX3VzZWQpOworCWJ0cmZzX3NldF9kZXZpY2VfZ3JvdXAobGVhZiwgZGV2X2l0ZW0sIDApOworCWJ0cmZzX3NldF9kZXZpY2Vfc2Vla19zcGVlZChsZWFmLCBkZXZfaXRlbSwgMCk7CisJYnRyZnNfc2V0X2RldmljZV9iYW5kd2lkdGgobGVhZiwgZGV2X2l0ZW0sIDApOworCWJ0cmZzX3NldF9kZXZpY2Vfc3RhcnRfb2Zmc2V0KGxlYWYsIGRldl9pdGVtLCAwKTsKKworCXB0ciA9ICh1bnNpZ25lZCBsb25nKWJ0cmZzX2RldmljZV91dWlkKGRldl9pdGVtKTsKKwl3cml0ZV9leHRlbnRfYnVmZmVyKGxlYWYsIGRldmljZS0+dXVpZCwgcHRyLCBCVFJGU19VVUlEX1NJWkUpOworCXB0ciA9ICh1bnNpZ25lZCBsb25nKWJ0cmZzX2RldmljZV9mc2lkKGRldl9pdGVtKTsKKwl3cml0ZV9leHRlbnRfYnVmZmVyKGxlYWYsIHJvb3QtPmZzX2luZm8tPmZzaWQsIHB0ciwgQlRSRlNfVVVJRF9TSVpFKTsKKwlidHJmc19tYXJrX2J1ZmZlcl9kaXJ0eShsZWFmKTsKKworCXJldCA9IDA7CitvdXQ6CisJYnRyZnNfZnJlZV9wYXRoKHBhdGgpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYnRyZnNfcm1fZGV2X2l0ZW0oc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsCisJCQkgICAgIHN0cnVjdCBidHJmc19kZXZpY2UgKmRldmljZSkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBidHJmc19wYXRoICpwYXRoOworCXN0cnVjdCBidHJmc19rZXkga2V5OworCXN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zOworCisJcm9vdCA9IHJvb3QtPmZzX2luZm8tPmNodW5rX3Jvb3Q7CisKKwlwYXRoID0gYnRyZnNfYWxsb2NfcGF0aCgpOworCWlmICghcGF0aCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwl0cmFucyA9IGJ0cmZzX3N0YXJ0X3RyYW5zYWN0aW9uKHJvb3QsIDEpOworCWtleS5vYmplY3RpZCA9IEJUUkZTX0RFVl9JVEVNU19PQkpFQ1RJRDsKKwlrZXkudHlwZSA9IEJUUkZTX0RFVl9JVEVNX0tFWTsKKwlrZXkub2Zmc2V0ID0gZGV2aWNlLT5kZXZpZDsKKwlsb2NrX2NodW5rcyhyb290KTsKKworCXJldCA9IGJ0cmZzX3NlYXJjaF9zbG90KHRyYW5zLCByb290LCAma2V5LCBwYXRoLCAtMSwgMSk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0OworCisJaWYgKHJldCA+IDApIHsKKwkJcmV0ID0gLUVOT0VOVDsKKwkJZ290byBvdXQ7CisJfQorCisJcmV0ID0gYnRyZnNfZGVsX2l0ZW0odHJhbnMsIHJvb3QsIHBhdGgpOworCWlmIChyZXQpCisJCWdvdG8gb3V0Oworb3V0OgorCWJ0cmZzX2ZyZWVfcGF0aChwYXRoKTsKKwl1bmxvY2tfY2h1bmtzKHJvb3QpOworCWJ0cmZzX2NvbW1pdF90cmFuc2FjdGlvbih0cmFucywgcm9vdCk7CisJcmV0dXJuIHJldDsKK30KKworaW50IGJ0cmZzX3JtX2RldmljZShzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwgY2hhciAqZGV2aWNlX3BhdGgpCit7CisJc3RydWN0IGJ0cmZzX2RldmljZSAqZGV2aWNlOworCXN0cnVjdCBidHJmc19kZXZpY2UgKm5leHRfZGV2aWNlOworCXN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXY7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IE5VTEw7CisJc3RydWN0IGJ0cmZzX3N1cGVyX2Jsb2NrICpkaXNrX3N1cGVyOworCXU2NCBhbGxfYXZhaWw7CisJdTY0IGRldmlkOworCXU2NCBudW1fZGV2aWNlczsKKwl1OCAqZGV2X3V1aWQ7CisJaW50IHJldCA9IDA7CisKKwltdXRleF9sb2NrKCZ1dWlkX211dGV4KTsKKwltdXRleF9sb2NrKCZyb290LT5mc19pbmZvLT52b2x1bWVfbXV0ZXgpOworCisJYWxsX2F2YWlsID0gcm9vdC0+ZnNfaW5mby0+YXZhaWxfZGF0YV9hbGxvY19iaXRzIHwKKwkJcm9vdC0+ZnNfaW5mby0+YXZhaWxfc3lzdGVtX2FsbG9jX2JpdHMgfAorCQlyb290LT5mc19pbmZvLT5hdmFpbF9tZXRhZGF0YV9hbGxvY19iaXRzOworCisJaWYgKChhbGxfYXZhaWwgJiBCVFJGU19CTE9DS19HUk9VUF9SQUlEMTApICYmCisJICAgIHJvb3QtPmZzX2luZm8tPmZzX2RldmljZXMtPnJ3X2RldmljZXMgPD0gNCkgeworCQlwcmludGsoS0VSTl9FUlIgImJ0cmZzOiB1bmFibGUgdG8gZ28gYmVsb3cgZm91ciBkZXZpY2VzICIKKwkJICAgICAgICJvbiByYWlkMTBcbiIpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoKGFsbF9hdmFpbCAmIEJUUkZTX0JMT0NLX0dST1VQX1JBSUQxKSAmJgorCSAgICByb290LT5mc19pbmZvLT5mc19kZXZpY2VzLT5yd19kZXZpY2VzIDw9IDIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJidHJmczogdW5hYmxlIHRvIGdvIGJlbG93IHR3byAiCisJCSAgICAgICAiZGV2aWNlcyBvbiByYWlkMVxuIik7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKworCWlmIChzdHJjbXAoZGV2aWNlX3BhdGgsICJtaXNzaW5nIikgPT0gMCkgeworCQlzdHJ1Y3QgbGlzdF9oZWFkICpjdXI7CisJCXN0cnVjdCBsaXN0X2hlYWQgKmRldmljZXM7CisJCXN0cnVjdCBidHJmc19kZXZpY2UgKnRtcDsKKworCQlkZXZpY2UgPSBOVUxMOworCQlkZXZpY2VzID0gJnJvb3QtPmZzX2luZm8tPmZzX2RldmljZXMtPmRldmljZXM7CisJCWxpc3RfZm9yX2VhY2goY3VyLCBkZXZpY2VzKSB7CisJCQl0bXAgPSBsaXN0X2VudHJ5KGN1ciwgc3RydWN0IGJ0cmZzX2RldmljZSwgZGV2X2xpc3QpOworCQkJaWYgKHRtcC0+aW5fZnNfbWV0YWRhdGEgJiYgIXRtcC0+YmRldikgeworCQkJCWRldmljZSA9IHRtcDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQliZGV2ID0gTlVMTDsKKwkJYmggPSBOVUxMOworCQlkaXNrX3N1cGVyID0gTlVMTDsKKwkJaWYgKCFkZXZpY2UpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiYnRyZnM6IG5vIG1pc3NpbmcgZGV2aWNlcyBmb3VuZCB0byAiCisJCQkgICAgICAgInJlbW92ZVxuIik7CisJCQlnb3RvIG91dDsKKwkJfQorCX0gZWxzZSB7CisJCWJkZXYgPSBvcGVuX2JkZXZfZXhjbHVzaXZlKGRldmljZV9wYXRoLCBGTU9ERV9SRUFELAorCQkJCSAgICAgIHJvb3QtPmZzX2luZm8tPmJkZXZfaG9sZGVyKTsKKwkJaWYgKElTX0VSUihiZGV2KSkgeworCQkJcmV0ID0gUFRSX0VSUihiZGV2KTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJc2V0X2Jsb2Nrc2l6ZShiZGV2LCA0MDk2KTsKKwkJYmggPSBidHJmc19yZWFkX2Rldl9zdXBlcihiZGV2KTsKKwkJaWYgKCFiaCkgeworCQkJcmV0ID0gLUVJTzsKKwkJCWdvdG8gZXJyb3JfY2xvc2U7CisJCX0KKwkJZGlza19zdXBlciA9IChzdHJ1Y3QgYnRyZnNfc3VwZXJfYmxvY2sgKiliaC0+Yl9kYXRhOworCQlkZXZpZCA9IGxlNjRfdG9fY3B1KGRpc2tfc3VwZXItPmRldl9pdGVtLmRldmlkKTsKKwkJZGV2X3V1aWQgPSBkaXNrX3N1cGVyLT5kZXZfaXRlbS51dWlkOworCQlkZXZpY2UgPSBidHJmc19maW5kX2RldmljZShyb290LCBkZXZpZCwgZGV2X3V1aWQsCisJCQkJCSAgIGRpc2tfc3VwZXItPmZzaWQpOworCQlpZiAoIWRldmljZSkgeworCQkJcmV0ID0gLUVOT0VOVDsKKwkJCWdvdG8gZXJyb3JfYnJlbHNlOworCQl9CisJfQorCisJaWYgKGRldmljZS0+d3JpdGVhYmxlICYmIHJvb3QtPmZzX2luZm8tPmZzX2RldmljZXMtPnJ3X2RldmljZXMgPT0gMSkgeworCQlwcmludGsoS0VSTl9FUlIgImJ0cmZzOiB1bmFibGUgdG8gcmVtb3ZlIHRoZSBvbmx5IHdyaXRlYWJsZSAiCisJCSAgICAgICAiZGV2aWNlXG4iKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBlcnJvcl9icmVsc2U7CisJfQorCisJaWYgKGRldmljZS0+d3JpdGVhYmxlKSB7CisJCWxpc3RfZGVsX2luaXQoJmRldmljZS0+ZGV2X2FsbG9jX2xpc3QpOworCQlyb290LT5mc19pbmZvLT5mc19kZXZpY2VzLT5yd19kZXZpY2VzLS07CisJfQorCisJcmV0ID0gYnRyZnNfc2hyaW5rX2RldmljZShkZXZpY2UsIDApOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfYnJlbHNlOworCisJcmV0ID0gYnRyZnNfcm1fZGV2X2l0ZW0ocm9vdC0+ZnNfaW5mby0+Y2h1bmtfcm9vdCwgZGV2aWNlKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX2JyZWxzZTsKKworCWRldmljZS0+aW5fZnNfbWV0YWRhdGEgPSAwOworCWxpc3RfZGVsX2luaXQoJmRldmljZS0+ZGV2X2xpc3QpOworCWRldmljZS0+ZnNfZGV2aWNlcy0+bnVtX2RldmljZXMtLTsKKworCW5leHRfZGV2aWNlID0gbGlzdF9lbnRyeShyb290LT5mc19pbmZvLT5mc19kZXZpY2VzLT5kZXZpY2VzLm5leHQsCisJCQkJIHN0cnVjdCBidHJmc19kZXZpY2UsIGRldl9saXN0KTsKKwlpZiAoZGV2aWNlLT5iZGV2ID09IHJvb3QtPmZzX2luZm8tPnNiLT5zX2JkZXYpCisJCXJvb3QtPmZzX2luZm8tPnNiLT5zX2JkZXYgPSBuZXh0X2RldmljZS0+YmRldjsKKwlpZiAoZGV2aWNlLT5iZGV2ID09IHJvb3QtPmZzX2luZm8tPmZzX2RldmljZXMtPmxhdGVzdF9iZGV2KQorCQlyb290LT5mc19pbmZvLT5mc19kZXZpY2VzLT5sYXRlc3RfYmRldiA9IG5leHRfZGV2aWNlLT5iZGV2OworCisJaWYgKGRldmljZS0+YmRldikgeworCQljbG9zZV9iZGV2X2V4Y2x1c2l2ZShkZXZpY2UtPmJkZXYsIGRldmljZS0+bW9kZSk7CisJCWRldmljZS0+YmRldiA9IE5VTEw7CisJCWRldmljZS0+ZnNfZGV2aWNlcy0+b3Blbl9kZXZpY2VzLS07CisJfQorCisJbnVtX2RldmljZXMgPSBidHJmc19zdXBlcl9udW1fZGV2aWNlcygmcm9vdC0+ZnNfaW5mby0+c3VwZXJfY29weSkgLSAxOworCWJ0cmZzX3NldF9zdXBlcl9udW1fZGV2aWNlcygmcm9vdC0+ZnNfaW5mby0+c3VwZXJfY29weSwgbnVtX2RldmljZXMpOworCisJaWYgKGRldmljZS0+ZnNfZGV2aWNlcy0+b3Blbl9kZXZpY2VzID09IDApIHsKKwkJc3RydWN0IGJ0cmZzX2ZzX2RldmljZXMgKmZzX2RldmljZXM7CisJCWZzX2RldmljZXMgPSByb290LT5mc19pbmZvLT5mc19kZXZpY2VzOworCQl3aGlsZSAoZnNfZGV2aWNlcykgeworCQkJaWYgKGZzX2RldmljZXMtPnNlZWQgPT0gZGV2aWNlLT5mc19kZXZpY2VzKQorCQkJCWJyZWFrOworCQkJZnNfZGV2aWNlcyA9IGZzX2RldmljZXMtPnNlZWQ7CisJCX0KKwkJZnNfZGV2aWNlcy0+c2VlZCA9IGRldmljZS0+ZnNfZGV2aWNlcy0+c2VlZDsKKwkJZGV2aWNlLT5mc19kZXZpY2VzLT5zZWVkID0gTlVMTDsKKwkJX19idHJmc19jbG9zZV9kZXZpY2VzKGRldmljZS0+ZnNfZGV2aWNlcyk7CisJCWZyZWVfZnNfZGV2aWNlcyhkZXZpY2UtPmZzX2RldmljZXMpOworCX0KKworCS8qCisJICogYXQgdGhpcyBwb2ludCwgdGhlIGRldmljZSBpcyB6ZXJvIHNpemVkLiAgV2Ugd2FudCB0bworCSAqIHJlbW92ZSBpdCBmcm9tIHRoZSBkZXZpY2VzIGxpc3QgYW5kIHplcm8gb3V0IHRoZSBvbGQgc3VwZXIKKwkgKi8KKwlpZiAoZGV2aWNlLT53cml0ZWFibGUpIHsKKwkJLyogbWFrZSBzdXJlIHRoaXMgZGV2aWNlIGlzbid0IGRldGVjdGVkIGFzIHBhcnQgb2YKKwkJICogdGhlIEZTIGFueW1vcmUKKwkJICovCisJCW1lbXNldCgmZGlza19zdXBlci0+bWFnaWMsIDAsIHNpemVvZihkaXNrX3N1cGVyLT5tYWdpYykpOworCQlzZXRfYnVmZmVyX2RpcnR5KGJoKTsKKwkJc3luY19kaXJ0eV9idWZmZXIoYmgpOworCX0KKworCWtmcmVlKGRldmljZS0+bmFtZSk7CisJa2ZyZWUoZGV2aWNlKTsKKwlyZXQgPSAwOworCitlcnJvcl9icmVsc2U6CisJYnJlbHNlKGJoKTsKK2Vycm9yX2Nsb3NlOgorCWlmIChiZGV2KQorCQljbG9zZV9iZGV2X2V4Y2x1c2l2ZShiZGV2LCBGTU9ERV9SRUFEKTsKK291dDoKKwltdXRleF91bmxvY2soJnJvb3QtPmZzX2luZm8tPnZvbHVtZV9tdXRleCk7CisJbXV0ZXhfdW5sb2NrKCZ1dWlkX211dGV4KTsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogZG9lcyBhbGwgdGhlIGRpcnR5IHdvcmsgcmVxdWlyZWQgZm9yIGNoYW5naW5nIGZpbGUgc3lzdGVtJ3MgVVVJRC4KKyAqLworc3RhdGljIGludCBidHJmc19wcmVwYXJlX3Nwcm91dChzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKKwkJCQlzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCkKK3sKKwlzdHJ1Y3QgYnRyZnNfZnNfZGV2aWNlcyAqZnNfZGV2aWNlcyA9IHJvb3QtPmZzX2luZm8tPmZzX2RldmljZXM7CisJc3RydWN0IGJ0cmZzX2ZzX2RldmljZXMgKm9sZF9kZXZpY2VzOworCXN0cnVjdCBidHJmc19mc19kZXZpY2VzICpzZWVkX2RldmljZXM7CisJc3RydWN0IGJ0cmZzX3N1cGVyX2Jsb2NrICpkaXNrX3N1cGVyID0gJnJvb3QtPmZzX2luZm8tPnN1cGVyX2NvcHk7CisJc3RydWN0IGJ0cmZzX2RldmljZSAqZGV2aWNlOworCXU2NCBzdXBlcl9mbGFnczsKKworCUJVR19PTighbXV0ZXhfaXNfbG9ja2VkKCZ1dWlkX211dGV4KSk7CisJaWYgKCFmc19kZXZpY2VzLT5zZWVkaW5nKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXNlZWRfZGV2aWNlcyA9IGt6YWxsb2Moc2l6ZW9mKCpmc19kZXZpY2VzKSwgR0ZQX05PRlMpOworCWlmICghc2VlZF9kZXZpY2VzKQorCQlyZXR1cm4gLUVOT01FTTsKKworCW9sZF9kZXZpY2VzID0gY2xvbmVfZnNfZGV2aWNlcyhmc19kZXZpY2VzKTsKKwlpZiAoSVNfRVJSKG9sZF9kZXZpY2VzKSkgeworCQlrZnJlZShzZWVkX2RldmljZXMpOworCQlyZXR1cm4gUFRSX0VSUihvbGRfZGV2aWNlcyk7CisJfQorCisJbGlzdF9hZGQoJm9sZF9kZXZpY2VzLT5saXN0LCAmZnNfdXVpZHMpOworCisJbWVtY3B5KHNlZWRfZGV2aWNlcywgZnNfZGV2aWNlcywgc2l6ZW9mKCpzZWVkX2RldmljZXMpKTsKKwlzZWVkX2RldmljZXMtPm9wZW5lZCA9IDE7CisJSU5JVF9MSVNUX0hFQUQoJnNlZWRfZGV2aWNlcy0+ZGV2aWNlcyk7CisJSU5JVF9MSVNUX0hFQUQoJnNlZWRfZGV2aWNlcy0+YWxsb2NfbGlzdCk7CisJbGlzdF9zcGxpY2VfaW5pdCgmZnNfZGV2aWNlcy0+ZGV2aWNlcywgJnNlZWRfZGV2aWNlcy0+ZGV2aWNlcyk7CisJbGlzdF9zcGxpY2VfaW5pdCgmZnNfZGV2aWNlcy0+YWxsb2NfbGlzdCwgJnNlZWRfZGV2aWNlcy0+YWxsb2NfbGlzdCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShkZXZpY2UsICZzZWVkX2RldmljZXMtPmRldmljZXMsIGRldl9saXN0KSB7CisJCWRldmljZS0+ZnNfZGV2aWNlcyA9IHNlZWRfZGV2aWNlczsKKwl9CisKKwlmc19kZXZpY2VzLT5zZWVkaW5nID0gMDsKKwlmc19kZXZpY2VzLT5udW1fZGV2aWNlcyA9IDA7CisJZnNfZGV2aWNlcy0+b3Blbl9kZXZpY2VzID0gMDsKKwlmc19kZXZpY2VzLT5zZWVkID0gc2VlZF9kZXZpY2VzOworCisJZ2VuZXJhdGVfcmFuZG9tX3V1aWQoZnNfZGV2aWNlcy0+ZnNpZCk7CisJbWVtY3B5KHJvb3QtPmZzX2luZm8tPmZzaWQsIGZzX2RldmljZXMtPmZzaWQsIEJUUkZTX0ZTSURfU0laRSk7CisJbWVtY3B5KGRpc2tfc3VwZXItPmZzaWQsIGZzX2RldmljZXMtPmZzaWQsIEJUUkZTX0ZTSURfU0laRSk7CisJc3VwZXJfZmxhZ3MgPSBidHJmc19zdXBlcl9mbGFncyhkaXNrX3N1cGVyKSAmCisJCSAgICAgIH5CVFJGU19TVVBFUl9GTEFHX1NFRURJTkc7CisJYnRyZnNfc2V0X3N1cGVyX2ZsYWdzKGRpc2tfc3VwZXIsIHN1cGVyX2ZsYWdzKTsKKworCXJldHVybiAwOworfQorCisvKgorICogc3Ryb3JlIHRoZSBleHBlY3RlZCBnZW5lcmF0aW9uIGZvciBzZWVkIGRldmljZXMgaW4gZGV2aWNlIGl0ZW1zLgorICovCitzdGF0aWMgaW50IGJ0cmZzX2ZpbmlzaF9zcHJvdXQoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCisJCQkgICAgICAgc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QpCit7CisJc3RydWN0IGJ0cmZzX3BhdGggKnBhdGg7CisJc3RydWN0IGV4dGVudF9idWZmZXIgKmxlYWY7CisJc3RydWN0IGJ0cmZzX2Rldl9pdGVtICpkZXZfaXRlbTsKKwlzdHJ1Y3QgYnRyZnNfZGV2aWNlICpkZXZpY2U7CisJc3RydWN0IGJ0cmZzX2tleSBrZXk7CisJdTggZnNfdXVpZFtCVFJGU19VVUlEX1NJWkVdOworCXU4IGRldl91dWlkW0JUUkZTX1VVSURfU0laRV07CisJdTY0IGRldmlkOworCWludCByZXQ7CisKKwlwYXRoID0gYnRyZnNfYWxsb2NfcGF0aCgpOworCWlmICghcGF0aCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyb290ID0gcm9vdC0+ZnNfaW5mby0+Y2h1bmtfcm9vdDsKKwlrZXkub2JqZWN0aWQgPSBCVFJGU19ERVZfSVRFTVNfT0JKRUNUSUQ7CisJa2V5Lm9mZnNldCA9IDA7CisJa2V5LnR5cGUgPSBCVFJGU19ERVZfSVRFTV9LRVk7CisKKwl3aGlsZSAoMSkgeworCQlyZXQgPSBidHJmc19zZWFyY2hfc2xvdCh0cmFucywgcm9vdCwgJmtleSwgcGF0aCwgMCwgMSk7CisJCWlmIChyZXQgPCAwKQorCQkJZ290byBlcnJvcjsKKworCQlsZWFmID0gcGF0aC0+bm9kZXNbMF07CituZXh0X3Nsb3Q6CisJCWlmIChwYXRoLT5zbG90c1swXSA+PSBidHJmc19oZWFkZXJfbnJpdGVtcyhsZWFmKSkgeworCQkJcmV0ID0gYnRyZnNfbmV4dF9sZWFmKHJvb3QsIHBhdGgpOworCQkJaWYgKHJldCA+IDApCisJCQkJYnJlYWs7CisJCQlpZiAocmV0IDwgMCkKKwkJCQlnb3RvIGVycm9yOworCQkJbGVhZiA9IHBhdGgtPm5vZGVzWzBdOworCQkJYnRyZnNfaXRlbV9rZXlfdG9fY3B1KGxlYWYsICZrZXksIHBhdGgtPnNsb3RzWzBdKTsKKwkJCWJ0cmZzX3JlbGVhc2VfcGF0aChyb290LCBwYXRoKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJYnRyZnNfaXRlbV9rZXlfdG9fY3B1KGxlYWYsICZrZXksIHBhdGgtPnNsb3RzWzBdKTsKKwkJaWYgKGtleS5vYmplY3RpZCAhPSBCVFJGU19ERVZfSVRFTVNfT0JKRUNUSUQgfHwKKwkJICAgIGtleS50eXBlICE9IEJUUkZTX0RFVl9JVEVNX0tFWSkKKwkJCWJyZWFrOworCisJCWRldl9pdGVtID0gYnRyZnNfaXRlbV9wdHIobGVhZiwgcGF0aC0+c2xvdHNbMF0sCisJCQkJCSAgc3RydWN0IGJ0cmZzX2Rldl9pdGVtKTsKKwkJZGV2aWQgPSBidHJmc19kZXZpY2VfaWQobGVhZiwgZGV2X2l0ZW0pOworCQlyZWFkX2V4dGVudF9idWZmZXIobGVhZiwgZGV2X3V1aWQsCisJCQkJICAgKHVuc2lnbmVkIGxvbmcpYnRyZnNfZGV2aWNlX3V1aWQoZGV2X2l0ZW0pLAorCQkJCSAgIEJUUkZTX1VVSURfU0laRSk7CisJCXJlYWRfZXh0ZW50X2J1ZmZlcihsZWFmLCBmc191dWlkLAorCQkJCSAgICh1bnNpZ25lZCBsb25nKWJ0cmZzX2RldmljZV9mc2lkKGRldl9pdGVtKSwKKwkJCQkgICBCVFJGU19VVUlEX1NJWkUpOworCQlkZXZpY2UgPSBidHJmc19maW5kX2RldmljZShyb290LCBkZXZpZCwgZGV2X3V1aWQsIGZzX3V1aWQpOworCQlCVUdfT04oIWRldmljZSk7CisKKwkJaWYgKGRldmljZS0+ZnNfZGV2aWNlcy0+c2VlZGluZykgeworCQkJYnRyZnNfc2V0X2RldmljZV9nZW5lcmF0aW9uKGxlYWYsIGRldl9pdGVtLAorCQkJCQkJICAgIGRldmljZS0+Z2VuZXJhdGlvbik7CisJCQlidHJmc19tYXJrX2J1ZmZlcl9kaXJ0eShsZWFmKTsKKwkJfQorCisJCXBhdGgtPnNsb3RzWzBdKys7CisJCWdvdG8gbmV4dF9zbG90OworCX0KKwlyZXQgPSAwOworZXJyb3I6CisJYnRyZnNfZnJlZV9wYXRoKHBhdGgpOworCXJldHVybiByZXQ7Cit9CisKK2ludCBidHJmc19pbml0X25ld19kZXZpY2Uoc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsIGNoYXIgKmRldmljZV9wYXRoKQoreworCXN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zOworCXN0cnVjdCBidHJmc19kZXZpY2UgKmRldmljZTsKKwlzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2OworCXN0cnVjdCBsaXN0X2hlYWQgKmN1cjsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpkZXZpY2VzOworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSByb290LT5mc19pbmZvLT5zYjsKKwl1NjQgdG90YWxfYnl0ZXM7CisJaW50IHNlZWRpbmdfZGV2ID0gMDsKKwlpbnQgcmV0ID0gMDsKKworCWlmICgoc2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkpICYmICFyb290LT5mc19pbmZvLT5mc19kZXZpY2VzLT5zZWVkaW5nKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWJkZXYgPSBvcGVuX2JkZXZfZXhjbHVzaXZlKGRldmljZV9wYXRoLCAwLCByb290LT5mc19pbmZvLT5iZGV2X2hvbGRlcik7CisJaWYgKCFiZGV2KQorCQlyZXR1cm4gLUVJTzsKKworCWlmIChyb290LT5mc19pbmZvLT5mc19kZXZpY2VzLT5zZWVkaW5nKSB7CisJCXNlZWRpbmdfZGV2ID0gMTsKKwkJZG93bl93cml0ZSgmc2ItPnNfdW1vdW50KTsKKwkJbXV0ZXhfbG9jaygmdXVpZF9tdXRleCk7CisJfQorCisJZmlsZW1hcF93cml0ZV9hbmRfd2FpdChiZGV2LT5iZF9pbm9kZS0+aV9tYXBwaW5nKTsKKwltdXRleF9sb2NrKCZyb290LT5mc19pbmZvLT52b2x1bWVfbXV0ZXgpOworCisJZGV2aWNlcyA9ICZyb290LT5mc19pbmZvLT5mc19kZXZpY2VzLT5kZXZpY2VzOworCWxpc3RfZm9yX2VhY2goY3VyLCBkZXZpY2VzKSB7CisJCWRldmljZSA9IGxpc3RfZW50cnkoY3VyLCBzdHJ1Y3QgYnRyZnNfZGV2aWNlLCBkZXZfbGlzdCk7CisJCWlmIChkZXZpY2UtPmJkZXYgPT0gYmRldikgeworCQkJcmV0ID0gLUVFWElTVDsKKwkJCWdvdG8gZXJyb3I7CisJCX0KKwl9CisKKwlkZXZpY2UgPSBremFsbG9jKHNpemVvZigqZGV2aWNlKSwgR0ZQX05PRlMpOworCWlmICghZGV2aWNlKSB7CisJCS8qIHdlIGNhbiBzYWZlbHkgbGVhdmUgdGhlIGZzX2RldmljZXMgZW50cnkgYXJvdW5kICovCisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3I7CisJfQorCisJZGV2aWNlLT5uYW1lID0ga3N0cmR1cChkZXZpY2VfcGF0aCwgR0ZQX05PRlMpOworCWlmICghZGV2aWNlLT5uYW1lKSB7CisJCWtmcmVlKGRldmljZSk7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3I7CisJfQorCisJcmV0ID0gZmluZF9uZXh0X2RldmlkKHJvb3QsICZkZXZpY2UtPmRldmlkKTsKKwlpZiAocmV0KSB7CisJCWtmcmVlKGRldmljZSk7CisJCWdvdG8gZXJyb3I7CisJfQorCisJdHJhbnMgPSBidHJmc19zdGFydF90cmFuc2FjdGlvbihyb290LCAxKTsKKwlsb2NrX2NodW5rcyhyb290KTsKKworCWRldmljZS0+YmFycmllcnMgPSAxOworCWRldmljZS0+d3JpdGVhYmxlID0gMTsKKwlkZXZpY2UtPndvcmsuZnVuYyA9IHBlbmRpbmdfYmlvc19mbjsKKwlnZW5lcmF0ZV9yYW5kb21fdXVpZChkZXZpY2UtPnV1aWQpOworCXNwaW5fbG9ja19pbml0KCZkZXZpY2UtPmlvX2xvY2spOworCWRldmljZS0+Z2VuZXJhdGlvbiA9IHRyYW5zLT50cmFuc2lkOworCWRldmljZS0+aW9fd2lkdGggPSByb290LT5zZWN0b3JzaXplOworCWRldmljZS0+aW9fYWxpZ24gPSByb290LT5zZWN0b3JzaXplOworCWRldmljZS0+c2VjdG9yX3NpemUgPSByb290LT5zZWN0b3JzaXplOworCWRldmljZS0+dG90YWxfYnl0ZXMgPSBpX3NpemVfcmVhZChiZGV2LT5iZF9pbm9kZSk7CisJZGV2aWNlLT5kZXZfcm9vdCA9IHJvb3QtPmZzX2luZm8tPmRldl9yb290OworCWRldmljZS0+YmRldiA9IGJkZXY7CisJZGV2aWNlLT5pbl9mc19tZXRhZGF0YSA9IDE7CisJZGV2aWNlLT5tb2RlID0gMDsKKwlzZXRfYmxvY2tzaXplKGRldmljZS0+YmRldiwgNDA5Nik7CisKKwlpZiAoc2VlZGluZ19kZXYpIHsKKwkJc2ItPnNfZmxhZ3MgJj0gfk1TX1JET05MWTsKKwkJcmV0ID0gYnRyZnNfcHJlcGFyZV9zcHJvdXQodHJhbnMsIHJvb3QpOworCQlCVUdfT04ocmV0KTsKKwl9CisKKwlkZXZpY2UtPmZzX2RldmljZXMgPSByb290LT5mc19pbmZvLT5mc19kZXZpY2VzOworCWxpc3RfYWRkKCZkZXZpY2UtPmRldl9saXN0LCAmcm9vdC0+ZnNfaW5mby0+ZnNfZGV2aWNlcy0+ZGV2aWNlcyk7CisJbGlzdF9hZGQoJmRldmljZS0+ZGV2X2FsbG9jX2xpc3QsCisJCSAmcm9vdC0+ZnNfaW5mby0+ZnNfZGV2aWNlcy0+YWxsb2NfbGlzdCk7CisJcm9vdC0+ZnNfaW5mby0+ZnNfZGV2aWNlcy0+bnVtX2RldmljZXMrKzsKKwlyb290LT5mc19pbmZvLT5mc19kZXZpY2VzLT5vcGVuX2RldmljZXMrKzsKKwlyb290LT5mc19pbmZvLT5mc19kZXZpY2VzLT5yd19kZXZpY2VzKys7CisJcm9vdC0+ZnNfaW5mby0+ZnNfZGV2aWNlcy0+dG90YWxfcndfYnl0ZXMgKz0gZGV2aWNlLT50b3RhbF9ieXRlczsKKworCXRvdGFsX2J5dGVzID0gYnRyZnNfc3VwZXJfdG90YWxfYnl0ZXMoJnJvb3QtPmZzX2luZm8tPnN1cGVyX2NvcHkpOworCWJ0cmZzX3NldF9zdXBlcl90b3RhbF9ieXRlcygmcm9vdC0+ZnNfaW5mby0+c3VwZXJfY29weSwKKwkJCQkgICAgdG90YWxfYnl0ZXMgKyBkZXZpY2UtPnRvdGFsX2J5dGVzKTsKKworCXRvdGFsX2J5dGVzID0gYnRyZnNfc3VwZXJfbnVtX2RldmljZXMoJnJvb3QtPmZzX2luZm8tPnN1cGVyX2NvcHkpOworCWJ0cmZzX3NldF9zdXBlcl9udW1fZGV2aWNlcygmcm9vdC0+ZnNfaW5mby0+c3VwZXJfY29weSwKKwkJCQkgICAgdG90YWxfYnl0ZXMgKyAxKTsKKworCWlmIChzZWVkaW5nX2RldikgeworCQlyZXQgPSBpbml0X2ZpcnN0X3J3X2RldmljZSh0cmFucywgcm9vdCwgZGV2aWNlKTsKKwkJQlVHX09OKHJldCk7CisJCXJldCA9IGJ0cmZzX2ZpbmlzaF9zcHJvdXQodHJhbnMsIHJvb3QpOworCQlCVUdfT04ocmV0KTsKKwl9IGVsc2UgeworCQlyZXQgPSBidHJmc19hZGRfZGV2aWNlKHRyYW5zLCByb290LCBkZXZpY2UpOworCX0KKworCXVubG9ja19jaHVua3Mocm9vdCk7CisJYnRyZnNfY29tbWl0X3RyYW5zYWN0aW9uKHRyYW5zLCByb290KTsKKworCWlmIChzZWVkaW5nX2RldikgeworCQltdXRleF91bmxvY2soJnV1aWRfbXV0ZXgpOworCQl1cF93cml0ZSgmc2ItPnNfdW1vdW50KTsKKworCQlyZXQgPSBidHJmc19yZWxvY2F0ZV9zeXNfY2h1bmtzKHJvb3QpOworCQlCVUdfT04ocmV0KTsKKwl9CitvdXQ6CisJbXV0ZXhfdW5sb2NrKCZyb290LT5mc19pbmZvLT52b2x1bWVfbXV0ZXgpOworCXJldHVybiByZXQ7CitlcnJvcjoKKwljbG9zZV9iZGV2X2V4Y2x1c2l2ZShiZGV2LCAwKTsKKwlpZiAoc2VlZGluZ19kZXYpIHsKKwkJbXV0ZXhfdW5sb2NrKCZ1dWlkX211dGV4KTsKKwkJdXBfd3JpdGUoJnNiLT5zX3Vtb3VudCk7CisJfQorCWdvdG8gb3V0OworfQorCitzdGF0aWMgbm9pbmxpbmUgaW50IGJ0cmZzX3VwZGF0ZV9kZXZpY2Uoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCisJCQkJCXN0cnVjdCBidHJmc19kZXZpY2UgKmRldmljZSkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBidHJmc19wYXRoICpwYXRoOworCXN0cnVjdCBidHJmc19yb290ICpyb290OworCXN0cnVjdCBidHJmc19kZXZfaXRlbSAqZGV2X2l0ZW07CisJc3RydWN0IGV4dGVudF9idWZmZXIgKmxlYWY7CisJc3RydWN0IGJ0cmZzX2tleSBrZXk7CisKKwlyb290ID0gZGV2aWNlLT5kZXZfcm9vdC0+ZnNfaW5mby0+Y2h1bmtfcm9vdDsKKworCXBhdGggPSBidHJmc19hbGxvY19wYXRoKCk7CisJaWYgKCFwYXRoKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWtleS5vYmplY3RpZCA9IEJUUkZTX0RFVl9JVEVNU19PQkpFQ1RJRDsKKwlrZXkudHlwZSA9IEJUUkZTX0RFVl9JVEVNX0tFWTsKKwlrZXkub2Zmc2V0ID0gZGV2aWNlLT5kZXZpZDsKKworCXJldCA9IGJ0cmZzX3NlYXJjaF9zbG90KHRyYW5zLCByb290LCAma2V5LCBwYXRoLCAwLCAxKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXQ7CisKKwlpZiAocmV0ID4gMCkgeworCQlyZXQgPSAtRU5PRU5UOworCQlnb3RvIG91dDsKKwl9CisKKwlsZWFmID0gcGF0aC0+bm9kZXNbMF07CisJZGV2X2l0ZW0gPSBidHJmc19pdGVtX3B0cihsZWFmLCBwYXRoLT5zbG90c1swXSwgc3RydWN0IGJ0cmZzX2Rldl9pdGVtKTsKKworCWJ0cmZzX3NldF9kZXZpY2VfaWQobGVhZiwgZGV2X2l0ZW0sIGRldmljZS0+ZGV2aWQpOworCWJ0cmZzX3NldF9kZXZpY2VfdHlwZShsZWFmLCBkZXZfaXRlbSwgZGV2aWNlLT50eXBlKTsKKwlidHJmc19zZXRfZGV2aWNlX2lvX2FsaWduKGxlYWYsIGRldl9pdGVtLCBkZXZpY2UtPmlvX2FsaWduKTsKKwlidHJmc19zZXRfZGV2aWNlX2lvX3dpZHRoKGxlYWYsIGRldl9pdGVtLCBkZXZpY2UtPmlvX3dpZHRoKTsKKwlidHJmc19zZXRfZGV2aWNlX3NlY3Rvcl9zaXplKGxlYWYsIGRldl9pdGVtLCBkZXZpY2UtPnNlY3Rvcl9zaXplKTsKKwlidHJmc19zZXRfZGV2aWNlX3RvdGFsX2J5dGVzKGxlYWYsIGRldl9pdGVtLCBkZXZpY2UtPnRvdGFsX2J5dGVzKTsKKwlidHJmc19zZXRfZGV2aWNlX2J5dGVzX3VzZWQobGVhZiwgZGV2X2l0ZW0sIGRldmljZS0+Ynl0ZXNfdXNlZCk7CisJYnRyZnNfbWFya19idWZmZXJfZGlydHkobGVhZik7CisKK291dDoKKwlidHJmc19mcmVlX3BhdGgocGF0aCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfX2J0cmZzX2dyb3dfZGV2aWNlKHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAorCQkgICAgICBzdHJ1Y3QgYnRyZnNfZGV2aWNlICpkZXZpY2UsIHU2NCBuZXdfc2l6ZSkKK3sKKwlzdHJ1Y3QgYnRyZnNfc3VwZXJfYmxvY2sgKnN1cGVyX2NvcHkgPQorCQkmZGV2aWNlLT5kZXZfcm9vdC0+ZnNfaW5mby0+c3VwZXJfY29weTsKKwl1NjQgb2xkX3RvdGFsID0gYnRyZnNfc3VwZXJfdG90YWxfYnl0ZXMoc3VwZXJfY29weSk7CisJdTY0IGRpZmYgPSBuZXdfc2l6ZSAtIGRldmljZS0+dG90YWxfYnl0ZXM7CisKKwlpZiAoIWRldmljZS0+d3JpdGVhYmxlKQorCQlyZXR1cm4gLUVBQ0NFUzsKKwlpZiAobmV3X3NpemUgPD0gZGV2aWNlLT50b3RhbF9ieXRlcykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlidHJmc19zZXRfc3VwZXJfdG90YWxfYnl0ZXMoc3VwZXJfY29weSwgb2xkX3RvdGFsICsgZGlmZik7CisJZGV2aWNlLT5mc19kZXZpY2VzLT50b3RhbF9yd19ieXRlcyArPSBkaWZmOworCisJZGV2aWNlLT50b3RhbF9ieXRlcyA9IG5ld19zaXplOworCXJldHVybiBidHJmc191cGRhdGVfZGV2aWNlKHRyYW5zLCBkZXZpY2UpOworfQorCitpbnQgYnRyZnNfZ3Jvd19kZXZpY2Uoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCisJCSAgICAgIHN0cnVjdCBidHJmc19kZXZpY2UgKmRldmljZSwgdTY0IG5ld19zaXplKQoreworCWludCByZXQ7CisJbG9ja19jaHVua3MoZGV2aWNlLT5kZXZfcm9vdCk7CisJcmV0ID0gX19idHJmc19ncm93X2RldmljZSh0cmFucywgZGV2aWNlLCBuZXdfc2l6ZSk7CisJdW5sb2NrX2NodW5rcyhkZXZpY2UtPmRldl9yb290KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGJ0cmZzX2ZyZWVfY2h1bmsoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCisJCQkgICAgc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsCisJCQkgICAgdTY0IGNodW5rX3RyZWUsIHU2NCBjaHVua19vYmplY3RpZCwKKwkJCSAgICB1NjQgY2h1bmtfb2Zmc2V0KQoreworCWludCByZXQ7CisJc3RydWN0IGJ0cmZzX3BhdGggKnBhdGg7CisJc3RydWN0IGJ0cmZzX2tleSBrZXk7CisKKwlyb290ID0gcm9vdC0+ZnNfaW5mby0+Y2h1bmtfcm9vdDsKKwlwYXRoID0gYnRyZnNfYWxsb2NfcGF0aCgpOworCWlmICghcGF0aCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlrZXkub2JqZWN0aWQgPSBjaHVua19vYmplY3RpZDsKKwlrZXkub2Zmc2V0ID0gY2h1bmtfb2Zmc2V0OworCWtleS50eXBlID0gQlRSRlNfQ0hVTktfSVRFTV9LRVk7CisKKwlyZXQgPSBidHJmc19zZWFyY2hfc2xvdCh0cmFucywgcm9vdCwgJmtleSwgcGF0aCwgLTEsIDEpOworCUJVR19PTihyZXQpOworCisJcmV0ID0gYnRyZnNfZGVsX2l0ZW0odHJhbnMsIHJvb3QsIHBhdGgpOworCUJVR19PTihyZXQpOworCisJYnRyZnNfZnJlZV9wYXRoKHBhdGgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGJ0cmZzX2RlbF9zeXNfY2h1bmsoc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsIHU2NCBjaHVua19vYmplY3RpZCwgdTY0CisJCQljaHVua19vZmZzZXQpCit7CisJc3RydWN0IGJ0cmZzX3N1cGVyX2Jsb2NrICpzdXBlcl9jb3B5ID0gJnJvb3QtPmZzX2luZm8tPnN1cGVyX2NvcHk7CisJc3RydWN0IGJ0cmZzX2Rpc2tfa2V5ICpkaXNrX2tleTsKKwlzdHJ1Y3QgYnRyZnNfY2h1bmsgKmNodW5rOworCXU4ICpwdHI7CisJaW50IHJldCA9IDA7CisJdTMyIG51bV9zdHJpcGVzOworCXUzMiBhcnJheV9zaXplOworCXUzMiBsZW4gPSAwOworCXUzMiBjdXI7CisJc3RydWN0IGJ0cmZzX2tleSBrZXk7CisKKwlhcnJheV9zaXplID0gYnRyZnNfc3VwZXJfc3lzX2FycmF5X3NpemUoc3VwZXJfY29weSk7CisKKwlwdHIgPSBzdXBlcl9jb3B5LT5zeXNfY2h1bmtfYXJyYXk7CisJY3VyID0gMDsKKworCXdoaWxlIChjdXIgPCBhcnJheV9zaXplKSB7CisJCWRpc2tfa2V5ID0gKHN0cnVjdCBidHJmc19kaXNrX2tleSAqKXB0cjsKKwkJYnRyZnNfZGlza19rZXlfdG9fY3B1KCZrZXksIGRpc2tfa2V5KTsKKworCQlsZW4gPSBzaXplb2YoKmRpc2tfa2V5KTsKKworCQlpZiAoa2V5LnR5cGUgPT0gQlRSRlNfQ0hVTktfSVRFTV9LRVkpIHsKKwkJCWNodW5rID0gKHN0cnVjdCBidHJmc19jaHVuayAqKShwdHIgKyBsZW4pOworCQkJbnVtX3N0cmlwZXMgPSBidHJmc19zdGFja19jaHVua19udW1fc3RyaXBlcyhjaHVuayk7CisJCQlsZW4gKz0gYnRyZnNfY2h1bmtfaXRlbV9zaXplKG51bV9zdHJpcGVzKTsKKwkJfSBlbHNlIHsKKwkJCXJldCA9IC1FSU87CisJCQlicmVhazsKKwkJfQorCQlpZiAoa2V5Lm9iamVjdGlkID09IGNodW5rX29iamVjdGlkICYmCisJCSAgICBrZXkub2Zmc2V0ID09IGNodW5rX29mZnNldCkgeworCQkJbWVtbW92ZShwdHIsIHB0ciArIGxlbiwgYXJyYXlfc2l6ZSAtIChjdXIgKyBsZW4pKTsKKwkJCWFycmF5X3NpemUgLT0gbGVuOworCQkJYnRyZnNfc2V0X3N1cGVyX3N5c19hcnJheV9zaXplKHN1cGVyX2NvcHksIGFycmF5X3NpemUpOworCQl9IGVsc2UgeworCQkJcHRyICs9IGxlbjsKKwkJCWN1ciArPSBsZW47CisJCX0KKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBidHJmc19yZWxvY2F0ZV9jaHVuayhzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwKKwkJCSB1NjQgY2h1bmtfdHJlZSwgdTY0IGNodW5rX29iamVjdGlkLAorCQkJIHU2NCBjaHVua19vZmZzZXQpCit7CisJc3RydWN0IGV4dGVudF9tYXBfdHJlZSAqZW1fdHJlZTsKKwlzdHJ1Y3QgYnRyZnNfcm9vdCAqZXh0ZW50X3Jvb3Q7CisJc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnM7CisJc3RydWN0IGV4dGVudF9tYXAgKmVtOworCXN0cnVjdCBtYXBfbG9va3VwICptYXA7CisJaW50IHJldDsKKwlpbnQgaTsKKworCXByaW50ayhLRVJOX0lORk8gImJ0cmZzIHJlbG9jYXRpbmcgY2h1bmsgJWxsdVxuIiwKKwkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyljaHVua19vZmZzZXQpOworCXJvb3QgPSByb290LT5mc19pbmZvLT5jaHVua19yb290OworCWV4dGVudF9yb290ID0gcm9vdC0+ZnNfaW5mby0+ZXh0ZW50X3Jvb3Q7CisJZW1fdHJlZSA9ICZyb290LT5mc19pbmZvLT5tYXBwaW5nX3RyZWUubWFwX3RyZWU7CisKKwkvKiBzdGVwIG9uZSwgcmVsb2NhdGUgYWxsIHRoZSBleHRlbnRzIGluc2lkZSB0aGlzIGNodW5rICovCisJcmV0ID0gYnRyZnNfcmVsb2NhdGVfYmxvY2tfZ3JvdXAoZXh0ZW50X3Jvb3QsIGNodW5rX29mZnNldCk7CisJQlVHX09OKHJldCk7CisKKwl0cmFucyA9IGJ0cmZzX3N0YXJ0X3RyYW5zYWN0aW9uKHJvb3QsIDEpOworCUJVR19PTighdHJhbnMpOworCisJbG9ja19jaHVua3Mocm9vdCk7CisKKwkvKgorCSAqIHN0ZXAgdHdvLCBkZWxldGUgdGhlIGRldmljZSBleHRlbnRzIGFuZCB0aGUKKwkgKiBjaHVuayB0cmVlIGVudHJpZXMKKwkgKi8KKwlzcGluX2xvY2soJmVtX3RyZWUtPmxvY2spOworCWVtID0gbG9va3VwX2V4dGVudF9tYXBwaW5nKGVtX3RyZWUsIGNodW5rX29mZnNldCwgMSk7CisJc3Bpbl91bmxvY2soJmVtX3RyZWUtPmxvY2spOworCisJQlVHX09OKGVtLT5zdGFydCA+IGNodW5rX29mZnNldCB8fAorCSAgICAgICBlbS0+c3RhcnQgKyBlbS0+bGVuIDwgY2h1bmtfb2Zmc2V0KTsKKwltYXAgPSAoc3RydWN0IG1hcF9sb29rdXAgKillbS0+YmRldjsKKworCWZvciAoaSA9IDA7IGkgPCBtYXAtPm51bV9zdHJpcGVzOyBpKyspIHsKKwkJcmV0ID0gYnRyZnNfZnJlZV9kZXZfZXh0ZW50KHRyYW5zLCBtYXAtPnN0cmlwZXNbaV0uZGV2LAorCQkJCQkgICAgbWFwLT5zdHJpcGVzW2ldLnBoeXNpY2FsKTsKKwkJQlVHX09OKHJldCk7CisKKwkJaWYgKG1hcC0+c3RyaXBlc1tpXS5kZXYpIHsKKwkJCXJldCA9IGJ0cmZzX3VwZGF0ZV9kZXZpY2UodHJhbnMsIG1hcC0+c3RyaXBlc1tpXS5kZXYpOworCQkJQlVHX09OKHJldCk7CisJCX0KKwl9CisJcmV0ID0gYnRyZnNfZnJlZV9jaHVuayh0cmFucywgcm9vdCwgY2h1bmtfdHJlZSwgY2h1bmtfb2JqZWN0aWQsCisJCQkgICAgICAgY2h1bmtfb2Zmc2V0KTsKKworCUJVR19PTihyZXQpOworCisJaWYgKG1hcC0+dHlwZSAmIEJUUkZTX0JMT0NLX0dST1VQX1NZU1RFTSkgeworCQlyZXQgPSBidHJmc19kZWxfc3lzX2NodW5rKHJvb3QsIGNodW5rX29iamVjdGlkLCBjaHVua19vZmZzZXQpOworCQlCVUdfT04ocmV0KTsKKwl9CisKKwlyZXQgPSBidHJmc19yZW1vdmVfYmxvY2tfZ3JvdXAodHJhbnMsIGV4dGVudF9yb290LCBjaHVua19vZmZzZXQpOworCUJVR19PTihyZXQpOworCisJc3Bpbl9sb2NrKCZlbV90cmVlLT5sb2NrKTsKKwlyZW1vdmVfZXh0ZW50X21hcHBpbmcoZW1fdHJlZSwgZW0pOworCXNwaW5fdW5sb2NrKCZlbV90cmVlLT5sb2NrKTsKKworCWtmcmVlKG1hcCk7CisJZW0tPmJkZXYgPSBOVUxMOworCisJLyogb25jZSBmb3IgdGhlIHRyZWUgKi8KKwlmcmVlX2V4dGVudF9tYXAoZW0pOworCS8qIG9uY2UgZm9yIHVzICovCisJZnJlZV9leHRlbnRfbWFwKGVtKTsKKworCXVubG9ja19jaHVua3Mocm9vdCk7CisJYnRyZnNfZW5kX3RyYW5zYWN0aW9uKHRyYW5zLCByb290KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBidHJmc19yZWxvY2F0ZV9zeXNfY2h1bmtzKHN0cnVjdCBidHJmc19yb290ICpyb290KQoreworCXN0cnVjdCBidHJmc19yb290ICpjaHVua19yb290ID0gcm9vdC0+ZnNfaW5mby0+Y2h1bmtfcm9vdDsKKwlzdHJ1Y3QgYnRyZnNfcGF0aCAqcGF0aDsKKwlzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqbGVhZjsKKwlzdHJ1Y3QgYnRyZnNfY2h1bmsgKmNodW5rOworCXN0cnVjdCBidHJmc19rZXkga2V5OworCXN0cnVjdCBidHJmc19rZXkgZm91bmRfa2V5OworCXU2NCBjaHVua190cmVlID0gY2h1bmtfcm9vdC0+cm9vdF9rZXkub2JqZWN0aWQ7CisJdTY0IGNodW5rX3R5cGU7CisJaW50IHJldDsKKworCXBhdGggPSBidHJmc19hbGxvY19wYXRoKCk7CisJaWYgKCFwYXRoKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWtleS5vYmplY3RpZCA9IEJUUkZTX0ZJUlNUX0NIVU5LX1RSRUVfT0JKRUNUSUQ7CisJa2V5Lm9mZnNldCA9ICh1NjQpLTE7CisJa2V5LnR5cGUgPSBCVFJGU19DSFVOS19JVEVNX0tFWTsKKworCXdoaWxlICgxKSB7CisJCXJldCA9IGJ0cmZzX3NlYXJjaF9zbG90KE5VTEwsIGNodW5rX3Jvb3QsICZrZXksIHBhdGgsIDAsIDApOworCQlpZiAocmV0IDwgMCkKKwkJCWdvdG8gZXJyb3I7CisJCUJVR19PTihyZXQgPT0gMCk7CisKKwkJcmV0ID0gYnRyZnNfcHJldmlvdXNfaXRlbShjaHVua19yb290LCBwYXRoLCBrZXkub2JqZWN0aWQsCisJCQkJCSAga2V5LnR5cGUpOworCQlpZiAocmV0IDwgMCkKKwkJCWdvdG8gZXJyb3I7CisJCWlmIChyZXQgPiAwKQorCQkJYnJlYWs7CisKKwkJbGVhZiA9IHBhdGgtPm5vZGVzWzBdOworCQlidHJmc19pdGVtX2tleV90b19jcHUobGVhZiwgJmZvdW5kX2tleSwgcGF0aC0+c2xvdHNbMF0pOworCisJCWNodW5rID0gYnRyZnNfaXRlbV9wdHIobGVhZiwgcGF0aC0+c2xvdHNbMF0sCisJCQkJICAgICAgIHN0cnVjdCBidHJmc19jaHVuayk7CisJCWNodW5rX3R5cGUgPSBidHJmc19jaHVua190eXBlKGxlYWYsIGNodW5rKTsKKwkJYnRyZnNfcmVsZWFzZV9wYXRoKGNodW5rX3Jvb3QsIHBhdGgpOworCisJCWlmIChjaHVua190eXBlICYgQlRSRlNfQkxPQ0tfR1JPVVBfU1lTVEVNKSB7CisJCQlyZXQgPSBidHJmc19yZWxvY2F0ZV9jaHVuayhjaHVua19yb290LCBjaHVua190cmVlLAorCQkJCQkJICAgZm91bmRfa2V5Lm9iamVjdGlkLAorCQkJCQkJICAgZm91bmRfa2V5Lm9mZnNldCk7CisJCQlCVUdfT04ocmV0KTsKKwkJfQorCisJCWlmIChmb3VuZF9rZXkub2Zmc2V0ID09IDApCisJCQlicmVhazsKKwkJa2V5Lm9mZnNldCA9IGZvdW5kX2tleS5vZmZzZXQgLSAxOworCX0KKwlyZXQgPSAwOworZXJyb3I6CisJYnRyZnNfZnJlZV9wYXRoKHBhdGgpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB1NjQgZGl2X2ZhY3Rvcih1NjQgbnVtLCBpbnQgZmFjdG9yKQoreworCWlmIChmYWN0b3IgPT0gMTApCisJCXJldHVybiBudW07CisJbnVtICo9IGZhY3RvcjsKKwlkb19kaXYobnVtLCAxMCk7CisJcmV0dXJuIG51bTsKK30KKworaW50IGJ0cmZzX2JhbGFuY2Uoc3RydWN0IGJ0cmZzX3Jvb3QgKmRldl9yb290KQoreworCWludCByZXQ7CisJc3RydWN0IGxpc3RfaGVhZCAqY3VyOworCXN0cnVjdCBsaXN0X2hlYWQgKmRldmljZXMgPSAmZGV2X3Jvb3QtPmZzX2luZm8tPmZzX2RldmljZXMtPmRldmljZXM7CisJc3RydWN0IGJ0cmZzX2RldmljZSAqZGV2aWNlOworCXU2NCBvbGRfc2l6ZTsKKwl1NjQgc2l6ZV90b19mcmVlOworCXN0cnVjdCBidHJmc19wYXRoICpwYXRoOworCXN0cnVjdCBidHJmc19rZXkga2V5OworCXN0cnVjdCBidHJmc19jaHVuayAqY2h1bms7CisJc3RydWN0IGJ0cmZzX3Jvb3QgKmNodW5rX3Jvb3QgPSBkZXZfcm9vdC0+ZnNfaW5mby0+Y2h1bmtfcm9vdDsKKwlzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFuczsKKwlzdHJ1Y3QgYnRyZnNfa2V5IGZvdW5kX2tleTsKKworCWlmIChkZXZfcm9vdC0+ZnNfaW5mby0+c2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkpCisJCXJldHVybiAtRVJPRlM7CisKKwltdXRleF9sb2NrKCZkZXZfcm9vdC0+ZnNfaW5mby0+dm9sdW1lX211dGV4KTsKKwlkZXZfcm9vdCA9IGRldl9yb290LT5mc19pbmZvLT5kZXZfcm9vdDsKKworCS8qIHN0ZXAgb25lIG1ha2Ugc29tZSByb29tIG9uIGFsbCB0aGUgZGV2aWNlcyAqLworCWxpc3RfZm9yX2VhY2goY3VyLCBkZXZpY2VzKSB7CisJCWRldmljZSA9IGxpc3RfZW50cnkoY3VyLCBzdHJ1Y3QgYnRyZnNfZGV2aWNlLCBkZXZfbGlzdCk7CisJCW9sZF9zaXplID0gZGV2aWNlLT50b3RhbF9ieXRlczsKKwkJc2l6ZV90b19mcmVlID0gZGl2X2ZhY3RvcihvbGRfc2l6ZSwgMSk7CisJCXNpemVfdG9fZnJlZSA9IG1pbihzaXplX3RvX2ZyZWUsICh1NjQpMSAqIDEwMjQgKiAxMDI0KTsKKwkJaWYgKCFkZXZpY2UtPndyaXRlYWJsZSB8fAorCQkgICAgZGV2aWNlLT50b3RhbF9ieXRlcyAtIGRldmljZS0+Ynl0ZXNfdXNlZCA+IHNpemVfdG9fZnJlZSkKKwkJCWNvbnRpbnVlOworCisJCXJldCA9IGJ0cmZzX3Nocmlua19kZXZpY2UoZGV2aWNlLCBvbGRfc2l6ZSAtIHNpemVfdG9fZnJlZSk7CisJCUJVR19PTihyZXQpOworCisJCXRyYW5zID0gYnRyZnNfc3RhcnRfdHJhbnNhY3Rpb24oZGV2X3Jvb3QsIDEpOworCQlCVUdfT04oIXRyYW5zKTsKKworCQlyZXQgPSBidHJmc19ncm93X2RldmljZSh0cmFucywgZGV2aWNlLCBvbGRfc2l6ZSk7CisJCUJVR19PTihyZXQpOworCisJCWJ0cmZzX2VuZF90cmFuc2FjdGlvbih0cmFucywgZGV2X3Jvb3QpOworCX0KKworCS8qIHN0ZXAgdHdvLCByZWxvY2F0ZSBhbGwgdGhlIGNodW5rcyAqLworCXBhdGggPSBidHJmc19hbGxvY19wYXRoKCk7CisJQlVHX09OKCFwYXRoKTsKKworCWtleS5vYmplY3RpZCA9IEJUUkZTX0ZJUlNUX0NIVU5LX1RSRUVfT0JKRUNUSUQ7CisJa2V5Lm9mZnNldCA9ICh1NjQpLTE7CisJa2V5LnR5cGUgPSBCVFJGU19DSFVOS19JVEVNX0tFWTsKKworCXdoaWxlICgxKSB7CisJCXJldCA9IGJ0cmZzX3NlYXJjaF9zbG90KE5VTEwsIGNodW5rX3Jvb3QsICZrZXksIHBhdGgsIDAsIDApOworCQlpZiAocmV0IDwgMCkKKwkJCWdvdG8gZXJyb3I7CisKKwkJLyoKKwkJICogdGhpcyBzaG91bGRuJ3QgaGFwcGVuLCBpdCBtZWFucyB0aGUgbGFzdCByZWxvY2F0ZQorCQkgKiBmYWlsZWQKKwkJICovCisJCWlmIChyZXQgPT0gMCkKKwkJCWJyZWFrOworCisJCXJldCA9IGJ0cmZzX3ByZXZpb3VzX2l0ZW0oY2h1bmtfcm9vdCwgcGF0aCwgMCwKKwkJCQkJICBCVFJGU19DSFVOS19JVEVNX0tFWSk7CisJCWlmIChyZXQpCisJCQlicmVhazsKKworCQlidHJmc19pdGVtX2tleV90b19jcHUocGF0aC0+bm9kZXNbMF0sICZmb3VuZF9rZXksCisJCQkJICAgICAgcGF0aC0+c2xvdHNbMF0pOworCQlpZiAoZm91bmRfa2V5Lm9iamVjdGlkICE9IGtleS5vYmplY3RpZCkKKwkJCWJyZWFrOworCisJCWNodW5rID0gYnRyZnNfaXRlbV9wdHIocGF0aC0+bm9kZXNbMF0sCisJCQkJICAgICAgIHBhdGgtPnNsb3RzWzBdLAorCQkJCSAgICAgICBzdHJ1Y3QgYnRyZnNfY2h1bmspOworCQlrZXkub2Zmc2V0ID0gZm91bmRfa2V5Lm9mZnNldDsKKwkJLyogY2h1bmsgemVybyBpcyBzcGVjaWFsICovCisJCWlmIChrZXkub2Zmc2V0ID09IDApCisJCQlicmVhazsKKworCQlidHJmc19yZWxlYXNlX3BhdGgoY2h1bmtfcm9vdCwgcGF0aCk7CisJCXJldCA9IGJ0cmZzX3JlbG9jYXRlX2NodW5rKGNodW5rX3Jvb3QsCisJCQkJCSAgIGNodW5rX3Jvb3QtPnJvb3Rfa2V5Lm9iamVjdGlkLAorCQkJCQkgICBmb3VuZF9rZXkub2JqZWN0aWQsCisJCQkJCSAgIGZvdW5kX2tleS5vZmZzZXQpOworCQlCVUdfT04ocmV0KTsKKwl9CisJcmV0ID0gMDsKK2Vycm9yOgorCWJ0cmZzX2ZyZWVfcGF0aChwYXRoKTsKKwltdXRleF91bmxvY2soJmRldl9yb290LT5mc19pbmZvLT52b2x1bWVfbXV0ZXgpOworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBzaHJpbmtpbmcgYSBkZXZpY2UgbWVhbnMgZmluZGluZyBhbGwgb2YgdGhlIGRldmljZSBleHRlbnRzIHBhc3QKKyAqIHRoZSBuZXcgc2l6ZSwgYW5kIHRoZW4gZm9sbG93aW5nIHRoZSBiYWNrIHJlZnMgdG8gdGhlIGNodW5rcy4KKyAqIFRoZSBjaHVuayByZWxvY2F0aW9uIGNvZGUgYWN0dWFsbHkgZnJlZXMgdGhlIGRldmljZSBleHRlbnQKKyAqLworaW50IGJ0cmZzX3Nocmlua19kZXZpY2Uoc3RydWN0IGJ0cmZzX2RldmljZSAqZGV2aWNlLCB1NjQgbmV3X3NpemUpCit7CisJc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnM7CisJc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QgPSBkZXZpY2UtPmRldl9yb290OworCXN0cnVjdCBidHJmc19kZXZfZXh0ZW50ICpkZXZfZXh0ZW50ID0gTlVMTDsKKwlzdHJ1Y3QgYnRyZnNfcGF0aCAqcGF0aDsKKwl1NjQgbGVuZ3RoOworCXU2NCBjaHVua190cmVlOworCXU2NCBjaHVua19vYmplY3RpZDsKKwl1NjQgY2h1bmtfb2Zmc2V0OworCWludCByZXQ7CisJaW50IHNsb3Q7CisJc3RydWN0IGV4dGVudF9idWZmZXIgKmw7CisJc3RydWN0IGJ0cmZzX2tleSBrZXk7CisJc3RydWN0IGJ0cmZzX3N1cGVyX2Jsb2NrICpzdXBlcl9jb3B5ID0gJnJvb3QtPmZzX2luZm8tPnN1cGVyX2NvcHk7CisJdTY0IG9sZF90b3RhbCA9IGJ0cmZzX3N1cGVyX3RvdGFsX2J5dGVzKHN1cGVyX2NvcHkpOworCXU2NCBkaWZmID0gZGV2aWNlLT50b3RhbF9ieXRlcyAtIG5ld19zaXplOworCisJaWYgKG5ld19zaXplID49IGRldmljZS0+dG90YWxfYnl0ZXMpCisJCXJldHVybiAtRUlOVkFMOworCisJcGF0aCA9IGJ0cmZzX2FsbG9jX3BhdGgoKTsKKwlpZiAoIXBhdGgpCisJCXJldHVybiAtRU5PTUVNOworCisJdHJhbnMgPSBidHJmc19zdGFydF90cmFuc2FjdGlvbihyb290LCAxKTsKKwlpZiAoIXRyYW5zKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZG9uZTsKKwl9CisKKwlwYXRoLT5yZWFkYSA9IDI7CisKKwlsb2NrX2NodW5rcyhyb290KTsKKworCWRldmljZS0+dG90YWxfYnl0ZXMgPSBuZXdfc2l6ZTsKKwlpZiAoZGV2aWNlLT53cml0ZWFibGUpCisJCWRldmljZS0+ZnNfZGV2aWNlcy0+dG90YWxfcndfYnl0ZXMgLT0gZGlmZjsKKwlyZXQgPSBidHJmc191cGRhdGVfZGV2aWNlKHRyYW5zLCBkZXZpY2UpOworCWlmIChyZXQpIHsKKwkJdW5sb2NrX2NodW5rcyhyb290KTsKKwkJYnRyZnNfZW5kX3RyYW5zYWN0aW9uKHRyYW5zLCByb290KTsKKwkJZ290byBkb25lOworCX0KKwlXQVJOX09OKGRpZmYgPiBvbGRfdG90YWwpOworCWJ0cmZzX3NldF9zdXBlcl90b3RhbF9ieXRlcyhzdXBlcl9jb3B5LCBvbGRfdG90YWwgLSBkaWZmKTsKKwl1bmxvY2tfY2h1bmtzKHJvb3QpOworCWJ0cmZzX2VuZF90cmFuc2FjdGlvbih0cmFucywgcm9vdCk7CisKKwlrZXkub2JqZWN0aWQgPSBkZXZpY2UtPmRldmlkOworCWtleS5vZmZzZXQgPSAodTY0KS0xOworCWtleS50eXBlID0gQlRSRlNfREVWX0VYVEVOVF9LRVk7CisKKwl3aGlsZSAoMSkgeworCQlyZXQgPSBidHJmc19zZWFyY2hfc2xvdChOVUxMLCByb290LCAma2V5LCBwYXRoLCAwLCAwKTsKKwkJaWYgKHJldCA8IDApCisJCQlnb3RvIGRvbmU7CisKKwkJcmV0ID0gYnRyZnNfcHJldmlvdXNfaXRlbShyb290LCBwYXRoLCAwLCBrZXkudHlwZSk7CisJCWlmIChyZXQgPCAwKQorCQkJZ290byBkb25lOworCQlpZiAocmV0KSB7CisJCQlyZXQgPSAwOworCQkJZ290byBkb25lOworCQl9CisKKwkJbCA9IHBhdGgtPm5vZGVzWzBdOworCQlzbG90ID0gcGF0aC0+c2xvdHNbMF07CisJCWJ0cmZzX2l0ZW1fa2V5X3RvX2NwdShsLCAma2V5LCBwYXRoLT5zbG90c1swXSk7CisKKwkJaWYgKGtleS5vYmplY3RpZCAhPSBkZXZpY2UtPmRldmlkKQorCQkJZ290byBkb25lOworCisJCWRldl9leHRlbnQgPSBidHJmc19pdGVtX3B0cihsLCBzbG90LCBzdHJ1Y3QgYnRyZnNfZGV2X2V4dGVudCk7CisJCWxlbmd0aCA9IGJ0cmZzX2Rldl9leHRlbnRfbGVuZ3RoKGwsIGRldl9leHRlbnQpOworCisJCWlmIChrZXkub2Zmc2V0ICsgbGVuZ3RoIDw9IG5ld19zaXplKQorCQkJZ290byBkb25lOworCisJCWNodW5rX3RyZWUgPSBidHJmc19kZXZfZXh0ZW50X2NodW5rX3RyZWUobCwgZGV2X2V4dGVudCk7CisJCWNodW5rX29iamVjdGlkID0gYnRyZnNfZGV2X2V4dGVudF9jaHVua19vYmplY3RpZChsLCBkZXZfZXh0ZW50KTsKKwkJY2h1bmtfb2Zmc2V0ID0gYnRyZnNfZGV2X2V4dGVudF9jaHVua19vZmZzZXQobCwgZGV2X2V4dGVudCk7CisJCWJ0cmZzX3JlbGVhc2VfcGF0aChyb290LCBwYXRoKTsKKworCQlyZXQgPSBidHJmc19yZWxvY2F0ZV9jaHVuayhyb290LCBjaHVua190cmVlLCBjaHVua19vYmplY3RpZCwKKwkJCQkJICAgY2h1bmtfb2Zmc2V0KTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZG9uZTsKKwl9CisKK2RvbmU6CisJYnRyZnNfZnJlZV9wYXRoKHBhdGgpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYnRyZnNfYWRkX3N5c3RlbV9jaHVuayhzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKKwkJCSAgIHN0cnVjdCBidHJmc19yb290ICpyb290LAorCQkJICAgc3RydWN0IGJ0cmZzX2tleSAqa2V5LAorCQkJICAgc3RydWN0IGJ0cmZzX2NodW5rICpjaHVuaywgaW50IGl0ZW1fc2l6ZSkKK3sKKwlzdHJ1Y3QgYnRyZnNfc3VwZXJfYmxvY2sgKnN1cGVyX2NvcHkgPSAmcm9vdC0+ZnNfaW5mby0+c3VwZXJfY29weTsKKwlzdHJ1Y3QgYnRyZnNfZGlza19rZXkgZGlza19rZXk7CisJdTMyIGFycmF5X3NpemU7CisJdTggKnB0cjsKKworCWFycmF5X3NpemUgPSBidHJmc19zdXBlcl9zeXNfYXJyYXlfc2l6ZShzdXBlcl9jb3B5KTsKKwlpZiAoYXJyYXlfc2l6ZSArIGl0ZW1fc2l6ZSA+IEJUUkZTX1NZU1RFTV9DSFVOS19BUlJBWV9TSVpFKQorCQlyZXR1cm4gLUVGQklHOworCisJcHRyID0gc3VwZXJfY29weS0+c3lzX2NodW5rX2FycmF5ICsgYXJyYXlfc2l6ZTsKKwlidHJmc19jcHVfa2V5X3RvX2Rpc2soJmRpc2tfa2V5LCBrZXkpOworCW1lbWNweShwdHIsICZkaXNrX2tleSwgc2l6ZW9mKGRpc2tfa2V5KSk7CisJcHRyICs9IHNpemVvZihkaXNrX2tleSk7CisJbWVtY3B5KHB0ciwgY2h1bmssIGl0ZW1fc2l6ZSk7CisJaXRlbV9zaXplICs9IHNpemVvZihkaXNrX2tleSk7CisJYnRyZnNfc2V0X3N1cGVyX3N5c19hcnJheV9zaXplKHN1cGVyX2NvcHksIGFycmF5X3NpemUgKyBpdGVtX3NpemUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgbm9pbmxpbmUgdTY0IGNodW5rX2J5dGVzX2J5X3R5cGUodTY0IHR5cGUsIHU2NCBjYWxjX3NpemUsCisJCQkJCWludCBudW1fc3RyaXBlcywgaW50IHN1Yl9zdHJpcGVzKQoreworCWlmICh0eXBlICYgKEJUUkZTX0JMT0NLX0dST1VQX1JBSUQxIHwgQlRSRlNfQkxPQ0tfR1JPVVBfRFVQKSkKKwkJcmV0dXJuIGNhbGNfc2l6ZTsKKwllbHNlIGlmICh0eXBlICYgQlRSRlNfQkxPQ0tfR1JPVVBfUkFJRDEwKQorCQlyZXR1cm4gY2FsY19zaXplICogKG51bV9zdHJpcGVzIC8gc3ViX3N0cmlwZXMpOworCWVsc2UKKwkJcmV0dXJuIGNhbGNfc2l6ZSAqIG51bV9zdHJpcGVzOworfQorCitzdGF0aWMgaW50IF9fYnRyZnNfYWxsb2NfY2h1bmsoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCisJCQkgICAgICAgc3RydWN0IGJ0cmZzX3Jvb3QgKmV4dGVudF9yb290LAorCQkJICAgICAgIHN0cnVjdCBtYXBfbG9va3VwICoqbWFwX3JldCwKKwkJCSAgICAgICB1NjQgKm51bV9ieXRlcywgdTY0ICpzdHJpcGVfc2l6ZSwKKwkJCSAgICAgICB1NjQgc3RhcnQsIHU2NCB0eXBlKQoreworCXN0cnVjdCBidHJmc19mc19pbmZvICppbmZvID0gZXh0ZW50X3Jvb3QtPmZzX2luZm87CisJc3RydWN0IGJ0cmZzX2RldmljZSAqZGV2aWNlID0gTlVMTDsKKwlzdHJ1Y3QgYnRyZnNfZnNfZGV2aWNlcyAqZnNfZGV2aWNlcyA9IGluZm8tPmZzX2RldmljZXM7CisJc3RydWN0IGxpc3RfaGVhZCAqY3VyOworCXN0cnVjdCBtYXBfbG9va3VwICptYXAgPSBOVUxMOworCXN0cnVjdCBleHRlbnRfbWFwX3RyZWUgKmVtX3RyZWU7CisJc3RydWN0IGV4dGVudF9tYXAgKmVtOworCXN0cnVjdCBsaXN0X2hlYWQgcHJpdmF0ZV9kZXZzOworCWludCBtaW5fc3RyaXBlX3NpemUgPSAxICogMTAyNCAqIDEwMjQ7CisJdTY0IGNhbGNfc2l6ZSA9IDEwMjQgKiAxMDI0ICogMTAyNDsKKwl1NjQgbWF4X2NodW5rX3NpemUgPSBjYWxjX3NpemU7CisJdTY0IG1pbl9mcmVlOworCXU2NCBhdmFpbDsKKwl1NjQgbWF4X2F2YWlsID0gMDsKKwl1NjQgZGV2X29mZnNldDsKKwlpbnQgbnVtX3N0cmlwZXMgPSAxOworCWludCBtaW5fc3RyaXBlcyA9IDE7CisJaW50IHN1Yl9zdHJpcGVzID0gMDsKKwlpbnQgbG9vcGVkID0gMDsKKwlpbnQgcmV0OworCWludCBpbmRleDsKKwlpbnQgc3RyaXBlX2xlbiA9IDY0ICogMTAyNDsKKworCWlmICgodHlwZSAmIEJUUkZTX0JMT0NLX0dST1VQX1JBSUQxKSAmJgorCSAgICAodHlwZSAmIEJUUkZTX0JMT0NLX0dST1VQX0RVUCkpIHsKKwkJV0FSTl9PTigxKTsKKwkJdHlwZSAmPSB+QlRSRlNfQkxPQ0tfR1JPVVBfRFVQOworCX0KKwlpZiAobGlzdF9lbXB0eSgmZnNfZGV2aWNlcy0+YWxsb2NfbGlzdCkpCisJCXJldHVybiAtRU5PU1BDOworCisJaWYgKHR5cGUgJiAoQlRSRlNfQkxPQ0tfR1JPVVBfUkFJRDApKSB7CisJCW51bV9zdHJpcGVzID0gZnNfZGV2aWNlcy0+cndfZGV2aWNlczsKKwkJbWluX3N0cmlwZXMgPSAyOworCX0KKwlpZiAodHlwZSAmIChCVFJGU19CTE9DS19HUk9VUF9EVVApKSB7CisJCW51bV9zdHJpcGVzID0gMjsKKwkJbWluX3N0cmlwZXMgPSAyOworCX0KKwlpZiAodHlwZSAmIChCVFJGU19CTE9DS19HUk9VUF9SQUlEMSkpIHsKKwkJbnVtX3N0cmlwZXMgPSBtaW5fdCh1NjQsIDIsIGZzX2RldmljZXMtPnJ3X2RldmljZXMpOworCQlpZiAobnVtX3N0cmlwZXMgPCAyKQorCQkJcmV0dXJuIC1FTk9TUEM7CisJCW1pbl9zdHJpcGVzID0gMjsKKwl9CisJaWYgKHR5cGUgJiAoQlRSRlNfQkxPQ0tfR1JPVVBfUkFJRDEwKSkgeworCQludW1fc3RyaXBlcyA9IGZzX2RldmljZXMtPnJ3X2RldmljZXM7CisJCWlmIChudW1fc3RyaXBlcyA8IDQpCisJCQlyZXR1cm4gLUVOT1NQQzsKKwkJbnVtX3N0cmlwZXMgJj0gfih1MzIpMTsKKwkJc3ViX3N0cmlwZXMgPSAyOworCQltaW5fc3RyaXBlcyA9IDQ7CisJfQorCisJaWYgKHR5cGUgJiBCVFJGU19CTE9DS19HUk9VUF9EQVRBKSB7CisJCW1heF9jaHVua19zaXplID0gMTAgKiBjYWxjX3NpemU7CisJCW1pbl9zdHJpcGVfc2l6ZSA9IDY0ICogMTAyNCAqIDEwMjQ7CisJfSBlbHNlIGlmICh0eXBlICYgQlRSRlNfQkxPQ0tfR1JPVVBfTUVUQURBVEEpIHsKKwkJbWF4X2NodW5rX3NpemUgPSA0ICogY2FsY19zaXplOworCQltaW5fc3RyaXBlX3NpemUgPSAzMiAqIDEwMjQgKiAxMDI0OworCX0gZWxzZSBpZiAodHlwZSAmIEJUUkZTX0JMT0NLX0dST1VQX1NZU1RFTSkgeworCQljYWxjX3NpemUgPSA4ICogMTAyNCAqIDEwMjQ7CisJCW1heF9jaHVua19zaXplID0gY2FsY19zaXplICogMjsKKwkJbWluX3N0cmlwZV9zaXplID0gMSAqIDEwMjQgKiAxMDI0OworCX0KKworCS8qIHdlIGRvbid0IHdhbnQgYSBjaHVuayBsYXJnZXIgdGhhbiAxMCUgb2Ygd3JpdGVhYmxlIHNwYWNlICovCisJbWF4X2NodW5rX3NpemUgPSBtaW4oZGl2X2ZhY3Rvcihmc19kZXZpY2VzLT50b3RhbF9yd19ieXRlcywgMSksCisJCQkgICAgIG1heF9jaHVua19zaXplKTsKKworYWdhaW46CisJaWYgKCFtYXAgfHwgbWFwLT5udW1fc3RyaXBlcyAhPSBudW1fc3RyaXBlcykgeworCQlrZnJlZShtYXApOworCQltYXAgPSBrbWFsbG9jKG1hcF9sb29rdXBfc2l6ZShudW1fc3RyaXBlcyksIEdGUF9OT0ZTKTsKKwkJaWYgKCFtYXApCisJCQlyZXR1cm4gLUVOT01FTTsKKwkJbWFwLT5udW1fc3RyaXBlcyA9IG51bV9zdHJpcGVzOworCX0KKworCWlmIChjYWxjX3NpemUgKiBudW1fc3RyaXBlcyA+IG1heF9jaHVua19zaXplKSB7CisJCWNhbGNfc2l6ZSA9IG1heF9jaHVua19zaXplOworCQlkb19kaXYoY2FsY19zaXplLCBudW1fc3RyaXBlcyk7CisJCWRvX2RpdihjYWxjX3NpemUsIHN0cmlwZV9sZW4pOworCQljYWxjX3NpemUgKj0gc3RyaXBlX2xlbjsKKwl9CisJLyogd2UgZG9uJ3Qgd2FudCB0aW55IHN0cmlwZXMgKi8KKwljYWxjX3NpemUgPSBtYXhfdCh1NjQsIG1pbl9zdHJpcGVfc2l6ZSwgY2FsY19zaXplKTsKKworCWRvX2RpdihjYWxjX3NpemUsIHN0cmlwZV9sZW4pOworCWNhbGNfc2l6ZSAqPSBzdHJpcGVfbGVuOworCisJY3VyID0gZnNfZGV2aWNlcy0+YWxsb2NfbGlzdC5uZXh0OworCWluZGV4ID0gMDsKKworCWlmICh0eXBlICYgQlRSRlNfQkxPQ0tfR1JPVVBfRFVQKQorCQltaW5fZnJlZSA9IGNhbGNfc2l6ZSAqIDI7CisJZWxzZQorCQltaW5fZnJlZSA9IGNhbGNfc2l6ZTsKKworCS8qCisJICogd2UgYWRkIDFNQiBiZWNhdXNlIHdlIG5ldmVyIHVzZSB0aGUgZmlyc3QgMU1CIG9mIHRoZSBkZXZpY2UsIHVubGVzcworCSAqIHdlJ3ZlIGxvb3BlZCwgdGhlbiB3ZSBhcmUgbGlrZWx5IGFsbG9jYXRpbmcgdGhlIG1heGltdW0gYW1vdW50IG9mCisJICogc3BhY2UgbGVmdCBhbHJlYWR5CisJICovCisJaWYgKCFsb29wZWQpCisJCW1pbl9mcmVlICs9IDEwMjQgKiAxMDI0OworCisJSU5JVF9MSVNUX0hFQUQoJnByaXZhdGVfZGV2cyk7CisJd2hpbGUgKGluZGV4IDwgbnVtX3N0cmlwZXMpIHsKKwkJZGV2aWNlID0gbGlzdF9lbnRyeShjdXIsIHN0cnVjdCBidHJmc19kZXZpY2UsIGRldl9hbGxvY19saXN0KTsKKwkJQlVHX09OKCFkZXZpY2UtPndyaXRlYWJsZSk7CisJCWlmIChkZXZpY2UtPnRvdGFsX2J5dGVzID4gZGV2aWNlLT5ieXRlc191c2VkKQorCQkJYXZhaWwgPSBkZXZpY2UtPnRvdGFsX2J5dGVzIC0gZGV2aWNlLT5ieXRlc191c2VkOworCQllbHNlCisJCQlhdmFpbCA9IDA7CisJCWN1ciA9IGN1ci0+bmV4dDsKKworCQlpZiAoZGV2aWNlLT5pbl9mc19tZXRhZGF0YSAmJiBhdmFpbCA+PSBtaW5fZnJlZSkgeworCQkJcmV0ID0gZmluZF9mcmVlX2Rldl9leHRlbnQodHJhbnMsIGRldmljZSwKKwkJCQkJCSAgIG1pbl9mcmVlLCAmZGV2X29mZnNldCk7CisJCQlpZiAocmV0ID09IDApIHsKKwkJCQlsaXN0X21vdmVfdGFpbCgmZGV2aWNlLT5kZXZfYWxsb2NfbGlzdCwKKwkJCQkJICAgICAgICZwcml2YXRlX2RldnMpOworCQkJCW1hcC0+c3RyaXBlc1tpbmRleF0uZGV2ID0gZGV2aWNlOworCQkJCW1hcC0+c3RyaXBlc1tpbmRleF0ucGh5c2ljYWwgPSBkZXZfb2Zmc2V0OworCQkJCWluZGV4Kys7CisJCQkJaWYgKHR5cGUgJiBCVFJGU19CTE9DS19HUk9VUF9EVVApIHsKKwkJCQkJbWFwLT5zdHJpcGVzW2luZGV4XS5kZXYgPSBkZXZpY2U7CisJCQkJCW1hcC0+c3RyaXBlc1tpbmRleF0ucGh5c2ljYWwgPQorCQkJCQkJZGV2X29mZnNldCArIGNhbGNfc2l6ZTsKKwkJCQkJaW5kZXgrKzsKKwkJCQl9CisJCQl9CisJCX0gZWxzZSBpZiAoZGV2aWNlLT5pbl9mc19tZXRhZGF0YSAmJiBhdmFpbCA+IG1heF9hdmFpbCkKKwkJCW1heF9hdmFpbCA9IGF2YWlsOworCQlpZiAoY3VyID09ICZmc19kZXZpY2VzLT5hbGxvY19saXN0KQorCQkJYnJlYWs7CisJfQorCWxpc3Rfc3BsaWNlKCZwcml2YXRlX2RldnMsICZmc19kZXZpY2VzLT5hbGxvY19saXN0KTsKKwlpZiAoaW5kZXggPCBudW1fc3RyaXBlcykgeworCQlpZiAoaW5kZXggPj0gbWluX3N0cmlwZXMpIHsKKwkJCW51bV9zdHJpcGVzID0gaW5kZXg7CisJCQlpZiAodHlwZSAmIChCVFJGU19CTE9DS19HUk9VUF9SQUlEMTApKSB7CisJCQkJbnVtX3N0cmlwZXMgLz0gc3ViX3N0cmlwZXM7CisJCQkJbnVtX3N0cmlwZXMgKj0gc3ViX3N0cmlwZXM7CisJCQl9CisJCQlsb29wZWQgPSAxOworCQkJZ290byBhZ2FpbjsKKwkJfQorCQlpZiAoIWxvb3BlZCAmJiBtYXhfYXZhaWwgPiAwKSB7CisJCQlsb29wZWQgPSAxOworCQkJY2FsY19zaXplID0gbWF4X2F2YWlsOworCQkJZ290byBhZ2FpbjsKKwkJfQorCQlrZnJlZShtYXApOworCQlyZXR1cm4gLUVOT1NQQzsKKwl9CisJbWFwLT5zZWN0b3Jfc2l6ZSA9IGV4dGVudF9yb290LT5zZWN0b3JzaXplOworCW1hcC0+c3RyaXBlX2xlbiA9IHN0cmlwZV9sZW47CisJbWFwLT5pb19hbGlnbiA9IHN0cmlwZV9sZW47CisJbWFwLT5pb193aWR0aCA9IHN0cmlwZV9sZW47CisJbWFwLT50eXBlID0gdHlwZTsKKwltYXAtPm51bV9zdHJpcGVzID0gbnVtX3N0cmlwZXM7CisJbWFwLT5zdWJfc3RyaXBlcyA9IHN1Yl9zdHJpcGVzOworCisJKm1hcF9yZXQgPSBtYXA7CisJKnN0cmlwZV9zaXplID0gY2FsY19zaXplOworCSpudW1fYnl0ZXMgPSBjaHVua19ieXRlc19ieV90eXBlKHR5cGUsIGNhbGNfc2l6ZSwKKwkJCQkJIG51bV9zdHJpcGVzLCBzdWJfc3RyaXBlcyk7CisKKwllbSA9IGFsbG9jX2V4dGVudF9tYXAoR0ZQX05PRlMpOworCWlmICghZW0pIHsKKwkJa2ZyZWUobWFwKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCWVtLT5iZGV2ID0gKHN0cnVjdCBibG9ja19kZXZpY2UgKiltYXA7CisJZW0tPnN0YXJ0ID0gc3RhcnQ7CisJZW0tPmxlbiA9ICpudW1fYnl0ZXM7CisJZW0tPmJsb2NrX3N0YXJ0ID0gMDsKKwllbS0+YmxvY2tfbGVuID0gZW0tPmxlbjsKKworCWVtX3RyZWUgPSAmZXh0ZW50X3Jvb3QtPmZzX2luZm8tPm1hcHBpbmdfdHJlZS5tYXBfdHJlZTsKKwlzcGluX2xvY2soJmVtX3RyZWUtPmxvY2spOworCXJldCA9IGFkZF9leHRlbnRfbWFwcGluZyhlbV90cmVlLCBlbSk7CisJc3Bpbl91bmxvY2soJmVtX3RyZWUtPmxvY2spOworCUJVR19PTihyZXQpOworCWZyZWVfZXh0ZW50X21hcChlbSk7CisKKwlyZXQgPSBidHJmc19tYWtlX2Jsb2NrX2dyb3VwKHRyYW5zLCBleHRlbnRfcm9vdCwgMCwgdHlwZSwKKwkJCQkgICAgIEJUUkZTX0ZJUlNUX0NIVU5LX1RSRUVfT0JKRUNUSUQsCisJCQkJICAgICBzdGFydCwgKm51bV9ieXRlcyk7CisJQlVHX09OKHJldCk7CisKKwlpbmRleCA9IDA7CisJd2hpbGUgKGluZGV4IDwgbWFwLT5udW1fc3RyaXBlcykgeworCQlkZXZpY2UgPSBtYXAtPnN0cmlwZXNbaW5kZXhdLmRldjsKKwkJZGV2X29mZnNldCA9IG1hcC0+c3RyaXBlc1tpbmRleF0ucGh5c2ljYWw7CisKKwkJcmV0ID0gYnRyZnNfYWxsb2NfZGV2X2V4dGVudCh0cmFucywgZGV2aWNlLAorCQkJCWluZm8tPmNodW5rX3Jvb3QtPnJvb3Rfa2V5Lm9iamVjdGlkLAorCQkJCUJUUkZTX0ZJUlNUX0NIVU5LX1RSRUVfT0JKRUNUSUQsCisJCQkJc3RhcnQsIGRldl9vZmZzZXQsIGNhbGNfc2l6ZSk7CisJCUJVR19PTihyZXQpOworCQlpbmRleCsrOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9fZmluaXNoX2NodW5rX2FsbG9jKHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAorCQkJCXN0cnVjdCBidHJmc19yb290ICpleHRlbnRfcm9vdCwKKwkJCQlzdHJ1Y3QgbWFwX2xvb2t1cCAqbWFwLCB1NjQgY2h1bmtfb2Zmc2V0LAorCQkJCXU2NCBjaHVua19zaXplLCB1NjQgc3RyaXBlX3NpemUpCit7CisJdTY0IGRldl9vZmZzZXQ7CisJc3RydWN0IGJ0cmZzX2tleSBrZXk7CisJc3RydWN0IGJ0cmZzX3Jvb3QgKmNodW5rX3Jvb3QgPSBleHRlbnRfcm9vdC0+ZnNfaW5mby0+Y2h1bmtfcm9vdDsKKwlzdHJ1Y3QgYnRyZnNfZGV2aWNlICpkZXZpY2U7CisJc3RydWN0IGJ0cmZzX2NodW5rICpjaHVuazsKKwlzdHJ1Y3QgYnRyZnNfc3RyaXBlICpzdHJpcGU7CisJc2l6ZV90IGl0ZW1fc2l6ZSA9IGJ0cmZzX2NodW5rX2l0ZW1fc2l6ZShtYXAtPm51bV9zdHJpcGVzKTsKKwlpbnQgaW5kZXggPSAwOworCWludCByZXQ7CisKKwljaHVuayA9IGt6YWxsb2MoaXRlbV9zaXplLCBHRlBfTk9GUyk7CisJaWYgKCFjaHVuaykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpbmRleCA9IDA7CisJd2hpbGUgKGluZGV4IDwgbWFwLT5udW1fc3RyaXBlcykgeworCQlkZXZpY2UgPSBtYXAtPnN0cmlwZXNbaW5kZXhdLmRldjsKKwkJZGV2aWNlLT5ieXRlc191c2VkICs9IHN0cmlwZV9zaXplOworCQlyZXQgPSBidHJmc191cGRhdGVfZGV2aWNlKHRyYW5zLCBkZXZpY2UpOworCQlCVUdfT04ocmV0KTsKKwkJaW5kZXgrKzsKKwl9CisKKwlpbmRleCA9IDA7CisJc3RyaXBlID0gJmNodW5rLT5zdHJpcGU7CisJd2hpbGUgKGluZGV4IDwgbWFwLT5udW1fc3RyaXBlcykgeworCQlkZXZpY2UgPSBtYXAtPnN0cmlwZXNbaW5kZXhdLmRldjsKKwkJZGV2X29mZnNldCA9IG1hcC0+c3RyaXBlc1tpbmRleF0ucGh5c2ljYWw7CisKKwkJYnRyZnNfc2V0X3N0YWNrX3N0cmlwZV9kZXZpZChzdHJpcGUsIGRldmljZS0+ZGV2aWQpOworCQlidHJmc19zZXRfc3RhY2tfc3RyaXBlX29mZnNldChzdHJpcGUsIGRldl9vZmZzZXQpOworCQltZW1jcHkoc3RyaXBlLT5kZXZfdXVpZCwgZGV2aWNlLT51dWlkLCBCVFJGU19VVUlEX1NJWkUpOworCQlzdHJpcGUrKzsKKwkJaW5kZXgrKzsKKwl9CisKKwlidHJmc19zZXRfc3RhY2tfY2h1bmtfbGVuZ3RoKGNodW5rLCBjaHVua19zaXplKTsKKwlidHJmc19zZXRfc3RhY2tfY2h1bmtfb3duZXIoY2h1bmssIGV4dGVudF9yb290LT5yb290X2tleS5vYmplY3RpZCk7CisJYnRyZnNfc2V0X3N0YWNrX2NodW5rX3N0cmlwZV9sZW4oY2h1bmssIG1hcC0+c3RyaXBlX2xlbik7CisJYnRyZnNfc2V0X3N0YWNrX2NodW5rX3R5cGUoY2h1bmssIG1hcC0+dHlwZSk7CisJYnRyZnNfc2V0X3N0YWNrX2NodW5rX251bV9zdHJpcGVzKGNodW5rLCBtYXAtPm51bV9zdHJpcGVzKTsKKwlidHJmc19zZXRfc3RhY2tfY2h1bmtfaW9fYWxpZ24oY2h1bmssIG1hcC0+c3RyaXBlX2xlbik7CisJYnRyZnNfc2V0X3N0YWNrX2NodW5rX2lvX3dpZHRoKGNodW5rLCBtYXAtPnN0cmlwZV9sZW4pOworCWJ0cmZzX3NldF9zdGFja19jaHVua19zZWN0b3Jfc2l6ZShjaHVuaywgZXh0ZW50X3Jvb3QtPnNlY3RvcnNpemUpOworCWJ0cmZzX3NldF9zdGFja19jaHVua19zdWJfc3RyaXBlcyhjaHVuaywgbWFwLT5zdWJfc3RyaXBlcyk7CisKKwlrZXkub2JqZWN0aWQgPSBCVFJGU19GSVJTVF9DSFVOS19UUkVFX09CSkVDVElEOworCWtleS50eXBlID0gQlRSRlNfQ0hVTktfSVRFTV9LRVk7CisJa2V5Lm9mZnNldCA9IGNodW5rX29mZnNldDsKKworCXJldCA9IGJ0cmZzX2luc2VydF9pdGVtKHRyYW5zLCBjaHVua19yb290LCAma2V5LCBjaHVuaywgaXRlbV9zaXplKTsKKwlCVUdfT04ocmV0KTsKKworCWlmIChtYXAtPnR5cGUgJiBCVFJGU19CTE9DS19HUk9VUF9TWVNURU0pIHsKKwkJcmV0ID0gYnRyZnNfYWRkX3N5c3RlbV9jaHVuayh0cmFucywgY2h1bmtfcm9vdCwgJmtleSwgY2h1bmssCisJCQkJCSAgICAgaXRlbV9zaXplKTsKKwkJQlVHX09OKHJldCk7CisJfQorCWtmcmVlKGNodW5rKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIENodW5rIGFsbG9jYXRpb24gZmFsbHMgaW50byB0d28gcGFydHMuIFRoZSBmaXJzdCBwYXJ0IGRvZXMgd29ya3MKKyAqIHRoYXQgbWFrZSB0aGUgbmV3IGFsbG9jYXRlZCBjaHVuayB1c2VhYmxlLCBidXQgbm90IGRvIGFueSBvcGVyYXRpb24KKyAqIHRoYXQgbW9kaWZpZXMgdGhlIGNodW5rIHRyZWUuIFRoZSBzZWNvbmQgcGFydCBkb2VzIHRoZSB3b3JrcyB0aGF0CisgKiByZXF1aXJlIG1vZGlmeWluZyB0aGUgY2h1bmsgdHJlZS4gVGhpcyBkaXZpc2lvbiBpcyBpbXBvcnRhbnQgZm9yIHRoZQorICogYm9vdHN0cmFwIHByb2Nlc3Mgb2YgYWRkaW5nIHN0b3JhZ2UgdG8gYSBzZWVkIGJ0cmZzLgorICovCitpbnQgYnRyZnNfYWxsb2NfY2h1bmsoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCisJCSAgICAgIHN0cnVjdCBidHJmc19yb290ICpleHRlbnRfcm9vdCwgdTY0IHR5cGUpCit7CisJdTY0IGNodW5rX29mZnNldDsKKwl1NjQgY2h1bmtfc2l6ZTsKKwl1NjQgc3RyaXBlX3NpemU7CisJc3RydWN0IG1hcF9sb29rdXAgKm1hcDsKKwlzdHJ1Y3QgYnRyZnNfcm9vdCAqY2h1bmtfcm9vdCA9IGV4dGVudF9yb290LT5mc19pbmZvLT5jaHVua19yb290OworCWludCByZXQ7CisKKwlyZXQgPSBmaW5kX25leHRfY2h1bmsoY2h1bmtfcm9vdCwgQlRSRlNfRklSU1RfQ0hVTktfVFJFRV9PQkpFQ1RJRCwKKwkJCSAgICAgICZjaHVua19vZmZzZXQpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBfX2J0cmZzX2FsbG9jX2NodW5rKHRyYW5zLCBleHRlbnRfcm9vdCwgJm1hcCwgJmNodW5rX3NpemUsCisJCQkJICAmc3RyaXBlX3NpemUsIGNodW5rX29mZnNldCwgdHlwZSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IF9fZmluaXNoX2NodW5rX2FsbG9jKHRyYW5zLCBleHRlbnRfcm9vdCwgbWFwLCBjaHVua19vZmZzZXQsCisJCQkJICAgY2h1bmtfc2l6ZSwgc3RyaXBlX3NpemUpOworCUJVR19PTihyZXQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgbm9pbmxpbmUgaW50IGluaXRfZmlyc3RfcndfZGV2aWNlKHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAorCQkJCQkgc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsCisJCQkJCSBzdHJ1Y3QgYnRyZnNfZGV2aWNlICpkZXZpY2UpCit7CisJdTY0IGNodW5rX29mZnNldDsKKwl1NjQgc3lzX2NodW5rX29mZnNldDsKKwl1NjQgY2h1bmtfc2l6ZTsKKwl1NjQgc3lzX2NodW5rX3NpemU7CisJdTY0IHN0cmlwZV9zaXplOworCXU2NCBzeXNfc3RyaXBlX3NpemU7CisJdTY0IGFsbG9jX3Byb2ZpbGU7CisJc3RydWN0IG1hcF9sb29rdXAgKm1hcDsKKwlzdHJ1Y3QgbWFwX2xvb2t1cCAqc3lzX21hcDsKKwlzdHJ1Y3QgYnRyZnNfZnNfaW5mbyAqZnNfaW5mbyA9IHJvb3QtPmZzX2luZm87CisJc3RydWN0IGJ0cmZzX3Jvb3QgKmV4dGVudF9yb290ID0gZnNfaW5mby0+ZXh0ZW50X3Jvb3Q7CisJaW50IHJldDsKKworCXJldCA9IGZpbmRfbmV4dF9jaHVuayhmc19pbmZvLT5jaHVua19yb290LAorCQkJICAgICAgQlRSRlNfRklSU1RfQ0hVTktfVFJFRV9PQkpFQ1RJRCwgJmNodW5rX29mZnNldCk7CisJQlVHX09OKHJldCk7CisKKwlhbGxvY19wcm9maWxlID0gQlRSRlNfQkxPQ0tfR1JPVVBfTUVUQURBVEEgfAorCQkJKGZzX2luZm8tPm1ldGFkYXRhX2FsbG9jX3Byb2ZpbGUgJgorCQkJIGZzX2luZm8tPmF2YWlsX21ldGFkYXRhX2FsbG9jX2JpdHMpOworCWFsbG9jX3Byb2ZpbGUgPSBidHJmc19yZWR1Y2VfYWxsb2NfcHJvZmlsZShyb290LCBhbGxvY19wcm9maWxlKTsKKworCXJldCA9IF9fYnRyZnNfYWxsb2NfY2h1bmsodHJhbnMsIGV4dGVudF9yb290LCAmbWFwLCAmY2h1bmtfc2l6ZSwKKwkJCQkgICZzdHJpcGVfc2l6ZSwgY2h1bmtfb2Zmc2V0LCBhbGxvY19wcm9maWxlKTsKKwlCVUdfT04ocmV0KTsKKworCXN5c19jaHVua19vZmZzZXQgPSBjaHVua19vZmZzZXQgKyBjaHVua19zaXplOworCisJYWxsb2NfcHJvZmlsZSA9IEJUUkZTX0JMT0NLX0dST1VQX1NZU1RFTSB8CisJCQkoZnNfaW5mby0+c3lzdGVtX2FsbG9jX3Byb2ZpbGUgJgorCQkJIGZzX2luZm8tPmF2YWlsX3N5c3RlbV9hbGxvY19iaXRzKTsKKwlhbGxvY19wcm9maWxlID0gYnRyZnNfcmVkdWNlX2FsbG9jX3Byb2ZpbGUocm9vdCwgYWxsb2NfcHJvZmlsZSk7CisKKwlyZXQgPSBfX2J0cmZzX2FsbG9jX2NodW5rKHRyYW5zLCBleHRlbnRfcm9vdCwgJnN5c19tYXAsCisJCQkJICAmc3lzX2NodW5rX3NpemUsICZzeXNfc3RyaXBlX3NpemUsCisJCQkJICBzeXNfY2h1bmtfb2Zmc2V0LCBhbGxvY19wcm9maWxlKTsKKwlCVUdfT04ocmV0KTsKKworCXJldCA9IGJ0cmZzX2FkZF9kZXZpY2UodHJhbnMsIGZzX2luZm8tPmNodW5rX3Jvb3QsIGRldmljZSk7CisJQlVHX09OKHJldCk7CisKKwkvKgorCSAqIE1vZGlmeWluZyBjaHVuayB0cmVlIG5lZWRzIGFsbG9jYXRpbmcgbmV3IGJsb2NrcyBmcm9tIGJvdGgKKwkgKiBzeXN0ZW0gYmxvY2sgZ3JvdXAgYW5kIG1ldGFkYXRhIGJsb2NrIGdyb3VwLiBTbyB3ZSBvbmx5IGNhbgorCSAqIGRvIG9wZXJhdGlvbnMgcmVxdWlyZSBtb2RpZnlpbmcgdGhlIGNodW5rIHRyZWUgYWZ0ZXIgYm90aAorCSAqIGJsb2NrIGdyb3VwcyB3ZXJlIGNyZWF0ZWQuCisJICovCisJcmV0ID0gX19maW5pc2hfY2h1bmtfYWxsb2ModHJhbnMsIGV4dGVudF9yb290LCBtYXAsIGNodW5rX29mZnNldCwKKwkJCQkgICBjaHVua19zaXplLCBzdHJpcGVfc2l6ZSk7CisJQlVHX09OKHJldCk7CisKKwlyZXQgPSBfX2ZpbmlzaF9jaHVua19hbGxvYyh0cmFucywgZXh0ZW50X3Jvb3QsIHN5c19tYXAsCisJCQkJICAgc3lzX2NodW5rX29mZnNldCwgc3lzX2NodW5rX3NpemUsCisJCQkJICAgc3lzX3N0cmlwZV9zaXplKTsKKwlCVUdfT04ocmV0KTsKKwlyZXR1cm4gMDsKK30KKworaW50IGJ0cmZzX2NodW5rX3JlYWRvbmx5KHN0cnVjdCBidHJmc19yb290ICpyb290LCB1NjQgY2h1bmtfb2Zmc2V0KQoreworCXN0cnVjdCBleHRlbnRfbWFwICplbTsKKwlzdHJ1Y3QgbWFwX2xvb2t1cCAqbWFwOworCXN0cnVjdCBidHJmc19tYXBwaW5nX3RyZWUgKm1hcF90cmVlID0gJnJvb3QtPmZzX2luZm8tPm1hcHBpbmdfdHJlZTsKKwlpbnQgcmVhZG9ubHkgPSAwOworCWludCBpOworCisJc3Bpbl9sb2NrKCZtYXBfdHJlZS0+bWFwX3RyZWUubG9jayk7CisJZW0gPSBsb29rdXBfZXh0ZW50X21hcHBpbmcoJm1hcF90cmVlLT5tYXBfdHJlZSwgY2h1bmtfb2Zmc2V0LCAxKTsKKwlzcGluX3VubG9jaygmbWFwX3RyZWUtPm1hcF90cmVlLmxvY2spOworCWlmICghZW0pCisJCXJldHVybiAxOworCisJbWFwID0gKHN0cnVjdCBtYXBfbG9va3VwICopZW0tPmJkZXY7CisJZm9yIChpID0gMDsgaSA8IG1hcC0+bnVtX3N0cmlwZXM7IGkrKykgeworCQlpZiAoIW1hcC0+c3RyaXBlc1tpXS5kZXYtPndyaXRlYWJsZSkgeworCQkJcmVhZG9ubHkgPSAxOworCQkJYnJlYWs7CisJCX0KKwl9CisJZnJlZV9leHRlbnRfbWFwKGVtKTsKKwlyZXR1cm4gcmVhZG9ubHk7Cit9CisKK3ZvaWQgYnRyZnNfbWFwcGluZ19pbml0KHN0cnVjdCBidHJmc19tYXBwaW5nX3RyZWUgKnRyZWUpCit7CisJZXh0ZW50X21hcF90cmVlX2luaXQoJnRyZWUtPm1hcF90cmVlLCBHRlBfTk9GUyk7Cit9CisKK3ZvaWQgYnRyZnNfbWFwcGluZ190cmVlX2ZyZWUoc3RydWN0IGJ0cmZzX21hcHBpbmdfdHJlZSAqdHJlZSkKK3sKKwlzdHJ1Y3QgZXh0ZW50X21hcCAqZW07CisKKwl3aGlsZSAoMSkgeworCQlzcGluX2xvY2soJnRyZWUtPm1hcF90cmVlLmxvY2spOworCQllbSA9IGxvb2t1cF9leHRlbnRfbWFwcGluZygmdHJlZS0+bWFwX3RyZWUsIDAsICh1NjQpLTEpOworCQlpZiAoZW0pCisJCQlyZW1vdmVfZXh0ZW50X21hcHBpbmcoJnRyZWUtPm1hcF90cmVlLCBlbSk7CisJCXNwaW5fdW5sb2NrKCZ0cmVlLT5tYXBfdHJlZS5sb2NrKTsKKwkJaWYgKCFlbSkKKwkJCWJyZWFrOworCQlrZnJlZShlbS0+YmRldik7CisJCS8qIG9uY2UgZm9yIHVzICovCisJCWZyZWVfZXh0ZW50X21hcChlbSk7CisJCS8qIG9uY2UgZm9yIHRoZSB0cmVlICovCisJCWZyZWVfZXh0ZW50X21hcChlbSk7CisJfQorfQorCitpbnQgYnRyZnNfbnVtX2NvcGllcyhzdHJ1Y3QgYnRyZnNfbWFwcGluZ190cmVlICptYXBfdHJlZSwgdTY0IGxvZ2ljYWwsIHU2NCBsZW4pCit7CisJc3RydWN0IGV4dGVudF9tYXAgKmVtOworCXN0cnVjdCBtYXBfbG9va3VwICptYXA7CisJc3RydWN0IGV4dGVudF9tYXBfdHJlZSAqZW1fdHJlZSA9ICZtYXBfdHJlZS0+bWFwX3RyZWU7CisJaW50IHJldDsKKworCXNwaW5fbG9jaygmZW1fdHJlZS0+bG9jayk7CisJZW0gPSBsb29rdXBfZXh0ZW50X21hcHBpbmcoZW1fdHJlZSwgbG9naWNhbCwgbGVuKTsKKwlzcGluX3VubG9jaygmZW1fdHJlZS0+bG9jayk7CisJQlVHX09OKCFlbSk7CisKKwlCVUdfT04oZW0tPnN0YXJ0ID4gbG9naWNhbCB8fCBlbS0+c3RhcnQgKyBlbS0+bGVuIDwgbG9naWNhbCk7CisJbWFwID0gKHN0cnVjdCBtYXBfbG9va3VwICopZW0tPmJkZXY7CisJaWYgKG1hcC0+dHlwZSAmIChCVFJGU19CTE9DS19HUk9VUF9EVVAgfCBCVFJGU19CTE9DS19HUk9VUF9SQUlEMSkpCisJCXJldCA9IG1hcC0+bnVtX3N0cmlwZXM7CisJZWxzZSBpZiAobWFwLT50eXBlICYgQlRSRlNfQkxPQ0tfR1JPVVBfUkFJRDEwKQorCQlyZXQgPSBtYXAtPnN1Yl9zdHJpcGVzOworCWVsc2UKKwkJcmV0ID0gMTsKKwlmcmVlX2V4dGVudF9tYXAoZW0pOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZmluZF9saXZlX21pcnJvcihzdHJ1Y3QgbWFwX2xvb2t1cCAqbWFwLCBpbnQgZmlyc3QsIGludCBudW0sCisJCQkgICAgaW50IG9wdGltYWwpCit7CisJaW50IGk7CisJaWYgKG1hcC0+c3RyaXBlc1tvcHRpbWFsXS5kZXYtPmJkZXYpCisJCXJldHVybiBvcHRpbWFsOworCWZvciAoaSA9IGZpcnN0OyBpIDwgZmlyc3QgKyBudW07IGkrKykgeworCQlpZiAobWFwLT5zdHJpcGVzW2ldLmRldi0+YmRldikKKwkJCXJldHVybiBpOworCX0KKwkvKiB3ZSBjb3VsZG4ndCBmaW5kIG9uZSB0aGF0IGRvZXNuJ3QgZmFpbC4gIEp1c3QgcmV0dXJuIHNvbWV0aGluZworCSAqIGFuZCB0aGUgaW8gZXJyb3IgaGFuZGxpbmcgY29kZSB3aWxsIGNsZWFuIHVwIGV2ZW50dWFsbHkKKwkgKi8KKwlyZXR1cm4gb3B0aW1hbDsKK30KKworc3RhdGljIGludCBfX2J0cmZzX21hcF9ibG9jayhzdHJ1Y3QgYnRyZnNfbWFwcGluZ190cmVlICptYXBfdHJlZSwgaW50IHJ3LAorCQkJICAgICB1NjQgbG9naWNhbCwgdTY0ICpsZW5ndGgsCisJCQkgICAgIHN0cnVjdCBidHJmc19tdWx0aV9iaW8gKiptdWx0aV9yZXQsCisJCQkgICAgIGludCBtaXJyb3JfbnVtLCBzdHJ1Y3QgcGFnZSAqdW5wbHVnX3BhZ2UpCit7CisJc3RydWN0IGV4dGVudF9tYXAgKmVtOworCXN0cnVjdCBtYXBfbG9va3VwICptYXA7CisJc3RydWN0IGV4dGVudF9tYXBfdHJlZSAqZW1fdHJlZSA9ICZtYXBfdHJlZS0+bWFwX3RyZWU7CisJdTY0IG9mZnNldDsKKwl1NjQgc3RyaXBlX29mZnNldDsKKwl1NjQgc3RyaXBlX25yOworCWludCBzdHJpcGVzX2FsbG9jYXRlZCA9IDg7CisJaW50IHN0cmlwZXNfcmVxdWlyZWQgPSAxOworCWludCBzdHJpcGVfaW5kZXg7CisJaW50IGk7CisJaW50IG51bV9zdHJpcGVzOworCWludCBtYXhfZXJyb3JzID0gMDsKKwlzdHJ1Y3QgYnRyZnNfbXVsdGlfYmlvICptdWx0aSA9IE5VTEw7CisKKwlpZiAobXVsdGlfcmV0ICYmICEocncgJiAoMSA8PCBCSU9fUlcpKSkKKwkJc3RyaXBlc19hbGxvY2F0ZWQgPSAxOworYWdhaW46CisJaWYgKG11bHRpX3JldCkgeworCQltdWx0aSA9IGt6YWxsb2MoYnRyZnNfbXVsdGlfYmlvX3NpemUoc3RyaXBlc19hbGxvY2F0ZWQpLAorCQkJCUdGUF9OT0ZTKTsKKwkJaWYgKCFtdWx0aSkKKwkJCXJldHVybiAtRU5PTUVNOworCisJCWF0b21pY19zZXQoJm11bHRpLT5lcnJvciwgMCk7CisJfQorCisJc3Bpbl9sb2NrKCZlbV90cmVlLT5sb2NrKTsKKwllbSA9IGxvb2t1cF9leHRlbnRfbWFwcGluZyhlbV90cmVlLCBsb2dpY2FsLCAqbGVuZ3RoKTsKKwlzcGluX3VubG9jaygmZW1fdHJlZS0+bG9jayk7CisKKwlpZiAoIWVtICYmIHVucGx1Z19wYWdlKQorCQlyZXR1cm4gMDsKKworCWlmICghZW0pIHsKKwkJcHJpbnRrKEtFUk5fQ1JJVCAidW5hYmxlIHRvIGZpbmQgbG9naWNhbCAlbGx1IGxlbiAlbGx1XG4iLAorCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylsb2dpY2FsLAorCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykqbGVuZ3RoKTsKKwkJQlVHKCk7CisJfQorCisJQlVHX09OKGVtLT5zdGFydCA+IGxvZ2ljYWwgfHwgZW0tPnN0YXJ0ICsgZW0tPmxlbiA8IGxvZ2ljYWwpOworCW1hcCA9IChzdHJ1Y3QgbWFwX2xvb2t1cCAqKWVtLT5iZGV2OworCW9mZnNldCA9IGxvZ2ljYWwgLSBlbS0+c3RhcnQ7CisKKwlpZiAobWlycm9yX251bSA+IG1hcC0+bnVtX3N0cmlwZXMpCisJCW1pcnJvcl9udW0gPSAwOworCisJLyogaWYgb3VyIG11bHRpIGJpbyBzdHJ1Y3QgaXMgdG9vIHNtYWxsLCBiYWNrIG9mZiBhbmQgdHJ5IGFnYWluICovCisJaWYgKHJ3ICYgKDEgPDwgQklPX1JXKSkgeworCQlpZiAobWFwLT50eXBlICYgKEJUUkZTX0JMT0NLX0dST1VQX1JBSUQxIHwKKwkJCQkgQlRSRlNfQkxPQ0tfR1JPVVBfRFVQKSkgeworCQkJc3RyaXBlc19yZXF1aXJlZCA9IG1hcC0+bnVtX3N0cmlwZXM7CisJCQltYXhfZXJyb3JzID0gMTsKKwkJfSBlbHNlIGlmIChtYXAtPnR5cGUgJiBCVFJGU19CTE9DS19HUk9VUF9SQUlEMTApIHsKKwkJCXN0cmlwZXNfcmVxdWlyZWQgPSBtYXAtPnN1Yl9zdHJpcGVzOworCQkJbWF4X2Vycm9ycyA9IDE7CisJCX0KKwl9CisJaWYgKG11bHRpX3JldCAmJiBydyA9PSBXUklURSAmJgorCSAgICBzdHJpcGVzX2FsbG9jYXRlZCA8IHN0cmlwZXNfcmVxdWlyZWQpIHsKKwkJc3RyaXBlc19hbGxvY2F0ZWQgPSBtYXAtPm51bV9zdHJpcGVzOworCQlmcmVlX2V4dGVudF9tYXAoZW0pOworCQlrZnJlZShtdWx0aSk7CisJCWdvdG8gYWdhaW47CisJfQorCXN0cmlwZV9uciA9IG9mZnNldDsKKwkvKgorCSAqIHN0cmlwZV9uciBjb3VudHMgdGhlIHRvdGFsIG51bWJlciBvZiBzdHJpcGVzIHdlIGhhdmUgdG8gc3RyaWRlCisJICogdG8gZ2V0IHRvIHRoaXMgYmxvY2sKKwkgKi8KKwlkb19kaXYoc3RyaXBlX25yLCBtYXAtPnN0cmlwZV9sZW4pOworCisJc3RyaXBlX29mZnNldCA9IHN0cmlwZV9uciAqIG1hcC0+c3RyaXBlX2xlbjsKKwlCVUdfT04ob2Zmc2V0IDwgc3RyaXBlX29mZnNldCk7CisKKwkvKiBzdHJpcGVfb2Zmc2V0IGlzIHRoZSBvZmZzZXQgb2YgdGhpcyBibG9jayBpbiBpdHMgc3RyaXBlKi8KKwlzdHJpcGVfb2Zmc2V0ID0gb2Zmc2V0IC0gc3RyaXBlX29mZnNldDsKKworCWlmIChtYXAtPnR5cGUgJiAoQlRSRlNfQkxPQ0tfR1JPVVBfUkFJRDAgfCBCVFJGU19CTE9DS19HUk9VUF9SQUlEMSB8CisJCQkgQlRSRlNfQkxPQ0tfR1JPVVBfUkFJRDEwIHwKKwkJCSBCVFJGU19CTE9DS19HUk9VUF9EVVApKSB7CisJCS8qIHdlIGxpbWl0IHRoZSBsZW5ndGggb2YgZWFjaCBiaW8gdG8gd2hhdCBmaXRzIGluIGEgc3RyaXBlICovCisJCSpsZW5ndGggPSBtaW5fdCh1NjQsIGVtLT5sZW4gLSBvZmZzZXQsCisJCQkgICAgICBtYXAtPnN0cmlwZV9sZW4gLSBzdHJpcGVfb2Zmc2V0KTsKKwl9IGVsc2UgeworCQkqbGVuZ3RoID0gZW0tPmxlbiAtIG9mZnNldDsKKwl9CisKKwlpZiAoIW11bHRpX3JldCAmJiAhdW5wbHVnX3BhZ2UpCisJCWdvdG8gb3V0OworCisJbnVtX3N0cmlwZXMgPSAxOworCXN0cmlwZV9pbmRleCA9IDA7CisJaWYgKG1hcC0+dHlwZSAmIEJUUkZTX0JMT0NLX0dST1VQX1JBSUQxKSB7CisJCWlmICh1bnBsdWdfcGFnZSB8fCAocncgJiAoMSA8PCBCSU9fUlcpKSkKKwkJCW51bV9zdHJpcGVzID0gbWFwLT5udW1fc3RyaXBlczsKKwkJZWxzZSBpZiAobWlycm9yX251bSkKKwkJCXN0cmlwZV9pbmRleCA9IG1pcnJvcl9udW0gLSAxOworCQllbHNlIHsKKwkJCXN0cmlwZV9pbmRleCA9IGZpbmRfbGl2ZV9taXJyb3IobWFwLCAwLAorCQkJCQkgICAgbWFwLT5udW1fc3RyaXBlcywKKwkJCQkJICAgIGN1cnJlbnQtPnBpZCAlIG1hcC0+bnVtX3N0cmlwZXMpOworCQl9CisKKwl9IGVsc2UgaWYgKG1hcC0+dHlwZSAmIEJUUkZTX0JMT0NLX0dST1VQX0RVUCkgeworCQlpZiAocncgJiAoMSA8PCBCSU9fUlcpKQorCQkJbnVtX3N0cmlwZXMgPSBtYXAtPm51bV9zdHJpcGVzOworCQllbHNlIGlmIChtaXJyb3JfbnVtKQorCQkJc3RyaXBlX2luZGV4ID0gbWlycm9yX251bSAtIDE7CisKKwl9IGVsc2UgaWYgKG1hcC0+dHlwZSAmIEJUUkZTX0JMT0NLX0dST1VQX1JBSUQxMCkgeworCQlpbnQgZmFjdG9yID0gbWFwLT5udW1fc3RyaXBlcyAvIG1hcC0+c3ViX3N0cmlwZXM7CisKKwkJc3RyaXBlX2luZGV4ID0gZG9fZGl2KHN0cmlwZV9uciwgZmFjdG9yKTsKKwkJc3RyaXBlX2luZGV4ICo9IG1hcC0+c3ViX3N0cmlwZXM7CisKKwkJaWYgKHVucGx1Z19wYWdlIHx8IChydyAmICgxIDw8IEJJT19SVykpKQorCQkJbnVtX3N0cmlwZXMgPSBtYXAtPnN1Yl9zdHJpcGVzOworCQllbHNlIGlmIChtaXJyb3JfbnVtKQorCQkJc3RyaXBlX2luZGV4ICs9IG1pcnJvcl9udW0gLSAxOworCQllbHNlIHsKKwkJCXN0cmlwZV9pbmRleCA9IGZpbmRfbGl2ZV9taXJyb3IobWFwLCBzdHJpcGVfaW5kZXgsCisJCQkJCSAgICAgIG1hcC0+c3ViX3N0cmlwZXMsIHN0cmlwZV9pbmRleCArCisJCQkJCSAgICAgIGN1cnJlbnQtPnBpZCAlIG1hcC0+c3ViX3N0cmlwZXMpOworCQl9CisJfSBlbHNlIHsKKwkJLyoKKwkJICogYWZ0ZXIgdGhpcyBkb19kaXYgY2FsbCwgc3RyaXBlX25yIGlzIHRoZSBudW1iZXIgb2Ygc3RyaXBlcworCQkgKiBvbiB0aGlzIGRldmljZSB3ZSBoYXZlIHRvIHdhbGsgdG8gZmluZCB0aGUgZGF0YSwgYW5kCisJCSAqIHN0cmlwZV9pbmRleCBpcyB0aGUgbnVtYmVyIG9mIG91ciBkZXZpY2UgaW4gdGhlIHN0cmlwZSBhcnJheQorCQkgKi8KKwkJc3RyaXBlX2luZGV4ID0gZG9fZGl2KHN0cmlwZV9uciwgbWFwLT5udW1fc3RyaXBlcyk7CisJfQorCUJVR19PTihzdHJpcGVfaW5kZXggPj0gbWFwLT5udW1fc3RyaXBlcyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX3N0cmlwZXM7IGkrKykgeworCQlpZiAodW5wbHVnX3BhZ2UpIHsKKwkJCXN0cnVjdCBidHJmc19kZXZpY2UgKmRldmljZTsKKwkJCXN0cnVjdCBiYWNraW5nX2Rldl9pbmZvICpiZGk7CisKKwkJCWRldmljZSA9IG1hcC0+c3RyaXBlc1tzdHJpcGVfaW5kZXhdLmRldjsKKwkJCWlmIChkZXZpY2UtPmJkZXYpIHsKKwkJCQliZGkgPSBibGtfZ2V0X2JhY2tpbmdfZGV2X2luZm8oZGV2aWNlLT5iZGV2KTsKKwkJCQlpZiAoYmRpLT51bnBsdWdfaW9fZm4pCisJCQkJCWJkaS0+dW5wbHVnX2lvX2ZuKGJkaSwgdW5wbHVnX3BhZ2UpOworCQkJfQorCQl9IGVsc2UgeworCQkJbXVsdGktPnN0cmlwZXNbaV0ucGh5c2ljYWwgPQorCQkJCW1hcC0+c3RyaXBlc1tzdHJpcGVfaW5kZXhdLnBoeXNpY2FsICsKKwkJCQlzdHJpcGVfb2Zmc2V0ICsgc3RyaXBlX25yICogbWFwLT5zdHJpcGVfbGVuOworCQkJbXVsdGktPnN0cmlwZXNbaV0uZGV2ID0gbWFwLT5zdHJpcGVzW3N0cmlwZV9pbmRleF0uZGV2OworCQl9CisJCXN0cmlwZV9pbmRleCsrOworCX0KKwlpZiAobXVsdGlfcmV0KSB7CisJCSptdWx0aV9yZXQgPSBtdWx0aTsKKwkJbXVsdGktPm51bV9zdHJpcGVzID0gbnVtX3N0cmlwZXM7CisJCW11bHRpLT5tYXhfZXJyb3JzID0gbWF4X2Vycm9yczsKKwl9CitvdXQ6CisJZnJlZV9leHRlbnRfbWFwKGVtKTsKKwlyZXR1cm4gMDsKK30KKworaW50IGJ0cmZzX21hcF9ibG9jayhzdHJ1Y3QgYnRyZnNfbWFwcGluZ190cmVlICptYXBfdHJlZSwgaW50IHJ3LAorCQkgICAgICB1NjQgbG9naWNhbCwgdTY0ICpsZW5ndGgsCisJCSAgICAgIHN0cnVjdCBidHJmc19tdWx0aV9iaW8gKiptdWx0aV9yZXQsIGludCBtaXJyb3JfbnVtKQoreworCXJldHVybiBfX2J0cmZzX21hcF9ibG9jayhtYXBfdHJlZSwgcncsIGxvZ2ljYWwsIGxlbmd0aCwgbXVsdGlfcmV0LAorCQkJCSBtaXJyb3JfbnVtLCBOVUxMKTsKK30KKworaW50IGJ0cmZzX3JtYXBfYmxvY2soc3RydWN0IGJ0cmZzX21hcHBpbmdfdHJlZSAqbWFwX3RyZWUsCisJCSAgICAgdTY0IGNodW5rX3N0YXJ0LCB1NjQgcGh5c2ljYWwsIHU2NCBkZXZpZCwKKwkJICAgICB1NjQgKipsb2dpY2FsLCBpbnQgKm5hZGRycywgaW50ICpzdHJpcGVfbGVuKQoreworCXN0cnVjdCBleHRlbnRfbWFwX3RyZWUgKmVtX3RyZWUgPSAmbWFwX3RyZWUtPm1hcF90cmVlOworCXN0cnVjdCBleHRlbnRfbWFwICplbTsKKwlzdHJ1Y3QgbWFwX2xvb2t1cCAqbWFwOworCXU2NCAqYnVmOworCXU2NCBieXRlbnI7CisJdTY0IGxlbmd0aDsKKwl1NjQgc3RyaXBlX25yOworCWludCBpLCBqLCBuciA9IDA7CisKKwlzcGluX2xvY2soJmVtX3RyZWUtPmxvY2spOworCWVtID0gbG9va3VwX2V4dGVudF9tYXBwaW5nKGVtX3RyZWUsIGNodW5rX3N0YXJ0LCAxKTsKKwlzcGluX3VubG9jaygmZW1fdHJlZS0+bG9jayk7CisKKwlCVUdfT04oIWVtIHx8IGVtLT5zdGFydCAhPSBjaHVua19zdGFydCk7CisJbWFwID0gKHN0cnVjdCBtYXBfbG9va3VwICopZW0tPmJkZXY7CisKKwlsZW5ndGggPSBlbS0+bGVuOworCWlmIChtYXAtPnR5cGUgJiBCVFJGU19CTE9DS19HUk9VUF9SQUlEMTApCisJCWRvX2RpdihsZW5ndGgsIG1hcC0+bnVtX3N0cmlwZXMgLyBtYXAtPnN1Yl9zdHJpcGVzKTsKKwllbHNlIGlmIChtYXAtPnR5cGUgJiBCVFJGU19CTE9DS19HUk9VUF9SQUlEMCkKKwkJZG9fZGl2KGxlbmd0aCwgbWFwLT5udW1fc3RyaXBlcyk7CisKKwlidWYgPSBremFsbG9jKHNpemVvZih1NjQpICogbWFwLT5udW1fc3RyaXBlcywgR0ZQX05PRlMpOworCUJVR19PTighYnVmKTsKKworCWZvciAoaSA9IDA7IGkgPCBtYXAtPm51bV9zdHJpcGVzOyBpKyspIHsKKwkJaWYgKGRldmlkICYmIG1hcC0+c3RyaXBlc1tpXS5kZXYtPmRldmlkICE9IGRldmlkKQorCQkJY29udGludWU7CisJCWlmIChtYXAtPnN0cmlwZXNbaV0ucGh5c2ljYWwgPiBwaHlzaWNhbCB8fAorCQkgICAgbWFwLT5zdHJpcGVzW2ldLnBoeXNpY2FsICsgbGVuZ3RoIDw9IHBoeXNpY2FsKQorCQkJY29udGludWU7CisKKwkJc3RyaXBlX25yID0gcGh5c2ljYWwgLSBtYXAtPnN0cmlwZXNbaV0ucGh5c2ljYWw7CisJCWRvX2RpdihzdHJpcGVfbnIsIG1hcC0+c3RyaXBlX2xlbik7CisKKwkJaWYgKG1hcC0+dHlwZSAmIEJUUkZTX0JMT0NLX0dST1VQX1JBSUQxMCkgeworCQkJc3RyaXBlX25yID0gc3RyaXBlX25yICogbWFwLT5udW1fc3RyaXBlcyArIGk7CisJCQlkb19kaXYoc3RyaXBlX25yLCBtYXAtPnN1Yl9zdHJpcGVzKTsKKwkJfSBlbHNlIGlmIChtYXAtPnR5cGUgJiBCVFJGU19CTE9DS19HUk9VUF9SQUlEMCkgeworCQkJc3RyaXBlX25yID0gc3RyaXBlX25yICogbWFwLT5udW1fc3RyaXBlcyArIGk7CisJCX0KKwkJYnl0ZW5yID0gY2h1bmtfc3RhcnQgKyBzdHJpcGVfbnIgKiBtYXAtPnN0cmlwZV9sZW47CisJCVdBUk5fT04obnIgPj0gbWFwLT5udW1fc3RyaXBlcyk7CisJCWZvciAoaiA9IDA7IGogPCBucjsgaisrKSB7CisJCQlpZiAoYnVmW2pdID09IGJ5dGVucikKKwkJCQlicmVhazsKKwkJfQorCQlpZiAoaiA9PSBucikgeworCQkJV0FSTl9PTihuciA+PSBtYXAtPm51bV9zdHJpcGVzKTsKKwkJCWJ1ZltucisrXSA9IGJ5dGVucjsKKwkJfQorCX0KKworCWZvciAoaSA9IDA7IGkgPiBucjsgaSsrKSB7CisJCXN0cnVjdCBidHJmc19tdWx0aV9iaW8gKm11bHRpOworCQlzdHJ1Y3QgYnRyZnNfYmlvX3N0cmlwZSAqc3RyaXBlOworCQlpbnQgcmV0OworCisJCWxlbmd0aCA9IDE7CisJCXJldCA9IGJ0cmZzX21hcF9ibG9jayhtYXBfdHJlZSwgV1JJVEUsIGJ1ZltpXSwKKwkJCQkgICAgICAmbGVuZ3RoLCAmbXVsdGksIDApOworCQlCVUdfT04ocmV0KTsKKworCQlzdHJpcGUgPSBtdWx0aS0+c3RyaXBlczsKKwkJZm9yIChqID0gMDsgaiA8IG11bHRpLT5udW1fc3RyaXBlczsgaisrKSB7CisJCQlpZiAoc3RyaXBlLT5waHlzaWNhbCA+PSBwaHlzaWNhbCAmJgorCQkJICAgIHBoeXNpY2FsIDwgc3RyaXBlLT5waHlzaWNhbCArIGxlbmd0aCkKKwkJCQlicmVhazsKKwkJfQorCQlCVUdfT04oaiA+PSBtdWx0aS0+bnVtX3N0cmlwZXMpOworCQlrZnJlZShtdWx0aSk7CisJfQorCisJKmxvZ2ljYWwgPSBidWY7CisJKm5hZGRycyA9IG5yOworCSpzdHJpcGVfbGVuID0gbWFwLT5zdHJpcGVfbGVuOworCisJZnJlZV9leHRlbnRfbWFwKGVtKTsKKwlyZXR1cm4gMDsKK30KKworaW50IGJ0cmZzX3VucGx1Z19wYWdlKHN0cnVjdCBidHJmc19tYXBwaW5nX3RyZWUgKm1hcF90cmVlLAorCQkgICAgICB1NjQgbG9naWNhbCwgc3RydWN0IHBhZ2UgKnBhZ2UpCit7CisJdTY0IGxlbmd0aCA9IFBBR0VfQ0FDSEVfU0laRTsKKwlyZXR1cm4gX19idHJmc19tYXBfYmxvY2sobWFwX3RyZWUsIFJFQUQsIGxvZ2ljYWwsICZsZW5ndGgsCisJCQkJIE5VTEwsIDAsIHBhZ2UpOworfQorCitzdGF0aWMgdm9pZCBlbmRfYmlvX211bHRpX3N0cmlwZShzdHJ1Y3QgYmlvICpiaW8sIGludCBlcnIpCit7CisJc3RydWN0IGJ0cmZzX211bHRpX2JpbyAqbXVsdGkgPSBiaW8tPmJpX3ByaXZhdGU7CisJaW50IGlzX29yaWdfYmlvID0gMDsKKworCWlmIChlcnIpCisJCWF0b21pY19pbmMoJm11bHRpLT5lcnJvcik7CisKKwlpZiAoYmlvID09IG11bHRpLT5vcmlnX2JpbykKKwkJaXNfb3JpZ19iaW8gPSAxOworCisJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJm11bHRpLT5zdHJpcGVzX3BlbmRpbmcpKSB7CisJCWlmICghaXNfb3JpZ19iaW8pIHsKKwkJCWJpb19wdXQoYmlvKTsKKwkJCWJpbyA9IG11bHRpLT5vcmlnX2JpbzsKKwkJfQorCQliaW8tPmJpX3ByaXZhdGUgPSBtdWx0aS0+cHJpdmF0ZTsKKwkJYmlvLT5iaV9lbmRfaW8gPSBtdWx0aS0+ZW5kX2lvOworCQkvKiBvbmx5IHNlbmQgYW4gZXJyb3IgdG8gdGhlIGhpZ2hlciBsYXllcnMgaWYgaXQgaXMKKwkJICogYmV5b25kIHRoZSB0b2xlcmFuY2Ugb2YgdGhlIG11bHRpLWJpbworCQkgKi8KKwkJaWYgKGF0b21pY19yZWFkKCZtdWx0aS0+ZXJyb3IpID4gbXVsdGktPm1heF9lcnJvcnMpIHsKKwkJCWVyciA9IC1FSU87CisJCX0gZWxzZSBpZiAoZXJyKSB7CisJCQkvKgorCQkJICogdGhpcyBiaW8gaXMgYWN0dWFsbHkgdXAgdG8gZGF0ZSwgd2UgZGlkbid0CisJCQkgKiBnbyBvdmVyIHRoZSBtYXggbnVtYmVyIG9mIGVycm9ycworCQkJICovCisJCQlzZXRfYml0KEJJT19VUFRPREFURSwgJmJpby0+YmlfZmxhZ3MpOworCQkJZXJyID0gMDsKKwkJfQorCQlrZnJlZShtdWx0aSk7CisKKwkJYmlvX2VuZGlvKGJpbywgZXJyKTsKKwl9IGVsc2UgaWYgKCFpc19vcmlnX2JpbykgeworCQliaW9fcHV0KGJpbyk7CisJfQorfQorCitzdHJ1Y3QgYXN5bmNfc2NoZWQgeworCXN0cnVjdCBiaW8gKmJpbzsKKwlpbnQgcnc7CisJc3RydWN0IGJ0cmZzX2ZzX2luZm8gKmluZm87CisJc3RydWN0IGJ0cmZzX3dvcmsgd29yazsKK307CisKKy8qCisgKiBzZWUgcnVuX3NjaGVkdWxlZF9iaW9zIGZvciBhIGRlc2NyaXB0aW9uIG9mIHdoeSBiaW9zIGFyZSBjb2xsZWN0ZWQgZm9yCisgKiBhc3luYyBzdWJtaXQuCisgKgorICogVGhpcyB3aWxsIGFkZCBvbmUgYmlvIHRvIHRoZSBwZW5kaW5nIGxpc3QgZm9yIGEgZGV2aWNlIGFuZCBtYWtlIHN1cmUKKyAqIHRoZSB3b3JrIHN0cnVjdCBpcyBzY2hlZHVsZWQuCisgKi8KK3N0YXRpYyBub2lubGluZSBpbnQgc2NoZWR1bGVfYmlvKHN0cnVjdCBidHJmc19yb290ICpyb290LAorCQkJCSBzdHJ1Y3QgYnRyZnNfZGV2aWNlICpkZXZpY2UsCisJCQkJIGludCBydywgc3RydWN0IGJpbyAqYmlvKQoreworCWludCBzaG91bGRfcXVldWUgPSAxOworCisJLyogZG9uJ3QgYm90aGVyIHdpdGggYWRkaXRpb25hbCBhc3luYyBzdGVwcyBmb3IgcmVhZHMsIHJpZ2h0IG5vdyAqLworCWlmICghKHJ3ICYgKDEgPDwgQklPX1JXKSkpIHsKKwkJYmlvX2dldChiaW8pOworCQlzdWJtaXRfYmlvKHJ3LCBiaW8pOworCQliaW9fcHV0KGJpbyk7CisJCXJldHVybiAwOworCX0KKworCS8qCisJICogbnJfYXN5bmNfYmlvcyBhbGxvd3MgdXMgdG8gcmVsaWFibHkgcmV0dXJuIGNvbmdlc3Rpb24gdG8gdGhlCisJICogaGlnaGVyIGxheWVycy4gIE90aGVyd2lzZSwgdGhlIGFzeW5jIGJpbyBtYWtlcyBpdCBhcHBlYXIgd2UgaGF2ZQorCSAqIG1hZGUgcHJvZ3Jlc3MgYWdhaW5zdCBkaXJ0eSBwYWdlcyB3aGVuIHdlJ3ZlIHJlYWxseSBqdXN0IHB1dCBpdAorCSAqIG9uIGEgcXVldWUgZm9yIGxhdGVyCisJICovCisJYXRvbWljX2luYygmcm9vdC0+ZnNfaW5mby0+bnJfYXN5bmNfYmlvcyk7CisJV0FSTl9PTihiaW8tPmJpX25leHQpOworCWJpby0+YmlfbmV4dCA9IE5VTEw7CisJYmlvLT5iaV9ydyB8PSBydzsKKworCXNwaW5fbG9jaygmZGV2aWNlLT5pb19sb2NrKTsKKworCWlmIChkZXZpY2UtPnBlbmRpbmdfYmlvX3RhaWwpCisJCWRldmljZS0+cGVuZGluZ19iaW9fdGFpbC0+YmlfbmV4dCA9IGJpbzsKKworCWRldmljZS0+cGVuZGluZ19iaW9fdGFpbCA9IGJpbzsKKwlpZiAoIWRldmljZS0+cGVuZGluZ19iaW9zKQorCQlkZXZpY2UtPnBlbmRpbmdfYmlvcyA9IGJpbzsKKwlpZiAoZGV2aWNlLT5ydW5uaW5nX3BlbmRpbmcpCisJCXNob3VsZF9xdWV1ZSA9IDA7CisKKwlzcGluX3VubG9jaygmZGV2aWNlLT5pb19sb2NrKTsKKworCWlmIChzaG91bGRfcXVldWUpCisJCWJ0cmZzX3F1ZXVlX3dvcmtlcigmcm9vdC0+ZnNfaW5mby0+c3VibWl0X3dvcmtlcnMsCisJCQkJICAgJmRldmljZS0+d29yayk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBidHJmc19tYXBfYmlvKHN0cnVjdCBidHJmc19yb290ICpyb290LCBpbnQgcncsIHN0cnVjdCBiaW8gKmJpbywKKwkJICBpbnQgbWlycm9yX251bSwgaW50IGFzeW5jX3N1Ym1pdCkKK3sKKwlzdHJ1Y3QgYnRyZnNfbWFwcGluZ190cmVlICptYXBfdHJlZTsKKwlzdHJ1Y3QgYnRyZnNfZGV2aWNlICpkZXY7CisJc3RydWN0IGJpbyAqZmlyc3RfYmlvID0gYmlvOworCXU2NCBsb2dpY2FsID0gKHU2NCliaW8tPmJpX3NlY3RvciA8PCA5OworCXU2NCBsZW5ndGggPSAwOworCXU2NCBtYXBfbGVuZ3RoOworCXN0cnVjdCBidHJmc19tdWx0aV9iaW8gKm11bHRpID0gTlVMTDsKKwlpbnQgcmV0OworCWludCBkZXZfbnIgPSAwOworCWludCB0b3RhbF9kZXZzID0gMTsKKworCWxlbmd0aCA9IGJpby0+Ymlfc2l6ZTsKKwltYXBfdHJlZSA9ICZyb290LT5mc19pbmZvLT5tYXBwaW5nX3RyZWU7CisJbWFwX2xlbmd0aCA9IGxlbmd0aDsKKworCXJldCA9IGJ0cmZzX21hcF9ibG9jayhtYXBfdHJlZSwgcncsIGxvZ2ljYWwsICZtYXBfbGVuZ3RoLCAmbXVsdGksCisJCQkgICAgICBtaXJyb3JfbnVtKTsKKwlCVUdfT04ocmV0KTsKKworCXRvdGFsX2RldnMgPSBtdWx0aS0+bnVtX3N0cmlwZXM7CisJaWYgKG1hcF9sZW5ndGggPCBsZW5ndGgpIHsKKwkJcHJpbnRrKEtFUk5fQ1JJVCAibWFwcGluZyBmYWlsZWQgbG9naWNhbCAlbGx1IGJpbyBsZW4gJWxsdSAiCisJCSAgICAgICAibGVuICVsbHVcbiIsICh1bnNpZ25lZCBsb25nIGxvbmcpbG9naWNhbCwKKwkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpbGVuZ3RoLAorCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyltYXBfbGVuZ3RoKTsKKwkJQlVHKCk7CisJfQorCW11bHRpLT5lbmRfaW8gPSBmaXJzdF9iaW8tPmJpX2VuZF9pbzsKKwltdWx0aS0+cHJpdmF0ZSA9IGZpcnN0X2Jpby0+YmlfcHJpdmF0ZTsKKwltdWx0aS0+b3JpZ19iaW8gPSBmaXJzdF9iaW87CisJYXRvbWljX3NldCgmbXVsdGktPnN0cmlwZXNfcGVuZGluZywgbXVsdGktPm51bV9zdHJpcGVzKTsKKworCXdoaWxlIChkZXZfbnIgPCB0b3RhbF9kZXZzKSB7CisJCWlmICh0b3RhbF9kZXZzID4gMSkgeworCQkJaWYgKGRldl9uciA8IHRvdGFsX2RldnMgLSAxKSB7CisJCQkJYmlvID0gYmlvX2Nsb25lKGZpcnN0X2JpbywgR0ZQX05PRlMpOworCQkJCUJVR19PTighYmlvKTsKKwkJCX0gZWxzZSB7CisJCQkJYmlvID0gZmlyc3RfYmlvOworCQkJfQorCQkJYmlvLT5iaV9wcml2YXRlID0gbXVsdGk7CisJCQliaW8tPmJpX2VuZF9pbyA9IGVuZF9iaW9fbXVsdGlfc3RyaXBlOworCQl9CisJCWJpby0+Ymlfc2VjdG9yID0gbXVsdGktPnN0cmlwZXNbZGV2X25yXS5waHlzaWNhbCA+PiA5OworCQlkZXYgPSBtdWx0aS0+c3RyaXBlc1tkZXZfbnJdLmRldjsKKwkJQlVHX09OKHJ3ID09IFdSSVRFICYmICFkZXYtPndyaXRlYWJsZSk7CisJCWlmIChkZXYgJiYgZGV2LT5iZGV2KSB7CisJCQliaW8tPmJpX2JkZXYgPSBkZXYtPmJkZXY7CisJCQlpZiAoYXN5bmNfc3VibWl0KQorCQkJCXNjaGVkdWxlX2Jpbyhyb290LCBkZXYsIHJ3LCBiaW8pOworCQkJZWxzZQorCQkJCXN1Ym1pdF9iaW8ocncsIGJpbyk7CisJCX0gZWxzZSB7CisJCQliaW8tPmJpX2JkZXYgPSByb290LT5mc19pbmZvLT5mc19kZXZpY2VzLT5sYXRlc3RfYmRldjsKKwkJCWJpby0+Ymlfc2VjdG9yID0gbG9naWNhbCA+PiA5OworCQkJYmlvX2VuZGlvKGJpbywgLUVJTyk7CisJCX0KKwkJZGV2X25yKys7CisJfQorCWlmICh0b3RhbF9kZXZzID09IDEpCisJCWtmcmVlKG11bHRpKTsKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IGJ0cmZzX2RldmljZSAqYnRyZnNfZmluZF9kZXZpY2Uoc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsIHU2NCBkZXZpZCwKKwkJCQkgICAgICAgdTggKnV1aWQsIHU4ICpmc2lkKQoreworCXN0cnVjdCBidHJmc19kZXZpY2UgKmRldmljZTsKKwlzdHJ1Y3QgYnRyZnNfZnNfZGV2aWNlcyAqY3VyX2RldmljZXM7CisKKwljdXJfZGV2aWNlcyA9IHJvb3QtPmZzX2luZm8tPmZzX2RldmljZXM7CisJd2hpbGUgKGN1cl9kZXZpY2VzKSB7CisJCWlmICghZnNpZCB8fAorCQkgICAgIW1lbWNtcChjdXJfZGV2aWNlcy0+ZnNpZCwgZnNpZCwgQlRSRlNfVVVJRF9TSVpFKSkgeworCQkJZGV2aWNlID0gX19maW5kX2RldmljZSgmY3VyX2RldmljZXMtPmRldmljZXMsCisJCQkJCSAgICAgICBkZXZpZCwgdXVpZCk7CisJCQlpZiAoZGV2aWNlKQorCQkJCXJldHVybiBkZXZpY2U7CisJCX0KKwkJY3VyX2RldmljZXMgPSBjdXJfZGV2aWNlcy0+c2VlZDsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYnRyZnNfZGV2aWNlICphZGRfbWlzc2luZ19kZXYoc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsCisJCQkJCSAgICB1NjQgZGV2aWQsIHU4ICpkZXZfdXVpZCkKK3sKKwlzdHJ1Y3QgYnRyZnNfZGV2aWNlICpkZXZpY2U7CisJc3RydWN0IGJ0cmZzX2ZzX2RldmljZXMgKmZzX2RldmljZXMgPSByb290LT5mc19pbmZvLT5mc19kZXZpY2VzOworCisJZGV2aWNlID0ga3phbGxvYyhzaXplb2YoKmRldmljZSksIEdGUF9OT0ZTKTsKKwlpZiAoIWRldmljZSkKKwkJcmV0dXJuIE5VTEw7CisJbGlzdF9hZGQoJmRldmljZS0+ZGV2X2xpc3QsCisJCSAmZnNfZGV2aWNlcy0+ZGV2aWNlcyk7CisJZGV2aWNlLT5iYXJyaWVycyA9IDE7CisJZGV2aWNlLT5kZXZfcm9vdCA9IHJvb3QtPmZzX2luZm8tPmRldl9yb290OworCWRldmljZS0+ZGV2aWQgPSBkZXZpZDsKKwlkZXZpY2UtPndvcmsuZnVuYyA9IHBlbmRpbmdfYmlvc19mbjsKKwlkZXZpY2UtPmZzX2RldmljZXMgPSBmc19kZXZpY2VzOworCWZzX2RldmljZXMtPm51bV9kZXZpY2VzKys7CisJc3Bpbl9sb2NrX2luaXQoJmRldmljZS0+aW9fbG9jayk7CisJSU5JVF9MSVNUX0hFQUQoJmRldmljZS0+ZGV2X2FsbG9jX2xpc3QpOworCW1lbWNweShkZXZpY2UtPnV1aWQsIGRldl91dWlkLCBCVFJGU19VVUlEX1NJWkUpOworCXJldHVybiBkZXZpY2U7Cit9CisKK3N0YXRpYyBpbnQgcmVhZF9vbmVfY2h1bmsoc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsIHN0cnVjdCBidHJmc19rZXkgKmtleSwKKwkJCSAgc3RydWN0IGV4dGVudF9idWZmZXIgKmxlYWYsCisJCQkgIHN0cnVjdCBidHJmc19jaHVuayAqY2h1bmspCit7CisJc3RydWN0IGJ0cmZzX21hcHBpbmdfdHJlZSAqbWFwX3RyZWUgPSAmcm9vdC0+ZnNfaW5mby0+bWFwcGluZ190cmVlOworCXN0cnVjdCBtYXBfbG9va3VwICptYXA7CisJc3RydWN0IGV4dGVudF9tYXAgKmVtOworCXU2NCBsb2dpY2FsOworCXU2NCBsZW5ndGg7CisJdTY0IGRldmlkOworCXU4IHV1aWRbQlRSRlNfVVVJRF9TSVpFXTsKKwlpbnQgbnVtX3N0cmlwZXM7CisJaW50IHJldDsKKwlpbnQgaTsKKworCWxvZ2ljYWwgPSBrZXktPm9mZnNldDsKKwlsZW5ndGggPSBidHJmc19jaHVua19sZW5ndGgobGVhZiwgY2h1bmspOworCisJc3Bpbl9sb2NrKCZtYXBfdHJlZS0+bWFwX3RyZWUubG9jayk7CisJZW0gPSBsb29rdXBfZXh0ZW50X21hcHBpbmcoJm1hcF90cmVlLT5tYXBfdHJlZSwgbG9naWNhbCwgMSk7CisJc3Bpbl91bmxvY2soJm1hcF90cmVlLT5tYXBfdHJlZS5sb2NrKTsKKworCS8qIGFscmVhZHkgbWFwcGVkPyAqLworCWlmIChlbSAmJiBlbS0+c3RhcnQgPD0gbG9naWNhbCAmJiBlbS0+c3RhcnQgKyBlbS0+bGVuID4gbG9naWNhbCkgeworCQlmcmVlX2V4dGVudF9tYXAoZW0pOworCQlyZXR1cm4gMDsKKwl9IGVsc2UgaWYgKGVtKSB7CisJCWZyZWVfZXh0ZW50X21hcChlbSk7CisJfQorCisJbWFwID0ga3phbGxvYyhzaXplb2YoKm1hcCksIEdGUF9OT0ZTKTsKKwlpZiAoIW1hcCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwllbSA9IGFsbG9jX2V4dGVudF9tYXAoR0ZQX05PRlMpOworCWlmICghZW0pCisJCXJldHVybiAtRU5PTUVNOworCW51bV9zdHJpcGVzID0gYnRyZnNfY2h1bmtfbnVtX3N0cmlwZXMobGVhZiwgY2h1bmspOworCW1hcCA9IGttYWxsb2MobWFwX2xvb2t1cF9zaXplKG51bV9zdHJpcGVzKSwgR0ZQX05PRlMpOworCWlmICghbWFwKSB7CisJCWZyZWVfZXh0ZW50X21hcChlbSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWVtLT5iZGV2ID0gKHN0cnVjdCBibG9ja19kZXZpY2UgKiltYXA7CisJZW0tPnN0YXJ0ID0gbG9naWNhbDsKKwllbS0+bGVuID0gbGVuZ3RoOworCWVtLT5ibG9ja19zdGFydCA9IDA7CisJZW0tPmJsb2NrX2xlbiA9IGVtLT5sZW47CisKKwltYXAtPm51bV9zdHJpcGVzID0gbnVtX3N0cmlwZXM7CisJbWFwLT5pb193aWR0aCA9IGJ0cmZzX2NodW5rX2lvX3dpZHRoKGxlYWYsIGNodW5rKTsKKwltYXAtPmlvX2FsaWduID0gYnRyZnNfY2h1bmtfaW9fYWxpZ24obGVhZiwgY2h1bmspOworCW1hcC0+c2VjdG9yX3NpemUgPSBidHJmc19jaHVua19zZWN0b3Jfc2l6ZShsZWFmLCBjaHVuayk7CisJbWFwLT5zdHJpcGVfbGVuID0gYnRyZnNfY2h1bmtfc3RyaXBlX2xlbihsZWFmLCBjaHVuayk7CisJbWFwLT50eXBlID0gYnRyZnNfY2h1bmtfdHlwZShsZWFmLCBjaHVuayk7CisJbWFwLT5zdWJfc3RyaXBlcyA9IGJ0cmZzX2NodW5rX3N1Yl9zdHJpcGVzKGxlYWYsIGNodW5rKTsKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX3N0cmlwZXM7IGkrKykgeworCQltYXAtPnN0cmlwZXNbaV0ucGh5c2ljYWwgPQorCQkJYnRyZnNfc3RyaXBlX29mZnNldF9ucihsZWFmLCBjaHVuaywgaSk7CisJCWRldmlkID0gYnRyZnNfc3RyaXBlX2RldmlkX25yKGxlYWYsIGNodW5rLCBpKTsKKwkJcmVhZF9leHRlbnRfYnVmZmVyKGxlYWYsIHV1aWQsICh1bnNpZ25lZCBsb25nKQorCQkJCSAgIGJ0cmZzX3N0cmlwZV9kZXZfdXVpZF9ucihjaHVuaywgaSksCisJCQkJICAgQlRSRlNfVVVJRF9TSVpFKTsKKwkJbWFwLT5zdHJpcGVzW2ldLmRldiA9IGJ0cmZzX2ZpbmRfZGV2aWNlKHJvb3QsIGRldmlkLCB1dWlkLAorCQkJCQkJCU5VTEwpOworCQlpZiAoIW1hcC0+c3RyaXBlc1tpXS5kZXYgJiYgIWJ0cmZzX3Rlc3Rfb3B0KHJvb3QsIERFR1JBREVEKSkgeworCQkJa2ZyZWUobWFwKTsKKwkJCWZyZWVfZXh0ZW50X21hcChlbSk7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCQlpZiAoIW1hcC0+c3RyaXBlc1tpXS5kZXYpIHsKKwkJCW1hcC0+c3RyaXBlc1tpXS5kZXYgPQorCQkJCWFkZF9taXNzaW5nX2Rldihyb290LCBkZXZpZCwgdXVpZCk7CisJCQlpZiAoIW1hcC0+c3RyaXBlc1tpXS5kZXYpIHsKKwkJCQlrZnJlZShtYXApOworCQkJCWZyZWVfZXh0ZW50X21hcChlbSk7CisJCQkJcmV0dXJuIC1FSU87CisJCQl9CisJCX0KKwkJbWFwLT5zdHJpcGVzW2ldLmRldi0+aW5fZnNfbWV0YWRhdGEgPSAxOworCX0KKworCXNwaW5fbG9jaygmbWFwX3RyZWUtPm1hcF90cmVlLmxvY2spOworCXJldCA9IGFkZF9leHRlbnRfbWFwcGluZygmbWFwX3RyZWUtPm1hcF90cmVlLCBlbSk7CisJc3Bpbl91bmxvY2soJm1hcF90cmVlLT5tYXBfdHJlZS5sb2NrKTsKKwlCVUdfT04ocmV0KTsKKwlmcmVlX2V4dGVudF9tYXAoZW0pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZmlsbF9kZXZpY2VfZnJvbV9pdGVtKHN0cnVjdCBleHRlbnRfYnVmZmVyICpsZWFmLAorCQkJCSBzdHJ1Y3QgYnRyZnNfZGV2X2l0ZW0gKmRldl9pdGVtLAorCQkJCSBzdHJ1Y3QgYnRyZnNfZGV2aWNlICpkZXZpY2UpCit7CisJdW5zaWduZWQgbG9uZyBwdHI7CisKKwlkZXZpY2UtPmRldmlkID0gYnRyZnNfZGV2aWNlX2lkKGxlYWYsIGRldl9pdGVtKTsKKwlkZXZpY2UtPnRvdGFsX2J5dGVzID0gYnRyZnNfZGV2aWNlX3RvdGFsX2J5dGVzKGxlYWYsIGRldl9pdGVtKTsKKwlkZXZpY2UtPmJ5dGVzX3VzZWQgPSBidHJmc19kZXZpY2VfYnl0ZXNfdXNlZChsZWFmLCBkZXZfaXRlbSk7CisJZGV2aWNlLT50eXBlID0gYnRyZnNfZGV2aWNlX3R5cGUobGVhZiwgZGV2X2l0ZW0pOworCWRldmljZS0+aW9fYWxpZ24gPSBidHJmc19kZXZpY2VfaW9fYWxpZ24obGVhZiwgZGV2X2l0ZW0pOworCWRldmljZS0+aW9fd2lkdGggPSBidHJmc19kZXZpY2VfaW9fd2lkdGgobGVhZiwgZGV2X2l0ZW0pOworCWRldmljZS0+c2VjdG9yX3NpemUgPSBidHJmc19kZXZpY2Vfc2VjdG9yX3NpemUobGVhZiwgZGV2X2l0ZW0pOworCisJcHRyID0gKHVuc2lnbmVkIGxvbmcpYnRyZnNfZGV2aWNlX3V1aWQoZGV2X2l0ZW0pOworCXJlYWRfZXh0ZW50X2J1ZmZlcihsZWFmLCBkZXZpY2UtPnV1aWQsIHB0ciwgQlRSRlNfVVVJRF9TSVpFKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG9wZW5fc2VlZF9kZXZpY2VzKHN0cnVjdCBidHJmc19yb290ICpyb290LCB1OCAqZnNpZCkKK3sKKwlzdHJ1Y3QgYnRyZnNfZnNfZGV2aWNlcyAqZnNfZGV2aWNlczsKKwlpbnQgcmV0OworCisJbXV0ZXhfbG9jaygmdXVpZF9tdXRleCk7CisKKwlmc19kZXZpY2VzID0gcm9vdC0+ZnNfaW5mby0+ZnNfZGV2aWNlcy0+c2VlZDsKKwl3aGlsZSAoZnNfZGV2aWNlcykgeworCQlpZiAoIW1lbWNtcChmc19kZXZpY2VzLT5mc2lkLCBmc2lkLCBCVFJGU19VVUlEX1NJWkUpKSB7CisJCQlyZXQgPSAwOworCQkJZ290byBvdXQ7CisJCX0KKwkJZnNfZGV2aWNlcyA9IGZzX2RldmljZXMtPnNlZWQ7CisJfQorCisJZnNfZGV2aWNlcyA9IGZpbmRfZnNpZChmc2lkKTsKKwlpZiAoIWZzX2RldmljZXMpIHsKKwkJcmV0ID0gLUVOT0VOVDsKKwkJZ290byBvdXQ7CisJfQorCisJZnNfZGV2aWNlcyA9IGNsb25lX2ZzX2RldmljZXMoZnNfZGV2aWNlcyk7CisJaWYgKElTX0VSUihmc19kZXZpY2VzKSkgeworCQlyZXQgPSBQVFJfRVJSKGZzX2RldmljZXMpOworCQlnb3RvIG91dDsKKwl9CisKKwlyZXQgPSBfX2J0cmZzX29wZW5fZGV2aWNlcyhmc19kZXZpY2VzLCBGTU9ERV9SRUFELAorCQkJCSAgIHJvb3QtPmZzX2luZm8tPmJkZXZfaG9sZGVyKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKworCWlmICghZnNfZGV2aWNlcy0+c2VlZGluZykgeworCQlfX2J0cmZzX2Nsb3NlX2RldmljZXMoZnNfZGV2aWNlcyk7CisJCWZyZWVfZnNfZGV2aWNlcyhmc19kZXZpY2VzKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCisJZnNfZGV2aWNlcy0+c2VlZCA9IHJvb3QtPmZzX2luZm8tPmZzX2RldmljZXMtPnNlZWQ7CisJcm9vdC0+ZnNfaW5mby0+ZnNfZGV2aWNlcy0+c2VlZCA9IGZzX2RldmljZXM7CitvdXQ6CisJbXV0ZXhfdW5sb2NrKCZ1dWlkX211dGV4KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHJlYWRfb25lX2RldihzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwKKwkJCXN0cnVjdCBleHRlbnRfYnVmZmVyICpsZWFmLAorCQkJc3RydWN0IGJ0cmZzX2Rldl9pdGVtICpkZXZfaXRlbSkKK3sKKwlzdHJ1Y3QgYnRyZnNfZGV2aWNlICpkZXZpY2U7CisJdTY0IGRldmlkOworCWludCByZXQ7CisJdTggZnNfdXVpZFtCVFJGU19VVUlEX1NJWkVdOworCXU4IGRldl91dWlkW0JUUkZTX1VVSURfU0laRV07CisKKwlkZXZpZCA9IGJ0cmZzX2RldmljZV9pZChsZWFmLCBkZXZfaXRlbSk7CisJcmVhZF9leHRlbnRfYnVmZmVyKGxlYWYsIGRldl91dWlkLAorCQkJICAgKHVuc2lnbmVkIGxvbmcpYnRyZnNfZGV2aWNlX3V1aWQoZGV2X2l0ZW0pLAorCQkJICAgQlRSRlNfVVVJRF9TSVpFKTsKKwlyZWFkX2V4dGVudF9idWZmZXIobGVhZiwgZnNfdXVpZCwKKwkJCSAgICh1bnNpZ25lZCBsb25nKWJ0cmZzX2RldmljZV9mc2lkKGRldl9pdGVtKSwKKwkJCSAgIEJUUkZTX1VVSURfU0laRSk7CisKKwlpZiAobWVtY21wKGZzX3V1aWQsIHJvb3QtPmZzX2luZm8tPmZzaWQsIEJUUkZTX1VVSURfU0laRSkpIHsKKwkJcmV0ID0gb3Blbl9zZWVkX2RldmljZXMocm9vdCwgZnNfdXVpZCk7CisJCWlmIChyZXQgJiYgIWJ0cmZzX3Rlc3Rfb3B0KHJvb3QsIERFR1JBREVEKSkKKwkJCXJldHVybiByZXQ7CisJfQorCisJZGV2aWNlID0gYnRyZnNfZmluZF9kZXZpY2Uocm9vdCwgZGV2aWQsIGRldl91dWlkLCBmc191dWlkKTsKKwlpZiAoIWRldmljZSB8fCAhZGV2aWNlLT5iZGV2KSB7CisJCWlmICghYnRyZnNfdGVzdF9vcHQocm9vdCwgREVHUkFERUQpKQorCQkJcmV0dXJuIC1FSU87CisKKwkJaWYgKCFkZXZpY2UpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIndhcm5pbmcgZGV2aWQgJWxsdSBtaXNzaW5nXG4iLAorCQkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpZGV2aWQpOworCQkJZGV2aWNlID0gYWRkX21pc3NpbmdfZGV2KHJvb3QsIGRldmlkLCBkZXZfdXVpZCk7CisJCQlpZiAoIWRldmljZSkKKwkJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCX0KKworCWlmIChkZXZpY2UtPmZzX2RldmljZXMgIT0gcm9vdC0+ZnNfaW5mby0+ZnNfZGV2aWNlcykgeworCQlCVUdfT04oZGV2aWNlLT53cml0ZWFibGUpOworCQlpZiAoZGV2aWNlLT5nZW5lcmF0aW9uICE9CisJCSAgICBidHJmc19kZXZpY2VfZ2VuZXJhdGlvbihsZWFmLCBkZXZfaXRlbSkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlmaWxsX2RldmljZV9mcm9tX2l0ZW0obGVhZiwgZGV2X2l0ZW0sIGRldmljZSk7CisJZGV2aWNlLT5kZXZfcm9vdCA9IHJvb3QtPmZzX2luZm8tPmRldl9yb290OworCWRldmljZS0+aW5fZnNfbWV0YWRhdGEgPSAxOworCWlmIChkZXZpY2UtPndyaXRlYWJsZSkKKwkJZGV2aWNlLT5mc19kZXZpY2VzLT50b3RhbF9yd19ieXRlcyArPSBkZXZpY2UtPnRvdGFsX2J5dGVzOworCXJldCA9IDA7CisJcmV0dXJuIHJldDsKK30KKworaW50IGJ0cmZzX3JlYWRfc3VwZXJfZGV2aWNlKHN0cnVjdCBidHJmc19yb290ICpyb290LCBzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqYnVmKQoreworCXN0cnVjdCBidHJmc19kZXZfaXRlbSAqZGV2X2l0ZW07CisKKwlkZXZfaXRlbSA9IChzdHJ1Y3QgYnRyZnNfZGV2X2l0ZW0gKilvZmZzZXRvZihzdHJ1Y3QgYnRyZnNfc3VwZXJfYmxvY2ssCisJCQkJCQkgICAgIGRldl9pdGVtKTsKKwlyZXR1cm4gcmVhZF9vbmVfZGV2KHJvb3QsIGJ1ZiwgZGV2X2l0ZW0pOworfQorCitpbnQgYnRyZnNfcmVhZF9zeXNfYXJyYXkoc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QpCit7CisJc3RydWN0IGJ0cmZzX3N1cGVyX2Jsb2NrICpzdXBlcl9jb3B5ID0gJnJvb3QtPmZzX2luZm8tPnN1cGVyX2NvcHk7CisJc3RydWN0IGV4dGVudF9idWZmZXIgKnNiOworCXN0cnVjdCBidHJmc19kaXNrX2tleSAqZGlza19rZXk7CisJc3RydWN0IGJ0cmZzX2NodW5rICpjaHVuazsKKwl1OCAqcHRyOworCXVuc2lnbmVkIGxvbmcgc2JfcHRyOworCWludCByZXQgPSAwOworCXUzMiBudW1fc3RyaXBlczsKKwl1MzIgYXJyYXlfc2l6ZTsKKwl1MzIgbGVuID0gMDsKKwl1MzIgY3VyOworCXN0cnVjdCBidHJmc19rZXkga2V5OworCisJc2IgPSBidHJmc19maW5kX2NyZWF0ZV90cmVlX2Jsb2NrKHJvb3QsIEJUUkZTX1NVUEVSX0lORk9fT0ZGU0VULAorCQkJCQkgIEJUUkZTX1NVUEVSX0lORk9fU0laRSk7CisJaWYgKCFzYikKKwkJcmV0dXJuIC1FTk9NRU07CisJYnRyZnNfc2V0X2J1ZmZlcl91cHRvZGF0ZShzYik7CisJd3JpdGVfZXh0ZW50X2J1ZmZlcihzYiwgc3VwZXJfY29weSwgMCwgQlRSRlNfU1VQRVJfSU5GT19TSVpFKTsKKwlhcnJheV9zaXplID0gYnRyZnNfc3VwZXJfc3lzX2FycmF5X3NpemUoc3VwZXJfY29weSk7CisKKwlwdHIgPSBzdXBlcl9jb3B5LT5zeXNfY2h1bmtfYXJyYXk7CisJc2JfcHRyID0gb2Zmc2V0b2Yoc3RydWN0IGJ0cmZzX3N1cGVyX2Jsb2NrLCBzeXNfY2h1bmtfYXJyYXkpOworCWN1ciA9IDA7CisKKwl3aGlsZSAoY3VyIDwgYXJyYXlfc2l6ZSkgeworCQlkaXNrX2tleSA9IChzdHJ1Y3QgYnRyZnNfZGlza19rZXkgKilwdHI7CisJCWJ0cmZzX2Rpc2tfa2V5X3RvX2NwdSgma2V5LCBkaXNrX2tleSk7CisKKwkJbGVuID0gc2l6ZW9mKCpkaXNrX2tleSk7IHB0ciArPSBsZW47CisJCXNiX3B0ciArPSBsZW47CisJCWN1ciArPSBsZW47CisKKwkJaWYgKGtleS50eXBlID09IEJUUkZTX0NIVU5LX0lURU1fS0VZKSB7CisJCQljaHVuayA9IChzdHJ1Y3QgYnRyZnNfY2h1bmsgKilzYl9wdHI7CisJCQlyZXQgPSByZWFkX29uZV9jaHVuayhyb290LCAma2V5LCBzYiwgY2h1bmspOworCQkJaWYgKHJldCkKKwkJCQlicmVhazsKKwkJCW51bV9zdHJpcGVzID0gYnRyZnNfY2h1bmtfbnVtX3N0cmlwZXMoc2IsIGNodW5rKTsKKwkJCWxlbiA9IGJ0cmZzX2NodW5rX2l0ZW1fc2l6ZShudW1fc3RyaXBlcyk7CisJCX0gZWxzZSB7CisJCQlyZXQgPSAtRUlPOworCQkJYnJlYWs7CisJCX0KKwkJcHRyICs9IGxlbjsKKwkJc2JfcHRyICs9IGxlbjsKKwkJY3VyICs9IGxlbjsKKwl9CisJZnJlZV9leHRlbnRfYnVmZmVyKHNiKTsKKwlyZXR1cm4gcmV0OworfQorCitpbnQgYnRyZnNfcmVhZF9jaHVua190cmVlKHN0cnVjdCBidHJmc19yb290ICpyb290KQoreworCXN0cnVjdCBidHJmc19wYXRoICpwYXRoOworCXN0cnVjdCBleHRlbnRfYnVmZmVyICpsZWFmOworCXN0cnVjdCBidHJmc19rZXkga2V5OworCXN0cnVjdCBidHJmc19rZXkgZm91bmRfa2V5OworCWludCByZXQ7CisJaW50IHNsb3Q7CisKKwlyb290ID0gcm9vdC0+ZnNfaW5mby0+Y2h1bmtfcm9vdDsKKworCXBhdGggPSBidHJmc19hbGxvY19wYXRoKCk7CisJaWYgKCFwYXRoKQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qIGZpcnN0IHdlIHNlYXJjaCBmb3IgYWxsIG9mIHRoZSBkZXZpY2UgaXRlbXMsIGFuZCB0aGVuIHdlCisJICogcmVhZCBpbiBhbGwgb2YgdGhlIGNodW5rIGl0ZW1zLiAgVGhpcyB3YXkgd2UgY2FuIGNyZWF0ZSBjaHVuaworCSAqIG1hcHBpbmdzIHRoYXQgcmVmZXJlbmNlIGFsbCBvZiB0aGUgZGV2aWNlcyB0aGF0IGFyZSBhZm91bmQKKwkgKi8KKwlrZXkub2JqZWN0aWQgPSBCVFJGU19ERVZfSVRFTVNfT0JKRUNUSUQ7CisJa2V5Lm9mZnNldCA9IDA7CisJa2V5LnR5cGUgPSAwOworYWdhaW46CisJcmV0ID0gYnRyZnNfc2VhcmNoX3Nsb3QoTlVMTCwgcm9vdCwgJmtleSwgcGF0aCwgMCwgMCk7CisJd2hpbGUgKDEpIHsKKwkJbGVhZiA9IHBhdGgtPm5vZGVzWzBdOworCQlzbG90ID0gcGF0aC0+c2xvdHNbMF07CisJCWlmIChzbG90ID49IGJ0cmZzX2hlYWRlcl9ucml0ZW1zKGxlYWYpKSB7CisJCQlyZXQgPSBidHJmc19uZXh0X2xlYWYocm9vdCwgcGF0aCk7CisJCQlpZiAocmV0ID09IDApCisJCQkJY29udGludWU7CisJCQlpZiAocmV0IDwgMCkKKwkJCQlnb3RvIGVycm9yOworCQkJYnJlYWs7CisJCX0KKwkJYnRyZnNfaXRlbV9rZXlfdG9fY3B1KGxlYWYsICZmb3VuZF9rZXksIHNsb3QpOworCQlpZiAoa2V5Lm9iamVjdGlkID09IEJUUkZTX0RFVl9JVEVNU19PQkpFQ1RJRCkgeworCQkJaWYgKGZvdW5kX2tleS5vYmplY3RpZCAhPSBCVFJGU19ERVZfSVRFTVNfT0JKRUNUSUQpCisJCQkJYnJlYWs7CisJCQlpZiAoZm91bmRfa2V5LnR5cGUgPT0gQlRSRlNfREVWX0lURU1fS0VZKSB7CisJCQkJc3RydWN0IGJ0cmZzX2Rldl9pdGVtICpkZXZfaXRlbTsKKwkJCQlkZXZfaXRlbSA9IGJ0cmZzX2l0ZW1fcHRyKGxlYWYsIHNsb3QsCisJCQkJCQkgIHN0cnVjdCBidHJmc19kZXZfaXRlbSk7CisJCQkJcmV0ID0gcmVhZF9vbmVfZGV2KHJvb3QsIGxlYWYsIGRldl9pdGVtKTsKKwkJCQlpZiAocmV0KQorCQkJCQlnb3RvIGVycm9yOworCQkJfQorCQl9IGVsc2UgaWYgKGZvdW5kX2tleS50eXBlID09IEJUUkZTX0NIVU5LX0lURU1fS0VZKSB7CisJCQlzdHJ1Y3QgYnRyZnNfY2h1bmsgKmNodW5rOworCQkJY2h1bmsgPSBidHJmc19pdGVtX3B0cihsZWFmLCBzbG90LCBzdHJ1Y3QgYnRyZnNfY2h1bmspOworCQkJcmV0ID0gcmVhZF9vbmVfY2h1bmsocm9vdCwgJmZvdW5kX2tleSwgbGVhZiwgY2h1bmspOworCQkJaWYgKHJldCkKKwkJCQlnb3RvIGVycm9yOworCQl9CisJCXBhdGgtPnNsb3RzWzBdKys7CisJfQorCWlmIChrZXkub2JqZWN0aWQgPT0gQlRSRlNfREVWX0lURU1TX09CSkVDVElEKSB7CisJCWtleS5vYmplY3RpZCA9IDA7CisJCWJ0cmZzX3JlbGVhc2VfcGF0aChyb290LCBwYXRoKTsKKwkJZ290byBhZ2FpbjsKKwl9CisJcmV0ID0gMDsKK2Vycm9yOgorCWJ0cmZzX2ZyZWVfcGF0aChwYXRoKTsKKwlyZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvZnMvYnRyZnMvdm9sdW1lcy5oIGIvZnMvYnRyZnMvdm9sdW1lcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2YzQ0ZTkKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9idHJmcy92b2x1bWVzLmgKQEAgLTAsMCArMSwxNjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgT3JhY2xlLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgdjIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKKyAqIEJvc3RvbiwgTUEgMDIxMTEwLTEzMDcsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fQlRSRlNfVk9MVU1FU18KKyNkZWZpbmUgX19CVFJGU19WT0xVTUVTXworCisjaW5jbHVkZSA8bGludXgvYmlvLmg+CisjaW5jbHVkZSAiYXN5bmMtdGhyZWFkLmgiCisKK3N0cnVjdCBidWZmZXJfaGVhZDsKK3N0cnVjdCBidHJmc19kZXZpY2UgeworCXN0cnVjdCBsaXN0X2hlYWQgZGV2X2xpc3Q7CisJc3RydWN0IGxpc3RfaGVhZCBkZXZfYWxsb2NfbGlzdDsKKwlzdHJ1Y3QgYnRyZnNfZnNfZGV2aWNlcyAqZnNfZGV2aWNlczsKKwlzdHJ1Y3QgYnRyZnNfcm9vdCAqZGV2X3Jvb3Q7CisJc3RydWN0IGJpbyAqcGVuZGluZ19iaW9zOworCXN0cnVjdCBiaW8gKnBlbmRpbmdfYmlvX3RhaWw7CisJaW50IHJ1bm5pbmdfcGVuZGluZzsKKwl1NjQgZ2VuZXJhdGlvbjsKKworCWludCBiYXJyaWVyczsKKwlpbnQgd3JpdGVhYmxlOworCWludCBpbl9mc19tZXRhZGF0YTsKKworCXNwaW5sb2NrX3QgaW9fbG9jazsKKworCXN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXY7CisKKwkvKiB0aGUgbW9kZSBzZW50IHRvIG9wZW5fYmRldl9leGNsdXNpdmUgKi8KKwlmbW9kZV90IG1vZGU7CisKKwljaGFyICpuYW1lOworCisJLyogdGhlIGludGVybmFsIGJ0cmZzIGRldmljZSBpZCAqLworCXU2NCBkZXZpZDsKKworCS8qIHNpemUgb2YgdGhlIGRldmljZSAqLworCXU2NCB0b3RhbF9ieXRlczsKKworCS8qIGJ5dGVzIHVzZWQgKi8KKwl1NjQgYnl0ZXNfdXNlZDsKKworCS8qIG9wdGltYWwgaW8gYWxpZ25tZW50IGZvciB0aGlzIGRldmljZSAqLworCXUzMiBpb19hbGlnbjsKKworCS8qIG9wdGltYWwgaW8gd2lkdGggZm9yIHRoaXMgZGV2aWNlICovCisJdTMyIGlvX3dpZHRoOworCisJLyogbWluaW1hbCBpbyBzaXplIGZvciB0aGlzIGRldmljZSAqLworCXUzMiBzZWN0b3Jfc2l6ZTsKKworCS8qIHR5cGUgYW5kIGluZm8gYWJvdXQgdGhpcyBkZXZpY2UgKi8KKwl1NjQgdHlwZTsKKworCS8qIHBoeXNpY2FsIGRyaXZlIHV1aWQgKG9yIGx2bSB1dWlkKSAqLworCXU4IHV1aWRbQlRSRlNfVVVJRF9TSVpFXTsKKworCXN0cnVjdCBidHJmc193b3JrIHdvcms7Cit9OworCitzdHJ1Y3QgYnRyZnNfZnNfZGV2aWNlcyB7CisJdTggZnNpZFtCVFJGU19GU0lEX1NJWkVdOyAvKiBGUyBzcGVjaWZpYyB1dWlkICovCisKKwkvKiB0aGUgZGV2aWNlIHdpdGggdGhpcyBpZCBoYXMgdGhlIG1vc3QgcmVjZW50IGNveXAgb2YgdGhlIHN1cGVyICovCisJdTY0IGxhdGVzdF9kZXZpZDsKKwl1NjQgbGF0ZXN0X3RyYW5zOworCXU2NCBudW1fZGV2aWNlczsKKwl1NjQgb3Blbl9kZXZpY2VzOworCXU2NCByd19kZXZpY2VzOworCXU2NCB0b3RhbF9yd19ieXRlczsKKwlzdHJ1Y3QgYmxvY2tfZGV2aWNlICpsYXRlc3RfYmRldjsKKwkvKiBhbGwgb2YgdGhlIGRldmljZXMgaW4gdGhlIEZTICovCisJc3RydWN0IGxpc3RfaGVhZCBkZXZpY2VzOworCisJLyogZGV2aWNlcyBub3QgY3VycmVudGx5IGJlaW5nIGFsbG9jYXRlZCAqLworCXN0cnVjdCBsaXN0X2hlYWQgYWxsb2NfbGlzdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisKKwlzdHJ1Y3QgYnRyZnNfZnNfZGV2aWNlcyAqc2VlZDsKKwlpbnQgc2VlZGluZzsKKworCWludCBvcGVuZWQ7Cit9OworCitzdHJ1Y3QgYnRyZnNfYmlvX3N0cmlwZSB7CisJc3RydWN0IGJ0cmZzX2RldmljZSAqZGV2OworCXU2NCBwaHlzaWNhbDsKK307CisKK3N0cnVjdCBidHJmc19tdWx0aV9iaW8geworCWF0b21pY190IHN0cmlwZXNfcGVuZGluZzsKKwliaW9fZW5kX2lvX3QgKmVuZF9pbzsKKwlzdHJ1Y3QgYmlvICpvcmlnX2JpbzsKKwl2b2lkICpwcml2YXRlOworCWF0b21pY190IGVycm9yOworCWludCBtYXhfZXJyb3JzOworCWludCBudW1fc3RyaXBlczsKKwlzdHJ1Y3QgYnRyZnNfYmlvX3N0cmlwZSBzdHJpcGVzW107Cit9OworCisjZGVmaW5lIGJ0cmZzX211bHRpX2Jpb19zaXplKG4pIChzaXplb2Yoc3RydWN0IGJ0cmZzX211bHRpX2JpbykgKyBcCisJCQkgICAgKHNpemVvZihzdHJ1Y3QgYnRyZnNfYmlvX3N0cmlwZSkgKiAobikpKQorCitpbnQgYnRyZnNfYWxsb2NfZGV2X2V4dGVudChzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKKwkJCSAgIHN0cnVjdCBidHJmc19kZXZpY2UgKmRldmljZSwKKwkJCSAgIHU2NCBjaHVua190cmVlLCB1NjQgY2h1bmtfb2JqZWN0aWQsCisJCQkgICB1NjQgY2h1bmtfb2Zmc2V0LCB1NjQgc3RhcnQsIHU2NCBudW1fYnl0ZXMpOworaW50IGJ0cmZzX21hcF9ibG9jayhzdHJ1Y3QgYnRyZnNfbWFwcGluZ190cmVlICptYXBfdHJlZSwgaW50IHJ3LAorCQkgICAgdTY0IGxvZ2ljYWwsIHU2NCAqbGVuZ3RoLAorCQkgICAgc3RydWN0IGJ0cmZzX211bHRpX2JpbyAqKm11bHRpX3JldCwgaW50IG1pcnJvcl9udW0pOworaW50IGJ0cmZzX3JtYXBfYmxvY2soc3RydWN0IGJ0cmZzX21hcHBpbmdfdHJlZSAqbWFwX3RyZWUsCisJCSAgICAgdTY0IGNodW5rX3N0YXJ0LCB1NjQgcGh5c2ljYWwsIHU2NCBkZXZpZCwKKwkJICAgICB1NjQgKipsb2dpY2FsLCBpbnQgKm5hZGRycywgaW50ICpzdHJpcGVfbGVuKTsKK2ludCBidHJmc19yZWFkX3N5c19hcnJheShzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCk7CitpbnQgYnRyZnNfcmVhZF9jaHVua190cmVlKHN0cnVjdCBidHJmc19yb290ICpyb290KTsKK2ludCBidHJmc19hbGxvY19jaHVuayhzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKKwkJICAgICAgc3RydWN0IGJ0cmZzX3Jvb3QgKmV4dGVudF9yb290LCB1NjQgdHlwZSk7Cit2b2lkIGJ0cmZzX21hcHBpbmdfaW5pdChzdHJ1Y3QgYnRyZnNfbWFwcGluZ190cmVlICp0cmVlKTsKK3ZvaWQgYnRyZnNfbWFwcGluZ190cmVlX2ZyZWUoc3RydWN0IGJ0cmZzX21hcHBpbmdfdHJlZSAqdHJlZSk7CitpbnQgYnRyZnNfbWFwX2JpbyhzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwgaW50IHJ3LCBzdHJ1Y3QgYmlvICpiaW8sCisJCSAgaW50IG1pcnJvcl9udW0sIGludCBhc3luY19zdWJtaXQpOworaW50IGJ0cmZzX3JlYWRfc3VwZXJfZGV2aWNlKHN0cnVjdCBidHJmc19yb290ICpyb290LCBzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqYnVmKTsKK2ludCBidHJmc19vcGVuX2RldmljZXMoc3RydWN0IGJ0cmZzX2ZzX2RldmljZXMgKmZzX2RldmljZXMsCisJCSAgICAgICBmbW9kZV90IGZsYWdzLCB2b2lkICpob2xkZXIpOworaW50IGJ0cmZzX3NjYW5fb25lX2RldmljZShjb25zdCBjaGFyICpwYXRoLCBmbW9kZV90IGZsYWdzLCB2b2lkICpob2xkZXIsCisJCQkgIHN0cnVjdCBidHJmc19mc19kZXZpY2VzICoqZnNfZGV2aWNlc19yZXQpOworaW50IGJ0cmZzX2Nsb3NlX2RldmljZXMoc3RydWN0IGJ0cmZzX2ZzX2RldmljZXMgKmZzX2RldmljZXMpOworaW50IGJ0cmZzX2Nsb3NlX2V4dHJhX2RldmljZXMoc3RydWN0IGJ0cmZzX2ZzX2RldmljZXMgKmZzX2RldmljZXMpOworaW50IGJ0cmZzX2FkZF9kZXZpY2Uoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCisJCSAgICAgc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsCisJCSAgICAgc3RydWN0IGJ0cmZzX2RldmljZSAqZGV2aWNlKTsKK2ludCBidHJmc19ybV9kZXZpY2Uoc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsIGNoYXIgKmRldmljZV9wYXRoKTsKK2ludCBidHJmc19jbGVhbnVwX2ZzX3V1aWRzKHZvaWQpOworaW50IGJ0cmZzX251bV9jb3BpZXMoc3RydWN0IGJ0cmZzX21hcHBpbmdfdHJlZSAqbWFwX3RyZWUsIHU2NCBsb2dpY2FsLCB1NjQgbGVuKTsKK2ludCBidHJmc191bnBsdWdfcGFnZShzdHJ1Y3QgYnRyZnNfbWFwcGluZ190cmVlICptYXBfdHJlZSwKKwkJICAgICAgdTY0IGxvZ2ljYWwsIHN0cnVjdCBwYWdlICpwYWdlKTsKK2ludCBidHJmc19ncm93X2RldmljZShzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKKwkJICAgICAgc3RydWN0IGJ0cmZzX2RldmljZSAqZGV2aWNlLCB1NjQgbmV3X3NpemUpOworc3RydWN0IGJ0cmZzX2RldmljZSAqYnRyZnNfZmluZF9kZXZpY2Uoc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsIHU2NCBkZXZpZCwKKwkJCQkgICAgICAgdTggKnV1aWQsIHU4ICpmc2lkKTsKK2ludCBidHJmc19zaHJpbmtfZGV2aWNlKHN0cnVjdCBidHJmc19kZXZpY2UgKmRldmljZSwgdTY0IG5ld19zaXplKTsKK2ludCBidHJmc19pbml0X25ld19kZXZpY2Uoc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsIGNoYXIgKnBhdGgpOworaW50IGJ0cmZzX2JhbGFuY2Uoc3RydWN0IGJ0cmZzX3Jvb3QgKmRldl9yb290KTsKK3ZvaWQgYnRyZnNfdW5sb2NrX3ZvbHVtZXModm9pZCk7Cit2b2lkIGJ0cmZzX2xvY2tfdm9sdW1lcyh2b2lkKTsKK2ludCBidHJmc19jaHVua19yZWFkb25seShzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwgdTY0IGNodW5rX29mZnNldCk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2ZzL2J0cmZzL3hhdHRyLmMgYi9mcy9idHJmcy94YXR0ci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmMzMyZTIKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9idHJmcy94YXR0ci5jCkBAIC0wLDAgKzEsMzIyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFJlZCBIYXQuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSB2MiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorICogQm9zdG9uLCBNQSAwMjExMTAtMTMwNywgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvcndzZW0uaD4KKyNpbmNsdWRlIDxsaW51eC94YXR0ci5oPgorI2luY2x1ZGUgImN0cmVlLmgiCisjaW5jbHVkZSAiYnRyZnNfaW5vZGUuaCIKKyNpbmNsdWRlICJ0cmFuc2FjdGlvbi5oIgorI2luY2x1ZGUgInhhdHRyLmgiCisjaW5jbHVkZSAiZGlzay1pby5oIgorCisKK3NzaXplX3QgX19idHJmc19nZXR4YXR0cihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjb25zdCBjaGFyICpuYW1lLAorCQkJCXZvaWQgKmJ1ZmZlciwgc2l6ZV90IHNpemUpCit7CisJc3RydWN0IGJ0cmZzX2Rpcl9pdGVtICpkaTsKKwlzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCA9IEJUUkZTX0koaW5vZGUpLT5yb290OworCXN0cnVjdCBidHJmc19wYXRoICpwYXRoOworCXN0cnVjdCBleHRlbnRfYnVmZmVyICpsZWFmOworCWludCByZXQgPSAwOworCXVuc2lnbmVkIGxvbmcgZGF0YV9wdHI7CisKKwlwYXRoID0gYnRyZnNfYWxsb2NfcGF0aCgpOworCWlmICghcGF0aCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkvKiBsb29rdXAgdGhlIHhhdHRyIGJ5IG5hbWUgKi8KKwlkaSA9IGJ0cmZzX2xvb2t1cF94YXR0cihOVUxMLCByb290LCBwYXRoLCBpbm9kZS0+aV9pbm8sIG5hbWUsCisJCQkJc3RybGVuKG5hbWUpLCAwKTsKKwlpZiAoIWRpIHx8IElTX0VSUihkaSkpIHsKKwkJcmV0ID0gLUVOT0RBVEE7CisJCWdvdG8gb3V0OworCX0KKworCWxlYWYgPSBwYXRoLT5ub2Rlc1swXTsKKwkvKiBpZiBzaXplIGlzIDAsIHRoYXQgbWVhbnMgd2Ugd2FudCB0aGUgc2l6ZSBvZiB0aGUgYXR0ciAqLworCWlmICghc2l6ZSkgeworCQlyZXQgPSBidHJmc19kaXJfZGF0YV9sZW4obGVhZiwgZGkpOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBub3cgZ2V0IHRoZSBkYXRhIG91dCBvZiBvdXIgZGlyX2l0ZW0gKi8KKwlpZiAoYnRyZnNfZGlyX2RhdGFfbGVuKGxlYWYsIGRpKSA+IHNpemUpIHsKKwkJcmV0ID0gLUVSQU5HRTsKKwkJZ290byBvdXQ7CisJfQorCWRhdGFfcHRyID0gKHVuc2lnbmVkIGxvbmcpKChjaGFyICopKGRpICsgMSkgKworCQkJCSAgIGJ0cmZzX2Rpcl9uYW1lX2xlbihsZWFmLCBkaSkpOworCXJlYWRfZXh0ZW50X2J1ZmZlcihsZWFmLCBidWZmZXIsIGRhdGFfcHRyLAorCQkJICAgYnRyZnNfZGlyX2RhdGFfbGVuKGxlYWYsIGRpKSk7CisJcmV0ID0gYnRyZnNfZGlyX2RhdGFfbGVuKGxlYWYsIGRpKTsKKworb3V0OgorCWJ0cmZzX2ZyZWVfcGF0aChwYXRoKTsKKwlyZXR1cm4gcmV0OworfQorCitpbnQgX19idHJmc19zZXR4YXR0cihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjb25zdCBjaGFyICpuYW1lLAorCQkJICAgIGNvbnN0IHZvaWQgKnZhbHVlLCBzaXplX3Qgc2l6ZSwgaW50IGZsYWdzKQoreworCXN0cnVjdCBidHJmc19kaXJfaXRlbSAqZGk7CisJc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QgPSBCVFJGU19JKGlub2RlKS0+cm9vdDsKKwlzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFuczsKKwlzdHJ1Y3QgYnRyZnNfcGF0aCAqcGF0aDsKKwlpbnQgcmV0ID0gMCwgbW9kID0gMDsKKworCXBhdGggPSBidHJmc19hbGxvY19wYXRoKCk7CisJaWYgKCFwYXRoKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXRyYW5zID0gYnRyZnNfc3RhcnRfdHJhbnNhY3Rpb24ocm9vdCwgMSk7CisJYnRyZnNfc2V0X3RyYW5zX2Jsb2NrX2dyb3VwKHRyYW5zLCBpbm9kZSk7CisKKwkvKiBmaXJzdCBsZXRzIHNlZSBpZiB3ZSBhbHJlYWR5IGhhdmUgdGhpcyB4YXR0ciAqLworCWRpID0gYnRyZnNfbG9va3VwX3hhdHRyKHRyYW5zLCByb290LCBwYXRoLCBpbm9kZS0+aV9pbm8sIG5hbWUsCisJCQkJc3RybGVuKG5hbWUpLCAtMSk7CisJaWYgKElTX0VSUihkaSkpIHsKKwkJcmV0ID0gUFRSX0VSUihkaSk7CisJCWdvdG8gb3V0OworCX0KKworCS8qIG9rIHdlIGFscmVhZHkgaGF2ZSB0aGlzIHhhdHRyLCBsZXRzIHJlbW92ZSBpdCAqLworCWlmIChkaSkgeworCQkvKiBpZiB3ZSB3YW50IGNyZWF0ZSBvbmx5IGV4aXQgKi8KKwkJaWYgKGZsYWdzICYgWEFUVFJfQ1JFQVRFKSB7CisJCQlyZXQgPSAtRUVYSVNUOworCQkJZ290byBvdXQ7CisJCX0KKworCQlyZXQgPSBidHJmc19kZWxldGVfb25lX2Rpcl9uYW1lKHRyYW5zLCByb290LCBwYXRoLCBkaSk7CisJCWlmIChyZXQpCisJCQlnb3RvIG91dDsKKwkJYnRyZnNfcmVsZWFzZV9wYXRoKHJvb3QsIHBhdGgpOworCisJCS8qIGlmIHdlIGRvbid0IGhhdmUgYSB2YWx1ZSB0aGVuIHdlIGFyZSByZW1vdmluZyB0aGUgeGF0dHIgKi8KKwkJaWYgKCF2YWx1ZSkgeworCQkJbW9kID0gMTsKKwkJCWdvdG8gb3V0OworCQl9CisJfSBlbHNlIHsKKwkJYnRyZnNfcmVsZWFzZV9wYXRoKHJvb3QsIHBhdGgpOworCisJCWlmIChmbGFncyAmIFhBVFRSX1JFUExBQ0UpIHsKKwkJCS8qIHdlIGNvdWxkbid0IGZpbmQgdGhlIGF0dHIgdG8gcmVwbGFjZSAqLworCQkJcmV0ID0gLUVOT0RBVEE7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKworCS8qIG9rIHdlIGhhdmUgdG8gY3JlYXRlIGEgY29tcGxldGVseSBuZXcgeGF0dHIgKi8KKwlyZXQgPSBidHJmc19pbnNlcnRfeGF0dHJfaXRlbSh0cmFucywgcm9vdCwgbmFtZSwgc3RybGVuKG5hbWUpLAorCQkJCSAgICAgIHZhbHVlLCBzaXplLCBpbm9kZS0+aV9pbm8pOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCW1vZCA9IDE7CisKK291dDoKKwlpZiAobW9kKSB7CisJCWlub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FOworCQlyZXQgPSBidHJmc191cGRhdGVfaW5vZGUodHJhbnMsIHJvb3QsIGlub2RlKTsKKwl9CisKKwlidHJmc19lbmRfdHJhbnNhY3Rpb24odHJhbnMsIHJvb3QpOworCWJ0cmZzX2ZyZWVfcGF0aChwYXRoKTsKKwlyZXR1cm4gcmV0OworfQorCitzc2l6ZV90IGJ0cmZzX2xpc3R4YXR0cihzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGNoYXIgKmJ1ZmZlciwgc2l6ZV90IHNpemUpCit7CisJc3RydWN0IGJ0cmZzX2tleSBrZXksIGZvdW5kX2tleTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBidHJmc19yb290ICpyb290ID0gQlRSRlNfSShpbm9kZSktPnJvb3Q7CisJc3RydWN0IGJ0cmZzX3BhdGggKnBhdGg7CisJc3RydWN0IGJ0cmZzX2l0ZW0gKml0ZW07CisJc3RydWN0IGV4dGVudF9idWZmZXIgKmxlYWY7CisJc3RydWN0IGJ0cmZzX2Rpcl9pdGVtICpkaTsKKwlpbnQgcmV0ID0gMCwgc2xvdCwgYWR2YW5jZTsKKwlzaXplX3QgdG90YWxfc2l6ZSA9IDAsIHNpemVfbGVmdCA9IHNpemU7CisJdW5zaWduZWQgbG9uZyBuYW1lX3B0cjsKKwlzaXplX3QgbmFtZV9sZW47CisJdTMyIG5yaXRlbXM7CisKKwkvKgorCSAqIG9rIHdlIHdhbnQgYWxsIG9iamVjdHMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgaWQuCisJICogTk9URTogd2Ugc2V0IGtleS5vZmZzZXQgPSAwOyBiZWNhdXNlIHdlIHdhbnQgdG8gc3RhcnQgd2l0aCB0aGUKKwkgKiBmaXJzdCB4YXR0ciB0aGF0IHdlIGZpbmQgYW5kIHdhbGsgZm9yd2FyZAorCSAqLworCWtleS5vYmplY3RpZCA9IGlub2RlLT5pX2lubzsKKwlidHJmc19zZXRfa2V5X3R5cGUoJmtleSwgQlRSRlNfWEFUVFJfSVRFTV9LRVkpOworCWtleS5vZmZzZXQgPSAwOworCisJcGF0aCA9IGJ0cmZzX2FsbG9jX3BhdGgoKTsKKwlpZiAoIXBhdGgpCisJCXJldHVybiAtRU5PTUVNOworCXBhdGgtPnJlYWRhID0gMjsKKworCS8qIHNlYXJjaCBmb3Igb3VyIHhhdHRycyAqLworCXJldCA9IGJ0cmZzX3NlYXJjaF9zbG90KE5VTEwsIHJvb3QsICZrZXksIHBhdGgsIDAsIDApOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycjsKKwlyZXQgPSAwOworCWFkdmFuY2UgPSAwOworCXdoaWxlICgxKSB7CisJCWxlYWYgPSBwYXRoLT5ub2Rlc1swXTsKKwkJbnJpdGVtcyA9IGJ0cmZzX2hlYWRlcl9ucml0ZW1zKGxlYWYpOworCQlzbG90ID0gcGF0aC0+c2xvdHNbMF07CisKKwkJLyogdGhpcyBpcyB3aGVyZSB3ZSBzdGFydCB3YWxraW5nIHRocm91Z2ggdGhlIHBhdGggKi8KKwkJaWYgKGFkdmFuY2UgfHwgc2xvdCA+PSBucml0ZW1zKSB7CisJCQkvKgorCQkJICogaWYgd2UndmUgcmVhY2hlZCB0aGUgbGFzdCBzbG90IGluIHRoaXMgbGVhZiB3ZSBuZWVkCisJCQkgKiB0byBnbyB0byB0aGUgbmV4dCBsZWFmIGFuZCByZXNldCBldmVyeXRoaW5nCisJCQkgKi8KKwkJCWlmIChzbG90ID49IG5yaXRlbXMtMSkgeworCQkJCXJldCA9IGJ0cmZzX25leHRfbGVhZihyb290LCBwYXRoKTsKKwkJCQlpZiAocmV0KQorCQkJCQlicmVhazsKKwkJCQlsZWFmID0gcGF0aC0+bm9kZXNbMF07CisJCQkJbnJpdGVtcyA9IGJ0cmZzX2hlYWRlcl9ucml0ZW1zKGxlYWYpOworCQkJCXNsb3QgPSBwYXRoLT5zbG90c1swXTsKKwkJCX0gZWxzZSB7CisJCQkJLyoKKwkJCQkgKiBqdXN0IHdhbGtpbmcgdGhyb3VnaCB0aGUgc2xvdHMgb24gdGhpcyBsZWFmCisJCQkJICovCisJCQkJc2xvdCsrOworCQkJCXBhdGgtPnNsb3RzWzBdKys7CisJCQl9CisJCX0KKwkJYWR2YW5jZSA9IDE7CisKKwkJaXRlbSA9IGJ0cmZzX2l0ZW1fbnIobGVhZiwgc2xvdCk7CisJCWJ0cmZzX2l0ZW1fa2V5X3RvX2NwdShsZWFmLCAmZm91bmRfa2V5LCBzbG90KTsKKworCQkvKiBjaGVjayB0byBtYWtlIHN1cmUgdGhpcyBpdGVtIGlzIHdoYXQgd2Ugd2FudCAqLworCQlpZiAoZm91bmRfa2V5Lm9iamVjdGlkICE9IGtleS5vYmplY3RpZCkKKwkJCWJyZWFrOworCQlpZiAoYnRyZnNfa2V5X3R5cGUoJmZvdW5kX2tleSkgIT0gQlRSRlNfWEFUVFJfSVRFTV9LRVkpCisJCQlicmVhazsKKworCQlkaSA9IGJ0cmZzX2l0ZW1fcHRyKGxlYWYsIHNsb3QsIHN0cnVjdCBidHJmc19kaXJfaXRlbSk7CisKKwkJbmFtZV9sZW4gPSBidHJmc19kaXJfbmFtZV9sZW4obGVhZiwgZGkpOworCQl0b3RhbF9zaXplICs9IG5hbWVfbGVuICsgMTsKKworCQkvKiB3ZSBhcmUganVzdCBsb29raW5nIGZvciBob3cgYmlnIG91ciBidWZmZXIgbmVlZHMgdG8gYmUgKi8KKwkJaWYgKCFzaXplKQorCQkJY29udGludWU7CisKKwkJaWYgKCFidWZmZXIgfHwgKG5hbWVfbGVuICsgMSkgPiBzaXplX2xlZnQpIHsKKwkJCXJldCA9IC1FUkFOR0U7CisJCQlnb3RvIGVycjsKKwkJfQorCisJCW5hbWVfcHRyID0gKHVuc2lnbmVkIGxvbmcpKGRpICsgMSk7CisJCXJlYWRfZXh0ZW50X2J1ZmZlcihsZWFmLCBidWZmZXIsIG5hbWVfcHRyLCBuYW1lX2xlbik7CisJCWJ1ZmZlcltuYW1lX2xlbl0gPSAnXDAnOworCisJCXNpemVfbGVmdCAtPSBuYW1lX2xlbiArIDE7CisJCWJ1ZmZlciArPSBuYW1lX2xlbiArIDE7CisJfQorCXJldCA9IHRvdGFsX3NpemU7CisKK2VycjoKKwlidHJmc19mcmVlX3BhdGgocGF0aCk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogTGlzdCBvZiBoYW5kbGVycyBmb3Igc3ludGhldGljIHN5c3RlbS4qIGF0dHJpYnV0ZXMuICBBbGwgcmVhbCBvbmRpc2sKKyAqIGF0dHJpYnV0ZXMgYXJlIGhhbmRsZWQgZGlyZWN0bHkuCisgKi8KK3N0cnVjdCB4YXR0cl9oYW5kbGVyICpidHJmc194YXR0cl9oYW5kbGVyc1tdID0geworI2lmZGVmIENPTkZJR19GU19QT1NJWF9BQ0wKKwkmYnRyZnNfeGF0dHJfYWNsX2FjY2Vzc19oYW5kbGVyLAorCSZidHJmc194YXR0cl9hY2xfZGVmYXVsdF9oYW5kbGVyLAorI2VuZGlmCisJTlVMTCwKK307CisKKy8qCisgKiBDaGVjayBpZiB0aGUgYXR0cmlidXRlIGlzIGluIGEgc3VwcG9ydGVkIG5hbWVzcGFjZS4KKyAqCisgKiBUaGlzIGFwcGxpZWQgYWZ0ZXIgdGhlIGNoZWNrIGZvciB0aGUgc3ludGhldGljIGF0dHJpYnV0ZXMgaW4gdGhlIHN5c3RlbQorICogbmFtZXNwYWNlLgorICovCitzdGF0aWMgYm9vbCBidHJmc19pc192YWxpZF94YXR0cihjb25zdCBjaGFyICpuYW1lKQoreworCXJldHVybiAhc3RybmNtcChuYW1lLCBYQVRUUl9TRUNVUklUWV9QUkVGSVgsCisJCQlYQVRUUl9TRUNVUklUWV9QUkVGSVhfTEVOKSB8fAorCSAgICAgICAhc3RybmNtcChuYW1lLCBYQVRUUl9TWVNURU1fUFJFRklYLCBYQVRUUl9TWVNURU1fUFJFRklYX0xFTikgfHwKKwkgICAgICAgIXN0cm5jbXAobmFtZSwgWEFUVFJfVFJVU1RFRF9QUkVGSVgsIFhBVFRSX1RSVVNURURfUFJFRklYX0xFTikgfHwKKwkgICAgICAgIXN0cm5jbXAobmFtZSwgWEFUVFJfVVNFUl9QUkVGSVgsIFhBVFRSX1VTRVJfUFJFRklYX0xFTik7Cit9CisKK3NzaXplX3QgYnRyZnNfZ2V0eGF0dHIoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBjb25zdCBjaGFyICpuYW1lLAorCQkgICAgICAgdm9pZCAqYnVmZmVyLCBzaXplX3Qgc2l6ZSkKK3sKKwkvKgorCSAqIElmIHRoaXMgaXMgYSByZXF1ZXN0IGZvciBhIHN5bnRoZXRpYyBhdHRyaWJ1dGUgaW4gdGhlIHN5c3RlbS4qCisJICogbmFtZXNwYWNlIHVzZSB0aGUgZ2VuZXJpYyBpbmZyYXN0cnVjdHVyZSB0byByZXNvbHZlIGEgaGFuZGxlcgorCSAqIGZvciBpdCB2aWEgc2ItPnNfeGF0dHIuCisJICovCisJaWYgKCFzdHJuY21wKG5hbWUsIFhBVFRSX1NZU1RFTV9QUkVGSVgsIFhBVFRSX1NZU1RFTV9QUkVGSVhfTEVOKSkKKwkJcmV0dXJuIGdlbmVyaWNfZ2V0eGF0dHIoZGVudHJ5LCBuYW1lLCBidWZmZXIsIHNpemUpOworCisJaWYgKCFidHJmc19pc192YWxpZF94YXR0cihuYW1lKSkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCXJldHVybiBfX2J0cmZzX2dldHhhdHRyKGRlbnRyeS0+ZF9pbm9kZSwgbmFtZSwgYnVmZmVyLCBzaXplKTsKK30KKworaW50IGJ0cmZzX3NldHhhdHRyKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgY29uc3QgY2hhciAqbmFtZSwgY29uc3Qgdm9pZCAqdmFsdWUsCisJCSAgIHNpemVfdCBzaXplLCBpbnQgZmxhZ3MpCit7CisJLyoKKwkgKiBJZiB0aGlzIGlzIGEgcmVxdWVzdCBmb3IgYSBzeW50aGV0aWMgYXR0cmlidXRlIGluIHRoZSBzeXN0ZW0uKgorCSAqIG5hbWVzcGFjZSB1c2UgdGhlIGdlbmVyaWMgaW5mcmFzdHJ1Y3R1cmUgdG8gcmVzb2x2ZSBhIGhhbmRsZXIKKwkgKiBmb3IgaXQgdmlhIHNiLT5zX3hhdHRyLgorCSAqLworCWlmICghc3RybmNtcChuYW1lLCBYQVRUUl9TWVNURU1fUFJFRklYLCBYQVRUUl9TWVNURU1fUFJFRklYX0xFTikpCisJCXJldHVybiBnZW5lcmljX3NldHhhdHRyKGRlbnRyeSwgbmFtZSwgdmFsdWUsIHNpemUsIGZsYWdzKTsKKworCWlmICghYnRyZnNfaXNfdmFsaWRfeGF0dHIobmFtZSkpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCWlmIChzaXplID09IDApCisJCXZhbHVlID0gIiI7ICAvKiBlbXB0eSBFQSwgZG8gbm90IHJlbW92ZSAqLworCXJldHVybiBfX2J0cmZzX3NldHhhdHRyKGRlbnRyeS0+ZF9pbm9kZSwgbmFtZSwgdmFsdWUsIHNpemUsIGZsYWdzKTsKK30KKworaW50IGJ0cmZzX3JlbW92ZXhhdHRyKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgY29uc3QgY2hhciAqbmFtZSkKK3sKKwkvKgorCSAqIElmIHRoaXMgaXMgYSByZXF1ZXN0IGZvciBhIHN5bnRoZXRpYyBhdHRyaWJ1dGUgaW4gdGhlIHN5c3RlbS4qCisJICogbmFtZXNwYWNlIHVzZSB0aGUgZ2VuZXJpYyBpbmZyYXN0cnVjdHVyZSB0byByZXNvbHZlIGEgaGFuZGxlcgorCSAqIGZvciBpdCB2aWEgc2ItPnNfeGF0dHIuCisJICovCisJaWYgKCFzdHJuY21wKG5hbWUsIFhBVFRSX1NZU1RFTV9QUkVGSVgsIFhBVFRSX1NZU1RFTV9QUkVGSVhfTEVOKSkKKwkJcmV0dXJuIGdlbmVyaWNfcmVtb3ZleGF0dHIoZGVudHJ5LCBuYW1lKTsKKworCWlmICghYnRyZnNfaXNfdmFsaWRfeGF0dHIobmFtZSkpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwlyZXR1cm4gX19idHJmc19zZXR4YXR0cihkZW50cnktPmRfaW5vZGUsIG5hbWUsIE5VTEwsIDAsIFhBVFRSX1JFUExBQ0UpOworfQpkaWZmIC0tZ2l0IGEvZnMvYnRyZnMveGF0dHIuaCBiL2ZzL2J0cmZzL3hhdHRyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWIxZDA4ZgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2J0cmZzL3hhdHRyLmgKQEAgLTAsMCArMSwzOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBSZWQgSGF0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgdjIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKKyAqIEJvc3RvbiwgTUEgMDIxMTEwLTEzMDcsIFVTQS4KKyAqLworCisjaWZuZGVmIF9fWEFUVFJfXworI2RlZmluZSBfX1hBVFRSX18KKworI2luY2x1ZGUgPGxpbnV4L3hhdHRyLmg+CisKK2V4dGVybiBzdHJ1Y3QgeGF0dHJfaGFuZGxlciBidHJmc194YXR0cl9hY2xfYWNjZXNzX2hhbmRsZXI7CitleHRlcm4gc3RydWN0IHhhdHRyX2hhbmRsZXIgYnRyZnNfeGF0dHJfYWNsX2RlZmF1bHRfaGFuZGxlcjsKK2V4dGVybiBzdHJ1Y3QgeGF0dHJfaGFuZGxlciAqYnRyZnNfeGF0dHJfaGFuZGxlcnNbXTsKKworZXh0ZXJuIHNzaXplX3QgX19idHJmc19nZXR4YXR0cihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjb25zdCBjaGFyICpuYW1lLAorCQl2b2lkICpidWZmZXIsIHNpemVfdCBzaXplKTsKK2V4dGVybiBpbnQgX19idHJmc19zZXR4YXR0cihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjb25zdCBjaGFyICpuYW1lLAorCQljb25zdCB2b2lkICp2YWx1ZSwgc2l6ZV90IHNpemUsIGludCBmbGFncyk7CisKK2V4dGVybiBzc2l6ZV90IGJ0cmZzX2dldHhhdHRyKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgY29uc3QgY2hhciAqbmFtZSwKKwkJdm9pZCAqYnVmZmVyLCBzaXplX3Qgc2l6ZSk7CitleHRlcm4gaW50IGJ0cmZzX3NldHhhdHRyKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgY29uc3QgY2hhciAqbmFtZSwKKwkJY29uc3Qgdm9pZCAqdmFsdWUsIHNpemVfdCBzaXplLCBpbnQgZmxhZ3MpOworZXh0ZXJuIGludCBidHJmc19yZW1vdmV4YXR0cihzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGNvbnN0IGNoYXIgKm5hbWUpOworCisjZW5kaWYgLyogX19YQVRUUl9fICovCmRpZmYgLS1naXQgYS9mcy9idHJmcy96bGliLmMgYi9mcy9idHJmcy96bGliLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWNmYmNlOAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2J0cmZzL3psaWIuYwpAQCAtMCwwICsxLDYzMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBPcmFjbGUuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSB2MiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorICogQm9zdG9uLCBNQSAwMjExMTAtMTMwNywgVVNBLgorICoKKyAqIEJhc2VkIG9uIGpmZnMyIHpsaWIgY29kZToKKyAqIENvcHlyaWdodCDCqSAyMDAxLTIwMDcgUmVkIEhhdCwgSW5jLgorICogQ3JlYXRlZCBieSBEYXZpZCBXb29kaG91c2UgPGR3bXcyQGluZnJhZGVhZC5vcmc+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC96bGliLmg+CisjaW5jbHVkZSA8bGludXgvenV0aWwuaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L2Jpby5oPgorI2luY2x1ZGUgImNvbXByZXNzaW9uLmgiCisKKy8qIFBsYW46IGNhbGwgZGVmbGF0ZSgpIHdpdGggYXZhaWxfaW4gPT0gKnNvdXJjZWxlbiwKKwlhdmFpbF9vdXQgPSAqZHN0bGVuIC0gMTIgYW5kIGZsdXNoID09IFpfRklOSVNILgorCUlmIGl0IGRvZXNuJ3QgbWFuYWdlIHRvIGZpbmlzaCwJY2FsbCBpdCBhZ2FpbiB3aXRoCisJYXZhaWxfaW4gPT0gMCBhbmQgYXZhaWxfb3V0IHNldCB0byB0aGUgcmVtYWluaW5nIDEyCisJYnl0ZXMgZm9yIGl0IHRvIGNsZWFuIHVwLgorICAgUTogSXMgMTIgYnl0ZXMgc3VmZmljaWVudD8KKyovCisjZGVmaW5lIFNUUkVBTV9FTkRfU1BBQ0UgMTIKKworc3RydWN0IHdvcmtzcGFjZSB7CisJel9zdHJlYW0gaW5mX3N0cm07CisJel9zdHJlYW0gZGVmX3N0cm07CisJY2hhciAqYnVmOworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKK307CisKK3N0YXRpYyBMSVNUX0hFQUQoaWRsZV93b3Jrc3BhY2UpOworc3RhdGljIERFRklORV9TUElOTE9DSyh3b3Jrc3BhY2VfbG9jayk7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBudW1fd29ya3NwYWNlOworc3RhdGljIGF0b21pY190IGFsbG9jX3dvcmtzcGFjZSA9IEFUT01JQ19JTklUKDApOworc3RhdGljIERFQ0xBUkVfV0FJVF9RVUVVRV9IRUFEKHdvcmtzcGFjZV93YWl0KTsKKworLyoKKyAqIHRoaXMgZmluZHMgYW4gYXZhaWxhYmxlIHpsaWIgd29ya3NwYWNlIG9yIGFsbG9jYXRlcyBhIG5ldyBvbmUKKyAqIE5VTEwgb3IgYW4gRVJSX1BUUiBpcyByZXR1cm5lZCBpZiB0aGluZ3MgZ28gYmFkLgorICovCitzdGF0aWMgc3RydWN0IHdvcmtzcGFjZSAqZmluZF96bGliX3dvcmtzcGFjZSh2b2lkKQoreworCXN0cnVjdCB3b3Jrc3BhY2UgKndvcmtzcGFjZTsKKwlpbnQgcmV0OworCWludCBjcHVzID0gbnVtX29ubGluZV9jcHVzKCk7CisKK2FnYWluOgorCXNwaW5fbG9jaygmd29ya3NwYWNlX2xvY2spOworCWlmICghbGlzdF9lbXB0eSgmaWRsZV93b3Jrc3BhY2UpKSB7CisJCXdvcmtzcGFjZSA9IGxpc3RfZW50cnkoaWRsZV93b3Jrc3BhY2UubmV4dCwgc3RydWN0IHdvcmtzcGFjZSwKKwkJCQkgICAgICAgbGlzdCk7CisJCWxpc3RfZGVsKCZ3b3Jrc3BhY2UtPmxpc3QpOworCQludW1fd29ya3NwYWNlLS07CisJCXNwaW5fdW5sb2NrKCZ3b3Jrc3BhY2VfbG9jayk7CisJCXJldHVybiB3b3Jrc3BhY2U7CisKKwl9CisJc3Bpbl91bmxvY2soJndvcmtzcGFjZV9sb2NrKTsKKwlpZiAoYXRvbWljX3JlYWQoJmFsbG9jX3dvcmtzcGFjZSkgPiBjcHVzKSB7CisJCURFRklORV9XQUlUKHdhaXQpOworCQlwcmVwYXJlX3RvX3dhaXQoJndvcmtzcGFjZV93YWl0LCAmd2FpdCwgVEFTS19VTklOVEVSUlVQVElCTEUpOworCQlpZiAoYXRvbWljX3JlYWQoJmFsbG9jX3dvcmtzcGFjZSkgPiBjcHVzKQorCQkJc2NoZWR1bGUoKTsKKwkJZmluaXNoX3dhaXQoJndvcmtzcGFjZV93YWl0LCAmd2FpdCk7CisJCWdvdG8gYWdhaW47CisJfQorCWF0b21pY19pbmMoJmFsbG9jX3dvcmtzcGFjZSk7CisJd29ya3NwYWNlID0ga3phbGxvYyhzaXplb2YoKndvcmtzcGFjZSksIEdGUF9OT0ZTKTsKKwlpZiAoIXdvcmtzcGFjZSkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGZhaWw7CisJfQorCisJd29ya3NwYWNlLT5kZWZfc3RybS53b3Jrc3BhY2UgPSB2bWFsbG9jKHpsaWJfZGVmbGF0ZV93b3Jrc3BhY2VzaXplKCkpOworCWlmICghd29ya3NwYWNlLT5kZWZfc3RybS53b3Jrc3BhY2UpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBmYWlsOworCX0KKwl3b3Jrc3BhY2UtPmluZl9zdHJtLndvcmtzcGFjZSA9IHZtYWxsb2MoemxpYl9pbmZsYXRlX3dvcmtzcGFjZXNpemUoKSk7CisJaWYgKCF3b3Jrc3BhY2UtPmluZl9zdHJtLndvcmtzcGFjZSkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGZhaWxfaW5mbGF0ZTsKKwl9CisJd29ya3NwYWNlLT5idWYgPSBrbWFsbG9jKFBBR0VfQ0FDSEVfU0laRSwgR0ZQX05PRlMpOworCWlmICghd29ya3NwYWNlLT5idWYpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBmYWlsX2ttYWxsb2M7CisJfQorCXJldHVybiB3b3Jrc3BhY2U7CisKK2ZhaWxfa21hbGxvYzoKKwl2ZnJlZSh3b3Jrc3BhY2UtPmluZl9zdHJtLndvcmtzcGFjZSk7CitmYWlsX2luZmxhdGU6CisJdmZyZWUod29ya3NwYWNlLT5kZWZfc3RybS53b3Jrc3BhY2UpOworZmFpbDoKKwlrZnJlZSh3b3Jrc3BhY2UpOworCWF0b21pY19kZWMoJmFsbG9jX3dvcmtzcGFjZSk7CisJd2FrZV91cCgmd29ya3NwYWNlX3dhaXQpOworCXJldHVybiBFUlJfUFRSKHJldCk7Cit9CisKKy8qCisgKiBwdXQgYSB3b3Jrc3BhY2Ugc3RydWN0IGJhY2sgb24gdGhlIGxpc3Qgb3IgZnJlZSBpdCBpZiB3ZSBoYXZlIGVub3VnaAorICogaWRsZSBvbmVzIHNpdHRpbmcgYXJvdW5kCisgKi8KK3N0YXRpYyBpbnQgZnJlZV93b3Jrc3BhY2Uoc3RydWN0IHdvcmtzcGFjZSAqd29ya3NwYWNlKQoreworCXNwaW5fbG9jaygmd29ya3NwYWNlX2xvY2spOworCWlmIChudW1fd29ya3NwYWNlIDwgbnVtX29ubGluZV9jcHVzKCkpIHsKKwkJbGlzdF9hZGRfdGFpbCgmd29ya3NwYWNlLT5saXN0LCAmaWRsZV93b3Jrc3BhY2UpOworCQludW1fd29ya3NwYWNlKys7CisJCXNwaW5fdW5sb2NrKCZ3b3Jrc3BhY2VfbG9jayk7CisJCWlmICh3YWl0cXVldWVfYWN0aXZlKCZ3b3Jrc3BhY2Vfd2FpdCkpCisJCQl3YWtlX3VwKCZ3b3Jrc3BhY2Vfd2FpdCk7CisJCXJldHVybiAwOworCX0KKwlzcGluX3VubG9jaygmd29ya3NwYWNlX2xvY2spOworCXZmcmVlKHdvcmtzcGFjZS0+ZGVmX3N0cm0ud29ya3NwYWNlKTsKKwl2ZnJlZSh3b3Jrc3BhY2UtPmluZl9zdHJtLndvcmtzcGFjZSk7CisJa2ZyZWUod29ya3NwYWNlLT5idWYpOworCWtmcmVlKHdvcmtzcGFjZSk7CisKKwlhdG9taWNfZGVjKCZhbGxvY193b3Jrc3BhY2UpOworCWlmICh3YWl0cXVldWVfYWN0aXZlKCZ3b3Jrc3BhY2Vfd2FpdCkpCisJCXdha2VfdXAoJndvcmtzcGFjZV93YWl0KTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGNsZWFudXAgZnVuY3Rpb24gZm9yIG1vZHVsZSBleGl0CisgKi8KK3N0YXRpYyB2b2lkIGZyZWVfd29ya3NwYWNlcyh2b2lkKQoreworCXN0cnVjdCB3b3Jrc3BhY2UgKndvcmtzcGFjZTsKKwl3aGlsZSAoIWxpc3RfZW1wdHkoJmlkbGVfd29ya3NwYWNlKSkgeworCQl3b3Jrc3BhY2UgPSBsaXN0X2VudHJ5KGlkbGVfd29ya3NwYWNlLm5leHQsIHN0cnVjdCB3b3Jrc3BhY2UsCisJCQkJICAgICAgIGxpc3QpOworCQlsaXN0X2RlbCgmd29ya3NwYWNlLT5saXN0KTsKKwkJdmZyZWUod29ya3NwYWNlLT5kZWZfc3RybS53b3Jrc3BhY2UpOworCQl2ZnJlZSh3b3Jrc3BhY2UtPmluZl9zdHJtLndvcmtzcGFjZSk7CisJCWtmcmVlKHdvcmtzcGFjZS0+YnVmKTsKKwkJa2ZyZWUod29ya3NwYWNlKTsKKwkJYXRvbWljX2RlYygmYWxsb2Nfd29ya3NwYWNlKTsKKwl9Cit9CisKKy8qCisgKiBnaXZlbiBhbiBhZGRyZXNzIHNwYWNlIGFuZCBzdGFydC9sZW4sIGNvbXByZXNzIHRoZSBieXRlcy4KKyAqCisgKiBwYWdlcyBhcmUgYWxsb2NhdGVkIHRvIGhvbGQgdGhlIGNvbXByZXNzZWQgcmVzdWx0IGFuZCBzdG9yZWQKKyAqIGluICdwYWdlcycKKyAqCisgKiBvdXRfcGFnZXMgaXMgdXNlZCB0byByZXR1cm4gdGhlIG51bWJlciBvZiBwYWdlcyBhbGxvY2F0ZWQuICBUaGVyZQorICogbWF5IGJlIHBhZ2VzIGFsbG9jYXRlZCBldmVuIGlmIHdlIHJldHVybiBhbiBlcnJvcgorICoKKyAqIHRvdGFsX2luIGlzIHVzZWQgdG8gcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgYWN0dWFsbHkgcmVhZC4gIEl0CisgKiBtYXkgYmUgc21hbGxlciB0aGVuIGxlbiBpZiB3ZSBoYWQgdG8gZXhpdCBlYXJseSBiZWNhdXNlIHdlCisgKiByYW4gb3V0IG9mIHJvb20gaW4gdGhlIHBhZ2VzIGFycmF5IG9yIGJlY2F1c2Ugd2UgY3Jvc3MgdGhlCisgKiBtYXhfb3V0IHRocmVzaG9sZC4KKyAqCisgKiB0b3RhbF9vdXQgaXMgdXNlZCB0byByZXR1cm4gdGhlIHRvdGFsIG51bWJlciBvZiBjb21wcmVzc2VkIGJ5dGVzCisgKgorICogbWF4X291dCB0ZWxscyB1cyB0aGUgbWF4IG51bWJlciBvZiBieXRlcyB0aGF0IHdlJ3JlIGFsbG93ZWQgdG8KKyAqIHN0dWZmIGludG8gcGFnZXMKKyAqLworaW50IGJ0cmZzX3psaWJfY29tcHJlc3NfcGFnZXMoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsCisJCQkgICAgICB1NjQgc3RhcnQsIHVuc2lnbmVkIGxvbmcgbGVuLAorCQkJICAgICAgc3RydWN0IHBhZ2UgKipwYWdlcywKKwkJCSAgICAgIHVuc2lnbmVkIGxvbmcgbnJfZGVzdF9wYWdlcywKKwkJCSAgICAgIHVuc2lnbmVkIGxvbmcgKm91dF9wYWdlcywKKwkJCSAgICAgIHVuc2lnbmVkIGxvbmcgKnRvdGFsX2luLAorCQkJICAgICAgdW5zaWduZWQgbG9uZyAqdG90YWxfb3V0LAorCQkJICAgICAgdW5zaWduZWQgbG9uZyBtYXhfb3V0KQoreworCWludCByZXQ7CisJc3RydWN0IHdvcmtzcGFjZSAqd29ya3NwYWNlOworCWNoYXIgKmRhdGFfaW47CisJY2hhciAqY3BhZ2Vfb3V0OworCWludCBucl9wYWdlcyA9IDA7CisJc3RydWN0IHBhZ2UgKmluX3BhZ2UgPSBOVUxMOworCXN0cnVjdCBwYWdlICpvdXRfcGFnZSA9IE5VTEw7CisJaW50IG91dF93cml0dGVuID0gMDsKKwlpbnQgaW5fcmVhZCA9IDA7CisJdW5zaWduZWQgbG9uZyBieXRlc19sZWZ0OworCisJKm91dF9wYWdlcyA9IDA7CisJKnRvdGFsX291dCA9IDA7CisJKnRvdGFsX2luID0gMDsKKworCXdvcmtzcGFjZSA9IGZpbmRfemxpYl93b3Jrc3BhY2UoKTsKKwlpZiAoIXdvcmtzcGFjZSkKKwkJcmV0dXJuIC0xOworCisJaWYgKFpfT0sgIT0gemxpYl9kZWZsYXRlSW5pdCgmd29ya3NwYWNlLT5kZWZfc3RybSwgMykpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiZGVmbGF0ZUluaXQgZmFpbGVkXG4iKTsKKwkJcmV0ID0gLTE7CisJCWdvdG8gb3V0OworCX0KKworCXdvcmtzcGFjZS0+ZGVmX3N0cm0udG90YWxfaW4gPSAwOworCXdvcmtzcGFjZS0+ZGVmX3N0cm0udG90YWxfb3V0ID0gMDsKKworCWluX3BhZ2UgPSBmaW5kX2dldF9wYWdlKG1hcHBpbmcsIHN0YXJ0ID4+IFBBR0VfQ0FDSEVfU0hJRlQpOworCWRhdGFfaW4gPSBrbWFwKGluX3BhZ2UpOworCisJb3V0X3BhZ2UgPSBhbGxvY19wYWdlKEdGUF9OT0ZTIHwgX19HRlBfSElHSE1FTSk7CisJY3BhZ2Vfb3V0ID0ga21hcChvdXRfcGFnZSk7CisJcGFnZXNbMF0gPSBvdXRfcGFnZTsKKwlucl9wYWdlcyA9IDE7CisKKwl3b3Jrc3BhY2UtPmRlZl9zdHJtLm5leHRfaW4gPSBkYXRhX2luOworCXdvcmtzcGFjZS0+ZGVmX3N0cm0ubmV4dF9vdXQgPSBjcGFnZV9vdXQ7CisJd29ya3NwYWNlLT5kZWZfc3RybS5hdmFpbF9vdXQgPSBQQUdFX0NBQ0hFX1NJWkU7CisJd29ya3NwYWNlLT5kZWZfc3RybS5hdmFpbF9pbiA9IG1pbihsZW4sIFBBR0VfQ0FDSEVfU0laRSk7CisKKwlvdXRfd3JpdHRlbiA9IDA7CisJaW5fcmVhZCA9IDA7CisKKwl3aGlsZSAod29ya3NwYWNlLT5kZWZfc3RybS50b3RhbF9pbiA8IGxlbikgeworCQlyZXQgPSB6bGliX2RlZmxhdGUoJndvcmtzcGFjZS0+ZGVmX3N0cm0sIFpfU1lOQ19GTFVTSCk7CisJCWlmIChyZXQgIT0gWl9PSykgeworCQkJcHJpbnRrKEtFUk5fREVCVUcgImJ0cmZzIGRlZmxhdGUgaW4gbG9vcCByZXR1cm5lZCAlZFxuIiwKKwkJCSAgICAgICByZXQpOworCQkJemxpYl9kZWZsYXRlRW5kKCZ3b3Jrc3BhY2UtPmRlZl9zdHJtKTsKKwkJCXJldCA9IC0xOworCQkJZ290byBvdXQ7CisJCX0KKworCQkvKiB3ZSdyZSBtYWtpbmcgaXQgYmlnZ2VyLCBnaXZlIHVwICovCisJCWlmICh3b3Jrc3BhY2UtPmRlZl9zdHJtLnRvdGFsX2luID4gODE5MiAmJgorCQkgICAgd29ya3NwYWNlLT5kZWZfc3RybS50b3RhbF9pbiA8CisJCSAgICB3b3Jrc3BhY2UtPmRlZl9zdHJtLnRvdGFsX291dCkgeworCQkJcmV0ID0gLTE7CisJCQlnb3RvIG91dDsKKwkJfQorCQkvKiB3ZSBuZWVkIGFub3RoZXIgcGFnZSBmb3Igd3JpdGluZyBvdXQuICBUZXN0IHRoaXMKKwkJICogYmVmb3JlIHRoZSB0b3RhbF9pbiBzbyB3ZSB3aWxsIHB1bGwgaW4gYSBuZXcgcGFnZSBmb3IKKwkJICogdGhlIHN0cmVhbSBlbmQgaWYgcmVxdWlyZWQKKwkJICovCisJCWlmICh3b3Jrc3BhY2UtPmRlZl9zdHJtLmF2YWlsX291dCA9PSAwKSB7CisJCQlrdW5tYXAob3V0X3BhZ2UpOworCQkJaWYgKG5yX3BhZ2VzID09IG5yX2Rlc3RfcGFnZXMpIHsKKwkJCQlvdXRfcGFnZSA9IE5VTEw7CisJCQkJcmV0ID0gLTE7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCQlvdXRfcGFnZSA9IGFsbG9jX3BhZ2UoR0ZQX05PRlMgfCBfX0dGUF9ISUdITUVNKTsKKwkJCWNwYWdlX291dCA9IGttYXAob3V0X3BhZ2UpOworCQkJcGFnZXNbbnJfcGFnZXNdID0gb3V0X3BhZ2U7CisJCQlucl9wYWdlcysrOworCQkJd29ya3NwYWNlLT5kZWZfc3RybS5hdmFpbF9vdXQgPSBQQUdFX0NBQ0hFX1NJWkU7CisJCQl3b3Jrc3BhY2UtPmRlZl9zdHJtLm5leHRfb3V0ID0gY3BhZ2Vfb3V0OworCQl9CisJCS8qIHdlJ3JlIGFsbCBkb25lICovCisJCWlmICh3b3Jrc3BhY2UtPmRlZl9zdHJtLnRvdGFsX2luID49IGxlbikKKwkJCWJyZWFrOworCisJCS8qIHdlJ3ZlIHJlYWQgaW4gYSBmdWxsIHBhZ2UsIGdldCBhIG5ldyBvbmUgKi8KKwkJaWYgKHdvcmtzcGFjZS0+ZGVmX3N0cm0uYXZhaWxfaW4gPT0gMCkgeworCQkJaWYgKHdvcmtzcGFjZS0+ZGVmX3N0cm0udG90YWxfb3V0ID4gbWF4X291dCkKKwkJCQlicmVhazsKKworCQkJYnl0ZXNfbGVmdCA9IGxlbiAtIHdvcmtzcGFjZS0+ZGVmX3N0cm0udG90YWxfaW47CisJCQlrdW5tYXAoaW5fcGFnZSk7CisJCQlwYWdlX2NhY2hlX3JlbGVhc2UoaW5fcGFnZSk7CisKKwkJCXN0YXJ0ICs9IFBBR0VfQ0FDSEVfU0laRTsKKwkJCWluX3BhZ2UgPSBmaW5kX2dldF9wYWdlKG1hcHBpbmcsCisJCQkJCQlzdGFydCA+PiBQQUdFX0NBQ0hFX1NISUZUKTsKKwkJCWRhdGFfaW4gPSBrbWFwKGluX3BhZ2UpOworCQkJd29ya3NwYWNlLT5kZWZfc3RybS5hdmFpbF9pbiA9IG1pbihieXRlc19sZWZ0LAorCQkJCQkJCSAgIFBBR0VfQ0FDSEVfU0laRSk7CisJCQl3b3Jrc3BhY2UtPmRlZl9zdHJtLm5leHRfaW4gPSBkYXRhX2luOworCQl9CisJfQorCXdvcmtzcGFjZS0+ZGVmX3N0cm0uYXZhaWxfaW4gPSAwOworCXJldCA9IHpsaWJfZGVmbGF0ZSgmd29ya3NwYWNlLT5kZWZfc3RybSwgWl9GSU5JU0gpOworCXpsaWJfZGVmbGF0ZUVuZCgmd29ya3NwYWNlLT5kZWZfc3RybSk7CisKKwlpZiAocmV0ICE9IFpfU1RSRUFNX0VORCkgeworCQlyZXQgPSAtMTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKHdvcmtzcGFjZS0+ZGVmX3N0cm0udG90YWxfb3V0ID49IHdvcmtzcGFjZS0+ZGVmX3N0cm0udG90YWxfaW4pIHsKKwkJcmV0ID0gLTE7CisJCWdvdG8gb3V0OworCX0KKworCXJldCA9IDA7CisJKnRvdGFsX291dCA9IHdvcmtzcGFjZS0+ZGVmX3N0cm0udG90YWxfb3V0OworCSp0b3RhbF9pbiA9IHdvcmtzcGFjZS0+ZGVmX3N0cm0udG90YWxfaW47CitvdXQ6CisJKm91dF9wYWdlcyA9IG5yX3BhZ2VzOworCWlmIChvdXRfcGFnZSkKKwkJa3VubWFwKG91dF9wYWdlKTsKKworCWlmIChpbl9wYWdlKSB7CisJCWt1bm1hcChpbl9wYWdlKTsKKwkJcGFnZV9jYWNoZV9yZWxlYXNlKGluX3BhZ2UpOworCX0KKwlmcmVlX3dvcmtzcGFjZSh3b3Jrc3BhY2UpOworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBwYWdlc19pbiBpcyBhbiBhcnJheSBvZiBwYWdlcyB3aXRoIGNvbXByZXNzZWQgZGF0YS4KKyAqCisgKiBkaXNrX3N0YXJ0IGlzIHRoZSBzdGFydGluZyBsb2dpY2FsIG9mZnNldCBvZiB0aGlzIGFycmF5IGluIHRoZSBmaWxlCisgKgorICogYnZlYyBpcyBhIGJpb192ZWMgb2YgcGFnZXMgZnJvbSB0aGUgZmlsZSB0aGF0IHdlIHdhbnQgdG8gZGVjb21wcmVzcyBpbnRvCisgKgorICogdmNudCBpcyB0aGUgY291bnQgb2YgcGFnZXMgaW4gdGhlIGJpb3ZlYworICoKKyAqIHNyY2xlbiBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluIHBhZ2VzX2luCisgKgorICogVGhlIGJhc2ljIGlkZWEgaXMgdGhhdCB3ZSBoYXZlIGEgYmlvIHRoYXQgd2FzIGNyZWF0ZWQgYnkgcmVhZHBhZ2VzLgorICogVGhlIHBhZ2VzIGluIHRoZSBiaW8gYXJlIGZvciB0aGUgdW5jb21wcmVzc2VkIGRhdGEsIGFuZCB0aGV5IG1heSBub3QKKyAqIGJlIGNvbnRpZ3VvdXMuICBUaGV5IGFsbCBjb3JyZXNwb25kIHRvIHRoZSByYW5nZSBvZiBieXRlcyBjb3ZlcmVkIGJ5CisgKiB0aGUgY29tcHJlc3NlZCBleHRlbnQuCisgKi8KK2ludCBidHJmc196bGliX2RlY29tcHJlc3NfYmlvdmVjKHN0cnVjdCBwYWdlICoqcGFnZXNfaW4sCisJCQkgICAgICB1NjQgZGlza19zdGFydCwKKwkJCSAgICAgIHN0cnVjdCBiaW9fdmVjICpidmVjLAorCQkJICAgICAgaW50IHZjbnQsCisJCQkgICAgICBzaXplX3Qgc3JjbGVuKQoreworCWludCByZXQgPSAwOworCWludCB3Yml0cyA9IE1BWF9XQklUUzsKKwlzdHJ1Y3Qgd29ya3NwYWNlICp3b3Jrc3BhY2U7CisJY2hhciAqZGF0YV9pbjsKKwlzaXplX3QgdG90YWxfb3V0ID0gMDsKKwl1bnNpZ25lZCBsb25nIHBhZ2VfYnl0ZXNfbGVmdDsKKwl1bnNpZ25lZCBsb25nIHBhZ2VfaW5faW5kZXggPSAwOworCXVuc2lnbmVkIGxvbmcgcGFnZV9vdXRfaW5kZXggPSAwOworCXN0cnVjdCBwYWdlICpwYWdlX291dDsKKwl1bnNpZ25lZCBsb25nIHRvdGFsX3BhZ2VzX2luID0gKHNyY2xlbiArIFBBR0VfQ0FDSEVfU0laRSAtIDEpIC8KKwkJCQkJUEFHRV9DQUNIRV9TSVpFOworCXVuc2lnbmVkIGxvbmcgYnVmX3N0YXJ0OworCXVuc2lnbmVkIGxvbmcgYnVmX29mZnNldDsKKwl1bnNpZ25lZCBsb25nIGJ5dGVzOworCXVuc2lnbmVkIGxvbmcgd29ya2luZ19ieXRlczsKKwl1bnNpZ25lZCBsb25nIHBnX29mZnNldDsKKwl1bnNpZ25lZCBsb25nIHN0YXJ0X2J5dGU7CisJdW5zaWduZWQgbG9uZyBjdXJyZW50X2J1Zl9zdGFydDsKKwljaGFyICprYWRkcjsKKworCXdvcmtzcGFjZSA9IGZpbmRfemxpYl93b3Jrc3BhY2UoKTsKKwlpZiAoIXdvcmtzcGFjZSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlkYXRhX2luID0ga21hcChwYWdlc19pbltwYWdlX2luX2luZGV4XSk7CisJd29ya3NwYWNlLT5pbmZfc3RybS5uZXh0X2luID0gZGF0YV9pbjsKKwl3b3Jrc3BhY2UtPmluZl9zdHJtLmF2YWlsX2luID0gbWluX3Qoc2l6ZV90LCBzcmNsZW4sIFBBR0VfQ0FDSEVfU0laRSk7CisJd29ya3NwYWNlLT5pbmZfc3RybS50b3RhbF9pbiA9IDA7CisKKwl3b3Jrc3BhY2UtPmluZl9zdHJtLnRvdGFsX291dCA9IDA7CisJd29ya3NwYWNlLT5pbmZfc3RybS5uZXh0X291dCA9IHdvcmtzcGFjZS0+YnVmOworCXdvcmtzcGFjZS0+aW5mX3N0cm0uYXZhaWxfb3V0ID0gUEFHRV9DQUNIRV9TSVpFOworCXBhZ2Vfb3V0ID0gYnZlY1twYWdlX291dF9pbmRleF0uYnZfcGFnZTsKKwlwYWdlX2J5dGVzX2xlZnQgPSBQQUdFX0NBQ0hFX1NJWkU7CisJcGdfb2Zmc2V0ID0gMDsKKworCS8qIElmIGl0J3MgZGVmbGF0ZSwgYW5kIGl0J3MgZ290IG5vIHByZXNldCBkaWN0aW9uYXJ5LCB0aGVuCisJICAgd2UgY2FuIHRlbGwgemxpYiB0byBza2lwIHRoZSBhZGxlcjMyIGNoZWNrLiAqLworCWlmIChzcmNsZW4gPiAyICYmICEoZGF0YV9pblsxXSAmIFBSRVNFVF9ESUNUKSAmJgorCSAgICAoKGRhdGFfaW5bMF0gJiAweDBmKSA9PSBaX0RFRkxBVEVEKSAmJgorCSAgICAhKCgoZGF0YV9pblswXTw8OCkgKyBkYXRhX2luWzFdKSAlIDMxKSkgeworCisJCXdiaXRzID0gLSgoZGF0YV9pblswXSA+PiA0KSArIDgpOworCQl3b3Jrc3BhY2UtPmluZl9zdHJtLm5leHRfaW4gKz0gMjsKKwkJd29ya3NwYWNlLT5pbmZfc3RybS5hdmFpbF9pbiAtPSAyOworCX0KKworCWlmIChaX09LICE9IHpsaWJfaW5mbGF0ZUluaXQyKCZ3b3Jrc3BhY2UtPmluZl9zdHJtLCB3Yml0cykpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiaW5mbGF0ZUluaXQgZmFpbGVkXG4iKTsKKwkJcmV0ID0gLTE7CisJCWdvdG8gb3V0OworCX0KKwl3aGlsZSAod29ya3NwYWNlLT5pbmZfc3RybS50b3RhbF9pbiA8IHNyY2xlbikgeworCQlyZXQgPSB6bGliX2luZmxhdGUoJndvcmtzcGFjZS0+aW5mX3N0cm0sIFpfTk9fRkxVU0gpOworCQlpZiAocmV0ICE9IFpfT0sgJiYgcmV0ICE9IFpfU1RSRUFNX0VORCkKKwkJCWJyZWFrOworCQkvKgorCQkgKiBidWYgc3RhcnQgaXMgdGhlIGJ5dGUgb2Zmc2V0IHdlJ3JlIG9mIHRoZSBzdGFydCBvZgorCQkgKiBvdXIgd29ya3NwYWNlIGJ1ZmZlcgorCQkgKi8KKwkJYnVmX3N0YXJ0ID0gdG90YWxfb3V0OworCisJCS8qIHRvdGFsX291dCBpcyB0aGUgbGFzdCBieXRlIG9mIHRoZSB3b3Jrc3BhY2UgYnVmZmVyICovCisJCXRvdGFsX291dCA9IHdvcmtzcGFjZS0+aW5mX3N0cm0udG90YWxfb3V0OworCisJCXdvcmtpbmdfYnl0ZXMgPSB0b3RhbF9vdXQgLSBidWZfc3RhcnQ7CisKKwkJLyoKKwkJICogc3RhcnQgYnl0ZSBpcyB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUgcGFnZSB3ZSdyZSBjdXJyZW50bHkKKwkJICogY29weWluZyBpbnRvIHJlbGF0aXZlIHRvIHRoZSBzdGFydCBvZiB0aGUgY29tcHJlc3NlZCBkYXRhLgorCQkgKi8KKwkJc3RhcnRfYnl0ZSA9IHBhZ2Vfb2Zmc2V0KHBhZ2Vfb3V0KSAtIGRpc2tfc3RhcnQ7CisKKwkJaWYgKHdvcmtpbmdfYnl0ZXMgPT0gMCkgeworCQkJLyogd2UgZGlkbid0IG1ha2UgcHJvZ3Jlc3MgaW4gdGhpcyBpbmZsYXRlCisJCQkgKiBjYWxsLCB3ZSdyZSBkb25lCisJCQkgKi8KKwkJCWlmIChyZXQgIT0gWl9TVFJFQU1fRU5EKQorCQkJCXJldCA9IC0xOworCQkJYnJlYWs7CisJCX0KKworCQkvKiB3ZSBoYXZlbid0IHlldCBoaXQgZGF0YSBjb3JyZXNwb25kaW5nIHRvIHRoaXMgcGFnZSAqLworCQlpZiAodG90YWxfb3V0IDw9IHN0YXJ0X2J5dGUpCisJCQlnb3RvIG5leHQ7CisKKwkJLyoKKwkJICogdGhlIHN0YXJ0IG9mIHRoZSBkYXRhIHdlIGNhcmUgYWJvdXQgaXMgb2Zmc2V0IGludG8KKwkJICogdGhlIG1pZGRsZSBvZiBvdXIgd29ya2luZyBidWZmZXIKKwkJICovCisJCWlmICh0b3RhbF9vdXQgPiBzdGFydF9ieXRlICYmIGJ1Zl9zdGFydCA8IHN0YXJ0X2J5dGUpIHsKKwkJCWJ1Zl9vZmZzZXQgPSBzdGFydF9ieXRlIC0gYnVmX3N0YXJ0OworCQkJd29ya2luZ19ieXRlcyAtPSBidWZfb2Zmc2V0OworCQl9IGVsc2UgeworCQkJYnVmX29mZnNldCA9IDA7CisJCX0KKwkJY3VycmVudF9idWZfc3RhcnQgPSBidWZfc3RhcnQ7CisKKwkJLyogY29weSBieXRlcyBmcm9tIHRoZSB3b3JraW5nIGJ1ZmZlciBpbnRvIHRoZSBwYWdlcyAqLworCQl3aGlsZSAod29ya2luZ19ieXRlcyA+IDApIHsKKwkJCWJ5dGVzID0gbWluKFBBR0VfQ0FDSEVfU0laRSAtIHBnX29mZnNldCwKKwkJCQkgICAgUEFHRV9DQUNIRV9TSVpFIC0gYnVmX29mZnNldCk7CisJCQlieXRlcyA9IG1pbihieXRlcywgd29ya2luZ19ieXRlcyk7CisJCQlrYWRkciA9IGttYXBfYXRvbWljKHBhZ2Vfb3V0LCBLTV9VU0VSMCk7CisJCQltZW1jcHkoa2FkZHIgKyBwZ19vZmZzZXQsIHdvcmtzcGFjZS0+YnVmICsgYnVmX29mZnNldCwKKwkJCSAgICAgICBieXRlcyk7CisJCQlrdW5tYXBfYXRvbWljKGthZGRyLCBLTV9VU0VSMCk7CisJCQlmbHVzaF9kY2FjaGVfcGFnZShwYWdlX291dCk7CisKKwkJCXBnX29mZnNldCArPSBieXRlczsKKwkJCXBhZ2VfYnl0ZXNfbGVmdCAtPSBieXRlczsKKwkJCWJ1Zl9vZmZzZXQgKz0gYnl0ZXM7CisJCQl3b3JraW5nX2J5dGVzIC09IGJ5dGVzOworCQkJY3VycmVudF9idWZfc3RhcnQgKz0gYnl0ZXM7CisKKwkJCS8qIGNoZWNrIGlmIHdlIG5lZWQgdG8gcGljayBhbm90aGVyIHBhZ2UgKi8KKwkJCWlmIChwYWdlX2J5dGVzX2xlZnQgPT0gMCkgeworCQkJCXBhZ2Vfb3V0X2luZGV4Kys7CisJCQkJaWYgKHBhZ2Vfb3V0X2luZGV4ID49IHZjbnQpIHsKKwkJCQkJcmV0ID0gMDsKKwkJCQkJZ290byBkb25lOworCQkJCX0KKworCQkJCXBhZ2Vfb3V0ID0gYnZlY1twYWdlX291dF9pbmRleF0uYnZfcGFnZTsKKwkJCQlwZ19vZmZzZXQgPSAwOworCQkJCXBhZ2VfYnl0ZXNfbGVmdCA9IFBBR0VfQ0FDSEVfU0laRTsKKwkJCQlzdGFydF9ieXRlID0gcGFnZV9vZmZzZXQocGFnZV9vdXQpIC0gZGlza19zdGFydDsKKworCQkJCS8qCisJCQkJICogbWFrZSBzdXJlIG91ciBuZXcgcGFnZSBpcyBjb3ZlcmVkIGJ5IHRoaXMKKwkJCQkgKiB3b3JraW5nIGJ1ZmZlcgorCQkJCSAqLworCQkJCWlmICh0b3RhbF9vdXQgPD0gc3RhcnRfYnl0ZSkKKwkJCQkJZ290byBuZXh0OworCisJCQkJLyogdGhlIG5leHQgcGFnZSBpbiB0aGUgYmlvdmVjIG1pZ2h0IG5vdAorCQkJCSAqIGJlIGFkamFjZW50IHRvIHRoZSBsYXN0IHBhZ2UsIGJ1dCBpdAorCQkJCSAqIG1pZ2h0IHN0aWxsIGJlIGZvdW5kIGluc2lkZSB0aGlzIHdvcmtpbmcKKwkJCQkgKiBidWZmZXIuICBidW1wIG91ciBvZmZzZXQgcG9pbnRlcgorCQkJCSAqLworCQkJCWlmICh0b3RhbF9vdXQgPiBzdGFydF9ieXRlICYmCisJCQkJICAgIGN1cnJlbnRfYnVmX3N0YXJ0IDwgc3RhcnRfYnl0ZSkgeworCQkJCQlidWZfb2Zmc2V0ID0gc3RhcnRfYnl0ZSAtIGJ1Zl9zdGFydDsKKwkJCQkJd29ya2luZ19ieXRlcyA9IHRvdGFsX291dCAtIHN0YXJ0X2J5dGU7CisJCQkJCWN1cnJlbnRfYnVmX3N0YXJ0ID0gYnVmX3N0YXJ0ICsKKwkJCQkJCWJ1Zl9vZmZzZXQ7CisJCQkJfQorCQkJfQorCQl9CituZXh0OgorCQl3b3Jrc3BhY2UtPmluZl9zdHJtLm5leHRfb3V0ID0gd29ya3NwYWNlLT5idWY7CisJCXdvcmtzcGFjZS0+aW5mX3N0cm0uYXZhaWxfb3V0ID0gUEFHRV9DQUNIRV9TSVpFOworCisJCWlmICh3b3Jrc3BhY2UtPmluZl9zdHJtLmF2YWlsX2luID09IDApIHsKKwkJCXVuc2lnbmVkIGxvbmcgdG1wOworCQkJa3VubWFwKHBhZ2VzX2luW3BhZ2VfaW5faW5kZXhdKTsKKwkJCXBhZ2VfaW5faW5kZXgrKzsKKwkJCWlmIChwYWdlX2luX2luZGV4ID49IHRvdGFsX3BhZ2VzX2luKSB7CisJCQkJZGF0YV9pbiA9IE5VTEw7CisJCQkJYnJlYWs7CisJCQl9CisJCQlkYXRhX2luID0ga21hcChwYWdlc19pbltwYWdlX2luX2luZGV4XSk7CisJCQl3b3Jrc3BhY2UtPmluZl9zdHJtLm5leHRfaW4gPSBkYXRhX2luOworCQkJdG1wID0gc3JjbGVuIC0gd29ya3NwYWNlLT5pbmZfc3RybS50b3RhbF9pbjsKKwkJCXdvcmtzcGFjZS0+aW5mX3N0cm0uYXZhaWxfaW4gPSBtaW4odG1wLAorCQkJCQkJCSAgIFBBR0VfQ0FDSEVfU0laRSk7CisJCX0KKwl9CisJaWYgKHJldCAhPSBaX1NUUkVBTV9FTkQpCisJCXJldCA9IC0xOworCWVsc2UKKwkJcmV0ID0gMDsKK2RvbmU6CisJemxpYl9pbmZsYXRlRW5kKCZ3b3Jrc3BhY2UtPmluZl9zdHJtKTsKKwlpZiAoZGF0YV9pbikKKwkJa3VubWFwKHBhZ2VzX2luW3BhZ2VfaW5faW5kZXhdKTsKK291dDoKKwlmcmVlX3dvcmtzcGFjZSh3b3Jrc3BhY2UpOworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBhIGxlc3MgY29tcGxleCBkZWNvbXByZXNzaW9uIHJvdXRpbmUuICBPdXIgY29tcHJlc3NlZCBkYXRhIGZpdHMgaW4gYQorICogc2luZ2xlIHBhZ2UsIGFuZCB3ZSB3YW50IHRvIHJlYWQgYSBzaW5nbGUgcGFnZSBvdXQgb2YgaXQuCisgKiBzdGFydF9ieXRlIHRlbGxzIHVzIHRoZSBvZmZzZXQgaW50byB0aGUgY29tcHJlc3NlZCBkYXRhIHdlJ3JlIGludGVyZXN0ZWQgaW4KKyAqLworaW50IGJ0cmZzX3psaWJfZGVjb21wcmVzcyh1bnNpZ25lZCBjaGFyICpkYXRhX2luLAorCQkJICBzdHJ1Y3QgcGFnZSAqZGVzdF9wYWdlLAorCQkJICB1bnNpZ25lZCBsb25nIHN0YXJ0X2J5dGUsCisJCQkgIHNpemVfdCBzcmNsZW4sIHNpemVfdCBkZXN0bGVuKQoreworCWludCByZXQgPSAwOworCWludCB3Yml0cyA9IE1BWF9XQklUUzsKKwlzdHJ1Y3Qgd29ya3NwYWNlICp3b3Jrc3BhY2U7CisJdW5zaWduZWQgbG9uZyBieXRlc19sZWZ0ID0gZGVzdGxlbjsKKwl1bnNpZ25lZCBsb25nIHRvdGFsX291dCA9IDA7CisJY2hhciAqa2FkZHI7CisKKwlpZiAoZGVzdGxlbiA+IFBBR0VfQ0FDSEVfU0laRSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwl3b3Jrc3BhY2UgPSBmaW5kX3psaWJfd29ya3NwYWNlKCk7CisJaWYgKCF3b3Jrc3BhY2UpCisJCXJldHVybiAtRU5PTUVNOworCisJd29ya3NwYWNlLT5pbmZfc3RybS5uZXh0X2luID0gZGF0YV9pbjsKKwl3b3Jrc3BhY2UtPmluZl9zdHJtLmF2YWlsX2luID0gc3JjbGVuOworCXdvcmtzcGFjZS0+aW5mX3N0cm0udG90YWxfaW4gPSAwOworCisJd29ya3NwYWNlLT5pbmZfc3RybS5uZXh0X291dCA9IHdvcmtzcGFjZS0+YnVmOworCXdvcmtzcGFjZS0+aW5mX3N0cm0uYXZhaWxfb3V0ID0gUEFHRV9DQUNIRV9TSVpFOworCXdvcmtzcGFjZS0+aW5mX3N0cm0udG90YWxfb3V0ID0gMDsKKwkvKiBJZiBpdCdzIGRlZmxhdGUsIGFuZCBpdCdzIGdvdCBubyBwcmVzZXQgZGljdGlvbmFyeSwgdGhlbgorCSAgIHdlIGNhbiB0ZWxsIHpsaWIgdG8gc2tpcCB0aGUgYWRsZXIzMiBjaGVjay4gKi8KKwlpZiAoc3JjbGVuID4gMiAmJiAhKGRhdGFfaW5bMV0gJiBQUkVTRVRfRElDVCkgJiYKKwkgICAgKChkYXRhX2luWzBdICYgMHgwZikgPT0gWl9ERUZMQVRFRCkgJiYKKwkgICAgISgoKGRhdGFfaW5bMF08PDgpICsgZGF0YV9pblsxXSkgJSAzMSkpIHsKKworCQl3Yml0cyA9IC0oKGRhdGFfaW5bMF0gPj4gNCkgKyA4KTsKKwkJd29ya3NwYWNlLT5pbmZfc3RybS5uZXh0X2luICs9IDI7CisJCXdvcmtzcGFjZS0+aW5mX3N0cm0uYXZhaWxfaW4gLT0gMjsKKwl9CisKKwlpZiAoWl9PSyAhPSB6bGliX2luZmxhdGVJbml0Migmd29ya3NwYWNlLT5pbmZfc3RybSwgd2JpdHMpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgImluZmxhdGVJbml0IGZhaWxlZFxuIik7CisJCXJldCA9IC0xOworCQlnb3RvIG91dDsKKwl9CisKKwl3aGlsZSAoYnl0ZXNfbGVmdCA+IDApIHsKKwkJdW5zaWduZWQgbG9uZyBidWZfc3RhcnQ7CisJCXVuc2lnbmVkIGxvbmcgYnVmX29mZnNldDsKKwkJdW5zaWduZWQgbG9uZyBieXRlczsKKwkJdW5zaWduZWQgbG9uZyBwZ19vZmZzZXQgPSAwOworCisJCXJldCA9IHpsaWJfaW5mbGF0ZSgmd29ya3NwYWNlLT5pbmZfc3RybSwgWl9OT19GTFVTSCk7CisJCWlmIChyZXQgIT0gWl9PSyAmJiByZXQgIT0gWl9TVFJFQU1fRU5EKQorCQkJYnJlYWs7CisKKwkJYnVmX3N0YXJ0ID0gdG90YWxfb3V0OworCQl0b3RhbF9vdXQgPSB3b3Jrc3BhY2UtPmluZl9zdHJtLnRvdGFsX291dDsKKworCQlpZiAodG90YWxfb3V0ID09IGJ1Zl9zdGFydCkgeworCQkJcmV0ID0gLTE7CisJCQlicmVhazsKKwkJfQorCisJCWlmICh0b3RhbF9vdXQgPD0gc3RhcnRfYnl0ZSkKKwkJCWdvdG8gbmV4dDsKKworCQlpZiAodG90YWxfb3V0ID4gc3RhcnRfYnl0ZSAmJiBidWZfc3RhcnQgPCBzdGFydF9ieXRlKQorCQkJYnVmX29mZnNldCA9IHN0YXJ0X2J5dGUgLSBidWZfc3RhcnQ7CisJCWVsc2UKKwkJCWJ1Zl9vZmZzZXQgPSAwOworCisJCWJ5dGVzID0gbWluKFBBR0VfQ0FDSEVfU0laRSAtIHBnX29mZnNldCwKKwkJCSAgICBQQUdFX0NBQ0hFX1NJWkUgLSBidWZfb2Zmc2V0KTsKKwkJYnl0ZXMgPSBtaW4oYnl0ZXMsIGJ5dGVzX2xlZnQpOworCisJCWthZGRyID0ga21hcF9hdG9taWMoZGVzdF9wYWdlLCBLTV9VU0VSMCk7CisJCW1lbWNweShrYWRkciArIHBnX29mZnNldCwgd29ya3NwYWNlLT5idWYgKyBidWZfb2Zmc2V0LCBieXRlcyk7CisJCWt1bm1hcF9hdG9taWMoa2FkZHIsIEtNX1VTRVIwKTsKKworCQlwZ19vZmZzZXQgKz0gYnl0ZXM7CisJCWJ5dGVzX2xlZnQgLT0gYnl0ZXM7CituZXh0OgorCQl3b3Jrc3BhY2UtPmluZl9zdHJtLm5leHRfb3V0ID0gd29ya3NwYWNlLT5idWY7CisJCXdvcmtzcGFjZS0+aW5mX3N0cm0uYXZhaWxfb3V0ID0gUEFHRV9DQUNIRV9TSVpFOworCX0KKworCWlmIChyZXQgIT0gWl9TVFJFQU1fRU5EICYmIGJ5dGVzX2xlZnQgIT0gMCkKKwkJcmV0ID0gLTE7CisJZWxzZQorCQlyZXQgPSAwOworCisJemxpYl9pbmZsYXRlRW5kKCZ3b3Jrc3BhY2UtPmluZl9zdHJtKTsKK291dDoKKwlmcmVlX3dvcmtzcGFjZSh3b3Jrc3BhY2UpOworCXJldHVybiByZXQ7Cit9CisKK3ZvaWQgYnRyZnNfemxpYl9leGl0KHZvaWQpCit7CisgICAgZnJlZV93b3Jrc3BhY2VzKCk7Cit9CmRpZmYgLS1naXQgYS9mcy9idWZmZXIuYyBiL2ZzL2J1ZmZlci5jCmluZGV4IGMyNmRhNzguLmI1ODIwOGYgMTAwNjQ0Ci0tLSBhL2ZzL2J1ZmZlci5jCisrKyBiL2ZzL2J1ZmZlci5jCkBAIC0yMDMsMTAgKzIwMywyNSBAQAogICogaGFwcGVuIG9uIGJkZXYgdW50aWwgdGhhd19iZGV2KCkgaXMgY2FsbGVkLgogICogSWYgYSBzdXBlcmJsb2NrIGlzIGZvdW5kIG9uIHRoaXMgZGV2aWNlLCB3ZSB0YWtlIHRoZSBzX3Vtb3VudCBzZW1hcGhvcmUKICAqIG9uIGl0IHRvIG1ha2Ugc3VyZSBub2JvZHkgdW5tb3VudHMgdW50aWwgdGhlIHNuYXBzaG90IGNyZWF0aW9uIGlzIGRvbmUuCisgKiBUaGUgcmVmZXJlbmNlIGNvdW50ZXIgKGJkX2ZzZnJlZXplX2NvdW50KSBndWFyYW50ZWVzIHRoYXQgb25seSB0aGUgbGFzdAorICogdW5mcmVlemUgcHJvY2VzcyBjYW4gdW5mcmVlemUgdGhlIGZyb3plbiBmaWxlc3lzdGVtIGFjdHVhbGx5IHdoZW4gbXVsdGlwbGUKKyAqIGZyZWV6ZSByZXF1ZXN0cyBhcnJpdmUgc2ltdWx0YW5lb3VzbHkuIEl0IGNvdW50cyB1cCBpbiBmcmVlemVfYmRldigpIGFuZAorICogY291bnQgZG93biBpbiB0aGF3X2JkZXYoKS4gV2hlbiBpdCBiZWNvbWVzIDAsIHRoYXdfYmRldigpIHdpbGwgdW5mcmVlemUKKyAqIGFjdHVhbGx5LgogICovCiBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKmZyZWV6ZV9iZGV2KHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYpCiB7CiAJc3RydWN0IHN1cGVyX2Jsb2NrICpzYjsKKwlpbnQgZXJyb3IgPSAwOworCisJbXV0ZXhfbG9jaygmYmRldi0+YmRfZnNmcmVlemVfbXV0ZXgpOworCWlmIChiZGV2LT5iZF9mc2ZyZWV6ZV9jb3VudCA+IDApIHsKKwkJYmRldi0+YmRfZnNmcmVlemVfY291bnQrKzsKKwkJc2IgPSBnZXRfc3VwZXIoYmRldik7CisJCW11dGV4X3VubG9jaygmYmRldi0+YmRfZnNmcmVlemVfbXV0ZXgpOworCQlyZXR1cm4gc2I7CisJfQorCWJkZXYtPmJkX2ZzZnJlZXplX2NvdW50Kys7CiAKIAlkb3duKCZiZGV2LT5iZF9tb3VudF9zZW0pOwogCXNiID0gZ2V0X3N1cGVyKGJkZXYpOwpAQCAtMjIxLDExICsyMzYsMjQgQEAKIAogCQlzeW5jX2Jsb2NrZGV2KHNiLT5zX2JkZXYpOwogCi0JCWlmIChzYi0+c19vcC0+d3JpdGVfc3VwZXJfbG9ja2ZzKQotCQkJc2ItPnNfb3AtPndyaXRlX3N1cGVyX2xvY2tmcyhzYik7CisJCWlmIChzYi0+c19vcC0+ZnJlZXplX2ZzKSB7CisJCQllcnJvciA9IHNiLT5zX29wLT5mcmVlemVfZnMoc2IpOworCQkJaWYgKGVycm9yKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkJCSJWRlM6RmlsZXN5c3RlbSBmcmVlemUgZmFpbGVkXG4iKTsKKwkJCQlzYi0+c19mcm96ZW4gPSBTQl9VTkZST1pFTjsKKwkJCQlkcm9wX3N1cGVyKHNiKTsKKwkJCQl1cCgmYmRldi0+YmRfbW91bnRfc2VtKTsKKwkJCQliZGV2LT5iZF9mc2ZyZWV6ZV9jb3VudC0tOworCQkJCW11dGV4X3VubG9jaygmYmRldi0+YmRfZnNmcmVlemVfbXV0ZXgpOworCQkJCXJldHVybiBFUlJfUFRSKGVycm9yKTsKKwkJCX0KKwkJfQogCX0KIAogCXN5bmNfYmxvY2tkZXYoYmRldik7CisJbXV0ZXhfdW5sb2NrKCZiZGV2LT5iZF9mc2ZyZWV6ZV9tdXRleCk7CisKIAlyZXR1cm4gc2I7CS8qIHRoYXdfYmRldiByZWxlYXNlcyBzLT5zX3Vtb3VudCBhbmQgYmRfbW91bnRfc2VtICovCiB9CiBFWFBPUlRfU1lNQk9MKGZyZWV6ZV9iZGV2KTsKQEAgLTIzNywyMCArMjY1LDQ4IEBACiAgKgogICogVW5sb2NrcyB0aGUgZmlsZXN5c3RlbSBhbmQgbWFya3MgaXQgd3JpdGVhYmxlIGFnYWluIGFmdGVyIGZyZWV6ZV9iZGV2KCkuCiAgKi8KLXZvaWQgdGhhd19iZGV2KHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCitpbnQgdGhhd19iZGV2KHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCiB7CisJaW50IGVycm9yID0gMDsKKworCW11dGV4X2xvY2soJmJkZXYtPmJkX2ZzZnJlZXplX211dGV4KTsKKwlpZiAoIWJkZXYtPmJkX2ZzZnJlZXplX2NvdW50KSB7CisJCW11dGV4X3VubG9jaygmYmRldi0+YmRfZnNmcmVlemVfbXV0ZXgpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwliZGV2LT5iZF9mc2ZyZWV6ZV9jb3VudC0tOworCWlmIChiZGV2LT5iZF9mc2ZyZWV6ZV9jb3VudCA+IDApIHsKKwkJaWYgKHNiKQorCQkJZHJvcF9zdXBlcihzYik7CisJCW11dGV4X3VubG9jaygmYmRldi0+YmRfZnNmcmVlemVfbXV0ZXgpOworCQlyZXR1cm4gMDsKKwl9CisKIAlpZiAoc2IpIHsKIAkJQlVHX09OKHNiLT5zX2JkZXYgIT0gYmRldik7Ci0KLQkJaWYgKHNiLT5zX29wLT51bmxvY2tmcykKLQkJCXNiLT5zX29wLT51bmxvY2tmcyhzYik7Ci0JCXNiLT5zX2Zyb3plbiA9IFNCX1VORlJPWkVOOwotCQlzbXBfd21iKCk7Ci0JCXdha2VfdXAoJnNiLT5zX3dhaXRfdW5mcm96ZW4pOworCQlpZiAoIShzYi0+c19mbGFncyAmIE1TX1JET05MWSkpIHsKKwkJCWlmIChzYi0+c19vcC0+dW5mcmVlemVfZnMpIHsKKwkJCQllcnJvciA9IHNiLT5zX29wLT51bmZyZWV6ZV9mcyhzYik7CisJCQkJaWYgKGVycm9yKSB7CisJCQkJCXByaW50ayhLRVJOX0VSUgorCQkJCQkJIlZGUzpGaWxlc3lzdGVtIHRoYXcgZmFpbGVkXG4iKTsKKwkJCQkJc2ItPnNfZnJvemVuID0gU0JfRlJFRVpFX1RSQU5TOworCQkJCQliZGV2LT5iZF9mc2ZyZWV6ZV9jb3VudCsrOworCQkJCQltdXRleF91bmxvY2soJmJkZXYtPmJkX2ZzZnJlZXplX211dGV4KTsKKwkJCQkJcmV0dXJuIGVycm9yOworCQkJCX0KKwkJCX0KKwkJCXNiLT5zX2Zyb3plbiA9IFNCX1VORlJPWkVOOworCQkJc21wX3dtYigpOworCQkJd2FrZV91cCgmc2ItPnNfd2FpdF91bmZyb3plbik7CisJCX0KIAkJZHJvcF9zdXBlcihzYik7CiAJfQogCiAJdXAoJmJkZXYtPmJkX21vdW50X3NlbSk7CisJbXV0ZXhfdW5sb2NrKCZiZGV2LT5iZF9mc2ZyZWV6ZV9tdXRleCk7CisJcmV0dXJuIDA7CiB9CiBFWFBPUlRfU1lNQk9MKHRoYXdfYmRldik7CiAKQEAgLTMxODcsNyArMzI0Myw3IEBACiAgKiBVc2Ugb2YgYmRmbHVzaCgpIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiBhIGZ1dHVyZSBrZXJuZWwuCiAgKiBUaGUgYHBkZmx1c2gnIGtlcm5lbCB0aHJlYWRzIGZ1bGx5IHJlcGxhY2UgYmRmbHVzaCBkYWVtb25zIGFuZCB0aGlzIGNhbGwuCiAgKi8KLWFzbWxpbmthZ2UgbG9uZyBzeXNfYmRmbHVzaChpbnQgZnVuYywgbG9uZyBkYXRhKQorU1lTQ0FMTF9ERUZJTkUyKGJkZmx1c2gsIGludCwgZnVuYywgbG9uZywgZGF0YSkKIHsKIAlzdGF0aWMgaW50IG1zZ19jb3VudDsKIApkaWZmIC0tZ2l0IGEvZnMvY29kYS9zeXNjdGwuYyBiL2ZzL2NvZGEvc3lzY3RsLmMKaW5kZXggODFiNzc3MS4uNDNjOTZjZSAxMDA2NDQKLS0tIGEvZnMvY29kYS9zeXNjdGwuYworKysgYi9mcy9jb2RhL3N5c2N0bC5jCkBAIC0xMSw3ICsxMSw5IEBACiAKICNpbmNsdWRlICJjb2RhX2ludC5oIgogCisjaWZkZWYgQ09ORklHX1NZU0NUTAogc3RhdGljIHN0cnVjdCBjdGxfdGFibGVfaGVhZGVyICpmc190YWJsZV9oZWFkZXI7CisjZW5kaWYKIAogc3RhdGljIGN0bF90YWJsZSBjb2RhX3RhYmxlW10gPSB7CiAJewpAQCAtNDEsNiArNDMsNyBAQAogCXt9CiB9OwogCisjaWZkZWYgQ09ORklHX1NZU0NUTAogc3RhdGljIGN0bF90YWJsZSBmc190YWJsZVtdID0gewogCXsKIAkJLmN0bF9uYW1lCT0gQ1RMX1VOTlVNQkVSRUQsCkBAIC01MCw3ICs1Myw3IEBACiAJfSwKIAl7fQogfTsKLQorI2VuZGlmCiAKIHZvaWQgY29kYV9zeXNjdGxfaW5pdCh2b2lkKQogewpkaWZmIC0tZ2l0IGEvZnMvY29tcGF0LmMgYi9mcy9jb21wYXQuYwppbmRleCAzMGYyZmFhLi42NWEwNzBlIDEwMDY0NAotLS0gYS9mcy9jb21wYXQuYworKysgYi9mcy9jb21wYXQuYwpAQCAtMTcwOSw3ICsxNzA5LDcgQEAKIH0KIAogI2lmZGVmIEhBVkVfU0VUX1JFU1RPUkVfU0lHTUFTSwotYXNtbGlua2FnZSBsb25nIGNvbXBhdF9zeXNfcHNlbGVjdDcoaW50IG4sIGNvbXBhdF91bG9uZ190IF9fdXNlciAqaW5wLAorc3RhdGljIGxvbmcgZG9fY29tcGF0X3BzZWxlY3QoaW50IG4sIGNvbXBhdF91bG9uZ190IF9fdXNlciAqaW5wLAogCWNvbXBhdF91bG9uZ190IF9fdXNlciAqb3V0cCwgY29tcGF0X3Vsb25nX3QgX191c2VyICpleHAsCiAJc3RydWN0IGNvbXBhdF90aW1lc3BlYyBfX3VzZXIgKnRzcCwgY29tcGF0X3NpZ3NldF90IF9fdXNlciAqc2lnbWFzaywKIAljb21wYXRfc2l6ZV90IHNpZ3NldHNpemUpCkBAIC0xNzc1LDggKzE3NzUsOCBAQAogCQkJCShjb21wYXRfc2l6ZV90IF9fdXNlciAqKShzaWcrc2l6ZW9mKHVwKSkpKQogCQkJcmV0dXJuIC1FRkFVTFQ7CiAJfQotCXJldHVybiBjb21wYXRfc3lzX3BzZWxlY3Q3KG4sIGlucCwgb3V0cCwgZXhwLCB0c3AsIGNvbXBhdF9wdHIodXApLAotCQkJCQlzaWdzZXRzaXplKTsKKwlyZXR1cm4gZG9fY29tcGF0X3BzZWxlY3QobiwgaW5wLCBvdXRwLCBleHAsIHRzcCwgY29tcGF0X3B0cih1cCksCisJCQkJIHNpZ3NldHNpemUpOwogfQogCiBhc21saW5rYWdlIGxvbmcgY29tcGF0X3N5c19wcG9sbChzdHJ1Y3QgcG9sbGZkIF9fdXNlciAqdWZkcywKZGlmZiAtLWdpdCBhL2ZzL2RjYWNoZS5jIGIvZnMvZGNhY2hlLmMKaW5kZXggZTg4YzIzYi4uOTM3ZGYwZiAxMDA2NDQKLS0tIGEvZnMvZGNhY2hlLmMKKysrIGIvZnMvZGNhY2hlLmMKQEAgLTE1NjcsMTAgKzE1NjcsNiBAQAogCXNwaW5fdW5sb2NrKCZkY2FjaGVfbG9jayk7CiB9CiAKLSNkZWZpbmUgZG9fc3dpdGNoKHgseSkgZG8geyBcCi0JX190eXBlb2ZfXyAoeCkgX190bXAgPSB4OyBcCi0JeCA9IHk7IHkgPSBfX3RtcDsgfSB3aGlsZSAoMCkKLQogLyoKICAqIFdoZW4gc3dpdGNoaW5nIG5hbWVzLCB0aGUgYWN0dWFsIHN0cmluZyBkb2Vzbid0IHN0cmljdGx5IGhhdmUgdG8KICAqIGJlIHByZXNlcnZlZCBpbiB0aGUgdGFyZ2V0IC0gYmVjYXVzZSB3ZSdyZSBkcm9wcGluZyB0aGUgdGFyZ2V0CkBAIC0xNTg5LDcgKzE1ODUsNyBAQAogCQkJLyoKIAkJCSAqIEJvdGggZXh0ZXJuYWw6IHN3YXAgdGhlIHBvaW50ZXJzCiAJCQkgKi8KLQkJCWRvX3N3aXRjaCh0YXJnZXQtPmRfbmFtZS5uYW1lLCBkZW50cnktPmRfbmFtZS5uYW1lKTsKKwkJCXN3YXAodGFyZ2V0LT5kX25hbWUubmFtZSwgZGVudHJ5LT5kX25hbWUubmFtZSk7CiAJCX0gZWxzZSB7CiAJCQkvKgogCQkJICogZGVudHJ5OmludGVybmFsLCB0YXJnZXQ6ZXh0ZXJuYWwuICBTdGVhbCB0YXJnZXQncwpAQCAtMTYyMCw3ICsxNjE2LDcgQEAKIAkJCXJldHVybjsKIAkJfQogCX0KLQlkb19zd2l0Y2goZGVudHJ5LT5kX25hbWUubGVuLCB0YXJnZXQtPmRfbmFtZS5sZW4pOworCXN3YXAoZGVudHJ5LT5kX25hbWUubGVuLCB0YXJnZXQtPmRfbmFtZS5sZW4pOwogfQogCiAvKgpAQCAtMTY4MCw3ICsxNjc2LDcgQEAKIAogCS8qIFN3aXRjaCB0aGUgbmFtZXMuLiAqLwogCXN3aXRjaF9uYW1lcyhkZW50cnksIHRhcmdldCk7Ci0JZG9fc3dpdGNoKGRlbnRyeS0+ZF9uYW1lLmhhc2gsIHRhcmdldC0+ZF9uYW1lLmhhc2gpOworCXN3YXAoZGVudHJ5LT5kX25hbWUuaGFzaCwgdGFyZ2V0LT5kX25hbWUuaGFzaCk7CiAKIAkvKiAuLi4gYW5kIHN3aXRjaCB0aGUgcGFyZW50cyAqLwogCWlmIChJU19ST09UKGRlbnRyeSkpIHsKQEAgLTE2ODgsNyArMTY4NCw3IEBACiAJCXRhcmdldC0+ZF9wYXJlbnQgPSB0YXJnZXQ7CiAJCUlOSVRfTElTVF9IRUFEKCZ0YXJnZXQtPmRfdS5kX2NoaWxkKTsKIAl9IGVsc2UgewotCQlkb19zd2l0Y2goZGVudHJ5LT5kX3BhcmVudCwgdGFyZ2V0LT5kX3BhcmVudCk7CisJCXN3YXAoZGVudHJ5LT5kX3BhcmVudCwgdGFyZ2V0LT5kX3BhcmVudCk7CiAKIAkJLyogQW5kIGFkZCB0aGVtIGJhY2sgdG8gdGhlIChuZXcpIHBhcmVudCBsaXN0cyAqLwogCQlsaXN0X2FkZCgmdGFyZ2V0LT5kX3UuZF9jaGlsZCwgJnRhcmdldC0+ZF9wYXJlbnQtPmRfc3ViZGlycyk7CkBAIC0xNzg5LDcgKzE3ODUsNyBAQAogCXN0cnVjdCBkZW50cnkgKmRwYXJlbnQsICphcGFyZW50OwogCiAJc3dpdGNoX25hbWVzKGRlbnRyeSwgYW5vbik7Ci0JZG9fc3dpdGNoKGRlbnRyeS0+ZF9uYW1lLmhhc2gsIGFub24tPmRfbmFtZS5oYXNoKTsKKwlzd2FwKGRlbnRyeS0+ZF9uYW1lLmhhc2gsIGFub24tPmRfbmFtZS5oYXNoKTsKIAogCWRwYXJlbnQgPSBkZW50cnktPmRfcGFyZW50OwogCWFwYXJlbnQgPSBhbm9uLT5kX3BhcmVudDsKQEAgLTIwOTYsNyArMjA5Miw3IEBACiAgKgkJcmV0dXJuIE5VTEw7CiAgKgl9CiAgKi8KLWFzbWxpbmthZ2UgbG9uZyBzeXNfZ2V0Y3dkKGNoYXIgX191c2VyICpidWYsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKK1NZU0NBTExfREVGSU5FMihnZXRjd2QsIGNoYXIgX191c2VyICosIGJ1ZiwgdW5zaWduZWQgbG9uZywgc2l6ZSkKIHsKIAlpbnQgZXJyb3I7CiAJc3RydWN0IHBhdGggcHdkLCByb290OwpkaWZmIC0tZ2l0IGEvZnMvZGNvb2tpZXMuYyBiL2ZzL2Rjb29raWVzLmMKaW5kZXggMTgwZTlmZS4uYTIxY2FiZCAxMDA2NDQKLS0tIGEvZnMvZGNvb2tpZXMuYworKysgYi9mcy9kY29va2llcy5jCkBAIC0xNDUsNyArMTQ1LDcgQEAKIC8qIEFuZCBoZXJlIGlzIHdoZXJlIHRoZSB1c2Vyc3BhY2UgcHJvY2VzcyBjYW4gbG9vayB1cCB0aGUgY29va2llIHZhbHVlCiAgKiB0byByZXRyaWV2ZSB0aGUgcGF0aC4KICAqLwotYXNtbGlua2FnZSBsb25nIHN5c19sb29rdXBfZGNvb2tpZSh1NjQgY29va2llNjQsIGNoYXIgX191c2VyICogYnVmLCBzaXplX3QgbGVuKQorU1lTQ0FMTF9ERUZJTkUobG9va3VwX2Rjb29raWUpKHU2NCBjb29raWU2NCwgY2hhciBfX3VzZXIgKiBidWYsIHNpemVfdCBsZW4pCiB7CiAJdW5zaWduZWQgbG9uZyBjb29raWUgPSAodW5zaWduZWQgbG9uZyljb29raWU2NDsKIAlpbnQgZXJyID0gLUVJTlZBTDsKQEAgLTE5OCw3ICsxOTgsMTMgQEAKIAltdXRleF91bmxvY2soJmRjb29raWVfbXV0ZXgpOwogCXJldHVybiBlcnI7CiB9Ci0KKyNpZmRlZiBDT05GSUdfSEFWRV9TWVNDQUxMX1dSQVBQRVJTCithc21saW5rYWdlIGxvbmcgU3lTX2xvb2t1cF9kY29va2llKHU2NCBjb29raWU2NCwgbG9uZyBidWYsIGxvbmcgbGVuKQoreworCXJldHVybiBTWVNDX2xvb2t1cF9kY29va2llKGNvb2tpZTY0LCAoY2hhciBfX3VzZXIgKikgYnVmLCAoc2l6ZV90KSBsZW4pOworfQorU1lTQ0FMTF9BTElBUyhzeXNfbG9va3VwX2Rjb29raWUsIFN5U19sb29rdXBfZGNvb2tpZSk7CisjZW5kaWYKIAogc3RhdGljIGludCBkY29va2llX2luaXQodm9pZCkKIHsKZGlmZiAtLWdpdCBhL2ZzL2RlYnVnZnMvZmlsZS5jIGIvZnMvZGVidWdmcy9maWxlLmMKaW5kZXggMTU5YTVlZi4uMzNhOTAxMiAxMDA2NDQKLS0tIGEvZnMvZGVidWdmcy9maWxlLmMKKysrIGIvZnMvZGVidWdmcy9maWxlLmMKQEAgLTI5NCw2ICsyOTQsMzggQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGRlYnVnZnNfY3JlYXRlX3gzMik7CiAKKworc3RhdGljIGludCBkZWJ1Z2ZzX3NpemVfdF9zZXQodm9pZCAqZGF0YSwgdTY0IHZhbCkKK3sKKwkqKHNpemVfdCAqKWRhdGEgPSB2YWw7CisJcmV0dXJuIDA7Cit9CitzdGF0aWMgaW50IGRlYnVnZnNfc2l6ZV90X2dldCh2b2lkICpkYXRhLCB1NjQgKnZhbCkKK3sKKwkqdmFsID0gKihzaXplX3QgKilkYXRhOworCXJldHVybiAwOworfQorREVGSU5FX1NJTVBMRV9BVFRSSUJVVEUoZm9wc19zaXplX3QsIGRlYnVnZnNfc2l6ZV90X2dldCwgZGVidWdmc19zaXplX3Rfc2V0LAorCQkJIiVsbHVcbiIpOwkvKiAlbGx1IGFuZCAlenUgYXJlIG1vcmUgb3IgbGVzcyB0aGUgc2FtZSAqLworCisvKioKKyAqIGRlYnVnZnNfY3JlYXRlX3NpemVfdCAtIGNyZWF0ZSBhIGRlYnVnZnMgZmlsZSB0aGF0IGlzIHVzZWQgdG8gcmVhZCBhbmQgd3JpdGUgYW4gc2l6ZV90IHZhbHVlCisgKiBAbmFtZTogYSBwb2ludGVyIHRvIGEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIG5hbWUgb2YgdGhlIGZpbGUgdG8gY3JlYXRlLgorICogQG1vZGU6IHRoZSBwZXJtaXNzaW9uIHRoYXQgdGhlIGZpbGUgc2hvdWxkIGhhdmUKKyAqIEBwYXJlbnQ6IGEgcG9pbnRlciB0byB0aGUgcGFyZW50IGRlbnRyeSBmb3IgdGhpcyBmaWxlLiAgVGhpcyBzaG91bGQgYmUgYQorICogICAgICAgICAgZGlyZWN0b3J5IGRlbnRyeSBpZiBzZXQuICBJZiB0aGlzIHBhcmFtZXRlciBpcyAlTlVMTCwgdGhlbiB0aGUKKyAqICAgICAgICAgIGZpbGUgd2lsbCBiZSBjcmVhdGVkIGluIHRoZSByb290IG9mIHRoZSBkZWJ1Z2ZzIGZpbGVzeXN0ZW0uCisgKiBAdmFsdWU6IGEgcG9pbnRlciB0byB0aGUgdmFyaWFibGUgdGhhdCB0aGUgZmlsZSBzaG91bGQgcmVhZCB0byBhbmQgd3JpdGUKKyAqICAgICAgICAgZnJvbS4KKyAqLworc3RydWN0IGRlbnRyeSAqZGVidWdmc19jcmVhdGVfc2l6ZV90KGNvbnN0IGNoYXIgKm5hbWUsIG1vZGVfdCBtb2RlLAorCQkJCSAgICAgc3RydWN0IGRlbnRyeSAqcGFyZW50LCBzaXplX3QgKnZhbHVlKQoreworCXJldHVybiBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKG5hbWUsIG1vZGUsIHBhcmVudCwgdmFsdWUsICZmb3BzX3NpemVfdCk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChkZWJ1Z2ZzX2NyZWF0ZV9zaXplX3QpOworCisKIHN0YXRpYyBzc2l6ZV90IHJlYWRfZmlsZV9ib29sKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqdXNlcl9idWYsCiAJCQkgICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKIHsKZGlmZiAtLWdpdCBhL2ZzL2RsbS9kZWJ1Z19mcy5jIGIvZnMvZGxtL2RlYnVnX2ZzLmMKaW5kZXggMmYxMDdkMS4uMWQxZDI3NCAxMDA2NDQKLS0tIGEvZnMvZGxtL2RlYnVnX2ZzLmMKKysrIGIvZnMvZGxtL2RlYnVnX2ZzLmMKQEAgLTEsNyArMSw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqKgotKiogIENvcHlyaWdodCAoQykgMjAwNS0yMDA4IFJlZCBIYXQsIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqKiAgQ29weXJpZ2h0IChDKSAyMDA1LTIwMDkgUmVkIEhhdCwgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KICoqCiAqKiAgVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCiAqKiAgbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKQEAgLTI1LDE5ICsyNSw2IEBACiAKIHN0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpkbG1fcm9vdDsKIAotc3RydWN0IHJzYl9pdGVyIHsKLQlpbnQgZW50cnk7Ci0JaW50IGZvcm1hdDsKLQlpbnQgaGVhZGVyOwotCXN0cnVjdCBkbG1fbHMgKmxzOwotCXN0cnVjdCBsaXN0X2hlYWQgKm5leHQ7Ci0Jc3RydWN0IGRsbV9yc2IgKnJzYjsKLX07Ci0KLS8qCi0gKiBkdW1wIGFsbCByc2IncyBpbiB0aGUgbG9ja3NwYWNlIGhhc2ggdGFibGUKLSAqLwotCiBzdGF0aWMgY2hhciAqcHJpbnRfbG9ja21vZGUoaW50IG1vZGUpCiB7CiAJc3dpdGNoIChtb2RlKSB7CkBAIC02MCwxMyArNDcsMTMgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIHByaW50X2Zvcm1hdDFfbG9jayhzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHN0cnVjdCBkbG1fbGtiICpsa2IsCi0JCQkgICAgICAgc3RydWN0IGRsbV9yc2IgKnJlcykKK3N0YXRpYyBpbnQgcHJpbnRfZm9ybWF0MV9sb2NrKHN0cnVjdCBzZXFfZmlsZSAqcywgc3RydWN0IGRsbV9sa2IgKmxrYiwKKwkJCSAgICAgIHN0cnVjdCBkbG1fcnNiICpyZXMpCiB7CiAJc2VxX3ByaW50ZihzLCAiJTA4eCAlcyIsIGxrYi0+bGtiX2lkLCBwcmludF9sb2NrbW9kZShsa2ItPmxrYl9ncm1vZGUpKTsKIAotCWlmIChsa2ItPmxrYl9zdGF0dXMgPT0gRExNX0xLU1RTX0NPTlZFUlQKLQkgICAgfHwgbGtiLT5sa2Jfc3RhdHVzID09IERMTV9MS1NUU19XQUlUSU5HKQorCWlmIChsa2ItPmxrYl9zdGF0dXMgPT0gRExNX0xLU1RTX0NPTlZFUlQgfHwKKwkgICAgbGtiLT5sa2Jfc3RhdHVzID09IERMTV9MS1NUU19XQUlUSU5HKQogCQlzZXFfcHJpbnRmKHMsICIgKCVzKSIsIHByaW50X2xvY2ttb2RlKGxrYi0+bGtiX3JxbW9kZSkpOwogCiAJaWYgKGxrYi0+bGtiX25vZGVpZCkgewpAQCAtODAsMzMgKzY3LDQyIEBACiAJaWYgKGxrYi0+bGtiX3dhaXRfdHlwZSkKIAkJc2VxX3ByaW50ZihzLCAiIHdhaXRfdHlwZTogJWQiLCBsa2ItPmxrYl93YWl0X3R5cGUpOwogCi0Jc2VxX3ByaW50ZihzLCAiXG4iKTsKKwlyZXR1cm4gc2VxX3ByaW50ZihzLCAiXG4iKTsKIH0KIAogc3RhdGljIGludCBwcmludF9mb3JtYXQxKHN0cnVjdCBkbG1fcnNiICpyZXMsIHN0cnVjdCBzZXFfZmlsZSAqcykKIHsKIAlzdHJ1Y3QgZGxtX2xrYiAqbGtiOwogCWludCBpLCBsdmJsZW4gPSByZXMtPnJlc19scy0+bHNfbHZibGVuLCByZWNvdmVyX2xpc3QsIHJvb3RfbGlzdDsKKwlpbnQgcnY7CiAKIAlsb2NrX3JzYihyZXMpOwogCi0Jc2VxX3ByaW50ZihzLCAiXG5SZXNvdXJjZSAlcCBOYW1lIChsZW49JWQpIFwiIiwgcmVzLCByZXMtPnJlc19sZW5ndGgpOworCXJ2ID0gc2VxX3ByaW50ZihzLCAiXG5SZXNvdXJjZSAlcCBOYW1lIChsZW49JWQpIFwiIiwKKwkJCXJlcywgcmVzLT5yZXNfbGVuZ3RoKTsKKwlpZiAocnYpCisJCWdvdG8gb3V0OworCiAJZm9yIChpID0gMDsgaSA8IHJlcy0+cmVzX2xlbmd0aDsgaSsrKSB7CiAJCWlmIChpc3ByaW50KHJlcy0+cmVzX25hbWVbaV0pKQogCQkJc2VxX3ByaW50ZihzLCAiJWMiLCByZXMtPnJlc19uYW1lW2ldKTsKIAkJZWxzZQogCQkJc2VxX3ByaW50ZihzLCAiJWMiLCAnLicpOwogCX0KKwogCWlmIChyZXMtPnJlc19ub2RlaWQgPiAwKQotCQlzZXFfcHJpbnRmKHMsICJcIiAgXG5Mb2NhbCBDb3B5LCBNYXN0ZXIgaXMgbm9kZSAlZFxuIiwKLQkJCSAgIHJlcy0+cmVzX25vZGVpZCk7CisJCXJ2ID0gc2VxX3ByaW50ZihzLCAiXCIgIFxuTG9jYWwgQ29weSwgTWFzdGVyIGlzIG5vZGUgJWRcbiIsCisJCQkJcmVzLT5yZXNfbm9kZWlkKTsKIAllbHNlIGlmIChyZXMtPnJlc19ub2RlaWQgPT0gMCkKLQkJc2VxX3ByaW50ZihzLCAiXCIgIFxuTWFzdGVyIENvcHlcbiIpOworCQlydiA9IHNlcV9wcmludGYocywgIlwiICBcbk1hc3RlciBDb3B5XG4iKTsKIAllbHNlIGlmIChyZXMtPnJlc19ub2RlaWQgPT0gLTEpCi0JCXNlcV9wcmludGYocywgIlwiICBcbkxvb2tpbmcgdXAgbWFzdGVyIChsa2lkICV4KVxuIiwKLQkJCSAgIHJlcy0+cmVzX2ZpcnN0X2xraWQpOworCQlydiA9IHNlcV9wcmludGYocywgIlwiICBcbkxvb2tpbmcgdXAgbWFzdGVyIChsa2lkICV4KVxuIiwKKwkJCSAgIAlyZXMtPnJlc19maXJzdF9sa2lkKTsKIAllbHNlCi0JCXNlcV9wcmludGYocywgIlwiICBcbkludmFsaWQgbWFzdGVyICVkXG4iLCByZXMtPnJlc19ub2RlaWQpOworCQlydiA9IHNlcV9wcmludGYocywgIlwiICBcbkludmFsaWQgbWFzdGVyICVkXG4iLAorCQkJCXJlcy0+cmVzX25vZGVpZCk7CisJaWYgKHJ2KQorCQlnb3RvIG91dDsKIAogCS8qIFByaW50IHRoZSBMVkI6ICovCiAJaWYgKHJlcy0+cmVzX2x2YnB0cikgewpAQCAtMTE5LDUyICsxMTUsNjYgQEAKIAkJfQogCQlpZiAocnNiX2ZsYWcocmVzLCBSU0JfVkFMTk9UVkFMSUQpKQogCQkJc2VxX3ByaW50ZihzLCAiIChJTlZBTElEKSIpOwotCQlzZXFfcHJpbnRmKHMsICJcbiIpOworCQlydiA9IHNlcV9wcmludGYocywgIlxuIik7CisJCWlmIChydikKKwkJCWdvdG8gb3V0OwogCX0KIAogCXJvb3RfbGlzdCA9ICFsaXN0X2VtcHR5KCZyZXMtPnJlc19yb290X2xpc3QpOwogCXJlY292ZXJfbGlzdCA9ICFsaXN0X2VtcHR5KCZyZXMtPnJlc19yZWNvdmVyX2xpc3QpOwogCiAJaWYgKHJvb3RfbGlzdCB8fCByZWNvdmVyX2xpc3QpIHsKLQkJc2VxX3ByaW50ZihzLCAiUmVjb3Zlcnk6IHJvb3QgJWQgcmVjb3ZlciAlZCBmbGFncyAlbHggIgotCQkJICAgImNvdW50ICVkXG4iLCByb290X2xpc3QsIHJlY292ZXJfbGlzdCwKLQkJCSAgIHJlcy0+cmVzX2ZsYWdzLCByZXMtPnJlc19yZWNvdmVyX2xvY2tzX2NvdW50KTsKKwkJcnYgPSBzZXFfcHJpbnRmKHMsICJSZWNvdmVyeTogcm9vdCAlZCByZWNvdmVyICVkIGZsYWdzICVseCAiCisJCQkJImNvdW50ICVkXG4iLCByb290X2xpc3QsIHJlY292ZXJfbGlzdCwKKwkJCSAgIAlyZXMtPnJlc19mbGFncywgcmVzLT5yZXNfcmVjb3Zlcl9sb2Nrc19jb3VudCk7CisJCWlmIChydikKKwkJCWdvdG8gb3V0OwogCX0KIAogCS8qIFByaW50IHRoZSBsb2NrcyBhdHRhY2hlZCB0byB0aGlzIHJlc291cmNlICovCiAJc2VxX3ByaW50ZihzLCAiR3JhbnRlZCBRdWV1ZVxuIik7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeShsa2IsICZyZXMtPnJlc19ncmFudHF1ZXVlLCBsa2Jfc3RhdGVxdWV1ZSkKLQkJcHJpbnRfZm9ybWF0MV9sb2NrKHMsIGxrYiwgcmVzKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGxrYiwgJnJlcy0+cmVzX2dyYW50cXVldWUsIGxrYl9zdGF0ZXF1ZXVlKSB7CisJCXJ2ID0gcHJpbnRfZm9ybWF0MV9sb2NrKHMsIGxrYiwgcmVzKTsKKwkJaWYgKHJ2KQorCQkJZ290byBvdXQ7CisJfQogCiAJc2VxX3ByaW50ZihzLCAiQ29udmVyc2lvbiBRdWV1ZVxuIik7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeShsa2IsICZyZXMtPnJlc19jb252ZXJ0cXVldWUsIGxrYl9zdGF0ZXF1ZXVlKQotCQlwcmludF9mb3JtYXQxX2xvY2socywgbGtiLCByZXMpOworCWxpc3RfZm9yX2VhY2hfZW50cnkobGtiLCAmcmVzLT5yZXNfY29udmVydHF1ZXVlLCBsa2Jfc3RhdGVxdWV1ZSkgeworCQlydiA9IHByaW50X2Zvcm1hdDFfbG9jayhzLCBsa2IsIHJlcyk7CisJCWlmIChydikKKwkJCWdvdG8gb3V0OworCX0KIAogCXNlcV9wcmludGYocywgIldhaXRpbmcgUXVldWVcbiIpOwotCWxpc3RfZm9yX2VhY2hfZW50cnkobGtiLCAmcmVzLT5yZXNfd2FpdHF1ZXVlLCBsa2Jfc3RhdGVxdWV1ZSkKLQkJcHJpbnRfZm9ybWF0MV9sb2NrKHMsIGxrYiwgcmVzKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGxrYiwgJnJlcy0+cmVzX3dhaXRxdWV1ZSwgbGtiX3N0YXRlcXVldWUpIHsKKwkJcnYgPSBwcmludF9mb3JtYXQxX2xvY2socywgbGtiLCByZXMpOworCQlpZiAocnYpCisJCQlnb3RvIG91dDsKKwl9CiAKIAlpZiAobGlzdF9lbXB0eSgmcmVzLT5yZXNfbG9va3VwKSkKIAkJZ290byBvdXQ7CiAKIAlzZXFfcHJpbnRmKHMsICJMb29rdXAgUXVldWVcbiIpOwogCWxpc3RfZm9yX2VhY2hfZW50cnkobGtiLCAmcmVzLT5yZXNfbG9va3VwLCBsa2JfcnNiX2xvb2t1cCkgewotCQlzZXFfcHJpbnRmKHMsICIlMDh4ICVzIiwgbGtiLT5sa2JfaWQsCi0JCQkgICBwcmludF9sb2NrbW9kZShsa2ItPmxrYl9ycW1vZGUpKTsKKwkJcnYgPSBzZXFfcHJpbnRmKHMsICIlMDh4ICVzIiwgbGtiLT5sa2JfaWQsCisJCQkJcHJpbnRfbG9ja21vZGUobGtiLT5sa2JfcnFtb2RlKSk7CiAJCWlmIChsa2ItPmxrYl93YWl0X3R5cGUpCiAJCQlzZXFfcHJpbnRmKHMsICIgd2FpdF90eXBlOiAlZCIsIGxrYi0+bGtiX3dhaXRfdHlwZSk7Ci0JCXNlcV9wcmludGYocywgIlxuIik7CisJCXJ2ID0gc2VxX3ByaW50ZihzLCAiXG4iKTsKIAl9CiAgb3V0OgogCXVubG9ja19yc2IocmVzKTsKLQlyZXR1cm4gMDsKKwlyZXR1cm4gcnY7CiB9CiAKLXN0YXRpYyB2b2lkIHByaW50X2Zvcm1hdDJfbG9jayhzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHN0cnVjdCBkbG1fbGtiICpsa2IsCi0JCQkgICAgICAgc3RydWN0IGRsbV9yc2IgKnIpCitzdGF0aWMgaW50IHByaW50X2Zvcm1hdDJfbG9jayhzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHN0cnVjdCBkbG1fbGtiICpsa2IsCisJCQkgICAgICBzdHJ1Y3QgZGxtX3JzYiAqcikKIHsKIAl1NjQgeGlkID0gMDsKIAl1NjQgdXM7CisJaW50IHJ2OwogCiAJaWYgKGxrYi0+bGtiX2ZsYWdzICYgRExNX0lGTF9VU0VSKSB7CiAJCWlmIChsa2ItPmxrYl91YSkKQEAgLTE3Nyw2OSArMTg3LDgyIEBACiAJLyogaWQgbm9kZWlkIHJlbWlkIHBpZCB4aWQgZXhmbGFncyBmbGFncyBzdHMgZ3Jtb2RlIHJxbW9kZSB0aW1lX3VzCiAJICAgcl9ub2RlaWQgcl9sZW4gcl9uYW1lICovCiAKLQlzZXFfcHJpbnRmKHMsICIleCAlZCAleCAldSAlbGx1ICV4ICV4ICVkICVkICVkICVsbHUgJXUgJWQgXCIlc1wiXG4iLAotCQkgICBsa2ItPmxrYl9pZCwKLQkJICAgbGtiLT5sa2Jfbm9kZWlkLAotCQkgICBsa2ItPmxrYl9yZW1pZCwKLQkJICAgbGtiLT5sa2Jfb3ducGlkLAotCQkgICAodW5zaWduZWQgbG9uZyBsb25nKXhpZCwKLQkJICAgbGtiLT5sa2JfZXhmbGFncywKLQkJICAgbGtiLT5sa2JfZmxhZ3MsCi0JCSAgIGxrYi0+bGtiX3N0YXR1cywKLQkJICAgbGtiLT5sa2JfZ3Jtb2RlLAotCQkgICBsa2ItPmxrYl9ycW1vZGUsCi0JCSAgICh1bnNpZ25lZCBsb25nIGxvbmcpdXMsCi0JCSAgIHItPnJlc19ub2RlaWQsCi0JCSAgIHItPnJlc19sZW5ndGgsCi0JCSAgIHItPnJlc19uYW1lKTsKKwlydiA9IHNlcV9wcmludGYocywgIiV4ICVkICV4ICV1ICVsbHUgJXggJXggJWQgJWQgJWQgJWxsdSAldSAlZCBcIiVzXCJcbiIsCisJCQlsa2ItPmxrYl9pZCwKKwkJCWxrYi0+bGtiX25vZGVpZCwKKwkJCWxrYi0+bGtiX3JlbWlkLAorCQkJbGtiLT5sa2Jfb3ducGlkLAorCQkJKHVuc2lnbmVkIGxvbmcgbG9uZyl4aWQsCisJCQlsa2ItPmxrYl9leGZsYWdzLAorCQkJbGtiLT5sa2JfZmxhZ3MsCisJCQlsa2ItPmxrYl9zdGF0dXMsCisJCQlsa2ItPmxrYl9ncm1vZGUsCisJCQlsa2ItPmxrYl9ycW1vZGUsCisJCQkodW5zaWduZWQgbG9uZyBsb25nKXVzLAorCQkJci0+cmVzX25vZGVpZCwKKwkJCXItPnJlc19sZW5ndGgsCisJCQlyLT5yZXNfbmFtZSk7CisJcmV0dXJuIHJ2OwogfQogCiBzdGF0aWMgaW50IHByaW50X2Zvcm1hdDIoc3RydWN0IGRsbV9yc2IgKnIsIHN0cnVjdCBzZXFfZmlsZSAqcykKIHsKIAlzdHJ1Y3QgZGxtX2xrYiAqbGtiOworCWludCBydiA9IDA7CiAKIAlsb2NrX3JzYihyKTsKIAotCWxpc3RfZm9yX2VhY2hfZW50cnkobGtiLCAmci0+cmVzX2dyYW50cXVldWUsIGxrYl9zdGF0ZXF1ZXVlKQotCQlwcmludF9mb3JtYXQyX2xvY2socywgbGtiLCByKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGxrYiwgJnItPnJlc19ncmFudHF1ZXVlLCBsa2Jfc3RhdGVxdWV1ZSkgeworCQlydiA9IHByaW50X2Zvcm1hdDJfbG9jayhzLCBsa2IsIHIpOworCQlpZiAocnYpCisJCQlnb3RvIG91dDsKKwl9CiAKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGxrYiwgJnItPnJlc19jb252ZXJ0cXVldWUsIGxrYl9zdGF0ZXF1ZXVlKQotCQlwcmludF9mb3JtYXQyX2xvY2socywgbGtiLCByKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGxrYiwgJnItPnJlc19jb252ZXJ0cXVldWUsIGxrYl9zdGF0ZXF1ZXVlKSB7CisJCXJ2ID0gcHJpbnRfZm9ybWF0Ml9sb2NrKHMsIGxrYiwgcik7CisJCWlmIChydikKKwkJCWdvdG8gb3V0OworCX0KIAotCWxpc3RfZm9yX2VhY2hfZW50cnkobGtiLCAmci0+cmVzX3dhaXRxdWV1ZSwgbGtiX3N0YXRlcXVldWUpCi0JCXByaW50X2Zvcm1hdDJfbG9jayhzLCBsa2IsIHIpOwotCisJbGlzdF9mb3JfZWFjaF9lbnRyeShsa2IsICZyLT5yZXNfd2FpdHF1ZXVlLCBsa2Jfc3RhdGVxdWV1ZSkgeworCQlydiA9IHByaW50X2Zvcm1hdDJfbG9jayhzLCBsa2IsIHIpOworCQlpZiAocnYpCisJCQlnb3RvIG91dDsKKwl9Cisgb3V0OgogCXVubG9ja19yc2Iocik7Ci0JcmV0dXJuIDA7CisJcmV0dXJuIHJ2OwogfQogCi1zdGF0aWMgdm9pZCBwcmludF9mb3JtYXQzX2xvY2soc3RydWN0IHNlcV9maWxlICpzLCBzdHJ1Y3QgZGxtX2xrYiAqbGtiLAotCQkJICAgICAgIGludCByc2JfbG9va3VwKQorc3RhdGljIGludCBwcmludF9mb3JtYXQzX2xvY2soc3RydWN0IHNlcV9maWxlICpzLCBzdHJ1Y3QgZGxtX2xrYiAqbGtiLAorCQkJICAgICAgaW50IHJzYl9sb29rdXApCiB7CiAJdTY0IHhpZCA9IDA7CisJaW50IHJ2OwogCiAJaWYgKGxrYi0+bGtiX2ZsYWdzICYgRExNX0lGTF9VU0VSKSB7CiAJCWlmIChsa2ItPmxrYl91YSkKIAkJCXhpZCA9IGxrYi0+bGtiX3VhLT54aWQ7CiAJfQogCi0Jc2VxX3ByaW50ZihzLCAibGtiICV4ICVkICV4ICV1ICVsbHUgJXggJXggJWQgJWQgJWQgJWQgJWQgJWQgJXUgJWxsdSAlbGx1XG4iLAotCQkgICBsa2ItPmxrYl9pZCwKLQkJICAgbGtiLT5sa2Jfbm9kZWlkLAotCQkgICBsa2ItPmxrYl9yZW1pZCwKLQkJICAgbGtiLT5sa2Jfb3ducGlkLAotCQkgICAodW5zaWduZWQgbG9uZyBsb25nKXhpZCwKLQkJICAgbGtiLT5sa2JfZXhmbGFncywKLQkJICAgbGtiLT5sa2JfZmxhZ3MsCi0JCSAgIGxrYi0+bGtiX3N0YXR1cywKLQkJICAgbGtiLT5sa2JfZ3Jtb2RlLAotCQkgICBsa2ItPmxrYl9ycW1vZGUsCi0JCSAgIGxrYi0+bGtiX2hpZ2hiYXN0LAotCQkgICByc2JfbG9va3VwLAotCQkgICBsa2ItPmxrYl93YWl0X3R5cGUsCi0JCSAgIGxrYi0+bGtiX2x2YnNlcSwKLQkJICAgKHVuc2lnbmVkIGxvbmcgbG9uZylrdGltZV90b19ucyhsa2ItPmxrYl90aW1lc3RhbXApLAotCQkgICAodW5zaWduZWQgbG9uZyBsb25nKWt0aW1lX3RvX25zKGxrYi0+bGtiX3RpbWVfYmFzdCkpOworCXJ2ID0gc2VxX3ByaW50ZihzLCAibGtiICV4ICVkICV4ICV1ICVsbHUgJXggJXggJWQgJWQgJWQgJWQgJWQgJWQgJXUgJWxsdSAlbGx1XG4iLAorCQkJbGtiLT5sa2JfaWQsCisJCQlsa2ItPmxrYl9ub2RlaWQsCisJCQlsa2ItPmxrYl9yZW1pZCwKKwkJCWxrYi0+bGtiX293bnBpZCwKKwkJCSh1bnNpZ25lZCBsb25nIGxvbmcpeGlkLAorCQkJbGtiLT5sa2JfZXhmbGFncywKKwkJCWxrYi0+bGtiX2ZsYWdzLAorCQkJbGtiLT5sa2Jfc3RhdHVzLAorCQkJbGtiLT5sa2JfZ3Jtb2RlLAorCQkJbGtiLT5sa2JfcnFtb2RlLAorCQkJbGtiLT5sa2JfaGlnaGJhc3QsCisJCQlyc2JfbG9va3VwLAorCQkJbGtiLT5sa2Jfd2FpdF90eXBlLAorCQkJbGtiLT5sa2JfbHZic2VxLAorCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylrdGltZV90b19ucyhsa2ItPmxrYl90aW1lc3RhbXApLAorCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylrdGltZV90b19ucyhsa2ItPmxrYl90aW1lX2Jhc3QpKTsKKwlyZXR1cm4gcnY7CiB9CiAKIHN0YXRpYyBpbnQgcHJpbnRfZm9ybWF0MyhzdHJ1Y3QgZGxtX3JzYiAqciwgc3RydWN0IHNlcV9maWxlICpzKQpAQCAtMjQ3LDE4ICsyNzAsMjEgQEAKIAlzdHJ1Y3QgZGxtX2xrYiAqbGtiOwogCWludCBpLCBsdmJsZW4gPSByLT5yZXNfbHMtPmxzX2x2YmxlbjsKIAlpbnQgcHJpbnRfbmFtZSA9IDE7CisJaW50IHJ2OwogCiAJbG9ja19yc2Iocik7CiAKLQlzZXFfcHJpbnRmKHMsICJyc2IgJXAgJWQgJXggJWx4ICVkICVkICV1ICVkICIsCi0JCSAgIHIsCi0JCSAgIHItPnJlc19ub2RlaWQsCi0JCSAgIHItPnJlc19maXJzdF9sa2lkLAotCQkgICByLT5yZXNfZmxhZ3MsCi0JCSAgICFsaXN0X2VtcHR5KCZyLT5yZXNfcm9vdF9saXN0KSwKLQkJICAgIWxpc3RfZW1wdHkoJnItPnJlc19yZWNvdmVyX2xpc3QpLAotCQkgICByLT5yZXNfcmVjb3Zlcl9sb2Nrc19jb3VudCwKLQkJICAgci0+cmVzX2xlbmd0aCk7CisJcnYgPSBzZXFfcHJpbnRmKHMsICJyc2IgJXAgJWQgJXggJWx4ICVkICVkICV1ICVkICIsCisJCQlyLAorCQkJci0+cmVzX25vZGVpZCwKKwkJCXItPnJlc19maXJzdF9sa2lkLAorCQkJci0+cmVzX2ZsYWdzLAorCQkJIWxpc3RfZW1wdHkoJnItPnJlc19yb290X2xpc3QpLAorCQkJIWxpc3RfZW1wdHkoJnItPnJlc19yZWNvdmVyX2xpc3QpLAorCQkJci0+cmVzX3JlY292ZXJfbG9ja3NfY291bnQsCisJCQlyLT5yZXNfbGVuZ3RoKTsKKwlpZiAocnYpCisJCWdvdG8gb3V0OwogCiAJZm9yIChpID0gMDsgaSA8IHItPnJlc19sZW5ndGg7IGkrKykgewogCQlpZiAoIWlzYXNjaWkoci0+cmVzX25hbWVbaV0pIHx8ICFpc3ByaW50KHItPnJlc19uYW1lW2ldKSkKQEAgLTI3Myw3ICsyOTksOSBAQAogCQllbHNlCiAJCQlzZXFfcHJpbnRmKHMsICIgJTAyeCIsICh1bnNpZ25lZCBjaGFyKXItPnJlc19uYW1lW2ldKTsKIAl9Ci0Jc2VxX3ByaW50ZihzLCAiXG4iKTsKKwlydiA9IHNlcV9wcmludGYocywgIlxuIik7CisJaWYgKHJ2KQorCQlnb3RvIG91dDsKIAogCWlmICghci0+cmVzX2x2YnB0cikKIAkJZ290byBkb19sb2NrczsKQEAgLTI4MiwzNDQgKzMxMCwyOTQgQEAKIAogCWZvciAoaSA9IDA7IGkgPCBsdmJsZW47IGkrKykKIAkJc2VxX3ByaW50ZihzLCAiICUwMngiLCAodW5zaWduZWQgY2hhcilyLT5yZXNfbHZicHRyW2ldKTsKLQlzZXFfcHJpbnRmKHMsICJcbiIpOworCXJ2ID0gc2VxX3ByaW50ZihzLCAiXG4iKTsKKwlpZiAocnYpCisJCWdvdG8gb3V0OwogCiAgZG9fbG9ja3M6Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeShsa2IsICZyLT5yZXNfZ3JhbnRxdWV1ZSwgbGtiX3N0YXRlcXVldWUpCi0JCXByaW50X2Zvcm1hdDNfbG9jayhzLCBsa2IsIDApOworCWxpc3RfZm9yX2VhY2hfZW50cnkobGtiLCAmci0+cmVzX2dyYW50cXVldWUsIGxrYl9zdGF0ZXF1ZXVlKSB7CisJCXJ2ID0gcHJpbnRfZm9ybWF0M19sb2NrKHMsIGxrYiwgMCk7CisJCWlmIChydikKKwkJCWdvdG8gb3V0OworCX0KIAotCWxpc3RfZm9yX2VhY2hfZW50cnkobGtiLCAmci0+cmVzX2NvbnZlcnRxdWV1ZSwgbGtiX3N0YXRlcXVldWUpCi0JCXByaW50X2Zvcm1hdDNfbG9jayhzLCBsa2IsIDApOworCWxpc3RfZm9yX2VhY2hfZW50cnkobGtiLCAmci0+cmVzX2NvbnZlcnRxdWV1ZSwgbGtiX3N0YXRlcXVldWUpIHsKKwkJcnYgPSBwcmludF9mb3JtYXQzX2xvY2socywgbGtiLCAwKTsKKwkJaWYgKHJ2KQorCQkJZ290byBvdXQ7CisJfQogCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShsa2IsICZyLT5yZXNfd2FpdHF1ZXVlLCBsa2Jfc3RhdGVxdWV1ZSkKLQkJcHJpbnRfZm9ybWF0M19sb2NrKHMsIGxrYiwgMCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShsa2IsICZyLT5yZXNfd2FpdHF1ZXVlLCBsa2Jfc3RhdGVxdWV1ZSkgeworCQlydiA9IHByaW50X2Zvcm1hdDNfbG9jayhzLCBsa2IsIDApOworCQlpZiAocnYpCisJCQlnb3RvIG91dDsKKwl9CiAKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGxrYiwgJnItPnJlc19sb29rdXAsIGxrYl9yc2JfbG9va3VwKQotCQlwcmludF9mb3JtYXQzX2xvY2socywgbGtiLCAxKTsKLQorCWxpc3RfZm9yX2VhY2hfZW50cnkobGtiLCAmci0+cmVzX2xvb2t1cCwgbGtiX3JzYl9sb29rdXApIHsKKwkJcnYgPSBwcmludF9mb3JtYXQzX2xvY2socywgbGtiLCAxKTsKKwkJaWYgKHJ2KQorCQkJZ290byBvdXQ7CisJfQorIG91dDoKIAl1bmxvY2tfcnNiKHIpOwotCXJldHVybiAwOworCXJldHVybiBydjsKIH0KIAotc3RhdGljIGludCByc2JfaXRlcl9uZXh0KHN0cnVjdCByc2JfaXRlciAqcmkpCitzdHJ1Y3QgcnNidGJsX2l0ZXIgeworCXN0cnVjdCBkbG1fcnNiICpyc2I7CisJdW5zaWduZWQgYnVja2V0OworCWludCBmb3JtYXQ7CisJaW50IGhlYWRlcjsKK307CisKKy8qIHNlcV9wcmludGYgcmV0dXJucyAtMSBpZiB0aGUgYnVmZmVyIGlzIGZ1bGwsIGFuZCAwIG90aGVyd2lzZS4KKyAgIElmIHRoZSBidWZmZXIgaXMgZnVsbCwgc2VxX3ByaW50ZiBjYW4gYmUgY2FsbGVkIGFnYWluLCBidXQgaXQKKyAgIGRvZXMgbm90aGluZyBhbmQganVzdCByZXR1cm5zIC0xLiAgU28sIHRoZSB0aGVzZSBwcmludGluZyByb3V0aW5lcworICAgcGVyaW9kaWNhbGx5IGNoZWNrIHRoZSByZXR1cm4gdmFsdWUgdG8gYXZvaWQgd2FzdGluZyB0b28gbXVjaCB0aW1lCisgICB0cnlpbmcgdG8gcHJpbnQgdG8gYSBmdWxsIGJ1ZmZlci4gKi8KKworc3RhdGljIGludCB0YWJsZV9zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqaXRlcl9wdHIpCiB7Ci0Jc3RydWN0IGRsbV9scyAqbHMgPSByaS0+bHM7Ci0JaW50IGk7Ci0KLQlpZiAoIXJpLT5uZXh0KSB7Ci0gdG9wOgotCQkvKiBGaW5kIHRoZSBuZXh0IG5vbi1lbXB0eSBoYXNoIGJ1Y2tldCAqLwotCQlmb3IgKGkgPSByaS0+ZW50cnk7IGkgPCBscy0+bHNfcnNidGJsX3NpemU7IGkrKykgewotCQkJcmVhZF9sb2NrKCZscy0+bHNfcnNidGJsW2ldLmxvY2spOwotCQkJaWYgKCFsaXN0X2VtcHR5KCZscy0+bHNfcnNidGJsW2ldLmxpc3QpKSB7Ci0JCQkJcmktPm5leHQgPSBscy0+bHNfcnNidGJsW2ldLmxpc3QubmV4dDsKLQkJCQlyaS0+cnNiID0gbGlzdF9lbnRyeShyaS0+bmV4dCwgc3RydWN0IGRsbV9yc2IsCi0JCQkJCQkJcmVzX2hhc2hjaGFpbik7Ci0JCQkJZGxtX2hvbGRfcnNiKHJpLT5yc2IpOwotCQkJCXJlYWRfdW5sb2NrKCZscy0+bHNfcnNidGJsW2ldLmxvY2spOwotCQkJCWJyZWFrOwotCQkJfQotCQkJcmVhZF91bmxvY2soJmxzLT5sc19yc2J0YmxbaV0ubG9jayk7Ci0JCX0KLQkJcmktPmVudHJ5ID0gaTsKLQotCQlpZiAocmktPmVudHJ5ID49IGxzLT5sc19yc2J0Ymxfc2l6ZSkKLQkJCXJldHVybiAxOwotCX0gZWxzZSB7Ci0JCXN0cnVjdCBkbG1fcnNiICpvbGQgPSByaS0+cnNiOwotCQlpID0gcmktPmVudHJ5OwotCQlyZWFkX2xvY2soJmxzLT5sc19yc2J0YmxbaV0ubG9jayk7Ci0JCXJpLT5uZXh0ID0gcmktPm5leHQtPm5leHQ7Ci0JCWlmIChyaS0+bmV4dC0+bmV4dCA9PSBscy0+bHNfcnNidGJsW2ldLmxpc3QubmV4dCkgewotCQkJLyogRW5kIG9mIGxpc3QgLSBtb3ZlIHRvIG5leHQgYnVja2V0ICovCi0JCQlyaS0+bmV4dCA9IE5VTEw7Ci0JCQlyaS0+ZW50cnkrKzsKLQkJCXJlYWRfdW5sb2NrKCZscy0+bHNfcnNidGJsW2ldLmxvY2spOwotCQkJZGxtX3B1dF9yc2Iob2xkKTsKLQkJCWdvdG8gdG9wOwotCQl9Ci0JCXJpLT5yc2IgPSBsaXN0X2VudHJ5KHJpLT5uZXh0LCBzdHJ1Y3QgZGxtX3JzYiwgcmVzX2hhc2hjaGFpbik7Ci0JCWRsbV9ob2xkX3JzYihyaS0+cnNiKTsKLQkJcmVhZF91bmxvY2soJmxzLT5sc19yc2J0YmxbaV0ubG9jayk7Ci0JCWRsbV9wdXRfcnNiKG9sZCk7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIHJzYl9pdGVyX2ZyZWUoc3RydWN0IHJzYl9pdGVyICpyaSkKLXsKLQlrZnJlZShyaSk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgcnNiX2l0ZXIgKnJzYl9pdGVyX2luaXQoc3RydWN0IGRsbV9scyAqbHMpCi17Ci0Jc3RydWN0IHJzYl9pdGVyICpyaTsKLQotCXJpID0ga3phbGxvYyhzaXplb2YgKnJpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXJpKQotCQlyZXR1cm4gTlVMTDsKLQotCXJpLT5scyA9IGxzOwotCXJpLT5lbnRyeSA9IDA7Ci0JcmktPm5leHQgPSBOVUxMOwotCXJpLT5mb3JtYXQgPSAxOwotCi0JaWYgKHJzYl9pdGVyX25leHQocmkpKSB7Ci0JCXJzYl9pdGVyX2ZyZWUocmkpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQlyZXR1cm4gcmk7Ci19Ci0KLXN0YXRpYyB2b2lkICpyc2Jfc2VxX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqZmlsZSwgbG9mZl90ICpwb3MpCi17Ci0Jc3RydWN0IHJzYl9pdGVyICpyaTsKLQlsb2ZmX3QgbiA9ICpwb3M7Ci0KLQlyaSA9IHJzYl9pdGVyX2luaXQoZmlsZS0+cHJpdmF0ZSk7Ci0JaWYgKCFyaSkKLQkJcmV0dXJuIE5VTEw7Ci0KLQl3aGlsZSAobi0tKSB7Ci0JCWlmIChyc2JfaXRlcl9uZXh0KHJpKSkgewotCQkJcnNiX2l0ZXJfZnJlZShyaSk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCX0KLQotCXJldHVybiByaTsKLX0KLQotc3RhdGljIHZvaWQgKnJzYl9zZXFfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKmZpbGUsIHZvaWQgKml0ZXJfcHRyLCBsb2ZmX3QgKnBvcykKLXsKLQlzdHJ1Y3QgcnNiX2l0ZXIgKnJpID0gaXRlcl9wdHI7Ci0KLQkoKnBvcykrKzsKLQotCWlmIChyc2JfaXRlcl9uZXh0KHJpKSkgewotCQlyc2JfaXRlcl9mcmVlKHJpKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0JcmV0dXJuIHJpOwotfQotCi1zdGF0aWMgdm9pZCByc2Jfc2VxX3N0b3Aoc3RydWN0IHNlcV9maWxlICpmaWxlLCB2b2lkICppdGVyX3B0cikKLXsKLQkvKiBub3RoaW5nIGZvciBub3cgKi8KLX0KLQotc3RhdGljIGludCByc2Jfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpmaWxlLCB2b2lkICppdGVyX3B0cikKLXsKLQlzdHJ1Y3QgcnNiX2l0ZXIgKnJpID0gaXRlcl9wdHI7CisJc3RydWN0IHJzYnRibF9pdGVyICpyaSA9IGl0ZXJfcHRyOworCWludCBydiA9IDA7CiAKIAlzd2l0Y2ggKHJpLT5mb3JtYXQpIHsKIAljYXNlIDE6Ci0JCXByaW50X2Zvcm1hdDEocmktPnJzYiwgZmlsZSk7CisJCXJ2ID0gcHJpbnRfZm9ybWF0MShyaS0+cnNiLCBzZXEpOwogCQlicmVhazsKIAljYXNlIDI6CiAJCWlmIChyaS0+aGVhZGVyKSB7Ci0JCQlzZXFfcHJpbnRmKGZpbGUsICJpZCBub2RlaWQgcmVtaWQgcGlkIHhpZCBleGZsYWdzICIKLQkJCQkJICJmbGFncyBzdHMgZ3Jtb2RlIHJxbW9kZSB0aW1lX21zICIKLQkJCQkJICJyX25vZGVpZCByX2xlbiByX25hbWVcbiIpOworCQkJc2VxX3ByaW50ZihzZXEsICJpZCBub2RlaWQgcmVtaWQgcGlkIHhpZCBleGZsYWdzICIKKwkJCQkJImZsYWdzIHN0cyBncm1vZGUgcnFtb2RlIHRpbWVfbXMgIgorCQkJCQkicl9ub2RlaWQgcl9sZW4gcl9uYW1lXG4iKTsKIAkJCXJpLT5oZWFkZXIgPSAwOwogCQl9Ci0JCXByaW50X2Zvcm1hdDIocmktPnJzYiwgZmlsZSk7CisJCXJ2ID0gcHJpbnRfZm9ybWF0MihyaS0+cnNiLCBzZXEpOwogCQlicmVhazsKIAljYXNlIDM6CiAJCWlmIChyaS0+aGVhZGVyKSB7Ci0JCQlzZXFfcHJpbnRmKGZpbGUsICJ2ZXJzaW9uIHJzYiAxLjEgbHZiIDEuMSBsa2IgMS4xXG4iKTsKKwkJCXNlcV9wcmludGYoc2VxLCAidmVyc2lvbiByc2IgMS4xIGx2YiAxLjEgbGtiIDEuMVxuIik7CiAJCQlyaS0+aGVhZGVyID0gMDsKIAkJfQotCQlwcmludF9mb3JtYXQzKHJpLT5yc2IsIGZpbGUpOworCQlydiA9IHByaW50X2Zvcm1hdDMocmktPnJzYiwgc2VxKTsKIAkJYnJlYWs7CiAJfQogCi0JcmV0dXJuIDA7CisJcmV0dXJuIHJ2OwogfQogCi1zdGF0aWMgc3RydWN0IHNlcV9vcGVyYXRpb25zIHJzYl9zZXFfb3BzID0gewotCS5zdGFydCA9IHJzYl9zZXFfc3RhcnQsCi0JLm5leHQgID0gcnNiX3NlcV9uZXh0LAotCS5zdG9wICA9IHJzYl9zZXFfc3RvcCwKLQkuc2hvdyAgPSByc2Jfc2VxX3Nob3csCitzdGF0aWMgc3RydWN0IHNlcV9vcGVyYXRpb25zIGZvcm1hdDFfc2VxX29wczsKK3N0YXRpYyBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgZm9ybWF0Ml9zZXFfb3BzOworc3RhdGljIHN0cnVjdCBzZXFfb3BlcmF0aW9ucyBmb3JtYXQzX3NlcV9vcHM7CisKK3N0YXRpYyB2b2lkICp0YWJsZV9zZXFfc3RhcnQoc3RydWN0IHNlcV9maWxlICpzZXEsIGxvZmZfdCAqcG9zKQoreworCXN0cnVjdCBkbG1fbHMgKmxzID0gc2VxLT5wcml2YXRlOworCXN0cnVjdCByc2J0YmxfaXRlciAqcmk7CisJc3RydWN0IGRsbV9yc2IgKnI7CisJbG9mZl90IG4gPSAqcG9zOworCXVuc2lnbmVkIGJ1Y2tldCwgZW50cnk7CisKKwlidWNrZXQgPSBuID4+IDMyOworCWVudHJ5ID0gbiAmICgoMUxMIDw8IDMyKSAtIDEpOworCisJaWYgKGJ1Y2tldCA+PSBscy0+bHNfcnNidGJsX3NpemUpCisJCXJldHVybiBOVUxMOworCisJcmkgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcnNidGJsX2l0ZXIpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXJpKQorCQlyZXR1cm4gTlVMTDsKKwlpZiAobiA9PSAwKQorCQlyaS0+aGVhZGVyID0gMTsKKwlpZiAoc2VxLT5vcCA9PSAmZm9ybWF0MV9zZXFfb3BzKQorCQlyaS0+Zm9ybWF0ID0gMTsKKwlpZiAoc2VxLT5vcCA9PSAmZm9ybWF0Ml9zZXFfb3BzKQorCQlyaS0+Zm9ybWF0ID0gMjsKKwlpZiAoc2VxLT5vcCA9PSAmZm9ybWF0M19zZXFfb3BzKQorCQlyaS0+Zm9ybWF0ID0gMzsKKworCXNwaW5fbG9jaygmbHMtPmxzX3JzYnRibFtidWNrZXRdLmxvY2spOworCWlmICghbGlzdF9lbXB0eSgmbHMtPmxzX3JzYnRibFtidWNrZXRdLmxpc3QpKSB7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkociwgJmxzLT5sc19yc2J0YmxbYnVja2V0XS5saXN0LAorCQkJCSAgICByZXNfaGFzaGNoYWluKSB7CisJCQlpZiAoIWVudHJ5LS0pIHsKKwkJCQlkbG1faG9sZF9yc2Iocik7CisJCQkJcmktPnJzYiA9IHI7CisJCQkJcmktPmJ1Y2tldCA9IGJ1Y2tldDsKKwkJCQlzcGluX3VubG9jaygmbHMtPmxzX3JzYnRibFtidWNrZXRdLmxvY2spOworCQkJCXJldHVybiByaTsKKwkJCX0KKwkJfQorCX0KKwlzcGluX3VubG9jaygmbHMtPmxzX3JzYnRibFtidWNrZXRdLmxvY2spOworCisJLyoKKwkgKiBtb3ZlIHRvIHRoZSBmaXJzdCByc2IgaW4gdGhlIG5leHQgbm9uLWVtcHR5IGJ1Y2tldAorCSAqLworCisJLyogemVybyB0aGUgZW50cnkgKi8KKwluICY9IH4oKDFMTCA8PCAzMikgLSAxKTsKKworCXdoaWxlICgxKSB7CisJCWJ1Y2tldCsrOworCQluICs9IDFMTCA8PCAzMjsKKworCQlpZiAoYnVja2V0ID49IGxzLT5sc19yc2J0Ymxfc2l6ZSkgeworCQkJa2ZyZWUocmkpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKworCQlzcGluX2xvY2soJmxzLT5sc19yc2J0YmxbYnVja2V0XS5sb2NrKTsKKwkJaWYgKCFsaXN0X2VtcHR5KCZscy0+bHNfcnNidGJsW2J1Y2tldF0ubGlzdCkpIHsKKwkJCXIgPSBsaXN0X2ZpcnN0X2VudHJ5KCZscy0+bHNfcnNidGJsW2J1Y2tldF0ubGlzdCwKKwkJCQkJICAgICBzdHJ1Y3QgZGxtX3JzYiwgcmVzX2hhc2hjaGFpbik7CisJCQlkbG1faG9sZF9yc2Iocik7CisJCQlyaS0+cnNiID0gcjsKKwkJCXJpLT5idWNrZXQgPSBidWNrZXQ7CisJCQlzcGluX3VubG9jaygmbHMtPmxzX3JzYnRibFtidWNrZXRdLmxvY2spOworCQkJKnBvcyA9IG47CisJCQlyZXR1cm4gcmk7CisJCX0KKwkJc3Bpbl91bmxvY2soJmxzLT5sc19yc2J0YmxbYnVja2V0XS5sb2NrKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkICp0YWJsZV9zZXFfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqaXRlcl9wdHIsIGxvZmZfdCAqcG9zKQoreworCXN0cnVjdCBkbG1fbHMgKmxzID0gc2VxLT5wcml2YXRlOworCXN0cnVjdCByc2J0YmxfaXRlciAqcmkgPSBpdGVyX3B0cjsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpuZXh0OworCXN0cnVjdCBkbG1fcnNiICpyLCAqcnA7CisJbG9mZl90IG4gPSAqcG9zOworCXVuc2lnbmVkIGJ1Y2tldDsKKworCWJ1Y2tldCA9IG4gPj4gMzI7CisKKwkvKgorCSAqIG1vdmUgdG8gdGhlIG5leHQgcnNiIGluIHRoZSBzYW1lIGJ1Y2tldAorCSAqLworCisJc3Bpbl9sb2NrKCZscy0+bHNfcnNidGJsW2J1Y2tldF0ubG9jayk7CisJcnAgPSByaS0+cnNiOworCW5leHQgPSBycC0+cmVzX2hhc2hjaGFpbi5uZXh0OworCisJaWYgKG5leHQgIT0gJmxzLT5sc19yc2J0YmxbYnVja2V0XS5saXN0KSB7CisJCXIgPSBsaXN0X2VudHJ5KG5leHQsIHN0cnVjdCBkbG1fcnNiLCByZXNfaGFzaGNoYWluKTsKKwkJZGxtX2hvbGRfcnNiKHIpOworCQlyaS0+cnNiID0gcjsKKwkJc3Bpbl91bmxvY2soJmxzLT5sc19yc2J0YmxbYnVja2V0XS5sb2NrKTsKKwkJZGxtX3B1dF9yc2IocnApOworCQkrKypwb3M7CisJCXJldHVybiByaTsKKwl9CisJc3Bpbl91bmxvY2soJmxzLT5sc19yc2J0YmxbYnVja2V0XS5sb2NrKTsKKwlkbG1fcHV0X3JzYihycCk7CisKKwkvKgorCSAqIG1vdmUgdG8gdGhlIGZpcnN0IHJzYiBpbiB0aGUgbmV4dCBub24tZW1wdHkgYnVja2V0CisJICovCisKKwkvKiB6ZXJvIHRoZSBlbnRyeSAqLworCW4gJj0gfigoMUxMIDw8IDMyKSAtIDEpOworCisJd2hpbGUgKDEpIHsKKwkJYnVja2V0Kys7CisJCW4gKz0gMUxMIDw8IDMyOworCisJCWlmIChidWNrZXQgPj0gbHMtPmxzX3JzYnRibF9zaXplKSB7CisJCQlrZnJlZShyaSk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCisJCXNwaW5fbG9jaygmbHMtPmxzX3JzYnRibFtidWNrZXRdLmxvY2spOworCQlpZiAoIWxpc3RfZW1wdHkoJmxzLT5sc19yc2J0YmxbYnVja2V0XS5saXN0KSkgeworCQkJciA9IGxpc3RfZmlyc3RfZW50cnkoJmxzLT5sc19yc2J0YmxbYnVja2V0XS5saXN0LAorCQkJCQkgICAgIHN0cnVjdCBkbG1fcnNiLCByZXNfaGFzaGNoYWluKTsKKwkJCWRsbV9ob2xkX3JzYihyKTsKKwkJCXJpLT5yc2IgPSByOworCQkJcmktPmJ1Y2tldCA9IGJ1Y2tldDsKKwkJCXNwaW5fdW5sb2NrKCZscy0+bHNfcnNidGJsW2J1Y2tldF0ubG9jayk7CisJCQkqcG9zID0gbjsKKwkJCXJldHVybiByaTsKKwkJfQorCQlzcGluX3VubG9jaygmbHMtPmxzX3JzYnRibFtidWNrZXRdLmxvY2spOworCX0KK30KKworc3RhdGljIHZvaWQgdGFibGVfc2VxX3N0b3Aoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKml0ZXJfcHRyKQoreworCXN0cnVjdCByc2J0YmxfaXRlciAqcmkgPSBpdGVyX3B0cjsKKworCWlmIChyaSkgeworCQlkbG1fcHV0X3JzYihyaS0+cnNiKTsKKwkJa2ZyZWUocmkpOworCX0KK30KKworc3RhdGljIHN0cnVjdCBzZXFfb3BlcmF0aW9ucyBmb3JtYXQxX3NlcV9vcHMgPSB7CisJLnN0YXJ0ID0gdGFibGVfc2VxX3N0YXJ0LAorCS5uZXh0ICA9IHRhYmxlX3NlcV9uZXh0LAorCS5zdG9wICA9IHRhYmxlX3NlcV9zdG9wLAorCS5zaG93ICA9IHRhYmxlX3NlcV9zaG93LAogfTsKIAotc3RhdGljIGludCByc2Jfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3N0YXRpYyBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgZm9ybWF0Ml9zZXFfb3BzID0geworCS5zdGFydCA9IHRhYmxlX3NlcV9zdGFydCwKKwkubmV4dCAgPSB0YWJsZV9zZXFfbmV4dCwKKwkuc3RvcCAgPSB0YWJsZV9zZXFfc3RvcCwKKwkuc2hvdyAgPSB0YWJsZV9zZXFfc2hvdywKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgZm9ybWF0M19zZXFfb3BzID0geworCS5zdGFydCA9IHRhYmxlX3NlcV9zdGFydCwKKwkubmV4dCAgPSB0YWJsZV9zZXFfbmV4dCwKKwkuc3RvcCAgPSB0YWJsZV9zZXFfc3RvcCwKKwkuc2hvdyAgPSB0YWJsZV9zZXFfc2hvdywKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGZvcm1hdDFfZm9wczsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGZvcm1hdDJfZm9wczsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGZvcm1hdDNfZm9wczsKKworc3RhdGljIGludCB0YWJsZV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQogewogCXN0cnVjdCBzZXFfZmlsZSAqc2VxOwotCWludCByZXQ7CisJaW50IHJldCA9IC0xOwogCi0JcmV0ID0gc2VxX29wZW4oZmlsZSwgJnJzYl9zZXFfb3BzKTsKKwlpZiAoZmlsZS0+Zl9vcCA9PSAmZm9ybWF0MV9mb3BzKQorCQlyZXQgPSBzZXFfb3BlbihmaWxlLCAmZm9ybWF0MV9zZXFfb3BzKTsKKwllbHNlIGlmIChmaWxlLT5mX29wID09ICZmb3JtYXQyX2ZvcHMpCisJCXJldCA9IHNlcV9vcGVuKGZpbGUsICZmb3JtYXQyX3NlcV9vcHMpOworCWVsc2UgaWYgKGZpbGUtPmZfb3AgPT0gJmZvcm1hdDNfZm9wcykKKwkJcmV0ID0gc2VxX29wZW4oZmlsZSwgJmZvcm1hdDNfc2VxX29wcyk7CisKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCiAJc2VxID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXNlcS0+cHJpdmF0ZSA9IGlub2RlLT5pX3ByaXZhdGU7Ci0KKwlzZXEtPnByaXZhdGUgPSBpbm9kZS0+aV9wcml2YXRlOyAvKiB0aGUgZGxtX2xzICovCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHJzYl9mb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZm9ybWF0MV9mb3BzID0gewogCS5vd25lciAgID0gVEhJU19NT0RVTEUsCi0JLm9wZW4gICAgPSByc2Jfb3BlbiwKKwkub3BlbiAgICA9IHRhYmxlX29wZW4sCiAJLnJlYWQgICAgPSBzZXFfcmVhZCwKIAkubGxzZWVrICA9IHNlcV9sc2VlaywKIAkucmVsZWFzZSA9IHNlcV9yZWxlYXNlCiB9OwogCi0vKgotICogRHVtcCBzdGF0ZSBpbiBjb21wYWN0IHBlci1sb2NrIGxpc3RpbmcKLSAqLwotCi1zdGF0aWMgc3RydWN0IHJzYl9pdGVyICpsb2Nrc19pdGVyX2luaXQoc3RydWN0IGRsbV9scyAqbHMsIGxvZmZfdCAqcG9zKQotewotCXN0cnVjdCByc2JfaXRlciAqcmk7Ci0KLQlyaSA9IGt6YWxsb2Moc2l6ZW9mICpyaSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFyaSkKLQkJcmV0dXJuIE5VTEw7Ci0KLQlyaS0+bHMgPSBsczsKLQlyaS0+ZW50cnkgPSAwOwotCXJpLT5uZXh0ID0gTlVMTDsKLQlyaS0+Zm9ybWF0ID0gMjsKLQotCWlmICgqcG9zID09IDApCi0JCXJpLT5oZWFkZXIgPSAxOwotCi0JaWYgKHJzYl9pdGVyX25leHQocmkpKSB7Ci0JCXJzYl9pdGVyX2ZyZWUocmkpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQlyZXR1cm4gcmk7Ci19Ci0KLXN0YXRpYyB2b2lkICpsb2Nrc19zZXFfc3RhcnQoc3RydWN0IHNlcV9maWxlICpmaWxlLCBsb2ZmX3QgKnBvcykKLXsKLQlzdHJ1Y3QgcnNiX2l0ZXIgKnJpOwotCWxvZmZfdCBuID0gKnBvczsKLQotCXJpID0gbG9ja3NfaXRlcl9pbml0KGZpbGUtPnByaXZhdGUsIHBvcyk7Ci0JaWYgKCFyaSkKLQkJcmV0dXJuIE5VTEw7Ci0KLQl3aGlsZSAobi0tKSB7Ci0JCWlmIChyc2JfaXRlcl9uZXh0KHJpKSkgewotCQkJcnNiX2l0ZXJfZnJlZShyaSk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCX0KLQotCXJldHVybiByaTsKLX0KLQotc3RhdGljIHN0cnVjdCBzZXFfb3BlcmF0aW9ucyBsb2Nrc19zZXFfb3BzID0gewotCS5zdGFydCA9IGxvY2tzX3NlcV9zdGFydCwKLQkubmV4dCAgPSByc2Jfc2VxX25leHQsCi0JLnN0b3AgID0gcnNiX3NlcV9zdG9wLAotCS5zaG93ICA9IHJzYl9zZXFfc2hvdywKLX07Ci0KLXN0YXRpYyBpbnQgbG9ja3Nfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcTsKLQlpbnQgcmV0OwotCi0JcmV0ID0gc2VxX29wZW4oZmlsZSwgJmxvY2tzX3NlcV9vcHMpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQlzZXEgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0Jc2VxLT5wcml2YXRlID0gaW5vZGUtPmlfcHJpdmF0ZTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBsb2Nrc19mb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZm9ybWF0Ml9mb3BzID0gewogCS5vd25lciAgID0gVEhJU19NT0RVTEUsCi0JLm9wZW4gICAgPSBsb2Nrc19vcGVuLAorCS5vcGVuICAgID0gdGFibGVfb3BlbiwKIAkucmVhZCAgICA9IHNlcV9yZWFkLAogCS5sbHNlZWsgID0gc2VxX2xzZWVrLAogCS5yZWxlYXNlID0gc2VxX3JlbGVhc2UKIH07CiAKLS8qCi0gKiBEdW1wIGFsbCByc2IvbHZiL2xrYiBzdGF0ZSBpbiBjb21wYWN0IGxpc3RpbmcsIG1vcmUgY29tcGxldGUgdGhhbiBfbG9ja3MKLSAqIFRoaXMgY2FuIHJlcGxhY2UgYm90aCBmb3JtYXRzIDEgYW5kIDIgZXZlbnR1YWxseS4KLSAqLwotCi1zdGF0aWMgc3RydWN0IHJzYl9pdGVyICphbGxfaXRlcl9pbml0KHN0cnVjdCBkbG1fbHMgKmxzLCBsb2ZmX3QgKnBvcykKLXsKLQlzdHJ1Y3QgcnNiX2l0ZXIgKnJpOwotCi0JcmkgPSBremFsbG9jKHNpemVvZiAqcmksIEdGUF9LRVJORUwpOwotCWlmICghcmkpCi0JCXJldHVybiBOVUxMOwotCi0JcmktPmxzID0gbHM7Ci0JcmktPmVudHJ5ID0gMDsKLQlyaS0+bmV4dCA9IE5VTEw7Ci0JcmktPmZvcm1hdCA9IDM7Ci0KLQlpZiAoKnBvcyA9PSAwKQotCQlyaS0+aGVhZGVyID0gMTsKLQotCWlmIChyc2JfaXRlcl9uZXh0KHJpKSkgewotCQlyc2JfaXRlcl9mcmVlKHJpKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0JcmV0dXJuIHJpOwotfQotCi1zdGF0aWMgdm9pZCAqYWxsX3NlcV9zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKmZpbGUsIGxvZmZfdCAqcG9zKQotewotCXN0cnVjdCByc2JfaXRlciAqcmk7Ci0JbG9mZl90IG4gPSAqcG9zOwotCi0JcmkgPSBhbGxfaXRlcl9pbml0KGZpbGUtPnByaXZhdGUsIHBvcyk7Ci0JaWYgKCFyaSkKLQkJcmV0dXJuIE5VTEw7Ci0KLQl3aGlsZSAobi0tKSB7Ci0JCWlmIChyc2JfaXRlcl9uZXh0KHJpKSkgewotCQkJcnNiX2l0ZXJfZnJlZShyaSk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCX0KLQotCXJldHVybiByaTsKLX0KLQotc3RhdGljIHN0cnVjdCBzZXFfb3BlcmF0aW9ucyBhbGxfc2VxX29wcyA9IHsKLQkuc3RhcnQgPSBhbGxfc2VxX3N0YXJ0LAotCS5uZXh0ICA9IHJzYl9zZXFfbmV4dCwKLQkuc3RvcCAgPSByc2Jfc2VxX3N0b3AsCi0JLnNob3cgID0gcnNiX3NlcV9zaG93LAotfTsKLQotc3RhdGljIGludCBhbGxfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcTsKLQlpbnQgcmV0OwotCi0JcmV0ID0gc2VxX29wZW4oZmlsZSwgJmFsbF9zZXFfb3BzKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCi0Jc2VxID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXNlcS0+cHJpdmF0ZSA9IGlub2RlLT5pX3ByaXZhdGU7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYWxsX2ZvcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBmb3JtYXQzX2ZvcHMgPSB7CiAJLm93bmVyICAgPSBUSElTX01PRFVMRSwKLQkub3BlbiAgICA9IGFsbF9vcGVuLAorCS5vcGVuICAgID0gdGFibGVfb3BlbiwKIAkucmVhZCAgICA9IHNlcV9yZWFkLAogCS5sbHNlZWsgID0gc2VxX2xzZWVrLAogCS5yZWxlYXNlID0gc2VxX3JlbGVhc2UKQEAgLTY4OSw3ICs2NjcsNyBAQAogCQkJCQkJICAgICAgU19JRlJFRyB8IFNfSVJVR08sCiAJCQkJCQkgICAgICBkbG1fcm9vdCwKIAkJCQkJCSAgICAgIGxzLAotCQkJCQkJICAgICAgJnJzYl9mb3BzKTsKKwkJCQkJCSAgICAgICZmb3JtYXQxX2ZvcHMpOwogCWlmICghbHMtPmxzX2RlYnVnX3JzYl9kZW50cnkpCiAJCWdvdG8gZmFpbDsKIApAQCAtNzAyLDcgKzY4MCw3IEBACiAJCQkJCQkJU19JRlJFRyB8IFNfSVJVR08sCiAJCQkJCQkJZGxtX3Jvb3QsCiAJCQkJCQkJbHMsCi0JCQkJCQkJJmxvY2tzX2ZvcHMpOworCQkJCQkJCSZmb3JtYXQyX2ZvcHMpOwogCWlmICghbHMtPmxzX2RlYnVnX2xvY2tzX2RlbnRyeSkKIAkJZ290byBmYWlsOwogCkBAIC03MTUsNyArNjkzLDcgQEAKIAkJCQkJCSAgICAgIFNfSUZSRUcgfCBTX0lSVUdPLAogCQkJCQkJICAgICAgZGxtX3Jvb3QsCiAJCQkJCQkgICAgICBscywKLQkJCQkJCSAgICAgICZhbGxfZm9wcyk7CisJCQkJCQkgICAgICAmZm9ybWF0M19mb3BzKTsKIAlpZiAoIWxzLT5sc19kZWJ1Z19hbGxfZGVudHJ5KQogCQlnb3RvIGZhaWw7CiAKZGlmZiAtLWdpdCBhL2ZzL2RsbS9kbG1faW50ZXJuYWwuaCBiL2ZzL2RsbS9kbG1faW50ZXJuYWwuaAppbmRleCBlZjJmMWUzLi4wNzZlODZmIDEwMDY0NAotLS0gYS9mcy9kbG0vZGxtX2ludGVybmFsLmgKKysrIGIvZnMvZGxtL2RsbV9pbnRlcm5hbC5oCkBAIC0xMDUsNyArMTA1LDcgQEAKIHN0cnVjdCBkbG1fcnNidGFibGUgewogCXN0cnVjdCBsaXN0X2hlYWQJbGlzdDsKIAlzdHJ1Y3QgbGlzdF9oZWFkCXRvc3M7Ci0Jcndsb2NrX3QJCWxvY2s7CisJc3BpbmxvY2tfdAkJbG9jazsKIH07CiAKIHN0cnVjdCBkbG1fbGtidGFibGUgewpkaWZmIC0tZ2l0IGEvZnMvZGxtL2xvY2suYyBiL2ZzL2RsbS9sb2NrLmMKaW5kZXggNmNmZTY1Yi4uMDFlN2QzOSAxMDA2NDQKLS0tIGEvZnMvZGxtL2xvY2suYworKysgYi9mcy9kbG0vbG9jay5jCkBAIC00MTIsOSArNDEyLDkgQEAKIAkJICAgICAgdW5zaWduZWQgaW50IGZsYWdzLCBzdHJ1Y3QgZGxtX3JzYiAqKnJfcmV0KQogewogCWludCBlcnJvcjsKLQl3cml0ZV9sb2NrKCZscy0+bHNfcnNidGJsW2JdLmxvY2spOworCXNwaW5fbG9jaygmbHMtPmxzX3JzYnRibFtiXS5sb2NrKTsKIAllcnJvciA9IF9zZWFyY2hfcnNiKGxzLCBuYW1lLCBsZW4sIGIsIGZsYWdzLCByX3JldCk7Ci0Jd3JpdGVfdW5sb2NrKCZscy0+bHNfcnNidGJsW2JdLmxvY2spOworCXNwaW5fdW5sb2NrKCZscy0+bHNfcnNidGJsW2JdLmxvY2spOwogCXJldHVybiBlcnJvcjsKIH0KIApAQCAtNDc4LDE2ICs0NzgsMTYgQEAKIAkJci0+cmVzX25vZGVpZCA9IG5vZGVpZDsKIAl9CiAKLQl3cml0ZV9sb2NrKCZscy0+bHNfcnNidGJsW2J1Y2tldF0ubG9jayk7CisJc3Bpbl9sb2NrKCZscy0+bHNfcnNidGJsW2J1Y2tldF0ubG9jayk7CiAJZXJyb3IgPSBfc2VhcmNoX3JzYihscywgbmFtZSwgbmFtZWxlbiwgYnVja2V0LCAwLCAmdG1wKTsKIAlpZiAoIWVycm9yKSB7Ci0JCXdyaXRlX3VubG9jaygmbHMtPmxzX3JzYnRibFtidWNrZXRdLmxvY2spOworCQlzcGluX3VubG9jaygmbHMtPmxzX3JzYnRibFtidWNrZXRdLmxvY2spOwogCQlkbG1fZnJlZV9yc2Iocik7CiAJCXIgPSB0bXA7CiAJCWdvdG8gb3V0OwogCX0KIAlsaXN0X2FkZCgmci0+cmVzX2hhc2hjaGFpbiwgJmxzLT5sc19yc2J0YmxbYnVja2V0XS5saXN0KTsKLQl3cml0ZV91bmxvY2soJmxzLT5sc19yc2J0YmxbYnVja2V0XS5sb2NrKTsKKwlzcGluX3VubG9jaygmbHMtPmxzX3JzYnRibFtidWNrZXRdLmxvY2spOwogCWVycm9yID0gMDsKICBvdXQ6CiAJKnJfcmV0ID0gcjsKQEAgLTUzMCw5ICs1MzAsOSBAQAogCXN0cnVjdCBkbG1fbHMgKmxzID0gci0+cmVzX2xzOwogCXVpbnQzMl90IGJ1Y2tldCA9IHItPnJlc19idWNrZXQ7CiAKLQl3cml0ZV9sb2NrKCZscy0+bHNfcnNidGJsW2J1Y2tldF0ubG9jayk7CisJc3Bpbl9sb2NrKCZscy0+bHNfcnNidGJsW2J1Y2tldF0ubG9jayk7CiAJa3JlZl9wdXQoJnItPnJlc19yZWYsIHRvc3NfcnNiKTsKLQl3cml0ZV91bmxvY2soJmxzLT5sc19yc2J0YmxbYnVja2V0XS5sb2NrKTsKKwlzcGluX3VubG9jaygmbHMtPmxzX3JzYnRibFtidWNrZXRdLmxvY2spOwogfQogCiB2b2lkIGRsbV9wdXRfcnNiKHN0cnVjdCBkbG1fcnNiICpyKQpAQCAtOTY3LDcgKzk2Nyw3IEBACiAKIAlmb3IgKDs7KSB7CiAJCWZvdW5kID0gMDsKLQkJd3JpdGVfbG9jaygmbHMtPmxzX3JzYnRibFtiXS5sb2NrKTsKKwkJc3Bpbl9sb2NrKCZscy0+bHNfcnNidGJsW2JdLmxvY2spOwogCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JldmVyc2UociwgJmxzLT5sc19yc2J0YmxbYl0udG9zcywKIAkJCQkJICAgIHJlc19oYXNoY2hhaW4pIHsKIAkJCWlmICghdGltZV9hZnRlcl9lcShqaWZmaWVzLCByLT5yZXNfdG9zc190aW1lICsKQEAgLTk3OCwyMCArOTc4LDIwIEBACiAJCX0KIAogCQlpZiAoIWZvdW5kKSB7Ci0JCQl3cml0ZV91bmxvY2soJmxzLT5sc19yc2J0YmxbYl0ubG9jayk7CisJCQlzcGluX3VubG9jaygmbHMtPmxzX3JzYnRibFtiXS5sb2NrKTsKIAkJCWJyZWFrOwogCQl9CiAKIAkJaWYgKGtyZWZfcHV0KCZyLT5yZXNfcmVmLCBraWxsX3JzYikpIHsKIAkJCWxpc3RfZGVsKCZyLT5yZXNfaGFzaGNoYWluKTsKLQkJCXdyaXRlX3VubG9jaygmbHMtPmxzX3JzYnRibFtiXS5sb2NrKTsKKwkJCXNwaW5fdW5sb2NrKCZscy0+bHNfcnNidGJsW2JdLmxvY2spOwogCiAJCQlpZiAoaXNfbWFzdGVyKHIpKQogCQkJCWRpcl9yZW1vdmUocik7CiAJCQlkbG1fZnJlZV9yc2Iocik7CiAJCQljb3VudCsrOwogCQl9IGVsc2UgewotCQkJd3JpdGVfdW5sb2NrKCZscy0+bHNfcnNidGJsW2JdLmxvY2spOworCQkJc3Bpbl91bmxvY2soJmxzLT5sc19yc2J0YmxbYl0ubG9jayk7CiAJCQlsb2dfZXJyb3IobHMsICJ0b3NzZWQgcnNiIGluIHVzZSAlcyIsIHItPnJlc19uYW1lKTsKIAkJfQogCX0KQEAgLTQyMjQsNyArNDIyNCw3IEBACiB7CiAJc3RydWN0IGRsbV9yc2IgKnIsICpyX3JldCA9IE5VTEw7CiAKLQlyZWFkX2xvY2soJmxzLT5sc19yc2J0YmxbYnVja2V0XS5sb2NrKTsKKwlzcGluX2xvY2soJmxzLT5sc19yc2J0YmxbYnVja2V0XS5sb2NrKTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KHIsICZscy0+bHNfcnNidGJsW2J1Y2tldF0ubGlzdCwgcmVzX2hhc2hjaGFpbikgewogCQlpZiAoIXJzYl9mbGFnKHIsIFJTQl9MT0NLU19QVVJHRUQpKQogCQkJY29udGludWU7CkBAIC00MjMzLDcgKzQyMzMsNyBAQAogCQlyX3JldCA9IHI7CiAJCWJyZWFrOwogCX0KLQlyZWFkX3VubG9jaygmbHMtPmxzX3JzYnRibFtidWNrZXRdLmxvY2spOworCXNwaW5fdW5sb2NrKCZscy0+bHNfcnNidGJsW2J1Y2tldF0ubG9jayk7CiAJcmV0dXJuIHJfcmV0OwogfQogCmRpZmYgLS1naXQgYS9mcy9kbG0vbG9ja3NwYWNlLmMgYi9mcy9kbG0vbG9ja3NwYWNlLmMKaW5kZXggOGQ4NmI3OS4uYWEzMmU1ZiAxMDA2NDQKLS0tIGEvZnMvZGxtL2xvY2tzcGFjZS5jCisrKyBiL2ZzL2RsbS9sb2Nrc3BhY2UuYwpAQCAtNDY0LDcgKzQ2NCw3IEBACiAJZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgewogCQlJTklUX0xJU1RfSEVBRCgmbHMtPmxzX3JzYnRibFtpXS5saXN0KTsKIAkJSU5JVF9MSVNUX0hFQUQoJmxzLT5sc19yc2J0YmxbaV0udG9zcyk7Ci0JCXJ3bG9ja19pbml0KCZscy0+bHNfcnNidGJsW2ldLmxvY2spOworCQlzcGluX2xvY2tfaW5pdCgmbHMtPmxzX3JzYnRibFtpXS5sb2NrKTsKIAl9CiAKIAlzaXplID0gZGxtX2NvbmZpZy5jaV9sa2J0Ymxfc2l6ZTsKZGlmZiAtLWdpdCBhL2ZzL2RsbS9yZWNvdmVyLmMgYi9mcy9kbG0vcmVjb3Zlci5jCmluZGV4IDgwYWJhNWIuLmVkYTQzZjMgMTAwNjQ0Ci0tLSBhL2ZzL2RsbS9yZWNvdmVyLmMKKysrIGIvZnMvZGxtL3JlY292ZXIuYwpAQCAtNzI2LDcgKzcyNiw3IEBACiAJfQogCiAJZm9yIChpID0gMDsgaSA8IGxzLT5sc19yc2J0Ymxfc2l6ZTsgaSsrKSB7Ci0JCXJlYWRfbG9jaygmbHMtPmxzX3JzYnRibFtpXS5sb2NrKTsKKwkJc3Bpbl9sb2NrKCZscy0+bHNfcnNidGJsW2ldLmxvY2spOwogCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHIsICZscy0+bHNfcnNidGJsW2ldLmxpc3QsIHJlc19oYXNoY2hhaW4pIHsKIAkJCWxpc3RfYWRkKCZyLT5yZXNfcm9vdF9saXN0LCAmbHMtPmxzX3Jvb3RfbGlzdCk7CiAJCQlkbG1faG9sZF9yc2Iocik7CkBAIC03MzcsNyArNzM3LDcgQEAKIAkJICAgYnV0IG5vIG90aGVyIHJlY292ZXJ5IHN0ZXBzIHNob3VsZCBkbyBhbnl0aGluZyB3aXRoIHRoZW0uICovCiAKIAkJaWYgKGRsbV9ub19kaXJlY3RvcnkobHMpKSB7Ci0JCQlyZWFkX3VubG9jaygmbHMtPmxzX3JzYnRibFtpXS5sb2NrKTsKKwkJCXNwaW5fdW5sb2NrKCZscy0+bHNfcnNidGJsW2ldLmxvY2spOwogCQkJY29udGludWU7CiAJCX0KIApAQCAtNzQ1LDcgKzc0NSw3IEBACiAJCQlsaXN0X2FkZCgmci0+cmVzX3Jvb3RfbGlzdCwgJmxzLT5sc19yb290X2xpc3QpOwogCQkJZGxtX2hvbGRfcnNiKHIpOwogCQl9Ci0JCXJlYWRfdW5sb2NrKCZscy0+bHNfcnNidGJsW2ldLmxvY2spOworCQlzcGluX3VubG9jaygmbHMtPmxzX3JzYnRibFtpXS5sb2NrKTsKIAl9CiAgb3V0OgogCXVwX3dyaXRlKCZscy0+bHNfcm9vdF9zZW0pOwpAQCAtNzc1LDcgKzc3NSw3IEBACiAJaW50IGk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgbHMtPmxzX3JzYnRibF9zaXplOyBpKyspIHsKLQkJd3JpdGVfbG9jaygmbHMtPmxzX3JzYnRibFtpXS5sb2NrKTsKKwkJc3Bpbl9sb2NrKCZscy0+bHNfcnNidGJsW2ldLmxvY2spOwogCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUociwgc2FmZSwgJmxzLT5sc19yc2J0YmxbaV0udG9zcywKIAkJCQkJIHJlc19oYXNoY2hhaW4pIHsKIAkJCWlmIChkbG1fbm9fZGlyZWN0b3J5KGxzKSB8fCAhaXNfbWFzdGVyKHIpKSB7CkBAIC03ODMsNyArNzgzLDcgQEAKIAkJCQlkbG1fZnJlZV9yc2Iocik7CiAJCQl9CiAJCX0KLQkJd3JpdGVfdW5sb2NrKCZscy0+bHNfcnNidGJsW2ldLmxvY2spOworCQlzcGluX3VubG9jaygmbHMtPmxzX3JzYnRibFtpXS5sb2NrKTsKIAl9CiB9CiAKZGlmZiAtLWdpdCBhL2ZzL2RxdW90LmMgYi9mcy9kcXVvdC5jCmluZGV4IDYxYmZmZjYuLjQ4YzA1NzEgMTAwNjQ0Ci0tLSBhL2ZzL2RxdW90LmMKKysrIGIvZnMvZHF1b3QuYwpAQCAtMjA5MCwxMCArMjA5MCwxMiBAQAogCX0KIAlpZiAoZGktPmRxYl92YWxpZCAmIFFJRl9CVElNRSkgewogCQlkbS0+ZHFiX2J0aW1lID0gZGktPmRxYl9idGltZTsKKwkJY2hlY2tfYmxpbSA9IDE7CiAJCV9fc2V0X2JpdChEUV9MQVNUU0VUX0IgKyBRSUZfQlRJTUVfQiwgJmRxdW90LT5kcV9mbGFncyk7CiAJfQogCWlmIChkaS0+ZHFiX3ZhbGlkICYgUUlGX0lUSU1FKSB7CiAJCWRtLT5kcWJfaXRpbWUgPSBkaS0+ZHFiX2l0aW1lOworCQljaGVja19pbGltID0gMTsKIAkJX19zZXRfYml0KERRX0xBU1RTRVRfQiArIFFJRl9JVElNRV9CLCAmZHF1b3QtPmRxX2ZsYWdzKTsKIAl9CiAKZGlmZiAtLWdpdCBhL2ZzL2V2ZW50ZmQuYyBiL2ZzL2V2ZW50ZmQuYwppbmRleCAwOGJmNTU4Li41ZGUyYzJkIDEwMDY0NAotLS0gYS9mcy9ldmVudGZkLmMKKysrIGIvZnMvZXZlbnRmZC5jCkBAIC0xOTgsNyArMTk4LDcgQEAKIAlyZXR1cm4gZmlsZTsKIH0KIAotYXNtbGlua2FnZSBsb25nIHN5c19ldmVudGZkMih1bnNpZ25lZCBpbnQgY291bnQsIGludCBmbGFncykKK1NZU0NBTExfREVGSU5FMihldmVudGZkMiwgdW5zaWduZWQgaW50LCBjb3VudCwgaW50LCBmbGFncykKIHsKIAlpbnQgZmQ7CiAJc3RydWN0IGV2ZW50ZmRfY3R4ICpjdHg7CkBAIC0yMjgsOCArMjI4LDcgQEAKIAlyZXR1cm4gZmQ7CiB9CiAKLWFzbWxpbmthZ2UgbG9uZyBzeXNfZXZlbnRmZCh1bnNpZ25lZCBpbnQgY291bnQpCitTWVNDQUxMX0RFRklORTEoZXZlbnRmZCwgdW5zaWduZWQgaW50LCBjb3VudCkKIHsKIAlyZXR1cm4gc3lzX2V2ZW50ZmQyKGNvdW50LCAwKTsKIH0KLQpkaWZmIC0tZ2l0IGEvZnMvZXZlbnRwb2xsLmMgYi9mcy9ldmVudHBvbGwuYwppbmRleCA5NjM1NWQ1Li5iYTJmOWVjIDEwMDY0NAotLS0gYS9mcy9ldmVudHBvbGwuYworKysgYi9mcy9ldmVudHBvbGwuYwpAQCAtMTExMCw3ICsxMTEwLDcgQEAKIC8qCiAgKiBPcGVuIGFuIGV2ZW50cG9sbCBmaWxlIGRlc2NyaXB0b3IuCiAgKi8KLWFzbWxpbmthZ2UgbG9uZyBzeXNfZXBvbGxfY3JlYXRlMShpbnQgZmxhZ3MpCitTWVNDQUxMX0RFRklORTEoZXBvbGxfY3JlYXRlMSwgaW50LCBmbGFncykKIHsKIAlpbnQgZXJyb3IsIGZkID0gLTE7CiAJc3RydWN0IGV2ZW50cG9sbCAqZXA7CkBAIC0xMTUwLDcgKzExNTAsNyBAQAogCXJldHVybiBmZDsKIH0KIAotYXNtbGlua2FnZSBsb25nIHN5c19lcG9sbF9jcmVhdGUoaW50IHNpemUpCitTWVNDQUxMX0RFRklORTEoZXBvbGxfY3JlYXRlLCBpbnQsIHNpemUpCiB7CiAJaWYgKHNpemUgPCAwKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTExNjMsOCArMTE2Myw4IEBACiAgKiB0aGUgZXZlbnRwb2xsIGZpbGUgdGhhdCBlbmFibGVzIHRoZSBpbnNlcnRpb24vcmVtb3ZhbC9jaGFuZ2Ugb2YKICAqIGZpbGUgZGVzY3JpcHRvcnMgaW5zaWRlIHRoZSBpbnRlcmVzdCBzZXQuCiAgKi8KLWFzbWxpbmthZ2UgbG9uZyBzeXNfZXBvbGxfY3RsKGludCBlcGZkLCBpbnQgb3AsIGludCBmZCwKLQkJCSAgICAgIHN0cnVjdCBlcG9sbF9ldmVudCBfX3VzZXIgKmV2ZW50KQorU1lTQ0FMTF9ERUZJTkU0KGVwb2xsX2N0bCwgaW50LCBlcGZkLCBpbnQsIG9wLCBpbnQsIGZkLAorCQlzdHJ1Y3QgZXBvbGxfZXZlbnQgX191c2VyICosIGV2ZW50KQogewogCWludCBlcnJvcjsKIAlzdHJ1Y3QgZmlsZSAqZmlsZSwgKnRmaWxlOwpAQCAtMTI2MSw4ICsxMjYxLDggQEAKICAqIEltcGxlbWVudCB0aGUgZXZlbnQgd2FpdCBpbnRlcmZhY2UgZm9yIHRoZSBldmVudHBvbGwgZmlsZS4gSXQgaXMgdGhlIGtlcm5lbAogICogcGFydCBvZiB0aGUgdXNlciBzcGFjZSBlcG9sbF93YWl0KDIpLgogICovCi1hc21saW5rYWdlIGxvbmcgc3lzX2Vwb2xsX3dhaXQoaW50IGVwZmQsIHN0cnVjdCBlcG9sbF9ldmVudCBfX3VzZXIgKmV2ZW50cywKLQkJCSAgICAgICBpbnQgbWF4ZXZlbnRzLCBpbnQgdGltZW91dCkKK1NZU0NBTExfREVGSU5FNChlcG9sbF93YWl0LCBpbnQsIGVwZmQsIHN0cnVjdCBlcG9sbF9ldmVudCBfX3VzZXIgKiwgZXZlbnRzLAorCQlpbnQsIG1heGV2ZW50cywgaW50LCB0aW1lb3V0KQogewogCWludCBlcnJvcjsKIAlzdHJ1Y3QgZmlsZSAqZmlsZTsKQEAgLTEzMTksOSArMTMxOSw5IEBACiAgKiBJbXBsZW1lbnQgdGhlIGV2ZW50IHdhaXQgaW50ZXJmYWNlIGZvciB0aGUgZXZlbnRwb2xsIGZpbGUuIEl0IGlzIHRoZSBrZXJuZWwKICAqIHBhcnQgb2YgdGhlIHVzZXIgc3BhY2UgZXBvbGxfcHdhaXQoMikuCiAgKi8KLWFzbWxpbmthZ2UgbG9uZyBzeXNfZXBvbGxfcHdhaXQoaW50IGVwZmQsIHN0cnVjdCBlcG9sbF9ldmVudCBfX3VzZXIgKmV2ZW50cywKLQkJaW50IG1heGV2ZW50cywgaW50IHRpbWVvdXQsIGNvbnN0IHNpZ3NldF90IF9fdXNlciAqc2lnbWFzaywKLQkJc2l6ZV90IHNpZ3NldHNpemUpCitTWVNDQUxMX0RFRklORTYoZXBvbGxfcHdhaXQsIGludCwgZXBmZCwgc3RydWN0IGVwb2xsX2V2ZW50IF9fdXNlciAqLCBldmVudHMsCisJCWludCwgbWF4ZXZlbnRzLCBpbnQsIHRpbWVvdXQsIGNvbnN0IHNpZ3NldF90IF9fdXNlciAqLCBzaWdtYXNrLAorCQlzaXplX3QsIHNpZ3NldHNpemUpCiB7CiAJaW50IGVycm9yOwogCXNpZ3NldF90IGtzaWdtYXNrLCBzaWdzYXZlZDsKZGlmZiAtLWdpdCBhL2ZzL2V4ZWMuYyBiL2ZzL2V4ZWMuYwppbmRleCA3MWE2ZWZlLi4wZGQ2MGEwIDEwMDY0NAotLS0gYS9mcy9leGVjLmMKKysrIGIvZnMvZXhlYy5jCkBAIC05OSw3ICs5OSw3IEBACiAgKgogICogQWxzbyBub3RlIHRoYXQgd2UgdGFrZSB0aGUgYWRkcmVzcyB0byBsb2FkIGZyb20gZnJvbSB0aGUgZmlsZSBpdHNlbGYuCiAgKi8KLWFzbWxpbmthZ2UgbG9uZyBzeXNfdXNlbGliKGNvbnN0IGNoYXIgX191c2VyICogbGlicmFyeSkKK1NZU0NBTExfREVGSU5FMSh1c2VsaWIsIGNvbnN0IGNoYXIgX191c2VyICosIGxpYnJhcnkpCiB7CiAJc3RydWN0IGZpbGUgKmZpbGU7CiAJc3RydWN0IG5hbWVpZGF0YSBuZDsKZGlmZiAtLWdpdCBhL2ZzL2V4dDIvZGlyLmMgYi9mcy9leHQyL2Rpci5jCmluZGV4IDlhMGZjNDAuLjI5OTlkNzIgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDIvZGlyLmMKKysrIGIvZnMvZXh0Mi9kaXIuYwpAQCAtOTUsMTAgKzk1LDEzIEBACiAJCW1hcmtfaW5vZGVfZGlydHkoZGlyKTsKIAl9CiAKLQlpZiAoSVNfRElSU1lOQyhkaXIpKQorCWlmIChJU19ESVJTWU5DKGRpcikpIHsKIAkJZXJyID0gd3JpdGVfb25lX3BhZ2UocGFnZSwgMSk7Ci0JZWxzZQorCQlpZiAoIWVycikKKwkJCWVyciA9IGV4dDJfc3luY19pbm9kZShkaXIpOworCX0gZWxzZSB7CiAJCXVubG9ja19wYWdlKHBhZ2UpOworCX0KIAogCXJldHVybiBlcnI7CiB9CmRpZmYgLS1naXQgYS9mcy9leHQyL2lhbGxvYy5jIGIvZnMvZXh0Mi9pYWxsb2MuYwppbmRleCBjNDU0ZDVkLi42NjMyMWE4IDEwMDY0NAotLS0gYS9mcy9leHQyL2lhbGxvYy5jCisrKyBiL2ZzL2V4dDIvaWFsbG9jLmMKQEAgLTU2NSwxMiArNTY1LDggQEAKIAlpbm9kZS0+aV9ibG9ja3MgPSAwOwogCWlub2RlLT5pX210aW1lID0gaW5vZGUtPmlfYXRpbWUgPSBpbm9kZS0+aV9jdGltZSA9IENVUlJFTlRfVElNRV9TRUM7CiAJbWVtc2V0KGVpLT5pX2RhdGEsIDAsIHNpemVvZihlaS0+aV9kYXRhKSk7Ci0JZWktPmlfZmxhZ3MgPSBFWFQyX0koZGlyKS0+aV9mbGFncyAmIH5FWFQyX0JUUkVFX0ZMOwotCWlmIChTX0lTTE5LKG1vZGUpKQotCQllaS0+aV9mbGFncyAmPSB+KEVYVDJfSU1NVVRBQkxFX0ZMfEVYVDJfQVBQRU5EX0ZMKTsKLQkvKiBkaXJzeW5jIGlzIG9ubHkgYXBwbGllZCB0byBkaXJlY3RvcmllcyAqLwotCWlmICghU19JU0RJUihtb2RlKSkKLQkJZWktPmlfZmxhZ3MgJj0gfkVYVDJfRElSU1lOQ19GTDsKKwllaS0+aV9mbGFncyA9CisJCWV4dDJfbWFza19mbGFncyhtb2RlLCBFWFQyX0koZGlyKS0+aV9mbGFncyAmIEVYVDJfRkxfSU5IRVJJVEVEKTsKIAllaS0+aV9mYWRkciA9IDA7CiAJZWktPmlfZnJhZ19ubyA9IDA7CiAJZWktPmlfZnJhZ19zaXplID0gMDsKZGlmZiAtLWdpdCBhL2ZzL2V4dDIvaW5vZGUuYyBiL2ZzL2V4dDIvaW5vZGUuYwppbmRleCAwMmIzOWE1Li4yM2ZmZjJmIDEwMDY0NAotLS0gYS9mcy9leHQyL2lub2RlLmMKKysrIGIvZnMvZXh0Mi9pbm9kZS5jCkBAIC00OTgsOCArNDk4LDYgQEAKICAqIGV4dDJfc3BsaWNlX2JyYW5jaCAtIHNwbGljZSB0aGUgYWxsb2NhdGVkIGJyYW5jaCBvbnRvIGlub2RlLgogICogQGlub2RlOiBvd25lcgogICogQGJsb2NrOiAobG9naWNhbCkgbnVtYmVyIG9mIGJsb2NrIHdlIGFyZSBhZGRpbmcKLSAqIEBjaGFpbjogY2hhaW4gb2YgaW5kaXJlY3QgYmxvY2tzICh3aXRoIGEgbWlzc2luZyBsaW5rIC0gc2VlCi0gKglleHQyX2FsbG9jX2JyYW5jaCkKICAqIEB3aGVyZTogbG9jYXRpb24gb2YgbWlzc2luZyBsaW5rCiAgKiBAbnVtOiAgIG51bWJlciBvZiBpbmRpcmVjdCBibG9ja3Mgd2UgYXJlIGFkZGluZwogICogQGJsa3M6ICBudW1iZXIgb2YgZGlyZWN0IGJsb2NrcyB3ZSBhcmUgYWRkaW5nCmRpZmYgLS1naXQgYS9mcy9leHQyL2lvY3RsLmMgYi9mcy9leHQyL2lvY3RsLmMKaW5kZXggZGU4NzZmYS4uN2NiNGJhZCAxMDA2NDQKLS0tIGEvZnMvZXh0Mi9pb2N0bC5jCisrKyBiL2ZzL2V4dDIvaW9jdGwuYwpAQCAtNTAsOCArNTAsNyBAQAogCQkJZ290byBzZXRmbGFnc19vdXQ7CiAJCX0KIAotCQlpZiAoIVNfSVNESVIoaW5vZGUtPmlfbW9kZSkpCi0JCQlmbGFncyAmPSB+RVhUMl9ESVJTWU5DX0ZMOworCQlmbGFncyA9IGV4dDJfbWFza19mbGFncyhpbm9kZS0+aV9tb2RlLCBmbGFncyk7CiAKIAkJbXV0ZXhfbG9jaygmaW5vZGUtPmlfbXV0ZXgpOwogCQkvKiBJcyBpdCBxdW90YSBmaWxlPyBEbyBub3QgYWxsb3cgdXNlciB0byBtZXNzIHdpdGggaXQgKi8KZGlmZiAtLWdpdCBhL2ZzL2V4dDIvc3VwZXIuYyBiL2ZzL2V4dDIvc3VwZXIuYwppbmRleCA2NDdjZDg4Li5kYThiZGVhIDEwMDY0NAotLS0gYS9mcy9leHQyL3N1cGVyLmMKKysrIGIvZnMvZXh0Mi9zdXBlci5jCkBAIC0xMzIsNiArMTMyLDcgQEAKIAlwZXJjcHVfY291bnRlcl9kZXN0cm95KCZzYmktPnNfZGlyc19jb3VudGVyKTsKIAlicmVsc2UgKHNiaS0+c19zYmgpOwogCXNiLT5zX2ZzX2luZm8gPSBOVUxMOworCWtmcmVlKHNiaS0+c19ibG9ja2dyb3VwX2xvY2spOwogCWtmcmVlKHNiaSk7CiAKIAlyZXR1cm47CkBAIC03NTYsNiArNzU3LDEzIEBACiAJc2JpID0ga3phbGxvYyhzaXplb2YoKnNiaSksIEdGUF9LRVJORUwpOwogCWlmICghc2JpKQogCQlyZXR1cm4gLUVOT01FTTsKKworCXNiaS0+c19ibG9ja2dyb3VwX2xvY2sgPQorCQlremFsbG9jKHNpemVvZihzdHJ1Y3QgYmxvY2tncm91cF9sb2NrKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzYmktPnNfYmxvY2tncm91cF9sb2NrKSB7CisJCWtmcmVlKHNiaSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KIAlzYi0+c19mc19pbmZvID0gc2JpOwogCXNiaS0+c19zYl9ibG9jayA9IHNiX2Jsb2NrOwogCkBAIC05ODMsNyArOTkxLDcgQEAKIAkJcHJpbnRrICgiRVhUMi1mczogbm90IGVub3VnaCBtZW1vcnlcbiIpOwogCQlnb3RvIGZhaWxlZF9tb3VudDsKIAl9Ci0JYmdsX2xvY2tfaW5pdCgmc2JpLT5zX2Jsb2NrZ3JvdXBfbG9jayk7CisJYmdsX2xvY2tfaW5pdChzYmktPnNfYmxvY2tncm91cF9sb2NrKTsKIAlzYmktPnNfZGVidHMgPSBrY2FsbG9jKHNiaS0+c19ncm91cHNfY291bnQsIHNpemVvZigqc2JpLT5zX2RlYnRzKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFzYmktPnNfZGVidHMpIHsKIAkJcHJpbnRrICgiRVhUMi1mczogbm90IGVub3VnaCBtZW1vcnlcbiIpOwpkaWZmIC0tZ2l0IGEvZnMvZXh0My9oYXNoLmMgYi9mcy9leHQzL2hhc2guYwppbmRleCBjMzBlMTQ5Li43ZDIxNWI0IDEwMDY0NAotLS0gYS9mcy9leHQzL2hhc2guYworKysgYi9mcy9leHQzL2hhc2guYwpAQCAtMzUsMjMgKzM1LDcxIEBACiAKIAogLyogVGhlIG9sZCBsZWdhY3kgaGFzaCAqLwotc3RhdGljIF9fdTMyIGR4X2hhY2tfaGFzaCAoY29uc3QgY2hhciAqbmFtZSwgaW50IGxlbikKK3N0YXRpYyBfX3UzMiBkeF9oYWNrX2hhc2hfdW5zaWduZWQoY29uc3QgY2hhciAqbmFtZSwgaW50IGxlbikKIHsKLQlfX3UzMiBoYXNoMCA9IDB4MTJhM2ZlMmQsIGhhc2gxID0gMHgzN2FiZThmOTsKLQl3aGlsZSAobGVuLS0pIHsKLQkJX191MzIgaGFzaCA9IGhhc2gxICsgKGhhc2gwIF4gKCpuYW1lKysgKiA3MTUyMzczKSk7CisJX191MzIgaGFzaCwgaGFzaDAgPSAweDEyYTNmZTJkLCBoYXNoMSA9IDB4MzdhYmU4Zjk7CisJY29uc3QgdW5zaWduZWQgY2hhciAqdWNwID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikgbmFtZTsKIAotCQlpZiAoaGFzaCAmIDB4ODAwMDAwMDApIGhhc2ggLT0gMHg3ZmZmZmZmZjsKKwl3aGlsZSAobGVuLS0pIHsKKwkJaGFzaCA9IGhhc2gxICsgKGhhc2gwIF4gKCgoaW50KSAqdWNwKyspICogNzE1MjM3MykpOworCisJCWlmIChoYXNoICYgMHg4MDAwMDAwMCkKKwkJCWhhc2ggLT0gMHg3ZmZmZmZmZjsKIAkJaGFzaDEgPSBoYXNoMDsKIAkJaGFzaDAgPSBoYXNoOwogCX0KLQlyZXR1cm4gKGhhc2gwIDw8IDEpOworCXJldHVybiBoYXNoMCA8PCAxOwogfQogCi1zdGF0aWMgdm9pZCBzdHIyaGFzaGJ1Zihjb25zdCBjaGFyICptc2csIGludCBsZW4sIF9fdTMyICpidWYsIGludCBudW0pCitzdGF0aWMgX191MzIgZHhfaGFja19oYXNoX3NpZ25lZChjb25zdCBjaGFyICpuYW1lLCBpbnQgbGVuKQoreworCV9fdTMyIGhhc2gsIGhhc2gwID0gMHgxMmEzZmUyZCwgaGFzaDEgPSAweDM3YWJlOGY5OworCWNvbnN0IHNpZ25lZCBjaGFyICpzY3AgPSAoY29uc3Qgc2lnbmVkIGNoYXIgKikgbmFtZTsKKworCXdoaWxlIChsZW4tLSkgeworCQloYXNoID0gaGFzaDEgKyAoaGFzaDAgXiAoKChpbnQpICpzY3ArKykgKiA3MTUyMzczKSk7CisKKwkJaWYgKGhhc2ggJiAweDgwMDAwMDAwKQorCQkJaGFzaCAtPSAweDdmZmZmZmZmOworCQloYXNoMSA9IGhhc2gwOworCQloYXNoMCA9IGhhc2g7CisJfQorCXJldHVybiBoYXNoMCA8PCAxOworfQorCitzdGF0aWMgdm9pZCBzdHIyaGFzaGJ1Zl9zaWduZWQoY29uc3QgY2hhciAqbXNnLCBpbnQgbGVuLCBfX3UzMiAqYnVmLCBpbnQgbnVtKQogewogCV9fdTMyCXBhZCwgdmFsOwogCWludAlpOworCWNvbnN0IHNpZ25lZCBjaGFyICpzY3AgPSAoY29uc3Qgc2lnbmVkIGNoYXIgKikgbXNnOworCisJcGFkID0gKF9fdTMyKWxlbiB8ICgoX191MzIpbGVuIDw8IDgpOworCXBhZCB8PSBwYWQgPDwgMTY7CisKKwl2YWwgPSBwYWQ7CisJaWYgKGxlbiA+IG51bSo0KQorCQlsZW4gPSBudW0gKiA0OworCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworCQlpZiAoKGkgJSA0KSA9PSAwKQorCQkJdmFsID0gcGFkOworCQl2YWwgPSAoKGludCkgc2NwW2ldKSArICh2YWwgPDwgOCk7CisJCWlmICgoaSAlIDQpID09IDMpIHsKKwkJCSpidWYrKyA9IHZhbDsKKwkJCXZhbCA9IHBhZDsKKwkJCW51bS0tOworCQl9CisJfQorCWlmICgtLW51bSA+PSAwKQorCQkqYnVmKysgPSB2YWw7CisJd2hpbGUgKC0tbnVtID49IDApCisJCSpidWYrKyA9IHBhZDsKK30KKworc3RhdGljIHZvaWQgc3RyMmhhc2hidWZfdW5zaWduZWQoY29uc3QgY2hhciAqbXNnLCBpbnQgbGVuLCBfX3UzMiAqYnVmLCBpbnQgbnVtKQoreworCV9fdTMyCXBhZCwgdmFsOworCWludAlpOworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnVjcCA9IChjb25zdCB1bnNpZ25lZCBjaGFyICopIG1zZzsKIAogCXBhZCA9IChfX3UzMilsZW4gfCAoKF9fdTMyKWxlbiA8PCA4KTsKIAlwYWQgfD0gcGFkIDw8IDE2OwpAQCAtNjIsNyArMTEwLDcgQEAKIAlmb3IgKGk9MDsgaSA8IGxlbjsgaSsrKSB7CiAJCWlmICgoaSAlIDQpID09IDApCiAJCQl2YWwgPSBwYWQ7Ci0JCXZhbCA9IG1zZ1tpXSArICh2YWwgPDwgOCk7CisJCXZhbCA9ICgoaW50KSB1Y3BbaV0pICsgKHZhbCA8PCA4KTsKIAkJaWYgKChpICUgNCkgPT0gMykgewogCQkJKmJ1ZisrID0gdmFsOwogCQkJdmFsID0gcGFkOwpAQCAtOTUsNiArMTQzLDggQEAKIAljb25zdCBjaGFyCSpwOwogCWludAkJaTsKIAlfX3UzMgkJaW5bOF0sIGJ1Zls0XTsKKwl2b2lkCQkoKnN0cjJoYXNoYnVmKShjb25zdCBjaGFyICosIGludCwgX191MzIgKiwgaW50KSA9CisJCQkJc3RyMmhhc2hidWZfc2lnbmVkOwogCiAJLyogSW5pdGlhbGl6ZSB0aGUgZGVmYXVsdCBzZWVkIGZvciB0aGUgaGFzaCBjaGVja3N1bSBmdW5jdGlvbnMgKi8KIAlidWZbMF0gPSAweDY3NDUyMzAxOwpAQCAtMTEzLDEzICsxNjMsMTggQEAKIAl9CiAKIAlzd2l0Y2ggKGhpbmZvLT5oYXNoX3ZlcnNpb24pIHsKLQljYXNlIERYX0hBU0hfTEVHQUNZOgotCQloYXNoID0gZHhfaGFja19oYXNoKG5hbWUsIGxlbik7CisJY2FzZSBEWF9IQVNIX0xFR0FDWV9VTlNJR05FRDoKKwkJaGFzaCA9IGR4X2hhY2tfaGFzaF91bnNpZ25lZChuYW1lLCBsZW4pOwogCQlicmVhazsKKwljYXNlIERYX0hBU0hfTEVHQUNZOgorCQloYXNoID0gZHhfaGFja19oYXNoX3NpZ25lZChuYW1lLCBsZW4pOworCQlicmVhazsKKwljYXNlIERYX0hBU0hfSEFMRl9NRDRfVU5TSUdORUQ6CisJCXN0cjJoYXNoYnVmID0gc3RyMmhhc2hidWZfdW5zaWduZWQ7CiAJY2FzZSBEWF9IQVNIX0hBTEZfTUQ0OgogCQlwID0gbmFtZTsKIAkJd2hpbGUgKGxlbiA+IDApIHsKLQkJCXN0cjJoYXNoYnVmKHAsIGxlbiwgaW4sIDgpOworCQkJKCpzdHIyaGFzaGJ1ZikocCwgbGVuLCBpbiwgOCk7CiAJCQloYWxmX21kNF90cmFuc2Zvcm0oYnVmLCBpbik7CiAJCQlsZW4gLT0gMzI7CiAJCQlwICs9IDMyOwpAQCAtMTI3LDEwICsxODIsMTIgQEAKIAkJbWlub3JfaGFzaCA9IGJ1ZlsyXTsKIAkJaGFzaCA9IGJ1ZlsxXTsKIAkJYnJlYWs7CisJY2FzZSBEWF9IQVNIX1RFQV9VTlNJR05FRDoKKwkJc3RyMmhhc2hidWYgPSBzdHIyaGFzaGJ1Zl91bnNpZ25lZDsKIAljYXNlIERYX0hBU0hfVEVBOgogCQlwID0gbmFtZTsKIAkJd2hpbGUgKGxlbiA+IDApIHsKLQkJCXN0cjJoYXNoYnVmKHAsIGxlbiwgaW4sIDQpOworCQkJKCpzdHIyaGFzaGJ1ZikocCwgbGVuLCBpbiwgNCk7CiAJCQlURUFfdHJhbnNmb3JtKGJ1ZiwgaW4pOwogCQkJbGVuIC09IDE2OwogCQkJcCArPSAxNjsKZGlmZiAtLWdpdCBhL2ZzL2V4dDMvaWFsbG9jLmMgYi9mcy9leHQzL2lhbGxvYy5jCmluZGV4IDU2NTVmYmMuLjhkZTZjNzIgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDMvaWFsbG9jLmMKKysrIGIvZnMvZXh0My9pYWxsb2MuYwpAQCAtNTU5LDEyICs1NTksOCBAQAogCWVpLT5pX2Rpcl9zdGFydF9sb29rdXAgPSAwOwogCWVpLT5pX2Rpc2tzaXplID0gMDsKIAotCWVpLT5pX2ZsYWdzID0gRVhUM19JKGRpciktPmlfZmxhZ3MgJiB+RVhUM19JTkRFWF9GTDsKLQlpZiAoU19JU0xOSyhtb2RlKSkKLQkJZWktPmlfZmxhZ3MgJj0gfihFWFQzX0lNTVVUQUJMRV9GTHxFWFQzX0FQUEVORF9GTCk7Ci0JLyogZGlyc3luYyBvbmx5IGFwcGxpZXMgdG8gZGlyZWN0b3JpZXMgKi8KLQlpZiAoIVNfSVNESVIobW9kZSkpCi0JCWVpLT5pX2ZsYWdzICY9IH5FWFQzX0RJUlNZTkNfRkw7CisJZWktPmlfZmxhZ3MgPQorCQlleHQzX21hc2tfZmxhZ3MobW9kZSwgRVhUM19JKGRpciktPmlfZmxhZ3MgJiBFWFQzX0ZMX0lOSEVSSVRFRCk7CiAjaWZkZWYgRVhUM19GUkFHTUVOVFMKIAllaS0+aV9mYWRkciA9IDA7CiAJZWktPmlfZnJhZ19ubyA9IDA7CmRpZmYgLS1naXQgYS9mcy9leHQzL2lvY3RsLmMgYi9mcy9leHQzL2lvY3RsLmMKaW5kZXggYjczOTRkMC4uNWU4NmNlOSAxMDA2NDQKLS0tIGEvZnMvZXh0My9pb2N0bC5jCisrKyBiL2ZzL2V4dDMvaW9jdGwuYwpAQCAtNTMsOCArNTMsNyBAQAogCQkJZ290byBmbGFnc19vdXQ7CiAJCX0KIAotCQlpZiAoIVNfSVNESVIoaW5vZGUtPmlfbW9kZSkpCi0JCQlmbGFncyAmPSB+RVhUM19ESVJTWU5DX0ZMOworCQlmbGFncyA9IGV4dDNfbWFza19mbGFncyhpbm9kZS0+aV9tb2RlLCBmbGFncyk7CiAKIAkJbXV0ZXhfbG9jaygmaW5vZGUtPmlfbXV0ZXgpOwogCQkvKiBJcyBpdCBxdW90YSBmaWxlPyBEbyBub3QgYWxsb3cgdXNlciB0byBtZXNzIHdpdGggaXQgKi8KZGlmZiAtLWdpdCBhL2ZzL2V4dDMvbmFtZWkuYyBiL2ZzL2V4dDMvbmFtZWkuYwppbmRleCAxZGQyYWJlLi42OWEzZDE5IDEwMDY0NAotLS0gYS9mcy9leHQzL25hbWVpLmMKKysrIGIvZnMvZXh0My9uYW1laS5jCkBAIC03NCwxMCArNzQsNiBAQAogI2RlZmluZSBhc3NlcnQodGVzdCkgSl9BU1NFUlQodGVzdCkKICNlbmRpZgogCi0jaWZuZGVmIHN3YXAKLSNkZWZpbmUgc3dhcCh4LCB5KSBkbyB7IHR5cGVvZih4KSB6ID0geDsgeCA9IHk7IHkgPSB6OyB9IHdoaWxlICgwKQotI2VuZGlmCi0KICNpZmRlZiBEWF9ERUJVRwogI2RlZmluZSBkeHRyYWNlKGNvbW1hbmQpIGNvbW1hbmQKICNlbHNlCkBAIC0zNjgsNiArMzY0LDggQEAKIAkJZ290byBmYWlsOwogCX0KIAloaW5mby0+aGFzaF92ZXJzaW9uID0gcm9vdC0+aW5mby5oYXNoX3ZlcnNpb247CisJaWYgKGhpbmZvLT5oYXNoX3ZlcnNpb24gPD0gRFhfSEFTSF9URUEpCisJCWhpbmZvLT5oYXNoX3ZlcnNpb24gKz0gRVhUM19TQihkaXItPmlfc2IpLT5zX2hhc2hfdW5zaWduZWQ7CiAJaGluZm8tPnNlZWQgPSBFWFQzX1NCKGRpci0+aV9zYiktPnNfaGFzaF9zZWVkOwogCWlmIChlbnRyeSkKIAkJZXh0M2ZzX2Rpcmhhc2goZW50cnktPm5hbWUsIGVudHJ5LT5sZW4sIGhpbmZvKTsKQEAgLTYzNiw2ICs2MzQsOSBAQAogCWRpciA9IGRpcl9maWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOwogCWlmICghKEVYVDNfSShkaXIpLT5pX2ZsYWdzICYgRVhUM19JTkRFWF9GTCkpIHsKIAkJaGluZm8uaGFzaF92ZXJzaW9uID0gRVhUM19TQihkaXItPmlfc2IpLT5zX2RlZl9oYXNoX3ZlcnNpb247CisJCWlmIChoaW5mby5oYXNoX3ZlcnNpb24gPD0gRFhfSEFTSF9URUEpCisJCQloaW5mby5oYXNoX3ZlcnNpb24gKz0KKwkJCQlFWFQzX1NCKGRpci0+aV9zYiktPnNfaGFzaF91bnNpZ25lZDsKIAkJaGluZm8uc2VlZCA9IEVYVDNfU0IoZGlyLT5pX3NiKS0+c19oYXNoX3NlZWQ7CiAJCWNvdW50ID0gaHRyZWVfZGlyYmxvY2tfdG9fdHJlZShkaXJfZmlsZSwgZGlyLCAwLCAmaGluZm8sCiAJCQkJCSAgICAgICBzdGFydF9oYXNoLCBzdGFydF9taW5vcl9oYXNoKTsKQEAgLTExNTYsOSArMTE1Nyw5IEBACiAJdTMyIGhhc2gyOwogCXN0cnVjdCBkeF9tYXBfZW50cnkgKm1hcDsKIAljaGFyICpkYXRhMSA9ICgqYmgpLT5iX2RhdGEsICpkYXRhMjsKLQl1bnNpZ25lZCBzcGxpdCwgbW92ZSwgc2l6ZSwgaTsKKwl1bnNpZ25lZCBzcGxpdCwgbW92ZSwgc2l6ZTsKIAlzdHJ1Y3QgZXh0M19kaXJfZW50cnlfMiAqZGUgPSBOVUxMLCAqZGUyOwotCWludAllcnIgPSAwOworCWludAllcnIgPSAwLCBpOwogCiAJYmgyID0gZXh0M19hcHBlbmQgKGhhbmRsZSwgZGlyLCAmbmV3YmxvY2ssICZlcnIpOwogCWlmICghKGJoMikpIHsKQEAgLTEzOTgsNiArMTM5OSw4IEBACiAKIAkvKiBJbml0aWFsaXplIGFzIGZvciBkeF9wcm9iZSAqLwogCWhpbmZvLmhhc2hfdmVyc2lvbiA9IHJvb3QtPmluZm8uaGFzaF92ZXJzaW9uOworCWlmIChoaW5mby5oYXNoX3ZlcnNpb24gPD0gRFhfSEFTSF9URUEpCisJCWhpbmZvLmhhc2hfdmVyc2lvbiArPSBFWFQzX1NCKGRpci0+aV9zYiktPnNfaGFzaF91bnNpZ25lZDsKIAloaW5mby5zZWVkID0gRVhUM19TQihkaXItPmlfc2IpLT5zX2hhc2hfc2VlZDsKIAlleHQzZnNfZGlyaGFzaChuYW1lLCBuYW1lbGVuLCAmaGluZm8pOwogCWZyYW1lID0gZnJhbWVzOwpkaWZmIC0tZ2l0IGEvZnMvZXh0My9zdXBlci5jIGIvZnMvZXh0My9zdXBlci5jCmluZGV4IGMyMmQwMTQuLmI3MGQ5MGUgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDMvc3VwZXIuYworKysgYi9mcy9leHQzL3N1cGVyLmMKQEAgLTQ4LDggKzQ4LDggQEAKIAkJCSAgICAgdW5zaWduZWQgbG9uZyBqb3VybmFsX2Rldm51bSk7CiBzdGF0aWMgaW50IGV4dDNfY3JlYXRlX2pvdXJuYWwoc3RydWN0IHN1cGVyX2Jsb2NrICosIHN0cnVjdCBleHQzX3N1cGVyX2Jsb2NrICosCiAJCQkgICAgICAgdW5zaWduZWQgaW50KTsKLXN0YXRpYyB2b2lkIGV4dDNfY29tbWl0X3N1cGVyIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYiwKLQkJCSAgICAgICBzdHJ1Y3QgZXh0M19zdXBlcl9ibG9jayAqIGVzLAorc3RhdGljIGludCBleHQzX2NvbW1pdF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAorCQkJICAgICAgIHN0cnVjdCBleHQzX3N1cGVyX2Jsb2NrICplcywKIAkJCSAgICAgICBpbnQgc3luYyk7CiBzdGF0aWMgdm9pZCBleHQzX21hcmtfcmVjb3ZlcnlfY29tcGxldGUoc3RydWN0IHN1cGVyX2Jsb2NrICogc2IsCiAJCQkJCXN0cnVjdCBleHQzX3N1cGVyX2Jsb2NrICogZXMpOwpAQCAtNjAsOSArNjAsOSBAQAogCQkJCSAgICAgY2hhciBuYnVmWzE2XSk7CiBzdGF0aWMgaW50IGV4dDNfcmVtb3VudCAoc3RydWN0IHN1cGVyX2Jsb2NrICogc2IsIGludCAqIGZsYWdzLCBjaGFyICogZGF0YSk7CiBzdGF0aWMgaW50IGV4dDNfc3RhdGZzIChzdHJ1Y3QgZGVudHJ5ICogZGVudHJ5LCBzdHJ1Y3Qga3N0YXRmcyAqIGJ1Zik7Ci1zdGF0aWMgdm9pZCBleHQzX3VubG9ja2ZzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpOworc3RhdGljIGludCBleHQzX3VuZnJlZXplKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpOwogc3RhdGljIHZvaWQgZXh0M193cml0ZV9zdXBlciAoc3RydWN0IHN1cGVyX2Jsb2NrICogc2IpOwotc3RhdGljIHZvaWQgZXh0M193cml0ZV9zdXBlcl9sb2NrZnMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYik7CitzdGF0aWMgaW50IGV4dDNfZnJlZXplKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpOwogCiAvKgogICogV3JhcHBlcnMgZm9yIGpvdXJuYWxfc3RhcnQvZW5kLgpAQCAtNDM5LDYgKzQzOSw3IEBACiAJCWV4dDNfYmxrZGV2X3JlbW92ZShzYmkpOwogCX0KIAlzYi0+c19mc19pbmZvID0gTlVMTDsKKwlrZnJlZShzYmktPnNfYmxvY2tncm91cF9sb2NrKTsKIAlrZnJlZShzYmkpOwogCXJldHVybjsKIH0KQEAgLTY4Miw2ICs2ODMsMjYgQEAKIAkJCQkgICAgZXh0M19uZnNfZ2V0X2lub2RlKTsKIH0KIAorLyoKKyAqIFRyeSB0byByZWxlYXNlIG1ldGFkYXRhIHBhZ2VzIChpbmRpcmVjdCBibG9ja3MsIGRpcmVjdG9yaWVzKSB3aGljaCBhcmUKKyAqIG1hcHBlZCB2aWEgdGhlIGJsb2NrIGRldmljZS4gIFNpbmNlIHRoZXNlIHBhZ2VzIGNvdWxkIGhhdmUgam91cm5hbCBoZWFkcworICogd2hpY2ggd291bGQgcHJldmVudCB0cnlfdG9fZnJlZV9idWZmZXJzKCkgZnJvbSBmcmVlaW5nIHRoZW0sIHdlIG11c3QgdXNlCisgKiBqYmQgbGF5ZXIncyB0cnlfdG9fZnJlZV9idWZmZXJzKCkgZnVuY3Rpb24gdG8gcmVsZWFzZSB0aGVtLgorICovCitzdGF0aWMgaW50IGJkZXZfdHJ5X3RvX2ZyZWVfcGFnZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3QgcGFnZSAqcGFnZSwKKwkJCQkgZ2ZwX3Qgd2FpdCkKK3sKKwlqb3VybmFsX3QgKmpvdXJuYWwgPSBFWFQzX1NCKHNiKS0+c19qb3VybmFsOworCisJV0FSTl9PTihQYWdlQ2hlY2tlZChwYWdlKSk7CisJaWYgKCFwYWdlX2hhc19idWZmZXJzKHBhZ2UpKQorCQlyZXR1cm4gMDsKKwlpZiAoam91cm5hbCkKKwkJcmV0dXJuIGpvdXJuYWxfdHJ5X3RvX2ZyZWVfYnVmZmVycyhqb3VybmFsLCBwYWdlLCAKKwkJCQkJCSAgIHdhaXQgJiB+X19HRlBfV0FJVCk7CisJcmV0dXJuIHRyeV90b19mcmVlX2J1ZmZlcnMocGFnZSk7Cit9CisKICNpZmRlZiBDT05GSUdfUVVPVEEKICNkZWZpbmUgUVRZUEUyTkFNRSh0KSAoKHQpPT1VU1JRVU9UQT8idXNlciI6Imdyb3VwIikKICNkZWZpbmUgUVRZUEUyTU9QVChvbiwgdCkgKCh0KT09VVNSUVVPVEE/KChvbikjI1VTUkpRVU9UQSk6KChvbikjI0dSUEpRVU9UQSkpCkBAIC03MzgsOCArNzU5LDggQEAKIAkucHV0X3N1cGVyCT0gZXh0M19wdXRfc3VwZXIsCiAJLndyaXRlX3N1cGVyCT0gZXh0M193cml0ZV9zdXBlciwKIAkuc3luY19mcwk9IGV4dDNfc3luY19mcywKLQkud3JpdGVfc3VwZXJfbG9ja2ZzID0gZXh0M193cml0ZV9zdXBlcl9sb2NrZnMsCi0JLnVubG9ja2ZzCT0gZXh0M191bmxvY2tmcywKKwkuZnJlZXplX2ZzCT0gZXh0M19mcmVlemUsCisJLnVuZnJlZXplX2ZzCT0gZXh0M191bmZyZWV6ZSwKIAkuc3RhdGZzCQk9IGV4dDNfc3RhdGZzLAogCS5yZW1vdW50X2ZzCT0gZXh0M19yZW1vdW50LAogCS5jbGVhcl9pbm9kZQk9IGV4dDNfY2xlYXJfaW5vZGUsCkBAIC03NDgsNiArNzY5LDcgQEAKIAkucXVvdGFfcmVhZAk9IGV4dDNfcXVvdGFfcmVhZCwKIAkucXVvdGFfd3JpdGUJPSBleHQzX3F1b3RhX3dyaXRlLAogI2VuZGlmCisJLmJkZXZfdHJ5X3RvX2ZyZWVfcGFnZSA9IGJkZXZfdHJ5X3RvX2ZyZWVfcGFnZSwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZXhwb3J0X29wZXJhdGlvbnMgZXh0M19leHBvcnRfb3BzID0gewpAQCAtMTU0Niw2ICsxNTY4LDEzIEBACiAJc2JpID0ga3phbGxvYyhzaXplb2YoKnNiaSksIEdGUF9LRVJORUwpOwogCWlmICghc2JpKQogCQlyZXR1cm4gLUVOT01FTTsKKworCXNiaS0+c19ibG9ja2dyb3VwX2xvY2sgPQorCQlremFsbG9jKHNpemVvZihzdHJ1Y3QgYmxvY2tncm91cF9sb2NrKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzYmktPnNfYmxvY2tncm91cF9sb2NrKSB7CisJCWtmcmVlKHNiaSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KIAlzYi0+c19mc19pbmZvID0gc2JpOwogCXNiaS0+c19tb3VudF9vcHQgPSAwOwogCXNiaS0+c19yZXN1aWQgPSBFWFQzX0RFRl9SRVNVSUQ7CkBAIC0xNzQyLDYgKzE3NzEsMTggQEAKIAlmb3IgKGk9MDsgaSA8IDQ7IGkrKykKIAkJc2JpLT5zX2hhc2hfc2VlZFtpXSA9IGxlMzJfdG9fY3B1KGVzLT5zX2hhc2hfc2VlZFtpXSk7CiAJc2JpLT5zX2RlZl9oYXNoX3ZlcnNpb24gPSBlcy0+c19kZWZfaGFzaF92ZXJzaW9uOworCWkgPSBsZTMyX3RvX2NwdShlcy0+c19mbGFncyk7CisJaWYgKGkgJiBFWFQyX0ZMQUdTX1VOU0lHTkVEX0hBU0gpCisJCXNiaS0+c19oYXNoX3Vuc2lnbmVkID0gMzsKKwllbHNlIGlmICgoaSAmIEVYVDJfRkxBR1NfU0lHTkVEX0hBU0gpID09IDApIHsKKyNpZmRlZiBfX0NIQVJfVU5TSUdORURfXworCQllcy0+c19mbGFncyB8PSBjcHVfdG9fbGUzMihFWFQyX0ZMQUdTX1VOU0lHTkVEX0hBU0gpOworCQlzYmktPnNfaGFzaF91bnNpZ25lZCA9IDM7CisjZWxzZQorCQllcy0+c19mbGFncyB8PSBjcHVfdG9fbGUzMihFWFQyX0ZMQUdTX1NJR05FRF9IQVNIKTsKKyNlbmRpZgorCQlzYi0+c19kaXJ0ID0gMTsKKwl9CiAKIAlpZiAoc2JpLT5zX2Jsb2Nrc19wZXJfZ3JvdXAgPiBibG9ja3NpemUgKiA4KSB7CiAJCXByaW50ayAoS0VSTl9FUlIKQEAgLTE3ODYsNyArMTgyNyw3IEBACiAJCWdvdG8gZmFpbGVkX21vdW50OwogCX0KIAotCWJnbF9sb2NrX2luaXQoJnNiaS0+c19ibG9ja2dyb3VwX2xvY2spOworCWJnbF9sb2NrX2luaXQoc2JpLT5zX2Jsb2NrZ3JvdXBfbG9jayk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgZGJfY291bnQ7IGkrKykgewogCQlibG9jayA9IGRlc2NyaXB0b3JfbG9jKHNiLCBsb2dpY19zYl9ibG9jaywgaSk7CkBAIC0yMjcwLDIxICsyMzExLDIzIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIGV4dDNfY29tbWl0X3N1cGVyIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYiwKLQkJCSAgICAgICBzdHJ1Y3QgZXh0M19zdXBlcl9ibG9jayAqIGVzLAorc3RhdGljIGludCBleHQzX2NvbW1pdF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAorCQkJICAgICAgIHN0cnVjdCBleHQzX3N1cGVyX2Jsb2NrICplcywKIAkJCSAgICAgICBpbnQgc3luYykKIHsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKnNiaCA9IEVYVDNfU0Ioc2IpLT5zX3NiaDsKKwlpbnQgZXJyb3IgPSAwOwogCiAJaWYgKCFzYmgpCi0JCXJldHVybjsKKwkJcmV0dXJuIGVycm9yOwogCWVzLT5zX3d0aW1lID0gY3B1X3RvX2xlMzIoZ2V0X3NlY29uZHMoKSk7CiAJZXMtPnNfZnJlZV9ibG9ja3NfY291bnQgPSBjcHVfdG9fbGUzMihleHQzX2NvdW50X2ZyZWVfYmxvY2tzKHNiKSk7CiAJZXMtPnNfZnJlZV9pbm9kZXNfY291bnQgPSBjcHVfdG9fbGUzMihleHQzX2NvdW50X2ZyZWVfaW5vZGVzKHNiKSk7CiAJQlVGRkVSX1RSQUNFKHNiaCwgIm1hcmtpbmcgZGlydHkiKTsKIAltYXJrX2J1ZmZlcl9kaXJ0eShzYmgpOwogCWlmIChzeW5jKQotCQlzeW5jX2RpcnR5X2J1ZmZlcihzYmgpOworCQllcnJvciA9IHN5bmNfZGlydHlfYnVmZmVyKHNiaCk7CisJcmV0dXJuIGVycm9yOwogfQogCiAKQEAgLTIzOTgsMTIgKzI0NDEsMTQgQEAKICAqIExWTSBjYWxscyB0aGlzIGZ1bmN0aW9uIGJlZm9yZSBhIChyZWFkLW9ubHkpIHNuYXBzaG90IGlzIGNyZWF0ZWQuICBUaGlzCiAgKiBnaXZlcyB1cyBhIGNoYW5jZSB0byBmbHVzaCB0aGUgam91cm5hbCBjb21wbGV0ZWx5IGFuZCBtYXJrIHRoZSBmcyBjbGVhbi4KICAqLwotc3RhdGljIHZvaWQgZXh0M193cml0ZV9zdXBlcl9sb2NrZnMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3N0YXRpYyBpbnQgZXh0M19mcmVlemUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKIHsKKwlpbnQgZXJyb3IgPSAwOworCWpvdXJuYWxfdCAqam91cm5hbDsKIAlzYi0+c19kaXJ0ID0gMDsKIAogCWlmICghKHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSkgewotCQlqb3VybmFsX3QgKmpvdXJuYWwgPSBFWFQzX1NCKHNiKS0+c19qb3VybmFsOworCQlqb3VybmFsID0gRVhUM19TQihzYiktPnNfam91cm5hbDsKIAogCQkvKiBOb3cgd2Ugc2V0IHVwIHRoZSBqb3VybmFsIGJhcnJpZXIuICovCiAJCWpvdXJuYWxfbG9ja191cGRhdGVzKGpvdXJuYWwpOwpAQCAtMjQxMiwyMCArMjQ1NywyOCBAQAogCQkgKiBXZSBkb24ndCB3YW50IHRvIGNsZWFyIG5lZWRzX3JlY292ZXJ5IGZsYWcgd2hlbiB3ZSBmYWlsZWQKIAkJICogdG8gZmx1c2ggdGhlIGpvdXJuYWwuCiAJCSAqLwotCQlpZiAoam91cm5hbF9mbHVzaChqb3VybmFsKSA8IDApCi0JCQlyZXR1cm47CisJCWVycm9yID0gam91cm5hbF9mbHVzaChqb3VybmFsKTsKKwkJaWYgKGVycm9yIDwgMCkKKwkJCWdvdG8gb3V0OwogCiAJCS8qIEpvdXJuYWwgYmxvY2tlZCBhbmQgZmx1c2hlZCwgY2xlYXIgbmVlZHNfcmVjb3ZlcnkgZmxhZy4gKi8KIAkJRVhUM19DTEVBUl9JTkNPTVBBVF9GRUFUVVJFKHNiLCBFWFQzX0ZFQVRVUkVfSU5DT01QQVRfUkVDT1ZFUik7Ci0JCWV4dDNfY29tbWl0X3N1cGVyKHNiLCBFWFQzX1NCKHNiKS0+c19lcywgMSk7CisJCWVycm9yID0gZXh0M19jb21taXRfc3VwZXIoc2IsIEVYVDNfU0Ioc2IpLT5zX2VzLCAxKTsKKwkJaWYgKGVycm9yKQorCQkJZ290byBvdXQ7CiAJfQorCXJldHVybiAwOworCitvdXQ6CisJam91cm5hbF91bmxvY2tfdXBkYXRlcyhqb3VybmFsKTsKKwlyZXR1cm4gZXJyb3I7CiB9CiAKIC8qCiAgKiBDYWxsZWQgYnkgTFZNIGFmdGVyIHRoZSBzbmFwc2hvdCBpcyBkb25lLiAgV2UgbmVlZCB0byByZXNldCB0aGUgUkVDT1ZFUgogICogZmxhZyBoZXJlLCBldmVuIHRob3VnaCB0aGUgZmlsZXN5c3RlbSBpcyBub3QgdGVjaG5pY2FsbHkgZGlydHkgeWV0LgogICovCi1zdGF0aWMgdm9pZCBleHQzX3VubG9ja2ZzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCitzdGF0aWMgaW50IGV4dDNfdW5mcmVlemUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKIHsKIAlpZiAoIShzYi0+c19mbGFncyAmIE1TX1JET05MWSkpIHsKIAkJbG9ja19zdXBlcihzYik7CkBAIC0yNDM1LDYgKzI0ODgsNyBAQAogCQl1bmxvY2tfc3VwZXIoc2IpOwogCQlqb3VybmFsX3VubG9ja191cGRhdGVzKEVYVDNfU0Ioc2IpLT5zX2pvdXJuYWwpOwogCX0KKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBleHQzX3JlbW91bnQgKHN0cnVjdCBzdXBlcl9ibG9jayAqIHNiLCBpbnQgKiBmbGFncywgY2hhciAqIGRhdGEpCmRpZmYgLS1naXQgYS9mcy9leHQ0L2JhbGxvYy5jIGIvZnMvZXh0NC9iYWxsb2MuYwppbmRleCAzOGIzYWNmLi42YmJhMDZiIDEwMDY0NAotLS0gYS9mcy9leHQ0L2JhbGxvYy5jCisrKyBiL2ZzL2V4dDQvYmFsbG9jLmMKQEAgLTIwLDYgKzIwLDcgQEAKICNpbmNsdWRlICJleHQ0LmgiCiAjaW5jbHVkZSAiZXh0NF9qYmQyLmgiCiAjaW5jbHVkZSAiZ3JvdXAuaCIKKyNpbmNsdWRlICJtYmFsbG9jLmgiCiAKIC8qCiAgKiBiYWxsb2MuYyBjb250YWlucyB0aGUgYmxvY2tzIGFsbG9jYXRpb24gYW5kIGRlYWxsb2NhdGlvbiByb3V0aW5lcwpAQCAtMTAwLDEwICsxMDEsMTAgQEAKIAkJICogZXNzZW50aWFsbHkgaW1wbGVtZW50aW5nIGEgcGVyLWdyb3VwIHJlYWQtb25seSBmbGFnLiAqLwogCQlpZiAoIWV4dDRfZ3JvdXBfZGVzY19jc3VtX3ZlcmlmeShzYmksIGJsb2NrX2dyb3VwLCBnZHApKSB7CiAJCQlleHQ0X2Vycm9yKHNiLCBfX2Z1bmNfXywKLQkJCQkgICJDaGVja3N1bSBiYWQgZm9yIGdyb3VwICVsdVxuIiwgYmxvY2tfZ3JvdXApOwotCQkJZ2RwLT5iZ19mcmVlX2Jsb2Nrc19jb3VudCA9IDA7Ci0JCQlnZHAtPmJnX2ZyZWVfaW5vZGVzX2NvdW50ID0gMDsKLQkJCWdkcC0+YmdfaXRhYmxlX3VudXNlZCA9IDA7CisJCQkJICAiQ2hlY2tzdW0gYmFkIGZvciBncm91cCAldSIsIGJsb2NrX2dyb3VwKTsKKwkJCWV4dDRfZnJlZV9ibGtzX3NldChzYiwgZ2RwLCAwKTsKKwkJCWV4dDRfZnJlZV9pbm9kZXNfc2V0KHNiLCBnZHAsIDApOworCQkJZXh0NF9pdGFibGVfdW51c2VkX3NldChzYiwgZ2RwLCAwKTsKIAkJCW1lbXNldChiaC0+Yl9kYXRhLCAweGZmLCBzYi0+c19ibG9ja3NpemUpOwogCQkJcmV0dXJuIDA7CiAJCX0KQEAgLTIwNSwxNSArMjA2LDE1IEBACiAJCQkJCSAgICAgZXh0NF9ncm91cF90IGJsb2NrX2dyb3VwLAogCQkJCQkgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqKmJoKQogewotCXVuc2lnbmVkIGxvbmcgZ3JvdXBfZGVzYzsKLQl1bnNpZ25lZCBsb25nIG9mZnNldDsKKwl1bnNpZ25lZCBpbnQgZ3JvdXBfZGVzYzsKKwl1bnNpZ25lZCBpbnQgb2Zmc2V0OwogCXN0cnVjdCBleHQ0X2dyb3VwX2Rlc2MgKmRlc2M7CiAJc3RydWN0IGV4dDRfc2JfaW5mbyAqc2JpID0gRVhUNF9TQihzYik7CiAKIAlpZiAoYmxvY2tfZ3JvdXAgPj0gc2JpLT5zX2dyb3Vwc19jb3VudCkgewogCQlleHQ0X2Vycm9yKHNiLCAiZXh0NF9nZXRfZ3JvdXBfZGVzYyIsCiAJCQkgICAiYmxvY2tfZ3JvdXAgPj0gZ3JvdXBzX2NvdW50IC0gIgotCQkJICAgImJsb2NrX2dyb3VwID0gJWx1LCBncm91cHNfY291bnQgPSAlbHUiLAorCQkJICAgImJsb2NrX2dyb3VwID0gJXUsIGdyb3Vwc19jb3VudCA9ICV1IiwKIAkJCSAgIGJsb2NrX2dyb3VwLCBzYmktPnNfZ3JvdXBzX2NvdW50KTsKIAogCQlyZXR1cm4gTlVMTDsKQEAgLTIyNSw3ICsyMjYsNyBAQAogCWlmICghc2JpLT5zX2dyb3VwX2Rlc2NbZ3JvdXBfZGVzY10pIHsKIAkJZXh0NF9lcnJvcihzYiwgImV4dDRfZ2V0X2dyb3VwX2Rlc2MiLAogCQkJICAgIkdyb3VwIGRlc2NyaXB0b3Igbm90IGxvYWRlZCAtICIKLQkJCSAgICJibG9ja19ncm91cCA9ICVsdSwgZ3JvdXBfZGVzYyA9ICVsdSwgZGVzYyA9ICVsdSIsCisJCQkgICAiYmxvY2tfZ3JvdXAgPSAldSwgZ3JvdXBfZGVzYyA9ICV1LCBkZXNjID0gJXUiLAogCQkJICAgYmxvY2tfZ3JvdXAsIGdyb3VwX2Rlc2MsIG9mZnNldCk7CiAJCXJldHVybiBOVUxMOwogCX0KQEAgLTMxNSwyOSArMzE2LDUwIEBACiAJaWYgKHVubGlrZWx5KCFiaCkpIHsKIAkJZXh0NF9lcnJvcihzYiwgX19mdW5jX18sCiAJCQkgICAgIkNhbm5vdCByZWFkIGJsb2NrIGJpdG1hcCAtICIKLQkJCSAgICAiYmxvY2tfZ3JvdXAgPSAlbHUsIGJsb2NrX2JpdG1hcCA9ICVsbHUiLAorCQkJICAgICJibG9ja19ncm91cCA9ICV1LCBibG9ja19iaXRtYXAgPSAlbGx1IiwKIAkJCSAgICBibG9ja19ncm91cCwgYml0bWFwX2Jsayk7CiAJCXJldHVybiBOVUxMOwogCX0KLQlpZiAoYnVmZmVyX3VwdG9kYXRlKGJoKSAmJgotCSAgICAhKGRlc2MtPmJnX2ZsYWdzICYgY3B1X3RvX2xlMTYoRVhUNF9CR19CTE9DS19VTklOSVQpKSkKKworCWlmIChiaXRtYXBfdXB0b2RhdGUoYmgpKQogCQlyZXR1cm4gYmg7CiAKIAlsb2NrX2J1ZmZlcihiaCk7CisJaWYgKGJpdG1hcF91cHRvZGF0ZShiaCkpIHsKKwkJdW5sb2NrX2J1ZmZlcihiaCk7CisJCXJldHVybiBiaDsKKwl9CiAJc3Bpbl9sb2NrKHNiX2JnbF9sb2NrKEVYVDRfU0Ioc2IpLCBibG9ja19ncm91cCkpOwogCWlmIChkZXNjLT5iZ19mbGFncyAmIGNwdV90b19sZTE2KEVYVDRfQkdfQkxPQ0tfVU5JTklUKSkgewogCQlleHQ0X2luaXRfYmxvY2tfYml0bWFwKHNiLCBiaCwgYmxvY2tfZ3JvdXAsIGRlc2MpOworCQlzZXRfYml0bWFwX3VwdG9kYXRlKGJoKTsKIAkJc2V0X2J1ZmZlcl91cHRvZGF0ZShiaCk7Ci0JCXVubG9ja19idWZmZXIoYmgpOwogCQlzcGluX3VubG9jayhzYl9iZ2xfbG9jayhFWFQ0X1NCKHNiKSwgYmxvY2tfZ3JvdXApKTsKKwkJdW5sb2NrX2J1ZmZlcihiaCk7CiAJCXJldHVybiBiaDsKIAl9CiAJc3Bpbl91bmxvY2soc2JfYmdsX2xvY2soRVhUNF9TQihzYiksIGJsb2NrX2dyb3VwKSk7CisJaWYgKGJ1ZmZlcl91cHRvZGF0ZShiaCkpIHsKKwkJLyoKKwkJICogaWYgbm90IHVuaW5pdCBpZiBiaCBpcyB1cHRvZGF0ZSwKKwkJICogYml0bWFwIGlzIGFsc28gdXB0b2RhdGUKKwkJICovCisJCXNldF9iaXRtYXBfdXB0b2RhdGUoYmgpOworCQl1bmxvY2tfYnVmZmVyKGJoKTsKKwkJcmV0dXJuIGJoOworCX0KKwkvKgorCSAqIHN1Ym1pdCB0aGUgYnVmZmVyX2hlYWQgZm9yIHJlYWQuIFdlIGNhbgorCSAqIHNhZmVseSBtYXJrIHRoZSBiaXRtYXAgYXMgdXB0b2RhdGUgbm93LgorCSAqIFdlIGRvIGl0IGhlcmUgc28gdGhlIGJpdG1hcCB1cHRvZGF0ZSBiaXQKKwkgKiBnZXQgc2V0IHdpdGggYnVmZmVyIGxvY2sgaGVsZC4KKwkgKi8KKwlzZXRfYml0bWFwX3VwdG9kYXRlKGJoKTsKIAlpZiAoYmhfc3VibWl0X3JlYWQoYmgpIDwgMCkgewogCQlwdXRfYmgoYmgpOwogCQlleHQ0X2Vycm9yKHNiLCBfX2Z1bmNfXywKIAkJCSAgICAiQ2Fubm90IHJlYWQgYmxvY2sgYml0bWFwIC0gIgotCQkJICAgICJibG9ja19ncm91cCA9ICVsdSwgYmxvY2tfYml0bWFwID0gJWxsdSIsCisJCQkgICAgImJsb2NrX2dyb3VwID0gJXUsIGJsb2NrX2JpdG1hcCA9ICVsbHUiLAogCQkJICAgIGJsb2NrX2dyb3VwLCBiaXRtYXBfYmxrKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQpAQCAtMzUwLDYyICszNzIsNDQgQEAKIH0KIAogLyoqCi0gKiBleHQ0X2ZyZWVfYmxvY2tzX3NiKCkgLS0gRnJlZSBnaXZlbiBibG9ja3MgYW5kIHVwZGF0ZSBxdW90YQorICogZXh0NF9hZGRfZ3JvdXBibG9ja3MoKSAtLSBBZGQgZ2l2ZW4gYmxvY2tzIHRvIGFuIGV4aXN0aW5nIGdyb3VwCiAgKiBAaGFuZGxlOgkJCWhhbmRsZSB0byB0aGlzIHRyYW5zYWN0aW9uCiAgKiBAc2I6CQkJCXN1cGVyIGJsb2NrCi0gKiBAYmxvY2s6CQkJc3RhcnQgcGh5c2NpYWwgYmxvY2sgdG8gZnJlZQorICogQGJsb2NrOgkJCXN0YXJ0IHBoeXNjaWFsIGJsb2NrIHRvIGFkZCB0byB0aGUgYmxvY2sgZ3JvdXAKICAqIEBjb3VudDoJCQludW1iZXIgb2YgYmxvY2tzIHRvIGZyZWUKLSAqIEBwZHF1b3RfZnJlZWRfYmxvY2tzOglwb2ludGVyIHRvIHF1b3RhCiAgKgotICogWFhYIFRoaXMgZnVuY3Rpb24gaXMgb25seSB1c2VkIGJ5IHRoZSBvbi1saW5lIHJlc2l6aW5nIGNvZGUsIHdoaWNoCi0gKiBzaG91bGQgcHJvYmFibHkgYmUgZml4ZWQgdXAgdG8gY2FsbCB0aGUgbWJhbGxvYyB2YXJpYW50LiAgVGhlcmUKLSAqIHRoaXMgbmVlZHMgdG8gYmUgY2xlYW5lZCB1cCBsYXRlcjsgaW4gZmFjdCwgSSdtIG5vdCBjb252aW5jZWQgdGhpcwotICogaXMgMTAwJSBjb3JyZWN0IGluIHRoZSBmYWNlIG9mIHRoZSBtYmFsbG9jIGNvZGUuICBUaGUgb25saW5lIHJlc2l6aW5nCi0gKiBjb2RlIG5lZWRzIHRvIGJlIGZpeGVkIHVwIHRvIG1vcmUgdGlnaHRseSAoYW5kIGNvcnJlY3RseSkgaW50ZXJsb2NrCi0gKiB3aXRoIHRoZSBtYmFsbG9jIGNvZGUuCisgKiBUaGlzIG1hcmtzIHRoZSBibG9ja3MgYXMgZnJlZSBpbiB0aGUgYml0bWFwLiBXZSBhc2sgdGhlCisgKiBtYmFsbG9jIHRvIHJlbG9hZCB0aGUgYnVkZHkgYWZ0ZXIgdGhpcyBieSBzZXR0aW5nIGdyb3VwCisgKiBFWFQ0X0dST1VQX0lORk9fTkVFRF9JTklUX0JJVCBmbGFnCiAgKi8KLXZvaWQgZXh0NF9mcmVlX2Jsb2Nrc19zYihoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAotCQkJIGV4dDRfZnNibGtfdCBibG9jaywgdW5zaWduZWQgbG9uZyBjb3VudCwKLQkJCSB1bnNpZ25lZCBsb25nICpwZHF1b3RfZnJlZWRfYmxvY2tzKQordm9pZCBleHQ0X2FkZF9ncm91cGJsb2NrcyhoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAorCQkJIGV4dDRfZnNibGtfdCBibG9jaywgdW5zaWduZWQgbG9uZyBjb3VudCkKIHsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJpdG1hcF9iaCA9IE5VTEw7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpnZF9iaDsKIAlleHQ0X2dyb3VwX3QgYmxvY2tfZ3JvdXA7CiAJZXh0NF9ncnBibGtfdCBiaXQ7Ci0JdW5zaWduZWQgbG9uZyBpOwotCXVuc2lnbmVkIGxvbmcgb3ZlcmZsb3c7CisJdW5zaWduZWQgaW50IGk7CiAJc3RydWN0IGV4dDRfZ3JvdXBfZGVzYyAqZGVzYzsKIAlzdHJ1Y3QgZXh0NF9zdXBlcl9ibG9jayAqZXM7CiAJc3RydWN0IGV4dDRfc2JfaW5mbyAqc2JpOwotCWludCBlcnIgPSAwLCByZXQ7Ci0JZXh0NF9ncnBibGtfdCBncm91cF9mcmVlZDsKKwlpbnQgZXJyID0gMCwgcmV0LCBibGtfZnJlZV9jb3VudDsKKwlleHQ0X2dycGJsa190IGJsb2Nrc19mcmVlZDsKKwlzdHJ1Y3QgZXh0NF9ncm91cF9pbmZvICpncnA7CiAKLQkqcGRxdW90X2ZyZWVkX2Jsb2NrcyA9IDA7CiAJc2JpID0gRVhUNF9TQihzYik7CiAJZXMgPSBzYmktPnNfZXM7Ci0JaWYgKGJsb2NrIDwgbGUzMl90b19jcHUoZXMtPnNfZmlyc3RfZGF0YV9ibG9jaykgfHwKLQkgICAgYmxvY2sgKyBjb3VudCA8IGJsb2NrIHx8Ci0JICAgIGJsb2NrICsgY291bnQgPiBleHQ0X2Jsb2Nrc19jb3VudChlcykpIHsKLQkJZXh0NF9lcnJvcihzYiwgImV4dDRfZnJlZV9ibG9ja3MiLAotCQkJICAgIkZyZWVpbmcgYmxvY2tzIG5vdCBpbiBkYXRhem9uZSAtICIKLQkJCSAgICJibG9jayA9ICVsbHUsIGNvdW50ID0gJWx1IiwgYmxvY2ssIGNvdW50KTsKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0JfQorCWV4dDRfZGVidWcoIkFkZGluZyBibG9jayhzKSAlbGx1LSVsbHVcbiIsIGJsb2NrLCBibG9jayArIGNvdW50IC0gMSk7CiAKLQlleHQ0X2RlYnVnKCJmcmVlaW5nIGJsb2NrKHMpICVsbHUtJWxsdVxuIiwgYmxvY2ssIGJsb2NrICsgY291bnQgLSAxKTsKLQotZG9fbW9yZToKLQlvdmVyZmxvdyA9IDA7CiAJZXh0NF9nZXRfZ3JvdXBfbm9fYW5kX29mZnNldChzYiwgYmxvY2ssICZibG9ja19ncm91cCwgJmJpdCk7CisJZ3JwID0gZXh0NF9nZXRfZ3JvdXBfaW5mbyhzYiwgYmxvY2tfZ3JvdXApOwogCS8qCiAJICogQ2hlY2sgdG8gc2VlIGlmIHdlIGFyZSBmcmVlaW5nIGJsb2NrcyBhY3Jvc3MgYSBncm91cAogCSAqIGJvdW5kYXJ5LgogCSAqLwogCWlmIChiaXQgKyBjb3VudCA+IEVYVDRfQkxPQ0tTX1BFUl9HUk9VUChzYikpIHsKLQkJb3ZlcmZsb3cgPSBiaXQgKyBjb3VudCAtIEVYVDRfQkxPQ0tTX1BFUl9HUk9VUChzYik7Ci0JCWNvdW50IC09IG92ZXJmbG93OworCQlnb3RvIGVycm9yX3JldHVybjsKIAl9Ci0JYnJlbHNlKGJpdG1hcF9iaCk7CiAJYml0bWFwX2JoID0gZXh0NF9yZWFkX2Jsb2NrX2JpdG1hcChzYiwgYmxvY2tfZ3JvdXApOwogCWlmICghYml0bWFwX2JoKQogCQlnb3RvIGVycm9yX3JldHVybjsKQEAgLTQxOCwxOCArNDIyLDE3IEBACiAJICAgIGluX3JhbmdlKGJsb2NrLCBleHQ0X2lub2RlX3RhYmxlKHNiLCBkZXNjKSwgc2JpLT5zX2l0Yl9wZXJfZ3JvdXApIHx8CiAJICAgIGluX3JhbmdlKGJsb2NrICsgY291bnQgLSAxLCBleHQ0X2lub2RlX3RhYmxlKHNiLCBkZXNjKSwKIAkJICAgICBzYmktPnNfaXRiX3Blcl9ncm91cCkpIHsKLQkJZXh0NF9lcnJvcihzYiwgImV4dDRfZnJlZV9ibG9ja3MiLAotCQkJICAgIkZyZWVpbmcgYmxvY2tzIGluIHN5c3RlbSB6b25lcyAtICIKKwkJZXh0NF9lcnJvcihzYiwgX19mdW5jX18sCisJCQkgICAiQWRkaW5nIGJsb2NrcyBpbiBzeXN0ZW0gem9uZXMgLSAiCiAJCQkgICAiQmxvY2sgPSAlbGx1LCBjb3VudCA9ICVsdSIsCiAJCQkgICBibG9jaywgY291bnQpOwogCQlnb3RvIGVycm9yX3JldHVybjsKIAl9CiAKIAkvKgotCSAqIFdlIGFyZSBhYm91dCB0byBzdGFydCByZWxlYXNpbmcgYmxvY2tzIGluIHRoZSBiaXRtYXAsCisJICogV2UgYXJlIGFib3V0IHRvIGFkZCBibG9ja3MgdG8gdGhlIGJpdG1hcCwKIAkgKiBzbyB3ZSBuZWVkIHVuZG8gYWNjZXNzLgogCSAqLwotCS8qIEBAQCBjaGVjayBlcnJvcnMgKi8KIAlCVUZGRVJfVFJBQ0UoYml0bWFwX2JoLCAiZ2V0dGluZyB1bmRvIGFjY2VzcyIpOwogCWVyciA9IGV4dDRfam91cm5hbF9nZXRfdW5kb19hY2Nlc3MoaGFuZGxlLCBiaXRtYXBfYmgpOwogCWlmIChlcnIpCkBAIC00NDQsMTA3ICs0NDcsNTUgQEAKIAllcnIgPSBleHQ0X2pvdXJuYWxfZ2V0X3dyaXRlX2FjY2VzcyhoYW5kbGUsIGdkX2JoKTsKIAlpZiAoZXJyKQogCQlnb3RvIGVycm9yX3JldHVybjsKLQotCWpiZF9sb2NrX2JoX3N0YXRlKGJpdG1hcF9iaCk7Ci0KLQlmb3IgKGkgPSAwLCBncm91cF9mcmVlZCA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0JCS8qCi0JCSAqIEFuIEhKIHNwZWNpYWwuICBUaGlzIGlzIGV4cGVuc2l2ZS4uLgotCQkgKi8KLSNpZmRlZiBDT05GSUdfSkJEMl9ERUJVRwotCQlqYmRfdW5sb2NrX2JoX3N0YXRlKGJpdG1hcF9iaCk7Ci0JCXsKLQkJCXN0cnVjdCBidWZmZXJfaGVhZCAqZGVidWdfYmg7Ci0JCQlkZWJ1Z19iaCA9IHNiX2ZpbmRfZ2V0X2Jsb2NrKHNiLCBibG9jayArIGkpOwotCQkJaWYgKGRlYnVnX2JoKSB7Ci0JCQkJQlVGRkVSX1RSQUNFKGRlYnVnX2JoLCAiRGVsZXRlZCEiKTsKLQkJCQlpZiAoIWJoMmpoKGJpdG1hcF9iaCktPmJfY29tbWl0dGVkX2RhdGEpCi0JCQkJCUJVRkZFUl9UUkFDRShkZWJ1Z19iaCwKLQkJCQkJCSJObyBjb21taXRlZCBkYXRhIGluIGJpdG1hcCIpOwotCQkJCUJVRkZFUl9UUkFDRTIoZGVidWdfYmgsIGJpdG1hcF9iaCwgImJpdG1hcCIpOwotCQkJCV9fYnJlbHNlKGRlYnVnX2JoKTsKLQkJCX0KLQkJfQotCQlqYmRfbG9ja19iaF9zdGF0ZShiaXRtYXBfYmgpOwotI2VuZGlmCi0JCWlmIChuZWVkX3Jlc2NoZWQoKSkgewotCQkJamJkX3VubG9ja19iaF9zdGF0ZShiaXRtYXBfYmgpOwotCQkJY29uZF9yZXNjaGVkKCk7Ci0JCQlqYmRfbG9ja19iaF9zdGF0ZShiaXRtYXBfYmgpOwotCQl9Ci0JCS8qIEBAQCBUaGlzIHByZXZlbnRzIG5ld2x5LWFsbG9jYXRlZCBkYXRhIGZyb20gYmVpbmcKLQkJICogZnJlZWQgYW5kIHRoZW4gcmVhbGxvY2F0ZWQgd2l0aGluIHRoZSBzYW1lCi0JCSAqIHRyYW5zYWN0aW9uLgotCQkgKgotCQkgKiBJZGVhbGx5IHdlIHdvdWxkIHdhbnQgdG8gYWxsb3cgdGhhdCB0byBoYXBwZW4sIGJ1dCB0bwotCQkgKiBkbyBzbyByZXF1aXJlcyBtYWtpbmcgamJkMl9qb3VybmFsX2ZvcmdldCgpIGNhcGFibGUgb2YKLQkJICogcmV2b2tpbmcgdGhlIHF1ZXVlZCB3cml0ZSBvZiBhIGRhdGEgYmxvY2ssIHdoaWNoCi0JCSAqIGltcGxpZXMgYmxvY2tpbmcgb24gdGhlIGpvdXJuYWwgbG9jay4gICpmb3JnZXQoKQotCQkgKiBjYW5ub3QgYmxvY2sgZHVlIHRvIHRydW5jYXRlIHJhY2VzLgotCQkgKgotCQkgKiBFdmVudHVhbGx5IHdlIGNhbiBmaXggdGhpcyBieSBtYWtpbmcgamJkMl9qb3VybmFsX2ZvcmdldCgpCi0JCSAqIHJldHVybiBhIHN0YXR1cyBpbmRpY2F0aW5nIHdoZXRoZXIgb3Igbm90IGl0IHdhcyBhYmxlCi0JCSAqIHRvIHJldm9rZSB0aGUgYnVmZmVyLiAgT24gc3VjY2Vzc2Z1bCByZXZva2UsIGl0IGlzCi0JCSAqIHNhZmUgbm90IHRvIHNldCB0aGUgYWxsb2NhdGlvbiBiaXQgaW4gdGhlIGNvbW1pdHRlZAotCQkgKiBiaXRtYXAsIGJlY2F1c2Ugd2Uga25vdyB0aGF0IHRoZXJlIGlzIG5vIG91dHN0YW5kaW5nCi0JCSAqIGFjdGl2aXR5IG9uIHRoZSBidWZmZXIgYW55IG1vcmUgYW5kIHNvIGl0IGlzIHNhZmUgdG8KLQkJICogcmVhbGxvY2F0ZSBpdC4KLQkJICovCi0JCUJVRkZFUl9UUkFDRShiaXRtYXBfYmgsICJzZXQgaW4gYl9jb21taXR0ZWRfZGF0YSIpOwotCQlKX0FTU0VSVF9CSChiaXRtYXBfYmgsCi0JCQkJYmgyamgoYml0bWFwX2JoKS0+Yl9jb21taXR0ZWRfZGF0YSAhPSBOVUxMKTsKLQkJZXh0NF9zZXRfYml0X2F0b21pYyhzYl9iZ2xfbG9jayhzYmksIGJsb2NrX2dyb3VwKSwgYml0ICsgaSwKLQkJCQliaDJqaChiaXRtYXBfYmgpLT5iX2NvbW1pdHRlZF9kYXRhKTsKLQotCQkvKgotCQkgKiBXZSBjbGVhciB0aGUgYml0IGluIHRoZSBiaXRtYXAgYWZ0ZXIgc2V0dGluZyB0aGUgY29tbWl0dGVkCi0JCSAqIGRhdGEgYml0LCBiZWNhdXNlIHRoaXMgaXMgdGhlIHJldmVyc2Ugb3JkZXIgdG8gdGhhdCB3aGljaAotCQkgKiB0aGUgYWxsb2NhdG9yIHVzZXMuCi0JCSAqLworCS8qCisJICogbWFrZSBzdXJlIHdlIGRvbid0IGFsbG93IGEgcGFyYWxsZWwgaW5pdCBvbiBvdGhlciBncm91cHMgaW4gdGhlCisJICogc2FtZSBidWRkeSBjYWNoZQorCSAqLworCWRvd25fd3JpdGUoJmdycC0+YWxsb2Nfc2VtKTsKKwlmb3IgKGkgPSAwLCBibG9ja3NfZnJlZWQgPSAwOyBpIDwgY291bnQ7IGkrKykgewogCQlCVUZGRVJfVFJBQ0UoYml0bWFwX2JoLCAiY2xlYXIgYml0Iik7CiAJCWlmICghZXh0NF9jbGVhcl9iaXRfYXRvbWljKHNiX2JnbF9sb2NrKHNiaSwgYmxvY2tfZ3JvdXApLAogCQkJCQkJYml0ICsgaSwgYml0bWFwX2JoLT5iX2RhdGEpKSB7Ci0JCQlqYmRfdW5sb2NrX2JoX3N0YXRlKGJpdG1hcF9iaCk7CiAJCQlleHQ0X2Vycm9yKHNiLCBfX2Z1bmNfXywKIAkJCQkgICAiYml0IGFscmVhZHkgY2xlYXJlZCBmb3IgYmxvY2sgJWxsdSIsCiAJCQkJICAgKGV4dDRfZnNibGtfdCkoYmxvY2sgKyBpKSk7Ci0JCQlqYmRfbG9ja19iaF9zdGF0ZShiaXRtYXBfYmgpOwogCQkJQlVGRkVSX1RSQUNFKGJpdG1hcF9iaCwgImJpdCBhbHJlYWR5IGNsZWFyZWQiKTsKIAkJfSBlbHNlIHsKLQkJCWdyb3VwX2ZyZWVkKys7CisJCQlibG9ja3NfZnJlZWQrKzsKIAkJfQogCX0KLQlqYmRfdW5sb2NrX2JoX3N0YXRlKGJpdG1hcF9iaCk7Ci0KIAlzcGluX2xvY2soc2JfYmdsX2xvY2soc2JpLCBibG9ja19ncm91cCkpOwotCWxlMTZfYWRkX2NwdSgmZGVzYy0+YmdfZnJlZV9ibG9ja3NfY291bnQsIGdyb3VwX2ZyZWVkKTsKKwlibGtfZnJlZV9jb3VudCA9IGJsb2Nrc19mcmVlZCArIGV4dDRfZnJlZV9ibGtzX2NvdW50KHNiLCBkZXNjKTsKKwlleHQ0X2ZyZWVfYmxrc19zZXQoc2IsIGRlc2MsIGJsa19mcmVlX2NvdW50KTsKIAlkZXNjLT5iZ19jaGVja3N1bSA9IGV4dDRfZ3JvdXBfZGVzY19jc3VtKHNiaSwgYmxvY2tfZ3JvdXAsIGRlc2MpOwogCXNwaW5fdW5sb2NrKHNiX2JnbF9sb2NrKHNiaSwgYmxvY2tfZ3JvdXApKTsKLQlwZXJjcHVfY291bnRlcl9hZGQoJnNiaS0+c19mcmVlYmxvY2tzX2NvdW50ZXIsIGNvdW50KTsKKwlwZXJjcHVfY291bnRlcl9hZGQoJnNiaS0+c19mcmVlYmxvY2tzX2NvdW50ZXIsIGJsb2Nrc19mcmVlZCk7CiAKIAlpZiAoc2JpLT5zX2xvZ19ncm91cHNfcGVyX2ZsZXgpIHsKIAkJZXh0NF9ncm91cF90IGZsZXhfZ3JvdXAgPSBleHQ0X2ZsZXhfZ3JvdXAoc2JpLCBibG9ja19ncm91cCk7CiAJCXNwaW5fbG9jayhzYl9iZ2xfbG9jayhzYmksIGZsZXhfZ3JvdXApKTsKLQkJc2JpLT5zX2ZsZXhfZ3JvdXBzW2ZsZXhfZ3JvdXBdLmZyZWVfYmxvY2tzICs9IGNvdW50OworCQlzYmktPnNfZmxleF9ncm91cHNbZmxleF9ncm91cF0uZnJlZV9ibG9ja3MgKz0gYmxvY2tzX2ZyZWVkOwogCQlzcGluX3VubG9jayhzYl9iZ2xfbG9jayhzYmksIGZsZXhfZ3JvdXApKTsKIAl9CisJLyoKKwkgKiByZXF1ZXN0IHRvIHJlbG9hZCB0aGUgYnVkZHkgd2l0aCB0aGUKKwkgKiBuZXcgYml0bWFwIGluZm9ybWF0aW9uCisJICovCisJc2V0X2JpdChFWFQ0X0dST1VQX0lORk9fTkVFRF9JTklUX0JJVCwgJihncnAtPmJiX3N0YXRlKSk7CisJZXh0NF9tYl91cGRhdGVfZ3JvdXBfaW5mbyhncnAsIGJsb2Nrc19mcmVlZCk7CisJdXBfd3JpdGUoJmdycC0+YWxsb2Nfc2VtKTsKIAogCS8qIFdlIGRpcnRpZWQgdGhlIGJpdG1hcCBibG9jayAqLwogCUJVRkZFUl9UUkFDRShiaXRtYXBfYmgsICJkaXJ0aWVkIGJpdG1hcCBibG9jayIpOwotCWVyciA9IGV4dDRfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGJpdG1hcF9iaCk7CisJZXJyID0gZXh0NF9oYW5kbGVfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBOVUxMLCBiaXRtYXBfYmgpOwogCiAJLyogQW5kIHRoZSBncm91cCBkZXNjcmlwdG9yIGJsb2NrICovCiAJQlVGRkVSX1RSQUNFKGdkX2JoLCAiZGlydGllZCBncm91cCBkZXNjcmlwdG9yIGJsb2NrIik7Ci0JcmV0ID0gZXh0NF9qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgZ2RfYmgpOwotCWlmICghZXJyKSBlcnIgPSByZXQ7Ci0JKnBkcXVvdF9mcmVlZF9ibG9ja3MgKz0gZ3JvdXBfZnJlZWQ7Ci0KLQlpZiAob3ZlcmZsb3cgJiYgIWVycikgewotCQlibG9jayArPSBjb3VudDsKLQkJY291bnQgPSBvdmVyZmxvdzsKLQkJZ290byBkb19tb3JlOwotCX0KKwlyZXQgPSBleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIE5VTEwsIGdkX2JoKTsKKwlpZiAoIWVycikKKwkJZXJyID0gcmV0OwogCXNiLT5zX2RpcnQgPSAxOworCiBlcnJvcl9yZXR1cm46CiAJYnJlbHNlKGJpdG1hcF9iaCk7CiAJZXh0NF9zdGRfZXJyb3Ioc2IsIGVycik7CkBAIC02MTQsNyArNTY1LDcgQEAKIAkJaWYgKGRpcnR5X2Jsb2NrcyA8IDApIHsKIAkJCXByaW50ayhLRVJOX0NSSVQgIkRpcnR5IGJsb2NrIGFjY291bnRpbmcgIgogCQkJCQkid2VudCB3cm9uZyAlbGxkXG4iLAotCQkJCQlkaXJ0eV9ibG9ja3MpOworCQkJCQkobG9uZyBsb25nKWRpcnR5X2Jsb2Nrcyk7CiAJCX0KIAl9CiAJLyogQ2hlY2sgd2hldGhlciB3ZSBoYXZlIHNwYWNlIGFmdGVyCkBAIC02NjYsMTAxICs2MTcsNDUgQEAKIAlyZXR1cm4gamJkMl9qb3VybmFsX2ZvcmNlX2NvbW1pdF9uZXN0ZWQoRVhUNF9TQihzYiktPnNfam91cm5hbCk7CiB9CiAKLSNkZWZpbmUgRVhUNF9NRVRBX0JMT0NLIDB4MQotCi1zdGF0aWMgZXh0NF9mc2Jsa190IGRvX2Jsa19hbGxvYyhoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAotCQkJCWV4dDRfbGJsa190IGlibG9jaywgZXh0NF9mc2Jsa190IGdvYWwsCi0JCQkJdW5zaWduZWQgbG9uZyAqY291bnQsIGludCAqZXJycCwgaW50IGZsYWdzKQotewotCXN0cnVjdCBleHQ0X2FsbG9jYXRpb25fcmVxdWVzdCBhcjsKLQlleHQ0X2ZzYmxrX3QgcmV0OwotCi0JbWVtc2V0KCZhciwgMCwgc2l6ZW9mKGFyKSk7Ci0JLyogRmlsbCB3aXRoIG5laWdoYm91ciBhbGxvY2F0ZWQgYmxvY2tzICovCi0KLQlhci5pbm9kZSA9IGlub2RlOwotCWFyLmdvYWwgPSBnb2FsOwotCWFyLmxlbiA9ICpjb3VudDsKLQlhci5sb2dpY2FsID0gaWJsb2NrOwotCi0JaWYgKFNfSVNSRUcoaW5vZGUtPmlfbW9kZSkgJiYgIShmbGFncyAmIEVYVDRfTUVUQV9CTE9DSykpCi0JCS8qIGVuYWJsZSBpbi1jb3JlIHByZWFsbG9jYXRpb24gZm9yIGRhdGEgYmxvY2sgYWxsb2NhdGlvbiAqLwotCQlhci5mbGFncyA9IEVYVDRfTUJfSElOVF9EQVRBOwotCWVsc2UKLQkJLyogZGlzYWJsZSBpbi1jb3JlIHByZWFsbG9jYXRpb24gZm9yIG5vbi1yZWd1bGFyIGZpbGVzICovCi0JCWFyLmZsYWdzID0gMDsKLQotCXJldCA9IGV4dDRfbWJfbmV3X2Jsb2NrcyhoYW5kbGUsICZhciwgZXJycCk7Ci0JKmNvdW50ID0gYXIubGVuOwotCXJldHVybiByZXQ7Ci19Ci0KIC8qCiAgKiBleHQ0X25ld19tZXRhX2Jsb2NrcygpIC0tIGFsbG9jYXRlIGJsb2NrIGZvciBtZXRhIGRhdGEgKGluZGV4aW5nKSBibG9ja3MKICAqCiAgKiBAaGFuZGxlOiAgICAgICAgICAgICBoYW5kbGUgdG8gdGhpcyB0cmFuc2FjdGlvbgogICogQGlub2RlOiAgICAgICAgICAgICAgZmlsZSBpbm9kZQogICogQGdvYWw6ICAgICAgICAgICAgICAgZ2l2ZW4gdGFyZ2V0IGJsb2NrKGZpbGVzeXN0ZW0gd2lkZSkKLSAqIEBjb3VudDoJCXRvdGFsIG51bWJlciBvZiBibG9ja3MgbmVlZAorICogQGNvdW50OgkJcG9pbnRlciB0byB0b3RhbCBudW1iZXIgb2YgYmxvY2tzIG5lZWRlZAogICogQGVycnA6ICAgICAgICAgICAgICAgZXJyb3IgY29kZQogICoKLSAqIFJldHVybiAxc3QgYWxsb2NhdGVkIGJsb2NrIG51bWJlcm9uIHN1Y2Nlc3MsICpjb3VudCBzdG9yZXMgdG90YWwgYWNjb3VudAorICogUmV0dXJuIDFzdCBhbGxvY2F0ZWQgYmxvY2sgbnVtYmVyIG9uIHN1Y2Nlc3MsICpjb3VudCBzdG9yZXMgdG90YWwgYWNjb3VudAogICogZXJyb3Igc3RvcmVzIGluIGVycnAgcG9pbnRlcgogICovCiBleHQ0X2ZzYmxrX3QgZXh0NF9uZXdfbWV0YV9ibG9ja3MoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSwKIAkJZXh0NF9mc2Jsa190IGdvYWwsIHVuc2lnbmVkIGxvbmcgKmNvdW50LCBpbnQgKmVycnApCiB7CisJc3RydWN0IGV4dDRfYWxsb2NhdGlvbl9yZXF1ZXN0IGFyOwogCWV4dDRfZnNibGtfdCByZXQ7Ci0JcmV0ID0gZG9fYmxrX2FsbG9jKGhhbmRsZSwgaW5vZGUsIDAsIGdvYWwsCi0JCQkJY291bnQsIGVycnAsIEVYVDRfTUVUQV9CTE9DSyk7CisKKwltZW1zZXQoJmFyLCAwLCBzaXplb2YoYXIpKTsKKwkvKiBGaWxsIHdpdGggbmVpZ2hib3VyIGFsbG9jYXRlZCBibG9ja3MgKi8KKwlhci5pbm9kZSA9IGlub2RlOworCWFyLmdvYWwgPSBnb2FsOworCWFyLmxlbiA9IGNvdW50ID8gKmNvdW50IDogMTsKKworCXJldCA9IGV4dDRfbWJfbmV3X2Jsb2NrcyhoYW5kbGUsICZhciwgZXJycCk7CisJaWYgKGNvdW50KQorCQkqY291bnQgPSBhci5sZW47CisKIAkvKgogCSAqIEFjY291bnQgZm9yIHRoZSBhbGxvY2F0ZWQgbWV0YSBibG9ja3MKIAkgKi8KIAlpZiAoISgqZXJycCkgJiYgRVhUNF9JKGlub2RlKS0+aV9kZWxhbGxvY19yZXNlcnZlZF9mbGFnKSB7CiAJCXNwaW5fbG9jaygmRVhUNF9JKGlub2RlKS0+aV9ibG9ja19yZXNlcnZhdGlvbl9sb2NrKTsKLQkJRVhUNF9JKGlub2RlKS0+aV9hbGxvY2F0ZWRfbWV0YV9ibG9ja3MgKz0gKmNvdW50OworCQlFWFQ0X0koaW5vZGUpLT5pX2FsbG9jYXRlZF9tZXRhX2Jsb2NrcyArPSBhci5sZW47CiAJCXNwaW5fdW5sb2NrKCZFWFQ0X0koaW5vZGUpLT5pX2Jsb2NrX3Jlc2VydmF0aW9uX2xvY2spOwogCX0KIAlyZXR1cm4gcmV0OwogfQogCi0vKgotICogZXh0NF9uZXdfbWV0YV9ibG9jaygpIC0tIGFsbG9jYXRlIGJsb2NrIGZvciBtZXRhIGRhdGEgKGluZGV4aW5nKSBibG9ja3MKLSAqCi0gKiBAaGFuZGxlOiAgICAgICAgICAgICBoYW5kbGUgdG8gdGhpcyB0cmFuc2FjdGlvbgotICogQGlub2RlOiAgICAgICAgICAgICAgZmlsZSBpbm9kZQotICogQGdvYWw6ICAgICAgICAgICAgICAgZ2l2ZW4gdGFyZ2V0IGJsb2NrKGZpbGVzeXN0ZW0gd2lkZSkKLSAqIEBlcnJwOiAgICAgICAgICAgICAgIGVycm9yIGNvZGUKLSAqCi0gKiBSZXR1cm4gYWxsb2NhdGVkIGJsb2NrIG51bWJlciBvbiBzdWNjZXNzCi0gKi8KLWV4dDRfZnNibGtfdCBleHQ0X25ld19tZXRhX2Jsb2NrKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCi0JCWV4dDRfZnNibGtfdCBnb2FsLCBpbnQgKmVycnApCi17Ci0JdW5zaWduZWQgbG9uZyBjb3VudCA9IDE7Ci0JcmV0dXJuIGV4dDRfbmV3X21ldGFfYmxvY2tzKGhhbmRsZSwgaW5vZGUsIGdvYWwsICZjb3VudCwgZXJycCk7Ci19Ci0KLS8qCi0gKiBleHQ0X25ld19ibG9ja3MoKSAtLSBhbGxvY2F0ZSBkYXRhIGJsb2NrcwotICoKLSAqIEBoYW5kbGU6ICAgICAgICAgICAgIGhhbmRsZSB0byB0aGlzIHRyYW5zYWN0aW9uCi0gKiBAaW5vZGU6ICAgICAgICAgICAgICBmaWxlIGlub2RlCi0gKiBAZ29hbDogICAgICAgICAgICAgICBnaXZlbiB0YXJnZXQgYmxvY2soZmlsZXN5c3RlbSB3aWRlKQotICogQGNvdW50OgkJdG90YWwgbnVtYmVyIG9mIGJsb2NrcyBuZWVkCi0gKiBAZXJycDogICAgICAgICAgICAgICBlcnJvciBjb2RlCi0gKgotICogUmV0dXJuIDFzdCBhbGxvY2F0ZWQgYmxvY2sgbnVtYmVyb24gc3VjY2VzcywgKmNvdW50IHN0b3JlcyB0b3RhbCBhY2NvdW50Ci0gKiBlcnJvciBzdG9yZXMgaW4gZXJycCBwb2ludGVyCi0gKi8KLQotZXh0NF9mc2Jsa190IGV4dDRfbmV3X2Jsb2NrcyhoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAotCQkJCWV4dDRfbGJsa190IGlibG9jaywgZXh0NF9mc2Jsa190IGdvYWwsCi0JCQkJdW5zaWduZWQgbG9uZyAqY291bnQsIGludCAqZXJycCkKLXsKLQlyZXR1cm4gZG9fYmxrX2FsbG9jKGhhbmRsZSwgaW5vZGUsIGlibG9jaywgZ29hbCwgY291bnQsIGVycnAsIDApOwotfQotCiAvKioKICAqIGV4dDRfY291bnRfZnJlZV9ibG9ja3MoKSAtLSBjb3VudCBmaWxlc3lzdGVtIGZyZWUgYmxvY2tzCiAgKiBAc2I6CQlzdXBlcmJsb2NrCkBAIC03NzYsNyArNjcxLDcgQEAKICNpZmRlZiBFWFQ0RlNfREVCVUcKIAlzdHJ1Y3QgZXh0NF9zdXBlcl9ibG9jayAqZXM7CiAJZXh0NF9mc2Jsa190IGJpdG1hcF9jb3VudDsKLQl1bnNpZ25lZCBsb25nIHg7CisJdW5zaWduZWQgaW50IHg7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaXRtYXBfYmggPSBOVUxMOwogCiAJZXMgPSBFWFQ0X1NCKHNiKS0+c19lczsKQEAgLTc5Niw3ICs2OTEsNyBAQAogCQkJY29udGludWU7CiAKIAkJeCA9IGV4dDRfY291bnRfZnJlZShiaXRtYXBfYmgsIHNiLT5zX2Jsb2Nrc2l6ZSk7Ci0JCXByaW50ayhLRVJOX0RFQlVHICJncm91cCAlbHU6IHN0b3JlZCA9ICVkLCBjb3VudGVkID0gJWx1XG4iLAorCQlwcmludGsoS0VSTl9ERUJVRyAiZ3JvdXAgJWx1OiBzdG9yZWQgPSAlZCwgY291bnRlZCA9ICV1XG4iLAogCQkJaSwgbGUxNl90b19jcHUoZ2RwLT5iZ19mcmVlX2Jsb2Nrc19jb3VudCksIHgpOwogCQliaXRtYXBfY291bnQgKz0geDsKIAl9CkBAIC04MTIsNyArNzA3LDcgQEAKIAkJZ2RwID0gZXh0NF9nZXRfZ3JvdXBfZGVzYyhzYiwgaSwgTlVMTCk7CiAJCWlmICghZ2RwKQogCQkJY29udGludWU7Ci0JCWRlc2NfY291bnQgKz0gbGUxNl90b19jcHUoZ2RwLT5iZ19mcmVlX2Jsb2Nrc19jb3VudCk7CisJCWRlc2NfY291bnQgKz0gZXh0NF9mcmVlX2Jsa3NfY291bnQoc2IsIGdkcCk7CiAJfQogCiAJcmV0dXJuIGRlc2NfY291bnQ7CmRpZmYgLS1naXQgYS9mcy9leHQ0L2JpdG1hcC5jIGIvZnMvZXh0NC9iaXRtYXAuYwppbmRleCAwYTdhNjY2Li5mYTNhZjgxIDEwMDY0NAotLS0gYS9mcy9leHQ0L2JpdG1hcC5jCisrKyBiL2ZzL2V4dDQvYml0bWFwLmMKQEAgLTE1LDEwICsxNSw5IEBACiAKIHN0YXRpYyBjb25zdCBpbnQgbmliYmxlbWFwW10gPSB7NCwgMywgMywgMiwgMywgMiwgMiwgMSwgMywgMiwgMiwgMSwgMiwgMSwgMSwgMH07CiAKLXVuc2lnbmVkIGxvbmcgZXh0NF9jb3VudF9mcmVlKHN0cnVjdCBidWZmZXJfaGVhZCAqbWFwLCB1bnNpZ25lZCBpbnQgbnVtY2hhcnMpCit1bnNpZ25lZCBpbnQgZXh0NF9jb3VudF9mcmVlKHN0cnVjdCBidWZmZXJfaGVhZCAqbWFwLCB1bnNpZ25lZCBpbnQgbnVtY2hhcnMpCiB7Ci0JdW5zaWduZWQgaW50IGk7Ci0JdW5zaWduZWQgbG9uZyBzdW0gPSAwOworCXVuc2lnbmVkIGludCBpLCBzdW0gPSAwOwogCiAJaWYgKCFtYXApCiAJCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZnMvZXh0NC9kaXIuYyBiL2ZzL2V4dDQvZGlyLmMKaW5kZXggZmVkNWI2MS4uMmRmMmU0MCAxMDA2NDQKLS0tIGEvZnMvZXh0NC9kaXIuYworKysgYi9mcy9leHQ0L2Rpci5jCkBAIC02NCw3ICs2NCw3IEBACiBpbnQgZXh0NF9jaGVja19kaXJfZW50cnkoY29uc3QgY2hhciAqZnVuY3Rpb24sIHN0cnVjdCBpbm9kZSAqZGlyLAogCQkJIHN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICpkZSwKIAkJCSBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLAotCQkJIHVuc2lnbmVkIGxvbmcgb2Zmc2V0KQorCQkJIHVuc2lnbmVkIGludCBvZmZzZXQpCiB7CiAJY29uc3QgY2hhciAqZXJyb3JfbXNnID0gTlVMTDsKIAljb25zdCBpbnQgcmxlbiA9IGV4dDRfcmVjX2xlbl9mcm9tX2Rpc2soZGUtPnJlY19sZW4pOwpAQCAtODQsOSArODQsOSBAQAogCWlmIChlcnJvcl9tc2cgIT0gTlVMTCkKIAkJZXh0NF9lcnJvcihkaXItPmlfc2IsIGZ1bmN0aW9uLAogCQkJImJhZCBlbnRyeSBpbiBkaXJlY3RvcnkgIyVsdTogJXMgLSAiCi0JCQkib2Zmc2V0PSVsdSwgaW5vZGU9JWx1LCByZWNfbGVuPSVkLCBuYW1lX2xlbj0lZCIsCisJCQkib2Zmc2V0PSV1LCBpbm9kZT0ldSwgcmVjX2xlbj0lZCwgbmFtZV9sZW49JWQiLAogCQkJZGlyLT5pX2lubywgZXJyb3JfbXNnLCBvZmZzZXQsCi0JCQkodW5zaWduZWQgbG9uZykgbGUzMl90b19jcHUoZGUtPmlub2RlKSwKKwkJCWxlMzJfdG9fY3B1KGRlLT5pbm9kZSksCiAJCQlybGVuLCBkZS0+bmFtZV9sZW4pOwogCXJldHVybiBlcnJvcl9tc2cgPT0gTlVMTCA/IDEgOiAwOwogfQpAQCAtOTUsNyArOTUsNyBAQAogCQkJIHZvaWQgKmRpcmVudCwgZmlsbGRpcl90IGZpbGxkaXIpCiB7CiAJaW50IGVycm9yID0gMDsKLQl1bnNpZ25lZCBsb25nIG9mZnNldDsKKwl1bnNpZ25lZCBpbnQgb2Zmc2V0OwogCWludCBpLCBzdG9yZWQ7CiAJc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKmRlOwogCXN0cnVjdCBzdXBlcl9ibG9jayAqc2I7CkBAIC00MDUsNyArNDA1LDcgQEAKIAlzYiA9IGlub2RlLT5pX3NiOwogCiAJaWYgKCFmbmFtZSkgewotCQlwcmludGsoS0VSTl9FUlIgImV4dDQ6IGNhbGxfZmlsbGRpcjogY2FsbGVkIHdpdGggIgorCQlwcmludGsoS0VSTl9FUlIgIkVYVDQtZnM6IGNhbGxfZmlsbGRpcjogY2FsbGVkIHdpdGggIgogCQkgICAgICAgIm51bGwgZm5hbWU/IT9cbiIpOwogCQlyZXR1cm4gMDsKIAl9CmRpZmYgLS1naXQgYS9mcy9leHQ0L2V4dDQuaCBiL2ZzL2V4dDQvZXh0NC5oCmluZGV4IDZjNDZjNjQuLmM2NjhlNDMgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDQvZXh0NC5oCisrKyBiL2ZzL2V4dDQvZXh0NC5oCkBAIC0xOSw2ICsxOSw3IEBACiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KICNpbmNsdWRlIDxsaW51eC9tYWdpYy5oPgorI2luY2x1ZGUgPGxpbnV4L2piZDIuaD4KICNpbmNsdWRlICJleHQ0X2kuaCIKIAogLyoKQEAgLTk0LDkgKzk1LDkgQEAKIAkvKiBwaHlzLiBibG9jayBmb3IgXl5eICovCiAJZXh0NF9mc2Jsa190IHByaWdodDsKIAkvKiBob3cgbWFueSBibG9ja3Mgd2Ugd2FudCB0byBhbGxvY2F0ZSAqLwotCXVuc2lnbmVkIGxvbmcgbGVuOworCXVuc2lnbmVkIGludCBsZW47CiAJLyogZmxhZ3MuIHNlZSBhYm92ZSBFWFQ0X01CX0hJTlRfKiAqLwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgaW50IGZsYWdzOwogfTsKIAogLyoKQEAgLTE1NiwxMiArMTU3LDEyIEBACiAJX19sZTMyCWJnX2Jsb2NrX2JpdG1hcF9sbzsJLyogQmxvY2tzIGJpdG1hcCBibG9jayAqLwogCV9fbGUzMgliZ19pbm9kZV9iaXRtYXBfbG87CS8qIElub2RlcyBiaXRtYXAgYmxvY2sgKi8KIAlfX2xlMzIJYmdfaW5vZGVfdGFibGVfbG87CS8qIElub2RlcyB0YWJsZSBibG9jayAqLwotCV9fbGUxNgliZ19mcmVlX2Jsb2Nrc19jb3VudDsJLyogRnJlZSBibG9ja3MgY291bnQgKi8KLQlfX2xlMTYJYmdfZnJlZV9pbm9kZXNfY291bnQ7CS8qIEZyZWUgaW5vZGVzIGNvdW50ICovCi0JX19sZTE2CWJnX3VzZWRfZGlyc19jb3VudDsJLyogRGlyZWN0b3JpZXMgY291bnQgKi8KKwlfX2xlMTYJYmdfZnJlZV9ibG9ja3NfY291bnRfbG87LyogRnJlZSBibG9ja3MgY291bnQgKi8KKwlfX2xlMTYJYmdfZnJlZV9pbm9kZXNfY291bnRfbG87LyogRnJlZSBpbm9kZXMgY291bnQgKi8KKwlfX2xlMTYJYmdfdXNlZF9kaXJzX2NvdW50X2xvOwkvKiBEaXJlY3RvcmllcyBjb3VudCAqLwogCV9fbGUxNgliZ19mbGFnczsJCS8qIEVYVDRfQkdfZmxhZ3MgKElOT0RFX1VOSU5JVCwgZXRjKSAqLwogCV9fdTMyCWJnX3Jlc2VydmVkWzJdOwkJLyogTGlrZWx5IGJsb2NrL2lub2RlIGJpdG1hcCBjaGVja3N1bSAqLwotCV9fbGUxNiAgYmdfaXRhYmxlX3VudXNlZDsJLyogVW51c2VkIGlub2RlcyBjb3VudCAqLworCV9fbGUxNiAgYmdfaXRhYmxlX3VudXNlZF9sbzsJLyogVW51c2VkIGlub2RlcyBjb3VudCAqLwogCV9fbGUxNiAgYmdfY2hlY2tzdW07CQkvKiBjcmMxNihzYl91dWlkK2dyb3VwK2Rlc2MpICovCiAJX19sZTMyCWJnX2Jsb2NrX2JpdG1hcF9oaTsJLyogQmxvY2tzIGJpdG1hcCBibG9jayBNU0IgKi8KIAlfX2xlMzIJYmdfaW5vZGVfYml0bWFwX2hpOwkvKiBJbm9kZXMgYml0bWFwIGJsb2NrIE1TQiAqLwpAQCAtMTY5LDcgKzE3MCw3IEBACiAJX19sZTE2CWJnX2ZyZWVfYmxvY2tzX2NvdW50X2hpOy8qIEZyZWUgYmxvY2tzIGNvdW50IE1TQiAqLwogCV9fbGUxNgliZ19mcmVlX2lub2Rlc19jb3VudF9oaTsvKiBGcmVlIGlub2RlcyBjb3VudCBNU0IgKi8KIAlfX2xlMTYJYmdfdXNlZF9kaXJzX2NvdW50X2hpOwkvKiBEaXJlY3RvcmllcyBjb3VudCBNU0IgKi8KLQlfX2xlMTYJYmdfaXRhYmxlX3VudXNlZF9oaTsJLyogVW51c2VkIGlub2RlcyBjb3VudCBNU0IgKi8KKwlfX2xlMTYgIGJnX2l0YWJsZV91bnVzZWRfaGk7ICAgIC8qIFVudXNlZCBpbm9kZXMgY291bnQgTVNCICovCiAJX191MzIJYmdfcmVzZXJ2ZWQyWzNdOwogfTsKIApAQCAtMzI4LDYgKzMyOSw3IEBACiAJdWlkX3Qgc19yZXN1aWQ7CiAJZ2lkX3Qgc19yZXNnaWQ7CiAJdW5zaWduZWQgbG9uZyBzX2NvbW1pdF9pbnRlcnZhbDsKKwl1MzIgc19taW5fYmF0Y2hfdGltZSwgc19tYXhfYmF0Y2hfdGltZTsKICNpZmRlZiBDT05GSUdfUVVPVEEKIAlpbnQgc19qcXVvdGFfZm10OwogCWNoYXIgKnNfcWZfbmFtZXNbTUFYUVVPVEFTXTsKQEAgLTUzNCw3ICs1MzYsNiBAQAogI2RlZmluZSBFWFQ0X01PVU5UX1FVT1RBCQkweDgwMDAwIC8qIFNvbWUgcXVvdGEgb3B0aW9uIHNldCAqLwogI2RlZmluZSBFWFQ0X01PVU5UX1VTUlFVT1RBCQkweDEwMDAwMCAvKiAib2xkIiB1c2VyIHF1b3RhICovCiAjZGVmaW5lIEVYVDRfTU9VTlRfR1JQUVVPVEEJCTB4MjAwMDAwIC8qICJvbGQiIGdyb3VwIHF1b3RhICovCi0jZGVmaW5lIEVYVDRfTU9VTlRfRVhURU5UUwkJMHg0MDAwMDAgLyogRXh0ZW50cyBzdXBwb3J0ICovCiAjZGVmaW5lIEVYVDRfTU9VTlRfSk9VUk5BTF9DSEVDS1NVTQkweDgwMDAwMCAvKiBKb3VybmFsIGNoZWNrc3VtcyAqLwogI2RlZmluZSBFWFQ0X01PVU5UX0pPVVJOQUxfQVNZTkNfQ09NTUlUCTB4MTAwMDAwMCAvKiBKb3VybmFsIEFzeW5jIENvbW1pdCAqLwogI2RlZmluZSBFWFQ0X01PVU5UX0lfVkVSU0lPTiAgICAgICAgICAgIDB4MjAwMDAwMCAvKiBpX3ZlcnNpb24gc3VwcG9ydCAqLwpAQCAtNzI2LDExICs3MjcsMTEgQEAKICAqLwogCiAjZGVmaW5lIEVYVDRfSEFTX0NPTVBBVF9GRUFUVVJFKHNiLG1hc2spCQkJXAotCShFWFQ0X1NCKHNiKS0+c19lcy0+c19mZWF0dXJlX2NvbXBhdCAmIGNwdV90b19sZTMyKG1hc2spKQorCSgoRVhUNF9TQihzYiktPnNfZXMtPnNfZmVhdHVyZV9jb21wYXQgJiBjcHVfdG9fbGUzMihtYXNrKSkgIT0gMCkKICNkZWZpbmUgRVhUNF9IQVNfUk9fQ09NUEFUX0ZFQVRVUkUoc2IsbWFzaykJCQlcCi0JKEVYVDRfU0Ioc2IpLT5zX2VzLT5zX2ZlYXR1cmVfcm9fY29tcGF0ICYgY3B1X3RvX2xlMzIobWFzaykpCisJKChFWFQ0X1NCKHNiKS0+c19lcy0+c19mZWF0dXJlX3JvX2NvbXBhdCAmIGNwdV90b19sZTMyKG1hc2spKSAhPSAwKQogI2RlZmluZSBFWFQ0X0hBU19JTkNPTVBBVF9GRUFUVVJFKHNiLG1hc2spCQkJXAotCShFWFQ0X1NCKHNiKS0+c19lcy0+c19mZWF0dXJlX2luY29tcGF0ICYgY3B1X3RvX2xlMzIobWFzaykpCisJKChFWFQ0X1NCKHNiKS0+c19lcy0+c19mZWF0dXJlX2luY29tcGF0ICYgY3B1X3RvX2xlMzIobWFzaykpICE9IDApCiAjZGVmaW5lIEVYVDRfU0VUX0NPTVBBVF9GRUFUVVJFKHNiLG1hc2spCQkJXAogCUVYVDRfU0Ioc2IpLT5zX2VzLT5zX2ZlYXR1cmVfY29tcGF0IHw9IGNwdV90b19sZTMyKG1hc2spCiAjZGVmaW5lIEVYVDRfU0VUX1JPX0NPTVBBVF9GRUFUVVJFKHNiLG1hc2spCQkJXApAQCAtODA2LDYgKzgwNywxMiBAQAogI2RlZmluZSBFWFQ0X0RFRk1fSk1PREVfV0JBQ0sJMHgwMDYwCiAKIC8qCisgKiBEZWZhdWx0IGpvdXJuYWwgYmF0Y2ggdGltZXMKKyAqLworI2RlZmluZSBFWFQ0X0RFRl9NSU5fQkFUQ0hfVElNRQkwCisjZGVmaW5lIEVYVDRfREVGX01BWF9CQVRDSF9USU1FCTE1MDAwIC8qIDE1bXMgKi8KKworLyoKICAqIFN0cnVjdHVyZSBvZiBhIGRpcmVjdG9yeSBlbnRyeQogICovCiAjZGVmaW5lIEVYVDRfTkFNRV9MRU4gMjU1CkBAIC04OTEsNiArODk4LDkgQEAKICNkZWZpbmUgRFhfSEFTSF9MRUdBQ1kJCTAKICNkZWZpbmUgRFhfSEFTSF9IQUxGX01ENAkxCiAjZGVmaW5lIERYX0hBU0hfVEVBCQkyCisjZGVmaW5lIERYX0hBU0hfTEVHQUNZX1VOU0lHTkVECTMKKyNkZWZpbmUgRFhfSEFTSF9IQUxGX01ENF9VTlNJR05FRAk0CisjZGVmaW5lIERYX0hBU0hfVEVBX1VOU0lHTkVECQk1CiAKICNpZmRlZiBfX0tFUk5FTF9fCiAKQEAgLTk1NSw3ICs5NjUsNyBAQAogI2RlZmluZSBFUlJfQkFEX0RYX0RJUgktNzUwMDAKIAogdm9pZCBleHQ0X2dldF9ncm91cF9ub19hbmRfb2Zmc2V0KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGV4dDRfZnNibGtfdCBibG9ja25yLAotCQkJdW5zaWduZWQgbG9uZyAqYmxvY2tncnBwLCBleHQ0X2dycGJsa190ICpvZmZzZXRwKTsKKwkJCWV4dDRfZ3JvdXBfdCAqYmxvY2tncnBwLCBleHQ0X2dycGJsa190ICpvZmZzZXRwKTsKIAogZXh0ZXJuIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZXh0NF9wcm9jX3Jvb3Q7CiAKQEAgLTk4Nyw2ICs5OTcsOSBAQAogIyBkZWZpbmUgQVRUUklCX05PUkVUCV9fYXR0cmlidXRlX18oKG5vcmV0dXJuKSkKICMgZGVmaW5lIE5PUkVUX0FORAlub3JldHVybiwKIAorLyogYml0bWFwLmMgKi8KK2V4dGVybiB1bnNpZ25lZCBpbnQgZXh0NF9jb3VudF9mcmVlKHN0cnVjdCBidWZmZXJfaGVhZCAqLCB1bnNpZ25lZCk7CisKIC8qIGJhbGxvYy5jICovCiBleHRlcm4gdW5zaWduZWQgaW50IGV4dDRfYmxvY2tfZ3JvdXAoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKIAkJCWV4dDRfZnNibGtfdCBibG9ja25yKTsKQEAgLTk5NSwyMCArMTAwOCwxNCBAQAogZXh0ZXJuIGludCBleHQ0X2JnX2hhc19zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBleHQ0X2dyb3VwX3QgZ3JvdXApOwogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgZXh0NF9iZ19udW1fZ2RiKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCiAJCQlleHQ0X2dyb3VwX3QgZ3JvdXApOwotZXh0ZXJuIGV4dDRfZnNibGtfdCBleHQ0X25ld19tZXRhX2Jsb2NrKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCi0JCQlleHQ0X2ZzYmxrX3QgZ29hbCwgaW50ICplcnJwKTsKIGV4dGVybiBleHQ0X2ZzYmxrX3QgZXh0NF9uZXdfbWV0YV9ibG9ja3MoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSwKIAkJCWV4dDRfZnNibGtfdCBnb2FsLCB1bnNpZ25lZCBsb25nICpjb3VudCwgaW50ICplcnJwKTsKLWV4dGVybiBleHQ0X2ZzYmxrX3QgZXh0NF9uZXdfYmxvY2tzKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCi0JCQkJCWV4dDRfbGJsa190IGlibG9jaywgZXh0NF9mc2Jsa190IGdvYWwsCi0JCQkJCXVuc2lnbmVkIGxvbmcgKmNvdW50LCBpbnQgKmVycnApOwogZXh0ZXJuIGludCBleHQ0X2NsYWltX2ZyZWVfYmxvY2tzKHN0cnVjdCBleHQ0X3NiX2luZm8gKnNiaSwgczY0IG5ibG9ja3MpOwogZXh0ZXJuIGludCBleHQ0X2hhc19mcmVlX2Jsb2NrcyhzdHJ1Y3QgZXh0NF9zYl9pbmZvICpzYmksIHM2NCBuYmxvY2tzKTsKIGV4dGVybiB2b2lkIGV4dDRfZnJlZV9ibG9ja3MoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSwKIAkJCWV4dDRfZnNibGtfdCBibG9jaywgdW5zaWduZWQgbG9uZyBjb3VudCwgaW50IG1ldGFkYXRhKTsKLWV4dGVybiB2b2lkIGV4dDRfZnJlZV9ibG9ja3Nfc2IoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKLQkJCQlleHQ0X2ZzYmxrX3QgYmxvY2ssIHVuc2lnbmVkIGxvbmcgY291bnQsCi0JCQkJdW5zaWduZWQgbG9uZyAqcGRxdW90X2ZyZWVkX2Jsb2Nrcyk7CitleHRlcm4gdm9pZCBleHQ0X2FkZF9ncm91cGJsb2NrcyhoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAorCQkJCWV4dDRfZnNibGtfdCBibG9jaywgdW5zaWduZWQgbG9uZyBjb3VudCk7CiBleHRlcm4gZXh0NF9mc2Jsa190IGV4dDRfY291bnRfZnJlZV9ibG9ja3Moc3RydWN0IHN1cGVyX2Jsb2NrICopOwogZXh0ZXJuIHZvaWQgZXh0NF9jaGVja19ibG9ja3NfYml0bWFwKHN0cnVjdCBzdXBlcl9ibG9jayAqKTsKIGV4dGVybiBzdHJ1Y3QgZXh0NF9ncm91cF9kZXNjICogZXh0NF9nZXRfZ3JvdXBfZGVzYyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYiwKQEAgLTEwMTksNyArMTAyNiw3IEBACiAvKiBkaXIuYyAqLwogZXh0ZXJuIGludCBleHQ0X2NoZWNrX2Rpcl9lbnRyeShjb25zdCBjaGFyICosIHN0cnVjdCBpbm9kZSAqLAogCQkJCXN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICosCi0JCQkJc3RydWN0IGJ1ZmZlcl9oZWFkICosIHVuc2lnbmVkIGxvbmcpOworCQkJCXN0cnVjdCBidWZmZXJfaGVhZCAqLCB1bnNpZ25lZCBpbnQpOwogZXh0ZXJuIGludCBleHQ0X2h0cmVlX3N0b3JlX2RpcmVudChzdHJ1Y3QgZmlsZSAqZGlyX2ZpbGUsIF9fdTMyIGhhc2gsCiAJCQkJICAgIF9fdTMyIG1pbm9yX2hhc2gsCiAJCQkJICAgIHN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICpkaXJlbnQpOwpAQCAtMTAzOSw3ICsxMDQ2LDYgQEAKIGV4dGVybiB1bnNpZ25lZCBsb25nIGV4dDRfY291bnRfZnJlZV9pbm9kZXMoc3RydWN0IHN1cGVyX2Jsb2NrICopOwogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgZXh0NF9jb3VudF9kaXJzKHN0cnVjdCBzdXBlcl9ibG9jayAqKTsKIGV4dGVybiB2b2lkIGV4dDRfY2hlY2tfaW5vZGVzX2JpdG1hcChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKik7Ci1leHRlcm4gdW5zaWduZWQgbG9uZyBleHQ0X2NvdW50X2ZyZWUoc3RydWN0IGJ1ZmZlcl9oZWFkICosIHVuc2lnbmVkKTsKIAogLyogbWJhbGxvYy5jICovCiBleHRlcm4gbG9uZyBleHQ0X21iX3N0YXRzOwpAQCAtMTA1NCwxMiArMTA2MCwxMyBAQAogZXh0ZXJuIHZvaWQgZXhpdF9leHQ0X21iYWxsb2Modm9pZCk7CiBleHRlcm4gdm9pZCBleHQ0X21iX2ZyZWVfYmxvY2tzKGhhbmRsZV90ICosIHN0cnVjdCBpbm9kZSAqLAogCQl1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nLCBpbnQsIHVuc2lnbmVkIGxvbmcgKik7Ci1leHRlcm4gaW50IGV4dDRfbWJfYWRkX21vcmVfZ3JvdXBpbmZvKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCitleHRlcm4gaW50IGV4dDRfbWJfYWRkX2dyb3VwaW5mbyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAogCQlleHQ0X2dyb3VwX3QgaSwgc3RydWN0IGV4dDRfZ3JvdXBfZGVzYyAqZGVzYyk7CiBleHRlcm4gdm9pZCBleHQ0X21iX3VwZGF0ZV9ncm91cF9pbmZvKHN0cnVjdCBleHQ0X2dyb3VwX2luZm8gKmdycCwKIAkJZXh0NF9ncnBibGtfdCBhZGQpOwotCi0KK2V4dGVybiBpbnQgZXh0NF9tYl9nZXRfYnVkZHlfY2FjaGVfbG9jayhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgZXh0NF9ncm91cF90KTsKK2V4dGVybiB2b2lkIGV4dDRfbWJfcHV0X2J1ZGR5X2NhY2hlX2xvY2soc3RydWN0IHN1cGVyX2Jsb2NrICosCisJCQkJCQlleHQ0X2dyb3VwX3QsIGludCk7CiAvKiBpbm9kZS5jICovCiBpbnQgZXh0NF9mb3JnZXQoaGFuZGxlX3QgKmhhbmRsZSwgaW50IGlzX21ldGFkYXRhLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAogCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCBleHQ0X2ZzYmxrX3QgYmxvY2tucik7CkBAIC0xMDY5LDEwICsxMDc2LDYgQEAKIAkJCQkJCWV4dDRfbGJsa190LCBpbnQsIGludCAqKTsKIGludCBleHQ0X2dldF9ibG9jayhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzZWN0b3JfdCBpYmxvY2ssCiAJCQkJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaF9yZXN1bHQsIGludCBjcmVhdGUpOwotaW50IGV4dDRfZ2V0X2Jsb2Nrc19oYW5kbGUoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSwKLQkJCQlleHQ0X2xibGtfdCBpYmxvY2ssIHVuc2lnbmVkIGxvbmcgbWF4YmxvY2tzLAotCQkJCXN0cnVjdCBidWZmZXJfaGVhZCAqYmhfcmVzdWx0LAotCQkJCWludCBjcmVhdGUsIGludCBleHRlbmRfZGlza3NpemUpOwogCiBleHRlcm4gc3RydWN0IGlub2RlICpleHQ0X2lnZXQoc3RydWN0IHN1cGVyX2Jsb2NrICosIHVuc2lnbmVkIGxvbmcpOwogZXh0ZXJuIGludCAgZXh0NF93cml0ZV9pbm9kZShzdHJ1Y3QgaW5vZGUgKiwgaW50KTsKQEAgLTExMjMsNiArMTEyNiw5IEBACiAJX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAzLCA0KSkpOwogZXh0ZXJuIHZvaWQgZXh0NF93YXJuaW5nKHN0cnVjdCBzdXBlcl9ibG9jayAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgLi4uKQogCV9fYXR0cmlidXRlX18gKChmb3JtYXQgKHByaW50ZiwgMywgNCkpKTsKK2V4dGVybiB2b2lkIGV4dDRfZ3JwX2xvY2tlZF9lcnJvcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgZXh0NF9ncm91cF90LAorCQkJCWNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCAuLi4pCisJX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCA0LCA1KSkpOwogZXh0ZXJuIHZvaWQgZXh0NF91cGRhdGVfZHluYW1pY19yZXYoc3RydWN0IHN1cGVyX2Jsb2NrICpzYik7CiBleHRlcm4gaW50IGV4dDRfdXBkYXRlX2NvbXBhdF9mZWF0dXJlKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCiAJCQkJCV9fdTMyIGNvbXBhdCk7CkBAIC0xMTM2LDEyICsxMTQyLDI4IEBACiAJCQkJICAgICAgc3RydWN0IGV4dDRfZ3JvdXBfZGVzYyAqYmcpOwogZXh0ZXJuIGV4dDRfZnNibGtfdCBleHQ0X2lub2RlX3RhYmxlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCiAJCQkJICAgICBzdHJ1Y3QgZXh0NF9ncm91cF9kZXNjICpiZyk7CitleHRlcm4gX191MzIgZXh0NF9mcmVlX2Jsa3NfY291bnQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwkJCQlzdHJ1Y3QgZXh0NF9ncm91cF9kZXNjICpiZyk7CitleHRlcm4gX191MzIgZXh0NF9mcmVlX2lub2Rlc19jb3VudChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAorCQkJCSBzdHJ1Y3QgZXh0NF9ncm91cF9kZXNjICpiZyk7CitleHRlcm4gX191MzIgZXh0NF91c2VkX2RpcnNfY291bnQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwkJCQlzdHJ1Y3QgZXh0NF9ncm91cF9kZXNjICpiZyk7CitleHRlcm4gX191MzIgZXh0NF9pdGFibGVfdW51c2VkX2NvdW50KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCisJCQkJICAgc3RydWN0IGV4dDRfZ3JvdXBfZGVzYyAqYmcpOwogZXh0ZXJuIHZvaWQgZXh0NF9ibG9ja19iaXRtYXBfc2V0KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCiAJCQkJICBzdHJ1Y3QgZXh0NF9ncm91cF9kZXNjICpiZywgZXh0NF9mc2Jsa190IGJsayk7CiBleHRlcm4gdm9pZCBleHQ0X2lub2RlX2JpdG1hcF9zZXQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKIAkJCQkgIHN0cnVjdCBleHQ0X2dyb3VwX2Rlc2MgKmJnLCBleHQ0X2ZzYmxrX3QgYmxrKTsKIGV4dGVybiB2b2lkIGV4dDRfaW5vZGVfdGFibGVfc2V0KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCiAJCQkJIHN0cnVjdCBleHQ0X2dyb3VwX2Rlc2MgKmJnLCBleHQ0X2ZzYmxrX3QgYmxrKTsKK2V4dGVybiB2b2lkIGV4dDRfZnJlZV9ibGtzX3NldChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAorCQkJICAgICAgIHN0cnVjdCBleHQ0X2dyb3VwX2Rlc2MgKmJnLCBfX3UzMiBjb3VudCk7CitleHRlcm4gdm9pZCBleHQ0X2ZyZWVfaW5vZGVzX3NldChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAorCQkJCXN0cnVjdCBleHQ0X2dyb3VwX2Rlc2MgKmJnLCBfX3UzMiBjb3VudCk7CitleHRlcm4gdm9pZCBleHQ0X3VzZWRfZGlyc19zZXQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwkJCQlzdHJ1Y3QgZXh0NF9ncm91cF9kZXNjICpiZywgX191MzIgY291bnQpOworZXh0ZXJuIHZvaWQgZXh0NF9pdGFibGVfdW51c2VkX3NldChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAorCQkJCSAgIHN0cnVjdCBleHQ0X2dyb3VwX2Rlc2MgKmJnLCBfX3UzMiBjb3VudCk7CiAKIHN0YXRpYyBpbmxpbmUgZXh0NF9mc2Jsa190IGV4dDRfYmxvY2tzX2NvdW50KHN0cnVjdCBleHQ0X3N1cGVyX2Jsb2NrICplcykKIHsKQEAgLTEyNDYsNiArMTI2OCw1MCBAQAogCXJldHVybiA7CiB9CiAKK3N0cnVjdCBleHQ0X2dyb3VwX2luZm8geworCXVuc2lnbmVkIGxvbmcgICBiYl9zdGF0ZTsKKwlzdHJ1Y3QgcmJfcm9vdCAgYmJfZnJlZV9yb290OworCXVuc2lnbmVkIHNob3J0ICBiYl9maXJzdF9mcmVlOworCXVuc2lnbmVkIHNob3J0ICBiYl9mcmVlOworCXVuc2lnbmVkIHNob3J0ICBiYl9mcmFnbWVudHM7CisJc3RydWN0ICAgICAgICAgIGxpc3RfaGVhZCBiYl9wcmVhbGxvY19saXN0OworI2lmZGVmIERPVUJMRV9DSEVDSworCXZvaWQgICAgICAgICAgICAqYmJfYml0bWFwOworI2VuZGlmCisJc3RydWN0IHJ3X3NlbWFwaG9yZSBhbGxvY19zZW07CisJdW5zaWduZWQgc2hvcnQgIGJiX2NvdW50ZXJzW107Cit9OworCisjZGVmaW5lIEVYVDRfR1JPVVBfSU5GT19ORUVEX0lOSVRfQklUCTAKKyNkZWZpbmUgRVhUNF9HUk9VUF9JTkZPX0xPQ0tFRF9CSVQJMQorCisjZGVmaW5lIEVYVDRfTUJfR1JQX05FRURfSU5JVChncnApCVwKKwkodGVzdF9iaXQoRVhUNF9HUk9VUF9JTkZPX05FRURfSU5JVF9CSVQsICYoKGdycCktPmJiX3N0YXRlKSkpCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBleHQ0X2xvY2tfZ3JvdXAoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgZXh0NF9ncm91cF90IGdyb3VwKQoreworCXN0cnVjdCBleHQ0X2dyb3VwX2luZm8gKmdyaW5mbyA9IGV4dDRfZ2V0X2dyb3VwX2luZm8oc2IsIGdyb3VwKTsKKworCWJpdF9zcGluX2xvY2soRVhUNF9HUk9VUF9JTkZPX0xPQ0tFRF9CSVQsICYoZ3JpbmZvLT5iYl9zdGF0ZSkpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZXh0NF91bmxvY2tfZ3JvdXAoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwkJCQkJZXh0NF9ncm91cF90IGdyb3VwKQoreworCXN0cnVjdCBleHQ0X2dyb3VwX2luZm8gKmdyaW5mbyA9IGV4dDRfZ2V0X2dyb3VwX2luZm8oc2IsIGdyb3VwKTsKKworCWJpdF9zcGluX3VubG9jayhFWFQ0X0dST1VQX0lORk9fTE9DS0VEX0JJVCwgJihncmluZm8tPmJiX3N0YXRlKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGV4dDRfaXNfZ3JvdXBfbG9ja2VkKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCisJCQkJCWV4dDRfZ3JvdXBfdCBncm91cCkKK3sKKwlzdHJ1Y3QgZXh0NF9ncm91cF9pbmZvICpncmluZm8gPSBleHQ0X2dldF9ncm91cF9pbmZvKHNiLCBncm91cCk7CisKKwlyZXR1cm4gYml0X3NwaW5faXNfbG9ja2VkKEVYVDRfR1JPVVBfSU5GT19MT0NLRURfQklULAorCQkJCQkJJihncmluZm8tPmJiX3N0YXRlKSk7Cit9CisKIC8qCiAgKiBJbm9kZXMgYW5kIGZpbGVzIG9wZXJhdGlvbnMKICAqLwpAQCAtMTI3MSwxOCArMTMzNywzOCBAQAogZXh0ZXJuIGludCBleHQ0X2V4dF9pbmRleF90cmFuc19ibG9ja3Moc3RydWN0IGlub2RlICppbm9kZSwgaW50IG5yYmxvY2tzLAogCQkJCSAgICAgICBpbnQgY2h1bmspOwogZXh0ZXJuIGludCBleHQ0X2V4dF9nZXRfYmxvY2tzKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCi0JCQlleHQ0X2xibGtfdCBpYmxvY2ssCi0JCQl1bnNpZ25lZCBsb25nIG1heF9ibG9ja3MsIHN0cnVjdCBidWZmZXJfaGVhZCAqYmhfcmVzdWx0LAotCQkJaW50IGNyZWF0ZSwgaW50IGV4dGVuZF9kaXNrc2l6ZSk7CisJCQkgICAgICAgZXh0NF9sYmxrX3QgaWJsb2NrLCB1bnNpZ25lZCBpbnQgbWF4X2Jsb2NrcywKKwkJCSAgICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoX3Jlc3VsdCwKKwkJCSAgICAgICBpbnQgY3JlYXRlLCBpbnQgZXh0ZW5kX2Rpc2tzaXplKTsKIGV4dGVybiB2b2lkIGV4dDRfZXh0X3RydW5jYXRlKHN0cnVjdCBpbm9kZSAqKTsKIGV4dGVybiB2b2lkIGV4dDRfZXh0X2luaXQoc3RydWN0IHN1cGVyX2Jsb2NrICopOwogZXh0ZXJuIHZvaWQgZXh0NF9leHRfcmVsZWFzZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKik7CiBleHRlcm4gbG9uZyBleHQ0X2ZhbGxvY2F0ZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgbW9kZSwgbG9mZl90IG9mZnNldCwKIAkJCSAgbG9mZl90IGxlbik7CiBleHRlcm4gaW50IGV4dDRfZ2V0X2Jsb2Nrc193cmFwKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCi0JCQlzZWN0b3JfdCBibG9jaywgdW5zaWduZWQgbG9uZyBtYXhfYmxvY2tzLAorCQkJc2VjdG9yX3QgYmxvY2ssIHVuc2lnbmVkIGludCBtYXhfYmxvY2tzLAogCQkJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwgaW50IGNyZWF0ZSwKIAkJCWludCBleHRlbmRfZGlza3NpemUsIGludCBmbGFnKTsKK2V4dGVybiBpbnQgZXh0NF9maWVtYXAoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpZW1hcF9leHRlbnRfaW5mbyAqZmllaW5mbywKKwkJCV9fdTY0IHN0YXJ0LCBfX3U2NCBsZW4pOworCisvKgorICogQWRkIG5ldyBtZXRob2QgdG8gdGVzdCB3ZXRoZXIgYmxvY2sgYW5kIGlub2RlIGJpdG1hcHMgYXJlIHByb3Blcmx5CisgKiBpbml0aWFsaXplZC4gV2l0aCB1bmluaXRfYmcgcmVhZGluZyB0aGUgYmxvY2sgZnJvbSBkaXNrIGlzIG5vdCBlbm91Z2gKKyAqIHRvIG1hcmsgdGhlIGJpdG1hcCB1cHRvZGF0ZS4gV2UgbmVlZCB0byBhbHNvIHplcm8tb3V0IHRoZSBiaXRtYXAKKyAqLworI2RlZmluZSBCSF9CSVRNQVBfVVBUT0RBVEUgQkhfSkJEUHJpdmF0ZVN0YXJ0CisKK3N0YXRpYyBpbmxpbmUgaW50IGJpdG1hcF91cHRvZGF0ZShzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQoreworCXJldHVybiAoYnVmZmVyX3VwdG9kYXRlKGJoKSAmJgorCQkJdGVzdF9iaXQoQkhfQklUTUFQX1VQVE9EQVRFLCAmKGJoKS0+Yl9zdGF0ZSkpOworfQorc3RhdGljIGlubGluZSB2b2lkIHNldF9iaXRtYXBfdXB0b2RhdGUoc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKK3sKKwlzZXRfYml0KEJIX0JJVE1BUF9VUFRPREFURSwgJihiaCktPmJfc3RhdGUpOworfQorCiAjZW5kaWYJLyogX19LRVJORUxfXyAqLwogCiAjZW5kaWYJLyogX0VYVDRfSCAqLwpkaWZmIC0tZ2l0IGEvZnMvZXh0NC9leHQ0X2V4dGVudHMuaCBiL2ZzL2V4dDQvZXh0NF9leHRlbnRzLmgKaW5kZXggYmVjN2NlNS4uMThjYjY3YiAxMDA2NDQKLS0tIGEvZnMvZXh0NC9leHQ0X2V4dGVudHMuaAorKysgYi9mcy9leHQ0L2V4dDRfZXh0ZW50cy5oCkBAIC0xOTQsMTEgKzE5NCw2IEBACiAJcmV0dXJuIGxlMTZfdG9fY3B1KGV4dF9pbm9kZV9oZHIoaW5vZGUpLT5laF9kZXB0aCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBleHQ0X2V4dF90cmVlX2NoYW5nZWQoc3RydWN0IGlub2RlICppbm9kZSkKLXsKLQlFWFQ0X0koaW5vZGUpLT5pX2V4dF9nZW5lcmF0aW9uKys7Ci19Ci0KIHN0YXRpYyBpbmxpbmUgdm9pZAogZXh0NF9leHRfaW52YWxpZGF0ZV9jYWNoZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQogewpkaWZmIC0tZ2l0IGEvZnMvZXh0NC9leHQ0X2kuaCBiL2ZzL2V4dDQvZXh0NF9pLmgKaW5kZXggNWMxMjRjMC4uZTY5YWNjMSAxMDA2NDQKLS0tIGEvZnMvZXh0NC9leHQ0X2kuaAorKysgYi9mcy9leHQ0L2V4dDRfaS5oCkBAIC0zMSw3ICszMSw3IEBACiB0eXBlZGVmIF9fdTMyIGV4dDRfbGJsa190OwogCiAvKiBkYXRhIHR5cGUgZm9yIGJsb2NrIGdyb3VwIG51bWJlciAqLwotdHlwZWRlZiB1bnNpZ25lZCBsb25nIGV4dDRfZ3JvdXBfdDsKK3R5cGVkZWYgdW5zaWduZWQgaW50IGV4dDRfZ3JvdXBfdDsKIAogI2RlZmluZSByc3Zfc3RhcnQgcnN2X3dpbmRvdy5fcnN2X3N0YXJ0CiAjZGVmaW5lIHJzdl9lbmQgcnN2X3dpbmRvdy5fcnN2X2VuZApAQCAtMTAwLDkgKzEwMCw2IEBACiAJICovCiAJbG9mZl90CWlfZGlza3NpemU7CiAKLQkvKiBvbi1kaXNrIGFkZGl0aW9uYWwgbGVuZ3RoICovCi0JX191MTYgaV9leHRyYV9pc2l6ZTsKLQogCS8qCiAJICogaV9kYXRhX3NlbSBpcyBmb3Igc2VyaWFsaXNpbmcgZXh0NF90cnVuY2F0ZSgpIGFnYWluc3QKIAkgKiBleHQ0X2dldGJsb2NrKCkuICBJbiB0aGUgMi40IGV4dDIgZGVzaWduLCBncmVhdCBjaHVua3Mgb2YgaW5vZGUncwpAQCAtMTE3LDcgKzExNCw2IEBACiAJc3RydWN0IGlub2RlIHZmc19pbm9kZTsKIAlzdHJ1Y3QgamJkMl9pbm9kZSBqaW5vZGU7CiAKLQl1bnNpZ25lZCBsb25nIGlfZXh0X2dlbmVyYXRpb247CiAJc3RydWN0IGV4dDRfZXh0X2NhY2hlIGlfY2FjaGVkX2V4dGVudDsKIAkvKgogCSAqIEZpbGUgY3JlYXRpb24gdGltZS4gSXRzIGZ1bmN0aW9uIGlzIHNhbWUgYXMgdGhhdCBvZgpAQCAtMTMwLDEwICsxMjYsMTQgQEAKIAlzcGlubG9ja190IGlfcHJlYWxsb2NfbG9jazsKIAogCS8qIGFsbG9jYXRpb24gcmVzZXJ2YXRpb24gaW5mbyBmb3IgZGVsYWxsb2MgKi8KLQl1bnNpZ25lZCBsb25nIGlfcmVzZXJ2ZWRfZGF0YV9ibG9ja3M7Ci0JdW5zaWduZWQgbG9uZyBpX3Jlc2VydmVkX21ldGFfYmxvY2tzOwotCXVuc2lnbmVkIGxvbmcgaV9hbGxvY2F0ZWRfbWV0YV9ibG9ja3M7CisJdW5zaWduZWQgaW50IGlfcmVzZXJ2ZWRfZGF0YV9ibG9ja3M7CisJdW5zaWduZWQgaW50IGlfcmVzZXJ2ZWRfbWV0YV9ibG9ja3M7CisJdW5zaWduZWQgaW50IGlfYWxsb2NhdGVkX21ldGFfYmxvY2tzOwogCXVuc2lnbmVkIHNob3J0IGlfZGVsYWxsb2NfcmVzZXJ2ZWRfZmxhZzsKKworCS8qIG9uLWRpc2sgYWRkaXRpb25hbCBsZW5ndGggKi8KKwlfX3UxNiBpX2V4dHJhX2lzaXplOworCiAJc3BpbmxvY2tfdCBpX2Jsb2NrX3Jlc2VydmF0aW9uX2xvY2s7CiB9OwogCmRpZmYgLS1naXQgYS9mcy9leHQ0L2V4dDRfamJkMi5jIGIvZnMvZXh0NC9leHQ0X2piZDIuYwppbmRleCBjNzUzODRiLi5hZDEzYTg0IDEwMDY0NAotLS0gYS9mcy9leHQ0L2V4dDRfamJkMi5jCisrKyBiL2ZzL2V4dDQvZXh0NF9qYmQyLmMKQEAgLTcsNTMgKzcsOTYgQEAKIGludCBfX2V4dDRfam91cm5hbF9nZXRfdW5kb19hY2Nlc3MoY29uc3QgY2hhciAqd2hlcmUsIGhhbmRsZV90ICpoYW5kbGUsCiAJCQkJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKIHsKLQlpbnQgZXJyID0gamJkMl9qb3VybmFsX2dldF91bmRvX2FjY2VzcyhoYW5kbGUsIGJoKTsKLQlpZiAoZXJyKQotCQlleHQ0X2pvdXJuYWxfYWJvcnRfaGFuZGxlKHdoZXJlLCBfX2Z1bmNfXywgYmgsIGhhbmRsZSwgZXJyKTsKKwlpbnQgZXJyID0gMDsKKworCWlmIChleHQ0X2hhbmRsZV92YWxpZChoYW5kbGUpKSB7CisJCWVyciA9IGpiZDJfam91cm5hbF9nZXRfdW5kb19hY2Nlc3MoaGFuZGxlLCBiaCk7CisJCWlmIChlcnIpCisJCQlleHQ0X2pvdXJuYWxfYWJvcnRfaGFuZGxlKHdoZXJlLCBfX2Z1bmNfXywgYmgsCisJCQkJCQkgIGhhbmRsZSwgZXJyKTsKKwl9CiAJcmV0dXJuIGVycjsKIH0KIAogaW50IF9fZXh0NF9qb3VybmFsX2dldF93cml0ZV9hY2Nlc3MoY29uc3QgY2hhciAqd2hlcmUsIGhhbmRsZV90ICpoYW5kbGUsCiAJCQkJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKIHsKLQlpbnQgZXJyID0gamJkMl9qb3VybmFsX2dldF93cml0ZV9hY2Nlc3MoaGFuZGxlLCBiaCk7Ci0JaWYgKGVycikKLQkJZXh0NF9qb3VybmFsX2Fib3J0X2hhbmRsZSh3aGVyZSwgX19mdW5jX18sIGJoLCBoYW5kbGUsIGVycik7CisJaW50IGVyciA9IDA7CisKKwlpZiAoZXh0NF9oYW5kbGVfdmFsaWQoaGFuZGxlKSkgeworCQllcnIgPSBqYmQyX2pvdXJuYWxfZ2V0X3dyaXRlX2FjY2VzcyhoYW5kbGUsIGJoKTsKKwkJaWYgKGVycikKKwkJCWV4dDRfam91cm5hbF9hYm9ydF9oYW5kbGUod2hlcmUsIF9fZnVuY19fLCBiaCwKKwkJCQkJCSAgaGFuZGxlLCBlcnIpOworCX0KIAlyZXR1cm4gZXJyOwogfQogCiBpbnQgX19leHQ0X2pvdXJuYWxfZm9yZ2V0KGNvbnN0IGNoYXIgKndoZXJlLCBoYW5kbGVfdCAqaGFuZGxlLAogCQkJCXN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCiB7Ci0JaW50IGVyciA9IGpiZDJfam91cm5hbF9mb3JnZXQoaGFuZGxlLCBiaCk7Ci0JaWYgKGVycikKLQkJZXh0NF9qb3VybmFsX2Fib3J0X2hhbmRsZSh3aGVyZSwgX19mdW5jX18sIGJoLCBoYW5kbGUsIGVycik7CisJaW50IGVyciA9IDA7CisKKwlpZiAoZXh0NF9oYW5kbGVfdmFsaWQoaGFuZGxlKSkgeworCQllcnIgPSBqYmQyX2pvdXJuYWxfZm9yZ2V0KGhhbmRsZSwgYmgpOworCQlpZiAoZXJyKQorCQkJZXh0NF9qb3VybmFsX2Fib3J0X2hhbmRsZSh3aGVyZSwgX19mdW5jX18sIGJoLAorCQkJCQkJICBoYW5kbGUsIGVycik7CisJfQogCXJldHVybiBlcnI7CiB9CiAKIGludCBfX2V4dDRfam91cm5hbF9yZXZva2UoY29uc3QgY2hhciAqd2hlcmUsIGhhbmRsZV90ICpoYW5kbGUsCiAJCQkJZXh0NF9mc2Jsa190IGJsb2NrbnIsIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCiB7Ci0JaW50IGVyciA9IGpiZDJfam91cm5hbF9yZXZva2UoaGFuZGxlLCBibG9ja25yLCBiaCk7Ci0JaWYgKGVycikKLQkJZXh0NF9qb3VybmFsX2Fib3J0X2hhbmRsZSh3aGVyZSwgX19mdW5jX18sIGJoLCBoYW5kbGUsIGVycik7CisJaW50IGVyciA9IDA7CisKKwlpZiAoZXh0NF9oYW5kbGVfdmFsaWQoaGFuZGxlKSkgeworCQllcnIgPSBqYmQyX2pvdXJuYWxfcmV2b2tlKGhhbmRsZSwgYmxvY2tuciwgYmgpOworCQlpZiAoZXJyKQorCQkJZXh0NF9qb3VybmFsX2Fib3J0X2hhbmRsZSh3aGVyZSwgX19mdW5jX18sIGJoLAorCQkJCQkJICBoYW5kbGUsIGVycik7CisJfQogCXJldHVybiBlcnI7CiB9CiAKIGludCBfX2V4dDRfam91cm5hbF9nZXRfY3JlYXRlX2FjY2Vzcyhjb25zdCBjaGFyICp3aGVyZSwKIAkJCQloYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQogewotCWludCBlcnIgPSBqYmQyX2pvdXJuYWxfZ2V0X2NyZWF0ZV9hY2Nlc3MoaGFuZGxlLCBiaCk7Ci0JaWYgKGVycikKLQkJZXh0NF9qb3VybmFsX2Fib3J0X2hhbmRsZSh3aGVyZSwgX19mdW5jX18sIGJoLCBoYW5kbGUsIGVycik7CisJaW50IGVyciA9IDA7CisKKwlpZiAoZXh0NF9oYW5kbGVfdmFsaWQoaGFuZGxlKSkgeworCQllcnIgPSBqYmQyX2pvdXJuYWxfZ2V0X2NyZWF0ZV9hY2Nlc3MoaGFuZGxlLCBiaCk7CisJCWlmIChlcnIpCisJCQlleHQ0X2pvdXJuYWxfYWJvcnRfaGFuZGxlKHdoZXJlLCBfX2Z1bmNfXywgYmgsCisJCQkJCQkgIGhhbmRsZSwgZXJyKTsKKwl9CiAJcmV0dXJuIGVycjsKIH0KIAotaW50IF9fZXh0NF9qb3VybmFsX2RpcnR5X21ldGFkYXRhKGNvbnN0IGNoYXIgKndoZXJlLAotCQkJCWhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCitpbnQgX19leHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YShjb25zdCBjaGFyICp3aGVyZSwgaGFuZGxlX3QgKmhhbmRsZSwKKwkJCQkgc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKIHsKLQlpbnQgZXJyID0gamJkMl9qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgYmgpOwotCWlmIChlcnIpCi0JCWV4dDRfam91cm5hbF9hYm9ydF9oYW5kbGUod2hlcmUsIF9fZnVuY19fLCBiaCwgaGFuZGxlLCBlcnIpOworCWludCBlcnIgPSAwOworCisJaWYgKGV4dDRfaGFuZGxlX3ZhbGlkKGhhbmRsZSkpIHsKKwkJZXJyID0gamJkMl9qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgYmgpOworCQlpZiAoZXJyKQorCQkJZXh0NF9qb3VybmFsX2Fib3J0X2hhbmRsZSh3aGVyZSwgX19mdW5jX18sIGJoLAorCQkJCQkJICBoYW5kbGUsIGVycik7CisJfSBlbHNlIHsKKwkJbWFya19idWZmZXJfZGlydHkoYmgpOworCQlpZiAoaW5vZGUgJiYgaW5vZGVfbmVlZHNfc3luYyhpbm9kZSkpIHsKKwkJCXN5bmNfZGlydHlfYnVmZmVyKGJoKTsKKwkJCWlmIChidWZmZXJfcmVxKGJoKSAmJiAhYnVmZmVyX3VwdG9kYXRlKGJoKSkgeworCQkJCWV4dDRfZXJyb3IoaW5vZGUtPmlfc2IsIF9fZnVuY19fLAorCQkJCQkgICAiSU8gZXJyb3Igc3luY2luZyBpbm9kZSwgIgorCQkJCQkgICAiaW5vZGU9JWx1LCBibG9jaz0lbGx1IiwKKwkJCQkJICAgaW5vZGUtPmlfaW5vLAorCQkJCQkgICAodW5zaWduZWQgbG9uZyBsb25nKSBiaC0+Yl9ibG9ja25yKTsKKwkJCQllcnIgPSAtRUlPOworCQkJfQorCQl9CisJfQogCXJldHVybiBlcnI7CiB9CmRpZmYgLS1naXQgYS9mcy9leHQ0L2V4dDRfamJkMi5oIGIvZnMvZXh0NC9leHQ0X2piZDIuaAppbmRleCBiNDU1YzY4Li5iZTJmNDI2IDEwMDY0NAotLS0gYS9mcy9leHQ0L2V4dDRfamJkMi5oCisrKyBiL2ZzL2V4dDQvZXh0NF9qYmQyLmgKQEAgLTMyLDggKzMyLDggQEAKICAqIDUgbGV2ZWxzIG9mIHRyZWUgKyByb290IHdoaWNoIGFyZSBzdG9yZWQgaW4gdGhlIGlub2RlLiAqLwogCiAjZGVmaW5lIEVYVDRfU0lOR0xFREFUQV9UUkFOU19CTE9DS1Moc2IpCQkJCVwKLQkoRVhUNF9IQVNfSU5DT01QQVRfRkVBVFVSRShzYiwgRVhUNF9GRUFUVVJFX0lOQ09NUEFUX0VYVEVOVFMpCVwKLQkJfHwgdGVzdF9vcHQoc2IsIEVYVEVOVFMpID8gMjdVIDogOFUpCisJKEVYVDRfSEFTX0lOQ09NUEFUX0ZFQVRVUkUoc2IsIEVYVDRfRkVBVFVSRV9JTkNPTVBBVF9FWFRFTlRTKSAgIFwKKwkgPyAyN1UgOiA4VSkKIAogLyogRXh0ZW5kZWQgYXR0cmlidXRlIG9wZXJhdGlvbnMgdG91Y2ggYXQgbW9zdCB0d28gZGF0YSBidWZmZXJzLAogICogdHdvIGJpdG1hcCBidWZmZXJzLCBhbmQgdHdvIGdyb3VwIHN1bW1hcmllcywgaW4gYWRkaXRpb24gdG8gdGhlIGlub2RlCkBAIC0xMjIsMTIgKzEyMiw2IEBACiAgKiBiZWVuIGRvbmUgeWV0LgogICovCiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBleHQ0X2pvdXJuYWxfcmVsZWFzZV9idWZmZXIoaGFuZGxlX3QgKmhhbmRsZSwKLQkJCQkJCXN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCi17Ci0JamJkMl9qb3VybmFsX3JlbGVhc2VfYnVmZmVyKGhhbmRsZSwgYmgpOwotfQotCiB2b2lkIGV4dDRfam91cm5hbF9hYm9ydF9oYW5kbGUoY29uc3QgY2hhciAqY2FsbGVyLCBjb25zdCBjaGFyICplcnJfZm4sCiAJCXN0cnVjdCBidWZmZXJfaGVhZCAqYmgsIGhhbmRsZV90ICpoYW5kbGUsIGludCBlcnIpOwogCkBAIC0xNDYsOCArMTQwLDggQEAKIGludCBfX2V4dDRfam91cm5hbF9nZXRfY3JlYXRlX2FjY2Vzcyhjb25zdCBjaGFyICp3aGVyZSwKIAkJCQloYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKTsKIAotaW50IF9fZXh0NF9qb3VybmFsX2RpcnR5X21ldGFkYXRhKGNvbnN0IGNoYXIgKndoZXJlLAotCQkJCWhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpOworaW50IF9fZXh0NF9oYW5kbGVfZGlydHlfbWV0YWRhdGEoY29uc3QgY2hhciAqd2hlcmUsIGhhbmRsZV90ICpoYW5kbGUsCisJCQkJIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpOwogCiAjZGVmaW5lIGV4dDRfam91cm5hbF9nZXRfdW5kb19hY2Nlc3MoaGFuZGxlLCBiaCkgXAogCV9fZXh0NF9qb3VybmFsX2dldF91bmRvX2FjY2VzcyhfX2Z1bmNfXywgKGhhbmRsZSksIChiaCkpCkBAIC0xNTcsMTQgKzE1MSw1NyBAQAogCV9fZXh0NF9qb3VybmFsX3Jldm9rZShfX2Z1bmNfXywgKGhhbmRsZSksIChibG9ja25yKSwgKGJoKSkKICNkZWZpbmUgZXh0NF9qb3VybmFsX2dldF9jcmVhdGVfYWNjZXNzKGhhbmRsZSwgYmgpIFwKIAlfX2V4dDRfam91cm5hbF9nZXRfY3JlYXRlX2FjY2VzcyhfX2Z1bmNfXywgKGhhbmRsZSksIChiaCkpCi0jZGVmaW5lIGV4dDRfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGJoKSBcCi0JX19leHQ0X2pvdXJuYWxfZGlydHlfbWV0YWRhdGEoX19mdW5jX18sIChoYW5kbGUpLCAoYmgpKQogI2RlZmluZSBleHQ0X2pvdXJuYWxfZm9yZ2V0KGhhbmRsZSwgYmgpIFwKIAlfX2V4dDRfam91cm5hbF9mb3JnZXQoX19mdW5jX18sIChoYW5kbGUpLCAoYmgpKQorI2RlZmluZSBleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGlub2RlLCBiaCkgXAorCV9fZXh0NF9oYW5kbGVfZGlydHlfbWV0YWRhdGEoX19mdW5jX18sIChoYW5kbGUpLCAoaW5vZGUpLCAoYmgpKQogCiBoYW5kbGVfdCAqZXh0NF9qb3VybmFsX3N0YXJ0X3NiKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCBuYmxvY2tzKTsKIGludCBfX2V4dDRfam91cm5hbF9zdG9wKGNvbnN0IGNoYXIgKndoZXJlLCBoYW5kbGVfdCAqaGFuZGxlKTsKIAorI2RlZmluZSBFWFQ0X05PSk9VUk5BTF9IQU5ETEUJKChoYW5kbGVfdCAqKSAweDEpCisKK3N0YXRpYyBpbmxpbmUgaW50IGV4dDRfaGFuZGxlX3ZhbGlkKGhhbmRsZV90ICpoYW5kbGUpCit7CisJaWYgKGhhbmRsZSA9PSBFWFQ0X05PSk9VUk5BTF9IQU5ETEUpCisJCXJldHVybiAwOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZXh0NF9oYW5kbGVfc3luYyhoYW5kbGVfdCAqaGFuZGxlKQoreworCWlmIChleHQ0X2hhbmRsZV92YWxpZChoYW5kbGUpKQorCQloYW5kbGUtPmhfc3luYyA9IDE7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBleHQ0X2hhbmRsZV9yZWxlYXNlX2J1ZmZlcihoYW5kbGVfdCAqaGFuZGxlLAorCQkJCQkJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKK3sKKwlpZiAoZXh0NF9oYW5kbGVfdmFsaWQoaGFuZGxlKSkKKwkJamJkMl9qb3VybmFsX3JlbGVhc2VfYnVmZmVyKGhhbmRsZSwgYmgpOworfQorCitzdGF0aWMgaW5saW5lIGludCBleHQ0X2hhbmRsZV9pc19hYm9ydGVkKGhhbmRsZV90ICpoYW5kbGUpCit7CisJaWYgKGV4dDRfaGFuZGxlX3ZhbGlkKGhhbmRsZSkpCisJCXJldHVybiBpc19oYW5kbGVfYWJvcnRlZChoYW5kbGUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBleHQ0X2hhbmRsZV9oYXNfZW5vdWdoX2NyZWRpdHMoaGFuZGxlX3QgKmhhbmRsZSwgaW50IG5lZWRlZCkKK3sKKwlpZiAoZXh0NF9oYW5kbGVfdmFsaWQoaGFuZGxlKSAmJiBoYW5kbGUtPmhfYnVmZmVyX2NyZWRpdHMgPCBuZWVkZWQpCisJCXJldHVybiAwOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZXh0NF9qb3VybmFsX3JlbGVhc2VfYnVmZmVyKGhhbmRsZV90ICpoYW5kbGUsCisJCQkJCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQoreworCWlmIChleHQ0X2hhbmRsZV92YWxpZChoYW5kbGUpKQorCQlqYmQyX2pvdXJuYWxfcmVsZWFzZV9idWZmZXIoaGFuZGxlLCBiaCk7Cit9CisKIHN0YXRpYyBpbmxpbmUgaGFuZGxlX3QgKmV4dDRfam91cm5hbF9zdGFydChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgbmJsb2NrcykKIHsKIAlyZXR1cm4gZXh0NF9qb3VybmFsX3N0YXJ0X3NiKGlub2RlLT5pX3NiLCBuYmxvY2tzKTsKQEAgLTE4MCwyNyArMjE3LDM3IEBACiAKIHN0YXRpYyBpbmxpbmUgaW50IGV4dDRfam91cm5hbF9leHRlbmQoaGFuZGxlX3QgKmhhbmRsZSwgaW50IG5ibG9ja3MpCiB7Ci0JcmV0dXJuIGpiZDJfam91cm5hbF9leHRlbmQoaGFuZGxlLCBuYmxvY2tzKTsKKwlpZiAoZXh0NF9oYW5kbGVfdmFsaWQoaGFuZGxlKSkKKwkJcmV0dXJuIGpiZDJfam91cm5hbF9leHRlbmQoaGFuZGxlLCBuYmxvY2tzKTsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGlubGluZSBpbnQgZXh0NF9qb3VybmFsX3Jlc3RhcnQoaGFuZGxlX3QgKmhhbmRsZSwgaW50IG5ibG9ja3MpCiB7Ci0JcmV0dXJuIGpiZDJfam91cm5hbF9yZXN0YXJ0KGhhbmRsZSwgbmJsb2Nrcyk7CisJaWYgKGV4dDRfaGFuZGxlX3ZhbGlkKGhhbmRsZSkpCisJCXJldHVybiBqYmQyX2pvdXJuYWxfcmVzdGFydChoYW5kbGUsIG5ibG9ja3MpOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW5saW5lIGludCBleHQ0X2pvdXJuYWxfYmxvY2tzX3Blcl9wYWdlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7Ci0JcmV0dXJuIGpiZDJfam91cm5hbF9ibG9ja3NfcGVyX3BhZ2UoaW5vZGUpOworCWlmIChFWFQ0X0pPVVJOQUwoaW5vZGUpICE9IE5VTEwpCisJCXJldHVybiBqYmQyX2pvdXJuYWxfYmxvY2tzX3Blcl9wYWdlKGlub2RlKTsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGlubGluZSBpbnQgZXh0NF9qb3VybmFsX2ZvcmNlX2NvbW1pdChqb3VybmFsX3QgKmpvdXJuYWwpCiB7Ci0JcmV0dXJuIGpiZDJfam91cm5hbF9mb3JjZV9jb21taXQoam91cm5hbCk7CisJaWYgKGpvdXJuYWwpCisJCXJldHVybiBqYmQyX2pvdXJuYWxfZm9yY2VfY29tbWl0KGpvdXJuYWwpOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW5saW5lIGludCBleHQ0X2piZDJfZmlsZV9pbm9kZShoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlKQogewotCXJldHVybiBqYmQyX2pvdXJuYWxfZmlsZV9pbm9kZShoYW5kbGUsICZFWFQ0X0koaW5vZGUpLT5qaW5vZGUpOworCWlmIChleHQ0X2hhbmRsZV92YWxpZChoYW5kbGUpKQorCQlyZXR1cm4gamJkMl9qb3VybmFsX2ZpbGVfaW5vZGUoaGFuZGxlLCAmRVhUNF9JKGlub2RlKS0+amlub2RlKTsKKwlyZXR1cm4gMDsKIH0KIAogLyogc3VwZXIuYyAqLwpAQCAtMjA4LDYgKzI1NSw4IEBACiAKIHN0YXRpYyBpbmxpbmUgaW50IGV4dDRfc2hvdWxkX2pvdXJuYWxfZGF0YShzdHJ1Y3QgaW5vZGUgKmlub2RlKQogeworCWlmIChFWFQ0X0pPVVJOQUwoaW5vZGUpID09IE5VTEwpCisJCXJldHVybiAwOwogCWlmICghU19JU1JFRyhpbm9kZS0+aV9tb2RlKSkKIAkJcmV0dXJuIDE7CiAJaWYgKHRlc3Rfb3B0KGlub2RlLT5pX3NiLCBEQVRBX0ZMQUdTKSA9PSBFWFQ0X01PVU5UX0pPVVJOQUxfREFUQSkKQEAgLTIxOSw2ICsyNjgsOCBAQAogCiBzdGF0aWMgaW5saW5lIGludCBleHQ0X3Nob3VsZF9vcmRlcl9kYXRhKHN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7CisJaWYgKEVYVDRfSk9VUk5BTChpbm9kZSkgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CiAJaWYgKCFTX0lTUkVHKGlub2RlLT5pX21vZGUpKQogCQlyZXR1cm4gMDsKIAlpZiAoRVhUNF9JKGlub2RlKS0+aV9mbGFncyAmIEVYVDRfSk9VUk5BTF9EQVRBX0ZMKQpAQCAtMjMwLDYgKzI4MSw4IEBACiAKIHN0YXRpYyBpbmxpbmUgaW50IGV4dDRfc2hvdWxkX3dyaXRlYmFja19kYXRhKHN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7CisJaWYgKEVYVDRfSk9VUk5BTChpbm9kZSkgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CiAJaWYgKCFTX0lTUkVHKGlub2RlLT5pX21vZGUpKQogCQlyZXR1cm4gMDsKIAlpZiAoRVhUNF9JKGlub2RlKS0+aV9mbGFncyAmIEVYVDRfSk9VUk5BTF9EQVRBX0ZMKQpkaWZmIC0tZ2l0IGEvZnMvZXh0NC9leHQ0X3NiLmggYi9mcy9leHQ0L2V4dDRfc2IuaAppbmRleCBiMjFmMTY3Li4wMzliNmVhIDEwMDY0NAotLS0gYS9mcy9leHQ0L2V4dDRfc2IuaAorKysgYi9mcy9leHQ0L2V4dDRfc2IuaApAQCAtNTcsNiArNTcsNyBAQAogCXUzMiBzX25leHRfZ2VuZXJhdGlvbjsKIAl1MzIgc19oYXNoX3NlZWRbNF07CiAJaW50IHNfZGVmX2hhc2hfdmVyc2lvbjsKKwlpbnQgc19oYXNoX3Vuc2lnbmVkOwkvKiAzIGlmIGhhc2ggc2hvdWxkIGJlIHNpZ25lZCwgMCBpZiBub3QgKi8KIAlzdHJ1Y3QgcGVyY3B1X2NvdW50ZXIgc19mcmVlYmxvY2tzX2NvdW50ZXI7CiAJc3RydWN0IHBlcmNwdV9jb3VudGVyIHNfZnJlZWlub2Rlc19jb3VudGVyOwogCXN0cnVjdCBwZXJjcHVfY291bnRlciBzX2RpcnNfY291bnRlcjsKQEAgLTczLDYgKzc0LDggQEAKIAlzdHJ1Y3Qgam91cm5hbF9zICpzX2pvdXJuYWw7CiAJc3RydWN0IGxpc3RfaGVhZCBzX29ycGhhbjsKIAl1bnNpZ25lZCBsb25nIHNfY29tbWl0X2ludGVydmFsOworCXUzMiBzX21heF9iYXRjaF90aW1lOworCXUzMiBzX21pbl9iYXRjaF90aW1lOwogCXN0cnVjdCBibG9ja19kZXZpY2UgKmpvdXJuYWxfYmRldjsKICNpZmRlZiBDT05GSUdfSkJEMl9ERUJVRwogCXN0cnVjdCB0aW1lcl9saXN0IHR1cm5fcm9fdGltZXI7CS8qIEZvciB0dXJuaW5nIHJlYWQtb25seSAoY3Jhc2ggc2ltdWxhdGlvbikgKi8KQEAgLTEwMSw3ICsxMDQsOCBAQAogCXNwaW5sb2NrX3Qgc19yZXNlcnZlX2xvY2s7CiAJc3BpbmxvY2tfdCBzX21kX2xvY2s7CiAJdGlkX3Qgc19sYXN0X3RyYW5zYWN0aW9uOwotCXVuc2lnbmVkIHNob3J0ICpzX21iX29mZnNldHMsICpzX21iX21heHM7CisJdW5zaWduZWQgc2hvcnQgKnNfbWJfb2Zmc2V0czsKKwl1bnNpZ25lZCBpbnQgKnNfbWJfbWF4czsKIAogCS8qIHR1bmFibGVzICovCiAJdW5zaWduZWQgbG9uZyBzX3N0cmlwZTsKZGlmZiAtLWdpdCBhL2ZzL2V4dDQvZXh0ZW50cy5jIGIvZnMvZXh0NC9leHRlbnRzLmMKaW5kZXggZWEyY2UzYy4uNTRiZjA2MiAxMDA2NDQKLS0tIGEvZnMvZXh0NC9leHRlbnRzLmMKKysrIGIvZnMvZXh0NC9leHRlbnRzLmMKQEAgLTk3LDYgKzk3LDggQEAKIHsKIAlpbnQgZXJyOwogCisJaWYgKCFleHQ0X2hhbmRsZV92YWxpZChoYW5kbGUpKQorCQlyZXR1cm4gMDsKIAlpZiAoaGFuZGxlLT5oX2J1ZmZlcl9jcmVkaXRzID4gbmVlZGVkKQogCQlyZXR1cm4gMDsKIAllcnIgPSBleHQ0X2pvdXJuYWxfZXh0ZW5kKGhhbmRsZSwgbmVlZGVkKTsKQEAgLTEzNCw3ICsxMzYsNyBAQAogCWludCBlcnI7CiAJaWYgKHBhdGgtPnBfYmgpIHsKIAkJLyogcGF0aCBwb2ludHMgdG8gYmxvY2sgKi8KLQkJZXJyID0gZXh0NF9qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgcGF0aC0+cF9iaCk7CisJCWVyciA9IGV4dDRfaGFuZGxlX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgaW5vZGUsIHBhdGgtPnBfYmgpOwogCX0gZWxzZSB7CiAJCS8qIHBhdGggcG9pbnRzIHRvIGxlYWYvaW5kZXggaW4gaW5vZGUgYm9keSAqLwogCQllcnIgPSBleHQ0X21hcmtfaW5vZGVfZGlydHkoaGFuZGxlLCBpbm9kZSk7CkBAIC0xOTEsNyArMTkzLDcgQEAKIAlleHQ0X2ZzYmxrX3QgZ29hbCwgbmV3YmxvY2s7CiAKIAlnb2FsID0gZXh0NF9leHRfZmluZF9nb2FsKGlub2RlLCBwYXRoLCBsZTMyX3RvX2NwdShleC0+ZWVfYmxvY2spKTsKLQluZXdibG9jayA9IGV4dDRfbmV3X21ldGFfYmxvY2soaGFuZGxlLCBpbm9kZSwgZ29hbCwgZXJyKTsKKwluZXdibG9jayA9IGV4dDRfbmV3X21ldGFfYmxvY2tzKGhhbmRsZSwgaW5vZGUsIGdvYWwsIE5VTEwsIGVycik7CiAJcmV0dXJuIG5ld2Jsb2NrOwogfQogCkBAIC03ODAsNyArNzgyLDcgQEAKIAlzZXRfYnVmZmVyX3VwdG9kYXRlKGJoKTsKIAl1bmxvY2tfYnVmZmVyKGJoKTsKIAotCWVyciA9IGV4dDRfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGJoKTsKKwllcnIgPSBleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGlub2RlLCBiaCk7CiAJaWYgKGVycikKIAkJZ290byBjbGVhbnVwOwogCWJyZWxzZShiaCk7CkBAIC04NTksNyArODYxLDcgQEAKIAkJc2V0X2J1ZmZlcl91cHRvZGF0ZShiaCk7CiAJCXVubG9ja19idWZmZXIoYmgpOwogCi0JCWVyciA9IGV4dDRfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGJoKTsKKwkJZXJyID0gZXh0NF9oYW5kbGVfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBpbm9kZSwgYmgpOwogCQlpZiAoZXJyKQogCQkJZ290byBjbGVhbnVwOwogCQlicmVsc2UoYmgpOwpAQCAtOTU1LDcgKzk1Nyw3IEBACiAJc2V0X2J1ZmZlcl91cHRvZGF0ZShiaCk7CiAJdW5sb2NrX2J1ZmZlcihiaCk7CiAKLQllcnIgPSBleHQ0X2pvdXJuYWxfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBiaCk7CisJZXJyID0gZXh0NF9oYW5kbGVfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBpbm9kZSwgYmgpOwogCWlmIChlcnIpCiAJCWdvdG8gb3V0OwogCkBAIC0xMTYwLDE1ICsxMTYyLDEzIEBACiAJd2hpbGUgKC0tZGVwdGggPj0gMCkgewogCQlpeCA9IHBhdGhbZGVwdGhdLnBfaWR4OwogCQlpZiAoaXggIT0gRVhUX0xBU1RfSU5ERVgocGF0aFtkZXB0aF0ucF9oZHIpKQotCQkJYnJlYWs7CisJCQlnb3RvIGdvdF9pbmRleDsKIAl9CiAKLQlpZiAoZGVwdGggPCAwKSB7Ci0JCS8qIHdlJ3ZlIGdvbmUgdXAgdG8gdGhlIHJvb3QgYW5kCi0JCSAqIGZvdW5kIG5vIGluZGV4IHRvIHRoZSByaWdodCAqLwotCQlyZXR1cm4gMDsKLQl9CisJLyogd2UndmUgZ29uZSB1cCB0byB0aGUgcm9vdCBhbmQgZm91bmQgbm8gaW5kZXggdG8gdGhlIHJpZ2h0ICovCisJcmV0dXJuIDA7CiAKK2dvdF9pbmRleDoKIAkvKiB3ZSd2ZSBmb3VuZCBpbmRleCB0byB0aGUgcmlnaHQsIGxldCdzCiAJICogZm9sbG93IGl0IGFuZCBmaW5kIHRoZSBjbG9zZXN0IGFsbG9jYXRlZAogCSAqIGJsb2NrIHRvIHRoZSByaWdodCAqLwpAQCAtMTIwMSw3ICsxMjAxLDYgQEAKIAkqcGh5cyA9IGV4dF9wYmxvY2soZXgpOwogCXB1dF9iaChiaCk7CiAJcmV0dXJuIDA7Ci0KIH0KIAogLyoKQEAgLTE2MjIsNyArMTYyMSw2IEBACiAJCWV4dDRfZXh0X2Ryb3BfcmVmcyhucGF0aCk7CiAJCWtmcmVlKG5wYXRoKTsKIAl9Ci0JZXh0NF9leHRfdHJlZV9jaGFuZ2VkKGlub2RlKTsKIAlleHQ0X2V4dF9pbnZhbGlkYXRlX2NhY2hlKGlub2RlKTsKIAlyZXR1cm4gZXJyOwogfQpAQCAtMjIzMyw3ICsyMjMxLDYgQEAKIAkJfQogCX0KIG91dDoKLQlleHQ0X2V4dF90cmVlX2NoYW5nZWQoaW5vZGUpOwogCWV4dDRfZXh0X2Ryb3BfcmVmcyhwYXRoKTsKIAlrZnJlZShwYXRoKTsKIAlleHQ0X2pvdXJuYWxfc3RvcChoYW5kbGUpOwpAQCAtMjI1MCw3ICsyMjQ3LDcgQEAKIAkgKiBwb3NzaWJsZSBpbml0aWFsaXphdGlvbiB3b3VsZCBiZSBoZXJlCiAJICovCiAKLQlpZiAodGVzdF9vcHQoc2IsIEVYVEVOVFMpKSB7CisJaWYgKEVYVDRfSEFTX0lOQ09NUEFUX0ZFQVRVUkUoc2IsIEVYVDRfRkVBVFVSRV9JTkNPTVBBVF9FWFRFTlRTKSkgewogCQlwcmludGsoS0VSTl9JTkZPICJFWFQ0LWZzOiBmaWxlIGV4dGVudHMgZW5hYmxlZCIpOwogI2lmZGVmIEFHR1JFU1NJVkVfVEVTVAogCQlwcmludGsoIiwgYWdncmVzc2l2ZSB0ZXN0cyIpOwpAQCAtMjI3NSw3ICsyMjcyLDcgQEAKICAqLwogdm9pZCBleHQ0X2V4dF9yZWxlYXNlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCiB7Ci0JaWYgKCF0ZXN0X29wdChzYiwgRVhURU5UUykpCisJaWYgKCFFWFQ0X0hBU19JTkNPTVBBVF9GRUFUVVJFKHNiLCBFWFQ0X0ZFQVRVUkVfSU5DT01QQVRfRVhURU5UUykpCiAJCXJldHVybjsKIAogI2lmZGVmIEVYVEVOVFNfU1RBVFMKQEAgLTIzODAsNyArMjM3Nyw3IEBACiAJCQkJCQlzdHJ1Y3QgaW5vZGUgKmlub2RlLAogCQkJCQkJc3RydWN0IGV4dDRfZXh0X3BhdGggKnBhdGgsCiAJCQkJCQlleHQ0X2xibGtfdCBpYmxvY2ssCi0JCQkJCQl1bnNpZ25lZCBsb25nIG1heF9ibG9ja3MpCisJCQkJCQl1bnNpZ25lZCBpbnQgbWF4X2Jsb2NrcykKIHsKIAlzdHJ1Y3QgZXh0NF9leHRlbnQgKmV4LCBuZXdleCwgb3JpZ19leDsKIAlzdHJ1Y3QgZXh0NF9leHRlbnQgKmV4MSA9IE5VTEw7CkBAIC0yNTM2LDcgKzI1MzMsNyBAQAogCQkgKi8KIAkJbmV3ZGVwdGggPSBleHRfZGVwdGgoaW5vZGUpOwogCQkvKgotCQkgKiB1cGRhdGUgdGhlIGV4dGVudCBsZW5ndGggYWZ0ZXIgc3VjY2Vzc2Z1bGwgaW5zZXJ0IG9mIHRoZQorCQkgKiB1cGRhdGUgdGhlIGV4dGVudCBsZW5ndGggYWZ0ZXIgc3VjY2Vzc2Z1bCBpbnNlcnQgb2YgdGhlCiAJCSAqIHNwbGl0IGV4dGVudAogCQkgKi8KIAkJb3JpZ19leC5lZV9sZW4gPSBjcHVfdG9fbGUxNihlZV9sZW4gLQpAQCAtMjY3OCwyNiArMjY3NSwyNiBAQAogICovCiBpbnQgZXh0NF9leHRfZ2V0X2Jsb2NrcyhoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAogCQkJZXh0NF9sYmxrX3QgaWJsb2NrLAotCQkJdW5zaWduZWQgbG9uZyBtYXhfYmxvY2tzLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoX3Jlc3VsdCwKKwkJCXVuc2lnbmVkIGludCBtYXhfYmxvY2tzLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoX3Jlc3VsdCwKIAkJCWludCBjcmVhdGUsIGludCBleHRlbmRfZGlza3NpemUpCiB7CiAJc3RydWN0IGV4dDRfZXh0X3BhdGggKnBhdGggPSBOVUxMOwogCXN0cnVjdCBleHQ0X2V4dGVudF9oZWFkZXIgKmVoOwogCXN0cnVjdCBleHQ0X2V4dGVudCBuZXdleCwgKmV4OwotCWV4dDRfZnNibGtfdCBnb2FsLCBuZXdibG9jazsKLQlpbnQgZXJyID0gMCwgZGVwdGgsIHJldDsKLQl1bnNpZ25lZCBsb25nIGFsbG9jYXRlZCA9IDA7CisJZXh0NF9mc2Jsa190IG5ld2Jsb2NrOworCWludCBlcnIgPSAwLCBkZXB0aCwgcmV0LCBjYWNoZV90eXBlOworCXVuc2lnbmVkIGludCBhbGxvY2F0ZWQgPSAwOwogCXN0cnVjdCBleHQ0X2FsbG9jYXRpb25fcmVxdWVzdCBhcjsKIAlsb2ZmX3QgZGlza3NpemU7CiAKIAlfX2NsZWFyX2JpdChCSF9OZXcsICZiaF9yZXN1bHQtPmJfc3RhdGUpOwotCWV4dF9kZWJ1ZygiYmxvY2tzICV1LyVsdSByZXF1ZXN0ZWQgZm9yIGlub2RlICV1XG4iLAorCWV4dF9kZWJ1ZygiYmxvY2tzICV1LyV1IHJlcXVlc3RlZCBmb3IgaW5vZGUgJXVcbiIsCiAJCQlpYmxvY2ssIG1heF9ibG9ja3MsIGlub2RlLT5pX2lubyk7CiAKIAkvKiBjaGVjayBpbiBjYWNoZSAqLwotCWdvYWwgPSBleHQ0X2V4dF9pbl9jYWNoZShpbm9kZSwgaWJsb2NrLCAmbmV3ZXgpOwotCWlmIChnb2FsKSB7Ci0JCWlmIChnb2FsID09IEVYVDRfRVhUX0NBQ0hFX0dBUCkgeworCWNhY2hlX3R5cGUgPSBleHQ0X2V4dF9pbl9jYWNoZShpbm9kZSwgaWJsb2NrLCAmbmV3ZXgpOworCWlmIChjYWNoZV90eXBlKSB7CisJCWlmIChjYWNoZV90eXBlID09IEVYVDRfRVhUX0NBQ0hFX0dBUCkgewogCQkJaWYgKCFjcmVhdGUpIHsKIAkJCQkvKgogCQkJCSAqIGJsb2NrIGlzbid0IGFsbG9jYXRlZCB5ZXQgYW5kCkBAIC0yNzA2LDcgKzI3MDMsNyBAQAogCQkJCWdvdG8gb3V0MjsKIAkJCX0KIAkJCS8qIHdlIHNob3VsZCBhbGxvY2F0ZSByZXF1ZXN0ZWQgYmxvY2sgKi8KLQkJfSBlbHNlIGlmIChnb2FsID09IEVYVDRfRVhUX0NBQ0hFX0VYVEVOVCkgeworCQl9IGVsc2UgaWYgKGNhY2hlX3R5cGUgPT0gRVhUNF9FWFRfQ0FDSEVfRVhURU5UKSB7CiAJCQkvKiBibG9jayBpcyBhbHJlYWR5IGFsbG9jYXRlZCAqLwogCQkJbmV3YmxvY2sgPSBpYmxvY2sKIAkJCQkgICAtIGxlMzJfdG9fY3B1KG5ld2V4LmVlX2Jsb2NrKQpAQCAtMjg1NCw3ICsyODUxLDcgQEAKIAlpZiAoIW5ld2Jsb2NrKQogCQlnb3RvIG91dDI7CiAJZXh0X2RlYnVnKCJhbGxvY2F0ZSBuZXcgYmxvY2s6IGdvYWwgJWxsdSwgZm91bmQgJWxsdS8lbHVcbiIsCi0JCQlnb2FsLCBuZXdibG9jaywgYWxsb2NhdGVkKTsKKwkJICBhci5nb2FsLCBuZXdibG9jaywgYWxsb2NhdGVkKTsKIAogCS8qIHRyeSB0byBpbnNlcnQgbmV3IGV4dGVudCBpbnRvIGZvdW5kIGxlYWYgYW5kIHJldHVybiAqLwogCWV4dDRfZXh0X3N0b3JlX3BibG9jaygmbmV3ZXgsIG5ld2Jsb2NrKTsKQEAgLTI5NTAsNyArMjk0Nyw3IEBACiAJICogdHJhbnNhY3Rpb24gc3luY2hyb25vdXMuCiAJICovCiAJaWYgKElTX1NZTkMoaW5vZGUpKQotCQloYW5kbGUtPmhfc3luYyA9IDE7CisJCWV4dDRfaGFuZGxlX3N5bmMoaGFuZGxlKTsKIAogb3V0X3N0b3A6CiAJdXBfd3JpdGUoJkVYVDRfSShpbm9kZSktPmlfZGF0YV9zZW0pOwpAQCAtMzAwNCw3ICszMDAxLDcgQEAKIAloYW5kbGVfdCAqaGFuZGxlOwogCWV4dDRfbGJsa190IGJsb2NrOwogCWxvZmZfdCBuZXdfc2l6ZTsKLQl1bnNpZ25lZCBsb25nIG1heF9ibG9ja3M7CisJdW5zaWduZWQgaW50IG1heF9ibG9ja3M7CiAJaW50IHJldCA9IDA7CiAJaW50IHJldDIgPSAwOwogCWludCByZXRyaWVzID0gMDsKQEAgLTMwODMsNyArMzA4MCw3IEBACiAvKgogICogQ2FsbGJhY2sgZnVuY3Rpb24gY2FsbGVkIGZvciBlYWNoIGV4dGVudCB0byBnYXRoZXIgRklFTUFQIGluZm9ybWF0aW9uLgogICovCi1pbnQgZXh0NF9leHRfZmllbWFwX2NiKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBleHQ0X2V4dF9wYXRoICpwYXRoLAorc3RhdGljIGludCBleHQ0X2V4dF9maWVtYXBfY2Ioc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGV4dDRfZXh0X3BhdGggKnBhdGgsCiAJCSAgICAgICBzdHJ1Y3QgZXh0NF9leHRfY2FjaGUgKm5ld2V4LCBzdHJ1Y3QgZXh0NF9leHRlbnQgKmV4LAogCQkgICAgICAgdm9pZCAqZGF0YSkKIHsKQEAgLTMxNTIsNyArMzE0OSw4IEBACiAvKiBmaWVtYXAgZmxhZ3Mgd2UgY2FuIGhhbmRsZSBzcGVjaWZpZWQgaGVyZSAqLwogI2RlZmluZSBFWFQ0X0ZJRU1BUF9GTEFHUwkoRklFTUFQX0ZMQUdfU1lOQ3xGSUVNQVBfRkxBR19YQVRUUikKIAotaW50IGV4dDRfeGF0dHJfZmllbWFwKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWVtYXBfZXh0ZW50X2luZm8gKmZpZWluZm8pCitzdGF0aWMgaW50IGV4dDRfeGF0dHJfZmllbWFwKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJc3RydWN0IGZpZW1hcF9leHRlbnRfaW5mbyAqZmllaW5mbykKIHsKIAlfX3U2NCBwaHlzaWNhbCA9IDA7CiAJX191NjQgbGVuZ3RoOwpkaWZmIC0tZ2l0IGEvZnMvZXh0NC9maWxlLmMgYi9mcy9leHQ0L2ZpbGUuYwppbmRleCA2YmQxMWZiLi5mNzMxY2I1IDEwMDY0NAotLS0gYS9mcy9leHQ0L2ZpbGUuYworKysgYi9mcy9leHQ0L2ZpbGUuYwpAQCAtMTQwLDkgKzE0MCw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLWV4dGVybiBpbnQgZXh0NF9maWVtYXAoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpZW1hcF9leHRlbnRfaW5mbyAqZmllaW5mbywKLQkJX191NjQgc3RhcnQsIF9fdTY0IGxlbik7Ci0KIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZXh0NF9maWxlX29wZXJhdGlvbnMgPSB7CiAJLmxsc2VlawkJPSBnZW5lcmljX2ZpbGVfbGxzZWVrLAogCS5yZWFkCQk9IGRvX3N5bmNfcmVhZCwKZGlmZiAtLWdpdCBhL2ZzL2V4dDQvaGFzaC5jIGIvZnMvZXh0NC9oYXNoLmMKaW5kZXggNTU2Y2E4ZS4uYWM4ZjE2OCAxMDA2NDQKLS0tIGEvZnMvZXh0NC9oYXNoLmMKKysrIGIvZnMvZXh0NC9oYXNoLmMKQEAgLTM1LDIzICszNSw0MyBAQAogCiAKIC8qIFRoZSBvbGQgbGVnYWN5IGhhc2ggKi8KLXN0YXRpYyBfX3UzMiBkeF9oYWNrX2hhc2goY29uc3QgY2hhciAqbmFtZSwgaW50IGxlbikKK3N0YXRpYyBfX3UzMiBkeF9oYWNrX2hhc2hfdW5zaWduZWQoY29uc3QgY2hhciAqbmFtZSwgaW50IGxlbikKIHsKLQlfX3UzMiBoYXNoMCA9IDB4MTJhM2ZlMmQsIGhhc2gxID0gMHgzN2FiZThmOTsKLQl3aGlsZSAobGVuLS0pIHsKLQkJX191MzIgaGFzaCA9IGhhc2gxICsgKGhhc2gwIF4gKCpuYW1lKysgKiA3MTUyMzczKSk7CisJX191MzIgaGFzaCwgaGFzaDAgPSAweDEyYTNmZTJkLCBoYXNoMSA9IDB4MzdhYmU4Zjk7CisJY29uc3QgdW5zaWduZWQgY2hhciAqdWNwID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikgbmFtZTsKIAotCQlpZiAoaGFzaCAmIDB4ODAwMDAwMDApIGhhc2ggLT0gMHg3ZmZmZmZmZjsKKwl3aGlsZSAobGVuLS0pIHsKKwkJaGFzaCA9IGhhc2gxICsgKGhhc2gwIF4gKCgoaW50KSAqdWNwKyspICogNzE1MjM3MykpOworCisJCWlmIChoYXNoICYgMHg4MDAwMDAwMCkKKwkJCWhhc2ggLT0gMHg3ZmZmZmZmZjsKIAkJaGFzaDEgPSBoYXNoMDsKIAkJaGFzaDAgPSBoYXNoOwogCX0KLQlyZXR1cm4gKGhhc2gwIDw8IDEpOworCXJldHVybiBoYXNoMCA8PCAxOwogfQogCi1zdGF0aWMgdm9pZCBzdHIyaGFzaGJ1Zihjb25zdCBjaGFyICptc2csIGludCBsZW4sIF9fdTMyICpidWYsIGludCBudW0pCitzdGF0aWMgX191MzIgZHhfaGFja19oYXNoX3NpZ25lZChjb25zdCBjaGFyICpuYW1lLCBpbnQgbGVuKQoreworCV9fdTMyIGhhc2gsIGhhc2gwID0gMHgxMmEzZmUyZCwgaGFzaDEgPSAweDM3YWJlOGY5OworCWNvbnN0IHNpZ25lZCBjaGFyICpzY3AgPSAoY29uc3Qgc2lnbmVkIGNoYXIgKikgbmFtZTsKKworCXdoaWxlIChsZW4tLSkgeworCQloYXNoID0gaGFzaDEgKyAoaGFzaDAgXiAoKChpbnQpICpzY3ArKykgKiA3MTUyMzczKSk7CisKKwkJaWYgKGhhc2ggJiAweDgwMDAwMDAwKQorCQkJaGFzaCAtPSAweDdmZmZmZmZmOworCQloYXNoMSA9IGhhc2gwOworCQloYXNoMCA9IGhhc2g7CisJfQorCXJldHVybiBoYXNoMCA8PCAxOworfQorCitzdGF0aWMgdm9pZCBzdHIyaGFzaGJ1Zl9zaWduZWQoY29uc3QgY2hhciAqbXNnLCBpbnQgbGVuLCBfX3UzMiAqYnVmLCBpbnQgbnVtKQogewogCV9fdTMyCXBhZCwgdmFsOwogCWludAlpOworCWNvbnN0IHNpZ25lZCBjaGFyICpzY3AgPSAoY29uc3Qgc2lnbmVkIGNoYXIgKikgbXNnOwogCiAJcGFkID0gKF9fdTMyKWxlbiB8ICgoX191MzIpbGVuIDw8IDgpOwogCXBhZCB8PSBwYWQgPDwgMTY7CkBAIC02Miw3ICs4MiwzNSBAQAogCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgewogCQlpZiAoKGkgJSA0KSA9PSAwKQogCQkJdmFsID0gcGFkOwotCQl2YWwgPSBtc2dbaV0gKyAodmFsIDw8IDgpOworCQl2YWwgPSAoKGludCkgc2NwW2ldKSArICh2YWwgPDwgOCk7CisJCWlmICgoaSAlIDQpID09IDMpIHsKKwkJCSpidWYrKyA9IHZhbDsKKwkJCXZhbCA9IHBhZDsKKwkJCW51bS0tOworCQl9CisJfQorCWlmICgtLW51bSA+PSAwKQorCQkqYnVmKysgPSB2YWw7CisJd2hpbGUgKC0tbnVtID49IDApCisJCSpidWYrKyA9IHBhZDsKK30KKworc3RhdGljIHZvaWQgc3RyMmhhc2hidWZfdW5zaWduZWQoY29uc3QgY2hhciAqbXNnLCBpbnQgbGVuLCBfX3UzMiAqYnVmLCBpbnQgbnVtKQoreworCV9fdTMyCXBhZCwgdmFsOworCWludAlpOworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnVjcCA9IChjb25zdCB1bnNpZ25lZCBjaGFyICopIG1zZzsKKworCXBhZCA9IChfX3UzMilsZW4gfCAoKF9fdTMyKWxlbiA8PCA4KTsKKwlwYWQgfD0gcGFkIDw8IDE2OworCisJdmFsID0gcGFkOworCWlmIChsZW4gPiBudW0qNCkKKwkJbGVuID0gbnVtICogNDsKKwlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKwkJaWYgKChpICUgNCkgPT0gMCkKKwkJCXZhbCA9IHBhZDsKKwkJdmFsID0gKChpbnQpIHVjcFtpXSkgKyAodmFsIDw8IDgpOwogCQlpZiAoKGkgJSA0KSA9PSAzKSB7CiAJCQkqYnVmKysgPSB2YWw7CiAJCQl2YWwgPSBwYWQ7CkBAIC05NSw2ICsxNDMsOCBAQAogCWNvbnN0IGNoYXIJKnA7CiAJaW50CQlpOwogCV9fdTMyCQlpbls4XSwgYnVmWzRdOworCXZvaWQJCSgqc3RyMmhhc2hidWYpKGNvbnN0IGNoYXIgKiwgaW50LCBfX3UzMiAqLCBpbnQpID0KKwkJCQlzdHIyaGFzaGJ1Zl9zaWduZWQ7CiAKIAkvKiBJbml0aWFsaXplIHRoZSBkZWZhdWx0IHNlZWQgZm9yIHRoZSBoYXNoIGNoZWNrc3VtIGZ1bmN0aW9ucyAqLwogCWJ1ZlswXSA9IDB4Njc0NTIzMDE7CkBAIC0xMTMsMTMgKzE2MywxOCBAQAogCX0KIAogCXN3aXRjaCAoaGluZm8tPmhhc2hfdmVyc2lvbikgewotCWNhc2UgRFhfSEFTSF9MRUdBQ1k6Ci0JCWhhc2ggPSBkeF9oYWNrX2hhc2gobmFtZSwgbGVuKTsKKwljYXNlIERYX0hBU0hfTEVHQUNZX1VOU0lHTkVEOgorCQloYXNoID0gZHhfaGFja19oYXNoX3Vuc2lnbmVkKG5hbWUsIGxlbik7CiAJCWJyZWFrOworCWNhc2UgRFhfSEFTSF9MRUdBQ1k6CisJCWhhc2ggPSBkeF9oYWNrX2hhc2hfc2lnbmVkKG5hbWUsIGxlbik7CisJCWJyZWFrOworCWNhc2UgRFhfSEFTSF9IQUxGX01ENF9VTlNJR05FRDoKKwkJc3RyMmhhc2hidWYgPSBzdHIyaGFzaGJ1Zl91bnNpZ25lZDsKIAljYXNlIERYX0hBU0hfSEFMRl9NRDQ6CiAJCXAgPSBuYW1lOwogCQl3aGlsZSAobGVuID4gMCkgewotCQkJc3RyMmhhc2hidWYocCwgbGVuLCBpbiwgOCk7CisJCQkoKnN0cjJoYXNoYnVmKShwLCBsZW4sIGluLCA4KTsKIAkJCWhhbGZfbWQ0X3RyYW5zZm9ybShidWYsIGluKTsKIAkJCWxlbiAtPSAzMjsKIAkJCXAgKz0gMzI7CkBAIC0xMjcsMTAgKzE4MiwxMiBAQAogCQltaW5vcl9oYXNoID0gYnVmWzJdOwogCQloYXNoID0gYnVmWzFdOwogCQlicmVhazsKKwljYXNlIERYX0hBU0hfVEVBX1VOU0lHTkVEOgorCQlzdHIyaGFzaGJ1ZiA9IHN0cjJoYXNoYnVmX3Vuc2lnbmVkOwogCWNhc2UgRFhfSEFTSF9URUE6CiAJCXAgPSBuYW1lOwogCQl3aGlsZSAobGVuID4gMCkgewotCQkJc3RyMmhhc2hidWYocCwgbGVuLCBpbiwgNCk7CisJCQkoKnN0cjJoYXNoYnVmKShwLCBsZW4sIGluLCA0KTsKIAkJCVRFQV90cmFuc2Zvcm0oYnVmLCBpbik7CiAJCQlsZW4gLT0gMTY7CiAJCQlwICs9IDE2OwpkaWZmIC0tZ2l0IGEvZnMvZXh0NC9pYWxsb2MuYyBiL2ZzL2V4dDQvaWFsbG9jLmMKaW5kZXggNmU2MDUyOC4uNGZiODZhMCAxMDA2NDQKLS0tIGEvZnMvZXh0NC9pYWxsb2MuYworKysgYi9mcy9leHQ0L2lhbGxvYy5jCkBAIC03NCwxNyArNzQsMTcgQEAKIAkvKiBJZiBjaGVja3N1bSBpcyBiYWQgbWFyayBhbGwgYmxvY2tzIGFuZCBpbm9kZXMgdXNlIHRvIHByZXZlbnQKIAkgKiBhbGxvY2F0aW9uLCBlc3NlbnRpYWxseSBpbXBsZW1lbnRpbmcgYSBwZXItZ3JvdXAgcmVhZC1vbmx5IGZsYWcuICovCiAJaWYgKCFleHQ0X2dyb3VwX2Rlc2NfY3N1bV92ZXJpZnkoc2JpLCBibG9ja19ncm91cCwgZ2RwKSkgewotCQlleHQ0X2Vycm9yKHNiLCBfX2Z1bmNfXywgIkNoZWNrc3VtIGJhZCBmb3IgZ3JvdXAgJWx1XG4iLAorCQlleHQ0X2Vycm9yKHNiLCBfX2Z1bmNfXywgIkNoZWNrc3VtIGJhZCBmb3IgZ3JvdXAgJXUiLAogCQkJICAgYmxvY2tfZ3JvdXApOwotCQlnZHAtPmJnX2ZyZWVfYmxvY2tzX2NvdW50ID0gMDsKLQkJZ2RwLT5iZ19mcmVlX2lub2Rlc19jb3VudCA9IDA7Ci0JCWdkcC0+YmdfaXRhYmxlX3VudXNlZCA9IDA7CisJCWV4dDRfZnJlZV9ibGtzX3NldChzYiwgZ2RwLCAwKTsKKwkJZXh0NF9mcmVlX2lub2Rlc19zZXQoc2IsIGdkcCwgMCk7CisJCWV4dDRfaXRhYmxlX3VudXNlZF9zZXQoc2IsIGdkcCwgMCk7CiAJCW1lbXNldChiaC0+Yl9kYXRhLCAweGZmLCBzYi0+c19ibG9ja3NpemUpOwogCQlyZXR1cm4gMDsKIAl9CiAKIAltZW1zZXQoYmgtPmJfZGF0YSwgMCwgKEVYVDRfSU5PREVTX1BFUl9HUk9VUChzYikgKyA3KSAvIDgpOwotCW1hcmtfYml0bWFwX2VuZChFWFQ0X0lOT0RFU19QRVJfR1JPVVAoc2IpLCBFWFQ0X0JMT0NLU19QRVJfR1JPVVAoc2IpLAorCW1hcmtfYml0bWFwX2VuZChFWFQ0X0lOT0RFU19QRVJfR1JPVVAoc2IpLCBzYi0+c19ibG9ja3NpemUgKiA4LAogCQkJYmgtPmJfZGF0YSk7CiAKIAlyZXR1cm4gRVhUNF9JTk9ERVNfUEVSX0dST1VQKHNiKTsKQEAgLTExMSwyOSArMTExLDQ5IEBACiAJaWYgKHVubGlrZWx5KCFiaCkpIHsKIAkJZXh0NF9lcnJvcihzYiwgX19mdW5jX18sCiAJCQkgICAgIkNhbm5vdCByZWFkIGlub2RlIGJpdG1hcCAtICIKLQkJCSAgICAiYmxvY2tfZ3JvdXAgPSAlbHUsIGlub2RlX2JpdG1hcCA9ICVsbHUiLAorCQkJICAgICJibG9ja19ncm91cCA9ICV1LCBpbm9kZV9iaXRtYXAgPSAlbGx1IiwKIAkJCSAgICBibG9ja19ncm91cCwgYml0bWFwX2Jsayk7CiAJCXJldHVybiBOVUxMOwogCX0KLQlpZiAoYnVmZmVyX3VwdG9kYXRlKGJoKSAmJgotCSAgICAhKGRlc2MtPmJnX2ZsYWdzICYgY3B1X3RvX2xlMTYoRVhUNF9CR19JTk9ERV9VTklOSVQpKSkKKwlpZiAoYml0bWFwX3VwdG9kYXRlKGJoKSkKIAkJcmV0dXJuIGJoOwogCiAJbG9ja19idWZmZXIoYmgpOworCWlmIChiaXRtYXBfdXB0b2RhdGUoYmgpKSB7CisJCXVubG9ja19idWZmZXIoYmgpOworCQlyZXR1cm4gYmg7CisJfQogCXNwaW5fbG9jayhzYl9iZ2xfbG9jayhFWFQ0X1NCKHNiKSwgYmxvY2tfZ3JvdXApKTsKIAlpZiAoZGVzYy0+YmdfZmxhZ3MgJiBjcHVfdG9fbGUxNihFWFQ0X0JHX0lOT0RFX1VOSU5JVCkpIHsKIAkJZXh0NF9pbml0X2lub2RlX2JpdG1hcChzYiwgYmgsIGJsb2NrX2dyb3VwLCBkZXNjKTsKKwkJc2V0X2JpdG1hcF91cHRvZGF0ZShiaCk7CiAJCXNldF9idWZmZXJfdXB0b2RhdGUoYmgpOwotCQl1bmxvY2tfYnVmZmVyKGJoKTsKIAkJc3Bpbl91bmxvY2soc2JfYmdsX2xvY2soRVhUNF9TQihzYiksIGJsb2NrX2dyb3VwKSk7CisJCXVubG9ja19idWZmZXIoYmgpOwogCQlyZXR1cm4gYmg7CiAJfQogCXNwaW5fdW5sb2NrKHNiX2JnbF9sb2NrKEVYVDRfU0Ioc2IpLCBibG9ja19ncm91cCkpOworCWlmIChidWZmZXJfdXB0b2RhdGUoYmgpKSB7CisJCS8qCisJCSAqIGlmIG5vdCB1bmluaXQgaWYgYmggaXMgdXB0b2RhdGUsCisJCSAqIGJpdG1hcCBpcyBhbHNvIHVwdG9kYXRlCisJCSAqLworCQlzZXRfYml0bWFwX3VwdG9kYXRlKGJoKTsKKwkJdW5sb2NrX2J1ZmZlcihiaCk7CisJCXJldHVybiBiaDsKKwl9CisJLyoKKwkgKiBzdWJtaXQgdGhlIGJ1ZmZlcl9oZWFkIGZvciByZWFkLiBXZSBjYW4KKwkgKiBzYWZlbHkgbWFyayB0aGUgYml0bWFwIGFzIHVwdG9kYXRlIG5vdy4KKwkgKiBXZSBkbyBpdCBoZXJlIHNvIHRoZSBiaXRtYXAgdXB0b2RhdGUgYml0CisJICogZ2V0IHNldCB3aXRoIGJ1ZmZlciBsb2NrIGhlbGQuCisJICovCisJc2V0X2JpdG1hcF91cHRvZGF0ZShiaCk7CiAJaWYgKGJoX3N1Ym1pdF9yZWFkKGJoKSA8IDApIHsKIAkJcHV0X2JoKGJoKTsKIAkJZXh0NF9lcnJvcihzYiwgX19mdW5jX18sCiAJCQkgICAgIkNhbm5vdCByZWFkIGlub2RlIGJpdG1hcCAtICIKLQkJCSAgICAiYmxvY2tfZ3JvdXAgPSAlbHUsIGlub2RlX2JpdG1hcCA9ICVsbHUiLAorCQkJICAgICJibG9ja19ncm91cCA9ICV1LCBpbm9kZV9iaXRtYXAgPSAlbGx1IiwKIAkJCSAgICBibG9ja19ncm91cCwgYml0bWFwX2Jsayk7CiAJCXJldHVybiBOVUxMOwogCX0KQEAgLTE2OCw3ICsxODgsNyBAQAogCXN0cnVjdCBleHQ0X2dyb3VwX2Rlc2MgKmdkcDsKIAlzdHJ1Y3QgZXh0NF9zdXBlcl9ibG9jayAqZXM7CiAJc3RydWN0IGV4dDRfc2JfaW5mbyAqc2JpOwotCWludCBmYXRhbCA9IDAsIGVycjsKKwlpbnQgZmF0YWwgPSAwLCBlcnIsIGNvdW50OwogCWV4dDRfZ3JvdXBfdCBmbGV4X2dyb3VwOwogCiAJaWYgKGF0b21pY19yZWFkKCZpbm9kZS0+aV9jb3VudCkgPiAxKSB7CkBAIC0xOTAsNiArMjEwLDExIEBACiAKIAlpbm8gPSBpbm9kZS0+aV9pbm87CiAJZXh0NF9kZWJ1ZygiZnJlZWluZyBpbm9kZSAlbHVcbiIsIGlubyk7CisJdHJhY2VfbWFyayhleHQ0X2ZyZWVfaW5vZGUsCisJCSAgICJkZXYgJXMgaW5vICVsdSBtb2RlICVkIHVpZCAlbHUgZ2lkICVsdSBib2NrcyAlbGx1IiwKKwkJICAgc2ItPnNfaWQsIGlub2RlLT5pX2lubywgaW5vZGUtPmlfbW9kZSwKKwkJICAgKHVuc2lnbmVkIGxvbmcpIGlub2RlLT5pX3VpZCwgKHVuc2lnbmVkIGxvbmcpIGlub2RlLT5pX2dpZCwKKwkJICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgaW5vZGUtPmlfYmxvY2tzKTsKIAogCS8qCiAJICogTm90ZTogd2UgbXVzdCBmcmVlIGFueSBxdW90YSBiZWZvcmUgbG9ja2luZyB0aGUgc3VwZXJibG9jaywKQEAgLTIzNiw5ICsyNjEsMTIgQEAKIAogCQlpZiAoZ2RwKSB7CiAJCQlzcGluX2xvY2soc2JfYmdsX2xvY2soc2JpLCBibG9ja19ncm91cCkpOwotCQkJbGUxNl9hZGRfY3B1KCZnZHAtPmJnX2ZyZWVfaW5vZGVzX2NvdW50LCAxKTsKLQkJCWlmIChpc19kaXJlY3RvcnkpCi0JCQkJbGUxNl9hZGRfY3B1KCZnZHAtPmJnX3VzZWRfZGlyc19jb3VudCwgLTEpOworCQkJY291bnQgPSBleHQ0X2ZyZWVfaW5vZGVzX2NvdW50KHNiLCBnZHApICsgMTsKKwkJCWV4dDRfZnJlZV9pbm9kZXNfc2V0KHNiLCBnZHAsIGNvdW50KTsKKwkJCWlmIChpc19kaXJlY3RvcnkpIHsKKwkJCQljb3VudCA9IGV4dDRfdXNlZF9kaXJzX2NvdW50KHNiLCBnZHApIC0gMTsKKwkJCQlleHQ0X3VzZWRfZGlyc19zZXQoc2IsIGdkcCwgY291bnQpOworCQkJfQogCQkJZ2RwLT5iZ19jaGVja3N1bSA9IGV4dDRfZ3JvdXBfZGVzY19jc3VtKHNiaSwKIAkJCQkJCQlibG9ja19ncm91cCwgZ2RwKTsKIAkJCXNwaW5fdW5sb2NrKHNiX2JnbF9sb2NrKHNiaSwgYmxvY2tfZ3JvdXApKTsKQEAgLTI1MywxMiArMjgxLDEyIEBACiAJCQkJc3Bpbl91bmxvY2soc2JfYmdsX2xvY2soc2JpLCBmbGV4X2dyb3VwKSk7CiAJCQl9CiAJCX0KLQkJQlVGRkVSX1RSQUNFKGJoMiwgImNhbGwgZXh0NF9qb3VybmFsX2RpcnR5X21ldGFkYXRhIik7Ci0JCWVyciA9IGV4dDRfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGJoMik7CisJCUJVRkZFUl9UUkFDRShiaDIsICJjYWxsIGV4dDRfaGFuZGxlX2RpcnR5X21ldGFkYXRhIik7CisJCWVyciA9IGV4dDRfaGFuZGxlX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgTlVMTCwgYmgyKTsKIAkJaWYgKCFmYXRhbCkgZmF0YWwgPSBlcnI7CiAJfQotCUJVRkZFUl9UUkFDRShiaXRtYXBfYmgsICJjYWxsIGV4dDRfam91cm5hbF9kaXJ0eV9tZXRhZGF0YSIpOwotCWVyciA9IGV4dDRfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGJpdG1hcF9iaCk7CisJQlVGRkVSX1RSQUNFKGJpdG1hcF9iaCwgImNhbGwgZXh0NF9oYW5kbGVfZGlydHlfbWV0YWRhdGEiKTsKKwllcnIgPSBleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIE5VTEwsIGJpdG1hcF9iaCk7CiAJaWYgKCFmYXRhbCkKIAkJZmF0YWwgPSBlcnI7CiAJc2ItPnNfZGlydCA9IDE7CkBAIC0yOTEsMTMgKzMxOSwxMyBAQAogCiAJZm9yIChncm91cCA9IDA7IGdyb3VwIDwgbmdyb3VwczsgZ3JvdXArKykgewogCQlkZXNjID0gZXh0NF9nZXRfZ3JvdXBfZGVzYyhzYiwgZ3JvdXAsIE5VTEwpOwotCQlpZiAoIWRlc2MgfHwgIWRlc2MtPmJnX2ZyZWVfaW5vZGVzX2NvdW50KQorCQlpZiAoIWRlc2MgfHwgIWV4dDRfZnJlZV9pbm9kZXNfY291bnQoc2IsIGRlc2MpKQogCQkJY29udGludWU7Ci0JCWlmIChsZTE2X3RvX2NwdShkZXNjLT5iZ19mcmVlX2lub2Rlc19jb3VudCkgPCBhdmVmcmVlaSkKKwkJaWYgKGV4dDRfZnJlZV9pbm9kZXNfY291bnQoc2IsIGRlc2MpIDwgYXZlZnJlZWkpCiAJCQljb250aW51ZTsKIAkJaWYgKCFiZXN0X2Rlc2MgfHwKLQkJICAgIChsZTE2X3RvX2NwdShkZXNjLT5iZ19mcmVlX2Jsb2Nrc19jb3VudCkgPgotCQkgICAgIGxlMTZfdG9fY3B1KGJlc3RfZGVzYy0+YmdfZnJlZV9ibG9ja3NfY291bnQpKSkgeworCQkgICAgKGV4dDRfZnJlZV9ibGtzX2NvdW50KHNiLCBkZXNjKSA+CisJCSAgICAgZXh0NF9mcmVlX2Jsa3NfY291bnQoc2IsIGJlc3RfZGVzYykpKSB7CiAJCQkqYmVzdF9ncm91cCA9IGdyb3VwOwogCQkJYmVzdF9kZXNjID0gZGVzYzsKIAkJCXJldCA9IDA7CkBAIC0zNjksNyArMzk3LDcgQEAKIAlmb3IgKGkgPSBiZXN0X2ZsZXggKiBmbGV4X3NpemU7IGkgPCBuZ3JvdXBzICYmCiAJCSAgICAgaSA8IChiZXN0X2ZsZXggKyAxKSAqIGZsZXhfc2l6ZTsgaSsrKSB7CiAJCWRlc2MgPSBleHQ0X2dldF9ncm91cF9kZXNjKHNiLCBpLCAmYmgpOwotCQlpZiAobGUxNl90b19jcHUoZGVzYy0+YmdfZnJlZV9pbm9kZXNfY291bnQpKSB7CisJCWlmIChleHQ0X2ZyZWVfaW5vZGVzX2NvdW50KHNiLCBkZXNjKSkgewogCQkJKmJlc3RfZ3JvdXAgPSBpOwogCQkJZ290byBvdXQ7CiAJCX0KQEAgLTQ0MywxNyArNDcxLDE3IEBACiAJCWZvciAoaSA9IDA7IGkgPCBuZ3JvdXBzOyBpKyspIHsKIAkJCWdycCA9IChwYXJlbnRfZ3JvdXAgKyBpKSAlIG5ncm91cHM7CiAJCQlkZXNjID0gZXh0NF9nZXRfZ3JvdXBfZGVzYyhzYiwgZ3JwLCBOVUxMKTsKLQkJCWlmICghZGVzYyB8fCAhZGVzYy0+YmdfZnJlZV9pbm9kZXNfY291bnQpCisJCQlpZiAoIWRlc2MgfHwgIWV4dDRfZnJlZV9pbm9kZXNfY291bnQoc2IsIGRlc2MpKQogCQkJCWNvbnRpbnVlOwotCQkJaWYgKGxlMTZfdG9fY3B1KGRlc2MtPmJnX3VzZWRfZGlyc19jb3VudCkgPj0gYmVzdF9uZGlyKQorCQkJaWYgKGV4dDRfdXNlZF9kaXJzX2NvdW50KHNiLCBkZXNjKSA+PSBiZXN0X25kaXIpCiAJCQkJY29udGludWU7Ci0JCQlpZiAobGUxNl90b19jcHUoZGVzYy0+YmdfZnJlZV9pbm9kZXNfY291bnQpIDwgYXZlZnJlZWkpCisJCQlpZiAoZXh0NF9mcmVlX2lub2Rlc19jb3VudChzYiwgZGVzYykgPCBhdmVmcmVlaSkKIAkJCQljb250aW51ZTsKLQkJCWlmIChsZTE2X3RvX2NwdShkZXNjLT5iZ19mcmVlX2Jsb2Nrc19jb3VudCkgPCBhdmVmcmVlYikKKwkJCWlmIChleHQ0X2ZyZWVfYmxrc19jb3VudChzYiwgZGVzYykgPCBhdmVmcmVlYikKIAkJCQljb250aW51ZTsKIAkJCSpncm91cCA9IGdycDsKIAkJCXJldCA9IDA7Ci0JCQliZXN0X25kaXIgPSBsZTE2X3RvX2NwdShkZXNjLT5iZ191c2VkX2RpcnNfY291bnQpOworCQkJYmVzdF9uZGlyID0gZXh0NF91c2VkX2RpcnNfY291bnQoc2IsIGRlc2MpOwogCQl9CiAJCWlmIChyZXQgPT0gMCkKIAkJCXJldHVybiByZXQ7CkBAIC00NzksMTMgKzUwNywxMyBAQAogCWZvciAoaSA9IDA7IGkgPCBuZ3JvdXBzOyBpKyspIHsKIAkJKmdyb3VwID0gKHBhcmVudF9ncm91cCArIGkpICUgbmdyb3VwczsKIAkJZGVzYyA9IGV4dDRfZ2V0X2dyb3VwX2Rlc2Moc2IsICpncm91cCwgTlVMTCk7Ci0JCWlmICghZGVzYyB8fCAhZGVzYy0+YmdfZnJlZV9pbm9kZXNfY291bnQpCisJCWlmICghZGVzYyB8fCAhZXh0NF9mcmVlX2lub2Rlc19jb3VudChzYiwgZGVzYykpCiAJCQljb250aW51ZTsKLQkJaWYgKGxlMTZfdG9fY3B1KGRlc2MtPmJnX3VzZWRfZGlyc19jb3VudCkgPj0gbWF4X2RpcnMpCisJCWlmIChleHQ0X3VzZWRfZGlyc19jb3VudChzYiwgZGVzYykgPj0gbWF4X2RpcnMpCiAJCQljb250aW51ZTsKLQkJaWYgKGxlMTZfdG9fY3B1KGRlc2MtPmJnX2ZyZWVfaW5vZGVzX2NvdW50KSA8IG1pbl9pbm9kZXMpCisJCWlmIChleHQ0X2ZyZWVfaW5vZGVzX2NvdW50KHNiLCBkZXNjKSA8IG1pbl9pbm9kZXMpCiAJCQljb250aW51ZTsKLQkJaWYgKGxlMTZfdG9fY3B1KGRlc2MtPmJnX2ZyZWVfYmxvY2tzX2NvdW50KSA8IG1pbl9ibG9ja3MpCisJCWlmIChleHQ0X2ZyZWVfYmxrc19jb3VudChzYiwgZGVzYykgPCBtaW5fYmxvY2tzKQogCQkJY29udGludWU7CiAJCXJldHVybiAwOwogCX0KQEAgLTQ5NCw4ICs1MjIsOCBAQAogCWZvciAoaSA9IDA7IGkgPCBuZ3JvdXBzOyBpKyspIHsKIAkJKmdyb3VwID0gKHBhcmVudF9ncm91cCArIGkpICUgbmdyb3VwczsKIAkJZGVzYyA9IGV4dDRfZ2V0X2dyb3VwX2Rlc2Moc2IsICpncm91cCwgTlVMTCk7Ci0JCWlmIChkZXNjICYmIGRlc2MtPmJnX2ZyZWVfaW5vZGVzX2NvdW50ICYmCi0JCQlsZTE2X3RvX2NwdShkZXNjLT5iZ19mcmVlX2lub2Rlc19jb3VudCkgPj0gYXZlZnJlZWkpCisJCWlmIChkZXNjICYmIGV4dDRfZnJlZV9pbm9kZXNfY291bnQoc2IsIGRlc2MpICYmCisJCQlleHQ0X2ZyZWVfaW5vZGVzX2NvdW50KHNiLCBkZXNjKSA+PSBhdmVmcmVlaSkKIAkJCXJldHVybiAwOwogCX0KIApAQCAtNTI0LDggKzU1Miw4IEBACiAJICovCiAJKmdyb3VwID0gcGFyZW50X2dyb3VwOwogCWRlc2MgPSBleHQ0X2dldF9ncm91cF9kZXNjKHNiLCAqZ3JvdXAsIE5VTEwpOwotCWlmIChkZXNjICYmIGxlMTZfdG9fY3B1KGRlc2MtPmJnX2ZyZWVfaW5vZGVzX2NvdW50KSAmJgotCQkJbGUxNl90b19jcHUoZGVzYy0+YmdfZnJlZV9ibG9ja3NfY291bnQpKQorCWlmIChkZXNjICYmIGV4dDRfZnJlZV9pbm9kZXNfY291bnQoc2IsIGRlc2MpICYmCisJCQlleHQ0X2ZyZWVfYmxrc19jb3VudChzYiwgZGVzYykpCiAJCXJldHVybiAwOwogCiAJLyoKQEAgLTU0OCw4ICs1NzYsOCBAQAogCQlpZiAoKmdyb3VwID49IG5ncm91cHMpCiAJCQkqZ3JvdXAgLT0gbmdyb3VwczsKIAkJZGVzYyA9IGV4dDRfZ2V0X2dyb3VwX2Rlc2Moc2IsICpncm91cCwgTlVMTCk7Ci0JCWlmIChkZXNjICYmIGxlMTZfdG9fY3B1KGRlc2MtPmJnX2ZyZWVfaW5vZGVzX2NvdW50KSAmJgotCQkJCWxlMTZfdG9fY3B1KGRlc2MtPmJnX2ZyZWVfYmxvY2tzX2NvdW50KSkKKwkJaWYgKGRlc2MgJiYgZXh0NF9mcmVlX2lub2Rlc19jb3VudChzYiwgZGVzYykgJiYKKwkJCQlleHQ0X2ZyZWVfYmxrc19jb3VudChzYiwgZGVzYykpCiAJCQlyZXR1cm4gMDsKIAl9CiAKQEAgLTU2Miw3ICs1OTAsNyBAQAogCQlpZiAoKysqZ3JvdXAgPj0gbmdyb3VwcykKIAkJCSpncm91cCA9IDA7CiAJCWRlc2MgPSBleHQ0X2dldF9ncm91cF9kZXNjKHNiLCAqZ3JvdXAsIE5VTEwpOwotCQlpZiAoZGVzYyAmJiBsZTE2X3RvX2NwdShkZXNjLT5iZ19mcmVlX2lub2Rlc19jb3VudCkpCisJCWlmIChkZXNjICYmIGV4dDRfZnJlZV9pbm9kZXNfY291bnQoc2IsIGRlc2MpKQogCQkJcmV0dXJuIDA7CiAJfQogCkBAIC01NzAsNiArNTk4LDc5IEBACiB9CiAKIC8qCisgKiBjbGFpbSB0aGUgaW5vZGUgZnJvbSB0aGUgaW5vZGUgYml0bWFwLiBJZiB0aGUgZ3JvdXAKKyAqIGlzIHVuaW5pdCB3ZSBuZWVkIHRvIHRha2UgdGhlIGdyb3VwcydzIHNiX2JnbF9sb2NrCisgKiBhbmQgY2xlYXIgdGhlIHVuaW5pdCBmbGFnLiBUaGUgaW5vZGUgYml0bWFwIHVwZGF0ZQorICogYW5kIGdyb3VwIGRlc2MgdW5pbml0IGZsYWcgY2xlYXIgc2hvdWxkIGJlIGRvbmUKKyAqIGFmdGVyIGhvbGRpbmcgc2JfYmdsX2xvY2sgc28gdGhhdCBleHQ0X3JlYWRfaW5vZGVfYml0bWFwCisgKiBkb2Vzbid0IHJhY2Ugd2l0aCB0aGUgZXh0NF9jbGFpbV9pbm9kZQorICovCitzdGF0aWMgaW50IGV4dDRfY2xhaW1faW5vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwkJCXN0cnVjdCBidWZmZXJfaGVhZCAqaW5vZGVfYml0bWFwX2JoLAorCQkJdW5zaWduZWQgbG9uZyBpbm8sIGV4dDRfZ3JvdXBfdCBncm91cCwgaW50IG1vZGUpCit7CisJaW50IGZyZWUgPSAwLCByZXR2YWwgPSAwLCBjb3VudDsKKwlzdHJ1Y3QgZXh0NF9zYl9pbmZvICpzYmkgPSBFWFQ0X1NCKHNiKTsKKwlzdHJ1Y3QgZXh0NF9ncm91cF9kZXNjICpnZHAgPSBleHQ0X2dldF9ncm91cF9kZXNjKHNiLCBncm91cCwgTlVMTCk7CisKKwlzcGluX2xvY2soc2JfYmdsX2xvY2soc2JpLCBncm91cCkpOworCWlmIChleHQ0X3NldF9iaXQoaW5vLCBpbm9kZV9iaXRtYXBfYmgtPmJfZGF0YSkpIHsKKwkJLyogbm90IGEgZnJlZSBpbm9kZSAqLworCQlyZXR2YWwgPSAxOworCQlnb3RvIGVycl9yZXQ7CisJfQorCWlubysrOworCWlmICgoZ3JvdXAgPT0gMCAmJiBpbm8gPCBFWFQ0X0ZJUlNUX0lOTyhzYikpIHx8CisJCQlpbm8gPiBFWFQ0X0lOT0RFU19QRVJfR1JPVVAoc2IpKSB7CisJCXNwaW5fdW5sb2NrKHNiX2JnbF9sb2NrKHNiaSwgZ3JvdXApKTsKKwkJZXh0NF9lcnJvcihzYiwgX19mdW5jX18sCisJCQkgICAicmVzZXJ2ZWQgaW5vZGUgb3IgaW5vZGUgPiBpbm9kZXMgY291bnQgLSAiCisJCQkgICAiYmxvY2tfZ3JvdXAgPSAldSwgaW5vZGU9JWx1IiwgZ3JvdXAsCisJCQkgICBpbm8gKyBncm91cCAqIEVYVDRfSU5PREVTX1BFUl9HUk9VUChzYikpOworCQlyZXR1cm4gMTsKKwl9CisJLyogSWYgd2UgZGlkbid0IGFsbG9jYXRlIGZyb20gd2l0aGluIHRoZSBpbml0aWFsaXplZCBwYXJ0IG9mIHRoZSBpbm9kZQorCSAqIHRhYmxlIHRoZW4gd2UgbmVlZCB0byBpbml0aWFsaXplIHVwIHRvIHRoaXMgaW5vZGUuICovCisJaWYgKEVYVDRfSEFTX1JPX0NPTVBBVF9GRUFUVVJFKHNiLCBFWFQ0X0ZFQVRVUkVfUk9fQ09NUEFUX0dEVF9DU1VNKSkgeworCisJCWlmIChnZHAtPmJnX2ZsYWdzICYgY3B1X3RvX2xlMTYoRVhUNF9CR19JTk9ERV9VTklOSVQpKSB7CisJCQlnZHAtPmJnX2ZsYWdzICY9IGNwdV90b19sZTE2KH5FWFQ0X0JHX0lOT0RFX1VOSU5JVCk7CisJCQkvKiBXaGVuIG1hcmtpbmcgdGhlIGJsb2NrIGdyb3VwIHdpdGgKKwkJCSAqIH5FWFQ0X0JHX0lOT0RFX1VOSU5JVCB3ZSBkb24ndCB3YW50IHRvIGRlcGVuZAorCQkJICogb24gdGhlIHZhbHVlIG9mIGJnX2l0YWJsZV91bnVzZWQgZXZlbiB0aG91Z2gKKwkJCSAqIG1rZTJmcyBjb3VsZCBoYXZlIGluaXRpYWxpemVkIHRoZSBzYW1lIGZvciB1cy4KKwkJCSAqIEluc3RlYWQgd2UgY2FsY3VsYXRlZCB0aGUgdmFsdWUgYmVsb3cKKwkJCSAqLworCisJCQlmcmVlID0gMDsKKwkJfSBlbHNlIHsKKwkJCWZyZWUgPSBFWFQ0X0lOT0RFU19QRVJfR1JPVVAoc2IpIC0KKwkJCQlleHQ0X2l0YWJsZV91bnVzZWRfY291bnQoc2IsIGdkcCk7CisJCX0KKworCQkvKgorCQkgKiBDaGVjayB0aGUgcmVsYXRpdmUgaW5vZGUgbnVtYmVyIGFnYWluc3QgdGhlIGxhc3QgdXNlZAorCQkgKiByZWxhdGl2ZSBpbm9kZSBudW1iZXIgaW4gdGhpcyBncm91cC4gaWYgaXQgaXMgZ3JlYXRlcgorCQkgKiB3ZSBuZWVkIHRvICB1cGRhdGUgdGhlIGJnX2l0YWJsZV91bnVzZWQgY291bnQKKwkJICoKKwkJICovCisJCWlmIChpbm8gPiBmcmVlKQorCQkJZXh0NF9pdGFibGVfdW51c2VkX3NldChzYiwgZ2RwLAorCQkJCQkoRVhUNF9JTk9ERVNfUEVSX0dST1VQKHNiKSAtIGlubykpOworCX0KKwljb3VudCA9IGV4dDRfZnJlZV9pbm9kZXNfY291bnQoc2IsIGdkcCkgLSAxOworCWV4dDRfZnJlZV9pbm9kZXNfc2V0KHNiLCBnZHAsIGNvdW50KTsKKwlpZiAoU19JU0RJUihtb2RlKSkgeworCQljb3VudCA9IGV4dDRfdXNlZF9kaXJzX2NvdW50KHNiLCBnZHApICsgMTsKKwkJZXh0NF91c2VkX2RpcnNfc2V0KHNiLCBnZHAsIGNvdW50KTsKKwl9CisJZ2RwLT5iZ19jaGVja3N1bSA9IGV4dDRfZ3JvdXBfZGVzY19jc3VtKHNiaSwgZ3JvdXAsIGdkcCk7CitlcnJfcmV0OgorCXNwaW5fdW5sb2NrKHNiX2JnbF9sb2NrKHNiaSwgZ3JvdXApKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKgogICogVGhlcmUgYXJlIHR3byBwb2xpY2llcyBmb3IgYWxsb2NhdGluZyBhbiBpbm9kZS4gIElmIHRoZSBuZXcgaW5vZGUgaXMKICAqIGEgZGlyZWN0b3J5LCB0aGVuIGEgZm9yd2FyZCBzZWFyY2ggaXMgbWFkZSBmb3IgYSBibG9jayBncm91cCB3aXRoIGJvdGgKICAqIGZyZWUgc3BhY2UgYW5kIGEgbG93IGRpcmVjdG9yeS10by1pbm9kZSByYXRpbzsgaWYgdGhhdCBmYWlscywgdGhlbiBvZgpAQCAtNTgyLDggKzY4Myw4IEBACiBzdHJ1Y3QgaW5vZGUgKmV4dDRfbmV3X2lub2RlKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqZGlyLCBpbnQgbW9kZSkKIHsKIAlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiOwotCXN0cnVjdCBidWZmZXJfaGVhZCAqYml0bWFwX2JoID0gTlVMTDsKLQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoMjsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmlub2RlX2JpdG1hcF9iaCA9IE5VTEw7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpncm91cF9kZXNjX2JoOwogCWV4dDRfZ3JvdXBfdCBncm91cCA9IDA7CiAJdW5zaWduZWQgbG9uZyBpbm8gPSAwOwogCXN0cnVjdCBpbm9kZSAqaW5vZGU7CkBAIC02MDIsNiArNzAzLDggQEAKIAkJcmV0dXJuIEVSUl9QVFIoLUVQRVJNKTsKIAogCXNiID0gZGlyLT5pX3NiOworCXRyYWNlX21hcmsoZXh0NF9yZXF1ZXN0X2lub2RlLCAiZGV2ICVzIGRpciAlbHUgbW9kZSAlZCIsIHNiLT5zX2lkLAorCQkgICBkaXItPmlfaW5vLCBtb2RlKTsKIAlpbm9kZSA9IG5ld19pbm9kZShzYik7CiAJaWYgKCFpbm9kZSkKIAkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CkBAIC02MzEsNDAgKzczNCw1MiBAQAogCWZvciAoaSA9IDA7IGkgPCBzYmktPnNfZ3JvdXBzX2NvdW50OyBpKyspIHsKIAkJZXJyID0gLUVJTzsKIAotCQlnZHAgPSBleHQ0X2dldF9ncm91cF9kZXNjKHNiLCBncm91cCwgJmJoMik7CisJCWdkcCA9IGV4dDRfZ2V0X2dyb3VwX2Rlc2Moc2IsIGdyb3VwLCAmZ3JvdXBfZGVzY19iaCk7CiAJCWlmICghZ2RwKQogCQkJZ290byBmYWlsOwogCi0JCWJyZWxzZShiaXRtYXBfYmgpOwotCQliaXRtYXBfYmggPSBleHQ0X3JlYWRfaW5vZGVfYml0bWFwKHNiLCBncm91cCk7Ci0JCWlmICghYml0bWFwX2JoKQorCQlicmVsc2UoaW5vZGVfYml0bWFwX2JoKTsKKwkJaW5vZGVfYml0bWFwX2JoID0gZXh0NF9yZWFkX2lub2RlX2JpdG1hcChzYiwgZ3JvdXApOworCQlpZiAoIWlub2RlX2JpdG1hcF9iaCkKIAkJCWdvdG8gZmFpbDsKIAogCQlpbm8gPSAwOwogCiByZXBlYXRfaW5fdGhpc19ncm91cDoKIAkJaW5vID0gZXh0NF9maW5kX25leHRfemVyb19iaXQoKHVuc2lnbmVkIGxvbmcgKikKLQkJCQliaXRtYXBfYmgtPmJfZGF0YSwgRVhUNF9JTk9ERVNfUEVSX0dST1VQKHNiKSwgaW5vKTsKKwkJCQkJICAgICAgaW5vZGVfYml0bWFwX2JoLT5iX2RhdGEsCisJCQkJCSAgICAgIEVYVDRfSU5PREVTX1BFUl9HUk9VUChzYiksIGlubyk7CisKIAkJaWYgKGlubyA8IEVYVDRfSU5PREVTX1BFUl9HUk9VUChzYikpIHsKIAotCQkJQlVGRkVSX1RSQUNFKGJpdG1hcF9iaCwgImdldF93cml0ZV9hY2Nlc3MiKTsKLQkJCWVyciA9IGV4dDRfam91cm5hbF9nZXRfd3JpdGVfYWNjZXNzKGhhbmRsZSwgYml0bWFwX2JoKTsKKwkJCUJVRkZFUl9UUkFDRShpbm9kZV9iaXRtYXBfYmgsICJnZXRfd3JpdGVfYWNjZXNzIik7CisJCQllcnIgPSBleHQ0X2pvdXJuYWxfZ2V0X3dyaXRlX2FjY2VzcyhoYW5kbGUsCisJCQkJCQkJICAgIGlub2RlX2JpdG1hcF9iaCk7CiAJCQlpZiAoZXJyKQogCQkJCWdvdG8gZmFpbDsKIAotCQkJaWYgKCFleHQ0X3NldF9iaXRfYXRvbWljKHNiX2JnbF9sb2NrKHNiaSwgZ3JvdXApLAotCQkJCQkJaW5vLCBiaXRtYXBfYmgtPmJfZGF0YSkpIHsKKwkJCUJVRkZFUl9UUkFDRShncm91cF9kZXNjX2JoLCAiZ2V0X3dyaXRlX2FjY2VzcyIpOworCQkJZXJyID0gZXh0NF9qb3VybmFsX2dldF93cml0ZV9hY2Nlc3MoaGFuZGxlLAorCQkJCQkJCQlncm91cF9kZXNjX2JoKTsKKwkJCWlmIChlcnIpCisJCQkJZ290byBmYWlsOworCQkJaWYgKCFleHQ0X2NsYWltX2lub2RlKHNiLCBpbm9kZV9iaXRtYXBfYmgsCisJCQkJCQlpbm8sIGdyb3VwLCBtb2RlKSkgewogCQkJCS8qIHdlIHdvbiBpdCAqLwotCQkJCUJVRkZFUl9UUkFDRShiaXRtYXBfYmgsCi0JCQkJCSJjYWxsIGV4dDRfam91cm5hbF9kaXJ0eV9tZXRhZGF0YSIpOwotCQkJCWVyciA9IGV4dDRfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsCi0JCQkJCQkJCWJpdG1hcF9iaCk7CisJCQkJQlVGRkVSX1RSQUNFKGlub2RlX2JpdG1hcF9iaCwKKwkJCQkJImNhbGwgZXh0NF9oYW5kbGVfZGlydHlfbWV0YWRhdGEiKTsKKwkJCQllcnIgPSBleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsCisJCQkJCQkJCSBpbm9kZSwKKwkJCQkJCQlpbm9kZV9iaXRtYXBfYmgpOwogCQkJCWlmIChlcnIpCiAJCQkJCWdvdG8gZmFpbDsKKwkJCQkvKiB6ZXJvIGJpdCBpcyBpbm9kZSBudW1iZXIgMSovCisJCQkJaW5vKys7CiAJCQkJZ290byBnb3Q7CiAJCQl9CiAJCQkvKiB3ZSBsb3N0IGl0ICovCi0JCQlqYmQyX2pvdXJuYWxfcmVsZWFzZV9idWZmZXIoaGFuZGxlLCBiaXRtYXBfYmgpOworCQkJZXh0NF9oYW5kbGVfcmVsZWFzZV9idWZmZXIoaGFuZGxlLCBpbm9kZV9iaXRtYXBfYmgpOworCQkJZXh0NF9oYW5kbGVfcmVsZWFzZV9idWZmZXIoaGFuZGxlLCBncm91cF9kZXNjX2JoKTsKIAogCQkJaWYgKCsraW5vIDwgRVhUNF9JTk9ERVNfUEVSX0dST1VQKHNiKSkKIAkJCQlnb3RvIHJlcGVhdF9pbl90aGlzX2dyb3VwOwpAQCAtNjg0LDMwICs3OTksMTYgQEAKIAlnb3RvIG91dDsKIAogZ290OgotCWlubysrOwotCWlmICgoZ3JvdXAgPT0gMCAmJiBpbm8gPCBFWFQ0X0ZJUlNUX0lOTyhzYikpIHx8Ci0JICAgIGlubyA+IEVYVDRfSU5PREVTX1BFUl9HUk9VUChzYikpIHsKLQkJZXh0NF9lcnJvcihzYiwgX19mdW5jX18sCi0JCQkgICAicmVzZXJ2ZWQgaW5vZGUgb3IgaW5vZGUgPiBpbm9kZXMgY291bnQgLSAiCi0JCQkgICAiYmxvY2tfZ3JvdXAgPSAlbHUsIGlub2RlPSVsdSIsIGdyb3VwLAotCQkJICAgaW5vICsgZ3JvdXAgKiBFWFQ0X0lOT0RFU19QRVJfR1JPVVAoc2IpKTsKLQkJZXJyID0gLUVJTzsKLQkJZ290byBmYWlsOwotCX0KLQotCUJVRkZFUl9UUkFDRShiaDIsICJnZXRfd3JpdGVfYWNjZXNzIik7Ci0JZXJyID0gZXh0NF9qb3VybmFsX2dldF93cml0ZV9hY2Nlc3MoaGFuZGxlLCBiaDIpOwotCWlmIChlcnIpIGdvdG8gZmFpbDsKLQogCS8qIFdlIG1heSBoYXZlIHRvIGluaXRpYWxpemUgdGhlIGJsb2NrIGJpdG1hcCBpZiBpdCBpc24ndCBhbHJlYWR5ICovCiAJaWYgKEVYVDRfSEFTX1JPX0NPTVBBVF9GRUFUVVJFKHNiLCBFWFQ0X0ZFQVRVUkVfUk9fQ09NUEFUX0dEVF9DU1VNKSAmJgogCSAgICBnZHAtPmJnX2ZsYWdzICYgY3B1X3RvX2xlMTYoRVhUNF9CR19CTE9DS19VTklOSVQpKSB7Ci0JCXN0cnVjdCBidWZmZXJfaGVhZCAqYmxvY2tfYmggPSBleHQ0X3JlYWRfYmxvY2tfYml0bWFwKHNiLCBncm91cCk7CisJCXN0cnVjdCBidWZmZXJfaGVhZCAqYmxvY2tfYml0bWFwX2JoOwogCi0JCUJVRkZFUl9UUkFDRShibG9ja19iaCwgImdldCBibG9jayBiaXRtYXAgYWNjZXNzIik7Ci0JCWVyciA9IGV4dDRfam91cm5hbF9nZXRfd3JpdGVfYWNjZXNzKGhhbmRsZSwgYmxvY2tfYmgpOworCQlibG9ja19iaXRtYXBfYmggPSBleHQ0X3JlYWRfYmxvY2tfYml0bWFwKHNiLCBncm91cCk7CisJCUJVRkZFUl9UUkFDRShibG9ja19iaXRtYXBfYmgsICJnZXQgYmxvY2sgYml0bWFwIGFjY2VzcyIpOworCQllcnIgPSBleHQ0X2pvdXJuYWxfZ2V0X3dyaXRlX2FjY2VzcyhoYW5kbGUsIGJsb2NrX2JpdG1hcF9iaCk7CiAJCWlmIChlcnIpIHsKLQkJCWJyZWxzZShibG9ja19iaCk7CisJCQlicmVsc2UoYmxvY2tfYml0bWFwX2JoKTsKIAkJCWdvdG8gZmFpbDsKIAkJfQogCkBAIC03MTUsOSArODE2LDkgQEAKIAkJc3Bpbl9sb2NrKHNiX2JnbF9sb2NrKHNiaSwgZ3JvdXApKTsKIAkJLyogcmVjaGVjayBhbmQgY2xlYXIgZmxhZyB1bmRlciBsb2NrIGlmIHdlIHN0aWxsIG5lZWQgdG8gKi8KIAkJaWYgKGdkcC0+YmdfZmxhZ3MgJiBjcHVfdG9fbGUxNihFWFQ0X0JHX0JMT0NLX1VOSU5JVCkpIHsKLQkJCWdkcC0+YmdfZmxhZ3MgJj0gY3B1X3RvX2xlMTYofkVYVDRfQkdfQkxPQ0tfVU5JTklUKTsKIAkJCWZyZWUgPSBleHQ0X2ZyZWVfYmxvY2tzX2FmdGVyX2luaXQoc2IsIGdyb3VwLCBnZHApOwotCQkJZ2RwLT5iZ19mcmVlX2Jsb2Nrc19jb3VudCA9IGNwdV90b19sZTE2KGZyZWUpOworCQkJZ2RwLT5iZ19mbGFncyAmPSBjcHVfdG9fbGUxNih+RVhUNF9CR19CTE9DS19VTklOSVQpOworCQkJZXh0NF9mcmVlX2Jsa3Nfc2V0KHNiLCBnZHAsIGZyZWUpOwogCQkJZ2RwLT5iZ19jaGVja3N1bSA9IGV4dDRfZ3JvdXBfZGVzY19jc3VtKHNiaSwgZ3JvdXAsCiAJCQkJCQkJCWdkcCk7CiAJCX0KQEAgLTcyNSw1NSArODI2LDE5IEBACiAKIAkJLyogRG9uJ3QgbmVlZCB0byBkaXJ0eSBiaXRtYXAgYmxvY2sgaWYgd2UgZGlkbid0IGNoYW5nZSBpdCAqLwogCQlpZiAoZnJlZSkgewotCQkJQlVGRkVSX1RSQUNFKGJsb2NrX2JoLCAiZGlydHkgYmxvY2sgYml0bWFwIik7Ci0JCQllcnIgPSBleHQ0X2pvdXJuYWxfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBibG9ja19iaCk7CisJCQlCVUZGRVJfVFJBQ0UoYmxvY2tfYml0bWFwX2JoLCAiZGlydHkgYmxvY2sgYml0bWFwIik7CisJCQllcnIgPSBleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsCisJCQkJCQkJTlVMTCwgYmxvY2tfYml0bWFwX2JoKTsKIAkJfQogCi0JCWJyZWxzZShibG9ja19iaCk7CisJCWJyZWxzZShibG9ja19iaXRtYXBfYmgpOwogCQlpZiAoZXJyKQogCQkJZ290byBmYWlsOwogCX0KLQotCXNwaW5fbG9jayhzYl9iZ2xfbG9jayhzYmksIGdyb3VwKSk7Ci0JLyogSWYgd2UgZGlkbid0IGFsbG9jYXRlIGZyb20gd2l0aGluIHRoZSBpbml0aWFsaXplZCBwYXJ0IG9mIHRoZSBpbm9kZQotCSAqIHRhYmxlIHRoZW4gd2UgbmVlZCB0byBpbml0aWFsaXplIHVwIHRvIHRoaXMgaW5vZGUuICovCi0JaWYgKEVYVDRfSEFTX1JPX0NPTVBBVF9GRUFUVVJFKHNiLCBFWFQ0X0ZFQVRVUkVfUk9fQ09NUEFUX0dEVF9DU1VNKSkgewotCQlpZiAoZ2RwLT5iZ19mbGFncyAmIGNwdV90b19sZTE2KEVYVDRfQkdfSU5PREVfVU5JTklUKSkgewotCQkJZ2RwLT5iZ19mbGFncyAmPSBjcHVfdG9fbGUxNih+RVhUNF9CR19JTk9ERV9VTklOSVQpOwotCi0JCQkvKiBXaGVuIG1hcmtpbmcgdGhlIGJsb2NrIGdyb3VwIHdpdGgKLQkJCSAqIH5FWFQ0X0JHX0lOT0RFX1VOSU5JVCB3ZSBkb24ndCB3YW50IHRvIGRlcGVuZAotCQkJICogb24gdGhlIHZhbHVlIG9mIGJnX2l0YWJsZV91bnVzZWQgZXZlbiB0aG91Z2gKLQkJCSAqIG1rZTJmcyBjb3VsZCBoYXZlIGluaXRpYWxpemVkIHRoZSBzYW1lIGZvciB1cy4KLQkJCSAqIEluc3RlYWQgd2UgY2FsY3VsYXRlZCB0aGUgdmFsdWUgYmVsb3cKLQkJCSAqLwotCi0JCQlmcmVlID0gMDsKLQkJfSBlbHNlIHsKLQkJCWZyZWUgPSBFWFQ0X0lOT0RFU19QRVJfR1JPVVAoc2IpIC0KLQkJCQlsZTE2X3RvX2NwdShnZHAtPmJnX2l0YWJsZV91bnVzZWQpOwotCQl9Ci0KLQkJLyoKLQkJICogQ2hlY2sgdGhlIHJlbGF0aXZlIGlub2RlIG51bWJlciBhZ2FpbnN0IHRoZSBsYXN0IHVzZWQKLQkJICogcmVsYXRpdmUgaW5vZGUgbnVtYmVyIGluIHRoaXMgZ3JvdXAuIGlmIGl0IGlzIGdyZWF0ZXIKLQkJICogd2UgbmVlZCB0byAgdXBkYXRlIHRoZSBiZ19pdGFibGVfdW51c2VkIGNvdW50Ci0JCSAqCi0JCSAqLwotCQlpZiAoaW5vID4gZnJlZSkKLQkJCWdkcC0+YmdfaXRhYmxlX3VudXNlZCA9Ci0JCQkJY3B1X3RvX2xlMTYoRVhUNF9JTk9ERVNfUEVSX0dST1VQKHNiKSAtIGlubyk7Ci0JfQotCi0JbGUxNl9hZGRfY3B1KCZnZHAtPmJnX2ZyZWVfaW5vZGVzX2NvdW50LCAtMSk7Ci0JaWYgKFNfSVNESVIobW9kZSkpIHsKLQkJbGUxNl9hZGRfY3B1KCZnZHAtPmJnX3VzZWRfZGlyc19jb3VudCwgMSk7Ci0JfQotCWdkcC0+YmdfY2hlY2tzdW0gPSBleHQ0X2dyb3VwX2Rlc2NfY3N1bShzYmksIGdyb3VwLCBnZHApOwotCXNwaW5fdW5sb2NrKHNiX2JnbF9sb2NrKHNiaSwgZ3JvdXApKTsKLQlCVUZGRVJfVFJBQ0UoYmgyLCAiY2FsbCBleHQ0X2pvdXJuYWxfZGlydHlfbWV0YWRhdGEiKTsKLQllcnIgPSBleHQ0X2pvdXJuYWxfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBiaDIpOwotCWlmIChlcnIpIGdvdG8gZmFpbDsKKwlCVUZGRVJfVFJBQ0UoZ3JvdXBfZGVzY19iaCwgImNhbGwgZXh0NF9oYW5kbGVfZGlydHlfbWV0YWRhdGEiKTsKKwllcnIgPSBleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIE5VTEwsIGdyb3VwX2Rlc2NfYmgpOworCWlmIChlcnIpCisJCWdvdG8gZmFpbDsKIAogCXBlcmNwdV9jb3VudGVyX2RlYygmc2JpLT5zX2ZyZWVpbm9kZXNfY291bnRlcik7CiAJaWYgKFNfSVNESVIobW9kZSkpCkBAIC04MjUsNyArODkwLDcgQEAKIAogCWV4dDRfc2V0X2lub2RlX2ZsYWdzKGlub2RlKTsKIAlpZiAoSVNfRElSU1lOQyhpbm9kZSkpCi0JCWhhbmRsZS0+aF9zeW5jID0gMTsKKwkJZXh0NF9oYW5kbGVfc3luYyhoYW5kbGUpOwogCWlmIChpbnNlcnRfaW5vZGVfbG9ja2VkKGlub2RlKSA8IDApIHsKIAkJZXJyID0gLUVJTlZBTDsKIAkJZ290byBmYWlsX2Ryb3A7CkBAIC04NTIsNyArOTE3LDcgQEAKIAlpZiAoZXJyKQogCQlnb3RvIGZhaWxfZnJlZV9kcm9wOwogCi0JaWYgKHRlc3Rfb3B0KHNiLCBFWFRFTlRTKSkgeworCWlmIChFWFQ0X0hBU19JTkNPTVBBVF9GRUFUVVJFKHNiLCBFWFQ0X0ZFQVRVUkVfSU5DT01QQVRfRVhURU5UUykpIHsKIAkJLyogc2V0IGV4dGVudCBmbGFnIG9ubHkgZm9yIGRpcmVjdG9yeSwgZmlsZSBhbmQgbm9ybWFsIHN5bWxpbmsqLwogCQlpZiAoU19JU0RJUihtb2RlKSB8fCBTX0lTUkVHKG1vZGUpIHx8IFNfSVNMTksobW9kZSkpIHsKIAkJCUVYVDRfSShpbm9kZSktPmlfZmxhZ3MgfD0gRVhUNF9FWFRFTlRTX0ZMOwpAQCAtODY3LDYgKzkzMiw4IEBACiAJfQogCiAJZXh0NF9kZWJ1ZygiYWxsb2NhdGluZyBpbm9kZSAlbHVcbiIsIGlub2RlLT5pX2lubyk7CisJdHJhY2VfbWFyayhleHQ0X2FsbG9jYXRlX2lub2RlLCAiZGV2ICVzIGlubyAlbHUgZGlyICVsdSBtb2RlICVkIiwKKwkJICAgc2ItPnNfaWQsIGlub2RlLT5pX2lubywgZGlyLT5pX2lubywgbW9kZSk7CiAJZ290byByZWFsbHlfb3V0OwogZmFpbDoKIAlleHQ0X3N0ZF9lcnJvcihzYiwgZXJyKTsKQEAgLTg3NCw3ICs5NDEsNyBAQAogCWlwdXQoaW5vZGUpOwogCXJldCA9IEVSUl9QVFIoZXJyKTsKIHJlYWxseV9vdXQ6Ci0JYnJlbHNlKGJpdG1hcF9iaCk7CisJYnJlbHNlKGlub2RlX2JpdG1hcF9iaCk7CiAJcmV0dXJuIHJldDsKIAogZmFpbF9mcmVlX2Ryb3A6CkBAIC04ODYsNyArOTUzLDcgQEAKIAlpbm9kZS0+aV9ubGluayA9IDA7CiAJdW5sb2NrX25ld19pbm9kZShpbm9kZSk7CiAJaXB1dChpbm9kZSk7Ci0JYnJlbHNlKGJpdG1hcF9iaCk7CisJYnJlbHNlKGlub2RlX2JpdG1hcF9iaCk7CiAJcmV0dXJuIEVSUl9QVFIoZXJyKTsKIH0KIApAQCAtOTg1LDcgKzEwNTIsNyBAQAogCQlnZHAgPSBleHQ0X2dldF9ncm91cF9kZXNjKHNiLCBpLCBOVUxMKTsKIAkJaWYgKCFnZHApCiAJCQljb250aW51ZTsKLQkJZGVzY19jb3VudCArPSBsZTE2X3RvX2NwdShnZHAtPmJnX2ZyZWVfaW5vZGVzX2NvdW50KTsKKwkJZGVzY19jb3VudCArPSBleHQ0X2ZyZWVfaW5vZGVzX2NvdW50KHNiLCBnZHApOwogCQlicmVsc2UoYml0bWFwX2JoKTsKIAkJYml0bWFwX2JoID0gZXh0NF9yZWFkX2lub2RlX2JpdG1hcChzYiwgaSk7CiAJCWlmICghYml0bWFwX2JoKQpAQCAtOTkzLDcgKzEwNjAsNyBAQAogCiAJCXggPSBleHQ0X2NvdW50X2ZyZWUoYml0bWFwX2JoLCBFWFQ0X0lOT0RFU19QRVJfR1JPVVAoc2IpIC8gOCk7CiAJCXByaW50ayhLRVJOX0RFQlVHICJncm91cCAlbHU6IHN0b3JlZCA9ICVkLCBjb3VudGVkID0gJWx1XG4iLAotCQkJaSwgbGUxNl90b19jcHUoZ2RwLT5iZ19mcmVlX2lub2Rlc19jb3VudCksIHgpOworCQkJaSwgZXh0NF9mcmVlX2lub2Rlc19jb3VudChzYiwgZ2RwKSwgeCk7CiAJCWJpdG1hcF9jb3VudCArPSB4OwogCX0KIAlicmVsc2UoYml0bWFwX2JoKTsKQEAgLTEwMDcsNyArMTA3NCw3IEBACiAJCWdkcCA9IGV4dDRfZ2V0X2dyb3VwX2Rlc2Moc2IsIGksIE5VTEwpOwogCQlpZiAoIWdkcCkKIAkJCWNvbnRpbnVlOwotCQlkZXNjX2NvdW50ICs9IGxlMTZfdG9fY3B1KGdkcC0+YmdfZnJlZV9pbm9kZXNfY291bnQpOworCQlkZXNjX2NvdW50ICs9IGV4dDRfZnJlZV9pbm9kZXNfY291bnQoc2IsIGdkcCk7CiAJCWNvbmRfcmVzY2hlZCgpOwogCX0KIAlyZXR1cm4gZGVzY19jb3VudDsKQEAgLTEwMjQsOCArMTA5MSw3IEBACiAJCXN0cnVjdCBleHQ0X2dyb3VwX2Rlc2MgKmdkcCA9IGV4dDRfZ2V0X2dyb3VwX2Rlc2Moc2IsIGksIE5VTEwpOwogCQlpZiAoIWdkcCkKIAkJCWNvbnRpbnVlOwotCQljb3VudCArPSBsZTE2X3RvX2NwdShnZHAtPmJnX3VzZWRfZGlyc19jb3VudCk7CisJCWNvdW50ICs9IGV4dDRfdXNlZF9kaXJzX2NvdW50KHNiLCBnZHApOwogCX0KIAlyZXR1cm4gY291bnQ7CiB9Ci0KZGlmZiAtLWdpdCBhL2ZzL2V4dDQvaW5vZGUuYyBiL2ZzL2V4dDQvaW5vZGUuYwppbmRleCA5OGQzZmU3Li5hNjQ0NGNlIDEwMDY0NAotLS0gYS9mcy9leHQ0L2lub2RlLmMKKysrIGIvZnMvZXh0NC9pbm9kZS5jCkBAIC03MiwxMiArNzIsMTcgQEAKICAqICJiaCIgbWF5IGJlIE5VTEw6IGEgbWV0YWRhdGEgYmxvY2sgbWF5IGhhdmUgYmVlbiBmcmVlZCBmcm9tIG1lbW9yeQogICogYnV0IHRoZXJlIG1heSBzdGlsbCBiZSBhIHJlY29yZCBvZiBpdCBpbiB0aGUgam91cm5hbCwgYW5kIHRoYXQgcmVjb3JkCiAgKiBzdGlsbCBuZWVkcyB0byBiZSByZXZva2VkLgorICoKKyAqIElmIHRoZSBoYW5kbGUgaXNuJ3QgdmFsaWQgd2UncmUgbm90IGpvdXJuYWxpbmcgc28gdGhlcmUncyBub3RoaW5nIHRvIGRvLgogICovCiBpbnQgZXh0NF9mb3JnZXQoaGFuZGxlX3QgKmhhbmRsZSwgaW50IGlzX21ldGFkYXRhLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAogCQkJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwgZXh0NF9mc2Jsa190IGJsb2NrbnIpCiB7CiAJaW50IGVycjsKIAorCWlmICghZXh0NF9oYW5kbGVfdmFsaWQoaGFuZGxlKSkKKwkJcmV0dXJuIDA7CisKIAltaWdodF9zbGVlcCgpOwogCiAJQlVGRkVSX1RSQUNFKGJoLCAiZW50ZXIiKTsKQEAgLTE3MCw3ICsxNzUsOSBAQAogICovCiBzdGF0aWMgaW50IHRyeV90b19leHRlbmRfdHJhbnNhY3Rpb24oaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSkKIHsKLQlpZiAoaGFuZGxlLT5oX2J1ZmZlcl9jcmVkaXRzID4gRVhUNF9SRVNFUlZFX1RSQU5TX0JMT0NLUykKKwlpZiAoIWV4dDRfaGFuZGxlX3ZhbGlkKGhhbmRsZSkpCisJCXJldHVybiAwOworCWlmIChleHQ0X2hhbmRsZV9oYXNfZW5vdWdoX2NyZWRpdHMoaGFuZGxlLCBFWFQ0X1JFU0VSVkVfVFJBTlNfQkxPQ0tTKzEpKQogCQlyZXR1cm4gMDsKIAlpZiAoIWV4dDRfam91cm5hbF9leHRlbmQoaGFuZGxlLCBibG9ja3NfZm9yX3RydW5jYXRlKGlub2RlKSkpCiAJCXJldHVybiAwOwpAQCAtMTg0LDYgKzE5MSw3IEBACiAgKi8KIHN0YXRpYyBpbnQgZXh0NF9qb3VybmFsX3Rlc3RfcmVzdGFydChoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlKQogeworCUJVR19PTihFWFQ0X0pPVVJOQUwoaW5vZGUpID09IE5VTEwpOwogCWpiZF9kZWJ1ZygyLCAicmVzdGFydGluZyBoYW5kbGUgJXBcbiIsIGhhbmRsZSk7CiAJcmV0dXJuIGV4dDRfam91cm5hbF9yZXN0YXJ0KGhhbmRsZSwgYmxvY2tzX2Zvcl90cnVuY2F0ZShpbm9kZSkpOwogfQpAQCAtMjE2LDcgKzIyNCw3IEBACiAJfQogCiAJaWYgKElTX1NZTkMoaW5vZGUpKQotCQloYW5kbGUtPmhfc3luYyA9IDE7CisJCWV4dDRfaGFuZGxlX3N5bmMoaGFuZGxlKTsKIAlpbm9kZS0+aV9zaXplID0gMDsKIAllcnIgPSBleHQ0X21hcmtfaW5vZGVfZGlydHkoaGFuZGxlLCBpbm9kZSk7CiAJaWYgKGVycikgewpAQCAtMjMzLDcgKzI0MSw3IEBACiAJICogZW5vdWdoIGNyZWRpdHMgbGVmdCBpbiB0aGUgaGFuZGxlIHRvIHJlbW92ZSB0aGUgaW5vZGUgZnJvbQogCSAqIHRoZSBvcnBoYW4gbGlzdCBhbmQgc2V0IHRoZSBkdGltZSBmaWVsZC4KIAkgKi8KLQlpZiAoaGFuZGxlLT5oX2J1ZmZlcl9jcmVkaXRzIDwgMykgeworCWlmICghZXh0NF9oYW5kbGVfaGFzX2Vub3VnaF9jcmVkaXRzKGhhbmRsZSwgMykpIHsKIAkJZXJyID0gZXh0NF9qb3VybmFsX2V4dGVuZChoYW5kbGUsIDMpOwogCQlpZiAoZXJyID4gMCkKIAkJCWVyciA9IGV4dDRfam91cm5hbF9yZXN0YXJ0KGhhbmRsZSwgMyk7CkBAIC01MDYsMTAgKzUxNCwxMCBAQAogICoJcmV0dXJuIHRoZSB0b3RhbCBudW1iZXIgb2YgYmxvY2tzIHRvIGJlIGFsbG9jYXRlLCBpbmNsdWRpbmcgdGhlCiAgKglkaXJlY3QgYW5kIGluZGlyZWN0IGJsb2Nrcy4KICAqLwotc3RhdGljIGludCBleHQ0X2Jsa3NfdG9fYWxsb2NhdGUoSW5kaXJlY3QgKmJyYW5jaCwgaW50IGssIHVuc2lnbmVkIGxvbmcgYmxrcywKK3N0YXRpYyBpbnQgZXh0NF9ibGtzX3RvX2FsbG9jYXRlKEluZGlyZWN0ICpicmFuY2gsIGludCBrLCB1bnNpZ25lZCBpbnQgYmxrcywKIAkJaW50IGJsb2Nrc190b19ib3VuZGFyeSkKIHsKLQl1bnNpZ25lZCBsb25nIGNvdW50ID0gMDsKKwl1bnNpZ25lZCBpbnQgY291bnQgPSAwOwogCiAJLyoKIAkgKiBTaW1wbGUgY2FzZSwgW3QsZF1JbmRpcmVjdCBibG9jayhzKSBoYXMgbm90IGFsbG9jYXRlZCB5ZXQKQEAgLTU0Nyw2ICs1NTUsNyBAQAogCQkJCWludCBpbmRpcmVjdF9ibGtzLCBpbnQgYmxrcywKIAkJCQlleHQ0X2ZzYmxrX3QgbmV3X2Jsb2Nrc1s0XSwgaW50ICplcnIpCiB7CisJc3RydWN0IGV4dDRfYWxsb2NhdGlvbl9yZXF1ZXN0IGFyOwogCWludCB0YXJnZXQsIGk7CiAJdW5zaWduZWQgbG9uZyBjb3VudCA9IDAsIGJsa19hbGxvY2F0ZWQgPSAwOwogCWludCBpbmRleCA9IDA7CkBAIC01OTUsMTAgKzYwNCwxNyBAQAogCWlmICghdGFyZ2V0KQogCQlnb3RvIGFsbG9jYXRlZDsKIAkvKiBOb3cgYWxsb2NhdGUgZGF0YSBibG9ja3MgKi8KLQljb3VudCA9IHRhcmdldDsKLQkvKiBhbGxvY2F0aW5nIGJsb2NrcyBmb3IgZGF0YSBibG9ja3MgKi8KLQljdXJyZW50X2Jsb2NrID0gZXh0NF9uZXdfYmxvY2tzKGhhbmRsZSwgaW5vZGUsIGlibG9jaywKLQkJCQkJCWdvYWwsICZjb3VudCwgZXJyKTsKKwltZW1zZXQoJmFyLCAwLCBzaXplb2YoYXIpKTsKKwlhci5pbm9kZSA9IGlub2RlOworCWFyLmdvYWwgPSBnb2FsOworCWFyLmxlbiA9IHRhcmdldDsKKwlhci5sb2dpY2FsID0gaWJsb2NrOworCWlmIChTX0lTUkVHKGlub2RlLT5pX21vZGUpKQorCQkvKiBlbmFibGUgaW4tY29yZSBwcmVhbGxvY2F0aW9uIG9ubHkgZm9yIHJlZ3VsYXIgZmlsZXMgKi8KKwkJYXIuZmxhZ3MgPSBFWFQ0X01CX0hJTlRfREFUQTsKKworCWN1cnJlbnRfYmxvY2sgPSBleHQ0X21iX25ld19ibG9ja3MoaGFuZGxlLCAmYXIsIGVycik7CisKIAlpZiAoKmVyciAmJiAodGFyZ2V0ID09IGJsa3MpKSB7CiAJCS8qCiAJCSAqIGlmIHRoZSBhbGxvY2F0aW9uIGZhaWxlZCBhbmQgd2UgZGlkbid0IGFsbG9jYXRlCkBAIC02MTQsNyArNjMwLDcgQEAKIAkJICovCiAJCQluZXdfYmxvY2tzW2luZGV4XSA9IGN1cnJlbnRfYmxvY2s7CiAJCX0KLQkJYmxrX2FsbG9jYXRlZCArPSBjb3VudDsKKwkJYmxrX2FsbG9jYXRlZCArPSBhci5sZW47CiAJfQogYWxsb2NhdGVkOgogCS8qIHRvdGFsIG51bWJlciBvZiBibG9ja3MgYWxsb2NhdGVkIGZvciBkaXJlY3QgYmxvY2tzICovCkBAIC03MDksOCArNzI1LDggQEAKIAkJc2V0X2J1ZmZlcl91cHRvZGF0ZShiaCk7CiAJCXVubG9ja19idWZmZXIoYmgpOwogCi0JCUJVRkZFUl9UUkFDRShiaCwgImNhbGwgZXh0NF9qb3VybmFsX2RpcnR5X21ldGFkYXRhIik7Ci0JCWVyciA9IGV4dDRfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGJoKTsKKwkJQlVGRkVSX1RSQUNFKGJoLCAiY2FsbCBleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YSIpOworCQllcnIgPSBleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGlub2RlLCBiaCk7CiAJCWlmIChlcnIpCiAJCQlnb3RvIGZhaWxlZDsKIAl9CkBAIC03OTIsOCArODA4LDggQEAKIAkJICogZ2VuZXJpY19jb21taXRfd3JpdGUtPl9fbWFya19pbm9kZV9kaXJ0eS0+ZXh0NF9kaXJ0eV9pbm9kZS4KIAkJICovCiAJCWpiZF9kZWJ1Zyg1LCAic3BsaWNpbmcgaW5kaXJlY3Qgb25seVxuIik7Ci0JCUJVRkZFUl9UUkFDRSh3aGVyZS0+YmgsICJjYWxsIGV4dDRfam91cm5hbF9kaXJ0eV9tZXRhZGF0YSIpOwotCQllcnIgPSBleHQ0X2pvdXJuYWxfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCB3aGVyZS0+YmgpOworCQlCVUZGRVJfVFJBQ0Uod2hlcmUtPmJoLCAiY2FsbCBleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YSIpOworCQllcnIgPSBleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGlub2RlLCB3aGVyZS0+YmgpOwogCQlpZiAoZXJyKQogCQkJZ290byBlcnJfb3V0OwogCX0gZWxzZSB7CkBAIC04NDAsMTAgKzg1NiwxMCBAQAogICogZG93bl9yZWFkKCZFWFQ0X0koaW5vZGUpLT5pX2RhdGFfc2VtKSBpZiBub3QgYWxsb2NhdGluZyBmaWxlIHN5c3RlbSBibG9jawogICogKGllLCBjcmVhdGUgaXMgemVybykuIE90aGVyd2lzZSBkb3duX3dyaXRlKCZFWFQ0X0koaW5vZGUpLT5pX2RhdGFfc2VtKQogICovCi1pbnQgZXh0NF9nZXRfYmxvY2tzX2hhbmRsZShoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAotCQlleHQ0X2xibGtfdCBpYmxvY2ssIHVuc2lnbmVkIGxvbmcgbWF4YmxvY2tzLAotCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoX3Jlc3VsdCwKLQkJaW50IGNyZWF0ZSwgaW50IGV4dGVuZF9kaXNrc2l6ZSkKK3N0YXRpYyBpbnQgZXh0NF9nZXRfYmxvY2tzX2hhbmRsZShoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCSAgZXh0NF9sYmxrX3QgaWJsb2NrLCB1bnNpZ25lZCBpbnQgbWF4YmxvY2tzLAorCQkJCSAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaF9yZXN1bHQsCisJCQkJICBpbnQgY3JlYXRlLCBpbnQgZXh0ZW5kX2Rpc2tzaXplKQogewogCWludCBlcnIgPSAtRUlPOwogCWV4dDRfbGJsa190IG9mZnNldHNbNF07CkBAIC0xMDQ1LDcgKzEwNjEsNyBAQAogICogSXQgcmV0dXJucyB0aGUgZXJyb3IgaW4gY2FzZSBvZiBhbGxvY2F0aW9uIGZhaWx1cmUuCiAgKi8KIGludCBleHQ0X2dldF9ibG9ja3Nfd3JhcChoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzZWN0b3JfdCBibG9jaywKLQkJCXVuc2lnbmVkIGxvbmcgbWF4X2Jsb2Nrcywgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwKKwkJCXVuc2lnbmVkIGludCBtYXhfYmxvY2tzLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLAogCQkJaW50IGNyZWF0ZSwgaW50IGV4dGVuZF9kaXNrc2l6ZSwgaW50IGZsYWcpCiB7CiAJaW50IHJldHZhbDsKQEAgLTEyMjEsOCArMTIzNyw4IEBACiAJCQkJc2V0X2J1ZmZlcl91cHRvZGF0ZShiaCk7CiAJCQl9CiAJCQl1bmxvY2tfYnVmZmVyKGJoKTsKLQkJCUJVRkZFUl9UUkFDRShiaCwgImNhbGwgZXh0NF9qb3VybmFsX2RpcnR5X21ldGFkYXRhIik7Ci0JCQllcnIgPSBleHQ0X2pvdXJuYWxfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBiaCk7CisJCQlCVUZGRVJfVFJBQ0UoYmgsICJjYWxsIGV4dDRfaGFuZGxlX2RpcnR5X21ldGFkYXRhIik7CisJCQllcnIgPSBleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGlub2RlLCBiaCk7CiAJCQlpZiAoIWZhdGFsKQogCQkJCWZhdGFsID0gZXJyOwogCQl9IGVsc2UgewpAQCAtMTMzNSw2ICsxMzUxLDEwIEBACiAgCXBnb2ZmX3QgaW5kZXg7CiAJdW5zaWduZWQgZnJvbSwgdG87CiAKKwl0cmFjZV9tYXJrKGV4dDRfd3JpdGVfYmVnaW4sCisJCSAgICJkZXYgJXMgaW5vICVsdSBwb3MgJWxsdSBsZW4gJXUgZmxhZ3MgJXUiLAorCQkgICBpbm9kZS0+aV9zYi0+c19pZCwgaW5vZGUtPmlfaW5vLAorCQkgICAodW5zaWduZWQgbG9uZyBsb25nKSBwb3MsIGxlbiwgZmxhZ3MpOwogIAlpbmRleCA9IHBvcyA+PiBQQUdFX0NBQ0hFX1NISUZUOwogCWZyb20gPSBwb3MgJiAoUEFHRV9DQUNIRV9TSVpFIC0gMSk7CiAJdG8gPSBmcm9tICsgbGVuOwpAQCAtMTM4Nyw3ICsxNDA3LDcgQEAKIAlpZiAoIWJ1ZmZlcl9tYXBwZWQoYmgpIHx8IGJ1ZmZlcl9mcmVlZChiaCkpCiAJCXJldHVybiAwOwogCXNldF9idWZmZXJfdXB0b2RhdGUoYmgpOwotCXJldHVybiBleHQ0X2pvdXJuYWxfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBiaCk7CisJcmV0dXJuIGV4dDRfaGFuZGxlX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgTlVMTCwgYmgpOwogfQogCiAvKgpAQCAtMTQwNiw2ICsxNDI2LDEwIEBACiAJc3RydWN0IGlub2RlICppbm9kZSA9IG1hcHBpbmctPmhvc3Q7CiAJaW50IHJldCA9IDAsIHJldDI7CiAKKwl0cmFjZV9tYXJrKGV4dDRfb3JkZXJlZF93cml0ZV9lbmQsCisJCSAgICJkZXYgJXMgaW5vICVsdSBwb3MgJWxsdSBsZW4gJXUgY29waWVkICV1IiwKKwkJICAgaW5vZGUtPmlfc2ItPnNfaWQsIGlub2RlLT5pX2lubywKKwkJICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgcG9zLCBsZW4sIGNvcGllZCk7CiAJcmV0ID0gZXh0NF9qYmQyX2ZpbGVfaW5vZGUoaGFuZGxlLCBpbm9kZSk7CiAKIAlpZiAocmV0ID09IDApIHsKQEAgLTE0NDQsNiArMTQ2OCwxMCBAQAogCWludCByZXQgPSAwLCByZXQyOwogCWxvZmZfdCBuZXdfaV9zaXplOwogCisJdHJhY2VfbWFyayhleHQ0X3dyaXRlYmFja193cml0ZV9lbmQsCisJCSAgICJkZXYgJXMgaW5vICVsdSBwb3MgJWxsdSBsZW4gJXUgY29waWVkICV1IiwKKwkJICAgaW5vZGUtPmlfc2ItPnNfaWQsIGlub2RlLT5pX2lubywKKwkJICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgcG9zLCBsZW4sIGNvcGllZCk7CiAJbmV3X2lfc2l6ZSA9IHBvcyArIGNvcGllZDsKIAlpZiAobmV3X2lfc2l6ZSA+IEVYVDRfSShpbm9kZSktPmlfZGlza3NpemUpIHsKIAkJZXh0NF91cGRhdGVfaV9kaXNrc2l6ZShpbm9kZSwgbmV3X2lfc2l6ZSk7CkBAIC0xNDc5LDYgKzE1MDcsMTAgQEAKIAl1bnNpZ25lZCBmcm9tLCB0bzsKIAlsb2ZmX3QgbmV3X2lfc2l6ZTsKIAorCXRyYWNlX21hcmsoZXh0NF9qb3VybmFsbGVkX3dyaXRlX2VuZCwKKwkJICAgImRldiAlcyBpbm8gJWx1IHBvcyAlbGx1IGxlbiAldSBjb3BpZWQgJXUiLAorCQkgICBpbm9kZS0+aV9zYi0+c19pZCwgaW5vZGUtPmlfaW5vLAorCQkgICAodW5zaWduZWQgbG9uZyBsb25nKSBwb3MsIGxlbiwgY29waWVkKTsKIAlmcm9tID0gcG9zICYgKFBBR0VfQ0FDSEVfU0laRSAtIDEpOwogCXRvID0gZnJvbSArIGxlbjsKIApAQCAtMTYyNSw3ICsxNjU3LDcgQEAKIAlnZXRfYmxvY2tfdCAqZ2V0X2Jsb2NrOwogCXN0cnVjdCB3cml0ZWJhY2tfY29udHJvbCAqd2JjOwogCWludCBpb19kb25lOwotCWxvbmcgcGFnZXNfd3JpdHRlbjsKKwlpbnQgcGFnZXNfd3JpdHRlbjsKIAlpbnQgcmV0dmFsOwogfTsKIApAQCAtMTY0NSwzNSArMTY3NywzOSBAQAogICovCiBzdGF0aWMgaW50IG1wYWdlX2RhX3N1Ym1pdF9pbyhzdHJ1Y3QgbXBhZ2VfZGFfZGF0YSAqbXBkKQogewotCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gbXBkLT5pbm9kZS0+aV9tYXBwaW5nOwotCWludCByZXQgPSAwLCBlcnIsIG5yX3BhZ2VzLCBpOwotCXVuc2lnbmVkIGxvbmcgaW5kZXgsIGVuZDsKLQlzdHJ1Y3QgcGFnZXZlYyBwdmVjOwogCWxvbmcgcGFnZXNfc2tpcHBlZDsKKwlzdHJ1Y3QgcGFnZXZlYyBwdmVjOworCXVuc2lnbmVkIGxvbmcgaW5kZXgsIGVuZDsKKwlpbnQgcmV0ID0gMCwgZXJyLCBucl9wYWdlcywgaTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gbXBkLT5pbm9kZTsKKwlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IGlub2RlLT5pX21hcHBpbmc7CiAKIAlCVUdfT04obXBkLT5uZXh0X3BhZ2UgPD0gbXBkLT5maXJzdF9wYWdlKTsKLQlwYWdldmVjX2luaXQoJnB2ZWMsIDApOworCS8qCisJICogV2UgbmVlZCB0byBzdGFydCBmcm9tIHRoZSBmaXJzdF9wYWdlIHRvIHRoZSBuZXh0X3BhZ2UgLSAxCisJICogdG8gbWFrZSBzdXJlIHdlIGFsc28gd3JpdGUgdGhlIG1hcHBlZCBkaXJ0eSBidWZmZXJfaGVhZHMuCisJICogSWYgd2UgbG9vayBhdCBtcGQtPmxiaC5iX2Jsb2NrbnIgd2Ugd291bGQgb25seSBiZSBsb29raW5nCisJICogYXQgdGhlIGN1cnJlbnRseSBtYXBwZWQgYnVmZmVyX2hlYWRzLgorCSAqLwogCWluZGV4ID0gbXBkLT5maXJzdF9wYWdlOwogCWVuZCA9IG1wZC0+bmV4dF9wYWdlIC0gMTsKIAorCXBhZ2V2ZWNfaW5pdCgmcHZlYywgMCk7CiAJd2hpbGUgKGluZGV4IDw9IGVuZCkgewotCQkvKgotCQkgKiBXZSBjYW4gdXNlIFBBR0VDQUNIRV9UQUdfRElSVFkgbG9va3VwIGhlcmUgYmVjYXVzZQotCQkgKiBldmVuIHRob3VnaCB3ZSBoYXZlIGNsZWFyZWQgdGhlIGRpcnR5IGZsYWcgb24gdGhlIHBhZ2UKLQkJICogV2Ugc3RpbGwga2VlcCB0aGUgcGFnZSBpbiB0aGUgcmFkaXggdHJlZSB3aXRoIHRhZwotCQkgKiBQQUdFQ0FDSEVfVEFHX0RJUlRZLiBTZWUgY2xlYXJfcGFnZV9kaXJ0eV9mb3JfaW8uCi0JCSAqIFRoZSBQQUdFQ0FDSEVfVEFHX0RJUlRZIGlzIGNsZWFyZWQgaW4gc2V0X3BhZ2Vfd3JpdGViYWNrCi0JCSAqIHdoaWNoIGlzIGNhbGxlZCB2aWEgdGhlIGJlbG93IHdyaXRlcGFnZSBjYWxsYmFjay4KLQkJICovCi0JCW5yX3BhZ2VzID0gcGFnZXZlY19sb29rdXBfdGFnKCZwdmVjLCBtYXBwaW5nLCAmaW5kZXgsCi0JCQkJCVBBR0VDQUNIRV9UQUdfRElSVFksCi0JCQkJCW1pbihlbmQgLSBpbmRleCwKLQkJCQkJKHBnb2ZmX3QpUEFHRVZFQ19TSVpFLTEpICsgMSk7CisJCW5yX3BhZ2VzID0gcGFnZXZlY19sb29rdXAoJnB2ZWMsIG1hcHBpbmcsIGluZGV4LCBQQUdFVkVDX1NJWkUpOwogCQlpZiAobnJfcGFnZXMgPT0gMCkKIAkJCWJyZWFrOwogCQlmb3IgKGkgPSAwOyBpIDwgbnJfcGFnZXM7IGkrKykgewogCQkJc3RydWN0IHBhZ2UgKnBhZ2UgPSBwdmVjLnBhZ2VzW2ldOwogCisJCQlpbmRleCA9IHBhZ2UtPmluZGV4OworCQkJaWYgKGluZGV4ID4gZW5kKQorCQkJCWJyZWFrOworCQkJaW5kZXgrKzsKKworCQkJQlVHX09OKCFQYWdlTG9ja2VkKHBhZ2UpKTsKKwkJCUJVR19PTihQYWdlV3JpdGViYWNrKHBhZ2UpKTsKKwogCQkJcGFnZXNfc2tpcHBlZCA9IG1wZC0+d2JjLT5wYWdlc19za2lwcGVkOwogCQkJZXJyID0gbWFwcGluZy0+YV9vcHMtPndyaXRlcGFnZShwYWdlLCBtcGQtPndiYyk7CiAJCQlpZiAoIWVyciAmJiAocGFnZXNfc2tpcHBlZCA9PSBtcGQtPndiYy0+cGFnZXNfc2tpcHBlZCkpCkBAIC0xODMxLDEzICsxODY3LDEzIEBACiAJCQlleHQ0X2NvdW50X2ZyZWVfYmxvY2tzKGlub2RlLT5pX3NiKSk7CiAJcHJpbnRrKEtFUk5fRU1FUkcgIkZyZWUvRGlydHkgYmxvY2sgZGV0YWlsc1xuIik7CiAJcHJpbnRrKEtFUk5fRU1FUkcgImZyZWVfYmxvY2tzPSVsbGRcbiIsCi0JCQlwZXJjcHVfY291bnRlcl9zdW0oJnNiaS0+c19mcmVlYmxvY2tzX2NvdW50ZXIpKTsKKwkJCShsb25nIGxvbmcpcGVyY3B1X2NvdW50ZXJfc3VtKCZzYmktPnNfZnJlZWJsb2Nrc19jb3VudGVyKSk7CiAJcHJpbnRrKEtFUk5fRU1FUkcgImRpcnR5X2Jsb2Nrcz0lbGxkXG4iLAotCQkJcGVyY3B1X2NvdW50ZXJfc3VtKCZzYmktPnNfZGlydHlibG9ja3NfY291bnRlcikpOworCQkJKGxvbmcgbG9uZylwZXJjcHVfY291bnRlcl9zdW0oJnNiaS0+c19kaXJ0eWJsb2Nrc19jb3VudGVyKSk7CiAJcHJpbnRrKEtFUk5fRU1FUkcgIkJsb2NrIHJlc2VydmF0aW9uIGRldGFpbHNcbiIpOwotCXByaW50ayhLRVJOX0VNRVJHICJpX3Jlc2VydmVkX2RhdGFfYmxvY2tzPSVsdVxuIiwKKwlwcmludGsoS0VSTl9FTUVSRyAiaV9yZXNlcnZlZF9kYXRhX2Jsb2Nrcz0ldVxuIiwKIAkJCUVYVDRfSShpbm9kZSktPmlfcmVzZXJ2ZWRfZGF0YV9ibG9ja3MpOwotCXByaW50ayhLRVJOX0VNRVJHICJpX3Jlc2VydmVkX21ldGFfYmxvY2tzPSVsdVxuIiwKKwlwcmludGsoS0VSTl9FTUVSRyAiaV9yZXNlcnZlZF9tZXRhX2Jsb2Nrcz0ldVxuIiwKIAkJCUVYVDRfSShpbm9kZSktPmlfcmVzZXJ2ZWRfbWV0YV9ibG9ja3MpOwogCXJldHVybjsKIH0KQEAgLTIwODcsMTEgKzIxMjMsMjkgQEAKIAkJYmggPSBoZWFkOwogCQlkbyB7CiAJCQlCVUdfT04oYnVmZmVyX2xvY2tlZChiaCkpOworCQkJLyoKKwkJCSAqIFdlIG5lZWQgdG8gdHJ5IHRvIGFsbG9jYXRlCisJCQkgKiB1bm1hcHBlZCBibG9ja3MgaW4gdGhlIHNhbWUgcGFnZS4KKwkJCSAqIE90aGVyd2lzZSB3ZSB3b24ndCBtYWtlIHByb2dyZXNzCisJCQkgKiB3aXRoIHRoZSBwYWdlIGluIGV4dDRfZGFfd3JpdGVwYWdlCisJCQkgKi8KIAkJCWlmIChidWZmZXJfZGlydHkoYmgpICYmCiAJCQkJKCFidWZmZXJfbWFwcGVkKGJoKSB8fCBidWZmZXJfZGVsYXkoYmgpKSkgewogCQkJCW1wYWdlX2FkZF9iaF90b19leHRlbnQobXBkLCBsb2dpY2FsLCBiaCk7CiAJCQkJaWYgKG1wZC0+aW9fZG9uZSkKIAkJCQkJcmV0dXJuIE1QQUdFX0RBX0VYVEVOVF9UQUlMOworCQkJfSBlbHNlIGlmIChidWZmZXJfZGlydHkoYmgpICYmIChidWZmZXJfbWFwcGVkKGJoKSkpIHsKKwkJCQkvKgorCQkJCSAqIG1hcHBlZCBkaXJ0eSBidWZmZXIuIFdlIG5lZWQgdG8gdXBkYXRlCisJCQkJICogdGhlIGJfc3RhdGUgYmVjYXVzZSB3ZSBsb29rIGF0CisJCQkJICogYl9zdGF0ZSBpbiBtcGFnZV9kYV9tYXBfYmxvY2tzLiBXZSBkb24ndAorCQkJCSAqIHVwZGF0ZSBiX3NpemUgYmVjYXVzZSBpZiB3ZSBmaW5kIGFuCisJCQkJICogdW5tYXBwZWQgYnVmZmVyX2hlYWQgbGF0ZXIgd2UgbmVlZCB0bworCQkJCSAqIHVzZSB0aGUgYl9zdGF0ZSBmbGFnIG9mIHRoYXQgYnVmZmVyX2hlYWQuCisJCQkJICovCisJCQkJaWYgKG1wZC0+bGJoLmJfc2l6ZSA9PSAwKQorCQkJCQltcGQtPmxiaC5iX3N0YXRlID0KKwkJCQkJCWJoLT5iX3N0YXRlICYgQkhfRkxBR1M7CiAJCQl9CiAJCQlsb2dpY2FsKys7CiAJCX0gd2hpbGUgKChiaCA9IGJoLT5iX3RoaXNfcGFnZSkgIT0gaGVhZCk7CkBAIC0yMjY5LDEwICsyMzIzLDEzIEBACiB7CiAJaW50IHJldCA9IDA7CiAJbG9mZl90IHNpemU7Ci0JdW5zaWduZWQgbG9uZyBsZW47CisJdW5zaWduZWQgaW50IGxlbjsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKnBhZ2VfYnVmczsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gcGFnZS0+bWFwcGluZy0+aG9zdDsKIAorCXRyYWNlX21hcmsoZXh0NF9kYV93cml0ZXBhZ2UsCisJCSAgICJkZXYgJXMgaW5vICVsdSBwYWdlX2luZGV4ICVsdSIsCisJCSAgIGlub2RlLT5pX3NiLT5zX2lkLCBpbm9kZS0+aV9pbm8sIHBhZ2UtPmluZGV4KTsKIAlzaXplID0gaV9zaXplX3JlYWQoaW5vZGUpOwogCWlmIChwYWdlLT5pbmRleCA9PSBzaXplID4+IFBBR0VfQ0FDSEVfU0hJRlQpCiAJCWxlbiA9IHNpemUgJiB+UEFHRV9DQUNIRV9NQVNLOwpAQCAtMjM3OCwxMCArMjQzNSwyNSBAQAogCXN0cnVjdCBtcGFnZV9kYV9kYXRhIG1wZDsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gbWFwcGluZy0+aG9zdDsKIAlpbnQgbm9fbnJ3cml0ZV9pbmRleF91cGRhdGU7Ci0JbG9uZyBwYWdlc193cml0dGVuID0gMCwgcGFnZXNfc2tpcHBlZDsKKwlpbnQgcGFnZXNfd3JpdHRlbiA9IDA7CisJbG9uZyBwYWdlc19za2lwcGVkOwogCWludCBuZWVkZWRfYmxvY2tzLCByZXQgPSAwLCBucl90b193cml0ZWJ1bXAgPSAwOwogCXN0cnVjdCBleHQ0X3NiX2luZm8gKnNiaSA9IEVYVDRfU0IobWFwcGluZy0+aG9zdC0+aV9zYik7CiAKKwl0cmFjZV9tYXJrKGV4dDRfZGFfd3JpdGVwYWdlcywKKwkJICAgImRldiAlcyBpbm8gJWx1IG5yX3Rfd3JpdGUgJWxkICIKKwkJICAgInBhZ2VzX3NraXBwZWQgJWxkIHJhbmdlX3N0YXJ0ICVsbHUgIgorCQkgICAicmFuZ2VfZW5kICVsbHUgbm9uYmxvY2tpbmcgJWQgIgorCQkgICAiZm9yX2t1cGRhdGUgJWQgZm9yX3JlY2xhaW0gJWQgIgorCQkgICAiZm9yX3dyaXRlcGFnZXMgJWQgcmFuZ2VfY3ljbGljICVkIiwKKwkJICAgaW5vZGUtPmlfc2ItPnNfaWQsIGlub2RlLT5pX2lubywKKwkJICAgd2JjLT5ucl90b193cml0ZSwgd2JjLT5wYWdlc19za2lwcGVkLAorCQkgICAodW5zaWduZWQgbG9uZyBsb25nKSB3YmMtPnJhbmdlX3N0YXJ0LAorCQkgICAodW5zaWduZWQgbG9uZyBsb25nKSB3YmMtPnJhbmdlX2VuZCwKKwkJICAgd2JjLT5ub25ibG9ja2luZywgd2JjLT5mb3Jfa3VwZGF0ZSwKKwkJICAgd2JjLT5mb3JfcmVjbGFpbSwgd2JjLT5mb3Jfd3JpdGVwYWdlcywKKwkJICAgd2JjLT5yYW5nZV9jeWNsaWMpOworCiAJLyoKIAkgKiBObyBwYWdlcyB0byB3cml0ZT8gVGhpcyBpcyBtYWlubHkgYSBrbHVkZ2UgdG8gYXZvaWQgc3RhcnRpbmcKIAkgKiBhIHRyYW5zYWN0aW9uIGZvciBzcGVjaWFsIGlub2RlcyBsaWtlIGpvdXJuYWwgaW5vZGUgb24gbGFzdCBpcHV0KCkKQEAgLTIzODksNiArMjQ2MSwyMCBAQAogCSAqLwogCWlmICghbWFwcGluZy0+bnJwYWdlcyB8fCAhbWFwcGluZ190YWdnZWQobWFwcGluZywgUEFHRUNBQ0hFX1RBR19ESVJUWSkpCiAJCXJldHVybiAwOworCisJLyoKKwkgKiBJZiB0aGUgZmlsZXN5c3RlbSBoYXMgYWJvcnRlZCwgaXQgaXMgcmVhZC1vbmx5LCBzbyByZXR1cm4KKwkgKiByaWdodCBhd2F5IGluc3RlYWQgb2YgZHVtcGluZyBzdGFjayB0cmFjZXMgbGF0ZXIgb24gdGhhdAorCSAqIHdpbGwgb2JzY3VyZSB0aGUgcmVhbCBzb3VyY2Ugb2YgdGhlIHByb2JsZW0uICBXZSB0ZXN0CisJICogRVhUNF9NT1VOVF9BQk9SVCBpbnN0ZWFkIG9mIHNiLT5zX2ZsYWcncyBNU19SRE9OTFkgYmVjYXVzZQorCSAqIHRoZSBsYXR0ZXIgY291bGQgYmUgdHJ1ZSBpZiB0aGUgZmlsZXN5c3RlbSBpcyBtb3VudGVkCisJICogcmVhZC1vbmx5LCBhbmQgaW4gdGhhdCBjYXNlLCBleHQ0X2RhX3dyaXRlcGFnZXMgc2hvdWxkCisJICogKm5ldmVyKiBiZSBjYWxsZWQsIHNvIGlmIHRoYXQgZXZlciBoYXBwZW5zLCB3ZSB3b3VsZCB3YW50CisJICogdGhlIHN0YWNrIHRyYWNlLgorCSAqLworCWlmICh1bmxpa2VseShzYmktPnNfbW91bnRfb3B0ICYgRVhUNF9NT1VOVF9BQk9SVCkpCisJCXJldHVybiAtRVJPRlM7CisKIAkvKgogCSAqIE1ha2Ugc3VyZSBucl90b193cml0ZSBpcyA+PSBzYmktPnNfbWJfc3RyZWFtX3JlcXVlc3QKIAkgKiBUaGlzIG1ha2Ugc3VyZSBzbWFsbCBmaWxlcyBibG9ja3MgYXJlIGFsbG9jYXRlZCBpbgpAQCAtMjQzMyw3ICsyNTE5LDcgQEAKIAkJaGFuZGxlID0gZXh0NF9qb3VybmFsX3N0YXJ0KGlub2RlLCBuZWVkZWRfYmxvY2tzKTsKIAkJaWYgKElTX0VSUihoYW5kbGUpKSB7CiAJCQlyZXQgPSBQVFJfRVJSKGhhbmRsZSk7Ci0JCQlwcmludGsoS0VSTl9FTUVSRyAiJXM6IGpiZDJfc3RhcnQ6ICIKKwkJCXByaW50ayhLRVJOX0NSSVQgIiVzOiBqYmQyX3N0YXJ0OiAiCiAJCQkgICAgICAgIiVsZCBwYWdlcywgaW5vICVsdTsgZXJyICVkXG4iLCBfX2Z1bmNfXywKIAkJCQl3YmMtPm5yX3RvX3dyaXRlLCBpbm9kZS0+aV9pbm8sIHJldCk7CiAJCQlkdW1wX3N0YWNrKCk7CkBAIC0yNDg2LDYgKzI1NzIsMTQgQEAKIAlpZiAoIW5vX25yd3JpdGVfaW5kZXhfdXBkYXRlKQogCQl3YmMtPm5vX25yd3JpdGVfaW5kZXhfdXBkYXRlID0gMDsKIAl3YmMtPm5yX3RvX3dyaXRlIC09IG5yX3RvX3dyaXRlYnVtcDsKKwl0cmFjZV9tYXJrKGV4dDRfZGFfd3JpdGVwYWdlX3Jlc3VsdCwKKwkJICAgImRldiAlcyBpbm8gJWx1IHJldCAlZCBwYWdlc193cml0dGVuICVkICIKKwkJICAgInBhZ2VzX3NraXBwZWQgJWxkIGNvbmdlc3Rpb24gJWQgIgorCQkgICAibW9yZV9pbyAlZCBub19ucndyaXRlX2luZGV4X3VwZGF0ZSAlZCIsCisJCSAgIGlub2RlLT5pX3NiLT5zX2lkLCBpbm9kZS0+aV9pbm8sIHJldCwKKwkJICAgcGFnZXNfd3JpdHRlbiwgd2JjLT5wYWdlc19za2lwcGVkLAorCQkgICB3YmMtPmVuY291bnRlcmVkX2Nvbmdlc3Rpb24sIHdiYy0+bW9yZV9pbywKKwkJICAgd2JjLT5ub19ucndyaXRlX2luZGV4X3VwZGF0ZSk7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMjUzNyw2ICsyNjMxLDExIEBACiAJCQkJCWxlbiwgZmxhZ3MsIHBhZ2VwLCBmc2RhdGEpOwogCX0KIAkqZnNkYXRhID0gKHZvaWQgKikwOworCisJdHJhY2VfbWFyayhleHQ0X2RhX3dyaXRlX2JlZ2luLAorCQkgICAiZGV2ICVzIGlubyAlbHUgcG9zICVsbHUgbGVuICV1IGZsYWdzICV1IiwKKwkJICAgaW5vZGUtPmlfc2ItPnNfaWQsIGlub2RlLT5pX2lubywKKwkJICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgcG9zLCBsZW4sIGZsYWdzKTsKIHJldHJ5OgogCS8qCiAJICogV2l0aCBkZWxheWVkIGFsbG9jYXRpb24sIHdlIGRvbid0IGxvZyB0aGUgaV9kaXNrc2l6ZSB1cGRhdGUKQEAgLTI2MjYsNiArMjcyNSwxMCBAQAogCQl9CiAJfQogCisJdHJhY2VfbWFyayhleHQ0X2RhX3dyaXRlX2VuZCwKKwkJICAgImRldiAlcyBpbm8gJWx1IHBvcyAlbGx1IGxlbiAldSBjb3BpZWQgJXUiLAorCQkgICBpbm9kZS0+aV9zYi0+c19pZCwgaW5vZGUtPmlfaW5vLAorCQkgICAodW5zaWduZWQgbG9uZyBsb25nKSBwb3MsIGxlbiwgY29waWVkKTsKIAlzdGFydCA9IHBvcyAmIChQQUdFX0NBQ0hFX1NJWkUgLSAxKTsKIAllbmQgPSBzdGFydCArIGNvcGllZCAtIDE7CiAKQEAgLTI3MTgsNyArMjgyMSwxMCBAQAogCQlmaWxlbWFwX3dyaXRlX2FuZF93YWl0KG1hcHBpbmcpOwogCX0KIAotCWlmIChFWFQ0X0koaW5vZGUpLT5pX3N0YXRlICYgRVhUNF9TVEFURV9KREFUQSkgeworCUJVR19PTighRVhUNF9KT1VSTkFMKGlub2RlKSAmJgorCSAgICAgICBFWFQ0X0koaW5vZGUpLT5pX3N0YXRlICYgRVhUNF9TVEFURV9KREFUQSk7CisKKwlpZiAoRVhUNF9KT1VSTkFMKGlub2RlKSAmJiBFWFQ0X0koaW5vZGUpLT5pX3N0YXRlICYgRVhUNF9TVEFURV9KREFUQSkgewogCQkvKgogCQkgKiBUaGlzIGlzIGEgUkVBTExZIGhlYXZ5d2VpZ2h0IGFwcHJvYWNoLCBidXQgdGhlIHVzZSBvZgogCQkgKiBibWFwIG9uIGRpcnR5IGZpbGVzIGlzIGV4cGVjdGVkIHRvIGJlIGV4dHJlbWVseSByYXJlOgpAQCAtMjgzNiw2ICsyOTQyLDkgQEAKIAlsb2ZmX3Qgc2l6ZSA9IGlfc2l6ZV9yZWFkKGlub2RlKTsKIAlsb2ZmX3QgbGVuOwogCisJdHJhY2VfbWFyayhleHQ0X25vcm1hbF93cml0ZXBhZ2UsCisJCSAgICJkZXYgJXMgaW5vICVsdSBwYWdlX2luZGV4ICVsdSIsCisJCSAgIGlub2RlLT5pX3NiLT5zX2lkLCBpbm9kZS0+aV9pbm8sIHBhZ2UtPmluZGV4KTsKIAlKX0FTU0VSVChQYWdlTG9ja2VkKHBhZ2UpKTsKIAlpZiAocGFnZS0+aW5kZXggPT0gc2l6ZSA+PiBQQUdFX0NBQ0hFX1NISUZUKQogCQlsZW4gPSBzaXplICYgflBBR0VfQ0FDSEVfTUFTSzsKQEAgLTI5MjEsNiArMzAzMCw5IEBACiAJbG9mZl90IHNpemUgPSBpX3NpemVfcmVhZChpbm9kZSk7CiAJbG9mZl90IGxlbjsKIAorCXRyYWNlX21hcmsoZXh0NF9qb3VybmFsbGVkX3dyaXRlcGFnZSwKKwkJICAgImRldiAlcyBpbm8gJWx1IHBhZ2VfaW5kZXggJWx1IiwKKwkJICAgaW5vZGUtPmlfc2ItPnNfaWQsIGlub2RlLT5pX2lubywgcGFnZS0+aW5kZXgpOwogCUpfQVNTRVJUKFBhZ2VMb2NrZWQocGFnZSkpOwogCWlmIChwYWdlLT5pbmRleCA9PSBzaXplID4+IFBBR0VfQ0FDSEVfU0hJRlQpCiAJCWxlbiA9IHNpemUgJiB+UEFHRV9DQUNIRV9NQVNLOwpAQCAtMjk4OSw3ICszMTAxLDEwIEBACiAJaWYgKG9mZnNldCA9PSAwKQogCQlDbGVhclBhZ2VDaGVja2VkKHBhZ2UpOwogCi0JamJkMl9qb3VybmFsX2ludmFsaWRhdGVwYWdlKGpvdXJuYWwsIHBhZ2UsIG9mZnNldCk7CisJaWYgKGpvdXJuYWwpCisJCWpiZDJfam91cm5hbF9pbnZhbGlkYXRlcGFnZShqb3VybmFsLCBwYWdlLCBvZmZzZXQpOworCWVsc2UKKwkJYmxvY2tfaW52YWxpZGF0ZXBhZ2UocGFnZSwgb2Zmc2V0KTsKIH0KIAogc3RhdGljIGludCBleHQ0X3JlbGVhc2VwYWdlKHN0cnVjdCBwYWdlICpwYWdlLCBnZnBfdCB3YWl0KQpAQCAtMjk5OSw3ICszMTE0LDEwIEBACiAJV0FSTl9PTihQYWdlQ2hlY2tlZChwYWdlKSk7CiAJaWYgKCFwYWdlX2hhc19idWZmZXJzKHBhZ2UpKQogCQlyZXR1cm4gMDsKLQlyZXR1cm4gamJkMl9qb3VybmFsX3RyeV90b19mcmVlX2J1ZmZlcnMoam91cm5hbCwgcGFnZSwgd2FpdCk7CisJaWYgKGpvdXJuYWwpCisJCXJldHVybiBqYmQyX2pvdXJuYWxfdHJ5X3RvX2ZyZWVfYnVmZmVycyhqb3VybmFsLCBwYWdlLCB3YWl0KTsKKwllbHNlCisJCXJldHVybiB0cnlfdG9fZnJlZV9idWZmZXJzKHBhZ2UpOwogfQogCiAvKgpAQCAtMzI3MSw3ICszMzg5LDcgQEAKIAogCWVyciA9IDA7CiAJaWYgKGV4dDRfc2hvdWxkX2pvdXJuYWxfZGF0YShpbm9kZSkpIHsKLQkJZXJyID0gZXh0NF9qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgYmgpOworCQllcnIgPSBleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGlub2RlLCBiaCk7CiAJfSBlbHNlIHsKIAkJaWYgKGV4dDRfc2hvdWxkX29yZGVyX2RhdGEoaW5vZGUpKQogCQkJZXJyID0gZXh0NF9qYmQyX2ZpbGVfaW5vZGUoaGFuZGxlLCBpbm9kZSk7CkBAIC0zMzk1LDggKzM1MTMsOCBAQAogCV9fbGUzMiAqcDsKIAlpZiAodHJ5X3RvX2V4dGVuZF90cmFuc2FjdGlvbihoYW5kbGUsIGlub2RlKSkgewogCQlpZiAoYmgpIHsKLQkJCUJVRkZFUl9UUkFDRShiaCwgImNhbGwgZXh0NF9qb3VybmFsX2RpcnR5X21ldGFkYXRhIik7Ci0JCQlleHQ0X2pvdXJuYWxfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBiaCk7CisJCQlCVUZGRVJfVFJBQ0UoYmgsICJjYWxsIGV4dDRfaGFuZGxlX2RpcnR5X21ldGFkYXRhIik7CisJCQlleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGlub2RlLCBiaCk7CiAJCX0KIAkJZXh0NF9tYXJrX2lub2RlX2RpcnR5KGhhbmRsZSwgaW5vZGUpOwogCQlleHQ0X2pvdXJuYWxfdGVzdF9yZXN0YXJ0KGhhbmRsZSwgaW5vZGUpOwpAQCAtMzQ5Niw3ICszNjE0LDcgQEAKIAkJCQkgIGNvdW50LCBibG9ja190b19mcmVlX3AsIHApOwogCiAJaWYgKHRoaXNfYmgpIHsKLQkJQlVGRkVSX1RSQUNFKHRoaXNfYmgsICJjYWxsIGV4dDRfam91cm5hbF9kaXJ0eV9tZXRhZGF0YSIpOworCQlCVUZGRVJfVFJBQ0UodGhpc19iaCwgImNhbGwgZXh0NF9oYW5kbGVfZGlydHlfbWV0YWRhdGEiKTsKIAogCQkvKgogCQkgKiBUaGUgYnVmZmVyIGhlYWQgc2hvdWxkIGhhdmUgYW4gYXR0YWNoZWQgam91cm5hbCBoZWFkIGF0IHRoaXMKQEAgLTM1MDUsNyArMzYyMyw3IEBACiAJCSAqIHRoZSBibG9jayB3YXMgY2xlYXJlZC4gQ2hlY2sgZm9yIHRoaXMgaW5zdGVhZCBvZiBPT1BTaW5nLgogCQkgKi8KIAkJaWYgKGJoMmpoKHRoaXNfYmgpKQotCQkJZXh0NF9qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgdGhpc19iaCk7CisJCQlleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGlub2RlLCB0aGlzX2JoKTsKIAkJZWxzZQogCQkJZXh0NF9lcnJvcihpbm9kZS0+aV9zYiwgX19mdW5jX18sCiAJCQkJICAgImNpcmN1bGFyIGluZGlyZWN0IGJsb2NrIGRldGVjdGVkLCAiCkBAIC0zNTM1LDcgKzM2NTMsNyBAQAogCWV4dDRfZnNibGtfdCBucjsKIAlfX2xlMzIgKnA7CiAKLQlpZiAoaXNfaGFuZGxlX2Fib3J0ZWQoaGFuZGxlKSkKKwlpZiAoZXh0NF9oYW5kbGVfaXNfYWJvcnRlZChoYW5kbGUpKQogCQlyZXR1cm47CiAKIAlpZiAoZGVwdGgtLSkgewpAQCAtMzYwNSw3ICszNzIzLDcgQEAKIAkJCSAqIHdpbGwgbWVyZWx5IGNvbXBsYWluIGFib3V0IHJlbGVhc2luZyBhIGZyZWUgYmxvY2ssCiAJCQkgKiByYXRoZXIgdGhhbiBsZWFraW5nIGJsb2Nrcy4KIAkJCSAqLwotCQkJaWYgKGlzX2hhbmRsZV9hYm9ydGVkKGhhbmRsZSkpCisJCQlpZiAoZXh0NF9oYW5kbGVfaXNfYWJvcnRlZChoYW5kbGUpKQogCQkJCXJldHVybjsKIAkJCWlmICh0cnlfdG9fZXh0ZW5kX3RyYW5zYWN0aW9uKGhhbmRsZSwgaW5vZGUpKSB7CiAJCQkJZXh0NF9tYXJrX2lub2RlX2RpcnR5KGhhbmRsZSwgaW5vZGUpOwpAQCAtMzYyNCw5ICszNzQyLDEwIEBACiAJCQkJCQkJCSAgIHBhcmVudF9iaCkpewogCQkJCQkqcCA9IDA7CiAJCQkJCUJVRkZFUl9UUkFDRShwYXJlbnRfYmgsCi0JCQkJCSJjYWxsIGV4dDRfam91cm5hbF9kaXJ0eV9tZXRhZGF0YSIpOwotCQkJCQlleHQ0X2pvdXJuYWxfZGlydHlfbWV0YWRhdGEoaGFuZGxlLAotCQkJCQkJCQkgICAgcGFyZW50X2JoKTsKKwkJCQkJImNhbGwgZXh0NF9oYW5kbGVfZGlydHlfbWV0YWRhdGEiKTsKKwkJCQkJZXh0NF9oYW5kbGVfZGlydHlfbWV0YWRhdGEoaGFuZGxlLAorCQkJCQkJCQkgICBpbm9kZSwKKwkJCQkJCQkJICAgcGFyZW50X2JoKTsKIAkJCQl9CiAJCQl9CiAJCX0KQEAgLTM4MTQsNyArMzkzMyw3IEBACiAJICogc3luY2hyb25vdXMKIAkgKi8KIAlpZiAoSVNfU1lOQyhpbm9kZSkpCi0JCWhhbmRsZS0+aF9zeW5jID0gMTsKKwkJZXh0NF9oYW5kbGVfc3luYyhoYW5kbGUpOwogb3V0X3N0b3A6CiAJLyoKIAkgKiBJZiB0aGlzIHdhcyBhIHNpbXBsZSBmdHJ1bmNhdGUoKSwgYW5kIHRoZSBmaWxlIHdpbGwgcmVtYWluIGFsaXZlCkBAIC0zODQ0LDcgKzM5NjMsNyBAQAogCWV4dDRfZnNibGtfdAkJYmxvY2s7CiAJaW50CQkJaW5vZGVzX3Blcl9ibG9jaywgaW5vZGVfb2Zmc2V0OwogCi0JaWxvYy0+YmggPSAwOworCWlsb2MtPmJoID0gTlVMTDsKIAlpZiAoIWV4dDRfdmFsaWRfaW51bShzYiwgaW5vZGUtPmlfaW5vKSkKIAkJcmV0dXJuIC1FSU87CiAKQEAgLTM5NTEsNyArNDA3MCw3IEBACiAJCQludW0gPSBFWFQ0X0lOT0RFU19QRVJfR1JPVVAoc2IpOwogCQkJaWYgKEVYVDRfSEFTX1JPX0NPTVBBVF9GRUFUVVJFKHNiLAogCQkJCSAgICAgICBFWFQ0X0ZFQVRVUkVfUk9fQ09NUEFUX0dEVF9DU1VNKSkKLQkJCQludW0gLT0gbGUxNl90b19jcHUoZ2RwLT5iZ19pdGFibGVfdW51c2VkKTsKKwkJCQludW0gLT0gZXh0NF9pdGFibGVfdW51c2VkX2NvdW50KHNiLCBnZHApOwogCQkJdGFibGUgKz0gbnVtIC8gaW5vZGVzX3Blcl9ibG9jazsKIAkJCWlmIChlbmQgPiB0YWJsZSkKIAkJCQllbmQgPSB0YWJsZTsKQEAgLTQzMTMsOCArNDQzMiw4IEBACiAJCQlFWFQ0X1NFVF9ST19DT01QQVRfRkVBVFVSRShzYiwKIAkJCQkJRVhUNF9GRUFUVVJFX1JPX0NPTVBBVF9MQVJHRV9GSUxFKTsKIAkJCXNiLT5zX2RpcnQgPSAxOwotCQkJaGFuZGxlLT5oX3N5bmMgPSAxOwotCQkJZXJyID0gZXh0NF9qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwKKwkJCWV4dDRfaGFuZGxlX3N5bmMoaGFuZGxlKTsKKwkJCWVyciA9IGV4dDRfaGFuZGxlX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgaW5vZGUsCiAJCQkJCUVYVDRfU0Ioc2IpLT5zX3NiaCk7CiAJCX0KIAl9CkBAIC00MzQxLDkgKzQ0NjAsOCBAQAogCQlyYXdfaW5vZGUtPmlfZXh0cmFfaXNpemUgPSBjcHVfdG9fbGUxNihlaS0+aV9leHRyYV9pc2l6ZSk7CiAJfQogCi0KLQlCVUZGRVJfVFJBQ0UoYmgsICJjYWxsIGV4dDRfam91cm5hbF9kaXJ0eV9tZXRhZGF0YSIpOwotCXJjID0gZXh0NF9qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgYmgpOworCUJVRkZFUl9UUkFDRShiaCwgImNhbGwgZXh0NF9oYW5kbGVfZGlydHlfbWV0YWRhdGEiKTsKKwlyYyA9IGV4dDRfaGFuZGxlX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgaW5vZGUsIGJoKTsKIAlpZiAoIWVycikKIAkJZXJyID0gcmM7CiAJZWktPmlfc3RhdGUgJj0gfkVYVDRfU1RBVEVfTkVXOwpAQCAtNDQwNiw2ICs0NTI0LDI1IEBACiAJcmV0dXJuIGV4dDRfZm9yY2VfY29tbWl0KGlub2RlLT5pX3NiKTsKIH0KIAoraW50IF9fZXh0NF93cml0ZV9kaXJ0eV9tZXRhZGF0YShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQoreworCWludCBlcnIgPSAwOworCisJbWFya19idWZmZXJfZGlydHkoYmgpOworCWlmIChpbm9kZSAmJiBpbm9kZV9uZWVkc19zeW5jKGlub2RlKSkgeworCQlzeW5jX2RpcnR5X2J1ZmZlcihiaCk7CisJCWlmIChidWZmZXJfcmVxKGJoKSAmJiAhYnVmZmVyX3VwdG9kYXRlKGJoKSkgeworCQkJZXh0NF9lcnJvcihpbm9kZS0+aV9zYiwgX19mdW5jX18sCisJCQkJICAgIklPIGVycm9yIHN5bmNpbmcgaW5vZGUsICIKKwkJCQkgICAiaW5vZGU9JWx1LCBibG9jaz0lbGx1IiwKKwkJCQkgICBpbm9kZS0+aV9pbm8sCisJCQkJICAgKHVuc2lnbmVkIGxvbmcgbG9uZyliaC0+Yl9ibG9ja25yKTsKKwkJCWVyciA9IC1FSU87CisJCX0KKwl9CisJcmV0dXJuIGVycjsKK30KKwogLyoKICAqIGV4dDRfc2V0YXR0cigpCiAgKgpAQCAtNDcxMCwxNiArNDg0NywxNSBAQAogZXh0NF9yZXNlcnZlX2lub2RlX3dyaXRlKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCiAJCQkgc3RydWN0IGV4dDRfaWxvYyAqaWxvYykKIHsKLQlpbnQgZXJyID0gMDsKLQlpZiAoaGFuZGxlKSB7Ci0JCWVyciA9IGV4dDRfZ2V0X2lub2RlX2xvYyhpbm9kZSwgaWxvYyk7Ci0JCWlmICghZXJyKSB7Ci0JCQlCVUZGRVJfVFJBQ0UoaWxvYy0+YmgsICJnZXRfd3JpdGVfYWNjZXNzIik7Ci0JCQllcnIgPSBleHQ0X2pvdXJuYWxfZ2V0X3dyaXRlX2FjY2VzcyhoYW5kbGUsIGlsb2MtPmJoKTsKLQkJCWlmIChlcnIpIHsKLQkJCQlicmVsc2UoaWxvYy0+YmgpOwotCQkJCWlsb2MtPmJoID0gTlVMTDsKLQkJCX0KKwlpbnQgZXJyOworCisJZXJyID0gZXh0NF9nZXRfaW5vZGVfbG9jKGlub2RlLCBpbG9jKTsKKwlpZiAoIWVycikgeworCQlCVUZGRVJfVFJBQ0UoaWxvYy0+YmgsICJnZXRfd3JpdGVfYWNjZXNzIik7CisJCWVyciA9IGV4dDRfam91cm5hbF9nZXRfd3JpdGVfYWNjZXNzKGhhbmRsZSwgaWxvYy0+YmgpOworCQlpZiAoZXJyKSB7CisJCQlicmVsc2UoaWxvYy0+YmgpOworCQkJaWxvYy0+YmggPSBOVUxMOwogCQl9CiAJfQogCWV4dDRfc3RkX2Vycm9yKGlub2RlLT5pX3NiLCBlcnIpOwpAQCAtNDc5MSw3ICs0OTI3LDggQEAKIAogCW1pZ2h0X3NsZWVwKCk7CiAJZXJyID0gZXh0NF9yZXNlcnZlX2lub2RlX3dyaXRlKGhhbmRsZSwgaW5vZGUsICZpbG9jKTsKLQlpZiAoRVhUNF9JKGlub2RlKS0+aV9leHRyYV9pc2l6ZSA8IHNiaS0+c193YW50X2V4dHJhX2lzaXplICYmCisJaWYgKGV4dDRfaGFuZGxlX3ZhbGlkKGhhbmRsZSkgJiYKKwkgICAgRVhUNF9JKGlub2RlKS0+aV9leHRyYV9pc2l6ZSA8IHNiaS0+c193YW50X2V4dHJhX2lzaXplICYmCiAJICAgICEoRVhUNF9JKGlub2RlKS0+aV9zdGF0ZSAmIEVYVDRfU1RBVEVfTk9fRVhQQU5EKSkgewogCQkvKgogCQkgKiBXZSBuZWVkIGV4dHJhIGJ1ZmZlciBjcmVkaXRzIHNpbmNlIHdlIG1heSB3cml0ZSBpbnRvIEVBIGJsb2NrCkBAIC00ODQzLDYgKzQ5ODAsMTEgQEAKIAloYW5kbGVfdCAqY3VycmVudF9oYW5kbGUgPSBleHQ0X2pvdXJuYWxfY3VycmVudF9oYW5kbGUoKTsKIAloYW5kbGVfdCAqaGFuZGxlOwogCisJaWYgKCFleHQ0X2hhbmRsZV92YWxpZChjdXJyZW50X2hhbmRsZSkpIHsKKwkJZXh0NF9tYXJrX2lub2RlX2RpcnR5KGN1cnJlbnRfaGFuZGxlLCBpbm9kZSk7CisJCXJldHVybjsKKwl9CisKIAloYW5kbGUgPSBleHQ0X2pvdXJuYWxfc3RhcnQoaW5vZGUsIDIpOwogCWlmIChJU19FUlIoaGFuZGxlKSkKIAkJZ290byBvdXQ7CkBAIC00ODgwLDggKzUwMjIsOSBAQAogCQkJQlVGRkVSX1RSQUNFKGlsb2MuYmgsICJnZXRfd3JpdGVfYWNjZXNzIik7CiAJCQllcnIgPSBqYmQyX2pvdXJuYWxfZ2V0X3dyaXRlX2FjY2VzcyhoYW5kbGUsIGlsb2MuYmgpOwogCQkJaWYgKCFlcnIpCi0JCQkJZXJyID0gZXh0NF9qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwKLQkJCQkJCQkJICBpbG9jLmJoKTsKKwkJCQllcnIgPSBleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsCisJCQkJCQkJCSBpbm9kZSwKKwkJCQkJCQkJIGlsb2MuYmgpOwogCQkJYnJlbHNlKGlsb2MuYmgpOwogCQl9CiAJfQpAQCAtNDkwNyw2ICs1MDUwLDggQEAKIAkgKi8KIAogCWpvdXJuYWwgPSBFWFQ0X0pPVVJOQUwoaW5vZGUpOworCWlmICgham91cm5hbCkKKwkJcmV0dXJuIDA7CiAJaWYgKGlzX2pvdXJuYWxfYWJvcnRlZChqb3VybmFsKSkKIAkJcmV0dXJuIC1FUk9GUzsKIApAQCAtNDkzNiw3ICs1MDgxLDcgQEAKIAkJcmV0dXJuIFBUUl9FUlIoaGFuZGxlKTsKIAogCWVyciA9IGV4dDRfbWFya19pbm9kZV9kaXJ0eShoYW5kbGUsIGlub2RlKTsKLQloYW5kbGUtPmhfc3luYyA9IDE7CisJZXh0NF9oYW5kbGVfc3luYyhoYW5kbGUpOwogCWV4dDRfam91cm5hbF9zdG9wKGhhbmRsZSk7CiAJZXh0NF9zdGRfZXJyb3IoaW5vZGUtPmlfc2IsIGVycik7CiAKZGlmZiAtLWdpdCBhL2ZzL2V4dDQvaW9jdGwuYyBiL2ZzL2V4dDQvaW9jdGwuYwppbmRleCBkYzk5YjQ3Li40MmRjODNmIDEwMDY0NAotLS0gYS9mcy9leHQ0L2lvY3RsLmMKKysrIGIvZnMvZXh0NC9pb2N0bC5jCkBAIC05OSw3ICs5OSw3IEBACiAJCQlnb3RvIGZsYWdzX291dDsKIAkJfQogCQlpZiAoSVNfU1lOQyhpbm9kZSkpCi0JCQloYW5kbGUtPmhfc3luYyA9IDE7CisJCQlleHQ0X2hhbmRsZV9zeW5jKGhhbmRsZSk7CiAJCWVyciA9IGV4dDRfcmVzZXJ2ZV9pbm9kZV93cml0ZShoYW5kbGUsIGlub2RlLCAmaWxvYyk7CiAJCWlmIChlcnIpCiAJCQlnb3RvIGZsYWdzX2VycjsKZGlmZiAtLWdpdCBhL2ZzL2V4dDQvbWJhbGxvYy5jIGIvZnMvZXh0NC9tYmFsbG9jLmMKaW5kZXggNDQ0YWQ5OS4uOTE4YWVjMCAxMDA2NDQKLS0tIGEvZnMvZXh0NC9tYmFsbG9jLmMKKysrIGIvZnMvZXh0NC9tYmFsbG9jLmMKQEAgLTEwMCw3ICsxMDAsNyBAQAogICogaW5vZGUgYXM6CiAgKgogICogIHsgICAgICAgICAgICAgICAgICAgICAgICBwYWdlICAgICAgICAgICAgICAgICAgICAgICAgfQotICogIFsgZ3JvdXAgMCBidWRkeV1bIGdyb3VwIDAgYml0bWFwXSBbZ3JvdXAgMV1bIGdyb3VwIDFdLi4uCisgKiAgWyBncm91cCAwIGJpdG1hcF1bIGdyb3VwIDAgYnVkZHldIFtncm91cCAxXVsgZ3JvdXAgMV0uLi4KICAqCiAgKgogICogb25lIGJsb2NrIGVhY2ggZm9yIGJpdG1hcCBhbmQgYnVkZHkgaW5mb3JtYXRpb24uICBTbyBmb3IgZWFjaCBncm91cCB3ZQpAQCAtMzMwLDYgKzMzMCwxOCBAQAogICogICAgICAgIG9iamVjdAogICoKICAqLworc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICpleHQ0X3BzcGFjZV9jYWNoZXA7CitzdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKmV4dDRfYWNfY2FjaGVwOworc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICpleHQ0X2ZyZWVfZXh0X2NhY2hlcDsKK3N0YXRpYyB2b2lkIGV4dDRfbWJfZ2VuZXJhdGVfZnJvbV9wYShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB2b2lkICpiaXRtYXAsCisJCQkJCWV4dDRfZ3JvdXBfdCBncm91cCk7CitzdGF0aWMgdm9pZCBleHQ0X21iX2dlbmVyYXRlX2Zyb21fZnJlZWxpc3Qoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdm9pZCAqYml0bWFwLAorCQkJCQkJZXh0NF9ncm91cF90IGdyb3VwKTsKK3N0YXRpYyBpbnQgZXh0NF9tYl9pbml0X3Blcl9kZXZfcHJvYyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKTsKK3N0YXRpYyBpbnQgZXh0NF9tYl9kZXN0cm95X3Blcl9kZXZfcHJvYyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKTsKK3N0YXRpYyB2b2lkIHJlbGVhc2VfYmxvY2tzX29uX2NvbW1pdChqb3VybmFsX3QgKmpvdXJuYWwsIHRyYW5zYWN0aW9uX3QgKnR4bik7CisKKwogCiBzdGF0aWMgaW5saW5lIHZvaWQgKm1iX2NvcnJlY3RfYWRkcl9hbmRfYml0KGludCAqYml0LCB2b2lkICphZGRyKQogewpAQCAtNDQ1LDkgKzQ1Nyw5IEBACiAJCQlibG9ja25yICs9IGZpcnN0ICsgaTsKIAkJCWJsb2NrbnIgKz0KIAkJCSAgICBsZTMyX3RvX2NwdShFWFQ0X1NCKHNiKS0+c19lcy0+c19maXJzdF9kYXRhX2Jsb2NrKTsKLQotCQkJZXh0NF9lcnJvcihzYiwgX19mdW5jX18sICJkb3VibGUtZnJlZSBvZiBpbm9kZSIKLQkJCQkgICAiICVsdSdzIGJsb2NrICVsbHUoYml0ICV1IGluIGdyb3VwICVsdSlcbiIsCisJCQlleHQ0X2dycF9sb2NrZWRfZXJyb3Ioc2IsIGU0Yi0+YmRfZ3JvdXAsCisJCQkJICAgX19mdW5jX18sICJkb3VibGUtZnJlZSBvZiBpbm9kZSIKKwkJCQkgICAiICVsdSdzIGJsb2NrICVsbHUoYml0ICV1IGluIGdyb3VwICV1KSIsCiAJCQkJICAgaW5vZGUgPyBpbm9kZS0+aV9pbm8gOiAwLCBibG9ja25yLAogCQkJCSAgIGZpcnN0ICsgaSwgZTRiLT5iZF9ncm91cCk7CiAJCX0KQEAgLTQ3Nyw3ICs0ODksNyBAQAogCQliMiA9ICh1bnNpZ25lZCBjaGFyICopIGJpdG1hcDsKIAkJZm9yIChpID0gMDsgaSA8IGU0Yi0+YmRfc2ItPnNfYmxvY2tzaXplOyBpKyspIHsKIAkJCWlmIChiMVtpXSAhPSBiMltpXSkgewotCQkJCXByaW50ayhLRVJOX0VSUiAiY29ycnVwdGlvbiBpbiBncm91cCAlbHUgIgorCQkJCXByaW50ayhLRVJOX0VSUiAiY29ycnVwdGlvbiBpbiBncm91cCAldSAiCiAJCQkJICAgICAgICJhdCBieXRlICV1KCV1KTogJXggaW4gY29weSAhPSAleCAiCiAJCQkJICAgICAgICJvbiBkaXNrL3ByZWFsbG9jXG4iLAogCQkJCSAgICAgICBlNGItPmJkX2dyb3VwLCBpLCBpICogOCwgYjFbaV0sIGIyW2ldKTsKQEAgLTY5MCw4ICs3MDIsOCBAQAogCWdycC0+YmJfZnJhZ21lbnRzID0gZnJhZ21lbnRzOwogCiAJaWYgKGZyZWUgIT0gZ3JwLT5iYl9mcmVlKSB7Ci0JCWV4dDRfZXJyb3Ioc2IsIF9fZnVuY19fLAotCQkJIkVYVDQtZnM6IGdyb3VwICVsdTogJXUgYmxvY2tzIGluIGJpdG1hcCwgJXUgaW4gZ2RcbiIsCisJCWV4dDRfZ3JwX2xvY2tlZF9lcnJvcihzYiwgZ3JvdXAsICBfX2Z1bmNfXywKKwkJCSJFWFQ0LWZzOiBncm91cCAldTogJXUgYmxvY2tzIGluIGJpdG1hcCwgJXUgaW4gZ2QiLAogCQkJZ3JvdXAsIGZyZWUsIGdycC0+YmJfZnJlZSk7CiAJCS8qCiAJCSAqIElmIHdlIGludGVudCB0byBjb250aW51ZSwgd2UgY29uc2lkZXIgZ3JvdXAgZGVzY3JpdG9yCkBAIC03MTYsNyArNzI4LDcgQEAKICAqIHN0b3JlZCBpbiB0aGUgaW5vZGUgYXMKICAqCiAgKiB7ICAgICAgICAgICAgICAgICAgICAgICAgcGFnZSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAqIFsgZ3JvdXAgMCBidWRkeV1bIGdyb3VwIDAgYml0bWFwXSBbZ3JvdXAgMV1bIGdyb3VwIDFdLi4uCisgKiBbIGdyb3VwIDAgYml0bWFwXVsgZ3JvdXAgMCBidWRkeV0gW2dyb3VwIDFdWyBncm91cCAxXS4uLgogICoKICAqCiAgKiBvbmUgYmxvY2sgZWFjaCBmb3IgYml0bWFwIGFuZCBidWRkeSBpbmZvcm1hdGlvbi4KQEAgLTc4MiwyNSArNzk0LDQ1IEBACiAJCWlmIChiaFtpXSA9PSBOVUxMKQogCQkJZ290byBvdXQ7CiAKLQkJaWYgKGJ1ZmZlcl91cHRvZGF0ZShiaFtpXSkgJiYKLQkJICAgICEoZGVzYy0+YmdfZmxhZ3MgJiBjcHVfdG9fbGUxNihFWFQ0X0JHX0JMT0NLX1VOSU5JVCkpKQorCQlpZiAoYml0bWFwX3VwdG9kYXRlKGJoW2ldKSkKIAkJCWNvbnRpbnVlOwogCiAJCWxvY2tfYnVmZmVyKGJoW2ldKTsKKwkJaWYgKGJpdG1hcF91cHRvZGF0ZShiaFtpXSkpIHsKKwkJCXVubG9ja19idWZmZXIoYmhbaV0pOworCQkJY29udGludWU7CisJCX0KIAkJc3Bpbl9sb2NrKHNiX2JnbF9sb2NrKEVYVDRfU0Ioc2IpLCBmaXJzdF9ncm91cCArIGkpKTsKIAkJaWYgKGRlc2MtPmJnX2ZsYWdzICYgY3B1X3RvX2xlMTYoRVhUNF9CR19CTE9DS19VTklOSVQpKSB7CiAJCQlleHQ0X2luaXRfYmxvY2tfYml0bWFwKHNiLCBiaFtpXSwKIAkJCQkJCWZpcnN0X2dyb3VwICsgaSwgZGVzYyk7CisJCQlzZXRfYml0bWFwX3VwdG9kYXRlKGJoW2ldKTsKIAkJCXNldF9idWZmZXJfdXB0b2RhdGUoYmhbaV0pOwotCQkJdW5sb2NrX2J1ZmZlcihiaFtpXSk7CiAJCQlzcGluX3VubG9jayhzYl9iZ2xfbG9jayhFWFQ0X1NCKHNiKSwgZmlyc3RfZ3JvdXAgKyBpKSk7CisJCQl1bmxvY2tfYnVmZmVyKGJoW2ldKTsKIAkJCWNvbnRpbnVlOwogCQl9CiAJCXNwaW5fdW5sb2NrKHNiX2JnbF9sb2NrKEVYVDRfU0Ioc2IpLCBmaXJzdF9ncm91cCArIGkpKTsKKwkJaWYgKGJ1ZmZlcl91cHRvZGF0ZShiaFtpXSkpIHsKKwkJCS8qCisJCQkgKiBpZiBub3QgdW5pbml0IGlmIGJoIGlzIHVwdG9kYXRlLAorCQkJICogYml0bWFwIGlzIGFsc28gdXB0b2RhdGUKKwkJCSAqLworCQkJc2V0X2JpdG1hcF91cHRvZGF0ZShiaFtpXSk7CisJCQl1bmxvY2tfYnVmZmVyKGJoW2ldKTsKKwkJCWNvbnRpbnVlOworCQl9CiAJCWdldF9iaChiaFtpXSk7CisJCS8qCisJCSAqIHN1Ym1pdCB0aGUgYnVmZmVyX2hlYWQgZm9yIHJlYWQuIFdlIGNhbgorCQkgKiBzYWZlbHkgbWFyayB0aGUgYml0bWFwIGFzIHVwdG9kYXRlIG5vdy4KKwkJICogV2UgZG8gaXQgaGVyZSBzbyB0aGUgYml0bWFwIHVwdG9kYXRlIGJpdAorCQkgKiBnZXQgc2V0IHdpdGggYnVmZmVyIGxvY2sgaGVsZC4KKwkJICovCisJCXNldF9iaXRtYXBfdXB0b2RhdGUoYmhbaV0pOwogCQliaFtpXS0+Yl9lbmRfaW8gPSBlbmRfYnVmZmVyX3JlYWRfc3luYzsKIAkJc3VibWl0X2JoKFJFQUQsIGJoW2ldKTsKLQkJbWJfZGVidWcoInJlYWQgYml0bWFwIGZvciBncm91cCAlbHVcbiIsIGZpcnN0X2dyb3VwICsgaSk7CisJCW1iX2RlYnVnKCJyZWFkIGJpdG1hcCBmb3IgZ3JvdXAgJXVcbiIsIGZpcnN0X2dyb3VwICsgaSk7CiAJfQogCiAJLyogd2FpdCBmb3IgSS9PIGNvbXBsZXRpb24gKi8KQEAgLTgxNCw2ICs4NDYsOCBAQAogCiAJZXJyID0gMDsKIAlmaXJzdF9ibG9jayA9IHBhZ2UtPmluZGV4ICogYmxvY2tzX3Blcl9wYWdlOworCS8qIGluaXQgdGhlIHBhZ2UgICovCisJbWVtc2V0KHBhZ2VfYWRkcmVzcyhwYWdlKSwgMHhmZiwgUEFHRV9DQUNIRV9TSVpFKTsKIAlmb3IgKGkgPSAwOyBpIDwgYmxvY2tzX3Blcl9wYWdlOyBpKyspIHsKIAkJaW50IGdyb3VwOwogCQlzdHJ1Y3QgZXh0NF9ncm91cF9pbmZvICpncmluZm87CkBAIC04NDAsNyArODc0LDYgQEAKIAkJCUJVR19PTihpbmNvcmUgPT0gTlVMTCk7CiAJCQltYl9kZWJ1ZygicHV0IGJ1ZGR5IGZvciBncm91cCAldSBpbiBwYWdlICVsdS8leFxuIiwKIAkJCQlncm91cCwgcGFnZS0+aW5kZXgsIGkgKiBibG9ja3NpemUpOwotCQkJbWVtc2V0KGRhdGEsIDB4ZmYsIGJsb2Nrc2l6ZSk7CiAJCQlncmluZm8gPSBleHQ0X2dldF9ncm91cF9pbmZvKHNiLCBncm91cCk7CiAJCQlncmluZm8tPmJiX2ZyYWdtZW50cyA9IDA7CiAJCQltZW1zZXQoZ3JpbmZvLT5iYl9jb3VudGVycywgMCwKQEAgLTg0OCw3ICs4ODEsOSBAQAogCQkJLyoKIAkJCSAqIGluY29yZSBnb3Qgc2V0IHRvIHRoZSBncm91cCBibG9jayBiaXRtYXAgYmVsb3cKIAkJCSAqLworCQkJZXh0NF9sb2NrX2dyb3VwKHNiLCBncm91cCk7CiAJCQlleHQ0X21iX2dlbmVyYXRlX2J1ZGR5KHNiLCBkYXRhLCBpbmNvcmUsIGdyb3VwKTsKKwkJCWV4dDRfdW5sb2NrX2dyb3VwKHNiLCBncm91cCk7CiAJCQlpbmNvcmUgPSBOVUxMOwogCQl9IGVsc2UgewogCQkJLyogdGhpcyBpcyBibG9jayBvZiBiaXRtYXAgKi8KQEAgLTg2Miw2ICs4OTcsNyBAQAogCiAJCQkvKiBtYXJrIGFsbCBwcmVhbGxvY2F0ZWQgYmxrcyB1c2VkIGluIGluLWNvcmUgYml0bWFwICovCiAJCQlleHQ0X21iX2dlbmVyYXRlX2Zyb21fcGEoc2IsIGRhdGEsIGdyb3VwKTsKKwkJCWV4dDRfbWJfZ2VuZXJhdGVfZnJvbV9mcmVlbGlzdChzYiwgZGF0YSwgZ3JvdXApOwogCQkJZXh0NF91bmxvY2tfZ3JvdXAoc2IsIGdyb3VwKTsKIAogCQkJLyogc2V0IGluY29yZSBzbyB0aGF0IHRoZSBidWRkeSBpbmZvcm1hdGlvbiBjYW4gYmUKQEAgLTg4NiwxOCArOTIyLDIwIEBACiBleHQ0X21iX2xvYWRfYnVkZHkoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgZXh0NF9ncm91cF90IGdyb3VwLAogCQkJCQlzdHJ1Y3QgZXh0NF9idWRkeSAqZTRiKQogewotCXN0cnVjdCBleHQ0X3NiX2luZm8gKnNiaSA9IEVYVDRfU0Ioc2IpOwotCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBzYmktPnNfYnVkZHlfY2FjaGU7CiAJaW50IGJsb2Nrc19wZXJfcGFnZTsKIAlpbnQgYmxvY2s7CiAJaW50IHBudW07CiAJaW50IHBvZmY7CiAJc3RydWN0IHBhZ2UgKnBhZ2U7CiAJaW50IHJldDsKKwlzdHJ1Y3QgZXh0NF9ncm91cF9pbmZvICpncnA7CisJc3RydWN0IGV4dDRfc2JfaW5mbyAqc2JpID0gRVhUNF9TQihzYik7CisJc3RydWN0IGlub2RlICppbm9kZSA9IHNiaS0+c19idWRkeV9jYWNoZTsKIAotCW1iX2RlYnVnKCJsb2FkIGdyb3VwICVsdVxuIiwgZ3JvdXApOworCW1iX2RlYnVnKCJsb2FkIGdyb3VwICV1XG4iLCBncm91cCk7CiAKIAlibG9ja3NfcGVyX3BhZ2UgPSBQQUdFX0NBQ0hFX1NJWkUgLyBzYi0+c19ibG9ja3NpemU7CisJZ3JwID0gZXh0NF9nZXRfZ3JvdXBfaW5mbyhzYiwgZ3JvdXApOwogCiAJZTRiLT5iZF9ibGtiaXRzID0gc2ItPnNfYmxvY2tzaXplX2JpdHM7CiAJZTRiLT5iZF9pbmZvID0gZXh0NF9nZXRfZ3JvdXBfaW5mbyhzYiwgZ3JvdXApOwpAQCAtOTA1LDYgKzk0MywxNSBAQAogCWU0Yi0+YmRfZ3JvdXAgPSBncm91cDsKIAllNGItPmJkX2J1ZGR5X3BhZ2UgPSBOVUxMOwogCWU0Yi0+YmRfYml0bWFwX3BhZ2UgPSBOVUxMOworCWU0Yi0+YWxsb2Nfc2VtcCA9ICZncnAtPmFsbG9jX3NlbTsKKworCS8qIFRha2UgdGhlIHJlYWQgbG9jayBvbiB0aGUgZ3JvdXAgYWxsb2MKKwkgKiBzZW0uIFRoaXMgd291bGQgbWFrZSBzdXJlIGEgcGFyYWxsZWwKKwkgKiBleHQ0X21iX2luaXRfZ3JvdXAgaGFwcGVuaW5nIG9uIG90aGVyCisJICogZ3JvdXBzIG1hcHBlZCBieSB0aGUgcGFnZSBpcyBibG9ja2VkCisJICogdGlsbCB3ZSBhcmUgZG9uZSB3aXRoIGFsbG9jYXRpb24KKwkgKi8KKwlkb3duX3JlYWQoZTRiLT5hbGxvY19zZW1wKTsKIAogCS8qCiAJICogdGhlIGJ1ZGR5IGNhY2hlIGlub2RlIHN0b3JlcyB0aGUgYmxvY2sgYml0bWFwCkBAIC05MjAsNiArOTY3LDE0IEBACiAJcGFnZSA9IGZpbmRfZ2V0X3BhZ2UoaW5vZGUtPmlfbWFwcGluZywgcG51bSk7CiAJaWYgKHBhZ2UgPT0gTlVMTCB8fCAhUGFnZVVwdG9kYXRlKHBhZ2UpKSB7CiAJCWlmIChwYWdlKQorCQkJLyoKKwkJCSAqIGRyb3AgdGhlIHBhZ2UgcmVmZXJlbmNlIGFuZCB0cnkKKwkJCSAqIHRvIGdldCB0aGUgcGFnZSB3aXRoIGxvY2suIElmIHdlCisJCQkgKiBhcmUgbm90IHVwdG9kYXRlIHRoYXQgaW1wbGllcworCQkJICogc29tZWJvZHkganVzdCBjcmVhdGVkIHRoZSBwYWdlIGJ1dAorCQkJICogaXMgeWV0IHRvIGluaXRpYWxpemUgdGhlIHNhbWUuIFNvCisJCQkgKiB3YWl0IGZvciBpdCB0byBpbml0aWFsaXplLgorCQkJICovCiAJCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CiAJCXBhZ2UgPSBmaW5kX29yX2NyZWF0ZV9wYWdlKGlub2RlLT5pX21hcHBpbmcsIHBudW0sIEdGUF9OT0ZTKTsKIAkJaWYgKHBhZ2UpIHsKQEAgLTk4NSw2ICsxMDQwLDkgQEAKIAkJcGFnZV9jYWNoZV9yZWxlYXNlKGU0Yi0+YmRfYnVkZHlfcGFnZSk7CiAJZTRiLT5iZF9idWRkeSA9IE5VTEw7CiAJZTRiLT5iZF9iaXRtYXAgPSBOVUxMOworCisJLyogRG9uZSB3aXRoIHRoZSBidWRkeSBjYWNoZSAqLworCXVwX3JlYWQoZTRiLT5hbGxvY19zZW1wKTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC05OTQsNiArMTA1Miw5IEBACiAJCXBhZ2VfY2FjaGVfcmVsZWFzZShlNGItPmJkX2JpdG1hcF9wYWdlKTsKIAlpZiAoZTRiLT5iZF9idWRkeV9wYWdlKQogCQlwYWdlX2NhY2hlX3JlbGVhc2UoZTRiLT5iZF9idWRkeV9wYWdlKTsKKwkvKiBEb25lIHdpdGggdGhlIGJ1ZGR5IGNhY2hlICovCisJaWYgKGU0Yi0+YWxsb2Nfc2VtcCkKKwkJdXBfcmVhZChlNGItPmFsbG9jX3NlbXApOwogfQogCiAKQEAgLTEwMzEsNyArMTA5MiwxMCBAQAogCQkJY3VyICs9IDMyOwogCQkJY29udGludWU7CiAJCX0KLQkJbWJfY2xlYXJfYml0X2F0b21pYyhsb2NrLCBjdXIsIGJtKTsKKwkJaWYgKGxvY2spCisJCQltYl9jbGVhcl9iaXRfYXRvbWljKGxvY2ssIGN1ciwgYm0pOworCQllbHNlCisJCQltYl9jbGVhcl9iaXQoY3VyLCBibSk7CiAJCWN1cisrOwogCX0KIH0KQEAgLTEwNDksNyArMTExMywxMCBAQAogCQkJY3VyICs9IDMyOwogCQkJY29udGludWU7CiAJCX0KLQkJbWJfc2V0X2JpdF9hdG9taWMobG9jaywgY3VyLCBibSk7CisJCWlmIChsb2NrKQorCQkJbWJfc2V0X2JpdF9hdG9taWMobG9jaywgY3VyLCBibSk7CisJCWVsc2UKKwkJCW1iX3NldF9iaXQoY3VyLCBibSk7CiAJCWN1cisrOwogCX0KIH0KQEAgLTEwOTQsMTIgKzExNjEsMTEgQEAKIAkJCWJsb2NrbnIgKz0gYmxvY2s7CiAJCQlibG9ja25yICs9CiAJCQkgICAgbGUzMl90b19jcHUoRVhUNF9TQihzYiktPnNfZXMtPnNfZmlyc3RfZGF0YV9ibG9jayk7Ci0JCQlleHQ0X3VubG9ja19ncm91cChzYiwgZTRiLT5iZF9ncm91cCk7Ci0JCQlleHQ0X2Vycm9yKHNiLCBfX2Z1bmNfXywgImRvdWJsZS1mcmVlIG9mIGlub2RlIgotCQkJCSAgICIgJWx1J3MgYmxvY2sgJWxsdShiaXQgJXUgaW4gZ3JvdXAgJWx1KVxuIiwKKwkJCWV4dDRfZ3JwX2xvY2tlZF9lcnJvcihzYiwgZTRiLT5iZF9ncm91cCwKKwkJCQkgICBfX2Z1bmNfXywgImRvdWJsZS1mcmVlIG9mIGlub2RlIgorCQkJCSAgICIgJWx1J3MgYmxvY2sgJWxsdShiaXQgJXUgaW4gZ3JvdXAgJXUpIiwKIAkJCQkgICBpbm9kZSA/IGlub2RlLT5pX2lubyA6IDAsIGJsb2NrbnIsIGJsb2NrLAogCQkJCSAgIGU0Yi0+YmRfZ3JvdXApOwotCQkJZXh0NF9sb2NrX2dyb3VwKHNiLCBlNGItPmJkX2dyb3VwKTsKIAkJfQogCQltYl9jbGVhcl9iaXQoYmxvY2ssIEVYVDRfTUJfQklUTUFQKGU0YikpOwogCQllNGItPmJkX2luZm8tPmJiX2NvdW50ZXJzW29yZGVyXSsrOwpAQCAtMTI5NiwxMyArMTM2MiwyMCBAQAogCWFjLT5hY190YWlsID0gcmV0ICYgMHhmZmZmOwogCWFjLT5hY19idWRkeSA9IHJldCA+PiAxNjsKIAotCS8qIFhYWFhYWFg6IFNVQ0ggQSBIT1JSSUJMRSAqKkNLICovCi0JLypGSVhNRSEhIFdoeSA/ICovCisJLyoKKwkgKiB0YWtlIHRoZSBwYWdlIHJlZmVyZW5jZS4gV2Ugd2FudCB0aGUgcGFnZSB0byBiZSBwaW5uZWQKKwkgKiBzbyB0aGF0IHdlIGRvbid0IGdldCBhIGV4dDRfbWJfaW5pdF9jYWNoZV9jYWxsIGZvciB0aGlzCisJICogZ3JvdXAgdW50aWwgd2UgdXBkYXRlIHRoZSBiaXRtYXAuIFRoYXQgd291bGQgbWVhbiB3ZQorCSAqIGRvdWJsZSBhbGxvY2F0ZSBibG9ja3MuIFRoZSByZWZlcmVuY2UgaXMgZHJvcHBlZAorCSAqIGluIGV4dDRfbWJfcmVsZWFzZV9jb250ZXh0CisJICovCiAJYWMtPmFjX2JpdG1hcF9wYWdlID0gZTRiLT5iZF9iaXRtYXBfcGFnZTsKIAlnZXRfcGFnZShhYy0+YWNfYml0bWFwX3BhZ2UpOwogCWFjLT5hY19idWRkeV9wYWdlID0gZTRiLT5iZF9idWRkeV9wYWdlOwogCWdldF9wYWdlKGFjLT5hY19idWRkeV9wYWdlKTsKLQorCS8qIG9uIGFsbG9jYXRpb24gd2UgdXNlIGFjIHRvIHRyYWNrIHRoZSBoZWxkIHNlbWFwaG9yZSAqLworCWFjLT5hbGxvY19zZW1wID0gIGU0Yi0+YWxsb2Nfc2VtcDsKKwllNGItPmFsbG9jX3NlbXAgPSBOVUxMOwogCS8qIHN0b3JlIGxhc3QgYWxsb2NhdGVkIGZvciBzdWJzZXF1ZW50IHN0cmVhbSBhbGxvY2F0aW9uICovCiAJaWYgKChhYy0+YWNfZmxhZ3MgJiBFWFQ0X01CX0hJTlRfREFUQSkpIHsKIAkJc3Bpbl9sb2NrKCZzYmktPnNfbWRfbG9jayk7CkBAIC0xMzI2LDYgKzEzOTksOCBAQAogCXN0cnVjdCBleHQ0X2ZyZWVfZXh0ZW50IGV4OwogCWludCBtYXg7CiAKKwlpZiAoYWMtPmFjX3N0YXR1cyA9PSBBQ19TVEFUVVNfRk9VTkQpCisJCXJldHVybjsKIAkvKgogCSAqIFdlIGRvbid0IHdhbnQgdG8gc2NhbiBmb3IgYSB3aG9sZSB5ZWFyCiAJICovCkBAIC0xNTc1LDggKzE2NTAsOSBAQAogCQkJICogZnJlZSBibG9ja3MgZXZlbiB0aG91Z2ggZ3JvdXAgaW5mbyBzYXlzIHdlCiAJCQkgKiB3ZSBoYXZlIGZyZWUgYmxvY2tzCiAJCQkgKi8KLQkJCWV4dDRfZXJyb3Ioc2IsIF9fZnVuY19fLCAiJWQgZnJlZSBibG9ja3MgYXMgcGVyICIKLQkJCQkJImdyb3VwIGluZm8uIEJ1dCBiaXRtYXAgc2F5cyAwXG4iLAorCQkJZXh0NF9ncnBfbG9ja2VkX2Vycm9yKHNiLCBlNGItPmJkX2dyb3VwLAorCQkJCQlfX2Z1bmNfXywgIiVkIGZyZWUgYmxvY2tzIGFzIHBlciAiCisJCQkJCSJncm91cCBpbmZvLiBCdXQgYml0bWFwIHNheXMgMCIsCiAJCQkJCWZyZWUpOwogCQkJYnJlYWs7CiAJCX0KQEAgLTE1ODQsOCArMTY2MCw5IEBACiAJCW1iX2ZpbmRfZXh0ZW50KGU0YiwgMCwgaSwgYWMtPmFjX2dfZXguZmVfbGVuLCAmZXgpOwogCQlCVUdfT04oZXguZmVfbGVuIDw9IDApOwogCQlpZiAoZnJlZSA8IGV4LmZlX2xlbikgewotCQkJZXh0NF9lcnJvcihzYiwgX19mdW5jX18sICIlZCBmcmVlIGJsb2NrcyBhcyBwZXIgIgotCQkJCQkiZ3JvdXAgaW5mby4gQnV0IGdvdCAlZCBibG9ja3NcbiIsCisJCQlleHQ0X2dycF9sb2NrZWRfZXJyb3Ioc2IsIGU0Yi0+YmRfZ3JvdXAsCisJCQkJCV9fZnVuY19fLCAiJWQgZnJlZSBibG9ja3MgYXMgcGVyICIKKwkJCQkJImdyb3VwIGluZm8uIEJ1dCBnb3QgJWQgYmxvY2tzIiwKIAkJCQkJZnJlZSwgZXguZmVfbGVuKTsKIAkJCS8qCiAJCQkgKiBUaGUgbnVtYmVyIG9mIGZyZWUgYmxvY2tzIGRpZmZlcnMuIFRoaXMgbW9zdGx5CkBAIC0xNjkyLDYgKzE3NjksMTczIEBACiAJcmV0dXJuIDA7CiB9CiAKKy8qCisgKiBsb2NrIHRoZSBncm91cF9pbmZvIGFsbG9jX3NlbSBvZiBhbGwgdGhlIGdyb3VwcworICogYmVsb25naW5nIHRvIHRoZSBzYW1lIGJ1ZGR5IGNhY2hlIHBhZ2UuIFRoaXMKKyAqIG1ha2Ugc3VyZSBvdGhlciBwYXJhbGxlbCBvcGVyYXRpb24gb24gdGhlIGJ1ZGR5CisgKiBjYWNoZSBkb2Vzbid0IGhhcHBlbiAgd2hpbGQgaG9sZGluZyB0aGUgYnVkZHkgY2FjaGUKKyAqIGxvY2sKKyAqLworaW50IGV4dDRfbWJfZ2V0X2J1ZGR5X2NhY2hlX2xvY2soc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgZXh0NF9ncm91cF90IGdyb3VwKQoreworCWludCBpOworCWludCBibG9jaywgcG51bTsKKwlpbnQgYmxvY2tzX3Blcl9wYWdlOworCWludCBncm91cHNfcGVyX3BhZ2U7CisJZXh0NF9ncm91cF90IGZpcnN0X2dyb3VwOworCXN0cnVjdCBleHQ0X2dyb3VwX2luZm8gKmdycDsKKworCWJsb2Nrc19wZXJfcGFnZSA9IFBBR0VfQ0FDSEVfU0laRSAvIHNiLT5zX2Jsb2Nrc2l6ZTsKKwkvKgorCSAqIHRoZSBidWRkeSBjYWNoZSBpbm9kZSBzdG9yZXMgdGhlIGJsb2NrIGJpdG1hcAorCSAqIGFuZCBidWRkeSBpbmZvcm1hdGlvbiBpbiBjb25zZWN1dGl2ZSBibG9ja3MuCisJICogU28gZm9yIGVhY2ggZ3JvdXAgd2UgbmVlZCB0d28gYmxvY2tzLgorCSAqLworCWJsb2NrID0gZ3JvdXAgKiAyOworCXBudW0gPSBibG9jayAvIGJsb2Nrc19wZXJfcGFnZTsKKwlmaXJzdF9ncm91cCA9IHBudW0gKiBibG9ja3NfcGVyX3BhZ2UgLyAyOworCisJZ3JvdXBzX3Blcl9wYWdlID0gYmxvY2tzX3Blcl9wYWdlID4+IDE7CisJaWYgKGdyb3Vwc19wZXJfcGFnZSA9PSAwKQorCQlncm91cHNfcGVyX3BhZ2UgPSAxOworCS8qIHJlYWQgYWxsIGdyb3VwcyB0aGUgcGFnZSBjb3ZlcnMgaW50byB0aGUgY2FjaGUgKi8KKwlmb3IgKGkgPSAwOyBpIDwgZ3JvdXBzX3Blcl9wYWdlOyBpKyspIHsKKworCQlpZiAoKGZpcnN0X2dyb3VwICsgaSkgPj0gRVhUNF9TQihzYiktPnNfZ3JvdXBzX2NvdW50KQorCQkJYnJlYWs7CisJCWdycCA9IGV4dDRfZ2V0X2dyb3VwX2luZm8oc2IsIGZpcnN0X2dyb3VwICsgaSk7CisJCS8qIHRha2UgYWxsIGdyb3VwcyB3cml0ZSBhbGxvY2F0aW9uCisJCSAqIHNlbWFwaG9yZS4gVGhpcyBtYWtlIHN1cmUgdGhlcmUgaXMKKwkJICogbm8gYmxvY2sgYWxsb2NhdGlvbiBnb2luZyBvbiBpbiBhbnkKKwkJICogb2YgdGhhdCBncm91cHMKKwkJICovCisJCWRvd25fd3JpdGVfbmVzdGVkKCZncnAtPmFsbG9jX3NlbSwgaSk7CisJfQorCXJldHVybiBpOworfQorCit2b2lkIGV4dDRfbWJfcHV0X2J1ZGR5X2NhY2hlX2xvY2soc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwkJCQkJZXh0NF9ncm91cF90IGdyb3VwLCBpbnQgbG9ja2VkX2dyb3VwKQoreworCWludCBpOworCWludCBibG9jaywgcG51bTsKKwlpbnQgYmxvY2tzX3Blcl9wYWdlOworCWV4dDRfZ3JvdXBfdCBmaXJzdF9ncm91cDsKKwlzdHJ1Y3QgZXh0NF9ncm91cF9pbmZvICpncnA7CisKKwlibG9ja3NfcGVyX3BhZ2UgPSBQQUdFX0NBQ0hFX1NJWkUgLyBzYi0+c19ibG9ja3NpemU7CisJLyoKKwkgKiB0aGUgYnVkZHkgY2FjaGUgaW5vZGUgc3RvcmVzIHRoZSBibG9jayBiaXRtYXAKKwkgKiBhbmQgYnVkZHkgaW5mb3JtYXRpb24gaW4gY29uc2VjdXRpdmUgYmxvY2tzLgorCSAqIFNvIGZvciBlYWNoIGdyb3VwIHdlIG5lZWQgdHdvIGJsb2Nrcy4KKwkgKi8KKwlibG9jayA9IGdyb3VwICogMjsKKwlwbnVtID0gYmxvY2sgLyBibG9ja3NfcGVyX3BhZ2U7CisJZmlyc3RfZ3JvdXAgPSBwbnVtICogYmxvY2tzX3Blcl9wYWdlIC8gMjsKKwkvKiByZWxlYXNlIGxvY2tzIG9uIGFsbCB0aGUgZ3JvdXBzICovCisJZm9yIChpID0gMDsgaSA8IGxvY2tlZF9ncm91cDsgaSsrKSB7CisKKwkJZ3JwID0gZXh0NF9nZXRfZ3JvdXBfaW5mbyhzYiwgZmlyc3RfZ3JvdXAgKyBpKTsKKwkJLyogdGFrZSBhbGwgZ3JvdXBzIHdyaXRlIGFsbG9jYXRpb24KKwkJICogc2VtYXBob3JlLiBUaGlzIG1ha2Ugc3VyZSB0aGVyZSBpcworCQkgKiBubyBibG9jayBhbGxvY2F0aW9uIGdvaW5nIG9uIGluIGFueQorCQkgKiBvZiB0aGF0IGdyb3VwcworCQkgKi8KKwkJdXBfd3JpdGUoJmdycC0+YWxsb2Nfc2VtKTsKKwl9CisKK30KKworc3RhdGljIGludCBleHQ0X21iX2luaXRfZ3JvdXAoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgZXh0NF9ncm91cF90IGdyb3VwKQoreworCisJaW50IHJldDsKKwl2b2lkICpiaXRtYXA7CisJaW50IGJsb2Nrc19wZXJfcGFnZTsKKwlpbnQgYmxvY2ssIHBudW0sIHBvZmY7CisJaW50IG51bV9ncnBfbG9ja2VkID0gMDsKKwlzdHJ1Y3QgZXh0NF9ncm91cF9pbmZvICp0aGlzX2dycDsKKwlzdHJ1Y3QgZXh0NF9zYl9pbmZvICpzYmkgPSBFWFQ0X1NCKHNiKTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gc2JpLT5zX2J1ZGR5X2NhY2hlOworCXN0cnVjdCBwYWdlICpwYWdlID0gTlVMTCwgKmJpdG1hcF9wYWdlID0gTlVMTDsKKworCW1iX2RlYnVnKCJpbml0IGdyb3VwICVsdVxuIiwgZ3JvdXApOworCWJsb2Nrc19wZXJfcGFnZSA9IFBBR0VfQ0FDSEVfU0laRSAvIHNiLT5zX2Jsb2Nrc2l6ZTsKKwl0aGlzX2dycCA9IGV4dDRfZ2V0X2dyb3VwX2luZm8oc2IsIGdyb3VwKTsKKwkvKgorCSAqIFRoaXMgZW5zdXJlcyB3ZSBkb24ndCBhZGQgZ3JvdXAKKwkgKiB0byB0aGlzIGJ1ZGR5IGNhY2hlIHZpYSByZXNpemUKKwkgKi8KKwludW1fZ3JwX2xvY2tlZCA9ICBleHQ0X21iX2dldF9idWRkeV9jYWNoZV9sb2NrKHNiLCBncm91cCk7CisJaWYgKCFFWFQ0X01CX0dSUF9ORUVEX0lOSVQodGhpc19ncnApKSB7CisJCS8qCisJCSAqIHNvbWVib2R5IGluaXRpYWxpemVkIHRoZSBncm91cAorCQkgKiByZXR1cm4gd2l0aG91dCBkb2luZyBhbnl0aGluZworCQkgKi8KKwkJcmV0ID0gMDsKKwkJZ290byBlcnI7CisJfQorCS8qCisJICogdGhlIGJ1ZGR5IGNhY2hlIGlub2RlIHN0b3JlcyB0aGUgYmxvY2sgYml0bWFwCisJICogYW5kIGJ1ZGR5IGluZm9ybWF0aW9uIGluIGNvbnNlY3V0aXZlIGJsb2Nrcy4KKwkgKiBTbyBmb3IgZWFjaCBncm91cCB3ZSBuZWVkIHR3byBibG9ja3MuCisJICovCisJYmxvY2sgPSBncm91cCAqIDI7CisJcG51bSA9IGJsb2NrIC8gYmxvY2tzX3Blcl9wYWdlOworCXBvZmYgPSBibG9jayAlIGJsb2Nrc19wZXJfcGFnZTsKKwlwYWdlID0gZmluZF9vcl9jcmVhdGVfcGFnZShpbm9kZS0+aV9tYXBwaW5nLCBwbnVtLCBHRlBfTk9GUyk7CisJaWYgKHBhZ2UpIHsKKwkJQlVHX09OKHBhZ2UtPm1hcHBpbmcgIT0gaW5vZGUtPmlfbWFwcGluZyk7CisJCXJldCA9IGV4dDRfbWJfaW5pdF9jYWNoZShwYWdlLCBOVUxMKTsKKwkJaWYgKHJldCkgeworCQkJdW5sb2NrX3BhZ2UocGFnZSk7CisJCQlnb3RvIGVycjsKKwkJfQorCQl1bmxvY2tfcGFnZShwYWdlKTsKKwl9CisJaWYgKHBhZ2UgPT0gTlVMTCB8fCAhUGFnZVVwdG9kYXRlKHBhZ2UpKSB7CisJCXJldCA9IC1FSU87CisJCWdvdG8gZXJyOworCX0KKwltYXJrX3BhZ2VfYWNjZXNzZWQocGFnZSk7CisJYml0bWFwX3BhZ2UgPSBwYWdlOworCWJpdG1hcCA9IHBhZ2VfYWRkcmVzcyhwYWdlKSArIChwb2ZmICogc2ItPnNfYmxvY2tzaXplKTsKKworCS8qIGluaXQgYnVkZHkgY2FjaGUgKi8KKwlibG9jaysrOworCXBudW0gPSBibG9jayAvIGJsb2Nrc19wZXJfcGFnZTsKKwlwb2ZmID0gYmxvY2sgJSBibG9ja3NfcGVyX3BhZ2U7CisJcGFnZSA9IGZpbmRfb3JfY3JlYXRlX3BhZ2UoaW5vZGUtPmlfbWFwcGluZywgcG51bSwgR0ZQX05PRlMpOworCWlmIChwYWdlID09IGJpdG1hcF9wYWdlKSB7CisJCS8qCisJCSAqIElmIGJvdGggdGhlIGJpdG1hcCBhbmQgYnVkZHkgYXJlIGluCisJCSAqIHRoZSBzYW1lIHBhZ2Ugd2UgZG9uJ3QgbmVlZCB0byBmb3JjZQorCQkgKiBpbml0IHRoZSBidWRkeQorCQkgKi8KKwkJdW5sb2NrX3BhZ2UocGFnZSk7CisJfSBlbHNlIGlmIChwYWdlKSB7CisJCUJVR19PTihwYWdlLT5tYXBwaW5nICE9IGlub2RlLT5pX21hcHBpbmcpOworCQlyZXQgPSBleHQ0X21iX2luaXRfY2FjaGUocGFnZSwgYml0bWFwKTsKKwkJaWYgKHJldCkgeworCQkJdW5sb2NrX3BhZ2UocGFnZSk7CisJCQlnb3RvIGVycjsKKwkJfQorCQl1bmxvY2tfcGFnZShwYWdlKTsKKwl9CisJaWYgKHBhZ2UgPT0gTlVMTCB8fCAhUGFnZVVwdG9kYXRlKHBhZ2UpKSB7CisJCXJldCA9IC1FSU87CisJCWdvdG8gZXJyOworCX0KKwltYXJrX3BhZ2VfYWNjZXNzZWQocGFnZSk7CitlcnI6CisJZXh0NF9tYl9wdXRfYnVkZHlfY2FjaGVfbG9jayhzYiwgZ3JvdXAsIG51bV9ncnBfbG9ja2VkKTsKKwlpZiAoYml0bWFwX3BhZ2UpCisJCXBhZ2VfY2FjaGVfcmVsZWFzZShiaXRtYXBfcGFnZSk7CisJaWYgKHBhZ2UpCisJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKKwlyZXR1cm4gcmV0OworfQorCiBzdGF0aWMgbm9pbmxpbmVfZm9yX3N0YWNrIGludAogZXh0NF9tYl9yZWd1bGFyX2FsbG9jYXRvcihzdHJ1Y3QgZXh0NF9hbGxvY2F0aW9uX2NvbnRleHQgKmFjKQogewpAQCAtMTc3NSw3ICsyMDE5LDcgQEAKIAkJCQlncm91cCA9IDA7CiAKIAkJCS8qIHF1aWNrIGNoZWNrIHRvIHNraXAgZW1wdHkgZ3JvdXBzICovCi0JCQlncnAgPSBleHQ0X2dldF9ncm91cF9pbmZvKGFjLT5hY19zYiwgZ3JvdXApOworCQkJZ3JwID0gZXh0NF9nZXRfZ3JvdXBfaW5mbyhzYiwgZ3JvdXApOwogCQkJaWYgKGdycC0+YmJfZnJlZSA9PSAwKQogCQkJCWNvbnRpbnVlOwogCkBAIC0xNzg4LDEwICsyMDMyLDkgQEAKIAkJCQkgKiB3ZSBuZWVkIGZ1bGwgZGF0YSBhYm91dCB0aGUgZ3JvdXAKIAkJCQkgKiB0byBtYWtlIGEgZ29vZCBzZWxlY3Rpb24KIAkJCQkgKi8KLQkJCQllcnIgPSBleHQ0X21iX2xvYWRfYnVkZHkoc2IsIGdyb3VwLCAmZTRiKTsKKwkJCQllcnIgPSBleHQ0X21iX2luaXRfZ3JvdXAoc2IsIGdyb3VwKTsKIAkJCQlpZiAoZXJyKQogCQkJCQlnb3RvIG91dDsKLQkJCQlleHQ0X21iX3JlbGVhc2VfZGVzYygmZTRiKTsKIAkJCX0KIAogCQkJLyoKQEAgLTE5MzIsMTMgKzIxNzUsMTMgQEAKIAlpZiAoaHMtPm9wID09IEVYVDRfTUJfSElTVE9SWV9BTExPQykgewogCQlmbXQgPSAiJS01dSAlLTh1ICUtMjNzICUtMjNzICUtMjNzICUtNXUgJS01dSAlLTJ1ICIKIAkJCSIlLTV1ICUtNXMgJS01dSAlLTZ1XG4iOwotCQlzcHJpbnRmKGJ1ZjIsICIlbHUvJWQvJXVAJXUiLCBocy0+cmVzdWx0LmZlX2dyb3VwLAorCQlzcHJpbnRmKGJ1ZjIsICIldS8lZC8ldUAldSIsIGhzLT5yZXN1bHQuZmVfZ3JvdXAsCiAJCQlocy0+cmVzdWx0LmZlX3N0YXJ0LCBocy0+cmVzdWx0LmZlX2xlbiwKIAkJCWhzLT5yZXN1bHQuZmVfbG9naWNhbCk7Ci0JCXNwcmludGYoYnVmLCAiJWx1LyVkLyV1QCV1IiwgaHMtPm9yaWcuZmVfZ3JvdXAsCisJCXNwcmludGYoYnVmLCAiJXUvJWQvJXVAJXUiLCBocy0+b3JpZy5mZV9ncm91cCwKIAkJCWhzLT5vcmlnLmZlX3N0YXJ0LCBocy0+b3JpZy5mZV9sZW4sCiAJCQlocy0+b3JpZy5mZV9sb2dpY2FsKTsKLQkJc3ByaW50ZihidWYzLCAiJWx1LyVkLyV1QCV1IiwgaHMtPmdvYWwuZmVfZ3JvdXAsCisJCXNwcmludGYoYnVmMywgIiV1LyVkLyV1QCV1IiwgaHMtPmdvYWwuZmVfZ3JvdXAsCiAJCQlocy0+Z29hbC5mZV9zdGFydCwgaHMtPmdvYWwuZmVfbGVuLAogCQkJaHMtPmdvYWwuZmVfbG9naWNhbCk7CiAJCXNlcV9wcmludGYoc2VxLCBmbXQsIGhzLT5waWQsIGhzLT5pbm8sIGJ1ZiwgYnVmMywgYnVmMiwKQEAgLTE5NDcsMjAgKzIxOTAsMjAgQEAKIAkJCQlocy0+YnVkZHkgPyAxIDw8IGhzLT5idWRkeSA6IDApOwogCX0gZWxzZSBpZiAoaHMtPm9wID09IEVYVDRfTUJfSElTVE9SWV9QUkVBTExPQykgewogCQlmbXQgPSAiJS01dSAlLTh1ICUtMjNzICUtMjNzICUtMjNzXG4iOwotCQlzcHJpbnRmKGJ1ZjIsICIlbHUvJWQvJXVAJXUiLCBocy0+cmVzdWx0LmZlX2dyb3VwLAorCQlzcHJpbnRmKGJ1ZjIsICIldS8lZC8ldUAldSIsIGhzLT5yZXN1bHQuZmVfZ3JvdXAsCiAJCQlocy0+cmVzdWx0LmZlX3N0YXJ0LCBocy0+cmVzdWx0LmZlX2xlbiwKIAkJCWhzLT5yZXN1bHQuZmVfbG9naWNhbCk7Ci0JCXNwcmludGYoYnVmLCAiJWx1LyVkLyV1QCV1IiwgaHMtPm9yaWcuZmVfZ3JvdXAsCisJCXNwcmludGYoYnVmLCAiJXUvJWQvJXVAJXUiLCBocy0+b3JpZy5mZV9ncm91cCwKIAkJCWhzLT5vcmlnLmZlX3N0YXJ0LCBocy0+b3JpZy5mZV9sZW4sCiAJCQlocy0+b3JpZy5mZV9sb2dpY2FsKTsKIAkJc2VxX3ByaW50ZihzZXEsIGZtdCwgaHMtPnBpZCwgaHMtPmlubywgYnVmLCAiIiwgYnVmMik7CiAJfSBlbHNlIGlmIChocy0+b3AgPT0gRVhUNF9NQl9ISVNUT1JZX0RJU0NBUkQpIHsKLQkJc3ByaW50ZihidWYyLCAiJWx1LyVkLyV1IiwgaHMtPnJlc3VsdC5mZV9ncm91cCwKKwkJc3ByaW50ZihidWYyLCAiJXUvJWQvJXUiLCBocy0+cmVzdWx0LmZlX2dyb3VwLAogCQkJaHMtPnJlc3VsdC5mZV9zdGFydCwgaHMtPnJlc3VsdC5mZV9sZW4pOwogCQlzZXFfcHJpbnRmKHNlcSwgIiUtNXUgJS04dSAlLTIzcyBkaXNjYXJkXG4iLAogCQkJCWhzLT5waWQsIGhzLT5pbm8sIGJ1ZjIpOwogCX0gZWxzZSBpZiAoaHMtPm9wID09IEVYVDRfTUJfSElTVE9SWV9GUkVFKSB7Ci0JCXNwcmludGYoYnVmMiwgIiVsdS8lZC8ldSIsIGhzLT5yZXN1bHQuZmVfZ3JvdXAsCisJCXNwcmludGYoYnVmMiwgIiV1LyVkLyV1IiwgaHMtPnJlc3VsdC5mZV9ncm91cCwKIAkJCWhzLT5yZXN1bHQuZmVfc3RhcnQsIGhzLT5yZXN1bHQuZmVfbGVuKTsKIAkJc2VxX3ByaW50ZihzZXEsICIlLTV1ICUtOHUgJS0yM3MgZnJlZVxuIiwKIAkJCQlocy0+cGlkLCBocy0+aW5vLCBidWYyKTsKQEAgLTIwNzMsNyArMjMxNiw3IEBACiAJCXJldHVybiBOVUxMOwogCiAJZ3JvdXAgPSAqcG9zICsgMTsKLQlyZXR1cm4gKHZvaWQgKikgZ3JvdXA7CisJcmV0dXJuICh2b2lkICopICgodW5zaWduZWQgbG9uZykgZ3JvdXApOwogfQogCiBzdGF0aWMgdm9pZCAqZXh0NF9tYl9zZXFfZ3JvdXBzX25leHQoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYsIGxvZmZfdCAqcG9zKQpAQCAtMjA4NiwxMyArMjMyOSwxMyBAQAogCWlmICgqcG9zIDwgMCB8fCAqcG9zID49IHNiaS0+c19ncm91cHNfY291bnQpCiAJCXJldHVybiBOVUxMOwogCWdyb3VwID0gKnBvcyArIDE7Ci0JcmV0dXJuICh2b2lkICopIGdyb3VwOzsKKwlyZXR1cm4gKHZvaWQgKikgKCh1bnNpZ25lZCBsb25nKSBncm91cCk7CiB9CiAKIHN0YXRpYyBpbnQgZXh0NF9tYl9zZXFfZ3JvdXBzX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCiB7CiAJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IHNlcS0+cHJpdmF0ZTsKLQlsb25nIGdyb3VwID0gKGxvbmcpIHY7CisJZXh0NF9ncm91cF90IGdyb3VwID0gKGV4dDRfZ3JvdXBfdCkgKCh1bnNpZ25lZCBsb25nKSB2KTsKIAlpbnQgaTsKIAlpbnQgZXJyOwogCXN0cnVjdCBleHQ0X2J1ZGR5IGU0YjsKQEAgLTIxMTQsNyArMjM1Nyw3IEBACiAJCXNpemVvZihzdHJ1Y3QgZXh0NF9ncm91cF9pbmZvKTsKIAllcnIgPSBleHQ0X21iX2xvYWRfYnVkZHkoc2IsIGdyb3VwLCAmZTRiKTsKIAlpZiAoZXJyKSB7Ci0JCXNlcV9wcmludGYoc2VxLCAiIyUtNWx1OiBJL08gZXJyb3JcbiIsIGdyb3VwKTsKKwkJc2VxX3ByaW50ZihzZXEsICIjJS01dTogSS9PIGVycm9yXG4iLCBncm91cCk7CiAJCXJldHVybiAwOwogCX0KIAlleHQ0X2xvY2tfZ3JvdXAoc2IsIGdyb3VwKTsKQEAgLTIxMjIsNyArMjM2NSw3IEBACiAJZXh0NF91bmxvY2tfZ3JvdXAoc2IsIGdyb3VwKTsKIAlleHQ0X21iX3JlbGVhc2VfZGVzYygmZTRiKTsKIAotCXNlcV9wcmludGYoc2VxLCAiIyUtNWx1OiAlLTV1ICUtNXUgJS01dSBbIiwgZ3JvdXAsIHNnLmluZm8uYmJfZnJlZSwKKwlzZXFfcHJpbnRmKHNlcSwgIiMlLTV1OiAlLTV1ICUtNXUgJS01dSBbIiwgZ3JvdXAsIHNnLmluZm8uYmJfZnJlZSwKIAkJCXNnLmluZm8uYmJfZnJhZ21lbnRzLCBzZy5pbmZvLmJiX2ZpcnN0X2ZyZWUpOwogCWZvciAoaSA9IDA7IGkgPD0gMTM7IGkrKykKIAkJc2VxX3ByaW50ZihzZXEsICIgJS01dSIsIGkgPD0gc2ItPnNfYmxvY2tzaXplX2JpdHMgKyAxID8KQEAgLTIyOTYsMTAgKzI1MzksMTEgQEAKIAkJCWV4dDRfZnJlZV9ibG9ja3NfYWZ0ZXJfaW5pdChzYiwgZ3JvdXAsIGRlc2MpOwogCX0gZWxzZSB7CiAJCW1ldGFfZ3JvdXBfaW5mb1tpXS0+YmJfZnJlZSA9Ci0JCQlsZTE2X3RvX2NwdShkZXNjLT5iZ19mcmVlX2Jsb2Nrc19jb3VudCk7CisJCQlleHQ0X2ZyZWVfYmxrc19jb3VudChzYiwgZGVzYyk7CiAJfQogCiAJSU5JVF9MSVNUX0hFQUQoJm1ldGFfZ3JvdXBfaW5mb1tpXS0+YmJfcHJlYWxsb2NfbGlzdCk7CisJaW5pdF9yd3NlbSgmbWV0YV9ncm91cF9pbmZvW2ldLT5hbGxvY19zZW0pOwogCW1ldGFfZ3JvdXBfaW5mb1tpXS0+YmJfZnJlZV9yb290LnJiX25vZGUgPSBOVUxMOzsKIAogI2lmZGVmIERPVUJMRV9DSEVDSwpAQCAtMjMyNyw1NCArMjU3MSw2IEBACiB9IC8qIGV4dDRfbWJfYWRkX2dyb3VwaW5mbyAqLwogCiAvKgotICogQWRkIGEgZ3JvdXAgdG8gdGhlIGV4aXN0aW5nIGdyb3Vwcy4KLSAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBmb3Igb25saW5lIHJlc2l6ZQotICovCi1pbnQgZXh0NF9tYl9hZGRfbW9yZV9ncm91cGluZm8oc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgZXh0NF9ncm91cF90IGdyb3VwLAotCQkJICAgICAgIHN0cnVjdCBleHQ0X2dyb3VwX2Rlc2MgKmRlc2MpCi17Ci0Jc3RydWN0IGV4dDRfc2JfaW5mbyAqc2JpID0gRVhUNF9TQihzYik7Ci0Jc3RydWN0IGlub2RlICppbm9kZSA9IHNiaS0+c19idWRkeV9jYWNoZTsKLQlpbnQgYmxvY2tzX3Blcl9wYWdlOwotCWludCBibG9jazsKLQlpbnQgcG51bTsKLQlzdHJ1Y3QgcGFnZSAqcGFnZTsKLQlpbnQgZXJyOwotCi0JLyogQWRkIGdyb3VwIGJhc2VkIG9uIGdyb3VwIGRlc2NyaXB0b3IqLwotCWVyciA9IGV4dDRfbWJfYWRkX2dyb3VwaW5mbyhzYiwgZ3JvdXAsIGRlc2MpOwotCWlmIChlcnIpCi0JCXJldHVybiBlcnI7Ci0KLQkvKgotCSAqIENhY2hlIHBhZ2VzIGNvbnRhaW5pbmcgZHluYW1pYyBtYl9hbGxvYyBkYXRhcyAoYnVkZHkgYW5kIGJpdG1hcAotCSAqIGRhdGFzKSBhcmUgc2V0IG5vdCB1cCB0byBkYXRlIHNvIHRoYXQgdGhleSB3aWxsIGJlIHJlLWluaXRpbGFpemVkCi0JICogZHVyaW5nIHRoZSBuZXh0IGNhbGwgdG8gZXh0NF9tYl9sb2FkX2J1ZGR5Ci0JICovCi0KLQkvKiBTZXQgYnVkZHkgcGFnZSBhcyBub3QgdXAgdG8gZGF0ZSAqLwotCWJsb2Nrc19wZXJfcGFnZSA9IFBBR0VfQ0FDSEVfU0laRSAvIHNiLT5zX2Jsb2Nrc2l6ZTsKLQlibG9jayA9IGdyb3VwICogMjsKLQlwbnVtID0gYmxvY2sgLyBibG9ja3NfcGVyX3BhZ2U7Ci0JcGFnZSA9IGZpbmRfZ2V0X3BhZ2UoaW5vZGUtPmlfbWFwcGluZywgcG51bSk7Ci0JaWYgKHBhZ2UgIT0gTlVMTCkgewotCQlDbGVhclBhZ2VVcHRvZGF0ZShwYWdlKTsKLQkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOwotCX0KLQotCS8qIFNldCBiaXRtYXAgcGFnZSBhcyBub3QgdXAgdG8gZGF0ZSAqLwotCWJsb2NrKys7Ci0JcG51bSA9IGJsb2NrIC8gYmxvY2tzX3Blcl9wYWdlOwotCXBhZ2UgPSBmaW5kX2dldF9wYWdlKGlub2RlLT5pX21hcHBpbmcsIHBudW0pOwotCWlmIChwYWdlICE9IE5VTEwpIHsKLQkJQ2xlYXJQYWdlVXB0b2RhdGUocGFnZSk7Ci0JCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoKICAqIFVwZGF0ZSBhbiBleGlzdGluZyBncm91cC4KICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBmb3Igb25saW5lIHJlc2l6ZQogICovCkBAIC0yNDU3LDcgKzI2NTMsNyBAQAogCQlkZXNjID0gZXh0NF9nZXRfZ3JvdXBfZGVzYyhzYiwgaSwgTlVMTCk7CiAJCWlmIChkZXNjID09IE5VTEwpIHsKIAkJCXByaW50ayhLRVJOX0VSUgotCQkJCSJFWFQ0LWZzOiBjYW4ndCByZWFkIGRlc2NyaXB0b3IgJWx1XG4iLCBpKTsKKwkJCQkiRVhUNC1mczogY2FuJ3QgcmVhZCBkZXNjcmlwdG9yICV1XG4iLCBpKTsKIAkJCWdvdG8gZXJyX2ZyZWVidWRkeTsKIAkJfQogCQlpZiAoZXh0NF9tYl9hZGRfZ3JvdXBpbmZvKHNiLCBpLCBkZXNjKSAhPSAwKQpAQCAtMjQ5Myw2ICsyNjg5LDggQEAKIAlpZiAoc2JpLT5zX21iX29mZnNldHMgPT0gTlVMTCkgewogCQlyZXR1cm4gLUVOT01FTTsKIAl9CisKKwlpID0gKHNiLT5zX2Jsb2Nrc2l6ZV9iaXRzICsgMikgKiBzaXplb2YodW5zaWduZWQgaW50KTsKIAlzYmktPnNfbWJfbWF4cyA9IGttYWxsb2MoaSwgR0ZQX0tFUk5FTCk7CiAJaWYgKHNiaS0+c19tYl9tYXhzID09IE5VTEwpIHsKIAkJa2ZyZWUoc2JpLT5zX21iX21heHMpOwpAQCAtMjU1MSw3ICsyNzQ5LDggQEAKIAlleHQ0X21iX2luaXRfcGVyX2Rldl9wcm9jKHNiKTsKIAlleHQ0X21iX2hpc3RvcnlfaW5pdChzYik7CiAKLQlzYmktPnNfam91cm5hbC0+al9jb21taXRfY2FsbGJhY2sgPSByZWxlYXNlX2Jsb2Nrc19vbl9jb21taXQ7CisJaWYgKHNiaS0+c19qb3VybmFsKQorCQlzYmktPnNfam91cm5hbC0+al9jb21taXRfY2FsbGJhY2sgPSByZWxlYXNlX2Jsb2Nrc19vbl9jb21taXQ7CiAKIAlwcmludGsoS0VSTl9JTkZPICJFWFQ0LWZzOiBtYmFsbG9jIGVuYWJsZWRcbiIpOwogCXJldHVybiAwOwpAQCAtMjY1Miw3ICsyODUxLDcgQEAKIAlsaXN0X2Zvcl9lYWNoX3NhZmUobCwgbHRtcCwgJnR4bi0+dF9wcml2YXRlX2xpc3QpIHsKIAkJZW50cnkgPSBsaXN0X2VudHJ5KGwsIHN0cnVjdCBleHQ0X2ZyZWVfZGF0YSwgbGlzdCk7CiAKLQkJbWJfZGVidWcoImdvbm5hIGZyZWUgJXUgYmxvY2tzIGluIGdyb3VwICVsdSAoMHglcCk6IiwKKwkJbWJfZGVidWcoImdvbm5hIGZyZWUgJXUgYmxvY2tzIGluIGdyb3VwICV1ICgweCVwKToiLAogCQkJIGVudHJ5LT5jb3VudCwgZW50cnktPmdyb3VwLCBlbnRyeSk7CiAKIAkJZXJyID0gZXh0NF9tYl9sb2FkX2J1ZGR5KHNiLCBlbnRyeS0+Z3JvdXAsICZlNGIpOwpAQCAtMjY3OSw4ICsyODc4LDkgQEAKIAkJZGlzY2FyZF9ibG9jayA9IChleHQ0X2ZzYmxrX3QpIGVudHJ5LT5ncm91cCAqIEVYVDRfQkxPQ0tTX1BFUl9HUk9VUChzYikKIAkJCSsgZW50cnktPnN0YXJ0X2JsawogCQkJKyBsZTMyX3RvX2NwdShFWFQ0X1NCKHNiKS0+c19lcy0+c19maXJzdF9kYXRhX2Jsb2NrKTsKLQkJdHJhY2VfbWFyayhleHQ0X2Rpc2NhcmRfYmxvY2tzLCAiZGV2ICVzIGJsayAlbGx1IGNvdW50ICV1Iiwgc2ItPnNfaWQsCi0JCQkgICAodW5zaWduZWQgbG9uZyBsb25nKSBkaXNjYXJkX2Jsb2NrLCBlbnRyeS0+Y291bnQpOworCQl0cmFjZV9tYXJrKGV4dDRfZGlzY2FyZF9ibG9ja3MsICJkZXYgJXMgYmxrICVsbHUgY291bnQgJXUiLAorCQkJICAgc2ItPnNfaWQsICh1bnNpZ25lZCBsb25nIGxvbmcpIGRpc2NhcmRfYmxvY2ssCisJCQkgICBlbnRyeS0+Y291bnQpOwogCQlzYl9pc3N1ZV9kaXNjYXJkKHNiLCBkaXNjYXJkX2Jsb2NrLCBlbnRyeS0+Y291bnQpOwogCiAJCWttZW1fY2FjaGVfZnJlZShleHQ0X2ZyZWVfZXh0X2NhY2hlcCwgZW50cnkpOwpAQCAtMjc5MSw3ICsyOTkxLDcgQEAKICAqLwogc3RhdGljIG5vaW5saW5lX2Zvcl9zdGFjayBpbnQKIGV4dDRfbWJfbWFya19kaXNrc3BhY2VfdXNlZChzdHJ1Y3QgZXh0NF9hbGxvY2F0aW9uX2NvbnRleHQgKmFjLAotCQkJCWhhbmRsZV90ICpoYW5kbGUsIHVuc2lnbmVkIGxvbmcgcmVzZXJ2X2Jsa3MpCisJCQkJaGFuZGxlX3QgKmhhbmRsZSwgdW5zaWduZWQgaW50IHJlc2Vydl9ibGtzKQogewogCXN0cnVjdCBidWZmZXJfaGVhZCAqYml0bWFwX2JoID0gTlVMTDsKIAlzdHJ1Y3QgZXh0NF9zdXBlcl9ibG9jayAqZXM7CkBAIC0yODI0LDcgKzMwMjQsNyBAQAogCWlmICghZ2RwKQogCQlnb3RvIG91dF9lcnI7CiAKLQlleHQ0X2RlYnVnKCJ1c2luZyBibG9jayBncm91cCAlbHUoJWQpXG4iLCBhYy0+YWNfYl9leC5mZV9ncm91cCwKKwlleHQ0X2RlYnVnKCJ1c2luZyBibG9jayBncm91cCAldSglZClcbiIsIGFjLT5hY19iX2V4LmZlX2dyb3VwLAogCQkJZ2RwLT5iZ19mcmVlX2Jsb2Nrc19jb3VudCk7CiAKIAllcnIgPSBleHQ0X2pvdXJuYWxfZ2V0X3dyaXRlX2FjY2VzcyhoYW5kbGUsIGdkcF9iaCk7CkBAIC0yODQzLDggKzMwNDMsOCBAQAogCSAgICBpbl9yYW5nZShibG9jayArIGxlbiAtIDEsIGV4dDRfaW5vZGVfdGFibGUoc2IsIGdkcCksCiAJCSAgICAgRVhUNF9TQihzYiktPnNfaXRiX3Blcl9ncm91cCkpIHsKIAkJZXh0NF9lcnJvcihzYiwgX19mdW5jX18sCi0JCQkgICAiQWxsb2NhdGluZyBibG9jayBpbiBzeXN0ZW0gem9uZSAtIGJsb2NrID0gJWxsdSIsCi0JCQkgICBibG9jayk7CisJCQkgICAiQWxsb2NhdGluZyBibG9jayAlbGx1IGluIHN5c3RlbSB6b25lIG9mICVkIGdyb3VwXG4iLAorCQkJICAgYmxvY2ssIGFjLT5hY19iX2V4LmZlX2dyb3VwKTsKIAkJLyogRmlsZSBzeXN0ZW0gbW91bnRlZCBub3QgdG8gcGFuaWMgb24gZXJyb3IKIAkJICogRml4IHRoZSBiaXRtYXAgYW5kIHJlcGVhdCB0aGUgYmxvY2sgYWxsb2NhdGlvbgogCQkgKiBXZSBsZWFrIHNvbWUgb2YgdGhlIGJsb2NrcyBoZXJlLgpAQCAtMjg1Miw3ICszMDUyLDcgQEAKIAkJbWJfc2V0X2JpdHMoc2JfYmdsX2xvY2soc2JpLCBhYy0+YWNfYl9leC5mZV9ncm91cCksCiAJCQkJYml0bWFwX2JoLT5iX2RhdGEsIGFjLT5hY19iX2V4LmZlX3N0YXJ0LAogCQkJCWFjLT5hY19iX2V4LmZlX2xlbik7Ci0JCWVyciA9IGV4dDRfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGJpdG1hcF9iaCk7CisJCWVyciA9IGV4dDRfaGFuZGxlX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgTlVMTCwgYml0bWFwX2JoKTsKIAkJaWYgKCFlcnIpCiAJCQllcnIgPSAtRUFHQUlOOwogCQlnb3RvIG91dF9lcnI7CkBAIC0yODY2LDE4ICszMDY2LDE3IEBACiAJCX0KIAl9CiAjZW5kaWYKLQltYl9zZXRfYml0cyhzYl9iZ2xfbG9jayhzYmksIGFjLT5hY19iX2V4LmZlX2dyb3VwKSwgYml0bWFwX2JoLT5iX2RhdGEsCi0JCQkJYWMtPmFjX2JfZXguZmVfc3RhcnQsIGFjLT5hY19iX2V4LmZlX2xlbik7Ci0KIAlzcGluX2xvY2soc2JfYmdsX2xvY2soc2JpLCBhYy0+YWNfYl9leC5mZV9ncm91cCkpOworCW1iX3NldF9iaXRzKE5VTEwsIGJpdG1hcF9iaC0+Yl9kYXRhLAorCQkJCWFjLT5hY19iX2V4LmZlX3N0YXJ0LCBhYy0+YWNfYl9leC5mZV9sZW4pOwogCWlmIChnZHAtPmJnX2ZsYWdzICYgY3B1X3RvX2xlMTYoRVhUNF9CR19CTE9DS19VTklOSVQpKSB7CiAJCWdkcC0+YmdfZmxhZ3MgJj0gY3B1X3RvX2xlMTYofkVYVDRfQkdfQkxPQ0tfVU5JTklUKTsKLQkJZ2RwLT5iZ19mcmVlX2Jsb2Nrc19jb3VudCA9Ci0JCQljcHVfdG9fbGUxNihleHQ0X2ZyZWVfYmxvY2tzX2FmdGVyX2luaXQoc2IsCi0JCQkJCQlhYy0+YWNfYl9leC5mZV9ncm91cCwKLQkJCQkJCWdkcCkpOworCQlleHQ0X2ZyZWVfYmxrc19zZXQoc2IsIGdkcCwKKwkJCQkJZXh0NF9mcmVlX2Jsb2Nrc19hZnRlcl9pbml0KHNiLAorCQkJCQlhYy0+YWNfYl9leC5mZV9ncm91cCwgZ2RwKSk7CiAJfQotCWxlMTZfYWRkX2NwdSgmZ2RwLT5iZ19mcmVlX2Jsb2Nrc19jb3VudCwgLWFjLT5hY19iX2V4LmZlX2xlbik7CisJbGVuID0gZXh0NF9mcmVlX2Jsa3NfY291bnQoc2IsIGdkcCkgLSBhYy0+YWNfYl9leC5mZV9sZW47CisJZXh0NF9mcmVlX2Jsa3Nfc2V0KHNiLCBnZHAsIGxlbik7CiAJZ2RwLT5iZ19jaGVja3N1bSA9IGV4dDRfZ3JvdXBfZGVzY19jc3VtKHNiaSwgYWMtPmFjX2JfZXguZmVfZ3JvdXAsIGdkcCk7CiAJc3Bpbl91bmxvY2soc2JfYmdsX2xvY2soc2JpLCBhYy0+YWNfYl9leC5mZV9ncm91cCkpOwogCXBlcmNwdV9jb3VudGVyX3N1Yigmc2JpLT5zX2ZyZWVibG9ja3NfY291bnRlciwgYWMtPmFjX2JfZXguZmVfbGVuKTsKQEAgLTI4OTksMTAgKzMwOTgsMTAgQEAKIAkJc3Bpbl91bmxvY2soc2JfYmdsX2xvY2soc2JpLCBmbGV4X2dyb3VwKSk7CiAJfQogCi0JZXJyID0gZXh0NF9qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgYml0bWFwX2JoKTsKKwllcnIgPSBleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIE5VTEwsIGJpdG1hcF9iaCk7CiAJaWYgKGVycikKIAkJZ290byBvdXRfZXJyOwotCWVyciA9IGV4dDRfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGdkcF9iaCk7CisJZXJyID0gZXh0NF9oYW5kbGVfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBOVUxMLCBnZHBfYmgpOwogCiBvdXRfZXJyOgogCXNiLT5zX2RpcnQgPSAxOwpAQCAtMzAzMSw3ICszMjMwLDcgQEAKIAkvKiBjaGVjayB3ZSBkb24ndCBjcm9zcyBhbHJlYWR5IHByZWFsbG9jYXRlZCBibG9ja3MgKi8KIAlyY3VfcmVhZF9sb2NrKCk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UocGEsICZlaS0+aV9wcmVhbGxvY19saXN0LCBwYV9pbm9kZV9saXN0KSB7Ci0JCXVuc2lnbmVkIGxvbmcgcGFfZW5kOworCQlleHQ0X2xibGtfdCBwYV9lbmQ7CiAKIAkJaWYgKHBhLT5wYV9kZWxldGVkKQogCQkJY29udGludWU7CkBAIC0zMDc1LDcgKzMyNzQsNyBAQAogCS8qIFhYWDogZXh0cmEgbG9vcCB0byBjaGVjayB3ZSByZWFsbHkgZG9uJ3Qgb3ZlcmxhcCBwcmVhbGxvY2F0aW9ucyAqLwogCXJjdV9yZWFkX2xvY2soKTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShwYSwgJmVpLT5pX3ByZWFsbG9jX2xpc3QsIHBhX2lub2RlX2xpc3QpIHsKLQkJdW5zaWduZWQgbG9uZyBwYV9lbmQ7CisJCWV4dDRfbGJsa190IHBhX2VuZDsKIAkJc3Bpbl9sb2NrKCZwYS0+cGFfbG9jayk7CiAJCWlmIChwYS0+cGFfZGVsZXRlZCA9PSAwKSB7CiAJCQlwYV9lbmQgPSBwYS0+cGFfbHN0YXJ0ICsgcGEtPnBhX2xlbjsKQEAgLTMzMDcsNiArMzUwNiwzMiBAQAogfQogCiAvKgorICogdGhlIGZ1bmN0aW9uIGdvZXMgdGhyb3VnaCBhbGwgYmxvY2sgZnJlZWQgaW4gdGhlIGdyb3VwCisgKiBidXQgbm90IHlldCBjb21taXR0ZWQgYW5kIG1hcmtzIHRoZW0gdXNlZCBpbiBpbi1jb3JlIGJpdG1hcC4KKyAqIGJ1ZGR5IG11c3QgYmUgZ2VuZXJhdGVkIGZyb20gdGhpcyBiaXRtYXAKKyAqIE5lZWQgdG8gYmUgY2FsbGVkIHdpdGggZXh0NCBncm91cCBsb2NrIChleHQ0X2xvY2tfZ3JvdXApCisgKi8KK3N0YXRpYyB2b2lkIGV4dDRfbWJfZ2VuZXJhdGVfZnJvbV9mcmVlbGlzdChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB2b2lkICpiaXRtYXAsCisJCQkJCQlleHQ0X2dyb3VwX3QgZ3JvdXApCit7CisJc3RydWN0IHJiX25vZGUgKm47CisJc3RydWN0IGV4dDRfZ3JvdXBfaW5mbyAqZ3JwOworCXN0cnVjdCBleHQ0X2ZyZWVfZGF0YSAqZW50cnk7CisKKwlncnAgPSBleHQ0X2dldF9ncm91cF9pbmZvKHNiLCBncm91cCk7CisJbiA9IHJiX2ZpcnN0KCYoZ3JwLT5iYl9mcmVlX3Jvb3QpKTsKKworCXdoaWxlIChuKSB7CisJCWVudHJ5ID0gcmJfZW50cnkobiwgc3RydWN0IGV4dDRfZnJlZV9kYXRhLCBub2RlKTsKKwkJbWJfc2V0X2JpdHMoc2JfYmdsX2xvY2soRVhUNF9TQihzYiksIGdyb3VwKSwKKwkJCQliaXRtYXAsIGVudHJ5LT5zdGFydF9ibGssCisJCQkJZW50cnktPmNvdW50KTsKKwkJbiA9IHJiX25leHQobik7CisJfQorCXJldHVybjsKK30KKworLyoKICAqIHRoZSBmdW5jdGlvbiBnb2VzIHRocm91Z2ggYWxsIHByZWFsbG9jYXRpb24gaW4gdGhpcyBncm91cCBhbmQgbWFya3MgdGhlbQogICogdXNlZCBpbiBpbi1jb3JlIGJpdG1hcC4gYnVkZHkgbXVzdCBiZSBnZW5lcmF0ZWQgZnJvbSB0aGlzIGJpdG1hcAogICogTmVlZCB0byBiZSBjYWxsZWQgd2l0aCBleHQ0IGdyb3VwIGxvY2sgKGV4dDRfbG9ja19ncm91cCkKQEAgLTMzNDYsNyArMzU3MSw3IEBACiAJCXByZWFsbG9jYXRlZCArPSBsZW47CiAJCWNvdW50Kys7CiAJfQotCW1iX2RlYnVnKCJwcmVsbG9jYXRlZCAldSBmb3IgZ3JvdXAgJWx1XG4iLCBwcmVhbGxvY2F0ZWQsIGdyb3VwKTsKKwltYl9kZWJ1ZygicHJlbGxvY2F0ZWQgJXUgZm9yIGdyb3VwICV1XG4iLCBwcmVhbGxvY2F0ZWQsIGdyb3VwKTsKIH0KIAogc3RhdGljIHZvaWQgZXh0NF9tYl9wYV9jYWxsYmFjayhzdHJ1Y3QgcmN1X2hlYWQgKmhlYWQpCkBAIC0zMzYzLDcgKzM1ODgsNyBAQAogc3RhdGljIHZvaWQgZXh0NF9tYl9wdXRfcGEoc3RydWN0IGV4dDRfYWxsb2NhdGlvbl9jb250ZXh0ICphYywKIAkJCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBleHQ0X3ByZWFsbG9jX3NwYWNlICpwYSkKIHsKLQl1bnNpZ25lZCBsb25nIGdycDsKKwlleHQ0X2dyb3VwX3QgZ3JwOwogCiAJaWYgKCFhdG9taWNfZGVjX2FuZF90ZXN0KCZwYS0+cGFfY291bnQpIHx8IHBhLT5wYV9mcmVlICE9IDApCiAJCXJldHVybjsKQEAgLTM0NzMsNiArMzY5OCwxMCBAQAogCiAJbWJfZGVidWcoIm5ldyBpbm9kZSBwYSAlcDogJWxsdS8ldSBmb3IgJXVcbiIsIHBhLAogCQkJcGEtPnBhX3BzdGFydCwgcGEtPnBhX2xlbiwgcGEtPnBhX2xzdGFydCk7CisJdHJhY2VfbWFyayhleHQ0X21iX25ld19pbm9kZV9wYSwKKwkJICAgImRldiAlcyBpbm8gJWx1IHBzdGFydCAlbGx1IGxlbiAldSBsc3RhcnQgJXUiLAorCQkgICBzYi0+c19pZCwgYWMtPmFjX2lub2RlLT5pX2lubywKKwkJICAgcGEtPnBhX3BzdGFydCwgcGEtPnBhX2xlbiwgcGEtPnBhX2xzdGFydCk7CiAKIAlleHQ0X21iX3VzZV9pbm9kZV9wYShhYywgcGEpOwogCWF0b21pY19hZGQocGEtPnBhX2ZyZWUsICZFWFQ0X1NCKHNiKS0+c19tYl9wcmVhbGxvY2F0ZWQpOwpAQCAtMzUzMCw3ICszNzU5LDkgQEAKIAlwYS0+cGFfbGluZWFyID0gMTsKIAogCW1iX2RlYnVnKCJuZXcgZ3JvdXAgcGEgJXA6ICVsbHUvJXUgZm9yICV1XG4iLCBwYSwKLQkJCXBhLT5wYV9wc3RhcnQsIHBhLT5wYV9sZW4sIHBhLT5wYV9sc3RhcnQpOworCQkgcGEtPnBhX3BzdGFydCwgcGEtPnBhX2xlbiwgcGEtPnBhX2xzdGFydCk7CisJdHJhY2VfbWFyayhleHQ0X21iX25ld19ncm91cF9wYSwgImRldiAlcyBwc3RhcnQgJWxsdSBsZW4gJXUgbHN0YXJ0ICV1IiwKKwkJICAgc2ItPnNfaWQsIHBhLT5wYV9wc3RhcnQsIHBhLT5wYV9sZW4sIHBhLT5wYV9sc3RhcnQpOwogCiAJZXh0NF9tYl91c2VfZ3JvdXBfcGEoYWMsIHBhKTsKIAlhdG9taWNfYWRkKHBhLT5wYV9mcmVlLCAmRVhUNF9TQihzYiktPnNfbWJfcHJlYWxsb2NhdGVkKTsKQEAgLTM1NzksMTYgKzM4MTAsMTggQEAKIHsKIAlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gZTRiLT5iZF9zYjsKIAlzdHJ1Y3QgZXh0NF9zYl9pbmZvICpzYmkgPSBFWFQ0X1NCKHNiKTsKLQl1bnNpZ25lZCBsb25nIGVuZDsKLQl1bnNpZ25lZCBsb25nIG5leHQ7CisJdW5zaWduZWQgaW50IGVuZDsKKwl1bnNpZ25lZCBpbnQgbmV4dDsKIAlleHQ0X2dyb3VwX3QgZ3JvdXA7CiAJZXh0NF9ncnBibGtfdCBiaXQ7CisJdW5zaWduZWQgbG9uZyBsb25nIGdycF9ibGtfc3RhcnQ7CiAJc2VjdG9yX3Qgc3RhcnQ7CiAJaW50IGVyciA9IDA7CiAJaW50IGZyZWUgPSAwOwogCiAJQlVHX09OKHBhLT5wYV9kZWxldGVkID09IDApOwogCWV4dDRfZ2V0X2dyb3VwX25vX2FuZF9vZmZzZXQoc2IsIHBhLT5wYV9wc3RhcnQsICZncm91cCwgJmJpdCk7CisJZ3JwX2Jsa19zdGFydCA9IHBhLT5wYV9wc3RhcnQgLSBiaXQ7CiAJQlVHX09OKGdyb3VwICE9IGU0Yi0+YmRfZ3JvdXAgJiYgcGEtPnBhX2xlbiAhPSAwKTsKIAllbmQgPSBiaXQgKyBwYS0+cGFfbGVuOwogCkBAIC0zNjE4LDYgKzM4NTEsMTAgQEAKIAkJCWV4dDRfbWJfc3RvcmVfaGlzdG9yeShhYyk7CiAJCX0KIAorCQl0cmFjZV9tYXJrKGV4dDRfbWJfcmVsZWFzZV9pbm9kZV9wYSwKKwkJCSAgICJkZXYgJXMgaW5vICVsdSBibG9jayAlbGx1IGNvdW50ICV1IiwKKwkJCSAgIHNiLT5zX2lkLCBwYS0+cGFfaW5vZGUtPmlfaW5vLCBncnBfYmxrX3N0YXJ0ICsgYml0LAorCQkJICAgbmV4dCAtIGJpdCk7CiAJCW1iX2ZyZWVfYmxvY2tzKHBhLT5wYV9pbm9kZSwgZTRiLCBiaXQsIG5leHQgLSBiaXQpOwogCQliaXQgPSBuZXh0ICsgMTsKIAl9CkBAIC0zNjI2LDggKzM4NjMsOSBAQAogCQkJcGEsICh1bnNpZ25lZCBsb25nKSBwYS0+cGFfbHN0YXJ0LAogCQkJKHVuc2lnbmVkIGxvbmcpIHBhLT5wYV9wc3RhcnQsCiAJCQkodW5zaWduZWQgbG9uZykgcGEtPnBhX2xlbik7Ci0JCWV4dDRfZXJyb3Ioc2IsIF9fZnVuY19fLCAiZnJlZSAldSwgcGFfZnJlZSAldVxuIiwKLQkJCQkJCWZyZWUsIHBhLT5wYV9mcmVlKTsKKwkJZXh0NF9ncnBfbG9ja2VkX2Vycm9yKHNiLCBncm91cCwKKwkJCQkJX19mdW5jX18sICJmcmVlICV1LCBwYV9mcmVlICV1IiwKKwkJCQkJZnJlZSwgcGEtPnBhX2ZyZWUpOwogCQkvKgogCQkgKiBwYSBpcyBhbHJlYWR5IGRlbGV0ZWQgc28gd2UgdXNlIHRoZSB2YWx1ZSBvYnRhaW5lZAogCQkgKiBmcm9tIHRoZSBiaXRtYXAgYW5kIGNvbnRpbnVlLgpAQCAtMzY1MCw2ICszODg4LDggQEAKIAlpZiAoYWMpCiAJCWFjLT5hY19vcCA9IEVYVDRfTUJfSElTVE9SWV9ESVNDQVJEOwogCisJdHJhY2VfbWFyayhleHQ0X21iX3JlbGVhc2VfZ3JvdXBfcGEsICJkZXYgJXMgcHN0YXJ0ICVsbHUgbGVuICVkIiwKKwkJICAgc2ItPnNfaWQsIHBhLT5wYV9wc3RhcnQsIHBhLT5wYV9sZW4pOwogCUJVR19PTihwYS0+cGFfZGVsZXRlZCA9PSAwKTsKIAlleHQ0X2dldF9ncm91cF9ub19hbmRfb2Zmc2V0KHNiLCBwYS0+cGFfcHN0YXJ0LCAmZ3JvdXAsICZiaXQpOwogCUJVR19PTihncm91cCAhPSBlNGItPmJkX2dyb3VwICYmIHBhLT5wYV9sZW4gIT0gMCk7CkBAIC0zNjkyLDcgKzM5MzIsNyBAQAogCWludCBidXN5ID0gMDsKIAlpbnQgZnJlZSA9IDA7CiAKLQltYl9kZWJ1ZygiZGlzY2FyZCBwcmVhbGxvY2F0aW9uIGZvciBncm91cCAlbHVcbiIsIGdyb3VwKTsKKwltYl9kZWJ1ZygiZGlzY2FyZCBwcmVhbGxvY2F0aW9uIGZvciBncm91cCAldVxuIiwgZ3JvdXApOwogCiAJaWYgKGxpc3RfZW1wdHkoJmdycC0+YmJfcHJlYWxsb2NfbGlzdCkpCiAJCXJldHVybiAwOwpAQCAtMzcwMCwxNCArMzk0MCwxNCBAQAogCWJpdG1hcF9iaCA9IGV4dDRfcmVhZF9ibG9ja19iaXRtYXAoc2IsIGdyb3VwKTsKIAlpZiAoYml0bWFwX2JoID09IE5VTEwpIHsKIAkJZXh0NF9lcnJvcihzYiwgX19mdW5jX18sICJFcnJvciBpbiByZWFkaW5nIGJsb2NrICIKLQkJCQkiYml0bWFwIGZvciAlbHVcbiIsIGdyb3VwKTsKKwkJCQkiYml0bWFwIGZvciAldSIsIGdyb3VwKTsKIAkJcmV0dXJuIDA7CiAJfQogCiAJZXJyID0gZXh0NF9tYl9sb2FkX2J1ZGR5KHNiLCBncm91cCwgJmU0Yik7CiAJaWYgKGVycikgewogCQlleHQ0X2Vycm9yKHNiLCBfX2Z1bmNfXywgIkVycm9yIGluIGxvYWRpbmcgYnVkZHkgIgotCQkJCSJpbmZvcm1hdGlvbiBmb3IgJWx1XG4iLCBncm91cCk7CisJCQkJImluZm9ybWF0aW9uIGZvciAldSIsIGdyb3VwKTsKIAkJcHV0X2JoKGJpdG1hcF9iaCk7CiAJCXJldHVybiAwOwogCX0KQEAgLTM4MTUsNiArNDA1NSw4IEBACiAJfQogCiAJbWJfZGVidWcoImRpc2NhcmQgcHJlYWxsb2NhdGlvbiBmb3IgaW5vZGUgJWx1XG4iLCBpbm9kZS0+aV9pbm8pOworCXRyYWNlX21hcmsoZXh0NF9kaXNjYXJkX3ByZWFsbG9jYXRpb25zLCAiZGV2ICVzIGlubyAlbHUiLCBzYi0+c19pZCwKKwkJICAgaW5vZGUtPmlfaW5vKTsKIAogCUlOSVRfTElTVF9IRUFEKCZsaXN0KTsKIApAQCAtMzg3NCwxNCArNDExNiwxNCBAQAogCQllcnIgPSBleHQ0X21iX2xvYWRfYnVkZHkoc2IsIGdyb3VwLCAmZTRiKTsKIAkJaWYgKGVycikgewogCQkJZXh0NF9lcnJvcihzYiwgX19mdW5jX18sICJFcnJvciBpbiBsb2FkaW5nIGJ1ZGR5ICIKLQkJCQkJImluZm9ybWF0aW9uIGZvciAlbHVcbiIsIGdyb3VwKTsKKwkJCQkJImluZm9ybWF0aW9uIGZvciAldSIsIGdyb3VwKTsKIAkJCWNvbnRpbnVlOwogCQl9CiAKIAkJYml0bWFwX2JoID0gZXh0NF9yZWFkX2Jsb2NrX2JpdG1hcChzYiwgZ3JvdXApOwogCQlpZiAoYml0bWFwX2JoID09IE5VTEwpIHsKIAkJCWV4dDRfZXJyb3Ioc2IsIF9fZnVuY19fLCAiRXJyb3IgaW4gcmVhZGluZyBibG9jayAiCi0JCQkJCSJiaXRtYXAgZm9yICVsdVxuIiwgZ3JvdXApOworCQkJCQkiYml0bWFwIGZvciAldSIsIGdyb3VwKTsKIAkJCWV4dDRfbWJfcmVsZWFzZV9kZXNjKCZlNGIpOwogCQkJY29udGludWU7CiAJCX0KQEAgLTQwMjQsOCArNDI2Niw4IEBACiAJc3RydWN0IGV4dDRfc2JfaW5mbyAqc2JpID0gRVhUNF9TQihzYik7CiAJc3RydWN0IGV4dDRfc3VwZXJfYmxvY2sgKmVzID0gc2JpLT5zX2VzOwogCWV4dDRfZ3JvdXBfdCBncm91cDsKLQl1bnNpZ25lZCBsb25nIGxlbjsKLQl1bnNpZ25lZCBsb25nIGdvYWw7CisJdW5zaWduZWQgaW50IGxlbjsKKwlleHQ0X2ZzYmxrX3QgZ29hbDsKIAlleHQ0X2dycGJsa190IGJsb2NrOwogCiAJLyogd2UgY2FuJ3QgYWxsb2NhdGUgPiBncm91cCBzaXplICovCkBAIC00MDY4LDYgKzQzMTAsNyBAQAogCWFjLT5hY19wYSA9IE5VTEw7CiAJYWMtPmFjX2JpdG1hcF9wYWdlID0gTlVMTDsKIAlhYy0+YWNfYnVkZHlfcGFnZSA9IE5VTEw7CisJYWMtPmFsbG9jX3NlbXAgPSBOVUxMOwogCWFjLT5hY19sZyA9IE5VTEw7CiAKIAkvKiB3ZSBoYXZlIHRvIGRlZmluZSBjb250ZXh0OiB3ZSdsbCB3ZSB3b3JrIHdpdGggYSBmaWxlIG9yCkBAIC00MTQ2LDcgKzQzODksNyBAQAogCQlleHQ0X2dldF9ncm91cF9ub19hbmRfb2Zmc2V0KHNiLCBwYS0+cGFfcHN0YXJ0LCAmZ3JvdXAsIE5VTEwpOwogCQlpZiAoZXh0NF9tYl9sb2FkX2J1ZGR5KHNiLCBncm91cCwgJmU0YikpIHsKIAkJCWV4dDRfZXJyb3Ioc2IsIF9fZnVuY19fLCAiRXJyb3IgaW4gbG9hZGluZyBidWRkeSAiCi0JCQkJCSJpbmZvcm1hdGlvbiBmb3IgJWx1XG4iLCBncm91cCk7CisJCQkJCSJpbmZvcm1hdGlvbiBmb3IgJXUiLCBncm91cCk7CiAJCQljb250aW51ZTsKIAkJfQogCQlleHQ0X2xvY2tfZ3JvdXAoc2IsIGdyb3VwKTsKQEAgLTQyNDgsNiArNDQ5MSw4IEBACiAJCX0KIAkJZXh0NF9tYl9wdXRfcGEoYWMsIGFjLT5hY19zYiwgcGEpOwogCX0KKwlpZiAoYWMtPmFsbG9jX3NlbXApCisJCXVwX3JlYWQoYWMtPmFsbG9jX3NlbXApOwogCWlmIChhYy0+YWNfYml0bWFwX3BhZ2UpCiAJCXBhZ2VfY2FjaGVfcmVsZWFzZShhYy0+YWNfYml0bWFwX3BhZ2UpOwogCWlmIChhYy0+YWNfYnVkZHlfcGFnZSkKQEAgLTQyNjQsNiArNDUwOSw4IEBACiAJaW50IHJldDsKIAlpbnQgZnJlZWQgPSAwOwogCisJdHJhY2VfbWFyayhleHQ0X21iX2Rpc2NhcmRfcHJlYWxsb2NhdGlvbnMsICJkZXYgJXMgbmVlZGVkICVkIiwKKwkJICAgc2ItPnNfaWQsIG5lZWRlZCk7CiAJZm9yIChpID0gMDsgaSA8IEVYVDRfU0Ioc2IpLT5zX2dyb3Vwc19jb3VudCAmJiBuZWVkZWQgPiAwOyBpKyspIHsKIAkJcmV0ID0gZXh0NF9tYl9kaXNjYXJkX2dyb3VwX3ByZWFsbG9jYXRpb25zKHNiLCBpLCBuZWVkZWQpOwogCQlmcmVlZCArPSByZXQ7CkBAIC00Mjg2LDEyICs0NTMzLDI0IEBACiAJc3RydWN0IGV4dDRfc2JfaW5mbyAqc2JpOwogCXN0cnVjdCBzdXBlcl9ibG9jayAqc2I7CiAJZXh0NF9mc2Jsa190IGJsb2NrID0gMDsKLQl1bnNpZ25lZCBsb25nIGlucXVvdGE7Ci0JdW5zaWduZWQgbG9uZyByZXNlcnZfYmxrcyA9IDA7CisJdW5zaWduZWQgaW50IGlucXVvdGE7CisJdW5zaWduZWQgaW50IHJlc2Vydl9ibGtzID0gMDsKIAogCXNiID0gYXItPmlub2RlLT5pX3NiOwogCXNiaSA9IEVYVDRfU0Ioc2IpOwogCisJdHJhY2VfbWFyayhleHQ0X3JlcXVlc3RfYmxvY2tzLCAiZGV2ICVzIGZsYWdzICV1IGxlbiAldSBpbm8gJWx1ICIKKwkJICAgImxibGsgJWxsdSBnb2FsICVsbHUgbGxlZnQgJWxsdSBscmlnaHQgJWxsdSAiCisJCSAgICJwbGVmdCAlbGx1IHByaWdodCAlbGx1ICIsCisJCSAgIHNiLT5zX2lkLCBhci0+ZmxhZ3MsIGFyLT5sZW4sCisJCSAgIGFyLT5pbm9kZSA/IGFyLT5pbm9kZS0+aV9pbm8gOiAwLAorCQkgICAodW5zaWduZWQgbG9uZyBsb25nKSBhci0+bG9naWNhbCwKKwkJICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgYXItPmdvYWwsCisJCSAgICh1bnNpZ25lZCBsb25nIGxvbmcpIGFyLT5sbGVmdCwKKwkJICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgYXItPmxyaWdodCwKKwkJICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgYXItPnBsZWZ0LAorCQkgICAodW5zaWduZWQgbG9uZyBsb25nKSBhci0+cHJpZ2h0KTsKKwogCWlmICghRVhUNF9JKGFyLT5pbm9kZSktPmlfZGVsYWxsb2NfcmVzZXJ2ZWRfZmxhZykgewogCQkvKgogCQkgKiBXaXRoIGRlbGFsbG9jIHdlIGFscmVhZHkgcmVzZXJ2ZWQgdGhlIGJsb2NrcwpAQCAtNDMxMyw3ICs0NTcyLDcgQEAKIAl9CiAJaWYgKGFyLT5sZW4gPT0gMCkgewogCQkqZXJycCA9IC1FRFFVT1Q7Ci0JCXJldHVybiAwOworCQlnb3RvIG91dDM7CiAJfQogCWlucXVvdGEgPSBhci0+bGVuOwogCkBAIC00MzQ4LDEwICs0NjA3LDE0IEBACiAJCQkJYWMtPmFjX29fZXguZmVfbGVuIDwgYWMtPmFjX2JfZXguZmVfbGVuKQogCQkJZXh0NF9tYl9uZXdfcHJlYWxsb2NhdGlvbihhYyk7CiAJfQotCiAJaWYgKGxpa2VseShhYy0+YWNfc3RhdHVzID09IEFDX1NUQVRVU19GT1VORCkpIHsKIAkJKmVycnAgPSBleHQ0X21iX21hcmtfZGlza3NwYWNlX3VzZWQoYWMsIGhhbmRsZSwgcmVzZXJ2X2Jsa3MpOwogCQlpZiAoKmVycnAgPT0gIC1FQUdBSU4pIHsKKwkJCS8qCisJCQkgKiBkcm9wIHRoZSByZWZlcmVuY2UgdGhhdCB3ZSB0b29rCisJCQkgKiBpbiBleHQ0X21iX3VzZV9iZXN0X2ZvdW5kCisJCQkgKi8KKwkJCWV4dDRfbWJfcmVsZWFzZV9jb250ZXh0KGFjKTsKIAkJCWFjLT5hY19iX2V4LmZlX2dyb3VwID0gMDsKIAkJCWFjLT5hY19iX2V4LmZlX3N0YXJ0ID0gMDsKIAkJCWFjLT5hY19iX2V4LmZlX2xlbiA9IDA7CkBAIC00MzgyLDYgKzQ2NDUsMjYgQEAKIG91dDE6CiAJaWYgKGFyLT5sZW4gPCBpbnF1b3RhKQogCQlEUVVPVF9GUkVFX0JMT0NLKGFyLT5pbm9kZSwgaW5xdW90YSAtIGFyLT5sZW4pOworb3V0MzoKKwlpZiAoIWFyLT5sZW4pIHsKKwkJaWYgKCFFWFQ0X0koYXItPmlub2RlKS0+aV9kZWxhbGxvY19yZXNlcnZlZF9mbGFnKQorCQkJLyogcmVsZWFzZSBhbGwgdGhlIHJlc2VydmVkIGJsb2NrcyBpZiBub24gZGVsYWxsb2MgKi8KKwkJCXBlcmNwdV9jb3VudGVyX3N1Yigmc2JpLT5zX2RpcnR5YmxvY2tzX2NvdW50ZXIsCisJCQkJCQlyZXNlcnZfYmxrcyk7CisJfQorCisJdHJhY2VfbWFyayhleHQ0X2FsbG9jYXRlX2Jsb2NrcywKKwkJICAgImRldiAlcyBibG9jayAlbGx1IGZsYWdzICV1IGxlbiAldSBpbm8gJWx1ICIKKwkJICAgImxvZ2ljYWwgJWxsdSBnb2FsICVsbHUgbGxlZnQgJWxsdSBscmlnaHQgJWxsdSAiCisJCSAgICJwbGVmdCAlbGx1IHByaWdodCAlbGx1ICIsCisJCSAgIHNiLT5zX2lkLCAodW5zaWduZWQgbG9uZyBsb25nKSBibG9jaywKKwkJICAgYXItPmZsYWdzLCBhci0+bGVuLCBhci0+aW5vZGUgPyBhci0+aW5vZGUtPmlfaW5vIDogMCwKKwkJICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgYXItPmxvZ2ljYWwsCisJCSAgICh1bnNpZ25lZCBsb25nIGxvbmcpIGFyLT5nb2FsLAorCQkgICAodW5zaWduZWQgbG9uZyBsb25nKSBhci0+bGxlZnQsCisJCSAgICh1bnNpZ25lZCBsb25nIGxvbmcpIGFyLT5scmlnaHQsCisJCSAgICh1bnNpZ25lZCBsb25nIGxvbmcpIGFyLT5wbGVmdCwKKwkJICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgYXItPnByaWdodCk7CiAKIAlyZXR1cm4gYmxvY2s7CiB9CkBAIC00NDAzLDI3ICs0Njg2LDIzIEBACiAKIHN0YXRpYyBub2lubGluZV9mb3Jfc3RhY2sgaW50CiBleHQ0X21iX2ZyZWVfbWV0YWRhdGEoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGV4dDRfYnVkZHkgKmU0YiwKLQkJCSAgZXh0NF9ncm91cF90IGdyb3VwLCBleHQ0X2dycGJsa190IGJsb2NrLCBpbnQgY291bnQpCisJCSAgICAgIHN0cnVjdCBleHQ0X2ZyZWVfZGF0YSAqbmV3X2VudHJ5KQogeworCWV4dDRfZ3JwYmxrX3QgYmxvY2s7CisJc3RydWN0IGV4dDRfZnJlZV9kYXRhICplbnRyeTsKIAlzdHJ1Y3QgZXh0NF9ncm91cF9pbmZvICpkYiA9IGU0Yi0+YmRfaW5mbzsKIAlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gZTRiLT5iZF9zYjsKIAlzdHJ1Y3QgZXh0NF9zYl9pbmZvICpzYmkgPSBFWFQ0X1NCKHNiKTsKLQlzdHJ1Y3QgZXh0NF9mcmVlX2RhdGEgKmVudHJ5LCAqbmV3X2VudHJ5OwogCXN0cnVjdCByYl9ub2RlICoqbiA9ICZkYi0+YmJfZnJlZV9yb290LnJiX25vZGUsICpub2RlOwogCXN0cnVjdCByYl9ub2RlICpwYXJlbnQgPSBOVUxMLCAqbmV3X25vZGU7CiAKLQorCUJVR19PTighZXh0NF9oYW5kbGVfdmFsaWQoaGFuZGxlKSk7CiAJQlVHX09OKGU0Yi0+YmRfYml0bWFwX3BhZ2UgPT0gTlVMTCk7CiAJQlVHX09OKGU0Yi0+YmRfYnVkZHlfcGFnZSA9PSBOVUxMKTsKIAotCW5ld19lbnRyeSAgPSBrbWVtX2NhY2hlX2FsbG9jKGV4dDRfZnJlZV9leHRfY2FjaGVwLCBHRlBfTk9GUyk7Ci0JbmV3X2VudHJ5LT5zdGFydF9ibGsgPSBibG9jazsKLQluZXdfZW50cnktPmdyb3VwICA9IGdyb3VwOwotCW5ld19lbnRyeS0+Y291bnQgPSBjb3VudDsKLQluZXdfZW50cnktPnRfdGlkID0gaGFuZGxlLT5oX3RyYW5zYWN0aW9uLT50X3RpZDsKIAluZXdfbm9kZSA9ICZuZXdfZW50cnktPm5vZGU7CisJYmxvY2sgPSBuZXdfZW50cnktPnN0YXJ0X2JsazsKIAotCWV4dDRfbG9ja19ncm91cChzYiwgZ3JvdXApOwogCWlmICghKm4pIHsKIAkJLyogZmlyc3QgZnJlZSBibG9jayBleGVudC4gV2UgbmVlZCB0bwogCQkgICBwcm90ZWN0IGJ1ZGR5IGNhY2hlIGZyb20gYmVpbmcgZnJlZWQsCkBAIC00NDQxLDEwICs0NzIwLDkgQEAKIAkJZWxzZSBpZiAoYmxvY2sgPj0gKGVudHJ5LT5zdGFydF9ibGsgKyBlbnRyeS0+Y291bnQpKQogCQkJbiA9ICYoKm4pLT5yYl9yaWdodDsKIAkJZWxzZSB7Ci0JCQlleHQ0X3VubG9ja19ncm91cChzYiwgZ3JvdXApOwotCQkJZXh0NF9lcnJvcihzYiwgX19mdW5jX18sCi0JCQkgICAgIkRvdWJsZSBmcmVlIG9mIGJsb2NrcyAlZCAoJWQgJWQpXG4iLAotCQkJICAgIGJsb2NrLCBlbnRyeS0+c3RhcnRfYmxrLCBlbnRyeS0+Y291bnQpOworCQkJZXh0NF9ncnBfbG9ja2VkX2Vycm9yKHNiLCBlNGItPmJkX2dyb3VwLCBfX2Z1bmNfXywKKwkJCQkJIkRvdWJsZSBmcmVlIG9mIGJsb2NrcyAlZCAoJWQgJWQpIiwKKwkJCQkJYmxvY2ssIGVudHJ5LT5zdGFydF9ibGssIGVudHJ5LT5jb3VudCk7CiAJCQlyZXR1cm4gMDsKIAkJfQogCX0KQEAgLTQ0ODMsNyArNDc2MSw2IEBACiAJc3Bpbl9sb2NrKCZzYmktPnNfbWRfbG9jayk7CiAJbGlzdF9hZGQoJm5ld19lbnRyeS0+bGlzdCwgJmhhbmRsZS0+aF90cmFuc2FjdGlvbi0+dF9wcml2YXRlX2xpc3QpOwogCXNwaW5fdW5sb2NrKCZzYmktPnNfbWRfbG9jayk7Ci0JZXh0NF91bmxvY2tfZ3JvdXAoc2IsIGdyb3VwKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNDQ5OSw3ICs0Nzc2LDcgQEAKIAlzdHJ1Y3QgZXh0NF9hbGxvY2F0aW9uX2NvbnRleHQgKmFjID0gTlVMTDsKIAlzdHJ1Y3QgZXh0NF9ncm91cF9kZXNjICpnZHA7CiAJc3RydWN0IGV4dDRfc3VwZXJfYmxvY2sgKmVzOwotCXVuc2lnbmVkIGxvbmcgb3ZlcmZsb3c7CisJdW5zaWduZWQgaW50IG92ZXJmbG93OwogCWV4dDRfZ3JwYmxrX3QgYml0OwogCXN0cnVjdCBidWZmZXJfaGVhZCAqZ2RfYmg7CiAJZXh0NF9ncm91cF90IGJsb2NrX2dyb3VwOwpAQCAtNDUyMiw2ICs0Nzk5LDEwIEBACiAJfQogCiAJZXh0NF9kZWJ1ZygiZnJlZWluZyBibG9jayAlbHVcbiIsIGJsb2NrKTsKKwl0cmFjZV9tYXJrKGV4dDRfZnJlZV9ibG9ja3MsCisJCSAgICJkZXYgJXMgYmxvY2sgJWxsdSBjb3VudCAlbHUgbWV0YWRhdGEgJWQgaW5vICVsdSIsCisJCSAgIHNiLT5zX2lkLCAodW5zaWduZWQgbG9uZyBsb25nKSBibG9jaywgY291bnQsIG1ldGFkYXRhLAorCQkgICBpbm9kZSA/IGlub2RlLT5pX2lubyA6IDApOwogCiAJYWMgPSBrbWVtX2NhY2hlX2FsbG9jKGV4dDRfYWNfY2FjaGVwLCBHRlBfTk9GUyk7CiAJaWYgKGFjKSB7CkBAIC00NTgxLDExICs0ODYyLDYgQEAKIAllcnIgPSBleHQ0X2pvdXJuYWxfZ2V0X3dyaXRlX2FjY2VzcyhoYW5kbGUsIGdkX2JoKTsKIAlpZiAoZXJyKQogCQlnb3RvIGVycm9yX3JldHVybjsKLQotCWVyciA9IGV4dDRfbWJfbG9hZF9idWRkeShzYiwgYmxvY2tfZ3JvdXAsICZlNGIpOwotCWlmIChlcnIpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCiAjaWZkZWYgQUdHUkVTU0lWRV9DSEVDSwogCXsKIAkJaW50IGk7CkBAIC00NTkzLDEzICs0ODY5LDYgQEAKIAkJCUJVR19PTighbWJfdGVzdF9iaXQoYml0ICsgaSwgYml0bWFwX2JoLT5iX2RhdGEpKTsKIAl9CiAjZW5kaWYKLQltYl9jbGVhcl9iaXRzKHNiX2JnbF9sb2NrKHNiaSwgYmxvY2tfZ3JvdXApLCBiaXRtYXBfYmgtPmJfZGF0YSwKLQkJCWJpdCwgY291bnQpOwotCi0JLyogV2UgZGlydGllZCB0aGUgYml0bWFwIGJsb2NrICovCi0JQlVGRkVSX1RSQUNFKGJpdG1hcF9iaCwgImRpcnRpZWQgYml0bWFwIGJsb2NrIik7Ci0JZXJyID0gZXh0NF9qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgYml0bWFwX2JoKTsKLQogCWlmIChhYykgewogCQlhYy0+YWNfYl9leC5mZV9ncm91cCA9IGJsb2NrX2dyb3VwOwogCQlhYy0+YWNfYl9leC5mZV9zdGFydCA9IGJpdDsKQEAgLTQ2MDcsMTkgKzQ4NzYsNDEgQEAKIAkJZXh0NF9tYl9zdG9yZV9oaXN0b3J5KGFjKTsKIAl9CiAKLQlpZiAobWV0YWRhdGEpIHsKLQkJLyogYmxvY2tzIGJlaW5nIGZyZWVkIGFyZSBtZXRhZGF0YS4gdGhlc2UgYmxvY2tzIHNob3VsZG4ndAotCQkgKiBiZSB1c2VkIHVudGlsIHRoaXMgdHJhbnNhY3Rpb24gaXMgY29tbWl0dGVkICovCi0JCWV4dDRfbWJfZnJlZV9tZXRhZGF0YShoYW5kbGUsICZlNGIsIGJsb2NrX2dyb3VwLCBiaXQsIGNvdW50KTsKKwllcnIgPSBleHQ0X21iX2xvYWRfYnVkZHkoc2IsIGJsb2NrX2dyb3VwLCAmZTRiKTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycm9yX3JldHVybjsKKwlpZiAobWV0YWRhdGEgJiYgZXh0NF9oYW5kbGVfdmFsaWQoaGFuZGxlKSkgeworCQlzdHJ1Y3QgZXh0NF9mcmVlX2RhdGEgKm5ld19lbnRyeTsKKwkJLyoKKwkJICogYmxvY2tzIGJlaW5nIGZyZWVkIGFyZSBtZXRhZGF0YS4gdGhlc2UgYmxvY2tzIHNob3VsZG4ndAorCQkgKiBiZSB1c2VkIHVudGlsIHRoaXMgdHJhbnNhY3Rpb24gaXMgY29tbWl0dGVkCisJCSAqLworCQluZXdfZW50cnkgID0ga21lbV9jYWNoZV9hbGxvYyhleHQ0X2ZyZWVfZXh0X2NhY2hlcCwgR0ZQX05PRlMpOworCQluZXdfZW50cnktPnN0YXJ0X2JsayA9IGJpdDsKKwkJbmV3X2VudHJ5LT5ncm91cCAgPSBibG9ja19ncm91cDsKKwkJbmV3X2VudHJ5LT5jb3VudCA9IGNvdW50OworCQluZXdfZW50cnktPnRfdGlkID0gaGFuZGxlLT5oX3RyYW5zYWN0aW9uLT50X3RpZDsKKwkJZXh0NF9sb2NrX2dyb3VwKHNiLCBibG9ja19ncm91cCk7CisJCW1iX2NsZWFyX2JpdHMoc2JfYmdsX2xvY2soc2JpLCBibG9ja19ncm91cCksIGJpdG1hcF9iaC0+Yl9kYXRhLAorCQkJCWJpdCwgY291bnQpOworCQlleHQ0X21iX2ZyZWVfbWV0YWRhdGEoaGFuZGxlLCAmZTRiLCBuZXdfZW50cnkpOworCQlleHQ0X3VubG9ja19ncm91cChzYiwgYmxvY2tfZ3JvdXApOwogCX0gZWxzZSB7CiAJCWV4dDRfbG9ja19ncm91cChzYiwgYmxvY2tfZ3JvdXApOworCQkvKiBuZWVkIHRvIHVwZGF0ZSBncm91cF9pbmZvLT5iYl9mcmVlIGFuZCBiaXRtYXAKKwkJICogd2l0aCBncm91cCBsb2NrIGhlbGQuIGdlbmVyYXRlX2J1ZGR5IGxvb2sgYXQKKwkJICogdGhlbSB3aXRoIGdyb3VwIGxvY2tfaGVsZAorCQkgKi8KKwkJbWJfY2xlYXJfYml0cyhzYl9iZ2xfbG9jayhzYmksIGJsb2NrX2dyb3VwKSwgYml0bWFwX2JoLT5iX2RhdGEsCisJCQkJYml0LCBjb3VudCk7CiAJCW1iX2ZyZWVfYmxvY2tzKGlub2RlLCAmZTRiLCBiaXQsIGNvdW50KTsKIAkJZXh0NF9tYl9yZXR1cm5fdG9fcHJlYWxsb2NhdGlvbihpbm9kZSwgJmU0YiwgYmxvY2ssIGNvdW50KTsKIAkJZXh0NF91bmxvY2tfZ3JvdXAoc2IsIGJsb2NrX2dyb3VwKTsKIAl9CiAKIAlzcGluX2xvY2soc2JfYmdsX2xvY2soc2JpLCBibG9ja19ncm91cCkpOwotCWxlMTZfYWRkX2NwdSgmZ2RwLT5iZ19mcmVlX2Jsb2Nrc19jb3VudCwgY291bnQpOworCXJldCA9IGV4dDRfZnJlZV9ibGtzX2NvdW50KHNiLCBnZHApICsgY291bnQ7CisJZXh0NF9mcmVlX2Jsa3Nfc2V0KHNiLCBnZHAsIHJldCk7CiAJZ2RwLT5iZ19jaGVja3N1bSA9IGV4dDRfZ3JvdXBfZGVzY19jc3VtKHNiaSwgYmxvY2tfZ3JvdXAsIGdkcCk7CiAJc3Bpbl91bmxvY2soc2JfYmdsX2xvY2soc2JpLCBibG9ja19ncm91cCkpOwogCXBlcmNwdV9jb3VudGVyX2FkZCgmc2JpLT5zX2ZyZWVibG9ja3NfY291bnRlciwgY291bnQpOwpAQCAtNDYzNSw5ICs0OTI2LDEzIEBACiAKIAkqZnJlZWQgKz0gY291bnQ7CiAKKwkvKiBXZSBkaXJ0aWVkIHRoZSBiaXRtYXAgYmxvY2sgKi8KKwlCVUZGRVJfVFJBQ0UoYml0bWFwX2JoLCAiZGlydGllZCBiaXRtYXAgYmxvY2siKTsKKwllcnIgPSBleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIE5VTEwsIGJpdG1hcF9iaCk7CisKIAkvKiBBbmQgdGhlIGdyb3VwIGRlc2NyaXB0b3IgYmxvY2sgKi8KIAlCVUZGRVJfVFJBQ0UoZ2RfYmgsICJkaXJ0aWVkIGdyb3VwIGRlc2NyaXB0b3IgYmxvY2siKTsKLQlyZXQgPSBleHQ0X2pvdXJuYWxfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBnZF9iaCk7CisJcmV0ID0gZXh0NF9oYW5kbGVfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBOVUxMLCBnZF9iaCk7CiAJaWYgKCFlcnIpCiAJCWVyciA9IHJldDsKIApkaWZmIC0tZ2l0IGEvZnMvZXh0NC9tYmFsbG9jLmggYi9mcy9leHQ0L21iYWxsb2MuaAppbmRleCBiNWRmZjFmLi4xMGEyOTIxIDEwMDY0NAotLS0gYS9mcy9leHQ0L21iYWxsb2MuaAorKysgYi9mcy9leHQ0L21iYWxsb2MuaApAQCAtMjAsNiArMjAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KICNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KICNpbmNsdWRlIDxsaW51eC9tYXJrZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgImV4dDRfamJkMi5oIgogI2luY2x1ZGUgImV4dDQuaCIKICNpbmNsdWRlICJncm91cC5oIgpAQCAtOTgsOSArOTksNiBAQAogICovCiAjZGVmaW5lIE1CX0RFRkFVTFRfR1JPVVBfUFJFQUxMT0MJNTEyCiAKLXN0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqZXh0NF9wc3BhY2VfY2FjaGVwOwotc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICpleHQ0X2FjX2NhY2hlcDsKLXN0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqZXh0NF9mcmVlX2V4dF9jYWNoZXA7CiAKIHN0cnVjdCBleHQ0X2ZyZWVfZGF0YSB7CiAJLyogdGhpcyBsaW5rcyB0aGUgZnJlZSBibG9jayBpbmZvcm1hdGlvbiBmcm9tIGdyb3VwX2luZm8gKi8KQEAgLTEyMCwyNiArMTE4LDYgQEAKIAl0aWRfdAl0X3RpZDsKIH07CiAKLXN0cnVjdCBleHQ0X2dyb3VwX2luZm8gewotCXVuc2lnbmVkIGxvbmcJYmJfc3RhdGU7Ci0Jc3RydWN0IHJiX3Jvb3QgIGJiX2ZyZWVfcm9vdDsKLQl1bnNpZ25lZCBzaG9ydAliYl9maXJzdF9mcmVlOwotCXVuc2lnbmVkIHNob3J0CWJiX2ZyZWU7Ci0JdW5zaWduZWQgc2hvcnQJYmJfZnJhZ21lbnRzOwotCXN0cnVjdAkJbGlzdF9oZWFkIGJiX3ByZWFsbG9jX2xpc3Q7Ci0jaWZkZWYgRE9VQkxFX0NIRUNLCi0Jdm9pZAkJKmJiX2JpdG1hcDsKLSNlbmRpZgotCXVuc2lnbmVkIHNob3J0CWJiX2NvdW50ZXJzW107Ci19OwotCi0jZGVmaW5lIEVYVDRfR1JPVVBfSU5GT19ORUVEX0lOSVRfQklUCTAKLSNkZWZpbmUgRVhUNF9HUk9VUF9JTkZPX0xPQ0tFRF9CSVQJMQotCi0jZGVmaW5lIEVYVDRfTUJfR1JQX05FRURfSU5JVChncnApCVwKLQkodGVzdF9iaXQoRVhUNF9HUk9VUF9JTkZPX05FRURfSU5JVF9CSVQsICYoKGdycCktPmJiX3N0YXRlKSkpCi0KLQogc3RydWN0IGV4dDRfcHJlYWxsb2Nfc3BhY2UgewogCXN0cnVjdCBsaXN0X2hlYWQJcGFfaW5vZGVfbGlzdDsKIAlzdHJ1Y3QgbGlzdF9oZWFkCXBhX2dyb3VwX2xpc3Q7CkBAIC0yMTcsNiArMTk1LDExIEBACiAJX191OCBhY19vcDsJCS8qIG9wZXJhdGlvbiwgZm9yIGhpc3Rvcnkgb25seSAqLwogCXN0cnVjdCBwYWdlICphY19iaXRtYXBfcGFnZTsKIAlzdHJ1Y3QgcGFnZSAqYWNfYnVkZHlfcGFnZTsKKwkvKgorCSAqIHBvaW50ZXIgdG8gdGhlIGhlbGQgc2VtYXBob3JlIHVwb24gc3VjY2Vzc2Z1bAorCSAqIGJsb2NrIGFsbG9jYXRpb24KKwkgKi8KKwlzdHJ1Y3Qgcndfc2VtYXBob3JlICphbGxvY19zZW1wOwogCXN0cnVjdCBleHQ0X3ByZWFsbG9jX3NwYWNlICphY19wYTsKIAlzdHJ1Y3QgZXh0NF9sb2NhbGl0eV9ncm91cCAqYWNfbGc7CiB9OwpAQCAtMjUwLDYgKzIzMyw3IEBACiAJc3RydWN0IHN1cGVyX2Jsb2NrICpiZF9zYjsKIAlfX3UxNiBiZF9ibGtiaXRzOwogCWV4dDRfZ3JvdXBfdCBiZF9ncm91cDsKKwlzdHJ1Y3Qgcndfc2VtYXBob3JlICphbGxvY19zZW1wOwogfTsKICNkZWZpbmUgRVhUNF9NQl9CSVRNQVAoZTRiKQkoKGU0YiktPmJkX2JpdG1hcCkKICNkZWZpbmUgRVhUNF9NQl9CVUREWShlNGIpCSgoZTRiKS0+YmRfYnVkZHkpCkBAIC0yNTksNTEgKzI0MywxMiBAQAogewogCXJldHVybjsKIH0KLSNlbHNlCi1zdGF0aWMgdm9pZCBleHQ0X21iX3N0b3JlX2hpc3Rvcnkoc3RydWN0IGV4dDRfYWxsb2NhdGlvbl9jb250ZXh0ICphYyk7CiAjZW5kaWYKIAogI2RlZmluZSBpbl9yYW5nZShiLCBmaXJzdCwgbGVuKQkoKGIpID49IChmaXJzdCkgJiYgKGIpIDw9IChmaXJzdCkgKyAobGVuKSAtIDEpCiAKIHN0cnVjdCBidWZmZXJfaGVhZCAqcmVhZF9ibG9ja19iaXRtYXAoc3RydWN0IHN1cGVyX2Jsb2NrICosIGV4dDRfZ3JvdXBfdCk7Ci0KLXN0YXRpYyB2b2lkIGV4dDRfbWJfZ2VuZXJhdGVfZnJvbV9wYShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB2b2lkICpiaXRtYXAsCi0JCQkJCWV4dDRfZ3JvdXBfdCBncm91cCk7Ci1zdGF0aWMgdm9pZCBleHQ0X21iX3JldHVybl90b19wcmVhbGxvY2F0aW9uKHN0cnVjdCBpbm9kZSAqaW5vZGUsCi0JCQkJCXN0cnVjdCBleHQ0X2J1ZGR5ICplNGIsIHNlY3Rvcl90IGJsb2NrLAotCQkJCQlpbnQgY291bnQpOwotc3RhdGljIHZvaWQgZXh0NF9tYl9wdXRfcGEoc3RydWN0IGV4dDRfYWxsb2NhdGlvbl9jb250ZXh0ICosCi0JCQlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgc3RydWN0IGV4dDRfcHJlYWxsb2Nfc3BhY2UgKnBhKTsKLXN0YXRpYyBpbnQgZXh0NF9tYl9pbml0X3Blcl9kZXZfcHJvYyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKTsKLXN0YXRpYyBpbnQgZXh0NF9tYl9kZXN0cm95X3Blcl9kZXZfcHJvYyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKTsKLXN0YXRpYyB2b2lkIHJlbGVhc2VfYmxvY2tzX29uX2NvbW1pdChqb3VybmFsX3QgKmpvdXJuYWwsIHRyYW5zYWN0aW9uX3QgKnR4bik7Ci0KLQotc3RhdGljIGlubGluZSB2b2lkIGV4dDRfbG9ja19ncm91cChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBleHQ0X2dyb3VwX3QgZ3JvdXApCi17Ci0Jc3RydWN0IGV4dDRfZ3JvdXBfaW5mbyAqZ3JpbmZvID0gZXh0NF9nZXRfZ3JvdXBfaW5mbyhzYiwgZ3JvdXApOwotCi0JYml0X3NwaW5fbG9jayhFWFQ0X0dST1VQX0lORk9fTE9DS0VEX0JJVCwgJihncmluZm8tPmJiX3N0YXRlKSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBleHQ0X3VubG9ja19ncm91cChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAotCQkJCQlleHQ0X2dyb3VwX3QgZ3JvdXApCi17Ci0Jc3RydWN0IGV4dDRfZ3JvdXBfaW5mbyAqZ3JpbmZvID0gZXh0NF9nZXRfZ3JvdXBfaW5mbyhzYiwgZ3JvdXApOwotCi0JYml0X3NwaW5fdW5sb2NrKEVYVDRfR1JPVVBfSU5GT19MT0NLRURfQklULCAmKGdyaW5mby0+YmJfc3RhdGUpKTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgZXh0NF9pc19ncm91cF9sb2NrZWQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKLQkJCQkJZXh0NF9ncm91cF90IGdyb3VwKQotewotCXN0cnVjdCBleHQ0X2dyb3VwX2luZm8gKmdyaW5mbyA9IGV4dDRfZ2V0X2dyb3VwX2luZm8oc2IsIGdyb3VwKTsKLQotCXJldHVybiBiaXRfc3Bpbl9pc19sb2NrZWQoRVhUNF9HUk9VUF9JTkZPX0xPQ0tFRF9CSVQsCi0JCQkJCQkmKGdyaW5mby0+YmJfc3RhdGUpKTsKLX0KLQotc3RhdGljIGV4dDRfZnNibGtfdCBleHQ0X2dycF9vZmZzX3RvX2Jsb2NrKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCitzdGF0aWMgaW5saW5lIGV4dDRfZnNibGtfdCBleHQ0X2dycF9vZmZzX3RvX2Jsb2NrKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCiAJCQkJCXN0cnVjdCBleHQ0X2ZyZWVfZXh0ZW50ICpmZXgpCiB7CiAJZXh0NF9mc2Jsa190IGJsb2NrOwpkaWZmIC0tZ2l0IGEvZnMvZXh0NC9taWdyYXRlLmMgYi9mcy9leHQ0L21pZ3JhdGUuYwppbmRleCBmMmE5Y2Y0Li43MzRhYmNhIDEwMDY0NAotLS0gYS9mcy9leHQ0L21pZ3JhdGUuYworKysgYi9mcy9leHQ0L21pZ3JhdGUuYwpAQCAtNTksNyArNTksOCBAQAogCS8qCiAJICogTWFrZSBzdXJlIHRoZSBjcmVkaXQgd2UgYWNjdW1hbGF0ZWQgaXMgbm90IHJlYWxseSBoaWdoCiAJICovCi0JaWYgKG5lZWRlZCAmJiBoYW5kbGUtPmhfYnVmZmVyX2NyZWRpdHMgPj0gRVhUNF9SRVNFUlZFX1RSQU5TX0JMT0NLUykgeworCWlmIChuZWVkZWQgJiYgZXh0NF9oYW5kbGVfaGFzX2Vub3VnaF9jcmVkaXRzKGhhbmRsZSwKKwkJCQkJCUVYVDRfUkVTRVJWRV9UUkFOU19CTE9DS1MpKSB7CiAJCXJldHZhbCA9IGV4dDRfam91cm5hbF9yZXN0YXJ0KGhhbmRsZSwgbmVlZGVkKTsKIAkJaWYgKHJldHZhbCkKIAkJCWdvdG8gZXJyX291dDsKQEAgLTIyOSw3ICsyMzAsNyBAQAogewogCWludCByZXR2YWwgPSAwLCBuZWVkZWQ7CiAKLQlpZiAoaGFuZGxlLT5oX2J1ZmZlcl9jcmVkaXRzID4gRVhUNF9SRVNFUlZFX1RSQU5TX0JMT0NLUykKKwlpZiAoZXh0NF9oYW5kbGVfaGFzX2Vub3VnaF9jcmVkaXRzKGhhbmRsZSwgRVhUNF9SRVNFUlZFX1RSQU5TX0JMT0NLUysxKSkKIAkJcmV0dXJuIDA7CiAJLyoKIAkgKiBXZSBhcmUgZnJlZWluZyBhIGJsb2Nrcy4gRHVyaW5nIHRoaXMgd2UgdG91Y2gKQEAgLTQ1OCwxMyArNDU5LDEzIEBACiAJc3RydWN0IGxpc3RfYmxvY2tzX3N0cnVjdCBsYjsKIAl1bnNpZ25lZCBsb25nIG1heF9lbnRyaWVzOwogCi0JaWYgKCF0ZXN0X29wdChpbm9kZS0+aV9zYiwgRVhURU5UUykpCi0JCS8qCi0JCSAqIGlmIG1vdW50ZWQgd2l0aCBub2V4dGVudHMgd2UgZG9uJ3QgYWxsb3cgdGhlIG1pZ3JhdGUKLQkJICovCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKChFWFQ0X0koaW5vZGUpLT5pX2ZsYWdzICYgRVhUNF9FWFRFTlRTX0ZMKSkKKwkvKgorCSAqIElmIHRoZSBmaWxlc3lzdGVtIGRvZXMgbm90IHN1cHBvcnQgZXh0ZW50cywgb3IgdGhlIGlub2RlCisJICogYWxyZWFkeSBpcyBleHRlbnQtYmFzZWQsIGVycm9yIG91dC4KKwkgKi8KKwlpZiAoIUVYVDRfSEFTX0lOQ09NUEFUX0ZFQVRVUkUoaW5vZGUtPmlfc2IsCisJCQkJICAgICAgIEVYVDRfRkVBVFVSRV9JTkNPTVBBVF9FWFRFTlRTKSB8fAorCSAgICAoRVhUNF9JKGlub2RlKS0+aV9mbGFncyAmIEVYVDRfRVhURU5UU19GTCkpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJaWYgKFNfSVNMTksoaW5vZGUtPmlfbW9kZSkgJiYgaW5vZGUtPmlfYmxvY2tzID09IDApCmRpZmYgLS1naXQgYS9mcy9leHQ0L25hbWVpLmMgYi9mcy9leHQ0L25hbWVpLmMKaW5kZXggOWZkMmE1ZS4uZmVjMGI0YyAxMDA2NDQKLS0tIGEvZnMvZXh0NC9uYW1laS5jCisrKyBiL2ZzL2V4dDQvbmFtZWkuYwpAQCAtNzQsMTAgKzc0LDYgQEAKICNkZWZpbmUgYXNzZXJ0KHRlc3QpIEpfQVNTRVJUKHRlc3QpCiAjZW5kaWYKIAotI2lmbmRlZiBzd2FwCi0jZGVmaW5lIHN3YXAoeCwgeSkgZG8geyB0eXBlb2YoeCkgeiA9IHg7IHggPSB5OyB5ID0gejsgfSB3aGlsZSAoMCkKLSNlbmRpZgotCiAjaWZkZWYgRFhfREVCVUcKICNkZWZpbmUgZHh0cmFjZShjb21tYW5kKSBjb21tYW5kCiAjZWxzZQpAQCAtMzcyLDYgKzM2OCw4IEBACiAJCWdvdG8gZmFpbDsKIAl9CiAJaGluZm8tPmhhc2hfdmVyc2lvbiA9IHJvb3QtPmluZm8uaGFzaF92ZXJzaW9uOworCWlmIChoaW5mby0+aGFzaF92ZXJzaW9uIDw9IERYX0hBU0hfVEVBKQorCQloaW5mby0+aGFzaF92ZXJzaW9uICs9IEVYVDRfU0IoZGlyLT5pX3NiKS0+c19oYXNoX3Vuc2lnbmVkOwogCWhpbmZvLT5zZWVkID0gRVhUNF9TQihkaXItPmlfc2IpLT5zX2hhc2hfc2VlZDsKIAlpZiAoZF9uYW1lKQogCQlleHQ0ZnNfZGlyaGFzaChkX25hbWUtPm5hbWUsIGRfbmFtZS0+bGVuLCBoaW5mbyk7CkBAIC02NDEsNiArNjM5LDkgQEAKIAlkaXIgPSBkaXJfZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZTsKIAlpZiAoIShFWFQ0X0koZGlyKS0+aV9mbGFncyAmIEVYVDRfSU5ERVhfRkwpKSB7CiAJCWhpbmZvLmhhc2hfdmVyc2lvbiA9IEVYVDRfU0IoZGlyLT5pX3NiKS0+c19kZWZfaGFzaF92ZXJzaW9uOworCQlpZiAoaGluZm8uaGFzaF92ZXJzaW9uIDw9IERYX0hBU0hfVEVBKQorCQkJaGluZm8uaGFzaF92ZXJzaW9uICs9CisJCQkJRVhUNF9TQihkaXItPmlfc2IpLT5zX2hhc2hfdW5zaWduZWQ7CiAJCWhpbmZvLnNlZWQgPSBFWFQ0X1NCKGRpci0+aV9zYiktPnNfaGFzaF9zZWVkOwogCQljb3VudCA9IGh0cmVlX2RpcmJsb2NrX3RvX3RyZWUoZGlyX2ZpbGUsIGRpciwgMCwgJmhpbmZvLAogCQkJCQkgICAgICAgc3RhcnRfaGFzaCwgc3RhcnRfbWlub3JfaGFzaCk7CkBAIC04MDYsNyArODA3LDcgQEAKIHN0YXRpYyBpbmxpbmUgaW50IHNlYXJjaF9kaXJibG9jayhzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLAogCQkJCSAgc3RydWN0IGlub2RlICpkaXIsCiAJCQkJICBjb25zdCBzdHJ1Y3QgcXN0ciAqZF9uYW1lLAotCQkJCSAgdW5zaWduZWQgbG9uZyBvZmZzZXQsCisJCQkJICB1bnNpZ25lZCBpbnQgb2Zmc2V0LAogCQkJCSAgc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKiogcmVzX2RpcikKIHsKIAlzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqIGRlOwpAQCAtMTA0MywxMSArMTA0NCwxMSBAQAogCWJoID0gZXh0NF9maW5kX2VudHJ5KGRpciwgJmRlbnRyeS0+ZF9uYW1lLCAmZGUpOwogCWlub2RlID0gTlVMTDsKIAlpZiAoYmgpIHsKLQkJdW5zaWduZWQgbG9uZyBpbm8gPSBsZTMyX3RvX2NwdShkZS0+aW5vZGUpOworCQlfX3UzMiBpbm8gPSBsZTMyX3RvX2NwdShkZS0+aW5vZGUpOwogCQlicmVsc2UoYmgpOwogCQlpZiAoIWV4dDRfdmFsaWRfaW51bShkaXItPmlfc2IsIGlubykpIHsKIAkJCWV4dDRfZXJyb3IoZGlyLT5pX3NiLCAiZXh0NF9sb29rdXAiLAotCQkJCSAgICJiYWQgaW5vZGUgbnVtYmVyOiAlbHUiLCBpbm8pOworCQkJCSAgICJiYWQgaW5vZGUgbnVtYmVyOiAldSIsIGlubyk7CiAJCQlyZXR1cm4gRVJSX1BUUigtRUlPKTsKIAkJfQogCQlpbm9kZSA9IGV4dDRfaWdldChkaXItPmlfc2IsIGlubyk7CkBAIC0xMDYwLDcgKzEwNjEsNyBAQAogCiBzdHJ1Y3QgZGVudHJ5ICpleHQ0X2dldF9wYXJlbnQoc3RydWN0IGRlbnRyeSAqY2hpbGQpCiB7Ci0JdW5zaWduZWQgbG9uZyBpbm87CisJX191MzIgaW5vOwogCXN0cnVjdCBpbm9kZSAqaW5vZGU7CiAJc3RhdGljIGNvbnN0IHN0cnVjdCBxc3RyIGRvdGRvdCA9IHsKIAkJLm5hbWUgPSAiLi4iLApAQCAtMTA3OCw3ICsxMDc5LDcgQEAKIAogCWlmICghZXh0NF92YWxpZF9pbnVtKGNoaWxkLT5kX2lub2RlLT5pX3NiLCBpbm8pKSB7CiAJCWV4dDRfZXJyb3IoY2hpbGQtPmRfaW5vZGUtPmlfc2IsICJleHQ0X2dldF9wYXJlbnQiLAotCQkJICAgImJhZCBpbm9kZSBudW1iZXI6ICVsdSIsIGlubyk7CisJCQkgICAiYmFkIGlub2RlIG51bWJlcjogJXUiLCBpbm8pOwogCQlyZXR1cm4gRVJSX1BUUigtRUlPKTsKIAl9CiAKQEAgLTExNjYsOSArMTE2Nyw5IEBACiAJdTMyIGhhc2gyOwogCXN0cnVjdCBkeF9tYXBfZW50cnkgKm1hcDsKIAljaGFyICpkYXRhMSA9ICgqYmgpLT5iX2RhdGEsICpkYXRhMjsKLQl1bnNpZ25lZCBzcGxpdCwgbW92ZSwgc2l6ZSwgaTsKKwl1bnNpZ25lZCBzcGxpdCwgbW92ZSwgc2l6ZTsKIAlzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqZGUgPSBOVUxMLCAqZGUyOwotCWludAllcnIgPSAwOworCWludAllcnIgPSAwLCBpOwogCiAJYmgyID0gZXh0NF9hcHBlbmQgKGhhbmRsZSwgZGlyLCAmbmV3YmxvY2ssICZlcnIpOwogCWlmICghKGJoMikpIHsKQEAgLTEyMjgsMTAgKzEyMjksMTAgQEAKIAkJZGUgPSBkZTI7CiAJfQogCWR4X2luc2VydF9ibG9jayhmcmFtZSwgaGFzaDIgKyBjb250aW51ZWQsIG5ld2Jsb2NrKTsKLQllcnIgPSBleHQ0X2pvdXJuYWxfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBiaDIpOworCWVyciA9IGV4dDRfaGFuZGxlX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgZGlyLCBiaDIpOwogCWlmIChlcnIpCiAJCWdvdG8gam91cm5hbF9lcnJvcjsKLQllcnIgPSBleHQ0X2pvdXJuYWxfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBmcmFtZS0+YmgpOworCWVyciA9IGV4dDRfaGFuZGxlX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgZGlyLCBmcmFtZS0+YmgpOwogCWlmIChlcnIpCiAJCWdvdG8gam91cm5hbF9lcnJvcjsKIAlicmVsc2UoYmgyKTsKQEAgLTEyNjYsNyArMTI2Nyw3IEBACiAJc3RydWN0IGlub2RlCSpkaXIgPSBkZW50cnktPmRfcGFyZW50LT5kX2lub2RlOwogCWNvbnN0IGNoYXIJKm5hbWUgPSBkZW50cnktPmRfbmFtZS5uYW1lOwogCWludAkJbmFtZWxlbiA9IGRlbnRyeS0+ZF9uYW1lLmxlbjsKLQl1bnNpZ25lZCBsb25nCW9mZnNldCA9IDA7CisJdW5zaWduZWQgaW50CW9mZnNldCA9IDA7CiAJdW5zaWduZWQgc2hvcnQJcmVjbGVuOwogCWludAkJbmxlbiwgcmxlbiwgZXJyOwogCWNoYXIJCSp0b3A7CkBAIC0xMzM1LDggKzEzMzYsOCBAQAogCWV4dDRfdXBkYXRlX2R4X2ZsYWcoZGlyKTsKIAlkaXItPmlfdmVyc2lvbisrOwogCWV4dDRfbWFya19pbm9kZV9kaXJ0eShoYW5kbGUsIGRpcik7Ci0JQlVGRkVSX1RSQUNFKGJoLCAiY2FsbCBleHQ0X2pvdXJuYWxfZGlydHlfbWV0YWRhdGEiKTsKLQllcnIgPSBleHQ0X2pvdXJuYWxfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBiaCk7CisJQlVGRkVSX1RSQUNFKGJoLCAiY2FsbCBleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YSIpOworCWVyciA9IGV4dDRfaGFuZGxlX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgZGlyLCBiaCk7CiAJaWYgKGVycikKIAkJZXh0NF9zdGRfZXJyb3IoZGlyLT5pX3NiLCBlcnIpOwogCWJyZWxzZShiaCk7CkBAIC0xNDA4LDYgKzE0MDksOCBAQAogCiAJLyogSW5pdGlhbGl6ZSBhcyBmb3IgZHhfcHJvYmUgKi8KIAloaW5mby5oYXNoX3ZlcnNpb24gPSByb290LT5pbmZvLmhhc2hfdmVyc2lvbjsKKwlpZiAoaGluZm8uaGFzaF92ZXJzaW9uIDw9IERYX0hBU0hfVEVBKQorCQloaW5mby5oYXNoX3ZlcnNpb24gKz0gRVhUNF9TQihkaXItPmlfc2IpLT5zX2hhc2hfdW5zaWduZWQ7CiAJaGluZm8uc2VlZCA9IEVYVDRfU0IoZGlyLT5pX3NiKS0+c19oYXNoX3NlZWQ7CiAJZXh0NGZzX2Rpcmhhc2gobmFtZSwgbmFtZWxlbiwgJmhpbmZvKTsKIAlmcmFtZSA9IGZyYW1lczsKQEAgLTE0MzcsNyArMTQ0MCw2IEBACiAJCQkgIHN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7CiAJc3RydWN0IGlub2RlICpkaXIgPSBkZW50cnktPmRfcGFyZW50LT5kX2lub2RlOwotCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OwogCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CiAJc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKmRlOwogCXN0cnVjdCBzdXBlcl9ibG9jayAqc2I7CkBAIC0xNDU5LDcgKzE0NjEsNyBAQAogCQlleHQ0X21hcmtfaW5vZGVfZGlydHkoaGFuZGxlLCBkaXIpOwogCX0KIAlibG9ja3MgPSBkaXItPmlfc2l6ZSA+PiBzYi0+c19ibG9ja3NpemVfYml0czsKLQlmb3IgKGJsb2NrID0gMCwgb2Zmc2V0ID0gMDsgYmxvY2sgPCBibG9ja3M7IGJsb2NrKyspIHsKKwlmb3IgKGJsb2NrID0gMDsgYmxvY2sgPCBibG9ja3M7IGJsb2NrKyspIHsKIAkJYmggPSBleHQ0X2JyZWFkKGhhbmRsZSwgZGlyLCBibG9jaywgMCwgJnJldHZhbCk7CiAJCWlmKCFiaCkKIAkJCXJldHVybiByZXR2YWw7CkBAIC0xNTc0LDcgKzE1NzYsNyBAQAogCQkJZHh0cmFjZShkeF9zaG93X2luZGV4KCJub2RlIiwgZnJhbWVzWzFdLmVudHJpZXMpKTsKIAkJCWR4dHJhY2UoZHhfc2hvd19pbmRleCgibm9kZSIsCiAJCQkgICAgICAgKChzdHJ1Y3QgZHhfbm9kZSAqKSBiaDItPmJfZGF0YSktPmVudHJpZXMpKTsKLQkJCWVyciA9IGV4dDRfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGJoMik7CisJCQllcnIgPSBleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGlub2RlLCBiaDIpOwogCQkJaWYgKGVycikKIAkJCQlnb3RvIGpvdXJuYWxfZXJyb3I7CiAJCQlicmVsc2UgKGJoMik7CkBAIC0xNjAwLDcgKzE2MDIsNyBAQAogCQkJaWYgKGVycikKIAkJCQlnb3RvIGpvdXJuYWxfZXJyb3I7CiAJCX0KLQkJZXh0NF9qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgZnJhbWVzWzBdLmJoKTsKKwkJZXh0NF9oYW5kbGVfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBpbm9kZSwgZnJhbWVzWzBdLmJoKTsKIAl9CiAJZGUgPSBkb19zcGxpdChoYW5kbGUsIGRpciwgJmJoLCBmcmFtZSwgJmhpbmZvLCAmZXJyKTsKIAlpZiAoIWRlKQpAQCAtMTY0Niw4ICsxNjQ4LDggQEAKIAkJCWVsc2UKIAkJCQlkZS0+aW5vZGUgPSAwOwogCQkJZGlyLT5pX3ZlcnNpb24rKzsKLQkJCUJVRkZFUl9UUkFDRShiaCwgImNhbGwgZXh0NF9qb3VybmFsX2RpcnR5X21ldGFkYXRhIik7Ci0JCQlleHQ0X2pvdXJuYWxfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBiaCk7CisJCQlCVUZGRVJfVFJBQ0UoYmgsICJjYWxsIGV4dDRfaGFuZGxlX2RpcnR5X21ldGFkYXRhIik7CisJCQlleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGRpciwgYmgpOwogCQkJcmV0dXJuIDA7CiAJCX0KIAkJaSArPSBleHQ0X3JlY19sZW5fZnJvbV9kaXNrKGRlLT5yZWNfbGVuKTsKQEAgLTE3MjUsNyArMTcyNyw3IEBACiAJCXJldHVybiBQVFJfRVJSKGhhbmRsZSk7CiAKIAlpZiAoSVNfRElSU1lOQyhkaXIpKQotCQloYW5kbGUtPmhfc3luYyA9IDE7CisJCWV4dDRfaGFuZGxlX3N5bmMoaGFuZGxlKTsKIAogCWlub2RlID0gZXh0NF9uZXdfaW5vZGUgKGhhbmRsZSwgZGlyLCBtb2RlKTsKIAllcnIgPSBQVFJfRVJSKGlub2RlKTsKQEAgLTE3NTksNyArMTc2MSw3IEBACiAJCXJldHVybiBQVFJfRVJSKGhhbmRsZSk7CiAKIAlpZiAoSVNfRElSU1lOQyhkaXIpKQotCQloYW5kbGUtPmhfc3luYyA9IDE7CisJCWV4dDRfaGFuZGxlX3N5bmMoaGFuZGxlKTsKIAogCWlub2RlID0gZXh0NF9uZXdfaW5vZGUoaGFuZGxlLCBkaXIsIG1vZGUpOwogCWVyciA9IFBUUl9FUlIoaW5vZGUpOwpAQCAtMTc5NSw3ICsxNzk3LDcgQEAKIAkJcmV0dXJuIFBUUl9FUlIoaGFuZGxlKTsKIAogCWlmIChJU19ESVJTWU5DKGRpcikpCi0JCWhhbmRsZS0+aF9zeW5jID0gMTsKKwkJZXh0NF9oYW5kbGVfc3luYyhoYW5kbGUpOwogCiAJaW5vZGUgPSBleHQ0X25ld19pbm9kZShoYW5kbGUsIGRpciwgU19JRkRJUiB8IG1vZGUpOwogCWVyciA9IFBUUl9FUlIoaW5vZGUpOwpAQCAtMTgyNCw4ICsxODI2LDggQEAKIAlzdHJjcHkoZGUtPm5hbWUsICIuLiIpOwogCWV4dDRfc2V0X2RlX3R5cGUoZGlyLT5pX3NiLCBkZSwgU19JRkRJUik7CiAJaW5vZGUtPmlfbmxpbmsgPSAyOwotCUJVRkZFUl9UUkFDRShkaXJfYmxvY2ssICJjYWxsIGV4dDRfam91cm5hbF9kaXJ0eV9tZXRhZGF0YSIpOwotCWV4dDRfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGRpcl9ibG9jayk7CisJQlVGRkVSX1RSQUNFKGRpcl9ibG9jaywgImNhbGwgZXh0NF9oYW5kbGVfZGlydHlfbWV0YWRhdGEiKTsKKwlleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGRpciwgZGlyX2Jsb2NrKTsKIAlicmVsc2UoZGlyX2Jsb2NrKTsKIAlleHQ0X21hcmtfaW5vZGVfZGlydHkoaGFuZGxlLCBpbm9kZSk7CiAJZXJyID0gZXh0NF9hZGRfZW50cnkoaGFuZGxlLCBkZW50cnksIGlub2RlKTsKQEAgLTE4NTQsNyArMTg1Niw3IEBACiAgKi8KIHN0YXRpYyBpbnQgZW1wdHlfZGlyKHN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7Ci0JdW5zaWduZWQgbG9uZyBvZmZzZXQ7CisJdW5zaWduZWQgaW50IG9mZnNldDsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOwogCXN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICpkZSwgKmRlMTsKIAlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiOwpAQCAtMTg5OSw3ICsxOTAxLDcgQEAKIAkJCQlpZiAoZXJyKQogCQkJCQlleHQ0X2Vycm9yKHNiLCBfX2Z1bmNfXywKIAkJCQkJCSAgICJlcnJvciAlZCByZWFkaW5nIGRpcmVjdG9yeSIKLQkJCQkJCSAgICIgIyVsdSBvZmZzZXQgJWx1IiwKKwkJCQkJCSAgICIgIyVsdSBvZmZzZXQgJXUiLAogCQkJCQkJICAgZXJyLCBpbm9kZS0+aV9pbm8sIG9mZnNldCk7CiAJCQkJb2Zmc2V0ICs9IHNiLT5zX2Jsb2Nrc2l6ZTsKIAkJCQljb250aW51ZTsKQEAgLTE5MzcsNiArMTkzOSw5IEBACiAJc3RydWN0IGV4dDRfaWxvYyBpbG9jOwogCWludCBlcnIgPSAwLCByYzsKIAorCWlmICghZXh0NF9oYW5kbGVfdmFsaWQoaGFuZGxlKSkKKwkJcmV0dXJuIDA7CisKIAlsb2NrX3N1cGVyKHNiKTsKIAlpZiAoIWxpc3RfZW1wdHkoJkVYVDRfSShpbm9kZSktPmlfb3JwaGFuKSkKIAkJZ290byBvdXRfdW5sb2NrOwpAQCAtMTk2NSw3ICsxOTcwLDcgQEAKIAkvKiBJbnNlcnQgdGhpcyBpbm9kZSBhdCB0aGUgaGVhZCBvZiB0aGUgb24tZGlzayBvcnBoYW4gbGlzdC4uLiAqLwogCU5FWFRfT1JQSEFOKGlub2RlKSA9IGxlMzJfdG9fY3B1KEVYVDRfU0Ioc2IpLT5zX2VzLT5zX2xhc3Rfb3JwaGFuKTsKIAlFWFQ0X1NCKHNiKS0+c19lcy0+c19sYXN0X29ycGhhbiA9IGNwdV90b19sZTMyKGlub2RlLT5pX2lubyk7Ci0JZXJyID0gZXh0NF9qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgRVhUNF9TQihzYiktPnNfc2JoKTsKKwllcnIgPSBleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGlub2RlLCBFWFQ0X1NCKHNiKS0+c19zYmgpOwogCXJjID0gZXh0NF9tYXJrX2lsb2NfZGlydHkoaGFuZGxlLCBpbm9kZSwgJmlsb2MpOwogCWlmICghZXJyKQogCQllcnIgPSByYzsKQEAgLTE5OTksMTAgKzIwMDQsMTMgQEAKIAlzdHJ1Y3QgbGlzdF9oZWFkICpwcmV2OwogCXN0cnVjdCBleHQ0X2lub2RlX2luZm8gKmVpID0gRVhUNF9JKGlub2RlKTsKIAlzdHJ1Y3QgZXh0NF9zYl9pbmZvICpzYmk7Ci0JdW5zaWduZWQgbG9uZyBpbm9fbmV4dDsKKwlfX3UzMiBpbm9fbmV4dDsKIAlzdHJ1Y3QgZXh0NF9pbG9jIGlsb2M7CiAJaW50IGVyciA9IDA7CiAKKwlpZiAoIWV4dDRfaGFuZGxlX3ZhbGlkKGhhbmRsZSkpCisJCXJldHVybiAwOworCiAJbG9ja19zdXBlcihpbm9kZS0+aV9zYik7CiAJaWYgKGxpc3RfZW1wdHkoJmVpLT5pX29ycGhhbikpIHsKIAkJdW5sb2NrX3N1cGVyKGlub2RlLT5pX3NiKTsKQEAgLTIwMjEsNyArMjAyOSw3IEBACiAJICogdHJhbnNhY3Rpb24gaGFuZGxlIHdpdGggd2hpY2ggdG8gdXBkYXRlIHRoZSBvcnBoYW4gbGlzdCBvbgogCSAqIGRpc2ssIGJ1dCB3ZSBzdGlsbCBuZWVkIHRvIHJlbW92ZSB0aGUgaW5vZGUgZnJvbSB0aGUgbGlua2VkCiAJICogbGlzdCBpbiBtZW1vcnkuICovCi0JaWYgKCFoYW5kbGUpCisJaWYgKHNiaS0+c19qb3VybmFsICYmICFoYW5kbGUpCiAJCWdvdG8gb3V0OwogCiAJZXJyID0gZXh0NF9yZXNlcnZlX2lub2RlX3dyaXRlKGhhbmRsZSwgaW5vZGUsICZpbG9jKTsKQEAgLTIwMjksMTkgKzIwMzcsMTkgQEAKIAkJZ290byBvdXRfZXJyOwogCiAJaWYgKHByZXYgPT0gJnNiaS0+c19vcnBoYW4pIHsKLQkJamJkX2RlYnVnKDQsICJzdXBlcmJsb2NrIHdpbGwgcG9pbnQgdG8gJWx1XG4iLCBpbm9fbmV4dCk7CisJCWpiZF9kZWJ1Zyg0LCAic3VwZXJibG9jayB3aWxsIHBvaW50IHRvICV1XG4iLCBpbm9fbmV4dCk7CiAJCUJVRkZFUl9UUkFDRShzYmktPnNfc2JoLCAiZ2V0X3dyaXRlX2FjY2VzcyIpOwogCQllcnIgPSBleHQ0X2pvdXJuYWxfZ2V0X3dyaXRlX2FjY2VzcyhoYW5kbGUsIHNiaS0+c19zYmgpOwogCQlpZiAoZXJyKQogCQkJZ290byBvdXRfYnJlbHNlOwogCQlzYmktPnNfZXMtPnNfbGFzdF9vcnBoYW4gPSBjcHVfdG9fbGUzMihpbm9fbmV4dCk7Ci0JCWVyciA9IGV4dDRfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIHNiaS0+c19zYmgpOworCQllcnIgPSBleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGlub2RlLCBzYmktPnNfc2JoKTsKIAl9IGVsc2UgewogCQlzdHJ1Y3QgZXh0NF9pbG9jIGlsb2MyOwogCQlzdHJ1Y3QgaW5vZGUgKmlfcHJldiA9CiAJCQkmbGlzdF9lbnRyeShwcmV2LCBzdHJ1Y3QgZXh0NF9pbm9kZV9pbmZvLCBpX29ycGhhbiktPnZmc19pbm9kZTsKIAotCQlqYmRfZGVidWcoNCwgIm9ycGhhbiBpbm9kZSAlbHUgd2lsbCBwb2ludCB0byAlbHVcbiIsCisJCWpiZF9kZWJ1Zyg0LCAib3JwaGFuIGlub2RlICVsdSB3aWxsIHBvaW50IHRvICV1XG4iLAogCQkJICBpX3ByZXYtPmlfaW5vLCBpbm9fbmV4dCk7CiAJCWVyciA9IGV4dDRfcmVzZXJ2ZV9pbm9kZV93cml0ZShoYW5kbGUsIGlfcHJldiwgJmlsb2MyKTsKIAkJaWYgKGVycikKQEAgLTIwODYsNyArMjA5NCw3IEBACiAJCWdvdG8gZW5kX3JtZGlyOwogCiAJaWYgKElTX0RJUlNZTkMoZGlyKSkKLQkJaGFuZGxlLT5oX3N5bmMgPSAxOworCQlleHQ0X2hhbmRsZV9zeW5jKGhhbmRsZSk7CiAKIAlpbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKIApAQCAtMjE0MCw3ICsyMTQ4LDcgQEAKIAkJcmV0dXJuIFBUUl9FUlIoaGFuZGxlKTsKIAogCWlmIChJU19ESVJTWU5DKGRpcikpCi0JCWhhbmRsZS0+aF9zeW5jID0gMTsKKwkJZXh0NF9oYW5kbGVfc3luYyhoYW5kbGUpOwogCiAJcmV0dmFsID0gLUVOT0VOVDsKIAliaCA9IGV4dDRfZmluZF9lbnRyeShkaXIsICZkZW50cnktPmRfbmFtZSwgJmRlKTsKQEAgLTIxOTcsNyArMjIwNSw3IEBACiAJCXJldHVybiBQVFJfRVJSKGhhbmRsZSk7CiAKIAlpZiAoSVNfRElSU1lOQyhkaXIpKQotCQloYW5kbGUtPmhfc3luYyA9IDE7CisJCWV4dDRfaGFuZGxlX3N5bmMoaGFuZGxlKTsKIAogCWlub2RlID0gZXh0NF9uZXdfaW5vZGUoaGFuZGxlLCBkaXIsIFNfSUZMTkt8U19JUldYVUdPKTsKIAllcnIgPSBQVFJfRVJSKGlub2RlKTsKQEAgLTIyNjAsNyArMjI2OCw3IEBACiAJCXJldHVybiBQVFJfRVJSKGhhbmRsZSk7CiAKIAlpZiAoSVNfRElSU1lOQyhkaXIpKQotCQloYW5kbGUtPmhfc3luYyA9IDE7CisJCWV4dDRfaGFuZGxlX3N5bmMoaGFuZGxlKTsKIAogCWlub2RlLT5pX2N0aW1lID0gZXh0NF9jdXJyZW50X3RpbWUoaW5vZGUpOwogCWV4dDRfaW5jX2NvdW50KGhhbmRsZSwgaW5vZGUpOwpAQCAtMjMwOSw3ICsyMzE3LDcgQEAKIAkJcmV0dXJuIFBUUl9FUlIoaGFuZGxlKTsKIAogCWlmIChJU19ESVJTWU5DKG9sZF9kaXIpIHx8IElTX0RJUlNZTkMobmV3X2RpcikpCi0JCWhhbmRsZS0+aF9zeW5jID0gMTsKKwkJZXh0NF9oYW5kbGVfc3luYyhoYW5kbGUpOwogCiAJb2xkX2JoID0gZXh0NF9maW5kX2VudHJ5KG9sZF9kaXIsICZvbGRfZGVudHJ5LT5kX25hbWUsICZvbGRfZGUpOwogCS8qCkBAIC0yMzYzLDggKzIzNzEsOCBAQAogCQluZXdfZGlyLT5pX2N0aW1lID0gbmV3X2Rpci0+aV9tdGltZSA9CiAJCQkJCWV4dDRfY3VycmVudF90aW1lKG5ld19kaXIpOwogCQlleHQ0X21hcmtfaW5vZGVfZGlydHkoaGFuZGxlLCBuZXdfZGlyKTsKLQkJQlVGRkVSX1RSQUNFKG5ld19iaCwgImNhbGwgZXh0NF9qb3VybmFsX2RpcnR5X21ldGFkYXRhIik7Ci0JCWV4dDRfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIG5ld19iaCk7CisJCUJVRkZFUl9UUkFDRShuZXdfYmgsICJjYWxsIGV4dDRfaGFuZGxlX2RpcnR5X21ldGFkYXRhIik7CisJCWV4dDRfaGFuZGxlX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgbmV3X2RpciwgbmV3X2JoKTsKIAkJYnJlbHNlKG5ld19iaCk7CiAJCW5ld19iaCA9IE5VTEw7CiAJfQpAQCAtMjQxNCw4ICsyNDIyLDggQEAKIAkJQlVGRkVSX1RSQUNFKGRpcl9iaCwgImdldF93cml0ZV9hY2Nlc3MiKTsKIAkJZXh0NF9qb3VybmFsX2dldF93cml0ZV9hY2Nlc3MoaGFuZGxlLCBkaXJfYmgpOwogCQlQQVJFTlRfSU5PKGRpcl9iaC0+Yl9kYXRhKSA9IGNwdV90b19sZTMyKG5ld19kaXItPmlfaW5vKTsKLQkJQlVGRkVSX1RSQUNFKGRpcl9iaCwgImNhbGwgZXh0NF9qb3VybmFsX2RpcnR5X21ldGFkYXRhIik7Ci0JCWV4dDRfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGRpcl9iaCk7CisJCUJVRkZFUl9UUkFDRShkaXJfYmgsICJjYWxsIGV4dDRfaGFuZGxlX2RpcnR5X21ldGFkYXRhIik7CisJCWV4dDRfaGFuZGxlX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgb2xkX2RpciwgZGlyX2JoKTsKIAkJZXh0NF9kZWNfY291bnQoaGFuZGxlLCBvbGRfZGlyKTsKIAkJaWYgKG5ld19pbm9kZSkgewogCQkJLyogY2hlY2tlZCBlbXB0eV9kaXIgYWJvdmUsIGNhbid0IGhhdmUgYW5vdGhlciBwYXJlbnQsCmRpZmYgLS1naXQgYS9mcy9leHQ0L3Jlc2l6ZS5jIGIvZnMvZXh0NC9yZXNpemUuYwppbmRleCBiNmVjMTg0Li5jMzI4YmU1IDEwMDY0NAotLS0gYS9mcy9leHQ0L3Jlc2l6ZS5jCisrKyBiL2ZzL2V4dDQvcmVzaXplLmMKQEAgLTUwLDcgKzUwLDcgQEAKIAlleHQ0X2dldF9ncm91cF9ub19hbmRfb2Zmc2V0KHNiLCBzdGFydCwgTlVMTCwgJm9mZnNldCk7CiAJaWYgKGdyb3VwICE9IHNiaS0+c19ncm91cHNfY291bnQpCiAJCWV4dDRfd2FybmluZyhzYiwgX19mdW5jX18sCi0JCQkgICAgICJDYW5ub3QgYWRkIGF0IGdyb3VwICV1IChvbmx5ICVsdSBncm91cHMpIiwKKwkJCSAgICAgIkNhbm5vdCBhZGQgYXQgZ3JvdXAgJXUgKG9ubHkgJXUgZ3JvdXBzKSIsCiAJCQkgICAgIGlucHV0LT5ncm91cCwgc2JpLT5zX2dyb3Vwc19jb3VudCk7CiAJZWxzZSBpZiAob2Zmc2V0ICE9IDApCiAJCQlleHQ0X3dhcm5pbmcoc2IsIF9fZnVuY19fLCAiTGFzdCBncm91cCBub3QgZnVsbCIpOwpAQCAtMTQ5LDcgKzE0OSw3IEBACiB7CiAJaW50IGVycjsKIAotCWlmIChoYW5kbGUtPmhfYnVmZmVyX2NyZWRpdHMgPj0gdGhyZXNoKQorCWlmIChleHQ0X2hhbmRsZV9oYXNfZW5vdWdoX2NyZWRpdHMoaGFuZGxlLCB0aHJlc2gpKQogCQlyZXR1cm4gMDsKIAogCWVyciA9IGV4dDRfam91cm5hbF9leHRlbmQoaGFuZGxlLCBFWFQ0X01BWF9UUkFOU19EQVRBKTsKQEAgLTIzMiw3ICsyMzIsNyBAQAogCQltZW1jcHkoZ2RiLT5iX2RhdGEsIHNiaS0+c19ncm91cF9kZXNjW2ldLT5iX2RhdGEsIGdkYi0+Yl9zaXplKTsKIAkJc2V0X2J1ZmZlcl91cHRvZGF0ZShnZGIpOwogCQl1bmxvY2tfYnVmZmVyKGdkYik7Ci0JCWV4dDRfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGdkYik7CisJCWV4dDRfaGFuZGxlX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgTlVMTCwgZ2RiKTsKIAkJZXh0NF9zZXRfYml0KGJpdCwgYmgtPmJfZGF0YSk7CiAJCWJyZWxzZShnZGIpOwogCX0KQEAgLTI1MSw3ICsyNTEsNyBAQAogCQkJZXJyID0gUFRSX0VSUihiaCk7CiAJCQlnb3RvIGV4aXRfYmg7CiAJCX0KLQkJZXh0NF9qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgZ2RiKTsKKwkJZXh0NF9oYW5kbGVfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBOVUxMLCBnZGIpOwogCQlleHQ0X3NldF9iaXQoYml0LCBiaC0+Yl9kYXRhKTsKIAkJYnJlbHNlKGdkYik7CiAJfQpAQCAtMjc2LDcgKzI3Niw3IEBACiAJCQllcnIgPSBQVFJfRVJSKGl0KTsKIAkJCWdvdG8gZXhpdF9iaDsKIAkJfQotCQlleHQ0X2pvdXJuYWxfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBpdCk7CisJCWV4dDRfaGFuZGxlX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgTlVMTCwgaXQpOwogCQlicmVsc2UoaXQpOwogCQlleHQ0X3NldF9iaXQoYml0LCBiaC0+Yl9kYXRhKTsKIAl9CkBAIC0yODQsMTEgKzI4NCw5IEBACiAJaWYgKChlcnIgPSBleHRlbmRfb3JfcmVzdGFydF90cmFuc2FjdGlvbihoYW5kbGUsIDIsIGJoKSkpCiAJCWdvdG8gZXhpdF9iaDsKIAotCW1hcmtfYml0bWFwX2VuZChpbnB1dC0+YmxvY2tzX2NvdW50LCBFWFQ0X0JMT0NLU19QRVJfR1JPVVAoc2IpLAotCQkJYmgtPmJfZGF0YSk7Ci0JZXh0NF9qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgYmgpOworCW1hcmtfYml0bWFwX2VuZChpbnB1dC0+YmxvY2tzX2NvdW50LCBzYi0+c19ibG9ja3NpemUgKiA4LCBiaC0+Yl9kYXRhKTsKKwlleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIE5VTEwsIGJoKTsKIAlicmVsc2UoYmgpOwotCiAJLyogTWFyayB1bnVzZWQgZW50cmllcyBpbiBpbm9kZSBiaXRtYXAgdXNlZCAqLwogCWV4dDRfZGVidWcoImNsZWFyIGlub2RlIGJpdG1hcCAlIzA0bGx4ICgrJWxsdSlcbiIsCiAJCSAgIGlucHV0LT5pbm9kZV9iaXRtYXAsIGlucHV0LT5pbm9kZV9iaXRtYXAgLSBzdGFydCk7CkBAIC0yOTcsOSArMjk1LDkgQEAKIAkJZ290byBleGl0X2pvdXJuYWw7CiAJfQogCi0JbWFya19iaXRtYXBfZW5kKEVYVDRfSU5PREVTX1BFUl9HUk9VUChzYiksIEVYVDRfQkxPQ0tTX1BFUl9HUk9VUChzYiksCisJbWFya19iaXRtYXBfZW5kKEVYVDRfSU5PREVTX1BFUl9HUk9VUChzYiksIHNiLT5zX2Jsb2Nrc2l6ZSAqIDgsCiAJCQliaC0+Yl9kYXRhKTsKLQlleHQ0X2pvdXJuYWxfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBiaCk7CisJZXh0NF9oYW5kbGVfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBOVUxMLCBiaCk7CiBleGl0X2JoOgogCWJyZWxzZShiaCk7CiAKQEAgLTQ4NiwxMiArNDg0LDEyIEBACiAJICogcmVzZXJ2ZWQgaW5vZGUsIGFuZCB3aWxsIGJlY29tZSBHRFQgYmxvY2tzIChwcmltYXJ5IGFuZCBiYWNrdXApLgogCSAqLwogCWRhdGFbZ2RiX251bSAlIEVYVDRfQUREUl9QRVJfQkxPQ0soc2IpXSA9IDA7Ci0JZXh0NF9qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgZGluZCk7CisJZXh0NF9oYW5kbGVfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBOVUxMLCBkaW5kKTsKIAlicmVsc2UoZGluZCk7CiAJaW5vZGUtPmlfYmxvY2tzIC09IChnZGJhY2t1cHMgKyAxKSAqIHNiLT5zX2Jsb2Nrc2l6ZSA+PiA5OwogCWV4dDRfbWFya19pbG9jX2RpcnR5KGhhbmRsZSwgaW5vZGUsICZpbG9jKTsKIAltZW1zZXQoKCpwcmltYXJ5KS0+Yl9kYXRhLCAwLCBzYi0+c19ibG9ja3NpemUpOwotCWV4dDRfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsICpwcmltYXJ5KTsKKwlleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIE5VTEwsICpwcmltYXJ5KTsKIAogCW9fZ3JvdXBfZGVzYyA9IEVYVDRfU0Ioc2IpLT5zX2dyb3VwX2Rlc2M7CiAJbWVtY3B5KG5fZ3JvdXBfZGVzYywgb19ncm91cF9kZXNjLApAQCAtNTAyLDcgKzUwMCw3IEBACiAJa2ZyZWUob19ncm91cF9kZXNjKTsKIAogCWxlMTZfYWRkX2NwdSgmZXMtPnNfcmVzZXJ2ZWRfZ2R0X2Jsb2NrcywgLTEpOwotCWV4dDRfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIEVYVDRfU0Ioc2IpLT5zX3NiaCk7CisJZXh0NF9oYW5kbGVfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBOVUxMLCBFWFQ0X1NCKHNiKS0+c19zYmgpOwogCiAJcmV0dXJuIDA7CiAKQEAgLTYxOCw3ICs2MTYsNyBAQAogCQkgICAgICAgcHJpbWFyeVtpXS0+Yl9ibG9ja25yLCBnZGJhY2t1cHMsCiAJCSAgICAgICBibGsgKyBwcmltYXJ5W2ldLT5iX2Jsb2NrbnIpOyAqLwogCQlkYXRhW2dkYmFja3Vwc10gPSBjcHVfdG9fbGUzMihibGsgKyBwcmltYXJ5W2ldLT5iX2Jsb2NrbnIpOwotCQllcnIyID0gZXh0NF9qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgcHJpbWFyeVtpXSk7CisJCWVycjIgPSBleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIE5VTEwsIHByaW1hcnlbaV0pOwogCQlpZiAoIWVycikKIAkJCWVyciA9IGVycjI7CiAJfQpAQCAtNjc2LDcgKzY3NCw4IEBACiAJCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CiAKIAkJLyogT3V0IG9mIGpvdXJuYWwgc3BhY2UsIGFuZCBjYW4ndCBnZXQgbW9yZSAtIGFib3J0IC0gc28gc2FkICovCi0JCWlmIChoYW5kbGUtPmhfYnVmZmVyX2NyZWRpdHMgPT0gMCAmJgorCQlpZiAoZXh0NF9oYW5kbGVfdmFsaWQoaGFuZGxlKSAmJgorCQkgICAgaGFuZGxlLT5oX2J1ZmZlcl9jcmVkaXRzID09IDAgJiYKIAkJICAgIGV4dDRfam91cm5hbF9leHRlbmQoaGFuZGxlLCBFWFQ0X01BWF9UUkFOU19EQVRBKSAmJgogCQkgICAgKGVyciA9IGV4dDRfam91cm5hbF9yZXN0YXJ0KGhhbmRsZSwgRVhUNF9NQVhfVFJBTlNfREFUQSkpKQogCQkJYnJlYWs7CkBAIC02OTYsNyArNjk1LDcgQEAKIAkJCW1lbXNldChiaC0+Yl9kYXRhICsgc2l6ZSwgMCwgcmVzdCk7CiAJCXNldF9idWZmZXJfdXB0b2RhdGUoYmgpOwogCQl1bmxvY2tfYnVmZmVyKGJoKTsKLQkJZXh0NF9qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgYmgpOworCQlleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIE5VTEwsIGJoKTsKIAkJYnJlbHNlKGJoKTsKIAl9CiAJaWYgKChlcnIyID0gZXh0NF9qb3VybmFsX3N0b3AoaGFuZGxlKSkgJiYgIWVycikKQEAgLTcxNSw3ICs3MTQsNyBAQAogZXhpdF9lcnI6CiAJaWYgKGVycikgewogCQlleHQ0X3dhcm5pbmcoc2IsIF9fZnVuY19fLAotCQkJICAgICAiY2FuJ3QgdXBkYXRlIGJhY2t1cCBmb3IgZ3JvdXAgJWx1IChlcnIgJWQpLCAiCisJCQkgICAgICJjYW4ndCB1cGRhdGUgYmFja3VwIGZvciBncm91cCAldSAoZXJyICVkKSwgIgogCQkJICAgICAiZm9yY2luZyBmc2NrIG9uIG5leHQgcmVib290IiwgZ3JvdXAsIGVycik7CiAJCXNiaS0+c19tb3VudF9zdGF0ZSAmPSB+RVhUNF9WQUxJRF9GUzsKIAkJc2JpLT5zX2VzLT5zX3N0YXRlICY9IGNwdV90b19sZTE2KH5FWFQ0X1ZBTElEX0ZTKTsKQEAgLTc0Nyw2ICs3NDYsNyBAQAogCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBOVUxMOwogCWhhbmRsZV90ICpoYW5kbGU7CiAJaW50IGdkYl9vZmYsIGdkYl9udW07CisJaW50IG51bV9ncnBfbG9ja2VkID0gMDsKIAlpbnQgZXJyLCBlcnIyOwogCiAJZ2RiX251bSA9IGlucHV0LT5ncm91cCAvIEVYVDRfREVTQ19QRVJfQkxPQ0soc2IpOwpAQCAtNzYxLDEzICs3NjEsMTMgQEAKIAogCWlmIChleHQ0X2Jsb2Nrc19jb3VudChlcykgKyBpbnB1dC0+YmxvY2tzX2NvdW50IDwKIAkgICAgZXh0NF9ibG9ja3NfY291bnQoZXMpKSB7Ci0JCWV4dDRfd2FybmluZyhzYiwgX19mdW5jX18sICJibG9ja3NfY291bnQgb3ZlcmZsb3dcbiIpOworCQlleHQ0X3dhcm5pbmcoc2IsIF9fZnVuY19fLCAiYmxvY2tzX2NvdW50IG92ZXJmbG93Iik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAogCWlmIChsZTMyX3RvX2NwdShlcy0+c19pbm9kZXNfY291bnQpICsgRVhUNF9JTk9ERVNfUEVSX0dST1VQKHNiKSA8CiAJICAgIGxlMzJfdG9fY3B1KGVzLT5zX2lub2Rlc19jb3VudCkpIHsKLQkJZXh0NF93YXJuaW5nKHNiLCBfX2Z1bmNfXywgImlub2Rlc19jb3VudCBvdmVyZmxvd1xuIik7CisJCWV4dDRfd2FybmluZyhzYiwgX19mdW5jX18sICJpbm9kZXNfY291bnQgb3ZlcmZsb3ciKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC03ODcsNiArNzg3LDcgQEAKIAkJfQogCX0KIAorCiAJaWYgKChlcnIgPSB2ZXJpZnlfZ3JvdXBfaW5wdXQoc2IsIGlucHV0KSkpCiAJCWdvdG8gZXhpdF9wdXQ7CiAKQEAgLTg1NSw2ICs4NTYsNyBAQAogICAgICAgICAgKiB1c2luZyB0aGUgbmV3IGRpc2sgYmxvY2tzLgogICAgICAgICAgKi8KIAorCW51bV9ncnBfbG9ja2VkID0gZXh0NF9tYl9nZXRfYnVkZHlfY2FjaGVfbG9jayhzYiwgaW5wdXQtPmdyb3VwKTsKIAkvKiBVcGRhdGUgZ3JvdXAgZGVzY3JpcHRvciBibG9jayBmb3IgbmV3IGdyb3VwICovCiAJZ2RwID0gKHN0cnVjdCBleHQ0X2dyb3VwX2Rlc2MgKikoKGNoYXIgKilwcmltYXJ5LT5iX2RhdGEgKwogCQkJCQkgZ2RiX29mZiAqIEVYVDRfREVTQ19TSVpFKHNiKSk7CkBAIC04NjIsMTcgKzg2NCwyMCBAQAogCWV4dDRfYmxvY2tfYml0bWFwX3NldChzYiwgZ2RwLCBpbnB1dC0+YmxvY2tfYml0bWFwKTsgLyogTFYgRklYTUUgKi8KIAlleHQ0X2lub2RlX2JpdG1hcF9zZXQoc2IsIGdkcCwgaW5wdXQtPmlub2RlX2JpdG1hcCk7IC8qIExWIEZJWE1FICovCiAJZXh0NF9pbm9kZV90YWJsZV9zZXQoc2IsIGdkcCwgaW5wdXQtPmlub2RlX3RhYmxlKTsgLyogTFYgRklYTUUgKi8KLQlnZHAtPmJnX2ZyZWVfYmxvY2tzX2NvdW50ID0gY3B1X3RvX2xlMTYoaW5wdXQtPmZyZWVfYmxvY2tzX2NvdW50KTsKLQlnZHAtPmJnX2ZyZWVfaW5vZGVzX2NvdW50ID0gY3B1X3RvX2xlMTYoRVhUNF9JTk9ERVNfUEVSX0dST1VQKHNiKSk7CisJZXh0NF9mcmVlX2Jsa3Nfc2V0KHNiLCBnZHAsIGlucHV0LT5mcmVlX2Jsb2Nrc19jb3VudCk7CisJZXh0NF9mcmVlX2lub2Rlc19zZXQoc2IsIGdkcCwgRVhUNF9JTk9ERVNfUEVSX0dST1VQKHNiKSk7CisJZ2RwLT5iZ19mbGFncyB8PSBjcHVfdG9fbGUxNihFWFQ0X0JHX0lOT0RFX1pFUk9FRCk7CiAJZ2RwLT5iZ19jaGVja3N1bSA9IGV4dDRfZ3JvdXBfZGVzY19jc3VtKHNiaSwgaW5wdXQtPmdyb3VwLCBnZHApOwogCiAJLyoKIAkgKiBXZSBjYW4gYWxsb2NhdGUgbWVtb3J5IGZvciBtYl9hbGxvYyBiYXNlZCBvbiB0aGUgbmV3IGdyb3VwCiAJICogZGVzY3JpcHRvcgogCSAqLwotCWVyciA9IGV4dDRfbWJfYWRkX21vcmVfZ3JvdXBpbmZvKHNiLCBpbnB1dC0+Z3JvdXAsIGdkcCk7Ci0JaWYgKGVycikKKwllcnIgPSBleHQ0X21iX2FkZF9ncm91cGluZm8oc2IsIGlucHV0LT5ncm91cCwgZ2RwKTsKKwlpZiAoZXJyKSB7CisJCWV4dDRfbWJfcHV0X2J1ZGR5X2NhY2hlX2xvY2soc2IsIGlucHV0LT5ncm91cCwgbnVtX2dycF9sb2NrZWQpOwogCQlnb3RvIGV4aXRfam91cm5hbDsKKwl9CiAKIAkvKgogCSAqIE1ha2UgdGhlIG5ldyBibG9ja3MgYW5kIGlub2RlcyB2YWxpZCBuZXh0LiAgV2UgZG8gdGhpcyBiZWZvcmUKQEAgLTkxNCw4ICs5MTksOSBAQAogCiAJLyogVXBkYXRlIHRoZSBnbG9iYWwgZnMgc2l6ZSBmaWVsZHMgKi8KIAlzYmktPnNfZ3JvdXBzX2NvdW50Kys7CisJZXh0NF9tYl9wdXRfYnVkZHlfY2FjaGVfbG9jayhzYiwgaW5wdXQtPmdyb3VwLCBudW1fZ3JwX2xvY2tlZCk7CiAKLQlleHQ0X2pvdXJuYWxfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBwcmltYXJ5KTsKKwlleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIE5VTEwsIHByaW1hcnkpOwogCiAJLyogVXBkYXRlIHRoZSByZXNlcnZlZCBibG9jayBjb3VudHMgb25seSBvbmNlIHRoZSBuZXcgZ3JvdXAgaXMKIAkgKiBhY3RpdmUuICovCkBAIC05MzcsNyArOTQzLDcgQEAKIAkJCUVYVDRfSU5PREVTX1BFUl9HUk9VUChzYik7CiAJfQogCi0JZXh0NF9qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgc2JpLT5zX3NiaCk7CisJZXh0NF9oYW5kbGVfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBOVUxMLCBzYmktPnNfc2JoKTsKIAlzYi0+c19kaXJ0ID0gMTsKIAogZXhpdF9qb3VybmFsOgpAQCAtOTc1LDkgKzk4MSw3IEBACiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKIAloYW5kbGVfdCAqaGFuZGxlOwogCWludCBlcnI7Ci0JdW5zaWduZWQgbG9uZyBmcmVlZF9ibG9ja3M7CiAJZXh0NF9ncm91cF90IGdyb3VwOwotCXN0cnVjdCBleHQ0X2dyb3VwX2luZm8gKmdycDsKIAogCS8qIFdlIGRvbid0IG5lZWQgdG8gd29ycnkgYWJvdXQgbG9ja2luZyB3cnQgb3RoZXIgcmVzaXplcnMganVzdAogCSAqIHlldDogd2UncmUgZ29pbmcgdG8gcmV2YWxpZGF0ZSBlcy0+c19ibG9ja3NfY291bnQgYWZ0ZXIKQEAgLTk5Nyw4ICsxMDAxLDcgQEAKIAkJCSIgdG9vIGxhcmdlIHRvIHJlc2l6ZSB0byAlbGx1IGJsb2NrcyBzYWZlbHlcbiIsCiAJCQlzYi0+c19pZCwgbl9ibG9ja3NfY291bnQpOwogCQlpZiAoc2l6ZW9mKHNlY3Rvcl90KSA8IDgpCi0JCQlleHQ0X3dhcm5pbmcoc2IsIF9fZnVuY19fLAotCQkJIkNPTkZJR19MQkQgbm90IGVuYWJsZWRcbiIpOworCQkJZXh0NF93YXJuaW5nKHNiLCBfX2Z1bmNfXywgIkNPTkZJR19MQkQgbm90IGVuYWJsZWQiKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC0xMDcxLDYyICsxMDc0LDE4IEBACiAJCWdvdG8gZXhpdF9wdXQ7CiAJfQogCWV4dDRfYmxvY2tzX2NvdW50X3NldChlcywgb19ibG9ja3NfY291bnQgKyBhZGQpOwotCWV4dDRfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIEVYVDRfU0Ioc2IpLT5zX3NiaCk7CisJZXh0NF9oYW5kbGVfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBOVUxMLCBFWFQ0X1NCKHNiKS0+c19zYmgpOwogCXNiLT5zX2RpcnQgPSAxOwogCXVubG9ja19zdXBlcihzYik7CiAJZXh0NF9kZWJ1ZygiZnJlZWluZyBibG9ja3MgJWxsdSB0aHJvdWdoICVsbHVcbiIsIG9fYmxvY2tzX2NvdW50LAogCQkgICBvX2Jsb2Nrc19jb3VudCArIGFkZCk7Ci0JZXh0NF9mcmVlX2Jsb2Nrc19zYihoYW5kbGUsIHNiLCBvX2Jsb2Nrc19jb3VudCwgYWRkLCAmZnJlZWRfYmxvY2tzKTsKKwkvKiBXZSBhZGQgdGhlIGJsb2NrcyB0byB0aGUgYml0bWFwIGFuZCBzZXQgdGhlIGdyb3VwIG5lZWQgaW5pdCBiaXQgKi8KKwlleHQ0X2FkZF9ncm91cGJsb2NrcyhoYW5kbGUsIHNiLCBvX2Jsb2Nrc19jb3VudCwgYWRkKTsKIAlleHQ0X2RlYnVnKCJmcmVlZCBibG9ja3MgJWxsdSB0aHJvdWdoICVsbHVcbiIsIG9fYmxvY2tzX2NvdW50LAogCQkgICBvX2Jsb2Nrc19jb3VudCArIGFkZCk7CiAJaWYgKChlcnIgPSBleHQ0X2pvdXJuYWxfc3RvcChoYW5kbGUpKSkKIAkJZ290byBleGl0X3B1dDsKIAotCS8qCi0JICogTWFyayBtYmFsbG9jIHBhZ2VzIGFzIG5vdCB1cCB0byBkYXRlIHNvIHRoYXQgdGhleSB3aWxsIGJlIHVwZGF0ZWQKLQkgKiBuZXh0IHRpbWUgdGhleSBhcmUgbG9hZGVkIGJ5IGV4dDRfbWJfbG9hZF9idWRkeS4KLQkgKgotCSAqIFhYWCBCYWQsIEJhZCwgQkFEISEhICBXZSBzaG91bGQgbm90IGJlIG92ZXJsb2FkaW5nIHRoZQotCSAqIFVwdG9kYXRlIGZsYWcsIHBhcnRpY3VsYXJseSBvbiB0aHRlIGJpdG1hcCBiaCwgYXMgd2F5IG9mCi0JICogaGludGluZyB0byBleHQ0X21iX2xvYWRfYnVkZHkoKSB0aGF0IGl0IG5lZWRzIHRvIGJlCi0JICogb3ZlcmxvYWRlZC4gIEEgdXNlciBjb3VsZCB0YWtlIGEgTFZNIHNuYXBzaG90LCB0aGVuIGRvIGFuCi0JICogb24tbGluZSBmc2NrLCBhbmQgY2xlYXIgdGhlIHVwdG9kYXRlIGZsYWcsIGFuZCB0aGlzIHdvdWxkCi0JICogbm90IGJlIGEgYnVnIGluIHVzZXJzcGFjZSwgYnV0IGEgYnVnIGluIHRoZSBrZXJuZWwuICBGSVhNRSEhIQotCSAqLwotCXsKLQkJc3RydWN0IGV4dDRfc2JfaW5mbyAqc2JpID0gRVhUNF9TQihzYik7Ci0JCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBzYmktPnNfYnVkZHlfY2FjaGU7Ci0JCWludCBibG9ja3NfcGVyX3BhZ2U7Ci0JCWludCBibG9jazsKLQkJaW50IHBudW07Ci0JCXN0cnVjdCBwYWdlICpwYWdlOwotCi0JCS8qIFNldCBidWRkeSBwYWdlIGFzIG5vdCB1cCB0byBkYXRlICovCi0JCWJsb2Nrc19wZXJfcGFnZSA9IFBBR0VfQ0FDSEVfU0laRSAvIHNiLT5zX2Jsb2Nrc2l6ZTsKLQkJYmxvY2sgPSBncm91cCAqIDI7Ci0JCXBudW0gPSBibG9jayAvIGJsb2Nrc19wZXJfcGFnZTsKLQkJcGFnZSA9IGZpbmRfZ2V0X3BhZ2UoaW5vZGUtPmlfbWFwcGluZywgcG51bSk7Ci0JCWlmIChwYWdlICE9IE5VTEwpIHsKLQkJCUNsZWFyUGFnZVVwdG9kYXRlKHBhZ2UpOwotCQkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOwotCQl9Ci0KLQkJLyogU2V0IGJpdG1hcCBwYWdlIGFzIG5vdCB1cCB0byBkYXRlICovCi0JCWJsb2NrKys7Ci0JCXBudW0gPSBibG9jayAvIGJsb2Nrc19wZXJfcGFnZTsKLQkJcGFnZSA9IGZpbmRfZ2V0X3BhZ2UoaW5vZGUtPmlfbWFwcGluZywgcG51bSk7Ci0JCWlmIChwYWdlICE9IE5VTEwpIHsKLQkJCUNsZWFyUGFnZVVwdG9kYXRlKHBhZ2UpOwotCQkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOwotCQl9Ci0KLQkJLyogR2V0IHRoZSBpbmZvIG9uIHRoZSBsYXN0IGdyb3VwICovCi0JCWdycCA9IGV4dDRfZ2V0X2dyb3VwX2luZm8oc2IsIGdyb3VwKTsKLQotCQkvKiBVcGRhdGUgZnJlZSBibG9ja3MgaW4gZ3JvdXAgaW5mbyAqLwotCQlleHQ0X21iX3VwZGF0ZV9ncm91cF9pbmZvKGdycCwgYWRkKTsKLQl9Ci0KIAlpZiAodGVzdF9vcHQoc2IsIERFQlVHKSkKIAkJcHJpbnRrKEtFUk5fREVCVUcgIkVYVDQtZnM6IGV4dGVuZGVkIGdyb3VwIHRvICVsbHUgYmxvY2tzXG4iLAogCQkgICAgICAgZXh0NF9ibG9ja3NfY291bnQoZXMpKTsKZGlmZiAtLWdpdCBhL2ZzL2V4dDQvc3VwZXIuYyBiL2ZzL2V4dDQvc3VwZXIuYwppbmRleCA5NDk0YmIyLi5lNWYwNmE1IDEwMDY0NAotLS0gYS9mcy9leHQ0L3N1cGVyLmMKKysrIGIvZnMvZXh0NC9zdXBlci5jCkBAIC01MSw5ICs1MSw3IEBACiAKIHN0YXRpYyBpbnQgZXh0NF9sb2FkX2pvdXJuYWwoc3RydWN0IHN1cGVyX2Jsb2NrICosIHN0cnVjdCBleHQ0X3N1cGVyX2Jsb2NrICosCiAJCQkgICAgIHVuc2lnbmVkIGxvbmcgam91cm5hbF9kZXZudW0pOwotc3RhdGljIGludCBleHQ0X2NyZWF0ZV9qb3VybmFsKHN0cnVjdCBzdXBlcl9ibG9jayAqLCBzdHJ1Y3QgZXh0NF9zdXBlcl9ibG9jayAqLAotCQkJICAgICAgIHVuc2lnbmVkIGludCk7Ci1zdGF0aWMgdm9pZCBleHQ0X2NvbW1pdF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAorc3RhdGljIGludCBleHQ0X2NvbW1pdF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAogCQkJICAgICAgc3RydWN0IGV4dDRfc3VwZXJfYmxvY2sgKmVzLCBpbnQgc3luYyk7CiBzdGF0aWMgdm9pZCBleHQ0X21hcmtfcmVjb3ZlcnlfY29tcGxldGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKIAkJCQkJc3RydWN0IGV4dDRfc3VwZXJfYmxvY2sgKmVzKTsKQEAgLTY0LDkgKzYyLDkgQEAKIAkJCQkgICAgIGNoYXIgbmJ1ZlsxNl0pOwogc3RhdGljIGludCBleHQ0X3JlbW91bnQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50ICpmbGFncywgY2hhciAqZGF0YSk7CiBzdGF0aWMgaW50IGV4dDRfc3RhdGZzKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGtzdGF0ZnMgKmJ1Zik7Ci1zdGF0aWMgdm9pZCBleHQ0X3VubG9ja2ZzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpOworc3RhdGljIGludCBleHQ0X3VuZnJlZXplKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpOwogc3RhdGljIHZvaWQgZXh0NF93cml0ZV9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKTsKLXN0YXRpYyB2b2lkIGV4dDRfd3JpdGVfc3VwZXJfbG9ja2ZzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpOworc3RhdGljIGludCBleHQ0X2ZyZWV6ZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKTsKIAogCiBleHQ0X2ZzYmxrX3QgZXh0NF9ibG9ja19iaXRtYXAoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKQEAgLTkzLDYgKzkxLDM4IEBACiAJCShleHQ0X2ZzYmxrX3QpbGUzMl90b19jcHUoYmctPmJnX2lub2RlX3RhYmxlX2hpKSA8PCAzMiA6IDApOwogfQogCitfX3UzMiBleHQ0X2ZyZWVfYmxrc19jb3VudChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAorCQkJICAgICAgc3RydWN0IGV4dDRfZ3JvdXBfZGVzYyAqYmcpCit7CisJcmV0dXJuIGxlMTZfdG9fY3B1KGJnLT5iZ19mcmVlX2Jsb2Nrc19jb3VudF9sbykgfAorCQkoRVhUNF9ERVNDX1NJWkUoc2IpID49IEVYVDRfTUlOX0RFU0NfU0laRV82NEJJVCA/CisJCShfX3UzMilsZTE2X3RvX2NwdShiZy0+YmdfZnJlZV9ibG9ja3NfY291bnRfaGkpIDw8IDE2IDogMCk7Cit9CisKK19fdTMyIGV4dDRfZnJlZV9pbm9kZXNfY291bnQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwkJCSAgICAgIHN0cnVjdCBleHQ0X2dyb3VwX2Rlc2MgKmJnKQoreworCXJldHVybiBsZTE2X3RvX2NwdShiZy0+YmdfZnJlZV9pbm9kZXNfY291bnRfbG8pIHwKKwkJKEVYVDRfREVTQ19TSVpFKHNiKSA+PSBFWFQ0X01JTl9ERVNDX1NJWkVfNjRCSVQgPworCQkoX191MzIpbGUxNl90b19jcHUoYmctPmJnX2ZyZWVfaW5vZGVzX2NvdW50X2hpKSA8PCAxNiA6IDApOworfQorCitfX3UzMiBleHQ0X3VzZWRfZGlyc19jb3VudChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAorCQkJICAgICAgc3RydWN0IGV4dDRfZ3JvdXBfZGVzYyAqYmcpCit7CisJcmV0dXJuIGxlMTZfdG9fY3B1KGJnLT5iZ191c2VkX2RpcnNfY291bnRfbG8pIHwKKwkJKEVYVDRfREVTQ19TSVpFKHNiKSA+PSBFWFQ0X01JTl9ERVNDX1NJWkVfNjRCSVQgPworCQkoX191MzIpbGUxNl90b19jcHUoYmctPmJnX3VzZWRfZGlyc19jb3VudF9oaSkgPDwgMTYgOiAwKTsKK30KKworX191MzIgZXh0NF9pdGFibGVfdW51c2VkX2NvdW50KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCisJCQkgICAgICBzdHJ1Y3QgZXh0NF9ncm91cF9kZXNjICpiZykKK3sKKwlyZXR1cm4gbGUxNl90b19jcHUoYmctPmJnX2l0YWJsZV91bnVzZWRfbG8pIHwKKwkJKEVYVDRfREVTQ19TSVpFKHNiKSA+PSBFWFQ0X01JTl9ERVNDX1NJWkVfNjRCSVQgPworCQkoX191MzIpbGUxNl90b19jcHUoYmctPmJnX2l0YWJsZV91bnVzZWRfaGkpIDw8IDE2IDogMCk7Cit9CisKIHZvaWQgZXh0NF9ibG9ja19iaXRtYXBfc2V0KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCiAJCQkgICBzdHJ1Y3QgZXh0NF9ncm91cF9kZXNjICpiZywgZXh0NF9mc2Jsa190IGJsaykKIHsKQEAgLTExNyw2ICsxNDcsMzggQEAKIAkJYmctPmJnX2lub2RlX3RhYmxlX2hpID0gY3B1X3RvX2xlMzIoYmxrID4+IDMyKTsKIH0KIAordm9pZCBleHQ0X2ZyZWVfYmxrc19zZXQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwkJCSAgc3RydWN0IGV4dDRfZ3JvdXBfZGVzYyAqYmcsIF9fdTMyIGNvdW50KQoreworCWJnLT5iZ19mcmVlX2Jsb2Nrc19jb3VudF9sbyA9IGNwdV90b19sZTE2KChfX3UxNiljb3VudCk7CisJaWYgKEVYVDRfREVTQ19TSVpFKHNiKSA+PSBFWFQ0X01JTl9ERVNDX1NJWkVfNjRCSVQpCisJCWJnLT5iZ19mcmVlX2Jsb2Nrc19jb3VudF9oaSA9IGNwdV90b19sZTE2KGNvdW50ID4+IDE2KTsKK30KKwordm9pZCBleHQ0X2ZyZWVfaW5vZGVzX3NldChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAorCQkJICBzdHJ1Y3QgZXh0NF9ncm91cF9kZXNjICpiZywgX191MzIgY291bnQpCit7CisJYmctPmJnX2ZyZWVfaW5vZGVzX2NvdW50X2xvID0gY3B1X3RvX2xlMTYoKF9fdTE2KWNvdW50KTsKKwlpZiAoRVhUNF9ERVNDX1NJWkUoc2IpID49IEVYVDRfTUlOX0RFU0NfU0laRV82NEJJVCkKKwkJYmctPmJnX2ZyZWVfaW5vZGVzX2NvdW50X2hpID0gY3B1X3RvX2xlMTYoY291bnQgPj4gMTYpOworfQorCit2b2lkIGV4dDRfdXNlZF9kaXJzX3NldChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAorCQkJICBzdHJ1Y3QgZXh0NF9ncm91cF9kZXNjICpiZywgX191MzIgY291bnQpCit7CisJYmctPmJnX3VzZWRfZGlyc19jb3VudF9sbyA9IGNwdV90b19sZTE2KChfX3UxNiljb3VudCk7CisJaWYgKEVYVDRfREVTQ19TSVpFKHNiKSA+PSBFWFQ0X01JTl9ERVNDX1NJWkVfNjRCSVQpCisJCWJnLT5iZ191c2VkX2RpcnNfY291bnRfaGkgPSBjcHVfdG9fbGUxNihjb3VudCA+PiAxNik7Cit9CisKK3ZvaWQgZXh0NF9pdGFibGVfdW51c2VkX3NldChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAorCQkJICBzdHJ1Y3QgZXh0NF9ncm91cF9kZXNjICpiZywgX191MzIgY291bnQpCit7CisJYmctPmJnX2l0YWJsZV91bnVzZWRfbG8gPSBjcHVfdG9fbGUxNigoX191MTYpY291bnQpOworCWlmIChFWFQ0X0RFU0NfU0laRShzYikgPj0gRVhUNF9NSU5fREVTQ19TSVpFXzY0QklUKQorCQliZy0+YmdfaXRhYmxlX3VudXNlZF9oaSA9IGNwdV90b19sZTE2KGNvdW50ID4+IDE2KTsKK30KKwogLyoKICAqIFdyYXBwZXJzIGZvciBqYmQyX2pvdXJuYWxfc3RhcnQvZW5kLgogICoKQEAgLTEzNiwxMyArMTk4LDE5IEBACiAJICogYmFja3MgKGVnLiBFSU8gaW4gdGhlIGNvbW1pdCB0aHJlYWQpLCB0aGVuIHdlIHN0aWxsIG5lZWQgdG8KIAkgKiB0YWtlIHRoZSBGUyBpdHNlbGYgcmVhZG9ubHkgY2xlYW5seS4gKi8KIAlqb3VybmFsID0gRVhUNF9TQihzYiktPnNfam91cm5hbDsKLQlpZiAoaXNfam91cm5hbF9hYm9ydGVkKGpvdXJuYWwpKSB7Ci0JCWV4dDRfYWJvcnQoc2IsIF9fZnVuY19fLAotCQkJICAgIkRldGVjdGVkIGFib3J0ZWQgam91cm5hbCIpOwotCQlyZXR1cm4gRVJSX1BUUigtRVJPRlMpOworCWlmIChqb3VybmFsKSB7CisJCWlmIChpc19qb3VybmFsX2Fib3J0ZWQoam91cm5hbCkpIHsKKwkJCWV4dDRfYWJvcnQoc2IsIF9fZnVuY19fLAorCQkJCSAgICJEZXRlY3RlZCBhYm9ydGVkIGpvdXJuYWwiKTsKKwkJCXJldHVybiBFUlJfUFRSKC1FUk9GUyk7CisJCX0KKwkJcmV0dXJuIGpiZDJfam91cm5hbF9zdGFydChqb3VybmFsLCBuYmxvY2tzKTsKIAl9Ci0KLQlyZXR1cm4gamJkMl9qb3VybmFsX3N0YXJ0KGpvdXJuYWwsIG5ibG9ja3MpOworCS8qCisJICogV2UncmUgbm90IGpvdXJuYWxpbmcsIHJldHVybiB0aGUgYXBwcm9wcmlhdGUgaW5kaWNhdGlvbi4KKwkgKi8KKwljdXJyZW50LT5qb3VybmFsX2luZm8gPSBFWFQ0X05PSk9VUk5BTF9IQU5ETEU7CisJcmV0dXJuIGN1cnJlbnQtPmpvdXJuYWxfaW5mbzsKIH0KIAogLyoKQEAgLTE1Nyw2ICsyMjUsMTQgQEAKIAlpbnQgZXJyOwogCWludCByYzsKIAorCWlmICghZXh0NF9oYW5kbGVfdmFsaWQoaGFuZGxlKSkgeworCQkvKgorCQkgKiBEbyB0aGlzIGhlcmUgc2luY2Ugd2UgZG9uJ3QgY2FsbCBqYmQyX2pvdXJuYWxfc3RvcCgpIGluCisJCSAqIG5vLWpvdXJuYWwgbW9kZS4KKwkJICovCisJCWN1cnJlbnQtPmpvdXJuYWxfaW5mbyA9IE5VTEw7CisJCXJldHVybiAwOworCX0KIAlzYiA9IGhhbmRsZS0+aF90cmFuc2FjdGlvbi0+dF9qb3VybmFsLT5qX3ByaXZhdGU7CiAJZXJyID0gaGFuZGxlLT5oX2VycjsKIAlyYyA9IGpiZDJfam91cm5hbF9zdG9wKGhhbmRsZSk7CkBAIC0xNzQsNiArMjUwLDggQEAKIAljaGFyIG5idWZbMTZdOwogCWNvbnN0IGNoYXIgKmVycnN0ciA9IGV4dDRfZGVjb2RlX2Vycm9yKE5VTEwsIGVyciwgbmJ1Zik7CiAKKwlCVUdfT04oIWV4dDRfaGFuZGxlX3ZhbGlkKGhhbmRsZSkpOworCiAJaWYgKGJoKQogCQlCVUZGRVJfVFJBQ0UoYmgsICJhYm9ydCIpOwogCkBAIC0zNTAsNiArNDI4LDQ0IEBACiAJdmFfZW5kKGFyZ3MpOwogfQogCit2b2lkIGV4dDRfZ3JwX2xvY2tlZF9lcnJvcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBleHQ0X2dyb3VwX3QgZ3JwLAorCQkJCWNvbnN0IGNoYXIgKmZ1bmN0aW9uLCBjb25zdCBjaGFyICpmbXQsIC4uLikKK19fcmVsZWFzZXMoYml0bG9jaykKK19fYWNxdWlyZXMoYml0bG9jaykKK3sKKwl2YV9saXN0IGFyZ3M7CisJc3RydWN0IGV4dDRfc3VwZXJfYmxvY2sgKmVzID0gRVhUNF9TQihzYiktPnNfZXM7CisKKwl2YV9zdGFydChhcmdzLCBmbXQpOworCXByaW50ayhLRVJOX0NSSVQgIkVYVDQtZnMgZXJyb3IgKGRldmljZSAlcyk6ICVzOiAiLCBzYi0+c19pZCwgZnVuY3Rpb24pOworCXZwcmludGsoZm10LCBhcmdzKTsKKwlwcmludGsoIlxuIik7CisJdmFfZW5kKGFyZ3MpOworCisJaWYgKHRlc3Rfb3B0KHNiLCBFUlJPUlNfQ09OVCkpIHsKKwkJRVhUNF9TQihzYiktPnNfbW91bnRfc3RhdGUgfD0gRVhUNF9FUlJPUl9GUzsKKwkJZXMtPnNfc3RhdGUgfD0gY3B1X3RvX2xlMTYoRVhUNF9FUlJPUl9GUyk7CisJCWV4dDRfY29tbWl0X3N1cGVyKHNiLCBlcywgMCk7CisJCXJldHVybjsKKwl9CisJZXh0NF91bmxvY2tfZ3JvdXAoc2IsIGdycCk7CisJZXh0NF9oYW5kbGVfZXJyb3Ioc2IpOworCS8qCisJICogV2Ugb25seSBnZXQgaGVyZSBpbiB0aGUgRVJST1JTX1JPIGNhc2U7IHJlbG9ja2luZyB0aGUgZ3JvdXAKKwkgKiBtYXkgYmUgZGFuZ2Vyb3VzLCBidXQgbm90aGluZyBiYWQgd2lsbCBoYXBwZW4gc2luY2UgdGhlCisJICogZmlsZXN5c3RlbSB3aWxsIGhhdmUgYWxyZWFkeSBiZWVuIG1hcmtlZCByZWFkL29ubHkgYW5kIHRoZQorCSAqIGpvdXJuYWwgaGFzIGJlZW4gYWJvcnRlZC4gIFdlIHJldHVybiAxIGFzIGEgaGludCB0byBjYWxsZXJzCisJICogd2hvIG1pZ2h0IHdoYXQgdG8gdXNlIHRoZSByZXR1cm4gdmFsdWUgZnJvbQorCSAqIGV4dDRfZ3JwX2xvY2tlZF9lcnJvcigpIHRvIGRpc3Rpbmd1aXNoIGJld2VlbiB0aGUKKwkgKiBFUlJPUlNfQ09OVCBhbmQgRVJST1JTX1JPIGNhc2UsIGFuZCBwZXJoYXBzIHJldHVybiBtb3JlCisJICogYWdncmVzc2l2ZWx5IGZyb20gdGhlIGV4dDQgZnVuY3Rpb24gaW4gcXVlc3Rpb24sIHdpdGggYQorCSAqIG1vcmUgYXBwcm9wcmlhdGUgZXJyb3IgY29kZS4KKwkgKi8KKwlleHQ0X2xvY2tfZ3JvdXAoc2IsIGdycCk7CisJcmV0dXJuOworfQorCisKIHZvaWQgZXh0NF91cGRhdGVfZHluYW1pY19yZXYoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKIHsKIAlzdHJ1Y3QgZXh0NF9zdXBlcl9ibG9jayAqZXMgPSBFWFQ0X1NCKHNiKS0+c19lczsKQEAgLTM4OSw3ICs1MDUsNyBAQAogCXJldHVybiBiZGV2OwogCiBmYWlsOgotCXByaW50ayhLRVJOX0VSUiAiRVhUNDogZmFpbGVkIHRvIG9wZW4gam91cm5hbCBkZXZpY2UgJXM6ICVsZFxuIiwKKwlwcmludGsoS0VSTl9FUlIgIkVYVDQtZnM6IGZhaWxlZCB0byBvcGVuIGpvdXJuYWwgZGV2aWNlICVzOiAlbGRcbiIsCiAJCQlfX2JkZXZuYW1lKGRldiwgYiksIFBUUl9FUlIoYmRldikpOwogCXJldHVybiBOVUxMOwogfQpAQCAtNDQ4LDExICs1NjQsMTMgQEAKIAlleHQ0X21iX3JlbGVhc2Uoc2IpOwogCWV4dDRfZXh0X3JlbGVhc2Uoc2IpOwogCWV4dDRfeGF0dHJfcHV0X3N1cGVyKHNiKTsKLQllcnIgPSBqYmQyX2pvdXJuYWxfZGVzdHJveShzYmktPnNfam91cm5hbCk7Ci0Jc2JpLT5zX2pvdXJuYWwgPSBOVUxMOwotCWlmIChlcnIgPCAwKQotCQlleHQ0X2Fib3J0KHNiLCBfX2Z1bmNfXywgIkNvdWxkbid0IGNsZWFuIHVwIHRoZSBqb3VybmFsIik7Ci0KKwlpZiAoc2JpLT5zX2pvdXJuYWwpIHsKKwkJZXJyID0gamJkMl9qb3VybmFsX2Rlc3Ryb3koc2JpLT5zX2pvdXJuYWwpOworCQlzYmktPnNfam91cm5hbCA9IE5VTEw7CisJCWlmIChlcnIgPCAwKQorCQkJZXh0NF9hYm9ydChzYiwgX19mdW5jX18sCisJCQkJICAgIkNvdWxkbid0IGNsZWFuIHVwIHRoZSBqb3VybmFsIik7CisJfQogCWlmICghKHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSkgewogCQlFWFQ0X0NMRUFSX0lOQ09NUEFUX0ZFQVRVUkUoc2IsIEVYVDRfRkVBVFVSRV9JTkNPTVBBVF9SRUNPVkVSKTsKIAkJZXMtPnNfc3RhdGUgPSBjcHVfdG9fbGUxNihzYmktPnNfbW91bnRfc3RhdGUpOwpAQCAtNTIyLDYgKzY0MCwxMSBAQAogCW1lbXNldCgmZWktPmlfY2FjaGVkX2V4dGVudCwgMCwgc2l6ZW9mKHN0cnVjdCBleHQ0X2V4dF9jYWNoZSkpOwogCUlOSVRfTElTVF9IRUFEKCZlaS0+aV9wcmVhbGxvY19saXN0KTsKIAlzcGluX2xvY2tfaW5pdCgmZWktPmlfcHJlYWxsb2NfbG9jayk7CisJLyoKKwkgKiBOb3RlOiAgV2UgY2FuIGJlIGNhbGxlZCBiZWZvcmUgRVhUNF9TQihzYiktPnNfam91cm5hbCBpcyBzZXQsCisJICogdGhlcmVmb3JlIGl0IGNhbiBiZSBudWxsIGhlcmUuICBEb24ndCBjaGVjayBpdCwganVzdCBpbml0aWFsaXplCisJICogamlub2RlLgorCSAqLwogCWpiZDJfam91cm5hbF9pbml0X2piZF9pbm9kZSgmZWktPmppbm9kZSwgJmVpLT52ZnNfaW5vZGUpOwogCWVpLT5pX3Jlc2VydmVkX2RhdGFfYmxvY2tzID0gMDsKIAllaS0+aV9yZXNlcnZlZF9tZXRhX2Jsb2NrcyA9IDA7CkBAIC01ODgsNyArNzExLDggQEAKIAl9CiAjZW5kaWYKIAlleHQ0X2Rpc2NhcmRfcHJlYWxsb2NhdGlvbnMoaW5vZGUpOwotCWpiZDJfam91cm5hbF9yZWxlYXNlX2piZF9pbm9kZShFWFQ0X1NCKGlub2RlLT5pX3NiKS0+c19qb3VybmFsLAorCWlmIChFWFQ0X0pPVVJOQUwoaW5vZGUpKQorCQlqYmQyX2pvdXJuYWxfcmVsZWFzZV9qYmRfaW5vZGUoRVhUNF9TQihpbm9kZS0+aV9zYiktPnNfam91cm5hbCwKIAkJCQkgICAgICAgJkVYVDRfSShpbm9kZSktPmppbm9kZSk7CiB9CiAKQEAgLTY4MSwxMCArODA1LDE5IEBACiAjZW5kaWYKIAlpZiAoIXRlc3Rfb3B0KHNiLCBSRVNFUlZBVElPTikpCiAJCXNlcV9wdXRzKHNlcSwgIixub3Jlc2VydmF0aW9uIik7Ci0JaWYgKHNiaS0+c19jb21taXRfaW50ZXJ2YWwpIHsKKwlpZiAoc2JpLT5zX2NvbW1pdF9pbnRlcnZhbCAhPSBKQkQyX0RFRkFVTFRfTUFYX0NPTU1JVF9BR0UqSFopIHsKIAkJc2VxX3ByaW50ZihzZXEsICIsY29tbWl0PSV1IiwKIAkJCSAgICh1bnNpZ25lZCkgKHNiaS0+c19jb21taXRfaW50ZXJ2YWwgLyBIWikpOwogCX0KKwlpZiAoc2JpLT5zX21pbl9iYXRjaF90aW1lICE9IEVYVDRfREVGX01JTl9CQVRDSF9USU1FKSB7CisJCXNlcV9wcmludGYoc2VxLCAiLG1pbl9iYXRjaF90aW1lPSV1IiwKKwkJCSAgICh1bnNpZ25lZCkgc2JpLT5zX21pbl9iYXRjaF90aW1lKTsKKwl9CisJaWYgKHNiaS0+c19tYXhfYmF0Y2hfdGltZSAhPSBFWFQ0X0RFRl9NQVhfQkFUQ0hfVElNRSkgeworCQlzZXFfcHJpbnRmKHNlcSwgIixtYXhfYmF0Y2hfdGltZT0ldSIsCisJCQkgICAodW5zaWduZWQpIHNiaS0+c19taW5fYmF0Y2hfdGltZSk7CisJfQorCiAJLyoKIAkgKiBXZSdyZSBjaGFuZ2luZyB0aGUgZGVmYXVsdCBvZiBiYXJyaWVyIG1vdW50IG9wdGlvbiwgc28KIAkgKiBsZXQncyBhbHdheXMgZGlzcGxheSBpdHMgbW91bnQgc3RhdGUgc28gaXQncyBjbGVhciB3aGF0IGl0cwpAQCAtNjk2LDggKzgyOSw2IEBACiAJCXNlcV9wdXRzKHNlcSwgIixqb3VybmFsX2FzeW5jX2NvbW1pdCIpOwogCWlmICh0ZXN0X29wdChzYiwgTk9CSCkpCiAJCXNlcV9wdXRzKHNlcSwgIixub2JoIik7Ci0JaWYgKCF0ZXN0X29wdChzYiwgRVhURU5UUykpCi0JCXNlcV9wdXRzKHNlcSwgIixub2V4dGVudHMiKTsKIAlpZiAodGVzdF9vcHQoc2IsIElfVkVSU0lPTikpCiAJCXNlcV9wdXRzKHNlcSwgIixpX3ZlcnNpb24iKTsKIAlpZiAoIXRlc3Rfb3B0KHNiLCBERUxBTExPQykpCkBAIC03NzIsNiArOTAzLDI1IEBACiAJCQkJICAgIGV4dDRfbmZzX2dldF9pbm9kZSk7CiB9CiAKKy8qCisgKiBUcnkgdG8gcmVsZWFzZSBtZXRhZGF0YSBwYWdlcyAoaW5kaXJlY3QgYmxvY2tzLCBkaXJlY3Rvcmllcykgd2hpY2ggYXJlCisgKiBtYXBwZWQgdmlhIHRoZSBibG9jayBkZXZpY2UuICBTaW5jZSB0aGVzZSBwYWdlcyBjb3VsZCBoYXZlIGpvdXJuYWwgaGVhZHMKKyAqIHdoaWNoIHdvdWxkIHByZXZlbnQgdHJ5X3RvX2ZyZWVfYnVmZmVycygpIGZyb20gZnJlZWluZyB0aGVtLCB3ZSBtdXN0IHVzZQorICogamJkMiBsYXllcidzIHRyeV90b19mcmVlX2J1ZmZlcnMoKSBmdW5jdGlvbiB0byByZWxlYXNlIHRoZW0uCisgKi8KK3N0YXRpYyBpbnQgYmRldl90cnlfdG9fZnJlZV9wYWdlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBwYWdlICpwYWdlLCBnZnBfdCB3YWl0KQoreworCWpvdXJuYWxfdCAqam91cm5hbCA9IEVYVDRfU0Ioc2IpLT5zX2pvdXJuYWw7CisKKwlXQVJOX09OKFBhZ2VDaGVja2VkKHBhZ2UpKTsKKwlpZiAoIXBhZ2VfaGFzX2J1ZmZlcnMocGFnZSkpCisJCXJldHVybiAwOworCWlmIChqb3VybmFsKQorCQlyZXR1cm4gamJkMl9qb3VybmFsX3RyeV90b19mcmVlX2J1ZmZlcnMoam91cm5hbCwgcGFnZSwKKwkJCQkJCQl3YWl0ICYgfl9fR0ZQX1dBSVQpOworCXJldHVybiB0cnlfdG9fZnJlZV9idWZmZXJzKHBhZ2UpOworfQorCiAjaWZkZWYgQ09ORklHX1FVT1RBCiAjZGVmaW5lIFFUWVBFMk5BTUUodCkgKCh0KSA9PSBVU1JRVU9UQSA/ICJ1c2VyIiA6ICJncm91cCIpCiAjZGVmaW5lIFFUWVBFMk1PUFQob24sIHQpICgodCkgPT0gVVNSUVVPVEE/KChvbikjI1VTUkpRVU9UQSk6KChvbikjI0dSUEpRVU9UQSkpCkBAIC04MjgsOCArOTc4LDggQEAKIAkucHV0X3N1cGVyCT0gZXh0NF9wdXRfc3VwZXIsCiAJLndyaXRlX3N1cGVyCT0gZXh0NF93cml0ZV9zdXBlciwKIAkuc3luY19mcwk9IGV4dDRfc3luY19mcywKLQkud3JpdGVfc3VwZXJfbG9ja2ZzID0gZXh0NF93cml0ZV9zdXBlcl9sb2NrZnMsCi0JLnVubG9ja2ZzCT0gZXh0NF91bmxvY2tmcywKKwkuZnJlZXplX2ZzCT0gZXh0NF9mcmVlemUsCisJLnVuZnJlZXplX2ZzCT0gZXh0NF91bmZyZWV6ZSwKIAkuc3RhdGZzCQk9IGV4dDRfc3RhdGZzLAogCS5yZW1vdW50X2ZzCT0gZXh0NF9yZW1vdW50LAogCS5jbGVhcl9pbm9kZQk9IGV4dDRfY2xlYXJfaW5vZGUsCkBAIC04MzgsNiArOTg4LDcgQEAKIAkucXVvdGFfcmVhZAk9IGV4dDRfcXVvdGFfcmVhZCwKIAkucXVvdGFfd3JpdGUJPSBleHQ0X3F1b3RhX3dyaXRlLAogI2VuZGlmCisJLmJkZXZfdHJ5X3RvX2ZyZWVfcGFnZSA9IGJkZXZfdHJ5X3RvX2ZyZWVfcGFnZSwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZXhwb3J0X29wZXJhdGlvbnMgZXh0NF9leHBvcnRfb3BzID0gewpAQCAtODUyLDE2ICsxMDAzLDE3IEBACiAJT3B0X25vdWlkMzIsIE9wdF9kZWJ1ZywgT3B0X29sZGFsbG9jLCBPcHRfb3Jsb3YsCiAJT3B0X3VzZXJfeGF0dHIsIE9wdF9ub3VzZXJfeGF0dHIsIE9wdF9hY2wsIE9wdF9ub2FjbCwKIAlPcHRfcmVzZXJ2YXRpb24sIE9wdF9ub3Jlc2VydmF0aW9uLCBPcHRfbm9sb2FkLCBPcHRfbm9iaCwgT3B0X2JoLAotCU9wdF9jb21taXQsIE9wdF9qb3VybmFsX3VwZGF0ZSwgT3B0X2pvdXJuYWxfaW51bSwgT3B0X2pvdXJuYWxfZGV2LAorCU9wdF9jb21taXQsIE9wdF9taW5fYmF0Y2hfdGltZSwgT3B0X21heF9iYXRjaF90aW1lLAorCU9wdF9qb3VybmFsX3VwZGF0ZSwgT3B0X2pvdXJuYWxfZGV2LAogCU9wdF9qb3VybmFsX2NoZWNrc3VtLCBPcHRfam91cm5hbF9hc3luY19jb21taXQsCiAJT3B0X2Fib3J0LCBPcHRfZGF0YV9qb3VybmFsLCBPcHRfZGF0YV9vcmRlcmVkLCBPcHRfZGF0YV93cml0ZWJhY2ssCiAJT3B0X2RhdGFfZXJyX2Fib3J0LCBPcHRfZGF0YV9lcnJfaWdub3JlLAogCU9wdF91c3JqcXVvdGEsIE9wdF9ncnBqcXVvdGEsIE9wdF9vZmZ1c3JqcXVvdGEsIE9wdF9vZmZncnBqcXVvdGEsCiAJT3B0X2pxZm10X3Zmc29sZCwgT3B0X2pxZm10X3Zmc3YwLCBPcHRfcXVvdGEsIE9wdF9ub3F1b3RhLAogCU9wdF9pZ25vcmUsIE9wdF9iYXJyaWVyLCBPcHRfZXJyLCBPcHRfcmVzaXplLCBPcHRfdXNycXVvdGEsCi0JT3B0X2dycHF1b3RhLCBPcHRfZXh0ZW50cywgT3B0X25vZXh0ZW50cywgT3B0X2lfdmVyc2lvbiwKKwlPcHRfZ3JwcXVvdGEsIE9wdF9pX3ZlcnNpb24sCiAJT3B0X3N0cmlwZSwgT3B0X2RlbGFsbG9jLCBPcHRfbm9kZWxhbGxvYywKLQlPcHRfaW5vZGVfcmVhZGFoZWFkX2Jsa3MKKwlPcHRfaW5vZGVfcmVhZGFoZWFkX2Jsa3MsIE9wdF9qb3VybmFsX2lvcHJpbwogfTsKIAogc3RhdGljIGNvbnN0IG1hdGNoX3RhYmxlX3QgdG9rZW5zID0gewpAQCAtODkxLDggKzEwNDMsOSBAQAogCXtPcHRfbm9iaCwgIm5vYmgifSwKIAl7T3B0X2JoLCAiYmgifSwKIAl7T3B0X2NvbW1pdCwgImNvbW1pdD0ldSJ9LAorCXtPcHRfbWluX2JhdGNoX3RpbWUsICJtaW5fYmF0Y2hfdGltZT0ldSJ9LAorCXtPcHRfbWF4X2JhdGNoX3RpbWUsICJtYXhfYmF0Y2hfdGltZT0ldSJ9LAogCXtPcHRfam91cm5hbF91cGRhdGUsICJqb3VybmFsPXVwZGF0ZSJ9LAotCXtPcHRfam91cm5hbF9pbnVtLCAiam91cm5hbD0ldSJ9LAogCXtPcHRfam91cm5hbF9kZXYsICJqb3VybmFsX2Rldj0ldSJ9LAogCXtPcHRfam91cm5hbF9jaGVja3N1bSwgImpvdXJuYWxfY2hlY2tzdW0ifSwKIAl7T3B0X2pvdXJuYWxfYXN5bmNfY29tbWl0LCAiam91cm5hbF9hc3luY19jb21taXQifSwKQEAgLTkxMywxNCArMTA2NiwxMyBAQAogCXtPcHRfcXVvdGEsICJxdW90YSJ9LAogCXtPcHRfdXNycXVvdGEsICJ1c3JxdW90YSJ9LAogCXtPcHRfYmFycmllciwgImJhcnJpZXI9JXUifSwKLQl7T3B0X2V4dGVudHMsICJleHRlbnRzIn0sCi0Je09wdF9ub2V4dGVudHMsICJub2V4dGVudHMifSwKIAl7T3B0X2lfdmVyc2lvbiwgImlfdmVyc2lvbiJ9LAogCXtPcHRfc3RyaXBlLCAic3RyaXBlPSV1In0sCiAJe09wdF9yZXNpemUsICJyZXNpemUifSwKIAl7T3B0X2RlbGFsbG9jLCAiZGVsYWxsb2MifSwKIAl7T3B0X25vZGVsYWxsb2MsICJub2RlbGFsbG9jIn0sCiAJe09wdF9pbm9kZV9yZWFkYWhlYWRfYmxrcywgImlub2RlX3JlYWRhaGVhZF9ibGtzPSV1In0sCisJe09wdF9qb3VybmFsX2lvcHJpbywgImpvdXJuYWxfaW9wcmlvPSV1In0sCiAJe09wdF9lcnIsIE5VTEx9LAogfTsKIApAQCAtOTQ1LDggKzEwOTcsMTEgQEAKIAlyZXR1cm4gc2JfYmxvY2s7CiB9CiAKKyNkZWZpbmUgREVGQVVMVF9KT1VSTkFMX0lPUFJJTyAoSU9QUklPX1BSSU9fVkFMVUUoSU9QUklPX0NMQVNTX0JFLCAzKSkKKwogc3RhdGljIGludCBwYXJzZV9vcHRpb25zKGNoYXIgKm9wdGlvbnMsIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCi0JCQkgdW5zaWduZWQgaW50ICppbnVtLCB1bnNpZ25lZCBsb25nICpqb3VybmFsX2Rldm51bSwKKwkJCSB1bnNpZ25lZCBsb25nICpqb3VybmFsX2Rldm51bSwKKwkJCSB1bnNpZ25lZCBpbnQgKmpvdXJuYWxfaW9wcmlvLAogCQkJIGV4dDRfZnNibGtfdCAqbl9ibG9ja3NfY291bnQsIGludCBpc19yZW1vdW50KQogewogCXN0cnVjdCBleHQ0X3NiX2luZm8gKnNiaSA9IEVYVDRfU0Ioc2IpOwpAQCAtOTU4LDcgKzExMTMsNiBAQAogCWludCBxdHlwZSwgcWZtdDsKIAljaGFyICpxbmFtZTsKICNlbmRpZgotCWV4dDRfZnNibGtfdCBsYXN0X2Jsb2NrOwogCiAJaWYgKCFvcHRpb25zKQogCQlyZXR1cm4gMTsKQEAgLTEwNzAsMTYgKzEyMjQsNiBAQAogCQkJfQogCQkJc2V0X29wdChzYmktPnNfbW91bnRfb3B0LCBVUERBVEVfSk9VUk5BTCk7CiAJCQlicmVhazsKLQkJY2FzZSBPcHRfam91cm5hbF9pbnVtOgotCQkJaWYgKGlzX3JlbW91bnQpIHsKLQkJCQlwcmludGsoS0VSTl9FUlIgIkVYVDQtZnM6IGNhbm5vdCBzcGVjaWZ5ICIKLQkJCQkgICAgICAgImpvdXJuYWwgb24gcmVtb3VudFxuIik7Ci0JCQkJcmV0dXJuIDA7Ci0JCQl9Ci0JCQlpZiAobWF0Y2hfaW50KCZhcmdzWzBdLCAmb3B0aW9uKSkKLQkJCQlyZXR1cm4gMDsKLQkJCSppbnVtID0gb3B0aW9uOwotCQkJYnJlYWs7CiAJCWNhc2UgT3B0X2pvdXJuYWxfZGV2OgogCQkJaWYgKGlzX3JlbW91bnQpIHsKIAkJCQlwcmludGsoS0VSTl9FUlIgIkVYVDQtZnM6IGNhbm5vdCBzcGVjaWZ5ICIKQEAgLTExMDksNiArMTI1MywyMiBAQAogCQkJCW9wdGlvbiA9IEpCRDJfREVGQVVMVF9NQVhfQ09NTUlUX0FHRTsKIAkJCXNiaS0+c19jb21taXRfaW50ZXJ2YWwgPSBIWiAqIG9wdGlvbjsKIAkJCWJyZWFrOworCQljYXNlIE9wdF9tYXhfYmF0Y2hfdGltZToKKwkJCWlmIChtYXRjaF9pbnQoJmFyZ3NbMF0sICZvcHRpb24pKQorCQkJCXJldHVybiAwOworCQkJaWYgKG9wdGlvbiA8IDApCisJCQkJcmV0dXJuIDA7CisJCQlpZiAob3B0aW9uID09IDApCisJCQkJb3B0aW9uID0gRVhUNF9ERUZfTUFYX0JBVENIX1RJTUU7CisJCQlzYmktPnNfbWF4X2JhdGNoX3RpbWUgPSBvcHRpb247CisJCQlicmVhazsKKwkJY2FzZSBPcHRfbWluX2JhdGNoX3RpbWU6CisJCQlpZiAobWF0Y2hfaW50KCZhcmdzWzBdLCAmb3B0aW9uKSkKKwkJCQlyZXR1cm4gMDsKKwkJCWlmIChvcHRpb24gPCAwKQorCQkJCXJldHVybiAwOworCQkJc2JpLT5zX21pbl9iYXRjaF90aW1lID0gb3B0aW9uOworCQkJYnJlYWs7CiAJCWNhc2UgT3B0X2RhdGFfam91cm5hbDoKIAkJCWRhdGFfb3B0ID0gRVhUNF9NT1VOVF9KT1VSTkFMX0RBVEE7CiAJCQlnb3RvIGRhdGFjaGVjazsKQEAgLTEyNzksMzMgKzE0MzksNiBAQAogCQljYXNlIE9wdF9iaDoKIAkJCWNsZWFyX29wdChzYmktPnNfbW91bnRfb3B0LCBOT0JIKTsKIAkJCWJyZWFrOwotCQljYXNlIE9wdF9leHRlbnRzOgotCQkJaWYgKCFFWFQ0X0hBU19JTkNPTVBBVF9GRUFUVVJFKHNiLAotCQkJCQlFWFQ0X0ZFQVRVUkVfSU5DT01QQVRfRVhURU5UUykpIHsKLQkJCQlleHQ0X3dhcm5pbmcoc2IsIF9fZnVuY19fLAotCQkJCQkiZXh0ZW50cyBmZWF0dXJlIG5vdCBlbmFibGVkICIKLQkJCQkJIm9uIHRoaXMgZmlsZXN5c3RlbSwgdXNlIHR1bmUyZnNcbiIpOwotCQkJCXJldHVybiAwOwotCQkJfQotCQkJc2V0X29wdChzYmktPnNfbW91bnRfb3B0LCBFWFRFTlRTKTsKLQkJCWJyZWFrOwotCQljYXNlIE9wdF9ub2V4dGVudHM6Ci0JCQkvKgotCQkJICogV2hlbiBlMmZzcHJvZ3Mgc3VwcG9ydCByZXNpemluZyBhbiBhbHJlYWR5IGV4aXN0aW5nCi0JCQkgKiBleHQzIGZpbGUgc3lzdGVtIHRvIGdyZWF0ZXIgdGhhbiAyKiozMiB3ZSBuZWVkIHRvCi0JCQkgKiBhZGQgc3VwcG9ydCB0byBibG9jayBhbGxvY2F0b3IgdG8gaGFuZGxlIGdyb3dpbmcKLQkJCSAqIGFscmVhZHkgZXhpc3RpbmcgYmxvY2sgIG1hcHBlZCBpbm9kZSBzbyB0aGF0IGJsb2NrcwotCQkJICogYWxsb2NhdGVkIGZvciB0aGVtIGZhbGwgd2l0aGluIDIqKjMyCi0JCQkgKi8KLQkJCWxhc3RfYmxvY2sgPSBleHQ0X2Jsb2Nrc19jb3VudChzYmktPnNfZXMpIC0gMTsKLQkJCWlmIChsYXN0X2Jsb2NrICA+IDB4ZmZmZmZmZmZVTEwpIHsKLQkJCQlwcmludGsoS0VSTl9FUlIgIkVYVDQtZnM6IEZpbGVzeXN0ZW0gdG9vICIKLQkJCQkJCSJsYXJnZSB0byBtb3VudCB3aXRoICIKLQkJCQkJCSItbyBub2V4dGVudHMgb3B0aW9uc1xuIik7Ci0JCQkJcmV0dXJuIDA7Ci0JCQl9Ci0JCQljbGVhcl9vcHQoc2JpLT5zX21vdW50X29wdCwgRVhURU5UUyk7Ci0JCQlicmVhazsKIAkJY2FzZSBPcHRfaV92ZXJzaW9uOgogCQkJc2V0X29wdChzYmktPnNfbW91bnRfb3B0LCBJX1ZFUlNJT04pOwogCQkJc2ItPnNfZmxhZ3MgfD0gTVNfSV9WRVJTSU9OOwpAQCAtMTMzMCw2ICsxNDYzLDE0IEBACiAJCQkJcmV0dXJuIDA7CiAJCQlzYmktPnNfaW5vZGVfcmVhZGFoZWFkX2Jsa3MgPSBvcHRpb247CiAJCQlicmVhazsKKwkJY2FzZSBPcHRfam91cm5hbF9pb3ByaW86CisJCQlpZiAobWF0Y2hfaW50KCZhcmdzWzBdLCAmb3B0aW9uKSkKKwkJCQlyZXR1cm4gMDsKKwkJCWlmIChvcHRpb24gPCAwIHx8IG9wdGlvbiA+IDcpCisJCQkJYnJlYWs7CisJCQkqam91cm5hbF9pb3ByaW8gPSBJT1BSSU9fUFJJT19WQUxVRShJT1BSSU9fQ0xBU1NfQkUsCisJCQkJCQkJICAgIG9wdGlvbik7CisJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCXByaW50ayhLRVJOX0VSUgogCQkJICAgICAgICJFWFQ0LWZzOiBVbnJlY29nbml6ZWQgbW91bnQgb3B0aW9uIFwiJXNcIiAiCkBAIC0xNDA1LDI0ICsxNTQ2LDE5IEBACiAJCXByaW50ayhLRVJOX1dBUk5JTkcKIAkJICAgICAgICJFWFQ0LWZzIHdhcm5pbmc6IGNoZWNrdGltZSByZWFjaGVkLCAiCiAJCSAgICAgICAicnVubmluZyBlMmZzY2sgaXMgcmVjb21tZW5kZWRcbiIpOwotI2lmIDAKLQkJLyogQEBAIFdlIF93aWxsXyB3YW50IHRvIGNsZWFyIHRoZSB2YWxpZCBiaXQgaWYgd2UgZmluZAotCQkgKiBpbmNvbnNpc3RlbmNpZXMsIHRvIGZvcmNlIGEgZnNjayBhdCByZWJvb3QuICBCdXQgZm9yCi0JCSAqIGEgcGxhaW4gam91cm5hbGVkIGZpbGVzeXN0ZW0gd2UgY2FuIGtlZXAgaXQgc2V0IGFzCi0JCSAqIHZhbGlkIGZvcmV2ZXIhIDopCi0JCSAqLwotCWVzLT5zX3N0YXRlICY9IGNwdV90b19sZTE2KH5FWFQ0X1ZBTElEX0ZTKTsKLSNlbmRpZgorCWlmICghc2JpLT5zX2pvdXJuYWwpIAorCQllcy0+c19zdGF0ZSAmPSBjcHVfdG9fbGUxNih+RVhUNF9WQUxJRF9GUyk7CiAJaWYgKCEoX19zMTYpIGxlMTZfdG9fY3B1KGVzLT5zX21heF9tbnRfY291bnQpKQogCQllcy0+c19tYXhfbW50X2NvdW50ID0gY3B1X3RvX2xlMTYoRVhUNF9ERkxfTUFYX01OVF9DT1VOVCk7CiAJbGUxNl9hZGRfY3B1KCZlcy0+c19tbnRfY291bnQsIDEpOwogCWVzLT5zX210aW1lID0gY3B1X3RvX2xlMzIoZ2V0X3NlY29uZHMoKSk7CiAJZXh0NF91cGRhdGVfZHluYW1pY19yZXYoc2IpOwotCUVYVDRfU0VUX0lOQ09NUEFUX0ZFQVRVUkUoc2IsIEVYVDRfRkVBVFVSRV9JTkNPTVBBVF9SRUNPVkVSKTsKKwlpZiAoc2JpLT5zX2pvdXJuYWwpCisJCUVYVDRfU0VUX0lOQ09NUEFUX0ZFQVRVUkUoc2IsIEVYVDRfRkVBVFVSRV9JTkNPTVBBVF9SRUNPVkVSKTsKIAogCWV4dDRfY29tbWl0X3N1cGVyKHNiLCBlcywgMSk7CiAJaWYgKHRlc3Rfb3B0KHNiLCBERUJVRykpCi0JCXByaW50ayhLRVJOX0lORk8gIltFWFQ0IEZTIGJzPSVsdSwgZ2M9JWx1LCAiCisJCXByaW50ayhLRVJOX0lORk8gIltFWFQ0IEZTIGJzPSVsdSwgZ2M9JXUsICIKIAkJCQkiYnBnPSVsdSwgaXBnPSVsdSwgbW89JTA0bHhdXG4iLAogCQkJc2ItPnNfYmxvY2tzaXplLAogCQkJc2JpLT5zX2dyb3Vwc19jb3VudCwKQEAgLTE0MzAsOSArMTU2NiwxMyBAQAogCQkJRVhUNF9JTk9ERVNfUEVSX0dST1VQKHNiKSwKIAkJCXNiaS0+c19tb3VudF9vcHQpOwogCi0JcHJpbnRrKEtFUk5fSU5GTyAiRVhUNCBGUyBvbiAlcywgJXMgam91cm5hbCBvbiAlc1xuIiwKLQkgICAgICAgc2ItPnNfaWQsIEVYVDRfU0Ioc2IpLT5zX2pvdXJuYWwtPmpfaW5vZGUgPyAiaW50ZXJuYWwiIDoKLQkgICAgICAgImV4dGVybmFsIiwgRVhUNF9TQihzYiktPnNfam91cm5hbC0+al9kZXZuYW1lKTsKKwlpZiAoRVhUNF9TQihzYiktPnNfam91cm5hbCkgeworCQlwcmludGsoS0VSTl9JTkZPICJFWFQ0IEZTIG9uICVzLCAlcyBqb3VybmFsIG9uICVzXG4iLAorCQkgICAgICAgc2ItPnNfaWQsIEVYVDRfU0Ioc2IpLT5zX2pvdXJuYWwtPmpfaW5vZGUgPyAiaW50ZXJuYWwiIDoKKwkJICAgICAgICJleHRlcm5hbCIsIEVYVDRfU0Ioc2IpLT5zX2pvdXJuYWwtPmpfZGV2bmFtZSk7CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiRVhUNCBGUyBvbiAlcywgbm8gam91cm5hbFxuIiwgc2ItPnNfaWQpOworCX0KIAlyZXR1cm4gcmVzOwogfQogCkBAIC0xNDQ0LDcgKzE1ODQsNiBAQAogCWV4dDRfZ3JvdXBfdCBmbGV4X2dyb3VwX2NvdW50OwogCWV4dDRfZ3JvdXBfdCBmbGV4X2dyb3VwOwogCWludCBncm91cHNfcGVyX2ZsZXggPSAwOwotCV9fdTY0IGJsb2NrX2JpdG1hcCA9IDA7CiAJaW50IGk7CiAKIAlpZiAoIXNiaS0+c19lcy0+c19sb2dfZ3JvdXBzX3Blcl9mbGV4KSB7CkBAIC0xNDYzLDIxICsxNjAyLDE4IEBACiAJCQkJICAgICBzaXplb2Yoc3RydWN0IGZsZXhfZ3JvdXBzKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKHNiaS0+c19mbGV4X2dyb3VwcyA9PSBOVUxMKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiRVhUNC1mczogbm90IGVub3VnaCBtZW1vcnkgZm9yICIKLQkJCQkiJWx1IGZsZXggZ3JvdXBzXG4iLCBmbGV4X2dyb3VwX2NvdW50KTsKKwkJCQkiJXUgZmxleCBncm91cHNcbiIsIGZsZXhfZ3JvdXBfY291bnQpOwogCQlnb3RvIGZhaWxlZDsKIAl9CiAKLQlnZHAgPSBleHQ0X2dldF9ncm91cF9kZXNjKHNiLCAxLCAmYmgpOwotCWJsb2NrX2JpdG1hcCA9IGV4dDRfYmxvY2tfYml0bWFwKHNiLCBnZHApIC0gMTsKLQogCWZvciAoaSA9IDA7IGkgPCBzYmktPnNfZ3JvdXBzX2NvdW50OyBpKyspIHsKIAkJZ2RwID0gZXh0NF9nZXRfZ3JvdXBfZGVzYyhzYiwgaSwgJmJoKTsKIAogCQlmbGV4X2dyb3VwID0gZXh0NF9mbGV4X2dyb3VwKHNiaSwgaSk7CiAJCXNiaS0+c19mbGV4X2dyb3Vwc1tmbGV4X2dyb3VwXS5mcmVlX2lub2RlcyArPQotCQkJbGUxNl90b19jcHUoZ2RwLT5iZ19mcmVlX2lub2Rlc19jb3VudCk7CisJCQlleHQ0X2ZyZWVfaW5vZGVzX2NvdW50KHNiLCBnZHApOwogCQlzYmktPnNfZmxleF9ncm91cHNbZmxleF9ncm91cF0uZnJlZV9ibG9ja3MgKz0KLQkJCWxlMTZfdG9fY3B1KGdkcC0+YmdfZnJlZV9ibG9ja3NfY291bnQpOworCQkJZXh0NF9mcmVlX2Jsa3NfY291bnQoc2IsIGdkcCk7CiAJfQogCiAJcmV0dXJuIDE7CkBAIC0xNTUxLDE0ICsxNjg3LDE0IEBACiAJCWJsb2NrX2JpdG1hcCA9IGV4dDRfYmxvY2tfYml0bWFwKHNiLCBnZHApOwogCQlpZiAoYmxvY2tfYml0bWFwIDwgZmlyc3RfYmxvY2sgfHwgYmxvY2tfYml0bWFwID4gbGFzdF9ibG9jaykgewogCQkJcHJpbnRrKEtFUk5fRVJSICJFWFQ0LWZzOiBleHQ0X2NoZWNrX2Rlc2NyaXB0b3JzOiAiCi0JCQkgICAgICAgIkJsb2NrIGJpdG1hcCBmb3IgZ3JvdXAgJWx1IG5vdCBpbiBncm91cCAiCisJCQkgICAgICAgIkJsb2NrIGJpdG1hcCBmb3IgZ3JvdXAgJXUgbm90IGluIGdyb3VwICIKIAkJCSAgICAgICAiKGJsb2NrICVsbHUpIVxuIiwgaSwgYmxvY2tfYml0bWFwKTsKIAkJCXJldHVybiAwOwogCQl9CiAJCWlub2RlX2JpdG1hcCA9IGV4dDRfaW5vZGVfYml0bWFwKHNiLCBnZHApOwogCQlpZiAoaW5vZGVfYml0bWFwIDwgZmlyc3RfYmxvY2sgfHwgaW5vZGVfYml0bWFwID4gbGFzdF9ibG9jaykgewogCQkJcHJpbnRrKEtFUk5fRVJSICJFWFQ0LWZzOiBleHQ0X2NoZWNrX2Rlc2NyaXB0b3JzOiAiCi0JCQkgICAgICAgIklub2RlIGJpdG1hcCBmb3IgZ3JvdXAgJWx1IG5vdCBpbiBncm91cCAiCisJCQkgICAgICAgIklub2RlIGJpdG1hcCBmb3IgZ3JvdXAgJXUgbm90IGluIGdyb3VwICIKIAkJCSAgICAgICAiKGJsb2NrICVsbHUpIVxuIiwgaSwgaW5vZGVfYml0bWFwKTsKIAkJCXJldHVybiAwOwogCQl9CkBAIC0xNTY2LDE0ICsxNzAyLDE0IEBACiAJCWlmIChpbm9kZV90YWJsZSA8IGZpcnN0X2Jsb2NrIHx8CiAJCSAgICBpbm9kZV90YWJsZSArIHNiaS0+c19pdGJfcGVyX2dyb3VwIC0gMSA+IGxhc3RfYmxvY2spIHsKIAkJCXByaW50ayhLRVJOX0VSUiAiRVhUNC1mczogZXh0NF9jaGVja19kZXNjcmlwdG9yczogIgotCQkJICAgICAgICJJbm9kZSB0YWJsZSBmb3IgZ3JvdXAgJWx1IG5vdCBpbiBncm91cCAiCisJCQkgICAgICAgIklub2RlIHRhYmxlIGZvciBncm91cCAldSBub3QgaW4gZ3JvdXAgIgogCQkJICAgICAgICIoYmxvY2sgJWxsdSkhXG4iLCBpLCBpbm9kZV90YWJsZSk7CiAJCQlyZXR1cm4gMDsKIAkJfQogCQlzcGluX2xvY2soc2JfYmdsX2xvY2soc2JpLCBpKSk7CiAJCWlmICghZXh0NF9ncm91cF9kZXNjX2NzdW1fdmVyaWZ5KHNiaSwgaSwgZ2RwKSkgewogCQkJcHJpbnRrKEtFUk5fRVJSICJFWFQ0LWZzOiBleHQ0X2NoZWNrX2Rlc2NyaXB0b3JzOiAiCi0JCQkgICAgICAgIkNoZWNrc3VtIGZvciBncm91cCAlbHUgZmFpbGVkICgldSE9JXUpXG4iLAorCQkJICAgICAgICJDaGVja3N1bSBmb3IgZ3JvdXAgJXUgZmFpbGVkICgldSE9JXUpXG4iLAogCQkJICAgICAgIGksIGxlMTZfdG9fY3B1KGV4dDRfZ3JvdXBfZGVzY19jc3VtKHNiaSwgaSwKIAkJCSAgICAgICBnZHApKSwgbGUxNl90b19jcHUoZ2RwLT5iZ19jaGVja3N1bSkpOwogCQkJaWYgKCEoc2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkpKSB7CkBAIC0xODY1LDE5ICsyMDAxLDIwIEBACiAJZXh0NF9mc2Jsa190IHNiX2Jsb2NrID0gZ2V0X3NiX2Jsb2NrKCZkYXRhKTsKIAlleHQ0X2ZzYmxrX3QgbG9naWNhbF9zYl9ibG9jazsKIAl1bnNpZ25lZCBsb25nIG9mZnNldCA9IDA7Ci0JdW5zaWduZWQgaW50IGpvdXJuYWxfaW51bSA9IDA7CiAJdW5zaWduZWQgbG9uZyBqb3VybmFsX2Rldm51bSA9IDA7CiAJdW5zaWduZWQgbG9uZyBkZWZfbW91bnRfb3B0czsKIAlzdHJ1Y3QgaW5vZGUgKnJvb3Q7CiAJY2hhciAqY3A7CisJY29uc3QgY2hhciAqZGVzY3I7CiAJaW50IHJldCA9IC1FSU5WQUw7CiAJaW50IGJsb2Nrc2l6ZTsKLQlpbnQgZGJfY291bnQ7Ci0JaW50IGk7CisJdW5zaWduZWQgaW50IGRiX2NvdW50OworCXVuc2lnbmVkIGludCBpOwogCWludCBuZWVkc19yZWNvdmVyeSwgaGFzX2h1Z2VfZmlsZXM7Ci0JX19sZTMyIGZlYXR1cmVzOworCWludCBmZWF0dXJlczsKIAlfX3U2NCBibG9ja3NfY291bnQ7CiAJaW50IGVycjsKKwl1bnNpZ25lZCBpbnQgam91cm5hbF9pb3ByaW8gPSBERUZBVUxUX0pPVVJOQUxfSU9QUklPOwogCiAJc2JpID0ga3phbGxvYyhzaXplb2YoKnNiaSksIEdGUF9LRVJORUwpOwogCWlmICghc2JpKQpAQCAtMTk1OCwzMSArMjA5NSwyMiBAQAogCiAJc2JpLT5zX3Jlc3VpZCA9IGxlMTZfdG9fY3B1KGVzLT5zX2RlZl9yZXN1aWQpOwogCXNiaS0+c19yZXNnaWQgPSBsZTE2X3RvX2NwdShlcy0+c19kZWZfcmVzZ2lkKTsKKwlzYmktPnNfY29tbWl0X2ludGVydmFsID0gSkJEMl9ERUZBVUxUX01BWF9DT01NSVRfQUdFICogSFo7CisJc2JpLT5zX21pbl9iYXRjaF90aW1lID0gRVhUNF9ERUZfTUlOX0JBVENIX1RJTUU7CisJc2JpLT5zX21heF9iYXRjaF90aW1lID0gRVhUNF9ERUZfTUFYX0JBVENIX1RJTUU7CiAKIAlzZXRfb3B0KHNiaS0+c19tb3VudF9vcHQsIFJFU0VSVkFUSU9OKTsKIAlzZXRfb3B0KHNiaS0+c19tb3VudF9vcHQsIEJBUlJJRVIpOwogCiAJLyoKLQkgKiB0dXJuIG9uIGV4dGVudHMgZmVhdHVyZSBieSBkZWZhdWx0IGluIGV4dDQgZmlsZXN5c3RlbQotCSAqIG9ubHkgaWYgZmVhdHVyZSBmbGFnIGFscmVhZHkgc2V0IGJ5IG1rZnMgb3IgdHVuZTJmcy4KLQkgKiBVc2UgLW8gbm9leHRlbnRzIHRvIHR1cm4gaXQgb2ZmCi0JICovCi0JaWYgKEVYVDRfSEFTX0lOQ09NUEFUX0ZFQVRVUkUoc2IsIEVYVDRfRkVBVFVSRV9JTkNPTVBBVF9FWFRFTlRTKSkKLQkJc2V0X29wdChzYmktPnNfbW91bnRfb3B0LCBFWFRFTlRTKTsKLQllbHNlCi0JCWV4dDRfd2FybmluZyhzYiwgX19mdW5jX18sCi0JCQkiZXh0ZW50cyBmZWF0dXJlIG5vdCBlbmFibGVkIG9uIHRoaXMgZmlsZXN5c3RlbSwgIgotCQkJInVzZSB0dW5lMmZzLlxuIik7Ci0KLQkvKgogCSAqIGVuYWJsZSBkZWxheWVkIGFsbG9jYXRpb24gYnkgZGVmYXVsdAogCSAqIFVzZSAtbyBub2RlbGFsbG9jIHRvIHR1cm4gaXQgb2ZmCiAJICovCiAJc2V0X29wdChzYmktPnNfbW91bnRfb3B0LCBERUxBTExPQyk7CiAKIAotCWlmICghcGFyc2Vfb3B0aW9ucygoY2hhciAqKSBkYXRhLCBzYiwgJmpvdXJuYWxfaW51bSwgJmpvdXJuYWxfZGV2bnVtLAotCQkJICAgTlVMTCwgMCkpCisJaWYgKCFwYXJzZV9vcHRpb25zKChjaGFyICopIGRhdGEsIHNiLCAmam91cm5hbF9kZXZudW0sCisJCQkgICAmam91cm5hbF9pb3ByaW8sIE5VTEwsIDApKQogCQlnb3RvIGZhaWxlZF9tb3VudDsKIAogCXNiLT5zX2ZsYWdzID0gKHNiLT5zX2ZsYWdzICYgfk1TX1BPU0lYQUNMKSB8CkBAIC0yMDA0LDE1ICsyMTMyLDE3IEBACiAJZmVhdHVyZXMgPSBFWFQ0X0hBU19JTkNPTVBBVF9GRUFUVVJFKHNiLCB+RVhUNF9GRUFUVVJFX0lOQ09NUEFUX1NVUFApOwogCWlmIChmZWF0dXJlcykgewogCQlwcmludGsoS0VSTl9FUlIgIkVYVDQtZnM6ICVzOiBjb3VsZG4ndCBtb3VudCBiZWNhdXNlIG9mICIKLQkJICAgICAgICJ1bnN1cHBvcnRlZCBvcHRpb25hbCBmZWF0dXJlcyAoJXgpLlxuIiwKLQkJICAgICAgIHNiLT5zX2lkLCBsZTMyX3RvX2NwdShmZWF0dXJlcykpOworCQkgICAgICAgInVuc3VwcG9ydGVkIG9wdGlvbmFsIGZlYXR1cmVzICgleCkuXG4iLCBzYi0+c19pZCwKKwkJCShsZTMyX3RvX2NwdShFWFQ0X1NCKHNiKS0+c19lcy0+c19mZWF0dXJlX2luY29tcGF0KSAmCisJCQl+RVhUNF9GRUFUVVJFX0lOQ09NUEFUX1NVUFApKTsKIAkJZ290byBmYWlsZWRfbW91bnQ7CiAJfQogCWZlYXR1cmVzID0gRVhUNF9IQVNfUk9fQ09NUEFUX0ZFQVRVUkUoc2IsIH5FWFQ0X0ZFQVRVUkVfUk9fQ09NUEFUX1NVUFApOwogCWlmICghKHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSAmJiBmZWF0dXJlcykgewogCQlwcmludGsoS0VSTl9FUlIgIkVYVDQtZnM6ICVzOiBjb3VsZG4ndCBtb3VudCBSRFdSIGJlY2F1c2Ugb2YgIgotCQkgICAgICAgInVuc3VwcG9ydGVkIG9wdGlvbmFsIGZlYXR1cmVzICgleCkuXG4iLAotCQkgICAgICAgc2ItPnNfaWQsIGxlMzJfdG9fY3B1KGZlYXR1cmVzKSk7CisJCSAgICAgICAidW5zdXBwb3J0ZWQgb3B0aW9uYWwgZmVhdHVyZXMgKCV4KS5cbiIsIHNiLT5zX2lkLAorCQkJKGxlMzJfdG9fY3B1KEVYVDRfU0Ioc2IpLT5zX2VzLT5zX2ZlYXR1cmVfcm9fY29tcGF0KSAmCisJCQl+RVhUNF9GRUFUVVJFX1JPX0NPTVBBVF9TVVBQKSk7CiAJCWdvdG8gZmFpbGVkX21vdW50OwogCX0KIAloYXNfaHVnZV9maWxlcyA9IEVYVDRfSEFTX1JPX0NPTVBBVF9GRUFUVVJFKHNiLApAQCAtMjExNyw2ICsyMjQ3LDE4IEBACiAJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKIAkJc2JpLT5zX2hhc2hfc2VlZFtpXSA9IGxlMzJfdG9fY3B1KGVzLT5zX2hhc2hfc2VlZFtpXSk7CiAJc2JpLT5zX2RlZl9oYXNoX3ZlcnNpb24gPSBlcy0+c19kZWZfaGFzaF92ZXJzaW9uOworCWkgPSBsZTMyX3RvX2NwdShlcy0+c19mbGFncyk7CisJaWYgKGkgJiBFWFQyX0ZMQUdTX1VOU0lHTkVEX0hBU0gpCisJCXNiaS0+c19oYXNoX3Vuc2lnbmVkID0gMzsKKwllbHNlIGlmICgoaSAmIEVYVDJfRkxBR1NfU0lHTkVEX0hBU0gpID09IDApIHsKKyNpZmRlZiBfX0NIQVJfVU5TSUdORURfXworCQllcy0+c19mbGFncyB8PSBjcHVfdG9fbGUzMihFWFQyX0ZMQUdTX1VOU0lHTkVEX0hBU0gpOworCQlzYmktPnNfaGFzaF91bnNpZ25lZCA9IDM7CisjZWxzZQorCQllcy0+c19mbGFncyB8PSBjcHVfdG9fbGUzMihFWFQyX0ZMQUdTX1NJR05FRF9IQVNIKTsKKyNlbmRpZgorCQlzYi0+c19kaXJ0ID0gMTsKKwl9CiAKIAlpZiAoc2JpLT5zX2Jsb2Nrc19wZXJfZ3JvdXAgPiBibG9ja3NpemUgKiA4KSB7CiAJCXByaW50ayhLRVJOX0VSUgpAQCAtMjE0NCwyMCArMjI4NiwzMCBAQAogCWlmIChFWFQ0X0JMT0NLU19QRVJfR1JPVVAoc2IpID09IDApCiAJCWdvdG8gY2FudGZpbmRfZXh0NDsKIAotCS8qIGVuc3VyZSBibG9ja3NfY291bnQgY2FsY3VsYXRpb24gYmVsb3cgZG9lc24ndCBzaWduLWV4dGVuZCAqLwotCWlmIChleHQ0X2Jsb2Nrc19jb3VudChlcykgKyBFWFQ0X0JMT0NLU19QRVJfR1JPVVAoc2IpIDwKLQkgICAgbGUzMl90b19jcHUoZXMtPnNfZmlyc3RfZGF0YV9ibG9jaykgKyAxKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIkVYVDQtZnM6IGJhZCBnZW9tZXRyeTogYmxvY2sgY291bnQgJWxsdSwgIgotCQkgICAgICAgImZpcnN0IGRhdGEgYmxvY2sgJXUsIGJsb2NrcyBwZXIgZ3JvdXAgJWx1XG4iLAotCQkJZXh0NF9ibG9ja3NfY291bnQoZXMpLAotCQkJbGUzMl90b19jcHUoZXMtPnNfZmlyc3RfZGF0YV9ibG9jayksCi0JCQlFWFQ0X0JMT0NLU19QRVJfR1JPVVAoc2IpKTsKKyAgICAgICAgLyoKKyAgICAgICAgICogSXQgbWFrZXMgbm8gc2Vuc2UgZm9yIHRoZSBmaXJzdCBkYXRhIGJsb2NrIHRvIGJlIGJleW9uZCB0aGUgZW5kCisgICAgICAgICAqIG9mIHRoZSBmaWxlc3lzdGVtLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKGxlMzJfdG9fY3B1KGVzLT5zX2ZpcnN0X2RhdGFfYmxvY2spID49IGV4dDRfYmxvY2tzX2NvdW50KGVzKSkgeworICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX1dBUk5JTkcgIkVYVDQtZnM6IGJhZCBnZW9tZXRyeTogZmlyc3QgZGF0YSIKKwkJICAgICAgICJibG9jayAldSBpcyBiZXlvbmQgZW5kIG9mIGZpbGVzeXN0ZW0gKCVsbHUpXG4iLAorCQkgICAgICAgbGUzMl90b19jcHUoZXMtPnNfZmlyc3RfZGF0YV9ibG9jayksCisJCSAgICAgICBleHQ0X2Jsb2Nrc19jb3VudChlcykpOwogCQlnb3RvIGZhaWxlZF9tb3VudDsKIAl9CiAJYmxvY2tzX2NvdW50ID0gKGV4dDRfYmxvY2tzX2NvdW50KGVzKSAtCiAJCQlsZTMyX3RvX2NwdShlcy0+c19maXJzdF9kYXRhX2Jsb2NrKSArCiAJCQlFWFQ0X0JMT0NLU19QRVJfR1JPVVAoc2IpIC0gMSk7CiAJZG9fZGl2KGJsb2Nrc19jb3VudCwgRVhUNF9CTE9DS1NfUEVSX0dST1VQKHNiKSk7CisJaWYgKGJsb2Nrc19jb3VudCA+ICgodWludDY0X3QpMTw8MzIpIC0gRVhUNF9ERVNDX1BFUl9CTE9DSyhzYikpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiRVhUNC1mczogZ3JvdXBzIGNvdW50IHRvbyBsYXJnZTogJXUgIgorCQkgICAgICAgIihibG9jayBjb3VudCAlbGx1LCBmaXJzdCBkYXRhIGJsb2NrICV1LCAiCisJCSAgICAgICAiYmxvY2tzIHBlciBncm91cCAlbHUpXG4iLCBzYmktPnNfZ3JvdXBzX2NvdW50LAorCQkgICAgICAgZXh0NF9ibG9ja3NfY291bnQoZXMpLAorCQkgICAgICAgbGUzMl90b19jcHUoZXMtPnNfZmlyc3RfZGF0YV9ibG9jayksCisJCSAgICAgICBFWFQ0X0JMT0NLU19QRVJfR1JPVVAoc2IpKTsKKwkJZ290byBmYWlsZWRfbW91bnQ7CisJfQogCXNiaS0+c19ncm91cHNfY291bnQgPSBibG9ja3NfY291bnQ7CiAJZGJfY291bnQgPSAoc2JpLT5zX2dyb3Vwc19jb3VudCArIEVYVDRfREVTQ19QRVJfQkxPQ0soc2IpIC0gMSkgLwogCQkgICBFWFQ0X0RFU0NfUEVSX0JMT0NLKHNiKTsKQEAgLTIyNjksMjcgKzI0MjEsMjYgQEAKIAkJCQlFWFQ0X1NCKHNiKS0+c19tb3VudF9zdGF0ZSB8PSBFWFQ0X0VSUk9SX0ZTOwogCQkJCWVzLT5zX3N0YXRlIHw9IGNwdV90b19sZTE2KEVYVDRfRVJST1JfRlMpOwogCQkJCWV4dDRfY29tbWl0X3N1cGVyKHNiLCBlcywgMSk7Ci0JCQkJcHJpbnRrKEtFUk5fQ1JJVAotCQkJCSAgICAgICAiRVhUNC1mcyAoZGV2aWNlICVzKTogbW91bnQgZmFpbGVkXG4iLAotCQkJCSAgICAgIHNiLT5zX2lkKTsKIAkJCQlnb3RvIGZhaWxlZF9tb3VudDQ7CiAJCQl9CiAJCX0KLQl9IGVsc2UgaWYgKGpvdXJuYWxfaW51bSkgewotCQlpZiAoZXh0NF9jcmVhdGVfam91cm5hbChzYiwgZXMsIGpvdXJuYWxfaW51bSkpCi0JCQlnb3RvIGZhaWxlZF9tb3VudDM7CisJfSBlbHNlIGlmICh0ZXN0X29wdChzYiwgTk9MT0FEKSAmJiAhKHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSAmJgorCSAgICAgIEVYVDRfSEFTX0lOQ09NUEFUX0ZFQVRVUkUoc2IsIEVYVDRfRkVBVFVSRV9JTkNPTVBBVF9SRUNPVkVSKSkgeworCQlwcmludGsoS0VSTl9FUlIgIkVYVDQtZnM6IHJlcXVpcmVkIGpvdXJuYWwgcmVjb3ZlcnkgIgorCQkgICAgICAgInN1cHByZXNzZWQgYW5kIG5vdCBtb3VudGVkIHJlYWQtb25seVxuIik7CisJCWdvdG8gZmFpbGVkX21vdW50NDsKIAl9IGVsc2UgewotCQlpZiAoIXNpbGVudCkKLQkJCXByaW50ayhLRVJOX0VSUgotCQkJICAgICAgICJleHQ0OiBObyBqb3VybmFsIG9uIGZpbGVzeXN0ZW0gb24gJXNcbiIsCi0JCQkgICAgICAgc2ItPnNfaWQpOwotCQlnb3RvIGZhaWxlZF9tb3VudDM7CisJCWNsZWFyX29wdChzYmktPnNfbW91bnRfb3B0LCBEQVRBX0ZMQUdTKTsKKwkJc2V0X29wdChzYmktPnNfbW91bnRfb3B0LCBXUklURUJBQ0tfREFUQSk7CisJCXNiaS0+c19qb3VybmFsID0gTlVMTDsKKwkJbmVlZHNfcmVjb3ZlcnkgPSAwOworCQlnb3RvIG5vX2pvdXJuYWw7CiAJfQogCiAJaWYgKGV4dDRfYmxvY2tzX2NvdW50KGVzKSA+IDB4ZmZmZmZmZmZVTEwgJiYKIAkgICAgIWpiZDJfam91cm5hbF9zZXRfZmVhdHVyZXMoRVhUNF9TQihzYiktPnNfam91cm5hbCwgMCwgMCwKIAkJCQkgICAgICAgSkJEMl9GRUFUVVJFX0lOQ09NUEFUXzY0QklUKSkgewotCQlwcmludGsoS0VSTl9FUlIgImV4dDQ6IEZhaWxlZCB0byBzZXQgNjQtYml0IGpvdXJuYWwgZmVhdHVyZVxuIik7CisJCXByaW50ayhLRVJOX0VSUiAiRVhUNC1mczogRmFpbGVkIHRvIHNldCA2NC1iaXQgam91cm5hbCBmZWF0dXJlXG4iKTsKIAkJZ290byBmYWlsZWRfbW91bnQ0OwogCX0KIApAQCAtMjMzNCw2ICsyNDg1LDkgQEAKIAlkZWZhdWx0OgogCQlicmVhazsKIAl9CisJc2V0X3Rhc2tfaW9wcmlvKHNiaS0+c19qb3VybmFsLT5qX3Rhc2ssIGpvdXJuYWxfaW9wcmlvKTsKKworbm9fam91cm5hbDoKIAogCWlmICh0ZXN0X29wdChzYiwgTk9CSCkpIHsKIAkJaWYgKCEodGVzdF9vcHQoc2IsIERBVEFfRkxBR1MpID09IEVYVDRfTU9VTlRfV1JJVEVCQUNLX0RBVEEpKSB7CkBAIC0yNDE5LDEzICsyNTczLDIyIEBACiAJRVhUNF9TQihzYiktPnNfbW91bnRfc3RhdGUgfD0gRVhUNF9PUlBIQU5fRlM7CiAJZXh0NF9vcnBoYW5fY2xlYW51cChzYiwgZXMpOwogCUVYVDRfU0Ioc2IpLT5zX21vdW50X3N0YXRlICY9IH5FWFQ0X09SUEhBTl9GUzsKLQlpZiAobmVlZHNfcmVjb3ZlcnkpCisJaWYgKG5lZWRzX3JlY292ZXJ5KSB7CiAJCXByaW50ayhLRVJOX0lORk8gIkVYVDQtZnM6IHJlY292ZXJ5IGNvbXBsZXRlLlxuIik7Ci0JZXh0NF9tYXJrX3JlY292ZXJ5X2NvbXBsZXRlKHNiLCBlcyk7Ci0JcHJpbnRrKEtFUk5fSU5GTyAiRVhUNC1mczogbW91bnRlZCBmaWxlc3lzdGVtIHdpdGggJXMgZGF0YSBtb2RlLlxuIiwKLQkgICAgICAgdGVzdF9vcHQoc2IsIERBVEFfRkxBR1MpID09IEVYVDRfTU9VTlRfSk9VUk5BTF9EQVRBID8gImpvdXJuYWwiOgotCSAgICAgICB0ZXN0X29wdChzYiwgREFUQV9GTEFHUykgPT0gRVhUNF9NT1VOVF9PUkRFUkVEX0RBVEEgPyAib3JkZXJlZCI6Ci0JICAgICAgICJ3cml0ZWJhY2siKTsKKwkJZXh0NF9tYXJrX3JlY292ZXJ5X2NvbXBsZXRlKHNiLCBlcyk7CisJfQorCWlmIChFWFQ0X1NCKHNiKS0+c19qb3VybmFsKSB7CisJCWlmICh0ZXN0X29wdChzYiwgREFUQV9GTEFHUykgPT0gRVhUNF9NT1VOVF9KT1VSTkFMX0RBVEEpCisJCQlkZXNjciA9ICIgam91cm5hbGxlZCBkYXRhIG1vZGUiOworCQllbHNlIGlmICh0ZXN0X29wdChzYiwgREFUQV9GTEFHUykgPT0gRVhUNF9NT1VOVF9PUkRFUkVEX0RBVEEpCisJCQlkZXNjciA9ICIgb3JkZXJlZCBkYXRhIG1vZGUiOworCQllbHNlCisJCQlkZXNjciA9ICIgd3JpdGViYWNrIGRhdGEgbW9kZSI7CisJfSBlbHNlCisJCWRlc2NyID0gIm91dCBqb3VybmFsIjsKKworCXByaW50ayhLRVJOX0lORk8gIkVYVDQtZnM6IG1vdW50ZWQgZmlsZXN5c3RlbSAlcyB3aXRoJXNcbiIsCisJICAgICAgIHNiLT5zX2lkLCBkZXNjcik7CiAKIAlsb2NrX2tlcm5lbCgpOwogCXJldHVybiAwOwpAQCAtMjQzNyw4ICsyNjAwLDExIEBACiAJZ290byBmYWlsZWRfbW91bnQ7CiAKIGZhaWxlZF9tb3VudDQ6Ci0JamJkMl9qb3VybmFsX2Rlc3Ryb3koc2JpLT5zX2pvdXJuYWwpOwotCXNiaS0+c19qb3VybmFsID0gTlVMTDsKKwlwcmludGsoS0VSTl9FUlIgIkVYVDQtZnMgKGRldmljZSAlcyk6IG1vdW50IGZhaWxlZFxuIiwgc2ItPnNfaWQpOworCWlmIChzYmktPnNfam91cm5hbCkgeworCQlqYmQyX2pvdXJuYWxfZGVzdHJveShzYmktPnNfam91cm5hbCk7CisJCXNiaS0+c19qb3VybmFsID0gTlVMTDsKKwl9CiBmYWlsZWRfbW91bnQzOgogCXBlcmNwdV9jb3VudGVyX2Rlc3Ryb3koJnNiaS0+c19mcmVlYmxvY2tzX2NvdW50ZXIpOwogCXBlcmNwdV9jb3VudGVyX2Rlc3Ryb3koJnNiaS0+c19mcmVlaW5vZGVzX2NvdW50ZXIpOwpAQCAtMjQ3NSwxMSArMjY0MSw5IEBACiB7CiAJc3RydWN0IGV4dDRfc2JfaW5mbyAqc2JpID0gRVhUNF9TQihzYik7CiAKLQlpZiAoc2JpLT5zX2NvbW1pdF9pbnRlcnZhbCkKLQkJam91cm5hbC0+al9jb21taXRfaW50ZXJ2YWwgPSBzYmktPnNfY29tbWl0X2ludGVydmFsOwotCS8qIFdlIGNvdWxkIGFsc28gc2V0IHVwIGFuIGV4dDQtc3BlY2lmaWMgZGVmYXVsdCBmb3IgdGhlIGNvbW1pdAotCSAqIGludGVydmFsIGhlcmUsIGJ1dCBmb3Igbm93IHdlJ2xsIGp1c3QgZmFsbCBiYWNrIHRvIHRoZSBqYmQKLQkgKiBkZWZhdWx0LiAqLworCWpvdXJuYWwtPmpfY29tbWl0X2ludGVydmFsID0gc2JpLT5zX2NvbW1pdF9pbnRlcnZhbDsKKwlqb3VybmFsLT5qX21pbl9iYXRjaF90aW1lID0gc2JpLT5zX21pbl9iYXRjaF90aW1lOworCWpvdXJuYWwtPmpfbWF4X2JhdGNoX3RpbWUgPSBzYmktPnNfbWF4X2JhdGNoX3RpbWU7CiAKIAlzcGluX2xvY2soJmpvdXJuYWwtPmpfc3RhdGVfbG9jayk7CiAJaWYgKHRlc3Rfb3B0KHNiLCBCQVJSSUVSKSkKQEAgLTI0OTksNiArMjY2Myw4IEBACiAJc3RydWN0IGlub2RlICpqb3VybmFsX2lub2RlOwogCWpvdXJuYWxfdCAqam91cm5hbDsKIAorCUJVR19PTighRVhUNF9IQVNfQ09NUEFUX0ZFQVRVUkUoc2IsIEVYVDRfRkVBVFVSRV9DT01QQVRfSEFTX0pPVVJOQUwpKTsKKwogCS8qIEZpcnN0LCB0ZXN0IGZvciB0aGUgZXhpc3RlbmNlIG9mIGEgdmFsaWQgaW5vZGUgb24gZGlzay4gIEJhZAogCSAqIHRoaW5ncyBoYXBwZW4gaWYgd2UgaWdldCgpIGFuIHVudXNlZCBpbm9kZSwgYXMgdGhlIHN1YnNlcXVlbnQKIAkgKiBpcHV0KCkgd2lsbCB0cnkgdG8gZGVsZXRlIGl0LiAqLwpAQCAtMjU0NywxMyArMjcxMywxNSBAQAogCXN0cnVjdCBleHQ0X3N1cGVyX2Jsb2NrICplczsKIAlzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2OwogCisJQlVHX09OKCFFWFQ0X0hBU19DT01QQVRfRkVBVFVSRShzYiwgRVhUNF9GRUFUVVJFX0NPTVBBVF9IQVNfSk9VUk5BTCkpOworCiAJYmRldiA9IGV4dDRfYmxrZGV2X2dldChqX2Rldik7CiAJaWYgKGJkZXYgPT0gTlVMTCkKIAkJcmV0dXJuIE5VTEw7CiAKIAlpZiAoYmRfY2xhaW0oYmRldiwgc2IpKSB7CiAJCXByaW50ayhLRVJOX0VSUgotCQkJIkVYVDQ6IGZhaWxlZCB0byBjbGFpbSBleHRlcm5hbCBqb3VybmFsIGRldmljZS5cbiIpOworCQkJIkVYVDQtZnM6IGZhaWxlZCB0byBjbGFpbSBleHRlcm5hbCBqb3VybmFsIGRldmljZS5cbiIpOwogCQlibGtkZXZfcHV0KGJkZXYsIEZNT0RFX1JFQUR8Rk1PREVfV1JJVEUpOwogCQlyZXR1cm4gTlVMTDsKIAl9CkBAIC0yNjM0LDYgKzI4MDIsOCBAQAogCWludCBlcnIgPSAwOwogCWludCByZWFsbHlfcmVhZF9vbmx5OwogCisJQlVHX09OKCFFWFQ0X0hBU19DT01QQVRfRkVBVFVSRShzYiwgRVhUNF9GRUFUVVJFX0NPTVBBVF9IQVNfSk9VUk5BTCkpOworCiAJaWYgKGpvdXJuYWxfZGV2bnVtICYmCiAJICAgIGpvdXJuYWxfZGV2bnVtICE9IGxlMzJfdG9fY3B1KGVzLT5zX2pvdXJuYWxfZGV2KSkgewogCQlwcmludGsoS0VSTl9JTkZPICJFWFQ0LWZzOiBleHRlcm5hbCBqb3VybmFsIGRldmljZSBtYWpvci9taW5vciAiCkBAIC0yNzE4LDU1ICsyODg4LDE0IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgZXh0NF9jcmVhdGVfam91cm5hbChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAotCQkJICAgICAgIHN0cnVjdCBleHQ0X3N1cGVyX2Jsb2NrICplcywKLQkJCSAgICAgICB1bnNpZ25lZCBpbnQgam91cm5hbF9pbnVtKQotewotCWpvdXJuYWxfdCAqam91cm5hbDsKLQlpbnQgZXJyOwotCi0JaWYgKHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiRVhUNC1mczogcmVhZG9ubHkgZmlsZXN5c3RlbSB3aGVuIHRyeWluZyB0byAiCi0JCQkJImNyZWF0ZSBqb3VybmFsLlxuIik7Ci0JCXJldHVybiAtRVJPRlM7Ci0JfQotCi0Jam91cm5hbCA9IGV4dDRfZ2V0X2pvdXJuYWwoc2IsIGpvdXJuYWxfaW51bSk7Ci0JaWYgKCFqb3VybmFsKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXByaW50ayhLRVJOX0lORk8gIkVYVDQtZnM6IGNyZWF0aW5nIG5ldyBqb3VybmFsIG9uIGlub2RlICV1XG4iLAotCSAgICAgICBqb3VybmFsX2ludW0pOwotCi0JZXJyID0gamJkMl9qb3VybmFsX2NyZWF0ZShqb3VybmFsKTsKLQlpZiAoZXJyKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiRVhUNC1mczogZXJyb3IgY3JlYXRpbmcgam91cm5hbC5cbiIpOwotCQlqYmQyX2pvdXJuYWxfZGVzdHJveShqb3VybmFsKTsKLQkJcmV0dXJuIC1FSU87Ci0JfQotCi0JRVhUNF9TQihzYiktPnNfam91cm5hbCA9IGpvdXJuYWw7Ci0KLQlleHQ0X3VwZGF0ZV9keW5hbWljX3JldihzYik7Ci0JRVhUNF9TRVRfSU5DT01QQVRfRkVBVFVSRShzYiwgRVhUNF9GRUFUVVJFX0lOQ09NUEFUX1JFQ09WRVIpOwotCUVYVDRfU0VUX0NPTVBBVF9GRUFUVVJFKHNiLCBFWFQ0X0ZFQVRVUkVfQ09NUEFUX0hBU19KT1VSTkFMKTsKLQotCWVzLT5zX2pvdXJuYWxfaW51bSA9IGNwdV90b19sZTMyKGpvdXJuYWxfaW51bSk7Ci0Jc2ItPnNfZGlydCA9IDE7Ci0KLQkvKiBNYWtlIHN1cmUgd2UgZmx1c2ggdGhlIHJlY292ZXJ5IGZsYWcgdG8gZGlzay4gKi8KLQlleHQ0X2NvbW1pdF9zdXBlcihzYiwgZXMsIDEpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGV4dDRfY29tbWl0X3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCitzdGF0aWMgaW50IGV4dDRfY29tbWl0X3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCiAJCQkgICAgICBzdHJ1Y3QgZXh0NF9zdXBlcl9ibG9jayAqZXMsIGludCBzeW5jKQogewogCXN0cnVjdCBidWZmZXJfaGVhZCAqc2JoID0gRVhUNF9TQihzYiktPnNfc2JoOworCWludCBlcnJvciA9IDA7CiAKIAlpZiAoIXNiaCkKLQkJcmV0dXJuOworCQlyZXR1cm4gZXJyb3I7CiAJaWYgKGJ1ZmZlcl93cml0ZV9pb19lcnJvcihzYmgpKSB7CiAJCS8qCiAJCSAqIE9oLCBkZWFyLiAgQSBwcmV2aW91cyBhdHRlbXB0IHRvIHdyaXRlIHRoZQpAQCAtMjc3NiwyNSArMjkwNSwzMyBAQAogCQkgKiBiZSByZW1hcHBlZC4gIE5vdGhpbmcgd2UgY2FuIGRvIGJ1dCB0byByZXRyeSB0aGUKIAkJICogd3JpdGUgYW5kIGhvcGUgZm9yIHRoZSBiZXN0LgogCQkgKi8KLQkJcHJpbnRrKEtFUk5fRVJSICJleHQ0OiBwcmV2aW91cyBJL08gZXJyb3IgdG8gIgorCQlwcmludGsoS0VSTl9FUlIgIkVYVDQtZnM6IHByZXZpb3VzIEkvTyBlcnJvciB0byAiCiAJCSAgICAgICAic3VwZXJibG9jayBkZXRlY3RlZCBmb3IgJXMuXG4iLCBzYi0+c19pZCk7CiAJCWNsZWFyX2J1ZmZlcl93cml0ZV9pb19lcnJvcihzYmgpOwogCQlzZXRfYnVmZmVyX3VwdG9kYXRlKHNiaCk7CiAJfQogCWVzLT5zX3d0aW1lID0gY3B1X3RvX2xlMzIoZ2V0X3NlY29uZHMoKSk7Ci0JZXh0NF9mcmVlX2Jsb2Nrc19jb3VudF9zZXQoZXMsIGV4dDRfY291bnRfZnJlZV9ibG9ja3Moc2IpKTsKLQllcy0+c19mcmVlX2lub2Rlc19jb3VudCA9IGNwdV90b19sZTMyKGV4dDRfY291bnRfZnJlZV9pbm9kZXMoc2IpKTsKKwlleHQ0X2ZyZWVfYmxvY2tzX2NvdW50X3NldChlcywgcGVyY3B1X2NvdW50ZXJfc3VtX3Bvc2l0aXZlKAorCQkJCQkmRVhUNF9TQihzYiktPnNfZnJlZWJsb2Nrc19jb3VudGVyKSk7CisJZXMtPnNfZnJlZV9pbm9kZXNfY291bnQgPSBjcHVfdG9fbGUzMihwZXJjcHVfY291bnRlcl9zdW1fcG9zaXRpdmUoCisJCQkJCSZFWFQ0X1NCKHNiKS0+c19mcmVlaW5vZGVzX2NvdW50ZXIpKTsKKwogCUJVRkZFUl9UUkFDRShzYmgsICJtYXJraW5nIGRpcnR5Iik7CiAJbWFya19idWZmZXJfZGlydHkoc2JoKTsKIAlpZiAoc3luYykgewotCQlzeW5jX2RpcnR5X2J1ZmZlcihzYmgpOwotCQlpZiAoYnVmZmVyX3dyaXRlX2lvX2Vycm9yKHNiaCkpIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiZXh0NDogSS9PIGVycm9yIHdoaWxlIHdyaXRpbmcgIgorCQllcnJvciA9IHN5bmNfZGlydHlfYnVmZmVyKHNiaCk7CisJCWlmIChlcnJvcikKKwkJCXJldHVybiBlcnJvcjsKKworCQllcnJvciA9IGJ1ZmZlcl93cml0ZV9pb19lcnJvcihzYmgpOworCQlpZiAoZXJyb3IpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiRVhUNC1mczogSS9PIGVycm9yIHdoaWxlIHdyaXRpbmcgIgogCQkJICAgICAgICJzdXBlcmJsb2NrIGZvciAlcy5cbiIsIHNiLT5zX2lkKTsKIAkJCWNsZWFyX2J1ZmZlcl93cml0ZV9pb19lcnJvcihzYmgpOwogCQkJc2V0X2J1ZmZlcl91cHRvZGF0ZShzYmgpOwogCQl9CiAJfQorCXJldHVybiBlcnJvcjsKIH0KIAogCkBAIC0yODA4LDYgKzI5NDUsMTAgQEAKIHsKIAlqb3VybmFsX3QgKmpvdXJuYWwgPSBFWFQ0X1NCKHNiKS0+c19qb3VybmFsOwogCisJaWYgKCFFWFQ0X0hBU19DT01QQVRfRkVBVFVSRShzYiwgRVhUNF9GRUFUVVJFX0NPTVBBVF9IQVNfSk9VUk5BTCkpIHsKKwkJQlVHX09OKGpvdXJuYWwgIT0gTlVMTCk7CisJCXJldHVybjsKKwl9CiAJamJkMl9qb3VybmFsX2xvY2tfdXBkYXRlcyhqb3VybmFsKTsKIAlpZiAoamJkMl9qb3VybmFsX2ZsdXNoKGpvdXJuYWwpIDwgMCkKIAkJZ290byBvdXQ7CkBAIC0yODM3LDYgKzI5NzgsOCBAQAogCWludCBqX2Vycm5vOwogCWNvbnN0IGNoYXIgKmVycnN0cjsKIAorCUJVR19PTighRVhUNF9IQVNfQ09NUEFUX0ZFQVRVUkUoc2IsIEVYVDRfRkVBVFVSRV9DT01QQVRfSEFTX0pPVVJOQUwpKTsKKwogCWpvdXJuYWwgPSBFWFQ0X1NCKHNiKS0+c19qb3VybmFsOwogCiAJLyoKQEAgLTI4NjksMTQgKzMwMTIsMTcgQEAKIGludCBleHQ0X2ZvcmNlX2NvbW1pdChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQogewogCWpvdXJuYWxfdCAqam91cm5hbDsKLQlpbnQgcmV0OworCWludCByZXQgPSAwOwogCiAJaWYgKHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKQogCQlyZXR1cm4gMDsKIAogCWpvdXJuYWwgPSBFWFQ0X1NCKHNiKS0+c19qb3VybmFsOwotCXNiLT5zX2RpcnQgPSAwOwotCXJldCA9IGV4dDRfam91cm5hbF9mb3JjZV9jb21taXQoam91cm5hbCk7CisJaWYgKGpvdXJuYWwpIHsKKwkJc2ItPnNfZGlydCA9IDA7CisJCXJldCA9IGV4dDRfam91cm5hbF9mb3JjZV9jb21taXQoam91cm5hbCk7CisJfQorCiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMjg4OCw5ICszMDM0LDEzIEBACiAgKi8KIHN0YXRpYyB2b2lkIGV4dDRfd3JpdGVfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKIHsKLQlpZiAobXV0ZXhfdHJ5bG9jaygmc2ItPnNfbG9jaykgIT0gMCkKLQkJQlVHKCk7Ci0Jc2ItPnNfZGlydCA9IDA7CisJaWYgKEVYVDRfU0Ioc2IpLT5zX2pvdXJuYWwpIHsKKwkJaWYgKG11dGV4X3RyeWxvY2soJnNiLT5zX2xvY2spICE9IDApCisJCQlCVUcoKTsKKwkJc2ItPnNfZGlydCA9IDA7CisJfSBlbHNlIHsKKwkJZXh0NF9jb21taXRfc3VwZXIoc2IsIEVYVDRfU0Ioc2IpLT5zX2VzLCAxKTsKKwl9CiB9CiAKIHN0YXRpYyBpbnQgZXh0NF9zeW5jX2ZzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCB3YWl0KQpAQCAtMjg5OSwxMCArMzA0OSwxNCBAQAogCiAJdHJhY2VfbWFyayhleHQ0X3N5bmNfZnMsICJkZXYgJXMgd2FpdCAlZCIsIHNiLT5zX2lkLCB3YWl0KTsKIAlzYi0+c19kaXJ0ID0gMDsKLQlpZiAod2FpdCkKLQkJcmV0ID0gZXh0NF9mb3JjZV9jb21taXQoc2IpOwotCWVsc2UKLQkJamJkMl9qb3VybmFsX3N0YXJ0X2NvbW1pdChFWFQ0X1NCKHNiKS0+c19qb3VybmFsLCBOVUxMKTsKKwlpZiAoRVhUNF9TQihzYiktPnNfam91cm5hbCkgeworCQlpZiAod2FpdCkKKwkJCXJldCA9IGV4dDRfZm9yY2VfY29tbWl0KHNiKTsKKwkJZWxzZQorIAkJCWpiZDJfam91cm5hbF9zdGFydF9jb21taXQoRVhUNF9TQihzYiktPnNfam91cm5hbCwgTlVMTCk7CisJfSBlbHNlIHsKKwkJZXh0NF9jb21taXRfc3VwZXIoc2IsIEVYVDRfU0Ioc2IpLT5zX2VzLCB3YWl0KTsKKwl9CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMjkxMCwzNiArMzA2NCw0OCBAQAogICogTFZNIGNhbGxzIHRoaXMgZnVuY3Rpb24gYmVmb3JlIGEgKHJlYWQtb25seSkgc25hcHNob3QgaXMgY3JlYXRlZC4gIFRoaXMKICAqIGdpdmVzIHVzIGEgY2hhbmNlIHRvIGZsdXNoIHRoZSBqb3VybmFsIGNvbXBsZXRlbHkgYW5kIG1hcmsgdGhlIGZzIGNsZWFuLgogICovCi1zdGF0aWMgdm9pZCBleHQ0X3dyaXRlX3N1cGVyX2xvY2tmcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQorc3RhdGljIGludCBleHQ0X2ZyZWV6ZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQogeworCWludCBlcnJvciA9IDA7CisJam91cm5hbF90ICpqb3VybmFsOwogCXNiLT5zX2RpcnQgPSAwOwogCiAJaWYgKCEoc2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkpKSB7Ci0JCWpvdXJuYWxfdCAqam91cm5hbCA9IEVYVDRfU0Ioc2IpLT5zX2pvdXJuYWw7CisJCWpvdXJuYWwgPSBFWFQ0X1NCKHNiKS0+c19qb3VybmFsOwogCi0JCS8qIE5vdyB3ZSBzZXQgdXAgdGhlIGpvdXJuYWwgYmFycmllci4gKi8KLQkJamJkMl9qb3VybmFsX2xvY2tfdXBkYXRlcyhqb3VybmFsKTsKKwkJaWYgKGpvdXJuYWwpIHsKKwkJCS8qIE5vdyB3ZSBzZXQgdXAgdGhlIGpvdXJuYWwgYmFycmllci4gKi8KKwkJCWpiZDJfam91cm5hbF9sb2NrX3VwZGF0ZXMoam91cm5hbCk7CiAKLQkJLyoKLQkJICogV2UgZG9uJ3Qgd2FudCB0byBjbGVhciBuZWVkc19yZWNvdmVyeSBmbGFnIHdoZW4gd2UgZmFpbGVkCi0JCSAqIHRvIGZsdXNoIHRoZSBqb3VybmFsLgotCQkgKi8KLQkJaWYgKGpiZDJfam91cm5hbF9mbHVzaChqb3VybmFsKSA8IDApCi0JCQlyZXR1cm47CisJCQkvKgorCQkJICogV2UgZG9uJ3Qgd2FudCB0byBjbGVhciBuZWVkc19yZWNvdmVyeSBmbGFnIHdoZW4gd2UKKwkJCSAqIGZhaWxlZCB0byBmbHVzaCB0aGUgam91cm5hbC4KKwkJCSAqLworCQkJZXJyb3IgPSBqYmQyX2pvdXJuYWxfZmx1c2goam91cm5hbCk7CisJCQlpZiAoZXJyb3IgPCAwKQorCQkJCWdvdG8gb3V0OworCQl9CiAKIAkJLyogSm91cm5hbCBibG9ja2VkIGFuZCBmbHVzaGVkLCBjbGVhciBuZWVkc19yZWNvdmVyeSBmbGFnLiAqLwogCQlFWFQ0X0NMRUFSX0lOQ09NUEFUX0ZFQVRVUkUoc2IsIEVYVDRfRkVBVFVSRV9JTkNPTVBBVF9SRUNPVkVSKTsKIAkJZXh0NF9jb21taXRfc3VwZXIoc2IsIEVYVDRfU0Ioc2IpLT5zX2VzLCAxKTsKKwkJZXJyb3IgPSBleHQ0X2NvbW1pdF9zdXBlcihzYiwgRVhUNF9TQihzYiktPnNfZXMsIDEpOworCQlpZiAoZXJyb3IpCisJCQlnb3RvIG91dDsKIAl9CisJcmV0dXJuIDA7CitvdXQ6CisJamJkMl9qb3VybmFsX3VubG9ja191cGRhdGVzKGpvdXJuYWwpOworCXJldHVybiBlcnJvcjsKIH0KIAogLyoKICAqIENhbGxlZCBieSBMVk0gYWZ0ZXIgdGhlIHNuYXBzaG90IGlzIGRvbmUuICBXZSBuZWVkIHRvIHJlc2V0IHRoZSBSRUNPVkVSCiAgKiBmbGFnIGhlcmUsIGV2ZW4gdGhvdWdoIHRoZSBmaWxlc3lzdGVtIGlzIG5vdCB0ZWNobmljYWxseSBkaXJ0eSB5ZXQuCiAgKi8KLXN0YXRpYyB2b2lkIGV4dDRfdW5sb2NrZnMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3N0YXRpYyBpbnQgZXh0NF91bmZyZWV6ZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQogewotCWlmICghKHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSkgeworCWlmIChFWFQ0X1NCKHNiKS0+c19qb3VybmFsICYmICEoc2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkpKSB7CiAJCWxvY2tfc3VwZXIoc2IpOwogCQkvKiBSZXNlciB0aGUgbmVlZHNfcmVjb3ZlcnkgZmxhZyBiZWZvcmUgdGhlIGZzIGlzIHVubG9ja2VkLiAqLwogCQlFWFQ0X1NFVF9JTkNPTVBBVF9GRUFUVVJFKHNiLCBFWFQ0X0ZFQVRVUkVfSU5DT01QQVRfUkVDT1ZFUik7CkBAIC0yOTQ3LDYgKzMxMTMsNyBAQAogCQl1bmxvY2tfc3VwZXIoc2IpOwogCQlqYmQyX2pvdXJuYWxfdW5sb2NrX3VwZGF0ZXMoRVhUNF9TQihzYiktPnNfam91cm5hbCk7CiAJfQorCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IGV4dDRfcmVtb3VudChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgKmZsYWdzLCBjaGFyICpkYXRhKQpAQCAtMjk1Nyw2ICszMTI0LDcgQEAKIAl1bnNpZ25lZCBsb25nIG9sZF9zYl9mbGFnczsKIAlzdHJ1Y3QgZXh0NF9tb3VudF9vcHRpb25zIG9sZF9vcHRzOwogCWV4dDRfZ3JvdXBfdCBnOworCXVuc2lnbmVkIGludCBqb3VybmFsX2lvcHJpbyA9IERFRkFVTFRfSk9VUk5BTF9JT1BSSU87CiAJaW50IGVycjsKICNpZmRlZiBDT05GSUdfUVVPVEEKIAlpbnQgaTsKQEAgLTI5NjgsMTYgKzMxMzYsMjEgQEAKIAlvbGRfb3B0cy5zX3Jlc3VpZCA9IHNiaS0+c19yZXN1aWQ7CiAJb2xkX29wdHMuc19yZXNnaWQgPSBzYmktPnNfcmVzZ2lkOwogCW9sZF9vcHRzLnNfY29tbWl0X2ludGVydmFsID0gc2JpLT5zX2NvbW1pdF9pbnRlcnZhbDsKKwlvbGRfb3B0cy5zX21pbl9iYXRjaF90aW1lID0gc2JpLT5zX21pbl9iYXRjaF90aW1lOworCW9sZF9vcHRzLnNfbWF4X2JhdGNoX3RpbWUgPSBzYmktPnNfbWF4X2JhdGNoX3RpbWU7CiAjaWZkZWYgQ09ORklHX1FVT1RBCiAJb2xkX29wdHMuc19qcXVvdGFfZm10ID0gc2JpLT5zX2pxdW90YV9mbXQ7CiAJZm9yIChpID0gMDsgaSA8IE1BWFFVT1RBUzsgaSsrKQogCQlvbGRfb3B0cy5zX3FmX25hbWVzW2ldID0gc2JpLT5zX3FmX25hbWVzW2ldOwogI2VuZGlmCisJaWYgKHNiaS0+c19qb3VybmFsICYmIHNiaS0+c19qb3VybmFsLT5qX3Rhc2stPmlvX2NvbnRleHQpCisJCWpvdXJuYWxfaW9wcmlvID0gc2JpLT5zX2pvdXJuYWwtPmpfdGFzay0+aW9fY29udGV4dC0+aW9wcmlvOwogCiAJLyoKIAkgKiBBbGxvdyB0aGUgImNoZWNrIiBvcHRpb24gdG8gYmUgcGFzc2VkIGFzIGEgcmVtb3VudCBvcHRpb24uCiAJICovCi0JaWYgKCFwYXJzZV9vcHRpb25zKGRhdGEsIHNiLCBOVUxMLCBOVUxMLCAmbl9ibG9ja3NfY291bnQsIDEpKSB7CisJaWYgKCFwYXJzZV9vcHRpb25zKGRhdGEsIHNiLCBOVUxMLCAmam91cm5hbF9pb3ByaW8sCisJCQkgICAmbl9ibG9ja3NfY291bnQsIDEpKSB7CiAJCWVyciA9IC1FSU5WQUw7CiAJCWdvdG8gcmVzdG9yZV9vcHRzOwogCX0KQEAgLTI5OTAsNyArMzE2MywxMCBAQAogCiAJZXMgPSBzYmktPnNfZXM7CiAKLQlleHQ0X2luaXRfam91cm5hbF9wYXJhbXMoc2IsIHNiaS0+c19qb3VybmFsKTsKKwlpZiAoc2JpLT5zX2pvdXJuYWwpIHsKKwkJZXh0NF9pbml0X2pvdXJuYWxfcGFyYW1zKHNiLCBzYmktPnNfam91cm5hbCk7CisJCXNldF90YXNrX2lvcHJpbyhzYmktPnNfam91cm5hbC0+al90YXNrLCBqb3VybmFsX2lvcHJpbyk7CisJfQogCiAJaWYgKCgqZmxhZ3MgJiBNU19SRE9OTFkpICE9IChzYi0+c19mbGFncyAmIE1TX1JET05MWSkgfHwKIAkJbl9ibG9ja3NfY291bnQgPiBleHQ0X2Jsb2Nrc19jb3VudChlcykpIHsKQEAgLTMwMTksMTcgKzMxOTUsMjAgQEAKIAkJCSAqIFdlIGhhdmUgdG8gdW5sb2NrIHN1cGVyIHNvIHRoYXQgd2UgY2FuIHdhaXQgZm9yCiAJCQkgKiB0cmFuc2FjdGlvbnMuCiAJCQkgKi8KLQkJCXVubG9ja19zdXBlcihzYik7Ci0JCQlleHQ0X21hcmtfcmVjb3ZlcnlfY29tcGxldGUoc2IsIGVzKTsKLQkJCWxvY2tfc3VwZXIoc2IpOworCQkJaWYgKHNiaS0+c19qb3VybmFsKSB7CisJCQkJdW5sb2NrX3N1cGVyKHNiKTsKKwkJCQlleHQ0X21hcmtfcmVjb3ZlcnlfY29tcGxldGUoc2IsIGVzKTsKKwkJCQlsb2NrX3N1cGVyKHNiKTsKKwkJCX0KIAkJfSBlbHNlIHsKLQkJCV9fbGUzMiByZXQ7CisJCQlpbnQgcmV0OwogCQkJaWYgKChyZXQgPSBFWFQ0X0hBU19ST19DT01QQVRfRkVBVFVSRShzYiwKIAkJCQkJfkVYVDRfRkVBVFVSRV9ST19DT01QQVRfU1VQUCkpKSB7CiAJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiRVhUNC1mczogJXM6IGNvdWxkbid0ICIKIAkJCQkgICAgICAgInJlbW91bnQgUkRXUiBiZWNhdXNlIG9mIHVuc3VwcG9ydGVkICIKLQkJCQkgICAgICAgIm9wdGlvbmFsIGZlYXR1cmVzICgleCkuXG4iLAotCQkJCSAgICAgICBzYi0+c19pZCwgbGUzMl90b19jcHUocmV0KSk7CisJCQkJICAgICAgICJvcHRpb25hbCBmZWF0dXJlcyAoJXgpLlxuIiwgc2ItPnNfaWQsCisJCQkJKGxlMzJfdG9fY3B1KHNiaS0+c19lcy0+c19mZWF0dXJlX3JvX2NvbXBhdCkgJgorCQkJCQl+RVhUNF9GRUFUVVJFX1JPX0NPTVBBVF9TVVBQKSk7CiAJCQkJZXJyID0gLUVST0ZTOwogCQkJCWdvdG8gcmVzdG9yZV9vcHRzOwogCQkJfQpAQCAtMzA0Niw3ICszMjI1LDcgQEAKIAkJCQlpZiAoIWV4dDRfZ3JvdXBfZGVzY19jc3VtX3ZlcmlmeShzYmksIGcsIGdkcCkpIHsKIAkJCQkJcHJpbnRrKEtFUk5fRVJSCiAJICAgICAgICJFWFQ0LWZzOiBleHQ0X3JlbW91bnQ6ICIKLQkJIkNoZWNrc3VtIGZvciBncm91cCAlbHUgZmFpbGVkICgldSE9JXUpXG4iLAorCQkiQ2hlY2tzdW0gZm9yIGdyb3VwICV1IGZhaWxlZCAoJXUhPSV1KVxuIiwKIAkJZywgbGUxNl90b19jcHUoZXh0NF9ncm91cF9kZXNjX2NzdW0oc2JpLCBnLCBnZHApKSwKIAkJCQkJICAgICAgIGxlMTZfdG9fY3B1KGdkcC0+YmdfY2hlY2tzdW0pKTsKIAkJCQkJZXJyID0gLUVJTlZBTDsKQEAgLTMwNzUsNyArMzI1NCw4IEBACiAJCQkgKiBiZWVuIGNoYW5nZWQgYnkgZTJmc2NrIHNpbmNlIHdlIG9yaWdpbmFsbHkgbW91bnRlZAogCQkJICogdGhlIHBhcnRpdGlvbi4pCiAJCQkgKi8KLQkJCWV4dDRfY2xlYXJfam91cm5hbF9lcnIoc2IsIGVzKTsKKwkJCWlmIChzYmktPnNfam91cm5hbCkKKwkJCQlleHQ0X2NsZWFyX2pvdXJuYWxfZXJyKHNiLCBlcyk7CiAJCQlzYmktPnNfbW91bnRfc3RhdGUgPSBsZTE2X3RvX2NwdShlcy0+c19zdGF0ZSk7CiAJCQlpZiAoKGVyciA9IGV4dDRfZ3JvdXBfZXh0ZW5kKHNiLCBlcywgbl9ibG9ja3NfY291bnQpKSkKIAkJCQlnb3RvIHJlc3RvcmVfb3B0czsKQEAgLTMwODMsNiArMzI2Myw5IEBACiAJCQkJc2ItPnNfZmxhZ3MgJj0gfk1TX1JET05MWTsKIAkJfQogCX0KKwlpZiAoc2JpLT5zX2pvdXJuYWwgPT0gTlVMTCkKKwkJZXh0NF9jb21taXRfc3VwZXIoc2IsIGVzLCAxKTsKKwogI2lmZGVmIENPTkZJR19RVU9UQQogCS8qIFJlbGVhc2Ugb2xkIHF1b3RhIGZpbGUgbmFtZXMgKi8KIAlmb3IgKGkgPSAwOyBpIDwgTUFYUVVPVEFTOyBpKyspCkBAIC0zMDk3LDYgKzMyODAsOCBAQAogCXNiaS0+c19yZXN1aWQgPSBvbGRfb3B0cy5zX3Jlc3VpZDsKIAlzYmktPnNfcmVzZ2lkID0gb2xkX29wdHMuc19yZXNnaWQ7CiAJc2JpLT5zX2NvbW1pdF9pbnRlcnZhbCA9IG9sZF9vcHRzLnNfY29tbWl0X2ludGVydmFsOworCXNiaS0+c19taW5fYmF0Y2hfdGltZSA9IG9sZF9vcHRzLnNfbWluX2JhdGNoX3RpbWU7CisJc2JpLT5zX21heF9iYXRjaF90aW1lID0gb2xkX29wdHMuc19tYXhfYmF0Y2hfdGltZTsKICNpZmRlZiBDT05GSUdfUVVPVEEKIAlzYmktPnNfanF1b3RhX2ZtdCA9IG9sZF9vcHRzLnNfanF1b3RhX2ZtdDsKIAlmb3IgKGkgPSAwOyBpIDwgTUFYUVVPVEFTOyBpKyspIHsKQEAgLTMzNTksNyArMzU0NCw4IEBACiAJICogV2hlbiB3ZSBqb3VybmFsIGRhdGEgb24gcXVvdGEgZmlsZSwgd2UgaGF2ZSB0byBmbHVzaCBqb3VybmFsIHRvIHNlZQogCSAqIGFsbCB1cGRhdGVzIHRvIHRoZSBmaWxlIHdoZW4gd2UgYnlwYXNzIHBhZ2VjYWNoZS4uLgogCSAqLwotCWlmIChleHQ0X3Nob3VsZF9qb3VybmFsX2RhdGEocGF0aC5kZW50cnktPmRfaW5vZGUpKSB7CisJaWYgKEVYVDRfU0Ioc2IpLT5zX2pvdXJuYWwgJiYKKwkgICAgZXh0NF9zaG91bGRfam91cm5hbF9kYXRhKHBhdGguZGVudHJ5LT5kX2lub2RlKSkgewogCQkvKgogCQkgKiBXZSBkb24ndCBuZWVkIHRvIGxvY2sgdXBkYXRlcyBidXQgam91cm5hbF9mbHVzaCgpIGNvdWxkCiAJCSAqIG90aGVyd2lzZSBiZSBsaXZlbG9ja2VkLi4uCkBAIC0zNDMzLDcgKzM2MTksNyBAQAogCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CiAJaGFuZGxlX3QgKmhhbmRsZSA9IGpvdXJuYWxfY3VycmVudF9oYW5kbGUoKTsKIAotCWlmICghaGFuZGxlKSB7CisJaWYgKEVYVDRfU0Ioc2IpLT5zX2pvdXJuYWwgJiYgIWhhbmRsZSkgewogCQlwcmludGsoS0VSTl9XQVJOSU5HICJFWFQ0LWZzOiBRdW90YSB3cml0ZSAob2ZmPSVsbHUsIGxlbj0lbGx1KSIKIAkJCSIgY2FuY2VsbGVkIGJlY2F1c2UgdHJhbnNhY3Rpb24gaXMgbm90IHN0YXJ0ZWQuXG4iLAogCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylvZmYsICh1bnNpZ25lZCBsb25nIGxvbmcpbGVuKTsKQEAgLTM0NTgsNyArMzY0NCw3IEBACiAJCWZsdXNoX2RjYWNoZV9wYWdlKGJoLT5iX3BhZ2UpOwogCQl1bmxvY2tfYnVmZmVyKGJoKTsKIAkJaWYgKGpvdXJuYWxfcXVvdGEpCi0JCQllcnIgPSBleHQ0X2pvdXJuYWxfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBiaCk7CisJCQllcnIgPSBleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIE5VTEwsIGJoKTsKIAkJZWxzZSB7CiAJCQkvKiBBbHdheXMgZG8gYXQgbGVhc3Qgb3JkZXJlZCB3cml0ZXMgZm9yIHF1b3RhcyAqLwogCQkJZXJyID0gZXh0NF9qYmQyX2ZpbGVfaW5vZGUoaGFuZGxlLCBpbm9kZSk7CkBAIC0zNTEyLDE4ICszNjk4LDE1IEBACiBzdGF0aWMgc3NpemVfdCBleHQ0X3VpX3Byb2Nfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWYsCiAJCQkgICAgICAgc2l6ZV90IGNudCwgbG9mZl90ICpwcG9zKQogewotCXVuc2lnbmVkIGludCAqcCA9IFBERShmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlKS0+ZGF0YTsKKwl1bnNpZ25lZCBsb25nICpwID0gUERFKGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUpLT5kYXRhOwogCWNoYXIgc3RyWzMyXTsKLQl1bnNpZ25lZCBsb25nIHZhbHVlOwogCiAJaWYgKGNudCA+PSBzaXplb2Yoc3RyKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAJaWYgKGNvcHlfZnJvbV91c2VyKHN0ciwgYnVmLCBjbnQpKQogCQlyZXR1cm4gLUVGQVVMVDsKLQl2YWx1ZSA9IHNpbXBsZV9zdHJ0b2woc3RyLCBOVUxMLCAwKTsKLQlpZiAodmFsdWUgPCAwKQotCQlyZXR1cm4gLUVSQU5HRTsKLQkqcCA9IHZhbHVlOworCisJKnAgPSBzaW1wbGVfc3RydG91bChzdHIsIE5VTEwsIDApOwogCXJldHVybiBjbnQ7CiB9CiAKQEAgLTM2MTQsNyArMzc5Nyw3IEBACiB9CiAKIE1PRFVMRV9BVVRIT1IoIlJlbXkgQ2FyZCwgU3RlcGhlbiBUd2VlZGllLCBBbmRyZXcgTW9ydG9uLCBBbmRyZWFzIERpbGdlciwgVGhlb2RvcmUgVHMnbyBhbmQgb3RoZXJzIik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIkZvdXJ0aCBFeHRlbmRlZCBGaWxlc3lzdGVtIHdpdGggZXh0ZW50cyIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJGb3VydGggRXh0ZW5kZWQgRmlsZXN5c3RlbSIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogbW9kdWxlX2luaXQoaW5pdF9leHQ0X2ZzKQogbW9kdWxlX2V4aXQoZXhpdF9leHQ0X2ZzKQpkaWZmIC0tZ2l0IGEvZnMvZXh0NC94YXR0ci5jIGIvZnMvZXh0NC94YXR0ci5jCmluZGV4IDgwNjI2ZDUuLjE1N2NlNjUgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDQveGF0dHIuYworKysgYi9mcy9leHQ0L3hhdHRyLmMKQEAgLTQ1Nyw3ICs0NTcsNyBAQAogCWlmIChleHQ0X2pvdXJuYWxfZ2V0X3dyaXRlX2FjY2VzcyhoYW5kbGUsIEVYVDRfU0Ioc2IpLT5zX3NiaCkgPT0gMCkgewogCQlFWFQ0X1NFVF9DT01QQVRfRkVBVFVSRShzYiwgRVhUNF9GRUFUVVJFX0NPTVBBVF9FWFRfQVRUUik7CiAJCXNiLT5zX2RpcnQgPSAxOwotCQlleHQ0X2pvdXJuYWxfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBFWFQ0X1NCKHNiKS0+c19zYmgpOworCQlleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIE5VTEwsIEVYVDRfU0Ioc2IpLT5zX3NiaCk7CiAJfQogfQogCkBAIC00ODcsOSArNDg3LDkgQEAKIAkJZXh0NF9mb3JnZXQoaGFuZGxlLCAxLCBpbm9kZSwgYmgsIGJoLT5iX2Jsb2NrbnIpOwogCX0gZWxzZSB7CiAJCWxlMzJfYWRkX2NwdSgmQkhEUihiaCktPmhfcmVmY291bnQsIC0xKTsKLQkJZXJyb3IgPSBleHQ0X2pvdXJuYWxfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBiaCk7CisJCWVycm9yID0gZXh0NF9oYW5kbGVfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBpbm9kZSwgYmgpOwogCQlpZiAoSVNfU1lOQyhpbm9kZSkpCi0JCQloYW5kbGUtPmhfc3luYyA9IDE7CisJCQlleHQ0X2hhbmRsZV9zeW5jKGhhbmRsZSk7CiAJCURRVU9UX0ZSRUVfQkxPQ0soaW5vZGUsIDEpOwogCQllYV9iZGVidWcoYmgsICJyZWZjb3VudCBub3c9JWQ7IHJlbGVhc2luZyIsCiAJCQkgIGxlMzJfdG9fY3B1KEJIRFIoYmgpLT5oX3JlZmNvdW50KSk7CkBAIC03MjQsOCArNzI0LDkgQEAKIAkJCWlmIChlcnJvciA9PSAtRUlPKQogCQkJCWdvdG8gYmFkX2Jsb2NrOwogCQkJaWYgKCFlcnJvcikKLQkJCQllcnJvciA9IGV4dDRfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsCi0JCQkJCQkJCSAgICBicy0+YmgpOworCQkJCWVycm9yID0gZXh0NF9oYW5kbGVfZGlydHlfbWV0YWRhdGEoaGFuZGxlLAorCQkJCQkJCQkgICBpbm9kZSwKKwkJCQkJCQkJICAgYnMtPmJoKTsKIAkJCWlmIChlcnJvcikKIAkJCQlnb3RvIGNsZWFudXA7CiAJCQlnb3RvIGluc2VydGVkOwpAQCAtNzk0LDggKzc5NSw5IEBACiAJCQkJZWFfYmRlYnVnKG5ld19iaCwgInJldXNpbmc7IHJlZmNvdW50IG5vdz0lZCIsCiAJCQkJCWxlMzJfdG9fY3B1KEJIRFIobmV3X2JoKS0+aF9yZWZjb3VudCkpOwogCQkJCXVubG9ja19idWZmZXIobmV3X2JoKTsKLQkJCQllcnJvciA9IGV4dDRfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsCi0JCQkJCQkJCSAgICBuZXdfYmgpOworCQkJCWVycm9yID0gZXh0NF9oYW5kbGVfZGlydHlfbWV0YWRhdGEoaGFuZGxlLAorCQkJCQkJCQkgICBpbm9kZSwKKwkJCQkJCQkJICAgbmV3X2JoKTsKIAkJCQlpZiAoZXJyb3IpCiAJCQkJCWdvdG8gY2xlYW51cF9kcXVvdDsKIAkJCX0KQEAgLTgxMCw4ICs4MTIsOCBAQAogCQkJLyogV2UgbmVlZCB0byBhbGxvY2F0ZSBhIG5ldyBibG9jayAqLwogCQkJZXh0NF9mc2Jsa190IGdvYWwgPSBleHQ0X2dyb3VwX2ZpcnN0X2Jsb2NrX25vKHNiLAogCQkJCQkJRVhUNF9JKGlub2RlKS0+aV9ibG9ja19ncm91cCk7Ci0JCQlleHQ0X2ZzYmxrX3QgYmxvY2sgPSBleHQ0X25ld19tZXRhX2Jsb2NrKGhhbmRsZSwgaW5vZGUsCi0JCQkJCQkJZ29hbCwgJmVycm9yKTsKKwkJCWV4dDRfZnNibGtfdCBibG9jayA9IGV4dDRfbmV3X21ldGFfYmxvY2tzKGhhbmRsZSwgaW5vZGUsCisJCQkJCQkgIGdvYWwsIE5VTEwsICZlcnJvcik7CiAJCQlpZiAoZXJyb3IpCiAJCQkJZ290byBjbGVhbnVwOwogCQkJZWFfaWRlYnVnKGlub2RlLCAiY3JlYXRpbmcgYmxvY2sgJWQiLCBibG9jayk7CkBAIC04MzMsNyArODM1LDggQEAKIAkJCXNldF9idWZmZXJfdXB0b2RhdGUobmV3X2JoKTsKIAkJCXVubG9ja19idWZmZXIobmV3X2JoKTsKIAkJCWV4dDRfeGF0dHJfY2FjaGVfaW5zZXJ0KG5ld19iaCk7Ci0JCQllcnJvciA9IGV4dDRfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIG5ld19iaCk7CisJCQllcnJvciA9IGV4dDRfaGFuZGxlX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwKKwkJCQkJCQkgICBpbm9kZSwgbmV3X2JoKTsKIAkJCWlmIChlcnJvcikKIAkJCQlnb3RvIGNsZWFudXA7CiAJCX0KQEAgLTEwNDAsNyArMTA0Myw3IEBACiAJCSAqLwogCQlpcy5pbG9jLmJoID0gTlVMTDsKIAkJaWYgKElTX1NZTkMoaW5vZGUpKQotCQkJaGFuZGxlLT5oX3N5bmMgPSAxOworCQkJZXh0NF9oYW5kbGVfc3luYyhoYW5kbGUpOwogCX0KIAogY2xlYW51cDoKZGlmZiAtLWdpdCBhL2ZzL2ZjbnRsLmMgYi9mcy9mY250bC5jCmluZGV4IGNkYzE0MTkuLmJkMjE1Y2MgMTAwNjQ0Ci0tLSBhL2ZzL2ZjbnRsLmMKKysrIGIvZnMvZmNudGwuYwpAQCAtNTAsNyArNTAsNyBAQAogCXJldHVybiByZXM7CiB9CiAKLWFzbWxpbmthZ2UgbG9uZyBzeXNfZHVwMyh1bnNpZ25lZCBpbnQgb2xkZmQsIHVuc2lnbmVkIGludCBuZXdmZCwgaW50IGZsYWdzKQorU1lTQ0FMTF9ERUZJTkUzKGR1cDMsIHVuc2lnbmVkIGludCwgb2xkZmQsIHVuc2lnbmVkIGludCwgbmV3ZmQsIGludCwgZmxhZ3MpCiB7CiAJaW50IGVyciA9IC1FQkFERjsKIAlzdHJ1Y3QgZmlsZSAqIGZpbGUsICp0b2ZyZWU7CkBAIC0xMTMsNyArMTEzLDcgQEAKIAlyZXR1cm4gZXJyOwogfQogCi1hc21saW5rYWdlIGxvbmcgc3lzX2R1cDIodW5zaWduZWQgaW50IG9sZGZkLCB1bnNpZ25lZCBpbnQgbmV3ZmQpCitTWVNDQUxMX0RFRklORTIoZHVwMiwgdW5zaWduZWQgaW50LCBvbGRmZCwgdW5zaWduZWQgaW50LCBuZXdmZCkKIHsKIAlpZiAodW5saWtlbHkobmV3ZmQgPT0gb2xkZmQpKSB7IC8qIGNvcm5lciBjYXNlICovCiAJCXN0cnVjdCBmaWxlc19zdHJ1Y3QgKmZpbGVzID0gY3VycmVudC0+ZmlsZXM7CkBAIC0xMjYsNyArMTI2LDcgQEAKIAlyZXR1cm4gc3lzX2R1cDMob2xkZmQsIG5ld2ZkLCAwKTsKIH0KIAotYXNtbGlua2FnZSBsb25nIHN5c19kdXAodW5zaWduZWQgaW50IGZpbGRlcykKK1NZU0NBTExfREVGSU5FMShkdXAsIHVuc2lnbmVkIGludCwgZmlsZGVzKQogewogCWludCByZXQgPSAtRUJBREY7CiAJc3RydWN0IGZpbGUgKmZpbGUgPSBmZ2V0KGZpbGRlcyk7CkBAIC0zMzUsNyArMzM1LDcgQEAKIAlyZXR1cm4gZXJyOwogfQogCi1hc21saW5rYWdlIGxvbmcgc3lzX2ZjbnRsKHVuc2lnbmVkIGludCBmZCwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCitTWVNDQUxMX0RFRklORTMoZmNudGwsIHVuc2lnbmVkIGludCwgZmQsIHVuc2lnbmVkIGludCwgY21kLCB1bnNpZ25lZCBsb25nLCBhcmcpCiB7CQogCXN0cnVjdCBmaWxlICpmaWxwOwogCWxvbmcgZXJyID0gLUVCQURGOwpAQCAtMzU4LDcgKzM1OCw4IEBACiB9CiAKICNpZiBCSVRTX1BFUl9MT05HID09IDMyCi1hc21saW5rYWdlIGxvbmcgc3lzX2ZjbnRsNjQodW5zaWduZWQgaW50IGZkLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK1NZU0NBTExfREVGSU5FMyhmY250bDY0LCB1bnNpZ25lZCBpbnQsIGZkLCB1bnNpZ25lZCBpbnQsIGNtZCwKKwkJdW5zaWduZWQgbG9uZywgYXJnKQogewkKIAlzdHJ1Y3QgZmlsZSAqIGZpbHA7CiAJbG9uZyBlcnI7CmRpZmYgLS1naXQgYS9mcy9maWxlc3lzdGVtcy5jIGIvZnMvZmlsZXN5c3RlbXMuYwppbmRleCBkNDg4ZGNkLi4xYWE3MDI2IDEwMDY0NAotLS0gYS9mcy9maWxlc3lzdGVtcy5jCisrKyBiL2ZzL2ZpbGVzeXN0ZW1zLmMKQEAgLTE3OSw3ICsxNzksNyBAQAogLyoKICAqIFdoZWUuLiBXZWlyZCBzeXN2IHN5c2NhbGwuIAogICovCi1hc21saW5rYWdlIGxvbmcgc3lzX3N5c2ZzKGludCBvcHRpb24sIHVuc2lnbmVkIGxvbmcgYXJnMSwgdW5zaWduZWQgbG9uZyBhcmcyKQorU1lTQ0FMTF9ERUZJTkUzKHN5c2ZzLCBpbnQsIG9wdGlvbiwgdW5zaWduZWQgbG9uZywgYXJnMSwgdW5zaWduZWQgbG9uZywgYXJnMikKIHsKIAlpbnQgcmV0dmFsID0gLUVJTlZBTDsKIApkaWZmIC0tZ2l0IGEvZnMvZ2ZzMi9LY29uZmlnIGIvZnMvZ2ZzMi9LY29uZmlnCmluZGV4IGFiMmY1N2UuLmU1NjNhNjQgMTAwNjQ0Ci0tLSBhL2ZzL2dmczIvS2NvbmZpZworKysgYi9mcy9nZnMyL0tjb25maWcKQEAgLTEsNiArMSw2IEBACiBjb25maWcgR0ZTMl9GUwogCXRyaXN0YXRlICJHRlMyIGZpbGUgc3lzdGVtIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwgJiYgKDY0QklUIHx8IChMU0YgJiYgTEJEKSkKKwlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTCAmJiAoNjRCSVQgfHwgTEJEKQogCXNlbGVjdCBGU19QT1NJWF9BQ0wKIAlzZWxlY3QgQ1JDMzIKIAloZWxwCmRpZmYgLS1naXQgYS9mcy9nZnMyL29wc19hZGRyZXNzLmMgYi9mcy9nZnMyL29wc19hZGRyZXNzLmMKaW5kZXggNmU0ZWEzNi4uNGRkYWI2NyAxMDA2NDQKLS0tIGEvZnMvZ2ZzMi9vcHNfYWRkcmVzcy5jCisrKyBiL2ZzL2dmczIvb3BzX2FkZHJlc3MuYwpAQCAtNjc1LDYgKzY3NSw3IEBACiAJCWdvdG8gb3V0X3RyYW5zX2ZhaWw7CiAKIAllcnJvciA9IC1FTk9NRU07CisJZmxhZ3MgfD0gQU9QX0ZMQUdfTk9GUzsKIAlwYWdlID0gZ3JhYl9jYWNoZV9wYWdlX3dyaXRlX2JlZ2luKG1hcHBpbmcsIGluZGV4LCBmbGFncyk7CiAJKnBhZ2VwID0gcGFnZTsKIAlpZiAodW5saWtlbHkoIXBhZ2UpKQpkaWZmIC0tZ2l0IGEvZnMvZ2ZzMi9vcHNfZmlsZS5jIGIvZnMvZ2ZzMi9vcHNfZmlsZS5jCmluZGV4IDI4OWM1ZjUuLjkzZmU0MWIgMTAwNjQ0Ci0tLSBhL2ZzL2dmczIvb3BzX2ZpbGUuYworKysgYi9mcy9nZnMyL29wc19maWxlLmMKQEAgLTM0Miw3ICszNDIsNyBAQAogCXN0cnVjdCBnZnMyX2lub2RlICppcCA9IEdGUzJfSShpbm9kZSk7CiAJc3RydWN0IGdmczJfc2JkICpzZHAgPSBHRlMyX1NCKGlub2RlKTsKIAl1bnNpZ25lZCBsb25nIGxhc3RfaW5kZXg7Ci0JdTY0IHBvcyA9IHBhZ2UtPmluZGV4IDw8IChQQUdFX0NBQ0hFX1NJWkUgLSBpbm9kZS0+aV9ibGtiaXRzKTsKKwl1NjQgcG9zID0gcGFnZS0+aW5kZXggPDwgUEFHRV9DQUNIRV9TSElGVDsKIAl1bnNpZ25lZCBpbnQgZGF0YV9ibG9ja3MsIGluZF9ibG9ja3MsIHJibG9ja3M7CiAJaW50IGFsbG9jX3JlcXVpcmVkID0gMDsKIAlzdHJ1Y3QgZ2ZzMl9ob2xkZXIgZ2g7CmRpZmYgLS1naXQgYS9mcy9nZnMyL29wc19zdXBlci5jIGIvZnMvZ2ZzMi9vcHNfc3VwZXIuYwppbmRleCA3Nzc3ODNkLi4zMjAzMjNkIDEwMDY0NAotLS0gYS9mcy9nZnMyL29wc19zdXBlci5jCisrKyBiL2ZzL2dmczIvb3BzX3N1cGVyLmMKQEAgLTIxMSwxOCArMjExLDE4IEBACiB9CiAKIC8qKgotICogZ2ZzMl93cml0ZV9zdXBlcl9sb2NrZnMgLSBwcmV2ZW50IGZ1cnRoZXIgd3JpdGVzIHRvIHRoZSBmaWxlc3lzdGVtCisgKiBnZnMyX2ZyZWV6ZSAtIHByZXZlbnQgZnVydGhlciB3cml0ZXMgdG8gdGhlIGZpbGVzeXN0ZW0KICAqIEBzYjogdGhlIFZGUyBzdHJ1Y3R1cmUgZm9yIHRoZSBmaWxlc3lzdGVtCiAgKgogICovCiAKLXN0YXRpYyB2b2lkIGdmczJfd3JpdGVfc3VwZXJfbG9ja2ZzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCitzdGF0aWMgaW50IGdmczJfZnJlZXplKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCiB7CiAJc3RydWN0IGdmczJfc2JkICpzZHAgPSBzYi0+c19mc19pbmZvOwogCWludCBlcnJvcjsKIAogCWlmICh0ZXN0X2JpdChTREZfU0hVVERPV04sICZzZHAtPnNkX2ZsYWdzKSkKLQkJcmV0dXJuOworCQlyZXR1cm4gLUVJTlZBTDsKIAogCWZvciAoOzspIHsKIAkJZXJyb3IgPSBnZnMyX2ZyZWV6ZV9mcyhzZHApOwpAQCAtMjQyLDE3ICsyNDIsMTkgQEAKIAkJZnNfZXJyKHNkcCwgInJldHJ5aW5nLi4uXG4iKTsKIAkJbXNsZWVwKDEwMDApOwogCX0KKwlyZXR1cm4gMDsKIH0KIAogLyoqCi0gKiBnZnMyX3VubG9ja2ZzIC0gcmVhbGxvdyB3cml0ZXMgdG8gdGhlIGZpbGVzeXN0ZW0KKyAqIGdmczJfdW5mcmVlemUgLSByZWFsbG93IHdyaXRlcyB0byB0aGUgZmlsZXN5c3RlbQogICogQHNiOiB0aGUgVkZTIHN0cnVjdHVyZSBmb3IgdGhlIGZpbGVzeXN0ZW0KICAqCiAgKi8KIAotc3RhdGljIHZvaWQgZ2ZzMl91bmxvY2tmcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQorc3RhdGljIGludCBnZnMyX3VuZnJlZXplKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCiB7CiAJZ2ZzMl91bmZyZWV6ZV9mcyhzYi0+c19mc19pbmZvKTsKKwlyZXR1cm4gMDsKIH0KIAogLyoqCkBAIC02ODgsOCArNjkwLDggQEAKIAkucHV0X3N1cGVyCQk9IGdmczJfcHV0X3N1cGVyLAogCS53cml0ZV9zdXBlcgkJPSBnZnMyX3dyaXRlX3N1cGVyLAogCS5zeW5jX2ZzCQk9IGdmczJfc3luY19mcywKLQkud3JpdGVfc3VwZXJfbG9ja2ZzIAk9IGdmczJfd3JpdGVfc3VwZXJfbG9ja2ZzLAotCS51bmxvY2tmcwkJPSBnZnMyX3VubG9ja2ZzLAorCS5mcmVlemVfZnMgCQk9IGdmczJfZnJlZXplLAorCS51bmZyZWV6ZV9mcwkJPSBnZnMyX3VuZnJlZXplLAogCS5zdGF0ZnMJCQk9IGdmczJfc3RhdGZzLAogCS5yZW1vdW50X2ZzCQk9IGdmczJfcmVtb3VudF9mcywKIAkuY2xlYXJfaW5vZGUJCT0gZ2ZzMl9jbGVhcl9pbm9kZSwKZGlmZiAtLWdpdCBhL2ZzL2lub2RlLmMgYi9mcy9pbm9kZS5jCmluZGV4IDdhNmU4YzIuLjkxM2FiMmQgMTAwNjQ0Ci0tLSBhL2ZzL2lub2RlLmMKKysrIGIvZnMvaW5vZGUuYwpAQCAtMjIsNiArMjIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KICNpbmNsdWRlIDxsaW51eC9pbm90aWZ5Lmg+CiAjaW5jbHVkZSA8bGludXgvbW91bnQuaD4KKyNpbmNsdWRlIDxsaW51eC9hc3luYy5oPgogCiAvKgogICogVGhpcyBpcyBuZWVkZWQgZm9yIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zOgpkaWZmIC0tZ2l0IGEvZnMvaW9jdGwuYyBiL2ZzL2lvY3RsLmMKaW5kZXggY2MzZjFhYS4uMjQwZWM2MzkgMTAwNjQ0Ci0tLSBhL2ZzL2lvY3RsLmMKKysrIGIvZnMvaW9jdGwuYwpAQCAtNDM5LDYgKzQzOSw0MyBAQAogCXJldHVybiBlcnJvcjsKIH0KIAorc3RhdGljIGludCBpb2N0bF9mc2ZyZWV6ZShzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gZmlscC0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZS0+aV9zYjsKKworCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKKwkJcmV0dXJuIC1FUEVSTTsKKworCS8qIElmIGZpbGVzeXN0ZW0gZG9lc24ndCBzdXBwb3J0IGZyZWV6ZSBmZWF0dXJlLCByZXR1cm4uICovCisJaWYgKHNiLT5zX29wLT5mcmVlemVfZnMgPT0gTlVMTCkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJLyogSWYgYSBibG9ja2RldmljZS1iYWNrZWQgZmlsZXN5c3RlbSBpc24ndCBzcGVjaWZpZWQsIHJldHVybi4gKi8KKwlpZiAoc2ItPnNfYmRldiA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIEZyZWV6ZSAqLworCXNiID0gZnJlZXplX2JkZXYoc2ItPnNfYmRldik7CisJaWYgKElTX0VSUihzYikpCisJCXJldHVybiBQVFJfRVJSKHNiKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpb2N0bF9mc3RoYXcoc3RydWN0IGZpbGUgKmZpbHApCit7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGZpbHAtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUtPmlfc2I7CisKKwlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCisJCXJldHVybiAtRVBFUk07CisKKwkvKiBJZiBhIGJsb2NrZGV2aWNlLWJhY2tlZCBmaWxlc3lzdGVtIGlzbid0IHNwZWNpZmllZCwgcmV0dXJuIEVJTlZBTC4gKi8KKwlpZiAoc2ItPnNfYmRldiA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIFRoYXcgKi8KKwlyZXR1cm4gdGhhd19iZGV2KHNiLT5zX2JkZXYsIHNiKTsKK30KKwogLyoKICAqIFdoZW4geW91IGFkZCBhbnkgbmV3IGNvbW1vbiBpb2N0bHMgdG8gdGhlIHN3aXRjaGVzIGFib3ZlIGFuZCBiZWxvdwogICogcGxlYXNlIHVwZGF0ZSBjb21wYXRfc3lzX2lvY3RsKCkgdG9vLgpAQCAtNDg2LDYgKzUyMywxNSBAQAogCQl9IGVsc2UKIAkJCWVycm9yID0gLUVOT1RUWTsKIAkJYnJlYWs7CisKKwljYXNlIEZJRlJFRVpFOgorCQllcnJvciA9IGlvY3RsX2ZzZnJlZXplKGZpbHApOworCQlicmVhazsKKworCWNhc2UgRklUSEFXOgorCQllcnJvciA9IGlvY3RsX2ZzdGhhdyhmaWxwKTsKKwkJYnJlYWs7CisKIAlkZWZhdWx0OgogCQlpZiAoU19JU1JFRyhmaWxwLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlLT5pX21vZGUpKQogCQkJZXJyb3IgPSBmaWxlX2lvY3RsKGZpbHAsIGNtZCwgYXJnKTsKQEAgLTQ5Niw3ICs1NDIsNyBAQAogCXJldHVybiBlcnJvcjsKIH0KIAotYXNtbGlua2FnZSBsb25nIHN5c19pb2N0bCh1bnNpZ25lZCBpbnQgZmQsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQorU1lTQ0FMTF9ERUZJTkUzKGlvY3RsLCB1bnNpZ25lZCBpbnQsIGZkLCB1bnNpZ25lZCBpbnQsIGNtZCwgdW5zaWduZWQgbG9uZywgYXJnKQogewogCXN0cnVjdCBmaWxlICpmaWxwOwogCWludCBlcnJvciA9IC1FQkFERjsKZGlmZiAtLWdpdCBhL2ZzL2lvcHJpby5jIGIvZnMvaW9wcmlvLmMKaW5kZXggMzU2OWUwYS4uYzdjMGIyOCAxMDA2NDQKLS0tIGEvZnMvaW9wcmlvLmMKKysrIGIvZnMvaW9wcmlvLmMKQEAgLTI3LDcgKzI3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zZWN1cml0eS5oPgogI2luY2x1ZGUgPGxpbnV4L3BpZF9uYW1lc3BhY2UuaD4KIAotc3RhdGljIGludCBzZXRfdGFza19pb3ByaW8oc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBpbnQgaW9wcmlvKQoraW50IHNldF90YXNrX2lvcHJpbyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIGludCBpb3ByaW8pCiB7CiAJaW50IGVycjsKIAlzdHJ1Y3QgaW9fY29udGV4dCAqaW9jOwpAQCAtNzAsOCArNzAsOSBAQAogCXRhc2tfdW5sb2NrKHRhc2spOwogCXJldHVybiBlcnI7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChzZXRfdGFza19pb3ByaW8pOwogCi1hc21saW5rYWdlIGxvbmcgc3lzX2lvcHJpb19zZXQoaW50IHdoaWNoLCBpbnQgd2hvLCBpbnQgaW9wcmlvKQorU1lTQ0FMTF9ERUZJTkUzKGlvcHJpb19zZXQsIGludCwgd2hpY2gsIGludCwgd2hvLCBpbnQsIGlvcHJpbykKIHsKIAlpbnQgY2xhc3MgPSBJT1BSSU9fUFJJT19DTEFTUyhpb3ByaW8pOwogCWludCBkYXRhID0gSU9QUklPX1BSSU9fREFUQShpb3ByaW8pOwpAQCAtMTg3LDcgKzE4OCw3IEBACiAJCXJldHVybiBhcHJpbzsKIH0KIAotYXNtbGlua2FnZSBsb25nIHN5c19pb3ByaW9fZ2V0KGludCB3aGljaCwgaW50IHdobykKK1NZU0NBTExfREVGSU5FMihpb3ByaW9fZ2V0LCBpbnQsIHdoaWNoLCBpbnQsIHdobykKIHsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKmcsICpwOwogCXN0cnVjdCB1c2VyX3N0cnVjdCAqdXNlcjsKQEAgLTI1MSw0ICsyNTIsMyBAQAogCXJlYWRfdW5sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKIAlyZXR1cm4gcmV0OwogfQotCmRpZmYgLS1naXQgYS9mcy9qYmQvY29tbWl0LmMgYi9mcy9qYmQvY29tbWl0LmMKaW5kZXggMjU3MTlkOS4uM2ZiZmZiMSAxMDA2NDQKLS0tIGEvZnMvamJkL2NvbW1pdC5jCisrKyBiL2ZzL2piZC9jb21taXQuYwpAQCAtMzA2LDYgKzMwNiw4IEBACiAJaW50IGZsYWdzOwogCWludCBlcnI7CiAJdW5zaWduZWQgbG9uZyBibG9ja25yOworCWt0aW1lX3Qgc3RhcnRfdGltZTsKKwl1NjQgY29tbWl0X3RpbWU7CiAJY2hhciAqdGFncCA9IE5VTEw7CiAJam91cm5hbF9oZWFkZXJfdCAqaGVhZGVyOwogCWpvdXJuYWxfYmxvY2tfdGFnX3QgKnRhZyA9IE5VTEw7CkBAIC00MTgsNiArNDIwLDcgQEAKIAljb21taXRfdHJhbnNhY3Rpb24tPnRfc3RhdGUgPSBUX0ZMVVNIOwogCWpvdXJuYWwtPmpfY29tbWl0dGluZ190cmFuc2FjdGlvbiA9IGNvbW1pdF90cmFuc2FjdGlvbjsKIAlqb3VybmFsLT5qX3J1bm5pbmdfdHJhbnNhY3Rpb24gPSBOVUxMOworCXN0YXJ0X3RpbWUgPSBrdGltZV9nZXQoKTsKIAljb21taXRfdHJhbnNhY3Rpb24tPnRfbG9nX3N0YXJ0ID0gam91cm5hbC0+al9oZWFkOwogCXdha2VfdXAoJmpvdXJuYWwtPmpfd2FpdF90cmFuc2FjdGlvbl9sb2NrZWQpOwogCXNwaW5fdW5sb2NrKCZqb3VybmFsLT5qX3N0YXRlX2xvY2spOwpAQCAtOTEzLDYgKzkxNiwxOCBAQAogCUpfQVNTRVJUKGNvbW1pdF90cmFuc2FjdGlvbiA9PSBqb3VybmFsLT5qX2NvbW1pdHRpbmdfdHJhbnNhY3Rpb24pOwogCWpvdXJuYWwtPmpfY29tbWl0X3NlcXVlbmNlID0gY29tbWl0X3RyYW5zYWN0aW9uLT50X3RpZDsKIAlqb3VybmFsLT5qX2NvbW1pdHRpbmdfdHJhbnNhY3Rpb24gPSBOVUxMOworCWNvbW1pdF90aW1lID0ga3RpbWVfdG9fbnMoa3RpbWVfc3ViKGt0aW1lX2dldCgpLCBzdGFydF90aW1lKSk7CisKKwkvKgorCSAqIHdlaWdodCB0aGUgY29tbWl0IHRpbWUgaGlnaGVyIHRoYW4gdGhlIGF2ZXJhZ2UgdGltZSBzbyB3ZSBkb24ndAorCSAqIHJlYWN0IHRvbyBzdHJvbmdseSB0byB2YXN0IGNoYW5nZXMgaW4gY29tbWl0IHRpbWUKKwkgKi8KKwlpZiAobGlrZWx5KGpvdXJuYWwtPmpfYXZlcmFnZV9jb21taXRfdGltZSkpCisJCWpvdXJuYWwtPmpfYXZlcmFnZV9jb21taXRfdGltZSA9IChjb21taXRfdGltZSozICsKKwkJCQlqb3VybmFsLT5qX2F2ZXJhZ2VfY29tbWl0X3RpbWUpIC8gNDsKKwllbHNlCisJCWpvdXJuYWwtPmpfYXZlcmFnZV9jb21taXRfdGltZSA9IGNvbW1pdF90aW1lOworCiAJc3Bpbl91bmxvY2soJmpvdXJuYWwtPmpfc3RhdGVfbG9jayk7CiAKIAlpZiAoY29tbWl0X3RyYW5zYWN0aW9uLT50X2NoZWNrcG9pbnRfbGlzdCA9PSBOVUxMICYmCmRpZmYgLS1naXQgYS9mcy9qYmQvdHJhbnNhY3Rpb24uYyBiL2ZzL2piZC90cmFuc2FjdGlvbi5jCmluZGV4IDYwZDRjMzIuLmU2YTExNzQgMTAwNjQ0Ci0tLSBhL2ZzL2piZC90cmFuc2FjdGlvbi5jCisrKyBiL2ZzL2piZC90cmFuc2FjdGlvbi5jCkBAIC0yNSw2ICsyNSw3IEBACiAjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9ocnRpbWVyLmg+CiAKIHN0YXRpYyB2b2lkIF9fam91cm5hbF90ZW1wX3VubGlua19idWZmZXIoc3RydWN0IGpvdXJuYWxfaGVhZCAqamgpOwogCkBAIC00OSw2ICs1MCw3IEBACiB7CiAJdHJhbnNhY3Rpb24tPnRfam91cm5hbCA9IGpvdXJuYWw7CiAJdHJhbnNhY3Rpb24tPnRfc3RhdGUgPSBUX1JVTk5JTkc7CisJdHJhbnNhY3Rpb24tPnRfc3RhcnRfdGltZSA9IGt0aW1lX2dldCgpOwogCXRyYW5zYWN0aW9uLT50X3RpZCA9IGpvdXJuYWwtPmpfdHJhbnNhY3Rpb25fc2VxdWVuY2UrKzsKIAl0cmFuc2FjdGlvbi0+dF9leHBpcmVzID0gamlmZmllcyArIGpvdXJuYWwtPmpfY29tbWl0X2ludGVydmFsOwogCXNwaW5fbG9ja19pbml0KCZ0cmFuc2FjdGlvbi0+dF9oYW5kbGVfbG9jayk7CkBAIC03NTIsNyArNzU0LDYgQEAKICAqIGludCBqb3VybmFsX2dldF93cml0ZV9hY2Nlc3MoKSAtIG5vdGlmeSBpbnRlbnQgdG8gbW9kaWZ5IGEgYnVmZmVyIGZvciBtZXRhZGF0YSAobm90IGRhdGEpIHVwZGF0ZS4KICAqIEBoYW5kbGU6IHRyYW5zYWN0aW9uIHRvIGFkZCBidWZmZXIgbW9kaWZpY2F0aW9ucyB0bwogICogQGJoOiAgICAgYmggdG8gYmUgdXNlZCBmb3IgbWV0YWRhdGEgd3JpdGVzCi0gKiBAY3JlZGl0czogdmFyaWFibGUgdGhhdCB3aWxsIHJlY2VpdmUgY3JlZGl0cyBmb3IgdGhlIGJ1ZmZlcgogICoKICAqIFJldHVybnMgYW4gZXJyb3IgY29kZSBvciAwIG9uIHN1Y2Nlc3MuCiAgKgpAQCAtMTM3MCw3ICsxMzcxLDcgQEAKIHsKIAl0cmFuc2FjdGlvbl90ICp0cmFuc2FjdGlvbiA9IGhhbmRsZS0+aF90cmFuc2FjdGlvbjsKIAlqb3VybmFsX3QgKmpvdXJuYWwgPSB0cmFuc2FjdGlvbi0+dF9qb3VybmFsOwotCWludCBvbGRfaGFuZGxlX2NvdW50LCBlcnI7CisJaW50IGVycjsKIAlwaWRfdCBwaWQ7CiAKIAlKX0FTU0VSVChqb3VybmFsX2N1cnJlbnRfaGFuZGxlKCkgPT0gaGFuZGxlKTsKQEAgLTEzOTksNiArMTQwMCwxNyBAQAogCSAqIG9uIElPIGFueXdheS4gIFNwZWVkcyB1cCBtYW55LXRocmVhZGVkLCBtYW55LWRpciBvcGVyYXRpb25zCiAJICogYnkgMzB4IG9yIG1vcmUuLi4KIAkgKgorCSAqIFdlIHRyeSBhbmQgb3B0aW1pemUgdGhlIHNsZWVwIHRpbWUgYWdhaW5zdCB3aGF0IHRoZSB1bmRlcmx5aW5nIGRpc2sKKwkgKiBjYW4gZG8sIGluc3RlYWQgb2YgaGF2aW5nIGEgc3RhdGljIHNsZWVwIHRpbWUuICBUaGlzIGlzIHVzZWZ1bGwgZm9yCisJICogdGhlIGNhc2Ugd2hlcmUgb3VyIHN0b3JhZ2UgaXMgc28gZmFzdCB0aGF0IGl0IGlzIG1vcmUgb3B0aW1hbCB0byBnbworCSAqIGFoZWFkIGFuZCBmb3JjZSBhIGZsdXNoIGFuZCB3YWl0IGZvciB0aGUgdHJhbnNhY3Rpb24gdG8gYmUgY29tbWl0dGVkCisJICogdGhhbiBpdCBpcyB0byB3YWl0IGZvciBhbiBhcmJpdHJhcnkgYW1vdW50IG9mIHRpbWUgZm9yIG5ldyB3cml0ZXJzIHRvCisJICogam9pbiB0aGUgdHJhbnNhY3Rpb24uICBXZSBhY2hlaXZlIHRoaXMgYnkgbWVhc3VyaW5nIGhvdyBsb25nIGl0IHRha2VzCisJICogdG8gY29tbWl0IGEgdHJhbnNhY3Rpb24sIGFuZCBjb21wYXJlIGl0IHdpdGggaG93IGxvbmcgdGhpcworCSAqIHRyYW5zYWN0aW9uIGhhcyBiZWVuIHJ1bm5pbmcsIGFuZCBpZiBydW4gdGltZSA8IGNvbW1pdCB0aW1lIHRoZW4gd2UKKwkgKiBzbGVlcCBmb3IgdGhlIGRlbHRhIGFuZCBjb21taXQuICBUaGlzIGdyZWF0bHkgaGVscHMgc3VwZXIgZmFzdCBkaXNrcworCSAqIHRoYXQgd291bGQgc2VlIHNsb3dkb3ducyBhcyBtb3JlIHRocmVhZHMgc3RhcnRlZCBkb2luZyBmc3luY3MuCisJICoKIAkgKiBCdXQgZG9uJ3QgZG8gdGhpcyBpZiB0aGlzIHByb2Nlc3Mgd2FzIHRoZSBtb3N0IHJlY2VudCBvbmUgdG8KIAkgKiBwZXJmb3JtIGEgc3luY2hyb25vdXMgd3JpdGUuICBXZSBkbyB0aGlzIHRvIGRldGVjdCB0aGUgY2FzZSB3aGVyZSBhCiAJICogc2luZ2xlIHByb2Nlc3MgaXMgZG9pbmcgYSBzdHJlYW0gb2Ygc3luYyB3cml0ZXMuICBObyBwb2ludCBpbiB3YWl0aW5nCkBAIC0xNDA2LDExICsxNDE4LDI2IEBACiAJICovCiAJcGlkID0gY3VycmVudC0+cGlkOwogCWlmIChoYW5kbGUtPmhfc3luYyAmJiBqb3VybmFsLT5qX2xhc3Rfc3luY193cml0ZXIgIT0gcGlkKSB7CisJCXU2NCBjb21taXRfdGltZSwgdHJhbnNfdGltZTsKKwogCQlqb3VybmFsLT5qX2xhc3Rfc3luY193cml0ZXIgPSBwaWQ7Ci0JCWRvIHsKLQkJCW9sZF9oYW5kbGVfY291bnQgPSB0cmFuc2FjdGlvbi0+dF9oYW5kbGVfY291bnQ7Ci0JCQlzY2hlZHVsZV90aW1lb3V0X3VuaW50ZXJydXB0aWJsZSgxKTsKLQkJfSB3aGlsZSAob2xkX2hhbmRsZV9jb3VudCAhPSB0cmFuc2FjdGlvbi0+dF9oYW5kbGVfY291bnQpOworCisJCXNwaW5fbG9jaygmam91cm5hbC0+al9zdGF0ZV9sb2NrKTsKKwkJY29tbWl0X3RpbWUgPSBqb3VybmFsLT5qX2F2ZXJhZ2VfY29tbWl0X3RpbWU7CisJCXNwaW5fdW5sb2NrKCZqb3VybmFsLT5qX3N0YXRlX2xvY2spOworCisJCXRyYW5zX3RpbWUgPSBrdGltZV90b19ucyhrdGltZV9zdWIoa3RpbWVfZ2V0KCksCisJCQkJCQkgICB0cmFuc2FjdGlvbi0+dF9zdGFydF90aW1lKSk7CisKKwkJY29tbWl0X3RpbWUgPSBtaW5fdCh1NjQsIGNvbW1pdF90aW1lLAorCQkJCSAgICAxMDAwKmppZmZpZXNfdG9fdXNlY3MoMSkpOworCisJCWlmICh0cmFuc190aW1lIDwgY29tbWl0X3RpbWUpIHsKKwkJCWt0aW1lX3QgZXhwaXJlcyA9IGt0aW1lX2FkZF9ucyhrdGltZV9nZXQoKSwKKwkJCQkJCSAgICAgICBjb21taXRfdGltZSk7CisJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJCQlzY2hlZHVsZV9ocnRpbWVvdXQoJmV4cGlyZXMsIEhSVElNRVJfTU9ERV9BQlMpOworCQl9CiAJfQogCiAJY3VycmVudC0+am91cm5hbF9pbmZvID0gTlVMTDsKZGlmZiAtLWdpdCBhL2ZzL2piZDIvY2hlY2twb2ludC5jIGIvZnMvamJkMi9jaGVja3BvaW50LmMKaW5kZXggOTQ5NzcxOC4uMTcxNTljYSAxMDA2NDQKLS0tIGEvZnMvamJkMi9jaGVja3BvaW50LmMKKysrIGIvZnMvamJkMi9jaGVja3BvaW50LmMKQEAgLTI0OSwxNiArMjQ5LDE0IEBACiAJcmV0dXJuIHJldDsKIH0KIAotI2RlZmluZSBOUl9CQVRDSAk2NAotCiBzdGF0aWMgdm9pZAotX19mbHVzaF9iYXRjaChqb3VybmFsX3QgKmpvdXJuYWwsIHN0cnVjdCBidWZmZXJfaGVhZCAqKmJocywgaW50ICpiYXRjaF9jb3VudCkKK19fZmx1c2hfYmF0Y2goam91cm5hbF90ICpqb3VybmFsLCBpbnQgKmJhdGNoX2NvdW50KQogewogCWludCBpOwogCi0JbGxfcndfYmxvY2soU1dSSVRFLCAqYmF0Y2hfY291bnQsIGJocyk7CisJbGxfcndfYmxvY2soU1dSSVRFLCAqYmF0Y2hfY291bnQsIGpvdXJuYWwtPmpfY2hrcHRfYmhzKTsKIAlmb3IgKGkgPSAwOyBpIDwgKmJhdGNoX2NvdW50OyBpKyspIHsKLQkJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IGJoc1tpXTsKKwkJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IGpvdXJuYWwtPmpfY2hrcHRfYmhzW2ldOwogCQljbGVhcl9idWZmZXJfandyaXRlKGJoKTsKIAkJQlVGRkVSX1RSQUNFKGJoLCAiYnJlbHNlIik7CiAJCV9fYnJlbHNlKGJoKTsKQEAgLTI3Nyw4ICsyNzUsNyBAQAogICogQ2FsbGVkIHVuZGVyIGpiZF9sb2NrX2JoX3N0YXRlKGpoMmJoKGpoKSksIGFuZCBkcm9wcyBpdAogICovCiBzdGF0aWMgaW50IF9fcHJvY2Vzc19idWZmZXIoam91cm5hbF90ICpqb3VybmFsLCBzdHJ1Y3Qgam91cm5hbF9oZWFkICpqaCwKLQkJCXN0cnVjdCBidWZmZXJfaGVhZCAqKmJocywgaW50ICpiYXRjaF9jb3VudCwKLQkJCXRyYW5zYWN0aW9uX3QgKnRyYW5zYWN0aW9uKQorCQkJICAgIGludCAqYmF0Y2hfY291bnQsIHRyYW5zYWN0aW9uX3QgKnRyYW5zYWN0aW9uKQogewogCXN0cnVjdCBidWZmZXJfaGVhZCAqYmggPSBqaDJiaChqaCk7CiAJaW50IHJldCA9IDA7CkBAIC0zMjUsMTQgKzMyMiwxNCBAQAogCQlnZXRfYmgoYmgpOwogCQlKX0FTU0VSVF9CSChiaCwgIWJ1ZmZlcl9qd3JpdGUoYmgpKTsKIAkJc2V0X2J1ZmZlcl9qd3JpdGUoYmgpOwotCQliaHNbKmJhdGNoX2NvdW50XSA9IGJoOworCQlqb3VybmFsLT5qX2Noa3B0X2Joc1sqYmF0Y2hfY291bnRdID0gYmg7CiAJCV9fYnVmZmVyX3JlbGlua19pbyhqaCk7CiAJCWpiZF91bmxvY2tfYmhfc3RhdGUoYmgpOwogCQl0cmFuc2FjdGlvbi0+dF9jaHBfc3RhdHMuY3Nfd3JpdHRlbisrOwogCQkoKmJhdGNoX2NvdW50KSsrOwotCQlpZiAoKmJhdGNoX2NvdW50ID09IE5SX0JBVENIKSB7CisJCWlmICgqYmF0Y2hfY291bnQgPT0gSkJEMl9OUl9CQVRDSCkgewogCQkJc3Bpbl91bmxvY2soJmpvdXJuYWwtPmpfbGlzdF9sb2NrKTsKLQkJCV9fZmx1c2hfYmF0Y2goam91cm5hbCwgYmhzLCBiYXRjaF9jb3VudCk7CisJCQlfX2ZsdXNoX2JhdGNoKGpvdXJuYWwsIGJhdGNoX2NvdW50KTsKIAkJCXJldCA9IDE7CiAJCX0KIAl9CkBAIC0zODgsNyArMzg1LDYgQEAKIAlpZiAoam91cm5hbC0+al9jaGVja3BvaW50X3RyYW5zYWN0aW9ucyA9PSB0cmFuc2FjdGlvbiAmJgogCQkJdHJhbnNhY3Rpb24tPnRfdGlkID09IHRoaXNfdGlkKSB7CiAJCWludCBiYXRjaF9jb3VudCA9IDA7Ci0JCXN0cnVjdCBidWZmZXJfaGVhZCAqYmhzW05SX0JBVENIXTsKIAkJc3RydWN0IGpvdXJuYWxfaGVhZCAqamg7CiAJCWludCByZXRyeSA9IDAsIGVycjsKIApAQCAtNDAyLDcgKzM5OCw3IEBACiAJCQkJcmV0cnkgPSAxOwogCQkJCWJyZWFrOwogCQkJfQotCQkJcmV0cnkgPSBfX3Byb2Nlc3NfYnVmZmVyKGpvdXJuYWwsIGpoLCBiaHMsICZiYXRjaF9jb3VudCwKKwkJCXJldHJ5ID0gX19wcm9jZXNzX2J1ZmZlcihqb3VybmFsLCBqaCwgJmJhdGNoX2NvdW50LAogCQkJCQkJIHRyYW5zYWN0aW9uKTsKIAkJCWlmIChyZXRyeSA8IDAgJiYgIXJlc3VsdCkKIAkJCQlyZXN1bHQgPSByZXRyeTsKQEAgLTQxOSw3ICs0MTUsNyBAQAogCQkJCXNwaW5fdW5sb2NrKCZqb3VybmFsLT5qX2xpc3RfbG9jayk7CiAJCQkJcmV0cnkgPSAxOwogCQkJfQotCQkJX19mbHVzaF9iYXRjaChqb3VybmFsLCBiaHMsICZiYXRjaF9jb3VudCk7CisJCQlfX2ZsdXNoX2JhdGNoKGpvdXJuYWwsICZiYXRjaF9jb3VudCk7CiAJCX0KIAogCQlpZiAocmV0cnkpIHsKQEAgLTY4Niw2ICs2ODIsNyBAQAogCSAgIHNhZmVseSByZW1vdmUgdGhpcyB0cmFuc2FjdGlvbiBmcm9tIHRoZSBsb2cgKi8KIAogCV9famJkMl9qb3VybmFsX2Ryb3BfdHJhbnNhY3Rpb24oam91cm5hbCwgdHJhbnNhY3Rpb24pOworCWtmcmVlKHRyYW5zYWN0aW9uKTsKIAogCS8qIEp1c3QgaW4gY2FzZSBhbnlib2R5IHdhcyB3YWl0aW5nIGZvciBtb3JlIHRyYW5zYWN0aW9ucyB0byBiZQogICAgICAgICAgICBjaGVja3BvaW50ZWQuLi4gKi8KQEAgLTc2MCw1ICs3NTcsNCBAQAogCUpfQVNTRVJUKGpvdXJuYWwtPmpfcnVubmluZ190cmFuc2FjdGlvbiAhPSB0cmFuc2FjdGlvbik7CiAKIAlqYmRfZGVidWcoMSwgIkRyb3BwaW5nIHRyYW5zYWN0aW9uICVkLCBhbGwgZG9uZVxuIiwgdHJhbnNhY3Rpb24tPnRfdGlkKTsKLQlrZnJlZSh0cmFuc2FjdGlvbik7CiB9CmRpZmYgLS1naXQgYS9mcy9qYmQyL2NvbW1pdC5jIGIvZnMvamJkMi9jb21taXQuYwppbmRleCBjOGExYmFjLi42MjgwNGU1IDEwMDY0NAotLS0gYS9mcy9qYmQyL2NvbW1pdC5jCisrKyBiL2ZzL2piZDIvY29tbWl0LmMKQEAgLTI1LDYgKzI1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9jcmMzMi5oPgogI2luY2x1ZGUgPGxpbnV4L3dyaXRlYmFjay5oPgogI2luY2x1ZGUgPGxpbnV4L2JhY2tpbmctZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvYmlvLmg+CiAKIC8qCiAgKiBEZWZhdWx0IElPIGVuZCBoYW5kbGVyIGZvciB0ZW1wb3JhcnkgQkpfSU8gYnVmZmVyX2hlYWRzLgpAQCAtMTM3LDcgKzEzOCw3IEBACiAJCXNldF9idWZmZXJfb3JkZXJlZChiaCk7CiAJCWJhcnJpZXJfZG9uZSA9IDE7CiAJfQotCXJldCA9IHN1Ym1pdF9iaChXUklURSwgYmgpOworCXJldCA9IHN1Ym1pdF9iaChXUklURV9TWU5DLCBiaCk7CiAJaWYgKGJhcnJpZXJfZG9uZSkKIAkJY2xlYXJfYnVmZmVyX29yZGVyZWQoYmgpOwogCkBAIC0xNTgsNyArMTU5LDcgQEAKIAkJbG9ja19idWZmZXIoYmgpOwogCQlzZXRfYnVmZmVyX3VwdG9kYXRlKGJoKTsKIAkJY2xlYXJfYnVmZmVyX2RpcnR5KGJoKTsKLQkJcmV0ID0gc3VibWl0X2JoKFdSSVRFLCBiaCk7CisJCXJldCA9IHN1Ym1pdF9iaChXUklURV9TWU5DLCBiaCk7CiAJfQogCSpjYmggPSBiaDsKIAlyZXR1cm4gcmV0OwpAQCAtMTY4LDEyICsxNjksMzQgQEAKICAqIFRoaXMgZnVuY3Rpb24gYWxvbmcgd2l0aCBqb3VybmFsX3N1Ym1pdF9jb21taXRfcmVjb3JkCiAgKiBhbGxvd3MgdG8gd3JpdGUgdGhlIGNvbW1pdCByZWNvcmQgYXN5bmNocm9ub3VzbHkuCiAgKi8KLXN0YXRpYyBpbnQgam91cm5hbF93YWl0X29uX2NvbW1pdF9yZWNvcmQoc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKK3N0YXRpYyBpbnQgam91cm5hbF93YWl0X29uX2NvbW1pdF9yZWNvcmQoam91cm5hbF90ICpqb3VybmFsLAorCQkJCQkgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKIHsKIAlpbnQgcmV0ID0gMDsKIAorcmV0cnk6CiAJY2xlYXJfYnVmZmVyX2RpcnR5KGJoKTsKIAl3YWl0X29uX2J1ZmZlcihiaCk7CisJaWYgKGJ1ZmZlcl9lb3Bub3RzdXBwKGJoKSAmJiAoam91cm5hbC0+al9mbGFncyAmIEpCRDJfQkFSUklFUikpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORworCQkgICAgICAgIkpCRDI6IHdhaXRfb25fY29tbWl0X3JlY29yZDogc3luYyBmYWlsZWQgb24gJXMgLSAiCisJCSAgICAgICAiZGlzYWJsaW5nIGJhcnJpZXJzXG4iLCBqb3VybmFsLT5qX2Rldm5hbWUpOworCQlzcGluX2xvY2soJmpvdXJuYWwtPmpfc3RhdGVfbG9jayk7CisJCWpvdXJuYWwtPmpfZmxhZ3MgJj0gfkpCRDJfQkFSUklFUjsKKwkJc3Bpbl91bmxvY2soJmpvdXJuYWwtPmpfc3RhdGVfbG9jayk7CisKKwkJbG9ja19idWZmZXIoYmgpOworCQljbGVhcl9idWZmZXJfZGlydHkoYmgpOworCQlzZXRfYnVmZmVyX3VwdG9kYXRlKGJoKTsKKwkJYmgtPmJfZW5kX2lvID0gam91cm5hbF9lbmRfYnVmZmVyX2lvX3N5bmM7CisKKwkJcmV0ID0gc3VibWl0X2JoKFdSSVRFX1NZTkMsIGJoKTsKKwkJaWYgKHJldCkgeworCQkJdW5sb2NrX2J1ZmZlcihiaCk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJCWdvdG8gcmV0cnk7CisJfQogCiAJaWYgKHVubGlrZWx5KCFidWZmZXJfdXB0b2RhdGUoYmgpKSkKIAkJcmV0ID0gLUVJTzsKQEAgLTMzMiwxMyArMzU1LDE1IEBACiAJaW50IGZsYWdzOwogCWludCBlcnI7CiAJdW5zaWduZWQgbG9uZyBsb25nIGJsb2NrbnI7CisJa3RpbWVfdCBzdGFydF90aW1lOworCXU2NCBjb21taXRfdGltZTsKIAljaGFyICp0YWdwID0gTlVMTDsKIAlqb3VybmFsX2hlYWRlcl90ICpoZWFkZXI7CiAJam91cm5hbF9ibG9ja190YWdfdCAqdGFnID0gTlVMTDsKIAlpbnQgc3BhY2VfbGVmdCA9IDA7CiAJaW50IGZpcnN0X3RhZyA9IDA7CiAJaW50IHRhZ19mbGFnOwotCWludCBpOworCWludCBpLCB0b19mcmVlID0gMDsKIAlpbnQgdGFnX2J5dGVzID0gam91cm5hbF90YWdfYnl0ZXMoam91cm5hbCk7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpjYmggPSBOVUxMOyAvKiBGb3IgdHJhbnNhY3Rpb25hbCBjaGVja3N1bXMgKi8KIAlfX3UzMiBjcmMzMl9zdW0gPSB+MDsKQEAgLTQ1OCw2ICs0ODMsNyBAQAogCWNvbW1pdF90cmFuc2FjdGlvbi0+dF9zdGF0ZSA9IFRfRkxVU0g7CiAJam91cm5hbC0+al9jb21taXR0aW5nX3RyYW5zYWN0aW9uID0gY29tbWl0X3RyYW5zYWN0aW9uOwogCWpvdXJuYWwtPmpfcnVubmluZ190cmFuc2FjdGlvbiA9IE5VTEw7CisJc3RhcnRfdGltZSA9IGt0aW1lX2dldCgpOwogCWNvbW1pdF90cmFuc2FjdGlvbi0+dF9sb2dfc3RhcnQgPSBqb3VybmFsLT5qX2hlYWQ7CiAJd2FrZV91cCgmam91cm5hbC0+al93YWl0X3RyYW5zYWN0aW9uX2xvY2tlZCk7CiAJc3Bpbl91bmxvY2soJmpvdXJuYWwtPmpfc3RhdGVfbG9jayk7CkBAIC04MDMsNyArODI5LDcgQEAKIAkJCV9famJkMl9qb3VybmFsX2Fib3J0X2hhcmQoam91cm5hbCk7CiAJfQogCWlmICghZXJyICYmICFpc19qb3VybmFsX2Fib3J0ZWQoam91cm5hbCkpCi0JCWVyciA9IGpvdXJuYWxfd2FpdF9vbl9jb21taXRfcmVjb3JkKGNiaCk7CisJCWVyciA9IGpvdXJuYWxfd2FpdF9vbl9jb21taXRfcmVjb3JkKGpvdXJuYWwsIGNiaCk7CiAKIAlpZiAoZXJyKQogCQlqYmQyX2pvdXJuYWxfYWJvcnQoam91cm5hbCwgZXJyKTsKQEAgLTk4MSwxNCArMTAwNywyMyBAQAogCUpfQVNTRVJUKGNvbW1pdF90cmFuc2FjdGlvbiA9PSBqb3VybmFsLT5qX2NvbW1pdHRpbmdfdHJhbnNhY3Rpb24pOwogCWpvdXJuYWwtPmpfY29tbWl0X3NlcXVlbmNlID0gY29tbWl0X3RyYW5zYWN0aW9uLT50X3RpZDsKIAlqb3VybmFsLT5qX2NvbW1pdHRpbmdfdHJhbnNhY3Rpb24gPSBOVUxMOwotCXNwaW5fdW5sb2NrKCZqb3VybmFsLT5qX3N0YXRlX2xvY2spOworCWNvbW1pdF90aW1lID0ga3RpbWVfdG9fbnMoa3RpbWVfc3ViKGt0aW1lX2dldCgpLCBzdGFydF90aW1lKSk7CiAKLQlpZiAoam91cm5hbC0+al9jb21taXRfY2FsbGJhY2spCi0JCWpvdXJuYWwtPmpfY29tbWl0X2NhbGxiYWNrKGpvdXJuYWwsIGNvbW1pdF90cmFuc2FjdGlvbik7CisJLyoKKwkgKiB3ZWlnaHQgdGhlIGNvbW1pdCB0aW1lIGhpZ2hlciB0aGFuIHRoZSBhdmVyYWdlIHRpbWUgc28gd2UgZG9uJ3QKKwkgKiByZWFjdCB0b28gc3Ryb25nbHkgdG8gdmFzdCBjaGFuZ2VzIGluIHRoZSBjb21taXQgdGltZQorCSAqLworCWlmIChsaWtlbHkoam91cm5hbC0+al9hdmVyYWdlX2NvbW1pdF90aW1lKSkKKwkJam91cm5hbC0+al9hdmVyYWdlX2NvbW1pdF90aW1lID0gKGNvbW1pdF90aW1lICsKKwkJCQlqb3VybmFsLT5qX2F2ZXJhZ2VfY29tbWl0X3RpbWUqMykgLyA0OworCWVsc2UKKwkJam91cm5hbC0+al9hdmVyYWdlX2NvbW1pdF90aW1lID0gY29tbWl0X3RpbWU7CisJc3Bpbl91bmxvY2soJmpvdXJuYWwtPmpfc3RhdGVfbG9jayk7CiAKIAlpZiAoY29tbWl0X3RyYW5zYWN0aW9uLT50X2NoZWNrcG9pbnRfbGlzdCA9PSBOVUxMICYmCiAJICAgIGNvbW1pdF90cmFuc2FjdGlvbi0+dF9jaGVja3BvaW50X2lvX2xpc3QgPT0gTlVMTCkgewogCQlfX2piZDJfam91cm5hbF9kcm9wX3RyYW5zYWN0aW9uKGpvdXJuYWwsIGNvbW1pdF90cmFuc2FjdGlvbik7CisJCXRvX2ZyZWUgPSAxOwogCX0gZWxzZSB7CiAJCWlmIChqb3VybmFsLT5qX2NoZWNrcG9pbnRfdHJhbnNhY3Rpb25zID09IE5VTEwpIHsKIAkJCWpvdXJuYWwtPmpfY2hlY2twb2ludF90cmFuc2FjdGlvbnMgPSBjb21taXRfdHJhbnNhY3Rpb247CkBAIC0xMDA3LDExICsxMDQyLDE2IEBACiAJfQogCXNwaW5fdW5sb2NrKCZqb3VybmFsLT5qX2xpc3RfbG9jayk7CiAKKwlpZiAoam91cm5hbC0+al9jb21taXRfY2FsbGJhY2spCisJCWpvdXJuYWwtPmpfY29tbWl0X2NhbGxiYWNrKGpvdXJuYWwsIGNvbW1pdF90cmFuc2FjdGlvbik7CisKIAl0cmFjZV9tYXJrKGpiZDJfZW5kX2NvbW1pdCwgImRldiAlcyB0cmFuc2FjdGlvbiAlZCBoZWFkICVkIiwKLQkJICAgam91cm5hbC0+al9kZXZuYW1lLCBqb3VybmFsLT5qX2NvbW1pdF9zZXF1ZW5jZSwKKwkJICAgam91cm5hbC0+al9kZXZuYW1lLCBjb21taXRfdHJhbnNhY3Rpb24tPnRfdGlkLAogCQkgICBqb3VybmFsLT5qX3RhaWxfc2VxdWVuY2UpOwogCWpiZF9kZWJ1ZygxLCAiSkJEOiBjb21taXQgJWQgY29tcGxldGUsIGhlYWQgJWRcbiIsCiAJCSAgam91cm5hbC0+al9jb21taXRfc2VxdWVuY2UsIGpvdXJuYWwtPmpfdGFpbF9zZXF1ZW5jZSk7CisJaWYgKHRvX2ZyZWUpCisJCWtmcmVlKGNvbW1pdF90cmFuc2FjdGlvbik7CiAKIAl3YWtlX3VwKCZqb3VybmFsLT5qX3dhaXRfZG9uZV9jb21taXQpOwogfQpkaWZmIC0tZ2l0IGEvZnMvamJkMi9qb3VybmFsLmMgYi9mcy9qYmQyL2pvdXJuYWwuYwppbmRleCBmNmJmZjlkLi41NjY3NTMwIDEwMDY0NAotLS0gYS9mcy9qYmQyL2pvdXJuYWwuYworKysgYi9mcy9qYmQyL2pvdXJuYWwuYwpAQCAtNDAsNiArNDAsNyBAQAogCiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vcGFnZS5oPgorI2luY2x1ZGUgPGFzbS9kaXY2NC5oPgogCiBFWFBPUlRfU1lNQk9MKGpiZDJfam91cm5hbF9zdGFydCk7CiBFWFBPUlRfU1lNQk9MKGpiZDJfam91cm5hbF9yZXN0YXJ0KTsKQEAgLTY2LDcgKzY3LDYgQEAKIEVYUE9SVF9TWU1CT0woamJkMl9qb3VybmFsX2NoZWNrX3VzZWRfZmVhdHVyZXMpOwogRVhQT1JUX1NZTUJPTChqYmQyX2pvdXJuYWxfY2hlY2tfYXZhaWxhYmxlX2ZlYXR1cmVzKTsKIEVYUE9SVF9TWU1CT0woamJkMl9qb3VybmFsX3NldF9mZWF0dXJlcyk7Ci1FWFBPUlRfU1lNQk9MKGpiZDJfam91cm5hbF9jcmVhdGUpOwogRVhQT1JUX1NZTUJPTChqYmQyX2pvdXJuYWxfbG9hZCk7CiBFWFBPUlRfU1lNQk9MKGpiZDJfam91cm5hbF9kZXN0cm95KTsKIEVYUE9SVF9TWU1CT0woamJkMl9qb3VybmFsX2Fib3J0KTsKQEAgLTEzMiw4ICsxMzIsOSBAQAogCWpvdXJuYWwtPmpfdGFzayA9IGN1cnJlbnQ7CiAJd2FrZV91cCgmam91cm5hbC0+al93YWl0X2RvbmVfY29tbWl0KTsKIAotCXByaW50ayhLRVJOX0lORk8gImtqb3VybmFsZDIgc3RhcnRpbmcuICBDb21taXQgaW50ZXJ2YWwgJWxkIHNlY29uZHNcbiIsCi0JCQlqb3VybmFsLT5qX2NvbW1pdF9pbnRlcnZhbCAvIEhaKTsKKwlwcmludGsoS0VSTl9JTkZPICJram91cm5hbGQyIHN0YXJ0aW5nOiBwaWQgJWQsIGRldiAlcywgIgorCSAgICAgICAiY29tbWl0IGludGVydmFsICVsZCBzZWNvbmRzXG4iLCBjdXJyZW50LT5waWQsCisJICAgICAgIGpvdXJuYWwtPmpfZGV2bmFtZSwgam91cm5hbC0+al9jb21taXRfaW50ZXJ2YWwgLyBIWik7CiAKIAkvKgogCSAqIEFuZCBub3csIHdhaXQgZm9yZXZlciBmb3IgY29tbWl0IHdha2V1cCBldmVudHMuCkBAIC02NTAsNiArNjUxLDggQEAKIAkJcmV0dXJuIE5VTEw7CiAKIAliaCA9IF9fZ2V0YmxrKGpvdXJuYWwtPmpfZGV2LCBibG9ja25yLCBqb3VybmFsLT5qX2Jsb2Nrc2l6ZSk7CisJaWYgKCFiaCkKKwkJcmV0dXJuIE5VTEw7CiAJbG9ja19idWZmZXIoYmgpOwogCW1lbXNldChiaC0+Yl9kYXRhLCAwLCBqb3VybmFsLT5qX2Jsb2Nrc2l6ZSk7CiAJc2V0X2J1ZmZlcl91cHRvZGF0ZShiaCk7CkBAIC04NDMsNiArODQ2LDggQEAKIAkgICAgamlmZmllc190b19tc2VjcyhzLT5zdGF0cy0+dS5ydW4ucnNfZmx1c2hpbmcgLyBzLT5zdGF0cy0+dHNfdGlkKSk7CiAJc2VxX3ByaW50ZihzZXEsICIgICV1bXMgbG9nZ2luZyB0cmFuc2FjdGlvblxuIiwKIAkgICAgamlmZmllc190b19tc2VjcyhzLT5zdGF0cy0+dS5ydW4ucnNfbG9nZ2luZyAvIHMtPnN0YXRzLT50c190aWQpKTsKKwlzZXFfcHJpbnRmKHNlcSwgIiAgJWx1dXMgYXZlcmFnZSB0cmFuc2FjdGlvbiBjb21taXQgdGltZVxuIiwKKwkJICAgZG9fZGl2KHMtPmpvdXJuYWwtPmpfYXZlcmFnZV9jb21taXRfdGltZSwgMTAwMCkpOwogCXNlcV9wcmludGYoc2VxLCAiICAlbHUgaGFuZGxlcyBwZXIgdHJhbnNhY3Rpb25cbiIsCiAJICAgIHMtPnN0YXRzLT51LnJ1bi5yc19oYW5kbGVfY291bnQgLyBzLT5zdGF0cy0+dHNfdGlkKTsKIAlzZXFfcHJpbnRmKHNlcSwgIiAgJWx1IGJsb2NrcyBwZXIgdHJhbnNhY3Rpb25cbiIsCkBAIC05ODAsNiArOTg1LDggQEAKIAlzcGluX2xvY2tfaW5pdCgmam91cm5hbC0+al9zdGF0ZV9sb2NrKTsKIAogCWpvdXJuYWwtPmpfY29tbWl0X2ludGVydmFsID0gKEhaICogSkJEMl9ERUZBVUxUX01BWF9DT01NSVRfQUdFKTsKKwlqb3VybmFsLT5qX21pbl9iYXRjaF90aW1lID0gMDsKKwlqb3VybmFsLT5qX21heF9iYXRjaF90aW1lID0gMTUwMDA7IC8qIDE1bXMgKi8KIAogCS8qIFRoZSBqb3VybmFsIGlzIG1hcmtlZCBmb3IgZXJyb3IgdW50aWwgd2Ugc3VjY2VlZCB3aXRoIHJlY292ZXJ5ISAqLwogCWpvdXJuYWwtPmpfZmxhZ3MgPSBKQkQyX0FCT1JUOwpAQCAtMTAzNSwxNSArMTA0MiwxNCBAQAogCiAJLyogam91cm5hbCBkZXNjcmlwdG9yIGNhbiBzdG9yZSB1cCB0byBuIGJsb2NrcyAtYnp6eiAqLwogCWpvdXJuYWwtPmpfYmxvY2tzaXplID0gYmxvY2tzaXplOworCWpiZDJfc3RhdHNfcHJvY19pbml0KGpvdXJuYWwpOwogCW4gPSBqb3VybmFsLT5qX2Jsb2Nrc2l6ZSAvIHNpemVvZihqb3VybmFsX2Jsb2NrX3RhZ190KTsKIAlqb3VybmFsLT5qX3didWZzaXplID0gbjsKIAlqb3VybmFsLT5qX3didWYgPSBrbWFsbG9jKG4gKiBzaXplb2Yoc3RydWN0IGJ1ZmZlcl9oZWFkKiksIEdGUF9LRVJORUwpOwogCWlmICgham91cm5hbC0+al93YnVmKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiJXM6IENhbnQgYWxsb2NhdGUgYmhzIGZvciBjb21taXQgdGhyZWFkXG4iLAogCQkJX19mdW5jX18pOwotCQlrZnJlZShqb3VybmFsKTsKLQkJam91cm5hbCA9IE5VTEw7Ci0JCWdvdG8gb3V0OworCQlnb3RvIG91dF9lcnI7CiAJfQogCWpvdXJuYWwtPmpfZGV2ID0gYmRldjsKIAlqb3VybmFsLT5qX2ZzX2RldiA9IGZzX2RldjsKQEAgLTEwNTMsMTQgKzEwNTksMjIgQEAKIAlwID0gam91cm5hbC0+al9kZXZuYW1lOwogCXdoaWxlICgocCA9IHN0cmNocihwLCAnLycpKSkKIAkJKnAgPSAnISc7Ci0JamJkMl9zdGF0c19wcm9jX2luaXQoam91cm5hbCk7CiAKIAliaCA9IF9fZ2V0YmxrKGpvdXJuYWwtPmpfZGV2LCBzdGFydCwgam91cm5hbC0+al9ibG9ja3NpemUpOwotCUpfQVNTRVJUKGJoICE9IE5VTEwpOworCWlmICghYmgpIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCSAgICAgICAiJXM6IENhbm5vdCBnZXQgYnVmZmVyIGZvciBqb3VybmFsIHN1cGVyYmxvY2tcbiIsCisJCSAgICAgICBfX2Z1bmNfXyk7CisJCWdvdG8gb3V0X2VycjsKKwl9CiAJam91cm5hbC0+al9zYl9idWZmZXIgPSBiaDsKIAlqb3VybmFsLT5qX3N1cGVyYmxvY2sgPSAoam91cm5hbF9zdXBlcmJsb2NrX3QgKiliaC0+Yl9kYXRhOwotb3V0OgorCiAJcmV0dXJuIGpvdXJuYWw7CitvdXRfZXJyOgorCWpiZDJfc3RhdHNfcHJvY19leGl0KGpvdXJuYWwpOworCWtmcmVlKGpvdXJuYWwpOworCXJldHVybiBOVUxMOwogfQogCiAvKioKQEAgLTExMDgsOSArMTEyMiw3IEBACiAJaWYgKCFqb3VybmFsLT5qX3didWYpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICIlczogQ2FudCBhbGxvY2F0ZSBiaHMgZm9yIGNvbW1pdCB0aHJlYWRcbiIsCiAJCQlfX2Z1bmNfXyk7Ci0JCWpiZDJfc3RhdHNfcHJvY19leGl0KGpvdXJuYWwpOwotCQlrZnJlZShqb3VybmFsKTsKLQkJcmV0dXJuIE5VTEw7CisJCWdvdG8gb3V0X2VycjsKIAl9CiAKIAllcnIgPSBqYmQyX2pvdXJuYWxfYm1hcChqb3VybmFsLCAwLCAmYmxvY2tucik7CkBAIC0xMTE4LDE3ICsxMTMwLDI0IEBACiAJaWYgKGVycikgewogCQlwcmludGsoS0VSTl9FUlIgIiVzOiBDYW5ubm90IGxvY2F0ZSBqb3VybmFsIHN1cGVyYmxvY2tcbiIsCiAJCSAgICAgICBfX2Z1bmNfXyk7Ci0JCWpiZDJfc3RhdHNfcHJvY19leGl0KGpvdXJuYWwpOwotCQlrZnJlZShqb3VybmFsKTsKLQkJcmV0dXJuIE5VTEw7CisJCWdvdG8gb3V0X2VycjsKIAl9CiAKIAliaCA9IF9fZ2V0YmxrKGpvdXJuYWwtPmpfZGV2LCBibG9ja25yLCBqb3VybmFsLT5qX2Jsb2Nrc2l6ZSk7Ci0JSl9BU1NFUlQoYmggIT0gTlVMTCk7CisJaWYgKCFiaCkgeworCQlwcmludGsoS0VSTl9FUlIKKwkJICAgICAgICIlczogQ2Fubm90IGdldCBidWZmZXIgZm9yIGpvdXJuYWwgc3VwZXJibG9ja1xuIiwKKwkJICAgICAgIF9fZnVuY19fKTsKKwkJZ290byBvdXRfZXJyOworCX0KIAlqb3VybmFsLT5qX3NiX2J1ZmZlciA9IGJoOwogCWpvdXJuYWwtPmpfc3VwZXJibG9jayA9IChqb3VybmFsX3N1cGVyYmxvY2tfdCAqKWJoLT5iX2RhdGE7CiAKIAlyZXR1cm4gam91cm5hbDsKK291dF9lcnI6CisJamJkMl9zdGF0c19wcm9jX2V4aXQoam91cm5hbCk7CisJa2ZyZWUoam91cm5hbCk7CisJcmV0dXJuIE5VTEw7CiB9CiAKIC8qCkBAIC0xMTc3LDc3ICsxMTk2LDYgQEAKIH0KIAogLyoqCi0gKiBpbnQgamJkMl9qb3VybmFsX2NyZWF0ZSgpIC0gSW5pdGlhbGlzZSB0aGUgbmV3IGpvdXJuYWwgZmlsZQotICogQGpvdXJuYWw6IEpvdXJuYWwgdG8gY3JlYXRlLiBUaGlzIHN0cnVjdHVyZSBtdXN0IGhhdmUgYmVlbiBpbml0aWFsaXNlZAotICoKLSAqIEdpdmVuIGEgam91cm5hbF90IHN0cnVjdHVyZSB3aGljaCB0ZWxscyB1cyB3aGljaCBkaXNrIGJsb2NrcyB3ZSBjYW4KLSAqIHVzZSwgY3JlYXRlIGEgbmV3IGpvdXJuYWwgc3VwZXJibG9jayBhbmQgaW5pdGlhbGlzZSBhbGwgb2YgdGhlCi0gKiBqb3VybmFsIGZpZWxkcyBmcm9tIHNjcmF0Y2guCi0gKiovCi1pbnQgamJkMl9qb3VybmFsX2NyZWF0ZShqb3VybmFsX3QgKmpvdXJuYWwpCi17Ci0JdW5zaWduZWQgbG9uZyBsb25nIGJsb2NrbnI7Ci0Jc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKLQlqb3VybmFsX3N1cGVyYmxvY2tfdCAqc2I7Ci0JaW50IGksIGVycjsKLQotCWlmIChqb3VybmFsLT5qX21heGxlbiA8IEpCRDJfTUlOX0pPVVJOQUxfQkxPQ0tTKSB7Ci0JCXByaW50ayAoS0VSTl9FUlIgIkpvdXJuYWwgbGVuZ3RoICglZCBibG9ja3MpIHRvbyBzaG9ydC5cbiIsCi0JCQlqb3VybmFsLT5qX21heGxlbik7Ci0JCWpvdXJuYWxfZmFpbF9zdXBlcmJsb2NrKGpvdXJuYWwpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlpZiAoam91cm5hbC0+al9pbm9kZSA9PSBOVUxMKSB7Ci0JCS8qCi0JCSAqIFdlIGRvbid0IGtub3cgd2hhdCBibG9jayB0byBzdGFydCBhdCEKLQkJICovCi0JCXByaW50ayhLRVJOX0VNRVJHCi0JCSAgICAgICAiJXM6IGNyZWF0aW9uIG9mIGpvdXJuYWwgb24gZXh0ZXJuYWwgZGV2aWNlIVxuIiwKLQkJICAgICAgIF9fZnVuY19fKTsKLQkJQlVHKCk7Ci0JfQotCi0JLyogWmVybyBvdXQgdGhlIGVudGlyZSBqb3VybmFsIG9uIGRpc2suICBXZSBjYW5ub3QgYWZmb3JkIHRvCi0JICAgaGF2ZSBhbnkgYmxvY2tzIG9uIGRpc2sgYmVnaW5uaW5nIHdpdGggSkJEMl9NQUdJQ19OVU1CRVIuICovCi0JamJkX2RlYnVnKDEsICJKQkQ6IFplcm9pbmcgb3V0IGpvdXJuYWwgYmxvY2tzLi4uXG4iKTsKLQlmb3IgKGkgPSAwOyBpIDwgam91cm5hbC0+al9tYXhsZW47IGkrKykgewotCQllcnIgPSBqYmQyX2pvdXJuYWxfYm1hcChqb3VybmFsLCBpLCAmYmxvY2tucik7Ci0JCWlmIChlcnIpCi0JCQlyZXR1cm4gZXJyOwotCQliaCA9IF9fZ2V0YmxrKGpvdXJuYWwtPmpfZGV2LCBibG9ja25yLCBqb3VybmFsLT5qX2Jsb2Nrc2l6ZSk7Ci0JCWxvY2tfYnVmZmVyKGJoKTsKLQkJbWVtc2V0IChiaC0+Yl9kYXRhLCAwLCBqb3VybmFsLT5qX2Jsb2Nrc2l6ZSk7Ci0JCUJVRkZFUl9UUkFDRShiaCwgIm1hcmtpbmcgZGlydHkiKTsKLQkJbWFya19idWZmZXJfZGlydHkoYmgpOwotCQlCVUZGRVJfVFJBQ0UoYmgsICJtYXJraW5nIHVwdG9kYXRlIik7Ci0JCXNldF9idWZmZXJfdXB0b2RhdGUoYmgpOwotCQl1bmxvY2tfYnVmZmVyKGJoKTsKLQkJX19icmVsc2UoYmgpOwotCX0KLQotCXN5bmNfYmxvY2tkZXYoam91cm5hbC0+al9kZXYpOwotCWpiZF9kZWJ1ZygxLCAiSkJEOiBqb3VybmFsIGNsZWFyZWQuXG4iKTsKLQotCS8qIE9LLCBmaWxsIGluIHRoZSBpbml0aWFsIHN0YXRpYyBmaWVsZHMgaW4gdGhlIG5ldyBzdXBlcmJsb2NrICovCi0Jc2IgPSBqb3VybmFsLT5qX3N1cGVyYmxvY2s7Ci0KLQlzYi0+c19oZWFkZXIuaF9tYWdpYwkgPSBjcHVfdG9fYmUzMihKQkQyX01BR0lDX05VTUJFUik7Ci0Jc2ItPnNfaGVhZGVyLmhfYmxvY2t0eXBlID0gY3B1X3RvX2JlMzIoSkJEMl9TVVBFUkJMT0NLX1YyKTsKLQotCXNiLT5zX2Jsb2Nrc2l6ZQk9IGNwdV90b19iZTMyKGpvdXJuYWwtPmpfYmxvY2tzaXplKTsKLQlzYi0+c19tYXhsZW4JPSBjcHVfdG9fYmUzMihqb3VybmFsLT5qX21heGxlbik7Ci0Jc2ItPnNfZmlyc3QJPSBjcHVfdG9fYmUzMigxKTsKLQotCWpvdXJuYWwtPmpfdHJhbnNhY3Rpb25fc2VxdWVuY2UgPSAxOwotCi0Jam91cm5hbC0+al9mbGFncyAmPSB+SkJEMl9BQk9SVDsKLQlqb3VybmFsLT5qX2Zvcm1hdF92ZXJzaW9uID0gMjsKLQotCXJldHVybiBqb3VybmFsX3Jlc2V0KGpvdXJuYWwpOwotfQotCi0vKioKICAqIHZvaWQgamJkMl9qb3VybmFsX3VwZGF0ZV9zdXBlcmJsb2NrKCkgLSBVcGRhdGUgam91cm5hbCBzYiBvbiBkaXNrLgogICogQGpvdXJuYWw6IFRoZSBqb3VybmFsIHRvIHVwZGF0ZS4KICAqIEB3YWl0OiBTZXQgdG8gJzAnIGlmIHlvdSBkb24ndCB3YW50IHRvIHdhaXQgZm9yIElPIGNvbXBsZXRpb24uCkBAIC0xNDkxLDcgKzE0MzksOSBAQAogCXNwaW5fbG9jaygmam91cm5hbC0+al9saXN0X2xvY2spOwogCXdoaWxlIChqb3VybmFsLT5qX2NoZWNrcG9pbnRfdHJhbnNhY3Rpb25zICE9IE5VTEwpIHsKIAkJc3Bpbl91bmxvY2soJmpvdXJuYWwtPmpfbGlzdF9sb2NrKTsKKwkJbXV0ZXhfbG9jaygmam91cm5hbC0+al9jaGVja3BvaW50X211dGV4KTsKIAkJamJkMl9sb2dfZG9fY2hlY2twb2ludChqb3VybmFsKTsKKwkJbXV0ZXhfdW5sb2NrKCZqb3VybmFsLT5qX2NoZWNrcG9pbnRfbXV0ZXgpOwogCQlzcGluX2xvY2soJmpvdXJuYWwtPmpfbGlzdF9sb2NrKTsKIAl9CiAKZGlmZiAtLWdpdCBhL2ZzL2piZDIvdHJhbnNhY3Rpb24uYyBiL2ZzL2piZDIvdHJhbnNhY3Rpb24uYwppbmRleCA0ZjkyNWE0Li40NmI0ZTM0IDEwMDY0NAotLS0gYS9mcy9qYmQyL3RyYW5zYWN0aW9uLmMKKysrIGIvZnMvamJkMi90cmFuc2FjdGlvbi5jCkBAIC0yNSw2ICsyNSw3IEBACiAjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9ocnRpbWVyLmg+CiAKIHN0YXRpYyB2b2lkIF9famJkMl9qb3VybmFsX3RlbXBfdW5saW5rX2J1ZmZlcihzdHJ1Y3Qgam91cm5hbF9oZWFkICpqaCk7CiAKQEAgLTQ4LDYgKzQ5LDcgQEAKIHsKIAl0cmFuc2FjdGlvbi0+dF9qb3VybmFsID0gam91cm5hbDsKIAl0cmFuc2FjdGlvbi0+dF9zdGF0ZSA9IFRfUlVOTklORzsKKwl0cmFuc2FjdGlvbi0+dF9zdGFydF90aW1lID0ga3RpbWVfZ2V0KCk7CiAJdHJhbnNhY3Rpb24tPnRfdGlkID0gam91cm5hbC0+al90cmFuc2FjdGlvbl9zZXF1ZW5jZSsrOwogCXRyYW5zYWN0aW9uLT50X2V4cGlyZXMgPSBqaWZmaWVzICsgam91cm5hbC0+al9jb21taXRfaW50ZXJ2YWw7CiAJc3Bpbl9sb2NrX2luaXQoJnRyYW5zYWN0aW9uLT50X2hhbmRsZV9sb2NrKTsKQEAgLTEyNDAsNyArMTI0Miw3IEBACiB7CiAJdHJhbnNhY3Rpb25fdCAqdHJhbnNhY3Rpb24gPSBoYW5kbGUtPmhfdHJhbnNhY3Rpb247CiAJam91cm5hbF90ICpqb3VybmFsID0gdHJhbnNhY3Rpb24tPnRfam91cm5hbDsKLQlpbnQgb2xkX2hhbmRsZV9jb3VudCwgZXJyOworCWludCBlcnI7CiAJcGlkX3QgcGlkOwogCiAJSl9BU1NFUlQoam91cm5hbF9jdXJyZW50X2hhbmRsZSgpID09IGhhbmRsZSk7CkBAIC0xMjYzLDI0ICsxMjY1LDU0IEBACiAJLyoKIAkgKiBJbXBsZW1lbnQgc3luY2hyb25vdXMgdHJhbnNhY3Rpb24gYmF0Y2hpbmcuICBJZiB0aGUgaGFuZGxlCiAJICogd2FzIHN5bmNocm9ub3VzLCBkb24ndCBmb3JjZSBhIGNvbW1pdCBpbW1lZGlhdGVseS4gIExldCdzCi0JICogeWllbGQgYW5kIGxldCBhbm90aGVyIHRocmVhZCBwaWdneWJhY2sgb250byB0aGlzIHRyYW5zYWN0aW9uLgotCSAqIEtlZXAgZG9pbmcgdGhhdCB3aGlsZSBuZXcgdGhyZWFkcyBjb250aW51ZSB0byBhcnJpdmUuCi0JICogSXQgZG9lc24ndCBjb3N0IG11Y2ggLSB3ZSdyZSBhYm91dCB0byBydW4gYSBjb21taXQgYW5kIHNsZWVwCi0JICogb24gSU8gYW55d2F5LiAgU3BlZWRzIHVwIG1hbnktdGhyZWFkZWQsIG1hbnktZGlyIG9wZXJhdGlvbnMKLQkgKiBieSAzMHggb3IgbW9yZS4uLgorCSAqIHlpZWxkIGFuZCBsZXQgYW5vdGhlciB0aHJlYWQgcGlnZ3liYWNrIG9udG8gdGhpcworCSAqIHRyYW5zYWN0aW9uLiAgS2VlcCBkb2luZyB0aGF0IHdoaWxlIG5ldyB0aHJlYWRzIGNvbnRpbnVlIHRvCisJICogYXJyaXZlLiAgSXQgZG9lc24ndCBjb3N0IG11Y2ggLSB3ZSdyZSBhYm91dCB0byBydW4gYSBjb21taXQKKwkgKiBhbmQgc2xlZXAgb24gSU8gYW55d2F5LiAgU3BlZWRzIHVwIG1hbnktdGhyZWFkZWQsIG1hbnktZGlyCisJICogb3BlcmF0aW9ucyBieSAzMHggb3IgbW9yZS4uLgogCSAqCi0JICogQnV0IGRvbid0IGRvIHRoaXMgaWYgdGhpcyBwcm9jZXNzIHdhcyB0aGUgbW9zdCByZWNlbnQgb25lIHRvCi0JICogcGVyZm9ybSBhIHN5bmNocm9ub3VzIHdyaXRlLiAgV2UgZG8gdGhpcyB0byBkZXRlY3QgdGhlIGNhc2Ugd2hlcmUgYQotCSAqIHNpbmdsZSBwcm9jZXNzIGlzIGRvaW5nIGEgc3RyZWFtIG9mIHN5bmMgd3JpdGVzLiAgTm8gcG9pbnQgaW4gd2FpdGluZwotCSAqIGZvciBqb2luZXJzIGluIHRoYXQgY2FzZS4KKwkgKiBXZSB0cnkgYW5kIG9wdGltaXplIHRoZSBzbGVlcCB0aW1lIGFnYWluc3Qgd2hhdCB0aGUKKwkgKiB1bmRlcmx5aW5nIGRpc2sgY2FuIGRvLCBpbnN0ZWFkIG9mIGhhdmluZyBhIHN0YXRpYyBzbGVlcAorCSAqIHRpbWUuICBUaGlzIGlzIHVzZWZ1bCBmb3IgdGhlIGNhc2Ugd2hlcmUgb3VyIHN0b3JhZ2UgaXMgc28KKwkgKiBmYXN0IHRoYXQgaXQgaXMgbW9yZSBvcHRpbWFsIHRvIGdvIGFoZWFkIGFuZCBmb3JjZSBhIGZsdXNoCisJICogYW5kIHdhaXQgZm9yIHRoZSB0cmFuc2FjdGlvbiB0byBiZSBjb21taXR0ZWQgdGhhbiBpdCBpcyB0bworCSAqIHdhaXQgZm9yIGFuIGFyYml0cmFyeSBhbW91bnQgb2YgdGltZSBmb3IgbmV3IHdyaXRlcnMgdG8KKwkgKiBqb2luIHRoZSB0cmFuc2FjdGlvbi4gIFdlIGFjaGlldmUgdGhpcyBieSBtZWFzdXJpbmcgaG93CisJICogbG9uZyBpdCB0YWtlcyB0byBjb21taXQgYSB0cmFuc2FjdGlvbiwgYW5kIGNvbXBhcmUgaXQgd2l0aAorCSAqIGhvdyBsb25nIHRoaXMgdHJhbnNhY3Rpb24gaGFzIGJlZW4gcnVubmluZywgYW5kIGlmIHJ1biB0aW1lCisJICogPCBjb21taXQgdGltZSB0aGVuIHdlIHNsZWVwIGZvciB0aGUgZGVsdGEgYW5kIGNvbW1pdC4gIFRoaXMKKwkgKiBncmVhdGx5IGhlbHBzIHN1cGVyIGZhc3QgZGlza3MgdGhhdCB3b3VsZCBzZWUgc2xvd2Rvd25zIGFzCisJICogbW9yZSB0aHJlYWRzIHN0YXJ0ZWQgZG9pbmcgZnN5bmNzLgorCSAqCisJICogQnV0IGRvbid0IGRvIHRoaXMgaWYgdGhpcyBwcm9jZXNzIHdhcyB0aGUgbW9zdCByZWNlbnQgb25lCisJICogdG8gcGVyZm9ybSBhIHN5bmNocm9ub3VzIHdyaXRlLiAgV2UgZG8gdGhpcyB0byBkZXRlY3QgdGhlCisJICogY2FzZSB3aGVyZSBhIHNpbmdsZSBwcm9jZXNzIGlzIGRvaW5nIGEgc3RyZWFtIG9mIHN5bmMKKwkgKiB3cml0ZXMuICBObyBwb2ludCBpbiB3YWl0aW5nIGZvciBqb2luZXJzIGluIHRoYXQgY2FzZS4KIAkgKi8KIAlwaWQgPSBjdXJyZW50LT5waWQ7CiAJaWYgKGhhbmRsZS0+aF9zeW5jICYmIGpvdXJuYWwtPmpfbGFzdF9zeW5jX3dyaXRlciAhPSBwaWQpIHsKKwkJdTY0IGNvbW1pdF90aW1lLCB0cmFuc190aW1lOworCiAJCWpvdXJuYWwtPmpfbGFzdF9zeW5jX3dyaXRlciA9IHBpZDsKLQkJZG8gewotCQkJb2xkX2hhbmRsZV9jb3VudCA9IHRyYW5zYWN0aW9uLT50X2hhbmRsZV9jb3VudDsKLQkJCXNjaGVkdWxlX3RpbWVvdXRfdW5pbnRlcnJ1cHRpYmxlKDEpOwotCQl9IHdoaWxlIChvbGRfaGFuZGxlX2NvdW50ICE9IHRyYW5zYWN0aW9uLT50X2hhbmRsZV9jb3VudCk7CisKKwkJc3Bpbl9sb2NrKCZqb3VybmFsLT5qX3N0YXRlX2xvY2spOworCQljb21taXRfdGltZSA9IGpvdXJuYWwtPmpfYXZlcmFnZV9jb21taXRfdGltZTsKKwkJc3Bpbl91bmxvY2soJmpvdXJuYWwtPmpfc3RhdGVfbG9jayk7CisKKwkJdHJhbnNfdGltZSA9IGt0aW1lX3RvX25zKGt0aW1lX3N1YihrdGltZV9nZXQoKSwKKwkJCQkJCSAgIHRyYW5zYWN0aW9uLT50X3N0YXJ0X3RpbWUpKTsKKworCQljb21taXRfdGltZSA9IG1heF90KHU2NCwgY29tbWl0X3RpbWUsCisJCQkJICAgIDEwMDAqam91cm5hbC0+al9taW5fYmF0Y2hfdGltZSk7CisJCWNvbW1pdF90aW1lID0gbWluX3QodTY0LCBjb21taXRfdGltZSwKKwkJCQkgICAgMTAwMCpqb3VybmFsLT5qX21heF9iYXRjaF90aW1lKTsKKworCQlpZiAodHJhbnNfdGltZSA8IGNvbW1pdF90aW1lKSB7CisJCQlrdGltZV90IGV4cGlyZXMgPSBrdGltZV9hZGRfbnMoa3RpbWVfZ2V0KCksCisJCQkJCQkgICAgICAgY29tbWl0X3RpbWUpOworCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOworCQkJc2NoZWR1bGVfaHJ0aW1lb3V0KCZleHBpcmVzLCBIUlRJTUVSX01PREVfQUJTKTsKKwkJfQogCX0KIAogCWN1cnJlbnQtPmpvdXJuYWxfaW5mbyA9IE5VTEw7CmRpZmYgLS1naXQgYS9mcy9qZmZzMi9jb21wcl9ydWJpbi5jIGIvZnMvamZmczIvY29tcHJfcnViaW4uYwppbmRleCBjNzNmYTg5Li4xNzBkMjg5IDEwMDY0NAotLS0gYS9mcy9qZmZzMi9jb21wcl9ydWJpbi5jCisrKyBiL2ZzL2pmZnMyL2NvbXByX3J1YmluLmMKQEAgLTIyLDkgKzIyLDcgQEAKIAogCiAjZGVmaW5lIEJJVF9ESVZJREVSX01JUFMgMTA0Mwotc3RhdGljIGludCBiaXRzX21pcHNbOF0gPSB7IDI3NywyNDksMjkwLDI2NywyMjksMzQxLDIxMiwyNDF9OyAvKiBtaXBzMzIgKi8KLQotI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CitzdGF0aWMgaW50IGJpdHNfbWlwc1s4XSA9IHsgMjc3LCAyNDksIDI5MCwgMjY3LCAyMjksIDM0MSwgMjEyLCAyNDF9OwogCiBzdHJ1Y3QgcHVzaHB1bGwgewogCXVuc2lnbmVkIGNoYXIgKmJ1ZjsKQEAgLTQzLDcgKzQxLDkgQEAKIAlpbnQgYml0c1s4XTsKIH07CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBpbml0X3B1c2hwdWxsKHN0cnVjdCBwdXNocHVsbCAqcHAsIGNoYXIgKmJ1ZiwgdW5zaWduZWQgYnVmbGVuLCB1bnNpZ25lZCBvZnMsIHVuc2lnbmVkIHJlc2VydmUpCitzdGF0aWMgaW5saW5lIHZvaWQgaW5pdF9wdXNocHVsbChzdHJ1Y3QgcHVzaHB1bGwgKnBwLCBjaGFyICpidWYsCisJCQkJIHVuc2lnbmVkIGJ1ZmxlbiwgdW5zaWduZWQgb2ZzLAorCQkJCSB1bnNpZ25lZCByZXNlcnZlKQogewogCXBwLT5idWYgPSBidWY7CiAJcHAtPmJ1ZmxlbiA9IGJ1ZmxlbjsKQEAgLTUzLDE2ICs1MywxNCBAQAogCiBzdGF0aWMgaW5saW5lIGludCBwdXNoYml0KHN0cnVjdCBwdXNocHVsbCAqcHAsIGludCBiaXQsIGludCB1c2VfcmVzZXJ2ZWQpCiB7Ci0JaWYgKHBwLT5vZnMgPj0gcHAtPmJ1ZmxlbiAtICh1c2VfcmVzZXJ2ZWQ/MDpwcC0+cmVzZXJ2ZSkpIHsKKwlpZiAocHAtPm9mcyA+PSBwcC0+YnVmbGVuIC0gKHVzZV9yZXNlcnZlZD8wOnBwLT5yZXNlcnZlKSkKIAkJcmV0dXJuIC1FTk9TUEM7Ci0JfQogCi0JaWYgKGJpdCkgewotCQlwcC0+YnVmW3BwLT5vZnMgPj4gM10gfD0gKDE8PCg3LShwcC0+b2ZzICY3KSkpOwotCX0KLQllbHNlIHsKLQkJcHAtPmJ1ZltwcC0+b2ZzID4+IDNdICY9IH4oMTw8KDctKHBwLT5vZnMgJjcpKSk7Ci0JfQorCWlmIChiaXQpCisJCXBwLT5idWZbcHAtPm9mcyA+PiAzXSB8PSAoMTw8KDctKHBwLT5vZnMgJiA3KSkpOworCWVsc2UKKwkJcHAtPmJ1ZltwcC0+b2ZzID4+IDNdICY9IH4oMTw8KDctKHBwLT5vZnMgJiA3KSkpOworCiAJcHAtPm9mcysrOwogCiAJcmV0dXJuIDA7CkBAIC05Nyw2ICs5NSw3IEBACiAJcnMtPnAgPSAobG9uZykgKDIgKiBVUFBFUl9CSVRfUlVCSU4pOwogCXJzLT5iaXRfbnVtYmVyID0gKGxvbmcpIDA7CiAJcnMtPmJpdF9kaXZpZGVyID0gZGl2OworCiAJZm9yIChjPTA7IGM8ODsgYysrKQogCQlycy0+Yml0c1tjXSA9IGJpdHNbY107CiB9CkBAIC0xMDgsNyArMTA3LDggQEAKIAlsb25nIGkwLCBpMTsKIAlpbnQgcmV0OwogCi0Jd2hpbGUgKChycy0+cSA+PSBVUFBFUl9CSVRfUlVCSU4pIHx8ICgocnMtPnAgKyBycy0+cSkgPD0gVVBQRVJfQklUX1JVQklOKSkgeworCXdoaWxlICgocnMtPnEgPj0gVVBQRVJfQklUX1JVQklOKSB8fAorCSAgICAgICAoKHJzLT5wICsgcnMtPnEpIDw9IFVQUEVSX0JJVF9SVUJJTikpIHsKIAkJcnMtPmJpdF9udW1iZXIrKzsKIAogCQlyZXQgPSBwdXNoYml0KCZycy0+cHAsIChycy0+cSAmIFVQUEVSX0JJVF9SVUJJTikgPyAxIDogMCwgMCk7CkBAIC0xMTksMTIgKzExOSwxMiBAQAogCQlycy0+cCA8PD0gMTsKIAl9CiAJaTAgPSBBICogcnMtPnAgLyAoQSArIEIpOwotCWlmIChpMCA8PSAwKSB7CisJaWYgKGkwIDw9IDApCiAJCWkwID0gMTsKLQl9Ci0JaWYgKGkwID49IHJzLT5wKSB7CisKKwlpZiAoaTAgPj0gcnMtPnApCiAJCWkwID0gcnMtPnAgLSAxOwotCX0KKwogCWkxID0gcnMtPnAgLSBpMDsKIAogCWlmIChzeW1ib2wgPT0gMCkKQEAgLTE1NywxMSArMTU3LDEzIEBACiAJLyogYmVoYWx2ZSBsb3dlciAqLwogCXJzLT5yZWNfcSA9IDA7CiAKLQlmb3IgKHJzLT5iaXRfbnVtYmVyID0gMDsgcnMtPmJpdF9udW1iZXIrKyA8IFJVQklOX1JFR19TSVpFOyBycy0+cmVjX3EgPSBycy0+cmVjX3EgKiAyICsgKGxvbmcpIChwdWxsYml0KCZycy0+cHApKSkKKwlmb3IgKHJzLT5iaXRfbnVtYmVyID0gMDsgcnMtPmJpdF9udW1iZXIrKyA8IFJVQklOX1JFR19TSVpFOworCSAgICAgcnMtPnJlY19xID0gcnMtPnJlY19xICogMiArIChsb25nKSAocHVsbGJpdCgmcnMtPnBwKSkpCiAJCTsKIH0KIAotc3RhdGljIHZvaWQgX19kb19kZWNvZGUoc3RydWN0IHJ1YmluX3N0YXRlICpycywgdW5zaWduZWQgbG9uZyBwLCB1bnNpZ25lZCBsb25nIHEpCitzdGF0aWMgdm9pZCBfX2RvX2RlY29kZShzdHJ1Y3QgcnViaW5fc3RhdGUgKnJzLCB1bnNpZ25lZCBsb25nIHAsCisJCQl1bnNpZ25lZCBsb25nIHEpCiB7CiAJcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBsb3dlcl9iaXRzX3J1YmluID0gTE9XRVJfQklUU19SVUJJTjsKIAl1bnNpZ25lZCBsb25nIHJlY19xOwpAQCAtMjA3LDEyICsyMDksMTEgQEAKIAkJX19kb19kZWNvZGUocnMsIHAsIHEpOwogCiAJaTAgPSBBICogcnMtPnAgLyAoQSArIEIpOwotCWlmIChpMCA8PSAwKSB7CisJaWYgKGkwIDw9IDApCiAJCWkwID0gMTsKLQl9Ci0JaWYgKGkwID49IHJzLT5wKSB7CisKKwlpZiAoaTAgPj0gcnMtPnApCiAJCWkwID0gcnMtPnAgLSAxOwotCX0KIAogCXRocmVzaG9sZCA9IHJzLT5xICsgaTA7CiAJc3ltYm9sID0gcnMtPnJlY19xID49IHRocmVzaG9sZDsKQEAgLTIzNCwxNCArMjM1LDE1IEBACiAJc3RydWN0IHJ1YmluX3N0YXRlIHJzX2NvcHk7CiAJcnNfY29weSA9ICpyczsKIAotCWZvciAoaT0wO2k8ODtpKyspIHsKLQkJcmV0ID0gZW5jb2RlKHJzLCBycy0+Yml0X2RpdmlkZXItcnMtPmJpdHNbaV0scnMtPmJpdHNbaV0sYnl0ZSYxKTsKKwlmb3IgKGk9MDsgaTw4OyBpKyspIHsKKwkJcmV0ID0gZW5jb2RlKHJzLCBycy0+Yml0X2RpdmlkZXItcnMtPmJpdHNbaV0sCisJCQkgICAgIHJzLT5iaXRzW2ldLCBieXRlICYgMSk7CiAJCWlmIChyZXQpIHsKIAkJCS8qIEZhaWxlZC4gUmVzdG9yZSBvbGQgc3RhdGUgKi8KIAkJCSpycyA9IHJzX2NvcHk7CiAJCQlyZXR1cm4gcmV0OwogCQl9Ci0JCWJ5dGU9Ynl0ZT4+MTsKKwkJYnl0ZSA+Pj0gMSA7CiAJfQogCXJldHVybiAwOwogfQpAQCAtMjUxLDcgKzI1Myw4IEBACiAJaW50IGksIHJlc3VsdCA9IDAsIGJpdF9kaXZpZGVyID0gcnMtPmJpdF9kaXZpZGVyOwogCiAJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKLQkJcmVzdWx0IHw9IGRlY29kZShycywgYml0X2RpdmlkZXIgLSBycy0+Yml0c1tpXSwgcnMtPmJpdHNbaV0pIDw8IGk7CisJCXJlc3VsdCB8PSBkZWNvZGUocnMsIGJpdF9kaXZpZGVyIC0gcnMtPmJpdHNbaV0sCisJCQkJIHJzLT5iaXRzW2ldKSA8PCBpOwogCiAJcmV0dXJuIHJlc3VsdDsKIH0KQEAgLTI1OSw3ICsyNjIsOCBAQAogCiAKIHN0YXRpYyBpbnQgcnViaW5fZG9fY29tcHJlc3MoaW50IGJpdF9kaXZpZGVyLCBpbnQgKmJpdHMsIHVuc2lnbmVkIGNoYXIgKmRhdGFfaW4sCi0JCSAgICAgIHVuc2lnbmVkIGNoYXIgKmNwYWdlX291dCwgdWludDMyX3QgKnNvdXJjZWxlbiwgdWludDMyX3QgKmRzdGxlbikKKwkJCSAgICAgdW5zaWduZWQgY2hhciAqY3BhZ2Vfb3V0LCB1aW50MzJfdCAqc291cmNlbGVuLAorCQkJICAgICB1aW50MzJfdCAqZHN0bGVuKQogCXsKIAlpbnQgb3V0cG9zID0gMDsKIAlpbnQgcG9zPTA7CkBAIC0yOTUsNyArMjk5LDggQEAKIGludCBqZmZzMl9ydWJpbm1pcHNfY29tcHJlc3ModW5zaWduZWQgY2hhciAqZGF0YV9pbiwgdW5zaWduZWQgY2hhciAqY3BhZ2Vfb3V0LAogCQkgICB1aW50MzJfdCAqc291cmNlbGVuLCB1aW50MzJfdCAqZHN0bGVuLCB2b2lkICptb2RlbCkKIHsKLQlyZXR1cm4gcnViaW5fZG9fY29tcHJlc3MoQklUX0RJVklERVJfTUlQUywgYml0c19taXBzLCBkYXRhX2luLCBjcGFnZV9vdXQsIHNvdXJjZWxlbiwgZHN0bGVuKTsKKwlyZXR1cm4gcnViaW5fZG9fY29tcHJlc3MoQklUX0RJVklERVJfTUlQUywgYml0c19taXBzLCBkYXRhX2luLAorCQkJCSBjcGFnZV9vdXQsIHNvdXJjZWxlbiwgZHN0bGVuKTsKIH0KICNlbmRpZgogc3RhdGljIGludCBqZmZzMl9keW5ydWJpbl9jb21wcmVzcyh1bnNpZ25lZCBjaGFyICpkYXRhX2luLApAQCAtMzE2LDkgKzMyMSw4IEBACiAJCXJldHVybiAtMTsKIAogCW1lbXNldChoaXN0bywgMCwgMjU2KTsKLQlmb3IgKGk9MDsgaTxteXNyY2xlbjsgaSsrKSB7CisJZm9yIChpPTA7IGk8bXlzcmNsZW47IGkrKykKIAkJaGlzdG9bZGF0YV9pbltpXV0rKzsKLQl9CiAJbWVtc2V0KGJpdHMsIDAsIHNpemVvZihpbnQpKjgpOwogCWZvciAoaT0wOyBpPDI1NjsgaSsrKSB7CiAJCWlmIChpJjEyOCkKQEAgLTM0Niw3ICszNTAsOCBAQAogCQljcGFnZV9vdXRbaV0gPSBiaXRzW2ldOwogCX0KIAotCXJldCA9IHJ1YmluX2RvX2NvbXByZXNzKDI1NiwgYml0cywgZGF0YV9pbiwgY3BhZ2Vfb3V0KzgsICZteXNyY2xlbiwgJm15ZHN0bGVuKTsKKwlyZXQgPSBydWJpbl9kb19jb21wcmVzcygyNTYsIGJpdHMsIGRhdGFfaW4sIGNwYWdlX291dCs4LCAmbXlzcmNsZW4sCisJCQkJJm15ZHN0bGVuKTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCkBAIC0zNjMsOCArMzY4LDEwIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIHJ1YmluX2RvX2RlY29tcHJlc3MoaW50IGJpdF9kaXZpZGVyLCBpbnQgKmJpdHMsIHVuc2lnbmVkIGNoYXIgKmNkYXRhX2luLAotCQkJIHVuc2lnbmVkIGNoYXIgKnBhZ2Vfb3V0LCB1aW50MzJfdCBzcmNsZW4sIHVpbnQzMl90IGRlc3RsZW4pCitzdGF0aWMgdm9pZCBydWJpbl9kb19kZWNvbXByZXNzKGludCBiaXRfZGl2aWRlciwgaW50ICpiaXRzLAorCQkJCXVuc2lnbmVkIGNoYXIgKmNkYXRhX2luLCAKKwkJCQl1bnNpZ25lZCBjaGFyICpwYWdlX291dCwgdWludDMyX3Qgc3JjbGVuLAorCQkJCXVpbnQzMl90IGRlc3RsZW4pCiB7CiAJaW50IG91dHBvcyA9IDA7CiAJc3RydWN0IHJ1YmluX3N0YXRlIHJzOwpAQCAtMzcyLDkgKzM3OSw4IEBACiAJaW5pdF9wdXNocHVsbCgmcnMucHAsIGNkYXRhX2luLCBzcmNsZW4sIDAsIDApOwogCWluaXRfZGVjb2RlKCZycywgYml0X2RpdmlkZXIsIGJpdHMpOwogCi0Jd2hpbGUgKG91dHBvcyA8IGRlc3RsZW4pIHsKKwl3aGlsZSAob3V0cG9zIDwgZGVzdGxlbikKIAkJcGFnZV9vdXRbb3V0cG9zKytdID0gaW5fYnl0ZSgmcnMpOwotCX0KIH0KIAogCkBAIC0zODMsNyArMzg5LDggQEAKIAkJCQkgICAgICB1aW50MzJfdCBzb3VyY2VsZW4sIHVpbnQzMl90IGRzdGxlbiwKIAkJCQkgICAgICB2b2lkICptb2RlbCkKIHsKLQlydWJpbl9kb19kZWNvbXByZXNzKEJJVF9ESVZJREVSX01JUFMsIGJpdHNfbWlwcywgZGF0YV9pbiwgY3BhZ2Vfb3V0LCBzb3VyY2VsZW4sIGRzdGxlbik7CisJcnViaW5fZG9fZGVjb21wcmVzcyhCSVRfRElWSURFUl9NSVBTLCBiaXRzX21pcHMsIGRhdGFfaW4sCisJCQkgICAgY3BhZ2Vfb3V0LCBzb3VyY2VsZW4sIGRzdGxlbik7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTM5OCw1MiArNDA1LDUzIEBACiAJZm9yIChjPTA7IGM8ODsgYysrKQogCQliaXRzW2NdID0gZGF0YV9pbltjXTsKIAotCXJ1YmluX2RvX2RlY29tcHJlc3MoMjU2LCBiaXRzLCBkYXRhX2luKzgsIGNwYWdlX291dCwgc291cmNlbGVuLTgsIGRzdGxlbik7CisJcnViaW5fZG9fZGVjb21wcmVzcygyNTYsIGJpdHMsIGRhdGFfaW4rOCwgY3BhZ2Vfb3V0LCBzb3VyY2VsZW4tOCwKKwkJCSAgICBkc3RsZW4pOwogCXJldHVybiAwOwogfQogCiBzdGF0aWMgc3RydWN0IGpmZnMyX2NvbXByZXNzb3IgamZmczJfcnViaW5taXBzX2NvbXAgPSB7Ci0gICAgLnByaW9yaXR5ID0gSkZGUzJfUlVCSU5NSVBTX1BSSU9SSVRZLAotICAgIC5uYW1lID0gInJ1YmlubWlwcyIsCi0gICAgLmNvbXByID0gSkZGUzJfQ09NUFJfRFlOUlVCSU4sCi0gICAgLmNvbXByZXNzID0gTlVMTCwgLyomamZmczJfcnViaW5taXBzX2NvbXByZXNzLCovCi0gICAgLmRlY29tcHJlc3MgPSAmamZmczJfcnViaW5taXBzX2RlY29tcHJlc3MsCisJLnByaW9yaXR5ID0gSkZGUzJfUlVCSU5NSVBTX1BSSU9SSVRZLAorCS5uYW1lID0gInJ1YmlubWlwcyIsCisJLmNvbXByID0gSkZGUzJfQ09NUFJfRFlOUlVCSU4sCisJLmNvbXByZXNzID0gTlVMTCwgLyomamZmczJfcnViaW5taXBzX2NvbXByZXNzLCovCisJLmRlY29tcHJlc3MgPSAmamZmczJfcnViaW5taXBzX2RlY29tcHJlc3MsCiAjaWZkZWYgSkZGUzJfUlVCSU5NSVBTX0RJU0FCTEVECi0gICAgLmRpc2FibGVkID0gMSwKKwkuZGlzYWJsZWQgPSAxLAogI2Vsc2UKLSAgICAuZGlzYWJsZWQgPSAwLAorCS5kaXNhYmxlZCA9IDAsCiAjZW5kaWYKIH07CiAKIGludCBqZmZzMl9ydWJpbm1pcHNfaW5pdCh2b2lkKQogewotICAgIHJldHVybiBqZmZzMl9yZWdpc3Rlcl9jb21wcmVzc29yKCZqZmZzMl9ydWJpbm1pcHNfY29tcCk7CisJcmV0dXJuIGpmZnMyX3JlZ2lzdGVyX2NvbXByZXNzb3IoJmpmZnMyX3J1YmlubWlwc19jb21wKTsKIH0KIAogdm9pZCBqZmZzMl9ydWJpbm1pcHNfZXhpdCh2b2lkKQogewotICAgIGpmZnMyX3VucmVnaXN0ZXJfY29tcHJlc3NvcigmamZmczJfcnViaW5taXBzX2NvbXApOworCWpmZnMyX3VucmVnaXN0ZXJfY29tcHJlc3NvcigmamZmczJfcnViaW5taXBzX2NvbXApOwogfQogCiBzdGF0aWMgc3RydWN0IGpmZnMyX2NvbXByZXNzb3IgamZmczJfZHlucnViaW5fY29tcCA9IHsKLSAgICAucHJpb3JpdHkgPSBKRkZTMl9EWU5SVUJJTl9QUklPUklUWSwKLSAgICAubmFtZSA9ICJkeW5ydWJpbiIsCi0gICAgLmNvbXByID0gSkZGUzJfQ09NUFJfUlVCSU5NSVBTLAotICAgIC5jb21wcmVzcyA9IGpmZnMyX2R5bnJ1YmluX2NvbXByZXNzLAotICAgIC5kZWNvbXByZXNzID0gJmpmZnMyX2R5bnJ1YmluX2RlY29tcHJlc3MsCisJLnByaW9yaXR5ID0gSkZGUzJfRFlOUlVCSU5fUFJJT1JJVFksCisJLm5hbWUgPSAiZHlucnViaW4iLAorCS5jb21wciA9IEpGRlMyX0NPTVBSX1JVQklOTUlQUywKKwkuY29tcHJlc3MgPSBqZmZzMl9keW5ydWJpbl9jb21wcmVzcywKKwkuZGVjb21wcmVzcyA9ICZqZmZzMl9keW5ydWJpbl9kZWNvbXByZXNzLAogI2lmZGVmIEpGRlMyX0RZTlJVQklOX0RJU0FCTEVECi0gICAgLmRpc2FibGVkID0gMSwKKwkuZGlzYWJsZWQgPSAxLAogI2Vsc2UKLSAgICAuZGlzYWJsZWQgPSAwLAorCS5kaXNhYmxlZCA9IDAsCiAjZW5kaWYKIH07CiAKIGludCBqZmZzMl9keW5ydWJpbl9pbml0KHZvaWQpCiB7Ci0gICAgcmV0dXJuIGpmZnMyX3JlZ2lzdGVyX2NvbXByZXNzb3IoJmpmZnMyX2R5bnJ1YmluX2NvbXApOworCXJldHVybiBqZmZzMl9yZWdpc3Rlcl9jb21wcmVzc29yKCZqZmZzMl9keW5ydWJpbl9jb21wKTsKIH0KIAogdm9pZCBqZmZzMl9keW5ydWJpbl9leGl0KHZvaWQpCiB7Ci0gICAgamZmczJfdW5yZWdpc3Rlcl9jb21wcmVzc29yKCZqZmZzMl9keW5ydWJpbl9jb21wKTsKKwlqZmZzMl91bnJlZ2lzdGVyX2NvbXByZXNzb3IoJmpmZnMyX2R5bnJ1YmluX2NvbXApOwogfQpkaWZmIC0tZ2l0IGEvZnMvamZmczIvZXJhc2UuYyBiL2ZzL2pmZnMyL2VyYXNlLmMKaW5kZXggMjU5NDYxYi4uYzMyYjRhMSAxMDA2NDQKLS0tIGEvZnMvamZmczIvZXJhc2UuYworKysgYi9mcy9qZmZzMi9lcmFzZS5jCkBAIC0xNzUsNyArMTc1LDcgQEAKIHsKIAkvKiBGb3IgTkFORCwgaWYgdGhlIGZhaWx1cmUgZGlkIG5vdCBvY2N1ciBhdCB0aGUgZGV2aWNlIGxldmVsIGZvciBhCiAJICAgc3BlY2lmaWMgcGh5c2ljYWwgcGFnZSwgZG9uJ3QgYm90aGVyIHVwZGF0aW5nIHRoZSBiYWQgYmxvY2sgdGFibGUuICovCi0JaWYgKGpmZnMyX2NsZWFubWFya2VyX29vYihjKSAmJiAoYmFkX29mZnNldCAhPSBNVERfRkFJTF9BRERSX1VOS05PV04pKSB7CisJaWYgKGpmZnMyX2NsZWFubWFya2VyX29vYihjKSAmJiAoYmFkX29mZnNldCAhPSAodWludDMyX3QpTVREX0ZBSUxfQUREUl9VTktOT1dOKSkgewogCQkvKiBXZSBoYWQgYSBkZXZpY2UtbGV2ZWwgZmFpbHVyZSB0byBlcmFzZS4gIExldCdzIHNlZSBpZiB3ZSd2ZQogCQkgICBmYWlsZWQgdG9vIG1hbnkgdGltZXMuICovCiAJCWlmICghamZmczJfd3JpdGVfbmFuZF9iYWRibG9jayhjLCBqZWIsIGJhZF9vZmZzZXQpKSB7CkBAIC0yMDksNyArMjA5LDggQEAKIAlzdHJ1Y3QgZXJhc2VfcHJpdl9zdHJ1Y3QgKnByaXYgPSAodm9pZCAqKWluc3RyLT5wcml2OwogCiAJaWYoaW5zdHItPnN0YXRlICE9IE1URF9FUkFTRV9ET05FKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIkVyYXNlIGF0IDB4JTA4eCBmaW5pc2hlZCwgYnV0IHN0YXRlICE9IE1URF9FUkFTRV9ET05FLiBTdGF0ZSBpcyAweCV4IGluc3RlYWQuXG4iLCBpbnN0ci0+YWRkciwgaW5zdHItPnN0YXRlKTsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiRXJhc2UgYXQgMHglMDhsbHggZmluaXNoZWQsIGJ1dCBzdGF0ZSAhPSBNVERfRVJBU0VfRE9ORS4gU3RhdGUgaXMgMHgleCBpbnN0ZWFkLlxuIiwKKwkJCSh1bnNpZ25lZCBsb25nIGxvbmcpaW5zdHItPmFkZHIsIGluc3RyLT5zdGF0ZSk7CiAJCWpmZnMyX2VyYXNlX2ZhaWxlZChwcml2LT5jLCBwcml2LT5qZWIsIGluc3RyLT5mYWlsX2FkZHIpOwogCX0gZWxzZSB7CiAJCWpmZnMyX2VyYXNlX3N1Y2NlZWRlZChwcml2LT5jLCBwcml2LT5qZWIpOwpkaWZmIC0tZ2l0IGEvZnMvamZmczIvbm9kZWxpc3QuaCBiL2ZzL2pmZnMyL25vZGVsaXN0LmgKaW5kZXggMTc1MDQ0NS4uNTA3ZWQ2ZSAxMDA2NDQKLS0tIGEvZnMvamZmczIvbm9kZWxpc3QuaAorKysgYi9mcy9qZmZzMi9ub2RlbGlzdC5oCkBAIC0zNjYsOSArMzY2LDYgQEAKIHZvaWQgamZmczJfZnJlZV9yYXdfbm9kZV9yZWZzKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjKTsKIHN0cnVjdCBqZmZzMl9ub2RlX2ZyYWcgKmpmZnMyX2xvb2t1cF9ub2RlX2ZyYWcoc3RydWN0IHJiX3Jvb3QgKmZyYWd0cmVlLCB1aW50MzJfdCBvZmZzZXQpOwogdm9pZCBqZmZzMl9raWxsX2ZyYWd0cmVlKHN0cnVjdCByYl9yb290ICpyb290LCBzdHJ1Y3QgamZmczJfc2JfaW5mbyAqY19kZWxldGUpOwotc3RydWN0IHJiX25vZGUgKnJiX25leHQoc3RydWN0IHJiX25vZGUgKik7Ci1zdHJ1Y3QgcmJfbm9kZSAqcmJfcHJldihzdHJ1Y3QgcmJfbm9kZSAqKTsKLXZvaWQgcmJfcmVwbGFjZV9ub2RlKHN0cnVjdCByYl9ub2RlICp2aWN0aW0sIHN0cnVjdCByYl9ub2RlICpuZXcsIHN0cnVjdCByYl9yb290ICpyb290KTsKIGludCBqZmZzMl9hZGRfZnVsbF9kbm9kZV90b19pbm9kZShzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYywgc3RydWN0IGpmZnMyX2lub2RlX2luZm8gKmYsIHN0cnVjdCBqZmZzMl9mdWxsX2Rub2RlICpmbik7CiB1aW50MzJfdCBqZmZzMl90cnVuY2F0ZV9mcmFndHJlZSAoc3RydWN0IGpmZnMyX3NiX2luZm8gKmMsIHN0cnVjdCByYl9yb290ICpsaXN0LCB1aW50MzJfdCBzaXplKTsKIHN0cnVjdCBqZmZzMl9yYXdfbm9kZV9yZWYgKmpmZnMyX2xpbmtfbm9kZV9yZWYoc3RydWN0IGpmZnMyX3NiX2luZm8gKmMsCmRpZmYgLS1naXQgYS9mcy9qZnMvc3VwZXIuYyBiL2ZzL2pmcy9zdXBlci5jCmluZGV4IDBkYWUzNDUuLmIzN2QxZjcgMTAwNjQ0Ci0tLSBhL2ZzL2pmcy9zdXBlci5jCisrKyBiL2ZzL2pmcy9zdXBlci5jCkBAIC01NDMsNyArNTQzLDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgdm9pZCBqZnNfd3JpdGVfc3VwZXJfbG9ja2ZzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCitzdGF0aWMgaW50IGpmc19mcmVlemUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKIHsKIAlzdHJ1Y3QgamZzX3NiX2luZm8gKnNiaSA9IEpGU19TQkkoc2IpOwogCXN0cnVjdCBqZnNfbG9nICpsb2cgPSBzYmktPmxvZzsKQEAgLTU1Myw5ICs1NTMsMTAgQEAKIAkJbG1Mb2dTaHV0ZG93bihsb2cpOwogCQl1cGRhdGVTdXBlcihzYiwgRk1fQ0xFQU4pOwogCX0KKwlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgamZzX3VubG9ja2ZzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCitzdGF0aWMgaW50IGpmc191bmZyZWV6ZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQogewogCXN0cnVjdCBqZnNfc2JfaW5mbyAqc2JpID0gSkZTX1NCSShzYik7CiAJc3RydWN0IGpmc19sb2cgKmxvZyA9IHNiaS0+bG9nOwpAQCAtNTY4LDYgKzU2OSw3IEBACiAJCWVsc2UKIAkJCXR4UmVzdW1lKHNiKTsKIAl9CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgamZzX2dldF9zYihzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZnNfdHlwZSwKQEAgLTczNSw4ICs3MzcsOCBAQAogCS5kZWxldGVfaW5vZGUJPSBqZnNfZGVsZXRlX2lub2RlLAogCS5wdXRfc3VwZXIJPSBqZnNfcHV0X3N1cGVyLAogCS5zeW5jX2ZzCT0gamZzX3N5bmNfZnMsCi0JLndyaXRlX3N1cGVyX2xvY2tmcyA9IGpmc193cml0ZV9zdXBlcl9sb2NrZnMsCi0JLnVubG9ja2ZzICAgICAgID0gamZzX3VubG9ja2ZzLAorCS5mcmVlemVfZnMJPSBqZnNfZnJlZXplLAorCS51bmZyZWV6ZV9mcwk9IGpmc191bmZyZWV6ZSwKIAkuc3RhdGZzCQk9IGpmc19zdGF0ZnMsCiAJLnJlbW91bnRfZnMJPSBqZnNfcmVtb3VudCwKIAkuc2hvd19vcHRpb25zCT0gamZzX3Nob3dfb3B0aW9ucywKZGlmZiAtLWdpdCBhL2ZzL2xvY2tkL2NsbnRwcm9jLmMgYi9mcy9sb2NrZC9jbG50cHJvYy5jCmluZGV4IDMxNjY4YjYuLmRkNzk1NzAgMTAwNjQ0Ci0tLSBhL2ZzL2xvY2tkL2NsbnRwcm9jLmMKKysrIGIvZnMvbG9ja2QvY2xudHByb2MuYwpAQCAtMTYsNyArMTYsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9jbG50Lmg+CiAjaW5jbHVkZSA8bGludXgvc3VucnBjL3N2Yy5oPgogI2luY2x1ZGUgPGxpbnV4L2xvY2tkL2xvY2tkLmg+Ci0jaW5jbHVkZSA8bGludXgvbG9ja2Qvc21faW50ZXIuaD4KIAogI2RlZmluZSBOTE1EQkdfRkFDSUxJVFkJCU5MTURCR19DTElFTlQKICNkZWZpbmUgTkxNQ0xOVF9HUkFDRV9XQUlUCSg1KkhaKQpAQCAtNTE4LDExICs1MTcsOSBAQAogCXVuc2lnbmVkIGNoYXIgZmxfdHlwZTsKIAlpbnQgc3RhdHVzID0gLUVOT0xDSzsKIAotCWlmIChuc21fbW9uaXRvcihob3N0KSA8IDApIHsKLQkJcHJpbnRrKEtFUk5fTk9USUNFICJsb2NrZDogZmFpbGVkIHRvIG1vbml0b3IgJXNcbiIsCi0JCQkJCWhvc3QtPmhfbmFtZSk7CisJaWYgKG5zbV9tb25pdG9yKGhvc3QpIDwgMCkKIAkJZ290byBvdXQ7Ci0JfQorCiAJZmwtPmZsX2ZsYWdzIHw9IEZMX0FDQ0VTUzsKIAlzdGF0dXMgPSBkb192ZnNfbG9jayhmbCk7CiAJZmwtPmZsX2ZsYWdzID0gZmxfZmxhZ3M7CmRpZmYgLS1naXQgYS9mcy9sb2NrZC9ob3N0LmMgYi9mcy9sb2NrZC9ob3N0LmMKaW5kZXggYWJkZWJmNy4uOTlkNzM3YiAxMDA2NDQKLS0tIGEvZnMvbG9ja2QvaG9zdC5jCisrKyBiL2ZzL2xvY2tkL2hvc3QuYwpAQCAtMTUsNyArMTUsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9jbG50Lmg+CiAjaW5jbHVkZSA8bGludXgvc3VucnBjL3N2Yy5oPgogI2luY2x1ZGUgPGxpbnV4L2xvY2tkL2xvY2tkLmg+Ci0jaW5jbHVkZSA8bGludXgvbG9ja2Qvc21faW50ZXIuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogCiAjaW5jbHVkZSA8bmV0L2lwdjYuaD4KQEAgLTMyLDExICszMSw2IEBACiBzdGF0aWMgREVGSU5FX01VVEVYKG5sbV9ob3N0X211dGV4KTsKIAogc3RhdGljIHZvaWQJCQlubG1fZ2NfaG9zdHModm9pZCk7Ci1zdGF0aWMgc3RydWN0IG5zbV9oYW5kbGUJKm5zbV9maW5kKGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqc2FwLAotCQkJCQkJY29uc3Qgc2l6ZV90IHNhbGVuLAotCQkJCQkJY29uc3QgY2hhciAqaG9zdG5hbWUsCi0JCQkJCQljb25zdCBzaXplX3QgaG9zdG5hbWVfbGVuLAotCQkJCQkJY29uc3QgaW50IGNyZWF0ZSk7CiAKIHN0cnVjdCBubG1fbG9va3VwX2hvc3RfaW5mbyB7CiAJY29uc3QgaW50CQlzZXJ2ZXI7CQkvKiBzZWFyY2ggZm9yIHNlcnZlcnxjbGllbnQgKi8KQEAgLTEwNSwzMiArOTksNiBAQAogCX0KIH0KIAotc3RhdGljIHZvaWQgbmxtX2Rpc3BsYXlfYWRkcmVzcyhjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKnNhcCwKLQkJCQljaGFyICpidWYsIGNvbnN0IHNpemVfdCBsZW4pCi17Ci0JY29uc3Qgc3RydWN0IHNvY2thZGRyX2luICpzaW4gPSAoc3RydWN0IHNvY2thZGRyX2luICopc2FwOwotCWNvbnN0IHN0cnVjdCBzb2NrYWRkcl9pbjYgKnNpbjYgPSAoc3RydWN0IHNvY2thZGRyX2luNiAqKXNhcDsKLQotCXN3aXRjaCAoc2FwLT5zYV9mYW1pbHkpIHsKLQljYXNlIEFGX1VOU1BFQzoKLQkJc25wcmludGYoYnVmLCBsZW4sICJ1bnNwZWNpZmllZCIpOwotCQlicmVhazsKLQljYXNlIEFGX0lORVQ6Ci0JCXNucHJpbnRmKGJ1ZiwgbGVuLCAiJXBJNCIsICZzaW4tPnNpbl9hZGRyLnNfYWRkcik7Ci0JCWJyZWFrOwotCWNhc2UgQUZfSU5FVDY6Ci0JCWlmIChpcHY2X2FkZHJfdjRtYXBwZWQoJnNpbjYtPnNpbjZfYWRkcikpCi0JCQlzbnByaW50ZihidWYsIGxlbiwgIiVwSTQiLAotCQkJCSAmc2luNi0+c2luNl9hZGRyLnM2X2FkZHIzMlszXSk7Ci0JCWVsc2UKLQkJCXNucHJpbnRmKGJ1ZiwgbGVuLCAiJXBJNiIsICZzaW42LT5zaW42X2FkZHIpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlzbnByaW50ZihidWYsIGxlbiwgInVuc3VwcG9ydGVkIGFkZHJlc3MgZmFtaWx5Iik7Ci0JCWJyZWFrOwotCX0KLX0KLQogLyoKICAqIENvbW1vbiBob3N0IGxvb2t1cCByb3V0aW5lIGZvciBzZXJ2ZXIgJiBjbGllbnQKICAqLwpAQCAtMTkwLDggKzE1OCw4IEBACiAJCWF0b21pY19pbmMoJm5zbS0+c21fY291bnQpOwogCWVsc2UgewogCQlob3N0ID0gTlVMTDsKLQkJbnNtID0gbnNtX2ZpbmQobmktPnNhcCwgbmktPnNhbGVuLAotCQkJCW5pLT5ob3N0bmFtZSwgbmktPmhvc3RuYW1lX2xlbiwgMSk7CisJCW5zbSA9IG5zbV9nZXRfaGFuZGxlKG5pLT5zYXAsIG5pLT5zYWxlbiwKKwkJCQkJbmktPmhvc3RuYW1lLCBuaS0+aG9zdG5hbWVfbGVuKTsKIAkJaWYgKCFuc20pIHsKIAkJCWRwcmludGsoImxvY2tkOiBubG1fbG9va3VwX2hvc3QgZmFpbGVkOyAiCiAJCQkJIm5vIG5zbSBoYW5kbGVcbiIpOwpAQCAtMjA2LDYgKzE3NCw3IEBACiAJCWdvdG8gb3V0OwogCX0KIAlob3N0LT5oX25hbWUJICAgPSBuc20tPnNtX25hbWU7CisJaG9zdC0+aF9hZGRyYnVmICAgID0gbnNtLT5zbV9hZGRyYnVmOwogCW1lbWNweShubG1fYWRkcihob3N0KSwgbmktPnNhcCwgbmktPnNhbGVuKTsKIAlob3N0LT5oX2FkZHJsZW4gPSBuaS0+c2FsZW47CiAJbmxtX2NsZWFyX3BvcnQobmxtX2FkZHIoaG9zdCkpOwpAQCAtMjMyLDExICsyMDEsNiBAQAogCiAJbnJob3N0cysrOwogCi0JbmxtX2Rpc3BsYXlfYWRkcmVzcygoc3RydWN0IHNvY2thZGRyICopJmhvc3QtPmhfYWRkciwKLQkJCQlob3N0LT5oX2FkZHJidWYsIHNpemVvZihob3N0LT5oX2FkZHJidWYpKTsKLQlubG1fZGlzcGxheV9hZGRyZXNzKChzdHJ1Y3Qgc29ja2FkZHIgKikmaG9zdC0+aF9zcmNhZGRyLAotCQkJCWhvc3QtPmhfc3JjYWRkcmJ1Ziwgc2l6ZW9mKGhvc3QtPmhfc3JjYWRkcmJ1ZikpOwotCiAJZHByaW50aygibG9ja2Q6IG5sbV9sb29rdXBfaG9zdCBjcmVhdGVkIGhvc3QgJXNcbiIsCiAJCQlob3N0LT5oX25hbWUpOwogCkBAIC0yNTYsMTAgKzIyMCw4IEBACiAJQlVHX09OKCFsaXN0X2VtcHR5KCZob3N0LT5oX2xvY2tvd25lcnMpKTsKIAlCVUdfT04oYXRvbWljX3JlYWQoJmhvc3QtPmhfY291bnQpKTsKIAotCS8qCi0JICogUmVsZWFzZSBOU00gaGFuZGxlIGFuZCB1bm1vbml0b3IgaG9zdC4KLQkgKi8KIAluc21fdW5tb25pdG9yKGhvc3QpOworCW5zbV9yZWxlYXNlKGhvc3QtPmhfbnNtaGFuZGxlKTsKIAogCWNsbnQgPSBob3N0LT5oX3JwY2NsbnQ7CiAJaWYgKGNsbnQgIT0gTlVMTCkKQEAgLTM3OCw4ICszNDAsOCBAQAogewogCXN0cnVjdCBycGNfY2xudAkqY2xudDsKIAotCWRwcmludGsoImxvY2tkOiBubG1fYmluZF9ob3N0ICVzICglcyksIG15IGFkZHI9JXNcbiIsCi0JCQlob3N0LT5oX25hbWUsIGhvc3QtPmhfYWRkcmJ1ZiwgaG9zdC0+aF9zcmNhZGRyYnVmKTsKKwlkcHJpbnRrKCJsb2NrZDogbmxtX2JpbmRfaG9zdCAlcyAoJXMpXG4iLAorCQkJaG9zdC0+aF9uYW1lLCBob3N0LT5oX2FkZHJidWYpOwogCiAJLyogTG9jayBob3N0IGhhbmRsZSAqLwogCW11dGV4X2xvY2soJmhvc3QtPmhfbXV0ZXgpOwpAQCAtNDgxLDM1ICs0NDMsMjMgQEAKIAl9CiB9CiAKLS8qCi0gKiBXZSB3ZXJlIG5vdGlmaWVkIHRoYXQgdGhlIGhvc3QgaW5kaWNhdGVkIGJ5IGFkZHJlc3MgJnNpbgotICogaGFzIHJlYm9vdGVkLgotICogUmVsZWFzZSBhbGwgcmVzb3VyY2VzIGhlbGQgYnkgdGhhdCBwZWVyLgorLyoqCisgKiBubG1faG9zdF9yZWJvb3RlZCAtIFJlbGVhc2UgYWxsIHJlc291cmNlcyBoZWxkIGJ5IHJlYm9vdGVkIGhvc3QKKyAqIEBpbmZvOiBwb2ludGVyIHRvIGRlY29kZWQgcmVzdWx0cyBvZiBOTE1fU01fTk9USUZZIGNhbGwKKyAqCisgKiBXZSB3ZXJlIG5vdGlmaWVkIHRoYXQgdGhlIHNwZWNpZmllZCBob3N0IGhhcyByZWJvb3RlZC4gIFJlbGVhc2UKKyAqIGFsbCByZXNvdXJjZXMgaGVsZCBieSB0aGF0IHBlZXIuCiAgKi8KLXZvaWQgbmxtX2hvc3RfcmVib290ZWQoY29uc3Qgc3RydWN0IHNvY2thZGRyX2luICpzaW4sCi0JCQkJY29uc3QgY2hhciAqaG9zdG5hbWUsCi0JCQkJdW5zaWduZWQgaW50IGhvc3RuYW1lX2xlbiwKLQkJCQl1MzIgbmV3X3N0YXRlKQordm9pZCBubG1faG9zdF9yZWJvb3RlZChjb25zdCBzdHJ1Y3QgbmxtX3JlYm9vdCAqaW5mbykKIHsKIAlzdHJ1Y3QgaGxpc3RfaGVhZCAqY2hhaW47CiAJc3RydWN0IGhsaXN0X25vZGUgKnBvczsKIAlzdHJ1Y3QgbnNtX2hhbmRsZSAqbnNtOwogCXN0cnVjdCBubG1faG9zdAkqaG9zdDsKIAotCW5zbSA9IG5zbV9maW5kKChzdHJ1Y3Qgc29ja2FkZHIgKilzaW4sIHNpemVvZigqc2luKSwKLQkJCWhvc3RuYW1lLCBob3N0bmFtZV9sZW4sIDApOwotCWlmIChuc20gPT0gTlVMTCkgewotCQlkcHJpbnRrKCJsb2NrZDogbmV2ZXIgc2F3IHJlYm9vdGVkIHBlZXIgJyUuKnMnIGJlZm9yZVxuIiwKLQkJCQlob3N0bmFtZV9sZW4sIGhvc3RuYW1lKTsKKwluc20gPSBuc21fcmVib290X2xvb2t1cChpbmZvKTsKKwlpZiAodW5saWtlbHkobnNtID09IE5VTEwpKQogCQlyZXR1cm47Ci0JfQotCi0JZHByaW50aygibG9ja2Q6IG5sbV9ob3N0X3JlYm9vdGVkKCUuKnMsICVzKVxuIiwKLQkJCWhvc3RuYW1lX2xlbiwgaG9zdG5hbWUsIG5zbS0+c21fYWRkcmJ1Zik7Ci0KLQkvKiBXaGVuIHJlY2xhaW1pbmcgbG9ja3Mgb24gdGhpcyBwZWVyLCBtYWtlIHN1cmUgdGhhdAotCSAqIHdlIHNldCB1cCBhIG5ldyBub3RpZmljYXRpb24gKi8KLQluc20tPnNtX21vbml0b3JlZCA9IDA7CiAKIAkvKiBNYXJrIGFsbCBob3N0cyB0aWVkIHRvIHRoaXMgTlNNIHN0YXRlIGFzIGhhdmluZyByZWJvb3RlZC4KIAkgKiBXZSBydW4gdGhlIGxvb3AgcmVwZWF0ZWRseSwgYmVjYXVzZSB3ZSBkcm9wIHRoZSBob3N0IHRhYmxlCkBAIC01MjAsOCArNDcwLDggQEAKIAlmb3IgKGNoYWluID0gbmxtX2hvc3RzOyBjaGFpbiA8IG5sbV9ob3N0cyArIE5MTV9IT1NUX05SSEFTSDsgKytjaGFpbikgewogCQlobGlzdF9mb3JfZWFjaF9lbnRyeShob3N0LCBwb3MsIGNoYWluLCBoX2hhc2gpIHsKIAkJCWlmIChob3N0LT5oX25zbWhhbmRsZSA9PSBuc20KLQkJCSAmJiBob3N0LT5oX25zbXN0YXRlICE9IG5ld19zdGF0ZSkgewotCQkJCWhvc3QtPmhfbnNtc3RhdGUgPSBuZXdfc3RhdGU7CisJCQkgJiYgaG9zdC0+aF9uc21zdGF0ZSAhPSBpbmZvLT5zdGF0ZSkgeworCQkJCWhvc3QtPmhfbnNtc3RhdGUgPSBpbmZvLT5zdGF0ZTsKIAkJCQlob3N0LT5oX3N0YXRlKys7CiAKIAkJCQlubG1fZ2V0X2hvc3QoaG9zdCk7CkBAIC02MjksODkgKzU3OSwzIEBACiAKIAluZXh0X2djID0gamlmZmllcyArIE5MTV9IT1NUX0NPTExFQ1Q7CiB9Ci0KLQotLyoKLSAqIE1hbmFnZSBOU00gaGFuZGxlcwotICovCi1zdGF0aWMgTElTVF9IRUFEKG5zbV9oYW5kbGVzKTsKLXN0YXRpYyBERUZJTkVfU1BJTkxPQ0sobnNtX2xvY2spOwotCi1zdGF0aWMgc3RydWN0IG5zbV9oYW5kbGUgKm5zbV9maW5kKGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqc2FwLAotCQkJCSAgIGNvbnN0IHNpemVfdCBzYWxlbiwKLQkJCQkgICBjb25zdCBjaGFyICpob3N0bmFtZSwKLQkJCQkgICBjb25zdCBzaXplX3QgaG9zdG5hbWVfbGVuLAotCQkJCSAgIGNvbnN0IGludCBjcmVhdGUpCi17Ci0Jc3RydWN0IG5zbV9oYW5kbGUgKm5zbSA9IE5VTEw7Ci0Jc3RydWN0IG5zbV9oYW5kbGUgKnBvczsKLQotCWlmICghc2FwKQotCQlyZXR1cm4gTlVMTDsKLQotCWlmIChob3N0bmFtZSAmJiBtZW1jaHIoaG9zdG5hbWUsICcvJywgaG9zdG5hbWVfbGVuKSAhPSBOVUxMKSB7Ci0JCWlmIChwcmludGtfcmF0ZWxpbWl0KCkpIHsKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIkludmFsaWQgaG9zdG5hbWUgXCIlLipzXCIgIgotCQkJCQkgICAgImluIE5GUyBsb2NrIHJlcXVlc3RcbiIsCi0JCQkJKGludClob3N0bmFtZV9sZW4sIGhvc3RuYW1lKTsKLQkJfQotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLXJldHJ5OgotCXNwaW5fbG9jaygmbnNtX2xvY2spOwotCWxpc3RfZm9yX2VhY2hfZW50cnkocG9zLCAmbnNtX2hhbmRsZXMsIHNtX2xpbmspIHsKLQotCQlpZiAoaG9zdG5hbWUgJiYgbnNtX3VzZV9ob3N0bmFtZXMpIHsKLQkJCWlmIChzdHJsZW4ocG9zLT5zbV9uYW1lKSAhPSBob3N0bmFtZV9sZW4KLQkJCSB8fCBtZW1jbXAocG9zLT5zbV9uYW1lLCBob3N0bmFtZSwgaG9zdG5hbWVfbGVuKSkKLQkJCQljb250aW51ZTsKLQkJfSBlbHNlIGlmICghbmxtX2NtcF9hZGRyKG5zbV9hZGRyKHBvcyksIHNhcCkpCi0JCQljb250aW51ZTsKLQkJYXRvbWljX2luYygmcG9zLT5zbV9jb3VudCk7Ci0JCWtmcmVlKG5zbSk7Ci0JCW5zbSA9IHBvczsKLQkJZ290byBmb3VuZDsKLQl9Ci0JaWYgKG5zbSkgewotCQlsaXN0X2FkZCgmbnNtLT5zbV9saW5rLCAmbnNtX2hhbmRsZXMpOwotCQlnb3RvIGZvdW5kOwotCX0KLQlzcGluX3VubG9jaygmbnNtX2xvY2spOwotCi0JaWYgKCFjcmVhdGUpCi0JCXJldHVybiBOVUxMOwotCi0JbnNtID0ga3phbGxvYyhzaXplb2YoKm5zbSkgKyBob3N0bmFtZV9sZW4gKyAxLCBHRlBfS0VSTkVMKTsKLQlpZiAobnNtID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCi0JbWVtY3B5KG5zbV9hZGRyKG5zbSksIHNhcCwgc2FsZW4pOwotCW5zbS0+c21fYWRkcmxlbiA9IHNhbGVuOwotCW5zbS0+c21fbmFtZSA9IChjaGFyICopIChuc20gKyAxKTsKLQltZW1jcHkobnNtLT5zbV9uYW1lLCBob3N0bmFtZSwgaG9zdG5hbWVfbGVuKTsKLQluc20tPnNtX25hbWVbaG9zdG5hbWVfbGVuXSA9ICdcMCc7Ci0JbmxtX2Rpc3BsYXlfYWRkcmVzcygoc3RydWN0IHNvY2thZGRyICopJm5zbS0+c21fYWRkciwKLQkJCQluc20tPnNtX2FkZHJidWYsIHNpemVvZihuc20tPnNtX2FkZHJidWYpKTsKLQlhdG9taWNfc2V0KCZuc20tPnNtX2NvdW50LCAxKTsKLQlnb3RvIHJldHJ5OwotCi1mb3VuZDoKLQlzcGluX3VubG9jaygmbnNtX2xvY2spOwotCXJldHVybiBuc207Ci19Ci0KLS8qCi0gKiBSZWxlYXNlIGFuIE5TTSBoYW5kbGUKLSAqLwotdm9pZAotbnNtX3JlbGVhc2Uoc3RydWN0IG5zbV9oYW5kbGUgKm5zbSkKLXsKLQlpZiAoIW5zbSkKLQkJcmV0dXJuOwotCWlmIChhdG9taWNfZGVjX2FuZF9sb2NrKCZuc20tPnNtX2NvdW50LCAmbnNtX2xvY2spKSB7Ci0JCWxpc3RfZGVsKCZuc20tPnNtX2xpbmspOwotCQlzcGluX3VubG9jaygmbnNtX2xvY2spOwotCQlrZnJlZShuc20pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2ZzL2xvY2tkL21vbi5jIGIvZnMvbG9ja2QvbW9uLmMKaW5kZXggZmZkMzQ2MS4uNWUyYzRkNSAxMDA2NDQKLS0tIGEvZnMvbG9ja2QvbW9uLmMKKysrIGIvZnMvbG9ja2QvbW9uLmMKQEAgLTksMzUgKzksMTIzIEBACiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC91dHNuYW1lLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgva3RpbWUuaD4KKwogI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9jbG50Lmg+CiAjaW5jbHVkZSA8bGludXgvc3VucnBjL3hwcnRzb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvc3VucnBjL3N2Yy5oPgogI2luY2x1ZGUgPGxpbnV4L2xvY2tkL2xvY2tkLmg+Ci0jaW5jbHVkZSA8bGludXgvbG9ja2Qvc21faW50ZXIuaD4KLQogCiAjZGVmaW5lIE5MTURCR19GQUNJTElUWQkJTkxNREJHX01PTklUT1IKKyNkZWZpbmUgTlNNX1BST0dSQU0JCTEwMDAyNAorI2RlZmluZSBOU01fVkVSU0lPTgkJMQogCi0jZGVmaW5lIFhEUl9BRERSQlVGX0xFTgkJKDIwKQorZW51bSB7CisJTlNNUFJPQ19OVUxMLAorCU5TTVBST0NfU1RBVCwKKwlOU01QUk9DX01PTiwKKwlOU01QUk9DX1VOTU9OLAorCU5TTVBST0NfVU5NT05fQUxMLAorCU5TTVBST0NfU0lNVV9DUkFTSCwKKwlOU01QUk9DX05PVElGWSwKK307CiAKLXN0YXRpYyBzdHJ1Y3QgcnBjX2NsbnQgKgluc21fY3JlYXRlKHZvaWQpOworc3RydWN0IG5zbV9hcmdzIHsKKwlzdHJ1Y3QgbnNtX3ByaXZhdGUJKnByaXY7CisJdTMyCQkJcHJvZzsJCS8qIFJQQyBjYWxsYmFjayBpbmZvICovCisJdTMyCQkJdmVyczsKKwl1MzIJCQlwcm9jOworCisJY2hhcgkJCSptb25fbmFtZTsKK307CisKK3N0cnVjdCBuc21fcmVzIHsKKwl1MzIJCQlzdGF0dXM7CisJdTMyCQkJc3RhdGU7Cit9OwogCiBzdGF0aWMgc3RydWN0IHJwY19wcm9ncmFtCW5zbV9wcm9ncmFtOworc3RhdGljCQkJCUxJU1RfSEVBRChuc21faGFuZGxlcyk7CitzdGF0aWMJCQkJREVGSU5FX1NQSU5MT0NLKG5zbV9sb2NrKTsKIAogLyoKICAqIExvY2FsIE5TTSBzdGF0ZQogICovCi1pbnQJCQkJbnNtX2xvY2FsX3N0YXRlOworaW50CV9fcmVhZF9tb3N0bHkJCW5zbV9sb2NhbF9zdGF0ZTsKK2ludAlfX3JlYWRfbW9zdGx5CQluc21fdXNlX2hvc3RuYW1lczsKIAotLyoKLSAqIENvbW1vbiBwcm9jZWR1cmUgZm9yIFNNX01PTi9TTV9VTk1PTiBjYWxscwotICovCi1zdGF0aWMgaW50Ci1uc21fbW9uX3VubW9uKHN0cnVjdCBuc21faGFuZGxlICpuc20sIHUzMiBwcm9jLCBzdHJ1Y3QgbnNtX3JlcyAqcmVzKQorc3RhdGljIGlubGluZSBzdHJ1Y3Qgc29ja2FkZHIgKm5zbV9hZGRyKGNvbnN0IHN0cnVjdCBuc21faGFuZGxlICpuc20pCit7CisJcmV0dXJuIChzdHJ1Y3Qgc29ja2FkZHIgKikmbnNtLT5zbV9hZGRyOworfQorCitzdGF0aWMgdm9pZCBuc21fZGlzcGxheV9pcHY0X2FkZHJlc3MoY29uc3Qgc3RydWN0IHNvY2thZGRyICpzYXAsIGNoYXIgKmJ1ZiwKKwkJCQkgICAgIGNvbnN0IHNpemVfdCBsZW4pCit7CisJY29uc3Qgc3RydWN0IHNvY2thZGRyX2luICpzaW4gPSAoc3RydWN0IHNvY2thZGRyX2luICopc2FwOworCXNucHJpbnRmKGJ1ZiwgbGVuLCAiJXBJNCIsICZzaW4tPnNpbl9hZGRyLnNfYWRkcik7Cit9CisKK3N0YXRpYyB2b2lkIG5zbV9kaXNwbGF5X2lwdjZfYWRkcmVzcyhjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKnNhcCwgY2hhciAqYnVmLAorCQkJCSAgICAgY29uc3Qgc2l6ZV90IGxlbikKK3sKKwljb25zdCBzdHJ1Y3Qgc29ja2FkZHJfaW42ICpzaW42ID0gKHN0cnVjdCBzb2NrYWRkcl9pbjYgKilzYXA7CisKKwlpZiAoaXB2Nl9hZGRyX3Y0bWFwcGVkKCZzaW42LT5zaW42X2FkZHIpKQorCQlzbnByaW50ZihidWYsIGxlbiwgIiVwSTQiLCAmc2luNi0+c2luNl9hZGRyLnM2X2FkZHIzMlszXSk7CisJZWxzZSBpZiAoc2luNi0+c2luNl9zY29wZV9pZCAhPSAwKQorCQlzbnByaW50ZihidWYsIGxlbiwgIiVwSTYlJSV1IiwgJnNpbjYtPnNpbjZfYWRkciwKKwkJCQlzaW42LT5zaW42X3Njb3BlX2lkKTsKKwllbHNlCisJCXNucHJpbnRmKGJ1ZiwgbGVuLCAiJXBJNiIsICZzaW42LT5zaW42X2FkZHIpOworfQorCitzdGF0aWMgdm9pZCBuc21fZGlzcGxheV9hZGRyZXNzKGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqc2FwLAorCQkJCWNoYXIgKmJ1ZiwgY29uc3Qgc2l6ZV90IGxlbikKK3sKKwlzd2l0Y2ggKHNhcC0+c2FfZmFtaWx5KSB7CisJY2FzZSBBRl9JTkVUOgorCQluc21fZGlzcGxheV9pcHY0X2FkZHJlc3Moc2FwLCBidWYsIGxlbik7CisJCWJyZWFrOworCWNhc2UgQUZfSU5FVDY6CisJCW5zbV9kaXNwbGF5X2lwdjZfYWRkcmVzcyhzYXAsIGJ1ZiwgbGVuKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJc25wcmludGYoYnVmLCBsZW4sICJ1bnN1cHBvcnRlZCBhZGRyZXNzIGZhbWlseSIpOworCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcnBjX2NsbnQgKm5zbV9jcmVhdGUodm9pZCkKK3sKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gc2luID0geworCQkuc2luX2ZhbWlseQkJPSBBRl9JTkVULAorCQkuc2luX2FkZHIuc19hZGRyCT0gaHRvbmwoSU5BRERSX0xPT1BCQUNLKSwKKwl9OworCXN0cnVjdCBycGNfY3JlYXRlX2FyZ3MgYXJncyA9IHsKKwkJLnByb3RvY29sCQk9IFhQUlRfVFJBTlNQT1JUX1VEUCwKKwkJLmFkZHJlc3MJCT0gKHN0cnVjdCBzb2NrYWRkciAqKSZzaW4sCisJCS5hZGRyc2l6ZQkJPSBzaXplb2Yoc2luKSwKKwkJLnNlcnZlcm5hbWUJCT0gInJwYy5zdGF0ZCIsCisJCS5wcm9ncmFtCQk9ICZuc21fcHJvZ3JhbSwKKwkJLnZlcnNpb24JCT0gTlNNX1ZFUlNJT04sCisJCS5hdXRoZmxhdm9yCQk9IFJQQ19BVVRIX05VTEwsCisJfTsKKworCXJldHVybiBycGNfY3JlYXRlKCZhcmdzKTsKK30KKworc3RhdGljIGludCBuc21fbW9uX3VubW9uKHN0cnVjdCBuc21faGFuZGxlICpuc20sIHUzMiBwcm9jLCBzdHJ1Y3QgbnNtX3JlcyAqcmVzKQogewogCXN0cnVjdCBycGNfY2xudAkqY2xudDsKIAlpbnQJCXN0YXR1czsKLQlzdHJ1Y3QgbnNtX2FyZ3MJYXJnczsKKwlzdHJ1Y3QgbnNtX2FyZ3MgYXJncyA9IHsKKwkJLnByaXYJCT0gJm5zbS0+c21fcHJpdiwKKwkJLnByb2cJCT0gTkxNX1BST0dSQU0sCisJCS52ZXJzCQk9IDMsCisJCS5wcm9jCQk9IE5MTVBST0NfTlNNX05PVElGWSwKKwkJLm1vbl9uYW1lCT0gbnNtLT5zbV9tb25fbmFtZSwKKwl9OwogCXN0cnVjdCBycGNfbWVzc2FnZSBtc2cgPSB7CiAJCS5ycGNfYXJncAk9ICZhcmdzLAogCQkucnBjX3Jlc3AJPSByZXMsCkBAIC00NiwyMiArMTM0LDE4IEBACiAJY2xudCA9IG5zbV9jcmVhdGUoKTsKIAlpZiAoSVNfRVJSKGNsbnQpKSB7CiAJCXN0YXR1cyA9IFBUUl9FUlIoY2xudCk7CisJCWRwcmludGsoImxvY2tkOiBmYWlsZWQgdG8gY3JlYXRlIE5TTSB1cGNhbGwgdHJhbnNwb3J0LCAiCisJCQkJInN0YXR1cz0lZFxuIiwgc3RhdHVzKTsKIAkJZ290byBvdXQ7CiAJfQogCi0JbWVtc2V0KCZhcmdzLCAwLCBzaXplb2YoYXJncykpOwotCWFyZ3MubW9uX25hbWUgPSBuc20tPnNtX25hbWU7Ci0JYXJncy5hZGRyID0gbnNtX2FkZHJfaW4obnNtKS0+c2luX2FkZHIuc19hZGRyOwotCWFyZ3MucHJvZyA9IE5MTV9QUk9HUkFNOwotCWFyZ3MudmVycyA9IDM7Ci0JYXJncy5wcm9jID0gTkxNUFJPQ19OU01fTk9USUZZOwogCW1lbXNldChyZXMsIDAsIHNpemVvZigqcmVzKSk7CiAKIAltc2cucnBjX3Byb2MgPSAmY2xudC0+Y2xfcHJvY2luZm9bcHJvY107CiAJc3RhdHVzID0gcnBjX2NhbGxfc3luYyhjbG50LCAmbXNnLCAwKTsKIAlpZiAoc3RhdHVzIDwgMCkKLQkJcHJpbnRrKEtFUk5fREVCVUcgIm5zbV9tb25fdW5tb246IHJwYyBmYWlsZWQsIHN0YXR1cz0lZFxuIiwKLQkJCXN0YXR1cyk7CisJCWRwcmludGsoImxvY2tkOiBOU00gdXBjYWxsIFJQQyBmYWlsZWQsIHN0YXR1cz0lZFxuIiwKKwkJCQlzdGF0dXMpOwogCWVsc2UKIAkJc3RhdHVzID0gMDsKIAlycGNfc2h1dGRvd25fY2xpZW50KGNsbnQpOwpAQCAtNjksODIgKzE1MywyNzIgQEAKIAlyZXR1cm4gc3RhdHVzOwogfQogCi0vKgotICogU2V0IHVwIG1vbml0b3Jpbmcgb2YgYSByZW1vdGUgaG9zdAorLyoqCisgKiBuc21fbW9uaXRvciAtIE5vdGlmeSBhIHBlZXIgaW4gY2FzZSB3ZSByZWJvb3QKKyAqIEBob3N0OiBwb2ludGVyIHRvIG5sbV9ob3N0IG9mIHBlZXIgdG8gbm90aWZ5CisgKgorICogSWYgdGhpcyBwZWVyIGlzIG5vdCBhbHJlYWR5IG1vbml0b3JlZCwgdGhpcyBmdW5jdGlvbiBzZW5kcyBhbgorICogdXBjYWxsIHRvIHRoZSBsb2NhbCBycGMuc3RhdGQgdG8gcmVjb3JkIHRoZSBuYW1lL2FkZHJlc3Mgb2YKKyAqIHRoZSBwZWVyIHRvIG5vdGlmeSBpbiBjYXNlIHdlIHJlYm9vdC4KKyAqCisgKiBSZXR1cm5zIHplcm8gaWYgdGhlIHBlZXIgaXMgbW9uaXRvcmVkIGJ5IHRoZSBsb2NhbCBycGMuc3RhdGQ7CisgKiBvdGhlcndpc2UgYSBuZWdhdGl2ZSBlcnJubyB2YWx1ZSBpcyByZXR1cm5lZC4KICAqLwotaW50Ci1uc21fbW9uaXRvcihzdHJ1Y3QgbmxtX2hvc3QgKmhvc3QpCitpbnQgbnNtX21vbml0b3IoY29uc3Qgc3RydWN0IG5sbV9ob3N0ICpob3N0KQogewogCXN0cnVjdCBuc21faGFuZGxlICpuc20gPSBob3N0LT5oX25zbWhhbmRsZTsKIAlzdHJ1Y3QgbnNtX3JlcwlyZXM7CiAJaW50CQlzdGF0dXM7CiAKLQlkcHJpbnRrKCJsb2NrZDogbnNtX21vbml0b3IoJXMpXG4iLCBob3N0LT5oX25hbWUpOwotCUJVR19PTihuc20gPT0gTlVMTCk7CisJZHByaW50aygibG9ja2Q6IG5zbV9tb25pdG9yKCVzKVxuIiwgbnNtLT5zbV9uYW1lKTsKIAogCWlmIChuc20tPnNtX21vbml0b3JlZCkKIAkJcmV0dXJuIDA7CiAKLQlzdGF0dXMgPSBuc21fbW9uX3VubW9uKG5zbSwgU01fTU9OLCAmcmVzKTsKKwkvKgorCSAqIENob29zZSB3aGV0aGVyIHRvIHJlY29yZCB0aGUgY2FsbGVyX25hbWUgb3IgSVAgYWRkcmVzcyBvZgorCSAqIHRoaXMgcGVlciBpbiB0aGUgbG9jYWwgcnBjLnN0YXRkJ3MgZGF0YWJhc2UuCisJICovCisJbnNtLT5zbV9tb25fbmFtZSA9IG5zbV91c2VfaG9zdG5hbWVzID8gbnNtLT5zbV9uYW1lIDogbnNtLT5zbV9hZGRyYnVmOwogCi0JaWYgKHN0YXR1cyA8IDAgfHwgcmVzLnN0YXR1cyAhPSAwKQotCQlwcmludGsoS0VSTl9OT1RJQ0UgImxvY2tkOiBjYW5ub3QgbW9uaXRvciAlc1xuIiwgaG9zdC0+aF9uYW1lKTsKKwlzdGF0dXMgPSBuc21fbW9uX3VubW9uKG5zbSwgTlNNUFJPQ19NT04sICZyZXMpOworCWlmIChyZXMuc3RhdHVzICE9IDApCisJCXN0YXR1cyA9IC1FSU87CisJaWYgKHN0YXR1cyA8IDApCisJCXByaW50ayhLRVJOX05PVElDRSAibG9ja2Q6IGNhbm5vdCBtb25pdG9yICVzXG4iLCBuc20tPnNtX25hbWUpOwogCWVsc2UKIAkJbnNtLT5zbV9tb25pdG9yZWQgPSAxOwogCXJldHVybiBzdGF0dXM7CiB9CiAKLS8qCi0gKiBDZWFzZSB0byBtb25pdG9yIHJlbW90ZSBob3N0CisvKioKKyAqIG5zbV91bm1vbml0b3IgLSBVbnJlZ2lzdGVyIHBlZXIgbm90aWZpY2F0aW9uCisgKiBAaG9zdDogcG9pbnRlciB0byBubG1faG9zdCBvZiBwZWVyIHRvIHN0b3AgbW9uaXRvcmluZworICoKKyAqIElmIHRoaXMgcGVlciBpcyBtb25pdG9yZWQsIHRoaXMgZnVuY3Rpb24gc2VuZHMgYW4gdXBjYWxsIHRvCisgKiB0ZWxsIHRoZSBsb2NhbCBycGMuc3RhdGQgbm90IHRvIHNlbmQgdGhpcyBwZWVyIGEgbm90aWZpY2F0aW9uCisgKiB3aGVuIHdlIHJlYm9vdC4KICAqLwotaW50Ci1uc21fdW5tb25pdG9yKHN0cnVjdCBubG1faG9zdCAqaG9zdCkKK3ZvaWQgbnNtX3VubW9uaXRvcihjb25zdCBzdHJ1Y3QgbmxtX2hvc3QgKmhvc3QpCiB7CiAJc3RydWN0IG5zbV9oYW5kbGUgKm5zbSA9IGhvc3QtPmhfbnNtaGFuZGxlOwogCXN0cnVjdCBuc21fcmVzCXJlczsKLQlpbnQJCXN0YXR1cyA9IDA7Ci0KLQlpZiAobnNtID09IE5VTEwpCi0JCXJldHVybiAwOwotCWhvc3QtPmhfbnNtaGFuZGxlID0gTlVMTDsKKwlpbnQgc3RhdHVzOwogCiAJaWYgKGF0b21pY19yZWFkKCZuc20tPnNtX2NvdW50KSA9PSAxCiAJICYmIG5zbS0+c21fbW9uaXRvcmVkICYmICFuc20tPnNtX3N0aWNreSkgewotCQlkcHJpbnRrKCJsb2NrZDogbnNtX3VubW9uaXRvciglcylcbiIsIGhvc3QtPmhfbmFtZSk7CisJCWRwcmludGsoImxvY2tkOiBuc21fdW5tb25pdG9yKCVzKVxuIiwgbnNtLT5zbV9uYW1lKTsKIAotCQlzdGF0dXMgPSBuc21fbW9uX3VubW9uKG5zbSwgU01fVU5NT04sICZyZXMpOworCQlzdGF0dXMgPSBuc21fbW9uX3VubW9uKG5zbSwgTlNNUFJPQ19VTk1PTiwgJnJlcyk7CisJCWlmIChyZXMuc3RhdHVzICE9IDApCisJCQlzdGF0dXMgPSAtRUlPOwogCQlpZiAoc3RhdHVzIDwgMCkKIAkJCXByaW50ayhLRVJOX05PVElDRSAibG9ja2Q6IGNhbm5vdCB1bm1vbml0b3IgJXNcbiIsCi0JCQkJCWhvc3QtPmhfbmFtZSk7CisJCQkJCW5zbS0+c21fbmFtZSk7CiAJCWVsc2UKIAkJCW5zbS0+c21fbW9uaXRvcmVkID0gMDsKIAl9Ci0JbnNtX3JlbGVhc2UobnNtKTsKLQlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgc3RydWN0IG5zbV9oYW5kbGUgKm5zbV9sb29rdXBfaG9zdG5hbWUoY29uc3QgY2hhciAqaG9zdG5hbWUsCisJCQkJCSAgICAgIGNvbnN0IHNpemVfdCBsZW4pCit7CisJc3RydWN0IG5zbV9oYW5kbGUgKm5zbTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkobnNtLCAmbnNtX2hhbmRsZXMsIHNtX2xpbmspCisJCWlmIChzdHJsZW4obnNtLT5zbV9uYW1lKSA9PSBsZW4gJiYKKwkJICAgIG1lbWNtcChuc20tPnNtX25hbWUsIGhvc3RuYW1lLCBsZW4pID09IDApCisJCQlyZXR1cm4gbnNtOworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgc3RydWN0IG5zbV9oYW5kbGUgKm5zbV9sb29rdXBfYWRkcihjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKnNhcCkKK3sKKwlzdHJ1Y3QgbnNtX2hhbmRsZSAqbnNtOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShuc20sICZuc21faGFuZGxlcywgc21fbGluaykKKwkJaWYgKG5sbV9jbXBfYWRkcihuc21fYWRkcihuc20pLCBzYXApKQorCQkJcmV0dXJuIG5zbTsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHN0cnVjdCBuc21faGFuZGxlICpuc21fbG9va3VwX3ByaXYoY29uc3Qgc3RydWN0IG5zbV9wcml2YXRlICpwcml2KQoreworCXN0cnVjdCBuc21faGFuZGxlICpuc207CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KG5zbSwgJm5zbV9oYW5kbGVzLCBzbV9saW5rKQorCQlpZiAobWVtY21wKG5zbS0+c21fcHJpdi5kYXRhLCBwcml2LT5kYXRhLAorCQkJCQlzaXplb2YocHJpdi0+ZGF0YSkpID09IDApCisJCQlyZXR1cm4gbnNtOworCXJldHVybiBOVUxMOwogfQogCiAvKgotICogQ3JlYXRlIE5TTSBjbGllbnQgZm9yIHRoZSBsb2NhbCBob3N0CisgKiBDb25zdHJ1Y3QgYSB1bmlxdWUgY29va2llIHRvIG1hdGNoIHRoaXMgbnNtX2hhbmRsZSB0byB0aGlzIG1vbml0b3JlZAorICogaG9zdC4gIEl0IGlzIHBhc3NlZCB0byB0aGUgbG9jYWwgcnBjLnN0YXRkIHZpYSBOU01QUk9DX01PTiwgYW5kCisgKiByZXR1cm5lZCB2aWEgTkxNUFJPQ19TTV9OT1RJRlksIGluIHRoZSAicHJpdiIgZmllbGQgb2YgdGhlc2UKKyAqIHJlcXVlc3RzLgorICoKKyAqIFRoZSBOU00gcHJvdG9jb2wgcmVxdWlyZXMgdGhhdCB0aGVzZSBjb29raWVzIGJlIHVuaXF1ZSB3aGlsZSB0aGUKKyAqIHN5c3RlbSBpcyBydW5uaW5nLiAgV2UgcHJlZmVyIGEgc3Ryb25nZXIgcmVxdWlyZW1lbnQgb2YgbWFraW5nIHRoZW0KKyAqIHVuaXF1ZSBhY3Jvc3MgcmVib290cy4gIElmIHVzZXIgc3BhY2UgYnVncyBjYXVzZSBhIHN0YWxlIGNvb2tpZSB0bworICogYmUgc2VudCB0byB0aGUga2VybmVsLCBpdCBjb3VsZCBjYXVzZSB0aGUgd3JvbmcgaG9zdCB0byBsb3NlIGl0cworICogbG9jayBzdGF0ZSBpZiBjb29raWVzIHdlcmUgbm90IHVuaXF1ZSBhY3Jvc3MgcmVib290cy4KKyAqCisgKiBUaGUgY29va2llcyBhcmUgZXhwb3NlZCBvbmx5IHRvIGxvY2FsIHVzZXIgc3BhY2UgdmlhIGxvb3BiYWNrLiAgVGhleQorICogZG8gbm90IGFwcGVhciBvbiB0aGUgcGh5c2ljYWwgbmV0d29yay4gIElmIHdlIHdhbnQgZ3JlYXRlciBzZWN1cml0eQorICogZm9yIHNvbWUgcmVhc29uLCBuc21faW5pdF9wcml2YXRlKCkgY291bGQgcGVyZm9ybSBhIG9uZS13YXkgaGFzaCB0bworICogb2JzY3VyZSB0aGUgY29udGVudHMgb2YgdGhlIGNvb2tpZS4KICAqLwotc3RhdGljIHN0cnVjdCBycGNfY2xudCAqCi1uc21fY3JlYXRlKHZvaWQpCitzdGF0aWMgdm9pZCBuc21faW5pdF9wcml2YXRlKHN0cnVjdCBuc21faGFuZGxlICpuc20pCiB7Ci0Jc3RydWN0IHNvY2thZGRyX2luCXNpbiA9IHsKLQkJLnNpbl9mYW1pbHkJPSBBRl9JTkVULAotCQkuc2luX2FkZHIuc19hZGRyID0gaHRvbmwoSU5BRERSX0xPT1BCQUNLKSwKLQkJLnNpbl9wb3J0CT0gMCwKLQl9OwotCXN0cnVjdCBycGNfY3JlYXRlX2FyZ3MgYXJncyA9IHsKLQkJLnByb3RvY29sCT0gWFBSVF9UUkFOU1BPUlRfVURQLAotCQkuYWRkcmVzcwk9IChzdHJ1Y3Qgc29ja2FkZHIgKikmc2luLAotCQkuYWRkcnNpemUJPSBzaXplb2Yoc2luKSwKLQkJLnNlcnZlcm5hbWUJPSAibG9jYWxob3N0IiwKLQkJLnByb2dyYW0JPSAmbnNtX3Byb2dyYW0sCi0JCS52ZXJzaW9uCT0gU01fVkVSU0lPTiwKLQkJLmF1dGhmbGF2b3IJPSBSUENfQVVUSF9OVUxMLAotCX07CisJdTY0ICpwID0gKHU2NCAqKSZuc20tPnNtX3ByaXYuZGF0YTsKKwlzdHJ1Y3QgdGltZXNwZWMgdHM7CiAKLQlyZXR1cm4gcnBjX2NyZWF0ZSgmYXJncyk7CisJa3RpbWVfZ2V0X3RzKCZ0cyk7CisJKnArKyA9IHRpbWVzcGVjX3RvX25zKCZ0cyk7CisJKnAgPSAodW5zaWduZWQgbG9uZyluc207Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbnNtX2hhbmRsZSAqbnNtX2NyZWF0ZV9oYW5kbGUoY29uc3Qgc3RydWN0IHNvY2thZGRyICpzYXAsCisJCQkJCSAgICBjb25zdCBzaXplX3Qgc2FsZW4sCisJCQkJCSAgICBjb25zdCBjaGFyICpob3N0bmFtZSwKKwkJCQkJICAgIGNvbnN0IHNpemVfdCBob3N0bmFtZV9sZW4pCit7CisJc3RydWN0IG5zbV9oYW5kbGUgKm5ldzsKKworCW5ldyA9IGt6YWxsb2Moc2l6ZW9mKCpuZXcpICsgaG9zdG5hbWVfbGVuICsgMSwgR0ZQX0tFUk5FTCk7CisJaWYgKHVubGlrZWx5KG5ldyA9PSBOVUxMKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlhdG9taWNfc2V0KCZuZXctPnNtX2NvdW50LCAxKTsKKwluZXctPnNtX25hbWUgPSAoY2hhciAqKShuZXcgKyAxKTsKKwltZW1jcHkobnNtX2FkZHIobmV3KSwgc2FwLCBzYWxlbik7CisJbmV3LT5zbV9hZGRybGVuID0gc2FsZW47CisJbnNtX2luaXRfcHJpdmF0ZShuZXcpOworCW5zbV9kaXNwbGF5X2FkZHJlc3MoKGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqKSZuZXctPnNtX2FkZHIsCisJCQkJbmV3LT5zbV9hZGRyYnVmLCBzaXplb2YobmV3LT5zbV9hZGRyYnVmKSk7CisJbWVtY3B5KG5ldy0+c21fbmFtZSwgaG9zdG5hbWUsIGhvc3RuYW1lX2xlbik7CisJbmV3LT5zbV9uYW1lW2hvc3RuYW1lX2xlbl0gPSAnXDAnOworCisJcmV0dXJuIG5ldzsKK30KKworLyoqCisgKiBuc21fZ2V0X2hhbmRsZSAtIEZpbmQgb3IgY3JlYXRlIGEgY2FjaGVkIG5zbV9oYW5kbGUKKyAqIEBzYXA6IHBvaW50ZXIgdG8gc29ja2V0IGFkZHJlc3Mgb2YgaGFuZGxlIHRvIGZpbmQKKyAqIEBzYWxlbjogbGVuZ3RoIG9mIHNvY2tldCBhZGRyZXNzCisgKiBAaG9zdG5hbWU6IHBvaW50ZXIgdG8gQyBzdHJpbmcgY29udGFpbmluZyBob3N0bmFtZSB0byBmaW5kCisgKiBAaG9zdG5hbWVfbGVuOiBsZW5ndGggb2YgQyBzdHJpbmcKKyAqCisgKiBCZWhhdmlvciBpcyBtb2R1bGF0ZWQgYnkgdGhlIGdsb2JhbCBuc21fdXNlX2hvc3RuYW1lcyB2YXJpYWJsZS4KKyAqCisgKiBSZXR1cm5zIGEgY2FjaGVkIG5zbV9oYW5kbGUgYWZ0ZXIgYnVtcGluZyBpdHMgcmVmIGNvdW50LCBvcgorICogcmV0dXJucyBhIGZyZXNoIG5zbV9oYW5kbGUgaWYgYSBoYW5kbGUgdGhhdCBtYXRjaGVzIEBzYXAgYW5kL29yCisgKiBAaG9zdG5hbWUgY2Fubm90IGJlIGZvdW5kIGluIHRoZSBoYW5kbGUgY2FjaGUuICBSZXR1cm5zIE5VTEwgaWYKKyAqIGFuIGVycm9yIG9jY3Vycy4KKyAqLworc3RydWN0IG5zbV9oYW5kbGUgKm5zbV9nZXRfaGFuZGxlKGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqc2FwLAorCQkJCSAgY29uc3Qgc2l6ZV90IHNhbGVuLCBjb25zdCBjaGFyICpob3N0bmFtZSwKKwkJCQkgIGNvbnN0IHNpemVfdCBob3N0bmFtZV9sZW4pCit7CisJc3RydWN0IG5zbV9oYW5kbGUgKmNhY2hlZCwgKm5ldyA9IE5VTEw7CisKKwlpZiAoaG9zdG5hbWUgJiYgbWVtY2hyKGhvc3RuYW1lLCAnLycsIGhvc3RuYW1lX2xlbikgIT0gTlVMTCkgeworCQlpZiAocHJpbnRrX3JhdGVsaW1pdCgpKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJJbnZhbGlkIGhvc3RuYW1lIFwiJS4qc1wiICIKKwkJCQkJICAgICJpbiBORlMgbG9jayByZXF1ZXN0XG4iLAorCQkJCShpbnQpaG9zdG5hbWVfbGVuLCBob3N0bmFtZSk7CisJCX0KKwkJcmV0dXJuIE5VTEw7CisJfQorCityZXRyeToKKwlzcGluX2xvY2soJm5zbV9sb2NrKTsKKworCWlmIChuc21fdXNlX2hvc3RuYW1lcyAmJiBob3N0bmFtZSAhPSBOVUxMKQorCQljYWNoZWQgPSBuc21fbG9va3VwX2hvc3RuYW1lKGhvc3RuYW1lLCBob3N0bmFtZV9sZW4pOworCWVsc2UKKwkJY2FjaGVkID0gbnNtX2xvb2t1cF9hZGRyKHNhcCk7CisKKwlpZiAoY2FjaGVkICE9IE5VTEwpIHsKKwkJYXRvbWljX2luYygmY2FjaGVkLT5zbV9jb3VudCk7CisJCXNwaW5fdW5sb2NrKCZuc21fbG9jayk7CisJCWtmcmVlKG5ldyk7CisJCWRwcmludGsoImxvY2tkOiBmb3VuZCBuc21faGFuZGxlIGZvciAlcyAoJXMpLCAiCisJCQkJImNudCAlZFxuIiwgY2FjaGVkLT5zbV9uYW1lLAorCQkJCWNhY2hlZC0+c21fYWRkcmJ1ZiwKKwkJCQlhdG9taWNfcmVhZCgmY2FjaGVkLT5zbV9jb3VudCkpOworCQlyZXR1cm4gY2FjaGVkOworCX0KKworCWlmIChuZXcgIT0gTlVMTCkgeworCQlsaXN0X2FkZCgmbmV3LT5zbV9saW5rLCAmbnNtX2hhbmRsZXMpOworCQlzcGluX3VubG9jaygmbnNtX2xvY2spOworCQlkcHJpbnRrKCJsb2NrZDogY3JlYXRlZCBuc21faGFuZGxlIGZvciAlcyAoJXMpXG4iLAorCQkJCW5ldy0+c21fbmFtZSwgbmV3LT5zbV9hZGRyYnVmKTsKKwkJcmV0dXJuIG5ldzsKKwl9CisKKwlzcGluX3VubG9jaygmbnNtX2xvY2spOworCisJbmV3ID0gbnNtX2NyZWF0ZV9oYW5kbGUoc2FwLCBzYWxlbiwgaG9zdG5hbWUsIGhvc3RuYW1lX2xlbik7CisJaWYgKHVubGlrZWx5KG5ldyA9PSBOVUxMKSkKKwkJcmV0dXJuIE5VTEw7CisJZ290byByZXRyeTsKK30KKworLyoqCisgKiBuc21fcmVib290X2xvb2t1cCAtIG1hdGNoIE5MTVBST0NfU01fTk9USUZZIGFyZ3VtZW50cyB0byBhbiBuc21faGFuZGxlCisgKiBAaW5mbzogcG9pbnRlciB0byBOTE1QUk9DX1NNX05PVElGWSBhcmd1bWVudHMKKyAqCisgKiBSZXR1cm5zIGEgbWF0Y2hpbmcgbnNtX2hhbmRsZSBpZiBmb3VuZCBpbiB0aGUgbnNtIGNhY2hlOyB0aGUgcmV0dXJuZWQKKyAqIG5zbV9oYW5kbGUncyByZWZlcmVuY2UgY291bnQgaXMgYnVtcGVkIGFuZCBzbV9tb25pdG9yZWQgaXMgY2xlYXJlZC4KKyAqIE90aGVyd2lzZSByZXR1cm5zIE5VTEwgaWYgc29tZSBlcnJvciBvY2N1cnJlZC4KKyAqLworc3RydWN0IG5zbV9oYW5kbGUgKm5zbV9yZWJvb3RfbG9va3VwKGNvbnN0IHN0cnVjdCBubG1fcmVib290ICppbmZvKQoreworCXN0cnVjdCBuc21faGFuZGxlICpjYWNoZWQ7CisKKwlzcGluX2xvY2soJm5zbV9sb2NrKTsKKworCWNhY2hlZCA9IG5zbV9sb29rdXBfcHJpdigmaW5mby0+cHJpdik7CisJaWYgKHVubGlrZWx5KGNhY2hlZCA9PSBOVUxMKSkgeworCQlzcGluX3VubG9jaygmbnNtX2xvY2spOworCQlkcHJpbnRrKCJsb2NrZDogbmV2ZXIgc2F3IHJlYm9vdGVkIHBlZXIgJyUuKnMnIGJlZm9yZVxuIiwKKwkJCQlpbmZvLT5sZW4sIGluZm8tPm1vbik7CisJCXJldHVybiBjYWNoZWQ7CisJfQorCisJYXRvbWljX2luYygmY2FjaGVkLT5zbV9jb3VudCk7CisJc3Bpbl91bmxvY2soJm5zbV9sb2NrKTsKKworCS8qCisJICogRHVyaW5nIHN1YnNlcXVlbnQgbG9jayBhY3Rpdml0eSwgZm9yY2UgYSBmcmVzaAorCSAqIG5vdGlmaWNhdGlvbiB0byBiZSBzZXQgdXAgZm9yIHRoaXMgaG9zdC4KKwkgKi8KKwljYWNoZWQtPnNtX21vbml0b3JlZCA9IDA7CisKKwlkcHJpbnRrKCJsb2NrZDogaG9zdCAlcyAoJXMpIHJlYm9vdGVkLCBjbnQgJWRcbiIsCisJCQljYWNoZWQtPnNtX25hbWUsIGNhY2hlZC0+c21fYWRkcmJ1ZiwKKwkJCWF0b21pY19yZWFkKCZjYWNoZWQtPnNtX2NvdW50KSk7CisJcmV0dXJuIGNhY2hlZDsKK30KKworLyoqCisgKiBuc21fcmVsZWFzZSAtIFJlbGVhc2UgYW4gTlNNIGhhbmRsZQorICogQG5zbTogcG9pbnRlciB0byBoYW5kbGUgdG8gYmUgcmVsZWFzZWQKKyAqCisgKi8KK3ZvaWQgbnNtX3JlbGVhc2Uoc3RydWN0IG5zbV9oYW5kbGUgKm5zbSkKK3sKKwlpZiAoYXRvbWljX2RlY19hbmRfbG9jaygmbnNtLT5zbV9jb3VudCwgJm5zbV9sb2NrKSkgeworCQlsaXN0X2RlbCgmbnNtLT5zbV9saW5rKTsKKwkJc3Bpbl91bmxvY2soJm5zbV9sb2NrKTsKKwkJZHByaW50aygibG9ja2Q6IGRlc3Ryb3llZCBuc21faGFuZGxlIGZvciAlcyAoJXMpXG4iLAorCQkJCW5zbS0+c21fbmFtZSwgbnNtLT5zbV9hZGRyYnVmKTsKKwkJa2ZyZWUobnNtKTsKKwl9CiB9CiAKIC8qCkBAIC0xNTQsMTI3ICs0MjgsMTMyIEBACiAgKiBTdGF0dXMgTW9uaXRvciB3aXJlIHByb3RvY29sLgogICovCiAKLXN0YXRpYyBfX2JlMzIgKnhkcl9lbmNvZGVfbnNtX3N0cmluZyhfX2JlMzIgKnAsIGNoYXIgKnN0cmluZykKK3N0YXRpYyBpbnQgZW5jb2RlX25zbV9zdHJpbmcoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgY29uc3QgY2hhciAqc3RyaW5nKQogewotCXNpemVfdCBsZW4gPSBzdHJsZW4oc3RyaW5nKTsKKwljb25zdCB1MzIgbGVuID0gc3RybGVuKHN0cmluZyk7CisJX19iZTMyICpwOwogCi0JaWYgKGxlbiA+IFNNX01BWFNUUkxFTikKLQkJbGVuID0gU01fTUFYU1RSTEVOOwotCXJldHVybiB4ZHJfZW5jb2RlX29wYXF1ZShwLCBzdHJpbmcsIGxlbik7CisJaWYgKHVubGlrZWx5KGxlbiA+IFNNX01BWFNUUkxFTikpCisJCXJldHVybiAtRUlPOworCXAgPSB4ZHJfcmVzZXJ2ZV9zcGFjZSh4ZHIsIHNpemVvZih1MzIpICsgbGVuKTsKKwlpZiAodW5saWtlbHkocCA9PSBOVUxMKSkKKwkJcmV0dXJuIC1FSU87CisJeGRyX2VuY29kZV9vcGFxdWUocCwgc3RyaW5nLCBsZW4pOworCXJldHVybiAwOwogfQogCiAvKgogICogIm1vbl9uYW1lIiBzcGVjaWZpZXMgdGhlIGhvc3QgdG8gYmUgbW9uaXRvcmVkLgotICoKLSAqIExpbnV4IHVzZXMgYSB0ZXh0IHZlcnNpb24gb2YgdGhlIElQIGFkZHJlc3Mgb2YgdGhlIHJlbW90ZQotICogaG9zdCBhcyB0aGUgaG9zdCBpZGVudGlmaWVyICh0aGUgIm1vbl9uYW1lIiBhcmd1bWVudCkuCi0gKgotICogTGludXggc3RhdGQgYWx3YXlzIGxvb2tzIHVwIHRoZSBjYW5vbmljYWwgaG9zdG5hbWUgZmlyc3QgZm9yCi0gKiB3aGF0ZXZlciByZW1vdGUgaG9zdG5hbWUgaXQgcmVjZWl2ZXMsIHNvIHRoaXMgd29ya3MgYWxyaWdodC4KICAqLwotc3RhdGljIF9fYmUzMiAqeGRyX2VuY29kZV9tb25fbmFtZShfX2JlMzIgKnAsIHN0cnVjdCBuc21fYXJncyAqYXJncCkKK3N0YXRpYyBpbnQgZW5jb2RlX21vbl9uYW1lKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIGNvbnN0IHN0cnVjdCBuc21fYXJncyAqYXJncCkKIHsKLQljaGFyCWJ1ZmZlcltYRFJfQUREUkJVRl9MRU4gKyAxXTsKLQljaGFyCSpuYW1lID0gYXJncC0+bW9uX25hbWU7Ci0KLQlpZiAoIW5zbV91c2VfaG9zdG5hbWVzKSB7Ci0JCXNucHJpbnRmKGJ1ZmZlciwgWERSX0FERFJCVUZfTEVOLAotCQkJICIlcEk0IiwgJmFyZ3AtPmFkZHIpOwotCQluYW1lID0gYnVmZmVyOwotCX0KLQotCXJldHVybiB4ZHJfZW5jb2RlX25zbV9zdHJpbmcocCwgbmFtZSk7CisJcmV0dXJuIGVuY29kZV9uc21fc3RyaW5nKHhkciwgYXJncC0+bW9uX25hbWUpOwogfQogCiAvKgogICogVGhlICJteV9pZCIgYXJndW1lbnQgc3BlY2lmaWVzIHRoZSBob3N0bmFtZSBhbmQgUlBDIHByb2NlZHVyZQogICogdG8gYmUgY2FsbGVkIHdoZW4gdGhlIHN0YXR1cyBtYW5hZ2VyIHJlY2VpdmVzIG5vdGlmaWNhdGlvbgotICogKHZpYSB0aGUgU01fTk9USUZZIGNhbGwpIHRoYXQgdGhlIHN0YXRlIG9mIGhvc3QgIm1vbl9uYW1lIgorICogKHZpYSB0aGUgTkxNUFJPQ19TTV9OT1RJRlkgY2FsbCkgdGhhdCB0aGUgc3RhdGUgb2YgaG9zdCAibW9uX25hbWUiCiAgKiBoYXMgY2hhbmdlZC4KICAqLwotc3RhdGljIF9fYmUzMiAqeGRyX2VuY29kZV9teV9pZChfX2JlMzIgKnAsIHN0cnVjdCBuc21fYXJncyAqYXJncCkKK3N0YXRpYyBpbnQgZW5jb2RlX215X2lkKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIGNvbnN0IHN0cnVjdCBuc21fYXJncyAqYXJncCkKIHsKLQlwID0geGRyX2VuY29kZV9uc21fc3RyaW5nKHAsIHV0c25hbWUoKS0+bm9kZW5hbWUpOwotCWlmICghcCkKLQkJcmV0dXJuIEVSUl9QVFIoLUVJTyk7CisJaW50IHN0YXR1czsKKwlfX2JlMzIgKnA7CiAKKwlzdGF0dXMgPSBlbmNvZGVfbnNtX3N0cmluZyh4ZHIsIHV0c25hbWUoKS0+bm9kZW5hbWUpOworCWlmICh1bmxpa2VseShzdGF0dXMgIT0gMCkpCisJCXJldHVybiBzdGF0dXM7CisJcCA9IHhkcl9yZXNlcnZlX3NwYWNlKHhkciwgMyAqIHNpemVvZih1MzIpKTsKKwlpZiAodW5saWtlbHkocCA9PSBOVUxMKSkKKwkJcmV0dXJuIC1FSU87CiAJKnArKyA9IGh0b25sKGFyZ3AtPnByb2cpOwogCSpwKysgPSBodG9ubChhcmdwLT52ZXJzKTsKIAkqcCsrID0gaHRvbmwoYXJncC0+cHJvYyk7Ci0KLQlyZXR1cm4gcDsKKwlyZXR1cm4gMDsKIH0KIAogLyoKICAqIFRoZSAibW9uX2lkIiBhcmd1bWVudCBzcGVjaWZpZXMgdGhlIG5vbi1wcml2YXRlIGFyZ3VtZW50cwotICogb2YgYW4gU01fTU9OIG9yIFNNX1VOTU9OIGNhbGwuCisgKiBvZiBhbiBOU01QUk9DX01PTiBvciBOU01QUk9DX1VOTU9OIGNhbGwuCiAgKi8KLXN0YXRpYyBfX2JlMzIgKnhkcl9lbmNvZGVfbW9uX2lkKF9fYmUzMiAqcCwgc3RydWN0IG5zbV9hcmdzICphcmdwKQorc3RhdGljIGludCBlbmNvZGVfbW9uX2lkKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIGNvbnN0IHN0cnVjdCBuc21fYXJncyAqYXJncCkKIHsKLQlwID0geGRyX2VuY29kZV9tb25fbmFtZShwLCBhcmdwKTsKLQlpZiAoIXApCi0JCXJldHVybiBFUlJfUFRSKC1FSU8pOworCWludCBzdGF0dXM7CiAKLQlyZXR1cm4geGRyX2VuY29kZV9teV9pZChwLCBhcmdwKTsKKwlzdGF0dXMgPSBlbmNvZGVfbW9uX25hbWUoeGRyLCBhcmdwKTsKKwlpZiAodW5saWtlbHkoc3RhdHVzICE9IDApKQorCQlyZXR1cm4gc3RhdHVzOworCXJldHVybiBlbmNvZGVfbXlfaWQoeGRyLCBhcmdwKTsKIH0KIAogLyoKICAqIFRoZSAicHJpdiIgYXJndW1lbnQgbWF5IGNvbnRhaW4gcHJpdmF0ZSBpbmZvcm1hdGlvbiByZXF1aXJlZAotICogYnkgdGhlIFNNX01PTiBjYWxsLiBUaGlzIGluZm9ybWF0aW9uIHdpbGwgYmUgc3VwcGxpZWQgaW4gdGhlCi0gKiBTTV9OT1RJRlkgY2FsbC4KLSAqCi0gKiBMaW51eCBwcm92aWRlcyB0aGUgcmF3IElQIGFkZHJlc3Mgb2YgdGhlIG1vbml0b3JlZCBob3N0LAotICogbGVmdCBpbiBuZXR3b3JrIGJ5dGUgb3JkZXIuCisgKiBieSB0aGUgTlNNUFJPQ19NT04gY2FsbC4gVGhpcyBpbmZvcm1hdGlvbiB3aWxsIGJlIHN1cHBsaWVkIGluIHRoZQorICogTkxNUFJPQ19TTV9OT1RJRlkgY2FsbC4KICAqLwotc3RhdGljIF9fYmUzMiAqeGRyX2VuY29kZV9wcml2KF9fYmUzMiAqcCwgc3RydWN0IG5zbV9hcmdzICphcmdwKQorc3RhdGljIGludCBlbmNvZGVfcHJpdihzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBjb25zdCBzdHJ1Y3QgbnNtX2FyZ3MgKmFyZ3ApCiB7Ci0JKnArKyA9IGFyZ3AtPmFkZHI7Ci0JKnArKyA9IDA7Ci0JKnArKyA9IDA7Ci0JKnArKyA9IDA7CisJX19iZTMyICpwOwogCi0JcmV0dXJuIHA7Ci19Ci0KLXN0YXRpYyBpbnQKLXhkcl9lbmNvZGVfbW9uKHN0cnVjdCBycGNfcnFzdCAqcnFzdHAsIF9fYmUzMiAqcCwgc3RydWN0IG5zbV9hcmdzICphcmdwKQotewotCXAgPSB4ZHJfZW5jb2RlX21vbl9pZChwLCBhcmdwKTsKLQlpZiAoSVNfRVJSKHApKQotCQlyZXR1cm4gUFRSX0VSUihwKTsKLQotCXAgPSB4ZHJfZW5jb2RlX3ByaXYocCwgYXJncCk7Ci0JaWYgKElTX0VSUihwKSkKLQkJcmV0dXJuIFBUUl9FUlIocCk7Ci0KLQlycXN0cC0+cnFfc2xlbiA9IHhkcl9hZGp1c3RfaW92ZWMocnFzdHAtPnJxX3N2ZWMsIHApOworCXAgPSB4ZHJfcmVzZXJ2ZV9zcGFjZSh4ZHIsIFNNX1BSSVZfU0laRSk7CisJaWYgKHVubGlrZWx5KHAgPT0gTlVMTCkpCisJCXJldHVybiAtRUlPOworCXhkcl9lbmNvZGVfb3BhcXVlX2ZpeGVkKHAsIGFyZ3AtPnByaXYtPmRhdGEsIFNNX1BSSVZfU0laRSk7CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQKLXhkcl9lbmNvZGVfdW5tb24oc3RydWN0IHJwY19ycXN0ICpycXN0cCwgX19iZTMyICpwLCBzdHJ1Y3QgbnNtX2FyZ3MgKmFyZ3ApCitzdGF0aWMgaW50IHhkcl9lbmNfbW9uKHN0cnVjdCBycGNfcnFzdCAqcmVxLCBfX2JlMzIgKnAsCisJCSAgICAgICBjb25zdCBzdHJ1Y3QgbnNtX2FyZ3MgKmFyZ3ApCiB7Ci0JcCA9IHhkcl9lbmNvZGVfbW9uX2lkKHAsIGFyZ3ApOwotCWlmIChJU19FUlIocCkpCi0JCXJldHVybiBQVFJfRVJSKHApOwotCXJxc3RwLT5ycV9zbGVuID0geGRyX2FkanVzdF9pb3ZlYyhycXN0cC0+cnFfc3ZlYywgcCk7Ci0JcmV0dXJuIDA7CisJc3RydWN0IHhkcl9zdHJlYW0geGRyOworCWludCBzdGF0dXM7CisKKwl4ZHJfaW5pdF9lbmNvZGUoJnhkciwgJnJlcS0+cnFfc25kX2J1ZiwgcCk7CisJc3RhdHVzID0gZW5jb2RlX21vbl9pZCgmeGRyLCBhcmdwKTsKKwlpZiAodW5saWtlbHkoc3RhdHVzKSkKKwkJcmV0dXJuIHN0YXR1czsKKwlyZXR1cm4gZW5jb2RlX3ByaXYoJnhkciwgYXJncCk7CiB9CiAKLXN0YXRpYyBpbnQKLXhkcl9kZWNvZGVfc3RhdF9yZXMoc3RydWN0IHJwY19ycXN0ICpycXN0cCwgX19iZTMyICpwLCBzdHJ1Y3QgbnNtX3JlcyAqcmVzcCkKK3N0YXRpYyBpbnQgeGRyX2VuY191bm1vbihzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgX19iZTMyICpwLAorCQkJIGNvbnN0IHN0cnVjdCBuc21fYXJncyAqYXJncCkKIHsKKwlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CisKKwl4ZHJfaW5pdF9lbmNvZGUoJnhkciwgJnJlcS0+cnFfc25kX2J1ZiwgcCk7CisJcmV0dXJuIGVuY29kZV9tb25faWQoJnhkciwgYXJncCk7Cit9CisKK3N0YXRpYyBpbnQgeGRyX2RlY19zdGF0X3JlcyhzdHJ1Y3QgcnBjX3Jxc3QgKnJxc3RwLCBfX2JlMzIgKnAsCisJCQkgICAgc3RydWN0IG5zbV9yZXMgKnJlc3ApCit7CisJc3RydWN0IHhkcl9zdHJlYW0geGRyOworCisJeGRyX2luaXRfZGVjb2RlKCZ4ZHIsICZycXN0cC0+cnFfcmN2X2J1ZiwgcCk7CisJcCA9IHhkcl9pbmxpbmVfZGVjb2RlKCZ4ZHIsIDIgKiBzaXplb2YodTMyKSk7CisJaWYgKHVubGlrZWx5KHAgPT0gTlVMTCkpCisJCXJldHVybiAtRUlPOwogCXJlc3AtPnN0YXR1cyA9IG50b2hsKCpwKyspOwotCXJlc3AtPnN0YXRlID0gbnRvaGwoKnArKyk7Ci0JZHByaW50aygibnNtOiB4ZHJfZGVjb2RlX3N0YXRfcmVzIHN0YXR1cyAlZCBzdGF0ZSAlZFxuIiwKKwlyZXNwLT5zdGF0ZSA9IG50b2hsKCpwKTsKKworCWRwcmludGsoImxvY2tkOiB4ZHJfZGVjX3N0YXRfcmVzIHN0YXR1cyAlZCBzdGF0ZSAlZFxuIiwKIAkJCXJlc3AtPnN0YXR1cywgcmVzcC0+c3RhdGUpOwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50Ci14ZHJfZGVjb2RlX3N0YXQoc3RydWN0IHJwY19ycXN0ICpycXN0cCwgX19iZTMyICpwLCBzdHJ1Y3QgbnNtX3JlcyAqcmVzcCkKK3N0YXRpYyBpbnQgeGRyX2RlY19zdGF0KHN0cnVjdCBycGNfcnFzdCAqcnFzdHAsIF9fYmUzMiAqcCwKKwkJCXN0cnVjdCBuc21fcmVzICpyZXNwKQogewotCXJlc3AtPnN0YXRlID0gbnRvaGwoKnArKyk7CisJc3RydWN0IHhkcl9zdHJlYW0geGRyOworCisJeGRyX2luaXRfZGVjb2RlKCZ4ZHIsICZycXN0cC0+cnFfcmN2X2J1ZiwgcCk7CisJcCA9IHhkcl9pbmxpbmVfZGVjb2RlKCZ4ZHIsIHNpemVvZih1MzIpKTsKKwlpZiAodW5saWtlbHkocCA9PSBOVUxMKSkKKwkJcmV0dXJuIC1FSU87CisJcmVzcC0+c3RhdGUgPSBudG9obCgqcCk7CisKKwlkcHJpbnRrKCJsb2NrZDogeGRyX2RlY19zdGF0IHN0YXRlICVkXG4iLCByZXNwLT5zdGF0ZSk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTI4OCwyMiArNTY3LDIyIEBACiAjZGVmaW5lIFNNX3VubW9ucmVzX3N6CTEKIAogc3RhdGljIHN0cnVjdCBycGNfcHJvY2luZm8JbnNtX3Byb2NlZHVyZXNbXSA9IHsKLVtTTV9NT05dID0gewotCQkucF9wcm9jCQk9IFNNX01PTiwKLQkJLnBfZW5jb2RlCT0gKGt4ZHJwcm9jX3QpIHhkcl9lbmNvZGVfbW9uLAotCQkucF9kZWNvZGUJPSAoa3hkcnByb2NfdCkgeGRyX2RlY29kZV9zdGF0X3JlcywKK1tOU01QUk9DX01PTl0gPSB7CisJCS5wX3Byb2MJCT0gTlNNUFJPQ19NT04sCisJCS5wX2VuY29kZQk9IChreGRycHJvY190KXhkcl9lbmNfbW9uLAorCQkucF9kZWNvZGUJPSAoa3hkcnByb2NfdCl4ZHJfZGVjX3N0YXRfcmVzLAogCQkucF9hcmdsZW4JPSBTTV9tb25fc3osCiAJCS5wX3JlcGxlbgk9IFNNX21vbnJlc19zeiwKLQkJLnBfc3RhdGlkeAk9IFNNX01PTiwKKwkJLnBfc3RhdGlkeAk9IE5TTVBST0NfTU9OLAogCQkucF9uYW1lCQk9ICJNT05JVE9SIiwKIAl9LAotW1NNX1VOTU9OXSA9IHsKLQkJLnBfcHJvYwkJPSBTTV9VTk1PTiwKLQkJLnBfZW5jb2RlCT0gKGt4ZHJwcm9jX3QpIHhkcl9lbmNvZGVfdW5tb24sCi0JCS5wX2RlY29kZQk9IChreGRycHJvY190KSB4ZHJfZGVjb2RlX3N0YXQsCitbTlNNUFJPQ19VTk1PTl0gPSB7CisJCS5wX3Byb2MJCT0gTlNNUFJPQ19VTk1PTiwKKwkJLnBfZW5jb2RlCT0gKGt4ZHJwcm9jX3QpeGRyX2VuY191bm1vbiwKKwkJLnBfZGVjb2RlCT0gKGt4ZHJwcm9jX3QpeGRyX2RlY19zdGF0LAogCQkucF9hcmdsZW4JPSBTTV9tb25faWRfc3osCiAJCS5wX3JlcGxlbgk9IFNNX3VubW9ucmVzX3N6LAotCQkucF9zdGF0aWR4CT0gU01fVU5NT04sCisJCS5wX3N0YXRpZHgJPSBOU01QUk9DX1VOTU9OLAogCQkucF9uYW1lCQk9ICJVTk1PTklUT1IiLAogCX0sCiB9OwpAQCAtMzIyLDcgKzYwMSw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgcnBjX3Byb2dyYW0JbnNtX3Byb2dyYW0gPSB7CiAJCS5uYW1lCQk9ICJzdGF0ZCIsCi0JCS5udW1iZXIJCT0gU01fUFJPR1JBTSwKKwkJLm51bWJlcgkJPSBOU01fUFJPR1JBTSwKIAkJLm5ydmVycwkJPSBBUlJBWV9TSVpFKG5zbV92ZXJzaW9uKSwKIAkJLnZlcnNpb24JPSBuc21fdmVyc2lvbiwKIAkJLnN0YXRzCQk9ICZuc21fc3RhdHMKZGlmZiAtLWdpdCBhL2ZzL2xvY2tkL3N2Yy5jIGIvZnMvbG9ja2Qvc3ZjLmMKaW5kZXggMjUyZDgwMS4uNjRmMWMzMSAxMDA2NDQKLS0tIGEvZnMvbG9ja2Qvc3ZjLmMKKysrIGIvZnMvbG9ja2Qvc3ZjLmMKQEAgLTM1LDcgKzM1LDYgQEAKICNpbmNsdWRlIDxsaW51eC9zdW5ycGMvc3Zjc29jay5oPgogI2luY2x1ZGUgPG5ldC9pcC5oPgogI2luY2x1ZGUgPGxpbnV4L2xvY2tkL2xvY2tkLmg+Ci0jaW5jbHVkZSA8bGludXgvbG9ja2Qvc21faW50ZXIuaD4KICNpbmNsdWRlIDxsaW51eC9uZnMuaD4KIAogI2RlZmluZSBOTE1EQkdfRkFDSUxJVFkJCU5MTURCR19TVkMKQEAgLTU0LDEzICs1MywyNiBAQAogdW5zaWduZWQgbG9uZwkJCW5sbXN2Y190aW1lb3V0OwogCiAvKgorICogSWYgdGhlIGtlcm5lbCBoYXMgSVB2NiBzdXBwb3J0IGF2YWlsYWJsZSwgYWx3YXlzIGxpc3RlbiBmb3IKKyAqIGJvdGggQUZfSU5FVCBhbmQgQUZfSU5FVDYgcmVxdWVzdHMuCisgKi8KKyNpZiAoZGVmaW5lZChDT05GSUdfSVBWNikgfHwgZGVmaW5lZChDT05GSUdfSVBWNl9NT0RVTEUpKSAmJiBcCisJZGVmaW5lZChDT05GSUdfU1VOUlBDX1JFR0lTVEVSX1Y0KQorc3RhdGljIGNvbnN0IHNhX2ZhbWlseV90CW5sbXN2Y19mYW1pbHkgPSBBRl9JTkVUNjsKKyNlbHNlCS8qIChDT05GSUdfSVBWNiB8fCBDT05GSUdfSVBWNl9NT0RVTEUpICYmIENPTkZJR19TVU5SUENfUkVHSVNURVJfVjQgKi8KK3N0YXRpYyBjb25zdCBzYV9mYW1pbHlfdAlubG1zdmNfZmFtaWx5ID0gQUZfSU5FVDsKKyNlbmRpZgkvKiAoQ09ORklHX0lQVjYgfHwgQ09ORklHX0lQVjZfTU9EVUxFKSAmJiBDT05GSUdfU1VOUlBDX1JFR0lTVEVSX1Y0ICovCisKKy8qCiAgKiBUaGVzZSBjYW4gYmUgc2V0IGF0IGluc21vZCB0aW1lICh1c2VmdWwgZm9yIE5GUyBhcyByb290IGZpbGVzeXN0ZW0pLAogICogYW5kIGFsc28gY2hhbmdlZCB0aHJvdWdoIHRoZSBzeXNjdGwgaW50ZXJmYWNlLiAgLS0gSmFtaWUgTG9raWVyLCBBdWcgMjAwMwogICovCiBzdGF0aWMgdW5zaWduZWQgbG9uZwkJbmxtX2dyYWNlX3BlcmlvZDsKIHN0YXRpYyB1bnNpZ25lZCBsb25nCQlubG1fdGltZW91dCA9IExPQ0tEX0RGTFRfVElNRU87CiBzdGF0aWMgaW50CQkJbmxtX3VkcHBvcnQsIG5sbV90Y3Bwb3J0OwotaW50CQkJCW5zbV91c2VfaG9zdG5hbWVzID0gMDsKKworLyogUkxJTV9OT0ZJTEUgZGVmYXVsdHMgdG8gMTAyNC4gVGhhdCBzZWVtcyBsaWtlIGEgcmVhc29uYWJsZSBkZWZhdWx0IGhlcmUuICovCitzdGF0aWMgdW5zaWduZWQgaW50CQlubG1fbWF4X2Nvbm5lY3Rpb25zID0gMTAyNDsKIAogLyoKICAqIENvbnN0YW50cyBuZWVkZWQgZm9yIHRoZSBzeXNjdGwgaW50ZXJmYWNlLgpAQCAtMTQzLDYgKzE1NSw5IEBACiAJCWxvbmcgdGltZW91dCA9IE1BWF9TQ0hFRFVMRV9USU1FT1VUOwogCQlSUENfSUZERUJVRyhjaGFyIGJ1ZltSUENfTUFYX0FERFJCVUZMRU5dKTsKIAorCQkvKiB1cGRhdGUgc3ZfbWF4Y29ubiBpZiBpdCBoYXMgY2hhbmdlZCAqLworCQlycXN0cC0+cnFfc2VydmVyLT5zdl9tYXhjb25uID0gbmxtX21heF9jb25uZWN0aW9uczsKKwogCQlpZiAoc2lnbmFsbGVkKCkpIHsKIAkJCWZsdXNoX3NpZ25hbHMoY3VycmVudCk7CiAJCQlpZiAobmxtc3ZjX29wcykgewpAQCAtMTg5LDYgKzIwNCwxOSBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IGNyZWF0ZV9sb2NrZF9saXN0ZW5lcihzdHJ1Y3Qgc3ZjX3NlcnYgKnNlcnYsIGNoYXIgKm5hbWUsCisJCQkJIHVuc2lnbmVkIHNob3J0IHBvcnQpCit7CisJc3RydWN0IHN2Y194cHJ0ICp4cHJ0OworCisJeHBydCA9IHN2Y19maW5kX3hwcnQoc2VydiwgbmFtZSwgMCwgMCk7CisJaWYgKHhwcnQgPT0gTlVMTCkKKwkJcmV0dXJuIHN2Y19jcmVhdGVfeHBydChzZXJ2LCBuYW1lLCBwb3J0LCBTVkNfU09DS19ERUZBVUxUUyk7CisKKwlzdmNfeHBydF9wdXQoeHBydCk7CisJcmV0dXJuIDA7Cit9CisKIC8qCiAgKiBFbnN1cmUgdGhlcmUgYXJlIGFjdGl2ZSBVRFAgYW5kIFRDUCBsaXN0ZW5lcnMgZm9yIGxvY2tkLgogICoKQEAgLTIwMiwyOSArMjMwLDIzIEBACiBzdGF0aWMgaW50IG1ha2Vfc29ja3Moc3RydWN0IHN2Y19zZXJ2ICpzZXJ2KQogewogCXN0YXRpYyBpbnQgd2FybmVkOwotCXN0cnVjdCBzdmNfeHBydCAqeHBydDsKLQlpbnQgZXJyID0gMDsKKwlpbnQgZXJyOwogCi0JeHBydCA9IHN2Y19maW5kX3hwcnQoc2VydiwgInVkcCIsIDAsIDApOwotCWlmICgheHBydCkKLQkJZXJyID0gc3ZjX2NyZWF0ZV94cHJ0KHNlcnYsICJ1ZHAiLCBubG1fdWRwcG9ydCwKLQkJCQkgICAgICBTVkNfU09DS19ERUZBVUxUUyk7Ci0JZWxzZQotCQlzdmNfeHBydF9wdXQoeHBydCk7Ci0JaWYgKGVyciA+PSAwKSB7Ci0JCXhwcnQgPSBzdmNfZmluZF94cHJ0KHNlcnYsICJ0Y3AiLCAwLCAwKTsKLQkJaWYgKCF4cHJ0KQotCQkJZXJyID0gc3ZjX2NyZWF0ZV94cHJ0KHNlcnYsICJ0Y3AiLCBubG1fdGNwcG9ydCwKLQkJCQkJICAgICAgU1ZDX1NPQ0tfREVGQVVMVFMpOwotCQllbHNlCi0JCQlzdmNfeHBydF9wdXQoeHBydCk7Ci0JfQotCWlmIChlcnIgPj0gMCkgewotCQl3YXJuZWQgPSAwOwotCQllcnIgPSAwOwotCX0gZWxzZSBpZiAod2FybmVkKysgPT0gMCkKKwllcnIgPSBjcmVhdGVfbG9ja2RfbGlzdGVuZXIoc2VydiwgInVkcCIsIG5sbV91ZHBwb3J0KTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBvdXRfZXJyOworCisJZXJyID0gY3JlYXRlX2xvY2tkX2xpc3RlbmVyKHNlcnYsICJ0Y3AiLCBubG1fdGNwcG9ydCk7CisJaWYgKGVyciA8IDApCisJCWdvdG8gb3V0X2VycjsKKworCXdhcm5lZCA9IDA7CisJcmV0dXJuIDA7CisKK291dF9lcnI6CisJaWYgKHdhcm5lZCsrID09IDApCiAJCXByaW50ayhLRVJOX1dBUk5JTkcKLQkJICAgICAgICJsb2NrZF91cDogbWFrZXNvY2sgZmFpbGVkLCBlcnJvcj0lZFxuIiwgZXJyKTsKKwkJCSJsb2NrZF91cDogbWFrZXNvY2sgZmFpbGVkLCBlcnJvcj0lZFxuIiwgZXJyKTsKIAlyZXR1cm4gZXJyOwogfQogCkBAIC0yNTIsNyArMjc0LDcgQEAKIAkJCSJsb2NrZF91cDogbm8gcGlkLCAlZCB1c2Vycz8/XG4iLCBubG1zdmNfdXNlcnMpOwogCiAJZXJyb3IgPSAtRU5PTUVNOwotCXNlcnYgPSBzdmNfY3JlYXRlKCZubG1zdmNfcHJvZ3JhbSwgTE9DS0RfQlVGU0laRSwgQUZfSU5FVCwgTlVMTCk7CisJc2VydiA9IHN2Y19jcmVhdGUoJm5sbXN2Y19wcm9ncmFtLCBMT0NLRF9CVUZTSVpFLCBubG1zdmNfZmFtaWx5LCBOVUxMKTsKIAlpZiAoIXNlcnYpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAibG9ja2RfdXA6IGNyZWF0ZSBzZXJ2aWNlIGZhaWxlZFxuIik7CiAJCWdvdG8gb3V0OwpAQCAtMjc2LDYgKzI5OCw3IEBACiAJfQogCiAJc3ZjX3NvY2tfdXBkYXRlX2J1ZnMoc2Vydik7CisJc2Vydi0+c3ZfbWF4Y29ubiA9IG5sbV9tYXhfY29ubmVjdGlvbnM7CiAKIAlubG1zdmNfdGFzayA9IGt0aHJlYWRfcnVuKGxvY2tkLCBubG1zdmNfcnFzdCwgc2Vydi0+c3ZfbmFtZSk7CiAJaWYgKElTX0VSUihubG1zdmNfdGFzaykpIHsKQEAgLTQ4NSw2ICs1MDgsNyBAQAogbW9kdWxlX3BhcmFtX2NhbGwobmxtX3RjcHBvcnQsIHBhcmFtX3NldF9wb3J0LCBwYXJhbV9nZXRfaW50LAogCQkgICZubG1fdGNwcG9ydCwgMDY0NCk7CiBtb2R1bGVfcGFyYW0obnNtX3VzZV9ob3N0bmFtZXMsIGJvb2wsIDA2NDQpOworbW9kdWxlX3BhcmFtKG5sbV9tYXhfY29ubmVjdGlvbnMsIHVpbnQsIDA2NDQpOwogCiAvKgogICogSW5pdGlhbGlzaW5nIGFuZCB0ZXJtaW5hdGluZyB0aGUgbW9kdWxlLgpkaWZmIC0tZ2l0IGEvZnMvbG9ja2Qvc3ZjNHByb2MuYyBiL2ZzL2xvY2tkL3N2YzRwcm9jLmMKaW5kZXggNGRmZGNiYy4uMTcyNTAzNzMgMTAwNjQ0Ci0tLSBhL2ZzL2xvY2tkL3N2YzRwcm9jLmMKKysrIGIvZnMvbG9ja2Qvc3ZjNHByb2MuYwpAQCAtMTYsOCArMTYsNiBAQAogI2luY2x1ZGUgPGxpbnV4L25mc2QvbmZzZC5oPgogI2luY2x1ZGUgPGxpbnV4L2xvY2tkL2xvY2tkLmg+CiAjaW5jbHVkZSA8bGludXgvbG9ja2Qvc2hhcmUuaD4KLSNpbmNsdWRlIDxsaW51eC9sb2NrZC9zbV9pbnRlci5oPgotCiAKICNkZWZpbmUgTkxNREJHX0ZBQ0lMSVRZCQlOTE1EQkdfQ0xJRU5UCiAKQEAgLTQxOSw4ICs0MTcsNiBAQAogbmxtNHN2Y19wcm9jX3NtX25vdGlmeShzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgbmxtX3JlYm9vdCAqYXJncCwKIAkJCQkJICAgICAgdm9pZAkgICAgICAgICpyZXNwKQogewotCXN0cnVjdCBzb2NrYWRkcl9pbglzYWRkcjsKLQogCWRwcmludGsoImxvY2tkOiBTTV9OT1RJRlkgICAgIGNhbGxlZFxuIik7CiAKIAlpZiAoIW5sbV9wcml2aWxlZ2VkX3JlcXVlc3RlcihycXN0cCkpIHsKQEAgLTQzMCwxNCArNDI2LDcgQEAKIAkJcmV0dXJuIHJwY19zeXN0ZW1fZXJyOwogCX0KIAotCS8qIE9idGFpbiB0aGUgaG9zdCBwb2ludGVyIGZvciB0aGlzIE5GUyBzZXJ2ZXIgYW5kIHRyeSB0bwotCSAqIHJlY2xhaW0gYWxsIGxvY2tzIHdlIGhvbGQgb24gdGhpcyBzZXJ2ZXIuCi0JICovCi0JbWVtc2V0KCZzYWRkciwgMCwgc2l6ZW9mKHNhZGRyKSk7Ci0Jc2FkZHIuc2luX2ZhbWlseSA9IEFGX0lORVQ7Ci0Jc2FkZHIuc2luX2FkZHIuc19hZGRyID0gYXJncC0+YWRkcjsKLQlubG1faG9zdF9yZWJvb3RlZCgmc2FkZHIsIGFyZ3AtPm1vbiwgYXJncC0+bGVuLCBhcmdwLT5zdGF0ZSk7Ci0KKwlubG1faG9zdF9yZWJvb3RlZChhcmdwKTsKIAlyZXR1cm4gcnBjX3N1Y2Nlc3M7CiB9CiAKZGlmZiAtLWdpdCBhL2ZzL2xvY2tkL3N2Y3Byb2MuYyBiL2ZzL2xvY2tkL3N2Y3Byb2MuYwppbmRleCAzY2E4OWUyLi4zNjg4ZTU1IDEwMDY0NAotLS0gYS9mcy9sb2NrZC9zdmNwcm9jLmMKKysrIGIvZnMvbG9ja2Qvc3ZjcHJvYy5jCkBAIC0xNiw4ICsxNiw2IEBACiAjaW5jbHVkZSA8bGludXgvbmZzZC9uZnNkLmg+CiAjaW5jbHVkZSA8bGludXgvbG9ja2QvbG9ja2QuaD4KICNpbmNsdWRlIDxsaW51eC9sb2NrZC9zaGFyZS5oPgotI2luY2x1ZGUgPGxpbnV4L2xvY2tkL3NtX2ludGVyLmg+Ci0KIAogI2RlZmluZSBOTE1EQkdfRkFDSUxJVFkJCU5MTURCR19DTElFTlQKIApAQCAtNDUxLDggKzQ0OSw2IEBACiBubG1zdmNfcHJvY19zbV9ub3RpZnkoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IG5sbV9yZWJvb3QgKmFyZ3AsCiAJCQkJCSAgICAgIHZvaWQJICAgICAgICAqcmVzcCkKIHsKLQlzdHJ1Y3Qgc29ja2FkZHJfaW4Jc2FkZHI7Ci0KIAlkcHJpbnRrKCJsb2NrZDogU01fTk9USUZZICAgICBjYWxsZWRcbiIpOwogCiAJaWYgKCFubG1fcHJpdmlsZWdlZF9yZXF1ZXN0ZXIocnFzdHApKSB7CkBAIC00NjIsMTQgKzQ1OCw3IEBACiAJCXJldHVybiBycGNfc3lzdGVtX2VycjsKIAl9CiAKLQkvKiBPYnRhaW4gdGhlIGhvc3QgcG9pbnRlciBmb3IgdGhpcyBORlMgc2VydmVyIGFuZCB0cnkgdG8KLQkgKiByZWNsYWltIGFsbCBsb2NrcyB3ZSBob2xkIG9uIHRoaXMgc2VydmVyLgotCSAqLwotCW1lbXNldCgmc2FkZHIsIDAsIHNpemVvZihzYWRkcikpOwotCXNhZGRyLnNpbl9mYW1pbHkgPSBBRl9JTkVUOwotCXNhZGRyLnNpbl9hZGRyLnNfYWRkciA9IGFyZ3AtPmFkZHI7Ci0JbmxtX2hvc3RfcmVib290ZWQoJnNhZGRyLCBhcmdwLT5tb24sIGFyZ3AtPmxlbiwgYXJncC0+c3RhdGUpOwotCisJbmxtX2hvc3RfcmVib290ZWQoYXJncCk7CiAJcmV0dXJuIHJwY19zdWNjZXNzOwogfQogCmRpZmYgLS1naXQgYS9mcy9sb2NrZC9zdmNzdWJzLmMgYi9mcy9sb2NrZC9zdmNzdWJzLmMKaW5kZXggMzRjMjc2Ni4uOWU0ZDZhYWIgMTAwNjQ0Ci0tLSBhL2ZzL2xvY2tkL3N2Y3N1YnMuYworKysgYi9mcy9sb2NrZC9zdmNzdWJzLmMKQEAgLTE3LDcgKzE3LDYgQEAKICNpbmNsdWRlIDxsaW51eC9uZnNkL2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2xvY2tkL2xvY2tkLmg+CiAjaW5jbHVkZSA8bGludXgvbG9ja2Qvc2hhcmUuaD4KLSNpbmNsdWRlIDxsaW51eC9sb2NrZC9zbV9pbnRlci5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L21vdW50Lmg+CiAKZGlmZiAtLWdpdCBhL2ZzL2xvY2tkL3hkci5jIGIvZnMvbG9ja2QveGRyLmMKaW5kZXggMWYyMjYyOS4uMDMzNmYyYiAxMDA2NDQKLS0tIGEvZnMvbG9ja2QveGRyLmMKKysrIGIvZnMvbG9ja2QveGRyLmMKQEAgLTE2LDcgKzE2LDYgQEAKICNpbmNsdWRlIDxsaW51eC9zdW5ycGMvc3ZjLmg+CiAjaW5jbHVkZSA8bGludXgvc3VucnBjL3N0YXRzLmg+CiAjaW5jbHVkZSA8bGludXgvbG9ja2QvbG9ja2QuaD4KLSNpbmNsdWRlIDxsaW51eC9sb2NrZC9zbV9pbnRlci5oPgogCiAjZGVmaW5lIE5MTURCR19GQUNJTElUWQkJTkxNREJHX1hEUgogCkBAIC0zNDksOCArMzQ4LDggQEAKIAlpZiAoIShwID0geGRyX2RlY29kZV9zdHJpbmdfaW5wbGFjZShwLCAmYXJncC0+bW9uLCAmYXJncC0+bGVuLCBTTV9NQVhTVFJMRU4pKSkKIAkJcmV0dXJuIDA7CiAJYXJncC0+c3RhdGUgPSBudG9obCgqcCsrKTsKLQkvKiBQcmVzZXJ2ZSB0aGUgYWRkcmVzcyBpbiBuZXR3b3JrIGJ5dGUgb3JkZXIgKi8KLQlhcmdwLT5hZGRyID0gKnArKzsKKwltZW1jcHkoJmFyZ3AtPnByaXYuZGF0YSwgcCwgc2l6ZW9mKGFyZ3AtPnByaXYuZGF0YSkpOworCXAgKz0gWERSX1FVQURMRU4oU01fUFJJVl9TSVpFKTsKIAlyZXR1cm4geGRyX2FyZ3NpemVfY2hlY2socnFzdHAsIHApOwogfQogCmRpZmYgLS1naXQgYS9mcy9sb2NrZC94ZHI0LmMgYi9mcy9sb2NrZC94ZHI0LmMKaW5kZXggNTBjNDkzYS4uZTFkNTI4NiAxMDA2NDQKLS0tIGEvZnMvbG9ja2QveGRyNC5jCisrKyBiL2ZzL2xvY2tkL3hkcjQuYwpAQCAtMTcsNyArMTcsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9zdmMuaD4KICNpbmNsdWRlIDxsaW51eC9zdW5ycGMvc3RhdHMuaD4KICNpbmNsdWRlIDxsaW51eC9sb2NrZC9sb2NrZC5oPgotI2luY2x1ZGUgPGxpbnV4L2xvY2tkL3NtX2ludGVyLmg+CiAKICNkZWZpbmUgTkxNREJHX0ZBQ0lMSVRZCQlOTE1EQkdfWERSCiAKQEAgLTM1Niw4ICszNTUsOCBAQAogCWlmICghKHAgPSB4ZHJfZGVjb2RlX3N0cmluZ19pbnBsYWNlKHAsICZhcmdwLT5tb24sICZhcmdwLT5sZW4sIFNNX01BWFNUUkxFTikpKQogCQlyZXR1cm4gMDsKIAlhcmdwLT5zdGF0ZSA9IG50b2hsKCpwKyspOwotCS8qIFByZXNlcnZlIHRoZSBhZGRyZXNzIGluIG5ldHdvcmsgYnl0ZSBvcmRlciAqLwotCWFyZ3AtPmFkZHIgID0gKnArKzsKKwltZW1jcHkoJmFyZ3AtPnByaXYuZGF0YSwgcCwgc2l6ZW9mKGFyZ3AtPnByaXYuZGF0YSkpOworCXAgKz0gWERSX1FVQURMRU4oU01fUFJJVl9TSVpFKTsKIAlyZXR1cm4geGRyX2FyZ3NpemVfY2hlY2socnFzdHAsIHApOwogfQogCmRpZmYgLS1naXQgYS9mcy9sb2Nrcy5jIGIvZnMvbG9ja3MuYwppbmRleCA0NmEyZTEyLi5lYzNkZWVhIDEwMDY0NAotLS0gYS9mcy9sb2Nrcy5jCisrKyBiL2ZzL2xvY2tzLmMKQEAgLTE1NjQsNyArMTU2NCw3IEBACiAgKgklTE9DS19NQU5EIGNhbiBiZSBjb21iaW5lZCB3aXRoICVMT0NLX1JFQUQgb3IgJUxPQ0tfV1JJVEUgdG8gYWxsb3cgb3RoZXIKICAqCXByb2Nlc3NlcyByZWFkIGFuZCB3cml0ZSBhY2Nlc3MgcmVzcGVjdGl2ZWx5LgogICovCi1hc21saW5rYWdlIGxvbmcgc3lzX2Zsb2NrKHVuc2lnbmVkIGludCBmZCwgdW5zaWduZWQgaW50IGNtZCkKK1NZU0NBTExfREVGSU5FMihmbG9jaywgdW5zaWduZWQgaW50LCBmZCwgdW5zaWduZWQgaW50LCBjbWQpCiB7CiAJc3RydWN0IGZpbGUgKmZpbHA7CiAJc3RydWN0IGZpbGVfbG9jayAqbG9jazsKZGlmZiAtLWdpdCBhL2ZzL25hbWVpLmMgYi9mcy9uYW1laS5jCmluZGV4IGYwNWJlZDIuLmJiYzE1YzIgMTAwNjQ0Ci0tLSBhL2ZzL25hbWVpLmMKKysrIGIvZnMvbmFtZWkuYwpAQCAtMTk2Miw4ICsxOTYyLDggQEAKIAl9CiB9CiAKLWFzbWxpbmthZ2UgbG9uZyBzeXNfbWtub2RhdChpbnQgZGZkLCBjb25zdCBjaGFyIF9fdXNlciAqZmlsZW5hbWUsIGludCBtb2RlLAotCQkJCXVuc2lnbmVkIGRldikKK1NZU0NBTExfREVGSU5FNChta25vZGF0LCBpbnQsIGRmZCwgY29uc3QgY2hhciBfX3VzZXIgKiwgZmlsZW5hbWUsIGludCwgbW9kZSwKKwkJdW5zaWduZWQsIGRldikKIHsKIAlpbnQgZXJyb3I7CiAJY2hhciAqdG1wOwpAQCAtMjAxNyw3ICsyMDE3LDcgQEAKIAlyZXR1cm4gZXJyb3I7CiB9CiAKLWFzbWxpbmthZ2UgbG9uZyBzeXNfbWtub2QoY29uc3QgY2hhciBfX3VzZXIgKmZpbGVuYW1lLCBpbnQgbW9kZSwgdW5zaWduZWQgZGV2KQorU1lTQ0FMTF9ERUZJTkUzKG1rbm9kLCBjb25zdCBjaGFyIF9fdXNlciAqLCBmaWxlbmFtZSwgaW50LCBtb2RlLCB1bnNpZ25lZCwgZGV2KQogewogCXJldHVybiBzeXNfbWtub2RhdChBVF9GRENXRCwgZmlsZW5hbWUsIG1vZGUsIGRldik7CiB9CkBAIC0yMDQ0LDcgKzIwNDQsNyBAQAogCXJldHVybiBlcnJvcjsKIH0KIAotYXNtbGlua2FnZSBsb25nIHN5c19ta2RpcmF0KGludCBkZmQsIGNvbnN0IGNoYXIgX191c2VyICpwYXRobmFtZSwgaW50IG1vZGUpCitTWVNDQUxMX0RFRklORTMobWtkaXJhdCwgaW50LCBkZmQsIGNvbnN0IGNoYXIgX191c2VyICosIHBhdGhuYW1lLCBpbnQsIG1vZGUpCiB7CiAJaW50IGVycm9yID0gMDsKIAljaGFyICogdG1wOwpAQCAtMjA4MSw3ICsyMDgxLDcgQEAKIAlyZXR1cm4gZXJyb3I7CiB9CiAKLWFzbWxpbmthZ2UgbG9uZyBzeXNfbWtkaXIoY29uc3QgY2hhciBfX3VzZXIgKnBhdGhuYW1lLCBpbnQgbW9kZSkKK1NZU0NBTExfREVGSU5FMihta2RpciwgY29uc3QgY2hhciBfX3VzZXIgKiwgcGF0aG5hbWUsIGludCwgbW9kZSkKIHsKIAlyZXR1cm4gc3lzX21rZGlyYXQoQVRfRkRDV0QsIHBhdGhuYW1lLCBtb2RlKTsKIH0KQEAgLTIxOTUsNyArMjE5NSw3IEBACiAJcmV0dXJuIGVycm9yOwogfQogCi1hc21saW5rYWdlIGxvbmcgc3lzX3JtZGlyKGNvbnN0IGNoYXIgX191c2VyICpwYXRobmFtZSkKK1NZU0NBTExfREVGSU5FMShybWRpciwgY29uc3QgY2hhciBfX3VzZXIgKiwgcGF0aG5hbWUpCiB7CiAJcmV0dXJuIGRvX3JtZGlyKEFUX0ZEQ1dELCBwYXRobmFtZSk7CiB9CkBAIC0yMjkxLDcgKzIyOTEsNyBAQAogCWdvdG8gZXhpdDI7CiB9CiAKLWFzbWxpbmthZ2UgbG9uZyBzeXNfdW5saW5rYXQoaW50IGRmZCwgY29uc3QgY2hhciBfX3VzZXIgKnBhdGhuYW1lLCBpbnQgZmxhZykKK1NZU0NBTExfREVGSU5FMyh1bmxpbmthdCwgaW50LCBkZmQsIGNvbnN0IGNoYXIgX191c2VyICosIHBhdGhuYW1lLCBpbnQsIGZsYWcpCiB7CiAJaWYgKChmbGFnICYgfkFUX1JFTU9WRURJUikgIT0gMCkKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0yMzAyLDcgKzIzMDIsNyBAQAogCXJldHVybiBkb191bmxpbmthdChkZmQsIHBhdGhuYW1lKTsKIH0KIAotYXNtbGlua2FnZSBsb25nIHN5c191bmxpbmsoY29uc3QgY2hhciBfX3VzZXIgKnBhdGhuYW1lKQorU1lTQ0FMTF9ERUZJTkUxKHVubGluaywgY29uc3QgY2hhciBfX3VzZXIgKiwgcGF0aG5hbWUpCiB7CiAJcmV0dXJuIGRvX3VubGlua2F0KEFUX0ZEQ1dELCBwYXRobmFtZSk7CiB9CkBAIC0yMzI4LDggKzIzMjgsOCBAQAogCXJldHVybiBlcnJvcjsKIH0KIAotYXNtbGlua2FnZSBsb25nIHN5c19zeW1saW5rYXQoY29uc3QgY2hhciBfX3VzZXIgKm9sZG5hbWUsCi0JCQkgICAgICBpbnQgbmV3ZGZkLCBjb25zdCBjaGFyIF9fdXNlciAqbmV3bmFtZSkKK1NZU0NBTExfREVGSU5FMyhzeW1saW5rYXQsIGNvbnN0IGNoYXIgX191c2VyICosIG9sZG5hbWUsCisJCWludCwgbmV3ZGZkLCBjb25zdCBjaGFyIF9fdXNlciAqLCBuZXduYW1lKQogewogCWludCBlcnJvcjsKIAljaGFyICpmcm9tOwpAQCAtMjM3MCw3ICsyMzcwLDcgQEAKIAlyZXR1cm4gZXJyb3I7CiB9CiAKLWFzbWxpbmthZ2UgbG9uZyBzeXNfc3ltbGluayhjb25zdCBjaGFyIF9fdXNlciAqb2xkbmFtZSwgY29uc3QgY2hhciBfX3VzZXIgKm5ld25hbWUpCitTWVNDQUxMX0RFRklORTIoc3ltbGluaywgY29uc3QgY2hhciBfX3VzZXIgKiwgb2xkbmFtZSwgY29uc3QgY2hhciBfX3VzZXIgKiwgbmV3bmFtZSkKIHsKIAlyZXR1cm4gc3lzX3N5bWxpbmthdChvbGRuYW1lLCBBVF9GRENXRCwgbmV3bmFtZSk7CiB9CkBAIC0yNDIyLDkgKzI0MjIsOCBAQAogICogd2l0aCBsaW51eCAyLjAsIGFuZCB0byBhdm9pZCBoYXJkLWxpbmtpbmcgdG8gZGlyZWN0b3JpZXMKICAqIGFuZCBvdGhlciBzcGVjaWFsIGZpbGVzLiAgLS1BRE0KICAqLwotYXNtbGlua2FnZSBsb25nIHN5c19saW5rYXQoaW50IG9sZGRmZCwgY29uc3QgY2hhciBfX3VzZXIgKm9sZG5hbWUsCi0JCQkgICBpbnQgbmV3ZGZkLCBjb25zdCBjaGFyIF9fdXNlciAqbmV3bmFtZSwKLQkJCSAgIGludCBmbGFncykKK1NZU0NBTExfREVGSU5FNShsaW5rYXQsIGludCwgb2xkZGZkLCBjb25zdCBjaGFyIF9fdXNlciAqLCBvbGRuYW1lLAorCQlpbnQsIG5ld2RmZCwgY29uc3QgY2hhciBfX3VzZXIgKiwgbmV3bmFtZSwgaW50LCBmbGFncykKIHsKIAlzdHJ1Y3QgZGVudHJ5ICpuZXdfZGVudHJ5OwogCXN0cnVjdCBuYW1laWRhdGEgbmQ7CkBAIC0yNDczLDcgKzI0NzIsNyBAQAogCXJldHVybiBlcnJvcjsKIH0KIAotYXNtbGlua2FnZSBsb25nIHN5c19saW5rKGNvbnN0IGNoYXIgX191c2VyICpvbGRuYW1lLCBjb25zdCBjaGFyIF9fdXNlciAqbmV3bmFtZSkKK1NZU0NBTExfREVGSU5FMihsaW5rLCBjb25zdCBjaGFyIF9fdXNlciAqLCBvbGRuYW1lLCBjb25zdCBjaGFyIF9fdXNlciAqLCBuZXduYW1lKQogewogCXJldHVybiBzeXNfbGlua2F0KEFUX0ZEQ1dELCBvbGRuYW1lLCBBVF9GRENXRCwgbmV3bmFtZSwgMCk7CiB9CkBAIC0yNjI0LDggKzI2MjMsOCBAQAogCXJldHVybiBlcnJvcjsKIH0KIAotYXNtbGlua2FnZSBsb25nIHN5c19yZW5hbWVhdChpbnQgb2xkZGZkLCBjb25zdCBjaGFyIF9fdXNlciAqb2xkbmFtZSwKLQkJCSAgICAgaW50IG5ld2RmZCwgY29uc3QgY2hhciBfX3VzZXIgKm5ld25hbWUpCitTWVNDQUxMX0RFRklORTQocmVuYW1lYXQsIGludCwgb2xkZGZkLCBjb25zdCBjaGFyIF9fdXNlciAqLCBvbGRuYW1lLAorCQlpbnQsIG5ld2RmZCwgY29uc3QgY2hhciBfX3VzZXIgKiwgbmV3bmFtZSkKIHsKIAlzdHJ1Y3QgZGVudHJ5ICpvbGRfZGlyLCAqbmV3X2RpcjsKIAlzdHJ1Y3QgZGVudHJ5ICpvbGRfZGVudHJ5LCAqbmV3X2RlbnRyeTsKQEAgLTI3MTgsNyArMjcxNyw3IEBACiAJcmV0dXJuIGVycm9yOwogfQogCi1hc21saW5rYWdlIGxvbmcgc3lzX3JlbmFtZShjb25zdCBjaGFyIF9fdXNlciAqb2xkbmFtZSwgY29uc3QgY2hhciBfX3VzZXIgKm5ld25hbWUpCitTWVNDQUxMX0RFRklORTIocmVuYW1lLCBjb25zdCBjaGFyIF9fdXNlciAqLCBvbGRuYW1lLCBjb25zdCBjaGFyIF9fdXNlciAqLCBuZXduYW1lKQogewogCXJldHVybiBzeXNfcmVuYW1lYXQoQVRfRkRDV0QsIG9sZG5hbWUsIEFUX0ZEQ1dELCBuZXduYW1lKTsKIH0KZGlmZiAtLWdpdCBhL2ZzL25hbWVzcGFjZS5jIGIvZnMvbmFtZXNwYWNlLmMKaW5kZXggYTQwNjg1ZC4uMjI4ZDhjNCAxMDA2NDQKLS0tIGEvZnMvbmFtZXNwYWNlLmMKKysrIGIvZnMvbmFtZXNwYWNlLmMKQEAgLTExMjgsNyArMTEyOCw3IEBACiAgKiB1bml4ZXMuIE91ciBBUEkgaXMgaWRlbnRpY2FsIHRvIE9TRi8xIHRvIGF2b2lkIG1ha2luZyBhIG1lc3Mgb2YgQU1ECiAgKi8KIAotYXNtbGlua2FnZSBsb25nIHN5c191bW91bnQoY2hhciBfX3VzZXIgKiBuYW1lLCBpbnQgZmxhZ3MpCitTWVNDQUxMX0RFRklORTIodW1vdW50LCBjaGFyIF9fdXNlciAqLCBuYW1lLCBpbnQsIGZsYWdzKQogewogCXN0cnVjdCBwYXRoIHBhdGg7CiAJaW50IHJldHZhbDsKQEAgLTExNjAsNyArMTE2MCw3IEBACiAvKgogICoJVGhlIDIuMCBjb21wYXRpYmxlIHVtb3VudC4gTm8gZmxhZ3MuCiAgKi8KLWFzbWxpbmthZ2UgbG9uZyBzeXNfb2xkdW1vdW50KGNoYXIgX191c2VyICogbmFtZSkKK1NZU0NBTExfREVGSU5FMShvbGR1bW91bnQsIGNoYXIgX191c2VyICosIG5hbWUpCiB7CiAJcmV0dXJuIHN5c191bW91bnQobmFtZSwgMCk7CiB9CkBAIC0yMDQ1LDkgKzIwNDUsOCBAQAogCXJldHVybiBuZXdfbnM7CiB9CiAKLWFzbWxpbmthZ2UgbG9uZyBzeXNfbW91bnQoY2hhciBfX3VzZXIgKiBkZXZfbmFtZSwgY2hhciBfX3VzZXIgKiBkaXJfbmFtZSwKLQkJCSAgY2hhciBfX3VzZXIgKiB0eXBlLCB1bnNpZ25lZCBsb25nIGZsYWdzLAotCQkJICB2b2lkIF9fdXNlciAqIGRhdGEpCitTWVNDQUxMX0RFRklORTUobW91bnQsIGNoYXIgX191c2VyICosIGRldl9uYW1lLCBjaGFyIF9fdXNlciAqLCBkaXJfbmFtZSwKKwkJY2hhciBfX3VzZXIgKiwgdHlwZSwgdW5zaWduZWQgbG9uZywgZmxhZ3MsIHZvaWQgX191c2VyICosIGRhdGEpCiB7CiAJaW50IHJldHZhbDsKIAl1bnNpZ25lZCBsb25nIGRhdGFfcGFnZTsKQEAgLTIxNzIsOCArMjE3MSw4IEBACiAgKiAgICB0aG91Z2gsIHNvIHlvdSBtYXkgbmVlZCB0byBzYXkgbW91bnQgLS1iaW5kIC9uZnMvbXlfcm9vdCAvbmZzL215X3Jvb3QKICAqICAgIGZpcnN0LgogICovCi1hc21saW5rYWdlIGxvbmcgc3lzX3Bpdm90X3Jvb3QoY29uc3QgY2hhciBfX3VzZXIgKiBuZXdfcm9vdCwKLQkJCSAgICAgICBjb25zdCBjaGFyIF9fdXNlciAqIHB1dF9vbGQpCitTWVNDQUxMX0RFRklORTIocGl2b3Rfcm9vdCwgY29uc3QgY2hhciBfX3VzZXIgKiwgbmV3X3Jvb3QsCisJCWNvbnN0IGNoYXIgX191c2VyICosIHB1dF9vbGQpCiB7CiAJc3RydWN0IHZmc21vdW50ICp0bXA7CiAJc3RydWN0IHBhdGggbmV3LCBvbGQsIHBhcmVudF9wYXRoLCByb290X3BhcmVudCwgcm9vdDsKZGlmZiAtLWdpdCBhL2ZzL25jcGZzL2lvY3RsLmMgYi9mcy9uY3Bmcy9pb2N0bC5jCmluZGV4IDZkMDRlMDUuLmY1NDM2MGYgMTAwNjQ0Ci0tLSBhL2ZzL25jcGZzL2lvY3RsLmMKKysrIGIvZnMvbmNwZnMvaW9jdGwuYwpAQCAtOTgsNyArOTgsNyBAQAogewogCXMzMgkJYXV0aF90eXBlOwogCXUzMgkJb2JqZWN0X25hbWVfbGVuOwotCWNvbXBhdF9jYWRkcl90CW9iamVjdF9uYW1lOwkvKiBhbiB1c2Vyc3BhY2UgZGF0YSwgaW4gbW9zdCBjYXNlcyB1c2VyIG5hbWUgKi8KKwljb21wYXRfY2FkZHJfdAlvYmplY3RfbmFtZTsJLyogYSB1c2Vyc3BhY2UgZGF0YSwgaW4gbW9zdCBjYXNlcyB1c2VyIG5hbWUgKi8KIH07CiAKIHN0cnVjdCBjb21wYXRfbmNwX2ZzX2luZm9fdjIgewpkaWZmIC0tZ2l0IGEvZnMvbmZzY3RsLmMgYi9mcy9uZnNjdGwuYwppbmRleCBiMjc0NTE5Li44ZjlhMjA1IDEwMDY0NAotLS0gYS9mcy9uZnNjdGwuYworKysgYi9mcy9uZnNjdGwuYwpAQCAtODYsOCArODYsOCBAQAogCX0sCiB9OwogCi1sb25nCi1hc21saW5rYWdlIHN5c19uZnNzZXJ2Y3RsKGludCBjbWQsIHN0cnVjdCBuZnNjdGxfYXJnIF9fdXNlciAqYXJnLCB2b2lkIF9fdXNlciAqcmVzKQorU1lTQ0FMTF9ERUZJTkUzKG5mc3NlcnZjdGwsIGludCwgY21kLCBzdHJ1Y3QgbmZzY3RsX2FyZyBfX3VzZXIgKiwgYXJnLAorCQl2b2lkIF9fdXNlciAqLCByZXMpCiB7CiAJc3RydWN0IGZpbGUgKmZpbGU7CiAJdm9pZCBfX3VzZXIgKnAgPSAmYXJnLT51OwpkaWZmIC0tZ2l0IGEvZnMvbmZzZC9hdXRoLmMgYi9mcy9uZnNkL2F1dGguYwppbmRleCAwMTg0ZmU5Li5jOTAzZTA0IDEwMDY0NAotLS0gYS9mcy9uZnNkL2F1dGguYworKysgYi9mcy9uZnNkL2F1dGguYwpAQCAtNzYsMTAgKzc2LDEwIEBACiAKIAlyZXQgPSBzZXRfZ3JvdXBzKG5ldywgZ2kpOwogCXB1dF9ncm91cF9pbmZvKGdpKTsKLQlpZiAoIXJldCkKKwlpZiAocmV0IDwgMCkKIAkJZ290byBlcnJvcjsKIAotCWlmIChuZXctPnVpZCkKKwlpZiAobmV3LT5mc3VpZCkKIAkJbmV3LT5jYXBfZWZmZWN0aXZlID0gY2FwX2Ryb3BfbmZzZF9zZXQobmV3LT5jYXBfZWZmZWN0aXZlKTsKIAllbHNlCiAJCW5ldy0+Y2FwX2VmZmVjdGl2ZSA9IGNhcF9yYWlzZV9uZnNkX3NldChuZXctPmNhcF9lZmZlY3RpdmUsCmRpZmYgLS1naXQgYS9mcy9uZnNkL25mczRjYWxsYmFjay5jIGIvZnMvbmZzZC9uZnM0Y2FsbGJhY2suYwppbmRleCA2ZDdkOGMwLi5jNDY0MTgxIDEwMDY0NAotLS0gYS9mcy9uZnNkL25mczRjYWxsYmFjay5jCisrKyBiL2ZzL25mc2QvbmZzNGNhbGxiYWNrLmMKQEAgLTUzLDkgKzUzLDYgQEAKICNkZWZpbmUgTkZTUFJPQzRfQ0JfTlVMTCAwCiAjZGVmaW5lIE5GU1BST0M0X0NCX0NPTVBPVU5EIDEKIAotLyogZGVjbGFyYXRpb25zICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IHJwY19jYWxsX29wcyBuZnM0X2NiX251bGxfb3BzOwotCiAvKiBJbmRleCBvZiBwcmVkZWZpbmVkIExpbnV4IGNhbGxiYWNrIGNsaWVudCBvcGVyYXRpb25zICovCiAKIGVudW0gewpkaWZmIC0tZ2l0IGEvZnMvbmZzZC9uZnM0cHJvYy5jIGIvZnMvbmZzZC9uZnM0cHJvYy5jCmluZGV4IDY2OTQ2MWUuLjlmYTYwYTMgMTAwNjQ0Ci0tLSBhL2ZzL25mc2QvbmZzNHByb2MuYworKysgYi9mcy9uZnNkL25mczRwcm9jLmMKQEAgLTk0Niw2ICs5NDYsMTEgQEAKIAkJCW5mc2Q0X2VuY29kZV9vcGVyYXRpb24ocmVzcCwgb3ApOwogCQkJc3RhdHVzID0gb3AtPnN0YXR1czsKIAkJfQorCisJCWRwcmludGsoIm5mc3Y0IGNvbXBvdW5kIG9wICVwIG9wY250ICVkICMlZDogJWQ6IHN0YXR1cyAlZFxuIiwKKwkJCWFyZ3MtPm9wcywgYXJncy0+b3BjbnQsIHJlc3AtPm9wY250LCBvcC0+b3BudW0sCisJCQliZTMyX3RvX2NwdShzdGF0dXMpKTsKKwogCQlpZiAoY3N0YXRlLT5yZXBsYXlfb3duZXIpIHsKIAkJCW5mczRfcHV0X3N0YXRlb3duZXIoY3N0YXRlLT5yZXBsYXlfb3duZXIpOwogCQkJY3N0YXRlLT5yZXBsYXlfb3duZXIgPSBOVUxMOwpkaWZmIC0tZ2l0IGEvZnMvbmZzZC9uZnM0cmVjb3Zlci5jIGIvZnMvbmZzZC9uZnM0cmVjb3Zlci5jCmluZGV4IDBmOWQ2ZWYuLjc0ZjdiNjcgMTAwNjQ0Ci0tLSBhL2ZzL25mc2QvbmZzNHJlY292ZXIuYworKysgYi9mcy9uZnNkL25mczRyZWNvdmVyLmMKQEAgLTExNiw5ICsxMTYsOSBAQAogCiAJbWQ1X3RvX2hleChkbmFtZSwgY2tzdW0uZGF0YSk7CiAKLQlrZnJlZShja3N1bS5kYXRhKTsKIAlzdGF0dXMgPSBuZnNfb2s7CiBvdXQ6CisJa2ZyZWUoY2tzdW0uZGF0YSk7CiAJY3J5cHRvX2ZyZWVfaGFzaChkZXNjLnRmbSk7CiBvdXRfbm9fdGZtOgogCXJldHVybiBzdGF0dXM7CmRpZmYgLS1naXQgYS9mcy9uZnNkL25mczRzdGF0ZS5jIGIvZnMvbmZzZC9uZnM0c3RhdGUuYwppbmRleCAxM2UwZTA3Li44OGRiN2QzIDEwMDY0NAotLS0gYS9mcy9uZnNkL25mczRzdGF0ZS5jCisrKyBiL2ZzL25mc2QvbmZzNHN0YXRlLmMKQEAgLTI0MTYsNiArMjQxNiwyNiBAQAogI2RlZmluZSBMT0NLX0hBU0hfU0laRSAgICAgICAgICAgICAoMSA8PCBMT0NLX0hBU0hfQklUUykKICNkZWZpbmUgTE9DS19IQVNIX01BU0sgICAgICAgICAgICAgKExPQ0tfSEFTSF9TSVpFIC0gMSkKIAorc3RhdGljIGlubGluZSB1NjQKK2VuZF9vZmZzZXQodTY0IHN0YXJ0LCB1NjQgbGVuKQoreworCXU2NCBlbmQ7CisKKwllbmQgPSBzdGFydCArIGxlbjsKKwlyZXR1cm4gZW5kID49IHN0YXJ0ID8gZW5kOiBORlM0X01BWF9VSU5UNjQ7Cit9CisKKy8qIGxhc3Qgb2N0ZXQgaW4gYSByYW5nZSAqLworc3RhdGljIGlubGluZSB1NjQKK2xhc3RfYnl0ZV9vZmZzZXQodTY0IHN0YXJ0LCB1NjQgbGVuKQoreworCXU2NCBlbmQ7CisKKwlCVUdfT04oIWxlbik7CisJZW5kID0gc3RhcnQgKyBsZW47CisJcmV0dXJuIGVuZCA+IHN0YXJ0ID8gZW5kIC0gMTogTkZTNF9NQVhfVUlOVDY0OworfQorCiAjZGVmaW5lIGxvY2tvd25lcmlkX2hhc2h2YWwoaWQpIFwKICAgICAgICAgKChpZCkgJiBMT0NLX0hBU0hfTUFTSykKIApAQCAtMjQzNSwxMyArMjQ1NSwxMyBAQAogc3RhdGljIHN0cnVjdCBuZnM0X3N0YXRlaWQgKgogZmluZF9zdGF0ZWlkKHN0YXRlaWRfdCAqc3RpZCwgaW50IGZsYWdzKQogewotCXN0cnVjdCBuZnM0X3N0YXRlaWQgKmxvY2FsID0gTlVMTDsKKwlzdHJ1Y3QgbmZzNF9zdGF0ZWlkICpsb2NhbDsKIAl1MzIgc3RfaWQgPSBzdGlkLT5zaV9zdGF0ZW93bmVyaWQ7CiAJdTMyIGZfaWQgPSBzdGlkLT5zaV9maWxlaWQ7CiAJdW5zaWduZWQgaW50IGhhc2h2YWw7CiAKIAlkcHJpbnRrKCJORlNEOiBmaW5kX3N0YXRlaWQgZmxhZ3MgMHgleFxuIixmbGFncyk7Ci0JaWYgKChmbGFncyAmIExPQ0tfU1RBVEUpIHx8IChmbGFncyAmIFJEX1NUQVRFKSB8fCAoZmxhZ3MgJiBXUl9TVEFURSkpIHsKKwlpZiAoZmxhZ3MgJiAoTE9DS19TVEFURSB8IFJEX1NUQVRFIHwgV1JfU1RBVEUpKSB7CiAJCWhhc2h2YWwgPSBzdGF0ZWlkX2hhc2h2YWwoc3RfaWQsIGZfaWQpOwogCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGxvY2FsLCAmbG9ja3N0YXRlaWRfaGFzaHRibFtoYXNodmFsXSwgc3RfaGFzaCkgewogCQkJaWYgKChsb2NhbC0+c3Rfc3RhdGVpZC5zaV9zdGF0ZW93bmVyaWQgPT0gc3RfaWQpICYmCkBAIC0yNDQ5LDcgKzI0NjksOCBAQAogCQkJCXJldHVybiBsb2NhbDsKIAkJfQogCX0gCi0JaWYgKChmbGFncyAmIE9QRU5fU1RBVEUpIHx8IChmbGFncyAmIFJEX1NUQVRFKSB8fCAoZmxhZ3MgJiBXUl9TVEFURSkpIHsKKworCWlmIChmbGFncyAmIChPUEVOX1NUQVRFIHwgUkRfU1RBVEUgfCBXUl9TVEFURSkpIHsKIAkJaGFzaHZhbCA9IHN0YXRlaWRfaGFzaHZhbChzdF9pZCwgZl9pZCk7CiAJCWxpc3RfZm9yX2VhY2hfZW50cnkobG9jYWwsICZzdGF0ZWlkX2hhc2h0YmxbaGFzaHZhbF0sIHN0X2hhc2gpIHsKIAkJCWlmICgobG9jYWwtPnN0X3N0YXRlaWQuc2lfc3RhdGVvd25lcmlkID09IHN0X2lkKSAmJgpAQCAtMjUxOCw4ICsyNTM5LDggQEAKIAkJZGVueS0+bGRfY2xpZW50aWQuY2xfaWQgPSAwOwogCX0KIAlkZW55LT5sZF9zdGFydCA9IGZsLT5mbF9zdGFydDsKLQlkZW55LT5sZF9sZW5ndGggPSB+KHU2NCkwOwotCWlmIChmbC0+ZmxfZW5kICE9IH4odTY0KTApCisJZGVueS0+bGRfbGVuZ3RoID0gTkZTNF9NQVhfVUlOVDY0OworCWlmIChmbC0+ZmxfZW5kICE9IE5GUzRfTUFYX1VJTlQ2NCkKIAkJZGVueS0+bGRfbGVuZ3RoID0gZmwtPmZsX2VuZCAtIGZsLT5mbF9zdGFydCArIDE7ICAgICAgICAKIAlkZW55LT5sZF90eXBlID0gTkZTNF9SRUFEX0xUOwogCWlmIChmbC0+ZmxfdHlwZSAhPSBGX1JETENLKQpAQCAtMjYxNiw3ICsyNjM3LDcgQEAKIHN0YXRpYyBpbnQKIGNoZWNrX2xvY2tfbGVuZ3RoKHU2NCBvZmZzZXQsIHU2NCBsZW5ndGgpCiB7Ci0JcmV0dXJuICgobGVuZ3RoID09IDApICB8fCAoKGxlbmd0aCAhPSB+KHU2NCkwKSAmJgorCXJldHVybiAoKGxlbmd0aCA9PSAwKSAgfHwgKChsZW5ndGggIT0gTkZTNF9NQVhfVUlOVDY0KSAmJgogCSAgICAgTE9GRl9PVkVSRkxPVyhvZmZzZXQsIGxlbmd0aCkpKTsKIH0KIApAQCAtMjczNiwxMSArMjc1Nyw3IEBACiAJZmlsZV9sb2NrLmZsX2xtb3BzID0gJm5mc2RfcG9zaXhfbW5nX29wczsKIAogCWZpbGVfbG9jay5mbF9zdGFydCA9IGxvY2stPmxrX29mZnNldDsKLQlpZiAoKGxvY2stPmxrX2xlbmd0aCA9PSB+KHU2NCkwKSB8fCAKLQkJCUxPRkZfT1ZFUkZMT1cobG9jay0+bGtfb2Zmc2V0LCBsb2NrLT5sa19sZW5ndGgpKQotCQlmaWxlX2xvY2suZmxfZW5kID0gfih1NjQpMDsKLQllbHNlCi0JCWZpbGVfbG9jay5mbF9lbmQgPSBsb2NrLT5sa19vZmZzZXQgKyBsb2NrLT5sa19sZW5ndGggLSAxOworCWZpbGVfbG9jay5mbF9lbmQgPSBsYXN0X2J5dGVfb2Zmc2V0KGxvY2stPmxrX29mZnNldCwgbG9jay0+bGtfbGVuZ3RoKTsKIAluZnM0X3RyYW5zZm9ybV9sb2NrX29mZnNldCgmZmlsZV9sb2NrKTsKIAogCS8qCkBAIC0yNzgxLDYgKzI3OTgsMjUgQEAKIH0KIAogLyoKKyAqIFRoZSBORlN2NCBzcGVjIGFsbG93cyBhIGNsaWVudCB0byBkbyBhIExPQ0tUIHdpdGhvdXQgaG9sZGluZyBhbiBPUEVOLAorICogc28gd2UgZG8gYSB0ZW1wb3Jhcnkgb3BlbiBoZXJlIGp1c3QgdG8gZ2V0IGFuIG9wZW4gZmlsZSB0byBwYXNzIHRvCisgKiB2ZnNfdGVzdF9sb2NrLiAgKEFyZ3VhYmx5IHBlcmhhcHMgdGVzdF9sb2NrIHNob3VsZCBiZSBkb25lIHdpdGggYW4KKyAqIGlub2RlIG9wZXJhdGlvbi4pCisgKi8KK3N0YXRpYyBpbnQgbmZzZF90ZXN0X2xvY2soc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IHN2Y19maCAqZmhwLCBzdHJ1Y3QgZmlsZV9sb2NrICpsb2NrKQoreworCXN0cnVjdCBmaWxlICpmaWxlOworCWludCBlcnI7CisKKwllcnIgPSBuZnNkX29wZW4ocnFzdHAsIGZocCwgU19JRlJFRywgTkZTRF9NQVlfUkVBRCwgJmZpbGUpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisJZXJyID0gdmZzX3Rlc3RfbG9jayhmaWxlLCBsb2NrKTsKKwluZnNkX2Nsb3NlKGZpbGUpOworCXJldHVybiBlcnI7Cit9CisKKy8qCiAgKiBMT0NLVCBvcGVyYXRpb24KICAqLwogX19iZTMyCkBAIC0yNzg4LDcgKzI4MjQsNiBAQAogCSAgICBzdHJ1Y3QgbmZzZDRfbG9ja3QgKmxvY2t0KQogewogCXN0cnVjdCBpbm9kZSAqaW5vZGU7Ci0Jc3RydWN0IGZpbGUgZmlsZTsKIAlzdHJ1Y3QgZmlsZV9sb2NrIGZpbGVfbG9jazsKIAlpbnQgZXJyb3I7CiAJX19iZTMyIHN0YXR1czsKQEAgLTI4MzksMjMgKzI4NzQsMTIgQEAKIAlmaWxlX2xvY2suZmxfbG1vcHMgPSAmbmZzZF9wb3NpeF9tbmdfb3BzOwogCiAJZmlsZV9sb2NrLmZsX3N0YXJ0ID0gbG9ja3QtPmx0X29mZnNldDsKLQlpZiAoKGxvY2t0LT5sdF9sZW5ndGggPT0gfih1NjQpMCkgfHwgTE9GRl9PVkVSRkxPVyhsb2NrdC0+bHRfb2Zmc2V0LCBsb2NrdC0+bHRfbGVuZ3RoKSkKLQkJZmlsZV9sb2NrLmZsX2VuZCA9IH4odTY0KTA7Ci0JZWxzZQotCQlmaWxlX2xvY2suZmxfZW5kID0gbG9ja3QtPmx0X29mZnNldCArIGxvY2t0LT5sdF9sZW5ndGggLSAxOworCWZpbGVfbG9jay5mbF9lbmQgPSBsYXN0X2J5dGVfb2Zmc2V0KGxvY2t0LT5sdF9vZmZzZXQsIGxvY2t0LT5sdF9sZW5ndGgpOwogCiAJbmZzNF90cmFuc2Zvcm1fbG9ja19vZmZzZXQoJmZpbGVfbG9jayk7CiAKLQkvKiB2ZnNfdGVzdF9sb2NrIHVzZXMgdGhlIHN0cnVjdCBmaWxlIF9vbmx5XyB0byByZXNvbHZlIHRoZSBpbm9kZS4KLQkgKiBzaW5jZSBMT0NLVCBkb2Vzbid0IHJlcXVpcmUgYW4gT1BFTiwgYW5kIHRoZXJlZm9yZSBhIHN0cnVjdAotCSAqIGZpbGUgbWF5IG5vdCBleGlzdCwgcGFzcyB2ZnNfdGVzdF9sb2NrIGEgc3RydWN0IGZpbGUgd2l0aAotCSAqIG9ubHkgdGhlIGRlbnRyeTppbm9kZSBzZXQuCi0JICovCi0JbWVtc2V0KCZmaWxlLCAwLCBzaXplb2YgKHN0cnVjdCBmaWxlKSk7Ci0JZmlsZS5mX3BhdGguZGVudHJ5ID0gY3N0YXRlLT5jdXJyZW50X2ZoLmZoX2RlbnRyeTsKLQogCXN0YXR1cyA9IG5mc19vazsKLQllcnJvciA9IHZmc190ZXN0X2xvY2soJmZpbGUsICZmaWxlX2xvY2spOworCWVycm9yID0gbmZzZF90ZXN0X2xvY2socnFzdHAsICZjc3RhdGUtPmN1cnJlbnRfZmgsICZmaWxlX2xvY2spOwogCWlmIChlcnJvcikgewogCQlzdGF0dXMgPSBuZnNlcnJubyhlcnJvcik7CiAJCWdvdG8gb3V0OwpAQCAtMjkwNiwxMCArMjkzMCw3IEBACiAJZmlsZV9sb2NrLmZsX2xtb3BzID0gJm5mc2RfcG9zaXhfbW5nX29wczsKIAlmaWxlX2xvY2suZmxfc3RhcnQgPSBsb2NrdS0+bHVfb2Zmc2V0OwogCi0JaWYgKChsb2NrdS0+bHVfbGVuZ3RoID09IH4odTY0KTApIHx8IExPRkZfT1ZFUkZMT1cobG9ja3UtPmx1X29mZnNldCwgbG9ja3UtPmx1X2xlbmd0aCkpCi0JCWZpbGVfbG9jay5mbF9lbmQgPSB+KHU2NCkwOwotCWVsc2UKLQkJZmlsZV9sb2NrLmZsX2VuZCA9IGxvY2t1LT5sdV9vZmZzZXQgKyBsb2NrdS0+bHVfbGVuZ3RoIC0gMTsKKwlmaWxlX2xvY2suZmxfZW5kID0gbGFzdF9ieXRlX29mZnNldChsb2NrdS0+bHVfb2Zmc2V0LCBsb2NrdS0+bHVfbGVuZ3RoKTsKIAluZnM0X3RyYW5zZm9ybV9sb2NrX29mZnNldCgmZmlsZV9sb2NrKTsKIAogCS8qCmRpZmYgLS1naXQgYS9mcy9uZnNkL25mczR4ZHIuYyBiL2ZzL25mc2QvbmZzNHhkci5jCmluZGV4IGFmY2RmNGIuLmY2NTk1M2IgMTAwNjQ0Ci0tLSBhL2ZzL25mc2QvbmZzNHhkci5jCisrKyBiL2ZzL25mc2QvbmZzNHhkci5jCkBAIC0xLDYgKzEsNCBAQAogLyoKLSAqICBmcy9uZnMvbmZzNHhkci5jCi0gKgogICogIFNlcnZlci1zaWRlIFhEUiBmb3IgTkZTdjQKICAqCiAgKiAgQ29weXJpZ2h0IChjKSAyMDAyIFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIE1pY2hpZ2FuLgpkaWZmIC0tZ2l0IGEvZnMvbmZzZC9uZnNjdGwuYyBiL2ZzL25mc2QvbmZzY3RsLmMKaW5kZXggNzdkN2I4Yy4uM2Q5M2IyMCAxMDA2NDQKLS0tIGEvZnMvbmZzZC9uZnNjdGwuYworKysgYi9mcy9uZnNkL25mc2N0bC5jCkBAIC04NCw2ICs4NCw4IEBACiBzdGF0aWMgc3NpemVfdCB3cml0ZV9nZXRmZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSk7CiBzdGF0aWMgc3NpemVfdCB3cml0ZV9nZXRmcyhzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSk7CiBzdGF0aWMgc3NpemVfdCB3cml0ZV9maWxlaGFuZGxlKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyICpidWYsIHNpemVfdCBzaXplKTsKK3N0YXRpYyBzc2l6ZV90IHdyaXRlX3VubG9ja19pcChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSk7CitzdGF0aWMgc3NpemVfdCB3cml0ZV91bmxvY2tfZnMoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgKmJ1Ziwgc2l6ZV90IHNpemUpOwogc3RhdGljIHNzaXplX3Qgd3JpdGVfdGhyZWFkcyhzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSk7CiBzdGF0aWMgc3NpemVfdCB3cml0ZV9wb29sX3RocmVhZHMoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgKmJ1Ziwgc2l6ZV90IHNpemUpOwogc3RhdGljIHNzaXplX3Qgd3JpdGVfdmVyc2lvbnMoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgKmJ1Ziwgc2l6ZV90IHNpemUpOwpAQCAtOTQsOSArOTYsNiBAQAogc3RhdGljIHNzaXplX3Qgd3JpdGVfcmVjb3ZlcnlkaXIoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgKmJ1Ziwgc2l6ZV90IHNpemUpOwogI2VuZGlmCiAKLXN0YXRpYyBzc2l6ZV90IGZhaWxvdmVyX3VubG9ja19pcChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSk7Ci1zdGF0aWMgc3NpemVfdCBmYWlsb3Zlcl91bmxvY2tfZnMoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgKmJ1Ziwgc2l6ZV90IHNpemUpOwotCiBzdGF0aWMgc3NpemVfdCAoKndyaXRlX29wW10pKHN0cnVjdCBmaWxlICosIGNoYXIgKiwgc2l6ZV90KSA9IHsKIAlbTkZTRF9TdmNdID0gd3JpdGVfc3ZjLAogCVtORlNEX0FkZF0gPSB3cml0ZV9hZGQsCkBAIC0xMDYsOCArMTA1LDggQEAKIAlbTkZTRF9HZXRmZF0gPSB3cml0ZV9nZXRmZCwKIAlbTkZTRF9HZXRmc10gPSB3cml0ZV9nZXRmcywKIAlbTkZTRF9GaF0gPSB3cml0ZV9maWxlaGFuZGxlLAotCVtORlNEX0ZPX1VubG9ja0lQXSA9IGZhaWxvdmVyX3VubG9ja19pcCwKLQlbTkZTRF9GT19VbmxvY2tGU10gPSBmYWlsb3Zlcl91bmxvY2tfZnMsCisJW05GU0RfRk9fVW5sb2NrSVBdID0gd3JpdGVfdW5sb2NrX2lwLAorCVtORlNEX0ZPX1VubG9ja0ZTXSA9IHdyaXRlX3VubG9ja19mcywKIAlbTkZTRF9UaHJlYWRzXSA9IHdyaXRlX3RocmVhZHMsCiAJW05GU0RfUG9vbF9UaHJlYWRzXSA9IHdyaXRlX3Bvb2xfdGhyZWFkcywKIAlbTkZTRF9WZXJzaW9uc10gPSB3cml0ZV92ZXJzaW9ucywKQEAgLTE3NiwxMCArMTc1LDI0IEBACiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyoKICAqIHBheWxvYWQgLSB3cml0ZSBtZXRob2RzCi0gKiBJZiB0aGUgbWV0aG9kIGhhcyBhIHJlc3BvbnNlLCB0aGUgcmVzcG9uc2Ugc2hvdWxkIGJlIHB1dCBpbiBidWYsCi0gKiBhbmQgdGhlIGxlbmd0aCByZXR1cm5lZC4gIE90aGVyd2lzZSByZXR1cm4gMCBvciBhbmQgLWVycm9yLgogICovCiAKKy8qKgorICogd3JpdGVfc3ZjIC0gU3RhcnQga2VybmVsJ3MgTkZTRCBzZXJ2ZXIKKyAqCisgKiBEZXByZWNhdGVkLiAgL3Byb2MvZnMvbmZzZC90aHJlYWRzIGlzIHByZWZlcnJlZC4KKyAqIEZ1bmN0aW9uIHJlbWFpbnMgdG8gc3VwcG9ydCBvbGQgdmVyc2lvbnMgb2YgbmZzLXV0aWxzLgorICoKKyAqIElucHV0OgorICoJCQlidWY6CXN0cnVjdCBuZnNjdGxfc3ZjCisgKgkJCQlzdmNfcG9ydDoJcG9ydCBudW1iZXIgb2YgdGhpcworICoJCQkJCQlzZXJ2ZXIncyBsaXN0ZW5lcgorICoJCQkJc3ZjX250aHJlYWRzOgludW1iZXIgb2YgdGhyZWFkcyB0byBzdGFydAorICoJCQlzaXplOglzaXplIGluIGJ5dGVzIG9mIHBhc3NlZCBpbiBuZnNjdGxfc3ZjCisgKiBPdXRwdXQ6CisgKglPbiBzdWNjZXNzOglyZXR1cm5zIHplcm8KKyAqCU9uIGVycm9yOglyZXR1cm4gY29kZSBpcyBuZWdhdGl2ZSBlcnJubyB2YWx1ZQorICovCiBzdGF0aWMgc3NpemVfdCB3cml0ZV9zdmMoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgKmJ1Ziwgc2l6ZV90IHNpemUpCiB7CiAJc3RydWN0IG5mc2N0bF9zdmMgKmRhdGE7CkBAIC0xODksNiArMjAyLDMwIEBACiAJcmV0dXJuIG5mc2Rfc3ZjKGRhdGEtPnN2Y19wb3J0LCBkYXRhLT5zdmNfbnRocmVhZHMpOwogfQogCisvKioKKyAqIHdyaXRlX2FkZCAtIEFkZCBvciBtb2RpZnkgY2xpZW50IGVudHJ5IGluIGF1dGggdW5peCBjYWNoZQorICoKKyAqIERlcHJlY2F0ZWQuICAvcHJvYy9uZXQvcnBjL2F1dGgudW5peC5pcCBpcyBwcmVmZXJyZWQuCisgKiBGdW5jdGlvbiByZW1haW5zIHRvIHN1cHBvcnQgb2xkIHZlcnNpb25zIG9mIG5mcy11dGlscy4KKyAqCisgKiBJbnB1dDoKKyAqCQkJYnVmOglzdHJ1Y3QgbmZzY3RsX2NsaWVudAorICoJCQkJY2xfaWRlbnQ6CSdcMCctdGVybWluYXRlZCBDIHN0cmluZworICoJCQkJCQljb250YWluaW5nIGRvbWFpbiBuYW1lCisgKgkJCQkJCW9mIGNsaWVudAorICoJCQkJY2xfbmFkZHI6CW5vLiBvZiBpdGVtcyBpbiBjbF9hZGRybGlzdAorICoJCQkJY2xfYWRkcmxpc3Q6CWFycmF5IG9mIGNsaWVudCBhZGRyZXNzZXMKKyAqCQkJCWNsX2Zoa2V5dHlwZToJaWdub3JlZAorICoJCQkJY2xfZmhrZXlsZW46CWlnbm9yZWQKKyAqCQkJCWNsX2Zoa2V5OglpZ25vcmVkCisgKgkJCXNpemU6CXNpemUgaW4gYnl0ZXMgb2YgcGFzc2VkIGluIG5mc2N0bF9jbGllbnQKKyAqIE91dHB1dDoKKyAqCU9uIHN1Y2Nlc3M6CXJldHVybnMgemVybworICoJT24gZXJyb3I6CXJldHVybiBjb2RlIGlzIG5lZ2F0aXZlIGVycm5vIHZhbHVlCisgKgorICogTm90ZTogT25seSBBRl9JTkVUIGNsaWVudCBhZGRyZXNzZXMgYXJlIHBhc3NlZCBpbiwgc2luY2UKKyAqIG5mc2N0bF9jbGllbnQuY2xfYWRkcmxpc3QgY29udGFpbnMgb25seSBpbl9hZGRyIGZpZWxkcyBmb3IgYWRkcmVzc2VzLgorICovCiBzdGF0aWMgc3NpemVfdCB3cml0ZV9hZGQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgKmJ1Ziwgc2l6ZV90IHNpemUpCiB7CiAJc3RydWN0IG5mc2N0bF9jbGllbnQgKmRhdGE7CkBAIC0xOTgsNiArMjM1LDMwIEBACiAJcmV0dXJuIGV4cF9hZGRjbGllbnQoZGF0YSk7CiB9CiAKKy8qKgorICogd3JpdGVfZGVsIC0gUmVtb3ZlIGNsaWVudCBmcm9tIGF1dGggdW5peCBjYWNoZQorICoKKyAqIERlcHJlY2F0ZWQuICAvcHJvYy9uZXQvcnBjL2F1dGgudW5peC5pcCBpcyBwcmVmZXJyZWQuCisgKiBGdW5jdGlvbiByZW1haW5zIHRvIHN1cHBvcnQgb2xkIHZlcnNpb25zIG9mIG5mcy11dGlscy4KKyAqCisgKiBJbnB1dDoKKyAqCQkJYnVmOglzdHJ1Y3QgbmZzY3RsX2NsaWVudAorICoJCQkJY2xfaWRlbnQ6CSdcMCctdGVybWluYXRlZCBDIHN0cmluZworICoJCQkJCQljb250YWluaW5nIGRvbWFpbiBuYW1lCisgKgkJCQkJCW9mIGNsaWVudAorICoJCQkJY2xfbmFkZHI6CWlnbm9yZWQKKyAqCQkJCWNsX2FkZHJsaXN0OglpZ25vcmVkCisgKgkJCQljbF9maGtleXR5cGU6CWlnbm9yZWQKKyAqCQkJCWNsX2Zoa2V5bGVuOglpZ25vcmVkCisgKgkJCQljbF9maGtleToJaWdub3JlZAorICoJCQlzaXplOglzaXplIGluIGJ5dGVzIG9mIHBhc3NlZCBpbiBuZnNjdGxfY2xpZW50CisgKiBPdXRwdXQ6CisgKglPbiBzdWNjZXNzOglyZXR1cm5zIHplcm8KKyAqCU9uIGVycm9yOglyZXR1cm4gY29kZSBpcyBuZWdhdGl2ZSBlcnJubyB2YWx1ZQorICoKKyAqIE5vdGU6IE9ubHkgQUZfSU5FVCBjbGllbnQgYWRkcmVzc2VzIGFyZSBwYXNzZWQgaW4sIHNpbmNlCisgKiBuZnNjdGxfY2xpZW50LmNsX2FkZHJsaXN0IGNvbnRhaW5zIG9ubHkgaW5fYWRkciBmaWVsZHMgZm9yIGFkZHJlc3Nlcy4KKyAqLwogc3RhdGljIHNzaXplX3Qgd3JpdGVfZGVsKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyICpidWYsIHNpemVfdCBzaXplKQogewogCXN0cnVjdCBuZnNjdGxfY2xpZW50ICpkYXRhOwpAQCAtMjA3LDYgKzI2OCwzMyBAQAogCXJldHVybiBleHBfZGVsY2xpZW50KGRhdGEpOwogfQogCisvKioKKyAqIHdyaXRlX2V4cG9ydCAtIEV4cG9ydCBwYXJ0IG9yIGFsbCBvZiBhIGxvY2FsIGZpbGUgc3lzdGVtCisgKgorICogRGVwcmVjYXRlZC4gIC9wcm9jL25ldC9ycGMve25mc2QuZXhwb3J0LG5mc2QuZmh9IGFyZSBwcmVmZXJyZWQuCisgKiBGdW5jdGlvbiByZW1haW5zIHRvIHN1cHBvcnQgb2xkIHZlcnNpb25zIG9mIG5mcy11dGlscy4KKyAqCisgKiBJbnB1dDoKKyAqCQkJYnVmOglzdHJ1Y3QgbmZzY3RsX2V4cG9ydAorICoJCQkJZXhfY2xpZW50OgknXDAnLXRlcm1pbmF0ZWQgQyBzdHJpbmcKKyAqCQkJCQkJY29udGFpbmluZyBkb21haW4gbmFtZQorICoJCQkJCQlvZiBjbGllbnQgYWxsb3dlZCB0byBhY2Nlc3MKKyAqCQkJCQkJdGhpcyBleHBvcnQKKyAqCQkJCWV4X3BhdGg6CSdcMCctdGVybWluYXRlZCBDIHN0cmluZworICoJCQkJCQljb250YWluaW5nIHBhdGhuYW1lIG9mCisgKgkJCQkJCWRpcmVjdG9yeSBpbiBsb2NhbCBmaWxlIHN5c3RlbQorICoJCQkJZXhfZGV2OgkJZnNpZCB0byB1c2UgZm9yIHRoaXMgZXhwb3J0CisgKgkJCQlleF9pbm86CQlpZ25vcmVkCisgKgkJCQlleF9mbGFnczoJZXhwb3J0IGZsYWdzIGZvciB0aGlzIGV4cG9ydAorICoJCQkJZXhfYW5vbl91aWQ6CVVJRCB0byB1c2UgZm9yIGFub255bW91cworICoJCQkJCQlyZXF1ZXN0cworICoJCQkJZXhfYW5vbl9naWQ6CUdJRCB0byB1c2UgZm9yIGFub255bW91cworICoJCQkJCQlyZXF1ZXN0cworICoJCQlzaXplOglzaXplIGluIGJ5dGVzIG9mIHBhc3NlZCBpbiBuZnNjdGxfZXhwb3J0CisgKiBPdXRwdXQ6CisgKglPbiBzdWNjZXNzOglyZXR1cm5zIHplcm8KKyAqCU9uIGVycm9yOglyZXR1cm4gY29kZSBpcyBuZWdhdGl2ZSBlcnJubyB2YWx1ZQorICovCiBzdGF0aWMgc3NpemVfdCB3cml0ZV9leHBvcnQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgKmJ1Ziwgc2l6ZV90IHNpemUpCiB7CiAJc3RydWN0IG5mc2N0bF9leHBvcnQgKmRhdGE7CkBAIC0yMTYsNiArMzA0LDMxIEBACiAJcmV0dXJuIGV4cF9leHBvcnQoZGF0YSk7CiB9CiAKKy8qKgorICogd3JpdGVfdW5leHBvcnQgLSBVbmV4cG9ydCBhIHByZXZpb3VzbHkgZXhwb3J0ZWQgZmlsZSBzeXN0ZW0KKyAqCisgKiBEZXByZWNhdGVkLiAgL3Byb2MvbmV0L3JwYy97bmZzZC5leHBvcnQsbmZzZC5maH0gYXJlIHByZWZlcnJlZC4KKyAqIEZ1bmN0aW9uIHJlbWFpbnMgdG8gc3VwcG9ydCBvbGQgdmVyc2lvbnMgb2YgbmZzLXV0aWxzLgorICoKKyAqIElucHV0OgorICoJCQlidWY6CXN0cnVjdCBuZnNjdGxfZXhwb3J0CisgKgkJCQlleF9jbGllbnQ6CSdcMCctdGVybWluYXRlZCBDIHN0cmluZworICoJCQkJCQljb250YWluaW5nIGRvbWFpbiBuYW1lCisgKgkJCQkJCW9mIGNsaWVudCBubyBsb25nZXIgYWxsb3dlZAorICoJCQkJCQl0byBhY2Nlc3MgdGhpcyBleHBvcnQKKyAqCQkJCWV4X3BhdGg6CSdcMCctdGVybWluYXRlZCBDIHN0cmluZworICoJCQkJCQljb250YWluaW5nIHBhdGhuYW1lIG9mCisgKgkJCQkJCWRpcmVjdG9yeSBpbiBsb2NhbCBmaWxlIHN5c3RlbQorICoJCQkJZXhfZGV2OgkJaWdub3JlZAorICoJCQkJZXhfaW5vOgkJaWdub3JlZAorICoJCQkJZXhfZmxhZ3M6CWlnbm9yZWQKKyAqCQkJCWV4X2Fub25fdWlkOglpZ25vcmVkCisgKgkJCQlleF9hbm9uX2dpZDoJaWdub3JlZAorICoJCQlzaXplOglzaXplIGluIGJ5dGVzIG9mIHBhc3NlZCBpbiBuZnNjdGxfZXhwb3J0CisgKiBPdXRwdXQ6CisgKglPbiBzdWNjZXNzOglyZXR1cm5zIHplcm8KKyAqCU9uIGVycm9yOglyZXR1cm4gY29kZSBpcyBuZWdhdGl2ZSBlcnJubyB2YWx1ZQorICovCiBzdGF0aWMgc3NpemVfdCB3cml0ZV91bmV4cG9ydChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSkKIHsKIAlzdHJ1Y3QgbmZzY3RsX2V4cG9ydCAqZGF0YTsKQEAgLTIyNiw2ICszMzksMzAgQEAKIAlyZXR1cm4gZXhwX3VuZXhwb3J0KGRhdGEpOwogfQogCisvKioKKyAqIHdyaXRlX2dldGZzIC0gR2V0IGEgdmFyaWFibGUtbGVuZ3RoIE5GUyBmaWxlIGhhbmRsZSBieSBwYXRoCisgKgorICogRGVwcmVjYXRlZC4gIC9wcm9jL2ZzL25mc2QvZmlsZWhhbmRsZSBpcyBwcmVmZXJyZWQuCisgKiBGdW5jdGlvbiByZW1haW5zIHRvIHN1cHBvcnQgb2xkIHZlcnNpb25zIG9mIG5mcy11dGlscy4KKyAqCisgKiBJbnB1dDoKKyAqCQkJYnVmOglzdHJ1Y3QgbmZzY3RsX2ZzcGFybQorICoJCQkJZ2RfYWRkcjoJc29ja2V0IGFkZHJlc3Mgb2YgY2xpZW50CisgKgkJCQlnZF9wYXRoOgknXDAnLXRlcm1pbmF0ZWQgQyBzdHJpbmcKKyAqCQkJCQkJY29udGFpbmluZyBwYXRobmFtZSBvZgorICoJCQkJCQlkaXJlY3RvcnkgaW4gbG9jYWwgZmlsZSBzeXN0ZW0KKyAqCQkJCWdkX21heGxlbjoJbWF4aW11bSBzaXplIG9mIHJldHVybmVkIGZpbGUKKyAqCQkJCQkJaGFuZGxlCisgKgkJCXNpemU6CXNpemUgaW4gYnl0ZXMgb2YgcGFzc2VkIGluIG5mc2N0bF9mc3Bhcm0KKyAqIE91dHB1dDoKKyAqCU9uIHN1Y2Nlc3M6CXBhc3NlZC1pbiBidWZmZXIgZmlsbGVkIHdpdGggYSBrbmZzZF9maCBzdHJ1Y3R1cmUKKyAqCQkJKGEgdmFyaWFibGUtbGVuZ3RoIHJhdyBORlMgZmlsZSBoYW5kbGUpOworICoJCQlyZXR1cm4gY29kZSBpcyB0aGUgc2l6ZSBpbiBieXRlcyBvZiB0aGUgZmlsZSBoYW5kbGUKKyAqCU9uIGVycm9yOglyZXR1cm4gY29kZSBpcyBuZWdhdGl2ZSBlcnJubyB2YWx1ZQorICoKKyAqIE5vdGU6IE9ubHkgQUZfSU5FVCBjbGllbnQgYWRkcmVzc2VzIGFyZSBwYXNzZWQgaW4sIHNpbmNlIGdkX2FkZHIKKyAqIGlzIHRoZSBzYW1lIHNpemUgYXMgYSBzdHJ1Y3Qgc29ja2FkZHJfaW4uCisgKi8KIHN0YXRpYyBzc2l6ZV90IHdyaXRlX2dldGZzKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyICpidWYsIHNpemVfdCBzaXplKQogewogCXN0cnVjdCBuZnNjdGxfZnNwYXJtICpkYXRhOwpAQCAtMjY1LDYgKzQwMiwyOSBAQAogCXJldHVybiBlcnI7CiB9CiAKKy8qKgorICogd3JpdGVfZ2V0ZmQgLSBHZXQgYSBmaXhlZC1sZW5ndGggTkZTIGZpbGUgaGFuZGxlIGJ5IHBhdGggKHVzZWQgYnkgbW91bnRkKQorICoKKyAqIERlcHJlY2F0ZWQuICAvcHJvYy9mcy9uZnNkL2ZpbGVoYW5kbGUgaXMgcHJlZmVycmVkLgorICogRnVuY3Rpb24gcmVtYWlucyB0byBzdXBwb3J0IG9sZCB2ZXJzaW9ucyBvZiBuZnMtdXRpbHMuCisgKgorICogSW5wdXQ6CisgKgkJCWJ1ZjoJc3RydWN0IG5mc2N0bF9mZHBhcm0KKyAqCQkJCWdkX2FkZHI6CXNvY2tldCBhZGRyZXNzIG9mIGNsaWVudAorICoJCQkJZ2RfcGF0aDoJJ1wwJy10ZXJtaW5hdGVkIEMgc3RyaW5nCisgKgkJCQkJCWNvbnRhaW5pbmcgcGF0aG5hbWUgb2YKKyAqCQkJCQkJZGlyZWN0b3J5IGluIGxvY2FsIGZpbGUgc3lzdGVtCisgKgkJCQlnZF92ZXJzaW9uOglmZHBhcm0gc3RydWN0dXJlIHZlcnNpb24KKyAqCQkJc2l6ZToJc2l6ZSBpbiBieXRlcyBvZiBwYXNzZWQgaW4gbmZzY3RsX2ZkcGFybQorICogT3V0cHV0OgorICoJT24gc3VjY2VzczoJcGFzc2VkLWluIGJ1ZmZlciBmaWxsZWQgd2l0aCBuZnNjdGxfcmVzCisgKgkJCShhIGZpeGVkLWxlbmd0aCByYXcgTkZTIGZpbGUgaGFuZGxlKTsKKyAqCQkJcmV0dXJuIGNvZGUgaXMgdGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIGZpbGUgaGFuZGxlCisgKglPbiBlcnJvcjoJcmV0dXJuIGNvZGUgaXMgbmVnYXRpdmUgZXJybm8gdmFsdWUKKyAqCisgKiBOb3RlOiBPbmx5IEFGX0lORVQgY2xpZW50IGFkZHJlc3NlcyBhcmUgcGFzc2VkIGluLCBzaW5jZSBnZF9hZGRyCisgKiBpcyB0aGUgc2FtZSBzaXplIGFzIGEgc3RydWN0IHNvY2thZGRyX2luLgorICovCiBzdGF0aWMgc3NpemVfdCB3cml0ZV9nZXRmZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSkKIHsKIAlzdHJ1Y3QgbmZzY3RsX2ZkcGFybSAqZGF0YTsKQEAgLTMwOSw3ICs0NjksMjMgQEAKIAlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgc3NpemVfdCBmYWlsb3Zlcl91bmxvY2tfaXAoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgKmJ1Ziwgc2l6ZV90IHNpemUpCisvKioKKyAqIHdyaXRlX3VubG9ja19pcCAtIFJlbGVhc2UgYWxsIGxvY2tzIHVzZWQgYnkgYSBjbGllbnQKKyAqCisgKiBFeHBlcmltZW50YWwuCisgKgorICogSW5wdXQ6CisgKgkJCWJ1ZjoJJ1xuJy10ZXJtaW5hdGVkIEMgc3RyaW5nIGNvbnRhaW5pbmcgYQorICoJCQkJcHJlc2VudGF0aW9uIGZvcm1hdCBJUHY0IGFkZHJlc3MKKyAqCQkJc2l6ZToJbGVuZ3RoIG9mIEMgc3RyaW5nIGluIEBidWYKKyAqIE91dHB1dDoKKyAqCU9uIHN1Y2Nlc3M6CXJldHVybnMgemVybyBpZiBhbGwgc3BlY2lmaWVkIGxvY2tzIHdlcmUgcmVsZWFzZWQ7CisgKgkJCXJldHVybnMgb25lIGlmIG9uZSBvciBtb3JlIGxvY2tzIHdlcmUgbm90IHJlbGVhc2VkCisgKglPbiBlcnJvcjoJcmV0dXJuIGNvZGUgaXMgbmVnYXRpdmUgZXJybm8gdmFsdWUKKyAqCisgKiBOb3RlOiBPbmx5IEFGX0lORVQgY2xpZW50IGFkZHJlc3NlcyBhcmUgcGFzc2VkIGluCisgKi8KK3N0YXRpYyBzc2l6ZV90IHdyaXRlX3VubG9ja19pcChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSkKIHsKIAlzdHJ1Y3Qgc29ja2FkZHJfaW4gc2luID0gewogCQkuc2luX2ZhbWlseQk9IEFGX0lORVQsCkBAIC0zMzksNyArNTE1LDIxIEBACiAJcmV0dXJuIG5sbXN2Y191bmxvY2tfYWxsX2J5X2lwKChzdHJ1Y3Qgc29ja2FkZHIgKikmc2luKTsKIH0KIAotc3RhdGljIHNzaXplX3QgZmFpbG92ZXJfdW5sb2NrX2ZzKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyICpidWYsIHNpemVfdCBzaXplKQorLyoqCisgKiB3cml0ZV91bmxvY2tfZnMgLSBSZWxlYXNlIGFsbCBsb2NrcyBvbiBhIGxvY2FsIGZpbGUgc3lzdGVtCisgKgorICogRXhwZXJpbWVudGFsLgorICoKKyAqIElucHV0OgorICoJCQlidWY6CSdcbictdGVybWluYXRlZCBDIHN0cmluZyBjb250YWluaW5nIHRoZQorICoJCQkJYWJzb2x1dGUgcGF0aG5hbWUgb2YgYSBsb2NhbCBmaWxlIHN5c3RlbQorICoJCQlzaXplOglsZW5ndGggb2YgQyBzdHJpbmcgaW4gQGJ1ZgorICogT3V0cHV0OgorICoJT24gc3VjY2VzczoJcmV0dXJucyB6ZXJvIGlmIGFsbCBzcGVjaWZpZWQgbG9ja3Mgd2VyZSByZWxlYXNlZDsKKyAqCQkJcmV0dXJucyBvbmUgaWYgb25lIG9yIG1vcmUgbG9ja3Mgd2VyZSBub3QgcmVsZWFzZWQKKyAqCU9uIGVycm9yOglyZXR1cm4gY29kZSBpcyBuZWdhdGl2ZSBlcnJubyB2YWx1ZQorICovCitzdGF0aWMgc3NpemVfdCB3cml0ZV91bmxvY2tfZnMoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgKmJ1Ziwgc2l6ZV90IHNpemUpCiB7CiAJc3RydWN0IHBhdGggcGF0aDsKIAljaGFyICpmb19wYXRoOwpAQCAtMzYwLDIxICs1NTAsNDQgQEAKIAlpZiAoZXJyb3IpCiAJCXJldHVybiBlcnJvcjsKIAorCS8qCisJICogWFhYOiBOZWVkcyBiZXR0ZXIgc2FuaXR5IGNoZWNraW5nLiAgT3RoZXJ3aXNlIHdlIGNvdWxkIGVuZCB1cAorCSAqIHJlbGVhc2luZyBsb2NrcyBvbiB0aGUgd3JvbmcgZmlsZSBzeXN0ZW0uCisJICoKKwkgKiBGb3IgZXhhbXBsZToKKwkgKiAxLiAgRG9lcyB0aGUgcGF0aCByZWZlciB0byBhIGRpcmVjdG9yeT8KKwkgKiAyLiAgSXMgdGhhdCBkaXJlY3RvcnkgYSBtb3VudCBwb2ludCwgb3IKKwkgKiAzLiAgSXMgdGhhdCBkaXJlY3RvcnkgdGhlIHJvb3Qgb2YgYW4gZXhwb3J0ZWQgZmlsZSBzeXN0ZW0/CisJICovCiAJZXJyb3IgPSBubG1zdmNfdW5sb2NrX2FsbF9ieV9zYihwYXRoLm1udC0+bW50X3NiKTsKIAogCXBhdGhfcHV0KCZwYXRoKTsKIAlyZXR1cm4gZXJyb3I7CiB9CiAKKy8qKgorICogd3JpdGVfZmlsZWhhbmRsZSAtIEdldCBhIHZhcmlhYmxlLWxlbmd0aCBORlMgZmlsZSBoYW5kbGUgYnkgcGF0aAorICoKKyAqIE9uIGlucHV0LCB0aGUgYnVmZmVyIGNvbnRhaW5zIGEgJ1xuJy10ZXJtaW5hdGVkIEMgc3RyaW5nIGNvbXByaXNlZCBvZgorICogdGhyZWUgYWxwaGFudW1lcmljIHdvcmRzIHNlcGFyYXRlZCBieSB3aGl0ZXNwYWNlLiAgVGhlIHN0cmluZyBtYXkKKyAqIGNvbnRhaW4gZXNjYXBlIHNlcXVlbmNlcy4KKyAqCisgKiBJbnB1dDoKKyAqCQkJYnVmOgorICoJCQkJZG9tYWluOgkJY2xpZW50IGRvbWFpbiBuYW1lCisgKgkJCQlwYXRoOgkJZXhwb3J0IHBhdGhuYW1lCisgKgkJCQltYXhzaXplOgludW1lcmljIG1heGltdW0gc2l6ZSBvZgorICoJCQkJCQlAYnVmCisgKgkJCXNpemU6CWxlbmd0aCBvZiBDIHN0cmluZyBpbiBAYnVmCisgKiBPdXRwdXQ6CisgKglPbiBzdWNjZXNzOglwYXNzZWQtaW4gYnVmZmVyIGZpbGxlZCB3aXRoICdcbictdGVybWluYXRlZCBDCisgKgkJCXN0cmluZyBjb250YWluaW5nIGEgQVNDSUkgaGV4IHRleHQgdmVyc2lvbgorICoJCQlvZiB0aGUgTkZTIGZpbGUgaGFuZGxlOworICoJCQlyZXR1cm4gY29kZSBpcyB0aGUgc2l6ZSBpbiBieXRlcyBvZiB0aGUgc3RyaW5nCisgKglPbiBlcnJvcjoJcmV0dXJuIGNvZGUgaXMgbmVnYXRpdmUgZXJybm8gdmFsdWUKKyAqLwogc3RhdGljIHNzaXplX3Qgd3JpdGVfZmlsZWhhbmRsZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSkKIHsKLQkvKiByZXF1ZXN0IGlzOgotCSAqICAgZG9tYWluIHBhdGggbWF4c2l6ZQotCSAqIHJlc3BvbnNlIGlzCi0JICogICBmaWxlaGFuZGxlCi0JICoKLQkgKiBxd29yZCBxdW90aW5nIGlzIHVzZWQsIHNvIGZpbGVoYW5kbGUgd2lsbCBiZSBceC4uLi4KLQkgKi8KIAljaGFyICpkbmFtZSwgKnBhdGg7CiAJaW50IHVuaW5pdGlhbGl6ZWRfdmFyKG1heHNpemUpOwogCWNoYXIgKm1lc2cgPSBidWY7CkBAIC0zOTEsMTEgKzYwNCwxMyBAQAogCiAJZG5hbWUgPSBtZXNnOwogCWxlbiA9IHF3b3JkX2dldCgmbWVzZywgZG5hbWUsIHNpemUpOwotCWlmIChsZW4gPD0gMCkgcmV0dXJuIC1FSU5WQUw7CisJaWYgKGxlbiA8PSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKIAkKIAlwYXRoID0gZG5hbWUrbGVuKzE7CiAJbGVuID0gcXdvcmRfZ2V0KCZtZXNnLCBwYXRoLCBzaXplKTsKLQlpZiAobGVuIDw9IDApIHJldHVybiAtRUlOVkFMOworCWlmIChsZW4gPD0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CiAKIAlsZW4gPSBnZXRfaW50KCZtZXNnLCAmbWF4c2l6ZSk7CiAJaWYgKGxlbikKQEAgLTQxOSwxNyArNjM0LDQzIEBACiAJaWYgKGxlbikKIAkJcmV0dXJuIGxlbjsKIAkKLQltZXNnID0gYnVmOyBsZW4gPSBTSU1QTEVfVFJBTlNBQ1RJT05fTElNSVQ7CisJbWVzZyA9IGJ1ZjsKKwlsZW4gPSBTSU1QTEVfVFJBTlNBQ1RJT05fTElNSVQ7CiAJcXdvcmRfYWRkaGV4KCZtZXNnLCAmbGVuLCAoY2hhciopJmZoLmZoX2Jhc2UsIGZoLmZoX3NpemUpOwogCW1lc2dbLTFdID0gJ1xuJzsKIAlyZXR1cm4gbWVzZyAtIGJ1ZjsJCiB9CiAKKy8qKgorICogd3JpdGVfdGhyZWFkcyAtIFN0YXJ0IE5GU0QsIG9yIHJlcG9ydCB0aGUgY3VycmVudCBudW1iZXIgb2YgcnVubmluZyB0aHJlYWRzCisgKgorICogSW5wdXQ6CisgKgkJCWJ1ZjoJCWlnbm9yZWQKKyAqCQkJc2l6ZToJCXplcm8KKyAqIE91dHB1dDoKKyAqCU9uIHN1Y2Nlc3M6CXBhc3NlZC1pbiBidWZmZXIgZmlsbGVkIHdpdGggJ1xuJy10ZXJtaW5hdGVkIEMKKyAqCQkJc3RyaW5nIG51bWVyaWMgdmFsdWUgcmVwcmVzZW50aW5nIHRoZSBudW1iZXIgb2YKKyAqCQkJcnVubmluZyBORlNEIHRocmVhZHM7CisgKgkJCXJldHVybiBjb2RlIGlzIHRoZSBzaXplIGluIGJ5dGVzIG9mIHRoZSBzdHJpbmcKKyAqCU9uIGVycm9yOglyZXR1cm4gY29kZSBpcyB6ZXJvCisgKgorICogT1IKKyAqCisgKiBJbnB1dDoKKyAqCQkJYnVmOgkJQyBzdHJpbmcgY29udGFpbmluZyBhbiB1bnNpZ25lZAorICoJCQkJCWludGVnZXIgdmFsdWUgcmVwcmVzZW50aW5nIHRoZQorICoJCQkJCW51bWJlciBvZiBORlNEIHRocmVhZHMgdG8gc3RhcnQKKyAqCQkJc2l6ZToJCW5vbi16ZXJvIGxlbmd0aCBvZiBDIHN0cmluZyBpbiBAYnVmCisgKiBPdXRwdXQ6CisgKglPbiBzdWNjZXNzOglORlMgc2VydmljZSBpcyBzdGFydGVkOworICoJCQlwYXNzZWQtaW4gYnVmZmVyIGZpbGxlZCB3aXRoICdcbictdGVybWluYXRlZCBDCisgKgkJCXN0cmluZyBudW1lcmljIHZhbHVlIHJlcHJlc2VudGluZyB0aGUgbnVtYmVyIG9mCisgKgkJCXJ1bm5pbmcgTkZTRCB0aHJlYWRzOworICoJCQlyZXR1cm4gY29kZSBpcyB0aGUgc2l6ZSBpbiBieXRlcyBvZiB0aGUgc3RyaW5nCisgKglPbiBlcnJvcjoJcmV0dXJuIGNvZGUgaXMgemVybyBvciBhIG5lZ2F0aXZlIGVycm5vIHZhbHVlCisgKi8KIHN0YXRpYyBzc2l6ZV90IHdyaXRlX3RocmVhZHMoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgKmJ1Ziwgc2l6ZV90IHNpemUpCiB7Ci0JLyogaWYgc2l6ZSA+IDAsIGxvb2sgZm9yIGEgbnVtYmVyIG9mIHRocmVhZHMgYW5kIGNhbGwgbmZzZF9zdmMKLQkgKiB0aGVuIHdyaXRlIG91dCBudW1iZXIgb2YgdGhyZWFkcyBhcyByZXBseQotCSAqLwogCWNoYXIgKm1lc2cgPSBidWY7CiAJaW50IHJ2OwogCWlmIChzaXplID4gMCkgewpAQCAtNDM3LDkgKzY3OCw5IEBACiAJCXJ2ID0gZ2V0X2ludCgmbWVzZywgJm5ld3RocmVhZHMpOwogCQlpZiAocnYpCiAJCQlyZXR1cm4gcnY7Ci0JCWlmIChuZXd0aHJlYWRzIDwwKQorCQlpZiAobmV3dGhyZWFkcyA8IDApCiAJCQlyZXR1cm4gLUVJTlZBTDsKLQkJcnYgPSBuZnNkX3N2YygyMDQ5LCBuZXd0aHJlYWRzKTsKKwkJcnYgPSBuZnNkX3N2YyhORlNfUE9SVCwgbmV3dGhyZWFkcyk7CiAJCWlmIChydikKIAkJCXJldHVybiBydjsKIAl9CkBAIC00NDcsNiArNjg4LDI4IEBACiAJcmV0dXJuIHN0cmxlbihidWYpOwogfQogCisvKioKKyAqIHdyaXRlX3Bvb2xfdGhyZWFkcyAtIFNldCBvciByZXBvcnQgdGhlIGN1cnJlbnQgbnVtYmVyIG9mIHRocmVhZHMgcGVyIHBvb2wKKyAqCisgKiBJbnB1dDoKKyAqCQkJYnVmOgkJaWdub3JlZAorICoJCQlzaXplOgkJemVybworICoKKyAqIE9SCisgKgorICogSW5wdXQ6CisgKiAJCQlidWY6CQlDIHN0cmluZyBjb250YWluaW5nIHdoaXRlc3BhY2UtCisgKiAJCQkJCXNlcGFyYXRlZCB1bnNpZ25lZCBpbnRlZ2VyIHZhbHVlcworICoJCQkJCXJlcHJlc2VudGluZyB0aGUgbnVtYmVyIG9mIE5GU0QKKyAqCQkJCQl0aHJlYWRzIHRvIHN0YXJ0IGluIGVhY2ggcG9vbAorICoJCQlzaXplOgkJbm9uLXplcm8gbGVuZ3RoIG9mIEMgc3RyaW5nIGluIEBidWYKKyAqIE91dHB1dDoKKyAqCU9uIHN1Y2Nlc3M6CXBhc3NlZC1pbiBidWZmZXIgZmlsbGVkIHdpdGggJ1xuJy10ZXJtaW5hdGVkIEMKKyAqCQkJc3RyaW5nIGNvbnRhaW5pbmcgaW50ZWdlciB2YWx1ZXMgcmVwcmVzZW50aW5nIHRoZQorICoJCQludW1iZXIgb2YgTkZTRCB0aHJlYWRzIGluIGVhY2ggcG9vbDsKKyAqCQkJcmV0dXJuIGNvZGUgaXMgdGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIHN0cmluZworICoJT24gZXJyb3I6CXJldHVybiBjb2RlIGlzIHplcm8gb3IgYSBuZWdhdGl2ZSBlcnJubyB2YWx1ZQorICovCiBzdGF0aWMgc3NpemVfdCB3cml0ZV9wb29sX3RocmVhZHMoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgKmJ1Ziwgc2l6ZV90IHNpemUpCiB7CiAJLyogaWYgc2l6ZSA+IDAsIGxvb2sgZm9yIGFuIGFycmF5IG9mIG51bWJlciBvZiB0aHJlYWRzIHBlciBub2RlCkBAIC01MTcsMTAgKzc4MCw2IEBACiAKIHN0YXRpYyBzc2l6ZV90IF9fd3JpdGVfdmVyc2lvbnMoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgKmJ1Ziwgc2l6ZV90IHNpemUpCiB7Ci0JLyoKLQkgKiBGb3JtYXQ6Ci0JICogICBbLS8rXXZlcnMgWy0vK112ZXJzIC4uLgotCSAqLwogCWNoYXIgKm1lc2cgPSBidWY7CiAJY2hhciAqdmVycywgc2lnbjsKIAlpbnQgbGVuLCBudW07CkBAIC01NzgsNiArODM3LDM4IEBACiAJcmV0dXJuIGxlbjsKIH0KIAorLyoqCisgKiB3cml0ZV92ZXJzaW9ucyAtIFNldCBvciByZXBvcnQgdGhlIGF2YWlsYWJsZSBORlMgcHJvdG9jb2wgdmVyc2lvbnMKKyAqCisgKiBJbnB1dDoKKyAqCQkJYnVmOgkJaWdub3JlZAorICoJCQlzaXplOgkJemVybworICogT3V0cHV0OgorICoJT24gc3VjY2VzczoJcGFzc2VkLWluIGJ1ZmZlciBmaWxsZWQgd2l0aCAnXG4nLXRlcm1pbmF0ZWQgQworICoJCQlzdHJpbmcgY29udGFpbmluZyBwb3NpdGl2ZSBvciBuZWdhdGl2ZSBpbnRlZ2VyCisgKgkJCXZhbHVlcyByZXByZXNlbnRpbmcgdGhlIGN1cnJlbnQgc3RhdHVzIG9mIGVhY2gKKyAqCQkJcHJvdG9jb2wgdmVyc2lvbjsKKyAqCQkJcmV0dXJuIGNvZGUgaXMgdGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIHN0cmluZworICoJT24gZXJyb3I6CXJldHVybiBjb2RlIGlzIHplcm8gb3IgYSBuZWdhdGl2ZSBlcnJubyB2YWx1ZQorICoKKyAqIE9SCisgKgorICogSW5wdXQ6CisgKiAJCQlidWY6CQlDIHN0cmluZyBjb250YWluaW5nIHdoaXRlc3BhY2UtCisgKiAJCQkJCXNlcGFyYXRlZCBwb3NpdGl2ZSBvciBuZWdhdGl2ZQorICogCQkJCQlpbnRlZ2VyIHZhbHVlcyByZXByZXNlbnRpbmcgTkZTCisgKiAJCQkJCXByb3RvY29sIHZlcnNpb25zIHRvIGVuYWJsZSAoIituIikKKyAqIAkJCQkJb3IgZGlzYWJsZSAoIi1uIikKKyAqCQkJc2l6ZToJCW5vbi16ZXJvIGxlbmd0aCBvZiBDIHN0cmluZyBpbiBAYnVmCisgKiBPdXRwdXQ6CisgKglPbiBzdWNjZXNzOglzdGF0dXMgb2YgemVybyBvciBtb3JlIHByb3RvY29sIHZlcnNpb25zIGhhcworICoJCQliZWVuIHVwZGF0ZWQ7IHBhc3NlZC1pbiBidWZmZXIgZmlsbGVkIHdpdGgKKyAqCQkJJ1xuJy10ZXJtaW5hdGVkIEMgc3RyaW5nIGNvbnRhaW5pbmcgcG9zaXRpdmUKKyAqCQkJb3IgbmVnYXRpdmUgaW50ZWdlciB2YWx1ZXMgcmVwcmVzZW50aW5nIHRoZQorICoJCQljdXJyZW50IHN0YXR1cyBvZiBlYWNoIHByb3RvY29sIHZlcnNpb247CisgKgkJCXJldHVybiBjb2RlIGlzIHRoZSBzaXplIGluIGJ5dGVzIG9mIHRoZSBzdHJpbmcKKyAqCU9uIGVycm9yOglyZXR1cm4gY29kZSBpcyB6ZXJvIG9yIGEgbmVnYXRpdmUgZXJybm8gdmFsdWUKKyAqLwogc3RhdGljIHNzaXplX3Qgd3JpdGVfdmVyc2lvbnMoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgKmJ1Ziwgc2l6ZV90IHNpemUpCiB7CiAJc3NpemVfdCBydjsKQEAgLTY4Nyw2ICs5NzgsNzUgQEAKIAlyZXR1cm4gLUVJTlZBTDsKIH0KIAorLyoqCisgKiB3cml0ZV9wb3J0cyAtIFBhc3MgYSBzb2NrZXQgZmlsZSBkZXNjcmlwdG9yIG9yIHRyYW5zcG9ydCBuYW1lIHRvIGxpc3RlbiBvbgorICoKKyAqIElucHV0OgorICoJCQlidWY6CQlpZ25vcmVkCisgKgkJCXNpemU6CQl6ZXJvCisgKiBPdXRwdXQ6CisgKglPbiBzdWNjZXNzOglwYXNzZWQtaW4gYnVmZmVyIGZpbGxlZCB3aXRoIGEgJ1xuJy10ZXJtaW5hdGVkIEMKKyAqCQkJc3RyaW5nIGNvbnRhaW5pbmcgYSB3aGl0ZXNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mCisgKgkJCW5hbWVkIE5GU0QgbGlzdGVuZXJzOworICoJCQlyZXR1cm4gY29kZSBpcyB0aGUgc2l6ZSBpbiBieXRlcyBvZiB0aGUgc3RyaW5nCisgKglPbiBlcnJvcjoJcmV0dXJuIGNvZGUgaXMgemVybyBvciBhIG5lZ2F0aXZlIGVycm5vIHZhbHVlCisgKgorICogT1IKKyAqCisgKiBJbnB1dDoKKyAqCQkJYnVmOgkJQyBzdHJpbmcgY29udGFpbmluZyBhbiB1bnNpZ25lZAorICoJCQkJCWludGVnZXIgdmFsdWUgcmVwcmVzZW50aW5nIGEgYm91bmQKKyAqCQkJCQlidXQgdW5jb25uZWN0ZWQgc29ja2V0IHRoYXQgaXMgdG8gYmUKKyAqCQkJCQl1c2VkIGFzIGFuIE5GU0QgbGlzdGVuZXIKKyAqCQkJc2l6ZToJCW5vbi16ZXJvIGxlbmd0aCBvZiBDIHN0cmluZyBpbiBAYnVmCisgKiBPdXRwdXQ6CisgKglPbiBzdWNjZXNzOglORlMgc2VydmljZSBpcyBzdGFydGVkOworICoJCQlwYXNzZWQtaW4gYnVmZmVyIGZpbGxlZCB3aXRoIGEgJ1xuJy10ZXJtaW5hdGVkIEMKKyAqCQkJc3RyaW5nIGNvbnRhaW5pbmcgYSB1bmlxdWUgYWxwaGFudW1lcmljIG5hbWUgb2YKKyAqCQkJdGhlIGxpc3RlbmVyOworICoJCQlyZXR1cm4gY29kZSBpcyB0aGUgc2l6ZSBpbiBieXRlcyBvZiB0aGUgc3RyaW5nCisgKglPbiBlcnJvcjoJcmV0dXJuIGNvZGUgaXMgYSBuZWdhdGl2ZSBlcnJubyB2YWx1ZQorICoKKyAqIE9SCisgKgorICogSW5wdXQ6CisgKgkJCWJ1ZjoJCUMgc3RyaW5nIGNvbnRhaW5pbmcgYSAiLSIgZm9sbG93ZWQKKyAqCQkJCQlieSBhbiBpbnRlZ2VyIHZhbHVlIHJlcHJlc2VudGluZyBhCisgKgkJCQkJcHJldmlvdXNseSBwYXNzZWQgaW4gc29ja2V0IGZpbGUKKyAqCQkJCQlkZXNjcmlwdG9yCisgKgkJCXNpemU6CQlub24temVybyBsZW5ndGggb2YgQyBzdHJpbmcgaW4gQGJ1ZgorICogT3V0cHV0OgorICoJT24gc3VjY2VzczoJTkZTIHNlcnZpY2Ugbm8gbG9uZ2VyIGxpc3RlbnMgb24gdGhhdCBzb2NrZXQ7CisgKgkJCXBhc3NlZC1pbiBidWZmZXIgZmlsbGVkIHdpdGggYSAnXG4nLXRlcm1pbmF0ZWQgQworICoJCQlzdHJpbmcgY29udGFpbmluZyBhIHVuaXF1ZSBuYW1lIG9mIHRoZSBsaXN0ZW5lcjsKKyAqCQkJcmV0dXJuIGNvZGUgaXMgdGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIHN0cmluZworICoJT24gZXJyb3I6CXJldHVybiBjb2RlIGlzIGEgbmVnYXRpdmUgZXJybm8gdmFsdWUKKyAqCisgKiBPUgorICoKKyAqIElucHV0OgorICoJCQlidWY6CQlDIHN0cmluZyBjb250YWluaW5nIGEgdHJhbnNwb3J0CisgKgkJCQkJbmFtZSBhbmQgYW4gdW5zaWduZWQgaW50ZWdlciB2YWx1ZQorICoJCQkJCXJlcHJlc2VudGluZyB0aGUgcG9ydCB0byBsaXN0ZW4gb24sCisgKgkJCQkJc2VwYXJhdGVkIGJ5IHdoaXRlc3BhY2UKKyAqCQkJc2l6ZToJCW5vbi16ZXJvIGxlbmd0aCBvZiBDIHN0cmluZyBpbiBAYnVmCisgKiBPdXRwdXQ6CisgKglPbiBzdWNjZXNzOglyZXR1cm5zIHplcm87IE5GUyBzZXJ2aWNlIGlzIHN0YXJ0ZWQKKyAqCU9uIGVycm9yOglyZXR1cm4gY29kZSBpcyBhIG5lZ2F0aXZlIGVycm5vIHZhbHVlCisgKgorICogT1IKKyAqCisgKiBJbnB1dDoKKyAqCQkJYnVmOgkJQyBzdHJpbmcgY29udGFpbmluZyBhICItIiBmb2xsb3dlZAorICoJCQkJCWJ5IGEgdHJhbnNwb3J0IG5hbWUgYW5kIGFuIHVuc2lnbmVkCisgKgkJCQkJaW50ZWdlciB2YWx1ZSByZXByZXNlbnRpbmcgdGhlIHBvcnQKKyAqCQkJCQl0byBsaXN0ZW4gb24sIHNlcGFyYXRlZCBieSB3aGl0ZXNwYWNlCisgKgkJCXNpemU6CQlub24temVybyBsZW5ndGggb2YgQyBzdHJpbmcgaW4gQGJ1ZgorICogT3V0cHV0OgorICoJT24gc3VjY2VzczoJcmV0dXJucyB6ZXJvOyBORlMgc2VydmljZSBubyBsb25nZXIgbGlzdGVucworICoJCQlvbiB0aGF0IHRyYW5zcG9ydAorICoJT24gZXJyb3I6CXJldHVybiBjb2RlIGlzIGEgbmVnYXRpdmUgZXJybm8gdmFsdWUKKyAqLwogc3RhdGljIHNzaXplX3Qgd3JpdGVfcG9ydHMoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgKmJ1Ziwgc2l6ZV90IHNpemUpCiB7CiAJc3NpemVfdCBydjsKQEAgLTcwMCw2ICsxMDYwLDI3IEBACiAKIGludCBuZnNkX21heF9ibGtzaXplOwogCisvKioKKyAqIHdyaXRlX21heGJsa3NpemUgLSBTZXQgb3IgcmVwb3J0IHRoZSBjdXJyZW50IE5GUyBibGtzaXplCisgKgorICogSW5wdXQ6CisgKgkJCWJ1ZjoJCWlnbm9yZWQKKyAqCQkJc2l6ZToJCXplcm8KKyAqCisgKiBPUgorICoKKyAqIElucHV0OgorICogCQkJYnVmOgkJQyBzdHJpbmcgY29udGFpbmluZyBhbiB1bnNpZ25lZAorICogCQkJCQlpbnRlZ2VyIHZhbHVlIHJlcHJlc2VudGluZyB0aGUgbmV3CisgKiAJCQkJCU5GUyBibGtzaXplCisgKgkJCXNpemU6CQlub24temVybyBsZW5ndGggb2YgQyBzdHJpbmcgaW4gQGJ1ZgorICogT3V0cHV0OgorICoJT24gc3VjY2VzczoJcGFzc2VkLWluIGJ1ZmZlciBmaWxsZWQgd2l0aCAnXG4nLXRlcm1pbmF0ZWQgQyBzdHJpbmcKKyAqCQkJY29udGFpbmluZyBudW1lcmljIHZhbHVlIG9mIHRoZSBjdXJyZW50IE5GUyBibGtzaXplCisgKgkJCXNldHRpbmc7CisgKgkJCXJldHVybiBjb2RlIGlzIHRoZSBzaXplIGluIGJ5dGVzIG9mIHRoZSBzdHJpbmcKKyAqCU9uIGVycm9yOglyZXR1cm4gY29kZSBpcyB6ZXJvIG9yIGEgbmVnYXRpdmUgZXJybm8gdmFsdWUKKyAqLwogc3RhdGljIHNzaXplX3Qgd3JpdGVfbWF4Ymxrc2l6ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSkKIHsKIAljaGFyICptZXNnID0gYnVmOwpAQCAtNzUyLDYgKzExMzMsMjcgQEAKIAlyZXR1cm4gc3RybGVuKGJ1Zik7CiB9CiAKKy8qKgorICogd3JpdGVfbGVhc2V0aW1lIC0gU2V0IG9yIHJlcG9ydCB0aGUgY3VycmVudCBORlN2NCBsZWFzZSB0aW1lCisgKgorICogSW5wdXQ6CisgKgkJCWJ1ZjoJCWlnbm9yZWQKKyAqCQkJc2l6ZToJCXplcm8KKyAqCisgKiBPUgorICoKKyAqIElucHV0OgorICoJCQlidWY6CQlDIHN0cmluZyBjb250YWluaW5nIGFuIHVuc2lnbmVkCisgKgkJCQkJaW50ZWdlciB2YWx1ZSByZXByZXNlbnRpbmcgdGhlIG5ldworICoJCQkJCU5GU3Y0IGxlYXNlIGV4cGlyeSB0aW1lCisgKgkJCXNpemU6CQlub24temVybyBsZW5ndGggb2YgQyBzdHJpbmcgaW4gQGJ1ZgorICogT3V0cHV0OgorICoJT24gc3VjY2VzczoJcGFzc2VkLWluIGJ1ZmZlciBmaWxsZWQgd2l0aCAnXG4nLXRlcm1pbmF0ZWQgQworICoJCQlzdHJpbmcgY29udGFpbmluZyB1bnNpZ25lZCBpbnRlZ2VyIHZhbHVlIG9mIHRoZQorICoJCQljdXJyZW50IGxlYXNlIGV4cGlyeSB0aW1lOworICoJCQlyZXR1cm4gY29kZSBpcyB0aGUgc2l6ZSBpbiBieXRlcyBvZiB0aGUgc3RyaW5nCisgKglPbiBlcnJvcjoJcmV0dXJuIGNvZGUgaXMgemVybyBvciBhIG5lZ2F0aXZlIGVycm5vIHZhbHVlCisgKi8KIHN0YXRpYyBzc2l6ZV90IHdyaXRlX2xlYXNldGltZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSkKIHsKIAlzc2l6ZV90IHJ2OwpAQCAtNzg4LDYgKzExOTAsMjcgQEAKIAlyZXR1cm4gc3RybGVuKGJ1Zik7CiB9CiAKKy8qKgorICogd3JpdGVfcmVjb3ZlcnlkaXIgLSBTZXQgb3IgcmVwb3J0IHRoZSBwYXRobmFtZSBvZiB0aGUgcmVjb3ZlcnkgZGlyZWN0b3J5CisgKgorICogSW5wdXQ6CisgKgkJCWJ1ZjoJCWlnbm9yZWQKKyAqCQkJc2l6ZToJCXplcm8KKyAqCisgKiBPUgorICoKKyAqIElucHV0OgorICoJCQlidWY6CQlDIHN0cmluZyBjb250YWluaW5nIHRoZSBwYXRobmFtZQorICoJCQkJCW9mIHRoZSBkaXJlY3Rvcnkgb24gYSBsb2NhbCBmaWxlCisgKgkJCQkJc3lzdGVtIGNvbnRhaW5pbmcgcGVybWFuZW50IE5GU3Y0CisgKgkJCQkJcmVjb3ZlcnkgZGF0YQorICoJCQlzaXplOgkJbm9uLXplcm8gbGVuZ3RoIG9mIEMgc3RyaW5nIGluIEBidWYKKyAqIE91dHB1dDoKKyAqCU9uIHN1Y2Nlc3M6CXBhc3NlZC1pbiBidWZmZXIgZmlsbGVkIHdpdGggJ1xuJy10ZXJtaW5hdGVkIEMgc3RyaW5nCisgKgkJCWNvbnRhaW5pbmcgdGhlIGN1cnJlbnQgcmVjb3ZlcnkgcGF0aG5hbWUgc2V0dGluZzsKKyAqCQkJcmV0dXJuIGNvZGUgaXMgdGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIHN0cmluZworICoJT24gZXJyb3I6CXJldHVybiBjb2RlIGlzIHplcm8gb3IgYSBuZWdhdGl2ZSBlcnJubyB2YWx1ZQorICovCiBzdGF0aWMgc3NpemVfdCB3cml0ZV9yZWNvdmVyeWRpcihzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSkKIHsKIAlzc2l6ZV90IHJ2OwpkaWZmIC0tZ2l0IGEvZnMvbmZzZC9uZnNmaC5jIGIvZnMvbmZzZC9uZnNmaC5jCmluZGV4IGYwZGE3ZDkuLjlmMWNhMTcgMTAwNjQ0Ci0tLSBhL2ZzL25mc2QvbmZzZmguYworKysgYi9mcy9uZnNkL25mc2ZoLmMKQEAgLTI1OCwxNCArMjU4LDMyIEBACiAJcmV0dXJuIGVycm9yOwogfQogCi0vKgotICogUGVyZm9ybSBzYW5pdHkgY2hlY2tzIG9uIHRoZSBkZW50cnkgaW4gYSBjbGllbnQncyBmaWxlIGhhbmRsZS4KKy8qKgorICogZmhfdmVyaWZ5IC0gZmlsZWhhbmRsZSBsb29rdXAgYW5kIGFjY2VzcyBjaGVja2luZworICogQHJxc3RwOiBwb2ludGVyIHRvIGN1cnJlbnQgcnBjIHJlcXVlc3QKKyAqIEBmaHA6IGZpbGVoYW5kbGUgdG8gYmUgdmVyaWZpZWQKKyAqIEB0eXBlOiBleHBlY3RlZCB0eXBlIG9mIG9iamVjdCBwb2ludGVkIHRvIGJ5IGZpbGVoYW5kbGUKKyAqIEBhY2Nlc3M6IHR5cGUgb2YgYWNjZXNzIG5lZWRlZCB0byBvYmplY3QKICAqCi0gKiBOb3RlIHRoYXQgdGhlIGZpbGUgaGFuZGxlIGRlbnRyeSBtYXkgbmVlZCB0byBiZSBmcmVlZCBldmVuIGFmdGVyCi0gKiBhbiBlcnJvciByZXR1cm4uCisgKiBMb29rIHVwIGEgZGVudHJ5IGZyb20gdGhlIG9uLXRoZS13aXJlIGZpbGVoYW5kbGUsIGNoZWNrIHRoZSBjbGllbnQncworICogYWNjZXNzIHRvIHRoZSBleHBvcnQsIGFuZCBzZXQgdGhlIGN1cnJlbnQgdGFzaydzIGNyZWRlbnRpYWxzLgogICoKLSAqIFRoaXMgaXMgb25seSBjYWxsZWQgYXQgdGhlIHN0YXJ0IG9mIGFuIG5mc3Byb2MgY2FsbCwgc28gZmhwIHBvaW50cyB0bwotICogYSBzdmNfZmggd2hpY2ggaXMgYWxsIDAgZXhjZXB0IGZvciB0aGUgb3Zlci10aGUtd2lyZSBmaWxlIGhhbmRsZS4KKyAqIFJlZ2FyZGxlc3Mgb2Ygc3VjY2VzcyBvciBmYWlsdXJlIG9mIGZoX3ZlcmlmeSgpLCBmaF9wdXQoKSBzaG91bGQgYmUKKyAqIGNhbGxlZCBvbiBAZmhwIHdoZW4gdGhlIGNhbGxlciBpcyBmaW5pc2hlZCB3aXRoIHRoZSBmaWxlaGFuZGxlLgorICoKKyAqIGZoX3ZlcmlmeSgpIG1heSBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMgb24gYSBnaXZlbiBmaWxlaGFuZGxlLCBmb3IKKyAqIGV4YW1wbGUsIHdoZW4gcHJvY2Vzc2luZyBhbiBORlN2NCBjb21wb3VuZC4gIFRoZSBmaXJzdCBjYWxsIHdpbGwgbG9vaworICogdXAgYSBkZW50cnkgdXNpbmcgdGhlIG9uLXRoZS13aXJlIGZpbGVoYW5kbGUuICBTdWJzZXF1ZW50IGNhbGxzIHdpbGwKKyAqIHNraXAgdGhlIGxvb2t1cCBhbmQganVzdCBwZXJmb3JtIHRoZSBvdGhlciBjaGVja3MgYW5kIHBvc3NpYmx5IGNoYW5nZQorICogdGhlIGN1cnJlbnQgdGFzaydzIGNyZWRlbnRpYWxzLgorICoKKyAqIEB0eXBlIHNwZWNpZmllcyB0aGUgdHlwZSBvZiBvYmplY3QgZXhwZWN0ZWQgdXNpbmcgb25lIG9mIHRoZSBTX0lGKgorICogY29uc3RhbnRzIGRlZmluZWQgaW4gaW5jbHVkZS9saW51eC9zdGF0LmguICBUaGUgY2FsbGVyIG1heSB1c2UgemVybworICogdG8gaW5kaWNhdGUgdGhhdCBpdCBkb2Vzbid0IGNhcmUsIG9yIGEgbmVnYXRpdmUgaW50ZWdlciB0byBpbmRpY2F0ZQorICogdGhhdCBpdCBleHBlY3RzIHNvbWV0aGluZyBub3Qgb2YgdGhlIGdpdmVuIHR5cGUuCisgKgorICogQGFjY2VzcyBpcyBmb3JtZWQgZnJvbSB0aGUgTkZTRF9NQVlfKiBjb25zdGFudHMgZGVmaW5lZCBpbgorICogaW5jbHVkZS9saW51eC9uZnNkL25mc2QuaC4KICAqLwogX19iZTMyCiBmaF92ZXJpZnkoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IHN2Y19maCAqZmhwLCBpbnQgdHlwZSwgaW50IGFjY2VzcykKQEAgLTQ2Niw2ICs0ODQsOCBAQAogCQkJCWdvdG8gcmV0cnk7CiAJCQlicmVhazsKIAkJfQorCX0gZWxzZSBpZiAoZXhwLT5leF9mbGFncyAmIE5GU0VYUF9GU0lEKSB7CisJCWZzaWRfdHlwZSA9IEZTSURfTlVNOwogCX0gZWxzZSBpZiAoZXhwLT5leF91dWlkKSB7CiAJCWlmIChmaHAtPmZoX21heHNpemUgPj0gNjQpIHsKIAkJCWlmIChyb290X2V4cG9ydCkKQEAgLTQ3OCw5ICs0OTgsNyBAQAogCQkJZWxzZQogCQkJCWZzaWRfdHlwZSA9IEZTSURfVVVJRDRfSU5VTTsKIAkJfQotCX0gZWxzZSBpZiAoZXhwLT5leF9mbGFncyAmIE5GU0VYUF9GU0lEKQotCQlmc2lkX3R5cGUgPSBGU0lEX05VTTsKLQllbHNlIGlmICghb2xkX3ZhbGlkX2RldihleF9kZXYpKQorCX0gZWxzZSBpZiAoIW9sZF92YWxpZF9kZXYoZXhfZGV2KSkKIAkJLyogZm9yIG5ld2VyIGRldmljZSBudW1iZXJzLCB3ZSBtdXN0IHVzZSBhIG5ld2VyIGZzaWQgZm9ybWF0ICovCiAJCWZzaWRfdHlwZSA9IEZTSURfRU5DT0RFX0RFVjsKIAllbHNlCmRpZmYgLS1naXQgYS9mcy9uZnNkL25mc3Byb2MuYyBiL2ZzL25mc2QvbmZzcHJvYy5jCmluZGV4IDVjZmZlY2EuLjZmN2YyNjMgMTAwNjQ0Ci0tLSBhL2ZzL25mc2QvbmZzcHJvYy5jCisrKyBiL2ZzL25mc2QvbmZzcHJvYy5jCkBAIC02MjIsNiArNjIyLDcgQEAKIAkJeyBuZnNlcnJfYmFkbmFtZSwgLUVTUkNIIH0sCiAJCXsgbmZzZXJyX2lvLCAtRVRYVEJTWSB9LAogCQl7IG5mc2Vycl9ub3RzdXBwLCAtRU9QTk9UU1VQUCB9LAorCQl7IG5mc2Vycl90b29zbWFsbCwgLUVUT09TTUFMTCB9LAogCX07CiAJaW50CWk7CiAKZGlmZiAtLWdpdCBhL2ZzL25mc2QvdmZzLmMgYi9mcy9uZnNkL3Zmcy5jCmluZGV4IDQ0YWE5MmEuLjZlNTBhYWEgMTAwNjQ0Ci0tLSBhL2ZzL25mc2QvdmZzLmMKKysrIGIvZnMvbmZzZC92ZnMuYwpAQCAtNzQ0LDE2ICs3NDQsNDQgQEAKIAlmcHV0KGZpbHApOwogfQogCisvKgorICogU3luYyBhIGZpbGUKKyAqIEFzIHRoaXMgY2FsbHMgZnN5bmMgKG5vdCBmZGF0YXN5bmMpIHRoZXJlIGlzIG5vIG5lZWQgZm9yIGEgd3JpdGVfaW5vZGUKKyAqIGFmdGVyIGl0LgorICovCitzdGF0aWMgaW5saW5lIGludCBuZnNkX2Rvc3luYyhzdHJ1Y3QgZmlsZSAqZmlscCwgc3RydWN0IGRlbnRyeSAqZHAsCisJCQkgICAgICBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zICpmb3ApCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGRwLT5kX2lub2RlOworCWludCAoKmZzeW5jKSAoc3RydWN0IGZpbGUgKiwgc3RydWN0IGRlbnRyeSAqLCBpbnQpOworCWludCBlcnI7CisKKwllcnIgPSBmaWxlbWFwX2ZkYXRhd3JpdGUoaW5vZGUtPmlfbWFwcGluZyk7CisJaWYgKGVyciA9PSAwICYmIGZvcCAmJiAoZnN5bmMgPSBmb3AtPmZzeW5jKSkKKwkJZXJyID0gZnN5bmMoZmlscCwgZHAsIDApOworCWlmIChlcnIgPT0gMCkKKwkJZXJyID0gZmlsZW1hcF9mZGF0YXdhaXQoaW5vZGUtPmlfbWFwcGluZyk7CisKKwlyZXR1cm4gZXJyOworfQorCiBzdGF0aWMgaW50CiBuZnNkX3N5bmMoc3RydWN0IGZpbGUgKmZpbHApCiB7Ci0JcmV0dXJuIHZmc19mc3luYyhmaWxwLCBmaWxwLT5mX3BhdGguZGVudHJ5LCAwKTsKKyAgICAgICAgaW50IGVycjsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlscC0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZTsKKwlkcHJpbnRrKCJuZnNkOiBzeW5jIGZpbGUgJXNcbiIsIGZpbHAtPmZfcGF0aC5kZW50cnktPmRfbmFtZS5uYW1lKTsKKwltdXRleF9sb2NrKCZpbm9kZS0+aV9tdXRleCk7CisJZXJyPW5mc2RfZG9zeW5jKGZpbHAsIGZpbHAtPmZfcGF0aC5kZW50cnksIGZpbHAtPmZfb3ApOworCW11dGV4X3VubG9jaygmaW5vZGUtPmlfbXV0ZXgpOworCisJcmV0dXJuIGVycjsKIH0KIAogaW50Ci1uZnNkX3N5bmNfZGlyKHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKK25mc2Rfc3luY19kaXIoc3RydWN0IGRlbnRyeSAqZHApCiB7Ci0JcmV0dXJuIHZmc19mc3luYyhOVUxMLCBkZW50cnksIDApOworCXJldHVybiBuZnNkX2Rvc3luYyhOVUxMLCBkcCwgZHAtPmRfaW5vZGUtPmlfZm9wKTsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL2ZzL25vdGlmeS9pbm90aWZ5L2lub3RpZnlfdXNlci5jIGIvZnMvbm90aWZ5L2lub3RpZnkvaW5vdGlmeV91c2VyLmMKaW5kZXggODFiODY0NC4uZDUzYTE4MyAxMDA2NDQKLS0tIGEvZnMvbm90aWZ5L2lub3RpZnkvaW5vdGlmeV91c2VyLmMKKysrIGIvZnMvbm90aWZ5L2lub3RpZnkvaW5vdGlmeV91c2VyLmMKQEAgLTU3Niw3ICs1NzYsNyBAQAogCS5kZXN0cm95X3dhdGNoCT0gZnJlZV9pbm90aWZ5X3VzZXJfd2F0Y2gsCiB9OwogCi1hc21saW5rYWdlIGxvbmcgc3lzX2lub3RpZnlfaW5pdDEoaW50IGZsYWdzKQorU1lTQ0FMTF9ERUZJTkUxKGlub3RpZnlfaW5pdDEsIGludCwgZmxhZ3MpCiB7CiAJc3RydWN0IGlub3RpZnlfZGV2aWNlICpkZXY7CiAJc3RydWN0IGlub3RpZnlfaGFuZGxlICppaDsKQEAgLTY1NSwxMiArNjU1LDEzIEBACiAJcmV0dXJuIHJldDsKIH0KIAotYXNtbGlua2FnZSBsb25nIHN5c19pbm90aWZ5X2luaXQodm9pZCkKK1NZU0NBTExfREVGSU5FMChpbm90aWZ5X2luaXQpCiB7CiAJcmV0dXJuIHN5c19pbm90aWZ5X2luaXQxKDApOwogfQogCi1hc21saW5rYWdlIGxvbmcgc3lzX2lub3RpZnlfYWRkX3dhdGNoKGludCBmZCwgY29uc3QgY2hhciBfX3VzZXIgKnBhdGhuYW1lLCB1MzIgbWFzaykKK1NZU0NBTExfREVGSU5FMyhpbm90aWZ5X2FkZF93YXRjaCwgaW50LCBmZCwgY29uc3QgY2hhciBfX3VzZXIgKiwgcGF0aG5hbWUsCisJCXUzMiwgbWFzaykKIHsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlOwogCXN0cnVjdCBpbm90aWZ5X2RldmljZSAqZGV2OwpAQCAtNzA0LDcgKzcwNSw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotYXNtbGlua2FnZSBsb25nIHN5c19pbm90aWZ5X3JtX3dhdGNoKGludCBmZCwgX19zMzIgd2QpCitTWVNDQUxMX0RFRklORTIoaW5vdGlmeV9ybV93YXRjaCwgaW50LCBmZCwgX19zMzIsIHdkKQogewogCXN0cnVjdCBmaWxlICpmaWxwOwogCXN0cnVjdCBpbm90aWZ5X2RldmljZSAqZGV2OwpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvYWxsb2MuYyBiL2ZzL29jZnMyL2FsbG9jLmMKaW5kZXggNTRmZjRjNzcuLmQ4NjEwOTZjIDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9hbGxvYy5jCisrKyBiL2ZzL29jZnMyL2FsbG9jLmMKQEAgLTM4NjgsNyArMzg2OCw3IEBACiAJc3RydWN0IG9jZnMyX2V4dGVudF9saXN0ICpsZWZ0X2VsID0gTlVMTCwgKnJpZ2h0X2VsLCAqaW5zZXJ0X2VsLCAqZWw7CiAJc3RydWN0IG9jZnMyX2V4dGVudF9yZWMgKnJlYywgKnRtcHJlYzsKIAotCXJpZ2h0X2VsID0gcGF0aF9sZWFmX2VsKHJpZ2h0X3BhdGgpOzsKKwlyaWdodF9lbCA9IHBhdGhfbGVhZl9lbChyaWdodF9wYXRoKTsKIAlpZiAobGVmdF9wYXRoKQogCQlsZWZ0X2VsID0gcGF0aF9sZWFmX2VsKGxlZnRfcGF0aCk7CiAKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2NsdXN0ZXIvaGVhcnRiZWF0LmMgYi9mcy9vY2ZzMi9jbHVzdGVyL2hlYXJ0YmVhdC5jCmluZGV4IDZlYmFhNTguLjA0Njk3YmEgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL2NsdXN0ZXIvaGVhcnRiZWF0LmMKKysrIGIvZnMvb2NmczIvY2x1c3Rlci9oZWFydGJlYXQuYwpAQCAtODU0LDcgKzg1NCw3IEBACiAKIAl3aGlsZSAoIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSAmJiAhcmVnLT5ocl91bmNsZWFuX3N0b3ApIHsKIAkJLyogV2UgdHJhY2sgdGhlIHRpbWUgc3BlbnQgaW5zaWRlCi0JCSAqIG8yaGJfZG9fZGlza19oZWFydGJlYXQgc28gdGhhdCB3ZSBhdm9pZCBtb3JlIHRoZW4KKwkJICogbzJoYl9kb19kaXNrX2hlYXJ0YmVhdCBzbyB0aGF0IHdlIGF2b2lkIG1vcmUgdGhhbgogCQkgKiBocl90aW1lb3V0X21zIGJldHdlZW4gZGlzayB3cml0ZXMuIE9uIGJ1c3kgc3lzdGVtcwogCQkgKiB0aGlzIHNob3VsZCByZXN1bHQgaW4gYSBoZWFydGJlYXQgd2hpY2ggaXMgbGVzcwogCQkgKiBsaWtlbHkgdG8gdGltZSBpdHNlbGYgb3V0LiAqLwpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvZGxtZ2x1ZS5jIGIvZnMvb2NmczIvZGxtZ2x1ZS5jCmluZGV4IGY3MzFhYjQuLmIwYzRjYWQgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL2RsbWdsdWUuYworKysgYi9mcy9vY2ZzMi9kbG1nbHVlLmMKQEAgLTEzMjQsNyArMTMyNCw3IEBACiAJCQlnb3RvIG91dDsKIAkJfQogCi0JCW1sb2coMCwgImxvY2sgJXMsIHN1Y2Nlc3NmdWxsIHJldHVybiBmcm9tIG9jZnMyX2RsbV9sb2NrXG4iLAorCQltbG9nKDAsICJsb2NrICVzLCBzdWNjZXNzZnVsIHJldHVybiBmcm9tIG9jZnMyX2RsbV9sb2NrXG4iLAogCQkgICAgIGxvY2tyZXMtPmxfbmFtZSk7CiAKIAkJLyogQXQgdGhpcyBwb2ludCB3ZSd2ZSBnb25lIGluc2lkZSB0aGUgZGxtIGFuZCBuZWVkIHRvCkBAIC0yOTUxLDcgKzI5NTEsNyBAQAogCQlvY2ZzMl9kbG1fZHVtcF9sa3NiKCZsb2NrcmVzLT5sX2xrc2IpOwogCQlCVUcoKTsKIAl9Ci0JbWxvZygwLCAibG9jayAlcywgc3VjY2Vzc2Z1bGwgcmV0dXJuIGZyb20gb2NmczJfZGxtX3VubG9ja1xuIiwKKwltbG9nKDAsICJsb2NrICVzLCBzdWNjZXNzZnVsIHJldHVybiBmcm9tIG9jZnMyX2RsbV91bmxvY2tcbiIsCiAJICAgICBsb2NrcmVzLT5sX25hbWUpOwogCiAJb2NmczJfd2FpdF9vbl9idXN5X2xvY2sobG9ja3Jlcyk7CmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9maWxlLmMgYi9mcy9vY2ZzMi9maWxlLmMKaW5kZXggZThmNzk1Zi4uYTU4ODdkZiAxMDA2NDQKLS0tIGEvZnMvb2NmczIvZmlsZS5jCisrKyBiL2ZzL29jZnMyL2ZpbGUuYwpAQCAtMTYwNSw3ICsxNjA1LDcgQEAKIAkJCSAgICBzdHJ1Y3Qgb2NmczJfc3BhY2VfcmVzdiAqc3IpCiB7CiAJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGU7Ci0Jc3RydWN0IG9jZnMyX3N1cGVyICpvc2IgPSBPQ0ZTMl9TQihpbm9kZS0+aV9zYik7OworCXN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiID0gT0NGUzJfU0IoaW5vZGUtPmlfc2IpOwogCiAJaWYgKChjbWQgPT0gT0NGUzJfSU9DX1JFU1ZTUCB8fCBjbWQgPT0gT0NGUzJfSU9DX1JFU1ZTUDY0KSAmJgogCSAgICAhb2NmczJfd3JpdGVzX3Vud3JpdHRlbl9leHRlbnRzKG9zYikpCmRpZmYgLS1naXQgYS9mcy9vcGVuLmMgYi9mcy9vcGVuLmMKaW5kZXggZDg4MmZkMi4uYTNhNzhjZSAxMDA2NDQKLS0tIGEvZnMvb3Blbi5jCisrKyBiL2ZzL29wZW4uYwpAQCAtMTIyLDcgKzEyMiw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLWFzbWxpbmthZ2UgbG9uZyBzeXNfc3RhdGZzKGNvbnN0IGNoYXIgX191c2VyICpwYXRobmFtZSwgc3RydWN0IHN0YXRmcyBfX3VzZXIgKiBidWYpCitTWVNDQUxMX0RFRklORTIoc3RhdGZzLCBjb25zdCBjaGFyIF9fdXNlciAqLCBwYXRobmFtZSwgc3RydWN0IHN0YXRmcyBfX3VzZXIgKiwgYnVmKQogewogCXN0cnVjdCBwYXRoIHBhdGg7CiAJaW50IGVycm9yOwpAQCAtMTM4LDggKzEzOCw3IEBACiAJcmV0dXJuIGVycm9yOwogfQogCi0KLWFzbWxpbmthZ2UgbG9uZyBzeXNfc3RhdGZzNjQoY29uc3QgY2hhciBfX3VzZXIgKnBhdGhuYW1lLCBzaXplX3Qgc3osIHN0cnVjdCBzdGF0ZnM2NCBfX3VzZXIgKmJ1ZikKK1NZU0NBTExfREVGSU5FMyhzdGF0ZnM2NCwgY29uc3QgY2hhciBfX3VzZXIgKiwgcGF0aG5hbWUsIHNpemVfdCwgc3osIHN0cnVjdCBzdGF0ZnM2NCBfX3VzZXIgKiwgYnVmKQogewogCXN0cnVjdCBwYXRoIHBhdGg7CiAJbG9uZyBlcnJvcjsKQEAgLTE1Nyw4ICsxNTYsNyBAQAogCXJldHVybiBlcnJvcjsKIH0KIAotCi1hc21saW5rYWdlIGxvbmcgc3lzX2ZzdGF0ZnModW5zaWduZWQgaW50IGZkLCBzdHJ1Y3Qgc3RhdGZzIF9fdXNlciAqIGJ1ZikKK1NZU0NBTExfREVGSU5FMihmc3RhdGZzLCB1bnNpZ25lZCBpbnQsIGZkLCBzdHJ1Y3Qgc3RhdGZzIF9fdXNlciAqLCBidWYpCiB7CiAJc3RydWN0IGZpbGUgKiBmaWxlOwogCXN0cnVjdCBzdGF0ZnMgdG1wOwpAQCAtMTc2LDcgKzE3NCw3IEBACiAJcmV0dXJuIGVycm9yOwogfQogCi1hc21saW5rYWdlIGxvbmcgc3lzX2ZzdGF0ZnM2NCh1bnNpZ25lZCBpbnQgZmQsIHNpemVfdCBzeiwgc3RydWN0IHN0YXRmczY0IF9fdXNlciAqYnVmKQorU1lTQ0FMTF9ERUZJTkUzKGZzdGF0ZnM2NCwgdW5zaWduZWQgaW50LCBmZCwgc2l6ZV90LCBzeiwgc3RydWN0IHN0YXRmczY0IF9fdXNlciAqLCBidWYpCiB7CiAJc3RydWN0IGZpbGUgKiBmaWxlOwogCXN0cnVjdCBzdGF0ZnM2NCB0bXA7CkBAIC0yODksNyArMjg3LDcgQEAKIAlyZXR1cm4gZXJyb3I7CiB9CiAKLWFzbWxpbmthZ2UgbG9uZyBzeXNfdHJ1bmNhdGUoY29uc3QgY2hhciBfX3VzZXIgKiBwYXRoLCB1bnNpZ25lZCBsb25nIGxlbmd0aCkKK1NZU0NBTExfREVGSU5FMih0cnVuY2F0ZSwgY29uc3QgY2hhciBfX3VzZXIgKiwgcGF0aCwgdW5zaWduZWQgbG9uZywgbGVuZ3RoKQogewogCS8qIG9uIDMyLWJpdCBib3hlbiBpdCB3aWxsIGN1dCB0aGUgcmFuZ2UgMl4zMS0tMl4zMi0xIG9mZiAqLwogCXJldHVybiBkb19zeXNfdHJ1bmNhdGUocGF0aCwgKGxvbmcpbGVuZ3RoKTsKQEAgLTM0MSw3ICszMzksNyBAQAogCXJldHVybiBlcnJvcjsKIH0KIAotYXNtbGlua2FnZSBsb25nIHN5c19mdHJ1bmNhdGUodW5zaWduZWQgaW50IGZkLCB1bnNpZ25lZCBsb25nIGxlbmd0aCkKK1NZU0NBTExfREVGSU5FMihmdHJ1bmNhdGUsIHVuc2lnbmVkIGludCwgZmQsIHVuc2lnbmVkIGxvbmcsIGxlbmd0aCkKIHsKIAlsb25nIHJldCA9IGRvX3N5c19mdHJ1bmNhdGUoZmQsIGxlbmd0aCwgMSk7CiAJLyogYXZvaWQgUkVHUEFSTSBicmVha2FnZSBvbiB4ODY6ICovCkBAIC0zNTEsMjEgKzM0OSwzNSBAQAogCiAvKiBMRlMgdmVyc2lvbnMgb2YgdHJ1bmNhdGUgYXJlIG9ubHkgbmVlZGVkIG9uIDMyIGJpdCBtYWNoaW5lcyAqLwogI2lmIEJJVFNfUEVSX0xPTkcgPT0gMzIKLWFzbWxpbmthZ2UgbG9uZyBzeXNfdHJ1bmNhdGU2NChjb25zdCBjaGFyIF9fdXNlciAqIHBhdGgsIGxvZmZfdCBsZW5ndGgpCitTWVNDQUxMX0RFRklORSh0cnVuY2F0ZTY0KShjb25zdCBjaGFyIF9fdXNlciAqIHBhdGgsIGxvZmZfdCBsZW5ndGgpCiB7CiAJcmV0dXJuIGRvX3N5c190cnVuY2F0ZShwYXRoLCBsZW5ndGgpOwogfQorI2lmZGVmIENPTkZJR19IQVZFX1NZU0NBTExfV1JBUFBFUlMKK2FzbWxpbmthZ2UgbG9uZyBTeVNfdHJ1bmNhdGU2NChsb25nIHBhdGgsIGxvZmZfdCBsZW5ndGgpCit7CisJcmV0dXJuIFNZU0NfdHJ1bmNhdGU2NCgoY29uc3QgY2hhciBfX3VzZXIgKikgcGF0aCwgbGVuZ3RoKTsKK30KK1NZU0NBTExfQUxJQVMoc3lzX3RydW5jYXRlNjQsIFN5U190cnVuY2F0ZTY0KTsKKyNlbmRpZgogCi1hc21saW5rYWdlIGxvbmcgc3lzX2Z0cnVuY2F0ZTY0KHVuc2lnbmVkIGludCBmZCwgbG9mZl90IGxlbmd0aCkKK1NZU0NBTExfREVGSU5FKGZ0cnVuY2F0ZTY0KSh1bnNpZ25lZCBpbnQgZmQsIGxvZmZfdCBsZW5ndGgpCiB7CiAJbG9uZyByZXQgPSBkb19zeXNfZnRydW5jYXRlKGZkLCBsZW5ndGgsIDApOwogCS8qIGF2b2lkIFJFR1BBUk0gYnJlYWthZ2Ugb24geDg2OiAqLwogCWFzbWxpbmthZ2VfcHJvdGVjdCgyLCByZXQsIGZkLCBsZW5ndGgpOwogCXJldHVybiByZXQ7CiB9CisjaWZkZWYgQ09ORklHX0hBVkVfU1lTQ0FMTF9XUkFQUEVSUworYXNtbGlua2FnZSBsb25nIFN5U19mdHJ1bmNhdGU2NChsb25nIGZkLCBsb2ZmX3QgbGVuZ3RoKQoreworCXJldHVybiBTWVNDX2Z0cnVuY2F0ZTY0KCh1bnNpZ25lZCBpbnQpIGZkLCBsZW5ndGgpOworfQorU1lTQ0FMTF9BTElBUyhzeXNfZnRydW5jYXRlNjQsIFN5U19mdHJ1bmNhdGU2NCk7CiAjZW5kaWYKKyNlbmRpZiAvKiBCSVRTX1BFUl9MT05HID09IDMyICovCiAKLWFzbWxpbmthZ2UgbG9uZyBzeXNfZmFsbG9jYXRlKGludCBmZCwgaW50IG1vZGUsIGxvZmZfdCBvZmZzZXQsIGxvZmZfdCBsZW4pCitTWVNDQUxMX0RFRklORShmYWxsb2NhdGUpKGludCBmZCwgaW50IG1vZGUsIGxvZmZfdCBvZmZzZXQsIGxvZmZfdCBsZW4pCiB7CiAJc3RydWN0IGZpbGUgKmZpbGU7CiAJc3RydWN0IGlub2RlICppbm9kZTsKQEAgLTQyMiwxMyArNDM0LDIwIEBACiBvdXQ6CiAJcmV0dXJuIHJldDsKIH0KKyNpZmRlZiBDT05GSUdfSEFWRV9TWVNDQUxMX1dSQVBQRVJTCithc21saW5rYWdlIGxvbmcgU3lTX2ZhbGxvY2F0ZShsb25nIGZkLCBsb25nIG1vZGUsIGxvZmZfdCBvZmZzZXQsIGxvZmZfdCBsZW4pCit7CisJcmV0dXJuIFNZU0NfZmFsbG9jYXRlKChpbnQpZmQsIChpbnQpbW9kZSwgb2Zmc2V0LCBsZW4pOworfQorU1lTQ0FMTF9BTElBUyhzeXNfZmFsbG9jYXRlLCBTeVNfZmFsbG9jYXRlKTsKKyNlbmRpZgogCiAvKgogICogYWNjZXNzKCkgbmVlZHMgdG8gdXNlIHRoZSByZWFsIHVpZC9naWQsIG5vdCB0aGUgZWZmZWN0aXZlIHVpZC9naWQuCiAgKiBXZSBkbyB0aGlzIGJ5IHRlbXBvcmFyaWx5IGNsZWFyaW5nIGFsbCBGUy1yZWxhdGVkIGNhcGFiaWxpdGllcyBhbmQKICAqIHN3aXRjaGluZyB0aGUgZnN1aWQvZnNnaWQgYXJvdW5kIHRvIHRoZSByZWFsIG9uZXMuCiAgKi8KLWFzbWxpbmthZ2UgbG9uZyBzeXNfZmFjY2Vzc2F0KGludCBkZmQsIGNvbnN0IGNoYXIgX191c2VyICpmaWxlbmFtZSwgaW50IG1vZGUpCitTWVNDQUxMX0RFRklORTMoZmFjY2Vzc2F0LCBpbnQsIGRmZCwgY29uc3QgY2hhciBfX3VzZXIgKiwgZmlsZW5hbWUsIGludCwgbW9kZSkKIHsKIAljb25zdCBzdHJ1Y3QgY3JlZCAqb2xkX2NyZWQ7CiAJc3RydWN0IGNyZWQgKm92ZXJyaWRlX2NyZWQ7CkBAIC00OTgsMTIgKzUxNywxMiBAQAogCXJldHVybiByZXM7CiB9CiAKLWFzbWxpbmthZ2UgbG9uZyBzeXNfYWNjZXNzKGNvbnN0IGNoYXIgX191c2VyICpmaWxlbmFtZSwgaW50IG1vZGUpCitTWVNDQUxMX0RFRklORTIoYWNjZXNzLCBjb25zdCBjaGFyIF9fdXNlciAqLCBmaWxlbmFtZSwgaW50LCBtb2RlKQogewogCXJldHVybiBzeXNfZmFjY2Vzc2F0KEFUX0ZEQ1dELCBmaWxlbmFtZSwgbW9kZSk7CiB9CiAKLWFzbWxpbmthZ2UgbG9uZyBzeXNfY2hkaXIoY29uc3QgY2hhciBfX3VzZXIgKiBmaWxlbmFtZSkKK1NZU0NBTExfREVGSU5FMShjaGRpciwgY29uc3QgY2hhciBfX3VzZXIgKiwgZmlsZW5hbWUpCiB7CiAJc3RydWN0IHBhdGggcGF0aDsKIAlpbnQgZXJyb3I7CkBAIC01MjQsNyArNTQzLDcgQEAKIAlyZXR1cm4gZXJyb3I7CiB9CiAKLWFzbWxpbmthZ2UgbG9uZyBzeXNfZmNoZGlyKHVuc2lnbmVkIGludCBmZCkKK1NZU0NBTExfREVGSU5FMShmY2hkaXIsIHVuc2lnbmVkIGludCwgZmQpCiB7CiAJc3RydWN0IGZpbGUgKmZpbGU7CiAJc3RydWN0IGlub2RlICppbm9kZTsKQEAgLTU1MCw3ICs1NjksNyBAQAogCXJldHVybiBlcnJvcjsKIH0KIAotYXNtbGlua2FnZSBsb25nIHN5c19jaHJvb3QoY29uc3QgY2hhciBfX3VzZXIgKiBmaWxlbmFtZSkKK1NZU0NBTExfREVGSU5FMShjaHJvb3QsIGNvbnN0IGNoYXIgX191c2VyICosIGZpbGVuYW1lKQogewogCXN0cnVjdCBwYXRoIHBhdGg7CiAJaW50IGVycm9yOwpAQCAtNTc1LDcgKzU5NCw3IEBACiAJcmV0dXJuIGVycm9yOwogfQogCi1hc21saW5rYWdlIGxvbmcgc3lzX2ZjaG1vZCh1bnNpZ25lZCBpbnQgZmQsIG1vZGVfdCBtb2RlKQorU1lTQ0FMTF9ERUZJTkUyKGZjaG1vZCwgdW5zaWduZWQgaW50LCBmZCwgbW9kZV90LCBtb2RlKQogewogCXN0cnVjdCBpbm9kZSAqIGlub2RlOwogCXN0cnVjdCBkZW50cnkgKiBkZW50cnk7CkBAIC02MDksOCArNjI4LDcgQEAKIAlyZXR1cm4gZXJyOwogfQogCi1hc21saW5rYWdlIGxvbmcgc3lzX2ZjaG1vZGF0KGludCBkZmQsIGNvbnN0IGNoYXIgX191c2VyICpmaWxlbmFtZSwKLQkJCSAgICAgbW9kZV90IG1vZGUpCitTWVNDQUxMX0RFRklORTMoZmNobW9kYXQsIGludCwgZGZkLCBjb25zdCBjaGFyIF9fdXNlciAqLCBmaWxlbmFtZSwgbW9kZV90LCBtb2RlKQogewogCXN0cnVjdCBwYXRoIHBhdGg7CiAJc3RydWN0IGlub2RlICppbm9kZTsKQEAgLTYzOSw3ICs2NTcsNyBAQAogCXJldHVybiBlcnJvcjsKIH0KIAotYXNtbGlua2FnZSBsb25nIHN5c19jaG1vZChjb25zdCBjaGFyIF9fdXNlciAqZmlsZW5hbWUsIG1vZGVfdCBtb2RlKQorU1lTQ0FMTF9ERUZJTkUyKGNobW9kLCBjb25zdCBjaGFyIF9fdXNlciAqLCBmaWxlbmFtZSwgbW9kZV90LCBtb2RlKQogewogCXJldHVybiBzeXNfZmNobW9kYXQoQVRfRkRDV0QsIGZpbGVuYW1lLCBtb2RlKTsKIH0KQEAgLTY2OSw3ICs2ODcsNyBAQAogCXJldHVybiBlcnJvcjsKIH0KIAotYXNtbGlua2FnZSBsb25nIHN5c19jaG93bihjb25zdCBjaGFyIF9fdXNlciAqIGZpbGVuYW1lLCB1aWRfdCB1c2VyLCBnaWRfdCBncm91cCkKK1NZU0NBTExfREVGSU5FMyhjaG93biwgY29uc3QgY2hhciBfX3VzZXIgKiwgZmlsZW5hbWUsIHVpZF90LCB1c2VyLCBnaWRfdCwgZ3JvdXApCiB7CiAJc3RydWN0IHBhdGggcGF0aDsKIAlpbnQgZXJyb3I7CkBAIC02ODgsOCArNzA2LDggQEAKIAlyZXR1cm4gZXJyb3I7CiB9CiAKLWFzbWxpbmthZ2UgbG9uZyBzeXNfZmNob3duYXQoaW50IGRmZCwgY29uc3QgY2hhciBfX3VzZXIgKmZpbGVuYW1lLCB1aWRfdCB1c2VyLAotCQkJICAgICBnaWRfdCBncm91cCwgaW50IGZsYWcpCitTWVNDQUxMX0RFRklORTUoZmNob3duYXQsIGludCwgZGZkLCBjb25zdCBjaGFyIF9fdXNlciAqLCBmaWxlbmFtZSwgdWlkX3QsIHVzZXIsCisJCWdpZF90LCBncm91cCwgaW50LCBmbGFnKQogewogCXN0cnVjdCBwYXRoIHBhdGg7CiAJaW50IGVycm9yID0gLUVJTlZBTDsKQEAgLTcxMyw3ICs3MzEsNyBAQAogCXJldHVybiBlcnJvcjsKIH0KIAotYXNtbGlua2FnZSBsb25nIHN5c19sY2hvd24oY29uc3QgY2hhciBfX3VzZXIgKiBmaWxlbmFtZSwgdWlkX3QgdXNlciwgZ2lkX3QgZ3JvdXApCitTWVNDQUxMX0RFRklORTMobGNob3duLCBjb25zdCBjaGFyIF9fdXNlciAqLCBmaWxlbmFtZSwgdWlkX3QsIHVzZXIsIGdpZF90LCBncm91cCkKIHsKIAlzdHJ1Y3QgcGF0aCBwYXRoOwogCWludCBlcnJvcjsKQEAgLTczMiw4ICs3NTAsNyBAQAogCXJldHVybiBlcnJvcjsKIH0KIAotCi1hc21saW5rYWdlIGxvbmcgc3lzX2ZjaG93bih1bnNpZ25lZCBpbnQgZmQsIHVpZF90IHVzZXIsIGdpZF90IGdyb3VwKQorU1lTQ0FMTF9ERUZJTkUzKGZjaG93biwgdW5zaWduZWQgaW50LCBmZCwgdWlkX3QsIHVzZXIsIGdpZF90LCBncm91cCkKIHsKIAlzdHJ1Y3QgZmlsZSAqIGZpbGU7CiAJaW50IGVycm9yID0gLUVCQURGOwpAQCAtMTAyOSw3ICsxMDQ2LDcgQEAKIAlyZXR1cm4gZmQ7CiB9CiAKLWFzbWxpbmthZ2UgbG9uZyBzeXNfb3Blbihjb25zdCBjaGFyIF9fdXNlciAqZmlsZW5hbWUsIGludCBmbGFncywgaW50IG1vZGUpCitTWVNDQUxMX0RFRklORTMob3BlbiwgY29uc3QgY2hhciBfX3VzZXIgKiwgZmlsZW5hbWUsIGludCwgZmxhZ3MsIGludCwgbW9kZSkKIHsKIAlsb25nIHJldDsKIApAQCAtMTA0Miw4ICsxMDU5LDggQEAKIAlyZXR1cm4gcmV0OwogfQogCi1hc21saW5rYWdlIGxvbmcgc3lzX29wZW5hdChpbnQgZGZkLCBjb25zdCBjaGFyIF9fdXNlciAqZmlsZW5hbWUsIGludCBmbGFncywKLQkJCSAgIGludCBtb2RlKQorU1lTQ0FMTF9ERUZJTkU0KG9wZW5hdCwgaW50LCBkZmQsIGNvbnN0IGNoYXIgX191c2VyICosIGZpbGVuYW1lLCBpbnQsIGZsYWdzLAorCQlpbnQsIG1vZGUpCiB7CiAJbG9uZyByZXQ7CiAKQEAgLTEwNjIsNyArMTA3OSw3IEBACiAgKiBGb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eT8gIE1heWJlIHRoaXMgc2hvdWxkIGJlIG1vdmVkCiAgKiBpbnRvIGFyY2gvaTM4NiBpbnN0ZWFkPwogICovCi1hc21saW5rYWdlIGxvbmcgc3lzX2NyZWF0KGNvbnN0IGNoYXIgX191c2VyICogcGF0aG5hbWUsIGludCBtb2RlKQorU1lTQ0FMTF9ERUZJTkUyKGNyZWF0LCBjb25zdCBjaGFyIF9fdXNlciAqLCBwYXRobmFtZSwgaW50LCBtb2RlKQogewogCXJldHVybiBzeXNfb3BlbihwYXRobmFtZSwgT19DUkVBVCB8IE9fV1JPTkxZIHwgT19UUlVOQywgbW9kZSk7CiB9CkBAIC0xMDk4LDcgKzExMTUsNyBAQAogICogcmVsZWFzaW5nIHRoZSBmZC4gVGhpcyBlbnN1cmVzIHRoYXQgb25lIGNsb25lIHRhc2sgY2FuJ3QgcmVsZWFzZQogICogYW4gZmQgd2hpbGUgYW5vdGhlciBjbG9uZSBpcyBvcGVuaW5nIGl0LgogICovCi1hc21saW5rYWdlIGxvbmcgc3lzX2Nsb3NlKHVuc2lnbmVkIGludCBmZCkKK1NZU0NBTExfREVGSU5FMShjbG9zZSwgdW5zaWduZWQgaW50LCBmZCkKIHsKIAlzdHJ1Y3QgZmlsZSAqIGZpbHA7CiAJc3RydWN0IGZpbGVzX3N0cnVjdCAqZmlsZXMgPSBjdXJyZW50LT5maWxlczsKQEAgLTExMzEsMTQgKzExNDgsMTMgQEAKIAlzcGluX3VubG9jaygmZmlsZXMtPmZpbGVfbG9jayk7CiAJcmV0dXJuIC1FQkFERjsKIH0KLQogRVhQT1JUX1NZTUJPTChzeXNfY2xvc2UpOwogCiAvKgogICogVGhpcyByb3V0aW5lIHNpbXVsYXRlcyBhIGhhbmd1cCBvbiB0aGUgdHR5LCB0byBhcnJhbmdlIHRoYXQgdXNlcnMKICAqIGFyZSBnaXZlbiBjbGVhbiB0ZXJtaW5hbHMgYXQgbG9naW4gdGltZS4KICAqLwotYXNtbGlua2FnZSBsb25nIHN5c192aGFuZ3VwKHZvaWQpCitTWVNDQUxMX0RFRklORTAodmhhbmd1cCkKIHsKIAlpZiAoY2FwYWJsZShDQVBfU1lTX1RUWV9DT05GSUcpKSB7CiAJCXR0eV92aGFuZ3VwX3NlbGYoKTsKZGlmZiAtLWdpdCBhL2ZzL3BhcnRpdGlvbnMvY2hlY2suYyBiL2ZzL3BhcnRpdGlvbnMvY2hlY2suYwppbmRleCA1MTk4YWRhLi42ZDcyMDI0IDEwMDY0NAotLS0gYS9mcy9wYXJ0aXRpb25zL2NoZWNrLmMKKysrIGIvZnMvcGFydGl0aW9ucy9jaGVjay5jCkBAIC0zMzQsNiArMzM0LDcgQEAKIAogCWJsa19mcmVlX2RldnQocGFydF9kZXZ0KHBhcnQpKTsKIAlyY3VfYXNzaWduX3BvaW50ZXIocHRibC0+cGFydFtwYXJ0bm9dLCBOVUxMKTsKKwlyY3VfYXNzaWduX3BvaW50ZXIocHRibC0+bGFzdF9sb29rdXAsIE5VTEwpOwogCWtvYmplY3RfcHV0KHBhcnQtPmhvbGRlcl9kaXIpOwogCWRldmljZV9kZWwocGFydF90b19kZXYocGFydCkpOwogCmRpZmYgLS1naXQgYS9mcy9waXBlLmMgYi9mcy9waXBlLmMKaW5kZXggODkxNjk3MS4uM2E0OGJhNSAxMDA2NDQKLS0tIGEvZnMvcGlwZS5jCisrKyBiL2ZzL3BpcGUuYwpAQCAtMTA0Myw3ICsxMDQzLDcgQEAKICAqIHN5c19waXBlKCkgaXMgdGhlIG5vcm1hbCBDIGNhbGxpbmcgc3RhbmRhcmQgZm9yIGNyZWF0aW5nCiAgKiBhIHBpcGUuIEl0J3Mgbm90IHRoZSB3YXkgVW5peCB0cmFkaXRpb25hbGx5IGRvZXMgdGhpcywgdGhvdWdoLgogICovCi1hc21saW5rYWdlIGxvbmcgX193ZWFrIHN5c19waXBlMihpbnQgX191c2VyICpmaWxkZXMsIGludCBmbGFncykKK1NZU0NBTExfREVGSU5FMihwaXBlMiwgaW50IF9fdXNlciAqLCBmaWxkZXMsIGludCwgZmxhZ3MpCiB7CiAJaW50IGZkWzJdOwogCWludCBlcnJvcjsKQEAgLTEwNTksNyArMTA1OSw3IEBACiAJcmV0dXJuIGVycm9yOwogfQogCi1hc21saW5rYWdlIGxvbmcgX193ZWFrIHN5c19waXBlKGludCBfX3VzZXIgKmZpbGRlcykKK1NZU0NBTExfREVGSU5FMShwaXBlLCBpbnQgX191c2VyICosIGZpbGRlcykKIHsKIAlyZXR1cm4gc3lzX3BpcGUyKGZpbGRlcywgMCk7CiB9CmRpZmYgLS1naXQgYS9mcy9wcm9jL2Jhc2UuYyBiL2ZzL3Byb2MvYmFzZS5jCmluZGV4IDEwZmQ1MjIuLjBjOWRlMTkgMTAwNjQ0Ci0tLSBhL2ZzL3Byb2MvYmFzZS5jCisrKyBiL2ZzL3Byb2MvYmFzZS5jCkBAIC02NSw2ICs2NSw3IEBACiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9yY3VwZGF0ZS5oPgogI2luY2x1ZGUgPGxpbnV4L2thbGxzeW1zLmg+CisjaW5jbHVkZSA8bGludXgvc3RhY2t0cmFjZS5oPgogI2luY2x1ZGUgPGxpbnV4L3Jlc291cmNlLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvbW91bnQuaD4KQEAgLTEwOSwyNSArMTEwLDIyIEBACiAJLm9wICAgPSBPUCwJCQkJCVwKIH0KIAotI2RlZmluZSBESVIoTkFNRSwgTU9ERSwgT1RZUEUpCQkJCQkJCVwKLQlOT0QoTkFNRSwgKFNfSUZESVJ8KE1PREUpKSwJCQkJCQlcCi0JCSZwcm9jXyMjT1RZUEUjI19pbm9kZV9vcGVyYXRpb25zLCAmcHJvY18jI09UWVBFIyNfb3BlcmF0aW9ucywJXAotCQl7fSApCi0jZGVmaW5lIExOSyhOQU1FLCBPVFlQRSkJCQkJCVwKKyNkZWZpbmUgRElSKE5BTUUsIE1PREUsIGlvcHMsIGZvcHMpCVwKKwlOT0QoTkFNRSwgKFNfSUZESVJ8KE1PREUpKSwgJmlvcHMsICZmb3BzLCB7fSApCisjZGVmaW5lIExOSyhOQU1FLCBnZXRfbGluaykJCQkJCVwKIAlOT0QoTkFNRSwgKFNfSUZMTkt8U19JUldYVUdPKSwJCQkJXAogCQkmcHJvY19waWRfbGlua19pbm9kZV9vcGVyYXRpb25zLCBOVUxMLAkJXAotCQl7IC5wcm9jX2dldF9saW5rID0gJnByb2NfIyNPVFlQRSMjX2xpbmsgfSApCi0jZGVmaW5lIFJFRyhOQU1FLCBNT0RFLCBPVFlQRSkJCQkJXAotCU5PRChOQU1FLCAoU19JRlJFR3woTU9ERSkpLCBOVUxMLAkJXAotCQkmcHJvY18jI09UWVBFIyNfb3BlcmF0aW9ucywge30pCi0jZGVmaW5lIElORihOQU1FLCBNT0RFLCBPVFlQRSkJCQkJXAorCQl7IC5wcm9jX2dldF9saW5rID0gZ2V0X2xpbmsgfSApCisjZGVmaW5lIFJFRyhOQU1FLCBNT0RFLCBmb3BzKQkJCQlcCisJTk9EKE5BTUUsIChTX0lGUkVHfChNT0RFKSksIE5VTEwsICZmb3BzLCB7fSkKKyNkZWZpbmUgSU5GKE5BTUUsIE1PREUsIHJlYWQpCQkJCVwKIAlOT0QoTkFNRSwgKFNfSUZSRUd8KE1PREUpKSwgCQkJXAogCQlOVUxMLCAmcHJvY19pbmZvX2ZpbGVfb3BlcmF0aW9ucywJXAotCQl7IC5wcm9jX3JlYWQgPSAmcHJvY18jI09UWVBFIH0gKQotI2RlZmluZSBPTkUoTkFNRSwgTU9ERSwgT1RZUEUpCQkJCVwKKwkJeyAucHJvY19yZWFkID0gcmVhZCB9ICkKKyNkZWZpbmUgT05FKE5BTUUsIE1PREUsIHNob3cpCQkJCVwKIAlOT0QoTkFNRSwgKFNfSUZSRUd8KE1PREUpKSwgCQkJXAogCQlOVUxMLCAmcHJvY19zaW5nbGVfZmlsZV9vcGVyYXRpb25zLAlcCi0JCXsgLnByb2Nfc2hvdyA9ICZwcm9jXyMjT1RZUEUgfSApCisJCXsgLnByb2Nfc2hvdyA9IHNob3cgfSApCiAKIC8qCiAgKiBDb3VudCB0aGUgbnVtYmVyIG9mIGhhcmRsaW5rcyBmb3IgdGhlIHBpZF9lbnRyeSB0YWJsZSwgZXhjbHVkaW5nIHRoZSAuCkBAIC0zMDgsOSArMzA2LDkgQEAKIAlzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IGdldF90YXNrX21tKHRhc2spOwogCWlmIChtbSkgewogCQl1bnNpZ25lZCBpbnQgbndvcmRzID0gMDsKLQkJZG8KKwkJZG8gewogCQkJbndvcmRzICs9IDI7Ci0JCXdoaWxlIChtbS0+c2F2ZWRfYXV4dltud29yZHMgLSAyXSAhPSAwKTsgLyogQVRfTlVMTCAqLworCQl9IHdoaWxlIChtbS0+c2F2ZWRfYXV4dltud29yZHMgLSAyXSAhPSAwKTsgLyogQVRfTlVMTCAqLwogCQlyZXMgPSBud29yZHMgKiBzaXplb2YobW0tPnNhdmVkX2F1eHZbMF0pOwogCQlpZiAocmVzID4gUEFHRV9TSVpFKQogCQkJcmVzID0gUEFHRV9TSVpFOwpAQCAtMzQwLDYgKzMzOCwzNyBAQAogfQogI2VuZGlmIC8qIENPTkZJR19LQUxMU1lNUyAqLwogCisjaWZkZWYgQ09ORklHX1NUQUNLVFJBQ0UKKworI2RlZmluZSBNQVhfU1RBQ0tfVFJBQ0VfREVQVEgJNjQKKworc3RhdGljIGludCBwcm9jX3BpZF9zdGFjayhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHN0cnVjdCBwaWRfbmFtZXNwYWNlICpucywKKwkJCSAgc3RydWN0IHBpZCAqcGlkLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spCit7CisJc3RydWN0IHN0YWNrX3RyYWNlIHRyYWNlOworCXVuc2lnbmVkIGxvbmcgKmVudHJpZXM7CisJaW50IGk7CisKKwllbnRyaWVzID0ga21hbGxvYyhNQVhfU1RBQ0tfVFJBQ0VfREVQVEggKiBzaXplb2YoKmVudHJpZXMpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWVudHJpZXMpCisJCXJldHVybiAtRU5PTUVNOworCisJdHJhY2UubnJfZW50cmllcwk9IDA7CisJdHJhY2UubWF4X2VudHJpZXMJPSBNQVhfU1RBQ0tfVFJBQ0VfREVQVEg7CisJdHJhY2UuZW50cmllcwkJPSBlbnRyaWVzOworCXRyYWNlLnNraXAJCT0gMDsKKwlzYXZlX3N0YWNrX3RyYWNlX3Rzayh0YXNrLCAmdHJhY2UpOworCisJZm9yIChpID0gMDsgaSA8IHRyYWNlLm5yX2VudHJpZXM7IGkrKykgeworCQlzZXFfcHJpbnRmKG0sICJbPCVwPl0gJXBTXG4iLAorCQkJICAgKHZvaWQgKillbnRyaWVzW2ldLCAodm9pZCAqKWVudHJpZXNbaV0pOworCX0KKwlrZnJlZShlbnRyaWVzKTsKKworCXJldHVybiAwOworfQorI2VuZGlmCisKICNpZmRlZiBDT05GSUdfU0NIRURTVEFUUwogLyoKICAqIFByb3ZpZGVzIC9wcm9jL1BJRC9zY2hlZHN0YXQKQEAgLTExODYsOCArMTIxNSw2IEBACiAJc3RydWN0IGlub2RlICppbm9kZSA9IG0tPnByaXZhdGU7CiAJc3RydWN0IHRhc2tfc3RydWN0ICpwOwogCi0JV0FSTl9PTighaW5vZGUpOwotCiAJcCA9IGdldF9wcm9jX3Rhc2soaW5vZGUpOwogCWlmICghcCkKIAkJcmV0dXJuIC1FU1JDSDsKQEAgLTEyMDUsOCArMTIzMiw2IEBACiAJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGU7CiAJc3RydWN0IHRhc2tfc3RydWN0ICpwOwogCi0JV0FSTl9PTighaW5vZGUpOwotCiAJcCA9IGdldF9wcm9jX3Rhc2soaW5vZGUpOwogCWlmICghcCkKIAkJcmV0dXJuIC1FU1JDSDsKQEAgLTE5NzQsMTMgKzE5OTksMTEgQEAKIAkJCQkJIGNvbnN0IHN0cnVjdCBwaWRfZW50cnkgKmVudHMsCiAJCQkJCSB1bnNpZ25lZCBpbnQgbmVudHMpCiB7Ci0Jc3RydWN0IGlub2RlICppbm9kZTsKIAlzdHJ1Y3QgZGVudHJ5ICplcnJvcjsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2sgPSBnZXRfcHJvY190YXNrKGRpcik7CiAJY29uc3Qgc3RydWN0IHBpZF9lbnRyeSAqcCwgKmxhc3Q7CiAKIAllcnJvciA9IEVSUl9QVFIoLUVOT0VOVCk7Ci0JaW5vZGUgPSBOVUxMOwogCiAJaWYgKCF0YXNrKQogCQlnb3RvIG91dF9ub190YXNrOwpAQCAtMjEzNiwxMiArMjE1OSwxMiBAQAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBwaWRfZW50cnkgYXR0cl9kaXJfc3R1ZmZbXSA9IHsKLQlSRUcoImN1cnJlbnQiLCAgICBTX0lSVUdPfFNfSVdVR08sIHBpZF9hdHRyKSwKLQlSRUcoInByZXYiLCAgICAgICBTX0lSVUdPLAkgICBwaWRfYXR0ciksCi0JUkVHKCJleGVjIiwgICAgICAgU19JUlVHT3xTX0lXVUdPLCBwaWRfYXR0ciksCi0JUkVHKCJmc2NyZWF0ZSIsICAgU19JUlVHT3xTX0lXVUdPLCBwaWRfYXR0ciksCi0JUkVHKCJrZXljcmVhdGUiLCAgU19JUlVHT3xTX0lXVUdPLCBwaWRfYXR0ciksCi0JUkVHKCJzb2NrY3JlYXRlIiwgU19JUlVHT3xTX0lXVUdPLCBwaWRfYXR0ciksCisJUkVHKCJjdXJyZW50IiwgICAgU19JUlVHT3xTX0lXVUdPLCBwcm9jX3BpZF9hdHRyX29wZXJhdGlvbnMpLAorCVJFRygicHJldiIsICAgICAgIFNfSVJVR08sCSAgIHByb2NfcGlkX2F0dHJfb3BlcmF0aW9ucyksCisJUkVHKCJleGVjIiwgICAgICAgU19JUlVHT3xTX0lXVUdPLCBwcm9jX3BpZF9hdHRyX29wZXJhdGlvbnMpLAorCVJFRygiZnNjcmVhdGUiLCAgIFNfSVJVR098U19JV1VHTywgcHJvY19waWRfYXR0cl9vcGVyYXRpb25zKSwKKwlSRUcoImtleWNyZWF0ZSIsICBTX0lSVUdPfFNfSVdVR08sIHByb2NfcGlkX2F0dHJfb3BlcmF0aW9ucyksCisJUkVHKCJzb2NrY3JlYXRlIiwgU19JUlVHT3xTX0lXVUdPLCBwcm9jX3BpZF9hdHRyX29wZXJhdGlvbnMpLAogfTsKIAogc3RhdGljIGludCBwcm9jX2F0dHJfZGlyX3JlYWRkaXIoc3RydWN0IGZpbGUgKiBmaWxwLApAQCAtMjQ2MSw3NCArMjQ4NCw3NyBAQAogc3RhdGljIGNvbnN0IHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIHByb2NfdGFza19pbm9kZV9vcGVyYXRpb25zOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHBpZF9lbnRyeSB0Z2lkX2Jhc2Vfc3R1ZmZbXSA9IHsKLQlESVIoInRhc2siLCAgICAgICBTX0lSVUdPfFNfSVhVR08sIHRhc2spLAotCURJUigiZmQiLCAgICAgICAgIFNfSVJVU1J8U19JWFVTUiwgZmQpLAotCURJUigiZmRpbmZvIiwgICAgIFNfSVJVU1J8U19JWFVTUiwgZmRpbmZvKSwKKwlESVIoInRhc2siLCAgICAgICBTX0lSVUdPfFNfSVhVR08sIHByb2NfdGFza19pbm9kZV9vcGVyYXRpb25zLCBwcm9jX3Rhc2tfb3BlcmF0aW9ucyksCisJRElSKCJmZCIsICAgICAgICAgU19JUlVTUnxTX0lYVVNSLCBwcm9jX2ZkX2lub2RlX29wZXJhdGlvbnMsIHByb2NfZmRfb3BlcmF0aW9ucyksCisJRElSKCJmZGluZm8iLCAgICAgU19JUlVTUnxTX0lYVVNSLCBwcm9jX2ZkaW5mb19pbm9kZV9vcGVyYXRpb25zLCBwcm9jX2ZkaW5mb19vcGVyYXRpb25zKSwKICNpZmRlZiBDT05GSUdfTkVUCi0JRElSKCJuZXQiLCAgICAgICAgU19JUlVHT3xTX0lYVUdPLCBuZXQpLAorCURJUigibmV0IiwgICAgICAgIFNfSVJVR098U19JWFVHTywgcHJvY19uZXRfaW5vZGVfb3BlcmF0aW9ucywgcHJvY19uZXRfb3BlcmF0aW9ucyksCiAjZW5kaWYKLQlSRUcoImVudmlyb24iLCAgICBTX0lSVVNSLCBlbnZpcm9uKSwKLQlJTkYoImF1eHYiLCAgICAgICBTX0lSVVNSLCBwaWRfYXV4diksCi0JT05FKCJzdGF0dXMiLCAgICAgU19JUlVHTywgcGlkX3N0YXR1cyksCi0JT05FKCJwZXJzb25hbGl0eSIsIFNfSVJVU1IsIHBpZF9wZXJzb25hbGl0eSksCi0JSU5GKCJsaW1pdHMiLAkgIFNfSVJVU1IsIHBpZF9saW1pdHMpLAorCVJFRygiZW52aXJvbiIsICAgIFNfSVJVU1IsIHByb2NfZW52aXJvbl9vcGVyYXRpb25zKSwKKwlJTkYoImF1eHYiLCAgICAgICBTX0lSVVNSLCBwcm9jX3BpZF9hdXh2KSwKKwlPTkUoInN0YXR1cyIsICAgICBTX0lSVUdPLCBwcm9jX3BpZF9zdGF0dXMpLAorCU9ORSgicGVyc29uYWxpdHkiLCBTX0lSVVNSLCBwcm9jX3BpZF9wZXJzb25hbGl0eSksCisJSU5GKCJsaW1pdHMiLAkgIFNfSVJVU1IsIHByb2NfcGlkX2xpbWl0cyksCiAjaWZkZWYgQ09ORklHX1NDSEVEX0RFQlVHCi0JUkVHKCJzY2hlZCIsICAgICAgU19JUlVHT3xTX0lXVVNSLCBwaWRfc2NoZWQpLAorCVJFRygic2NoZWQiLCAgICAgIFNfSVJVR098U19JV1VTUiwgcHJvY19waWRfc2NoZWRfb3BlcmF0aW9ucyksCiAjZW5kaWYKICNpZmRlZiBDT05GSUdfSEFWRV9BUkNIX1RSQUNFSE9PSwotCUlORigic3lzY2FsbCIsICAgIFNfSVJVU1IsIHBpZF9zeXNjYWxsKSwKKwlJTkYoInN5c2NhbGwiLCAgICBTX0lSVVNSLCBwcm9jX3BpZF9zeXNjYWxsKSwKICNlbmRpZgotCUlORigiY21kbGluZSIsICAgIFNfSVJVR08sIHBpZF9jbWRsaW5lKSwKLQlPTkUoInN0YXQiLCAgICAgICBTX0lSVUdPLCB0Z2lkX3N0YXQpLAotCU9ORSgic3RhdG0iLCAgICAgIFNfSVJVR08sIHBpZF9zdGF0bSksCi0JUkVHKCJtYXBzIiwgICAgICAgU19JUlVHTywgbWFwcyksCisJSU5GKCJjbWRsaW5lIiwgICAgU19JUlVHTywgcHJvY19waWRfY21kbGluZSksCisJT05FKCJzdGF0IiwgICAgICAgU19JUlVHTywgcHJvY190Z2lkX3N0YXQpLAorCU9ORSgic3RhdG0iLCAgICAgIFNfSVJVR08sIHByb2NfcGlkX3N0YXRtKSwKKwlSRUcoIm1hcHMiLCAgICAgICBTX0lSVUdPLCBwcm9jX21hcHNfb3BlcmF0aW9ucyksCiAjaWZkZWYgQ09ORklHX05VTUEKLQlSRUcoIm51bWFfbWFwcyIsICBTX0lSVUdPLCBudW1hX21hcHMpLAorCVJFRygibnVtYV9tYXBzIiwgIFNfSVJVR08sIHByb2NfbnVtYV9tYXBzX29wZXJhdGlvbnMpLAogI2VuZGlmCi0JUkVHKCJtZW0iLCAgICAgICAgU19JUlVTUnxTX0lXVVNSLCBtZW0pLAotCUxOSygiY3dkIiwgICAgICAgIGN3ZCksCi0JTE5LKCJyb290IiwgICAgICAgcm9vdCksCi0JTE5LKCJleGUiLCAgICAgICAgZXhlKSwKLQlSRUcoIm1vdW50cyIsICAgICBTX0lSVUdPLCBtb3VudHMpLAotCVJFRygibW91bnRpbmZvIiwgIFNfSVJVR08sIG1vdW50aW5mbyksCi0JUkVHKCJtb3VudHN0YXRzIiwgU19JUlVTUiwgbW91bnRzdGF0cyksCisJUkVHKCJtZW0iLCAgICAgICAgU19JUlVTUnxTX0lXVVNSLCBwcm9jX21lbV9vcGVyYXRpb25zKSwKKwlMTksoImN3ZCIsICAgICAgICBwcm9jX2N3ZF9saW5rKSwKKwlMTksoInJvb3QiLCAgICAgICBwcm9jX3Jvb3RfbGluayksCisJTE5LKCJleGUiLCAgICAgICAgcHJvY19leGVfbGluayksCisJUkVHKCJtb3VudHMiLCAgICAgU19JUlVHTywgcHJvY19tb3VudHNfb3BlcmF0aW9ucyksCisJUkVHKCJtb3VudGluZm8iLCAgU19JUlVHTywgcHJvY19tb3VudGluZm9fb3BlcmF0aW9ucyksCisJUkVHKCJtb3VudHN0YXRzIiwgU19JUlVTUiwgcHJvY19tb3VudHN0YXRzX29wZXJhdGlvbnMpLAogI2lmZGVmIENPTkZJR19QUk9DX1BBR0VfTU9OSVRPUgotCVJFRygiY2xlYXJfcmVmcyIsIFNfSVdVU1IsIGNsZWFyX3JlZnMpLAotCVJFRygic21hcHMiLCAgICAgIFNfSVJVR08sIHNtYXBzKSwKLQlSRUcoInBhZ2VtYXAiLCAgICBTX0lSVVNSLCBwYWdlbWFwKSwKKwlSRUcoImNsZWFyX3JlZnMiLCBTX0lXVVNSLCBwcm9jX2NsZWFyX3JlZnNfb3BlcmF0aW9ucyksCisJUkVHKCJzbWFwcyIsICAgICAgU19JUlVHTywgcHJvY19zbWFwc19vcGVyYXRpb25zKSwKKwlSRUcoInBhZ2VtYXAiLCAgICBTX0lSVVNSLCBwcm9jX3BhZ2VtYXBfb3BlcmF0aW9ucyksCiAjZW5kaWYKICNpZmRlZiBDT05GSUdfU0VDVVJJVFkKLQlESVIoImF0dHIiLCAgICAgICBTX0lSVUdPfFNfSVhVR08sIGF0dHJfZGlyKSwKKwlESVIoImF0dHIiLCAgICAgICBTX0lSVUdPfFNfSVhVR08sIHByb2NfYXR0cl9kaXJfaW5vZGVfb3BlcmF0aW9ucywgcHJvY19hdHRyX2Rpcl9vcGVyYXRpb25zKSwKICNlbmRpZgogI2lmZGVmIENPTkZJR19LQUxMU1lNUwotCUlORigid2NoYW4iLCAgICAgIFNfSVJVR08sIHBpZF93Y2hhbiksCisJSU5GKCJ3Y2hhbiIsICAgICAgU19JUlVHTywgcHJvY19waWRfd2NoYW4pLAorI2VuZGlmCisjaWZkZWYgQ09ORklHX1NUQUNLVFJBQ0UKKwlPTkUoInN0YWNrIiwgICAgICBTX0lSVVNSLCBwcm9jX3BpZF9zdGFjayksCiAjZW5kaWYKICNpZmRlZiBDT05GSUdfU0NIRURTVEFUUwotCUlORigic2NoZWRzdGF0IiwgIFNfSVJVR08sIHBpZF9zY2hlZHN0YXQpLAorCUlORigic2NoZWRzdGF0IiwgIFNfSVJVR08sIHByb2NfcGlkX3NjaGVkc3RhdCksCiAjZW5kaWYKICNpZmRlZiBDT05GSUdfTEFURU5DWVRPUAotCVJFRygibGF0ZW5jeSIsICBTX0lSVUdPLCBsc3RhdHMpLAorCVJFRygibGF0ZW5jeSIsICBTX0lSVUdPLCBwcm9jX2xzdGF0c19vcGVyYXRpb25zKSwKICNlbmRpZgogI2lmZGVmIENPTkZJR19QUk9DX1BJRF9DUFVTRVQKLQlSRUcoImNwdXNldCIsICAgICBTX0lSVUdPLCBjcHVzZXQpLAorCVJFRygiY3B1c2V0IiwgICAgIFNfSVJVR08sIHByb2NfY3B1c2V0X29wZXJhdGlvbnMpLAogI2VuZGlmCiAjaWZkZWYgQ09ORklHX0NHUk9VUFMKLQlSRUcoImNncm91cCIsICBTX0lSVUdPLCBjZ3JvdXApLAorCVJFRygiY2dyb3VwIiwgIFNfSVJVR08sIHByb2NfY2dyb3VwX29wZXJhdGlvbnMpLAogI2VuZGlmCi0JSU5GKCJvb21fc2NvcmUiLCAgU19JUlVHTywgb29tX3Njb3JlKSwKLQlSRUcoIm9vbV9hZGoiLCAgICBTX0lSVUdPfFNfSVdVU1IsIG9vbV9hZGp1c3QpLAorCUlORigib29tX3Njb3JlIiwgIFNfSVJVR08sIHByb2Nfb29tX3Njb3JlKSwKKwlSRUcoIm9vbV9hZGoiLCAgICBTX0lSVUdPfFNfSVdVU1IsIHByb2Nfb29tX2FkanVzdF9vcGVyYXRpb25zKSwKICNpZmRlZiBDT05GSUdfQVVESVRTWVNDQUxMCi0JUkVHKCJsb2dpbnVpZCIsICAgU19JV1VTUnxTX0lSVUdPLCBsb2dpbnVpZCksCi0JUkVHKCJzZXNzaW9uaWQiLCAgU19JUlVHTywgc2Vzc2lvbmlkKSwKKwlSRUcoImxvZ2ludWlkIiwgICBTX0lXVVNSfFNfSVJVR08sIHByb2NfbG9naW51aWRfb3BlcmF0aW9ucyksCisJUkVHKCJzZXNzaW9uaWQiLCAgU19JUlVHTywgcHJvY19zZXNzaW9uaWRfb3BlcmF0aW9ucyksCiAjZW5kaWYKICNpZmRlZiBDT05GSUdfRkFVTFRfSU5KRUNUSU9OCi0JUkVHKCJtYWtlLWl0LWZhaWwiLCBTX0lSVUdPfFNfSVdVU1IsIGZhdWx0X2luamVjdCksCisJUkVHKCJtYWtlLWl0LWZhaWwiLCBTX0lSVUdPfFNfSVdVU1IsIHByb2NfZmF1bHRfaW5qZWN0X29wZXJhdGlvbnMpLAogI2VuZGlmCiAjaWYgZGVmaW5lZChVU0VfRUxGX0NPUkVfRFVNUCkgJiYgZGVmaW5lZChDT05GSUdfRUxGX0NPUkUpCi0JUkVHKCJjb3JlZHVtcF9maWx0ZXIiLCBTX0lSVUdPfFNfSVdVU1IsIGNvcmVkdW1wX2ZpbHRlciksCisJUkVHKCJjb3JlZHVtcF9maWx0ZXIiLCBTX0lSVUdPfFNfSVdVU1IsIHByb2NfY29yZWR1bXBfZmlsdGVyX29wZXJhdGlvbnMpLAogI2VuZGlmCiAjaWZkZWYgQ09ORklHX1RBU0tfSU9fQUNDT1VOVElORwotCUlORigiaW8iLAlTX0lSVUdPLCB0Z2lkX2lvX2FjY291bnRpbmcpLAorCUlORigiaW8iLAlTX0lSVUdPLCBwcm9jX3RnaWRfaW9fYWNjb3VudGluZyksCiAjZW5kaWYKIH07CiAKQEAgLTI4MDEsNjYgKzI4MjcsNjkgQEAKICAqIFRhc2tzCiAgKi8KIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcGlkX2VudHJ5IHRpZF9iYXNlX3N0dWZmW10gPSB7Ci0JRElSKCJmZCIsICAgICAgICBTX0lSVVNSfFNfSVhVU1IsIGZkKSwKLQlESVIoImZkaW5mbyIsICAgIFNfSVJVU1J8U19JWFVTUiwgZmRpbmZvKSwKLQlSRUcoImVudmlyb24iLCAgIFNfSVJVU1IsIGVudmlyb24pLAotCUlORigiYXV4diIsICAgICAgU19JUlVTUiwgcGlkX2F1eHYpLAotCU9ORSgic3RhdHVzIiwgICAgU19JUlVHTywgcGlkX3N0YXR1cyksCi0JT05FKCJwZXJzb25hbGl0eSIsIFNfSVJVU1IsIHBpZF9wZXJzb25hbGl0eSksCi0JSU5GKCJsaW1pdHMiLAkgU19JUlVTUiwgcGlkX2xpbWl0cyksCisJRElSKCJmZCIsICAgICAgICBTX0lSVVNSfFNfSVhVU1IsIHByb2NfZmRfaW5vZGVfb3BlcmF0aW9ucywgcHJvY19mZF9vcGVyYXRpb25zKSwKKwlESVIoImZkaW5mbyIsICAgIFNfSVJVU1J8U19JWFVTUiwgcHJvY19mZGluZm9faW5vZGVfb3BlcmF0aW9ucywgcHJvY19mZF9vcGVyYXRpb25zKSwKKwlSRUcoImVudmlyb24iLCAgIFNfSVJVU1IsIHByb2NfZW52aXJvbl9vcGVyYXRpb25zKSwKKwlJTkYoImF1eHYiLCAgICAgIFNfSVJVU1IsIHByb2NfcGlkX2F1eHYpLAorCU9ORSgic3RhdHVzIiwgICAgU19JUlVHTywgcHJvY19waWRfc3RhdHVzKSwKKwlPTkUoInBlcnNvbmFsaXR5IiwgU19JUlVTUiwgcHJvY19waWRfcGVyc29uYWxpdHkpLAorCUlORigibGltaXRzIiwJIFNfSVJVU1IsIHByb2NfcGlkX2xpbWl0cyksCiAjaWZkZWYgQ09ORklHX1NDSEVEX0RFQlVHCi0JUkVHKCJzY2hlZCIsICAgICBTX0lSVUdPfFNfSVdVU1IsIHBpZF9zY2hlZCksCisJUkVHKCJzY2hlZCIsICAgICBTX0lSVUdPfFNfSVdVU1IsIHByb2NfcGlkX3NjaGVkX29wZXJhdGlvbnMpLAogI2VuZGlmCiAjaWZkZWYgQ09ORklHX0hBVkVfQVJDSF9UUkFDRUhPT0sKLQlJTkYoInN5c2NhbGwiLCAgIFNfSVJVU1IsIHBpZF9zeXNjYWxsKSwKKwlJTkYoInN5c2NhbGwiLCAgIFNfSVJVU1IsIHByb2NfcGlkX3N5c2NhbGwpLAogI2VuZGlmCi0JSU5GKCJjbWRsaW5lIiwgICBTX0lSVUdPLCBwaWRfY21kbGluZSksCi0JT05FKCJzdGF0IiwgICAgICBTX0lSVUdPLCB0aWRfc3RhdCksCi0JT05FKCJzdGF0bSIsICAgICBTX0lSVUdPLCBwaWRfc3RhdG0pLAotCVJFRygibWFwcyIsICAgICAgU19JUlVHTywgbWFwcyksCisJSU5GKCJjbWRsaW5lIiwgICBTX0lSVUdPLCBwcm9jX3BpZF9jbWRsaW5lKSwKKwlPTkUoInN0YXQiLCAgICAgIFNfSVJVR08sIHByb2NfdGlkX3N0YXQpLAorCU9ORSgic3RhdG0iLCAgICAgU19JUlVHTywgcHJvY19waWRfc3RhdG0pLAorCVJFRygibWFwcyIsICAgICAgU19JUlVHTywgcHJvY19tYXBzX29wZXJhdGlvbnMpLAogI2lmZGVmIENPTkZJR19OVU1BCi0JUkVHKCJudW1hX21hcHMiLCBTX0lSVUdPLCBudW1hX21hcHMpLAorCVJFRygibnVtYV9tYXBzIiwgU19JUlVHTywgcHJvY19udW1hX21hcHNfb3BlcmF0aW9ucyksCiAjZW5kaWYKLQlSRUcoIm1lbSIsICAgICAgIFNfSVJVU1J8U19JV1VTUiwgbWVtKSwKLQlMTksoImN3ZCIsICAgICAgIGN3ZCksCi0JTE5LKCJyb290IiwgICAgICByb290KSwKLQlMTksoImV4ZSIsICAgICAgIGV4ZSksCi0JUkVHKCJtb3VudHMiLCAgICBTX0lSVUdPLCBtb3VudHMpLAotCVJFRygibW91bnRpbmZvIiwgIFNfSVJVR08sIG1vdW50aW5mbyksCisJUkVHKCJtZW0iLCAgICAgICBTX0lSVVNSfFNfSVdVU1IsIHByb2NfbWVtX29wZXJhdGlvbnMpLAorCUxOSygiY3dkIiwgICAgICAgcHJvY19jd2RfbGluayksCisJTE5LKCJyb290IiwgICAgICBwcm9jX3Jvb3RfbGluayksCisJTE5LKCJleGUiLCAgICAgICBwcm9jX2V4ZV9saW5rKSwKKwlSRUcoIm1vdW50cyIsICAgIFNfSVJVR08sIHByb2NfbW91bnRzX29wZXJhdGlvbnMpLAorCVJFRygibW91bnRpbmZvIiwgIFNfSVJVR08sIHByb2NfbW91bnRpbmZvX29wZXJhdGlvbnMpLAogI2lmZGVmIENPTkZJR19QUk9DX1BBR0VfTU9OSVRPUgotCVJFRygiY2xlYXJfcmVmcyIsIFNfSVdVU1IsIGNsZWFyX3JlZnMpLAotCVJFRygic21hcHMiLCAgICAgU19JUlVHTywgc21hcHMpLAotCVJFRygicGFnZW1hcCIsICAgIFNfSVJVU1IsIHBhZ2VtYXApLAorCVJFRygiY2xlYXJfcmVmcyIsIFNfSVdVU1IsIHByb2NfY2xlYXJfcmVmc19vcGVyYXRpb25zKSwKKwlSRUcoInNtYXBzIiwgICAgIFNfSVJVR08sIHByb2Nfc21hcHNfb3BlcmF0aW9ucyksCisJUkVHKCJwYWdlbWFwIiwgICAgU19JUlVTUiwgcHJvY19wYWdlbWFwX29wZXJhdGlvbnMpLAogI2VuZGlmCiAjaWZkZWYgQ09ORklHX1NFQ1VSSVRZCi0JRElSKCJhdHRyIiwgICAgICBTX0lSVUdPfFNfSVhVR08sIGF0dHJfZGlyKSwKKwlESVIoImF0dHIiLCAgICAgIFNfSVJVR098U19JWFVHTywgcHJvY19hdHRyX2Rpcl9pbm9kZV9vcGVyYXRpb25zLCBwcm9jX2F0dHJfZGlyX29wZXJhdGlvbnMpLAogI2VuZGlmCiAjaWZkZWYgQ09ORklHX0tBTExTWU1TCi0JSU5GKCJ3Y2hhbiIsICAgICBTX0lSVUdPLCBwaWRfd2NoYW4pLAorCUlORigid2NoYW4iLCAgICAgU19JUlVHTywgcHJvY19waWRfd2NoYW4pLAorI2VuZGlmCisjaWZkZWYgQ09ORklHX1NUQUNLVFJBQ0UKKwlPTkUoInN0YWNrIiwgICAgICBTX0lSVVNSLCBwcm9jX3BpZF9zdGFjayksCiAjZW5kaWYKICNpZmRlZiBDT05GSUdfU0NIRURTVEFUUwotCUlORigic2NoZWRzdGF0IiwgU19JUlVHTywgcGlkX3NjaGVkc3RhdCksCisJSU5GKCJzY2hlZHN0YXQiLCBTX0lSVUdPLCBwcm9jX3BpZF9zY2hlZHN0YXQpLAogI2VuZGlmCiAjaWZkZWYgQ09ORklHX0xBVEVOQ1lUT1AKLQlSRUcoImxhdGVuY3kiLCAgU19JUlVHTywgbHN0YXRzKSwKKwlSRUcoImxhdGVuY3kiLCAgU19JUlVHTywgcHJvY19sc3RhdHNfb3BlcmF0aW9ucyksCiAjZW5kaWYKICNpZmRlZiBDT05GSUdfUFJPQ19QSURfQ1BVU0VUCi0JUkVHKCJjcHVzZXQiLCAgICBTX0lSVUdPLCBjcHVzZXQpLAorCVJFRygiY3B1c2V0IiwgICAgU19JUlVHTywgcHJvY19jcHVzZXRfb3BlcmF0aW9ucyksCiAjZW5kaWYKICNpZmRlZiBDT05GSUdfQ0dST1VQUwotCVJFRygiY2dyb3VwIiwgIFNfSVJVR08sIGNncm91cCksCisJUkVHKCJjZ3JvdXAiLCAgU19JUlVHTywgcHJvY19jZ3JvdXBfb3BlcmF0aW9ucyksCiAjZW5kaWYKLQlJTkYoIm9vbV9zY29yZSIsIFNfSVJVR08sIG9vbV9zY29yZSksCi0JUkVHKCJvb21fYWRqIiwgICBTX0lSVUdPfFNfSVdVU1IsIG9vbV9hZGp1c3QpLAorCUlORigib29tX3Njb3JlIiwgU19JUlVHTywgcHJvY19vb21fc2NvcmUpLAorCVJFRygib29tX2FkaiIsICAgU19JUlVHT3xTX0lXVVNSLCBwcm9jX29vbV9hZGp1c3Rfb3BlcmF0aW9ucyksCiAjaWZkZWYgQ09ORklHX0FVRElUU1lTQ0FMTAotCVJFRygibG9naW51aWQiLCAgU19JV1VTUnxTX0lSVUdPLCBsb2dpbnVpZCksCi0JUkVHKCJzZXNzaW9uaWQiLCAgU19JUlVTUiwgc2Vzc2lvbmlkKSwKKwlSRUcoImxvZ2ludWlkIiwgIFNfSVdVU1J8U19JUlVHTywgcHJvY19sb2dpbnVpZF9vcGVyYXRpb25zKSwKKwlSRUcoInNlc3Npb25pZCIsICBTX0lSVVNSLCBwcm9jX3Nlc3Npb25pZF9vcGVyYXRpb25zKSwKICNlbmRpZgogI2lmZGVmIENPTkZJR19GQVVMVF9JTkpFQ1RJT04KLQlSRUcoIm1ha2UtaXQtZmFpbCIsIFNfSVJVR098U19JV1VTUiwgZmF1bHRfaW5qZWN0KSwKKwlSRUcoIm1ha2UtaXQtZmFpbCIsIFNfSVJVR098U19JV1VTUiwgcHJvY19mYXVsdF9pbmplY3Rfb3BlcmF0aW9ucyksCiAjZW5kaWYKICNpZmRlZiBDT05GSUdfVEFTS19JT19BQ0NPVU5USU5HCi0JSU5GKCJpbyIsCVNfSVJVR08sIHRpZF9pb19hY2NvdW50aW5nKSwKKwlJTkYoImlvIiwJU19JUlVHTywgcHJvY190aWRfaW9fYWNjb3VudGluZyksCiAjZW5kaWYKIH07CiAKZGlmZiAtLWdpdCBhL2ZzL3Byb2MvZ2VuZXJpYy5jIGIvZnMvcHJvYy9nZW5lcmljLmMKaW5kZXggNjBhMzU5Yi4uZGI3ZmE1YyAxMDA2NDQKLS0tIGEvZnMvcHJvYy9nZW5lcmljLmMKKysrIGIvZnMvcHJvYy9nZW5lcmljLmMKQEAgLTE0LDcgKzE0LDYgQEAKICNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvbW91bnQuaD4KLSNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pZHIuaD4KICNpbmNsdWRlIDxsaW51eC9uYW1laS5oPgpAQCAtMzc5LDcgKzM3OCw2IEBACiAJc3RydWN0IGlub2RlICppbm9kZSA9IE5VTEw7CiAJaW50IGVycm9yID0gLUVOT0VOVDsKIAotCWxvY2tfa2VybmVsKCk7CiAJc3Bpbl9sb2NrKCZwcm9jX3N1YmRpcl9sb2NrKTsKIAlmb3IgKGRlID0gZGUtPnN1YmRpcjsgZGUgOyBkZSA9IGRlLT5uZXh0KSB7CiAJCWlmIChkZS0+bmFtZWxlbiAhPSBkZW50cnktPmRfbmFtZS5sZW4pCkBAIC0zOTcsNyArMzk1LDYgQEAKIAl9CiAJc3Bpbl91bmxvY2soJnByb2Nfc3ViZGlyX2xvY2spOwogb3V0X3VubG9jazoKLQl1bmxvY2tfa2VybmVsKCk7CiAKIAlpZiAoaW5vZGUpIHsKIAkJZGVudHJ5LT5kX29wID0gJnByb2NfZGVudHJ5X29wZXJhdGlvbnM7CkBAIC00MzIsOCArNDI5LDYgQEAKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlscC0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZTsKIAlpbnQgcmV0ID0gMDsKIAotCWxvY2tfa2VybmVsKCk7Ci0KIAlpbm8gPSBpbm9kZS0+aV9pbm87CiAJaSA9IGZpbHAtPmZfcG9zOwogCXN3aXRjaCAoaSkgewpAQCAtNDg3LDcgKzQ4Miw3IEBACiAJCQlzcGluX3VubG9jaygmcHJvY19zdWJkaXJfbG9jayk7CiAJfQogCXJldCA9IDE7Ci1vdXQ6CXVubG9ja19rZXJuZWwoKTsKK291dDoKIAlyZXR1cm4gcmV0OwkKIH0KIApAQCAtNTA0LDYgKzQ5OSw3IEBACiAgKiB0aGUgL3Byb2MgZGlyZWN0b3J5LgogICovCiBzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwcm9jX2Rpcl9vcGVyYXRpb25zID0geworCS5sbHNlZWsJCQk9IGdlbmVyaWNfZmlsZV9sbHNlZWssCiAJLnJlYWQJCQk9IGdlbmVyaWNfcmVhZF9kaXIsCiAJLnJlYWRkaXIJCT0gcHJvY19yZWFkZGlyLAogfTsKZGlmZiAtLWdpdCBhL2ZzL3Byb2MvaW5vZGUuYyBiL2ZzL3Byb2MvaW5vZGUuYwppbmRleCAyNTQzZmQwLi4zZTc2YmI5IDEwMDY0NAotLS0gYS9mcy9wcm9jL2lub2RlLmMKKysrIGIvZnMvcHJvYy9pbm9kZS5jCkBAIC0zNSwxNiArMzUsMTMgQEAKICAqLwogdm9pZCBkZV9wdXQoc3RydWN0IHByb2NfZGlyX2VudHJ5ICpkZSkKIHsKLQlsb2NrX2tlcm5lbCgpOwogCWlmICghYXRvbWljX3JlYWQoJmRlLT5jb3VudCkpIHsKIAkJcHJpbnRrKCJkZV9wdXQ6IGVudHJ5ICVzIGFscmVhZHkgZnJlZSFcbiIsIGRlLT5uYW1lKTsKLQkJdW5sb2NrX2tlcm5lbCgpOwogCQlyZXR1cm47CiAJfQogCiAJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJmRlLT5jb3VudCkpCiAJCWZyZWVfcHJvY19lbnRyeShkZSk7Ci0JdW5sb2NrX2tlcm5lbCgpOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvZnMvcHJvYy9pbnRlcm5hbC5oIGIvZnMvcHJvYy9pbnRlcm5hbC5oCmluZGV4IDNlOGFlYjguLmNkNTNmZjggMTAwNjQ0Ci0tLSBhL2ZzL3Byb2MvaW50ZXJuYWwuaAorKysgYi9mcy9wcm9jL2ludGVybmFsLmgKQEAgLTQxLDggKzQxLDYgQEAKIAkodm1pKS0+dXNlZCA9IDA7CQkJXAogCSh2bWkpLT5sYXJnZXN0X2NodW5rID0gMDsJCVwKIH0gd2hpbGUoMCkKLQotZXh0ZXJuIGludCBub21tdV92bWFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKiwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICopOwogI2VuZGlmCiAKIGV4dGVybiBpbnQgcHJvY190aWRfc3RhdChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHN0cnVjdCBwaWRfbmFtZXNwYWNlICpucywKZGlmZiAtLWdpdCBhL2ZzL3Byb2MvbWVtaW5mby5jIGIvZnMvcHJvYy9tZW1pbmZvLmMKaW5kZXggYjE2NzVjNC4uNDNkMjM5NDggMTAwNjQ0Ci0tLSBhL2ZzL3Byb2MvbWVtaW5mby5jCisrKyBiL2ZzL3Byb2MvbWVtaW5mby5jCkBAIC03NCw2ICs3NCw5IEBACiAJCSJMb3dUb3RhbDogICAgICAgJThsdSBrQlxuIgogCQkiTG93RnJlZTogICAgICAgICU4bHUga0JcbiIKICNlbmRpZgorI2lmbmRlZiBDT05GSUdfTU1VCisJCSJNbWFwQ29weTogICAgICAgJThsdSBrQlxuIgorI2VuZGlmCiAJCSJTd2FwVG90YWw6ICAgICAgJThsdSBrQlxuIgogCQkiU3dhcEZyZWU6ICAgICAgICU4bHUga0JcbiIKIAkJIkRpcnR5OiAgICAgICAgICAlOGx1IGtCXG4iCkBAIC0xMTYsNiArMTE5LDkgQEAKIAkJSyhpLnRvdGFscmFtLWkudG90YWxoaWdoKSwKIAkJSyhpLmZyZWVyYW0taS5mcmVlaGlnaCksCiAjZW5kaWYKKyNpZm5kZWYgQ09ORklHX01NVQorCQlLKCh1bnNpZ25lZCBsb25nKSBhdG9taWNfcmVhZCgmbW1hcF9wYWdlc19hbGxvY2F0ZWQpKSwKKyNlbmRpZgogCQlLKGkudG90YWxzd2FwKSwKIAkJSyhpLmZyZWVzd2FwKSwKIAkJSyhnbG9iYWxfcGFnZV9zdGF0ZShOUl9GSUxFX0RJUlRZKSksCmRpZmYgLS1naXQgYS9mcy9wcm9jL25vbW11LmMgYi9mcy9wcm9jL25vbW11LmMKaW5kZXggM2Y4N2QyNi4uYjQ0NmQ3YSAxMDA2NDQKLS0tIGEvZnMvcHJvYy9ub21tdS5jCisrKyBiL2ZzL3Byb2Mvbm9tbXUuYwpAQCAtMzMsMzMgKzMzLDMzIEBACiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKIAogLyoKLSAqIGRpc3BsYXkgYSBzaW5nbGUgVk1BIHRvIGEgc2VxdWVuY2VkIGZpbGUKKyAqIGRpc3BsYXkgYSBzaW5nbGUgcmVnaW9uIHRvIGEgc2VxdWVuY2VkIGZpbGUKICAqLwotaW50IG5vbW11X3ZtYV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqbSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCitzdGF0aWMgaW50IG5vbW11X3JlZ2lvbl9zaG93KHN0cnVjdCBzZXFfZmlsZSAqbSwgc3RydWN0IHZtX3JlZ2lvbiAqcmVnaW9uKQogewogCXVuc2lnbmVkIGxvbmcgaW5vID0gMDsKIAlzdHJ1Y3QgZmlsZSAqZmlsZTsKIAlkZXZfdCBkZXYgPSAwOwogCWludCBmbGFncywgbGVuOwogCi0JZmxhZ3MgPSB2bWEtPnZtX2ZsYWdzOwotCWZpbGUgPSB2bWEtPnZtX2ZpbGU7CisJZmxhZ3MgPSByZWdpb24tPnZtX2ZsYWdzOworCWZpbGUgPSByZWdpb24tPnZtX2ZpbGU7CiAKIAlpZiAoZmlsZSkgewotCQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gdm1hLT52bV9maWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOworCQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gcmVnaW9uLT52bV9maWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOwogCQlkZXYgPSBpbm9kZS0+aV9zYi0+c19kZXY7CiAJCWlubyA9IGlub2RlLT5pX2lubzsKIAl9CiAKIAlzZXFfcHJpbnRmKG0sCiAJCSAgICIlMDhseC0lMDhseCAlYyVjJWMlYyAlMDhsbHggJTAyeDolMDJ4ICVsdSAlbiIsCi0JCSAgIHZtYS0+dm1fc3RhcnQsCi0JCSAgIHZtYS0+dm1fZW5kLAorCQkgICByZWdpb24tPnZtX3N0YXJ0LAorCQkgICByZWdpb24tPnZtX2VuZCwKIAkJICAgZmxhZ3MgJiBWTV9SRUFEID8gJ3InIDogJy0nLAogCQkgICBmbGFncyAmIFZNX1dSSVRFID8gJ3cnIDogJy0nLAogCQkgICBmbGFncyAmIFZNX0VYRUMgPyAneCcgOiAnLScsCiAJCSAgIGZsYWdzICYgVk1fTUFZU0hBUkUgPyBmbGFncyAmIFZNX1NIQVJFRCA/ICdTJyA6ICdzJyA6ICdwJywKLQkJICAgKChsb2ZmX3Qpdm1hLT52bV9wZ29mZikgPDwgUEFHRV9TSElGVCwKKwkJICAgKChsb2ZmX3QpcmVnaW9uLT52bV9wZ29mZikgPDwgUEFHRV9TSElGVCwKIAkJICAgTUFKT1IoZGV2KSwgTUlOT1IoZGV2KSwgaW5vLCAmbGVuKTsKIAogCWlmIChmaWxlKSB7CkBAIC03NSw2MSArNzUsNTQgQEAKIH0KIAogLyoKLSAqIGRpc3BsYXkgYSBsaXN0IG9mIGFsbCB0aGUgVk1BcyB0aGUga2VybmVsIGtub3dzIGFib3V0CisgKiBkaXNwbGF5IGEgbGlzdCBvZiBhbGwgdGhlIFJFR0lPTnMgdGhlIGtlcm5lbCBrbm93cyBhYm91dAogICogLSBub21tdSBrZXJuYWxzIGhhdmUgYSBzaW5nbGUgZmxhdCBsaXN0CiAgKi8KLXN0YXRpYyBpbnQgbm9tbXVfdm1hX2xpc3Rfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnYpCitzdGF0aWMgaW50IG5vbW11X3JlZ2lvbl9saXN0X3Nob3coc3RydWN0IHNlcV9maWxlICptLCB2b2lkICpfcCkKIHsKLQlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYTsKKwlzdHJ1Y3QgcmJfbm9kZSAqcCA9IF9wOwogCi0Jdm1hID0gcmJfZW50cnkoKHN0cnVjdCByYl9ub2RlICopIHYsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCwgdm1fcmIpOwotCXJldHVybiBub21tdV92bWFfc2hvdyhtLCB2bWEpOworCXJldHVybiBub21tdV9yZWdpb25fc2hvdyhtLCByYl9lbnRyeShwLCBzdHJ1Y3Qgdm1fcmVnaW9uLCB2bV9yYikpOwogfQogCi1zdGF0aWMgdm9pZCAqbm9tbXVfdm1hX2xpc3Rfc3RhcnQoc3RydWN0IHNlcV9maWxlICptLCBsb2ZmX3QgKl9wb3MpCitzdGF0aWMgdm9pZCAqbm9tbXVfcmVnaW9uX2xpc3Rfc3RhcnQoc3RydWN0IHNlcV9maWxlICptLCBsb2ZmX3QgKl9wb3MpCiB7Ci0Jc3RydWN0IHJiX25vZGUgKl9yYjsKKwlzdHJ1Y3QgcmJfbm9kZSAqcDsKIAlsb2ZmX3QgcG9zID0gKl9wb3M7Ci0Jdm9pZCAqbmV4dCA9IE5VTEw7CiAKLQlkb3duX3JlYWQoJm5vbW11X3ZtYV9zZW0pOworCWRvd25fcmVhZCgmbm9tbXVfcmVnaW9uX3NlbSk7CiAKLQlmb3IgKF9yYiA9IHJiX2ZpcnN0KCZub21tdV92bWFfdHJlZSk7IF9yYjsgX3JiID0gcmJfbmV4dChfcmIpKSB7Ci0JCWlmIChwb3MgPT0gMCkgewotCQkJbmV4dCA9IF9yYjsKLQkJCWJyZWFrOwotCQl9Ci0JCXBvcy0tOwotCX0KLQotCXJldHVybiBuZXh0OworCWZvciAocCA9IHJiX2ZpcnN0KCZub21tdV9yZWdpb25fdHJlZSk7IHA7IHAgPSByYl9uZXh0KHApKQorCQlpZiAocG9zLS0gPT0gMCkKKwkJCXJldHVybiBwOworCXJldHVybiBOVUxMOwogfQogCi1zdGF0aWMgdm9pZCBub21tdV92bWFfbGlzdF9zdG9wKHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdikKK3N0YXRpYyB2b2lkIG5vbW11X3JlZ2lvbl9saXN0X3N0b3Aoc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2KQogewotCXVwX3JlYWQoJm5vbW11X3ZtYV9zZW0pOworCXVwX3JlYWQoJm5vbW11X3JlZ2lvbl9zZW0pOwogfQogCi1zdGF0aWMgdm9pZCAqbm9tbXVfdm1hX2xpc3RfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnYsIGxvZmZfdCAqcG9zKQorc3RhdGljIHZvaWQgKm5vbW11X3JlZ2lvbl9saXN0X25leHQoc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2LCBsb2ZmX3QgKnBvcykKIHsKIAkoKnBvcykrKzsKIAlyZXR1cm4gcmJfbmV4dCgoc3RydWN0IHJiX25vZGUgKikgdik7CiB9CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgcHJvY19ub21tdV92bWFfbGlzdF9zZXFvcCA9IHsKLQkuc3RhcnQJPSBub21tdV92bWFfbGlzdF9zdGFydCwKLQkubmV4dAk9IG5vbW11X3ZtYV9saXN0X25leHQsCi0JLnN0b3AJPSBub21tdV92bWFfbGlzdF9zdG9wLAotCS5zaG93CT0gbm9tbXVfdm1hX2xpc3Rfc2hvdworc3RhdGljIHN0cnVjdCBzZXFfb3BlcmF0aW9ucyBwcm9jX25vbW11X3JlZ2lvbl9saXN0X3NlcW9wID0geworCS5zdGFydAk9IG5vbW11X3JlZ2lvbl9saXN0X3N0YXJ0LAorCS5uZXh0CT0gbm9tbXVfcmVnaW9uX2xpc3RfbmV4dCwKKwkuc3RvcAk9IG5vbW11X3JlZ2lvbl9saXN0X3N0b3AsCisJLnNob3cJPSBub21tdV9yZWdpb25fbGlzdF9zaG93CiB9OwogCi1zdGF0aWMgaW50IHByb2Nfbm9tbXVfdm1hX2xpc3Rfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3N0YXRpYyBpbnQgcHJvY19ub21tdV9yZWdpb25fbGlzdF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQogewotCXJldHVybiBzZXFfb3BlbihmaWxlLCAmcHJvY19ub21tdV92bWFfbGlzdF9zZXFvcCk7CisJcmV0dXJuIHNlcV9vcGVuKGZpbGUsICZwcm9jX25vbW11X3JlZ2lvbl9saXN0X3NlcW9wKTsKIH0KIAotc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcHJvY19ub21tdV92bWFfbGlzdF9vcGVyYXRpb25zID0gewotCS5vcGVuICAgID0gcHJvY19ub21tdV92bWFfbGlzdF9vcGVuLAorc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcHJvY19ub21tdV9yZWdpb25fbGlzdF9vcGVyYXRpb25zID0geworCS5vcGVuICAgID0gcHJvY19ub21tdV9yZWdpb25fbGlzdF9vcGVuLAogCS5yZWFkICAgID0gc2VxX3JlYWQsCiAJLmxsc2VlayAgPSBzZXFfbHNlZWssCiAJLnJlbGVhc2UgPSBzZXFfcmVsZWFzZSwKQEAgLTEzNyw3ICsxMzAsNyBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBwcm9jX25vbW11X2luaXQodm9pZCkKIHsKLQlwcm9jX2NyZWF0ZSgibWFwcyIsIFNfSVJVR08sIE5VTEwsICZwcm9jX25vbW11X3ZtYV9saXN0X29wZXJhdGlvbnMpOworCXByb2NfY3JlYXRlKCJtYXBzIiwgU19JUlVHTywgTlVMTCwgJnByb2Nfbm9tbXVfcmVnaW9uX2xpc3Rfb3BlcmF0aW9ucyk7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2ZzL3Byb2MvcHJvY19uZXQuYyBiL2ZzL3Byb2MvcHJvY19uZXQuYwppbmRleCA3YmMyOTZmLi4wNGQxMjcwIDEwMDY0NAotLS0gYS9mcy9wcm9jL3Byb2NfbmV0LmMKKysrIGIvZnMvcHJvYy9wcm9jX25ldC5jCkBAIC0xOCw3ICsxOCw2IEBACiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KLSNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L21vdW50Lmg+CiAjaW5jbHVkZSA8bGludXgvbnNwcm94eS5oPgogI2luY2x1ZGUgPG5ldC9uZXRfbmFtZXNwYWNlLmg+CkBAIC0xNzIsNiArMTcxLDcgQEAKIH0KIAogY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwcm9jX25ldF9vcGVyYXRpb25zID0geworCS5sbHNlZWsJCT0gZ2VuZXJpY19maWxlX2xsc2VlaywKIAkucmVhZAkJPSBnZW5lcmljX3JlYWRfZGlyLAogCS5yZWFkZGlyCT0gcHJvY190Z2lkX25ldF9yZWFkZGlyLAogfTsKZGlmZiAtLWdpdCBhL2ZzL3Byb2Mvcm9vdC5jIGIvZnMvcHJvYy9yb290LmMKaW5kZXggNzc2MTYwMi4uZjYyOTlhMiAxMDA2NDQKLS0tIGEvZnMvcHJvYy9yb290LmMKKysrIGIvZnMvcHJvYy9yb290LmMKQEAgLTE2LDcgKzE2LDYgQEAKICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgotI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvbW91bnQuaD4KICNpbmNsdWRlIDxsaW51eC9waWRfbmFtZXNwYWNlLmg+CiAKQEAgLTE2MiwxNyArMTYxLDEyIEBACiAJdW5zaWduZWQgaW50IG5yID0gZmlscC0+Zl9wb3M7CiAJaW50IHJldDsKIAotCWxvY2tfa2VybmVsKCk7Ci0KIAlpZiAobnIgPCBGSVJTVF9QUk9DRVNTX0VOVFJZKSB7CiAJCWludCBlcnJvciA9IHByb2NfcmVhZGRpcihmaWxwLCBkaXJlbnQsIGZpbGxkaXIpOwotCQlpZiAoZXJyb3IgPD0gMCkgewotCQkJdW5sb2NrX2tlcm5lbCgpOworCQlpZiAoZXJyb3IgPD0gMCkKIAkJCXJldHVybiBlcnJvcjsKLQkJfQogCQlmaWxwLT5mX3BvcyA9IEZJUlNUX1BST0NFU1NfRU5UUlk7CiAJfQotCXVubG9ja19rZXJuZWwoKTsKIAogCXJldCA9IHByb2NfcGlkX3JlYWRkaXIoZmlscCwgZGlyZW50LCBmaWxsZGlyKTsKIAlyZXR1cm4gcmV0OwpkaWZmIC0tZ2l0IGEvZnMvcHJvYy90YXNrX25vbW11LmMgYi9mcy9wcm9jL3Rhc2tfbm9tbXUuYwppbmRleCAyMTliZDc5Li4zNDNlYTEyIDEwMDY0NAotLS0gYS9mcy9wcm9jL3Rhc2tfbm9tbXUuYworKysgYi9mcy9wcm9jL3Rhc2tfbm9tbXUuYwpAQCAtOSwzMSArOSwzOCBAQAogCiAvKgogICogTG9naWM6IHdlJ3ZlIGdvdCB0d28gbWVtb3J5IHN1bXMgZm9yIGVhY2ggcHJvY2VzcywgInNoYXJlZCIsIGFuZAotICogIm5vbi1zaGFyZWQiLiBTaGFyZWQgbWVtb3J5IG1heSBnZXQgY291bnRlZCBtb3JlIHRoZW4gb25jZSwgZm9yCisgKiAibm9uLXNoYXJlZCIuIFNoYXJlZCBtZW1vcnkgbWF5IGdldCBjb3VudGVkIG1vcmUgdGhhbiBvbmNlLCBmb3IKICAqIGVhY2ggcHJvY2VzcyB0aGF0IG93bnMgaXQuIE5vbi1zaGFyZWQgbWVtb3J5IGlzIGNvdW50ZWQKICAqIGFjY3VyYXRlbHkuCiAgKi8KIHZvaWQgdGFza19tZW0oc3RydWN0IHNlcV9maWxlICptLCBzdHJ1Y3QgbW1fc3RydWN0ICptbSkKIHsKLQlzdHJ1Y3Qgdm1fbGlzdF9zdHJ1Y3QgKnZtbDsKLQl1bnNpZ25lZCBsb25nIGJ5dGVzID0gMCwgc2J5dGVzID0gMCwgc2xhY2sgPSAwOworCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hOworCXN0cnVjdCB2bV9yZWdpb24gKnJlZ2lvbjsKKwlzdHJ1Y3QgcmJfbm9kZSAqcDsKKwl1bnNpZ25lZCBsb25nIGJ5dGVzID0gMCwgc2J5dGVzID0gMCwgc2xhY2sgPSAwLCBzaXplOwogICAgICAgICAKIAlkb3duX3JlYWQoJm1tLT5tbWFwX3NlbSk7Ci0JZm9yICh2bWwgPSBtbS0+Y29udGV4dC52bWxpc3Q7IHZtbDsgdm1sID0gdm1sLT5uZXh0KSB7Ci0JCWlmICghdm1sLT52bWEpCi0JCQljb250aW51ZTsKKwlmb3IgKHAgPSByYl9maXJzdCgmbW0tPm1tX3JiKTsgcDsgcCA9IHJiX25leHQocCkpIHsKKwkJdm1hID0gcmJfZW50cnkocCwgc3RydWN0IHZtX2FyZWFfc3RydWN0LCB2bV9yYik7CiAKLQkJYnl0ZXMgKz0ga29ianNpemUodm1sKTsKLQkJaWYgKGF0b21pY19yZWFkKCZtbS0+bW1fY291bnQpID4gMSB8fAotCQkgICAgYXRvbWljX3JlYWQoJnZtbC0+dm1hLT52bV91c2FnZSkgPiAxCi0JCSAgICApIHsKLQkJCXNieXRlcyArPSBrb2Jqc2l6ZSgodm9pZCAqKSB2bWwtPnZtYS0+dm1fc3RhcnQpOwotCQkJc2J5dGVzICs9IGtvYmpzaXplKHZtbC0+dm1hKTsKKwkJYnl0ZXMgKz0ga29ianNpemUodm1hKTsKKworCQlyZWdpb24gPSB2bWEtPnZtX3JlZ2lvbjsKKwkJaWYgKHJlZ2lvbikgeworCQkJc2l6ZSA9IGtvYmpzaXplKHJlZ2lvbik7CisJCQlzaXplICs9IHJlZ2lvbi0+dm1fZW5kIC0gcmVnaW9uLT52bV9zdGFydDsKIAkJfSBlbHNlIHsKLQkJCWJ5dGVzICs9IGtvYmpzaXplKCh2b2lkICopIHZtbC0+dm1hLT52bV9zdGFydCk7Ci0JCQlieXRlcyArPSBrb2Jqc2l6ZSh2bWwtPnZtYSk7Ci0JCQlzbGFjayArPSBrb2Jqc2l6ZSgodm9pZCAqKSB2bWwtPnZtYS0+dm1fc3RhcnQpIC0KLQkJCQkodm1sLT52bWEtPnZtX2VuZCAtIHZtbC0+dm1hLT52bV9zdGFydCk7CisJCQlzaXplID0gdm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0OworCQl9CisKKwkJaWYgKGF0b21pY19yZWFkKCZtbS0+bW1fY291bnQpID4gMSB8fAorCQkgICAgdm1hLT52bV9mbGFncyAmIFZNX01BWVNIQVJFKSB7CisJCQlzYnl0ZXMgKz0gc2l6ZTsKKwkJfSBlbHNlIHsKKwkJCWJ5dGVzICs9IHNpemU7CisJCQlpZiAocmVnaW9uKQorCQkJCXNsYWNrID0gcmVnaW9uLT52bV9lbmQgLSB2bWEtPnZtX2VuZDsKIAkJfQogCX0KIApAQCAtNzAsMTMgKzc3LDE0IEBACiAKIHVuc2lnbmVkIGxvbmcgdGFza192c2l6ZShzdHJ1Y3QgbW1fc3RydWN0ICptbSkKIHsKLQlzdHJ1Y3Qgdm1fbGlzdF9zdHJ1Y3QgKnRicDsKKwlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYTsKKwlzdHJ1Y3QgcmJfbm9kZSAqcDsKIAl1bnNpZ25lZCBsb25nIHZzaXplID0gMDsKIAogCWRvd25fcmVhZCgmbW0tPm1tYXBfc2VtKTsKLQlmb3IgKHRicCA9IG1tLT5jb250ZXh0LnZtbGlzdDsgdGJwOyB0YnAgPSB0YnAtPm5leHQpIHsKLQkJaWYgKHRicC0+dm1hKQotCQkJdnNpemUgKz0ga29ianNpemUoKHZvaWQgKikgdGJwLT52bWEtPnZtX3N0YXJ0KTsKKwlmb3IgKHAgPSByYl9maXJzdCgmbW0tPm1tX3JiKTsgcDsgcCA9IHJiX25leHQocCkpIHsKKwkJdm1hID0gcmJfZW50cnkocCwgc3RydWN0IHZtX2FyZWFfc3RydWN0LCB2bV9yYik7CisJCXZzaXplICs9IHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydDsKIAl9CiAJdXBfcmVhZCgmbW0tPm1tYXBfc2VtKTsKIAlyZXR1cm4gdnNpemU7CkBAIC04NSwxNSArOTMsMTkgQEAKIGludCB0YXNrX3N0YXRtKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBpbnQgKnNoYXJlZCwgaW50ICp0ZXh0LAogCSAgICAgICBpbnQgKmRhdGEsIGludCAqcmVzaWRlbnQpCiB7Ci0Jc3RydWN0IHZtX2xpc3Rfc3RydWN0ICp0YnA7CisJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWE7CisJc3RydWN0IHZtX3JlZ2lvbiAqcmVnaW9uOworCXN0cnVjdCByYl9ub2RlICpwOwogCWludCBzaXplID0ga29ianNpemUobW0pOwogCiAJZG93bl9yZWFkKCZtbS0+bW1hcF9zZW0pOwotCWZvciAodGJwID0gbW0tPmNvbnRleHQudm1saXN0OyB0YnA7IHRicCA9IHRicC0+bmV4dCkgewotCQlzaXplICs9IGtvYmpzaXplKHRicCk7Ci0JCWlmICh0YnAtPnZtYSkgewotCQkJc2l6ZSArPSBrb2Jqc2l6ZSh0YnAtPnZtYSk7Ci0JCQlzaXplICs9IGtvYmpzaXplKCh2b2lkICopIHRicC0+dm1hLT52bV9zdGFydCk7CisJZm9yIChwID0gcmJfZmlyc3QoJm1tLT5tbV9yYik7IHA7IHAgPSByYl9uZXh0KHApKSB7CisJCXZtYSA9IHJiX2VudHJ5KHAsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCwgdm1fcmIpOworCQlzaXplICs9IGtvYmpzaXplKHZtYSk7CisJCXJlZ2lvbiA9IHZtYS0+dm1fcmVnaW9uOworCQlpZiAocmVnaW9uKSB7CisJCQlzaXplICs9IGtvYmpzaXplKHJlZ2lvbik7CisJCQlzaXplICs9IHJlZ2lvbi0+dm1fZW5kIC0gcmVnaW9uLT52bV9zdGFydDsKIAkJfQogCX0KIApAQCAtMTA1LDIwICsxMTcsNjIgQEAKIH0KIAogLyoKKyAqIGRpc3BsYXkgYSBzaW5nbGUgVk1BIHRvIGEgc2VxdWVuY2VkIGZpbGUKKyAqLworc3RhdGljIGludCBub21tdV92bWFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQoreworCXVuc2lnbmVkIGxvbmcgaW5vID0gMDsKKwlzdHJ1Y3QgZmlsZSAqZmlsZTsKKwlkZXZfdCBkZXYgPSAwOworCWludCBmbGFncywgbGVuOworCisJZmxhZ3MgPSB2bWEtPnZtX2ZsYWdzOworCWZpbGUgPSB2bWEtPnZtX2ZpbGU7CisKKwlpZiAoZmlsZSkgeworCQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gdm1hLT52bV9maWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOworCQlkZXYgPSBpbm9kZS0+aV9zYi0+c19kZXY7CisJCWlubyA9IGlub2RlLT5pX2lubzsKKwl9CisKKwlzZXFfcHJpbnRmKG0sCisJCSAgICIlMDhseC0lMDhseCAlYyVjJWMlYyAlMDhseCAlMDJ4OiUwMnggJWx1ICVuIiwKKwkJICAgdm1hLT52bV9zdGFydCwKKwkJICAgdm1hLT52bV9lbmQsCisJCSAgIGZsYWdzICYgVk1fUkVBRCA/ICdyJyA6ICctJywKKwkJICAgZmxhZ3MgJiBWTV9XUklURSA/ICd3JyA6ICctJywKKwkJICAgZmxhZ3MgJiBWTV9FWEVDID8gJ3gnIDogJy0nLAorCQkgICBmbGFncyAmIFZNX01BWVNIQVJFID8gZmxhZ3MgJiBWTV9TSEFSRUQgPyAnUycgOiAncycgOiAncCcsCisJCSAgIHZtYS0+dm1fcGdvZmYgPDwgUEFHRV9TSElGVCwKKwkJICAgTUFKT1IoZGV2KSwgTUlOT1IoZGV2KSwgaW5vLCAmbGVuKTsKKworCWlmIChmaWxlKSB7CisJCWxlbiA9IDI1ICsgc2l6ZW9mKHZvaWQgKikgKiA2IC0gbGVuOworCQlpZiAobGVuIDwgMSkKKwkJCWxlbiA9IDE7CisJCXNlcV9wcmludGYobSwgIiUqYyIsIGxlbiwgJyAnKTsKKwkJc2VxX3BhdGgobSwgJmZpbGUtPmZfcGF0aCwgIiIpOworCX0KKworCXNlcV9wdXRjKG0sICdcbicpOworCXJldHVybiAwOworfQorCisvKgogICogZGlzcGxheSBtYXBwaW5nIGxpbmVzIGZvciBhIHBhcnRpY3VsYXIgcHJvY2VzcydzIC9wcm9jL3BpZC9tYXBzCiAgKi8KLXN0YXRpYyBpbnQgc2hvd19tYXAoc3RydWN0IHNlcV9maWxlICptLCB2b2lkICpfdm1sKQorc3RhdGljIGludCBzaG93X21hcChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKl9wKQogewotCXN0cnVjdCB2bV9saXN0X3N0cnVjdCAqdm1sID0gX3ZtbDsKKwlzdHJ1Y3QgcmJfbm9kZSAqcCA9IF9wOwogCi0JcmV0dXJuIG5vbW11X3ZtYV9zaG93KG0sIHZtbC0+dm1hKTsKKwlyZXR1cm4gbm9tbXVfdm1hX3Nob3cobSwgcmJfZW50cnkocCwgc3RydWN0IHZtX2FyZWFfc3RydWN0LCB2bV9yYikpOwogfQogCiBzdGF0aWMgdm9pZCAqbV9zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIGxvZmZfdCAqcG9zKQogewogCXN0cnVjdCBwcm9jX21hcHNfcHJpdmF0ZSAqcHJpdiA9IG0tPnByaXZhdGU7Ci0Jc3RydWN0IHZtX2xpc3Rfc3RydWN0ICp2bWw7CiAJc3RydWN0IG1tX3N0cnVjdCAqbW07CisJc3RydWN0IHJiX25vZGUgKnA7CiAJbG9mZl90IG4gPSAqcG9zOwogCiAJLyogcGluIHRoZSB0YXNrIGFuZCBtbSB3aGlsc3Qgd2UgcGxheSB3aXRoIHRoZW0gKi8KQEAgLTEzNCw5ICsxODgsOSBAQAogCX0KIAogCS8qIHN0YXJ0IGZyb20gdGhlIE50aCBWTUEgKi8KLQlmb3IgKHZtbCA9IG1tLT5jb250ZXh0LnZtbGlzdDsgdm1sOyB2bWwgPSB2bWwtPm5leHQpCisJZm9yIChwID0gcmJfZmlyc3QoJm1tLT5tbV9yYik7IHA7IHAgPSByYl9uZXh0KHApKQogCQlpZiAobi0tID09IDApCi0JCQlyZXR1cm4gdm1sOworCQkJcmV0dXJuIHA7CiAJcmV0dXJuIE5VTEw7CiB9CiAKQEAgLTE1MiwxMiArMjA2LDEyIEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCAqbV9uZXh0KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqX3ZtbCwgbG9mZl90ICpwb3MpCitzdGF0aWMgdm9pZCAqbV9uZXh0KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqX3AsIGxvZmZfdCAqcG9zKQogewotCXN0cnVjdCB2bV9saXN0X3N0cnVjdCAqdm1sID0gX3ZtbDsKKwlzdHJ1Y3QgcmJfbm9kZSAqcCA9IF9wOwogCiAJKCpwb3MpKys7Ci0JcmV0dXJuIHZtbCA/IHZtbC0+bmV4dCA6IE5VTEw7CisJcmV0dXJuIHAgPyByYl9uZXh0KHApIDogTlVMTDsKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzZXFfb3BlcmF0aW9ucyBwcm9jX3BpZF9tYXBzX29wcyA9IHsKZGlmZiAtLWdpdCBhL2ZzL3Byb2Mvdm1jb3JlLmMgYi9mcy9wcm9jL3ZtY29yZS5jCmluZGV4IDAzZWM1OTUuLjVlZGNjM2YgMTAwNjQ0Ci0tLSBhL2ZzL3Byb2Mvdm1jb3JlLmMKKysrIGIvZnMvcHJvYy92bWNvcmUuYwpAQCAtNDcsOCArNDcsNiBAQAogCiAJb2Zmc2V0ID0gKHVuc2lnbmVkIGxvbmcpKCpwcG9zICUgUEFHRV9TSVpFKTsKIAlwZm4gPSAodW5zaWduZWQgbG9uZykoKnBwb3MgLyBQQUdFX1NJWkUpOwotCWlmIChwZm4gPiBzYXZlZF9tYXhfcGZuKQotCQlyZXR1cm4gLUVJTlZBTDsKIAogCWRvIHsKIAkJaWYgKGNvdW50ID4gKFBBR0VfU0laRSAtIG9mZnNldCkpCmRpZmYgLS1naXQgYS9mcy9xdW90YS5jIGIvZnMvcXVvdGEuYwppbmRleCA0YThjOTRmLi5kNzZhZGE5IDEwMDY0NAotLS0gYS9mcy9xdW90YS5jCisrKyBiL2ZzL3F1b3RhLmMKQEAgLTM3MSw3ICszNzEsOCBAQAogICogY2FsbHMuIE1heWJlIHdlIG5lZWQgdG8gYWRkIHRoZSBwcm9jZXNzIHF1b3RhcyBldGMuIGluIHRoZSBmdXR1cmUsCiAgKiBidXQgd2UgcHJvYmFibHkgc2hvdWxkIHVzZSBybGltaXRzIGZvciB0aGF0LgogICovCi1hc21saW5rYWdlIGxvbmcgc3lzX3F1b3RhY3RsKHVuc2lnbmVkIGludCBjbWQsIGNvbnN0IGNoYXIgX191c2VyICpzcGVjaWFsLCBxaWRfdCBpZCwgdm9pZCBfX3VzZXIgKmFkZHIpCitTWVNDQUxMX0RFRklORTQocXVvdGFjdGwsIHVuc2lnbmVkIGludCwgY21kLCBjb25zdCBjaGFyIF9fdXNlciAqLCBzcGVjaWFsLAorCQlxaWRfdCwgaWQsIHZvaWQgX191c2VyICosIGFkZHIpCiB7CiAJdWludCBjbWRzLCB0eXBlOwogCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBOVUxMOwpkaWZmIC0tZ2l0IGEvZnMvcmFtZnMvZmlsZS1ub21tdS5jIGIvZnMvcmFtZnMvZmlsZS1ub21tdS5jCmluZGV4IDc2YWNkYmMuLmI5YjU2N2EgMTAwNjQ0Ci0tLSBhL2ZzL3JhbWZzL2ZpbGUtbm9tbXUuYworKysgYi9mcy9yYW1mcy9maWxlLW5vbW11LmMKQEAgLTI2MiwxMSArMjYyLDExIEBACiAJcmV0ID0gLUVOT01FTTsKIAlwYWdlcyA9IGt6YWxsb2MobHBhZ2VzICogc2l6ZW9mKHN0cnVjdCBwYWdlICopLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXBhZ2VzKQotCQlnb3RvIG91dDsKKwkJZ290byBvdXRfZnJlZTsKIAogCW5yID0gZmluZF9nZXRfcGFnZXMoaW5vZGUtPmlfbWFwcGluZywgcGdvZmYsIGxwYWdlcywgcGFnZXMpOwogCWlmIChuciAhPSBscGFnZXMpCi0JCWdvdG8gb3V0OyAvKiBsZWF2ZSBpZiBzb21lIHBhZ2VzIHdlcmUgbWlzc2luZyAqLworCQlnb3RvIG91dF9mcmVlX3BhZ2VzOyAvKiBsZWF2ZSBpZiBzb21lIHBhZ2VzIHdlcmUgbWlzc2luZyAqLwogCiAJLyogY2hlY2sgdGhlIHBhZ2VzIGZvciBwaHlzaWNhbCBhZGphY2VuY3kgKi8KIAlwdHIgPSBwYWdlczsKQEAgLTI3NCwxOSArMjc0LDE4IEBACiAJcGFnZSsrOwogCWZvciAobG9vcCA9IGxwYWdlczsgbG9vcCA+IDE7IGxvb3AtLSkKIAkJaWYgKCpwdHIrKyAhPSBwYWdlKyspCi0JCQlnb3RvIG91dDsKKwkJCWdvdG8gb3V0X2ZyZWVfcGFnZXM7CiAKIAkvKiBva2F5IC0gYWxsIGNvbmRpdGlvbnMgZnVsZmlsbGVkICovCiAJcmV0ID0gKHVuc2lnbmVkIGxvbmcpIHBhZ2VfYWRkcmVzcyhwYWdlc1swXSk7CiAKLSBvdXQ6Ci0JaWYgKHBhZ2VzKSB7Ci0JCXB0ciA9IHBhZ2VzOwotCQlmb3IgKGxvb3AgPSBscGFnZXM7IGxvb3AgPiAwOyBsb29wLS0pCi0JCQlwdXRfcGFnZSgqcHRyKyspOwotCQlrZnJlZShwYWdlcyk7Ci0JfQotCitvdXRfZnJlZV9wYWdlczoKKwlwdHIgPSBwYWdlczsKKwlmb3IgKGxvb3AgPSBucjsgbG9vcCA+IDA7IGxvb3AtLSkKKwkJcHV0X3BhZ2UoKnB0cisrKTsKK291dF9mcmVlOgorCWtmcmVlKHBhZ2VzKTsKK291dDoKIAlyZXR1cm4gcmV0OwogfQogCmRpZmYgLS1naXQgYS9mcy9yZWFkX3dyaXRlLmMgYi9mcy9yZWFkX3dyaXRlLmMKaW5kZXggNWNjNjkyNC4uNDAwZmU4MSAxMDA2NDQKLS0tIGEvZnMvcmVhZF93cml0ZS5jCisrKyBiL2ZzL3JlYWRfd3JpdGUuYwpAQCAtMTQ3LDcgKzE0Nyw3IEBACiB9CiBFWFBPUlRfU1lNQk9MKHZmc19sbHNlZWspOwogCi1hc21saW5rYWdlIG9mZl90IHN5c19sc2Vlayh1bnNpZ25lZCBpbnQgZmQsIG9mZl90IG9mZnNldCwgdW5zaWduZWQgaW50IG9yaWdpbikKK1NZU0NBTExfREVGSU5FMyhsc2VlaywgdW5zaWduZWQgaW50LCBmZCwgb2ZmX3QsIG9mZnNldCwgdW5zaWduZWQgaW50LCBvcmlnaW4pCiB7CiAJb2ZmX3QgcmV0dmFsOwogCXN0cnVjdCBmaWxlICogZmlsZTsKQEAgLTE3MSw5ICsxNzEsOSBAQAogfQogCiAjaWZkZWYgX19BUkNIX1dBTlRfU1lTX0xMU0VFSwotYXNtbGlua2FnZSBsb25nIHN5c19sbHNlZWsodW5zaWduZWQgaW50IGZkLCB1bnNpZ25lZCBsb25nIG9mZnNldF9oaWdoLAotCQkJICAgdW5zaWduZWQgbG9uZyBvZmZzZXRfbG93LCBsb2ZmX3QgX191c2VyICogcmVzdWx0LAotCQkJICAgdW5zaWduZWQgaW50IG9yaWdpbikKK1NZU0NBTExfREVGSU5FNShsbHNlZWssIHVuc2lnbmVkIGludCwgZmQsIHVuc2lnbmVkIGxvbmcsIG9mZnNldF9oaWdoLAorCQl1bnNpZ25lZCBsb25nLCBvZmZzZXRfbG93LCBsb2ZmX3QgX191c2VyICosIHJlc3VsdCwKKwkJdW5zaWduZWQgaW50LCBvcmlnaW4pCiB7CiAJaW50IHJldHZhbDsKIAlzdHJ1Y3QgZmlsZSAqIGZpbGU7CkBAIC0zNjksNyArMzY5LDcgQEAKIAlmaWxlLT5mX3BvcyA9IHBvczsKIH0KIAotYXNtbGlua2FnZSBzc2l6ZV90IHN5c19yZWFkKHVuc2lnbmVkIGludCBmZCwgY2hhciBfX3VzZXIgKiBidWYsIHNpemVfdCBjb3VudCkKK1NZU0NBTExfREVGSU5FMyhyZWFkLCB1bnNpZ25lZCBpbnQsIGZkLCBjaGFyIF9fdXNlciAqLCBidWYsIHNpemVfdCwgY291bnQpCiB7CiAJc3RydWN0IGZpbGUgKmZpbGU7CiAJc3NpemVfdCByZXQgPSAtRUJBREY7CkBAIC0zODYsNyArMzg2LDggQEAKIAlyZXR1cm4gcmV0OwogfQogCi1hc21saW5rYWdlIHNzaXplX3Qgc3lzX3dyaXRlKHVuc2lnbmVkIGludCBmZCwgY29uc3QgY2hhciBfX3VzZXIgKiBidWYsIHNpemVfdCBjb3VudCkKK1NZU0NBTExfREVGSU5FMyh3cml0ZSwgdW5zaWduZWQgaW50LCBmZCwgY29uc3QgY2hhciBfX3VzZXIgKiwgYnVmLAorCQlzaXplX3QsIGNvdW50KQogewogCXN0cnVjdCBmaWxlICpmaWxlOwogCXNzaXplX3QgcmV0ID0gLUVCQURGOwpAQCAtNDAzLDggKzQwNCw4IEBACiAJcmV0dXJuIHJldDsKIH0KIAotYXNtbGlua2FnZSBzc2l6ZV90IHN5c19wcmVhZDY0KHVuc2lnbmVkIGludCBmZCwgY2hhciBfX3VzZXIgKmJ1ZiwKLQkJCSAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgcG9zKQorU1lTQ0FMTF9ERUZJTkUocHJlYWQ2NCkodW5zaWduZWQgaW50IGZkLCBjaGFyIF9fdXNlciAqYnVmLAorCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgcG9zKQogewogCXN0cnVjdCBmaWxlICpmaWxlOwogCXNzaXplX3QgcmV0ID0gLUVCQURGOwpAQCAtNDIzLDkgKzQyNCwxNyBAQAogCiAJcmV0dXJuIHJldDsKIH0KKyNpZmRlZiBDT05GSUdfSEFWRV9TWVNDQUxMX1dSQVBQRVJTCithc21saW5rYWdlIGxvbmcgU3lTX3ByZWFkNjQobG9uZyBmZCwgbG9uZyBidWYsIGxvbmcgY291bnQsIGxvZmZfdCBwb3MpCit7CisJcmV0dXJuIFNZU0NfcHJlYWQ2NCgodW5zaWduZWQgaW50KSBmZCwgKGNoYXIgX191c2VyICopIGJ1ZiwKKwkJCSAgICAoc2l6ZV90KSBjb3VudCwgcG9zKTsKK30KK1NZU0NBTExfQUxJQVMoc3lzX3ByZWFkNjQsIFN5U19wcmVhZDY0KTsKKyNlbmRpZgogCi1hc21saW5rYWdlIHNzaXplX3Qgc3lzX3B3cml0ZTY0KHVuc2lnbmVkIGludCBmZCwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKLQkJCSAgICAgIHNpemVfdCBjb3VudCwgbG9mZl90IHBvcykKK1NZU0NBTExfREVGSU5FKHB3cml0ZTY0KSh1bnNpZ25lZCBpbnQgZmQsIGNvbnN0IGNoYXIgX191c2VyICpidWYsCisJCQkgc2l6ZV90IGNvdW50LCBsb2ZmX3QgcG9zKQogewogCXN0cnVjdCBmaWxlICpmaWxlOwogCXNzaXplX3QgcmV0ID0gLUVCQURGOwpAQCAtNDQ0LDYgKzQ1MywxNCBAQAogCiAJcmV0dXJuIHJldDsKIH0KKyNpZmRlZiBDT05GSUdfSEFWRV9TWVNDQUxMX1dSQVBQRVJTCithc21saW5rYWdlIGxvbmcgU3lTX3B3cml0ZTY0KGxvbmcgZmQsIGxvbmcgYnVmLCBsb25nIGNvdW50LCBsb2ZmX3QgcG9zKQoreworCXJldHVybiBTWVNDX3B3cml0ZTY0KCh1bnNpZ25lZCBpbnQpIGZkLCAoY29uc3QgY2hhciBfX3VzZXIgKikgYnVmLAorCQkJICAgICAoc2l6ZV90KSBjb3VudCwgcG9zKTsKK30KK1NZU0NBTExfQUxJQVMoc3lzX3B3cml0ZTY0LCBTeVNfcHdyaXRlNjQpOworI2VuZGlmCiAKIC8qCiAgKiBSZWR1Y2UgYW4gaW92ZWMncyBsZW5ndGggaW4tcGxhY2UuICBSZXR1cm4gdGhlIHJlc3VsdGluZyBudW1iZXIgb2Ygc2VnbWVudHMKQEAgLTY3Miw4ICs2ODksOCBAQAogCiBFWFBPUlRfU1lNQk9MKHZmc193cml0ZXYpOwogCi1hc21saW5rYWdlIHNzaXplX3QKLXN5c19yZWFkdih1bnNpZ25lZCBsb25nIGZkLCBjb25zdCBzdHJ1Y3QgaW92ZWMgX191c2VyICp2ZWMsIHVuc2lnbmVkIGxvbmcgdmxlbikKK1NZU0NBTExfREVGSU5FMyhyZWFkdiwgdW5zaWduZWQgbG9uZywgZmQsIGNvbnN0IHN0cnVjdCBpb3ZlYyBfX3VzZXIgKiwgdmVjLAorCQl1bnNpZ25lZCBsb25nLCB2bGVuKQogewogCXN0cnVjdCBmaWxlICpmaWxlOwogCXNzaXplX3QgcmV0ID0gLUVCQURGOwpAQCAtNjkzLDggKzcxMCw4IEBACiAJcmV0dXJuIHJldDsKIH0KIAotYXNtbGlua2FnZSBzc2l6ZV90Ci1zeXNfd3JpdGV2KHVuc2lnbmVkIGxvbmcgZmQsIGNvbnN0IHN0cnVjdCBpb3ZlYyBfX3VzZXIgKnZlYywgdW5zaWduZWQgbG9uZyB2bGVuKQorU1lTQ0FMTF9ERUZJTkUzKHdyaXRldiwgdW5zaWduZWQgbG9uZywgZmQsIGNvbnN0IHN0cnVjdCBpb3ZlYyBfX3VzZXIgKiwgdmVjLAorCQl1bnNpZ25lZCBsb25nLCB2bGVuKQogewogCXN0cnVjdCBmaWxlICpmaWxlOwogCXNzaXplX3QgcmV0ID0gLUVCQURGOwpAQCAtODEyLDcgKzgyOSw3IEBACiAJcmV0dXJuIHJldHZhbDsKIH0KIAotYXNtbGlua2FnZSBzc2l6ZV90IHN5c19zZW5kZmlsZShpbnQgb3V0X2ZkLCBpbnQgaW5fZmQsIG9mZl90IF9fdXNlciAqb2Zmc2V0LCBzaXplX3QgY291bnQpCitTWVNDQUxMX0RFRklORTQoc2VuZGZpbGUsIGludCwgb3V0X2ZkLCBpbnQsIGluX2ZkLCBvZmZfdCBfX3VzZXIgKiwgb2Zmc2V0LCBzaXplX3QsIGNvdW50KQogewogCWxvZmZfdCBwb3M7CiAJb2ZmX3Qgb2ZmOwpAQCAtODMxLDcgKzg0OCw3IEBACiAJcmV0dXJuIGRvX3NlbmRmaWxlKG91dF9mZCwgaW5fZmQsIE5VTEwsIGNvdW50LCAwKTsKIH0KIAotYXNtbGlua2FnZSBzc2l6ZV90IHN5c19zZW5kZmlsZTY0KGludCBvdXRfZmQsIGludCBpbl9mZCwgbG9mZl90IF9fdXNlciAqb2Zmc2V0LCBzaXplX3QgY291bnQpCitTWVNDQUxMX0RFRklORTQoc2VuZGZpbGU2NCwgaW50LCBvdXRfZmQsIGludCwgaW5fZmQsIGxvZmZfdCBfX3VzZXIgKiwgb2Zmc2V0LCBzaXplX3QsIGNvdW50KQogewogCWxvZmZfdCBwb3M7CiAJc3NpemVfdCByZXQ7CmRpZmYgLS1naXQgYS9mcy9yZWFkZGlyLmMgYi9mcy9yZWFkZGlyLmMKaW5kZXggYjMxOGQ5Yi4uNzcyMzQwMSAxMDA2NDQKLS0tIGEvZnMvcmVhZGRpci5jCisrKyBiL2ZzL3JlYWRkaXIuYwpAQCAtMTAyLDcgKzEwMiw4IEBACiAJcmV0dXJuIC1FRkFVTFQ7CiB9CiAKLWFzbWxpbmthZ2UgbG9uZyBvbGRfcmVhZGRpcih1bnNpZ25lZCBpbnQgZmQsIHN0cnVjdCBvbGRfbGludXhfZGlyZW50IF9fdXNlciAqIGRpcmVudCwgdW5zaWduZWQgaW50IGNvdW50KQorU1lTQ0FMTF9ERUZJTkUzKG9sZF9yZWFkZGlyLCB1bnNpZ25lZCBpbnQsIGZkLAorCQlzdHJ1Y3Qgb2xkX2xpbnV4X2RpcmVudCBfX3VzZXIgKiwgZGlyZW50LCB1bnNpZ25lZCBpbnQsIGNvdW50KQogewogCWludCBlcnJvcjsKIAlzdHJ1Y3QgZmlsZSAqIGZpbGU7CkBAIC0xODcsNyArMTg4LDggQEAKIAlyZXR1cm4gLUVGQVVMVDsKIH0KIAotYXNtbGlua2FnZSBsb25nIHN5c19nZXRkZW50cyh1bnNpZ25lZCBpbnQgZmQsIHN0cnVjdCBsaW51eF9kaXJlbnQgX191c2VyICogZGlyZW50LCB1bnNpZ25lZCBpbnQgY291bnQpCitTWVNDQUxMX0RFRklORTMoZ2V0ZGVudHMsIHVuc2lnbmVkIGludCwgZmQsCisJCXN0cnVjdCBsaW51eF9kaXJlbnQgX191c2VyICosIGRpcmVudCwgdW5zaWduZWQgaW50LCBjb3VudCkKIHsKIAlzdHJ1Y3QgZmlsZSAqIGZpbGU7CiAJc3RydWN0IGxpbnV4X2RpcmVudCBfX3VzZXIgKiBsYXN0ZGlyZW50OwpAQCAtMjY4LDcgKzI3MCw4IEBACiAJcmV0dXJuIC1FRkFVTFQ7CiB9CiAKLWFzbWxpbmthZ2UgbG9uZyBzeXNfZ2V0ZGVudHM2NCh1bnNpZ25lZCBpbnQgZmQsIHN0cnVjdCBsaW51eF9kaXJlbnQ2NCBfX3VzZXIgKiBkaXJlbnQsIHVuc2lnbmVkIGludCBjb3VudCkKK1NZU0NBTExfREVGSU5FMyhnZXRkZW50czY0LCB1bnNpZ25lZCBpbnQsIGZkLAorCQlzdHJ1Y3QgbGludXhfZGlyZW50NjQgX191c2VyICosIGRpcmVudCwgdW5zaWduZWQgaW50LCBjb3VudCkKIHsKIAlzdHJ1Y3QgZmlsZSAqIGZpbGU7CiAJc3RydWN0IGxpbnV4X2RpcmVudDY0IF9fdXNlciAqIGxhc3RkaXJlbnQ7CmRpZmYgLS1naXQgYS9mcy9yZWlzZXJmcy9zdXBlci5jIGIvZnMvcmVpc2VyZnMvc3VwZXIuYwppbmRleCBjNTU2NTFmLi5mM2M4MjBiIDEwMDY0NAotLS0gYS9mcy9yZWlzZXJmcy9zdXBlci5jCisrKyBiL2ZzL3JlaXNlcmZzL3N1cGVyLmMKQEAgLTgzLDcgKzgzLDcgQEAKIAlyZWlzZXJmc19zeW5jX2ZzKHMsIDEpOwogfQogCi1zdGF0aWMgdm9pZCByZWlzZXJmc193cml0ZV9zdXBlcl9sb2NrZnMoc3RydWN0IHN1cGVyX2Jsb2NrICpzKQorc3RhdGljIGludCByZWlzZXJmc19mcmVlemUoc3RydWN0IHN1cGVyX2Jsb2NrICpzKQogewogCXN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgdGg7CiAJcmVpc2VyZnNfd3JpdGVfbG9jayhzKTsKQEAgLTEwMSwxMSArMTAxLDEzIEBACiAJfQogCXMtPnNfZGlydCA9IDA7CiAJcmVpc2VyZnNfd3JpdGVfdW5sb2NrKHMpOworCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCByZWlzZXJmc191bmxvY2tmcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMpCitzdGF0aWMgaW50IHJlaXNlcmZzX3VuZnJlZXplKHN0cnVjdCBzdXBlcl9ibG9jayAqcykKIHsKIAlyZWlzZXJmc19hbGxvd193cml0ZXMocyk7CisJcmV0dXJuIDA7CiB9CiAKIGV4dGVybiBjb25zdCBzdHJ1Y3QgaW5fY29yZV9rZXkgTUFYX0lOX0NPUkVfS0VZOwpAQCAtNjEzLDggKzYxNSw4IEBACiAJLnB1dF9zdXBlciA9IHJlaXNlcmZzX3B1dF9zdXBlciwKIAkud3JpdGVfc3VwZXIgPSByZWlzZXJmc193cml0ZV9zdXBlciwKIAkuc3luY19mcyA9IHJlaXNlcmZzX3N5bmNfZnMsCi0JLndyaXRlX3N1cGVyX2xvY2tmcyA9IHJlaXNlcmZzX3dyaXRlX3N1cGVyX2xvY2tmcywKLQkudW5sb2NrZnMgPSByZWlzZXJmc191bmxvY2tmcywKKwkuZnJlZXplX2ZzID0gcmVpc2VyZnNfZnJlZXplLAorCS51bmZyZWV6ZV9mcyA9IHJlaXNlcmZzX3VuZnJlZXplLAogCS5zdGF0ZnMgPSByZWlzZXJmc19zdGF0ZnMsCiAJLnJlbW91bnRfZnMgPSByZWlzZXJmc19yZW1vdW50LAogCS5zaG93X29wdGlvbnMgPSBnZW5lcmljX3Nob3dfb3B0aW9ucywKZGlmZiAtLWdpdCBhL2ZzL3JvbWZzL2lub2RlLmMgYi9mcy9yb21mcy9pbm9kZS5jCmluZGV4IGM5N2Q0YzkuLjk4YTIzMmYgMTAwNjQ0Ci0tLSBhL2ZzL3JvbWZzL2lub2RlLmMKKysrIGIvZnMvcm9tZnMvaW5vZGUuYwpAQCAtNDkwLDcgKzQ5MCw3IEBACiBzdGF0aWMgc3RydWN0IGlub2RlICoKIHJvbWZzX2lnZXQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdW5zaWduZWQgbG9uZyBpbm8pCiB7Ci0JaW50IG5leHRmaDsKKwlpbnQgbmV4dGZoLCByZXQ7CiAJc3RydWN0IHJvbWZzX2lub2RlIHJpOwogCXN0cnVjdCBpbm9kZSAqaTsKIApAQCAtNTI2LDExICs1MjYsMTEgQEAKIAlpLT5pX210aW1lLnR2X25zZWMgPSBpLT5pX2F0aW1lLnR2X25zZWMgPSBpLT5pX2N0aW1lLnR2X25zZWMgPSAwOwogCiAgICAgICAgIC8qIFByZWNhbGN1bGF0ZSB0aGUgZGF0YSBvZmZzZXQgKi8KLSAgICAgICAgaW5vID0gcm9tZnNfc3RybmxlbihpLCBpbm8rUk9NRkhfU0laRSwgUk9NRlNfTUFYRk4pOwotICAgICAgICBpZiAoaW5vID49IDApCi0gICAgICAgICAgICAgICAgaW5vID0gKChST01GSF9TSVpFK2lubysxK1JPTUZIX1BBRCkmUk9NRkhfTUFTSyk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBpbm8gPSAwOworCXJldCA9IHJvbWZzX3N0cm5sZW4oaSwgaW5vICsgUk9NRkhfU0laRSwgUk9NRlNfTUFYRk4pOworCWlmIChyZXQgPj0gMCkKKwkJaW5vID0gKFJPTUZIX1NJWkUgKyByZXQgKyAxICsgUk9NRkhfUEFEKSAmIFJPTUZIX01BU0s7CisJZWxzZQorCQlpbm8gPSAwOwogCiAgICAgICAgIFJPTUZTX0koaSktPmlfbWV0YXNpemUgPSBpbm87CiAgICAgICAgIFJPTUZTX0koaSktPmlfZGF0YW9mZnNldCA9IGlubysoaS0+aV9pbm8mUk9NRkhfTUFTSyk7CmRpZmYgLS1naXQgYS9mcy9zZWxlY3QuYyBiL2ZzL3NlbGVjdC5jCmluZGV4IDA4YjkxYmUuLjBmZTBlMTQgMTAwNjQ0Ci0tLSBhL2ZzL3NlbGVjdC5jCisrKyBiL2ZzL3NlbGVjdC5jCkBAIC01NTcsOCArNTU3LDggQEAKIAlyZXR1cm4gcmV0OwogfQogCi1hc21saW5rYWdlIGxvbmcgc3lzX3NlbGVjdChpbnQgbiwgZmRfc2V0IF9fdXNlciAqaW5wLCBmZF9zZXQgX191c2VyICpvdXRwLAotCQkJZmRfc2V0IF9fdXNlciAqZXhwLCBzdHJ1Y3QgdGltZXZhbCBfX3VzZXIgKnR2cCkKK1NZU0NBTExfREVGSU5FNShzZWxlY3QsIGludCwgbiwgZmRfc2V0IF9fdXNlciAqLCBpbnAsIGZkX3NldCBfX3VzZXIgKiwgb3V0cCwKKwkJZmRfc2V0IF9fdXNlciAqLCBleHAsIHN0cnVjdCB0aW1ldmFsIF9fdXNlciAqLCB0dnApCiB7CiAJc3RydWN0IHRpbWVzcGVjIGVuZF90aW1lLCAqdG8gPSBOVUxMOwogCXN0cnVjdCB0aW1ldmFsIHR2OwpAQCAtNTgyLDkgKzU4Miw5IEBACiB9CiAKICNpZmRlZiBIQVZFX1NFVF9SRVNUT1JFX1NJR01BU0sKLWFzbWxpbmthZ2UgbG9uZyBzeXNfcHNlbGVjdDcoaW50IG4sIGZkX3NldCBfX3VzZXIgKmlucCwgZmRfc2V0IF9fdXNlciAqb3V0cCwKLQkJZmRfc2V0IF9fdXNlciAqZXhwLCBzdHJ1Y3QgdGltZXNwZWMgX191c2VyICp0c3AsCi0JCWNvbnN0IHNpZ3NldF90IF9fdXNlciAqc2lnbWFzaywgc2l6ZV90IHNpZ3NldHNpemUpCitzdGF0aWMgbG9uZyBkb19wc2VsZWN0KGludCBuLCBmZF9zZXQgX191c2VyICppbnAsIGZkX3NldCBfX3VzZXIgKm91dHAsCisJCSAgICAgICBmZF9zZXQgX191c2VyICpleHAsIHN0cnVjdCB0aW1lc3BlYyBfX3VzZXIgKnRzcCwKKwkJICAgICAgIGNvbnN0IHNpZ3NldF90IF9fdXNlciAqc2lnbWFzaywgc2l6ZV90IHNpZ3NldHNpemUpCiB7CiAJc2lnc2V0X3Qga3NpZ21hc2ssIHNpZ3NhdmVkOwogCXN0cnVjdCB0aW1lc3BlYyB0cywgZW5kX3RpbWUsICp0byA9IE5VTEw7CkBAIC02MTAsNyArNjEwLDcgQEAKIAkJc2lncHJvY21hc2soU0lHX1NFVE1BU0ssICZrc2lnbWFzaywgJnNpZ3NhdmVkKTsKIAl9CiAKLQlyZXQgPSBjb3JlX3N5c19zZWxlY3QobiwgaW5wLCBvdXRwLCBleHAsICZlbmRfdGltZSk7CisJcmV0ID0gY29yZV9zeXNfc2VsZWN0KG4sIGlucCwgb3V0cCwgZXhwLCB0byk7CiAJcmV0ID0gcG9sbF9zZWxlY3RfY29weV9yZW1haW5pbmcoJmVuZF90aW1lLCB0c3AsIDAsIHJldCk7CiAKIAlpZiAocmV0ID09IC1FUkVTVEFSVE5PSEFORCkgewpAQCAtNjM2LDggKzYzNiw5IEBACiAgKiB3aGljaCBoYXMgYSBwb2ludGVyIHRvIHRoZSBzaWdzZXRfdCBpdHNlbGYgZm9sbG93ZWQgYnkgYSBzaXplX3QgY29udGFpbmluZwogICogdGhlIHNpZ3NldCBzaXplLgogICovCi1hc21saW5rYWdlIGxvbmcgc3lzX3BzZWxlY3Q2KGludCBuLCBmZF9zZXQgX191c2VyICppbnAsIGZkX3NldCBfX3VzZXIgKm91dHAsCi0JZmRfc2V0IF9fdXNlciAqZXhwLCBzdHJ1Y3QgdGltZXNwZWMgX191c2VyICp0c3AsIHZvaWQgX191c2VyICpzaWcpCitTWVNDQUxMX0RFRklORTYocHNlbGVjdDYsIGludCwgbiwgZmRfc2V0IF9fdXNlciAqLCBpbnAsIGZkX3NldCBfX3VzZXIgKiwgb3V0cCwKKwkJZmRfc2V0IF9fdXNlciAqLCBleHAsIHN0cnVjdCB0aW1lc3BlYyBfX3VzZXIgKiwgdHNwLAorCQl2b2lkIF9fdXNlciAqLCBzaWcpCiB7CiAJc2l6ZV90IHNpZ3NldHNpemUgPSAwOwogCXNpZ3NldF90IF9fdXNlciAqdXAgPSBOVUxMOwpAQCAtNjUwLDcgKzY1MSw3IEBACiAJCQlyZXR1cm4gLUVGQVVMVDsKIAl9CiAKLQlyZXR1cm4gc3lzX3BzZWxlY3Q3KG4sIGlucCwgb3V0cCwgZXhwLCB0c3AsIHVwLCBzaWdzZXRzaXplKTsKKwlyZXR1cm4gZG9fcHNlbGVjdChuLCBpbnAsIG91dHAsIGV4cCwgdHNwLCB1cCwgc2lnc2V0c2l6ZSk7CiB9CiAjZW5kaWYgLyogSEFWRV9TRVRfUkVTVE9SRV9TSUdNQVNLICovCiAKQEAgLTg1NCw4ICs4NTUsOCBAQAogCXJldHVybiByZXQ7CiB9CiAKLWFzbWxpbmthZ2UgbG9uZyBzeXNfcG9sbChzdHJ1Y3QgcG9sbGZkIF9fdXNlciAqdWZkcywgdW5zaWduZWQgaW50IG5mZHMsCi0JCQlsb25nIHRpbWVvdXRfbXNlY3MpCitTWVNDQUxMX0RFRklORTMocG9sbCwgc3RydWN0IHBvbGxmZCBfX3VzZXIgKiwgdWZkcywgdW5zaWduZWQgaW50LCBuZmRzLAorCQlsb25nLCB0aW1lb3V0X21zZWNzKQogewogCXN0cnVjdCB0aW1lc3BlYyBlbmRfdGltZSwgKnRvID0gTlVMTDsKIAlpbnQgcmV0OwpAQCAtODg5LDkgKzg5MCw5IEBACiB9CiAKICNpZmRlZiBIQVZFX1NFVF9SRVNUT1JFX1NJR01BU0sKLWFzbWxpbmthZ2UgbG9uZyBzeXNfcHBvbGwoc3RydWN0IHBvbGxmZCBfX3VzZXIgKnVmZHMsIHVuc2lnbmVkIGludCBuZmRzLAotCXN0cnVjdCB0aW1lc3BlYyBfX3VzZXIgKnRzcCwgY29uc3Qgc2lnc2V0X3QgX191c2VyICpzaWdtYXNrLAotCXNpemVfdCBzaWdzZXRzaXplKQorU1lTQ0FMTF9ERUZJTkU1KHBwb2xsLCBzdHJ1Y3QgcG9sbGZkIF9fdXNlciAqLCB1ZmRzLCB1bnNpZ25lZCBpbnQsIG5mZHMsCisJCXN0cnVjdCB0aW1lc3BlYyBfX3VzZXIgKiwgdHNwLCBjb25zdCBzaWdzZXRfdCBfX3VzZXIgKiwgc2lnbWFzaywKKwkJc2l6ZV90LCBzaWdzZXRzaXplKQogewogCXNpZ3NldF90IGtzaWdtYXNrLCBzaWdzYXZlZDsKIAlzdHJ1Y3QgdGltZXNwZWMgdHMsIGVuZF90aW1lLCAqdG8gPSBOVUxMOwpkaWZmIC0tZ2l0IGEvZnMvc2lnbmFsZmQuYyBiL2ZzL3NpZ25hbGZkLmMKaW5kZXggOWMzOWJjNy4uYjA3NTY1YyAxMDA2NDQKLS0tIGEvZnMvc2lnbmFsZmQuYworKysgYi9mcy9zaWduYWxmZC5jCkBAIC0yMDUsOCArMjA1LDggQEAKIAkucmVhZAkJPSBzaWduYWxmZF9yZWFkLAogfTsKIAotYXNtbGlua2FnZSBsb25nIHN5c19zaWduYWxmZDQoaW50IHVmZCwgc2lnc2V0X3QgX191c2VyICp1c2VyX21hc2ssCi0JCQkgICAgICBzaXplX3Qgc2l6ZW1hc2ssIGludCBmbGFncykKK1NZU0NBTExfREVGSU5FNChzaWduYWxmZDQsIGludCwgdWZkLCBzaWdzZXRfdCBfX3VzZXIgKiwgdXNlcl9tYXNrLAorCQlzaXplX3QsIHNpemVtYXNrLCBpbnQsIGZsYWdzKQogewogCXNpZ3NldF90IHNpZ21hc2s7CiAJc3RydWN0IHNpZ25hbGZkX2N0eCAqY3R4OwpAQCAtMjU5LDggKzI1OSw4IEBACiAJcmV0dXJuIHVmZDsKIH0KIAotYXNtbGlua2FnZSBsb25nIHN5c19zaWduYWxmZChpbnQgdWZkLCBzaWdzZXRfdCBfX3VzZXIgKnVzZXJfbWFzaywKLQkJCSAgICAgc2l6ZV90IHNpemVtYXNrKQorU1lTQ0FMTF9ERUZJTkUzKHNpZ25hbGZkLCBpbnQsIHVmZCwgc2lnc2V0X3QgX191c2VyICosIHVzZXJfbWFzaywKKwkJc2l6ZV90LCBzaXplbWFzaykKIHsKIAlyZXR1cm4gc3lzX3NpZ25hbGZkNCh1ZmQsIHVzZXJfbWFzaywgc2l6ZW1hc2ssIDApOwogfQpkaWZmIC0tZ2l0IGEvZnMvc3BsaWNlLmMgYi9mcy9zcGxpY2UuYwppbmRleCAxYWJhYjVjLi40ZWQwYmE0IDEwMDY0NAotLS0gYS9mcy9zcGxpY2UuYworKysgYi9mcy9zcGxpY2UuYwpAQCAtMjEsNiArMjEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KICNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CiAjaW5jbHVkZSA8bGludXgvc3BsaWNlLmg+CisjaW5jbHVkZSA8bGludXgvbWVtY29udHJvbC5oPgogI2luY2x1ZGUgPGxpbnV4L21tX2lubGluZS5oPgogI2luY2x1ZGUgPGxpbnV4L3N3YXAuaD4KICNpbmNsdWRlIDxsaW51eC93cml0ZWJhY2suaD4KQEAgLTE0MzQsOCArMTQzNSw4IEBACiAgKiBDdXJyZW50bHkgd2UgcHVudCBhbmQgaW1wbGVtZW50IGl0IGFzIGEgbm9ybWFsIGNvcHksIHNlZSBwaXBlX3RvX3VzZXIoKS4KICAqCiAgKi8KLWFzbWxpbmthZ2UgbG9uZyBzeXNfdm1zcGxpY2UoaW50IGZkLCBjb25zdCBzdHJ1Y3QgaW92ZWMgX191c2VyICppb3YsCi0JCQkgICAgIHVuc2lnbmVkIGxvbmcgbnJfc2VncywgdW5zaWduZWQgaW50IGZsYWdzKQorU1lTQ0FMTF9ERUZJTkU0KHZtc3BsaWNlLCBpbnQsIGZkLCBjb25zdCBzdHJ1Y3QgaW92ZWMgX191c2VyICosIGlvdiwKKwkJdW5zaWduZWQgbG9uZywgbnJfc2VncywgdW5zaWduZWQgaW50LCBmbGFncykKIHsKIAlzdHJ1Y3QgZmlsZSAqZmlsZTsKIAlsb25nIGVycm9yOwpAQCAtMTQ2MCw5ICsxNDYxLDkgQEAKIAlyZXR1cm4gZXJyb3I7CiB9CiAKLWFzbWxpbmthZ2UgbG9uZyBzeXNfc3BsaWNlKGludCBmZF9pbiwgbG9mZl90IF9fdXNlciAqb2ZmX2luLAotCQkJICAgaW50IGZkX291dCwgbG9mZl90IF9fdXNlciAqb2ZmX291dCwKLQkJCSAgIHNpemVfdCBsZW4sIHVuc2lnbmVkIGludCBmbGFncykKK1NZU0NBTExfREVGSU5FNihzcGxpY2UsIGludCwgZmRfaW4sIGxvZmZfdCBfX3VzZXIgKiwgb2ZmX2luLAorCQlpbnQsIGZkX291dCwgbG9mZl90IF9fdXNlciAqLCBvZmZfb3V0LAorCQlzaXplX3QsIGxlbiwgdW5zaWduZWQgaW50LCBmbGFncykKIHsKIAlsb25nIGVycm9yOwogCXN0cnVjdCBmaWxlICppbiwgKm91dDsKQEAgLTE2ODQsNyArMTY4NSw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotYXNtbGlua2FnZSBsb25nIHN5c190ZWUoaW50IGZkaW4sIGludCBmZG91dCwgc2l6ZV90IGxlbiwgdW5zaWduZWQgaW50IGZsYWdzKQorU1lTQ0FMTF9ERUZJTkU0KHRlZSwgaW50LCBmZGluLCBpbnQsIGZkb3V0LCBzaXplX3QsIGxlbiwgdW5zaWduZWQgaW50LCBmbGFncykKIHsKIAlzdHJ1Y3QgZmlsZSAqaW47CiAJaW50IGVycm9yLCBmcHV0X2luOwpkaWZmIC0tZ2l0IGEvZnMvc3F1YXNoZnMvTWFrZWZpbGUgYi9mcy9zcXVhc2hmcy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MjU4Y2Y5Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvc3F1YXNoZnMvTWFrZWZpbGUKQEAgLTAsMCArMSw4IEBACisjCisjIE1ha2VmaWxlIGZvciB0aGUgbGludXggc3F1YXNoZnMgcm91dGluZXMuCisjCisKK29iai0kKENPTkZJR19TUVVBU0hGUykgKz0gc3F1YXNoZnMubworc3F1YXNoZnMteSArPSBibG9jay5vIGNhY2hlLm8gZGlyLm8gZXhwb3J0Lm8gZmlsZS5vIGZyYWdtZW50Lm8gaWQubyBpbm9kZS5vCitzcXVhc2hmcy15ICs9IG5hbWVpLm8gc3VwZXIubyBzeW1saW5rLm8KKyNzcXVhc2hmcy15ICs9IHNxdWFzaGZzMl8wLm8KZGlmZiAtLWdpdCBhL2ZzL3NxdWFzaGZzL2Jsb2NrLmMgYi9mcy9zcXVhc2hmcy9ibG9jay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4MzdkZmMKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9zcXVhc2hmcy9ibG9jay5jCkBAIC0wLDAgKzEsMjc0IEBACisvKgorICogU3F1YXNoZnMgLSBhIGNvbXByZXNzZWQgcmVhZCBvbmx5IGZpbGVzeXN0ZW0gZm9yIExpbnV4CisgKgorICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4CisgKiBQaGlsbGlwIExvdWdoZXIgPHBoaWxsaXBAbG91Z2hlci5kZW1vbi5jby51az4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsCisgKiBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqCisgKiBibG9jay5jCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHRoZSBsb3ctbGV2ZWwgcm91dGluZXMgdG8gcmVhZCBhbmQgZGVjb21wcmVzcworICogZGF0YWJsb2NrcyBhbmQgbWV0YWRhdGEgYmxvY2tzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3Zmcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CisjaW5jbHVkZSA8bGludXgvemxpYi5oPgorCisjaW5jbHVkZSAic3F1YXNoZnNfZnMuaCIKKyNpbmNsdWRlICJzcXVhc2hmc19mc19zYi5oIgorI2luY2x1ZGUgInNxdWFzaGZzX2ZzX2kuaCIKKyNpbmNsdWRlICJzcXVhc2hmcy5oIgorCisvKgorICogUmVhZCB0aGUgbWV0YWRhdGEgYmxvY2sgbGVuZ3RoLCB0aGlzIGlzIHN0b3JlZCBpbiB0aGUgZmlyc3QgdHdvCisgKiBieXRlcyBvZiB0aGUgbWV0YWRhdGEgYmxvY2suCisgKi8KK3N0YXRpYyBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmdldF9ibG9ja19sZW5ndGgoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwkJCXU2NCAqY3VyX2luZGV4LCBpbnQgKm9mZnNldCwgaW50ICpsZW5ndGgpCit7CisJc3RydWN0IHNxdWFzaGZzX3NiX2luZm8gKm1zYmxrID0gc2ItPnNfZnNfaW5mbzsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCisJYmggPSBzYl9icmVhZChzYiwgKmN1cl9pbmRleCk7CisJaWYgKGJoID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJaWYgKG1zYmxrLT5kZXZibGtzaXplIC0gKm9mZnNldCA9PSAxKSB7CisJCSpsZW5ndGggPSAodW5zaWduZWQgY2hhcikgYmgtPmJfZGF0YVsqb2Zmc2V0XTsKKwkJcHV0X2JoKGJoKTsKKwkJYmggPSBzYl9icmVhZChzYiwgKysoKmN1cl9pbmRleCkpOworCQlpZiAoYmggPT0gTlVMTCkKKwkJCXJldHVybiBOVUxMOworCQkqbGVuZ3RoIHw9ICh1bnNpZ25lZCBjaGFyKSBiaC0+Yl9kYXRhWzBdIDw8IDg7CisJCSpvZmZzZXQgPSAxOworCX0gZWxzZSB7CisJCSpsZW5ndGggPSAodW5zaWduZWQgY2hhcikgYmgtPmJfZGF0YVsqb2Zmc2V0XSB8CisJCQkodW5zaWduZWQgY2hhcikgYmgtPmJfZGF0YVsqb2Zmc2V0ICsgMV0gPDwgODsKKwkJKm9mZnNldCArPSAyOworCX0KKworCXJldHVybiBiaDsKK30KKworCisvKgorICogUmVhZCBhbmQgZGVjb21wcmVzcyBhIG1ldGFkYXRhIGJsb2NrIG9yIGRhdGFibG9jay4gIExlbmd0aCBpcyBub24temVybworICogaWYgYSBkYXRhYmxvY2sgaXMgYmVpbmcgcmVhZCAodGhlIHNpemUgaXMgc3RvcmVkIGVsc2V3aGVyZSBpbiB0aGUKKyAqIGZpbGVzeXN0ZW0pLCBvdGhlcndpc2UgdGhlIGxlbmd0aCBpcyBvYnRhaW5lZCBmcm9tIHRoZSBmaXJzdCB0d28gYnl0ZXMgb2YKKyAqIHRoZSBtZXRhZGF0YSBibG9jay4gIEEgYml0IGluIHRoZSBsZW5ndGggZmllbGQgaW5kaWNhdGVzIGlmIHRoZSBibG9jaworICogaXMgc3RvcmVkIHVuY29tcHJlc3NlZCBpbiB0aGUgZmlsZXN5c3RlbSAodXN1YWxseSBiZWNhdXNlIGNvbXByZXNzaW9uCisgKiBnZW5lcmF0ZWQgYSBsYXJnZXIgYmxvY2sgLSB0aGlzIGRvZXMgb2NjYXNpb25hbGx5IGhhcHBlbiB3aXRoIHpsaWIpLgorICovCitpbnQgc3F1YXNoZnNfcmVhZF9kYXRhKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHZvaWQgKipidWZmZXIsIHU2NCBpbmRleCwKKwkJCWludCBsZW5ndGgsIHU2NCAqbmV4dF9pbmRleCwgaW50IHNyY2xlbmd0aCkKK3sKKwlzdHJ1Y3Qgc3F1YXNoZnNfc2JfaW5mbyAqbXNibGsgPSBzYi0+c19mc19pbmZvOworCXN0cnVjdCBidWZmZXJfaGVhZCAqKmJoOworCWludCBvZmZzZXQgPSBpbmRleCAmICgoMSA8PCBtc2Jsay0+ZGV2Ymxrc2l6ZV9sb2cyKSAtIDEpOworCXU2NCBjdXJfaW5kZXggPSBpbmRleCA+PiBtc2Jsay0+ZGV2Ymxrc2l6ZV9sb2cyOworCWludCBieXRlcywgY29tcHJlc3NlZCwgYiA9IDAsIGsgPSAwLCBwYWdlID0gMCwgYXZhaWw7CisKKworCWJoID0ga2NhbGxvYygobXNibGstPmJsb2NrX3NpemUgPj4gbXNibGstPmRldmJsa3NpemVfbG9nMikgKyAxLAorCQkJCXNpemVvZigqYmgpLCBHRlBfS0VSTkVMKTsKKwlpZiAoYmggPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpZiAobGVuZ3RoKSB7CisJCS8qCisJCSAqIERhdGFibG9jay4KKwkJICovCisJCWJ5dGVzID0gLW9mZnNldDsKKwkJY29tcHJlc3NlZCA9IFNRVUFTSEZTX0NPTVBSRVNTRURfQkxPQ0sobGVuZ3RoKTsKKwkJbGVuZ3RoID0gU1FVQVNIRlNfQ09NUFJFU1NFRF9TSVpFX0JMT0NLKGxlbmd0aCk7CisJCWlmIChuZXh0X2luZGV4KQorCQkJKm5leHRfaW5kZXggPSBpbmRleCArIGxlbmd0aDsKKworCQlUUkFDRSgiQmxvY2sgQCAweCVsbHgsICVzY29tcHJlc3NlZCBzaXplICVkLCBzcmMgc2l6ZSAlZFxuIiwKKwkJCWluZGV4LCBjb21wcmVzc2VkID8gIiIgOiAidW4iLCBsZW5ndGgsIHNyY2xlbmd0aCk7CisKKwkJaWYgKGxlbmd0aCA8IDAgfHwgbGVuZ3RoID4gc3JjbGVuZ3RoIHx8CisJCQkJKGluZGV4ICsgbGVuZ3RoKSA+IG1zYmxrLT5ieXRlc191c2VkKQorCQkJZ290byByZWFkX2ZhaWx1cmU7CisKKwkJZm9yIChiID0gMDsgYnl0ZXMgPCBsZW5ndGg7IGIrKywgY3VyX2luZGV4KyspIHsKKwkJCWJoW2JdID0gc2JfZ2V0YmxrKHNiLCBjdXJfaW5kZXgpOworCQkJaWYgKGJoW2JdID09IE5VTEwpCisJCQkJZ290byBibG9ja19yZWxlYXNlOworCQkJYnl0ZXMgKz0gbXNibGstPmRldmJsa3NpemU7CisJCX0KKwkJbGxfcndfYmxvY2soUkVBRCwgYiwgYmgpOworCX0gZWxzZSB7CisJCS8qCisJCSAqIE1ldGFkYXRhIGJsb2NrLgorCQkgKi8KKwkJaWYgKChpbmRleCArIDIpID4gbXNibGstPmJ5dGVzX3VzZWQpCisJCQlnb3RvIHJlYWRfZmFpbHVyZTsKKworCQliaFswXSA9IGdldF9ibG9ja19sZW5ndGgoc2IsICZjdXJfaW5kZXgsICZvZmZzZXQsICZsZW5ndGgpOworCQlpZiAoYmhbMF0gPT0gTlVMTCkKKwkJCWdvdG8gcmVhZF9mYWlsdXJlOworCQliID0gMTsKKworCQlieXRlcyA9IG1zYmxrLT5kZXZibGtzaXplIC0gb2Zmc2V0OworCQljb21wcmVzc2VkID0gU1FVQVNIRlNfQ09NUFJFU1NFRChsZW5ndGgpOworCQlsZW5ndGggPSBTUVVBU0hGU19DT01QUkVTU0VEX1NJWkUobGVuZ3RoKTsKKwkJaWYgKG5leHRfaW5kZXgpCisJCQkqbmV4dF9pbmRleCA9IGluZGV4ICsgbGVuZ3RoICsgMjsKKworCQlUUkFDRSgiQmxvY2sgQCAweCVsbHgsICVzY29tcHJlc3NlZCBzaXplICVkXG4iLCBpbmRleCwKKwkJCQljb21wcmVzc2VkID8gIiIgOiAidW4iLCBsZW5ndGgpOworCisJCWlmIChsZW5ndGggPCAwIHx8IGxlbmd0aCA+IHNyY2xlbmd0aCB8fAorCQkJCQkoaW5kZXggKyBsZW5ndGgpID4gbXNibGstPmJ5dGVzX3VzZWQpCisJCQlnb3RvIGJsb2NrX3JlbGVhc2U7CisKKwkJZm9yICg7IGJ5dGVzIDwgbGVuZ3RoOyBiKyspIHsKKwkJCWJoW2JdID0gc2JfZ2V0YmxrKHNiLCArK2N1cl9pbmRleCk7CisJCQlpZiAoYmhbYl0gPT0gTlVMTCkKKwkJCQlnb3RvIGJsb2NrX3JlbGVhc2U7CisJCQlieXRlcyArPSBtc2Jsay0+ZGV2Ymxrc2l6ZTsKKwkJfQorCQlsbF9yd19ibG9jayhSRUFELCBiIC0gMSwgYmggKyAxKTsKKwl9CisKKwlpZiAoY29tcHJlc3NlZCkgeworCQlpbnQgemxpYl9lcnIgPSAwLCB6bGliX2luaXQgPSAwOworCisJCS8qCisJCSAqIFVuY29tcHJlc3MgYmxvY2suCisJCSAqLworCisJCW11dGV4X2xvY2soJm1zYmxrLT5yZWFkX2RhdGFfbXV0ZXgpOworCisJCW1zYmxrLT5zdHJlYW0uYXZhaWxfb3V0ID0gMDsKKwkJbXNibGstPnN0cmVhbS5hdmFpbF9pbiA9IDA7CisKKwkJYnl0ZXMgPSBsZW5ndGg7CisJCWRvIHsKKwkJCWlmIChtc2Jsay0+c3RyZWFtLmF2YWlsX2luID09IDAgJiYgayA8IGIpIHsKKwkJCQlhdmFpbCA9IG1pbihieXRlcywgbXNibGstPmRldmJsa3NpemUgLSBvZmZzZXQpOworCQkJCWJ5dGVzIC09IGF2YWlsOworCQkJCXdhaXRfb25fYnVmZmVyKGJoW2tdKTsKKwkJCQlpZiAoIWJ1ZmZlcl91cHRvZGF0ZShiaFtrXSkpCisJCQkJCWdvdG8gcmVsZWFzZV9tdXRleDsKKworCQkJCWlmIChhdmFpbCA9PSAwKSB7CisJCQkJCW9mZnNldCA9IDA7CisJCQkJCXB1dF9iaChiaFtrKytdKTsKKwkJCQkJY29udGludWU7CisJCQkJfQorCisJCQkJbXNibGstPnN0cmVhbS5uZXh0X2luID0gYmhba10tPmJfZGF0YSArIG9mZnNldDsKKwkJCQltc2Jsay0+c3RyZWFtLmF2YWlsX2luID0gYXZhaWw7CisJCQkJb2Zmc2V0ID0gMDsKKwkJCX0KKworCQkJaWYgKG1zYmxrLT5zdHJlYW0uYXZhaWxfb3V0ID09IDApIHsKKwkJCQltc2Jsay0+c3RyZWFtLm5leHRfb3V0ID0gYnVmZmVyW3BhZ2UrK107CisJCQkJbXNibGstPnN0cmVhbS5hdmFpbF9vdXQgPSBQQUdFX0NBQ0hFX1NJWkU7CisJCQl9CisKKwkJCWlmICghemxpYl9pbml0KSB7CisJCQkJemxpYl9lcnIgPSB6bGliX2luZmxhdGVJbml0KCZtc2Jsay0+c3RyZWFtKTsKKwkJCQlpZiAoemxpYl9lcnIgIT0gWl9PSykgeworCQkJCQlFUlJPUigiemxpYl9pbmZsYXRlSW5pdCByZXR1cm5lZCIKKwkJCQkJCSIgdW5leHBlY3RlZCByZXN1bHQgMHgleCwiCisJCQkJCQkiIHNyY2xlbmd0aCAlZFxuIiwgemxpYl9lcnIsCisJCQkJCQlzcmNsZW5ndGgpOworCQkJCQlnb3RvIHJlbGVhc2VfbXV0ZXg7CisJCQkJfQorCQkJCXpsaWJfaW5pdCA9IDE7CisJCQl9CisKKwkJCXpsaWJfZXJyID0gemxpYl9pbmZsYXRlKCZtc2Jsay0+c3RyZWFtLCBaX05PX0ZMVVNIKTsKKworCQkJaWYgKG1zYmxrLT5zdHJlYW0uYXZhaWxfaW4gPT0gMCAmJiBrIDwgYikKKwkJCQlwdXRfYmgoYmhbaysrXSk7CisJCX0gd2hpbGUgKHpsaWJfZXJyID09IFpfT0spOworCisJCWlmICh6bGliX2VyciAhPSBaX1NUUkVBTV9FTkQpIHsKKwkJCUVSUk9SKCJ6bGliX2luZmxhdGUgcmV0dXJuZWQgdW5leHBlY3RlZCByZXN1bHQiCisJCQkJIiAweCV4LCBzcmNsZW5ndGggJWQsIGF2YWlsX2luICVkLCIKKwkJCQkiIGF2YWlsX291dCAlZFxuIiwgemxpYl9lcnIsIHNyY2xlbmd0aCwKKwkJCQltc2Jsay0+c3RyZWFtLmF2YWlsX2luLAorCQkJCW1zYmxrLT5zdHJlYW0uYXZhaWxfb3V0KTsKKwkJCWdvdG8gcmVsZWFzZV9tdXRleDsKKwkJfQorCisJCXpsaWJfZXJyID0gemxpYl9pbmZsYXRlRW5kKCZtc2Jsay0+c3RyZWFtKTsKKwkJaWYgKHpsaWJfZXJyICE9IFpfT0spIHsKKwkJCUVSUk9SKCJ6bGliX2luZmxhdGVFbmQgcmV0dXJuZWQgdW5leHBlY3RlZCByZXN1bHQgMHgleCwiCisJCQkJIiBzcmNsZW5ndGggJWRcbiIsIHpsaWJfZXJyLCBzcmNsZW5ndGgpOworCQkJZ290byByZWxlYXNlX211dGV4OworCQl9CisJCWxlbmd0aCA9IG1zYmxrLT5zdHJlYW0udG90YWxfb3V0OworCQltdXRleF91bmxvY2soJm1zYmxrLT5yZWFkX2RhdGFfbXV0ZXgpOworCX0gZWxzZSB7CisJCS8qCisJCSAqIEJsb2NrIGlzIHVuY29tcHJlc3NlZC4KKwkJICovCisJCWludCBpLCBpbiwgcGdfb2Zmc2V0ID0gMDsKKworCQlmb3IgKGkgPSAwOyBpIDwgYjsgaSsrKSB7CisJCQl3YWl0X29uX2J1ZmZlcihiaFtpXSk7CisJCQlpZiAoIWJ1ZmZlcl91cHRvZGF0ZShiaFtpXSkpCisJCQkJZ290byBibG9ja19yZWxlYXNlOworCQl9CisKKwkJZm9yIChieXRlcyA9IGxlbmd0aDsgayA8IGI7IGsrKykgeworCQkJaW4gPSBtaW4oYnl0ZXMsIG1zYmxrLT5kZXZibGtzaXplIC0gb2Zmc2V0KTsKKwkJCWJ5dGVzIC09IGluOworCQkJd2hpbGUgKGluKSB7CisJCQkJaWYgKHBnX29mZnNldCA9PSBQQUdFX0NBQ0hFX1NJWkUpIHsKKwkJCQkJcGFnZSsrOworCQkJCQlwZ19vZmZzZXQgPSAwOworCQkJCX0KKwkJCQlhdmFpbCA9IG1pbl90KGludCwgaW4sIFBBR0VfQ0FDSEVfU0laRSAtCisJCQkJCQlwZ19vZmZzZXQpOworCQkJCW1lbWNweShidWZmZXJbcGFnZV0gKyBwZ19vZmZzZXQsCisJCQkJCQliaFtrXS0+Yl9kYXRhICsgb2Zmc2V0LCBhdmFpbCk7CisJCQkJaW4gLT0gYXZhaWw7CisJCQkJcGdfb2Zmc2V0ICs9IGF2YWlsOworCQkJCW9mZnNldCArPSBhdmFpbDsKKwkJCX0KKwkJCW9mZnNldCA9IDA7CisJCQlwdXRfYmgoYmhba10pOworCQl9CisJfQorCisJa2ZyZWUoYmgpOworCXJldHVybiBsZW5ndGg7CisKK3JlbGVhc2VfbXV0ZXg6CisJbXV0ZXhfdW5sb2NrKCZtc2Jsay0+cmVhZF9kYXRhX211dGV4KTsKKworYmxvY2tfcmVsZWFzZToKKwlmb3IgKDsgayA8IGI7IGsrKykKKwkJcHV0X2JoKGJoW2tdKTsKKworcmVhZF9mYWlsdXJlOgorCUVSUk9SKCJzYl9icmVhZCBmYWlsZWQgcmVhZGluZyBibG9jayAweCVsbHhcbiIsIGN1cl9pbmRleCk7CisJa2ZyZWUoYmgpOworCXJldHVybiAtRUlPOworfQpkaWZmIC0tZ2l0IGEvZnMvc3F1YXNoZnMvY2FjaGUuYyBiL2ZzL3NxdWFzaGZzL2NhY2hlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjI5ZWRhMQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3NxdWFzaGZzL2NhY2hlLmMKQEAgLTAsMCArMSw0MTIgQEAKKy8qCisgKiBTcXVhc2hmcyAtIGEgY29tcHJlc3NlZCByZWFkIG9ubHkgZmlsZXN5c3RlbSBmb3IgTGludXgKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgKKyAqIFBoaWxsaXAgTG91Z2hlciA8cGhpbGxpcEBsb3VnaGVyLmRlbW9uLmNvLnVrPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwKKyAqIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICoKKyAqIGNhY2hlLmMKKyAqLworCisvKgorICogQmxvY2tzIGluIFNxdWFzaGZzIGFyZSBjb21wcmVzc2VkLiAgVG8gYXZvaWQgcmVwZWF0ZWRseSBkZWNvbXByZXNzaW5nCisgKiByZWNlbnRseSBhY2Nlc3NlZCBkYXRhIFNxdWFzaGZzIHVzZXMgdHdvIHNtYWxsIG1ldGFkYXRhIGFuZCBmcmFnbWVudCBjYWNoZXMuCisgKgorICogVGhpcyBmaWxlIGltcGxlbWVudHMgYSBnZW5lcmljIGNhY2hlIGltcGxlbWVudGF0aW9uIHVzZWQgZm9yIGJvdGggY2FjaGVzLAorICogcGx1cyBmdW5jdGlvbnMgbGF5ZXJlZCBvbnRvcCBvZiB0aGUgZ2VuZXJpYyBjYWNoZSBpbXBsZW1lbnRhdGlvbiB0bworICogYWNjZXNzIHRoZSBtZXRhZGF0YSBhbmQgZnJhZ21lbnQgY2FjaGVzLgorICoKKyAqIFRvIGF2b2lkIG91dCBvZiBtZW1vcnkgYW5kIGZyYWdtZW50YXRpb24gaXNzc3VlcyB3aXRoIHZtYWxsb2MgdGhlIGNhY2hlCisgKiB1c2VzIHNlcXVlbmNlcyBvZiBrbWFsbG9jZWQgUEFHRV9DQUNIRV9TSVpFIGJ1ZmZlcnMuCisgKgorICogSXQgc2hvdWxkIGJlIG5vdGVkIHRoYXQgdGhlIGNhY2hlIGlzIG5vdCB1c2VkIGZvciBmaWxlIGRhdGFibG9ja3MsIHRoZXNlCisgKiBhcmUgZGVjb21wcmVzc2VkIGFuZCBjYWNoZWQgaW4gdGhlIHBhZ2UtY2FjaGUgaW4gdGhlIG5vcm1hbCB3YXkuICBUaGUKKyAqIGNhY2hlIGlzIG9ubHkgdXNlZCB0byB0ZW1wb3JhcmlseSBjYWNoZSBmcmFnbWVudCBhbmQgbWV0YWRhdGEgYmxvY2tzCisgKiB3aGljaCBoYXZlIGJlZW4gcmVhZCBhcyBhcyBhIHJlc3VsdCBvZiBhIG1ldGFkYXRhIChpLmUuIGlub2RlIG9yCisgKiBkaXJlY3RvcnkpIG9yIGZyYWdtZW50IGFjY2Vzcy4gIEJlY2F1c2UgbWV0YWRhdGEgYW5kIGZyYWdtZW50cyBhcmUgcGFja2VkCisgKiB0b2dldGhlciBpbnRvIGJsb2NrcyAodG8gZ2FpbiBncmVhdGVyIGNvbXByZXNzaW9uKSB0aGUgcmVhZCBvZiBhIHBhcnRpY3VsYXIKKyAqIHBpZWNlIG9mIG1ldGFkYXRhIG9yIGZyYWdtZW50IHdpbGwgcmV0cmlldmUgb3RoZXIgbWV0YWRhdGEvZnJhZ21lbnRzIHdoaWNoCisgKiBoYXZlIGJlZW4gcGFja2VkIHdpdGggaXQsIHRoZXNlIGJlY2F1c2Ugb2YgbG9jYWxpdHktb2YtcmVmZXJlbmNlIG1heSBiZSByZWFkCisgKiBpbiB0aGUgbmVhciBmdXR1cmUuIFRlbXBvcmFyaWx5IGNhY2hpbmcgdGhlbSBlbnN1cmVzIHRoZXkgYXJlIGF2YWlsYWJsZSBmb3IKKyAqIG5lYXIgZnV0dXJlIGFjY2VzcyB3aXRob3V0IHJlcXVpcmluZyBhbiBhZGRpdGlvbmFsIHJlYWQgYW5kIGRlY29tcHJlc3MuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvdmZzLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvd2FpdC5oPgorI2luY2x1ZGUgPGxpbnV4L3psaWIuaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisKKyNpbmNsdWRlICJzcXVhc2hmc19mcy5oIgorI2luY2x1ZGUgInNxdWFzaGZzX2ZzX3NiLmgiCisjaW5jbHVkZSAic3F1YXNoZnNfZnNfaS5oIgorI2luY2x1ZGUgInNxdWFzaGZzLmgiCisKKy8qCisgKiBMb29rLXVwIGJsb2NrIGluIGNhY2hlLCBhbmQgaW5jcmVtZW50IHVzYWdlIGNvdW50LiAgSWYgbm90IGluIGNhY2hlLCByZWFkCisgKiBhbmQgZGVjb21wcmVzcyBpdCBmcm9tIGRpc2suCisgKi8KK3N0cnVjdCBzcXVhc2hmc19jYWNoZV9lbnRyeSAqc3F1YXNoZnNfY2FjaGVfZ2V0KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCisJc3RydWN0IHNxdWFzaGZzX2NhY2hlICpjYWNoZSwgdTY0IGJsb2NrLCBpbnQgbGVuZ3RoKQoreworCWludCBpLCBuOworCXN0cnVjdCBzcXVhc2hmc19jYWNoZV9lbnRyeSAqZW50cnk7CisKKwlzcGluX2xvY2soJmNhY2hlLT5sb2NrKTsKKworCXdoaWxlICgxKSB7CisJCWZvciAoaSA9IDA7IGkgPCBjYWNoZS0+ZW50cmllczsgaSsrKQorCQkJaWYgKGNhY2hlLT5lbnRyeVtpXS5ibG9jayA9PSBibG9jaykKKwkJCQlicmVhazsKKworCQlpZiAoaSA9PSBjYWNoZS0+ZW50cmllcykgeworCQkJLyoKKwkJCSAqIEJsb2NrIG5vdCBpbiBjYWNoZSwgaWYgYWxsIGNhY2hlIGVudHJpZXMgYXJlIHVzZWQKKwkJCSAqIGdvIHRvIHNsZWVwIHdhaXRpbmcgZm9yIG9uZSB0byBiZWNvbWUgYXZhaWxhYmxlLgorCQkJICovCisJCQlpZiAoY2FjaGUtPnVudXNlZCA9PSAwKSB7CisJCQkJY2FjaGUtPm51bV93YWl0ZXJzKys7CisJCQkJc3Bpbl91bmxvY2soJmNhY2hlLT5sb2NrKTsKKwkJCQl3YWl0X2V2ZW50KGNhY2hlLT53YWl0X3F1ZXVlLCBjYWNoZS0+dW51c2VkKTsKKwkJCQlzcGluX2xvY2soJmNhY2hlLT5sb2NrKTsKKwkJCQljYWNoZS0+bnVtX3dhaXRlcnMtLTsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJLyoKKwkJCSAqIEF0IGxlYXN0IG9uZSB1bnVzZWQgY2FjaGUgZW50cnkuICBBIHNpbXBsZQorCQkJICogcm91bmQtcm9iaW4gc3RyYXRlZ3kgaXMgdXNlZCB0byBjaG9vc2UgdGhlIGVudHJ5IHRvCisJCQkgKiBiZSBldmljdGVkIGZyb20gdGhlIGNhY2hlLgorCQkJICovCisJCQlpID0gY2FjaGUtPm5leHRfYmxrOworCQkJZm9yIChuID0gMDsgbiA8IGNhY2hlLT5lbnRyaWVzOyBuKyspIHsKKwkJCQlpZiAoY2FjaGUtPmVudHJ5W2ldLnJlZmNvdW50ID09IDApCisJCQkJCWJyZWFrOworCQkJCWkgPSAoaSArIDEpICUgY2FjaGUtPmVudHJpZXM7CisJCQl9CisKKwkJCWNhY2hlLT5uZXh0X2JsayA9IChpICsgMSkgJSBjYWNoZS0+ZW50cmllczsKKwkJCWVudHJ5ID0gJmNhY2hlLT5lbnRyeVtpXTsKKworCQkJLyoKKwkJCSAqIEluaXRpYWxpc2UgY2hvb3NlbiBjYWNoZSBlbnRyeSwgYW5kIGZpbGwgaXQgaW4gZnJvbQorCQkJICogZGlzay4KKwkJCSAqLworCQkJY2FjaGUtPnVudXNlZC0tOworCQkJZW50cnktPmJsb2NrID0gYmxvY2s7CisJCQllbnRyeS0+cmVmY291bnQgPSAxOworCQkJZW50cnktPnBlbmRpbmcgPSAxOworCQkJZW50cnktPm51bV93YWl0ZXJzID0gMDsKKwkJCWVudHJ5LT5lcnJvciA9IDA7CisJCQlzcGluX3VubG9jaygmY2FjaGUtPmxvY2spOworCisJCQllbnRyeS0+bGVuZ3RoID0gc3F1YXNoZnNfcmVhZF9kYXRhKHNiLCBlbnRyeS0+ZGF0YSwKKwkJCQlibG9jaywgbGVuZ3RoLCAmZW50cnktPm5leHRfaW5kZXgsCisJCQkJY2FjaGUtPmJsb2NrX3NpemUpOworCisJCQlzcGluX2xvY2soJmNhY2hlLT5sb2NrKTsKKworCQkJaWYgKGVudHJ5LT5sZW5ndGggPCAwKQorCQkJCWVudHJ5LT5lcnJvciA9IGVudHJ5LT5sZW5ndGg7CisKKwkJCWVudHJ5LT5wZW5kaW5nID0gMDsKKworCQkJLyoKKwkJCSAqIFdoaWxlIGZpbGxpbmcgdGhpcyBlbnRyeSBvbmUgb3IgbW9yZSBvdGhlciBwcm9jZXNzZXMKKwkJCSAqIGhhdmUgbG9va2VkIGl0IHVwIGluIHRoZSBjYWNoZSwgYW5kIGhhdmUgc2xlcHQKKwkJCSAqIHdhaXRpbmcgZm9yIGl0IHRvIGJlY29tZSBhdmFpbGFibGUuCisJCQkgKi8KKwkJCWlmIChlbnRyeS0+bnVtX3dhaXRlcnMpIHsKKwkJCQlzcGluX3VubG9jaygmY2FjaGUtPmxvY2spOworCQkJCXdha2VfdXBfYWxsKCZlbnRyeS0+d2FpdF9xdWV1ZSk7CisJCQl9IGVsc2UKKwkJCQlzcGluX3VubG9jaygmY2FjaGUtPmxvY2spOworCisJCQlnb3RvIG91dDsKKwkJfQorCisJCS8qCisJCSAqIEJsb2NrIGFscmVhZHkgaW4gY2FjaGUuICBJbmNyZW1lbnQgcmVmY291bnQgc28gaXQgZG9lc24ndAorCQkgKiBnZXQgcmV1c2VkIHVudGlsIHdlJ3JlIGZpbmlzaGVkIHdpdGggaXQsIGlmIGl0IHdhcworCQkgKiBwcmV2aW91c2x5IHVudXNlZCB0aGVyZSdzIG9uZSBsZXNzIGNhY2hlIGVudHJ5IGF2YWlsYWJsZQorCQkgKiBmb3IgcmV1c2UuCisJCSAqLworCQllbnRyeSA9ICZjYWNoZS0+ZW50cnlbaV07CisJCWlmIChlbnRyeS0+cmVmY291bnQgPT0gMCkKKwkJCWNhY2hlLT51bnVzZWQtLTsKKwkJZW50cnktPnJlZmNvdW50Kys7CisKKwkJLyoKKwkJICogSWYgdGhlIGVudHJ5IGlzIGN1cnJlbnRseSBiZWluZyBmaWxsZWQgaW4gYnkgYW5vdGhlciBwcm9jZXNzCisJCSAqIGdvIHRvIHNsZWVwIHdhaXRpbmcgZm9yIGl0IHRvIGJlY29tZSBhdmFpbGFibGUuCisJCSAqLworCQlpZiAoZW50cnktPnBlbmRpbmcpIHsKKwkJCWVudHJ5LT5udW1fd2FpdGVycysrOworCQkJc3Bpbl91bmxvY2soJmNhY2hlLT5sb2NrKTsKKwkJCXdhaXRfZXZlbnQoZW50cnktPndhaXRfcXVldWUsICFlbnRyeS0+cGVuZGluZyk7CisJCX0gZWxzZQorCQkJc3Bpbl91bmxvY2soJmNhY2hlLT5sb2NrKTsKKworCQlnb3RvIG91dDsKKwl9CisKK291dDoKKwlUUkFDRSgiR290ICVzICVkLCBzdGFydCBibG9jayAlbGxkLCByZWZjb3VudCAlZCwgZXJyb3IgJWRcbiIsCisJCWNhY2hlLT5uYW1lLCBpLCBlbnRyeS0+YmxvY2ssIGVudHJ5LT5yZWZjb3VudCwgZW50cnktPmVycm9yKTsKKworCWlmIChlbnRyeS0+ZXJyb3IpCisJCUVSUk9SKCJVbmFibGUgdG8gcmVhZCAlcyBjYWNoZSBlbnRyeSBbJWxseF1cbiIsIGNhY2hlLT5uYW1lLAorCQkJCQkJCWJsb2NrKTsKKwlyZXR1cm4gZW50cnk7Cit9CisKKworLyoKKyAqIFJlbGVhc2UgY2FjaGUgZW50cnksIG9uY2UgdXNhZ2UgY291bnQgaXMgemVybyBpdCBjYW4gYmUgcmV1c2VkLgorICovCit2b2lkIHNxdWFzaGZzX2NhY2hlX3B1dChzdHJ1Y3Qgc3F1YXNoZnNfY2FjaGVfZW50cnkgKmVudHJ5KQoreworCXN0cnVjdCBzcXVhc2hmc19jYWNoZSAqY2FjaGUgPSBlbnRyeS0+Y2FjaGU7CisKKwlzcGluX2xvY2soJmNhY2hlLT5sb2NrKTsKKwllbnRyeS0+cmVmY291bnQtLTsKKwlpZiAoZW50cnktPnJlZmNvdW50ID09IDApIHsKKwkJY2FjaGUtPnVudXNlZCsrOworCQkvKgorCQkgKiBJZiB0aGVyZSdzIGFueSBwcm9jZXNzZXMgd2FpdGluZyBmb3IgYSBibG9jayB0byBiZWNvbWUKKwkJICogYXZhaWxhYmxlLCB3YWtlIG9uZSB1cC4KKwkJICovCisJCWlmIChjYWNoZS0+bnVtX3dhaXRlcnMpIHsKKwkJCXNwaW5fdW5sb2NrKCZjYWNoZS0+bG9jayk7CisJCQl3YWtlX3VwKCZjYWNoZS0+d2FpdF9xdWV1ZSk7CisJCQlyZXR1cm47CisJCX0KKwl9CisJc3Bpbl91bmxvY2soJmNhY2hlLT5sb2NrKTsKK30KKworLyoKKyAqIERlbGV0ZSBjYWNoZSByZWNsYWltaW5nIGFsbCBrbWFsbG9jZWQgYnVmZmVycy4KKyAqLwordm9pZCBzcXVhc2hmc19jYWNoZV9kZWxldGUoc3RydWN0IHNxdWFzaGZzX2NhY2hlICpjYWNoZSkKK3sKKwlpbnQgaSwgajsKKworCWlmIChjYWNoZSA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlmb3IgKGkgPSAwOyBpIDwgY2FjaGUtPmVudHJpZXM7IGkrKykgeworCQlpZiAoY2FjaGUtPmVudHJ5W2ldLmRhdGEpIHsKKwkJCWZvciAoaiA9IDA7IGogPCBjYWNoZS0+cGFnZXM7IGorKykKKwkJCQlrZnJlZShjYWNoZS0+ZW50cnlbaV0uZGF0YVtqXSk7CisJCQlrZnJlZShjYWNoZS0+ZW50cnlbaV0uZGF0YSk7CisJCX0KKwl9CisKKwlrZnJlZShjYWNoZS0+ZW50cnkpOworCWtmcmVlKGNhY2hlKTsKK30KKworCisvKgorICogSW5pdGlhbGlzZSBjYWNoZSBhbGxvY2F0aW5nIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGVudHJpZXMsIGVhY2ggb2YKKyAqIHNpemUgYmxvY2tfc2l6ZS4gIFRvIGF2b2lkIHZtYWxsb2MgZnJhZ21lbnRhdGlvbiBpc3N1ZXMgZWFjaCBlbnRyeQorICogaXMgYWxsb2NhdGVkIGFzIGEgc2VxdWVuY2Ugb2Yga21hbGxvY2VkIFBBR0VfQ0FDSEVfU0laRSBidWZmZXJzLgorICovCitzdHJ1Y3Qgc3F1YXNoZnNfY2FjaGUgKnNxdWFzaGZzX2NhY2hlX2luaXQoY2hhciAqbmFtZSwgaW50IGVudHJpZXMsCisJaW50IGJsb2NrX3NpemUpCit7CisJaW50IGksIGo7CisJc3RydWN0IHNxdWFzaGZzX2NhY2hlICpjYWNoZSA9IGt6YWxsb2Moc2l6ZW9mKCpjYWNoZSksIEdGUF9LRVJORUwpOworCisJaWYgKGNhY2hlID09IE5VTEwpIHsKKwkJRVJST1IoIkZhaWxlZCB0byBhbGxvY2F0ZSAlcyBjYWNoZVxuIiwgbmFtZSk7CisJCXJldHVybiBOVUxMOworCX0KKworCWNhY2hlLT5lbnRyeSA9IGtjYWxsb2MoZW50cmllcywgc2l6ZW9mKCooY2FjaGUtPmVudHJ5KSksIEdGUF9LRVJORUwpOworCWlmIChjYWNoZS0+ZW50cnkgPT0gTlVMTCkgeworCQlFUlJPUigiRmFpbGVkIHRvIGFsbG9jYXRlICVzIGNhY2hlXG4iLCBuYW1lKTsKKwkJZ290byBjbGVhbnVwOworCX0KKworCWNhY2hlLT5uZXh0X2JsayA9IDA7CisJY2FjaGUtPnVudXNlZCA9IGVudHJpZXM7CisJY2FjaGUtPmVudHJpZXMgPSBlbnRyaWVzOworCWNhY2hlLT5ibG9ja19zaXplID0gYmxvY2tfc2l6ZTsKKwljYWNoZS0+cGFnZXMgPSBibG9ja19zaXplID4+IFBBR0VfQ0FDSEVfU0hJRlQ7CisJY2FjaGUtPm5hbWUgPSBuYW1lOworCWNhY2hlLT5udW1fd2FpdGVycyA9IDA7CisJc3Bpbl9sb2NrX2luaXQoJmNhY2hlLT5sb2NrKTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZjYWNoZS0+d2FpdF9xdWV1ZSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgZW50cmllczsgaSsrKSB7CisJCXN0cnVjdCBzcXVhc2hmc19jYWNoZV9lbnRyeSAqZW50cnkgPSAmY2FjaGUtPmVudHJ5W2ldOworCisJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmNhY2hlLT5lbnRyeVtpXS53YWl0X3F1ZXVlKTsKKwkJZW50cnktPmNhY2hlID0gY2FjaGU7CisJCWVudHJ5LT5ibG9jayA9IFNRVUFTSEZTX0lOVkFMSURfQkxLOworCQllbnRyeS0+ZGF0YSA9IGtjYWxsb2MoY2FjaGUtPnBhZ2VzLCBzaXplb2Yodm9pZCAqKSwgR0ZQX0tFUk5FTCk7CisJCWlmIChlbnRyeS0+ZGF0YSA9PSBOVUxMKSB7CisJCQlFUlJPUigiRmFpbGVkIHRvIGFsbG9jYXRlICVzIGNhY2hlIGVudHJ5XG4iLCBuYW1lKTsKKwkJCWdvdG8gY2xlYW51cDsKKwkJfQorCisJCWZvciAoaiA9IDA7IGogPCBjYWNoZS0+cGFnZXM7IGorKykgeworCQkJZW50cnktPmRhdGFbal0gPSBrbWFsbG9jKFBBR0VfQ0FDSEVfU0laRSwgR0ZQX0tFUk5FTCk7CisJCQlpZiAoZW50cnktPmRhdGFbal0gPT0gTlVMTCkgeworCQkJCUVSUk9SKCJGYWlsZWQgdG8gYWxsb2NhdGUgJXMgYnVmZmVyXG4iLCBuYW1lKTsKKwkJCQlnb3RvIGNsZWFudXA7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gY2FjaGU7CisKK2NsZWFudXA6CisJc3F1YXNoZnNfY2FjaGVfZGVsZXRlKGNhY2hlKTsKKwlyZXR1cm4gTlVMTDsKK30KKworCisvKgorICogQ29weSB1cHRvIGxlbmd0aCBieXRlcyBmcm9tIGNhY2hlIGVudHJ5IHRvIGJ1ZmZlciBzdGFydGluZyBhdCBvZmZzZXQgYnl0ZXMKKyAqIGludG8gdGhlIGNhY2hlIGVudHJ5LiAgSWYgdGhlcmUncyBub3QgbGVuZ3RoIGJ5dGVzIHRoZW4gY29weSB0aGUgbnVtYmVyIG9mCisgKiBieXRlcyBhdmFpbGFibGUuICBJbiBhbGwgY2FzZXMgcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgY29waWVkLgorICovCitpbnQgc3F1YXNoZnNfY29weV9kYXRhKHZvaWQgKmJ1ZmZlciwgc3RydWN0IHNxdWFzaGZzX2NhY2hlX2VudHJ5ICplbnRyeSwKKwkJaW50IG9mZnNldCwgaW50IGxlbmd0aCkKK3sKKwlpbnQgcmVtYWluaW5nID0gbGVuZ3RoOworCisJaWYgKGxlbmd0aCA9PSAwKQorCQlyZXR1cm4gMDsKKwllbHNlIGlmIChidWZmZXIgPT0gTlVMTCkKKwkJcmV0dXJuIG1pbihsZW5ndGgsIGVudHJ5LT5sZW5ndGggLSBvZmZzZXQpOworCisJd2hpbGUgKG9mZnNldCA8IGVudHJ5LT5sZW5ndGgpIHsKKwkJdm9pZCAqYnVmZiA9IGVudHJ5LT5kYXRhW29mZnNldCAvIFBBR0VfQ0FDSEVfU0laRV0KKwkJCQkrIChvZmZzZXQgJSBQQUdFX0NBQ0hFX1NJWkUpOworCQlpbnQgYnl0ZXMgPSBtaW5fdChpbnQsIGVudHJ5LT5sZW5ndGggLSBvZmZzZXQsCisJCQkJUEFHRV9DQUNIRV9TSVpFIC0gKG9mZnNldCAlIFBBR0VfQ0FDSEVfU0laRSkpOworCisJCWlmIChieXRlcyA+PSByZW1haW5pbmcpIHsKKwkJCW1lbWNweShidWZmZXIsIGJ1ZmYsIHJlbWFpbmluZyk7CisJCQlyZW1haW5pbmcgPSAwOworCQkJYnJlYWs7CisJCX0KKworCQltZW1jcHkoYnVmZmVyLCBidWZmLCBieXRlcyk7CisJCWJ1ZmZlciArPSBieXRlczsKKwkJcmVtYWluaW5nIC09IGJ5dGVzOworCQlvZmZzZXQgKz0gYnl0ZXM7CisJfQorCisJcmV0dXJuIGxlbmd0aCAtIHJlbWFpbmluZzsKK30KKworCisvKgorICogUmVhZCBsZW5ndGggYnl0ZXMgZnJvbSBtZXRhZGF0YSBwb3NpdGlvbiA8YmxvY2ssIG9mZnNldD4gKGJsb2NrIGlzIHRoZQorICogc3RhcnQgb2YgdGhlIGNvbXByZXNzZWQgYmxvY2sgb24gZGlzaywgYW5kIG9mZnNldCBpcyB0aGUgb2Zmc2V0IGludG8KKyAqIHRoZSBibG9jayBvbmNlIGRlY29tcHJlc3NlZCkuICBEYXRhIGlzIHBhY2tlZCBpbnRvIGNvbnNlY3V0aXZlIGJsb2NrcywKKyAqIGFuZCBsZW5ndGggYnl0ZXMgbWF5IHJlcXVpcmUgcmVhZGluZyBtb3JlIHRoYW4gb25lIGJsb2NrLgorICovCitpbnQgc3F1YXNoZnNfcmVhZF9tZXRhZGF0YShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB2b2lkICpidWZmZXIsCisJCXU2NCAqYmxvY2ssIGludCAqb2Zmc2V0LCBpbnQgbGVuZ3RoKQoreworCXN0cnVjdCBzcXVhc2hmc19zYl9pbmZvICptc2JsayA9IHNiLT5zX2ZzX2luZm87CisJaW50IGJ5dGVzLCBjb3BpZWQgPSBsZW5ndGg7CisJc3RydWN0IHNxdWFzaGZzX2NhY2hlX2VudHJ5ICplbnRyeTsKKworCVRSQUNFKCJFbnRlcmVkIHNxdWFzaGZzX3JlYWRfbWV0YWRhdGEgWyVsbHg6JXhdXG4iLCAqYmxvY2ssICpvZmZzZXQpOworCisJd2hpbGUgKGxlbmd0aCkgeworCQllbnRyeSA9IHNxdWFzaGZzX2NhY2hlX2dldChzYiwgbXNibGstPmJsb2NrX2NhY2hlLCAqYmxvY2ssIDApOworCQlpZiAoZW50cnktPmVycm9yKQorCQkJcmV0dXJuIGVudHJ5LT5lcnJvcjsKKwkJZWxzZSBpZiAoKm9mZnNldCA+PSBlbnRyeS0+bGVuZ3RoKQorCQkJcmV0dXJuIC1FSU87CisKKwkJYnl0ZXMgPSBzcXVhc2hmc19jb3B5X2RhdGEoYnVmZmVyLCBlbnRyeSwgKm9mZnNldCwgbGVuZ3RoKTsKKwkJaWYgKGJ1ZmZlcikKKwkJCWJ1ZmZlciArPSBieXRlczsKKwkJbGVuZ3RoIC09IGJ5dGVzOworCQkqb2Zmc2V0ICs9IGJ5dGVzOworCisJCWlmICgqb2Zmc2V0ID09IGVudHJ5LT5sZW5ndGgpIHsKKwkJCSpibG9jayA9IGVudHJ5LT5uZXh0X2luZGV4OworCQkJKm9mZnNldCA9IDA7CisJCX0KKworCQlzcXVhc2hmc19jYWNoZV9wdXQoZW50cnkpOworCX0KKworCXJldHVybiBjb3BpZWQ7Cit9CisKKworLyoKKyAqIExvb2stdXAgaW4gdGhlIGZyYWdtbWVudCBjYWNoZSB0aGUgZnJhZ21lbnQgbG9jYXRlZCBhdCA8c3RhcnRfYmxvY2s+IGluIHRoZQorICogZmlsZXN5c3RlbS4gIElmIG5lY2Vzc2FyeSByZWFkIGFuZCBkZWNvbXByZXNzIGl0IGZyb20gZGlzay4KKyAqLworc3RydWN0IHNxdWFzaGZzX2NhY2hlX2VudHJ5ICpzcXVhc2hmc19nZXRfZnJhZ21lbnQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwkJCQl1NjQgc3RhcnRfYmxvY2ssIGludCBsZW5ndGgpCit7CisJc3RydWN0IHNxdWFzaGZzX3NiX2luZm8gKm1zYmxrID0gc2ItPnNfZnNfaW5mbzsKKworCXJldHVybiBzcXVhc2hmc19jYWNoZV9nZXQoc2IsIG1zYmxrLT5mcmFnbWVudF9jYWNoZSwgc3RhcnRfYmxvY2ssCisJCWxlbmd0aCk7Cit9CisKKworLyoKKyAqIFJlYWQgYW5kIGRlY29tcHJlc3MgdGhlIGRhdGFibG9jayBsb2NhdGVkIGF0IDxzdGFydF9ibG9jaz4gaW4gdGhlCisgKiBmaWxlc3lzdGVtLiAgVGhlIGNhY2hlIGlzIHVzZWQgaGVyZSB0byBhdm9pZCBkdXBsaWNhdGluZyBsb2NraW5nIGFuZAorICogcmVhZC9kZWNvbXByZXNzIGNvZGUuCisgKi8KK3N0cnVjdCBzcXVhc2hmc19jYWNoZV9lbnRyeSAqc3F1YXNoZnNfZ2V0X2RhdGFibG9jayhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAorCQkJCXU2NCBzdGFydF9ibG9jaywgaW50IGxlbmd0aCkKK3sKKwlzdHJ1Y3Qgc3F1YXNoZnNfc2JfaW5mbyAqbXNibGsgPSBzYi0+c19mc19pbmZvOworCisJcmV0dXJuIHNxdWFzaGZzX2NhY2hlX2dldChzYiwgbXNibGstPnJlYWRfcGFnZSwgc3RhcnRfYmxvY2ssIGxlbmd0aCk7Cit9CisKKworLyoKKyAqIFJlYWQgYSBmaWxlc3lzdGVtIHRhYmxlICh1bmNvbXByZXNzZWQgc2VxdWVuY2Ugb2YgYnl0ZXMpIGZyb20gZGlzaworICovCitpbnQgc3F1YXNoZnNfcmVhZF90YWJsZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB2b2lkICpidWZmZXIsIHU2NCBibG9jaywKKwlpbnQgbGVuZ3RoKQoreworCWludCBwYWdlcyA9IChsZW5ndGggKyBQQUdFX0NBQ0hFX1NJWkUgLSAxKSA+PiBQQUdFX0NBQ0hFX1NISUZUOworCWludCBpLCByZXM7CisJdm9pZCAqKmRhdGEgPSBrY2FsbG9jKHBhZ2VzLCBzaXplb2Yodm9pZCAqKSwgR0ZQX0tFUk5FTCk7CisJaWYgKGRhdGEgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlmb3IgKGkgPSAwOyBpIDwgcGFnZXM7IGkrKywgYnVmZmVyICs9IFBBR0VfQ0FDSEVfU0laRSkKKwkJZGF0YVtpXSA9IGJ1ZmZlcjsKKwlyZXMgPSBzcXVhc2hmc19yZWFkX2RhdGEoc2IsIGRhdGEsIGJsb2NrLCBsZW5ndGggfAorCQlTUVVBU0hGU19DT01QUkVTU0VEX0JJVF9CTE9DSywgTlVMTCwgbGVuZ3RoKTsKKwlrZnJlZShkYXRhKTsKKwlyZXR1cm4gcmVzOworfQpkaWZmIC0tZ2l0IGEvZnMvc3F1YXNoZnMvZGlyLmMgYi9mcy9zcXVhc2hmcy9kaXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjZiMGVhCi0tLSAvZGV2L251bGwKKysrIGIvZnMvc3F1YXNoZnMvZGlyLmMKQEAgLTAsMCArMSwyMzUgQEAKKy8qCisgKiBTcXVhc2hmcyAtIGEgY29tcHJlc3NlZCByZWFkIG9ubHkgZmlsZXN5c3RlbSBmb3IgTGludXgKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgKKyAqIFBoaWxsaXAgTG91Z2hlciA8cGhpbGxpcEBsb3VnaGVyLmRlbW9uLmNvLnVrPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwKKyAqIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICoKKyAqIGRpci5jCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSBpbXBsZW1lbnRzIGNvZGUgdG8gcmVhZCBkaXJlY3RvcmllcyBmcm9tIGRpc2suCisgKgorICogU2VlIG5hbWVpLmMgZm9yIGEgZGVzY3JpcHRpb24gb2YgZGlyZWN0b3J5IG9yZ2FuaXNhdGlvbiBvbiBkaXNrLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3Zmcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC96bGliLmg+CisKKyNpbmNsdWRlICJzcXVhc2hmc19mcy5oIgorI2luY2x1ZGUgInNxdWFzaGZzX2ZzX3NiLmgiCisjaW5jbHVkZSAic3F1YXNoZnNfZnNfaS5oIgorI2luY2x1ZGUgInNxdWFzaGZzLmgiCisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIHNxdWFzaGZzX2ZpbGV0eXBlX3RhYmxlW10gPSB7CisJRFRfVU5LTk9XTiwgRFRfRElSLCBEVF9SRUcsIERUX0xOSywgRFRfQkxLLCBEVF9DSFIsIERUX0ZJRk8sIERUX1NPQ0sKK307CisKKy8qCisgKiBMb29rdXAgb2Zmc2V0IChmX3BvcykgaW4gdGhlIGRpcmVjdG9yeSBpbmRleCwgcmV0dXJuaW5nIHRoZQorICogbWV0YWRhdGEgYmxvY2sgY29udGFpbmluZyBpdC4KKyAqCisgKiBJZiB3ZSBnZXQgYW4gZXJyb3IgcmVhZGluZyB0aGUgaW5kZXggdGhlbiByZXR1cm4gdGhlIHBhcnQgb2YgdGhlIGluZGV4CisgKiAoaWYgYW55KSB3ZSBoYXZlIG1hbmFnZWQgdG8gcmVhZCAtIHRoZSBpbmRleCBpc24ndCBlc3NlbnRpYWwsIGp1c3QKKyAqIHF1aWNrZXIuCisgKi8KK3N0YXRpYyBpbnQgZ2V0X2Rpcl9pbmRleF91c2luZ19vZmZzZXQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwl1NjQgKm5leHRfYmxvY2ssIGludCAqbmV4dF9vZmZzZXQsIHU2NCBpbmRleF9zdGFydCwgaW50IGluZGV4X29mZnNldCwKKwlpbnQgaV9jb3VudCwgdTY0IGZfcG9zKQoreworCXN0cnVjdCBzcXVhc2hmc19zYl9pbmZvICptc2JsayA9IHNiLT5zX2ZzX2luZm87CisJaW50IGVyciwgaSwgaW5kZXgsIGxlbmd0aCA9IDA7CisJc3RydWN0IHNxdWFzaGZzX2Rpcl9pbmRleCBkaXJfaW5kZXg7CisKKwlUUkFDRSgiRW50ZXJlZCBnZXRfZGlyX2luZGV4X3VzaW5nX29mZnNldCwgaV9jb3VudCAlZCwgZl9wb3MgJWxsZFxuIiwKKwkJCQkJaV9jb3VudCwgZl9wb3MpOworCisJLyoKKwkgKiBUcmFuc2xhdGUgZnJvbSBleHRlcm5hbCBmX3BvcyB0byB0aGUgaW50ZXJuYWwgZl9wb3MuICBUaGlzCisJICogaXMgb2Zmc2V0IGJ5IDMgYmVjYXVzZSB3ZSBpbnZlbnQgIi4iIGFuZCAiLi4iIGVudHJpZXMgd2hpY2ggYXJlCisJICogbm90IGFjdHVhbGx5IHN0b3JlZCBpbiB0aGUgZGlyZWN0b3J5LgorCSAqLworCWlmIChmX3BvcyA8IDMpCisJCXJldHVybiBmX3BvczsKKwlmX3BvcyAtPSAzOworCisJZm9yIChpID0gMDsgaSA8IGlfY291bnQ7IGkrKykgeworCQllcnIgPSBzcXVhc2hmc19yZWFkX21ldGFkYXRhKHNiLCAmZGlyX2luZGV4LCAmaW5kZXhfc3RhcnQsCisJCQkJJmluZGV4X29mZnNldCwgc2l6ZW9mKGRpcl9pbmRleCkpOworCQlpZiAoZXJyIDwgMCkKKwkJCWJyZWFrOworCisJCWluZGV4ID0gbGUzMl90b19jcHUoZGlyX2luZGV4LmluZGV4KTsKKwkJaWYgKGluZGV4ID4gZl9wb3MpCisJCQkvKgorCQkJICogRm91bmQgdGhlIGluZGV4IHdlJ3JlIGxvb2tpbmcgZm9yLgorCQkJICovCisJCQlicmVhazsKKworCQllcnIgPSBzcXVhc2hmc19yZWFkX21ldGFkYXRhKHNiLCBOVUxMLCAmaW5kZXhfc3RhcnQsCisJCQkJJmluZGV4X29mZnNldCwgbGUzMl90b19jcHUoZGlyX2luZGV4LnNpemUpICsgMSk7CisJCWlmIChlcnIgPCAwKQorCQkJYnJlYWs7CisKKwkJbGVuZ3RoID0gaW5kZXg7CisJCSpuZXh0X2Jsb2NrID0gbGUzMl90b19jcHUoZGlyX2luZGV4LnN0YXJ0X2Jsb2NrKSArCisJCQkJCW1zYmxrLT5kaXJlY3RvcnlfdGFibGU7CisJfQorCisJKm5leHRfb2Zmc2V0ID0gKGxlbmd0aCArICpuZXh0X29mZnNldCkgJSBTUVVBU0hGU19NRVRBREFUQV9TSVpFOworCisJLyoKKwkgKiBUcmFuc2xhdGUgYmFjayBmcm9tIGludGVybmFsIGZfcG9zIHRvIGV4dGVybmFsIGZfcG9zLgorCSAqLworCXJldHVybiBsZW5ndGggKyAzOworfQorCisKK3N0YXRpYyBpbnQgc3F1YXNoZnNfcmVhZGRpcihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZGlyZW50LCBmaWxsZGlyX3QgZmlsbGRpcikKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+Zl9kZW50cnktPmRfaW5vZGU7CisJc3RydWN0IHNxdWFzaGZzX3NiX2luZm8gKm1zYmxrID0gaW5vZGUtPmlfc2ItPnNfZnNfaW5mbzsKKwl1NjQgYmxvY2sgPSBzcXVhc2hmc19pKGlub2RlKS0+c3RhcnQgKyBtc2Jsay0+ZGlyZWN0b3J5X3RhYmxlOworCWludCBvZmZzZXQgPSBzcXVhc2hmc19pKGlub2RlKS0+b2Zmc2V0LCBsZW5ndGggPSAwLCBkaXJfY291bnQsIHNpemUsCisJCQkJdHlwZSwgZXJyOworCXVuc2lnbmVkIGludCBpbm9kZV9udW1iZXI7CisJc3RydWN0IHNxdWFzaGZzX2Rpcl9oZWFkZXIgZGlyaDsKKwlzdHJ1Y3Qgc3F1YXNoZnNfZGlyX2VudHJ5ICpkaXJlOworCisJVFJBQ0UoIkVudGVyZWQgc3F1YXNoZnNfcmVhZGRpciBbJWxseDoleF1cbiIsIGJsb2NrLCBvZmZzZXQpOworCisJZGlyZSA9IGttYWxsb2Moc2l6ZW9mKCpkaXJlKSArIFNRVUFTSEZTX05BTUVfTEVOICsgMSwgR0ZQX0tFUk5FTCk7CisJaWYgKGRpcmUgPT0gTlVMTCkgeworCQlFUlJPUigiRmFpbGVkIHRvIGFsbG9jYXRlIHNxdWFzaGZzX2Rpcl9lbnRyeVxuIik7CisJCWdvdG8gZmluaXNoOworCX0KKworCS8qCisJICogUmV0dXJuICIuIiBhbmQgICIuLiIgZW50cmllcyBhcyB0aGUgZmlyc3QgdHdvIGZpbGVuYW1lcyBpbiB0aGUKKwkgKiBkaXJlY3RvcnkuICBUbyBtYXhpbWlzZSBjb21wcmVzc2lvbiB0aGVzZSB0d28gZW50cmllcyBhcmUgbm90CisJICogc3RvcmVkIGluIHRoZSBkaXJlY3RvcnksIGFuZCBzbyB3ZSBpbnZlbnQgdGhlbSBoZXJlLgorCSAqCisJICogSXQgYWxzbyBtZWFucyB0aGF0IHRoZSBleHRlcm5hbCBmX3BvcyBpcyBvZmZzZXQgYnkgMyBmcm9tIHRoZQorCSAqIG9uLWRpc2sgZGlyZWN0b3J5IGZfcG9zLgorCSAqLworCXdoaWxlIChmaWxlLT5mX3BvcyA8IDMpIHsKKwkJY2hhciAqbmFtZTsKKwkJaW50IGlfaW5vOworCisJCWlmIChmaWxlLT5mX3BvcyA9PSAwKSB7CisJCQluYW1lID0gIi4iOworCQkJc2l6ZSA9IDE7CisJCQlpX2lubyA9IGlub2RlLT5pX2lubzsKKwkJfSBlbHNlIHsKKwkJCW5hbWUgPSAiLi4iOworCQkJc2l6ZSA9IDI7CisJCQlpX2lubyA9IHNxdWFzaGZzX2koaW5vZGUpLT5wYXJlbnQ7CisJCX0KKworCQlUUkFDRSgiQ2FsbGluZyBmaWxsZGlyKCVwLCAlcywgJWQsICVsbGQsICVkLCAlZClcbiIsCisJCQkJZGlyZW50LCBuYW1lLCBzaXplLCBmaWxlLT5mX3BvcywgaV9pbm8sCisJCQkJc3F1YXNoZnNfZmlsZXR5cGVfdGFibGVbMV0pOworCisJCWlmIChmaWxsZGlyKGRpcmVudCwgbmFtZSwgc2l6ZSwgZmlsZS0+Zl9wb3MsIGlfaW5vLAorCQkJCXNxdWFzaGZzX2ZpbGV0eXBlX3RhYmxlWzFdKSA8IDApIHsKKwkJCQlUUkFDRSgiRmlsbGRpciByZXR1cm5lZCBsZXNzIHRoYW4gMFxuIik7CisJCQlnb3RvIGZpbmlzaDsKKwkJfQorCisJCWZpbGUtPmZfcG9zICs9IHNpemU7CisJfQorCisJbGVuZ3RoID0gZ2V0X2Rpcl9pbmRleF91c2luZ19vZmZzZXQoaW5vZGUtPmlfc2IsICZibG9jaywgJm9mZnNldCwKKwkJCQlzcXVhc2hmc19pKGlub2RlKS0+ZGlyX2lkeF9zdGFydCwKKwkJCQlzcXVhc2hmc19pKGlub2RlKS0+ZGlyX2lkeF9vZmZzZXQsCisJCQkJc3F1YXNoZnNfaShpbm9kZSktPmRpcl9pZHhfY250LAorCQkJCWZpbGUtPmZfcG9zKTsKKworCXdoaWxlIChsZW5ndGggPCBpX3NpemVfcmVhZChpbm9kZSkpIHsKKwkJLyoKKwkJICogUmVhZCBkaXJlY3RvcnkgaGVhZGVyCisJCSAqLworCQllcnIgPSBzcXVhc2hmc19yZWFkX21ldGFkYXRhKGlub2RlLT5pX3NiLCAmZGlyaCwgJmJsb2NrLAorCQkJCQkmb2Zmc2V0LCBzaXplb2YoZGlyaCkpOworCQlpZiAoZXJyIDwgMCkKKwkJCWdvdG8gZmFpbGVkX3JlYWQ7CisKKwkJbGVuZ3RoICs9IHNpemVvZihkaXJoKTsKKworCQlkaXJfY291bnQgPSBsZTMyX3RvX2NwdShkaXJoLmNvdW50KSArIDE7CisJCXdoaWxlIChkaXJfY291bnQtLSkgeworCQkJLyoKKwkJCSAqIFJlYWQgZGlyZWN0b3J5IGVudHJ5LgorCQkJICovCisJCQllcnIgPSBzcXVhc2hmc19yZWFkX21ldGFkYXRhKGlub2RlLT5pX3NiLCBkaXJlLCAmYmxvY2ssCisJCQkJCSZvZmZzZXQsIHNpemVvZigqZGlyZSkpOworCQkJaWYgKGVyciA8IDApCisJCQkJZ290byBmYWlsZWRfcmVhZDsKKworCQkJc2l6ZSA9IGxlMTZfdG9fY3B1KGRpcmUtPnNpemUpICsgMTsKKworCQkJZXJyID0gc3F1YXNoZnNfcmVhZF9tZXRhZGF0YShpbm9kZS0+aV9zYiwgZGlyZS0+bmFtZSwKKwkJCQkJJmJsb2NrLCAmb2Zmc2V0LCBzaXplKTsKKwkJCWlmIChlcnIgPCAwKQorCQkJCWdvdG8gZmFpbGVkX3JlYWQ7CisKKwkJCWxlbmd0aCArPSBzaXplb2YoKmRpcmUpICsgc2l6ZTsKKworCQkJaWYgKGZpbGUtPmZfcG9zID49IGxlbmd0aCkKKwkJCQljb250aW51ZTsKKworCQkJZGlyZS0+bmFtZVtzaXplXSA9ICdcMCc7CisJCQlpbm9kZV9udW1iZXIgPSBsZTMyX3RvX2NwdShkaXJoLmlub2RlX251bWJlcikgKworCQkJCSgoc2hvcnQpIGxlMTZfdG9fY3B1KGRpcmUtPmlub2RlX251bWJlcikpOworCQkJdHlwZSA9IGxlMTZfdG9fY3B1KGRpcmUtPnR5cGUpOworCisJCQlUUkFDRSgiQ2FsbGluZyBmaWxsZGlyKCVwLCAlcywgJWQsICVsbGQsICV4OiV4LCAlZCwgJWQpIgorCQkJCQkiXG4iLCBkaXJlbnQsIGRpcmUtPm5hbWUsIHNpemUsCisJCQkJCWZpbGUtPmZfcG9zLAorCQkJCQlsZTMyX3RvX2NwdShkaXJoLnN0YXJ0X2Jsb2NrKSwKKwkJCQkJbGUxNl90b19jcHUoZGlyZS0+b2Zmc2V0KSwKKwkJCQkJaW5vZGVfbnVtYmVyLAorCQkJCQlzcXVhc2hmc19maWxldHlwZV90YWJsZVt0eXBlXSk7CisKKwkJCWlmIChmaWxsZGlyKGRpcmVudCwgZGlyZS0+bmFtZSwgc2l6ZSwgZmlsZS0+Zl9wb3MsCisJCQkJCWlub2RlX251bWJlciwKKwkJCQkJc3F1YXNoZnNfZmlsZXR5cGVfdGFibGVbdHlwZV0pIDwgMCkgeworCQkJCVRSQUNFKCJGaWxsZGlyIHJldHVybmVkIGxlc3MgdGhhbiAwXG4iKTsKKwkJCQlnb3RvIGZpbmlzaDsKKwkJCX0KKworCQkJZmlsZS0+Zl9wb3MgPSBsZW5ndGg7CisJCX0KKwl9CisKK2ZpbmlzaDoKKwlrZnJlZShkaXJlKTsKKwlyZXR1cm4gMDsKKworZmFpbGVkX3JlYWQ6CisJRVJST1IoIlVuYWJsZSB0byByZWFkIGRpcmVjdG9yeSBibG9jayBbJWxseDoleF1cbiIsIGJsb2NrLCBvZmZzZXQpOworCWtmcmVlKGRpcmUpOworCXJldHVybiAwOworfQorCisKK2NvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgc3F1YXNoZnNfZGlyX29wcyA9IHsKKwkucmVhZCA9IGdlbmVyaWNfcmVhZF9kaXIsCisJLnJlYWRkaXIgPSBzcXVhc2hmc19yZWFkZGlyCit9OwpkaWZmIC0tZ2l0IGEvZnMvc3F1YXNoZnMvZXhwb3J0LmMgYi9mcy9zcXVhc2hmcy9leHBvcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OWU5NzFkCi0tLSAvZGV2L251bGwKKysrIGIvZnMvc3F1YXNoZnMvZXhwb3J0LmMKQEAgLTAsMCArMSwxNTUgQEAKKy8qCisgKiBTcXVhc2hmcyAtIGEgY29tcHJlc3NlZCByZWFkIG9ubHkgZmlsZXN5c3RlbSBmb3IgTGludXgKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgKKyAqIFBoaWxsaXAgTG91Z2hlciA8cGhpbGxpcEBsb3VnaGVyLmRlbW9uLmNvLnVrPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwKKyAqIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICoKKyAqIGV4cG9ydC5jCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSBpbXBsZW1lbnRzIGNvZGUgdG8gbWFrZSBTcXVhc2hmcyBmaWxlc3lzdGVtcyBleHBvcnRhYmxlIChORlMgZXRjLikKKyAqCisgKiBUaGUgZXhwb3J0IGNvZGUgdXNlcyBhbiBpbm9kZSBsb29rdXAgdGFibGUgdG8gbWFwIGlub2RlIG51bWJlcnMgcGFzc2VkIGluCisgKiBmaWxlaGFuZGxlcyB0byBhbiBpbm9kZSBsb2NhdGlvbiBvbiBkaXNrLiAgVGhpcyB0YWJsZSBpcyBzdG9yZWQgY29tcHJlc3NlZAorICogaW50byBtZXRhZGF0YSBibG9ja3MuICBBIHNlY29uZCBpbmRleCB0YWJsZSBpcyB1c2VkIHRvIGxvY2F0ZSB0aGVzZS4gIFRoaXMKKyAqIHNlY29uZCBpbmRleCB0YWJsZSBmb3Igc3BlZWQgb2YgYWNjZXNzIChhbmQgYmVjYXVzZSBpdCBpcyBzbWFsbCkgaXMgcmVhZCBhdAorICogbW91bnQgdGltZSBhbmQgY2FjaGVkIGluIG1lbW9yeS4KKyAqCisgKiBUaGUgaW5vZGUgbG9va3VwIHRhYmxlIGlzIHVzZWQgb25seSBieSB0aGUgZXhwb3J0IGNvZGUsIGlub2RlIGRpc2sKKyAqIGxvY2F0aW9ucyBhcmUgZGlyZWN0bHkgZW5jb2RlZCBpbiBkaXJlY3RvcmllcywgZW5hYmxpbmcgZGlyZWN0IGFjY2VzcworICogd2l0aG91dCBhbiBpbnRlcm1lZGlhdGUgbG9va3VwIGZvciBhbGwgb3BlcmF0aW9ucyBleGNlcHQgdGhlIGV4cG9ydCBvcHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvdmZzLmg+CisjaW5jbHVkZSA8bGludXgvZGNhY2hlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0ZnMuaD4KKyNpbmNsdWRlIDxsaW51eC96bGliLmg+CisKKyNpbmNsdWRlICJzcXVhc2hmc19mcy5oIgorI2luY2x1ZGUgInNxdWFzaGZzX2ZzX3NiLmgiCisjaW5jbHVkZSAic3F1YXNoZnNfZnNfaS5oIgorI2luY2x1ZGUgInNxdWFzaGZzLmgiCisKKy8qCisgKiBMb29rLXVwIGlub2RlIG51bWJlciAoaW5vKSBpbiB0YWJsZSwgcmV0dXJuaW5nIHRoZSBpbm9kZSBsb2NhdGlvbi4KKyAqLworc3RhdGljIGxvbmcgbG9uZyBzcXVhc2hmc19pbm9kZV9sb29rdXAoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IGlub19udW0pCit7CisJc3RydWN0IHNxdWFzaGZzX3NiX2luZm8gKm1zYmxrID0gc2ItPnNfZnNfaW5mbzsKKwlpbnQgYmxrID0gU1FVQVNIRlNfTE9PS1VQX0JMT0NLKGlub19udW0gLSAxKTsKKwlpbnQgb2Zmc2V0ID0gU1FVQVNIRlNfTE9PS1VQX0JMT0NLX09GRlNFVChpbm9fbnVtIC0gMSk7CisJdTY0IHN0YXJ0ID0gbGU2NF90b19jcHUobXNibGstPmlub2RlX2xvb2t1cF90YWJsZVtibGtdKTsKKwlfX2xlNjQgaW5vOworCWludCBlcnI7CisKKwlUUkFDRSgiRW50ZXJlZCBzcXVhc2hmc19pbm9kZV9sb29rdXAsIGlub2RlX251bWJlciA9ICVkXG4iLCBpbm9fbnVtKTsKKworCWVyciA9IHNxdWFzaGZzX3JlYWRfbWV0YWRhdGEoc2IsICZpbm8sICZzdGFydCwgJm9mZnNldCwgc2l6ZW9mKGlubykpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJVFJBQ0UoInNxdWFzaGZzX2lub2RlX2xvb2t1cCwgaW5vZGUgPSAweCVsbHhcbiIsCisJCSh1NjQpIGxlNjRfdG9fY3B1KGlubykpOworCisJcmV0dXJuIGxlNjRfdG9fY3B1KGlubyk7Cit9CisKKworc3RhdGljIHN0cnVjdCBkZW50cnkgKnNxdWFzaGZzX2V4cG9ydF9pZ2V0KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCisJdW5zaWduZWQgaW50IGlub19udW0pCit7CisJbG9uZyBsb25nIGlubzsKKwlzdHJ1Y3QgZGVudHJ5ICpkZW50cnkgPSBFUlJfUFRSKC1FTk9FTlQpOworCisJVFJBQ0UoIkVudGVyZWQgc3F1YXNoZnNfZXhwb3J0X2lnZXRcbiIpOworCisJaW5vID0gc3F1YXNoZnNfaW5vZGVfbG9va3VwKHNiLCBpbm9fbnVtKTsKKwlpZiAoaW5vID49IDApCisJCWRlbnRyeSA9IGRfb2J0YWluX2FsaWFzKHNxdWFzaGZzX2lnZXQoc2IsIGlubywgaW5vX251bSkpOworCisJcmV0dXJuIGRlbnRyeTsKK30KKworCitzdGF0aWMgc3RydWN0IGRlbnRyeSAqc3F1YXNoZnNfZmhfdG9fZGVudHJ5KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCisJCXN0cnVjdCBmaWQgKmZpZCwgaW50IGZoX2xlbiwgaW50IGZoX3R5cGUpCit7CisJaWYgKChmaF90eXBlICE9IEZJTEVJRF9JTk8zMl9HRU4gJiYgZmhfdHlwZSAhPSBGSUxFSURfSU5PMzJfR0VOX1BBUkVOVCkKKwkJCXx8IGZoX2xlbiA8IDIpCisJCXJldHVybiBOVUxMOworCisJcmV0dXJuIHNxdWFzaGZzX2V4cG9ydF9pZ2V0KHNiLCBmaWQtPmkzMi5pbm8pOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpzcXVhc2hmc19maF90b19wYXJlbnQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwkJc3RydWN0IGZpZCAqZmlkLCBpbnQgZmhfbGVuLCBpbnQgZmhfdHlwZSkKK3sKKwlpZiAoZmhfdHlwZSAhPSBGSUxFSURfSU5PMzJfR0VOX1BBUkVOVCB8fCBmaF9sZW4gPCA0KQorCQlyZXR1cm4gTlVMTDsKKworCXJldHVybiBzcXVhc2hmc19leHBvcnRfaWdldChzYiwgZmlkLT5pMzIucGFyZW50X2lubyk7Cit9CisKKworc3RhdGljIHN0cnVjdCBkZW50cnkgKnNxdWFzaGZzX2dldF9wYXJlbnQoc3RydWN0IGRlbnRyeSAqY2hpbGQpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGNoaWxkLT5kX2lub2RlOworCXVuc2lnbmVkIGludCBwYXJlbnRfaW5vID0gc3F1YXNoZnNfaShpbm9kZSktPnBhcmVudDsKKworCXJldHVybiBzcXVhc2hmc19leHBvcnRfaWdldChpbm9kZS0+aV9zYiwgcGFyZW50X2lubyk7Cit9CisKKworLyoKKyAqIFJlYWQgdW5jb21wcmVzc2VkIGlub2RlIGxvb2t1cCB0YWJsZSBpbmRleGVzIG9mZiBkaXNrIGludG8gbWVtb3J5CisgKi8KK19fbGU2NCAqc3F1YXNoZnNfcmVhZF9pbm9kZV9sb29rdXBfdGFibGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwkJdTY0IGxvb2t1cF90YWJsZV9zdGFydCwgdW5zaWduZWQgaW50IGlub2RlcykKK3sKKwl1bnNpZ25lZCBpbnQgbGVuZ3RoID0gU1FVQVNIRlNfTE9PS1VQX0JMT0NLX0JZVEVTKGlub2Rlcyk7CisJX19sZTY0ICppbm9kZV9sb29rdXBfdGFibGU7CisJaW50IGVycjsKKworCVRSQUNFKCJJbiByZWFkX2lub2RlX2xvb2t1cF90YWJsZSwgbGVuZ3RoICVkXG4iLCBsZW5ndGgpOworCisJLyogQWxsb2NhdGUgaW5vZGUgbG9va3VwIHRhYmxlIGluZGV4ZXMgKi8KKwlpbm9kZV9sb29rdXBfdGFibGUgPSBrbWFsbG9jKGxlbmd0aCwgR0ZQX0tFUk5FTCk7CisJaWYgKGlub2RlX2xvb2t1cF90YWJsZSA9PSBOVUxMKSB7CisJCUVSUk9SKCJGYWlsZWQgdG8gYWxsb2NhdGUgaW5vZGUgbG9va3VwIHRhYmxlXG4iKTsKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisJfQorCisJZXJyID0gc3F1YXNoZnNfcmVhZF90YWJsZShzYiwgaW5vZGVfbG9va3VwX3RhYmxlLCBsb29rdXBfdGFibGVfc3RhcnQsCisJCQlsZW5ndGgpOworCWlmIChlcnIgPCAwKSB7CisJCUVSUk9SKCJ1bmFibGUgdG8gcmVhZCBpbm9kZSBsb29rdXAgdGFibGVcbiIpOworCQlrZnJlZShpbm9kZV9sb29rdXBfdGFibGUpOworCQlyZXR1cm4gRVJSX1BUUihlcnIpOworCX0KKworCXJldHVybiBpbm9kZV9sb29rdXBfdGFibGU7Cit9CisKKworY29uc3Qgc3RydWN0IGV4cG9ydF9vcGVyYXRpb25zIHNxdWFzaGZzX2V4cG9ydF9vcHMgPSB7CisJLmZoX3RvX2RlbnRyeSA9IHNxdWFzaGZzX2ZoX3RvX2RlbnRyeSwKKwkuZmhfdG9fcGFyZW50ID0gc3F1YXNoZnNfZmhfdG9fcGFyZW50LAorCS5nZXRfcGFyZW50ID0gc3F1YXNoZnNfZ2V0X3BhcmVudAorfTsKZGlmZiAtLWdpdCBhL2ZzL3NxdWFzaGZzL2ZpbGUuYyBiL2ZzL3NxdWFzaGZzL2ZpbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTc3NjdkCi0tLSAvZGV2L251bGwKKysrIGIvZnMvc3F1YXNoZnMvZmlsZS5jCkBAIC0wLDAgKzEsNTAyIEBACisvKgorICogU3F1YXNoZnMgLSBhIGNvbXByZXNzZWQgcmVhZCBvbmx5IGZpbGVzeXN0ZW0gZm9yIExpbnV4CisgKgorICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4CisgKiBQaGlsbGlwIExvdWdoZXIgPHBoaWxsaXBAbG91Z2hlci5kZW1vbi5jby51az4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsCisgKiBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqCisgKiBmaWxlLmMKKyAqLworCisvKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIGNvZGUgZm9yIGhhbmRsaW5nIHJlZ3VsYXIgZmlsZXMuICBBIHJlZ3VsYXIgZmlsZQorICogY29uc2lzdHMgb2YgYSBzZXF1ZW5jZSBvZiBjb250aWd1b3VzIGNvbXByZXNzZWQgYmxvY2tzLCBhbmQvb3IgYQorICogY29tcHJlc3NlZCBmcmFnbWVudCBibG9jayAodGFpbC1lbmQgcGFja2VkIGJsb2NrKS4gICBUaGUgY29tcHJlc3NlZCBzaXplCisgKiBvZiBlYWNoIGRhdGFibG9jayBpcyBzdG9yZWQgaW4gYSBibG9jayBsaXN0IGNvbnRhaW5lZCB3aXRoaW4gdGhlCisgKiBmaWxlIGlub2RlIChpdHNlbGYgc3RvcmVkIGluIG9uZSBvciBtb3JlIGNvbXByZXNzZWQgbWV0YWRhdGEgYmxvY2tzKS4KKyAqCisgKiBUbyBzcGVlZCB1cCBhY2Nlc3MgdG8gZGF0YWJsb2NrcyB3aGVuIHJlYWRpbmcgJ2xhcmdlJyBmaWxlcyAoMjU2IE1ieXRlcyBvcgorICogbGFyZ2VyKSwgdGhlIGNvZGUgaW1wbGVtZW50cyBhbiBpbmRleCBjYWNoZSB0aGF0IGNhY2hlcyB0aGUgbWFwcGluZyBmcm9tCisgKiBibG9jayBpbmRleCB0byBkYXRhYmxvY2sgbG9jYXRpb24gb24gZGlzay4KKyAqCisgKiBUaGUgaW5kZXggY2FjaGUgYWxsb3dzIFNxdWFzaGZzIHRvIGhhbmRsZSBsYXJnZSBmaWxlcyAodXAgdG8gMS43NSBUaUIpIHdoaWxlCisgKiByZXRhaW5pbmcgYSBzaW1wbGUgYW5kIHNwYWNlLWVmZmljaWVudCBibG9jayBsaXN0IG9uIGRpc2suICBUaGUgY2FjaGUKKyAqIGlzIHNwbGl0IGludG8gc2xvdHMsIGNhY2hpbmcgdXAgdG8gZWlnaHQgMjI0IEdpQiBmaWxlcyAoMTI4IEtpQiBibG9ja3MpLgorICogTGFyZ2VyIGZpbGVzIHVzZSBtdWx0aXBsZSBzbG90cywgd2l0aCAxLjc1IFRpQiBmaWxlcyB1c2luZyBhbGwgOCBzbG90cy4KKyAqIFRoZSBpbmRleCBjYWNoZSBpcyBkZXNpZ25lZCB0byBiZSBtZW1vcnkgZWZmaWNpZW50LCBhbmQgYnkgZGVmYXVsdCB1c2VzCisgKiAxNiBLaUIuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvdmZzLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L3psaWIuaD4KKworI2luY2x1ZGUgInNxdWFzaGZzX2ZzLmgiCisjaW5jbHVkZSAic3F1YXNoZnNfZnNfc2IuaCIKKyNpbmNsdWRlICJzcXVhc2hmc19mc19pLmgiCisjaW5jbHVkZSAic3F1YXNoZnMuaCIKKworLyoKKyAqIExvY2F0ZSBjYWNoZSBzbG90IGluIHJhbmdlIFtvZmZzZXQsIGluZGV4XSBmb3Igc3BlY2lmaWVkIGlub2RlLiAgSWYKKyAqIHRoZXJlJ3MgbW9yZSB0aGFuIG9uZSByZXR1cm4gdGhlIHNsb3QgY2xvc2VzdCB0byBpbmRleC4KKyAqLworc3RhdGljIHN0cnVjdCBtZXRhX2luZGV4ICpsb2NhdGVfbWV0YV9pbmRleChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgb2Zmc2V0LAorCQkJCWludCBpbmRleCkKK3sKKwlzdHJ1Y3QgbWV0YV9pbmRleCAqbWV0YSA9IE5VTEw7CisJc3RydWN0IHNxdWFzaGZzX3NiX2luZm8gKm1zYmxrID0gaW5vZGUtPmlfc2ItPnNfZnNfaW5mbzsKKwlpbnQgaTsKKworCW11dGV4X2xvY2soJm1zYmxrLT5tZXRhX2luZGV4X211dGV4KTsKKworCVRSQUNFKCJsb2NhdGVfbWV0YV9pbmRleDogaW5kZXggJWQsIG9mZnNldCAlZFxuIiwgaW5kZXgsIG9mZnNldCk7CisKKwlpZiAobXNibGstPm1ldGFfaW5kZXggPT0gTlVMTCkKKwkJZ290byBub3RfYWxsb2NhdGVkOworCisJZm9yIChpID0gMDsgaSA8IFNRVUFTSEZTX01FVEFfU0xPVFM7IGkrKykgeworCQlpZiAobXNibGstPm1ldGFfaW5kZXhbaV0uaW5vZGVfbnVtYmVyID09IGlub2RlLT5pX2lubyAmJgorCQkJCW1zYmxrLT5tZXRhX2luZGV4W2ldLm9mZnNldCA+PSBvZmZzZXQgJiYKKwkJCQltc2Jsay0+bWV0YV9pbmRleFtpXS5vZmZzZXQgPD0gaW5kZXggJiYKKwkJCQltc2Jsay0+bWV0YV9pbmRleFtpXS5sb2NrZWQgPT0gMCkgeworCQkJVFJBQ0UoImxvY2F0ZV9tZXRhX2luZGV4OiBlbnRyeSAlZCwgb2Zmc2V0ICVkXG4iLCBpLAorCQkJCQltc2Jsay0+bWV0YV9pbmRleFtpXS5vZmZzZXQpOworCQkJbWV0YSA9ICZtc2Jsay0+bWV0YV9pbmRleFtpXTsKKwkJCW9mZnNldCA9IG1ldGEtPm9mZnNldDsKKwkJfQorCX0KKworCWlmIChtZXRhKQorCQltZXRhLT5sb2NrZWQgPSAxOworCitub3RfYWxsb2NhdGVkOgorCW11dGV4X3VubG9jaygmbXNibGstPm1ldGFfaW5kZXhfbXV0ZXgpOworCisJcmV0dXJuIG1ldGE7Cit9CisKKworLyoKKyAqIEZpbmQgYW5kIGluaXRpYWxpc2UgYW4gZW1wdHkgY2FjaGUgc2xvdCBmb3IgaW5kZXggb2Zmc2V0LgorICovCitzdGF0aWMgc3RydWN0IG1ldGFfaW5kZXggKmVtcHR5X21ldGFfaW5kZXgoc3RydWN0IGlub2RlICppbm9kZSwgaW50IG9mZnNldCwKKwkJCQlpbnQgc2tpcCkKK3sKKwlzdHJ1Y3Qgc3F1YXNoZnNfc2JfaW5mbyAqbXNibGsgPSBpbm9kZS0+aV9zYi0+c19mc19pbmZvOworCXN0cnVjdCBtZXRhX2luZGV4ICptZXRhID0gTlVMTDsKKwlpbnQgaTsKKworCW11dGV4X2xvY2soJm1zYmxrLT5tZXRhX2luZGV4X211dGV4KTsKKworCVRSQUNFKCJlbXB0eV9tZXRhX2luZGV4OiBvZmZzZXQgJWQsIHNraXAgJWRcbiIsIG9mZnNldCwgc2tpcCk7CisKKwlpZiAobXNibGstPm1ldGFfaW5kZXggPT0gTlVMTCkgeworCQkvKgorCQkgKiBGaXJzdCB0aW1lIGNhY2hlIGluZGV4IGhhcyBiZWVuIHVzZWQsIGFsbG9jYXRlIGFuZAorCQkgKiBpbml0aWFsaXNlLiAgVGhlIGNhY2hlIGluZGV4IGNvdWxkIGJlIGFsbG9jYXRlZCBhdAorCQkgKiBtb3VudCB0aW1lIGJ1dCBkb2luZyBpdCBoZXJlIG1lYW5zIGl0IGlzIGFsbG9jYXRlZCBvbmx5CisJCSAqIGlmIGEgJ2xhcmdlJyBmaWxlIGlzIHJlYWQuCisJCSAqLworCQltc2Jsay0+bWV0YV9pbmRleCA9IGtjYWxsb2MoU1FVQVNIRlNfTUVUQV9TTE9UUywKKwkJCXNpemVvZigqKG1zYmxrLT5tZXRhX2luZGV4KSksIEdGUF9LRVJORUwpOworCQlpZiAobXNibGstPm1ldGFfaW5kZXggPT0gTlVMTCkgeworCQkJRVJST1IoIkZhaWxlZCB0byBhbGxvY2F0ZSBtZXRhX2luZGV4XG4iKTsKKwkJCWdvdG8gZmFpbGVkOworCQl9CisJCWZvciAoaSA9IDA7IGkgPCBTUVVBU0hGU19NRVRBX1NMT1RTOyBpKyspIHsKKwkJCW1zYmxrLT5tZXRhX2luZGV4W2ldLmlub2RlX251bWJlciA9IDA7CisJCQltc2Jsay0+bWV0YV9pbmRleFtpXS5sb2NrZWQgPSAwOworCQl9CisJCW1zYmxrLT5uZXh0X21ldGFfaW5kZXggPSAwOworCX0KKworCWZvciAoaSA9IFNRVUFTSEZTX01FVEFfU0xPVFM7IGkgJiYKKwkJCW1zYmxrLT5tZXRhX2luZGV4W21zYmxrLT5uZXh0X21ldGFfaW5kZXhdLmxvY2tlZDsgaS0tKQorCQltc2Jsay0+bmV4dF9tZXRhX2luZGV4ID0gKG1zYmxrLT5uZXh0X21ldGFfaW5kZXggKyAxKSAlCisJCQlTUVVBU0hGU19NRVRBX1NMT1RTOworCisJaWYgKGkgPT0gMCkgeworCQlUUkFDRSgiZW1wdHlfbWV0YV9pbmRleDogZmFpbGVkIVxuIik7CisJCWdvdG8gZmFpbGVkOworCX0KKworCVRSQUNFKCJlbXB0eV9tZXRhX2luZGV4OiByZXR1cm5lZCBtZXRhIGVudHJ5ICVkLCAlcFxuIiwKKwkJCW1zYmxrLT5uZXh0X21ldGFfaW5kZXgsCisJCQkmbXNibGstPm1ldGFfaW5kZXhbbXNibGstPm5leHRfbWV0YV9pbmRleF0pOworCisJbWV0YSA9ICZtc2Jsay0+bWV0YV9pbmRleFttc2Jsay0+bmV4dF9tZXRhX2luZGV4XTsKKwltc2Jsay0+bmV4dF9tZXRhX2luZGV4ID0gKG1zYmxrLT5uZXh0X21ldGFfaW5kZXggKyAxKSAlCisJCQlTUVVBU0hGU19NRVRBX1NMT1RTOworCisJbWV0YS0+aW5vZGVfbnVtYmVyID0gaW5vZGUtPmlfaW5vOworCW1ldGEtPm9mZnNldCA9IG9mZnNldDsKKwltZXRhLT5za2lwID0gc2tpcDsKKwltZXRhLT5lbnRyaWVzID0gMDsKKwltZXRhLT5sb2NrZWQgPSAxOworCitmYWlsZWQ6CisJbXV0ZXhfdW5sb2NrKCZtc2Jsay0+bWV0YV9pbmRleF9tdXRleCk7CisJcmV0dXJuIG1ldGE7Cit9CisKKworc3RhdGljIHZvaWQgcmVsZWFzZV9tZXRhX2luZGV4KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBtZXRhX2luZGV4ICptZXRhKQoreworCXN0cnVjdCBzcXVhc2hmc19zYl9pbmZvICptc2JsayA9IGlub2RlLT5pX3NiLT5zX2ZzX2luZm87CisJbXV0ZXhfbG9jaygmbXNibGstPm1ldGFfaW5kZXhfbXV0ZXgpOworCW1ldGEtPmxvY2tlZCA9IDA7CisJbXV0ZXhfdW5sb2NrKCZtc2Jsay0+bWV0YV9pbmRleF9tdXRleCk7Cit9CisKKworLyoKKyAqIFJlYWQgdGhlIG5leHQgbiBibG9ja3MgZnJvbSB0aGUgYmxvY2sgbGlzdCwgc3RhcnRpbmcgZnJvbQorICogbWV0YWRhdGEgYmxvY2sgPHN0YXJ0X2Jsb2NrLCBvZmZzZXQ+LgorICovCitzdGF0aWMgbG9uZyBsb25nIHJlYWRfaW5kZXhlcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgbiwKKwkJCQl1NjQgKnN0YXJ0X2Jsb2NrLCBpbnQgKm9mZnNldCkKK3sKKwlpbnQgZXJyLCBpOworCWxvbmcgbG9uZyBibG9jayA9IDA7CisJX19sZTMyICpibGlzdCA9IGttYWxsb2MoUEFHRV9DQUNIRV9TSVpFLCBHRlBfS0VSTkVMKTsKKworCWlmIChibGlzdCA9PSBOVUxMKSB7CisJCUVSUk9SKCJyZWFkX2luZGV4ZXM6IEZhaWxlZCB0byBhbGxvY2F0ZSBibG9ja19saXN0XG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJd2hpbGUgKG4pIHsKKwkJaW50IGJsb2NrcyA9IG1pbl90KGludCwgbiwgUEFHRV9DQUNIRV9TSVpFID4+IDIpOworCisJCWVyciA9IHNxdWFzaGZzX3JlYWRfbWV0YWRhdGEoc2IsIGJsaXN0LCBzdGFydF9ibG9jaywKKwkJCQlvZmZzZXQsIGJsb2NrcyA8PCAyKTsKKwkJaWYgKGVyciA8IDApIHsKKwkJCUVSUk9SKCJyZWFkX2luZGV4ZXM6IHJlYWRpbmcgYmxvY2sgWyVsbHg6JXhdXG4iLAorCQkJCSpzdGFydF9ibG9jaywgKm9mZnNldCk7CisJCQlnb3RvIGZhaWx1cmU7CisJCX0KKworCQlmb3IgKGkgPSAwOyBpIDwgYmxvY2tzOyBpKyspIHsKKwkJCWludCBzaXplID0gbGUzMl90b19jcHUoYmxpc3RbaV0pOworCQkJYmxvY2sgKz0gU1FVQVNIRlNfQ09NUFJFU1NFRF9TSVpFX0JMT0NLKHNpemUpOworCQl9CisJCW4gLT0gYmxvY2tzOworCX0KKworCWtmcmVlKGJsaXN0KTsKKwlyZXR1cm4gYmxvY2s7CisKK2ZhaWx1cmU6CisJa2ZyZWUoYmxpc3QpOworCXJldHVybiBlcnI7Cit9CisKKworLyoKKyAqIEVhY2ggY2FjaGUgaW5kZXggc2xvdCBoYXMgU1FVQVNIRlNfTUVUQV9FTlRSSUVTLCBlYWNoIG9mIHdoaWNoCisgKiBjYW4gY2FjaGUgb25lIGluZGV4IC0+IGRhdGFibG9jay9ibG9ja2xpc3QtYmxvY2sgbWFwcGluZy4gIFdlIHdpc2gKKyAqIHRvIGRpc3RyaWJ1dGUgdGhlc2Ugb3ZlciB0aGUgbGVuZ3RoIG9mIHRoZSBmaWxlLCBlbnRyeVswXSBtYXBzIGluZGV4IHgsCisgKiBlbnRyeVsxXSBtYXBzIGluZGV4IHggKyBza2lwLCBlbnRyeVsyXSBtYXBzIGluZGV4IHggKyAyICogc2tpcCwgYW5kIHNvIG9uLgorICogVGhlIGxhcmdlciB0aGUgZmlsZSwgdGhlIGdyZWF0ZXIgdGhlIHNraXAgZmFjdG9yLiAgVGhlIHNraXAgZmFjdG9yIGlzCisgKiBsaW1pdGVkIHRvIHRoZSBzaXplIG9mIHRoZSBtZXRhZGF0YSBjYWNoZSAoU1FVQVNIRlNfQ0FDSEVEX0JMS1MpIHRvIGVuc3VyZQorICogdGhlIG51bWJlciBvZiBtZXRhZGF0YSBibG9ja3MgdGhhdCBuZWVkIHRvIGJlIHJlYWQgZml0cyBpbnRvIHRoZSBjYWNoZS4KKyAqIElmIHRoZSBza2lwIGZhY3RvciBpcyBsaW1pdGVkIGluIHRoaXMgd2F5IHRoZW4gdGhlIGZpbGUgd2lsbCB1c2UgbXVsdGlwbGUKKyAqIHNsb3RzLgorICovCitzdGF0aWMgaW5saW5lIGludCBjYWxjdWxhdGVfc2tpcChpbnQgYmxvY2tzKQoreworCWludCBza2lwID0gYmxvY2tzIC8gKChTUVVBU0hGU19NRVRBX0VOVFJJRVMgKyAxKQorCQkgKiBTUVVBU0hGU19NRVRBX0lOREVYRVMpOworCXJldHVybiBtaW4oU1FVQVNIRlNfQ0FDSEVEX0JMS1MgLSAxLCBza2lwICsgMSk7Cit9CisKKworLyoKKyAqIFNlYXJjaCBhbmQgZ3JvdyB0aGUgaW5kZXggY2FjaGUgZm9yIHRoZSBzcGVjaWZpZWQgaW5vZGUsIHJldHVybmluZyB0aGUKKyAqIG9uLWRpc2sgbG9jYXRpb25zIG9mIHRoZSBkYXRhYmxvY2sgYW5kIGJsb2NrIGxpc3QgbWV0YWRhdGEgYmxvY2sKKyAqIDxpbmRleF9ibG9jaywgaW5kZXhfb2Zmc2V0PiBmb3IgaW5kZXggKHNjYWxlZCB0byBuZWFyZXN0IGNhY2hlIGluZGV4KS4KKyAqLworc3RhdGljIGludCBmaWxsX21ldGFfaW5kZXgoc3RydWN0IGlub2RlICppbm9kZSwgaW50IGluZGV4LAorCQl1NjQgKmluZGV4X2Jsb2NrLCBpbnQgKmluZGV4X29mZnNldCwgdTY0ICpkYXRhX2Jsb2NrKQoreworCXN0cnVjdCBzcXVhc2hmc19zYl9pbmZvICptc2JsayA9IGlub2RlLT5pX3NiLT5zX2ZzX2luZm87CisJaW50IHNraXAgPSBjYWxjdWxhdGVfc2tpcChpX3NpemVfcmVhZChpbm9kZSkgPj4gbXNibGstPmJsb2NrX2xvZyk7CisJaW50IG9mZnNldCA9IDA7CisJc3RydWN0IG1ldGFfaW5kZXggKm1ldGE7CisJc3RydWN0IG1ldGFfZW50cnkgKm1ldGFfZW50cnk7CisJdTY0IGN1cl9pbmRleF9ibG9jayA9IHNxdWFzaGZzX2koaW5vZGUpLT5ibG9ja19saXN0X3N0YXJ0OworCWludCBjdXJfb2Zmc2V0ID0gc3F1YXNoZnNfaShpbm9kZSktPm9mZnNldDsKKwl1NjQgY3VyX2RhdGFfYmxvY2sgPSBzcXVhc2hmc19pKGlub2RlKS0+c3RhcnQ7CisJaW50IGVyciwgaTsKKworCS8qCisJICogU2NhbGUgaW5kZXggdG8gY2FjaGUgaW5kZXggKGNhY2hlIHNsb3QgZW50cnkpCisJICovCisJaW5kZXggLz0gU1FVQVNIRlNfTUVUQV9JTkRFWEVTICogc2tpcDsKKworCXdoaWxlIChvZmZzZXQgPCBpbmRleCkgeworCQltZXRhID0gbG9jYXRlX21ldGFfaW5kZXgoaW5vZGUsIG9mZnNldCArIDEsIGluZGV4KTsKKworCQlpZiAobWV0YSA9PSBOVUxMKSB7CisJCQltZXRhID0gZW1wdHlfbWV0YV9pbmRleChpbm9kZSwgb2Zmc2V0ICsgMSwgc2tpcCk7CisJCQlpZiAobWV0YSA9PSBOVUxMKQorCQkJCWdvdG8gYWxsX2RvbmU7CisJCX0gZWxzZSB7CisJCQlvZmZzZXQgPSBpbmRleCA8IG1ldGEtPm9mZnNldCArIG1ldGEtPmVudHJpZXMgPyBpbmRleCA6CisJCQkJbWV0YS0+b2Zmc2V0ICsgbWV0YS0+ZW50cmllcyAtIDE7CisJCQltZXRhX2VudHJ5ID0gJm1ldGEtPm1ldGFfZW50cnlbb2Zmc2V0IC0gbWV0YS0+b2Zmc2V0XTsKKwkJCWN1cl9pbmRleF9ibG9jayA9IG1ldGFfZW50cnktPmluZGV4X2Jsb2NrICsKKwkJCQltc2Jsay0+aW5vZGVfdGFibGU7CisJCQljdXJfb2Zmc2V0ID0gbWV0YV9lbnRyeS0+b2Zmc2V0OworCQkJY3VyX2RhdGFfYmxvY2sgPSBtZXRhX2VudHJ5LT5kYXRhX2Jsb2NrOworCQkJVFJBQ0UoImdldF9tZXRhX2luZGV4OiBvZmZzZXQgJWQsIG1ldGEtPm9mZnNldCAlZCwgIgorCQkJCSJtZXRhLT5lbnRyaWVzICVkXG4iLCBvZmZzZXQsIG1ldGEtPm9mZnNldCwKKwkJCQltZXRhLT5lbnRyaWVzKTsKKwkJCVRSQUNFKCJnZXRfbWV0YV9pbmRleDogaW5kZXhfYmxvY2sgMHglbGx4LCBvZmZzZXQgMHgleCIKKwkJCQkiIGRhdGFfYmxvY2sgMHglbGx4XG4iLCBjdXJfaW5kZXhfYmxvY2ssCisJCQkJY3VyX29mZnNldCwgY3VyX2RhdGFfYmxvY2spOworCQl9CisKKwkJLyoKKwkJICogSWYgbmVjZXNzYXJ5IGdyb3cgY2FjaGUgc2xvdCBieSByZWFkaW5nIGJsb2NrIGxpc3QuICBDYWNoZQorCQkgKiBzbG90IGlzIGV4dGVuZGVkIHVwIHRvIGluZGV4IG9yIHRvIHRoZSBlbmQgb2YgdGhlIHNsb3QsIGluCisJCSAqIHdoaWNoIGNhc2UgZnVydGhlciBzbG90cyB3aWxsIGJlIHVzZWQuCisJCSAqLworCQlmb3IgKGkgPSBtZXRhLT5vZmZzZXQgKyBtZXRhLT5lbnRyaWVzOyBpIDw9IGluZGV4ICYmCisJCQkJaSA8IG1ldGEtPm9mZnNldCArIFNRVUFTSEZTX01FVEFfRU5UUklFUzsgaSsrKSB7CisJCQlpbnQgYmxvY2tzID0gc2tpcCAqIFNRVUFTSEZTX01FVEFfSU5ERVhFUzsKKwkJCWxvbmcgbG9uZyByZXMgPSByZWFkX2luZGV4ZXMoaW5vZGUtPmlfc2IsIGJsb2NrcywKKwkJCQkJJmN1cl9pbmRleF9ibG9jaywgJmN1cl9vZmZzZXQpOworCisJCQlpZiAocmVzIDwgMCkgeworCQkJCWlmIChtZXRhLT5lbnRyaWVzID09IDApCisJCQkJCS8qCisJCQkJCSAqIERvbid0IGxlYXZlIGFuIGVtcHR5IHNsb3Qgb24gcmVhZAorCQkJCQkgKiBlcnJvciBhbGxvY2F0ZWQgdG8gdGhpcyBpbm9kZS4uLgorCQkJCQkgKi8KKwkJCQkJbWV0YS0+aW5vZGVfbnVtYmVyID0gMDsKKwkJCQllcnIgPSByZXM7CisJCQkJZ290byBmYWlsZWQ7CisJCQl9CisKKwkJCWN1cl9kYXRhX2Jsb2NrICs9IHJlczsKKwkJCW1ldGFfZW50cnkgPSAmbWV0YS0+bWV0YV9lbnRyeVtpIC0gbWV0YS0+b2Zmc2V0XTsKKwkJCW1ldGFfZW50cnktPmluZGV4X2Jsb2NrID0gY3VyX2luZGV4X2Jsb2NrIC0KKwkJCQltc2Jsay0+aW5vZGVfdGFibGU7CisJCQltZXRhX2VudHJ5LT5vZmZzZXQgPSBjdXJfb2Zmc2V0OworCQkJbWV0YV9lbnRyeS0+ZGF0YV9ibG9jayA9IGN1cl9kYXRhX2Jsb2NrOworCQkJbWV0YS0+ZW50cmllcysrOworCQkJb2Zmc2V0Kys7CisJCX0KKworCQlUUkFDRSgiZ2V0X21ldGFfaW5kZXg6IG1ldGEtPm9mZnNldCAlZCwgbWV0YS0+ZW50cmllcyAlZFxuIiwKKwkJCQltZXRhLT5vZmZzZXQsIG1ldGEtPmVudHJpZXMpOworCisJCXJlbGVhc2VfbWV0YV9pbmRleChpbm9kZSwgbWV0YSk7CisJfQorCithbGxfZG9uZToKKwkqaW5kZXhfYmxvY2sgPSBjdXJfaW5kZXhfYmxvY2s7CisJKmluZGV4X29mZnNldCA9IGN1cl9vZmZzZXQ7CisJKmRhdGFfYmxvY2sgPSBjdXJfZGF0YV9ibG9jazsKKworCS8qCisJICogU2NhbGUgY2FjaGUgaW5kZXggKGNhY2hlIHNsb3QgZW50cnkpIHRvIGluZGV4CisJICovCisJcmV0dXJuIG9mZnNldCAqIFNRVUFTSEZTX01FVEFfSU5ERVhFUyAqIHNraXA7CisKK2ZhaWxlZDoKKwlyZWxlYXNlX21ldGFfaW5kZXgoaW5vZGUsIG1ldGEpOworCXJldHVybiBlcnI7Cit9CisKKworLyoKKyAqIEdldCB0aGUgb24tZGlzayBsb2NhdGlvbiBhbmQgY29tcHJlc3NlZCBzaXplIG9mIHRoZSBkYXRhYmxvY2sKKyAqIHNwZWNpZmllZCBieSBpbmRleC4gIEZpbGxfbWV0YV9pbmRleCgpIGRvZXMgbW9zdCBvZiB0aGUgd29yay4KKyAqLworc3RhdGljIGludCByZWFkX2Jsb2NrbGlzdChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgaW5kZXgsIHU2NCAqYmxvY2spCit7CisJdTY0IHN0YXJ0OworCWxvbmcgbG9uZyBibGtzOworCWludCBvZmZzZXQ7CisJX19sZTMyIHNpemU7CisJaW50IHJlcyA9IGZpbGxfbWV0YV9pbmRleChpbm9kZSwgaW5kZXgsICZzdGFydCwgJm9mZnNldCwgYmxvY2spOworCisJVFJBQ0UoInJlYWRfYmxvY2tsaXN0OiByZXMgJWQsIGluZGV4ICVkLCBzdGFydCAweCVsbHgsIG9mZnNldCIKKwkJICAgICAgICIgMHgleCwgYmxvY2sgMHglbGx4XG4iLCByZXMsIGluZGV4LCBzdGFydCwgb2Zmc2V0LAorCQkJKmJsb2NrKTsKKworCWlmIChyZXMgPCAwKQorCQlyZXR1cm4gcmVzOworCisJLyoKKwkgKiByZXMgY29udGFpbnMgdGhlIGluZGV4IG9mIHRoZSBtYXBwaW5nIHJldHVybmVkIGJ5IGZpbGxfbWV0YV9pbmRleCgpLAorCSAqIHRoaXMgd2lsbCBsaWtlbHkgYmUgbGVzcyB0aGFuIHRoZSBkZXNpcmVkIGluZGV4IChiZWNhdXNlIHRoZQorCSAqIG1ldGFfaW5kZXggY2FjaGUgd29ya3MgYXQgYSBoaWdoZXIgZ3JhbnVsYXJpdHkpLiAgUmVhZCBhbnkKKwkgKiBleHRyYSBibG9jayBpbmRleGVzIG5lZWRlZC4KKwkgKi8KKwlpZiAocmVzIDwgaW5kZXgpIHsKKwkJYmxrcyA9IHJlYWRfaW5kZXhlcyhpbm9kZS0+aV9zYiwgaW5kZXggLSByZXMsICZzdGFydCwgJm9mZnNldCk7CisJCWlmIChibGtzIDwgMCkKKwkJCXJldHVybiAoaW50KSBibGtzOworCQkqYmxvY2sgKz0gYmxrczsKKwl9CisKKwkvKgorCSAqIFJlYWQgbGVuZ3RoIG9mIGJsb2NrIHNwZWNpZmllZCBieSBpbmRleC4KKwkgKi8KKwlyZXMgPSBzcXVhc2hmc19yZWFkX21ldGFkYXRhKGlub2RlLT5pX3NiLCAmc2l6ZSwgJnN0YXJ0LCAmb2Zmc2V0LAorCQkJc2l6ZW9mKHNpemUpKTsKKwlpZiAocmVzIDwgMCkKKwkJcmV0dXJuIHJlczsKKwlyZXR1cm4gbGUzMl90b19jcHUoc2l6ZSk7Cit9CisKKworc3RhdGljIGludCBzcXVhc2hmc19yZWFkcGFnZShzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHBhZ2UgKnBhZ2UpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IHBhZ2UtPm1hcHBpbmctPmhvc3Q7CisJc3RydWN0IHNxdWFzaGZzX3NiX2luZm8gKm1zYmxrID0gaW5vZGUtPmlfc2ItPnNfZnNfaW5mbzsKKwlpbnQgYnl0ZXMsIGksIG9mZnNldCA9IDAsIHNwYXJzZSA9IDA7CisJc3RydWN0IHNxdWFzaGZzX2NhY2hlX2VudHJ5ICpidWZmZXIgPSBOVUxMOworCXZvaWQgKnBhZ2VhZGRyOworCisJaW50IG1hc2sgPSAoMSA8PCAobXNibGstPmJsb2NrX2xvZyAtIFBBR0VfQ0FDSEVfU0hJRlQpKSAtIDE7CisJaW50IGluZGV4ID0gcGFnZS0+aW5kZXggPj4gKG1zYmxrLT5ibG9ja19sb2cgLSBQQUdFX0NBQ0hFX1NISUZUKTsKKwlpbnQgc3RhcnRfaW5kZXggPSBwYWdlLT5pbmRleCAmIH5tYXNrOworCWludCBlbmRfaW5kZXggPSBzdGFydF9pbmRleCB8IG1hc2s7CisJaW50IGZpbGVfZW5kID0gaV9zaXplX3JlYWQoaW5vZGUpID4+IG1zYmxrLT5ibG9ja19sb2c7CisKKwlUUkFDRSgiRW50ZXJlZCBzcXVhc2hmc19yZWFkcGFnZSwgcGFnZSBpbmRleCAlbHgsIHN0YXJ0IGJsb2NrICVsbHhcbiIsCisJCQkJcGFnZS0+aW5kZXgsIHNxdWFzaGZzX2koaW5vZGUpLT5zdGFydCk7CisKKwlpZiAocGFnZS0+aW5kZXggPj0gKChpX3NpemVfcmVhZChpbm9kZSkgKyBQQUdFX0NBQ0hFX1NJWkUgLSAxKSA+PgorCQkJCQlQQUdFX0NBQ0hFX1NISUZUKSkKKwkJZ290byBvdXQ7CisKKwlpZiAoaW5kZXggPCBmaWxlX2VuZCB8fCBzcXVhc2hmc19pKGlub2RlKS0+ZnJhZ21lbnRfYmxvY2sgPT0KKwkJCQkJU1FVQVNIRlNfSU5WQUxJRF9CTEspIHsKKwkJLyoKKwkJICogUmVhZGluZyBhIGRhdGFibG9jayBmcm9tIGRpc2suICBOZWVkIHRvIHJlYWQgYmxvY2sgbGlzdAorCQkgKiB0byBnZXQgbG9jYXRpb24gYW5kIGJsb2NrIHNpemUuCisJCSAqLworCQl1NjQgYmxvY2sgPSAwOworCQlpbnQgYnNpemUgPSByZWFkX2Jsb2NrbGlzdChpbm9kZSwgaW5kZXgsICZibG9jayk7CisJCWlmIChic2l6ZSA8IDApCisJCQlnb3RvIGVycm9yX291dDsKKworCQlpZiAoYnNpemUgPT0gMCkgeyAvKiBob2xlICovCisJCQlieXRlcyA9IGluZGV4ID09IGZpbGVfZW5kID8KKwkJCQkoaV9zaXplX3JlYWQoaW5vZGUpICYgKG1zYmxrLT5ibG9ja19zaXplIC0gMSkpIDoKKwkJCQkgbXNibGstPmJsb2NrX3NpemU7CisJCQlzcGFyc2UgPSAxOworCQl9IGVsc2UgeworCQkJLyoKKwkJCSAqIFJlYWQgYW5kIGRlY29tcHJlc3MgZGF0YWJsb2NrLgorCQkJICovCisJCQlidWZmZXIgPSBzcXVhc2hmc19nZXRfZGF0YWJsb2NrKGlub2RlLT5pX3NiLAorCQkJCQkJCQlibG9jaywgYnNpemUpOworCQkJaWYgKGJ1ZmZlci0+ZXJyb3IpIHsKKwkJCQlFUlJPUigiVW5hYmxlIHRvIHJlYWQgcGFnZSwgYmxvY2sgJWxseCwgc2l6ZSAleCIKKwkJCQkJIlxuIiwgYmxvY2ssIGJzaXplKTsKKwkJCQlzcXVhc2hmc19jYWNoZV9wdXQoYnVmZmVyKTsKKwkJCQlnb3RvIGVycm9yX291dDsKKwkJCX0KKwkJCWJ5dGVzID0gYnVmZmVyLT5sZW5ndGg7CisJCX0KKwl9IGVsc2UgeworCQkvKgorCQkgKiBEYXRhYmxvY2sgaXMgc3RvcmVkIGluc2lkZSBhIGZyYWdtZW50ICh0YWlsLWVuZCBwYWNrZWQKKwkJICogYmxvY2spLgorCQkgKi8KKwkJYnVmZmVyID0gc3F1YXNoZnNfZ2V0X2ZyYWdtZW50KGlub2RlLT5pX3NiLAorCQkJCXNxdWFzaGZzX2koaW5vZGUpLT5mcmFnbWVudF9ibG9jaywKKwkJCQlzcXVhc2hmc19pKGlub2RlKS0+ZnJhZ21lbnRfc2l6ZSk7CisKKwkJaWYgKGJ1ZmZlci0+ZXJyb3IpIHsKKwkJCUVSUk9SKCJVbmFibGUgdG8gcmVhZCBwYWdlLCBibG9jayAlbGx4LCBzaXplICV4XG4iLAorCQkJCXNxdWFzaGZzX2koaW5vZGUpLT5mcmFnbWVudF9ibG9jaywKKwkJCQlzcXVhc2hmc19pKGlub2RlKS0+ZnJhZ21lbnRfc2l6ZSk7CisJCQlzcXVhc2hmc19jYWNoZV9wdXQoYnVmZmVyKTsKKwkJCWdvdG8gZXJyb3Jfb3V0OworCQl9CisJCWJ5dGVzID0gaV9zaXplX3JlYWQoaW5vZGUpICYgKG1zYmxrLT5ibG9ja19zaXplIC0gMSk7CisJCW9mZnNldCA9IHNxdWFzaGZzX2koaW5vZGUpLT5mcmFnbWVudF9vZmZzZXQ7CisJfQorCisJLyoKKwkgKiBMb29wIGNvcHlpbmcgZGF0YWJsb2NrIGludG8gcGFnZXMuICBBcyB0aGUgZGF0YWJsb2NrIGxpa2VseSBjb3ZlcnMKKwkgKiBtYW55IFBBR0VfQ0FDSEVfU0laRSBwYWdlcyAoZGVmYXVsdCBibG9jayBzaXplIGlzIDEyOCBLaUIpIGV4cGxpY2l0bHkKKwkgKiBncmFiIHRoZSBwYWdlcyBmcm9tIHRoZSBwYWdlIGNhY2hlLCBleGNlcHQgZm9yIHRoZSBwYWdlIHRoYXQgd2UndmUKKwkgKiBiZWVuIGNhbGxlZCB0byBmaWxsLgorCSAqLworCWZvciAoaSA9IHN0YXJ0X2luZGV4OyBpIDw9IGVuZF9pbmRleCAmJiBieXRlcyA+IDA7IGkrKywKKwkJCWJ5dGVzIC09IFBBR0VfQ0FDSEVfU0laRSwgb2Zmc2V0ICs9IFBBR0VfQ0FDSEVfU0laRSkgeworCQlzdHJ1Y3QgcGFnZSAqcHVzaF9wYWdlOworCQlpbnQgYXZhaWwgPSBzcGFyc2UgPyAwIDogbWluX3QoaW50LCBieXRlcywgUEFHRV9DQUNIRV9TSVpFKTsKKworCQlUUkFDRSgiYnl0ZXMgJWQsIGkgJWQsIGF2YWlsYWJsZV9ieXRlcyAlZFxuIiwgYnl0ZXMsIGksIGF2YWlsKTsKKworCQlwdXNoX3BhZ2UgPSAoaSA9PSBwYWdlLT5pbmRleCkgPyBwYWdlIDoKKwkJCWdyYWJfY2FjaGVfcGFnZV9ub3dhaXQocGFnZS0+bWFwcGluZywgaSk7CisKKwkJaWYgKCFwdXNoX3BhZ2UpCisJCQljb250aW51ZTsKKworCQlpZiAoUGFnZVVwdG9kYXRlKHB1c2hfcGFnZSkpCisJCQlnb3RvIHNraXBfcGFnZTsKKworCQlwYWdlYWRkciA9IGttYXBfYXRvbWljKHB1c2hfcGFnZSwgS01fVVNFUjApOworCQlzcXVhc2hmc19jb3B5X2RhdGEocGFnZWFkZHIsIGJ1ZmZlciwgb2Zmc2V0LCBhdmFpbCk7CisJCW1lbXNldChwYWdlYWRkciArIGF2YWlsLCAwLCBQQUdFX0NBQ0hFX1NJWkUgLSBhdmFpbCk7CisJCWt1bm1hcF9hdG9taWMocGFnZWFkZHIsIEtNX1VTRVIwKTsKKwkJZmx1c2hfZGNhY2hlX3BhZ2UocHVzaF9wYWdlKTsKKwkJU2V0UGFnZVVwdG9kYXRlKHB1c2hfcGFnZSk7Citza2lwX3BhZ2U6CisJCXVubG9ja19wYWdlKHB1c2hfcGFnZSk7CisJCWlmIChpICE9IHBhZ2UtPmluZGV4KQorCQkJcGFnZV9jYWNoZV9yZWxlYXNlKHB1c2hfcGFnZSk7CisJfQorCisJaWYgKCFzcGFyc2UpCisJCXNxdWFzaGZzX2NhY2hlX3B1dChidWZmZXIpOworCisJcmV0dXJuIDA7CisKK2Vycm9yX291dDoKKwlTZXRQYWdlRXJyb3IocGFnZSk7CitvdXQ6CisJcGFnZWFkZHIgPSBrbWFwX2F0b21pYyhwYWdlLCBLTV9VU0VSMCk7CisJbWVtc2V0KHBhZ2VhZGRyLCAwLCBQQUdFX0NBQ0hFX1NJWkUpOworCWt1bm1hcF9hdG9taWMocGFnZWFkZHIsIEtNX1VTRVIwKTsKKwlmbHVzaF9kY2FjaGVfcGFnZShwYWdlKTsKKwlpZiAoIVBhZ2VFcnJvcihwYWdlKSkKKwkJU2V0UGFnZVVwdG9kYXRlKHBhZ2UpOworCXVubG9ja19wYWdlKHBhZ2UpOworCisJcmV0dXJuIDA7Cit9CisKKworY29uc3Qgc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyBzcXVhc2hmc19hb3BzID0geworCS5yZWFkcGFnZSA9IHNxdWFzaGZzX3JlYWRwYWdlCit9OwpkaWZmIC0tZ2l0IGEvZnMvc3F1YXNoZnMvZnJhZ21lbnQuYyBiL2ZzL3NxdWFzaGZzL2ZyYWdtZW50LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjVhMmMxNQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3NxdWFzaGZzL2ZyYWdtZW50LmMKQEAgLTAsMCArMSw5OCBAQAorLyoKKyAqIFNxdWFzaGZzIC0gYSBjb21wcmVzc2VkIHJlYWQgb25seSBmaWxlc3lzdGVtIGZvciBMaW51eAorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOAorICogUGhpbGxpcCBMb3VnaGVyIDxwaGlsbGlwQGxvdWdoZXIuZGVtb24uY28udWs+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLAorICogb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKgorICogZnJhZ21lbnQuYworICovCisKKy8qCisgKiBUaGlzIGZpbGUgaW1wbGVtZW50cyBjb2RlIHRvIGhhbmRsZSBjb21wcmVzc2VkIGZyYWdtZW50cyAodGFpbC1lbmQgcGFja2VkCisgKiBkYXRhYmxvY2tzKS4KKyAqCisgKiBSZWd1bGFyIGZpbGVzIGNvbnRhaW4gYSBmcmFnbWVudCBpbmRleCB3aGljaCBpcyBtYXBwZWQgdG8gYSBmcmFnbWVudAorICogbG9jYXRpb24gb24gZGlzayBhbmQgY29tcHJlc3NlZCBzaXplIHVzaW5nIGEgZnJhZ21lbnQgbG9va3VwIHRhYmxlLgorICogTGlrZSBldmVyeXRoaW5nIGluIFNxdWFzaGZzIHRoaXMgZnJhZ21lbnQgbG9va3VwIHRhYmxlIGlzIGl0c2VsZiBzdG9yZWQKKyAqIGNvbXByZXNzZWQgaW50byBtZXRhZGF0YSBibG9ja3MuICBBIHNlY29uZCBpbmRleCB0YWJsZSBpcyB1c2VkIHRvIGxvY2F0ZQorICogdGhlc2UuICBUaGlzIHNlY29uZCBpbmRleCB0YWJsZSBmb3Igc3BlZWQgb2YgYWNjZXNzIChhbmQgYmVjYXVzZSBpdAorICogaXMgc21hbGwpIGlzIHJlYWQgYXQgbW91bnQgdGltZSBhbmQgY2FjaGVkIGluIG1lbW9yeS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC92ZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvemxpYi5oPgorCisjaW5jbHVkZSAic3F1YXNoZnNfZnMuaCIKKyNpbmNsdWRlICJzcXVhc2hmc19mc19zYi5oIgorI2luY2x1ZGUgInNxdWFzaGZzX2ZzX2kuaCIKKyNpbmNsdWRlICJzcXVhc2hmcy5oIgorCisvKgorICogTG9vay11cCBmcmFnbWVudCB1c2luZyB0aGUgZnJhZ21lbnQgaW5kZXggdGFibGUuICBSZXR1cm4gdGhlIG9uIGRpc2sKKyAqIGxvY2F0aW9uIG9mIHRoZSBmcmFnbWVudCBhbmQgaXRzIGNvbXByZXNzZWQgc2l6ZQorICovCitpbnQgc3F1YXNoZnNfZnJhZ19sb29rdXAoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdW5zaWduZWQgaW50IGZyYWdtZW50LAorCQkJCXU2NCAqZnJhZ21lbnRfYmxvY2spCit7CisJc3RydWN0IHNxdWFzaGZzX3NiX2luZm8gKm1zYmxrID0gc2ItPnNfZnNfaW5mbzsKKwlpbnQgYmxvY2sgPSBTUVVBU0hGU19GUkFHTUVOVF9JTkRFWChmcmFnbWVudCk7CisJaW50IG9mZnNldCA9IFNRVUFTSEZTX0ZSQUdNRU5UX0lOREVYX09GRlNFVChmcmFnbWVudCk7CisJdTY0IHN0YXJ0X2Jsb2NrID0gbGU2NF90b19jcHUobXNibGstPmZyYWdtZW50X2luZGV4W2Jsb2NrXSk7CisJc3RydWN0IHNxdWFzaGZzX2ZyYWdtZW50X2VudHJ5IGZyYWdtZW50X2VudHJ5OworCWludCBzaXplOworCisJc2l6ZSA9IHNxdWFzaGZzX3JlYWRfbWV0YWRhdGEoc2IsICZmcmFnbWVudF9lbnRyeSwgJnN0YXJ0X2Jsb2NrLAorCQkJCQkmb2Zmc2V0LCBzaXplb2YoZnJhZ21lbnRfZW50cnkpKTsKKwlpZiAoc2l6ZSA8IDApCisJCXJldHVybiBzaXplOworCisJKmZyYWdtZW50X2Jsb2NrID0gbGU2NF90b19jcHUoZnJhZ21lbnRfZW50cnkuc3RhcnRfYmxvY2spOworCXNpemUgPSBsZTMyX3RvX2NwdShmcmFnbWVudF9lbnRyeS5zaXplKTsKKworCXJldHVybiBzaXplOworfQorCisKKy8qCisgKiBSZWFkIHRoZSB1bmNvbXByZXNzZWQgZnJhZ21lbnQgbG9va3VwIHRhYmxlIGluZGV4ZXMgb2ZmIGRpc2sgaW50byBtZW1vcnkKKyAqLworX19sZTY0ICpzcXVhc2hmc19yZWFkX2ZyYWdtZW50X2luZGV4X3RhYmxlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCisJdTY0IGZyYWdtZW50X3RhYmxlX3N0YXJ0LCB1bnNpZ25lZCBpbnQgZnJhZ21lbnRzKQoreworCXVuc2lnbmVkIGludCBsZW5ndGggPSBTUVVBU0hGU19GUkFHTUVOVF9JTkRFWF9CWVRFUyhmcmFnbWVudHMpOworCV9fbGU2NCAqZnJhZ21lbnRfaW5kZXg7CisJaW50IGVycjsKKworCS8qIEFsbG9jYXRlIGZyYWdtZW50IGxvb2t1cCB0YWJsZSBpbmRleGVzICovCisJZnJhZ21lbnRfaW5kZXggPSBrbWFsbG9jKGxlbmd0aCwgR0ZQX0tFUk5FTCk7CisJaWYgKGZyYWdtZW50X2luZGV4ID09IE5VTEwpIHsKKwkJRVJST1IoIkZhaWxlZCB0byBhbGxvY2F0ZSBmcmFnbWVudCBpbmRleCB0YWJsZVxuIik7CisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCX0KKworCWVyciA9IHNxdWFzaGZzX3JlYWRfdGFibGUoc2IsIGZyYWdtZW50X2luZGV4LCBmcmFnbWVudF90YWJsZV9zdGFydCwKKwkJCWxlbmd0aCk7CisJaWYgKGVyciA8IDApIHsKKwkJRVJST1IoInVuYWJsZSB0byByZWFkIGZyYWdtZW50IGluZGV4IHRhYmxlXG4iKTsKKwkJa2ZyZWUoZnJhZ21lbnRfaW5kZXgpOworCQlyZXR1cm4gRVJSX1BUUihlcnIpOworCX0KKworCXJldHVybiBmcmFnbWVudF9pbmRleDsKK30KZGlmZiAtLWdpdCBhL2ZzL3NxdWFzaGZzL2lkLmMgYi9mcy9zcXVhc2hmcy9pZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3OTViODMKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9zcXVhc2hmcy9pZC5jCkBAIC0wLDAgKzEsOTQgQEAKKy8qCisgKiBTcXVhc2hmcyAtIGEgY29tcHJlc3NlZCByZWFkIG9ubHkgZmlsZXN5c3RlbSBmb3IgTGludXgKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgKKyAqIFBoaWxsaXAgTG91Z2hlciA8cGhpbGxpcEBsb3VnaGVyLmRlbW9uLmNvLnVrPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwKKyAqIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICoKKyAqIGlkLmMKKyAqLworCisvKgorICogVGhpcyBmaWxlIGltcGxlbWVudHMgY29kZSB0byBoYW5kbGUgdWlkcyBhbmQgZ2lkcy4KKyAqCisgKiBGb3Igc3BhY2UgZWZmaWNpZW5jeSByZWd1bGFyIGZpbGVzIHN0b3JlIHVpZCBhbmQgZ2lkIGluZGV4ZXMsIHdoaWNoIGFyZQorICogY29udmVydGVkIHRvIDMyLWJpdCB1aWRzL2dpZHMgdXNpbmcgYW4gaWQgbG9vayB1cCB0YWJsZS4gIFRoaXMgdGFibGUgaXMKKyAqIHN0b3JlZCBjb21wcmVzc2VkIGludG8gbWV0YWRhdGEgYmxvY2tzLiAgQSBzZWNvbmQgaW5kZXggdGFibGUgaXMgdXNlZCB0bworICogbG9jYXRlIHRoZXNlLiAgVGhpcyBzZWNvbmQgaW5kZXggdGFibGUgZm9yIHNwZWVkIG9mIGFjY2VzcyAoYW5kIGJlY2F1c2UgaXQKKyAqIGlzIHNtYWxsKSBpcyByZWFkIGF0IG1vdW50IHRpbWUgYW5kIGNhY2hlZCBpbiBtZW1vcnkuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvdmZzLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3psaWIuaD4KKworI2luY2x1ZGUgInNxdWFzaGZzX2ZzLmgiCisjaW5jbHVkZSAic3F1YXNoZnNfZnNfc2IuaCIKKyNpbmNsdWRlICJzcXVhc2hmc19mc19pLmgiCisjaW5jbHVkZSAic3F1YXNoZnMuaCIKKworLyoKKyAqIE1hcCB1aWQvZ2lkIGluZGV4IGludG8gcmVhbCAzMi1iaXQgdWlkL2dpZCB1c2luZyB0aGUgaWQgbG9vayB1cCB0YWJsZQorICovCitpbnQgc3F1YXNoZnNfZ2V0X2lkKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHVuc2lnbmVkIGludCBpbmRleCwKKwkJCQkJdW5zaWduZWQgaW50ICppZCkKK3sKKwlzdHJ1Y3Qgc3F1YXNoZnNfc2JfaW5mbyAqbXNibGsgPSBzYi0+c19mc19pbmZvOworCWludCBibG9jayA9IFNRVUFTSEZTX0lEX0JMT0NLKGluZGV4KTsKKwlpbnQgb2Zmc2V0ID0gU1FVQVNIRlNfSURfQkxPQ0tfT0ZGU0VUKGluZGV4KTsKKwl1NjQgc3RhcnRfYmxvY2sgPSBsZTY0X3RvX2NwdShtc2Jsay0+aWRfdGFibGVbYmxvY2tdKTsKKwlfX2xlMzIgZGlza19pZDsKKwlpbnQgZXJyOworCisJZXJyID0gc3F1YXNoZnNfcmVhZF9tZXRhZGF0YShzYiwgJmRpc2tfaWQsICZzdGFydF9ibG9jaywgJm9mZnNldCwKKwkJCQkJCQlzaXplb2YoZGlza19pZCkpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJKmlkID0gbGUzMl90b19jcHUoZGlza19pZCk7CisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqIFJlYWQgdW5jb21wcmVzc2VkIGlkIGxvb2t1cCB0YWJsZSBpbmRleGVzIGZyb20gZGlzayBpbnRvIG1lbW9yeQorICovCitfX2xlNjQgKnNxdWFzaGZzX3JlYWRfaWRfaW5kZXhfdGFibGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwkJCXU2NCBpZF90YWJsZV9zdGFydCwgdW5zaWduZWQgc2hvcnQgbm9faWRzKQoreworCXVuc2lnbmVkIGludCBsZW5ndGggPSBTUVVBU0hGU19JRF9CTE9DS19CWVRFUyhub19pZHMpOworCV9fbGU2NCAqaWRfdGFibGU7CisJaW50IGVycjsKKworCVRSQUNFKCJJbiByZWFkX2lkX2luZGV4X3RhYmxlLCBsZW5ndGggJWRcbiIsIGxlbmd0aCk7CisKKwkvKiBBbGxvY2F0ZSBpZCBsb29rdXAgdGFibGUgaW5kZXhlcyAqLworCWlkX3RhYmxlID0ga21hbGxvYyhsZW5ndGgsIEdGUF9LRVJORUwpOworCWlmIChpZF90YWJsZSA9PSBOVUxMKSB7CisJCUVSUk9SKCJGYWlsZWQgdG8gYWxsb2NhdGUgaWQgaW5kZXggdGFibGVcbiIpOworCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwl9CisKKwllcnIgPSBzcXVhc2hmc19yZWFkX3RhYmxlKHNiLCBpZF90YWJsZSwgaWRfdGFibGVfc3RhcnQsIGxlbmd0aCk7CisJaWYgKGVyciA8IDApIHsKKwkJRVJST1IoInVuYWJsZSB0byByZWFkIGlkIGluZGV4IHRhYmxlXG4iKTsKKwkJa2ZyZWUoaWRfdGFibGUpOworCQlyZXR1cm4gRVJSX1BUUihlcnIpOworCX0KKworCXJldHVybiBpZF90YWJsZTsKK30KZGlmZiAtLWdpdCBhL2ZzL3NxdWFzaGZzL2lub2RlLmMgYi9mcy9zcXVhc2hmcy9pbm9kZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhNjMzOTgKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9zcXVhc2hmcy9pbm9kZS5jCkBAIC0wLDAgKzEsMzQ2IEBACisvKgorICogU3F1YXNoZnMgLSBhIGNvbXByZXNzZWQgcmVhZCBvbmx5IGZpbGVzeXN0ZW0gZm9yIExpbnV4CisgKgorICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4CisgKiBQaGlsbGlwIExvdWdoZXIgPHBoaWxsaXBAbG91Z2hlci5kZW1vbi5jby51az4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsCisgKiBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqCisgKiBpbm9kZS5jCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSBpbXBsZW1lbnRzIGNvZGUgdG8gY3JlYXRlIGFuZCByZWFkIGlub2RlcyBmcm9tIGRpc2suCisgKgorICogSW5vZGVzIGluIFNxdWFzaGZzIGFyZSBpZGVudGlmaWVkIGJ5IGEgNDgtYml0IGlub2RlIHdoaWNoIGVuY29kZXMgdGhlCisgKiBsb2NhdGlvbiBvZiB0aGUgY29tcHJlc3NlZCBtZXRhZGF0YSBibG9jayBjb250YWluaW5nIHRoZSBpbm9kZSwgYW5kIHRoZSBieXRlCisgKiBvZmZzZXQgaW50byB0aGF0IGJsb2NrIHdoZXJlIHRoZSBpbm9kZSBpcyBwbGFjZWQgKDxibG9jaywgb2Zmc2V0PikuCisgKgorICogVG8gbWF4aW1pc2UgY29tcHJlc3Npb24gdGhlcmUgYXJlIGRpZmZlcmVudCBpbm9kZXMgZm9yIGVhY2ggZmlsZSB0eXBlCisgKiAocmVndWxhciBmaWxlLCBkaXJlY3RvcnksIGRldmljZSwgZXRjLiksIHRoZSBpbm9kZSBjb250ZW50cyBhbmQgbGVuZ3RoCisgKiB2YXJ5aW5nIHdpdGggdGhlIHR5cGUuCisgKgorICogVG8gZnVydGhlciBtYXhpbWlzZSBjb21wcmVzc2lvbiwgdHdvIHR5cGVzIG9mIHJlZ3VsYXIgZmlsZSBpbm9kZSBhbmQKKyAqIGRpcmVjdG9yeSBpbm9kZSBhcmUgZGVmaW5lZDogaW5vZGVzIG9wdGltaXNlZCBmb3IgZnJlcXVlbnRseSBvY2N1cnJpbmcKKyAqIHJlZ3VsYXIgZmlsZXMgYW5kIGRpcmVjdG9yaWVzLCBhbmQgZXh0ZW5kZWQgdHlwZXMgd2hlcmUgZXh0cmEKKyAqIGluZm9ybWF0aW9uIGhhcyB0byBiZSBzdG9yZWQuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvdmZzLmg+CisjaW5jbHVkZSA8bGludXgvemxpYi5oPgorCisjaW5jbHVkZSAic3F1YXNoZnNfZnMuaCIKKyNpbmNsdWRlICJzcXVhc2hmc19mc19zYi5oIgorI2luY2x1ZGUgInNxdWFzaGZzX2ZzX2kuaCIKKyNpbmNsdWRlICJzcXVhc2hmcy5oIgorCisvKgorICogSW5pdGlhbGlzZSBWRlMgaW5vZGUgd2l0aCB0aGUgYmFzZSBpbm9kZSBpbmZvcm1hdGlvbiBjb21tb24gdG8gYWxsCisgKiBTcXVhc2hmcyBpbm9kZSB0eXBlcy4gIFNxc2hfaW5vIGNvbnRhaW5zIHRoZSB1bnN3YXBwZWQgYmFzZSBpbm9kZQorICogb2ZmIGRpc2suCisgKi8KK3N0YXRpYyBpbnQgc3F1YXNoZnNfbmV3X2lub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJc3RydWN0IHNxdWFzaGZzX2Jhc2VfaW5vZGUgKnNxc2hfaW5vKQoreworCWludCBlcnI7CisKKwllcnIgPSBzcXVhc2hmc19nZXRfaWQoc2IsIGxlMTZfdG9fY3B1KHNxc2hfaW5vLT51aWQpLCAmaW5vZGUtPmlfdWlkKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJZXJyID0gc3F1YXNoZnNfZ2V0X2lkKHNiLCBsZTE2X3RvX2NwdShzcXNoX2luby0+Z3VpZCksICZpbm9kZS0+aV9naWQpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlpbm9kZS0+aV9pbm8gPSBsZTMyX3RvX2NwdShzcXNoX2luby0+aW5vZGVfbnVtYmVyKTsKKwlpbm9kZS0+aV9tdGltZS50dl9zZWMgPSBsZTMyX3RvX2NwdShzcXNoX2luby0+bXRpbWUpOworCWlub2RlLT5pX2F0aW1lLnR2X3NlYyA9IGlub2RlLT5pX210aW1lLnR2X3NlYzsKKwlpbm9kZS0+aV9jdGltZS50dl9zZWMgPSBpbm9kZS0+aV9tdGltZS50dl9zZWM7CisJaW5vZGUtPmlfbW9kZSA9IGxlMTZfdG9fY3B1KHNxc2hfaW5vLT5tb2RlKTsKKwlpbm9kZS0+aV9zaXplID0gMDsKKworCXJldHVybiBlcnI7Cit9CisKKworc3RydWN0IGlub2RlICpzcXVhc2hmc19pZ2V0KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGxvbmcgbG9uZyBpbm8sCisJCQkJdW5zaWduZWQgaW50IGlub19udW1iZXIpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGlnZXRfbG9ja2VkKHNiLCBpbm9fbnVtYmVyKTsKKwlpbnQgZXJyOworCisJVFJBQ0UoIkVudGVyZWQgc3F1YXNoZnNfaWdldFxuIik7CisKKwlpZiAoIWlub2RlKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwlpZiAoIShpbm9kZS0+aV9zdGF0ZSAmIElfTkVXKSkKKwkJcmV0dXJuIGlub2RlOworCisJZXJyID0gc3F1YXNoZnNfcmVhZF9pbm9kZShpbm9kZSwgaW5vKTsKKwlpZiAoZXJyKSB7CisJCWlnZXRfZmFpbGVkKGlub2RlKTsKKwkJcmV0dXJuIEVSUl9QVFIoZXJyKTsKKwl9CisKKwl1bmxvY2tfbmV3X2lub2RlKGlub2RlKTsKKwlyZXR1cm4gaW5vZGU7Cit9CisKKworLyoKKyAqIEluaXRpYWxpc2UgVkZTIGlub2RlIGJ5IHJlYWRpbmcgaW5vZGUgZnJvbSBpbm9kZSB0YWJsZSAoY29tcHJlc3NlZAorICogbWV0YWRhdGEpLiAgVGhlIGZvcm1hdCBhbmQgYW1vdW50IG9mIGRhdGEgcmVhZCBkZXBlbmRzIG9uIHR5cGUuCisgKi8KK2ludCBzcXVhc2hmc19yZWFkX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGxvbmcgbG9uZyBpbm8pCit7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlub2RlLT5pX3NiOworCXN0cnVjdCBzcXVhc2hmc19zYl9pbmZvICptc2JsayA9IHNiLT5zX2ZzX2luZm87CisJdTY0IGJsb2NrID0gU1FVQVNIRlNfSU5PREVfQkxLKGlubykgKyBtc2Jsay0+aW5vZGVfdGFibGU7CisJaW50IGVyciwgdHlwZSwgb2Zmc2V0ID0gU1FVQVNIRlNfSU5PREVfT0ZGU0VUKGlubyk7CisJdW5pb24gc3F1YXNoZnNfaW5vZGUgc3F1YXNoZnNfaW5vOworCXN0cnVjdCBzcXVhc2hmc19iYXNlX2lub2RlICpzcXNoYl9pbm8gPSAmc3F1YXNoZnNfaW5vLmJhc2U7CisKKwlUUkFDRSgiRW50ZXJlZCBzcXVhc2hmc19yZWFkX2lub2RlXG4iKTsKKworCS8qCisJICogUmVhZCBpbm9kZSBiYXNlIGNvbW1vbiB0byBhbGwgaW5vZGUgdHlwZXMuCisJICovCisJZXJyID0gc3F1YXNoZnNfcmVhZF9tZXRhZGF0YShzYiwgc3FzaGJfaW5vLCAmYmxvY2ssCisJCQkJJm9mZnNldCwgc2l6ZW9mKCpzcXNoYl9pbm8pKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBmYWlsZWRfcmVhZDsKKworCWVyciA9IHNxdWFzaGZzX25ld19pbm9kZShzYiwgaW5vZGUsIHNxc2hiX2lubyk7CisJaWYgKGVycikKKwkJZ290byBmYWlsZWRfcmVhZDsKKworCWJsb2NrID0gU1FVQVNIRlNfSU5PREVfQkxLKGlubykgKyBtc2Jsay0+aW5vZGVfdGFibGU7CisJb2Zmc2V0ID0gU1FVQVNIRlNfSU5PREVfT0ZGU0VUKGlubyk7CisKKwl0eXBlID0gbGUxNl90b19jcHUoc3FzaGJfaW5vLT5pbm9kZV90eXBlKTsKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIFNRVUFTSEZTX1JFR19UWVBFOiB7CisJCXVuc2lnbmVkIGludCBmcmFnX29mZnNldCwgZnJhZ19zaXplLCBmcmFnOworCQl1NjQgZnJhZ19ibGs7CisJCXN0cnVjdCBzcXVhc2hmc19yZWdfaW5vZGUgKnNxc2hfaW5vID0gJnNxdWFzaGZzX2luby5yZWc7CisKKwkJZXJyID0gc3F1YXNoZnNfcmVhZF9tZXRhZGF0YShzYiwgc3FzaF9pbm8sICZibG9jaywgJm9mZnNldCwKKwkJCQkJCQlzaXplb2YoKnNxc2hfaW5vKSk7CisJCWlmIChlcnIgPCAwKQorCQkJZ290byBmYWlsZWRfcmVhZDsKKworCQlmcmFnID0gbGUzMl90b19jcHUoc3FzaF9pbm8tPmZyYWdtZW50KTsKKwkJaWYgKGZyYWcgIT0gU1FVQVNIRlNfSU5WQUxJRF9GUkFHKSB7CisJCQlmcmFnX29mZnNldCA9IGxlMzJfdG9fY3B1KHNxc2hfaW5vLT5vZmZzZXQpOworCQkJZnJhZ19zaXplID0gc3F1YXNoZnNfZnJhZ19sb29rdXAoc2IsIGZyYWcsICZmcmFnX2Jsayk7CisJCQlpZiAoZnJhZ19zaXplIDwgMCkgeworCQkJCWVyciA9IGZyYWdfc2l6ZTsKKwkJCQlnb3RvIGZhaWxlZF9yZWFkOworCQkJfQorCQl9IGVsc2UgeworCQkJZnJhZ19ibGsgPSBTUVVBU0hGU19JTlZBTElEX0JMSzsKKwkJCWZyYWdfc2l6ZSA9IDA7CisJCQlmcmFnX29mZnNldCA9IDA7CisJCX0KKworCQlpbm9kZS0+aV9ubGluayA9IDE7CisJCWlub2RlLT5pX3NpemUgPSBsZTMyX3RvX2NwdShzcXNoX2luby0+ZmlsZV9zaXplKTsKKwkJaW5vZGUtPmlfZm9wID0gJmdlbmVyaWNfcm9fZm9wczsKKwkJaW5vZGUtPmlfbW9kZSB8PSBTX0lGUkVHOworCQlpbm9kZS0+aV9ibG9ja3MgPSAoKGlub2RlLT5pX3NpemUgLSAxKSA+PiA5KSArIDE7CisJCXNxdWFzaGZzX2koaW5vZGUpLT5mcmFnbWVudF9ibG9jayA9IGZyYWdfYmxrOworCQlzcXVhc2hmc19pKGlub2RlKS0+ZnJhZ21lbnRfc2l6ZSA9IGZyYWdfc2l6ZTsKKwkJc3F1YXNoZnNfaShpbm9kZSktPmZyYWdtZW50X29mZnNldCA9IGZyYWdfb2Zmc2V0OworCQlzcXVhc2hmc19pKGlub2RlKS0+c3RhcnQgPSBsZTMyX3RvX2NwdShzcXNoX2luby0+c3RhcnRfYmxvY2spOworCQlzcXVhc2hmc19pKGlub2RlKS0+YmxvY2tfbGlzdF9zdGFydCA9IGJsb2NrOworCQlzcXVhc2hmc19pKGlub2RlKS0+b2Zmc2V0ID0gb2Zmc2V0OworCQlpbm9kZS0+aV9kYXRhLmFfb3BzID0gJnNxdWFzaGZzX2FvcHM7CisKKwkJVFJBQ0UoIkZpbGUgaW5vZGUgJXg6JXgsIHN0YXJ0X2Jsb2NrICVsbHgsIGJsb2NrX2xpc3Rfc3RhcnQgIgorCQkJIiVsbHgsIG9mZnNldCAleFxuIiwgU1FVQVNIRlNfSU5PREVfQkxLKGlubyksCisJCQlvZmZzZXQsIHNxdWFzaGZzX2koaW5vZGUpLT5zdGFydCwgYmxvY2ssIG9mZnNldCk7CisJCWJyZWFrOworCX0KKwljYXNlIFNRVUFTSEZTX0xSRUdfVFlQRTogeworCQl1bnNpZ25lZCBpbnQgZnJhZ19vZmZzZXQsIGZyYWdfc2l6ZSwgZnJhZzsKKwkJdTY0IGZyYWdfYmxrOworCQlzdHJ1Y3Qgc3F1YXNoZnNfbHJlZ19pbm9kZSAqc3FzaF9pbm8gPSAmc3F1YXNoZnNfaW5vLmxyZWc7CisKKwkJZXJyID0gc3F1YXNoZnNfcmVhZF9tZXRhZGF0YShzYiwgc3FzaF9pbm8sICZibG9jaywgJm9mZnNldCwKKwkJCQkJCQlzaXplb2YoKnNxc2hfaW5vKSk7CisJCWlmIChlcnIgPCAwKQorCQkJZ290byBmYWlsZWRfcmVhZDsKKworCQlmcmFnID0gbGUzMl90b19jcHUoc3FzaF9pbm8tPmZyYWdtZW50KTsKKwkJaWYgKGZyYWcgIT0gU1FVQVNIRlNfSU5WQUxJRF9GUkFHKSB7CisJCQlmcmFnX29mZnNldCA9IGxlMzJfdG9fY3B1KHNxc2hfaW5vLT5vZmZzZXQpOworCQkJZnJhZ19zaXplID0gc3F1YXNoZnNfZnJhZ19sb29rdXAoc2IsIGZyYWcsICZmcmFnX2Jsayk7CisJCQlpZiAoZnJhZ19zaXplIDwgMCkgeworCQkJCWVyciA9IGZyYWdfc2l6ZTsKKwkJCQlnb3RvIGZhaWxlZF9yZWFkOworCQkJfQorCQl9IGVsc2UgeworCQkJZnJhZ19ibGsgPSBTUVVBU0hGU19JTlZBTElEX0JMSzsKKwkJCWZyYWdfc2l6ZSA9IDA7CisJCQlmcmFnX29mZnNldCA9IDA7CisJCX0KKworCQlpbm9kZS0+aV9ubGluayA9IGxlMzJfdG9fY3B1KHNxc2hfaW5vLT5ubGluayk7CisJCWlub2RlLT5pX3NpemUgPSBsZTY0X3RvX2NwdShzcXNoX2luby0+ZmlsZV9zaXplKTsKKwkJaW5vZGUtPmlfZm9wID0gJmdlbmVyaWNfcm9fZm9wczsKKwkJaW5vZGUtPmlfbW9kZSB8PSBTX0lGUkVHOworCQlpbm9kZS0+aV9ibG9ja3MgPSAoKGlub2RlLT5pX3NpemUgLQorCQkJCWxlNjRfdG9fY3B1KHNxc2hfaW5vLT5zcGFyc2UpIC0gMSkgPj4gOSkgKyAxOworCisJCXNxdWFzaGZzX2koaW5vZGUpLT5mcmFnbWVudF9ibG9jayA9IGZyYWdfYmxrOworCQlzcXVhc2hmc19pKGlub2RlKS0+ZnJhZ21lbnRfc2l6ZSA9IGZyYWdfc2l6ZTsKKwkJc3F1YXNoZnNfaShpbm9kZSktPmZyYWdtZW50X29mZnNldCA9IGZyYWdfb2Zmc2V0OworCQlzcXVhc2hmc19pKGlub2RlKS0+c3RhcnQgPSBsZTY0X3RvX2NwdShzcXNoX2luby0+c3RhcnRfYmxvY2spOworCQlzcXVhc2hmc19pKGlub2RlKS0+YmxvY2tfbGlzdF9zdGFydCA9IGJsb2NrOworCQlzcXVhc2hmc19pKGlub2RlKS0+b2Zmc2V0ID0gb2Zmc2V0OworCQlpbm9kZS0+aV9kYXRhLmFfb3BzID0gJnNxdWFzaGZzX2FvcHM7CisKKwkJVFJBQ0UoIkZpbGUgaW5vZGUgJXg6JXgsIHN0YXJ0X2Jsb2NrICVsbHgsIGJsb2NrX2xpc3Rfc3RhcnQgIgorCQkJIiVsbHgsIG9mZnNldCAleFxuIiwgU1FVQVNIRlNfSU5PREVfQkxLKGlubyksCisJCQlvZmZzZXQsIHNxdWFzaGZzX2koaW5vZGUpLT5zdGFydCwgYmxvY2ssIG9mZnNldCk7CisJCWJyZWFrOworCX0KKwljYXNlIFNRVUFTSEZTX0RJUl9UWVBFOiB7CisJCXN0cnVjdCBzcXVhc2hmc19kaXJfaW5vZGUgKnNxc2hfaW5vID0gJnNxdWFzaGZzX2luby5kaXI7CisKKwkJZXJyID0gc3F1YXNoZnNfcmVhZF9tZXRhZGF0YShzYiwgc3FzaF9pbm8sICZibG9jaywgJm9mZnNldCwKKwkJCQlzaXplb2YoKnNxc2hfaW5vKSk7CisJCWlmIChlcnIgPCAwKQorCQkJZ290byBmYWlsZWRfcmVhZDsKKworCQlpbm9kZS0+aV9ubGluayA9IGxlMzJfdG9fY3B1KHNxc2hfaW5vLT5ubGluayk7CisJCWlub2RlLT5pX3NpemUgPSBsZTE2X3RvX2NwdShzcXNoX2luby0+ZmlsZV9zaXplKTsKKwkJaW5vZGUtPmlfb3AgPSAmc3F1YXNoZnNfZGlyX2lub2RlX29wczsKKwkJaW5vZGUtPmlfZm9wID0gJnNxdWFzaGZzX2Rpcl9vcHM7CisJCWlub2RlLT5pX21vZGUgfD0gU19JRkRJUjsKKwkJc3F1YXNoZnNfaShpbm9kZSktPnN0YXJ0ID0gbGUzMl90b19jcHUoc3FzaF9pbm8tPnN0YXJ0X2Jsb2NrKTsKKwkJc3F1YXNoZnNfaShpbm9kZSktPm9mZnNldCA9IGxlMTZfdG9fY3B1KHNxc2hfaW5vLT5vZmZzZXQpOworCQlzcXVhc2hmc19pKGlub2RlKS0+ZGlyX2lkeF9jbnQgPSAwOworCQlzcXVhc2hmc19pKGlub2RlKS0+cGFyZW50ID0gbGUzMl90b19jcHUoc3FzaF9pbm8tPnBhcmVudF9pbm9kZSk7CisKKwkJVFJBQ0UoIkRpcmVjdG9yeSBpbm9kZSAleDoleCwgc3RhcnRfYmxvY2sgJWxseCwgb2Zmc2V0ICV4XG4iLAorCQkJCVNRVUFTSEZTX0lOT0RFX0JMSyhpbm8pLCBvZmZzZXQsCisJCQkJc3F1YXNoZnNfaShpbm9kZSktPnN0YXJ0LAorCQkJCWxlMTZfdG9fY3B1KHNxc2hfaW5vLT5vZmZzZXQpKTsKKwkJYnJlYWs7CisJfQorCWNhc2UgU1FVQVNIRlNfTERJUl9UWVBFOiB7CisJCXN0cnVjdCBzcXVhc2hmc19sZGlyX2lub2RlICpzcXNoX2lubyA9ICZzcXVhc2hmc19pbm8ubGRpcjsKKworCQllcnIgPSBzcXVhc2hmc19yZWFkX21ldGFkYXRhKHNiLCBzcXNoX2lubywgJmJsb2NrLCAmb2Zmc2V0LAorCQkJCXNpemVvZigqc3FzaF9pbm8pKTsKKwkJaWYgKGVyciA8IDApCisJCQlnb3RvIGZhaWxlZF9yZWFkOworCisJCWlub2RlLT5pX25saW5rID0gbGUzMl90b19jcHUoc3FzaF9pbm8tPm5saW5rKTsKKwkJaW5vZGUtPmlfc2l6ZSA9IGxlMzJfdG9fY3B1KHNxc2hfaW5vLT5maWxlX3NpemUpOworCQlpbm9kZS0+aV9vcCA9ICZzcXVhc2hmc19kaXJfaW5vZGVfb3BzOworCQlpbm9kZS0+aV9mb3AgPSAmc3F1YXNoZnNfZGlyX29wczsKKwkJaW5vZGUtPmlfbW9kZSB8PSBTX0lGRElSOworCQlzcXVhc2hmc19pKGlub2RlKS0+c3RhcnQgPSBsZTMyX3RvX2NwdShzcXNoX2luby0+c3RhcnRfYmxvY2spOworCQlzcXVhc2hmc19pKGlub2RlKS0+b2Zmc2V0ID0gbGUxNl90b19jcHUoc3FzaF9pbm8tPm9mZnNldCk7CisJCXNxdWFzaGZzX2koaW5vZGUpLT5kaXJfaWR4X3N0YXJ0ID0gYmxvY2s7CisJCXNxdWFzaGZzX2koaW5vZGUpLT5kaXJfaWR4X29mZnNldCA9IG9mZnNldDsKKwkJc3F1YXNoZnNfaShpbm9kZSktPmRpcl9pZHhfY250ID0gbGUxNl90b19jcHUoc3FzaF9pbm8tPmlfY291bnQpOworCQlzcXVhc2hmc19pKGlub2RlKS0+cGFyZW50ID0gbGUzMl90b19jcHUoc3FzaF9pbm8tPnBhcmVudF9pbm9kZSk7CisKKwkJVFJBQ0UoIkxvbmcgZGlyZWN0b3J5IGlub2RlICV4OiV4LCBzdGFydF9ibG9jayAlbGx4LCBvZmZzZXQgIgorCQkJCSIleFxuIiwgU1FVQVNIRlNfSU5PREVfQkxLKGlubyksIG9mZnNldCwKKwkJCQlzcXVhc2hmc19pKGlub2RlKS0+c3RhcnQsCisJCQkJbGUxNl90b19jcHUoc3FzaF9pbm8tPm9mZnNldCkpOworCQlicmVhazsKKwl9CisJY2FzZSBTUVVBU0hGU19TWU1MSU5LX1RZUEU6CisJY2FzZSBTUVVBU0hGU19MU1lNTElOS19UWVBFOiB7CisJCXN0cnVjdCBzcXVhc2hmc19zeW1saW5rX2lub2RlICpzcXNoX2lubyA9ICZzcXVhc2hmc19pbm8uc3ltbGluazsKKworCQllcnIgPSBzcXVhc2hmc19yZWFkX21ldGFkYXRhKHNiLCBzcXNoX2lubywgJmJsb2NrLCAmb2Zmc2V0LAorCQkJCXNpemVvZigqc3FzaF9pbm8pKTsKKwkJaWYgKGVyciA8IDApCisJCQlnb3RvIGZhaWxlZF9yZWFkOworCisJCWlub2RlLT5pX25saW5rID0gbGUzMl90b19jcHUoc3FzaF9pbm8tPm5saW5rKTsKKwkJaW5vZGUtPmlfc2l6ZSA9IGxlMzJfdG9fY3B1KHNxc2hfaW5vLT5zeW1saW5rX3NpemUpOworCQlpbm9kZS0+aV9vcCA9ICZwYWdlX3N5bWxpbmtfaW5vZGVfb3BlcmF0aW9uczsKKwkJaW5vZGUtPmlfZGF0YS5hX29wcyA9ICZzcXVhc2hmc19zeW1saW5rX2FvcHM7CisJCWlub2RlLT5pX21vZGUgfD0gU19JRkxOSzsKKwkJc3F1YXNoZnNfaShpbm9kZSktPnN0YXJ0ID0gYmxvY2s7CisJCXNxdWFzaGZzX2koaW5vZGUpLT5vZmZzZXQgPSBvZmZzZXQ7CisKKwkJVFJBQ0UoIlN5bWJvbGljIGxpbmsgaW5vZGUgJXg6JXgsIHN0YXJ0X2Jsb2NrICVsbHgsIG9mZnNldCAiCisJCQkJIiV4XG4iLCBTUVVBU0hGU19JTk9ERV9CTEsoaW5vKSwgb2Zmc2V0LAorCQkJCWJsb2NrLCBvZmZzZXQpOworCQlicmVhazsKKwl9CisJY2FzZSBTUVVBU0hGU19CTEtERVZfVFlQRToKKwljYXNlIFNRVUFTSEZTX0NIUkRFVl9UWVBFOgorCWNhc2UgU1FVQVNIRlNfTEJMS0RFVl9UWVBFOgorCWNhc2UgU1FVQVNIRlNfTENIUkRFVl9UWVBFOiB7CisJCXN0cnVjdCBzcXVhc2hmc19kZXZfaW5vZGUgKnNxc2hfaW5vID0gJnNxdWFzaGZzX2luby5kZXY7CisJCXVuc2lnbmVkIGludCByZGV2OworCisJCWVyciA9IHNxdWFzaGZzX3JlYWRfbWV0YWRhdGEoc2IsIHNxc2hfaW5vLCAmYmxvY2ssICZvZmZzZXQsCisJCQkJc2l6ZW9mKCpzcXNoX2lubykpOworCQlpZiAoZXJyIDwgMCkKKwkJCWdvdG8gZmFpbGVkX3JlYWQ7CisKKwkJaWYgKHR5cGUgPT0gU1FVQVNIRlNfQ0hSREVWX1RZUEUpCisJCQlpbm9kZS0+aV9tb2RlIHw9IFNfSUZDSFI7CisJCWVsc2UKKwkJCWlub2RlLT5pX21vZGUgfD0gU19JRkJMSzsKKwkJaW5vZGUtPmlfbmxpbmsgPSBsZTMyX3RvX2NwdShzcXNoX2luby0+bmxpbmspOworCQlyZGV2ID0gbGUzMl90b19jcHUoc3FzaF9pbm8tPnJkZXYpOworCQlpbml0X3NwZWNpYWxfaW5vZGUoaW5vZGUsIGlub2RlLT5pX21vZGUsIG5ld19kZWNvZGVfZGV2KHJkZXYpKTsKKworCQlUUkFDRSgiRGV2aWNlIGlub2RlICV4OiV4LCByZGV2ICV4XG4iLAorCQkJCVNRVUFTSEZTX0lOT0RFX0JMSyhpbm8pLCBvZmZzZXQsIHJkZXYpOworCQlicmVhazsKKwl9CisJY2FzZSBTUVVBU0hGU19GSUZPX1RZUEU6CisJY2FzZSBTUVVBU0hGU19TT0NLRVRfVFlQRToKKwljYXNlIFNRVUFTSEZTX0xGSUZPX1RZUEU6CisJY2FzZSBTUVVBU0hGU19MU09DS0VUX1RZUEU6IHsKKwkJc3RydWN0IHNxdWFzaGZzX2lwY19pbm9kZSAqc3FzaF9pbm8gPSAmc3F1YXNoZnNfaW5vLmlwYzsKKworCQllcnIgPSBzcXVhc2hmc19yZWFkX21ldGFkYXRhKHNiLCBzcXNoX2lubywgJmJsb2NrLCAmb2Zmc2V0LAorCQkJCXNpemVvZigqc3FzaF9pbm8pKTsKKwkJaWYgKGVyciA8IDApCisJCQlnb3RvIGZhaWxlZF9yZWFkOworCisJCWlmICh0eXBlID09IFNRVUFTSEZTX0ZJRk9fVFlQRSkKKwkJCWlub2RlLT5pX21vZGUgfD0gU19JRklGTzsKKwkJZWxzZQorCQkJaW5vZGUtPmlfbW9kZSB8PSBTX0lGU09DSzsKKwkJaW5vZGUtPmlfbmxpbmsgPSBsZTMyX3RvX2NwdShzcXNoX2luby0+bmxpbmspOworCQlpbml0X3NwZWNpYWxfaW5vZGUoaW5vZGUsIGlub2RlLT5pX21vZGUsIDApOworCQlicmVhazsKKwl9CisJZGVmYXVsdDoKKwkJRVJST1IoIlVua25vd24gaW5vZGUgdHlwZSAlZCBpbiBzcXVhc2hmc19pZ2V0IVxuIiwgdHlwZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworCitmYWlsZWRfcmVhZDoKKwlFUlJPUigiVW5hYmxlIHRvIHJlYWQgaW5vZGUgMHglbGx4XG4iLCBpbm8pOworCXJldHVybiBlcnI7Cit9CmRpZmYgLS1naXQgYS9mcy9zcXVhc2hmcy9uYW1laS5jIGIvZnMvc3F1YXNoZnMvbmFtZWkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTM5ODY1Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvc3F1YXNoZnMvbmFtZWkuYwpAQCAtMCwwICsxLDI0MiBAQAorLyoKKyAqIFNxdWFzaGZzIC0gYSBjb21wcmVzc2VkIHJlYWQgb25seSBmaWxlc3lzdGVtIGZvciBMaW51eAorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOAorICogUGhpbGxpcCBMb3VnaGVyIDxwaGlsbGlwQGxvdWdoZXIuZGVtb24uY28udWs+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLAorICogb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKgorICogbmFtZWkuYworICovCisKKy8qCisgKiBUaGlzIGZpbGUgaW1wbGVtZW50cyBjb2RlIHRvIGRvIGZpbGVuYW1lIGxvb2t1cCBpbiBkaXJlY3Rvcmllcy4KKyAqCisgKiBMaWtlIGlub2RlcywgZGlyZWN0b3JpZXMgYXJlIHBhY2tlZCBpbnRvIGNvbXByZXNzZWQgbWV0YWRhdGEgYmxvY2tzLCBzdG9yZWQKKyAqIGluIGEgZGlyZWN0b3J5IHRhYmxlLiAgRGlyZWN0b3JpZXMgYXJlIGFjY2Vzc2VkIHVzaW5nIHRoZSBzdGFydCBhZGRyZXNzIG9mCisgKiB0aGUgbWV0YWJsb2NrIGNvbnRhaW5pbmcgdGhlIGRpcmVjdG9yeSBhbmQgdGhlIG9mZnNldCBpbnRvIHRoZQorICogZGVjb21wcmVzc2VkIGJsb2NrICg8YmxvY2ssIG9mZnNldD4pLgorICoKKyAqIERpcmVjdG9yaWVzIGFyZSBvcmdhbmlzZWQgaW4gYSBzbGlnaHRseSBjb21wbGV4IHdheSwgYW5kIGFyZSBub3Qgc2ltcGx5CisgKiBhIGxpc3Qgb2YgZmlsZSBuYW1lcy4gIFRoZSBvcmdhbmlzYXRpb24gdGFrZXMgYWR2YW50YWdlIG9mIHRoZQorICogZmFjdCB0aGF0IChpbiBtb3N0IGNhc2VzKSB0aGUgaW5vZGVzIG9mIHRoZSBmaWxlcyB3aWxsIGJlIGluIHRoZSBzYW1lCisgKiBjb21wcmVzc2VkIG1ldGFkYXRhIGJsb2NrLCBhbmQgdGhlcmVmb3JlLCBjYW4gc2hhcmUgdGhlIHN0YXJ0IGJsb2NrLgorICogRGlyZWN0b3JpZXMgYXJlIHRoZXJlZm9yZSBvcmdhbmlzZWQgaW4gYSB0d28gbGV2ZWwgbGlzdCwgYSBkaXJlY3RvcnkKKyAqIGhlYWRlciBjb250YWluaW5nIHRoZSBzaGFyZWQgc3RhcnQgYmxvY2sgdmFsdWUsIGFuZCBhIHNlcXVlbmNlIG9mIGRpcmVjdG9yeQorICogZW50cmllcywgZWFjaCBvZiB3aGljaCBzaGFyZSB0aGUgc2hhcmVkIHN0YXJ0IGJsb2NrLiAgQSBuZXcgZGlyZWN0b3J5IGhlYWRlcgorICogaXMgd3JpdHRlbiBvbmNlL2lmIHRoZSBpbm9kZSBzdGFydCBibG9jayBjaGFuZ2VzLiAgVGhlIGRpcmVjdG9yeQorICogaGVhZGVyL2RpcmVjdG9yeSBlbnRyeSBsaXN0IGlzIHJlcGVhdGVkIGFzIG1hbnkgdGltZXMgYXMgbmVjZXNzYXJ5LgorICoKKyAqIERpcmVjdG9yaWVzIGFyZSBzb3J0ZWQsIGFuZCBjYW4gY29udGFpbiBhIGRpcmVjdG9yeSBpbmRleCB0byBzcGVlZCB1cAorICogZmlsZSBsb29rdXAuICBEaXJlY3RvcnkgaW5kZXhlcyBzdG9yZSBvbmUgZW50cnkgcGVyIG1ldGFibG9jaywgZWFjaCBlbnRyeQorICogc3RvcmluZyB0aGUgaW5kZXgvZmlsZW5hbWUgbWFwcGluZyB0byB0aGUgZmlyc3QgZGlyZWN0b3J5IGhlYWRlcgorICogaW4gZWFjaCBtZXRhZGF0YSBibG9jay4gIERpcmVjdG9yaWVzIGFyZSBzb3J0ZWQgaW4gYWxwaGFiZXRpY2FsIG9yZGVyLAorICogYW5kIGF0IGxvb2t1cCB0aGUgaW5kZXggaXMgc2Nhbm5lZCBsaW5lYXJseSBsb29raW5nIGZvciB0aGUgZmlyc3QgZmlsZW5hbWUKKyAqIGFscGhhYmV0aWNhbGx5IGxhcmdlciB0aGFuIHRoZSBmaWxlbmFtZSBiZWluZyBsb29rZWQgdXAuICBBdCB0aGlzIHBvaW50IHRoZQorICogbG9jYXRpb24gb2YgdGhlIG1ldGFkYXRhIGJsb2NrIHRoZSBmaWxlbmFtZSBpcyBpbiBoYXMgYmVlbiBmb3VuZC4KKyAqIFRoZSBnZW5lcmFsIGlkZWEgb2YgdGhlIGluZGV4IGlzIGVuc3VyZSBvbmx5IG9uZSBtZXRhZGF0YSBibG9jayBuZWVkcyB0byBiZQorICogZGVjb21wcmVzc2VkIHRvIGRvIGEgbG9va3VwIGlycmVzcGVjdGl2ZSBvZiB0aGUgbGVuZ3RoIG9mIHRoZSBkaXJlY3RvcnkuCisgKiBUaGlzIHNjaGVtZSBoYXMgdGhlIGFkdmFudGFnZSB0aGF0IGl0IGRvZXNuJ3QgcmVxdWlyZSBleHRyYSBtZW1vcnkgb3ZlcmhlYWQKKyAqIGFuZCBkb2Vzbid0IHJlcXVpcmUgbXVjaCBleHRyYSBzdG9yYWdlIG9uIGRpc2suCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvdmZzLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2RjYWNoZS5oPgorI2luY2x1ZGUgPGxpbnV4L3psaWIuaD4KKworI2luY2x1ZGUgInNxdWFzaGZzX2ZzLmgiCisjaW5jbHVkZSAic3F1YXNoZnNfZnNfc2IuaCIKKyNpbmNsdWRlICJzcXVhc2hmc19mc19pLmgiCisjaW5jbHVkZSAic3F1YXNoZnMuaCIKKworLyoKKyAqIExvb2t1cCBuYW1lIGluIHRoZSBkaXJlY3RvcnkgaW5kZXgsIHJldHVybmluZyB0aGUgbG9jYXRpb24gb2YgdGhlIG1ldGFkYXRhCisgKiBibG9jayBjb250YWluaW5nIGl0LCBhbmQgdGhlIGRpcmVjdG9yeSBpbmRleCB0aGlzIHJlcHJlc2VudHMuCisgKgorICogSWYgd2UgZ2V0IGFuIGVycm9yIHJlYWRpbmcgdGhlIGluZGV4IHRoZW4gcmV0dXJuIHRoZSBwYXJ0IG9mIHRoZSBpbmRleAorICogKGlmIGFueSkgd2UgaGF2ZSBtYW5hZ2VkIHRvIHJlYWQgLSB0aGUgaW5kZXggaXNuJ3QgZXNzZW50aWFsLCBqdXN0CisgKiBxdWlja2VyLgorICovCitzdGF0aWMgaW50IGdldF9kaXJfaW5kZXhfdXNpbmdfbmFtZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAorCQkJdTY0ICpuZXh0X2Jsb2NrLCBpbnQgKm5leHRfb2Zmc2V0LCB1NjQgaW5kZXhfc3RhcnQsCisJCQlpbnQgaW5kZXhfb2Zmc2V0LCBpbnQgaV9jb3VudCwgY29uc3QgY2hhciAqbmFtZSwKKwkJCWludCBsZW4pCit7CisJc3RydWN0IHNxdWFzaGZzX3NiX2luZm8gKm1zYmxrID0gc2ItPnNfZnNfaW5mbzsKKwlpbnQgaSwgc2l6ZSwgbGVuZ3RoID0gMCwgZXJyOworCXN0cnVjdCBzcXVhc2hmc19kaXJfaW5kZXggKmluZGV4OworCWNoYXIgKnN0cjsKKworCVRSQUNFKCJFbnRlcmVkIGdldF9kaXJfaW5kZXhfdXNpbmdfbmFtZSwgaV9jb3VudCAlZFxuIiwgaV9jb3VudCk7CisKKwlpbmRleCA9IGttYWxsb2Moc2l6ZW9mKCppbmRleCkgKyBTUVVBU0hGU19OQU1FX0xFTiAqIDIgKyAyLCBHRlBfS0VSTkVMKTsKKwlpZiAoaW5kZXggPT0gTlVMTCkgeworCQlFUlJPUigiRmFpbGVkIHRvIGFsbG9jYXRlIHNxdWFzaGZzX2Rpcl9pbmRleFxuIik7CisJCWdvdG8gb3V0OworCX0KKworCXN0ciA9ICZpbmRleC0+bmFtZVtTUVVBU0hGU19OQU1FX0xFTiArIDFdOworCXN0cm5jcHkoc3RyLCBuYW1lLCBsZW4pOworCXN0cltsZW5dID0gJ1wwJzsKKworCWZvciAoaSA9IDA7IGkgPCBpX2NvdW50OyBpKyspIHsKKwkJZXJyID0gc3F1YXNoZnNfcmVhZF9tZXRhZGF0YShzYiwgaW5kZXgsICZpbmRleF9zdGFydCwKKwkJCQkJJmluZGV4X29mZnNldCwgc2l6ZW9mKCppbmRleCkpOworCQlpZiAoZXJyIDwgMCkKKwkJCWJyZWFrOworCisKKwkJc2l6ZSA9IGxlMzJfdG9fY3B1KGluZGV4LT5zaXplKSArIDE7CisKKwkJZXJyID0gc3F1YXNoZnNfcmVhZF9tZXRhZGF0YShzYiwgaW5kZXgtPm5hbWUsICZpbmRleF9zdGFydCwKKwkJCQkJJmluZGV4X29mZnNldCwgc2l6ZSk7CisJCWlmIChlcnIgPCAwKQorCQkJYnJlYWs7CisKKwkJaW5kZXgtPm5hbWVbc2l6ZV0gPSAnXDAnOworCisJCWlmIChzdHJjbXAoaW5kZXgtPm5hbWUsIHN0cikgPiAwKQorCQkJYnJlYWs7CisKKwkJbGVuZ3RoID0gbGUzMl90b19jcHUoaW5kZXgtPmluZGV4KTsKKwkJKm5leHRfYmxvY2sgPSBsZTMyX3RvX2NwdShpbmRleC0+c3RhcnRfYmxvY2spICsKKwkJCQkJbXNibGstPmRpcmVjdG9yeV90YWJsZTsKKwl9CisKKwkqbmV4dF9vZmZzZXQgPSAobGVuZ3RoICsgKm5leHRfb2Zmc2V0KSAlIFNRVUFTSEZTX01FVEFEQVRBX1NJWkU7CisJa2ZyZWUoaW5kZXgpOworCitvdXQ6CisJLyoKKwkgKiBSZXR1cm4gaW5kZXggKGZfcG9zKSBvZiB0aGUgbG9va2VkIHVwIG1ldGFkYXRhIGJsb2NrLiAgVHJhbnNsYXRlCisJICogZnJvbSBpbnRlcm5hbCBmX3BvcyB0byBleHRlcm5hbCBmX3BvcyB3aGljaCBpcyBvZmZzZXQgYnkgMyBiZWNhdXNlCisJICogd2UgaW52ZW50ICIuIiBhbmQgIi4uIiBlbnRyaWVzIHdoaWNoIGFyZSBub3QgYWN0dWFsbHkgc3RvcmVkIGluIHRoZQorCSAqIGRpcmVjdG9yeS4KKwkgKi8KKwlyZXR1cm4gbGVuZ3RoICsgMzsKK30KKworCitzdGF0aWMgc3RydWN0IGRlbnRyeSAqc3F1YXNoZnNfbG9va3VwKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksCisJCQkJIHN0cnVjdCBuYW1laWRhdGEgKm5kKQoreworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKm5hbWUgPSBkZW50cnktPmRfbmFtZS5uYW1lOworCWludCBsZW4gPSBkZW50cnktPmRfbmFtZS5sZW47CisJc3RydWN0IGlub2RlICppbm9kZSA9IE5VTEw7CisJc3RydWN0IHNxdWFzaGZzX3NiX2luZm8gKm1zYmxrID0gZGlyLT5pX3NiLT5zX2ZzX2luZm87CisJc3RydWN0IHNxdWFzaGZzX2Rpcl9oZWFkZXIgZGlyaDsKKwlzdHJ1Y3Qgc3F1YXNoZnNfZGlyX2VudHJ5ICpkaXJlOworCXU2NCBibG9jayA9IHNxdWFzaGZzX2koZGlyKS0+c3RhcnQgKyBtc2Jsay0+ZGlyZWN0b3J5X3RhYmxlOworCWludCBvZmZzZXQgPSBzcXVhc2hmc19pKGRpciktPm9mZnNldDsKKwlpbnQgZXJyLCBsZW5ndGggPSAwLCBkaXJfY291bnQsIHNpemU7CisKKwlUUkFDRSgiRW50ZXJlZCBzcXVhc2hmc19sb29rdXAgWyVsbHg6JXhdXG4iLCBibG9jaywgb2Zmc2V0KTsKKworCWRpcmUgPSBrbWFsbG9jKHNpemVvZigqZGlyZSkgKyBTUVVBU0hGU19OQU1FX0xFTiArIDEsIEdGUF9LRVJORUwpOworCWlmIChkaXJlID09IE5VTEwpIHsKKwkJRVJST1IoIkZhaWxlZCB0byBhbGxvY2F0ZSBzcXVhc2hmc19kaXJfZW50cnlcbiIpOworCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwl9CisKKwlpZiAobGVuID4gU1FVQVNIRlNfTkFNRV9MRU4pIHsKKwkJZXJyID0gLUVOQU1FVE9PTE9ORzsKKwkJZ290byBmYWlsZWQ7CisJfQorCisJbGVuZ3RoID0gZ2V0X2Rpcl9pbmRleF91c2luZ19uYW1lKGRpci0+aV9zYiwgJmJsb2NrLCAmb2Zmc2V0LAorCQkJCXNxdWFzaGZzX2koZGlyKS0+ZGlyX2lkeF9zdGFydCwKKwkJCQlzcXVhc2hmc19pKGRpciktPmRpcl9pZHhfb2Zmc2V0LAorCQkJCXNxdWFzaGZzX2koZGlyKS0+ZGlyX2lkeF9jbnQsIG5hbWUsIGxlbik7CisKKwl3aGlsZSAobGVuZ3RoIDwgaV9zaXplX3JlYWQoZGlyKSkgeworCQkvKgorCQkgKiBSZWFkIGRpcmVjdG9yeSBoZWFkZXIuCisJCSAqLworCQllcnIgPSBzcXVhc2hmc19yZWFkX21ldGFkYXRhKGRpci0+aV9zYiwgJmRpcmgsICZibG9jaywKKwkJCQkmb2Zmc2V0LCBzaXplb2YoZGlyaCkpOworCQlpZiAoZXJyIDwgMCkKKwkJCWdvdG8gcmVhZF9mYWlsdXJlOworCisJCWxlbmd0aCArPSBzaXplb2YoZGlyaCk7CisKKwkJZGlyX2NvdW50ID0gbGUzMl90b19jcHUoZGlyaC5jb3VudCkgKyAxOworCQl3aGlsZSAoZGlyX2NvdW50LS0pIHsKKwkJCS8qCisJCQkgKiBSZWFkIGRpcmVjdG9yeSBlbnRyeS4KKwkJCSAqLworCQkJZXJyID0gc3F1YXNoZnNfcmVhZF9tZXRhZGF0YShkaXItPmlfc2IsIGRpcmUsICZibG9jaywKKwkJCQkJJm9mZnNldCwgc2l6ZW9mKCpkaXJlKSk7CisJCQlpZiAoZXJyIDwgMCkKKwkJCQlnb3RvIHJlYWRfZmFpbHVyZTsKKworCQkJc2l6ZSA9IGxlMTZfdG9fY3B1KGRpcmUtPnNpemUpICsgMTsKKworCQkJZXJyID0gc3F1YXNoZnNfcmVhZF9tZXRhZGF0YShkaXItPmlfc2IsIGRpcmUtPm5hbWUsCisJCQkJCSZibG9jaywgJm9mZnNldCwgc2l6ZSk7CisJCQlpZiAoZXJyIDwgMCkKKwkJCQlnb3RvIHJlYWRfZmFpbHVyZTsKKworCQkJbGVuZ3RoICs9IHNpemVvZigqZGlyZSkgKyBzaXplOworCisJCQlpZiAobmFtZVswXSA8IGRpcmUtPm5hbWVbMF0pCisJCQkJZ290byBleGl0X2xvb2t1cDsKKworCQkJaWYgKGxlbiA9PSBzaXplICYmICFzdHJuY21wKG5hbWUsIGRpcmUtPm5hbWUsIGxlbikpIHsKKwkJCQl1bnNpZ25lZCBpbnQgYmxrLCBvZmYsIGlub19udW07CisJCQkJbG9uZyBsb25nIGlubzsKKwkJCQlibGsgPSBsZTMyX3RvX2NwdShkaXJoLnN0YXJ0X2Jsb2NrKTsKKwkJCQlvZmYgPSBsZTE2X3RvX2NwdShkaXJlLT5vZmZzZXQpOworCQkJCWlub19udW0gPSBsZTMyX3RvX2NwdShkaXJoLmlub2RlX251bWJlcikgKworCQkJCQkoc2hvcnQpIGxlMTZfdG9fY3B1KGRpcmUtPmlub2RlX251bWJlcik7CisJCQkJaW5vID0gU1FVQVNIRlNfTUtJTk9ERShibGssIG9mZik7CisKKwkJCQlUUkFDRSgiY2FsbGluZyBzcXVhc2hmc19pZ2V0IGZvciBkaXJlY3RvcnkgIgorCQkJCQkiZW50cnkgJXMsIGlub2RlICAleDoleCwgJWRcbiIsIG5hbWUsCisJCQkJCWJsaywgb2ZmLCBpbm9fbnVtKTsKKworCQkJCWlub2RlID0gc3F1YXNoZnNfaWdldChkaXItPmlfc2IsIGlubywgaW5vX251bSk7CisJCQkJaWYgKElTX0VSUihpbm9kZSkpIHsKKwkJCQkJZXJyID0gUFRSX0VSUihpbm9kZSk7CisJCQkJCWdvdG8gZmFpbGVkOworCQkJCX0KKworCQkJCWdvdG8gZXhpdF9sb29rdXA7CisJCQl9CisJCX0KKwl9CisKK2V4aXRfbG9va3VwOgorCWtmcmVlKGRpcmUpOworCWlmIChpbm9kZSkKKwkJcmV0dXJuIGRfc3BsaWNlX2FsaWFzKGlub2RlLCBkZW50cnkpOworCWRfYWRkKGRlbnRyeSwgaW5vZGUpOworCXJldHVybiBFUlJfUFRSKDApOworCityZWFkX2ZhaWx1cmU6CisJRVJST1IoIlVuYWJsZSB0byByZWFkIGRpcmVjdG9yeSBibG9jayBbJWxseDoleF1cbiIsCisJCXNxdWFzaGZzX2koZGlyKS0+c3RhcnQgKyBtc2Jsay0+ZGlyZWN0b3J5X3RhYmxlLAorCQlzcXVhc2hmc19pKGRpciktPm9mZnNldCk7CitmYWlsZWQ6CisJa2ZyZWUoZGlyZSk7CisJcmV0dXJuIEVSUl9QVFIoZXJyKTsKK30KKworCitjb25zdCBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBzcXVhc2hmc19kaXJfaW5vZGVfb3BzID0geworCS5sb29rdXAgPSBzcXVhc2hmc19sb29rdXAKK307CmRpZmYgLS1naXQgYS9mcy9zcXVhc2hmcy9zcXVhc2hmcy5oIGIvZnMvc3F1YXNoZnMvc3F1YXNoZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjI1MTVkCi0tLSAvZGV2L251bGwKKysrIGIvZnMvc3F1YXNoZnMvc3F1YXNoZnMuaApAQCAtMCwwICsxLDkwIEBACisvKgorICogU3F1YXNoZnMgLSBhIGNvbXByZXNzZWQgcmVhZCBvbmx5IGZpbGVzeXN0ZW0gZm9yIExpbnV4CisgKgorICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4CisgKiBQaGlsbGlwIExvdWdoZXIgPHBoaWxsaXBAbG91Z2hlci5kZW1vbi5jby51az4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsCisgKiBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqCisgKiBzcXVhc2hmcy5oCisgKi8KKworI2RlZmluZSBUUkFDRShzLCBhcmdzLi4uKQlwcl9kZWJ1ZygiU1FVQVNIRlM6ICJzLCAjIyBhcmdzKQorCisjZGVmaW5lIEVSUk9SKHMsIGFyZ3MuLi4pCXByX2VycigiU1FVQVNIRlMgZXJyb3I6ICJzLCAjIyBhcmdzKQorCisjZGVmaW5lIFdBUk5JTkcocywgYXJncy4uLikJcHJfd2FybmluZygiU1FVQVNIRlM6ICJzLCAjIyBhcmdzKQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBzcXVhc2hmc19pbm9kZV9pbmZvICpzcXVhc2hmc19pKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJcmV0dXJuIGxpc3RfZW50cnkoaW5vZGUsIHN0cnVjdCBzcXVhc2hmc19pbm9kZV9pbmZvLCB2ZnNfaW5vZGUpOworfQorCisvKiBibG9jay5jICovCitleHRlcm4gaW50IHNxdWFzaGZzX3JlYWRfZGF0YShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgdm9pZCAqKiwgdTY0LCBpbnQsIHU2NCAqLAorCQkJCWludCk7CisKKy8qIGNhY2hlLmMgKi8KK2V4dGVybiBzdHJ1Y3Qgc3F1YXNoZnNfY2FjaGUgKnNxdWFzaGZzX2NhY2hlX2luaXQoY2hhciAqLCBpbnQsIGludCk7CitleHRlcm4gdm9pZCBzcXVhc2hmc19jYWNoZV9kZWxldGUoc3RydWN0IHNxdWFzaGZzX2NhY2hlICopOworZXh0ZXJuIHN0cnVjdCBzcXVhc2hmc19jYWNoZV9lbnRyeSAqc3F1YXNoZnNfY2FjaGVfZ2V0KHN0cnVjdCBzdXBlcl9ibG9jayAqLAorCQkJCXN0cnVjdCBzcXVhc2hmc19jYWNoZSAqLCB1NjQsIGludCk7CitleHRlcm4gdm9pZCBzcXVhc2hmc19jYWNoZV9wdXQoc3RydWN0IHNxdWFzaGZzX2NhY2hlX2VudHJ5ICopOworZXh0ZXJuIGludCBzcXVhc2hmc19jb3B5X2RhdGEodm9pZCAqLCBzdHJ1Y3Qgc3F1YXNoZnNfY2FjaGVfZW50cnkgKiwgaW50LCBpbnQpOworZXh0ZXJuIGludCBzcXVhc2hmc19yZWFkX21ldGFkYXRhKHN0cnVjdCBzdXBlcl9ibG9jayAqLCB2b2lkICosIHU2NCAqLAorCQkJCWludCAqLCBpbnQpOworZXh0ZXJuIHN0cnVjdCBzcXVhc2hmc19jYWNoZV9lbnRyeSAqc3F1YXNoZnNfZ2V0X2ZyYWdtZW50KHN0cnVjdCBzdXBlcl9ibG9jayAqLAorCQkJCXU2NCwgaW50KTsKK2V4dGVybiBzdHJ1Y3Qgc3F1YXNoZnNfY2FjaGVfZW50cnkgKnNxdWFzaGZzX2dldF9kYXRhYmxvY2soc3RydWN0IHN1cGVyX2Jsb2NrICosCisJCQkJdTY0LCBpbnQpOworZXh0ZXJuIGludCBzcXVhc2hmc19yZWFkX3RhYmxlKHN0cnVjdCBzdXBlcl9ibG9jayAqLCB2b2lkICosIHU2NCwgaW50KTsKKworLyogZXhwb3J0LmMgKi8KK2V4dGVybiBfX2xlNjQgKnNxdWFzaGZzX3JlYWRfaW5vZGVfbG9va3VwX3RhYmxlKHN0cnVjdCBzdXBlcl9ibG9jayAqLCB1NjQsCisJCQkJdW5zaWduZWQgaW50KTsKKworLyogZnJhZ21lbnQuYyAqLworZXh0ZXJuIGludCBzcXVhc2hmc19mcmFnX2xvb2t1cChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgdW5zaWduZWQgaW50LCB1NjQgKik7CitleHRlcm4gX19sZTY0ICpzcXVhc2hmc19yZWFkX2ZyYWdtZW50X2luZGV4X3RhYmxlKHN0cnVjdCBzdXBlcl9ibG9jayAqLAorCQkJCXU2NCwgdW5zaWduZWQgaW50KTsKKworLyogaWQuYyAqLworZXh0ZXJuIGludCBzcXVhc2hmc19nZXRfaWQoc3RydWN0IHN1cGVyX2Jsb2NrICosIHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50ICopOworZXh0ZXJuIF9fbGU2NCAqc3F1YXNoZnNfcmVhZF9pZF9pbmRleF90YWJsZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgdTY0LAorCQkJCXVuc2lnbmVkIHNob3J0KTsKKworLyogaW5vZGUuYyAqLworZXh0ZXJuIHN0cnVjdCBpbm9kZSAqc3F1YXNoZnNfaWdldChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgbG9uZyBsb25nLAorCQkJCXVuc2lnbmVkIGludCk7CitleHRlcm4gaW50IHNxdWFzaGZzX3JlYWRfaW5vZGUoc3RydWN0IGlub2RlICosIGxvbmcgbG9uZyk7CisKKy8qCisgKiBJbm9kZXMgYW5kIGZpbGVzIG9wZXJhdGlvbnMKKyAqLworCisvKiBkaXIuYyAqLworZXh0ZXJuIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgc3F1YXNoZnNfZGlyX29wczsKKworLyogZXhwb3J0LmMgKi8KK2V4dGVybiBjb25zdCBzdHJ1Y3QgZXhwb3J0X29wZXJhdGlvbnMgc3F1YXNoZnNfZXhwb3J0X29wczsKKworLyogZmlsZS5jICovCitleHRlcm4gY29uc3Qgc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyBzcXVhc2hmc19hb3BzOworCisvKiBuYW1laS5jICovCitleHRlcm4gY29uc3Qgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgc3F1YXNoZnNfZGlyX2lub2RlX29wczsKKworLyogc3ltbGluay5jICovCitleHRlcm4gY29uc3Qgc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyBzcXVhc2hmc19zeW1saW5rX2FvcHM7CmRpZmYgLS1naXQgYS9mcy9zcXVhc2hmcy9zcXVhc2hmc19mcy5oIGIvZnMvc3F1YXNoZnMvc3F1YXNoZnNfZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODNkYWFmCi0tLSAvZGV2L251bGwKKysrIGIvZnMvc3F1YXNoZnMvc3F1YXNoZnNfZnMuaApAQCAtMCwwICsxLDM4MCBAQAorI2lmbmRlZiBTUVVBU0hGU19GUworI2RlZmluZSBTUVVBU0hGU19GUworLyoKKyAqIFNxdWFzaGZzCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4CisgKiBQaGlsbGlwIExvdWdoZXIgPHBoaWxsaXBAbG91Z2hlci5kZW1vbi5jby51az4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsCisgKiBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqCisgKiBzcXVhc2hmc19mcy5oCisgKi8KKworI2RlZmluZSBTUVVBU0hGU19DQUNIRURfRlJBR01FTlRTCUNPTkZJR19TUVVBU0hGU19GUkFHTUVOVF9DQUNIRV9TSVpFCisjZGVmaW5lIFNRVUFTSEZTX01BSk9SCQkJNAorI2RlZmluZSBTUVVBU0hGU19NSU5PUgkJCTAKKyNkZWZpbmUgU1FVQVNIRlNfU1RBUlQJCQkwCisKKy8qIHNpemUgb2YgbWV0YWRhdGEgKGlub2RlIGFuZCBkaXJlY3RvcnkpIGJsb2NrcyAqLworI2RlZmluZSBTUVVBU0hGU19NRVRBREFUQV9TSVpFCQk4MTkyCisjZGVmaW5lIFNRVUFTSEZTX01FVEFEQVRBX0xPRwkJMTMKKworLyogZGVmYXVsdCBzaXplIG9mIGRhdGEgYmxvY2tzICovCisjZGVmaW5lIFNRVUFTSEZTX0ZJTEVfU0laRQkJMTMxMDcyCisjZGVmaW5lIFNRVUFTSEZTX0ZJTEVfTE9HCQkxNworCisjZGVmaW5lIFNRVUFTSEZTX0ZJTEVfTUFYX1NJWkUJCTEwNDg1NzYKKyNkZWZpbmUgU1FVQVNIRlNfRklMRV9NQVhfTE9HCQkyMAorCisvKiBNYXggbnVtYmVyIG9mIHVpZHMgYW5kIGdpZHMgKi8KKyNkZWZpbmUgU1FVQVNIRlNfSURTCQkJNjU1MzYKKworLyogTWF4IGxlbmd0aCBvZiBmaWxlbmFtZSAobm90IDI1NSkgKi8KKyNkZWZpbmUgU1FVQVNIRlNfTkFNRV9MRU4JCTI1NgorCisjZGVmaW5lIFNRVUFTSEZTX0lOVkFMSURfRlJBRwkJKDB4ZmZmZmZmZmZVKQorI2RlZmluZSBTUVVBU0hGU19JTlZBTElEX0JMSwkJKC0xTEwpCisKKy8qIEZpbGVzeXN0ZW0gZmxhZ3MgKi8KKyNkZWZpbmUgU1FVQVNIRlNfTk9JCQkJMAorI2RlZmluZSBTUVVBU0hGU19OT0QJCQkxCisjZGVmaW5lIFNRVUFTSEZTX05PRgkJCTMKKyNkZWZpbmUgU1FVQVNIRlNfTk9fRlJBRwkJNAorI2RlZmluZSBTUVVBU0hGU19BTFdBWVNfRlJBRwkJNQorI2RlZmluZSBTUVVBU0hGU19EVVBMSUNBVEUJCTYKKyNkZWZpbmUgU1FVQVNIRlNfRVhQT1JUCQkJNworCisjZGVmaW5lIFNRVUFTSEZTX0JJVChmbGFnLCBiaXQpCQkoKGZsYWcgPj4gYml0KSAmIDEpCisKKyNkZWZpbmUgU1FVQVNIRlNfVU5DT01QUkVTU0VEX0lOT0RFUyhmbGFncykJU1FVQVNIRlNfQklUKGZsYWdzLCBcCisJCQkJCQlTUVVBU0hGU19OT0kpCisKKyNkZWZpbmUgU1FVQVNIRlNfVU5DT01QUkVTU0VEX0RBVEEoZmxhZ3MpCVNRVUFTSEZTX0JJVChmbGFncywgXAorCQkJCQkJU1FVQVNIRlNfTk9EKQorCisjZGVmaW5lIFNRVUFTSEZTX1VOQ09NUFJFU1NFRF9GUkFHTUVOVFMoZmxhZ3MpCVNRVUFTSEZTX0JJVChmbGFncywgXAorCQkJCQkJU1FVQVNIRlNfTk9GKQorCisjZGVmaW5lIFNRVUFTSEZTX05PX0ZSQUdNRU5UUyhmbGFncykJCVNRVUFTSEZTX0JJVChmbGFncywgXAorCQkJCQkJU1FVQVNIRlNfTk9fRlJBRykKKworI2RlZmluZSBTUVVBU0hGU19BTFdBWVNfRlJBR01FTlRTKGZsYWdzKQlTUVVBU0hGU19CSVQoZmxhZ3MsIFwKKwkJCQkJCVNRVUFTSEZTX0FMV0FZU19GUkFHKQorCisjZGVmaW5lIFNRVUFTSEZTX0RVUExJQ0FURVMoZmxhZ3MpCQlTUVVBU0hGU19CSVQoZmxhZ3MsIFwKKwkJCQkJCVNRVUFTSEZTX0RVUExJQ0FURSkKKworI2RlZmluZSBTUVVBU0hGU19FWFBPUlRBQkxFKGZsYWdzKQkJU1FVQVNIRlNfQklUKGZsYWdzLCBcCisJCQkJCQlTUVVBU0hGU19FWFBPUlQpCisKKy8qIE1heCBudW1iZXIgb2YgdHlwZXMgYW5kIGZpbGUgdHlwZXMgKi8KKyNkZWZpbmUgU1FVQVNIRlNfRElSX1RZUEUJCTEKKyNkZWZpbmUgU1FVQVNIRlNfUkVHX1RZUEUJCTIKKyNkZWZpbmUgU1FVQVNIRlNfU1lNTElOS19UWVBFCQkzCisjZGVmaW5lIFNRVUFTSEZTX0JMS0RFVl9UWVBFCQk0CisjZGVmaW5lIFNRVUFTSEZTX0NIUkRFVl9UWVBFCQk1CisjZGVmaW5lIFNRVUFTSEZTX0ZJRk9fVFlQRQkJNgorI2RlZmluZSBTUVVBU0hGU19TT0NLRVRfVFlQRQkJNworI2RlZmluZSBTUVVBU0hGU19MRElSX1RZUEUJCTgKKyNkZWZpbmUgU1FVQVNIRlNfTFJFR19UWVBFCQk5CisjZGVmaW5lIFNRVUFTSEZTX0xTWU1MSU5LX1RZUEUJCTEwCisjZGVmaW5lIFNRVUFTSEZTX0xCTEtERVZfVFlQRQkJMTEKKyNkZWZpbmUgU1FVQVNIRlNfTENIUkRFVl9UWVBFCQkxMgorI2RlZmluZSBTUVVBU0hGU19MRklGT19UWVBFCQkxMworI2RlZmluZSBTUVVBU0hGU19MU09DS0VUX1RZUEUJCTE0CisKKy8qIEZsYWcgd2hldGhlciBibG9jayBpcyBjb21wcmVzc2VkIG9yIHVuY29tcHJlc3NlZCwgYml0IGlzIHNldCBpZiBibG9jayBpcworICogdW5jb21wcmVzc2VkICovCisjZGVmaW5lIFNRVUFTSEZTX0NPTVBSRVNTRURfQklUCQkoMSA8PCAxNSkKKworI2RlZmluZSBTUVVBU0hGU19DT01QUkVTU0VEX1NJWkUoQikJKCgoQikgJiB+U1FVQVNIRlNfQ09NUFJFU1NFRF9CSVQpID8gXAorCQkoQikgJiB+U1FVQVNIRlNfQ09NUFJFU1NFRF9CSVQgOiAgU1FVQVNIRlNfQ09NUFJFU1NFRF9CSVQpCisKKyNkZWZpbmUgU1FVQVNIRlNfQ09NUFJFU1NFRChCKQkJKCEoKEIpICYgU1FVQVNIRlNfQ09NUFJFU1NFRF9CSVQpKQorCisjZGVmaW5lIFNRVUFTSEZTX0NPTVBSRVNTRURfQklUX0JMT0NLCSgxIDw8IDI0KQorCisjZGVmaW5lIFNRVUFTSEZTX0NPTVBSRVNTRURfU0laRV9CTE9DSyhCKQkoKEIpICYgXAorCQkJCQkJflNRVUFTSEZTX0NPTVBSRVNTRURfQklUX0JMT0NLKQorCisjZGVmaW5lIFNRVUFTSEZTX0NPTVBSRVNTRURfQkxPQ0soQikJKCEoKEIpICYgU1FVQVNIRlNfQ09NUFJFU1NFRF9CSVRfQkxPQ0spKQorCisvKgorICogSW5vZGUgbnVtYmVyIG9wcy4gIElub2RlcyBjb25zaXN0IG9mIGEgY29tcHJlc3NlZCBibG9jayBudW1iZXIsIGFuZCBhbgorICogdW5jb21wcmVzc2VkIG9mZnNldCB3aXRoaW4gdGhhdCBibG9jaworICovCisjZGVmaW5lIFNRVUFTSEZTX0lOT0RFX0JMSyhBKQkJKCh1bnNpZ25lZCBpbnQpICgoQSkgPj4gMTYpKQorCisjZGVmaW5lIFNRVUFTSEZTX0lOT0RFX09GRlNFVChBKQkoKHVuc2lnbmVkIGludCkgKChBKSAmIDB4ZmZmZikpCisKKyNkZWZpbmUgU1FVQVNIRlNfTUtJTk9ERShBLCBCKQkJKChsb25nIGxvbmcpKCgobG9uZyBsb25nKSAoQSlcCisJCQkJCTw8IDE2KSArIChCKSkpCisKKy8qIFRyYW5zbGF0ZSBiZXR3ZWVuIFZGUyBtb2RlIGFuZCBzcXVhc2hmcyBtb2RlICovCisjZGVmaW5lIFNRVUFTSEZTX01PREUoQSkJCSgoQSkgJiAweGZmZikKKworLyogZnJhZ21lbnQgYW5kIGZyYWdtZW50IHRhYmxlIGRlZmluZXMgKi8KKyNkZWZpbmUgU1FVQVNIRlNfRlJBR01FTlRfQllURVMoQSkJXAorCQkJCSgoQSkgKiBzaXplb2Yoc3RydWN0IHNxdWFzaGZzX2ZyYWdtZW50X2VudHJ5KSkKKworI2RlZmluZSBTUVVBU0hGU19GUkFHTUVOVF9JTkRFWChBKQkoU1FVQVNIRlNfRlJBR01FTlRfQllURVMoQSkgLyBcCisJCQkJCVNRVUFTSEZTX01FVEFEQVRBX1NJWkUpCisKKyNkZWZpbmUgU1FVQVNIRlNfRlJBR01FTlRfSU5ERVhfT0ZGU0VUKEEpCShTUVVBU0hGU19GUkFHTUVOVF9CWVRFUyhBKSAlIFwKKwkJCQkJCVNRVUFTSEZTX01FVEFEQVRBX1NJWkUpCisKKyNkZWZpbmUgU1FVQVNIRlNfRlJBR01FTlRfSU5ERVhFUyhBKQkoKFNRVUFTSEZTX0ZSQUdNRU5UX0JZVEVTKEEpICsgXAorCQkJCQlTUVVBU0hGU19NRVRBREFUQV9TSVpFIC0gMSkgLyBcCisJCQkJCVNRVUFTSEZTX01FVEFEQVRBX1NJWkUpCisKKyNkZWZpbmUgU1FVQVNIRlNfRlJBR01FTlRfSU5ERVhfQllURVMoQSkJKFNRVUFTSEZTX0ZSQUdNRU5UX0lOREVYRVMoQSkgKlwKKwkJCQkJCXNpemVvZih1NjQpKQorCisvKiBpbm9kZSBsb29rdXAgdGFibGUgZGVmaW5lcyAqLworI2RlZmluZSBTUVVBU0hGU19MT09LVVBfQllURVMoQSkJKChBKSAqIHNpemVvZih1NjQpKQorCisjZGVmaW5lIFNRVUFTSEZTX0xPT0tVUF9CTE9DSyhBKQkoU1FVQVNIRlNfTE9PS1VQX0JZVEVTKEEpIC8gXAorCQkJCQlTUVVBU0hGU19NRVRBREFUQV9TSVpFKQorCisjZGVmaW5lIFNRVUFTSEZTX0xPT0tVUF9CTE9DS19PRkZTRVQoQSkJKFNRVUFTSEZTX0xPT0tVUF9CWVRFUyhBKSAlIFwKKwkJCQkJU1FVQVNIRlNfTUVUQURBVEFfU0laRSkKKworI2RlZmluZSBTUVVBU0hGU19MT09LVVBfQkxPQ0tTKEEpCSgoU1FVQVNIRlNfTE9PS1VQX0JZVEVTKEEpICsgXAorCQkJCQlTUVVBU0hGU19NRVRBREFUQV9TSVpFIC0gMSkgLyBcCisJCQkJCVNRVUFTSEZTX01FVEFEQVRBX1NJWkUpCisKKyNkZWZpbmUgU1FVQVNIRlNfTE9PS1VQX0JMT0NLX0JZVEVTKEEpCShTUVVBU0hGU19MT09LVVBfQkxPQ0tTKEEpICpcCisJCQkJCXNpemVvZih1NjQpKQorCisvKiB1aWQvZ2lkIGxvb2t1cCB0YWJsZSBkZWZpbmVzICovCisjZGVmaW5lIFNRVUFTSEZTX0lEX0JZVEVTKEEpCQkoKEEpICogc2l6ZW9mKHVuc2lnbmVkIGludCkpCisKKyNkZWZpbmUgU1FVQVNIRlNfSURfQkxPQ0soQSkJCShTUVVBU0hGU19JRF9CWVRFUyhBKSAvIFwKKwkJCQkJU1FVQVNIRlNfTUVUQURBVEFfU0laRSkKKworI2RlZmluZSBTUVVBU0hGU19JRF9CTE9DS19PRkZTRVQoQSkJKFNRVUFTSEZTX0lEX0JZVEVTKEEpICUgXAorCQkJCQlTUVVBU0hGU19NRVRBREFUQV9TSVpFKQorCisjZGVmaW5lIFNRVUFTSEZTX0lEX0JMT0NLUyhBKQkJKChTUVVBU0hGU19JRF9CWVRFUyhBKSArIFwKKwkJCQkJU1FVQVNIRlNfTUVUQURBVEFfU0laRSAtIDEpIC8gXAorCQkJCQlTUVVBU0hGU19NRVRBREFUQV9TSVpFKQorCisjZGVmaW5lIFNRVUFTSEZTX0lEX0JMT0NLX0JZVEVTKEEpCShTUVVBU0hGU19JRF9CTE9DS1MoQSkgKlwKKwkJCQkJc2l6ZW9mKHU2NCkpCisKKy8qIGNhY2hlZCBkYXRhIGNvbnN0YW50cyBmb3IgZmlsZXN5c3RlbSAqLworI2RlZmluZSBTUVVBU0hGU19DQUNIRURfQkxLUwkJOAorCisjZGVmaW5lIFNRVUFTSEZTX01BWF9GSUxFX1NJWkVfTE9HCTY0CisKKyNkZWZpbmUgU1FVQVNIRlNfTUFYX0ZJTEVfU0laRQkJKDFMTCA8PCBcCisJCQkJCShTUVVBU0hGU19NQVhfRklMRV9TSVpFX0xPRyAtIDIpKQorCisjZGVmaW5lIFNRVUFTSEZTX01BUktFUl9CWVRFCQkweGZmCisKKy8qIG1ldGEgaW5kZXggY2FjaGUgKi8KKyNkZWZpbmUgU1FVQVNIRlNfTUVUQV9JTkRFWEVTCShTUVVBU0hGU19NRVRBREFUQV9TSVpFIC8gc2l6ZW9mKHVuc2lnbmVkIGludCkpCisjZGVmaW5lIFNRVUFTSEZTX01FVEFfRU5UUklFUwkxMjcKKyNkZWZpbmUgU1FVQVNIRlNfTUVUQV9TTE9UUwk4CisKK3N0cnVjdCBtZXRhX2VudHJ5IHsKKwl1NjQJCQlkYXRhX2Jsb2NrOworCXVuc2lnbmVkIGludAkJaW5kZXhfYmxvY2s7CisJdW5zaWduZWQgc2hvcnQJCW9mZnNldDsKKwl1bnNpZ25lZCBzaG9ydAkJcGFkOworfTsKKworc3RydWN0IG1ldGFfaW5kZXggeworCXVuc2lnbmVkIGludAkJaW5vZGVfbnVtYmVyOworCXVuc2lnbmVkIGludAkJb2Zmc2V0OworCXVuc2lnbmVkIHNob3J0CQllbnRyaWVzOworCXVuc2lnbmVkIHNob3J0CQlza2lwOworCXVuc2lnbmVkIHNob3J0CQlsb2NrZWQ7CisJdW5zaWduZWQgc2hvcnQJCXBhZDsKKwlzdHJ1Y3QgbWV0YV9lbnRyeQltZXRhX2VudHJ5W1NRVUFTSEZTX01FVEFfRU5UUklFU107Cit9OworCisKKy8qCisgKiBkZWZpbml0aW9ucyBmb3Igc3RydWN0dXJlcyBvbiBkaXNrCisgKi8KKyNkZWZpbmUgWkxJQl9DT01QUkVTU0lPTgkgMQorCitzdHJ1Y3Qgc3F1YXNoZnNfc3VwZXJfYmxvY2sgeworCV9fbGUzMgkJCXNfbWFnaWM7CisJX19sZTMyCQkJaW5vZGVzOworCV9fbGUzMgkJCW1rZnNfdGltZTsKKwlfX2xlMzIJCQlibG9ja19zaXplOworCV9fbGUzMgkJCWZyYWdtZW50czsKKwlfX2xlMTYJCQljb21wcmVzc2lvbjsKKwlfX2xlMTYJCQlibG9ja19sb2c7CisJX19sZTE2CQkJZmxhZ3M7CisJX19sZTE2CQkJbm9faWRzOworCV9fbGUxNgkJCXNfbWFqb3I7CisJX19sZTE2CQkJc19taW5vcjsKKwlfX2xlNjQJCQlyb290X2lub2RlOworCV9fbGU2NAkJCWJ5dGVzX3VzZWQ7CisJX19sZTY0CQkJaWRfdGFibGVfc3RhcnQ7CisJX19sZTY0CQkJeGF0dHJfdGFibGVfc3RhcnQ7CisJX19sZTY0CQkJaW5vZGVfdGFibGVfc3RhcnQ7CisJX19sZTY0CQkJZGlyZWN0b3J5X3RhYmxlX3N0YXJ0OworCV9fbGU2NAkJCWZyYWdtZW50X3RhYmxlX3N0YXJ0OworCV9fbGU2NAkJCWxvb2t1cF90YWJsZV9zdGFydDsKK307CisKK3N0cnVjdCBzcXVhc2hmc19kaXJfaW5kZXggeworCV9fbGUzMgkJCWluZGV4OworCV9fbGUzMgkJCXN0YXJ0X2Jsb2NrOworCV9fbGUzMgkJCXNpemU7CisJdW5zaWduZWQgY2hhcgkJbmFtZVswXTsKK307CisKK3N0cnVjdCBzcXVhc2hmc19iYXNlX2lub2RlIHsKKwlfX2xlMTYJCQlpbm9kZV90eXBlOworCV9fbGUxNgkJCW1vZGU7CisJX19sZTE2CQkJdWlkOworCV9fbGUxNgkJCWd1aWQ7CisJX19sZTMyCQkJbXRpbWU7CisJX19sZTMyCSAJCWlub2RlX251bWJlcjsKK307CisKK3N0cnVjdCBzcXVhc2hmc19pcGNfaW5vZGUgeworCV9fbGUxNgkJCWlub2RlX3R5cGU7CisJX19sZTE2CQkJbW9kZTsKKwlfX2xlMTYJCQl1aWQ7CisJX19sZTE2CQkJZ3VpZDsKKwlfX2xlMzIJCQltdGltZTsKKwlfX2xlMzIJIAkJaW5vZGVfbnVtYmVyOworCV9fbGUzMgkJCW5saW5rOworfTsKKworc3RydWN0IHNxdWFzaGZzX2Rldl9pbm9kZSB7CisJX19sZTE2CQkJaW5vZGVfdHlwZTsKKwlfX2xlMTYJCQltb2RlOworCV9fbGUxNgkJCXVpZDsKKwlfX2xlMTYJCQlndWlkOworCV9fbGUzMgkJCW10aW1lOworCV9fbGUzMgkgCQlpbm9kZV9udW1iZXI7CisJX19sZTMyCQkJbmxpbms7CisJX19sZTMyCQkJcmRldjsKK307CisKK3N0cnVjdCBzcXVhc2hmc19zeW1saW5rX2lub2RlIHsKKwlfX2xlMTYJCQlpbm9kZV90eXBlOworCV9fbGUxNgkJCW1vZGU7CisJX19sZTE2CQkJdWlkOworCV9fbGUxNgkJCWd1aWQ7CisJX19sZTMyCQkJbXRpbWU7CisJX19sZTMyCSAJCWlub2RlX251bWJlcjsKKwlfX2xlMzIJCQlubGluazsKKwlfX2xlMzIJCQlzeW1saW5rX3NpemU7CisJY2hhcgkJCXN5bWxpbmtbMF07Cit9OworCitzdHJ1Y3Qgc3F1YXNoZnNfcmVnX2lub2RlIHsKKwlfX2xlMTYJCQlpbm9kZV90eXBlOworCV9fbGUxNgkJCW1vZGU7CisJX19sZTE2CQkJdWlkOworCV9fbGUxNgkJCWd1aWQ7CisJX19sZTMyCQkJbXRpbWU7CisJX19sZTMyCSAJCWlub2RlX251bWJlcjsKKwlfX2xlMzIJCQlzdGFydF9ibG9jazsKKwlfX2xlMzIJCQlmcmFnbWVudDsKKwlfX2xlMzIJCQlvZmZzZXQ7CisJX19sZTMyCQkJZmlsZV9zaXplOworCV9fbGUxNgkJCWJsb2NrX2xpc3RbMF07Cit9OworCitzdHJ1Y3Qgc3F1YXNoZnNfbHJlZ19pbm9kZSB7CisJX19sZTE2CQkJaW5vZGVfdHlwZTsKKwlfX2xlMTYJCQltb2RlOworCV9fbGUxNgkJCXVpZDsKKwlfX2xlMTYJCQlndWlkOworCV9fbGUzMgkJCW10aW1lOworCV9fbGUzMgkgCQlpbm9kZV9udW1iZXI7CisJX19sZTY0CQkJc3RhcnRfYmxvY2s7CisJX19sZTY0CQkJZmlsZV9zaXplOworCV9fbGU2NAkJCXNwYXJzZTsKKwlfX2xlMzIJCQlubGluazsKKwlfX2xlMzIJCQlmcmFnbWVudDsKKwlfX2xlMzIJCQlvZmZzZXQ7CisJX19sZTMyCQkJeGF0dHI7CisJX19sZTE2CQkJYmxvY2tfbGlzdFswXTsKK307CisKK3N0cnVjdCBzcXVhc2hmc19kaXJfaW5vZGUgeworCV9fbGUxNgkJCWlub2RlX3R5cGU7CisJX19sZTE2CQkJbW9kZTsKKwlfX2xlMTYJCQl1aWQ7CisJX19sZTE2CQkJZ3VpZDsKKwlfX2xlMzIJCQltdGltZTsKKwlfX2xlMzIJIAkJaW5vZGVfbnVtYmVyOworCV9fbGUzMgkJCXN0YXJ0X2Jsb2NrOworCV9fbGUzMgkJCW5saW5rOworCV9fbGUxNgkJCWZpbGVfc2l6ZTsKKwlfX2xlMTYJCQlvZmZzZXQ7CisJX19sZTMyCQkJcGFyZW50X2lub2RlOworfTsKKworc3RydWN0IHNxdWFzaGZzX2xkaXJfaW5vZGUgeworCV9fbGUxNgkJCWlub2RlX3R5cGU7CisJX19sZTE2CQkJbW9kZTsKKwlfX2xlMTYJCQl1aWQ7CisJX19sZTE2CQkJZ3VpZDsKKwlfX2xlMzIJCQltdGltZTsKKwlfX2xlMzIJIAkJaW5vZGVfbnVtYmVyOworCV9fbGUzMgkJCW5saW5rOworCV9fbGUzMgkJCWZpbGVfc2l6ZTsKKwlfX2xlMzIJCQlzdGFydF9ibG9jazsKKwlfX2xlMzIJCQlwYXJlbnRfaW5vZGU7CisJX19sZTE2CQkJaV9jb3VudDsKKwlfX2xlMTYJCQlvZmZzZXQ7CisJX19sZTMyCQkJeGF0dHI7CisJc3RydWN0IHNxdWFzaGZzX2Rpcl9pbmRleAlpbmRleFswXTsKK307CisKK3VuaW9uIHNxdWFzaGZzX2lub2RlIHsKKwlzdHJ1Y3Qgc3F1YXNoZnNfYmFzZV9pbm9kZQkJYmFzZTsKKwlzdHJ1Y3Qgc3F1YXNoZnNfZGV2X2lub2RlCQlkZXY7CisJc3RydWN0IHNxdWFzaGZzX3N5bWxpbmtfaW5vZGUJCXN5bWxpbms7CisJc3RydWN0IHNxdWFzaGZzX3JlZ19pbm9kZQkJcmVnOworCXN0cnVjdCBzcXVhc2hmc19scmVnX2lub2RlCQlscmVnOworCXN0cnVjdCBzcXVhc2hmc19kaXJfaW5vZGUJCWRpcjsKKwlzdHJ1Y3Qgc3F1YXNoZnNfbGRpcl9pbm9kZQkJbGRpcjsKKwlzdHJ1Y3Qgc3F1YXNoZnNfaXBjX2lub2RlCQlpcGM7Cit9OworCitzdHJ1Y3Qgc3F1YXNoZnNfZGlyX2VudHJ5IHsKKwlfX2xlMTYJCQlvZmZzZXQ7CisJX19sZTE2CQkJaW5vZGVfbnVtYmVyOworCV9fbGUxNgkJCXR5cGU7CisJX19sZTE2CQkJc2l6ZTsKKwljaGFyCQkJbmFtZVswXTsKK307CisKK3N0cnVjdCBzcXVhc2hmc19kaXJfaGVhZGVyIHsKKwlfX2xlMzIJCQljb3VudDsKKwlfX2xlMzIJCQlzdGFydF9ibG9jazsKKwlfX2xlMzIJCQlpbm9kZV9udW1iZXI7Cit9OworCitzdHJ1Y3Qgc3F1YXNoZnNfZnJhZ21lbnRfZW50cnkgeworCV9fbGU2NAkJCXN0YXJ0X2Jsb2NrOworCV9fbGUzMgkJCXNpemU7CisJdW5zaWduZWQgaW50CQl1bnVzZWQ7Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2ZzL3NxdWFzaGZzL3NxdWFzaGZzX2ZzX2kuaCBiL2ZzL3NxdWFzaGZzL3NxdWFzaGZzX2ZzX2kuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYmZjYTMwCi0tLSAvZGV2L251bGwKKysrIGIvZnMvc3F1YXNoZnMvc3F1YXNoZnNfZnNfaS5oCkBAIC0wLDAgKzEsNDUgQEAKKyNpZm5kZWYgU1FVQVNIRlNfRlNfSQorI2RlZmluZSBTUVVBU0hGU19GU19JCisvKgorICogU3F1YXNoZnMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgKKyAqIFBoaWxsaXAgTG91Z2hlciA8cGhpbGxpcEBsb3VnaGVyLmRlbW9uLmNvLnVrPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwKKyAqIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICoKKyAqIHNxdWFzaGZzX2ZzX2kuaAorICovCisKK3N0cnVjdCBzcXVhc2hmc19pbm9kZV9pbmZvIHsKKwl1NjQJCXN0YXJ0OworCWludAkJb2Zmc2V0OworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCXU2NAkJZnJhZ21lbnRfYmxvY2s7CisJCQlpbnQJCWZyYWdtZW50X3NpemU7CisJCQlpbnQJCWZyYWdtZW50X29mZnNldDsKKwkJCXU2NAkJYmxvY2tfbGlzdF9zdGFydDsKKwkJfTsKKwkJc3RydWN0IHsKKwkJCXU2NAkJZGlyX2lkeF9zdGFydDsKKwkJCWludAkJZGlyX2lkeF9vZmZzZXQ7CisJCQlpbnQJCWRpcl9pZHhfY250OworCQkJaW50CQlwYXJlbnQ7CisJCX07CisJfTsKKwlzdHJ1Y3QgaW5vZGUJdmZzX2lub2RlOworfTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZnMvc3F1YXNoZnMvc3F1YXNoZnNfZnNfc2IuaCBiL2ZzL3NxdWFzaGZzL3NxdWFzaGZzX2ZzX3NiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzhjNjU2MQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3NxdWFzaGZzL3NxdWFzaGZzX2ZzX3NiLmgKQEAgLTAsMCArMSw3NiBAQAorI2lmbmRlZiBTUVVBU0hGU19GU19TQgorI2RlZmluZSBTUVVBU0hGU19GU19TQgorLyoKKyAqIFNxdWFzaGZzCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4CisgKiBQaGlsbGlwIExvdWdoZXIgPHBoaWxsaXBAbG91Z2hlci5kZW1vbi5jby51az4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsCisgKiBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqCisgKiBzcXVhc2hmc19mc19zYi5oCisgKi8KKworI2luY2x1ZGUgInNxdWFzaGZzX2ZzLmgiCisKK3N0cnVjdCBzcXVhc2hmc19jYWNoZSB7CisJY2hhcgkJCSpuYW1lOworCWludAkJCWVudHJpZXM7CisJaW50CQkJbmV4dF9ibGs7CisJaW50CQkJbnVtX3dhaXRlcnM7CisJaW50CQkJdW51c2VkOworCWludAkJCWJsb2NrX3NpemU7CisJaW50CQkJcGFnZXM7CisJc3BpbmxvY2tfdAkJbG9jazsKKwl3YWl0X3F1ZXVlX2hlYWRfdAl3YWl0X3F1ZXVlOworCXN0cnVjdCBzcXVhc2hmc19jYWNoZV9lbnRyeSAqZW50cnk7Cit9OworCitzdHJ1Y3Qgc3F1YXNoZnNfY2FjaGVfZW50cnkgeworCXU2NAkJCWJsb2NrOworCWludAkJCWxlbmd0aDsKKwlpbnQJCQlyZWZjb3VudDsKKwl1NjQJCQluZXh0X2luZGV4OworCWludAkJCXBlbmRpbmc7CisJaW50CQkJZXJyb3I7CisJaW50CQkJbnVtX3dhaXRlcnM7CisJd2FpdF9xdWV1ZV9oZWFkX3QJd2FpdF9xdWV1ZTsKKwlzdHJ1Y3Qgc3F1YXNoZnNfY2FjaGUJKmNhY2hlOworCXZvaWQJCQkqKmRhdGE7Cit9OworCitzdHJ1Y3Qgc3F1YXNoZnNfc2JfaW5mbyB7CisJaW50CQkJZGV2Ymxrc2l6ZTsKKwlpbnQJCQlkZXZibGtzaXplX2xvZzI7CisJc3RydWN0IHNxdWFzaGZzX2NhY2hlCSpibG9ja19jYWNoZTsKKwlzdHJ1Y3Qgc3F1YXNoZnNfY2FjaGUJKmZyYWdtZW50X2NhY2hlOworCXN0cnVjdCBzcXVhc2hmc19jYWNoZQkqcmVhZF9wYWdlOworCWludAkJCW5leHRfbWV0YV9pbmRleDsKKwlfX2xlNjQJCQkqaWRfdGFibGU7CisJX19sZTY0CQkJKmZyYWdtZW50X2luZGV4OworCXVuc2lnbmVkIGludAkJKmZyYWdtZW50X2luZGV4XzI7CisJc3RydWN0IG11dGV4CQlyZWFkX2RhdGFfbXV0ZXg7CisJc3RydWN0IG11dGV4CQltZXRhX2luZGV4X211dGV4OworCXN0cnVjdCBtZXRhX2luZGV4CSptZXRhX2luZGV4OworCXpfc3RyZWFtCQlzdHJlYW07CisJX19sZTY0CQkJKmlub2RlX2xvb2t1cF90YWJsZTsKKwl1NjQJCQlpbm9kZV90YWJsZTsKKwl1NjQJCQlkaXJlY3RvcnlfdGFibGU7CisJdW5zaWduZWQgaW50CQlibG9ja19zaXplOworCXVuc2lnbmVkIHNob3J0CQlibG9ja19sb2c7CisJbG9uZyBsb25nCQlieXRlc191c2VkOworCXVuc2lnbmVkIGludAkJaW5vZGVzOworfTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZnMvc3F1YXNoZnMvc3VwZXIuYyBiL2ZzL3NxdWFzaGZzL3N1cGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDcxZGY1YgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3NxdWFzaGZzL3N1cGVyLmMKQEAgLTAsMCArMSw0NDEgQEAKKy8qCisgKiBTcXVhc2hmcyAtIGEgY29tcHJlc3NlZCByZWFkIG9ubHkgZmlsZXN5c3RlbSBmb3IgTGludXgKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgKKyAqIFBoaWxsaXAgTG91Z2hlciA8cGhpbGxpcEBsb3VnaGVyLmRlbW9uLmNvLnVrPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwKKyAqIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICoKKyAqIHN1cGVyLmMKKyAqLworCisvKgorICogVGhpcyBmaWxlIGltcGxlbWVudHMgY29kZSB0byByZWFkIHRoZSBzdXBlcmJsb2NrLCByZWFkIGFuZCBpbml0aWFsaXNlCisgKiBpbi1tZW1vcnkgc3RydWN0dXJlcyBhdCBtb3VudCB0aW1lLCBhbmQgYWxsIHRoZSBWRlMgZ2x1ZSBjb2RlIHRvIHJlZ2lzdGVyCisgKiB0aGUgZmlsZXN5c3RlbS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC92ZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3psaWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tYWdpYy5oPgorCisjaW5jbHVkZSAic3F1YXNoZnNfZnMuaCIKKyNpbmNsdWRlICJzcXVhc2hmc19mc19zYi5oIgorI2luY2x1ZGUgInNxdWFzaGZzX2ZzX2kuaCIKKyNpbmNsdWRlICJzcXVhc2hmcy5oIgorCitzdGF0aWMgc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgc3F1YXNoZnNfZnNfdHlwZTsKK3N0YXRpYyBzdHJ1Y3Qgc3VwZXJfb3BlcmF0aW9ucyBzcXVhc2hmc19zdXBlcl9vcHM7CisKK3N0YXRpYyBpbnQgc3VwcG9ydGVkX3NxdWFzaGZzX2ZpbGVzeXN0ZW0oc2hvcnQgbWFqb3IsIHNob3J0IG1pbm9yLCBzaG9ydCBjb21wKQoreworCWlmIChtYWpvciA8IFNRVUFTSEZTX01BSk9SKSB7CisJCUVSUk9SKCJNYWpvci9NaW5vciBtaXNtYXRjaCwgb2xkZXIgU3F1YXNoZnMgJWQuJWQgIgorCQkJImZpbGVzeXN0ZW1zIGFyZSB1bnN1cHBvcnRlZFxuIiwgbWFqb3IsIG1pbm9yKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfSBlbHNlIGlmIChtYWpvciA+IFNRVUFTSEZTX01BSk9SIHx8IG1pbm9yID4gU1FVQVNIRlNfTUlOT1IpIHsKKwkJRVJST1IoIk1ham9yL01pbm9yIG1pc21hdGNoLCB0cnlpbmcgdG8gbW91bnQgbmV3ZXIgIgorCQkJIiVkLiVkIGZpbGVzeXN0ZW1cbiIsIG1ham9yLCBtaW5vcik7CisJCUVSUk9SKCJQbGVhc2UgdXBkYXRlIHlvdXIga2VybmVsXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKGNvbXAgIT0gWkxJQl9DT01QUkVTU0lPTikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IHNxdWFzaGZzX2ZpbGxfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdm9pZCAqZGF0YSwgaW50IHNpbGVudCkKK3sKKwlzdHJ1Y3Qgc3F1YXNoZnNfc2JfaW5mbyAqbXNibGs7CisJc3RydWN0IHNxdWFzaGZzX3N1cGVyX2Jsb2NrICpzYmxrID0gTlVMTDsKKwljaGFyIGJbQkRFVk5BTUVfU0laRV07CisJc3RydWN0IGlub2RlICpyb290OworCWxvbmcgbG9uZyByb290X2lub2RlOworCXVuc2lnbmVkIHNob3J0IGZsYWdzOworCXVuc2lnbmVkIGludCBmcmFnbWVudHM7CisJdTY0IGxvb2t1cF90YWJsZV9zdGFydDsKKwlpbnQgZXJyOworCisJVFJBQ0UoIkVudGVyZWQgc3F1YXNoZnNfZmlsbF9zdXBlcmJsb2NrXG4iKTsKKworCXNiLT5zX2ZzX2luZm8gPSBremFsbG9jKHNpemVvZigqbXNibGspLCBHRlBfS0VSTkVMKTsKKwlpZiAoc2ItPnNfZnNfaW5mbyA9PSBOVUxMKSB7CisJCUVSUk9SKCJGYWlsZWQgdG8gYWxsb2NhdGUgc3F1YXNoZnNfc2JfaW5mb1xuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwltc2JsayA9IHNiLT5zX2ZzX2luZm87CisKKwltc2Jsay0+c3RyZWFtLndvcmtzcGFjZSA9IGttYWxsb2MoemxpYl9pbmZsYXRlX3dvcmtzcGFjZXNpemUoKSwKKwkJR0ZQX0tFUk5FTCk7CisJaWYgKG1zYmxrLT5zdHJlYW0ud29ya3NwYWNlID09IE5VTEwpIHsKKwkJRVJST1IoIkZhaWxlZCB0byBhbGxvY2F0ZSB6bGliIHdvcmtzcGFjZVxuIik7CisJCWdvdG8gZmFpbHVyZTsKKwl9CisKKwlzYmxrID0ga3phbGxvYyhzaXplb2YoKnNibGspLCBHRlBfS0VSTkVMKTsKKwlpZiAoc2JsayA9PSBOVUxMKSB7CisJCUVSUk9SKCJGYWlsZWQgdG8gYWxsb2NhdGUgc3F1YXNoZnNfc3VwZXJfYmxvY2tcbiIpOworCQlnb3RvIGZhaWx1cmU7CisJfQorCisJbXNibGstPmRldmJsa3NpemUgPSBzYl9taW5fYmxvY2tzaXplKHNiLCBCTE9DS19TSVpFKTsKKwltc2Jsay0+ZGV2Ymxrc2l6ZV9sb2cyID0gZmZ6KH5tc2Jsay0+ZGV2Ymxrc2l6ZSk7CisKKwltdXRleF9pbml0KCZtc2Jsay0+cmVhZF9kYXRhX211dGV4KTsKKwltdXRleF9pbml0KCZtc2Jsay0+bWV0YV9pbmRleF9tdXRleCk7CisKKwkvKgorCSAqIG1zYmxrLT5ieXRlc191c2VkIGlzIGNoZWNrZWQgaW4gc3F1YXNoZnNfcmVhZF90YWJsZSB0byBlbnN1cmUgcmVhZHMKKwkgKiBhcmUgbm90IGJleW9uZCBmaWxlc3lzdGVtIGVuZC4gIEJ1dCBhcyB3ZSdyZSB1c2luZworCSAqIHNxdWFzaGZzX3JlYWRfdGFibGUgaGVyZSB0byByZWFkIHRoZSBzdXBlcmJsb2NrIChpbmNsdWRpbmcgdGhlIHZhbHVlCisJICogb2YgYnl0ZXNfdXNlZCkgd2UgbmVlZCB0byBzZXQgaXQgdG8gYW4gaW5pdGlhbCBzZW5zaWJsZSBkdW1teSB2YWx1ZQorCSAqLworCW1zYmxrLT5ieXRlc191c2VkID0gc2l6ZW9mKCpzYmxrKTsKKwllcnIgPSBzcXVhc2hmc19yZWFkX3RhYmxlKHNiLCBzYmxrLCBTUVVBU0hGU19TVEFSVCwgc2l6ZW9mKCpzYmxrKSk7CisKKwlpZiAoZXJyIDwgMCkgeworCQlFUlJPUigidW5hYmxlIHRvIHJlYWQgc3F1YXNoZnNfc3VwZXJfYmxvY2tcbiIpOworCQlnb3RvIGZhaWxlZF9tb3VudDsKKwl9CisKKwkvKiBDaGVjayBpdCBpcyBhIFNRVUFTSEZTIHN1cGVyYmxvY2sgKi8KKwlzYi0+c19tYWdpYyA9IGxlMzJfdG9fY3B1KHNibGstPnNfbWFnaWMpOworCWlmIChzYi0+c19tYWdpYyAhPSBTUVVBU0hGU19NQUdJQykgeworCQlpZiAoIXNpbGVudCkKKwkJCUVSUk9SKCJDYW4ndCBmaW5kIGEgU1FVQVNIRlMgc3VwZXJibG9jayBvbiAlc1xuIiwKKwkJCQkJCWJkZXZuYW1lKHNiLT5zX2JkZXYsIGIpKTsKKwkJZXJyID0gLUVJTlZBTDsKKwkJZ290byBmYWlsZWRfbW91bnQ7CisJfQorCisJLyogQ2hlY2sgdGhlIE1BSk9SICYgTUlOT1IgdmVyc2lvbnMgYW5kIGNvbXByZXNzaW9uIHR5cGUgKi8KKwllcnIgPSBzdXBwb3J0ZWRfc3F1YXNoZnNfZmlsZXN5c3RlbShsZTE2X3RvX2NwdShzYmxrLT5zX21ham9yKSwKKwkJCWxlMTZfdG9fY3B1KHNibGstPnNfbWlub3IpLAorCQkJbGUxNl90b19jcHUoc2Jsay0+Y29tcHJlc3Npb24pKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBmYWlsZWRfbW91bnQ7CisKKwllcnIgPSAtRUlOVkFMOworCisJLyoKKwkgKiBDaGVjayBpZiB0aGVyZSdzIHhhdHRycyBpbiB0aGUgZmlsZXN5c3RlbS4gIFRoZXNlIGFyZSBub3QKKwkgKiBzdXBwb3J0ZWQgaW4gdGhpcyB2ZXJzaW9uLCBzbyB3YXJuIHRoYXQgdGhleSB3aWxsIGJlIGlnbm9yZWQuCisJICovCisJaWYgKGxlNjRfdG9fY3B1KHNibGstPnhhdHRyX3RhYmxlX3N0YXJ0KSAhPSBTUVVBU0hGU19JTlZBTElEX0JMSykKKwkJRVJST1IoIlhhdHRycyBpbiBmaWxlc3lzdGVtLCB0aGVzZSB3aWxsIGJlIGlnbm9yZWRcbiIpOworCisJLyogQ2hlY2sgdGhlIGZpbGVzeXN0ZW0gZG9lcyBub3QgZXh0ZW5kIGJleW9uZCB0aGUgZW5kIG9mIHRoZQorCSAgIGJsb2NrIGRldmljZSAqLworCW1zYmxrLT5ieXRlc191c2VkID0gbGU2NF90b19jcHUoc2Jsay0+Ynl0ZXNfdXNlZCk7CisJaWYgKG1zYmxrLT5ieXRlc191c2VkIDwgMCB8fCBtc2Jsay0+Ynl0ZXNfdXNlZCA+CisJCQlpX3NpemVfcmVhZChzYi0+c19iZGV2LT5iZF9pbm9kZSkpCisJCWdvdG8gZmFpbGVkX21vdW50OworCisJLyogQ2hlY2sgYmxvY2sgc2l6ZSBmb3Igc2FuaXR5ICovCisJbXNibGstPmJsb2NrX3NpemUgPSBsZTMyX3RvX2NwdShzYmxrLT5ibG9ja19zaXplKTsKKwlpZiAobXNibGstPmJsb2NrX3NpemUgPiBTUVVBU0hGU19GSUxFX01BWF9TSVpFKQorCQlnb3RvIGZhaWxlZF9tb3VudDsKKworCW1zYmxrLT5ibG9ja19sb2cgPSBsZTE2X3RvX2NwdShzYmxrLT5ibG9ja19sb2cpOworCWlmIChtc2Jsay0+YmxvY2tfbG9nID4gU1FVQVNIRlNfRklMRV9NQVhfTE9HKQorCQlnb3RvIGZhaWxlZF9tb3VudDsKKworCS8qIENoZWNrIHRoZSByb290IGlub2RlIGZvciBzYW5pdHkgKi8KKwlyb290X2lub2RlID0gbGU2NF90b19jcHUoc2Jsay0+cm9vdF9pbm9kZSk7CisJaWYgKFNRVUFTSEZTX0lOT0RFX09GRlNFVChyb290X2lub2RlKSA+IFNRVUFTSEZTX01FVEFEQVRBX1NJWkUpCisJCWdvdG8gZmFpbGVkX21vdW50OworCisJbXNibGstPmlub2RlX3RhYmxlID0gbGU2NF90b19jcHUoc2Jsay0+aW5vZGVfdGFibGVfc3RhcnQpOworCW1zYmxrLT5kaXJlY3RvcnlfdGFibGUgPSBsZTY0X3RvX2NwdShzYmxrLT5kaXJlY3RvcnlfdGFibGVfc3RhcnQpOworCW1zYmxrLT5pbm9kZXMgPSBsZTMyX3RvX2NwdShzYmxrLT5pbm9kZXMpOworCWZsYWdzID0gbGUxNl90b19jcHUoc2Jsay0+ZmxhZ3MpOworCisJVFJBQ0UoIkZvdW5kIHZhbGlkIHN1cGVyYmxvY2sgb24gJXNcbiIsIGJkZXZuYW1lKHNiLT5zX2JkZXYsIGIpKTsKKwlUUkFDRSgiSW5vZGVzIGFyZSAlc2NvbXByZXNzZWRcbiIsIFNRVUFTSEZTX1VOQ09NUFJFU1NFRF9JTk9ERVMoZmxhZ3MpCisJCQkJPyAidW4iIDogIiIpOworCVRSQUNFKCJEYXRhIGlzICVzY29tcHJlc3NlZFxuIiwgU1FVQVNIRlNfVU5DT01QUkVTU0VEX0RBVEEoZmxhZ3MpCisJCQkJPyAidW4iIDogIiIpOworCVRSQUNFKCJGaWxlc3lzdGVtIHNpemUgJWxsZCBieXRlc1xuIiwgbXNibGstPmJ5dGVzX3VzZWQpOworCVRSQUNFKCJCbG9jayBzaXplICVkXG4iLCBtc2Jsay0+YmxvY2tfc2l6ZSk7CisJVFJBQ0UoIk51bWJlciBvZiBpbm9kZXMgJWRcbiIsIG1zYmxrLT5pbm9kZXMpOworCVRSQUNFKCJOdW1iZXIgb2YgZnJhZ21lbnRzICVkXG4iLCBsZTMyX3RvX2NwdShzYmxrLT5mcmFnbWVudHMpKTsKKwlUUkFDRSgiTnVtYmVyIG9mIGlkcyAlZFxuIiwgbGUxNl90b19jcHUoc2Jsay0+bm9faWRzKSk7CisJVFJBQ0UoInNibGstPmlub2RlX3RhYmxlX3N0YXJ0ICVsbHhcbiIsIG1zYmxrLT5pbm9kZV90YWJsZSk7CisJVFJBQ0UoInNibGstPmRpcmVjdG9yeV90YWJsZV9zdGFydCAlbGx4XG4iLCBtc2Jsay0+ZGlyZWN0b3J5X3RhYmxlKTsKKwlUUkFDRSgic2Jsay0+ZnJhZ21lbnRfdGFibGVfc3RhcnQgJWxseFxuIiwKKwkJKHU2NCkgbGU2NF90b19jcHUoc2Jsay0+ZnJhZ21lbnRfdGFibGVfc3RhcnQpKTsKKwlUUkFDRSgic2Jsay0+aWRfdGFibGVfc3RhcnQgJWxseFxuIiwKKwkJKHU2NCkgbGU2NF90b19jcHUoc2Jsay0+aWRfdGFibGVfc3RhcnQpKTsKKworCXNiLT5zX21heGJ5dGVzID0gTUFYX0xGU19GSUxFU0laRTsKKwlzYi0+c19mbGFncyB8PSBNU19SRE9OTFk7CisJc2ItPnNfb3AgPSAmc3F1YXNoZnNfc3VwZXJfb3BzOworCisJZXJyID0gLUVOT01FTTsKKworCW1zYmxrLT5ibG9ja19jYWNoZSA9IHNxdWFzaGZzX2NhY2hlX2luaXQoIm1ldGFkYXRhIiwKKwkJCVNRVUFTSEZTX0NBQ0hFRF9CTEtTLCBTUVVBU0hGU19NRVRBREFUQV9TSVpFKTsKKwlpZiAobXNibGstPmJsb2NrX2NhY2hlID09IE5VTEwpCisJCWdvdG8gZmFpbGVkX21vdW50OworCisJLyogQWxsb2NhdGUgcmVhZF9wYWdlIGJsb2NrICovCisJbXNibGstPnJlYWRfcGFnZSA9IHNxdWFzaGZzX2NhY2hlX2luaXQoImRhdGEiLCAxLCBtc2Jsay0+YmxvY2tfc2l6ZSk7CisJaWYgKG1zYmxrLT5yZWFkX3BhZ2UgPT0gTlVMTCkgeworCQlFUlJPUigiRmFpbGVkIHRvIGFsbG9jYXRlIHJlYWRfcGFnZSBibG9ja1xuIik7CisJCWdvdG8gZmFpbGVkX21vdW50OworCX0KKworCS8qIEFsbG9jYXRlIGFuZCByZWFkIGlkIGluZGV4IHRhYmxlICovCisJbXNibGstPmlkX3RhYmxlID0gc3F1YXNoZnNfcmVhZF9pZF9pbmRleF90YWJsZShzYiwKKwkJbGU2NF90b19jcHUoc2Jsay0+aWRfdGFibGVfc3RhcnQpLCBsZTE2X3RvX2NwdShzYmxrLT5ub19pZHMpKTsKKwlpZiAoSVNfRVJSKG1zYmxrLT5pZF90YWJsZSkpIHsKKwkJZXJyID0gUFRSX0VSUihtc2Jsay0+aWRfdGFibGUpOworCQltc2Jsay0+aWRfdGFibGUgPSBOVUxMOworCQlnb3RvIGZhaWxlZF9tb3VudDsKKwl9CisKKwlmcmFnbWVudHMgPSBsZTMyX3RvX2NwdShzYmxrLT5mcmFnbWVudHMpOworCWlmIChmcmFnbWVudHMgPT0gMCkKKwkJZ290byBhbGxvY2F0ZV9sb29rdXBfdGFibGU7CisKKwltc2Jsay0+ZnJhZ21lbnRfY2FjaGUgPSBzcXVhc2hmc19jYWNoZV9pbml0KCJmcmFnbWVudCIsCisJCVNRVUFTSEZTX0NBQ0hFRF9GUkFHTUVOVFMsIG1zYmxrLT5ibG9ja19zaXplKTsKKwlpZiAobXNibGstPmZyYWdtZW50X2NhY2hlID09IE5VTEwpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBmYWlsZWRfbW91bnQ7CisJfQorCisJLyogQWxsb2NhdGUgYW5kIHJlYWQgZnJhZ21lbnQgaW5kZXggdGFibGUgKi8KKwltc2Jsay0+ZnJhZ21lbnRfaW5kZXggPSBzcXVhc2hmc19yZWFkX2ZyYWdtZW50X2luZGV4X3RhYmxlKHNiLAorCQlsZTY0X3RvX2NwdShzYmxrLT5mcmFnbWVudF90YWJsZV9zdGFydCksIGZyYWdtZW50cyk7CisJaWYgKElTX0VSUihtc2Jsay0+ZnJhZ21lbnRfaW5kZXgpKSB7CisJCWVyciA9IFBUUl9FUlIobXNibGstPmZyYWdtZW50X2luZGV4KTsKKwkJbXNibGstPmZyYWdtZW50X2luZGV4ID0gTlVMTDsKKwkJZ290byBmYWlsZWRfbW91bnQ7CisJfQorCithbGxvY2F0ZV9sb29rdXBfdGFibGU6CisJbG9va3VwX3RhYmxlX3N0YXJ0ID0gbGU2NF90b19jcHUoc2Jsay0+bG9va3VwX3RhYmxlX3N0YXJ0KTsKKwlpZiAobG9va3VwX3RhYmxlX3N0YXJ0ID09IFNRVUFTSEZTX0lOVkFMSURfQkxLKQorCQlnb3RvIGFsbG9jYXRlX3Jvb3Q7CisKKwkvKiBBbGxvY2F0ZSBhbmQgcmVhZCBpbm9kZSBsb29rdXAgdGFibGUgKi8KKwltc2Jsay0+aW5vZGVfbG9va3VwX3RhYmxlID0gc3F1YXNoZnNfcmVhZF9pbm9kZV9sb29rdXBfdGFibGUoc2IsCisJCWxvb2t1cF90YWJsZV9zdGFydCwgbXNibGstPmlub2Rlcyk7CisJaWYgKElTX0VSUihtc2Jsay0+aW5vZGVfbG9va3VwX3RhYmxlKSkgeworCQllcnIgPSBQVFJfRVJSKG1zYmxrLT5pbm9kZV9sb29rdXBfdGFibGUpOworCQltc2Jsay0+aW5vZGVfbG9va3VwX3RhYmxlID0gTlVMTDsKKwkJZ290byBmYWlsZWRfbW91bnQ7CisJfQorCisJc2ItPnNfZXhwb3J0X29wID0gJnNxdWFzaGZzX2V4cG9ydF9vcHM7CisKK2FsbG9jYXRlX3Jvb3Q6CisJcm9vdCA9IG5ld19pbm9kZShzYik7CisJaWYgKCFyb290KSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZmFpbGVkX21vdW50OworCX0KKworCWVyciA9IHNxdWFzaGZzX3JlYWRfaW5vZGUocm9vdCwgcm9vdF9pbm9kZSk7CisJaWYgKGVycikgeworCQlpZ2V0X2ZhaWxlZChyb290KTsKKwkJZ290byBmYWlsZWRfbW91bnQ7CisJfQorCWluc2VydF9pbm9kZV9oYXNoKHJvb3QpOworCisJc2ItPnNfcm9vdCA9IGRfYWxsb2Nfcm9vdChyb290KTsKKwlpZiAoc2ItPnNfcm9vdCA9PSBOVUxMKSB7CisJCUVSUk9SKCJSb290IGlub2RlIGNyZWF0ZSBmYWlsZWRcbiIpOworCQllcnIgPSAtRU5PTUVNOworCQlpcHV0KHJvb3QpOworCQlnb3RvIGZhaWxlZF9tb3VudDsKKwl9CisKKwlUUkFDRSgiTGVhdmluZyBzcXVhc2hmc19maWxsX3N1cGVyXG4iKTsKKwlrZnJlZShzYmxrKTsKKwlyZXR1cm4gMDsKKworZmFpbGVkX21vdW50OgorCXNxdWFzaGZzX2NhY2hlX2RlbGV0ZShtc2Jsay0+YmxvY2tfY2FjaGUpOworCXNxdWFzaGZzX2NhY2hlX2RlbGV0ZShtc2Jsay0+ZnJhZ21lbnRfY2FjaGUpOworCXNxdWFzaGZzX2NhY2hlX2RlbGV0ZShtc2Jsay0+cmVhZF9wYWdlKTsKKwlrZnJlZShtc2Jsay0+aW5vZGVfbG9va3VwX3RhYmxlKTsKKwlrZnJlZShtc2Jsay0+ZnJhZ21lbnRfaW5kZXgpOworCWtmcmVlKG1zYmxrLT5pZF90YWJsZSk7CisJa2ZyZWUobXNibGstPnN0cmVhbS53b3Jrc3BhY2UpOworCWtmcmVlKHNiLT5zX2ZzX2luZm8pOworCXNiLT5zX2ZzX2luZm8gPSBOVUxMOworCWtmcmVlKHNibGspOworCXJldHVybiBlcnI7CisKK2ZhaWx1cmU6CisJa2ZyZWUobXNibGstPnN0cmVhbS53b3Jrc3BhY2UpOworCWtmcmVlKHNiLT5zX2ZzX2luZm8pOworCXNiLT5zX2ZzX2luZm8gPSBOVUxMOworCXJldHVybiAtRU5PTUVNOworfQorCisKK3N0YXRpYyBpbnQgc3F1YXNoZnNfc3RhdGZzKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGtzdGF0ZnMgKmJ1ZikKK3sKKwlzdHJ1Y3Qgc3F1YXNoZnNfc2JfaW5mbyAqbXNibGsgPSBkZW50cnktPmRfc2ItPnNfZnNfaW5mbzsKKworCVRSQUNFKCJFbnRlcmVkIHNxdWFzaGZzX3N0YXRmc1xuIik7CisKKwlidWYtPmZfdHlwZSA9IFNRVUFTSEZTX01BR0lDOworCWJ1Zi0+Zl9ic2l6ZSA9IG1zYmxrLT5ibG9ja19zaXplOworCWJ1Zi0+Zl9ibG9ja3MgPSAoKG1zYmxrLT5ieXRlc191c2VkIC0gMSkgPj4gbXNibGstPmJsb2NrX2xvZykgKyAxOworCWJ1Zi0+Zl9iZnJlZSA9IGJ1Zi0+Zl9iYXZhaWwgPSAwOworCWJ1Zi0+Zl9maWxlcyA9IG1zYmxrLT5pbm9kZXM7CisJYnVmLT5mX2ZmcmVlID0gMDsKKwlidWYtPmZfbmFtZWxlbiA9IFNRVUFTSEZTX05BTUVfTEVOOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBzcXVhc2hmc19yZW1vdW50KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCAqZmxhZ3MsIGNoYXIgKmRhdGEpCit7CisJKmZsYWdzIHw9IE1TX1JET05MWTsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgdm9pZCBzcXVhc2hmc19wdXRfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlpZiAoc2ItPnNfZnNfaW5mbykgeworCQlzdHJ1Y3Qgc3F1YXNoZnNfc2JfaW5mbyAqc2JpID0gc2ItPnNfZnNfaW5mbzsKKwkJc3F1YXNoZnNfY2FjaGVfZGVsZXRlKHNiaS0+YmxvY2tfY2FjaGUpOworCQlzcXVhc2hmc19jYWNoZV9kZWxldGUoc2JpLT5mcmFnbWVudF9jYWNoZSk7CisJCXNxdWFzaGZzX2NhY2hlX2RlbGV0ZShzYmktPnJlYWRfcGFnZSk7CisJCWtmcmVlKHNiaS0+aWRfdGFibGUpOworCQlrZnJlZShzYmktPmZyYWdtZW50X2luZGV4KTsKKwkJa2ZyZWUoc2JpLT5tZXRhX2luZGV4KTsKKwkJa2ZyZWUoc2JpLT5zdHJlYW0ud29ya3NwYWNlKTsKKwkJa2ZyZWUoc2ItPnNfZnNfaW5mbyk7CisJCXNiLT5zX2ZzX2luZm8gPSBOVUxMOworCX0KK30KKworCitzdGF0aWMgaW50IHNxdWFzaGZzX2dldF9zYihzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZnNfdHlwZSwgaW50IGZsYWdzLAorCQkJCWNvbnN0IGNoYXIgKmRldl9uYW1lLCB2b2lkICpkYXRhLAorCQkJCXN0cnVjdCB2ZnNtb3VudCAqbW50KQoreworCXJldHVybiBnZXRfc2JfYmRldihmc190eXBlLCBmbGFncywgZGV2X25hbWUsIGRhdGEsIHNxdWFzaGZzX2ZpbGxfc3VwZXIsCisJCQkJbW50KTsKK30KKworCitzdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKnNxdWFzaGZzX2lub2RlX2NhY2hlcDsKKworCitzdGF0aWMgdm9pZCBpbml0X29uY2Uodm9pZCAqZm9vKQoreworCXN0cnVjdCBzcXVhc2hmc19pbm9kZV9pbmZvICplaSA9IGZvbzsKKworCWlub2RlX2luaXRfb25jZSgmZWktPnZmc19pbm9kZSk7Cit9CisKKworc3RhdGljIGludCBfX2luaXQgaW5pdF9pbm9kZWNhY2hlKHZvaWQpCit7CisJc3F1YXNoZnNfaW5vZGVfY2FjaGVwID0ga21lbV9jYWNoZV9jcmVhdGUoInNxdWFzaGZzX2lub2RlX2NhY2hlIiwKKwkJc2l6ZW9mKHN0cnVjdCBzcXVhc2hmc19pbm9kZV9pbmZvKSwgMCwKKwkJU0xBQl9IV0NBQ0hFX0FMSUdOfFNMQUJfUkVDTEFJTV9BQ0NPVU5ULCBpbml0X29uY2UpOworCisJcmV0dXJuIHNxdWFzaGZzX2lub2RlX2NhY2hlcCA/IDAgOiAtRU5PTUVNOworfQorCisKK3N0YXRpYyB2b2lkIGRlc3Ryb3lfaW5vZGVjYWNoZSh2b2lkKQoreworCWttZW1fY2FjaGVfZGVzdHJveShzcXVhc2hmc19pbm9kZV9jYWNoZXApOworfQorCisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfc3F1YXNoZnNfZnModm9pZCkKK3sKKwlpbnQgZXJyID0gaW5pdF9pbm9kZWNhY2hlKCk7CisKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJZXJyID0gcmVnaXN0ZXJfZmlsZXN5c3RlbSgmc3F1YXNoZnNfZnNfdHlwZSk7CisJaWYgKGVycikgeworCQlkZXN0cm95X2lub2RlY2FjaGUoKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlwcmludGsoS0VSTl9JTkZPICJzcXVhc2hmczogdmVyc2lvbiA0LjAgKDIwMDkvMDEvMDMpICIKKwkJIlBoaWxsaXAgTG91Z2hlclxuIik7CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgdm9pZCBfX2V4aXQgZXhpdF9zcXVhc2hmc19mcyh2b2lkKQoreworCXVucmVnaXN0ZXJfZmlsZXN5c3RlbSgmc3F1YXNoZnNfZnNfdHlwZSk7CisJZGVzdHJveV9pbm9kZWNhY2hlKCk7Cit9CisKKworc3RhdGljIHN0cnVjdCBpbm9kZSAqc3F1YXNoZnNfYWxsb2NfaW5vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlzdHJ1Y3Qgc3F1YXNoZnNfaW5vZGVfaW5mbyAqZWkgPQorCQlrbWVtX2NhY2hlX2FsbG9jKHNxdWFzaGZzX2lub2RlX2NhY2hlcCwgR0ZQX0tFUk5FTCk7CisKKwlyZXR1cm4gZWkgPyAmZWktPnZmc19pbm9kZSA6IE5VTEw7Cit9CisKKworc3RhdGljIHZvaWQgc3F1YXNoZnNfZGVzdHJveV9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCWttZW1fY2FjaGVfZnJlZShzcXVhc2hmc19pbm9kZV9jYWNoZXAsIHNxdWFzaGZzX2koaW5vZGUpKTsKK30KKworCitzdGF0aWMgc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgc3F1YXNoZnNfZnNfdHlwZSA9IHsKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkubmFtZSA9ICJzcXVhc2hmcyIsCisJLmdldF9zYiA9IHNxdWFzaGZzX2dldF9zYiwKKwkua2lsbF9zYiA9IGtpbGxfYmxvY2tfc3VwZXIsCisJLmZzX2ZsYWdzID0gRlNfUkVRVUlSRVNfREVWCit9OworCitzdGF0aWMgc3RydWN0IHN1cGVyX29wZXJhdGlvbnMgc3F1YXNoZnNfc3VwZXJfb3BzID0geworCS5hbGxvY19pbm9kZSA9IHNxdWFzaGZzX2FsbG9jX2lub2RlLAorCS5kZXN0cm95X2lub2RlID0gc3F1YXNoZnNfZGVzdHJveV9pbm9kZSwKKwkuc3RhdGZzID0gc3F1YXNoZnNfc3RhdGZzLAorCS5wdXRfc3VwZXIgPSBzcXVhc2hmc19wdXRfc3VwZXIsCisJLnJlbW91bnRfZnMgPSBzcXVhc2hmc19yZW1vdW50Cit9OworCittb2R1bGVfaW5pdChpbml0X3NxdWFzaGZzX2ZzKTsKK21vZHVsZV9leGl0KGV4aXRfc3F1YXNoZnNfZnMpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJzcXVhc2hmcyA0LjAsIGEgY29tcHJlc3NlZCByZWFkLW9ubHkgZmlsZXN5c3RlbSIpOworTU9EVUxFX0FVVEhPUigiUGhpbGxpcCBMb3VnaGVyIDxwaGlsbGlwQGxvdWdoZXIuZGVtb24uY28udWs+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9mcy9zcXVhc2hmcy9zeW1saW5rLmMgYi9mcy9zcXVhc2hmcy9zeW1saW5rLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODNkODc4OAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3NxdWFzaGZzL3N5bWxpbmsuYwpAQCAtMCwwICsxLDExOCBAQAorLyoKKyAqIFNxdWFzaGZzIC0gYSBjb21wcmVzc2VkIHJlYWQgb25seSBmaWxlc3lzdGVtIGZvciBMaW51eAorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOAorICogUGhpbGxpcCBMb3VnaGVyIDxwaGlsbGlwQGxvdWdoZXIuZGVtb24uY28udWs+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLAorICogb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKgorICogc3ltbGluay5jCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSBpbXBsZW1lbnRzIGNvZGUgdG8gaGFuZGxlIHN5bWJvbGljIGxpbmtzLgorICoKKyAqIFRoZSBkYXRhIGNvbnRlbnRzIG9mIHN5bWJvbGljIGxpbmtzIGFyZSBzdG9yZWQgaW5zaWRlIHRoZSBzeW1ib2xpYworICogbGluayBpbm9kZSB3aXRoaW4gdGhlIGlub2RlIHRhYmxlLiAgVGhpcyBhbGxvd3MgdGhlIG5vcm1hbGx5IHNtYWxsIHN5bWJvbGljCisgKiBsaW5rIHRvIGJlIGNvbXByZXNzZWQgYXMgcGFydCBvZiB0aGUgaW5vZGUgdGFibGUsIGFjaGlldmluZyBtdWNoIGdyZWF0ZXIKKyAqIGNvbXByZXNzaW9uIHRoYW4gaWYgdGhlIHN5bWJvbGljIGxpbmsgd2FzIGNvbXByZXNzZWQgaW5kaXZpZHVhbGx5LgorICovCisKKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3Zmcy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisjaW5jbHVkZSA8bGludXgvemxpYi5oPgorCisjaW5jbHVkZSAic3F1YXNoZnNfZnMuaCIKKyNpbmNsdWRlICJzcXVhc2hmc19mc19zYi5oIgorI2luY2x1ZGUgInNxdWFzaGZzX2ZzX2kuaCIKKyNpbmNsdWRlICJzcXVhc2hmcy5oIgorCitzdGF0aWMgaW50IHNxdWFzaGZzX3N5bWxpbmtfcmVhZHBhZ2Uoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBwYWdlICpwYWdlKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBwYWdlLT5tYXBwaW5nLT5ob3N0OworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBpbm9kZS0+aV9zYjsKKwlzdHJ1Y3Qgc3F1YXNoZnNfc2JfaW5mbyAqbXNibGsgPSBzYi0+c19mc19pbmZvOworCWludCBpbmRleCA9IHBhZ2UtPmluZGV4IDw8IFBBR0VfQ0FDSEVfU0hJRlQ7CisJdTY0IGJsb2NrID0gc3F1YXNoZnNfaShpbm9kZSktPnN0YXJ0OworCWludCBvZmZzZXQgPSBzcXVhc2hmc19pKGlub2RlKS0+b2Zmc2V0OworCWludCBsZW5ndGggPSBtaW5fdChpbnQsIGlfc2l6ZV9yZWFkKGlub2RlKSAtIGluZGV4LCBQQUdFX0NBQ0hFX1NJWkUpOworCWludCBieXRlcywgY29waWVkOworCXZvaWQgKnBhZ2VhZGRyOworCXN0cnVjdCBzcXVhc2hmc19jYWNoZV9lbnRyeSAqZW50cnk7CisKKwlUUkFDRSgiRW50ZXJlZCBzcXVhc2hmc19zeW1saW5rX3JlYWRwYWdlLCBwYWdlIGluZGV4ICVsZCwgc3RhcnQgYmxvY2sgIgorCQkJIiVsbHgsIG9mZnNldCAleFxuIiwgcGFnZS0+aW5kZXgsIGJsb2NrLCBvZmZzZXQpOworCisJLyoKKwkgKiBTa2lwIGluZGV4IGJ5dGVzIGludG8gc3ltbGluayBtZXRhZGF0YS4KKwkgKi8KKwlpZiAoaW5kZXgpIHsKKwkJYnl0ZXMgPSBzcXVhc2hmc19yZWFkX21ldGFkYXRhKHNiLCBOVUxMLCAmYmxvY2ssICZvZmZzZXQsCisJCQkJCQkJCWluZGV4KTsKKwkJaWYgKGJ5dGVzIDwgMCkgeworCQkJRVJST1IoIlVuYWJsZSB0byByZWFkIHN5bWxpbmsgWyVsbHg6JXhdXG4iLAorCQkJCXNxdWFzaGZzX2koaW5vZGUpLT5zdGFydCwKKwkJCQlzcXVhc2hmc19pKGlub2RlKS0+b2Zmc2V0KTsKKwkJCWdvdG8gZXJyb3Jfb3V0OworCQl9CisJfQorCisJLyoKKwkgKiBSZWFkIGxlbmd0aCBieXRlcyBmcm9tIHN5bWxpbmsgbWV0YWRhdGEuICBTcXVhc2hmc19yZWFkX21ldGFkYXRhCisJICogaXMgbm90IHVzZWQgaGVyZSBiZWNhdXNlIGl0IGNhbiBzbGVlcCBhbmQgd2Ugd2FudCB0byB1c2UKKwkgKiBrbWFwX2F0b21pYyB0byBtYXAgdGhlIHBhZ2UuICBJbnN0ZWFkIGNhbGwgdGhlIHVuZGVybHlpbmcKKwkgKiBzcXVhc2hmc19jYWNoZV9nZXQgcm91dGluZS4gIEFzIGxlbmd0aCBieXRlcyBtYXkgb3ZlcmxhcCBtZXRhZGF0YQorCSAqIGJsb2Nrcywgd2UgbWF5IG5lZWQgdG8gY2FsbCBzcXVhc2hmc19jYWNoZV9nZXQgbXVsdGlwbGUgdGltZXMuCisJICovCisJZm9yIChieXRlcyA9IDA7IGJ5dGVzIDwgbGVuZ3RoOyBvZmZzZXQgPSAwLCBieXRlcyArPSBjb3BpZWQpIHsKKwkJZW50cnkgPSBzcXVhc2hmc19jYWNoZV9nZXQoc2IsIG1zYmxrLT5ibG9ja19jYWNoZSwgYmxvY2ssIDApOworCQlpZiAoZW50cnktPmVycm9yKSB7CisJCQlFUlJPUigiVW5hYmxlIHRvIHJlYWQgc3ltbGluayBbJWxseDoleF1cbiIsCisJCQkJc3F1YXNoZnNfaShpbm9kZSktPnN0YXJ0LAorCQkJCXNxdWFzaGZzX2koaW5vZGUpLT5vZmZzZXQpOworCQkJc3F1YXNoZnNfY2FjaGVfcHV0KGVudHJ5KTsKKwkJCWdvdG8gZXJyb3Jfb3V0OworCQl9CisKKwkJcGFnZWFkZHIgPSBrbWFwX2F0b21pYyhwYWdlLCBLTV9VU0VSMCk7CisJCWNvcGllZCA9IHNxdWFzaGZzX2NvcHlfZGF0YShwYWdlYWRkciArIGJ5dGVzLCBlbnRyeSwgb2Zmc2V0LAorCQkJCQkJCQlsZW5ndGggLSBieXRlcyk7CisJCWlmIChjb3BpZWQgPT0gbGVuZ3RoIC0gYnl0ZXMpCisJCQltZW1zZXQocGFnZWFkZHIgKyBsZW5ndGgsIDAsIFBBR0VfQ0FDSEVfU0laRSAtIGxlbmd0aCk7CisJCWVsc2UKKwkJCWJsb2NrID0gZW50cnktPm5leHRfaW5kZXg7CisJCWt1bm1hcF9hdG9taWMocGFnZWFkZHIsIEtNX1VTRVIwKTsKKwkJc3F1YXNoZnNfY2FjaGVfcHV0KGVudHJ5KTsKKwl9CisKKwlmbHVzaF9kY2FjaGVfcGFnZShwYWdlKTsKKwlTZXRQYWdlVXB0b2RhdGUocGFnZSk7CisJdW5sb2NrX3BhZ2UocGFnZSk7CisJcmV0dXJuIDA7CisKK2Vycm9yX291dDoKKwlTZXRQYWdlRXJyb3IocGFnZSk7CisJdW5sb2NrX3BhZ2UocGFnZSk7CisJcmV0dXJuIDA7Cit9CisKKworY29uc3Qgc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyBzcXVhc2hmc19zeW1saW5rX2FvcHMgPSB7CisJLnJlYWRwYWdlID0gc3F1YXNoZnNfc3ltbGlua19yZWFkcGFnZQorfTsKZGlmZiAtLWdpdCBhL2ZzL3N0YXQuYyBiL2ZzL3N0YXQuYwppbmRleCA3ZTEyYTZmOC4uMmRiNzQwYSAxMDA2NDQKLS0tIGEvZnMvc3RhdC5jCisrKyBiL2ZzL3N0YXQuYwpAQCAtMTUyLDcgKzE1Miw3IEBACiAJcmV0dXJuIGNvcHlfdG9fdXNlcihzdGF0YnVmLCZ0bXAsc2l6ZW9mKHRtcCkpID8gLUVGQVVMVCA6IDA7CiB9CiAKLWFzbWxpbmthZ2UgbG9uZyBzeXNfc3RhdChjaGFyIF9fdXNlciAqIGZpbGVuYW1lLCBzdHJ1Y3QgX19vbGRfa2VybmVsX3N0YXQgX191c2VyICogc3RhdGJ1ZikKK1NZU0NBTExfREVGSU5FMihzdGF0LCBjaGFyIF9fdXNlciAqLCBmaWxlbmFtZSwgc3RydWN0IF9fb2xkX2tlcm5lbF9zdGF0IF9fdXNlciAqLCBzdGF0YnVmKQogewogCXN0cnVjdCBrc3RhdCBzdGF0OwogCWludCBlcnJvciA9IHZmc19zdGF0X2ZkKEFUX0ZEQ1dELCBmaWxlbmFtZSwgJnN0YXQpOwpAQCAtMTYyLDcgKzE2Miw4IEBACiAKIAlyZXR1cm4gZXJyb3I7CiB9Ci1hc21saW5rYWdlIGxvbmcgc3lzX2xzdGF0KGNoYXIgX191c2VyICogZmlsZW5hbWUsIHN0cnVjdCBfX29sZF9rZXJuZWxfc3RhdCBfX3VzZXIgKiBzdGF0YnVmKQorCitTWVNDQUxMX0RFRklORTIobHN0YXQsIGNoYXIgX191c2VyICosIGZpbGVuYW1lLCBzdHJ1Y3QgX19vbGRfa2VybmVsX3N0YXQgX191c2VyICosIHN0YXRidWYpCiB7CiAJc3RydWN0IGtzdGF0IHN0YXQ7CiAJaW50IGVycm9yID0gdmZzX2xzdGF0X2ZkKEFUX0ZEQ1dELCBmaWxlbmFtZSwgJnN0YXQpOwpAQCAtMTcyLDcgKzE3Myw4IEBACiAKIAlyZXR1cm4gZXJyb3I7CiB9Ci1hc21saW5rYWdlIGxvbmcgc3lzX2ZzdGF0KHVuc2lnbmVkIGludCBmZCwgc3RydWN0IF9fb2xkX2tlcm5lbF9zdGF0IF9fdXNlciAqIHN0YXRidWYpCisKK1NZU0NBTExfREVGSU5FMihmc3RhdCwgdW5zaWduZWQgaW50LCBmZCwgc3RydWN0IF9fb2xkX2tlcm5lbF9zdGF0IF9fdXNlciAqLCBzdGF0YnVmKQogewogCXN0cnVjdCBrc3RhdCBzdGF0OwogCWludCBlcnJvciA9IHZmc19mc3RhdChmZCwgJnN0YXQpOwpAQCAtMjM1LDcgKzIzNyw3IEBACiAJcmV0dXJuIGNvcHlfdG9fdXNlcihzdGF0YnVmLCZ0bXAsc2l6ZW9mKHRtcCkpID8gLUVGQVVMVCA6IDA7CiB9CiAKLWFzbWxpbmthZ2UgbG9uZyBzeXNfbmV3c3RhdChjaGFyIF9fdXNlciAqZmlsZW5hbWUsIHN0cnVjdCBzdGF0IF9fdXNlciAqc3RhdGJ1ZikKK1NZU0NBTExfREVGSU5FMihuZXdzdGF0LCBjaGFyIF9fdXNlciAqLCBmaWxlbmFtZSwgc3RydWN0IHN0YXQgX191c2VyICosIHN0YXRidWYpCiB7CiAJc3RydWN0IGtzdGF0IHN0YXQ7CiAJaW50IGVycm9yID0gdmZzX3N0YXRfZmQoQVRfRkRDV0QsIGZpbGVuYW1lLCAmc3RhdCk7CkBAIC0yNDYsNyArMjQ4LDcgQEAKIAlyZXR1cm4gZXJyb3I7CiB9CiAKLWFzbWxpbmthZ2UgbG9uZyBzeXNfbmV3bHN0YXQoY2hhciBfX3VzZXIgKmZpbGVuYW1lLCBzdHJ1Y3Qgc3RhdCBfX3VzZXIgKnN0YXRidWYpCitTWVNDQUxMX0RFRklORTIobmV3bHN0YXQsIGNoYXIgX191c2VyICosIGZpbGVuYW1lLCBzdHJ1Y3Qgc3RhdCBfX3VzZXIgKiwgc3RhdGJ1ZikKIHsKIAlzdHJ1Y3Qga3N0YXQgc3RhdDsKIAlpbnQgZXJyb3IgPSB2ZnNfbHN0YXRfZmQoQVRfRkRDV0QsIGZpbGVuYW1lLCAmc3RhdCk7CkBAIC0yNTgsOCArMjYwLDggQEAKIH0KIAogI2lmICFkZWZpbmVkKF9fQVJDSF9XQU5UX1NUQVQ2NCkgfHwgZGVmaW5lZChfX0FSQ0hfV0FOVF9TWVNfTkVXRlNUQVRBVCkKLWFzbWxpbmthZ2UgbG9uZyBzeXNfbmV3ZnN0YXRhdChpbnQgZGZkLCBjaGFyIF9fdXNlciAqZmlsZW5hbWUsCi0JCQkJc3RydWN0IHN0YXQgX191c2VyICpzdGF0YnVmLCBpbnQgZmxhZykKK1NZU0NBTExfREVGSU5FNChuZXdmc3RhdGF0LCBpbnQsIGRmZCwgY2hhciBfX3VzZXIgKiwgZmlsZW5hbWUsCisJCXN0cnVjdCBzdGF0IF9fdXNlciAqLCBzdGF0YnVmLCBpbnQsIGZsYWcpCiB7CiAJc3RydWN0IGtzdGF0IHN0YXQ7CiAJaW50IGVycm9yID0gLUVJTlZBTDsKQEAgLTI4MCw3ICsyODIsNyBAQAogfQogI2VuZGlmCiAKLWFzbWxpbmthZ2UgbG9uZyBzeXNfbmV3ZnN0YXQodW5zaWduZWQgaW50IGZkLCBzdHJ1Y3Qgc3RhdCBfX3VzZXIgKnN0YXRidWYpCitTWVNDQUxMX0RFRklORTIobmV3ZnN0YXQsIHVuc2lnbmVkIGludCwgZmQsIHN0cnVjdCBzdGF0IF9fdXNlciAqLCBzdGF0YnVmKQogewogCXN0cnVjdCBrc3RhdCBzdGF0OwogCWludCBlcnJvciA9IHZmc19mc3RhdChmZCwgJnN0YXQpOwpAQCAtMjkxLDggKzI5Myw4IEBACiAJcmV0dXJuIGVycm9yOwogfQogCi1hc21saW5rYWdlIGxvbmcgc3lzX3JlYWRsaW5rYXQoaW50IGRmZCwgY29uc3QgY2hhciBfX3VzZXIgKnBhdGhuYW1lLAotCQkJCWNoYXIgX191c2VyICpidWYsIGludCBidWZzaXopCitTWVNDQUxMX0RFRklORTQocmVhZGxpbmthdCwgaW50LCBkZmQsIGNvbnN0IGNoYXIgX191c2VyICosIHBhdGhuYW1lLAorCQljaGFyIF9fdXNlciAqLCBidWYsIGludCwgYnVmc2l6KQogewogCXN0cnVjdCBwYXRoIHBhdGg7CiAJaW50IGVycm9yOwpAQCAtMzE4LDggKzMyMCw4IEBACiAJcmV0dXJuIGVycm9yOwogfQogCi1hc21saW5rYWdlIGxvbmcgc3lzX3JlYWRsaW5rKGNvbnN0IGNoYXIgX191c2VyICpwYXRoLCBjaGFyIF9fdXNlciAqYnVmLAotCQkJCWludCBidWZzaXopCitTWVNDQUxMX0RFRklORTMocmVhZGxpbmssIGNvbnN0IGNoYXIgX191c2VyICosIHBhdGgsIGNoYXIgX191c2VyICosIGJ1ZiwKKwkJaW50LCBidWZzaXopCiB7CiAJcmV0dXJuIHN5c19yZWFkbGlua2F0KEFUX0ZEQ1dELCBwYXRoLCBidWYsIGJ1ZnNpeik7CiB9CkBAIC0zNjUsNyArMzY3LDcgQEAKIAlyZXR1cm4gY29weV90b191c2VyKHN0YXRidWYsJnRtcCxzaXplb2YodG1wKSkgPyAtRUZBVUxUIDogMDsKIH0KIAotYXNtbGlua2FnZSBsb25nIHN5c19zdGF0NjQoY2hhciBfX3VzZXIgKiBmaWxlbmFtZSwgc3RydWN0IHN0YXQ2NCBfX3VzZXIgKiBzdGF0YnVmKQorU1lTQ0FMTF9ERUZJTkUyKHN0YXQ2NCwgY2hhciBfX3VzZXIgKiwgZmlsZW5hbWUsIHN0cnVjdCBzdGF0NjQgX191c2VyICosIHN0YXRidWYpCiB7CiAJc3RydWN0IGtzdGF0IHN0YXQ7CiAJaW50IGVycm9yID0gdmZzX3N0YXQoZmlsZW5hbWUsICZzdGF0KTsKQEAgLTM3NSw3ICszNzcsOCBAQAogCiAJcmV0dXJuIGVycm9yOwogfQotYXNtbGlua2FnZSBsb25nIHN5c19sc3RhdDY0KGNoYXIgX191c2VyICogZmlsZW5hbWUsIHN0cnVjdCBzdGF0NjQgX191c2VyICogc3RhdGJ1ZikKKworU1lTQ0FMTF9ERUZJTkUyKGxzdGF0NjQsIGNoYXIgX191c2VyICosIGZpbGVuYW1lLCBzdHJ1Y3Qgc3RhdDY0IF9fdXNlciAqLCBzdGF0YnVmKQogewogCXN0cnVjdCBrc3RhdCBzdGF0OwogCWludCBlcnJvciA9IHZmc19sc3RhdChmaWxlbmFtZSwgJnN0YXQpOwpAQCAtMzg1LDcgKzM4OCw4IEBACiAKIAlyZXR1cm4gZXJyb3I7CiB9Ci1hc21saW5rYWdlIGxvbmcgc3lzX2ZzdGF0NjQodW5zaWduZWQgbG9uZyBmZCwgc3RydWN0IHN0YXQ2NCBfX3VzZXIgKiBzdGF0YnVmKQorCitTWVNDQUxMX0RFRklORTIoZnN0YXQ2NCwgdW5zaWduZWQgbG9uZywgZmQsIHN0cnVjdCBzdGF0NjQgX191c2VyICosIHN0YXRidWYpCiB7CiAJc3RydWN0IGtzdGF0IHN0YXQ7CiAJaW50IGVycm9yID0gdmZzX2ZzdGF0KGZkLCAmc3RhdCk7CkBAIC0zOTYsOCArNDAwLDggQEAKIAlyZXR1cm4gZXJyb3I7CiB9CiAKLWFzbWxpbmthZ2UgbG9uZyBzeXNfZnN0YXRhdDY0KGludCBkZmQsIGNoYXIgX191c2VyICpmaWxlbmFtZSwKLQkJCSAgICAgICBzdHJ1Y3Qgc3RhdDY0IF9fdXNlciAqc3RhdGJ1ZiwgaW50IGZsYWcpCitTWVNDQUxMX0RFRklORTQoZnN0YXRhdDY0LCBpbnQsIGRmZCwgY2hhciBfX3VzZXIgKiwgZmlsZW5hbWUsCisJCXN0cnVjdCBzdGF0NjQgX191c2VyICosIHN0YXRidWYsIGludCwgZmxhZykKIHsKIAlzdHJ1Y3Qga3N0YXQgc3RhdDsKIAlpbnQgZXJyb3IgPSAtRUlOVkFMOwpkaWZmIC0tZ2l0IGEvZnMvc3VwZXIuYyBiL2ZzL3N1cGVyLmMKaW5kZXggZGRiYTA2OS4uNjQ1ZTU0MCAxMDA2NDQKLS0tIGEvZnMvc3VwZXIuYworKysgYi9mcy9zdXBlci5jCkBAIC0zOCw2ICszOCw3IEBACiAjaW5jbHVkZSA8bGludXgva29iamVjdC5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgvZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2FzeW5jLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlICJpbnRlcm5hbC5oIgogCkBAIC03MSw2ICs3Miw3IEBACiAJCUlOSVRfSExJU1RfSEVBRCgmcy0+c19hbm9uKTsKIAkJSU5JVF9MSVNUX0hFQUQoJnMtPnNfaW5vZGVzKTsKIAkJSU5JVF9MSVNUX0hFQUQoJnMtPnNfZGVudHJ5X2xydSk7CisJCUlOSVRfTElTVF9IRUFEKCZzLT5zX2FzeW5jX2xpc3QpOwogCQlpbml0X3J3c2VtKCZzLT5zX3Vtb3VudCk7CiAJCW11dGV4X2luaXQoJnMtPnNfbG9jayk7CiAJCWxvY2tkZXBfc2V0X2NsYXNzKCZzLT5zX3Vtb3VudCwgJnR5cGUtPnNfdW1vdW50X2tleSk7CkBAIC0yODksMTEgKzI5MSwxOCBAQAogewogCWNvbnN0IHN0cnVjdCBzdXBlcl9vcGVyYXRpb25zICpzb3AgPSBzYi0+c19vcDsKIAorCiAJaWYgKHNiLT5zX3Jvb3QpIHsKIAkJc2hyaW5rX2RjYWNoZV9mb3JfdW1vdW50KHNiKTsKIAkJZnN5bmNfc3VwZXIoc2IpOwogCQlsb2NrX3N1cGVyKHNiKTsKIAkJc2ItPnNfZmxhZ3MgJj0gfk1TX0FDVElWRTsKKworCQkvKgorCQkgKiB3YWl0IGZvciBhc3luY2hyb25vdXMgZnMgb3BlcmF0aW9ucyB0byBmaW5pc2ggYmVmb3JlIGdvaW5nIGZ1cnRoZXIKKwkJICovCisJCWFzeW5jX3N5bmNocm9uaXplX2Z1bGxfc3BlY2lhbCgmc2ItPnNfYXN5bmNfbGlzdCk7CisKIAkJLyogYmFkIG5hbWUgLSBpdCBzaG91bGQgYmUgZXZpY3RfaW5vZGVzKCkgKi8KIAkJaW52YWxpZGF0ZV9pbm9kZXMoc2IpOwogCQlsb2NrX2tlcm5lbCgpOwpAQCAtNDYxLDYgKzQ3MCw3IEBACiAJCXNiLT5zX2NvdW50Kys7CiAJCXNwaW5fdW5sb2NrKCZzYl9sb2NrKTsKIAkJZG93bl9yZWFkKCZzYi0+c191bW91bnQpOworCQlhc3luY19zeW5jaHJvbml6ZV9mdWxsX3NwZWNpYWwoJnNiLT5zX2FzeW5jX2xpc3QpOwogCQlpZiAoc2ItPnNfcm9vdCAmJiAod2FpdCB8fCBzYi0+c19kaXJ0KSkKIAkJCXNiLT5zX29wLT5zeW5jX2ZzKHNiLCB3YWl0KTsKIAkJdXBfcmVhZCgmc2ItPnNfdW1vdW50KTsKQEAgLTUzNCw3ICs1NDQsNyBAQAogCXJldHVybiBOVUxMOwogfQogCi1hc21saW5rYWdlIGxvbmcgc3lzX3VzdGF0KHVuc2lnbmVkIGRldiwgc3RydWN0IHVzdGF0IF9fdXNlciAqIHVidWYpCitTWVNDQUxMX0RFRklORTIodXN0YXQsIHVuc2lnbmVkLCBkZXYsIHN0cnVjdCB1c3RhdCBfX3VzZXIgKiwgdWJ1ZikKIHsKICAgICAgICAgc3RydWN0IHN1cGVyX2Jsb2NrICpzOwogICAgICAgICBzdHJ1Y3QgdXN0YXQgdG1wOwpAQCAtODAwLDYgKzgxMCw3IEBACiAJCX0KIAogCQlzLT5zX2ZsYWdzIHw9IE1TX0FDVElWRTsKKwkJYmRldi0+YmRfc3VwZXIgPSBzOwogCX0KIAogCXJldHVybiBzaW1wbGVfc2V0X21udChtbnQsIHMpOwpAQCAtODE5LDYgKzgzMCw3IEBACiAJc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiA9IHNiLT5zX2JkZXY7CiAJZm1vZGVfdCBtb2RlID0gc2ItPnNfbW9kZTsKIAorCWJkZXYtPmJkX3N1cGVyID0gMDsKIAlnZW5lcmljX3NodXRkb3duX3N1cGVyKHNiKTsKIAlzeW5jX2Jsb2NrZGV2KGJkZXYpOwogCWNsb3NlX2JkZXZfZXhjbHVzaXZlKGJkZXYsIG1vZGUpOwpkaWZmIC0tZ2l0IGEvZnMvc3luYy5jIGIvZnMvc3luYy5jCmluZGV4IGFjMDJiNTYuLmExNmQ1M2UgMTAwNjQ0Ci0tLSBhL2ZzL3N5bmMuYworKysgYi9mcy9zeW5jLmMKQEAgLTM2LDcgKzM2LDcgQEAKIAkJbGFwdG9wX3N5bmNfY29tcGxldGlvbigpOwogfQogCi1hc21saW5rYWdlIGxvbmcgc3lzX3N5bmModm9pZCkKK1NZU0NBTExfREVGSU5FMChzeW5jKQogewogCWRvX3N5bmMoMSk7CiAJcmV0dXJuIDA7CkBAIC0xNDQsMTIgKzE0NCwxMiBAQAogCXJldHVybiByZXQ7CiB9CiAKLWFzbWxpbmthZ2UgbG9uZyBzeXNfZnN5bmModW5zaWduZWQgaW50IGZkKQorU1lTQ0FMTF9ERUZJTkUxKGZzeW5jLCB1bnNpZ25lZCBpbnQsIGZkKQogewogCXJldHVybiBkb19mc3luYyhmZCwgMCk7CiB9CiAKLWFzbWxpbmthZ2UgbG9uZyBzeXNfZmRhdGFzeW5jKHVuc2lnbmVkIGludCBmZCkKK1NZU0NBTExfREVGSU5FMShmZGF0YXN5bmMsIHVuc2lnbmVkIGludCwgZmQpCiB7CiAJcmV0dXJuIGRvX2ZzeW5jKGZkLCAxKTsKIH0KQEAgLTIwMSw4ICsyMDEsOCBAQAogICogYWxyZWFkeS1pbnN0YW50aWF0ZWQgZGlzayBibG9ja3MsIHRoZXJlIGFyZSBubyBndWFyYW50ZWVzIGhlcmUgdGhhdCB0aGUgZGF0YQogICogd2lsbCBiZSBhdmFpbGFibGUgYWZ0ZXIgYSBjcmFzaC4KICAqLwotYXNtbGlua2FnZSBsb25nIHN5c19zeW5jX2ZpbGVfcmFuZ2UoaW50IGZkLCBsb2ZmX3Qgb2Zmc2V0LCBsb2ZmX3QgbmJ5dGVzLAotCQkJCQl1bnNpZ25lZCBpbnQgZmxhZ3MpCitTWVNDQUxMX0RFRklORShzeW5jX2ZpbGVfcmFuZ2UpKGludCBmZCwgbG9mZl90IG9mZnNldCwgbG9mZl90IG5ieXRlcywKKwkJCQl1bnNpZ25lZCBpbnQgZmxhZ3MpCiB7CiAJaW50IHJldDsKIAlzdHJ1Y3QgZmlsZSAqZmlsZTsKQEAgLTI2MiwxNCArMjYyLDMyIEBACiBvdXQ6CiAJcmV0dXJuIHJldDsKIH0KKyNpZmRlZiBDT05GSUdfSEFWRV9TWVNDQUxMX1dSQVBQRVJTCithc21saW5rYWdlIGxvbmcgU3lTX3N5bmNfZmlsZV9yYW5nZShsb25nIGZkLCBsb2ZmX3Qgb2Zmc2V0LCBsb2ZmX3QgbmJ5dGVzLAorCQkJCSAgICBsb25nIGZsYWdzKQoreworCXJldHVybiBTWVNDX3N5bmNfZmlsZV9yYW5nZSgoaW50KSBmZCwgb2Zmc2V0LCBuYnl0ZXMsCisJCQkJICAgICh1bnNpZ25lZCBpbnQpIGZsYWdzKTsKK30KK1NZU0NBTExfQUxJQVMoc3lzX3N5bmNfZmlsZV9yYW5nZSwgU3lTX3N5bmNfZmlsZV9yYW5nZSk7CisjZW5kaWYKIAogLyogSXQgd291bGQgYmUgbmljZSBpZiBwZW9wbGUgcmVtZW1iZXIgdGhhdCBub3QgYWxsIHRoZSB3b3JsZCdzIGFuIGkzODYKICAgIHdoZW4gdGhleSBpbnRyb2R1Y2UgbmV3IHN5c3RlbSBjYWxscyAqLwotYXNtbGlua2FnZSBsb25nIHN5c19zeW5jX2ZpbGVfcmFuZ2UyKGludCBmZCwgdW5zaWduZWQgaW50IGZsYWdzLAotCQkJCSAgICAgbG9mZl90IG9mZnNldCwgbG9mZl90IG5ieXRlcykKK1NZU0NBTExfREVGSU5FKHN5bmNfZmlsZV9yYW5nZTIpKGludCBmZCwgdW5zaWduZWQgaW50IGZsYWdzLAorCQkJCSBsb2ZmX3Qgb2Zmc2V0LCBsb2ZmX3QgbmJ5dGVzKQogewogCXJldHVybiBzeXNfc3luY19maWxlX3JhbmdlKGZkLCBvZmZzZXQsIG5ieXRlcywgZmxhZ3MpOwogfQorI2lmZGVmIENPTkZJR19IQVZFX1NZU0NBTExfV1JBUFBFUlMKK2FzbWxpbmthZ2UgbG9uZyBTeVNfc3luY19maWxlX3JhbmdlMihsb25nIGZkLCBsb25nIGZsYWdzLAorCQkJCSAgICAgbG9mZl90IG9mZnNldCwgbG9mZl90IG5ieXRlcykKK3sKKwlyZXR1cm4gU1lTQ19zeW5jX2ZpbGVfcmFuZ2UyKChpbnQpIGZkLCAodW5zaWduZWQgaW50KSBmbGFncywKKwkJCQkgICAgIG9mZnNldCwgbmJ5dGVzKTsKK30KK1NZU0NBTExfQUxJQVMoc3lzX3N5bmNfZmlsZV9yYW5nZTIsIFN5U19zeW5jX2ZpbGVfcmFuZ2UyKTsKKyNlbmRpZgogCiAvKgogICogYGVuZGJ5dGUnIGlzIGluY2x1c2l2ZQpkaWZmIC0tZ2l0IGEvZnMvdGltZXJmZC5jIGIvZnMvdGltZXJmZC5jCmluZGV4IDA4NjJmMGUuLjZhMTIzYjggMTAwNjQ0Ci0tLSBhL2ZzL3RpbWVyZmQuYworKysgYi9mcy90aW1lcmZkLmMKQEAgLTE3Nyw3ICsxNzcsNyBAQAogCXJldHVybiBmaWxlOwogfQogCi1hc21saW5rYWdlIGxvbmcgc3lzX3RpbWVyZmRfY3JlYXRlKGludCBjbG9ja2lkLCBpbnQgZmxhZ3MpCitTWVNDQUxMX0RFRklORTIodGltZXJmZF9jcmVhdGUsIGludCwgY2xvY2tpZCwgaW50LCBmbGFncykKIHsKIAlpbnQgdWZkOwogCXN0cnVjdCB0aW1lcmZkX2N0eCAqY3R4OwpAQCAtMjA4LDkgKzIwOCw5IEBACiAJcmV0dXJuIHVmZDsKIH0KIAotYXNtbGlua2FnZSBsb25nIHN5c190aW1lcmZkX3NldHRpbWUoaW50IHVmZCwgaW50IGZsYWdzLAotCQkJCSAgICBjb25zdCBzdHJ1Y3QgaXRpbWVyc3BlYyBfX3VzZXIgKnV0bXIsCi0JCQkJICAgIHN0cnVjdCBpdGltZXJzcGVjIF9fdXNlciAqb3RtcikKK1NZU0NBTExfREVGSU5FNCh0aW1lcmZkX3NldHRpbWUsIGludCwgdWZkLCBpbnQsIGZsYWdzLAorCQljb25zdCBzdHJ1Y3QgaXRpbWVyc3BlYyBfX3VzZXIgKiwgdXRtciwKKwkJc3RydWN0IGl0aW1lcnNwZWMgX191c2VyICosIG90bXIpCiB7CiAJc3RydWN0IGZpbGUgKmZpbGU7CiAJc3RydWN0IHRpbWVyZmRfY3R4ICpjdHg7CkBAIC0yNjUsNyArMjY1LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotYXNtbGlua2FnZSBsb25nIHN5c190aW1lcmZkX2dldHRpbWUoaW50IHVmZCwgc3RydWN0IGl0aW1lcnNwZWMgX191c2VyICpvdG1yKQorU1lTQ0FMTF9ERUZJTkUyKHRpbWVyZmRfZ2V0dGltZSwgaW50LCB1ZmQsIHN0cnVjdCBpdGltZXJzcGVjIF9fdXNlciAqLCBvdG1yKQogewogCXN0cnVjdCBmaWxlICpmaWxlOwogCXN0cnVjdCB0aW1lcmZkX2N0eCAqY3R4OwpkaWZmIC0tZ2l0IGEvZnMvdWJpZnMvS2NvbmZpZyBiL2ZzL3ViaWZzL0tjb25maWcKaW5kZXggOTFjZWVkYS4uZTM1YjU0ZCAxMDA2NDQKLS0tIGEvZnMvdWJpZnMvS2NvbmZpZworKysgYi9mcy91Ymlmcy9LY29uZmlnCkBAIC00MCw3ICs0MCw3IEBACiAJZGVwZW5kcyBvbiBVQklGU19GUwogCWRlZmF1bHQgeQogCWhlbHAKLQkgIFpsaWIgY29wcmVzc2VzIGJldHRlciB0aGVuIExaTyBidXQgaXQgaXMgc2xvd2VyLiBTYXkgJ1knIGlmIHVuc3VyZS4KKwkgIFpsaWIgY29tcHJlc3NlcyBiZXR0ZXIgdGhhbiBMWk8gYnV0IGl0IGlzIHNsb3dlci4gU2F5ICdZJyBpZiB1bnN1cmUuCiAKICMgRGVidWdnaW5nLXJlbGF0ZWQgc3R1ZmYKIGNvbmZpZyBVQklGU19GU19ERUJVRwpkaWZmIC0tZ2l0IGEvZnMvdWJpZnMvYnVkZ2V0LmMgYi9mcy91Ymlmcy9idWRnZXQuYwppbmRleCAwZTVlNTRkLi4xNzVmOWM1IDEwMDY0NAotLS0gYS9mcy91Ymlmcy9idWRnZXQuYworKysgYi9mcy91Ymlmcy9idWRnZXQuYwpAQCAtMTQyLDcgKzE0Miw3IEBACiAgKgogICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiBhbiBvcGVyYXRpb24gY2Fubm90IGJlIGJ1ZGdldGVkIGJlY2F1c2UgdGhlcmUKICAqIGlzIHN1cHBvc2VkbHkgbm8gZnJlZSBzcGFjZS4gQnV0IGluIG1vc3QgY2FzZXMgdGhlcmUgaXMgc29tZSBmcmVlIHNwYWNlOgotICogICBvIGJ1ZGdldGluZyBpcyBwZXNzaW1pc3RpYywgc28gaXQgYWx3YXlzIGJ1ZGdldHMgbW9yZSB0aGVuIGl0IGlzIGFjdHVhbGx5CisgKiAgIG8gYnVkZ2V0aW5nIGlzIHBlc3NpbWlzdGljLCBzbyBpdCBhbHdheXMgYnVkZ2V0cyBtb3JlIHRoYW4gaXQgaXMgYWN0dWFsbHkKICAqICAgICBuZWVkZWQsIHNvIHNocmlua2luZyB0aGUgbGlhYmlsaXR5IGlzIG9uZSB3YXkgdG8gbWFrZSBmcmVlIHNwYWNlIC0gdGhlCiAgKiAgICAgY2FjaGVkIGRhdGEgd2lsbCB0YWtlIGxlc3Mgc3BhY2UgdGhlbiBpdCB3YXMgYnVkZ2V0ZWQgZm9yOwogICogICBvIEdDIG1heSB0dXJuIHNvbWUgZGFyayBzcGFjZSBpbnRvIGZyZWUgc3BhY2UgKGJ1ZGdldGluZyB0cmVhdHMgZGFyayBzcGFjZQpAQCAtNjA2LDcgKzYwNiw3IEBACiAgKiBAYzogVUJJRlMgZmlsZS1zeXN0ZW0gZGVzY3JpcHRpb24gb2JqZWN0CiAgKgogICogVGhpcyBmdW5jdGlvbiBjb252ZXJ0cyBidWRnZXQgd2hpY2ggd2FzIGFsbG9jYXRlZCBmb3IgYSBuZXcgcGFnZSBvZiBkYXRhIHRvCi0gKiB0aGUgYnVkZ2V0IG9mIGNoYW5naW5nIGFuIGV4aXN0aW5nIHBhZ2Ugb2YgZGF0YS4gVGhlIGxhdHRlciBpcyBzbWFsbGVyIHRoZW4KKyAqIHRoZSBidWRnZXQgb2YgY2hhbmdpbmcgYW4gZXhpc3RpbmcgcGFnZSBvZiBkYXRhLiBUaGUgbGF0dGVyIGlzIHNtYWxsZXIgdGhhbgogICogdGhlIGZvcm1lciwgc28gdGhpcyBmdW5jdGlvbiBvbmx5IGRvZXMgc2ltcGxlIHJlLWNhbGN1bGF0aW9uIGFuZCBkb2VzIG5vdAogICogaW52b2x2ZSBhbnkgd3JpdGUtYmFjay4KICAqLwpkaWZmIC0tZ2l0IGEvZnMvdWJpZnMvZ2MuYyBiL2ZzL3ViaWZzL2djLmMKaW5kZXggMGJlZjY1MC4uOTgzMmY5YSAxMDA2NDQKLS0tIGEvZnMvdWJpZnMvZ2MuYworKysgYi9mcy91Ymlmcy9nYy5jCkBAIC00NSw3ICs0NSw3IEBACiAjZGVmaW5lIFNNQUxMX05PREVfV00gIFVCSUZTX01BWF9ERU5UX05PREVfU1oKIAogLyoKLSAqIEdDIG1heSBuZWVkIHRvIG1vdmUgbW9yZSB0aGVuIG9uZSBMRUIgdG8gbWFrZSBwcm9ncmVzcy4gVGhlIGJlbG93IGNvbnN0YW50cworICogR0MgbWF5IG5lZWQgdG8gbW92ZSBtb3JlIHRoYW4gb25lIExFQiB0byBtYWtlIHByb2dyZXNzLiBUaGUgYmVsb3cgY29uc3RhbnRzCiAgKiBkZWZpbmUgInNvZnQiIGFuZCAiaGFyZCIgbGltaXRzIG9uIHRoZSBudW1iZXIgb2YgTEVCcyB0aGUgZ2FyYmFnZSBjb2xsZWN0b3IKICAqIG1heSBtb3ZlLgogICovCmRpZmYgLS1naXQgYS9mcy91Ymlmcy9qb3VybmFsLmMgYi9mcy91Ymlmcy9qb3VybmFsLmMKaW5kZXggMTBhZTI1Yi4uOWI3YzU0ZSAxMDA2NDQKLS0tIGEvZnMvdWJpZnMvam91cm5hbC5jCisrKyBiL2ZzL3ViaWZzL2pvdXJuYWwuYwpAQCAtMTkxLDcgKzE5MSw3IEBACiAJaWYgKHdidWYtPmxudW0gIT0gLTEgJiYgYXZhaWwgPj0gbGVuKSB7CiAJCS8qCiAJCSAqIFNvbWVvbmUgZWxzZSBoYXMgc3dpdGNoZWQgdGhlIGpvdXJuYWwgaGVhZCBhbmQgd2UgaGF2ZQotCQkgKiBlbm91Z2ggc3BhY2Ugbm93LiBUaGlzIGhhcHBlbnMgd2hlbiBtb3JlIHRoZW4gb25lIHByb2Nlc3MgaXMKKwkJICogZW5vdWdoIHNwYWNlIG5vdy4gVGhpcyBoYXBwZW5zIHdoZW4gbW9yZSB0aGFuIG9uZSBwcm9jZXNzIGlzCiAJCSAqIHRyeWluZyB0byB3cml0ZSB0byB0aGUgc2FtZSBqb3VybmFsIGhlYWQgYXQgdGhlIHNhbWUgdGltZS4KIAkJICovCiAJCWRiZ19qbmwoInJldHVybiBMRUIgJWQgYmFjaywgYWxyZWFkeSBoYXZlIExFQiAlZDolZCIsCmRpZmYgLS1naXQgYS9mcy91Ymlmcy9zaHJpbmtlci5jIGIvZnMvdWJpZnMvc2hyaW5rZXIuYwppbmRleCBmMjQ4NTMzLi5lN2JhYjUyIDEwMDY0NAotLS0gYS9mcy91Ymlmcy9zaHJpbmtlci5jCisrKyBiL2ZzL3ViaWZzL3Nocmlua2VyLmMKQEAgLTE1MSw3ICsxNTEsNyBAQAogICogQGNvbnRlbnRpb246IGlmIGFueSBjb250ZW50aW9uLCB0aGlzIGlzIHNldCB0byAlMQogICoKICAqIFRoaXMgZnVuY3Rpb24gd2Fsa3MgdGhlIGxpc3Qgb2YgbW91bnRlZCBVQklGUyBmaWxlLXN5c3RlbXMgYW5kIGZyZWVzIGNsZWFuCi0gKiB6bm9kZXMgd2hpY2ggYXJlIG9sZGVyIHRoZW4gQGFnZSwgdW50aWwgYXQgbGVhc3QgQG5yIHpub2RlcyBhcmUgZnJlZWQuCisgKiB6bm9kZXMgd2hpY2ggYXJlIG9sZGVyIHRoYW4gQGFnZSwgdW50aWwgYXQgbGVhc3QgQG5yIHpub2RlcyBhcmUgZnJlZWQuCiAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZnJlZWQgem5vZGVzLgogICovCiBzdGF0aWMgaW50IHNocmlua190bmNfdHJlZXMoaW50IG5yLCBpbnQgYWdlLCBpbnQgKmNvbnRlbnRpb24pCmRpZmYgLS1naXQgYS9mcy91dGltZXMuYyBiL2ZzL3V0aW1lcy5jCmluZGV4IDY5MjllM2UuLmU0Yzc1ZGIgMTAwNjQ0Ci0tLSBhL2ZzL3V0aW1lcy5jCisrKyBiL2ZzL3V0aW1lcy5jCkBAIC0yNCw3ICsyNCw3IEBACiAgKiBtdXN0IGJlIG93bmVyIG9yIGhhdmUgd3JpdGUgcGVybWlzc2lvbi4KICAqIEVsc2UsIHVwZGF0ZSBmcm9tICp0aW1lcywgbXVzdCBiZSBvd25lciBvciBzdXBlciB1c2VyLgogICovCi1hc21saW5rYWdlIGxvbmcgc3lzX3V0aW1lKGNoYXIgX191c2VyICpmaWxlbmFtZSwgc3RydWN0IHV0aW1idWYgX191c2VyICp0aW1lcykKK1NZU0NBTExfREVGSU5FMih1dGltZSwgY2hhciBfX3VzZXIgKiwgZmlsZW5hbWUsIHN0cnVjdCB1dGltYnVmIF9fdXNlciAqLCB0aW1lcykKIHsKIAlzdHJ1Y3QgdGltZXNwZWMgdHZbMl07CiAKQEAgLTE3MCw3ICsxNzAsOCBAQAogCXJldHVybiBlcnJvcjsKIH0KIAotYXNtbGlua2FnZSBsb25nIHN5c191dGltZW5zYXQoaW50IGRmZCwgY2hhciBfX3VzZXIgKmZpbGVuYW1lLCBzdHJ1Y3QgdGltZXNwZWMgX191c2VyICp1dGltZXMsIGludCBmbGFncykKK1NZU0NBTExfREVGSU5FNCh1dGltZW5zYXQsIGludCwgZGZkLCBjaGFyIF9fdXNlciAqLCBmaWxlbmFtZSwKKwkJc3RydWN0IHRpbWVzcGVjIF9fdXNlciAqLCB1dGltZXMsIGludCwgZmxhZ3MpCiB7CiAJc3RydWN0IHRpbWVzcGVjIHRzdGltZXNbMl07CiAKQEAgLTE4Nyw3ICsxODgsOCBAQAogCXJldHVybiBkb191dGltZXMoZGZkLCBmaWxlbmFtZSwgdXRpbWVzID8gdHN0aW1lcyA6IE5VTEwsIGZsYWdzKTsKIH0KIAotYXNtbGlua2FnZSBsb25nIHN5c19mdXRpbWVzYXQoaW50IGRmZCwgY2hhciBfX3VzZXIgKmZpbGVuYW1lLCBzdHJ1Y3QgdGltZXZhbCBfX3VzZXIgKnV0aW1lcykKK1NZU0NBTExfREVGSU5FMyhmdXRpbWVzYXQsIGludCwgZGZkLCBjaGFyIF9fdXNlciAqLCBmaWxlbmFtZSwKKwkJc3RydWN0IHRpbWV2YWwgX191c2VyICosIHV0aW1lcykKIHsKIAlzdHJ1Y3QgdGltZXZhbCB0aW1lc1syXTsKIAlzdHJ1Y3QgdGltZXNwZWMgdHN0aW1lc1syXTsKQEAgLTIxNCw3ICsyMTYsOCBAQAogCXJldHVybiBkb191dGltZXMoZGZkLCBmaWxlbmFtZSwgdXRpbWVzID8gdHN0aW1lcyA6IE5VTEwsIDApOwogfQogCi1hc21saW5rYWdlIGxvbmcgc3lzX3V0aW1lcyhjaGFyIF9fdXNlciAqZmlsZW5hbWUsIHN0cnVjdCB0aW1ldmFsIF9fdXNlciAqdXRpbWVzKQorU1lTQ0FMTF9ERUZJTkUyKHV0aW1lcywgY2hhciBfX3VzZXIgKiwgZmlsZW5hbWUsCisJCXN0cnVjdCB0aW1ldmFsIF9fdXNlciAqLCB1dGltZXMpCiB7CiAJcmV0dXJuIHN5c19mdXRpbWVzYXQoQVRfRkRDV0QsIGZpbGVuYW1lLCB1dGltZXMpOwogfQpkaWZmIC0tZ2l0IGEvZnMveGF0dHIuYyBiL2ZzL3hhdHRyLmMKaW5kZXggMjM3ODA0Yy4uMTk3YzRmYyAxMDA2NDQKLS0tIGEvZnMveGF0dHIuYworKysgYi9mcy94YXR0ci5jCkBAIC0yNTEsOSArMjUxLDkgQEAKIAlyZXR1cm4gZXJyb3I7CiB9CiAKLWFzbWxpbmthZ2UgbG9uZwotc3lzX3NldHhhdHRyKGNvbnN0IGNoYXIgX191c2VyICpwYXRobmFtZSwgY29uc3QgY2hhciBfX3VzZXIgKm5hbWUsCi0JICAgICBjb25zdCB2b2lkIF9fdXNlciAqdmFsdWUsIHNpemVfdCBzaXplLCBpbnQgZmxhZ3MpCitTWVNDQUxMX0RFRklORTUoc2V0eGF0dHIsIGNvbnN0IGNoYXIgX191c2VyICosIHBhdGhuYW1lLAorCQljb25zdCBjaGFyIF9fdXNlciAqLCBuYW1lLCBjb25zdCB2b2lkIF9fdXNlciAqLCB2YWx1ZSwKKwkJc2l6ZV90LCBzaXplLCBpbnQsIGZsYWdzKQogewogCXN0cnVjdCBwYXRoIHBhdGg7CiAJaW50IGVycm9yOwpAQCAtMjcwLDkgKzI3MCw5IEBACiAJcmV0dXJuIGVycm9yOwogfQogCi1hc21saW5rYWdlIGxvbmcKLXN5c19sc2V0eGF0dHIoY29uc3QgY2hhciBfX3VzZXIgKnBhdGhuYW1lLCBjb25zdCBjaGFyIF9fdXNlciAqbmFtZSwKLQkgICAgICBjb25zdCB2b2lkIF9fdXNlciAqdmFsdWUsIHNpemVfdCBzaXplLCBpbnQgZmxhZ3MpCitTWVNDQUxMX0RFRklORTUobHNldHhhdHRyLCBjb25zdCBjaGFyIF9fdXNlciAqLCBwYXRobmFtZSwKKwkJY29uc3QgY2hhciBfX3VzZXIgKiwgbmFtZSwgY29uc3Qgdm9pZCBfX3VzZXIgKiwgdmFsdWUsCisJCXNpemVfdCwgc2l6ZSwgaW50LCBmbGFncykKIHsKIAlzdHJ1Y3QgcGF0aCBwYXRoOwogCWludCBlcnJvcjsKQEAgLTI4OSw5ICsyODksOCBAQAogCXJldHVybiBlcnJvcjsKIH0KIAotYXNtbGlua2FnZSBsb25nCi1zeXNfZnNldHhhdHRyKGludCBmZCwgY29uc3QgY2hhciBfX3VzZXIgKm5hbWUsIGNvbnN0IHZvaWQgX191c2VyICp2YWx1ZSwKLQkgICAgICBzaXplX3Qgc2l6ZSwgaW50IGZsYWdzKQorU1lTQ0FMTF9ERUZJTkU1KGZzZXR4YXR0ciwgaW50LCBmZCwgY29uc3QgY2hhciBfX3VzZXIgKiwgbmFtZSwKKwkJY29uc3Qgdm9pZCBfX3VzZXIgKix2YWx1ZSwgc2l6ZV90LCBzaXplLCBpbnQsIGZsYWdzKQogewogCXN0cnVjdCBmaWxlICpmOwogCXN0cnVjdCBkZW50cnkgKmRlbnRyeTsKQEAgLTM0OSw5ICszNDgsOCBAQAogCXJldHVybiBlcnJvcjsKIH0KIAotYXNtbGlua2FnZSBzc2l6ZV90Ci1zeXNfZ2V0eGF0dHIoY29uc3QgY2hhciBfX3VzZXIgKnBhdGhuYW1lLCBjb25zdCBjaGFyIF9fdXNlciAqbmFtZSwKLQkgICAgIHZvaWQgX191c2VyICp2YWx1ZSwgc2l6ZV90IHNpemUpCitTWVNDQUxMX0RFRklORTQoZ2V0eGF0dHIsIGNvbnN0IGNoYXIgX191c2VyICosIHBhdGhuYW1lLAorCQljb25zdCBjaGFyIF9fdXNlciAqLCBuYW1lLCB2b2lkIF9fdXNlciAqLCB2YWx1ZSwgc2l6ZV90LCBzaXplKQogewogCXN0cnVjdCBwYXRoIHBhdGg7CiAJc3NpemVfdCBlcnJvcjsKQEAgLTM2NCw5ICszNjIsOCBAQAogCXJldHVybiBlcnJvcjsKIH0KIAotYXNtbGlua2FnZSBzc2l6ZV90Ci1zeXNfbGdldHhhdHRyKGNvbnN0IGNoYXIgX191c2VyICpwYXRobmFtZSwgY29uc3QgY2hhciBfX3VzZXIgKm5hbWUsIHZvaWQgX191c2VyICp2YWx1ZSwKLQkgICAgICBzaXplX3Qgc2l6ZSkKK1NZU0NBTExfREVGSU5FNChsZ2V0eGF0dHIsIGNvbnN0IGNoYXIgX191c2VyICosIHBhdGhuYW1lLAorCQljb25zdCBjaGFyIF9fdXNlciAqLCBuYW1lLCB2b2lkIF9fdXNlciAqLCB2YWx1ZSwgc2l6ZV90LCBzaXplKQogewogCXN0cnVjdCBwYXRoIHBhdGg7CiAJc3NpemVfdCBlcnJvcjsKQEAgLTM3OSw4ICszNzYsOCBAQAogCXJldHVybiBlcnJvcjsKIH0KIAotYXNtbGlua2FnZSBzc2l6ZV90Ci1zeXNfZmdldHhhdHRyKGludCBmZCwgY29uc3QgY2hhciBfX3VzZXIgKm5hbWUsIHZvaWQgX191c2VyICp2YWx1ZSwgc2l6ZV90IHNpemUpCitTWVNDQUxMX0RFRklORTQoZmdldHhhdHRyLCBpbnQsIGZkLCBjb25zdCBjaGFyIF9fdXNlciAqLCBuYW1lLAorCQl2b2lkIF9fdXNlciAqLCB2YWx1ZSwgc2l6ZV90LCBzaXplKQogewogCXN0cnVjdCBmaWxlICpmOwogCXNzaXplX3QgZXJyb3IgPSAtRUJBREY7CkBAIC00MjQsOCArNDIxLDggQEAKIAlyZXR1cm4gZXJyb3I7CiB9CiAKLWFzbWxpbmthZ2Ugc3NpemVfdAotc3lzX2xpc3R4YXR0cihjb25zdCBjaGFyIF9fdXNlciAqcGF0aG5hbWUsIGNoYXIgX191c2VyICpsaXN0LCBzaXplX3Qgc2l6ZSkKK1NZU0NBTExfREVGSU5FMyhsaXN0eGF0dHIsIGNvbnN0IGNoYXIgX191c2VyICosIHBhdGhuYW1lLCBjaGFyIF9fdXNlciAqLCBsaXN0LAorCQlzaXplX3QsIHNpemUpCiB7CiAJc3RydWN0IHBhdGggcGF0aDsKIAlzc2l6ZV90IGVycm9yOwpAQCAtNDM4LDggKzQzNSw4IEBACiAJcmV0dXJuIGVycm9yOwogfQogCi1hc21saW5rYWdlIHNzaXplX3QKLXN5c19sbGlzdHhhdHRyKGNvbnN0IGNoYXIgX191c2VyICpwYXRobmFtZSwgY2hhciBfX3VzZXIgKmxpc3QsIHNpemVfdCBzaXplKQorU1lTQ0FMTF9ERUZJTkUzKGxsaXN0eGF0dHIsIGNvbnN0IGNoYXIgX191c2VyICosIHBhdGhuYW1lLCBjaGFyIF9fdXNlciAqLCBsaXN0LAorCQlzaXplX3QsIHNpemUpCiB7CiAJc3RydWN0IHBhdGggcGF0aDsKIAlzc2l6ZV90IGVycm9yOwpAQCAtNDUyLDggKzQ0OSw3IEBACiAJcmV0dXJuIGVycm9yOwogfQogCi1hc21saW5rYWdlIHNzaXplX3QKLXN5c19mbGlzdHhhdHRyKGludCBmZCwgY2hhciBfX3VzZXIgKmxpc3QsIHNpemVfdCBzaXplKQorU1lTQ0FMTF9ERUZJTkUzKGZsaXN0eGF0dHIsIGludCwgZmQsIGNoYXIgX191c2VyICosIGxpc3QsIHNpemVfdCwgc2l6ZSkKIHsKIAlzdHJ1Y3QgZmlsZSAqZjsKIAlzc2l6ZV90IGVycm9yID0gLUVCQURGOwpAQCAtNDg1LDggKzQ4MSw4IEBACiAJcmV0dXJuIHZmc19yZW1vdmV4YXR0cihkLCBrbmFtZSk7CiB9CiAKLWFzbWxpbmthZ2UgbG9uZwotc3lzX3JlbW92ZXhhdHRyKGNvbnN0IGNoYXIgX191c2VyICpwYXRobmFtZSwgY29uc3QgY2hhciBfX3VzZXIgKm5hbWUpCitTWVNDQUxMX0RFRklORTIocmVtb3ZleGF0dHIsIGNvbnN0IGNoYXIgX191c2VyICosIHBhdGhuYW1lLAorCQljb25zdCBjaGFyIF9fdXNlciAqLCBuYW1lKQogewogCXN0cnVjdCBwYXRoIHBhdGg7CiAJaW50IGVycm9yOwpAQCAtNTAzLDggKzQ5OSw4IEBACiAJcmV0dXJuIGVycm9yOwogfQogCi1hc21saW5rYWdlIGxvbmcKLXN5c19scmVtb3ZleGF0dHIoY29uc3QgY2hhciBfX3VzZXIgKnBhdGhuYW1lLCBjb25zdCBjaGFyIF9fdXNlciAqbmFtZSkKK1NZU0NBTExfREVGSU5FMihscmVtb3ZleGF0dHIsIGNvbnN0IGNoYXIgX191c2VyICosIHBhdGhuYW1lLAorCQljb25zdCBjaGFyIF9fdXNlciAqLCBuYW1lKQogewogCXN0cnVjdCBwYXRoIHBhdGg7CiAJaW50IGVycm9yOwpAQCAtNTIxLDggKzUxNyw3IEBACiAJcmV0dXJuIGVycm9yOwogfQogCi1hc21saW5rYWdlIGxvbmcKLXN5c19mcmVtb3ZleGF0dHIoaW50IGZkLCBjb25zdCBjaGFyIF9fdXNlciAqbmFtZSkKK1NZU0NBTExfREVGSU5FMihmcmVtb3ZleGF0dHIsIGludCwgZmQsIGNvbnN0IGNoYXIgX191c2VyICosIG5hbWUpCiB7CiAJc3RydWN0IGZpbGUgKmY7CiAJc3RydWN0IGRlbnRyeSAqZGVudHJ5OwpkaWZmIC0tZ2l0IGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfYW9wcy5oIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfYW9wcy5oCmluZGV4IDdiMjZmNWYuLjFkZDUyODggMTAwNjQ0Ci0tLSBhL2ZzL3hmcy9saW51eC0yLjYveGZzX2FvcHMuaAorKysgYi9mcy94ZnMvbGludXgtMi42L3hmc19hb3BzLmgKQEAgLTIxLDggKzIxLDYgQEAKIGV4dGVybiBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqeGZzZGF0YWRfd29ya3F1ZXVlOwogZXh0ZXJuIG1lbXBvb2xfdCAqeGZzX2lvZW5kX3Bvb2w7CiAKLXR5cGVkZWYgdm9pZCAoKnhmc19pb2VuZF9mdW5jX3QpKHZvaWQgKik7Ci0KIC8qCiAgKiB4ZnNfaW9lbmQgc3RydWN0IG1hbmFnZXMgbGFyZ2UgZXh0ZW50IHdyaXRlcyBmb3IgWEZTLgogICogSXQgY2FuIG1hbmFnZSBzZXZlcmFsIG11bHRpLXBhZ2UgYmlvJ3MgYXQgb25jZS4KZGlmZiAtLWdpdCBhL2ZzL3hmcy9saW51eC0yLjYveGZzX2J1Zi5jIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfYnVmLmMKaW5kZXggY2IzMjllZC4uZDcxZGM0NCAxMDA2NDQKLS0tIGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfYnVmLmMKKysrIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfYnVmLmMKQEAgLTE2Niw3NSArMTY2LDYgQEAKIH0KIAogLyoKLSAqCU1hcHBpbmcgb2YgbXVsdGktcGFnZSBidWZmZXJzIGludG8gY29udGlndW91cyB2aXJ0dWFsIHNwYWNlCi0gKi8KLQotdHlwZWRlZiBzdHJ1Y3QgYV9saXN0IHsKLQl2b2lkCQkqdm1fYWRkcjsKLQlzdHJ1Y3QgYV9saXN0CSpuZXh0OwotfSBhX2xpc3RfdDsKLQotc3RhdGljIGFfbGlzdF90CQkqYXNfZnJlZV9oZWFkOwotc3RhdGljIGludAkJYXNfbGlzdF9sZW47Ci1zdGF0aWMgREVGSU5FX1NQSU5MT0NLKGFzX2xvY2spOwotCi0vKgotICoJVHJ5IHRvIGJhdGNoIHZ1bm1hcHMgYmVjYXVzZSB0aGV5IGFyZSBjb3N0bHkuCi0gKi8KLVNUQVRJQyB2b2lkCi1mcmVlX2FkZHJlc3MoCi0Jdm9pZAkJKmFkZHIpCi17Ci0JYV9saXN0X3QJKmFlbnRyeTsKLQotI2lmZGVmIENPTkZJR19YRU4KLQkvKgotCSAqIFhlbiBuZWVkcyB0byBiZSBhYmxlIHRvIG1ha2Ugc3VyZSBpdCBjYW4gZ2V0IGFuIGV4Y2x1c2l2ZQotCSAqIFJPIG1hcHBpbmcgb2YgcGFnZXMgaXQgd2FudHMgdG8gdHVybiBpbnRvIGEgcGFnZXRhYmxlLiAgSWYKLQkgKiBhIG5ld2x5IGFsbG9jYXRlZCBwYWdlIGlzIGFsc28gc3RpbGwgYmVpbmcgdm1hcCgpZWQgYnkgeGZzLAotCSAqIGl0IHdpbGwgY2F1c2UgcGFnZXRhYmxlIGNvbnN0cnVjdGlvbiB0byBmYWlsLiAgVGhpcyBpcyBhCi0JICogcXVpY2sgd29ya2Fyb3VuZCB0byBhbHdheXMgZWFnZXJseSB1bm1hcCBwYWdlcyBzbyB0aGF0IFhlbgotCSAqIGlzIGhhcHB5LgotCSAqLwotCXZ1bm1hcChhZGRyKTsKLQlyZXR1cm47Ci0jZW5kaWYKLQotCWFlbnRyeSA9IGttYWxsb2Moc2l6ZW9mKGFfbGlzdF90KSwgR0ZQX05PV0FJVCk7Ci0JaWYgKGxpa2VseShhZW50cnkpKSB7Ci0JCXNwaW5fbG9jaygmYXNfbG9jayk7Ci0JCWFlbnRyeS0+bmV4dCA9IGFzX2ZyZWVfaGVhZDsKLQkJYWVudHJ5LT52bV9hZGRyID0gYWRkcjsKLQkJYXNfZnJlZV9oZWFkID0gYWVudHJ5OwotCQlhc19saXN0X2xlbisrOwotCQlzcGluX3VubG9jaygmYXNfbG9jayk7Ci0JfSBlbHNlIHsKLQkJdnVubWFwKGFkZHIpOwotCX0KLX0KLQotU1RBVElDIHZvaWQKLXB1cmdlX2FkZHJlc3Nlcyh2b2lkKQotewotCWFfbGlzdF90CSphZW50cnksICpvbGQ7Ci0KLQlpZiAoYXNfZnJlZV9oZWFkID09IE5VTEwpCi0JCXJldHVybjsKLQotCXNwaW5fbG9jaygmYXNfbG9jayk7Ci0JYWVudHJ5ID0gYXNfZnJlZV9oZWFkOwotCWFzX2ZyZWVfaGVhZCA9IE5VTEw7Ci0JYXNfbGlzdF9sZW4gPSAwOwotCXNwaW5fdW5sb2NrKCZhc19sb2NrKTsKLQotCXdoaWxlICgob2xkID0gYWVudHJ5KSAhPSBOVUxMKSB7Ci0JCXZ1bm1hcChhZW50cnktPnZtX2FkZHIpOwotCQlhZW50cnkgPSBhZW50cnktPm5leHQ7Ci0JCWtmcmVlKG9sZCk7Ci0JfQotfQotCi0vKgogICoJSW50ZXJuYWwgeGZzX2J1Zl90IG9iamVjdCBtYW5pcHVsYXRpb24KICAqLwogCkBAIC0zMzMsNyArMjY0LDcgQEAKIAkJdWludAkJaTsKIAogCQlpZiAoKGJwLT5iX2ZsYWdzICYgWEJGX01BUFBFRCkgJiYgKGJwLT5iX3BhZ2VfY291bnQgPiAxKSkKLQkJCWZyZWVfYWRkcmVzcyhicC0+Yl9hZGRyIC0gYnAtPmJfb2Zmc2V0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgdm1fdW5tYXBfcmFtKGJwLT5iX2FkZHIgLSBicC0+Yl9vZmZzZXQsIGJwLT5iX3BhZ2VfY291bnQpOwogCiAJCWZvciAoaSA9IDA7IGkgPCBicC0+Yl9wYWdlX2NvdW50OyBpKyspIHsKIAkJCXN0cnVjdCBwYWdlCSpwYWdlID0gYnAtPmJfcGFnZXNbaV07CkBAIC00NTUsMTAgKzM4Niw4IEBACiAJCWJwLT5iX2FkZHIgPSBwYWdlX2FkZHJlc3MoYnAtPmJfcGFnZXNbMF0pICsgYnAtPmJfb2Zmc2V0OwogCQlicC0+Yl9mbGFncyB8PSBYQkZfTUFQUEVEOwogCX0gZWxzZSBpZiAoZmxhZ3MgJiBYQkZfTUFQUEVEKSB7Ci0JCWlmIChhc19saXN0X2xlbiA+IDY0KQotCQkJcHVyZ2VfYWRkcmVzc2VzKCk7Ci0JCWJwLT5iX2FkZHIgPSB2bWFwKGJwLT5iX3BhZ2VzLCBicC0+Yl9wYWdlX2NvdW50LAotCQkJCQlWTV9NQVAsIFBBR0VfS0VSTkVMKTsKKyAgICAgICAgICAgICAgIGJwLT5iX2FkZHIgPSB2bV9tYXBfcmFtKGJwLT5iX3BhZ2VzLCBicC0+Yl9wYWdlX2NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEsIFBBR0VfS0VSTkVMKTsKIAkJaWYgKHVubGlrZWx5KGJwLT5iX2FkZHIgPT0gTlVMTCkpCiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJYnAtPmJfYWRkciArPSBicC0+Yl9vZmZzZXQ7CkBAIC0xNzQzLDggKzE2NzIsNiBAQAogCQkJY291bnQrKzsKIAkJfQogCi0JCWlmIChhc19saXN0X2xlbiA+IDApCi0JCQlwdXJnZV9hZGRyZXNzZXMoKTsKIAkJaWYgKGNvdW50KQogCQkJYmxrX3J1bl9hZGRyZXNzX3NwYWNlKHRhcmdldC0+YnRfbWFwcGluZyk7CiAKZGlmZiAtLWdpdCBhL2ZzL3hmcy9saW51eC0yLjYveGZzX2V4cG9ydC5jIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfZXhwb3J0LmMKaW5kZXggNTk1NzUxZi4uODdiOGNiZCAxMDA2NDQKLS0tIGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfZXhwb3J0LmMKKysrIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfZXhwb3J0LmMKQEAgLTEyNiwxMSArMTI2LDI2IEBACiAJaWYgKGlubyA9PSAwKQogCQlyZXR1cm4gRVJSX1BUUigtRVNUQUxFKTsKIAotCWVycm9yID0geGZzX2lnZXQobXAsIE5VTEwsIGlubywgMCwgWEZTX0lMT0NLX1NIQVJFRCwgJmlwLCAwKTsKLQlpZiAoZXJyb3IpCisJLyoKKwkgKiBUaGUgWEZTX0lHRVRfQlVMS1NUQVQgbWVhbnMgdGhhdCBhbiBpbnZhbGlkIGlub2RlIG51bWJlciBpcyBqdXN0CisJICogZmluZSBhbmQgbm90IGFuIGluZGljYXRpb24gb2YgYSBjb3JydXB0ZWQgZmlsZXN5c3RlbS4gIEJlY2F1c2UKKwkgKiBjbGllbnRzIGNhbiBzZW5kIGFueSBraW5kIG9mIGludmFsaWQgZmlsZSBoYW5kbGUsIGUuZy4gYWZ0ZXIKKwkgKiBhIHJlc3RvcmUgb24gdGhlIHNlcnZlciB3ZSBoYXZlIHRvIGRlYWwgd2l0aCB0aGlzIGNhc2UgZ3JhY2VmdWxseS4KKwkgKi8KKwllcnJvciA9IHhmc19pZ2V0KG1wLCBOVUxMLCBpbm8sIFhGU19JR0VUX0JVTEtTVEFULAorCQkJIFhGU19JTE9DS19TSEFSRUQsICZpcCwgMCk7CisJaWYgKGVycm9yKSB7CisJCS8qCisJCSAqIEVJTlZBTCBtZWFucyB0aGUgaW5vZGUgY2x1c3RlciBkb2Vzbid0IGV4aXN0IGFueW1vcmUuCisJCSAqIFRoaXMgaW1wbGllcyB0aGUgZmlsZWhhbmRsZSBpcyBzdGFsZSwgc28gd2Ugc2hvdWxkCisJCSAqIHRyYW5zbGF0ZSBpdCBoZXJlLgorCQkgKiBXZSBkb24ndCB1c2UgRVNUQUxFIGRpcmVjdGx5IGRvd24gdGhlIGNoYWluIHRvIG5vdAorCQkgKiBjb25mdXNlIGFwcGxpY2F0aW9ucyB1c2luZyBidWxrc3RhdCB0aGF0IGV4cGVjdCBFSU5WQUwuCisJCSAqLworCQlpZiAoZXJyb3IgPT0gRUlOVkFMKQorCQkJZXJyb3IgPSBFU1RBTEU7CiAJCXJldHVybiBFUlJfUFRSKC1lcnJvcik7Ci0JaWYgKCFpcCkKLQkJcmV0dXJuIEVSUl9QVFIoLUVJTyk7CisJfQogCiAJaWYgKGlwLT5pX2QuZGlfZ2VuICE9IGdlbmVyYXRpb24pIHsKIAkJeGZzX2lwdXRfbmV3KGlwLCBYRlNfSUxPQ0tfU0hBUkVEKTsKZGlmZiAtLWdpdCBhL2ZzL3hmcy9saW51eC0yLjYveGZzX2lvY3RsLmMgYi9mcy94ZnMvbGludXgtMi42L3hmc19pb2N0bC5jCmluZGV4IDY3MjA1ZjYuLmU1YmUxZTAgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy9saW51eC0yLjYveGZzX2lvY3RsLmMKKysrIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfaW9jdGwuYwpAQCAtMTU0NiwyMSArMTU0Niw2IEBACiAJCXJldHVybiAtZXJyb3I7CiAJfQogCi0JY2FzZSBYRlNfSU9DX0ZSRUVaRToKLQkJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQotCQkJcmV0dXJuIC1FUEVSTTsKLQotCQlpZiAoaW5vZGUtPmlfc2ItPnNfZnJvemVuID09IFNCX1VORlJPWkVOKQotCQkJZnJlZXplX2JkZXYoaW5vZGUtPmlfc2ItPnNfYmRldik7Ci0JCXJldHVybiAwOwotCi0JY2FzZSBYRlNfSU9DX1RIQVc6Ci0JCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKLQkJCXJldHVybiAtRVBFUk07Ci0JCWlmIChpbm9kZS0+aV9zYi0+c19mcm96ZW4gIT0gU0JfVU5GUk9aRU4pCi0JCQl0aGF3X2JkZXYoaW5vZGUtPmlfc2ItPnNfYmRldiwgaW5vZGUtPmlfc2IpOwotCQlyZXR1cm4gMDsKLQogCWNhc2UgWEZTX0lPQ19HT0lOR0RPV046IHsKIAkJX191aW50MzJfdCBpbjsKIApkaWZmIC0tZ2l0IGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfaW9jdGwzMi5jIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfaW9jdGwzMi5jCmluZGV4IDA1MDRjZWMuLjUwOTAzYWQgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy9saW51eC0yLjYveGZzX2lvY3RsMzIuYworKysgYi9mcy94ZnMvbGludXgtMi42L3hmc19pb2N0bDMyLmMKQEAgLTYzMiw4ICs2MzIsNiBAQAogCWNhc2UgWEZTX0lPQ19TRVRfUkVTQkxLUzoKIAljYXNlIFhGU19JT0NfR0VUX1JFU0JMS1M6CiAJY2FzZSBYRlNfSU9DX0ZTR1JPV0ZTTE9HOgotCWNhc2UgWEZTX0lPQ19GUkVFWkU6Ci0JY2FzZSBYRlNfSU9DX1RIQVc6CiAJY2FzZSBYRlNfSU9DX0dPSU5HRE9XTjoKIAljYXNlIFhGU19JT0NfRVJST1JfSU5KRUNUSU9OOgogCWNhc2UgWEZTX0lPQ19FUlJPUl9DTEVBUkFMTDoKZGlmZiAtLWdpdCBhL2ZzL3hmcy9saW51eC0yLjYveGZzX3N1cGVyLmMgYi9mcy94ZnMvbGludXgtMi42L3hmc19zdXBlci5jCmluZGV4IDM2ZjZjYzcuLjk1YTk3MTAgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy9saW51eC0yLjYveGZzX3N1cGVyLmMKKysrIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfc3VwZXIuYwpAQCAtMTI2OSwxNCArMTI2OSwxNCBAQAogICogbmVlZCB0byB0YWtlIGNhcmUgb2YgdGhlIG1ldGFkYXRhLiBPbmNlIHRoYXQncyBkb25lIHdyaXRlIGEgZHVtbXkKICAqIHJlY29yZCB0byBkaXJ0eSB0aGUgbG9nIGluIGNhc2Ugb2YgYSBjcmFzaCB3aGlsZSBmcm96ZW4uCiAgKi8KLVNUQVRJQyB2b2lkCi14ZnNfZnNfbG9ja2ZzKAorU1RBVElDIGludAoreGZzX2ZzX2ZyZWV6ZSgKIAlzdHJ1Y3Qgc3VwZXJfYmxvY2sJKnNiKQogewogCXN0cnVjdCB4ZnNfbW91bnQJKm1wID0gWEZTX00oc2IpOwogCiAJeGZzX3F1aWVzY2VfYXR0cihtcCk7Ci0JeGZzX2ZzX2xvZ19kdW1teShtcCk7CisJcmV0dXJuIC14ZnNfZnNfbG9nX2R1bW15KG1wKTsKIH0KIAogU1RBVElDIGludApAQCAtMTM0OCw3ICsxMzQ4LDcgQEAKIHsKIAlpbnQJCQlyb25seSA9IChtcC0+bV9mbGFncyAmIFhGU19NT1VOVF9SRE9OTFkpOwogCi0JLyogRmFpbCBhIG1vdW50IHdoZXJlIHRoZSBsb2didWYgaXMgc21hbGxlciB0aGVuIHRoZSBsb2cgc3RyaXBlICovCisJLyogRmFpbCBhIG1vdW50IHdoZXJlIHRoZSBsb2didWYgaXMgc21hbGxlciB0aGFuIHRoZSBsb2cgc3RyaXBlICovCiAJaWYgKHhmc19zYl92ZXJzaW9uX2hhc2xvZ3YyKCZtcC0+bV9zYikpIHsKIAkJaWYgKG1wLT5tX2xvZ2JzaXplIDw9IDAgJiYKIAkJICAgIG1wLT5tX3NiLnNiX2xvZ3N1bml0ID4gWExPR19CSUdfUkVDT1JEX0JTSVpFKSB7CkBAIC0xNTU3LDcgKzE1NTcsNyBAQAogCS5wdXRfc3VwZXIJCT0geGZzX2ZzX3B1dF9zdXBlciwKIAkud3JpdGVfc3VwZXIJCT0geGZzX2ZzX3dyaXRlX3N1cGVyLAogCS5zeW5jX2ZzCQk9IHhmc19mc19zeW5jX3N1cGVyLAotCS53cml0ZV9zdXBlcl9sb2NrZnMJPSB4ZnNfZnNfbG9ja2ZzLAorCS5mcmVlemVfZnMJCT0geGZzX2ZzX2ZyZWV6ZSwKIAkuc3RhdGZzCQkJPSB4ZnNfZnNfc3RhdGZzLAogCS5yZW1vdW50X2ZzCQk9IHhmc19mc19yZW1vdW50LAogCS5zaG93X29wdGlvbnMJCT0geGZzX2ZzX3Nob3dfb3B0aW9ucywKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfYWNsLmggYi9mcy94ZnMveGZzX2FjbC5oCmluZGV4IGE0ZTI5M2IuLjY0MmYxZGIgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfYWNsLmgKKysrIGIvZnMveGZzL3hmc19hY2wuaApAQCAtMjIsNyArMjIsNiBAQAogICogQWNjZXNzIENvbnRyb2wgTGlzdHMKICAqLwogdHlwZWRlZiBfX3VpbnQxNl90CXhmc19hY2xfcGVybV90OwotdHlwZWRlZiBfX2ludDMyX3QJeGZzX2FjbF90eXBlX3Q7CiB0eXBlZGVmIF9faW50MzJfdAl4ZnNfYWNsX3RhZ190OwogdHlwZWRlZiBfX2ludDMyX3QJeGZzX2FjbF9pZF90OwogCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2FnLmggYi9mcy94ZnMveGZzX2FnLmgKaW5kZXggZjJlMjE4MS4uZDNiM2NmNyAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19hZy5oCisrKyBiL2ZzL3hmcy94ZnNfYWcuaApAQCAtMjMxLDcgKzIzMSw3IEBACiAjZGVmaW5lCVhGU19GU0JfVE9fQUdOTyhtcCxmc2JubykJXAogCSgoeGZzX2FnbnVtYmVyX3QpKChmc2JubykgPj4gKG1wKS0+bV9zYi5zYl9hZ2Jsa2xvZykpCiAjZGVmaW5lCVhGU19GU0JfVE9fQUdCTk8obXAsZnNibm8pCVwKLQkoKHhmc19hZ2Jsb2NrX3QpKChmc2JubykgJiBYRlNfTUFTSzMyTE8oKG1wKS0+bV9zYi5zYl9hZ2Jsa2xvZykpKQorCSgoeGZzX2FnYmxvY2tfdCkoKGZzYm5vKSAmIHhmc19tYXNrMzJsbygobXApLT5tX3NiLnNiX2FnYmxrbG9nKSkpCiAjZGVmaW5lCVhGU19BR0JfVE9fREFERFIobXAsYWdubyxhZ2JubykJXAogCSgoeGZzX2RhZGRyX3QpWEZTX0ZTQl9UT19CQihtcCwgXAogCQkoeGZzX2ZzYmxvY2tfdCkoYWdubykgKiAobXApLT5tX3NiLnNiX2FnYmxvY2tzICsgKGFnYm5vKSkpCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2F0dHJfbGVhZi5jIGIvZnMveGZzL3hmc19hdHRyX2xlYWYuYwppbmRleCA3OWRhNmIyLi42YzMyM2Y4IDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2F0dHJfbGVhZi5jCisrKyBiL2ZzL3hmcy94ZnNfYXR0cl9sZWFmLmMKQEAgLTczNiw3ICs3MzYsNyBAQAogCQkJY29udGludWU7CQkvKiBkb24ndCBjb3B5IHBhcnRpYWwgZW50cmllcyAqLwogCQlpZiAoIShlbnRyeS0+ZmxhZ3MgJiBYRlNfQVRUUl9MT0NBTCkpCiAJCQlyZXR1cm4oMCk7Ci0JCW5hbWVfbG9jID0gWEZTX0FUVFJfTEVBRl9OQU1FX0xPQ0FMKGxlYWYsIGkpOworCQluYW1lX2xvYyA9IHhmc19hdHRyX2xlYWZfbmFtZV9sb2NhbChsZWFmLCBpKTsKIAkJaWYgKG5hbWVfbG9jLT5uYW1lbGVuID49IFhGU19BVFRSX1NGX0VOVFNJWkVfTUFYKQogCQkJcmV0dXJuKDApOwogCQlpZiAoYmUxNl90b19jcHUobmFtZV9sb2MtPnZhbHVlbGVuKSA+PSBYRlNfQVRUUl9TRl9FTlRTSVpFX01BWCkKQEAgLTgyMyw3ICs4MjMsNyBAQAogCQlpZiAoIWVudHJ5LT5uYW1laWR4KQogCQkJY29udGludWU7CiAJCUFTU0VSVChlbnRyeS0+ZmxhZ3MgJiBYRlNfQVRUUl9MT0NBTCk7Ci0JCW5hbWVfbG9jID0gWEZTX0FUVFJfTEVBRl9OQU1FX0xPQ0FMKGxlYWYsIGkpOworCQluYW1lX2xvYyA9IHhmc19hdHRyX2xlYWZfbmFtZV9sb2NhbChsZWFmLCBpKTsKIAkJbmFyZ3MubmFtZSA9IChjaGFyICopbmFtZV9sb2MtPm5hbWV2YWw7CiAJCW5hcmdzLm5hbWVsZW4gPSBuYW1lX2xvYy0+bmFtZWxlbjsKIAkJbmFyZ3MudmFsdWUgPSAoY2hhciAqKSZuYW1lX2xvYy0+bmFtZXZhbFtuYXJncy5uYW1lbGVuXTsKQEAgLTExNDEsMTQgKzExNDEsMTQgQEAKIAkgKiBhcyBwYXJ0IG9mIHRoaXMgdHJhbnNhY3Rpb24gKGEgc3BsaXQgb3BlcmF0aW9uIGZvciBleGFtcGxlKS4KIAkgKi8KIAlpZiAoZW50cnktPmZsYWdzICYgWEZTX0FUVFJfTE9DQUwpIHsKLQkJbmFtZV9sb2MgPSBYRlNfQVRUUl9MRUFGX05BTUVfTE9DQUwobGVhZiwgYXJncy0+aW5kZXgpOworCQluYW1lX2xvYyA9IHhmc19hdHRyX2xlYWZfbmFtZV9sb2NhbChsZWFmLCBhcmdzLT5pbmRleCk7CiAJCW5hbWVfbG9jLT5uYW1lbGVuID0gYXJncy0+bmFtZWxlbjsKIAkJbmFtZV9sb2MtPnZhbHVlbGVuID0gY3B1X3RvX2JlMTYoYXJncy0+dmFsdWVsZW4pOwogCQltZW1jcHkoKGNoYXIgKiluYW1lX2xvYy0+bmFtZXZhbCwgYXJncy0+bmFtZSwgYXJncy0+bmFtZWxlbik7CiAJCW1lbWNweSgoY2hhciAqKSZuYW1lX2xvYy0+bmFtZXZhbFthcmdzLT5uYW1lbGVuXSwgYXJncy0+dmFsdWUsCiAJCQkJICAgYmUxNl90b19jcHUobmFtZV9sb2MtPnZhbHVlbGVuKSk7CiAJfSBlbHNlIHsKLQkJbmFtZV9ybXQgPSBYRlNfQVRUUl9MRUFGX05BTUVfUkVNT1RFKGxlYWYsIGFyZ3MtPmluZGV4KTsKKwkJbmFtZV9ybXQgPSB4ZnNfYXR0cl9sZWFmX25hbWVfcmVtb3RlKGxlYWYsIGFyZ3MtPmluZGV4KTsKIAkJbmFtZV9ybXQtPm5hbWVsZW4gPSBhcmdzLT5uYW1lbGVuOwogCQltZW1jcHkoKGNoYXIgKiluYW1lX3JtdC0+bmFtZSwgYXJncy0+bmFtZSwgYXJncy0+bmFtZWxlbik7CiAJCWVudHJ5LT5mbGFncyB8PSBYRlNfQVRUUl9JTkNPTVBMRVRFOwpAQCAtMTE1OSw3ICsxMTU5LDcgQEAKIAkJYXJncy0+cm10YmxrY250ID0gWEZTX0JfVE9fRlNCKG1wLCBhcmdzLT52YWx1ZWxlbik7CiAJfQogCXhmc19kYV9sb2dfYnVmKGFyZ3MtPnRyYW5zLCBicCwKLQkgICAgIFhGU19EQV9MT0dSQU5HRShsZWFmLCBYRlNfQVRUUl9MRUFGX05BTUUobGVhZiwgYXJncy0+aW5kZXgpLAorCSAgICAgWEZTX0RBX0xPR1JBTkdFKGxlYWYsIHhmc19hdHRyX2xlYWZfbmFtZShsZWFmLCBhcmdzLT5pbmRleCksCiAJCQkJICAgeGZzX2F0dHJfbGVhZl9lbnRzaXplKGxlYWYsIGFyZ3MtPmluZGV4KSkpOwogCiAJLyoKQEAgLTE3NDksMTAgKzE3NDksMTAgQEAKIAkvKgogCSAqIENvbXByZXNzIHRoZSByZW1haW5pbmcgZW50cmllcyBhbmQgemVybyBvdXQgdGhlIHJlbW92ZWQgc3R1ZmYuCiAJICovCi0JbWVtc2V0KFhGU19BVFRSX0xFQUZfTkFNRShsZWFmLCBhcmdzLT5pbmRleCksIDAsIGVudHNpemUpOworCW1lbXNldCh4ZnNfYXR0cl9sZWFmX25hbWUobGVhZiwgYXJncy0+aW5kZXgpLCAwLCBlbnRzaXplKTsKIAliZTE2X2FkZF9jcHUoJmhkci0+dXNlZGJ5dGVzLCAtZW50c2l6ZSk7CiAJeGZzX2RhX2xvZ19idWYoYXJncy0+dHJhbnMsIGJwLAotCSAgICAgWEZTX0RBX0xPR1JBTkdFKGxlYWYsIFhGU19BVFRSX0xFQUZfTkFNRShsZWFmLCBhcmdzLT5pbmRleCksCisJICAgICBYRlNfREFfTE9HUkFOR0UobGVhZiwgeGZzX2F0dHJfbGVhZl9uYW1lKGxlYWYsIGFyZ3MtPmluZGV4KSwKIAkJCQkgICBlbnRzaXplKSk7CiAKIAl0bXAgPSAoYmUxNl90b19jcHUoaGRyLT5jb3VudCkgLSBhcmdzLT5pbmRleCkKQEAgLTE5ODUsNyArMTk4NSw3IEBACiAJCQljb250aW51ZTsKIAkJfQogCQlpZiAoZW50cnktPmZsYWdzICYgWEZTX0FUVFJfTE9DQUwpIHsKLQkJCW5hbWVfbG9jID0gWEZTX0FUVFJfTEVBRl9OQU1FX0xPQ0FMKGxlYWYsIHByb2JlKTsKKwkJCW5hbWVfbG9jID0geGZzX2F0dHJfbGVhZl9uYW1lX2xvY2FsKGxlYWYsIHByb2JlKTsKIAkJCWlmIChuYW1lX2xvYy0+bmFtZWxlbiAhPSBhcmdzLT5uYW1lbGVuKQogCQkJCWNvbnRpbnVlOwogCQkJaWYgKG1lbWNtcChhcmdzLT5uYW1lLCAoY2hhciAqKW5hbWVfbG9jLT5uYW1ldmFsLCBhcmdzLT5uYW1lbGVuKSAhPSAwKQpAQCAtMTk5NSw3ICsxOTk1LDcgQEAKIAkJCWFyZ3MtPmluZGV4ID0gcHJvYmU7CiAJCQlyZXR1cm4oWEZTX0VSUk9SKEVFWElTVCkpOwogCQl9IGVsc2UgewotCQkJbmFtZV9ybXQgPSBYRlNfQVRUUl9MRUFGX05BTUVfUkVNT1RFKGxlYWYsIHByb2JlKTsKKwkJCW5hbWVfcm10ID0geGZzX2F0dHJfbGVhZl9uYW1lX3JlbW90ZShsZWFmLCBwcm9iZSk7CiAJCQlpZiAobmFtZV9ybXQtPm5hbWVsZW4gIT0gYXJncy0+bmFtZWxlbikKIAkJCQljb250aW51ZTsKIAkJCWlmIChtZW1jbXAoYXJncy0+bmFtZSwgKGNoYXIgKiluYW1lX3JtdC0+bmFtZSwKQEAgLTIwMzUsNyArMjAzNSw3IEBACiAKIAllbnRyeSA9ICZsZWFmLT5lbnRyaWVzW2FyZ3MtPmluZGV4XTsKIAlpZiAoZW50cnktPmZsYWdzICYgWEZTX0FUVFJfTE9DQUwpIHsKLQkJbmFtZV9sb2MgPSBYRlNfQVRUUl9MRUFGX05BTUVfTE9DQUwobGVhZiwgYXJncy0+aW5kZXgpOworCQluYW1lX2xvYyA9IHhmc19hdHRyX2xlYWZfbmFtZV9sb2NhbChsZWFmLCBhcmdzLT5pbmRleCk7CiAJCUFTU0VSVChuYW1lX2xvYy0+bmFtZWxlbiA9PSBhcmdzLT5uYW1lbGVuKTsKIAkJQVNTRVJUKG1lbWNtcChhcmdzLT5uYW1lLCBuYW1lX2xvYy0+bmFtZXZhbCwgYXJncy0+bmFtZWxlbikgPT0gMCk7CiAJCXZhbHVlbGVuID0gYmUxNl90b19jcHUobmFtZV9sb2MtPnZhbHVlbGVuKTsKQEAgLTIwNTAsNyArMjA1MCw3IEBACiAJCWFyZ3MtPnZhbHVlbGVuID0gdmFsdWVsZW47CiAJCW1lbWNweShhcmdzLT52YWx1ZSwgJm5hbWVfbG9jLT5uYW1ldmFsW2FyZ3MtPm5hbWVsZW5dLCB2YWx1ZWxlbik7CiAJfSBlbHNlIHsKLQkJbmFtZV9ybXQgPSBYRlNfQVRUUl9MRUFGX05BTUVfUkVNT1RFKGxlYWYsIGFyZ3MtPmluZGV4KTsKKwkJbmFtZV9ybXQgPSB4ZnNfYXR0cl9sZWFmX25hbWVfcmVtb3RlKGxlYWYsIGFyZ3MtPmluZGV4KTsKIAkJQVNTRVJUKG5hbWVfcm10LT5uYW1lbGVuID09IGFyZ3MtPm5hbWVsZW4pOwogCQlBU1NFUlQobWVtY21wKGFyZ3MtPm5hbWUsIG5hbWVfcm10LT5uYW1lLCBhcmdzLT5uYW1lbGVuKSA9PSAwKTsKIAkJdmFsdWVsZW4gPSBiZTMyX3RvX2NwdShuYW1lX3JtdC0+dmFsdWVsZW4pOwpAQCAtMjE0Myw3ICsyMTQzLDcgQEAKIAkJICogb2ZmIGZvciA2LjIsIHNob3VsZCBiZSByZXZpc2l0ZWQgbGF0ZXIuCiAJCSAqLwogCQlpZiAoZW50cnlfcy0+ZmxhZ3MgJiBYRlNfQVRUUl9JTkNPTVBMRVRFKSB7IC8qIHNraXAgcGFydGlhbHM/ICovCi0JCQltZW1zZXQoWEZTX0FUVFJfTEVBRl9OQU1FKGxlYWZfcywgc3RhcnRfcyArIGkpLCAwLCB0bXApOworCQkJbWVtc2V0KHhmc19hdHRyX2xlYWZfbmFtZShsZWFmX3MsIHN0YXJ0X3MgKyBpKSwgMCwgdG1wKTsKIAkJCWJlMTZfYWRkX2NwdSgmaGRyX3MtPnVzZWRieXRlcywgLXRtcCk7CiAJCQliZTE2X2FkZF9jcHUoJmhkcl9zLT5jb3VudCwgLTEpOwogCQkJZW50cnlfZC0tOwkvKiB0byBjb21wZW5zYXRlIGZvciArKyBpbiBsb29wIGhkciAqLwpAQCAtMjE2MCwxMSArMjE2MCwxMSBAQAogCQkJZW50cnlfZC0+ZmxhZ3MgPSBlbnRyeV9zLT5mbGFnczsKIAkJCUFTU0VSVChiZTE2X3RvX2NwdShlbnRyeV9kLT5uYW1laWR4KSArIHRtcAogCQkJCQkJCTw9IFhGU19MQlNJWkUobXApKTsKLQkJCW1lbW1vdmUoWEZTX0FUVFJfTEVBRl9OQU1FKGxlYWZfZCwgZGVzdGkpLAotCQkJCVhGU19BVFRSX0xFQUZfTkFNRShsZWFmX3MsIHN0YXJ0X3MgKyBpKSwgdG1wKTsKKwkJCW1lbW1vdmUoeGZzX2F0dHJfbGVhZl9uYW1lKGxlYWZfZCwgZGVzdGkpLAorCQkJCXhmc19hdHRyX2xlYWZfbmFtZShsZWFmX3MsIHN0YXJ0X3MgKyBpKSwgdG1wKTsKIAkJCUFTU0VSVChiZTE2X3RvX2NwdShlbnRyeV9zLT5uYW1laWR4KSArIHRtcAogCQkJCQkJCTw9IFhGU19MQlNJWkUobXApKTsKLQkJCW1lbXNldChYRlNfQVRUUl9MRUFGX05BTUUobGVhZl9zLCBzdGFydF9zICsgaSksIDAsIHRtcCk7CisJCQltZW1zZXQoeGZzX2F0dHJfbGVhZl9uYW1lKGxlYWZfcywgc3RhcnRfcyArIGkpLCAwLCB0bXApOwogCQkJYmUxNl9hZGRfY3B1KCZoZHJfcy0+dXNlZGJ5dGVzLCAtdG1wKTsKIAkJCWJlMTZfYWRkX2NwdSgmaGRyX2QtPnVzZWRieXRlcywgdG1wKTsKIAkJCWJlMTZfYWRkX2NwdSgmaGRyX3MtPmNvdW50LCAtMSk7CkBAIC0yMjc2LDEyICsyMjc2LDEyIEBACiAKIAlBU1NFUlQoYmUxNl90b19jcHUobGVhZi0+aGRyLmluZm8ubWFnaWMpID09IFhGU19BVFRSX0xFQUZfTUFHSUMpOwogCWlmIChsZWFmLT5lbnRyaWVzW2luZGV4XS5mbGFncyAmIFhGU19BVFRSX0xPQ0FMKSB7Ci0JCW5hbWVfbG9jID0gWEZTX0FUVFJfTEVBRl9OQU1FX0xPQ0FMKGxlYWYsIGluZGV4KTsKLQkJc2l6ZSA9IFhGU19BVFRSX0xFQUZfRU5UU0laRV9MT0NBTChuYW1lX2xvYy0+bmFtZWxlbiwKKwkJbmFtZV9sb2MgPSB4ZnNfYXR0cl9sZWFmX25hbWVfbG9jYWwobGVhZiwgaW5kZXgpOworCQlzaXplID0geGZzX2F0dHJfbGVhZl9lbnRzaXplX2xvY2FsKG5hbWVfbG9jLT5uYW1lbGVuLAogCQkJCQkJICAgYmUxNl90b19jcHUobmFtZV9sb2MtPnZhbHVlbGVuKSk7CiAJfSBlbHNlIHsKLQkJbmFtZV9ybXQgPSBYRlNfQVRUUl9MRUFGX05BTUVfUkVNT1RFKGxlYWYsIGluZGV4KTsKLQkJc2l6ZSA9IFhGU19BVFRSX0xFQUZfRU5UU0laRV9SRU1PVEUobmFtZV9ybXQtPm5hbWVsZW4pOworCQluYW1lX3JtdCA9IHhmc19hdHRyX2xlYWZfbmFtZV9yZW1vdGUobGVhZiwgaW5kZXgpOworCQlzaXplID0geGZzX2F0dHJfbGVhZl9lbnRzaXplX3JlbW90ZShuYW1lX3JtdC0+bmFtZWxlbik7CiAJfQogCXJldHVybihzaXplKTsKIH0KQEAgLTIyOTcsMTMgKzIyOTcsMTMgQEAKIHsKIAlpbnQgc2l6ZTsKIAotCXNpemUgPSBYRlNfQVRUUl9MRUFGX0VOVFNJWkVfTE9DQUwobmFtZWxlbiwgdmFsdWVsZW4pOwotCWlmIChzaXplIDwgWEZTX0FUVFJfTEVBRl9FTlRTSVpFX0xPQ0FMX01BWChibG9ja3NpemUpKSB7CisJc2l6ZSA9IHhmc19hdHRyX2xlYWZfZW50c2l6ZV9sb2NhbChuYW1lbGVuLCB2YWx1ZWxlbik7CisJaWYgKHNpemUgPCB4ZnNfYXR0cl9sZWFmX2VudHNpemVfbG9jYWxfbWF4KGJsb2Nrc2l6ZSkpIHsKIAkJaWYgKGxvY2FsKSB7CiAJCQkqbG9jYWwgPSAxOwogCQl9CiAJfSBlbHNlIHsKLQkJc2l6ZSA9IFhGU19BVFRSX0xFQUZfRU5UU0laRV9SRU1PVEUobmFtZWxlbik7CisJCXNpemUgPSB4ZnNfYXR0cl9sZWFmX2VudHNpemVfcmVtb3RlKG5hbWVsZW4pOwogCQlpZiAobG9jYWwpIHsKIAkJCSpsb2NhbCA9IDA7CiAJCX0KQEAgLTIzNzIsNyArMjM3Miw3IEBACiAKIAkJaWYgKGVudHJ5LT5mbGFncyAmIFhGU19BVFRSX0xPQ0FMKSB7CiAJCQl4ZnNfYXR0cl9sZWFmX25hbWVfbG9jYWxfdCAqbmFtZV9sb2MgPQotCQkJCVhGU19BVFRSX0xFQUZfTkFNRV9MT0NBTChsZWFmLCBpKTsKKwkJCQl4ZnNfYXR0cl9sZWFmX25hbWVfbG9jYWwobGVhZiwgaSk7CiAKIAkJCXJldHZhbCA9IGNvbnRleHQtPnB1dF9saXN0ZW50KGNvbnRleHQsCiAJCQkJCQllbnRyeS0+ZmxhZ3MsCkBAIC0yMzg0LDcgKzIzODQsNyBAQAogCQkJCXJldHVybiByZXR2YWw7CiAJCX0gZWxzZSB7CiAJCQl4ZnNfYXR0cl9sZWFmX25hbWVfcmVtb3RlX3QgKm5hbWVfcm10ID0KLQkJCQlYRlNfQVRUUl9MRUFGX05BTUVfUkVNT1RFKGxlYWYsIGkpOworCQkJCXhmc19hdHRyX2xlYWZfbmFtZV9yZW1vdGUobGVhZiwgaSk7CiAKIAkJCWludCB2YWx1ZWxlbiA9IGJlMzJfdG9fY3B1KG5hbWVfcm10LT52YWx1ZWxlbik7CiAKQEAgLTI0NjgsMTEgKzI0NjgsMTEgQEAKIAogI2lmZGVmIERFQlVHCiAJaWYgKGVudHJ5LT5mbGFncyAmIFhGU19BVFRSX0xPQ0FMKSB7Ci0JCW5hbWVfbG9jID0gWEZTX0FUVFJfTEVBRl9OQU1FX0xPQ0FMKGxlYWYsIGFyZ3MtPmluZGV4KTsKKwkJbmFtZV9sb2MgPSB4ZnNfYXR0cl9sZWFmX25hbWVfbG9jYWwobGVhZiwgYXJncy0+aW5kZXgpOwogCQluYW1lbGVuID0gbmFtZV9sb2MtPm5hbWVsZW47CiAJCW5hbWUgPSAoY2hhciAqKW5hbWVfbG9jLT5uYW1ldmFsOwogCX0gZWxzZSB7Ci0JCW5hbWVfcm10ID0gWEZTX0FUVFJfTEVBRl9OQU1FX1JFTU9URShsZWFmLCBhcmdzLT5pbmRleCk7CisJCW5hbWVfcm10ID0geGZzX2F0dHJfbGVhZl9uYW1lX3JlbW90ZShsZWFmLCBhcmdzLT5pbmRleCk7CiAJCW5hbWVsZW4gPSBuYW1lX3JtdC0+bmFtZWxlbjsKIAkJbmFtZSA9IChjaGFyICopbmFtZV9ybXQtPm5hbWU7CiAJfQpAQCAtMjQ4Nyw3ICsyNDg3LDcgQEAKIAogCWlmIChhcmdzLT5ybXRibGtubykgewogCQlBU1NFUlQoKGVudHJ5LT5mbGFncyAmIFhGU19BVFRSX0xPQ0FMKSA9PSAwKTsKLQkJbmFtZV9ybXQgPSBYRlNfQVRUUl9MRUFGX05BTUVfUkVNT1RFKGxlYWYsIGFyZ3MtPmluZGV4KTsKKwkJbmFtZV9ybXQgPSB4ZnNfYXR0cl9sZWFmX25hbWVfcmVtb3RlKGxlYWYsIGFyZ3MtPmluZGV4KTsKIAkJbmFtZV9ybXQtPnZhbHVlYmxrID0gY3B1X3RvX2JlMzIoYXJncy0+cm10Ymxrbm8pOwogCQluYW1lX3JtdC0+dmFsdWVsZW4gPSBjcHVfdG9fYmUzMihhcmdzLT52YWx1ZWxlbik7CiAJCXhmc19kYV9sb2dfYnVmKGFyZ3MtPnRyYW5zLCBicCwKQEAgLTI1MzQsNyArMjUzNCw3IEBACiAJeGZzX2RhX2xvZ19idWYoYXJncy0+dHJhbnMsIGJwLAogCQkJWEZTX0RBX0xPR1JBTkdFKGxlYWYsIGVudHJ5LCBzaXplb2YoKmVudHJ5KSkpOwogCWlmICgoZW50cnktPmZsYWdzICYgWEZTX0FUVFJfTE9DQUwpID09IDApIHsKLQkJbmFtZV9ybXQgPSBYRlNfQVRUUl9MRUFGX05BTUVfUkVNT1RFKGxlYWYsIGFyZ3MtPmluZGV4KTsKKwkJbmFtZV9ybXQgPSB4ZnNfYXR0cl9sZWFmX25hbWVfcmVtb3RlKGxlYWYsIGFyZ3MtPmluZGV4KTsKIAkJbmFtZV9ybXQtPnZhbHVlYmxrID0gMDsKIAkJbmFtZV9ybXQtPnZhbHVlbGVuID0gMDsKIAkJeGZzX2RhX2xvZ19idWYoYXJncy0+dHJhbnMsIGJwLApAQCAtMjYwNywyMCArMjYwNywyMCBAQAogCiAjaWZkZWYgREVCVUcKIAlpZiAoZW50cnkxLT5mbGFncyAmIFhGU19BVFRSX0xPQ0FMKSB7Ci0JCW5hbWVfbG9jID0gWEZTX0FUVFJfTEVBRl9OQU1FX0xPQ0FMKGxlYWYxLCBhcmdzLT5pbmRleCk7CisJCW5hbWVfbG9jID0geGZzX2F0dHJfbGVhZl9uYW1lX2xvY2FsKGxlYWYxLCBhcmdzLT5pbmRleCk7CiAJCW5hbWVsZW4xID0gbmFtZV9sb2MtPm5hbWVsZW47CiAJCW5hbWUxID0gKGNoYXIgKiluYW1lX2xvYy0+bmFtZXZhbDsKIAl9IGVsc2UgewotCQluYW1lX3JtdCA9IFhGU19BVFRSX0xFQUZfTkFNRV9SRU1PVEUobGVhZjEsIGFyZ3MtPmluZGV4KTsKKwkJbmFtZV9ybXQgPSB4ZnNfYXR0cl9sZWFmX25hbWVfcmVtb3RlKGxlYWYxLCBhcmdzLT5pbmRleCk7CiAJCW5hbWVsZW4xID0gbmFtZV9ybXQtPm5hbWVsZW47CiAJCW5hbWUxID0gKGNoYXIgKiluYW1lX3JtdC0+bmFtZTsKIAl9CiAJaWYgKGVudHJ5Mi0+ZmxhZ3MgJiBYRlNfQVRUUl9MT0NBTCkgewotCQluYW1lX2xvYyA9IFhGU19BVFRSX0xFQUZfTkFNRV9MT0NBTChsZWFmMiwgYXJncy0+aW5kZXgyKTsKKwkJbmFtZV9sb2MgPSB4ZnNfYXR0cl9sZWFmX25hbWVfbG9jYWwobGVhZjIsIGFyZ3MtPmluZGV4Mik7CiAJCW5hbWVsZW4yID0gbmFtZV9sb2MtPm5hbWVsZW47CiAJCW5hbWUyID0gKGNoYXIgKiluYW1lX2xvYy0+bmFtZXZhbDsKIAl9IGVsc2UgewotCQluYW1lX3JtdCA9IFhGU19BVFRSX0xFQUZfTkFNRV9SRU1PVEUobGVhZjIsIGFyZ3MtPmluZGV4Mik7CisJCW5hbWVfcm10ID0geGZzX2F0dHJfbGVhZl9uYW1lX3JlbW90ZShsZWFmMiwgYXJncy0+aW5kZXgyKTsKIAkJbmFtZWxlbjIgPSBuYW1lX3JtdC0+bmFtZWxlbjsKIAkJbmFtZTIgPSAoY2hhciAqKW5hbWVfcm10LT5uYW1lOwogCX0KQEAgLTI2MzcsNyArMjYzNyw3IEBACiAJCQkgIFhGU19EQV9MT0dSQU5HRShsZWFmMSwgZW50cnkxLCBzaXplb2YoKmVudHJ5MSkpKTsKIAlpZiAoYXJncy0+cm10Ymxrbm8pIHsKIAkJQVNTRVJUKChlbnRyeTEtPmZsYWdzICYgWEZTX0FUVFJfTE9DQUwpID09IDApOwotCQluYW1lX3JtdCA9IFhGU19BVFRSX0xFQUZfTkFNRV9SRU1PVEUobGVhZjEsIGFyZ3MtPmluZGV4KTsKKwkJbmFtZV9ybXQgPSB4ZnNfYXR0cl9sZWFmX25hbWVfcmVtb3RlKGxlYWYxLCBhcmdzLT5pbmRleCk7CiAJCW5hbWVfcm10LT52YWx1ZWJsayA9IGNwdV90b19iZTMyKGFyZ3MtPnJtdGJsa25vKTsKIAkJbmFtZV9ybXQtPnZhbHVlbGVuID0gY3B1X3RvX2JlMzIoYXJncy0+dmFsdWVsZW4pOwogCQl4ZnNfZGFfbG9nX2J1ZihhcmdzLT50cmFucywgYnAxLApAQCAtMjY0OCw3ICsyNjQ4LDcgQEAKIAl4ZnNfZGFfbG9nX2J1ZihhcmdzLT50cmFucywgYnAyLAogCQkJICBYRlNfREFfTE9HUkFOR0UobGVhZjIsIGVudHJ5Miwgc2l6ZW9mKCplbnRyeTIpKSk7CiAJaWYgKChlbnRyeTItPmZsYWdzICYgWEZTX0FUVFJfTE9DQUwpID09IDApIHsKLQkJbmFtZV9ybXQgPSBYRlNfQVRUUl9MRUFGX05BTUVfUkVNT1RFKGxlYWYyLCBhcmdzLT5pbmRleDIpOworCQluYW1lX3JtdCA9IHhmc19hdHRyX2xlYWZfbmFtZV9yZW1vdGUobGVhZjIsIGFyZ3MtPmluZGV4Mik7CiAJCW5hbWVfcm10LT52YWx1ZWJsayA9IDA7CiAJCW5hbWVfcm10LT52YWx1ZWxlbiA9IDA7CiAJCXhmc19kYV9sb2dfYnVmKGFyZ3MtPnRyYW5zLCBicDIsCkBAIC0yODU1LDcgKzI4NTUsNyBAQAogCWZvciAoaSA9IDA7IGkgPCBiZTE2X3RvX2NwdShsZWFmLT5oZHIuY291bnQpOyBlbnRyeSsrLCBpKyspIHsKIAkJaWYgKGJlMTZfdG9fY3B1KGVudHJ5LT5uYW1laWR4KSAmJgogCQkgICAgKChlbnRyeS0+ZmxhZ3MgJiBYRlNfQVRUUl9MT0NBTCkgPT0gMCkpIHsKLQkJCW5hbWVfcm10ID0gWEZTX0FUVFJfTEVBRl9OQU1FX1JFTU9URShsZWFmLCBpKTsKKwkJCW5hbWVfcm10ID0geGZzX2F0dHJfbGVhZl9uYW1lX3JlbW90ZShsZWFmLCBpKTsKIAkJCWlmIChuYW1lX3JtdC0+dmFsdWVibGspCiAJCQkJY291bnQrKzsKIAkJfQpAQCAtMjg4Myw3ICsyODgzLDcgQEAKIAlmb3IgKGkgPSAwOyBpIDwgYmUxNl90b19jcHUobGVhZi0+aGRyLmNvdW50KTsgZW50cnkrKywgaSsrKSB7CiAJCWlmIChiZTE2X3RvX2NwdShlbnRyeS0+bmFtZWlkeCkgJiYKIAkJICAgICgoZW50cnktPmZsYWdzICYgWEZTX0FUVFJfTE9DQUwpID09IDApKSB7Ci0JCQluYW1lX3JtdCA9IFhGU19BVFRSX0xFQUZfTkFNRV9SRU1PVEUobGVhZiwgaSk7CisJCQluYW1lX3JtdCA9IHhmc19hdHRyX2xlYWZfbmFtZV9yZW1vdGUobGVhZiwgaSk7CiAJCQlpZiAobmFtZV9ybXQtPnZhbHVlYmxrKSB7CiAJCQkJbHAtPnZhbHVlYmxrID0gYmUzMl90b19jcHUobmFtZV9ybXQtPnZhbHVlYmxrKTsKIAkJCQlscC0+dmFsdWVsZW4gPSBYRlNfQl9UT19GU0IoZHAtPmlfbW91bnQsCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2F0dHJfbGVhZi5oIGIvZnMveGZzL3hmc19hdHRyX2xlYWYuaAppbmRleCA4M2U5YWY0Li45YzdkMjJmIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2F0dHJfbGVhZi5oCisrKyBiL2ZzL3hmcy94ZnNfYXR0cl9sZWFmLmgKQEAgLTE1MSw4ICsxNTEsNiBAQAogLyoKICAqIENhc3QgdHlwZWQgcG9pbnRlcnMgZm9yICJsb2NhbCIgYW5kICJyZW1vdGUiIG5hbWUvdmFsdWUgc3RydWN0cy4KICAqLwotI2RlZmluZSBYRlNfQVRUUl9MRUFGX05BTUVfUkVNT1RFKGxlYWZwLGlkeCkJXAotCXhmc19hdHRyX2xlYWZfbmFtZV9yZW1vdGUobGVhZnAsaWR4KQogc3RhdGljIGlubGluZSB4ZnNfYXR0cl9sZWFmX25hbWVfcmVtb3RlX3QgKgogeGZzX2F0dHJfbGVhZl9uYW1lX3JlbW90ZSh4ZnNfYXR0cl9sZWFmYmxvY2tfdCAqbGVhZnAsIGludCBpZHgpCiB7CkBAIC0xNjAsOCArMTU4LDYgQEAKIAkJJigoY2hhciAqKWxlYWZwKVtiZTE2X3RvX2NwdShsZWFmcC0+ZW50cmllc1tpZHhdLm5hbWVpZHgpXTsKIH0KIAotI2RlZmluZSBYRlNfQVRUUl9MRUFGX05BTUVfTE9DQUwobGVhZnAsaWR4KQlcCi0JeGZzX2F0dHJfbGVhZl9uYW1lX2xvY2FsKGxlYWZwLGlkeCkKIHN0YXRpYyBpbmxpbmUgeGZzX2F0dHJfbGVhZl9uYW1lX2xvY2FsX3QgKgogeGZzX2F0dHJfbGVhZl9uYW1lX2xvY2FsKHhmc19hdHRyX2xlYWZibG9ja190ICpsZWFmcCwgaW50IGlkeCkKIHsKQEAgLTE2OSw4ICsxNjUsNiBAQAogCQkmKChjaGFyICopbGVhZnApW2JlMTZfdG9fY3B1KGxlYWZwLT5lbnRyaWVzW2lkeF0ubmFtZWlkeCldOwogfQogCi0jZGVmaW5lIFhGU19BVFRSX0xFQUZfTkFNRShsZWFmcCxpZHgpCQlcCi0JeGZzX2F0dHJfbGVhZl9uYW1lKGxlYWZwLGlkeCkKIHN0YXRpYyBpbmxpbmUgY2hhciAqeGZzX2F0dHJfbGVhZl9uYW1lKHhmc19hdHRyX2xlYWZibG9ja190ICpsZWFmcCwgaW50IGlkeCkKIHsKIAlyZXR1cm4gJigoY2hhciAqKWxlYWZwKVtiZTE2X3RvX2NwdShsZWFmcC0+ZW50cmllc1tpZHhdLm5hbWVpZHgpXTsKQEAgLTE4MSwyNCArMTc1LDE4IEBACiAgKiBhICJsb2NhbCIgbmFtZS92YWx1ZSBzdHJ1Y3R1cmUsIGEgInJlbW90ZSIgbmFtZS92YWx1ZSBzdHJ1Y3R1cmUsIGFuZAogICogYSBwb2ludGVyIHdoaWNoIG1pZ2h0IGJlIGVpdGhlci4KICAqLwotI2RlZmluZSBYRlNfQVRUUl9MRUFGX0VOVFNJWkVfUkVNT1RFKG5sZW4pCVwKLQl4ZnNfYXR0cl9sZWFmX2VudHNpemVfcmVtb3RlKG5sZW4pCiBzdGF0aWMgaW5saW5lIGludCB4ZnNfYXR0cl9sZWFmX2VudHNpemVfcmVtb3RlKGludCBubGVuKQogewogCXJldHVybiAoKHVpbnQpc2l6ZW9mKHhmc19hdHRyX2xlYWZfbmFtZV9yZW1vdGVfdCkgLSAxICsgKG5sZW4pICsgXAogCQlYRlNfQVRUUl9MRUFGX05BTUVfQUxJR04gLSAxKSAmIH4oWEZTX0FUVFJfTEVBRl9OQU1FX0FMSUdOIC0gMSk7CiB9CiAKLSNkZWZpbmUgWEZTX0FUVFJfTEVBRl9FTlRTSVpFX0xPQ0FMKG5sZW4sdmxlbikJXAotCXhmc19hdHRyX2xlYWZfZW50c2l6ZV9sb2NhbChubGVuLHZsZW4pCiBzdGF0aWMgaW5saW5lIGludCB4ZnNfYXR0cl9sZWFmX2VudHNpemVfbG9jYWwoaW50IG5sZW4sIGludCB2bGVuKQogewogCXJldHVybiAoKHVpbnQpc2l6ZW9mKHhmc19hdHRyX2xlYWZfbmFtZV9sb2NhbF90KSAtIDEgKyAobmxlbikgKyAodmxlbikgKwogCQlYRlNfQVRUUl9MRUFGX05BTUVfQUxJR04gLSAxKSAmIH4oWEZTX0FUVFJfTEVBRl9OQU1FX0FMSUdOIC0gMSk7CiB9CiAKLSNkZWZpbmUgWEZTX0FUVFJfTEVBRl9FTlRTSVpFX0xPQ0FMX01BWChic2l6ZSkJXAotCXhmc19hdHRyX2xlYWZfZW50c2l6ZV9sb2NhbF9tYXgoYnNpemUpCiBzdGF0aWMgaW5saW5lIGludCB4ZnNfYXR0cl9sZWFmX2VudHNpemVfbG9jYWxfbWF4KGludCBic2l6ZSkKIHsKIAlyZXR1cm4gKCgoYnNpemUpID4+IDEpICsgKChic2l6ZSkgPj4gMikpOwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19iaXQuaCBiL2ZzL3hmcy94ZnNfYml0LmgKaW5kZXggYmNhN2IyNC4uZjFlM2M5MCAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19iaXQuaAorKysgYi9mcy94ZnMveGZzX2JpdC5oCkBAIC0yMywyNCArMjMsMTYgQEAKICAqLwogCiAvKgotICogbWFza3Mgd2l0aCBuIGhpZ2gvbG93IGJpdHMgc2V0LCAzMi1iaXQgdmFsdWVzICYgNjQtYml0IHZhbHVlcworICogbWFza3Mgd2l0aCBuIGhpZ2gvbG93IGJpdHMgc2V0LCA2NC1iaXQgdmFsdWVzCiAgKi8KLSNkZWZpbmUJWEZTX01BU0szMkhJKG4pCQl4ZnNfbWFzazMyaGkobikKLXN0YXRpYyBpbmxpbmUgX191aW50MzJfdCB4ZnNfbWFzazMyaGkoaW50IG4pCi17Ci0JcmV0dXJuIChfX3VpbnQzMl90KS0xIDw8ICgzMiAtIChuKSk7Ci19Ci0jZGVmaW5lCVhGU19NQVNLNjRISShuKQkJeGZzX21hc2s2NGhpKG4pCiBzdGF0aWMgaW5saW5lIF9fdWludDY0X3QgeGZzX21hc2s2NGhpKGludCBuKQogewogCXJldHVybiAoX191aW50NjRfdCktMSA8PCAoNjQgLSAobikpOwogfQotI2RlZmluZQlYRlNfTUFTSzMyTE8obikJCXhmc19tYXNrMzJsbyhuKQogc3RhdGljIGlubGluZSBfX3VpbnQzMl90IHhmc19tYXNrMzJsbyhpbnQgbikKIHsKIAlyZXR1cm4gKChfX3VpbnQzMl90KTEgPDwgKG4pKSAtIDE7CiB9Ci0jZGVmaW5lCVhGU19NQVNLNjRMTyhuKQkJeGZzX21hc2s2NGxvKG4pCiBzdGF0aWMgaW5saW5lIF9fdWludDY0X3QgeGZzX21hc2s2NGxvKGludCBuKQogewogCXJldHVybiAoKF9fdWludDY0X3QpMSA8PCAobikpIC0gMTsKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfYm1hcF9idHJlZS5jIGIvZnMveGZzL3hmc19ibWFwX2J0cmVlLmMKaW5kZXggOGYxZWM3My4uYmE2YjA4YyAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19ibWFwX2J0cmVlLmMKKysrIGIvZnMveGZzL3hmc19ibWFwX2J0cmVlLmMKQEAgLTExMCwxNiArMTEwLDE2IEBACiAKIAlleHRfZmxhZyA9IChpbnQpKGwwID4+ICg2NCAtIEJNQlRfRVhOVEZMQUdfQklUTEVOKSk7CiAJcy0+YnJfc3RhcnRvZmYgPSAoKHhmc19maWxlb2ZmX3QpbDAgJgotCQkJICAgWEZTX01BU0s2NExPKDY0IC0gQk1CVF9FWE5URkxBR19CSVRMRU4pKSA+PiA5OworCQkJICAgeGZzX21hc2s2NGxvKDY0IC0gQk1CVF9FWE5URkxBR19CSVRMRU4pKSA+PiA5OwogI2lmIFhGU19CSUdfQkxLTk9TCi0Jcy0+YnJfc3RhcnRibG9jayA9ICgoKHhmc19mc2Jsb2NrX3QpbDAgJiBYRlNfTUFTSzY0TE8oOSkpIDw8IDQzKSB8CisJcy0+YnJfc3RhcnRibG9jayA9ICgoKHhmc19mc2Jsb2NrX3QpbDAgJiB4ZnNfbWFzazY0bG8oOSkpIDw8IDQzKSB8CiAJCQkgICAoKCh4ZnNfZnNibG9ja190KWwxKSA+PiAyMSk7CiAjZWxzZQogI2lmZGVmIERFQlVHCiAJewogCQl4ZnNfZGZzYm5vX3QJYjsKIAotCQliID0gKCgoeGZzX2Rmc2Jub190KWwwICYgWEZTX01BU0s2NExPKDkpKSA8PCA0MykgfAorCQliID0gKCgoeGZzX2Rmc2Jub190KWwwICYgeGZzX21hc2s2NGxvKDkpKSA8PCA0MykgfAogCQkgICAgKCgoeGZzX2Rmc2Jub190KWwxKSA+PiAyMSk7CiAJCUFTU0VSVCgoYiA+PiAzMikgPT0gMCB8fCBJU05VTExEU1RBUlRCTE9DSyhiKSk7CiAJCXMtPmJyX3N0YXJ0YmxvY2sgPSAoeGZzX2ZzYmxvY2tfdCliOwpAQCAtMTI4LDcgKzEyOCw3IEBACiAJcy0+YnJfc3RhcnRibG9jayA9ICh4ZnNfZnNibG9ja190KSgoKHhmc19kZnNibm9fdClsMSkgPj4gMjEpOwogI2VuZGlmCS8qIERFQlVHICovCiAjZW5kaWYJLyogWEZTX0JJR19CTEtOT1MgKi8KLQlzLT5icl9ibG9ja2NvdW50ID0gKHhmc19maWxibGtzX3QpKGwxICYgWEZTX01BU0s2NExPKDIxKSk7CisJcy0+YnJfYmxvY2tjb3VudCA9ICh4ZnNfZmlsYmxrc190KShsMSAmIHhmc19tYXNrNjRsbygyMSkpOwogCS8qIFRoaXMgaXMgeGZzX2V4dGVudF9zdGF0ZSgpIGluLWxpbmUgKi8KIAlpZiAoZXh0X2ZsYWcpIHsKIAkJQVNTRVJUKHMtPmJyX2Jsb2NrY291bnQgIT0gMCk7CS8qIHNhdmVkIGZvciBETUlHICovCkBAIC0xNTMsNyArMTUzLDcgQEAKIHhmc19ibWJ0X2dldF9ibG9ja2NvdW50KAogCXhmc19ibWJ0X3JlY19ob3N0X3QJKnIpCiB7Ci0JcmV0dXJuICh4ZnNfZmlsYmxrc190KShyLT5sMSAmIFhGU19NQVNLNjRMTygyMSkpOworCXJldHVybiAoeGZzX2ZpbGJsa3NfdCkoci0+bDEgJiB4ZnNfbWFzazY0bG8oMjEpKTsKIH0KIAogLyoKQEAgLTE2NCwxMyArMTY0LDEzIEBACiAJeGZzX2JtYnRfcmVjX2hvc3RfdAkqcikKIHsKICNpZiBYRlNfQklHX0JMS05PUwotCXJldHVybiAoKCh4ZnNfZnNibG9ja190KXItPmwwICYgWEZTX01BU0s2NExPKDkpKSA8PCA0MykgfAorCXJldHVybiAoKCh4ZnNfZnNibG9ja190KXItPmwwICYgeGZzX21hc2s2NGxvKDkpKSA8PCA0MykgfAogCSAgICAgICAoKCh4ZnNfZnNibG9ja190KXItPmwxKSA+PiAyMSk7CiAjZWxzZQogI2lmZGVmIERFQlVHCiAJeGZzX2Rmc2Jub190CWI7CiAKLQliID0gKCgoeGZzX2Rmc2Jub190KXItPmwwICYgWEZTX01BU0s2NExPKDkpKSA8PCA0MykgfAorCWIgPSAoKCh4ZnNfZGZzYm5vX3Qpci0+bDAgJiB4ZnNfbWFzazY0bG8oOSkpIDw8IDQzKSB8CiAJICAgICgoKHhmc19kZnNibm9fdClyLT5sMSkgPj4gMjEpOwogCUFTU0VSVCgoYiA+PiAzMikgPT0gMCB8fCBJU05VTExEU1RBUlRCTE9DSyhiKSk7CiAJcmV0dXJuICh4ZnNfZnNibG9ja190KWI7CkBAIC0xODgsNyArMTg4LDcgQEAKIAl4ZnNfYm1idF9yZWNfaG9zdF90CSpyKQogewogCXJldHVybiAoKHhmc19maWxlb2ZmX3Qpci0+bDAgJgotCQkgWEZTX01BU0s2NExPKDY0IC0gQk1CVF9FWE5URkxBR19CSVRMRU4pKSA+PiA5OworCQkgeGZzX21hc2s2NGxvKDY0IC0gQk1CVF9FWE5URkxBR19CSVRMRU4pKSA+PiA5OwogfQogCiB4ZnNfZXhudHN0X3QKQEAgLTIxOSw3ICsyMTksNyBAQAogeGZzX2JtYnRfZGlza19nZXRfYmxvY2tjb3VudCgKIAl4ZnNfYm1idF9yZWNfdAkqcikKIHsKLQlyZXR1cm4gKHhmc19maWxibGtzX3QpKGJlNjRfdG9fY3B1KHItPmwxKSAmIFhGU19NQVNLNjRMTygyMSkpOworCXJldHVybiAoeGZzX2ZpbGJsa3NfdCkoYmU2NF90b19jcHUoci0+bDEpICYgeGZzX21hc2s2NGxvKDIxKSk7CiB9CiAKIC8qCkBAIC0yMzAsNyArMjMwLDcgQEAKIAl4ZnNfYm1idF9yZWNfdAkqcikKIHsKIAlyZXR1cm4gKCh4ZnNfZmlsZW9mZl90KWJlNjRfdG9fY3B1KHItPmwwKSAmCi0JCSBYRlNfTUFTSzY0TE8oNjQgLSBCTUJUX0VYTlRGTEFHX0JJVExFTikpID4+IDk7CisJCSB4ZnNfbWFzazY0bG8oNjQgLSBCTUJUX0VYTlRGTEFHX0JJVExFTikpID4+IDk7CiB9CiAKIApAQCAtMjQ4LDMzICsyNDgsMzMgQEAKIAlpbnQJCWV4dGVudF9mbGFnID0gKHN0YXRlID09IFhGU19FWFRfTk9STSkgPyAwIDogMTsKIAogCUFTU0VSVChzdGF0ZSA9PSBYRlNfRVhUX05PUk0gfHwgc3RhdGUgPT0gWEZTX0VYVF9VTldSSVRURU4pOwotCUFTU0VSVCgoc3RhcnRvZmYgJiBYRlNfTUFTSzY0SEkoNjQtQk1CVF9TVEFSVE9GRl9CSVRMRU4pKSA9PSAwKTsKLQlBU1NFUlQoKGJsb2NrY291bnQgJiBYRlNfTUFTSzY0SEkoNjQtQk1CVF9CTE9DS0NPVU5UX0JJVExFTikpID09IDApOworCUFTU0VSVCgoc3RhcnRvZmYgJiB4ZnNfbWFzazY0aGkoNjQtQk1CVF9TVEFSVE9GRl9CSVRMRU4pKSA9PSAwKTsKKwlBU1NFUlQoKGJsb2NrY291bnQgJiB4ZnNfbWFzazY0aGkoNjQtQk1CVF9CTE9DS0NPVU5UX0JJVExFTikpID09IDApOwogCiAjaWYgWEZTX0JJR19CTEtOT1MKLQlBU1NFUlQoKHN0YXJ0YmxvY2sgJiBYRlNfTUFTSzY0SEkoNjQtQk1CVF9TVEFSVEJMT0NLX0JJVExFTikpID09IDApOworCUFTU0VSVCgoc3RhcnRibG9jayAmIHhmc19tYXNrNjRoaSg2NC1CTUJUX1NUQVJUQkxPQ0tfQklUTEVOKSkgPT0gMCk7CiAKIAlyLT5sMCA9ICgoeGZzX2JtYnRfcmVjX2Jhc2VfdClleHRlbnRfZmxhZyA8PCA2MykgfAogCQkoKHhmc19ibWJ0X3JlY19iYXNlX3Qpc3RhcnRvZmYgPDwgOSkgfAogCQkoKHhmc19ibWJ0X3JlY19iYXNlX3Qpc3RhcnRibG9jayA+PiA0Myk7CiAJci0+bDEgPSAoKHhmc19ibWJ0X3JlY19iYXNlX3Qpc3RhcnRibG9jayA8PCAyMSkgfAogCQkoKHhmc19ibWJ0X3JlY19iYXNlX3QpYmxvY2tjb3VudCAmCi0JCSh4ZnNfYm1idF9yZWNfYmFzZV90KVhGU19NQVNLNjRMTygyMSkpOworCQkoeGZzX2JtYnRfcmVjX2Jhc2VfdCl4ZnNfbWFzazY0bG8oMjEpKTsKICNlbHNlCS8qICFYRlNfQklHX0JMS05PUyAqLwogCWlmIChJU05VTExTVEFSVEJMT0NLKHN0YXJ0YmxvY2spKSB7CiAJCXItPmwwID0gKCh4ZnNfYm1idF9yZWNfYmFzZV90KWV4dGVudF9mbGFnIDw8IDYzKSB8CiAJCQkoKHhmc19ibWJ0X3JlY19iYXNlX3Qpc3RhcnRvZmYgPDwgOSkgfAotCQkJICh4ZnNfYm1idF9yZWNfYmFzZV90KVhGU19NQVNLNjRMTyg5KTsKLQkJci0+bDEgPSBYRlNfTUFTSzY0SEkoMTEpIHwKKwkJCSAoeGZzX2JtYnRfcmVjX2Jhc2VfdCl4ZnNfbWFzazY0bG8oOSk7CisJCXItPmwxID0geGZzX21hc2s2NGhpKDExKSB8CiAJCQkgICgoeGZzX2JtYnRfcmVjX2Jhc2VfdClzdGFydGJsb2NrIDw8IDIxKSB8CiAJCQkgICgoeGZzX2JtYnRfcmVjX2Jhc2VfdClibG9ja2NvdW50ICYKLQkJCSAgICh4ZnNfYm1idF9yZWNfYmFzZV90KVhGU19NQVNLNjRMTygyMSkpOworCQkJICAgKHhmc19ibWJ0X3JlY19iYXNlX3QpeGZzX21hc2s2NGxvKDIxKSk7CiAJfSBlbHNlIHsKIAkJci0+bDAgPSAoKHhmc19ibWJ0X3JlY19iYXNlX3QpZXh0ZW50X2ZsYWcgPDwgNjMpIHwKIAkJCSgoeGZzX2JtYnRfcmVjX2Jhc2VfdClzdGFydG9mZiA8PCA5KTsKIAkJci0+bDEgPSAoKHhmc19ibWJ0X3JlY19iYXNlX3Qpc3RhcnRibG9jayA8PCAyMSkgfAogCQkJICgoeGZzX2JtYnRfcmVjX2Jhc2VfdClibG9ja2NvdW50ICYKLQkJCSAoeGZzX2JtYnRfcmVjX2Jhc2VfdClYRlNfTUFTSzY0TE8oMjEpKTsKKwkJCSAoeGZzX2JtYnRfcmVjX2Jhc2VfdCl4ZnNfbWFzazY0bG8oMjEpKTsKIAl9CiAjZW5kaWYJLyogWEZTX0JJR19CTEtOT1MgKi8KIH0KQEAgLTMwNiwxMSArMzA2LDExIEBACiAJaW50CQkJZXh0ZW50X2ZsYWcgPSAoc3RhdGUgPT0gWEZTX0VYVF9OT1JNKSA/IDAgOiAxOwogCiAJQVNTRVJUKHN0YXRlID09IFhGU19FWFRfTk9STSB8fCBzdGF0ZSA9PSBYRlNfRVhUX1VOV1JJVFRFTik7Ci0JQVNTRVJUKChzdGFydG9mZiAmIFhGU19NQVNLNjRISSg2NC1CTUJUX1NUQVJUT0ZGX0JJVExFTikpID09IDApOwotCUFTU0VSVCgoYmxvY2tjb3VudCAmIFhGU19NQVNLNjRISSg2NC1CTUJUX0JMT0NLQ09VTlRfQklUTEVOKSkgPT0gMCk7CisJQVNTRVJUKChzdGFydG9mZiAmIHhmc19tYXNrNjRoaSg2NC1CTUJUX1NUQVJUT0ZGX0JJVExFTikpID09IDApOworCUFTU0VSVCgoYmxvY2tjb3VudCAmIHhmc19tYXNrNjRoaSg2NC1CTUJUX0JMT0NLQ09VTlRfQklUTEVOKSkgPT0gMCk7CiAKICNpZiBYRlNfQklHX0JMS05PUwotCUFTU0VSVCgoc3RhcnRibG9jayAmIFhGU19NQVNLNjRISSg2NC1CTUJUX1NUQVJUQkxPQ0tfQklUTEVOKSkgPT0gMCk7CisJQVNTRVJUKChzdGFydGJsb2NrICYgeGZzX21hc2s2NGhpKDY0LUJNQlRfU1RBUlRCTE9DS19CSVRMRU4pKSA9PSAwKTsKIAogCXItPmwwID0gY3B1X3RvX2JlNjQoCiAJCSgoeGZzX2JtYnRfcmVjX2Jhc2VfdClleHRlbnRfZmxhZyA8PCA2MykgfApAQCAtMzE5LDE3ICszMTksMTcgQEAKIAlyLT5sMSA9IGNwdV90b19iZTY0KAogCQkoKHhmc19ibWJ0X3JlY19iYXNlX3Qpc3RhcnRibG9jayA8PCAyMSkgfAogCQkgKCh4ZnNfYm1idF9yZWNfYmFzZV90KWJsb2NrY291bnQgJgotCQkgICh4ZnNfYm1idF9yZWNfYmFzZV90KVhGU19NQVNLNjRMTygyMSkpKTsKKwkJICAoeGZzX2JtYnRfcmVjX2Jhc2VfdCl4ZnNfbWFzazY0bG8oMjEpKSk7CiAjZWxzZQkvKiAhWEZTX0JJR19CTEtOT1MgKi8KIAlpZiAoSVNOVUxMU1RBUlRCTE9DSyhzdGFydGJsb2NrKSkgewogCQlyLT5sMCA9IGNwdV90b19iZTY0KAogCQkJKCh4ZnNfYm1idF9yZWNfYmFzZV90KWV4dGVudF9mbGFnIDw8IDYzKSB8CiAJCQkgKCh4ZnNfYm1idF9yZWNfYmFzZV90KXN0YXJ0b2ZmIDw8IDkpIHwKLQkJCSAgKHhmc19ibWJ0X3JlY19iYXNlX3QpWEZTX01BU0s2NExPKDkpKTsKLQkJci0+bDEgPSBjcHVfdG9fYmU2NChYRlNfTUFTSzY0SEkoMTEpIHwKKwkJCSAgKHhmc19ibWJ0X3JlY19iYXNlX3QpeGZzX21hc2s2NGxvKDkpKTsKKwkJci0+bDEgPSBjcHVfdG9fYmU2NCh4ZnNfbWFzazY0aGkoMTEpIHwKIAkJCSAgKCh4ZnNfYm1idF9yZWNfYmFzZV90KXN0YXJ0YmxvY2sgPDwgMjEpIHwKIAkJCSAgKCh4ZnNfYm1idF9yZWNfYmFzZV90KWJsb2NrY291bnQgJgotCQkJICAgKHhmc19ibWJ0X3JlY19iYXNlX3QpWEZTX01BU0s2NExPKDIxKSkpOworCQkJICAgKHhmc19ibWJ0X3JlY19iYXNlX3QpeGZzX21hc2s2NGxvKDIxKSkpOwogCX0gZWxzZSB7CiAJCXItPmwwID0gY3B1X3RvX2JlNjQoCiAJCQkoKHhmc19ibWJ0X3JlY19iYXNlX3QpZXh0ZW50X2ZsYWcgPDwgNjMpIHwKQEAgLTMzNyw3ICszMzcsNyBAQAogCQlyLT5sMSA9IGNwdV90b19iZTY0KAogCQkJKCh4ZnNfYm1idF9yZWNfYmFzZV90KXN0YXJ0YmxvY2sgPDwgMjEpIHwKIAkJCSAoKHhmc19ibWJ0X3JlY19iYXNlX3QpYmxvY2tjb3VudCAmCi0JCQkgICh4ZnNfYm1idF9yZWNfYmFzZV90KVhGU19NQVNLNjRMTygyMSkpKTsKKwkJCSAgKHhmc19ibWJ0X3JlY19iYXNlX3QpeGZzX21hc2s2NGxvKDIxKSkpOwogCX0KICNlbmRpZgkvKiBYRlNfQklHX0JMS05PUyAqLwogfQpAQCAtMzYyLDkgKzM2Miw5IEBACiAJeGZzX2JtYnRfcmVjX2hvc3RfdCAqciwKIAl4ZnNfZmlsYmxrc190CXYpCiB7Ci0JQVNTRVJUKCh2ICYgWEZTX01BU0s2NEhJKDQzKSkgPT0gMCk7Ci0Jci0+bDEgPSAoci0+bDEgJiAoeGZzX2JtYnRfcmVjX2Jhc2VfdClYRlNfTUFTSzY0SEkoNDMpKSB8Ci0JCSAgKHhmc19ibWJ0X3JlY19iYXNlX3QpKHYgJiBYRlNfTUFTSzY0TE8oMjEpKTsKKwlBU1NFUlQoKHYgJiB4ZnNfbWFzazY0aGkoNDMpKSA9PSAwKTsKKwlyLT5sMSA9IChyLT5sMSAmICh4ZnNfYm1idF9yZWNfYmFzZV90KXhmc19tYXNrNjRoaSg0MykpIHwKKwkJICAoeGZzX2JtYnRfcmVjX2Jhc2VfdCkodiAmIHhmc19tYXNrNjRsbygyMSkpOwogfQogCiAvKgpAQCAtMzc2LDIxICszNzYsMjEgQEAKIAl4ZnNfZnNibG9ja190CXYpCiB7CiAjaWYgWEZTX0JJR19CTEtOT1MKLQlBU1NFUlQoKHYgJiBYRlNfTUFTSzY0SEkoMTIpKSA9PSAwKTsKLQlyLT5sMCA9IChyLT5sMCAmICh4ZnNfYm1idF9yZWNfYmFzZV90KVhGU19NQVNLNjRISSg1NSkpIHwKKwlBU1NFUlQoKHYgJiB4ZnNfbWFzazY0aGkoMTIpKSA9PSAwKTsKKwlyLT5sMCA9IChyLT5sMCAmICh4ZnNfYm1idF9yZWNfYmFzZV90KXhmc19tYXNrNjRoaSg1NSkpIHwKIAkJICAoeGZzX2JtYnRfcmVjX2Jhc2VfdCkodiA+PiA0Myk7Ci0Jci0+bDEgPSAoci0+bDEgJiAoeGZzX2JtYnRfcmVjX2Jhc2VfdClYRlNfTUFTSzY0TE8oMjEpKSB8CisJci0+bDEgPSAoci0+bDEgJiAoeGZzX2JtYnRfcmVjX2Jhc2VfdCl4ZnNfbWFzazY0bG8oMjEpKSB8CiAJCSAgKHhmc19ibWJ0X3JlY19iYXNlX3QpKHYgPDwgMjEpOwogI2Vsc2UJLyogIVhGU19CSUdfQkxLTk9TICovCiAJaWYgKElTTlVMTFNUQVJUQkxPQ0sodikpIHsKLQkJci0+bDAgfD0gKHhmc19ibWJ0X3JlY19iYXNlX3QpWEZTX01BU0s2NExPKDkpOwotCQlyLT5sMSA9ICh4ZnNfYm1idF9yZWNfYmFzZV90KVhGU19NQVNLNjRISSgxMSkgfAorCQlyLT5sMCB8PSAoeGZzX2JtYnRfcmVjX2Jhc2VfdCl4ZnNfbWFzazY0bG8oOSk7CisJCXItPmwxID0gKHhmc19ibWJ0X3JlY19iYXNlX3QpeGZzX21hc2s2NGhpKDExKSB8CiAJCQkgICgoeGZzX2JtYnRfcmVjX2Jhc2VfdCl2IDw8IDIxKSB8Ci0JCQkgIChyLT5sMSAmICh4ZnNfYm1idF9yZWNfYmFzZV90KVhGU19NQVNLNjRMTygyMSkpOworCQkJICAoci0+bDEgJiAoeGZzX2JtYnRfcmVjX2Jhc2VfdCl4ZnNfbWFzazY0bG8oMjEpKTsKIAl9IGVsc2UgewotCQlyLT5sMCAmPSB+KHhmc19ibWJ0X3JlY19iYXNlX3QpWEZTX01BU0s2NExPKDkpOworCQlyLT5sMCAmPSB+KHhmc19ibWJ0X3JlY19iYXNlX3QpeGZzX21hc2s2NGxvKDkpOwogCQlyLT5sMSA9ICgoeGZzX2JtYnRfcmVjX2Jhc2VfdCl2IDw8IDIxKSB8Ci0JCQkgIChyLT5sMSAmICh4ZnNfYm1idF9yZWNfYmFzZV90KVhGU19NQVNLNjRMTygyMSkpOworCQkJICAoci0+bDEgJiAoeGZzX2JtYnRfcmVjX2Jhc2VfdCl4ZnNfbWFzazY0bG8oMjEpKTsKIAl9CiAjZW5kaWYJLyogWEZTX0JJR19CTEtOT1MgKi8KIH0KQEAgLTQwMywxMCArNDAzLDEwIEBACiAJeGZzX2JtYnRfcmVjX2hvc3RfdCAqciwKIAl4ZnNfZmlsZW9mZl90CXYpCiB7Ci0JQVNTRVJUKCh2ICYgWEZTX01BU0s2NEhJKDkpKSA9PSAwKTsKLQlyLT5sMCA9IChyLT5sMCAmICh4ZnNfYm1idF9yZWNfYmFzZV90KSBYRlNfTUFTSzY0SEkoMSkpIHwKKwlBU1NFUlQoKHYgJiB4ZnNfbWFzazY0aGkoOSkpID09IDApOworCXItPmwwID0gKHItPmwwICYgKHhmc19ibWJ0X3JlY19iYXNlX3QpIHhmc19tYXNrNjRoaSgxKSkgfAogCQkoKHhmc19ibWJ0X3JlY19iYXNlX3QpdiA8PCA5KSB8Ci0JCSAgKHItPmwwICYgKHhmc19ibWJ0X3JlY19iYXNlX3QpWEZTX01BU0s2NExPKDkpKTsKKwkJICAoci0+bDAgJiAoeGZzX2JtYnRfcmVjX2Jhc2VfdCl4ZnNfbWFzazY0bG8oOSkpOwogfQogCiAvKgpAQCAtNDE5LDkgKzQxOSw5IEBACiB7CiAJQVNTRVJUKHYgPT0gWEZTX0VYVF9OT1JNIHx8IHYgPT0gWEZTX0VYVF9VTldSSVRURU4pOwogCWlmICh2ID09IFhGU19FWFRfTk9STSkKLQkJci0+bDAgJj0gWEZTX01BU0s2NExPKDY0IC0gQk1CVF9FWE5URkxBR19CSVRMRU4pOworCQlyLT5sMCAmPSB4ZnNfbWFzazY0bG8oNjQgLSBCTUJUX0VYTlRGTEFHX0JJVExFTik7CiAJZWxzZQotCQlyLT5sMCB8PSBYRlNfTUFTSzY0SEkoQk1CVF9FWE5URkxBR19CSVRMRU4pOworCQlyLT5sMCB8PSB4ZnNfbWFzazY0aGkoQk1CVF9FWE5URkxBR19CSVRMRU4pOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19idHJlZS5jIGIvZnMveGZzL3hmc19idHJlZS5jCmluZGV4IDdlZDU5MjYuLjJjM2VmMjAgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfYnRyZWUuYworKysgYi9mcy94ZnMveGZzX2J0cmVlLmMKQEAgLTczMCw4ICs3MzAsOCBAQAogCXN0cnVjdCB4ZnNfYnRyZWVfYmxvY2sJKmJsb2NrKQogewogCWludAkJCXJ2YWwgPSAwOwotCXhmc19mc2Jsb2NrX3QJCWxlZnQgPSBiZTY0X3RvX2NwdShibG9jay0+YmJfdS5sLmJiX2xlZnRzaWIpOwotCXhmc19mc2Jsb2NrX3QJCXJpZ2h0ID0gYmU2NF90b19jcHUoYmxvY2stPmJiX3UubC5iYl9yaWdodHNpYik7CisJeGZzX2Rmc2Jub190CQlsZWZ0ID0gYmU2NF90b19jcHUoYmxvY2stPmJiX3UubC5iYl9sZWZ0c2liKTsKKwl4ZnNfZGZzYm5vX3QJCXJpZ2h0ID0gYmU2NF90b19jcHUoYmxvY2stPmJiX3UubC5iYl9yaWdodHNpYik7CiAKIAlpZiAoKGxyICYgWEZTX0JUQ1VSX0xFRlRSQSkgJiYgbGVmdCAhPSBOVUxMREZTQk5PKSB7CiAJCXhmc19idHJlZV9yZWFkYV9idWZsKGN1ci0+YmNfbXAsIGxlZnQsIDEpOwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19kaXIyX2Jsb2NrLmMgYi9mcy94ZnMveGZzX2RpcjJfYmxvY2suYwppbmRleCBlMmZhMGExLi5lMWYwYTA2IDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2RpcjJfYmxvY2suYworKysgYi9mcy94ZnMveGZzX2RpcjJfYmxvY2suYwpAQCAtNTE3LDkgKzUxNyw5IEBACiAJCS8qCiAJCSAqIElmIGl0IGRpZG4ndCBmaXQsIHNldCB0aGUgZmluYWwgb2Zmc2V0IHRvIGhlcmUgJiByZXR1cm4uCiAJCSAqLwotCQlpZiAoZmlsbGRpcihkaXJlbnQsIGRlcC0+bmFtZSwgZGVwLT5uYW1lbGVuLCBjb29rLAorCQlpZiAoZmlsbGRpcihkaXJlbnQsIGRlcC0+bmFtZSwgZGVwLT5uYW1lbGVuLCBjb29rICYgMHg3ZmZmZmZmZiwKIAkJCSAgICBpbm8sIERUX1VOS05PV04pKSB7Ci0JCQkqb2Zmc2V0ID0gY29vazsKKwkJCSpvZmZzZXQgPSBjb29rICYgMHg3ZmZmZmZmZjsKIAkJCXhmc19kYV9icmVsc2UoTlVMTCwgYnApOwogCQkJcmV0dXJuIDA7CiAJCX0KQEAgLTUyOSw3ICs1MjksOCBAQAogCSAqIFJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgYmxvY2suCiAJICogU2V0IHRoZSBvZmZzZXQgdG8gYSBub24tZXhpc3RlbnQgYmxvY2sgMSBhbmQgcmV0dXJuLgogCSAqLwotCSpvZmZzZXQgPSB4ZnNfZGlyMl9kYl9vZmZfdG9fZGF0YXB0cihtcCwgbXAtPm1fZGlyZGF0YWJsayArIDEsIDApOworCSpvZmZzZXQgPSB4ZnNfZGlyMl9kYl9vZmZfdG9fZGF0YXB0cihtcCwgbXAtPm1fZGlyZGF0YWJsayArIDEsIDApICYKKwkJCTB4N2ZmZmZmZmY7CiAJeGZzX2RhX2JyZWxzZShOVUxMLCBicCk7CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2RpcjJfbGVhZi5jIGIvZnMveGZzL3hmc19kaXIyX2xlYWYuYwppbmRleCA5MzUzNTk5Li5lZjgwNWEzIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2RpcjJfbGVhZi5jCisrKyBiL2ZzL3hmcy94ZnNfZGlyMl9sZWFmLmMKQEAgLTEwOTIsNyArMTA5Miw3IEBACiAJCSAqIFdvbid0IGZpdC4gIFJldHVybiB0byBjYWxsZXIuCiAJCSAqLwogCQlpZiAoZmlsbGRpcihkaXJlbnQsIGRlcC0+bmFtZSwgZGVwLT5uYW1lbGVuLAotCQkJICAgIHhmc19kaXIyX2J5dGVfdG9fZGF0YXB0cihtcCwgY3Vyb2ZmKSwKKwkJCSAgICB4ZnNfZGlyMl9ieXRlX3RvX2RhdGFwdHIobXAsIGN1cm9mZikgJiAweDdmZmZmZmZmLAogCQkJICAgIGlubywgRFRfVU5LTk9XTikpCiAJCQlicmVhazsKIApAQCAtMTEwOCw5ICsxMTA4LDkgQEAKIAkgKiBBbGwgZG9uZS4gIFNldCBvdXRwdXQgb2Zmc2V0IHZhbHVlIHRvIGN1cnJlbnQgb2Zmc2V0LgogCSAqLwogCWlmIChjdXJvZmYgPiB4ZnNfZGlyMl9kYXRhcHRyX3RvX2J5dGUobXAsIFhGU19ESVIyX01BWF9EQVRBUFRSKSkKLQkJKm9mZnNldCA9IFhGU19ESVIyX01BWF9EQVRBUFRSOworCQkqb2Zmc2V0ID0gWEZTX0RJUjJfTUFYX0RBVEFQVFIgJiAweDdmZmZmZmZmOwogCWVsc2UKLQkJKm9mZnNldCA9IHhmc19kaXIyX2J5dGVfdG9fZGF0YXB0cihtcCwgY3Vyb2ZmKTsKKwkJKm9mZnNldCA9IHhmc19kaXIyX2J5dGVfdG9fZGF0YXB0cihtcCwgY3Vyb2ZmKSAmIDB4N2ZmZmZmZmY7CiAJa21lbV9mcmVlKG1hcCk7CiAJaWYgKGJwKQogCQl4ZnNfZGFfYnJlbHNlKE5VTEwsIGJwKTsKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfZGlyMl9zZi5jIGIvZnMveGZzL3hmc19kaXIyX3NmLmMKaW5kZXggYjQ2YWYwMC4uYThhOGE2ZSAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19kaXIyX3NmLmMKKysrIGIvZnMveGZzL3hmc19kaXIyX3NmLmMKQEAgLTc1Miw4ICs3NTIsOCBAQAogI2lmIFhGU19CSUdfSU5VTVMKIAkJaW5vICs9IG1wLT5tX2lub2FkZDsKICNlbmRpZgotCQlpZiAoZmlsbGRpcihkaXJlbnQsICIuIiwgMSwgZG90X29mZnNldCwgaW5vLCBEVF9ESVIpKSB7Ci0JCQkqb2Zmc2V0ID0gZG90X29mZnNldDsKKwkJaWYgKGZpbGxkaXIoZGlyZW50LCAiLiIsIDEsIGRvdF9vZmZzZXQgJiAweDdmZmZmZmZmLCBpbm8sIERUX0RJUikpIHsKKwkJCSpvZmZzZXQgPSBkb3Rfb2Zmc2V0ICYgMHg3ZmZmZmZmZjsKIAkJCXJldHVybiAwOwogCQl9CiAJfQpAQCAtNzY2LDggKzc2Niw4IEBACiAjaWYgWEZTX0JJR19JTlVNUwogCQlpbm8gKz0gbXAtPm1faW5vYWRkOwogI2VuZGlmCi0JCWlmIChmaWxsZGlyKGRpcmVudCwgIi4uIiwgMiwgZG90ZG90X29mZnNldCwgaW5vLCBEVF9ESVIpKSB7Ci0JCQkqb2Zmc2V0ID0gZG90ZG90X29mZnNldDsKKwkJaWYgKGZpbGxkaXIoZGlyZW50LCAiLi4iLCAyLCBkb3Rkb3Rfb2Zmc2V0ICYgMHg3ZmZmZmZmZiwgaW5vLCBEVF9ESVIpKSB7CisJCQkqb2Zmc2V0ID0gZG90ZG90X29mZnNldCAmIDB4N2ZmZmZmZmY7CiAJCQlyZXR1cm4gMDsKIAkJfQogCX0KQEAgLTc5MSwxNCArNzkxLDE1IEBACiAjZW5kaWYKIAogCQlpZiAoZmlsbGRpcihkaXJlbnQsIHNmZXAtPm5hbWUsIHNmZXAtPm5hbWVsZW4sCi0JCQkJCSAgICBvZmYsIGlubywgRFRfVU5LTk9XTikpIHsKLQkJCSpvZmZzZXQgPSBvZmY7CisJCQkgICAgb2ZmICYgMHg3ZmZmZmZmZiwgaW5vLCBEVF9VTktOT1dOKSkgeworCQkJKm9mZnNldCA9IG9mZiAmIDB4N2ZmZmZmZmY7CiAJCQlyZXR1cm4gMDsKIAkJfQogCQlzZmVwID0geGZzX2RpcjJfc2ZfbmV4dGVudHJ5KHNmcCwgc2ZlcCk7CiAJfQogCi0JKm9mZnNldCA9IHhmc19kaXIyX2RiX29mZl90b19kYXRhcHRyKG1wLCBtcC0+bV9kaXJkYXRhYmxrICsgMSwgMCk7CisJKm9mZnNldCA9IHhmc19kaXIyX2RiX29mZl90b19kYXRhcHRyKG1wLCBtcC0+bV9kaXJkYXRhYmxrICsgMSwgMCkgJgorCQkJMHg3ZmZmZmZmZjsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19mcy5oIGIvZnMveGZzL3hmc19mcy5oCmluZGV4IDU4OWM0MWMuLmY3YzA2ZmEgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfZnMuaAorKysgYi9mcy94ZnMveGZzX2ZzLmgKQEAgLTQ2NSw4ICs0NjUsOCBAQAogI2RlZmluZSBYRlNfSU9DX0VSUk9SX0lOSkVDVElPTgkgICAgIF9JT1cgKCdYJywgMTE2LCBzdHJ1Y3QgeGZzX2Vycm9yX2luamVjdGlvbikKICNkZWZpbmUgWEZTX0lPQ19FUlJPUl9DTEVBUkFMTAkgICAgIF9JT1cgKCdYJywgMTE3LCBzdHJ1Y3QgeGZzX2Vycm9yX2luamVjdGlvbikKIC8qCVhGU19JT0NfQVRUUkNUTF9CWV9IQU5ETEUgLS0gZGVwcmVjYXRlZCAxMTgJICovCi0jZGVmaW5lIFhGU19JT0NfRlJFRVpFCQkgICAgIF9JT1dSKCdYJywgMTE5LCBpbnQpCi0jZGVmaW5lIFhGU19JT0NfVEhBVwkJICAgICBfSU9XUignWCcsIDEyMCwgaW50KQorLyoJWEZTX0lPQ19GUkVFWkUJCSAgLS0gRklGUkVFWkUgICAxMTkJICovCisvKglYRlNfSU9DX1RIQVcJCSAgLS0gRklUSEFXICAgICAxMjAJICovCiAjZGVmaW5lIFhGU19JT0NfRlNTRVRETV9CWV9IQU5ETEUgICAgX0lPVyAoJ1gnLCAxMjEsIHN0cnVjdCB4ZnNfZnNvcF9zZXRkbV9oYW5kbGVyZXEpCiAjZGVmaW5lIFhGU19JT0NfQVRUUkxJU1RfQllfSEFORExFICAgX0lPVyAoJ1gnLCAxMjIsIHN0cnVjdCB4ZnNfZnNvcF9hdHRybGlzdF9oYW5kbGVyZXEpCiAjZGVmaW5lIFhGU19JT0NfQVRUUk1VTFRJX0JZX0hBTkRMRSAgX0lPVyAoJ1gnLCAxMjMsIHN0cnVjdCB4ZnNfZnNvcF9hdHRybXVsdGlfaGFuZGxlcmVxKQpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19mc29wcy5jIGIvZnMveGZzL3hmc19mc29wcy5jCmluZGV4IDg1MmI2ZDMuLjY4MGQwZTAgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfZnNvcHMuYworKysgYi9mcy94ZnMveGZzX2Zzb3BzLmMKQEAgLTU5NSwxNyArNTk1LDE5IEBACiAJcmV0dXJuIDA7CiB9CiAKLXZvaWQKK2ludAogeGZzX2ZzX2xvZ19kdW1teSgKIAl4ZnNfbW91bnRfdAkqbXApCiB7CiAJeGZzX3RyYW5zX3QJKnRwOwogCXhmc19pbm9kZV90CSppcDsKKwlpbnQJCWVycm9yOwogCiAJdHAgPSBfeGZzX3RyYW5zX2FsbG9jKG1wLCBYRlNfVFJBTlNfRFVNTVkxKTsKLQlpZiAoeGZzX3RyYW5zX3Jlc2VydmUodHAsIDAsIFhGU19JQ0hBTkdFX0xPR19SRVMobXApLCAwLCAwLCAwKSkgeworCWVycm9yID0geGZzX3RyYW5zX3Jlc2VydmUodHAsIDAsIFhGU19JQ0hBTkdFX0xPR19SRVMobXApLCAwLCAwLCAwKTsKKwlpZiAoZXJyb3IpIHsKIAkJeGZzX3RyYW5zX2NhbmNlbCh0cCwgMCk7Ci0JCXJldHVybjsKKwkJcmV0dXJuIGVycm9yOwogCX0KIAogCWlwID0gbXAtPm1fcm9vdGlwOwpAQCAtNjE1LDkgKzYxNywxMCBAQAogCXhmc190cmFuc19paG9sZCh0cCwgaXApOwogCXhmc190cmFuc19sb2dfaW5vZGUodHAsIGlwLCBYRlNfSUxPR19DT1JFKTsKIAl4ZnNfdHJhbnNfc2V0X3N5bmModHApOwotCXhmc190cmFuc19jb21taXQodHAsIDApOworCWVycm9yID0geGZzX3RyYW5zX2NvbW1pdCh0cCwgMCk7CiAKIAl4ZnNfaXVubG9jayhpcCwgWEZTX0lMT0NLX0VYQ0wpOworCXJldHVybiBlcnJvcjsKIH0KIAogaW50CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2Zzb3BzLmggYi9mcy94ZnMveGZzX2Zzb3BzLmgKaW5kZXggMzAwZDBjOS4uODg0MzVlMCAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19mc29wcy5oCisrKyBiL2ZzL3hmcy94ZnNfZnNvcHMuaApAQCAtMjUsNiArMjUsNiBAQAogZXh0ZXJuIGludCB4ZnNfcmVzZXJ2ZV9ibG9ja3MoeGZzX21vdW50X3QgKm1wLCBfX3VpbnQ2NF90ICppbnZhbCwKIAkJCQl4ZnNfZnNvcF9yZXNibGtzX3QgKm91dHZhbCk7CiBleHRlcm4gaW50IHhmc19mc19nb2luZ2Rvd24oeGZzX21vdW50X3QgKm1wLCBfX3VpbnQzMl90IGluZmxhZ3MpOwotZXh0ZXJuIHZvaWQgeGZzX2ZzX2xvZ19kdW1teSh4ZnNfbW91bnRfdCAqbXApOworZXh0ZXJuIGludCB4ZnNfZnNfbG9nX2R1bW15KHhmc19tb3VudF90ICptcCk7CiAKICNlbmRpZgkvKiBfX1hGU19GU09QU19IX18gKi8KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfdHlwZXMuaCBiL2ZzL3hmcy94ZnNfdHlwZXMuaAppbmRleCAwZjUxOTE2Li5iMmY3MjQ1IDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX3R5cGVzLmgKKysrIGIvZnMveGZzL3hmc190eXBlcy5oCkBAIC00NSw3ICs0NSw3IEBACiB0eXBlZGVmIF9fdWludDMyX3QJCWluc3RfdDsJCS8qIGFuIGluc3RydWN0aW9uICovCiAKIHR5cGVkZWYgX19zNjQJCQl4ZnNfb2ZmX3Q7CS8qIDxmaWxlIG9mZnNldD4gdHlwZSAqLwotdHlwZWRlZiBfX3U2NAkJCXhmc19pbm9fdDsJLyogPGlub2RlPiB0eXBlICovCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZwl4ZnNfaW5vX3Q7CS8qIDxpbm9kZT4gdHlwZSAqLwogdHlwZWRlZiBfX3M2NAkJCXhmc19kYWRkcl90OwkvKiA8ZGlzayBhZGRyZXNzPiB0eXBlICovCiB0eXBlZGVmIGNoYXIgKgkJCXhmc19jYWRkcl90OwkvKiA8Y29yZSBhZGRyZXNzPiB0eXBlICovCiB0eXBlZGVmIF9fdTMyCQkJeGZzX2Rldl90OwpAQCAtMTExLDggKzExMSw2IEBACiB0eXBlZGVmIF9faW50NjRfdAl4ZnNfc2ZpbG9mZl90OwkvKiBzaWduZWQgYmxvY2sgbnVtYmVyIGluIGEgZmlsZSAqLwogdHlwZWRlZiBfX3VpbnQ2NF90CXhmc19maWxibGtzX3Q7CS8qIG51bWJlciBvZiBibG9ja3MgaW4gYSBmaWxlICovCiAKLXR5cGVkZWYgX191aW50OF90CXhmc19hcmNoX3Q7CS8qIGFyY2hpdGVjdHVyZSBvZiBhbiB4ZnMgZnMgKi8KLQogLyoKICAqIE51bGwgdmFsdWVzIGZvciB0aGUgdHlwZXMuCiAgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYWNwaS9hY2NvbmZpZy5oIGIvaW5jbHVkZS9hY3BpL2FjY29uZmlnLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5ZmVlZTIuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hY3BpL2FjY29uZmlnLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIE5hbWU6IGFjY29uZmlnLmggLSBHbG9iYWwgY29uZmlndXJhdGlvbiBjb25zdGFudHMKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA4LCBJbnRlbCBDb3JwLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAotICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgYXQgbWluaW11bSBhIGRpc2NsYWltZXIKLSAqICAgIHN1YnN0YW50aWFsbHkgc2ltaWxhciB0byB0aGUgIk5PIFdBUlJBTlRZIiBkaXNjbGFpbWVyIGJlbG93Ci0gKiAgICAoIkRpc2NsYWltZXIiKSBhbmQgYW55IHJlZGlzdHJpYnV0aW9uIG11c3QgYmUgY29uZGl0aW9uZWQgdXBvbgotICogICAgaW5jbHVkaW5nIGEgc3Vic3RhbnRpYWxseSBzaW1pbGFyIERpc2NsYWltZXIgcmVxdWlyZW1lbnQgZm9yIGZ1cnRoZXIKLSAqICAgIGJpbmFyeSByZWRpc3RyaWJ1dGlvbi4KLSAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcwotICogICAgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICogU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBOTyBXQVJSQU5UWQotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCi0gKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUwotICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcKLSAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQotICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgotICovCi0KLSNpZm5kZWYgX0FDQ09ORklHX0gKLSNkZWZpbmUgX0FDQ09ORklHX0gKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvbmZpZ3VyYXRpb24gb3B0aW9ucwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoKLSAqIEFDUElfREVCVUdfT1VUUFVUICAgIC0gVGhpcyBzd2l0Y2ggZW5hYmxlcyBhbGwgdGhlIGRlYnVnIGZhY2lsaXRpZXMgb2YgdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIEFDUEkgc3Vic3lzdGVtLiAgVGhpcyBpbmNsdWRlcyB0aGUgREVCVUdfUFJJTlQgb3V0cHV0Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlbWVudHMuICBXaGVuIGRpc2FibGVkLCBhbGwgREVCVUdfUFJJTlQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVtZW50cyBhcmUgY29tcGlsZWQgb3V0LgotICoKLSAqIEFDUElfQVBQTElDQVRJT04gICAgIC0gVXNlIHRoaXMgc3dpdGNoIGlmIHRoZSBzdWJzeXN0ZW0gaXMgZ29pbmcgdG8gYmUgcnVuCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIGF0IHRoZSBhcHBsaWNhdGlvbiBsZXZlbC4KLSAqCi0gKi8KLQotLyogQ3VycmVudCBBQ1BJQ0Egc3Vic3lzdGVtIHZlcnNpb24gaW4gWVlZWU1NREQgZm9ybWF0ICovCi0KLSNkZWZpbmUgQUNQSV9DQV9WRVJTSU9OICAgICAgICAgICAgICAgICAweDIwMDgwOTI2Ci0KLS8qCi0gKiBPUyBuYW1lLCB1c2VkIGZvciB0aGUgX09TIG9iamVjdC4gIFRoZSBfT1Mgb2JqZWN0IGlzIGVzc2VudGlhbGx5IG9ic29sZXRlLAotICogYnV0IHRoZXJlIGlzIGEgbGFyZ2UgYmFzZSBvZiBBU0wvQU1MIGNvZGUgaW4gZXhpc3RpbmcgbWFjaGluZXMgdGhhdCBjaGVjawotICogZm9yIHRoZSBzdHJpbmcgYmVsb3cuICBUaGUgdXNlIG9mIHRoaXMgc3RyaW5nIHVzdWFsbHkgZ3VhcmFudGVlcyB0aGF0Ci0gKiB0aGUgQVNMIHdpbGwgZXhlY3V0ZSBkb3duIHRoZSBtb3N0IHRlc3RlZCBjb2RlIHBhdGguICBBbHNvLCB0aGVyZSBpcyBzb21lCi0gKiBjb2RlIHRoYXQgd2lsbCBub3QgZXhlY3V0ZSB0aGUgX09TSSBtZXRob2QgdW5sZXNzIF9PUyBtYXRjaGVzIHRoZSBzdHJpbmcKLSAqIGJlbG93LiAgVGhlcmVmb3JlLCBjaGFuZ2UgdGhpcyBzdHJpbmcgYXQgeW91ciBvd24gcmlzay4KLSAqLwotI2RlZmluZSBBQ1BJX09TX05BTUUgICAgICAgICAgICAgICAgICAgICJNaWNyb3NvZnQgV2luZG93cyBOVCIKLQotLyogTWF4aW11bSBvYmplY3RzIGluIHRoZSB2YXJpb3VzIG9iamVjdCBjYWNoZXMgKi8KLQotI2RlZmluZSBBQ1BJX01BWF9TVEFURV9DQUNIRV9ERVBUSCAgICAgIDk2CS8qIFN0YXRlIG9iamVjdHMgKi8KLSNkZWZpbmUgQUNQSV9NQVhfUEFSU0VfQ0FDSEVfREVQVEggICAgICA5NgkvKiBQYXJzZSB0cmVlIG9iamVjdHMgKi8KLSNkZWZpbmUgQUNQSV9NQVhfRVhUUEFSU0VfQ0FDSEVfREVQVEggICA5NgkvKiBQYXJzZSB0cmVlIG9iamVjdHMgKi8KLSNkZWZpbmUgQUNQSV9NQVhfT0JKRUNUX0NBQ0hFX0RFUFRIICAgICA5NgkvKiBJbnRlcnByZXRlciBvcGVyYW5kIG9iamVjdHMgKi8KLSNkZWZpbmUgQUNQSV9NQVhfTkFNRVNQQUNFX0NBQ0hFX0RFUFRIICA5NgkvKiBOYW1lc3BhY2Ugb2JqZWN0cyAqLwotCi0vKgotICogU2hvdWxkIHRoZSBzdWJzeXN0ZW0gYWJvcnQgdGhlIGxvYWRpbmcgb2YgYW4gQUNQSSB0YWJsZSBpZiB0aGUKLSAqIHRhYmxlIGNoZWNrc3VtIGlzIGluY29ycmVjdD8KLSAqLwotI2RlZmluZSBBQ1BJX0NIRUNLU1VNX0FCT1JUICAgICAgICAgICAgIEZBTFNFCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBTdWJzeXN0ZW0gQ29uc3RhbnRzCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBWZXJzaW9uIG9mIEFDUEkgc3VwcG9ydGVkICovCi0KLSNkZWZpbmUgQUNQSV9DQV9TVVBQT1JUX0xFVkVMICAgICAgICAgICAzCi0KLS8qIE1heGltdW0gY291bnQgZm9yIGEgc2VtYXBob3JlIG9iamVjdCAqLwotCi0jZGVmaW5lIEFDUElfTUFYX1NFTUFQSE9SRV9DT1VOVCAgICAgICAgMjU2Ci0KLS8qIE1heGltdW0gb2JqZWN0IHJlZmVyZW5jZSBjb3VudCAoZGV0ZWN0cyBvYmplY3QgZGVsZXRpb24gaXNzdWVzKSAqLwotCi0jZGVmaW5lIEFDUElfTUFYX1JFRkVSRU5DRV9DT1VOVCAgICAgICAgMHgxMDAwCi0KLS8qIFNpemUgb2YgY2FjaGVkIG1lbW9yeSBtYXBwaW5nIGZvciBzeXN0ZW0gbWVtb3J5IG9wZXJhdGlvbiByZWdpb24gKi8KLQotI2RlZmluZSBBQ1BJX1NZU01FTV9SRUdJT05fV0lORE9XX1NJWkUgIDQwOTYKLQotLyogb3duZXJfaWQgdHJhY2tpbmcuIDggZW50cmllcyBhbGxvd3MgZm9yIDI1NSBvd25lcl9pZHMgKi8KLQotI2RlZmluZSBBQ1BJX05VTV9PV05FUklEX01BU0tTICAgICAgICAgIDgKLQotLyogU2l6ZSBvZiB0aGUgcm9vdCB0YWJsZSBhcnJheSBpcyBpbmNyZWFzZWQgYnkgdGhpcyBpbmNyZW1lbnQgKi8KLQotI2RlZmluZSBBQ1BJX1JPT1RfVEFCTEVfU0laRV9JTkNSRU1FTlQgIDQKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEFDUEkgU3BlY2lmaWNhdGlvbiBjb25zdGFudHMgKERvIG5vdCBjaGFuZ2UgdW5sZXNzIHRoZSBzcGVjaWZpY2F0aW9uIGNoYW5nZXMpCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBOdW1iZXIgb2YgZGlzdGluY3QgR1BFIHJlZ2lzdGVyIGJsb2NrcyBhbmQgcmVnaXN0ZXIgd2lkdGggKi8KLQotI2RlZmluZSBBQ1BJX01BWF9HUEVfQkxPQ0tTICAgICAgICAgICAgIDIKLSNkZWZpbmUgQUNQSV9HUEVfUkVHSVNURVJfV0lEVEggICAgICAgICA4Ci0KLS8qIE1ldGhvZCBpbmZvIChpbiBXQUxLX1NUQVRFKSwgY29udGFpbmluZyBsb2NhbCB2YXJpYWJsZXMgYW5kIGFyZ3VtZXRucyAqLwotCi0jZGVmaW5lIEFDUElfTUVUSE9EX05VTV9MT0NBTFMgICAgICAgICAgOAotI2RlZmluZSBBQ1BJX01FVEhPRF9NQVhfTE9DQUwgICAgICAgICAgIDcKLQotI2RlZmluZSBBQ1BJX01FVEhPRF9OVU1fQVJHUyAgICAgICAgICAgIDcKLSNkZWZpbmUgQUNQSV9NRVRIT0RfTUFYX0FSRyAgICAgICAgICAgICA2Ci0KLS8qIExlbmd0aCBvZiBfSElELCBfVUlELCBfQ0lELCBhbmQgVVVJRCB2YWx1ZXMgKi8KLQotI2RlZmluZSBBQ1BJX0RFVklDRV9JRF9MRU5HVEggICAgICAgICAgIDB4MDkKLSNkZWZpbmUgQUNQSV9NQVhfQ0lEX0xFTkdUSCAgICAgICAgICAgICA0OAotI2RlZmluZSBBQ1BJX1VVSURfTEVOR1RIICAgICAgICAgICAgICAgIDE2Ci0KLS8qCi0gKiBPcGVyYW5kIFN0YWNrIChpbiBXQUxLX1NUQVRFKSwgTXVzdCBiZSBsYXJnZSBlbm91Z2ggdG8gY29udGFpbiBNRVRIT0RfTUFYX0FSRwotICovCi0jZGVmaW5lIEFDUElfT0JKX05VTV9PUEVSQU5EUyAgICAgICAgICAgOAotI2RlZmluZSBBQ1BJX09CSl9NQVhfT1BFUkFORCAgICAgICAgICAgIDcKLQotLyogTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBSZXN1bHQgU3RhY2sgZnJhbWUsIGNhbiBiZSBhbiBhcmJpdHJhcnkgdmFsdWUgKi8KLQotI2RlZmluZSBBQ1BJX1JFU1VMVFNfRlJBTUVfT0JKX05VTSAgICAgIDgKLQotLyoKLSAqIE1heGltYWwgbnVtYmVyIG9mIGVsZW1lbnRzIHRoZSBSZXN1bHQgU3RhY2sgY2FuIGNvbnRhaW4sCi0gKiBpdCBtYXkgYmUgYW4gYXJiaXRyYXkgdmFsdWUgbm90IGV4Y2VlZGluZyB0aGUgdHlwZXMgb2YKLSAqIHJlc3VsdF9zaXplIGFuZCByZXN1bHRfY291bnQgKG5vdyB1OCkuCi0gKi8KLSNkZWZpbmUgQUNQSV9SRVNVTFRTX09CSl9OVU1fTUFYICAgICAgICAyNTUKLQotLyogTmFtZXMgd2l0aGluIHRoZSBuYW1lc3BhY2UgYXJlIDQgYnl0ZXMgbG9uZyAqLwotCi0jZGVmaW5lIEFDUElfTkFNRV9TSVpFICAgICAgICAgICAgICAgICAgNAotI2RlZmluZSBBQ1BJX1BBVEhfU0VHTUVOVF9MRU5HVEggICAgICAgIDUJLyogNCBjaGFycyBmb3IgbmFtZSArIDEgY2hhciBmb3Igc2VwYXJhdG9yICovCi0jZGVmaW5lIEFDUElfUEFUSF9TRVBBUkFUT1IgICAgICAgICAgICAgJy4nCi0KLS8qIFNpemVzIGZvciBBQ1BJIHRhYmxlIGhlYWRlcnMgKi8KLQotI2RlZmluZSBBQ1BJX09FTV9JRF9TSVpFICAgICAgICAgICAgICAgIDYKLSNkZWZpbmUgQUNQSV9PRU1fVEFCTEVfSURfU0laRSAgICAgICAgICA4Ci0KLS8qIENvbnN0YW50cyB1c2VkIGluIHNlYXJjaGluZyBmb3IgdGhlIFJTRFAgaW4gbG93IG1lbW9yeSAqLwotCi0jZGVmaW5lIEFDUElfRUJEQV9QVFJfTE9DQVRJT04gICAgICAgICAgMHgwMDAwMDQwRQkvKiBQaHlzaWNhbCBBZGRyZXNzICovCi0jZGVmaW5lIEFDUElfRUJEQV9QVFJfTEVOR1RIICAgICAgICAgICAgMgotI2RlZmluZSBBQ1BJX0VCREFfV0lORE9XX1NJWkUgICAgICAgICAgIDEwMjQKLSNkZWZpbmUgQUNQSV9ISV9SU0RQX1dJTkRPV19CQVNFICAgICAgICAweDAwMEUwMDAwCS8qIFBoeXNpY2FsIEFkZHJlc3MgKi8KLSNkZWZpbmUgQUNQSV9ISV9SU0RQX1dJTkRPV19TSVpFICAgICAgICAweDAwMDIwMDAwCi0jZGVmaW5lIEFDUElfUlNEUF9TQ0FOX1NURVAgICAgICAgICAgICAgMTYKLQotLyogT3BlcmF0aW9uIHJlZ2lvbnMgKi8KLQotI2RlZmluZSBBQ1BJX05VTV9QUkVERUZJTkVEX1JFR0lPTlMgICAgIDgKLSNkZWZpbmUgQUNQSV9VU0VSX1JFR0lPTl9CRUdJTiAgICAgICAgICAweDgwCi0KLS8qIE1heGltdW0gc3BhY2VfaWRzIGZvciBPcGVyYXRpb24gUmVnaW9ucyAqLwotCi0jZGVmaW5lIEFDUElfTUFYX0FERFJFU1NfU1BBQ0UgICAgICAgICAgMjU1Ci0KLS8qIEFycmF5IHNpemVzLiAgVXNlZCBmb3IgcmFuZ2UgY2hlY2tpbmcgYWxzbyAqLwotCi0jZGVmaW5lIEFDUElfTUFYX01BVENIX09QQ09ERSAgICAgICAgICAgNQotCi0vKiBSU0RQIGNoZWNrc3VtcyAqLwotCi0jZGVmaW5lIEFDUElfUlNEUF9DSEVDS1NVTV9MRU5HVEggICAgICAgMjAKLSNkZWZpbmUgQUNQSV9SU0RQX1hDSEVDS1NVTV9MRU5HVEggICAgICAzNgotCi0vKiBTTUJ1cyBiaWRpcmVjdGlvbmFsIGJ1ZmZlciBzaXplICovCi0KLSNkZWZpbmUgQUNQSV9TTUJVU19CVUZGRVJfU0laRSAgICAgICAgICAzNAotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogQUNQSSBBTUwgRGVidWdnZXIKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgQUNQSV9ERUJVR0dFUl9NQVhfQVJHUyAgICAgICAgICA4CS8qIE11c3QgYmUgbWF4IG1ldGhvZCBhcmdzICsgMSAqLwotCi0jZGVmaW5lIEFDUElfREVCVUdHRVJfQ09NTUFORF9QUk9NUFQgICAgJy0nCi0jZGVmaW5lIEFDUElfREVCVUdHRVJfRVhFQ1VURV9QUk9NUFQgICAgJyUnCi0KLSNlbmRpZgkJCQkvKiBfQUNDT05GSUdfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL2FjZGlzYXNtLmggYi9pbmNsdWRlL2FjcGkvYWNkaXNhc20uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGMxZWQzOC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FjcGkvYWNkaXNhc20uaAorKysgL2Rldi9udWxsCkBAIC0xLDQ0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogTmFtZTogYWNkaXNhc20uaCAtIEFNTCBkaXNhc3NlbWJsZXIKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA4LCBJbnRlbCBDb3JwLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAotICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgYXQgbWluaW11bSBhIGRpc2NsYWltZXIKLSAqICAgIHN1YnN0YW50aWFsbHkgc2ltaWxhciB0byB0aGUgIk5PIFdBUlJBTlRZIiBkaXNjbGFpbWVyIGJlbG93Ci0gKiAgICAoIkRpc2NsYWltZXIiKSBhbmQgYW55IHJlZGlzdHJpYnV0aW9uIG11c3QgYmUgY29uZGl0aW9uZWQgdXBvbgotICogICAgaW5jbHVkaW5nIGEgc3Vic3RhbnRpYWxseSBzaW1pbGFyIERpc2NsYWltZXIgcmVxdWlyZW1lbnQgZm9yIGZ1cnRoZXIKLSAqICAgIGJpbmFyeSByZWRpc3RyaWJ1dGlvbi4KLSAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcwotICogICAgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICogU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBOTyBXQVJSQU5UWQotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCi0gKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUwotICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcKLSAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQotICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgotICovCi0KLSNpZm5kZWYgX19BQ0RJU0FTTV9IX18KLSNkZWZpbmUgX19BQ0RJU0FTTV9IX18KLQotI2luY2x1ZGUgImFtbHJlc3JjLmgiCi0KLSNkZWZpbmUgQkxPQ0tfTk9ORSAgICAgICAgICAgICAgMAotI2RlZmluZSBCTE9DS19QQVJFTiAgICAgICAgICAgICAxCi0jZGVmaW5lIEJMT0NLX0JSQUNFICAgICAgICAgICAgIDIKLSNkZWZpbmUgQkxPQ0tfQ09NTUFfTElTVCAgICAgICAgNAotI2RlZmluZSBBQ1BJX0RFRkFVTFRfUkVTTkFNRSAgICAqKHUzMiAqKSAiX19SRCIKLQotc3RydWN0IGFjcGlfZXh0ZXJuYWxfbGlzdCB7Ci0JY2hhciAqcGF0aDsKLQljaGFyICppbnRlcm5hbF9wYXRoOwotCXN0cnVjdCBhY3BpX2V4dGVybmFsX2xpc3QgKm5leHQ7Ci0JdTMyIHZhbHVlOwotCXUxNiBsZW5ndGg7Ci0JdTggdHlwZTsKLX07Ci0KLWV4dGVybiBzdHJ1Y3QgYWNwaV9leHRlcm5hbF9saXN0ICphY3BpX2dibF9leHRlcm5hbF9saXN0OwotCi10eXBlZGVmIGNvbnN0IHN0cnVjdCBhY3BpX2RtdGFibGVfaW5mbyB7Ci0JdTggb3Bjb2RlOwotCXU4IG9mZnNldDsKLQljaGFyICpuYW1lOwotCi19IGFjcGlfZG10YWJsZV9pbmZvOwotCi0vKgotICogVmFsdWVzIGZvciBPcGNvZGUgYWJvdmUuCi0gKiBOb3RlOiAwLTcgbXVzdCBub3QgY2hhbmdlLCB1c2VkIGFzIGEgZmxhZyBzaGlmdCB2YWx1ZQotICovCi0jZGVmaW5lIEFDUElfRE1UX0ZMQUcwICAgICAgICAgICAgICAgICAgMAotI2RlZmluZSBBQ1BJX0RNVF9GTEFHMSAgICAgICAgICAgICAgICAgIDEKLSNkZWZpbmUgQUNQSV9ETVRfRkxBRzIgICAgICAgICAgICAgICAgICAyCi0jZGVmaW5lIEFDUElfRE1UX0ZMQUczICAgICAgICAgICAgICAgICAgMwotI2RlZmluZSBBQ1BJX0RNVF9GTEFHNCAgICAgICAgICAgICAgICAgIDQKLSNkZWZpbmUgQUNQSV9ETVRfRkxBRzUgICAgICAgICAgICAgICAgICA1Ci0jZGVmaW5lIEFDUElfRE1UX0ZMQUc2ICAgICAgICAgICAgICAgICAgNgotI2RlZmluZSBBQ1BJX0RNVF9GTEFHNyAgICAgICAgICAgICAgICAgIDcKLSNkZWZpbmUgQUNQSV9ETVRfRkxBR1MwICAgICAgICAgICAgICAgICA4Ci0jZGVmaW5lIEFDUElfRE1UX0ZMQUdTMiAgICAgICAgICAgICAgICAgOQotI2RlZmluZSBBQ1BJX0RNVF9VSU5UOCAgICAgICAgICAgICAgICAgIDEwCi0jZGVmaW5lIEFDUElfRE1UX1VJTlQxNiAgICAgICAgICAgICAgICAgMTEKLSNkZWZpbmUgQUNQSV9ETVRfVUlOVDI0ICAgICAgICAgICAgICAgICAxMgotI2RlZmluZSBBQ1BJX0RNVF9VSU5UMzIgICAgICAgICAgICAgICAgIDEzCi0jZGVmaW5lIEFDUElfRE1UX1VJTlQ1NiAgICAgICAgICAgICAgICAgMTQKLSNkZWZpbmUgQUNQSV9ETVRfVUlOVDY0ICAgICAgICAgICAgICAgICAxNQotI2RlZmluZSBBQ1BJX0RNVF9TVFJJTkcgICAgICAgICAgICAgICAgIDE2Ci0jZGVmaW5lIEFDUElfRE1UX05BTUU0ICAgICAgICAgICAgICAgICAgMTcKLSNkZWZpbmUgQUNQSV9ETVRfTkFNRTYgICAgICAgICAgICAgICAgICAxOAotI2RlZmluZSBBQ1BJX0RNVF9OQU1FOCAgICAgICAgICAgICAgICAgIDE5Ci0jZGVmaW5lIEFDUElfRE1UX0NIS1NVTSAgICAgICAgICAgICAgICAgMjAKLSNkZWZpbmUgQUNQSV9ETVRfU1BBQ0VJRCAgICAgICAgICAgICAgICAyMQotI2RlZmluZSBBQ1BJX0RNVF9HQVMgICAgICAgICAgICAgICAgICAgIDIyCi0jZGVmaW5lIEFDUElfRE1UX0FTRiAgICAgICAgICAgICAgICAgICAgMjMKLSNkZWZpbmUgQUNQSV9ETVRfRE1BUiAgICAgICAgICAgICAgICAgICAyNAotI2RlZmluZSBBQ1BJX0RNVF9IRVNUICAgICAgICAgICAgICAgICAgIDI1Ci0jZGVmaW5lIEFDUElfRE1UX0hFU1ROVEZZICAgICAgICAgICAgICAgMjYKLSNkZWZpbmUgQUNQSV9ETVRfSEVTVE5UWVAgICAgICAgICAgICAgICAyNwotI2RlZmluZSBBQ1BJX0RNVF9NQURUICAgICAgICAgICAgICAgICAgIDI4Ci0jZGVmaW5lIEFDUElfRE1UX1NSQVQgICAgICAgICAgICAgICAgICAgMjkKLSNkZWZpbmUgQUNQSV9ETVRfRVhJVCAgICAgICAgICAgICAgICAgICAzMAotI2RlZmluZSBBQ1BJX0RNVF9TSUcgICAgICAgICAgICAgICAgICAgIDMxCi0KLXR5cGVkZWYKLXZvaWQgKCphY3BpX2RtdGFibGVfaGFuZGxlcikgKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqIHRhYmxlKTsKLQotc3RydWN0IGFjcGlfZG10YWJsZV9kYXRhIHsKLQljaGFyICpzaWduYXR1cmU7Ci0Jc3RydWN0IGFjcGlfZG10YWJsZV9pbmZvICp0YWJsZV9pbmZvOwotCWFjcGlfZG10YWJsZV9oYW5kbGVyIHRhYmxlX2hhbmRsZXI7Ci0JY2hhciAqbmFtZTsKLX07Ci0KLXN0cnVjdCBhY3BpX29wX3dhbGtfaW5mbyB7Ci0JdTMyIGxldmVsOwotCXUzMiBsYXN0X2xldmVsOwotCXUzMiBjb3VudDsKLQl1MzIgYml0X29mZnNldDsKLQl1MzIgZmxhZ3M7Ci0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZTsKLX07Ci0KLXR5cGVkZWYKLWFjcGlfc3RhdHVzKCphc2xfd2Fsa19jYWxsYmFjaykgKHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICogb3AsCi0JCQkJIHUzMiBsZXZlbCwgdm9pZCAqY29udGV4dCk7Ci0KLXN0cnVjdCBhY3BpX3Jlc291cmNlX3RhZyB7Ci0JdTMyIGJpdF9pbmRleDsKLQljaGFyICp0YWc7Ci19OwotCi0vKiBTdHJpbmdzIHVzZWQgZm9yIGRlY29kaW5nIGZsYWdzIHRvIEFTTCBrZXl3b3JkcyAqLwotCi1leHRlcm4gY29uc3QgY2hhciAqYWNwaV9nYmxfd29yZF9kZWNvZGVbXTsKLWV4dGVybiBjb25zdCBjaGFyICphY3BpX2dibF9pcnFfZGVjb2RlW107Ci1leHRlcm4gY29uc3QgY2hhciAqYWNwaV9nYmxfbG9ja19ydWxlW107Ci1leHRlcm4gY29uc3QgY2hhciAqYWNwaV9nYmxfYWNjZXNzX3R5cGVzW107Ci1leHRlcm4gY29uc3QgY2hhciAqYWNwaV9nYmxfdXBkYXRlX3J1bGVzW107Ci1leHRlcm4gY29uc3QgY2hhciAqYWNwaV9nYmxfbWF0Y2hfb3BzW107Ci0KLWV4dGVybiBzdHJ1Y3QgYWNwaV9kbXRhYmxlX2luZm8gYWNwaV9kbV90YWJsZV9pbmZvX2FzZjBbXTsKLWV4dGVybiBzdHJ1Y3QgYWNwaV9kbXRhYmxlX2luZm8gYWNwaV9kbV90YWJsZV9pbmZvX2FzZjFbXTsKLWV4dGVybiBzdHJ1Y3QgYWNwaV9kbXRhYmxlX2luZm8gYWNwaV9kbV90YWJsZV9pbmZvX2FzZjFhW107Ci1leHRlcm4gc3RydWN0IGFjcGlfZG10YWJsZV9pbmZvIGFjcGlfZG1fdGFibGVfaW5mb19hc2YyW107Ci1leHRlcm4gc3RydWN0IGFjcGlfZG10YWJsZV9pbmZvIGFjcGlfZG1fdGFibGVfaW5mb19hc2YyYVtdOwotZXh0ZXJuIHN0cnVjdCBhY3BpX2RtdGFibGVfaW5mbyBhY3BpX2RtX3RhYmxlX2luZm9fYXNmM1tdOwotZXh0ZXJuIHN0cnVjdCBhY3BpX2RtdGFibGVfaW5mbyBhY3BpX2RtX3RhYmxlX2luZm9fYXNmNFtdOwotZXh0ZXJuIHN0cnVjdCBhY3BpX2RtdGFibGVfaW5mbyBhY3BpX2RtX3RhYmxlX2luZm9fYXNmX2hkcltdOwotZXh0ZXJuIHN0cnVjdCBhY3BpX2RtdGFibGVfaW5mbyBhY3BpX2RtX3RhYmxlX2luZm9fYm9vdFtdOwotZXh0ZXJuIHN0cnVjdCBhY3BpX2RtdGFibGVfaW5mbyBhY3BpX2RtX3RhYmxlX2luZm9fYmVydFtdOwotZXh0ZXJuIHN0cnVjdCBhY3BpX2RtdGFibGVfaW5mbyBhY3BpX2RtX3RhYmxlX2luZm9fY3BlcFtdOwotZXh0ZXJuIHN0cnVjdCBhY3BpX2RtdGFibGVfaW5mbyBhY3BpX2RtX3RhYmxlX2luZm9fY3BlcDBbXTsKLWV4dGVybiBzdHJ1Y3QgYWNwaV9kbXRhYmxlX2luZm8gYWNwaV9kbV90YWJsZV9pbmZvX2RiZ3BbXTsKLWV4dGVybiBzdHJ1Y3QgYWNwaV9kbXRhYmxlX2luZm8gYWNwaV9kbV90YWJsZV9pbmZvX2RtYXJbXTsKLWV4dGVybiBzdHJ1Y3QgYWNwaV9kbXRhYmxlX2luZm8gYWNwaV9kbV90YWJsZV9pbmZvX2RtYXJfaGRyW107Ci1leHRlcm4gc3RydWN0IGFjcGlfZG10YWJsZV9pbmZvIGFjcGlfZG1fdGFibGVfaW5mb19kbWFyX3Njb3BlW107Ci1leHRlcm4gc3RydWN0IGFjcGlfZG10YWJsZV9pbmZvIGFjcGlfZG1fdGFibGVfaW5mb19kbWFyMFtdOwotZXh0ZXJuIHN0cnVjdCBhY3BpX2RtdGFibGVfaW5mbyBhY3BpX2RtX3RhYmxlX2luZm9fZG1hcjFbXTsKLWV4dGVybiBzdHJ1Y3QgYWNwaV9kbXRhYmxlX2luZm8gYWNwaV9kbV90YWJsZV9pbmZvX2RtYXIyW107Ci1leHRlcm4gc3RydWN0IGFjcGlfZG10YWJsZV9pbmZvIGFjcGlfZG1fdGFibGVfaW5mb19lY2R0W107Ci1leHRlcm4gc3RydWN0IGFjcGlfZG10YWJsZV9pbmZvIGFjcGlfZG1fdGFibGVfaW5mb19laW5qW107Ci1leHRlcm4gc3RydWN0IGFjcGlfZG10YWJsZV9pbmZvIGFjcGlfZG1fdGFibGVfaW5mb19laW5qMFtdOwotZXh0ZXJuIHN0cnVjdCBhY3BpX2RtdGFibGVfaW5mbyBhY3BpX2RtX3RhYmxlX2luZm9fZXJzdFtdOwotZXh0ZXJuIHN0cnVjdCBhY3BpX2RtdGFibGVfaW5mbyBhY3BpX2RtX3RhYmxlX2luZm9fZmFjc1tdOwotZXh0ZXJuIHN0cnVjdCBhY3BpX2RtdGFibGVfaW5mbyBhY3BpX2RtX3RhYmxlX2luZm9fZmFkdDFbXTsKLWV4dGVybiBzdHJ1Y3QgYWNwaV9kbXRhYmxlX2luZm8gYWNwaV9kbV90YWJsZV9pbmZvX2ZhZHQyW107Ci1leHRlcm4gc3RydWN0IGFjcGlfZG10YWJsZV9pbmZvIGFjcGlfZG1fdGFibGVfaW5mb19nYXNbXTsKLWV4dGVybiBzdHJ1Y3QgYWNwaV9kbXRhYmxlX2luZm8gYWNwaV9kbV90YWJsZV9pbmZvX2hlYWRlcltdOwotZXh0ZXJuIHN0cnVjdCBhY3BpX2RtdGFibGVfaW5mbyBhY3BpX2RtX3RhYmxlX2luZm9faGVzdFtdOwotZXh0ZXJuIHN0cnVjdCBhY3BpX2RtdGFibGVfaW5mbyBhY3BpX2RtX3RhYmxlX2luZm9faGVzdDlbXTsKLWV4dGVybiBzdHJ1Y3QgYWNwaV9kbXRhYmxlX2luZm8gYWNwaV9kbV90YWJsZV9pbmZvX2hlc3Rfbm90aWZ5W107Ci1leHRlcm4gc3RydWN0IGFjcGlfZG10YWJsZV9pbmZvIGFjcGlfZG1fdGFibGVfaW5mb19ocGV0W107Ci1leHRlcm4gc3RydWN0IGFjcGlfZG10YWJsZV9pbmZvIGFjcGlfZG1fdGFibGVfaW5mb19tYWR0W107Ci1leHRlcm4gc3RydWN0IGFjcGlfZG10YWJsZV9pbmZvIGFjcGlfZG1fdGFibGVfaW5mb19tYWR0MFtdOwotZXh0ZXJuIHN0cnVjdCBhY3BpX2RtdGFibGVfaW5mbyBhY3BpX2RtX3RhYmxlX2luZm9fbWFkdDFbXTsKLWV4dGVybiBzdHJ1Y3QgYWNwaV9kbXRhYmxlX2luZm8gYWNwaV9kbV90YWJsZV9pbmZvX21hZHQyW107Ci1leHRlcm4gc3RydWN0IGFjcGlfZG10YWJsZV9pbmZvIGFjcGlfZG1fdGFibGVfaW5mb19tYWR0M1tdOwotZXh0ZXJuIHN0cnVjdCBhY3BpX2RtdGFibGVfaW5mbyBhY3BpX2RtX3RhYmxlX2luZm9fbWFkdDRbXTsKLWV4dGVybiBzdHJ1Y3QgYWNwaV9kbXRhYmxlX2luZm8gYWNwaV9kbV90YWJsZV9pbmZvX21hZHQ1W107Ci1leHRlcm4gc3RydWN0IGFjcGlfZG10YWJsZV9pbmZvIGFjcGlfZG1fdGFibGVfaW5mb19tYWR0NltdOwotZXh0ZXJuIHN0cnVjdCBhY3BpX2RtdGFibGVfaW5mbyBhY3BpX2RtX3RhYmxlX2luZm9fbWFkdDdbXTsKLWV4dGVybiBzdHJ1Y3QgYWNwaV9kbXRhYmxlX2luZm8gYWNwaV9kbV90YWJsZV9pbmZvX21hZHQ4W107Ci1leHRlcm4gc3RydWN0IGFjcGlfZG10YWJsZV9pbmZvIGFjcGlfZG1fdGFibGVfaW5mb19tYWR0OVtdOwotZXh0ZXJuIHN0cnVjdCBhY3BpX2RtdGFibGVfaW5mbyBhY3BpX2RtX3RhYmxlX2luZm9fbWFkdDEwW107Ci1leHRlcm4gc3RydWN0IGFjcGlfZG10YWJsZV9pbmZvIGFjcGlfZG1fdGFibGVfaW5mb19tYWR0X2hkcltdOwotZXh0ZXJuIHN0cnVjdCBhY3BpX2RtdGFibGVfaW5mbyBhY3BpX2RtX3RhYmxlX2luZm9fbWNmZ1tdOwotZXh0ZXJuIHN0cnVjdCBhY3BpX2RtdGFibGVfaW5mbyBhY3BpX2RtX3RhYmxlX2luZm9fbWNmZzBbXTsKLWV4dGVybiBzdHJ1Y3QgYWNwaV9kbXRhYmxlX2luZm8gYWNwaV9kbV90YWJsZV9pbmZvX3JzZHAxW107Ci1leHRlcm4gc3RydWN0IGFjcGlfZG10YWJsZV9pbmZvIGFjcGlfZG1fdGFibGVfaW5mb19yc2RwMltdOwotZXh0ZXJuIHN0cnVjdCBhY3BpX2RtdGFibGVfaW5mbyBhY3BpX2RtX3RhYmxlX2luZm9fc2JzdFtdOwotZXh0ZXJuIHN0cnVjdCBhY3BpX2RtdGFibGVfaW5mbyBhY3BpX2RtX3RhYmxlX2luZm9fc2xpY1tdOwotZXh0ZXJuIHN0cnVjdCBhY3BpX2RtdGFibGVfaW5mbyBhY3BpX2RtX3RhYmxlX2luZm9fc2xpdFtdOwotZXh0ZXJuIHN0cnVjdCBhY3BpX2RtdGFibGVfaW5mbyBhY3BpX2RtX3RhYmxlX2luZm9fc3BjcltdOwotZXh0ZXJuIHN0cnVjdCBhY3BpX2RtdGFibGVfaW5mbyBhY3BpX2RtX3RhYmxlX2luZm9fc3BtaVtdOwotZXh0ZXJuIHN0cnVjdCBhY3BpX2RtdGFibGVfaW5mbyBhY3BpX2RtX3RhYmxlX2luZm9fc3JhdFtdOwotZXh0ZXJuIHN0cnVjdCBhY3BpX2RtdGFibGVfaW5mbyBhY3BpX2RtX3RhYmxlX2luZm9fc3JhdF9oZHJbXTsKLWV4dGVybiBzdHJ1Y3QgYWNwaV9kbXRhYmxlX2luZm8gYWNwaV9kbV90YWJsZV9pbmZvX3NyYXQwW107Ci1leHRlcm4gc3RydWN0IGFjcGlfZG10YWJsZV9pbmZvIGFjcGlfZG1fdGFibGVfaW5mb19zcmF0MVtdOwotZXh0ZXJuIHN0cnVjdCBhY3BpX2RtdGFibGVfaW5mbyBhY3BpX2RtX3RhYmxlX2luZm9fc3JhdDJbXTsKLWV4dGVybiBzdHJ1Y3QgYWNwaV9kbXRhYmxlX2luZm8gYWNwaV9kbV90YWJsZV9pbmZvX3RjcGFbXTsKLWV4dGVybiBzdHJ1Y3QgYWNwaV9kbXRhYmxlX2luZm8gYWNwaV9kbV90YWJsZV9pbmZvX3dkcnRbXTsKLQotLyoKLSAqIGRtdGFibGUKLSAqLwotdm9pZCBhY3BpX2RtX2R1bXBfZGF0YV90YWJsZShzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKnRhYmxlKTsKLQotYWNwaV9zdGF0dXMKLWFjcGlfZG1fZHVtcF90YWJsZSh1MzIgdGFibGVfbGVuZ3RoLAotCQkgICB1MzIgdGFibGVfb2Zmc2V0LAotCQkgICB2b2lkICp0YWJsZSwKLQkJICAgdTMyIHN1Yl90YWJsZV9sZW5ndGgsIHN0cnVjdCBhY3BpX2RtdGFibGVfaW5mbyAqaW5mbyk7Ci0KLXZvaWQgYWNwaV9kbV9saW5lX2hlYWRlcih1MzIgb2Zmc2V0LCB1MzIgYnl0ZV9sZW5ndGgsIGNoYXIgKm5hbWUpOwotCi12b2lkIGFjcGlfZG1fbGluZV9oZWFkZXIyKHUzMiBvZmZzZXQsIHUzMiBieXRlX2xlbmd0aCwgY2hhciAqbmFtZSwgdTMyIHZhbHVlKTsKLQotLyoKLSAqIGRtdGJkdW1wCi0gKi8KLXZvaWQgYWNwaV9kbV9kdW1wX2FzZihzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKnRhYmxlKTsKLQotdm9pZCBhY3BpX2RtX2R1bXBfY3BlcChzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKnRhYmxlKTsKLQotdm9pZCBhY3BpX2RtX2R1bXBfZG1hcihzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKnRhYmxlKTsKLQotdm9pZCBhY3BpX2RtX2R1bXBfZWluaihzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKnRhYmxlKTsKLQotdm9pZCBhY3BpX2RtX2R1bXBfZXJzdChzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKnRhYmxlKTsKLQotdm9pZCBhY3BpX2RtX2R1bXBfZmFkdChzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKnRhYmxlKTsKLQotdm9pZCBhY3BpX2RtX2R1bXBfaGVzdChzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKnRhYmxlKTsKLQotdm9pZCBhY3BpX2RtX2R1bXBfbWNmZyhzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKnRhYmxlKTsKLQotdm9pZCBhY3BpX2RtX2R1bXBfbWFkdChzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKnRhYmxlKTsKLQotdTMyIGFjcGlfZG1fZHVtcF9yc2RwKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqdGFibGUpOwotCi12b2lkIGFjcGlfZG1fZHVtcF9yc2R0KHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqdGFibGUpOwotCi12b2lkIGFjcGlfZG1fZHVtcF9zbGl0KHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqdGFibGUpOwotCi12b2lkIGFjcGlfZG1fZHVtcF9zcmF0KHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqdGFibGUpOwotCi12b2lkIGFjcGlfZG1fZHVtcF94c2R0KHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqdGFibGUpOwotCi0vKgotICogZG13YWxrCi0gKi8KLXZvaWQKLWFjcGlfZG1fZGlzYXNzZW1ibGUoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSwKLQkJICAgIHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpvcmlnaW4sIHUzMiBudW1fb3Bjb2Rlcyk7Ci0KLXZvaWQKLWFjcGlfZG1fd2Fsa19wYXJzZV90cmVlKHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpvcCwKLQkJCWFzbF93YWxrX2NhbGxiYWNrIGRlc2NlbmRpbmdfY2FsbGJhY2ssCi0JCQlhc2xfd2Fsa19jYWxsYmFjayBhc2NlbmRpbmdfY2FsbGJhY2ssIHZvaWQgKmNvbnRleHQpOwotCi0vKgotICogZG1vcGNvZGUKLSAqLwotdm9pZAotYWNwaV9kbV9kaXNhc3NlbWJsZV9vbmVfb3Aoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSwKLQkJCSAgIHN0cnVjdCBhY3BpX29wX3dhbGtfaW5mbyAqaW5mbywKLQkJCSAgIHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpvcCk7Ci0KLXZvaWQgYWNwaV9kbV9kZWNvZGVfaW50ZXJuYWxfb2JqZWN0KHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjKTsKLQotdTMyIGFjcGlfZG1fbGlzdF90eXBlKHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpvcCk7Ci0KLXZvaWQgYWNwaV9kbV9tZXRob2RfZmxhZ3ModW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKm9wKTsKLQotdm9pZCBhY3BpX2RtX2ZpZWxkX2ZsYWdzKHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpvcCk7Ci0KLXZvaWQgYWNwaV9kbV9hZGRyZXNzX3NwYWNlKHU4IHNwYWNlX2lkKTsKLQotdm9pZCBhY3BpX2RtX3JlZ2lvbl9mbGFncyh1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqb3ApOwotCi12b2lkIGFjcGlfZG1fbWF0Y2hfb3AodW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKm9wKTsKLQotdTggYWNwaV9kbV9jb21tYV9pZl9saXN0X21lbWJlcih1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqb3ApOwotCi12b2lkIGFjcGlfZG1fY29tbWFfaWZfZmllbGRfbWVtYmVyKHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpvcCk7Ci0KLS8qCi0gKiBkbW5hbWVzCi0gKi8KLXUzMiBhY3BpX2RtX2R1bXBfbmFtZShjaGFyICpuYW1lKTsKLQotYWNwaV9zdGF0dXMKLWFjcGlfcHNfZGlzcGxheV9vYmplY3RfcGF0aG5hbWUoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSwKLQkJCQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqb3ApOwotCi12b2lkIGFjcGlfZG1fbmFtZXN0cmluZyhjaGFyICpuYW1lKTsKLQotLyoKLSAqIGRtb2JqZWN0Ci0gKi8KLXZvaWQKLWFjcGlfZG1fZGlzcGxheV9pbnRlcm5hbF9vYmplY3QodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2MsCi0JCQkJc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSk7Ci0KLXZvaWQgYWNwaV9kbV9kaXNwbGF5X2FyZ3VtZW50cyhzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKTsKLQotdm9pZCBhY3BpX2RtX2Rpc3BsYXlfbG9jYWxzKHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUpOwotCi12b2lkCi1hY3BpX2RtX2R1bXBfbWV0aG9kX2luZm8oYWNwaV9zdGF0dXMgc3RhdHVzLAotCQkJIHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUsCi0JCQkgdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKm9wKTsKLQotLyoKLSAqIGRtYnVmZmVyCi0gKi8KLXZvaWQgYWNwaV9kbV9kaXNhc21fYnl0ZV9saXN0KHUzMiBsZXZlbCwgdTggKiBieXRlX2RhdGEsIHUzMiBieXRlX2NvdW50KTsKLQotdm9pZAotYWNwaV9kbV9ieXRlX2xpc3Qoc3RydWN0IGFjcGlfb3Bfd2Fsa19pbmZvICppbmZvLCB1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqb3ApOwotCi12b2lkIGFjcGlfZG1faXNfZWlzYV9pZCh1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqb3ApOwotCi12b2lkIGFjcGlfZG1fZWlzYV9pZCh1MzIgZW5jb2RlZF9pZCk7Ci0KLXU4IGFjcGlfZG1faXNfdW5pY29kZV9idWZmZXIodW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKm9wKTsKLQotdTggYWNwaV9kbV9pc19zdHJpbmdfYnVmZmVyKHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpvcCk7Ci0KLS8qCi0gKiBkbXJlc3JjCi0gKi8KLXZvaWQgYWNwaV9kbV9kdW1wX2ludGVnZXI4KHU4IHZhbHVlLCBjaGFyICpuYW1lKTsKLQotdm9pZCBhY3BpX2RtX2R1bXBfaW50ZWdlcjE2KHUxNiB2YWx1ZSwgY2hhciAqbmFtZSk7Ci0KLXZvaWQgYWNwaV9kbV9kdW1wX2ludGVnZXIzMih1MzIgdmFsdWUsIGNoYXIgKm5hbWUpOwotCi12b2lkIGFjcGlfZG1fZHVtcF9pbnRlZ2VyNjQodTY0IHZhbHVlLCBjaGFyICpuYW1lKTsKLQotdm9pZAotYWNwaV9kbV9yZXNvdXJjZV90ZW1wbGF0ZShzdHJ1Y3QgYWNwaV9vcF93YWxrX2luZm8gKmluZm8sCi0JCQkgIHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpvcCwKLQkJCSAgdTggKiBieXRlX2RhdGEsIHUzMiBieXRlX2NvdW50KTsKLQotYWNwaV9zdGF0dXMgYWNwaV9kbV9pc19yZXNvdXJjZV90ZW1wbGF0ZSh1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqb3ApOwotCi12b2lkIGFjcGlfZG1faW5kZW50KHUzMiBsZXZlbCk7Ci0KLXZvaWQgYWNwaV9kbV9iaXRfbGlzdCh1MTYgbWFzayk7Ci0KLXZvaWQgYWNwaV9kbV9kZWNvZGVfYXR0cmlidXRlKHU4IGF0dHJpYnV0ZSk7Ci0KLXZvaWQgYWNwaV9kbV9kZXNjcmlwdG9yX25hbWUodm9pZCk7Ci0KLS8qCi0gKiBkbXJlc3JjbAotICovCi12b2lkCi1hY3BpX2RtX3dvcmRfZGVzY3JpcHRvcih1bmlvbiBhbWxfcmVzb3VyY2UgKnJlc291cmNlLCB1MzIgbGVuZ3RoLCB1MzIgbGV2ZWwpOwotCi12b2lkCi1hY3BpX2RtX2R3b3JkX2Rlc2NyaXB0b3IodW5pb24gYW1sX3Jlc291cmNlICpyZXNvdXJjZSwgdTMyIGxlbmd0aCwgdTMyIGxldmVsKTsKLQotdm9pZAotYWNwaV9kbV9leHRlbmRlZF9kZXNjcmlwdG9yKHVuaW9uIGFtbF9yZXNvdXJjZSAqcmVzb3VyY2UsCi0JCQkgICAgdTMyIGxlbmd0aCwgdTMyIGxldmVsKTsKLQotdm9pZAotYWNwaV9kbV9xd29yZF9kZXNjcmlwdG9yKHVuaW9uIGFtbF9yZXNvdXJjZSAqcmVzb3VyY2UsIHUzMiBsZW5ndGgsIHUzMiBsZXZlbCk7Ci0KLXZvaWQKLWFjcGlfZG1fbWVtb3J5MjRfZGVzY3JpcHRvcih1bmlvbiBhbWxfcmVzb3VyY2UgKnJlc291cmNlLAotCQkJICAgIHUzMiBsZW5ndGgsIHUzMiBsZXZlbCk7Ci0KLXZvaWQKLWFjcGlfZG1fbWVtb3J5MzJfZGVzY3JpcHRvcih1bmlvbiBhbWxfcmVzb3VyY2UgKnJlc291cmNlLAotCQkJICAgIHUzMiBsZW5ndGgsIHUzMiBsZXZlbCk7Ci0KLXZvaWQKLWFjcGlfZG1fZml4ZWRfbWVtb3J5MzJfZGVzY3JpcHRvcih1bmlvbiBhbWxfcmVzb3VyY2UgKnJlc291cmNlLAotCQkJCSAgdTMyIGxlbmd0aCwgdTMyIGxldmVsKTsKLQotdm9pZAotYWNwaV9kbV9nZW5lcmljX3JlZ2lzdGVyX2Rlc2NyaXB0b3IodW5pb24gYW1sX3Jlc291cmNlICpyZXNvdXJjZSwKLQkJCQkgICAgdTMyIGxlbmd0aCwgdTMyIGxldmVsKTsKLQotdm9pZAotYWNwaV9kbV9pbnRlcnJ1cHRfZGVzY3JpcHRvcih1bmlvbiBhbWxfcmVzb3VyY2UgKnJlc291cmNlLAotCQkJICAgICB1MzIgbGVuZ3RoLCB1MzIgbGV2ZWwpOwotCi12b2lkCi1hY3BpX2RtX3ZlbmRvcl9sYXJnZV9kZXNjcmlwdG9yKHVuaW9uIGFtbF9yZXNvdXJjZSAqcmVzb3VyY2UsCi0JCQkJdTMyIGxlbmd0aCwgdTMyIGxldmVsKTsKLQotdm9pZCBhY3BpX2RtX3ZlbmRvcl9jb21tb24oY2hhciAqbmFtZSwgdTggKiBieXRlX2RhdGEsIHUzMiBsZW5ndGgsIHUzMiBsZXZlbCk7Ci0KLS8qCi0gKiBkbXJlc3JjcwotICovCi12b2lkCi1hY3BpX2RtX2lycV9kZXNjcmlwdG9yKHVuaW9uIGFtbF9yZXNvdXJjZSAqcmVzb3VyY2UsIHUzMiBsZW5ndGgsIHUzMiBsZXZlbCk7Ci0KLXZvaWQKLWFjcGlfZG1fZG1hX2Rlc2NyaXB0b3IodW5pb24gYW1sX3Jlc291cmNlICpyZXNvdXJjZSwgdTMyIGxlbmd0aCwgdTMyIGxldmVsKTsKLQotdm9pZCBhY3BpX2RtX2lvX2Rlc2NyaXB0b3IodW5pb24gYW1sX3Jlc291cmNlICpyZXNvdXJjZSwgdTMyIGxlbmd0aCwgdTMyIGxldmVsKTsKLQotdm9pZAotYWNwaV9kbV9maXhlZF9pb19kZXNjcmlwdG9yKHVuaW9uIGFtbF9yZXNvdXJjZSAqcmVzb3VyY2UsCi0JCQkgICAgdTMyIGxlbmd0aCwgdTMyIGxldmVsKTsKLQotdm9pZAotYWNwaV9kbV9zdGFydF9kZXBlbmRlbnRfZGVzY3JpcHRvcih1bmlvbiBhbWxfcmVzb3VyY2UgKnJlc291cmNlLAotCQkJCSAgIHUzMiBsZW5ndGgsIHUzMiBsZXZlbCk7Ci0KLXZvaWQKLWFjcGlfZG1fZW5kX2RlcGVuZGVudF9kZXNjcmlwdG9yKHVuaW9uIGFtbF9yZXNvdXJjZSAqcmVzb3VyY2UsCi0JCQkJIHUzMiBsZW5ndGgsIHUzMiBsZXZlbCk7Ci0KLXZvaWQKLWFjcGlfZG1fdmVuZG9yX3NtYWxsX2Rlc2NyaXB0b3IodW5pb24gYW1sX3Jlc291cmNlICpyZXNvdXJjZSwKLQkJCQl1MzIgbGVuZ3RoLCB1MzIgbGV2ZWwpOwotCi0vKgotICogZG11dGlscwotICovCi12b2lkIGFjcGlfZG1fYWRkX3RvX2V4dGVybmFsX2xpc3QoY2hhciAqcGF0aCwgdTggdHlwZSwgdTMyIHZhbHVlKTsKLQotLyoKLSAqIGRtcmVzdGFnCi0gKi8KLXZvaWQgYWNwaV9kbV9maW5kX3Jlc291cmNlcyh1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqcm9vdCk7Ci0KLXZvaWQKLWFjcGlfZG1fY2hlY2tfcmVzb3VyY2VfcmVmZXJlbmNlKHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpvcCwKLQkJCQkgc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSk7Ci0KLSNlbmRpZgkJCQkvKiBfX0FDRElTQVNNX0hfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL2FjZXZlbnRzLmggYi9pbmNsdWRlL2FjcGkvYWNldmVudHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDVkMDk5Yi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FjcGkvYWNldmVudHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDIxNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogTmFtZTogYWNldmVudHMuaCAtIEV2ZW50IHN1YmNvbXBvbmVudCBwcm90b3R5cGVzIGFuZCBkZWZpbmVzCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwOCwgSW50ZWwgQ29ycC4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKLSAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIGF0IG1pbmltdW0gYSBkaXNjbGFpbWVyCi0gKiAgICBzdWJzdGFudGlhbGx5IHNpbWlsYXIgdG8gdGhlICJOTyBXQVJSQU5UWSIgZGlzY2xhaW1lciBiZWxvdwotICogICAgKCJEaXNjbGFpbWVyIikgYW5kIGFueSByZWRpc3RyaWJ1dGlvbiBtdXN0IGJlIGNvbmRpdGlvbmVkIHVwb24KLSAqICAgIGluY2x1ZGluZyBhIHN1YnN0YW50aWFsbHkgc2ltaWxhciBEaXNjbGFpbWVyIHJlcXVpcmVtZW50IGZvciBmdXJ0aGVyCi0gKiAgICBiaW5hcnkgcmVkaXN0cmlidXRpb24uCi0gKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMKLSAqICAgIG9mIGFueSBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTk8gV0FSUkFOVFkKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAotICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKLSAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HCi0gKiBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKLSAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KLSAqLwotCi0jaWZuZGVmIF9fQUNFVkVOVFNfSF9fCi0jZGVmaW5lIF9fQUNFVkVOVFNfSF9fCi0KLS8qCi0gKiBldmV2ZW50Ci0gKi8KLWFjcGlfc3RhdHVzIGFjcGlfZXZfaW5pdGlhbGl6ZV9ldmVudHModm9pZCk7Ci0KLWFjcGlfc3RhdHVzIGFjcGlfZXZfaW5zdGFsbF94cnVwdF9oYW5kbGVycyh2b2lkKTsKLQotYWNwaV9zdGF0dXMgYWNwaV9ldl9pbnN0YWxsX2ZhZHRfZ3Blcyh2b2lkKTsKLQotdTMyIGFjcGlfZXZfZml4ZWRfZXZlbnRfZGV0ZWN0KHZvaWQpOwotCi0vKgotICogZXZtaXNjCi0gKi8KLXU4IGFjcGlfZXZfaXNfbm90aWZ5X29iamVjdChzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZSk7Ci0KLWFjcGlfc3RhdHVzIGFjcGlfZXZfYWNxdWlyZV9nbG9iYWxfbG9jayh1MTYgdGltZW91dCk7Ci0KLWFjcGlfc3RhdHVzIGFjcGlfZXZfcmVsZWFzZV9nbG9iYWxfbG9jayh2b2lkKTsKLQotYWNwaV9zdGF0dXMgYWNwaV9ldl9pbml0X2dsb2JhbF9sb2NrX2hhbmRsZXIodm9pZCk7Ci0KLXUzMiBhY3BpX2V2X2dldF9ncGVfbnVtYmVyX2luZGV4KHUzMiBncGVfbnVtYmVyKTsKLQotYWNwaV9zdGF0dXMKLWFjcGlfZXZfcXVldWVfbm90aWZ5X3JlcXVlc3Qoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGUsCi0JCQkgICAgIHUzMiBub3RpZnlfdmFsdWUpOwotCi0vKgotICogZXZncGUgLSBHUEUgaGFuZGxpbmcgYW5kIGRpc3BhdGNoCi0gKi8KLWFjcGlfc3RhdHVzCi1hY3BpX2V2X3VwZGF0ZV9ncGVfZW5hYmxlX21hc2tzKHN0cnVjdCBhY3BpX2dwZV9ldmVudF9pbmZvICpncGVfZXZlbnRfaW5mbywKLQkJCQl1OCB0eXBlKTsKLQotYWNwaV9zdGF0dXMKLWFjcGlfZXZfZW5hYmxlX2dwZShzdHJ1Y3QgYWNwaV9ncGVfZXZlbnRfaW5mbyAqZ3BlX2V2ZW50X2luZm8sCi0JCSAgIHU4IHdyaXRlX3RvX2hhcmR3YXJlKTsKLQotYWNwaV9zdGF0dXMgYWNwaV9ldl9kaXNhYmxlX2dwZShzdHJ1Y3QgYWNwaV9ncGVfZXZlbnRfaW5mbyAqZ3BlX2V2ZW50X2luZm8pOwotCi1zdHJ1Y3QgYWNwaV9ncGVfZXZlbnRfaW5mbyAqYWNwaV9ldl9nZXRfZ3BlX2V2ZW50X2luZm8oYWNwaV9oYW5kbGUgZ3BlX2RldmljZSwKLQkJCQkJCSAgICAgICB1MzIgZ3BlX251bWJlcik7Ci0KLS8qCi0gKiBldmdwZWJsawotICovCi11OCBhY3BpX2V2X3ZhbGlkX2dwZV9ldmVudChzdHJ1Y3QgYWNwaV9ncGVfZXZlbnRfaW5mbyAqZ3BlX2V2ZW50X2luZm8pOwotCi1hY3BpX3N0YXR1cyBhY3BpX2V2X3dhbGtfZ3BlX2xpc3QoYWNwaV9ncGVfY2FsbGJhY2sgZ3BlX3dhbGtfY2FsbGJhY2spOwotCi1hY3BpX3N0YXR1cwotYWNwaV9ldl9kZWxldGVfZ3BlX2hhbmRsZXJzKHN0cnVjdCBhY3BpX2dwZV94cnVwdF9pbmZvICpncGVfeHJ1cHRfaW5mbywKLQkJCSAgICBzdHJ1Y3QgYWNwaV9ncGVfYmxvY2tfaW5mbyAqZ3BlX2Jsb2NrKTsKLQotYWNwaV9zdGF0dXMKLWFjcGlfZXZfY3JlYXRlX2dwZV9ibG9jayhzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqZ3BlX2RldmljZSwKLQkJCSBzdHJ1Y3QgYWNwaV9nZW5lcmljX2FkZHJlc3MgKmdwZV9ibG9ja19hZGRyZXNzLAotCQkJIHUzMiByZWdpc3Rlcl9jb3VudCwKLQkJCSB1OCBncGVfYmxvY2tfYmFzZV9udW1iZXIsCi0JCQkgdTMyIGludGVycnVwdF9udW1iZXIsCi0JCQkgc3RydWN0IGFjcGlfZ3BlX2Jsb2NrX2luZm8gKipyZXR1cm5fZ3BlX2Jsb2NrKTsKLQotYWNwaV9zdGF0dXMKLWFjcGlfZXZfaW5pdGlhbGl6ZV9ncGVfYmxvY2soc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKmdwZV9kZXZpY2UsCi0JCQkgICAgIHN0cnVjdCBhY3BpX2dwZV9ibG9ja19pbmZvICpncGVfYmxvY2spOwotCi1hY3BpX3N0YXR1cyBhY3BpX2V2X2RlbGV0ZV9ncGVfYmxvY2soc3RydWN0IGFjcGlfZ3BlX2Jsb2NrX2luZm8gKmdwZV9ibG9jayk7Ci0KLXUzMgotYWNwaV9ldl9ncGVfZGlzcGF0Y2goc3RydWN0IGFjcGlfZ3BlX2V2ZW50X2luZm8gKmdwZV9ldmVudF9pbmZvLAotCQkgICAgIHUzMiBncGVfbnVtYmVyKTsKLQotdTMyIGFjcGlfZXZfZ3BlX2RldGVjdChzdHJ1Y3QgYWNwaV9ncGVfeHJ1cHRfaW5mbyAqZ3BlX3hydXB0X2xpc3QpOwotCi1hY3BpX3N0YXR1cwotYWNwaV9ldl9zZXRfZ3BlX3R5cGUoc3RydWN0IGFjcGlfZ3BlX2V2ZW50X2luZm8gKmdwZV9ldmVudF9pbmZvLCB1OCB0eXBlKTsKLQotYWNwaV9zdGF0dXMKLWFjcGlfZXZfY2hlY2tfZm9yX3dha2Vfb25seV9ncGUoc3RydWN0IGFjcGlfZ3BlX2V2ZW50X2luZm8gKmdwZV9ldmVudF9pbmZvKTsKLQotYWNwaV9zdGF0dXMgYWNwaV9ldl9ncGVfaW5pdGlhbGl6ZSh2b2lkKTsKLQotLyoKLSAqIGV2cmVnaW9uIC0gQWRkcmVzcyBTcGFjZSBoYW5kbGluZwotICovCi1hY3BpX3N0YXR1cyBhY3BpX2V2X2luc3RhbGxfcmVnaW9uX2hhbmRsZXJzKHZvaWQpOwotCi1hY3BpX3N0YXR1cyBhY3BpX2V2X2luaXRpYWxpemVfb3BfcmVnaW9ucyh2b2lkKTsKLQotYWNwaV9zdGF0dXMKLWFjcGlfZXZfYWRkcmVzc19zcGFjZV9kaXNwYXRjaCh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpyZWdpb25fb2JqLAotCQkJICAgICAgIHUzMiBmdW5jdGlvbiwKLQkJCSAgICAgICBhY3BpX3BoeXNpY2FsX2FkZHJlc3MgYWRkcmVzcywKLQkJCSAgICAgICB1MzIgYml0X3dpZHRoLCBhY3BpX2ludGVnZXIgKiB2YWx1ZSk7Ci0KLWFjcGlfc3RhdHVzCi1hY3BpX2V2X2F0dGFjaF9yZWdpb24odW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqaGFuZGxlcl9vYmosCi0JCSAgICAgIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnJlZ2lvbl9vYmosCi0JCSAgICAgIHU4IGFjcGlfbnNfaXNfbG9ja2VkKTsKLQotdm9pZAotYWNwaV9ldl9kZXRhY2hfcmVnaW9uKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnJlZ2lvbl9vYmosCi0JCSAgICAgIHU4IGFjcGlfbnNfaXNfbG9ja2VkKTsKLQotYWNwaV9zdGF0dXMKLWFjcGlfZXZfaW5zdGFsbF9zcGFjZV9oYW5kbGVyKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlLAotCQkJICAgICAgYWNwaV9hZHJfc3BhY2VfdHlwZSBzcGFjZV9pZCwKLQkJCSAgICAgIGFjcGlfYWRyX3NwYWNlX2hhbmRsZXIgaGFuZGxlciwKLQkJCSAgICAgIGFjcGlfYWRyX3NwYWNlX3NldHVwIHNldHVwLCB2b2lkICpjb250ZXh0KTsKLQotYWNwaV9zdGF0dXMKLWFjcGlfZXZfZXhlY3V0ZV9yZWdfbWV0aG9kcyhzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZSwKLQkJCSAgICBhY3BpX2Fkcl9zcGFjZV90eXBlIHNwYWNlX2lkKTsKLQotYWNwaV9zdGF0dXMKLWFjcGlfZXZfZXhlY3V0ZV9yZWdfbWV0aG9kKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnJlZ2lvbl9vYmosIHUzMiBmdW5jdGlvbik7Ci0KLS8qCi0gKiBldnJlZ2luaSAtIFJlZ2lvbiBpbml0aWFsaXphdGlvbiBhbmQgc2V0dXAKLSAqLwotYWNwaV9zdGF0dXMKLWFjcGlfZXZfc3lzdGVtX21lbW9yeV9yZWdpb25fc2V0dXAoYWNwaV9oYW5kbGUgaGFuZGxlLAotCQkJCSAgIHUzMiBmdW5jdGlvbiwKLQkJCQkgICB2b2lkICpoYW5kbGVyX2NvbnRleHQsCi0JCQkJICAgdm9pZCAqKnJlZ2lvbl9jb250ZXh0KTsKLQotYWNwaV9zdGF0dXMKLWFjcGlfZXZfaW9fc3BhY2VfcmVnaW9uX3NldHVwKGFjcGlfaGFuZGxlIGhhbmRsZSwKLQkJCSAgICAgIHUzMiBmdW5jdGlvbiwKLQkJCSAgICAgIHZvaWQgKmhhbmRsZXJfY29udGV4dCwgdm9pZCAqKnJlZ2lvbl9jb250ZXh0KTsKLQotYWNwaV9zdGF0dXMKLWFjcGlfZXZfcGNpX2NvbmZpZ19yZWdpb25fc2V0dXAoYWNwaV9oYW5kbGUgaGFuZGxlLAotCQkJCXUzMiBmdW5jdGlvbiwKLQkJCQl2b2lkICpoYW5kbGVyX2NvbnRleHQsIHZvaWQgKipyZWdpb25fY29udGV4dCk7Ci0KLWFjcGlfc3RhdHVzCi1hY3BpX2V2X2Ntb3NfcmVnaW9uX3NldHVwKGFjcGlfaGFuZGxlIGhhbmRsZSwKLQkJCSAgdTMyIGZ1bmN0aW9uLAotCQkJICB2b2lkICpoYW5kbGVyX2NvbnRleHQsIHZvaWQgKipyZWdpb25fY29udGV4dCk7Ci0KLWFjcGlfc3RhdHVzCi1hY3BpX2V2X3BjaV9iYXJfcmVnaW9uX3NldHVwKGFjcGlfaGFuZGxlIGhhbmRsZSwKLQkJCSAgICAgdTMyIGZ1bmN0aW9uLAotCQkJICAgICB2b2lkICpoYW5kbGVyX2NvbnRleHQsIHZvaWQgKipyZWdpb25fY29udGV4dCk7Ci0KLWFjcGlfc3RhdHVzCi1hY3BpX2V2X2RlZmF1bHRfcmVnaW9uX3NldHVwKGFjcGlfaGFuZGxlIGhhbmRsZSwKLQkJCSAgICAgdTMyIGZ1bmN0aW9uLAotCQkJICAgICB2b2lkICpoYW5kbGVyX2NvbnRleHQsIHZvaWQgKipyZWdpb25fY29udGV4dCk7Ci0KLWFjcGlfc3RhdHVzCi1hY3BpX2V2X2luaXRpYWxpemVfcmVnaW9uKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnJlZ2lvbl9vYmosCi0JCQkgIHU4IGFjcGlfbnNfbG9ja2VkKTsKLQotLyoKLSAqIGV2c2NpIC0gU0NJIChTeXN0ZW0gQ29udHJvbCBJbnRlcnJ1cHQpIGhhbmRsaW5nL2Rpc3BhdGNoCi0gKi8KLXUzMiBBQ1BJX1NZU1RFTV9YRkFDRSBhY3BpX2V2X2dwZV94cnVwdF9oYW5kbGVyKHZvaWQgKmNvbnRleHQpOwotCi11MzIgYWNwaV9ldl9pbnN0YWxsX3NjaV9oYW5kbGVyKHZvaWQpOwotCi1hY3BpX3N0YXR1cyBhY3BpX2V2X3JlbW92ZV9zY2lfaGFuZGxlcih2b2lkKTsKLQotdTMyIGFjcGlfZXZfaW5pdGlhbGl6ZV9zQ0kodTMyIHByb2dyYW1fc0NJKTsKLQotdm9pZCBhY3BpX2V2X3Rlcm1pbmF0ZSh2b2lkKTsKLQotI2VuZGlmCQkJCS8qIF9fQUNFVkVOVFNfSF9fICAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL2FjZXhjZXAuaCBiL2luY2x1ZGUvYWNwaS9hY2V4Y2VwLmgKaW5kZXggODRmNWNiMi4uZWRhMDQ1NCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL2FjZXhjZXAuaAorKysgYi9pbmNsdWRlL2FjcGkvYWNleGNlcC5oCkBAIC0xNTMsOCArMTUzLDkgQEAKICNkZWZpbmUgQUVfQU1MX0NJUkNVTEFSX1JFRkVSRU5DRSAgICAgICAoYWNwaV9zdGF0dXMpICgweDAwMUUgfCBBRV9DT0RFX0FNTCkKICNkZWZpbmUgQUVfQU1MX0JBRF9SRVNPVVJDRV9MRU5HVEggICAgICAoYWNwaV9zdGF0dXMpICgweDAwMUYgfCBBRV9DT0RFX0FNTCkKICNkZWZpbmUgQUVfQU1MX0lMTEVHQUxfQUREUkVTUyAgICAgICAgICAoYWNwaV9zdGF0dXMpICgweDAwMjAgfCBBRV9DT0RFX0FNTCkKKyNkZWZpbmUgQUVfQU1MX0lORklOSVRFX0xPT1AgICAgICAgICAgICAoYWNwaV9zdGF0dXMpICgweDAwMjEgfCBBRV9DT0RFX0FNTCkKIAotI2RlZmluZSBBRV9DT0RFX0FNTF9NQVggICAgICAgICAgICAgICAgIDB4MDAyMAorI2RlZmluZSBBRV9DT0RFX0FNTF9NQVggICAgICAgICAgICAgICAgIDB4MDAyMQogCiAvKgogICogSW50ZXJuYWwgZXhjZXB0aW9ucyB1c2VkIGZvciBjb250cm9sCkBAIC0xNzUsNiArMTc2LDggQEAKIAogI2RlZmluZSBBRV9DT0RFX0NUUkxfTUFYICAgICAgICAgICAgICAgIDB4MDAwRAogCisvKiBFeGNlcHRpb24gc3RyaW5ncyBmb3IgYWNwaV9mb3JtYXRfZXhjZXB0aW9uICovCisKICNpZmRlZiBERUZJTkVfQUNQSV9HTE9CQUxTCiAKIC8qCkBAIC0yNjcsNiArMjcwLDcgQEAKIAkiQUVfQU1MX0NJUkNVTEFSX1JFRkVSRU5DRSIsCiAJIkFFX0FNTF9CQURfUkVTT1VSQ0VfTEVOR1RIIiwKIAkiQUVfQU1MX0lMTEVHQUxfQUREUkVTUyIsCisJIkFFX0FNTF9JTkZJTklURV9MT09QIgogfTsKIAogY2hhciBjb25zdCAqYWNwaV9nYmxfZXhjZXB0aW9uX25hbWVzX2N0cmxbXSA9IHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYWNwaS9hY2dsb2JhbC5oIGIvaW5jbHVkZS9hY3BpL2FjZ2xvYmFsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1ZGRhNDYuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hY3BpL2FjZ2xvYmFsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIE5hbWU6IGFjZ2xvYmFsLmggLSBEZWNsYXJhdGlvbnMgZm9yIGdsb2JhbCB2YXJpYWJsZXMKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA4LCBJbnRlbCBDb3JwLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAotICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgYXQgbWluaW11bSBhIGRpc2NsYWltZXIKLSAqICAgIHN1YnN0YW50aWFsbHkgc2ltaWxhciB0byB0aGUgIk5PIFdBUlJBTlRZIiBkaXNjbGFpbWVyIGJlbG93Ci0gKiAgICAoIkRpc2NsYWltZXIiKSBhbmQgYW55IHJlZGlzdHJpYnV0aW9uIG11c3QgYmUgY29uZGl0aW9uZWQgdXBvbgotICogICAgaW5jbHVkaW5nIGEgc3Vic3RhbnRpYWxseSBzaW1pbGFyIERpc2NsYWltZXIgcmVxdWlyZW1lbnQgZm9yIGZ1cnRoZXIKLSAqICAgIGJpbmFyeSByZWRpc3RyaWJ1dGlvbi4KLSAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcwotICogICAgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICogU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBOTyBXQVJSQU5UWQotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCi0gKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUwotICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcKLSAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQotICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgotICovCi0KLSNpZm5kZWYgX19BQ0dMT0JBTF9IX18KLSNkZWZpbmUgX19BQ0dMT0JBTF9IX18KLQotLyoKLSAqIEVuc3VyZSB0aGF0IHRoZSBnbG9iYWxzIGFyZSBhY3R1YWxseSBkZWZpbmVkIGFuZCBpbml0aWFsaXplZCBvbmx5IG9uY2UuCi0gKgotICogVGhlIHVzZSBvZiB0aGVzZSBtYWNyb3MgYWxsb3dzIGEgc2luZ2xlIGxpc3Qgb2YgZ2xvYmFscyAoaGVyZSkgaW4gb3JkZXIKLSAqIHRvIHNpbXBsaWZ5IG1haW50ZW5hbmNlIG9mIHRoZSBjb2RlLgotICovCi0jaWZkZWYgREVGSU5FX0FDUElfR0xPQkFMUwotI2RlZmluZSBBQ1BJX0VYVEVSTgotI2RlZmluZSBBQ1BJX0lOSVRfR0xPQkFMKGEsYikgYT1iCi0jZWxzZQotI2RlZmluZSBBQ1BJX0VYVEVSTiBleHRlcm4KLSNkZWZpbmUgQUNQSV9JTklUX0dMT0JBTChhLGIpIGEKLSNlbmRpZgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBSdW50aW1lIGNvbmZpZ3VyYXRpb24gKHN0YXRpYyBkZWZhdWx0cyB0aGF0IGNhbiBiZSBvdmVycmlkZW4gYXQgcnVudGltZSkKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoKLSAqIEVuYWJsZSAic2xhY2siIGluIHRoZSBBTUwgaW50ZXJwcmV0ZXI/ICBEZWZhdWx0IGlzIEZBTFNFLCBhbmQgdGhlCi0gKiBpbnRlcnByZXRlciBzdHJpY3RseSBmb2xsb3dzIHRoZSBBQ1BJIHNwZWNpZmljYXRpb24uICBTZXR0aW5nIHRvIFRSVUUKLSAqIGFsbG93cyB0aGUgaW50ZXJwcmV0ZXIgdG8gaWdub3JlIGNlcnRhaW4gZXJyb3JzIGFuZC9vciBiYWQgQU1MIGNvbnN0cnVjdHMuCi0gKgotICogQ3VycmVudGx5LCB0aGVzZSBmZWF0dXJlcyBhcmUgZW5hYmxlZCBieSB0aGlzIGZsYWc6Ci0gKgotICogMSkgQWxsb3cgImltcGxpY2l0IHJldHVybiIgb2YgbGFzdCB2YWx1ZSBpbiBhIGNvbnRyb2wgbWV0aG9kCi0gKiAyKSBBbGxvdyBhY2Nlc3MgYmV5b25kIHRoZSBlbmQgb2YgYW4gb3BlcmF0aW9uIHJlZ2lvbgotICogMykgQWxsb3cgYWNjZXNzIHRvIHVuaW5pdGlhbGl6ZWQgbG9jYWxzL2FyZ3MgKGF1dG8taW5pdCB0byBpbnRlZ2VyIDApCi0gKiA0KSBBbGxvdyBBTlkgb2JqZWN0IHR5cGUgdG8gYmUgYSBzb3VyY2Ugb3BlcmFuZCBmb3IgdGhlIFN0b3JlKCkgb3BlcmF0b3IKLSAqIDUpIEFsbG93IHVucmVzb2x2ZWQgcmVmZXJlbmNlcyAoaW52YWxpZCB0YXJnZXQgbmFtZSkgaW4gcGFja2FnZSBvYmplY3RzCi0gKiA2KSBFbmFibGUgd2FybmluZyBtZXNzYWdlcyBmb3IgYmVoYXZpb3IgdGhhdCBpcyBub3QgQUNQSSBzcGVjIGNvbXBsaWFudAotICovCi1BQ1BJX0VYVEVSTiB1OCBBQ1BJX0lOSVRfR0xPQkFMKGFjcGlfZ2JsX2VuYWJsZV9pbnRlcnByZXRlcl9zbGFjaywgRkFMU0UpOwotCi0vKgotICogQXV0b21hdGljYWxseSBzZXJpYWxpemUgQUxMIGNvbnRyb2wgbWV0aG9kcz8gRGVmYXVsdCBpcyBGQUxTRSwgbWVhbmluZwotICogdG8gdXNlIHRoZSBTZXJpYWxpemVkL25vdF9zZXJpYWxpemVkIG1ldGhvZCBmbGFncyBvbiBhIHBlciBtZXRob2QgYmFzaXMuCi0gKiBPbmx5IGNoYW5nZSB0aGlzIGlmIHRoZSBBU0wgY29kZSBpcyBwb29ybHkgd3JpdHRlbiBhbmQgY2Fubm90IGhhbmRsZQotICogcmVlbnRyYW5jeSBldmVuIHRob3VnaCBtZXRob2RzIGFyZSBtYXJrZWQgIk5vdFNlcmlhbGl6ZWQiLgotICovCi1BQ1BJX0VYVEVSTiB1OCBBQ1BJX0lOSVRfR0xPQkFMKGFjcGlfZ2JsX2FsbF9tZXRob2RzX3NlcmlhbGl6ZWQsIEZBTFNFKTsKLQotLyoKLSAqIENyZWF0ZSB0aGUgcHJlZGVmaW5lZCBfT1NJIG1ldGhvZCBpbiB0aGUgbmFtZXNwYWNlPyBEZWZhdWx0IGlzIFRSVUUKLSAqIGJlY2F1c2UgQUNQSSBDQSBpcyBmdWxseSBjb21wYXRpYmxlIHdpdGggb3RoZXIgQUNQSSBpbXBsZW1lbnRhdGlvbnMuCi0gKiBDaGFuZ2luZyB0aGlzIHdpbGwgcmV2ZXJ0IEFDUEkgQ0EgKGFuZCBtYWNoaW5lIEFTTCkgdG8gcHJlLU9TSSBiZWhhdmlvci4KLSAqLwotQUNQSV9FWFRFUk4gdTggQUNQSV9JTklUX0dMT0JBTChhY3BpX2dibF9jcmVhdGVfb3NpX21ldGhvZCwgVFJVRSk7Ci0KLS8qCi0gKiBEaXNhYmxlIHdha2V1cCBHUEVzIGR1cmluZyBydW50aW1lPyBEZWZhdWx0IGlzIFRSVUUgYmVjYXVzZSBXQUtFIGFuZAotICogUlVOVElNRSBHUEVzIHNob3VsZCBuZXZlciBiZSBzaGFyZWQsIGFuZCBXQUtFIEdQRXMgc2hvdWxkIHR5cGljYWxseSBvbmx5Ci0gKiBiZSBlbmFibGVkIGp1c3QgYmVmb3JlIGdvaW5nIHRvIHNsZWVwLgotICovCi1BQ1BJX0VYVEVSTiB1OCBBQ1BJX0lOSVRfR0xPQkFMKGFjcGlfZ2JsX2xlYXZlX3dha2VfZ3Blc19kaXNhYmxlZCwgVFJVRSk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIERlYnVnIHN1cHBvcnQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogUnVudGltZSBjb25maWd1cmF0aW9uIG9mIGRlYnVnIHByaW50IGxldmVscyAqLwotCi1leHRlcm4gdTMyIGFjcGlfZGJnX2xldmVsOwotZXh0ZXJuIHUzMiBhY3BpX2RiZ19sYXllcjsKLQotLyogUHJvY2VkdXJlIG5lc3RpbmcgbGV2ZWwgZm9yIGRlYnVnIG91dHB1dCAqLwotCi1leHRlcm4gdTMyIGFjcGlfZ2JsX25lc3RpbmdfbGV2ZWw7Ci0KLS8qIFN1cHBvcnQgZm9yIGR5bmFtaWMgY29udHJvbCBtZXRob2QgdHJhY2luZyBtZWNoYW5pc20gKi8KLQotQUNQSV9FWFRFUk4gdTMyIGFjcGlfZ2JsX29yaWdpbmFsX2RiZ19sZXZlbDsKLUFDUElfRVhURVJOIHUzMiBhY3BpX2dibF9vcmlnaW5hbF9kYmdfbGF5ZXI7Ci1BQ1BJX0VYVEVSTiBhY3BpX25hbWUgYWNwaV9nYmxfdHJhY2VfbWV0aG9kX25hbWU7Ci1BQ1BJX0VYVEVSTiB1MzIgYWNwaV9nYmxfdHJhY2VfZGJnX2xldmVsOwotQUNQSV9FWFRFUk4gdTMyIGFjcGlfZ2JsX3RyYWNlX2RiZ19sYXllcjsKLUFDUElfRVhURVJOIHUzMiBhY3BpX2dibF90cmFjZV9mbGFnczsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogQUNQSSBUYWJsZSBnbG9iYWxzCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qCi0gKiBhY3BpX2dibF9yb290X3RhYmxlX2xpc3QgaXMgdGhlIG1hc3RlciBsaXN0IG9mIEFDUEkgdGFibGVzIGZvdW5kIGluIHRoZQotICogUlNEVC9YU0RULgotICoKLSAqIGFjcGlfZ2JsX0ZBRFQgaXMgYSBsb2NhbCBjb3B5IG9mIHRoZSBGQURULCBjb252ZXJ0ZWQgdG8gYSBjb21tb24gZm9ybWF0LgotICovCi1BQ1BJX0VYVEVSTiBzdHJ1Y3QgYWNwaV9pbnRlcm5hbF9yc2R0IGFjcGlfZ2JsX3Jvb3RfdGFibGVfbGlzdDsKLUFDUElfRVhURVJOIHN0cnVjdCBhY3BpX3RhYmxlX2ZhZHQgYWNwaV9nYmxfRkFEVDsKLWV4dGVybiB1OCBhY3BpX2dibF9wZXJtYW5lbnRfbW1hcDsKLQotLyogVGhlc2UgYWRkcmVzc2VzIGFyZSBjYWxjdWxhdGVkIGZyb20gRkFEVCBhZGRyZXNzIHZhbHVlcyAqLwotCi1BQ1BJX0VYVEVSTiBzdHJ1Y3QgYWNwaV9nZW5lcmljX2FkZHJlc3MgYWNwaV9nYmxfeHBtMWFfZW5hYmxlOwotQUNQSV9FWFRFUk4gc3RydWN0IGFjcGlfZ2VuZXJpY19hZGRyZXNzIGFjcGlfZ2JsX3hwbTFiX2VuYWJsZTsKLQotLyoKLSAqIEhhbmRsZSBib3RoIEFDUEkgMS4wIGFuZCBBQ1BJIDIuMCBJbnRlZ2VyIHdpZHRocy4gVGhlIGludGVnZXIgd2lkdGggaXMKLSAqIGRldGVybWluZWQgYnkgdGhlIHJldmlzaW9uIG9mIHRoZSBEU0RUOiBJZiB0aGUgRFNEVCByZXZpc2lvbiBpcyBsZXNzIHRoYW4KLSAqIDIsIHVzZSBvbmx5IHRoZSBsb3dlciAzMiBiaXRzIG9mIHRoZSBpbnRlcm5hbCA2NC1iaXQgSW50ZWdlci4KLSAqLwotQUNQSV9FWFRFUk4gdTggYWNwaV9nYmxfaW50ZWdlcl9iaXRfd2lkdGg7Ci1BQ1BJX0VYVEVSTiB1OCBhY3BpX2dibF9pbnRlZ2VyX2J5dGVfd2lkdGg7Ci1BQ1BJX0VYVEVSTiB1OCBhY3BpX2dibF9pbnRlZ2VyX255YmJsZV93aWR0aDsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogTXV0dWFsIGV4bHVzaW9uIHdpdGhpbiBBQ1BJQ0Egc3Vic3lzdGVtCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qCi0gKiBQcmVkZWZpbmVkIG11dGV4IG9iamVjdHMuIFRoaXMgYXJyYXkgY29udGFpbnMgdGhlCi0gKiBhY3R1YWwgT1MgbXV0ZXggaGFuZGxlcywgaW5kZXhlZCBieSB0aGUgbG9jYWwgQUNQSV9NVVRFWF9IQU5ETEVzLgotICogKFRoZSB0YWJsZSBtYXBzIGxvY2FsIGhhbmRsZXMgdG8gdGhlIHJlYWwgT1MgaGFuZGxlcykKLSAqLwotQUNQSV9FWFRFUk4gc3RydWN0IGFjcGlfbXV0ZXhfaW5mbyBhY3BpX2dibF9tdXRleF9pbmZvW0FDUElfTlVNX01VVEVYXTsKLQotLyoKLSAqIEdsb2JhbCBsb2NrIG11dGV4IGlzIGFuIGFjdHVhbCBBTUwgbXV0ZXggb2JqZWN0Ci0gKiBHbG9iYWwgbG9jayBzZW1hcGhvcmUgd29ya3MgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgSFcgZ2xvYmFsIGxvY2sKLSAqLwotQUNQSV9FWFRFUk4gdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqYWNwaV9nYmxfZ2xvYmFsX2xvY2tfbXV0ZXg7Ci1BQ1BJX0VYVEVSTiBhY3BpX3NlbWFwaG9yZSBhY3BpX2dibF9nbG9iYWxfbG9ja19zZW1hcGhvcmU7Ci1BQ1BJX0VYVEVSTiB1MTYgYWNwaV9nYmxfZ2xvYmFsX2xvY2tfaGFuZGxlOwotQUNQSV9FWFRFUk4gdTggYWNwaV9nYmxfZ2xvYmFsX2xvY2tfYWNxdWlyZWQ7Ci1BQ1BJX0VYVEVSTiB1OCBhY3BpX2dibF9nbG9iYWxfbG9ja19wcmVzZW50OwotCi0vKgotICogU3BpbmxvY2tzIGFyZSB1c2VkIGZvciBpbnRlcmZhY2VzIHRoYXQgY2FuIGJlIHBvc3NpYmx5IGNhbGxlZCBhdAotICogaW50ZXJydXB0IGxldmVsCi0gKi8KLUFDUElfRVhURVJOIHNwaW5sb2NrX3QgX2FjcGlfZ2JsX2dwZV9sb2NrOwkvKiBGb3IgR1BFIGRhdGEgc3RydWN0cyBhbmQgcmVnaXN0ZXJzICovCi1BQ1BJX0VYVEVSTiBzcGlubG9ja190IF9hY3BpX2dibF9oYXJkd2FyZV9sb2NrOwkvKiBGb3IgQUNQSSBIL1cgZXhjZXB0IEdQRSByZWdpc3RlcnMgKi8KLSNkZWZpbmUgYWNwaV9nYmxfZ3BlX2xvY2sJJl9hY3BpX2dibF9ncGVfbG9jawotI2RlZmluZSBhY3BpX2dibF9oYXJkd2FyZV9sb2NrCSZfYWNwaV9nYmxfaGFyZHdhcmVfbG9jawotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBNaXNjZWxsYW5lb3VzIGdsb2JhbHMKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmZGVmIEFDUElfREJHX1RSQUNLX0FMTE9DQVRJT05TCi0KLS8qIExpc3RzIGZvciB0cmFja2luZyBtZW1vcnkgYWxsb2NhdGlvbnMgKi8KLQotQUNQSV9FWFRFUk4gc3RydWN0IGFjcGlfbWVtb3J5X2xpc3QgKmFjcGlfZ2JsX2dsb2JhbF9saXN0OwotQUNQSV9FWFRFUk4gc3RydWN0IGFjcGlfbWVtb3J5X2xpc3QgKmFjcGlfZ2JsX25zX25vZGVfbGlzdDsKLUFDUElfRVhURVJOIHU4IGFjcGlfZ2JsX2Rpc3BsYXlfZmluYWxfbWVtX3N0YXRzOwotI2VuZGlmCi0KLS8qIE9iamVjdCBjYWNoZXMgKi8KLQotQUNQSV9FWFRFUk4gYWNwaV9jYWNoZV90ICphY3BpX2dibF9uYW1lc3BhY2VfY2FjaGU7Ci1BQ1BJX0VYVEVSTiBhY3BpX2NhY2hlX3QgKmFjcGlfZ2JsX3N0YXRlX2NhY2hlOwotQUNQSV9FWFRFUk4gYWNwaV9jYWNoZV90ICphY3BpX2dibF9wc19ub2RlX2NhY2hlOwotQUNQSV9FWFRFUk4gYWNwaV9jYWNoZV90ICphY3BpX2dibF9wc19ub2RlX2V4dF9jYWNoZTsKLUFDUElfRVhURVJOIGFjcGlfY2FjaGVfdCAqYWNwaV9nYmxfb3BlcmFuZF9jYWNoZTsKLQotLyogR2xvYmFsIGhhbmRsZXJzICovCi0KLUFDUElfRVhURVJOIHN0cnVjdCBhY3BpX29iamVjdF9ub3RpZnlfaGFuZGxlciBhY3BpX2dibF9kZXZpY2Vfbm90aWZ5OwotQUNQSV9FWFRFUk4gc3RydWN0IGFjcGlfb2JqZWN0X25vdGlmeV9oYW5kbGVyIGFjcGlfZ2JsX3N5c3RlbV9ub3RpZnk7Ci1BQ1BJX0VYVEVSTiBhY3BpX2V4Y2VwdGlvbl9oYW5kbGVyIGFjcGlfZ2JsX2V4Y2VwdGlvbl9oYW5kbGVyOwotQUNQSV9FWFRFUk4gYWNwaV9pbml0X2hhbmRsZXIgYWNwaV9nYmxfaW5pdF9oYW5kbGVyOwotQUNQSV9FWFRFUk4gYWNwaV90YmxfaGFuZGxlciBhY3BpX2dibF90YWJsZV9oYW5kbGVyOwotQUNQSV9FWFRFUk4gdm9pZCAqYWNwaV9nYmxfdGFibGVfaGFuZGxlcl9jb250ZXh0OwotQUNQSV9FWFRFUk4gc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqYWNwaV9nYmxfYnJlYWtwb2ludF93YWxrOwotCi0vKiBPd25lciBJRCBzdXBwb3J0ICovCi0KLUFDUElfRVhURVJOIHUzMiBhY3BpX2dibF9vd25lcl9pZF9tYXNrW0FDUElfTlVNX09XTkVSSURfTUFTS1NdOwotQUNQSV9FWFRFUk4gdTggYWNwaV9nYmxfbGFzdF9vd25lcl9pZF9pbmRleDsKLUFDUElfRVhURVJOIHU4IGFjcGlfZ2JsX25leHRfb3duZXJfaWRfb2Zmc2V0OwotCi0vKiBNaXNjICovCi0KLUFDUElfRVhURVJOIHUzMiBhY3BpX2dibF9vcmlnaW5hbF9tb2RlOwotQUNQSV9FWFRFUk4gdTMyIGFjcGlfZ2JsX3JzZHBfb3JpZ2luYWxfbG9jYXRpb247Ci1BQ1BJX0VYVEVSTiB1MzIgYWNwaV9nYmxfbnNfbG9va3VwX2NvdW50OwotQUNQSV9FWFRFUk4gdTMyIGFjcGlfZ2JsX3BzX2ZpbmRfY291bnQ7Ci1BQ1BJX0VYVEVSTiB1MTYgYWNwaV9nYmxfcG0xX2VuYWJsZV9yZWdpc3Rlcl9zYXZlOwotQUNQSV9FWFRFUk4gdTggYWNwaV9nYmxfZGVidWdnZXJfY29uZmlndXJhdGlvbjsKLUFDUElfRVhURVJOIHU4IGFjcGlfZ2JsX3N0ZXBfdG9fbmV4dF9jYWxsOwotQUNQSV9FWFRFUk4gdTggYWNwaV9nYmxfYWNwaV9oYXJkd2FyZV9wcmVzZW50OwotQUNQSV9FWFRFUk4gdTggYWNwaV9nYmxfZXZlbnRzX2luaXRpYWxpemVkOwotQUNQSV9FWFRFUk4gdTggYWNwaV9nYmxfc3lzdGVtX2F3YWtlX2FuZF9ydW5uaW5nOwotCi0jaWZuZGVmIERFRklORV9BQ1BJX0dMT0JBTFMKLQotLyogT3RoZXIgbWlzY2VsbGFuZW91cyAqLwotCi1leHRlcm4gdTggYWNwaV9nYmxfc2h1dGRvd247Ci1leHRlcm4gdTMyIGFjcGlfZ2JsX3N0YXJ0dXBfZmxhZ3M7Ci1leHRlcm4gY29uc3QgY2hhciAqYWNwaV9nYmxfc2xlZXBfc3RhdGVfbmFtZXNbQUNQSV9TX1NUQVRFX0NPVU5UXTsKLWV4dGVybiBjb25zdCBjaGFyICphY3BpX2dibF9oaWdoZXN0X2RzdGF0ZV9uYW1lc1s0XTsKLWV4dGVybiBjb25zdCBzdHJ1Y3QgYWNwaV9vcGNvZGVfaW5mbyBhY3BpX2dibF9hbWxfb3BfaW5mb1tBTUxfTlVNX09QQ09ERVNdOwotZXh0ZXJuIGNvbnN0IGNoYXIgKmFjcGlfZ2JsX3JlZ2lvbl90eXBlc1tBQ1BJX05VTV9QUkVERUZJTkVEX1JFR0lPTlNdOwotCi0jZW5kaWYKLQotLyogRXhjZXB0aW9uIGNvZGVzICovCi0KLWV4dGVybiBjaGFyIGNvbnN0ICphY3BpX2dibF9leGNlcHRpb25fbmFtZXNfZW52W107Ci1leHRlcm4gY2hhciBjb25zdCAqYWNwaV9nYmxfZXhjZXB0aW9uX25hbWVzX3BnbVtdOwotZXh0ZXJuIGNoYXIgY29uc3QgKmFjcGlfZ2JsX2V4Y2VwdGlvbl9uYW1lc190YmxbXTsKLWV4dGVybiBjaGFyIGNvbnN0ICphY3BpX2dibF9leGNlcHRpb25fbmFtZXNfYW1sW107Ci1leHRlcm4gY2hhciBjb25zdCAqYWNwaV9nYmxfZXhjZXB0aW9uX25hbWVzX2N0cmxbXTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogTmFtZXNwYWNlIGdsb2JhbHMKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmICFkZWZpbmVkIChBQ1BJX05PX01FVEhPRF9FWEVDVVRJT04pIHx8IGRlZmluZWQgKEFDUElfQ09OU1RBTlRfRVZBTF9PTkxZKQotI2RlZmluZSBOVU1fUFJFREVGSU5FRF9OQU1FUyAgICAgICAgICAgIDEwCi0jZWxzZQotI2RlZmluZSBOVU1fUFJFREVGSU5FRF9OQU1FUyAgICAgICAgICAgIDkKLSNlbmRpZgotCi1BQ1BJX0VYVEVSTiBzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSBhY3BpX2dibF9yb290X25vZGVfc3RydWN0OwotQUNQSV9FWFRFUk4gc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKmFjcGlfZ2JsX3Jvb3Rfbm9kZTsKLUFDUElfRVhURVJOIHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICphY3BpX2dibF9mYWR0X2dwZV9kZXZpY2U7Ci0KLWV4dGVybiBjb25zdCB1OCBhY3BpX2dibF9uc19wcm9wZXJ0aWVzW0FDUElfTlVNX05TX1RZUEVTXTsKLWV4dGVybiBjb25zdCBzdHJ1Y3QgYWNwaV9wcmVkZWZpbmVkX25hbWVzCi0gICAgYWNwaV9nYmxfcHJlX2RlZmluZWRfbmFtZXNbTlVNX1BSRURFRklORURfTkFNRVNdOwotCi0jaWZkZWYgQUNQSV9ERUJVR19PVVRQVVQKLUFDUElfRVhURVJOIHUzMiBhY3BpX2dibF9jdXJyZW50X25vZGVfY291bnQ7Ci1BQ1BJX0VYVEVSTiB1MzIgYWNwaV9nYmxfY3VycmVudF9ub2RlX3NpemU7Ci1BQ1BJX0VYVEVSTiB1MzIgYWNwaV9nYmxfbWF4X2NvbmN1cnJlbnRfbm9kZV9jb3VudDsKLUFDUElfRVhURVJOIGFjcGlfc2l6ZSAqYWNwaV9nYmxfZW50cnlfc3RhY2tfcG9pbnRlcjsKLUFDUElfRVhURVJOIGFjcGlfc2l6ZSAqYWNwaV9nYmxfbG93ZXN0X3N0YWNrX3BvaW50ZXI7Ci1BQ1BJX0VYVEVSTiB1MzIgYWNwaV9nYmxfZGVlcGVzdF9uZXN0aW5nOwotI2VuZGlmCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEludGVycHJldGVyIGdsb2JhbHMKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotQUNQSV9FWFRFUk4gc3RydWN0IGFjcGlfdGhyZWFkX3N0YXRlICphY3BpX2dibF9jdXJyZW50X3dhbGtfbGlzdDsKLQotLyogQ29udHJvbCBtZXRob2Qgc2luZ2xlIHN0ZXAgZmxhZyAqLwotCi1BQ1BJX0VYVEVSTiB1OCBhY3BpX2dibF9jbV9zaW5nbGVfc3RlcDsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogSGFyZHdhcmUgZ2xvYmFscwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1leHRlcm4gc3RydWN0IGFjcGlfYml0X3JlZ2lzdGVyX2luZm8KLSAgICBhY3BpX2dibF9iaXRfcmVnaXN0ZXJfaW5mb1tBQ1BJX05VTV9CSVRSRUddOwotQUNQSV9FWFRFUk4gdTggYWNwaV9nYmxfc2xlZXBfdHlwZV9hOwotQUNQSV9FWFRFUk4gdTggYWNwaV9nYmxfc2xlZXBfdHlwZV9iOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBFdmVudCBhbmQgR1BFIGdsb2JhbHMKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotZXh0ZXJuIHN0cnVjdCBhY3BpX2ZpeGVkX2V2ZW50X2luZm8KLSAgICBhY3BpX2dibF9maXhlZF9ldmVudF9pbmZvW0FDUElfTlVNX0ZJWEVEX0VWRU5UU107Ci1BQ1BJX0VYVEVSTiBzdHJ1Y3QgYWNwaV9maXhlZF9ldmVudF9oYW5kbGVyCi0gICAgYWNwaV9nYmxfZml4ZWRfZXZlbnRfaGFuZGxlcnNbQUNQSV9OVU1fRklYRURfRVZFTlRTXTsKLUFDUElfRVhURVJOIHN0cnVjdCBhY3BpX2dwZV94cnVwdF9pbmZvICphY3BpX2dibF9ncGVfeHJ1cHRfbGlzdF9oZWFkOwotQUNQSV9FWFRFUk4gc3RydWN0IGFjcGlfZ3BlX2Jsb2NrX2luZm8KLSphY3BpX2dibF9ncGVfZmFkdF9ibG9ja3NbQUNQSV9NQVhfR1BFX0JMT0NLU107Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIERlYnVnZ2VyIGdsb2JhbHMKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotQUNQSV9FWFRFUk4gdTggYWNwaV9nYmxfZGJfb3V0cHV0X2ZsYWdzOwotCi0jaWZkZWYgQUNQSV9ESVNBU1NFTUJMRVIKLQotQUNQSV9FWFRFUk4gdTggYWNwaV9nYmxfZGJfb3B0X2Rpc2FzbTsKLUFDUElfRVhURVJOIHU4IGFjcGlfZ2JsX2RiX29wdF92ZXJib3NlOwotI2VuZGlmCi0KLSNpZmRlZiBBQ1BJX0RFQlVHR0VSCi0KLWV4dGVybiB1OCBhY3BpX2dibF9tZXRob2RfZXhlY3V0aW5nOwotZXh0ZXJuIHU4IGFjcGlfZ2JsX2Fib3J0X21ldGhvZDsKLWV4dGVybiB1OCBhY3BpX2dibF9kYl90ZXJtaW5hdGVfdGhyZWFkczsKLQotQUNQSV9FWFRFUk4gaW50IG9wdGluZDsKLUFDUElfRVhURVJOIGNoYXIgKm9wdGFyZzsKLQotQUNQSV9FWFRFUk4gdTggYWNwaV9nYmxfZGJfb3B0X3RhYmxlczsKLUFDUElfRVhURVJOIHU4IGFjcGlfZ2JsX2RiX29wdF9zdGF0czsKLUFDUElfRVhURVJOIHU4IGFjcGlfZ2JsX2RiX29wdF9pbmlfbWV0aG9kczsKLQotQUNQSV9FWFRFUk4gY2hhciAqYWNwaV9nYmxfZGJfYXJnc1tBQ1BJX0RFQlVHR0VSX01BWF9BUkdTXTsKLUFDUElfRVhURVJOIGNoYXIgYWNwaV9nYmxfZGJfbGluZV9idWZbODBdOwotQUNQSV9FWFRFUk4gY2hhciBhY3BpX2dibF9kYl9wYXJzZWRfYnVmWzgwXTsKLUFDUElfRVhURVJOIGNoYXIgYWNwaV9nYmxfZGJfc2NvcGVfYnVmWzQwXTsKLUFDUElfRVhURVJOIGNoYXIgYWNwaV9nYmxfZGJfZGVidWdfZmlsZW5hbWVbNDBdOwotQUNQSV9FWFRFUk4gdTggYWNwaV9nYmxfZGJfb3V0cHV0X3RvX2ZpbGU7Ci1BQ1BJX0VYVEVSTiBjaGFyICphY3BpX2dibF9kYl9idWZmZXI7Ci1BQ1BJX0VYVEVSTiBjaGFyICphY3BpX2dibF9kYl9maWxlbmFtZTsKLUFDUElfRVhURVJOIHUzMiBhY3BpX2dibF9kYl9kZWJ1Z19sZXZlbDsKLUFDUElfRVhURVJOIHUzMiBhY3BpX2dibF9kYl9jb25zb2xlX2RlYnVnX2xldmVsOwotQUNQSV9FWFRFUk4gc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICphY3BpX2dibF9kYl90YWJsZV9wdHI7Ci1BQ1BJX0VYVEVSTiBzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqYWNwaV9nYmxfZGJfc2NvcGVfbm9kZTsKLQotLyoKLSAqIFN0YXRpc3RpYyBnbG9iYWxzCi0gKi8KLUFDUElfRVhURVJOIHUxNiBhY3BpX2dibF9vYmpfdHlwZV9jb3VudFtBQ1BJX1RZUEVfTlNfTk9ERV9NQVggKyAxXTsKLUFDUElfRVhURVJOIHUxNiBhY3BpX2dibF9ub2RlX3R5cGVfY291bnRbQUNQSV9UWVBFX05TX05PREVfTUFYICsgMV07Ci1BQ1BJX0VYVEVSTiB1MTYgYWNwaV9nYmxfb2JqX3R5cGVfY291bnRfbWlzYzsKLUFDUElfRVhURVJOIHUxNiBhY3BpX2dibF9ub2RlX3R5cGVfY291bnRfbWlzYzsKLUFDUElfRVhURVJOIHUzMiBhY3BpX2dibF9udW1fbm9kZXM7Ci1BQ1BJX0VYVEVSTiB1MzIgYWNwaV9nYmxfbnVtX29iamVjdHM7Ci0KLUFDUElfRVhURVJOIHUzMiBhY3BpX2dibF9zaXplX29mX3BhcnNlX3RyZWU7Ci1BQ1BJX0VYVEVSTiB1MzIgYWNwaV9nYmxfc2l6ZV9vZl9tZXRob2RfdHJlZXM7Ci1BQ1BJX0VYVEVSTiB1MzIgYWNwaV9nYmxfc2l6ZV9vZl9ub2RlX2VudHJpZXM7Ci1BQ1BJX0VYVEVSTiB1MzIgYWNwaV9nYmxfc2l6ZV9vZl9hY3BpX29iamVjdHM7Ci0KLSNlbmRpZgkJCQkvKiBBQ1BJX0RFQlVHR0VSICovCi0KLSNlbmRpZgkJCQkvKiBfX0FDR0xPQkFMX0hfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL2FjaHdhcmUuaCBiL2luY2x1ZGUvYWNwaS9hY2h3YXJlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3YTcyYjEuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hY3BpL2FjaHdhcmUuaAorKysgL2Rldi9udWxsCkBAIC0xLDEzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogTmFtZTogYWNod2FyZS5oIC0tIGhhcmR3YXJlIHNwZWNpZmljIGludGVyZmFjZXMKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA4LCBJbnRlbCBDb3JwLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAotICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgYXQgbWluaW11bSBhIGRpc2NsYWltZXIKLSAqICAgIHN1YnN0YW50aWFsbHkgc2ltaWxhciB0byB0aGUgIk5PIFdBUlJBTlRZIiBkaXNjbGFpbWVyIGJlbG93Ci0gKiAgICAoIkRpc2NsYWltZXIiKSBhbmQgYW55IHJlZGlzdHJpYnV0aW9uIG11c3QgYmUgY29uZGl0aW9uZWQgdXBvbgotICogICAgaW5jbHVkaW5nIGEgc3Vic3RhbnRpYWxseSBzaW1pbGFyIERpc2NsYWltZXIgcmVxdWlyZW1lbnQgZm9yIGZ1cnRoZXIKLSAqICAgIGJpbmFyeSByZWRpc3RyaWJ1dGlvbi4KLSAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcwotICogICAgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICogU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBOTyBXQVJSQU5UWQotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCi0gKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUwotICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcKLSAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQotICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgotICovCi0KLSNpZm5kZWYgX19BQ0hXQVJFX0hfXwotI2RlZmluZSBfX0FDSFdBUkVfSF9fCi0KLS8qIFBNIFRpbWVyIHRpY2tzIHBlciBzZWNvbmQgKEhaKSAqLwotCi0jZGVmaW5lIFBNX1RJTUVSX0ZSRVFVRU5DWSAgMzU3OTU0NQotCi0vKiBWYWx1ZXMgZm9yIHRoZSBfU1NUIHJlc2VydmVkIG1ldGhvZCAqLwotCi0jZGVmaW5lIEFDUElfU1NUX0lORElDQVRPUl9PRkYgIDAKLSNkZWZpbmUgQUNQSV9TU1RfV09SS0lORyAgICAgICAgMQotI2RlZmluZSBBQ1BJX1NTVF9XQUtJTkcgICAgICAgICAyCi0jZGVmaW5lIEFDUElfU1NUX1NMRUVQSU5HICAgICAgIDMKLSNkZWZpbmUgQUNQSV9TU1RfU0xFRVBfQ09OVEVYVCAgNAotCi0vKiBQcm90b3R5cGVzICovCi0KLS8qCi0gKiBod2FjcGkgLSBoaWdoIGxldmVsIGZ1bmN0aW9ucwotICovCi1hY3BpX3N0YXR1cyBhY3BpX2h3X3NldF9tb2RlKHUzMiBtb2RlKTsKLQotdTMyIGFjcGlfaHdfZ2V0X21vZGUodm9pZCk7Ci0KLS8qCi0gKiBod3JlZ3MgLSBBQ1BJIFJlZ2lzdGVyIEkvTwotICovCi1zdHJ1Y3QgYWNwaV9iaXRfcmVnaXN0ZXJfaW5mbyAqYWNwaV9od19nZXRfYml0X3JlZ2lzdGVyX2luZm8odTMyIHJlZ2lzdGVyX2lkKTsKLQotYWNwaV9zdGF0dXMKLWFjcGlfaHdfcmVnaXN0ZXJfcmVhZCh1MzIgcmVnaXN0ZXJfaWQsIHUzMiAqIHJldHVybl92YWx1ZSk7Ci0KLWFjcGlfc3RhdHVzIGFjcGlfaHdfcmVnaXN0ZXJfd3JpdGUodTMyIHJlZ2lzdGVyX2lkLCB1MzIgdmFsdWUpOwotCi1hY3BpX3N0YXR1cwotYWNwaV9od19sb3dfbGV2ZWxfcmVhZCh1MzIgd2lkdGgsCi0JCSAgICAgICB1MzIgKiB2YWx1ZSwgc3RydWN0IGFjcGlfZ2VuZXJpY19hZGRyZXNzICpyZWcpOwotCi1hY3BpX3N0YXR1cwotYWNwaV9od19sb3dfbGV2ZWxfd3JpdGUodTMyIHdpZHRoLCB1MzIgdmFsdWUsIHN0cnVjdCBhY3BpX2dlbmVyaWNfYWRkcmVzcyAqcmVnKTsKLQotYWNwaV9zdGF0dXMgYWNwaV9od19jbGVhcl9hY3BpX3N0YXR1cyh2b2lkKTsKLQotLyoKLSAqIGh3Z3BlIC0gR1BFIHN1cHBvcnQKLSAqLwotYWNwaV9zdGF0dXMgYWNwaV9od19sb3dfZGlzYWJsZV9ncGUoc3RydWN0IGFjcGlfZ3BlX2V2ZW50X2luZm8gKmdwZV9ldmVudF9pbmZvKTsKLQotYWNwaV9zdGF0dXMKLWFjcGlfaHdfd3JpdGVfZ3BlX2VuYWJsZV9yZWcoc3RydWN0IGFjcGlfZ3BlX2V2ZW50X2luZm8gKmdwZV9ldmVudF9pbmZvKTsKLQotYWNwaV9zdGF0dXMKLWFjcGlfaHdfZGlzYWJsZV9ncGVfYmxvY2soc3RydWN0IGFjcGlfZ3BlX3hydXB0X2luZm8gKmdwZV94cnVwdF9pbmZvLAotCQkJICBzdHJ1Y3QgYWNwaV9ncGVfYmxvY2tfaW5mbyAqZ3BlX2Jsb2NrKTsKLQotYWNwaV9zdGF0dXMgYWNwaV9od19jbGVhcl9ncGUoc3RydWN0IGFjcGlfZ3BlX2V2ZW50X2luZm8gKmdwZV9ldmVudF9pbmZvKTsKLQotYWNwaV9zdGF0dXMKLWFjcGlfaHdfY2xlYXJfZ3BlX2Jsb2NrKHN0cnVjdCBhY3BpX2dwZV94cnVwdF9pbmZvICpncGVfeHJ1cHRfaW5mbywKLQkJCXN0cnVjdCBhY3BpX2dwZV9ibG9ja19pbmZvICpncGVfYmxvY2spOwotCi1hY3BpX3N0YXR1cwotYWNwaV9od19nZXRfZ3BlX3N0YXR1cyhzdHJ1Y3QgYWNwaV9ncGVfZXZlbnRfaW5mbyAqZ3BlX2V2ZW50X2luZm8sCi0JCSAgICAgICBhY3BpX2V2ZW50X3N0YXR1cyAqIGV2ZW50X3N0YXR1cyk7Ci0KLWFjcGlfc3RhdHVzIGFjcGlfaHdfZGlzYWJsZV9hbGxfZ3Blcyh2b2lkKTsKLQotYWNwaV9zdGF0dXMgYWNwaV9od19lbmFibGVfYWxsX3J1bnRpbWVfZ3Blcyh2b2lkKTsKLQotYWNwaV9zdGF0dXMgYWNwaV9od19lbmFibGVfYWxsX3dha2V1cF9ncGVzKHZvaWQpOwotCi1hY3BpX3N0YXR1cwotYWNwaV9od19lbmFibGVfcnVudGltZV9ncGVfYmxvY2soc3RydWN0IGFjcGlfZ3BlX3hydXB0X2luZm8gKmdwZV94cnVwdF9pbmZvLAotCQkJCSBzdHJ1Y3QgYWNwaV9ncGVfYmxvY2tfaW5mbyAqZ3BlX2Jsb2NrKTsKLQotI2lmZGVmCUFDUElfRlVUVVJFX1VTQUdFCi0vKgotICogaHd0aW1lciAtIEFDUEkgVGltZXIgcHJvdG90eXBlcwotICovCi1hY3BpX3N0YXR1cyBhY3BpX2dldF90aW1lcl9yZXNvbHV0aW9uKHUzMiAqIHJlc29sdXRpb24pOwotCi1hY3BpX3N0YXR1cyBhY3BpX2dldF90aW1lcih1MzIgKiB0aWNrcyk7Ci0KLWFjcGlfc3RhdHVzCi1hY3BpX2dldF90aW1lcl9kdXJhdGlvbih1MzIgc3RhcnRfdGlja3MsIHUzMiBlbmRfdGlja3MsIHUzMiAqIHRpbWVfZWxhcHNlZCk7Ci0jZW5kaWYJCQkJLyogQUNQSV9GVVRVUkVfVVNBR0UgKi8KLQotI2VuZGlmCQkJCS8qIF9fQUNIV0FSRV9IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYWNwaS9hY2xvY2FsLmggYi9pbmNsdWRlL2FjcGkvYWNsb2NhbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlY2FiNTI3Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYWNwaS9hY2xvY2FsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBOYW1lOiBhY2xvY2FsLmggLSBJbnRlcm5hbCBkYXRhIHR5cGVzIHVzZWQgYWNyb3NzIHRoZSBBQ1BJIHN1YnN5c3RlbQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDgsIEludGVsIENvcnAuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCi0gKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSBhdCBtaW5pbXVtIGEgZGlzY2xhaW1lcgotICogICAgc3Vic3RhbnRpYWxseSBzaW1pbGFyIHRvIHRoZSAiTk8gV0FSUkFOVFkiIGRpc2NsYWltZXIgYmVsb3cKLSAqICAgICgiRGlzY2xhaW1lciIpIGFuZCBhbnkgcmVkaXN0cmlidXRpb24gbXVzdCBiZSBjb25kaXRpb25lZCB1cG9uCi0gKiAgICBpbmNsdWRpbmcgYSBzdWJzdGFudGlhbGx5IHNpbWlsYXIgRGlzY2xhaW1lciByZXF1aXJlbWVudCBmb3IgZnVydGhlcgotICogICAgYmluYXJ5IHJlZGlzdHJpYnV0aW9uLgotICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzCi0gKiAgICBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIE5PIFdBUlJBTlRZCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKLSAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCi0gKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORwotICogSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCi0gKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCi0gKi8KLQotI2lmbmRlZiBfX0FDTE9DQUxfSF9fCi0jZGVmaW5lIF9fQUNMT0NBTF9IX18KLQotLyogYWNwaXNyYzpzdHJ1Y3RfZGVmcyAtLSBmb3IgYWNwaXNyYyBjb252ZXJzaW9uICovCi0KLSNkZWZpbmUgQUNQSV9XQUlUX0ZPUkVWRVIgICAgICAgICAgICAgICAweEZGRkYJLyogdTE2LCBhcyBwZXIgQUNQSSBzcGVjICovCi0jZGVmaW5lIEFDUElfRE9fTk9UX1dBSVQgICAgICAgICAgICAgICAgMAotI2RlZmluZSBBQ1BJX1NFUklBTElaRUQgICAgICAgICAgICAgICAgIDB4RkYKLQotdHlwZWRlZiB1MzIgYWNwaV9tdXRleF9oYW5kbGU7Ci0jZGVmaW5lIEFDUElfR0xPQkFMX0xPQ0sgICAgICAgICAgICAgICAgKGFjcGlfc2VtYXBob3JlKSAoLTEpCi0KLS8qIFRvdGFsIG51bWJlciBvZiBhbWwgb3Bjb2RlcyBkZWZpbmVkICovCi0KLSNkZWZpbmUgQU1MX05VTV9PUENPREVTICAgICAgICAgICAgICAgICAweDdGCi0KLS8qIEZvcndhcmQgZGVjbGFyYXRpb25zICovCi0KLXN0cnVjdCBhY3BpX3dhbGtfc3RhdGU7Ci1zdHJ1Y3QgYWNwaV9vYmpfbXV0ZXg7Ci11bmlvbiBhY3BpX3BhcnNlX29iamVjdDsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogTXV0ZXggdHlwZWRlZnMgYW5kIHN0cnVjdHMKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoKLSAqIFByZWRlZmluZWQgaGFuZGxlcyBmb3IgdGhlIG11dGV4IG9iamVjdHMgdXNlZCB3aXRoaW4gdGhlIHN1YnN5c3RlbQotICogQWxsIG11dGV4IG9iamVjdHMgYXJlIGF1dG9tYXRpY2FsbHkgY3JlYXRlZCBieSBhY3BpX3V0X211dGV4X2luaXRpYWxpemUuCi0gKgotICogVGhlIGFjcXVpcmUvcmVsZWFzZSBvcmRlcmluZyBwcm90b2NvbCBpcyBpbXBsaWVkIHZpYSB0aGlzIGxpc3QuIE11dGV4ZXMKLSAqIHdpdGggYSBsb3dlciB2YWx1ZSBtdXN0IGJlIGFjcXVpcmVkIGJlZm9yZSBtdXRleGVzIHdpdGggYSBoaWdoZXIgdmFsdWUuCi0gKgotICogTk9URTogYW55IGNoYW5nZXMgaGVyZSBtdXN0IGJlIHJlZmxlY3RlZCBpbiB0aGUgYWNwaV9nYmxfbXV0ZXhfbmFtZXMKLSAqIHRhYmxlIGJlbG93IGFsc28hCi0gKi8KLSNkZWZpbmUgQUNQSV9NVFhfSU5URVJQUkVURVIgICAgICAgICAgICAwCS8qIEFNTCBJbnRlcnByZXRlciwgbWFpbiBsb2NrICovCi0jZGVmaW5lIEFDUElfTVRYX05BTUVTUEFDRSAgICAgICAgICAgICAgMQkvKiBBQ1BJIE5hbWVzcGFjZSAqLwotI2RlZmluZSBBQ1BJX01UWF9UQUJMRVMgICAgICAgICAgICAgICAgIDIJLyogRGF0YSBmb3IgQUNQSSB0YWJsZXMgKi8KLSNkZWZpbmUgQUNQSV9NVFhfRVZFTlRTICAgICAgICAgICAgICAgICAzCS8qIERhdGEgZm9yIEFDUEkgZXZlbnRzICovCi0jZGVmaW5lIEFDUElfTVRYX0NBQ0hFUyAgICAgICAgICAgICAgICAgNAkvKiBJbnRlcm5hbCBjYWNoZXMsIGdlbmVyYWwgcHVycG9zZXMgKi8KLSNkZWZpbmUgQUNQSV9NVFhfTUVNT1JZICAgICAgICAgICAgICAgICA1CS8qIERlYnVnIG1lbW9yeSB0cmFja2luZyBsaXN0cyAqLwotI2RlZmluZSBBQ1BJX01UWF9ERUJVR19DTURfQ09NUExFVEUgICAgIDYJLyogQU1MIGRlYnVnZ2VyICovCi0jZGVmaW5lIEFDUElfTVRYX0RFQlVHX0NNRF9SRUFEWSAgICAgICAgNwkvKiBBTUwgZGVidWdnZXIgKi8KLQotI2RlZmluZSBBQ1BJX01BWF9NVVRFWCAgICAgICAgICAgICAgICAgIDcKLSNkZWZpbmUgQUNQSV9OVU1fTVVURVggICAgICAgICAgICAgICAgICBBQ1BJX01BWF9NVVRFWCsxCi0KLSNpZiBkZWZpbmVkKEFDUElfREVCVUdfT1VUUFVUKSB8fCBkZWZpbmVkKEFDUElfREVCVUdHRVIpCi0jaWZkZWYgREVGSU5FX0FDUElfR0xPQkFMUwotCi0vKiBEZWJ1ZyBuYW1lcyBmb3IgdGhlIG11dGV4ZXMgYWJvdmUgKi8KLQotc3RhdGljIGNoYXIgKmFjcGlfZ2JsX211dGV4X25hbWVzW0FDUElfTlVNX01VVEVYXSA9IHsKLQkiQUNQSV9NVFhfSW50ZXJwcmV0ZXIiLAotCSJBQ1BJX01UWF9OYW1lc3BhY2UiLAotCSJBQ1BJX01UWF9UYWJsZXMiLAotCSJBQ1BJX01UWF9FdmVudHMiLAotCSJBQ1BJX01UWF9DYWNoZXMiLAotCSJBQ1BJX01UWF9NZW1vcnkiLAotCSJBQ1BJX01UWF9Db21tYW5kQ29tcGxldGUiLAotCSJBQ1BJX01UWF9Db21tYW5kUmVhZHkiCi19OwotCi0jZW5kaWYKLSNlbmRpZgotCi0vKgotICogUHJlZGVmaW5lZCBoYW5kbGVzIGZvciBzcGlubG9ja3MgdXNlZCB3aXRoaW4gdGhlIHN1YnN5c3RlbS4KLSAqIFRoZXNlIHNwaW5sb2NrcyBhcmUgY3JlYXRlZCBieSBhY3BpX3V0X211dGV4X2luaXRpYWxpemUKLSAqLwotI2RlZmluZSBBQ1BJX0xPQ0tfR1BFUyAgICAgICAgICAgICAgICAgIDAKLSNkZWZpbmUgQUNQSV9MT0NLX0hBUkRXQVJFICAgICAgICAgICAgICAxCi0KLSNkZWZpbmUgQUNQSV9NQVhfTE9DSyAgICAgICAgICAgICAgICAgICAxCi0jZGVmaW5lIEFDUElfTlVNX0xPQ0sgICAgICAgICAgICAgICAgICAgQUNQSV9NQVhfTE9DSysxCi0KLS8qIE93bmVyIElEcyBhcmUgdXNlZCB0byB0cmFjayBuYW1lc3BhY2Ugbm9kZXMgZm9yIHNlbGVjdGl2ZSBkZWxldGlvbiAqLwotCi10eXBlZGVmIHU4IGFjcGlfb3duZXJfaWQ7Ci0jZGVmaW5lIEFDUElfT1dORVJfSURfTUFYICAgICAgICAgICAgICAgMHhGRgotCi0vKiBUaGlzIFRocmVhZCBJRCBtZWFucyB0aGF0IHRoZSBtdXRleCBpcyBub3QgaW4gdXNlICh1bmxvY2tlZCkgKi8KLQotI2RlZmluZSBBQ1BJX01VVEVYX05PVF9BQ1FVSVJFRCAgICAgICAgIChhY3BpX3RocmVhZF9pZCkgMAotCi0vKiBUYWJsZSBmb3IgdGhlIGdsb2JhbCBtdXRleGVzICovCi0KLXN0cnVjdCBhY3BpX211dGV4X2luZm8gewotCWFjcGlfbXV0ZXggbXV0ZXg7Ci0JdTMyIHVzZV9jb3VudDsKLQlhY3BpX3RocmVhZF9pZCB0aHJlYWRfaWQ7Ci19OwotCi0vKiBMb2NrIGZsYWcgcGFyYW1ldGVyIGZvciB2YXJpb3VzIGludGVyZmFjZXMgKi8KLQotI2RlZmluZSBBQ1BJX01UWF9ET19OT1RfTE9DSyAgICAgICAgICAgIDAKLSNkZWZpbmUgQUNQSV9NVFhfTE9DSyAgICAgICAgICAgICAgICAgICAxCi0KLS8qIEZpZWxkIGFjY2VzcyBncmFudWxhcml0aWVzICovCi0KLSNkZWZpbmUgQUNQSV9GSUVMRF9CWVRFX0dSQU5VTEFSSVRZICAgICAxCi0jZGVmaW5lIEFDUElfRklFTERfV09SRF9HUkFOVUxBUklUWSAgICAgMgotI2RlZmluZSBBQ1BJX0ZJRUxEX0RXT1JEX0dSQU5VTEFSSVRZICAgIDQKLSNkZWZpbmUgQUNQSV9GSUVMRF9RV09SRF9HUkFOVUxBUklUWSAgICA4Ci0KLSNkZWZpbmUgQUNQSV9FTlRSWV9OT1RfRk9VTkQgICAgICAgICAgICBOVUxMCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIE5hbWVzcGFjZSB0eXBlZGVmcyBhbmQgc3RydWN0cwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBPcGVyYXRpb25hbCBtb2RlcyBvZiB0aGUgQU1MIGludGVycHJldGVyL3NjYW5uZXIgKi8KLQotdHlwZWRlZiBlbnVtIHsKLQlBQ1BJX0lNT0RFX0xPQURfUEFTUzEgPSAweDAxLAotCUFDUElfSU1PREVfTE9BRF9QQVNTMiA9IDB4MDIsCi0JQUNQSV9JTU9ERV9FWEVDVVRFID0gMHgwMwotfSBhY3BpX2ludGVycHJldGVyX21vZGU7Ci0KLXVuaW9uIGFjcGlfbmFtZV91bmlvbiB7Ci0JdTMyIGludGVnZXI7Ci0JY2hhciBhc2NpaVs0XTsKLX07Ci0KLS8qCi0gKiBUaGUgTmFtZXNwYWNlIE5vZGUgZGVzY3JpYmVzIGEgbmFtZWQgb2JqZWN0IHRoYXQgYXBwZWFycyBpbiB0aGUgQU1MLgotICogZGVzY3JpcHRvcl90eXBlIGlzIHVzZWQgdG8gZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIGludGVybmFsIGRlc2NyaXB0b3JzLgotICoKLSAqIFRoZSBub2RlIGlzIG9wdGltaXplZCBmb3IgYm90aCAzMi1iaXQgYW5kIDY0LWJpdCBwbGF0Zm9ybXM6Ci0gKiAyMCBieXRlcyBmb3IgdGhlIDMyLWJpdCBjYXNlLCAzMiBieXRlcyBmb3IgdGhlIDY0LWJpdCBjYXNlLgotICoKLSAqIE5vdGU6IFRoZSBkZXNjcmlwdG9yX3R5cGUgYW5kIFR5cGUgZmllbGRzIG11c3QgYXBwZWFyIGluIHRoZSBpZGVudGljYWwKLSAqIHBvc2l0aW9uIGluIGJvdGggdGhlIHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlIGFuZCB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0Ci0gKiBzdHJ1Y3R1cmVzLgotICovCi1zdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSB7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqZWN0OwkvKiBJbnRlcnByZXRlciBvYmplY3QgKi8KLQl1OCBkZXNjcmlwdG9yX3R5cGU7CS8qIERpZmZlcmVudGlhdGUgb2JqZWN0IGRlc2NyaXB0b3IgdHlwZXMgKi8KLQl1OCB0eXBlOwkJLyogQUNQSSBUeXBlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG5hbWUgKi8KLQl1OCBmbGFnczsJCS8qIE1pc2NlbGxhbmVvdXMgZmxhZ3MgKi8KLQlhY3BpX293bmVyX2lkIG93bmVyX2lkOwkvKiBOb2RlIGNyZWF0b3IgKi8KLQl1bmlvbiBhY3BpX25hbWVfdW5pb24gbmFtZTsJLyogQUNQSSBOYW1lLCBhbHdheXMgNCBjaGFycyBwZXIgQUNQSSBzcGVjICovCi0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKmNoaWxkOwkvKiBGaXJzdCBjaGlsZCAqLwotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpwZWVyOwkvKiBQZWVyLiBQYXJlbnQgaWYgQU5PQkpfRU5EX09GX1BFRVJfTElTVCBzZXQgKi8KLQotCS8qCi0JICogVGhlIGZvbGxvd2luZyBmaWVsZHMgYXJlIHVzZWQgYnkgdGhlIEFTTCBjb21waWxlciBhbmQgZGlzYXNzZW1ibGVyIG9ubHkKLQkgKi8KLSNpZmRlZiBBQ1BJX0xBUkdFX05BTUVTUEFDRV9OT0RFCi0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKm9wOwotCXUzMiB2YWx1ZTsKLQl1MzIgbGVuZ3RoOwotI2VuZGlmCi19OwotCi0vKiBOYW1lc3BhY2UgTm9kZSBmbGFncyAqLwotCi0jZGVmaW5lIEFOT0JKX0VORF9PRl9QRUVSX0xJU1QgICAgICAgICAgMHgwMQkvKiBFbmQtb2YtbGlzdCwgUGVlciBmaWVsZCBwb2ludHMgdG8gcGFyZW50ICovCi0jZGVmaW5lIEFOT0JKX1RFTVBPUkFSWSAgICAgICAgICAgICAgICAgMHgwMgkvKiBOb2RlIGlzIGNyZWF0ZSBieSBhIG1ldGhvZCBhbmQgaXMgdGVtcG9yYXJ5ICovCi0jZGVmaW5lIEFOT0JKX01FVEhPRF9BUkcgICAgICAgICAgICAgICAgMHgwNAkvKiBOb2RlIGlzIGEgbWV0aG9kIGFyZ3VtZW50ICovCi0jZGVmaW5lIEFOT0JKX01FVEhPRF9MT0NBTCAgICAgICAgICAgICAgMHgwOAkvKiBOb2RlIGlzIGEgbWV0aG9kIGxvY2FsICovCi0jZGVmaW5lIEFOT0JKX1NVQlRSRUVfSEFTX0lOSSAgICAgICAgICAgMHgxMAkvKiBVc2VkIHRvIG9wdGltaXplIGRldmljZSBpbml0aWFsaXphdGlvbiAqLwotI2RlZmluZSBBTk9CSl9FVkFMVUFURUQgICAgICAgICAgICAgICAgIDB4MjAJLyogU2V0IG9uIGZpcnN0IGV2YWx1YXRpb24gb2Ygbm9kZSAqLwotCi0jZGVmaW5lIEFOT0JKX0lTX0VYVEVSTkFMICAgICAgICAgICAgICAgMHgwOAkvKiBpX2FTTCBvbmx5OiBUaGlzIG9iamVjdCBjcmVhdGVkIHZpYSBFeHRlcm5hbCgpICovCi0jZGVmaW5lIEFOT0JKX01FVEhPRF9OT19SRVRWQUwgICAgICAgICAgMHgxMAkvKiBpX2FTTCBvbmx5OiBNZXRob2QgaGFzIG5vIHJldHVybiB2YWx1ZSAqLwotI2RlZmluZSBBTk9CSl9NRVRIT0RfU09NRV9OT19SRVRWQUwgICAgIDB4MjAJLyogaV9hU0wgb25seTogTWV0aG9kIGhhcyBhdCBsZWFzdCBvbmUgcmV0dXJuIHZhbHVlICovCi0jZGVmaW5lIEFOT0JKX0lTX0JJVF9PRkZTRVQgICAgICAgICAgICAgMHg0MAkvKiBpX2FTTCBvbmx5OiBSZWZlcmVuY2UgaXMgYSBiaXQgb2Zmc2V0ICovCi0jZGVmaW5lIEFOT0JKX0lTX1JFRkVSRU5DRUQgICAgICAgICAgICAgMHg4MAkvKiBpX2FTTCBvbmx5OiBPYmplY3Qgd2FzIHJlZmVyZW5jZWQgKi8KLQotLyoKLSAqIEFDUEkgVGFibGUgRGVzY3JpcHRvci4gIE9uZSBwZXIgQUNQSSB0YWJsZQotICovCi1zdHJ1Y3QgYWNwaV90YWJsZV9kZXNjIHsKLQlhY3BpX3BoeXNpY2FsX2FkZHJlc3MgYWRkcmVzczsKLQlzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKnBvaW50ZXI7Ci0JdTMyIGxlbmd0aDsJCS8qIExlbmd0aCBmaXhlZCBhdCAzMiBiaXRzICovCi0JdW5pb24gYWNwaV9uYW1lX3VuaW9uIHNpZ25hdHVyZTsKLQlhY3BpX293bmVyX2lkIG93bmVyX2lkOwotCXU4IGZsYWdzOwotfTsKLQotLyogRmxhZ3MgZm9yIGFib3ZlICovCi0KLSNkZWZpbmUgQUNQSV9UQUJMRV9PUklHSU5fVU5LTk9XTiAgICAgICAoMCkKLSNkZWZpbmUgQUNQSV9UQUJMRV9PUklHSU5fTUFQUEVEICAgICAgICAoMSkKLSNkZWZpbmUgQUNQSV9UQUJMRV9PUklHSU5fQUxMT0NBVEVEICAgICAoMikKLSNkZWZpbmUgQUNQSV9UQUJMRV9PUklHSU5fTUFTSyAgICAgICAgICAoMykKLSNkZWZpbmUgQUNQSV9UQUJMRV9JU19MT0FERUQgICAgICAgICAgICAoNCkKLQotLyogT25lIGludGVybmFsIFJTRFQgZm9yIHRhYmxlIG1hbmFnZW1lbnQgKi8KLQotc3RydWN0IGFjcGlfaW50ZXJuYWxfcnNkdCB7Ci0Jc3RydWN0IGFjcGlfdGFibGVfZGVzYyAqdGFibGVzOwotCXUzMiBjb3VudDsKLQl1MzIgc2l6ZTsKLQl1OCBmbGFnczsKLX07Ci0KLS8qIEZsYWdzIGZvciBhYm92ZSAqLwotCi0jZGVmaW5lIEFDUElfUk9PVF9PUklHSU5fVU5LTk9XTiAgICAgICAgKDApCS8qIH5PUklHSU5fQUxMT0NBVEVEICovCi0jZGVmaW5lIEFDUElfUk9PVF9PUklHSU5fQUxMT0NBVEVEICAgICAgKDEpCi0jZGVmaW5lIEFDUElfUk9PVF9BTExPV19SRVNJWkUgICAgICAgICAgKDIpCi0KLS8qIFByZWRlZmluZWQgKGZpeGVkKSB0YWJsZSBpbmRleGVzICovCi0KLSNkZWZpbmUgQUNQSV9UQUJMRV9JTkRFWF9EU0RUICAgICAgICAgICAoMCkKLSNkZWZpbmUgQUNQSV9UQUJMRV9JTkRFWF9GQUNTICAgICAgICAgICAoMSkKLQotc3RydWN0IGFjcGlfZmluZF9jb250ZXh0IHsKLQljaGFyICpzZWFyY2hfZm9yOwotCWFjcGlfaGFuZGxlICpsaXN0OwotCXUzMiAqY291bnQ7Ci19OwotCi1zdHJ1Y3QgYWNwaV9uc19zZWFyY2hfZGF0YSB7Ci0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGU7Ci19OwotCi0vKgotICogUHJlZGVmaW5lZCBOYW1lc3BhY2UgaXRlbXMKLSAqLwotc3RydWN0IGFjcGlfcHJlZGVmaW5lZF9uYW1lcyB7Ci0JY2hhciAqbmFtZTsKLQl1OCB0eXBlOwotCWNoYXIgKnZhbDsKLX07Ci0KLS8qIE9iamVjdCB0eXBlcyB1c2VkIGR1cmluZyBwYWNrYWdlIGNvcGllcyAqLwotCi0jZGVmaW5lIEFDUElfQ09QWV9UWVBFX1NJTVBMRSAgICAgICAgICAgMAotI2RlZmluZSBBQ1BJX0NPUFlfVFlQRV9QQUNLQUdFICAgICAgICAgIDEKLQotLyogSW5mbyBzdHJ1Y3R1cmUgdXNlZCB0byBjb252ZXJ0IGV4dGVybmFsPC0+aW50ZXJuYWwgbmFtZXN0cmluZ3MgKi8KLQotc3RydWN0IGFjcGlfbmFtZXN0cmluZ19pbmZvIHsKLQljb25zdCBjaGFyICpleHRlcm5hbF9uYW1lOwotCWNvbnN0IGNoYXIgKm5leHRfZXh0ZXJuYWxfY2hhcjsKLQljaGFyICppbnRlcm5hbF9uYW1lOwotCXUzMiBsZW5ndGg7Ci0JdTMyIG51bV9zZWdtZW50czsKLQl1MzIgbnVtX2NhcmF0czsKLQl1OCBmdWxseV9xdWFsaWZpZWQ7Ci19OwotCi0vKiBGaWVsZCBjcmVhdGlvbiBpbmZvICovCi0KLXN0cnVjdCBhY3BpX2NyZWF0ZV9maWVsZF9pbmZvIHsKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqcmVnaW9uX25vZGU7Ci0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKmZpZWxkX25vZGU7Ci0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKnJlZ2lzdGVyX25vZGU7Ci0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKmRhdGFfcmVnaXN0ZXJfbm9kZTsKLQl1MzIgYmFua192YWx1ZTsKLQl1MzIgZmllbGRfYml0X3Bvc2l0aW9uOwotCXUzMiBmaWVsZF9iaXRfbGVuZ3RoOwotCXU4IGZpZWxkX2ZsYWdzOwotCXU4IGF0dHJpYnV0ZTsKLQl1OCBmaWVsZF90eXBlOwotfTsKLQotdHlwZWRlZgotYWNwaV9zdGF0dXMoKkFDUElfSU5URVJOQUxfTUVUSE9EKSAoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqIHdhbGtfc3RhdGUpOwotCi0vKgotICogQml0bWFwcGVkIEFDUEkgdHlwZXMuICBVc2VkIGludGVybmFsbHkgb25seQotICovCi0jZGVmaW5lIEFDUElfQlRZUEVfQU5ZICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAotI2RlZmluZSBBQ1BJX0JUWVBFX0lOVEVHRVIgICAgICAgICAgICAgIDB4MDAwMDAwMDEKLSNkZWZpbmUgQUNQSV9CVFlQRV9TVFJJTkcgICAgICAgICAgICAgICAweDAwMDAwMDAyCi0jZGVmaW5lIEFDUElfQlRZUEVfQlVGRkVSICAgICAgICAgICAgICAgMHgwMDAwMDAwNAotI2RlZmluZSBBQ1BJX0JUWVBFX1BBQ0tBR0UgICAgICAgICAgICAgIDB4MDAwMDAwMDgKLSNkZWZpbmUgQUNQSV9CVFlQRV9GSUVMRF9VTklUICAgICAgICAgICAweDAwMDAwMDEwCi0jZGVmaW5lIEFDUElfQlRZUEVfREVWSUNFICAgICAgICAgICAgICAgMHgwMDAwMDAyMAotI2RlZmluZSBBQ1BJX0JUWVBFX0VWRU5UICAgICAgICAgICAgICAgIDB4MDAwMDAwNDAKLSNkZWZpbmUgQUNQSV9CVFlQRV9NRVRIT0QgICAgICAgICAgICAgICAweDAwMDAwMDgwCi0jZGVmaW5lIEFDUElfQlRZUEVfTVVURVggICAgICAgICAgICAgICAgMHgwMDAwMDEwMAotI2RlZmluZSBBQ1BJX0JUWVBFX1JFR0lPTiAgICAgICAgICAgICAgIDB4MDAwMDAyMDAKLSNkZWZpbmUgQUNQSV9CVFlQRV9QT1dFUiAgICAgICAgICAgICAgICAweDAwMDAwNDAwCi0jZGVmaW5lIEFDUElfQlRZUEVfUFJPQ0VTU09SICAgICAgICAgICAgMHgwMDAwMDgwMAotI2RlZmluZSBBQ1BJX0JUWVBFX1RIRVJNQUwgICAgICAgICAgICAgIDB4MDAwMDEwMDAKLSNkZWZpbmUgQUNQSV9CVFlQRV9CVUZGRVJfRklFTEQgICAgICAgICAweDAwMDAyMDAwCi0jZGVmaW5lIEFDUElfQlRZUEVfRERCX0hBTkRMRSAgICAgICAgICAgMHgwMDAwNDAwMAotI2RlZmluZSBBQ1BJX0JUWVBFX0RFQlVHX09CSkVDVCAgICAgICAgIDB4MDAwMDgwMDAKLSNkZWZpbmUgQUNQSV9CVFlQRV9SRUZFUkVOQ0UgICAgICAgICAgICAweDAwMDEwMDAwCi0jZGVmaW5lIEFDUElfQlRZUEVfUkVTT1VSQ0UgICAgICAgICAgICAgMHgwMDAyMDAwMAotCi0jZGVmaW5lIEFDUElfQlRZUEVfQ09NUFVURV9EQVRBICAgICAgICAgKEFDUElfQlRZUEVfSU5URUdFUiB8IEFDUElfQlRZUEVfU1RSSU5HIHwgQUNQSV9CVFlQRV9CVUZGRVIpCi0KLSNkZWZpbmUgQUNQSV9CVFlQRV9EQVRBICAgICAgICAgICAgICAgICAoQUNQSV9CVFlQRV9DT01QVVRFX0RBVEEgIHwgQUNQSV9CVFlQRV9QQUNLQUdFKQotI2RlZmluZSBBQ1BJX0JUWVBFX0RBVEFfUkVGRVJFTkNFICAgICAgIChBQ1BJX0JUWVBFX0RBVEEgfCBBQ1BJX0JUWVBFX1JFRkVSRU5DRSB8IEFDUElfQlRZUEVfRERCX0hBTkRMRSkKLSNkZWZpbmUgQUNQSV9CVFlQRV9ERVZJQ0VfT0JKRUNUUyAgICAgICAoQUNQSV9CVFlQRV9ERVZJQ0UgfCBBQ1BJX0JUWVBFX1RIRVJNQUwgfCBBQ1BJX0JUWVBFX1BST0NFU1NPUikKLSNkZWZpbmUgQUNQSV9CVFlQRV9PQkpFQ1RTX0FORF9SRUZTICAgICAweDAwMDFGRkZGCS8qIEFSRyBvciBMT0NBTCAqLwotI2RlZmluZSBBQ1BJX0JUWVBFX0FMTF9PQkpFQ1RTICAgICAgICAgIDB4MDAwMEZGRkYKLQotLyoKLSAqIEluZm9ybWF0aW9uIHN0cnVjdHVyZSBmb3IgQUNQSSBwcmVkZWZpbmVkIG5hbWVzLgotICogRWFjaCBlbnRyeSBpbiB0aGUgdGFibGUgY29udGFpbnMgdGhlIGZvbGxvd2luZyBpdGVtczoKLSAqCi0gKiBOYW1lICAgICAgICAgICAgICAgICAtIFRoZSBBQ1BJIHJlc2VydmVkIG5hbWUKLSAqIHBhcmFtX2NvdW50ICAgICAgICAgIC0gTnVtYmVyIG9mIGFyZ3VtZW50cyB0byB0aGUgbWV0aG9kCi0gKiBleHBlY3RlZF9yZXR1cm5fYnR5cGVzIC0gQWxsb3dlZCB0eXBlKHMpIGZvciB0aGUgcmV0dXJuIHZhbHVlCi0gKi8KLXN0cnVjdCBhY3BpX25hbWVfaW5mbyB7Ci0JY2hhciBuYW1lW0FDUElfTkFNRV9TSVpFXTsKLQl1OCBwYXJhbV9jb3VudDsKLQl1OCBleHBlY3RlZF9idHlwZXM7Ci19OwotCi0vKgotICogU2Vjb25kYXJ5IGluZm9ybWF0aW9uIHN0cnVjdHVyZXMgZm9yIEFDUEkgcHJlZGVmaW5lZCBvYmplY3RzIHRoYXQgcmV0dXJuCi0gKiBwYWNrYWdlIG9iamVjdHMuIFRoaXMgc3RydWN0dXJlIGFwcGVhcnMgYXMgdGhlIG5leHQgZW50cnkgaW4gdGhlIHRhYmxlCi0gKiBhZnRlciB0aGUgTkFNRV9JTkZPIHN0cnVjdHVyZSBhYm92ZS4KLSAqCi0gKiBUaGUgcmVhc29uIGZvciB0aGlzIGlzIHRvIG1pbmltaXplIHRoZSBzaXplIG9mIHRoZSBwcmVkZWZpbmVkIG5hbWUgdGFibGUuCi0gKi8KLQotLyoKLSAqIFVzZWQgZm9yIEFDUElfUFRZUEUxX0ZJWEVELCBBQ1BJX1BUWVBFMV9WQVIsIEFDUElfUFRZUEUyLAotICogQUNQSV9QVFlQRTJfTUlOLCBBQ1BJX1BUWVBFMl9QS0dfQ09VTlQsIEFDUElfUFRZUEUyX0NPVU5UCi0gKi8KLXN0cnVjdCBhY3BpX3BhY2thZ2VfaW5mbyB7Ci0JdTggdHlwZTsKLQl1OCBvYmplY3RfdHlwZTE7Ci0JdTggY291bnQxOwotCXU4IG9iamVjdF90eXBlMjsKLQl1OCBjb3VudDI7Ci0JdTggcmVzZXJ2ZWQ7Ci19OwotCi0vKiBVc2VkIGZvciBBQ1BJX1BUWVBFMl9GSVhFRCAqLwotCi1zdHJ1Y3QgYWNwaV9wYWNrYWdlX2luZm8yIHsKLQl1OCB0eXBlOwotCXU4IGNvdW50OwotCXU4IG9iamVjdF90eXBlWzRdOwotfTsKLQotLyogVXNlZCBmb3IgQUNQSV9QVFlQRTFfT1BUSU9OICovCi0KLXN0cnVjdCBhY3BpX3BhY2thZ2VfaW5mbzMgewotCXU4IHR5cGU7Ci0JdTggY291bnQ7Ci0JdTggb2JqZWN0X3R5cGVbMl07Ci0JdTggdGFpbF9vYmplY3RfdHlwZTsKLQl1OCByZXNlcnZlZDsKLX07Ci0KLXVuaW9uIGFjcGlfcHJlZGVmaW5lZF9pbmZvIHsKLQlzdHJ1Y3QgYWNwaV9uYW1lX2luZm8gaW5mbzsKLQlzdHJ1Y3QgYWNwaV9wYWNrYWdlX2luZm8gcmV0X2luZm87Ci0Jc3RydWN0IGFjcGlfcGFja2FnZV9pbmZvMiByZXRfaW5mbzI7Ci0Jc3RydWN0IGFjcGlfcGFja2FnZV9pbmZvMyByZXRfaW5mbzM7Ci19OwotCi0vKgotICogQml0bWFwcGVkIHJldHVybiB2YWx1ZSB0eXBlcwotICogTm90ZTogdGhlIGFjdHVhbCBkYXRhIHR5cGVzIG11c3QgYmUgY29udGlndW91cywgYSBsb29wIGluIG5zcHJlZGVmLmMKLSAqIGRlcGVuZHMgb24gdGhpcy4KLSAqLwotI2RlZmluZSBBQ1BJX1JUWVBFX0FOWSAgICAgICAgICAgICAgICAgIDB4MDAKLSNkZWZpbmUgQUNQSV9SVFlQRV9OT05FICAgICAgICAgICAgICAgICAweDAxCi0jZGVmaW5lIEFDUElfUlRZUEVfSU5URUdFUiAgICAgICAgICAgICAgMHgwMgotI2RlZmluZSBBQ1BJX1JUWVBFX1NUUklORyAgICAgICAgICAgICAgIDB4MDQKLSNkZWZpbmUgQUNQSV9SVFlQRV9CVUZGRVIgICAgICAgICAgICAgICAweDA4Ci0jZGVmaW5lIEFDUElfUlRZUEVfUEFDS0FHRSAgICAgICAgICAgICAgMHgxMAotI2RlZmluZSBBQ1BJX1JUWVBFX1JFRkVSRU5DRSAgICAgICAgICAgIDB4MjAKLSNkZWZpbmUgQUNQSV9SVFlQRV9BTEwgICAgICAgICAgICAgICAgICAweDNGCi0KLSNkZWZpbmUgQUNQSV9OVU1fUlRZUEVTICAgICAgICAgICAgICAgICA1CS8qIE51bWJlciBvZiBhY3R1YWwgb2JqZWN0IHR5cGVzICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEV2ZW50IHR5cGVkZWZzIGFuZCBzdHJ1Y3RzCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIERpc3BhdGNoIGluZm8gZm9yIGVhY2ggR1BFIC0tIGVpdGhlciBhIG1ldGhvZCBvciBoYW5kbGVyLCBjYW5ub3QgYmUgYm90aCAqLwotCi1zdHJ1Y3QgYWNwaV9oYW5kbGVyX2luZm8gewotCWFjcGlfZXZlbnRfaGFuZGxlciBhZGRyZXNzOwkvKiBBZGRyZXNzIG9mIGhhbmRsZXIsIGlmIGFueSAqLwotCXZvaWQgKmNvbnRleHQ7CQkvKiBDb250ZXh0IHRvIGJlIHBhc3NlZCB0byBoYW5kbGVyICovCi0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm1ldGhvZF9ub2RlOwkvKiBNZXRob2Qgbm9kZSBmb3IgdGhpcyBHUEUgbGV2ZWwgKHNhdmVkKSAqLwotfTsKLQotdW5pb24gYWNwaV9ncGVfZGlzcGF0Y2hfaW5mbyB7Ci0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm1ldGhvZF9ub2RlOwkvKiBNZXRob2Qgbm9kZSBmb3IgdGhpcyBHUEUgbGV2ZWwgKi8KLQlzdHJ1Y3QgYWNwaV9oYW5kbGVyX2luZm8gKmhhbmRsZXI7Ci19OwotCi0vKgotICogSW5mb3JtYXRpb24gYWJvdXQgYSBHUEUsIG9uZSBwZXIgZWFjaCBHUEUgaW4gYW4gYXJyYXkuCi0gKiBOT1RFOiBJbXBvcnRhbnQgdG8ga2VlcCB0aGlzIHN0cnVjdCBhcyBzbWFsbCBhcyBwb3NzaWJsZS4KLSAqLwotc3RydWN0IGFjcGlfZ3BlX2V2ZW50X2luZm8gewotCXVuaW9uIGFjcGlfZ3BlX2Rpc3BhdGNoX2luZm8gZGlzcGF0Y2g7CS8qIEVpdGhlciBNZXRob2Qgb3IgSGFuZGxlciAqLwotCXN0cnVjdCBhY3BpX2dwZV9yZWdpc3Rlcl9pbmZvICpyZWdpc3Rlcl9pbmZvOwkvKiBCYWNrcG9pbnRlciB0byByZWdpc3RlciBpbmZvICovCi0JdTggZmxhZ3M7CQkvKiBNaXNjIGluZm8gYWJvdXQgdGhpcyBHUEUgKi8KLQl1OCBncGVfbnVtYmVyOwkJLyogVGhpcyBHUEUgKi8KLX07Ci0KLS8qIEluZm9ybWF0aW9uIGFib3V0IGEgR1BFIHJlZ2lzdGVyIHBhaXIsIG9uZSBwZXIgZWFjaCBzdGF0dXMvZW5hYmxlIHBhaXIgaW4gYW4gYXJyYXkgKi8KLQotc3RydWN0IGFjcGlfZ3BlX3JlZ2lzdGVyX2luZm8gewotCXN0cnVjdCBhY3BpX2dlbmVyaWNfYWRkcmVzcyBzdGF0dXNfYWRkcmVzczsJLyogQWRkcmVzcyBvZiBzdGF0dXMgcmVnICovCi0Jc3RydWN0IGFjcGlfZ2VuZXJpY19hZGRyZXNzIGVuYWJsZV9hZGRyZXNzOwkvKiBBZGRyZXNzIG9mIGVuYWJsZSByZWcgKi8KLQl1OCBlbmFibGVfZm9yX3dha2U7CS8qIEdQRXMgdG8ga2VlcCBlbmFibGVkIHdoZW4gc2xlZXBpbmcgKi8KLQl1OCBlbmFibGVfZm9yX3J1bjsJLyogR1BFcyB0byBrZWVwIGVuYWJsZWQgd2hlbiBydW5uaW5nICovCi0JdTggYmFzZV9ncGVfbnVtYmVyOwkvKiBCYXNlIEdQRSBudW1iZXIgZm9yIHRoaXMgcmVnaXN0ZXIgKi8KLX07Ci0KLS8qCi0gKiBJbmZvcm1hdGlvbiBhYm91dCBhIEdQRSByZWdpc3RlciBibG9jaywgb25lIHBlciBlYWNoIGluc3RhbGxlZCBibG9jayAtLQotICogR1BFMCwgR1BFMSwgYW5kIG9uZSBwZXIgZWFjaCBpbnN0YWxsZWQgR1BFIEJsb2NrIERldmljZS4KLSAqLwotc3RydWN0IGFjcGlfZ3BlX2Jsb2NrX2luZm8gewotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlOwotCXN0cnVjdCBhY3BpX2dwZV9ibG9ja19pbmZvICpwcmV2aW91czsKLQlzdHJ1Y3QgYWNwaV9ncGVfYmxvY2tfaW5mbyAqbmV4dDsKLQlzdHJ1Y3QgYWNwaV9ncGVfeHJ1cHRfaW5mbyAqeHJ1cHRfYmxvY2s7CS8qIEJhY2twb2ludGVyIHRvIGludGVycnVwdCBibG9jayAqLwotCXN0cnVjdCBhY3BpX2dwZV9yZWdpc3Rlcl9pbmZvICpyZWdpc3Rlcl9pbmZvOwkvKiBPbmUgcGVyIEdQRSByZWdpc3RlciBwYWlyICovCi0Jc3RydWN0IGFjcGlfZ3BlX2V2ZW50X2luZm8gKmV2ZW50X2luZm87CS8qIE9uZSBmb3IgZWFjaCBHUEUgKi8KLQlzdHJ1Y3QgYWNwaV9nZW5lcmljX2FkZHJlc3MgYmxvY2tfYWRkcmVzczsJLyogQmFzZSBhZGRyZXNzIG9mIHRoZSBibG9jayAqLwotCXUzMiByZWdpc3Rlcl9jb3VudDsJLyogTnVtYmVyIG9mIHJlZ2lzdGVyIHBhaXJzIGluIGJsb2NrICovCi0JdTggYmxvY2tfYmFzZV9udW1iZXI7CS8qIEJhc2UgR1BFIG51bWJlciBmb3IgdGhpcyBibG9jayAqLwotfTsKLQotLyogSW5mb3JtYXRpb24gYWJvdXQgR1BFIGludGVycnVwdCBoYW5kbGVycywgb25lIHBlciBlYWNoIGludGVycnVwdCBsZXZlbCB1c2VkIGZvciBHUEVzICovCi0KLXN0cnVjdCBhY3BpX2dwZV94cnVwdF9pbmZvIHsKLQlzdHJ1Y3QgYWNwaV9ncGVfeHJ1cHRfaW5mbyAqcHJldmlvdXM7Ci0Jc3RydWN0IGFjcGlfZ3BlX3hydXB0X2luZm8gKm5leHQ7Ci0Jc3RydWN0IGFjcGlfZ3BlX2Jsb2NrX2luZm8gKmdwZV9ibG9ja19saXN0X2hlYWQ7CS8qIExpc3Qgb2YgR1BFIGJsb2NrcyBmb3IgdGhpcyB4cnVwdCAqLwotCXUzMiBpbnRlcnJ1cHRfbnVtYmVyOwkvKiBTeXN0ZW0gaW50ZXJydXB0IG51bWJlciAqLwotfTsKLQotc3RydWN0IGFjcGlfZ3BlX3dhbGtfaW5mbyB7Ci0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKmdwZV9kZXZpY2U7Ci0Jc3RydWN0IGFjcGlfZ3BlX2Jsb2NrX2luZm8gKmdwZV9ibG9jazsKLX07Ci0KLXR5cGVkZWYgYWNwaV9zdGF0dXMoKmFjcGlfZ3BlX2NhbGxiYWNrKSAoc3RydWN0IGFjcGlfZ3BlX3hydXB0X2luZm8gKgotCQkJCQkgZ3BlX3hydXB0X2luZm8sCi0JCQkJCSBzdHJ1Y3QgYWNwaV9ncGVfYmxvY2tfaW5mbyAqCi0JCQkJCSBncGVfYmxvY2spOwotCi0vKiBJbmZvcm1hdGlvbiBhYm91dCBlYWNoIHBhcnRpY3VsYXIgZml4ZWQgZXZlbnQgKi8KLQotc3RydWN0IGFjcGlfZml4ZWRfZXZlbnRfaGFuZGxlciB7Ci0JYWNwaV9ldmVudF9oYW5kbGVyIGhhbmRsZXI7CS8qIEFkZHJlc3Mgb2YgaGFuZGxlci4gKi8KLQl2b2lkICpjb250ZXh0OwkJLyogQ29udGV4dCB0byBiZSBwYXNzZWQgdG8gaGFuZGxlciAqLwotfTsKLQotc3RydWN0IGFjcGlfZml4ZWRfZXZlbnRfaW5mbyB7Ci0JdTggc3RhdHVzX3JlZ2lzdGVyX2lkOwotCXU4IGVuYWJsZV9yZWdpc3Rlcl9pZDsKLQl1MTYgc3RhdHVzX2JpdF9tYXNrOwotCXUxNiBlbmFibGVfYml0X21hc2s7Ci19OwotCi0vKiBJbmZvcm1hdGlvbiB1c2VkIGR1cmluZyBmaWVsZCBwcm9jZXNzaW5nICovCi0KLXN0cnVjdCBhY3BpX2ZpZWxkX2luZm8gewotCXU4IHNraXBfZmllbGQ7Ci0JdTggZmllbGRfZmxhZzsKLQl1MzIgcGtnX2xlbmd0aDsKLX07Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEdlbmVyaWMgInN0YXRlIiBvYmplY3QgZm9yIHN0YWNrcwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIEFDUElfQ09OVFJPTF9OT1JNQUwgICAgICAgICAgICAgICAgICAweEMwCi0jZGVmaW5lIEFDUElfQ09OVFJPTF9DT05ESVRJT05BTF9FWEVDVVRJTkcgICAweEMxCi0jZGVmaW5lIEFDUElfQ09OVFJPTF9QUkVESUNBVEVfRVhFQ1VUSU5HICAgICAweEMyCi0jZGVmaW5lIEFDUElfQ09OVFJPTF9QUkVESUNBVEVfRkFMU0UgICAgICAgICAweEMzCi0jZGVmaW5lIEFDUElfQ09OVFJPTF9QUkVESUNBVEVfVFJVRSAgICAgICAgICAweEM0Ci0KLSNkZWZpbmUgQUNQSV9TVEFURV9DT01NT04gXAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5leHQ7IFwKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JfdHlwZTsgLyogVG8gZGlmZmVyZW50aWF0ZSB2YXJpb3VzIGludGVybmFsIG9ianMgKi9cCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFnczsgXAotCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU7IFwKLQl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlOwotCi0JLyogVGhlcmUgYXJlIDIgYnl0ZXMgYXZhaWxhYmxlIGhlcmUgdW50aWwgdGhlIG5leHQgbmF0dXJhbCBhbGlnbm1lbnQgYm91bmRhcnkgKi8KLQotc3RydWN0IGFjcGlfY29tbW9uX3N0YXRlIHsKLUFDUElfU1RBVEVfQ09NTU9OfTsKLQotLyoKLSAqIFVwZGF0ZSBzdGF0ZSAtIHVzZWQgdG8gdHJhdmVyc2UgY29tcGxleCBvYmplY3RzIHN1Y2ggYXMgcGFja2FnZXMKLSAqLwotc3RydWN0IGFjcGlfdXBkYXRlX3N0YXRlIHsKLQlBQ1BJX1NUQVRFX0NPTU1PTiB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmplY3Q7Ci19OwotCi0vKgotICogUGtnIHN0YXRlIC0gdXNlZCB0byB0cmF2ZXJzZSBuZXN0ZWQgcGFja2FnZSBzdHJ1Y3R1cmVzCi0gKi8KLXN0cnVjdCBhY3BpX3BrZ19zdGF0ZSB7Ci0JQUNQSV9TVEFURV9DT01NT04gdTE2IGluZGV4OwotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnNvdXJjZV9vYmplY3Q7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqZGVzdF9vYmplY3Q7Ci0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZTsKLQl2b2lkICp0aGlzX3RhcmdldF9vYmo7Ci0JdTMyIG51bV9wYWNrYWdlczsKLX07Ci0KLS8qCi0gKiBDb250cm9sIHN0YXRlIC0gb25lIHBlciBpZi9lbHNlIGFuZCB3aGlsZSBjb25zdHJ1Y3RzLgotICogQWxsb3dzIG5lc3Rpbmcgb2YgdGhlc2UgY29uc3RydWN0cwotICovCi1zdHJ1Y3QgYWNwaV9jb250cm9sX3N0YXRlIHsKLQlBQ1BJX1NUQVRFX0NPTU1PTiB1MTYgb3Bjb2RlOwotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpwcmVkaWNhdGVfb3A7Ci0JdTggKmFtbF9wcmVkaWNhdGVfc3RhcnQ7CS8qIFN0YXJ0IG9mIGlmL3doaWxlIHByZWRpY2F0ZSAqLwotCXU4ICpwYWNrYWdlX2VuZDsJLyogRW5kIG9mIGlmL3doaWxlIGJsb2NrICovCi19OwotCi0vKgotICogU2NvcGUgc3RhdGUgLSBjdXJyZW50IHNjb3BlIGR1cmluZyBuYW1lc3BhY2UgbG9va3VwcwotICovCi1zdHJ1Y3QgYWNwaV9zY29wZV9zdGF0ZSB7Ci0JQUNQSV9TVEFURV9DT01NT04gc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGU7Ci19OwotCi1zdHJ1Y3QgYWNwaV9wc2NvcGVfc3RhdGUgewotCUFDUElfU1RBVEVfQ09NTU9OIHUzMiBhcmdfY291bnQ7CS8qIE51bWJlciBvZiBmaXhlZCBhcmd1bWVudHMgKi8KLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqb3A7CS8qIEN1cnJlbnQgb3AgYmVpbmcgcGFyc2VkICovCi0JdTggKmFyZ19lbmQ7CQkvKiBDdXJyZW50IGFyZ3VtZW50IGVuZCAqLwotCXU4ICpwa2dfZW5kOwkJLyogQ3VycmVudCBwYWNrYWdlIGVuZCAqLwotCXUzMiBhcmdfbGlzdDsJCS8qIE5leHQgYXJndW1lbnQgdG8gcGFyc2UgKi8KLX07Ci0KLS8qCi0gKiBUaHJlYWQgc3RhdGUgLSBvbmUgcGVyIHRocmVhZCBhY3Jvc3MgbXVsdGlwbGUgd2FsayBzdGF0ZXMuICBNdWx0aXBsZSB3YWxrCi0gKiBzdGF0ZXMgYXJlIGNyZWF0ZWQgd2hlbiB0aGVyZSBhcmUgbmVzdGVkIGNvbnRyb2wgbWV0aG9kcyBleGVjdXRpbmcuCi0gKi8KLXN0cnVjdCBhY3BpX3RocmVhZF9zdGF0ZSB7Ci0JQUNQSV9TVEFURV9DT01NT04gdTggY3VycmVudF9zeW5jX2xldmVsOwkvKiBNdXRleCBTeW5jIChuZXN0ZWQgYWNxdWlyZSkgbGV2ZWwgKi8KLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlX2xpc3Q7CS8qIEhlYWQgb2YgbGlzdCBvZiB3YWxrX3N0YXRlcyBmb3IgdGhpcyB0aHJlYWQgKi8KLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICphY3F1aXJlZF9tdXRleF9saXN0OwkvKiBMaXN0IG9mIGFsbCBjdXJyZW50bHkgYWNxdWlyZWQgbXV0ZXhlcyAqLwotCWFjcGlfdGhyZWFkX2lkIHRocmVhZF9pZDsJLyogUnVubmluZyB0aHJlYWQgSUQgKi8KLX07Ci0KLS8qCi0gKiBSZXN1bHQgdmFsdWVzIC0gdXNlZCB0byBhY2N1bXVsYXRlIHRoZSByZXN1bHRzIG9mIG5lc3RlZAotICogQU1MIGFyZ3VtZW50cwotICovCi1zdHJ1Y3QgYWNwaV9yZXN1bHRfdmFsdWVzIHsKLQlBQ1BJX1NUQVRFX0NPTU1PTgotCSAgICB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzY1tBQ1BJX1JFU1VMVFNfRlJBTUVfT0JKX05VTV07Ci19OwotCi10eXBlZGVmCi1hY3BpX3N0YXR1cygqYWNwaV9wYXJzZV9kb3dud2FyZHMpIChzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICogd2Fsa19zdGF0ZSwKLQkJCQkgICAgdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKiogb3V0X29wKTsKLQotdHlwZWRlZiBhY3BpX3N0YXR1cygqYWNwaV9wYXJzZV91cHdhcmRzKSAoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqIHdhbGtfc3RhdGUpOwotCi0vKgotICogTm90aWZ5IGluZm8gLSB1c2VkIHRvIHBhc3MgaW5mbyB0byB0aGUgZGVmZXJyZWQgbm90aWZ5Ci0gKiBoYW5kbGVyL2Rpc3BhdGNoZXIuCi0gKi8KLXN0cnVjdCBhY3BpX25vdGlmeV9pbmZvIHsKLQlBQ1BJX1NUQVRFX0NPTU1PTiBzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZTsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpoYW5kbGVyX29iajsKLX07Ci0KLS8qIEdlbmVyaWMgc3RhdGUgaXMgdW5pb24gb2Ygc3RydWN0cyBhYm92ZSAqLwotCi11bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgewotCXN0cnVjdCBhY3BpX2NvbW1vbl9zdGF0ZSBjb21tb247Ci0Jc3RydWN0IGFjcGlfY29udHJvbF9zdGF0ZSBjb250cm9sOwotCXN0cnVjdCBhY3BpX3VwZGF0ZV9zdGF0ZSB1cGRhdGU7Ci0Jc3RydWN0IGFjcGlfc2NvcGVfc3RhdGUgc2NvcGU7Ci0Jc3RydWN0IGFjcGlfcHNjb3BlX3N0YXRlIHBhcnNlX3Njb3BlOwotCXN0cnVjdCBhY3BpX3BrZ19zdGF0ZSBwa2c7Ci0Jc3RydWN0IGFjcGlfdGhyZWFkX3N0YXRlIHRocmVhZDsKLQlzdHJ1Y3QgYWNwaV9yZXN1bHRfdmFsdWVzIHJlc3VsdHM7Ci0Jc3RydWN0IGFjcGlfbm90aWZ5X2luZm8gbm90aWZ5OwotfTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogSW50ZXJwcmV0ZXIgdHlwZWRlZnMgYW5kIHN0cnVjdHMKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdHlwZWRlZiBhY3BpX3N0YXR1cygqQUNQSV9FWEVDVVRFX09QKSAoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqIHdhbGtfc3RhdGUpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBQYXJzZXIgdHlwZWRlZnMgYW5kIHN0cnVjdHMKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoKLSAqIEFNTCBvcGNvZGUsIG5hbWUsIGFuZCBhcmd1bWVudCBsYXlvdXQKLSAqLwotc3RydWN0IGFjcGlfb3Bjb2RlX2luZm8gewotI2lmIGRlZmluZWQoQUNQSV9ESVNBU1NFTUJMRVIpIHx8IGRlZmluZWQoQUNQSV9ERUJVR19PVVRQVVQpCi0JY2hhciAqbmFtZTsJCS8qIE9wY29kZSBuYW1lIChkaXNhc3NlbWJsZXIvZGVidWcgb25seSkgKi8KLSNlbmRpZgotCXUzMiBwYXJzZV9hcmdzOwkJLyogR3JhbW1hci9QYXJzZSB0aW1lIGFyZ3VtZW50cyAqLwotCXUzMiBydW50aW1lX2FyZ3M7CS8qIEludGVycHJldCB0aW1lIGFyZ3VtZW50cyAqLwotCXUxNiBmbGFnczsJCS8qIE1pc2MgZmxhZ3MgKi8KLQl1OCBvYmplY3RfdHlwZTsJCS8qIENvcnJlc3BvbmRpbmcgaW50ZXJuYWwgb2JqZWN0IHR5cGUgKi8KLQl1OCBjbGFzczsJCS8qIE9wY29kZSBjbGFzcyAqLwotCXU4IHR5cGU7CQkvKiBPcGNvZGUgdHlwZSAqLwotfTsKLQotdW5pb24gYWNwaV9wYXJzZV92YWx1ZSB7Ci0JYWNwaV9pbnRlZ2VyIGludGVnZXI7CS8qIEludGVnZXIgY29uc3RhbnQgKFVwIHRvIDY0IGJpdHMpICovCi0Jc3RydWN0IHVpbnQ2NF9zdHJ1Y3QgaW50ZWdlcjY0OwkvKiBTdHJ1Y3R1cmUgb3ZlcmxheSBmb3IgMiAzMi1iaXQgRHdvcmRzICovCi0JdTMyIHNpemU7CQkvKiBieXRlbGlzdCBvciBmaWVsZCBzaXplICovCi0JY2hhciAqc3RyaW5nOwkJLyogTlVMTCB0ZXJtaW5hdGVkIHN0cmluZyAqLwotCXU4ICpidWZmZXI7CQkvKiBidWZmZXIgb3Igc3RyaW5nICovCi0JY2hhciAqbmFtZTsJCS8qIE5VTEwgdGVybWluYXRlZCBzdHJpbmcgKi8KLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqYXJnOwkvKiBhcmd1bWVudHMgYW5kIGNvbnRhaW5lZCBvcHMgKi8KLX07Ci0KLSNkZWZpbmUgQUNQSV9QQVJTRV9DT01NT04gXAotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKnBhcmVudDsgICAgICAgIC8qIFBhcmVudCBvcCAqL1wKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JfdHlwZTsgLyogVG8gZGlmZmVyZW50aWF0ZSB2YXJpb3VzIGludGVybmFsIG9ianMgKi9cCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFnczsgICAgICAgICAgLyogVHlwZSBvZiBPcCAqL1wKLQl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFtbF9vcGNvZGU7ICAgICAvKiBBTUwgb3Bjb2RlICovXAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW1sX29mZnNldDsgICAgIC8qIE9mZnNldCBvZiBkZWNsYXJhdGlvbiBpbiBBTUwgKi9cCi0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqbmV4dDsgICAgICAgICAgLyogTmV4dCBvcCAqL1wKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpub2RlOyAgICAgICAgICAvKiBGb3IgdXNlIGJ5IGludGVycHJldGVyICovXAotCXVuaW9uIGFjcGlfcGFyc2VfdmFsdWUgICAgICAgICAgdmFsdWU7ICAgICAgICAgIC8qIFZhbHVlIG9yIGFyZ3MgYXNzb2NpYXRlZCB3aXRoIHRoZSBvcGNvZGUgKi9cCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdfbGlzdF9sZW5ndGg7IC8qIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgYXJnIGxpc3QgKi9cCi0JQUNQSV9ESVNBU01fT05MWV9NRU1CRVJTIChcCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNhc21fZmxhZ3M7ICAgLyogVXNlZCBkdXJpbmcgQU1MIGRpc2Fzc2VtYmx5ICovXAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzYXNtX29wY29kZTsgIC8qIFN1YnR5cGUgdXNlZCBmb3IgZGlzYXNzZW1ibHkgKi9cCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbWxfb3BfbmFtZVsxNl0pCS8qIE9wIG5hbWUgKGRlYnVnIG9ubHkpICovCi0KLSNkZWZpbmUgQUNQSV9EQVNNX0JVRkZFUiAgICAgICAgICAgICAgICAweDAwCi0jZGVmaW5lIEFDUElfREFTTV9SRVNPVVJDRSAgICAgICAgICAgICAgMHgwMQotI2RlZmluZSBBQ1BJX0RBU01fU1RSSU5HICAgICAgICAgICAgICAgIDB4MDIKLSNkZWZpbmUgQUNQSV9EQVNNX1VOSUNPREUgICAgICAgICAgICAgICAweDAzCi0jZGVmaW5lIEFDUElfREFTTV9FSVNBSUQgICAgICAgICAgICAgICAgMHgwNAotI2RlZmluZSBBQ1BJX0RBU01fTUFUQ0hPUCAgICAgICAgICAgICAgIDB4MDUKLSNkZWZpbmUgQUNQSV9EQVNNX0xOT1RfUFJFRklYICAgICAgICAgICAweDA2Ci0jZGVmaW5lIEFDUElfREFTTV9MTk9UX1NVRkZJWCAgICAgICAgICAgMHgwNwotI2RlZmluZSBBQ1BJX0RBU01fSUdOT1JFICAgICAgICAgICAgICAgIDB4MDgKLQotLyoKLSAqIEdlbmVyaWMgb3BlcmF0aW9uIChmb3IgZXhhbXBsZTogIElmLCBXaGlsZSwgU3RvcmUpCi0gKi8KLXN0cnVjdCBhY3BpX3BhcnNlX29ial9jb21tb24gewotQUNQSV9QQVJTRV9DT01NT059OwotCi0vKgotICogRXh0ZW5kZWQgT3AgZm9yIG5hbWVkIG9wcyAoU2NvcGUsIE1ldGhvZCwgZXRjLiksIGRlZmVycmVkIG9wcyAoTWV0aG9kcyBhbmQgb3BfcmVnaW9ucyksCi0gKiBhbmQgYnl0ZWxpc3RzLgotICovCi1zdHJ1Y3QgYWNwaV9wYXJzZV9vYmpfbmFtZWQgewotCUFDUElfUEFSU0VfQ09NTU9OIHU4ICpwYXRoOwotCXU4ICpkYXRhOwkJLyogQU1MIGJvZHkgb3IgYnl0ZWxpc3QgZGF0YSAqLwotCXUzMiBsZW5ndGg7CQkvKiBBTUwgbGVuZ3RoICovCi0JdTMyIG5hbWU7CQkvKiA0LWJ5dGUgbmFtZSBvciB6ZXJvIGlmIG5vIG5hbWUgKi8KLX07Ci0KLS8qIFRoaXMgdmVyc2lvbiBpcyB1c2VkIGJ5IHRoZSBpX2FTTCBjb21waWxlciBvbmx5ICovCi0KLSNkZWZpbmUgQUNQSV9NQVhfUEFSU0VPUF9OQU1FICAgMjAKLQotc3RydWN0IGFjcGlfcGFyc2Vfb2JqX2FzbCB7Ci0JQUNQSV9QQVJTRV9DT01NT04gdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKmNoaWxkOwotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpwYXJlbnRfbWV0aG9kOwotCWNoYXIgKmZpbGVuYW1lOwotCWNoYXIgKmV4dGVybmFsX25hbWU7Ci0JY2hhciAqbmFtZXBhdGg7Ci0JY2hhciBuYW1lX3NlZ1s0XTsKLQl1MzIgZXh0cmFfdmFsdWU7Ci0JdTMyIGNvbHVtbjsKLQl1MzIgbGluZV9udW1iZXI7Ci0JdTMyIGxvZ2ljYWxfbGluZV9udW1iZXI7Ci0JdTMyIGxvZ2ljYWxfYnl0ZV9vZmZzZXQ7Ci0JdTMyIGVuZF9saW5lOwotCXUzMiBlbmRfbG9naWNhbF9saW5lOwotCXUzMiBhY3BpX2J0eXBlOwotCXUzMiBhbWxfbGVuZ3RoOwotCXUzMiBhbWxfc3VidHJlZV9sZW5ndGg7Ci0JdTMyIGZpbmFsX2FtbF9sZW5ndGg7Ci0JdTMyIGZpbmFsX2FtbF9vZmZzZXQ7Ci0JdTMyIGNvbXBpbGVfZmxhZ3M7Ci0JdTE2IHBhcnNlX29wY29kZTsKLQl1OCBhbWxfb3Bjb2RlX2xlbmd0aDsKLQl1OCBhbWxfcGtnX2xlbl9ieXRlczsKLQl1OCBleHRyYTsKLQljaGFyIHBhcnNlX29wX25hbWVbQUNQSV9NQVhfUEFSU0VPUF9OQU1FXTsKLX07Ci0KLXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0IHsKLQlzdHJ1Y3QgYWNwaV9wYXJzZV9vYmpfY29tbW9uIGNvbW1vbjsKLQlzdHJ1Y3QgYWNwaV9wYXJzZV9vYmpfbmFtZWQgbmFtZWQ7Ci0Jc3RydWN0IGFjcGlfcGFyc2Vfb2JqX2FzbCBhc2w7Ci19OwotCi0vKgotICogUGFyc2Ugc3RhdGUgLSBvbmUgc3RhdGUgcGVyIHBhcnNlciBpbnZvY2F0aW9uIGFuZCBlYWNoIGNvbnRyb2wKLSAqIG1ldGhvZC4KLSAqLwotc3RydWN0IGFjcGlfcGFyc2Vfc3RhdGUgewotCXU4ICphbWxfc3RhcnQ7CQkvKiBGaXJzdCBBTUwgYnl0ZSAqLwotCXU4ICphbWw7CQkvKiBOZXh0IEFNTCBieXRlICovCi0JdTggKmFtbF9lbmQ7CQkvKiAobGFzdCArIDEpIEFNTCBieXRlICovCi0JdTggKnBrZ19zdGFydDsJCS8qIEN1cnJlbnQgcGFja2FnZSBiZWdpbiAqLwotCXU4ICpwa2dfZW5kOwkJLyogQ3VycmVudCBwYWNrYWdlIGVuZCAqLwotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpzdGFydF9vcDsJLyogUm9vdCBvZiBwYXJzZSB0cmVlICovCi0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKnN0YXJ0X25vZGU7Ci0JdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICpzY29wZTsJLyogQ3VycmVudCBzY29wZSAqLwotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpzdGFydF9zY29wZTsKLQl1MzIgYW1sX3NpemU7Ci19OwotCi0vKiBQYXJzZSBvYmplY3QgZmxhZ3MgKi8KLQotI2RlZmluZSBBQ1BJX1BBUlNFT1BfR0VORVJJQyAgICAgICAgICAgIDB4MDEKLSNkZWZpbmUgQUNQSV9QQVJTRU9QX05BTUVEICAgICAgICAgICAgICAweDAyCi0jZGVmaW5lIEFDUElfUEFSU0VPUF9ERUZFUlJFRCAgICAgICAgICAgMHgwNAotI2RlZmluZSBBQ1BJX1BBUlNFT1BfQllURUxJU1QgICAgICAgICAgIDB4MDgKLSNkZWZpbmUgQUNQSV9QQVJTRU9QX0lOX1NUQUNLICAgICAgICAgICAweDEwCi0jZGVmaW5lIEFDUElfUEFSU0VPUF9UQVJHRVQgICAgICAgICAgICAgMHgyMAotI2RlZmluZSBBQ1BJX1BBUlNFT1BfSU5fQ0FDSEUgICAgICAgICAgIDB4ODAKLQotLyogUGFyc2Ugb2JqZWN0IGRpc2FzbV9mbGFncyAqLwotCi0jZGVmaW5lIEFDUElfUEFSU0VPUF9JR05PUkUgICAgICAgICAgICAgMHgwMQotI2RlZmluZSBBQ1BJX1BBUlNFT1BfUEFSQU1MSVNUICAgICAgICAgIDB4MDIKLSNkZWZpbmUgQUNQSV9QQVJTRU9QX0VNUFRZX1RFUk1MSVNUICAgICAweDA0Ci0jZGVmaW5lIEFDUElfUEFSU0VPUF9TUEVDSUFMICAgICAgICAgICAgMHgxMAotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBIYXJkd2FyZSAoQUNQSSByZWdpc3RlcnMpIGFuZCBQTlAKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBQQ0lfUk9PVF9ISURfU1RSSU5HICAgICAgICAgICAgICJQTlAwQTAzIgotI2RlZmluZSBQQ0lfRVhQUkVTU19ST09UX0hJRF9TVFJJTkcgICAgICJQTlAwQTA4IgotCi1zdHJ1Y3QgYWNwaV9iaXRfcmVnaXN0ZXJfaW5mbyB7Ci0JdTggcGFyZW50X3JlZ2lzdGVyOwotCXU4IGJpdF9wb3NpdGlvbjsKLQl1MTYgYWNjZXNzX2JpdF9tYXNrOwotfTsKLQotLyoKLSAqIFNvbWUgQUNQSSByZWdpc3RlcnMgaGF2ZSBiaXRzIHRoYXQgbXVzdCBiZSBpZ25vcmVkIC0tIG1lYW5pbmcgdGhhdCB0aGV5Ci0gKiBtdXN0IGJlIHByZXNlcnZlZC4KLSAqLwotI2RlZmluZSBBQ1BJX1BNMV9TVEFUVVNfUFJFU0VSVkVEX0JJVFMgICAgICAgICAgMHgwODAwCS8qIEJpdCAxMSAqLwotI2RlZmluZSBBQ1BJX1BNMV9DT05UUk9MX1BSRVNFUlZFRF9CSVRTICAgICAgICAgMHgwMjAwCS8qIEJpdCA5ICh3aGF0ZXZlcikgKi8KLQotLyoKLSAqIFJlZ2lzdGVyIElEcwotICogVGhlc2UgYXJlIHRoZSBmdWxsIEFDUEkgcmVnaXN0ZXJzCi0gKi8KLSNkZWZpbmUgQUNQSV9SRUdJU1RFUl9QTTFfU1RBVFVTICAgICAgICAgICAgICAgIDB4MDEKLSNkZWZpbmUgQUNQSV9SRUdJU1RFUl9QTTFfRU5BQkxFICAgICAgICAgICAgICAgIDB4MDIKLSNkZWZpbmUgQUNQSV9SRUdJU1RFUl9QTTFfQ09OVFJPTCAgICAgICAgICAgICAgIDB4MDMKLSNkZWZpbmUgQUNQSV9SRUdJU1RFUl9QTTFBX0NPTlRST0wgICAgICAgICAgICAgIDB4MDQKLSNkZWZpbmUgQUNQSV9SRUdJU1RFUl9QTTFCX0NPTlRST0wgICAgICAgICAgICAgIDB4MDUKLSNkZWZpbmUgQUNQSV9SRUdJU1RFUl9QTTJfQ09OVFJPTCAgICAgICAgICAgICAgIDB4MDYKLSNkZWZpbmUgQUNQSV9SRUdJU1RFUl9QTV9USU1FUiAgICAgICAgICAgICAgICAgIDB4MDcKLSNkZWZpbmUgQUNQSV9SRUdJU1RFUl9QUk9DRVNTT1JfQkxPQ0sgICAgICAgICAgIDB4MDgKLSNkZWZpbmUgQUNQSV9SRUdJU1RFUl9TTUlfQ09NTUFORF9CTE9DSyAgICAgICAgIDB4MDkKLQotLyogTWFza3MgdXNlZCB0byBhY2Nlc3MgdGhlIGJpdF9yZWdpc3RlcnMgKi8KLQotI2RlZmluZSBBQ1BJX0JJVE1BU0tfVElNRVJfU1RBVFVTICAgICAgICAgICAgICAgMHgwMDAxCi0jZGVmaW5lIEFDUElfQklUTUFTS19CVVNfTUFTVEVSX1NUQVRVUyAgICAgICAgICAweDAwMTAKLSNkZWZpbmUgQUNQSV9CSVRNQVNLX0dMT0JBTF9MT0NLX1NUQVRVUyAgICAgICAgIDB4MDAyMAotI2RlZmluZSBBQ1BJX0JJVE1BU0tfUE9XRVJfQlVUVE9OX1NUQVRVUyAgICAgICAgMHgwMTAwCi0jZGVmaW5lIEFDUElfQklUTUFTS19TTEVFUF9CVVRUT05fU1RBVFVTICAgICAgICAweDAyMDAKLSNkZWZpbmUgQUNQSV9CSVRNQVNLX1JUX0NMT0NLX1NUQVRVUyAgICAgICAgICAgIDB4MDQwMAotI2RlZmluZSBBQ1BJX0JJVE1BU0tfUENJRVhQX1dBS0VfU1RBVFVTICAgICAgICAgMHg0MDAwCS8qIEFDUEkgMy4wICovCi0jZGVmaW5lIEFDUElfQklUTUFTS19XQUtFX1NUQVRVUyAgICAgICAgICAgICAgICAweDgwMDAKLQotI2RlZmluZSBBQ1BJX0JJVE1BU0tfQUxMX0ZJWEVEX1NUQVRVUyAgICAgICAgICAgKFwKLQlBQ1BJX0JJVE1BU0tfVElNRVJfU1RBVFVTICAgICAgICAgIHwgXAotCUFDUElfQklUTUFTS19CVVNfTUFTVEVSX1NUQVRVUyAgICAgfCBcCi0JQUNQSV9CSVRNQVNLX0dMT0JBTF9MT0NLX1NUQVRVUyAgICB8IFwKLQlBQ1BJX0JJVE1BU0tfUE9XRVJfQlVUVE9OX1NUQVRVUyAgIHwgXAotCUFDUElfQklUTUFTS19TTEVFUF9CVVRUT05fU1RBVFVTICAgfCBcCi0JQUNQSV9CSVRNQVNLX1JUX0NMT0NLX1NUQVRVUyAgICAgICB8IFwKLQlBQ1BJX0JJVE1BU0tfV0FLRV9TVEFUVVMpCi0KLSNkZWZpbmUgQUNQSV9CSVRNQVNLX1RJTUVSX0VOQUJMRSAgICAgICAgICAgICAgIDB4MDAwMQotI2RlZmluZSBBQ1BJX0JJVE1BU0tfR0xPQkFMX0xPQ0tfRU5BQkxFICAgICAgICAgMHgwMDIwCi0jZGVmaW5lIEFDUElfQklUTUFTS19QT1dFUl9CVVRUT05fRU5BQkxFICAgICAgICAweDAxMDAKLSNkZWZpbmUgQUNQSV9CSVRNQVNLX1NMRUVQX0JVVFRPTl9FTkFCTEUgICAgICAgIDB4MDIwMAotI2RlZmluZSBBQ1BJX0JJVE1BU0tfUlRfQ0xPQ0tfRU5BQkxFICAgICAgICAgICAgMHgwNDAwCi0jZGVmaW5lIEFDUElfQklUTUFTS19QQ0lFWFBfV0FLRV9ESVNBQkxFICAgICAgICAweDQwMDAJLyogQUNQSSAzLjAgKi8KLQotI2RlZmluZSBBQ1BJX0JJVE1BU0tfU0NJX0VOQUJMRSAgICAgICAgICAgICAgICAgMHgwMDAxCi0jZGVmaW5lIEFDUElfQklUTUFTS19CVVNfTUFTVEVSX1JMRCAgICAgICAgICAgICAweDAwMDIKLSNkZWZpbmUgQUNQSV9CSVRNQVNLX0dMT0JBTF9MT0NLX1JFTEVBU0UgICAgICAgIDB4MDAwNAotI2RlZmluZSBBQ1BJX0JJVE1BU0tfU0xFRVBfVFlQRV9YICAgICAgICAgICAgICAgMHgxQzAwCi0jZGVmaW5lIEFDUElfQklUTUFTS19TTEVFUF9FTkFCTEUgICAgICAgICAgICAgICAweDIwMDAKLQotI2RlZmluZSBBQ1BJX0JJVE1BU0tfQVJCX0RJU0FCTEUgICAgICAgICAgICAgICAgMHgwMDAxCi0KLS8qIFJhdyBiaXQgcG9zaXRpb24gb2YgZWFjaCBiaXRfcmVnaXN0ZXIgKi8KLQotI2RlZmluZSBBQ1BJX0JJVFBPU0lUSU9OX1RJTUVSX1NUQVRVUyAgICAgICAgICAgMHgwMAotI2RlZmluZSBBQ1BJX0JJVFBPU0lUSU9OX0JVU19NQVNURVJfU1RBVFVTICAgICAgMHgwNAotI2RlZmluZSBBQ1BJX0JJVFBPU0lUSU9OX0dMT0JBTF9MT0NLX1NUQVRVUyAgICAgMHgwNQotI2RlZmluZSBBQ1BJX0JJVFBPU0lUSU9OX1BPV0VSX0JVVFRPTl9TVEFUVVMgICAgMHgwOAotI2RlZmluZSBBQ1BJX0JJVFBPU0lUSU9OX1NMRUVQX0JVVFRPTl9TVEFUVVMgICAgMHgwOQotI2RlZmluZSBBQ1BJX0JJVFBPU0lUSU9OX1JUX0NMT0NLX1NUQVRVUyAgICAgICAgMHgwQQotI2RlZmluZSBBQ1BJX0JJVFBPU0lUSU9OX1BDSUVYUF9XQUtFX1NUQVRVUyAgICAgMHgwRQkvKiBBQ1BJIDMuMCAqLwotI2RlZmluZSBBQ1BJX0JJVFBPU0lUSU9OX1dBS0VfU1RBVFVTICAgICAgICAgICAgMHgwRgotCi0jZGVmaW5lIEFDUElfQklUUE9TSVRJT05fVElNRVJfRU5BQkxFICAgICAgICAgICAweDAwCi0jZGVmaW5lIEFDUElfQklUUE9TSVRJT05fR0xPQkFMX0xPQ0tfRU5BQkxFICAgICAweDA1Ci0jZGVmaW5lIEFDUElfQklUUE9TSVRJT05fUE9XRVJfQlVUVE9OX0VOQUJMRSAgICAweDA4Ci0jZGVmaW5lIEFDUElfQklUUE9TSVRJT05fU0xFRVBfQlVUVE9OX0VOQUJMRSAgICAweDA5Ci0jZGVmaW5lIEFDUElfQklUUE9TSVRJT05fUlRfQ0xPQ0tfRU5BQkxFICAgICAgICAweDBBCi0jZGVmaW5lIEFDUElfQklUUE9TSVRJT05fUENJRVhQX1dBS0VfRElTQUJMRSAgICAweDBFCS8qIEFDUEkgMy4wICovCi0KLSNkZWZpbmUgQUNQSV9CSVRQT1NJVElPTl9TQ0lfRU5BQkxFICAgICAgICAgICAgIDB4MDAKLSNkZWZpbmUgQUNQSV9CSVRQT1NJVElPTl9CVVNfTUFTVEVSX1JMRCAgICAgICAgIDB4MDEKLSNkZWZpbmUgQUNQSV9CSVRQT1NJVElPTl9HTE9CQUxfTE9DS19SRUxFQVNFICAgIDB4MDIKLSNkZWZpbmUgQUNQSV9CSVRQT1NJVElPTl9TTEVFUF9UWVBFX1ggICAgICAgICAgIDB4MEEKLSNkZWZpbmUgQUNQSV9CSVRQT1NJVElPTl9TTEVFUF9FTkFCTEUgICAgICAgICAgIDB4MEQKLQotI2RlZmluZSBBQ1BJX0JJVFBPU0lUSU9OX0FSQl9ESVNBQkxFICAgICAgICAgICAgMHgwMAotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBSZXNvdXJjZSBkZXNjcmlwdG9ycwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiByZXNvdXJjZV90eXBlIHZhbHVlcyAqLwotCi0jZGVmaW5lIEFDUElfQUREUkVTU19UWVBFX01FTU9SWV9SQU5HRSAgICAgICAgICAwCi0jZGVmaW5lIEFDUElfQUREUkVTU19UWVBFX0lPX1JBTkdFICAgICAgICAgICAgICAxCi0jZGVmaW5lIEFDUElfQUREUkVTU19UWVBFX0JVU19OVU1CRVJfUkFOR0UgICAgICAyCi0KLS8qIFJlc291cmNlIGRlc2NyaXB0b3IgdHlwZXMgYW5kIG1hc2tzICovCi0KLSNkZWZpbmUgQUNQSV9SRVNPVVJDRV9OQU1FX0xBUkdFICAgICAgICAgICAgICAgIDB4ODAKLSNkZWZpbmUgQUNQSV9SRVNPVVJDRV9OQU1FX1NNQUxMICAgICAgICAgICAgICAgIDB4MDAKLQotI2RlZmluZSBBQ1BJX1JFU09VUkNFX05BTUVfU01BTExfTUFTSyAgICAgICAgICAgMHg3OAkvKiBCaXRzIDY6MyBjb250YWluIHRoZSB0eXBlICovCi0jZGVmaW5lIEFDUElfUkVTT1VSQ0VfTkFNRV9TTUFMTF9MRU5HVEhfTUFTSyAgICAweDA3CS8qIEJpdHMgMjowIGNvbnRhaW4gdGhlIGxlbmd0aCAqLwotI2RlZmluZSBBQ1BJX1JFU09VUkNFX05BTUVfTEFSR0VfTUFTSyAgICAgICAgICAgMHg3RgkvKiBCaXRzIDY6MCBjb250YWluIHRoZSB0eXBlICovCi0KLS8qCi0gKiBTbWFsbCByZXNvdXJjZSBkZXNjcmlwdG9yICJuYW1lcyIgYXMgZGVmaW5lZCBieSB0aGUgQUNQSSBzcGVjaWZpY2F0aW9uLgotICogTm90ZTogQml0cyAyOjAgYXJlIHVzZWQgZm9yIHRoZSBkZXNjcmlwdG9yIGxlbmd0aAotICovCi0jZGVmaW5lIEFDUElfUkVTT1VSQ0VfTkFNRV9JUlEgICAgICAgICAgICAgICAgICAweDIwCi0jZGVmaW5lIEFDUElfUkVTT1VSQ0VfTkFNRV9ETUEgICAgICAgICAgICAgICAgICAweDI4Ci0jZGVmaW5lIEFDUElfUkVTT1VSQ0VfTkFNRV9TVEFSVF9ERVBFTkRFTlQgICAgICAweDMwCi0jZGVmaW5lIEFDUElfUkVTT1VSQ0VfTkFNRV9FTkRfREVQRU5ERU5UICAgICAgICAweDM4Ci0jZGVmaW5lIEFDUElfUkVTT1VSQ0VfTkFNRV9JTyAgICAgICAgICAgICAgICAgICAweDQwCi0jZGVmaW5lIEFDUElfUkVTT1VSQ0VfTkFNRV9GSVhFRF9JTyAgICAgICAgICAgICAweDQ4Ci0jZGVmaW5lIEFDUElfUkVTT1VSQ0VfTkFNRV9SRVNFUlZFRF9TMSAgICAgICAgICAweDUwCi0jZGVmaW5lIEFDUElfUkVTT1VSQ0VfTkFNRV9SRVNFUlZFRF9TMiAgICAgICAgICAweDU4Ci0jZGVmaW5lIEFDUElfUkVTT1VSQ0VfTkFNRV9SRVNFUlZFRF9TMyAgICAgICAgICAweDYwCi0jZGVmaW5lIEFDUElfUkVTT1VSQ0VfTkFNRV9SRVNFUlZFRF9TNCAgICAgICAgICAweDY4Ci0jZGVmaW5lIEFDUElfUkVTT1VSQ0VfTkFNRV9WRU5ET1JfU01BTEwgICAgICAgICAweDcwCi0jZGVmaW5lIEFDUElfUkVTT1VSQ0VfTkFNRV9FTkRfVEFHICAgICAgICAgICAgICAweDc4Ci0KLS8qCi0gKiBMYXJnZSByZXNvdXJjZSBkZXNjcmlwdG9yICJuYW1lcyIgYXMgZGVmaW5lZCBieSB0aGUgQUNQSSBzcGVjaWZpY2F0aW9uLgotICogTm90ZTogaW5jbHVkZXMgdGhlIExhcmdlIERlc2NyaXB0b3IgYml0IGluIGJpdFs3XQotICovCi0jZGVmaW5lIEFDUElfUkVTT1VSQ0VfTkFNRV9NRU1PUlkyNCAgICAgICAgICAgICAweDgxCi0jZGVmaW5lIEFDUElfUkVTT1VSQ0VfTkFNRV9HRU5FUklDX1JFR0lTVEVSICAgICAweDgyCi0jZGVmaW5lIEFDUElfUkVTT1VSQ0VfTkFNRV9SRVNFUlZFRF9MMSAgICAgICAgICAweDgzCi0jZGVmaW5lIEFDUElfUkVTT1VSQ0VfTkFNRV9WRU5ET1JfTEFSR0UgICAgICAgICAweDg0Ci0jZGVmaW5lIEFDUElfUkVTT1VSQ0VfTkFNRV9NRU1PUlkzMiAgICAgICAgICAgICAweDg1Ci0jZGVmaW5lIEFDUElfUkVTT1VSQ0VfTkFNRV9GSVhFRF9NRU1PUlkzMiAgICAgICAweDg2Ci0jZGVmaW5lIEFDUElfUkVTT1VSQ0VfTkFNRV9BRERSRVNTMzIgICAgICAgICAgICAweDg3Ci0jZGVmaW5lIEFDUElfUkVTT1VSQ0VfTkFNRV9BRERSRVNTMTYgICAgICAgICAgICAweDg4Ci0jZGVmaW5lIEFDUElfUkVTT1VSQ0VfTkFNRV9FWFRFTkRFRF9JUlEgICAgICAgICAweDg5Ci0jZGVmaW5lIEFDUElfUkVTT1VSQ0VfTkFNRV9BRERSRVNTNjQgICAgICAgICAgICAweDhBCi0jZGVmaW5lIEFDUElfUkVTT1VSQ0VfTkFNRV9FWFRFTkRFRF9BRERSRVNTNjQgICAweDhCCi0jZGVmaW5lIEFDUElfUkVTT1VSQ0VfTkFNRV9MQVJHRV9NQVggICAgICAgICAgICAweDhCCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIE1pc2NlbGxhbmVvdXMKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBBQ1BJX0FTQ0lJX1pFUk8gICAgICAgICAgICAgICAgIDB4MzAKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRGVidWdnZXIKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RydWN0IGFjcGlfZGJfbWV0aG9kX2luZm8gewotCWFjcGlfaGFuZGxlIG1haW5fdGhyZWFkX2dhdGU7Ci0JYWNwaV9oYW5kbGUgdGhyZWFkX2NvbXBsZXRlX2dhdGU7Ci0JdTMyICp0aHJlYWRzOwotCXUzMiBudW1fdGhyZWFkczsKLQl1MzIgbnVtX2NyZWF0ZWQ7Ci0JdTMyIG51bV9jb21wbGV0ZWQ7Ci0KLQljaGFyICpuYW1lOwotCXUzMiBmbGFnczsKLQl1MzIgbnVtX2xvb3BzOwotCWNoYXIgcGF0aG5hbWVbMTI4XTsKLQljaGFyICoqYXJnczsKLQotCS8qCi0JICogQXJndW1lbnRzIHRvIGJlIHBhc3NlZCB0byBtZXRob2QgZm9yIHRoZSBjb21tYW5kCi0JICogVGhyZWFkcyAtCi0JICogICB0aGUgTnVtYmVyIG9mIHRocmVhZHMsIElEIG9mIGN1cnJlbnQgdGhyZWFkIGFuZAotCSAqICAgSW5kZXggb2YgY3VycmVudCB0aHJlYWQgaW5zaWRlIGFsbCB0aGVtIGNyZWF0ZWQuCi0JICovCi0JY2hhciBpbml0X2FyZ3M7Ci0JY2hhciAqYXJndW1lbnRzWzRdOwotCWNoYXIgbnVtX3RocmVhZHNfc3RyWzExXTsKLQljaGFyIGlkX29mX3RocmVhZF9zdHJbMTFdOwotCWNoYXIgaW5kZXhfb2ZfdGhyZWFkX3N0clsxMV07Ci19OwotCi1zdHJ1Y3QgYWNwaV9pbnRlZ3JpdHlfaW5mbyB7Ci0JdTMyIG5vZGVzOwotCXUzMiBvYmplY3RzOwotfTsKLQotI2RlZmluZSBBQ1BJX0RCX1JFRElSRUNUQUJMRV9PVVRQVVQgICAgIDB4MDEKLSNkZWZpbmUgQUNQSV9EQl9DT05TT0xFX09VVFBVVCAgICAgICAgICAweDAyCi0jZGVmaW5lIEFDUElfREJfRFVQTElDQVRFX09VVFBVVCAgICAgICAgMHgwMwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBEZWJ1ZwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBFbnRyeSBmb3IgYSBtZW1vcnkgYWxsb2NhdGlvbiAoZGVidWcgb25seSkgKi8KLQotI2RlZmluZSBBQ1BJX01FTV9NQUxMT0MgICAgICAgICAgICAgICAgIDAKLSNkZWZpbmUgQUNQSV9NRU1fQ0FMTE9DICAgICAgICAgICAgICAgICAxCi0jZGVmaW5lIEFDUElfTUFYX01PRFVMRV9OQU1FICAgICAgICAgICAgMTYKLQotI2RlZmluZSBBQ1BJX0NPTU1PTl9ERUJVR19NRU1fSEVBREVSIFwKLQlzdHJ1Y3QgYWNwaV9kZWJ1Z19tZW1fYmxvY2sgICAgICpwcmV2aW91czsgXAotCXN0cnVjdCBhY3BpX2RlYnVnX21lbV9ibG9jayAgICAgKm5leHQ7IFwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU7IFwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudDsgXAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZTsgXAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlW0FDUElfTUFYX01PRFVMRV9OQU1FXTsgXAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2NfdHlwZTsKLQotc3RydWN0IGFjcGlfZGVidWdfbWVtX2hlYWRlciB7Ci1BQ1BJX0NPTU1PTl9ERUJVR19NRU1fSEVBREVSfTsKLQotc3RydWN0IGFjcGlfZGVidWdfbWVtX2Jsb2NrIHsKLQlBQ1BJX0NPTU1PTl9ERUJVR19NRU1fSEVBREVSIHU2NCB1c2VyX3NwYWNlOwotfTsKLQotI2RlZmluZSBBQ1BJX01FTV9MSVNUX0dMT0JBTCAgICAgICAgICAgIDAKLSNkZWZpbmUgQUNQSV9NRU1fTElTVF9OU05PREUgICAgICAgICAgICAxCi0jZGVmaW5lIEFDUElfTUVNX0xJU1RfTUFYICAgICAgICAgICAgICAgMQotI2RlZmluZSBBQ1BJX05VTV9NRU1fTElTVFMgICAgICAgICAgICAgIDIKLQotc3RydWN0IGFjcGlfbWVtb3J5X2xpc3QgewotCWNoYXIgKmxpc3RfbmFtZTsKLQl2b2lkICpsaXN0X2hlYWQ7Ci0JdTE2IG9iamVjdF9zaXplOwotCXUxNiBtYXhfZGVwdGg7Ci0JdTE2IGN1cnJlbnRfZGVwdGg7Ci0JdTE2IGxpbmtfb2Zmc2V0OwotCi0jaWZkZWYgQUNQSV9EQkdfVFJBQ0tfQUxMT0NBVElPTlMKLQotCS8qIFN0YXRpc3RpY3MgZm9yIGRlYnVnIG1lbW9yeSB0cmFja2luZyBvbmx5ICovCi0KLQl1MzIgdG90YWxfYWxsb2NhdGVkOwotCXUzMiB0b3RhbF9mcmVlZDsKLQl1MzIgbWF4X29jY3VwaWVkOwotCXUzMiB0b3RhbF9zaXplOwotCXUzMiBjdXJyZW50X3RvdGFsX3NpemU7Ci0JdTMyIHJlcXVlc3RzOwotCXUzMiBoaXRzOwotI2VuZGlmCi19OwotCi0jZW5kaWYJCQkJLyogX19BQ0xPQ0FMX0hfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL2FjbWFjcm9zLmggYi9pbmNsdWRlL2FjcGkvYWNtYWNyb3MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTU5NzIwNy4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FjcGkvYWNtYWNyb3MuaAorKysgL2Rldi9udWxsCkBAIC0xLDY5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogTmFtZTogYWNtYWNyb3MuaCAtIEMgbWFjcm9zIGZvciB0aGUgZW50aXJlIHN1YnN5c3RlbS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA4LCBJbnRlbCBDb3JwLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAotICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgYXQgbWluaW11bSBhIGRpc2NsYWltZXIKLSAqICAgIHN1YnN0YW50aWFsbHkgc2ltaWxhciB0byB0aGUgIk5PIFdBUlJBTlRZIiBkaXNjbGFpbWVyIGJlbG93Ci0gKiAgICAoIkRpc2NsYWltZXIiKSBhbmQgYW55IHJlZGlzdHJpYnV0aW9uIG11c3QgYmUgY29uZGl0aW9uZWQgdXBvbgotICogICAgaW5jbHVkaW5nIGEgc3Vic3RhbnRpYWxseSBzaW1pbGFyIERpc2NsYWltZXIgcmVxdWlyZW1lbnQgZm9yIGZ1cnRoZXIKLSAqICAgIGJpbmFyeSByZWRpc3RyaWJ1dGlvbi4KLSAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcwotICogICAgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICogU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBOTyBXQVJSQU5UWQotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCi0gKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUwotICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcKLSAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQotICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgotICovCi0KLSNpZm5kZWYgX19BQ01BQ1JPU19IX18KLSNkZWZpbmUgX19BQ01BQ1JPU19IX18KLQotLyoKLSAqIERhdGEgbWFuaXB1bGF0aW9uIG1hY3JvcwotICovCi0jZGVmaW5lIEFDUElfTE9XT1JEKGwpICAgICAgICAgICAgICAgICAgKCh1MTYpKHUzMikobCkpCi0jZGVmaW5lIEFDUElfSElXT1JEKGwpICAgICAgICAgICAgICAgICAgKCh1MTYpKCgoKHUzMikobCkpID4+IDE2KSAmIDB4RkZGRikpCi0jZGVmaW5lIEFDUElfTE9CWVRFKGwpICAgICAgICAgICAgICAgICAgKCh1OCkodTE2KShsKSkKLSNkZWZpbmUgQUNQSV9ISUJZVEUobCkgICAgICAgICAgICAgICAgICAoKHU4KSgoKCh1MTYpKGwpKSA+PiA4KSAmIDB4RkYpKQotCi0jZGVmaW5lIEFDUElfU0VUX0JJVCh0YXJnZXQsYml0KSAgICAgICAgKCh0YXJnZXQpIHw9IChiaXQpKQotI2RlZmluZSBBQ1BJX0NMRUFSX0JJVCh0YXJnZXQsYml0KSAgICAgICgodGFyZ2V0KSAmPSB+KGJpdCkpCi0jZGVmaW5lIEFDUElfTUlOKGEsYikgICAgICAgICAgICAgICAgICAgKCgoYSk8KGIpKT8oYSk6KGIpKQotI2RlZmluZSBBQ1BJX01BWChhLGIpICAgICAgICAgICAgICAgICAgICgoKGEpPihiKSk/KGEpOihiKSkKLQotLyogU2l6ZSBjYWxjdWxhdGlvbiAqLwotCi0jZGVmaW5lIEFDUElfQVJSQVlfTEVOR1RIKHgpICAgICAgICAgICAgKHNpemVvZih4KSAvIHNpemVvZigoeClbMF0pKQotCi0vKgotICogRXh0cmFjdCBkYXRhIHVzaW5nIGEgcG9pbnRlci4gQW55IG1vcmUgdGhhbiBhIGJ5dGUgYW5kIHdlCi0gKiBnZXQgaW50byBwb3RlbnRpYWwgYWxpZ21lbnQgaXNzdWVzIC0tIHNlZSB0aGUgU1RPUkUgbWFjcm9zIGJlbG93LgotICogVXNlIHdpdGggY2FyZS4KLSAqLwotI2RlZmluZSBBQ1BJX0dFVDgocHRyKSAgICAgICAgICAgICAgICAgICpBQ1BJX0NBU1RfUFRSICh1OCwgcHRyKQotI2RlZmluZSBBQ1BJX0dFVDE2KHB0cikgICAgICAgICAgICAgICAgICpBQ1BJX0NBU1RfUFRSICh1MTYsIHB0cikKLSNkZWZpbmUgQUNQSV9HRVQzMihwdHIpICAgICAgICAgICAgICAgICAqQUNQSV9DQVNUX1BUUiAodTMyLCBwdHIpCi0jZGVmaW5lIEFDUElfR0VUNjQocHRyKSAgICAgICAgICAgICAgICAgKkFDUElfQ0FTVF9QVFIgKHU2NCwgcHRyKQotI2RlZmluZSBBQ1BJX1NFVDgocHRyKSAgICAgICAgICAgICAgICAgICpBQ1BJX0NBU1RfUFRSICh1OCwgcHRyKQotI2RlZmluZSBBQ1BJX1NFVDE2KHB0cikgICAgICAgICAgICAgICAgICpBQ1BJX0NBU1RfUFRSICh1MTYsIHB0cikKLSNkZWZpbmUgQUNQSV9TRVQzMihwdHIpICAgICAgICAgICAgICAgICAqQUNQSV9DQVNUX1BUUiAodTMyLCBwdHIpCi0jZGVmaW5lIEFDUElfU0VUNjQocHRyKSAgICAgICAgICAgICAgICAgKkFDUElfQ0FTVF9QVFIgKHU2NCwgcHRyKQotCi0vKgotICogUG9pbnRlciBtYW5pcHVsYXRpb24KLSAqLwotI2RlZmluZSBBQ1BJX0NBU1RfUFRSKHQsIHApICAgICAgICAgICAgICgodCAqKSAoYWNwaV91aW50cHRyX3QpIChwKSkKLSNkZWZpbmUgQUNQSV9DQVNUX0lORElSRUNUX1BUUih0LCBwKSAgICAoKHQgKiopIChhY3BpX3VpbnRwdHJfdCkgKHApKQotI2RlZmluZSBBQ1BJX0FERF9QVFIodCwgYSwgYikJCUFDUElfQ0FTVF9QVFIgKHQsIChBQ1BJX0NBU1RfUFRSICh1OCwgKGEpKSArIChhY3BpX3NpemUpKGIpKSkKLSNkZWZpbmUgQUNQSV9QVFJfRElGRihhLCBiKQkJKGFjcGlfc2l6ZSkgKEFDUElfQ0FTVF9QVFIgKHU4LCAoYSkpIC0gQUNQSV9DQVNUX1BUUiAodTgsIChiKSkpCi0KLS8qIFBvaW50ZXIvSW50ZWdlciB0eXBlIGNvbnZlcnNpb25zICovCi0KLSNkZWZpbmUgQUNQSV9UT19QT0lOVEVSKGkpCQlBQ1BJX0FERF9QVFIgKHZvaWQsICh2b2lkICopIE5VTEwsIChhY3BpX3NpemUpIGkpCi0jZGVmaW5lIEFDUElfVE9fSU5URUdFUihwKSAgICAgICAgICAgICAgQUNQSV9QVFJfRElGRiAocCwgKHZvaWQgKikgTlVMTCkKLSNkZWZpbmUgQUNQSV9PRkZTRVQoZCwgZikgICAgICAgICAgICAgICAoYWNwaV9zaXplKSBBQ1BJX1BUUl9ESUZGICgmKCgoZCAqKTApLT5mKSwgKHZvaWQgKikgTlVMTCkKLSNkZWZpbmUgQUNQSV9QSFlTQUREUl9UT19QVFIoaSkgICAgICAgICBBQ1BJX1RPX1BPSU5URVIoaSkKLSNkZWZpbmUgQUNQSV9QVFJfVE9fUEhZU0FERFIoaSkgICAgICAgICBBQ1BJX1RPX0lOVEVHRVIoaSkKLQotI2lmbmRlZiBBQ1BJX01JU0FMSUdOTUVOVF9OT1RfU1VQUE9SVEVECi0jZGVmaW5lIEFDUElfQ09NUEFSRV9OQU1FKGEsIGIpICAgICAgICAgKCpBQ1BJX0NBU1RfUFRSICh1MzIsIChhKSkgPT0gKkFDUElfQ0FTVF9QVFIgKHUzMiwgKGIpKSkKLSNlbHNlCi0jZGVmaW5lIEFDUElfQ09NUEFSRV9OQU1FKGEsIGIpICAgICAgICAgKCFBQ1BJX1NUUk5DTVAgKEFDUElfQ0FTVF9QVFIgKGNoYXIsIChhKSksIEFDUElfQ0FTVF9QVFIgKGNoYXIsIChiKSksIEFDUElfTkFNRV9TSVpFKSkKLSNlbmRpZgotCi0vKgotICogRnVsbCA2NC1iaXQgaW50ZWdlciBtdXN0IGJlIGF2YWlsYWJsZSBvbiBib3RoIDMyLWJpdCBhbmQgNjQtYml0IHBsYXRmb3JtcwotICovCi1zdHJ1Y3QgYWNwaV9pbnRlZ2VyX292ZXJsYXkgewotCXUzMiBsb19kd29yZDsKLQl1MzIgaGlfZHdvcmQ7Ci19OwotCi0jZGVmaW5lIEFDUElfTE9EV09SRChpbnRlZ2VyKSAgICAgICAgICAgKEFDUElfQ0FTVF9QVFIgKHN0cnVjdCBhY3BpX2ludGVnZXJfb3ZlcmxheSwgJmludGVnZXIpLT5sb19kd29yZCkKLSNkZWZpbmUgQUNQSV9ISURXT1JEKGludGVnZXIpICAgICAgICAgICAoQUNQSV9DQVNUX1BUUiAoc3RydWN0IGFjcGlfaW50ZWdlcl9vdmVybGF5LCAmaW50ZWdlciktPmhpX2R3b3JkKQotCi0vKgotICogcHJpbnRmKCkgZm9ybWF0IGhlbHBlcnMKLSAqLwotCi0vKiBTcGxpdCA2NC1iaXQgaW50ZWdlciBpbnRvIHR3byAzMi1iaXQgdmFsdWVzLiBVc2Ugd2l0aCAlOC44X3glOC44X3ggKi8KLQotI2RlZmluZSBBQ1BJX0ZPUk1BVF9VSU5UNjQoaSkgICAgICAgICAgIEFDUElfSElEV09SRChpKSwgQUNQSV9MT0RXT1JEKGkpCi0KLSNpZiBBQ1BJX01BQ0hJTkVfV0lEVEggPT0gNjQKLSNkZWZpbmUgQUNQSV9GT1JNQVRfTkFUSVZFX1VJTlQoaSkgICAgICBBQ1BJX0ZPUk1BVF9VSU5UNjQoaSkKLSNlbHNlCi0jZGVmaW5lIEFDUElfRk9STUFUX05BVElWRV9VSU5UKGkpICAgICAgMCwgKGkpCi0jZW5kaWYKLQotLyoKLSAqIE1hY3JvcyBmb3IgbW92aW5nIGRhdGEgYXJvdW5kIHRvL2Zyb20gYnVmZmVycyB0aGF0IGFyZSBwb3NzaWJseSB1bmFsaWduZWQuCi0gKiBJZiB0aGUgaGFyZHdhcmUgc3VwcG9ydHMgdGhlIHRyYW5zZmVyIG9mIHVuYWxpZ25lZCBkYXRhLCBqdXN0IGRvIHRoZSBzdG9yZS4KLSAqIE90aGVyd2lzZSwgd2UgaGF2ZSB0byBtb3ZlIG9uZSBieXRlIGF0IGEgdGltZS4KLSAqLwotI2lmZGVmIEFDUElfQklHX0VORElBTgotLyoKLSAqIE1hY3JvcyBmb3IgYmlnLWVuZGlhbiBtYWNoaW5lcwotICovCi0KLS8qIFRoZXNlIG1hY3JvcyByZXZlcnNlIHRoZSBieXRlcyBkdXJpbmcgdGhlIG1vdmUsIGNvbnZlcnRpbmcgbGl0dGxlLWVuZGlhbiB0byBiaWcgZW5kaWFuICovCi0KLQkJCSAgLyogQmlnIEVuZGlhbiAgICAgIDw9PSAgICAgICAgTGl0dGxlIEVuZGlhbiAqLwotCQkJICAvKiAgSGkuLi5MbyAgICAgICAgICAgICAgICAgICAgIExvLi4uSGkgICAgICovCi0vKiAxNi1iaXQgc291cmNlLCAxNi8zMi82NCBkZXN0aW5hdGlvbiAqLwotCi0jZGVmaW5lIEFDUElfTU9WRV8xNl9UT18xNihkLCBzKSAgICAgICAgeygoICB1OCAqKSh2b2lkICopKGQpKVswXSA9ICgodTggKikodm9pZCAqKShzKSlbMV07XAotCQkJCQkgICAoKCAgdTggKikodm9pZCAqKShkKSlbMV0gPSAoKHU4ICopKHZvaWQgKikocykpWzBdO30KLQotI2RlZmluZSBBQ1BJX01PVkVfMTZfVE9fMzIoZCwgcykgICAgICAgIHsoKih1MzIgKikodm9pZCAqKShkKSk9MDtcCi0JCQkJCQkJICAgKCh1OCAqKSh2b2lkICopKGQpKVsyXSA9ICgodTggKikodm9pZCAqKShzKSlbMV07XAotCQkJCQkJCSAgICgodTggKikodm9pZCAqKShkKSlbM10gPSAoKHU4ICopKHZvaWQgKikocykpWzBdO30KLQotI2RlZmluZSBBQ1BJX01PVkVfMTZfVE9fNjQoZCwgcykgICAgICAgIHsoKih1NjQgKikodm9pZCAqKShkKSk9MDtcCi0JCQkJCQkJCQkgKCh1OCAqKSh2b2lkICopKGQpKVs2XSA9ICgodTggKikodm9pZCAqKShzKSlbMV07XAotCQkJCQkJCQkJICgodTggKikodm9pZCAqKShkKSlbN10gPSAoKHU4ICopKHZvaWQgKikocykpWzBdO30KLQotLyogMzItYml0IHNvdXJjZSwgMTYvMzIvNjQgZGVzdGluYXRpb24gKi8KLQotI2RlZmluZSBBQ1BJX01PVkVfMzJfVE9fMTYoZCwgcykgICAgICAgIEFDUElfTU9WRV8xNl9UT18xNihkLCBzKQkvKiBUcnVuY2F0ZSB0byAxNiAqLwotCi0jZGVmaW5lIEFDUElfTU9WRV8zMl9UT18zMihkLCBzKSAgICAgICAgeygoICB1OCAqKSh2b2lkICopKGQpKVswXSA9ICgodTggKikodm9pZCAqKShzKSlbM107XAotCQkJCQkJCQkJCSAoKCAgdTggKikodm9pZCAqKShkKSlbMV0gPSAoKHU4ICopKHZvaWQgKikocykpWzJdO1wKLQkJCQkJCQkJCQkgKCggIHU4ICopKHZvaWQgKikoZCkpWzJdID0gKCh1OCAqKSh2b2lkICopKHMpKVsxXTtcCi0JCQkJCQkJCQkJICgoICB1OCAqKSh2b2lkICopKGQpKVszXSA9ICgodTggKikodm9pZCAqKShzKSlbMF07fQotCi0jZGVmaW5lIEFDUElfTU9WRV8zMl9UT182NChkLCBzKSAgICAgICAgeygqKHU2NCAqKSh2b2lkICopKGQpKT0wO1wKLQkJCQkJCQkJCQkgICAoKHU4ICopKHZvaWQgKikoZCkpWzRdID0gKCh1OCAqKSh2b2lkICopKHMpKVszXTtcCi0JCQkJCQkJCQkJICAgKCh1OCAqKSh2b2lkICopKGQpKVs1XSA9ICgodTggKikodm9pZCAqKShzKSlbMl07XAotCQkJCQkJCQkJCSAgICgodTggKikodm9pZCAqKShkKSlbNl0gPSAoKHU4ICopKHZvaWQgKikocykpWzFdO1wKLQkJCQkJCQkJCQkgICAoKHU4ICopKHZvaWQgKikoZCkpWzddID0gKCh1OCAqKSh2b2lkICopKHMpKVswXTt9Ci0KLS8qIDY0LWJpdCBzb3VyY2UsIDE2LzMyLzY0IGRlc3RpbmF0aW9uICovCi0KLSNkZWZpbmUgQUNQSV9NT1ZFXzY0X1RPXzE2KGQsIHMpICAgICAgICBBQ1BJX01PVkVfMTZfVE9fMTYoZCwgcykJLyogVHJ1bmNhdGUgdG8gMTYgKi8KLQotI2RlZmluZSBBQ1BJX01PVkVfNjRfVE9fMzIoZCwgcykgICAgICAgIEFDUElfTU9WRV8zMl9UT18zMihkLCBzKQkvKiBUcnVuY2F0ZSB0byAzMiAqLwotCi0jZGVmaW5lIEFDUElfTU9WRV82NF9UT182NChkLCBzKSAgICAgICAgeygoICB1OCAqKSh2b2lkICopKGQpKVswXSA9ICgodTggKikodm9pZCAqKShzKSlbN107XAotCQkJCQkJCQkJCSAoKCAgdTggKikodm9pZCAqKShkKSlbMV0gPSAoKHU4ICopKHZvaWQgKikocykpWzZdO1wKLQkJCQkJCQkJCQkgKCggIHU4ICopKHZvaWQgKikoZCkpWzJdID0gKCh1OCAqKSh2b2lkICopKHMpKVs1XTtcCi0JCQkJCQkJCQkJICgoICB1OCAqKSh2b2lkICopKGQpKVszXSA9ICgodTggKikodm9pZCAqKShzKSlbNF07XAotCQkJCQkJCQkJCSAoKCAgdTggKikodm9pZCAqKShkKSlbNF0gPSAoKHU4ICopKHZvaWQgKikocykpWzNdO1wKLQkJCQkJCQkJCQkgKCggIHU4ICopKHZvaWQgKikoZCkpWzVdID0gKCh1OCAqKSh2b2lkICopKHMpKVsyXTtcCi0JCQkJCQkJCQkJICgoICB1OCAqKSh2b2lkICopKGQpKVs2XSA9ICgodTggKikodm9pZCAqKShzKSlbMV07XAotCQkJCQkJCQkJCSAoKCAgdTggKikodm9pZCAqKShkKSlbN10gPSAoKHU4ICopKHZvaWQgKikocykpWzBdO30KLSNlbHNlCi0vKgotICogTWFjcm9zIGZvciBsaXR0bGUtZW5kaWFuIG1hY2hpbmVzCi0gKi8KLQotI2lmbmRlZiBBQ1BJX01JU0FMSUdOTUVOVF9OT1RfU1VQUE9SVEVECi0KLS8qIFRoZSBoYXJkd2FyZSBzdXBwb3J0cyB1bmFsaWduZWQgdHJhbnNmZXJzLCBqdXN0IGRvIHRoZSBsaXR0bGUtZW5kaWFuIG1vdmUgKi8KLQotLyogMTYtYml0IHNvdXJjZSwgMTYvMzIvNjQgZGVzdGluYXRpb24gKi8KLQotI2RlZmluZSBBQ1BJX01PVkVfMTZfVE9fMTYoZCwgcykgICAgICAgICoodTE2ICopKHZvaWQgKikoZCkgPSAqKHUxNiAqKSh2b2lkICopKHMpCi0jZGVmaW5lIEFDUElfTU9WRV8xNl9UT18zMihkLCBzKSAgICAgICAgKih1MzIgKikodm9pZCAqKShkKSA9ICoodTE2ICopKHZvaWQgKikocykKLSNkZWZpbmUgQUNQSV9NT1ZFXzE2X1RPXzY0KGQsIHMpICAgICAgICAqKHU2NCAqKSh2b2lkICopKGQpID0gKih1MTYgKikodm9pZCAqKShzKQotCi0vKiAzMi1iaXQgc291cmNlLCAxNi8zMi82NCBkZXN0aW5hdGlvbiAqLwotCi0jZGVmaW5lIEFDUElfTU9WRV8zMl9UT18xNihkLCBzKSAgICAgICAgQUNQSV9NT1ZFXzE2X1RPXzE2KGQsIHMpCS8qIFRydW5jYXRlIHRvIDE2ICovCi0jZGVmaW5lIEFDUElfTU9WRV8zMl9UT18zMihkLCBzKSAgICAgICAgKih1MzIgKikodm9pZCAqKShkKSA9ICoodTMyICopKHZvaWQgKikocykKLSNkZWZpbmUgQUNQSV9NT1ZFXzMyX1RPXzY0KGQsIHMpICAgICAgICAqKHU2NCAqKSh2b2lkICopKGQpID0gKih1MzIgKikodm9pZCAqKShzKQotCi0vKiA2NC1iaXQgc291cmNlLCAxNi8zMi82NCBkZXN0aW5hdGlvbiAqLwotCi0jZGVmaW5lIEFDUElfTU9WRV82NF9UT18xNihkLCBzKSAgICAgICAgQUNQSV9NT1ZFXzE2X1RPXzE2KGQsIHMpCS8qIFRydW5jYXRlIHRvIDE2ICovCi0jZGVmaW5lIEFDUElfTU9WRV82NF9UT18zMihkLCBzKSAgICAgICAgQUNQSV9NT1ZFXzMyX1RPXzMyKGQsIHMpCS8qIFRydW5jYXRlIHRvIDMyICovCi0jZGVmaW5lIEFDUElfTU9WRV82NF9UT182NChkLCBzKSAgICAgICAgKih1NjQgKikodm9pZCAqKShkKSA9ICoodTY0ICopKHZvaWQgKikocykKLQotI2Vsc2UKLS8qCi0gKiBUaGUgaGFyZHdhcmUgZG9lcyBub3Qgc3VwcG9ydCB1bmFsaWduZWQgdHJhbnNmZXJzLiBXZSBtdXN0IG1vdmUgdGhlCi0gKiBkYXRhIG9uZSBieXRlIGF0IGEgdGltZS4gVGhlc2UgbWFjcm9zIHdvcmsgd2hldGhlciB0aGUgc291cmNlIG9yCi0gKiB0aGUgZGVzdGluYXRpb24gKG9yIGJvdGgpIGlzL2FyZSB1bmFsaWduZWQuICAoTGl0dGxlLWVuZGlhbiBtb3ZlKQotICovCi0KLS8qIDE2LWJpdCBzb3VyY2UsIDE2LzMyLzY0IGRlc3RpbmF0aW9uICovCi0KLSNkZWZpbmUgQUNQSV9NT1ZFXzE2X1RPXzE2KGQsIHMpICAgICAgICB7KCggIHU4ICopKHZvaWQgKikoZCkpWzBdID0gKCh1OCAqKSh2b2lkICopKHMpKVswXTtcCi0JCQkJCQkJCQkJICgoICB1OCAqKSh2b2lkICopKGQpKVsxXSA9ICgodTggKikodm9pZCAqKShzKSlbMV07fQotCi0jZGVmaW5lIEFDUElfTU9WRV8xNl9UT18zMihkLCBzKSAgICAgICAgeygqKHUzMiAqKSh2b2lkICopKGQpKSA9IDA7IEFDUElfTU9WRV8xNl9UT18xNihkLCBzKTt9Ci0jZGVmaW5lIEFDUElfTU9WRV8xNl9UT182NChkLCBzKSAgICAgICAgeygqKHU2NCAqKSh2b2lkICopKGQpKSA9IDA7IEFDUElfTU9WRV8xNl9UT18xNihkLCBzKTt9Ci0KLS8qIDMyLWJpdCBzb3VyY2UsIDE2LzMyLzY0IGRlc3RpbmF0aW9uICovCi0KLSNkZWZpbmUgQUNQSV9NT1ZFXzMyX1RPXzE2KGQsIHMpICAgICAgICBBQ1BJX01PVkVfMTZfVE9fMTYoZCwgcykJLyogVHJ1bmNhdGUgdG8gMTYgKi8KLQotI2RlZmluZSBBQ1BJX01PVkVfMzJfVE9fMzIoZCwgcykgICAgICAgIHsoKCAgdTggKikodm9pZCAqKShkKSlbMF0gPSAoKHU4ICopKHZvaWQgKikocykpWzBdO1wKLQkJCQkJCQkJCQkgKCggIHU4ICopKHZvaWQgKikoZCkpWzFdID0gKCh1OCAqKSh2b2lkICopKHMpKVsxXTtcCi0JCQkJCQkJCQkJICgoICB1OCAqKSh2b2lkICopKGQpKVsyXSA9ICgodTggKikodm9pZCAqKShzKSlbMl07XAotCQkJCQkJCQkJCSAoKCAgdTggKikodm9pZCAqKShkKSlbM10gPSAoKHU4ICopKHZvaWQgKikocykpWzNdO30KLQotI2RlZmluZSBBQ1BJX01PVkVfMzJfVE9fNjQoZCwgcykgICAgICAgIHsoKih1NjQgKikodm9pZCAqKShkKSkgPSAwOyBBQ1BJX01PVkVfMzJfVE9fMzIoZCwgcyk7fQotCi0vKiA2NC1iaXQgc291cmNlLCAxNi8zMi82NCBkZXN0aW5hdGlvbiAqLwotCi0jZGVmaW5lIEFDUElfTU9WRV82NF9UT18xNihkLCBzKSAgICAgICAgQUNQSV9NT1ZFXzE2X1RPXzE2KGQsIHMpCS8qIFRydW5jYXRlIHRvIDE2ICovCi0jZGVmaW5lIEFDUElfTU9WRV82NF9UT18zMihkLCBzKSAgICAgICAgQUNQSV9NT1ZFXzMyX1RPXzMyKGQsIHMpCS8qIFRydW5jYXRlIHRvIDMyICovCi0jZGVmaW5lIEFDUElfTU9WRV82NF9UT182NChkLCBzKSAgICAgICAgeygoICB1OCAqKSh2b2lkICopKGQpKVswXSA9ICgodTggKikodm9pZCAqKShzKSlbMF07XAotCQkJCQkJCQkJCSAoKCAgdTggKikodm9pZCAqKShkKSlbMV0gPSAoKHU4ICopKHZvaWQgKikocykpWzFdO1wKLQkJCQkJCQkJCQkgKCggIHU4ICopKHZvaWQgKikoZCkpWzJdID0gKCh1OCAqKSh2b2lkICopKHMpKVsyXTtcCi0JCQkJCQkJCQkJICgoICB1OCAqKSh2b2lkICopKGQpKVszXSA9ICgodTggKikodm9pZCAqKShzKSlbM107XAotCQkJCQkJCQkJCSAoKCAgdTggKikodm9pZCAqKShkKSlbNF0gPSAoKHU4ICopKHZvaWQgKikocykpWzRdO1wKLQkJCQkJCQkJCQkgKCggIHU4ICopKHZvaWQgKikoZCkpWzVdID0gKCh1OCAqKSh2b2lkICopKHMpKVs1XTtcCi0JCQkJCQkJCQkJICgoICB1OCAqKSh2b2lkICopKGQpKVs2XSA9ICgodTggKikodm9pZCAqKShzKSlbNl07XAotCQkJCQkJCQkJCSAoKCAgdTggKikodm9pZCAqKShkKSlbN10gPSAoKHU4ICopKHZvaWQgKikocykpWzddO30KLSNlbmRpZgotI2VuZGlmCi0KLS8qIE1hY3JvcyBiYXNlZCBvbiBtYWNoaW5lIGludGVnZXIgd2lkdGggKi8KLQotI2lmIEFDUElfTUFDSElORV9XSURUSCA9PSAzMgotI2RlZmluZSBBQ1BJX01PVkVfU0laRV9UT18xNihkLCBzKSAgICAgICBBQ1BJX01PVkVfMzJfVE9fMTYoZCwgcykKLQotI2VsaWYgQUNQSV9NQUNISU5FX1dJRFRIID09IDY0Ci0jZGVmaW5lIEFDUElfTU9WRV9TSVpFX1RPXzE2KGQsIHMpICAgICAgIEFDUElfTU9WRV82NF9UT18xNihkLCBzKQotCi0jZWxzZQotI2Vycm9yIHVua25vd24gQUNQSV9NQUNISU5FX1dJRFRICi0jZW5kaWYKLQotLyoKLSAqIEZhc3QgcG93ZXItb2YtdHdvIG1hdGggbWFjcm9zIGZvciBub24tb3B0aW1pemVkIGNvbXBpbGVycwotICovCi0jZGVmaW5lIF9BQ1BJX0RJVih2YWx1ZSwgcG93ZXJfb2YyKSAgICAgICgodTMyKSAoKHZhbHVlKSA+PiAocG93ZXJfb2YyKSkpCi0jZGVmaW5lIF9BQ1BJX01VTCh2YWx1ZSwgcG93ZXJfb2YyKSAgICAgICgodTMyKSAoKHZhbHVlKSA8PCAocG93ZXJfb2YyKSkpCi0jZGVmaW5lIF9BQ1BJX01PRCh2YWx1ZSwgZGl2aXNvcikgICAgICAgICgodTMyKSAoKHZhbHVlKSAmICgoZGl2aXNvcikgLTEpKSkKLQotI2RlZmluZSBBQ1BJX0RJVl8yKGEpICAgICAgICAgICAgICAgICAgIF9BQ1BJX0RJVihhLCAxKQotI2RlZmluZSBBQ1BJX01VTF8yKGEpICAgICAgICAgICAgICAgICAgIF9BQ1BJX01VTChhLCAxKQotI2RlZmluZSBBQ1BJX01PRF8yKGEpICAgICAgICAgICAgICAgICAgIF9BQ1BJX01PRChhLCAyKQotCi0jZGVmaW5lIEFDUElfRElWXzQoYSkgICAgICAgICAgICAgICAgICAgX0FDUElfRElWKGEsIDIpCi0jZGVmaW5lIEFDUElfTVVMXzQoYSkgICAgICAgICAgICAgICAgICAgX0FDUElfTVVMKGEsIDIpCi0jZGVmaW5lIEFDUElfTU9EXzQoYSkgICAgICAgICAgICAgICAgICAgX0FDUElfTU9EKGEsIDQpCi0KLSNkZWZpbmUgQUNQSV9ESVZfOChhKSAgICAgICAgICAgICAgICAgICBfQUNQSV9ESVYoYSwgMykKLSNkZWZpbmUgQUNQSV9NVUxfOChhKSAgICAgICAgICAgICAgICAgICBfQUNQSV9NVUwoYSwgMykKLSNkZWZpbmUgQUNQSV9NT0RfOChhKSAgICAgICAgICAgICAgICAgICBfQUNQSV9NT0QoYSwgOCkKLQotI2RlZmluZSBBQ1BJX0RJVl8xNihhKSAgICAgICAgICAgICAgICAgIF9BQ1BJX0RJVihhLCA0KQotI2RlZmluZSBBQ1BJX01VTF8xNihhKSAgICAgICAgICAgICAgICAgIF9BQ1BJX01VTChhLCA0KQotI2RlZmluZSBBQ1BJX01PRF8xNihhKSAgICAgICAgICAgICAgICAgIF9BQ1BJX01PRChhLCAxNikKLQotI2RlZmluZSBBQ1BJX0RJVl8zMihhKSAgICAgICAgICAgICAgICAgIF9BQ1BJX0RJVihhLCA1KQotI2RlZmluZSBBQ1BJX01VTF8zMihhKSAgICAgICAgICAgICAgICAgIF9BQ1BJX01VTChhLCA1KQotI2RlZmluZSBBQ1BJX01PRF8zMihhKSAgICAgICAgICAgICAgICAgIF9BQ1BJX01PRChhLCAzMikKLQotLyoKLSAqIFJvdW5kaW5nIG1hY3JvcyAoUG93ZXIgb2YgdHdvIGJvdW5kYXJpZXMgb25seSkKLSAqLwotI2RlZmluZSBBQ1BJX1JPVU5EX0RPV04odmFsdWUsIGJvdW5kYXJ5KSAgICAgKCgoYWNwaV9zaXplKSh2YWx1ZSkpICYgXAotCQkJCQkJKH4oKChhY3BpX3NpemUpIGJvdW5kYXJ5KS0xKSkpCi0KLSNkZWZpbmUgQUNQSV9ST1VORF9VUCh2YWx1ZSwgYm91bmRhcnkpCSAgICAgKCgoKGFjcGlfc2l6ZSkodmFsdWUpKSArIFwKLQkJCQkJCSgoKGFjcGlfc2l6ZSkgYm91bmRhcnkpLTEpKSAmIFwKLQkJCQkJCSh+KCgoYWNwaV9zaXplKSBib3VuZGFyeSktMSkpKQotCi0vKiBOb3RlOiBzaXplb2YoYWNwaV9zaXplKSBldmFsdWF0ZXMgdG8gZWl0aGVyIDQgb3IgOCAoMzItIHZzIDY0LWJpdCBtb2RlKSAqLwotCi0jZGVmaW5lIEFDUElfUk9VTkRfRE9XTl9UT18zMkJJVChhKSAgICAgICAgIEFDUElfUk9VTkRfRE9XTihhLCA0KQotI2RlZmluZSBBQ1BJX1JPVU5EX0RPV05fVE9fNjRCSVQoYSkgICAgICAgICBBQ1BJX1JPVU5EX0RPV04oYSwgOCkKLSNkZWZpbmUgQUNQSV9ST1VORF9ET1dOX1RPX05BVElWRV9XT1JEKGEpICAgQUNQSV9ST1VORF9ET1dOKGEsIHNpemVvZihhY3BpX3NpemUpKQotCi0jZGVmaW5lIEFDUElfUk9VTkRfVVBfVE9fMzJCSVQoYSkgICAgICAgICAgIEFDUElfUk9VTkRfVVAoYSwgNCkKLSNkZWZpbmUgQUNQSV9ST1VORF9VUF9UT182NEJJVChhKSAgICAgICAgICAgQUNQSV9ST1VORF9VUChhLCA4KQotI2RlZmluZSBBQ1BJX1JPVU5EX1VQX1RPX05BVElWRV9XT1JEKGEpICAgICBBQ1BJX1JPVU5EX1VQKGEsIHNpemVvZihhY3BpX3NpemUpKQotCi0jZGVmaW5lIEFDUElfUk9VTkRfQklUU19VUF9UT19CWVRFUyhhKSAgICAgIEFDUElfRElWXzgoKGEpICsgNykKLSNkZWZpbmUgQUNQSV9ST1VORF9CSVRTX0RPV05fVE9fQllURVMoYSkgICAgQUNQSV9ESVZfOCgoYSkpCi0KLSNkZWZpbmUgQUNQSV9ST1VORF9VUF9UT18xSyhhKSAgICAgICAgICAgICAgKCgoYSkgKyAxMDIzKSA+PiAxMCkKLQotLyogR2VuZXJpYyAobm9uLXBvd2VyLW9mLXR3bykgcm91bmRpbmcgKi8KLQotI2RlZmluZSBBQ1BJX1JPVU5EX1VQX1RPKHZhbHVlLCBib3VuZGFyeSkgICAoKCh2YWx1ZSkgKyAoKGJvdW5kYXJ5KS0xKSkgLyAoYm91bmRhcnkpKQotCi0jZGVmaW5lIEFDUElfSVNfTUlTQUxJR05FRCh2YWx1ZSkJICAgICgoKGFjcGlfc2l6ZSkgdmFsdWUpICYgKHNpemVvZihhY3BpX3NpemUpLTEpKQotCi0vKgotICogQml0bWFzayBjcmVhdGlvbgotICogQml0IHBvc2l0aW9ucyBzdGFydCBhdCB6ZXJvLgotICogTUFTS19CSVRTX0FCT1ZFIGNyZWF0ZXMgYSBtYXNrIHN0YXJ0aW5nIEFUIHRoZSBwb3NpdGlvbiBhbmQgYWJvdmUKLSAqIE1BU0tfQklUU19CRUxPVyBjcmVhdGVzIGEgbWFzayBzdGFydGluZyBvbmUgYml0IEJFTE9XIHRoZSBwb3NpdGlvbgotICovCi0jZGVmaW5lIEFDUElfTUFTS19CSVRTX0FCT1ZFKHBvc2l0aW9uKSAgICAgICh+KChBQ1BJX0lOVEVHRVJfTUFYKSA8PCAoKHUzMikgKHBvc2l0aW9uKSkpKQotI2RlZmluZSBBQ1BJX01BU0tfQklUU19CRUxPVyhwb3NpdGlvbikgICAgICAoKEFDUElfSU5URUdFUl9NQVgpIDw8ICgodTMyKSAocG9zaXRpb24pKSkKLQotLyogQml0ZmllbGRzIHdpdGhpbiBBQ1BJIHJlZ2lzdGVycyAqLwotCi0jZGVmaW5lIEFDUElfUkVHSVNURVJfUFJFUEFSRV9CSVRTKHZhbCwgcG9zLCBtYXNrKSAgICAgICgodmFsIDw8IHBvcykgJiBtYXNrKQotI2RlZmluZSBBQ1BJX1JFR0lTVEVSX0lOU0VSVF9WQUxVRShyZWcsIHBvcywgbWFzaywgdmFsKSAgcmVnID0gKHJlZyAmICh+KG1hc2spKSkgfCBBQ1BJX1JFR0lTVEVSX1BSRVBBUkVfQklUUyh2YWwsIHBvcywgbWFzaykKLQotI2RlZmluZSBBQ1BJX0lOU0VSVF9CSVRTKHRhcmdldCwgbWFzaywgc291cmNlKSAgICAgICAgICB0YXJnZXQgPSAoKHRhcmdldCAmICh+KG1hc2spKSkgfCAoc291cmNlICYgbWFzaykpCi0KLS8qCi0gKiBBbiBzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSBjYW4gYXBwZWFyIGluIHNvbWUgY29udGV4dHMKLSAqIHdoZXJlIGEgcG9pbnRlciB0byBhbiB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0IGNhbiBhbHNvCi0gKiBhcHBlYXIuIFRoaXMgbWFjcm8gaXMgdXNlZCB0byBkaXN0aW5ndWlzaCB0aGVtLgotICoKLSAqIFRoZSAiRGVzY3JpcHRvciIgZmllbGQgaXMgdGhlIGZpcnN0IGZpZWxkIGluIGJvdGggc3RydWN0dXJlcy4KLSAqLwotI2RlZmluZSBBQ1BJX0dFVF9ERVNDUklQVE9SX1RZUEUoZCkgICAgICgoKHVuaW9uIGFjcGlfZGVzY3JpcHRvciAqKSh2b2lkICopKGQpKS0+Y29tbW9uLmRlc2NyaXB0b3JfdHlwZSkKLSNkZWZpbmUgQUNQSV9TRVRfREVTQ1JJUFRPUl9UWVBFKGQsIHQpICAoKCh1bmlvbiBhY3BpX2Rlc2NyaXB0b3IgKikodm9pZCAqKShkKSktPmNvbW1vbi5kZXNjcmlwdG9yX3R5cGUgPSB0KQotCi0vKiBNYWNybyB0byB0ZXN0IHRoZSBvYmplY3QgdHlwZSAqLwotCi0jZGVmaW5lIEFDUElfR0VUX09CSkVDVF9UWVBFKGQpICAgICAgICAgKCgodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKSh2b2lkICopKGQpKS0+Y29tbW9uLnR5cGUpCi0KLS8qCi0gKiBNYWNyb3MgZm9yIHRoZSBtYXN0ZXIgQU1MIG9wY29kZSB0YWJsZQotICovCi0jaWYgZGVmaW5lZCAoQUNQSV9ESVNBU1NFTUJMRVIpIHx8IGRlZmluZWQgKEFDUElfREVCVUdfT1VUUFVUKQotI2RlZmluZSBBQ1BJX09QKG5hbWUsIFBhcmdzLCBJYXJncywgb2JqX3R5cGUsIGNsYXNzLCB0eXBlLCBmbGFncykgXAotCXtuYW1lLCAodTMyKShQYXJncyksICh1MzIpKElhcmdzKSwgKHUzMikoZmxhZ3MpLCBvYmpfdHlwZSwgY2xhc3MsIHR5cGV9Ci0jZWxzZQotI2RlZmluZSBBQ1BJX09QKG5hbWUsIFBhcmdzLCBJYXJncywgb2JqX3R5cGUsIGNsYXNzLCB0eXBlLCBmbGFncykgXAotCXsodTMyKShQYXJncyksICh1MzIpKElhcmdzKSwgKHUzMikoZmxhZ3MpLCBvYmpfdHlwZSwgY2xhc3MsIHR5cGV9Ci0jZW5kaWYKLQotI2lmZGVmIEFDUElfRElTQVNTRU1CTEVSCi0jZGVmaW5lIEFDUElfRElTQVNNX09OTFlfTUVNQkVSUyhhKSAgICAgYTsKLSNlbHNlCi0jZGVmaW5lIEFDUElfRElTQVNNX09OTFlfTUVNQkVSUyhhKQotI2VuZGlmCi0KLSNkZWZpbmUgQVJHX1RZUEVfV0lEVEggICAgICAgICAgICAgICAgICA1Ci0jZGVmaW5lIEFSR18xKHgpICAgICAgICAgICAgICAgICAgICAgICAgKCh1MzIpKHgpKQotI2RlZmluZSBBUkdfMih4KSAgICAgICAgICAgICAgICAgICAgICAgICgodTMyKSh4KSA8PCAoMSAqIEFSR19UWVBFX1dJRFRIKSkKLSNkZWZpbmUgQVJHXzMoeCkgICAgICAgICAgICAgICAgICAgICAgICAoKHUzMikoeCkgPDwgKDIgKiBBUkdfVFlQRV9XSURUSCkpCi0jZGVmaW5lIEFSR180KHgpICAgICAgICAgICAgICAgICAgICAgICAgKCh1MzIpKHgpIDw8ICgzICogQVJHX1RZUEVfV0lEVEgpKQotI2RlZmluZSBBUkdfNSh4KSAgICAgICAgICAgICAgICAgICAgICAgICgodTMyKSh4KSA8PCAoNCAqIEFSR19UWVBFX1dJRFRIKSkKLSNkZWZpbmUgQVJHXzYoeCkgICAgICAgICAgICAgICAgICAgICAgICAoKHUzMikoeCkgPDwgKDUgKiBBUkdfVFlQRV9XSURUSCkpCi0KLSNkZWZpbmUgQVJHSV9MSVNUMShhKSAgICAgICAgICAgICAgICAgICAoQVJHXzEoYSkpCi0jZGVmaW5lIEFSR0lfTElTVDIoYSwgYikgICAgICAgICAgICAgICAgKEFSR18xKGIpfEFSR18yKGEpKQotI2RlZmluZSBBUkdJX0xJU1QzKGEsIGIsIGMpICAgICAgICAgICAgIChBUkdfMShjKXxBUkdfMihiKXxBUkdfMyhhKSkKLSNkZWZpbmUgQVJHSV9MSVNUNChhLCBiLCBjLCBkKSAgICAgICAgICAoQVJHXzEoZCl8QVJHXzIoYyl8QVJHXzMoYil8QVJHXzQoYSkpCi0jZGVmaW5lIEFSR0lfTElTVDUoYSwgYiwgYywgZCwgZSkgICAgICAgKEFSR18xKGUpfEFSR18yKGQpfEFSR18zKGMpfEFSR180KGIpfEFSR181KGEpKQotI2RlZmluZSBBUkdJX0xJU1Q2KGEsIGIsIGMsIGQsIGUsIGYpICAgIChBUkdfMShmKXxBUkdfMihlKXxBUkdfMyhkKXxBUkdfNChjKXxBUkdfNShiKXxBUkdfNihhKSkKLQotI2RlZmluZSBBUkdQX0xJU1QxKGEpICAgICAgICAgICAgICAgICAgIChBUkdfMShhKSkKLSNkZWZpbmUgQVJHUF9MSVNUMihhLCBiKSAgICAgICAgICAgICAgICAoQVJHXzEoYSl8QVJHXzIoYikpCi0jZGVmaW5lIEFSR1BfTElTVDMoYSwgYiwgYykgICAgICAgICAgICAgKEFSR18xKGEpfEFSR18yKGIpfEFSR18zKGMpKQotI2RlZmluZSBBUkdQX0xJU1Q0KGEsIGIsIGMsIGQpICAgICAgICAgIChBUkdfMShhKXxBUkdfMihiKXxBUkdfMyhjKXxBUkdfNChkKSkKLSNkZWZpbmUgQVJHUF9MSVNUNShhLCBiLCBjLCBkLCBlKSAgICAgICAoQVJHXzEoYSl8QVJHXzIoYil8QVJHXzMoYyl8QVJHXzQoZCl8QVJHXzUoZSkpCi0jZGVmaW5lIEFSR1BfTElTVDYoYSwgYiwgYywgZCwgZSwgZikgICAgKEFSR18xKGEpfEFSR18yKGIpfEFSR18zKGMpfEFSR180KGQpfEFSR181KGUpfEFSR182KGYpKQotCi0jZGVmaW5lIEdFVF9DVVJSRU5UX0FSR19UWVBFKGxpc3QpICAgICAgKGxpc3QgJiAoKHUzMikgMHgxRikpCi0jZGVmaW5lIElOQ1JFTUVOVF9BUkdfTElTVChsaXN0KSAgICAgICAgKGxpc3QgPj49ICgodTMyKSBBUkdfVFlQRV9XSURUSCkpCi0KLSNpZiBkZWZpbmVkIChBQ1BJX0RFQlVHX09VVFBVVCkgfHwgIWRlZmluZWQgKEFDUElfTk9fRVJST1JfTUVTU0FHRVMpCi0vKgotICogTW9kdWxlIG5hbWUgaXMgaW5jbHVkZSBpbiBib3RoIGRlYnVnIGFuZCBub24tZGVidWcgdmVyc2lvbnMgcHJpbWFyaWx5IGZvcgotICogZXJyb3IgbWVzc2FnZXMuIFRoZSBfX0ZJTEVfXyBtYWNybyBpcyBub3QgdmVyeSB1c2VmdWwgZm9yIHRoaXMsIGJlY2F1c2UgaXQKLSAqIG9mdGVuIGluY2x1ZGVzIHRoZSBlbnRpcmUgcGF0aG5hbWUgdG8gdGhlIG1vZHVsZQotICovCi0jZGVmaW5lIEFDUElfTU9EVUxFX05BTUUobmFtZSkJCXN0YXRpYyBjb25zdCBjaGFyIEFDUElfVU5VU0VEX1ZBUiBfYWNwaV9tb2R1bGVfbmFtZVtdID0gbmFtZTsKLSNlbHNlCi0jZGVmaW5lIEFDUElfTU9EVUxFX05BTUUobmFtZSkKLSNlbmRpZgotCi0vKgotICogQXNjaWkgZXJyb3IgbWVzc2FnZXMgY2FuIGJlIGNvbmZpZ3VyZWQgb3V0Ci0gKi8KLSNpZm5kZWYgQUNQSV9OT19FUlJPUl9NRVNTQUdFUwotI2RlZmluZSBBRV9JTkZPICAgICAgICAgICAgICAgICAgICAgICAgIF9hY3BpX21vZHVsZV9uYW1lLCBfX0xJTkVfXwotCi0vKgotICogRXJyb3IgcmVwb3J0aW5nLiBDYWxsZXJzIG1vZHVsZSBhbmQgbGluZSBudW1iZXIgYXJlIGluc2VydGVkIGJ5IEFFX0lORk8sCi0gKiB0aGUgcGxpc3QgY29udGFpbnMgYSBzZXQgb2YgcGFyZW5zIHRvIGFsbG93IHZhcmlhYmxlLWxlbmd0aCBsaXN0cy4KLSAqIFRoZXNlIG1hY3JvcyBhcmUgdXNlZCBmb3IgYm90aCB0aGUgZGVidWcgYW5kIG5vbi1kZWJ1ZyB2ZXJzaW9ucyBvZiB0aGUgY29kZS4KLSAqLwotI2RlZmluZSBBQ1BJX0lORk8ocGxpc3QpICAgICAgICAgICAgICAgIGFjcGlfdXRfaW5mbyBwbGlzdAotI2RlZmluZSBBQ1BJX1dBUk5JTkcocGxpc3QpICAgICAgICAgICAgIGFjcGlfdXRfd2FybmluZyBwbGlzdAotI2RlZmluZSBBQ1BJX0VYQ0VQVElPTihwbGlzdCkgICAgICAgICAgIGFjcGlfdXRfZXhjZXB0aW9uIHBsaXN0Ci0jZGVmaW5lIEFDUElfRVJST1IocGxpc3QpICAgICAgICAgICAgICAgYWNwaV91dF9lcnJvciBwbGlzdAotI2RlZmluZSBBQ1BJX0VSUk9SX05BTUVTUEFDRShzLCBlKSAgICAgIGFjcGlfbnNfcmVwb3J0X2Vycm9yIChBRV9JTkZPLCBzLCBlKTsKLSNkZWZpbmUgQUNQSV9FUlJPUl9NRVRIT0QocywgbiwgcCwgZSkgICBhY3BpX25zX3JlcG9ydF9tZXRob2RfZXJyb3IgKEFFX0lORk8sIHMsIG4sIHAsIGUpOwotCi0jZWxzZQotCi0vKiBObyBlcnJvciBtZXNzYWdlcyAqLwotCi0jZGVmaW5lIEFDUElfSU5GTyhwbGlzdCkKLSNkZWZpbmUgQUNQSV9XQVJOSU5HKHBsaXN0KQotI2RlZmluZSBBQ1BJX0VYQ0VQVElPTihwbGlzdCkKLSNkZWZpbmUgQUNQSV9FUlJPUihwbGlzdCkKLSNkZWZpbmUgQUNQSV9FUlJPUl9OQU1FU1BBQ0UocywgZSkKLSNkZWZpbmUgQUNQSV9FUlJPUl9NRVRIT0QocywgbiwgcCwgZSkKLSNlbmRpZgotCi0vKgotICogRGVidWcgbWFjcm9zIHRoYXQgYXJlIGNvbmRpdGlvbmFsbHkgY29tcGlsZWQKLSAqLwotI2lmZGVmIEFDUElfREVCVUdfT1VUUFVUCi0KLS8qCi0gKiBDb21tb24gcGFyYW1ldGVycyB1c2VkIGZvciBkZWJ1ZyBvdXRwdXQgZnVuY3Rpb25zOgotICogbGluZSBudW1iZXIsIGZ1bmN0aW9uIG5hbWUsIG1vZHVsZShmaWxlKSBuYW1lLCBjb21wb25lbnQgSUQKLSAqLwotI2RlZmluZSBBQ1BJX0RFQlVHX1BBUkFNRVRFUlMgICAgICAgICAgIF9fTElORV9fLCBBQ1BJX0dFVF9GVU5DVElPTl9OQU1FLCBfYWNwaV9tb2R1bGVfbmFtZSwgX0NPTVBPTkVOVAotCi0vKgotICogRnVuY3Rpb24gZW50cnkgdHJhY2luZwotICovCi0KLS8qCi0gKiBJZiBBQ1BJX0dFVF9GVU5DVElPTl9OQU1FIHdhcyBub3QgZGVmaW5lZCBpbiB0aGUgY29tcGlsZXItZGVwZW5kZW50IGhlYWRlciwKLSAqIGRlZmluZSBpdCBub3cuIFRoaXMgaXMgdGhlIGNhc2Ugd2hlcmUgdGhlcmUgdGhlIGNvbXBpbGVyIGRvZXMgbm90IHN1cHBvcnQKLSAqIGEgX19mdW5jX18gbWFjcm8gb3IgZXF1aXZhbGVudC4KLSAqLwotI2lmbmRlZiBBQ1BJX0dFVF9GVU5DVElPTl9OQU1FCi0jZGVmaW5lIEFDUElfR0VUX0ZVTkNUSU9OX05BTUUgICAgICAgICAgX2FjcGlfZnVuY3Rpb25fbmFtZQotLyoKLSAqIFRoZSBOYW1lIHBhcmFtZXRlciBzaG91bGQgYmUgdGhlIHByb2NlZHVyZSBuYW1lIGFzIGEgcXVvdGVkIHN0cmluZy4KLSAqIFRoZSBmdW5jdGlvbiBuYW1lIGlzIGFsc28gdXNlZCBieSB0aGUgZnVuY3Rpb24gZXhpdCBtYWNyb3MgYmVsb3cuCi0gKiBOb3RlOiAoY29uc3QgY2hhcikgaXMgdXNlZCB0byBiZSBjb21wYXRpYmxlIHdpdGggdGhlIGRlYnVnIGludGVyZmFjZXMKLSAqIGFuZCBtYWNyb3Mgc3VjaCBhcyBfX2Z1bmNfXy4KLSAqLwotI2RlZmluZSBBQ1BJX0ZVTkNUSU9OX05BTUUobmFtZSkJc3RhdGljIGNvbnN0IGNoYXIgX2FjcGlfZnVuY3Rpb25fbmFtZVtdID0gI25hbWU7Ci0KLSNlbHNlCi0vKiBDb21waWxlciBzdXBwb3J0cyBfX2Z1bmNfXyAob3IgZXF1aXZhbGVudCkgLS0gSWdub3JlIHRoaXMgbWFjcm8gKi8KLQotI2RlZmluZSBBQ1BJX0ZVTkNUSU9OX05BTUUobmFtZSkKLSNlbmRpZgotCi0jaWZkZWYgQ09ORklHX0FDUElfREVCVUdfRlVOQ19UUkFDRQotCi0jZGVmaW5lIEFDUElfRlVOQ1RJT05fVFJBQ0UoYSkgICAgICAgICAgQUNQSV9GVU5DVElPTl9OQU1FKGEpIFwKLQkJCSAgYWNwaV91dF90cmFjZShBQ1BJX0RFQlVHX1BBUkFNRVRFUlMpCi0jZGVmaW5lIEFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKGEsIGIpICAgQUNQSV9GVU5DVElPTl9OQU1FKGEpIFwKLQkJCQkJICAgYWNwaV91dF90cmFjZV9wdHIoQUNQSV9ERUJVR19QQVJBTUVURVJTLCAodm9pZCAqKWIpCi0jZGVmaW5lIEFDUElfRlVOQ1RJT05fVFJBQ0VfVTMyKGEsIGIpICAgQUNQSV9GVU5DVElPTl9OQU1FKGEpIFwKLQkJCQkJCQkgYWNwaV91dF90cmFjZV91MzIoQUNQSV9ERUJVR19QQVJBTUVURVJTLCAodTMyKWIpCi0jZGVmaW5lIEFDUElfRlVOQ1RJT05fVFJBQ0VfU1RSKGEsIGIpICAgQUNQSV9GVU5DVElPTl9OQU1FKGEpIFwKLQkJCQkJCQkJCSAgYWNwaV91dF90cmFjZV9zdHIoQUNQSV9ERUJVR19QQVJBTUVURVJTLCAoY2hhciAqKWIpCi0KLSNkZWZpbmUgQUNQSV9GVU5DVElPTl9FTlRSWSgpICAgICAgICAgICBhY3BpX3V0X3RyYWNrX3N0YWNrX3B0cigpCi0KLS8qCi0gKiBGdW5jdGlvbiBleGl0IHRyYWNpbmcuCi0gKiBXQVJOSU5HOiBUaGVzZSBtYWNyb3MgaW5jbHVkZSBhIHJldHVybiBzdGF0ZW1lbnQuIFRoaXMgaXMgdXN1YWxseSBjb25zaWRlcmVkCi0gKiBiYWQgZm9ybSwgYnV0IGhhdmluZyBhIHNlcGFyYXRlIGV4aXQgbWFjcm8gaXMgdmVyeSB1Z2x5IGFuZCBkaWZmaWN1bHQgdG8gbWFpbnRhaW4uCi0gKiBPbmUgb2YgdGhlIEZVTkNUSU9OX1RSQUNFIG1hY3JvcyBhYm92ZSBtdXN0IGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGVzZSBtYWNyb3MKLSAqIHNvIHRoYXQgIl9BY3BpRnVuY3Rpb25OYW1lIiBpcyBkZWZpbmVkLgotICoKLSAqIE5vdGU6IHRoZSBET19XSElMRTAgbWFjcm8gaXMgdXNlZCB0byBwcmV2ZW50IHNvbWUgY29tcGlsZXJzIGZyb20gY29tcGxhaW5pbmcKLSAqIGFib3V0IHRoZXNlIGNvbnN0cnVjdHMuCi0gKi8KLSNpZmRlZiBBQ1BJX1VTRV9ET19XSElMRV8wCi0jZGVmaW5lIEFDUElfRE9fV0hJTEUwKGEpICAgICAgICAgICAgICAgZG8gYSB3aGlsZSgwKQotI2Vsc2UKLSNkZWZpbmUgQUNQSV9ET19XSElMRTAoYSkgICAgICAgICAgICAgICBhCi0jZW5kaWYKLQotI2RlZmluZSByZXR1cm5fVk9JRCAgICAgICAgICAgICAgICAgICAgIEFDUElfRE9fV0hJTEUwICh7IFwKLQkJCQkJCQkJCQkJYWNwaV91dF9leGl0IChBQ1BJX0RFQlVHX1BBUkFNRVRFUlMpOyBcCi0JCQkJCQkJCQkJCXJldHVybjt9KQotLyoKLSAqIFRoZXJlIGFyZSB0d28gdmVyc2lvbnMgb2YgbW9zdCBvZiB0aGUgcmV0dXJuIG1hY3Jvcy4gVGhlIGRlZmF1bHQgdmVyc2lvbiBpcwotICogc2FmZXIsIHNpbmNlIGl0IGF2b2lkcyBzaWRlLWVmZmVjdHMgYnkgZ3VhcmFudGVlaW5nIHRoYXQgdGhlIGFyZ3VtZW50IHdpbGwKLSAqIG5vdCBiZSBldmFsdWF0ZWQgdHdpY2UuCi0gKgotICogQSBsZXNzLXNhZmUgdmVyc2lvbiBvZiB0aGUgbWFjcm9zIGlzIHByb3ZpZGVkIGZvciBvcHRpb25hbCB1c2UgaWYgdGhlCi0gKiBjb21waWxlciB1c2VzIGV4Y2Vzc2l2ZSBDUFUgc3RhY2sgKGZvciBleGFtcGxlLCB0aGlzIG1heSBoYXBwZW4gaW4gdGhlCi0gKiBkZWJ1ZyBjYXNlIGlmIGNvZGUgb3B0aW16YXRpb24gaXMgZGlzYWJsZWQuKQotICovCi0jaWZuZGVmIEFDUElfU0lNUExFX1JFVFVSTl9NQUNST1MKLQotI2RlZmluZSByZXR1cm5fQUNQSV9TVEFUVVMocykgICAgICAgICAgIEFDUElfRE9fV0hJTEUwICh7IFwKLQkJCQkJCQkJCQkJcmVnaXN0ZXIgYWNwaV9zdGF0dXMgX3MgPSAocyk7IFwKLQkJCQkJCQkJCQkJYWNwaV91dF9zdGF0dXNfZXhpdCAoQUNQSV9ERUJVR19QQVJBTUVURVJTLCBfcyk7IFwKLQkJCQkJCQkJCQkJcmV0dXJuIChfcyk7IH0pCi0jZGVmaW5lIHJldHVybl9QVFIocykgICAgICAgICAgICAgICAgICAgQUNQSV9ET19XSElMRTAgKHsgXAotCQkJCQkJCQkJCQlyZWdpc3RlciB2b2lkICpfcyA9ICh2b2lkICopIChzKTsgXAotCQkJCQkJCQkJCQlhY3BpX3V0X3B0cl9leGl0IChBQ1BJX0RFQlVHX1BBUkFNRVRFUlMsICh1OCAqKSBfcyk7IFwKLQkJCQkJCQkJCQkJcmV0dXJuIChfcyk7IH0pCi0jZGVmaW5lIHJldHVybl9WQUxVRShzKSAgICAgICAgICAgICAgICAgQUNQSV9ET19XSElMRTAgKHsgXAotCQkJCQkJCQkJCQlyZWdpc3RlciBhY3BpX2ludGVnZXIgX3MgPSAocyk7IFwKLQkJCQkJCQkJCQkJYWNwaV91dF92YWx1ZV9leGl0IChBQ1BJX0RFQlVHX1BBUkFNRVRFUlMsIF9zKTsgXAotCQkJCQkJCQkJCQlyZXR1cm4gKF9zKTsgfSkKLSNkZWZpbmUgcmV0dXJuX1VJTlQ4KHMpICAgICAgICAgICAgICAgICBBQ1BJX0RPX1dISUxFMCAoeyBcCi0JCQkJCQkJCQkJCXJlZ2lzdGVyIHU4IF9zID0gKHU4KSAocyk7IFwKLQkJCQkJCQkJCQkJYWNwaV91dF92YWx1ZV9leGl0IChBQ1BJX0RFQlVHX1BBUkFNRVRFUlMsIChhY3BpX2ludGVnZXIpIF9zKTsgXAotCQkJCQkJCQkJCQlyZXR1cm4gKF9zKTsgfSkKLSNkZWZpbmUgcmV0dXJuX1VJTlQzMihzKSAgICAgICAgICAgICAgICBBQ1BJX0RPX1dISUxFMCAoeyBcCi0JCQkJCQkJCQkJCXJlZ2lzdGVyIHUzMiBfcyA9ICh1MzIpIChzKTsgXAotCQkJCQkJCQkJCQlhY3BpX3V0X3ZhbHVlX2V4aXQgKEFDUElfREVCVUdfUEFSQU1FVEVSUywgKGFjcGlfaW50ZWdlcikgX3MpOyBcCi0JCQkJCQkJCQkJCXJldHVybiAoX3MpOyB9KQotI2Vsc2UJCQkJLyogVXNlIG9yaWdpbmFsIGxlc3Mtc2FmZSBtYWNyb3MgKi8KLQotI2RlZmluZSByZXR1cm5fQUNQSV9TVEFUVVMocykgICAgICAgICAgIEFDUElfRE9fV0hJTEUwICh7IFwKLQkJCQkJCQkJCQkJYWNwaV91dF9zdGF0dXNfZXhpdCAoQUNQSV9ERUJVR19QQVJBTUVURVJTLCAocykpOyBcCi0JCQkJCQkJCQkJCXJldHVybigocykpOyB9KQotI2RlZmluZSByZXR1cm5fUFRSKHMpICAgICAgICAgICAgICAgICAgIEFDUElfRE9fV0hJTEUwICh7IFwKLQkJCQkJCQkJCQkJYWNwaV91dF9wdHJfZXhpdCAoQUNQSV9ERUJVR19QQVJBTUVURVJTLCAodTggKikgKHMpKTsgXAotCQkJCQkJCQkJCQlyZXR1cm4oKHMpKTsgfSkKLSNkZWZpbmUgcmV0dXJuX1ZBTFVFKHMpICAgICAgICAgICAgICAgICBBQ1BJX0RPX1dISUxFMCAoeyBcCi0JCQkJCQkJCQkJCWFjcGlfdXRfdmFsdWVfZXhpdCAoQUNQSV9ERUJVR19QQVJBTUVURVJTLCAoYWNwaV9pbnRlZ2VyKSAocykpOyBcCi0JCQkJCQkJCQkJCXJldHVybigocykpOyB9KQotI2RlZmluZSByZXR1cm5fVUlOVDgocykgICAgICAgICAgICAgICAgIHJldHVybl9WQUxVRShzKQotI2RlZmluZSByZXR1cm5fVUlOVDMyKHMpICAgICAgICAgICAgICAgIHJldHVybl9WQUxVRShzKQotCi0jZW5kaWYJCQkJLyogQUNQSV9TSU1QTEVfUkVUVVJOX01BQ1JPUyAqLwotCi0jZWxzZSAvKiAhQ09ORklHX0FDUElfREVCVUdfRlVOQ19UUkFDRSAqLwotCi0jZGVmaW5lIEFDUElfRlVOQ1RJT05fVFJBQ0UoYSkKLSNkZWZpbmUgQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIoYSxiKQotI2RlZmluZSBBQ1BJX0ZVTkNUSU9OX1RSQUNFX1UzMihhLGIpCi0jZGVmaW5lIEFDUElfRlVOQ1RJT05fVFJBQ0VfU1RSKGEsYikKLSNkZWZpbmUgQUNQSV9GVU5DVElPTl9FWElUCi0jZGVmaW5lIEFDUElfRlVOQ1RJT05fU1RBVFVTX0VYSVQocykKLSNkZWZpbmUgQUNQSV9GVU5DVElPTl9WQUxVRV9FWElUKHMpCi0jZGVmaW5lIEFDUElfRlVOQ1RJT05fVFJBQ0UoYSkKLSNkZWZpbmUgQUNQSV9GVU5DVElPTl9FTlRSWSgpCi0KLSNkZWZpbmUgcmV0dXJuX1ZPSUQgICAgICAgICAgICAgICAgICAgICByZXR1cm4KLSNkZWZpbmUgcmV0dXJuX0FDUElfU1RBVFVTKHMpICAgICAgICAgICByZXR1cm4ocykKLSNkZWZpbmUgcmV0dXJuX1ZBTFVFKHMpICAgICAgICAgICAgICAgICByZXR1cm4ocykKLSNkZWZpbmUgcmV0dXJuX1VJTlQ4KHMpICAgICAgICAgICAgICAgICByZXR1cm4ocykKLSNkZWZpbmUgcmV0dXJuX1VJTlQzMihzKSAgICAgICAgICAgICAgICByZXR1cm4ocykKLSNkZWZpbmUgcmV0dXJuX1BUUihzKSAgICAgICAgICAgICAgICAgICByZXR1cm4ocykKLQotI2VuZGlmIC8qIENPTkZJR19BQ1BJX0RFQlVHX0ZVTkNfVFJBQ0UgKi8KLQotLyogQ29uZGl0aW9uYWwgZXhlY3V0aW9uICovCi0KLSNkZWZpbmUgQUNQSV9ERUJVR19FWEVDKGEpICAgICAgICAgICAgICBhCi0jZGVmaW5lIEFDUElfTk9STUFMX0VYRUMoYSkKLQotI2RlZmluZSBBQ1BJX0RFQlVHX0RFRklORShhKSAgICAgICAgICAgIGE7Ci0jZGVmaW5lIEFDUElfREVCVUdfT05MWV9NRU1CRVJTKGEpICAgICAgYTsKLSNkZWZpbmUgX1ZFUkJPU0VfU1RSVUNUVVJFUwotCi0vKiBTdGFjayBhbmQgYnVmZmVyIGR1bXBpbmcgKi8KLQotI2RlZmluZSBBQ1BJX0RVTVBfU1RBQ0tfRU5UUlkoYSkgICAgICAgIGFjcGlfZXhfZHVtcF9vcGVyYW5kKChhKSwgMCkKLSNkZWZpbmUgQUNQSV9EVU1QX09QRVJBTkRTKGEsIGIsIGMpCWFjcGlfZXhfZHVtcF9vcGVyYW5kcyhhLCBiLCBjKQotCi0jZGVmaW5lIEFDUElfRFVNUF9FTlRSWShhLCBiKSAgICAgICAgICAgYWNwaV9uc19kdW1wX2VudHJ5IChhLCBiKQotI2RlZmluZSBBQ1BJX0RVTVBfUEFUSE5BTUUoYSwgYiwgYywgZCkgIGFjcGlfbnNfZHVtcF9wYXRobmFtZShhLCBiLCBjLCBkKQotI2RlZmluZSBBQ1BJX0RVTVBfUkVTT1VSQ0VfTElTVChhKSAgICAgIGFjcGlfcnNfZHVtcF9yZXNvdXJjZV9saXN0KGEpCi0jZGVmaW5lIEFDUElfRFVNUF9CVUZGRVIoYSwgYikgICAgICAgICAgYWNwaV91dF9kdW1wX2J1ZmZlcigodTggKikgYSwgYiwgREJfQllURV9ESVNQTEFZLCBfQ09NUE9ORU5UKQotCi0vKgotICogTWFzdGVyIGRlYnVnIHByaW50IG1hY3JvcwotICogUHJpbnQgaWZmOgotICogICAgMSkgRGVidWcgcHJpbnQgZm9yIHRoZSBjdXJyZW50IGNvbXBvbmVudCBpcyBlbmFibGVkCi0gKiAgICAyKSBEZWJ1ZyBlcnJvciBsZXZlbCBvciB0cmFjZSBsZXZlbCBmb3IgdGhlIHByaW50IHN0YXRlbWVudCBpcyBlbmFibGVkCi0gKi8KLSNkZWZpbmUgQUNQSV9ERUJVR19QUklOVChwbGlzdCkgICAgICAgICBhY3BpX3V0X2RlYnVnX3ByaW50IHBsaXN0Ci0jZGVmaW5lIEFDUElfREVCVUdfUFJJTlRfUkFXKHBsaXN0KSAgICAgYWNwaV91dF9kZWJ1Z19wcmludF9yYXcgcGxpc3QKLQotI2Vsc2UKLS8qCi0gKiBUaGlzIGlzIHRoZSBub24tZGVidWcgY2FzZSAtLSBtYWtlIGV2ZXJ5dGhpbmcgZ28gYXdheSwKLSAqIGxlYXZpbmcgbm8gZXhlY3V0YWJsZSBkZWJ1ZyBjb2RlIQotICovCi0jZGVmaW5lIEFDUElfREVCVUdfRVhFQyhhKQotI2RlZmluZSBBQ1BJX05PUk1BTF9FWEVDKGEpICAgICAgICAgICAgIGE7Ci0KLSNkZWZpbmUgQUNQSV9ERUJVR19ERUZJTkUoYSkJCWRvIHsgfSB3aGlsZSgwKQotI2RlZmluZSBBQ1BJX0RFQlVHX09OTFlfTUVNQkVSUyhhKQlkbyB7IH0gd2hpbGUoMCkKLSNkZWZpbmUgQUNQSV9GVU5DVElPTl9OQU1FKGEpCQlkbyB7IH0gd2hpbGUoMCkKLSNkZWZpbmUgQUNQSV9GVU5DVElPTl9UUkFDRShhKQkJZG8geyB9IHdoaWxlKDApCi0jZGVmaW5lIEFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKGEsIGIpCWRvIHsgfSB3aGlsZSgwKQotI2RlZmluZSBBQ1BJX0ZVTkNUSU9OX1RSQUNFX1UzMihhLCBiKQlkbyB7IH0gd2hpbGUoMCkKLSNkZWZpbmUgQUNQSV9GVU5DVElPTl9UUkFDRV9TVFIoYSwgYikJZG8geyB9IHdoaWxlKDApCi0jZGVmaW5lIEFDUElfRlVOQ1RJT05fRVhJVAkJZG8geyB9IHdoaWxlKDApCi0jZGVmaW5lIEFDUElfRlVOQ1RJT05fU1RBVFVTX0VYSVQocykJZG8geyB9IHdoaWxlKDApCi0jZGVmaW5lIEFDUElfRlVOQ1RJT05fVkFMVUVfRVhJVChzKQlkbyB7IH0gd2hpbGUoMCkKLSNkZWZpbmUgQUNQSV9GVU5DVElPTl9FTlRSWSgpCQlkbyB7IH0gd2hpbGUoMCkKLSNkZWZpbmUgQUNQSV9EVU1QX1NUQUNLX0VOVFJZKGEpCWRvIHsgfSB3aGlsZSgwKQotI2RlZmluZSBBQ1BJX0RVTVBfT1BFUkFORFMoYSwgYiwgYykgICAgIGRvIHsgfSB3aGlsZSgwKQotI2RlZmluZSBBQ1BJX0RVTVBfRU5UUlkoYSwgYikJCWRvIHsgfSB3aGlsZSgwKQotI2RlZmluZSBBQ1BJX0RVTVBfVEFCTEVTKGEsIGIpCQlkbyB7IH0gd2hpbGUoMCkKLSNkZWZpbmUgQUNQSV9EVU1QX1BBVEhOQU1FKGEsIGIsIGMsIGQpCWRvIHsgfSB3aGlsZSgwKQotI2RlZmluZSBBQ1BJX0RVTVBfUkVTT1VSQ0VfTElTVChhKQlkbyB7IH0gd2hpbGUoMCkKLSNkZWZpbmUgQUNQSV9EVU1QX0JVRkZFUihhLCBiKQkJZG8geyB9IHdoaWxlKDApCi0jZGVmaW5lIEFDUElfREVCVUdfUFJJTlQocGwpCQlkbyB7IH0gd2hpbGUoMCkKLSNkZWZpbmUgQUNQSV9ERUJVR19QUklOVF9SQVcocGwpCWRvIHsgfSB3aGlsZSgwKQotCi0jZGVmaW5lIHJldHVybl9WT0lEICAgICAgICAgICAgICAgICAgICAgcmV0dXJuCi0jZGVmaW5lIHJldHVybl9BQ1BJX1NUQVRVUyhzKSAgICAgICAgICAgcmV0dXJuKHMpCi0jZGVmaW5lIHJldHVybl9WQUxVRShzKSAgICAgICAgICAgICAgICAgcmV0dXJuKHMpCi0jZGVmaW5lIHJldHVybl9VSU5UOChzKSAgICAgICAgICAgICAgICAgcmV0dXJuKHMpCi0jZGVmaW5lIHJldHVybl9VSU5UMzIocykgICAgICAgICAgICAgICAgcmV0dXJuKHMpCi0jZGVmaW5lIHJldHVybl9QVFIocykgICAgICAgICAgICAgICAgICAgcmV0dXJuKHMpCi0KLSNlbmRpZgotCi0vKgotICogU29tZSBjb2RlIG9ubHkgZ2V0cyBleGVjdXRlZCB3aGVuIHRoZSBkZWJ1Z2dlciBpcyBidWlsdCBpbi4KLSAqIE5vdGUgdGhhdCB0aGlzIGlzIGVudGlyZWx5IGluZGVwZW5kZW50IG9mIHdoZXRoZXIgdGhlCi0gKiBERUJVR19QUklOVCBzdHVmZiAoc2V0IGJ5IEFDUElfREVCVUdfT1VUUFVUKSBpcyBvbiwgb3Igbm90LgotICovCi0jaWZkZWYgQUNQSV9ERUJVR0dFUgotI2RlZmluZSBBQ1BJX0RFQlVHR0VSX0VYRUMoYSkgICAgICAgICAgIGEKLSNlbHNlCi0jZGVmaW5lIEFDUElfREVCVUdHRVJfRVhFQyhhKQotI2VuZGlmCi0KLSNpZmRlZiBBQ1BJX0RFQlVHX09VVFBVVAotLyoKLSAqIDEpIFNldCBuYW1lIHRvIGJsYW5rcwotICogMikgQ29weSB0aGUgb2JqZWN0IG5hbWUKLSAqLwotI2RlZmluZSBBQ1BJX0FERF9PQkpFQ1RfTkFNRShhLGIpICAgICAgIEFDUElfTUVNU0VUIChhLT5jb21tb24ubmFtZSwgJyAnLCBzaXplb2YgKGEtPmNvbW1vbi5uYW1lKSk7XAotCQkJCQkJCQkJCUFDUElfU1RSTkNQWSAoYS0+Y29tbW9uLm5hbWUsIGFjcGlfZ2JsX25zX3R5cGVfbmFtZXNbYl0sIHNpemVvZiAoYS0+Y29tbW9uLm5hbWUpKQotI2Vsc2UKLQotI2RlZmluZSBBQ1BJX0FERF9PQkpFQ1RfTkFNRShhLGIpCi0jZW5kaWYKLQotLyoKLSAqIE1lbW9yeSBhbGxvY2F0aW9uIHRyYWNraW5nIChERUJVRyBPTkxZKQotICovCi0jZGVmaW5lIEFDUElfTUVNX1BBUkFNRVRFUlMgICAgICAgICBfQ09NUE9ORU5ULCBfYWNwaV9tb2R1bGVfbmFtZSwgX19MSU5FX18KLQotI2lmbmRlZiBBQ1BJX0RCR19UUkFDS19BTExPQ0FUSU9OUwotCi0vKiBNZW1vcnkgYWxsb2NhdGlvbiAqLwotCi0jaWZuZGVmIEFDUElfQUxMT0NBVEUKLSNkZWZpbmUgQUNQSV9BTExPQ0FURShhKSAgICAgICAgICAgIGFjcGlfdXRfYWxsb2NhdGUoKGFjcGlfc2l6ZSkoYSksIEFDUElfTUVNX1BBUkFNRVRFUlMpCi0jZW5kaWYKLSNpZm5kZWYgQUNQSV9BTExPQ0FURV9aRVJPRUQKLSNkZWZpbmUgQUNQSV9BTExPQ0FURV9aRVJPRUQoYSkgICAgIGFjcGlfdXRfYWxsb2NhdGVfemVyb2VkKChhY3BpX3NpemUpKGEpLCBBQ1BJX01FTV9QQVJBTUVURVJTKQotI2VuZGlmCi0jaWZuZGVmIEFDUElfRlJFRQotI2RlZmluZSBBQ1BJX0ZSRUUoYSkgICAgICAgICAgICAgICAgYWNwaW9fb3NfZnJlZShhKQotI2VuZGlmCi0jZGVmaW5lIEFDUElfTUVNX1RSQUNLSU5HKGEpCi0KLSNlbHNlCi0KLS8qIE1lbW9yeSBhbGxvY2F0aW9uICovCi0KLSNkZWZpbmUgQUNQSV9BTExPQ0FURShhKSAgICAgICAgICAgIGFjcGlfdXRfYWxsb2NhdGVfYW5kX3RyYWNrKChhY3BpX3NpemUpKGEpLCBBQ1BJX01FTV9QQVJBTUVURVJTKQotI2RlZmluZSBBQ1BJX0FMTE9DQVRFX1pFUk9FRChhKSAgICAgYWNwaV91dF9hbGxvY2F0ZV96ZXJvZWRfYW5kX3RyYWNrKChhY3BpX3NpemUpKGEpLCBBQ1BJX01FTV9QQVJBTUVURVJTKQotI2RlZmluZSBBQ1BJX0ZSRUUoYSkgICAgICAgICAgICAgICAgYWNwaV91dF9mcmVlX2FuZF90cmFjayhhLCBBQ1BJX01FTV9QQVJBTUVURVJTKQotI2RlZmluZSBBQ1BJX01FTV9UUkFDS0lORyhhKSAgICAgICAgYQotCi0jZW5kaWYJCQkJLyogQUNQSV9EQkdfVFJBQ0tfQUxMT0NBVElPTlMgKi8KLQotLyogUHJlZW1wdGlvbiBwb2ludCAqLwotI2lmbmRlZiBBQ1BJX1BSRUVNUFRJT05fUE9JTlQKLSNkZWZpbmUgQUNQSV9QUkVFTVBUSU9OX1BPSU5UKCkgLyogbm8gcHJlZW1wdGlvbiAqLwotI2VuZGlmCi0KLSNlbmRpZgkJCQkvKiBBQ01BQ1JPU19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FjcGkvYWNuYW1lc3AuaCBiL2luY2x1ZGUvYWNwaS9hY25hbWVzcC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjRlNmY2Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYWNwaS9hY25hbWVzcC5oCisrKyAvZGV2L251bGwKQEAgLTEsMzIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBOYW1lOiBhY25hbWVzcC5oIC0gTmFtZXNwYWNlIHN1YmNvbXBvbmVudCBwcm90b3R5cGVzIGFuZCBkZWZpbmVzCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwOCwgSW50ZWwgQ29ycC4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKLSAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIGF0IG1pbmltdW0gYSBkaXNjbGFpbWVyCi0gKiAgICBzdWJzdGFudGlhbGx5IHNpbWlsYXIgdG8gdGhlICJOTyBXQVJSQU5UWSIgZGlzY2xhaW1lciBiZWxvdwotICogICAgKCJEaXNjbGFpbWVyIikgYW5kIGFueSByZWRpc3RyaWJ1dGlvbiBtdXN0IGJlIGNvbmRpdGlvbmVkIHVwb24KLSAqICAgIGluY2x1ZGluZyBhIHN1YnN0YW50aWFsbHkgc2ltaWxhciBEaXNjbGFpbWVyIHJlcXVpcmVtZW50IGZvciBmdXJ0aGVyCi0gKiAgICBiaW5hcnkgcmVkaXN0cmlidXRpb24uCi0gKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMKLSAqICAgIG9mIGFueSBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTk8gV0FSUkFOVFkKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAotICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKLSAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HCi0gKiBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKLSAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KLSAqLwotCi0jaWZuZGVmIF9fQUNOQU1FU1BfSF9fCi0jZGVmaW5lIF9fQUNOQU1FU1BfSF9fCi0KLS8qIFRvIHNlYXJjaCB0aGUgZW50aXJlIG5hbWUgc3BhY2UsIHBhc3MgdGhpcyBhcyBzZWFyY2hfYmFzZSAqLwotCi0jZGVmaW5lIEFDUElfTlNfQUxMICAgICAgICAgICAgICAgICAoKGFjcGlfaGFuZGxlKTApCi0KLS8qCi0gKiBFbGVtZW50cyBvZiBhY3BpX25zX3Byb3BlcnRpZXMgYXJlIGJpdCBzaWduaWZpY2FudAotICogYW5kIHNob3VsZCBiZSBvbmUtdG8tb25lIHdpdGggdmFsdWVzIG9mIGFjcGlfb2JqZWN0X3R5cGUKLSAqLwotI2RlZmluZSBBQ1BJX05TX05PUk1BTCAgICAgICAgICAgICAgMAotI2RlZmluZSBBQ1BJX05TX05FV1NDT1BFICAgICAgICAgICAgMQkvKiBhIGRlZmluaXRpb24gb2YgdGhpcyB0eXBlIG9wZW5zIGEgbmFtZSBzY29wZSAqLwotI2RlZmluZSBBQ1BJX05TX0xPQ0FMICAgICAgICAgICAgICAgMgkvKiBzdXBwcmVzcyBzZWFyY2ggb2YgZW5jbG9zaW5nIHNjb3BlcyAqLwotCi0vKiBGbGFncyBmb3IgYWNwaV9uc19sb29rdXAsIGFjcGlfbnNfc2VhcmNoX2FuZF9lbnRlciAqLwotCi0jZGVmaW5lIEFDUElfTlNfTk9fVVBTRUFSQ0ggICAgICAgICAwCi0jZGVmaW5lIEFDUElfTlNfU0VBUkNIX1BBUkVOVCAgICAgICAweDAxCi0jZGVmaW5lIEFDUElfTlNfRE9OVF9PUEVOX1NDT1BFICAgICAweDAyCi0jZGVmaW5lIEFDUElfTlNfTk9fUEVFUl9TRUFSQ0ggICAgICAweDA0Ci0jZGVmaW5lIEFDUElfTlNfRVJST1JfSUZfRk9VTkQgICAgICAweDA4Ci0jZGVmaW5lIEFDUElfTlNfUFJFRklYX0lTX1NDT1BFICAgICAweDEwCi0jZGVmaW5lIEFDUElfTlNfRVhURVJOQUwgICAgICAgICAgICAweDIwCi0jZGVmaW5lIEFDUElfTlNfVEVNUE9SQVJZICAgICAgICAgICAweDQwCi0KLS8qIEZsYWdzIGZvciBhY3BpX25zX3dhbGtfbmFtZXNwYWNlICovCi0KLSNkZWZpbmUgQUNQSV9OU19XQUxLX05PX1VOTE9DSyAgICAgIDAKLSNkZWZpbmUgQUNQSV9OU19XQUxLX1VOTE9DSyAgICAgICAgIDB4MDEKLSNkZWZpbmUgQUNQSV9OU19XQUxLX1RFTVBfTk9ERVMgICAgIDB4MDIKLQotLyoKLSAqIG5zaW5pdCAtIE5hbWVzcGFjZSBpbml0aWFsaXphdGlvbgotICovCi1hY3BpX3N0YXR1cyBhY3BpX25zX2luaXRpYWxpemVfb2JqZWN0cyh2b2lkKTsKLQotYWNwaV9zdGF0dXMgYWNwaV9uc19pbml0aWFsaXplX2RldmljZXModm9pZCk7Ci0KLS8qCi0gKiBuc2xvYWQgLSAgTmFtZXNwYWNlIGxvYWRpbmcKLSAqLwotYWNwaV9zdGF0dXMgYWNwaV9uc19sb2FkX25hbWVzcGFjZSh2b2lkKTsKLQotYWNwaV9zdGF0dXMKLWFjcGlfbnNfbG9hZF90YWJsZSh1MzIgdGFibGVfaW5kZXgsIHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlKTsKLQotLyoKLSAqIG5zd2FsayAtIHdhbGsgdGhlIG5hbWVzcGFjZQotICovCi1hY3BpX3N0YXR1cwotYWNwaV9uc193YWxrX25hbWVzcGFjZShhY3BpX29iamVjdF90eXBlIHR5cGUsCi0JCSAgICAgICBhY3BpX2hhbmRsZSBzdGFydF9vYmplY3QsCi0JCSAgICAgICB1MzIgbWF4X2RlcHRoLAotCQkgICAgICAgdTMyIGZsYWdzLAotCQkgICAgICAgYWNwaV93YWxrX2NhbGxiYWNrIHVzZXJfZnVuY3Rpb24sCi0JCSAgICAgICB2b2lkICpjb250ZXh0LCB2b2lkICoqcmV0dXJuX3ZhbHVlKTsKLQotc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKmFjcGlfbnNfZ2V0X25leHRfbm9kZShhY3BpX29iamVjdF90eXBlIHR5cGUsIHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlCi0JCQkJCQkgICpwYXJlbnQsIHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlCi0JCQkJCQkgICpjaGlsZCk7Ci0KLS8qCi0gKiBuc3BhcnNlIC0gdGFibGUgcGFyc2luZwotICovCi1hY3BpX3N0YXR1cwotYWNwaV9uc19wYXJzZV90YWJsZSh1MzIgdGFibGVfaW5kZXgsIHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpzdGFydF9ub2RlKTsKLQotYWNwaV9zdGF0dXMKLWFjcGlfbnNfb25lX2NvbXBsZXRlX3BhcnNlKHUzMiBwYXNzX251bWJlciwKLQkJCSAgIHUzMiB0YWJsZV9pbmRleCwKLQkJCSAgIHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpzdGFydF9ub2RlKTsKLQotLyoKLSAqIG5zYWNjZXNzIC0gVG9wLWxldmVsIG5hbWVzcGFjZSBhY2Nlc3MKLSAqLwotYWNwaV9zdGF0dXMgYWNwaV9uc19yb290X2luaXRpYWxpemUodm9pZCk7Ci0KLWFjcGlfc3RhdHVzCi1hY3BpX25zX2xvb2t1cCh1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgKnNjb3BlX2luZm8sCi0JICAgICAgIGNoYXIgKm5hbWUsCi0JICAgICAgIGFjcGlfb2JqZWN0X3R5cGUgdHlwZSwKLQkgICAgICAgYWNwaV9pbnRlcnByZXRlcl9tb2RlIGludGVycHJldGVyX21vZGUsCi0JICAgICAgIHUzMiBmbGFncywKLQkgICAgICAgc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSwKLQkgICAgICAgc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKipyZXRfbm9kZSk7Ci0KLS8qCi0gKiBuc2FsbG9jIC0gTmFtZWQgb2JqZWN0IGFsbG9jYXRpb24vZGVhbGxvY2F0aW9uCi0gKi8KLXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICphY3BpX25zX2NyZWF0ZV9ub2RlKHUzMiBuYW1lKTsKLQotdm9pZCBhY3BpX25zX2RlbGV0ZV9ub2RlKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlKTsKLQotdm9pZAotYWNwaV9uc19kZWxldGVfbmFtZXNwYWNlX3N1YnRyZWUoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKnBhcmVudF9oYW5kbGUpOwotCi12b2lkIGFjcGlfbnNfZGVsZXRlX25hbWVzcGFjZV9ieV9vd25lcihhY3BpX293bmVyX2lkIG93bmVyX2lkKTsKLQotdm9pZCBhY3BpX25zX2RldGFjaF9vYmplY3Qoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGUpOwotCi12b2lkIGFjcGlfbnNfZGVsZXRlX2NoaWxkcmVuKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpwYXJlbnQpOwotCi1pbnQgYWNwaV9uc19jb21wYXJlX25hbWVzKGNoYXIgKm5hbWUxLCBjaGFyICpuYW1lMik7Ci0KLS8qCi0gKiBuc2R1bXAgLSBOYW1lc3BhY2UgZHVtcC9wcmludCB1dGlsaXRpZXMKLSAqLwotI2lmZGVmCUFDUElfRlVUVVJFX1VTQUdFCi12b2lkIGFjcGlfbnNfZHVtcF90YWJsZXMoYWNwaV9oYW5kbGUgc2VhcmNoX2Jhc2UsIHUzMiBtYXhfZGVwdGgpOwotI2VuZGlmCQkJCS8qIEFDUElfRlVUVVJFX1VTQUdFICovCi0KLXZvaWQgYWNwaV9uc19kdW1wX2VudHJ5KGFjcGlfaGFuZGxlIGhhbmRsZSwgdTMyIGRlYnVnX2xldmVsKTsKLQotdm9pZAotYWNwaV9uc19kdW1wX3BhdGhuYW1lKGFjcGlfaGFuZGxlIGhhbmRsZSwgY2hhciAqbXNnLCB1MzIgbGV2ZWwsIHUzMiBjb21wb25lbnQpOwotCi12b2lkIGFjcGlfbnNfcHJpbnRfcGF0aG5hbWUodTMyIG51bV9zZWdtZW50cywgY2hhciAqcGF0aG5hbWUpOwotCi1hY3BpX3N0YXR1cwotYWNwaV9uc19kdW1wX29uZV9vYmplY3QoYWNwaV9oYW5kbGUgb2JqX2hhbmRsZSwKLQkJCXUzMiBsZXZlbCwgdm9pZCAqY29udGV4dCwgdm9pZCAqKnJldHVybl92YWx1ZSk7Ci0KLSNpZmRlZglBQ1BJX0ZVVFVSRV9VU0FHRQotdm9pZAotYWNwaV9uc19kdW1wX29iamVjdHMoYWNwaV9vYmplY3RfdHlwZSB0eXBlLAotCQkgICAgIHU4IGRpc3BsYXlfdHlwZSwKLQkJICAgICB1MzIgbWF4X2RlcHRoLAotCQkgICAgIGFjcGlfb3duZXJfaWQgb3duZXJfaWQsIGFjcGlfaGFuZGxlIHN0YXJ0X2hhbmRsZSk7Ci0jZW5kaWYJCQkJLyogQUNQSV9GVVRVUkVfVVNBR0UgKi8KLQotLyoKLSAqIG5zZXZhbCAtIE5hbWVzcGFjZSBldmFsdWF0aW9uIGZ1bmN0aW9ucwotICovCi1hY3BpX3N0YXR1cyBhY3BpX25zX2V2YWx1YXRlKHN0cnVjdCBhY3BpX2V2YWx1YXRlX2luZm8gKmluZm8pOwotCi0vKgotICogbnNwcmVkZWYgLSBTdXBwb3J0IGZvciBwcmVkZWZpbmVkL3Jlc2VydmVkIG5hbWVzCi0gKi8KLWFjcGlfc3RhdHVzCi1hY3BpX25zX2NoZWNrX3ByZWRlZmluZWRfbmFtZXMoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGUsCi0JCQkgICAgICAgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqcmV0dXJuX29iamVjdCk7Ci0KLWNvbnN0IHVuaW9uIGFjcGlfcHJlZGVmaW5lZF9pbmZvICphY3BpX25zX2NoZWNrX2Zvcl9wcmVkZWZpbmVkX25hbWUoc3RydWN0Ci0JCQkJCQkJCSAgICBhY3BpX25hbWVzcGFjZV9ub2RlCi0JCQkJCQkJCSAgICAqbm9kZSk7Ci0KLXZvaWQKLWFjcGlfbnNfY2hlY2tfcGFyYW1ldGVyX2NvdW50KGNoYXIgKnBhdGhuYW1lLAotCQkJICAgICAgc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGUsCi0JCQkgICAgICBjb25zdCB1bmlvbiBhY3BpX3ByZWRlZmluZWRfaW5mbyAqaW5mbyk7Ci0KLS8qCi0gKiBuc25hbWVzIC0gTmFtZSBhbmQgU2NvcGUgbWFuaXB1bGF0aW9uCi0gKi8KLXUzMiBhY3BpX25zX29wZW5zX3Njb3BlKGFjcGlfb2JqZWN0X3R5cGUgdHlwZSk7Ci0KLWFjcGlfc3RhdHVzCi1hY3BpX25zX2J1aWxkX2V4dGVybmFsX3BhdGgoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGUsCi0JCQkgICAgYWNwaV9zaXplIHNpemUsIGNoYXIgKm5hbWVfYnVmZmVyKTsKLQotY2hhciAqYWNwaV9uc19nZXRfZXh0ZXJuYWxfcGF0aG5hbWUoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGUpOwotCi1jaGFyICphY3BpX25zX25hbWVfb2ZfY3VycmVudF9zY29wZShzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKTsKLQotYWNwaV9zdGF0dXMKLWFjcGlfbnNfaGFuZGxlX3RvX3BhdGhuYW1lKGFjcGlfaGFuZGxlIHRhcmdldF9oYW5kbGUsCi0JCQkgICBzdHJ1Y3QgYWNwaV9idWZmZXIgKmJ1ZmZlcik7Ci0KLXU4Ci1hY3BpX25zX3BhdHRlcm5fbWF0Y2goc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm9ial9ub2RlLCBjaGFyICpzZWFyY2hfZm9yKTsKLQotYWNwaV9zdGF0dXMKLWFjcGlfbnNfZ2V0X25vZGUoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKnByZWZpeF9ub2RlLAotCQkgY29uc3QgY2hhciAqZXh0ZXJuYWxfcGF0aG5hbWUsCi0JCSB1MzIgZmxhZ3MsIHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICoqb3V0X25vZGUpOwotCi1hY3BpX3NpemUgYWNwaV9uc19nZXRfcGF0aG5hbWVfbGVuZ3RoKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlKTsKLQotLyoKLSAqIG5zb2JqZWN0IC0gT2JqZWN0IG1hbmFnZW1lbnQgZm9yIG5hbWVzcGFjZSBub2RlcwotICovCi1hY3BpX3N0YXR1cwotYWNwaV9uc19hdHRhY2hfb2JqZWN0KHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlLAotCQkgICAgICB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmplY3QsIGFjcGlfb2JqZWN0X3R5cGUgdHlwZSk7Ci0KLXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKmFjcGlfbnNfZ2V0X2F0dGFjaGVkX29iamVjdChzdHJ1Y3QKLQkJCQkJCSAgICAgICBhY3BpX25hbWVzcGFjZV9ub2RlCi0JCQkJCQkgICAgICAgKm5vZGUpOwotCi11bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICphY3BpX25zX2dldF9zZWNvbmRhcnlfb2JqZWN0KHVuaW9uCi0JCQkJCQkJYWNwaV9vcGVyYW5kX29iamVjdAotCQkJCQkJCSpvYmpfZGVzYyk7Ci0KLWFjcGlfc3RhdHVzCi1hY3BpX25zX2F0dGFjaF9kYXRhKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlLAotCQkgICAgYWNwaV9vYmplY3RfaGFuZGxlciBoYW5kbGVyLCB2b2lkICpkYXRhKTsKLQotYWNwaV9zdGF0dXMKLWFjcGlfbnNfZGV0YWNoX2RhdGEoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGUsCi0JCSAgICBhY3BpX29iamVjdF9oYW5kbGVyIGhhbmRsZXIpOwotCi1hY3BpX3N0YXR1cwotYWNwaV9uc19nZXRfYXR0YWNoZWRfZGF0YShzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZSwKLQkJCSAgYWNwaV9vYmplY3RfaGFuZGxlciBoYW5kbGVyLCB2b2lkICoqZGF0YSk7Ci0KLS8qCi0gKiBuc3NlYXJjaCAtIE5hbWVzcGFjZSBzZWFyY2hpbmcgYW5kIGVudHJ5Ci0gKi8KLWFjcGlfc3RhdHVzCi1hY3BpX25zX3NlYXJjaF9hbmRfZW50ZXIodTMyIGVudHJ5X25hbWUsCi0JCQkgc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSwKLQkJCSBzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZSwKLQkJCSBhY3BpX2ludGVycHJldGVyX21vZGUgaW50ZXJwcmV0ZXJfbW9kZSwKLQkJCSBhY3BpX29iamVjdF90eXBlIHR5cGUsCi0JCQkgdTMyIGZsYWdzLCBzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqKnJldF9ub2RlKTsKLQotYWNwaV9zdGF0dXMKLWFjcGlfbnNfc2VhcmNoX29uZV9zY29wZSh1MzIgZW50cnlfbmFtZSwKLQkJCSBzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZSwKLQkJCSBhY3BpX29iamVjdF90eXBlIHR5cGUsCi0JCQkgc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKipyZXRfbm9kZSk7Ci0KLXZvaWQKLWFjcGlfbnNfaW5zdGFsbF9ub2RlKHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUsCi0JCSAgICAgc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKnBhcmVudF9ub2RlLAotCQkgICAgIHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlLCBhY3BpX29iamVjdF90eXBlIHR5cGUpOwotCi0vKgotICogbnN1dGlscyAtIFV0aWxpdHkgZnVuY3Rpb25zCi0gKi8KLXU4IGFjcGlfbnNfdmFsaWRfcm9vdF9wcmVmaXgoY2hhciBwcmVmaXgpOwotCi1hY3BpX29iamVjdF90eXBlIGFjcGlfbnNfZ2V0X3R5cGUoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGUpOwotCi11MzIgYWNwaV9uc19sb2NhbChhY3BpX29iamVjdF90eXBlIHR5cGUpOwotCi12b2lkCi1hY3BpX25zX3JlcG9ydF9lcnJvcihjb25zdCBjaGFyICptb2R1bGVfbmFtZSwKLQkJICAgICB1MzIgbGluZV9udW1iZXIsCi0JCSAgICAgY29uc3QgY2hhciAqaW50ZXJuYWxfbmFtZSwgYWNwaV9zdGF0dXMgbG9va3VwX3N0YXR1cyk7Ci0KLXZvaWQKLWFjcGlfbnNfcmVwb3J0X21ldGhvZF9lcnJvcihjb25zdCBjaGFyICptb2R1bGVfbmFtZSwKLQkJCSAgICB1MzIgbGluZV9udW1iZXIsCi0JCQkgICAgY29uc3QgY2hhciAqbWVzc2FnZSwKLQkJCSAgICBzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZSwKLQkJCSAgICBjb25zdCBjaGFyICpwYXRoLCBhY3BpX3N0YXR1cyBsb29rdXBfc3RhdHVzKTsKLQotdm9pZAotYWNwaV9uc19wcmludF9ub2RlX3BhdGhuYW1lKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlLCBjb25zdCBjaGFyICptc2cpOwotCi1hY3BpX3N0YXR1cyBhY3BpX25zX2J1aWxkX2ludGVybmFsX25hbWUoc3RydWN0IGFjcGlfbmFtZXN0cmluZ19pbmZvICppbmZvKTsKLQotdm9pZCBhY3BpX25zX2dldF9pbnRlcm5hbF9uYW1lX2xlbmd0aChzdHJ1Y3QgYWNwaV9uYW1lc3RyaW5nX2luZm8gKmluZm8pOwotCi1hY3BpX3N0YXR1cwotYWNwaV9uc19pbnRlcm5hbGl6ZV9uYW1lKGNvbnN0IGNoYXIgKmRvdHRlZF9uYW1lLCBjaGFyICoqY29udmVydGVkX25hbWUpOwotCi1hY3BpX3N0YXR1cwotYWNwaV9uc19leHRlcm5hbGl6ZV9uYW1lKHUzMiBpbnRlcm5hbF9uYW1lX2xlbmd0aCwKLQkJCSBjb25zdCBjaGFyICppbnRlcm5hbF9uYW1lLAotCQkJIHUzMiAqIGNvbnZlcnRlZF9uYW1lX2xlbmd0aCwgY2hhciAqKmNvbnZlcnRlZF9uYW1lKTsKLQotc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKmFjcGlfbnNfbWFwX2hhbmRsZV90b19ub2RlKGFjcGlfaGFuZGxlIGhhbmRsZSk7Ci0KLWFjcGlfaGFuZGxlIGFjcGlfbnNfY29udmVydF9lbnRyeV90b19oYW5kbGUoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGUpOwotCi12b2lkIGFjcGlfbnNfdGVybWluYXRlKHZvaWQpOwotCi1zdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqYWNwaV9uc19nZXRfcGFyZW50X25vZGUoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUKLQkJCQkJCSAgICAqbm9kZSk7Ci0KLXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICphY3BpX25zX2dldF9uZXh0X3ZhbGlkX25vZGUoc3RydWN0Ci0JCQkJCQkJYWNwaV9uYW1lc3BhY2Vfbm9kZQotCQkJCQkJCSpub2RlKTsKLQotI2VuZGlmCQkJCS8qIF9fQUNOQU1FU1BfSF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FjcGkvYWNvdXRwdXQuaCBiL2luY2x1ZGUvYWNwaS9hY291dHB1dC5oCmluZGV4IGRiODg1MmQuLjVjODIzZDUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYWNwaS9hY291dHB1dC5oCisrKyBiL2luY2x1ZGUvYWNwaS9hY291dHB1dC5oCkBAIC00NSw5ICs0NSw5IEBACiAjZGVmaW5lIF9fQUNPVVRQVVRfSF9fCiAKIC8qCi0gKiBEZWJ1ZyBsZXZlbHMgYW5kIGNvbXBvbmVudCBJRHMuICBUaGVzZSBhcmUgdXNlZCB0byBjb250cm9sIHRoZQotICogZ3JhbnVsYXJpdHkgb2YgdGhlIG91dHB1dCBvZiB0aGUgREVCVUdfUFJJTlQgbWFjcm8gLS0gb24gYSBwZXItCi0gKiBjb21wb25lbnQgYmFzaXMgYW5kIGEgcGVyLWV4Y2VwdGlvbi10eXBlIGJhc2lzLgorICogRGVidWcgbGV2ZWxzIGFuZCBjb21wb25lbnQgSURzLiBUaGVzZSBhcmUgdXNlZCB0byBjb250cm9sIHRoZQorICogZ3JhbnVsYXJpdHkgb2YgdGhlIG91dHB1dCBvZiB0aGUgQUNQSV9ERUJVR19QUklOVCBtYWNybyAtLSBvbiBhCisgKiBwZXItY29tcG9uZW50IGJhc2lzIGFuZCBhIHBlci1leGNlcHRpb24tdHlwZSBiYXNpcy4KICAqLwogCiAvKiBDb21wb25lbnQgSURzIGFyZSB1c2VkIGluIHRoZSBnbG9iYWwgIkRlYnVnTGF5ZXIiICovCkBAIC02OSw4ICs2OSwxMCBAQAogCiAjZGVmaW5lIEFDUElfQ09NUElMRVIgICAgICAgICAgICAgICAweDAwMDAxMDAwCiAjZGVmaW5lIEFDUElfVE9PTFMgICAgICAgICAgICAgICAgICAweDAwMDAyMDAwCisjZGVmaW5lIEFDUElfRVhBTVBMRSAgICAgICAgICAgICAgICAweDAwMDA0MDAwCisjZGVmaW5lIEFDUElfRFJJVkVSICAgICAgICAgICAgICAgICAweDAwMDA4MDAwCiAKLSNkZWZpbmUgQUNQSV9BTExfQ09NUE9ORU5UUyAgICAgICAgIDB4MDAwMDNGRkYKKyNkZWZpbmUgQUNQSV9BTExfQ09NUE9ORU5UUyAgICAgICAgIDB4MDAwMEZGRkYKICNkZWZpbmUgQUNQSV9DT01QT05FTlRfREVGQVVMVCAgICAgIChBQ1BJX0FMTF9DT01QT05FTlRTKQogCiAvKiBDb21wb25lbnQgSURzIHJlc2VydmVkIGZvciBBQ1BJIGRyaXZlcnMgKi8KQEAgLTc4LDcgKzgwLDcgQEAKICNkZWZpbmUgQUNQSV9BTExfRFJJVkVSUyAgICAgICAgICAgIDB4RkZGRjAwMDAKIAogLyoKLSAqIFJhdyBkZWJ1ZyBvdXRwdXQgbGV2ZWxzLCBkbyBub3QgdXNlIHRoZXNlIGluIHRoZSBERUJVR19QUklOVCBtYWNyb3MKKyAqIFJhdyBkZWJ1ZyBvdXRwdXQgbGV2ZWxzLCBkbyBub3QgdXNlIHRoZXNlIGluIHRoZSBBQ1BJX0RFQlVHX1BSSU5UIG1hY3JvcwogICovCiAjZGVmaW5lIEFDUElfTFZfSU5JVCAgICAgICAgICAgICAgICAweDAwMDAwMDAxCiAjZGVmaW5lIEFDUElfTFZfREVCVUdfT0JKRUNUICAgICAgICAweDAwMDAwMDAyCkBAIC0xNzYsNCArMTc4LDk1IEBACiAjZGVmaW5lIEFDUElfTk9STUFMX0RFRkFVTFQgICAgICAgICAoQUNQSV9MVl9JTklUIHwgQUNQSV9MVl9ERUJVR19PQkpFQ1QpCiAjZGVmaW5lIEFDUElfREVCVUdfQUxMICAgICAgICAgICAgICAoQUNQSV9MVl9BTUxfRElTQVNTRU1CTEUgfCBBQ1BJX0xWX0FMTF9FWENFUFRJT05TIHwgQUNQSV9MVl9BTEwpCiAKKyNpZiBkZWZpbmVkIChBQ1BJX0RFQlVHX09VVFBVVCkgfHwgIWRlZmluZWQgKEFDUElfTk9fRVJST1JfTUVTU0FHRVMpCisvKgorICogTW9kdWxlIG5hbWUgaXMgaW5jbHVkZWQgaW4gYm90aCBkZWJ1ZyBhbmQgbm9uLWRlYnVnIHZlcnNpb25zIHByaW1hcmlseSBmb3IKKyAqIGVycm9yIG1lc3NhZ2VzLiBUaGUgX19GSUxFX18gbWFjcm8gaXMgbm90IHZlcnkgdXNlZnVsIGZvciB0aGlzLCBiZWNhdXNlIGl0CisgKiBvZnRlbiBpbmNsdWRlcyB0aGUgZW50aXJlIHBhdGhuYW1lIHRvIHRoZSBtb2R1bGUKKyAqLworI2RlZmluZSBBQ1BJX01PRFVMRV9OQU1FKG5hbWUpICAgICAgICAgIHN0YXRpYyBjb25zdCBjaGFyIEFDUElfVU5VU0VEX1ZBUiBfYWNwaV9tb2R1bGVfbmFtZVtdID0gbmFtZTsKKyNlbHNlCisjZGVmaW5lIEFDUElfTU9EVUxFX05BTUUobmFtZSkKKyNlbmRpZgorCisvKgorICogQXNjaWkgZXJyb3IgbWVzc2FnZXMgY2FuIGJlIGNvbmZpZ3VyZWQgb3V0CisgKi8KKyNpZm5kZWYgQUNQSV9OT19FUlJPUl9NRVNTQUdFUworI2RlZmluZSBBRV9JTkZPICAgICAgICAgICAgICAgICAgICAgICAgIF9hY3BpX21vZHVsZV9uYW1lLCBfX0xJTkVfXworCisvKgorICogRXJyb3IgcmVwb3J0aW5nLiBDYWxsZXJzIG1vZHVsZSBhbmQgbGluZSBudW1iZXIgYXJlIGluc2VydGVkIGJ5IEFFX0lORk8sCisgKiB0aGUgcGxpc3QgY29udGFpbnMgYSBzZXQgb2YgcGFyZW5zIHRvIGFsbG93IHZhcmlhYmxlLWxlbmd0aCBsaXN0cy4KKyAqIFRoZXNlIG1hY3JvcyBhcmUgdXNlZCBmb3IgYm90aCB0aGUgZGVidWcgYW5kIG5vbi1kZWJ1ZyB2ZXJzaW9ucyBvZiB0aGUgY29kZS4KKyAqLworI2RlZmluZSBBQ1BJX0lORk8ocGxpc3QpICAgICAgICAgICAgICAgIGFjcGlfaW5mbyBwbGlzdAorI2RlZmluZSBBQ1BJX1dBUk5JTkcocGxpc3QpICAgICAgICAgICAgIGFjcGlfd2FybmluZyBwbGlzdAorI2RlZmluZSBBQ1BJX0VYQ0VQVElPTihwbGlzdCkgICAgICAgICAgIGFjcGlfZXhjZXB0aW9uIHBsaXN0CisjZGVmaW5lIEFDUElfRVJST1IocGxpc3QpICAgICAgICAgICAgICAgYWNwaV9lcnJvciBwbGlzdAorCisjZWxzZQorCisvKiBObyBlcnJvciBtZXNzYWdlcyAqLworCisjZGVmaW5lIEFDUElfSU5GTyhwbGlzdCkKKyNkZWZpbmUgQUNQSV9XQVJOSU5HKHBsaXN0KQorI2RlZmluZSBBQ1BJX0VYQ0VQVElPTihwbGlzdCkKKyNkZWZpbmUgQUNQSV9FUlJPUihwbGlzdCkKKworI2VuZGlmCQkJCS8qIEFDUElfTk9fRVJST1JfTUVTU0FHRVMgKi8KKworLyoKKyAqIERlYnVnIG1hY3JvcyB0aGF0IGFyZSBjb25kaXRpb25hbGx5IGNvbXBpbGVkCisgKi8KKyNpZmRlZiBBQ1BJX0RFQlVHX09VVFBVVAorCisvKgorICogSWYgQUNQSV9HRVRfRlVOQ1RJT05fTkFNRSB3YXMgbm90IGRlZmluZWQgaW4gdGhlIGNvbXBpbGVyLWRlcGVuZGVudCBoZWFkZXIsCisgKiBkZWZpbmUgaXQgbm93LiBUaGlzIGlzIHRoZSBjYXNlIHdoZXJlIHRoZXJlIHRoZSBjb21waWxlciBkb2VzIG5vdCBzdXBwb3J0CisgKiBhIF9fRlVOQ1RJT05fXyBtYWNybyBvciBlcXVpdmFsZW50LgorICovCisjaWZuZGVmIEFDUElfR0VUX0ZVTkNUSU9OX05BTUUKKyNkZWZpbmUgQUNQSV9HRVRfRlVOQ1RJT05fTkFNRSAgICAgICAgICBfYWNwaV9mdW5jdGlvbl9uYW1lCisKKy8qCisgKiBUaGUgTmFtZSBwYXJhbWV0ZXIgc2hvdWxkIGJlIHRoZSBwcm9jZWR1cmUgbmFtZSBhcyBhIHF1b3RlZCBzdHJpbmcuCisgKiBUaGUgZnVuY3Rpb24gbmFtZSBpcyBhbHNvIHVzZWQgYnkgdGhlIGZ1bmN0aW9uIGV4aXQgbWFjcm9zIGJlbG93LgorICogTm90ZTogKGNvbnN0IGNoYXIpIGlzIHVzZWQgdG8gYmUgY29tcGF0aWJsZSB3aXRoIHRoZSBkZWJ1ZyBpbnRlcmZhY2VzCisgKiBhbmQgbWFjcm9zIHN1Y2ggYXMgX19GVU5DVElPTl9fLgorICovCisjZGVmaW5lIEFDUElfRlVOQ1RJT05fTkFNRShuYW1lKSAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgX2FjcGlfZnVuY3Rpb25fbmFtZVtdID0gI25hbWU7CisKKyNlbHNlCisvKiBDb21waWxlciBzdXBwb3J0cyBfX0ZVTkNUSU9OX18gKG9yIGVxdWl2YWxlbnQpIC0tIElnbm9yZSB0aGlzIG1hY3JvICovCisKKyNkZWZpbmUgQUNQSV9GVU5DVElPTl9OQU1FKG5hbWUpCisjZW5kaWYJCQkJLyogQUNQSV9HRVRfRlVOQ1RJT05fTkFNRSAqLworCisvKgorICogQ29tbW9uIHBhcmFtZXRlcnMgdXNlZCBmb3IgZGVidWcgb3V0cHV0IGZ1bmN0aW9uczoKKyAqIGxpbmUgbnVtYmVyLCBmdW5jdGlvbiBuYW1lLCBtb2R1bGUoZmlsZSkgbmFtZSwgY29tcG9uZW50IElECisgKi8KKyNkZWZpbmUgQUNQSV9ERUJVR19QQVJBTUVURVJTICAgICAgICAgICBfX0xJTkVfXywgQUNQSV9HRVRfRlVOQ1RJT05fTkFNRSwgX2FjcGlfbW9kdWxlX25hbWUsIF9DT01QT05FTlQKKworLyoKKyAqIE1hc3RlciBkZWJ1ZyBwcmludCBtYWNyb3MKKyAqIFByaW50IG1lc3NhZ2UgaWYgYW5kIG9ubHkgaWY6CisgKiAgICAxKSBEZWJ1ZyBwcmludCBmb3IgdGhlIGN1cnJlbnQgY29tcG9uZW50IGlzIGVuYWJsZWQKKyAqICAgIDIpIERlYnVnIGVycm9yIGxldmVsIG9yIHRyYWNlIGxldmVsIGZvciB0aGUgcHJpbnQgc3RhdGVtZW50IGlzIGVuYWJsZWQKKyAqLworI2RlZmluZSBBQ1BJX0RFQlVHX1BSSU5UKHBsaXN0KSAgICAgICAgIGFjcGlfZGVidWdfcHJpbnQgcGxpc3QKKyNkZWZpbmUgQUNQSV9ERUJVR19QUklOVF9SQVcocGxpc3QpICAgICBhY3BpX2RlYnVnX3ByaW50X3JhdyBwbGlzdAorCisjZWxzZQorLyoKKyAqIFRoaXMgaXMgdGhlIG5vbi1kZWJ1ZyBjYXNlIC0tIG1ha2UgZXZlcnl0aGluZyBnbyBhd2F5LAorICogbGVhdmluZyBubyBleGVjdXRhYmxlIGRlYnVnIGNvZGUhCisgKi8KKyNkZWZpbmUgQUNQSV9GVU5DVElPTl9OQU1FKGEpCisjZGVmaW5lIEFDUElfREVCVUdfUFJJTlQocGwpCisjZGVmaW5lIEFDUElfREVCVUdfUFJJTlRfUkFXKHBsKQorCisjZW5kaWYJCQkJLyogQUNQSV9ERUJVR19PVVRQVVQgKi8KKwogI2VuZGlmCQkJCS8qIF9fQUNPVVRQVVRfSF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FjcGkvYWNwaS5oIGIvaW5jbHVkZS9hY3BpL2FjcGkuaAppbmRleCBjNTE1ZWY2Li40NzJiN2JmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FjcGkvYWNwaS5oCisrKyBiL2luY2x1ZGUvYWNwaS9hY3BpLmgKQEAgLTEsNiArMSw2IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgotICogTmFtZTogYWNwaS5oIC0gTWFzdGVyIGluY2x1ZGUgZmlsZSwgUHVibGljcyBhbmQgZXh0ZXJuYWwgZGF0YS4KKyAqIE5hbWU6IGFjcGkuaCAtIE1hc3RlciBwdWJsaWMgaW5jbHVkZSBmaWxlIHVzZWQgdG8gaW50ZXJmYWNlIHRvIEFDUElDQQogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIApAQCAtNDUsMjUgKzQ1LDIyIEBACiAjZGVmaW5lIF9fQUNQSV9IX18KIAogLyoKLSAqIENvbW1vbiBpbmNsdWRlcyBmb3IgYWxsIEFDUEkgZHJpdmVyIGZpbGVzCi0gKiBXZSBwdXQgdGhlbSBoZXJlIGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCB0byBkdXBsaWNhdGUgdGhlbQotICogaW4gdGhlIHJlc3Qgb2YgdGhlIHNvdXJjZSBjb2RlIGFnYWluIGFuZCBhZ2Fpbi4KKyAqIFB1YmxpYyBpbmNsdWRlIGZpbGVzIGZvciB1c2UgYnkgY29kZSB0aGF0IHdpbGwgaW50ZXJmYWNlIHRvIEFDUElDQS4KKyAqCisgKiBJbmZvcm1hdGlvbiBpbmNsdWRlcyB0aGUgQUNQSUNBIGRhdGEgdHlwZXMsIG5hbWVzLCBleGNlcHRpb25zLCBhbmQKKyAqIGV4dGVybmFsIGludGVyZmFjZSBwcm90b3R5cGVzLiBBbHNvIGluY2x1ZGVkIGFyZSB0aGUgZGVmaW5pdGlvbnMgZm9yCisgKiBhbGwgQUNQSSB0YWJsZXMgKEZBRFQsIE1BRFQsIGV0Yy4pCisgKgorICogTm90ZTogVGhlIG9yZGVyIG9mIHRoZXNlIGluY2x1ZGUgZmlsZXMgaXMgaW1wb3J0YW50LgogICovCi0jaW5jbHVkZSAiYWNuYW1lcy5oIgkJLyogR2xvYmFsIEFDUEkgbmFtZXMgYW5kIHN0cmluZ3MgKi8KLSNpbmNsdWRlICJhY2NvbmZpZy5oIgkJLyogQ29uZmlndXJhdGlvbiBjb25zdGFudHMgKi8KLSNpbmNsdWRlICJwbGF0Zm9ybS9hY2Vudi5oIgkvKiBUYXJnZXQgZW52aXJvbm1lbnQgc3BlY2lmaWMgaXRlbXMgKi8KLSNpbmNsdWRlICJhY3R5cGVzLmgiCQkvKiBGdW5kYW1lbnRhbCBjb21tb24gZGF0YSB0eXBlcyAqLwotI2luY2x1ZGUgImFjZXhjZXAuaCIJCS8qIEFDUEkgZXhjZXB0aW9uIGNvZGVzICovCi0jaW5jbHVkZSAiYWNtYWNyb3MuaCIJCS8qIEMgbWFjcm9zICovCisjaW5jbHVkZSAicGxhdGZvcm0vYWNlbnYuaCIJLyogRW52aXJvbm1lbnQtc3BlY2lmaWMgaXRlbXMgKi8KKyNpbmNsdWRlICJhY25hbWVzLmgiCQkvKiBDb21tb24gQUNQSSBuYW1lcyBhbmQgc3RyaW5ncyAqLworI2luY2x1ZGUgImFjdHlwZXMuaCIJCS8qIEFDUElDQSBkYXRhIHR5cGVzIGFuZCBzdHJ1Y3R1cmVzICovCisjaW5jbHVkZSAiYWNleGNlcC5oIgkJLyogQUNQSUNBIGV4Y2VwdGlvbnMgKi8KICNpbmNsdWRlICJhY3RibC5oIgkJLyogQUNQSSB0YWJsZSBkZWZpbml0aW9ucyAqLwotI2luY2x1ZGUgImFjbG9jYWwuaCIJCS8qIEludGVybmFsIGRhdGEgdHlwZXMgKi8KICNpbmNsdWRlICJhY291dHB1dC5oIgkJLyogRXJyb3Igb3V0cHV0IGFuZCBEZWJ1ZyBtYWNyb3MgKi8KLSNpbmNsdWRlICJhY3Bpb3N4Zi5oIgkJLyogSW50ZXJmYWNlcyB0byB0aGUgQUNQSS10by1PUyBsYXllciAqLworI2luY2x1ZGUgImFjcmVzdHlwLmgiCQkvKiBSZXNvdXJjZSBEZXNjcmlwdG9yIHN0cnVjdHMgKi8KKyNpbmNsdWRlICJhY3Bpb3N4Zi5oIgkJLyogT1NMIGludGVyZmFjZXMgKEFDUElDQS10by1PUykgKi8KICNpbmNsdWRlICJhY3BpeGYuaCIJCS8qIEFDUEkgY29yZSBzdWJzeXN0ZW0gZXh0ZXJuYWwgaW50ZXJmYWNlcyAqLwotI2luY2x1ZGUgImFjb2JqZWN0LmgiCQkvKiBBQ1BJIGludGVybmFsIG9iamVjdCAqLwotI2luY2x1ZGUgImFjc3RydWN0LmgiCQkvKiBDb21tb24gc3RydWN0dXJlcyAqLwotI2luY2x1ZGUgImFjZ2xvYmFsLmgiCQkvKiBBbGwgZ2xvYmFsIHZhcmlhYmxlcyAqLwotI2luY2x1ZGUgImFjaHdhcmUuaCIJCS8qIEhhcmR3YXJlIGRlZmluZXMgYW5kIGludGVyZmFjZXMgKi8KLSNpbmNsdWRlICJhY3V0aWxzLmgiCQkvKiBVdGlsaXR5IGludGVyZmFjZXMgKi8KIAogI2VuZGlmCQkJCS8qIF9fQUNQSV9IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYWNwaS9hY3Bpb3N4Zi5oIGIvaW5jbHVkZS9hY3BpL2FjcGlvc3hmLmgKaW5kZXggYjkxNDQwYS4uYTYyNzIwYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL2FjcGlvc3hmLmgKKysrIGIvaW5jbHVkZS9hY3BpL2FjcGlvc3hmLmgKQEAgLTEyMSw4ICsxMjEsMTEgQEAKIGFjcGlfc3RhdHVzIGFjcGlfb3Nfc2lnbmFsX3NlbWFwaG9yZShhY3BpX3NlbWFwaG9yZSBoYW5kbGUsIHUzMiB1bml0cyk7CiAKIC8qCi0gKiBNdXRleCBwcmltaXRpdmVzCisgKiBNdXRleCBwcmltaXRpdmVzLiBNYXkgYmUgY29uZmlndXJlZCB0byB1c2Ugc2VtYXBob3JlcyBpbnN0ZWFkIHZpYQorICogQUNQSV9NVVRFWF9UWVBFIChzZWUgcGxhdGZvcm0vYWNlbnYuaCkKICAqLworI2lmIChBQ1BJX01VVEVYX1RZUEUgIT0gQUNQSV9CSU5BUllfU0VNQVBIT1JFKQorCiBhY3BpX3N0YXR1cyBhY3BpX29zX2NyZWF0ZV9tdXRleChhY3BpX211dGV4ICogb3V0X2hhbmRsZSk7CiAKIHZvaWQgYWNwaV9vc19kZWxldGVfbXV0ZXgoYWNwaV9tdXRleCBoYW5kbGUpOwpAQCAtMTMwLDEzICsxMzMsNyBAQAogYWNwaV9zdGF0dXMgYWNwaV9vc19hY3F1aXJlX211dGV4KGFjcGlfbXV0ZXggaGFuZGxlLCB1MTYgdGltZW91dCk7CiAKIHZvaWQgYWNwaV9vc19yZWxlYXNlX211dGV4KGFjcGlfbXV0ZXggaGFuZGxlKTsKLQotLyogVGVtcG9yYXJ5IG1hY3JvcyBmb3IgTXV0ZXgqIGludGVyZmFjZXMsIG1hcCB0byBleGlzdGluZyBzZW1hcGhvcmUgeGZhY2VzICovCi0KLSNkZWZpbmUgYWNwaV9vc19jcmVhdGVfbXV0ZXgob3V0X2hhbmRsZSkgICAgYWNwaV9vc19jcmVhdGVfc2VtYXBob3JlICgxLCAxLCBvdXRfaGFuZGxlKQotI2RlZmluZSBhY3BpX29zX2RlbGV0ZV9tdXRleChoYW5kbGUpICAgICAgICAodm9pZCkgYWNwaV9vc19kZWxldGVfc2VtYXBob3JlIChoYW5kbGUpCi0jZGVmaW5lIGFjcGlfb3NfYWNxdWlyZV9tdXRleChoYW5kbGUsdGltZSkgIGFjcGlfb3Nfd2FpdF9zZW1hcGhvcmUgKGhhbmRsZSwgMSwgdGltZSkKLSNkZWZpbmUgYWNwaV9vc19yZWxlYXNlX211dGV4KGhhbmRsZSkgICAgICAgKHZvaWQpIGFjcGlfb3Nfc2lnbmFsX3NlbWFwaG9yZSAoaGFuZGxlLCAxKQorI2VuZGlmCiAKIC8qCiAgKiBNZW1vcnkgYWxsb2NhdGlvbiBhbmQgbWFwcGluZwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL2FjcGl4Zi5oIGIvaW5jbHVkZS9hY3BpL2FjcGl4Zi5oCmluZGV4IDMzYmMwZTNiMS4uYzhlOGNmNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL2FjcGl4Zi5oCisrKyBiL2luY2x1ZGUvYWNwaS9hY3BpeGYuaApAQCAtNDUsOSArNDUsMzIgQEAKICNpZm5kZWYgX19BQ1hGQUNFX0hfXwogI2RlZmluZSBfX0FDWEZBQ0VfSF9fCiAKKy8qIEN1cnJlbnQgQUNQSUNBIHN1YnN5c3RlbSB2ZXJzaW9uIGluIFlZWVlNTUREIGZvcm1hdCAqLworCisjZGVmaW5lIEFDUElfQ0FfVkVSU0lPTiAgICAgICAgICAgICAgICAgMHgyMDA4MTIwNAorCiAjaW5jbHVkZSAiYWN0eXBlcy5oIgogI2luY2x1ZGUgImFjdGJsLmgiCiAKK2V4dGVybiB1OCBhY3BpX2dibF9wZXJtYW5lbnRfbW1hcDsKKworLyoKKyAqIEdsb2JhbHMgdGhhdCBhcmUgcHVibGljYWxseSBhdmFpbGFibGUsIGFsbG93aW5nIGZvcgorICogcnVuIHRpbWUgY29uZmlndXJhdGlvbgorICovCitleHRlcm4gdTMyIGFjcGlfZGJnX2xldmVsOworZXh0ZXJuIHUzMiBhY3BpX2RiZ19sYXllcjsKK2V4dGVybiB1OCBhY3BpX2dibF9lbmFibGVfaW50ZXJwcmV0ZXJfc2xhY2s7CitleHRlcm4gdTggYWNwaV9nYmxfYWxsX21ldGhvZHNfc2VyaWFsaXplZDsKK2V4dGVybiB1OCBhY3BpX2dibF9jcmVhdGVfb3NpX21ldGhvZDsKK2V4dGVybiB1OCBhY3BpX2dibF9sZWF2ZV93YWtlX2dwZXNfZGlzYWJsZWQ7CitleHRlcm4gYWNwaV9uYW1lIGFjcGlfZ2JsX3RyYWNlX21ldGhvZF9uYW1lOworZXh0ZXJuIHUzMiBhY3BpX2dibF90cmFjZV9mbGFnczsKKworZXh0ZXJuIHUzMiBhY3BpX2N1cnJlbnRfZ3BlX2NvdW50OworZXh0ZXJuIHN0cnVjdCBhY3BpX3RhYmxlX2ZhZHQgYWNwaV9nYmxfRkFEVDsKKworZXh0ZXJuIHUzMiBhY3BpX3JzZHRfZm9yY2VkOwogLyoKICAqIEdsb2JhbCBpbnRlcmZhY2VzCiAgKi8KQEAgLTc5LDExICsxMDIsNiBAQAogCiBhY3BpX3N0YXR1cyBhY3BpX3B1cmdlX2NhY2hlZF9vYmplY3RzKHZvaWQpOwogCi0jaWZkZWYgQUNQSV9GVVRVUkVfVVNBR0UKLWFjcGlfc3RhdHVzCi1hY3BpX2luc3RhbGxfaW5pdGlhbGl6YXRpb25faGFuZGxlcihhY3BpX2luaXRfaGFuZGxlciBoYW5kbGVyLCB1MzIgZnVuY3Rpb24pOwotI2VuZGlmCi0KIC8qCiAgKiBBQ1BJIE1lbW9yeSBtYW5hZ2VtZW50CiAgKi8KQEAgLTE5Myw5ICsyMTEsMTIgQEAKIGFjcGlfc3RhdHVzIGFjcGlfZ2V0X3BhcmVudChhY3BpX2hhbmRsZSBvYmplY3QsIGFjcGlfaGFuZGxlICogb3V0X2hhbmRsZSk7CiAKIC8qCi0gKiBFdmVudCBoYW5kbGVyIGludGVyZmFjZXMKKyAqIEhhbmRsZXIgaW50ZXJmYWNlcwogICovCiBhY3BpX3N0YXR1cworYWNwaV9pbnN0YWxsX2luaXRpYWxpemF0aW9uX2hhbmRsZXIoYWNwaV9pbml0X2hhbmRsZXIgaGFuZGxlciwgdTMyIGZ1bmN0aW9uKTsKKworYWNwaV9zdGF0dXMKIGFjcGlfaW5zdGFsbF9maXhlZF9ldmVudF9oYW5kbGVyKHUzMiBhY3BpX2V2ZW50LAogCQkJCSBhY3BpX2V2ZW50X2hhbmRsZXIgaGFuZGxlciwgdm9pZCAqY29udGV4dCk7CiAKQEAgLTIyNyw2ICsyNDgsMTAgQEAKIAkJCSB1MzIgZ3BlX251bWJlciwKIAkJCSB1MzIgdHlwZSwgYWNwaV9ldmVudF9oYW5kbGVyIGFkZHJlc3MsIHZvaWQgKmNvbnRleHQpOwogCithY3BpX3N0YXR1cworYWNwaV9yZW1vdmVfZ3BlX2hhbmRsZXIoYWNwaV9oYW5kbGUgZ3BlX2RldmljZSwKKwkJCXUzMiBncGVfbnVtYmVyLCBhY3BpX2V2ZW50X2hhbmRsZXIgYWRkcmVzcyk7CisKICNpZmRlZiBBQ1BJX0ZVVFVSRV9VU0FHRQogYWNwaV9zdGF0dXMgYWNwaV9pbnN0YWxsX2V4Y2VwdGlvbl9oYW5kbGVyKGFjcGlfZXhjZXB0aW9uX2hhbmRsZXIgaGFuZGxlcik7CiAjZW5kaWYKQEAgLTIzOCwxMCArMjYzLDYgQEAKIAogYWNwaV9zdGF0dXMgYWNwaV9yZWxlYXNlX2dsb2JhbF9sb2NrKHUzMiBoYW5kbGUpOwogCi1hY3BpX3N0YXR1cwotYWNwaV9yZW1vdmVfZ3BlX2hhbmRsZXIoYWNwaV9oYW5kbGUgZ3BlX2RldmljZSwKLQkJCXUzMiBncGVfbnVtYmVyLCBhY3BpX2V2ZW50X2hhbmRsZXIgYWRkcmVzcyk7Ci0KIGFjcGlfc3RhdHVzIGFjcGlfZW5hYmxlX2V2ZW50KHUzMiBldmVudCwgdTMyIGZsYWdzKTsKIAogYWNwaV9zdGF0dXMgYWNwaV9kaXNhYmxlX2V2ZW50KHUzMiBldmVudCwgdTMyIGZsYWdzKTsKQEAgLTI1MCw2ICsyNzEsOSBAQAogCiBhY3BpX3N0YXR1cyBhY3BpX2dldF9ldmVudF9zdGF0dXModTMyIGV2ZW50LCBhY3BpX2V2ZW50X3N0YXR1cyAqIGV2ZW50X3N0YXR1cyk7CiAKKy8qCisgKiBHUEUgSW50ZXJmYWNlcworICovCiBhY3BpX3N0YXR1cyBhY3BpX3NldF9ncGVfdHlwZShhY3BpX2hhbmRsZSBncGVfZGV2aWNlLCB1MzIgZ3BlX251bWJlciwgdTggdHlwZSk7CiAKIGFjcGlfc3RhdHVzIGFjcGlfZW5hYmxlX2dwZShhY3BpX2hhbmRsZSBncGVfZGV2aWNlLCB1MzIgZ3BlX251bWJlcik7CkBAIC0yNjMsNiArMjg3LDEyIEBACiAJCSAgICB1MzIgZ3BlX251bWJlciwKIAkJICAgIHUzMiBmbGFncywgYWNwaV9ldmVudF9zdGF0dXMgKiBldmVudF9zdGF0dXMpOwogCithY3BpX3N0YXR1cyBhY3BpX2Rpc2FibGVfYWxsX2dwZXModm9pZCk7CisKK2FjcGlfc3RhdHVzIGFjcGlfZW5hYmxlX2FsbF9ydW50aW1lX2dwZXModm9pZCk7CisKK2FjcGlfc3RhdHVzIGFjcGlfZ2V0X2dwZV9kZXZpY2UodTMyIGdwZV9pbmRleCwgYWNwaV9oYW5kbGUgKmdwZV9kZXZpY2UpOworCiBhY3BpX3N0YXR1cwogYWNwaV9pbnN0YWxsX2dwZV9ibG9jayhhY3BpX2hhbmRsZSBncGVfZGV2aWNlLAogCQkgICAgICAgc3RydWN0IGFjcGlfZ2VuZXJpY19hZGRyZXNzICpncGVfYmxvY2tfYWRkcmVzcywKQEAgLTMxMyw2ICszNDMsOCBAQAogLyoKICAqIEhhcmR3YXJlIChBQ1BJIGRldmljZSkgaW50ZXJmYWNlcwogICovCithY3BpX3N0YXR1cyBhY3BpX3Jlc2V0KHZvaWQpOworCiBhY3BpX3N0YXR1cyBhY3BpX2dldF9yZWdpc3Rlcih1MzIgcmVnaXN0ZXJfaWQsIHUzMiAqIHJldHVybl92YWx1ZSk7CiAKIGFjcGlfc3RhdHVzIGFjcGlfZ2V0X3JlZ2lzdGVyX3VubG9ja2VkKHUzMiByZWdpc3Rlcl9pZCwgdTMyICpyZXR1cm5fdmFsdWUpOwpAQCAtMzIwLDEyICszNTIsMTQgQEAKIGFjcGlfc3RhdHVzIGFjcGlfc2V0X3JlZ2lzdGVyKHUzMiByZWdpc3Rlcl9pZCwgdTMyIHZhbHVlKTsKIAogYWNwaV9zdGF0dXMKLWFjcGlfc2V0X2Zpcm13YXJlX3dha2luZ192ZWN0b3IoYWNwaV9waHlzaWNhbF9hZGRyZXNzIHBoeXNpY2FsX2FkZHJlc3MpOworYWNwaV9zZXRfZmlybXdhcmVfd2FraW5nX3ZlY3Rvcih1MzIgcGh5c2ljYWxfYWRkcmVzcyk7CiAKLSNpZmRlZiBBQ1BJX0ZVVFVSRV9VU0FHRQogYWNwaV9zdGF0dXMKLWFjcGlfZ2V0X2Zpcm13YXJlX3dha2luZ192ZWN0b3IoYWNwaV9waHlzaWNhbF9hZGRyZXNzICogcGh5c2ljYWxfYWRkcmVzcyk7Ci0jZW5kaWYKK2FjcGlfc2V0X2Zpcm13YXJlX3dha2luZ192ZWN0b3I2NCh1NjQgcGh5c2ljYWxfYWRkcmVzcyk7CisKK2FjcGlfc3RhdHVzIGFjcGlfcmVhZCh1MzIgKnZhbHVlLCBzdHJ1Y3QgYWNwaV9nZW5lcmljX2FkZHJlc3MgKnJlZyk7CisKK2FjcGlfc3RhdHVzIGFjcGlfd3JpdGUodTMyIHZhbHVlLCBzdHJ1Y3QgYWNwaV9nZW5lcmljX2FkZHJlc3MgKnJlZyk7CiAKIGFjcGlfc3RhdHVzCiBhY3BpX2dldF9zbGVlcF90eXBlX2RhdGEodTggc2xlZXBfc3RhdGUsIHU4ICogc2xwX3R5cF9hLCB1OCAqIHNscF90eXBfYik7CkBAIC0zNDAsNCArMzc0LDQyIEBACiAKIGFjcGlfc3RhdHVzIGFjcGlfbGVhdmVfc2xlZXBfc3RhdGUodTggc2xlZXBfc3RhdGUpOwogCisvKgorICogRGVidWcgb3V0cHV0CisgKi8KK3ZvaWQgQUNQSV9JTlRFUk5BTF9WQVJfWEZBQ0UKK2FjcGlfZXJyb3IoY29uc3QgY2hhciAqbW9kdWxlX25hbWUsCisJICAgdTMyIGxpbmVfbnVtYmVyLCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikgQUNQSV9QUklOVEZfTElLRSgzKTsKKwordm9pZCBBQ1BJX0lOVEVSTkFMX1ZBUl9YRkFDRQorYWNwaV9leGNlcHRpb24oY29uc3QgY2hhciAqbW9kdWxlX25hbWUsCisJICAgICAgIHUzMiBsaW5lX251bWJlciwKKwkgICAgICAgYWNwaV9zdGF0dXMgc3RhdHVzLCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikgQUNQSV9QUklOVEZfTElLRSg0KTsKKwordm9pZCBBQ1BJX0lOVEVSTkFMX1ZBUl9YRkFDRQorYWNwaV93YXJuaW5nKGNvbnN0IGNoYXIgKm1vZHVsZV9uYW1lLAorCSAgICAgdTMyIGxpbmVfbnVtYmVyLCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikgQUNQSV9QUklOVEZfTElLRSgzKTsKKwordm9pZCBBQ1BJX0lOVEVSTkFMX1ZBUl9YRkFDRQorYWNwaV9pbmZvKGNvbnN0IGNoYXIgKm1vZHVsZV9uYW1lLAorCSAgdTMyIGxpbmVfbnVtYmVyLCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikgQUNQSV9QUklOVEZfTElLRSgzKTsKKworI2lmZGVmIEFDUElfREVCVUdfT1VUUFVUCisKK3ZvaWQgQUNQSV9JTlRFUk5BTF9WQVJfWEZBQ0UKK2FjcGlfZGVidWdfcHJpbnQodTMyIHJlcXVlc3RlZF9kZWJ1Z19sZXZlbCwKKwkJIHUzMiBsaW5lX251bWJlciwKKwkJIGNvbnN0IGNoYXIgKmZ1bmN0aW9uX25hbWUsCisJCSBjb25zdCBjaGFyICptb2R1bGVfbmFtZSwKKwkJIHUzMiBjb21wb25lbnRfaWQsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKSBBQ1BJX1BSSU5URl9MSUtFKDYpOworCit2b2lkIEFDUElfSU5URVJOQUxfVkFSX1hGQUNFCithY3BpX2RlYnVnX3ByaW50X3Jhdyh1MzIgcmVxdWVzdGVkX2RlYnVnX2xldmVsLAorCQkgICAgIHUzMiBsaW5lX251bWJlciwKKwkJICAgICBjb25zdCBjaGFyICpmdW5jdGlvbl9uYW1lLAorCQkgICAgIGNvbnN0IGNoYXIgKm1vZHVsZV9uYW1lLAorCQkgICAgIHUzMiBjb21wb25lbnRfaWQsCisJCSAgICAgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pIEFDUElfUFJJTlRGX0xJS0UoNik7CisjZW5kaWYKKwogI2VuZGlmCQkJCS8qIF9fQUNYRkFDRV9IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYWNwaS9hY3Jlc3R5cC5oIGIvaW5jbHVkZS9hY3BpL2FjcmVzdHlwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWZmZTAwZgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYWNwaS9hY3Jlc3R5cC5oCkBAIC0wLDAgKzEsNDA1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogTmFtZTogYWNyZXN0eXAuaCAtIERlZmluZXMsIHR5cGVzLCBhbmQgc3RydWN0dXJlcyBmb3IgcmVzb3VyY2UgZGVzY3JpcHRvcnMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA4LCBJbnRlbCBDb3JwLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAorICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgYXQgbWluaW11bSBhIGRpc2NsYWltZXIKKyAqICAgIHN1YnN0YW50aWFsbHkgc2ltaWxhciB0byB0aGUgIk5PIFdBUlJBTlRZIiBkaXNjbGFpbWVyIGJlbG93CisgKiAgICAoIkRpc2NsYWltZXIiKSBhbmQgYW55IHJlZGlzdHJpYnV0aW9uIG11c3QgYmUgY29uZGl0aW9uZWQgdXBvbgorICogICAgaW5jbHVkaW5nIGEgc3Vic3RhbnRpYWxseSBzaW1pbGFyIERpc2NsYWltZXIgcmVxdWlyZW1lbnQgZm9yIGZ1cnRoZXIKKyAqICAgIGJpbmFyeSByZWRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcworICogICAgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBOTyBXQVJSQU5UWQorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcKKyAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgorICovCisKKyNpZm5kZWYgX19BQ1JFU1RZUF9IX18KKyNkZWZpbmUgX19BQ1JFU1RZUF9IX18KKworLyoKKyAqIERlZmluaXRpb25zIGZvciBSZXNvdXJjZSBBdHRyaWJ1dGVzCisgKi8KK3R5cGVkZWYgdTE2IGFjcGlfcnNfbGVuZ3RoOwkvKiBSZXNvdXJjZSBMZW5ndGggZmllbGQgaXMgZml4ZWQgYXQgMTYgYml0cyAqLwordHlwZWRlZiB1MzIgYWNwaV9yc2Rlc2Nfc2l6ZTsJLyogTWF4IFJlc291cmNlIERlc2NyaXB0b3Igc2l6ZSBpcyAoTGVuZ3RoKzMpID0gKDY0X2stMSkrMyAqLworCisvKgorICogTWVtb3J5IEF0dHJpYnV0ZXMKKyAqLworI2RlZmluZSBBQ1BJX1JFQURfT05MWV9NRU1PUlkgICAgICAgICAgICh1OCkgMHgwMAorI2RlZmluZSBBQ1BJX1JFQURfV1JJVEVfTUVNT1JZICAgICAgICAgICh1OCkgMHgwMQorCisjZGVmaW5lIEFDUElfTk9OX0NBQ0hFQUJMRV9NRU1PUlkgICAgICAgKHU4KSAweDAwCisjZGVmaW5lIEFDUElfQ0FDSEFCTEVfTUVNT1JZICAgICAgICAgICAgKHU4KSAweDAxCisjZGVmaW5lIEFDUElfV1JJVEVfQ09NQklOSU5HX01FTU9SWSAgICAgKHU4KSAweDAyCisjZGVmaW5lIEFDUElfUFJFRkVUQ0hBQkxFX01FTU9SWSAgICAgICAgKHU4KSAweDAzCisKKy8qCisgKiBJTyBBdHRyaWJ1dGVzCisgKiBUaGUgSVNBIElPIHJhbmdlcyBhcmU6ICAgICBuMDAwLW4wX2ZGaCwgbjQwMC1uNF9mRmgsIG44MDAtbjhfZkZoLCBuX2MwMC1uX2NGRmguCisgKiBUaGUgbm9uLUlTQSBJTyByYW5nZXMgYXJlOiBuMTAwLW4zX2ZGaCwgbjUwMC1uN19mRmgsIG45MDAtbl9iRkZoLCBuX2NkMC1uX2ZGRmguCisgKi8KKyNkZWZpbmUgQUNQSV9OT05fSVNBX09OTFlfUkFOR0VTICAgICAgICAodTgpIDB4MDEKKyNkZWZpbmUgQUNQSV9JU0FfT05MWV9SQU5HRVMgICAgICAgICAgICAodTgpIDB4MDIKKyNkZWZpbmUgQUNQSV9FTlRJUkVfUkFOR0UgICAgICAgICAgICAgICAoQUNQSV9OT05fSVNBX09OTFlfUkFOR0VTIHwgQUNQSV9JU0FfT05MWV9SQU5HRVMpCisKKy8qIFR5cGUgb2YgdHJhbnNsYXRpb24gLSAxPVNwYXJzZSwgMD1EZW5zZSAqLworCisjZGVmaW5lIEFDUElfU1BBUlNFX1RSQU5TTEFUSU9OICAgICAgICAgKHU4KSAweDAxCisKKy8qCisgKiBJTyBQb3J0IERlc2NyaXB0b3IgRGVjb2RlCisgKi8KKyNkZWZpbmUgQUNQSV9ERUNPREVfMTAgICAgICAgICAgICAgICAgICAodTgpIDB4MDAJLyogMTAtYml0IElPIGFkZHJlc3MgZGVjb2RlICovCisjZGVmaW5lIEFDUElfREVDT0RFXzE2ICAgICAgICAgICAgICAgICAgKHU4KSAweDAxCS8qIDE2LWJpdCBJTyBhZGRyZXNzIGRlY29kZSAqLworCisvKgorICogSVJRIEF0dHJpYnV0ZXMKKyAqLworI2RlZmluZSBBQ1BJX0xFVkVMX1NFTlNJVElWRSAgICAgICAgICAgICh1OCkgMHgwMAorI2RlZmluZSBBQ1BJX0VER0VfU0VOU0lUSVZFICAgICAgICAgICAgICh1OCkgMHgwMQorCisjZGVmaW5lIEFDUElfQUNUSVZFX0hJR0ggICAgICAgICAgICAgICAgKHU4KSAweDAwCisjZGVmaW5lIEFDUElfQUNUSVZFX0xPVyAgICAgICAgICAgICAgICAgKHU4KSAweDAxCisKKyNkZWZpbmUgQUNQSV9FWENMVVNJVkUgICAgICAgICAgICAgICAgICAodTgpIDB4MDAKKyNkZWZpbmUgQUNQSV9TSEFSRUQgICAgICAgICAgICAgICAgICAgICAodTgpIDB4MDEKKworLyoKKyAqIERNQSBBdHRyaWJ1dGVzCisgKi8KKyNkZWZpbmUgQUNQSV9DT01QQVRJQklMSVRZICAgICAgICAgICAgICAodTgpIDB4MDAKKyNkZWZpbmUgQUNQSV9UWVBFX0EgICAgICAgICAgICAgICAgICAgICAodTgpIDB4MDEKKyNkZWZpbmUgQUNQSV9UWVBFX0IgICAgICAgICAgICAgICAgICAgICAodTgpIDB4MDIKKyNkZWZpbmUgQUNQSV9UWVBFX0YgICAgICAgICAgICAgICAgICAgICAodTgpIDB4MDMKKworI2RlZmluZSBBQ1BJX05PVF9CVVNfTUFTVEVSICAgICAgICAgICAgICh1OCkgMHgwMAorI2RlZmluZSBBQ1BJX0JVU19NQVNURVIgICAgICAgICAgICAgICAgICh1OCkgMHgwMQorCisjZGVmaW5lIEFDUElfVFJBTlNGRVJfOCAgICAgICAgICAgICAgICAgKHU4KSAweDAwCisjZGVmaW5lIEFDUElfVFJBTlNGRVJfOF8xNiAgICAgICAgICAgICAgKHU4KSAweDAxCisjZGVmaW5lIEFDUElfVFJBTlNGRVJfMTYgICAgICAgICAgICAgICAgKHU4KSAweDAyCisKKy8qCisgKiBTdGFydCBEZXBlbmRlbnQgRnVuY3Rpb25zIFByaW9yaXR5IGRlZmluaXRpb25zCisgKi8KKyNkZWZpbmUgQUNQSV9HT09EX0NPTkZJR1VSQVRJT04gICAgICAgICAodTgpIDB4MDAKKyNkZWZpbmUgQUNQSV9BQ0NFUFRBQkxFX0NPTkZJR1VSQVRJT04gICAodTgpIDB4MDEKKyNkZWZpbmUgQUNQSV9TVUJfT1BUSU1BTF9DT05GSUdVUkFUSU9OICAodTgpIDB4MDIKKworLyoKKyAqIDE2LCAzMiBhbmQgNjQtYml0IEFkZHJlc3MgRGVzY3JpcHRvciByZXNvdXJjZSB0eXBlcworICovCisjZGVmaW5lIEFDUElfTUVNT1JZX1JBTkdFICAgICAgICAgICAgICAgKHU4KSAweDAwCisjZGVmaW5lIEFDUElfSU9fUkFOR0UgICAgICAgICAgICAgICAgICAgKHU4KSAweDAxCisjZGVmaW5lIEFDUElfQlVTX05VTUJFUl9SQU5HRSAgICAgICAgICAgKHU4KSAweDAyCisKKyNkZWZpbmUgQUNQSV9BRERSRVNTX05PVF9GSVhFRCAgICAgICAgICAodTgpIDB4MDAKKyNkZWZpbmUgQUNQSV9BRERSRVNTX0ZJWEVEICAgICAgICAgICAgICAodTgpIDB4MDEKKworI2RlZmluZSBBQ1BJX1BPU19ERUNPREUgICAgICAgICAgICAgICAgICh1OCkgMHgwMAorI2RlZmluZSBBQ1BJX1NVQl9ERUNPREUgICAgICAgICAgICAgICAgICh1OCkgMHgwMQorCisjZGVmaW5lIEFDUElfUFJPRFVDRVIgICAgICAgICAgICAgICAgICAgKHU4KSAweDAwCisjZGVmaW5lIEFDUElfQ09OU1VNRVIgICAgICAgICAgICAgICAgICAgKHU4KSAweDAxCisKKy8qCisgKiBJZiBwb3NzaWJsZSwgcGFjayB0aGUgZm9sbG93aW5nIHN0cnVjdHVyZXMgdG8gYnl0ZSBhbGlnbm1lbnQKKyAqLworI2lmbmRlZiBBQ1BJX01JU0FMSUdOTUVOVF9OT1RfU1VQUE9SVEVECisjcHJhZ21hIHBhY2soMSkKKyNlbmRpZgorCisvKiBVVUlEIGRhdGEgc3RydWN0dXJlcyBmb3IgdXNlIGluIHZlbmRvci1kZWZpbmVkIHJlc291cmNlIGRlc2NyaXB0b3JzICovCisKK3N0cnVjdCBhY3BpX3V1aWQgeworCXU4IGRhdGFbQUNQSV9VVUlEX0xFTkdUSF07Cit9OworCitzdHJ1Y3QgYWNwaV92ZW5kb3JfdXVpZCB7CisJdTggc3VidHlwZTsKKwl1OCBkYXRhW0FDUElfVVVJRF9MRU5HVEhdOworfTsKKworLyoKKyAqIFN0cnVjdHVyZXMgdXNlZCB0byBkZXNjcmliZSBkZXZpY2UgcmVzb3VyY2VzCisgKi8KK3N0cnVjdCBhY3BpX3Jlc291cmNlX2lycSB7CisJdTggZGVzY3JpcHRvcl9sZW5ndGg7CisJdTggdHJpZ2dlcmluZzsKKwl1OCBwb2xhcml0eTsKKwl1OCBzaGFyYWJsZTsKKwl1OCBpbnRlcnJ1cHRfY291bnQ7CisJdTggaW50ZXJydXB0c1sxXTsKK307CisKK3N0cnVjdCBhY3BpX3Jlc291cmNlX2RtYSB7CisJdTggdHlwZTsKKwl1OCBidXNfbWFzdGVyOworCXU4IHRyYW5zZmVyOworCXU4IGNoYW5uZWxfY291bnQ7CisJdTggY2hhbm5lbHNbMV07Cit9OworCitzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9zdGFydF9kZXBlbmRlbnQgeworCXU4IGRlc2NyaXB0b3JfbGVuZ3RoOworCXU4IGNvbXBhdGliaWxpdHlfcHJpb3JpdHk7CisJdTggcGVyZm9ybWFuY2Vfcm9idXN0bmVzczsKK307CisKKy8qCisgKiBUaGUgRU5EX0RFUEVOREVOVF9GVU5DVElPTlNfUkVTT1VSQ0Ugc3RydWN0IGlzIG5vdAorICogbmVlZGVkIGJlY2F1c2UgaXQgaGFzIG5vIGZpZWxkcworICovCisKK3N0cnVjdCBhY3BpX3Jlc291cmNlX2lvIHsKKwl1OCBpb19kZWNvZGU7CisJdTggYWxpZ25tZW50OworCXU4IGFkZHJlc3NfbGVuZ3RoOworCXUxNiBtaW5pbXVtOworCXUxNiBtYXhpbXVtOworfTsKKworc3RydWN0IGFjcGlfcmVzb3VyY2VfZml4ZWRfaW8geworCXUxNiBhZGRyZXNzOworCXU4IGFkZHJlc3NfbGVuZ3RoOworfTsKKworc3RydWN0IGFjcGlfcmVzb3VyY2VfdmVuZG9yIHsKKwl1MTYgYnl0ZV9sZW5ndGg7CisJdTggYnl0ZV9kYXRhWzFdOworfTsKKworLyogVmVuZG9yIHJlc291cmNlIHdpdGggVVVJRCBpbmZvIChpbnRyb2R1Y2VkIGluIEFDUEkgMy4wKSAqLworCitzdHJ1Y3QgYWNwaV9yZXNvdXJjZV92ZW5kb3JfdHlwZWQgeworCXUxNiBieXRlX2xlbmd0aDsKKwl1OCB1dWlkX3N1YnR5cGU7CisJdTggdXVpZFtBQ1BJX1VVSURfTEVOR1RIXTsKKwl1OCBieXRlX2RhdGFbMV07Cit9OworCitzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9lbmRfdGFnIHsKKwl1OCBjaGVja3N1bTsKK307CisKK3N0cnVjdCBhY3BpX3Jlc291cmNlX21lbW9yeTI0IHsKKwl1OCB3cml0ZV9wcm90ZWN0OworCXUxNiBtaW5pbXVtOworCXUxNiBtYXhpbXVtOworCXUxNiBhbGlnbm1lbnQ7CisJdTE2IGFkZHJlc3NfbGVuZ3RoOworfTsKKworc3RydWN0IGFjcGlfcmVzb3VyY2VfbWVtb3J5MzIgeworCXU4IHdyaXRlX3Byb3RlY3Q7CisJdTMyIG1pbmltdW07CisJdTMyIG1heGltdW07CisJdTMyIGFsaWdubWVudDsKKwl1MzIgYWRkcmVzc19sZW5ndGg7Cit9OworCitzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9maXhlZF9tZW1vcnkzMiB7CisJdTggd3JpdGVfcHJvdGVjdDsKKwl1MzIgYWRkcmVzczsKKwl1MzIgYWRkcmVzc19sZW5ndGg7Cit9OworCitzdHJ1Y3QgYWNwaV9tZW1vcnlfYXR0cmlidXRlIHsKKwl1OCB3cml0ZV9wcm90ZWN0OworCXU4IGNhY2hpbmc7CisJdTggcmFuZ2VfdHlwZTsKKwl1OCB0cmFuc2xhdGlvbjsKK307CisKK3N0cnVjdCBhY3BpX2lvX2F0dHJpYnV0ZSB7CisJdTggcmFuZ2VfdHlwZTsKKwl1OCB0cmFuc2xhdGlvbjsKKwl1OCB0cmFuc2xhdGlvbl90eXBlOworCXU4IHJlc2VydmVkMTsKK307CisKK3VuaW9uIGFjcGlfcmVzb3VyY2VfYXR0cmlidXRlIHsKKwlzdHJ1Y3QgYWNwaV9tZW1vcnlfYXR0cmlidXRlIG1lbTsKKwlzdHJ1Y3QgYWNwaV9pb19hdHRyaWJ1dGUgaW87CisKKwkvKiBVc2VkIGZvciB0aGUgKndvcmRfc3BhY2UgbWFjcm9zICovCisKKwl1OCB0eXBlX3NwZWNpZmljOworfTsKKworc3RydWN0IGFjcGlfcmVzb3VyY2Vfc291cmNlIHsKKwl1OCBpbmRleDsKKwl1MTYgc3RyaW5nX2xlbmd0aDsKKwljaGFyICpzdHJpbmdfcHRyOworfTsKKworLyogRmllbGRzIGNvbW1vbiB0byBhbGwgYWRkcmVzcyBkZXNjcmlwdG9ycywgMTYvMzIvNjQgYml0ICovCisKKyNkZWZpbmUgQUNQSV9SRVNPVVJDRV9BRERSRVNTX0NPTU1PTiBcCisJdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlX3R5cGU7IFwKKwl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZHVjZXJfY29uc3VtZXI7IFwKKwl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlOyBcCisJdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbl9hZGRyZXNzX2ZpeGVkOyBcCisJdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF9hZGRyZXNzX2ZpeGVkOyBcCisJdW5pb24gYWNwaV9yZXNvdXJjZV9hdHRyaWJ1dGUgICAgICAgICAgIGluZm87CisKK3N0cnVjdCBhY3BpX3Jlc291cmNlX2FkZHJlc3MgeworQUNQSV9SRVNPVVJDRV9BRERSRVNTX0NPTU1PTn07CisKK3N0cnVjdCBhY3BpX3Jlc291cmNlX2FkZHJlc3MxNiB7CisJQUNQSV9SRVNPVVJDRV9BRERSRVNTX0NPTU1PTiB1MTYgZ3JhbnVsYXJpdHk7CisJdTE2IG1pbmltdW07CisJdTE2IG1heGltdW07CisJdTE2IHRyYW5zbGF0aW9uX29mZnNldDsKKwl1MTYgYWRkcmVzc19sZW5ndGg7CisJc3RydWN0IGFjcGlfcmVzb3VyY2Vfc291cmNlIHJlc291cmNlX3NvdXJjZTsKK307CisKK3N0cnVjdCBhY3BpX3Jlc291cmNlX2FkZHJlc3MzMiB7CisJQUNQSV9SRVNPVVJDRV9BRERSRVNTX0NPTU1PTiB1MzIgZ3JhbnVsYXJpdHk7CisJdTMyIG1pbmltdW07CisJdTMyIG1heGltdW07CisJdTMyIHRyYW5zbGF0aW9uX29mZnNldDsKKwl1MzIgYWRkcmVzc19sZW5ndGg7CisJc3RydWN0IGFjcGlfcmVzb3VyY2Vfc291cmNlIHJlc291cmNlX3NvdXJjZTsKK307CisKK3N0cnVjdCBhY3BpX3Jlc291cmNlX2FkZHJlc3M2NCB7CisJQUNQSV9SRVNPVVJDRV9BRERSRVNTX0NPTU1PTiB1NjQgZ3JhbnVsYXJpdHk7CisJdTY0IG1pbmltdW07CisJdTY0IG1heGltdW07CisJdTY0IHRyYW5zbGF0aW9uX29mZnNldDsKKwl1NjQgYWRkcmVzc19sZW5ndGg7CisJc3RydWN0IGFjcGlfcmVzb3VyY2Vfc291cmNlIHJlc291cmNlX3NvdXJjZTsKK307CisKK3N0cnVjdCBhY3BpX3Jlc291cmNlX2V4dGVuZGVkX2FkZHJlc3M2NCB7CisJQUNQSV9SRVNPVVJDRV9BRERSRVNTX0NPTU1PTiB1OCByZXZpc2lvbl9pRDsKKwl1NjQgZ3JhbnVsYXJpdHk7CisJdTY0IG1pbmltdW07CisJdTY0IG1heGltdW07CisJdTY0IHRyYW5zbGF0aW9uX29mZnNldDsKKwl1NjQgYWRkcmVzc19sZW5ndGg7CisJdTY0IHR5cGVfc3BlY2lmaWM7Cit9OworCitzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9leHRlbmRlZF9pcnEgeworCXU4IHByb2R1Y2VyX2NvbnN1bWVyOworCXU4IHRyaWdnZXJpbmc7CisJdTggcG9sYXJpdHk7CisJdTggc2hhcmFibGU7CisJdTggaW50ZXJydXB0X2NvdW50OworCXN0cnVjdCBhY3BpX3Jlc291cmNlX3NvdXJjZSByZXNvdXJjZV9zb3VyY2U7CisJdTMyIGludGVycnVwdHNbMV07Cit9OworCitzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9nZW5lcmljX3JlZ2lzdGVyIHsKKwl1OCBzcGFjZV9pZDsKKwl1OCBiaXRfd2lkdGg7CisJdTggYml0X29mZnNldDsKKwl1OCBhY2Nlc3Nfc2l6ZTsKKwl1NjQgYWRkcmVzczsKK307CisKKy8qIEFDUElfUkVTT1VSQ0VfVFlQRXMgKi8KKworI2RlZmluZSBBQ1BJX1JFU09VUkNFX1RZUEVfSVJRICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBBQ1BJX1JFU09VUkNFX1RZUEVfRE1BICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBBQ1BJX1JFU09VUkNFX1RZUEVfU1RBUlRfREVQRU5ERU5UICAgICAgMgorI2RlZmluZSBBQ1BJX1JFU09VUkNFX1RZUEVfRU5EX0RFUEVOREVOVCAgICAgICAgMworI2RlZmluZSBBQ1BJX1JFU09VUkNFX1RZUEVfSU8gICAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBBQ1BJX1JFU09VUkNFX1RZUEVfRklYRURfSU8gICAgICAgICAgICAgNQorI2RlZmluZSBBQ1BJX1JFU09VUkNFX1RZUEVfVkVORE9SICAgICAgICAgICAgICAgNgorI2RlZmluZSBBQ1BJX1JFU09VUkNFX1RZUEVfRU5EX1RBRyAgICAgICAgICAgICAgNworI2RlZmluZSBBQ1BJX1JFU09VUkNFX1RZUEVfTUVNT1JZMjQgICAgICAgICAgICAgOAorI2RlZmluZSBBQ1BJX1JFU09VUkNFX1RZUEVfTUVNT1JZMzIgICAgICAgICAgICAgOQorI2RlZmluZSBBQ1BJX1JFU09VUkNFX1RZUEVfRklYRURfTUVNT1JZMzIgICAgICAgMTAKKyNkZWZpbmUgQUNQSV9SRVNPVVJDRV9UWVBFX0FERFJFU1MxNiAgICAgICAgICAgIDExCisjZGVmaW5lIEFDUElfUkVTT1VSQ0VfVFlQRV9BRERSRVNTMzIgICAgICAgICAgICAxMgorI2RlZmluZSBBQ1BJX1JFU09VUkNFX1RZUEVfQUREUkVTUzY0ICAgICAgICAgICAgMTMKKyNkZWZpbmUgQUNQSV9SRVNPVVJDRV9UWVBFX0VYVEVOREVEX0FERFJFU1M2NCAgIDE0CS8qIEFDUEkgMy4wICovCisjZGVmaW5lIEFDUElfUkVTT1VSQ0VfVFlQRV9FWFRFTkRFRF9JUlEgICAgICAgICAxNQorI2RlZmluZSBBQ1BJX1JFU09VUkNFX1RZUEVfR0VORVJJQ19SRUdJU1RFUiAgICAgMTYKKyNkZWZpbmUgQUNQSV9SRVNPVVJDRV9UWVBFX01BWCAgICAgICAgICAgICAgICAgIDE2CisKKy8qIE1hc3RlciB1bmlvbiBmb3IgcmVzb3VyY2UgZGVzY3JpcHRvcnMgKi8KKwordW5pb24gYWNwaV9yZXNvdXJjZV9kYXRhIHsKKwlzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9pcnEgaXJxOworCXN0cnVjdCBhY3BpX3Jlc291cmNlX2RtYSBkbWE7CisJc3RydWN0IGFjcGlfcmVzb3VyY2Vfc3RhcnRfZGVwZW5kZW50IHN0YXJ0X2RwZjsKKwlzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9pbyBpbzsKKwlzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9maXhlZF9pbyBmaXhlZF9pbzsKKwlzdHJ1Y3QgYWNwaV9yZXNvdXJjZV92ZW5kb3IgdmVuZG9yOworCXN0cnVjdCBhY3BpX3Jlc291cmNlX3ZlbmRvcl90eXBlZCB2ZW5kb3JfdHlwZWQ7CisJc3RydWN0IGFjcGlfcmVzb3VyY2VfZW5kX3RhZyBlbmRfdGFnOworCXN0cnVjdCBhY3BpX3Jlc291cmNlX21lbW9yeTI0IG1lbW9yeTI0OworCXN0cnVjdCBhY3BpX3Jlc291cmNlX21lbW9yeTMyIG1lbW9yeTMyOworCXN0cnVjdCBhY3BpX3Jlc291cmNlX2ZpeGVkX21lbW9yeTMyIGZpeGVkX21lbW9yeTMyOworCXN0cnVjdCBhY3BpX3Jlc291cmNlX2FkZHJlc3MxNiBhZGRyZXNzMTY7CisJc3RydWN0IGFjcGlfcmVzb3VyY2VfYWRkcmVzczMyIGFkZHJlc3MzMjsKKwlzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9hZGRyZXNzNjQgYWRkcmVzczY0OworCXN0cnVjdCBhY3BpX3Jlc291cmNlX2V4dGVuZGVkX2FkZHJlc3M2NCBleHRfYWRkcmVzczY0OworCXN0cnVjdCBhY3BpX3Jlc291cmNlX2V4dGVuZGVkX2lycSBleHRlbmRlZF9pcnE7CisJc3RydWN0IGFjcGlfcmVzb3VyY2VfZ2VuZXJpY19yZWdpc3RlciBnZW5lcmljX3JlZzsKKworCS8qIENvbW1vbiBmaWVsZHMgKi8KKworCXN0cnVjdCBhY3BpX3Jlc291cmNlX2FkZHJlc3MgYWRkcmVzczsJLyogQ29tbW9uIDE2LzMyLzY0IGFkZHJlc3MgZmllbGRzICovCit9OworCisvKiBDb21tb24gcmVzb3VyY2UgaGVhZGVyICovCisKK3N0cnVjdCBhY3BpX3Jlc291cmNlIHsKKwl1MzIgdHlwZTsKKwl1MzIgbGVuZ3RoOworCXVuaW9uIGFjcGlfcmVzb3VyY2VfZGF0YSBkYXRhOworfTsKKworLyogcmVzdG9yZSBkZWZhdWx0IGFsaWdubWVudCAqLworCisjcHJhZ21hIHBhY2soKQorCisjZGVmaW5lIEFDUElfUlNfU0laRV9OT19EQVRBICAgICAgICAgICAgICAgIDgJLyogSWQgKyBMZW5ndGggZmllbGRzICovCisjZGVmaW5lIEFDUElfUlNfU0laRV9NSU4gICAgICAgICAgICAgICAgICAgICh1MzIpIEFDUElfUk9VTkRfVVBfVE9fTkFUSVZFX1dPUkQgKDEyKQorI2RlZmluZSBBQ1BJX1JTX1NJWkUodHlwZSkgICAgICAgICAgICAgICAgICAodTMyKSAoQUNQSV9SU19TSVpFX05PX0RBVEEgKyBzaXplb2YgKHR5cGUpKQorCisjZGVmaW5lIEFDUElfTkVYVF9SRVNPVVJDRShyZXMpICAgICAgICAgICAgIChzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAqKSgodTggKikgcmVzICsgcmVzLT5sZW5ndGgpCisKK3N0cnVjdCBhY3BpX3BjaV9yb3V0aW5nX3RhYmxlIHsKKwl1MzIgbGVuZ3RoOworCXUzMiBwaW47CisJYWNwaV9pbnRlZ2VyIGFkZHJlc3M7CS8qIGhlcmUgZm9yIDY0LWJpdCBhbGlnbm1lbnQgKi8KKwl1MzIgc291cmNlX2luZGV4OworCWNoYXIgc291cmNlWzRdOwkJLyogcGFkIHRvIDY0IGJpdHMgc28gc2l6ZW9mKCkgd29ya3MgaW4gYWxsIGNhc2VzICovCit9OworCisjZW5kaWYJCQkJLyogX19BQ1JFU1RZUF9IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYWNwaS9hY3RhYmxlcy5oIGIvaW5jbHVkZS9hY3BpL2FjdGFibGVzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjYmUxYjkuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hY3BpL2FjdGFibGVzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIE5hbWU6IGFjdGFibGVzLmggLSBBQ1BJIHRhYmxlIG1hbmFnZW1lbnQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA4LCBJbnRlbCBDb3JwLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAotICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgYXQgbWluaW11bSBhIGRpc2NsYWltZXIKLSAqICAgIHN1YnN0YW50aWFsbHkgc2ltaWxhciB0byB0aGUgIk5PIFdBUlJBTlRZIiBkaXNjbGFpbWVyIGJlbG93Ci0gKiAgICAoIkRpc2NsYWltZXIiKSBhbmQgYW55IHJlZGlzdHJpYnV0aW9uIG11c3QgYmUgY29uZGl0aW9uZWQgdXBvbgotICogICAgaW5jbHVkaW5nIGEgc3Vic3RhbnRpYWxseSBzaW1pbGFyIERpc2NsYWltZXIgcmVxdWlyZW1lbnQgZm9yIGZ1cnRoZXIKLSAqICAgIGJpbmFyeSByZWRpc3RyaWJ1dGlvbi4KLSAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcwotICogICAgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICogU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBOTyBXQVJSQU5UWQotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCi0gKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUwotICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcKLSAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQotICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgotICovCi0KLSNpZm5kZWYgX19BQ1RBQkxFU19IX18KLSNkZWZpbmUgX19BQ1RBQkxFU19IX18KLQotYWNwaV9zdGF0dXMgYWNwaV9hbGxvY2F0ZV9yb290X3RhYmxlKHUzMiBpbml0aWFsX3RhYmxlX2NvdW50KTsKLQotLyoKLSAqIHRiZmFkdCAtIEZBRFQgcGFyc2UvY29udmVydC92YWxpZGF0ZQotICovCi12b2lkIGFjcGlfdGJfcGFyc2VfZmFkdCh1MzIgdGFibGVfaW5kZXgsIHU4IGZsYWdzKTsKLQotdm9pZCBhY3BpX3RiX2NyZWF0ZV9sb2NhbF9mYWR0KHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqdGFibGUsIHUzMiBsZW5ndGgpOwotCi0vKgotICogdGJmaW5kIC0gZmluZCBBQ1BJIHRhYmxlCi0gKi8KLWFjcGlfc3RhdHVzCi1hY3BpX3RiX2ZpbmRfdGFibGUoY2hhciAqc2lnbmF0dXJlLAotCQkgICBjaGFyICpvZW1faWQsIGNoYXIgKm9lbV90YWJsZV9pZCwgdTMyICp0YWJsZV9pbmRleCk7Ci0KLS8qCi0gKiB0Ymluc3RhbCAtIFRhYmxlIHJlbW92YWwgYW5kIGRlbGV0aW9uCi0gKi8KLWFjcGlfc3RhdHVzIGFjcGlfdGJfcmVzaXplX3Jvb3RfdGFibGVfbGlzdCh2b2lkKTsKLQotYWNwaV9zdGF0dXMgYWNwaV90Yl92ZXJpZnlfdGFibGUoc3RydWN0IGFjcGlfdGFibGVfZGVzYyAqdGFibGVfZGVzYyk7Ci0KLWFjcGlfc3RhdHVzCi1hY3BpX3RiX2FkZF90YWJsZShzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjICp0YWJsZV9kZXNjLCB1MzIgKnRhYmxlX2luZGV4KTsKLQotYWNwaV9zdGF0dXMKLWFjcGlfdGJfc3RvcmVfdGFibGUoYWNwaV9waHlzaWNhbF9hZGRyZXNzIGFkZHJlc3MsCi0JCSAgICBzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKnRhYmxlLAotCQkgICAgdTMyIGxlbmd0aCwgdTggZmxhZ3MsIHUzMiAqdGFibGVfaW5kZXgpOwotCi12b2lkIGFjcGlfdGJfZGVsZXRlX3RhYmxlKHN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgKnRhYmxlX2Rlc2MpOwotCi12b2lkIGFjcGlfdGJfdGVybWluYXRlKHZvaWQpOwotCi12b2lkIGFjcGlfdGJfZGVsZXRlX25hbWVzcGFjZV9ieV9vd25lcih1MzIgdGFibGVfaW5kZXgpOwotCi1hY3BpX3N0YXR1cyBhY3BpX3RiX2FsbG9jYXRlX293bmVyX2lkKHUzMiB0YWJsZV9pbmRleCk7Ci0KLWFjcGlfc3RhdHVzIGFjcGlfdGJfcmVsZWFzZV9vd25lcl9pZCh1MzIgdGFibGVfaW5kZXgpOwotCi1hY3BpX3N0YXR1cyBhY3BpX3RiX2dldF9vd25lcl9pZCh1MzIgdGFibGVfaW5kZXgsIGFjcGlfb3duZXJfaWQgKm93bmVyX2lkKTsKLQotdTggYWNwaV90Yl9pc190YWJsZV9sb2FkZWQodTMyIHRhYmxlX2luZGV4KTsKLQotdm9pZCBhY3BpX3RiX3NldF90YWJsZV9sb2FkZWRfZmxhZyh1MzIgdGFibGVfaW5kZXgsIHU4IGlzX2xvYWRlZCk7Ci0KLS8qCi0gKiB0YnV0aWxzIC0gdGFibGUgbWFuYWdlciB1dGlsaXRpZXMKLSAqLwotdTggYWNwaV90Yl90YWJsZXNfbG9hZGVkKHZvaWQpOwotCi12b2lkCi1hY3BpX3RiX3ByaW50X3RhYmxlX2hlYWRlcihhY3BpX3BoeXNpY2FsX2FkZHJlc3MgYWRkcmVzcywKLQkJCSAgIHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqaGVhZGVyKTsKLQotdTggYWNwaV90Yl9jaGVja3N1bSh1OCAqYnVmZmVyLCB1MzIgbGVuZ3RoKTsKLQotYWNwaV9zdGF0dXMKLWFjcGlfdGJfdmVyaWZ5X2NoZWNrc3VtKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqdGFibGUsIHUzMiBsZW5ndGgpOwotCi12b2lkCi1hY3BpX3RiX2luc3RhbGxfdGFibGUoYWNwaV9waHlzaWNhbF9hZGRyZXNzIGFkZHJlc3MsCi0JCSAgICAgIHU4IGZsYWdzLCBjaGFyICpzaWduYXR1cmUsIHUzMiB0YWJsZV9pbmRleCk7Ci0KLWFjcGlfc3RhdHVzCi1hY3BpX3RiX3BhcnNlX3Jvb3RfdGFibGUoYWNwaV9waHlzaWNhbF9hZGRyZXNzIHJzZHBfYWRkcmVzcywgdTggZmxhZ3MpOwotCi0jZW5kaWYJCQkJLyogX19BQ1RBQkxFU19IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYWNwaS9hY3RibC5oIGIvaW5jbHVkZS9hY3BpL2FjdGJsLmgKaW5kZXggMTNhM2Q5YS4uYmY4ZDRjZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL2FjdGJsLmgKKysrIGIvaW5jbHVkZS9hY3BpL2FjdGJsLmgKQEAgLTI0NSw3ICsyNDUsNyBAQAogI2RlZmluZSBBQ1BJX0ZBRFRfUE9XRVJfQlVUVE9OICAgICAgKDE8PDQpCS8qIDA0OiBQb3dlciBidXR0b24gaXMgaGFuZGxlZCBhcyBhIGdlbmVyaWMgZmVhdHVyZSAqLwogI2RlZmluZSBBQ1BJX0ZBRFRfU0xFRVBfQlVUVE9OICAgICAgKDE8PDUpCS8qIDA1OiBTbGVlcCBidXR0b24gaXMgaGFuZGxlZCBhcyBhIGdlbmVyaWMgZmVhdHVyZSwgb3IgIG5vdCBwcmVzZW50ICovCiAjZGVmaW5lIEFDUElfRkFEVF9GSVhFRF9SVEMgICAgICAgICAoMTw8NikJLyogMDY6IFJUQyB3YWtldXAgc3RhdCBub3QgaW4gZml4ZWQgcmVnaXN0ZXIgc3BhY2UgKi8KLSNkZWZpbmUgQUNQSV9GQURUX1M0X1JUQ19XQUtFICAgICAgICgxPDw3KQkvKiAwNzogUlRDIHdha2V1cCBzdGF0IG5vdCBwb3NzaWJsZSBmcm9tIFM0ICovCisjZGVmaW5lIEFDUElfRkFEVF9TNF9SVENfV0FLRSAgICAgICAoMTw8NykJLyogMDc6IFJUQyB3YWtldXAgcG9zc2libGUgZnJvbSBTNCAqLwogI2RlZmluZSBBQ1BJX0ZBRFRfMzJCSVRfVElNRVIgICAgICAgKDE8PDgpCS8qIDA4OiB0bXJfdmFsIGlzIDMyIGJpdHMgMD0yNC1iaXRzICovCiAjZGVmaW5lIEFDUElfRkFEVF9ET0NLSU5HX1NVUFBPUlRFRCAoMTw8OSkJLyogMDk6IERvY2tpbmcgc3VwcG9ydGVkICovCiAjZGVmaW5lIEFDUElfRkFEVF9SRVNFVF9SRUdJU1RFUiAgICAoMTw8MTApCS8qIDEwOiBTeXN0ZW0gcmVzZXQgdmlhIHRoZSBGQURUIFJFU0VUX1JFRyBzdXBwb3J0ZWQgKi8KQEAgLTI4OCw2ICsyODgsMzEgQEAKIAogI2RlZmluZSBBQ1BJX0ZBRFRfT0ZGU0VUKGYpICAgICAgICAgICAgICh1OCkgQUNQSV9PRkZTRVQgKHN0cnVjdCBhY3BpX3RhYmxlX2ZhZHQsIGYpCiAKK3VuaW9uIGFjcGlfbmFtZV91bmlvbiB7CisJdTMyIGludGVnZXI7CisJY2hhciBhc2NpaVs0XTsKK307CisKKy8qCisgKiBJbnRlcm5hbCBBQ1BJIFRhYmxlIERlc2NyaXB0b3IuIE9uZSBwZXIgQUNQSSB0YWJsZQorICovCitzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjIHsKKwlhY3BpX3BoeXNpY2FsX2FkZHJlc3MgYWRkcmVzczsKKwlzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKnBvaW50ZXI7CisJdTMyIGxlbmd0aDsJCS8qIExlbmd0aCBmaXhlZCBhdCAzMiBiaXRzICovCisJdW5pb24gYWNwaV9uYW1lX3VuaW9uIHNpZ25hdHVyZTsKKwlhY3BpX293bmVyX2lkIG93bmVyX2lkOworCXU4IGZsYWdzOworfTsKKworLyogRmxhZ3MgZm9yIGFib3ZlICovCisKKyNkZWZpbmUgQUNQSV9UQUJMRV9PUklHSU5fVU5LTk9XTiAgICAgICAoMCkKKyNkZWZpbmUgQUNQSV9UQUJMRV9PUklHSU5fTUFQUEVEICAgICAgICAoMSkKKyNkZWZpbmUgQUNQSV9UQUJMRV9PUklHSU5fQUxMT0NBVEVEICAgICAoMikKKyNkZWZpbmUgQUNQSV9UQUJMRV9PUklHSU5fTUFTSyAgICAgICAgICAoMykKKyNkZWZpbmUgQUNQSV9UQUJMRV9JU19MT0FERUQgICAgICAgICAgICAoNCkKKwogLyoKICAqIEdldCB0aGUgcmVtYWluaW5nIEFDUEkgdGFibGVzCiAgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYWNwaS9hY3RibDEuaCBiL2luY2x1ZGUvYWNwaS9hY3RibDEuaAppbmRleCA2M2Y1YjRjLi4xODk2M2I5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FjcGkvYWN0YmwxLmgKKysrIGIvaW5jbHVkZS9hY3BpL2FjdGJsMS5oCkBAIC02MjcsNyArNjI3LDcgQEAKIAl1MzIgdW5jb3JyZWN0YWJsZV9lcnJvcl9tYXNrOwogCXUzMiB1bmNvcnJlY3RhYmxlX2Vycm9yX3NldmVyaXR5OwogCXUzMiBjb3JyZWN0YWJsZV9lcnJvcl9tYXNrOwotCXUzMiBhZHZhbmNlZF9lcnJvcl9jYWJhYmlsaXRpZXM7CisJdTMyIGFkdmFuY2VkX2Vycm9yX2NhcGFiaWxpdGllczsKIH07CiAKIC8qIEhhcmR3YXJlIEVycm9yIE5vdGlmaWNhdGlvbiAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL2FjdHlwZXMuaCBiL2luY2x1ZGUvYWNwaS9hY3R5cGVzLmgKaW5kZXggNzIyMDM2MS4uYTIwYWFiNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL2FjdHlwZXMuaAorKysgYi9pbmNsdWRlL2FjcGkvYWN0eXBlcy5oCkBAIC0yMDQsMTEgKzIwNCwxMCBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKLSAqIE9TLWRlcGVuZGVudCBhbmQgY29tcGlsZXItZGVwZW5kZW50IHR5cGVzCisgKiBPUy1kZXBlbmRlbnQgdHlwZXMKICAqCiAgKiBJZiB0aGUgZGVmYXVsdHMgYmVsb3cgYXJlIG5vdCBhcHByb3ByaWF0ZSBmb3IgdGhlIGhvc3Qgc3lzdGVtLCB0aGV5IGNhbgotICogYmUgZGVmaW5lZCBpbiB0aGUgY29tcGlsZXItc3BlY2lmaWMgb3IgT1Mtc3BlY2lmaWMgaGVhZGVyLCBhbmQgdGhpcyB3aWxsCi0gKiB0YWtlIHByZWNlZGVuY2UuCisgKiBiZSBkZWZpbmVkIGluIHRoZSBPUy1zcGVjaWZpYyBoZWFkZXIsIGFuZCB0aGlzIHdpbGwgdGFrZSBwcmVjZWRlbmNlLgogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKQEAgLTIxOCwxMiArMjE3LDYgQEAKICNkZWZpbmUgYWNwaV90aHJlYWRfaWQJCQlhY3BpX3NpemUKICNlbmRpZgogCi0vKiBPYmplY3QgcmV0dXJuZWQgZnJvbSBhY3BpX29zX2NyZWF0ZV9sb2NrICovCi0KLSNpZm5kZWYgYWNwaV9zcGlubG9jawotI2RlZmluZSBhY3BpX3NwaW5sb2NrICAgICAgICAgICAgICAgICAgIHZvaWQgKgotI2VuZGlmCi0KIC8qIEZsYWdzIGZvciBhY3BpX29zX2FjcXVpcmVfbG9jay9hY3BpX29zX3JlbGVhc2VfbG9jayAqLwogCiAjaWZuZGVmIGFjcGlfY3B1X2ZsYWdzCkBAIC0yMzMsOCArMjI2LDUwIEBACiAvKiBPYmplY3QgcmV0dXJuZWQgZnJvbSBhY3BpX29zX2NyZWF0ZV9jYWNoZSAqLwogCiAjaWZuZGVmIGFjcGlfY2FjaGVfdAorI2lmZGVmIEFDUElfVVNFX0xPQ0FMX0NBQ0hFCiAjZGVmaW5lIGFjcGlfY2FjaGVfdCAgICAgICAgICAgICAgICAgICAgc3RydWN0IGFjcGlfbWVtb3J5X2xpc3QKKyNlbHNlCisjZGVmaW5lIGFjcGlfY2FjaGVfdCAgICAgICAgICAgICAgICAgICAgdm9pZCAqCiAjZW5kaWYKKyNlbmRpZgorCisvKgorICogU3luY2hyb25pemF0aW9uIG9iamVjdHMgLSBNdXRleGVzLCBTZW1hcGhvcmVzLCBhbmQgc3Bpbl9sb2NrcworICovCisjaWYgKEFDUElfTVVURVhfVFlQRSA9PSBBQ1BJX0JJTkFSWV9TRU1BUEhPUkUpCisvKgorICogVGhlc2UgbWFjcm9zIGFyZSB1c2VkIGlmIHRoZSBob3N0IE9TIGRvZXMgbm90IHN1cHBvcnQgYSBtdXRleCBvYmplY3QuCisgKiBNYXAgdGhlIE9TTCBNdXRleCBpbnRlcmZhY2VzIHRvIGJpbmFyeSBzZW1hcGhvcmVzLgorICovCisjZGVmaW5lIGFjcGlfbXV0ZXggICAgICAgICAgICAgICAgICAgICAgYWNwaV9zZW1hcGhvcmUKKyNkZWZpbmUgYWNwaV9vc19jcmVhdGVfbXV0ZXgob3V0X2hhbmRsZSkgYWNwaV9vc19jcmVhdGVfc2VtYXBob3JlICgxLCAxLCBvdXRfaGFuZGxlKQorI2RlZmluZSBhY3BpX29zX2RlbGV0ZV9tdXRleChoYW5kbGUpICAgICh2b2lkKSBhY3BpX29zX2RlbGV0ZV9zZW1hcGhvcmUgKGhhbmRsZSkKKyNkZWZpbmUgYWNwaV9vc19hY3F1aXJlX211dGV4KGhhbmRsZSx0aW1lKSBhY3BpX29zX3dhaXRfc2VtYXBob3JlIChoYW5kbGUsIDEsIHRpbWUpCisjZGVmaW5lIGFjcGlfb3NfcmVsZWFzZV9tdXRleChoYW5kbGUpICAgKHZvaWQpIGFjcGlfb3Nfc2lnbmFsX3NlbWFwaG9yZSAoaGFuZGxlLCAxKQorI2VuZGlmCisKKy8qIENvbmZpZ3VyYWJsZSB0eXBlcyBmb3Igc3luY2hyb25pemF0aW9uIG9iamVjdHMgKi8KKworI2lmbmRlZiBhY3BpX3NwaW5sb2NrCisjZGVmaW5lIGFjcGlfc3BpbmxvY2sgICAgICAgICAgICAgICAgICAgdm9pZCAqCisjZW5kaWYKKworI2lmbmRlZiBhY3BpX3NlbWFwaG9yZQorI2RlZmluZSBhY3BpX3NlbWFwaG9yZSAgICAgICAgICAgICAgICAgIHZvaWQgKgorI2VuZGlmCisKKyNpZm5kZWYgYWNwaV9tdXRleAorI2RlZmluZSBhY3BpX211dGV4ICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29tcGlsZXItZGVwZW5kZW50IHR5cGVzCisgKgorICogSWYgdGhlIGRlZmF1bHRzIGJlbG93IGFyZSBub3QgYXBwcm9wcmlhdGUgZm9yIHRoZSBob3N0IGNvbXBpbGVyLCB0aGV5IGNhbgorICogYmUgZGVmaW5lZCBpbiB0aGUgY29tcGlsZXItc3BlY2lmaWMgaGVhZGVyLCBhbmQgdGhpcyB3aWxsIHRha2UgcHJlY2VkZW5jZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKiBVc2UgQzk5IHVpbnRwdHJfdCBmb3IgcG9pbnRlciBjYXN0aW5nIGlmIGF2YWlsYWJsZSwgInZvaWQgKiIgb3RoZXJ3aXNlICovCiAKQEAgLTI2OCw2ICszMDMsNDMgQEAKICNkZWZpbmUgQUNQSV9FWFBPUlRfU1lNQk9MKHN5bWJvbCkKICNlbmRpZgogCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQUNQSSBTcGVjaWZpY2F0aW9uIGNvbnN0YW50cyAoRG8gbm90IGNoYW5nZSB1bmxlc3MgdGhlIHNwZWNpZmljYXRpb24gY2hhbmdlcykKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIE51bWJlciBvZiBkaXN0aW5jdCBGQURULWJhc2VkIEdQRSByZWdpc3RlciBibG9ja3MgKEdQRTAgYW5kIEdQRTEpICovCisKKyNkZWZpbmUgQUNQSV9NQVhfR1BFX0JMT0NLUyAgICAgICAgICAgICAyCisKKy8qIERlZmF1bHQgQUNQSSByZWdpc3RlciB3aWR0aHMgKi8KKworI2RlZmluZSBBQ1BJX0dQRV9SRUdJU1RFUl9XSURUSCAgICAgICAgIDgKKyNkZWZpbmUgQUNQSV9QTTFfUkVHSVNURVJfV0lEVEggICAgICAgICAxNgorI2RlZmluZSBBQ1BJX1BNMl9SRUdJU1RFUl9XSURUSCAgICAgICAgIDgKKyNkZWZpbmUgQUNQSV9QTV9USU1FUl9XSURUSCAgICAgICAgICAgICAzMgorCisvKiBOYW1lcyB3aXRoaW4gdGhlIG5hbWVzcGFjZSBhcmUgNCBieXRlcyBsb25nICovCisKKyNkZWZpbmUgQUNQSV9OQU1FX1NJWkUgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIEFDUElfUEFUSF9TRUdNRU5UX0xFTkdUSCAgICAgICAgNQkvKiA0IGNoYXJzIGZvciBuYW1lICsgMSBjaGFyIGZvciBzZXBhcmF0b3IgKi8KKyNkZWZpbmUgQUNQSV9QQVRIX1NFUEFSQVRPUiAgICAgICAgICAgICAnLicKKworLyogU2l6ZXMgZm9yIEFDUEkgdGFibGUgaGVhZGVycyAqLworCisjZGVmaW5lIEFDUElfT0VNX0lEX1NJWkUgICAgICAgICAgICAgICAgNgorI2RlZmluZSBBQ1BJX09FTV9UQUJMRV9JRF9TSVpFICAgICAgICAgIDgKKworLyogQUNQSS9QTlAgaGFyZHdhcmUgSURzICovCisKKyNkZWZpbmUgUENJX1JPT1RfSElEX1NUUklORyAgICAgICAgICAgICAiUE5QMEEwMyIKKyNkZWZpbmUgUENJX0VYUFJFU1NfUk9PVF9ISURfU1RSSU5HICAgICAiUE5QMEEwOCIKKworLyogUE0gVGltZXIgdGlja3MgcGVyIHNlY29uZCAoSFopICovCisKKyNkZWZpbmUgUE1fVElNRVJfRlJFUVVFTkNZICAzNTc5NTQ1CisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogSW5kZXBlbmRlbnQgdHlwZXMKQEAgLTI5MSwxMyArMzYzLDE4IEBACiAjZW5kaWYKIAogLyoKLSAqIE1lc2NlbGxhbmVvdXMgdHlwZXMKKyAqIE1pc2NlbGxhbmVvdXMgdHlwZXMKICAqLwogdHlwZWRlZiB1MzIgYWNwaV9zdGF0dXM7CS8qIEFsbCBBQ1BJIEV4Y2VwdGlvbnMgKi8KIHR5cGVkZWYgdTMyIGFjcGlfbmFtZTsJCS8qIDQtYnl0ZSBBQ1BJIG5hbWUgKi8KIHR5cGVkZWYgY2hhciAqYWNwaV9zdHJpbmc7CS8qIE51bGwgdGVybWluYXRlZCBBU0NJSSBzdHJpbmcgKi8KIHR5cGVkZWYgdm9pZCAqYWNwaV9oYW5kbGU7CS8qIEFjdHVhbGx5IGEgcHRyIHRvIGEgTlMgTm9kZSAqLwogCisvKiBPd25lciBJRHMgYXJlIHVzZWQgdG8gdHJhY2sgbmFtZXNwYWNlIG5vZGVzIGZvciBzZWxlY3RpdmUgZGVsZXRpb24gKi8KKwordHlwZWRlZiB1OCBhY3BpX293bmVyX2lkOworI2RlZmluZSBBQ1BJX09XTkVSX0lEX01BWCAgICAgICAgICAgICAgIDB4RkYKKwogc3RydWN0IHVpbnQ2NF9zdHJ1Y3QgewogCXUzMiBsbzsKIAl1MzIgaGk7CkBAIC0zMTMsMTMgKzM5MCw4IEBACiAJdTMyIGhpOwogfTsKIAotLyogU3luY2hyb25pemF0aW9uIG9iamVjdHMgKi8KLQotI2RlZmluZSBhY3BpX211dGV4ICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKgotI2RlZmluZSBhY3BpX3NlbWFwaG9yZSAgICAgICAgICAgICAgICAgIHZvaWQgKgotCiAvKgotICogQWNwaSBpbnRlZ2VyIHdpZHRoLiBJbiBBQ1BJIHZlcnNpb24gMSwgaW50ZWdlcnMgYXJlIDMyIGJpdHMuICBJbiBBQ1BJCisgKiBBY3BpIGludGVnZXIgd2lkdGguIEluIEFDUEkgdmVyc2lvbiAxLCBpbnRlZ2VycyBhcmUgMzIgYml0cy4gSW4gQUNQSQogICogdmVyc2lvbiAyLCBpbnRlZ2VycyBhcmUgNjQgYml0cy4gTm90ZSB0aGF0IHRoaXMgcGVydGFpbnMgdG8gdGhlIEFDUEkgaW50ZWdlcgogICogdHlwZSBvbmx5LCBub3Qgb3RoZXIgaW50ZWdlcnMgdXNlZCBpbiB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIEFDUEkgQ0EKICAqIHN1YnN5c3RlbS4KQEAgLTMzOCwxMCArNDEwLDc1IEBACiAjZGVmaW5lIEFDUElfTUFYMTZfREVDSU1BTF9ESUdJVFMgICAgICAgIDUKICNkZWZpbmUgQUNQSV9NQVg4X0RFQ0lNQUxfRElHSVRTICAgICAgICAgMwogCisvKiBQTSBUaW1lciB0aWNrcyBwZXIgc2Vjb25kIChIWikgKi8KKworI2RlZmluZSBQTV9USU1FUl9GUkVRVUVOQ1kgIDM1Nzk1NDUKKwogLyoKICAqIENvbnN0YW50cyB3aXRoIHNwZWNpYWwgbWVhbmluZ3MKICAqLwogI2RlZmluZSBBQ1BJX1JPT1RfT0JKRUNUICAgICAgICAgICAgICAgIEFDUElfQUREX1BUUiAoYWNwaV9oYW5kbGUsIE5VTEwsIEFDUElfTUFYX1BUUikKKyNkZWZpbmUgQUNQSV9XQUlUX0ZPUkVWRVIgICAgICAgICAgICAgICAweEZGRkYJLyogdTE2LCBhcyBwZXIgQUNQSSBzcGVjICovCisjZGVmaW5lIEFDUElfRE9fTk9UX1dBSVQgICAgICAgICAgICAgICAgMAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvbW1vbmx5IHVzZWQgbWFjcm9zCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogRGF0YSBtYW5pcHVsYXRpb24gKi8KKworI2RlZmluZSBBQ1BJX0xPV09SRChsKSAgICAgICAgICAgICAgICAgICgodTE2KSh1MzIpKGwpKQorI2RlZmluZSBBQ1BJX0hJV09SRChsKSAgICAgICAgICAgICAgICAgICgodTE2KSgoKCh1MzIpKGwpKSA+PiAxNikgJiAweEZGRkYpKQorI2RlZmluZSBBQ1BJX0xPQllURShsKSAgICAgICAgICAgICAgICAgICgodTgpKHUxNikobCkpCisjZGVmaW5lIEFDUElfSElCWVRFKGwpICAgICAgICAgICAgICAgICAgKCh1OCkoKCgodTE2KShsKSkgPj4gOCkgJiAweEZGKSkKKworLyogRnVsbCA2NC1iaXQgaW50ZWdlciBtdXN0IGJlIGF2YWlsYWJsZSBvbiBib3RoIDMyLWJpdCBhbmQgNjQtYml0IHBsYXRmb3JtcyAqLworCitzdHJ1Y3QgYWNwaV9pbnRlZ2VyX292ZXJsYXkgeworCXUzMiBsb19kd29yZDsKKwl1MzIgaGlfZHdvcmQ7Cit9OworCisjZGVmaW5lIEFDUElfTE9EV09SRChpbnRlZ2VyKSAgICAgICAgICAgKEFDUElfQ0FTVF9QVFIgKHN0cnVjdCBhY3BpX2ludGVnZXJfb3ZlcmxheSwgJmludGVnZXIpLT5sb19kd29yZCkKKyNkZWZpbmUgQUNQSV9ISURXT1JEKGludGVnZXIpICAgICAgICAgICAoQUNQSV9DQVNUX1BUUiAoc3RydWN0IGFjcGlfaW50ZWdlcl9vdmVybGF5LCAmaW50ZWdlciktPmhpX2R3b3JkKQorCisjZGVmaW5lIEFDUElfU0VUX0JJVCh0YXJnZXQsYml0KSAgICAgICAgKCh0YXJnZXQpIHw9IChiaXQpKQorI2RlZmluZSBBQ1BJX0NMRUFSX0JJVCh0YXJnZXQsYml0KSAgICAgICgodGFyZ2V0KSAmPSB+KGJpdCkpCisjZGVmaW5lIEFDUElfTUlOKGEsYikgICAgICAgICAgICAgICAgICAgKCgoYSk8KGIpKT8oYSk6KGIpKQorI2RlZmluZSBBQ1BJX01BWChhLGIpICAgICAgICAgICAgICAgICAgICgoKGEpPihiKSk/KGEpOihiKSkKKworLyogU2l6ZSBjYWxjdWxhdGlvbiAqLworCisjZGVmaW5lIEFDUElfQVJSQVlfTEVOR1RIKHgpICAgICAgICAgICAgKHNpemVvZih4KSAvIHNpemVvZigoeClbMF0pKQorCisvKiBQb2ludGVyIG1hbmlwdWxhdGlvbiAqLworCisjZGVmaW5lIEFDUElfQ0FTVF9QVFIodCwgcCkgICAgICAgICAgICAgKCh0ICopIChhY3BpX3VpbnRwdHJfdCkgKHApKQorI2RlZmluZSBBQ1BJX0NBU1RfSU5ESVJFQ1RfUFRSKHQsIHApICAgICgodCAqKikgKGFjcGlfdWludHB0cl90KSAocCkpCisjZGVmaW5lIEFDUElfQUREX1BUUih0LCBhLCBiKSAgICAgICAgICAgQUNQSV9DQVNUX1BUUiAodCwgKEFDUElfQ0FTVF9QVFIgKHU4LCAoYSkpICsgKGFjcGlfc2l6ZSkoYikpKQorI2RlZmluZSBBQ1BJX1BUUl9ESUZGKGEsIGIpICAgICAgICAgICAgIChhY3BpX3NpemUpIChBQ1BJX0NBU1RfUFRSICh1OCwgKGEpKSAtIEFDUElfQ0FTVF9QVFIgKHU4LCAoYikpKQorCisvKiBQb2ludGVyL0ludGVnZXIgdHlwZSBjb252ZXJzaW9ucyAqLworCisjZGVmaW5lIEFDUElfVE9fUE9JTlRFUihpKSAgICAgICAgICAgICAgQUNQSV9BRERfUFRSICh2b2lkLCAodm9pZCAqKSBOVUxMLChhY3BpX3NpemUpIGkpCisjZGVmaW5lIEFDUElfVE9fSU5URUdFUihwKSAgICAgICAgICAgICAgQUNQSV9QVFJfRElGRiAocCwgKHZvaWQgKikgTlVMTCkKKyNkZWZpbmUgQUNQSV9PRkZTRVQoZCwgZikgICAgICAgICAgICAgICAoYWNwaV9zaXplKSBBQ1BJX1BUUl9ESUZGICgmKCgoZCAqKTApLT5mKSwgKHZvaWQgKikgTlVMTCkKKyNkZWZpbmUgQUNQSV9QSFlTQUREUl9UT19QVFIoaSkgICAgICAgICBBQ1BJX1RPX1BPSU5URVIoaSkKKyNkZWZpbmUgQUNQSV9QVFJfVE9fUEhZU0FERFIoaSkgICAgICAgICBBQ1BJX1RPX0lOVEVHRVIoaSkKKworI2lmbmRlZiBBQ1BJX01JU0FMSUdOTUVOVF9OT1RfU1VQUE9SVEVECisjZGVmaW5lIEFDUElfQ09NUEFSRV9OQU1FKGEsYikgICAgICAgICAgKCpBQ1BJX0NBU1RfUFRSICh1MzIsIChhKSkgPT0gKkFDUElfQ0FTVF9QVFIgKHUzMiwgKGIpKSkKKyNlbHNlCisjZGVmaW5lIEFDUElfQ09NUEFSRV9OQU1FKGEsYikgICAgICAgICAgKCFBQ1BJX1NUUk5DTVAgKEFDUElfQ0FTVF9QVFIgKGNoYXIsIChhKSksIEFDUElfQ0FTVF9QVFIgKGNoYXIsIChiKSksIEFDUElfTkFNRV9TSVpFKSkKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIE1pc2NlbGxhbmVvdXMgY29uc3RhbnRzCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKICAqIEluaXRpYWxpemF0aW9uIHNlcXVlbmNlCkBAIC00MTQsNyArNTUxLDcgQEAKICNkZWZpbmUgQUNQSV9OT1RJRllfTUFYICAgICAgICAgICAgICAgICAweDBCCiAKIC8qCi0gKiBUeXBlcyBhc3NvY2lhdGVkIHdpdGggQUNQSSBuYW1lcyBhbmQgb2JqZWN0cy4gIFRoZSBmaXJzdCBncm91cCBvZgorICogVHlwZXMgYXNzb2NpYXRlZCB3aXRoIEFDUEkgbmFtZXMgYW5kIG9iamVjdHMuIFRoZSBmaXJzdCBncm91cCBvZgogICogdmFsdWVzICh1cCB0byBBQ1BJX1RZUEVfRVhURVJOQUxfTUFYKSBjb3JyZXNwb25kIHRvIHRoZSBkZWZpbml0aW9uCiAgKiBvZiB0aGUgQUNQSSBvYmplY3RfdHlwZSgpIG9wZXJhdG9yIChTZWUgdGhlIEFDUEkgU3BlYykuIFRoZXJlZm9yZSwKICAqIG9ubHkgYWRkIHRvIHRoZSBmaXJzdCBncm91cCBpZiB0aGUgc3BlYyBjaGFuZ2VzLgpAQCAtNDY3LDcgKzYwNCw3IEBACiAKIC8qCiAgKiBUaGVzZSBhcmUgc3BlY2lhbCBvYmplY3QgdHlwZXMgdGhhdCBuZXZlciBhcHBlYXIgaW4KLSAqIGEgTmFtZXNwYWNlIG5vZGUsIG9ubHkgaW4gYW4gdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdAorICogYSBOYW1lc3BhY2Ugbm9kZSwgb25seSBpbiBhIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QKICAqLwogI2RlZmluZSBBQ1BJX1RZUEVfTE9DQUxfRVhUUkEgICAgICAgICAgIDB4MUMKICNkZWZpbmUgQUNQSV9UWVBFX0xPQ0FMX0RBVEEgICAgICAgICAgICAweDFECkBAIC03MzIsNiArODY5LDE1IEBACiAjZGVmaW5lIEFDUElfTkFNRV9UWVBFX01BWCAgICAgICAgICAgICAgMQogCiAvKgorICogUHJlZGVmaW5lZCBOYW1lc3BhY2UgaXRlbXMKKyAqLworc3RydWN0IGFjcGlfcHJlZGVmaW5lZF9uYW1lcyB7CisJY2hhciAqbmFtZTsKKwl1OCB0eXBlOworCWNoYXIgKnZhbDsKK307CisKKy8qCiAgKiBTdHJ1Y3R1cmUgYW5kIGZsYWdzIGZvciBhY3BpX2dldF9zeXN0ZW1faW5mbwogICovCiAjZGVmaW5lIEFDUElfU1lTX01PREVfVU5LTk9XTiAgICAgICAgICAgMHgwMDAwCkBAIC03ODcsNyArOTMzLDcgQEAKIAkJCQkgICAgICB1MTYgb3Bjb2RlLAogCQkJCSAgICAgIHUzMiBhbWxfb2Zmc2V0LCB2b2lkICpjb250ZXh0KTsKIAotLyogVGFibGUgRXZlbnQgaGFuZGxlciAoTG9hZCwgbG9hZF90YWJsZSBldGMpIGFuZCB0eXBlcyAqLworLyogVGFibGUgRXZlbnQgaGFuZGxlciAoTG9hZCwgbG9hZF90YWJsZSwgZXRjLikgYW5kIHR5cGVzICovCiAKIHR5cGVkZWYKIGFjcGlfc3RhdHVzKCphY3BpX3RibF9oYW5kbGVyKSAodTMyIGV2ZW50LCB2b2lkICp0YWJsZSwgdm9pZCAqY29udGV4dCk7CkBAIC04MjMsNiArOTY5LDEyIEBACiAjZGVmaW5lIEFDUElfSU5URVJSVVBUX05PVF9IQU5ETEVEICAgICAgMHgwMAogI2RlZmluZSBBQ1BJX0lOVEVSUlVQVF9IQU5ETEVEICAgICAgICAgIDB4MDEKIAorLyogTGVuZ3RoIG9mIF9ISUQsIF9VSUQsIF9DSUQsIGFuZCBVVUlEIHZhbHVlcyAqLworCisjZGVmaW5lIEFDUElfREVWSUNFX0lEX0xFTkdUSCAgICAgICAgICAgMHgwOQorI2RlZmluZSBBQ1BJX01BWF9DSURfTEVOR1RIICAgICAgICAgICAgIDQ4CisjZGVmaW5lIEFDUElfVVVJRF9MRU5HVEggICAgICAgICAgICAgICAgMTYKKwogLyogQ29tbW9uIHN0cmluZyB2ZXJzaW9uIG9mIGRldmljZSBISURzIGFuZCBVSURzICovCiAKIHN0cnVjdCBhY3BpY2FfZGV2aWNlX2lkIHsKQEAgLTkwMCwzNTcgKzEwNTIsMjggQEAKIH07CiAKIC8qCi0gKiBEZWZpbml0aW9ucyBmb3IgUmVzb3VyY2UgQXR0cmlidXRlcworICogc3RydWN0IGFjcGlfbWVtb3J5X2xpc3QgaXMgdXNlZCBvbmx5IGlmIHRoZSBBQ1BJQ0EgbG9jYWwgY2FjaGUgaXMgZW5hYmxlZAogICovCi10eXBlZGVmIHUxNiBhY3BpX3JzX2xlbmd0aDsJLyogUmVzb3VyY2UgTGVuZ3RoIGZpZWxkIGlzIGZpeGVkIGF0IDE2IGJpdHMgKi8KLXR5cGVkZWYgdTMyIGFjcGlfcnNkZXNjX3NpemU7CS8qIE1heCBSZXNvdXJjZSBEZXNjcmlwdG9yIHNpemUgaXMgKExlbmd0aCszKSA9ICg2NF9rLTEpKzMgKi8KK3N0cnVjdCBhY3BpX21lbW9yeV9saXN0IHsKKwljaGFyICpsaXN0X25hbWU7CisJdm9pZCAqbGlzdF9oZWFkOworCXUxNiBvYmplY3Rfc2l6ZTsKKwl1MTYgbWF4X2RlcHRoOworCXUxNiBjdXJyZW50X2RlcHRoOworCXUxNiBsaW5rX29mZnNldDsKIAotLyoKLSAqICBNZW1vcnkgQXR0cmlidXRlcwotICovCi0jZGVmaW5lIEFDUElfUkVBRF9PTkxZX01FTU9SWSAgICAgICAgICAgKHU4KSAweDAwCi0jZGVmaW5lIEFDUElfUkVBRF9XUklURV9NRU1PUlkgICAgICAgICAgKHU4KSAweDAxCisjaWZkZWYgQUNQSV9EQkdfVFJBQ0tfQUxMT0NBVElPTlMKIAotI2RlZmluZSBBQ1BJX05PTl9DQUNIRUFCTEVfTUVNT1JZICAgICAgICh1OCkgMHgwMAotI2RlZmluZSBBQ1BJX0NBQ0hBQkxFX01FTU9SWSAgICAgICAgICAgICh1OCkgMHgwMQotI2RlZmluZSBBQ1BJX1dSSVRFX0NPTUJJTklOR19NRU1PUlkgICAgICh1OCkgMHgwMgotI2RlZmluZSBBQ1BJX1BSRUZFVENIQUJMRV9NRU1PUlkgICAgICAgICh1OCkgMHgwMworCS8qIFN0YXRpc3RpY3MgZm9yIGRlYnVnIG1lbW9yeSB0cmFja2luZyBvbmx5ICovCiAKLS8qCi0gKiAgSU8gQXR0cmlidXRlcwotICogIFRoZSBJU0EgSU8gcmFuZ2VzIGFyZTogICAgIG4wMDAtbjBfZkZoLCBuNDAwLW40X2ZGaCwgbjgwMC1uOF9mRmgsIG5fYzAwLW5fY0ZGaC4KLSAqICBUaGUgbm9uLUlTQSBJTyByYW5nZXMgYXJlOiBuMTAwLW4zX2ZGaCwgbjUwMC1uN19mRmgsIG45MDAtbl9iRkZoLCBuX2NkMC1uX2ZGRmguCi0gKi8KLSNkZWZpbmUgQUNQSV9OT05fSVNBX09OTFlfUkFOR0VTICAgICAgICAodTgpIDB4MDEKLSNkZWZpbmUgQUNQSV9JU0FfT05MWV9SQU5HRVMgICAgICAgICAgICAodTgpIDB4MDIKLSNkZWZpbmUgQUNQSV9FTlRJUkVfUkFOR0UgICAgICAgICAgICAgICAoQUNQSV9OT05fSVNBX09OTFlfUkFOR0VTIHwgQUNQSV9JU0FfT05MWV9SQU5HRVMpCi0KLS8qIFR5cGUgb2YgdHJhbnNsYXRpb24gLSAxPVNwYXJzZSwgMD1EZW5zZSAqLwotCi0jZGVmaW5lIEFDUElfU1BBUlNFX1RSQU5TTEFUSU9OICAgICAgICAgKHU4KSAweDAxCi0KLS8qCi0gKiAgSU8gUG9ydCBEZXNjcmlwdG9yIERlY29kZQotICovCi0jZGVmaW5lIEFDUElfREVDT0RFXzEwICAgICAgICAgICAgICAgICAgKHU4KSAweDAwCS8qIDEwLWJpdCBJTyBhZGRyZXNzIGRlY29kZSAqLwotI2RlZmluZSBBQ1BJX0RFQ09ERV8xNiAgICAgICAgICAgICAgICAgICh1OCkgMHgwMQkvKiAxNi1iaXQgSU8gYWRkcmVzcyBkZWNvZGUgKi8KLQotLyoKLSAqICBJUlEgQXR0cmlidXRlcwotICovCi0jZGVmaW5lIEFDUElfTEVWRUxfU0VOU0lUSVZFICAgICAgICAgICAgKHU4KSAweDAwCi0jZGVmaW5lIEFDUElfRURHRV9TRU5TSVRJVkUgICAgICAgICAgICAgKHU4KSAweDAxCi0KLSNkZWZpbmUgQUNQSV9BQ1RJVkVfSElHSCAgICAgICAgICAgICAgICAodTgpIDB4MDAKLSNkZWZpbmUgQUNQSV9BQ1RJVkVfTE9XICAgICAgICAgICAgICAgICAodTgpIDB4MDEKLQotI2RlZmluZSBBQ1BJX0VYQ0xVU0lWRSAgICAgICAgICAgICAgICAgICh1OCkgMHgwMAotI2RlZmluZSBBQ1BJX1NIQVJFRCAgICAgICAgICAgICAgICAgICAgICh1OCkgMHgwMQotCi0vKgotICogIERNQSBBdHRyaWJ1dGVzCi0gKi8KLSNkZWZpbmUgQUNQSV9DT01QQVRJQklMSVRZICAgICAgICAgICAgICAodTgpIDB4MDAKLSNkZWZpbmUgQUNQSV9UWVBFX0EgICAgICAgICAgICAgICAgICAgICAodTgpIDB4MDEKLSNkZWZpbmUgQUNQSV9UWVBFX0IgICAgICAgICAgICAgICAgICAgICAodTgpIDB4MDIKLSNkZWZpbmUgQUNQSV9UWVBFX0YgICAgICAgICAgICAgICAgICAgICAodTgpIDB4MDMKLQotI2RlZmluZSBBQ1BJX05PVF9CVVNfTUFTVEVSICAgICAgICAgICAgICh1OCkgMHgwMAotI2RlZmluZSBBQ1BJX0JVU19NQVNURVIgICAgICAgICAgICAgICAgICh1OCkgMHgwMQotCi0jZGVmaW5lIEFDUElfVFJBTlNGRVJfOCAgICAgICAgICAgICAgICAgKHU4KSAweDAwCi0jZGVmaW5lIEFDUElfVFJBTlNGRVJfOF8xNiAgICAgICAgICAgICAgKHU4KSAweDAxCi0jZGVmaW5lIEFDUElfVFJBTlNGRVJfMTYgICAgICAgICAgICAgICAgKHU4KSAweDAyCi0KLS8qCi0gKiBTdGFydCBEZXBlbmRlbnQgRnVuY3Rpb25zIFByaW9yaXR5IGRlZmluaXRpb25zCi0gKi8KLSNkZWZpbmUgQUNQSV9HT09EX0NPTkZJR1VSQVRJT04gICAgICAgICAodTgpIDB4MDAKLSNkZWZpbmUgQUNQSV9BQ0NFUFRBQkxFX0NPTkZJR1VSQVRJT04gICAodTgpIDB4MDEKLSNkZWZpbmUgQUNQSV9TVUJfT1BUSU1BTF9DT05GSUdVUkFUSU9OICAodTgpIDB4MDIKLQotLyoKLSAqICAxNiwgMzIgYW5kIDY0LWJpdCBBZGRyZXNzIERlc2NyaXB0b3IgcmVzb3VyY2UgdHlwZXMKLSAqLwotI2RlZmluZSBBQ1BJX01FTU9SWV9SQU5HRSAgICAgICAgICAgICAgICh1OCkgMHgwMAotI2RlZmluZSBBQ1BJX0lPX1JBTkdFICAgICAgICAgICAgICAgICAgICh1OCkgMHgwMQotI2RlZmluZSBBQ1BJX0JVU19OVU1CRVJfUkFOR0UgICAgICAgICAgICh1OCkgMHgwMgotCi0jZGVmaW5lIEFDUElfQUREUkVTU19OT1RfRklYRUQgICAgICAgICAgKHU4KSAweDAwCi0jZGVmaW5lIEFDUElfQUREUkVTU19GSVhFRCAgICAgICAgICAgICAgKHU4KSAweDAxCi0KLSNkZWZpbmUgQUNQSV9QT1NfREVDT0RFICAgICAgICAgICAgICAgICAodTgpIDB4MDAKLSNkZWZpbmUgQUNQSV9TVUJfREVDT0RFICAgICAgICAgICAgICAgICAodTgpIDB4MDEKLQotI2RlZmluZSBBQ1BJX1BST0RVQ0VSICAgICAgICAgICAgICAgICAgICh1OCkgMHgwMAotI2RlZmluZSBBQ1BJX0NPTlNVTUVSICAgICAgICAgICAgICAgICAgICh1OCkgMHgwMQotCi0vKgotICogSWYgcG9zc2libGUsIHBhY2sgdGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmVzIHRvIGJ5dGUgYWxpZ25tZW50Ci0gKi8KLSNpZm5kZWYgQUNQSV9NSVNBTElHTk1FTlRfTk9UX1NVUFBPUlRFRAotI3ByYWdtYSBwYWNrKDEpCisJdTMyIHRvdGFsX2FsbG9jYXRlZDsKKwl1MzIgdG90YWxfZnJlZWQ7CisJdTMyIG1heF9vY2N1cGllZDsKKwl1MzIgdG90YWxfc2l6ZTsKKwl1MzIgY3VycmVudF90b3RhbF9zaXplOworCXUzMiByZXF1ZXN0czsKKwl1MzIgaGl0czsKICNlbmRpZgotCi0vKiBVVUlEIGRhdGEgc3RydWN0dXJlcyBmb3IgdXNlIGluIHZlbmRvci1kZWZpbmVkIHJlc291cmNlIGRlc2NyaXB0b3JzICovCi0KLXN0cnVjdCBhY3BpX3V1aWQgewotCXU4IGRhdGFbQUNQSV9VVUlEX0xFTkdUSF07Ci19OwotCi1zdHJ1Y3QgYWNwaV92ZW5kb3JfdXVpZCB7Ci0JdTggc3VidHlwZTsKLQl1OCBkYXRhW0FDUElfVVVJRF9MRU5HVEhdOwotfTsKLQotLyoKLSAqICBTdHJ1Y3R1cmVzIHVzZWQgdG8gZGVzY3JpYmUgZGV2aWNlIHJlc291cmNlcwotICovCi1zdHJ1Y3QgYWNwaV9yZXNvdXJjZV9pcnEgewotCXU4IGRlc2NyaXB0b3JfbGVuZ3RoOwotCXU4IHRyaWdnZXJpbmc7Ci0JdTggcG9sYXJpdHk7Ci0JdTggc2hhcmFibGU7Ci0JdTggaW50ZXJydXB0X2NvdW50OwotCXU4IGludGVycnVwdHNbMV07Ci19OwotCi1zdHJ1Y3QgYWNwaV9yZXNvdXJjZV9kbWEgewotCXU4IHR5cGU7Ci0JdTggYnVzX21hc3RlcjsKLQl1OCB0cmFuc2ZlcjsKLQl1OCBjaGFubmVsX2NvdW50OwotCXU4IGNoYW5uZWxzWzFdOwotfTsKLQotc3RydWN0IGFjcGlfcmVzb3VyY2Vfc3RhcnRfZGVwZW5kZW50IHsKLQl1OCBkZXNjcmlwdG9yX2xlbmd0aDsKLQl1OCBjb21wYXRpYmlsaXR5X3ByaW9yaXR5OwotCXU4IHBlcmZvcm1hbmNlX3JvYnVzdG5lc3M7Ci19OwotCi0vKgotICogRU5EX0RFUEVOREVOVF9GVU5DVElPTlNfUkVTT1VSQ0Ugc3RydWN0IGlzIG5vdAotICogbmVlZGVkIGJlY2F1c2UgaXQgaGFzIG5vIGZpZWxkcwotICovCi0KLXN0cnVjdCBhY3BpX3Jlc291cmNlX2lvIHsKLQl1OCBpb19kZWNvZGU7Ci0JdTggYWxpZ25tZW50OwotCXU4IGFkZHJlc3NfbGVuZ3RoOwotCXUxNiBtaW5pbXVtOwotCXUxNiBtYXhpbXVtOwotfTsKLQotc3RydWN0IGFjcGlfcmVzb3VyY2VfZml4ZWRfaW8gewotCXUxNiBhZGRyZXNzOwotCXU4IGFkZHJlc3NfbGVuZ3RoOwotfTsKLQotc3RydWN0IGFjcGlfcmVzb3VyY2VfdmVuZG9yIHsKLQl1MTYgYnl0ZV9sZW5ndGg7Ci0JdTggYnl0ZV9kYXRhWzFdOwotfTsKLQotLyogVmVuZG9yIHJlc291cmNlIHdpdGggVVVJRCBpbmZvIChpbnRyb2R1Y2VkIGluIEFDUEkgMy4wKSAqLwotCi1zdHJ1Y3QgYWNwaV9yZXNvdXJjZV92ZW5kb3JfdHlwZWQgewotCXUxNiBieXRlX2xlbmd0aDsKLQl1OCB1dWlkX3N1YnR5cGU7Ci0JdTggdXVpZFtBQ1BJX1VVSURfTEVOR1RIXTsKLQl1OCBieXRlX2RhdGFbMV07Ci19OwotCi1zdHJ1Y3QgYWNwaV9yZXNvdXJjZV9lbmRfdGFnIHsKLQl1OCBjaGVja3N1bTsKLX07Ci0KLXN0cnVjdCBhY3BpX3Jlc291cmNlX21lbW9yeTI0IHsKLQl1OCB3cml0ZV9wcm90ZWN0OwotCXUxNiBtaW5pbXVtOwotCXUxNiBtYXhpbXVtOwotCXUxNiBhbGlnbm1lbnQ7Ci0JdTE2IGFkZHJlc3NfbGVuZ3RoOwotfTsKLQotc3RydWN0IGFjcGlfcmVzb3VyY2VfbWVtb3J5MzIgewotCXU4IHdyaXRlX3Byb3RlY3Q7Ci0JdTMyIG1pbmltdW07Ci0JdTMyIG1heGltdW07Ci0JdTMyIGFsaWdubWVudDsKLQl1MzIgYWRkcmVzc19sZW5ndGg7Ci19OwotCi1zdHJ1Y3QgYWNwaV9yZXNvdXJjZV9maXhlZF9tZW1vcnkzMiB7Ci0JdTggd3JpdGVfcHJvdGVjdDsKLQl1MzIgYWRkcmVzczsKLQl1MzIgYWRkcmVzc19sZW5ndGg7Ci19OwotCi1zdHJ1Y3QgYWNwaV9tZW1vcnlfYXR0cmlidXRlIHsKLQl1OCB3cml0ZV9wcm90ZWN0OwotCXU4IGNhY2hpbmc7Ci0JdTggcmFuZ2VfdHlwZTsKLQl1OCB0cmFuc2xhdGlvbjsKLX07Ci0KLXN0cnVjdCBhY3BpX2lvX2F0dHJpYnV0ZSB7Ci0JdTggcmFuZ2VfdHlwZTsKLQl1OCB0cmFuc2xhdGlvbjsKLQl1OCB0cmFuc2xhdGlvbl90eXBlOwotCXU4IHJlc2VydmVkMTsKLX07Ci0KLXVuaW9uIGFjcGlfcmVzb3VyY2VfYXR0cmlidXRlIHsKLQlzdHJ1Y3QgYWNwaV9tZW1vcnlfYXR0cmlidXRlIG1lbTsKLQlzdHJ1Y3QgYWNwaV9pb19hdHRyaWJ1dGUgaW87Ci0KLQkvKiBVc2VkIGZvciB0aGUgKndvcmRfc3BhY2UgbWFjcm9zICovCi0KLQl1OCB0eXBlX3NwZWNpZmljOwotfTsKLQotc3RydWN0IGFjcGlfcmVzb3VyY2Vfc291cmNlIHsKLQl1OCBpbmRleDsKLQl1MTYgc3RyaW5nX2xlbmd0aDsKLQljaGFyICpzdHJpbmdfcHRyOwotfTsKLQotLyogRmllbGRzIGNvbW1vbiB0byBhbGwgYWRkcmVzcyBkZXNjcmlwdG9ycywgMTYvMzIvNjQgYml0ICovCi0KLSNkZWZpbmUgQUNQSV9SRVNPVVJDRV9BRERSRVNTX0NPTU1PTiBcCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZV90eXBlOyBcCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9kdWNlcl9jb25zdW1lcjsgXAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlOyBcCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5fYWRkcmVzc19maXhlZDsgXAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X2FkZHJlc3NfZml4ZWQ7IFwKLQl1bmlvbiBhY3BpX3Jlc291cmNlX2F0dHJpYnV0ZSAgIGluZm87Ci0KLXN0cnVjdCBhY3BpX3Jlc291cmNlX2FkZHJlc3MgewotQUNQSV9SRVNPVVJDRV9BRERSRVNTX0NPTU1PTn07Ci0KLXN0cnVjdCBhY3BpX3Jlc291cmNlX2FkZHJlc3MxNiB7Ci0JQUNQSV9SRVNPVVJDRV9BRERSRVNTX0NPTU1PTiB1MTYgZ3JhbnVsYXJpdHk7Ci0JdTE2IG1pbmltdW07Ci0JdTE2IG1heGltdW07Ci0JdTE2IHRyYW5zbGF0aW9uX29mZnNldDsKLQl1MTYgYWRkcmVzc19sZW5ndGg7Ci0Jc3RydWN0IGFjcGlfcmVzb3VyY2Vfc291cmNlIHJlc291cmNlX3NvdXJjZTsKLX07Ci0KLXN0cnVjdCBhY3BpX3Jlc291cmNlX2FkZHJlc3MzMiB7Ci0JQUNQSV9SRVNPVVJDRV9BRERSRVNTX0NPTU1PTiB1MzIgZ3JhbnVsYXJpdHk7Ci0JdTMyIG1pbmltdW07Ci0JdTMyIG1heGltdW07Ci0JdTMyIHRyYW5zbGF0aW9uX29mZnNldDsKLQl1MzIgYWRkcmVzc19sZW5ndGg7Ci0Jc3RydWN0IGFjcGlfcmVzb3VyY2Vfc291cmNlIHJlc291cmNlX3NvdXJjZTsKLX07Ci0KLXN0cnVjdCBhY3BpX3Jlc291cmNlX2FkZHJlc3M2NCB7Ci0JQUNQSV9SRVNPVVJDRV9BRERSRVNTX0NPTU1PTiB1NjQgZ3JhbnVsYXJpdHk7Ci0JdTY0IG1pbmltdW07Ci0JdTY0IG1heGltdW07Ci0JdTY0IHRyYW5zbGF0aW9uX29mZnNldDsKLQl1NjQgYWRkcmVzc19sZW5ndGg7Ci0Jc3RydWN0IGFjcGlfcmVzb3VyY2Vfc291cmNlIHJlc291cmNlX3NvdXJjZTsKLX07Ci0KLXN0cnVjdCBhY3BpX3Jlc291cmNlX2V4dGVuZGVkX2FkZHJlc3M2NCB7Ci0JQUNQSV9SRVNPVVJDRV9BRERSRVNTX0NPTU1PTiB1OCByZXZpc2lvbl9pRDsKLQl1NjQgZ3JhbnVsYXJpdHk7Ci0JdTY0IG1pbmltdW07Ci0JdTY0IG1heGltdW07Ci0JdTY0IHRyYW5zbGF0aW9uX29mZnNldDsKLQl1NjQgYWRkcmVzc19sZW5ndGg7Ci0JdTY0IHR5cGVfc3BlY2lmaWM7Ci19OwotCi1zdHJ1Y3QgYWNwaV9yZXNvdXJjZV9leHRlbmRlZF9pcnEgewotCXU4IHByb2R1Y2VyX2NvbnN1bWVyOwotCXU4IHRyaWdnZXJpbmc7Ci0JdTggcG9sYXJpdHk7Ci0JdTggc2hhcmFibGU7Ci0JdTggaW50ZXJydXB0X2NvdW50OwotCXN0cnVjdCBhY3BpX3Jlc291cmNlX3NvdXJjZSByZXNvdXJjZV9zb3VyY2U7Ci0JdTMyIGludGVycnVwdHNbMV07Ci19OwotCi1zdHJ1Y3QgYWNwaV9yZXNvdXJjZV9nZW5lcmljX3JlZ2lzdGVyIHsKLQl1OCBzcGFjZV9pZDsKLQl1OCBiaXRfd2lkdGg7Ci0JdTggYml0X29mZnNldDsKLQl1OCBhY2Nlc3Nfc2l6ZTsKLQl1NjQgYWRkcmVzczsKLX07Ci0KLS8qIEFDUElfUkVTT1VSQ0VfVFlQRXMgKi8KLQotI2RlZmluZSBBQ1BJX1JFU09VUkNFX1RZUEVfSVJRICAgICAgICAgICAgICAgICAgMAotI2RlZmluZSBBQ1BJX1JFU09VUkNFX1RZUEVfRE1BICAgICAgICAgICAgICAgICAgMQotI2RlZmluZSBBQ1BJX1JFU09VUkNFX1RZUEVfU1RBUlRfREVQRU5ERU5UICAgICAgMgotI2RlZmluZSBBQ1BJX1JFU09VUkNFX1RZUEVfRU5EX0RFUEVOREVOVCAgICAgICAgMwotI2RlZmluZSBBQ1BJX1JFU09VUkNFX1RZUEVfSU8gICAgICAgICAgICAgICAgICAgNAotI2RlZmluZSBBQ1BJX1JFU09VUkNFX1RZUEVfRklYRURfSU8gICAgICAgICAgICAgNQotI2RlZmluZSBBQ1BJX1JFU09VUkNFX1RZUEVfVkVORE9SICAgICAgICAgICAgICAgNgotI2RlZmluZSBBQ1BJX1JFU09VUkNFX1RZUEVfRU5EX1RBRyAgICAgICAgICAgICAgNwotI2RlZmluZSBBQ1BJX1JFU09VUkNFX1RZUEVfTUVNT1JZMjQgICAgICAgICAgICAgOAotI2RlZmluZSBBQ1BJX1JFU09VUkNFX1RZUEVfTUVNT1JZMzIgICAgICAgICAgICAgOQotI2RlZmluZSBBQ1BJX1JFU09VUkNFX1RZUEVfRklYRURfTUVNT1JZMzIgICAgICAgMTAKLSNkZWZpbmUgQUNQSV9SRVNPVVJDRV9UWVBFX0FERFJFU1MxNiAgICAgICAgICAgIDExCi0jZGVmaW5lIEFDUElfUkVTT1VSQ0VfVFlQRV9BRERSRVNTMzIgICAgICAgICAgICAxMgotI2RlZmluZSBBQ1BJX1JFU09VUkNFX1RZUEVfQUREUkVTUzY0ICAgICAgICAgICAgMTMKLSNkZWZpbmUgQUNQSV9SRVNPVVJDRV9UWVBFX0VYVEVOREVEX0FERFJFU1M2NCAgIDE0CS8qIEFDUEkgMy4wICovCi0jZGVmaW5lIEFDUElfUkVTT1VSQ0VfVFlQRV9FWFRFTkRFRF9JUlEgICAgICAgICAxNQotI2RlZmluZSBBQ1BJX1JFU09VUkNFX1RZUEVfR0VORVJJQ19SRUdJU1RFUiAgICAgMTYKLSNkZWZpbmUgQUNQSV9SRVNPVVJDRV9UWVBFX01BWCAgICAgICAgICAgICAgICAgIDE2Ci0KLXVuaW9uIGFjcGlfcmVzb3VyY2VfZGF0YSB7Ci0Jc3RydWN0IGFjcGlfcmVzb3VyY2VfaXJxIGlycTsKLQlzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9kbWEgZG1hOwotCXN0cnVjdCBhY3BpX3Jlc291cmNlX3N0YXJ0X2RlcGVuZGVudCBzdGFydF9kcGY7Ci0Jc3RydWN0IGFjcGlfcmVzb3VyY2VfaW8gaW87Ci0Jc3RydWN0IGFjcGlfcmVzb3VyY2VfZml4ZWRfaW8gZml4ZWRfaW87Ci0Jc3RydWN0IGFjcGlfcmVzb3VyY2VfdmVuZG9yIHZlbmRvcjsKLQlzdHJ1Y3QgYWNwaV9yZXNvdXJjZV92ZW5kb3JfdHlwZWQgdmVuZG9yX3R5cGVkOwotCXN0cnVjdCBhY3BpX3Jlc291cmNlX2VuZF90YWcgZW5kX3RhZzsKLQlzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9tZW1vcnkyNCBtZW1vcnkyNDsKLQlzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9tZW1vcnkzMiBtZW1vcnkzMjsKLQlzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9maXhlZF9tZW1vcnkzMiBmaXhlZF9tZW1vcnkzMjsKLQlzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9hZGRyZXNzMTYgYWRkcmVzczE2OwotCXN0cnVjdCBhY3BpX3Jlc291cmNlX2FkZHJlc3MzMiBhZGRyZXNzMzI7Ci0Jc3RydWN0IGFjcGlfcmVzb3VyY2VfYWRkcmVzczY0IGFkZHJlc3M2NDsKLQlzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9leHRlbmRlZF9hZGRyZXNzNjQgZXh0X2FkZHJlc3M2NDsKLQlzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9leHRlbmRlZF9pcnEgZXh0ZW5kZWRfaXJxOwotCXN0cnVjdCBhY3BpX3Jlc291cmNlX2dlbmVyaWNfcmVnaXN0ZXIgZ2VuZXJpY19yZWc7Ci0KLQkvKiBDb21tb24gZmllbGRzICovCi0KLQlzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9hZGRyZXNzIGFkZHJlc3M7CS8qIENvbW1vbiAxNi8zMi82NCBhZGRyZXNzIGZpZWxkcyAqLwotfTsKLQotc3RydWN0IGFjcGlfcmVzb3VyY2UgewotCXUzMiB0eXBlOwotCXUzMiBsZW5ndGg7Ci0JdW5pb24gYWNwaV9yZXNvdXJjZV9kYXRhIGRhdGE7Ci19OwotCi0vKiByZXN0b3JlIGRlZmF1bHQgYWxpZ25tZW50ICovCi0KLSNwcmFnbWEgcGFjaygpCi0KLSNkZWZpbmUgQUNQSV9SU19TSVpFX05PX0RBVEEgICAgICAgICAgICAgICAgOAkvKiBJZCArIExlbmd0aCBmaWVsZHMgKi8KLSNkZWZpbmUgQUNQSV9SU19TSVpFX01JTiAgICAgICAgICAgICAgICAgICAgKHUzMikgQUNQSV9ST1VORF9VUF9UT19OQVRJVkVfV09SRCAoMTIpCi0jZGVmaW5lIEFDUElfUlNfU0laRSh0eXBlKSAgICAgICAgICAgICAgICAgICh1MzIpIChBQ1BJX1JTX1NJWkVfTk9fREFUQSArIHNpemVvZiAodHlwZSkpCi0KLSNkZWZpbmUgQUNQSV9ORVhUX1JFU09VUkNFKHJlcykgICAgICAgICAgICAgKHN0cnVjdCBhY3BpX3Jlc291cmNlICopKCh1OCAqKSByZXMgKyByZXMtPmxlbmd0aCkKLQotc3RydWN0IGFjcGlfcGNpX3JvdXRpbmdfdGFibGUgewotCXUzMiBsZW5ndGg7Ci0JdTMyIHBpbjsKLQlhY3BpX2ludGVnZXIgYWRkcmVzczsJLyogaGVyZSBmb3IgNjQtYml0IGFsaWdubWVudCAqLwotCXUzMiBzb3VyY2VfaW5kZXg7Ci0JY2hhciBzb3VyY2VbNF07CQkvKiBwYWQgdG8gNjQgYml0cyBzbyBzaXplb2YoKSB3b3JrcyBpbiBhbGwgY2FzZXMgKi8KIH07CiAKICNlbmRpZgkJCQkvKiBfX0FDVFlQRVNfSF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FjcGkvYWN1dGlscy5oIGIvaW5jbHVkZS9hY3BpL2FjdXRpbHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDgzMDdiMi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FjcGkvYWN1dGlscy5oCisrKyAvZGV2L251bGwKQEAgLTEsNTg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBOYW1lOiBhY3V0aWxzLmggLS0gcHJvdG90eXBlcyBmb3IgdGhlIGNvbW1vbiAoc3Vic3lzdGVtLXdpZGUpIHByb2NlZHVyZXMKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA4LCBJbnRlbCBDb3JwLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAotICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgYXQgbWluaW11bSBhIGRpc2NsYWltZXIKLSAqICAgIHN1YnN0YW50aWFsbHkgc2ltaWxhciB0byB0aGUgIk5PIFdBUlJBTlRZIiBkaXNjbGFpbWVyIGJlbG93Ci0gKiAgICAoIkRpc2NsYWltZXIiKSBhbmQgYW55IHJlZGlzdHJpYnV0aW9uIG11c3QgYmUgY29uZGl0aW9uZWQgdXBvbgotICogICAgaW5jbHVkaW5nIGEgc3Vic3RhbnRpYWxseSBzaW1pbGFyIERpc2NsYWltZXIgcmVxdWlyZW1lbnQgZm9yIGZ1cnRoZXIKLSAqICAgIGJpbmFyeSByZWRpc3RyaWJ1dGlvbi4KLSAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcwotICogICAgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICogU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBOTyBXQVJSQU5UWQotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCi0gKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUwotICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcKLSAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQotICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgotICovCi0KLSNpZm5kZWYgX0FDVVRJTFNfSAotI2RlZmluZSBfQUNVVElMU19ICi0KLWV4dGVybiBjb25zdCB1OCBhY3BpX2dibF9yZXNvdXJjZV9hbWxfc2l6ZXNbXTsKLQotLyogU3RyaW5ncyB1c2VkIGJ5IHRoZSBkaXNhc3NlbWJsZXIgYW5kIGRlYnVnZ2VyIHJlc291cmNlIGR1bXAgcm91dGluZXMgKi8KLQotI2lmIGRlZmluZWQoQUNQSV9ESVNBU1NFTUJMRVIpIHx8IGRlZmluZWQgKEFDUElfREVCVUdHRVIpCi0KLWV4dGVybiBjb25zdCBjaGFyICphY3BpX2dibF9ibV9kZWNvZGVbXTsKLWV4dGVybiBjb25zdCBjaGFyICphY3BpX2dibF9jb25maWdfZGVjb2RlW107Ci1leHRlcm4gY29uc3QgY2hhciAqYWNwaV9nYmxfY29uc3VtZV9kZWNvZGVbXTsKLWV4dGVybiBjb25zdCBjaGFyICphY3BpX2dibF9kZWNfZGVjb2RlW107Ci1leHRlcm4gY29uc3QgY2hhciAqYWNwaV9nYmxfaGVfZGVjb2RlW107Ci1leHRlcm4gY29uc3QgY2hhciAqYWNwaV9nYmxfaW9fZGVjb2RlW107Ci1leHRlcm4gY29uc3QgY2hhciAqYWNwaV9nYmxfbGxfZGVjb2RlW107Ci1leHRlcm4gY29uc3QgY2hhciAqYWNwaV9nYmxfbWF4X2RlY29kZVtdOwotZXh0ZXJuIGNvbnN0IGNoYXIgKmFjcGlfZ2JsX21lbV9kZWNvZGVbXTsKLWV4dGVybiBjb25zdCBjaGFyICphY3BpX2dibF9taW5fZGVjb2RlW107Ci1leHRlcm4gY29uc3QgY2hhciAqYWNwaV9nYmxfbXRwX2RlY29kZVtdOwotZXh0ZXJuIGNvbnN0IGNoYXIgKmFjcGlfZ2JsX3JuZ19kZWNvZGVbXTsKLWV4dGVybiBjb25zdCBjaGFyICphY3BpX2dibF9yd19kZWNvZGVbXTsKLWV4dGVybiBjb25zdCBjaGFyICphY3BpX2dibF9zaHJfZGVjb2RlW107Ci1leHRlcm4gY29uc3QgY2hhciAqYWNwaV9nYmxfc2l6X2RlY29kZVtdOwotZXh0ZXJuIGNvbnN0IGNoYXIgKmFjcGlfZ2JsX3Ryc19kZWNvZGVbXTsKLWV4dGVybiBjb25zdCBjaGFyICphY3BpX2dibF90dHBfZGVjb2RlW107Ci1leHRlcm4gY29uc3QgY2hhciAqYWNwaV9nYmxfdHlwX2RlY29kZVtdOwotI2VuZGlmCi0KLS8qIFR5cGVzIGZvciBSZXNvdXJjZSBkZXNjcmlwdG9yIGVudHJpZXMgKi8KLQotI2RlZmluZSBBQ1BJX0lOVkFMSURfUkVTT1VSQ0UgICAgICAgICAgIDAKLSNkZWZpbmUgQUNQSV9GSVhFRF9MRU5HVEggICAgICAgICAgICAgICAxCi0jZGVmaW5lIEFDUElfVkFSSUFCTEVfTEVOR1RIICAgICAgICAgICAgMgotI2RlZmluZSBBQ1BJX1NNQUxMX1ZBUklBQkxFX0xFTkdUSCAgICAgIDMKLQotdHlwZWRlZgotYWNwaV9zdGF0dXMoKmFjcGlfd2Fsa19hbWxfY2FsbGJhY2spICh1OCAqIGFtbCwKLQkJCQkgICAgICB1MzIgbGVuZ3RoLAotCQkJCSAgICAgIHUzMiBvZmZzZXQsCi0JCQkJICAgICAgdTggcmVzb3VyY2VfaW5kZXgsIHZvaWQgKipjb250ZXh0KTsKLQotdHlwZWRlZgotYWNwaV9zdGF0dXMoKmFjcGlfcGtnX2NhbGxiYWNrKSAodTggb2JqZWN0X3R5cGUsCi0JCQkJIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKiBzb3VyY2Vfb2JqZWN0LAotCQkJCSB1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgKiBzdGF0ZSwKLQkJCQkgdm9pZCAqY29udGV4dCk7Ci0KLXN0cnVjdCBhY3BpX3BrZ19pbmZvIHsKLQl1OCAqZnJlZV9zcGFjZTsKLQlhY3BpX3NpemUgbGVuZ3RoOwotCXUzMiBvYmplY3Rfc3BhY2U7Ci0JdTMyIG51bV9wYWNrYWdlczsKLX07Ci0KLSNkZWZpbmUgUkVGX0lOQ1JFTUVOVCAgICAgICAodTE2KSAwCi0jZGVmaW5lIFJFRl9ERUNSRU1FTlQgICAgICAgKHUxNikgMQotI2RlZmluZSBSRUZfRk9SQ0VfREVMRVRFICAgICh1MTYpIDIKLQotLyogYWNwaV91dF9kdW1wX2J1ZmZlciAqLwotCi0jZGVmaW5lIERCX0JZVEVfRElTUExBWSAgICAgMQotI2RlZmluZSBEQl9XT1JEX0RJU1BMQVkgICAgIDIKLSNkZWZpbmUgREJfRFdPUkRfRElTUExBWSAgICA0Ci0jZGVmaW5lIERCX1FXT1JEX0RJU1BMQVkgICAgOAotCi0vKgotICogdXRnbG9iYWwgLSBHbG9iYWwgZGF0YSBzdHJ1Y3R1cmVzIGFuZCBwcm9jZWR1cmVzCi0gKi8KLWFjcGlfc3RhdHVzIGFjcGlfdXRfaW5pdF9nbG9iYWxzKHZvaWQpOwotCi0jaWYgZGVmaW5lZChBQ1BJX0RFQlVHX09VVFBVVCkgfHwgZGVmaW5lZChBQ1BJX0RFQlVHR0VSKQotCi1jaGFyICphY3BpX3V0X2dldF9tdXRleF9uYW1lKHUzMiBtdXRleF9pZCk7Ci0KLWNvbnN0IGNoYXIgKmFjcGlfdXRfZ2V0X25vdGlmeV9uYW1lKHUzMiBub3RpZnlfdmFsdWUpOwotCi0jZW5kaWYKLQotY2hhciAqYWNwaV91dF9nZXRfdHlwZV9uYW1lKGFjcGlfb2JqZWN0X3R5cGUgdHlwZSk7Ci0KLWNoYXIgKmFjcGlfdXRfZ2V0X25vZGVfbmFtZSh2b2lkICpvYmplY3QpOwotCi1jaGFyICphY3BpX3V0X2dldF9kZXNjcmlwdG9yX25hbWUodm9pZCAqb2JqZWN0KTsKLQotY29uc3QgY2hhciAqYWNwaV91dF9nZXRfcmVmZXJlbmNlX25hbWUodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqZWN0KTsKLQotY2hhciAqYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZSh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYyk7Ci0KLWNoYXIgKmFjcGlfdXRfZ2V0X3JlZ2lvbl9uYW1lKHU4IHNwYWNlX2lkKTsKLQotY2hhciAqYWNwaV91dF9nZXRfZXZlbnRfbmFtZSh1MzIgZXZlbnRfaWQpOwotCi1jaGFyIGFjcGlfdXRfaGV4X3RvX2FzY2lpX2NoYXIoYWNwaV9pbnRlZ2VyIGludGVnZXIsIHUzMiBwb3NpdGlvbik7Ci0KLXU4IGFjcGlfdXRfdmFsaWRfb2JqZWN0X3R5cGUoYWNwaV9vYmplY3RfdHlwZSB0eXBlKTsKLQotLyoKLSAqIHV0aW5pdCAtIG1pc2NlbGxhbmVvdXMgaW5pdGlhbGl6YXRpb24gYW5kIHNodXRkb3duCi0gKi8KLWFjcGlfc3RhdHVzIGFjcGlfdXRfaGFyZHdhcmVfaW5pdGlhbGl6ZSh2b2lkKTsKLQotdm9pZCBhY3BpX3V0X3N1YnN5c3RlbV9zaHV0ZG93bih2b2lkKTsKLQotLyoKLSAqIHV0Y2xpYiAtIExvY2FsIGltcGxlbWVudGF0aW9ucyBvZiBDIGxpYnJhcnkgZnVuY3Rpb25zCi0gKi8KLSNpZm5kZWYgQUNQSV9VU0VfU1lTVEVNX0NMSUJSQVJZCi0KLWFjcGlfc2l6ZSBhY3BpX3V0X3N0cmxlbihjb25zdCBjaGFyICpzdHJpbmcpOwotCi1jaGFyICphY3BpX3V0X3N0cmNweShjaGFyICpkc3Rfc3RyaW5nLCBjb25zdCBjaGFyICpzcmNfc3RyaW5nKTsKLQotY2hhciAqYWNwaV91dF9zdHJuY3B5KGNoYXIgKmRzdF9zdHJpbmcsCi0JCSAgICAgIGNvbnN0IGNoYXIgKnNyY19zdHJpbmcsIGFjcGlfc2l6ZSBjb3VudCk7Ci0KLWludCBhY3BpX3V0X21lbWNtcChjb25zdCBjaGFyICpidWZmZXIxLCBjb25zdCBjaGFyICpidWZmZXIyLCBhY3BpX3NpemUgY291bnQpOwotCi1pbnQgYWNwaV91dF9zdHJuY21wKGNvbnN0IGNoYXIgKnN0cmluZzEsIGNvbnN0IGNoYXIgKnN0cmluZzIsIGFjcGlfc2l6ZSBjb3VudCk7Ci0KLWludCBhY3BpX3V0X3N0cmNtcChjb25zdCBjaGFyICpzdHJpbmcxLCBjb25zdCBjaGFyICpzdHJpbmcyKTsKLQotY2hhciAqYWNwaV91dF9zdHJjYXQoY2hhciAqZHN0X3N0cmluZywgY29uc3QgY2hhciAqc3JjX3N0cmluZyk7Ci0KLWNoYXIgKmFjcGlfdXRfc3RybmNhdChjaGFyICpkc3Rfc3RyaW5nLAotCQkgICAgICBjb25zdCBjaGFyICpzcmNfc3RyaW5nLCBhY3BpX3NpemUgY291bnQpOwotCi11MzIgYWNwaV91dF9zdHJ0b3VsKGNvbnN0IGNoYXIgKnN0cmluZywgY2hhciAqKnRlcm1pbmF0b3IsIHUzMiBiYXNlKTsKLQotY2hhciAqYWNwaV91dF9zdHJzdHIoY2hhciAqc3RyaW5nMSwgY2hhciAqc3RyaW5nMik7Ci0KLXZvaWQgKmFjcGlfdXRfbWVtY3B5KHZvaWQgKmRlc3QsIGNvbnN0IHZvaWQgKnNyYywgYWNwaV9zaXplIGNvdW50KTsKLQotdm9pZCAqYWNwaV91dF9tZW1zZXQodm9pZCAqZGVzdCwgdTggdmFsdWUsIGFjcGlfc2l6ZSBjb3VudCk7Ci0KLWludCBhY3BpX3V0X3RvX3VwcGVyKGludCBjKTsKLQotaW50IGFjcGlfdXRfdG9fbG93ZXIoaW50IGMpOwotCi1leHRlcm4gY29uc3QgdTggX2FjcGlfY3R5cGVbXTsKLQotI2RlZmluZSBfQUNQSV9YQSAgICAgMHgwMAkvKiBleHRyYSBhbHBoYWJldGljIC0gbm90IHN1cHBvcnRlZCAqLwotI2RlZmluZSBfQUNQSV9YUyAgICAgMHg0MAkvKiBleHRyYSBzcGFjZSAqLwotI2RlZmluZSBfQUNQSV9CQiAgICAgMHgwMAkvKiBCRUwsIEJTLCBldGMuIC0gbm90IHN1cHBvcnRlZCAqLwotI2RlZmluZSBfQUNQSV9DTiAgICAgMHgyMAkvKiBDUiwgRkYsIEhULCBOTCwgVlQgKi8KLSNkZWZpbmUgX0FDUElfREkgICAgIDB4MDQJLyogJzAnLSc5JyAqLwotI2RlZmluZSBfQUNQSV9MTyAgICAgMHgwMgkvKiAnYSctJ3onICovCi0jZGVmaW5lIF9BQ1BJX1BVICAgICAweDEwCS8qIHB1bmN0dWF0aW9uICovCi0jZGVmaW5lIF9BQ1BJX1NQICAgICAweDA4CS8qIHNwYWNlICovCi0jZGVmaW5lIF9BQ1BJX1VQICAgICAweDAxCS8qICdBJy0nWicgKi8KLSNkZWZpbmUgX0FDUElfWEQgICAgIDB4ODAJLyogJzAnLSc5JywgJ0EnLSdGJywgJ2EnLSdmJyAqLwotCi0jZGVmaW5lIEFDUElfSVNfRElHSVQoYykgIChfYWNwaV9jdHlwZVsodW5zaWduZWQgY2hhcikoYyldICYgKF9BQ1BJX0RJKSkKLSNkZWZpbmUgQUNQSV9JU19TUEFDRShjKSAgKF9hY3BpX2N0eXBlWyh1bnNpZ25lZCBjaGFyKShjKV0gJiAoX0FDUElfU1ApKQotI2RlZmluZSBBQ1BJX0lTX1hESUdJVChjKSAoX2FjcGlfY3R5cGVbKHVuc2lnbmVkIGNoYXIpKGMpXSAmIChfQUNQSV9YRCkpCi0jZGVmaW5lIEFDUElfSVNfVVBQRVIoYykgIChfYWNwaV9jdHlwZVsodW5zaWduZWQgY2hhcikoYyldICYgKF9BQ1BJX1VQKSkKLSNkZWZpbmUgQUNQSV9JU19MT1dFUihjKSAgKF9hY3BpX2N0eXBlWyh1bnNpZ25lZCBjaGFyKShjKV0gJiAoX0FDUElfTE8pKQotI2RlZmluZSBBQ1BJX0lTX1BSSU5UKGMpICAoX2FjcGlfY3R5cGVbKHVuc2lnbmVkIGNoYXIpKGMpXSAmIChfQUNQSV9MTyB8IF9BQ1BJX1VQIHwgX0FDUElfREkgfCBfQUNQSV9TUCB8IF9BQ1BJX1BVKSkKLSNkZWZpbmUgQUNQSV9JU19BTFBIQShjKSAgKF9hY3BpX2N0eXBlWyh1bnNpZ25lZCBjaGFyKShjKV0gJiAoX0FDUElfTE8gfCBfQUNQSV9VUCkpCi0KLSNlbmRpZgkJCQkvKiBBQ1BJX1VTRV9TWVNURU1fQ0xJQlJBUlkgKi8KLQotLyoKLSAqIHV0Y29weSAtIE9iamVjdCBjb25zdHJ1Y3Rpb24gYW5kIGNvbnZlcnNpb24gaW50ZXJmYWNlcwotICovCi1hY3BpX3N0YXR1cwotYWNwaV91dF9idWlsZF9zaW1wbGVfb2JqZWN0KHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9iaiwKLQkJCSAgICB1bmlvbiBhY3BpX29iamVjdCAqdXNlcl9vYmosCi0JCQkgICAgdTggKiBkYXRhX3NwYWNlLCB1MzIgKiBidWZmZXJfc3BhY2VfdXNlZCk7Ci0KLWFjcGlfc3RhdHVzCi1hY3BpX3V0X2J1aWxkX3BhY2thZ2Vfb2JqZWN0KHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9iaiwKLQkJCSAgICAgdTggKiBidWZmZXIsIHUzMiAqIHNwYWNlX3VzZWQpOwotCi1hY3BpX3N0YXR1cwotYWNwaV91dF9jb3B5X2lvYmplY3RfdG9fZW9iamVjdCh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmosCi0JCQkJc3RydWN0IGFjcGlfYnVmZmVyICpyZXRfYnVmZmVyKTsKLQotYWNwaV9zdGF0dXMKLWFjcGlfdXRfY29weV9lb2JqZWN0X3RvX2lvYmplY3QodW5pb24gYWNwaV9vYmplY3QgKm9iaiwKLQkJCQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICoqaW50ZXJuYWxfb2JqKTsKLQotYWNwaV9zdGF0dXMKLWFjcGlfdXRfY29weV9pc2ltcGxlX3RvX2lzaW1wbGUodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqc291cmNlX29iaiwKLQkJCQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpkZXN0X29iaik7Ci0KLWFjcGlfc3RhdHVzCi1hY3BpX3V0X2NvcHlfaW9iamVjdF90b19pb2JqZWN0KHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnNvdXJjZV9kZXNjLAotCQkJCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKipkZXN0X2Rlc2MsCi0JCQkJc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSk7Ci0KLS8qCi0gKiB1dGNyZWF0ZSAtIE9iamVjdCBjcmVhdGlvbgotICovCi1hY3BpX3N0YXR1cwotYWNwaV91dF91cGRhdGVfb2JqZWN0X3JlZmVyZW5jZSh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmplY3QsIHUxNiBhY3Rpb24pOwotCi0vKgotICogdXRkZWJ1ZyAtIERlYnVnIGludGVyZmFjZXMKLSAqLwotdm9pZCBhY3BpX3V0X2luaXRfc3RhY2tfcHRyX3RyYWNlKHZvaWQpOwotCi12b2lkIGFjcGlfdXRfdHJhY2tfc3RhY2tfcHRyKHZvaWQpOwotCi12b2lkCi1hY3BpX3V0X3RyYWNlKHUzMiBsaW5lX251bWJlciwKLQkgICAgICBjb25zdCBjaGFyICpmdW5jdGlvbl9uYW1lLAotCSAgICAgIGNvbnN0IGNoYXIgKm1vZHVsZV9uYW1lLCB1MzIgY29tcG9uZW50X2lkKTsKLQotdm9pZAotYWNwaV91dF90cmFjZV9wdHIodTMyIGxpbmVfbnVtYmVyLAotCQkgIGNvbnN0IGNoYXIgKmZ1bmN0aW9uX25hbWUsCi0JCSAgY29uc3QgY2hhciAqbW9kdWxlX25hbWUsIHUzMiBjb21wb25lbnRfaWQsIHZvaWQgKnBvaW50ZXIpOwotCi12b2lkCi1hY3BpX3V0X3RyYWNlX3UzMih1MzIgbGluZV9udW1iZXIsCi0JCSAgY29uc3QgY2hhciAqZnVuY3Rpb25fbmFtZSwKLQkJICBjb25zdCBjaGFyICptb2R1bGVfbmFtZSwgdTMyIGNvbXBvbmVudF9pZCwgdTMyIGludGVnZXIpOwotCi12b2lkCi1hY3BpX3V0X3RyYWNlX3N0cih1MzIgbGluZV9udW1iZXIsCi0JCSAgY29uc3QgY2hhciAqZnVuY3Rpb25fbmFtZSwKLQkJICBjb25zdCBjaGFyICptb2R1bGVfbmFtZSwgdTMyIGNvbXBvbmVudF9pZCwgY2hhciAqc3RyaW5nKTsKLQotdm9pZAotYWNwaV91dF9leGl0KHUzMiBsaW5lX251bWJlciwKLQkgICAgIGNvbnN0IGNoYXIgKmZ1bmN0aW9uX25hbWUsCi0JICAgICBjb25zdCBjaGFyICptb2R1bGVfbmFtZSwgdTMyIGNvbXBvbmVudF9pZCk7Ci0KLXZvaWQKLWFjcGlfdXRfc3RhdHVzX2V4aXQodTMyIGxpbmVfbnVtYmVyLAotCQkgICAgY29uc3QgY2hhciAqZnVuY3Rpb25fbmFtZSwKLQkJICAgIGNvbnN0IGNoYXIgKm1vZHVsZV9uYW1lLAotCQkgICAgdTMyIGNvbXBvbmVudF9pZCwgYWNwaV9zdGF0dXMgc3RhdHVzKTsKLQotdm9pZAotYWNwaV91dF92YWx1ZV9leGl0KHUzMiBsaW5lX251bWJlciwKLQkJICAgY29uc3QgY2hhciAqZnVuY3Rpb25fbmFtZSwKLQkJICAgY29uc3QgY2hhciAqbW9kdWxlX25hbWUsCi0JCSAgIHUzMiBjb21wb25lbnRfaWQsIGFjcGlfaW50ZWdlciB2YWx1ZSk7Ci0KLXZvaWQKLWFjcGlfdXRfcHRyX2V4aXQodTMyIGxpbmVfbnVtYmVyLAotCQkgY29uc3QgY2hhciAqZnVuY3Rpb25fbmFtZSwKLQkJIGNvbnN0IGNoYXIgKm1vZHVsZV9uYW1lLCB1MzIgY29tcG9uZW50X2lkLCB1OCAqcHRyKTsKLQotdm9pZCBhY3BpX3V0X2R1bXBfYnVmZmVyKHU4ICogYnVmZmVyLCB1MzIgY291bnQsIHUzMiBkaXNwbGF5LCB1MzIgY29tcG9uZW50X2lkKTsKLQotdm9pZCBhY3BpX3V0X2R1bXBfYnVmZmVyMih1OCAqIGJ1ZmZlciwgdTMyIGNvdW50LCB1MzIgZGlzcGxheSk7Ci0KLXZvaWQgYWNwaV91dF9yZXBvcnRfZXJyb3IoY2hhciAqbW9kdWxlX25hbWUsIHUzMiBsaW5lX251bWJlcik7Ci0KLXZvaWQgYWNwaV91dF9yZXBvcnRfaW5mbyhjaGFyICptb2R1bGVfbmFtZSwgdTMyIGxpbmVfbnVtYmVyKTsKLQotdm9pZCBhY3BpX3V0X3JlcG9ydF93YXJuaW5nKGNoYXIgKm1vZHVsZV9uYW1lLCB1MzIgbGluZV9udW1iZXIpOwotCi0vKiBFcnJvciBhbmQgbWVzc2FnZSByZXBvcnRpbmcgaW50ZXJmYWNlcyAqLwotCi12b2lkIEFDUElfSU5URVJOQUxfVkFSX1hGQUNFCi1hY3BpX3V0X2RlYnVnX3ByaW50KHUzMiByZXF1ZXN0ZWRfZGVidWdfbGV2ZWwsCi0JCSAgICB1MzIgbGluZV9udW1iZXIsCi0JCSAgICBjb25zdCBjaGFyICpmdW5jdGlvbl9uYW1lLAotCQkgICAgY29uc3QgY2hhciAqbW9kdWxlX25hbWUsCi0JCSAgICB1MzIgY29tcG9uZW50X2lkLAotCQkgICAgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pIEFDUElfUFJJTlRGX0xJS0UoNik7Ci0KLXZvaWQgQUNQSV9JTlRFUk5BTF9WQVJfWEZBQ0UKLWFjcGlfdXRfZGVidWdfcHJpbnRfcmF3KHUzMiByZXF1ZXN0ZWRfZGVidWdfbGV2ZWwsCi0JCQl1MzIgbGluZV9udW1iZXIsCi0JCQljb25zdCBjaGFyICpmdW5jdGlvbl9uYW1lLAotCQkJY29uc3QgY2hhciAqbW9kdWxlX25hbWUsCi0JCQl1MzIgY29tcG9uZW50X2lkLAotCQkJY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pIEFDUElfUFJJTlRGX0xJS0UoNik7Ci0KLXZvaWQgQUNQSV9JTlRFUk5BTF9WQVJfWEZBQ0UKLWFjcGlfdXRfZXJyb3IoY29uc3QgY2hhciAqbW9kdWxlX25hbWUsCi0JICAgICAgdTMyIGxpbmVfbnVtYmVyLCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikgQUNQSV9QUklOVEZfTElLRSgzKTsKLQotdm9pZCBBQ1BJX0lOVEVSTkFMX1ZBUl9YRkFDRQotYWNwaV91dF9leGNlcHRpb24oY29uc3QgY2hhciAqbW9kdWxlX25hbWUsCi0JCSAgdTMyIGxpbmVfbnVtYmVyLAotCQkgIGFjcGlfc3RhdHVzIHN0YXR1cywKLQkJICBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikgQUNQSV9QUklOVEZfTElLRSg0KTsKLQotdm9pZCBBQ1BJX0lOVEVSTkFMX1ZBUl9YRkFDRQotYWNwaV91dF93YXJuaW5nKGNvbnN0IGNoYXIgKm1vZHVsZV9uYW1lLAotCQl1MzIgbGluZV9udW1iZXIsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKSBBQ1BJX1BSSU5URl9MSUtFKDMpOwotCi12b2lkIEFDUElfSU5URVJOQUxfVkFSX1hGQUNFCi1hY3BpX3V0X2luZm8oY29uc3QgY2hhciAqbW9kdWxlX25hbWUsCi0JICAgICB1MzIgbGluZV9udW1iZXIsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKSBBQ1BJX1BSSU5URl9MSUtFKDMpOwotCi0vKgotICogdXRkZWxldGUgLSBPYmplY3QgZGVsZXRpb24gYW5kIHJlZmVyZW5jZSBjb3VudHMKLSAqLwotdm9pZCBhY3BpX3V0X2FkZF9yZWZlcmVuY2UodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqZWN0KTsKLQotdm9pZCBhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqZWN0KTsKLQotdm9pZCBhY3BpX3V0X2RlbGV0ZV9pbnRlcm5hbF9wYWNrYWdlX29iamVjdCh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmplY3QpOwotCi12b2lkIGFjcGlfdXRfZGVsZXRlX2ludGVybmFsX3NpbXBsZV9vYmplY3QodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqZWN0KTsKLQotdm9pZCBhY3BpX3V0X2RlbGV0ZV9pbnRlcm5hbF9vYmplY3RfbGlzdCh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICoqb2JqX2xpc3QpOwotCi0vKgotICogdXRldmFsIC0gb2JqZWN0IGV2YWx1YXRpb24KLSAqLwotYWNwaV9zdGF0dXMgYWNwaV91dF9vc2lfaW1wbGVtZW50YXRpb24oc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSk7Ci0KLWFjcGlfc3RhdHVzCi1hY3BpX3V0X2V2YWx1YXRlX29iamVjdChzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqcHJlZml4X25vZGUsCi0JCQljaGFyICpwYXRoLAotCQkJdTMyIGV4cGVjdGVkX3JldHVybl9idHlwZXMsCi0JCQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICoqcmV0dXJuX2Rlc2MpOwotCi1hY3BpX3N0YXR1cwotYWNwaV91dF9ldmFsdWF0ZV9udW1lcmljX29iamVjdChjaGFyICpvYmplY3RfbmFtZSwKLQkJCQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqZGV2aWNlX25vZGUsCi0JCQkJYWNwaV9pbnRlZ2VyICogYWRkcmVzcyk7Ci0KLWFjcGlfc3RhdHVzCi1hY3BpX3V0X2V4ZWN1dGVfSElEKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpkZXZpY2Vfbm9kZSwKLQkJICAgIHN0cnVjdCBhY3BpY2FfZGV2aWNlX2lkICpoaWQpOwotCi1hY3BpX3N0YXR1cwotYWNwaV91dF9leGVjdXRlX0NJRChzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqZGV2aWNlX25vZGUsCi0JCSAgICBzdHJ1Y3QgYWNwaV9jb21wYXRpYmxlX2lkX2xpc3QgKipyZXR1cm5fY2lkX2xpc3QpOwotCi1hY3BpX3N0YXR1cwotYWNwaV91dF9leGVjdXRlX1NUQShzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqZGV2aWNlX25vZGUsCi0JCSAgICB1MzIgKiBzdGF0dXNfZmxhZ3MpOwotCi1hY3BpX3N0YXR1cwotYWNwaV91dF9leGVjdXRlX1VJRChzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqZGV2aWNlX25vZGUsCi0JCSAgICBzdHJ1Y3QgYWNwaWNhX2RldmljZV9pZCAqdWlkKTsKLQotYWNwaV9zdGF0dXMKLWFjcGlfdXRfZXhlY3V0ZV9zeGRzKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpkZXZpY2Vfbm9kZSwgdTggKiBoaWdoZXN0KTsKLQotLyoKLSAqIHV0b2JqZWN0IC0gaW50ZXJuYWwgb2JqZWN0IGNyZWF0ZS9kZWxldGUvY2FjaGUgcm91dGluZXMKLSAqLwotdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqYWNwaV91dF9jcmVhdGVfaW50ZXJuYWxfb2JqZWN0X2RiZyhjb25zdCBjaGFyCi0JCQkJCQkJICAgICAgKm1vZHVsZV9uYW1lLAotCQkJCQkJCSAgICAgIHUzMiBsaW5lX251bWJlciwKLQkJCQkJCQkgICAgICB1MzIgY29tcG9uZW50X2lkLAotCQkJCQkJCSAgICAgIGFjcGlfb2JqZWN0X3R5cGUKLQkJCQkJCQkgICAgICB0eXBlKTsKLQotdm9pZCAqYWNwaV91dF9hbGxvY2F0ZV9vYmplY3RfZGVzY19kYmcoY29uc3QgY2hhciAqbW9kdWxlX25hbWUsCi0JCQkJICAgICAgIHUzMiBsaW5lX251bWJlciwgdTMyIGNvbXBvbmVudF9pZCk7Ci0KLSNkZWZpbmUgYWNwaV91dF9jcmVhdGVfaW50ZXJuYWxfb2JqZWN0KHQpIGFjcGlfdXRfY3JlYXRlX2ludGVybmFsX29iamVjdF9kYmcgKF9hY3BpX21vZHVsZV9uYW1lLF9fTElORV9fLF9DT01QT05FTlQsdCkKLSNkZWZpbmUgYWNwaV91dF9hbGxvY2F0ZV9vYmplY3RfZGVzYygpICBhY3BpX3V0X2FsbG9jYXRlX29iamVjdF9kZXNjX2RiZyAoX2FjcGlfbW9kdWxlX25hbWUsX19MSU5FX18sX0NPTVBPTkVOVCkKLQotdm9pZCBhY3BpX3V0X2RlbGV0ZV9vYmplY3RfZGVzYyh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmplY3QpOwotCi11OCBhY3BpX3V0X3ZhbGlkX2ludGVybmFsX29iamVjdCh2b2lkICpvYmplY3QpOwotCi11bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICphY3BpX3V0X2NyZWF0ZV9wYWNrYWdlX29iamVjdCh1MzIgY291bnQpOwotCi11bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICphY3BpX3V0X2NyZWF0ZV9idWZmZXJfb2JqZWN0KGFjcGlfc2l6ZSBidWZmZXJfc2l6ZSk7Ci0KLXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKmFjcGlfdXRfY3JlYXRlX3N0cmluZ19vYmplY3QoYWNwaV9zaXplIHN0cmluZ19zaXplKTsKLQotYWNwaV9zdGF0dXMKLWFjcGlfdXRfZ2V0X29iamVjdF9zaXplKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9iaiwgYWNwaV9zaXplICogb2JqX2xlbmd0aCk7Ci0KLS8qCi0gKiB1dHN0YXRlIC0gR2VuZXJpYyBzdGF0ZSBjcmVhdGlvbi9jYWNoZSByb3V0aW5lcwotICovCi12b2lkCi1hY3BpX3V0X3B1c2hfZ2VuZXJpY19zdGF0ZSh1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgKipsaXN0X2hlYWQsCi0JCQkgICB1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgKnN0YXRlKTsKLQotdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICphY3BpX3V0X3BvcF9nZW5lcmljX3N0YXRlKHVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZQotCQkJCQkJICAgICoqbGlzdF9oZWFkKTsKLQotdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICphY3BpX3V0X2NyZWF0ZV9nZW5lcmljX3N0YXRlKHZvaWQpOwotCi1zdHJ1Y3QgYWNwaV90aHJlYWRfc3RhdGUgKmFjcGlfdXRfY3JlYXRlX3RocmVhZF9zdGF0ZSh2b2lkKTsKLQotdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICphY3BpX3V0X2NyZWF0ZV91cGRhdGVfc3RhdGUodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdAotCQkJCQkJICAgICAgKm9iamVjdCwgdTE2IGFjdGlvbik7Ci0KLXVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSAqYWNwaV91dF9jcmVhdGVfcGtnX3N0YXRlKHZvaWQgKmludGVybmFsX29iamVjdCwKLQkJCQkJCSAgIHZvaWQgKmV4dGVybmFsX29iamVjdCwKLQkJCQkJCSAgIHUxNiBpbmRleCk7Ci0KLWFjcGlfc3RhdHVzCi1hY3BpX3V0X2NyZWF0ZV91cGRhdGVfc3RhdGVfYW5kX3B1c2godW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqZWN0LAotCQkJCSAgICAgdTE2IGFjdGlvbiwKLQkJCQkgICAgIHVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSAqKnN0YXRlX2xpc3QpOwotCi0jaWZkZWYJQUNQSV9GVVRVUkVfVVNBR0UKLWFjcGlfc3RhdHVzCi1hY3BpX3V0X2NyZWF0ZV9wa2dfc3RhdGVfYW5kX3B1c2godm9pZCAqaW50ZXJuYWxfb2JqZWN0LAotCQkJCSAgdm9pZCAqZXh0ZXJuYWxfb2JqZWN0LAotCQkJCSAgdTE2IGluZGV4LAotCQkJCSAgdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICoqc3RhdGVfbGlzdCk7Ci0jZW5kaWYJCQkJLyogQUNQSV9GVVRVUkVfVVNBR0UgKi8KLQotdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICphY3BpX3V0X2NyZWF0ZV9jb250cm9sX3N0YXRlKHZvaWQpOwotCi12b2lkIGFjcGlfdXRfZGVsZXRlX2dlbmVyaWNfc3RhdGUodW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICpzdGF0ZSk7Ci0KLS8qCi0gKiB1dG1hdGgKLSAqLwotYWNwaV9zdGF0dXMKLWFjcGlfdXRfZGl2aWRlKGFjcGlfaW50ZWdlciBpbl9kaXZpZGVuZCwKLQkgICAgICAgYWNwaV9pbnRlZ2VyIGluX2Rpdmlzb3IsCi0JICAgICAgIGFjcGlfaW50ZWdlciAqIG91dF9xdW90aWVudCwgYWNwaV9pbnRlZ2VyICogb3V0X3JlbWFpbmRlcik7Ci0KLWFjcGlfc3RhdHVzCi1hY3BpX3V0X3Nob3J0X2RpdmlkZShhY3BpX2ludGVnZXIgaW5fZGl2aWRlbmQsCi0JCSAgICAgdTMyIGRpdmlzb3IsCi0JCSAgICAgYWNwaV9pbnRlZ2VyICogb3V0X3F1b3RpZW50LCB1MzIgKiBvdXRfcmVtYWluZGVyKTsKLQotLyoKLSAqIHV0bWlzYwotICovCi1jb25zdCBjaGFyICphY3BpX3V0X3ZhbGlkYXRlX2V4Y2VwdGlvbihhY3BpX3N0YXR1cyBzdGF0dXMpOwotCi11OCBhY3BpX3V0X2lzX2FtbF90YWJsZShzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKnRhYmxlKTsKLQotYWNwaV9zdGF0dXMgYWNwaV91dF9hbGxvY2F0ZV9vd25lcl9pZChhY3BpX293bmVyX2lkICogb3duZXJfaWQpOwotCi12b2lkIGFjcGlfdXRfcmVsZWFzZV9vd25lcl9pZChhY3BpX293bmVyX2lkICogb3duZXJfaWQpOwotCi1hY3BpX3N0YXR1cwotYWNwaV91dF93YWxrX3BhY2thZ2VfdHJlZSh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpzb3VyY2Vfb2JqZWN0LAotCQkJICB2b2lkICp0YXJnZXRfb2JqZWN0LAotCQkJICBhY3BpX3BrZ19jYWxsYmFjayB3YWxrX2NhbGxiYWNrLCB2b2lkICpjb250ZXh0KTsKLQotdm9pZCBhY3BpX3V0X3N0cnVwcihjaGFyICpzcmNfc3RyaW5nKTsKLQotdm9pZCBhY3BpX3V0X3ByaW50X3N0cmluZyhjaGFyICpzdHJpbmcsIHU4IG1heF9sZW5ndGgpOwotCi11OCBhY3BpX3V0X3ZhbGlkX2FjcGlfbmFtZSh1MzIgbmFtZSk7Ci0KLWFjcGlfbmFtZSBhY3BpX3V0X3JlcGFpcl9uYW1lKGNoYXIgKm5hbWUpOwotCi11OCBhY3BpX3V0X3ZhbGlkX2FjcGlfY2hhcihjaGFyIGNoYXJhY3RlciwgdTMyIHBvc2l0aW9uKTsKLQotYWNwaV9zdGF0dXMKLWFjcGlfdXRfc3RydG91bDY0KGNoYXIgKnN0cmluZywgdTMyIGJhc2UsIGFjcGlfaW50ZWdlciAqIHJldF9pbnRlZ2VyKTsKLQotLyogVmFsdWVzIGZvciBCYXNlIGFib3ZlICgxNj1IZXgsIDEwPURlY2ltYWwpICovCi0KLSNkZWZpbmUgQUNQSV9BTllfQkFTRSAgICAgICAgMAotCi11MzIgYWNwaV91dF9kd29yZF9ieXRlX3N3YXAodTMyIHZhbHVlKTsKLQotdm9pZCBhY3BpX3V0X3NldF9pbnRlZ2VyX3dpZHRoKHU4IHJldmlzaW9uKTsKLQotI2lmZGVmIEFDUElfREVCVUdfT1VUUFVUCi12b2lkCi1hY3BpX3V0X2Rpc3BsYXlfaW5pdF9wYXRobmFtZSh1OCB0eXBlLAotCQkJICAgICAgc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm9ial9oYW5kbGUsCi0JCQkgICAgICBjaGFyICpwYXRoKTsKLSNlbmRpZgotCi0vKgotICogdXRyZXNyYwotICovCi1hY3BpX3N0YXR1cwotYWNwaV91dF93YWxrX2FtbF9yZXNvdXJjZXModTggKiBhbWwsCi0JCQkgICBhY3BpX3NpemUgYW1sX2xlbmd0aCwKLQkJCSAgIGFjcGlfd2Fsa19hbWxfY2FsbGJhY2sgdXNlcl9mdW5jdGlvbiwKLQkJCSAgIHZvaWQgKipjb250ZXh0KTsKLQotYWNwaV9zdGF0dXMgYWNwaV91dF92YWxpZGF0ZV9yZXNvdXJjZSh2b2lkICphbWwsIHU4ICogcmV0dXJuX2luZGV4KTsKLQotdTMyIGFjcGlfdXRfZ2V0X2Rlc2NyaXB0b3JfbGVuZ3RoKHZvaWQgKmFtbCk7Ci0KLXUxNiBhY3BpX3V0X2dldF9yZXNvdXJjZV9sZW5ndGgodm9pZCAqYW1sKTsKLQotdTggYWNwaV91dF9nZXRfcmVzb3VyY2VfaGVhZGVyX2xlbmd0aCh2b2lkICphbWwpOwotCi11OCBhY3BpX3V0X2dldF9yZXNvdXJjZV90eXBlKHZvaWQgKmFtbCk7Ci0KLWFjcGlfc3RhdHVzCi1hY3BpX3V0X2dldF9yZXNvdXJjZV9lbmRfdGFnKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjLAotCQkJICAgICB1OCAqKiBlbmRfdGFnKTsKLQotLyoKLSAqIHV0bXV0ZXggLSBtdXRleCBzdXBwb3J0Ci0gKi8KLWFjcGlfc3RhdHVzIGFjcGlfdXRfbXV0ZXhfaW5pdGlhbGl6ZSh2b2lkKTsKLQotdm9pZCBhY3BpX3V0X211dGV4X3Rlcm1pbmF0ZSh2b2lkKTsKLQotYWNwaV9zdGF0dXMgYWNwaV91dF9hY3F1aXJlX211dGV4KGFjcGlfbXV0ZXhfaGFuZGxlIG11dGV4X2lkKTsKLQotYWNwaV9zdGF0dXMgYWNwaV91dF9yZWxlYXNlX211dGV4KGFjcGlfbXV0ZXhfaGFuZGxlIG11dGV4X2lkKTsKLQotLyoKLSAqIHV0YWxsb2MgLSBtZW1vcnkgYWxsb2NhdGlvbiBhbmQgb2JqZWN0IGNhY2hpbmcKLSAqLwotYWNwaV9zdGF0dXMgYWNwaV91dF9jcmVhdGVfY2FjaGVzKHZvaWQpOwotCi1hY3BpX3N0YXR1cyBhY3BpX3V0X2RlbGV0ZV9jYWNoZXModm9pZCk7Ci0KLWFjcGlfc3RhdHVzIGFjcGlfdXRfdmFsaWRhdGVfYnVmZmVyKHN0cnVjdCBhY3BpX2J1ZmZlciAqYnVmZmVyKTsKLQotYWNwaV9zdGF0dXMKLWFjcGlfdXRfaW5pdGlhbGl6ZV9idWZmZXIoc3RydWN0IGFjcGlfYnVmZmVyICpidWZmZXIsCi0JCQkgIGFjcGlfc2l6ZSByZXF1aXJlZF9sZW5ndGgpOwotCi12b2lkICphY3BpX3V0X2FsbG9jYXRlKGFjcGlfc2l6ZSBzaXplLAotCQkgICAgICAgdTMyIGNvbXBvbmVudCwgY29uc3QgY2hhciAqbW9kdWxlLCB1MzIgbGluZSk7Ci0KLXZvaWQgKmFjcGlfdXRfYWxsb2NhdGVfemVyb2VkKGFjcGlfc2l6ZSBzaXplLAotCQkJICAgICAgdTMyIGNvbXBvbmVudCwgY29uc3QgY2hhciAqbW9kdWxlLCB1MzIgbGluZSk7Ci0KLSNpZmRlZiBBQ1BJX0RCR19UUkFDS19BTExPQ0FUSU9OUwotdm9pZCAqYWNwaV91dF9hbGxvY2F0ZV9hbmRfdHJhY2soYWNwaV9zaXplIHNpemUsCi0JCQkJIHUzMiBjb21wb25lbnQsIGNvbnN0IGNoYXIgKm1vZHVsZSwgdTMyIGxpbmUpOwotCi12b2lkICphY3BpX3V0X2FsbG9jYXRlX3plcm9lZF9hbmRfdHJhY2soYWNwaV9zaXplIHNpemUsCi0JCQkJCXUzMiBjb21wb25lbnQsCi0JCQkJCWNvbnN0IGNoYXIgKm1vZHVsZSwgdTMyIGxpbmUpOwotCi12b2lkCi1hY3BpX3V0X2ZyZWVfYW5kX3RyYWNrKHZvaWQgKmFkZHJlc3MsCi0JCSAgICAgICB1MzIgY29tcG9uZW50LCBjb25zdCBjaGFyICptb2R1bGUsIHUzMiBsaW5lKTsKLQotI2lmZGVmCUFDUElfRlVUVVJFX1VTQUdFCi12b2lkIGFjcGlfdXRfZHVtcF9hbGxvY2F0aW9uX2luZm8odm9pZCk7Ci0jZW5kaWYJCQkJLyogQUNQSV9GVVRVUkVfVVNBR0UgKi8KLQotdm9pZCBhY3BpX3V0X2R1bXBfYWxsb2NhdGlvbnModTMyIGNvbXBvbmVudCwgY29uc3QgY2hhciAqbW9kdWxlKTsKLQotYWNwaV9zdGF0dXMKLWFjcGlfdXRfY3JlYXRlX2xpc3QoY2hhciAqbGlzdF9uYW1lLAotCQkgICAgdTE2IG9iamVjdF9zaXplLCBzdHJ1Y3QgYWNwaV9tZW1vcnlfbGlzdCAqKnJldHVybl9jYWNoZSk7Ci0KLSNlbmRpZgotCi0jZW5kaWYJCQkJLyogX0FDVVRJTFNfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL3BsYXRmb3JtL2FjZW52LmggYi9pbmNsdWRlL2FjcGkvcGxhdGZvcm0vYWNlbnYuaAppbmRleCBmY2QyNTcyLi5lNjJmMTBkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FjcGkvcGxhdGZvcm0vYWNlbnYuaAorKysgYi9pbmNsdWRlL2FjcGkvcGxhdGZvcm0vYWNlbnYuaApAQCAtNDQsMTQgKzQ0LDI2IEBACiAjaWZuZGVmIF9fQUNFTlZfSF9fCiAjZGVmaW5lIF9fQUNFTlZfSF9fCiAKLS8qCisvKiBUeXBlcyBmb3IgQUNQSV9NVVRFWF9UWVBFICovCisKKyNkZWZpbmUgQUNQSV9CSU5BUllfU0VNQVBIT1JFICAgICAgIDAKKyNkZWZpbmUgQUNQSV9PU0xfTVVURVggICAgICAgICAgICAgIDEKKworLyogVHlwZXMgZm9yIERFQlVHR0VSX1RIUkVBRElORyAqLworCisjZGVmaW5lIERFQlVHR0VSX1NJTkdMRV9USFJFQURFRCAgICAwCisjZGVmaW5lIERFQlVHR0VSX01VTFRJX1RIUkVBREVEICAgICAxCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCiAgKiBDb25maWd1cmF0aW9uIGZvciBBQ1BJIHRvb2xzIGFuZCB1dGlsaXRpZXMKLSAqLworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogI2lmZGVmIEFDUElfTElCUkFSWQogLyoKICAqIE5vdGU6IFRoZSBub24tZGVidWcgdmVyc2lvbiBvZiB0aGUgYWNwaV9saWJyYXJ5IGRvZXMgbm90IGNvbnRhaW4gYW55Ci0gKiBkZWJ1ZyBzdXBwb3J0LCBmb3IgbWluaW1pbWFsIHNpemUuIFRoZSBkZWJ1ZyB2ZXJzaW9uIHVzZXMgQUNQSV9GVUxMX0RFQlVHCisgKiBkZWJ1ZyBzdXBwb3J0LCBmb3IgbWluaW1hbCBzaXplLiBUaGUgZGVidWcgdmVyc2lvbiB1c2VzIEFDUElfRlVMTF9ERUJVRwogICovCiAjZGVmaW5lIEFDUElfVVNFX0xPQ0FMX0NBQ0hFCiAjZW5kaWYKQEAgLTc1LDE3ICs4Nyw2IEBACiAjZGVmaW5lIEFDUElfREJHX1RSQUNLX0FMTE9DQVRJT05TCiAjZW5kaWYKIAotI2lmZGVmIEFDUElfREFTTV9BUFAKLSNpZm5kZWYgTVNET1MKLSNkZWZpbmUgQUNQSV9ERUJVR19PVVRQVVQKLSNlbmRpZgotI2RlZmluZSBBQ1BJX0FQUExJQ0FUSU9OCi0jZGVmaW5lIEFDUElfRElTQVNTRU1CTEVSCi0jZGVmaW5lIEFDUElfTk9fTUVUSE9EX0VYRUNVVElPTgotI2RlZmluZSBBQ1BJX0xBUkdFX05BTUVTUEFDRV9OT0RFCi0jZGVmaW5lIEFDUElfREFUQV9UQUJMRV9ESVNBU1NFTUJMWQotI2VuZGlmCi0KICNpZmRlZiBBQ1BJX0FQUExJQ0FUSU9OCiAjZGVmaW5lIEFDUElfVVNFX1NZU1RFTV9DTElCUkFSWQogI2RlZmluZSBBQ1BJX1VTRV9MT0NBTF9DQUNIRQpAQCAtMTc5LDYgKzE4MCwxOSBAQAogCiAvKiEgW0VuZF0gbm8gc291cmNlIGNvZGUgdHJhbnNsYXRpb24gISovCiAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBNaXNjZWxsYW5lb3VzIGNvbmZpZ3VyYXRpb24KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBBcmUgbXV0ZXhlcyBzdXBwb3J0ZWQgYnkgdGhlIGhvc3Q/IGRlZmF1bHQgaXMgbm8sIHVzZSBiaW5hcnkgc2VtYXBob3Jlcy4KKyAqLworI2lmbmRlZiBBQ1BJX01VVEVYX1RZUEUKKyNkZWZpbmUgQUNQSV9NVVRFWF9UWVBFICAgICAgICAgICAgIEFDUElfQklOQVJZX1NFTUFQSE9SRQorI2VuZGlmCisKIC8qCiAgKiBEZWJ1Z2dlciB0aHJlYWRpbmcgbW9kZWwKICAqIFVzZSBzaW5nbGUgdGhyZWFkZWQgaWYgdGhlIGVudGlyZSBzdWJzeXN0ZW0gaXMgY29udGFpbmVkIGluIGFuIGFwcGxpY2F0aW9uCkBAIC0xODcsOSArMjAxLDYgQEAKICAqIEJ5IGRlZmF1bHQgdGhlIG1vZGVsIGlzIHNpbmdsZSB0aHJlYWRlZCBpZiBBQ1BJX0FQUExJQ0FUSU9OIGlzIHNldCwKICAqIG11bHRpLXRocmVhZGVkIGlmIEFDUElfQVBQTElDQVRJT04gaXMgbm90IHNldC4KICAqLwotI2RlZmluZSBERUJVR0dFUl9TSU5HTEVfVEhSRUFERUQgICAgMAotI2RlZmluZSBERUJVR0dFUl9NVUxUSV9USFJFQURFRCAgICAgMQotCiAjaWZuZGVmIERFQlVHR0VSX1RIUkVBRElORwogI2lmZGVmIEFDUElfQVBQTElDQVRJT04KICNkZWZpbmUgREVCVUdHRVJfVEhSRUFESU5HICAgICAgICAgIERFQlVHR0VSX1NJTkdMRV9USFJFQURFRApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL3BsYXRmb3JtL2FjbGludXguaCBiL2luY2x1ZGUvYWNwaS9wbGF0Zm9ybS9hY2xpbnV4LmgKaW5kZXggMDUxNWU3NS4uNmQ0OWIyYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL3BsYXRmb3JtL2FjbGludXguaAorKysgYi9pbmNsdWRlL2FjcGkvcGxhdGZvcm0vYWNsaW51eC5oCkBAIC00Niw2ICs0Niw3IEBACiAKICNkZWZpbmUgQUNQSV9VU0VfU1lTVEVNX0NMSUJSQVJZCiAjZGVmaW5lIEFDUElfVVNFX0RPX1dISUxFXzAKKyNkZWZpbmUgQUNQSV9NVVRFWF9UWVBFICAgICAgICAgICAgIEFDUElfQklOQVJZX1NFTUFQSE9SRQogCiAjaWZkZWYgX19LRVJORUxfXwogCkBAIC03MCw5ICs3MSw2IEBACiAjZGVmaW5lIEFDUElfRVhQT1JUX1NZTUJPTChzeW1ib2wpICBFWFBPUlRfU1lNQk9MKHN5bWJvbCk7CiAjZGVmaW5lIHN0cnRvdWwgICAgICAgICAgICAgICAgICAgICBzaW1wbGVfc3RydG91bAogCi0vKiBGdWxsIG5hbWVzcGFjZSBwYXRobmFtZSBsZW5ndGggbGltaXQgLSBhcmJpdHJhcnkgKi8KLSNkZWZpbmUgQUNQSV9QQVRITkFNRV9NQVggICAgICAgICAgICAgIDI1NgotCiAjZWxzZQkJCQkvKiAhX19LRVJORUxfXyAqLwogCiAjaW5jbHVkZSA8c3RkYXJnLmg+CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1mcnYvS2J1aWxkIGIvaW5jbHVkZS9hc20tZnJ2L0tidWlsZAppbmRleCAxZjQ0ZTdjLi4wZjg5NTZkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1mcnYvS2J1aWxkCisrKyBiL2luY2x1ZGUvYXNtLWZydi9LYnVpbGQKQEAgLTMsNCArMywzIEBACiBoZWFkZXIteSArPSByZWdpc3RlcnMuaAogCiB1bmlmZGVmLXkgKz0gdGVybWlvcy5oCi11bmlmZGVmLXkgKz0gc3dhYi5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1mcnYvYnl0ZW9yZGVyLmggYi9pbmNsdWRlL2FzbS1mcnYvYnl0ZW9yZGVyLmgKaW5kZXggMTE4N2U1MS4uZjI5Yjc1OSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tZnJ2L2J5dGVvcmRlci5oCisrKyBiL2luY2x1ZGUvYXNtLWZydi9ieXRlb3JkZXIuaApAQCAtMSw3ICsxLDYgQEAKICNpZm5kZWYgX0FTTV9CWVRFT1JERVJfSAogI2RlZmluZSBfQVNNX0JZVEVPUkRFUl9ICiAKLSNpbmNsdWRlIDxhc20vc3dhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2J5dGVvcmRlci9iaWdfZW5kaWFuLmg+CiAKICNlbmRpZiAvKiBfQVNNX0JZVEVPUkRFUl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1mcnYvbW11LmggYi9pbmNsdWRlL2FzbS1mcnYvbW11LmgKaW5kZXggMjJjMDM3MS4uODZjYTBlOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tZnJ2L21tdS5oCisrKyBiL2luY2x1ZGUvYXNtLWZydi9tbXUuaApAQCAtMjIsNyArMjIsNiBAQAogCXVuc2lnbmVkIGxvbmcJZHRsYl9wdGRfbWFwcGluZzsJLyogW0RBTVI1XSBQVEQgbWFwcGluZyBmb3IgZHRsYiBjYWNoZWQgUEdFICovCiAKICNlbHNlCi0Jc3RydWN0IHZtX2xpc3Rfc3RydWN0CSp2bWxpc3Q7CiAJdW5zaWduZWQgbG9uZwkJZW5kX2JyazsKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1nZW5lcmljL0tidWlsZC5hc20gYi9pbmNsdWRlL2FzbS1nZW5lcmljL0tidWlsZC5hc20KaW5kZXggMTg3MGQ1ZS4uNzBkMTg1NSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tZ2VuZXJpYy9LYnVpbGQuYXNtCisrKyBiL2luY2x1ZGUvYXNtLWdlbmVyaWMvS2J1aWxkLmFzbQpAQCAtMzEsNiArMzEsNyBAQAogdW5pZmRlZi15ICs9IHNvY2tpb3MuaAogdW5pZmRlZi15ICs9IHN0YXQuaAogdW5pZmRlZi15ICs9IHN0YXRmcy5oCit1bmlmZGVmLXkgKz0gc3dhYi5oCiB1bmlmZGVmLXkgKz0gdGVybWJpdHMuaAogdW5pZmRlZi15ICs9IHRlcm1pb3MuaAogdW5pZmRlZi15ICs9IHR5cGVzLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWdlbmVyaWMvcGd0YWJsZS5oIGIvaW5jbHVkZS9hc20tZ2VuZXJpYy9wZ3RhYmxlLmgKaW5kZXggNzJlYmU5MS4uOGU2ZDBjYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tZ2VuZXJpYy9wZ3RhYmxlLmgKKysrIGIvaW5jbHVkZS9hc20tZ2VuZXJpYy9wZ3RhYmxlLmgKQEAgLTMwMSw3ICszMDEsNyBAQAogICogdHJhY2tfcGZuX3ZtYV9uZXcgaXMgY2FsbGVkIHdoZW4gYSBfbmV3XyBwZm4gbWFwcGluZyBpcyBiZWluZyBlc3RhYmxpc2hlZAogICogZm9yIHBoeXNpY2FsIHJhbmdlIGluZGljYXRlZCBieSBwZm4gYW5kIHNpemUuCiAgKi8KLXN0YXRpYyBpbmxpbmUgaW50IHRyYWNrX3Bmbl92bWFfbmV3KHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCBwZ3Byb3RfdCBwcm90LAorc3RhdGljIGlubGluZSBpbnQgdHJhY2tfcGZuX3ZtYV9uZXcoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHBncHJvdF90ICpwcm90LAogCQkJCQl1bnNpZ25lZCBsb25nIHBmbiwgdW5zaWduZWQgbG9uZyBzaXplKQogewogCXJldHVybiAwOwpAQCAtMzMyLDcgKzMzMiw3IEBACiB7CiB9CiAjZWxzZQotZXh0ZXJuIGludCB0cmFja19wZm5fdm1hX25ldyhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgcGdwcm90X3QgcHJvdCwKK2V4dGVybiBpbnQgdHJhY2tfcGZuX3ZtYV9uZXcoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHBncHJvdF90ICpwcm90LAogCQkJCXVuc2lnbmVkIGxvbmcgcGZuLCB1bnNpZ25lZCBsb25nIHNpemUpOwogZXh0ZXJuIGludCB0cmFja19wZm5fdm1hX2NvcHkoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpOwogZXh0ZXJuIHZvaWQgdW50cmFja19wZm5fdm1hKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIHBmbiwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWdlbmVyaWMvcnRjLmggYi9pbmNsdWRlL2FzbS1nZW5lcmljL3J0Yy5oCmluZGV4IDg5MDYxYzEuLjc2M2UzYjAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWdlbmVyaWMvcnRjLmgKKysrIGIvaW5jbHVkZS9hc20tZ2VuZXJpYy9ydGMuaApAQCAtNDIsNyArNDIsNyBAQAogCXJldHVybiB1aXA7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGdldF9ydGNfdGltZShzdHJ1Y3QgcnRjX3RpbWUgKnRpbWUpCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBfX2dldF9ydGNfdGltZShzdHJ1Y3QgcnRjX3RpbWUgKnRpbWUpCiB7CiAJdW5zaWduZWQgY2hhciBjdHJsOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CkBAIC0xMDgsOCArMTA4LDEyIEBACiAJcmV0dXJuIFJUQ18yNEg7CiB9CiAKKyNpZm5kZWYgZ2V0X3J0Y190aW1lCisjZGVmaW5lIGdldF9ydGNfdGltZQlfX2dldF9ydGNfdGltZQorI2VuZGlmCisKIC8qIFNldCB0aGUgY3VycmVudCBkYXRlIGFuZCB0aW1lIGluIHRoZSByZWFsIHRpbWUgY2xvY2suICovCi1zdGF0aWMgaW5saW5lIGludCBzZXRfcnRjX3RpbWUoc3RydWN0IHJ0Y190aW1lICp0aW1lKQorc3RhdGljIGlubGluZSBpbnQgX19zZXRfcnRjX3RpbWUoc3RydWN0IHJ0Y190aW1lICp0aW1lKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdW5zaWduZWQgY2hhciBtb24sIGRheSwgaHJzLCBtaW4sIHNlYzsKQEAgLTE5MCwxMSArMTk0LDE1IEBACiAJcmV0dXJuIDA7CiB9CiAKKyNpZm5kZWYgc2V0X3J0Y190aW1lCisjZGVmaW5lIHNldF9ydGNfdGltZQlfX3NldF9ydGNfdGltZQorI2VuZGlmCisKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGdldF9ydGNfc3Modm9pZCkKIHsKIAlzdHJ1Y3QgcnRjX3RpbWUgaDsKIAotCWdldF9ydGNfdGltZSgmaCk7CisJX19nZXRfcnRjX3RpbWUoJmgpOwogCXJldHVybiBoLnRtX3NlYzsKIH0KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbTMyci9LYnVpbGQgYi9pbmNsdWRlL2FzbS1tMzJyL0tidWlsZAppbmRleCAyN2IxMDhhLi5jNjhlMTY4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1tMzJyL0tidWlsZAorKysgYi9pbmNsdWRlL2FzbS1tMzJyL0tidWlsZApAQCAtMSwyICsxIEBACiBpbmNsdWRlIGluY2x1ZGUvYXNtLWdlbmVyaWMvS2J1aWxkLmFzbQotdW5pZmRlZi15ICs9IHN3YWIuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbTMyci9ieXRlb3JkZXIuaCBiL2luY2x1ZGUvYXNtLW0zMnIvYnl0ZW9yZGVyLmgKaW5kZXggNjFmZjljZi4uMjE4NTVkOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbTMyci9ieXRlb3JkZXIuaAorKysgYi9pbmNsdWRlL2FzbS1tMzJyL2J5dGVvcmRlci5oCkBAIC0xLDggKzEsNiBAQAogI2lmbmRlZiBfQVNNX00zMlJfQllURU9SREVSX0gKICNkZWZpbmUgX0FTTV9NMzJSX0JZVEVPUkRFUl9ICiAKLSNpbmNsdWRlIDxhc20vc3dhYi5oPgotCiAjaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU5fXykKICMgIGluY2x1ZGUgPGxpbnV4L2J5dGVvcmRlci9saXR0bGVfZW5kaWFuLmg+CiAjZWxzZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbTMyci9tbXUuaCBiL2luY2x1ZGUvYXNtLW0zMnIvbW11LmgKaW5kZXggZDliZDcyNC4uMTUwY2I5MiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbTMyci9tbXUuaAorKysgYi9pbmNsdWRlL2FzbS1tMzJyL21tdS5oCkBAIC00LDcgKzQsNiBAQAogI2lmICFkZWZpbmVkKENPTkZJR19NTVUpCiAKIHR5cGVkZWYgc3RydWN0IHsKLQlzdHJ1Y3Qgdm1fbGlzdF9zdHJ1Y3QJKnZtbGlzdDsKIAl1bnNpZ25lZCBsb25nCQllbmRfYnJrOwogfSBtbV9jb250ZXh0X3Q7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW02OGsvS2J1aWxkIGIvaW5jbHVkZS9hc20tbTY4ay9LYnVpbGQKaW5kZXggNTJmZDk2Yi4uMWE5MjJmYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbTY4ay9LYnVpbGQKKysrIGIvaW5jbHVkZS9hc20tbTY4ay9LYnVpbGQKQEAgLTEsMyArMSwyIEBACiBpbmNsdWRlIGluY2x1ZGUvYXNtLWdlbmVyaWMvS2J1aWxkLmFzbQogaGVhZGVyLXkgKz0gY2FjaGVjdGwuaAotdW5pZmRlZi15ICs9IHN3YWIuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbTY4ay9ieXRlb3JkZXIuaCBiL2luY2x1ZGUvYXNtLW02OGsvYnl0ZW9yZGVyLmgKaW5kZXggMzAwODY2NS4uMzFiMjYwYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbTY4ay9ieXRlb3JkZXIuaAorKysgYi9pbmNsdWRlL2FzbS1tNjhrL2J5dGVvcmRlci5oCkBAIC0xLDcgKzEsNiBAQAogI2lmbmRlZiBfTTY4S19CWVRFT1JERVJfSAogI2RlZmluZSBfTTY4S19CWVRFT1JERVJfSAogCi0jaW5jbHVkZSA8YXNtL3N3YWIuaD4KICNpbmNsdWRlIDxsaW51eC9ieXRlb3JkZXIvYmlnX2VuZGlhbi5oPgogCiAjZW5kaWYgLyogX002OEtfQllURU9SREVSX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW02OGsvdW5pc3RkLmggYi9pbmNsdWRlL2FzbS1tNjhrL3VuaXN0ZC5oCmluZGV4IDk2NWFiYjguLjNjMTkwMjcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW02OGsvdW5pc3RkLmgKKysrIGIvaW5jbHVkZS9hc20tbTY4ay91bmlzdGQuaApAQCAtNSw2ICs1LDcgQEAKICAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgc3lzdGVtIGNhbGwgbnVtYmVycy4KICAqLwogCisjZGVmaW5lIF9fTlJfcmVzdGFydF9zeXNjYWxsCSAgMAogI2RlZmluZSBfX05SX2V4aXQJCSAgMQogI2RlZmluZSBfX05SX2ZvcmsJCSAgMgogI2RlZmluZSBfX05SX3JlYWQJCSAgMwpAQCAtMzU5LDkgKzM2MCw2IEBACiAjZGVmaW5lIF9fQVJDSF9XQU5UX1NZU19TSUdQUk9DTUFTSwogI2RlZmluZSBfX0FSQ0hfV0FOVF9TWVNfUlRfU0lHQUNUSU9OCiAKLS8qIHdoaXRlbGlzdCBmb3IgY2hlY2tzeXNjYWxscyAqLwotI2RlZmluZSBfX0lHTk9SRV9yZXN0YXJ0X3N5c2NhbGwKLQogLyoKICAqICJDb25kaXRpb25hbCIgc3lzY2FsbHMKICAqCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tbjEwMzAwL0tidWlsZCBiL2luY2x1ZGUvYXNtLW1uMTAzMDAvS2J1aWxkCmluZGV4IDI3YjEwOGEuLmM2OGUxNjggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW1uMTAzMDAvS2J1aWxkCisrKyBiL2luY2x1ZGUvYXNtLW1uMTAzMDAvS2J1aWxkCkBAIC0xLDIgKzEgQEAKIGluY2x1ZGUgaW5jbHVkZS9hc20tZ2VuZXJpYy9LYnVpbGQuYXNtCi11bmlmZGVmLXkgKz0gc3dhYi5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tbjEwMzAwL2J5dGVvcmRlci5oIGIvaW5jbHVkZS9hc20tbW4xMDMwMC9ieXRlb3JkZXIuaAppbmRleCA0NWIxOGRlLi41ZGQwYmRkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1tbjEwMzAwL2J5dGVvcmRlci5oCisrKyBiL2luY2x1ZGUvYXNtLW1uMTAzMDAvYnl0ZW9yZGVyLmgKQEAgLTEsNyArMSw2IEBACiAjaWZuZGVmIF9BU01fQllURU9SREVSX0gKICNkZWZpbmUgX0FTTV9CWVRFT1JERVJfSAogCi0jaW5jbHVkZSA8YXNtL3N3YWIuaD4KICNpbmNsdWRlIDxsaW51eC9ieXRlb3JkZXIvbGl0dGxlX2VuZGlhbi5oPgogCiAjZW5kaWYgLyogX0FTTV9CWVRFT1JERVJfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL2FzbW1hY3JvLmggYi9pbmNsdWRlL2FzbS14dGVuc2EvYXNtbWFjcm8uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzY5MTVjYS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FzbS14dGVuc2EvYXNtbWFjcm8uaAorKysgL2Rldi9udWxsCkBAIC0xLDE1MyArMCwwIEBACi0vKgotICogaW5jbHVkZS9hc20teHRlbnNhL2FzbW1hY3JvLmgKLSAqCi0gKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQotICogZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDUgVGVuc2lsaWNhIEluYy4KLSAqLwotCi0jaWZuZGVmIF9YVEVOU0FfQVNNTUFDUk9fSAotI2RlZmluZSBfWFRFTlNBX0FTTU1BQ1JPX0gKLQotI2luY2x1ZGUgPGFzbS92YXJpYW50L2NvcmUuaD4KLQotLyoKLSAqIFNvbWUgbGl0dGxlIGhlbHBlcnMgZm9yIGxvb3BzLiBVc2UgemVyby1vdmVyaGVhZC1sb29wcwotICogd2hlcmUgYXBwbGljYWJsZSBhbmQgaWYgc3VwcG9ydGVkIGJ5IHRoZSBwcm9jZXNzb3IuCi0gKgotICogX19sb29waSBhciwgYXQsIHNpemUsIGluYwotICogICAgICAgICBhcglyZWdpc3RlciBpbml0aWFsaXplZCB3aXRoIHRoZSBzdGFydCBhZGRyZXNzCi0gKgkgICBhdAlzY3JhdGNoIHJlZ2lzdGVyIHVzZWQgYnkgbWFjcm8KLSAqCSAgIHNpemUJc2l6ZSBpbW1lZGlhdGUgdmFsdWUKLSAqCSAgIGluYwlpbmNyZW1lbnQKLSAqCi0gKiBfX2xvb3BzIGFyLCBhcywgYXQsIGluY19sb2cyWywgbWFza19sb2cyXVssIGNvbmRdWywgbmNvbmRdCi0gKgkgICBhcglyZWdpc3RlciBpbml0aWFsaXplZCB3aXRoIHRoZSBzdGFydCBhZGRyZXNzCi0gKgkgICBhcwlyZWdpc3RlciBpbml0aWFsaXplZCB3aXRoIHRoZSBzaXplCi0gKgkgICBhdAlzY3JhdGNoIHJlZ2lzdGVyIHVzZSBieSBtYWNybwotICoJICAgaW5jX2xvZzIJaW5jcmVtZW50IFtpbiBsb2cyXQotICoJICAgbWFza19sb2cyCW1hc2sgW2luIGxvZzJdCi0gKgkgICBjb25kCQl0cnVlIGNvbmRpdGlvbiAodXNlZCBpbiBsb29wJ2NvbmQnKQotICoJICAgbmNvbmQJZmFsc2UgY29uZGl0aW9uICh1c2VkIGluIGInbmNvbmQnKQotICoKLSAqIF9fbG9vcCAgYXMKLSAqCSAgIHJlc3RhcnQgbG9vcC4gJ2FzJyByZWdpc3RlciBtdXN0IG5vdCBoYXZlIGJlZW4gbW9kaWZpZWQhCi0gKgotICogX19lbmRsYSBhciwgYXQsIGluY3IKLSAqCSAgIGFyCXN0YXJ0IGFkZHJlc3MgKG1vZGlmaWVkKQotICoJICAgYXMJc2NyYXRjaCByZWdpc3RlciB1c2VkIGJ5IG1hY3JvCi0gKgkgICBpbmMJaW5jcmVtZW50Ci0gKi8KLQotLyoKLSAqIGxvb3AgZm9yIGdpdmVuIHNpemUgYXMgaW1tZWRpYXRlCi0gKi8KLQotCS5tYWNybwlfX2xvb3BpIGFyLCBhdCwgc2l6ZSwgaW5jcgotCi0jaWYgWENIQUxfSEFWRV9MT09QUwotCQltb3ZpCVxhdCwgKChcc2l6ZSArIFxpbmNyIC0gMSkgLyAoXGluY3IpKQotCQlsb29wCVxhdCwgOTlmCi0jZWxzZQotCQlhZGRpCVxhdCwgXGFyLCBcc2l6ZQotCQk5ODoKLSNlbmRpZgotCi0JLmVuZG0KLQotLyoKLSAqIGxvb3AgZm9yIGdpdmVuIHNpemUgaW4gcmVnaXN0ZXIKLSAqLwotCi0JLm1hY3JvCV9fbG9vcHMJYXIsIGFzLCBhdCwgaW5jcl9sb2cyLCBtYXNrX2xvZzIsIGNvbmQsIG5jb25kCi0KLSNpZiBYQ0hBTF9IQVZFX0xPT1BTCi0JCS5pZmd0IFxpbmNyX2xvZzIgLSAxCi0JCQlhZGRpCVxhdCwgXGFzLCAoMSA8PCBcaW5jcl9sb2cyKSAtIDEKLQkJCS5pZm5jIFxtYXNrX2xvZzIsCi0JCQkJZXh0dWkJXGF0LCBcYXQsIFxpbmNyX2xvZzIsIFxtYXNrX2xvZzIKLQkJCS5lbHNlCi0JCQkJc3JsaQlcYXQsIFxhdCwgXGluY3JfbG9nMgotCQkJLmVuZGlmCi0JCS5lbmRpZgotCQlsb29wXGNvbmQJXGF0LCA5OWYKLSNlbHNlCi0JCS5pZm5jIFxtYXNrX2xvZzIsCi0JCQlleHR1aQlcYXQsIFxhcywgXGluY3JfbG9nMiwgXG1hc2tfbG9nMgotCQkuZWxzZQotCQkJLmlmbmMgXG5jb25kLAotCQkJCXNybGkJXGF0LCBcYXMsIFxpbmNyX2xvZzIKLQkJCS5lbmRpZgotCQkuZW5kaWYKLQkJLmlmbmMgXG5jb25kLAotCQkJYlxuY29uZAlcYXQsIDk5ZgotCi0JCS5lbmRpZgotCQkuaWZuYyBcbWFza19sb2cyLAotCQkJc2xsaQlcYXQsIFxhdCwgXGluY3JfbG9nMgotCQkJYWRkCVxhdCwgXGFyLCBcYXQKLQkJLmVsc2UKLQkJCWFkZAlcYXQsIFxhciwgXGFzCi0JCS5lbmRpZgotI2VuZGlmCi0JCTk4OgotCi0JLmVuZG0KLQotLyoKLSAqIGxvb3AgZnJvbSBhciB0byBheAotICovCi0KLQkubWFjcm8JX19sb29wdAlhciwgYXMsIGF0LCBpbmNyX2xvZzIKLQotI2lmIFhDSEFMX0hBVkVfTE9PUFMKLQkJc3ViCVxhdCwgXGFzLCBcYXIKLQkJLmlmZ3QJXGluY3JfbG9nMiAtIDEKLQkJCWFkZGkJXGF0LCBcYXQsICgxIDw8IFxpbmNyX2xvZzIpIC0gMQotCQkJc3JsaQlcYXQsIFxhdCwgXGluY3JfbG9nMgotCQkuZW5kaWYKLQkJbG9vcAlcYXQsIDk5ZgotI2Vsc2UKLQkJOTg6Ci0jZW5kaWYKLQotCS5lbmRtCi0KLS8qCi0gKiByZXN0YXJ0IGxvb3AuIHJlZ2lzdGVycyBtdXN0IGJlIHVuY2hhbmdlZAotICovCi0KLQkubWFjcm8JX19sb29wCWFzCi0KLSNpZiBYQ0hBTF9IQVZFX0xPT1BTCi0JCWxvb3AJXGFzLCA5OWYKLSNlbHNlCi0JCTk4OgotI2VuZGlmCi0KLQkuZW5kbQotCi0vKgotICogZW5kIG9mIGxvb3Agd2l0aCBubyBpbmNyZW1lbnQgb2YgdGhlIGFkZHJlc3MuCi0gKi8KLQotCS5tYWNybwlfX2VuZGwJYXIsIGFzCi0jaWYgIVhDSEFMX0hBVkVfTE9PUFMKLQkJYmx0dQlcYXIsIFxhcywgOThiCi0jZW5kaWYKLQkJOTk6Ci0JLmVuZG0KLQotLyoKLSAqIGVuZCBvZiBsb29wIHdpdGggaW5jcmVtZW50IG9mIHRoZSBhZGRyZXNzLgotICovCi0KLQkubWFjcm8JX19lbmRsYQlhciwgYXMsIGluY3IKLQkJYWRkaQlcYXIsIFxhciwgXGluY3IKLQkJX19lbmRsCVxhciBcYXMKLQkuZW5kbQotCi0KLSNlbmRpZiAvKiBfWFRFTlNBX0FTTU1BQ1JPX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9ieXRlb3JkZXIuaCBiL2luY2x1ZGUvYXNtLXh0ZW5zYS9ieXRlb3JkZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzY1ZWRmMS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FzbS14dGVuc2EvYnl0ZW9yZGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKgotICogaW5jbHVkZS9hc20teHRlbnNhL2J5dGVvcmRlci5oCi0gKgotICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKLSAqIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDAxIC0gMjAwNSBUZW5zaWxpY2EgSW5jLgotICovCi0KLSNpZm5kZWYgX1hURU5TQV9CWVRFT1JERVJfSAotI2RlZmluZSBfWFRFTlNBX0JZVEVPUkRFUl9ICi0KLSNpbmNsdWRlIDxhc20vdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgotCi1zdGF0aWMgX19pbmxpbmVfXyBfX2F0dHJpYnV0ZV9jb25zdF9fIF9fdTMyIF9fX2FyY2hfX3N3YWIzMihfX3UzMiB4KQotewotICAgIF9fdTMyIHJlczsKLSAgICAvKiBpbnN0cnVjdGlvbiBzZXF1ZW5jZSBmcm9tIFh0ZW5zYSBJU0EgcmVsZWFzZSAyLzIwMDAgKi8KLSAgICBfX2FzbV9fKCJzc2FpICAgICA4ICAgICAgICAgICBcblx0IgotCSAgICAic3JsaSAgICAgJTAsICUxLCAxNiAgXG5cdCIKLQkgICAgInNyYyAgICAgICUwLCAlMCwgJTEgIFxuXHQiCi0JICAgICJzcmMgICAgICAlMCwgJTAsICUwICBcblx0IgotCSAgICAic3JjICAgICAgJTAsICUxLCAlMCAgXG4iCi0JICAgIDogIj0mYSIgKHJlcykKLQkgICAgOiAiYSIgKHgpCi0JICAgICk7Ci0gICAgcmV0dXJuIHJlczsKLX0KLQotc3RhdGljIF9faW5saW5lX18gX19hdHRyaWJ1dGVfY29uc3RfXyBfX3UxNiBfX19hcmNoX19zd2FiMTYoX191MTYgeCkKLXsKLSAgICAvKiBHaXZlbiB0aGF0ICdzaG9ydCcgdmFsdWVzIGFyZSBzaWduZWQgKGkuZS4sIGNhbiBiZSBuZWdhdGl2ZSksCi0gICAgICogd2UgY2Fubm90IGFzc3VtZSB0aGF0IHRoZSB1cHBlciAxNi1iaXRzIG9mIHRoZSByZWdpc3RlciBhcmUKLSAgICAgKiB6ZXJvLiAgV2UgYXJlIGNhcmVmdWwgdG8gbWFzayB2YWx1ZXMgYWZ0ZXIgc2hpZnRpbmcuCi0gICAgICovCi0KLSAgICAvKiBUaGVyZSBleGlzdHMgYW4gYW5vbWFseSBiZXR3ZWVuIHh0LWdjYyBhbmQgeHQteGNjLiAgeHQtZ2NjCi0gICAgICogaW5zZXJ0cyBhbiBleHR1aSBpbnN0cnVjdGlvbiBhZnRlciBwdXR0aW5nIHRoaXMgZnVuY3Rpb24gaW5saW5lCi0gICAgICogdG8gZW5zdXJlIHRoYXQgaXQgdXNlcyBvbmx5IHRoZSBsZWFzdC1zaWduaWZpY2FudCAxNiBiaXRzIG9mCi0gICAgICogdGhlIHJlc3VsdC4gIHh0LXhjYyBkb2Vzbid0IHVzZSBhbiBleHR1aSwgYnV0IGFzc3VtZXMgdGhlCi0gICAgICogX19hc21fXyBtYWNybyBmb2xsb3dzIGNvbnZlbnRpb24gdGhhdCB0aGUgdXBwZXIgMTYgYml0cyBvZiBhbgotICAgICAqICd1bnNpZ25lZCBzaG9ydCcgcmVzdWx0IGFyZSBzdGlsbCB6ZXJvLiAgVGhpcyBtYWNybyBkb2Vzbid0Ci0gICAgICogZm9sbG93IGNvbnZlbnRpb247IGluZGVlZCwgaXQgbGVhdmVzIGdhcmJhZ2UgaW4gdGhlIHVwcG9ydCAxNgotICAgICAqIGJpdHMgb2YgdGhlIHJlZ2lzdGVyLgotCi0gICAgICogRGVjbGFyaW5nIHRoZSB0ZW1wb3JhcnkgdmFyaWFibGVzICdyZXMnIGFuZCAndG1wJyB0byBiZSAzMi1iaXQKLSAgICAgKiB0eXBlcyB3aGlsZSB0aGUgcmV0dXJuIHR5cGUgb2YgdGhlIGZ1bmN0aW9uIGlzIGEgMTYtYml0IHR5cGUKLSAgICAgKiBmb3JjZXMgYm90aCBjb21waWxlcnMgdG8gaW5zZXJ0IGV4YWN0bHkgb25lIGV4dHVpIGluc3RydWN0aW9uCi0gICAgICogKG9yIGVxdWl2YWxlbnQpIHRvIG1hc2sgb2ZmIHRoZSB1cHBlciAxNiBiaXRzLiAqLwotCi0gICAgX191MzIgcmVzOwotICAgIF9fdTMyIHRtcDsKLQotICAgIF9fYXNtX18oImV4dHVpICAgICUxLCAlMiwgOCwgOFxuXHQiCi0JICAgICJzbGxpICAgICAlMCwgJTIsIDggICBcblx0IgotCSAgICAib3IgICAgICAgJTAsICUwLCAlMSAgXG4iCi0JICAgIDogIj0mYSIgKHJlcyksICI9JmEiICh0bXApCi0JICAgIDogImEiICh4KQotCSAgICApOwotCi0gICAgcmV0dXJuIHJlczsKLX0KLQotI2RlZmluZSBfX2FyY2hfX3N3YWIzMih4KSBfX19hcmNoX19zd2FiMzIoeCkKLSNkZWZpbmUgX19hcmNoX19zd2FiMTYoeCkgX19fYXJjaF9fc3dhYjE2KHgpCi0KLSNpZiAhZGVmaW5lZChfX1NUUklDVF9BTlNJX18pIHx8IGRlZmluZWQoX19LRVJORUxfXykKLSMgIGRlZmluZSBfX0JZVEVPUkRFUl9IQVNfVTY0X18KLSMgIGRlZmluZSBfX1NXQUJfNjRfVEhSVV8zMl9fCi0jZW5kaWYKLQotI2lmZGVmIF9fWFRFTlNBX0VMX18KLSMgaW5jbHVkZSA8bGludXgvYnl0ZW9yZGVyL2xpdHRsZV9lbmRpYW4uaD4KLSNlbGlmIGRlZmluZWQoX19YVEVOU0FfRUJfXykKLSMgaW5jbHVkZSA8bGludXgvYnl0ZW9yZGVyL2JpZ19lbmRpYW4uaD4KLSNlbHNlCi0jIGVycm9yIHByb2Nlc3NvciBieXRlIG9yZGVyIHVuZGVmaW5lZCEKLSNlbmRpZgotCi0jZW5kaWYgLyogX1hURU5TQV9CWVRFT1JERVJfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL2NhY2hlLmggYi9pbmNsdWRlL2FzbS14dGVuc2EvY2FjaGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2JiYTJhNS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FzbS14dGVuc2EvY2FjaGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qCi0gKiBpbmNsdWRlL2FzbS14dGVuc2EvY2FjaGUuaAotICoKLSAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCi0gKiBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIChDKSAyMDAxIC0gMjAwNSBUZW5zaWxpY2EgSW5jLgotICovCi0KLSNpZm5kZWYgX1hURU5TQV9DQUNIRV9ICi0jZGVmaW5lIF9YVEVOU0FfQ0FDSEVfSAotCi0jaW5jbHVkZSA8YXNtL3ZhcmlhbnQvY29yZS5oPgotCi0jZGVmaW5lIEwxX0NBQ0hFX1NISUZUCVhDSEFMX0RDQUNIRV9MSU5FV0lEVEgKLSNkZWZpbmUgTDFfQ0FDSEVfQllURVMJWENIQUxfRENBQ0hFX0xJTkVTSVpFCi0jZGVmaW5lIFNNUF9DQUNIRV9CWVRFUwlMMV9DQUNIRV9CWVRFUwotCi0jZGVmaW5lIERDQUNIRV9XQVlfU0laRQkoWENIQUxfRENBQ0hFX1NJWkUvWENIQUxfRENBQ0hFX1dBWVMpCi0jZGVmaW5lIElDQUNIRV9XQVlfU0laRQkoWENIQUxfSUNBQ0hFX1NJWkUvWENIQUxfSUNBQ0hFX1dBWVMpCi0jZGVmaW5lIERDQUNIRV9XQVlfU0hJRlQgKFhDSEFMX0RDQUNIRV9TRVRXSURUSCArIFhDSEFMX0RDQUNIRV9MSU5FV0lEVEgpCi0jZGVmaW5lIElDQUNIRV9XQVlfU0hJRlQgKFhDSEFMX0lDQUNIRV9TRVRXSURUSCArIFhDSEFMX0lDQUNIRV9MSU5FV0lEVEgpCi0KLS8qIE1heGltdW0gY2FjaGUgc2l6ZSBwZXIgd2F5LiAqLwotI2lmIERDQUNIRV9XQVlfU0laRSA+PSBJQ0FDSEVfV0FZX1NJWkUKLSMgZGVmaW5lIENBQ0hFX1dBWV9TSVpFIERDQUNIRV9XQVlfU0laRQotI2Vsc2UKLSMgZGVmaW5lIENBQ0hFX1dBWV9TSVpFIElDQUNIRV9XQVlfU0laRQotI2VuZGlmCi0KLQotI2VuZGlmCS8qIF9YVEVOU0FfQ0FDSEVfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL2NoZWNrc3VtLmggYi9pbmNsdWRlL2FzbS14dGVuc2EvY2hlY2tzdW0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM1MzRjNi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FzbS14dGVuc2EvY2hlY2tzdW0uaAorKysgL2Rldi9udWxsCkBAIC0xLDI1MCArMCwwIEBACi0vKgotICogaW5jbHVkZS9hc20teHRlbnNhL2NoZWNrc3VtLmgKLSAqCi0gKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQotICogZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDEgLSAyMDA1IFRlbnNpbGljYSBJbmMuCi0gKi8KLQotI2lmbmRlZiBfWFRFTlNBX0NIRUNLU1VNX0gKLSNkZWZpbmUgX1hURU5TQV9DSEVDS1NVTV9ICi0KLSNpbmNsdWRlIDxsaW51eC9pbjYuaD4KLSNpbmNsdWRlIDxhc20vdmFyaWFudC9jb3JlLmg+Ci0KLS8qCi0gKiBjb21wdXRlcyB0aGUgY2hlY2tzdW0gb2YgYSBtZW1vcnkgYmxvY2sgYXQgYnVmZiwgbGVuZ3RoIGxlbiwKLSAqIGFuZCBhZGRzIGluICJzdW0iICgzMi1iaXQpCi0gKgotICogcmV0dXJucyBhIDMyLWJpdCBudW1iZXIgc3VpdGFibGUgZm9yIGZlZWRpbmcgaW50byBpdHNlbGYKLSAqIG9yIGNzdW1fdGNwdWRwX21hZ2ljCi0gKgotICogdGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCB3aXRoIGV2ZW4gbGVuZ3RocywgZXhjZXB0Ci0gKiBmb3IgdGhlIGxhc3QgZnJhZ21lbnQsIHdoaWNoIG1heSBiZSBvZGQKLSAqCi0gKiBpdCdzIGJlc3QgdG8gaGF2ZSBidWZmIGFsaWduZWQgb24gYSAzMi1iaXQgYm91bmRhcnkKLSAqLwotYXNtbGlua2FnZSBfX3dzdW0gY3N1bV9wYXJ0aWFsKGNvbnN0IHZvaWQgKmJ1ZmYsIGludCBsZW4sIF9fd3N1bSBzdW0pOwotCi0vKgotICogdGhlIHNhbWUgYXMgY3N1bV9wYXJ0aWFsLCBidXQgY29waWVzIGZyb20gc3JjIHdoaWxlIGl0Ci0gKiBjaGVja3N1bXMsIGFuZCBoYW5kbGVzIHVzZXItc3BhY2UgcG9pbnRlciBleGNlcHRpb25zIGNvcnJlY3RseSwgd2hlbiBuZWVkZWQuCi0gKgotICogaGVyZSBldmVuIG1vcmUgaW1wb3J0YW50IHRvIGFsaWduIHNyYyBhbmQgZHN0IG9uIGEgMzItYml0IChvciBldmVuCi0gKiBiZXR0ZXIgNjQtYml0KSBib3VuZGFyeQotICovCi0KLWFzbWxpbmthZ2UgX193c3VtIGNzdW1fcGFydGlhbF9jb3B5X2dlbmVyaWMoY29uc3Qgdm9pZCAqc3JjLCB2b2lkICpkc3QsIGludCBsZW4sIF9fd3N1bSBzdW0sCi0JCQkJCQkgICBpbnQgKnNyY19lcnJfcHRyLCBpbnQgKmRzdF9lcnJfcHRyKTsKLQotLyoKLSAqCU5vdGU6IHdoZW4geW91IGdldCBhIE5VTEwgcG9pbnRlciBleGNlcHRpb24gaGVyZSB0aGlzIG1lYW5zIHNvbWVvbmUKLSAqCXBhc3NlZCBpbiBhbiBpbmNvcnJlY3Qga2VybmVsIGFkZHJlc3MgdG8gb25lIG9mIHRoZXNlIGZ1bmN0aW9ucy4KLSAqCi0gKglJZiB5b3UgdXNlIHRoZXNlIGZ1bmN0aW9ucyBkaXJlY3RseSBwbGVhc2UgZG9uJ3QgZm9yZ2V0IHRoZSBhY2Nlc3Nfb2soKS4KLSAqLwotc3RhdGljIGlubGluZQotX193c3VtIGNzdW1fcGFydGlhbF9jb3B5X25vY2hlY2soY29uc3Qgdm9pZCAqc3JjLCB2b2lkICpkc3QsCi0JCQkJCWludCBsZW4sIF9fd3N1bSBzdW0pCi17Ci0JcmV0dXJuIGNzdW1fcGFydGlhbF9jb3B5X2dlbmVyaWMoc3JjLCBkc3QsIGxlbiwgc3VtLCBOVUxMLCBOVUxMKTsKLX0KLQotc3RhdGljIGlubGluZQotX193c3VtIGNzdW1fcGFydGlhbF9jb3B5X2Zyb21fdXNlcihjb25zdCB2b2lkIF9fdXNlciAqc3JjLCB2b2lkICpkc3QsCi0JCQkJCQlpbnQgbGVuLCBfX3dzdW0gc3VtLCBpbnQgKmVycl9wdHIpCi17Ci0JcmV0dXJuIGNzdW1fcGFydGlhbF9jb3B5X2dlbmVyaWMoKF9fZm9yY2UgY29uc3Qgdm9pZCAqKXNyYywgZHN0LAotCQkJCQlsZW4sIHN1bSwgZXJyX3B0ciwgTlVMTCk7Ci19Ci0KLS8qCi0gKglGb2xkIGEgcGFydGlhbCBjaGVja3N1bQotICovCi0KLXN0YXRpYyBfX2lubGluZV9fIF9fc3VtMTYgY3N1bV9mb2xkKF9fd3N1bSBzdW0pCi17Ci0JdW5zaWduZWQgaW50IF9fZHVtbXk7Ci0JX19hc21fXygiZXh0dWkJJTEsICUwLCAxNiwgMTZcblx0IgotCQkiZXh0dWkJJTAgLCUwLCAwLCAxNlxuXHQiCi0JCSJhZGQJJTAsICUwLCAlMVxuXHQiCi0JCSJzbGxpCSUxLCAlMCwgMTZcblx0IgotCQkiYWRkCSUwLCAlMCwgJTFcblx0IgotCQkiZXh0dWkJJTAsICUwLCAxNiwgMTZcblx0IgotCQkibmVnCSUwLCAlMFxuXHQiCi0JCSJhZGRpCSUwLCAlMCwgLTFcblx0IgotCQkiZXh0dWkJJTAsICUwLCAwLCAxNlxuXHQiCi0JCTogIj1yIiAoc3VtKSwgIj0mciIgKF9fZHVtbXkpCi0JCTogIjAiIChzdW0pKTsKLQlyZXR1cm4gKF9fZm9yY2UgX19zdW0xNilzdW07Ci19Ci0KLS8qCi0gKglUaGlzIGlzIGEgdmVyc2lvbiBvZiBpcF9jb21wdXRlX2NzdW0oKSBvcHRpbWl6ZWQgZm9yIElQIGhlYWRlcnMsCi0gKgl3aGljaCBhbHdheXMgY2hlY2tzdW0gb24gNCBvY3RldCBib3VuZGFyaWVzLgotICovCi1zdGF0aWMgX19pbmxpbmVfXyBfX3N1bTE2IGlwX2Zhc3RfY3N1bShjb25zdCB2b2lkICppcGgsIHVuc2lnbmVkIGludCBpaGwpCi17Ci0JdW5zaWduZWQgaW50IHN1bSwgdG1wLCBlbmRhZGRyOwotCi0JX19hc21fXyBfX3ZvbGF0aWxlX18oCi0JCSJzdWIJCSUwLCAlMCwgJTBcblx0IgotI2lmIFhDSEFMX0hBVkVfTE9PUFMKLQkJImxvb3BndHoJJTIsIDJmXG5cdCIKLSNlbHNlCi0JCSJiZXF6CQklMiwgMmZcblx0IgotCQkic2xsaQkJJTQsICUyLCAyXG5cdCIKLQkJImFkZAkJJTQsICU0LCAlMVxuXHQiCi0JCSIwOlx0IgotI2VuZGlmCi0JCSJsMzJpCQklMywgJTEsIDBcblx0IgotCQkiYWRkCQklMCwgJTAsICUzXG5cdCIKLQkJImJnZXUJCSUwLCAlMywgMWZcblx0IgotCQkiYWRkaQkJJTAsICUwLCAxXG5cdCIKLQkJIjE6XHQiCi0JCSJhZGRpCQklMSwgJTEsIDRcblx0IgotI2lmICFYQ0hBTF9IQVZFX0xPT1BTCi0JCSJibHQJCSUxLCAlNCwgMGJcblx0IgotI2VuZGlmCi0JCSIyOlx0IgotCS8qIFNpbmNlIHRoZSBpbnB1dCByZWdpc3RlcnMgd2hpY2ggYXJlIGxvYWRlZCB3aXRoIGlwaCBhbmQgaWhsCi0JICAgYXJlIG1vZGlmaWVkLCB3ZSBtdXN0IGFsc28gc3BlY2lmeSB0aGVtIGFzIG91dHB1dHMsIG9yIGdjYwotCSAgIHdpbGwgYXNzdW1lIHRoZXkgY29udGFpbiB0aGVpciBvcmlnaW5hbCB2YWx1ZXMuICovCi0JCTogIj1yIiAoc3VtKSwgIj1yIiAoaXBoKSwgIj1yIiAoaWhsKSwgIj0mciIgKHRtcCksICI9JnIiIChlbmRhZGRyKQotCQk6ICIxIiAoaXBoKSwgIjIiIChpaGwpKTsKLQotCXJldHVybgljc3VtX2ZvbGQoc3VtKTsKLX0KLQotc3RhdGljIF9faW5saW5lX18gX193c3VtIGNzdW1fdGNwdWRwX25vZm9sZChfX2JlMzIgc2FkZHIsIF9fYmUzMiBkYWRkciwKLQkJCQkJCSAgIHVuc2lnbmVkIHNob3J0IGxlbiwKLQkJCQkJCSAgIHVuc2lnbmVkIHNob3J0IHByb3RvLAotCQkJCQkJICAgX193c3VtIHN1bSkKLXsKLQotI2lmZGVmIF9fWFRFTlNBX0VMX18KLQl1bnNpZ25lZCBsb25nIGxlbl9wcm90byA9IChsZW4gKyBwcm90bykgPDwgODsKLSNlbGlmIGRlZmluZWQoX19YVEVOU0FfRUJfXykKLQl1bnNpZ25lZCBsb25nIGxlbl9wcm90byA9IGxlbiArIHByb3RvOwotI2Vsc2UKLSMgZXJyb3IgcHJvY2Vzc29yIGJ5dGUgb3JkZXIgdW5kZWZpbmVkIQotI2VuZGlmCi0JX19hc21fXygiYWRkCSUwLCAlMCwgJTFcblx0IgotCQkiYmdldQklMCwgJTEsIDFmXG5cdCIKLQkJImFkZGkJJTAsICUwLCAxXG5cdCIKLQkJIjE6XHQiCi0JCSJhZGQJJTAsICUwLCAlMlxuXHQiCi0JCSJiZ2V1CSUwLCAlMiwgMWZcblx0IgotCQkiYWRkaQklMCwgJTAsIDFcblx0IgotCQkiMTpcdCIKLQkJImFkZAklMCwgJTAsICUzXG5cdCIKLQkJImJnZXUJJTAsICUzLCAxZlxuXHQiCi0JCSJhZGRpCSUwLCAlMCwgMVxuXHQiCi0JCSIxOlx0IgotCQk6ICI9ciIgKHN1bSksICI9ciIgKGxlbl9wcm90bykKLQkJOiAiciIgKGRhZGRyKSwgInIiIChzYWRkciksICIxIiAobGVuX3Byb3RvKSwgIjAiIChzdW0pKTsKLQlyZXR1cm4gc3VtOwotfQotCi0vKgotICogY29tcHV0ZXMgdGhlIGNoZWNrc3VtIG9mIHRoZSBUQ1AvVURQIHBzZXVkby1oZWFkZXIKLSAqIHJldHVybnMgYSAxNi1iaXQgY2hlY2tzdW0sIGFscmVhZHkgY29tcGxlbWVudGVkCi0gKi8KLXN0YXRpYyBfX2lubGluZV9fIF9fc3VtMTYgY3N1bV90Y3B1ZHBfbWFnaWMoX19iZTMyIHNhZGRyLCBfX2JlMzIgZGFkZHIsCi0JCQkJCQkgICAgICAgdW5zaWduZWQgc2hvcnQgbGVuLAotCQkJCQkJICAgICAgIHVuc2lnbmVkIHNob3J0IHByb3RvLAotCQkJCQkJICAgICAgIF9fd3N1bSBzdW0pCi17Ci0JcmV0dXJuIGNzdW1fZm9sZChjc3VtX3RjcHVkcF9ub2ZvbGQoc2FkZHIsZGFkZHIsbGVuLHByb3RvLHN1bSkpOwotfQotCi0vKgotICogdGhpcyByb3V0aW5lIGlzIHVzZWQgZm9yIG1pc2NlbGxhbmVvdXMgSVAtbGlrZSBjaGVja3N1bXMsIG1haW5seQotICogaW4gaWNtcC5jCi0gKi8KLQotc3RhdGljIF9faW5saW5lX18gX19zdW0xNiBpcF9jb21wdXRlX2NzdW0oY29uc3Qgdm9pZCAqYnVmZiwgaW50IGxlbikKLXsKLSAgICByZXR1cm4gY3N1bV9mb2xkIChjc3VtX3BhcnRpYWwoYnVmZiwgbGVuLCAwKSk7Ci19Ci0KLSNkZWZpbmUgX0hBVkVfQVJDSF9JUFY2X0NTVU0KLXN0YXRpYyBfX2lubGluZV9fIF9fc3VtMTYgY3N1bV9pcHY2X21hZ2ljKGNvbnN0IHN0cnVjdCBpbjZfYWRkciAqc2FkZHIsCi0JCQkJCSAgY29uc3Qgc3RydWN0IGluNl9hZGRyICpkYWRkciwKLQkJCQkJICBfX3UzMiBsZW4sIHVuc2lnbmVkIHNob3J0IHByb3RvLAotCQkJCQkgIF9fd3N1bSBzdW0pCi17Ci0JdW5zaWduZWQgaW50IF9fZHVtbXk7Ci0JX19hc21fXygibDMyaQklMSwgJTIsIDBcblx0IgotCQkiYWRkCSUwLCAlMCwgJTFcblx0IgotCQkiYmdldQklMCwgJTEsIDFmXG5cdCIKLQkJImFkZGkJJTAsICUwLCAxXG5cdCIKLQkJIjE6XHQiCi0JCSJsMzJpCSUxLCAlMiwgNFxuXHQiCi0JCSJhZGQJJTAsICUwLCAlMVxuXHQiCi0JCSJiZ2V1CSUwLCAlMSwgMWZcblx0IgotCQkiYWRkaQklMCwgJTAsIDFcblx0IgotCQkiMTpcdCIKLQkJImwzMmkJJTEsICUyLCA4XG5cdCIKLQkJImFkZAklMCwgJTAsICUxXG5cdCIKLQkJImJnZXUJJTAsICUxLCAxZlxuXHQiCi0JCSJhZGRpCSUwLCAlMCwgMVxuXHQiCi0JCSIxOlx0IgotCQkibDMyaQklMSwgJTIsIDEyXG5cdCIKLQkJImFkZAklMCwgJTAsICUxXG5cdCIKLQkJImJnZXUJJTAsICUxLCAxZlxuXHQiCi0JCSJhZGRpCSUwLCAlMCwgMVxuXHQiCi0JCSIxOlx0IgotCQkibDMyaQklMSwgJTMsIDBcblx0IgotCQkiYWRkCSUwLCAlMCwgJTFcblx0IgotCQkiYmdldQklMCwgJTEsIDFmXG5cdCIKLQkJImFkZGkJJTAsICUwLCAxXG5cdCIKLQkJIjE6XHQiCi0JCSJsMzJpCSUxLCAlMywgNFxuXHQiCi0JCSJhZGQJJTAsICUwLCAlMVxuXHQiCi0JCSJiZ2V1CSUwLCAlMSwgMWZcblx0IgotCQkiYWRkaQklMCwgJTAsIDFcblx0IgotCQkiMTpcdCIKLQkJImwzMmkJJTEsICUzLCA4XG5cdCIKLQkJImFkZAklMCwgJTAsICUxXG5cdCIKLQkJImJnZXUJJTAsICUxLCAxZlxuXHQiCi0JCSJhZGRpCSUwLCAlMCwgMVxuXHQiCi0JCSIxOlx0IgotCQkibDMyaQklMSwgJTMsIDEyXG5cdCIKLQkJImFkZAklMCwgJTAsICUxXG5cdCIKLQkJImJnZXUJJTAsICUxLCAxZlxuXHQiCi0JCSJhZGRpCSUwLCAlMCwgMVxuXHQiCi0JCSIxOlx0IgotCQkiYWRkCSUwLCAlMCwgJTRcblx0IgotCQkiYmdldQklMCwgJTQsIDFmXG5cdCIKLQkJImFkZGkJJTAsICUwLCAxXG5cdCIKLQkJIjE6XHQiCi0JCSJhZGQJJTAsICUwLCAlNVxuXHQiCi0JCSJiZ2V1CSUwLCAlNSwgMWZcblx0IgotCQkiYWRkaQklMCwgJTAsIDFcblx0IgotCQkiMTpcdCIKLQkJOiAiPXIiIChzdW0pLCAiPSZyIiAoX19kdW1teSkKLQkJOiAiciIgKHNhZGRyKSwgInIiIChkYWRkciksCi0JCSAgInIiIChodG9ubChsZW4pKSwgInIiIChodG9ubChwcm90bykpLCAiMCIgKHN1bSkpOwotCi0JcmV0dXJuIGNzdW1fZm9sZChzdW0pOwotfQotCi0vKgotICoJQ29weSBhbmQgY2hlY2tzdW0gdG8gdXNlcgotICovCi0jZGVmaW5lIEhBVkVfQ1NVTV9DT1BZX1VTRVIKLXN0YXRpYyBfX2lubGluZV9fIF9fd3N1bSBjc3VtX2FuZF9jb3B5X3RvX3VzZXIoY29uc3Qgdm9pZCAqc3JjLCB2b2lkIF9fdXNlciAqZHN0LAotCQkJCSAgICBpbnQgbGVuLCBfX3dzdW0gc3VtLCBpbnQgKmVycl9wdHIpCi17Ci0JaWYgKGFjY2Vzc19vayhWRVJJRllfV1JJVEUsIGRzdCwgbGVuKSkKLQkJcmV0dXJuIGNzdW1fcGFydGlhbF9jb3B5X2dlbmVyaWMoc3JjLCBkc3QsIGxlbiwgc3VtLCBOVUxMLCBlcnJfcHRyKTsKLQotCWlmIChsZW4pCi0JCSplcnJfcHRyID0gLUVGQVVMVDsKLQotCXJldHVybiAoX19mb3JjZSBfX3dzdW0pLTE7IC8qIGludmFsaWQgY2hlY2tzdW0gKi8KLX0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL2NvcHJvY2Vzc29yLmggYi9pbmNsdWRlL2FzbS14dGVuc2EvY29wcm9jZXNzb3IuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWNiY2Y5MC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FzbS14dGVuc2EvY29wcm9jZXNzb3IuaAorKysgL2Rldi9udWxsCkBAIC0xLDE3NyArMCwwIEBACi0vKgotICogaW5jbHVkZS9hc20teHRlbnNhL2NvcHJvY2Vzc29yLmgKLSAqCi0gKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQotICogZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDMgLSAyMDA3IFRlbnNpbGljYSBJbmMuCi0gKi8KLQotCi0jaWZuZGVmIF9YVEVOU0FfQ09QUk9DRVNTT1JfSAotI2RlZmluZSBfWFRFTlNBX0NPUFJPQ0VTU09SX0gKLQotI2luY2x1ZGUgPGxpbnV4L3N0cmluZ2lmeS5oPgotI2luY2x1ZGUgPGFzbS92YXJpYW50L3RpZS5oPgotI2luY2x1ZGUgPGFzbS90eXBlcy5oPgotCi0jaWZkZWYgX19BU1NFTUJMWV9fCi0jIGluY2x1ZGUgPGFzbS92YXJpYW50L3RpZS1hc20uaD4KLQotLm1hY3JvCXhjaGFsX3NhX3N0YXJ0ICBhIGIKLQkuc2V0IC5MeGNoYWxfcG9mc18sIDAKLQkuc2V0IC5MeGNoYWxfb2ZzXywgMAotLmVuZG0KLQotLm1hY3JvCXhjaGFsX3NhX2FsaWduICBwdHIgbWlub2ZzIG1heG9mcyBvZnNhbGlnbiB0b3RhbGlnbgotCS5zZXQJLkx4Y2hhbF9vZnNfLCAuTHhjaGFsX29mc18gKyAuTHhjaGFsX3BvZnNfICsgXHRvdGFsaWduIC0gMQotCS5zZXQJLkx4Y2hhbF9vZnNfLCAoLkx4Y2hhbF9vZnNfICYgLVx0b3RhbGlnbikgLSAuTHhjaGFsX3BvZnNfCi0uZW5kbQotCi0jZGVmaW5lIF9TRUxFQ1QJKCAgWFRIQUxfU0FTX1RJRSB8IFhUSEFMX1NBU19PUFQgXAotCQkgfCBYVEhBTF9TQVNfQ0MgXAotCQkgfCBYVEhBTF9TQVNfQ0FMUiB8IFhUSEFMX1NBU19DQUxFICkKLQotLm1hY3JvIHNhdmVfeHRyZWdzX29wdCBwdHIgY2xiIGF0MSBhdDIgYXQzIGF0NCBvZmZzZXQKLQkuaWYgWFRSRUdTX09QVF9TSVpFID4gMAotCQlhZGRpCVxjbGIsIFxwdHIsIFxvZmZzZXQKLQkJeGNoYWxfbmNwX3N0b3JlIFxjbGIgXGF0MSBcYXQyIFxhdDMgXGF0NCBzZWxlY3Q9X1NFTEVDVAotCS5lbmRpZgotLmVuZG0KLQotLm1hY3JvIGxvYWRfeHRyZWdzX29wdCBwdHIgY2xiIGF0MSBhdDIgYXQzIGF0NCBvZmZzZXQKLQkuaWYgWFRSRUdTX09QVF9TSVpFID4gMAotCQlhZGRpCVxjbGIsIFxwdHIsIFxvZmZzZXQKLQkJeGNoYWxfbmNwX2xvYWQgXGNsYiBcYXQxIFxhdDIgXGF0MyBcYXQ0IHNlbGVjdD1fU0VMRUNUCi0JLmVuZGlmCi0uZW5kbQotI3VuZGVmIF9TRUxFQ1QKLQotI2RlZmluZSBfU0VMRUNUCSggIFhUSEFMX1NBU19USUUgfCBYVEhBTF9TQVNfT1BUIFwKLQkJIHwgWFRIQUxfU0FTX05PQ0MgXAotCQkgfCBYVEhBTF9TQVNfQ0FMUiB8IFhUSEFMX1NBU19DQUxFIHwgWFRIQUxfU0FTX0dMT0IgKQotCi0ubWFjcm8gc2F2ZV94dHJlZ3NfdXNlciBwdHIgY2xiIGF0MSBhdDIgYXQzIGF0NCBvZmZzZXQKLQkuaWYgWFRSRUdTX1VTRVJfU0laRSA+IDAKLQkJYWRkaQlcY2xiLCBccHRyLCBcb2Zmc2V0Ci0JCXhjaGFsX25jcF9zdG9yZSBcY2xiIFxhdDEgXGF0MiBcYXQzIFxhdDQgc2VsZWN0PV9TRUxFQ1QKLQkuZW5kaWYKLS5lbmRtCi0KLS5tYWNybyBsb2FkX3h0cmVnc191c2VyIHB0ciBjbGIgYXQxIGF0MiBhdDMgYXQ0IG9mZnNldAotCS5pZiBYVFJFR1NfVVNFUl9TSVpFID4gMAotCQlhZGRpCVxjbGIsIFxwdHIsIFxvZmZzZXQKLQkJeGNoYWxfbmNwX2xvYWQgXGNsYiBcYXQxIFxhdDIgXGF0MyBcYXQ0IHNlbGVjdD1fU0VMRUNUCi0JLmVuZGlmCi0uZW5kbQotI3VuZGVmIF9TRUxFQ1QKLQotCi0KLSNlbmRpZgkvKiBfX0FTU0VNQkxZX18gKi8KLQotLyoKLSAqIFhURU5TQV9IQVZFX0NPUFJPQ0VTU09SKHgpIHJldHVybnMgMSBpZiBjb3Byb2Nlc3NvciB4IGlzIGNvbmZpZ3VyZWQuCi0gKgotICogWFRFTlNBX0hBVkVfSU9fUE9SVCh4KSByZXR1cm5zIDEgaWYgaW8tcG9ydCB4IGlzIGNvbmZpZ3VyZWQuCi0gKgotICovCi0KLSNkZWZpbmUgWFRFTlNBX0hBVkVfQ09QUk9DRVNTT1IoeCkJCQkJCVwKLQkoKFhDSEFMX0NQX01BU0sgXiBYQ0hBTF9DUF9QT1JUX01BU0spICYgKDEgPDwgKHgpKSkKLSNkZWZpbmUgWFRFTlNBX0hBVkVfQ09QUk9DRVNTT1JTCQkJCQlcCi0JKFhDSEFMX0NQX01BU0sgXiBYQ0hBTF9DUF9QT1JUX01BU0spCi0jZGVmaW5lIFhURU5TQV9IQVZFX0lPX1BPUlQoeCkJCQkJCQlcCi0JKFhDSEFMX0NQX1BPUlRfTUFTSyAmICgxIDw8ICh4KSkpCi0jZGVmaW5lIFhURU5TQV9IQVZFX0lPX1BPUlRTCQkJCQkJXAotCVhDSEFMX0NQX1BPUlRfTUFTSwotCi0jaWZuZGVmIF9fQVNTRU1CTFlfXwotCi0KLSNpZiBYQ0hBTF9IQVZFX0NQCi0KLSNkZWZpbmUgUlNSX0NQRU5BQkxFKHgpCWRvIHsJCQkJCQkgIFwKLQlfX2FzbV9fIF9fdm9sYXRpbGVfXygicnNyICUwLCIgX19zdHJpbmdpZnkoQ1BFTkFCTEUpIDogIj1hIiAoeCkpOyBcCi0JfSB3aGlsZSgwKTsKLSNkZWZpbmUgV1NSX0NQRU5BQkxFKHgpCWRvIHsJCQkJCQkgIFwKLSAgCV9fYXNtX18gX192b2xhdGlsZV9fKCJ3c3IgJTAsIiBfX3N0cmluZ2lmeShDUEVOQUJMRSkgIjsgcnN5bmMiIAkgIFwKLQkgICAgCQkgICAgIDo6ICJhIiAoeCkpOwkJCQkgIFwKLQl9IHdoaWxlKDApOwotCi0jZW5kaWYgLyogWENIQUxfSEFWRV9DUCAqLwotCi0KLS8qCi0gKiBBZGRpdGlvbmFsIHJlZ2lzdGVycy4KLSAqIFdlIGRlZmluZSB0aHJlZSB0eXBlcyBvZiBhZGRpdGlvbmFsIHJlZ2lzdGVyczoKLSAqICBleHQ6IGV4dHJhIHJlZ2lzdGVycyB0aGF0IGFyZSB1c2VkIGJ5IHRoZSBjb21waWxlcgotICogIGNwbjogb3B0aW9uYWwgcmVnaXN0ZXJzIHRoYXQgY2FuIGJlIHVzZWQgYnkgYSB1c2VyIGFwcGxpY2F0aW9uCi0gKiAgY3BYOiBjb3Byb2Nlc3NvciByZWdpc3RlcnMgdGhhdCBjYW4gb25seSBiZSB1c2VkIGlmIHRoZSBjb3JyZXNwb25kaW5nCi0gKiAgICAgICBDUEVOQUJMRSBiaXQgaXMgc2V0LgotICovCi0KLSNkZWZpbmUgWENIQUxfU0FfUkVHKGxpc3QsY2MsYWJpLHR5cGUseSxuYW1lLHosYWxpZ24sc2l6ZSwuLi4pCVwKLQlfX1JFRyAjIyBsaXN0IChjYywgYWJpLCB0eXBlLCBuYW1lLCBzaXplLCBhbGlnbikKLQotI2RlZmluZSBfX1JFRzAoY2MsYWJpLHQsbmFtZSxzLGEpCV9fUkVHMF8gIyMgY2MgKGFiaSxuYW1lKQotI2RlZmluZSBfX1JFRzEoY2MsYWJpLHQsbmFtZSxzLGEpCV9fUkVHMV8gIyMgY2MgKG5hbWUpCi0jZGVmaW5lIF9fUkVHMihjYyxhYmksdHlwZSwuLi4pCQlfX1JFRzJfICMjIHR5cGUgKF9fVkFfQVJHU19fKQotCi0jZGVmaW5lIF9fUkVHMF8wKGFiaSxuYW1lKQotI2RlZmluZSBfX1JFRzBfMShhYmksbmFtZSkJCV9fUkVHMF8xICMjIGFiaSAobmFtZSkKLSNkZWZpbmUgX19SRUcwXzEwKG5hbWUpCV9fdTMyIG5hbWU7Ci0jZGVmaW5lIF9fUkVHMF8xMShuYW1lKQlfX3UzMiBuYW1lOwotI2RlZmluZSBfX1JFRzBfMTIobmFtZSkKLQotI2RlZmluZSBfX1JFRzFfMChuYW1lKQlfX3UzMiBuYW1lOwotI2RlZmluZSBfX1JFRzFfMShuYW1lKQotCi0jZGVmaW5lIF9fUkVHMl8wKG4scyxhKQlfX3UzMiBuYW1lOwotI2RlZmluZSBfX1JFRzJfMShuLHMsYSkJdW5zaWduZWQgY2hhciBuW3NdIF9fYXR0cmlidXRlX18gKChhbGlnbmVkKGEpKSk7Ci0jZGVmaW5lIF9fUkVHMl8yKG4scyxhKSB1bnNpZ25lZCBjaGFyIG5bc10gX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQoYSkpKTsKLQotdHlwZWRlZiBzdHJ1Y3QgeyBYQ0hBTF9OQ1BfU0FfTElTVCgwKSB9IHh0cmVnc19vcHRfdAotCV9fYXR0cmlidXRlX18gKChhbGlnbmVkIChYQ0hBTF9OQ1BfU0FfQUxJR04pKSk7Ci10eXBlZGVmIHN0cnVjdCB7IFhDSEFMX05DUF9TQV9MSVNUKDEpIH0geHRyZWdzX3VzZXJfdAotCV9fYXR0cmlidXRlX18gKChhbGlnbmVkIChYQ0hBTF9OQ1BfU0FfQUxJR04pKSk7Ci0KLSNpZiBYVEVOU0FfSEFWRV9DT1BST0NFU1NPUlMKLQotdHlwZWRlZiBzdHJ1Y3QgeyBYQ0hBTF9DUDBfU0FfTElTVCgyKSB9IHh0cmVnc19jcDBfdAotCV9fYXR0cmlidXRlX18gKChhbGlnbmVkIChYQ0hBTF9DUDBfU0FfQUxJR04pKSk7Ci10eXBlZGVmIHN0cnVjdCB7IFhDSEFMX0NQMV9TQV9MSVNUKDIpIH0geHRyZWdzX2NwMV90Ci0JX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQgKFhDSEFMX0NQMV9TQV9BTElHTikpKTsKLXR5cGVkZWYgc3RydWN0IHsgWENIQUxfQ1AyX1NBX0xJU1QoMikgfSB4dHJlZ3NfY3AyX3QKLQlfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCAoWENIQUxfQ1AyX1NBX0FMSUdOKSkpOwotdHlwZWRlZiBzdHJ1Y3QgeyBYQ0hBTF9DUDNfU0FfTElTVCgyKSB9IHh0cmVnc19jcDNfdAotCV9fYXR0cmlidXRlX18gKChhbGlnbmVkIChYQ0hBTF9DUDNfU0FfQUxJR04pKSk7Ci10eXBlZGVmIHN0cnVjdCB7IFhDSEFMX0NQNF9TQV9MSVNUKDIpIH0geHRyZWdzX2NwNF90Ci0JX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQgKFhDSEFMX0NQNF9TQV9BTElHTikpKTsKLXR5cGVkZWYgc3RydWN0IHsgWENIQUxfQ1A1X1NBX0xJU1QoMikgfSB4dHJlZ3NfY3A1X3QKLQlfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCAoWENIQUxfQ1A1X1NBX0FMSUdOKSkpOwotdHlwZWRlZiBzdHJ1Y3QgeyBYQ0hBTF9DUDZfU0FfTElTVCgyKSB9IHh0cmVnc19jcDZfdAotCV9fYXR0cmlidXRlX18gKChhbGlnbmVkIChYQ0hBTF9DUDZfU0FfQUxJR04pKSk7Ci10eXBlZGVmIHN0cnVjdCB7IFhDSEFMX0NQN19TQV9MSVNUKDIpIH0geHRyZWdzX2NwN190Ci0JX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQgKFhDSEFMX0NQN19TQV9BTElHTikpKTsKLQotZXh0ZXJuIHN0cnVjdCB0aHJlYWRfaW5mbyogY29wcm9jZXNzb3Jfb3duZXJbWENIQUxfQ1BfTUFYXTsKLWV4dGVybiB2b2lkIGNvcHJvY2Vzc29yX3NhdmUodm9pZCosIGludCk7Ci1leHRlcm4gdm9pZCBjb3Byb2Nlc3Nvcl9sb2FkKHZvaWQqLCBpbnQpOwotZXh0ZXJuIHZvaWQgY29wcm9jZXNzb3JfZmx1c2goc3RydWN0IHRocmVhZF9pbmZvKiwgaW50KTsKLWV4dGVybiB2b2lkIGNvcHJvY2Vzc29yX3Jlc3RvcmUoc3RydWN0IHRocmVhZF9pbmZvKiwgaW50KTsKLQotZXh0ZXJuIHZvaWQgY29wcm9jZXNzb3JfcmVsZWFzZV9hbGwoc3RydWN0IHRocmVhZF9pbmZvKik7Ci1leHRlcm4gdm9pZCBjb3Byb2Nlc3Nvcl9mbHVzaF9hbGwoc3RydWN0IHRocmVhZF9pbmZvKik7Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBjb3Byb2Nlc3Nvcl9jbGVhcl9jcGVuYWJsZSh2b2lkKQotewotCXVuc2lnbmVkIGxvbmcgaSA9IDA7Ci0JV1NSX0NQRU5BQkxFKGkpOwotfQotCi0jZW5kaWYJLyogWFRFTlNBX0hBVkVfQ09QUk9DRVNTT1JTICovCi0KLSNlbmRpZgkvKiAhX19BU1NFTUJMWV9fICovCi0jZW5kaWYJLyogX1hURU5TQV9DT1BST0NFU1NPUl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2EvaXJxLmggYi9pbmNsdWRlL2FzbS14dGVuc2EvaXJxLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjNzNiN2YuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hc20teHRlbnNhL2lycS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoKLSAqIGluY2x1ZGUvYXNtLXh0ZW5zYS9pcnEuaAotICoKLSAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCi0gKiBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIENvcHlyaWdodCAoQykgMjAwMSAtIDIwMDUgVGVuc2lsaWNhIEluYy4KLSAqLwotCi0jaWZuZGVmIF9YVEVOU0FfSVJRX0gKLSNkZWZpbmUgX1hURU5TQV9JUlFfSAotCi0jaW5jbHVkZSA8YXNtL3BsYXRmb3JtL2hhcmR3YXJlLmg+Ci0jaW5jbHVkZSA8YXNtL3ZhcmlhbnQvY29yZS5oPgotCi0jaWZuZGVmIFBMQVRGT1JNX05SX0lSUVMKLSMgZGVmaW5lIFBMQVRGT1JNX05SX0lSUVMgMAotI2VuZGlmCi0jZGVmaW5lIFhURU5TQV9OUl9JUlFTIFhDSEFMX05VTV9JTlRFUlJVUFRTCi0jZGVmaW5lIE5SX0lSUVMgKFhURU5TQV9OUl9JUlFTICsgUExBVEZPUk1fTlJfSVJRUykKLQotc3RhdGljIF9faW5saW5lX18gaW50IGlycV9jYW5vbmljYWxpemUoaW50IGlycSkKLXsKLQlyZXR1cm4gKGlycSk7Ci19Ci0KLXN0cnVjdCBpcnFhY3Rpb247Ci0KLSNlbmRpZgkvKiBfWFRFTlNBX0lSUV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2EvcGxhdGZvcm0uaCBiL2luY2x1ZGUvYXNtLXh0ZW5zYS9wbGF0Zm9ybS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODEzNWE5Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9wbGF0Zm9ybS5oCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoKLSAqIGluY2x1ZGUvYXNtLXh0ZW5zYS9wbGF0Zm9ybS5oCi0gKgotICogUGxhdGZvcm0gc3BlY2lmaWMgZnVuY3Rpb25zCi0gKgotICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbAotICogUHVibGljIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZgotICogdGhpcyBhcmNoaXZlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDAxIC0gMjAwNSBUZW5zaWxpY2EgSW5jLgotICovCi0KLSNpZm5kZWYgX1hURU5TQV9QTEFURk9STV9ICi0jZGVmaW5lIF9YVEVOU0FfUExBVEZPUk1fSAotCi0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLQotI2luY2x1ZGUgPGFzbS9ib290cGFyYW0uaD4KLQotLyoKLSAqIHBsYXRmb3JtX2luaXQgaXMgY2FsbGVkIGJlZm9yZSB0aGUgbW11IGlzIGluaXRpYWxpemVkIHRvIGdpdmUgdGhlCi0gKiBwbGF0Zm9ybSBhIGVhcmx5IGhvb2stdXAuIGJwX3RhZ190IGlzIGEgbGlzdCBvZiBjb25maWd1cmF0aW9uIHRhZ3MKLSAqIHBhc3NlZCBmcm9tIHRoZSBib290LWxvYWRlci4KLSAqLwotZXh0ZXJuIHZvaWQgcGxhdGZvcm1faW5pdChicF90YWdfdCopOwotCi0vKgotICogcGxhdGZvcm1fc2V0dXAgaXMgY2FsbGVkIGZyb20gc2V0dXBfYXJjaCB3aXRoIGEgcG9pbnRlciB0byB0aGUgY29tbWFuZC1saW5lCi0gKiBzdHJpbmcuCi0gKi8KLWV4dGVybiB2b2lkIHBsYXRmb3JtX3NldHVwIChjaGFyICoqKTsKLQotLyoKLSAqIHBsYXRmb3JtX2luaXRfaXJxIGlzIGNhbGxlZCBmcm9tIGluaXRfSVJRLgotICovCi1leHRlcm4gdm9pZCBwbGF0Zm9ybV9pbml0X2lycSAodm9pZCk7Ci0KLS8qCi0gKiBwbGF0Zm9ybV9yZXN0YXJ0IGlzIGNhbGxlZCB0byByZXN0YXJ0IHRoZSBzeXN0ZW0uCi0gKi8KLWV4dGVybiB2b2lkIHBsYXRmb3JtX3Jlc3RhcnQgKHZvaWQpOwotCi0vKgotICogcGxhdGZvcm1faGFsdCBpcyBjYWxsZWQgdG8gc3RvcCB0aGUgc3lzdGVtIGFuZCBoYWx0LgotICovCi1leHRlcm4gdm9pZCBwbGF0Zm9ybV9oYWx0ICh2b2lkKTsKLQotLyoKLSAqIHBsYXRmb3JtX3Bvd2VyX29mZiBpcyBjYWxsZWQgdG8gc3RvcCB0aGUgc3lzdGVtIGFuZCBwb3dlciBpdCBvZmYuCi0gKi8KLWV4dGVybiB2b2lkIHBsYXRmb3JtX3Bvd2VyX29mZiAodm9pZCk7Ci0KLS8qCi0gKiBwbGF0Zm9ybV9pZGxlIGlzIGNhbGxlZCBmcm9tIHRoZSBpZGxlIGZ1bmN0aW9uLgotICovCi1leHRlcm4gdm9pZCBwbGF0Zm9ybV9pZGxlICh2b2lkKTsKLQotLyoKLSAqIHBsYXRmb3JtX2hlYXJ0YmVhdCBpcyBjYWxsZWQgZXZlcnkgSFoKLSAqLwotZXh0ZXJuIHZvaWQgcGxhdGZvcm1faGVhcnRiZWF0ICh2b2lkKTsKLQotLyoKLSAqIHBsYXRmb3JtX3BjaWJpb3NfaW5pdCBpcyBjYWxsZWQgdG8gYWxsb3cgdGhlIHBsYXRmb3JtIHRvIHNldHVwIHRoZSBwY2kgYnVzLgotICovCi1leHRlcm4gdm9pZCBwbGF0Zm9ybV9wY2liaW9zX2luaXQgKHZvaWQpOwotCi0vKgotICogcGxhdGZvcm1fcGNpYmlvc19maXh1cCBhbGxvd3MgdG8gbW9kaWZ5IHRoZSBQQ0kgY29uZmlndXJhdGlvbi4KLSAqLwotZXh0ZXJuIGludCBwbGF0Zm9ybV9wY2liaW9zX2ZpeHVwICh2b2lkKTsKLQotLyoKLSAqIHBsYXRmb3JtX2NhbGlicmF0ZV9jY291bnQgY2FsaWJyYXRlcyBjcHUgY2xvY2sgZnJlcSAoQ09ORklHX1hURU5TQV9DQUxJQlJBVEUpCi0gKi8KLWV4dGVybiB2b2lkIHBsYXRmb3JtX2NhbGlicmF0ZV9jY291bnQgKHZvaWQpOwotCi0vKgotICogcGxhdGZvcm1fZ2V0X3J0Y190aW1lIHJldHVybnMgUlRDIHNlY29uZHMgKHJldHVybnMgMCBmb3Igbm8gZXJyb3IpCi0gKi8KLWV4dGVybiBpbnQgcGxhdGZvcm1fZ2V0X3J0Y190aW1lKHRpbWVfdCopOwotCi0vKgotICogcGxhdGZvcm1fc2V0X3J0Y190aW1lIHNldCBSVEMgc2Vjb25kcyAocmV0dXJucyAwIGZvciBubyBlcnJvcikKLSAqLwotZXh0ZXJuIGludCBwbGF0Zm9ybV9zZXRfcnRjX3RpbWUodGltZV90KTsKLQotCi0jZW5kaWYJLyogX1hURU5TQV9QTEFURk9STV9IICovCi0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9wcm9jZXNzb3IuaCBiL2luY2x1ZGUvYXNtLXh0ZW5zYS9wcm9jZXNzb3IuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDkxOGE0ZS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FzbS14dGVuc2EvcHJvY2Vzc29yLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxOTMgKzAsMCBAQAotLyoKLSAqIGluY2x1ZGUvYXNtLXh0ZW5zYS9wcm9jZXNzb3IuaAotICoKLSAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCi0gKiBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIENvcHlyaWdodCAoQykgMjAwMSAtIDIwMDUgVGVuc2lsaWNhIEluYy4KLSAqLwotCi0jaWZuZGVmIF9YVEVOU0FfUFJPQ0VTU09SX0gKLSNkZWZpbmUgX1hURU5TQV9QUk9DRVNTT1JfSAotCi0jaW5jbHVkZSA8YXNtL3ZhcmlhbnQvY29yZS5oPgotI2luY2x1ZGUgPGFzbS9jb3Byb2Nlc3Nvci5oPgotCi0jaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KLSNpbmNsdWRlIDxhc20vcHRyYWNlLmg+Ci0jaW5jbHVkZSA8YXNtL3R5cGVzLmg+Ci0jaW5jbHVkZSA8YXNtL3JlZ3MuaD4KLQotLyogQXNzZXJ0aW9ucy4gKi8KLQotI2lmIChYQ0hBTF9IQVZFX1dJTkRPV0VEICE9IDEpCi0jIGVycm9yIExpbnV4IHJlcXVpcmVzIHRoZSBYdGVuc2EgV2luZG93ZWQgUmVnaXN0ZXJzIE9wdGlvbi4KLSNlbmRpZgotCi0vKgotICogVXNlciBzcGFjZSBwcm9jZXNzIHNpemU6IDEgR0IuCi0gKiBXaW5kb3dlZCBjYWxsIEFCSSByZXF1aXJlcyBjYWxsZXIgYW5kIGNhbGxlZSB0byBiZSBsb2NhdGVkIHdpdGhpbiB0aGUgc2FtZQotICogMSBHQiByZWdpb24uIFRoZSBDIGNvbXBpbGVyIHBsYWNlcyB0cmFtcG9saW5lIGNvZGUgb24gdGhlIHN0YWNrIGZvciBzb3VyY2VzCi0gKiB0aGF0IHRha2UgdGhlIGFkZHJlc3Mgb2YgYSBuZXN0ZWQgQyBmdW5jdGlvbiAoYSBmZWF0dXJlIHVzZWQgYnkgZ2xpYmMpLCBzbwotICogdGhlIDEgR0IgcmVxdWlyZW1lbnQgYXBwbGllcyB0byB0aGUgc3RhY2sgYXMgd2VsbC4KLSAqLwotCi0jZGVmaW5lIFRBU0tfU0laRQlfX1hURU5TQV9VTF9DT05TVCgweDQwMDAwMDAwKQotI2RlZmluZSBTVEFDS19UT1AJVEFTS19TSVpFCi0jZGVmaW5lIFNUQUNLX1RPUF9NQVgJU1RBQ0tfVE9QCi0KLS8qCi0gKiBHZW5lcmFsIGV4Y2VwdGlvbiBjYXVzZSBhc3NpZ25lZCB0byBkZWJ1ZyBleGNlcHRpb25zLiBEZWJ1ZyBleGNlcHRpb25zIGdvCi0gKiB0byB0aGVpciBvd24gdmVjdG9yLCByYXRoZXIgdGhhbiB0aGUgZ2VuZXJhbCBleGNlcHRpb24gdmVjdG9ycyAodXNlciwKLSAqIGtlcm5lbCwgZG91YmxlKTsgYW5kIHRoZWlyIHNwZWNpZmljIGNhdXNlcyBhcmUgcmVwb3J0ZWQgdmlhIERFQlVHQ0FVU0UKLSAqIHJhdGhlciB0aGFuIEVYQ0NBVVNFLiAgSG93ZXZlciBpdCBpcyBzb21ldGltZXMgY29udmVuaWVudCB0byByZWRpcmVjdCBkZWJ1ZwotICogZXhjZXB0aW9ucyB0byB0aGUgZ2VuZXJhbCBleGNlcHRpb24gbWVjaGFuaXNtLiAgVG8gZG8gdGhpcywgYW4gb3RoZXJ3aXNlCi0gKiB1bnVzZWQgRVhDQ0FVU0UgdmFsdWUgd2FzIGFzc2lnbmVkIHRvIGRlYnVnIGV4Y2VwdGlvbnMgZm9yIHRoaXMgcHVycG9zZS4KLSAqLwotCi0jZGVmaW5lIEVYQ0NBVVNFX01BUFBFRF9ERUJVRwk2MwotCi0vKgotICogV2UgdXNlIERFUEMgYWxzbyBhcyBhIGZsYWcgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiBkb3VibGUgYW5kIHJlZ3VsYXIKLSAqIGV4Y2VwdGlvbnMuIEZvciBwZXJmb3JtYW5jZSByZWFzb25zLCBERVBDIG1pZ2h0IGNvbnRhaW4gdGhlIHZhbHVlIG9mCi0gKiBFWENDQVVTRSBmb3IgcmVndWxhciBleGNlcHRpb25zLCBzbyB3ZSB1c2UgdGhpcyBkZWZpbml0aW9uIHRvIG1hcmsgYQotICogdmFsaWQgZG91YmxlIGV4Y2VwdGlvbiBhZGRyZXNzLgotICogKE5vdGU6IFdlIHVzZSBpdCBpbiBiZ2V1aSwgc28gaXQgc2hvdWxkIGJlIDY0LCAxMjgsIG9yIDI1NikKLSAqLwotCi0jZGVmaW5lIFZBTElEX0RPVUJMRV9FWENFUFRJT05fQUREUkVTUwk2NAotCi0vKiBMT0NLTEVWRUwgZGVmaW5lcyB0aGUgaW50ZXJydXB0IGxldmVsIHRoYXQgbWFza3MgYWxsCi0gKiBnZW5lcmFsLXB1cnBvc2UgaW50ZXJydXB0cy4KLSAqLwotI2RlZmluZSBMT0NLTEVWRUwgMQotCi0vKiBXU0JJVFMgYW5kIFdCQklUUyBhcmUgdGhlIHdpZHRoIG9mIHRoZSBXSU5ET1dTVEFSVCBhbmQgV0lORE9XQkFTRQotICogcmVnaXN0ZXJzCi0gKi8KLSNkZWZpbmUgV1NCSVRTICAoWENIQUxfTlVNX0FSRUdTIC8gNCkgICAgICAvKiB3aWR0aCBvZiBXSU5ET1dTVEFSVCBpbiBiaXRzICovCi0jZGVmaW5lIFdCQklUUyAgKFhDSEFMX05VTV9BUkVHU19MT0cyIC0gMikgLyogd2lkdGggb2YgV0lORE9XQkFTRSBpbiBiaXRzICovCi0KLSNpZm5kZWYgX19BU1NFTUJMWV9fCi0KLS8qIEJ1aWxkIGEgdmFsaWQgcmV0dXJuIGFkZHJlc3MgZm9yIHRoZSBzcGVjaWZpZWQgY2FsbCB3aW5zaXplLgotICogd2luc2l6ZSBtdXN0IGJlIDEgKGNhbGw0KSwgMiAoY2FsbDgpLCBvciAzIChjYWxsMTIpCi0gKi8KLSNkZWZpbmUgTUFLRV9SQV9GT1JfQ0FMTChyYSx3cykgICAoKChyYSkgJiAweDNmZmZmZmZmKSB8ICh3cykgPDwgMzApCi0KLS8qIENvbnZlcnQgcmV0dXJuIGFkZHJlc3MgdG8gYSB2YWxpZCBwYwotICogTm90ZTogV2UgYXNzdW1lIHRoYXQgdGhlIHN0YWNrIHBvaW50ZXIgaXMgaW4gdGhlIHNhbWUgMUdCIHJhbmdlcyBhcyB0aGUgcmEKLSAqLwotI2RlZmluZSBNQUtFX1BDX0ZST01fUkEocmEsc3ApICAgICgoKHJhKSAmIDB4M2ZmZmZmZmYpIHwgKChzcCkgJiAweGMwMDAwMDAwKSkKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIHVuc2lnbmVkIGxvbmcgc2VnOwotfSBtbV9zZWdtZW50X3Q7Ci0KLXN0cnVjdCB0aHJlYWRfc3RydWN0IHsKLQotCS8qIGtlcm5lbCdzIHJldHVybiBhZGRyZXNzIGFuZCBzdGFjayBwb2ludGVyIGZvciBjb250ZXh0IHN3aXRjaGluZyAqLwotCXVuc2lnbmVkIGxvbmcgcmE7IC8qIGtlcm5lbCdzIGEwOiByZXR1cm4gYWRkcmVzcyBhbmQgd2luZG93IGNhbGwgc2l6ZSAqLwotCXVuc2lnbmVkIGxvbmcgc3A7IC8qIGtlcm5lbCdzIGExOiBzdGFjayBwb2ludGVyICovCi0KLQltbV9zZWdtZW50X3QgY3VycmVudF9kczsgICAgLyogc2VlIHVhY2Nlc3MuaCBmb3IgZXhhbXBsZSB1c2VzICovCi0KLQkvKiBzdHJ1Y3QgeHRlbnNhX2NwdWluZm8gaW5mbzsgKi8KLQotCXVuc2lnbmVkIGxvbmcgYmFkX3ZhZGRyOyAvKiBsYXN0IHVzZXIgZmF1bHQgKi8KLQl1bnNpZ25lZCBsb25nIGJhZF91YWRkcjsgLyogbGFzdCBrZXJuZWwgZmF1bHQgYWNjZXNzaW5nIHVzZXIgc3BhY2UgKi8KLQl1bnNpZ25lZCBsb25nIGVycm9yX2NvZGU7Ci0KLQl1bnNpZ25lZCBsb25nIGlicmVha1tYQ0hBTF9OVU1fSUJSRUFLXTsKLQl1bnNpZ25lZCBsb25nIGRicmVha2FbWENIQUxfTlVNX0RCUkVBS107Ci0JdW5zaWduZWQgbG9uZyBkYnJlYWtjW1hDSEFMX05VTV9EQlJFQUtdOwotCi0JLyogTWFrZSBzdHJ1Y3R1cmUgMTYgYnl0ZXMgYWxpZ25lZC4gKi8KLQlpbnQgYWxpZ25bMF0gX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQoMTYpKSk7Ci19OwotCi0KLS8qCi0gKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIG1hY3JvIHRoYXQgcmV0dXJucyBjdXJyZW50Ci0gKiBpbnN0cnVjdGlvbiBwb2ludGVyICgicHJvZ3JhbSBjb3VudGVyIikuCi0gKi8KLSNkZWZpbmUgY3VycmVudF90ZXh0X2FkZHIoKSAgKHsgX19sYWJlbF9fIF9sOyBfbDogJiZfbDt9KQotCi0KLS8qIFRoaXMgZGVjaWRlcyB3aGVyZSB0aGUga2VybmVsIHdpbGwgc2VhcmNoIGZvciBhIGZyZWUgY2h1bmsgb2Ygdm0KLSAqIHNwYWNlIGR1cmluZyBtbWFwJ3MuCi0gKi8KLSNkZWZpbmUgVEFTS19VTk1BUFBFRF9CQVNFCShUQVNLX1NJWkUgLyAyKQotCi0jZGVmaW5lIElOSVRfVEhSRUFEICBcCi17CQkJCQkJCQkJXAotCXJhOgkJMCwgCQkJCQkJXAotCXNwOgkJc2l6ZW9mKGluaXRfc3RhY2spICsgKGxvbmcpICZpbml0X3N0YWNrLAlcCi0JY3VycmVudF9kczoJezB9LAkJCQkJCVwKLQkvKmluZm86CQl7MH0sICovCQkJCQkJXAotCWJhZF92YWRkcjoJMCwJCQkJCQlcCi0JYmFkX3VhZGRyOgkwLAkJCQkJCVwKLQllcnJvcl9jb2RlOgkwLAkJCQkJCVwKLX0KLQotCi0vKgotICogRG8gbmVjZXNzYXJ5IHNldHVwIHRvIHN0YXJ0IHVwIGEgbmV3bHkgZXhlY3V0ZWQgdGhyZWFkLgotICogTm90ZTogV2Ugc2V0LXVwIHBzIGFzIGlmIHdlIGRpZCBhIGNhbGw0IHRvIHRoZSBuZXcgcGMuCi0gKiAgICAgICBzZXRfdGhyZWFkX3N0YXRlIGluIHNpZ25hbC5jIGRlcGVuZHMgb24gaXQuCi0gKi8KLSNkZWZpbmUgVVNFUl9QU19WQUxVRSAoKDEgPDwgUFNfV09FX0JJVCkgfAkJCQlcCi0gICAgICAgICAgICAgICAgICAgICAgICgxIDw8IFBTX0NBTExJTkNfU0hJRlQpIHwJCQlcCi0gICAgICAgICAgICAgICAgICAgICAgIChVU0VSX1JJTkcgPDwgUFNfUklOR19TSElGVCkgfAkJCVwKLSAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgUFNfVU1fQklUKSB8CQkJCVwKLSAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgUFNfRVhDTV9CSVQpKQotCi0vKiBDbGVhcmluZyBhMCB0ZXJtaW5hdGVzIHRoZSBiYWNrdHJhY2UuICovCi0jZGVmaW5lIHN0YXJ0X3RocmVhZChyZWdzLCBuZXdfcGMsIG5ld19zcCkgXAotCXJlZ3MtPnBjID0gbmV3X3BjOyBcCi0JcmVncy0+cHMgPSBVU0VSX1BTX1ZBTFVFOyBcCi0JcmVncy0+YXJlZ1sxXSA9IG5ld19zcDsgXAotCXJlZ3MtPmFyZWdbMF0gPSAwOyBcCi0JcmVncy0+d21hc2sgPSAxOyBcCi0JcmVncy0+ZGVwYyA9IDA7IFwKLQlyZWdzLT53aW5kb3diYXNlID0gMDsgXAotCXJlZ3MtPndpbmRvd3N0YXJ0ID0gMTsKLQotLyogRm9yd2FyZCBkZWNsYXJhdGlvbiAqLwotc3RydWN0IHRhc2tfc3RydWN0Owotc3RydWN0IG1tX3N0cnVjdDsKLQotLyogRnJlZSBhbGwgcmVzb3VyY2VzIGhlbGQgYnkgYSB0aHJlYWQuICovCi0jZGVmaW5lIHJlbGVhc2VfdGhyZWFkKHRocmVhZCkgZG8geyB9IHdoaWxlKDApCi0KLS8qIFByZXBhcmUgdG8gY29weSB0aHJlYWQgc3RhdGUgLSB1bmxhenkgYWxsIGxhenkgc3RhdHVzICovCi1leHRlcm4gdm9pZCBwcmVwYXJlX3RvX2NvcHkoc3RydWN0IHRhc2tfc3RydWN0Kik7Ci0KLS8qIENyZWF0ZSBhIGtlcm5lbCB0aHJlYWQgd2l0aG91dCByZW1vdmluZyBpdCBmcm9tIHRhc2tsaXN0cyAqLwotZXh0ZXJuIGludCBrZXJuZWxfdGhyZWFkKGludCAoKmZuKSh2b2lkICopLCB2b2lkICogYXJnLCB1bnNpZ25lZCBsb25nIGZsYWdzKTsKLQotLyogQ29weSBhbmQgcmVsZWFzZSBhbGwgc2VnbWVudCBpbmZvIGFzc29jaWF0ZWQgd2l0aCBhIFZNICovCi0jZGVmaW5lIGNvcHlfc2VnbWVudHMocCwgbW0pCWRvIHsgfSB3aGlsZSgwKQotI2RlZmluZSByZWxlYXNlX3NlZ21lbnRzKG1tKQlkbyB7IH0gd2hpbGUoMCkKLSNkZWZpbmUgZm9yZ2V0X3NlZ21lbnRzKCkJZG8geyB9IHdoaWxlICgwKQotCi0jZGVmaW5lIHRocmVhZF9zYXZlZF9wYyh0c2spCSh0YXNrX3B0X3JlZ3ModHNrKS0+cGMpCi0KLWV4dGVybiB1bnNpZ25lZCBsb25nIGdldF93Y2hhbihzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApOwotCi0jZGVmaW5lIEtTVEtfRUlQKHRzaykJCSh0YXNrX3B0X3JlZ3ModHNrKS0+cGMpCi0jZGVmaW5lIEtTVEtfRVNQKHRzaykJCSh0YXNrX3B0X3JlZ3ModHNrKS0+YXJlZ1sxXSkKLQotI2RlZmluZSBjcHVfcmVsYXgoKSAgYmFycmllcigpCi0KLS8qIFNwZWNpYWwgcmVnaXN0ZXIgYWNjZXNzLiAqLwotCi0jZGVmaW5lIFdTUih2LHNyKSBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIndzciAlMCwiX19zdHJpbmdpZnkoc3IpIDo6ICJhIih2KSk7Ci0jZGVmaW5lIFJTUih2LHNyKSBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoInJzciAlMCwiX19zdHJpbmdpZnkoc3IpIDogIj1hIih2KSk7Ci0KLSNkZWZpbmUgc2V0X3NyKHgsc3IpICh7dW5zaWduZWQgaW50IHY9KHVuc2lnbmVkIGludCl4OyBXU1Iodixzcik7fSkKLSNkZWZpbmUgZ2V0X3NyKHNyKSAoe3Vuc2lnbmVkIGludCB2OyBSU1Iodixzcik7IHY7IH0pCi0KLSNlbmRpZgkvKiBfX0FTU0VNQkxZX18gKi8KLSNlbmRpZgkvKiBfWFRFTlNBX1BST0NFU1NPUl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2EvcHRyYWNlLmggYi9pbmNsdWRlL2FzbS14dGVuc2EvcHRyYWNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4OWIwZGIuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hc20teHRlbnNhL3B0cmFjZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTM1ICswLDAgQEAKLS8qCi0gKiBpbmNsdWRlL2FzbS14dGVuc2EvcHRyYWNlLmgKLSAqCi0gKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQotICogZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDEgLSAyMDA1IFRlbnNpbGljYSBJbmMuCi0gKi8KLQotI2lmbmRlZiBfWFRFTlNBX1BUUkFDRV9ICi0jZGVmaW5lIF9YVEVOU0FfUFRSQUNFX0gKLQotLyoKLSAqIEtlcm5lbCBzdGFjawotICoKLSAqIAkJKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKyAgLS0tLS0tLS0gU1RBQ0tfU0laRQotICogCQl8ICAgICByZWdpc3RlciBmaWxlICAgICB8ICB8Ci0gKiAJCSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsgIHwKLSAqIAkJfCAgICBzdHJ1Y3QgcHRfcmVncyAgICAgfCAgfAotICogCQkrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rICB8IC0tLS0tLSBQVF9SRUdTX09GRlNFVAotICogZG91YmxlIAk6ICAxNiBieXRlcyBzcGlsbCBhcmVhICA6ICB8ICBeCi0gKiBleGNldGlvbiAJOi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtOiAgfCAgfAotICogZnJhbWUJOiAgICBzdHJ1Y3QgcHRfcmVncyAgICAgOiAgfCAgfAotICogCQk6LSAtIC0gLSAtIC0gLSAtIC0gLSAtIC06ICB8ICB8Ci0gKiAJCXwgICAgICAgICAgICAgICAgICAgICAgIHwgIHwgIHwKLSAqIAkJfCAgICAgbWVtb3J5IHN0YWNrICAgICAgfCAgfCAgfAotICogCQl8ICAgICAgICAgICAgICAgICAgICAgICB8ICB8ICB8Ci0gKiAJCX4gICAgICAgICAgICAgICAgICAgICAgIH4gIH4gIH4KLSAqIAkJfiAgICAgICAgICAgICAgICAgICAgICAgfiAgfiAgfgotICogCQl8ICAgICAgICAgICAgICAgICAgICAgICB8ICB8ICB8Ci0gKiAJCXwgICAgICAgICAgICAgICAgICAgICAgIHwgIHwgIHwKLSAqIAkJKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKyAgfCAgfCAtLS0gU1RBQ0tfQklBUwotICogCQl8ICBzdHJ1Y3QgdGFza19zdHJ1Y3QgICB8ICB8ICB8ICBeCi0gKiAgY3VycmVudCAtLT4gKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKyAgfCAgfCAgfAotICogCQl8ICBzdHJ1Y3QgdGhyZWFkX2luZm8gICB8ICB8ICB8ICB8Ci0gKgkJKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKyAtLS0tLS0tLQotICovCi0KLSNkZWZpbmUgS0VSTkVMX1NUQUNLX1NJWkUgKDIgKiBQQUdFX1NJWkUpCi0KLS8qICBPZmZzZXRzIGZvciBleGNlcHRpb25faGFuZGxlcnNbXSAoMyB4IDY0LWVudHJpZXMgeCA0LWJ5dGUgdGFibGVzKS4gKi8KLQotI2RlZmluZSBFWENfVEFCTEVfS1NUSwkJMHgwMDQJLyogS2VybmVsIFN0YWNrICovCi0jZGVmaW5lIEVYQ19UQUJMRV9ET1VCTEVfU0FWRQkweDAwOAkvKiBEb3VibGUgZXhjZXB0aW9uIHNhdmUgYXJlYSBmb3IgYTAgKi8KLSNkZWZpbmUgRVhDX1RBQkxFX0ZJWFVQCQkweDAwYwkvKiBGaXh1cCBoYW5kbGVyICovCi0jZGVmaW5lIEVYQ19UQUJMRV9QQVJBTQkJMHgwMTAJLyogRm9yIHBhc3NpbmcgYSBwYXJhbWV0ZXIgdG8gZml4dXAgKi8KLSNkZWZpbmUgRVhDX1RBQkxFX1NZU0NBTExfU0FWRQkweDAxNAkvKiBGb3IgZmFzdCBzeXNjYWxsIGhhbmRsZXIgKi8KLSNkZWZpbmUgRVhDX1RBQkxFX0ZBU1RfVVNFUgkweDEwMAkvKiBGYXN0IHVzZXIgZXhjZXB0aW9uIGhhbmRsZXIgKi8KLSNkZWZpbmUgRVhDX1RBQkxFX0ZBU1RfS0VSTkVMCTB4MjAwCS8qIEZhc3Qga2VybmVsIGV4Y2VwdGlvbiBoYW5kbGVyICovCi0jZGVmaW5lIEVYQ19UQUJMRV9ERUZBVUxUCTB4MzAwCS8qIERlZmF1bHQgQy1IYW5kbGVyICovCi0jZGVmaW5lIEVYQ19UQUJMRV9TSVpFCQkweDQwMAotCi0vKiBSZWdpc3RlcnMgdXNlZCBieSBzdHJhY2UgKi8KLQotI2RlZmluZSBSRUdfQV9CQVNFCTB4MDAwMAotI2RlZmluZSBSRUdfQVJfQkFTRQkweDAxMDAKLSNkZWZpbmUgUkVHX1BDCQkweDAwMjAKLSNkZWZpbmUgUkVHX1BTCQkweDAyZTYKLSNkZWZpbmUgUkVHX1dCCQkweDAyNDgKLSNkZWZpbmUgUkVHX1dTCQkweDAyNDkKLSNkZWZpbmUgUkVHX0xCRUcJMHgwMjAwCi0jZGVmaW5lIFJFR19MRU5ECTB4MDIwMQotI2RlZmluZSBSRUdfTENPVU5UCTB4MDIwMgotI2RlZmluZSBSRUdfU0FSCQkweDAyMDMKLQotI2RlZmluZSBTWVNDQUxMX05SCTB4MDBmZgotCi0vKiBPdGhlciBQVFJBQ0VfIHZhbHVlcyBkZWZpbmVkIGluIDxsaW51eC9wdHJhY2UuaD4gdXNpbmcgdmFsdWVzIDAtOSwxNiwxNywyNCAqLwotCi0jZGVmaW5lIFBUUkFDRV9HRVRSRUdTCQkxMgotI2RlZmluZSBQVFJBQ0VfU0VUUkVHUwkJMTMKLSNkZWZpbmUgUFRSQUNFX0dFVFhUUkVHUwkxOAotI2RlZmluZSBQVFJBQ0VfU0VUWFRSRUdTCTE5Ci0KLSNpZmRlZiBfX0tFUk5FTF9fCi0KLSNpZm5kZWYgX19BU1NFTUJMWV9fCi0KLS8qCi0gKiBUaGlzIHN0cnVjdCBkZWZpbmVzIHRoZSB3YXkgdGhlIHJlZ2lzdGVycyBhcmUgc3RvcmVkIG9uIHRoZQotICoga2VybmVsIHN0YWNrIGR1cmluZyBhIHN5c3RlbSBjYWxsIG9yIG90aGVyIGtlcm5lbCBlbnRyeS4KLSAqLwotc3RydWN0IHB0X3JlZ3MgewotCXVuc2lnbmVkIGxvbmcgcGM7CQkvKiAgIDQgKi8KLQl1bnNpZ25lZCBsb25nIHBzOwkJLyogICA4ICovCi0JdW5zaWduZWQgbG9uZyBkZXBjOwkJLyogIDEyICovCi0JdW5zaWduZWQgbG9uZyBleGNjYXVzZTsJCS8qICAxNiAqLwotCXVuc2lnbmVkIGxvbmcgZXhjdmFkZHI7CQkvKiAgMjAgKi8KLQl1bnNpZ25lZCBsb25nIGRlYnVnY2F1c2U7CS8qICAyNCAqLwotCXVuc2lnbmVkIGxvbmcgd21hc2s7CQkvKiAgMjggKi8KLQl1bnNpZ25lZCBsb25nIGxiZWc7CQkvKiAgMzIgKi8KLQl1bnNpZ25lZCBsb25nIGxlbmQ7CQkvKiAgMzYgKi8KLQl1bnNpZ25lZCBsb25nIGxjb3VudDsJCS8qICA0MCAqLwotCXVuc2lnbmVkIGxvbmcgc2FyOwkJLyogIDQ0ICovCi0JdW5zaWduZWQgbG9uZyB3aW5kb3diYXNlOwkvKiAgNDggKi8KLQl1bnNpZ25lZCBsb25nIHdpbmRvd3N0YXJ0OwkvKiAgNTIgKi8KLQl1bnNpZ25lZCBsb25nIHN5c2NhbGw7CQkvKiAgNTYgKi8KLQl1bnNpZ25lZCBsb25nIGljb3VudGxldmVsOwkvKiAgNjAgKi8KLQlpbnQgcmVzZXJ2ZWRbMV07CQkvKiAgNjQgKi8KLQotCS8qIEFkZGl0aW9uYWwgY29uZmlndXJhYmxlIHJlZ2lzdGVycyB0aGF0IGFyZSB1c2VkIGJ5IHRoZSBjb21waWxlci4gKi8KLQl4dHJlZ3Nfb3B0X3QgeHRyZWdzX29wdDsKLQotCS8qIE1ha2Ugc3VyZSB0aGUgYXJlZyBmaWVsZCBpcyAxNiBieXRlcyBhbGlnbmVkLiAqLwotCWludCBhbGlnblswXSBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCgxNikpKTsKLQotCS8qIGN1cnJlbnQgcmVnaXN0ZXIgZnJhbWUuCi0JICogTm90ZTogVGhlIEVTRiBmb3Iga2VybmVsIGV4Y2VwdGlvbnMgZW5kcyBhZnRlciAxNiByZWdpc3RlcnMhCi0JICovCi0JdW5zaWduZWQgbG9uZyBhcmVnWzE2XTsJCS8qIDEyOCAoNjQpICovCi19OwotCi0jaW5jbHVkZSA8YXNtL3ZhcmlhbnQvY29yZS5oPgotCi0jIGRlZmluZSB0YXNrX3B0X3JlZ3ModHNrKSAoKHN0cnVjdCBwdF9yZWdzKikgXAotICAodGFza19zdGFja19wYWdlKHRzaykgKyBLRVJORUxfU1RBQ0tfU0laRSAtIChYQ0hBTF9OVU1fQVJFR1MtMTYpKjQpIC0gMSkKLSMgZGVmaW5lIHVzZXJfbW9kZShyZWdzKSAoKChyZWdzKS0+cHMgJiAweDAwMDAwMDIwKSE9MCkKLSMgZGVmaW5lIGluc3RydWN0aW9uX3BvaW50ZXIocmVncykgKChyZWdzKS0+cGMpCi1leHRlcm4gdm9pZCBzaG93X3JlZ3Moc3RydWN0IHB0X3JlZ3MgKik7Ci0KLSMgaWZuZGVmIENPTkZJR19TTVAKLSMgIGRlZmluZSBwcm9maWxlX3BjKHJlZ3MpIGluc3RydWN0aW9uX3BvaW50ZXIocmVncykKLSMgZW5kaWYKLQotI2Vsc2UJLyogX19BU1NFTUJMWV9fICovCi0KLSMgaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+Ci0jZGVmaW5lIFBUX1JFR1NfT0ZGU0VUCSAgKEtFUk5FTF9TVEFDS19TSVpFIC0gUFRfVVNFUl9TSVpFKQotCi0jZW5kaWYJLyogIV9fQVNTRU1CTFlfXyAqLwotCi0jZW5kaWYgIC8qIF9fS0VSTkVMX18gKi8KLQotI2VuZGlmCS8qIF9YVEVOU0FfUFRSQUNFX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9zZXJpYWwuaCBiL2luY2x1ZGUvYXNtLXh0ZW5zYS9zZXJpYWwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWMwNDExNC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FzbS14dGVuc2Evc2VyaWFsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0vKgotICogaW5jbHVkZS9hc20teHRlbnNhL3NlcmlhbC5oCi0gKgotICogQ29uZmlndXJhdGlvbiBkZXRhaWxzIGZvciA4MjUwLCAxNjQ1MCwgMTY1NTAsIGV0Yy4gc2VyaWFsIHBvcnRzCi0gKgotICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKLSAqIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDAxIC0gMjAwNSBUZW5zaWxpY2EgSW5jLgotICovCi0KLSNpZm5kZWYgX1hURU5TQV9TRVJJQUxfSAotI2RlZmluZSBfWFRFTlNBX1NFUklBTF9ICi0KLSNpbmNsdWRlIDxhc20vcGxhdGZvcm0vc2VyaWFsLmg+Ci0KLSNlbmRpZgkvKiBfWFRFTlNBX1NFUklBTF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2EvdW5hbGlnbmVkLmggYi9pbmNsdWRlL2FzbS14dGVuc2EvdW5hbGlnbmVkLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmMzQyNGYuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hc20teHRlbnNhL3VuYWxpZ25lZC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoKLSAqIFh0ZW5zYSBkb2Vzbid0IGhhbmRsZSB1bmFsaWduZWQgYWNjZXNzZXMgZWZmaWNpZW50bHkuCi0gKgotICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKLSAqIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDAxIC0gMjAwNSBUZW5zaWxpY2EgSW5jLgotICovCi0jaWZuZGVmIF9BU01fWFRFTlNBX1VOQUxJR05FRF9ICi0jZGVmaW5lIF9BU01fWFRFTlNBX1VOQUxJR05FRF9ICi0KLSNpZmRlZiBfX1hURU5TQV9FTF9fCi0jIGluY2x1ZGUgPGxpbnV4L3VuYWxpZ25lZC9sZV9tZW1tb3ZlLmg+Ci0jIGluY2x1ZGUgPGxpbnV4L3VuYWxpZ25lZC9iZV9ieXRlc2hpZnQuaD4KLSMgaW5jbHVkZSA8bGludXgvdW5hbGlnbmVkL2dlbmVyaWMuaD4KLSMgZGVmaW5lIGdldF91bmFsaWduZWQJX19nZXRfdW5hbGlnbmVkX2xlCi0jIGRlZmluZSBwdXRfdW5hbGlnbmVkCV9fcHV0X3VuYWxpZ25lZF9sZQotI2VsaWYgZGVmaW5lZChfX1hURU5TQV9FQl9fKQotIyBpbmNsdWRlIDxsaW51eC91bmFsaWduZWQvYmVfbWVtbW92ZS5oPgotIyBpbmNsdWRlIDxsaW51eC91bmFsaWduZWQvbGVfYnl0ZXNoaWZ0Lmg+Ci0jIGluY2x1ZGUgPGxpbnV4L3VuYWxpZ25lZC9nZW5lcmljLmg+Ci0jIGRlZmluZSBnZXRfdW5hbGlnbmVkCV9fZ2V0X3VuYWxpZ25lZF9iZQotIyBkZWZpbmUgcHV0X3VuYWxpZ25lZAlfX3B1dF91bmFsaWduZWRfYmUKLSNlbHNlCi0jIGVycm9yIHByb2Nlc3NvciBieXRlIG9yZGVyIHVuZGVmaW5lZCEKLSNlbmRpZgotCi0jZW5kaWYJLyogX0FTTV9YVEVOU0FfVU5BTElHTkVEX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZHJtL2RybV9jcnRjLmggYi9pbmNsdWRlL2RybS9kcm1fY3J0Yy5oCmluZGV4IDBhY2IwN2YuLjQ3ODA5YWMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvZHJtL2RybV9jcnRjLmgKKysrIGIvaW5jbHVkZS9kcm0vZHJtX2NydGMuaApAQCAtMzk1LDcgKzM5NSw3IEBACiAJdm9pZCAoKnNhdmUpKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IpOwogCXZvaWQgKCpyZXN0b3JlKShzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yKTsKIAllbnVtIGRybV9jb25uZWN0b3Jfc3RhdHVzICgqZGV0ZWN0KShzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yKTsKLQl2b2lkICgqZmlsbF9tb2Rlcykoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvciwgdWludDMyX3QgbWF4X3dpZHRoLCB1aW50MzJfdCBtYXhfaGVpZ2h0KTsKKwlpbnQgKCpmaWxsX21vZGVzKShzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yLCB1aW50MzJfdCBtYXhfd2lkdGgsIHVpbnQzMl90IG1heF9oZWlnaHQpOwogCWludCAoKnNldF9wcm9wZXJ0eSkoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3Rvciwgc3RydWN0IGRybV9wcm9wZXJ0eSAqcHJvcGVydHksCiAJCQkgICAgIHVpbnQ2NF90IHZhbCk7CiAJdm9pZCAoKmRlc3Ryb3kpKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kcm0vZHJtX2NydGNfaGVscGVyLmggYi9pbmNsdWRlL2RybS9kcm1fY3J0Y19oZWxwZXIuaAppbmRleCA0YmMwNGNmLi4wYzZmMGUxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2RybS9kcm1fY3J0Y19oZWxwZXIuaAorKysgYi9pbmNsdWRlL2RybS9kcm1fY3J0Y19oZWxwZXIuaApAQCAtODgsNyArODgsNyBAQAogCXN0cnVjdCBkcm1fZW5jb2RlciAqKCpiZXN0X2VuY29kZXIpKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IpOwogfTsKIAotZXh0ZXJuIHZvaWQgZHJtX2hlbHBlcl9wcm9iZV9zaW5nbGVfY29ubmVjdG9yX21vZGVzKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IsIHVpbnQzMl90IG1heFgsIHVpbnQzMl90IG1heFkpOworZXh0ZXJuIGludCBkcm1faGVscGVyX3Byb2JlX3NpbmdsZV9jb25uZWN0b3JfbW9kZXMoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvciwgdWludDMyX3QgbWF4WCwgdWludDMyX3QgbWF4WSk7CiBleHRlcm4gdm9pZCBkcm1faGVscGVyX2Rpc2FibGVfdW51c2VkX2Z1bmN0aW9ucyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKIGV4dGVybiBpbnQgZHJtX2hlbHBlcl9ob3RwbHVnX3N0YWdlX3R3byhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKIGV4dGVybiBib29sIGRybV9oZWxwZXJfaW5pdGlhbF9jb25maWcoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgYm9vbCBjYW5fZ3Jvdyk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L0tidWlsZCBiL2luY2x1ZGUvbGludXgvS2J1aWxkCmluZGV4IGEzMzIzZjMuLjEyZTlhMjkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvS2J1aWxkCisrKyBiL2luY2x1ZGUvbGludXgvS2J1aWxkCkBAIC0zNzEsMyArMzcxLDUgQEAKIHVuaWZkZWYteSArPSB4ZnJtLmgKIAogb2JqaGRyLXkgKz0gdmVyc2lvbi5oCitoZWFkZXIteSArPSB3aW1heC5oCitoZWFkZXIteSArPSB3aW1heC8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYWNwaS5oIGIvaW5jbHVkZS9saW51eC9hY3BpLmgKaW5kZXggZmJhODA1MS4uNmZjZTJmYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9hY3BpLmgKKysrIGIvaW5jbHVkZS9saW51eC9hY3BpLmgKQEAgLTEzMSwyMiArMTMxLDYgQEAKICAqLwogdm9pZCBhY3BpX3VucmVnaXN0ZXJfZ3NpICh1MzIgZ3NpKTsKIAotc3RydWN0IGFjcGlfcHJ0X2VudHJ5IHsKLQlzdHJ1Y3QgbGlzdF9oZWFkCW5vZGU7Ci0Jc3RydWN0IGFjcGlfcGNpX2lkCWlkOwotCXU4CQkJcGluOwotCXN0cnVjdCB7Ci0JCWFjcGlfaGFuZGxlCQloYW5kbGU7Ci0JCXUzMgkJCWluZGV4OwotCX0JCQlsaW5rOwotCXUzMgkJCWlycTsKLX07Ci0KLXN0cnVjdCBhY3BpX3BydF9saXN0IHsKLQlpbnQJCQljb3VudDsKLQlzdHJ1Y3QgbGlzdF9oZWFkCWVudHJpZXM7Ci19OwotCiBzdHJ1Y3QgcGNpX2RldjsKIAogaW50IGFjcGlfcGNpX2lycV9lbmFibGUgKHN0cnVjdCBwY2lfZGV2ICpkZXYpOwpAQCAtMjcwLDYgKzI1NCw3IEBACiAjaWZkZWYgQ09ORklHX1BNX1NMRUVQCiB2b2lkIF9faW5pdCBhY3BpX25vX3M0X2h3X3NpZ25hdHVyZSh2b2lkKTsKIHZvaWQgX19pbml0IGFjcGlfb2xkX3N1c3BlbmRfb3JkZXJpbmcodm9pZCk7Cit2b2lkIF9faW5pdCBhY3BpX3M0X25vX252cyh2b2lkKTsKICNlbmRpZiAvKiBDT05GSUdfUE1fU0xFRVAgKi8KICNlbHNlCS8qIENPTkZJR19BQ1BJICovCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYWdwZ2FydC5oIGIvaW5jbHVkZS9saW51eC9hZ3BnYXJ0LmgKaW5kZXggYzhmZGI2ZS4uMTEwYzYwMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9hZ3BnYXJ0LmgKKysrIGIvaW5jbHVkZS9saW51eC9hZ3BnYXJ0LmgKQEAgLTUyLDcgKzUyLDYgQEAKIAogI2lmbmRlZiBfX0tFUk5FTF9fCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxhc20vdHlwZXMuaD4KIAogc3RydWN0IGFncF92ZXJzaW9uIHsKIAlfX3UxNiBtYWpvcjsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYXN5bmMuaCBiL2luY2x1ZGUvbGludXgvYXN5bmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNGVjYWNkCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9hc3luYy5oCkBAIC0wLDAgKzEsMjUgQEAKKy8qCisgKiBhc3luYy5oOiBBc3luY2hyb25vdXMgZnVuY3Rpb24gY2FsbHMgZm9yIGJvb3QgcGVyZm9ybWFuY2UKKyAqCisgKiAoQykgQ29weXJpZ2h0IDIwMDkgSW50ZWwgQ29ycG9yYXRpb24KKyAqIEF1dGhvcjogQXJqYW4gdmFuIGRlIFZlbiA8YXJqYW5AbGludXguaW50ZWwuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgdmVyc2lvbiAyCisgKiBvZiB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisKK3R5cGVkZWYgdTY0IGFzeW5jX2Nvb2tpZV90OwordHlwZWRlZiB2b2lkIChhc3luY19mdW5jX3B0cikgKHZvaWQgKmRhdGEsIGFzeW5jX2Nvb2tpZV90IGNvb2tpZSk7CisKK2V4dGVybiBhc3luY19jb29raWVfdCBhc3luY19zY2hlZHVsZShhc3luY19mdW5jX3B0ciAqcHRyLCB2b2lkICpkYXRhKTsKK2V4dGVybiBhc3luY19jb29raWVfdCBhc3luY19zY2hlZHVsZV9zcGVjaWFsKGFzeW5jX2Z1bmNfcHRyICpwdHIsIHZvaWQgKmRhdGEsIHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QpOworZXh0ZXJuIHZvaWQgYXN5bmNfc3luY2hyb25pemVfZnVsbCh2b2lkKTsKK2V4dGVybiB2b2lkIGFzeW5jX3N5bmNocm9uaXplX2Z1bGxfc3BlY2lhbChzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0KTsKK2V4dGVybiB2b2lkIGFzeW5jX3N5bmNocm9uaXplX2Nvb2tpZShhc3luY19jb29raWVfdCBjb29raWUpOworZXh0ZXJuIHZvaWQgYXN5bmNfc3luY2hyb25pemVfY29va2llX3NwZWNpYWwoYXN5bmNfY29va2llX3QgY29va2llLCBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0KTsKKwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9hc3luY190eC5oIGIvaW5jbHVkZS9saW51eC9hc3luY190eC5oCmluZGV4IDBmNTBkNGMuLjQ1ZjYyOTcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvYXN5bmNfdHguaAorKysgYi9pbmNsdWRlL2xpbnV4L2FzeW5jX3R4LmgKQEAgLTU5LDkgKzU5LDcgQEAKIH07CiAKICNpZmRlZiBDT05GSUdfRE1BX0VOR0lORQotdm9pZCBhc3luY190eF9pc3N1ZV9wZW5kaW5nX2FsbCh2b2lkKTsKLWVudW0gZG1hX3N0YXR1cyBkbWFfd2FpdF9mb3JfYXN5bmNfdHgoc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICp0eCk7Ci12b2lkIGFzeW5jX3R4X3J1bl9kZXBlbmRlbmNpZXMoc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICp0eCk7CisjZGVmaW5lIGFzeW5jX3R4X2lzc3VlX3BlbmRpbmdfYWxsIGRtYV9pc3N1ZV9wZW5kaW5nX2FsbAogI2lmZGVmIENPTkZJR19BUkNIX0hBU19BU1lOQ19UWF9GSU5EX0NIQU5ORUwKICNpbmNsdWRlIDxhc20vYXN5bmNfdHguaD4KICNlbHNlCkBAIC03NywxOSArNzUsNiBAQAogCWRvIHsgfSB3aGlsZSAoMCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgZW51bSBkbWFfc3RhdHVzCi1kbWFfd2FpdF9mb3JfYXN5bmNfdHgoc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICp0eCkKLXsKLQlyZXR1cm4gRE1BX1NVQ0NFU1M7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZAotYXN5bmNfdHhfcnVuX2RlcGVuZGVuY2llcyhzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKnR4LAotCXN0cnVjdCBkbWFfY2hhbiAqaG9zdF9jaGFuKQotewotCWRvIHsgfSB3aGlsZSAoMCk7Ci19Ci0KIHN0YXRpYyBpbmxpbmUgc3RydWN0IGRtYV9jaGFuICoKIGFzeW5jX3R4X2ZpbmRfY2hhbm5lbChzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKmRlcGVuZF90eCwKIAllbnVtIGRtYV90cmFuc2FjdGlvbl90eXBlIHR4X3R5cGUsIHN0cnVjdCBwYWdlICoqZHN0LCBpbnQgZHN0X2NvdW50LApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9hdG1faWR0NzcxMDUuaCBiL2luY2x1ZGUvbGludXgvYXRtX2lkdDc3MTA1LmgKaW5kZXggMDU2MjFjZi4uOGI3MjQwMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9hdG1faWR0NzcxMDUuaAorKysgYi9pbmNsdWRlL2xpbnV4L2F0bV9pZHQ3NzEwNS5oCkBAIC03LDcgKzcsNyBAQAogI2lmbmRlZiBMSU5VWF9BVE1fSURUNzcxMDVfSAogI2RlZmluZSBMSU5VWF9BVE1fSURUNzcxMDVfSAogCi0jaW5jbHVkZSA8YXNtL3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9hdG1pb2MuaD4KICNpbmNsdWRlIDxsaW51eC9hdG1kZXYuaD4KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9hdG1lbC1tY2kuaCBiL2luY2x1ZGUvbGludXgvYXRtZWwtbWNpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmYxZjk1NwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvYXRtZWwtbWNpLmgKQEAgLTAsMCArMSwzOSBAQAorI2lmbmRlZiBfX0xJTlVYX0FUTUVMX01DSV9ICisjZGVmaW5lIF9fTElOVVhfQVRNRUxfTUNJX0gKKworI2RlZmluZSBBVE1FTF9NQ0lfTUFYX05SX1NMT1RTCTIKKworI2luY2x1ZGUgPGxpbnV4L2R3X2RtYWMuaD4KKworLyoqCisgKiBzdHJ1Y3QgbWNpX3Nsb3RfcGRhdGEgLSBib2FyZC1zcGVjaWZpYyBwZXItc2xvdCBjb25maWd1cmF0aW9uCisgKiBAYnVzX3dpZHRoOiBOdW1iZXIgb2YgZGF0YSBsaW5lcyB3aXJlZCB1cCB0aGUgc2xvdAorICogQGRldGVjdF9waW46IEdQSU8gcGluIHdpcmVkIHRvIHRoZSBjYXJkIGRldGVjdCBzd2l0Y2gKKyAqIEB3cF9waW46IEdQSU8gcGluIHdpcmVkIHRvIHRoZSB3cml0ZSBwcm90ZWN0IHNlbnNvcgorICoKKyAqIElmIGEgZ2l2ZW4gc2xvdCBpcyBub3QgcHJlc2VudCBvbiB0aGUgYm9hcmQsIEBidXNfd2lkdGggc2hvdWxkIGJlCisgKiBzZXQgdG8gMC4gVGhlIG90aGVyIGZpZWxkcyBhcmUgaWdub3JlZCBpbiB0aGlzIGNhc2UuCisgKgorICogQW55IHBpbnMgdGhhdCBhcmVuJ3QgYXZhaWxhYmxlIHNob3VsZCBiZSBzZXQgdG8gYSBuZWdhdGl2ZSB2YWx1ZS4KKyAqCisgKiBOb3RlIHRoYXQgc3VwcG9ydCBmb3IgbXVsdGlwbGUgc2xvdHMgaXMgZXhwZXJpbWVudGFsIC0tIHNvbWUgY2FyZHMKKyAqIG1pZ2h0IGdldCB1cHNldCBpZiB3ZSBkb24ndCBnZXQgdGhlIGNsb2NrIG1hbmFnZW1lbnQgZXhhY3RseSByaWdodC4KKyAqIEJ1dCBpbiBtb3N0IGNhc2VzLCBpdCBzaG91bGQgd29yayBqdXN0IGZpbmUuCisgKi8KK3N0cnVjdCBtY2lfc2xvdF9wZGF0YSB7CisJdW5zaWduZWQgaW50CQlidXNfd2lkdGg7CisJaW50CQkJZGV0ZWN0X3BpbjsKKwlpbnQJCQl3cF9waW47Cit9OworCisvKioKKyAqIHN0cnVjdCBtY2lfcGxhdGZvcm1fZGF0YSAtIGJvYXJkLXNwZWNpZmljIE1NQy9TRGNhcmQgY29uZmlndXJhdGlvbgorICogQGRtYV9zbGF2ZTogRE1BIHNsYXZlIGludGVyZmFjZSB0byB1c2UgaW4gZGF0YSB0cmFuc2ZlcnMuCisgKiBAc2xvdDogUGVyLXNsb3QgY29uZmlndXJhdGlvbiBkYXRhLgorICovCitzdHJ1Y3QgbWNpX3BsYXRmb3JtX2RhdGEgeworCXN0cnVjdCBkd19kbWFfc2xhdmUJZG1hX3NsYXZlOworCXN0cnVjdCBtY2lfc2xvdF9wZGF0YQlzbG90W0FUTUVMX01DSV9NQVhfTlJfU0xPVFNdOworfTsKKworI2VuZGlmIC8qIF9fTElOVVhfQVRNRUxfTUNJX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYXV4dmVjLmggYi9pbmNsdWRlL2xpbnV4L2F1eHZlYy5oCmluZGV4IGQ3YWZhOWQuLmYzYjVkNGUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvYXV4dmVjLmgKKysrIGIvaW5jbHVkZS9saW51eC9hdXh2ZWMuaApAQCAtMjMsMTYgKzIzLDE2IEBACiAjZGVmaW5lIEFUX1BMQVRGT1JNIDE1ICAvKiBzdHJpbmcgaWRlbnRpZnlpbmcgQ1BVIGZvciBvcHRpbWl6YXRpb25zICovCiAjZGVmaW5lIEFUX0hXQ0FQICAxNiAgICAvKiBhcmNoIGRlcGVuZGVudCBoaW50cyBhdCBDUFUgY2FwYWJpbGl0aWVzICovCiAjZGVmaW5lIEFUX0NMS1RDSyAxNwkvKiBmcmVxdWVuY3kgYXQgd2hpY2ggdGltZXMoKSBpbmNyZW1lbnRzICovCi0KKy8qIEFUXyogdmFsdWVzIDE4IHRocm91Z2ggMjIgYXJlIHJlc2VydmVkICovCiAjZGVmaW5lIEFUX1NFQ1VSRSAyMyAgIC8qIHNlY3VyZSBtb2RlIGJvb2xlYW4gKi8KLQogI2RlZmluZSBBVF9CQVNFX1BMQVRGT1JNIDI0CS8qIHN0cmluZyBpZGVudGlmeWluZyByZWFsIHBsYXRmb3JtLCBtYXkKIAkJCQkgKiBkaWZmZXIgZnJvbSBBVF9QTEFURk9STS4gKi8KKyNkZWZpbmUgQVRfUkFORE9NIDI1CS8qIGFkZHJlc3Mgb2YgMTYgcmFuZG9tIGJ5dGVzICovCiAKICNkZWZpbmUgQVRfRVhFQ0ZOICAzMQkvKiBmaWxlbmFtZSBvZiBwcm9ncmFtICovCiAKICNpZmRlZiBfX0tFUk5FTF9fCi0jZGVmaW5lIEFUX1ZFQ1RPUl9TSVpFX0JBU0UgMTggLyogTkVXX0FVWF9FTlQgZW50cmllcyBpbiBhdXhpbGlhcnkgdGFibGUgKi8KKyNkZWZpbmUgQVRfVkVDVE9SX1NJWkVfQkFTRSAxOSAvKiBORVdfQVVYX0VOVCBlbnRyaWVzIGluIGF1eGlsaWFyeSB0YWJsZSAqLwogICAvKiBudW1iZXIgb2YgIiNkZWZpbmUgQVRfLioiIGFib3ZlLCBtaW51cyB7QVRfTlVMTCwgQVRfSUdOT1JFLCBBVF9OT1RFTEZ9ICovCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9iYWNrbGlnaHQuaCBiL2luY2x1ZGUvbGludXgvYmFja2xpZ2h0LmgKaW5kZXggMWVlOTQ4OC4uNzljYTJkYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9iYWNrbGlnaHQuaAorKysgYi9pbmNsdWRlL2xpbnV4L2JhY2tsaWdodC5oCkBAIC0zMSw2ICszMSwxMCBAQAogc3RydWN0IGZiX2luZm87CiAKIHN0cnVjdCBiYWNrbGlnaHRfb3BzIHsKKwl1bnNpZ25lZCBpbnQgb3B0aW9uczsKKworI2RlZmluZSBCTF9DT1JFX1NVU1BFTkRSRVNVTUUJKDEgPDwgMCkKKwogCS8qIE5vdGlmeSB0aGUgYmFja2xpZ2h0IGRyaXZlciBzb21lIHByb3BlcnR5IGhhcyBjaGFuZ2VkICovCiAJaW50ICgqdXBkYXRlX3N0YXR1cykoc3RydWN0IGJhY2tsaWdodF9kZXZpY2UgKik7CiAJLyogUmV0dXJuIHRoZSBjdXJyZW50IGJhY2tsaWdodCBicmlnaHRuZXNzIChhY2NvdW50aW5nIGZvciBwb3dlciwKQEAgLTUxLDcgKzU1LDE5IEBACiAJICAgbW9kZXM7IDQ6IGZ1bGwgb2ZmKSwgc2VlIEZCX0JMQU5LX1hYWCAqLwogCWludCBwb3dlcjsKIAkvKiBGQiBCbGFua2luZyBhY3RpdmU/ICh2YWx1ZXMgYXMgZm9yIHBvd2VyKSAqLworCS8qIER1ZSB0byBiZSByZW1vdmVkLCBwbGVhc2UgdXNlIChzdGF0ZSAmIEJMX0NPUkVfRkJCTEFOSykgKi8KIAlpbnQgZmJfYmxhbms7CisJLyogRmxhZ3MgdXNlZCB0byBzaWduYWwgZHJpdmVycyBvZiBzdGF0ZSBjaGFuZ2VzICovCisJLyogVXBwZXIgNCBiaXRzIGFyZSByZXNlcnZlZCBmb3IgZHJpdmVyIGludGVybmFsIHVzZSAqLworCXVuc2lnbmVkIGludCBzdGF0ZTsKKworI2RlZmluZSBCTF9DT1JFX1NVU1BFTkRFRAkoMSA8PCAwKQkvKiBiYWNrbGlnaHQgaXMgc3VzcGVuZGVkICovCisjZGVmaW5lIEJMX0NPUkVfRkJCTEFOSwkJKDEgPDwgMSkJLyogYmFja2xpZ2h0IGlzIHVuZGVyIGFuIGZiIGJsYW5rIGV2ZW50ICovCisjZGVmaW5lIEJMX0NPUkVfRFJJVkVSNAkJKDEgPDwgMjgpCS8qIHJlc2VydmVkIGZvciBkcml2ZXIgc3BlY2lmaWMgdXNlICovCisjZGVmaW5lIEJMX0NPUkVfRFJJVkVSMwkJKDEgPDwgMjkpCS8qIHJlc2VydmVkIGZvciBkcml2ZXIgc3BlY2lmaWMgdXNlICovCisjZGVmaW5lIEJMX0NPUkVfRFJJVkVSMgkJKDEgPDwgMzApCS8qIHJlc2VydmVkIGZvciBkcml2ZXIgc3BlY2lmaWMgdXNlICovCisjZGVmaW5lIEJMX0NPUkVfRFJJVkVSMQkJKDEgPDwgMzEpCS8qIHJlc2VydmVkIGZvciBkcml2ZXIgc3BlY2lmaWMgdXNlICovCisKIH07CiAKIHN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlIHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYmxrZGV2LmggYi9pbmNsdWRlL2xpbnV4L2Jsa2Rldi5oCmluZGV4IDcwMzVjZWMuLjA0NDQ2N2UgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvYmxrZGV2LmgKKysrIGIvaW5jbHVkZS9saW51eC9ibGtkZXYuaApAQCAtNjkwLDYgKzY5MCw4IEBACiAJc3RydWN0IHBhZ2UgKipwYWdlczsKIAlpbnQgcGFnZV9vcmRlcjsKIAlpbnQgbnJfZW50cmllczsKKwl1bnNpZ25lZCBsb25nIG9mZnNldDsKKwlpbnQgbnVsbF9tYXBwZWQ7CiB9OwogCiBzdHJ1Y3QgcmVxX2l0ZXJhdG9yIHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYnVmZmVyX2hlYWQuaCBiL2luY2x1ZGUvbGludXgvYnVmZmVyX2hlYWQuaAppbmRleCA4NjA1ZjhhLi5iZDdhYzc5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2J1ZmZlcl9oZWFkLmgKKysrIGIvaW5jbHVkZS9saW51eC9idWZmZXJfaGVhZC5oCkBAIC0xNzEsNyArMTcxLDcgQEAKIHdhaXRfcXVldWVfaGVhZF90ICpiaF93YWl0cV9oZWFkKHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpOwogaW50IGZzeW5jX2JkZXYoc3RydWN0IGJsb2NrX2RldmljZSAqKTsKIHN0cnVjdCBzdXBlcl9ibG9jayAqZnJlZXplX2JkZXYoc3RydWN0IGJsb2NrX2RldmljZSAqKTsKLXZvaWQgdGhhd19iZGV2KHN0cnVjdCBibG9ja19kZXZpY2UgKiwgc3RydWN0IHN1cGVyX2Jsb2NrICopOworaW50IHRoYXdfYmRldihzdHJ1Y3QgYmxvY2tfZGV2aWNlICosIHN0cnVjdCBzdXBlcl9ibG9jayAqKTsKIGludCBmc3luY19zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKik7CiBpbnQgZnN5bmNfbm9fc3VwZXIoc3RydWN0IGJsb2NrX2RldmljZSAqKTsKIHN0cnVjdCBidWZmZXJfaGVhZCAqX19maW5kX2dldF9ibG9jayhzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCBzZWN0b3JfdCBibG9jaywKQEAgLTM0Niw2ICszNDYsMTUgQEAKIHN0YXRpYyBpbmxpbmUgaW50IHN5bmNfbWFwcGluZ19idWZmZXJzKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nKSB7IHJldHVybiAwOyB9CiBzdGF0aWMgaW5saW5lIHZvaWQgaW52YWxpZGF0ZV9iZGV2KHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYpIHt9CiAKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHN1cGVyX2Jsb2NrICpmcmVlemVfYmRldihzdHJ1Y3QgYmxvY2tfZGV2aWNlICpzYikKK3sKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGlubGluZSBpbnQgdGhhd19iZGV2KHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJcmV0dXJuIDA7Cit9CiAKICNlbmRpZiAvKiBDT05GSUdfQkxPQ0sgKi8KICNlbmRpZiAvKiBfTElOVVhfQlVGRkVSX0hFQURfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9jYW4vY29yZS5oIGIvaW5jbHVkZS9saW51eC9jYW4vY29yZS5oCmluZGV4IGY1MDc4NWEuLjI1MDg1Y2IgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvY2FuL2NvcmUuaAorKysgYi9pbmNsdWRlL2xpbnV4L2Nhbi9jb3JlLmgKQEAgLTE5LDcgKzE5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KIAotI2RlZmluZSBDQU5fVkVSU0lPTiAiMjAwODExMzAiCisjZGVmaW5lIENBTl9WRVJTSU9OICIyMDA5MDEwNSIKIAogLyogaW5jcmVtZW50IHRoaXMgbnVtYmVyIGVhY2ggdGltZSB5b3UgY2hhbmdlIHNvbWUgdXNlci1zcGFjZSBpbnRlcmZhY2UgKi8KICNkZWZpbmUgQ0FOX0FCSV9WRVJTSU9OICI4IgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9jYXBpLmggYi9pbmNsdWRlL2xpbnV4L2NhcGkuaAppbmRleCBmZGViYWFhLi42NTEwMGQ2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2NhcGkuaAorKysgYi9pbmNsdWRlL2xpbnV4L2NhcGkuaApAQCAtMTIsNyArMTIsNyBAQAogI2lmbmRlZiBfX0xJTlVYX0NBUElfSF9fCiAjZGVmaW5lIF9fTElOVVhfQ0FQSV9IX18KIAotI2luY2x1ZGUgPGFzbS90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvaW9jdGwuaD4KICNpZm5kZWYgX19LRVJORUxfXwogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbGNhcGkuaD4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvY2dyb3VwLmggYi9pbmNsdWRlL2xpbnV4L2Nncm91cC5oCmluZGV4IDA4Yjc4YzAuLmUyNjdlNjI4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2Nncm91cC5oCisrKyBiL2luY2x1ZGUvbGludXgvY2dyb3VwLmgKQEAgLTUyLDkgKzUyLDkgQEAKIAkgKiBoaWVyYXJjaHkgc3RydWN0dXJlICovCiAJc3RydWN0IGNncm91cCAqY2dyb3VwOwogCi0JLyogU3RhdGUgbWFpbnRhaW5lZCBieSB0aGUgY2dyb3VwIHN5c3RlbSB0byBhbGxvdwotCSAqIHN1YnN5c3RlbXMgdG8gYmUgImJ1c3kiLiBTaG91bGQgYmUgYWNjZXNzZWQgdmlhIGNzc19nZXQoKQotCSAqIGFuZCBjc3NfcHV0KCkgKi8KKwkvKiBTdGF0ZSBtYWludGFpbmVkIGJ5IHRoZSBjZ3JvdXAgc3lzdGVtIHRvIGFsbG93IHN1YnN5c3RlbXMKKwkgKiB0byBiZSAiYnVzeSIuIFNob3VsZCBiZSBhY2Nlc3NlZCB2aWEgY3NzX2dldCgpLAorCSAqIGNzc190cnlnZXQoKSBhbmQgYW5kIGNzc19wdXQoKS4gKi8KIAogCWF0b21pY190IHJlZmNudDsKIApAQCAtNjQsMTEgKzY0LDE0IEBACiAvKiBiaXRzIGluIHN0cnVjdCBjZ3JvdXBfc3Vic3lzX3N0YXRlIGZsYWdzIGZpZWxkICovCiBlbnVtIHsKIAlDU1NfUk9PVCwgLyogVGhpcyBDU1MgaXMgdGhlIHJvb3Qgb2YgdGhlIHN1YnN5c3RlbSAqLworCUNTU19SRU1PVkVELCAvKiBUaGlzIENTUyBpcyBkZWFkICovCiB9OwogCiAvKgotICogQ2FsbCBjc3NfZ2V0KCkgdG8gaG9sZCBhIHJlZmVyZW5jZSBvbiB0aGUgY2dyb3VwOwotICoKKyAqIENhbGwgY3NzX2dldCgpIHRvIGhvbGQgYSByZWZlcmVuY2Ugb24gdGhlIGNzczsgaXQgY2FuIGJlIHVzZWQKKyAqIGZvciBhIHJlZmVyZW5jZSBvYnRhaW5lZCB2aWE6CisgKiAtIGFuIGV4aXN0aW5nIHJlZi1jb3VudGVkIHJlZmVyZW5jZSB0byB0aGUgY3NzCisgKiAtIHRhc2stPmNncm91cHMgZm9yIGEgbG9ja2VkIHRhc2sKICAqLwogCiBzdGF0aWMgaW5saW5lIHZvaWQgY3NzX2dldChzdHJ1Y3QgY2dyb3VwX3N1YnN5c19zdGF0ZSAqY3NzKQpAQCAtNzcsOSArODAsMzIgQEAKIAlpZiAoIXRlc3RfYml0KENTU19ST09ULCAmY3NzLT5mbGFncykpCiAJCWF0b21pY19pbmMoJmNzcy0+cmVmY250KTsKIH0KKworc3RhdGljIGlubGluZSBib29sIGNzc19pc19yZW1vdmVkKHN0cnVjdCBjZ3JvdXBfc3Vic3lzX3N0YXRlICpjc3MpCit7CisJcmV0dXJuIHRlc3RfYml0KENTU19SRU1PVkVELCAmY3NzLT5mbGFncyk7Cit9CisKKy8qCisgKiBDYWxsIGNzc190cnlnZXQoKSB0byB0YWtlIGEgcmVmZXJlbmNlIG9uIGEgY3NzIGlmIHlvdXIgZXhpc3RpbmcKKyAqIChrbm93bi12YWxpZCkgcmVmZXJlbmNlIGlzbid0IGFscmVhZHkgcmVmLWNvdW50ZWQuIFJldHVybnMgZmFsc2UgaWYKKyAqIHRoZSBjc3MgaGFzIGJlZW4gZGVzdHJveWVkLgorICovCisKK3N0YXRpYyBpbmxpbmUgYm9vbCBjc3NfdHJ5Z2V0KHN0cnVjdCBjZ3JvdXBfc3Vic3lzX3N0YXRlICpjc3MpCit7CisJaWYgKHRlc3RfYml0KENTU19ST09ULCAmY3NzLT5mbGFncykpCisJCXJldHVybiB0cnVlOworCXdoaWxlICghYXRvbWljX2luY19ub3RfemVybygmY3NzLT5yZWZjbnQpKSB7CisJCWlmICh0ZXN0X2JpdChDU1NfUkVNT1ZFRCwgJmNzcy0+ZmxhZ3MpKQorCQkJcmV0dXJuIGZhbHNlOworCX0KKwlyZXR1cm4gdHJ1ZTsKK30KKwogLyoKICAqIGNzc19wdXQoKSBzaG91bGQgYmUgY2FsbGVkIHRvIHJlbGVhc2UgYSByZWZlcmVuY2UgdGFrZW4gYnkKLSAqIGNzc19nZXQoKQorICogY3NzX2dldCgpIG9yIGNzc190cnlnZXQoKQogICovCiAKIGV4dGVybiB2b2lkIF9fY3NzX3B1dChzdHJ1Y3QgY2dyb3VwX3N1YnN5c19zdGF0ZSAqY3NzKTsKQEAgLTExNiw3ICsxNDIsNyBAQAogCXN0cnVjdCBsaXN0X2hlYWQgY2hpbGRyZW47CS8qIG15IGNoaWxkcmVuICovCiAKIAlzdHJ1Y3QgY2dyb3VwICpwYXJlbnQ7CS8qIG15IHBhcmVudCAqLwotCXN0cnVjdCBkZW50cnkgKmRlbnRyeTsJICAJLyogY2dyb3VwIGZzIGVudHJ5ICovCisJc3RydWN0IGRlbnRyeSAqZGVudHJ5OwkgIAkvKiBjZ3JvdXAgZnMgZW50cnksIFJDVSBwcm90ZWN0ZWQgKi8KIAogCS8qIFByaXZhdGUgcG9pbnRlcnMgZm9yIGVhY2ggcmVnaXN0ZXJlZCBzdWJzeXN0ZW0gKi8KIAlzdHJ1Y3QgY2dyb3VwX3N1YnN5c19zdGF0ZSAqc3Vic3lzW0NHUk9VUF9TVUJTWVNfQ09VTlRdOwpAQCAtMTQ1LDYgKzE3MSw5IEBACiAJaW50IHBpZHNfdXNlX2NvdW50OwogCS8qIExlbmd0aCBvZiB0aGUgY3VycmVudCB0YXNrc19waWRzIGFycmF5ICovCiAJaW50IHBpZHNfbGVuZ3RoOworCisJLyogRm9yIFJDVS1wcm90ZWN0ZWQgZGVsZXRpb24gKi8KKwlzdHJ1Y3QgcmN1X2hlYWQgcmN1X2hlYWQ7CiB9OwogCiAvKiBBIGNzc19zZXQgaXMgYSBzdHJ1Y3R1cmUgaG9sZGluZyBwb2ludGVycyB0byBhIHNldCBvZgpAQCAtMzM3LDkgKzM2NiwyMyBAQAogI2RlZmluZSBNQVhfQ0dST1VQX1RZUEVfTkFNRUxFTiAzMgogCWNvbnN0IGNoYXIgKm5hbWU7CiAKLQkvKiBQcm90ZWN0ZWQgYnkgUkNVICovCi0Jc3RydWN0IGNncm91cGZzX3Jvb3QgKnJvb3Q7CisJLyoKKwkgKiBQcm90ZWN0cyBzaWJsaW5nL2NoaWxkcmVuIGxpbmtzIG9mIGNncm91cHMgaW4gdGhpcworCSAqIGhpZXJhcmNoeSwgcGx1cyBwcm90ZWN0cyB3aGljaCBoaWVyYXJjaHkgKG9yIG5vbmUpIHRoZQorCSAqIHN1YnN5c3RlbSBpcyBhIHBhcnQgb2YgKGkuZS4gcm9vdC9zaWJsaW5nKS4gIFRvIGF2b2lkCisJICogcG90ZW50aWFsIGRlYWRsb2NrcywgdGhlIGZvbGxvd2luZyBvcGVyYXRpb25zIHNob3VsZCBub3QgYmUKKwkgKiB1bmRlcnRha2VuIHdoaWxlIGhvbGRpbmcgYW55IGhpZXJhcmNoeV9tdXRleDoKKwkgKgorCSAqIC0gYWxsb2NhdGluZyBtZW1vcnkKKwkgKiAtIGluaXRpYXRpbmcgaG90cGx1ZyBldmVudHMKKwkgKi8KKwlzdHJ1Y3QgbXV0ZXggaGllcmFyY2h5X211dGV4OwogCisJLyoKKwkgKiBMaW5rIHRvIHBhcmVudCwgYW5kIGxpc3QgZW50cnkgaW4gcGFyZW50J3MgY2hpbGRyZW4uCisJICogUHJvdGVjdGVkIGJ5IHRoaXMtPmhpZXJhcmNoeV9tdXRleCBhbmQgY2dyb3VwX2xvY2soKQorCSAqLworCXN0cnVjdCBjZ3JvdXBmc19yb290ICpyb290OwogCXN0cnVjdCBsaXN0X2hlYWQgc2libGluZzsKIH07CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvY29tcGF0LmggYi9pbmNsdWRlL2xpbnV4L2NvbXBhdC5oCmluZGV4IGU4OGYzZWMuLjNmZDIxOTQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvY29tcGF0LmgKKysrIGIvaW5jbHVkZS9saW51eC9jb21wYXQuaApAQCAtMjgwLDUgKzI4MCwxOCBAQAogYXNtbGlua2FnZSBsb25nIGNvbXBhdF9zeXNfdGltZXJmZF9nZXR0aW1lKGludCB1ZmQsCiAJCQkJICAgc3RydWN0IGNvbXBhdF9pdGltZXJzcGVjIF9fdXNlciAqb3Rtcik7CiAKK2FzbWxpbmthZ2UgbG9uZyBjb21wYXRfc3lzX21vdmVfcGFnZXMocGlkX3QgcGlkLCB1bnNpZ25lZCBsb25nIG5yX3BhZ2UsCisJCQkJICAgICAgX191MzIgX191c2VyICpwYWdlcywKKwkJCQkgICAgICBjb25zdCBpbnQgX191c2VyICpub2RlcywKKwkJCQkgICAgICBpbnQgX191c2VyICpzdGF0dXMsCisJCQkJICAgICAgaW50IGZsYWdzKTsKK2FzbWxpbmthZ2UgbG9uZyBjb21wYXRfc3lzX2Z1dGltZXNhdCh1bnNpZ25lZCBpbnQgZGZkLCBjaGFyIF9fdXNlciAqZmlsZW5hbWUsCisJCQkJICAgICBzdHJ1Y3QgY29tcGF0X3RpbWV2YWwgX191c2VyICp0KTsKK2FzbWxpbmthZ2UgbG9uZyBjb21wYXRfc3lzX25ld2ZzdGF0YXQodW5zaWduZWQgaW50IGRmZCwgY2hhciBfX3VzZXIgKiBmaWxlbmFtZSwKKwkJCQkgICAgICBzdHJ1Y3QgY29tcGF0X3N0YXQgX191c2VyICpzdGF0YnVmLAorCQkJCSAgICAgIGludCBmbGFnKTsKK2FzbWxpbmthZ2UgbG9uZyBjb21wYXRfc3lzX29wZW5hdCh1bnNpZ25lZCBpbnQgZGZkLCBjb25zdCBjaGFyIF9fdXNlciAqZmlsZW5hbWUsCisJCQkJICBpbnQgZmxhZ3MsIGludCBtb2RlKTsKKwogI2VuZGlmIC8qIENPTkZJR19DT01QQVQgKi8KICNlbmRpZiAvKiBfTElOVVhfQ09NUEFUX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvY29tcGlsZXItZ2NjLmggYi9pbmNsdWRlL2xpbnV4L2NvbXBpbGVyLWdjYy5oCmluZGV4IGFmNDBmOGUuLjE1MTRkNTMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvY29tcGlsZXItZ2NjLmgKKysrIGIvaW5jbHVkZS9saW51eC9jb21waWxlci1nY2MuaApAQCAtMTEsOSArMTEsMTkgQEAKIC8qIFRoZSAidm9sYXRpbGUiIGlzIGR1ZSB0byBnY2MgYnVncyAqLwogI2RlZmluZSBiYXJyaWVyKCkgX19hc21fXyBfX3ZvbGF0aWxlX18oIiI6IDogOiJtZW1vcnkiKQogCi0vKiBUaGlzIG1hY3JvIG9iZnVzY2F0ZXMgYXJpdGhtZXRpYyBvbiBhIHZhcmlhYmxlIGFkZHJlc3Mgc28gdGhhdCBnY2MKLSAgIHNob3VsZG4ndCByZWNvZ25pemUgdGhlIG9yaWdpbmFsIHZhciwgYW5kIG1ha2UgYXNzdW1wdGlvbnMgYWJvdXQgaXQgKi8KIC8qCisgKiBUaGlzIG1hY3JvIG9iZnVzY2F0ZXMgYXJpdGhtZXRpYyBvbiBhIHZhcmlhYmxlIGFkZHJlc3Mgc28gdGhhdCBnY2MKKyAqIHNob3VsZG4ndCByZWNvZ25pemUgdGhlIG9yaWdpbmFsIHZhciwgYW5kIG1ha2UgYXNzdW1wdGlvbnMgYWJvdXQgaXQuCisgKgorICogVGhpcyBpcyBuZWVkZWQgYmVjYXVzZSB0aGUgQyBzdGFuZGFyZCBtYWtlcyBpdCB1bmRlZmluZWQgdG8gZG8KKyAqIHBvaW50ZXIgYXJpdGhtZXRpYyBvbiAib2JqZWN0cyIgb3V0c2lkZSB0aGVpciBib3VuZGFyaWVzIGFuZCB0aGUKKyAqIGdjYyBvcHRpbWl6ZXJzIGFzc3VtZSB0aGlzIGlzIHRoZSBjYXNlLiBJbiBwYXJ0aWN1bGFyIHRoZXkKKyAqIGFzc3VtZSBzdWNoIGFyaXRobWV0aWMgZG9lcyBub3Qgd3JhcC4KKyAqCisgKiBBIG1pc2NvbXBpbGF0aW9uIGhhcyBiZWVuIG9ic2VydmVkIGJlY2F1c2Ugb2YgdGhpcyBvbiBQUEMuCisgKiBUbyB3b3JrIGFyb3VuZCBpdCB3ZSBoaWRlIHRoZSByZWxhdGlvbnNoaXAgb2YgdGhlIHBvaW50ZXIgYW5kIHRoZSBvYmplY3QKKyAqIHVzaW5nIHRoaXMgbWFjcm8uCisgKgogICogVmVyc2lvbnMgb2YgdGhlIHBwYzY0IGNvbXBpbGVyIGJlZm9yZSA0LjEgaGFkIGEgYnVnIHdoZXJlIHVzZSBvZgogICogUkVMT0NfSElERSBjb3VsZCB0cmFzaCByMzAuIFRoZSBidWcgY2FuIGJlIHdvcmtlZCBhcm91bmQgYnkgY2hhbmdpbmcKICAqIHRoZSBpbmxpbmUgYXNzZW1ibHkgY29uc3RyYWludCBmcm9tID1nIHRvID1yLCBpbiB0aGlzIHBhcnRpY3VsYXIKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvY29ubmVjdG9yLmggYi9pbmNsdWRlL2xpbnV4L2Nvbm5lY3Rvci5oCmluZGV4IDVjN2Y5NDYuLjM0ZjI3ODkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvY29ubmVjdG9yLmgKKysrIGIvaW5jbHVkZS9saW51eC9jb25uZWN0b3IuaApAQCAtMjIsNyArMjIsNyBAQAogI2lmbmRlZiBfX0NPTk5FQ1RPUl9ICiAjZGVmaW5lIF9fQ09OTkVDVE9SX0gKIAotI2luY2x1ZGUgPGFzbS90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAKICNkZWZpbmUgQ05fSURYX0NPTk5FQ1RPUgkJMHhmZmZmZmZmZgogI2RlZmluZSBDTl9WQUxfQ09OTkVDVE9SCQkweGZmZmZmZmZmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2NwdWZyZXEuaCBiL2luY2x1ZGUvbGludXgvY3B1ZnJlcS5oCmluZGV4IDQ4NGIzYWIuLjM4NGIzOGQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvY3B1ZnJlcS5oCisrKyBiL2luY2x1ZGUvbGludXgvY3B1ZnJlcS5oCkBAIC04MCw4ICs4MCw4IEBACiB9OwogCiBzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgewotCWNwdW1hc2tfdAkJY3B1czsJLyogQ1BVcyByZXF1aXJpbmcgc3cgY29vcmRpbmF0aW9uICovCi0JY3B1bWFza190CQlyZWxhdGVkX2NwdXM7IC8qIENQVXMgd2l0aCBhbnkgY29vcmRpbmF0aW9uICovCisJY3B1bWFza192YXJfdAkJY3B1czsJLyogQ1BVcyByZXF1aXJpbmcgc3cgY29vcmRpbmF0aW9uICovCisJY3B1bWFza192YXJfdAkJcmVsYXRlZF9jcHVzOyAvKiBDUFVzIHdpdGggYW55IGNvb3JkaW5hdGlvbiAqLwogCXVuc2lnbmVkIGludAkJc2hhcmVkX3R5cGU7IC8qIEFOWSBvciBBTEwgYWZmZWN0ZWQgQ1BVcwogCQkJCQkJc2hvdWxkIHNldCBjcHVmcmVxICovCiAJdW5zaWduZWQgaW50CQljcHU7ICAgIC8qIGNwdSBuciBvZiByZWdpc3RlcmVkIENQVSAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9jcHVzZXQuaCBiL2luY2x1ZGUvbGludXgvY3B1c2V0LmgKaW5kZXggNTFlYTJiZC4uOTBjNjA3NCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9jcHVzZXQuaAorKysgYi9pbmNsdWRlL2xpbnV4L2NwdXNldC5oCkBAIC0yMCw4ICsyMCw5IEBACiBleHRlcm4gaW50IGNwdXNldF9pbml0X2Vhcmx5KHZvaWQpOwogZXh0ZXJuIGludCBjcHVzZXRfaW5pdCh2b2lkKTsKIGV4dGVybiB2b2lkIGNwdXNldF9pbml0X3NtcCh2b2lkKTsKLWV4dGVybiB2b2lkIGNwdXNldF9jcHVzX2FsbG93ZWQoc3RydWN0IHRhc2tfc3RydWN0ICpwLCBjcHVtYXNrX3QgKm1hc2spOwotZXh0ZXJuIHZvaWQgY3B1c2V0X2NwdXNfYWxsb3dlZF9sb2NrZWQoc3RydWN0IHRhc2tfc3RydWN0ICpwLCBjcHVtYXNrX3QgKm1hc2spOworZXh0ZXJuIHZvaWQgY3B1c2V0X2NwdXNfYWxsb3dlZChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsIHN0cnVjdCBjcHVtYXNrICptYXNrKTsKK2V4dGVybiB2b2lkIGNwdXNldF9jcHVzX2FsbG93ZWRfbG9ja2VkKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCwKKwkJCQkgICAgICAgc3RydWN0IGNwdW1hc2sgKm1hc2spOwogZXh0ZXJuIG5vZGVtYXNrX3QgY3B1c2V0X21lbXNfYWxsb3dlZChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApOwogI2RlZmluZSBjcHVzZXRfY3VycmVudF9tZW1zX2FsbG93ZWQgKGN1cnJlbnQtPm1lbXNfYWxsb3dlZCkKIHZvaWQgY3B1c2V0X2luaXRfY3VycmVudF9tZW1zX2FsbG93ZWQodm9pZCk7CkBAIC04NiwxMiArODcsMTMgQEAKIHN0YXRpYyBpbmxpbmUgaW50IGNwdXNldF9pbml0KHZvaWQpIHsgcmV0dXJuIDA7IH0KIHN0YXRpYyBpbmxpbmUgdm9pZCBjcHVzZXRfaW5pdF9zbXAodm9pZCkge30KIAotc3RhdGljIGlubGluZSB2b2lkIGNwdXNldF9jcHVzX2FsbG93ZWQoc3RydWN0IHRhc2tfc3RydWN0ICpwLCBjcHVtYXNrX3QgKm1hc2spCitzdGF0aWMgaW5saW5lIHZvaWQgY3B1c2V0X2NwdXNfYWxsb3dlZChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsCisJCQkJICAgICAgIHN0cnVjdCBjcHVtYXNrICptYXNrKQogewogCSptYXNrID0gY3B1X3Bvc3NpYmxlX21hcDsKIH0KIHN0YXRpYyBpbmxpbmUgdm9pZCBjcHVzZXRfY3B1c19hbGxvd2VkX2xvY2tlZChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsCi0JCQkJCQkJCWNwdW1hc2tfdCAqbWFzaykKKwkJCQkJICAgICAgc3RydWN0IGNwdW1hc2sgKm1hc2spCiB7CiAJKm1hc2sgPSBjcHVfcG9zc2libGVfbWFwOwogfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9jeWNsYWRlcy5oIGIvaW5jbHVkZS9saW51eC9jeWNsYWRlcy5oCmluZGV4IDJkM2QxZTAuLmQwNmZiZjIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvY3ljbGFkZXMuaAorKysgYi9pbmNsdWRlL2xpbnV4L2N5Y2xhZGVzLmgKQEAgLTE1MCw4ICsxNTAsNiBAQAogICoJYXJjaGl0ZWN0dXJlcyBhbmQgY29tcGlsZXJzLgogICovCiAKLSNpbmNsdWRlIDxhc20vdHlwZXMuaD4KLQogdHlwZWRlZiBfX3U2NCAgdWNkb3VibGU7CQkvKiA2NCBiaXRzLCB1bnNpZ25lZCAqLwogdHlwZWRlZiBfX3UzMiAgdWNsb25nOwkJCS8qIDMyIGJpdHMsIHVuc2lnbmVkICovCiB0eXBlZGVmIF9fdTE2ICB1Y3Nob3J0OwkJLyogMTYgYml0cywgdW5zaWduZWQgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZGVidWdmcy5oIGIvaW5jbHVkZS9saW51eC9kZWJ1Z2ZzLmgKaW5kZXggZTFhNmMwNC4uMjM5MzZiMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9kZWJ1Z2ZzLmgKKysrIGIvaW5jbHVkZS9saW51eC9kZWJ1Z2ZzLmgKQEAgLTYzLDYgKzYzLDggQEAKIAkJCQkgIHN0cnVjdCBkZW50cnkgKnBhcmVudCwgdTE2ICp2YWx1ZSk7CiBzdHJ1Y3QgZGVudHJ5ICpkZWJ1Z2ZzX2NyZWF0ZV94MzIoY29uc3QgY2hhciAqbmFtZSwgbW9kZV90IG1vZGUsCiAJCQkJICBzdHJ1Y3QgZGVudHJ5ICpwYXJlbnQsIHUzMiAqdmFsdWUpOworc3RydWN0IGRlbnRyeSAqZGVidWdmc19jcmVhdGVfc2l6ZV90KGNvbnN0IGNoYXIgKm5hbWUsIG1vZGVfdCBtb2RlLAorCQkJCSAgICAgc3RydWN0IGRlbnRyeSAqcGFyZW50LCBzaXplX3QgKnZhbHVlKTsKIHN0cnVjdCBkZW50cnkgKmRlYnVnZnNfY3JlYXRlX2Jvb2woY29uc3QgY2hhciAqbmFtZSwgbW9kZV90IG1vZGUsCiAJCQkJICBzdHJ1Y3QgZGVudHJ5ICpwYXJlbnQsIHUzMiAqdmFsdWUpOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2RldmljZS5oIGIvaW5jbHVkZS9saW51eC9kZXZpY2UuaAppbmRleCA3ZDlkYTRiLi40NWU1YjE5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2RldmljZS5oCisrKyBiL2luY2x1ZGUvbGludXgvZGV2aWNlLmgKQEAgLTI4LDcgKzI4LDYgQEAKICNkZWZpbmUgQlVTX0lEX1NJWkUJCTIwCiAKIHN0cnVjdCBkZXZpY2U7Ci1zdHJ1Y3QgZGV2aWNlX3ByaXZhdGU7CiBzdHJ1Y3QgZGV2aWNlX2RyaXZlcjsKIHN0cnVjdCBkcml2ZXJfcHJpdmF0ZTsKIHN0cnVjdCBjbGFzczsKQEAgLTM2NiwxMCArMzY1LDEyIEBACiB9OwogCiBzdHJ1Y3QgZGV2aWNlIHsKKwlzdHJ1Y3Qga2xpc3QJCWtsaXN0X2NoaWxkcmVuOworCXN0cnVjdCBrbGlzdF9ub2RlCWtub2RlX3BhcmVudDsJLyogbm9kZSBpbiBzaWJsaW5nIGxpc3QgKi8KKwlzdHJ1Y3Qga2xpc3Rfbm9kZQlrbm9kZV9kcml2ZXI7CisJc3RydWN0IGtsaXN0X25vZGUJa25vZGVfYnVzOwogCXN0cnVjdCBkZXZpY2UJCSpwYXJlbnQ7CiAKLQlzdHJ1Y3QgZGV2aWNlX3ByaXZhdGUJKnA7Ci0KIAlzdHJ1Y3Qga29iamVjdCBrb2JqOwogCWNoYXIJYnVzX2lkW0JVU19JRF9TSVpFXTsJLyogcG9zaXRpb24gb24gcGFyZW50IGJ1cyAqLwogCXVuc2lnbmVkCQl1ZXZlbnRfc3VwcHJlc3M6MTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZGlvLmggYi9pbmNsdWRlL2xpbnV4L2Rpby5oCmluZGV4IDFlNjVlYmMuLmIyZGQzMWMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZGlvLmgKKysrIGIvaW5jbHVkZS9saW51eC9kaW8uaApAQCAtMjQxLDcgKzI0MSw3IEBACiAKIGV4dGVybiBpbnQgZGlvX2ZpbmQoaW50IGRldmljZWlkKTsKIGV4dGVybiB1bnNpZ25lZCBsb25nIGRpb19zY29kZXRvcGh5c2FkZHIoaW50IHNjb2RlKTsKLWV4dGVybiB2b2lkIGRpb19jcmVhdGVfc3lzZnNfZGV2X2ZpbGVzKHN0cnVjdCBkaW9fZGV2ICopOworZXh0ZXJuIGludCBkaW9fY3JlYXRlX3N5c2ZzX2Rldl9maWxlcyhzdHJ1Y3QgZGlvX2RldiAqKTsKIAogLyogTmV3LXN0eWxlIHByb2JpbmcgKi8KIGV4dGVybiBpbnQgZGlvX3JlZ2lzdGVyX2RyaXZlcihzdHJ1Y3QgZGlvX2RyaXZlciAqKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZG1hZW5naW5lLmggYi9pbmNsdWRlL2xpbnV4L2RtYWVuZ2luZS5oCmluZGV4IGFkYjBiMDguLmM3M2YxZTIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZG1hZW5naW5lLmgKKysrIGIvaW5jbHVkZS9saW51eC9kbWFlbmdpbmUuaApAQCAtMjksMzIgKzI5LDYgQEAKICNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgogCiAvKioKLSAqIGVudW0gZG1hX3N0YXRlIC0gcmVzb3VyY2UgUE5QL3Bvd2VyIG1hbmFnZW1lbnQgc3RhdGUKLSAqIEBETUFfUkVTT1VSQ0VfU1VTUEVORDogRE1BIGRldmljZSBnb2luZyBpbnRvIGxvdyBwb3dlciBzdGF0ZQotICogQERNQV9SRVNPVVJDRV9SRVNVTUU6IERNQSBkZXZpY2UgcmV0dXJuaW5nIHRvIGZ1bGwgcG93ZXIKLSAqIEBETUFfUkVTT1VSQ0VfQVZBSUxBQkxFOiBETUEgZGV2aWNlIGF2YWlsYWJsZSB0byB0aGUgc3lzdGVtCi0gKiBARE1BX1JFU09VUkNFX1JFTU9WRUQ6IERNQSBkZXZpY2UgcmVtb3ZlZCBmcm9tIHRoZSBzeXN0ZW0KLSAqLwotZW51bSBkbWFfc3RhdGUgewotCURNQV9SRVNPVVJDRV9TVVNQRU5ELAotCURNQV9SRVNPVVJDRV9SRVNVTUUsCi0JRE1BX1JFU09VUkNFX0FWQUlMQUJMRSwKLQlETUFfUkVTT1VSQ0VfUkVNT1ZFRCwKLX07Ci0KLS8qKgotICogZW51bSBkbWFfc3RhdGVfY2xpZW50IC0gc3RhdGUgb2YgdGhlIGNoYW5uZWwgaW4gdGhlIGNsaWVudAotICogQERNQV9BQ0s6IGNsaWVudCB3b3VsZCBsaWtlIHRvIHVzZSwgb3Igd2FzIHVzaW5nIHRoaXMgY2hhbm5lbAotICogQERNQV9EVVA6IGNsaWVudCBoYXMgYWxyZWFkeSBzZWVuIHRoaXMgY2hhbm5lbCwgb3IgaXMgbm90IHVzaW5nIHRoaXMgY2hhbm5lbAotICogQERNQV9OQUs6IGNsaWVudCBkb2VzIG5vdCB3YW50IHRvIHNlZSBhbnkgbW9yZSBjaGFubmVscwotICovCi1lbnVtIGRtYV9zdGF0ZV9jbGllbnQgewotCURNQV9BQ0ssCi0JRE1BX0RVUCwKLQlETUFfTkFLLAotfTsKLQotLyoqCiAgKiB0eXBlZGVmIGRtYV9jb29raWVfdCAtIGFuIG9wYXF1ZSBETUEgY29va2llCiAgKgogICogaWYgZG1hX2Nvb2tpZV90IGlzID4wIGl0J3MgYSBETUEgcmVxdWVzdCBjb29raWUsIDwwIGl0J3MgYW4gZXJyb3IgY29kZQpAQCAtODksMjMgKzYzLDEzIEBACiAJRE1BX01FTVNFVCwKIAlETUFfTUVNQ1BZX0NSQzMyQywKIAlETUFfSU5URVJSVVBULAorCURNQV9QUklWQVRFLAogCURNQV9TTEFWRSwKIH07CiAKIC8qIGxhc3QgdHJhbnNhY3Rpb24gdHlwZSBmb3IgY3JlYXRpb24gb2YgdGhlIGNhcGFiaWxpdGllcyBtYXNrICovCiAjZGVmaW5lIERNQV9UWF9UWVBFX0VORCAoRE1BX1NMQVZFICsgMSkKIAotLyoqCi0gKiBlbnVtIGRtYV9zbGF2ZV93aWR0aCAtIERNQSBzbGF2ZSByZWdpc3RlciBhY2Nlc3Mgd2lkdGguCi0gKiBARE1BX1NMQVZFX1dJRFRIXzhCSVQ6IERvIDgtYml0IHNsYXZlIHJlZ2lzdGVyIGFjY2Vzc2VzCi0gKiBARE1BX1NMQVZFX1dJRFRIXzE2QklUOiBEbyAxNi1iaXQgc2xhdmUgcmVnaXN0ZXIgYWNjZXNzZXMKLSAqIEBETUFfU0xBVkVfV0lEVEhfMzJCSVQ6IERvIDMyLWJpdCBzbGF2ZSByZWdpc3RlciBhY2Nlc3NlcwotICovCi1lbnVtIGRtYV9zbGF2ZV93aWR0aCB7Ci0JRE1BX1NMQVZFX1dJRFRIXzhCSVQsCi0JRE1BX1NMQVZFX1dJRFRIXzE2QklULAotCURNQV9TTEFWRV9XSURUSF8zMkJJVCwKLX07CiAKIC8qKgogICogZW51bSBkbWFfY3RybF9mbGFncyAtIERNQSBmbGFncyB0byBhdWdtZW50IG9wZXJhdGlvbiBwcmVwYXJhdGlvbiwKQEAgLTEzMiwzMiArOTYsNiBAQAogdHlwZWRlZiBzdHJ1Y3QgeyBERUNMQVJFX0JJVE1BUChiaXRzLCBETUFfVFhfVFlQRV9FTkQpOyB9IGRtYV9jYXBfbWFza190OwogCiAvKioKLSAqIHN0cnVjdCBkbWFfc2xhdmUgLSBJbmZvcm1hdGlvbiBhYm91dCBhIERNQSBzbGF2ZQotICogQGRldjogZGV2aWNlIGFjdGluZyBhcyBETUEgc2xhdmUKLSAqIEBkbWFfZGV2OiByZXF1aXJlZCBETUEgbWFzdGVyIGRldmljZS4gSWYgbm9uLU5VTEwsIHRoZSBjbGllbnQgY2FuIG5vdCBiZQotICoJYm91bmQgdG8gb3RoZXIgbWFzdGVycyB0aGFuIHRoaXMuCi0gKiBAdHhfcmVnOiBwaHlzaWNhbCBhZGRyZXNzIG9mIGRhdGEgcmVnaXN0ZXIgdXNlZCBmb3IKLSAqCW1lbW9yeS10by1wZXJpcGhlcmFsIHRyYW5zZmVycwotICogQHJ4X3JlZzogcGh5c2ljYWwgYWRkcmVzcyBvZiBkYXRhIHJlZ2lzdGVyIHVzZWQgZm9yCi0gKglwZXJpcGhlcmFsLXRvLW1lbW9yeSB0cmFuc2ZlcnMKLSAqIEByZWdfd2lkdGg6IHBlcmlwaGVyYWwgcmVnaXN0ZXIgd2lkdGgKLSAqCi0gKiBJZiBkbWFfZGV2IGlzIG5vbi1OVUxMLCB0aGUgY2xpZW50IGNhbiBub3QgYmUgYm91bmQgdG8gb3RoZXIgRE1BCi0gKiBtYXN0ZXJzIHRoYW4gdGhlIG9uZSBjb3JyZXNwb25kaW5nIHRvIHRoaXMgZGV2aWNlLiBUaGUgRE1BIG1hc3RlcgotICogZHJpdmVyIG1heSB1c2UgdGhpcyB0byBkZXRlcm1pbmUgaWYgdGhlcmUgaXMgY29udHJvbGxlci1zcGVjaWZpYwotICogZGF0YSB3cmFwcGVkIGFyb3VuZCB0aGlzIHN0cnVjdC4gRHJpdmVycyBvZiBwbGF0Zm9ybSBjb2RlIHRoYXQgc2V0cwotICogdGhlIGRtYV9kZXYgZmllbGQgbXVzdCB0aGVyZWZvcmUgbWFrZSBzdXJlIHRvIHVzZSBhbiBhcHByb3ByaWF0ZQotICogY29udHJvbGxlci1zcGVjaWZpYyBkbWEgc2xhdmUgc3RydWN0dXJlIHdyYXBwaW5nIHRoaXMgc3RydWN0LgotICovCi1zdHJ1Y3QgZG1hX3NsYXZlIHsKLQlzdHJ1Y3QgZGV2aWNlCQkqZGV2OwotCXN0cnVjdCBkZXZpY2UJCSpkbWFfZGV2OwotCWRtYV9hZGRyX3QJCXR4X3JlZzsKLQlkbWFfYWRkcl90CQlyeF9yZWc7Ci0JZW51bSBkbWFfc2xhdmVfd2lkdGgJcmVnX3dpZHRoOwotfTsKLQotLyoqCiAgKiBzdHJ1Y3QgZG1hX2NoYW5fcGVyY3B1IC0gdGhlIHBlci1DUFUgcGFydCBvZiBzdHJ1Y3QgZG1hX2NoYW4KICAqIEByZWZjb3VudDogbG9jYWxfdCB1c2VkIGZvciBvcGVuLWNvZGVkICJiaWdyZWYiIGNvdW50aW5nCiAgKiBAbWVtY3B5X2NvdW50OiB0cmFuc2FjdGlvbiBjb3VudGVyCkBAIC0xNjUsNyArMTAzLDYgQEAKICAqLwogCiBzdHJ1Y3QgZG1hX2NoYW5fcGVyY3B1IHsKLQlsb2NhbF90IHJlZmNvdW50OwogCS8qIHN0YXRzICovCiAJdW5zaWduZWQgbG9uZyBtZW1jcHlfY291bnQ7CiAJdW5zaWduZWQgbG9uZyBieXRlc190cmFuc2ZlcnJlZDsKQEAgLTE3NiwxMyArMTEzLDE0IEBACiAgKiBAZGV2aWNlOiBwdHIgdG8gdGhlIGRtYSBkZXZpY2Ugd2hvIHN1cHBsaWVzIHRoaXMgY2hhbm5lbCwgYWx3YXlzICElTlVMTAogICogQGNvb2tpZTogbGFzdCBjb29raWUgdmFsdWUgcmV0dXJuZWQgdG8gY2xpZW50CiAgKiBAY2hhbl9pZDogY2hhbm5lbCBJRCBmb3Igc3lzZnMKLSAqIEBjbGFzc19kZXY6IGNsYXNzIGRldmljZSBmb3Igc3lzZnMKKyAqIEBkZXY6IGNsYXNzIGRldmljZSBmb3Igc3lzZnMKICAqIEByZWZjb3VudDoga3JlZiwgdXNlZCBpbiAiYmlncmVmIiBzbG93LW1vZGUKICAqIEBzbG93X3JlZjogaW5kaWNhdGVzIHRoYXQgdGhlIERNQSBjaGFubmVsIGlzIGZyZWUKICAqIEByY3U6IHRoZSBETUEgY2hhbm5lbCdzIFJDVSBoZWFkCiAgKiBAZGV2aWNlX25vZGU6IHVzZWQgdG8gYWRkIHRoaXMgdG8gdGhlIGRldmljZSBjaGFuIGxpc3QKICAqIEBsb2NhbDogcGVyLWNwdSBwb2ludGVyIHRvIGEgc3RydWN0IGRtYV9jaGFuX3BlcmNwdQogICogQGNsaWVudC1jb3VudDogaG93IG1hbnkgY2xpZW50cyBhcmUgdXNpbmcgdGhpcyBjaGFubmVsCisgKiBAdGFibGVfY291bnQ6IG51bWJlciBvZiBhcHBlYXJhbmNlcyBpbiB0aGUgbWVtLXRvLW1lbSBhbGxvY2F0aW9uIHRhYmxlCiAgKi8KIHN0cnVjdCBkbWFfY2hhbiB7CiAJc3RydWN0IGRtYV9kZXZpY2UgKmRldmljZTsKQEAgLTE5MCw3MyArMTI4LDQ3IEBACiAKIAkvKiBzeXNmcyAqLwogCWludCBjaGFuX2lkOwotCXN0cnVjdCBkZXZpY2UgZGV2OwotCi0Jc3RydWN0IGtyZWYgcmVmY291bnQ7Ci0JaW50IHNsb3dfcmVmOwotCXN0cnVjdCByY3VfaGVhZCByY3U7CisJc3RydWN0IGRtYV9jaGFuX2RldiAqZGV2OwogCiAJc3RydWN0IGxpc3RfaGVhZCBkZXZpY2Vfbm9kZTsKIAlzdHJ1Y3QgZG1hX2NoYW5fcGVyY3B1ICpsb2NhbDsKIAlpbnQgY2xpZW50X2NvdW50OworCWludCB0YWJsZV9jb3VudDsKIH07CiAKLSNkZWZpbmUgdG9fZG1hX2NoYW4ocCkgY29udGFpbmVyX29mKHAsIHN0cnVjdCBkbWFfY2hhbiwgZGV2KQorLyoqCisgKiBzdHJ1Y3QgZG1hX2NoYW5fZGV2IC0gcmVsYXRlIHN5c2ZzIGRldmljZSBub2RlIHRvIGJhY2tpbmcgY2hhbm5lbCBkZXZpY2UKKyAqIEBjaGFuIC0gZHJpdmVyIGNoYW5uZWwgZGV2aWNlCisgKiBAZGV2aWNlIC0gc3lzZnMgZGV2aWNlCisgKiBAZGV2X2lkIC0gcGFyZW50IGRtYV9kZXZpY2UgZGV2X2lkCisgKiBAaWRyX3JlZiAtIHJlZmVyZW5jZSBjb3VudCB0byBnYXRlIHJlbGVhc2Ugb2YgZG1hX2RldmljZSBkZXZfaWQKKyAqLworc3RydWN0IGRtYV9jaGFuX2RldiB7CisJc3RydWN0IGRtYV9jaGFuICpjaGFuOworCXN0cnVjdCBkZXZpY2UgZGV2aWNlOworCWludCBkZXZfaWQ7CisJYXRvbWljX3QgKmlkcl9yZWY7Cit9OworCitzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIgKmRtYV9jaGFuX25hbWUoc3RydWN0IGRtYV9jaGFuICpjaGFuKQoreworCXJldHVybiBkZXZfbmFtZSgmY2hhbi0+ZGV2LT5kZXZpY2UpOworfQogCiB2b2lkIGRtYV9jaGFuX2NsZWFudXAoc3RydWN0IGtyZWYgKmtyZWYpOwogCi1zdGF0aWMgaW5saW5lIHZvaWQgZG1hX2NoYW5fZ2V0KHN0cnVjdCBkbWFfY2hhbiAqY2hhbikKLXsKLQlpZiAodW5saWtlbHkoY2hhbi0+c2xvd19yZWYpKQotCQlrcmVmX2dldCgmY2hhbi0+cmVmY291bnQpOwotCWVsc2UgewotCQlsb2NhbF9pbmMoJihwZXJfY3B1X3B0cihjaGFuLT5sb2NhbCwgZ2V0X2NwdSgpKS0+cmVmY291bnQpKTsKLQkJcHV0X2NwdSgpOwotCX0KLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGRtYV9jaGFuX3B1dChzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4pCi17Ci0JaWYgKHVubGlrZWx5KGNoYW4tPnNsb3dfcmVmKSkKLQkJa3JlZl9wdXQoJmNoYW4tPnJlZmNvdW50LCBkbWFfY2hhbl9jbGVhbnVwKTsKLQllbHNlIHsKLQkJbG9jYWxfZGVjKCYocGVyX2NwdV9wdHIoY2hhbi0+bG9jYWwsIGdldF9jcHUoKSktPnJlZmNvdW50KSk7Ci0JCXB1dF9jcHUoKTsKLQl9Ci19Ci0KLS8qCi0gKiB0eXBlZGVmIGRtYV9ldmVudF9jYWxsYmFjayAtIGZ1bmN0aW9uIHBvaW50ZXIgdG8gYSBETUEgZXZlbnQgY2FsbGJhY2sKLSAqIEZvciBlYWNoIGNoYW5uZWwgYWRkZWQgdG8gdGhlIHN5c3RlbSB0aGlzIHJvdXRpbmUgaXMgY2FsbGVkIGZvciBlYWNoIGNsaWVudC4KLSAqIElmIHRoZSBjbGllbnQgd291bGQgbGlrZSB0byB1c2UgdGhlIGNoYW5uZWwgaXQgcmV0dXJucyAnMScgdG8gc2lnbmFsIChhY2spCi0gKiB0aGUgZG1hZW5naW5lIGNvcmUgdG8gdGFrZSBvdXQgYSByZWZlcmVuY2Ugb24gdGhlIGNoYW5uZWwgYW5kIGl0cwotICogY29ycmVzcG9uZGluZyBkZXZpY2UuICBBIGNsaWVudCBtdXN0IG5vdCAnYWNrJyBhbiBhdmFpbGFibGUgY2hhbm5lbCBtb3JlCi0gKiB0aGFuIG9uY2UuICBXaGVuIGEgY2hhbm5lbCBpcyByZW1vdmVkIGFsbCBjbGllbnRzIGFyZSBub3RpZmllZC4gIElmIGEgY2xpZW50Ci0gKiBpcyB1c2luZyB0aGUgY2hhbm5lbCBpdCBtdXN0ICdhY2snIHRoZSByZW1vdmFsLiAgQSBjbGllbnQgbXVzdCBub3QgJ2FjaycgYQotICogcmVtb3ZlZCBjaGFubmVsIG1vcmUgdGhhbiBvbmNlLgotICogQGNsaWVudCAtICd0aGlzJyBwb2ludGVyIGZvciB0aGUgY2xpZW50IGNvbnRleHQKLSAqIEBjaGFuIC0gY2hhbm5lbCB0byBiZSBhY3RlZCB1cG9uCi0gKiBAc3RhdGUgLSBhdmFpbGFibGUgb3IgcmVtb3ZlZAotICovCi1zdHJ1Y3QgZG1hX2NsaWVudDsKLXR5cGVkZWYgZW51bSBkbWFfc3RhdGVfY2xpZW50ICgqZG1hX2V2ZW50X2NhbGxiYWNrKSAoc3RydWN0IGRtYV9jbGllbnQgKmNsaWVudCwKLQkJc3RydWN0IGRtYV9jaGFuICpjaGFuLCBlbnVtIGRtYV9zdGF0ZSBzdGF0ZSk7Ci0KIC8qKgotICogc3RydWN0IGRtYV9jbGllbnQgLSBpbmZvIG9uIHRoZSBlbnRpdHkgbWFraW5nIHVzZSBvZiBETUEgc2VydmljZXMKLSAqIEBldmVudF9jYWxsYmFjazogZnVuYyBwdHIgdG8gY2FsbCB3aGVuIHNvbWV0aGluZyBoYXBwZW5zCi0gKiBAY2FwX21hc2s6IG9ubHkgcmV0dXJuIGNoYW5uZWxzIHRoYXQgc2F0aXNmeSB0aGUgcmVxdWVzdGVkIGNhcGFiaWxpdGllcwotICogIGEgdmFsdWUgb2YgemVybyBjb3JyZXNwb25kcyB0byBhbnkgY2FwYWJpbGl0eQotICogQHNsYXZlOiBkYXRhIGZvciBwcmVwYXJpbmcgc2xhdmUgdHJhbnNmZXIuIE11c3QgYmUgbm9uLU5VTEwgaWZmIHRoZQotICogIERNQV9TTEFWRSBjYXBhYmlsaXR5IGlzIHJlcXVlc3RlZC4KLSAqIEBnbG9iYWxfbm9kZTogbGlzdF9oZWFkIGZvciBnbG9iYWwgZG1hX2NsaWVudF9saXN0CisgKiB0eXBlZGVmIGRtYV9maWx0ZXJfZm4gLSBjYWxsYmFjayBmaWx0ZXIgZm9yIGRtYV9yZXF1ZXN0X2NoYW5uZWwKKyAqIEBjaGFuOiBjaGFubmVsIHRvIGJlIHJldmlld2VkCisgKiBAZmlsdGVyX3BhcmFtOiBvcGFxdWUgcGFyYW1ldGVyIHBhc3NlZCB0aHJvdWdoIGRtYV9yZXF1ZXN0X2NoYW5uZWwKKyAqCisgKiBXaGVuIHRoaXMgb3B0aW9uYWwgcGFyYW1ldGVyIGlzIHNwZWNpZmllZCBpbiBhIGNhbGwgdG8gZG1hX3JlcXVlc3RfY2hhbm5lbCBhCisgKiBzdWl0YWJsZSBjaGFubmVsIGlzIHBhc3NlZCB0byB0aGlzIHJvdXRpbmUgZm9yIGZ1cnRoZXIgZGlzcG9zaXRpb25pbmcgYmVmb3JlCisgKiBiZWluZyByZXR1cm5lZC4gIFdoZXJlICdzdWl0YWJsZScgaW5kaWNhdGVzIGEgbm9uLWJ1c3kgY2hhbm5lbCB0aGF0CisgKiBzYXRpc2ZpZXMgdGhlIGdpdmVuIGNhcGFiaWxpdHkgbWFzay4gIEl0IHJldHVybnMgJ3RydWUnIHRvIGluZGljYXRlIHRoYXQgdGhlCisgKiBjaGFubmVsIGlzIHN1aXRhYmxlLgogICovCi1zdHJ1Y3QgZG1hX2NsaWVudCB7Ci0JZG1hX2V2ZW50X2NhbGxiYWNrCWV2ZW50X2NhbGxiYWNrOwotCWRtYV9jYXBfbWFza190CQljYXBfbWFzazsKLQlzdHJ1Y3QgZG1hX3NsYXZlCSpzbGF2ZTsKLQlzdHJ1Y3QgbGlzdF9oZWFkCWdsb2JhbF9ub2RlOwotfTsKK3R5cGVkZWYgYm9vbCAoKmRtYV9maWx0ZXJfZm4pKHN0cnVjdCBkbWFfY2hhbiAqY2hhbiwgdm9pZCAqZmlsdGVyX3BhcmFtKTsKIAogdHlwZWRlZiB2b2lkICgqZG1hX2FzeW5jX3R4X2NhbGxiYWNrKSh2b2lkICpkbWFfYXN5bmNfcGFyYW0pOwogLyoqCkBAIC0zMjMsMTQgKzIzNSwxMCBAQAogCWRtYV9jYXBfbWFza190ICBjYXBfbWFzazsKIAlpbnQgbWF4X3hvcjsKIAotCXN0cnVjdCBrcmVmIHJlZmNvdW50OwotCXN0cnVjdCBjb21wbGV0aW9uIGRvbmU7Ci0KIAlpbnQgZGV2X2lkOwogCXN0cnVjdCBkZXZpY2UgKmRldjsKIAotCWludCAoKmRldmljZV9hbGxvY19jaGFuX3Jlc291cmNlcykoc3RydWN0IGRtYV9jaGFuICpjaGFuLAotCQkJc3RydWN0IGRtYV9jbGllbnQgKmNsaWVudCk7CisJaW50ICgqZGV2aWNlX2FsbG9jX2NoYW5fcmVzb3VyY2VzKShzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4pOwogCXZvaWQgKCpkZXZpY2VfZnJlZV9jaGFuX3Jlc291cmNlcykoc3RydWN0IGRtYV9jaGFuICpjaGFuKTsKIAogCXN0cnVjdCBkbWFfYXN5bmNfdHhfZGVzY3JpcHRvciAqKCpkZXZpY2VfcHJlcF9kbWFfbWVtY3B5KSgKQEAgLTM2Miw5ICsyNzAsMTggQEAKIAogLyogLS0tIHB1YmxpYyBETUEgZW5naW5lIEFQSSAtLS0gKi8KIAotdm9pZCBkbWFfYXN5bmNfY2xpZW50X3JlZ2lzdGVyKHN0cnVjdCBkbWFfY2xpZW50ICpjbGllbnQpOwotdm9pZCBkbWFfYXN5bmNfY2xpZW50X3VucmVnaXN0ZXIoc3RydWN0IGRtYV9jbGllbnQgKmNsaWVudCk7Ci12b2lkIGRtYV9hc3luY19jbGllbnRfY2hhbl9yZXF1ZXN0KHN0cnVjdCBkbWFfY2xpZW50ICpjbGllbnQpOworI2lmZGVmIENPTkZJR19ETUFfRU5HSU5FCit2b2lkIGRtYWVuZ2luZV9nZXQodm9pZCk7Cit2b2lkIGRtYWVuZ2luZV9wdXQodm9pZCk7CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIGRtYWVuZ2luZV9nZXQodm9pZCkKK3sKK30KK3N0YXRpYyBpbmxpbmUgdm9pZCBkbWFlbmdpbmVfcHV0KHZvaWQpCit7Cit9CisjZW5kaWYKKwogZG1hX2Nvb2tpZV90IGRtYV9hc3luY19tZW1jcHlfYnVmX3RvX2J1ZihzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4sCiAJdm9pZCAqZGVzdCwgdm9pZCAqc3JjLCBzaXplX3QgbGVuKTsKIGRtYV9jb29raWVfdCBkbWFfYXN5bmNfbWVtY3B5X2J1Zl90b19wZyhzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4sCkBAIC00MDYsNiArMzIzLDEyIEBACiAJc2V0X2JpdCh0eF90eXBlLCBkc3RwLT5iaXRzKTsKIH0KIAorI2RlZmluZSBkbWFfY2FwX3plcm8obWFzaykgX19kbWFfY2FwX3plcm8oJihtYXNrKSkKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2RtYV9jYXBfemVybyhkbWFfY2FwX21hc2tfdCAqZHN0cCkKK3sKKwliaXRtYXBfemVybyhkc3RwLT5iaXRzLCBETUFfVFhfVFlQRV9FTkQpOworfQorCiAjZGVmaW5lIGRtYV9oYXNfY2FwKHR4LCBtYXNrKSBfX2RtYV9oYXNfY2FwKCh0eCksICYobWFzaykpCiBzdGF0aWMgaW5saW5lIGludAogX19kbWFfaGFzX2NhcChlbnVtIGRtYV90cmFuc2FjdGlvbl90eXBlIHR4X3R5cGUsIGRtYV9jYXBfbWFza190ICpzcmNwKQpAQCAtNDc1LDExICszOTgsMjUgQEAKIH0KIAogZW51bSBkbWFfc3RhdHVzIGRtYV9zeW5jX3dhaXQoc3RydWN0IGRtYV9jaGFuICpjaGFuLCBkbWFfY29va2llX3QgY29va2llKTsKKyNpZmRlZiBDT05GSUdfRE1BX0VOR0lORQorZW51bSBkbWFfc3RhdHVzIGRtYV93YWl0X2Zvcl9hc3luY190eChzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKnR4KTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIGVudW0gZG1hX3N0YXR1cyBkbWFfd2FpdF9mb3JfYXN5bmNfdHgoc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICp0eCkKK3sKKwlyZXR1cm4gRE1BX1NVQ0NFU1M7Cit9CisjZW5kaWYKIAogLyogLS0tIERNQSBkZXZpY2UgLS0tICovCiAKIGludCBkbWFfYXN5bmNfZGV2aWNlX3JlZ2lzdGVyKHN0cnVjdCBkbWFfZGV2aWNlICpkZXZpY2UpOwogdm9pZCBkbWFfYXN5bmNfZGV2aWNlX3VucmVnaXN0ZXIoc3RydWN0IGRtYV9kZXZpY2UgKmRldmljZSk7Cit2b2lkIGRtYV9ydW5fZGVwZW5kZW5jaWVzKHN0cnVjdCBkbWFfYXN5bmNfdHhfZGVzY3JpcHRvciAqdHgpOworc3RydWN0IGRtYV9jaGFuICpkbWFfZmluZF9jaGFubmVsKGVudW0gZG1hX3RyYW5zYWN0aW9uX3R5cGUgdHhfdHlwZSk7Cit2b2lkIGRtYV9pc3N1ZV9wZW5kaW5nX2FsbCh2b2lkKTsKKyNkZWZpbmUgZG1hX3JlcXVlc3RfY2hhbm5lbChtYXNrLCB4LCB5KSBfX2RtYV9yZXF1ZXN0X2NoYW5uZWwoJihtYXNrKSwgeCwgeSkKK3N0cnVjdCBkbWFfY2hhbiAqX19kbWFfcmVxdWVzdF9jaGFubmVsKGRtYV9jYXBfbWFza190ICptYXNrLCBkbWFfZmlsdGVyX2ZuIGZuLCB2b2lkICpmbl9wYXJhbSk7Cit2b2lkIGRtYV9yZWxlYXNlX2NoYW5uZWwoc3RydWN0IGRtYV9jaGFuICpjaGFuKTsKIAogLyogLS0tIEhlbHBlciBpb3YtbG9ja2luZyBmdW5jdGlvbnMgLS0tICovCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZHdfZG1hYy5oIGIvaW5jbHVkZS9saW51eC9kd19kbWFjLmgKaW5kZXggMDRkMjE3Yi4uZDc5N2RkZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9kd19kbWFjLmgKKysrIGIvaW5jbHVkZS9saW51eC9kd19kbWFjLmgKQEAgLTIyLDE0ICsyMiwzNCBAQAogfTsKIAogLyoqCisgKiBlbnVtIGR3X2RtYV9zbGF2ZV93aWR0aCAtIERNQSBzbGF2ZSByZWdpc3RlciBhY2Nlc3Mgd2lkdGguCisgKiBARE1BX1NMQVZFX1dJRFRIXzhCSVQ6IERvIDgtYml0IHNsYXZlIHJlZ2lzdGVyIGFjY2Vzc2VzCisgKiBARE1BX1NMQVZFX1dJRFRIXzE2QklUOiBEbyAxNi1iaXQgc2xhdmUgcmVnaXN0ZXIgYWNjZXNzZXMKKyAqIEBETUFfU0xBVkVfV0lEVEhfMzJCSVQ6IERvIDMyLWJpdCBzbGF2ZSByZWdpc3RlciBhY2Nlc3NlcworICovCitlbnVtIGR3X2RtYV9zbGF2ZV93aWR0aCB7CisJRFdfRE1BX1NMQVZFX1dJRFRIXzhCSVQsCisJRFdfRE1BX1NMQVZFX1dJRFRIXzE2QklULAorCURXX0RNQV9TTEFWRV9XSURUSF8zMkJJVCwKK307CisKKy8qKgogICogc3RydWN0IGR3X2RtYV9zbGF2ZSAtIENvbnRyb2xsZXItc3BlY2lmaWMgaW5mb3JtYXRpb24gYWJvdXQgYSBzbGF2ZQotICogQHNsYXZlOiBHZW5lcmljIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzbGF2ZQotICogQGN0bF9sbzogUGxhdGZvcm0tc3BlY2lmaWMgaW5pdGlhbGl6ZXIgZm9yIHRoZSBDVExfTE8gcmVnaXN0ZXIKKyAqCisgKiBAZG1hX2RldjogcmVxdWlyZWQgRE1BIG1hc3RlciBkZXZpY2UKKyAqIEB0eF9yZWc6IHBoeXNpY2FsIGFkZHJlc3Mgb2YgZGF0YSByZWdpc3RlciB1c2VkIGZvcgorICoJbWVtb3J5LXRvLXBlcmlwaGVyYWwgdHJhbnNmZXJzCisgKiBAcnhfcmVnOiBwaHlzaWNhbCBhZGRyZXNzIG9mIGRhdGEgcmVnaXN0ZXIgdXNlZCBmb3IKKyAqCXBlcmlwaGVyYWwtdG8tbWVtb3J5IHRyYW5zZmVycworICogQHJlZ193aWR0aDogcGVyaXBoZXJhbCByZWdpc3RlciB3aWR0aAogICogQGNmZ19oaTogUGxhdGZvcm0tc3BlY2lmaWMgaW5pdGlhbGl6ZXIgZm9yIHRoZSBDRkdfSEkgcmVnaXN0ZXIKICAqIEBjZmdfbG86IFBsYXRmb3JtLXNwZWNpZmljIGluaXRpYWxpemVyIGZvciB0aGUgQ0ZHX0xPIHJlZ2lzdGVyCiAgKi8KIHN0cnVjdCBkd19kbWFfc2xhdmUgewotCXN0cnVjdCBkbWFfc2xhdmUJc2xhdmU7CisJc3RydWN0IGRldmljZQkJKmRtYV9kZXY7CisJZG1hX2FkZHJfdAkJdHhfcmVnOworCWRtYV9hZGRyX3QJCXJ4X3JlZzsKKwllbnVtIGR3X2RtYV9zbGF2ZV93aWR0aAlyZWdfd2lkdGg7CiAJdTMyCQkJY2ZnX2hpOwogCXUzMgkJCWNmZ19sbzsKIH07CkBAIC01NCw5ICs3NCw0IEBACiAjZGVmaW5lIERXQ19DRkdMX0hTX0RTVF9QT0wJKDEgPDwgMTgpCS8qIGRzdCBoYW5kc2hha2UgYWN0aXZlIGxvdyAqLwogI2RlZmluZSBEV0NfQ0ZHTF9IU19TUkNfUE9MCSgxIDw8IDE5KQkvKiBzcmMgaGFuZHNoYWtlIGFjdGl2ZSBsb3cgKi8KIAotc3RhdGljIGlubGluZSBzdHJ1Y3QgZHdfZG1hX3NsYXZlICp0b19kd19kbWFfc2xhdmUoc3RydWN0IGRtYV9zbGF2ZSAqc2xhdmUpCi17Ci0JcmV0dXJuIGNvbnRhaW5lcl9vZihzbGF2ZSwgc3RydWN0IGR3X2RtYV9zbGF2ZSwgc2xhdmUpOwotfQotCiAjZW5kaWYgLyogRFdfRE1BQ19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2V4dDJfZnMuaCBiL2luY2x1ZGUvbGludXgvZXh0Ml9mcy5oCmluZGV4IDc4Yzc3NWEuLjEyMTcyMGQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZXh0Ml9mcy5oCisrKyBiL2luY2x1ZGUvbGludXgvZXh0Ml9mcy5oCkBAIC0xOTQsNiArMTk0LDMwIEBACiAjZGVmaW5lIEVYVDJfRkxfVVNFUl9WSVNJQkxFCQlGU19GTF9VU0VSX1ZJU0lCTEUJLyogVXNlciB2aXNpYmxlIGZsYWdzICovCiAjZGVmaW5lIEVYVDJfRkxfVVNFUl9NT0RJRklBQkxFCQlGU19GTF9VU0VSX01PRElGSUFCTEUJLyogVXNlciBtb2RpZmlhYmxlIGZsYWdzICovCiAKKy8qIEZsYWdzIHRoYXQgc2hvdWxkIGJlIGluaGVyaXRlZCBieSBuZXcgaW5vZGVzIGZyb20gdGhlaXIgcGFyZW50LiAqLworI2RlZmluZSBFWFQyX0ZMX0lOSEVSSVRFRCAoRVhUMl9TRUNSTV9GTCB8IEVYVDJfVU5STV9GTCB8IEVYVDJfQ09NUFJfRkwgfFwKKwkJCSAgIEVYVDJfU1lOQ19GTCB8IEVYVDJfSU1NVVRBQkxFX0ZMIHwgRVhUMl9BUFBFTkRfRkwgfFwKKwkJCSAgIEVYVDJfTk9EVU1QX0ZMIHwgRVhUMl9OT0FUSU1FX0ZMIHwgRVhUMl9DT01QUkJMS19GTHxcCisJCQkgICBFWFQyX05PQ09NUF9GTCB8IEVYVDJfSk9VUk5BTF9EQVRBX0ZMIHxcCisJCQkgICBFWFQyX05PVEFJTF9GTCB8IEVYVDJfRElSU1lOQ19GTCkKKworLyogRmxhZ3MgdGhhdCBhcmUgYXBwcm9wcmlhdGUgZm9yIHJlZ3VsYXIgZmlsZXMgKGFsbCBidXQgZGlyLXNwZWNpZmljIG9uZXMpLiAqLworI2RlZmluZSBFWFQyX1JFR19GTE1BU0sgKH4oRVhUMl9ESVJTWU5DX0ZMIHwgRVhUMl9UT1BESVJfRkwpKQorCisvKiBGbGFncyB0aGF0IGFyZSBhcHByb3ByaWF0ZSBmb3Igbm9uLWRpcmVjdG9yaWVzL3JlZ3VsYXIgZmlsZXMuICovCisjZGVmaW5lIEVYVDJfT1RIRVJfRkxNQVNLIChFWFQyX05PRFVNUF9GTCB8IEVYVDJfTk9BVElNRV9GTCkKKworLyogTWFzayBvdXQgZmxhZ3MgdGhhdCBhcmUgaW5hcHByb3ByaWF0ZSBmb3IgdGhlIGdpdmVuIHR5cGUgb2YgaW5vZGUuICovCitzdGF0aWMgaW5saW5lIF9fdTMyIGV4dDJfbWFza19mbGFncyh1bW9kZV90IG1vZGUsIF9fdTMyIGZsYWdzKQoreworCWlmIChTX0lTRElSKG1vZGUpKQorCQlyZXR1cm4gZmxhZ3M7CisJZWxzZSBpZiAoU19JU1JFRyhtb2RlKSkKKwkJcmV0dXJuIGZsYWdzICYgRVhUMl9SRUdfRkxNQVNLOworCWVsc2UKKwkJcmV0dXJuIGZsYWdzICYgRVhUMl9PVEhFUl9GTE1BU0s7Cit9CisKIC8qCiAgKiBpb2N0bCBjb21tYW5kcwogICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2V4dDJfZnNfc2IuaCBiL2luY2x1ZGUvbGludXgvZXh0Ml9mc19zYi5oCmluZGV4IGRjNTQxZjMuLjFjZGI2NjMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZXh0Ml9mc19zYi5oCisrKyBiL2luY2x1ZGUvbGludXgvZXh0Ml9mc19zYi5oCkBAIC0xMDEsNyArMTAxLDcgQEAKIAlzdHJ1Y3QgcGVyY3B1X2NvdW50ZXIgc19mcmVlYmxvY2tzX2NvdW50ZXI7CiAJc3RydWN0IHBlcmNwdV9jb3VudGVyIHNfZnJlZWlub2Rlc19jb3VudGVyOwogCXN0cnVjdCBwZXJjcHVfY291bnRlciBzX2RpcnNfY291bnRlcjsKLQlzdHJ1Y3QgYmxvY2tncm91cF9sb2NrIHNfYmxvY2tncm91cF9sb2NrOworCXN0cnVjdCBibG9ja2dyb3VwX2xvY2sgKnNfYmxvY2tncm91cF9sb2NrOwogCS8qIHJvb3Qgb2YgdGhlIHBlciBmcyByZXNlcnZhdGlvbiB3aW5kb3cgdHJlZSAqLwogCXNwaW5sb2NrX3Qgc19yc3Zfd2luZG93X2xvY2s7CiAJc3RydWN0IHJiX3Jvb3Qgc19yc3Zfd2luZG93X3Jvb3Q7CkBAIC0xMTEsNyArMTExLDcgQEAKIHN0YXRpYyBpbmxpbmUgc3BpbmxvY2tfdCAqCiBzYl9iZ2xfbG9jayhzdHJ1Y3QgZXh0Ml9zYl9pbmZvICpzYmksIHVuc2lnbmVkIGludCBibG9ja19ncm91cCkKIHsKLQlyZXR1cm4gYmdsX2xvY2tfcHRyKCZzYmktPnNfYmxvY2tncm91cF9sb2NrLCBibG9ja19ncm91cCk7CisJcmV0dXJuIGJnbF9sb2NrX3B0cihzYmktPnNfYmxvY2tncm91cF9sb2NrLCBibG9ja19ncm91cCk7CiB9CiAKICNlbmRpZgkvKiBfTElOVVhfRVhUMl9GU19TQiAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9leHQzX2ZzLmggYi9pbmNsdWRlL2xpbnV4L2V4dDNfZnMuaAppbmRleCBkMTRmMDI5Li5kZDQ5NWI4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2V4dDNfZnMuaAorKysgYi9pbmNsdWRlL2xpbnV4L2V4dDNfZnMuaApAQCAtMTc4LDYgKzE3OCwzMCBAQAogI2RlZmluZSBFWFQzX0ZMX1VTRVJfVklTSUJMRQkJMHgwMDAzREZGRiAvKiBVc2VyIHZpc2libGUgZmxhZ3MgKi8KICNkZWZpbmUgRVhUM19GTF9VU0VSX01PRElGSUFCTEUJCTB4MDAwMzgwRkYgLyogVXNlciBtb2RpZmlhYmxlIGZsYWdzICovCiAKKy8qIEZsYWdzIHRoYXQgc2hvdWxkIGJlIGluaGVyaXRlZCBieSBuZXcgaW5vZGVzIGZyb20gdGhlaXIgcGFyZW50LiAqLworI2RlZmluZSBFWFQzX0ZMX0lOSEVSSVRFRCAoRVhUM19TRUNSTV9GTCB8IEVYVDNfVU5STV9GTCB8IEVYVDNfQ09NUFJfRkwgfFwKKwkJCSAgIEVYVDNfU1lOQ19GTCB8IEVYVDNfSU1NVVRBQkxFX0ZMIHwgRVhUM19BUFBFTkRfRkwgfFwKKwkJCSAgIEVYVDNfTk9EVU1QX0ZMIHwgRVhUM19OT0FUSU1FX0ZMIHwgRVhUM19DT01QUkJMS19GTHxcCisJCQkgICBFWFQzX05PQ09NUFJfRkwgfCBFWFQzX0pPVVJOQUxfREFUQV9GTCB8XAorCQkJICAgRVhUM19OT1RBSUxfRkwgfCBFWFQzX0RJUlNZTkNfRkwpCisKKy8qIEZsYWdzIHRoYXQgYXJlIGFwcHJvcHJpYXRlIGZvciByZWd1bGFyIGZpbGVzIChhbGwgYnV0IGRpci1zcGVjaWZpYyBvbmVzKS4gKi8KKyNkZWZpbmUgRVhUM19SRUdfRkxNQVNLICh+KEVYVDNfRElSU1lOQ19GTCB8IEVYVDNfVE9QRElSX0ZMKSkKKworLyogRmxhZ3MgdGhhdCBhcmUgYXBwcm9wcmlhdGUgZm9yIG5vbi1kaXJlY3Rvcmllcy9yZWd1bGFyIGZpbGVzLiAqLworI2RlZmluZSBFWFQzX09USEVSX0ZMTUFTSyAoRVhUM19OT0RVTVBfRkwgfCBFWFQzX05PQVRJTUVfRkwpCisKKy8qIE1hc2sgb3V0IGZsYWdzIHRoYXQgYXJlIGluYXBwcm9wcmlhdGUgZm9yIHRoZSBnaXZlbiB0eXBlIG9mIGlub2RlLiAqLworc3RhdGljIGlubGluZSBfX3UzMiBleHQzX21hc2tfZmxhZ3ModW1vZGVfdCBtb2RlLCBfX3UzMiBmbGFncykKK3sKKwlpZiAoU19JU0RJUihtb2RlKSkKKwkJcmV0dXJuIGZsYWdzOworCWVsc2UgaWYgKFNfSVNSRUcobW9kZSkpCisJCXJldHVybiBmbGFncyAmIEVYVDNfUkVHX0ZMTUFTSzsKKwllbHNlCisJCXJldHVybiBmbGFncyAmIEVYVDNfT1RIRVJfRkxNQVNLOworfQorCiAvKgogICogSW5vZGUgZHluYW1pYyBzdGF0ZSBmbGFncwogICovCkBAIC0zNTQsNiArMzc4LDEzIEBACiAjZGVmaW5lCUVYVDNfT1JQSEFOX0ZTCQkJMHgwMDA0CS8qIE9ycGhhbnMgYmVpbmcgcmVjb3ZlcmVkICovCiAKIC8qCisgKiBNaXNjLiBmaWxlc3lzdGVtIGZsYWdzCisgKi8KKyNkZWZpbmUgRVhUMl9GTEFHU19TSUdORURfSEFTSAkJMHgwMDAxICAvKiBTaWduZWQgZGlyaGFzaCBpbiB1c2UgKi8KKyNkZWZpbmUgRVhUMl9GTEFHU19VTlNJR05FRF9IQVNICTB4MDAwMiAgLyogVW5zaWduZWQgZGlyaGFzaCBpbiB1c2UgKi8KKyNkZWZpbmUgRVhUMl9GTEFHU19URVNUX0ZJTEVTWVMJCTB4MDAwNAkvKiB0byB0ZXN0IGRldmVsb3BtZW50IGNvZGUgKi8KKworLyoKICAqIE1vdW50IGZsYWdzCiAgKi8KICNkZWZpbmUgRVhUM19NT1VOVF9DSEVDSwkJMHgwMDAwMQkvKiBEbyBtb3VudC10aW1lIGNoZWNrcyAqLwpAQCAtNDg5LDcgKzUyMCwyMyBAQAogCV9fdTE2CXNfcmVzZXJ2ZWRfd29yZF9wYWQ7CiAJX19sZTMyCXNfZGVmYXVsdF9tb3VudF9vcHRzOwogCV9fbGUzMglzX2ZpcnN0X21ldGFfYmc7CS8qIEZpcnN0IG1ldGFibG9jayBibG9jayBncm91cCAqLwotCV9fdTMyCXNfcmVzZXJ2ZWRbMTkwXTsJLyogUGFkZGluZyB0byB0aGUgZW5kIG9mIHRoZSBibG9jayAqLworCV9fbGUzMglzX21rZnNfdGltZTsJCS8qIFdoZW4gdGhlIGZpbGVzeXN0ZW0gd2FzIGNyZWF0ZWQgKi8KKwlfX2xlMzIJc19qbmxfYmxvY2tzWzE3XTsJLyogQmFja3VwIG9mIHRoZSBqb3VybmFsIGlub2RlICovCisJLyogNjRiaXQgc3VwcG9ydCB2YWxpZCBpZiBFWFQ0X0ZFQVRVUkVfQ09NUEFUXzY0QklUICovCisvKjE1MCovCV9fbGUzMglzX2Jsb2Nrc19jb3VudF9oaTsJLyogQmxvY2tzIGNvdW50ICovCisJX19sZTMyCXNfcl9ibG9ja3NfY291bnRfaGk7CS8qIFJlc2VydmVkIGJsb2NrcyBjb3VudCAqLworCV9fbGUzMglzX2ZyZWVfYmxvY2tzX2NvdW50X2hpOwkvKiBGcmVlIGJsb2NrcyBjb3VudCAqLworCV9fbGUxNglzX21pbl9leHRyYV9pc2l6ZTsJLyogQWxsIGlub2RlcyBoYXZlIGF0IGxlYXN0ICMgYnl0ZXMgKi8KKwlfX2xlMTYJc193YW50X2V4dHJhX2lzaXplOyAJLyogTmV3IGlub2RlcyBzaG91bGQgcmVzZXJ2ZSAjIGJ5dGVzICovCisJX19sZTMyCXNfZmxhZ3M7CQkvKiBNaXNjZWxsYW5lb3VzIGZsYWdzICovCisJX19sZTE2ICBzX3JhaWRfc3RyaWRlOwkJLyogUkFJRCBzdHJpZGUgKi8KKwlfX2xlMTYgIHNfbW1wX2ludGVydmFsOyAgICAgICAgIC8qICMgc2Vjb25kcyB0byB3YWl0IGluIE1NUCBjaGVja2luZyAqLworCV9fbGU2NCAgc19tbXBfYmxvY2s7ICAgICAgICAgICAgLyogQmxvY2sgZm9yIG11bHRpLW1vdW50IHByb3RlY3Rpb24gKi8KKwlfX2xlMzIgIHNfcmFpZF9zdHJpcGVfd2lkdGg7ICAgIC8qIGJsb2NrcyBvbiBhbGwgZGF0YSBkaXNrcyAoTipzdHJpZGUpKi8KKwlfX3U4CXNfbG9nX2dyb3Vwc19wZXJfZmxleDsgIC8qIEZMRVhfQkcgZ3JvdXAgc2l6ZSAqLworCV9fdTgJc19yZXNlcnZlZF9jaGFyX3BhZDI7CisJX19sZTE2ICBzX3Jlc2VydmVkX3BhZDsKKwlfX3UzMiAgIHNfcmVzZXJ2ZWRbMTYyXTsgICAgICAgIC8qIFBhZGRpbmcgdG8gdGhlIGVuZCBvZiB0aGUgYmxvY2sgKi8KIH07CiAKICNpZmRlZiBfX0tFUk5FTF9fCkBAIC02OTQsNiArNzQxLDkgQEAKICNkZWZpbmUgRFhfSEFTSF9MRUdBQ1kJCTAKICNkZWZpbmUgRFhfSEFTSF9IQUxGX01ENAkxCiAjZGVmaW5lIERYX0hBU0hfVEVBCQkyCisjZGVmaW5lIERYX0hBU0hfTEVHQUNZX1VOU0lHTkVECTMKKyNkZWZpbmUgRFhfSEFTSF9IQUxGX01ENF9VTlNJR05FRAk0CisjZGVmaW5lIERYX0hBU0hfVEVBX1VOU0lHTkVECQk1CiAKICNpZmRlZiBfX0tFUk5FTF9fCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZXh0M19mc19zYi5oIGIvaW5jbHVkZS9saW51eC9leHQzX2ZzX3NiLmgKaW5kZXggZTAyNGUzOC4uZjA3ZjM0ZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9leHQzX2ZzX3NiLmgKKysrIGIvaW5jbHVkZS9saW51eC9leHQzX2ZzX3NiLmgKQEAgLTU3LDEwICs1NywxMSBAQAogCXUzMiBzX25leHRfZ2VuZXJhdGlvbjsKIAl1MzIgc19oYXNoX3NlZWRbNF07CiAJaW50IHNfZGVmX2hhc2hfdmVyc2lvbjsKKwlpbnQgc19oYXNoX3Vuc2lnbmVkOwkvKiAzIGlmIGhhc2ggc2hvdWxkIGJlIHNpZ25lZCwgMCBpZiBub3QgKi8KIAlzdHJ1Y3QgcGVyY3B1X2NvdW50ZXIgc19mcmVlYmxvY2tzX2NvdW50ZXI7CiAJc3RydWN0IHBlcmNwdV9jb3VudGVyIHNfZnJlZWlub2Rlc19jb3VudGVyOwogCXN0cnVjdCBwZXJjcHVfY291bnRlciBzX2RpcnNfY291bnRlcjsKLQlzdHJ1Y3QgYmxvY2tncm91cF9sb2NrIHNfYmxvY2tncm91cF9sb2NrOworCXN0cnVjdCBibG9ja2dyb3VwX2xvY2sgKnNfYmxvY2tncm91cF9sb2NrOwogCiAJLyogcm9vdCBvZiB0aGUgcGVyIGZzIHJlc2VydmF0aW9uIHdpbmRvdyB0cmVlICovCiAJc3BpbmxvY2tfdCBzX3Jzdl93aW5kb3dfbG9jazsKQEAgLTg2LDcgKzg3LDcgQEAKIHN0YXRpYyBpbmxpbmUgc3BpbmxvY2tfdCAqCiBzYl9iZ2xfbG9jayhzdHJ1Y3QgZXh0M19zYl9pbmZvICpzYmksIHVuc2lnbmVkIGludCBibG9ja19ncm91cCkKIHsKLQlyZXR1cm4gYmdsX2xvY2tfcHRyKCZzYmktPnNfYmxvY2tncm91cF9sb2NrLCBibG9ja19ncm91cCk7CisJcmV0dXJuIGJnbF9sb2NrX3B0cihzYmktPnNfYmxvY2tncm91cF9sb2NrLCBibG9ja19ncm91cCk7CiB9CiAKICNlbmRpZgkvKiBfTElOVVhfRVhUM19GU19TQiAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9mYi5oIGIvaW5jbHVkZS9saW51eC9mYi5oCmluZGV4IDFlZTYzZGYuLjgxOGZlMjEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZmIuaAorKysgYi9pbmNsdWRlL2xpbnV4L2ZiLmgKQEAgLTEsNyArMSw3IEBACiAjaWZuZGVmIF9MSU5VWF9GQl9ICiAjZGVmaW5lIF9MSU5VWF9GQl9ICiAKLSNpbmNsdWRlIDxhc20vdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgogCiBzdHJ1Y3QgZGVudHJ5OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9mcy5oIGIvaW5jbHVkZS9saW51eC9mcy5oCmluZGV4IGQ3ZWJhNzcuLjYwMjJmNDQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZnMuaAorKysgYi9pbmNsdWRlL2xpbnV4L2ZzLmgKQEAgLTIzNCw2ICsyMzQsOCBAQAogI2RlZmluZSBCTUFQX0lPQ1RMIDEJCS8qIG9ic29sZXRlIC0ga2VwdCBmb3IgY29tcGF0aWJpbGl0eSAqLwogI2RlZmluZSBGSUJNQVAJICAgX0lPKDB4MDAsMSkJLyogYm1hcCBhY2Nlc3MgKi8KICNkZWZpbmUgRklHRVRCU1ogICBfSU8oMHgwMCwyKQkvKiBnZXQgdGhlIGJsb2NrIHNpemUgdXNlZCBmb3IgYm1hcCAqLworI2RlZmluZSBGSUZSRUVaRQlfSU9XUignWCcsIDExOSwgaW50KQkvKiBGcmVlemUgKi8KKyNkZWZpbmUgRklUSEFXCQlfSU9XUignWCcsIDEyMCwgaW50KQkvKiBUaGF3ICovCiAKICNkZWZpbmUJRlNfSU9DX0dFVEZMQUdTCQkJX0lPUignZicsIDEsIGxvbmcpCiAjZGVmaW5lCUZTX0lPQ19TRVRGTEFHUwkJCV9JT1coJ2YnLCAyLCBsb25nKQpAQCAtNTY1LDYgKzU2Nyw3IEBACiBzdHJ1Y3QgYmxvY2tfZGV2aWNlIHsKIAlkZXZfdAkJCWJkX2RldjsgIC8qIG5vdCBhIGtkZXZfdCAtIGl0J3MgYSBzZWFyY2gga2V5ICovCiAJc3RydWN0IGlub2RlICoJCWJkX2lub2RlOwkvKiB3aWxsIGRpZSAqLworCXN0cnVjdCBzdXBlcl9ibG9jayAqCWJkX3N1cGVyOwogCWludAkJCWJkX29wZW5lcnM7CiAJc3RydWN0IG11dGV4CQliZF9tdXRleDsJLyogb3Blbi9jbG9zZSBtdXRleCAqLwogCXN0cnVjdCBzZW1hcGhvcmUJYmRfbW91bnRfc2VtOwpAQCAtNTkwLDYgKzU5MywxMSBAQAogCSAqIGNhcmUgdG8gbm90IG1lc3MgdXAgYmRfcHJpdmF0ZSBmb3IgdGhhdCBjYXNlLgogCSAqLwogCXVuc2lnbmVkIGxvbmcJCWJkX3ByaXZhdGU7CisKKwkvKiBUaGUgY291bnRlciBvZiBmcmVlemUgcHJvY2Vzc2VzICovCisJaW50CQkJYmRfZnNmcmVlemVfY291bnQ7CisJLyogTXV0ZXggZm9yIGZyZWV6ZSAqLworCXN0cnVjdCBtdXRleAkJYmRfZnNmcmVlemVfbXV0ZXg7CiB9OwogCiAvKgpAQCAtMTE4NCw2ICsxMTkyLDExIEBACiAJICogZ2VuZXJpY19zaG93X29wdGlvbnMoKQogCSAqLwogCWNoYXIgKnNfb3B0aW9uczsKKworCS8qCisJICogc3RvcmFnZSBmb3IgYXN5bmNocm9ub3VzIG9wZXJhdGlvbnMKKwkgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIHNfYXN5bmNfbGlzdDsKIH07CiAKIGV4dGVybiBzdHJ1Y3QgdGltZXNwZWMgY3VycmVudF9mc190aW1lKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpOwpAQCAtMTM3MSw4ICsxMzg0LDggQEAKIAl2b2lkICgqcHV0X3N1cGVyKSAoc3RydWN0IHN1cGVyX2Jsb2NrICopOwogCXZvaWQgKCp3cml0ZV9zdXBlcikgKHN0cnVjdCBzdXBlcl9ibG9jayAqKTsKIAlpbnQgKCpzeW5jX2ZzKShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgd2FpdCk7Ci0Jdm9pZCAoKndyaXRlX3N1cGVyX2xvY2tmcykgKHN0cnVjdCBzdXBlcl9ibG9jayAqKTsKLQl2b2lkICgqdW5sb2NrZnMpIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKik7CisJaW50ICgqZnJlZXplX2ZzKSAoc3RydWN0IHN1cGVyX2Jsb2NrICopOworCWludCAoKnVuZnJlZXplX2ZzKSAoc3RydWN0IHN1cGVyX2Jsb2NrICopOwogCWludCAoKnN0YXRmcykgKHN0cnVjdCBkZW50cnkgKiwgc3RydWN0IGtzdGF0ZnMgKik7CiAJaW50ICgqcmVtb3VudF9mcykgKHN0cnVjdCBzdXBlcl9ibG9jayAqLCBpbnQgKiwgY2hhciAqKTsKIAl2b2lkICgqY2xlYXJfaW5vZGUpIChzdHJ1Y3QgaW5vZGUgKik7CkBAIC0xMzg0LDYgKzEzOTcsNyBAQAogCXNzaXplX3QgKCpxdW90YV9yZWFkKShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgaW50LCBjaGFyICosIHNpemVfdCwgbG9mZl90KTsKIAlzc2l6ZV90ICgqcXVvdGFfd3JpdGUpKHN0cnVjdCBzdXBlcl9ibG9jayAqLCBpbnQsIGNvbnN0IGNoYXIgKiwgc2l6ZV90LCBsb2ZmX3QpOwogI2VuZGlmCisJaW50ICgqYmRldl90cnlfdG9fZnJlZV9wYWdlKShzdHJ1Y3Qgc3VwZXJfYmxvY2sqLCBzdHJ1Y3QgcGFnZSosIGdmcF90KTsKIH07CiAKIC8qCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2kyYy5oIGIvaW5jbHVkZS9saW51eC9pMmMuaAppbmRleCAzM2E1OTkyLi4yMDg3M2Q0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2kyYy5oCisrKyBiL2luY2x1ZGUvbGludXgvaTJjLmgKQEAgLTM5MywxMSArMzkzLDcgQEAKICNkZWZpbmUgSTJDX0NMQVNTX1RWX0FOQUxPRwkoMTw8MSkJLyogYnR0diArIGZyaWVuZHMgKi8KICNkZWZpbmUgSTJDX0NMQVNTX1RWX0RJR0lUQUwJKDE8PDIpCS8qIGR2YiBjYXJkcyAqLwogI2RlZmluZSBJMkNfQ0xBU1NfRERDCQkoMTw8MykJLyogRERDIGJ1cyBvbiBncmFwaGljcyBhZGFwdGVycyAqLwotI2RlZmluZSBJMkNfQ0xBU1NfQ0FNX0FOQUxPRwkoMTw8NCkJLyogY2FtZXJhIHdpdGggYW5hbG9nIENDRCAqLwotI2RlZmluZSBJMkNfQ0xBU1NfQ0FNX0RJR0lUQUwJKDE8PDUpCS8qIG1vc3Qgd2ViY2FtcyAqLwotI2RlZmluZSBJMkNfQ0xBU1NfU09VTkQJCSgxPDw2KQkvKiBzb3VuZCBkZXZpY2VzICovCiAjZGVmaW5lIEkyQ19DTEFTU19TUEQJCSgxPDw3KQkvKiBTUEQgRUVQUk9NcyBhbmQgc2ltaWxhciAqLwotI2RlZmluZSBJMkNfQ0xBU1NfQUxMCQkoVUlOVF9NQVgpIC8qIGFsbCBvZiB0aGUgYWJvdmUgKi8KIAogLyogaTJjX2NsaWVudF9hZGRyZXNzX2RhdGEgaXMgdGhlIHN0cnVjdCBmb3IgaG9sZGluZyBkZWZhdWx0IGNsaWVudAogICogYWRkcmVzc2VzIGZvciBhIGRyaXZlciBhbmQgZm9yIHRoZSBwYXJhbWV0ZXJzIHN1cHBsaWVkIG9uIHRoZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pZGUuaCBiL2luY2x1ZGUvbGludXgvaWRlLmgKaW5kZXggMzY0NGY2My4uMTk0ZGE1YSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pZGUuaAorKysgYi9pbmNsdWRlL2xpbnV4L2lkZS5oCkBAIC04NzEsNyArODcxLDcgQEAKIAlpZGVfaHdpZl90CSpjdXJfcG9ydDsJLyogZm9yIGhvc3RzIHJlcXVpcmluZyBzZXJpYWxpemF0aW9uICovCiAKIAkvKiB1c2VkIGZvciBob3N0cyByZXF1aXJpbmcgc2VyaWFsaXphdGlvbiAqLwotCXZvbGF0aWxlIGxvbmcJaG9zdF9idXN5OworCXZvbGF0aWxlIHVuc2lnbmVkIGxvbmcJaG9zdF9idXN5OwogfTsKIAogI2RlZmluZSBJREVfSE9TVF9CVVNZIDAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaWZfcHBwb2wydHAuaCBiL2luY2x1ZGUvbGludXgvaWZfcHBwb2wydHAuaAppbmRleCBhN2Q2YTIyLi5jN2E2Njg4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2lmX3BwcG9sMnRwLmgKKysrIGIvaW5jbHVkZS9saW51eC9pZl9wcHBvbDJ0cC5oCkBAIC0xNSw3ICsxNSw3IEBACiAjaWZuZGVmIF9fTElOVVhfSUZfUFBQT0wyVFBfSAogI2RlZmluZSBfX0xJTlVYX0lGX1BQUE9MMlRQX0gKIAotI2luY2x1ZGUgPGFzbS90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAKICNpZmRlZiBfX0tFUk5FTF9fCiAjaW5jbHVkZSA8bGludXgvaW4uaD4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaWZfcHBwb3guaCBiL2luY2x1ZGUvbGludXgvaWZfcHBwb3guaAppbmRleCA2ZmI3ZjE3Li4zMGM4OGIyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2lmX3BwcG94LmgKKysrIGIvaW5jbHVkZS9saW51eC9pZl9wcHBveC5oCkBAIC0xNyw3ICsxNyw3IEBACiAjZGVmaW5lIF9fTElOVVhfSUZfUFBQT1hfSAogCiAKLSNpbmNsdWRlIDxhc20vdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KIAogI2lmZGVmICBfX0tFUk5FTF9fCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2lmX3ZsYW4uaCBiL2luY2x1ZGUvbGludXgvaWZfdmxhbi5oCmluZGV4IGE1Y2IwYzMuLmY4ZmY5MTggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaWZfdmxhbi5oCisrKyBiL2luY2x1ZGUvbGludXgvaWZfdmxhbi5oCkBAIC0xMTUsNiArMTE1LDExIEBACiBleHRlcm4gaW50IF9fdmxhbl9od2FjY2VsX3J4KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCB2bGFuX2dyb3VwICpncnAsCiAJCQkgICAgIHUxNiB2bGFuX3RjaSwgaW50IHBvbGxpbmcpOwogZXh0ZXJuIGludCB2bGFuX2h3YWNjZWxfZG9fcmVjZWl2ZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKK2V4dGVybiBpbnQgdmxhbl9ncm9fcmVjZWl2ZShzdHJ1Y3QgbmFwaV9zdHJ1Y3QgKm5hcGksIHN0cnVjdCB2bGFuX2dyb3VwICpncnAsCisJCQkgICAgdW5zaWduZWQgaW50IHZsYW5fdGNpLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKK2V4dGVybiBpbnQgdmxhbl9ncm9fZnJhZ3Moc3RydWN0IG5hcGlfc3RydWN0ICpuYXBpLCBzdHJ1Y3Qgdmxhbl9ncm91cCAqZ3JwLAorCQkJICB1bnNpZ25lZCBpbnQgdmxhbl90Y2ksCisJCQkgIHN0cnVjdCBuYXBpX2dyb19mcmFnaW5mbyAqaW5mbyk7CiAKICNlbHNlCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBuZXRfZGV2aWNlICp2bGFuX2Rldl9yZWFsX2Rldihjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQpAQCAtMTQwLDYgKzE0NSwyMCBAQAogewogCXJldHVybiAwOwogfQorCitzdGF0aWMgaW5saW5lIGludCB2bGFuX2dyb19yZWNlaXZlKHN0cnVjdCBuYXBpX3N0cnVjdCAqbmFwaSwKKwkJCQkgICBzdHJ1Y3Qgdmxhbl9ncm91cCAqZ3JwLAorCQkJCSAgIHVuc2lnbmVkIGludCB2bGFuX3RjaSwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlyZXR1cm4gTkVUX1JYX0RST1A7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHZsYW5fZ3JvX2ZyYWdzKHN0cnVjdCBuYXBpX3N0cnVjdCAqbmFwaSwKKwkJCQkgc3RydWN0IHZsYW5fZ3JvdXAgKmdycCwgdW5zaWduZWQgaW50IHZsYW5fdGNpLAorCQkJCSBzdHJ1Y3QgbmFwaV9ncm9fZnJhZ2luZm8gKmluZm8pCit7CisJcmV0dXJuIE5FVF9SWF9EUk9QOworfQogI2VuZGlmCiAKIC8qKgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pbnB1dC5oIGIvaW5jbHVkZS9saW51eC9pbnB1dC5oCmluZGV4IDlhNjM1NWYuLjEyNDlhMGMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaW5wdXQuaAorKysgYi9pbmNsdWRlL2xpbnV4L2lucHV0LmgKQEAgLTE2LDcgKzE2LDcgQEAKICNpbmNsdWRlIDxzeXMvdGltZS5oPgogI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPGFzbS90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjZW5kaWYKIAogLyoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaW9wb3J0LmggYi9pbmNsdWRlL2xpbnV4L2lvcG9ydC5oCmluZGV4IDA0MWU5NWEuLjMyZTRiMmYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaW9wb3J0LmgKKysrIGIvaW5jbHVkZS9saW51eC9pb3BvcnQuaApAQCAtNDksNiArNDksNyBAQAogI2RlZmluZSBJT1JFU09VUkNFX1NJWkVBTElHTgkweDAwMDIwMDAwCS8qIHNpemUgaW5kaWNhdGVzIGFsaWdubWVudCAqLwogI2RlZmluZSBJT1JFU09VUkNFX1NUQVJUQUxJR04JMHgwMDA0MDAwMAkvKiBzdGFydCBmaWVsZCBpcyBhbGlnbm1lbnQgKi8KIAorI2RlZmluZSBJT1JFU09VUkNFX0VYQ0xVU0lWRQkweDA4MDAwMDAwCS8qIFVzZXJsYW5kIG1heSBub3QgbWFwIHRoaXMgcmVzb3VyY2UgKi8KICNkZWZpbmUgSU9SRVNPVVJDRV9ESVNBQkxFRAkweDEwMDAwMDAwCiAjZGVmaW5lIElPUkVTT1VSQ0VfVU5TRVQJMHgyMDAwMDAwMAogI2RlZmluZSBJT1JFU09VUkNFX0FVVE8JCTB4NDAwMDAwMDAKQEAgLTEzMywxMyArMTM0LDE3IEBACiB9CiAKIC8qIENvbnZlbmllbmNlIHNob3J0aGFuZCB3aXRoIGFsbG9jYXRpb24gKi8KLSNkZWZpbmUgcmVxdWVzdF9yZWdpb24oc3RhcnQsbixuYW1lKQlfX3JlcXVlc3RfcmVnaW9uKCZpb3BvcnRfcmVzb3VyY2UsIChzdGFydCksIChuKSwgKG5hbWUpKQotI2RlZmluZSByZXF1ZXN0X21lbV9yZWdpb24oc3RhcnQsbixuYW1lKSBfX3JlcXVlc3RfcmVnaW9uKCZpb21lbV9yZXNvdXJjZSwgKHN0YXJ0KSwgKG4pLCAobmFtZSkpCisjZGVmaW5lIHJlcXVlc3RfcmVnaW9uKHN0YXJ0LG4sbmFtZSkJX19yZXF1ZXN0X3JlZ2lvbigmaW9wb3J0X3Jlc291cmNlLCAoc3RhcnQpLCAobiksIChuYW1lKSwgMCkKKyNkZWZpbmUgX19yZXF1ZXN0X21lbV9yZWdpb24oc3RhcnQsbixuYW1lLCBleGNsKSBfX3JlcXVlc3RfcmVnaW9uKCZpb21lbV9yZXNvdXJjZSwgKHN0YXJ0KSwgKG4pLCAobmFtZSksIGV4Y2wpCisjZGVmaW5lIHJlcXVlc3RfbWVtX3JlZ2lvbihzdGFydCxuLG5hbWUpIF9fcmVxdWVzdF9yZWdpb24oJmlvbWVtX3Jlc291cmNlLCAoc3RhcnQpLCAobiksIChuYW1lKSwgMCkKKyNkZWZpbmUgcmVxdWVzdF9tZW1fcmVnaW9uX2V4Y2x1c2l2ZShzdGFydCxuLG5hbWUpIFwKKwlfX3JlcXVlc3RfcmVnaW9uKCZpb21lbV9yZXNvdXJjZSwgKHN0YXJ0KSwgKG4pLCAobmFtZSksIElPUkVTT1VSQ0VfRVhDTFVTSVZFKQogI2RlZmluZSByZW5hbWVfcmVnaW9uKHJlZ2lvbiwgbmV3bmFtZSkgZG8geyAocmVnaW9uKS0+bmFtZSA9IChuZXduYW1lKTsgfSB3aGlsZSAoMCkKIAogZXh0ZXJuIHN0cnVjdCByZXNvdXJjZSAqIF9fcmVxdWVzdF9yZWdpb24oc3RydWN0IHJlc291cmNlICosCiAJCQkJCXJlc291cmNlX3NpemVfdCBzdGFydCwKLQkJCQkJcmVzb3VyY2Vfc2l6ZV90IG4sIGNvbnN0IGNoYXIgKm5hbWUpOworCQkJCQlyZXNvdXJjZV9zaXplX3QgbiwKKwkJCQkJY29uc3QgY2hhciAqbmFtZSwgaW50IGZsYWdzKTsKIAogLyogQ29tcGF0aWJpbGl0eSBjcnVmdCAqLwogI2RlZmluZSByZWxlYXNlX3JlZ2lvbihzdGFydCxuKQlfX3JlbGVhc2VfcmVnaW9uKCZpb3BvcnRfcmVzb3VyY2UsIChzdGFydCksIChuKSkKQEAgLTE3NSw2ICsxODAsNyBAQAogZXh0ZXJuIHZvaWQgX19kZXZtX3JlbGVhc2VfcmVnaW9uKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJlc291cmNlICpwYXJlbnQsCiAJCQkJICByZXNvdXJjZV9zaXplX3Qgc3RhcnQsIHJlc291cmNlX3NpemVfdCBuKTsKIGV4dGVybiBpbnQgaW9tZW1fbWFwX3Nhbml0eV9jaGVjayhyZXNvdXJjZV9zaXplX3QgYWRkciwgdW5zaWduZWQgbG9uZyBzaXplKTsKK2V4dGVybiBpbnQgaW9tZW1faXNfZXhjbHVzaXZlKHU2NCBhZGRyKTsKIAogI2VuZGlmIC8qIF9fQVNTRU1CTFlfXyAqLwogI2VuZGlmCS8qIF9MSU5VWF9JT1BPUlRfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pb3ByaW8uaCBiL2luY2x1ZGUvbGludXgvaW9wcmlvLmgKaW5kZXggZjk4YTY1Ni4uNzZkYWQ0OCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pb3ByaW8uaAorKysgYi9pbmNsdWRlL2xpbnV4L2lvcHJpby5oCkBAIC04Niw0ICs4Niw2IEBACiAgKi8KIGV4dGVybiBpbnQgaW9wcmlvX2Jlc3QodW5zaWduZWQgc2hvcnQgYXByaW8sIHVuc2lnbmVkIHNob3J0IGJwcmlvKTsKIAorZXh0ZXJuIGludCBzZXRfdGFza19pb3ByaW8oc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBpbnQgaW9wcmlvKTsKKwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2piZC5oIGIvaW5jbHVkZS9saW51eC9qYmQuaAppbmRleCAzNDZlMmI4Li42NDI0NmRjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2piZC5oCisrKyBiL2luY2x1ZGUvbGludXgvamJkLmgKQEAgLTU0Myw2ICs1NDMsMTEgQEAKIAl1bnNpZ25lZCBsb25nCQl0X2V4cGlyZXM7CiAKIAkvKgorCSAqIFdoZW4gdGhpcyB0cmFuc2FjdGlvbiBzdGFydGVkLCBpbiBuYW5vc2Vjb25kcyBbbm8gbG9ja2luZ10KKwkgKi8KKwlrdGltZV90CQkJdF9zdGFydF90aW1lOworCisJLyoKIAkgKiBIb3cgbWFueSBoYW5kbGVzIHVzZWQgdGhpcyB0cmFuc2FjdGlvbj8gW3RfaGFuZGxlX2xvY2tdCiAJICovCiAJaW50IHRfaGFuZGxlX2NvdW50OwpAQCAtNjA5LDYgKzYxNCw4IEBACiAgKiBAal93YnVmc2l6ZTogbWF4aW11bSBudW1iZXIgb2YgYnVmZmVyX2hlYWRzIGFsbG93ZWQgaW4gal93YnVmLCB0aGUKICAqCW51bWJlciB0aGF0IHdpbGwgZml0IGluIGpfYmxvY2tzaXplCiAgKiBAal9sYXN0X3N5bmNfd3JpdGVyOiBtb3N0IHJlY2VudCBwaWQgd2hpY2ggZGlkIGEgc3luY2hyb25vdXMgd3JpdGUKKyAqIEBqX2F2ZXJhZ2VfY29tbWl0X3RpbWU6IHRoZSBhdmVyYWdlIGFtb3VudCBvZiB0aW1lIGluIG5hbm9zZWNvbmRzIGl0CisgKgl0YWtlcyB0byBjb21taXQgYSB0cmFuc2FjdGlvbiB0byB0aGUgZGlzay4KICAqIEBqX3ByaXZhdGU6IEFuIG9wYXF1ZSBwb2ludGVyIHRvIGZzLXByaXZhdGUgaW5mb3JtYXRpb24uCiAgKi8KIApAQCAtNzk4LDkgKzgwNSwxOSBAQAogCXN0cnVjdCBidWZmZXJfaGVhZAkqKmpfd2J1ZjsKIAlpbnQJCQlqX3didWZzaXplOwogCisJLyoKKwkgKiB0aGlzIGlzIHRoZSBwaWQgb2YgdGhlIGxhc3QgcGVyc29uIHRvIHJ1biBhIHN5bmNocm9ub3VzIG9wZXJhdGlvbgorCSAqIHRocm91Z2ggdGhlIGpvdXJuYWwuCisJICovCiAJcGlkX3QJCQlqX2xhc3Rfc3luY193cml0ZXI7CiAKIAkvKgorCSAqIHRoZSBhdmVyYWdlIGFtb3VudCBvZiB0aW1lIGluIG5hbm9zZWNvbmRzIGl0IHRha2VzIHRvIGNvbW1pdCBhCisJICogdHJhbnNhY3Rpb24gdG8gdGhlIGRpc2suICBbal9zdGF0ZV9sb2NrXQorCSAqLworCXU2NAkJCWpfYXZlcmFnZV9jb21taXRfdGltZTsKKworCS8qCiAJICogQW4gb3BhcXVlIHBvaW50ZXIgdG8gZnMtcHJpdmF0ZSBpbmZvcm1hdGlvbi4gIGV4dDMgcHV0cyBpdHMKIAkgKiBzdXBlcmJsb2NrIHBvaW50ZXIgaGVyZQogCSAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9qYmQyLmggYi9pbmNsdWRlL2xpbnV4L2piZDIuaAppbmRleCAzNDQ1NjQ3Li5iNDUxMDljIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2piZDIuaAorKysgYi9pbmNsdWRlL2xpbnV4L2piZDIuaApAQCAtNjM4LDYgKzYzOCwxMSBAQAogCXVuc2lnbmVkIGxvbmcJCXRfZXhwaXJlczsKIAogCS8qCisJICogV2hlbiB0aGlzIHRyYW5zYWN0aW9uIHN0YXJ0ZWQsIGluIG5hbm9zZWNvbmRzIFtubyBsb2NraW5nXQorCSAqLworCWt0aW1lX3QJCQl0X3N0YXJ0X3RpbWU7CisKKwkvKgogCSAqIEhvdyBtYW55IGhhbmRsZXMgdXNlZCB0aGlzIHRyYW5zYWN0aW9uPyBbdF9oYW5kbGVfbG9ja10KIAkgKi8KIAlpbnQgdF9oYW5kbGVfY291bnQ7CkBAIC02ODIsNiArNjg3LDggQEAKIAlyZXR1cm4gZW5kICsgKE1BWF9KSUZGWV9PRkZTRVQgLSBzdGFydCk7CiB9CiAKKyNkZWZpbmUgSkJEMl9OUl9CQVRDSAk2NAorCiAvKioKICAqIHN0cnVjdCBqb3VybmFsX3MgLSBUaGUgam91cm5hbF9zIHR5cGUgaXMgdGhlIGNvbmNyZXRlIHR5cGUgYXNzb2NpYXRlZCB3aXRoCiAgKiAgICAgam91cm5hbF90LgpAQCAtODI2LDYgKzgzMywxNCBAQAogCXN0cnVjdCBtdXRleAkJal9jaGVja3BvaW50X211dGV4OwogCiAJLyoKKwkgKiBMaXN0IG9mIGJ1ZmZlciBoZWFkcyB1c2VkIGJ5IHRoZSBjaGVja3BvaW50IHJvdXRpbmUuICBUaGlzCisJICogd2FzIG1vdmVkIGZyb20gamJkMl9sb2dfZG9fY2hlY2twb2ludCgpIHRvIHJlZHVjZSBzdGFjaworCSAqIHVzYWdlLiAgQWNjZXNzIHRvIHRoaXMgYXJyYXkgaXMgY29udHJvbGxlZCBieSB0aGUKKwkgKiBqX2NoZWNrcG9pbnRfbXV0ZXguICBbal9jaGVja3BvaW50X211dGV4XQorCSAqLworCXN0cnVjdCBidWZmZXJfaGVhZAkqal9jaGtwdF9iaHNbSkJEMl9OUl9CQVRDSF07CisJCisJLyoKIAkgKiBKb3VybmFsIGhlYWQ6IGlkZW50aWZpZXMgdGhlIGZpcnN0IHVudXNlZCBibG9jayBpbiB0aGUgam91cm5hbC4KIAkgKiBbal9zdGF0ZV9sb2NrXQogCSAqLwpAQCAtOTM5LDggKzk1NCwyNiBAQAogCXN0cnVjdCBidWZmZXJfaGVhZAkqKmpfd2J1ZjsKIAlpbnQJCQlqX3didWZzaXplOwogCisJLyoKKwkgKiB0aGlzIGlzIHRoZSBwaWQgb2YgaHRlIGxhc3QgcGVyc29uIHRvIHJ1biBhIHN5bmNocm9ub3VzIG9wZXJhdGlvbgorCSAqIHRocm91Z2ggdGhlIGpvdXJuYWwKKwkgKi8KIAlwaWRfdAkJCWpfbGFzdF9zeW5jX3dyaXRlcjsKIAorCS8qCisJICogdGhlIGF2ZXJhZ2UgYW1vdW50IG9mIHRpbWUgaW4gbmFub3NlY29uZHMgaXQgdGFrZXMgdG8gY29tbWl0IGEKKwkgKiB0cmFuc2FjdGlvbiB0byBkaXNrLiBbal9zdGF0ZV9sb2NrXQorCSAqLworCXU2NAkJCWpfYXZlcmFnZV9jb21taXRfdGltZTsKKworCS8qCisJICogbWluaW11bSBhbmQgbWF4aW11bSB0aW1lcyB0aGF0IHdlIHNob3VsZCB3YWl0IGZvcgorCSAqIGFkZGl0aW9uYWwgZmlsZXN5c3RlbSBvcGVyYXRpb25zIHRvIGdldCBiYXRjaGVkIGludG8gYQorCSAqIHN5bmNocm9ub3VzIGhhbmRsZSBpbiBtaWNyb3NlY29uZHMKKwkgKi8KKwl1MzIJCQlqX21pbl9iYXRjaF90aW1lOworCXUzMgkJCWpfbWF4X2JhdGNoX3RpbWU7CisKIAkvKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIGEgdHJhbnNhY3Rpb24gaXMgY2xvc2VkICovCiAJdm9pZAkJCSgqal9jb21taXRfY2FsbGJhY2spKGpvdXJuYWxfdCAqLAogCQkJCQkJICAgICB0cmFuc2FjdGlvbl90ICopOwpAQCAtMTEwMiw3ICsxMTM1LDYgQEAKIAkJICAgKGpvdXJuYWxfdCAqLCB1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nKTsKIGV4dGVybiB2b2lkCSAgIGpiZDJfam91cm5hbF9jbGVhcl9mZWF0dXJlcwogCQkgICAoam91cm5hbF90ICosIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcpOwotZXh0ZXJuIGludAkgICBqYmQyX2pvdXJuYWxfY3JlYXRlICAgICAoam91cm5hbF90ICopOwogZXh0ZXJuIGludAkgICBqYmQyX2pvdXJuYWxfbG9hZCAgICAgICAoam91cm5hbF90ICpqb3VybmFsKTsKIGV4dGVybiBpbnQJICAgamJkMl9qb3VybmFsX2Rlc3Ryb3kgICAgKGpvdXJuYWxfdCAqKTsKIGV4dGVybiBpbnQJICAgamJkMl9qb3VybmFsX3JlY292ZXIgICAgKGpvdXJuYWxfdCAqam91cm5hbCk7CkBAIC0xMTc3LDggKzEyMDksOCBAQAogaW50IGpiZDJfbG9nX2RvX2NoZWNrcG9pbnQoam91cm5hbF90ICpqb3VybmFsKTsKIAogdm9pZCBfX2piZDJfbG9nX3dhaXRfZm9yX3NwYWNlKGpvdXJuYWxfdCAqam91cm5hbCk7Ci1leHRlcm4gdm9pZAlfX2piZDJfam91cm5hbF9kcm9wX3RyYW5zYWN0aW9uKGpvdXJuYWxfdCAqLCB0cmFuc2FjdGlvbl90ICopOwotZXh0ZXJuIGludAlqYmQyX2NsZWFudXBfam91cm5hbF90YWlsKGpvdXJuYWxfdCAqKTsKK2V4dGVybiB2b2lkIF9famJkMl9qb3VybmFsX2Ryb3BfdHJhbnNhY3Rpb24oam91cm5hbF90ICosIHRyYW5zYWN0aW9uX3QgKik7CitleHRlcm4gaW50IGpiZDJfY2xlYW51cF9qb3VybmFsX3RhaWwoam91cm5hbF90ICopOwogCiAvKiBEZWJ1Z2dpbmcgY29kZSBvbmx5OiAqLwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2pveXN0aWNrLmggYi9pbmNsdWRlL2xpbnV4L2pveXN0aWNrLmgKaW5kZXggYjVlMDUxMi4uOWUyMGMyOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9qb3lzdGljay5oCisrKyBiL2luY2x1ZGUvbGludXgvam95c3RpY2suaApAQCAtMjcsNyArMjcsNyBAQAogICogVm9qdGVjaCBQYXZsaWssIFVjaXRlbHNrYSAxNTc2LCBQcmFndWUgOCwgMTgyIDAwIEN6ZWNoIFJlcHVibGljCiAgKi8KIAotI2luY2x1ZGUgPGFzbS90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KIAogLyoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgva2VybmVsLmggYi9pbmNsdWRlL2xpbnV4L2tlcm5lbC5oCmluZGV4IDZiOGUyMDIuLjM0M2RmOWUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgva2VybmVsLmgKKysrIGIvaW5jbHVkZS9saW51eC9rZXJuZWwuaApAQCAtNDc2LDYgKzQ3NiwxMiBAQAogCV9fdmFsID0gX192YWwgPCBfX21pbiA/IF9fbWluOiBfX3ZhbDsJXAogCV9fdmFsID4gX19tYXggPyBfX21heDogX192YWw7IH0pCiAKKworLyoKKyAqIHN3YXAgLSBzd2FwIHZhbHVlIG9mIEBhIGFuZCBAYgorICovCisjZGVmaW5lIHN3YXAoYSwgYikgKHsgdHlwZW9mKGEpIF9fdG1wID0gKGEpOyAoYSkgPSAoYik7IChiKSA9IF9fdG1wOyB9KQorCiAvKioKICAqIGNvbnRhaW5lcl9vZiAtIGNhc3QgYSBtZW1iZXIgb2YgYSBzdHJ1Y3R1cmUgb3V0IHRvIHRoZSBjb250YWluaW5nIHN0cnVjdHVyZQogICogQHB0cjoJdGhlIHBvaW50ZXIgdG8gdGhlIG1lbWJlci4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgva3ZtLmggYi9pbmNsdWRlL2xpbnV4L2t2bS5oCmluZGV4IDM1NTI1YWMuLjU3MTVmMTkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgva3ZtLmgKKysrIGIvaW5jbHVkZS9saW51eC9rdm0uaApAQCAtNyw3ICs3LDcgQEAKICAqIE5vdGU6IHlvdSBtdXN0IHVwZGF0ZSBLVk1fQVBJX1ZFUlNJT04gaWYgeW91IGNoYW5nZSB0aGlzIGludGVyZmFjZS4KICAqLwogCi0jaW5jbHVkZSA8YXNtL3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgogI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+CiAjaW5jbHVkZSA8YXNtL2t2bS5oPgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9sZWRzLXBjYTk1MzIuaCBiL2luY2x1ZGUvbGludXgvbGVkcy1wY2E5NTMyLmgKaW5kZXggODFiNDIwNy4uOTZlZWE5MCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9sZWRzLXBjYTk1MzIuaAorKysgYi9pbmNsdWRlL2xpbnV4L2xlZHMtcGNhOTUzMi5oCkBAIC0xNSw2ICsxNSw3IEBACiAjZGVmaW5lIF9fTElOVVhfUENBOTUzMl9ICiAKICNpbmNsdWRlIDxsaW51eC9sZWRzLmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CiAKIGVudW0gcGNhOTUzMl9zdGF0ZSB7CiAJUENBOTUzMl9PRkYgID0gMHgwLApAQCAtMzEsNiArMzIsNyBAQAogCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQ7CiAJY2hhciAqbmFtZTsKIAlzdHJ1Y3QgbGVkX2NsYXNzZGV2IGxkZXY7CisgICAgICAgc3RydWN0IHdvcmtfc3RydWN0IHdvcms7CiAJZW51bSBwY2E5NTMyX3R5cGUgdHlwZTsKIAllbnVtIHBjYTk1MzJfc3RhdGUgc3RhdGU7CiB9OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9sZWRzLmggYi9pbmNsdWRlL2xpbnV4L2xlZHMuaAppbmRleCBkM2E3M2Y1Li4yNDQ4OWRhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2xlZHMuaAorKysgYi9pbmNsdWRlL2xpbnV4L2xlZHMuaApAQCAtMzIsNyArMzIsMTAgQEAKIAlpbnQJCQkgYnJpZ2h0bmVzczsKIAlpbnQJCQkgZmxhZ3M7CiAKKwkvKiBMb3dlciAxNiBiaXRzIHJlZmxlY3Qgc3RhdHVzICovCiAjZGVmaW5lIExFRF9TVVNQRU5ERUQJCSgxIDw8IDApCisJLyogVXBwZXIgMTYgYml0cyByZWZsZWN0IGNvbnRyb2wgaW5mb3JtYXRpb24gKi8KKyNkZWZpbmUgTEVEX0NPUkVfU1VTUEVORFJFU1VNRQkoMSA8PCAxNikKIAogCS8qIFNldCBMRUQgYnJpZ2h0bmVzcyBsZXZlbCAqLwogCS8qIE11c3Qgbm90IHNsZWVwLCB1c2UgYSB3b3JrcXVldWUgaWYgbmVlZGVkICovCkBAIC02Miw3ICs2NSw3IEBACiAKIGV4dGVybiBpbnQgbGVkX2NsYXNzZGV2X3JlZ2lzdGVyKHN0cnVjdCBkZXZpY2UgKnBhcmVudCwKIAkJCQkgc3RydWN0IGxlZF9jbGFzc2RldiAqbGVkX2NkZXYpOwotZXh0ZXJuIHZvaWQgbGVkX2NsYXNzZGV2X3VucmVnaXN0ZXIoc3RydWN0IGxlZF9jbGFzc2RldiAqbGNkKTsKK2V4dGVybiB2b2lkIGxlZF9jbGFzc2Rldl91bnJlZ2lzdGVyKHN0cnVjdCBsZWRfY2xhc3NkZXYgKmxlZF9jZGV2KTsKIGV4dGVybiB2b2lkIGxlZF9jbGFzc2Rldl9zdXNwZW5kKHN0cnVjdCBsZWRfY2xhc3NkZXYgKmxlZF9jZGV2KTsKIGV4dGVybiB2b2lkIGxlZF9jbGFzc2Rldl9yZXN1bWUoc3RydWN0IGxlZF9jbGFzc2RldiAqbGVkX2NkZXYpOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2xpYmF0YS5oIGIvaW5jbHVkZS9saW51eC9saWJhdGEuaAppbmRleCAzNDQ5ZGU1Li4yYzZiZDY2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2xpYmF0YS5oCisrKyBiL2luY2x1ZGUvbGludXgvbGliYXRhLmgKQEAgLTIzOSw2ICsyMzksNyBAQAogCS8qIGhvc3Qgc2V0IGZsYWdzICovCiAJQVRBX0hPU1RfU0lNUExFWAk9ICgxIDw8IDApLAkvKiBIb3N0IGlzIHNpbXBsZXgsIG9uZSBETUEgY2hhbm5lbCBwZXIgaG9zdCBvbmx5ICovCiAJQVRBX0hPU1RfU1RBUlRFRAk9ICgxIDw8IDEpLAkvKiBIb3N0IHN0YXJ0ZWQgKi8KKwlBVEFfSE9TVF9QQVJBTExFTF9TQ0FOCT0gKDEgPDwgMiksCS8qIFBvcnRzIG9uIHRoaXMgaG9zdCBjYW4gYmUgc2Nhbm5lZCBpbiBwYXJhbGxlbCAqLwogCiAJLyogYml0cyAyNDozMSBvZiBob3N0LT5mbGFncyBhcmUgcmVzZXJ2ZWQgZm9yIExMRCBzcGVjaWZpYyBmbGFncyAqLwogCkBAIC00MDAsMTIgKzQwMSwxNCBAQAogCQkJCSAgQVRBX1RJTUlOR19DWUM4QiwKIAlBVEFfVElNSU5HX0FDVElWRQk9ICgxIDw8IDQpLAogCUFUQV9USU1JTkdfUkVDT1ZFUgk9ICgxIDw8IDUpLAotCUFUQV9USU1JTkdfQ1lDTEUJPSAoMSA8PCA2KSwKLQlBVEFfVElNSU5HX1VETUEJCT0gKDEgPDwgNyksCisJQVRBX1RJTUlOR19ETUFDS19IT0xECT0gKDEgPDwgNiksCisJQVRBX1RJTUlOR19DWUNMRQk9ICgxIDw8IDcpLAorCUFUQV9USU1JTkdfVURNQQkJPSAoMSA8PCA4KSwKIAlBVEFfVElNSU5HX0FMTAkJPSBBVEFfVElNSU5HX1NFVFVQIHwgQVRBX1RJTUlOR19BQ1Q4QiB8CiAJCQkJICBBVEFfVElNSU5HX1JFQzhCIHwgQVRBX1RJTUlOR19DWUM4QiB8CiAJCQkJICBBVEFfVElNSU5HX0FDVElWRSB8IEFUQV9USU1JTkdfUkVDT1ZFUiB8Ci0JCQkJICBBVEFfVElNSU5HX0NZQ0xFIHwgQVRBX1RJTUlOR19VRE1BLAorCQkJCSAgQVRBX1RJTUlOR19ETUFDS19IT0xEIHwgQVRBX1RJTUlOR19DWUNMRSB8CisJCQkJICBBVEFfVElNSU5HX1VETUEsCiB9OwogCiBlbnVtIGF0YV94ZmVyX21hc2sgewpAQCAtODY1LDYgKzg2OCw3IEBACiAJdW5zaWduZWQgc2hvcnQgY3ljOGI7CQkvKiB0MCBmb3IgOC1iaXQgSS9PICovCiAJdW5zaWduZWQgc2hvcnQgYWN0aXZlOwkJLyogdDIgb3IgdEQgKi8KIAl1bnNpZ25lZCBzaG9ydCByZWNvdmVyOwkJLyogdDJpIG9yIHRLICovCisJdW5zaWduZWQgc2hvcnQgZG1hY2tfaG9sZDsJLyogdGogKi8KIAl1bnNpZ25lZCBzaG9ydCBjeWNsZTsJCS8qIHQwICovCiAJdW5zaWduZWQgc2hvcnQgdWRtYTsJCS8qIHQyQ1lDVFlQLzIgKi8KIH07CkBAIC05MjYsNiArOTMwLDggQEAKIGV4dGVybiBpbnQgYXRhX3Njc2lfZGV0ZWN0KHN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgKnNodCk7CiBleHRlcm4gaW50IGF0YV9zY3NpX2lvY3RsKHN0cnVjdCBzY3NpX2RldmljZSAqZGV2LCBpbnQgY21kLCB2b2lkIF9fdXNlciAqYXJnKTsKIGV4dGVybiBpbnQgYXRhX3Njc2lfcXVldWVjbWQoc3RydWN0IHNjc2lfY21uZCAqY21kLCB2b2lkICgqZG9uZSkoc3RydWN0IHNjc2lfY21uZCAqKSk7CitleHRlcm4gaW50IGF0YV9zYXNfc2NzaV9pb2N0bChzdHJ1Y3QgYXRhX3BvcnQgKmFwLCBzdHJ1Y3Qgc2NzaV9kZXZpY2UgKmRldiwKKwkJCSAgICBpbnQgY21kLCB2b2lkIF9fdXNlciAqYXJnKTsKIGV4dGVybiB2b2lkIGF0YV9zYXNfcG9ydF9kZXN0cm95KHN0cnVjdCBhdGFfcG9ydCAqKTsKIGV4dGVybiBzdHJ1Y3QgYXRhX3BvcnQgKmF0YV9zYXNfcG9ydF9hbGxvYyhzdHJ1Y3QgYXRhX2hvc3QgKiwKIAkJCQkJICAgc3RydWN0IGF0YV9wb3J0X2luZm8gKiwgc3RydWN0IFNjc2lfSG9zdCAqKTsKQEAgLTE1MTgsNiArMTUyNCw3IEBACiAKIGV4dGVybiBjb25zdCBzdHJ1Y3QgYXRhX3BvcnRfb3BlcmF0aW9ucyBhdGFfc2ZmX3BvcnRfb3BzOwogZXh0ZXJuIGNvbnN0IHN0cnVjdCBhdGFfcG9ydF9vcGVyYXRpb25zIGF0YV9ibWRtYV9wb3J0X29wczsKK2V4dGVybiBjb25zdCBzdHJ1Y3QgYXRhX3BvcnRfb3BlcmF0aW9ucyBhdGFfYm1kbWEzMl9wb3J0X29wczsKIAogLyogUElPIG9ubHksIHNnX3RhYmxlc2l6ZSBhbmQgZG1hX2JvdW5kYXJ5IGxpbWl0cyBjYW4gYmUgcmVtb3ZlZCAqLwogI2RlZmluZSBBVEFfUElPX1NIVChkcnZfbmFtZSkJCQkJCVwKQEAgLTE1NDUsNiArMTU1Miw4IEBACiAJCQkJIGNvbnN0IHN0cnVjdCBhdGFfdGFza2ZpbGUgKnRmKTsKIGV4dGVybiB1bnNpZ25lZCBpbnQgYXRhX3NmZl9kYXRhX3hmZXIoc3RydWN0IGF0YV9kZXZpY2UgKmRldiwKIAkJCXVuc2lnbmVkIGNoYXIgKmJ1ZiwgdW5zaWduZWQgaW50IGJ1ZmxlbiwgaW50IHJ3KTsKK2V4dGVybiB1bnNpZ25lZCBpbnQgYXRhX3NmZl9kYXRhX3hmZXIzMihzdHJ1Y3QgYXRhX2RldmljZSAqZGV2LAorCQkJdW5zaWduZWQgY2hhciAqYnVmLCB1bnNpZ25lZCBpbnQgYnVmbGVuLCBpbnQgcncpOwogZXh0ZXJuIHVuc2lnbmVkIGludCBhdGFfc2ZmX2RhdGFfeGZlcl9ub2lycShzdHJ1Y3QgYXRhX2RldmljZSAqZGV2LAogCQkJdW5zaWduZWQgY2hhciAqYnVmLCB1bnNpZ25lZCBpbnQgYnVmbGVuLCBpbnQgcncpOwogZXh0ZXJuIHU4IGF0YV9zZmZfaXJxX29uKHN0cnVjdCBhdGFfcG9ydCAqYXApOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9sb2NrZC9sb2NrZC5oIGIvaW5jbHVkZS9saW51eC9sb2NrZC9sb2NrZC5oCmluZGV4IDIzZGEzZmEuLmFhNmZlNzAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbG9ja2QvbG9ja2QuaAorKysgYi9pbmNsdWRlL2xpbnV4L2xvY2tkL2xvY2tkLmgKQEAgLTQzLDggKzQzLDggQEAKIAlzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZQloX2FkZHI7CQkvKiBwZWVyIGFkZHJlc3MgKi8KIAlzaXplX3QJCQloX2FkZHJsZW47CiAJc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UJaF9zcmNhZGRyOwkvKiBvdXIgYWRkcmVzcyAob3B0aW9uYWwpICovCi0Jc3RydWN0IHJwY19jbG50CSoJaF9ycGNjbG50OwkvKiBSUEMgY2xpZW50IHRvIHRhbGsgdG8gcGVlciAqLwotCWNoYXIgKgkJCWhfbmFtZTsJCS8qIHJlbW90ZSBob3N0bmFtZSAqLworCXN0cnVjdCBycGNfY2xudAkJKmhfcnBjY2xudDsJLyogUlBDIGNsaWVudCB0byB0YWxrIHRvIHBlZXIgKi8KKwljaGFyCQkJKmhfbmFtZTsJCS8qIHJlbW90ZSBob3N0bmFtZSAqLwogCXUzMgkJCWhfdmVyc2lvbjsJLyogaW50ZXJmYWNlIHZlcnNpb24gKi8KIAl1bnNpZ25lZCBzaG9ydAkJaF9wcm90bzsJLyogdHJhbnNwb3J0IHByb3RvICovCiAJdW5zaWduZWQgc2hvcnQJCWhfcmVjbGFpbWluZyA6IDEsCkBAIC02NCwyMSArNjQsMjkgQEAKIAlzcGlubG9ja190CQloX2xvY2s7CiAJc3RydWN0IGxpc3RfaGVhZAloX2dyYW50ZWQ7CS8qIExvY2tzIGluIEdSQU5URUQgc3RhdGUgKi8KIAlzdHJ1Y3QgbGlzdF9oZWFkCWhfcmVjbGFpbTsJLyogTG9ja3MgaW4gUkVDTEFJTSBzdGF0ZSAqLwotCXN0cnVjdCBuc21faGFuZGxlICoJaF9uc21oYW5kbGU7CS8qIE5TTSBzdGF0dXMgaGFuZGxlICovCi0KLQljaGFyCQkJaF9hZGRyYnVmWzQ4XSwJLyogYWRkcmVzcyBleWVjYXRjaGVycyAqLwotCQkJCWhfc3JjYWRkcmJ1Zls0OF07CisJc3RydWN0IG5zbV9oYW5kbGUJKmhfbnNtaGFuZGxlOwkvKiBOU00gc3RhdHVzIGhhbmRsZSAqLworCWNoYXIJCQkqaF9hZGRyYnVmOwkvKiBhZGRyZXNzIGV5ZWNhdGNoZXIgKi8KIH07CiAKKy8qCisgKiBUaGUgbGFyZ2VzdCBzdHJpbmcgc21fYWRkcmJ1ZiBzaG91bGQgaG9sZCBpcyBhIGZ1bGwtc2l6ZSBJUHY2IGFkZHJlc3MKKyAqIChubyAiOjoiIGFueXdoZXJlKSB3aXRoIGEgc2NvcGUgSUQuICBUaGUgYnVmZmVyIHNpemUgaXMgY29tcHV0ZWQgdG8KKyAqIGhvbGQgZWlnaHQgZ3JvdXBzIG9mIGNvbG9uLXNlcGFyYXRlZCBmb3VyLWhleC1kaWdpdCBudW1iZXJzLCBhCisgKiBwZXJjZW50IHNpZ24sIGEgc2NvcGUgaWQgKGF0IG1vc3QgMzIgYml0cywgaW4gZGVjaW1hbCksIGFuZCBOVUwuCisgKi8KKyNkZWZpbmUgTlNNX0FERFJCVUYJCSgoOCAqIDQgKyA3KSArICgxICsgMTApICsgMSkKKwogc3RydWN0IG5zbV9oYW5kbGUgewogCXN0cnVjdCBsaXN0X2hlYWQJc21fbGluazsKIAlhdG9taWNfdAkJc21fY291bnQ7Ci0JY2hhciAqCQkJc21fbmFtZTsKKwljaGFyCQkJKnNtX21vbl9uYW1lOworCWNoYXIJCQkqc21fbmFtZTsKIAlzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZQlzbV9hZGRyOwogCXNpemVfdAkJCXNtX2FkZHJsZW47CiAJdW5zaWduZWQgaW50CQlzbV9tb25pdG9yZWQgOiAxLAogCQkJCXNtX3N0aWNreSA6IDE7CS8qIGRvbid0IHVubW9uaXRvciAqLwotCWNoYXIJCQlzbV9hZGRyYnVmWzQ4XTsJLyogYWRkcmVzcyBleWVjYXRjaGVyICovCisJc3RydWN0IG5zbV9wcml2YXRlCXNtX3ByaXY7CisJY2hhcgkJCXNtX2FkZHJidWZbTlNNX0FERFJCVUZdOwogfTsKIAogLyoKQEAgLTEwNCwxNiArMTEyLDYgQEAKIAlyZXR1cm4gKHN0cnVjdCBzb2NrYWRkciAqKSZob3N0LT5oX3NyY2FkZHI7CiB9CiAKLXN0YXRpYyBpbmxpbmUgc3RydWN0IHNvY2thZGRyX2luICpuc21fYWRkcl9pbihjb25zdCBzdHJ1Y3QgbnNtX2hhbmRsZSAqaGFuZGxlKQotewotCXJldHVybiAoc3RydWN0IHNvY2thZGRyX2luICopJmhhbmRsZS0+c21fYWRkcjsKLX0KLQotc3RhdGljIGlubGluZSBzdHJ1Y3Qgc29ja2FkZHIgKm5zbV9hZGRyKGNvbnN0IHN0cnVjdCBuc21faGFuZGxlICpoYW5kbGUpCi17Ci0JcmV0dXJuIChzdHJ1Y3Qgc29ja2FkZHIgKikmaGFuZGxlLT5zbV9hZGRyOwotfQotCiAvKgogICogTWFwIGFuIGZsX293bmVyX3QgaW50byBhIHVuaXF1ZSAzMi1iaXQgInBpZCIKICAqLwpAQCAtMTk3LDYgKzE5NSw3IEBACiBleHRlcm4gaW50CQkJbmxtc3ZjX2dyYWNlX3BlcmlvZDsKIGV4dGVybiB1bnNpZ25lZCBsb25nCQlubG1zdmNfdGltZW91dDsKIGV4dGVybiBpbnQJCQluc21fdXNlX2hvc3RuYW1lczsKK2V4dGVybiBpbnQJCQluc21fbG9jYWxfc3RhdGU7CiAKIC8qCiAgKiBMb2NrZCBjbGllbnQgZnVuY3Rpb25zCkBAIC0yMzEsMTAgKzIzMCwyMCBAQAogc3RydWN0IG5sbV9ob3N0ICogbmxtX2dldF9ob3N0KHN0cnVjdCBubG1faG9zdCAqKTsKIHZvaWQJCSAgbmxtX3JlbGVhc2VfaG9zdChzdHJ1Y3QgbmxtX2hvc3QgKik7CiB2b2lkCQkgIG5sbV9zaHV0ZG93bl9ob3N0cyh2b2lkKTsKLWV4dGVybiB2b2lkCSAgbmxtX2hvc3RfcmVib290ZWQoY29uc3Qgc3RydWN0IHNvY2thZGRyX2luICosIGNvbnN0IGNoYXIgKiwKLQkJCQkJdW5zaWduZWQgaW50LCB1MzIpOwotdm9pZAkJICBuc21fcmVsZWFzZShzdHJ1Y3QgbnNtX2hhbmRsZSAqKTsKK3ZvaWQJCSAgbmxtX2hvc3RfcmVib290ZWQoY29uc3Qgc3RydWN0IG5sbV9yZWJvb3QgKik7CiAKKy8qCisgKiBIb3N0IG1vbml0b3JpbmcKKyAqLworaW50CQkgIG5zbV9tb25pdG9yKGNvbnN0IHN0cnVjdCBubG1faG9zdCAqaG9zdCk7Cit2b2lkCQkgIG5zbV91bm1vbml0b3IoY29uc3Qgc3RydWN0IG5sbV9ob3N0ICpob3N0KTsKKworc3RydWN0IG5zbV9oYW5kbGUgKm5zbV9nZXRfaGFuZGxlKGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqc2FwLAorCQkJCQljb25zdCBzaXplX3Qgc2FsZW4sCisJCQkJCWNvbnN0IGNoYXIgKmhvc3RuYW1lLAorCQkJCQljb25zdCBzaXplX3QgaG9zdG5hbWVfbGVuKTsKK3N0cnVjdCBuc21faGFuZGxlICpuc21fcmVib290X2xvb2t1cChjb25zdCBzdHJ1Y3QgbmxtX3JlYm9vdCAqaW5mbyk7Cit2b2lkCQkgIG5zbV9yZWxlYXNlKHN0cnVjdCBuc21faGFuZGxlICpuc20pOwogCiAvKgogICogVGhpcyBpcyB1c2VkIGluIGdhcmJhZ2UgY29sbGVjdGlvbiBhbmQgcmVzb3VyY2UgcmVjbGFpbQpAQCAtMjgyLDE2ICsyOTEsMjUgQEAKIHN0YXRpYyBpbmxpbmUgaW50IF9fbmxtX3ByaXZpbGVnZWRfcmVxdWVzdDQoY29uc3Qgc3RydWN0IHNvY2thZGRyICpzYXApCiB7CiAJY29uc3Qgc3RydWN0IHNvY2thZGRyX2luICpzaW4gPSAoc3RydWN0IHNvY2thZGRyX2luICopc2FwOwotCXJldHVybiAoc2luLT5zaW5fYWRkci5zX2FkZHIgPT0gaHRvbmwoSU5BRERSX0xPT1BCQUNLKSkgJiYKLQkJCShudG9ocyhzaW4tPnNpbl9wb3J0KSA8IDEwMjQpOworCisJaWYgKG50b2hzKHNpbi0+c2luX3BvcnQpID4gMTAyMykKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gaXB2NF9pc19sb29wYmFjayhzaW4tPnNpbl9hZGRyLnNfYWRkcik7CiB9CiAKICNpZiBkZWZpbmVkKENPTkZJR19JUFY2KSB8fCBkZWZpbmVkKENPTkZJR19JUFY2X01PRFVMRSkKIHN0YXRpYyBpbmxpbmUgaW50IF9fbmxtX3ByaXZpbGVnZWRfcmVxdWVzdDYoY29uc3Qgc3RydWN0IHNvY2thZGRyICpzYXApCiB7CiAJY29uc3Qgc3RydWN0IHNvY2thZGRyX2luNiAqc2luNiA9IChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopc2FwOwotCXJldHVybiAoaXB2Nl9hZGRyX3R5cGUoJnNpbjYtPnNpbjZfYWRkcikgJiBJUFY2X0FERFJfTE9PUEJBQ0spICYmCi0JCQkobnRvaHMoc2luNi0+c2luNl9wb3J0KSA8IDEwMjQpOworCisJaWYgKG50b2hzKHNpbjYtPnNpbjZfcG9ydCkgPiAxMDIzKQorCQlyZXR1cm4gMDsKKworCWlmIChpcHY2X2FkZHJfdHlwZSgmc2luNi0+c2luNl9hZGRyKSAmIElQVjZfQUREUl9NQVBQRUQpCisJCXJldHVybiBpcHY0X2lzX2xvb3BiYWNrKHNpbjYtPnNpbjZfYWRkci5zNl9hZGRyMzJbM10pOworCisJcmV0dXJuIGlwdjZfYWRkcl90eXBlKCZzaW42LT5zaW42X2FkZHIpICYgSVBWNl9BRERSX0xPT1BCQUNLOwogfQogI2Vsc2UJLyogZGVmaW5lZChDT05GSUdfSVBWNikgfHwgZGVmaW5lZChDT05GSUdfSVBWNl9NT0RVTEUpICovCiBzdGF0aWMgaW5saW5lIGludCBfX25sbV9wcml2aWxlZ2VkX3JlcXVlc3Q2KGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqc2FwKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9sb2NrZC9zbV9pbnRlci5oIGIvaW5jbHVkZS9saW51eC9sb2NrZC9zbV9pbnRlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YTU0NDhiLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbGludXgvbG9ja2Qvc21faW50ZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qCi0gKiBsaW51eC9pbmNsdWRlL2xpbnV4L2xvY2tkL3NtX2ludGVyLmgKLSAqCi0gKiBEZWNsYXJhdGlvbnMgZm9yIHRoZSBrZXJuZWwgc3RhdGQgY2xpZW50LgotICoKLSAqIENvcHlyaWdodCAoQykgMTk5NiwgT2xhZiBLaXJjaCA8b2tpckBtb25hZC5zd2IuZGU+Ci0gKi8KLQotI2lmbmRlZiBMSU5VWF9MT0NLRF9TTV9JTlRFUl9ICi0jZGVmaW5lIExJTlVYX0xPQ0tEX1NNX0lOVEVSX0gKLQotI2RlZmluZSBTTV9QUk9HUkFNCTEwMDAyNAotI2RlZmluZSBTTV9WRVJTSU9OCTEKLSNkZWZpbmUgU01fU1RBVAkJMQotI2RlZmluZSBTTV9NT04JCTIKLSNkZWZpbmUgU01fVU5NT04JMwotI2RlZmluZSBTTV9VTk1PTl9BTEwJNAotI2RlZmluZSBTTV9TSU1VX0NSQVNICTUKLSNkZWZpbmUgU01fTk9USUZZCTYKLQotI2RlZmluZSBTTV9NQVhTVFJMRU4JMTAyNAotI2RlZmluZSBTTV9QUklWX1NJWkUJMTYKLQotLyoKLSAqIEFyZ3VtZW50cyBmb3IgYWxsIGNhbGxzIHRvIHN0YXRkCi0gKi8KLXN0cnVjdCBuc21fYXJncyB7Ci0JX19iZTMyCQlhZGRyOwkJLyogcmVtb3RlIGFkZHJlc3MgKi8KLQl1MzIJCXByb2c7CQkvKiBSUEMgY2FsbGJhY2sgaW5mbyAqLwotCXUzMgkJdmVyczsKLQl1MzIJCXByb2M7Ci0KLQljaGFyICoJCW1vbl9uYW1lOwotfTsKLQotLyoKLSAqIFJlc3VsdCByZXR1cm5lZCBieSBzdGF0ZAotICovCi1zdHJ1Y3QgbnNtX3JlcyB7Ci0JdTMyCQlzdGF0dXM7Ci0JdTMyCQlzdGF0ZTsKLX07Ci0KLWludAkJbnNtX21vbml0b3Ioc3RydWN0IG5sbV9ob3N0ICopOwotaW50CQluc21fdW5tb25pdG9yKHN0cnVjdCBubG1faG9zdCAqKTsKLWV4dGVybiBpbnQJbnNtX2xvY2FsX3N0YXRlOwotCi0jZW5kaWYgLyogTElOVVhfTE9DS0RfU01fSU5URVJfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9sb2NrZC94ZHIuaCBiL2luY2x1ZGUvbGludXgvbG9ja2QveGRyLmgKaW5kZXggZDZiM2E4MC4uN2RjNWI2YyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9sb2NrZC94ZHIuaAorKysgYi9pbmNsdWRlL2xpbnV4L2xvY2tkL3hkci5oCkBAIC0xMyw2ICsxMywxMyBAQAogI2luY2x1ZGUgPGxpbnV4L25mcy5oPgogI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy94ZHIuaD4KIAorI2RlZmluZSBTTV9NQVhTVFJMRU4JCTEwMjQKKyNkZWZpbmUgU01fUFJJVl9TSVpFCQkxNgorCitzdHJ1Y3QgbnNtX3ByaXZhdGUgeworCXVuc2lnbmVkIGNoYXIJCWRhdGFbU01fUFJJVl9TSVpFXTsKK307CisKIHN0cnVjdCBzdmNfcnFzdDsKIAogI2RlZmluZSBOTE1fTUFYQ09PS0lFTEVOICAgIAkzMgpAQCAtNzcsMTAgKzg0LDEwIEBACiAgKiBzdGF0ZCBjYWxsYmFjayB3aGVuIGNsaWVudCBoYXMgcmVib290ZWQKICAqLwogc3RydWN0IG5sbV9yZWJvb3QgewotCWNoYXIgKgkJbW9uOwotCXVuc2lnbmVkIGludAlsZW47Ci0JdTMyCQlzdGF0ZTsKLQlfX2JlMzIJCWFkZHI7CisJY2hhcgkJCSptb247CisJdW5zaWduZWQgaW50CQlsZW47CisJdTMyCQkJc3RhdGU7CisJc3RydWN0IG5zbV9wcml2YXRlCXByaXY7CiB9OwogCiAvKgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9sb29wLmggYi9pbmNsdWRlL2xpbnV4L2xvb3AuaAppbmRleCA0NjE2OWE3Li42ZmZkNmRiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2xvb3AuaAorKysgYi9pbmNsdWRlL2xpbnV4L2xvb3AuaApAQCAtODAsNyArODAsNyBAQAogfTsKIAogI2luY2x1ZGUgPGFzbS9wb3NpeF90eXBlcy5oPgkvKiBmb3IgX19rZXJuZWxfb2xkX2Rldl90ICovCi0jaW5jbHVkZSA8YXNtL3R5cGVzLmg+CQkvKiBmb3IgX191NjQgKi8KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgkvKiBmb3IgX191NjQgKi8KIAogLyogQmFja3dhcmRzIGNvbXBhdGliaWxpdHkgdmVyc2lvbiAqLwogc3RydWN0IGxvb3BfaW5mbyB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21JU0ROaHcuaCBiL2luY2x1ZGUvbGludXgvbUlTRE5ody5oCmluZGV4IGU3OTRkZmIuLjk3ZmZkYzEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbUlTRE5ody5oCisrKyBiL2luY2x1ZGUvbGludXgvbUlTRE5ody5oCkBAIC01NywyMCArNTcsMjEgQEAKICNkZWZpbmUgRkxHX0wyREFUQQkJMTQJLyogY2hhbm5lbCB1c2UgTDIgREFUQSBwcmltaXRpdnMgKi8KICNkZWZpbmUgRkxHX09SSUdJTgkJMTUJLyogY2hhbm5lbCBpcyBvbiBvcmlnaW4gc2l0ZSAqLwogLyogY2hhbm5lbCBzcGVjaWZpYyBzdHVmZiAqLworI2RlZmluZSBGTEdfRklMTEVNUFRZCQkxNgkvKiBmaWxsIGZpZm8gb24gZmlyc3QgZnJhbWUgKGVtcHR5KSAqLwogLyogYXJjb2ZpIHNwZWNpZmljICovCi0jZGVmaW5lIEZMR19BUkNPRklfVElNRVIJMTYKLSNkZWZpbmUgRkxHX0FSQ09GSV9FUlJPUgkxNworI2RlZmluZSBGTEdfQVJDT0ZJX1RJTUVSCTE3CisjZGVmaW5lIEZMR19BUkNPRklfRVJST1IJMTgKIC8qIGlzYXIgc3BlY2lmaWMgKi8KLSNkZWZpbmUgRkxHX0lOSVRJQUxJWkVECQkxNgotI2RlZmluZSBGTEdfRExFRVRYCQkxNwotI2RlZmluZSBGTEdfTEFTVERMRQkJMTgKLSNkZWZpbmUgRkxHX0ZJUlNUCQkxOQotI2RlZmluZSBGTEdfTEFTVERBVEEJCTIwCi0jZGVmaW5lIEZMR19OTURfREFUQQkJMjEKLSNkZWZpbmUgRkxHX0ZUSV9SVU4JCTIyCi0jZGVmaW5lIEZMR19MTF9PSwkJMjMKLSNkZWZpbmUgRkxHX0xMX0NPTk4JCTI0Ci0jZGVmaW5lIEZMR19EVE1GU0VORAkJMjUKKyNkZWZpbmUgRkxHX0lOSVRJQUxJWkVECQkxNworI2RlZmluZSBGTEdfRExFRVRYCQkxOAorI2RlZmluZSBGTEdfTEFTVERMRQkJMTkKKyNkZWZpbmUgRkxHX0ZJUlNUCQkyMAorI2RlZmluZSBGTEdfTEFTVERBVEEJCTIxCisjZGVmaW5lIEZMR19OTURfREFUQQkJMjIKKyNkZWZpbmUgRkxHX0ZUSV9SVU4JCTIzCisjZGVmaW5lIEZMR19MTF9PSwkJMjQKKyNkZWZpbmUgRkxHX0xMX0NPTk4JCTI1CisjZGVmaW5lIEZMR19EVE1GU0VORAkJMjYKIAogLyogd29ya3EgZXZlbnRzICovCiAjZGVmaW5lIEZMR19SRUNWUVVFVUUJCTMwCkBAIC0xODMsNiArMTg0LDcgQEAKIGV4dGVybiBpbnQJZGNoYW5uZWxfc2VuZGRhdGEoc3RydWN0IGRjaGFubmVsICosIHN0cnVjdCBza19idWZmICopOwogZXh0ZXJuIGludAliY2hhbm5lbF9zZW5kZGF0YShzdHJ1Y3QgYmNoYW5uZWwgKiwgc3RydWN0IHNrX2J1ZmYgKik7CiBleHRlcm4gdm9pZAlyZWN2X0RjaGFubmVsKHN0cnVjdCBkY2hhbm5lbCAqKTsKK2V4dGVybiB2b2lkCXJlY3ZfRWNoYW5uZWwoc3RydWN0IGRjaGFubmVsICosIHN0cnVjdCBkY2hhbm5lbCAqKTsKIGV4dGVybiB2b2lkCXJlY3ZfQmNoYW5uZWwoc3RydWN0IGJjaGFubmVsICopOwogZXh0ZXJuIHZvaWQJcmVjdl9EY2hhbm5lbF9za2Ioc3RydWN0IGRjaGFubmVsICosIHN0cnVjdCBza19idWZmICopOwogZXh0ZXJuIHZvaWQJcmVjdl9CY2hhbm5lbF9za2Ioc3RydWN0IGJjaGFubmVsICosIHN0cnVjdCBza19idWZmICopOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tSVNETmlmLmggYi9pbmNsdWRlL2xpbnV4L21JU0ROaWYuaAppbmRleCA4ZjJkNjBkLi41ZGEzZDk1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21JU0ROaWYuaAorKysgYi9pbmNsdWRlL2xpbnV4L21JU0ROaWYuaApAQCAtMzYsOCArMzYsOCBAQAogICogICAgICAgICAgICAgIC0gc2hvdWxkIGJlIGluY3JlbWVudGVkIG9uIGV2ZXJ5IGNoZWNraW4KICAqLwogI2RlZmluZQlNSVNETl9NQUpPUl9WRVJTSU9OCTEKLSNkZWZpbmUJTUlTRE5fTUlOT1JfVkVSU0lPTgkwCi0jZGVmaW5lIE1JU0ROX1JFTEVBU0UJCTE5CisjZGVmaW5lCU1JU0ROX01JTk9SX1ZFUlNJT04JMQorI2RlZmluZSBNSVNETl9SRUxFQVNFCQkyMAogCiAvKiBwcmltaXRpdmVzIGZvciBpbmZvcm1hdGlvbiBleGNoYW5nZQogICogZ2VuZXJlbGwgZm9ybWF0CkBAIC04MCw2ICs4MCw3IEBACiAjZGVmaW5lIFBIX0RFQUNUSVZBVEVfSU5ECTB4MDIwMgogI2RlZmluZSBQSF9ERUFDVElWQVRFX0NORgkweDQyMDIKICNkZWZpbmUgUEhfREFUQV9JTkQJCTB4MjAwMgorI2RlZmluZSBQSF9EQVRBX0VfSU5ECQkweDMwMDIKICNkZWZpbmUgTVBIX0FDVElWQVRFX0lORAkweDA1MDIKICNkZWZpbmUgTVBIX0RFQUNUSVZBVEVfSU5ECTB4MDYwMgogI2RlZmluZSBNUEhfSU5GT1JNQVRJT05fSU5ECTB4MDcwMgpAQCAtMTk5LDYgKzIwMCwxOCBAQAogI2RlZmluZSBJU0ROX1BfTlRfUzAgIAkJMHgwMgogI2RlZmluZSBJU0ROX1BfVEVfRTEJCTB4MDMKICNkZWZpbmUgSVNETl9QX05UX0UxICAJCTB4MDQKKyNkZWZpbmUgSVNETl9QX1RFX1VQMAkJMHgwNQorI2RlZmluZSBJU0ROX1BfTlRfVVAwCQkweDA2CisKKyNkZWZpbmUgSVNfSVNETl9QX1RFKHApICgocCA9PSBJU0ROX1BfVEVfUzApIHx8IChwID09IElTRE5fUF9URV9FMSkgfHwgXAorCQkJCShwID09IElTRE5fUF9URV9VUDApIHx8IChwID09IElTRE5fUF9MQVBEX1RFKSkKKyNkZWZpbmUgSVNfSVNETl9QX05UKHApICgocCA9PSBJU0ROX1BfTlRfUzApIHx8IChwID09IElTRE5fUF9OVF9FMSkgfHwgXAorCQkJCShwID09IElTRE5fUF9OVF9VUDApIHx8IChwID09IElTRE5fUF9MQVBEX05UKSkKKyNkZWZpbmUgSVNfSVNETl9QX1MwKHApICgocCA9PSBJU0ROX1BfVEVfUzApIHx8IChwID09IElTRE5fUF9OVF9TMCkpCisjZGVmaW5lIElTX0lTRE5fUF9FMShwKSAoKHAgPT0gSVNETl9QX1RFX0UxKSB8fCAocCA9PSBJU0ROX1BfTlRfRTEpKQorI2RlZmluZSBJU19JU0ROX1BfVVAwKHApICgocCA9PSBJU0ROX1BfVEVfVVAwKSB8fCAocCA9PSBJU0ROX1BfTlRfVVAwKSkKKworCiAjZGVmaW5lIElTRE5fUF9MQVBEX1RFCQkweDEwCiAjZGVmaW5lCUlTRE5fUF9MQVBEX05UCQkweDExCiAKQEAgLTI1NSwxNiArMjY4LDYgQEAKIAl1bnNpZ25lZCBjaGFyCXRlaTsKIH07CiAKLS8qIHRpbWVyIGRldmljZSBpb2N0bCAqLwotI2RlZmluZSBJTUFERFRJTUVSCV9JT1IoJ0knLCA2NCwgaW50KQotI2RlZmluZSBJTURFTFRJTUVSCV9JT1IoJ0knLCA2NSwgaW50KQotLyogc29ja2V0IGlvY3RscyAqLwotI2RlZmluZQlJTUdFVFZFUlNJT04JX0lPUignSScsIDY2LCBpbnQpCi0jZGVmaW5lCUlNR0VUQ09VTlQJX0lPUignSScsIDY3LCBpbnQpCi0jZGVmaW5lIElNR0VUREVWSU5GTwlfSU9SKCdJJywgNjgsIGludCkKLSNkZWZpbmUgSU1DVFJMUkVRCV9JT1IoJ0knLCA2OSwgaW50KQotI2RlZmluZSBJTUNMRUFSX0wyCV9JT1IoJ0knLCA3MCwgaW50KQotCiBzdHJ1Y3QgbUlTRE52ZXJzaW9uIHsKIAl1bnNpZ25lZCBjaGFyCW1ham9yOwogCXVuc2lnbmVkIGNoYXIJbWlub3I7CkBAIC0yODEsNiArMjg0LDQwIEBACiAJY2hhcgkJCW5hbWVbTUlTRE5fTUFYX0lETEVOXTsKIH07CiAKK3N0cnVjdCBtSVNETl9kZXZyZW5hbWUgeworCXVfaW50CQkJaWQ7CisJY2hhcgkJCW5hbWVbTUlTRE5fTUFYX0lETEVOXTsgLyogbmV3IG5hbWUgKi8KK307CisKKy8qIE1QSF9JTkZPUk1BVElPTl9SRVEgcGF5bG9hZCAqLworc3RydWN0IHBoX2luZm9fY2ggeworICAgICAgICBfX3UzMiBwcm90b2NvbDsKKyAgICAgICAgX191NjQgRmxhZ3M7Cit9OworCitzdHJ1Y3QgcGhfaW5mb19kY2ggeworICAgICAgICBzdHJ1Y3QgcGhfaW5mb19jaCBjaDsKKyAgICAgICAgX191MTYgc3RhdGU7CisgICAgICAgIF9fdTE2IG51bV9iY2g7Cit9OworCitzdHJ1Y3QgcGhfaW5mbyB7CisgICAgICAgIHN0cnVjdCBwaF9pbmZvX2RjaCBkY2g7CisgICAgICAgIHN0cnVjdCBwaF9pbmZvX2NoICBiY2hbXTsKK307CisKKy8qIHRpbWVyIGRldmljZSBpb2N0bCAqLworI2RlZmluZSBJTUFERFRJTUVSCV9JT1IoJ0knLCA2NCwgaW50KQorI2RlZmluZSBJTURFTFRJTUVSCV9JT1IoJ0knLCA2NSwgaW50KQorCisvKiBzb2NrZXQgaW9jdGxzICovCisjZGVmaW5lCUlNR0VUVkVSU0lPTglfSU9SKCdJJywgNjYsIGludCkKKyNkZWZpbmUJSU1HRVRDT1VOVAlfSU9SKCdJJywgNjcsIGludCkKKyNkZWZpbmUgSU1HRVRERVZJTkZPCV9JT1IoJ0knLCA2OCwgaW50KQorI2RlZmluZSBJTUNUUkxSRVEJX0lPUignSScsIDY5LCBpbnQpCisjZGVmaW5lIElNQ0xFQVJfTDIJX0lPUignSScsIDcwLCBpbnQpCisjZGVmaW5lIElNU0VUREVWTkFNRQlfSU9SKCdJJywgNzEsIHN0cnVjdCBtSVNETl9kZXZyZW5hbWUpCisKIHN0YXRpYyBpbmxpbmUgaW50CiB0ZXN0X2NoYW5uZWxtYXAodV9pbnQgbnIsIHVfY2hhciAqbWFwKQogewpAQCAtMzEyLDYgKzM0OSw4IEBACiAjZGVmaW5lIE1JU0ROX0NUUkxfU0VUUEVFUgkJMHgwMDQwCiAjZGVmaW5lIE1JU0ROX0NUUkxfVU5TRVRQRUVSCQkweDAwODAKICNkZWZpbmUgTUlTRE5fQ1RSTF9SWF9PRkYJCTB4MDEwMAorI2RlZmluZSBNSVNETl9DVFJMX0ZJTExfRU1QVFkJCTB4MDIwMAorI2RlZmluZSBNSVNETl9DVFJMX0dFVFBFRVIJCTB4MDQwMAogI2RlZmluZSBNSVNETl9DVFJMX0hXX0ZFQVRVUkVTX09QCTB4MjAwMAogI2RlZmluZSBNSVNETl9DVFJMX0hXX0ZFQVRVUkVTCQkweDIwMDEKICNkZWZpbmUgTUlTRE5fQ1RSTF9IRkNfT1AJCTB4NDAwMApAQCAtMzYyLDYgKzQwMSw3IEBACiAjZGVmaW5lIERFQlVHX0wyX1RFSQkJMHgwMDEwMDAwMAogI2RlZmluZSBERUJVR19MMl9URUlGU00JCTB4MDAyMDAwMDAKICNkZWZpbmUgREVCVUdfVElNRVIJCTB4MDEwMDAwMDAKKyNkZWZpbmUgREVCVUdfQ0xPQ0sJCTB4MDIwMDAwMDAKIAogI2RlZmluZSBtSVNETl9IRUFEX1AocykJCSgoc3RydWN0IG1JU0ROaGVhZCAqKSZzLT5jYlswXSkKICNkZWZpbmUgbUlTRE5fSEVBRF9QUklNKHMpCSgoKHN0cnVjdCBtSVNETmhlYWQgKikmcy0+Y2JbMF0pLT5wcmltKQpAQCAtMzc1LDYgKzQxNSw3IEBACiBzdHJ1Y3QgbUlTRE5jaGFubmVsOwogc3RydWN0IG1JU0ROZGV2aWNlOwogc3RydWN0IG1JU0ROc3RhY2s7CitzdHJ1Y3QgbUlTRE5jbG9jazsKIAogc3RydWN0IGNoYW5uZWxfcmVxIHsKIAl1X2ludAkJCXByb3RvY29sOwpAQCAtNDIzLDcgKzQ2NCw2IEBACiBzdHJ1Y3QgbUlTRE5kZXZpY2UgewogCXN0cnVjdCBtSVNETmNoYW5uZWwJRDsKIAl1X2ludAkJCWlkOwotCWNoYXIJCQluYW1lW01JU0ROX01BWF9JRExFTl07CiAJdV9pbnQJCQlEcHJvdG9jb2xzOwogCXVfaW50CQkJQnByb3RvY29sczsKIAl1X2ludAkJCW5yYmNoYW47CkBAIC00NTIsNiArNDkyLDE2IEBACiAjZW5kaWYKIH07CiAKK3R5cGVkZWYJaW50CShjbG9ja2N0bF9mdW5jX3QpKHZvaWQgKiwgaW50KTsKKworc3RydWN0CW1JU0ROY2xvY2sgeworCXN0cnVjdCBsaXN0X2hlYWQJbGlzdDsKKwljaGFyCQkJbmFtZVs2NF07CisJaW50CQkJcHJpOworCWNsb2NrY3RsX2Z1bmNfdAkJKmN0bDsKKwl2b2lkCQkJKnByaXY7Cit9OworCiAvKiBnbG9iYWwgYWxsb2MvcXVldWUgZnVuY3Rpb25zICovCiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IHNrX2J1ZmYgKgpAQCAtNDk4LDEyICs1NDgsMjYgQEAKIAogLyogZ2xvYmFsIHJlZ2lzdGVyL3VucmVnaXN0ZXIgZnVuY3Rpb25zICovCiAKLWV4dGVybiBpbnQJbUlTRE5fcmVnaXN0ZXJfZGV2aWNlKHN0cnVjdCBtSVNETmRldmljZSAqLCBjaGFyICpuYW1lKTsKK2V4dGVybiBpbnQJbUlTRE5fcmVnaXN0ZXJfZGV2aWNlKHN0cnVjdCBtSVNETmRldmljZSAqLAorCQkJCQlzdHJ1Y3QgZGV2aWNlICpwYXJlbnQsIGNoYXIgKm5hbWUpOwogZXh0ZXJuIHZvaWQJbUlTRE5fdW5yZWdpc3Rlcl9kZXZpY2Uoc3RydWN0IG1JU0ROZGV2aWNlICopOwogZXh0ZXJuIGludAltSVNETl9yZWdpc3Rlcl9CcHJvdG9jb2woc3RydWN0IEJwcm90b2NvbCAqKTsKIGV4dGVybiB2b2lkCW1JU0ROX3VucmVnaXN0ZXJfQnByb3RvY29sKHN0cnVjdCBCcHJvdG9jb2wgKik7CitleHRlcm4gc3RydWN0IG1JU0ROY2xvY2sgKm1JU0ROX3JlZ2lzdGVyX2Nsb2NrKGNoYXIgKiwgaW50LCBjbG9ja2N0bF9mdW5jX3QgKiwKKwkJCQkJCXZvaWQgKik7CitleHRlcm4gdm9pZAltSVNETl91bnJlZ2lzdGVyX2Nsb2NrKHN0cnVjdCBtSVNETmNsb2NrICopOworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBtSVNETmRldmljZSAqZGV2X3RvX21JU0ROKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlpZiAoZGV2KQorCQlyZXR1cm4gZGV2X2dldF9kcnZkYXRhKGRldik7CisJZWxzZQorCQlyZXR1cm4gTlVMTDsKK30KIAogZXh0ZXJuIHZvaWQJc2V0X2NoYW5uZWxfYWRkcmVzcyhzdHJ1Y3QgbUlTRE5jaGFubmVsICosIHVfaW50LCB1X2ludCk7CitleHRlcm4gdm9pZAltSVNETl9jbG9ja191cGRhdGUoc3RydWN0IG1JU0ROY2xvY2sgKiwgaW50LCBzdHJ1Y3QgdGltZXZhbCAqKTsKK2V4dGVybiB1bnNpZ25lZCBzaG9ydCBtSVNETl9jbG9ja19nZXQodm9pZCk7CiAKICNlbmRpZiAvKiBfX0tFUk5FTF9fICovCiAjZW5kaWYgLyogbUlTRE5JRl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21hZ2ljLmggYi9pbmNsdWRlL2xpbnV4L21hZ2ljLmgKaW5kZXggZjdmM2ZkZC4uMGI0ZGY3ZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tYWdpYy5oCisrKyBiL2luY2x1ZGUvbGludXgvbWFnaWMuaApAQCAtMTAsMTAgKzEwLDEzIEBACiAjZGVmaW5lIFNZU0ZTX01BR0lDCQkweDYyNjU2NTcyCiAjZGVmaW5lIFNFQ1VSSVRZRlNfTUFHSUMJMHg3MzYzNjY3MwogI2RlZmluZSBUTVBGU19NQUdJQwkJMHgwMTAyMTk5NAorI2RlZmluZSBTUVVBU0hGU19NQUdJQwkJMHg3MzcxNzM2OAogI2RlZmluZSBFRlNfU1VQRVJfTUFHSUMJCTB4NDE0QTUzCiAjZGVmaW5lIEVYVDJfU1VQRVJfTUFHSUMJMHhFRjUzCiAjZGVmaW5lIEVYVDNfU1VQRVJfTUFHSUMJMHhFRjUzCisjZGVmaW5lIFhFTkZTX1NVUEVSX01BR0lDCTB4YWJiYTE5NzQKICNkZWZpbmUgRVhUNF9TVVBFUl9NQUdJQwkweEVGNTMKKyNkZWZpbmUgQlRSRlNfU1VQRVJfTUFHSUMJMHg5MTIzNjgzRQogI2RlZmluZSBIUEZTX1NVUEVSX01BR0lDCTB4Zjk5NWU4NDkKICNkZWZpbmUgSVNPRlNfU1VQRVJfTUFHSUMJMHg5NjYwCiAjZGVmaW5lIEpGRlMyX1NVUEVSX01BR0lDCTB4NzJiNgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tYXRyb3hmYi5oIGIvaW5jbHVkZS9saW51eC9tYXRyb3hmYi5oCmluZGV4IGFlNWIwOTQuLjQwNGY2NzggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbWF0cm94ZmIuaAorKysgYi9pbmNsdWRlL2xpbnV4L21hdHJveGZiLmgKQEAgLTIsNyArMiw3IEBACiAjZGVmaW5lIF9fTElOVVhfTUFUUk9YRkJfSF9fCiAKICNpbmNsdWRlIDxhc20vaW9jdGwuaD4KLSNpbmNsdWRlIDxhc20vdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Mi5oPgogCiBzdHJ1Y3QgbWF0cm94aW9jX291dHB1dF9tb2RlIHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWVtY29udHJvbC5oIGIvaW5jbHVkZS9saW51eC9tZW1jb250cm9sLmgKaW5kZXggMWZiZTE0ZC4uMzI2ZjQ1YyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tZW1jb250cm9sLmgKKysrIGIvaW5jbHVkZS9saW51eC9tZW1jb250cm9sLmgKQEAgLTE5LDIyICsxOSw0NSBAQAogCiAjaWZuZGVmIF9MSU5VWF9NRU1DT05UUk9MX0gKICNkZWZpbmUgX0xJTlVYX01FTUNPTlRST0xfSAotCisjaW5jbHVkZSA8bGludXgvY2dyb3VwLmg+CiBzdHJ1Y3QgbWVtX2Nncm91cDsKIHN0cnVjdCBwYWdlX2Nncm91cDsKIHN0cnVjdCBwYWdlOwogc3RydWN0IG1tX3N0cnVjdDsKIAogI2lmZGVmIENPTkZJR19DR1JPVVBfTUVNX1JFU19DVExSCisvKgorICogQWxsICJjaGFyZ2UiIGZ1bmN0aW9ucyB3aXRoIGdmcF9tYXNrIHNob3VsZCB1c2UgR0ZQX0tFUk5FTCBvcgorICogKGdmcF9tYXNrICYgR0ZQX1JFQ0xBSU1fTUFTSykuIEluIGN1cnJlbnQgaW1wbGVtZW50YXRpbiwgbWVtY2cgZG9lc24ndAorICogYWxsb2MgbWVtb3J5IGJ1dCByZWNsYWltcyBtZW1vcnkgZnJvbSBhbGwgYXZhaWxhYmxlIHpvbmVzLiBTbywgIndoZXJlIEkgd2FudAorICogbWVtb3J5IGZyb20iIGJpdHMgb2YgZ2ZwX21hc2sgaGFzIG5vIG1lYW5pbmcuIFNvIGFueSBiaXRzIG9mIHRoYXQgZmllbGQgaXMKKyAqIGF2YWlsYWJsZSBidXQgYWRkaW5nIGEgcnVsZSBpcyBiZXR0ZXIuIGNoYXJnZSBmdW5jdGlvbnMnIGdmcF9tYXNrIHNob3VsZAorICogYmUgc2V0IHRvIEdGUF9LRVJORUwgb3IgZ2ZwX21hc2sgJiBHRlBfUkVDTEFJTV9NQVNLIGZvciBhdm9pZGluZyBhbWJpZ3VvdXMKKyAqIGNvZGVzLgorICogKE9mIGNvdXJzZSwgaWYgbWVtY2cgZG9lcyBtZW1vcnkgYWxsb2NhdGlvbiBpbiBmdXR1cmUsIEdGUF9LRVJORUwgaXMgc2FuZS4pCisgKi8KIAotZXh0ZXJuIGludCBtZW1fY2dyb3VwX2NoYXJnZShzdHJ1Y3QgcGFnZSAqcGFnZSwgc3RydWN0IG1tX3N0cnVjdCAqbW0sCitleHRlcm4gaW50IG1lbV9jZ3JvdXBfbmV3cGFnZV9jaGFyZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UsIHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLAogCQkJCWdmcF90IGdmcF9tYXNrKTsKKy8qIGZvciBzd2FwIGhhbmRsaW5nICovCitleHRlcm4gaW50IG1lbV9jZ3JvdXBfdHJ5X2NoYXJnZV9zd2FwaW4oc3RydWN0IG1tX3N0cnVjdCAqbW0sCisJCXN0cnVjdCBwYWdlICpwYWdlLCBnZnBfdCBtYXNrLCBzdHJ1Y3QgbWVtX2Nncm91cCAqKnB0cik7CitleHRlcm4gdm9pZCBtZW1fY2dyb3VwX2NvbW1pdF9jaGFyZ2Vfc3dhcGluKHN0cnVjdCBwYWdlICpwYWdlLAorCQkJCQlzdHJ1Y3QgbWVtX2Nncm91cCAqcHRyKTsKK2V4dGVybiB2b2lkIG1lbV9jZ3JvdXBfY2FuY2VsX2NoYXJnZV9zd2FwaW4oc3RydWN0IG1lbV9jZ3JvdXAgKnB0cik7CisKIGV4dGVybiBpbnQgbWVtX2Nncm91cF9jYWNoZV9jaGFyZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UsIHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLAogCQkJCQlnZnBfdCBnZnBfbWFzayk7Ci1leHRlcm4gdm9pZCBtZW1fY2dyb3VwX21vdmVfbGlzdHMoc3RydWN0IHBhZ2UgKnBhZ2UsIGVudW0gbHJ1X2xpc3QgbHJ1KTsKK2V4dGVybiB2b2lkIG1lbV9jZ3JvdXBfYWRkX2xydV9saXN0KHN0cnVjdCBwYWdlICpwYWdlLCBlbnVtIGxydV9saXN0IGxydSk7CitleHRlcm4gdm9pZCBtZW1fY2dyb3VwX2RlbF9scnVfbGlzdChzdHJ1Y3QgcGFnZSAqcGFnZSwgZW51bSBscnVfbGlzdCBscnUpOworZXh0ZXJuIHZvaWQgbWVtX2Nncm91cF9yb3RhdGVfbHJ1X2xpc3Qoc3RydWN0IHBhZ2UgKnBhZ2UsIGVudW0gbHJ1X2xpc3QgbHJ1KTsKK2V4dGVybiB2b2lkIG1lbV9jZ3JvdXBfZGVsX2xydShzdHJ1Y3QgcGFnZSAqcGFnZSk7CitleHRlcm4gdm9pZCBtZW1fY2dyb3VwX21vdmVfbGlzdHMoc3RydWN0IHBhZ2UgKnBhZ2UsCisJCQkJICBlbnVtIGxydV9saXN0IGZyb20sIGVudW0gbHJ1X2xpc3QgdG8pOwogZXh0ZXJuIHZvaWQgbWVtX2Nncm91cF91bmNoYXJnZV9wYWdlKHN0cnVjdCBwYWdlICpwYWdlKTsKIGV4dGVybiB2b2lkIG1lbV9jZ3JvdXBfdW5jaGFyZ2VfY2FjaGVfcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSk7Ci1leHRlcm4gaW50IG1lbV9jZ3JvdXBfc2hyaW5rX3VzYWdlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBnZnBfdCBnZnBfbWFzayk7CitleHRlcm4gaW50IG1lbV9jZ3JvdXBfc2hyaW5rX3VzYWdlKHN0cnVjdCBwYWdlICpwYWdlLAorCQkJc3RydWN0IG1tX3N0cnVjdCAqbW0sIGdmcF90IGdmcF9tYXNrKTsKIAogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgbWVtX2Nncm91cF9pc29sYXRlX3BhZ2VzKHVuc2lnbmVkIGxvbmcgbnJfdG9fc2NhbiwKIAkJCQkJc3RydWN0IGxpc3RfaGVhZCAqZHN0LApAQCAtNDcsMTIgKzcwLDIwIEBACiAKIGV4dGVybiBzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtX2Nncm91cF9mcm9tX3Rhc2soc3RydWN0IHRhc2tfc3RydWN0ICpwKTsKIAotI2RlZmluZSBtbV9tYXRjaF9jZ3JvdXAobW0sIGNncm91cCkJXAotCSgoY2dyb3VwKSA9PSBtZW1fY2dyb3VwX2Zyb21fdGFzaygobW0pLT5vd25lcikpCitzdGF0aWMgaW5saW5lCitpbnQgbW1fbWF0Y2hfY2dyb3VwKGNvbnN0IHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBjb25zdCBzdHJ1Y3QgbWVtX2Nncm91cCAqY2dyb3VwKQoreworCXN0cnVjdCBtZW1fY2dyb3VwICptZW07CisJcmN1X3JlYWRfbG9jaygpOworCW1lbSA9IG1lbV9jZ3JvdXBfZnJvbV90YXNrKChtbSktPm93bmVyKTsKKwlyY3VfcmVhZF91bmxvY2soKTsKKwlyZXR1cm4gY2dyb3VwID09IG1lbTsKK30KIAogZXh0ZXJuIGludAotbWVtX2Nncm91cF9wcmVwYXJlX21pZ3JhdGlvbihzdHJ1Y3QgcGFnZSAqcGFnZSwgc3RydWN0IHBhZ2UgKm5ld3BhZ2UpOwotZXh0ZXJuIHZvaWQgbWVtX2Nncm91cF9lbmRfbWlncmF0aW9uKHN0cnVjdCBwYWdlICpwYWdlKTsKK21lbV9jZ3JvdXBfcHJlcGFyZV9taWdyYXRpb24oc3RydWN0IHBhZ2UgKnBhZ2UsIHN0cnVjdCBtZW1fY2dyb3VwICoqcHRyKTsKK2V4dGVybiB2b2lkIG1lbV9jZ3JvdXBfZW5kX21pZ3JhdGlvbihzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtLAorCXN0cnVjdCBwYWdlICpvbGRwYWdlLCBzdHJ1Y3QgcGFnZSAqbmV3cGFnZSk7CiAKIC8qCiAgKiBGb3IgbWVtb3J5IHJlY2xhaW0uCkBAIC02NSwxMyArOTYsMzIgQEAKIAkJCQkJCQlpbnQgcHJpb3JpdHkpOwogZXh0ZXJuIHZvaWQgbWVtX2Nncm91cF9yZWNvcmRfcmVjbGFpbV9wcmlvcml0eShzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtLAogCQkJCQkJCWludCBwcmlvcml0eSk7CitpbnQgbWVtX2Nncm91cF9pbmFjdGl2ZV9hbm9uX2lzX2xvdyhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2cpOwordW5zaWduZWQgbG9uZyBtZW1fY2dyb3VwX3pvbmVfbnJfcGFnZXMoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLAorCQkJCSAgICAgICBzdHJ1Y3Qgem9uZSAqem9uZSwKKwkJCQkgICAgICAgZW51bSBscnVfbGlzdCBscnUpOworc3RydWN0IHpvbmVfcmVjbGFpbV9zdGF0ICptZW1fY2dyb3VwX2dldF9yZWNsYWltX3N0YXQoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLAorCQkJCQkJICAgICAgc3RydWN0IHpvbmUgKnpvbmUpOworc3RydWN0IHpvbmVfcmVjbGFpbV9zdGF0KgorbWVtX2Nncm91cF9nZXRfcmVjbGFpbV9zdGF0X2Zyb21fcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSk7CiAKLWV4dGVybiBsb25nIG1lbV9jZ3JvdXBfY2FsY19yZWNsYWltKHN0cnVjdCBtZW1fY2dyb3VwICptZW0sIHN0cnVjdCB6b25lICp6b25lLAotCQkJCQlpbnQgcHJpb3JpdHksIGVudW0gbHJ1X2xpc3QgbHJ1KTsKKyNpZmRlZiBDT05GSUdfQ0dST1VQX01FTV9SRVNfQ1RMUl9TV0FQCitleHRlcm4gaW50IGRvX3N3YXBfYWNjb3VudDsKKyNlbmRpZgogCitzdGF0aWMgaW5saW5lIGJvb2wgbWVtX2Nncm91cF9kaXNhYmxlZCh2b2lkKQoreworCWlmIChtZW1fY2dyb3VwX3N1YnN5cy5kaXNhYmxlZCkKKwkJcmV0dXJuIHRydWU7CisJcmV0dXJuIGZhbHNlOworfQorCitleHRlcm4gYm9vbCBtZW1fY2dyb3VwX29vbV9jYWxsZWQoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKTsKIAogI2Vsc2UgLyogQ09ORklHX0NHUk9VUF9NRU1fUkVTX0NUTFIgKi8KLXN0YXRpYyBpbmxpbmUgaW50IG1lbV9jZ3JvdXBfY2hhcmdlKHN0cnVjdCBwYWdlICpwYWdlLAorc3RydWN0IG1lbV9jZ3JvdXA7CisKK3N0YXRpYyBpbmxpbmUgaW50IG1lbV9jZ3JvdXBfbmV3cGFnZV9jaGFyZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UsCiAJCQkJCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBnZnBfdCBnZnBfbWFzaykKIHsKIAlyZXR1cm4gMDsKQEAgLTgzLDYgKzEzMywyMSBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW5saW5lIGludCBtZW1fY2dyb3VwX3RyeV9jaGFyZ2Vfc3dhcGluKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLAorCQlzdHJ1Y3QgcGFnZSAqcGFnZSwgZ2ZwX3QgZ2ZwX21hc2ssIHN0cnVjdCBtZW1fY2dyb3VwICoqcHRyKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbWVtX2Nncm91cF9jb21taXRfY2hhcmdlX3N3YXBpbihzdHJ1Y3QgcGFnZSAqcGFnZSwKKwkJCQkJICBzdHJ1Y3QgbWVtX2Nncm91cCAqcHRyKQoreworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbWVtX2Nncm91cF9jYW5jZWxfY2hhcmdlX3N3YXBpbihzdHJ1Y3QgbWVtX2Nncm91cCAqcHRyKQoreworfQorCiBzdGF0aWMgaW5saW5lIHZvaWQgbWVtX2Nncm91cF91bmNoYXJnZV9wYWdlKHN0cnVjdCBwYWdlICpwYWdlKQogewogfQpAQCAtOTEsMTIgKzE1NiwzMyBAQAogewogfQogCi1zdGF0aWMgaW5saW5lIGludCBtZW1fY2dyb3VwX3Nocmlua191c2FnZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgZ2ZwX3QgZ2ZwX21hc2spCitzdGF0aWMgaW5saW5lIGludCBtZW1fY2dyb3VwX3Nocmlua191c2FnZShzdHJ1Y3QgcGFnZSAqcGFnZSwKKwkJCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBnZnBfdCBnZnBfbWFzaykKIHsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIG1lbV9jZ3JvdXBfbW92ZV9saXN0cyhzdHJ1Y3QgcGFnZSAqcGFnZSwgYm9vbCBhY3RpdmUpCitzdGF0aWMgaW5saW5lIHZvaWQgbWVtX2Nncm91cF9hZGRfbHJ1X2xpc3Qoc3RydWN0IHBhZ2UgKnBhZ2UsIGludCBscnUpCit7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtZW1fY2dyb3VwX2RlbF9scnVfbGlzdChzdHJ1Y3QgcGFnZSAqcGFnZSwgaW50IGxydSkKK3sKKwlyZXR1cm4gOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbWVtX2Nncm91cF9yb3RhdGVfbHJ1X2xpc3Qoc3RydWN0IHBhZ2UgKnBhZ2UsIGludCBscnUpCit7CisJcmV0dXJuIDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG1lbV9jZ3JvdXBfZGVsX2xydShzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwlyZXR1cm4gOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK21lbV9jZ3JvdXBfbW92ZV9saXN0cyhzdHJ1Y3QgcGFnZSAqcGFnZSwgZW51bSBscnVfbGlzdCBmcm9tLCBlbnVtIGxydV9saXN0IHRvKQogewogfQogCkBAIC0xMTIsMTIgKzE5OCwxNCBAQAogfQogCiBzdGF0aWMgaW5saW5lIGludAotbWVtX2Nncm91cF9wcmVwYXJlX21pZ3JhdGlvbihzdHJ1Y3QgcGFnZSAqcGFnZSwgc3RydWN0IHBhZ2UgKm5ld3BhZ2UpCittZW1fY2dyb3VwX3ByZXBhcmVfbWlncmF0aW9uKHN0cnVjdCBwYWdlICpwYWdlLCBzdHJ1Y3QgbWVtX2Nncm91cCAqKnB0cikKIHsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIG1lbV9jZ3JvdXBfZW5kX21pZ3JhdGlvbihzdHJ1Y3QgcGFnZSAqcGFnZSkKK3N0YXRpYyBpbmxpbmUgdm9pZCBtZW1fY2dyb3VwX2VuZF9taWdyYXRpb24oc3RydWN0IG1lbV9jZ3JvdXAgKm1lbSwKKwkJCQkJc3RydWN0IHBhZ2UgKm9sZHBhZ2UsCisJCQkJCXN0cnVjdCBwYWdlICpuZXdwYWdlKQogewogfQogCkBAIC0xNDYsMTIgKzIzNCw0MiBAQAogewogfQogCi1zdGF0aWMgaW5saW5lIGxvbmcgbWVtX2Nncm91cF9jYWxjX3JlY2xhaW0oc3RydWN0IG1lbV9jZ3JvdXAgKm1lbSwKLQkJCQkJc3RydWN0IHpvbmUgKnpvbmUsIGludCBwcmlvcml0eSwKLQkJCQkJZW51bSBscnVfbGlzdCBscnUpCitzdGF0aWMgaW5saW5lIGJvb2wgbWVtX2Nncm91cF9kaXNhYmxlZCh2b2lkKQoreworCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgbWVtX2Nncm91cF9vb21fY2FsbGVkKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaykKK3sKKwlyZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CittZW1fY2dyb3VwX2luYWN0aXZlX2Fub25faXNfbG93KHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZykKK3sKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nCittZW1fY2dyb3VwX3pvbmVfbnJfcGFnZXMoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLCBzdHJ1Y3Qgem9uZSAqem9uZSwKKwkJCSBlbnVtIGxydV9saXN0IGxydSkKIHsKIAlyZXR1cm4gMDsKIH0KKworCitzdGF0aWMgaW5saW5lIHN0cnVjdCB6b25lX3JlY2xhaW1fc3RhdCoKK21lbV9jZ3JvdXBfZ2V0X3JlY2xhaW1fc3RhdChzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csIHN0cnVjdCB6b25lICp6b25lKQoreworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCB6b25lX3JlY2xhaW1fc3RhdCoKK21lbV9jZ3JvdXBfZ2V0X3JlY2xhaW1fc3RhdF9mcm9tX3BhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UpCit7CisJcmV0dXJuIE5VTEw7Cit9CisKICNlbmRpZiAvKiBDT05GSUdfQ0dST1VQX01FTV9DT05UICovCiAKICNlbmRpZiAvKiBfTElOVVhfTUVNQ09OVFJPTF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21lbXN0aWNrLmggYi9pbmNsdWRlL2xpbnV4L21lbXN0aWNrLmgKaW5kZXggZDBjMzdlNi4uNjkwYzM1YSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tZW1zdGljay5oCisrKyBiL2luY2x1ZGUvbGludXgvbWVtc3RpY2suaApAQCAtMTAwLDggKzEwMCw4IEBACiAjZGVmaW5lIE1FTVNUSUNLX1NZU19QQVI4ICAgMHg0MAogI2RlZmluZSBNRU1TVElDS19TWVNfU0VSSUFMIDB4ODAKIAotCXVuc2lnbmVkIHNob3J0IGRhdGFfY291bnQ7Ci0JdW5zaWduZWQgaW50ICAgZGF0YV9hZGRyZXNzOworCV9fYmUxNiBkYXRhX2NvdW50OworCV9fYmUzMiBkYXRhX2FkZHJlc3M7CiAJdW5zaWduZWQgY2hhciAgdHBjX3BhcmFtOwogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tZmQvcGNmNTA2MzMvYWRjLmggYi9pbmNsdWRlL2xpbnV4L21mZC9wY2Y1MDYzMy9hZGMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjY2OWI0Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9tZmQvcGNmNTA2MzMvYWRjLmgKQEAgLTAsMCArMSw3MiBAQAorLyoKKyAqIGFkYy5oICAtLSBEcml2ZXIgZm9yIE5YUCBQQ0Y1MDYzMyBBREMKKyAqCisgKiAoQykgMjAwNi0yMDA4IGJ5IE9wZW5tb2tvLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2lmbmRlZiBfX0xJTlVYX01GRF9QQ0Y1MDYzM19BRENfSAorI2RlZmluZSBfX0xJTlVYX01GRF9QQ0Y1MDYzM19BRENfSAorCisjaW5jbHVkZSA8bGludXgvbWZkL3BjZjUwNjMzL2NvcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKworLyogQURDIFJlZ2lzdGVycyAqLworI2RlZmluZSBQQ0Y1MDYzM19SRUdfQURDQzMJCTB4NTIKKyNkZWZpbmUgUENGNTA2MzNfUkVHX0FEQ0MyCQkweDUzCisjZGVmaW5lIFBDRjUwNjMzX1JFR19BRENDMQkJMHg1NAorI2RlZmluZSBQQ0Y1MDYzM19SRUdfQURDUzEJCTB4NTUKKyNkZWZpbmUgUENGNTA2MzNfUkVHX0FEQ1MyCQkweDU2CisjZGVmaW5lIFBDRjUwNjMzX1JFR19BRENTMwkJMHg1NworCisjZGVmaW5lIFBDRjUwNjMzX0FEQ0MxX0FEQ1NUQVJUCQkweDAxCisjZGVmaW5lIFBDRjUwNjMzX0FEQ0MxX1JFU18xMEJJVAkweDAyCisjZGVmaW5lIFBDRjUwNjMzX0FEQ0MxX0FWRVJBR0VfTk8JMHgwMAorI2RlZmluZSBQQ0Y1MDYzM19BRENDMV9BVkVSQUdFXzQJMHgwNAorI2RlZmluZSBQQ0Y1MDYzM19BRENDMV9BVkVSQUdFXzgJMHgwOAorI2RlZmluZSBQQ0Y1MDYzM19BRENDMV9BVkVSQUdFXzE2CTB4MGMKKyNkZWZpbmUgUENGNTA2MzNfQURDQzFfTVVYX0JBVFNOU19SRVMJMHgwMAorI2RlZmluZSBQQ0Y1MDYzM19BRENDMV9NVVhfQkFUU05TX1NVQlRSCTB4MTAKKyNkZWZpbmUgUENGNTA2MzNfQURDQzFfTVVYX0FEQ0lOMl9SRVMJMHgyMAorI2RlZmluZSBQQ0Y1MDYzM19BRENDMV9NVVhfQURDSU4yX1NVQlRSCTB4MzAKKyNkZWZpbmUgUENGNTA2MzNfQURDQzFfTVVYX0JBVFRFTVAJMHg2MAorI2RlZmluZSBQQ0Y1MDYzM19BRENDMV9NVVhfQURDSU4xCTB4NzAKKyNkZWZpbmUgUENGNTA2MzNfQURDQzFfQVZFUkFHRV9NQVNLCTB4MGMKKyNkZWZpbmUgUENGNTA2MzNfQURDQzFfQURDTVVYX01BU0sJMHhmMAorCisjZGVmaW5lIFBDRjUwNjMzX0FEQ0MyX1JBVElPX05PTkUJMHgwMAorI2RlZmluZSBQQ0Y1MDYzM19BRENDMl9SQVRJT19CQVRURU1QCTB4MDEKKyNkZWZpbmUgUENGNTA2MzNfQURDQzJfUkFUSU9fQURDSU4xCTB4MDIKKyNkZWZpbmUgUENGNTA2MzNfQURDQzJfUkFUSU9fQk9USAkweDAzCisjZGVmaW5lIFBDRjUwNjMzX0FEQ0MyX1JBVElPU0VUVExfMTAwVVMgMHgwNAorCisjZGVmaW5lIFBDRjUwNjMzX0FEQ0MzX0FDQ1NXX0VOCQkweDAxCisjZGVmaW5lIFBDRjUwNjMzX0FEQ0MzX05UQ1NXX0VOCQkweDA0CisjZGVmaW5lIFBDRjUwNjMzX0FEQ0MzX1JFU19ESVZfVFdPCTB4MTAKKyNkZWZpbmUgUENGNTA2MzNfQURDQzNfUkVTX0RJVl9USFJFRQkweDAwCisKKyNkZWZpbmUgUENGNTA2MzNfQURDUzNfUkVGX05UQ1NXCTB4MDAKKyNkZWZpbmUgUENGNTA2MzNfQURDUzNfUkVGX0FDQ1NXCTB4MTAKKyNkZWZpbmUgUENGNTA2MzNfQURDUzNfUkVGXzJWMAkJMHgyMAorI2RlZmluZSBQQ0Y1MDYzM19BRENTM19SRUZfVklTQQkJMHgzMAorI2RlZmluZSBQQ0Y1MDYzM19BRENTM19SRUZfMlYwXzIJMHg3MAorI2RlZmluZSBQQ0Y1MDYzM19BRENTM19BRENSRFkJCTB4ODAKKworI2RlZmluZSBQQ0Y1MDYzM19BRENTM19BRENEQVQxTF9NQVNLCTB4MDMKKyNkZWZpbmUgUENGNTA2MzNfQURDUzNfQURDREFUMkxfTUFTSwkweDBjCisjZGVmaW5lIFBDRjUwNjMzX0FEQ1MzX0FEQ0RBVDJMX1NISUZUCTIKKyNkZWZpbmUgUENGNTA2MzNfQVNDUzNfUkVGX01BU0sJCTB4NzAKKworZXh0ZXJuIGludAorcGNmNTA2MzNfYWRjX2FzeW5jX3JlYWQoc3RydWN0IHBjZjUwNjMzICpwY2YsIGludCBtdXgsIGludCBhdmcsCisJCXZvaWQgKCpjYWxsYmFjaykoc3RydWN0IHBjZjUwNjMzICosIHZvaWQgKiwgaW50KSwKKwkJdm9pZCAqY2FsbGJhY2tfcGFyYW0pOworZXh0ZXJuIGludAorcGNmNTA2MzNfYWRjX3N5bmNfcmVhZChzdHJ1Y3QgcGNmNTA2MzMgKnBjZiwgaW50IG11eCwgaW50IGF2Zyk7CisKKyNlbmRpZiAvKiBfX0xJTlVYX1BDRjUwNjMzX0FEQ19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21mZC9wY2Y1MDYzMy9jb3JlLmggYi9pbmNsdWRlL2xpbnV4L21mZC9wY2Y1MDYzMy9jb3JlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQ1NWIyMQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvbWZkL3BjZjUwNjMzL2NvcmUuaApAQCAtMCwwICsxLDIxOCBAQAorLyoKKyAqIGNvcmUuaCAgLS0gQ29yZSBkcml2ZXIgZm9yIE5YUCBQQ0Y1MDYzMworICoKKyAqIChDKSAyMDA2LTIwMDggYnkgT3Blbm1va28sIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaWZuZGVmIF9fTElOVVhfTUZEX1BDRjUwNjMzX0NPUkVfSAorI2RlZmluZSBfX0xJTlVYX01GRF9QQ0Y1MDYzM19DT1JFX0gKKworI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9kcml2ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvbWFjaGluZS5oPgorI2luY2x1ZGUgPGxpbnV4L3Bvd2VyX3N1cHBseS5oPgorCitzdHJ1Y3QgcGNmNTA2MzM7CisKKyNkZWZpbmUgUENGNTA2MzNfTlVNX1JFR1VMQVRPUlMJMTEKKworc3RydWN0IHBjZjUwNjMzX3BsYXRmb3JtX2RhdGEgeworCXN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIHJlZ19pbml0X2RhdGFbUENGNTA2MzNfTlVNX1JFR1VMQVRPUlNdOworCisJY2hhciAqKmJhdHRlcmllczsKKwlpbnQgbnVtX2JhdHRlcmllczsKKworCS8qIENhbGxiYWNrcyAqLworCXZvaWQgKCpwcm9iZV9kb25lKShzdHJ1Y3QgcGNmNTA2MzMgKik7CisJdm9pZCAoKm1iY19ldmVudF9jYWxsYmFjaykoc3RydWN0IHBjZjUwNjMzICosIGludCk7CisJdm9pZCAoKnJlZ3VsYXRvcl9yZWdpc3RlcmVkKShzdHJ1Y3QgcGNmNTA2MzMgKiwgaW50KTsKKwl2b2lkICgqZm9yY2Vfc2h1dGRvd24pKHN0cnVjdCBwY2Y1MDYzMyAqKTsKKworCXU4IHJlc3VtZXJzWzVdOworfTsKKworc3RydWN0IHBjZjUwNjMzX3N1YmRldl9wZGF0YSB7CisJc3RydWN0IHBjZjUwNjMzICpwY2Y7Cit9OworCitzdHJ1Y3QgcGNmNTA2MzNfaXJxIHsKKwl2b2lkICgqaGFuZGxlcikgKGludCwgdm9pZCAqKTsKKwl2b2lkICpkYXRhOworfTsKKworaW50IHBjZjUwNjMzX3JlZ2lzdGVyX2lycShzdHJ1Y3QgcGNmNTA2MzMgKnBjZiwgaW50IGlycSwKKwkJCXZvaWQgKCpoYW5kbGVyKSAoaW50LCB2b2lkICopLCB2b2lkICpkYXRhKTsKK2ludCBwY2Y1MDYzM19mcmVlX2lycShzdHJ1Y3QgcGNmNTA2MzMgKnBjZiwgaW50IGlycSk7CisKK2ludCBwY2Y1MDYzM19pcnFfbWFzayhzdHJ1Y3QgcGNmNTA2MzMgKnBjZiwgaW50IGlycSk7CitpbnQgcGNmNTA2MzNfaXJxX3VubWFzayhzdHJ1Y3QgcGNmNTA2MzMgKnBjZiwgaW50IGlycSk7CitpbnQgcGNmNTA2MzNfaXJxX21hc2tfZ2V0KHN0cnVjdCBwY2Y1MDYzMyAqcGNmLCBpbnQgaXJxKTsKKworaW50IHBjZjUwNjMzX3JlYWRfYmxvY2soc3RydWN0IHBjZjUwNjMzICosIHU4IHJlZywKKwkJCQkJaW50IG5yX3JlZ3MsIHU4ICpkYXRhKTsKK2ludCBwY2Y1MDYzM193cml0ZV9ibG9jayhzdHJ1Y3QgcGNmNTA2MzMgKnBjZiwgdTggcmVnLAorCQkJCQlpbnQgbnJfcmVncywgdTggKmRhdGEpOwordTggcGNmNTA2MzNfcmVnX3JlYWQoc3RydWN0IHBjZjUwNjMzICosIHU4IHJlZyk7CitpbnQgcGNmNTA2MzNfcmVnX3dyaXRlKHN0cnVjdCBwY2Y1MDYzMyAqcGNmLCB1OCByZWcsIHU4IHZhbCk7CisKK2ludCBwY2Y1MDYzM19yZWdfc2V0X2JpdF9tYXNrKHN0cnVjdCBwY2Y1MDYzMyAqcGNmLCB1OCByZWcsIHU4IG1hc2ssIHU4IHZhbCk7CitpbnQgcGNmNTA2MzNfcmVnX2NsZWFyX2JpdHMoc3RydWN0IHBjZjUwNjMzICpwY2YsIHU4IHJlZywgdTggYml0cyk7CisKKy8qIEludGVycnVwdCByZWdpc3RlcnMgKi8KKworI2RlZmluZSBQQ0Y1MDYzM19SRUdfSU5UMQkweDAyCisjZGVmaW5lIFBDRjUwNjMzX1JFR19JTlQyCTB4MDMKKyNkZWZpbmUgUENGNTA2MzNfUkVHX0lOVDMJMHgwNAorI2RlZmluZSBQQ0Y1MDYzM19SRUdfSU5UNAkweDA1CisjZGVmaW5lIFBDRjUwNjMzX1JFR19JTlQ1CTB4MDYKKworI2RlZmluZSBQQ0Y1MDYzM19SRUdfSU5UMU0JMHgwNworI2RlZmluZSBQQ0Y1MDYzM19SRUdfSU5UMk0JMHgwOAorI2RlZmluZSBQQ0Y1MDYzM19SRUdfSU5UM00JMHgwOQorI2RlZmluZSBQQ0Y1MDYzM19SRUdfSU5UNE0JMHgwYQorI2RlZmluZSBQQ0Y1MDYzM19SRUdfSU5UNU0JMHgwYgorCitlbnVtIHsKKwkvKiBDaGlwIElSUXMgKi8KKwlQQ0Y1MDYzM19JUlFfQURQSU5TLAorCVBDRjUwNjMzX0lSUV9BRFBSRU0sCisJUENGNTA2MzNfSVJRX1VTQklOUywKKwlQQ0Y1MDYzM19JUlFfVVNCUkVNLAorCVBDRjUwNjMzX0lSUV9SRVNFUlZFRDEsCisJUENGNTA2MzNfSVJRX1JFU0VSVkVEMiwKKwlQQ0Y1MDYzM19JUlFfQUxBUk0sCisJUENGNTA2MzNfSVJRX1NFQ09ORCwKKwlQQ0Y1MDYzM19JUlFfT05LRVlSLAorCVBDRjUwNjMzX0lSUV9PTktFWUYsCisJUENGNTA2MzNfSVJRX0VYVE9OMVIsCisJUENGNTA2MzNfSVJRX0VYVE9OMUYsCisJUENGNTA2MzNfSVJRX0VYVE9OMlIsCisJUENGNTA2MzNfSVJRX0VYVE9OMkYsCisJUENGNTA2MzNfSVJRX0VYVE9OM1IsCisJUENGNTA2MzNfSVJRX0VYVE9OM0YsCisJUENGNTA2MzNfSVJRX0JBVEZVTEwsCisJUENGNTA2MzNfSVJRX0NIR0hBTFQsCisJUENGNTA2MzNfSVJRX1RITElNT04sCisJUENGNTA2MzNfSVJRX1RITElNT0ZGLAorCVBDRjUwNjMzX0lSUV9VU0JMSU1PTiwKKwlQQ0Y1MDYzM19JUlFfVVNCTElNT0ZGLAorCVBDRjUwNjMzX0lSUV9BRENSRFksCisJUENGNTA2MzNfSVJRX09OS0VZMVMsCisJUENGNTA2MzNfSVJRX0xPV1NZUywKKwlQQ0Y1MDYzM19JUlFfTE9XQkFULAorCVBDRjUwNjMzX0lSUV9ISUdIVE1QLAorCVBDRjUwNjMzX0lSUV9BVVRPUFdSRkFJTCwKKwlQQ0Y1MDYzM19JUlFfRFdOMVBXUkZBSUwsCisJUENGNTA2MzNfSVJRX0RXTjJQV1JGQUlMLAorCVBDRjUwNjMzX0lSUV9MRURQV1JGQUlMLAorCVBDRjUwNjMzX0lSUV9MRURPVlAsCisJUENGNTA2MzNfSVJRX0xETzFQV1JGQUlMLAorCVBDRjUwNjMzX0lSUV9MRE8yUFdSRkFJTCwKKwlQQ0Y1MDYzM19JUlFfTERPM1BXUkZBSUwsCisJUENGNTA2MzNfSVJRX0xETzRQV1JGQUlMLAorCVBDRjUwNjMzX0lSUV9MRE81UFdSRkFJTCwKKwlQQ0Y1MDYzM19JUlFfTERPNlBXUkZBSUwsCisJUENGNTA2MzNfSVJRX0hDTERPUFdSRkFJTCwKKwlQQ0Y1MDYzM19JUlFfSENMRE9PVkwsCisKKwkvKiBBbHdheXMgbGFzdCAqLworCVBDRjUwNjMzX05VTV9JUlEsCit9OworCitzdHJ1Y3QgcGNmNTA2MzMgeworCXN0cnVjdCBkZXZpY2UgKmRldjsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqaTJjX2NsaWVudDsKKworCXN0cnVjdCBwY2Y1MDYzM19wbGF0Zm9ybV9kYXRhICpwZGF0YTsKKwlpbnQgaXJxOworCXN0cnVjdCBwY2Y1MDYzM19pcnEgaXJxX2hhbmRsZXJbUENGNTA2MzNfTlVNX0lSUV07CisJc3RydWN0IHdvcmtfc3RydWN0IGlycV93b3JrOworCXN0cnVjdCBtdXRleCBsb2NrOworCisJdTggbWFza19yZWdzWzVdOworCisJdTggc3VzcGVuZF9pcnFfbWFza3NbNV07CisJdTggcmVzdW1lX3JlYXNvbls1XTsKKwlpbnQgaXNfc3VzcGVuZGVkOworCisJaW50IG9ua2V5MXNfaGVsZDsKKworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnJ0Y19wZGV2OworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKm1iY19wZGV2OworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmFkY19wZGV2OworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmlucHV0X3BkZXY7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcmVndWxhdG9yX3BkZXZbUENGNTA2MzNfTlVNX1JFR1VMQVRPUlNdOworfTsKKworZW51bSBwY2Y1MDYzM19yZWdfaW50MSB7CisJUENGNTA2MzNfSU5UMV9BRFBJTlMJPSAweDAxLAkvKiBBZGFwdGVyIGluc2VydGVkICovCisJUENGNTA2MzNfSU5UMV9BRFBSRU0JPSAweDAyLAkvKiBBZGFwdGVyIHJlbW92ZWQgKi8KKwlQQ0Y1MDYzM19JTlQxX1VTQklOUwk9IDB4MDQsCS8qIFVTQiBpbnNlcnRlZCAqLworCVBDRjUwNjMzX0lOVDFfVVNCUkVNCT0gMHgwOCwJLyogVVNCIHJlbW92ZWQgKi8KKwkvKiByZXNlcnZlZCAqLworCVBDRjUwNjMzX0lOVDFfQUxBUk0JPSAweDQwLCAvKiBSVEMgYWxhcm0gdGltZSBpcyByZWFjaGVkICovCisJUENGNTA2MzNfSU5UMV9TRUNPTkQJPSAweDgwLAkvKiBSVEMgcGVyaW9kaWMgc2Vjb25kIGludGVycnVwdCAqLworfTsKKworZW51bSBwY2Y1MDYzM19yZWdfaW50MiB7CisJUENGNTA2MzNfSU5UMl9PTktFWVIJPSAweDAxLCAvKiBPTktFWSByaXNpbmcgZWRnZSAqLworCVBDRjUwNjMzX0lOVDJfT05LRVlGCT0gMHgwMiwgLyogT05LRVkgZmFsbGluZyBlZGdlICovCisJUENGNTA2MzNfSU5UMl9FWFRPTjFSCT0gMHgwNCwgLyogRVhUT04xIHJpc2luZyBlZGdlICovCisJUENGNTA2MzNfSU5UMl9FWFRPTjFGCT0gMHgwOCwgLyogRVhUT04xIGZhbGxpbmcgZWRnZSAqLworCVBDRjUwNjMzX0lOVDJfRVhUT04yUgk9IDB4MTAsIC8qIEVYVE9OMiByaXNpbmcgZWRnZSAqLworCVBDRjUwNjMzX0lOVDJfRVhUT04yRgk9IDB4MjAsIC8qIEVYVE9OMiBmYWxsaW5nIGVkZ2UgKi8KKwlQQ0Y1MDYzM19JTlQyX0VYVE9OM1IJPSAweDQwLCAvKiBFWFRPTjMgcmlzaW5nIGVkZ2UgKi8KKwlQQ0Y1MDYzM19JTlQyX0VYVE9OM0YJPSAweDgwLCAvKiBFWFRPTjMgZmFsbGluZyBlZGdlICovCit9OworCitlbnVtIHBjZjUwNjMzX3JlZ19pbnQzIHsKKwlQQ0Y1MDYzM19JTlQzX0JBVEZVTEwJPSAweDAxLCAvKiBCYXR0ZXJ5IGZ1bGwgKi8KKwlQQ0Y1MDYzM19JTlQzX0NIR0hBTFQJPSAweDAyLAkvKiBDaGFyZ2VyIGhhbHQgKi8KKwlQQ0Y1MDYzM19JTlQzX1RITElNT04JPSAweDA0LAorCVBDRjUwNjMzX0lOVDNfVEhMSU1PRkYJPSAweDA4LAorCVBDRjUwNjMzX0lOVDNfVVNCTElNT04JPSAweDEwLAorCVBDRjUwNjMzX0lOVDNfVVNCTElNT0ZGCT0gMHgyMCwKKwlQQ0Y1MDYzM19JTlQzX0FEQ1JEWQk9IDB4NDAsIC8qIEFEQyByZXN1bHQgcmVhZHkgKi8KKwlQQ0Y1MDYzM19JTlQzX09OS0VZMVMJPSAweDgwLAkvKiBPTktFWSBwcmVzc2VkIDEgc2Vjb25kICovCit9OworCitlbnVtIHBjZjUwNjMzX3JlZ19pbnQ0IHsKKwlQQ0Y1MDYzM19JTlQ0X0xPV1NZUwkJPSAweDAxLAorCVBDRjUwNjMzX0lOVDRfTE9XQkFUCQk9IDB4MDIsCisJUENGNTA2MzNfSU5UNF9ISUdIVE1QCQk9IDB4MDQsCisJUENGNTA2MzNfSU5UNF9BVVRPUFdSRkFJTAk9IDB4MDgsCisJUENGNTA2MzNfSU5UNF9EV04xUFdSRkFJTAk9IDB4MTAsCisJUENGNTA2MzNfSU5UNF9EV04yUFdSRkFJTAk9IDB4MjAsCisJUENGNTA2MzNfSU5UNF9MRURQV1JGQUlMCT0gMHg0MCwKKwlQQ0Y1MDYzM19JTlQ0X0xFRE9WUAkJPSAweDgwLAorfTsKKworZW51bSBwY2Y1MDYzM19yZWdfaW50NSB7CisJUENGNTA2MzNfSU5UNV9MRE8xUFdSRkFJTAk9IDB4MDEsCisJUENGNTA2MzNfSU5UNV9MRE8yUFdSRkFJTAk9IDB4MDIsCisJUENGNTA2MzNfSU5UNV9MRE8zUFdSRkFJTAk9IDB4MDQsCisJUENGNTA2MzNfSU5UNV9MRE80UFdSRkFJTAk9IDB4MDgsCisJUENGNTA2MzNfSU5UNV9MRE81UFdSRkFJTAk9IDB4MTAsCisJUENGNTA2MzNfSU5UNV9MRE82UFdSRkFJTAk9IDB4MjAsCisJUENGNTA2MzNfSU5UNV9IQ0xET1BXUkZBSUwJPSAweDQwLAorCVBDRjUwNjMzX0lOVDVfSENMRE9PVkwJCT0gMHg4MCwKK307CisKKy8qIG1pc2MuIHJlZ2lzdGVycyAqLworI2RlZmluZSBQQ0Y1MDYzM19SRUdfT09DU0hEV04JMHgwYworCisvKiBMRUQgcmVnaXN0ZXJzICovCisjZGVmaW5lIFBDRjUwNjMzX1JFR19MRURPVVQgMHgyOAorI2RlZmluZSBQQ0Y1MDYzM19SRUdfTEVERU5BIDB4MjkKKyNkZWZpbmUgUENGNTA2MzNfUkVHX0xFRENUTCAweDJhCisjZGVmaW5lIFBDRjUwNjMzX1JFR19MRURESU0gMHgyYgorCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tZmQvcGNmNTA2MzMvZ3Bpby5oIGIvaW5jbHVkZS9saW51eC9tZmQvcGNmNTA2MzMvZ3Bpby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0MmI4NDUKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L21mZC9wY2Y1MDYzMy9ncGlvLmgKQEAgLTAsMCArMSw1MiBAQAorLyoKKyAqIGdwaW8uaCAtLSBHUElPIGRyaXZlciBmb3IgTlhQIFBDRjUwNjMzCisgKgorICogKEMpIDIwMDYtMjAwOCBieSBPcGVubW9rbywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpZm5kZWYgX19MSU5VWF9NRkRfUENGNTA2MzNfR1BJT19ICisjZGVmaW5lIF9fTElOVVhfTUZEX1BDRjUwNjMzX0dQSU9fSAorCisjaW5jbHVkZSA8bGludXgvbWZkL3BjZjUwNjMzL2NvcmUuaD4KKworI2RlZmluZSBQQ0Y1MDYzM19HUElPMQkJMQorI2RlZmluZSBQQ0Y1MDYzM19HUElPMgkJMgorI2RlZmluZSBQQ0Y1MDYzM19HUElPMwkJMworI2RlZmluZSBQQ0Y1MDYzM19HUE8JCTQKKworI2RlZmluZSBQQ0Y1MDYzM19SRUdfR1BJTzFDRkcJMHgxNAorI2RlZmluZSBQQ0Y1MDYzM19SRUdfR1BJTzJDRkcJMHgxNQorI2RlZmluZSBQQ0Y1MDYzM19SRUdfR1BJTzNDRkcJMHgxNgorI2RlZmluZSBQQ0Y1MDYzM19SRUdfR1BPQ0ZHIAkweDE3CisKKyNkZWZpbmUgUENGNTA2MzNfR1BPQ0ZHX0dQT1NFTF9NQVNLCTB4MDcKKworZW51bSBwY2Y1MDYzM19yZWdfZ3BvY2ZnIHsKKwlQQ0Y1MDYzM19HUE9DRkdfR1BPU0VMXzAJPSAweDAwLAorCVBDRjUwNjMzX0dQT0NGR19HUE9TRUxfTEVEX05GRVQJPSAweDAxLAorCVBDRjUwNjMzX0dQT0NGR19HUE9TRUxfU1lTeE9LCT0gMHgwMiwKKwlQQ0Y1MDYzM19HUE9DRkdfR1BPU0VMX0NMSzMySwk9IDB4MDMsCisJUENGNTA2MzNfR1BPQ0ZHX0dQT1NFTF9BREFQVVNCCT0gMHgwNCwKKwlQQ0Y1MDYzM19HUE9DRkdfR1BPU0VMX1VTQnhPSwk9IDB4MDUsCisJUENGNTA2MzNfR1BPQ0ZHX0dQT1NFTF9BQ1RQSDQJPSAweDA2LAorCVBDRjUwNjMzX0dQT0NGR19HUE9TRUxfMQk9IDB4MDcsCisJUENGNTA2MzNfR1BPQ0ZHX0dQT1NFTF9JTlZFUlNFCT0gMHgwOCwKK307CisKK2ludCBwY2Y1MDYzM19ncGlvX3NldChzdHJ1Y3QgcGNmNTA2MzMgKnBjZiwgaW50IGdwaW8sIHU4IHZhbCk7Cit1OCBwY2Y1MDYzM19ncGlvX2dldChzdHJ1Y3QgcGNmNTA2MzMgKnBjZiwgaW50IGdwaW8pOworCitpbnQgcGNmNTA2MzNfZ3Bpb19pbnZlcnRfc2V0KHN0cnVjdCBwY2Y1MDYzMyAqLCBpbnQgZ3BpbywgaW50IGludmVydCk7CitpbnQgcGNmNTA2MzNfZ3Bpb19pbnZlcnRfZ2V0KHN0cnVjdCBwY2Y1MDYzMyAqcGNmLCBpbnQgZ3Bpbyk7CisKK2ludCBwY2Y1MDYzM19ncGlvX3Bvd2VyX3N1cHBseV9zZXQoc3RydWN0IHBjZjUwNjMzICosCisJCQkJCWludCBncGlvLCBpbnQgcmVndWxhdG9yLCBpbnQgb24pOworI2VuZGlmIC8qIF9fTElOVVhfTUZEX1BDRjUwNjMzX0dQSU9fSCAqLworCisKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWZkL3BjZjUwNjMzL21iYy5oIGIvaW5jbHVkZS9saW51eC9tZmQvcGNmNTA2MzMvbWJjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmUxNzYxOQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvbWZkL3BjZjUwNjMzL21iYy5oCkBAIC0wLDAgKzEsMTM0IEBACisvKgorICogbWJjLmggIC0tIERyaXZlciBmb3IgTlhQIFBDRjUwNjMzIE1haW4gQmF0dGVyeSBDaGFyZ2VyCisgKgorICogKEMpIDIwMDYtMjAwOCBieSBPcGVubW9rbywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpZm5kZWYgX19MSU5VWF9NRkRfUENGNTA2MzNfTUJDX0gKKyNkZWZpbmUgX19MSU5VWF9NRkRfUENGNTA2MzNfTUJDX0gKKworI2luY2x1ZGUgPGxpbnV4L21mZC9wY2Y1MDYzMy9jb3JlLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisKKyNkZWZpbmUgUENGNTA2MzNfUkVHX01CQ0MxCTB4NDMKKyNkZWZpbmUgUENGNTA2MzNfUkVHX01CQ0MyCTB4NDQKKyNkZWZpbmUgUENGNTA2MzNfUkVHX01CQ0MzCTB4NDUKKyNkZWZpbmUgUENGNTA2MzNfUkVHX01CQ0M0CTB4NDYKKyNkZWZpbmUgUENGNTA2MzNfUkVHX01CQ0M1CTB4NDcKKyNkZWZpbmUgUENGNTA2MzNfUkVHX01CQ0M2CTB4NDgKKyNkZWZpbmUgUENGNTA2MzNfUkVHX01CQ0M3CTB4NDkKKyNkZWZpbmUgUENGNTA2MzNfUkVHX01CQ0M4CTB4NGEKKyNkZWZpbmUgUENGNTA2MzNfUkVHX01CQ1MxCTB4NGIKKyNkZWZpbmUgUENGNTA2MzNfUkVHX01CQ1MyCTB4NGMKKyNkZWZpbmUgUENGNTA2MzNfUkVHX01CQ1MzCTB4NGQKKworZW51bSBwY2Y1MDYzM19yZWdfbWJjYzEgeworCVBDRjUwNjMzX01CQ0MxX0NIR0VOQQkJPSAweDAxLAkvKiBDaGFyZ2VyIGVuYWJsZSAqLworCVBDRjUwNjMzX01CQ0MxX0FVVE9TVE9QCQk9IDB4MDIsCisJUENGNTA2MzNfTUJDQzFfQVVUT1JFUwkJPSAweDA0LCAvKiBhdXRvbWF0aWMgcmVzdW1lICovCisJUENGNTA2MzNfTUJDQzFfUkVTVU1FCQk9IDB4MDgsIC8qIGV4cGxpY2l0IHJlc3VtZSBjbWQgKi8KKwlQQ0Y1MDYzM19NQkNDMV9SRVNUQVJUCQk9IDB4MTAsIC8qIHJlc3RhcnQgY2hhcmdpbmcgKi8KKwlQQ0Y1MDYzM19NQkNDMV9QUkVXRFRJTUVfNjBNCT0gMHgyMCwJLyogbWF4LiBwcmVjaGFyZ2luZyB0aW1lICovCisJUENGNTA2MzNfTUJDQzFfV0RUSU1FXzFICT0gMHgwMCwKKwlQQ0Y1MDYzM19NQkNDMV9XRFRJTUVfMkgJPSAweDQwLAorCVBDRjUwNjMzX01CQ0MxX1dEVElNRV80SAk9IDB4ODAsCisJUENGNTA2MzNfTUJDQzFfV0RUSU1FXzZICT0gMHhjMCwKK307CisjZGVmaW5lIFBDRjUwNjMzX01CQ0MxX1dEVElNRV9NQVNLCSAgMHhjMAorCitlbnVtIHBjZjUwNjMzX3JlZ19tYmNjMiB7CisJUENGNTA2MzNfTUJDQzJfVkJBVENPTkRfMlY3CT0gMHgwMCwKKwlQQ0Y1MDYzM19NQkNDMl9WQkFUQ09ORF8yVjg1CT0gMHgwMSwKKwlQQ0Y1MDYzM19NQkNDMl9WQkFUQ09ORF8zVjAJPSAweDAyLAorCVBDRjUwNjMzX01CQ0MyX1ZCQVRDT05EXzNWMTUJPSAweDAzLAorCVBDRjUwNjMzX01CQ0MyX1ZNQVhfNFYJCT0gMHgwMCwKKwlQQ0Y1MDYzM19NQkNDMl9WTUFYXzRWMjAJPSAweDI4LAorCVBDRjUwNjMzX01CQ0MyX1ZSRVNERUJUSU1FXzY0Uwk9IDB4ODAsCS8qIGRlYm91bmNlIHRpbWUgKDMyLzY0c2VjKSAqLworfTsKKworZW51bSBwY2Y1MDYzM19yZWdfbWJjYzcgeworCVBDRjUwNjMzX01CQ0M3X1VTQl8xMDBtQQk9IDB4MDAsCisJUENGNTA2MzNfTUJDQzdfVVNCXzUwMG1BCT0gMHgwMSwKKwlQQ0Y1MDYzM19NQkNDN19VU0JfMTAwMG1BCT0gMHgwMiwKKwlQQ0Y1MDYzM19NQkNDN19VU0JfU1VTUEVORAk9IDB4MDMsCisJUENGNTA2MzNfTUJDQzdfQkFUVEVNUF9FTgk9IDB4MDQsCisJUENGNTA2MzNfTUJDQzdfQkFUU1lTSU1BWF8xQTYJPSAweDAwLAorCVBDRjUwNjMzX01CQ0M3X0JBVFNZU0lNQVhfMUE4CT0gMHg0MCwKKwlQQ0Y1MDYzM19NQkNDN19CQVRTWVNJTUFYXzJBMAk9IDB4ODAsCisJUENGNTA2MzNfTUJDQzdfQkFUU1lTSU1BWF8yQTIJPSAweGMwLAorfTsKKyNkZWZpbmUgUENGNTA2MzNfTUJDQzdfVVNCX01BU0sgMHgwMworCitlbnVtIHBjZjUwNjMzX3JlZ19tYmNjOCB7CisJUENGNTA2MzNfTUJDQzhfVVNCRU5BU1VTCT0gMHgxMCwKK307CisKK2VudW0gcGNmNTA2MzNfcmVnX21iY3MxIHsKKwlQQ0Y1MDYzM19NQkNTMV9VU0JQUkVTCQk9IDB4MDEsCisJUENGNTA2MzNfTUJDUzFfVVNCT0sJCT0gMHgwMiwKKwlQQ0Y1MDYzM19NQkNTMV9BREFQVFBSRVMJPSAweDA0LAorCVBDRjUwNjMzX01CQ1MxX0FEQVBUT0sJCT0gMHgwOCwKKwlQQ0Y1MDYzM19NQkNTMV9UQkFUX09LCQk9IDB4MDAsCisJUENGNTA2MzNfTUJDUzFfVEJBVF9BQk9WRQk9IDB4MTAsCisJUENGNTA2MzNfTUJDUzFfVEJBVF9CRUxPVwk9IDB4MjAsCisJUENGNTA2MzNfTUJDUzFfVEJBVF9VTkRFRgk9IDB4MzAsCisJUENGNTA2MzNfTUJDUzFfUFJFV0RURVhQCT0gMHg0MCwKKwlQQ0Y1MDYzM19NQkNTMV9XRFRFWFAJCT0gMHg4MCwKK307CisKK2VudW0gcGNmNTA2MzNfcmVnX21iY3MyX21iY21vZCB7CisJUENGNTA2MzNfTUJDUzJfTUJDX1BMQVkJCT0gMHgwMCwKKwlQQ0Y1MDYzM19NQkNTMl9NQkNfVVNCX1BSRQk9IDB4MDEsCisJUENGNTA2MzNfTUJDUzJfTUJDX1VTQl9QUkVfV0FJVAk9IDB4MDIsCisJUENGNTA2MzNfTUJDUzJfTUJDX1VTQl9GQVNUCT0gMHgwMywKKwlQQ0Y1MDYzM19NQkNTMl9NQkNfVVNCX0ZBU1RfV0FJVCA9IDB4MDQsCisJUENGNTA2MzNfTUJDUzJfTUJDX1VTQl9TVVNQRU5ECT0gMHgwNSwKKwlQQ0Y1MDYzM19NQkNTMl9NQkNfQURQX1BSRQk9IDB4MDYsCisJUENGNTA2MzNfTUJDUzJfTUJDX0FEUF9QUkVfV0FJVAk9IDB4MDcsCisJUENGNTA2MzNfTUJDUzJfTUJDX0FEUF9GQVNUCT0gMHgwOCwKKwlQQ0Y1MDYzM19NQkNTMl9NQkNfQURQX0ZBU1RfV0FJVCA9IDB4MDksCisJUENGNTA2MzNfTUJDUzJfTUJDX0JBVF9GVUxMCT0gMHgwYSwKKwlQQ0Y1MDYzM19NQkNTMl9NQkNfSEFMVAkJPSAweDBiLAorfTsKKyNkZWZpbmUgUENGNTA2MzNfTUJDUzJfTUJDX01BU0sJCTB4MGYKK2VudW0gcGNmNTA2MzNfcmVnX21iY3MyX2NoZ3N0YXQgeworCVBDRjUwNjMzX01CQ1MyX0NIR1NfTk9ORQk9IDB4MDAsCisJUENGNTA2MzNfTUJDUzJfQ0hHU19BREFQVEVSCT0gMHgxMCwKKwlQQ0Y1MDYzM19NQkNTMl9DSEdTX1VTQgkJPSAweDIwLAorCVBDRjUwNjMzX01CQ1MyX0NIR1NfQk9USAk9IDB4MzAsCit9OworI2RlZmluZSBQQ0Y1MDYzM19NQkNTMl9SRVNTVEFUX0FVVE8JMHg0MAorCitlbnVtIHBjZjUwNjMzX3JlZ19tYmNzMyB7CisJUENGNTA2MzNfTUJDUzNfVVNCTElNX1BMQVkJPSAweDAxLAorCVBDRjUwNjMzX01CQ1MzX1VTQkxJTV9DR0gJPSAweDAyLAorCVBDRjUwNjMzX01CQ1MzX1RMSU1fUExBWQk9IDB4MDQsCisJUENGNTA2MzNfTUJDUzNfVExJTV9DSEcJCT0gMHgwOCwKKwlQQ0Y1MDYzM19NQkNTM19JTElNCQk9IDB4MTAsCS8qIDE6IEliYXQgPiBJY3V0b2ZmICovCisJUENGNTA2MzNfTUJDUzNfVkxJTQkJPSAweDIwLAkvKiAxOiBWYmF0ID09IFZtYXggKi8KKwlQQ0Y1MDYzM19NQkNTM19WQkFUU1RBVAkJPSAweDQwLAkvKiAxOiBWYmF0ID4gVmJhdGNvbmQgKi8KKwlQQ0Y1MDYzM19NQkNTM19WUkVTCQk9IDB4ODAsIC8qIDE6IFZiYXQgPiBWdGgoUkVTKSAqLworfTsKKworI2RlZmluZSBQQ0Y1MDYzM19NQkNDMl9WQkFUQ09ORF9NQVNLCSAgMHgwMworI2RlZmluZSBQQ0Y1MDYzM19NQkNDMl9WTUFYX01BU0sJICAweDNjCisKKy8qIENoYXJnZXIgc3RhdHVzICovCisjZGVmaW5lIFBDRjUwNjMzX01CQ19VU0JfT05MSU5FCQkweDAxCisjZGVmaW5lIFBDRjUwNjMzX01CQ19VU0JfQUNUSVZFCQkweDAyCisjZGVmaW5lIFBDRjUwNjMzX01CQ19BREFQVEVSX09OTElORQkweDA0CisjZGVmaW5lIFBDRjUwNjMzX01CQ19BREFQVEVSX0FDVElWRQkweDA4CisKK2ludCBwY2Y1MDYzM19tYmNfdXNiX2N1cmxpbV9zZXQoc3RydWN0IHBjZjUwNjMzICpwY2YsIGludCBtYSk7CisKK2ludCBwY2Y1MDYzM19tYmNfZ2V0X3N0YXR1cyhzdHJ1Y3QgcGNmNTA2MzMgKik7Cit2b2lkIHBjZjUwNjMzX21iY19zZXRfc3RhdHVzKHN0cnVjdCBwY2Y1MDYzMyAqLCBpbnQgd2hhdCwgaW50IHN0YXR1cyk7CisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21mZC9wY2Y1MDYzMy9wbWljLmggYi9pbmNsdWRlL2xpbnV4L21mZC9wY2Y1MDYzMy9wbWljLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQzZGJlNQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvbWZkL3BjZjUwNjMzL3BtaWMuaApAQCAtMCwwICsxLDY3IEBACisjaWZuZGVmIF9fTElOVVhfTUZEX1BDRjUwNjMzX1BNSUNfSAorI2RlZmluZSBfX0xJTlVYX01GRF9QQ0Y1MDYzM19QTUlDX0gKKworI2luY2x1ZGUgPGxpbnV4L21mZC9wY2Y1MDYzMy9jb3JlLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisKKyNkZWZpbmUgUENGNTA2MzNfUkVHX0FVVE9PVVQJMHgxYQorI2RlZmluZSBQQ0Y1MDYzM19SRUdfQVVUT0VOQQkweDFiCisjZGVmaW5lIFBDRjUwNjMzX1JFR19BVVRPQ1RMCTB4MWMKKyNkZWZpbmUgUENGNTA2MzNfUkVHX0FVVE9NWEMJMHgxZAorI2RlZmluZSBQQ0Y1MDYzM19SRUdfRE9XTjFPVVQJMHgxZQorI2RlZmluZSBQQ0Y1MDYzM19SRUdfRE9XTjFFTkEJMHgxZgorI2RlZmluZSBQQ0Y1MDYzM19SRUdfRE9XTjFDVEwJMHgyMAorI2RlZmluZSBQQ0Y1MDYzM19SRUdfRE9XTjFNWEMJMHgyMQorI2RlZmluZSBQQ0Y1MDYzM19SRUdfRE9XTjJPVVQJMHgyMgorI2RlZmluZSBQQ0Y1MDYzM19SRUdfRE9XTjJFTkEJMHgyMworI2RlZmluZSBQQ0Y1MDYzM19SRUdfRE9XTjJDVEwJMHgyNAorI2RlZmluZSBQQ0Y1MDYzM19SRUdfRE9XTjJNWEMJMHgyNQorI2RlZmluZSBQQ0Y1MDYzM19SRUdfTUVNTERPT1VUCTB4MjYKKyNkZWZpbmUgUENGNTA2MzNfUkVHX01FTUxET0VOQQkweDI3CisjZGVmaW5lIFBDRjUwNjMzX1JFR19MRE8xT1VUCTB4MmQKKyNkZWZpbmUgUENGNTA2MzNfUkVHX0xETzFFTkEJMHgyZQorI2RlZmluZSBQQ0Y1MDYzM19SRUdfTERPMk9VVAkweDJmCisjZGVmaW5lIFBDRjUwNjMzX1JFR19MRE8yRU5BCTB4MzAKKyNkZWZpbmUgUENGNTA2MzNfUkVHX0xETzNPVVQJMHgzMQorI2RlZmluZSBQQ0Y1MDYzM19SRUdfTERPM0VOQQkweDMyCisjZGVmaW5lIFBDRjUwNjMzX1JFR19MRE80T1VUCTB4MzMKKyNkZWZpbmUgUENGNTA2MzNfUkVHX0xETzRFTkEJMHgzNAorI2RlZmluZSBQQ0Y1MDYzM19SRUdfTERPNU9VVAkweDM1CisjZGVmaW5lIFBDRjUwNjMzX1JFR19MRE81RU5BCTB4MzYKKyNkZWZpbmUgUENGNTA2MzNfUkVHX0xETzZPVVQJMHgzNworI2RlZmluZSBQQ0Y1MDYzM19SRUdfTERPNkVOQQkweDM4CisjZGVmaW5lIFBDRjUwNjMzX1JFR19IQ0xET09VVAkweDM5CisjZGVmaW5lIFBDRjUwNjMzX1JFR19IQ0xET0VOQQkweDNhCisjZGVmaW5lIFBDRjUwNjMzX1JFR19IQ0xET09WTAkweDQwCisKK2VudW0gcGNmNTA2MzNfcmVndWxhdG9yX2VuYWJsZSB7CisJUENGNTA2MzNfUkVHVUxBVE9SX09OCQk9IDB4MDEsCisJUENGNTA2MzNfUkVHVUxBVE9SX09OX0dQSU8xCT0gMHgwMiwKKwlQQ0Y1MDYzM19SRUdVTEFUT1JfT05fR1BJTzIJPSAweDA0LAorCVBDRjUwNjMzX1JFR1VMQVRPUl9PTl9HUElPMwk9IDB4MDgsCit9OworI2RlZmluZSBQQ0Y1MDYzM19SRUdVTEFUT1JfT05fTUFTSwkweDBmCisKK2VudW0gcGNmNTA2MzNfcmVndWxhdG9yX3BoYXNlIHsKKwlQQ0Y1MDYzM19SRUdVTEFUT1JfQUNUUEgxCT0gMHgwMCwKKwlQQ0Y1MDYzM19SRUdVTEFUT1JfQUNUUEgyCT0gMHgxMCwKKwlQQ0Y1MDYzM19SRUdVTEFUT1JfQUNUUEgzCT0gMHgyMCwKKwlQQ0Y1MDYzM19SRUdVTEFUT1JfQUNUUEg0CT0gMHgzMCwKK307CisjZGVmaW5lIFBDRjUwNjMzX1JFR1VMQVRPUl9BQ1RQSF9NQVNLCTB4MzAKKworZW51bSBwY2Y1MDYzM19yZWd1bGF0b3JfaWQgeworCVBDRjUwNjMzX1JFR1VMQVRPUl9BVVRPLAorCVBDRjUwNjMzX1JFR1VMQVRPUl9ET1dOMSwKKwlQQ0Y1MDYzM19SRUdVTEFUT1JfRE9XTjIsCisJUENGNTA2MzNfUkVHVUxBVE9SX0xETzEsCisJUENGNTA2MzNfUkVHVUxBVE9SX0xETzIsCisJUENGNTA2MzNfUkVHVUxBVE9SX0xETzMsCisJUENGNTA2MzNfUkVHVUxBVE9SX0xETzQsCisJUENGNTA2MzNfUkVHVUxBVE9SX0xETzUsCisJUENGNTA2MzNfUkVHVUxBVE9SX0xETzYsCisJUENGNTA2MzNfUkVHVUxBVE9SX0hDTERPLAorCVBDRjUwNjMzX1JFR1VMQVRPUl9NRU1MRE8sCit9OworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWZkL3dtODM1MC9wbWljLmggYi9pbmNsdWRlL2xpbnV4L21mZC93bTgzNTAvcG1pYy5oCmluZGV4IDk2YWNiZmMuLmJlMzI2NGUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbWZkL3dtODM1MC9wbWljLmgKKysrIGIvaW5jbHVkZS9saW51eC9tZmQvd204MzUwL3BtaWMuaApAQCAtMTMsNiArMTMsMTAgQEAKICNpZm5kZWYgX19MSU5VWF9NRkRfV004MzUwX1BNSUNfSAogI2RlZmluZSBfX0xJTlVYX01GRF9XTTgzNTBfUE1JQ19ICiAKKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9sZWRzLmg+CisjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL21hY2hpbmUuaD4KKwogLyoKICAqIFJlZ2lzdGVyIHZhbHVlcy4KICAqLwpAQCAtNzAwLDYgKzcwNCwzMyBAQAogc3RydWN0IHBsYXRmb3JtX2RldmljZTsKIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhOwogCisvKgorICogV004MzUwIExFRCBwbGF0Zm9ybSBkYXRhCisgKi8KK3N0cnVjdCB3bTgzNTBfbGVkX3BsYXRmb3JtX2RhdGEgeworCWNvbnN0IGNoYXIgKm5hbWU7CisJY29uc3QgY2hhciAqZGVmYXVsdF90cmlnZ2VyOworCWludCBtYXhfdUE7Cit9OworCitzdHJ1Y3Qgd204MzUwX2xlZCB7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldjsKKwlzdHJ1Y3QgbXV0ZXggbXV0ZXg7CisJc3RydWN0IHdvcmtfc3RydWN0IHdvcms7CisJc3BpbmxvY2tfdCB2YWx1ZV9sb2NrOworCWVudW0gbGVkX2JyaWdodG5lc3MgdmFsdWU7CisJc3RydWN0IGxlZF9jbGFzc2RldiBjZGV2OworCWludCBtYXhfdUFfaW5kZXg7CisJaW50IGVuYWJsZWQ7CisKKwlzdHJ1Y3QgcmVndWxhdG9yICppc2luazsKKwlzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSBpc2lua19jb25zdW1lcjsKKwlzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSBpc2lua19pbml0OworCXN0cnVjdCByZWd1bGF0b3IgKmRjZGM7CisJc3RydWN0IHJlZ3VsYXRvcl9jb25zdW1lcl9zdXBwbHkgZGNkY19jb25zdW1lcjsKKwlzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSBkY2RjX2luaXQ7Cit9OworCiBzdHJ1Y3Qgd204MzUwX3BtaWMgewogCS8qIE51bWJlciBvZiByZWd1bGF0b3JzIG9mIGVhY2ggdHlwZSBvbiB0aGlzIGRldmljZSAqLwogCWludCBtYXhfZGNkYzsKQEAgLTcxNywxMCArNzQ4LDE1IEBACiAKIAkvKiByZWd1bGF0b3IgZGV2aWNlcyAqLwogCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXZbTlVNX1dNODM1MF9SRUdVTEFUT1JTXTsKKworCS8qIExFRCBkZXZpY2VzICovCisJc3RydWN0IHdtODM1MF9sZWQgbGVkWzJdOwogfTsKIAogaW50IHdtODM1MF9yZWdpc3Rlcl9yZWd1bGF0b3Ioc3RydWN0IHdtODM1MCAqd204MzUwLCBpbnQgcmVnLAogCQkJICAgICAgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgKmluaXRkYXRhKTsKK2ludCB3bTgzNTBfcmVnaXN0ZXJfbGVkKHN0cnVjdCB3bTgzNTAgKndtODM1MCwgaW50IGxlZG51bSwgaW50IGRjZGMsIGludCBpc2luaywKKwkJCXN0cnVjdCB3bTgzNTBfbGVkX3BsYXRmb3JtX2RhdGEgKnBkYXRhKTsKIAogLyoKICAqIEFkZGl0aW9uYWwgRENEQyBjb250cm9sIG5vdCBzdXBwb3J0ZWQgdmlhIHJlZ3VsYXRvciBBUEkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbW0uaCBiL2luY2x1ZGUvbGludXgvbW0uaAppbmRleCA0YTNkMjhjLi5lOGRkYzk4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21tLmgKKysrIGIvaW5jbHVkZS9saW51eC9tbS5oCkBAIC01NiwxOSArNTYsOSBAQAogCiBleHRlcm4gc3RydWN0IGttZW1fY2FjaGUgKnZtX2FyZWFfY2FjaGVwOwogCi0vKgotICogVGhpcyBzdHJ1Y3QgZGVmaW5lcyB0aGUgcGVyLW1tIGxpc3Qgb2YgVk1BcyBmb3IgdUNsaW51eC4gSWYgQ09ORklHX01NVSBpcwotICogZGlzYWJsZWQsIHRoZW4gdGhlcmUncyBhIHNpbmdsZSBzaGFyZWQgbGlzdCBvZiBWTUFzIG1haW50YWluZWQgYnkgdGhlCi0gKiBzeXN0ZW0sIGFuZCBtbSdzIHN1YnNjcmliZSB0byB0aGVzZSBpbmRpdmlkdWFsbHkKLSAqLwotc3RydWN0IHZtX2xpc3Rfc3RydWN0IHsKLQlzdHJ1Y3Qgdm1fbGlzdF9zdHJ1Y3QJKm5leHQ7Ci0Jc3RydWN0IHZtX2FyZWFfc3RydWN0CSp2bWE7Ci19OwotCiAjaWZuZGVmIENPTkZJR19NTVUKLWV4dGVybiBzdHJ1Y3QgcmJfcm9vdCBub21tdV92bWFfdHJlZTsKLWV4dGVybiBzdHJ1Y3Qgcndfc2VtYXBob3JlIG5vbW11X3ZtYV9zZW07CitleHRlcm4gc3RydWN0IHJiX3Jvb3Qgbm9tbXVfcmVnaW9uX3RyZWU7CitleHRlcm4gc3RydWN0IHJ3X3NlbWFwaG9yZSBub21tdV9yZWdpb25fc2VtOwogCiBleHRlcm4gdW5zaWduZWQgaW50IGtvYmpzaXplKGNvbnN0IHZvaWQgKm9ianApOwogI2VuZGlmCkBAIC0yNzAsNyArMjYwLDYgQEAKICAqLwogc3RhdGljIGlubGluZSBpbnQgZ2V0X3BhZ2VfdW5sZXNzX3plcm8oc3RydWN0IHBhZ2UgKnBhZ2UpCiB7Ci0JVk1fQlVHX09OKFBhZ2VUYWlsKHBhZ2UpKTsKIAlyZXR1cm4gYXRvbWljX2luY19ub3RfemVybygmcGFnZS0+X2NvdW50KTsKIH0KIApAQCAtMTA2MSw2ICsxMDUwLDcgQEAKIAkJCQl1bnNpZ25lZCBsb25nLCBlbnVtIG1lbW1hcF9jb250ZXh0KTsKIGV4dGVybiB2b2lkIHNldHVwX3Blcl96b25lX3BhZ2VzX21pbih2b2lkKTsKIGV4dGVybiB2b2lkIG1lbV9pbml0KHZvaWQpOworZXh0ZXJuIHZvaWQgX19pbml0IG1tYXBfaW5pdCh2b2lkKTsKIGV4dGVybiB2b2lkIHNob3dfbWVtKHZvaWQpOwogZXh0ZXJuIHZvaWQgc2lfbWVtaW5mbyhzdHJ1Y3Qgc3lzaW5mbyAqIHZhbCk7CiBleHRlcm4gdm9pZCBzaV9tZW1pbmZvX25vZGUoc3RydWN0IHN5c2luZm8gKnZhbCwgaW50IG5pZCk7CkBAIC0xMDcyLDYgKzEwNjIsOSBAQAogc3RhdGljIGlubGluZSB2b2lkIHNldHVwX3Blcl9jcHVfcGFnZXNldCh2b2lkKSB7fQogI2VuZGlmCiAKKy8qIG5vbW11LmMgKi8KK2V4dGVybiBhdG9taWNfdCBtbWFwX3BhZ2VzX2FsbG9jYXRlZDsKKwogLyogcHJpb190cmVlLmMgKi8KIHZvaWQgdm1hX3ByaW9fdHJlZV9hZGQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICosIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqb2xkKTsKIHZvaWQgdm1hX3ByaW9fdHJlZV9pbnNlcnQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICosIHN0cnVjdCBwcmlvX3RyZWVfcm9vdCAqKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbW1faW5saW5lLmggYi9pbmNsdWRlL2xpbnV4L21tX2lubGluZS5oCmluZGV4IGM5NDgzNTAuLjdmYmI5NzIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbW1faW5saW5lLmgKKysrIGIvaW5jbHVkZS9saW51eC9tbV9pbmxpbmUuaApAQCAtMjgsNiArMjgsNyBAQAogewogCWxpc3RfYWRkKCZwYWdlLT5scnUsICZ6b25lLT5scnVbbF0ubGlzdCk7CiAJX19pbmNfem9uZV9zdGF0ZSh6b25lLCBOUl9MUlVfQkFTRSArIGwpOworCW1lbV9jZ3JvdXBfYWRkX2xydV9saXN0KHBhZ2UsIGwpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQKQEAgLTM1LDYgKzM2LDcgQEAKIHsKIAlsaXN0X2RlbCgmcGFnZS0+bHJ1KTsKIAlfX2RlY196b25lX3N0YXRlKHpvbmUsIE5SX0xSVV9CQVNFICsgbCk7CisJbWVtX2Nncm91cF9kZWxfbHJ1X2xpc3QocGFnZSwgbCk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZApAQCAtNTQsNiArNTYsNyBAQAogCQlsICs9IHBhZ2VfaXNfZmlsZV9jYWNoZShwYWdlKTsKIAl9CiAJX19kZWNfem9uZV9zdGF0ZSh6b25lLCBOUl9MUlVfQkFTRSArIGwpOworCW1lbV9jZ3JvdXBfZGVsX2xydV9saXN0KHBhZ2UsIGwpOwogfQogCiAvKioKQEAgLTc4LDIzICs4MSw0IEBACiAJcmV0dXJuIGxydTsKIH0KIAotLyoqCi0gKiBpbmFjdGl2ZV9hbm9uX2lzX2xvdyAtIGNoZWNrIGlmIGFub255bW91cyBwYWdlcyBuZWVkIHRvIGJlIGRlYWN0aXZhdGVkCi0gKiBAem9uZTogem9uZSB0byBjaGVjawotICoKLSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgem9uZSBkb2VzIG5vdCBoYXZlIGVub3VnaCBpbmFjdGl2ZSBhbm9uIHBhZ2VzLAotICogbWVhbmluZyBzb21lIGFjdGl2ZSBhbm9uIHBhZ2VzIG5lZWQgdG8gYmUgZGVhY3RpdmF0ZWQuCi0gKi8KLXN0YXRpYyBpbmxpbmUgaW50IGluYWN0aXZlX2Fub25faXNfbG93KHN0cnVjdCB6b25lICp6b25lKQotewotCXVuc2lnbmVkIGxvbmcgYWN0aXZlLCBpbmFjdGl2ZTsKLQotCWFjdGl2ZSA9IHpvbmVfcGFnZV9zdGF0ZSh6b25lLCBOUl9BQ1RJVkVfQU5PTik7Ci0JaW5hY3RpdmUgPSB6b25lX3BhZ2Vfc3RhdGUoem9uZSwgTlJfSU5BQ1RJVkVfQU5PTik7Ci0KLQlpZiAoaW5hY3RpdmUgKiB6b25lLT5pbmFjdGl2ZV9yYXRpbyA8IGFjdGl2ZSkKLQkJcmV0dXJuIDE7Ci0KLQlyZXR1cm4gMDsKLX0KICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tbV90eXBlcy5oIGIvaW5jbHVkZS9saW51eC9tbV90eXBlcy5oCmluZGV4IDljZmM5YjYuLjkyOTE1ZTggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbW1fdHlwZXMuaAorKysgYi9pbmNsdWRlL2xpbnV4L21tX3R5cGVzLmgKQEAgLTk3LDYgKzk3LDIzIEBACiB9OwogCiAvKgorICogQSByZWdpb24gY29udGFpbmluZyBhIG1hcHBpbmcgb2YgYSBub24tbWVtb3J5IGJhY2tlZCBmaWxlIHVuZGVyIE5PTU1VCisgKiBjb25kaXRpb25zLiAgVGhlc2UgYXJlIGhlbGQgaW4gYSBnbG9iYWwgdHJlZSBhbmQgYXJlIHBpbm5lZCBieSB0aGUgVk1BcyB0aGF0CisgKiBtYXAgcGFydHMgb2YgdGhlbS4KKyAqLworc3RydWN0IHZtX3JlZ2lvbiB7CisJc3RydWN0IHJiX25vZGUJdm1fcmI7CQkvKiBsaW5rIGluIGdsb2JhbCByZWdpb24gdHJlZSAqLworCXVuc2lnbmVkIGxvbmcJdm1fZmxhZ3M7CS8qIFZNQSB2bV9mbGFncyAqLworCXVuc2lnbmVkIGxvbmcJdm1fc3RhcnQ7CS8qIHN0YXJ0IGFkZHJlc3Mgb2YgcmVnaW9uICovCisJdW5zaWduZWQgbG9uZwl2bV9lbmQ7CQkvKiByZWdpb24gaW5pdGlhbGlzZWQgdG8gaGVyZSAqLworCXVuc2lnbmVkIGxvbmcJdm1fdG9wOwkJLyogcmVnaW9uIGFsbG9jYXRlZCB0byBoZXJlICovCisJdW5zaWduZWQgbG9uZwl2bV9wZ29mZjsJLyogdGhlIG9mZnNldCBpbiB2bV9maWxlIGNvcnJlc3BvbmRpbmcgdG8gdm1fc3RhcnQgKi8KKwlzdHJ1Y3QgZmlsZQkqdm1fZmlsZTsJLyogdGhlIGJhY2tpbmcgZmlsZSBvciBOVUxMICovCisKKwlhdG9taWNfdAl2bV91c2FnZTsJLyogcmVnaW9uIHVzYWdlIGNvdW50ICovCit9OworCisvKgogICogVGhpcyBzdHJ1Y3QgZGVmaW5lcyBhIG1lbW9yeSBWTU0gbWVtb3J5IGFyZWEuIFRoZXJlIGlzIG9uZSBvZiB0aGVzZQogICogcGVyIFZNLWFyZWEvdGFzay4gIEEgVk0gYXJlYSBpcyBhbnkgcGFydCBvZiB0aGUgcHJvY2VzcyB2aXJ0dWFsIG1lbW9yeQogICogc3BhY2UgdGhhdCBoYXMgYSBzcGVjaWFsIHJ1bGUgZm9yIHRoZSBwYWdlLWZhdWx0IGhhbmRsZXJzIChpZSBhIHNoYXJlZApAQCAtMTUyLDcgKzE2OSw3IEBACiAJdW5zaWduZWQgbG9uZyB2bV90cnVuY2F0ZV9jb3VudDsvKiB0cnVuY2F0ZV9jb3VudCBvciByZXN0YXJ0X2FkZHIgKi8KIAogI2lmbmRlZiBDT05GSUdfTU1VCi0JYXRvbWljX3Qgdm1fdXNhZ2U7CQkvKiByZWZjb3VudCAoVk1BcyBzaGFyZWQgaWYgIU1NVSkgKi8KKwlzdHJ1Y3Qgdm1fcmVnaW9uICp2bV9yZWdpb247CS8qIE5PTU1VIG1hcHBpbmcgcmVnaW9uICovCiAjZW5kaWYKICNpZmRlZiBDT05GSUdfTlVNQQogCXN0cnVjdCBtZW1wb2xpY3kgKnZtX3BvbGljeTsJLyogTlVNQSBwb2xpY3kgZm9yIHRoZSBWTUEgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbW16b25lLmggYi9pbmNsdWRlL2xpbnV4L21tem9uZS5oCmluZGV4IDM1YTdiNWUuLjA5YzE0ZTIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbW16b25lLmgKKysrIGIvaW5jbHVkZS9saW51eC9tbXpvbmUuaApAQCAtMjYzLDYgKzI2MywxOSBAQAogI2Vycm9yIFpPTkVTX1NISUZUIC0tIHRvbyBtYW55IHpvbmVzIGNvbmZpZ3VyZWQgYWRqdXN0IGNhbGN1bGF0aW9uCiAjZW5kaWYKIAorc3RydWN0IHpvbmVfcmVjbGFpbV9zdGF0IHsKKwkvKgorCSAqIFRoZSBwYWdlb3V0IGNvZGUgaW4gdm1zY2FuLmMga2VlcHMgdHJhY2sgb2YgaG93IG1hbnkgb2YgdGhlCisJICogbWVtL3N3YXAgYmFja2VkIGFuZCBmaWxlIGJhY2tlZCBwYWdlcyBhcmUgcmVmZWZlcmVuY2VkLgorCSAqIFRoZSBoaWdoZXIgdGhlIHJvdGF0ZWQvc2Nhbm5lZCByYXRpbywgdGhlIG1vcmUgdmFsdWFibGUKKwkgKiB0aGF0IGNhY2hlIGlzLgorCSAqCisJICogVGhlIGFub24gTFJVIHN0YXRzIGxpdmUgaW4gWzBdLCBmaWxlIExSVSBzdGF0cyBpbiBbMV0KKwkgKi8KKwl1bnNpZ25lZCBsb25nCQlyZWNlbnRfcm90YXRlZFsyXTsKKwl1bnNpZ25lZCBsb25nCQlyZWNlbnRfc2Nhbm5lZFsyXTsKK307CisKIHN0cnVjdCB6b25lIHsKIAkvKiBGaWVsZHMgY29tbW9ubHkgYWNjZXNzZWQgYnkgdGhlIHBhZ2UgYWxsb2NhdG9yICovCiAJdW5zaWduZWQgbG9uZwkJcGFnZXNfbWluLCBwYWdlc19sb3csIHBhZ2VzX2hpZ2g7CkBAIC0zMTUsMTYgKzMyOCw3IEBACiAJCXVuc2lnbmVkIGxvbmcgbnJfc2NhbjsKIAl9IGxydVtOUl9MUlVfTElTVFNdOwogCi0JLyoKLQkgKiBUaGUgcGFnZW91dCBjb2RlIGluIHZtc2Nhbi5jIGtlZXBzIHRyYWNrIG9mIGhvdyBtYW55IG9mIHRoZQotCSAqIG1lbS9zd2FwIGJhY2tlZCBhbmQgZmlsZSBiYWNrZWQgcGFnZXMgYXJlIHJlZmVmZXJlbmNlZC4KLQkgKiBUaGUgaGlnaGVyIHRoZSByb3RhdGVkL3NjYW5uZWQgcmF0aW8sIHRoZSBtb3JlIHZhbHVhYmxlCi0JICogdGhhdCBjYWNoZSBpcy4KLQkgKgotCSAqIFRoZSBhbm9uIExSVSBzdGF0cyBsaXZlIGluIFswXSwgZmlsZSBMUlUgc3RhdHMgaW4gWzFdCi0JICovCi0JdW5zaWduZWQgbG9uZwkJcmVjZW50X3JvdGF0ZWRbMl07Ci0JdW5zaWduZWQgbG9uZwkJcmVjZW50X3NjYW5uZWRbMl07CisJc3RydWN0IHpvbmVfcmVjbGFpbV9zdGF0IHJlY2xhaW1fc3RhdDsKIAogCXVuc2lnbmVkIGxvbmcJCXBhZ2VzX3NjYW5uZWQ7CSAgIC8qIHNpbmNlIGxhc3QgcmVjbGFpbSAqLwogCXVuc2lnbmVkIGxvbmcJCWZsYWdzOwkJICAgLyogem9uZSBmbGFncywgc2VlIGJlbG93ICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L210ZC9jZmkuaCBiL2luY2x1ZGUvbGludXgvbXRkL2NmaS5oCmluZGV4IDAwZTJiNTcuLjg4ZDNkOGYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbXRkL2NmaS5oCisrKyBiL2luY2x1ZGUvbGludXgvbXRkL2NmaS5oCkBAIC01MjAsNiArNTIwLDcgQEAKIAogI2RlZmluZSBDRklfTUZSX0FNRCAweDAwMDEKICNkZWZpbmUgQ0ZJX01GUl9BVE1FTCAweDAwMUYKKyNkZWZpbmUgQ0ZJX01GUl9TQU1TVU5HIDB4MDBFQwogI2RlZmluZSBDRklfTUZSX1NUICAweDAwMjAgCS8qIFNUTWljcm9lbGVjdHJvbmljcyAqLwogCiB2b2lkIGNmaV9maXh1cChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgc3RydWN0IGNmaV9maXh1cCogZml4dXBzKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbXRkL2Z0bC5oIGIvaW5jbHVkZS9saW51eC9tdGQvZnRsLmgKaW5kZXggMGJlNDQyZi4uMDU1NWY3YSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tdGQvZnRsLmgKKysrIGIvaW5jbHVkZS9saW51eC9tdGQvZnRsLmgKQEAgLTMyLDI1ICszMiwyNSBAQAogI2RlZmluZSBfTElOVVhfRlRMX0gKIAogdHlwZWRlZiBzdHJ1Y3QgZXJhc2VfdW5pdF9oZWFkZXJfdCB7Ci0gICAgdV9pbnQ4X3QJTGlua1RhcmdldFR1cGxlWzVdOwotICAgIHVfaW50OF90CURhdGFPcmdUdXBsZVsxMF07Ci0gICAgdV9pbnQ4X3QJTnVtVHJhbnNmZXJVbml0czsKLSAgICB1X2ludDMyX3QJRXJhc2VDb3VudDsKLSAgICB1X2ludDE2X3QJTG9naWNhbEVVTjsKLSAgICB1X2ludDhfdAlCbG9ja1NpemU7Ci0gICAgdV9pbnQ4X3QJRXJhc2VVbml0U2l6ZTsKLSAgICB1X2ludDE2X3QJRmlyc3RQaHlzaWNhbEVVTjsKLSAgICB1X2ludDE2X3QJTnVtRXJhc2VVbml0czsKLSAgICB1X2ludDMyX3QJRm9ybWF0dGVkU2l6ZTsKLSAgICB1X2ludDMyX3QJRmlyc3RWTUFkZHJlc3M7Ci0gICAgdV9pbnQxNl90CU51bVZNUGFnZXM7Ci0gICAgdV9pbnQ4X3QJRmxhZ3M7Ci0gICAgdV9pbnQ4X3QJQ29kZTsKLSAgICB1X2ludDMyX3QJU2VyaWFsTnVtYmVyOwotICAgIHVfaW50MzJfdAlBbHRFVUhPZmZzZXQ7Ci0gICAgdV9pbnQzMl90CUJBTU9mZnNldDsKLSAgICB1X2ludDhfdAlSZXNlcnZlZFsxMl07Ci0gICAgdV9pbnQ4X3QJRW5kVHVwbGVbMl07CisgICAgdWludDhfdAlMaW5rVGFyZ2V0VHVwbGVbNV07CisgICAgdWludDhfdAlEYXRhT3JnVHVwbGVbMTBdOworICAgIHVpbnQ4X3QJTnVtVHJhbnNmZXJVbml0czsKKyAgICB1aW50MzJfdAlFcmFzZUNvdW50OworICAgIHVpbnQxNl90CUxvZ2ljYWxFVU47CisgICAgdWludDhfdAlCbG9ja1NpemU7CisgICAgdWludDhfdAlFcmFzZVVuaXRTaXplOworICAgIHVpbnQxNl90CUZpcnN0UGh5c2ljYWxFVU47CisgICAgdWludDE2X3QJTnVtRXJhc2VVbml0czsKKyAgICB1aW50MzJfdAlGb3JtYXR0ZWRTaXplOworICAgIHVpbnQzMl90CUZpcnN0Vk1BZGRyZXNzOworICAgIHVpbnQxNl90CU51bVZNUGFnZXM7CisgICAgdWludDhfdAlGbGFnczsKKyAgICB1aW50OF90CUNvZGU7CisgICAgdWludDMyX3QJU2VyaWFsTnVtYmVyOworICAgIHVpbnQzMl90CUFsdEVVSE9mZnNldDsKKyAgICB1aW50MzJfdAlCQU1PZmZzZXQ7CisgICAgdWludDhfdAlSZXNlcnZlZFsxMl07CisgICAgdWludDhfdAlFbmRUdXBsZVsyXTsKIH0gZXJhc2VfdW5pdF9oZWFkZXJfdDsKIAogLyogRmxhZ3MgaW4gZXJhc2VfdW5pdF9oZWFkZXJfdCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tdGQvbWFwLmggYi9pbmNsdWRlL2xpbnV4L210ZC9tYXAuaAppbmRleCBhYTMwMjQ0Li5iOTgxYjg3NyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tdGQvbWFwLmgKKysrIGIvaW5jbHVkZS9saW51eC9tdGQvbWFwLmgKQEAgLTIyMyw2ICsyMjMsNyBAQAogCSAgIG11c3QgbGVhdmUgaXQgZW5hYmxlZC4gKi8KIAl2b2lkICgqc2V0X3ZwcCkoc3RydWN0IG1hcF9pbmZvICosIGludCk7CiAKKwl1bnNpZ25lZCBsb25nIHBmb3dfYmFzZTsKIAl1bnNpZ25lZCBsb25nIG1hcF9wcml2XzE7CiAJdW5zaWduZWQgbG9uZyBtYXBfcHJpdl8yOwogCXZvaWQgKmZsZHJ2X3ByaXY7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L210ZC9tdGQuaCBiL2luY2x1ZGUvbGludXgvbXRkL210ZC5oCmluZGV4IGVhZTI2YmIuLjNhYTVkNzcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbXRkL210ZC5oCisrKyBiL2luY2x1ZGUvbGludXgvbXRkL210ZC5oCkBAIC0xNSw2ICsxNSw4IEBACiAjaW5jbHVkZSA8bGludXgvbXRkL2NvbXBhdG1hYy5oPgogI2luY2x1ZGUgPG10ZC9tdGQtYWJpLmg+CiAKKyNpbmNsdWRlIDxhc20vZGl2NjQuaD4KKwogI2RlZmluZSBNVERfQ0hBUl9NQUpPUiA5MAogI2RlZmluZSBNVERfQkxPQ0tfTUFKT1IgMzEKICNkZWZpbmUgTUFYX01URF9ERVZJQ0VTIDMyCkBAIC0yNSwyMCArMjcsMjAgQEAKICNkZWZpbmUgTVREX0VSQVNFX0RPTkUgICAgICAgICAgMHgwOAogI2RlZmluZSBNVERfRVJBU0VfRkFJTEVEICAgICAgICAweDEwCiAKLSNkZWZpbmUgTVREX0ZBSUxfQUREUl9VTktOT1dOIDB4ZmZmZmZmZmYKKyNkZWZpbmUgTVREX0ZBSUxfQUREUl9VTktOT1dOIC0xTEwKIAogLyogSWYgdGhlIGVyYXNlIGZhaWxzLCBmYWlsX2FkZHIgbWlnaHQgaW5kaWNhdGUgZXhhY3RseSB3aGljaCBibG9jayBmYWlsZWQuICBJZgogICAgZmFpbF9hZGRyID0gTVREX0ZBSUxfQUREUl9VTktOT1dOLCB0aGUgZmFpbHVyZSB3YXMgbm90IGF0IHRoZSBkZXZpY2UgbGV2ZWwgb3Igd2FzIG5vdAogICAgc3BlY2lmaWMgdG8gYW55IHBhcnRpY3VsYXIgYmxvY2suICovCiBzdHJ1Y3QgZXJhc2VfaW5mbyB7CiAJc3RydWN0IG10ZF9pbmZvICptdGQ7Ci0JdV9pbnQzMl90IGFkZHI7Ci0JdV9pbnQzMl90IGxlbjsKLQl1X2ludDMyX3QgZmFpbF9hZGRyOworCXVpbnQ2NF90IGFkZHI7CisJdWludDY0X3QgbGVuOworCXVpbnQ2NF90IGZhaWxfYWRkcjsKIAl1X2xvbmcgdGltZTsKIAl1X2xvbmcgcmV0cmllczsKLQl1X2ludCBkZXY7Ci0JdV9pbnQgY2VsbDsKKwl1bnNpZ25lZCBkZXY7CisJdW5zaWduZWQgY2VsbDsKIAl2b2lkICgqY2FsbGJhY2spIChzdHJ1Y3QgZXJhc2VfaW5mbyAqc2VsZik7CiAJdV9sb25nIHByaXY7CiAJdV9jaGFyIHN0YXRlOwpAQCAtNDYsOSArNDgsOSBAQAogfTsKIAogc3RydWN0IG10ZF9lcmFzZV9yZWdpb25faW5mbyB7Ci0JdV9pbnQzMl90IG9mZnNldDsJCQkvKiBBdCB3aGljaCB0aGlzIHJlZ2lvbiBzdGFydHMsIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgTVREICovCi0JdV9pbnQzMl90IGVyYXNlc2l6ZTsJCS8qIEZvciB0aGlzIHJlZ2lvbiAqLwotCXVfaW50MzJfdCBudW1ibG9ja3M7CQkvKiBOdW1iZXIgb2YgYmxvY2tzIG9mIGVyYXNlc2l6ZSBpbiB0aGlzIHJlZ2lvbiAqLworCXVpbnQ2NF90IG9mZnNldDsJCQkvKiBBdCB3aGljaCB0aGlzIHJlZ2lvbiBzdGFydHMsIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgTVREICovCisJdWludDMyX3QgZXJhc2VzaXplOwkJLyogRm9yIHRoaXMgcmVnaW9uICovCisJdWludDMyX3QgbnVtYmxvY2tzOwkJLyogTnVtYmVyIG9mIGJsb2NrcyBvZiBlcmFzZXNpemUgaW4gdGhpcyByZWdpb24gKi8KIAl1bnNpZ25lZCBsb25nICpsb2NrbWFwOwkJLyogSWYga2VlcGluZyBiaXRtYXAgb2YgbG9ja3MgKi8KIH07CiAKQEAgLTgzLDcgKzg1LDcgQEAKICAqIEBkYXRidWY6CWRhdGEgYnVmZmVyIC0gaWYgTlVMTCBvbmx5IG9vYiBkYXRhIGFyZSByZWFkL3dyaXR0ZW4KICAqIEBvb2JidWY6CW9vYiBkYXRhIGJ1ZmZlcgogICoKLSAqIE5vdGUsIGl0IGlzIGFsbG93ZWQgdG8gcmVhZCBtb3JlIHRoZW4gb25lIE9PQiBhcmVhIGF0IG9uZSBnbywgYnV0IG5vdCB3cml0ZS4KKyAqIE5vdGUsIGl0IGlzIGFsbG93ZWQgdG8gcmVhZCBtb3JlIHRoYW4gb25lIE9PQiBhcmVhIGF0IG9uZSBnbywgYnV0IG5vdCB3cml0ZS4KICAqIFRoZSBpbnRlcmZhY2UgYXNzdW1lcyB0aGF0IHRoZSBPT0Igd3JpdGUgcmVxdWVzdHMgcHJvZ3JhbSBvbmx5IG9uZSBwYWdlJ3MKICAqIE9PQiBhcmVhLgogICovCkBAIC0xMDAsMTQgKzEwMiwxNCBAQAogCiBzdHJ1Y3QgbXRkX2luZm8gewogCXVfY2hhciB0eXBlOwotCXVfaW50MzJfdCBmbGFnczsKLQl1X2ludDMyX3Qgc2l6ZTsJIC8vIFRvdGFsIHNpemUgb2YgdGhlIE1URAorCXVpbnQzMl90IGZsYWdzOworCXVpbnQ2NF90IHNpemU7CSAvLyBUb3RhbCBzaXplIG9mIHRoZSBNVEQKIAogCS8qICJNYWpvciIgZXJhc2Ugc2l6ZSBmb3IgdGhlIGRldmljZS4gTmHDr3ZlIHVzZXJzIG1heSB0YWtlIHRoaXMKIAkgKiB0byBiZSB0aGUgb25seSBlcmFzZSBzaXplIGF2YWlsYWJsZSwgb3IgbWF5IHVzZSB0aGUgbW9yZSBkZXRhaWxlZAogCSAqIGluZm9ybWF0aW9uIGJlbG93IGlmIHRoZXkgZGVzaXJlCiAJICovCi0JdV9pbnQzMl90IGVyYXNlc2l6ZTsKKwl1aW50MzJfdCBlcmFzZXNpemU7CiAJLyogTWluaW1hbCB3cml0YWJsZSBmbGFzaCB1bml0IHNpemUuIEluIGNhc2Ugb2YgTk9SIGZsYXNoIGl0IGlzIDEgKGV2ZW4KIAkgKiB0aG91Z2ggaW5kaXZpZHVhbCBiaXRzIGNhbiBiZSBjbGVhcmVkKSwgaW4gY2FzZSBvZiBOQU5EIGZsYXNoIGl0IGlzCiAJICogb25lIE5BTkQgcGFnZSAob3IgaGFsZiwgb3Igb25lLWZvdXJ0aHMgb2YgaXQpLCBpbiBjYXNlIG9mIEVDQy1lZCBOT1IKQEAgLTExNSwxMCArMTE3LDIwIEBACiAJICogQW55IGRyaXZlciByZWdpc3RlcmluZyBhIHN0cnVjdCBtdGRfaW5mbyBtdXN0IGVuc3VyZSBhIHdyaXRlc2l6ZSBvZgogCSAqIDEgb3IgbGFyZ2VyLgogCSAqLwotCXVfaW50MzJfdCB3cml0ZXNpemU7CisJdWludDMyX3Qgd3JpdGVzaXplOwogCi0JdV9pbnQzMl90IG9vYnNpemU7ICAgLy8gQW1vdW50IG9mIE9PQiBkYXRhIHBlciBibG9jayAoZS5nLiAxNikKLQl1X2ludDMyX3Qgb29iYXZhaWw7ICAvLyBBdmFpbGFibGUgT09CIGJ5dGVzIHBlciBibG9jaworCXVpbnQzMl90IG9vYnNpemU7ICAgLy8gQW1vdW50IG9mIE9PQiBkYXRhIHBlciBibG9jayAoZS5nLiAxNikKKwl1aW50MzJfdCBvb2JhdmFpbDsgIC8vIEF2YWlsYWJsZSBPT0IgYnl0ZXMgcGVyIGJsb2NrCisKKwkvKgorCSAqIElmIGVyYXNlc2l6ZSBpcyBhIHBvd2VyIG9mIDIgdGhlbiB0aGUgc2hpZnQgaXMgc3RvcmVkIGluCisJICogZXJhc2VzaXplX3NoaWZ0IG90aGVyd2lzZSBlcmFzZXNpemVfc2hpZnQgaXMgemVyby4gRGl0dG8gd3JpdGVzaXplLgorCSAqLworCXVuc2lnbmVkIGludCBlcmFzZXNpemVfc2hpZnQ7CisJdW5zaWduZWQgaW50IHdyaXRlc2l6ZV9zaGlmdDsKKwkvKiBNYXNrcyBiYXNlZCBvbiBlcmFzZXNpemVfc2hpZnQgYW5kIHdyaXRlc2l6ZV9zaGlmdCAqLworCXVuc2lnbmVkIGludCBlcmFzZXNpemVfbWFzazsKKwl1bnNpZ25lZCBpbnQgd3JpdGVzaXplX21hc2s7CiAKIAkvLyBLZXJuZWwtb25seSBzdHVmZiBzdGFydHMgaGVyZS4KIAljb25zdCBjaGFyICpuYW1lOwpAQCAtMTkwLDggKzIwMiw4IEBACiAJdm9pZCAoKnN5bmMpIChzdHJ1Y3QgbXRkX2luZm8gKm10ZCk7CiAKIAkvKiBDaGlwLXN1cHBvcnRlZCBkZXZpY2UgbG9ja2luZyAqLwotCWludCAoKmxvY2spIChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgbG9mZl90IG9mcywgc2l6ZV90IGxlbik7Ci0JaW50ICgqdW5sb2NrKSAoc3RydWN0IG10ZF9pbmZvICptdGQsIGxvZmZfdCBvZnMsIHNpemVfdCBsZW4pOworCWludCAoKmxvY2spIChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgbG9mZl90IG9mcywgdWludDY0X3QgbGVuKTsKKwlpbnQgKCp1bmxvY2spIChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgbG9mZl90IG9mcywgdWludDY0X3QgbGVuKTsKIAogCS8qIFBvd2VyIE1hbmFnZW1lbnQgZnVuY3Rpb25zICovCiAJaW50ICgqc3VzcGVuZCkgKHN0cnVjdCBtdGRfaW5mbyAqbXRkKTsKQEAgLTIyMSw2ICsyMzMsMzUgQEAKIAl2b2lkICgqcHV0X2RldmljZSkgKHN0cnVjdCBtdGRfaW5mbyAqbXRkKTsKIH07CiAKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgbXRkX2Rpdl9ieV9lYih1aW50NjRfdCBzeiwgc3RydWN0IG10ZF9pbmZvICptdGQpCit7CisJaWYgKG10ZC0+ZXJhc2VzaXplX3NoaWZ0KQorCQlyZXR1cm4gc3ogPj4gbXRkLT5lcmFzZXNpemVfc2hpZnQ7CisJZG9fZGl2KHN6LCBtdGQtPmVyYXNlc2l6ZSk7CisJcmV0dXJuIHN6OworfQorCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IG10ZF9tb2RfYnlfZWIodWludDY0X3Qgc3osIHN0cnVjdCBtdGRfaW5mbyAqbXRkKQoreworCWlmIChtdGQtPmVyYXNlc2l6ZV9zaGlmdCkKKwkJcmV0dXJuIHN6ICYgbXRkLT5lcmFzZXNpemVfbWFzazsKKwlyZXR1cm4gZG9fZGl2KHN6LCBtdGQtPmVyYXNlc2l6ZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgbXRkX2Rpdl9ieV93cyh1aW50NjRfdCBzeiwgc3RydWN0IG10ZF9pbmZvICptdGQpCit7CisJaWYgKG10ZC0+d3JpdGVzaXplX3NoaWZ0KQorCQlyZXR1cm4gc3ogPj4gbXRkLT53cml0ZXNpemVfc2hpZnQ7CisJZG9fZGl2KHN6LCBtdGQtPndyaXRlc2l6ZSk7CisJcmV0dXJuIHN6OworfQorCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IG10ZF9tb2RfYnlfd3ModWludDY0X3Qgc3osIHN0cnVjdCBtdGRfaW5mbyAqbXRkKQoreworCWlmIChtdGQtPndyaXRlc2l6ZV9zaGlmdCkKKwkJcmV0dXJuIHN6ICYgbXRkLT53cml0ZXNpemVfbWFzazsKKwlyZXR1cm4gZG9fZGl2KHN6LCBtdGQtPndyaXRlc2l6ZSk7Cit9CiAKIAkvKiBLZXJuZWwtc2lkZSBpb2N0bCBkZWZpbml0aW9ucyAqLwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L210ZC9uYW5kLmggYi9pbmNsdWRlL2xpbnV4L210ZC9uYW5kLmgKaW5kZXggNzMzZDNmMy4uZGI1YjYzZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tdGQvbmFuZC5oCisrKyBiL2luY2x1ZGUvbGludXgvbXRkL25hbmQuaApAQCAtMzM1LDE3ICszMzUsMTIgQEAKICAqIEBlcmFzZV9jbWQ6CQlbSU5URVJOXSBlcmFzZSBjb21tYW5kIHdyaXRlIGZ1bmN0aW9uLCBzZWxlY3RhYmxlIGR1ZSB0byBBTkQgc3VwcG9ydAogICogQHNjYW5fYmJ0OgkJW1JFUExBQ0VBQkxFXSBmdW5jdGlvbiB0byBzY2FuIGJhZCBibG9jayB0YWJsZQogICogQGNoaXBfZGVsYXk6CQlbQk9BUkRTUEVDSUZJQ10gY2hpcCBkZXBlbmRlbnQgZGVsYXkgZm9yIHRyYW5zZmVyaW5nIGRhdGEgZnJvbSBhcnJheSB0byByZWFkIHJlZ3MgKHRSKQotICogQHdxOgkJCVtJTlRFUk5dIHdhaXQgcXVldWUgdG8gc2xlZXAgb24gaWYgYSBOQU5EIG9wZXJhdGlvbiBpcyBpbiBwcm9ncmVzcwogICogQHN0YXRlOgkJW0lOVEVSTl0gdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIE5BTkQgZGV2aWNlCiAgKiBAb29iX3BvaToJCXBvaXNvbiB2YWx1ZSBidWZmZXIKICAqIEBwYWdlX3NoaWZ0OgkJW0lOVEVSTl0gbnVtYmVyIG9mIGFkZHJlc3MgYml0cyBpbiBhIHBhZ2UgKGNvbHVtbiBhZGRyZXNzIGJpdHMpCiAgKiBAcGh5c19lcmFzZV9zaGlmdDoJW0lOVEVSTl0gbnVtYmVyIG9mIGFkZHJlc3MgYml0cyBpbiBhIHBoeXNpY2FsIGVyYXNlYmxvY2sKICAqIEBiYnRfZXJhc2Vfc2hpZnQ6CVtJTlRFUk5dIG51bWJlciBvZiBhZGRyZXNzIGJpdHMgaW4gYSBiYnQgZW50cnkKICAqIEBjaGlwX3NoaWZ0OgkJW0lOVEVSTl0gbnVtYmVyIG9mIGFkZHJlc3MgYml0cyBpbiBvbmUgY2hpcAotICogQGRhdGJ1ZjoJCVtJTlRFUk5dIGludGVybmFsIGJ1ZmZlciBmb3Igb25lIHBhZ2UgKyBvb2IKLSAqIEBvb2JidWY6CQlbSU5URVJOXSBvb2IgYnVmZmVyIGZvciBvbmUgZXJhc2VibG9jawotICogQG9vYmRpcnR5OgkJW0lOVEVSTl0gaW5kaWNhdGVzIHRoYXQgb29iX2J1ZiBtdXN0IGJlIHJlaW5pdGlhbGl6ZWQKLSAqIEBkYXRhX3BvaToJCVtJTlRFUk5dIHBvaW50ZXIgdG8gYSBkYXRhIGJ1ZmZlcgogICogQG9wdGlvbnM6CQlbQk9BUkRTUEVDSUZJQ10gdmFyaW91cyBjaGlwIG9wdGlvbnMuIFRoZXkgY2FuIHBhcnRseSBiZSBzZXQgdG8gaW5mb3JtIG5hbmRfc2NhbiBhYm91dAogICoJCQlzcGVjaWFsIGZ1bmN0aW9uYWxpdHkuIFNlZSB0aGUgZGVmaW5lcyBmb3IgZnVydGhlciBleHBsYW5hdGlvbgogICogQGJhZGJsb2NrcG9zOglbSU5URVJOXSBwb3NpdGlvbiBvZiB0aGUgYmFkIGJsb2NrIG1hcmtlciBpbiB0aGUgb29iIGFyZWEKQEAgLTM5OSw3ICszOTQsNyBAQAogCWludAkJYmJ0X2VyYXNlX3NoaWZ0OwogCWludAkJY2hpcF9zaGlmdDsKIAlpbnQJCW51bWNoaXBzOwotCXVuc2lnbmVkIGxvbmcJY2hpcHNpemU7CisJdWludDY0X3QJY2hpcHNpemU7CiAJaW50CQlwYWdlbWFzazsKIAlpbnQJCXBhZ2VidWY7CiAJaW50CQlzdWJwYWdlc2l6ZTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbXRkL3BhcnRpdGlvbnMuaCBiL2luY2x1ZGUvbGludXgvbXRkL3BhcnRpdGlvbnMuaAppbmRleCBjOTJiNGQ0Li5hNDVkZDgzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L210ZC9wYXJ0aXRpb25zLmgKKysrIGIvaW5jbHVkZS9saW51eC9tdGQvcGFydGl0aW9ucy5oCkBAIC0zNiw5ICszNiw5IEBACiAKIHN0cnVjdCBtdGRfcGFydGl0aW9uIHsKIAljaGFyICpuYW1lOwkJCS8qIGlkZW50aWZpZXIgc3RyaW5nICovCi0JdV9pbnQzMl90IHNpemU7CQkJLyogcGFydGl0aW9uIHNpemUgKi8KLQl1X2ludDMyX3Qgb2Zmc2V0OwkJLyogb2Zmc2V0IHdpdGhpbiB0aGUgbWFzdGVyIE1URCBzcGFjZSAqLwotCXVfaW50MzJfdCBtYXNrX2ZsYWdzOwkJLyogbWFzdGVyIE1URCBmbGFncyB0byBtYXNrIG91dCBmb3IgdGhpcyBwYXJ0aXRpb24gKi8KKwl1aW50NjRfdCBzaXplOwkJCS8qIHBhcnRpdGlvbiBzaXplICovCisJdWludDY0X3Qgb2Zmc2V0OwkJLyogb2Zmc2V0IHdpdGhpbiB0aGUgbWFzdGVyIE1URCBzcGFjZSAqLworCXVpbnQzMl90IG1hc2tfZmxhZ3M7CQkvKiBtYXN0ZXIgTVREIGZsYWdzIHRvIG1hc2sgb3V0IGZvciB0aGlzIHBhcnRpdGlvbiAqLwogCXN0cnVjdCBuYW5kX2VjY2xheW91dCAqZWNjbGF5b3V0OwkvKiBvdXQgb2YgYmFuZCBsYXlvdXQgZm9yIHRoaXMgcGFydGl0aW9uIChOQU5EIG9ubHkpKi8KIAlzdHJ1Y3QgbXRkX2luZm8gKiptdGRwOwkJLyogcG9pbnRlciB0byBzdG9yZSB0aGUgTVREIG9iamVjdCAqLwogfTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbXRkL3Bmb3cuaCBiL2luY2x1ZGUvbGludXgvbXRkL3Bmb3cuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzMwZDRmCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9tdGQvcGZvdy5oCkBAIC0wLDAgKzEsMTU5IEBACisvKiBQcmltYXJ5IGZ1bmN0aW9uIG92ZXJsYXkgd2luZG93IGRlZmluaXRpb25zCisgKiBhbmQgc2VydmljZSBmdW5jdGlvbnMgdXNlZCBieSBMUEREUiBjaGlwcworICovCisjaWZuZGVmIF9fTElOVVhfTVREX1BGT1dfSAorI2RlZmluZSBfX0xJTlVYX01URF9QRk9XX0gKKworI2luY2x1ZGUgPGxpbnV4L210ZC9xaW5mby5oPgorCisvKiBQRk9XIHJlZ2lzdGVycyBhZGRyZXNzaW5nICovCisvKiBBZGRyZXNzIG9mIHN5bWJvbCAiUCIgKi8KKyNkZWZpbmUgUEZPV19RVUVSWV9TVFJJTkdfUAkJCTB4MDAwMAorLyogQWRkcmVzcyBvZiBzeW1ib2wgIkYiICovCisjZGVmaW5lIFBGT1dfUVVFUllfU1RSSU5HX0YJCQkweDAwMDIKKy8qIEFkZHJlc3Mgb2Ygc3ltYm9sICJPIiAqLworI2RlZmluZSBQRk9XX1FVRVJZX1NUUklOR19PCQkJMHgwMDA0CisvKiBBZGRyZXNzIG9mIHN5bWJvbCAiVyIgKi8KKyNkZWZpbmUgUEZPV19RVUVSWV9TVFJJTkdfVwkJCTB4MDAwNgorLyogSWRlbnRpZmljYXRpb24gaW5mbyBmb3IgTFBERFIgY2hpcCAqLworI2RlZmluZSBQRk9XX01BTlVGQUNUVVJFUl9JRAkJCTB4MDAyMAorI2RlZmluZSBQRk9XX0RFVklDRV9JRAkJCQkweDAwMjIKKy8qIEFkZHJlc3MgaW4gUEZPVyB3aGVyZSBwcm9nIGJ1ZmZlciBjYW4gY2FuIGJlIGZvdW5kICovCisjZGVmaW5lIFBGT1dfUFJPR1JBTV9CVUZGRVJfT0ZGU0VUCQkweDAwNDAKKy8qIFNpemUgb2YgcHJvZ3JhbSBidWZmZXIgaW4gd29yZHMgKi8KKyNkZWZpbmUgUEZPV19QUk9HUkFNX0JVRkZFUl9TSVpFCQkweDAwNDIKKy8qIEFkZHJlc3MgY29tbWFuZCBjb2RlIHJlZ2lzdGVyICovCisjZGVmaW5lIFBGT1dfQ09NTUFORF9DT0RFCQkJMHgwMDgwCisvKiBjb21tYW5kIGRhdGEgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgUEZPV19DT01NQU5EX0RBVEEJCQkweDAwODQKKy8qIGNvbW1hbmQgYWRkcmVzcyByZWdpc3RlciBsb3dlciBhZGRyZXNzIGJpdHMgKi8KKyNkZWZpbmUgUEZPV19DT01NQU5EX0FERFJFU1NfTAkJCTB4MDA4OAorLyogY29tbWFuZCBhZGRyZXNzIHJlZ2lzdGVyIHVwcGVyIGFkZHJlc3MgYml0cyAqLworI2RlZmluZSBQRk9XX0NPTU1BTkRfQUREUkVTU19ICQkJMHgwMDhhCisvKiBudW1iZXIgb2YgYnl0ZXMgdG8gYmUgcHJvZ2dyYW1tZWQgbG93ZXIgYWRkcmVzcyBiaXRzICovCisjZGVmaW5lIFBGT1dfREFUQV9DT1VOVF9MCQkJMHgwMDkwCisvKiBudW1iZXIgb2YgYnl0ZXMgdG8gYmUgcHJvZ2dyYW1tZWQgaGlnaGVyIGFkZHJlc3MgYml0cyAqLworI2RlZmluZSBQRk9XX0RBVEFfQ09VTlRfSAkJCTB4MDA5MgorLyogY29tbWFuZCBleGVjdXRpb24gcmVnaXN0ZXIsIHRoZSBvbmx5IHBvc3NpYmxlIHZhbHVlIGlzIDB4MDEgKi8KKyNkZWZpbmUgUEZPV19DT01NQU5EX0VYRUNVVEUJCQkweDAwYzAKKy8qIDB4MDEgc2hvdWxkIGJlIHdyaXR0ZW4gYXQgdGhpcyBhZGRyZXNzIHRvIGNsZWFyIGJ1ZmZlciAqLworI2RlZmluZSBQRk9XX0NMRUFSX1BST0dSQU1fQlVGRkVSCQkweDAwYzQKKy8qIGRldmljZSBwcm9ncmFtL2VyYXNlIHN1c3BlbmQgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgUEZPV19QUk9HUkFNX0VSQVNFX1NVU1BFTkQJCTB4MDBjOAorLyogZGV2aWNlIHN0YXR1cyByZWdpc3RlciAqLworI2RlZmluZSBQRk9XX0RTUgkJCQkweDAwY2MKKworLyogTFBERFIgbWVtb3J5IGRldmljZSBjb21tYW5kIGNvZGVzICovCisvKiBUaGV5IGFyZSBwb3NzaWJsZSB2YWx1ZXMgb2YgUEZPVyBjb21tYW5kIGNvZGUgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgTFBERFJfV09SRF9QUk9HUkFNCQkweDAwNDEKKyNkZWZpbmUgTFBERFJfQlVGRl9QUk9HUkFNCQkweDAwRTkKKyNkZWZpbmUgTFBERFJfQkxPQ0tfRVJBU0UJCTB4MDAyMAorI2RlZmluZSBMUEREUl9MT0NLX0JMT0NLCQkweDAwNjEKKyNkZWZpbmUgTFBERFJfVU5MT0NLX0JMT0NLCQkweDAwNjIKKyNkZWZpbmUgTFBERFJfUkVBRF9CTE9DS19MT0NLX1NUQVRVUwkweDAwNjUKKyNkZWZpbmUgTFBERFJfSU5GT19RVUVSWQkJMHgwMDk4CisjZGVmaW5lIExQRERSX1JFQURfT1RQCQkJMHgwMDk3CisjZGVmaW5lIExQRERSX1BST0dfT1RQCQkJMHgwMEMwCisjZGVmaW5lIExQRERSX1JFU1VNRQkJCTB4MDBEMAorCisvKiBEZWZpbmVzIHBvc3NpYmxlIHZhbHVlIG9mIFBGT1cgY29tbWFuZCBleGVjdXRpb24gcmVnaXN0ZXIgKi8KKyNkZWZpbmUgTFBERFJfU1RBUlRfRVhFQ1VUSU9OCQkJMHgwMDAxCisKKy8qIERlZmluZXMgcG9zc2libGUgdmFsdWUgb2YgUEZPVyBwcm9ncmFtL2VyYXNlIHN1c3BlbmQgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgTFBERFJfU1VTUEVORAkJCQkweDAwMDEKKworLyogUG9zc2libGUgdmFsdWVzIG9mIFBGT1cgZGV2aWNlIHN0YXR1cyByZWdpc3RlciAqLworLyogYWNjZXNzIFIgLSByZWFkOyBSQyByZWFkICYgY2xlYXJhYmxlICovCisjZGVmaW5lIERTUl9EUFMJCQkoMTw8MSkgLyogUkM7IGRldmljZSBwcm90ZWN0IHN0YXR1cworCQkJCQkqIDAgLSBub3QgcHJvdGVjdGVkIDEgLSBsb2NrZWQgKi8KKyNkZWZpbmUgRFNSX1BTUwkJCSgxPDwyKSAvKiBSOyBwcm9ncmFtIHN1c3BlbmQgc3RhdHVzOworCQkJCQkqIDAtcHJvZyBpbiBwcm9ncmVzcy9jb21wbGV0ZWQsCisJCQkJCSogMS0gcHJvZyBzdXNwZW5kZWQgKi8KKyNkZWZpbmUgRFNSX1ZQUFMJCSgxPDwzKSAvKiBSQzsgMC1WcHAgT0ssICogMS1WcHAgbG93ICovCisjZGVmaW5lIERTUl9QUk9HUkFNX1NUQVRVUwkoMTw8NCkgLyogUkM7IDAtc3VjY2Vzc2Z1bCwgMS1lcnJvciAqLworI2RlZmluZSBEU1JfRVJBU0VfU1RBVFVTCSgxPDw1KSAvKiBSQzsgZXJhc2Ugb3IgYmxhbmsgY2hlY2sgc3RhdHVzOworCQkJCQkqIDAtc3VjY2VzcyBlcmFzZS9ibGFuayBjaGVjaywKKwkJCQkJKiAxIGJsYW5rIGNoZWNrIGVycm9yICovCisjZGVmaW5lIERTUl9FU1MJCQkoMTw8NikgLyogUjsgZXJhc2Ugc3VzcGVuZCBzdGF0dXM7CisJCQkJCSogMC1lcmFzZSBpbiBwcm9ncmVzcy9jb21wbGV0ZSwKKwkJCQkJKiAxIGVyYXNlIHN1c3BlbmRlZCAqLworI2RlZmluZSBEU1JfUkVBRFlfU1RBVFVTCSgxPDw3KSAvKiBSOyBEZXZpY2Ugc3RhdHVzCisJCQkJCSogMC1idXN5LAorCQkJCQkqIDEtcmVhZHkgKi8KKyNkZWZpbmUgRFNSX1JQUwkJCSgweDM8PDgpIC8qIFJDOyAgcmVnaW9uIHByb2dyYW0gc3RhdHVzCisJCQkJCSogMDAgLSBTdWNjZXNzLAorCQkJCQkqIDAxLXJlLXByb2dyYW0gYXR0ZW1wdCBpbiByZWdpb24gd2l0aAorCQkJCQkqIG9iamVjdCBtb2RlIGRhdGEsCisJCQkJCSogMTAtb2JqZWN0IG1vZGUgcHJvZ3JhbSB3IGF0dGVtcHQgaW4KKwkJCQkJKiByZWdpb24gd2l0aCBjb250cm9sIG1vZGUgZGF0YQorCQkJCQkqIDExLWF0dGVtcHQgdG8gcHJvZ3JhbSBpbnZhbGlkIGhhbGYKKwkJCQkJKiB3aXRoIDB4NDEgY29tbWFuZCAqLworI2RlZmluZSBEU1JfQU9TCQkJKDE8PDEyKSAvKiBSQzsgMS0gQU8gcmVsYXRlZCBmYWlsdXJlICovCisjZGVmaW5lIERTUl9BVkFJTEFCTEUJCSgxPDwxNSkgLyogUjsgRGV2aWNlIGF2YWlsYmlsaXR5CisJCQkJCSogMSAtIERldmljZSBhdmFpbGFibGUKKwkJCQkJKiAwIC0gbm90IGF2YWlsYWJsZSAqLworCisvKiBUaGUgc3VwZXJzZXQgb2YgYWxsIHBvc3NpYmxlIGVycm9yIGJpdHMgaW4gRFNSICovCisjZGVmaW5lIERTUl9FUlIJCQkweDEzM0EKKworc3RhdGljIGlubGluZSB2b2lkIHNlbmRfcGZvd19jb21tYW5kKHN0cnVjdCBtYXBfaW5mbyAqbWFwLAorCQkJCXVuc2lnbmVkIGxvbmcgY21kX2NvZGUsIHVuc2lnbmVkIGxvbmcgYWRyLAorCQkJCXVuc2lnbmVkIGxvbmcgbGVuLCBtYXBfd29yZCAqZGF0dW0pCit7CisJaW50IGJpdHNfcGVyX2NoaXAgPSBtYXBfYmFua3dpZHRoKG1hcCkgKiA4OworCWludCBjaGlwbnVtOworCXN0cnVjdCBscGRkcl9wcml2YXRlICpscGRkciA9IG1hcC0+ZmxkcnZfcHJpdjsKKwljaGlwbnVtID0gYWRyID4+IGxwZGRyLT5jaGlwc2hpZnQ7CisKKwltYXBfd3JpdGUobWFwLCBDTUQoY21kX2NvZGUpLCBtYXAtPnBmb3dfYmFzZSArIFBGT1dfQ09NTUFORF9DT0RFKTsKKwltYXBfd3JpdGUobWFwLCBDTUQoYWRyICYgKCgxPDxiaXRzX3Blcl9jaGlwKSAtIDEpKSwKKwkJCQltYXAtPnBmb3dfYmFzZSArIFBGT1dfQ09NTUFORF9BRERSRVNTX0wpOworCW1hcF93cml0ZShtYXAsIENNRChhZHI+PmJpdHNfcGVyX2NoaXApLAorCQkJCW1hcC0+cGZvd19iYXNlICsgUEZPV19DT01NQU5EX0FERFJFU1NfSCk7CisJaWYgKGxlbikgeworCQltYXBfd3JpdGUobWFwLCBDTUQobGVuICYgKCgxPDxiaXRzX3Blcl9jaGlwKSAtIDEpKSwKKwkJCQkJbWFwLT5wZm93X2Jhc2UgKyBQRk9XX0RBVEFfQ09VTlRfTCk7CisJCW1hcF93cml0ZShtYXAsIENNRChsZW4+PmJpdHNfcGVyX2NoaXApLAorCQkJCQltYXAtPnBmb3dfYmFzZSArIFBGT1dfREFUQV9DT1VOVF9IKTsKKwl9CisJaWYgKGRhdHVtKQorCQltYXBfd3JpdGUobWFwLCAqZGF0dW0sIG1hcC0+cGZvd19iYXNlICsgUEZPV19DT01NQU5EX0RBVEEpOworCisJLyogQ29tbWFuZCBleGVjdXRpb24gc3RhcnQgKi8KKwltYXBfd3JpdGUobWFwLCBDTUQoTFBERFJfU1RBUlRfRVhFQ1VUSU9OKSwKKwkJCW1hcC0+cGZvd19iYXNlICsgUEZPV19DT01NQU5EX0VYRUNVVEUpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcHJpbnRfZHJzX2Vycm9yKHVuc2lnbmVkIGRzcikKK3sKKwlpbnQgcHJvZ19zdGF0dXMgPSAoZHNyICYgRFNSX1JQUykgPj4gODsKKworCWlmICghKGRzciAmIERTUl9BVkFJTEFCTEUpKQorCQlwcmludGsoS0VSTl9OT1RJQ0UiRFNSLjE1OiAoMCkgRGV2aWNlIG5vdCBBdmFpbGFibGVcbiIpOworCWlmIChwcm9nX3N0YXR1cyAmIDB4MDMpCisJCXByaW50ayhLRVJOX05PVElDRSJEU1IuOSw4OiAoMTEpIEF0dGVtcHQgdG8gcHJvZ3JhbSBpbnZhbGlkICIKKwkJCQkJCSJoYWxmIHdpdGggNDFoIGNvbW1hbmRcbiIpOworCWVsc2UgaWYgKHByb2dfc3RhdHVzICYgMHgwMikKKwkJcHJpbnRrKEtFUk5fTk9USUNFIkRTUi45LDg6ICgxMCkgT2JqZWN0IE1vZGUgUHJvZ3JhbSBhdHRlbXB0ICIKKwkJCQkJImluIHJlZ2lvbiB3aXRoIENvbnRyb2wgTW9kZSBkYXRhXG4iKTsKKwllbHNlIGlmIChwcm9nX3N0YXR1cyAmICAweDAxKQorCQlwcmludGsoS0VSTl9OT1RJQ0UiRFNSLjksODogKDAxKSBQcm9ncmFtIGF0dGVtcHQgaW4gcmVnaW9uICIKKwkJCQkJCSJ3aXRoIE9iamVjdCBNb2RlIGRhdGFcbiIpOworCWlmICghKGRzciAmIERTUl9SRUFEWV9TVEFUVVMpKQorCQlwcmludGsoS0VSTl9OT1RJQ0UiRFNSLjc6ICgwKSBEZXZpY2UgaXMgQnVzeVxuIik7CisJaWYgKGRzciAmIERTUl9FU1MpCisJCXByaW50ayhLRVJOX05PVElDRSJEU1IuNjogKDEpIEVyYXNlIFN1c3BlbmRlZFxuIik7CisJaWYgKGRzciAmIERTUl9FUkFTRV9TVEFUVVMpCisJCXByaW50ayhLRVJOX05PVElDRSJEU1IuNTogKDEpIEVyYXNlL0JsYW5rIGNoZWNrIGVycm9yXG4iKTsKKwlpZiAoZHNyICYgRFNSX1BST0dSQU1fU1RBVFVTKQorCQlwcmludGsoS0VSTl9OT1RJQ0UiRFNSLjQ6ICgxKSBQcm9ncmFtIEVycm9yXG4iKTsKKwlpZiAoZHNyICYgRFNSX1ZQUFMpCisJCXByaW50ayhLRVJOX05PVElDRSJEU1IuMzogKDEpIFZwcCBsb3cgZGV0ZWN0LCBvcGVyYXRpb24gIgorCQkJCQkiYWJvcnRlZFxuIik7CisJaWYgKGRzciAmIERTUl9QU1MpCisJCXByaW50ayhLRVJOX05PVElDRSJEU1IuMjogKDEpIFByb2dyYW0gc3VzcGVuZGVkXG4iKTsKKwlpZiAoZHNyICYgRFNSX0RQUykKKwkJcHJpbnRrKEtFUk5fTk9USUNFIkRTUi4xOiAoMSkgQWJvcnRlZCBFcmFzZS9Qcm9ncmFtIGF0dGVtcHQgIgorCQkJCQkib24gbG9ja2VkIGJsb2NrXG4iKTsKK30KKyNlbmRpZiAvKiBfX0xJTlVYX01URF9QRk9XX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbXRkL3BoeXNtYXAuaCBiL2luY2x1ZGUvbGludXgvbXRkL3BoeXNtYXAuaAppbmRleCBjOGU2M2E1Li43NmY3Y2FiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L210ZC9waHlzbWFwLmgKKysrIGIvaW5jbHVkZS9saW51eC9tdGQvcGh5c21hcC5oCkBAIC0yNCw2ICsyNCw3IEBACiAJdW5zaWduZWQgaW50CQl3aWR0aDsKIAl2b2lkCQkJKCpzZXRfdnBwKShzdHJ1Y3QgbWFwX2luZm8gKiwgaW50KTsKIAl1bnNpZ25lZCBpbnQJCW5yX3BhcnRzOworCXVuc2lnbmVkIGludAkJcGZvd19iYXNlOwogCXN0cnVjdCBtdGRfcGFydGl0aW9uCSpwYXJ0czsKIH07CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbXRkL3FpbmZvLmggYi9pbmNsdWRlL2xpbnV4L210ZC9xaW5mby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiM2Q0ODcKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L210ZC9xaW5mby5oCkBAIC0wLDAgKzEsOTEgQEAKKyNpZm5kZWYgX19MSU5VWF9NVERfUUlORk9fSAorI2RlZmluZSBfX0xJTlVYX01URF9RSU5GT19ICisKKyNpbmNsdWRlIDxsaW51eC9tdGQvbWFwLmg+CisjaW5jbHVkZSA8bGludXgvd2FpdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9tdGQvbXRkLmg+CisjaW5jbHVkZSA8bGludXgvbXRkL2ZsYXNoY2hpcC5oPgorI2luY2x1ZGUgPGxpbnV4L210ZC9wYXJ0aXRpb25zLmg+CisKKy8qIGxwZGRyX3ByaXZhdGUgZGVzY3JpYmVzIGxwZGRyIGZsYXNoIGNoaXAgaW4gbWVtb3J5IG1hcAorICogQE1hbnVmYWN0SWQgLSBDaGlwIE1hbnVmYWN0dXJlIElECisgKiBARGV2SWQgLSBDaGlwIERldmljZSBJRAorICogQHFpbmZvIC0gcG9pbnRlciB0byBxaW5mbyByZWNvcmRzIGRlc2NyaWJpbmcgdGhlIGNoaXAKKyAqIEBudW1jaGlwcyAtIG51bWJlciBvZiBjaGlwcyBpbmNsdWRpbmcgdmlydWFsIFJXVyBwYXJ0aXRpb25zCisgKiBAY2hpcHNoaWZ0IC0gQ2hpcC9wYXJ0aXRvbiBzaXplIDJeY2hpcHNoaWZ0CisgKiBAY2hpcHMgLSBwZXItY2hpcCBkYXRhIHN0cnVjdHVyZQorICovCitzdHJ1Y3QgbHBkZHJfcHJpdmF0ZSB7CisJdWludDE2X3QgTWFudWZhY3RJZDsKKwl1aW50MTZfdCBEZXZJZDsKKwlzdHJ1Y3QgcWluZm9fY2hpcCAqcWluZm87CisJaW50IG51bWNoaXBzOworCXVuc2lnbmVkIGxvbmcgY2hpcHNoaWZ0OworCXN0cnVjdCBmbGNoaXAgY2hpcHNbMF07Cit9OworCisvKiBxaW5mb19xdWVyeV9pbmZvIHN0cnVjdHVyZSBjb250YWlucyByZXF1ZXN0IGluZm9ybWF0aW9uIGZvcgorICogZWFjaCBxaW5mbyByZWNvcmQKKyAqIEBtYWpvciAtIG1ham9yIG51bWJlciBvZiBxaW5mbyByZWNvcmQKKyAqIEBtYWpvciAtIG1pbm9yIG51bWJlciBvZiBxaW5mbyByZWNvcmQKKyAqIEBpZF9zdHIgLSBkZXNjcmlwdGl2ZSBzdHJpbmcgdG8gYWNjZXNzIHRoZSByZWNvcmQKKyAqIEBkZXNjIC0gZGV0YWlsZWQgZGVzY3JpcHRpb24gZm9yIHRoZSBxaW5mbyByZWNvcmQKKyAqLworc3RydWN0IHFpbmZvX3F1ZXJ5X2luZm8geworCXVpbnQ4X3QJbWFqb3I7CisJdWludDhfdAltaW5vcjsKKwljaGFyICppZF9zdHI7CisJY2hhciAqZGVzYzsKK307CisKKy8qCisgKiBxaW5mb19jaGlwIHN0cnVjdHVyZSBjb250YWlucyBuZWNlc3NhcnkgcWluZm8gcmVjb3JkcyBkYXRhCisgKiBARGV2U2l6ZVNoaWZ0IC0gRGV2aWNlIHNpemUgMl5uIGJ5dGVzCisgKiBAQnVmU2l6ZVNoaWZ0IC0gUHJvZ3JhbSBidWZmZXIgc2l6ZSAyXm4gYnl0ZXMKKyAqIEBUb3RhbEJsb2Nrc051bSAtIFRvdGFsIG51bWJlciBvZiBibG9ja3MKKyAqIEBVbmlmb3JtQmxvY2tTaXplU2hpZnQgLSBVbmlmb3JtIGJsb2NrIHNpemUgMl5Vbmlmb3JtQmxvY2tTaXplU2hpZnQgYnl0ZXMKKyAqIEBIV1BhcnRzTnVtIC0gTnVtYmVyIG9mIGhhcmR3YXJlIHBhcnRpdGlvbnMKKyAqIEBTdXNwRXJhc2VTdXBwIC0gU3VzcGVuZCBlcmFzZSBzdXBwb3J0ZWQKKyAqIEBTaW5nbGVXb3JkUHJvZ1RpbWUgLSBTaW5nbGUgd29yZCBwcm9ncmFtIDJeU2luZ2xlV29yZFByb2dUaW1lIHUtc2VjCisgKiBAUHJvZ0J1ZmZlclRpbWUgLSBQcm9ncmFtIGJ1ZmZlciB3cml0ZSAyXlByb2dCdWZmZXJUaW1lIHUtc2VjCisgKiBAQmxvY2tFcmFzZVRpbWUgLSBCbG9jayBlcmFzZSAyXkJsb2NrRXJhc2VUaW1lIG0tc2VjCisgKi8KK3N0cnVjdCBxaW5mb19jaGlwIHsKKwkvKiBHZW5lcmFsIGRldmljZSBpbmZvICovCisJdWludDE2X3QgRGV2U2l6ZVNoaWZ0OworCXVpbnQxNl90IEJ1ZlNpemVTaGlmdDsKKwkvKiBFcmFzZSBibG9jayBpbmZvcm1hdGlvbiAqLworCXVpbnQxNl90IFRvdGFsQmxvY2tzTnVtOworCXVpbnQxNl90IFVuaWZvcm1CbG9ja1NpemVTaGlmdDsKKwkvKiBQYXJ0aXRpb24gaW5mb3JtYXRpb24gKi8KKwl1aW50MTZfdCBIV1BhcnRzTnVtOworCS8qIE9wdGlvbmFsIGZlYXR1cmVzICovCisJdWludDE2X3QgU3VzcEVyYXNlU3VwcDsKKwkvKiBPcGVyYXRpb24gdHlwaWNhbCB0aW1lICovCisJdWludDE2X3QgU2luZ2xlV29yZFByb2dUaW1lOworCXVpbnQxNl90IFByb2dCdWZmZXJUaW1lOworCXVpbnQxNl90IEJsb2NrRXJhc2VUaW1lOworfTsKKworLyogZGVmaW5lcyBmb3IgZml4dXAgdXNhZ2UgKi8KKyNkZWZpbmUgTFBERFJfTUZSX0FOWQkJMHhmZmZmCisjZGVmaW5lIExQRERSX0lEX0FOWQkJMHhmZmZmCisjZGVmaW5lIE5VTU9OWVhfTUZHUl9JRAkJMHgwMDg5CisjZGVmaW5lIFIxOF9ERVZJQ0VfSURfMUcJMHg4OTNjCisKK3N0YXRpYyBpbmxpbmUgbWFwX3dvcmQgbHBkZHJfYnVpbGRfY21kKHVfbG9uZyBjbWQsIHN0cnVjdCBtYXBfaW5mbyAqbWFwKQoreworCW1hcF93b3JkIHZhbCA9IHsgezB9IH07CisJdmFsLnhbMF0gPSBjbWQ7CisJcmV0dXJuIHZhbDsKK30KKworI2RlZmluZSBDTUQoeCkgbHBkZHJfYnVpbGRfY21kKHgsIG1hcCkKKyNkZWZpbmUgQ01EVkFMKGNtZCkgY21kLnhbMF0KKworc3RydWN0IG10ZF9pbmZvICpscGRkcl9jbWRzZXQoc3RydWN0IG1hcF9pbmZvICopOworCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tdGQvc2hhcnBzbC5oIGIvaW5jbHVkZS9saW51eC9tdGQvc2hhcnBzbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1ZjRkMmEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L210ZC9zaGFycHNsLmgKQEAgLTAsMCArMSwyMCBAQAorLyoKKyAqIFNoYXJwU0wgTkFORCBzdXBwb3J0CisgKgorICogQ29weXJpZ2h0IChDKSAyMDA4IERtaXRyeSBCYXJ5c2hrb3YKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tdGQvbmFuZC5oPgorI2luY2x1ZGUgPGxpbnV4L210ZC9uYW5kX2VjYy5oPgorI2luY2x1ZGUgPGxpbnV4L210ZC9wYXJ0aXRpb25zLmg+CisKK3N0cnVjdCBzaGFycHNsX25hbmRfcGxhdGZvcm1fZGF0YSB7CisJc3RydWN0IG5hbmRfYmJ0X2Rlc2NyCSpiYWRibG9ja19wYXR0ZXJuOworCXN0cnVjdCBuYW5kX2VjY2xheW91dAkqZWNjX2xheW91dDsKKwlzdHJ1Y3QgbXRkX3BhcnRpdGlvbgkqcGFydGl0aW9uczsKKwl1bnNpZ25lZCBpbnQJCW5yX3BhcnRpdGlvbnM7Cit9OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uY3BfZnMuaCBiL2luY2x1ZGUvbGludXgvbmNwX2ZzLmgKaW5kZXggOWYyZDc2My4uZjY5ZTY2ZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uY3BfZnMuaAorKysgYi9pbmNsdWRlL2xpbnV4L25jcF9mcy5oCkBAIC04Nyw3ICs4Nyw3IEBACiAjZGVmaW5lIE5DUF9BVVRIX05EUwkweDMyCiAJaW50CQlhdXRoX3R5cGU7CiAJc2l6ZV90CQlvYmplY3RfbmFtZV9sZW47Ci0Jdm9pZCBfX3VzZXIgKglvYmplY3RfbmFtZTsJLyogYW4gdXNlcnNwYWNlIGRhdGEsIGluIG1vc3QgY2FzZXMgdXNlciBuYW1lICovCisJdm9pZCBfX3VzZXIgKglvYmplY3RfbmFtZTsJLyogYSB1c2Vyc3BhY2UgZGF0YSwgaW4gbW9zdCBjYXNlcyB1c2VyIG5hbWUgKi8KIH07CiAKIHN0cnVjdCBuY3BfcHJpdmF0ZWRhdGFfaW9jdGwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZGV2aWNlLmggYi9pbmNsdWRlL2xpbnV4L25ldGRldmljZS5oCmluZGV4IGMyOGJiYmEuLmVjNTQ3ODUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmV0ZGV2aWNlLmgKKysrIGIvaW5jbHVkZS9saW51eC9uZXRkZXZpY2UuaApAQCAtNDY3LDcgKzQ2Nyw3IEBACiAgKiAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiBuZXR3b3JrIGRldmljZSB0cmFuc2lzdGlvbnMgdG8gdGhlIGRvd24KICAqICAgICBzdGF0ZS4KICAqCi0gKiBpbnQgKCpuZG9faGFyZF9zdGFydF94bWl0KShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKyAqIGludCAoKm5kb19zdGFydF94bWl0KShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKICAqCUNhbGxlZCB3aGVuIGEgcGFja2V0IG5lZWRzIHRvIGJlIHRyYW5zbWl0dGVkLgogICoJTXVzdCByZXR1cm4gTkVUREVWX1RYX09LICwgTkVUREVWX1RYX0JVU1ksIG9yIE5FVERFVl9UWF9MT0NLRUQsCiAgKglSZXF1aXJlZCBjYW4gbm90IGJlIE5VTEwuCkBAIC03OTUsNiArNzk1LDcgQEAKIAkgICAgICAgTkVUUkVHX1VOUkVHSVNURVJJTkcsCS8qIGNhbGxlZCB1bnJlZ2lzdGVyX25ldGRldmljZSAqLwogCSAgICAgICBORVRSRUdfVU5SRUdJU1RFUkVELAkvKiBjb21wbGV0ZWQgdW5yZWdpc3RlciB0b2RvICovCiAJICAgICAgIE5FVFJFR19SRUxFQVNFRCwJCS8qIGNhbGxlZCBmcmVlX25ldGRldiAqLworCSAgICAgICBORVRSRUdfRFVNTVksCQkvKiBkdW1teSBkZXZpY2UgZm9yIE5BUEkgcG9sbCAqLwogCX0gcmVnX3N0YXRlOwogCiAJLyogQ2FsbGVkIGZyb20gdW5yZWdpc3RlciwgY2FuIGJlIHVzZWQgdG8gY2FsbCBmcmVlX25ldGRldiAqLwpAQCAtMTA3Nyw2ICsxMDc4LDggQEAKIGV4dGVybiB2b2lkCQlzeW5jaHJvbml6ZV9uZXQodm9pZCk7CiBleHRlcm4gaW50IAkJcmVnaXN0ZXJfbmV0ZGV2aWNlX25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIpOwogZXh0ZXJuIGludAkJdW5yZWdpc3Rlcl9uZXRkZXZpY2Vfbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYik7CitleHRlcm4gaW50CQlpbml0X2R1bW15X25ldGRldihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKwogZXh0ZXJuIGludCBjYWxsX25ldGRldmljZV9ub3RpZmllcnModW5zaWduZWQgbG9uZyB2YWwsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogZXh0ZXJuIHN0cnVjdCBuZXRfZGV2aWNlCSpkZXZfZ2V0X2J5X2luZGV4KHN0cnVjdCBuZXQgKm5ldCwgaW50IGlmaW5kZXgpOwogZXh0ZXJuIHN0cnVjdCBuZXRfZGV2aWNlCSpfX2Rldl9nZXRfYnlfaW5kZXgoc3RydWN0IG5ldCAqbmV0LCBpbnQgaWZpbmRleCk7CkBAIC0xMTI1LDkgKzExMjgsNiBAQAogCXN0cnVjdCBza19idWZmCQkqY29tcGxldGlvbl9xdWV1ZTsKIAogCXN0cnVjdCBuYXBpX3N0cnVjdAliYWNrbG9nOwotI2lmZGVmIENPTkZJR19ORVRfRE1BCi0Jc3RydWN0IGRtYV9jaGFuCQkqbmV0X2RtYTsKLSNlbmRpZgogfTsKIAogREVDTEFSRV9QRVJfQ1BVKHN0cnVjdCBzb2Z0bmV0X2RhdGEsc29mdG5ldF9kYXRhKTsKQEAgLTEzNzMsOCArMTM3MywxNCBAQAogI2RlZmluZSBIQVZFX05FVElGX1JFQ0VJVkVfU0tCIDEKIGV4dGVybiBpbnQJCW5ldGlmX3JlY2VpdmVfc2tiKHN0cnVjdCBza19idWZmICpza2IpOwogZXh0ZXJuIHZvaWQJCW5hcGlfZ3JvX2ZsdXNoKHN0cnVjdCBuYXBpX3N0cnVjdCAqbmFwaSk7CitleHRlcm4gaW50CQlkZXZfZ3JvX3JlY2VpdmUoc3RydWN0IG5hcGlfc3RydWN0ICpuYXBpLAorCQkJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKIGV4dGVybiBpbnQJCW5hcGlfZ3JvX3JlY2VpdmUoc3RydWN0IG5hcGlfc3RydWN0ICpuYXBpLAogCQkJCQkgc3RydWN0IHNrX2J1ZmYgKnNrYik7CitleHRlcm4gdm9pZAkJbmFwaV9yZXVzZV9za2Ioc3RydWN0IG5hcGlfc3RydWN0ICpuYXBpLAorCQkJCSAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKK2V4dGVybiBzdHJ1Y3Qgc2tfYnVmZiAqCW5hcGlfZnJhZ2luZm9fc2tiKHN0cnVjdCBuYXBpX3N0cnVjdCAqbmFwaSwKKwkJCQkJICBzdHJ1Y3QgbmFwaV9ncm9fZnJhZ2luZm8gKmluZm8pOwogZXh0ZXJuIGludAkJbmFwaV9ncm9fZnJhZ3Moc3RydWN0IG5hcGlfc3RydWN0ICpuYXBpLAogCQkJCSAgICAgICBzdHJ1Y3QgbmFwaV9ncm9fZnJhZ2luZm8gKmluZm8pOwogZXh0ZXJuIHZvaWQJCW5ldGlmX25pdF9kZWxpdmVyKHN0cnVjdCBza19idWZmICpza2IpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveF90YWJsZXMuaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3hfdGFibGVzLmgKaW5kZXggZTUyY2U0Ny4uYzdlZTg3NCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveF90YWJsZXMuaAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94X3RhYmxlcy5oCkBAIC0yNzAsNiArMjcwLDcgQEAKIAlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CiAKIAljb25zdCBjaGFyIG5hbWVbWFRfRlVOQ1RJT05fTUFYTkFNRUxFTi0xXTsKKwl1X2ludDhfdCByZXZpc2lvbjsKIAogCS8qIFJldHVybiB0cnVlIG9yIGZhbHNlOiByZXR1cm4gRkFMU0UgYW5kIHNldCAqaG90ZHJvcCA9IDEgdG8KICAgICAgICAgICAgZm9yY2UgaW1tZWRpYXRlIHBhY2tldCBkcm9wLiAqLwpAQCAtMzAyLDcgKzMwMyw2IEBACiAJdW5zaWduZWQgc2hvcnQgcHJvdG87CiAKIAl1bnNpZ25lZCBzaG9ydCBmYW1pbHk7Ci0JdV9pbnQ4X3QgcmV2aXNpb247CiB9OwogCiAvKiBSZWdpc3RyYXRpb24gaG9va3MgZm9yIHRhcmdldHMuICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25mczQuaCBiL2luY2x1ZGUvbGludXgvbmZzNC5oCmluZGV4IGVhMDM2NjcuLmI5MTIzMTEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmZzNC5oCisrKyBiL2luY2x1ZGUvbGludXgvbmZzNC5oCkBAIC04OCw2ICs4OCw4IEBACiAjZGVmaW5lIE5GUzRfQUNFX0dFTkVSSUNfRVhFQ1VURSAgICAgICAgICAgICAgMHgwMDEyMDBBMAogI2RlZmluZSBORlM0X0FDRV9NQVNLX0FMTCAgICAgICAgICAgICAgICAgICAgIDB4MDAxRjAxRkYKIAorI2RlZmluZSBORlM0X01BWF9VSU5UNjQJKH4odTY0KTApCisKIGVudW0gbmZzNF9hY2xfd2hvdHlwZSB7CiAJTkZTNF9BQ0xfV0hPX05BTUVEID0gMCwKIAlORlM0X0FDTF9XSE9fT1dORVIsCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25mc2QvbmZzZC5oIGIvaW5jbHVkZS9saW51eC9uZnNkL25mc2QuaAppbmRleCAyMTI2OTQwLi5lMTlmNDU5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25mc2QvbmZzZC5oCisrKyBiL2luY2x1ZGUvbGludXgvbmZzZC9uZnNkLmgKQEAgLTIzLDcgKzIzLDYgQEAKIC8qCiAgKiBuZnNkIHZlcnNpb24KICAqLwotI2RlZmluZSBORlNEX1ZFUlNJT04JCSIwLjUiCiAjZGVmaW5lIE5GU0RfU1VQUE9SVEVEX01JTk9SX1ZFUlNJT04JMAogCiAvKgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZnNkL25mc2ZoLmggYi9pbmNsdWRlL2xpbnV4L25mc2QvbmZzZmguaAppbmRleCBkMTk0MWNiLi5iMmUwOTM4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25mc2QvbmZzZmguaAorKysgYi9pbmNsdWRlL2xpbnV4L25mc2QvbmZzZmguaApAQCAtNjgsNiArNjgsMTAgQEAKICAqICAgICAxICAtIDQgYnl0ZSB1c2VyIHNwZWNpZmllZCBpZGVudGlmaWVyCiAgKiAgICAgMiAgLSA0IGJ5dGUgbWFqb3IsIDQgYnl0ZSBtaW5vciwgNCBieXRlIGlub2RlIG51bWJlciAtIERFUFJFQ0FURUQKICAqICAgICAzICAtIDQgYnl0ZSBkZXZpY2UgaWQsIGVuY29kZWQgZm9yIHVzZXItc3BhY2UsIDQgYnl0ZSBpbm9kZSBudW1iZXIKKyAqICAgICA0ICAtIDQgYnl0ZSBpbm9kZSBudW1iZXIgYW5kIDQgYnl0ZSB1dWlkCisgKiAgICAgNSAgLSA4IGJ5dGUgdXVpZAorICogICAgIDYgIC0gMTYgYnl0ZSB1dWlkCisgKiAgICAgNyAgLSA4IGJ5dGUgaW5vZGUgbnVtYmVyIGFuZCAxNiBieXRlIHV1aWQKICAqCiAgKiBUaGUgZmlsZWlkX3R5cGUgaWRlbnRpZmllZCBob3cgdGhlIGZpbGUgd2l0aGluIHRoZSBmaWxlc3lzdGVtIGlzIGVuY29kZWQuCiAgKiBUaGlzIGlzICh3aWxsIGJlKSBwYXNzZWQgdG8sIGFuZCBzZXQgYnksIHRoZSB1bmRlcmx5aW5nIGZpbGVzeXN0ZW0gaWYgaXQgc3VwcG9ydHMKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbndwc2VyaWFsLmggYi9pbmNsdWRlL2xpbnV4L253cHNlcmlhbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhY2IyMTUKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L253cHNlcmlhbC5oCkBAIC0wLDAgKzEsMTggQEAKKy8qCisgKiAgU2VyaWFsIFBvcnQgZHJpdmVyIGZvciBhIE5XUCB1YXJ0IGRldmljZQorICoKKyAqICAgIENvcHlyaWdodCAoQykgMjAwOCBJQk0gQ29ycC4sIEJlbmphbWluIEtyaWxsIDxiZW5AY29kaWVydC5vcmc+CisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICovCisjaWZuZGVmIF9OV1BTRVJJQUxfSAorI2RlZmluZSBfTldQU0VSSUFMX0gKKworaW50IG53cHNlcmlhbF9yZWdpc3Rlcl9wb3J0KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpOwordm9pZCBud3BzZXJpYWxfdW5yZWdpc3Rlcl9wb3J0KGludCBsaW5lKTsKKworI2VuZGlmIC8qIF9OV1BTRVJJQUxfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9vZl9pMmMuaCBiL2luY2x1ZGUvbGludXgvb2ZfaTJjLmgKaW5kZXggYmQyYTg3MC4uMzQ5NzRiNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9vZl9pMmMuaAorKysgYi9pbmNsdWRlL2xpbnV4L29mX2kyYy5oCkBAIC0xNyw0ICsxNyw3IEBACiB2b2lkIG9mX3JlZ2lzdGVyX2kyY19kZXZpY2VzKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCwKIAkJCSAgICAgc3RydWN0IGRldmljZV9ub2RlICphZGFwX25vZGUpOwogCisvKiBtdXN0IGNhbGwgcHV0X2RldmljZSgpIHdoZW4gZG9uZSB3aXRoIHJldHVybmVkIGkyY19jbGllbnQgZGV2aWNlICovCitzdHJ1Y3QgaTJjX2NsaWVudCAqb2ZfZmluZF9pMmNfZGV2aWNlX2J5X25vZGUoc3RydWN0IGRldmljZV9ub2RlICpub2RlKTsKKwogI2VuZGlmIC8qIF9fTElOVVhfT0ZfSTJDX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvb3Byb2ZpbGUuaCBiL2luY2x1ZGUvbGludXgvb3Byb2ZpbGUuaAppbmRleCAxY2U5ZmU1Li4xZDk1MThiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L29wcm9maWxlLmgKKysrIGIvaW5jbHVkZS9saW51eC9vcHJvZmlsZS5oCkBAIC0xNjQsNCArMTY0LDIyIEBACiB1bnNpZ25lZCBsb25nIG9wcm9maWxlX2dldF9jcHVfYnVmZmVyX3NpemUodm9pZCk7CiB2b2lkIG9wcm9maWxlX2NwdV9idWZmZXJfaW5jX3NtcGxfbG9zdCh2b2lkKTsKICAKKy8qIGNwdSBidWZmZXIgZnVuY3Rpb25zICovCisKK3N0cnVjdCBvcF9zYW1wbGU7CisKK3N0cnVjdCBvcF9lbnRyeSB7CisJc3RydWN0IHJpbmdfYnVmZmVyX2V2ZW50ICpldmVudDsKKwlzdHJ1Y3Qgb3Bfc2FtcGxlICpzYW1wbGU7CisJdW5zaWduZWQgbG9uZyBpcnFfZmxhZ3M7CisJdW5zaWduZWQgbG9uZyBzaXplOworCXVuc2lnbmVkIGxvbmcgKmRhdGE7Cit9OworCit2b2lkIG9wcm9maWxlX3dyaXRlX3Jlc2VydmUoc3RydWN0IG9wX2VudHJ5ICplbnRyeSwKKwkJCSAgICBzdHJ1Y3QgcHRfcmVncyAqIGNvbnN0IHJlZ3MsCisJCQkgICAgdW5zaWduZWQgbG9uZyBwYywgaW50IGNvZGUsIGludCBzaXplKTsKK2ludCBvcHJvZmlsZV9hZGRfZGF0YShzdHJ1Y3Qgb3BfZW50cnkgKmVudHJ5LCB1bnNpZ25lZCBsb25nIHZhbCk7CitpbnQgb3Byb2ZpbGVfd3JpdGVfY29tbWl0KHN0cnVjdCBvcF9lbnRyeSAqZW50cnkpOworCiAjZW5kaWYgLyogT1BST0ZJTEVfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9veHUyMTBocC5oIGIvaW5jbHVkZS9saW51eC9veHUyMTBocC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiZjk2ZWEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L294dTIxMGhwLmgKQEAgLTAsMCArMSw3IEBACisvKiBwbGF0Zm9ybSBkYXRhIGZvciB0aGUgT1hVMjEwSFAgSENEICovCisKK3N0cnVjdCBveHUyMTBocF9wbGF0Zm9ybV9kYXRhIHsKKwl1bnNpZ25lZCBpbnQgYnVzMTY6MTsKKwl1bnNpZ25lZCBpbnQgdXNlX2hjZF9vdGc6MTsKKwl1bnNpZ25lZCBpbnQgdXNlX2hjZF9zcGg6MTsKK307CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BhZ2VfY2dyb3VwLmggYi9pbmNsdWRlL2xpbnV4L3BhZ2VfY2dyb3VwLmgKaW5kZXggMWU2ZDM0Yi4uNjAyY2MxZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9wYWdlX2Nncm91cC5oCisrKyBiL2luY2x1ZGUvbGludXgvcGFnZV9jZ3JvdXAuaApAQCAtMjYsMTAgKzI2LDYgQEAKIAlQQ0dfTE9DSywgIC8qIHBhZ2UgY2dyb3VwIGlzIGxvY2tlZCAqLwogCVBDR19DQUNIRSwgLyogY2hhcmdlZCBhcyBjYWNoZSAqLwogCVBDR19VU0VELCAvKiB0aGlzIG9iamVjdCBpcyBpbiB1c2UuICovCi0JLyogZmxhZ3MgZm9yIExSVSBwbGFjZW1lbnQgKi8KLQlQQ0dfQUNUSVZFLCAvKiBwYWdlIGlzIGFjdGl2ZSBpbiB0aGlzIGNncm91cCAqLwotCVBDR19GSUxFLCAvKiBwYWdlIGlzIGZpbGUgc3lzdGVtIGJhY2tlZCAqLwotCVBDR19VTkVWSUNUQUJMRSwgLyogcGFnZSBpcyB1bmV2aWN0YWJsZWFibGUgKi8KIH07CiAKICNkZWZpbmUgVEVTVFBDR0ZMQUcodW5hbWUsIGxuYW1lKQkJCVwKQEAgLTUwLDE5ICs0Niw2IEBACiBURVNUUENHRkxBRyhVc2VkLCBVU0VEKQogQ0xFQVJQQ0dGTEFHKFVzZWQsIFVTRUQpCiAKLS8qIExSVSBtYW5hZ2VtZW50IGZsYWdzIChmcm9tIGdsb2JhbC1scnUgZGVmaW5pdGlvbikgKi8KLVRFU1RQQ0dGTEFHKEZpbGUsIEZJTEUpCi1TRVRQQ0dGTEFHKEZpbGUsIEZJTEUpCi1DTEVBUlBDR0ZMQUcoRmlsZSwgRklMRSkKLQotVEVTVFBDR0ZMQUcoQWN0aXZlLCBBQ1RJVkUpCi1TRVRQQ0dGTEFHKEFjdGl2ZSwgQUNUSVZFKQotQ0xFQVJQQ0dGTEFHKEFjdGl2ZSwgQUNUSVZFKQotCi1URVNUUENHRkxBRyhVbmV2aWN0YWJsZSwgVU5FVklDVEFCTEUpCi1TRVRQQ0dGTEFHKFVuZXZpY3RhYmxlLCBVTkVWSUNUQUJMRSkKLUNMRUFSUENHRkxBRyhVbmV2aWN0YWJsZSwgVU5FVklDVEFCTEUpCi0KIHN0YXRpYyBpbmxpbmUgaW50IHBhZ2VfY2dyb3VwX25pZChzdHJ1Y3QgcGFnZV9jZ3JvdXAgKnBjKQogewogCXJldHVybiBwYWdlX3RvX25pZChwYy0+cGFnZSk7CkBAIC0xMDUsNCArODgsMzkgQEAKIH0KIAogI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfQ0dST1VQX01FTV9SRVNfQ1RMUl9TV0FQCisjaW5jbHVkZSA8bGludXgvc3dhcC5oPgorZXh0ZXJuIHN0cnVjdCBtZW1fY2dyb3VwICoKK3N3YXBfY2dyb3VwX3JlY29yZChzd3BfZW50cnlfdCBlbnQsIHN0cnVjdCBtZW1fY2dyb3VwICptZW0pOworZXh0ZXJuIHN0cnVjdCBtZW1fY2dyb3VwICpsb29rdXBfc3dhcF9jZ3JvdXAoc3dwX2VudHJ5X3QgZW50KTsKK2V4dGVybiBpbnQgc3dhcF9jZ3JvdXBfc3dhcG9uKGludCB0eXBlLCB1bnNpZ25lZCBsb25nIG1heF9wYWdlcyk7CitleHRlcm4gdm9pZCBzd2FwX2Nncm91cF9zd2Fwb2ZmKGludCB0eXBlKTsKKyNlbHNlCisjaW5jbHVkZSA8bGludXgvc3dhcC5oPgorCitzdGF0aWMgaW5saW5lCitzdHJ1Y3QgbWVtX2Nncm91cCAqc3dhcF9jZ3JvdXBfcmVjb3JkKHN3cF9lbnRyeV90IGVudCwgc3RydWN0IG1lbV9jZ3JvdXAgKm1lbSkKK3sKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGlubGluZQorc3RydWN0IG1lbV9jZ3JvdXAgKmxvb2t1cF9zd2FwX2Nncm91cChzd3BfZW50cnlfdCBlbnQpCit7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50Citzd2FwX2Nncm91cF9zd2Fwb24oaW50IHR5cGUsIHVuc2lnbmVkIGxvbmcgbWF4X3BhZ2VzKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc3dhcF9jZ3JvdXBfc3dhcG9mZihpbnQgdHlwZSkKK3sKKwlyZXR1cm47Cit9CisKKyNlbmRpZgogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BjaS1hY3BpLmggYi9pbmNsdWRlL2xpbnV4L3BjaS1hY3BpLmgKaW5kZXggODgzNzkyOC4uMDQyYzE2NiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9wY2ktYWNwaS5oCisrKyBiL2luY2x1ZGUvbGludXgvcGNpLWFjcGkuaApAQCAtOCw2ICs4LDggQEAKICNpZm5kZWYgX1BDSV9BQ1BJX0hfCiAjZGVmaW5lIF9QQ0lfQUNQSV9IXwogCisjaW5jbHVkZSA8bGludXgvYWNwaS5oPgorCiAjZGVmaW5lIE9TQ19RVUVSWV9UWVBFCQkJMAogI2RlZmluZSBPU0NfU1VQUE9SVF9UWVBFIAkJMQogI2RlZmluZSBPU0NfQ09OVFJPTF9UWVBFCQkyCkBAIC00OCwxNSArNTAsNyBAQAogCiAjaWZkZWYgQ09ORklHX0FDUEkKIGV4dGVybiBhY3BpX3N0YXR1cyBwY2lfb3NjX2NvbnRyb2xfc2V0KGFjcGlfaGFuZGxlIGhhbmRsZSwgdTMyIGZsYWdzKTsKLWV4dGVybiBhY3BpX3N0YXR1cyBfX3BjaV9vc2Nfc3VwcG9ydF9zZXQodTMyIGZsYWdzLCBjb25zdCBjaGFyICpoaWQpOwotc3RhdGljIGlubGluZSBhY3BpX3N0YXR1cyBwY2lfb3NjX3N1cHBvcnRfc2V0KHUzMiBmbGFncykKLXsKLQlyZXR1cm4gX19wY2lfb3NjX3N1cHBvcnRfc2V0KGZsYWdzLCBQQ0lfUk9PVF9ISURfU1RSSU5HKTsKLX0KLXN0YXRpYyBpbmxpbmUgYWNwaV9zdGF0dXMgcGNpZV9vc2Nfc3VwcG9ydF9zZXQodTMyIGZsYWdzKQotewotCXJldHVybiBfX3BjaV9vc2Nfc3VwcG9ydF9zZXQoZmxhZ3MsIFBDSV9FWFBSRVNTX1JPT1RfSElEX1NUUklORyk7Ci19CitpbnQgcGNpX2FjcGlfb3NjX3N1cHBvcnQoYWNwaV9oYW5kbGUgaGFuZGxlLCB1MzIgZmxhZ3MpOwogc3RhdGljIGlubGluZSBhY3BpX2hhbmRsZSBhY3BpX2ZpbmRfcm9vdF9icmlkZ2VfaGFuZGxlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQogewogCS8qIEZpbmQgcm9vdCBob3N0IGJyaWRnZSAqLwpAQCAtNjYsNiArNjAsMTUgQEAKIAlyZXR1cm4gYWNwaV9nZXRfcGNpX3Jvb3RicmlkZ2VfaGFuZGxlKHBjaV9kb21haW5fbnIocGRldi0+YnVzKSwKIAkJCXBkZXYtPmJ1cy0+bnVtYmVyKTsKIH0KKworc3RhdGljIGlubGluZSBhY3BpX2hhbmRsZSBhY3BpX3BjaV9nZXRfYnJpZGdlX2hhbmRsZShzdHJ1Y3QgcGNpX2J1cyAqcGJ1cykKK3sKKwlpbnQgc2VnID0gcGNpX2RvbWFpbl9ucihwYnVzKSwgYnVzbnIgPSBwYnVzLT5udW1iZXI7CisJc3RydWN0IHBjaV9kZXYgKmJyaWRnZSA9IHBidXMtPnNlbGY7CisJaWYgKGJyaWRnZSkKKwkJcmV0dXJuIERFVklDRV9BQ1BJX0hBTkRMRSgmKGJyaWRnZS0+ZGV2KSk7CisJcmV0dXJuIGFjcGlfZ2V0X3BjaV9yb290YnJpZGdlX2hhbmRsZShzZWcsIGJ1c25yKTsKK30KICNlbHNlCiAjaWYgIWRlZmluZWQoQUVfRVJST1IpCiB0eXBlZGVmIHUzMiAJCWFjcGlfc3RhdHVzOwpAQCAtNzMsOCArNzYsNiBAQAogI2VuZGlmICAgIAogc3RhdGljIGlubGluZSBhY3BpX3N0YXR1cyBwY2lfb3NjX2NvbnRyb2xfc2V0KGFjcGlfaGFuZGxlIGhhbmRsZSwgdTMyIGZsYWdzKQoge3JldHVybiBBRV9FUlJPUjt9Ci1zdGF0aWMgaW5saW5lIGFjcGlfc3RhdHVzIHBjaV9vc2Nfc3VwcG9ydF9zZXQodTMyIGZsYWdzKSB7cmV0dXJuIEFFX0VSUk9SO30gCi1zdGF0aWMgaW5saW5lIGFjcGlfc3RhdHVzIHBjaWVfb3NjX3N1cHBvcnRfc2V0KHUzMiBmbGFncykge3JldHVybiBBRV9FUlJPUjt9CiBzdGF0aWMgaW5saW5lIGFjcGlfaGFuZGxlIGFjcGlfZmluZF9yb290X2JyaWRnZV9oYW5kbGUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCiB7IHJldHVybiBOVUxMOyB9CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcGNpLmggYi9pbmNsdWRlL2xpbnV4L3BjaS5oCmluZGV4IDRiYjE1NmIuLjgwZjhiOGIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcGNpLmgKKysrIGIvaW5jbHVkZS9saW51eC9wY2kuaApAQCAtODIsNyArODIsMzAgQEAKICNkZWZpbmUgUENJX0RNQV9GUk9NREVWSUNFCTIKICNkZWZpbmUgUENJX0RNQV9OT05FCQkzCiAKLSNkZWZpbmUgREVWSUNFX0NPVU5UX1JFU09VUkNFCTEyCisvKgorICogIEZvciBQQ0kgZGV2aWNlcywgdGhlIHJlZ2lvbiBudW1iZXJzIGFyZSBhc3NpZ25lZCB0aGlzIHdheToKKyAqLworZW51bSB7CisJLyogIzAtNTogc3RhbmRhcmQgUENJIHJlc291cmNlcyAqLworCVBDSV9TVERfUkVTT1VSQ0VTLAorCVBDSV9TVERfUkVTT1VSQ0VfRU5EID0gNSwKKworCS8qICM2OiBleHBhbnNpb24gUk9NIHJlc291cmNlICovCisJUENJX1JPTV9SRVNPVVJDRSwKKworCS8qIHJlc291cmNlcyBhc3NpZ25lZCB0byBidXNlcyBiZWhpbmQgdGhlIGJyaWRnZSAqLworI2RlZmluZSBQQ0lfQlJJREdFX1JFU09VUkNFX05VTSA0CisKKwlQQ0lfQlJJREdFX1JFU09VUkNFUywKKwlQQ0lfQlJJREdFX1JFU09VUkNFX0VORCA9IFBDSV9CUklER0VfUkVTT1VSQ0VTICsKKwkJCQkgIFBDSV9CUklER0VfUkVTT1VSQ0VfTlVNIC0gMSwKKworCS8qIHRvdGFsIHJlc291cmNlcyBhc3NvY2lhdGVkIHdpdGggYSBQQ0kgZGV2aWNlICovCisJUENJX05VTV9SRVNPVVJDRVMsCisKKwkvKiBwcmVzZXJ2ZSB0aGlzIGZvciBjb21wYXRpYmlsaXR5ICovCisJREVWSUNFX0NPVU5UX1JFU09VUkNFCit9OwogCiB0eXBlZGVmIGludCBfX2JpdHdpc2UgcGNpX3Bvd2VyX3Q7CiAKQEAgLTI3NCwxOCArMjk3LDYgQEAKIAlobGlzdF9hZGRfaGVhZCgmbmV3X2NhcC0+bmV4dCwgJnBjaV9kZXYtPnNhdmVkX2NhcF9zcGFjZSk7CiB9CiAKLS8qCi0gKiAgRm9yIFBDSSBkZXZpY2VzLCB0aGUgcmVnaW9uIG51bWJlcnMgYXJlIGFzc2lnbmVkIHRoaXMgd2F5OgotICoKLSAqCTAtNQlzdGFuZGFyZCBQQ0kgcmVnaW9ucwotICoJNglleHBhbnNpb24gUk9NCi0gKgk3LTEwCWJyaWRnZXM6IGFkZHJlc3Mgc3BhY2UgYXNzaWduZWQgdG8gYnVzZXMgYmVoaW5kIHRoZSBicmlkZ2UKLSAqLwotCi0jZGVmaW5lIFBDSV9ST01fUkVTT1VSQ0UJNgotI2RlZmluZSBQQ0lfQlJJREdFX1JFU09VUkNFUwk3Ci0jZGVmaW5lIFBDSV9OVU1fUkVTT1VSQ0VTCTExCi0KICNpZm5kZWYgUENJX0JVU19OVU1fUkVTT1VSQ0VTCiAjZGVmaW5lIFBDSV9CVVNfTlVNX1JFU09VUkNFUwkxNgogI2VuZGlmCkBAIC0zMjUsNiArMzM2LDE1IEBACiAjZGVmaW5lIHBjaV9idXNfYihuKQlsaXN0X2VudHJ5KG4sIHN0cnVjdCBwY2lfYnVzLCBub2RlKQogI2RlZmluZSB0b19wY2lfYnVzKG4pCWNvbnRhaW5lcl9vZihuLCBzdHJ1Y3QgcGNpX2J1cywgZGV2KQogCisjaWZkZWYgQ09ORklHX1BDSV9NU0kKK3N0YXRpYyBpbmxpbmUgYm9vbCBwY2lfZGV2X21zaV9lbmFibGVkKHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2KQoreworCXJldHVybiBwY2lfZGV2LT5tc2lfZW5hYmxlZCB8fCBwY2lfZGV2LT5tc2l4X2VuYWJsZWQ7Cit9CisjZWxzZQorc3RhdGljIGlubGluZSBib29sIHBjaV9kZXZfbXNpX2VuYWJsZWQoc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYpIHsgcmV0dXJuIGZhbHNlOyB9CisjZW5kaWYKKwogLyoKICAqIEVycm9yIHZhbHVlcyB0aGF0IG1heSBiZSByZXR1cm5lZCBieSBQQ0kgZnVuY3Rpb25zLgogICovCkBAIC01MzIsNyArNTUyLDkgQEAKIHZvaWQgcGNpX3JlYWRfYnJpZGdlX2Jhc2VzKHN0cnVjdCBwY2lfYnVzICpjaGlsZCk7CiBzdHJ1Y3QgcmVzb3VyY2UgKnBjaV9maW5kX3BhcmVudF9yZXNvdXJjZShjb25zdCBzdHJ1Y3QgcGNpX2RldiAqZGV2LAogCQkJCQkgIHN0cnVjdCByZXNvdXJjZSAqcmVzKTsKK3U4IHBjaV9zd2l6emxlX2ludGVycnVwdF9waW4oc3RydWN0IHBjaV9kZXYgKmRldiwgdTggcGluKTsKIGludCBwY2lfZ2V0X2ludGVycnVwdF9waW4oc3RydWN0IHBjaV9kZXYgKmRldiwgc3RydWN0IHBjaV9kZXYgKipicmlkZ2UpOwordTggcGNpX2NvbW1vbl9zd2l6emxlKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4ICpwaW5wKTsKIGV4dGVybiBzdHJ1Y3QgcGNpX2RldiAqcGNpX2Rldl9nZXQoc3RydWN0IHBjaV9kZXYgKmRldik7CiBleHRlcm4gdm9pZCBwY2lfZGV2X3B1dChzdHJ1Y3QgcGNpX2RldiAqZGV2KTsKIGV4dGVybiB2b2lkIHBjaV9yZW1vdmVfYnVzKHN0cnVjdCBwY2lfYnVzICpiKTsKQEAgLTYyOSw2ICs2NTEsNyBAQAogCiB2b2lkIHBjaV9kaXNhYmxlX2RldmljZShzdHJ1Y3QgcGNpX2RldiAqZGV2KTsKIHZvaWQgcGNpX3NldF9tYXN0ZXIoc3RydWN0IHBjaV9kZXYgKmRldik7Cit2b2lkIHBjaV9jbGVhcl9tYXN0ZXIoc3RydWN0IHBjaV9kZXYgKmRldik7CiBpbnQgcGNpX3NldF9wY2llX3Jlc2V0X3N0YXRlKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGVudW0gcGNpZV9yZXNldF9zdGF0ZSBzdGF0ZSk7CiAjZGVmaW5lIEhBVkVfUENJX1NFVF9NV0kKIGludCBfX211c3RfY2hlY2sgcGNpX3NldF9td2koc3RydWN0IHBjaV9kZXYgKmRldik7CkBAIC02NDcsNyArNjcwLDcgQEAKIGludCBwY2llX3NldF9yZWFkcnEoc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IHJxKTsKIGludCBwY2lfcmVzZXRfZnVuY3Rpb24oc3RydWN0IHBjaV9kZXYgKmRldik7CiBpbnQgcGNpX2V4ZWN1dGVfcmVzZXRfZnVuY3Rpb24oc3RydWN0IHBjaV9kZXYgKmRldik7Ci12b2lkIHBjaV91cGRhdGVfcmVzb3VyY2Uoc3RydWN0IHBjaV9kZXYgKmRldiwgc3RydWN0IHJlc291cmNlICpyZXMsIGludCByZXNubyk7Cit2b2lkIHBjaV91cGRhdGVfcmVzb3VyY2Uoc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IHJlc25vKTsKIGludCBfX211c3RfY2hlY2sgcGNpX2Fzc2lnbl9yZXNvdXJjZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgaSk7CiBpbnQgcGNpX3NlbGVjdF9iYXJzKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpOwogCkBAIC02NzQsNiArNjk3LDExIEBACiAvKiBGdW5jdGlvbnMgZm9yIFBDSSBIb3RwbHVnIGRyaXZlcnMgdG8gdXNlICovCiBpbnQgcGNpX2J1c19maW5kX2NhcGFiaWxpdHkoc3RydWN0IHBjaV9idXMgKmJ1cywgdW5zaWduZWQgaW50IGRldmZuLCBpbnQgY2FwKTsKIAorLyogVml0YWwgcHJvZHVjdCBkYXRhIHJvdXRpbmVzICovCitzc2l6ZV90IHBjaV9yZWFkX3ZwZChzdHJ1Y3QgcGNpX2RldiAqZGV2LCBsb2ZmX3QgcG9zLCBzaXplX3QgY291bnQsIHZvaWQgKmJ1Zik7Citzc2l6ZV90IHBjaV93cml0ZV92cGQoc3RydWN0IHBjaV9kZXYgKmRldiwgbG9mZl90IHBvcywgc2l6ZV90IGNvdW50LCBjb25zdCB2b2lkICpidWYpOworaW50IHBjaV92cGRfdHJ1bmNhdGUoc3RydWN0IHBjaV9kZXYgKmRldiwgc2l6ZV90IHNpemUpOworCiAvKiBIZWxwZXIgZnVuY3Rpb25zIGZvciBsb3ctbGV2ZWwgY29kZSAoZHJpdmVycy9wY2kvc2V0dXAtW2J1cyxyZXNdLmMpICovCiB2b2lkIHBjaV9idXNfYXNzaWduX3Jlc291cmNlcyhzdHJ1Y3QgcGNpX2J1cyAqYnVzKTsKIHZvaWQgcGNpX2J1c19zaXplX2JyaWRnZXMoc3RydWN0IHBjaV9idXMgKmJ1cyk7CkBAIC02ODYsMTAgKzcxNCwxMyBAQAogCQkgICAgaW50ICgqKShzdHJ1Y3QgcGNpX2RldiAqLCB1OCwgdTgpKTsKICNkZWZpbmUgSEFWRV9QQ0lfUkVRX1JFR0lPTlMJMgogaW50IF9fbXVzdF9jaGVjayBwY2lfcmVxdWVzdF9yZWdpb25zKHN0cnVjdCBwY2lfZGV2ICosIGNvbnN0IGNoYXIgKik7CitpbnQgX19tdXN0X2NoZWNrIHBjaV9yZXF1ZXN0X3JlZ2lvbnNfZXhjbHVzaXZlKHN0cnVjdCBwY2lfZGV2ICosIGNvbnN0IGNoYXIgKik7CiB2b2lkIHBjaV9yZWxlYXNlX3JlZ2lvbnMoc3RydWN0IHBjaV9kZXYgKik7CiBpbnQgX19tdXN0X2NoZWNrIHBjaV9yZXF1ZXN0X3JlZ2lvbihzdHJ1Y3QgcGNpX2RldiAqLCBpbnQsIGNvbnN0IGNoYXIgKik7CitpbnQgX19tdXN0X2NoZWNrIHBjaV9yZXF1ZXN0X3JlZ2lvbl9leGNsdXNpdmUoc3RydWN0IHBjaV9kZXYgKiwgaW50LCBjb25zdCBjaGFyICopOwogdm9pZCBwY2lfcmVsZWFzZV9yZWdpb24oc3RydWN0IHBjaV9kZXYgKiwgaW50KTsKIGludCBwY2lfcmVxdWVzdF9zZWxlY3RlZF9yZWdpb25zKHN0cnVjdCBwY2lfZGV2ICosIGludCwgY29uc3QgY2hhciAqKTsKK2ludCBwY2lfcmVxdWVzdF9zZWxlY3RlZF9yZWdpb25zX2V4Y2x1c2l2ZShzdHJ1Y3QgcGNpX2RldiAqLCBpbnQsIGNvbnN0IGNoYXIgKik7CiB2b2lkIHBjaV9yZWxlYXNlX3NlbGVjdGVkX3JlZ2lvbnMoc3RydWN0IHBjaV9kZXYgKiwgaW50KTsKIAogLyogZHJpdmVycy9wY2kvYnVzLmMgKi8KQEAgLTc3OSw2ICs4MTAsMTAgQEAKIAogc3RhdGljIGlubGluZSB2b2lkIHBjaV9yZXN0b3JlX21zaV9zdGF0ZShzdHJ1Y3QgcGNpX2RldiAqZGV2KQogeyB9CitzdGF0aWMgaW5saW5lIGludCBwY2lfbXNpX2VuYWJsZWQodm9pZCkKK3sKKwlyZXR1cm4gMDsKK30KICNlbHNlCiBleHRlcm4gaW50IHBjaV9lbmFibGVfbXNpKHN0cnVjdCBwY2lfZGV2ICpkZXYpOwogZXh0ZXJuIHZvaWQgcGNpX21zaV9zaHV0ZG93bihzdHJ1Y3QgcGNpX2RldiAqZGV2KTsKQEAgLTc4OSw2ICs4MjQsMTYgQEAKIGV4dGVybiB2b2lkIHBjaV9kaXNhYmxlX21zaXgoc3RydWN0IHBjaV9kZXYgKmRldik7CiBleHRlcm4gdm9pZCBtc2lfcmVtb3ZlX3BjaV9pcnFfdmVjdG9ycyhzdHJ1Y3QgcGNpX2RldiAqZGV2KTsKIGV4dGVybiB2b2lkIHBjaV9yZXN0b3JlX21zaV9zdGF0ZShzdHJ1Y3QgcGNpX2RldiAqZGV2KTsKK2V4dGVybiBpbnQgcGNpX21zaV9lbmFibGVkKHZvaWQpOworI2VuZGlmCisKKyNpZm5kZWYgQ09ORklHX1BDSUVBU1BNCitzdGF0aWMgaW5saW5lIGludCBwY2llX2FzcG1fZW5hYmxlZCh2b2lkKQoreworCXJldHVybiAwOworfQorI2Vsc2UKK2V4dGVybiBpbnQgcGNpZV9hc3BtX2VuYWJsZWQodm9pZCk7CiAjZW5kaWYKIAogI2lmZGVmIENPTkZJR19IVF9JUlEKQEAgLTExNDAsMjAgKzExODUsOSBAQAogc3RhdGljIGlubGluZSB2b2lkIHBjaV9tbWNmZ19sYXRlX2luaXQodm9pZCkgeyB9CiAjZW5kaWYKIAotI2lmZGVmIENPTkZJR19IQVNfSU9NRU0KLXN0YXRpYyBpbmxpbmUgdm9pZCBfX2lvbWVtICpwY2lfaW9yZW1hcF9iYXIoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGludCBiYXIpCi17Ci0JLyoKLQkgKiBNYWtlIHN1cmUgdGhlIEJBUiBpcyBhY3R1YWxseSBhIG1lbW9yeSByZXNvdXJjZSwgbm90IGFuIElPIHJlc291cmNlCi0JICovCi0JaWYgKCEocGNpX3Jlc291cmNlX2ZsYWdzKHBkZXYsIGJhcikgJiBJT1JFU09VUkNFX01FTSkpIHsKLQkJV0FSTl9PTigxKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiBpb3JlbWFwX25vY2FjaGUocGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIGJhciksCi0JCQkJICAgICBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIGJhcikpOwotfQotI2VuZGlmCitpbnQgcGNpX2V4dF9jZmdfYXZhaWwoc3RydWN0IHBjaV9kZXYgKmRldik7CisKK3ZvaWQgX19pb21lbSAqcGNpX2lvcmVtYXBfYmFyKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBpbnQgYmFyKTsKIAogI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KICNlbmRpZiAvKiBMSU5VWF9QQ0lfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wY2lfaG90cGx1Zy5oIGIvaW5jbHVkZS9saW51eC9wY2lfaG90cGx1Zy5oCmluZGV4IGEwMGJkMWEuLjIwOTk4NzQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcGNpX2hvdHBsdWcuaAorKysgYi9pbmNsdWRlL2xpbnV4L3BjaV9ob3RwbHVnLmgKQEAgLTIyMywxMSArMjIzLDEyIEBACiAjaWZkZWYgQ09ORklHX0FDUEkKICNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KICNpbmNsdWRlIDxhY3BpL2FjcGlfYnVzLmg+Ci0jaW5jbHVkZSA8YWNwaS9hY3R5cGVzLmg+CiBleHRlcm4gYWNwaV9zdGF0dXMgYWNwaV9nZXRfaHBfcGFyYW1zX2Zyb21fZmlybXdhcmUoc3RydWN0IHBjaV9idXMgKmJ1cywKIAkJCQlzdHJ1Y3QgaG90cGx1Z19wYXJhbXMgKmhwcCk7CiBpbnQgYWNwaV9nZXRfaHBfaHdfY29udHJvbF9mcm9tX2Zpcm13YXJlKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHUzMiBmbGFncyk7CiBpbnQgYWNwaV9yb290X2JyaWRnZShhY3BpX2hhbmRsZSBoYW5kbGUpOworaW50IGFjcGlfcGNpX2NoZWNrX2VqZWN0YWJsZShzdHJ1Y3QgcGNpX2J1cyAqcGJ1cywgYWNwaV9oYW5kbGUgaGFuZGxlKTsKK2ludCBhY3BpX3BjaV9kZXRlY3RfZWplY3RhYmxlKHN0cnVjdCBwY2lfYnVzICpwYnVzKTsKICNlbmRpZgogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcGNpX2lkcy5oIGIvaW5jbHVkZS9saW51eC9wY2lfaWRzLmgKaW5kZXggZDU0MzM2NS4uZDU2YWQ5YyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9wY2lfaWRzLmgKKysrIGIvaW5jbHVkZS9saW51eC9wY2lfaWRzLmgKQEAgLTIxNzQsNiArMjE3NCw3IEBACiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfUkRDX1I2MDQwCQkweDYwNDAKICNkZWZpbmUgUENJX0RFVklDRV9JRF9SRENfUjYwNjAJCTB4NjA2MAogI2RlZmluZSBQQ0lfREVWSUNFX0lEX1JEQ19SNjA2MQkJMHg2MDYxCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfUkRDX0QxMDEwCQkweDEwMTAKIAogI2RlZmluZSBQQ0lfVkVORE9SX0lEX0xFTk9WTwkJMHgxN2FhCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcGNpX3JlZ3MuaCBiL2luY2x1ZGUvbGludXgvcGNpX3JlZ3MuaAppbmRleCBlNWVmZmQ0Li4wMjc4MTViIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BjaV9yZWdzLmgKKysrIGIvaW5jbHVkZS9saW51eC9wY2lfcmVncy5oCkBAIC0yMTAsNiArMjEwLDcgQEAKICNkZWZpbmUgIFBDSV9DQVBfSURfQUdQMwkweDBFCS8qIEFHUCBUYXJnZXQgUENJLVBDSSBicmlkZ2UgKi8KICNkZWZpbmUgIFBDSV9DQVBfSURfRVhQIAkweDEwCS8qIFBDSSBFeHByZXNzICovCiAjZGVmaW5lICBQQ0lfQ0FQX0lEX01TSVgJMHgxMQkvKiBNU0ktWCAqLworI2RlZmluZSAgUENJX0NBUF9JRF9BRgkJMHgxMwkvKiBQQ0kgQWR2YW5jZWQgRmVhdHVyZXMgKi8KICNkZWZpbmUgUENJX0NBUF9MSVNUX05FWFQJMQkvKiBOZXh0IGNhcGFiaWxpdHkgaW4gdGhlIGxpc3QgKi8KICNkZWZpbmUgUENJX0NBUF9GTEFHUwkJMgkvKiBDYXBhYmlsaXR5IGRlZmluZWQgZmxhZ3MgKDE2IGJpdHMpICovCiAjZGVmaW5lIFBDSV9DQVBfU0laRU9GCQk0CkBAIC0zMTYsNiArMzE3LDE3IEBACiAjZGVmaW5lICBQQ0lfQ0hTV1BfRVhUCQkweDQwCS8qIEVOVU0jIHN0YXR1cyAtIGV4dHJhY3Rpb24gKi8KICNkZWZpbmUgIFBDSV9DSFNXUF9JTlMJCTB4ODAJLyogRU5VTSMgc3RhdHVzIC0gaW5zZXJ0aW9uICovCiAKKy8qIFBDSSBBZHZhbmNlZCBGZWF0dXJlIHJlZ2lzdGVycyAqLworCisjZGVmaW5lIFBDSV9BRl9MRU5HVEgJCTIKKyNkZWZpbmUgUENJX0FGX0NBUAkJMworI2RlZmluZSAgUENJX0FGX0NBUF9UUAkJMHgwMQorI2RlZmluZSAgUENJX0FGX0NBUF9GTFIJCTB4MDIKKyNkZWZpbmUgUENJX0FGX0NUUkwJCTQKKyNkZWZpbmUgIFBDSV9BRl9DVFJMX0ZMUgkweDAxCisjZGVmaW5lIFBDSV9BRl9TVEFUVVMJCTUKKyNkZWZpbmUgIFBDSV9BRl9TVEFUVVNfVFAJMHgwMQorCiAvKiBQQ0ktWCByZWdpc3RlcnMgKi8KIAogI2RlZmluZSBQQ0lfWF9DTUQJCTIJLyogTW9kZXMgJiBGZWF0dXJlcyAqLwpAQCAtMzk5LDIwICs0MTEsNzAgQEAKICNkZWZpbmUgIFBDSV9FWFBfREVWU1RBX0FVWFBECTB4MTAJLyogQVVYIFBvd2VyIERldGVjdGVkICovCiAjZGVmaW5lICBQQ0lfRVhQX0RFVlNUQV9UUlBORAkweDIwCS8qIFRyYW5zYWN0aW9ucyBQZW5kaW5nICovCiAjZGVmaW5lIFBDSV9FWFBfTE5LQ0FQCQkxMgkvKiBMaW5rIENhcGFiaWxpdGllcyAqLwotI2RlZmluZSAgUENJX0VYUF9MTktDQVBfQVNQTVMJMHhjMDAJLyogQVNQTSBTdXBwb3J0ICovCi0jZGVmaW5lICBQQ0lfRVhQX0xOS0NBUF9MMFNFTAkweDcwMDAJLyogTDBzIEV4aXQgTGF0ZW5jeSAqLwotI2RlZmluZSAgUENJX0VYUF9MTktDQVBfTDFFTAkweDM4MDAwCS8qIEwxIEV4aXQgTGF0ZW5jeSAqLwotI2RlZmluZSAgUENJX0VYUF9MTktDQVBfQ0xLUE0JMHg0MDAwMAkvKiBMMSBDbG9jayBQb3dlciBNYW5hZ2VtZW50ICovCisjZGVmaW5lICBQQ0lfRVhQX0xOS0NBUF9TTFMJMHgwMDAwMDAwZiAvKiBTdXBwb3J0ZWQgTGluayBTcGVlZHMgKi8KKyNkZWZpbmUgIFBDSV9FWFBfTE5LQ0FQX01MVwkweDAwMDAwM2YwIC8qIE1heGltdW0gTGluayBXaWR0aCAqLworI2RlZmluZSAgUENJX0VYUF9MTktDQVBfQVNQTVMJMHgwMDAwMGMwMCAvKiBBU1BNIFN1cHBvcnQgKi8KKyNkZWZpbmUgIFBDSV9FWFBfTE5LQ0FQX0wwU0VMCTB4MDAwMDcwMDAgLyogTDBzIEV4aXQgTGF0ZW5jeSAqLworI2RlZmluZSAgUENJX0VYUF9MTktDQVBfTDFFTAkweDAwMDM4MDAwIC8qIEwxIEV4aXQgTGF0ZW5jeSAqLworI2RlZmluZSAgUENJX0VYUF9MTktDQVBfQ0xLUE0JMHgwMDA0MDAwMCAvKiBMMSBDbG9jayBQb3dlciBNYW5hZ2VtZW50ICovCisjZGVmaW5lICBQQ0lfRVhQX0xOS0NBUF9TREVSQwkweDAwMDgwMDAwIC8qIFN1cHJpc2UgRG93biBFcnJvciBSZXBvcnRpbmcgQ2FwYWJsZSAqLworI2RlZmluZSAgUENJX0VYUF9MTktDQVBfRExMTEFSQwkweDAwMTAwMDAwIC8qIERhdGEgTGluayBMYXllciBMaW5rIEFjdGl2ZSBSZXBvcnRpbmcgQ2FwYWJsZSAqLworI2RlZmluZSAgUENJX0VYUF9MTktDQVBfTEJOQwkweDAwMjAwMDAwIC8qIExpbmsgQmFuZHdpZHRoIE5vdGlmaWNhdGlvbiBDYXBhYmlsaXR5ICovCisjZGVmaW5lICBQQ0lfRVhQX0xOS0NBUF9QTgkweGZmMDAwMDAwIC8qIFBvcnQgTnVtYmVyICovCiAjZGVmaW5lIFBDSV9FWFBfTE5LQ1RMCQkxNgkvKiBMaW5rIENvbnRyb2wgKi8KLSNkZWZpbmUgIFBDSV9FWFBfTE5LQ1RMX1JMCTB4MjAJLyogUmV0cmFpbiBMaW5rICovCi0jZGVmaW5lICBQQ0lfRVhQX0xOS0NUTF9DQ0MJMHg0MAkvKiBDb21tb24gQ2xvY2sgQ09uZmlndXJhdGlvbiAqLworI2RlZmluZSAgUENJX0VYUF9MTktDVExfQVNQTUMJMHgwMDAzCS8qIEFTUE0gQ29udHJvbCAqLworI2RlZmluZSAgUENJX0VYUF9MTktDVExfUkNCCTB4MDAwOAkvKiBSZWFkIENvbXBsZXRpb24gQm91bmRhcnkgKi8KKyNkZWZpbmUgIFBDSV9FWFBfTE5LQ1RMX0xECTB4MDAxMAkvKiBMaW5rIERpc2FibGUgKi8KKyNkZWZpbmUgIFBDSV9FWFBfTE5LQ1RMX1JMCTB4MDAyMAkvKiBSZXRyYWluIExpbmsgKi8KKyNkZWZpbmUgIFBDSV9FWFBfTE5LQ1RMX0NDQwkweDAwNDAJLyogQ29tbW9uIENsb2NrIENvbmZpZ3VyYXRpb24gKi8KKyNkZWZpbmUgIFBDSV9FWFBfTE5LQ1RMX0VTCTB4MDA4MAkvKiBFeHRlbmRlZCBTeW5jaCAqLwogI2RlZmluZSAgUENJX0VYUF9MTktDVExfQ0xLUkVRX0VOIDB4MTAwCS8qIEVuYWJsZSBjbGtyZXEgKi8KKyNkZWZpbmUgIFBDSV9FWFBfTE5LQ1RMX0hBV0QJMHgwMjAwCS8qIEhhcmR3YXJlIEF1dG9ub21vdXMgV2lkdGggRGlzYWJsZSAqLworI2RlZmluZSAgUENJX0VYUF9MTktDVExfTEJNSUUJMHgwNDAwCS8qIExpbmsgQmFuZHdpZHRoIE1hbmFnZW1lbnQgSW50ZXJydXB0IEVuYWJsZSAqLworI2RlZmluZSAgUENJX0VYUF9MTktDVExfTEFCSUUJMHgwODAwCS8qIExuayBBdXRvbm9tb3VzIEJhbmR3aWR0aCBJbnRlcnJ1cHQgRW5hYmxlICovCiAjZGVmaW5lIFBDSV9FWFBfTE5LU1RBCQkxOAkvKiBMaW5rIFN0YXR1cyAqLwotI2RlZmluZSAgUENJX0VYUF9MTktTVEFfTFQJMHg4MDAJLyogTGluayBUcmFpbmluZyAqLworI2RlZmluZSAgUENJX0VYUF9MTktTVEFfQ0xTCTB4MDAwZgkvKiBDdXJyZW50IExpbmsgU3BlZWQgKi8KKyNkZWZpbmUgIFBDSV9FWFBfTE5LU1RBX05MVwkweDAzZjAJLyogTm9nb3RpYXRlZCBMaW5rIFdpZHRoICovCisjZGVmaW5lICBQQ0lfRVhQX0xOS1NUQV9MVAkweDA4MDAJLyogTGluayBUcmFpbmluZyAqLwogI2RlZmluZSAgUENJX0VYUF9MTktTVEFfU0xDCTB4MTAwMAkvKiBTbG90IENsb2NrIENvbmZpZ3VyYXRpb24gKi8KKyNkZWZpbmUgIFBDSV9FWFBfTE5LU1RBX0RMTExBCTB4MjAwMAkvKiBEYXRhIExpbmsgTGF5ZXIgTGluayBBY3RpdmUgKi8KKyNkZWZpbmUgIFBDSV9FWFBfTE5LU1RBX0xCTVMJMHg0MDAwCS8qIExpbmsgQmFuZHdpZHRoIE1hbmFnZW1lbnQgU3RhdHVzICovCisjZGVmaW5lICBQQ0lfRVhQX0xOS1NUQV9MQUJTCTB4ODAwMAkvKiBMaW5rIEF1dG9ub21vdXMgQmFuZHdpZHRoIFN0YXR1cyAqLwogI2RlZmluZSBQQ0lfRVhQX1NMVENBUAkJMjAJLyogU2xvdCBDYXBhYmlsaXRpZXMgKi8KKyNkZWZpbmUgIFBDSV9FWFBfU0xUQ0FQX0FCUAkweDAwMDAwMDAxIC8qIEF0dGVudGlvbiBCdXR0b24gUHJlc2VudCAqLworI2RlZmluZSAgUENJX0VYUF9TTFRDQVBfUENQCTB4MDAwMDAwMDIgLyogUG93ZXIgQ29udHJvbGxlciBQcmVzZW50ICovCisjZGVmaW5lICBQQ0lfRVhQX1NMVENBUF9NUkxTUAkweDAwMDAwMDA0IC8qIE1STCBTZW5zb3IgUHJlc2VudCAqLworI2RlZmluZSAgUENJX0VYUF9TTFRDQVBfQUlQCTB4MDAwMDAwMDggLyogQXR0ZW50aW9uIEluZGljYXRvciBQcmVzZW50ICovCisjZGVmaW5lICBQQ0lfRVhQX1NMVENBUF9QSVAJMHgwMDAwMDAxMCAvKiBQb3dlciBJbmRpY2F0b3IgUHJlc2VudCAqLworI2RlZmluZSAgUENJX0VYUF9TTFRDQVBfSFBTCTB4MDAwMDAwMjAgLyogSG90LVBsdWcgU3VycHJpc2UgKi8KKyNkZWZpbmUgIFBDSV9FWFBfU0xUQ0FQX0hQQwkweDAwMDAwMDQwIC8qIEhvdC1QbHVnIENhcGFibGUgKi8KKyNkZWZpbmUgIFBDSV9FWFBfU0xUQ0FQX1NQTFYJMHgwMDAwN2Y4MCAvKiBTbG90IFBvd2VyIExpbWl0IFZhbHVlICovCisjZGVmaW5lICBQQ0lfRVhQX1NMVENBUF9TUExTCTB4MDAwMTgwMDAgLyogU2xvdCBQb3dlciBMaW1pdCBTY2FsZSAqLworI2RlZmluZSAgUENJX0VYUF9TTFRDQVBfRUlQCTB4MDAwMjAwMDAgLyogRWxlY3Ryb21lY2hhbmljYWwgSW50ZXJsb2NrIFByZXNlbnQgKi8KKyNkZWZpbmUgIFBDSV9FWFBfU0xUQ0FQX05DQ1MJMHgwMDA0MDAwMCAvKiBObyBDb21tYW5kIENvbXBsZXRlZCBTdXBwb3J0ICovCisjZGVmaW5lICBQQ0lfRVhQX1NMVENBUF9QU04JMHhmZmY4MDAwMCAvKiBQaHlzaWNhbCBTbG90IE51bWJlciAqLwogI2RlZmluZSBQQ0lfRVhQX1NMVENUTAkJMjQJLyogU2xvdCBDb250cm9sICovCisjZGVmaW5lICBQQ0lfRVhQX1NMVENUTF9BQlBFCTB4MDAwMQkvKiBBdHRlbnRpb24gQnV0dG9uIFByZXNzZWQgRW5hYmxlICovCisjZGVmaW5lICBQQ0lfRVhQX1NMVENUTF9QRkRFCTB4MDAwMgkvKiBQb3dlciBGYXVsdCBEZXRlY3RlZCBFbmFibGUgKi8KKyNkZWZpbmUgIFBDSV9FWFBfU0xUQ1RMX01STFNDRQkweDAwMDQJLyogTVJMIFNlbnNvciBDaGFuZ2VkIEVuYWJsZSAqLworI2RlZmluZSAgUENJX0VYUF9TTFRDVExfUERDRQkweDAwMDgJLyogUHJlc2VuY2UgRGV0ZWN0IENoYW5nZWQgRW5hYmxlICovCisjZGVmaW5lICBQQ0lfRVhQX1NMVENUTF9DQ0lFCTB4MDAxMAkvKiBDb21tYW5kIENvbXBsZXRlZCBJbnRlcnJ1cHQgRW5hYmxlICovCisjZGVmaW5lICBQQ0lfRVhQX1NMVENUTF9IUElFCTB4MDAyMAkvKiBIb3QtUGx1ZyBJbnRlcnJ1cHQgRW5hYmxlICovCisjZGVmaW5lICBQQ0lfRVhQX1NMVENUTF9BSUMJMHgwMGMwCS8qIEF0dGVudGlvbiBJbmRpY2F0b3IgQ29udHJvbCAqLworI2RlZmluZSAgUENJX0VYUF9TTFRDVExfUElDCTB4MDMwMAkvKiBQb3dlciBJbmRpY2F0b3IgQ29udHJvbCAqLworI2RlZmluZSAgUENJX0VYUF9TTFRDVExfUENDCTB4MDQwMAkvKiBQb3dlciBDb250cm9sbGVyIENvbnRyb2wgKi8KKyNkZWZpbmUgIFBDSV9FWFBfU0xUQ1RMX0VJQwkweDA4MDAJLyogRWxlY3Ryb21lY2hhbmljYWwgSW50ZXJsb2NrIENvbnRyb2wgKi8KKyNkZWZpbmUgIFBDSV9FWFBfU0xUQ1RMX0RMTFNDRQkweDEwMDAJLyogRGF0YSBMaW5rIExheWVyIFN0YXRlIENoYW5nZWQgRW5hYmxlICovCiAjZGVmaW5lIFBDSV9FWFBfU0xUU1RBCQkyNgkvKiBTbG90IFN0YXR1cyAqLworI2RlZmluZSAgUENJX0VYUF9TTFRTVEFfQUJQCTB4MDAwMQkvKiBBdHRlbnRpb24gQnV0dG9uIFByZXNzZWQgKi8KKyNkZWZpbmUgIFBDSV9FWFBfU0xUU1RBX1BGRAkweDAwMDIJLyogUG93ZXIgRmF1bHQgRGV0ZWN0ZWQgKi8KKyNkZWZpbmUgIFBDSV9FWFBfU0xUU1RBX01STFNDCTB4MDAwNAkvKiBNUkwgU2Vuc29yIENoYW5nZWQgKi8KKyNkZWZpbmUgIFBDSV9FWFBfU0xUU1RBX1BEQwkweDAwMDgJLyogUHJlc2VuY2UgRGV0ZWN0IENoYW5nZWQgKi8KKyNkZWZpbmUgIFBDSV9FWFBfU0xUU1RBX0NDCTB4MDAxMAkvKiBDb21tYW5kIENvbXBsZXRlZCAqLworI2RlZmluZSAgUENJX0VYUF9TTFRTVEFfTVJMU1MJMHgwMDIwCS8qIE1STCBTZW5zb3IgU3RhdGUgKi8KKyNkZWZpbmUgIFBDSV9FWFBfU0xUU1RBX1BEUwkweDAwNDAJLyogUHJlc2VuY2UgRGV0ZWN0IFN0YXRlICovCisjZGVmaW5lICBQQ0lfRVhQX1NMVFNUQV9FSVMJMHgwMDgwCS8qIEVsZWN0cm9tZWNoYW5pY2FsIEludGVybG9jayBTdGF0dXMgKi8KKyNkZWZpbmUgIFBDSV9FWFBfU0xUU1RBX0RMTFNDCTB4MDEwMAkvKiBEYXRhIExpbmsgTGF5ZXIgU3RhdGUgQ2hhbmdlZCAqLwogI2RlZmluZSBQQ0lfRVhQX1JUQ1RMCQkyOAkvKiBSb290IENvbnRyb2wgKi8KICNkZWZpbmUgIFBDSV9FWFBfUlRDVExfU0VDRUUJMHgwMQkvKiBTeXN0ZW0gRXJyb3Igb24gQ29ycmVjdGFibGUgRXJyb3IgKi8KICNkZWZpbmUgIFBDSV9FWFBfUlRDVExfU0VORkVFCTB4MDIJLyogU3lzdGVtIEVycm9yIG9uIE5vbi1GYXRhbCBFcnJvciAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9waGFudG9tLmggYi9pbmNsdWRlL2xpbnV4L3BoYW50b20uaAppbmRleCAwMjI2OGM1Li45NGRkNjY0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BoYW50b20uaAorKysgYi9pbmNsdWRlL2xpbnV4L3BoYW50b20uaApAQCAtMTAsNyArMTAsNyBAQAogI2lmbmRlZiBfX1BIQU5UT01fSAogI2RlZmluZSBfX1BIQU5UT01fSAogCi0jaW5jbHVkZSA8YXNtL3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KIAogLyogUEhOXyhHL1MpRVRfUkVHIHBhcmFtICovCiBzdHJ1Y3QgcGhtX3JlZyB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BpZC5oIGIvaW5jbHVkZS9saW51eC9waWQuaAppbmRleCBiYjIwNmM1Li40OWYxYzJmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BpZC5oCisrKyBiL2luY2x1ZGUvbGludXgvcGlkLmgKQEAgLTEyMyw2ICsxMjMsMjQgQEAKIGV4dGVybiB2b2lkIGZyZWVfcGlkKHN0cnVjdCBwaWQgKnBpZCk7CiAKIC8qCisgKiBuc19vZl9waWQoKSByZXR1cm5zIHRoZSBwaWQgbmFtZXNwYWNlIGluIHdoaWNoIHRoZSBzcGVjaWZpZWQgcGlkIHdhcworICogYWxsb2NhdGVkLgorICoKKyAqIE5PVEU6CisgKiAJbnNfb2ZfcGlkKCkgaXMgZXhwZWN0ZWQgdG8gYmUgY2FsbGVkIGZvciBhIHByb2Nlc3MgKHRhc2spIHRoYXQgaGFzCisgKiAJYW4gYXR0YWNoZWQgJ3N0cnVjdCBwaWQnIChzZWUgYXR0YWNoX3BpZCgpLCBkZXRhY2hfcGlkKCkpIGkuZSBAcGlkCisgKiAJaXMgZXhwZWN0ZWQgdG8gYmUgbm9uLU5VTEwuIElmIEBwaWQgaXMgTlVMTCwgY2FsbGVyIHNob3VsZCBoYW5kbGUKKyAqIAl0aGUgcmVzdWx0aW5nIE5VTEwgcGlkLW5zLgorICovCitzdGF0aWMgaW5saW5lIHN0cnVjdCBwaWRfbmFtZXNwYWNlICpuc19vZl9waWQoc3RydWN0IHBpZCAqcGlkKQoreworCXN0cnVjdCBwaWRfbmFtZXNwYWNlICpucyA9IE5VTEw7CisJaWYgKHBpZCkKKwkJbnMgPSBwaWQtPm51bWJlcnNbcGlkLT5sZXZlbF0ubnM7CisJcmV0dXJuIG5zOworfQorCisvKgogICogdGhlIGhlbHBlcnMgdG8gZ2V0IHRoZSBwaWQncyBpZCBzZWVuIGZyb20gZGlmZmVyZW50IG5hbWVzcGFjZXMKICAqCiAgKiBwaWRfbnIoKSAgICA6IGdsb2JhbCBpZCwgaS5lLiB0aGUgaWQgc2VlbiBmcm9tIHRoZSBpbml0IG5hbWVzcGFjZTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcGlkX25hbWVzcGFjZS5oIGIvaW5jbHVkZS9saW51eC9waWRfbmFtZXNwYWNlLmgKaW5kZXggZDgyZmU4Mi4uMzhkMTAzMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9waWRfbmFtZXNwYWNlLmgKKysrIGIvaW5jbHVkZS9saW51eC9waWRfbmFtZXNwYWNlLmgKQEAgLTc5LDExICs3OSw3IEBACiB9CiAjZW5kaWYgLyogQ09ORklHX1BJRF9OUyAqLwogCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBwaWRfbmFtZXNwYWNlICp0YXNrX2FjdGl2ZV9waWRfbnMoc3RydWN0IHRhc2tfc3RydWN0ICp0c2spCi17Ci0JcmV0dXJuIHRzay0+bnNwcm94eS0+cGlkX25zOwotfQotCitleHRlcm4gc3RydWN0IHBpZF9uYW1lc3BhY2UgKnRhc2tfYWN0aXZlX3BpZF9ucyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayk7CiB2b2lkIHBpZGhhc2hfaW5pdCh2b2lkKTsKIHZvaWQgcGlkbWFwX2luaXQodm9pZCk7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcW54NF9mcy5oIGIvaW5jbHVkZS9saW51eC9xbng0X2ZzLmgKaW5kZXggMzRhMTk2ZS4uNzg3ZDE5ZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9xbng0X2ZzLmgKKysrIGIvaW5jbHVkZS9saW51eC9xbng0X2ZzLmgKQEAgLTIsMTQgKzIsMTIgQEAKICAqICBOYW1lICAgICAgICAgICAgICAgICAgICAgICAgIDogcW54NF9mcy5oCiAgKiAgQXV0aG9yICAgICAgICAgICAgICAgICAgICAgICA6IFJpY2hhcmQgRnJvd2lqbgogICogIEZ1bmN0aW9uICAgICAgICAgICAgICAgICAgICAgOiBxbng0IGdsb2JhbCBmaWxlc3lzdGVtIGRlZmluaXRpb25zCi0gKiAgVmVyc2lvbiAgICAgICAgICAgICAgICAgICAgICA6IDEuMC4yCi0gKiAgTGFzdCBtb2RpZmllZCAgICAgICAgICAgICAgICA6IDIwMDAtMDEtMzEKLSAqCiAgKiAgSGlzdG9yeSAgICAgICAgICAgICAgICAgICAgICA6IDIzLTAzLTE5OTggY3JlYXRlZAogICovCiAjaWZuZGVmIF9MSU5VWF9RTlg0X0ZTX0gKICNkZWZpbmUgX0xJTlVYX1FOWDRfRlNfSAogCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9xbnh0eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L21hZ2ljLmg+CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcW54dHlwZXMuaCBiL2luY2x1ZGUvbGludXgvcW54dHlwZXMuaAppbmRleCBhM2ViMTEzLi5iZWJiZTVjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3FueHR5cGVzLmgKKysrIGIvaW5jbHVkZS9saW51eC9xbnh0eXBlcy5oCkBAIC0yLDkgKzIsNiBAQAogICogIE5hbWUgICAgICAgICAgICAgICAgICAgICAgICAgOiBxbnh0eXBlcy5oCiAgKiAgQXV0aG9yICAgICAgICAgICAgICAgICAgICAgICA6IFJpY2hhcmQgRnJvd2lqbgogICogIEZ1bmN0aW9uICAgICAgICAgICAgICAgICAgICAgOiBzdGFuZGFyZCBxbnggdHlwZXMKLSAqICBWZXJzaW9uICAgICAgICAgICAgICAgICAgICAgIDogMS4wLjIKLSAqICBMYXN0IG1vZGlmaWVkICAgICAgICAgICAgICAgIDogMjAwMC0wMS0wNgotICoKICAqICBIaXN0b3J5ICAgICAgICAgICAgICAgICAgICAgIDogMjItMDMtMTk5OCBjcmVhdGVkCiAgKgogICovCkBAIC0xMiw2ICs5LDggQEAKICNpZm5kZWYgX1FOWDRUWVBFU19ICiAjZGVmaW5lIF9RTlg0VFlQRVNfSAogCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKwogdHlwZWRlZiBfX2xlMTYgcW54NF9ueHRudF90OwogdHlwZWRlZiBfX3U4ICBxbng0X2Z0eXBlX3Q7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcmFkZW9uZmIuaCBiL2luY2x1ZGUvbGludXgvcmFkZW9uZmIuaAppbmRleCA1YmQ4OTc1Li44YzRiYmRlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3JhZGVvbmZiLmgKKysrIGIvaW5jbHVkZS9saW51eC9yYWRlb25mYi5oCkBAIC0yLDcgKzIsNyBAQAogI2RlZmluZSBfX0xJTlVYX1JBREVPTkZCX0hfXwogCiAjaW5jbHVkZSA8YXNtL2lvY3RsLmg+Ci0jaW5jbHVkZSA8YXNtL3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KIAogI2RlZmluZSBBVFlfUkFERU9OX0xDRF9PTgkweDAwMDAwMDAxCiAjZGVmaW5lIEFUWV9SQURFT05fQ1JUX09OCTB4MDAwMDAwMDIKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcmFpZC9tZF9rLmggYi9pbmNsdWRlL2xpbnV4L3JhaWQvbWRfay5oCmluZGV4IDhmYzkwOWUuLjk3NDNlNGQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcmFpZC9tZF9rLmgKKysrIGIvaW5jbHVkZS9saW51eC9yYWlkL21kX2suaApAQCAtMTM3LDYgKzEzNyw5IEBACiAJc3RydWN0IGdlbmRpc2sJCQkqZ2VuZGlzazsKIAogCXN0cnVjdCBrb2JqZWN0CQkJa29iajsKKwlpbnQJCQkJaG9sZF9hY3RpdmU7CisjZGVmaW5lCVVOVElMX0lPQ1RMCTEKKyNkZWZpbmUJVU5USUxfU1RPUAkyCiAKIAkvKiBTdXBlcmJsb2NrIGluZm9ybWF0aW9uICovCiAJaW50CQkJCW1ham9yX3ZlcnNpb24sCkBAIC0yMTUsNiArMjE4LDkgQEAKICNkZWZpbmUJTURfUkVDT1ZFUllfRlJPWkVOCTkKIAogCXVuc2lnbmVkIGxvbmcJCQlyZWNvdmVyeTsKKwlpbnQJCQkJcmVjb3ZlcnlfZGlzYWJsZWQ7IC8qIGlmIHdlIGRldGVjdCB0aGF0IHJlY292ZXJ5CisJCQkJCQkJICAgICogd2lsbCBhbHdheXMgZmFpbCwgc2V0IHRoaXMKKwkJCQkJCQkgICAgKiBzbyB3ZSBkb24ndCBsb29wIHRyeWluZyAqLwogCiAJaW50CQkJCWluX3N5bmM7CS8qIGtub3cgdG8gbm90IG5lZWQgcmVzeW5jICovCiAJc3RydWN0IG11dGV4CQkJcmVjb25maWdfbXV0ZXg7CkBAIC0yNDQsNiArMjUwLDkgQEAKIAlzdHJ1Y3Qgc3lzZnNfZGlyZW50CQkqc3lzZnNfc3RhdGU7CS8qIGhhbmRsZSBmb3IgJ2FycmF5X3N0YXRlJwogCQkJCQkJCSAqIGZpbGUgaW4gc3lzZnMuCiAJCQkJCQkJICovCisJc3RydWN0IHN5c2ZzX2RpcmVudAkJKnN5c2ZzX2FjdGlvbjsgIC8qIGhhbmRsZSBmb3IgJ3N5bmNfYWN0aW9uJyAqLworCisJc3RydWN0IHdvcmtfc3RydWN0IGRlbF93b3JrOwkvKiB1c2VkIGZvciBkZWxheWVkIHN5c2ZzIHJlbW92YWwgKi8KIAogCXNwaW5sb2NrX3QJCQl3cml0ZV9sb2NrOwogCXdhaXRfcXVldWVfaGVhZF90CQlzYl93YWl0OwkvKiBmb3Igd2FpdGluZyBvbiBzdXBlcmJsb2NrIHVwZGF0ZXMgKi8KQEAgLTMzNCwxNyArMzQzLDE0IEBACiAgKiBpdGVyYXRlcyB0aHJvdWdoIHNvbWUgcmRldiByaW5nbGlzdC4gSXQncyBzYWZlIHRvIHJlbW92ZSB0aGUKICAqIGN1cnJlbnQgJ3JkZXYnLiBEb250IHRvdWNoICd0bXAnIHRob3VnaC4KICAqLwotI2RlZmluZSByZGV2X2Zvcl9lYWNoX2xpc3QocmRldiwgdG1wLCBsaXN0KQkJCQlcCi0JCQkJCQkJCQlcCi0JZm9yICgodG1wKSA9IChsaXN0KS5uZXh0OwkJCQkJXAotCQkocmRldikgPSAobGlzdF9lbnRyeSgodG1wKSwgbWRrX3JkZXZfdCwgc2FtZV9zZXQpKSwJXAotCQkJKHRtcCkgPSAodG1wKS0+bmV4dCwgKHRtcCktPnByZXYgIT0gJihsaXN0KQlcCi0JCTsgKQorI2RlZmluZSByZGV2X2Zvcl9lYWNoX2xpc3QocmRldiwgdG1wLCBoZWFkKQkJCQlcCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHJkZXYsIHRtcCwgaGVhZCwgc2FtZV9zZXQpCisKIC8qCiAgKiBpdGVyYXRlcyB0aHJvdWdoIHRoZSAnc2FtZSBhcnJheSBkaXNrcycgcmluZ2xpc3QKICAqLwogI2RlZmluZSByZGV2X2Zvcl9lYWNoKHJkZXYsIHRtcCwgbWRkZXYpCQkJCVwKLQlyZGV2X2Zvcl9lYWNoX2xpc3QocmRldiwgdG1wLCAobWRkZXYpLT5kaXNrcykKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocmRldiwgdG1wLCAmKChtZGRldiktPmRpc2tzKSwgc2FtZV9zZXQpCiAKICNkZWZpbmUgcmRldl9mb3JfZWFjaF9yY3UocmRldiwgbWRkZXYpCQkJCVwKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShyZGV2LCAmKChtZGRldiktPmRpc2tzKSwgc2FtZV9zZXQpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3JhaWQvbWRfcC5oIGIvaW5jbHVkZS9saW51eC9yYWlkL21kX3AuaAppbmRleCA4YjRkZTRhLi45NDkxMDI2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3JhaWQvbWRfcC5oCisrKyBiL2luY2x1ZGUvbGludXgvcmFpZC9tZF9wLmgKQEAgLTE5NCw2ICsxOTQsOCBAQAogCXJldHVybiAoZXY8PDMyKXwgc2ItPmV2ZW50c19sbzsKIH0KIAorI2RlZmluZSBNRF9TVVBFUkJMT0NLXzFfVElNRV9TRUNfTUFTSyAoKDFVTEw8PDQwKSAtIDEpCisKIC8qCiAgKiBUaGUgdmVyc2lvbi0xIHN1cGVyYmxvY2sgOgogICogQWxsIG51bWVyaWMgZmllbGRzIGFyZSBsaXR0bGUtZW5kaWFuLgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9yYWlkL3JhaWQwLmggYi9pbmNsdWRlL2xpbnV4L3JhaWQvcmFpZDAuaAppbmRleCAxYjJkZGEwLi5mZDQyYWE4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3JhaWQvcmFpZDAuaAorKysgYi9pbmNsdWRlL2xpbnV4L3JhaWQvcmFpZDAuaApAQCAtNSw5ICs1LDkgQEAKIAogc3RydWN0IHN0cmlwX3pvbmUKIHsKLQlzZWN0b3JfdCB6b25lX29mZnNldDsJLyogWm9uZSBvZmZzZXQgaW4gbWRfZGV2ICovCi0Jc2VjdG9yX3QgZGV2X29mZnNldDsJLyogWm9uZSBvZmZzZXQgaW4gcmVhbCBkZXYgKi8KLQlzZWN0b3JfdCBzaXplOwkJLyogWm9uZSBzaXplICovCisJc2VjdG9yX3Qgem9uZV9zdGFydDsJLyogWm9uZSBvZmZzZXQgaW4gbWRfZGV2IChpbiBzZWN0b3JzKSAqLworCXNlY3Rvcl90IGRldl9zdGFydDsJLyogWm9uZSBvZmZzZXQgaW4gcmVhbCBkZXYgKGluIHNlY3RvcnMpICovCisJc2VjdG9yX3Qgc2VjdG9yczsJLyogWm9uZSBzaXplIGluIHNlY3RvcnMgKi8KIAlpbnQgbmJfZGV2OwkJLyogIyBvZiBkZXZpY2VzIGF0dGFjaGVkIHRvIHRoZSB6b25lICovCiAJbWRrX3JkZXZfdCAqKmRldjsJLyogRGV2aWNlcyBhdHRhY2hlZCB0byB0aGUgem9uZSAqLwogfTsKQEAgLTE5LDggKzE5LDggQEAKIAltZGtfcmRldl90ICoqZGV2bGlzdDsgLyogbGlzdHMgb2YgcmRldnMsIHBvaW50ZWQgdG8gYnkgc3RyaXBfem9uZS0+ZGV2ICovCiAJaW50IG5yX3N0cmlwX3pvbmVzOwogCi0Jc2VjdG9yX3QgaGFzaF9zcGFjaW5nOwotCWludCBwcmVzaGlmdDsJCQkvKiBzaGlmdCB0aGlzIGJlZm9yZSBkaXZpZGUgYnkgaGFzaF9zcGFjaW5nICovCisJc2VjdG9yX3Qgc3BhY2luZzsKKwlpbnQgc2VjdG9yX3NoaWZ0OyAvKiBzaGlmdCB0aGlzIGJlZm9yZSBkaXZpZGUgYnkgc3BhY2luZyAqLwogfTsKIAogdHlwZWRlZiBzdHJ1Y3QgcmFpZDBfcHJpdmF0ZV9kYXRhIHJhaWQwX2NvbmZfdDsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcmJ0cmVlLmggYi9pbmNsdWRlL2xpbnV4L3JidHJlZS5oCmluZGV4IDM0NGJjMzQuLjljMjk1NDEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcmJ0cmVlLmgKKysrIGIvaW5jbHVkZS9saW51eC9yYnRyZWUuaApAQCAtMTQwLDEwICsxNDAsMTAgQEAKIGV4dGVybiB2b2lkIHJiX2VyYXNlKHN0cnVjdCByYl9ub2RlICosIHN0cnVjdCByYl9yb290ICopOwogCiAvKiBGaW5kIGxvZ2ljYWwgbmV4dCBhbmQgcHJldmlvdXMgbm9kZXMgaW4gYSB0cmVlICovCi1leHRlcm4gc3RydWN0IHJiX25vZGUgKnJiX25leHQoc3RydWN0IHJiX25vZGUgKik7Ci1leHRlcm4gc3RydWN0IHJiX25vZGUgKnJiX3ByZXYoc3RydWN0IHJiX25vZGUgKik7Ci1leHRlcm4gc3RydWN0IHJiX25vZGUgKnJiX2ZpcnN0KHN0cnVjdCByYl9yb290ICopOwotZXh0ZXJuIHN0cnVjdCByYl9ub2RlICpyYl9sYXN0KHN0cnVjdCByYl9yb290ICopOworZXh0ZXJuIHN0cnVjdCByYl9ub2RlICpyYl9uZXh0KGNvbnN0IHN0cnVjdCByYl9ub2RlICopOworZXh0ZXJuIHN0cnVjdCByYl9ub2RlICpyYl9wcmV2KGNvbnN0IHN0cnVjdCByYl9ub2RlICopOworZXh0ZXJuIHN0cnVjdCByYl9ub2RlICpyYl9maXJzdChjb25zdCBzdHJ1Y3QgcmJfcm9vdCAqKTsKK2V4dGVybiBzdHJ1Y3QgcmJfbm9kZSAqcmJfbGFzdChjb25zdCBzdHJ1Y3QgcmJfcm9vdCAqKTsKIAogLyogRmFzdCByZXBsYWNlbWVudCBvZiBhIHNpbmdsZSBub2RlIHdpdGhvdXQgcmVtb3ZlL3JlYmFsYW5jZS9hZGQvcmViYWxhbmNlICovCiBleHRlcm4gdm9pZCByYl9yZXBsYWNlX25vZGUoc3RydWN0IHJiX25vZGUgKnZpY3RpbSwgc3RydWN0IHJiX25vZGUgKm5ldywgCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3JlZ3VsYXRvci9jb25zdW1lci5oIGIvaW5jbHVkZS9saW51eC9yZWd1bGF0b3IvY29uc3VtZXIuaAppbmRleCBhZmRjNDU1Li44MDFiZjc3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3JlZ3VsYXRvci9jb25zdW1lci5oCisrKyBiL2luY2x1ZGUvbGludXgvcmVndWxhdG9yL2NvbnN1bWVyLmgKQEAgLTEwNCwxMCArMTA0LDEwIEBACiAvKioKICAqIHN0cnVjdCByZWd1bGF0b3JfYnVsa19kYXRhIC0gRGF0YSB1c2VkIGZvciBidWxrIHJlZ3VsYXRvciBvcGVyYXRpb25zLgogICoKLSAqIEBzdXBwbHkgICBUaGUgbmFtZSBvZiB0aGUgc3VwcGx5LiAgSW5pdGlhbGlzZWQgYnkgdGhlIHVzZXIgYmVmb3JlCi0gKiAgICAgICAgICAgdXNpbmcgdGhlIGJ1bGsgcmVndWxhdG9yIEFQSXMuCi0gKiBAY29uc3VtZXIgVGhlIHJlZ3VsYXRvciBjb25zdW1lciBmb3IgdGhlIHN1cHBseS4gIFRoaXMgd2lsbCBiZSBtYW5hZ2VkCi0gKiAgICAgICAgICAgYnkgdGhlIGJ1bGsgQVBJLgorICogQHN1cHBseTogICBUaGUgbmFtZSBvZiB0aGUgc3VwcGx5LiAgSW5pdGlhbGlzZWQgYnkgdGhlIHVzZXIgYmVmb3JlCisgKiAgICAgICAgICAgIHVzaW5nIHRoZSBidWxrIHJlZ3VsYXRvciBBUElzLgorICogQGNvbnN1bWVyOiBUaGUgcmVndWxhdG9yIGNvbnN1bWVyIGZvciB0aGUgc3VwcGx5LiAgVGhpcyB3aWxsIGJlIG1hbmFnZWQKKyAqICAgICAgICAgICAgYnkgdGhlIGJ1bGsgQVBJLgogICoKICAqIFRoZSByZWd1bGF0b3IgQVBJcyBwcm92aWRlIGEgc2VyaWVzIG9mIHJlZ3VsYXRvcl9idWxrXygpIEFQSSBjYWxscyBhcwogICogYSBjb252ZW5pZW5jZSB0byBjb25zdW1lcnMgd2hpY2ggcmVxdWlyZSBtdWx0aXBsZSBzdXBwbGllcy4gIFRoaXMKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcmVndWxhdG9yL2RyaXZlci5oIGIvaW5jbHVkZS9saW51eC9yZWd1bGF0b3IvZHJpdmVyLmgKaW5kZXggZTM3ZDgwNS4uMmRhZTA1NyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9yZWd1bGF0b3IvZHJpdmVyLmgKKysrIGIvaW5jbHVkZS9saW51eC9yZWd1bGF0b3IvZHJpdmVyLmgKQEAgLTI0LDcgKzI0LDMzIEBACiAvKioKICAqIHN0cnVjdCByZWd1bGF0b3Jfb3BzIC0gcmVndWxhdG9yIG9wZXJhdGlvbnMuCiAgKgotICogVGhpcyBzdHJ1Y3QgZGVzY3JpYmVzIHJlZ3VsYXRvciBvcGVyYXRpb25zLgorICogVGhpcyBzdHJ1Y3QgZGVzY3JpYmVzIHJlZ3VsYXRvciBvcGVyYXRpb25zIHdoaWNoIGNhbiBiZSBpbXBsZW1lbnRlZCBieQorICogcmVndWxhdG9yIGNoaXAgZHJpdmVycy4KKyAqCisgKiBAZW5hYmxlOiBFbmFibGUgdGhlIHJlZ3VsYXRvci4KKyAqIEBkaXNhYmxlOiBEaXNhYmxlIHRoZSByZWd1bGF0b3IuCisgKiBAaXNfZW5hYmxlZDogUmV0dXJuIDEgaWYgdGhlIHJlZ3VsYXRvciBpcyBlbmFibGVkLCAwIG90aGVyd2lzZS4KKyAqCisgKiBAc2V0X3ZvbHRhZ2U6IFNldCB0aGUgdm9sdGFnZSBmb3IgdGhlIHJlZ3VsYXRvciB3aXRoaW4gdGhlIHJhbmdlIHNwZWNpZmllZC4KKyAqICAgICAgICAgICAgICAgVGhlIGRyaXZlciBzaG91bGQgc2VsZWN0IHRoZSB2b2x0YWdlIGNsb3Nlc3QgdG8gbWluX3VWLgorICogQGdldF92b2x0YWdlOiBSZXR1cm4gdGhlIGN1cnJlbnRseSBjb25maWd1cmVkIHZvbHRhZ2UgZm9yIHRoZSByZWd1bGF0b3IuCisgKgorICogQHNldF9jdXJyZW50X2xpbWl0OiBDb25maWd1cmUgYSBsaW1pdCBmb3IgYSBjdXJyZW50LWxpbWl0ZWQgcmVndWxhdG9yLgorICogQGdldF9jdXJyZW50X2xpbWl0OiBHZXQgdGhlIGxpbWl0IGZvciBhIGN1cnJlbnQtbGltaXRlZCByZWd1bGF0b3IuCisgKgorICogQHNldF9tb2RlOiBTZXQgdGhlIG9wZXJhdGluZyBtb2RlIGZvciB0aGUgcmVndWxhdG9yLgorICogQGdldF9tb2RlOiBHZXQgdGhlIGN1cnJlbnQgb3BlcmF0aW5nIG1vZGUgZm9yIHRoZSByZWd1bGF0b3IuCisgKiBAZ2V0X29wdGltdW1fbW9kZTogR2V0IHRoZSBtb3N0IGVmZmljaWVudCBvcGVyYXRpbmcgbW9kZSBmb3IgdGhlIHJlZ3VsYXRvcgorICogICAgICAgICAgICAgICAgICAgIHdoZW4gcnVubmluZyB3aXRoIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycy4KKyAqCisgKiBAc2V0X3N1c3BlbmRfdm9sdGFnZTogU2V0IHRoZSB2b2x0YWdlIGZvciB0aGUgcmVndWxhdG9yIHdoZW4gdGhlIHN5c3RlbQorICogICAgICAgICAgICAgICAgICAgICAgIGlzIHN1c3BlbmRlZC4KKyAqIEBzZXRfc3VzcGVuZF9lbmFibGU6IE1hcmsgdGhlIHJlZ3VsYXRvciBhcyBlbmFibGVkIHdoZW4gdGhlIHN5c3RlbSBpcworICogICAgICAgICAgICAgICAgICAgICAgc3VzcGVuZGVkLgorICogQHNldF9zdXNwZW5kX2Rpc2FibGU6IE1hcmsgdGhlIHJlZ3VsYXRvciBhcyBkaXNhYmxlZCB3aGVuIHRoZSBzeXN0ZW0gaXMKKyAqICAgICAgICAgICAgICAgICAgICAgICBzdXNwZW5kZWQuCisgKiBAc2V0X3N1c3BlbmRfbW9kZTogU2V0IHRoZSBvcGVyYXRpbmcgbW9kZSBmb3IgdGhlIHJlZ3VsYXRvciB3aGVuIHRoZQorICogICAgICAgICAgICAgICAgICAgIHN5c3RlbSBpcyBzdXNwZW5kZWQuCiAgKi8KIHN0cnVjdCByZWd1bGF0b3Jfb3BzIHsKIApAQCAtNzUsNiArMTAxLDE1IEBACiAvKioKICAqIHN0cnVjdCByZWd1bGF0b3JfZGVzYyAtIFJlZ3VsYXRvciBkZXNjcmlwdG9yCiAgKgorICogRWFjaCByZWd1bGF0b3IgcmVnaXN0ZXJlZCB3aXRoIHRoZSBjb3JlIGlzIGRlc2NyaWJlZCB3aXRoIGEgc3RydWN0dXJlIG9mCisgKiB0aGlzIHR5cGUuCisgKgorICogQG5hbWU6IElkZW50aWZ5aW5nIG5hbWUgZm9yIHRoZSByZWd1bGF0b3IuCisgKiBAaWQ6IE51bWVyaWNhbCBpZGVudGlmaWVyIGZvciB0aGUgcmVndWxhdG9yLgorICogQG9wczogUmVndWxhdG9yIG9wZXJhdGlvbnMgdGFibGUuCisgKiBAaXJxOiBJbnRlcnJ1cHQgbnVtYmVyIGZvciB0aGUgcmVndWxhdG9yLgorICogQHR5cGU6IEluZGljYXRlcyBpZiB0aGUgcmVndWxhdG9yIGlzIGEgdm9sdGFnZSBvciBjdXJyZW50IHJlZ3VsYXRvci4KKyAqIEBvd25lcjogTW9kdWxlIHByb3ZpZGluZyB0aGUgcmVndWxhdG9yLCB1c2VkIGZvciByZWZjb3VudGluZy4KICAqLwogc3RydWN0IHJlZ3VsYXRvcl9kZXNjIHsKIAljb25zdCBjaGFyICpuYW1lOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9yZWd1bGF0b3IvbWFjaGluZS5oIGIvaW5jbHVkZS9saW51eC9yZWd1bGF0b3IvbWFjaGluZS5oCmluZGV4IGM2ZDY5MzMuLjM3OTQ3NzMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcmVndWxhdG9yL21hY2hpbmUuaAorKysgYi9pbmNsdWRlL2xpbnV4L3JlZ3VsYXRvci9tYWNoaW5lLmgKQEAgLTQ0LDYgKzQ0LDEwIEBACiAgKiBzdHJ1Y3QgcmVndWxhdG9yX3N0YXRlIC0gcmVndWxhdG9yIHN0YXRlIGR1cmluZyBsb3cgcG93ZXIgc3lhdGVtIHN0YXRlcwogICoKICAqIFRoaXMgZGVzY3JpYmVzIGEgcmVndWxhdG9ycyBzdGF0ZSBkdXJpbmcgYSBzeXN0ZW0gd2lkZSBsb3cgcG93ZXIgc3RhdGUuCisgKgorICogQHVWOiBPcGVyYXRpbmcgdm9sdGFnZSBkdXJpbmcgc3VzcGVuZC4KKyAqIEBtb2RlOiBPcGVyYXRpbmcgbW9kZSBkdXJpbmcgc3VzcGVuZC4KKyAqIEBlbmFibGVkOiBFbmFibGVkIGR1cmluZyBzdXNwZW5kLgogICovCiBzdHJ1Y3QgcmVndWxhdG9yX3N0YXRlIHsKIAlpbnQgdVY7CS8qIHN1c3BlbmQgdm9sdGFnZSAqLwpAQCAtNTUsNiArNTksMzAgQEAKICAqIHN0cnVjdCByZWd1bGF0aW9uX2NvbnN0cmFpbnRzIC0gcmVndWxhdG9yIG9wZXJhdGluZyBjb25zdHJhaW50cy4KICAqCiAgKiBUaGlzIHN0cnVjdCBkZXNjcmliZXMgcmVndWxhdG9yIGFuZCBib2FyZC9tYWNoaW5lIHNwZWNpZmljIGNvbnN0cmFpbnRzLgorICoKKyAqIEBuYW1lOiBEZXNjcmlwdGl2ZSBuYW1lIGZvciB0aGUgY29uc3RyYWludHMsIHVzZWQgZm9yIGRpc3BsYXkgcHVycG9zZXMuCisgKgorICogQG1pbl91VjogU21hbGxlc3Qgdm9sdGFnZSBjb25zdW1lcnMgbWF5IHNldC4KKyAqIEBtYXhfdVY6IExhcmdlc3Qgdm9sdGFnZSBjb25zdW1lcnMgbWF5IHNldC4KKyAqCisgKiBAbWluX3VBOiBTbWFsbGVzdCBjb25zdW1lcnMgY29uc3VtZXJzIG1heSBzZXQuCisgKiBAbWF4X3VBOiBMYXJnZXN0IGN1cnJlbnQgY29uc3VtZXJzIG1heSBzZXQuCisgKgorICogQHZhbGlkX21vZGVzX21hc2s6IE1hc2sgb2YgbW9kZXMgd2hpY2ggbWF5IGJlIGNvbmZpZ3VyZWQgYnkgY29uc3VtZXJzLgorICogQHZhbGlkX29wc19tYXNrOiBPcGVyYXRpb25zIHdoaWNoIG1heSBiZSBwZXJmb3JtZWQgYnkgY29uc3VtZXJzLgorICoKKyAqIEBhbHdheXNfb246IFNldCBpZiB0aGUgcmVndWxhdG9yIHNob3VsZCBuZXZlciBiZSBkaXNhYmxlZC4KKyAqIEBib290X29uOiBTZXQgaWYgdGhlIHJlZ3VsYXRvciBpcyBlbmFibGVkIHdoZW4gdGhlIHN5c3RlbSBpcyBpbml0aWFsbHkKKyAqICAgICAgICAgICBzdGFydGVkLgorICogQGFwcGx5X3VWOiBBcHBseSB0aGUgdm9sdGFnZSBjb25zdHJhaW50IHdoZW4gaW5pdGlhbGlzaW5nLgorICoKKyAqIEBpbnB1dF91VjogSW5wdXQgdm9sdGFnZSBmb3IgcmVndWxhdG9yIHdoZW4gc3VwcGxpZWQgYnkgYW5vdGhlciByZWd1bGF0b3IuCisgKgorICogQHN0YXRlX2Rpc2s6IFN0YXRlIGZvciByZWd1bGF0b3Igd2hlbiBzeXN0ZW0gaXMgc3VzcGVuZGVkIGluIGRpc2sgbW9kZS4KKyAqIEBzdGF0ZV9tZW06IFN0YXRlIGZvciByZWd1bGF0b3Igd2hlbiBzeXN0ZW0gaXMgc3VzcGVuZGVkIGluIG1lbSBtb2RlLgorICogQHN0YXRlX3N0YW5kYnk6IFN0YXRlIGZvciByZWd1bGF0b3Igd2hlbiBzeXN0ZW0gaXMgc3VzcGVuZGVkIGluIHN0YW5kYnkKKyAqICAgICAgICAgICAgICAgICBtb2RlLgorICogQGluaXRpYWxfc3RhdGU6IFN1c3BlbmQgc3RhdGUgdG8gc2V0IGJ5IGRlZmF1bHQuCiAgKi8KIHN0cnVjdCByZWd1bGF0aW9uX2NvbnN0cmFpbnRzIHsKIApAQCAtOTMsNiArMTIxLDkgQEAKICAqIHN0cnVjdCByZWd1bGF0b3JfY29uc3VtZXJfc3VwcGx5IC0gc3VwcGx5IC0+IGRldmljZSBtYXBwaW5nCiAgKgogICogVGhpcyBtYXBzIGEgc3VwcGx5IG5hbWUgdG8gYSBkZXZpY2UuCisgKgorICogQGRldjogRGV2aWNlIHN0cnVjdHVyZSBmb3IgdGhlIGNvbnN1bWVyLgorICogQHN1cHBseTogTmFtZSBmb3IgdGhlIHN1cHBseS4KICAqLwogc3RydWN0IHJlZ3VsYXRvcl9jb25zdW1lcl9zdXBwbHkgewogCXN0cnVjdCBkZXZpY2UgKmRldjsJLyogY29uc3VtZXIgKi8KQEAgLTEwMyw2ICsxMzQsMTYgQEAKICAqIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIC0gcmVndWxhdG9yIHBsYXRmb3JtIGluaXRpYWxpc2F0aW9uIGRhdGEuCiAgKgogICogSW5pdGlhbGlzYXRpb24gY29uc3RyYWludHMsIG91ciBzdXBwbHkgYW5kIGNvbnN1bWVycyBzdXBwbGllcy4KKyAqCisgKiBAc3VwcGx5X3JlZ3VsYXRvcl9kZXY6IFBhcmVudCByZWd1bGF0b3IgKGlmIGFueSkuCisgKgorICogQGNvbnN0cmFpbnRzOiBDb25zdHJhaW50cy4gIFRoZXNlIG11c3QgYmUgc3BlY2lmaWVkIGZvciB0aGUgcmVndWxhdG9yIHRvCisgKiAgICAgICAgICAgICAgIGJlIHVzYWJsZS4KKyAqIEBudW1fY29uc3VtZXJfc3VwcGxpZXM6IE51bWJlciBvZiBjb25zdW1lciBkZXZpY2Ugc3VwcGxpZXMuCisgKiBAY29uc3VtZXJfc3VwcGxpZXM6IENvbnN1bWVyIGRldmljZSBzdXBwbHkgY29uZmlndXJhdGlvbi4KKyAqCisgKiBAcmVndWxhdG9yX2luaXQ6IENhbGxiYWNrIGludm9rZWQgd2hlbiB0aGUgcmVndWxhdG9yIGhhcyBiZWVuIHJlZ2lzdGVyZWQuCisgKiBAZHJpdmVyX2RhdGE6IERhdGEgcGFzc2VkIHRvIHJlZ3VsYXRvcl9pbml0LgogICovCiBzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSB7CiAJc3RydWN0IGRldmljZSAqc3VwcGx5X3JlZ3VsYXRvcl9kZXY7IC8qIG9yIE5VTEwgZm9yIExJTkUgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcmVzX2NvdW50ZXIuaCBiL2luY2x1ZGUvbGludXgvcmVzX2NvdW50ZXIuaAppbmRleCAyNzFjMWMyLi40YzViY2Y2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3Jlc19jb3VudGVyLmgKKysrIGIvaW5jbHVkZS9saW51eC9yZXNfY291bnRlci5oCkBAIC05LDcgKzksNyBAQAogICoKICAqIEF1dGhvcjogUGF2ZWwgRW1lbGlhbm92IDx4ZW11bEBvcGVudnoub3JnPgogICoKLSAqIFNlZSBEb2N1bWVudGF0aW9uL2NvbnRyb2xsZXJzL3Jlc291cmNlX2NvdW50ZXIudHh0IGZvciBtb3JlCisgKiBTZWUgRG9jdW1lbnRhdGlvbi9jZ3JvdXBzL3Jlc291cmNlX2NvdW50ZXIudHh0IGZvciBtb3JlCiAgKiBpbmZvIGFib3V0IHdoYXQgdGhpcyBjb3VudGVyIGlzLgogICovCiAKQEAgLTQzLDYgKzQzLDEwIEBACiAJICogdGhlIHJvdXRpbmVzIGJlbG93IGNvbnNpZGVyIHRoaXMgdG8gYmUgSVJRLXNhZmUKIAkgKi8KIAlzcGlubG9ja190IGxvY2s7CisJLyoKKwkgKiBQYXJlbnQgY291bnRlciwgdXNlZCBmb3IgaGllcmFyY2hpYWwgcmVzb3VyY2UgYWNjb3VudGluZworCSAqLworCXN0cnVjdCByZXNfY291bnRlciAqcGFyZW50OwogfTsKIAogLyoqCkBAIC04Nyw3ICs5MSw3IEBACiAgKiBoZWxwZXJzIGZvciBhY2NvdW50aW5nCiAgKi8KIAotdm9pZCByZXNfY291bnRlcl9pbml0KHN0cnVjdCByZXNfY291bnRlciAqY291bnRlcik7Cit2b2lkIHJlc19jb3VudGVyX2luaXQoc3RydWN0IHJlc19jb3VudGVyICpjb3VudGVyLCBzdHJ1Y3QgcmVzX2NvdW50ZXIgKnBhcmVudCk7CiAKIC8qCiAgKiBjaGFyZ2UgLSB0cnkgdG8gY29uc3VtZSBtb3JlIHJlc291cmNlLgpAQCAtMTAzLDcgKzEwNyw3IEBACiBpbnQgX19tdXN0X2NoZWNrIHJlc19jb3VudGVyX2NoYXJnZV9sb2NrZWQoc3RydWN0IHJlc19jb3VudGVyICpjb3VudGVyLAogCQl1bnNpZ25lZCBsb25nIHZhbCk7CiBpbnQgX19tdXN0X2NoZWNrIHJlc19jb3VudGVyX2NoYXJnZShzdHJ1Y3QgcmVzX2NvdW50ZXIgKmNvdW50ZXIsCi0JCXVuc2lnbmVkIGxvbmcgdmFsKTsKKwkJdW5zaWduZWQgbG9uZyB2YWwsIHN0cnVjdCByZXNfY291bnRlciAqKmxpbWl0X2ZhaWxfYXQpOwogCiAvKgogICogdW5jaGFyZ2UgLSB0ZWxsIHRoYXQgc29tZSBwb3J0aW9uIG9mIHRoZSByZXNvdXJjZSBpcyByZWxlYXNlZApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zZXJpYWxfY29yZS5oIGIvaW5jbHVkZS9saW51eC9zZXJpYWxfY29yZS5oCmluZGV4IGI0MTk5ODQuLjkwYmJiZjAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc2VyaWFsX2NvcmUuaAorKysgYi9pbmNsdWRlL2xpbnV4L3NlcmlhbF9jb3JlLmgKQEAgLTE2MSw2ICsxNjEsOSBAQAogCiAjZGVmaW5lIFBPUlRfUzNDNjQwMAk4NAogCisvKiBOV1BTRVJJQUwgKi8KKyNkZWZpbmUgUE9SVF9OV1BTRVJJQUwJODUKKwogI2lmZGVmIF9fS0VSTkVMX18KIAogI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NtcC5oIGIvaW5jbHVkZS9saW51eC9zbXAuaAppbmRleCBiODI0NjY5Li43MTUxOTZiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NtcC5oCisrKyBiL2luY2x1ZGUvbGludXgvc21wLmgKQEAgLTI0LDYgKzI0LDkgQEAKIC8qIHRvdGFsIG51bWJlciBvZiBjcHVzIGluIHRoaXMgc3lzdGVtIChtYXkgZXhjZWVkIE5SX0NQVVMpICovCiBleHRlcm4gdW5zaWduZWQgaW50IHRvdGFsX2NwdXM7CiAKK2ludCBzbXBfY2FsbF9mdW5jdGlvbl9zaW5nbGUoaW50IGNwdWlkLCB2b2lkICgqZnVuYykgKHZvaWQgKmluZm8pLCB2b2lkICppbmZvLAorCQkJCWludCB3YWl0KTsKKwogI2lmZGVmIENPTkZJR19TTVAKIAogI2luY2x1ZGUgPGxpbnV4L3ByZWVtcHQuaD4KQEAgLTc5LDggKzgyLDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IHNtcF9jYWxsX2Z1bmN0aW9uX3NpbmdsZShpbnQgY3B1aWQsIHZvaWQgKCpmdW5jKSAodm9pZCAqaW5mbyksIHZvaWQgKmluZm8sCi0JCQkJaW50IHdhaXQpOwogdm9pZCBfX3NtcF9jYWxsX2Z1bmN0aW9uX3NpbmdsZShpbnQgY3B1aWQsIHN0cnVjdCBjYWxsX3NpbmdsZV9kYXRhICpkYXRhKTsKIAogLyoKQEAgLTE0MCwxNCArMTQxLDYgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBzbXBfc2VuZF9yZXNjaGVkdWxlKGludCBjcHUpIHsgfQogI2RlZmluZSBudW1fYm9vdGluZ19jcHVzKCkJCQkxCiAjZGVmaW5lIHNtcF9wcmVwYXJlX2Jvb3RfY3B1KCkJCQlkbyB7fSB3aGlsZSAoMCkKLSNkZWZpbmUgc21wX2NhbGxfZnVuY3Rpb25fc2luZ2xlKGNwdWlkLCBmdW5jLCBpbmZvLCB3YWl0KSBcCi0oeyBcCi0JV0FSTl9PTihjcHVpZCAhPSAwKTsJXAotCWxvY2FsX2lycV9kaXNhYmxlKCk7CVwKLQkoZnVuYykoaW5mbyk7CQlcCi0JbG9jYWxfaXJxX2VuYWJsZSgpOwlcCi0JMDsJCQlcCi19KQogI2RlZmluZSBzbXBfY2FsbF9mdW5jdGlvbl9tYXNrKG1hc2ssIGZ1bmMsIGluZm8sIHdhaXQpIFwKIAkJCSh1cF9zbXBfY2FsbF9mdW5jdGlvbihmdW5jLCBpbmZvKSkKICNkZWZpbmUgc21wX2NhbGxfZnVuY3Rpb25fbWFueShtYXNrLCBmdW5jLCBpbmZvLCB3YWl0KSBcCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NwaS9zcGkuaCBiL2luY2x1ZGUvbGludXgvc3BpL3NwaS5oCmluZGV4IDgyMjI5MzEuLjY4YmIxYzUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc3BpL3NwaS5oCisrKyBiL2luY2x1ZGUvbGludXgvc3BpL3NwaS5oCkBAIC0zMjcsOSArMzI3LDkgQEAKICAqIEB0eF9kbWE6IERNQSBhZGRyZXNzIG9mIHR4X2J1ZiwgaWYgQHNwaV9tZXNzYWdlLmlzX2RtYV9tYXBwZWQKICAqIEByeF9kbWE6IERNQSBhZGRyZXNzIG9mIHJ4X2J1ZiwgaWYgQHNwaV9tZXNzYWdlLmlzX2RtYV9tYXBwZWQKICAqIEBsZW46IHNpemUgb2YgcnggYW5kIHR4IGJ1ZmZlcnMgKGluIGJ5dGVzKQotICogQHNwZWVkX2h6OiBTZWxlY3QgYSBzcGVlZCBvdGhlciB0aGVuIHRoZSBkZXZpY2UgZGVmYXVsdCBmb3IgdGhpcworICogQHNwZWVkX2h6OiBTZWxlY3QgYSBzcGVlZCBvdGhlciB0aGFuIHRoZSBkZXZpY2UgZGVmYXVsdCBmb3IgdGhpcwogICogICAgICB0cmFuc2Zlci4gSWYgMCB0aGUgZGVmYXVsdCAoZnJvbSBAc3BpX2RldmljZSkgaXMgdXNlZC4KLSAqIEBiaXRzX3Blcl93b3JkOiBzZWxlY3QgYSBiaXRzX3Blcl93b3JkIG90aGVyIHRoZW4gdGhlIGRldmljZSBkZWZhdWx0CisgKiBAYml0c19wZXJfd29yZDogc2VsZWN0IGEgYml0c19wZXJfd29yZCBvdGhlciB0aGFuIHRoZSBkZXZpY2UgZGVmYXVsdAogICogICAgICBmb3IgdGhpcyB0cmFuc2Zlci4gSWYgMCB0aGUgZGVmYXVsdCAoZnJvbSBAc3BpX2RldmljZSkgaXMgdXNlZC4KICAqIEBjc19jaGFuZ2U6IGFmZmVjdHMgY2hpcHNlbGVjdCBhZnRlciB0aGlzIHRyYW5zZmVyIGNvbXBsZXRlcwogICogQGRlbGF5X3VzZWNzOiBtaWNyb3NlY29uZHMgdG8gZGVsYXkgYWZ0ZXIgdGhpcyB0cmFuc2ZlciBiZWZvcmUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc3BpL3RkbzI0bS5oIGIvaW5jbHVkZS9saW51eC9zcGkvdGRvMjRtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzU3MmQ0ZQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvc3BpL3RkbzI0bS5oCkBAIC0wLDAgKzEsMTMgQEAKKyNpZm5kZWYgX19URE8yNE1fSF9fCisjZGVmaW5lIF9fVERPMjRNX0hfXworCitlbnVtIHRkbzI0bV9tb2RlbCB7CisJVERPMjRNLAorCVRETzM1UywKK307CisKK3N0cnVjdCB0ZG8yNG1fcGxhdGZvcm1fZGF0YSB7CisJZW51bSB0ZG8yNG1fbW9kZWwgbW9kZWw7Cit9OworCisjZW5kaWYgLyogX19URE8yNE1fSF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3N1bnJwYy9zdmMuaCBiL2luY2x1ZGUvbGludXgvc3VucnBjL3N2Yy5oCmluZGV4IDNhZmU3ZmIuLjM0MzVkMjQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc3VucnBjL3N2Yy5oCisrKyBiL2luY2x1ZGUvbGludXgvc3VucnBjL3N2Yy5oCkBAIC01OCwxMCArNTgsMTMgQEAKIAlzdHJ1Y3Qgc3ZjX3N0YXQgKglzdl9zdGF0czsJLyogUlBDIHN0YXRpc3RpY3MgKi8KIAlzcGlubG9ja190CQlzdl9sb2NrOwogCXVuc2lnbmVkIGludAkJc3ZfbnJ0aHJlYWRzOwkvKiAjIG9mIHNlcnZlciB0aHJlYWRzICovCisJdW5zaWduZWQgaW50CQlzdl9tYXhjb25uOwkvKiBtYXggY29ubmVjdGlvbnMgYWxsb3dlZCBvcgorCQkJCQkJICogJzAnIGNhdXNpbmcgbWF4IHRvIGJlIGJhc2VkCisJCQkJCQkgKiBvbiBudW1iZXIgb2YgdGhyZWFkcy4gKi8KKwogCXVuc2lnbmVkIGludAkJc3ZfbWF4X3BheWxvYWQ7CS8qIGRhdGFncmFtIHBheWxvYWQgc2l6ZSAqLwogCXVuc2lnbmVkIGludAkJc3ZfbWF4X21lc2c7CS8qIG1heF9wYXlsb2FkICsgMSBwYWdlIGZvciBvdmVyaGVhZHMgKi8KIAl1bnNpZ25lZCBpbnQJCXN2X3hkcnNpemU7CS8qIFhEUiBidWZmZXIgc2l6ZSAqLwotCiAJc3RydWN0IGxpc3RfaGVhZAlzdl9wZXJtc29ja3M7CS8qIGFsbCBwZXJtYW5lbnQgc29ja2V0cyAqLwogCXN0cnVjdCBsaXN0X2hlYWQJc3ZfdGVtcHNvY2tzOwkvKiBhbGwgdGVtcG9yYXJ5IHNvY2tldHMgKi8KIAlpbnQJCQlzdl90bXBjbnQ7CS8qIGNvdW50IG9mIHRlbXBvcmFyeSBzb2NrZXRzICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3N1c3BlbmQuaCBiL2luY2x1ZGUvbGludXgvc3VzcGVuZC5oCmluZGV4IDJjZTgyMDcuLjJiNDA5YzQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc3VzcGVuZC5oCisrKyBiL2luY2x1ZGUvbGludXgvc3VzcGVuZC5oCkBAIC0yMzIsNiArMjMyLDExIEBACiAKIGV4dGVybiB2b2lkIGhpYmVybmF0aW9uX3NldF9vcHMoc3RydWN0IHBsYXRmb3JtX2hpYmVybmF0aW9uX29wcyAqb3BzKTsKIGV4dGVybiBpbnQgaGliZXJuYXRlKHZvaWQpOworZXh0ZXJuIGludCBoaWJlcm5hdGVfbnZzX3JlZ2lzdGVyKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgc2l6ZSk7CitleHRlcm4gaW50IGhpYmVybmF0ZV9udnNfYWxsb2Modm9pZCk7CitleHRlcm4gdm9pZCBoaWJlcm5hdGVfbnZzX2ZyZWUodm9pZCk7CitleHRlcm4gdm9pZCBoaWJlcm5hdGVfbnZzX3NhdmUodm9pZCk7CitleHRlcm4gdm9pZCBoaWJlcm5hdGVfbnZzX3Jlc3RvcmUodm9pZCk7CiAjZWxzZSAvKiBDT05GSUdfSElCRVJOQVRJT04gKi8KIHN0YXRpYyBpbmxpbmUgaW50IHN3c3VzcF9wYWdlX2lzX2ZvcmJpZGRlbihzdHJ1Y3QgcGFnZSAqcCkgeyByZXR1cm4gMDsgfQogc3RhdGljIGlubGluZSB2b2lkIHN3c3VzcF9zZXRfcGFnZV9mcmVlKHN0cnVjdCBwYWdlICpwKSB7fQpAQCAtMjM5LDYgKzI0NCwxNCBAQAogCiBzdGF0aWMgaW5saW5lIHZvaWQgaGliZXJuYXRpb25fc2V0X29wcyhzdHJ1Y3QgcGxhdGZvcm1faGliZXJuYXRpb25fb3BzICpvcHMpIHt9CiBzdGF0aWMgaW5saW5lIGludCBoaWJlcm5hdGUodm9pZCkgeyByZXR1cm4gLUVOT1NZUzsgfQorc3RhdGljIGlubGluZSBpbnQgaGliZXJuYXRlX252c19yZWdpc3Rlcih1bnNpZ25lZCBsb25nIGEsIHVuc2lnbmVkIGxvbmcgYikKK3sKKwlyZXR1cm4gMDsKK30KK3N0YXRpYyBpbmxpbmUgaW50IGhpYmVybmF0ZV9udnNfYWxsb2Modm9pZCkgeyByZXR1cm4gMDsgfQorc3RhdGljIGlubGluZSB2b2lkIGhpYmVybmF0ZV9udnNfZnJlZSh2b2lkKSB7fQorc3RhdGljIGlubGluZSB2b2lkIGhpYmVybmF0ZV9udnNfc2F2ZSh2b2lkKSB7fQorc3RhdGljIGlubGluZSB2b2lkIGhpYmVybmF0ZV9udnNfcmVzdG9yZSh2b2lkKSB7fQogI2VuZGlmIC8qIENPTkZJR19ISUJFUk5BVElPTiAqLwogCiAjaWZkZWYgQ09ORklHX1BNX1NMRUVQCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3N3YWIuaCBiL2luY2x1ZGUvbGludXgvc3dhYi5oCmluZGV4IGJlNTI4NGQuLmVhMGMwMmYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc3dhYi5oCisrKyBiL2luY2x1ZGUvbGludXgvc3dhYi5oCkBAIC0zLDcgKzMsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgotI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKyNpbmNsdWRlIDxhc20vc3dhYi5oPgogCiAvKgogICogY2FzdHMgYXJlIG5lY2Vzc2FyeSBmb3IgY29uc3RhbnRzLCBiZWNhdXNlIHdlIG5ldmVyIGtub3cgaG93IGZvciBzdXJlCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3N3YXAuaCBiL2luY2x1ZGUvbGludXgvc3dhcC5oCmluZGV4IDkxZGVlNTAuLmQzMDIxNTUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc3dhcC5oCisrKyBiL2luY2x1ZGUvbGludXgvc3dhcC5oCkBAIC0yMTQsNyArMjE0LDggQEAKIGV4dGVybiB1bnNpZ25lZCBsb25nIHRyeV90b19mcmVlX3BhZ2VzKHN0cnVjdCB6b25lbGlzdCAqem9uZWxpc3QsIGludCBvcmRlciwKIAkJCQkJZ2ZwX3QgZ2ZwX21hc2spOwogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcyhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtLAotCQkJCQkJCWdmcF90IGdmcF9tYXNrKTsKKwkJCQkJCSAgZ2ZwX3QgZ2ZwX21hc2ssIGJvb2wgbm9zd2FwLAorCQkJCQkJICB1bnNpZ25lZCBpbnQgc3dhcHBpbmVzcyk7CiBleHRlcm4gaW50IF9faXNvbGF0ZV9scnVfcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSwgaW50IG1vZGUsIGludCBmaWxlKTsKIGV4dGVybiB1bnNpZ25lZCBsb25nIHNocmlua19hbGxfbWVtb3J5KHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMpOwogZXh0ZXJuIGludCB2bV9zd2FwcGluZXNzOwpAQCAtMzMzLDYgKzMzNCwyMiBAQAogCXB1dF9zd2FwX3Rva2VuKHN3YXBfdG9rZW5fbW0pOwogfQogCisjaWZkZWYgQ09ORklHX0NHUk9VUF9NRU1fUkVTX0NUTFIKK2V4dGVybiB2b2lkIG1lbV9jZ3JvdXBfdW5jaGFyZ2Vfc3dhcGNhY2hlKHN0cnVjdCBwYWdlICpwYWdlLCBzd3BfZW50cnlfdCBlbnQpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZAorbWVtX2Nncm91cF91bmNoYXJnZV9zd2FwY2FjaGUoc3RydWN0IHBhZ2UgKnBhZ2UsIHN3cF9lbnRyeV90IGVudCkKK3sKK30KKyNlbmRpZgorI2lmZGVmIENPTkZJR19DR1JPVVBfTUVNX1JFU19DVExSX1NXQVAKK2V4dGVybiB2b2lkIG1lbV9jZ3JvdXBfdW5jaGFyZ2Vfc3dhcChzd3BfZW50cnlfdCBlbnQpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCBtZW1fY2dyb3VwX3VuY2hhcmdlX3N3YXAoc3dwX2VudHJ5X3QgZW50KQoreworfQorI2VuZGlmCisKICNlbHNlIC8qIENPTkZJR19TV0FQICovCiAKICNkZWZpbmUgbnJfc3dhcF9wYWdlcwkJCQkwTApAQCAtNDA5LDYgKzQyNiwxMiBAQAogI2RlZmluZSBoYXNfc3dhcF90b2tlbih4KSAwCiAjZGVmaW5lIGRpc2FibGVfc3dhcF90b2tlbigpIGRvIHsgfSB3aGlsZSgwKQogCitzdGF0aWMgaW5saW5lIGludCBtZW1fY2dyb3VwX2NhY2hlX2NoYXJnZV9zd2FwaW4oc3RydWN0IHBhZ2UgKnBhZ2UsCisJCQlzdHJ1Y3QgbW1fc3RydWN0ICptbSwgZ2ZwX3QgbWFzaywgYm9vbCBsb2NrZWQpCit7CisJcmV0dXJuIDA7Cit9CisKICNlbmRpZiAvKiBDT05GSUdfU1dBUCAqLwogI2VuZGlmIC8qIF9fS0VSTkVMX18qLwogI2VuZGlmIC8qIF9MSU5VWF9TV0FQX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc3lzY2FsbHMuaCBiL2luY2x1ZGUvbGludXgvc3lzY2FsbHMuaAppbmRleCAxOGQwYTI0Li4xNjg3NWY4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3N5c2NhbGxzLmgKKysrIGIvaW5jbHVkZS9saW51eC9zeXNjYWxscy5oCkBAIC01NCw2ICs1NCw3IEBACiBzdHJ1Y3QgY29tcGF0X3RpbWV2YWw7CiBzdHJ1Y3Qgcm9idXN0X2xpc3RfaGVhZDsKIHN0cnVjdCBnZXRjcHVfY2FjaGU7CitzdHJ1Y3Qgb2xkX2xpbnV4X2RpcmVudDsKIAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvYWlvX2FiaS5oPgpAQCAtNjUsNiArNjYsNzQgQEAKICNpbmNsdWRlIDxsaW51eC9xdW90YS5oPgogI2luY2x1ZGUgPGxpbnV4L2tleS5oPgogCisjZGVmaW5lIF9fU0NfREVDTDEodDEsIGExKQl0MSBhMQorI2RlZmluZSBfX1NDX0RFQ0wyKHQyLCBhMiwgLi4uKSB0MiBhMiwgX19TQ19ERUNMMShfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX19TQ19ERUNMMyh0MywgYTMsIC4uLikgdDMgYTMsIF9fU0NfREVDTDIoX19WQV9BUkdTX18pCisjZGVmaW5lIF9fU0NfREVDTDQodDQsIGE0LCAuLi4pIHQ0IGE0LCBfX1NDX0RFQ0wzKF9fVkFfQVJHU19fKQorI2RlZmluZSBfX1NDX0RFQ0w1KHQ1LCBhNSwgLi4uKSB0NSBhNSwgX19TQ19ERUNMNChfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX19TQ19ERUNMNih0NiwgYTYsIC4uLikgdDYgYTYsIF9fU0NfREVDTDUoX19WQV9BUkdTX18pCisKKyNkZWZpbmUgX19TQ19MT05HMSh0MSwgYTEpIAlsb25nIGExCisjZGVmaW5lIF9fU0NfTE9ORzIodDIsIGEyLCAuLi4pIGxvbmcgYTIsIF9fU0NfTE9ORzEoX19WQV9BUkdTX18pCisjZGVmaW5lIF9fU0NfTE9ORzModDMsIGEzLCAuLi4pIGxvbmcgYTMsIF9fU0NfTE9ORzIoX19WQV9BUkdTX18pCisjZGVmaW5lIF9fU0NfTE9ORzQodDQsIGE0LCAuLi4pIGxvbmcgYTQsIF9fU0NfTE9ORzMoX19WQV9BUkdTX18pCisjZGVmaW5lIF9fU0NfTE9ORzUodDUsIGE1LCAuLi4pIGxvbmcgYTUsIF9fU0NfTE9ORzQoX19WQV9BUkdTX18pCisjZGVmaW5lIF9fU0NfTE9ORzYodDYsIGE2LCAuLi4pIGxvbmcgYTYsIF9fU0NfTE9ORzUoX19WQV9BUkdTX18pCisKKyNkZWZpbmUgX19TQ19DQVNUMSh0MSwgYTEpCSh0MSkgYTEKKyNkZWZpbmUgX19TQ19DQVNUMih0MiwgYTIsIC4uLikgKHQyKSBhMiwgX19TQ19DQVNUMShfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX19TQ19DQVNUMyh0MywgYTMsIC4uLikgKHQzKSBhMywgX19TQ19DQVNUMihfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX19TQ19DQVNUNCh0NCwgYTQsIC4uLikgKHQ0KSBhNCwgX19TQ19DQVNUMyhfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX19TQ19DQVNUNSh0NSwgYTUsIC4uLikgKHQ1KSBhNSwgX19TQ19DQVNUNChfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX19TQ19DQVNUNih0NiwgYTYsIC4uLikgKHQ2KSBhNiwgX19TQ19DQVNUNShfX1ZBX0FSR1NfXykKKworI2RlZmluZSBfX1NDX1RFU1QodHlwZSkJCUJVSUxEX0JVR19PTihzaXplb2YodHlwZSkgPiBzaXplb2YobG9uZykpCisjZGVmaW5lIF9fU0NfVEVTVDEodDEsIGExKQlfX1NDX1RFU1QodDEpCisjZGVmaW5lIF9fU0NfVEVTVDIodDIsIGEyLCAuLi4pCV9fU0NfVEVTVCh0Mik7IF9fU0NfVEVTVDEoX19WQV9BUkdTX18pCisjZGVmaW5lIF9fU0NfVEVTVDModDMsIGEzLCAuLi4pCV9fU0NfVEVTVCh0Myk7IF9fU0NfVEVTVDIoX19WQV9BUkdTX18pCisjZGVmaW5lIF9fU0NfVEVTVDQodDQsIGE0LCAuLi4pCV9fU0NfVEVTVCh0NCk7IF9fU0NfVEVTVDMoX19WQV9BUkdTX18pCisjZGVmaW5lIF9fU0NfVEVTVDUodDUsIGE1LCAuLi4pCV9fU0NfVEVTVCh0NSk7IF9fU0NfVEVTVDQoX19WQV9BUkdTX18pCisjZGVmaW5lIF9fU0NfVEVTVDYodDYsIGE2LCAuLi4pCV9fU0NfVEVTVCh0Nik7IF9fU0NfVEVTVDUoX19WQV9BUkdTX18pCisKKyNkZWZpbmUgU1lTQ0FMTF9ERUZJTkUwKG5hbWUpICAgYXNtbGlua2FnZSBsb25nIHN5c18jI25hbWUodm9pZCkKKyNkZWZpbmUgU1lTQ0FMTF9ERUZJTkUxKC4uLikgICAgU1lTQ0FMTF9ERUZJTkV4KDEsIF9fVkFfQVJHU19fKQorI2RlZmluZSBTWVNDQUxMX0RFRklORTIoLi4uKSAgICBTWVNDQUxMX0RFRklORXgoMiwgX19WQV9BUkdTX18pCisjZGVmaW5lIFNZU0NBTExfREVGSU5FMyguLi4pICAgIFNZU0NBTExfREVGSU5FeCgzLCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgU1lTQ0FMTF9ERUZJTkU0KC4uLikgICAgU1lTQ0FMTF9ERUZJTkV4KDQsIF9fVkFfQVJHU19fKQorI2RlZmluZSBTWVNDQUxMX0RFRklORTUoLi4uKSAgICBTWVNDQUxMX0RFRklORXgoNSwgX19WQV9BUkdTX18pCisjZGVmaW5lIFNZU0NBTExfREVGSU5FNiguLi4pICAgIFNZU0NBTExfREVGSU5FeCg2LCBfX1ZBX0FSR1NfXykKKworI2lmZGVmIENPTkZJR19QUEM2NAorI2RlZmluZSBTWVNDQUxMX0FMSUFTKGFsaWFzLCBuYW1lKQkJCQkJXAorCWFzbSAoIlx0Lmdsb2JsICIgI2FsaWFzICJcblx0LnNldCAiICNhbGlhcyAiLCAiICNuYW1lICJcbiIJXAorCSAgICAgIlx0Lmdsb2JsIC4iICNhbGlhcyAiXG5cdC5zZXQgLiIgI2FsaWFzICIsIC4iICNuYW1lKQorI2Vsc2UKKyNkZWZpbmUgU1lTQ0FMTF9BTElBUyhhbGlhcywgbmFtZSkJCQkJCVwKKwlhc20gKCJcdC5nbG9ibCAiICNhbGlhcyAiXG5cdC5zZXQgIiAjYWxpYXMgIiwgIiAjbmFtZSkKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0hBVkVfU1lTQ0FMTF9XUkFQUEVSUworCisjZGVmaW5lIFNZU0NBTExfREVGSU5FKG5hbWUpIHN0YXRpYyBpbmxpbmUgbG9uZyBTWVNDXyMjbmFtZQorI2RlZmluZSBTWVNDQUxMX0RFRklORXgoeCwgbmFtZSwgLi4uKQkJCQkJXAorCWFzbWxpbmthZ2UgbG9uZyBzeXNfIyNuYW1lKF9fU0NfREVDTCMjeChfX1ZBX0FSR1NfXykpOwkJXAorCXN0YXRpYyBpbmxpbmUgbG9uZyBTWVNDXyMjbmFtZShfX1NDX0RFQ0wjI3goX19WQV9BUkdTX18pKTsJXAorCWFzbWxpbmthZ2UgbG9uZyBTeVNfIyNuYW1lKF9fU0NfTE9ORyMjeChfX1ZBX0FSR1NfXykpCQlcCisJewkJCQkJCQkJXAorCQlfX1NDX1RFU1QjI3goX19WQV9BUkdTX18pOwkJCQlcCisJCXJldHVybiAobG9uZykgU1lTQ18jI25hbWUoX19TQ19DQVNUIyN4KF9fVkFfQVJHU19fKSk7CVwKKwl9CQkJCQkJCQlcCisJU1lTQ0FMTF9BTElBUyhzeXNfIyNuYW1lLCBTeVNfIyNuYW1lKTsJCQkJXAorCXN0YXRpYyBpbmxpbmUgbG9uZyBTWVNDXyMjbmFtZShfX1NDX0RFQ0wjI3goX19WQV9BUkdTX18pKQorCisjZWxzZSAvKiBDT05GSUdfSEFWRV9TWVNDQUxMX1dSQVBQRVJTICovCisKKyNkZWZpbmUgU1lTQ0FMTF9ERUZJTkUobmFtZSkgYXNtbGlua2FnZSBsb25nIHN5c18jI25hbWUKKyNkZWZpbmUgU1lTQ0FMTF9ERUZJTkV4KHgsIG5hbWUsIC4uLikJCQkJCVwKKwlhc21saW5rYWdlIGxvbmcgc3lzXyMjbmFtZShfX1NDX0RFQ0wjI3goX19WQV9BUkdTX18pKQorCisjZW5kaWYgLyogQ09ORklHX0hBVkVfU1lTQ0FMTF9XUkFQUEVSUyAqLworCiBhc21saW5rYWdlIGxvbmcgc3lzX3RpbWUodGltZV90IF9fdXNlciAqdGxvYyk7CiBhc21saW5rYWdlIGxvbmcgc3lzX3N0aW1lKHRpbWVfdCBfX3VzZXIgKnRwdHIpOwogYXNtbGlua2FnZSBsb25nIHN5c19nZXR0aW1lb2ZkYXkoc3RydWN0IHRpbWV2YWwgX191c2VyICp0diwKQEAgLTc3LDcgKzE0Niw3IEBACiAKIGFzbWxpbmthZ2UgbG9uZyBzeXNfZ2V0dGlkKHZvaWQpOwogYXNtbGlua2FnZSBsb25nIHN5c19uYW5vc2xlZXAoc3RydWN0IHRpbWVzcGVjIF9fdXNlciAqcnF0cCwgc3RydWN0IHRpbWVzcGVjIF9fdXNlciAqcm10cCk7Ci1hc21saW5rYWdlIHVuc2lnbmVkIGxvbmcgc3lzX2FsYXJtKHVuc2lnbmVkIGludCBzZWNvbmRzKTsKK2FzbWxpbmthZ2UgbG9uZyBzeXNfYWxhcm0odW5zaWduZWQgaW50IHNlY29uZHMpOwogYXNtbGlua2FnZSBsb25nIHN5c19nZXRwaWQodm9pZCk7CiBhc21saW5rYWdlIGxvbmcgc3lzX2dldHBwaWQodm9pZCk7CiBhc21saW5rYWdlIGxvbmcgc3lzX2dldHVpZCh2b2lkKTsKQEAgLTE2Niw3ICsyMzUsNyBAQAogCQkJCXVuc2lnbmVkIGxvbmcgZmxhZ3MpOwogCiBhc21saW5rYWdlIGxvbmcgc3lzX2V4aXQoaW50IGVycm9yX2NvZGUpOwotYXNtbGlua2FnZSB2b2lkIHN5c19leGl0X2dyb3VwKGludCBlcnJvcl9jb2RlKTsKK2FzbWxpbmthZ2UgbG9uZyBzeXNfZXhpdF9ncm91cChpbnQgZXJyb3JfY29kZSk7CiBhc21saW5rYWdlIGxvbmcgc3lzX3dhaXQ0KHBpZF90IHBpZCwgaW50IF9fdXNlciAqc3RhdF9hZGRyLAogCQkJCWludCBvcHRpb25zLCBzdHJ1Y3QgcnVzYWdlIF9fdXNlciAqcnUpOwogYXNtbGlua2FnZSBsb25nIHN5c193YWl0aWQoaW50IHdoaWNoLCBwaWRfdCBwaWQsCkBAIC0xOTYsNyArMjY1LDcgQEAKIGFzbWxpbmthZ2UgbG9uZyBzeXNfcnRfc2lncXVldWVpbmZvKGludCBwaWQsIGludCBzaWcsIHNpZ2luZm9fdCBfX3VzZXIgKnVpbmZvKTsKIGFzbWxpbmthZ2UgbG9uZyBzeXNfc2dldG1hc2sodm9pZCk7CiBhc21saW5rYWdlIGxvbmcgc3lzX3NzZXRtYXNrKGludCBuZXdtYXNrKTsKLWFzbWxpbmthZ2UgdW5zaWduZWQgbG9uZyBzeXNfc2lnbmFsKGludCBzaWcsIF9fc2lnaGFuZGxlcl90IGhhbmRsZXIpOworYXNtbGlua2FnZSBsb25nIHN5c19zaWduYWwoaW50IHNpZywgX19zaWdoYW5kbGVyX3QgaGFuZGxlcik7CiBhc21saW5rYWdlIGxvbmcgc3lzX3BhdXNlKHZvaWQpOwogCiBhc21saW5rYWdlIGxvbmcgc3lzX3N5bmModm9pZCk7CkBAIC0yNDYsMjkgKzMxNSwyOSBAQAogCQkJICAgICAgY29uc3Qgdm9pZCBfX3VzZXIgKnZhbHVlLCBzaXplX3Qgc2l6ZSwgaW50IGZsYWdzKTsKIGFzbWxpbmthZ2UgbG9uZyBzeXNfZnNldHhhdHRyKGludCBmZCwgY29uc3QgY2hhciBfX3VzZXIgKm5hbWUsCiAJCQkgICAgICBjb25zdCB2b2lkIF9fdXNlciAqdmFsdWUsIHNpemVfdCBzaXplLCBpbnQgZmxhZ3MpOwotYXNtbGlua2FnZSBzc2l6ZV90IHN5c19nZXR4YXR0cihjb25zdCBjaGFyIF9fdXNlciAqcGF0aCwgY29uc3QgY2hhciBfX3VzZXIgKm5hbWUsCi0JCQkJdm9pZCBfX3VzZXIgKnZhbHVlLCBzaXplX3Qgc2l6ZSk7Ci1hc21saW5rYWdlIHNzaXplX3Qgc3lzX2xnZXR4YXR0cihjb25zdCBjaGFyIF9fdXNlciAqcGF0aCwgY29uc3QgY2hhciBfX3VzZXIgKm5hbWUsCi0JCQkJdm9pZCBfX3VzZXIgKnZhbHVlLCBzaXplX3Qgc2l6ZSk7Ci1hc21saW5rYWdlIHNzaXplX3Qgc3lzX2ZnZXR4YXR0cihpbnQgZmQsIGNvbnN0IGNoYXIgX191c2VyICpuYW1lLAotCQkJCXZvaWQgX191c2VyICp2YWx1ZSwgc2l6ZV90IHNpemUpOwotYXNtbGlua2FnZSBzc2l6ZV90IHN5c19saXN0eGF0dHIoY29uc3QgY2hhciBfX3VzZXIgKnBhdGgsIGNoYXIgX191c2VyICpsaXN0LAotCQkJCXNpemVfdCBzaXplKTsKLWFzbWxpbmthZ2Ugc3NpemVfdCBzeXNfbGxpc3R4YXR0cihjb25zdCBjaGFyIF9fdXNlciAqcGF0aCwgY2hhciBfX3VzZXIgKmxpc3QsCi0JCQkJc2l6ZV90IHNpemUpOwotYXNtbGlua2FnZSBzc2l6ZV90IHN5c19mbGlzdHhhdHRyKGludCBmZCwgY2hhciBfX3VzZXIgKmxpc3QsIHNpemVfdCBzaXplKTsKK2FzbWxpbmthZ2UgbG9uZyBzeXNfZ2V0eGF0dHIoY29uc3QgY2hhciBfX3VzZXIgKnBhdGgsIGNvbnN0IGNoYXIgX191c2VyICpuYW1lLAorCQkJICAgICB2b2lkIF9fdXNlciAqdmFsdWUsIHNpemVfdCBzaXplKTsKK2FzbWxpbmthZ2UgbG9uZyBzeXNfbGdldHhhdHRyKGNvbnN0IGNoYXIgX191c2VyICpwYXRoLCBjb25zdCBjaGFyIF9fdXNlciAqbmFtZSwKKwkJCSAgICAgIHZvaWQgX191c2VyICp2YWx1ZSwgc2l6ZV90IHNpemUpOworYXNtbGlua2FnZSBsb25nIHN5c19mZ2V0eGF0dHIoaW50IGZkLCBjb25zdCBjaGFyIF9fdXNlciAqbmFtZSwKKwkJCSAgICAgIHZvaWQgX191c2VyICp2YWx1ZSwgc2l6ZV90IHNpemUpOworYXNtbGlua2FnZSBsb25nIHN5c19saXN0eGF0dHIoY29uc3QgY2hhciBfX3VzZXIgKnBhdGgsIGNoYXIgX191c2VyICpsaXN0LAorCQkJICAgICAgc2l6ZV90IHNpemUpOworYXNtbGlua2FnZSBsb25nIHN5c19sbGlzdHhhdHRyKGNvbnN0IGNoYXIgX191c2VyICpwYXRoLCBjaGFyIF9fdXNlciAqbGlzdCwKKwkJCSAgICAgICBzaXplX3Qgc2l6ZSk7Cithc21saW5rYWdlIGxvbmcgc3lzX2ZsaXN0eGF0dHIoaW50IGZkLCBjaGFyIF9fdXNlciAqbGlzdCwgc2l6ZV90IHNpemUpOwogYXNtbGlua2FnZSBsb25nIHN5c19yZW1vdmV4YXR0cihjb25zdCBjaGFyIF9fdXNlciAqcGF0aCwKIAkJCQljb25zdCBjaGFyIF9fdXNlciAqbmFtZSk7CiBhc21saW5rYWdlIGxvbmcgc3lzX2xyZW1vdmV4YXR0cihjb25zdCBjaGFyIF9fdXNlciAqcGF0aCwKIAkJCQkgY29uc3QgY2hhciBfX3VzZXIgKm5hbWUpOwogYXNtbGlua2FnZSBsb25nIHN5c19mcmVtb3ZleGF0dHIoaW50IGZkLCBjb25zdCBjaGFyIF9fdXNlciAqbmFtZSk7CiAKLWFzbWxpbmthZ2UgdW5zaWduZWQgbG9uZyBzeXNfYnJrKHVuc2lnbmVkIGxvbmcgYnJrKTsKK2FzbWxpbmthZ2UgbG9uZyBzeXNfYnJrKHVuc2lnbmVkIGxvbmcgYnJrKTsKIGFzbWxpbmthZ2UgbG9uZyBzeXNfbXByb3RlY3QodW5zaWduZWQgbG9uZyBzdGFydCwgc2l6ZV90IGxlbiwKIAkJCQl1bnNpZ25lZCBsb25nIHByb3QpOwotYXNtbGlua2FnZSB1bnNpZ25lZCBsb25nIHN5c19tcmVtYXAodW5zaWduZWQgbG9uZyBhZGRyLAotCQkJCXVuc2lnbmVkIGxvbmcgb2xkX2xlbiwgdW5zaWduZWQgbG9uZyBuZXdfbGVuLAotCQkJCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIHVuc2lnbmVkIGxvbmcgbmV3X2FkZHIpOworYXNtbGlua2FnZSBsb25nIHN5c19tcmVtYXAodW5zaWduZWQgbG9uZyBhZGRyLAorCQkJICAgdW5zaWduZWQgbG9uZyBvbGRfbGVuLCB1bnNpZ25lZCBsb25nIG5ld19sZW4sCisJCQkgICB1bnNpZ25lZCBsb25nIGZsYWdzLCB1bnNpZ25lZCBsb25nIG5ld19hZGRyKTsKIGFzbWxpbmthZ2UgbG9uZyBzeXNfcmVtYXBfZmlsZV9wYWdlcyh1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIHNpemUsCiAJCQl1bnNpZ25lZCBsb25nIHByb3QsIHVuc2lnbmVkIGxvbmcgcGdvZmYsCiAJCQl1bnNpZ25lZCBsb25nIGZsYWdzKTsKQEAgLTMyMSwxMCArMzkwLDEwIEBACiAJCQkJc3RydWN0IGlvY2IgX191c2VyICogX191c2VyICopOwogYXNtbGlua2FnZSBsb25nIHN5c19pb19jYW5jZWwoYWlvX2NvbnRleHRfdCBjdHhfaWQsIHN0cnVjdCBpb2NiIF9fdXNlciAqaW9jYiwKIAkJCSAgICAgIHN0cnVjdCBpb19ldmVudCBfX3VzZXIgKnJlc3VsdCk7Ci1hc21saW5rYWdlIHNzaXplX3Qgc3lzX3NlbmRmaWxlKGludCBvdXRfZmQsIGludCBpbl9mZCwKLQkJCQlvZmZfdCBfX3VzZXIgKm9mZnNldCwgc2l6ZV90IGNvdW50KTsKLWFzbWxpbmthZ2Ugc3NpemVfdCBzeXNfc2VuZGZpbGU2NChpbnQgb3V0X2ZkLCBpbnQgaW5fZmQsCi0JCQkJbG9mZl90IF9fdXNlciAqb2Zmc2V0LCBzaXplX3QgY291bnQpOworYXNtbGlua2FnZSBsb25nIHN5c19zZW5kZmlsZShpbnQgb3V0X2ZkLCBpbnQgaW5fZmQsCisJCQkgICAgIG9mZl90IF9fdXNlciAqb2Zmc2V0LCBzaXplX3QgY291bnQpOworYXNtbGlua2FnZSBsb25nIHN5c19zZW5kZmlsZTY0KGludCBvdXRfZmQsIGludCBpbl9mZCwKKwkJCSAgICAgICBsb2ZmX3QgX191c2VyICpvZmZzZXQsIHNpemVfdCBjb3VudCk7CiBhc21saW5rYWdlIGxvbmcgc3lzX3JlYWRsaW5rKGNvbnN0IGNoYXIgX191c2VyICpwYXRoLAogCQkJCWNoYXIgX191c2VyICpidWYsIGludCBidWZzaXopOwogYXNtbGlua2FnZSBsb25nIHN5c19jcmVhdChjb25zdCBjaGFyIF9fdXNlciAqcGF0aG5hbWUsIGludCBtb2RlKTsKQEAgLTM2OCwyNiArNDM3LDI1IEBACiAJCQkJc3RydWN0IHV0aW1idWYgX191c2VyICp0aW1lcyk7CiBhc21saW5rYWdlIGxvbmcgc3lzX3V0aW1lcyhjaGFyIF9fdXNlciAqZmlsZW5hbWUsCiAJCQkJc3RydWN0IHRpbWV2YWwgX191c2VyICp1dGltZXMpOwotYXNtbGlua2FnZSBvZmZfdCBzeXNfbHNlZWsodW5zaWduZWQgaW50IGZkLCBvZmZfdCBvZmZzZXQsCi0JCQkJdW5zaWduZWQgaW50IG9yaWdpbik7Cithc21saW5rYWdlIGxvbmcgc3lzX2xzZWVrKHVuc2lnbmVkIGludCBmZCwgb2ZmX3Qgb2Zmc2V0LAorCQkJICB1bnNpZ25lZCBpbnQgb3JpZ2luKTsKIGFzbWxpbmthZ2UgbG9uZyBzeXNfbGxzZWVrKHVuc2lnbmVkIGludCBmZCwgdW5zaWduZWQgbG9uZyBvZmZzZXRfaGlnaCwKIAkJCXVuc2lnbmVkIGxvbmcgb2Zmc2V0X2xvdywgbG9mZl90IF9fdXNlciAqcmVzdWx0LAogCQkJdW5zaWduZWQgaW50IG9yaWdpbik7Ci1hc21saW5rYWdlIHNzaXplX3Qgc3lzX3JlYWQodW5zaWduZWQgaW50IGZkLCBjaGFyIF9fdXNlciAqYnVmLAotCQkJCXNpemVfdCBjb3VudCk7Ci1hc21saW5rYWdlIHNzaXplX3Qgc3lzX3JlYWRhaGVhZChpbnQgZmQsIGxvZmZfdCBvZmZzZXQsIHNpemVfdCBjb3VudCk7Ci1hc21saW5rYWdlIHNzaXplX3Qgc3lzX3JlYWR2KHVuc2lnbmVkIGxvbmcgZmQsCi0JCQkJY29uc3Qgc3RydWN0IGlvdmVjIF9fdXNlciAqdmVjLAotCQkJCXVuc2lnbmVkIGxvbmcgdmxlbik7Ci1hc21saW5rYWdlIHNzaXplX3Qgc3lzX3dyaXRlKHVuc2lnbmVkIGludCBmZCwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKLQkJCQlzaXplX3QgY291bnQpOwotYXNtbGlua2FnZSBzc2l6ZV90IHN5c193cml0ZXYodW5zaWduZWQgbG9uZyBmZCwKLQkJCQljb25zdCBzdHJ1Y3QgaW92ZWMgX191c2VyICp2ZWMsCi0JCQkJdW5zaWduZWQgbG9uZyB2bGVuKTsKLWFzbWxpbmthZ2Ugc3NpemVfdCBzeXNfcHJlYWQ2NCh1bnNpZ25lZCBpbnQgZmQsIGNoYXIgX191c2VyICpidWYsCi0JCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgcG9zKTsKLWFzbWxpbmthZ2Ugc3NpemVfdCBzeXNfcHdyaXRlNjQodW5zaWduZWQgaW50IGZkLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLAotCQkJCXNpemVfdCBjb3VudCwgbG9mZl90IHBvcyk7Cithc21saW5rYWdlIGxvbmcgc3lzX3JlYWQodW5zaWduZWQgaW50IGZkLCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQpOworYXNtbGlua2FnZSBsb25nIHN5c19yZWFkYWhlYWQoaW50IGZkLCBsb2ZmX3Qgb2Zmc2V0LCBzaXplX3QgY291bnQpOworYXNtbGlua2FnZSBsb25nIHN5c19yZWFkdih1bnNpZ25lZCBsb25nIGZkLAorCQkJICBjb25zdCBzdHJ1Y3QgaW92ZWMgX191c2VyICp2ZWMsCisJCQkgIHVuc2lnbmVkIGxvbmcgdmxlbik7Cithc21saW5rYWdlIGxvbmcgc3lzX3dyaXRlKHVuc2lnbmVkIGludCBmZCwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJCSAgc2l6ZV90IGNvdW50KTsKK2FzbWxpbmthZ2UgbG9uZyBzeXNfd3JpdGV2KHVuc2lnbmVkIGxvbmcgZmQsCisJCQkgICBjb25zdCBzdHJ1Y3QgaW92ZWMgX191c2VyICp2ZWMsCisJCQkgICB1bnNpZ25lZCBsb25nIHZsZW4pOworYXNtbGlua2FnZSBsb25nIHN5c19wcmVhZDY0KHVuc2lnbmVkIGludCBmZCwgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJCSAgICBzaXplX3QgY291bnQsIGxvZmZfdCBwb3MpOworYXNtbGlua2FnZSBsb25nIHN5c19wd3JpdGU2NCh1bnNpZ25lZCBpbnQgZmQsIGNvbnN0IGNoYXIgX191c2VyICpidWYsCisJCQkgICAgIHNpemVfdCBjb3VudCwgbG9mZl90IHBvcyk7CiBhc21saW5rYWdlIGxvbmcgc3lzX2dldGN3ZChjaGFyIF9fdXNlciAqYnVmLCB1bnNpZ25lZCBsb25nIHNpemUpOwogYXNtbGlua2FnZSBsb25nIHN5c19ta2Rpcihjb25zdCBjaGFyIF9fdXNlciAqcGF0aG5hbWUsIGludCBtb2RlKTsKIGFzbWxpbmthZ2UgbG9uZyBzeXNfY2hkaXIoY29uc3QgY2hhciBfX3VzZXIgKmZpbGVuYW1lKTsKQEAgLTQ3Niw3ICs1NDQsNyBAQAogYXNtbGlua2FnZSBsb25nIHN5c19tcV9vcGVuKGNvbnN0IGNoYXIgX191c2VyICpuYW1lLCBpbnQgb2ZsYWcsIG1vZGVfdCBtb2RlLCBzdHJ1Y3QgbXFfYXR0ciBfX3VzZXIgKmF0dHIpOwogYXNtbGlua2FnZSBsb25nIHN5c19tcV91bmxpbmsoY29uc3QgY2hhciBfX3VzZXIgKm5hbWUpOwogYXNtbGlua2FnZSBsb25nIHN5c19tcV90aW1lZHNlbmQobXFkX3QgbXFkZXMsIGNvbnN0IGNoYXIgX191c2VyICptc2dfcHRyLCBzaXplX3QgbXNnX2xlbiwgdW5zaWduZWQgaW50IG1zZ19wcmlvLCBjb25zdCBzdHJ1Y3QgdGltZXNwZWMgX191c2VyICphYnNfdGltZW91dCk7Ci1hc21saW5rYWdlIHNzaXplX3Qgc3lzX21xX3RpbWVkcmVjZWl2ZShtcWRfdCBtcWRlcywgY2hhciBfX3VzZXIgKm1zZ19wdHIsIHNpemVfdCBtc2dfbGVuLCB1bnNpZ25lZCBpbnQgX191c2VyICptc2dfcHJpbywgY29uc3Qgc3RydWN0IHRpbWVzcGVjIF9fdXNlciAqYWJzX3RpbWVvdXQpOworYXNtbGlua2FnZSBsb25nIHN5c19tcV90aW1lZHJlY2VpdmUobXFkX3QgbXFkZXMsIGNoYXIgX191c2VyICptc2dfcHRyLCBzaXplX3QgbXNnX2xlbiwgdW5zaWduZWQgaW50IF9fdXNlciAqbXNnX3ByaW8sIGNvbnN0IHN0cnVjdCB0aW1lc3BlYyBfX3VzZXIgKmFic190aW1lb3V0KTsKIGFzbWxpbmthZ2UgbG9uZyBzeXNfbXFfbm90aWZ5KG1xZF90IG1xZGVzLCBjb25zdCBzdHJ1Y3Qgc2lnZXZlbnQgX191c2VyICpub3RpZmljYXRpb24pOwogYXNtbGlua2FnZSBsb25nIHN5c19tcV9nZXRzZXRhdHRyKG1xZF90IG1xZGVzLCBjb25zdCBzdHJ1Y3QgbXFfYXR0ciBfX3VzZXIgKm1xc3RhdCwgc3RydWN0IG1xX2F0dHIgX191c2VyICpvbXFzdGF0KTsKIApAQCAtNTMwLDExICs1OTgsNiBAQAogCQkJCWNvbnN0IGludCBfX3VzZXIgKm5vZGVzLAogCQkJCWludCBfX3VzZXIgKnN0YXR1cywKIAkJCQlpbnQgZmxhZ3MpOwotYXNtbGlua2FnZSBsb25nIGNvbXBhdF9zeXNfbW92ZV9wYWdlcyhwaWRfdCBwaWQsIHVuc2lnbmVkIGxvbmcgbnJfcGFnZSwKLQkJCQlfX3UzMiBfX3VzZXIgKnBhZ2VzLAotCQkJCWNvbnN0IGludCBfX3VzZXIgKm5vZGVzLAotCQkJCWludCBfX3VzZXIgKnN0YXR1cywKLQkJCQlpbnQgZmxhZ3MpOwogYXNtbGlua2FnZSBsb25nIHN5c19tYmluZCh1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGxlbiwKIAkJCQl1bnNpZ25lZCBsb25nIG1vZGUsCiAJCQkJdW5zaWduZWQgbG9uZyBfX3VzZXIgKm5tYXNrLApAQCAtNTgzLDEzICs2NDYsNiBAQAogCQkJICAgICAgIGludCBidWZzaXopOwogYXNtbGlua2FnZSBsb25nIHN5c191dGltZW5zYXQoaW50IGRmZCwgY2hhciBfX3VzZXIgKmZpbGVuYW1lLAogCQkJCXN0cnVjdCB0aW1lc3BlYyBfX3VzZXIgKnV0aW1lcywgaW50IGZsYWdzKTsKLWFzbWxpbmthZ2UgbG9uZyBjb21wYXRfc3lzX2Z1dGltZXNhdCh1bnNpZ25lZCBpbnQgZGZkLCBjaGFyIF9fdXNlciAqZmlsZW5hbWUsCi0JCQkJICAgICBzdHJ1Y3QgY29tcGF0X3RpbWV2YWwgX191c2VyICp0KTsKLWFzbWxpbmthZ2UgbG9uZyBjb21wYXRfc3lzX25ld2ZzdGF0YXQodW5zaWduZWQgaW50IGRmZCwgY2hhciBfX3VzZXIgKiBmaWxlbmFtZSwKLQkJCQkgICAgICBzdHJ1Y3QgY29tcGF0X3N0YXQgX191c2VyICpzdGF0YnVmLAotCQkJCSAgICAgIGludCBmbGFnKTsKLWFzbWxpbmthZ2UgbG9uZyBjb21wYXRfc3lzX29wZW5hdCh1bnNpZ25lZCBpbnQgZGZkLCBjb25zdCBjaGFyIF9fdXNlciAqZmlsZW5hbWUsCi0JCQkJICAgaW50IGZsYWdzLCBpbnQgbW9kZSk7CiBhc21saW5rYWdlIGxvbmcgc3lzX3Vuc2hhcmUodW5zaWduZWQgbG9uZyB1bnNoYXJlX2ZsYWdzKTsKIAogYXNtbGlua2FnZSBsb25nIHN5c19zcGxpY2UoaW50IGZkX2luLCBsb2ZmX3QgX191c2VyICpvZmZfaW4sCkBAIC02MjEsNiArNjc3LDE1IEBACiBhc21saW5rYWdlIGxvbmcgc3lzX2V2ZW50ZmQodW5zaWduZWQgaW50IGNvdW50KTsKIGFzbWxpbmthZ2UgbG9uZyBzeXNfZXZlbnRmZDIodW5zaWduZWQgaW50IGNvdW50LCBpbnQgZmxhZ3MpOwogYXNtbGlua2FnZSBsb25nIHN5c19mYWxsb2NhdGUoaW50IGZkLCBpbnQgbW9kZSwgbG9mZl90IG9mZnNldCwgbG9mZl90IGxlbik7Cithc21saW5rYWdlIGxvbmcgc3lzX29sZF9yZWFkZGlyKHVuc2lnbmVkIGludCwgc3RydWN0IG9sZF9saW51eF9kaXJlbnQgX191c2VyICosIHVuc2lnbmVkIGludCk7Cithc21saW5rYWdlIGxvbmcgc3lzX3BzZWxlY3Q2KGludCwgZmRfc2V0IF9fdXNlciAqLCBmZF9zZXQgX191c2VyICosCisJCQkgICAgIGZkX3NldCBfX3VzZXIgKiwgc3RydWN0IHRpbWVzcGVjIF9fdXNlciAqLAorCQkJICAgICB2b2lkIF9fdXNlciAqKTsKK2FzbWxpbmthZ2UgbG9uZyBzeXNfcHBvbGwoc3RydWN0IHBvbGxmZCBfX3VzZXIgKiwgdW5zaWduZWQgaW50LAorCQkJICBzdHJ1Y3QgdGltZXNwZWMgX191c2VyICosIGNvbnN0IHNpZ3NldF90IF9fdXNlciAqLAorCQkJICBzaXplX3QpOworYXNtbGlua2FnZSBsb25nIHN5c19waXBlMihpbnQgX191c2VyICosIGludCk7Cithc21saW5rYWdlIGxvbmcgc3lzX3BpcGUoaW50IF9fdXNlciAqKTsKIAogaW50IGtlcm5lbF9leGVjdmUoY29uc3QgY2hhciAqZmlsZW5hbWUsIGNoYXIgKmNvbnN0IGFyZ3ZbXSwgY2hhciAqY29uc3QgZW52cFtdKTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC90eXBlcy5oIGIvaW5jbHVkZS9saW51eC90eXBlcy5oCmluZGV4IDNiODY0ZjIuLjcxMmNhNTMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdHlwZXMuaAorKysgYi9pbmNsdWRlL2xpbnV4L3R5cGVzLmgKQEAgLTE3NiwxMCArMTc2LDkgQEAKIHR5cGVkZWYgX191MTYgX19iaXR3aXNlIF9fYmUxNjsKIHR5cGVkZWYgX191MzIgX19iaXR3aXNlIF9fbGUzMjsKIHR5cGVkZWYgX191MzIgX19iaXR3aXNlIF9fYmUzMjsKLSNpZiBkZWZpbmVkKF9fR05VQ19fKQogdHlwZWRlZiBfX3U2NCBfX2JpdHdpc2UgX19sZTY0OwogdHlwZWRlZiBfX3U2NCBfX2JpdHdpc2UgX19iZTY0OwotI2VuZGlmCisKIHR5cGVkZWYgX191MTYgX19iaXR3aXNlIF9fc3VtMTY7CiB0eXBlZGVmIF9fdTMyIF9fYml0d2lzZSBfX3dzdW07CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdXNiLmggYi9pbmNsdWRlL2xpbnV4L3VzYi5oCmluZGV4IGY3MmFhNTEuLjg1ZWU5YmUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdXNiLmgKKysrIGIvaW5jbHVkZS9saW51eC91c2IuaApAQCAtMTA4LDYgKzEwOCw3IEBACiAgKgkoaW4gcHJvYmUoKSksIGJvdW5kIHRvIGEgZHJpdmVyLCBvciB1bmJpbmRpbmcgKGluIGRpc2Nvbm5lY3QoKSkKICAqIEBpc19hY3RpdmU6IGZsYWcgc2V0IHdoZW4gdGhlIGludGVyZmFjZSBpcyBib3VuZCBhbmQgbm90IHN1c3BlbmRlZC4KICAqIEBzeXNmc19maWxlc19jcmVhdGVkOiBzeXNmcyBhdHRyaWJ1dGVzIGV4aXN0CisgKiBAZXBfZGV2c19jcmVhdGVkOiBlbmRwb2ludCBjaGlsZCBwc2V1ZG8tZGV2aWNlcyBleGlzdAogICogQHVucmVnaXN0ZXJpbmc6IGZsYWcgc2V0IHdoZW4gdGhlIGludGVyZmFjZSBpcyBiZWluZyB1bnJlZ2lzdGVyZWQKICAqIEBuZWVkc19yZW1vdGVfd2FrZXVwOiBmbGFnIHNldCB3aGVuIHRoZSBkcml2ZXIgcmVxdWlyZXMgcmVtb3RlLXdha2V1cAogICoJY2FwYWJpbGl0eSBkdXJpbmcgYXV0b3N1c3BlbmQuCkBAIC0xMjAsNiArMTIxLDExIEBACiAgKgl0byB0aGUgc3lzZnMgcmVwcmVzZW50YXRpb24gZm9yIHRoYXQgZGV2aWNlLgogICogQHBtX3VzYWdlX2NudDogUE0gdXNhZ2UgY291bnRlciBmb3IgdGhpcyBpbnRlcmZhY2U7IGF1dG9zdXNwZW5kIGlzIG5vdAogICoJYWxsb3dlZCB1bmxlc3MgdGhlIGNvdW50ZXIgaXMgMC4KKyAqIEByZXNldF93czogVXNlZCBmb3Igc2NoZWR1bGluZyByZXNldHMgZnJvbSBhdG9taWMgY29udGV4dC4KKyAqIEByZXNldF9ydW5uaW5nOiBzZXQgdG8gMSBpZiB0aGUgaW50ZXJmYWNlIGlzIGN1cnJlbnRseSBydW5uaW5nIGEKKyAqICAgICAgcXVldWVkIHJlc2V0IHNvIHRoYXQgdXNiX2NhbmNlbF9xdWV1ZWRfcmVzZXQoKSBkb2Vzbid0IHRyeSB0bworICogICAgICByZW1vdmUgZnJvbSB0aGUgd29ya3F1ZXVlIHdoZW4gcnVubmluZyBpbnNpZGUgdGhlIHdvcmtlcgorICogICAgICB0aHJlYWQuIFNlZSBfX3VzYl9xdWV1ZV9yZXNldF9kZXZpY2UoKS4KICAqCiAgKiBVU0IgZGV2aWNlIGRyaXZlcnMgYXR0YWNoIHRvIGludGVyZmFjZXMgb24gYSBwaHlzaWNhbCBkZXZpY2UuICBFYWNoCiAgKiBpbnRlcmZhY2UgZW5jYXBzdWxhdGVzIGEgc2luZ2xlIGhpZ2ggbGV2ZWwgZnVuY3Rpb24sIHN1Y2ggYXMgZmVlZGluZwpAQCAtMTY0LDE0ICsxNzAsMTcgQEAKIAllbnVtIHVzYl9pbnRlcmZhY2VfY29uZGl0aW9uIGNvbmRpdGlvbjsJCS8qIHN0YXRlIG9mIGJpbmRpbmcgKi8KIAl1bnNpZ25lZCBpc19hY3RpdmU6MTsJCS8qIHRoZSBpbnRlcmZhY2UgaXMgbm90IHN1c3BlbmRlZCAqLwogCXVuc2lnbmVkIHN5c2ZzX2ZpbGVzX2NyZWF0ZWQ6MTsJLyogdGhlIHN5c2ZzIGF0dHJpYnV0ZXMgZXhpc3QgKi8KKwl1bnNpZ25lZCBlcF9kZXZzX2NyZWF0ZWQ6MTsJLyogZW5kcG9pbnQgImRldmljZXMiIGV4aXN0ICovCiAJdW5zaWduZWQgdW5yZWdpc3RlcmluZzoxOwkvKiB1bnJlZ2lzdHJhdGlvbiBpcyBpbiBwcm9ncmVzcyAqLwogCXVuc2lnbmVkIG5lZWRzX3JlbW90ZV93YWtldXA6MTsJLyogZHJpdmVyIHJlcXVpcmVzIHJlbW90ZSB3YWtldXAgKi8KIAl1bnNpZ25lZCBuZWVkc19hbHRzZXR0aW5nMDoxOwkvKiBzd2l0Y2ggdG8gYWx0c2V0dGluZyAwIGlzIHBlbmRpbmcgKi8KIAl1bnNpZ25lZCBuZWVkc19iaW5kaW5nOjE7CS8qIG5lZWRzIGRlbGF5ZWQgdW5iaW5kL3JlYmluZCAqLworCXVuc2lnbmVkIHJlc2V0X3J1bm5pbmc6MTsKIAogCXN0cnVjdCBkZXZpY2UgZGV2OwkJLyogaW50ZXJmYWNlIHNwZWNpZmljIGRldmljZSBpbmZvICovCiAJc3RydWN0IGRldmljZSAqdXNiX2RldjsKIAlpbnQgcG1fdXNhZ2VfY250OwkJLyogdXNhZ2UgY291bnRlciBmb3IgYXV0b3N1c3BlbmQgKi8KKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgcmVzZXRfd3M7CS8qIGZvciByZXNldHMgaW4gYXRvbWljIGNvbnRleHQgKi8KIH07CiAjZGVmaW5lCXRvX3VzYl9pbnRlcmZhY2UoZCkgY29udGFpbmVyX29mKGQsIHN0cnVjdCB1c2JfaW50ZXJmYWNlLCBkZXYpCiAjZGVmaW5lCWludGVyZmFjZV90b191c2JkZXYoaW50ZikgXApAQCAtMzI5LDcgKzMzOCw3IEBACiAjZW5kaWYKIAlzdHJ1Y3QgZGV2aWNlICpkZXY7CQkvKiBkZXZpY2UgZm9yIHRoaXMgYnVzICovCiAKLSNpZiBkZWZpbmVkKENPTkZJR19VU0JfTU9OKQorI2lmIGRlZmluZWQoQ09ORklHX1VTQl9NT04pIHx8IGRlZmluZWQoQ09ORklHX1VTQl9NT05fTU9EVUxFKQogCXN0cnVjdCBtb25fYnVzICptb25fYnVzOwkvKiBub24tbnVsbCB3aGVuIGFzc29jaWF0ZWQgKi8KIAlpbnQgbW9uaXRvcmVkOwkJCS8qIG5vbi16ZXJvIHdoZW4gbW9uaXRvcmVkICovCiAjZW5kaWYKQEAgLTM5OCw2ICs0MDcsNyBAQAogICogQHVyYm51bTogbnVtYmVyIG9mIFVSQnMgc3VibWl0dGVkIGZvciB0aGUgd2hvbGUgZGV2aWNlCiAgKiBAYWN0aXZlX2R1cmF0aW9uOiB0b3RhbCB0aW1lIGRldmljZSBpcyBub3Qgc3VzcGVuZGVkCiAgKiBAYXV0b3N1c3BlbmQ6IGZvciBkZWxheWVkIGF1dG9zdXNwZW5kcworICogQGF1dG9yZXN1bWU6IGZvciBhdXRvcmVzdW1lcyByZXF1ZXN0ZWQgd2hpbGUgaW5faW50ZXJydXB0CiAgKiBAcG1fbXV0ZXg6IHByb3RlY3RzIFBNIG9wZXJhdGlvbnMKICAqIEBsYXN0X2J1c3k6IHRpbWUgb2YgbGFzdCB1c2UKICAqIEBhdXRvc3VzcGVuZF9kZWxheTogaW4gamlmZmllcwpAQCAtNDc2LDYgKzQ4Niw3IEBACiAKICNpZmRlZiBDT05GSUdfUE0KIAlzdHJ1Y3QgZGVsYXllZF93b3JrIGF1dG9zdXNwZW5kOworCXN0cnVjdCB3b3JrX3N0cnVjdCBhdXRvcmVzdW1lOwogCXN0cnVjdCBtdXRleCBwbV9tdXRleDsKIAogCXVuc2lnbmVkIGxvbmcgbGFzdF9idXN5OwpAQCAtNTA1LDYgKzUxNiw3IEBACiAKIC8qIFVTQiBwb3J0IHJlc2V0IGZvciBkZXZpY2UgcmVpbml0aWFsaXphdGlvbiAqLwogZXh0ZXJuIGludCB1c2JfcmVzZXRfZGV2aWNlKHN0cnVjdCB1c2JfZGV2aWNlICpkZXYpOworZXh0ZXJuIHZvaWQgdXNiX3F1ZXVlX3Jlc2V0X2RldmljZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqZGV2KTsKIAogZXh0ZXJuIHN0cnVjdCB1c2JfZGV2aWNlICp1c2JfZmluZF9kZXZpY2UodTE2IHZlbmRvcl9pZCwgdTE2IHByb2R1Y3RfaWQpOwogCkBAIC01MTMsNiArNTI1LDggQEAKIGV4dGVybiBpbnQgdXNiX2F1dG9wbV9zZXRfaW50ZXJmYWNlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKTsKIGV4dGVybiBpbnQgdXNiX2F1dG9wbV9nZXRfaW50ZXJmYWNlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKTsKIGV4dGVybiB2b2lkIHVzYl9hdXRvcG1fcHV0X2ludGVyZmFjZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50Zik7CitleHRlcm4gaW50IHVzYl9hdXRvcG1fZ2V0X2ludGVyZmFjZV9hc3luYyhzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50Zik7CitleHRlcm4gdm9pZCB1c2JfYXV0b3BtX3B1dF9pbnRlcmZhY2VfYXN5bmMoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpOwogCiBzdGF0aWMgaW5saW5lIHZvaWQgdXNiX2F1dG9wbV9lbmFibGUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCiB7CkBAIC01MzksOCArNTUzLDEzIEBACiBzdGF0aWMgaW5saW5lIGludCB1c2JfYXV0b3BtX2dldF9pbnRlcmZhY2Uoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCiB7IHJldHVybiAwOyB9CiAKK3N0YXRpYyBpbmxpbmUgaW50IHVzYl9hdXRvcG1fZ2V0X2ludGVyZmFjZV9hc3luYyhzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKK3sgcmV0dXJuIDA7IH0KKwogc3RhdGljIGlubGluZSB2b2lkIHVzYl9hdXRvcG1fcHV0X2ludGVyZmFjZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKIHsgfQorc3RhdGljIGlubGluZSB2b2lkIHVzYl9hdXRvcG1fcHV0X2ludGVyZmFjZV9hc3luYyhzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKK3sgfQogc3RhdGljIGlubGluZSB2b2lkIHVzYl9hdXRvcG1fZW5hYmxlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQogeyB9CiBzdGF0aWMgaW5saW5lIHZvaWQgdXNiX2F1dG9wbV9kaXNhYmxlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQpAQCAtMTA1MCw3ICsxMDY5LDcgQEAKIAl2b2lkICgqZGlzY29ubmVjdCkgKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2KTsKIAogCWludCAoKnN1c3BlbmQpIChzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiwgcG1fbWVzc2FnZV90IG1lc3NhZ2UpOwotCWludCAoKnJlc3VtZSkgKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2KTsKKwlpbnQgKCpyZXN1bWUpIChzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiwgcG1fbWVzc2FnZV90IG1lc3NhZ2UpOwogCXN0cnVjdCB1c2JkcnZfd3JhcCBkcnZ3cmFwOwogCXVuc2lnbmVkIGludCBzdXBwb3J0c19hdXRvc3VzcGVuZDoxOwogfTsKQEAgLTEzMjEsNyArMTM0MCw3IEBACiAJc3RydWN0IGtyZWYga3JlZjsJCS8qIHJlZmVyZW5jZSBjb3VudCBvZiB0aGUgVVJCICovCiAJdm9pZCAqaGNwcml2OwkJCS8qIHByaXZhdGUgZGF0YSBmb3IgaG9zdCBjb250cm9sbGVyICovCiAJYXRvbWljX3QgdXNlX2NvdW50OwkJLyogY29uY3VycmVudCBzdWJtaXNzaW9ucyBjb3VudGVyICovCi0JdTggcmVqZWN0OwkJCS8qIHN1Ym1pc3Npb25zIHdpbGwgZmFpbCAqLworCWF0b21pY190IHJlamVjdDsJCS8qIHN1Ym1pc3Npb25zIHdpbGwgZmFpbCAqLwogCWludCB1bmxpbmtlZDsJCQkvKiB1bmxpbmsgZXJyb3IgY29kZSAqLwogCiAJLyogcHVibGljOiBkb2N1bWVudGVkIGZpZWxkcyBpbiB0aGUgdXJiIHRoYXQgY2FuIGJlIHVzZWQgYnkgZHJpdmVycyAqLwpAQCAtMTQ2Niw2ICsxNDg1LDcgQEAKIGV4dGVybiB2b2lkIHVzYl91bnBvaXNvbl91cmIoc3RydWN0IHVyYiAqdXJiKTsKIGV4dGVybiB2b2lkIHVzYl9raWxsX2FuY2hvcmVkX3VyYnMoc3RydWN0IHVzYl9hbmNob3IgKmFuY2hvcik7CiBleHRlcm4gdm9pZCB1c2JfcG9pc29uX2FuY2hvcmVkX3VyYnMoc3RydWN0IHVzYl9hbmNob3IgKmFuY2hvcik7CitleHRlcm4gdm9pZCB1c2JfdW5wb2lzb25fYW5jaG9yZWRfdXJicyhzdHJ1Y3QgdXNiX2FuY2hvciAqYW5jaG9yKTsKIGV4dGVybiB2b2lkIHVzYl91bmxpbmtfYW5jaG9yZWRfdXJicyhzdHJ1Y3QgdXNiX2FuY2hvciAqYW5jaG9yKTsKIGV4dGVybiB2b2lkIHVzYl9hbmNob3JfdXJiKHN0cnVjdCB1cmIgKnVyYiwgc3RydWN0IHVzYl9hbmNob3IgKmFuY2hvcik7CiBleHRlcm4gdm9pZCB1c2JfdW5hbmNob3JfdXJiKHN0cnVjdCB1cmIgKnVyYik7CkBAIC0xNzIyLDEwICsxNzQyLDYgQEAKIAogI2RlZmluZSBlcnIoZm9ybWF0LCBhcmcuLi4pIHByaW50ayhLRVJOX0VSUiBLQlVJTERfTU9ETkFNRSAiOiAiIFwKIAlmb3JtYXQgIlxuIiAsICMjIGFyZykKLSNkZWZpbmUgaW5mbyhmb3JtYXQsIGFyZy4uLikgcHJpbnRrKEtFUk5fSU5GTyBLQlVJTERfTU9ETkFNRSAiOiAiIFwKLQlmb3JtYXQgIlxuIiAsICMjIGFyZykKLSNkZWZpbmUgd2Fybihmb3JtYXQsIGFyZy4uLikgcHJpbnRrKEtFUk5fV0FSTklORyBLQlVJTERfTU9ETkFNRSAiOiAiIFwKLQlmb3JtYXQgIlxuIiAsICMjIGFyZykKIAogI2VuZGlmICAvKiBfX0tFUk5FTF9fICovCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdXNiL2Fzc29jaWF0aW9uLmggYi9pbmNsdWRlL2xpbnV4L3VzYi9hc3NvY2lhdGlvbi5oCmluZGV4IDA3YzVlM2MuLjBhNGExOGIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdXNiL2Fzc29jaWF0aW9uLmgKKysrIGIvaW5jbHVkZS9saW51eC91c2IvYXNzb2NpYXRpb24uaApAQCAtMjgsMTcgKzI4LDE3IEBACiB9OwogCiAvKiBEaWZmZXJlbnQgZmllbGRzIGRlZmluZWQgYnkgdGhlIHNwZWMgKi8KLSNkZWZpbmUgV1VTQl9BUl9Bc3NvY2lhdGlvblR5cGVJZAl7IC5pZCA9IDB4MDAwMCwgLmxlbiA9ICAyIH0KLSNkZWZpbmUgV1VTQl9BUl9Bc3NvY2lhdGlvblN1YlR5cGVJZAl7IC5pZCA9IDB4MDAwMSwgLmxlbiA9ICAyIH0KLSNkZWZpbmUgV1VTQl9BUl9MZW5ndGgJCQl7IC5pZCA9IDB4MDAwMiwgLmxlbiA9ICA0IH0KLSNkZWZpbmUgV1VTQl9BUl9Bc3NvY2lhdGlvblN0YXR1cwl7IC5pZCA9IDB4MDAwNCwgLmxlbiA9ICA0IH0KLSNkZWZpbmUgV1VTQl9BUl9MYW5nSUQJCQl7IC5pZCA9IDB4MDAwOCwgLmxlbiA9ICAyIH0KLSNkZWZpbmUgV1VTQl9BUl9EZXZpY2VGcmllbmRseU5hbWUJeyAuaWQgPSAweDAwMGIsIC5sZW4gPSA2NCB9IC8qIG1heCAqLwotI2RlZmluZSBXVVNCX0FSX0hvc3RGcmllbmRseU5hbWUJeyAuaWQgPSAweDAwMGMsIC5sZW4gPSA2NCB9IC8qIG1heCAqLwotI2RlZmluZSBXVVNCX0FSX0NISUQJCQl7IC5pZCA9IDB4MTAwMCwgLmxlbiA9IDE2IH0KLSNkZWZpbmUgV1VTQl9BUl9DRElECQkJeyAuaWQgPSAweDEwMDEsIC5sZW4gPSAxNiB9Ci0jZGVmaW5lIFdVU0JfQVJfQ29ubmVjdGlvbkNvbnRleHQJeyAuaWQgPSAweDEwMDIsIC5sZW4gPSA0OCB9Ci0jZGVmaW5lIFdVU0JfQVJfQmFuZEdyb3VwcwkJeyAuaWQgPSAweDEwMDQsIC5sZW4gPSAgMiB9CisjZGVmaW5lIFdVU0JfQVJfQXNzb2NpYXRpb25UeXBlSWQJeyAuaWQgPSBjcHVfdG9fbGUxNigweDAwMDApLCAubGVuID0gY3B1X3RvX2xlMTYoMikgfQorI2RlZmluZSBXVVNCX0FSX0Fzc29jaWF0aW9uU3ViVHlwZUlkCXsgLmlkID0gY3B1X3RvX2xlMTYoMHgwMDAxKSwgLmxlbiA9IGNwdV90b19sZTE2KDIpIH0KKyNkZWZpbmUgV1VTQl9BUl9MZW5ndGgJCQl7IC5pZCA9IGNwdV90b19sZTE2KDB4MDAwMiksIC5sZW4gPSBjcHVfdG9fbGUxNig0KSB9CisjZGVmaW5lIFdVU0JfQVJfQXNzb2NpYXRpb25TdGF0dXMJeyAuaWQgPSBjcHVfdG9fbGUxNigweDAwMDQpLCAubGVuID0gY3B1X3RvX2xlMTYoNCkgfQorI2RlZmluZSBXVVNCX0FSX0xhbmdJRAkJCXsgLmlkID0gY3B1X3RvX2xlMTYoMHgwMDA4KSwgLmxlbiA9IGNwdV90b19sZTE2KDIpIH0KKyNkZWZpbmUgV1VTQl9BUl9EZXZpY2VGcmllbmRseU5hbWUJeyAuaWQgPSBjcHVfdG9fbGUxNigweDAwMGIpLCAubGVuID0gY3B1X3RvX2xlMTYoNjQpIH0gLyogbWF4ICovCisjZGVmaW5lIFdVU0JfQVJfSG9zdEZyaWVuZGx5TmFtZQl7IC5pZCA9IGNwdV90b19sZTE2KDB4MDAwYyksIC5sZW4gPSBjcHVfdG9fbGUxNig2NCkgfSAvKiBtYXggKi8KKyNkZWZpbmUgV1VTQl9BUl9DSElECQkJeyAuaWQgPSBjcHVfdG9fbGUxNigweDEwMDApLCAubGVuID0gY3B1X3RvX2xlMTYoMTYpIH0KKyNkZWZpbmUgV1VTQl9BUl9DRElECQkJeyAuaWQgPSBjcHVfdG9fbGUxNigweDEwMDEpLCAubGVuID0gY3B1X3RvX2xlMTYoMTYpIH0KKyNkZWZpbmUgV1VTQl9BUl9Db25uZWN0aW9uQ29udGV4dAl7IC5pZCA9IGNwdV90b19sZTE2KDB4MTAwMiksIC5sZW4gPSBjcHVfdG9fbGUxNig0OCkgfQorI2RlZmluZSBXVVNCX0FSX0JhbmRHcm91cHMJCXsgLmlkID0gY3B1X3RvX2xlMTYoMHgxMDA0KSwgLmxlbiA9IGNwdV90b19sZTE2KDIpIH0KIAogLyogQ0JBRiBDb250cm9sIFJlcXVlc3RzIChBTVMxLjBbVDQtMV0gKi8KIGVudW0gewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC91c2IvZ3Bpb192YnVzLmggYi9pbmNsdWRlL2xpbnV4L3VzYi9ncGlvX3ZidXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOWYwM2NjCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC91c2IvZ3Bpb192YnVzLmgKQEAgLTAsMCArMSwzMCBAQAorLyoKKyAqIEEgc2ltcGxlIEdQSU8gVkJVUyBzZW5zaW5nIGRyaXZlciBmb3IgQiBwZXJpcGhlcmFsIG9ubHkgZGV2aWNlcworICogd2l0aCBpbnRlcm5hbCB0cmFuc2NlaXZlcnMuCisgKiBPcHRpb25hbGx5IEQrIHB1bGx1cCBjYW4gYmUgY29udHJvbGxlZCBieSBhIHNlY29uZCBHUElPLgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwOCBQaGlsaXBwIFphYmVsIDxwaGlsaXBwLnphYmVsQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqLworCisvKioKKyAqIHN0cnVjdCBncGlvX3ZidXNfbWFjaF9pbmZvIC0gY29uZmlndXJhdGlvbiBmb3IgZ3Bpb192YnVzCisgKiBAZ3Bpb192YnVzOiBWQlVTIHNlbnNpbmcgR1BJTworICogQGdwaW9fcHVsbHVwOiBvcHRpb25hbCBEKyBvciBELSBwdWxsdXAgR1BJTyAoZWxzZSBuZWdhdGl2ZS9pbnZhbGlkKQorICogQGdwaW9fdmJ1c19pbnZlcnRlZDogdHJ1ZSBpZiBncGlvX3ZidXMgaXMgYWN0aXZlIGxvdworICogQGdwaW9fcHVsbHVwX2ludmVydGVkOiB0cnVlIGlmIGdwaW9fcHVsbHVwIGlzIGFjdGl2ZSBsb3cKKyAqCisgKiBUaGUgVkJVUyBzZW5zaW5nIEdQSU8gc2hvdWxkIGhhdmUgYSBwdWxsZG93biwgd2hpY2ggd2lsbCBub3JtYWxseSBiZQorICogcGFydCBvZiBhIHJlc2lzdG9yIGxhZGRlciB0dXJuaW5nIGEgNC4wVi01LjI1ViBsZXZlbCBvbiBWQlVTIGludG8gYQorICogdmFsdWUgdGhlIEdQSU8gZGV0ZWN0cyBhcyBhY3RpdmUuICBTb21lIHN5c3RlbXMgd2lsbCB1c2UgY29tcGFyYXRvcnMuCisgKi8KK3N0cnVjdCBncGlvX3ZidXNfbWFjaF9pbmZvIHsKKwlpbnQgZ3Bpb192YnVzOworCWludCBncGlvX3B1bGx1cDsKKwlib29sIGdwaW9fdmJ1c19pbnZlcnRlZDsKKwlib29sIGdwaW9fcHVsbHVwX2ludmVydGVkOworfTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdXNiL211c2IuaCBiL2luY2x1ZGUvbGludXgvdXNiL211c2IuaAppbmRleCA2MzA5NjJjLi5kNmFhZDBlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3VzYi9tdXNiLmgKKysrIGIvaW5jbHVkZS9saW51eC91c2IvbXVzYi5oCkBAIC00Nyw2ICs0NywxMSBAQAogCXU4CQlyYW1fYml0czsJLyogcmFtIGFkZHJlc3Mgc2l6ZSAqLwogCiAJc3RydWN0IG11c2JfaGRyY19lcHNfYml0cyAqZXBzX2JpdHM7CisjaWZkZWYgQ09ORklHX0JMQUNLRklOCisgICAgICAgIC8qIEEgR1BJTyBjb250cm9sbGluZyBWUlNFTCBpbiBCbGFja2ZpbiAqLworICAgICAgICB1bnNpZ25lZCBpbnQgICAgZ3Bpb192cnNlbDsKKyNlbmRpZgorCiB9OwogCiBzdHJ1Y3QgbXVzYl9oZHJjX3BsYXRmb3JtX2RhdGEgewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC91c2Ivb3RnLmggYi9pbmNsdWRlL2xpbnV4L3VzYi9vdGcuaAppbmRleCAxZGIyNWQxLi45NGRmNGZlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3VzYi9vdGcuaAorKysgYi9pbmNsdWRlL2xpbnV4L3VzYi9vdGcuaApAQCAtODQsNiArODQsNyBAQAogCiAvKiBmb3IgdXNiIGhvc3QgYW5kIHBlcmlwaGVyYWwgY29udHJvbGxlciBkcml2ZXJzICovCiBleHRlcm4gc3RydWN0IG90Z190cmFuc2NlaXZlciAqb3RnX2dldF90cmFuc2NlaXZlcih2b2lkKTsKK2V4dGVybiB2b2lkIG90Z19wdXRfdHJhbnNjZWl2ZXIoc3RydWN0IG90Z190cmFuc2NlaXZlciAqKTsKIAogc3RhdGljIGlubGluZSBpbnQKIG90Z19zdGFydF9obnAoc3RydWN0IG90Z190cmFuc2NlaXZlciAqb3RnKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC91c2JfdXN1YWwuaCBiL2luY2x1ZGUvbGludXgvdXNiX3VzdWFsLmgKaW5kZXggZDlhM2JiZS4uMWVlYTFhYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC91c2JfdXN1YWwuaAorKysgYi9pbmNsdWRlL2xpbnV4L3VzYl91c3VhbC5oCkBAIC01Miw4ICs1MiwxMSBAQAogCVVTX0ZMQUcoTUFYX1NFQ1RPUlNfTUlOLDB4MDAwMDIwMDApCQkJXAogCQkvKiBTZXRzIG1heF9zZWN0b3JzIHRvIGFyY2ggbWluICovCQlcCiAJVVNfRkxBRyhCVUxLX0lHTk9SRV9UQUcsMHgwMDAwNDAwMCkJCQlcCi0JCS8qIElnbm9yZSB0YWcgbWlzbWF0Y2ggaW4gYnVsayBvcGVyYXRpb25zICovCi0KKwkJLyogSWdub3JlIHRhZyBtaXNtYXRjaCBpbiBidWxrIG9wZXJhdGlvbnMgKi8gICAgXAorCVVTX0ZMQUcoU0FORV9TRU5TRSwgICAgIDB4MDAwMDgwMDApCQkJXAorCQkvKiBTYW5lIFNlbnNlICg+IDE4IGJ5dGVzKSAqLwkJCVwKKwlVU19GTEFHKENBUEFDSVRZX09LLAkweDAwMDEwMDAwKQkJCVwKKwkJLyogUkVBRCBDQVBBQ0lUWSByZXNwb25zZSBpcyBjb3JyZWN0ICovCiAKICNkZWZpbmUgVVNfRkxBRyhuYW1lLCB2YWx1ZSkJVVNfRkxfIyNuYW1lID0gdmFsdWUgLAogZW51bSB7IFVTX0RPX0FMTF9GTEFHUyB9OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC93aW1heC5oIGIvaW5jbHVkZS9saW51eC93aW1heC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4OWRlN2YKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L3dpbWF4LmgKQEAgLTAsMCArMSwyMzQgQEAKKy8qCisgKiBMaW51eCBXaU1heAorICogQVBJIGZvciB1c2VyIHNwYWNlCisgKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgICBkaXN0cmlidXRpb24uCisgKiAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqCisgKiBJbnRlbCBDb3Jwb3JhdGlvbiA8bGludXgtd2ltYXhAaW50ZWwuY29tPgorICogSW5ha3kgUGVyZXotR29uemFsZXogPGluYWt5LnBlcmV6LWdvbnphbGV6QGludGVsLmNvbT4KKyAqICAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24KKyAqCisgKgorICogVGhpcyBmaWxlIGRlY2xhcmVzIHRoZSB1c2VyL2tlcm5lbCBwcm90b2NvbCB0aGF0IGlzIHNwb2tlbiBvdmVyCisgKiBHZW5lcmljIE5ldGxpbmssIGFzIHdlbGwgYXMgYW55IHR5cGUgZGVjbGFyYXRpb24gdGhhdCBpcyB0byBiZSB1c2VkCisgKiBieSBrZXJuZWwgYW5kIHVzZXIgc3BhY2UuCisgKgorICogSXQgaXMgaW50ZW5kZWQgZm9yIHVzZXIgc3BhY2UgdG8gY2xvbmUgaXQgdmVyYmF0aW0gdG8gdXNlIGl0IGFzIGEKKyAqIHByaW1hcnkgcmVmZXJlbmNlIGZvciBkZWZpbml0aW9ucy4KKyAqCisgKiBTdHVmZiBpbnRlbmRlZCBmb3Iga2VybmVsIHVzYWdlIGFzIHdlbGwgYXMgZnVsbCBwcm90b2NvbCBhbmQgc3RhY2sKKyAqIGRvY3VtZW50YXRpb24gaXMgcm9vdGVkIGluIGluY2x1ZGUvbmV0L3dpbWF4LmguCisgKi8KKworI2lmbmRlZiBfX0xJTlVYX19XSU1BWF9IX18KKyNkZWZpbmUgX19MSU5VWF9fV0lNQVhfSF9fCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCitlbnVtIHsKKwkvKioKKwkgKiBWZXJzaW9uIG9mIHRoZSBpbnRlcmZhY2UgKHVuc2lnbmVkIGRlY2ltYWwsIE1NbSwgbWF4IDI1LjUpCisJICogTSAtIE1ham9yOiBjaGFuZ2UgaWYgcmVtb3Zpbmcgb3IgbW9kaWZ5aW5nIGFuIGV4aXN0aW5nIGNhbGwuCisJICogbSAtIG1pbm9yOiBjaGFuZ2Ugd2hlbiBhZGRpbmcgYSBuZXcgY2FsbAorCSAqLworCVdJTUFYX0dOTF9WRVJTSU9OID0gMDAsCisJLyogR2VuZXJpYyBOZXRMaW5rIGF0dHJpYnV0ZXMgKi8KKwlXSU1BWF9HTkxfQVRUUl9JTlZBTElEID0gMHgwMCwKKwlXSU1BWF9HTkxfQVRUUl9NQVggPSAxMCwKK307CisKKworLyoKKyAqIEdlbmVyaWMgTmV0TGluayBvcGVyYXRpb25zCisgKgorICogTW9zdCBvZiB0aGVzZSBtYXAgdG8gYW4gQVBJIGNhbGw7IF9PUF8gc3RhbmRzIGZvciBvcGVyYXRpb24sIF9SUF8KKyAqIGZvciByZXBseSBhbmQgX1JFXyBmb3IgcmVwb3J0IChha2E6IHNpZ25hbCkuCisgKi8KK2VudW0geworCVdJTUFYX0dOTF9PUF9NU0dfRlJPTV9VU0VSLAkvKiBVc2VyIHRvIGtlcm5lbCBtZXNzYWdlICovCisJV0lNQVhfR05MX09QX01TR19UT19VU0VSLAkvKiBLZXJuZWwgdG8gdXNlciBtZXNzYWdlICovCisJV0lNQVhfR05MX09QX1JGS0lMTCwJLyogUnVuIHdpbWF4X3Jma2lsbCgpICovCisJV0lNQVhfR05MX09QX1JFU0VULAkvKiBSdW4gd2ltYXhfcmZraWxsKCkgKi8KKwlXSU1BWF9HTkxfUkVfU1RBVEVfQ0hBTkdFLAkvKiBSZXBvcnQ6IHN0YXR1cyBjaGFuZ2UgKi8KK307CisKKworLyogTWVzc2FnZSBmcm9tIHVzZXIgLyB0byB1c2VyICovCitlbnVtIHsKKwlXSU1BWF9HTkxfTVNHX0lGSURYID0gMSwKKwlXSU1BWF9HTkxfTVNHX1BJUEVfTkFNRSwKKwlXSU1BWF9HTkxfTVNHX0RBVEEsCit9OworCisKKy8qCisgKiB3aW1heF9yZmtpbGwoKQorICoKKyAqIFRoZSBzdGF0ZSBvZiB0aGUgcmFkaW8gKE9OL09GRikgaXMgbWFwcGVkIHRvIHRoZSByZmtpbGwgc3Vic3lzdGVtJ3MKKyAqIHN3aXRjaCBzdGF0ZSAoRElTQUJMRUQvRU5BQkxFRCkuCisgKi8KK2VudW0gd2ltYXhfcmZfc3RhdGUgeworCVdJTUFYX1JGX09GRiA9IDAsCS8qIFJhZGlvIGlzIG9mZiwgcmZraWxsIG9uL2VuYWJsZWQgKi8KKwlXSU1BWF9SRl9PTiA9IDEsCS8qIFJhZGlvIGlzIG9uLCByZmtpbGwgb2ZmL2Rpc2FibGVkICovCisJV0lNQVhfUkZfUVVFUlkgPSAyLAorfTsKKworLyogQXR0cmlidXRlcyAqLworZW51bSB7CisJV0lNQVhfR05MX1JGS0lMTF9JRklEWCA9IDEsCisJV0lNQVhfR05MX1JGS0lMTF9TVEFURSwKK307CisKKworLyogQXR0cmlidXRlcyBmb3Igd2ltYXhfcmVzZXQoKSAqLworZW51bSB7CisJV0lNQVhfR05MX1JFU0VUX0lGSURYID0gMSwKK307CisKKworLyoKKyAqIEF0dHJpYnV0ZXMgZm9yIHRoZSBSZXBvcnQgU3RhdGUgQ2hhbmdlCisgKgorICogRm9yIG5vdyB3ZSBqdXN0IGhhdmUgdGhlIG9sZCBhbmQgbmV3IHN0YXRlczsgbmV3IGF0dHJpYnV0ZXMgbWlnaHQKKyAqIGJlIGFkZGVkIGxhdGVyIG9uLgorICovCitlbnVtIHsKKwlXSU1BWF9HTkxfU1RDSF9JRklEWCA9IDEsCisJV0lNQVhfR05MX1NUQ0hfU1RBVEVfT0xELAorCVdJTUFYX0dOTF9TVENIX1NUQVRFX05FVywKK307CisKKworLyoqCisgKiBlbnVtIHdpbWF4X3N0IC0gVGhlIGRpZmZlcmVudCBzdGF0ZXMgb2YgYSBXaU1BWCBkZXZpY2UKKyAqIEBfX1dJTUFYX1NUX05VTEw6IFRoZSBkZXZpY2Ugc3RydWN0dXJlIGhhcyBiZWVuIGFsbG9jYXRlZCBhbmQgemVyb2VkLAorICogICAgIGJ1dCBzdGlsbCB3aW1heF9kZXZfYWRkKCkgaGFzbid0IGJlZW4gY2FsbGVkLiBUaGVyZSBpcyBubyBzdGF0ZS4KKyAqCisgKiBAV0lNQVhfU1RfRE9XTjogVGhlIGRldmljZSBoYXMgYmVlbiByZWdpc3RlcmVkIHdpdGggdGhlIFdpTUFYIGFuZAorICogICAgIG5ldHdvcmtpbmcgc3RhY2tzLCBidXQgaXQgaXMgbm90IGluaXRpYWxpemVkIChub3JtYWxseSB0aGF0IGlzCisgKiAgICAgZG9uZSB3aXRoICdpZmNvbmZpZyBERVYgdXAnIFtvciBlcXVpdmFsZW50XSwgd2hpY2ggY2FuIHVwbG9hZAorICogICAgIGZpcm13YXJlIGFuZCBlbmFibGUgY29tbXVuaWNhdGlvbnMgd2l0aCB0aGUgZGV2aWNlKS4KKyAqICAgICBJbiB0aGlzIHN0YXRlLCB0aGUgZGV2aWNlIGlzIHBvd2VyZWQgZG93biBhbmQgdXNpbmcgYXMgbGVzcworICogICAgIHBvd2VyIGFzIHBvc3NpYmxlLgorICogICAgIFRoaXMgc3RhdGUgaXMgdGhlIGRlZmF1bHQgYWZ0ZXIgYSBjYWxsIHRvIHdpbWF4X2Rldl9hZGQoKS4gSXQKKyAqICAgICBpcyBvayB0byBoYXZlIGRyaXZlcnMgbW92ZSBkaXJlY3RseSB0byAlV0lNQVhfU1RfVU5JTklUSUFMSVpFRAorICogICAgIG9yICVXSU1BWF9TVF9SQURJT19PRkYgaW4gX3Byb2JlKCkgYWZ0ZXIgdGhlIGNhbGwgdG8KKyAqICAgICB3aW1heF9kZXZfYWRkKCkuCisgKiAgICAgSXQgaXMgcmVjb21tZW5kZWQgdGhhdCB0aGUgZHJpdmVyIGxlYXZlcyB0aGlzIHN0YXRlIHdoZW4KKyAqICAgICBjYWxsaW5nICdpZmNvbmZpZyBERVYgdXAnIGFuZCBlbnRlcnMgaXQgYmFjayBvbiAnaWZjb25maWcgREVWCisgKiAgICAgZG93bicuCisgKgorICogQF9fV0lNQVhfU1RfUVVJRVNDSU5HOiBUaGUgZGV2aWNlIGlzIGJlaW5nIHRvcm4gZG93biwgc28gbm8gQVBJCisgKiAgICAgb3BlcmF0aW9ucyBhcmUgYWxsb3dlZCB0byBwcm9jZWVkIGV4Y2VwdCB0aGUgb25lcyBuZWVkZWQgdG8KKyAqICAgICBjb21wbGV0ZSB0aGUgZGV2aWNlIGNsZWFuIHVwIHByb2Nlc3MuCisgKgorICogQFdJTUFYX1NUX1VOSU5JVElBTElaRUQ6IFtvcHRpb25hbF0gQ29tbXVuaWNhdGlvbiB3aXRoIHRoZSBkZXZpY2UKKyAqICAgICBpcyBzZXR1cCwgYnV0IHRoZSBkZXZpY2Ugc3RpbGwgcmVxdWlyZXMgc29tZSBjb25maWd1cmF0aW9uCisgKiAgICAgYmVmb3JlIGJlaW5nIG9wZXJhdGlvbmFsLgorICogICAgIFNvbWUgV2lNQVggQVBJIGNhbGxzIG1pZ2h0IHdvcmsuCisgKgorICogQFdJTUFYX1NUX1JBRElPX09GRjogVGhlIGRldmljZSBpcyBmdWxseSB1cDsgcmFkaW8gaXMgb2ZmICh3ZXRoZXIKKyAqICAgICBieSBoYXJkd2FyZSBvciBzb2Z0d2FyZSBzd2l0Y2hlcykuCisgKiAgICAgSXQgaXMgcmVjb21tZW5kZWQgdG8gYWx3YXlzIGxlYXZlIHRoZSBkZXZpY2UgaW4gdGhpcyBzdGF0ZQorICogICAgIGFmdGVyIGluaXRpYWxpemF0aW9uLgorICoKKyAqIEBXSU1BWF9TVF9SRUFEWTogVGhlIGRldmljZSBpcyBmdWxseSB1cCBhbmQgcmFkaW8gaXMgb24uCisgKgorICogQFdJTUFYX1NUX1NDQU5OSU5HOiBbb3B0aW9uYWxdIFRoZSBkZXZpY2UgaGFzIGJlZW4gaW5zdHJ1Y3RlZCB0bworICogICAgIHNjYW4uIEluIHRoaXMgc3RhdGUsIHRoZSBkZXZpY2UgY2Fubm90IGJlIGFjdGl2ZWx5IGNvbm5lY3RlZCB0bworICogICAgIGEgbmV0d29yay4KKyAqCisgKiBAV0lNQVhfU1RfQ09OTkVDVElORzogVGhlIGRldmljZSBpcyBjb25uZWN0aW5nIHRvIGEgbmV0d29yay4gVGhpcworICogICAgIHN0YXRlIGV4aXN0cyBiZWNhdXNlIGluIHNvbWUgZGV2aWNlcywgdGhlIGNvbm5lY3QgcHJvY2VzcyBjYW4KKyAqICAgICBpbmNsdWRlIGEgbnVtYmVyIG9mIG5lZ290aWF0aW9ucyBiZXR3ZWVuIHVzZXIgc3BhY2UsIGtlcm5lbAorICogICAgIHNwYWNlIGFuZCB0aGUgZGV2aWNlLiBVc2VyIHNwYWNlIG5lZWRzIHRvIGtub3cgd2hhdCB0aGUgZGV2aWNlCisgKiAgICAgaXMgZG9pbmcuIElmIHRoZSBjb25uZWN0IHNlcXVlbmNlIGluIGEgZGV2aWNlIGlzIGF0b21pYyBhbmQKKyAqICAgICBmYXN0LCB0aGUgZGV2aWNlIGNhbiB0cmFuc2l0aW9uIGRpcmVjdGx5IHRvIENPTk5FQ1RFRAorICoKKyAqIEBXSU1BWF9TVF9DT05ORUNURUQ6IFRoZSBkZXZpY2UgaXMgY29ubmVjdGVkIHRvIGEgbmV0d29yay4KKyAqCisgKiBAX19XSU1BWF9TVF9JTlZBTElEOiBUaGlzIGlzIGFuIGludmFsaWQgc3RhdGUgdXNlZCB0byBtYXJrIHRoZQorICogICAgIG1heGltdW0gbnVtZXJpYyB2YWx1ZSBvZiBzdGF0ZXMuCisgKgorICogRGVzY3JpcHRpb246CisgKgorICogVHJhbnNpdGlvbnMgZnJvbSBvbmUgc3RhdGUgdG8gYW5vdGhlciBvbmUgYXJlIGF0b21pYyBhbmQgY2FuIG9ubHkKKyAqIGJlIGNhdXNlZCBpbiBrZXJuZWwgc3BhY2Ugd2l0aCB3aW1heF9zdGF0ZV9jaGFuZ2UoKS4gVG8gcmVhZCB0aGUKKyAqIHN0YXRlLCB1c2Ugd2ltYXhfc3RhdGVfZ2V0KCkuCisgKgorICogU3RhdGVzIHN0YXJ0aW5nIHdpdGggX18gYXJlIGludGVybmFsIGFuZCBzaGFsbCBub3QgYmUgdXNlZCBvcgorICogcmVmZXJyZWQgdG8gYnkgZHJpdmVycyBvciB1c2Vyc3BhY2UuIFRoZXkgbG9vayB1Z2x5LCBidXQgdGhhdCdzIHRoZQorICogcG9pbnQgLS0gaWYgYW55IHVzZSBpcyBtYWRlIG5vbi1pbnRlcm5hbCB0byB0aGUgc3RhY2ssIGl0IGlzIGVhc2llcgorICogdG8gY2F0Y2ggb24gcmV2aWV3LgorICoKKyAqIEFsbCBBUEkgb3BlcmF0aW9ucyBbd2l0aCB3ZWxsIGRlZmluZWQgZXhjZXB0aW9uc10gd2lsbCB0YWtlIHRoZQorICogZGV2aWNlIG11dGV4IGJlZm9yZSBzdGFydGluZyBhbmQgdGhlbiBjaGVjayB0aGUgc3RhdGUuIElmIHRoZSBzdGF0ZQorICogaXMgJV9fV0lNQVhfU1RfTlVMTCwgJVdJTUFYX1NUX0RPV04sICVXSU1BWF9TVF9VTklOSVRJQUxJWkVEIG9yCisgKiAlX19XSU1BWF9TVF9RVUlFU0NJTkcsIGl0IHdpbGwgZHJvcCB0aGUgbG9jayBhbmQgcXVpdCB3aXRoCisgKiAtJUVJTlZBTCwgLSVFTk9NRURJVU0sIC0lRU5PVENPTk4gb3IgLSVFU0hVVERPV04uCisgKgorICogVGhlIG9yZGVyIG9mIHRoZSBkZWZpbml0aW9ucyBpcyBpbXBvcnRhbnQsIHNvIHdlIGNhbiBkbyBudW1lcmljYWwKKyAqIGNvbXBhcmlzb25zIChlZzogPCAlV0lNQVhfU1RfUkFESU9fT0ZGIG1lYW5zIHRoZSBkZXZpY2UgaXMgbm90IHJlYWR5CisgKiB0byBvcGVyYXRlKS4KKyAqLworLyoKKyAqIFRoZSBhbGxvd2VkIHN0YXRlIHRyYW5zaXRpb25zIGFyZSBkZXNjcmliZWQgaW4gdGhlIHRhYmxlIGJlbG93CisgKiAoc3RhdGVzIGluIHJvd3MgY2FuIGdvIHRvIHN0YXRlcyBpbiBjb2x1bW5zIHdoZXJlIHRoZXJlIGlzIGFuIFgpOgorICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVOSU5JICAgUkFESU8gUkVBRFkgU0NBTiBDT05ORUMgQ09OTkVDCisgKiAgICAgICAgICAgICBOVUxMIERPV04gUVVJRVNDSU5HIFRJQUxJWkVEICBPRkYgICAgICAgIE5JTkcgIFRJTkcgICBURUQKKyAqIE5VTEwgICAgICAgICAtICAgIHgKKyAqIERPV04gICAgICAgICAgICAgIC0gICAgICB4ICAgICAgICB4ICAgICAgIHgKKyAqIFFVSUVTQ0lORyAgICAgICAgIHggICAgICAtCisgKiBVTklOSVRJQUxJWkVEICAgICAgICAgICAgeCAgICAgICAgLSAgICAgICB4CisgKiBSQURJT19PRkYgICAgICAgICAgICAgICAgeCAgICAgICAgICAgICAgICAtICAgICB4CisgKiBSRUFEWSAgICAgICAgICAgICAgICAgICAgeCAgICAgICAgICAgICAgICB4ICAgICAtICAgICB4ICAgICB4ICAgICAgeAorICogU0NBTk5JTkcgICAgICAgICAgICAgICAgIHggICAgICAgICAgICAgICAgeCAgICAgeCAgICAgLSAgICAgeCAgICAgIHgKKyAqIENPTk5FQ1RJTkcgICAgICAgICAgICAgICB4ICAgICAgICAgICAgICAgIHggICAgIHggICAgIHggICAgIC0gICAgICB4CisgKiBDT05ORUNURUQgICAgICAgICAgICAgICAgeCAgICAgICAgICAgICAgICB4ICAgICB4ICAgICAgICAgICAgICAgICAgLQorICoKKyAqIFRoaXMgdGFibGUgbm90IGF2YWlsYWJsZSBpbiBrZXJuZWwtZG9jIGJlY2F1c2UgdGhlIGZvcm1hdHRpbmcgbWVzc2VzIGl0IHVwLgorICovCisgZW51bSB3aW1heF9zdCB7CisJX19XSU1BWF9TVF9OVUxMID0gMCwKKwlXSU1BWF9TVF9ET1dOLAorCV9fV0lNQVhfU1RfUVVJRVNDSU5HLAorCVdJTUFYX1NUX1VOSU5JVElBTElaRUQsCisJV0lNQVhfU1RfUkFESU9fT0ZGLAorCVdJTUFYX1NUX1JFQURZLAorCVdJTUFYX1NUX1NDQU5OSU5HLAorCVdJTUFYX1NUX0NPTk5FQ1RJTkcsCisJV0lNQVhfU1RfQ09OTkVDVEVELAorCV9fV0lNQVhfU1RfSU5WQUxJRAkJCS8qIEFsd2F5cyBrZWVwIGxhc3QgKi8KK307CisKKworI2VuZGlmIC8qICNpZm5kZWYgX19MSU5VWF9fV0lNQVhfSF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3dpbWF4L0tidWlsZCBiL2luY2x1ZGUvbGludXgvd2ltYXgvS2J1aWxkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjYjRmMjYKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L3dpbWF4L0tidWlsZApAQCAtMCwwICsxIEBACitoZWFkZXIteSArPSBpMjQwMG0uaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC93aW1heC9kZWJ1Zy5oIGIvaW5jbHVkZS9saW51eC93aW1heC9kZWJ1Zy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhMGM0OTMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L3dpbWF4L2RlYnVnLmgKQEAgLTAsMCArMSw0NTMgQEAKKy8qCisgKiBMaW51eCBXaU1BWAorICogQ29sbGVjdGlvbiBvZiB0b29scyB0byBtYW5hZ2UgZGVidWcgb3BlcmF0aW9ucy4KKyAqCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1LTIwMDcgSW50ZWwgQ29ycG9yYXRpb24KKyAqIEluYWt5IFBlcmV6LUdvbnphbGV6IDxpbmFreS5wZXJlei1nb256YWxlekBpbnRlbC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSwgVVNBLgorICoKKyAqCisgKiBEb24ndCAjaW5jbHVkZSB0aGlzIGZpbGUgZGlyZWN0bHksIHJlYWQgb24hCisgKgorICoKKyAqIEVYRUNVVElORyBERUJVR0dJTkcgQUNUSU9OUyBPUiBOT1QKKyAqCisgKiBUaGUgbWFpbiB0aGluZyB0aGlzIGZyYW1ld29yayBwcm92aWRlcyBpcyBkZWNpc3Npb24gcG93ZXIgdG8gdGFrZSBhCisgKiBkZWJ1ZyBhY3Rpb24gKGxpa2UgcHJpbnRpbmcgYSBtZXNzYWdlKSBpZiB0aGUgY3VycmVudCBkZWJ1ZyBsZXZlbAorICogYWxsb3dzIGl0LgorICoKKyAqIFRoZSBkZWNpc3Npb24gcG93ZXIgaXMgYXQgdHdvIGxldmVsczogYXQgY29tcGlsZS10aW1lICh3aGF0IGRvZXMKKyAqIG5vdCBtYWtlIGl0IGlzIGNvbXBpbGVkIG91dCkgYW5kIGF0IHJ1bi10aW1lLiBUaGUgcnVuLXRpbWUKKyAqIHNlbGVjdGlvbiBpcyBkb25lIHBlci1zdWJtb2R1bGUgKGFzIHRoZXkgYXJlIGRlY2xhcmVkIGJ5IHRoZSB1c2VyCisgKiBvZiB0aGUgZnJhbWV3b3JrKS4KKyAqCisgKiBBIGNhbGwgdG8gZF90ZXN0KEwpIChMIGJlaW5nIHRoZSB0YXJnZXQgZGVidWcgbGV2ZWwpIHJldHVybnMgdHJ1ZQorICogaWYgdGhlIGFjdGlvbiBzaG91bGQgYmUgdGFrZW4gYmVjYXVzZSB0aGUgY3VycmVudCBkZWJ1ZyBsZXZlbHMKKyAqIGFsbG93IGl0IChib3RoIGNvbXBpbGUgYW5kIHJ1biB0aW1lKS4KKyAqCisgKiBJdCBmb2xsb3dzIHRoYXQgYSBjYWxsIHRvIGRfdGVzdCgpIHRoYXQgY2FuIGJlIGRldGVybWluZWQgdG8gYmUKKyAqIGFsd2F5cyBmYWxzZSBhdCBjb21waWxlIHRpbWUgd2lsbCBnZXQgdGhlIGNvZGUgZGVwZW5kaW5nIG9uIGl0CisgKiBjb21waWxlZCBvdXQgYnkgb3B0aW1pemF0aW9uLgorICoKKyAqCisgKiBERUJVRyBMRVZFTFMKKyAqCisgKiBJdCBpcyB1cCB0byB0aGUgY2FsbGVyIHRvIGRlZmluZSBob3cgbXVjaCBhIGRlYnVnZ2luZyBsZXZlbCBpcy4KKyAqCisgKiBDb252ZW50aW9uIHNldHMgMCBhcyAibm8gZGVidWciIChzbyBhbiBhY3Rpb24gbWFya2VkIGFzIGRlYnVnIGxldmVsIDAKKyAqIHdpbGwgYWx3YXlzIGJlIHRha2VuKS4gVGhlIGluY3JlYXNpbmcgZGVidWcgbGV2ZWxzIGFyZSB1c2VkIGZvcgorICogaW5jcmVhc2VkIHZlcmJvc2l0eS4KKyAqCisgKgorICogVVNBR0UKKyAqCisgKiBHcm91cCB0aGUgY29kZSBpbiBtb2R1bGVzIGFuZCBzdWJtb2R1bGVzIGluc2lkZSBlYWNoIG1vZHVsZSBbd2hpY2gKKyAqIGluIG1vc3QgY2FzZXMgbWFwcyB0byBMaW51eCBtb2R1bGVzIGFuZCAuYyBmaWxlcyB0aGF0IGNvbXBvc2UKKyAqIHRob3NlXS4KKyAqCisgKgorICogRm9yIGVhY2ggbW9kdWxlLCB0aGVyZSBpczoKKyAqCisgKiAgLSBhIE1PRFVMRU5BTUUgKHNpbmdsZSB3b3JkLCBsZWdhbCBDIGlkZW50aWZpZXIpCisgKgorICogIC0gYSBkZWJ1Zy1sZXZlbHMuaCBoZWFkZXIgZmlsZSB0aGF0IGRlY2xhcmVzIHRoZSBsaXN0IG9mCisgKiAgICBzdWJtb2R1bGVzIGFuZCB0aGF0IGlzIGluY2x1ZGVkIGJ5IGFsbCAuYyBmaWxlcyB0aGF0IHVzZQorICogICAgdGhlIGRlYnVnZ2luZyB0b29scy4gVGhlIGZpbGUgbmFtZSBjYW4gYmUgYW55dGhpbmcuCisgKgorICogIC0gc29tZSAob3B0aW9uYWwpIC5jIGNvZGUgdG8gbWFuaXB1bGF0ZSB0aGUgcnVudGltZSBkZWJ1ZyBsZXZlbHMKKyAqICAgIHRocm91Z2ggZGVidWdmcy4KKyAqCisgKiBUaGUgZGVidWctbGV2ZWxzLmggZmlsZSB3b3VsZCBsb29rIGxpa2U6CisgKgorICogICAgICNpZm5kZWYgX19kZWJ1Z19sZXZlbHNfX2hfXworICogICAgICNkZWZpbmUgX19kZWJ1Z19sZXZlbHNfX2hfXworICoKKyAqICAgICAjZGVmaW5lIERfTU9EVUxFTkFNRSBtb2R1bGVuYW1lCisgKiAgICAgI2RlZmluZSBEX01BU1RFUiAxMAorICoKKyAqICAgICAjaW5jbHVkZSA8bGludXgvd2ltYXgvZGVidWcuaD4KKyAqCisgKiAgICAgZW51bSBkX21vZHVsZSB7CisgKiAgICAgICAgICAgICBEX1NVQk1PRFVMRV9ERUNMQVJFKHN1Ym1vZHVsZV8xKSwKKyAqICAgICAgICAgICAgIERfU1VCTU9EVUxFX0RFQ0xBUkUoc3VibW9kdWxlXzIpLAorICogICAgICAgICAgICAgLi4uCisgKiAgICAgICAgICAgICBEX1NVQk1PRFVMRV9ERUNMQVJFKHN1Ym1vZHVsZV9OKQorICogICAgIH07CisgKgorICogICAgICNlbmRpZgorICoKKyAqIERfTUFTVEVSIGlzIHRoZSBtYXhpbXVtIGNvbXBpbGUtdGltZSBkZWJ1ZyBsZXZlbDsgYW55IGRlYnVnIGFjdGlvbnMKKyAqIGFib3ZlIHRoaXMgd2lsbCBiZSBvdXQuIERfTU9EVUxFTkFNRSBpcyB0aGUgbW9kdWxlIG5hbWUgKGxlZ2FsIEMKKyAqIGlkZW50aWZpZXIpLCB3aGljaCBoYXMgdG8gYmUgdW5pcXVlIGZvciBlYWNoIG1vZHVsZSAodG8gYXZvaWQKKyAqIG5hbWVzcGFjZSBjb2xsaXNpb25zIGR1cmluZyBsaW5rYWdlKS4gTm90ZSB0aG9zZSAjZGVmaW5lcyBuZWVkIHRvCisgKiBiZSBkb25lIGJlZm9yZSAjaW5jbHVkaW5nIGRlYnVnLmgKKyAqCisgKiBXZSBkZWNsYXJlIE4gZGlmZmVyZW50IHN1Ym1vZHVsZXMgd2hvc2UgZGVidWcgbGV2ZWwgY2FuIGJlCisgKiBpbmRlcGVuZGVudGx5IGNvbnRyb2xsZWQgZHVyaW5nIHJ1bnRpbWUuCisgKgorICogSW4gYSAuYyBmaWxlIG9mIHRoZSBtb2R1bGUgKGFuZCBvbmx5IGluIG9uZSBvZiB0aGVtKSwgZGVmaW5lIHRoZQorICogZm9sbG93aW5nIGNvZGU6CisgKgorICogICAgIHN0cnVjdCBkX2xldmVsIERfTEVWRUxbXSA9IHsKKyAqICAgICAgICAgICAgIERfU1VCTU9EVUxFX0RFRklORShzdWJtb2R1bGVfMSksCisgKiAgICAgICAgICAgICBEX1NVQk1PRFVMRV9ERUZJTkUoc3VibW9kdWxlXzIpLAorICogICAgICAgICAgICAgLi4uCisgKiAgICAgICAgICAgICBEX1NVQk1PRFVMRV9ERUZJTkUoc3VibW9kdWxlX04pLAorICogICAgIH07CisgKiAgICAgc2l6ZV90IERfTEVWRUxfU0laRSA9IEFSUkFZX1NJWkUoRF9MRVZFTCk7CisgKgorICogRXh0ZXJucyBmb3IgZF9sZXZlbF9NT0RVTEVOQU1FIGFuZCBkX2xldmVsX3NpemVfTU9EVUxFTkFNRSBhcmUgdXNlZAorICogYW5kIGRlY2xhcmVkIGluIHRoaXMgZmlsZSB1c2luZyB0aGUgRF9MRVZFTCBhbmQgRF9MRVZFTF9TSVpFIG1hY3JvcworICogI2RlZmluZWQgYWxzbyBpbiB0aGlzIGZpbGUuCisgKgorICogVG8gbWFuaXB1bGF0ZSBmcm9tIHVzZXIgc3BhY2UgdGhlIGxldmVscywgY3JlYXRlIGEgZGVidWdmcyBkZW50cnkKKyAqIGFuZCB0aGVuIHJlZ2lzdGVyIGVhY2ggc3VibW9kdWxlIHdpdGg6CisgKgorICogICAgIHJlc3VsdCA9IGRfbGV2ZWxfcmVnaXN0ZXJfZGVidWdmcygiUFJFRklYXyIsIHN1Ym1vZHVsZV9YLCBwYXJlbnQpOworICogICAgIGlmIChyZXN1bHQgPCAwKQorICogICAgICAgICAgICBnb3RvIGVycm9yOworICoKKyAqIFdoZXJlIFBSRUZJWF8gaXMgYSBuYW1lIG9mIHlvdXIgY2hvc2luZy4gVGhpcyB3aWxsIGNyZWF0ZSBkZWJ1Z2ZzCisgKiBmaWxlIHdpdGggYSBzaW5nbGUgbnVtZXJpYyB2YWx1ZSB0aGF0IGNhbiBiZSB1c2UgdG8gdHdlYWsgaXQuIFRvCisgKiByZW1vdmUgdGhlIGVudGlyZXMsIGp1c3QgdXNlIGRlYnVnZnNfcmVtb3ZlX3JlY3Vyc2l2ZSgpIG9uICdwYXJlbnQnLgorICoKKyAqIE5PVEU6IHJlbWVtYmVyIHRoYXQgZXZlbiBpZiB0aGlzIHdpbGwgc2hvdyBhdHRhY2hlZCB0byBzb21lCisgKiAgICAgcGFydGljdWxhciBpbnN0YW5jZSBvZiBhIGRldmljZSwgdGhlIHNldHRpbmdzIGFyZSAqZ2xvYmFsKi4KKyAqCisgKgorICogT24gZWFjaCBzdWJtb2R1bGUgKGZvciBleGFtcGxlLCAuYyBmaWxlcyksIHRoZSBkZWJ1ZyBpbmZyYXN0cnVjdHVyZQorICogc2hvdWxkIGJlIGluY2x1ZGVkIGxpa2UgdGhpczoKKyAqCisgKiAgICAgI2RlZmluZSBEX1NVQk1PRFVMRSBzdWJtb2R1bGVfeCAgICAgLy8gbWF0Y2hlcyBvbmUgaW4gZGVidWctbGV2ZWxzLmgKKyAqICAgICAjaW5jbHVkZSAiZGVidWctbGV2ZWxzLmgiCisgKgorICogYWZ0ZXIgI2luY2x1ZGluZyBhbGwgeW91ciBpbmNsdWRlIGZpbGVzLgorICoKKyAqCisgKiBOb3cgeW91IGNhbiB1c2UgdGhlIGRfKigpIG1hY3JvcyBiZWxvdyBbZF90ZXN0KCksIGRfZm5zdGFydCgpLAorICogZF9mbmVuZCgpLCBkX3ByaW50ZigpLCBkX2R1bXAoKV0uCisgKgorICogSWYgdGhlaXIgZGVidWcgbGV2ZWwgaXMgZ3JlYXRlciB0aGFuIERfTUFTVEVSLCB0aGV5IHdpbGwgYmUKKyAqIGNvbXBpbGVkIG91dC4KKyAqCisgKiBJZiB0aGVpciBkZWJ1ZyBsZXZlbCBpcyBsb3dlciBvciBlcXVhbCB0aGFuIERfTUFTVEVSIGJ1dCBncmVhdGVyCisgKiB0aGFuIHRoZSBjdXJyZW50IGRlYnVnIGxldmVsIG9mIHRoZWlyIHN1Ym1vZHVsZSwgdGhleSdsbCBiZQorICogaWdub3JlZC4KKyAqCisgKiBPdGhlcndpc2UsIHRoZSBhY3Rpb24gd2lsbCBiZSBwZXJmb3JtZWQuCisgKi8KKyNpZm5kZWYgX19kZWJ1Z19faF9fCisjZGVmaW5lIF9fZGVidWdfX2hfXworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKworCisvKiBCYWNrZW5kIHN0dWZmICovCisKKy8qCisgKiBEZWJ1ZyBiYWNrZW5kOiBnZW5lcmF0ZSBhIG1lc3NhZ2UgaGVhZGVyIGZyb20gYSAnc3RydWN0IGRldmljZScKKyAqCisgKiBAaGVhZDogYnVmZmVyIHdoZXJlIHRvIHBsYWNlIHRoZSBoZWFkZXIKKyAqIEBoZWFkX3NpemU6IGxlbmd0aCBvZiBAaGVhZAorICogQGRldjogcG9pbnRlciB0byBkZXZpY2UgdXNlZCB0byBnZW5lcmF0ZSBhIGhlYWRlciBmcm9tLiBJZiBOVUxMLAorICogICAgIGFuIGVtcHR5ICgiIikgaGVhZGVyIGlzIGdlbmVyYXRlZC4KKyAqLworc3RhdGljIGlubGluZQordm9pZCBfX2RfaGVhZChjaGFyICpoZWFkLCBzaXplX3QgaGVhZF9zaXplLAorCSAgICAgIHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlpZiAoZGV2ID09IE5VTEwpCisJCWhlYWRbMF0gPSAwOworCWVsc2UgaWYgKCh1bnNpZ25lZCBsb25nKWRldiA8IDQwOTYpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJFOiBDb3JydXB0IGRldiAlcFxuIiwgZGV2KTsKKwkJV0FSTl9PTigxKTsKKwl9IGVsc2UKKwkJc25wcmludGYoaGVhZCwgaGVhZF9zaXplLCAiJXMgJXM6ICIsCisJCQkgZGV2X2RyaXZlcl9zdHJpbmcoZGV2KSwgZGV2LT5idXNfaWQpOworfQorCisKKy8qCisgKiBEZWJ1ZyBiYWNrZW5kOiBsb2cgc29tZSBtZXNzYWdlIGlmIGRlYnVnZ2luZyBpcyBlbmFibGVkCisgKgorICogQGw6IGludGVuZGVkIGRlYnVnIGxldmVsCisgKiBAdGFnOiB0YWcgdG8gcHJlZml4IHRoZSBtZXNzYWdlIHdpdGgKKyAqIEBkZXY6ICdzdHJ1Y3QgZGV2aWNlJyBhc3NvY2lhdGVkIHRvIHRoaXMgbWVzc2FnZQorICogQGY6IHByaW50Zi1saWtlIGZvcm1hdCBhbmQgYXJndW1lbnRzCisgKgorICogTm90ZSB0aGlzIGlzIG9wdGltaXplZCBvdXQgaWYgaXQgZG9lc24ndCBwYXNzIHRoZSBjb21waWxlLXRpbWUKKyAqIGNoZWNrOyBob3dldmVyLCBpdCBpcyAqYWx3YXlzKiBjb21waWxlZC4gVGhpcyBpcyB1c2VmdWwgdG8gbWFrZQorICogc3VyZSB0aGUgcHJpbnRmLWxpa2UgZm9ybWF0cyBhbmQgdmFyaWFibGVzIGFyZSBhbHdheXMgY2hlY2tlZCBhbmQKKyAqIHRoZXkgZG9uJ3QgZ2V0IGJpdCByb3QgaWYgeW91IGhhdmUgYWxsIHRoZSBkZWJ1Z2dpbmcgZGlzYWJsZWQuCisgKi8KKyNkZWZpbmUgX2RfcHJpbnRmKGwsIHRhZywgZGV2LCBmLCBhLi4uKQkJCQkJXAorZG8gewkJCQkJCQkJCVwKKwljaGFyIGhlYWRbNjRdOwkJCQkJCQlcCisJaWYgKCFkX3Rlc3QobCkpCQkJCQkJCVwKKwkJYnJlYWs7CQkJCQkJCVwKKwlfX2RfaGVhZChoZWFkLCBzaXplb2YoaGVhZCksIGRldik7CQkJCVwKKwlwcmludGsoS0VSTl9FUlIgIiVzJXMlczogIiBmLCBoZWFkLCBfX2Z1bmNfXywgdGFnLCAjI2EpOwlcCit9IHdoaWxlICgwKQorCisKKy8qCisgKiBDUFAgc2ludGF0aWMgc3VnYXIgdG8gZ2VuZXJhdGUgQV9CIGxpa2Ugc3ltYm9sIG5hbWVzIHdoZW4gb25lIG9mCisgKiB0aGUgYXJndW1lbnRzIGlzIGEgYSBwcmVwcm9jZXNzb3IgI2RlZmluZS4KKyAqLworI2RlZmluZSBfX0RfUEFTVEVfXyh2YXJuYW1lLCBtb2R1bGVuYW1lKSB2YXJuYW1lIyNfIyNtb2R1bGVuYW1lCisjZGVmaW5lIF9fRF9QQVNURSh2YXJuYW1lLCBtb2R1bGVuYW1lKSAoX19EX1BBU1RFX18odmFybmFtZSwgbW9kdWxlbmFtZSkpCisjZGVmaW5lIF9EX1NVQk1PRFVMRV9JTkRFWChfbmFtZSkgKERfU1VCTU9EVUxFX0RFQ0xBUkUoX25hbWUpKQorCisKKy8qCisgKiBTdG9yZSBhIHN1Ym1vZHVsZSdzIHJ1bnRpbWUgZGVidWcgbGV2ZWwgYW5kIG5hbWUKKyAqLworc3RydWN0IGRfbGV2ZWwgeworCXU4IGxldmVsOworCWNvbnN0IGNoYXIgKm5hbWU7Cit9OworCisKKy8qCisgKiBMaXN0IG9mIGF2YWlsYWJsZSBzdWJtb2R1bGVzIGFuZCB0aGVpciBkZWJ1ZyBsZXZlbHMKKyAqCisgKiBXZSBjYWxsIHRoZW0gZF9sZXZlbF9NT0RVTEVOQU1FIGFuZCBkX2xldmVsX3NpemVfTU9EVUxFTkFNRTsgdGhlCisgKiBtYWNyb3MgRF9MRVZFTCBhbmQgRF9MRVZFTF9TSVpFIGNvbnRhaW4gdGhlIG5hbWUgYWxyZWFkeSBmb3IKKyAqIGNvbnZlbmllbmNlLgorICoKKyAqIFRoaXMgYXJyYXkgYW5kIHRoZSBzaXplIGFyZSBkZWZpbmVkIG9uIHNvbWUgLmMgZmlsZSB0aGF0IGlzIHBhcnQgb2YKKyAqIHRoZSBjdXJyZW50IG1vZHVsZS4KKyAqLworI2RlZmluZSBEX0xFVkVMIF9fRF9QQVNURShkX2xldmVsLCBEX01PRFVMRU5BTUUpCisjZGVmaW5lIERfTEVWRUxfU0laRSBfX0RfUEFTVEUoZF9sZXZlbF9zaXplLCBEX01PRFVMRU5BTUUpCisKK2V4dGVybiBzdHJ1Y3QgZF9sZXZlbCBEX0xFVkVMW107CitleHRlcm4gc2l6ZV90IERfTEVWRUxfU0laRTsKKworCisvKgorICogRnJvbnRlbmQgc3R1ZmYKKyAqCisgKgorICogU3R1ZmYgeW91IG5lZWQgdG8gZGVjbGFyZSBwcmlvciB0byB1c2luZyB0aGUgYWN0dWFsICJkZWJ1ZyIgYWN0aW9ucworICogKGRlZmluZWQgYmVsb3cpLgorICovCisKKyNpZm5kZWYgRF9NT0RVTEVOQU1FCisjZXJyb3IgRF9NT0RVTEVOQU1FIGlzIG5vdCBkZWZpbmVkIGluIHlvdXIgZGVidWctbGV2ZWxzLmggZmlsZQorLyoqCisgKiBEX01PRFVMRSAtIE5hbWUgb2YgdGhlIGN1cnJlbnQgbW9kdWxlCisgKgorICogI2RlZmluZSBpbiB5b3VyIG1vZHVsZSdzIGRlYnVnLWxldmVscy5oLCBtYWtpbmcgc3VyZSBpdCBpcworICogdW5pcXVlLiBUaGlzIGhhcyB0byBiZSBhIGxlZ2FsIEMgaWRlbnRpZmllci4KKyAqLworI2RlZmluZSBEX01PRFVMRU5BTUUgdW5kZWZpbmVkX21vZHVsZW5hbWUKKyNlbmRpZgorCisKKyNpZm5kZWYgRF9NQVNURVIKKyN3YXJuaW5nIERfTUFTVEVSIG5vdCBkZWZpbmVkLCBidXQgZGVidWcuaCBpbmNsdWRlZCEgW3NlZSBkb2NzXQorLyoqCisgKiBEX01BU1RFUiAtIENvbXBpbGUgdGltZSBtYXhpbXVtIGRlYnVnIGxldmVsCisgKgorICogI2RlZmluZSBpbiB5b3VyIGRlYnVnLWxldmVscy5oIGZpbGUgdG8gdGhlIG1heGltdW0gZGVidWcgbGV2ZWwgdGhlCisgKiBydW50aW1lIGNvZGUgd2lsbCBiZSBhbGxvd2VkIHRvIGhhdmUuIFRoaXMgYWxsb3dzIHlvdSB0byBwcm92aWRlIGEKKyAqIG1haW4ga25vYi4KKyAqCisgKiBBbnl0aGluZyBhYm92ZSB0aGF0IGxldmVsIHdpbGwgYmUgb3B0aW1pemVkIG91dCBvZiB0aGUgY29tcGlsZS4KKyAqCisgKiBEZWZhdWx0cyB0byB6ZXJvIChubyBkZWJ1ZyBjb2RlIGNvbXBpbGVkIGluKS4KKyAqCisgKiBNYXhpbXVtIG9uZSBkZWZpbml0aW9uIHBlciBtb2R1bGUgKGF0IHRoZSBkZWJ1Zy1sZXZlbHMuaCBmaWxlKS4KKyAqLworI2RlZmluZSBEX01BU1RFUiAwCisjZW5kaWYKKworI2lmbmRlZiBEX1NVQk1PRFVMRQorI2Vycm9yIERfU1VCTU9EVUxFIG5vdCBkZWZpbmVkLCBidXQgZGVidWcuaCBpbmNsdWRlZCEgW3NlZSBkb2NzXQorLyoqCisgKiBEX1NVQk1PRFVMRSAtIE5hbWUgb2YgdGhlIGN1cnJlbnQgc3VibW9kdWxlCisgKgorICogI2RlZmluZSBpbiB5b3VyIHN1Ym1vZHVsZSAuYyBmaWxlIGJlZm9yZSAjaW5jbHVkaW5nIGRlYnVnLWxldmVscy5oCisgKiB0byB0aGUgbmFtZSBvZiB0aGUgY3VycmVudCBzdWJtb2R1bGUgYXMgcHJldmlvdXNseSBkZWNsYXJlZCBhbmQKKyAqIGRlZmluZWQgd2l0aCBEX1NVQk1PRFVMRV9ERUNMQVJFKCkgKGluIHlvdXIgbW9kdWxlJ3MKKyAqIGRlYnVnLWxldmVscy5oKSBhbmQgRF9TVUJNT0RVTEVfREVGSU5FKCkuCisgKgorICogVGhpcyBpcyB1c2VkIHRvIHByb3ZpZGUgcnVudGltZS1jb250cm9sIG92ZXIgdGhlIGRlYnVnIGxldmVscy4KKyAqCisgKiBNYXhpbXVtIG9uZSBwZXIgLmMgZmlsZSEgQ2FuIGJlIHNoYXJlZCBhbW9uZyBkaWZmZXJlbnQgLmMgZmlsZXMKKyAqIChtZWFuaW5nIHRoZXkgYmVsb25nIHRvIHRoZSBzYW1lIHN1Ym1vZHVsZSBjYXRlZ29yaXphdGlvbikuCisgKi8KKyNkZWZpbmUgRF9TVUJNT0RVTEUgdW5kZWZpbmVkX21vZHVsZQorI2VuZGlmCisKKworLyoqCisgKiBEX1NVQk1PRFVMRV9ERUNMQVJFIC0gRGVjbGFyZSBhIHN1Ym1vZHVsZSBmb3IgcnVudGltZSBkZWJ1ZyBsZXZlbCBjb250cm9sCisgKgorICogQF9uYW1lOiBuYW1lIG9mIHRoZSBzdWJtb2R1bGUsIHJlc3RyaWN0ZWQgdG8gdGhlIGNoYXJzIHRoYXQgbWFrZSB1cCBhCisgKiAgICAgdmFsaWQgQyBpZGVudGlmaWVyIChbYS16QS1aMC05X10pLgorICoKKyAqIERlY2xhcmUgaW4gdGhlIG1vZHVsZSdzIGRlYnVnLWxldmVscy5oIGhlYWRlciBmaWxlIGFzOgorICoKKyAqIGVudW0gZF9tb2R1bGUgeworICogICAgICAgICBEX1NVQk1PRFVMRV9ERUNMQVJFKHN1Ym1vZHVsZV8xKSwKKyAqICAgICAgICAgRF9TVUJNT0RVTEVfREVDTEFSRShzdWJtb2R1bGVfMiksCisgKiAgICAgICAgIERfU1VCTU9EVUxFX0RFQ0xBUkUoc3VibW9kdWxlXzMpLAorICogfTsKKyAqCisgKiBTb21lIGNvcnJlc3BvbmRpbmcgLmMgZmlsZSBuZWVkcyB0byBoYXZlIGEgbWF0Y2hpbmcKKyAqIERfU1VCTU9EVUxFX0RFRklORSgpLgorICovCisjZGVmaW5lIERfU1VCTU9EVUxFX0RFQ0xBUkUoX25hbWUpIF9fRF9TVUJNT0RVTEVfIyNfbmFtZQorCisKKy8qKgorICogRF9TVUJNT0RVTEVfREVGSU5FIC0gRGVmaW5lIGEgc3VibW9kdWxlIGZvciBydW50aW1lIGRlYnVnIGxldmVsIGNvbnRyb2wKKyAqCisgKiBAX25hbWU6IG5hbWUgb2YgdGhlIHN1Ym1vZHVsZSwgcmVzdHJpY3RlZCB0byB0aGUgY2hhcnMgdGhhdCBtYWtlIHVwIGEKKyAqICAgICB2YWxpZCBDIGlkZW50aWZpZXIgKFthLXpBLVowLTlfXSkuCisgKgorICogVXNlIG9uY2UgcGVyIG1vZHVsZSAoaW4gc29tZSAuYyBmaWxlKSBhczoKKyAqCisgKiBzdGF0aWMKKyAqIHN0cnVjdCBkX2xldmVsIGRfbGV2ZWxfU1VCTU9EVUxFTkFNRVtdID0geworICogICAgICAgICBEX1NVQk1PRFVMRV9ERUZJTkUoc3VibW9kdWxlXzEpLAorICogICAgICAgICBEX1NVQk1PRFVMRV9ERUZJTkUoc3VibW9kdWxlXzIpLAorICogICAgICAgICBEX1NVQk1PRFVMRV9ERUZJTkUoc3VibW9kdWxlXzMpLAorICogfTsKKyAqIHNpemVfdCBkX2xldmVsX3NpemVfU1VCRE1PRFVMRU5BTUUgPSBBUlJBWV9TSVpFKGRfbGV2ZWxfU1VCRE1PRFVMRU5BTUUpOworICoKKyAqIE1hdGNoaW5nIERfU1VCTU9EVUxFX0RFQ0xBUkUoKXMgaGF2ZSB0byBiZSBwcmVzZW50IGluIGEKKyAqIGRlYnVnLWxldmVscy5oIGhlYWRlciBmaWxlLgorICovCisjZGVmaW5lIERfU1VCTU9EVUxFX0RFRklORShfbmFtZSkJCVwKK1tfX0RfU1VCTU9EVUxFXyMjX25hbWVdID0gewkJCVwKKwkubGV2ZWwgPSAwLAkJCQlcCisJLm5hbWUgPSAjX25hbWUJCQkJXAorfQorCisKKworLyogVGhlIGFjdHVhbCAiZGVidWciIG9wZXJhdGlvbnMgKi8KKworCisvKioKKyAqIGRfdGVzdCAtIFJldHVybnMgdHJ1ZSBpZiBkZWJ1Z2dpbmcgc2hvdWxkIGJlIGVuYWJsZWQKKyAqCisgKiBAbDogaW50ZW5kZWQgZGVidWcgbGV2ZWwgKHVuc2lnbmVkKQorICoKKyAqIElmIHRoZSBtYXN0ZXIgZGVidWcgc3dpdGNoIGlzIGVuYWJsZWQgYW5kIHRoZSBjdXJyZW50IHNldHRpbmdzIGFyZQorICogaGlnaGVyIG9yIGVxdWFsIHRvIHRoZSByZXF1ZXN0ZWQgbGV2ZWwsIHRoZW4gZGVidWdnaW5nCisgKiBvdXRwdXQvYWN0aW9ucyBzaG91bGQgYmUgZW5hYmxlZC4KKyAqCisgKiBOT1RFOgorICoKKyAqIFRoaXMgbmVlZHMgdG8gYmUgY29kZWQgc28gdGhhdCBpdCBjYW4gYmUgZXZhbHVhdGVkIGluIGNvbXBpbGUKKyAqIHRpbWU7IHRoaXMgaXMgd2h5IHRoZSB1Z2x5IEJVR19PTigpIGlzIHBsYWNlZCBpbiB0aGVyZSwgc28gdGhlCisgKiBEX01BU1RFUiBldmFsdWF0aW9uIGNvbXBpbGVzIGFsbCBvdXQgaWYgaXQgaXMgY29tcGlsZS10aW1lIGZhbHNlLgorICovCisjZGVmaW5lIGRfdGVzdChsKQkJCQkJCQlcCisoewkJCQkJCQkJCVwKKwl1bnNpZ25lZCBfX2wgPSBsOwkvKiB0eXBlIGVuZm9yY2VyICovCQkJXAorCShEX01BU1RFUikgPj0gX19sCQkJCQkJXAorCSYmICh7CQkJCQkJCQlcCisJCUJVR19PTihfRF9TVUJNT0RVTEVfSU5ERVgoRF9TVUJNT0RVTEUpID49IERfTEVWRUxfU0laRSk7XAorCQlEX0xFVkVMW19EX1NVQk1PRFVMRV9JTkRFWChEX1NVQk1PRFVMRSldLmxldmVsID49IF9fbDsJXAorCX0pOwkJCQkJCQkJXAorfSkKKworCisvKioKKyAqIGRfZm5zdGFydCAtIGxvZyBtZXNzYWdlIGF0IGZ1bmN0aW9uIHN0YXJ0IGlmIGRlYnVnZ2luZyBlbmFibGVkCisgKgorICogQGw6IGludGVuZGVkIGRlYnVnIGxldmVsCisgKiBAX2RldjogJ3N0cnVjdCBkZXZpY2UnIHBvaW50ZXIsIE5VTEwgaWYgbm9uZSAoZm9yIGNvbnRleHQpCisgKiBAZjogcHJpbnRmLWxpa2UgZm9ybWF0IGFuZCBhcmd1bWVudHMKKyAqLworI2RlZmluZSBkX2Zuc3RhcnQobCwgX2RldiwgZiwgYS4uLikgX2RfcHJpbnRmKGwsICIgRk5TVEFSVCIsIF9kZXYsIGYsICMjIGEpCisKKworLyoqCisgKiBkX2ZuZW5kIC0gbG9nIG1lc3NhZ2UgYXQgZnVuY3Rpb24gZW5kIGlmIGRlYnVnZ2luZyBlbmFibGVkCisgKgorICogQGw6IGludGVuZGVkIGRlYnVnIGxldmVsCisgKiBAX2RldjogJ3N0cnVjdCBkZXZpY2UnIHBvaW50ZXIsIE5VTEwgaWYgbm9uZSAoZm9yIGNvbnRleHQpCisgKiBAZjogcHJpbnRmLWxpa2UgZm9ybWF0IGFuZCBhcmd1bWVudHMKKyAqLworI2RlZmluZSBkX2ZuZW5kKGwsIF9kZXYsIGYsIGEuLi4pIF9kX3ByaW50ZihsLCAiIEZORU5EIiwgX2RldiwgZiwgIyMgYSkKKworCisvKioKKyAqIGRfcHJpbnRmIC0gbG9nIG1lc3NhZ2UgaWYgZGVidWdnaW5nIGVuYWJsZWQKKyAqCisgKiBAbDogaW50ZW5kZWQgZGVidWcgbGV2ZWwKKyAqIEBfZGV2OiAnc3RydWN0IGRldmljZScgcG9pbnRlciwgTlVMTCBpZiBub25lIChmb3IgY29udGV4dCkKKyAqIEBmOiBwcmludGYtbGlrZSBmb3JtYXQgYW5kIGFyZ3VtZW50cworICovCisjZGVmaW5lIGRfcHJpbnRmKGwsIF9kZXYsIGYsIGEuLi4pIF9kX3ByaW50ZihsLCAiIiwgX2RldiwgZiwgIyMgYSkKKworCisvKioKKyAqIGRfZHVtcCAtIGxvZyBidWZmZXIgaGV4IGR1bXAgaWYgZGVidWdnaW5nIGVuYWJsZWQKKyAqCisgKiBAbDogaW50ZW5kZWQgZGVidWcgbGV2ZWwKKyAqIEBfZGV2OiAnc3RydWN0IGRldmljZScgcG9pbnRlciwgTlVMTCBpZiBub25lIChmb3IgY29udGV4dCkKKyAqIEBmOiBwcmludGYtbGlrZSBmb3JtYXQgYW5kIGFyZ3VtZW50cworICovCisjZGVmaW5lIGRfZHVtcChsLCBkZXYsIHB0ciwgc2l6ZSkJCQlcCitkbyB7CQkJCQkJCVwKKwljaGFyIGhlYWRbNjRdOwkJCQkJXAorCWlmICghZF90ZXN0KGwpKQkJCQkJXAorCQlicmVhazsJCQkJCVwKKwlfX2RfaGVhZChoZWFkLCBzaXplb2YoaGVhZCksIGRldik7CQlcCisJcHJpbnRfaGV4X2R1bXAoS0VSTl9FUlIsIGhlYWQsIDAsIDE2LCAxLAlcCisJCSAgICAgICAoKHZvaWQgKikgcHRyKSwgKHNpemUpLCAwKTsJXAorfSB3aGlsZSAoMCkKKworCisvKioKKyAqIEV4cG9ydCBhIHN1Ym1vZHVsZSdzIGRlYnVnIGxldmVsIG92ZXIgZGVidWdmcyBhcyBQUkVGSVhTVUJNT0RVTEUKKyAqCisgKiBAcHJlZml4OiBzdHJpbmcgdG8gcHJlZml4IHRoZSBuYW1lIHdpdGgKKyAqIEBzdWJtb2R1bGU6IG5hbWUgb2Ygc3VibW9kdWxlIChub3QgYSBzdHJpbmcsIGp1c3QgdGhlIG5hbWUpCisgKiBAZGVudHJ5OiBkZWJ1Z2ZzIHBhcmVudCBkZW50cnkKKyAqCisgKiBSZXR1cm5zOiAwIGlmIG9rLCA8IDAgZXJybm8gb24gZXJyb3IuCisgKgorICogRm9yIHJlbW92aW5nLCBqdXN0IHVzZSBkZWJ1Z2ZzX3JlbW92ZV9yZWN1cnNpdmUoKSBvbiB0aGUgcGFyZW50LgorICovCisjZGVmaW5lIGRfbGV2ZWxfcmVnaXN0ZXJfZGVidWdmcyhwcmVmaXgsIG5hbWUsIHBhcmVudCkJCQlcCisoewkJCQkJCQkJCVwKKwlpbnQgcmM7CQkJCQkJCQlcCisJc3RydWN0IGRlbnRyeSAqZmQ7CQkJCQkJXAorCXN0cnVjdCBkZW50cnkgKnZlcmlmeV9wYXJlbnRfdHlwZSA9IHBhcmVudDsJCQlcCisJZmQgPSBkZWJ1Z2ZzX2NyZWF0ZV91OCgJCQkJCQlcCisJCXByZWZpeCAjbmFtZSwgMDYwMCwgdmVyaWZ5X3BhcmVudF90eXBlLAkJCVwKKwkJJihEX0xFVkVMW19fRF9TVUJNT0RVTEVfICMjIG5hbWVdLmxldmVsKSk7CQlcCisJcmMgPSBQVFJfRVJSKGZkKTsJCQkJCQlcCisJaWYgKElTX0VSUihmZCkgJiYgcmMgIT0gLUVOT0RFVikJCQkJXAorCQlwcmludGsoS0VSTl9FUlIgIiVzOiBDYW4ndCBjcmVhdGUgZGVidWdmcyBlbnRyeSAlczogIglcCisJCSAgICAgICAiJWRcbiIsIF9fZnVuY19fLCBwcmVmaXggI25hbWUsIHJjKTsJCVwKKwllbHNlCQkJCQkJCQlcCisJCXJjID0gMDsJCQkJCQkJXAorCXJjOwkJCQkJCQkJXAorfSkKKworCisjZW5kaWYgLyogI2lmbmRlZiBfX2RlYnVnX19oX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvd2ltYXgvaTI0MDBtLmggYi9pbmNsdWRlL2xpbnV4L3dpbWF4L2kyNDAwbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0MTk4ZjUKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L3dpbWF4L2kyNDAwbS5oCkBAIC0wLDAgKzEsNTEyIEBACisvKgorICogSW50ZWwgV2lyZWxlc3MgV2lNYXggQ29ubmVjdGlvbiAyNDAwbQorICogSG9zdC1EZXZpY2UgcHJvdG9jb2wgaW50ZXJmYWNlIGRlZmluaXRpb25zCisgKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgICBkaXN0cmlidXRpb24uCisgKiAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqCisgKiBJbnRlbCBDb3Jwb3JhdGlvbiA8bGludXgtd2ltYXhAaW50ZWwuY29tPgorICogSW5ha3kgUGVyZXotR29uemFsZXogPGluYWt5LnBlcmV6LWdvbnphbGV6QGludGVsLmNvbT4KKyAqICAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24KKyAqCisgKgorICogVGhpcyBoZWFkZXIgZGVmaW5lcyB0aGUgZGF0YSBzdHJ1Y3R1cmVzIGFuZCBjb25zdGFudHMgdXNlZCB0bworICogY29tbXVuaWNhdGUgd2l0aCB0aGUgZGV2aWNlLgorICoKKyAqIEJPT1RNT0RFL0JPT1RST00vRklSTVdBUkUgVVBMT0FEIFBST1RPQ09MCisgKgorICogVGhlIGZpcm13YXJlIHVwbG9hZCBwcm90b2NvbCBpcyBxdWl0ZSBzaW1wbGUgYW5kIG9ubHkgcmVxdWlyZXMgYQorICogaGFuZGZ1bCBvZiBjb21tYW5kcy4gU2VlIGRyaXZlcnMvbmV0L3dpbWF4L2kyNDAwbS9mdy5jIGZvciBtb3JlCisgKiBkZXRhaWxzLgorICoKKyAqIFRoZSBCQ0YgZGF0YSBzdHJ1Y3R1cmUgaXMgZm9yIHRoZSBmaXJtd2FyZSBmaWxlIGhlYWRlci4KKyAqCisgKgorICogVEhFIERBVEEgLyBDT05UUk9MIFBST1RPQ09MCisgKgorICogVGhpcyBpcyB0aGUgbm9ybWFsIHByb3RvY29sIHNwb2tlbiB3aXRoIHRoZSBkZXZpY2Ugb25jZSB0aGUKKyAqIGZpcm13YXJlIGlzIHVwbG9hZGVkLiBJdCB0cmFuc3BvcnRzIGRhdGEgcGF5bG9hZHMgYW5kIGNvbnRyb2wKKyAqIG1lc3NhZ2VzIGJhY2sgYW5kIGZvcnRoLgorICoKKyAqIEl0IGNvbnNpc3RzICdtZXNzYWdlcycgdGhhdCBwYWNrIG9uZSBvciBtb3JlIHBheWxvYWRzIGVhY2guIFRoZQorICogZm9ybWF0IGlzIGRlc2NyaWJlZCBpbiBkZXRhaWwgaW4gZHJpdmVycy9uZXQvd2ltYXgvaTI0MDBtL3J4LmMgYW5kCisgKiB0eC5jLgorICoKKyAqCisgKiBUSEUgTDNMNCBQUk9UT0NPTAorICoKKyAqIFRoZSB0ZXJtIEwzTDQgcmVmZXJzIHRvIExheWVyIDMgKHRoZSBkZXZpY2UpLCBMYXllciA0ICh0aGUKKyAqIGRyaXZlci9ob3N0IHNvZnR3YXJlKS4KKyAqCisgKiBUaGlzIGlzIHRoZSBjb250cm9sIHByb3RvY29sIHVzZWQgYnkgdGhlIGhvc3QgdG8gY29udHJvbCB0aGUgaTI0MDBtCisgKiBkZXZpY2UgKHNjYW4sIGNvbm5lY3QsIGRpc2Nvbm5lY3QuLi4pLiBUaGlzIGlzIHNlbnQgdG8gLyByZWNlaXZlZAorICogYXMgY29udHJvbCBmcmFtZXMuIFRoZXNlIGZyYW1lcyBjb25zaXN0IG9mIGEgaGVhZGVyIGFuZCB6ZXJvIG9yCisgKiBtb3JlIFRMVnMgd2l0aCBpbmZvcm1hdGlvbi4gV2UgY2FsbCBlYWNoIGNvbnRyb2wgZnJhbWUgYSAibWVzc2FnZSIuCisgKgorICogRWFjaCBtZXNzYWdlIGlzIGNvbXBvc2VkIG9mOgorICoKKyAqIEhFQURFUgorICogW1RMVjAgKyBQQVlMT0FEMF0KKyAqIFtUTFYxICsgUEFZTE9BRDFdCisgKiBbLi4uXQorICogW1RMVk4gKyBQQVlMT0FETl0KKyAqCisgKiBUaGUgSEVBREVSIGlzIGRlZmluZWQgYnkgJ3N0cnVjdCBpMjQwMG1fbDNsNF9oZHInLiBUaGUgcGF5bG9hZHMgYXJlCisgKiBkZWZpbmVkIGJ5IGEgVExWIHN0cnVjdHVyZSAoVHlwZSBMZW5ndGggVmFsdWUpIHdoaWNoIGlzIGEgJ2hlYWRlcicKKyAqIChzdHJ1Y3QgaTI0MDBtX3Rsdl9oZHIpIGFuZCB0aGVuIHRoZSBwYXlsb2FkLgorICoKKyAqIEFsbCBpbnRlZ2VycyBhcmUgcmVwcmVzZW50ZWQgYXMgTGl0dGxlIEVuZGlhbi4KKyAqCisgKiAtIFJFUVVFU1RTIEFORCBFVkVOVFMKKyAqCisgKiBUaGUgcmVxdWVzdHMgY2FuIGJlIGNsYXNpZmllZCBhcyBmb2xsb3dzOgorICoKKyAqICAgQ09NTUFORDogIGltcGxpZXMgYSByZXF1ZXN0IGZyb20gdGhlIGhvc3QgdG8gdGhlIGRldmljZSByZXF1ZXN0aW5nCisgKiAgICAgICAgICAgICBhbiBhY3Rpb24gYmVpbmcgcGVyZm9ybWVkLiBUaGUgZGV2aWNlIHdpbGwgcmVwbHkgd2l0aCBhCisgKiAgICAgICAgICAgICBtZXNzYWdlICh3aXRoIHRoZSBzYW1lIHR5cGUgYXMgdGhlIGNvbW1hbmQpLCBzdGF0dXMgYW5kCisgKiAgICAgICAgICAgICBubyAoVExWKSBwYXlsb2FkLiBFeGVjdXRpb24gb2YgYSBjb21tYW5kIG1pZ2h0IGNhdXNlCisgKiAgICAgICAgICAgICBldmVudHMgKG9mIGRpZmZlcmVudCB0eXBlKSB0byBiZSBzZW50IGxhdGVyIG9uIGFzCisgKiAgICAgICAgICAgICBkZXZpY2UncyBzdGF0ZSBjaGFuZ2VzLgorICoKKyAqICAgR0VUL1NFVDogIHNpbWlsYXIgdG8gQ09NTUFORCwgYnV0IHdpbGwgbm90IGNhdXNlIG90aGVyCisgKiAgICAgICAgICAgICBFVkVOVHMuIFRoZSByZXBseSwgaW4gdGhlIGNhc2Ugb2YgR0VULCB3aWxsIGNvbnRhaW4KKyAqICAgICAgICAgICAgIFRMVnMgd2l0aCB0aGUgcmVxdWVzdGVkIGluZm9ybWF0aW9uLgorICoKKyAqICAgRVZFTlQ6ICAgIGFzeW5jaHJvbm91cyBtZXNzYWdlcyBzZW50IGZyb20gdGhlIGRldmljZSwgbWF5YmUgYXMgYQorICogICAgICAgICAgICAgY29uc2VxdWVuY2Ugb2YgcHJldmlvdXMgQ09NTUFORHMgYnV0IGRpc2Fzc29jaWF0ZWQgZnJvbQorICogICAgICAgICAgICAgdGhlbS4KKyAqCisgKiBPbmx5IG9uZSByZXF1ZXN0IG1pZ2h0IGJlIHBlbmRpbmcgYXQgdGhlIHNhbWUgdGltZSAoaWU6IGRvbid0CisgKiBwYXJhbGxlbGl6ZSBub3IgcG9zdCBhbm90aGVyIEdFVCByZXF1ZXN0IGJlZm9yZSB0aGUgcHJldmlvdXMKKyAqIENPTU1BTkQgaGFzIGJlZW4gYWNrbm93bGVkZ2VkIHdpdGggaXQncyBjb3JyZXNwb25kaW5nIHJlcGx5IGJ5IHRoZQorICogZGV2aWNlKS4KKyAqCisgKiBUaGUgZGlmZmVyZW50IHJlcXVlc3RzIGFuZCB0aGVpciBmb3JtYXRzIGFyZSBkZXNjcmliZWQgYmVsb3c6CisgKgorICogIEkyNDAwTV9NVF8qICAgTWVzc2FnZSB0eXBlcworICogIEkyNDAwTV9NU18qICAgTWVzc2FnZSBzdGF0dXMgKGZvciByZXBsaWVzLCBldmVudHMpCisgKiAgaTI0MDBtX3Rsdl8qICBUTFZzCisgKgorICogZGF0YSB0eXBlcyBhcmUgbmFtZWQgJ3N0cnVjdCBpMjQwMG1fbXNnX09QTkFNRScsIE9QTkFNRSBtYXRjaGluZyB0aGUKKyAqIG9wZXJhdGlvbi4KKyAqLworCisjaWZuZGVmIF9fTElOVVhfX1dJTUFYX19JMjQwME1fSF9fCisjZGVmaW5lIF9fTElOVVhfX1dJTUFYX19JMjQwME1fSF9fCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisKKy8qCisgKiBIb3N0IERldmljZSBJbnRlcmZhY2UgKEhESSkgY29tbW9uIHRvIGFsbCBidXNzZXMKKyAqLworCisvKiBCb290LW1vZGUgKGZpcm13YXJlIHVwbG9hZCBtb2RlKSBjb21tYW5kcyAqLworCisvKiBIZWFkZXIgZm9yIHRoZSBmaXJtd2FyZSBmaWxlICovCitzdHJ1Y3QgaTI0MDBtX2JjZl9oZHIgeworCV9fbGUzMiBtb2R1bGVfdHlwZTsKKwlfX2xlMzIgaGVhZGVyX2xlbjsKKwlfX2xlMzIgaGVhZGVyX3ZlcnNpb247CisJX19sZTMyIG1vZHVsZV9pZDsKKwlfX2xlMzIgbW9kdWxlX3ZlbmRvcjsKKwlfX2xlMzIgZGF0ZTsJCS8qIEJDRCBZWVlNTUREICovCisJX19sZTMyIHNpemU7CisJX19sZTMyIGtleV9zaXplOwkvKiBpbiBkd29yZHMgKi8KKwlfX2xlMzIgbW9kdWx1c19zaXplOwkvKiBpbiBkd29yZHMgKi8KKwlfX2xlMzIgZXhwb25lbnRfc2l6ZTsJLyogaW4gZHdvcmRzICovCisJX191OCByZXNlcnZlZFs4OF07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyogQm9vdCBtb2RlIG9wY29kZXMgKi8KK2VudW0gaTI0MDBtX2JyaF9vcGNvZGUgeworCUkyNDAwTV9CUkhfUkVBRCA9IDEsCisJSTI0MDBNX0JSSF9XUklURSA9IDIsCisJSTI0MDBNX0JSSF9KVU1QID0gMywKKwlJMjQwME1fQlJIX1NJR05FRF9KVU1QID0gOCwKKwlJMjQwME1fQlJIX0hBU0hfUEFZTE9BRF9PTkxZID0gOSwKK307CisKKy8qIEJvb3QgbW9kZSBjb21tYW5kIG1hc2tzIGFuZCBzdHVmZiAqLworZW51bSBpMjQwMG1fYnJoIHsKKwlJMjQwME1fQlJIX1NJR05BVFVSRSA9IDB4Y2JiYzAwMDAsCisJSTI0MDBNX0JSSF9TSUdOQVRVUkVfTUFTSyA9IDB4ZmZmZjAwMDAsCisJSTI0MDBNX0JSSF9TSUdOQVRVUkVfU0hJRlQgPSAxNiwKKwlJMjQwME1fQlJIX09QQ09ERV9NQVNLID0gMHgwMDAwMDAwZiwKKwlJMjQwME1fQlJIX1JFU1BPTlNFX01BU0sgPSAweDAwMDAwMGYwLAorCUkyNDAwTV9CUkhfUkVTUE9OU0VfU0hJRlQgPSA0LAorCUkyNDAwTV9CUkhfRElSRUNUX0FDQ0VTUyA9IDB4MDAwMDA0MDAsCisJSTI0MDBNX0JSSF9SRVNQT05TRV9SRVFVSVJFRCA9IDB4MDAwMDAyMDAsCisJSTI0MDBNX0JSSF9VU0VfQ0hFQ0tTVU0gPSAweDAwMDAwMTAwLAorfTsKKworCisvKiBDb25zdGFudHMgZm9yIGJjZi0+bW9kdWxlX2lkICovCitlbnVtIGkyNDAwbV9iY2ZfbW9kX2lkIHsKKwkvKiBGaXJtd2FyZSBmaWxlIGNhcnJpZXMgaXRzIG93biBwb2tlcyAtLSBwb2tlcyBhcmUgYSBzZXQgb2YKKwkgKiBtYWdpY2FsIHZhbHVlcyB0aGF0IGhhdmUgdG8gYmUgd3JpdHRlbiBpbiBjZXJ0YWluIG1lbW9yeQorCSAqIGFkZHJlc3NlcyB0byBnZXQgdGhlIGRldmljZSB1cCBhbmQgcmVhZHkgZm9yIGZpcm13YXJlCisJICogZG93bmxvYWQgd2hlbiBpdCBpcyBpbiBub24tc2lnbmVkIGJvb3QgbW9kZS4gKi8KKwlJMjQwME1fQkNGX01PRF9JRF9QT0tFUyA9IDB4MDAwMDAwMDAxLAorfTsKKworCisvKioKKyAqIGkyNDAwbV9ib290cm9tX2hlYWRlciAtIEhlYWRlciBmb3IgYSBib290LW1vZGUgY29tbWFuZAorICoKKyAqIEBjbWQ6IHRoZSBhYm92ZSBjb21tYW5kIGRlc2NyaXB0b3IKKyAqIEB0YXJnZXRfYWRkcjogd2hlcmUgb24gdGhlIGRldmljZSBtZW1vcnkgc2hvdWxkIHRoZSBhY3Rpb24gYmUgcGVyZm9ybWVkLgorICogQGRhdGFfc2l6ZTogZm9yIHJlYWQvd3JpdGUsIGFtb3VudCBvZiBkYXRhIHRvIGJlIHJlYWQvd3JpdHRlbgorICogQGJsb2NrX2NoZWNrc3VtOiBjaGVja3N1bSB2YWx1ZSAoaWYgYXBwbGljYWJsZSkKKyAqIEBwYXlsb2FkOiB0aGUgYmVnaW5uaW5nIG9mIGRhdGEgYXR0YWNoZWQgdG8gdGhpcyBoZWFkZXIKKyAqLworc3RydWN0IGkyNDAwbV9ib290cm9tX2hlYWRlciB7CisJX19sZTMyIGNvbW1hbmQ7CQkvKiBDb21wb3NlIHdpdGggZW51bSBpMjQwMF9icmggKi8KKwlfX2xlMzIgdGFyZ2V0X2FkZHI7CisJX19sZTMyIGRhdGFfc2l6ZTsKKwlfX2xlMzIgYmxvY2tfY2hlY2tzdW07CisJY2hhciBwYXlsb2FkWzBdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKworLyoKKyAqIERhdGEgLyBjb250cm9sIHByb3RvY29sCisgKi8KKworLyogUGFja2V0IHR5cGVzIGZvciB0aGUgaG9zdC1kZXZpY2UgaW50ZXJmYWNlICovCitlbnVtIGkyNDAwbV9wdCB7CisJSTI0MDBNX1BUX0RBVEEgPSAwLAorCUkyNDAwTV9QVF9DVFJMLAorCUkyNDAwTV9QVF9UUkFDRSwJLyogRm9yIGRldmljZSBkZWJ1ZyAqLworCUkyNDAwTV9QVF9SRVNFVF9XQVJNLAkvKiBkZXZpY2UgcmVzZXQgKi8KKwlJMjQwME1fUFRfUkVTRVRfQ09MRCwJLyogVVNCW3RyYW5zcG9ydF0gcmVzZXQsIGxpa2UgcmVjb25uZWN0ICovCisJSTI0MDBNX1BUX0lMTEVHQUwKK307CisKKworLyoKKyAqIFBheWxvYWQgZm9yIGEgZGF0YSBwYWNrZXQKKyAqCisgKiBUaGlzIGlzIHByZWZpeGVkIHRvIGVhY2ggYW5kIGV2ZXJ5IG91dGdvaW5nIERBVEEgdHlwZS4KKyAqLworc3RydWN0IGkyNDAwbV9wbF9kYXRhX2hkciB7CisJX19sZTMyIHJlc2VydmVkOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworCisvKiBNaXNjIGNvbnN0YW50cyAqLworZW51bSB7CisJSTI0MDBNX1BMX1BBRCA9IDE2LAkvKiBQYXlsb2FkIGRhdGEgc2l6ZSBhbGlnbm1lbnQgKi8KKwlJMjQwME1fUExfU0laRV9NQVggPSAweDNFRkYsCisJSTI0MDBNX01BWF9QTFNfSU5fTVNHID0gNjAsCisJLyogcHJvdG9jb2wgYmFya2Vyczogc3luYyBzZXF1ZW5jZXM7IGZvciBub3RpZmljYXRpb25zIHRoZXkKKwkgKiBhcmUgc2VudCBpbiBncm91cHMgb2YgZm91ci4gKi8KKwlJMjQwME1fSDJEX1BSRVZJRVdfQkFSS0VSID0gMHhjYWZlOTAwZCwKKwlJMjQwME1fQ09MRF9SRVNFVF9CQVJLRVIgPSAweGMwMWRjMDFkLAorCUkyNDAwTV9XQVJNX1JFU0VUX0JBUktFUiA9IDB4NTBmNzUwZjcsCisJSTI0MDBNX05CT09UX0JBUktFUiA9IDB4ZGVhZGJlZWYsCisJSTI0MDBNX1NCT09UX0JBUktFUiA9IDB4MGZmMWMxYTEsCisJSTI0MDBNX0FDS19CQVJLRVIgPSAweGZlZWRiYWJlLAorCUkyNDAwTV9EMkhfTVNHX0JBUktFUiA9IDB4YmVlZmJhYmUsCit9OworCisKKy8qCisgKiBIYXJkd2FyZSBwYXlsb2FkIGRlc2NyaXB0b3IKKyAqCisgKiBCaXRmaWVsZHMgZW5jb2RlZCBpbiBhIHN0cnVjdCB0byBlbmZvcmNlIHR5cGluZyBzZW1hbnRpY3MuCisgKgorICogTG9vayBpbiByeC5jIGFuZCB0eC5jIGZvciBhIGZ1bGwgZGVzY3JpcHRpb24gb2YgdGhlIGZvcm1hdC4KKyAqLworc3RydWN0IGkyNDAwbV9wbGQgeworCV9fbGUzMiB2YWw7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworI2RlZmluZSBJMjQwME1fUExEX1NJWkVfTUFTSyAweDAwMDAzZmZmCisjZGVmaW5lIEkyNDAwTV9QTERfVFlQRV9TSElGVCAxNgorI2RlZmluZSBJMjQwME1fUExEX1RZUEVfTUFTSyAweDAwMGYwMDAwCisKKy8qCisgKiBIZWFkZXIgZm9yIGEgVFggbWVzc2FnZSBvciBSWCBtZXNzYWdlCisgKgorICogQGJhcmtlcjogcHJlYW1ibGUKKyAqIEBzaXplOiB1c2VkIGZvciBtYW5hZ2VtZW50IG9mIHRoZSBGSUZPIHF1ZXVlIGJ1ZmZlcjsgYmVmb3JlCisgKiAgICAgc2VuZGluZywgdGhpcyBpcyBjb252ZXJ0ZWQgdG8gYmUgYSByZWFsIHByZWFtYmxlLiBUaGlzCisgKiAgICAgaW5kaWNhdGVzIHRoZSByZWFsIHNpemUgb2YgdGhlIFRYIG1lc3NhZ2UgdGhhdCBzdGFydHMgYXQgdGhpcworICogICAgIHBvaW50LiBJZiB0aGUgaGlnaGVzdCBiaXQgaXMgc2V0LCB0aGVuIHRoaXMgbWVzc2FnZSBpcyB0byBiZQorICogICAgIHNraXBwZWQuCisgKiBAc2VxdWVuY2U6IHNlcXVlbmNlIG51bWJlciBvZiB0aGlzIG1lc3NhZ2UKKyAqIEBvZmZzZXQ6IG9mZnNldCB3aGVyZSB0aGUgbWVzc2FnZSBpdHNlbGYgc3RhcnRzIC0tIHNlZSB0aGUgY29tbWVudHMKKyAqICAgICBpbiB0aGUgZmlsZSBoZWFkZXIgYWJvdXQgbWVzc2FnZSBoZWFkZXIgYW5kIHBheWxvYWQgZGVzY3JpcHRvcgorICogICAgIGFsaWdubWVudC4KKyAqIEBudW1fcGxzOiBudW1iZXIgb2YgcGF5bG9hZHMgaW4gdGhpcyBtZXNzYWdlCisgKiBAcGFkZGluZzogYW1vdW50IG9mIHBhZGRpbmcgYnl0ZXMgYXQgdGhlIGVuZCBvZiB0aGUgbWVzc2FnZSB0byBtYWtlCisgKiAgICAgICAgICAgaXQgYmUgb2YgYmxvY2stc2l6ZSBhbGlnbmVkCisgKgorICogTG9vayBpbiByeC5jIGFuZCB0eC5jIGZvciBhIGZ1bGwgZGVzY3JpcHRpb24gb2YgdGhlIGZvcm1hdC4KKyAqLworc3RydWN0IGkyNDAwbV9tc2dfaGRyIHsKKwl1bmlvbiB7CisJCV9fbGUzMiBiYXJrZXI7CisJCV9fdTMyIHNpemU7CS8qIHNhbWUgc2l6ZSB0eXBlIGFzIGJhcmtlciEhICovCisJfTsKKwl1bmlvbiB7CisJCV9fbGUzMiBzZXF1ZW5jZTsKKwkJX191MzIgb2Zmc2V0OwkvKiBzYW1lIHNpemUgdHlwZSBhcyBiYXJrZXIhISAqLworCX07CisJX19sZTE2IG51bV9wbHM7CisJX19sZTE2IHJzdjE7CisJX19sZTE2IHBhZGRpbmc7CisJX19sZTE2IHJzdjI7CisJc3RydWN0IGkyNDAwbV9wbGQgcGxkWzBdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKworCisvKgorICogTDMvTDQgY29udHJvbCBwcm90b2NvbAorICovCisKK2VudW0geworCS8qIEludGVyZmFjZSB2ZXJzaW9uICovCisJSTI0MDBNX0wzTDRfVkVSU0lPTiAgICAgICAgICAgICA9IDB4MDEwMCwKK307CisKKy8qIE1lc3NhZ2UgdHlwZXMgKi8KK2VudW0gaTI0MDBtX210IHsKKwlJMjQwME1fTVRfUkVTRVJWRUQgICAgICAgICAgICAgID0gMHgwMDAwLAorCUkyNDAwTV9NVF9JTlZBTElEICAgICAgICAgICAgICAgPSAweGZmZmYsCisJSTI0MDBNX01UX1JFUE9SVF9NQVNLCQk9IDB4ODAwMCwKKworCUkyNDAwTV9NVF9HRVRfU0NBTl9SRVNVTFQgIAk9IDB4NDIwMiwKKwlJMjQwME1fTVRfU0VUX1NDQU5fUEFSQU0gICAJPSAweDQ0MDIsCisJSTI0MDBNX01UX0NNRF9SRl9DT05UUk9MICAgCT0gMHg0NjAyLAorCUkyNDAwTV9NVF9DTURfU0NBTiAgICAgICAgIAk9IDB4NDYwMywKKwlJMjQwME1fTVRfQ01EX0NPTk5FQ1QgICAgICAJPSAweDQ2MDQsCisJSTI0MDBNX01UX0NNRF9ESVNDT05ORUNUICAgCT0gMHg0NjA1LAorCUkyNDAwTV9NVF9DTURfRVhJVF9JRExFICAgCT0gMHg0NjA2LAorCUkyNDAwTV9NVF9HRVRfTE1fVkVSU0lPTiAgIAk9IDB4NTIwMSwKKwlJMjQwME1fTVRfR0VUX0RFVklDRV9JTkZPICAJPSAweDUyMDIsCisJSTI0MDBNX01UX0dFVF9MSU5LX1NUQVRVUyAgCT0gMHg1MjAzLAorCUkyNDAwTV9NVF9HRVRfU1RBVElTVElDUyAgIAk9IDB4NTIwNCwKKwlJMjQwME1fTVRfR0VUX1NUQVRFICAgICAgICAJPSAweDUyMDUsCisJSTI0MDBNX01UX0dFVF9NRURJQV9TVEFUVVMJPSAweDUyMDYsCisJSTI0MDBNX01UX1NFVF9JTklUX0NPTkZJRwk9IDB4NTQwNCwKKwlJMjQwME1fTVRfQ01EX0lOSVQJICAgICAgICA9IDB4NTYwMSwKKwlJMjQwME1fTVRfQ01EX1RFUk1JTkFURQkJPSAweDU2MDIsCisJSTI0MDBNX01UX0NNRF9NT0RFX09GX09QCT0gMHg1NjAzLAorCUkyNDAwTV9NVF9DTURfUkVTRVRfREVWSUNFCT0gMHg1NjA0LAorCUkyNDAwTV9NVF9DTURfTU9OSVRPUl9DT05UUk9MICAgPSAweDU2MDUsCisJSTI0MDBNX01UX0NNRF9FTlRFUl9QT1dFUlNBVkUgICA9IDB4NTYwNiwKKwlJMjQwME1fTVRfR0VUX1RMU19PUEVSQVRJT05fUkVTVUxUID0gMHg2MjAxLAorCUkyNDAwTV9NVF9TRVRfRUFQX1NVQ0NFU1MgICAgICAgPSAweDY0MDIsCisJSTI0MDBNX01UX1NFVF9FQVBfRkFJTCAgICAgICAgICA9IDB4NjQwMywKKwlJMjQwME1fTVRfU0VUX0VBUF9LRVkgICAgICAgICAgCT0gMHg2NDA0LAorCUkyNDAwTV9NVF9DTURfU0VORF9FQVBfUkVTUE9OU0UgPSAweDY2MDIsCisJSTI0MDBNX01UX1JFUE9SVF9TQ0FOX1JFU1VMVCAgICA9IDB4YzAwMiwKKwlJMjQwME1fTVRfUkVQT1JUX1NUQVRFCQk9IDB4ZDAwMiwKKwlJMjQwME1fTVRfUkVQT1JUX1BPV0VSU0FWRV9SRUFEWSA9IDB4ZDAwNSwKKwlJMjQwME1fTVRfUkVQT1JUX0VBUF9SRVFVRVNUICAgID0gMHhlMDAyLAorCUkyNDAwTV9NVF9SRVBPUlRfRUFQX1JFU1RBUlQgICAgPSAweGUwMDMsCisJSTI0MDBNX01UX1JFUE9SVF9BTFRfQUNDRVBUICAgIAk9IDB4ZTAwNCwKKwlJMjQwME1fTVRfUkVQT1JUX0tFWV9SRVFVRVNUIAk9IDB4ZTAwNSwKK307CisKKworLyoKKyAqIE1lc3NhZ2UgQWNrIFN0YXR1cyBjb2RlcworICoKKyAqIFdoZW4gYSBtZXNzYWdlIGlzIHJlcGxpZWQtdG8sIHRoaXMgc3RhdHVzIGlzIHJlcG9ydGVkLgorICovCitlbnVtIGkyNDAwbV9tcyB7CisJSTI0MDBNX01TX0RPTkVfT0sgICAgICAgICAgICAgICAgICA9IDAsCisJSTI0MDBNX01TX0RPTkVfSU5fUFJPR1JFU1MgICAgICAgICA9IDEsCisJSTI0MDBNX01TX0lOVkFMSURfT1AgICAgICAgICAgICAgICA9IDIsCisJSTI0MDBNX01TX0JBRF9TVEFURSAgICAgICAgICAgICAgICA9IDMsCisJSTI0MDBNX01TX0lMTEVHQUxfVkFMVUUgICAgICAgICAgICA9IDQsCisJSTI0MDBNX01TX01JU1NJTkdfUEFSQU1TICAgICAgICAgICA9IDUsCisJSTI0MDBNX01TX1ZFUlNJT05fRVJST1IgICAgICAgICAgICA9IDYsCisJSTI0MDBNX01TX0FDQ0VTU0lCSUxJVFlfRVJST1IgICAgICA9IDcsCisJSTI0MDBNX01TX0JVU1kgICAgICAgICAgICAgICAgICAgICA9IDgsCisJSTI0MDBNX01TX0NPUlJVUFRFRF9UTFYgICAgICAgICAgICA9IDksCisJSTI0MDBNX01TX1VOSU5JVElBTElaRUQgICAgICAgICAgICA9IDEwLAorCUkyNDAwTV9NU19VTktOT1dOX0VSUk9SICAgICAgICAgICAgPSAxMSwKKwlJMjQwME1fTVNfUFJPRFVDVElPTl9FUlJPUiAgICAgICAgID0gMTIsCisJSTI0MDBNX01TX05PX1JGICAgICAgICAgICAgICAgICAgICA9IDEzLAorCUkyNDAwTV9NU19OT1RfUkVBRFlfRk9SX1BPV0VSU0FWRSAgPSAxNCwKKwlJMjQwME1fTVNfVEhFUk1BTF9DUklUSUNBTCAgICAgICAgID0gMTUsCisJSTI0MDBNX01TX01BWAorfTsKKworCisvKioKKyAqIGkyNDAwbV90bHYgLSBlbnVtZXJhdGlvbiBvZiB0aGUgZGlmZmVyZW50IHR5cGVzIG9mIFRMVnMKKyAqCisgKiBUTFZzIHN0YW5kIGZvciB0eXBlLWxlbmd0aC12YWx1ZSBhbmQgYXJlIHRoZSBoZWFkZXIgZm9yIGEgcGF5bG9hZAorICogY29tcG9zZWQgb2YgYWxtb3N0IGFueXRoaW5nLiBFYWNoIHBheWxvYWQgaGFzIGEgdHlwZSBhc3NpZ25lZAorICogYW5kIGEgbGVuZ3RoLgorICovCitlbnVtIGkyNDAwbV90bHYgeworCUkyNDAwTV9UTFZfTDRfTUVTU0FHRV9WRVJTSU9OUyA9IDEyOSwKKwlJMjQwME1fVExWX1NZU1RFTV9TVEFURSA9IDE0MSwKKwlJMjQwME1fVExWX01FRElBX1NUQVRVUyA9IDE2MSwKKwlJMjQwME1fVExWX1JGX09QRVJBVElPTiA9IDE2MiwKKwlJMjQwME1fVExWX1JGX1NUQVRVUyA9IDE2MywKKwlJMjQwME1fVExWX0RFVklDRV9SRVNFVF9UWVBFID0gMTMyLAorCUkyNDAwTV9UTFZfQ09ORklHX0lETEVfUEFSQU1FVEVSUyA9IDYwMSwKK307CisKKworc3RydWN0IGkyNDAwbV90bHZfaGRyIHsKKwlfX2xlMTYgdHlwZTsKKwlfX2xlMTYgbGVuZ3RoOwkJLyogcGF5bG9hZCdzICovCisJX191OCAgIHBsWzBdOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworCitzdHJ1Y3QgaTI0MDBtX2wzbDRfaGRyIHsKKwlfX2xlMTYgdHlwZTsKKwlfX2xlMTYgbGVuZ3RoOwkJLyogcGF5bG9hZCdzICovCisJX19sZTE2IHZlcnNpb247CisJX19sZTE2IHJlc3YxOworCV9fbGUxNiBzdGF0dXM7CisJX19sZTE2IHJlc3YyOworCXN0cnVjdCBpMjQwMG1fdGx2X2hkciBwbFswXTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKworLyoqCisgKiBpMjQwMG1fc3lzdGVtX3N0YXRlIC0gZGlmZmVyZW50IHN0YXRlcyBvZiB0aGUgZGV2aWNlCisgKi8KK2VudW0gaTI0MDBtX3N5c3RlbV9zdGF0ZSB7CisJSTI0MDBNX1NTX1VOSU5JVElBTElaRUQgPSAxLAorCUkyNDAwTV9TU19JTklULAorCUkyNDAwTV9TU19SRUFEWSwKKwlJMjQwME1fU1NfU0NBTiwKKwlJMjQwME1fU1NfU1RBTkRCWSwKKwlJMjQwME1fU1NfQ09OTkVDVElORywKKwlJMjQwME1fU1NfV0lNQVhfQ09OTkVDVEVELAorCUkyNDAwTV9TU19EQVRBX1BBVEhfQ09OTkVDVEVELAorCUkyNDAwTV9TU19JRExFLAorCUkyNDAwTV9TU19ESVNDT05ORUNUSU5HLAorCUkyNDAwTV9TU19PVVRfT0ZfWk9ORSwKKwlJMjQwME1fU1NfU0xFRVBBQ1RJVkUsCisJSTI0MDBNX1NTX1BST0RVQ1RJT04sCisJSTI0MDBNX1NTX0NPTkZJRywKKwlJMjQwME1fU1NfUkZfT0ZGLAorCUkyNDAwTV9TU19SRl9TSFVURE9XTiwKKwlJMjQwME1fU1NfREVWSUNFX0RJU0NPTk5FQ1QsCisJSTI0MDBNX1NTX01BWCwKK307CisKKworLyoqCisgKiBpMjQwMG1fdGx2X3N5c3RlbV9zdGF0ZSAtIHJlcG9ydCBvbiB0aGUgc3RhdGUgb2YgdGhlIHN5c3RlbQorICoKKyAqIEBzdGF0ZTogc2VlIGVudW0gaTI0MDBtX3N5c3RlbV9zdGF0ZQorICovCitzdHJ1Y3QgaTI0MDBtX3Rsdl9zeXN0ZW1fc3RhdGUgeworCXN0cnVjdCBpMjQwMG1fdGx2X2hkciBoZHI7CisJX19sZTMyIHN0YXRlOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworCitzdHJ1Y3QgaTI0MDBtX3Rsdl9sNF9tZXNzYWdlX3ZlcnNpb25zIHsKKwlzdHJ1Y3QgaTI0MDBtX3Rsdl9oZHIgaGRyOworCV9fbGUxNiBtYWpvcjsKKwlfX2xlMTYgbWlub3I7CisJX19sZTE2IGJyYW5jaDsKKwlfX2xlMTYgcmVzZXJ2ZWQ7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisKK3N0cnVjdCBpMjQwMG1fdGx2X2RldGFpbGVkX2RldmljZV9pbmZvIHsKKwlzdHJ1Y3QgaTI0MDBtX3Rsdl9oZHIgaGRyOworCV9fdTggcmVzZXJ2ZWQxWzQwMF07CisJX191OCBtYWNfYWRkcmVzc1s2XTsKKwlfX3U4IHJlc2VydmVkMlsyXTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKworZW51bSBpMjQwMG1fcmZfc3dpdGNoX3N0YXR1cyB7CisJSTI0MDBNX1JGX1NXSVRDSF9PTiA9IDEsCisJSTI0MDBNX1JGX1NXSVRDSF9PRkYgPSAyLAorfTsKKworc3RydWN0IGkyNDAwbV90bHZfcmZfc3dpdGNoZXNfc3RhdHVzIHsKKwlzdHJ1Y3QgaTI0MDBtX3Rsdl9oZHIgaGRyOworCV9fdTggc3dfcmZfc3dpdGNoOwkvKiAxIE9OLCAyIE9GRiAqLworCV9fdTggaHdfcmZfc3dpdGNoOwkvKiAxIE9OLCAyIE9GRiAqLworCV9fdTggcmVzZXJ2ZWRbMl07Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisKK2VudW0geworCWkyNDAwbV9yZl9vcGVyYXRpb25fb24gPSAxLAorCWkyNDAwbV9yZl9vcGVyYXRpb25fb2ZmID0gMgorfTsKKworc3RydWN0IGkyNDAwbV90bHZfcmZfb3BlcmF0aW9uIHsKKwlzdHJ1Y3QgaTI0MDBtX3Rsdl9oZHIgaGRyOworCV9fbGUzMiBzdGF0dXM7CS8qIDEgT04sIDIgT0ZGICovCit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisKK2VudW0gaTI0MDBtX3Rsdl9yZXNldF90eXBlIHsKKwlJMjQwME1fUkVTRVRfVFlQRV9DT0xEID0gMSwKKwlJMjQwME1fUkVTRVRfVFlQRV9XQVJNCit9OworCitzdHJ1Y3QgaTI0MDBtX3Rsdl9kZXZpY2VfcmVzZXRfdHlwZSB7CisJc3RydWN0IGkyNDAwbV90bHZfaGRyIGhkcjsKKwlfX2xlMzIgcmVzZXRfdHlwZTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKworc3RydWN0IGkyNDAwbV90bHZfY29uZmlnX2lkbGVfcGFyYW1ldGVycyB7CisJc3RydWN0IGkyNDAwbV90bHZfaGRyIGhkcjsKKwlfX2xlMzIgaWRsZV90aW1lb3V0OwkvKiAxMDAgdG8gMzAwMDAwIG1zIFs1bWluXSwgMTAwIGluY3JlbWVudHMKKwkJCQkgKiAwIGRpc2FibGVkICovCisJX19sZTMyIGlkbGVfcGFnaW5nX2ludGVydmFsOwkvKiBmcmFtZXMgKi8KK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKworZW51bSBpMjQwMG1fbWVkaWFfc3RhdHVzIHsKKwlJMjQwME1fTUVESUFfU1RBVFVTX0xJTktfVVAgPSAxLAorCUkyNDAwTV9NRURJQV9TVEFUVVNfTElOS19ET1dOLAorCUkyNDAwTV9NRURJQV9TVEFUVVNfTElOS19SRU5FVywKK307CisKK3N0cnVjdCBpMjQwMG1fdGx2X21lZGlhX3N0YXR1cyB7CisJc3RydWN0IGkyNDAwbV90bHZfaGRyIGhkcjsKKwlfX2xlMzIgbWVkaWFfc3RhdHVzOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworI2VuZGlmIC8qICNpZm5kZWYgX19MSU5VWF9fV0lNQVhfX0kyNDAwTV9IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbXRkL3ViaS11c2VyLmggYi9pbmNsdWRlL210ZC91YmktdXNlci5oCmluZGV4IGNjZGM1NjIuLjJkYzJlYjIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbXRkL3ViaS11c2VyLmgKKysrIGIvaW5jbHVkZS9tdGQvdWJpLXVzZXIuaApAQCAtMjUzLDcgKzI1Myw3IEBACiAgKgogICogUmUtc2l6aW5nIGlzIHBvc3NpYmxlIGZvciBib3RoIGR5bmFtaWMgYW5kIHN0YXRpYyB2b2x1bWVzLiBCdXQgd2hpbGUgZHluYW1pYwogICogdm9sdW1lcyBtYXkgYmUgcmUtc2l6ZWQgYXJiaXRyYXJpbHksIHN0YXRpYyB2b2x1bWVzIGNhbm5vdCBiZSBtYWRlIHRvIGJlCi0gKiBzbWFsbGVyIHRoZW4gdGhlIG51bWJlciBvZiBieXRlcyB0aGV5IGJlYXIuIFRvIGFyYml0cmFyaWx5IHNocmluayBhIHN0YXRpYworICogc21hbGxlciB0aGFuIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhleSBiZWFyLiBUbyBhcmJpdHJhcmlseSBzaHJpbmsgYSBzdGF0aWMKICAqIHZvbHVtZSwgaXQgbXVzdCBiZSB3aXBlZCBvdXQgZmlyc3QgKGJ5IG1lYW5zIG9mIHZvbHVtZSB1cGRhdGUgb3BlcmF0aW9uIHdpdGgKICAqIHplcm8gbnVtYmVyIG9mIGJ5dGVzKS4KICAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvbmV0ZG1hLmggYi9pbmNsdWRlL25ldC9uZXRkbWEuaAppbmRleCBmMjhjNmUwLi44YmE4Y2UyIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9uZXRkbWEuaAorKysgYi9pbmNsdWRlL25ldC9uZXRkbWEuaApAQCAtMjQsMTcgKzI0LDYgQEAKICNpbmNsdWRlIDxsaW51eC9kbWFlbmdpbmUuaD4KICNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KIAotc3RhdGljIGlubGluZSBzdHJ1Y3QgZG1hX2NoYW4gKmdldF9zb2Z0bmV0X2RtYSh2b2lkKQotewotCXN0cnVjdCBkbWFfY2hhbiAqY2hhbjsKLQlyY3VfcmVhZF9sb2NrKCk7Ci0JY2hhbiA9IHJjdV9kZXJlZmVyZW5jZShfX2dldF9jcHVfdmFyKHNvZnRuZXRfZGF0YSkubmV0X2RtYSk7Ci0JaWYgKGNoYW4pCi0JCWRtYV9jaGFuX2dldChjaGFuKTsKLQlyY3VfcmVhZF91bmxvY2soKTsKLQlyZXR1cm4gY2hhbjsKLX0KLQogaW50IGRtYV9za2JfY29weV9kYXRhZ3JhbV9pb3ZlYyhzdHJ1Y3QgZG1hX2NoYW4qIGNoYW4sCiAJCXN0cnVjdCBza19idWZmICpza2IsIGludCBvZmZzZXQsIHN0cnVjdCBpb3ZlYyAqdG8sCiAJCXNpemVfdCBsZW4sIHN0cnVjdCBkbWFfcGlubmVkX2xpc3QgKnBpbm5lZF9saXN0KTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L3Byb3RvY29sLmggYi9pbmNsdWRlL25ldC9wcm90b2NvbC5oCmluZGV4IGNiMjk2NWEuLmZmYTViOGIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L3Byb3RvY29sLmgKKysrIGIvaW5jbHVkZS9uZXQvcHJvdG9jb2wuaApAQCAtNTksNiArNTksOSBAQAogCWludAkoKmdzb19zZW5kX2NoZWNrKShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKIAlzdHJ1Y3Qgc2tfYnVmZiAqKCpnc29fc2VnbWVudCkoc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJCQkgICAgICAgaW50IGZlYXR1cmVzKTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqKigqZ3JvX3JlY2VpdmUpKHN0cnVjdCBza19idWZmICoqaGVhZCwKKwkJCQkJc3RydWN0IHNrX2J1ZmYgKnNrYik7CisJaW50CSgqZ3JvX2NvbXBsZXRlKShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKIAogCXVuc2lnbmVkIGludAlmbGFnczsJLyogSU5FVDZfUFJPVE9feHh4ICovCiB9OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvd2ltYXguaCBiL2luY2x1ZGUvbmV0L3dpbWF4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmIzODI0ZQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbmV0L3dpbWF4LmgKQEAgLTAsMCArMSw1MjMgQEAKKy8qCisgKiBMaW51eCBXaU1BWAorICogS2VybmVsIHNwYWNlIEFQSSBmb3IgYWNjZXNzaW5nIFdpTUFYIGRldmljZXMKKyAqCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggSW50ZWwgQ29ycG9yYXRpb24gPGxpbnV4LXdpbWF4QGludGVsLmNvbT4KKyAqIEluYWt5IFBlcmV6LUdvbnphbGV6IDxpbmFreS5wZXJlei1nb256YWxlekBpbnRlbC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSwgVVNBLgorICoKKyAqCisgKiBUaGUgV2lNQVggc3RhY2sgcHJvdmlkZXMgYW4gQVBJIGZvciBjb250cm9sbGluZyBhbmQgbWFuYWdpbmcgdGhlCisgKiBzeXN0ZW0ncyBXaU1BWCBkZXZpY2VzLiBUaGlzIEFQSSBhZmZlY3RzIHRoZSBjb250cm9sIHBsYW5lOyB0aGUKKyAqIGRhdGEgcGxhbmUgaXMgYWNjZXNzZWQgdmlhIHRoZSBuZXR3b3JrIHN0YWNrIChuZXRkZXYpLgorICoKKyAqIFBhcnRzIG9mIHRoZSBXaU1BWCBzdGFjayBBUEkgYW5kIG5vdGlmaWNhdGlvbnMgYXJlIGV4cG9ydGVkIHRvCisgKiB1c2VyIHNwYWNlIHZpYSBHZW5lcmljIE5ldGxpbmsuIEluIHVzZXIgc3BhY2UsIGxpYndpbWF4IChwYXJ0IG9mCisgKiB0aGUgd2ltYXgtdG9vbHMgcGFja2FnZSkgcHJvdmlkZXMgYSBzaGltIGxheWVyIGZvciBhY2Nlc3NpbmcgdGhvc2UKKyAqIGNhbGxzLgorICoKKyAqIFRoZSBBUEkgaXMgc3RhbmRhcml6ZWQgZm9yIGFsbCBXaU1BWCBkZXZpY2VzIGFuZCBkaWZmZXJlbnQgZHJpdmVycworICogaW1wbGVtZW50IHRoZSBiYWNrZW5kIHN1cHBvcnQgZm9yIGl0LiBIb3dldmVyLCBkZXZpY2Utc3BlY2lmaWMKKyAqIG1lc3NhZ2luZyBwaXBlcyBhcmUgcHJvdmlkZWQgdGhhdCBjYW4gYmUgdXNlZCB0byBpc3N1ZSBjb21tYW5kcyBhbmQKKyAqIHJlY2VpdmUgbm90aWZpY2F0aW9ucyBpbiBmcmVlIGZvcm0uCisgKgorICogQ3VycmVudGx5IHRoZSBtZXNzYWdpbmcgcGlwZXMgYXJlIHRoZSBvbmx5IG1lYW5zIG9mIGNvbnRyb2wgYXMgaXQKKyAqIGlzIG5vdCBrbm93biAoZHVlIHRvIHRoZSBsYWNrIG9mIG1vcmUgZGV2aWNlcyBpbiB0aGUgbWFya2V0KSB3aGF0CisgKiB3aWxsIGJlIGEgZ29vZCBhYnN0cmFjdGlvbiBsYXllci4gRXhwZWN0IHRoaXMgdG8gY2hhbmdlIGFzIG1vcmUKKyAqIGRldmljZXMgc2hvdyBpbiB0aGUgbWFya2V0LiBUaGlzIEFQSSBpcyBkZXNpZ25lZCB0byBiZSBncm93YWJsZSBpbgorICogb3JkZXIgdG8gYWRkcmVzcyB0aGlzIHByb2JsZW0uCisgKgorICogVVNBR0UKKyAqCisgKiBFbWJlZCBhIGBzdHJ1Y3Qgd2ltYXhfZGV2YCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSB0aGUgZGV2aWNlJ3MKKyAqIHByaXZhdGUgc3RydWN0dXJlLCBpbml0aWFsaXplIGFuZCByZWdpc3RlciBpdC4gRm9yIGRldGFpbHMsIHNlZQorICogYHN0cnVjdCB3aW1heF9kZXZgcyBkb2N1bWVudGF0aW9uLgorICoKKyAqIE9uY2UgdGhpcyBpcyBkb25lLCB3aW1heC10b29scydzIGxpYndpbWF4bGwgY2FuIGJlIHVzZWQgdG8KKyAqIGNvbW11bmljYXRlIHdpdGggdGhlIGRyaXZlciBmcm9tIHVzZXIgc3BhY2UuIFlvdSB1c2VyIHNwYWNlCisgKiBhcHBsaWNhdGlvbiBkb2VzIG5vdCBoYXZlIHRvIGZvcmNpYmlseSB1c2UgbGlid2ltYXhsbCBhbmQgY2FuIHRhbGsKKyAqIHRoZSBnZW5lcmljIG5ldGxpbmsgcHJvdG9jb2wgZGlyZWN0bHkgaWYgZGVzaXJlZC4KKyAqCisgKiBSZW1lbWJlciB0aGlzIGlzIGEgdmVyeSBsb3cgbGV2ZWwgQVBJIHRoYXQgd2lsbCB0byBwcm92aWRlIGFsbCBvZgorICogV2lNQVggZmVhdHVyZXMuIE90aGVyIGRhZW1vbnMgYW5kIHNlcnZpY2VzIHJ1bm5pbmcgaW4gdXNlciBzcGFjZQorICogYXJlIHRoZSBleHBlY3RlZCBjbGllbnRzIG9mIGl0LiBUaGV5IG9mZmVyIGEgaGlnaGVyIGxldmVsIEFQSSB0aGF0CisgKiBhcHBsaWNhdGlvbnMgc2hvdWxkIHVzZSAoYW4gZXhhbXBsZSBvZiB0aGlzIGlzIHRoZSBJbnRlbCdzIFdpTUFYCisgKiBOZXR3b3JrIFNlcnZpY2UgZm9yIHRoZSBpMjQwMG0pLgorICoKKyAqIERFU0lHTgorICoKKyAqIEFsdGhvdWdoIG5vdCBzZXQgb24gZmluYWwgc3RvbmUsIHRoaXMgdmVyeSBiYXNpYyBpbnRlcmZhY2UgaXMKKyAqIG1vc3RseSBjb21wbGV0ZWQuIFJlbWVtYmVyIHRoaXMgaXMgbWVhbnQgdG8gZ3JvdyBhcyBuZXcgY29tbW9uCisgKiBvcGVyYXRpb25zIGFyZSBkZWNpZGVkIHVwb24uIE5ldyBvcGVyYXRpb25zIHdpbGwgYmUgYWRkZWQgdG8gdGhlCisgKiBpbnRlcmZhY2UsIGludGVudCBiZWluZyBvbiBrZWVwaW5nIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGFzIG11Y2gKKyAqIGFzIHBvc3NpYmxlLgorICoKKyAqIFRoaXMgbGF5ZXIgaW1wbGVtZW50cyBhIHNldCBvZiBjYWxscyB0byBjb250cm9sIGEgV2lNQVggZGV2aWNlLAorICogZXhwb3NpbmcgYSBmcm9udGVuZCB0byB0aGUgcmVzdCBvZiB0aGUga2VybmVsIGFuZCB1c2VyIHNwYWNlICh2aWEKKyAqIGdlbmVyaWMgbmV0bGluaykgYW5kIGEgYmFja2VuZCBpbXBsZW1lbnRhdGlvbiBpbiB0aGUgZHJpdmVyIHRocm91Z2gKKyAqIGZ1bmN0aW9uIHBvaW50ZXJzLgorICoKKyAqIFdpTUFYIGRldmljZXMgaGF2ZSBhIHN0YXRlLCBhbmQgYSBrZXJuZWwtb25seSBBUEkgYWxsb3dzIHRoZQorICogZHJpdmVycyB0byBtYW5pcHVsYXRlIHRoYXQgc3RhdGUuIFN0YXRlIHRyYW5zaXRpb25zIGFyZSBhdG9taWMsIGFuZAorICogb25seSBzb21lIG9mIHRoZW0gYXJlIGFsbG93ZWQgKHNlZSBgZW51bSB3aW1heF9zdGApLgorICoKKyAqIE1vc3QgQVBJIGNhbGxzIHdpbGwgc2V0IHRoZSBzdGF0ZSBhdXRvbWF0aWNhbGx5OyBpbiBtb3N0IGNhc2VzCisgKiBkcml2ZXJzIGhhdmUgdG8gb25seSByZXBvcnQgc3RhdGUgY2hhbmdlcyBkdWUgdG8gZXh0ZXJuYWwKKyAqIGNvbmRpdGlvbnMuCisgKgorICogQWxsIEFQSSBvcGVyYXRpb25zIGFyZSAnYXRvbWljJywgc2VyaWFsaXplZCB0aG9yb3VnaCBhIG11dGV4IGluIHRoZQorICogYHN0cnVjdCB3aW1heF9kZXZgLgorICoKKyAqIEVYUE9SVElORyBUTyBVU0VSIFNQQUNFIFRIUk9VR0ggR0VORVJJQyBORVRMSU5LCisgKgorICogVGhlIEFQSSBpcyBleHBvcnRlZCB0byB1c2VyIHNwYWNlIHVzaW5nIGdlbmVyaWMgbmV0bGluayAob3RoZXIKKyAqIG1ldGhvZHMgY2FuIGJlIGFkZGVkIGFzIG5lZWRlZCkuCisgKgorICogVGhlcmUgaXMgYSBHZW5lcmljIE5ldGxpbmsgRmFtaWx5IG5hbWVkICJXaU1BWCIsIHdoZXJlIGludGVyZmFjZXMKKyAqIHN1cHBvcnRpbmcgdGhlIFdpTUFYIGludGVyZmFjZSByZWNlaXZlIGNvbW1hbmRzIGFuZCBicm9hZGNhc3QgdGhlaXIKKyAqIHNpZ25hbHMgb3ZlciBhIG11bHRpY2FzdCBncm91cCBuYW1lZCAibXNnIi4KKyAqCisgKiBNYXBwaW5nIHRvIHRoZSBzb3VyY2UvZGVzdGluYXRpb24gaW50ZXJmYWNlIGlzIGRvbmUgYnkgYW4gaW50ZXJmYWNlCisgKiBpbmRleCBhdHRyaWJ1dGUuCisgKgorICogRm9yIHVzZXItdG8ta2VybmVsIHRyYWZmaWMgKGNvbW1hbmRzKSB3ZSB1c2UgYSBmdW5jdGlvbiBjYWxsCisgKiBtYXJzaGFsbGluZyBtZWNoYW5pc20sIHdoZXJlIGEgbWVzc2FnZSBYIHdpdGggYXR0cmlidXRlcyBBLCBCLCBDCisgKiBzZW50IGZyb20gdXNlciBzcGFjZSB0byBrZXJuZWwgc3BhY2UgbWVhbnMgZXhlY3V0aW5nIHRoZSBXaU1BWCBBUEkKKyAqIGNhbGwgd2ltYXhfWChBLCBCLCBDKSwgc2VuZGluZyB0aGUgcmVzdWx0cyBiYWNrIGFzIGEgbWVzc2FnZS4KKyAqCisgKiBLZXJuZWwtdG8tdXNlciAobm90aWZpY2F0aW9ucyBvciBzaWduYWxzKSBjb21tdW5pY2F0aW9uIGlzIHNlbnQKKyAqIG92ZXIgbXVsdGljYXN0IGdyb3Vwcy4gVGhpcyBhbGxvd3MgdG8gaGF2ZSBtdWx0aXBsZSBhcHBsaWNhdGlvbnMKKyAqIG1vbml0b3JpbmcgdGhlbS4KKyAqCisgKiBFYWNoIGNvbW1hbmQvc2lnbmFsIGdldHMgYXNzaWduZWQgaXQncyBvd24gYXR0cmlidXRlIHBvbGljeS4gVGhpcworICogd2F5IHRoZSB2YWxpZGF0b3Igd2lsbCB2ZXJpZnkgdGhhdCBhbGwgdGhlIGF0dHJpYnV0ZXMgaW4gdGhlcmUgYXJlCisgKiBvbmx5IHRoZSBvbmVzIHRoYXQgc2hvdWxkIGJlIGZvciBlYWNoIGNvbW1hbmQvc2lnbmFsLiBUaGluZyBvZiBhbgorICogYXR0cmlidXRlIG1hcHBpbmcgdG8gYSB0eXBlK2FyZ3VtZW50bmFtZSBmb3IgZWFjaCBjb21tYW5kL3NpZ25hbC4KKyAqCisgKiBJZiB3ZSBoYWQgYSBzaW5nbGUgcG9saWN5IGZvciAqYWxsKiBjb21tYW5kcy9zaWduYWxzLCBhZnRlciBydW5uaW5nCisgKiB0aGUgdmFsaWRhdG9yIHdlJ2QgaGF2ZSB0byBjaGVjayAiZG9lcyB0aGlzIGF0dHJpYnV0ZSBiZWxvbmcgaW4KKyAqIGhlcmUiPyAgZm9yIGVhY2ggb25lLiBJdCBjYW4gYmUgZG9uZSBtYW51YWxseSwgYnV0IGl0J3MganVzdCBlYXNpZXIKKyAqIHRvIGhhdmUgdGhlIHZhbGlkYXRvciBkbyB0aGF0IGpvYiB3aXRoIG11bHRpcGxlIHBvbGljaWVzLiBBcyB3ZWxsLAorICogaXQgbWFrZXMgaXQgZWFzaWVyIHRvIGxhdGVyIGV4cGFuZCBlYWNoIGNvbW1hbmQvc2lnbmFsIHNpZ25hdHVyZQorICogd2l0aG91dCBhZmZlY3Rpbmcgb3RoZXJzIGFuZCBrZWVwaW5nIHRoZSBuYW1lc3BhY2UgbW9yZSBvciBsZXNzCisgKiBzYW5lLiBOb3QgdGhhdCBpdCBpcyB0b28gY29tcGxpY2F0ZWQsIGJ1dCBpdCBtYWtlcyBpdCBldmVuIGVhc2llci4KKyAqCisgKiBObyBzdGF0ZSBpbmZvcm1hdGlvbiBpcyBtYWludGFpbmVkIGluIHRoZSBrZXJuZWwgZm9yIGVhY2ggdXNlcgorICogc3BhY2UgY29ubmVjdGlvbiAodGhlIGNvbm5lY3Rpb24gaXMgc3RhdGVsZXNzKS4KKyAqCisgKiBURVNUSU5HIEZPUiBUSEUgSU5URVJGQUNFIEFORCBWRVJTSU9OSU5HCisgKgorICogSWYgbmV0d29yayBpbnRlcmZhY2UgWCBpcyBhIFdpTUFYIGRldmljZSwgdGhlcmUgd2lsbCBiZSBhIEdlbmVyaWMKKyAqIE5ldGxpbmsgZmFtaWx5IG5hbWVkICJXaU1BWCBYIiBhbmQgdGhlIGRldmljZSB3aWxsIHByZXNlbnQgYQorICogIndpbWF4IiBkaXJlY3RvcnkgaW4gaXQncyBuZXR3b3JrIHN5c2ZzIGRpcmVjdG9yeQorICogKC9zeXMvY2xhc3MvbmV0L0RFVklDRS93aW1heCkgW3VzZWQgYnkgSEFMXS4KKyAqCisgKiBUaGUgaW5leGlzdGVuY2Ugb2YgYW55IG9mIHRoZXNlIG1lYW5zIHRoZSBkZXZpY2UgZG9lcyBub3Qgc3VwcG9ydAorICogdGhpcyBXaU1BWCBBUEkuCisgKgorICogQnkgcXVlcnlpbmcgdGhlIGdlbmVyaWMgbmV0bGluayBjb250cm9sbGVyLCB2ZXJzaW9uaW5nIGluZm9ybWF0aW9uCisgKiBhbmQgdGhlIG11bHRpY2FzdCBncm91cHMgYXZhaWxhYmxlIGNhbiBiZSBmb3VuZC4gQXBwbGljYXRpb25zIHVzaW5nCisgKiB0aGUgaW50ZXJmYWNlIGNhbiBlaXRoZXIgcmVseSBvbiB0aGF0IG9yIHVzZSB0aGUgZ2VuZXJpYyBuZXRsaW5rCisgKiBjb250cm9sbGVyIHRvIGZpZ3VyZSBvdXQgd2hpY2ggZ2VuZXJpYyBuZXRsaW5rIGNvbW1hbmRzL3NpZ25hbHMgYXJlCisgKiBzdXBwb3J0ZWQuCisgKgorICogTk9URTogdGhpcyB2ZXJzaW9uaW5nIGlzIGEgbGFzdCByZXNvcnQgdG8gYXZvaWQgaGFyZAorICogICAgaW5jb21wYXRpYmlsaXRpZXMuIEl0IGlzIHRoZSBpbnRlbnRpb24gb2YgdGhlIGRlc2lnbiBvZiB0aGlzCisgKiAgICBzdGFjayBub3QgdG8gaW50cm9kdWNlIGJhY2t3YXJkIGluY29tcGF0aWJsZSBjaGFuZ2VzLgorICoKKyAqIFRoZSB2ZXJzaW9uIGNvZGUgaGFzIHRvIGZpdCBpbiBvbmUgYnl0ZSAocmVzdHJpY3Rpb25zIGltcG9zZWQgYnkKKyAqIGdlbmVyaWMgbmV0bGluayk7IHdlIHVzZSBgdmVyc2lvbiAvIDEwYCBmb3IgdGhlIG1ham9yIHZlcnNpb24gYW5kCisgKiBgdmVyc2lvbiAlIDEwYCBmb3IgdGhlIG1pbm9yLiBUaGlzIGdpdmVzIDkgbWlub3JzIGZvciBlYWNoIG1ham9yCisgKiBhbmQgMjUgbWFqb3JzLgorICoKKyAqIFRoZSB2ZXJzaW9uIGNoYW5nZSBwcm90b2NvbCBpcyBhcyBmb2xsb3c6CisgKgorICogLSBNYWpvciB2ZXJzaW9uczogbmVlZHMgdG8gYmUgaW5jcmVhc2VkIGlmIGFuIGV4aXN0aW5nIG1lc3NhZ2UvQVBJCisgKiAgIGNhbGwgaXMgY2hhbmdlZCBvciByZW1vdmVkLiBEb2Vzbid0IG5lZWQgdG8gYmUgY2hhbmdlZCBpZiBhIG5ldworICogICBtZXNzYWdlIGlzIGFkZGVkLgorICoKKyAqIC0gTWlub3IgdmVyc2lvbjogbmVlZHMgdG8gYmUgaW5jcmVhc2VkIGlmIG5ldyBtZXNzYWdlcy9BUEkgY2FsbHMgYXJlCisgKiAgIGJlaW5nIGFkZGVkIG9yIHNvbWUgb3RoZXIgY29uc2lkZXJhdGlvbiB0aGF0IGRvZXNuJ3QgaW1wYWN0IHRoZQorICogICB1c2VyLWtlcm5lbCBpbnRlcmZhY2UgdG9vIG11Y2ggKGxpa2Ugc29tZSBraW5kIG9mIGJ1ZyBmaXgpIGFuZAorICogICB0aGF0IGlzIGtpbmQgb2YgbGVmdCB1cCBpbiB0aGUgYWlyIHRvIGNvbW1vbiBzZW5zZS4KKyAqCisgKiBVc2VyIHNwYWNlIGNvZGUgc2hvdWxkIG5vdCB0cnkgdG8gd29yayBpZiB0aGUgbWFqb3IgdmVyc2lvbiBpdCB3YXMKKyAqIGNvbXBpbGVkIGZvciBkaWZmZXJzIGZyb20gd2hhdCB0aGUga2VybmVsIG9mZmVycy4gQXMgd2VsbCwgaWYgdGhlCisgKiBtaW5vciB2ZXJzaW9uIG9mIHRoZSBrZXJuZWwgaW50ZXJmYWNlIGlzIGxvd2VyIHRoYW4gdGhlIG9uZSB1c2VyCisgKiBzcGFjZSBpcyBleHBlY3RpbmcgKHRoZSBvbmUgaXQgd2FzIGNvbXBpbGVkIGZvciksIHRoZSBrZXJuZWwKKyAqIG1pZ2h0IGJlIG1pc3NpbmcgQVBJIGNhbGxzOyB1c2VyIHNwYWNlIHNoYWxsIGJlIHJlYWR5IHRvIGhhbmRsZQorICogc2FpZCBjb25kaXRpb24uIFVzZSB0aGUgZ2VuZXJpYyBuZXRsaW5rIGNvbnRyb2xsZXIgb3BlcmF0aW9ucyB0bworICogZmluZCB3aGljaCBvbmVzIGFyZSBzdXBwb3J0ZWQgYW5kIHdoaWNoIG5vdC4KKyAqCisgKiBsaWJ3aW1heGxsOndpbWF4bGxfb3BlbigpIHRha2VzIGNhcmUgb2YgY2hlY2tpbmcgdmVyc2lvbnMuCisgKgorICogVEhFIE9QRVJBVElPTlM6CisgKgorICogRWFjaCBvcGVyYXRpb24gaXMgZGVmaW5lZCBpbiBpdHMgb24gZmlsZSAoZHJpdmVycy9uZXQvd2ltYXgvb3AtKi5jKQorICogZm9yIGNsYXJpdHkuIFRoZSBwYXJ0cyBuZWVkZWQgZm9yIGFuIG9wZXJhdGlvbiBhcmU6CisgKgorICogIC0gYSBmdW5jdGlvbiBwb2ludGVyIGluIGBzdHJ1Y3Qgd2ltYXhfZGV2YDogb3B0aW9uYWwsIGFzIHRoZQorICogICAgb3BlcmF0aW9uIG1pZ2h0IGJlIGltcGxlbWVudGVkIGJ5IHRoZSBzdGFjayBhbmQgbm90IGJ5IHRoZQorICogICAgZHJpdmVyLgorICoKKyAqICAgIEFsbCBmdW5jdGlvbiBwb2ludGVycyBhcmUgbmFtZWQgd2ltYXhfZGV2LT5vcF8qKCksIGFuZCBkcml2ZXJzCisgKiAgICBtdXN0IGltcGxlbWVudCB0aGVtIGV4Y2VwdCB3aGVyZSBub3RlZCBvdGhlcndpc2UuCisgKgorICogIC0gV2hlbiBleHBvcnRlZCB0byB1c2VyIHNwYWNlLCBhIGBzdHJ1Y3QgbmxhX3BvbGljeWAgdG8gZGVmaW5lIHRoZQorICogICAgYXR0cmlidXRlcyBvZiB0aGUgZ2VuZXJpYyBuZXRsaW5rIGNvbW1hbmQgYW5kIGEgYHN0cnVjdCBnZW5sX29wc2AKKyAqICAgIHRvIGRlZmluZSB0aGUgb3BlcmF0aW9uLgorICoKKyAqIEFsbCB0aGUgZGVjbGFyYXRpb25zIGZvciB0aGUgb3BlcmF0aW9uIGNvZGVzIChXSU1BWF9HTkxfT1BfPE5BTUU+KQorICogYW5kIGdlbmVyaWMgbmV0bGluayBhdHRyaWJ1dGVzIChXSU1BWF9HTkxfPE5BTUU+XyopIGFyZSBkZWNsYXJlZCBpbgorICogaW5jbHVkZS9saW51eC93aW1heC5oOyB0aGlzIGZpbGUgaXMgaW50ZW5kZWQgdG8gYmUgY2xvbmVkIGJ5IHVzZXIKKyAqIHNwYWNlIHRvIGdhaW4gYWNjZXNzIHRvIHRob3NlIGRlY2xhcmF0aW9ucy4KKyAqCisgKiBBIGZldyBjYXZlYXRzIHRvIHJlbWVtYmVyOgorICoKKyAqICAtIE5lZWQgdG8gZGVmaW5lIGF0dHJpYnV0ZSBudW1iZXJzIHN0YXJ0aW5nIGluIDE7IG90aGVyd2lzZSBpdAorICogICAgZmFpbHMuCisgKgorICogIC0gdGhlIGBzdHJ1Y3QgZ2VubF9mYW1pbHlgIHJlcXVpcmVzIGEgbWF4aW11bSBhdHRyaWJ1dGUgaWQ7IHdoZW4KKyAqICAgIGRlZmluaW5nIHRoZSBgc3RydWN0IG5sYV9wb2xpY3lgIGZvciBlYWNoIG1lc3NhZ2UsIGl0IGhhcyB0byBoYXZlCisgKiAgICBhbiBhcnJheSBzaXplIG9mIFdJTUFYX0dOTF9BVFRSX01BWCsxLgorICoKKyAqIFRIRSBQSVBFIElOVEVSRkFDRToKKyAqCisgKiBUaGlzIGludGVyZmFjZSBpcyBrZXB0IGludGVudGlvbmFsbHkgc2ltcGxlLiBUaGUgZHJpdmVyIGNhbiBzZW5kCisgKiBhbmQgcmVjZWl2ZSBmcmVlLWZvcm0gbWVzc2FnZXMgdG8vZnJvbSB1c2VyIHNwYWNlIHRocm91Z2ggYQorICogcGlwZS4gU2VlIGRyaXZlcnMvbmV0L3dpbWF4L29wLW1zZy5jIGZvciBkZXRhaWxzLgorICoKKyAqIFRoZSBrZXJuZWwtdG8tdXNlciBtZXNzYWdlcyBhcmUgc2VudCB3aXRoCisgKiB3aW1heF9tc2coKS4gdXNlci10by1rZXJuZWwgbWVzc2FnZXMgYXJlIGRlbGl2ZXJlZCB2aWEKKyAqIHdpbWF4X2Rldi0+b3BfbXNnX2Zyb21fdXNlcigpLgorICoKKyAqIFJGS0lMTDoKKyAqCisgKiBSRktJTEwgc3VwcG9ydCBpcyBidWlsdCBpbnRvIHRoZSB3aW1heF9kZXYgbGF5ZXI7IHRoZSBkcml2ZXIganVzdAorICogbmVlZHMgdG8gY2FsbCB3aW1heF9yZXBvcnRfcmZraWxsX3todyxzd30oKSB0byBpbmZvcm0gb2YgY2hhbmdlcyBpbgorICogdGhlIGhhcmR3YXJlIG9yIHNvZnR3YXJlIFJGIGtpbGwgc3dpdGNoZXMuIFdoZW4gdGhlIHN0YWNrIHdhbnRzIHRvCisgKiB0dXJuIHRoZSByYWRpbyBvZmYsIGl0IHdpbGwgY2FsbCB3aW1heF9kZXYtPm9wX3Jma2lsbF9zd190b2dnbGUoKSwKKyAqIHdoaWNoIHRoZSBkcml2ZXIgaW1wbGVtZW50cy4KKyAqCisgKiBVc2VyIHNwYWNlIGNhbiBzZXQgdGhlIHNvZnR3YXJlIFJGIEtpbGwgc3dpdGNoIGJ5IGNhbGxpbmcKKyAqIHdpbWF4X3Jma2lsbCgpLgorICoKKyAqIFRoZSBjb2RlIGZvciBub3cgb25seSBzdXBwb3J0cyBkZXZpY2VzIHRoYXQgZG9uJ3QgcmVxdWlyZSBwb2xsaW5nOworICogSWYgdGhlIGRldmljZSBuZWVkcyB0byBiZSBwb2xsZWQsIGNyZWF0ZSBhIHNlbGYtcmVhcm1pbmcgZGVsYXllZAorICogd29yayBzdHJ1Y3QgZm9yIHBvbGxpbmcgb3IgbG9vayBpbnRvIGFkZGluZyBwb2xsZWQgc3VwcG9ydCB0byB0aGUKKyAqIFdpTUFYIHN0YWNrLgorICoKKyAqIFdoZW4gaW5pdGlhbGl6aW5nIHRoZSBoYXJkd2FyZSAoX3Byb2JlKSwgYWZ0ZXIgY2FsbGluZworICogd2ltYXhfZGV2X2FkZCgpLCBxdWVyeSB0aGUgZGV2aWNlIGZvciBpdCdzIFJGIEtpbGwgc3dpdGNoZXMgc3RhdHVzCisgKiBhbmQgZmVlZCBpdCBiYWNrIHRvIHRoZSBXaU1BWCBzdGFjayB1c2luZworICogd2ltYXhfcmVwb3J0X3Jma2lsbF97aHcsc3d9KCkuIElmIGFueSBzd2l0Y2ggaXMgbWlzc2luZywgYWx3YXlzCisgKiByZXBvcnQgaXQgYXMgT04uCisgKgorICogTk9URTogdGhlIHdpbWF4IHN0YWNrIHVzZXMgYW4gaW52ZXJ0ZWQgdGVybWlub2xvZ3kgdG8gdGhhdCBvZiB0aGUKKyAqIFJGS0lMTCBzdWJzeXN0ZW06CisgKgorICogIC0gT046IHJhZGlvIGlzIE9OLCBSRktJTEwgaXMgRElTQUJMRUQgb3IgT0ZGLgorICogIC0gT0ZGOiByYWRpbyBpcyBPRkYsIFJGS0lMTCBpcyBFTkFCTEVEIG9yIE9OLgorICoKKyAqIE1JU0NFTExBTkVPVVMgT1BTOgorICoKKyAqIHdpbWF4X3Jlc2V0KCkgY2FuIGJlIHVzZWQgdG8gcmVzZXQgdGhlIGRldmljZSB0byBwb3dlciBvbiBzdGF0ZTsgYnkKKyAqIGRlZmF1bHQgaXQgaXNzdWVzIGEgd2FybSByZXNldCB0aGF0IG1haW50YWlucyB0aGUgc2FtZSBkZXZpY2UKKyAqIG5vZGUuIElmIHRoYXQgaXMgbm90IHBvc3NpYmxlLCBpdCBmYWxscyBiYWNrIHRvIGEgY29sZCByZXNldAorICogKGRldmljZSByZWNvbm5lY3QpLiBUaGUgZHJpdmVyIGltcGxlbWVudHMgdGhlIGJhY2tlbmQgdG8gdGhpcworICogdGhyb3VnaCB3aW1heF9kZXYtPm9wX3Jlc2V0KCkuCisgKi8KKworI2lmbmRlZiBfX05FVF9fV0lNQVhfSF9fCisjZGVmaW5lIF9fTkVUX19XSU1BWF9IX18KKyNpZmRlZiBfX0tFUk5FTF9fCisKKyNpbmNsdWRlIDxsaW51eC93aW1heC5oPgorI2luY2x1ZGUgPG5ldC9nZW5ldGxpbmsuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKworc3RydWN0IG5ldF9kZXZpY2U7CitzdHJ1Y3QgZ2VubF9pbmZvOworc3RydWN0IHdpbWF4X2RldjsKK3N0cnVjdCBpbnB1dF9kZXY7CisKKy8qKgorICogc3RydWN0IHdpbWF4X2RldiAtIEdlbmVyaWMgV2lNQVggZGV2aWNlCisgKgorICogQG5ldF9kZXY6IFtmaWxsXSBQb2ludGVyIHRvIHRoZSAmc3RydWN0IG5ldF9kZXZpY2UgdGhpcyBXaU1BWAorICogICAgIGRldmljZSBpbXBsZW1lbnRzLgorICoKKyAqIEBvcF9tc2dfZnJvbV91c2VyOiBbZmlsbF0gRHJpdmVyLXNwZWNpZmljIG9wZXJhdGlvbiB0bworICogICAgIGhhbmRsZSBhIHJhdyBtZXNzYWdlIGZyb20gdXNlciBzcGFjZSB0byB0aGUgZHJpdmVyLiBUaGUKKyAqICAgICBkcml2ZXIgY2FuIHNlbmQgbWVzc2FnZXMgdG8gdXNlciBzcGFjZSB1c2luZyB3aXRoCisgKiAgICAgd2ltYXhfbXNnX3RvX3VzZXIoKS4KKyAqCisgKiBAb3BfcmZraWxsX3N3X3RvZ2dsZTogW2ZpbGxdIERyaXZlci1zcGVjaWZpYyBvcGVyYXRpb24gdG8gYWN0IG9uCisgKiAgICAgdXNlcnNwYWNlIChvciBhbnkgb3RoZXIgYWdlbnQpIHJlcXVlc3RpbmcgdGhlIFdpTUFYIGRldmljZSB0bworICogICAgIGNoYW5nZSB0aGUgUkYgS2lsbCBzb2Z0d2FyZSBzd2l0Y2ggKFdJTUFYX1JGX09OIG9yCisgKiAgICAgV0lNQVhfUkZfT0ZGKS4KKyAqICAgICBJZiBzdWNoIGhhcmR3YXJlIHN1cHBvcnQgaXMgbm90IHByZXNlbnQsIGl0IGlzIGFzc3VtZWQgdGhlCisgKiAgICAgcmFkaW8gY2Fubm90IGJlIHN3aXRjaGVkIG9mZiBhbmQgaXQgaXMgYWx3YXlzIG9uIChhbmQgdGhlIHN0YWNrCisgKiAgICAgd2lsbCBlcnJvciBvdXQgd2hlbiB0cnlpbmcgdG8gc3dpdGNoIGl0IG9mZikuIEluIHN1Y2ggY2FzZSwKKyAqICAgICB0aGlzIGZ1bmN0aW9uIHBvaW50ZXIgY2FuIGJlIGxlZnQgYXMgTlVMTC4KKyAqCisgKiBAb3BfcmVzZXQ6IFtmaWxsXSBEcml2ZXIgc3BlY2lmaWMgb3BlcmF0aW9uIHRvIHJlc2V0IHRoZQorICogICAgIGRldmljZS4KKyAqICAgICBUaGlzIG9wZXJhdGlvbiBzaG91bGQgYWx3YXlzIGF0dGVtcHQgZmlyc3QgYSB3YXJtIHJlc2V0IHRoYXQKKyAqICAgICBkb2VzIG5vdCBkaXNjb25uZWN0IHRoZSBkZXZpY2UgZnJvbSB0aGUgYnVzIGFuZCByZXR1cm4gMC4KKyAqICAgICBJZiB0aGF0IGZhaWxzLCBpdCBzaG91bGQgcmVzb3J0IHRvIHNvbWUgc29ydCBvZiBjb2xkIG9yIGJ1cworICogICAgIHJlc2V0IChldmVuIGlmIGl0IGltcGxpZXMgYSBidXMgZGlzY29ubmVjdGlvbiBhbmQgZGV2aWNlCisgKiAgICAgZGlzc2FwZWFyYW5jZSkuIEluIHRoYXQgY2FzZSwgLUVOT0RFViBzaG91bGQgYmUgcmV0dXJuZWQgdG8KKyAqICAgICBpbmRpY2F0ZSB0aGUgZGV2aWNlIGlzIGdvbmUuCisgKiAgICAgVGhpcyBvcGVyYXRpb24gaGFzIHRvIGJlIHN5bmNocm9ub3VzLCBhbmQgcmV0dXJuIG9ubHkgd2hlbiB0aGUKKyAqICAgICByZXNldCBpcyBjb21wbGV0ZS4gSW4gY2FzZSBvZiBoYXZpbmcgaGFkIHRvIHJlc29ydCB0byBidXMvY29sZAorICogICAgIHJlc2V0IGltcGx5aW5nIGEgZGV2aWNlIGRpc2Nvbm5lY3Rpb24sIHRoZSBjYWxsIGlzIGFsbG93ZWQgdG8KKyAqICAgICByZXR1cm4gaW5tZWRpYXRlbHkuCisgKiAgICAgTk9URTogd2ltYXhfZGV2LT5tdXRleCBpcyBOT1QgbG9ja2VkIHdoZW4gdGhpcyBvcCBpcyBiZWluZworICogICAgIGNhbGxlZDsgaG93ZXZlciwgd2ltYXhfZGV2LT5tdXRleF9yZXNldCBJUyBsb2NrZWQgdG8gZW5zdXJlCisgKiAgICAgc2VyaWFsaXphdGlvbiBvZiBjYWxscyB0byB3aW1heF9yZXNldCgpLgorICogICAgIFNlZSB3aW1heF9yZXNldCgpJ3MgZG9jdW1lbnRhdGlvbi4KKyAqCisgKiBAbmFtZTogW2ZpbGxdIEEgd2F5IHRvIGlkZW50aWZ5IHRoaXMgZGV2aWNlLiBXZSBuZWVkIHRvIHJlZ2lzdGVyIGEKKyAqICAgICBuYW1lIHdpdGggbWFueSBzdWJzeXN0ZW1zIChpbnB1dCBmb3IgUkZLSUxMLCB3b3JrcXVldWUKKyAqICAgICBjcmVhdGlvbiwgZXRjKS4gV2UgY2FuJ3QgdXNlIHRoZSBuZXR3b3JrIGRldmljZSBuYW1lIGFzIHRoYXQKKyAqICAgICBtaWdodCBjaGFuZ2UgYW5kIGluIHNvbWUgaW5zdGFuY2VzIHdlIGRvbid0IGtub3cgaXQgeWV0ICh1bnRpbAorICogICAgIHdlIGRvbid0IGNhbGwgcmVnaXN0ZXJfbmV0ZGV2KCkpLiBTbyB3ZSBnZW5lcmF0ZSBhbiB1bmlxdWUgb25lCisgKiAgICAgdXNpbmcgdGhlIGRyaXZlciBuYW1lIGFuZCBkZXZpY2UgYnVzIGlkLCBwbGFjZSBpdCBoZXJlIGFuZCB1c2UKKyAqICAgICBpdCBhY3Jvc3MgdGhlIGJvYXJkLiBSZWNvbW1lbmRlZCBuYW1pbmc6CisgKiAgICAgRFJJVkVSTkFNRS1CVVNOQU1FOkJVU0lEIChkZXYtPmJ1cy0+bmFtZSwgZGV2LT5idXNfaWQpLgorICoKKyAqIEBpZF90YWJsZV9ub2RlOiBbcHJpdmF0ZV0gbGluayB0byB0aGUgbGlzdCBvZiB3aW1heCBkZXZpY2VzIGtlcHQgYnkKKyAqICAgICBpZC10YWJsZS5jLiBQcm90ZWN0ZWQgYnkgaXQncyBvd24gc3BpbmxvY2suCisgKgorICogQG11dGV4OiBbcHJpdmF0ZV0gU2VyaWFsaXplcyBhbGwgY29uY3VycmVudCBhY2Nlc3MgYW5kIGV4ZWN1dGlvbiBvZgorICogICAgIG9wZXJhdGlvbnMuCisgKgorICogQG11dGV4X3Jlc2V0OiBbcHJpdmF0ZV0gU2VyaWFsaXplcyByZXNldCBvcGVyYXRpb25zLiBOZWVkcyB0byBiZSBhCisgKiAgICAgZGlmZmVyZW50IG11dGV4IGJlY2F1c2UgYXMgcGFydCBvZiB0aGUgcmVzZXQgb3BlcmF0aW9uLCB0aGUKKyAqICAgICBkcml2ZXIgaGFzIHRvIGNhbGwgYmFjayBpbnRvIHRoZSBzdGFjayB0byBkbyB0aGluZ3Mgc3VjaCBhcworICogICAgIHN0YXRlIGNoYW5nZSwgdGhhdCByZXF1aXJlIHdpbWF4X2Rldi0+bXV0ZXguCisgKgorICogQHN0YXRlOiBbcHJpdmF0ZV0gQ3VycmVudCBzdGF0ZSBvZiB0aGUgV2lNQVggZGV2aWNlLgorICoKKyAqIEByZmtpbGw6IFtwcml2YXRlXSBpbnRlZ3JhdGlvbiBpbnRvIHRoZSBSRi1LaWxsIGluZnJhc3RydWN0dXJlLgorICoKKyAqIEByZmtpbGxfaW5wdXQ6IFtwcml2YXRlXSB2aXJ0dWFsIGlucHV0IGRldmljZSB0byBwcm9jZXNzIHRoZQorICogICAgIGhhcmR3YXJlIFJGIEtpbGwgc3dpdGNoZXMuCisgKgorICogQHJmX3N3OiBbcHJpdmF0ZV0gU3RhdGUgb2YgdGhlIHNvZnR3YXJlIHJhZGlvIHN3aXRjaCAoT0ZGL09OKQorICoKKyAqIEByZl9odzogW3ByaXZhdGVdIFN0YXRlIG9mIHRoZSBoYXJkd2FyZSByYWRpbyBzd2l0Y2ggKE9GRi9PTikKKyAqCisgKiBAZGVidWdmc19kZW50cnk6IFtwcml2YXRlXSBVc2VkIHRvIGhvb2sgdXAgYSBkZWJ1Z2ZzIGVudHJ5LiBUaGlzCisgKiAgICAgc2hvd3MgdXAgaW4gdGhlIGRlYnVnZnMgcm9vdCBhcyB3aW1heFw6REVWSUNFTkFNRS4KKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgYSBjb21tb24gaW50ZXJmYWNlIHRvIGFjY2VzcyBhbGwgV2lNQVgKKyAqIGRldmljZXMgZnJvbSBkaWZmZXJlbnQgdmVuZG9ycyBhbmQgcHJvdmlkZXMgYSBjb21tb24gQVBJIGFzIHdlbGwgYXMKKyAqIGEgZnJlZS1mb3JtIGRldmljZS1zcGVjaWZpYyBtZXNzYWdpbmcgY2hhbm5lbC4KKyAqCisgKiBVc2FnZToKKyAqICAxLiBFbWJlZCBhICZzdHJ1Y3Qgd2ltYXhfZGV2IGF0ICp0aGUgYmVnaW5uaW5nKiB0aGUgbmV0d29yaworICogICAgIGRldmljZSBzdHJ1Y3R1cmUgc28gdGhhdCBuZXRkZXZfcHJpdigpIHBvaW50cyB0byBpdC4KKyAqCisgKiAgMi4gbWVtc2V0KCkgaXQgdG8gemVybworICoKKyAqICAzLiBJbml0aWFsaXplIHdpdGggd2ltYXhfZGV2X2luaXQoKS4gVGhpcyB3aWxsIGxlYXZlIHRoZSBXaU1BWAorICogICAgIGRldmljZSBpbiB0aGUgJV9fV0lNQVhfU1RfTlVMTCBzdGF0ZS4KKyAqCisgKiAgNC4gRmlsbCBhbGwgdGhlIGZpZWxkcyBtYXJrZWQgd2l0aCBbZmlsbF07IG9uY2UgY2FsbGVkCisgKiAgICAgd2ltYXhfZGV2X2FkZCgpLCB0aG9zZSBmaWVsZHMgQ0FOTk9UIGJlIG1vZGlmaWVkLgorICoKKyAqICA1LiBDYWxsIHdpbWF4X2Rldl9hZGQoKSAqYWZ0ZXIqIHJlZ2lzdGVyaW5nIHRoZSBuZXR3b3JrCisgKiAgICAgZGV2aWNlLiBUaGlzIHdpbGwgbGVhdmUgdGhlIFdpTUFYIGRldmljZSBpbiB0aGUgJVdJTUFYX1NUX0RPV04KKyAqICAgICBzdGF0ZS4KKyAqICAgICBQcm90ZWN0IHRoZSBkcml2ZXIncyBuZXRfZGV2aWNlLT5vcGVuKCkgYWdhaW5zdCBzdWNjZWVkaW5nIGlmCisgKiAgICAgdGhlIHdpbWF4IGRldmljZSBzdGF0ZSBpcyBsb3dlciB0aGFuICVXSU1BWF9TVF9ET1dOLgorICoKKyAqICA2LiBTZWxlY3Qgd2hlbiB0aGUgZGV2aWNlIGlzIGdvaW5nIHRvIGJlIHR1cm5lZCBvbi9pbml0aWFsaXplZDsKKyAqICAgICBmb3IgZXhhbXBsZSwgaXQgY291bGQgYmUgaW5pdGlhbGl6ZWQgb24gJ2lmY29uZmlnIHVwJyAod2hlbiB0aGUKKyAqICAgICBuZXRkZXYgb3AgJ29wZW4oKScgaXMgY2FsbGVkIG9uIHRoZSBkcml2ZXIpLgorICoKKyAqIFdoZW4gdGhlIGRldmljZSBpcyBpbml0aWFsaXplZCAoYXQgYGlmY29uZmlnIHVwYCB0aW1lLCBvciByaWdodAorICogYWZ0ZXIgY2FsbGluZyB3aW1heF9kZXZfYWRkKCkgZnJvbSBfcHJvYmUoKSwgbWFrZSBzdXJlIHRoZQorICogZm9sbG93aW5nIHN0ZXBzIGFyZSB0YWtlbgorICoKKyAqICBhLiBNb3ZlIHRoZSBkZXZpY2UgdG8gJVdJTUFYX1NUX1VOSU5JVElBTElaRUQuIFRoaXMgaXMgbmVlZGVkIHNvCisgKiAgICAgc29tZSBBUEkgY2FsbHMgdGhhdCBzaG91bGRuJ3Qgd29yayB1bnRpbCB0aGUgZGV2aWNlIGlzIHJlYWR5CisgKiAgICAgY2FuIGJlIGJsb2NrZWQuCisgKgorICogIGIuIEluaXRpYWxpemUgdGhlIGRldmljZS4gTWFrZSBzdXJlIHRvIHR1cm4gdGhlIFNXIHJhZGlvIHN3aXRjaAorICogICAgIG9mZiBhbmQgbW92ZSB0aGUgZGV2aWNlIHRvIHN0YXRlICVXSU1BWF9TVF9SQURJT19PRkYgd2hlbgorICogICAgIGRvbmUuIFdoZW4ganVzdCBpbml0aWFsaXplZCwgYSBkZXZpY2Ugc2hvdWxkIGJlIGxlZnQgaW4gUkFESU8KKyAqICAgICBPRkYgc3RhdGUgdW50aWwgdXNlciBzcGFjZSBkZXZpY2VzIHRvIHR1cm4gaXQgb24uCisgKgorICogIGMuIFF1ZXJ5IHRoZSBkZXZpY2UgZm9yIHRoZSBzdGF0ZSBvZiB0aGUgaGFyZHdhcmUgcmZraWxsIHN3aXRjaAorICogICAgIGFuZCBjYWxsIHdpbWF4X3Jma2lsbF9yZXBvcnRfaHcoKSBhbmQgd2ltYXhfcmZraWxsX3JlcG9ydF9zdygpCisgKiAgICAgYXMgbmVlZGVkLiBTZWUgYmVsb3cuCisgKgorICogd2ltYXhfZGV2X3JtKCkgdW5kb2VzIGJlZm9yZSB1bnJlZ2lzdGVyaW5nIHRoZSBuZXR3b3JrIGRldmljZS4gT25jZQorICogd2ltYXhfZGV2X2FkZCgpIGlzIGNhbGxlZCwgdGhlIGRyaXZlciBjYW4gZ2V0IGNhbGxlZCBvbiB0aGUKKyAqIHdpbWF4X2Rldi0+b3BfKiBmdW5jdGlvbiBwb2ludGVycworICoKKyAqIENPTkNVUlJFTkNZOgorICoKKyAqIFRoZSBzdGFjayBwcm92aWRlcyBhIG11dGV4IGZvciBlYWNoIGRldmljZSB0aGF0IHdpbGwgZGlzYWxsb3cgQVBJCisgKiBjYWxscyBoYXBwZW5pbmcgY29uY3VycmVudGx5OyB0aHVzLCBvcCBjYWxscyBpbnRvIHRoZSBkcml2ZXIKKyAqIHRocm91Z2ggdGhlIHdpbWF4X2Rldi0+b3AqKCkgZnVuY3Rpb24gcG9pbnRlcnMgd2lsbCBhbHdheXMgYmUKKyAqIHNlcmlhbGl6ZWQgYW5kICpuZXZlciogY29uY3VycmVudC4KKyAqCisgKiBGb3IgbG9ja2luZywgdGFrZSB3aW1heF9kZXYtPm11dGV4IGlzIHRha2VuOyAobW9zdCkgb3BlcmF0aW9ucyBpbgorICogdGhlIEFQSSBoYXZlIHRvIGNoZWNrIGZvciB3aW1heF9kZXZfaXNfcmVhZHkoKSB0byByZXR1cm4gMCBiZWZvcmUKKyAqIGNvbnRpbnVpbmcgKHRoaXMgaXMgZG9uZSBpbnRlcm5hbGx5KS4KKyAqCisgKiBSRUZFUkVOQ0UgQ09VTlRJTkc6CisgKgorICogVGhlIFdpTUFYIGRldmljZSBpcyByZWZlcmVuY2UgY291bnRlZCBieSB0aGUgYXNzb2NpYXRlZCBuZXR3b3JrCisgKiBkZXZpY2UuIFRoZSBvbmx5IG9wZXJhdGlvbiB0aGF0IGNhbiBiZSB1c2VkIHRvIHJlZmVyZW5jZSB0aGUgZGV2aWNlCisgKiBpcyB3aW1heF9kZXZfZ2V0X2J5X2dlbmxfaW5mbygpLCBhbmQgdGhlIHJlZmVyZW5jZSBpdCBhY3F1aXJlcyBoYXMKKyAqIHRvIGJlIHJlbGVhc2VkIHdpdGggZGV2X3B1dCh3aW1heF9kZXYtPm5ldF9kZXYpLgorICoKKyAqIFJGS0lMTDoKKyAqCisgKiBBdCBzdGFydHVwLCBib3RoIEhXIGFuZCBTVyByYWRpbyBzd2l0Y2hlc3MgYXJlIGFzc3VtZWQgdG8gYmUgb2ZmLgorICoKKyAqIEF0IGluaXRpYWxpemF0aW9uIHRpbWUgW2FmdGVyIGNhbGxpbmcgd2ltYXhfZGV2X2FkZCgpXSwgaGF2ZSB0aGUKKyAqIGRyaXZlciBxdWVyeSB0aGUgZGV2aWNlIGZvciB0aGUgc3RhdHVzIG9mIHRoZSBzb2Z0d2FyZSBhbmQgaGFyZHdhcmUKKyAqIFJGIGtpbGwgc3dpdGNoZXMgYW5kIGNhbGwgd2ltYXhfcmVwb3J0X3Jma2lsbF9odygpIGFuZAorICogd2ltYXhfcmZraWxsX3JlcG9ydF9zdygpIHRvIGluZGljYXRlIHRoZWlyIHN0YXRlLiBJZiBhbnkgaXMKKyAqIG1pc3NpbmcsIGp1c3QgY2FsbCBpdCB0byBpbmRpY2F0ZSBpdCBpcyBPTiAocmFkaW8gYWx3YXlzIG9uKS4KKyAqCisgKiBXaGVuZXZlciB0aGUgZHJpdmVyIGRldGVjdHMgYSBjaGFuZ2UgaW4gdGhlIHN0YXRlIG9mIHRoZSBSRiBraWxsCisgKiBzd2l0Y2hlcywgaXQgc2hvdWxkIGNhbGwgd2ltYXhfcmVwb3J0X3Jma2lsbF9odygpIG9yCisgKiB3aW1heF9yZXBvcnRfcmZraWxsX3N3KCkgdG8gcmVwb3J0IGl0IHRvIHRoZSBzdGFjay4KKyAqLworc3RydWN0IHdpbWF4X2RldiB7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXY7CisJc3RydWN0IGxpc3RfaGVhZCBpZF90YWJsZV9ub2RlOworCXN0cnVjdCBtdXRleCBtdXRleDsJCS8qIFByb3RlY3RzIGFsbCBtZW1iZXJzIGFuZCBBUEkgY2FsbHMgKi8KKwlzdHJ1Y3QgbXV0ZXggbXV0ZXhfcmVzZXQ7CisJZW51bSB3aW1heF9zdCBzdGF0ZTsKKworCWludCAoKm9wX21zZ19mcm9tX3VzZXIpKHN0cnVjdCB3aW1heF9kZXYgKndpbWF4X2RldiwKKwkJCQljb25zdCBjaGFyICosCisJCQkJY29uc3Qgdm9pZCAqLCBzaXplX3QsCisJCQkJY29uc3Qgc3RydWN0IGdlbmxfaW5mbyAqaW5mbyk7CisJaW50ICgqb3BfcmZraWxsX3N3X3RvZ2dsZSkoc3RydWN0IHdpbWF4X2RldiAqd2ltYXhfZGV2LAorCQkJCSAgIGVudW0gd2ltYXhfcmZfc3RhdGUpOworCWludCAoKm9wX3Jlc2V0KShzdHJ1Y3Qgd2ltYXhfZGV2ICp3aW1heF9kZXYpOworCisJc3RydWN0IHJma2lsbCAqcmZraWxsOworCXN0cnVjdCBpbnB1dF9kZXYgKnJma2lsbF9pbnB1dDsKKwl1bnNpZ25lZCByZl9odzsKKwl1bnNpZ25lZCByZl9zdzsKKwljaGFyIG5hbWVbMzJdOworCisJc3RydWN0IGRlbnRyeSAqZGVidWdmc19kZW50cnk7Cit9OworCisKKworLyoKKyAqIFdpTUFYIHN0YWNrIHB1YmxpYyBBUEkgZm9yIGRldmljZSBkcml2ZXJzCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIFRoZXNlIGZ1bmN0aW9ucyBhcmUgbm90IGV4cG9ydGVkIHRvIHVzZXIgc3BhY2UuCisgKi8KK2V4dGVybiB2b2lkIHdpbWF4X2Rldl9pbml0KHN0cnVjdCB3aW1heF9kZXYgKik7CitleHRlcm4gaW50IHdpbWF4X2Rldl9hZGQoc3RydWN0IHdpbWF4X2RldiAqLCBzdHJ1Y3QgbmV0X2RldmljZSAqKTsKK2V4dGVybiB2b2lkIHdpbWF4X2Rldl9ybShzdHJ1Y3Qgd2ltYXhfZGV2ICopOworCitzdGF0aWMgaW5saW5lCitzdHJ1Y3Qgd2ltYXhfZGV2ICpuZXRfZGV2X3RvX3dpbWF4KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2KQoreworCXJldHVybiBuZXRkZXZfcHJpdihuZXRfZGV2KTsKK30KKworc3RhdGljIGlubGluZQorc3RydWN0IGRldmljZSAqd2ltYXhfZGV2X3RvX2RldihzdHJ1Y3Qgd2ltYXhfZGV2ICp3aW1heF9kZXYpCit7CisJcmV0dXJuIHdpbWF4X2Rldi0+bmV0X2Rldi0+ZGV2LnBhcmVudDsKK30KKworZXh0ZXJuIHZvaWQgd2ltYXhfc3RhdGVfY2hhbmdlKHN0cnVjdCB3aW1heF9kZXYgKiwgZW51bSB3aW1heF9zdCk7CitleHRlcm4gZW51bSB3aW1heF9zdCB3aW1heF9zdGF0ZV9nZXQoc3RydWN0IHdpbWF4X2RldiAqKTsKKworLyoKKyAqIFJhZGlvIFN3aXRjaCBzdGF0ZSByZXBvcnRpbmcuCisgKgorICogZW51bSB3aW1heF9yZl9zdGF0ZSBpcyBkZWNsYXJlZCBpbiBsaW51eC93aW1heC5oIHNvIHRoZSBleHBvcnRzCisgKiB0byB1c2VyIHNwYWNlIGNhbiB1c2UgaXQuCisgKi8KK2V4dGVybiB2b2lkIHdpbWF4X3JlcG9ydF9yZmtpbGxfaHcoc3RydWN0IHdpbWF4X2RldiAqLCBlbnVtIHdpbWF4X3JmX3N0YXRlKTsKK2V4dGVybiB2b2lkIHdpbWF4X3JlcG9ydF9yZmtpbGxfc3coc3RydWN0IHdpbWF4X2RldiAqLCBlbnVtIHdpbWF4X3JmX3N0YXRlKTsKKworCisvKgorICogRnJlZS1mb3JtIG1lc3NhZ2luZyB0by9mcm9tIHVzZXIgc3BhY2UKKyAqCisgKiBTZW5kaW5nIGEgbWVzc2FnZToKKyAqCisgKiAgIHdpbWF4X21zZyh3aW1heF9kZXYsIHBpcGVfbmFtZSwgYnVmLCBidWZfc2l6ZSwgR0ZQX0tFUk5FTCk7CisgKgorICogQnJva2VuIHVwOgorICoKKyAqICAgc2tiID0gd2ltYXhfbXNnX2FsbG9jKHdpbWF4X2RldiwgcGlwZV9uYW1lLCBidWZfc2l6ZSwgR0ZQX0tFUk5FTCk7CisgKiAgIC4uLmZpbGwgdXAgc2tiLi4uCisgKiAgIHdpbWF4X21zZ19zZW5kKHdpbWF4X2RldiwgcGlwZV9uYW1lLCBza2IpOworICoKKyAqIEJlIHN1cmUgbm90IHRvIG1vZGlmeSBza2ItPmRhdGEgaW4gdGhlIG1pZGRsZSAoaWU6IGRvbid0IHVzZQorICogc2tiX3B1c2goKS9za2JfcHVsbCgpL3NrYl9yZXNlcnZlKCkgb24gdGhlIHNrYikuCisgKgorICogInBpcGVfbmFtZSIgaXMgYW55IHN0cmluZywgdGhhbiBjYW4gYmUgaW50ZXJwcmV0ZWQgYXMgdGhlIG5hbWUgb2YKKyAqIHRoZSBwaXBlIG9yIGRlc3RpbmF0YXJ5OyB0aGUgaW50ZXJwcmV0YXRpb24gb2YgaXQgaXMgZHJpdmVyCisgKiBzcGVjaWZpYywgc28gdGhlIHJlY2lwaWVudCBjYW4gbXVsdGlwbGV4IGl0IGFzIHdpc2hlZC4gSXQgY2FuIGJlCisgKiBOVUxMLCBpdCB3b24ndCBiZSB1c2VkIC0gYW4gZXhhbXBsZSBpcyB1c2luZyBhICJkaWFnbm9zdGljcyIgdGFnIHRvCisgKiBzZW5kIGRpYWdub3N0aWNzIGluZm9ybWF0aW9uIHRoYXQgYSBkZXZpY2Utc3BlY2lmaWMgZGlhZ25vc3RpY3MKKyAqIHRvb2wgd291bGQgYmUgaW50ZXJlc3RlZCBpbi4KKyAqLworZXh0ZXJuIHN0cnVjdCBza19idWZmICp3aW1heF9tc2dfYWxsb2Moc3RydWN0IHdpbWF4X2RldiAqLCBjb25zdCBjaGFyICosCisJCQkJICAgICAgIGNvbnN0IHZvaWQgKiwgc2l6ZV90LCBnZnBfdCk7CitleHRlcm4gaW50IHdpbWF4X21zZ19zZW5kKHN0cnVjdCB3aW1heF9kZXYgKiwgc3RydWN0IHNrX2J1ZmYgKik7CitleHRlcm4gaW50IHdpbWF4X21zZyhzdHJ1Y3Qgd2ltYXhfZGV2ICosIGNvbnN0IGNoYXIgKiwKKwkJICAgICBjb25zdCB2b2lkICosIHNpemVfdCwgZ2ZwX3QpOworCitleHRlcm4gY29uc3Qgdm9pZCAqd2ltYXhfbXNnX2RhdGFfbGVuKHN0cnVjdCBza19idWZmICosIHNpemVfdCAqKTsKK2V4dGVybiBjb25zdCB2b2lkICp3aW1heF9tc2dfZGF0YShzdHJ1Y3Qgc2tfYnVmZiAqKTsKK2V4dGVybiBzc2l6ZV90IHdpbWF4X21zZ19sZW4oc3RydWN0IHNrX2J1ZmYgKik7CisKKworLyoKKyAqIFdpTUFYIHN0YWNrIHVzZXIgc3BhY2UgQVBJCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIFRoaXMgQVBJIGlzIHdoYXQgZ2V0cyBleHBvcnRlZCB0byB1c2VyIHNwYWNlIGZvciBnZW5lcmFsCisgKiBvcGVyYXRpb25zLiBBcyB3ZWxsLCB0aGV5IGNhbiBiZSBjYWxsZWQgZnJvbSB3aXRoaW4gdGhlIGtlcm5lbCwKKyAqICh3aXRoIGEgcHJvcGVybHkgcmVmZXJlbmNlZCBgc3RydWN0IHdpbWF4X2RldmApLgorICoKKyAqIFByb3Blcmx5IHJlZmVyZW5jZWQgbWVhbnM6IHRoZSAnc3RydWN0IG5ldF9kZXZpY2UnIHRoYXQgZW1iZWRzIHRoZQorICogZGV2aWNlJ3MgY29udHJvbCBzdHJ1Y3R1cmUgYW5kIChhcyBzdWNoKSB0aGUgJ3N0cnVjdCB3aW1heF9kZXYnIGlzCisgKiByZWZlcmVuY2VkIGJ5IHRoZSBjYWxsZXIuCisgKi8KK2V4dGVybiBpbnQgd2ltYXhfcmZraWxsKHN0cnVjdCB3aW1heF9kZXYgKiwgZW51bSB3aW1heF9yZl9zdGF0ZSk7CitleHRlcm4gaW50IHdpbWF4X3Jlc2V0KHN0cnVjdCB3aW1heF9kZXYgKik7CisKKyNlbHNlCisvKiBZb3UgbWlnaHQgYmUgbG9va2luZyBmb3IgbGludXgvd2ltYXguaCAqLworI2Vycm9yIFRoaXMgZmlsZSBzaG91bGQgbm90IGJlIGluY2x1ZGVkIGZyb20gdXNlciBzcGFjZS4KKyNlbmRpZiAvKiAjaWZkZWYgX19LRVJORUxfXyAqLworI2VuZGlmIC8qICNpZm5kZWYgX19ORVRfX1dJTUFYX0hfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zY3NpL2xpYmlzY3NpX3RjcC5oIGIvaW5jbHVkZS9zY3NpL2xpYmlzY3NpX3RjcC5oCmluZGV4IDgzZTMyZjYuLjllMzE4MmUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc2NzaS9saWJpc2NzaV90Y3AuaAorKysgYi9pbmNsdWRlL3Njc2kvbGliaXNjc2lfdGNwLmgKQEAgLTM5LDYgKzM5LDcgQEAKIAl1bnNpZ25lZCBpbnQJCXRvdGFsX2NvcGllZDsKIAogCXN0cnVjdCBoYXNoX2Rlc2MJKmhhc2g7CisJdW5zaWduZWQgY2hhcgkJcGFkYnVmW0lTQ1NJX1BBRF9MRU5dOwogCXVuc2lnbmVkIGNoYXIJCXJlY3ZfZGlnZXN0W0lTQ1NJX0RJR0VTVF9TSVpFXTsKIAl1bnNpZ25lZCBjaGFyCQlkaWdlc3RbSVNDU0lfRElHRVNUX1NJWkVdOwogCXVuc2lnbmVkIGludAkJZGlnZXN0X2xlbjsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvc2NzaS9zY3NpX3RyYW5zcG9ydF9mYy5oIGIvaW5jbHVkZS9zY3NpL3Njc2lfdHJhbnNwb3J0X2ZjLmgKaW5kZXggNmUwNGU2Zi4uYzkxODRmNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zY3NpL3Njc2lfdHJhbnNwb3J0X2ZjLmgKKysrIGIvaW5jbHVkZS9zY3NpL3Njc2lfdHJhbnNwb3J0X2ZjLmgKQEAgLTM1OCw2ICszNTgsNyBAQAogI2RlZmluZSBGQ19SUE9SVF9ERVZMT1NTX1BFTkRJTkcJMHgwMQogI2RlZmluZSBGQ19SUE9SVF9TQ0FOX1BFTkRJTkcJCTB4MDIKICNkZWZpbmUgRkNfUlBPUlRfRkFTVF9GQUlMX1RJTUVET1VUCTB4MDQKKyNkZWZpbmUgRkNfUlBPUlRfREVWTE9TU19DQUxMQktfRE9ORQkweDA4CiAKICNkZWZpbmUJZGV2X3RvX3Jwb3J0KGQpCQkJCVwKIAljb250YWluZXJfb2YoZCwgc3RydWN0IGZjX3Jwb3J0LCBkZXYpCmRpZmYgLS1naXQgYS9pbmNsdWRlL3NvdW5kL3NvYy1kYXBtLmggYi9pbmNsdWRlL3NvdW5kL3NvYy1kYXBtLmgKaW5kZXggNGFmMTA4My4uOTNhNGVkYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zb3VuZC9zb2MtZGFwbS5oCisrKyBiL2luY2x1ZGUvc291bmQvc29jLWRhcG0uaApAQCAtMTc4LDcgKzE3OCw3IEBACiAgIAkucHJpdmF0ZV92YWx1ZSA9ICh1bnNpZ25lZCBsb25nKSZ4ZW51bSB9CiAjZGVmaW5lIFNPQ19EQVBNX1ZBTFVFX0VOVU0oeG5hbWUsIHhlbnVtKSBcCiB7CS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLCAubmFtZSA9IHhuYW1lLCBcCi0JLmluZm8gPSBzbmRfc29jX2luZm9fdmFsdWVfZW51bV9kb3VibGUsIFwKKwkuaW5mbyA9IHNuZF9zb2NfaW5mb19lbnVtX2RvdWJsZSwgXAogCS5nZXQgPSBzbmRfc29jX2RhcG1fZ2V0X3ZhbHVlX2VudW1fZG91YmxlLCBcCiAJLnB1dCA9IHNuZF9zb2NfZGFwbV9wdXRfdmFsdWVfZW51bV9kb3VibGUsIFwKIAkucHJpdmF0ZV92YWx1ZSA9ICh1bnNpZ25lZCBsb25nKSZ4ZW51bSB9CmRpZmYgLS1naXQgYS9pbmNsdWRlL3NvdW5kL3NvYy5oIGIvaW5jbHVkZS9zb3VuZC9zb2MuaAppbmRleCA5YjkzMGQzLi4yNDU5M2FjIDEwMDY0NAotLS0gYS9pbmNsdWRlL3NvdW5kL3NvYy5oCisrKyBiL2luY2x1ZGUvc291bmQvc29jLmgKQEAgLTEwNiw3ICsxMDYsNyBAQAogCS5wcml2YXRlX3ZhbHVlID0gKHVuc2lnbmVkIGxvbmcpJnhlbnVtIH0KICNkZWZpbmUgU09DX1ZBTFVFX0VOVU0oeG5hbWUsIHhlbnVtKSBcCiB7CS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLCAubmFtZSA9IHhuYW1lLFwKLQkuaW5mbyA9IHNuZF9zb2NfaW5mb192YWx1ZV9lbnVtX2RvdWJsZSwgXAorCS5pbmZvID0gc25kX3NvY19pbmZvX2VudW1fZG91YmxlLCBcCiAJLmdldCA9IHNuZF9zb2NfZ2V0X3ZhbHVlX2VudW1fZG91YmxlLCBcCiAJLnB1dCA9IHNuZF9zb2NfcHV0X3ZhbHVlX2VudW1fZG91YmxlLCBcCiAJLnByaXZhdGVfdmFsdWUgPSAodW5zaWduZWQgbG9uZykmeGVudW0gfQpAQCAtMjExLDggKzIxMSw2IEBACiAJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpOwogaW50IHNuZF9zb2NfcHV0X2VudW1fZG91YmxlKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAogCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKTsKLWludCBzbmRfc29jX2luZm9fdmFsdWVfZW51bV9kb3VibGUoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0Jc3RydWN0IHNuZF9jdGxfZWxlbV9pbmZvICp1aW5mbyk7CiBpbnQgc25kX3NvY19nZXRfdmFsdWVfZW51bV9kb3VibGUoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCiAJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpOwogaW50IHNuZF9zb2NfcHV0X3ZhbHVlX2VudW1fZG91YmxlKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLApAQCAtNDE5LDE3ICs0MTcsNiBAQAogCXVuc2lnbmVkIGNoYXIgc2hpZnRfbDsKIAl1bnNpZ25lZCBjaGFyIHNoaWZ0X3I7CiAJdW5zaWduZWQgaW50IG1heDsKLQljb25zdCBjaGFyICoqdGV4dHM7Ci0Jdm9pZCAqZGFwbTsKLX07Ci0KLS8qIHNlbWkgZW51bWVyYXRlZCBrY29udHJvbCAqLwotc3RydWN0IHNvY192YWx1ZV9lbnVtIHsKLQl1bnNpZ25lZCBzaG9ydCByZWc7Ci0JdW5zaWduZWQgc2hvcnQgcmVnMjsKLQl1bnNpZ25lZCBjaGFyIHNoaWZ0X2w7Ci0JdW5zaWduZWQgY2hhciBzaGlmdF9yOwotCXVuc2lnbmVkIGludCBtYXg7CiAJdW5zaWduZWQgaW50IG1hc2s7CiAJY29uc3QgY2hhciAqKnRleHRzOwogCWNvbnN0IHVuc2lnbmVkIGludCAqdmFsdWVzOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS94ZW4veGVuYnVzLmggYi9pbmNsdWRlL3hlbi94ZW5idXMuaAppbmRleCA2MzY5ZDg5Li5mODdmOTYxIDEwMDY0NAotLS0gYS9pbmNsdWRlL3hlbi94ZW5idXMuaAorKysgYi9pbmNsdWRlL3hlbi94ZW5idXMuaApAQCAtMTM2LDggKzEzNiw2IEBACiAvKiBOaWwgdHJhbnNhY3Rpb24gSUQuICovCiAjZGVmaW5lIFhCVF9OSUwgKChzdHJ1Y3QgeGVuYnVzX3RyYW5zYWN0aW9uKSB7IDAgfSkKIAotaW50IF9faW5pdCB4ZW5idXNfZGV2X2luaXQodm9pZCk7Ci0KIGNoYXIgKip4ZW5idXNfZGlyZWN0b3J5KHN0cnVjdCB4ZW5idXNfdHJhbnNhY3Rpb24gdCwKIAkJCWNvbnN0IGNoYXIgKmRpciwgY29uc3QgY2hhciAqbm9kZSwgdW5zaWduZWQgaW50ICpudW0pOwogdm9pZCAqeGVuYnVzX3JlYWQoc3RydWN0IHhlbmJ1c190cmFuc2FjdGlvbiB0LApkaWZmIC0tZ2l0IGEvaW5pdC9LY29uZmlnIGIvaW5pdC9LY29uZmlnCmluZGV4IGU3ODkzYjEuLjJhZjgzODIgMTAwNjQ0Ci0tLSBhL2luaXQvS2NvbmZpZworKysgYi9pbml0L0tjb25maWcKQEAgLTI3MSw1OSArMjcxLDYgQEAKIAkJICAgICAxMyA9PiAgOCBLQgogCQkgICAgIDEyID0+ICA0IEtCCiAKLWNvbmZpZyBDR1JPVVBTCi0JYm9vbCAiQ29udHJvbCBHcm91cCBzdXBwb3J0IgotCWhlbHAKLQkgIFRoaXMgb3B0aW9uIHdpbGwgbGV0IHlvdSB1c2UgcHJvY2VzcyBjZ3JvdXAgc3Vic3lzdGVtcwotCSAgc3VjaCBhcyBDcHVzZXRzCi0KLQkgIFNheSBOIGlmIHVuc3VyZS4KLQotY29uZmlnIENHUk9VUF9ERUJVRwotCWJvb2wgIkV4YW1wbGUgZGVidWcgY2dyb3VwIHN1YnN5c3RlbSIKLQlkZXBlbmRzIG9uIENHUk9VUFMKLQlkZWZhdWx0IG4KLQloZWxwCi0JICBUaGlzIG9wdGlvbiBlbmFibGVzIGEgc2ltcGxlIGNncm91cCBzdWJzeXN0ZW0gdGhhdAotCSAgZXhwb3J0cyB1c2VmdWwgZGVidWdnaW5nIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjZ3JvdXBzCi0JICBmcmFtZXdvcmsKLQotCSAgU2F5IE4gaWYgdW5zdXJlCi0KLWNvbmZpZyBDR1JPVVBfTlMKLSAgICAgICAgYm9vbCAiTmFtZXNwYWNlIGNncm91cCBzdWJzeXN0ZW0iCi0gICAgICAgIGRlcGVuZHMgb24gQ0dST1VQUwotICAgICAgICBoZWxwCi0gICAgICAgICAgUHJvdmlkZXMgYSBzaW1wbGUgbmFtZXNwYWNlIGNncm91cCBzdWJzeXN0ZW0gdG8KLSAgICAgICAgICBwcm92aWRlIGhpZXJhcmNoaWNhbCBuYW1pbmcgb2Ygc2V0cyBvZiBuYW1lc3BhY2VzLAotICAgICAgICAgIGZvciBpbnN0YW5jZSB2aXJ0dWFsIHNlcnZlcnMgYW5kIGNoZWNrcG9pbnQvcmVzdGFydAotICAgICAgICAgIGpvYnMuCi0KLWNvbmZpZyBDR1JPVVBfRlJFRVpFUgotICAgICAgICBib29sICJjb250cm9sIGdyb3VwIGZyZWV6ZXIgc3Vic3lzdGVtIgotICAgICAgICBkZXBlbmRzIG9uIENHUk9VUFMKLSAgICAgICAgaGVscAotICAgICAgICAgIFByb3ZpZGVzIGEgd2F5IHRvIGZyZWV6ZSBhbmQgdW5mcmVlemUgYWxsIHRhc2tzIGluIGEKLQkgIGNncm91cC4KLQotY29uZmlnIENHUk9VUF9ERVZJQ0UKLQlib29sICJEZXZpY2UgY29udHJvbGxlciBmb3IgY2dyb3VwcyIKLQlkZXBlbmRzIG9uIENHUk9VUFMgJiYgRVhQRVJJTUVOVEFMCi0JaGVscAotCSAgUHJvdmlkZXMgYSBjZ3JvdXAgaW1wbGVtZW50aW5nIHdoaXRlbGlzdHMgZm9yIGRldmljZXMgd2hpY2gKLQkgIGEgcHJvY2VzcyBpbiB0aGUgY2dyb3VwIGNhbiBta25vZCBvciBvcGVuLgotCi1jb25maWcgQ1BVU0VUUwotCWJvb2wgIkNwdXNldCBzdXBwb3J0IgotCWRlcGVuZHMgb24gU01QICYmIENHUk9VUFMKLQloZWxwCi0JICBUaGlzIG9wdGlvbiB3aWxsIGxldCB5b3UgY3JlYXRlIGFuZCBtYW5hZ2UgQ1BVU0VUcyB3aGljaAotCSAgYWxsb3cgZHluYW1pY2FsbHkgcGFydGl0aW9uaW5nIGEgc3lzdGVtIGludG8gc2V0cyBvZiBDUFVzIGFuZAotCSAgTWVtb3J5IE5vZGVzIGFuZCBhc3NpZ25pbmcgdGFza3MgdG8gcnVuIG9ubHkgd2l0aGluIHRob3NlIHNldHMuCi0JICBUaGlzIGlzIHByaW1hcmlseSB1c2VmdWwgb24gbGFyZ2UgU01QIG9yIE5VTUEgc3lzdGVtcy4KLQotCSAgU2F5IE4gaWYgdW5zdXJlLgotCiAjCiAjIEFyY2hpdGVjdHVyZXMgd2l0aCBhbiB1bnJlbGlhYmxlIHNjaGVkX2Nsb2NrKCkgc2hvdWxkIHNlbGVjdCB0aGlzOgogIwpAQCAtMzM3LDYgKzI4NCw4IEBACiAJaGVscAogCSAgVGhpcyBmZWF0dXJlIGxldHMgQ1BVIHNjaGVkdWxlciByZWNvZ25pemUgdGFzayBncm91cHMgYW5kIGNvbnRyb2wgQ1BVCiAJICBiYW5kd2lkdGggYWxsb2NhdGlvbiB0byBzdWNoIHRhc2sgZ3JvdXBzLgorCSAgSW4gb3JkZXIgdG8gY3JlYXRlIGEgZ3JvdXAgZnJvbSBhcmJpdHJhcnkgc2V0IG9mIHByb2Nlc3NlcywgdXNlCisJICBDT05GSUdfQ0dST1VQUy4gKFNlZSBDb250cm9sIEdyb3VwIHN1cHBvcnQuKQogCiBjb25maWcgRkFJUl9HUk9VUF9TQ0hFRAogCWJvb2wgIkdyb3VwIHNjaGVkdWxpbmcgZm9yIFNDSEVEX09USEVSIgpAQCAtMzc0LDI4ICszMjMsOTAgQEAKIAkgIFRoaXMgb3B0aW9uIGFsbG93cyB5b3UgdG8gY3JlYXRlIGFyYml0cmFyeSB0YXNrIGdyb3VwcwogCSAgdXNpbmcgdGhlICJjZ3JvdXAiIHBzZXVkbyBmaWxlc3lzdGVtIGFuZCBjb250cm9sCiAJICB0aGUgY3B1IGJhbmR3aWR0aCBhbGxvY2F0ZWQgdG8gZWFjaCBzdWNoIHRhc2sgZ3JvdXAuCi0JICBSZWZlciB0byBEb2N1bWVudGF0aW9uL2Nncm91cHMudHh0IGZvciBtb3JlIGluZm9ybWF0aW9uCi0JICBvbiAiY2dyb3VwIiBwc2V1ZG8gZmlsZXN5c3RlbS4KKwkgIFJlZmVyIHRvIERvY3VtZW50YXRpb24vY2dyb3Vwcy9jZ3JvdXBzLnR4dCBmb3IgbW9yZQorCSAgaW5mb3JtYXRpb24gb24gImNncm91cCIgcHNldWRvIGZpbGVzeXN0ZW0uCiAKIGVuZGNob2ljZQogCittZW51Y29uZmlnIENHUk9VUFMKKwlib29sZWFuICJDb250cm9sIEdyb3VwIHN1cHBvcnQiCisJaGVscAorCSAgVGhpcyBvcHRpb24gYWRkcyBzdXBwb3J0IGZvciBncm91cGluZyBzZXRzIG9mIHByb2Nlc3NlcyB0b2dldGhlciwgZm9yCisJICB1c2Ugd2l0aCBwcm9jZXNzIGNvbnRyb2wgc3Vic3lzdGVtcyBzdWNoIGFzIENwdXNldHMsIENGUywgbWVtb3J5CisJICBjb250cm9scyBvciBkZXZpY2UgaXNvbGF0aW9uLgorCSAgU2VlCisJCS0gRG9jdW1lbnRhdGlvbi9zY2hlZHVsZXIvc2NoZWQtZGVzaWduLUNGUy50eHQJKENGUykKKwkJLSBEb2N1bWVudGF0aW9uL2Nncm91cHMvIChmZWF0dXJlcyBmb3IgZ3JvdXBpbmcsIGlzb2xhdGlvbgorCQkJCQkgIGFuZCByZXNvdXJjZSBjb250cm9sKQorCisJICBTYXkgTiBpZiB1bnN1cmUuCisKK2lmIENHUk9VUFMKKworY29uZmlnIENHUk9VUF9ERUJVRworCWJvb2wgIkV4YW1wbGUgZGVidWcgY2dyb3VwIHN1YnN5c3RlbSIKKwlkZXBlbmRzIG9uIENHUk9VUFMKKwlkZWZhdWx0IG4KKwloZWxwCisJICBUaGlzIG9wdGlvbiBlbmFibGVzIGEgc2ltcGxlIGNncm91cCBzdWJzeXN0ZW0gdGhhdAorCSAgZXhwb3J0cyB1c2VmdWwgZGVidWdnaW5nIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjZ3JvdXBzCisJICBmcmFtZXdvcmsuCisKKwkgIFNheSBOIGlmIHVuc3VyZS4KKworY29uZmlnIENHUk9VUF9OUworCWJvb2wgIk5hbWVzcGFjZSBjZ3JvdXAgc3Vic3lzdGVtIgorCWRlcGVuZHMgb24gQ0dST1VQUworCWhlbHAKKwkgIFByb3ZpZGVzIGEgc2ltcGxlIG5hbWVzcGFjZSBjZ3JvdXAgc3Vic3lzdGVtIHRvCisJICBwcm92aWRlIGhpZXJhcmNoaWNhbCBuYW1pbmcgb2Ygc2V0cyBvZiBuYW1lc3BhY2VzLAorCSAgZm9yIGluc3RhbmNlIHZpcnR1YWwgc2VydmVycyBhbmQgY2hlY2twb2ludC9yZXN0YXJ0CisJICBqb2JzLgorCitjb25maWcgQ0dST1VQX0ZSRUVaRVIKKwlib29sICJGcmVlemVyIGNncm91cCBzdWJzeXN0ZW0iCisJZGVwZW5kcyBvbiBDR1JPVVBTCisJaGVscAorCSAgUHJvdmlkZXMgYSB3YXkgdG8gZnJlZXplIGFuZCB1bmZyZWV6ZSBhbGwgdGFza3MgaW4gYQorCSAgY2dyb3VwLgorCitjb25maWcgQ0dST1VQX0RFVklDRQorCWJvb2wgIkRldmljZSBjb250cm9sbGVyIGZvciBjZ3JvdXBzIgorCWRlcGVuZHMgb24gQ0dST1VQUyAmJiBFWFBFUklNRU5UQUwKKwloZWxwCisJICBQcm92aWRlcyBhIGNncm91cCBpbXBsZW1lbnRpbmcgd2hpdGVsaXN0cyBmb3IgZGV2aWNlcyB3aGljaAorCSAgYSBwcm9jZXNzIGluIHRoZSBjZ3JvdXAgY2FuIG1rbm9kIG9yIG9wZW4uCisKK2NvbmZpZyBDUFVTRVRTCisJYm9vbCAiQ3B1c2V0IHN1cHBvcnQiCisJZGVwZW5kcyBvbiBTTVAgJiYgQ0dST1VQUworCWhlbHAKKwkgIFRoaXMgb3B0aW9uIHdpbGwgbGV0IHlvdSBjcmVhdGUgYW5kIG1hbmFnZSBDUFVTRVRzIHdoaWNoCisJICBhbGxvdyBkeW5hbWljYWxseSBwYXJ0aXRpb25pbmcgYSBzeXN0ZW0gaW50byBzZXRzIG9mIENQVXMgYW5kCisJICBNZW1vcnkgTm9kZXMgYW5kIGFzc2lnbmluZyB0YXNrcyB0byBydW4gb25seSB3aXRoaW4gdGhvc2Ugc2V0cy4KKwkgIFRoaXMgaXMgcHJpbWFyaWx5IHVzZWZ1bCBvbiBsYXJnZSBTTVAgb3IgTlVNQSBzeXN0ZW1zLgorCisJICBTYXkgTiBpZiB1bnN1cmUuCisKK2NvbmZpZyBQUk9DX1BJRF9DUFVTRVQKKwlib29sICJJbmNsdWRlIGxlZ2FjeSAvcHJvYy88cGlkPi9jcHVzZXQgZmlsZSIKKwlkZXBlbmRzIG9uIENQVVNFVFMKKwlkZWZhdWx0IHkKKwogY29uZmlnIENHUk9VUF9DUFVBQ0NUCiAJYm9vbCAiU2ltcGxlIENQVSBhY2NvdW50aW5nIGNncm91cCBzdWJzeXN0ZW0iCiAJZGVwZW5kcyBvbiBDR1JPVVBTCiAJaGVscAogCSAgUHJvdmlkZXMgYSBzaW1wbGUgUmVzb3VyY2UgQ29udHJvbGxlciBmb3IgbW9uaXRvcmluZyB0aGUKLQkgIHRvdGFsIENQVSBjb25zdW1lZCBieSB0aGUgdGFza3MgaW4gYSBjZ3JvdXAKKwkgIHRvdGFsIENQVSBjb25zdW1lZCBieSB0aGUgdGFza3MgaW4gYSBjZ3JvdXAuCiAKIGNvbmZpZyBSRVNPVVJDRV9DT1VOVEVSUwogCWJvb2wgIlJlc291cmNlIGNvdW50ZXJzIgogCWhlbHAKIAkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgY29udHJvbGxlciBpbmRlcGVuZGVudCByZXNvdXJjZSBhY2NvdW50aW5nCi0gICAgICAgICAgaW5mcmFzdHJ1Y3R1cmUgdGhhdCB3b3JrcyB3aXRoIGNncm91cHMKKwkgIGluZnJhc3RydWN0dXJlIHRoYXQgd29ya3Mgd2l0aCBjZ3JvdXBzLgogCWRlcGVuZHMgb24gQ0dST1VQUwogCi1jb25maWcgTU1fT1dORVIKLQlib29sCi0KIGNvbmZpZyBDR1JPVVBfTUVNX1JFU19DVExSCiAJYm9vbCAiTWVtb3J5IFJlc291cmNlIENvbnRyb2xsZXIgZm9yIENvbnRyb2wgR3JvdXBzIgogCWRlcGVuZHMgb24gQ0dST1VQUyAmJiBSRVNPVVJDRV9DT1VOVEVSUwpAQCAtNDE0LDExICs0MjUsMzIgQEAKIAkgIHN1cmUgeW91IG5lZWQgdGhlIG1lbW9yeSByZXNvdXJjZSBjb250cm9sbGVyLiBFdmVuIHdoZW4geW91IGVuYWJsZQogCSAgdGhpcywgeW91IGNhbiBzZXQgImNncm91cF9kaXNhYmxlPW1lbW9yeSIgYXQgeW91ciBib290IG9wdGlvbiB0bwogCSAgZGlzYWJsZSBtZW1vcnkgcmVzb3VyY2UgY29udHJvbGxlciBhbmQgeW91IGNhbiBhdm9pZCBvdmVyaGVhZHMuCi0JICAoYW5kIGxvc2UgYmVuZWZpdHMgb2YgbWVtb3J5IHJlc291cmNlIGNvbnRvbGxlcikKKwkgIChhbmQgbG9zZSBiZW5lZml0cyBvZiBtZW1vcnkgcmVzb3VyY2UgY29udHJvbGxlcikKIAogCSAgVGhpcyBjb25maWcgb3B0aW9uIGFsc28gc2VsZWN0cyBNTV9PV05FUiBjb25maWcgb3B0aW9uLCB3aGljaAogCSAgY291bGQgaW4gdHVybiBhZGQgc29tZSBmb3JrL2V4aXQgb3ZlcmhlYWQuCiAKK2NvbmZpZyBDR1JPVVBfTUVNX1JFU19DVExSX1NXQVAKKwlib29sICJNZW1vcnkgUmVzb3VyY2UgQ29udHJvbGxlciBTd2FwIEV4dGVuc2lvbihFWFBFUklNRU5UQUwpIgorCWRlcGVuZHMgb24gQ0dST1VQX01FTV9SRVNfQ1RMUiAmJiBTV0FQICYmIEVYUEVSSU1FTlRBTAorCWhlbHAKKwkgIEFkZCBzd2FwIG1hbmFnZW1lbnQgZmVhdHVyZSB0byBtZW1vcnkgcmVzb3VyY2UgY29udHJvbGxlci4gV2hlbiB5b3UKKwkgIGVuYWJsZSB0aGlzLCB5b3UgY2FuIGxpbWl0IG1lbStzd2FwIHVzYWdlIHBlciBjZ3JvdXAuIEluIG90aGVyIHdvcmRzLAorCSAgd2hlbiB5b3UgZGlzYWJsZSB0aGlzLCBtZW1vcnkgcmVzb3VyY2UgY29udHJvbGxlciBoYXMgbm8gY2FyZXMgdG8KKwkgIHVzYWdlIG9mIHN3YXAuLi5hIHByb2Nlc3MgY2FuIGV4aGF1c3QgYWxsIG9mIHRoZSBzd2FwLiBUaGlzIGV4dGVuc2lvbgorCSAgaXMgdXNlZnVsIHdoZW4geW91IHdhbnQgdG8gYXZvaWQgZXhoYXVzdGlvbiBzd2FwIGJ1dCB0aGlzIGl0c2VsZgorCSAgYWRkcyBtb3JlIG92ZXJoZWFkcyBhbmQgY29uc3VtZXMgbWVtb3J5IGZvciByZW1lbWJlcmluZyBpbmZvcm1hdGlvbi4KKwkgIEVzcGVjaWFsbHkgaWYgeW91IHVzZSAzMmJpdCBzeXN0ZW0gb3Igc21hbGwgbWVtb3J5IHN5c3RlbSwgcGxlYXNlCisJICBiZSBjYXJlZnVsIGFib3V0IGVuYWJsaW5nIHRoaXMuIFdoZW4gbWVtb3J5IHJlc291cmNlIGNvbnRyb2xsZXIKKwkgIGlzIGRpc2FibGVkIGJ5IGJvb3Qgb3B0aW9uLCB0aGlzIHdpbGwgYmUgYXV0b21hdGljYWxseSBkaXNhYmxlZCBhbmQKKwkgIHRoZXJlIHdpbGwgYmUgbm8gb3ZlcmhlYWQgZnJvbSB0aGlzLiBFdmVuIHdoZW4geW91IHNldCB0aGlzIGNvbmZpZz15LAorCSAgaWYgYm9vdCBvcHRpb24gIm5vc3dhcGFjY291bnQiIGlzIHNldCwgc3dhcCB3aWxsIG5vdCBiZSBhY2NvdW50ZWQuCisKK2VuZGlmICMgQ0dST1VQUworCitjb25maWcgTU1fT1dORVIKKwlib29sCisKIGNvbmZpZyBTWVNGU19ERVBSRUNBVEVECiAJYm9vbAogCkBAIC00NTUsMTEgKzQ4Nyw2IEBACiAJICBpZiB0aGUgb3JpZ2luYWwga2VybmVsLCB0aGF0IGNhbWUgd2l0aCB5b3VyIGRpc3RyaWJ1dGlvbiwgaGFzCiAJICB0aGlzIG9wdGlvbiBzZXQgdG8gTi4KIAotY29uZmlnIFBST0NfUElEX0NQVVNFVAotCWJvb2wgIkluY2x1ZGUgbGVnYWN5IC9wcm9jLzxwaWQ+L2NwdXNldCBmaWxlIgotCWRlcGVuZHMgb24gQ1BVU0VUUwotCWRlZmF1bHQgeQotCiBjb25maWcgUkVMQVkKIAlib29sICJLZXJuZWwtPnVzZXIgc3BhY2UgcmVsYXkgc3VwcG9ydCAoZm9ybWVybHkgcmVsYXlmcykiCiAJaGVscApkaWZmIC0tZ2l0IGEvaW5pdC9kb19tb3VudHMuYyBiL2luaXQvZG9fbW91bnRzLmMKaW5kZXggNWVmY2E3My4uNzA4MTA1ZSAxMDA2NDQKLS0tIGEvaW5pdC9kb19tb3VudHMuYworKysgYi9pbml0L2RvX21vdW50cy5jCkBAIC0xMyw2ICsxMyw3IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdHJkLmg+CisjaW5jbHVkZSA8bGludXgvYXN5bmMuaD4KIAogI2luY2x1ZGUgPGxpbnV4L25mc19mcy5oPgogI2luY2x1ZGUgPGxpbnV4L25mc19mc19zYi5oPgpAQCAtMzcyLDYgKzM3Myw3IEBACiAJLyogd2FpdCBmb3IgdGhlIGtub3duIGRldmljZXMgdG8gY29tcGxldGUgdGhlaXIgcHJvYmluZyAqLwogCXdoaWxlIChkcml2ZXJfcHJvYmVfZG9uZSgpICE9IDApCiAJCW1zbGVlcCgxMDApOworCWFzeW5jX3N5bmNocm9uaXplX2Z1bGwoKTsKIAogCW1kX3J1bl9zZXR1cCgpOwogCmRpZmYgLS1naXQgYS9pbml0L2RvX21vdW50c19yZC5jIGIvaW5pdC9kb19tb3VudHNfcmQuYwppbmRleCBhN2M3NDhmLi4wZjBmMGNmIDEwMDY0NAotLS0gYS9pbml0L2RvX21vdW50c19yZC5jCisrKyBiL2luaXQvZG9fbW91bnRzX3JkLmMKQEAgLTksNiArOSw3IEBACiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAKICNpbmNsdWRlICJkb19tb3VudHMuaCIKKyNpbmNsdWRlICIuLi9mcy9zcXVhc2hmcy9zcXVhc2hmc19mcy5oIgogCiBpbnQgX19pbml0ZGF0YSByZF9wcm9tcHQgPSAxOy8qIDEgPSBwcm9tcHQgZm9yIFJBTSBkaXNrLCAwID0gZG9uJ3QgcHJvbXB0ICovCiAKQEAgLTQxLDYgKzQyLDcgQEAKICAqIAlleHQyCiAgKglyb21mcwogICoJY3JhbWZzCisgKglzcXVhc2hmcwogICogCWd6aXAKICAqLwogc3RhdGljIGludCBfX2luaXQgCkBAIC01MSw2ICs1Myw3IEBACiAJc3RydWN0IGV4dDJfc3VwZXJfYmxvY2sgKmV4dDJzYjsKIAlzdHJ1Y3Qgcm9tZnNfc3VwZXJfYmxvY2sgKnJvbWZzYjsKIAlzdHJ1Y3QgY3JhbWZzX3N1cGVyICpjcmFtZnNiOworCXN0cnVjdCBzcXVhc2hmc19zdXBlcl9ibG9jayAqc3F1YXNoZnNiOwogCWludCBuYmxvY2tzID0gLTE7CiAJdW5zaWduZWQgY2hhciAqYnVmOwogCkBAIC02Miw2ICs2NSw3IEBACiAJZXh0MnNiID0gKHN0cnVjdCBleHQyX3N1cGVyX2Jsb2NrICopIGJ1ZjsKIAlyb21mc2IgPSAoc3RydWN0IHJvbWZzX3N1cGVyX2Jsb2NrICopIGJ1ZjsKIAljcmFtZnNiID0gKHN0cnVjdCBjcmFtZnNfc3VwZXIgKikgYnVmOworCXNxdWFzaGZzYiA9IChzdHJ1Y3Qgc3F1YXNoZnNfc3VwZXJfYmxvY2sgKikgYnVmOwogCW1lbXNldChidWYsIDB4ZTUsIHNpemUpOwogCiAJLyoKQEAgLTk5LDYgKzEwMywxNiBAQAogCQlnb3RvIGRvbmU7CiAJfQogCisJLyogc3F1YXNoZnMgaXMgYXQgYmxvY2sgemVybyB0b28gKi8KKwlpZiAobGUzMl90b19jcHUoc3F1YXNoZnNiLT5zX21hZ2ljKSA9PSBTUVVBU0hGU19NQUdJQykgeworCQlwcmludGsoS0VSTl9OT1RJQ0UKKwkJICAgICAgICJSQU1ESVNLOiBzcXVhc2hmcyBmaWxlc3lzdGVtIGZvdW5kIGF0IGJsb2NrICVkXG4iLAorCQkgICAgICAgc3RhcnRfYmxvY2spOworCQluYmxvY2tzID0gKGxlNjRfdG9fY3B1KHNxdWFzaGZzYi0+Ynl0ZXNfdXNlZCkgKyBCTE9DS19TSVpFIC0gMSkKKwkJCSA+PiBCTE9DS19TSVpFX0JJVFM7CisJCWdvdG8gZG9uZTsKKwl9CisKIAkvKgogCSAqIFJlYWQgYmxvY2sgMSB0byB0ZXN0IGZvciBtaW5peCBhbmQgZXh0MiBzdXBlcmJsb2NrCiAJICovCmRpZmYgLS1naXQgYS9pbml0L2luaXRyYW1mcy5jIGIvaW5pdC9pbml0cmFtZnMuYwppbmRleCA0ZjViYTc1Li5kOWM5NDFjIDEwMDY0NAotLS0gYS9pbml0L2luaXRyYW1mcy5jCisrKyBiL2luaXQvaW5pdHJhbWZzLmMKQEAgLTMxNyw2ICszMTcsNyBAQAogCQkJaWYgKHdmZCA+PSAwKSB7CiAJCQkJc3lzX2ZjaG93bih3ZmQsIHVpZCwgZ2lkKTsKIAkJCQlzeXNfZmNobW9kKHdmZCwgbW9kZSk7CisJCQkJc3lzX2Z0cnVuY2F0ZSh3ZmQsIGJvZHlfbGVuKTsKIAkJCQl2Y29sbGVjdGVkID0ga3N0cmR1cChjb2xsZWN0ZWQsIEdGUF9LRVJORUwpOwogCQkJCXN0YXRlID0gQ29weUZpbGU7CiAJCQl9CmRpZmYgLS1naXQgYS9pbml0L21haW4uYyBiL2luaXQvbWFpbi5jCmluZGV4IGI1YTg5MmMuLjg0NDIwOTQgMTAwNjQ0Ci0tLSBhL2luaXQvbWFpbi5jCisrKyBiL2luaXQvbWFpbi5jCkBAIC02Miw2ICs2Miw3IEBACiAjaW5jbHVkZSA8bGludXgvc2lnbmFsLmg+CiAjaW5jbHVkZSA8bGludXgvaWRyLmg+CiAjaW5jbHVkZSA8bGludXgvZnRyYWNlLmg+CisjaW5jbHVkZSA8bGludXgvYXN5bmMuaD4KICNpbmNsdWRlIDx0cmFjZS9ib290Lmg+CiAKICNpbmNsdWRlIDxhc20vaW8uaD4KQEAgLTU5OSw3ICs2MDAsOCBAQAogCXNjaGVkX2Nsb2NrX2luaXQoKTsKIAlwcm9maWxlX2luaXQoKTsKIAlpZiAoIWlycXNfZGlzYWJsZWQoKSkKLQkJcHJpbnRrKCJzdGFydF9rZXJuZWwoKTogYnVnOiBpbnRlcnJ1cHRzIHdlcmUgZW5hYmxlZCBlYXJseVxuIik7CisJCXByaW50ayhLRVJOX0NSSVQgInN0YXJ0X2tlcm5lbCgpOiBidWc6IGludGVycnVwdHMgd2VyZSAiCisJCQkJICJlbmFibGVkIGVhcmx5XG4iKTsKIAllYXJseV9ib290X2lycXNfb24oKTsKIAlsb2NhbF9pcnFfZW5hYmxlKCk7CiAKQEAgLTY4NCw3ICs2ODYsNyBAQAogCXJlc3RfaW5pdCgpOwogfQogCi1zdGF0aWMgaW50IGluaXRjYWxsX2RlYnVnOworaW50IGluaXRjYWxsX2RlYnVnOwogY29yZV9wYXJhbShpbml0Y2FsbF9kZWJ1ZywgaW5pdGNhbGxfZGVidWcsIGJvb2wsIDA2NDQpOwogCiBpbnQgZG9fb25lX2luaXRjYWxsKGluaXRjYWxsX3QgZm4pCkBAIC03ODUsNiArNzg3LDggQEAKICAqLwogc3RhdGljIG5vaW5saW5lIGludCBpbml0X3Bvc3Qodm9pZCkKIHsKKwkvKiBuZWVkIHRvIGZpbmlzaCBhbGwgYXN5bmMgX19pbml0IGNvZGUgYmVmb3JlIGZyZWVpbmcgdGhlIG1lbW9yeSAqLworCWFzeW5jX3N5bmNocm9uaXplX2Z1bGwoKTsKIAlmcmVlX2luaXRtZW0oKTsKIAl1bmxvY2tfa2VybmVsKCk7CiAJbWFya19yb2RhdGFfcm8oKTsKZGlmZiAtLWdpdCBhL2lwYy9tcXVldWUuYyBiL2lwYy9tcXVldWUuYwppbmRleCBlZGRiNjI0Li41NGI0MDc3IDEwMDY0NAotLS0gYS9pcGMvbXF1ZXVlLmMKKysrIGIvaXBjL21xdWV1ZS5jCkBAIC01MDUsNyArNTA1LDggQEAKIAkJCXNpZ19pLnNpX2Vycm5vID0gMDsKIAkJCXNpZ19pLnNpX2NvZGUgPSBTSV9NRVNHUTsKIAkJCXNpZ19pLnNpX3ZhbHVlID0gaW5mby0+bm90aWZ5LnNpZ2V2X3ZhbHVlOwotCQkJc2lnX2kuc2lfcGlkID0gdGFza190Z2lkX3ZucihjdXJyZW50KTsKKwkJCXNpZ19pLnNpX3BpZCA9IHRhc2tfdGdpZF9ucl9ucyhjdXJyZW50LAorCQkJCQkJbnNfb2ZfcGlkKGluZm8tPm5vdGlmeV9vd25lcikpOwogCQkJc2lnX2kuc2lfdWlkID0gY3VycmVudF91aWQoKTsKIAogCQkJa2lsbF9waWRfaW5mbyhpbmZvLT5ub3RpZnkuc2lnZXZfc2lnbm8sCkBAIC02NDksOCArNjUwLDggQEAKIAlyZXR1cm4gZGVudHJ5X29wZW4oZGVudHJ5LCBtcXVldWVfbW50LCBvZmxhZywgY3JlZCk7CiB9CiAKLWFzbWxpbmthZ2UgbG9uZyBzeXNfbXFfb3Blbihjb25zdCBjaGFyIF9fdXNlciAqdV9uYW1lLCBpbnQgb2ZsYWcsIG1vZGVfdCBtb2RlLAotCQkJCXN0cnVjdCBtcV9hdHRyIF9fdXNlciAqdV9hdHRyKQorU1lTQ0FMTF9ERUZJTkU0KG1xX29wZW4sIGNvbnN0IGNoYXIgX191c2VyICosIHVfbmFtZSwgaW50LCBvZmxhZywgbW9kZV90LCBtb2RlLAorCQlzdHJ1Y3QgbXFfYXR0ciBfX3VzZXIgKiwgdV9hdHRyKQogewogCXN0cnVjdCBkZW50cnkgKmRlbnRyeTsKIAlzdHJ1Y3QgZmlsZSAqZmlscDsKQEAgLTcyMCw3ICs3MjEsNyBAQAogCXJldHVybiBmZDsKIH0KIAotYXNtbGlua2FnZSBsb25nIHN5c19tcV91bmxpbmsoY29uc3QgY2hhciBfX3VzZXIgKnVfbmFtZSkKK1NZU0NBTExfREVGSU5FMShtcV91bmxpbmssIGNvbnN0IGNoYXIgX191c2VyICosIHVfbmFtZSkKIHsKIAlpbnQgZXJyOwogCWNoYXIgKm5hbWU7CkBAIC04MTMsOSArODE0LDkgQEAKIAlzZW5kZXItPnN0YXRlID0gU1RBVEVfUkVBRFk7CiB9CiAKLWFzbWxpbmthZ2UgbG9uZyBzeXNfbXFfdGltZWRzZW5kKG1xZF90IG1xZGVzLCBjb25zdCBjaGFyIF9fdXNlciAqdV9tc2dfcHRyLAotCXNpemVfdCBtc2dfbGVuLCB1bnNpZ25lZCBpbnQgbXNnX3ByaW8sCi0JY29uc3Qgc3RydWN0IHRpbWVzcGVjIF9fdXNlciAqdV9hYnNfdGltZW91dCkKK1NZU0NBTExfREVGSU5FNShtcV90aW1lZHNlbmQsIG1xZF90LCBtcWRlcywgY29uc3QgY2hhciBfX3VzZXIgKiwgdV9tc2dfcHRyLAorCQlzaXplX3QsIG1zZ19sZW4sIHVuc2lnbmVkIGludCwgbXNnX3ByaW8sCisJCWNvbnN0IHN0cnVjdCB0aW1lc3BlYyBfX3VzZXIgKiwgdV9hYnNfdGltZW91dCkKIHsKIAlzdHJ1Y3QgZmlsZSAqZmlscDsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlOwpAQCAtOTA2LDkgKzkwNyw5IEBACiAJcmV0dXJuIHJldDsKIH0KIAotYXNtbGlua2FnZSBzc2l6ZV90IHN5c19tcV90aW1lZHJlY2VpdmUobXFkX3QgbXFkZXMsIGNoYXIgX191c2VyICp1X21zZ19wdHIsCi0Jc2l6ZV90IG1zZ19sZW4sIHVuc2lnbmVkIGludCBfX3VzZXIgKnVfbXNnX3ByaW8sCi0JY29uc3Qgc3RydWN0IHRpbWVzcGVjIF9fdXNlciAqdV9hYnNfdGltZW91dCkKK1NZU0NBTExfREVGSU5FNShtcV90aW1lZHJlY2VpdmUsIG1xZF90LCBtcWRlcywgY2hhciBfX3VzZXIgKiwgdV9tc2dfcHRyLAorCQlzaXplX3QsIG1zZ19sZW4sIHVuc2lnbmVkIGludCBfX3VzZXIgKiwgdV9tc2dfcHJpbywKKwkJY29uc3Qgc3RydWN0IHRpbWVzcGVjIF9fdXNlciAqLCB1X2Fic190aW1lb3V0KQogewogCWxvbmcgdGltZW91dDsKIAlzc2l6ZV90IHJldDsKQEAgLTk5Niw4ICs5OTcsOCBAQAogICogYW5kIGhlIGlzbid0IGN1cnJlbnRseSBvd25lciBvZiBub3RpZmljYXRpb24sIHdpbGwgYmUgc2lsZW50bHkgZGlzY2FyZGVkLgogICogSXQgaXNuJ3QgZXhwbGljaXRseSBkZWZpbmVkIGluIHRoZSBQT1NJWC4KICAqLwotYXNtbGlua2FnZSBsb25nIHN5c19tcV9ub3RpZnkobXFkX3QgbXFkZXMsCi0JCQkJY29uc3Qgc3RydWN0IHNpZ2V2ZW50IF9fdXNlciAqdV9ub3RpZmljYXRpb24pCitTWVNDQUxMX0RFRklORTIobXFfbm90aWZ5LCBtcWRfdCwgbXFkZXMsCisJCWNvbnN0IHN0cnVjdCBzaWdldmVudCBfX3VzZXIgKiwgdV9ub3RpZmljYXRpb24pCiB7CiAJaW50IHJldDsKIAlzdHJ1Y3QgZmlsZSAqZmlscDsKQEAgLTExMjIsOSArMTEyMyw5IEBACiAJcmV0dXJuIHJldDsKIH0KIAotYXNtbGlua2FnZSBsb25nIHN5c19tcV9nZXRzZXRhdHRyKG1xZF90IG1xZGVzLAotCQkJY29uc3Qgc3RydWN0IG1xX2F0dHIgX191c2VyICp1X21xc3RhdCwKLQkJCXN0cnVjdCBtcV9hdHRyIF9fdXNlciAqdV9vbXFzdGF0KQorU1lTQ0FMTF9ERUZJTkUzKG1xX2dldHNldGF0dHIsIG1xZF90LCBtcWRlcywKKwkJY29uc3Qgc3RydWN0IG1xX2F0dHIgX191c2VyICosIHVfbXFzdGF0LAorCQlzdHJ1Y3QgbXFfYXR0ciBfX3VzZXIgKiwgdV9vbXFzdGF0KQogewogCWludCByZXQ7CiAJc3RydWN0IG1xX2F0dHIgbXFzdGF0LCBvbXFzdGF0OwpkaWZmIC0tZ2l0IGEvaXBjL21zZy5jIGIvaXBjL21zZy5jCmluZGV4IGI0ZWVlMWMuLjJjZWFiN2YgMTAwNjQ0Ci0tLSBhL2lwYy9tc2cuYworKysgYi9pcGMvbXNnLmMKQEAgLTMwOSw3ICszMDksNyBAQAogCXJldHVybiBzZWN1cml0eV9tc2dfcXVldWVfYXNzb2NpYXRlKG1zcSwgbXNnZmxnKTsKIH0KIAotYXNtbGlua2FnZSBsb25nIHN5c19tc2dnZXQoa2V5X3Qga2V5LCBpbnQgbXNnZmxnKQorU1lTQ0FMTF9ERUZJTkUyKG1zZ2dldCwga2V5X3QsIGtleSwgaW50LCBtc2dmbGcpCiB7CiAJc3RydWN0IGlwY19uYW1lc3BhY2UgKm5zOwogCXN0cnVjdCBpcGNfb3BzIG1zZ19vcHM7CkBAIC00NjYsNyArNDY2LDcgQEAKIAlyZXR1cm4gZXJyOwogfQogCi1hc21saW5rYWdlIGxvbmcgc3lzX21zZ2N0bChpbnQgbXNxaWQsIGludCBjbWQsIHN0cnVjdCBtc3FpZF9kcyBfX3VzZXIgKmJ1ZikKK1NZU0NBTExfREVGSU5FMyhtc2djdGwsIGludCwgbXNxaWQsIGludCwgY21kLCBzdHJ1Y3QgbXNxaWRfZHMgX191c2VyICosIGJ1ZikKIHsKIAlzdHJ1Y3QgbXNnX3F1ZXVlICptc3E7CiAJaW50IGVyciwgdmVyc2lvbjsKQEAgLTcyMyw4ICs3MjMsOCBAQAogCXJldHVybiBlcnI7CiB9CiAKLWFzbWxpbmthZ2UgbG9uZwotc3lzX21zZ3NuZChpbnQgbXNxaWQsIHN0cnVjdCBtc2didWYgX191c2VyICptc2dwLCBzaXplX3QgbXNnc3osIGludCBtc2dmbGcpCitTWVNDQUxMX0RFRklORTQobXNnc25kLCBpbnQsIG1zcWlkLCBzdHJ1Y3QgbXNnYnVmIF9fdXNlciAqLCBtc2dwLCBzaXplX3QsIG1zZ3N6LAorCQlpbnQsIG1zZ2ZsZykKIHsKIAlsb25nIG10eXBlOwogCkBAIC05MDQsOCArOTA0LDggQEAKIAlyZXR1cm4gbXNnc3o7CiB9CiAKLWFzbWxpbmthZ2UgbG9uZyBzeXNfbXNncmN2KGludCBtc3FpZCwgc3RydWN0IG1zZ2J1ZiBfX3VzZXIgKm1zZ3AsIHNpemVfdCBtc2dzeiwKLQkJCSAgIGxvbmcgbXNndHlwLCBpbnQgbXNnZmxnKQorU1lTQ0FMTF9ERUZJTkU1KG1zZ3JjdiwgaW50LCBtc3FpZCwgc3RydWN0IG1zZ2J1ZiBfX3VzZXIgKiwgbXNncCwgc2l6ZV90LCBtc2dzeiwKKwkJbG9uZywgbXNndHlwLCBpbnQsIG1zZ2ZsZykKIHsKIAlsb25nIGVyciwgbXR5cGU7CiAKZGlmZiAtLWdpdCBhL2lwYy9zZW0uYyBiL2lwYy9zZW0uYwppbmRleCBjNjhjZDNmLi4xNmEyMTg5IDEwMDY0NAotLS0gYS9pcGMvc2VtLmMKKysrIGIvaXBjL3NlbS5jCkBAIC0zMDgsNyArMzA4LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotYXNtbGlua2FnZSBsb25nIHN5c19zZW1nZXQoa2V5X3Qga2V5LCBpbnQgbnNlbXMsIGludCBzZW1mbGcpCitTWVNDQUxMX0RFRklORTMoc2VtZ2V0LCBrZXlfdCwga2V5LCBpbnQsIG5zZW1zLCBpbnQsIHNlbWZsZykKIHsKIAlzdHJ1Y3QgaXBjX25hbWVzcGFjZSAqbnM7CiAJc3RydWN0IGlwY19vcHMgc2VtX29wczsKQEAgLTg4Nyw3ICs4ODcsNyBAQAogCXJldHVybiBlcnI7CiB9CiAKLWFzbWxpbmthZ2UgbG9uZyBzeXNfc2VtY3RsIChpbnQgc2VtaWQsIGludCBzZW1udW0sIGludCBjbWQsIHVuaW9uIHNlbXVuIGFyZykKK1NZU0NBTExfREVGSU5FKHNlbWN0bCkoaW50IHNlbWlkLCBpbnQgc2VtbnVtLCBpbnQgY21kLCB1bmlvbiBzZW11biBhcmcpCiB7CiAJaW50IGVyciA9IC1FSU5WQUw7CiAJaW50IHZlcnNpb247CkBAIC05MjMsNiArOTIzLDEzIEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIH0KKyNpZmRlZiBDT05GSUdfSEFWRV9TWVNDQUxMX1dSQVBQRVJTCithc21saW5rYWdlIGxvbmcgU3lTX3NlbWN0bChpbnQgc2VtaWQsIGludCBzZW1udW0sIGludCBjbWQsIHVuaW9uIHNlbXVuIGFyZykKK3sKKwlyZXR1cm4gU1lTQ19zZW1jdGwoKGludCkgc2VtaWQsIChpbnQpIHNlbW51bSwgKGludCkgY21kLCBhcmcpOworfQorU1lTQ0FMTF9BTElBUyhzeXNfc2VtY3RsLCBTeVNfc2VtY3RsKTsKKyNlbmRpZgogCiAvKiBJZiB0aGUgdGFzayBkb2Vzbid0IGFscmVhZHkgaGF2ZSBhIHVuZG9fbGlzdCwgdGhlbiBhbGxvY2F0ZSBvbmUKICAqIGhlcmUuICBXZSBndWFyYW50ZWUgdGhlcmUgaXMgb25seSBvbmUgdGhyZWFkIHVzaW5nIHRoaXMgdW5kbyBsaXN0LApAQCAtMTA0OCw4ICsxMDU1LDggQEAKIAlyZXR1cm4gdW47CiB9CiAKLWFzbWxpbmthZ2UgbG9uZyBzeXNfc2VtdGltZWRvcChpbnQgc2VtaWQsIHN0cnVjdCBzZW1idWYgX191c2VyICp0c29wcywKLQkJCXVuc2lnbmVkIG5zb3BzLCBjb25zdCBzdHJ1Y3QgdGltZXNwZWMgX191c2VyICp0aW1lb3V0KQorU1lTQ0FMTF9ERUZJTkU0KHNlbXRpbWVkb3AsIGludCwgc2VtaWQsIHN0cnVjdCBzZW1idWYgX191c2VyICosIHRzb3BzLAorCQl1bnNpZ25lZCwgbnNvcHMsIGNvbnN0IHN0cnVjdCB0aW1lc3BlYyBfX3VzZXIgKiwgdGltZW91dCkKIHsKIAlpbnQgZXJyb3IgPSAtRUlOVkFMOwogCXN0cnVjdCBzZW1fYXJyYXkgKnNtYTsKQEAgLTEyMjUsNyArMTIzMiw4IEBACiAJcmV0dXJuIGVycm9yOwogfQogCi1hc21saW5rYWdlIGxvbmcgc3lzX3NlbW9wIChpbnQgc2VtaWQsIHN0cnVjdCBzZW1idWYgX191c2VyICp0c29wcywgdW5zaWduZWQgbnNvcHMpCitTWVNDQUxMX0RFRklORTMoc2Vtb3AsIGludCwgc2VtaWQsIHN0cnVjdCBzZW1idWYgX191c2VyICosIHRzb3BzLAorCQl1bnNpZ25lZCwgbnNvcHMpCiB7CiAJcmV0dXJuIHN5c19zZW10aW1lZG9wKHNlbWlkLCB0c29wcywgbnNvcHMsIE5VTEwpOwogfQpkaWZmIC0tZ2l0IGEvaXBjL3NobS5jIGIvaXBjL3NobS5jCmluZGV4IGIxMjViNTYuLmE5ZTA5YWQgMTAwNjQ0Ci0tLSBhL2lwYy9zaG0uYworKysgYi9pcGMvc2htLmMKQEAgLTQ0MCw3ICs0NDAsNyBAQAogCXJldHVybiAwOwogfQogCi1hc21saW5rYWdlIGxvbmcgc3lzX3NobWdldCAoa2V5X3Qga2V5LCBzaXplX3Qgc2l6ZSwgaW50IHNobWZsZykKK1NZU0NBTExfREVGSU5FMyhzaG1nZXQsIGtleV90LCBrZXksIHNpemVfdCwgc2l6ZSwgaW50LCBzaG1mbGcpCiB7CiAJc3RydWN0IGlwY19uYW1lc3BhY2UgKm5zOwogCXN0cnVjdCBpcGNfb3BzIHNobV9vcHM7CkBAIC02MjEsNyArNjIxLDcgQEAKIAlyZXR1cm4gZXJyOwogfQogCi1hc21saW5rYWdlIGxvbmcgc3lzX3NobWN0bChpbnQgc2htaWQsIGludCBjbWQsIHN0cnVjdCBzaG1pZF9kcyBfX3VzZXIgKmJ1ZikKK1NZU0NBTExfREVGSU5FMyhzaG1jdGwsIGludCwgc2htaWQsIGludCwgY21kLCBzdHJ1Y3Qgc2htaWRfZHMgX191c2VyICosIGJ1ZikKIHsKIAlzdHJ1Y3Qgc2htaWRfa2VybmVsICpzaHA7CiAJaW50IGVyciwgdmVyc2lvbjsKQEAgLTkzOSw3ICs5MzksNyBAQAogCWdvdG8gb3V0X25hdHRjaDsKIH0KIAotYXNtbGlua2FnZSBsb25nIHN5c19zaG1hdChpbnQgc2htaWQsIGNoYXIgX191c2VyICpzaG1hZGRyLCBpbnQgc2htZmxnKQorU1lTQ0FMTF9ERUZJTkUzKHNobWF0LCBpbnQsIHNobWlkLCBjaGFyIF9fdXNlciAqLCBzaG1hZGRyLCBpbnQsIHNobWZsZykKIHsKIAl1bnNpZ25lZCBsb25nIHJldDsKIAlsb25nIGVycjsKQEAgLTk1NSw3ICs5NTUsNyBAQAogICogZGV0YWNoIGFuZCBraWxsIHNlZ21lbnQgaWYgbWFya2VkIGRlc3Ryb3llZC4KICAqIFRoZSB3b3JrIGlzIGRvbmUgaW4gc2htX2Nsb3NlLgogICovCi1hc21saW5rYWdlIGxvbmcgc3lzX3NobWR0KGNoYXIgX191c2VyICpzaG1hZGRyKQorU1lTQ0FMTF9ERUZJTkUxKHNobWR0LCBjaGFyIF9fdXNlciAqLCBzaG1hZGRyKQogewogCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gY3VycmVudC0+bW07CiAJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsICpuZXh0OwpAQCAtOTkwLDYgKzk5MCw3IEBACiAJICovCiAJdm1hID0gZmluZF92bWEobW0sIGFkZHIpOwogCisjaWZkZWYgQ09ORklHX01NVQogCXdoaWxlICh2bWEpIHsKIAkJbmV4dCA9IHZtYS0+dm1fbmV4dDsKIApAQCAtMTAzNCw2ICsxMDM1LDE3IEBACiAJCXZtYSA9IG5leHQ7CiAJfQogCisjZWxzZSAvKiBDT05GSUdfTU1VICovCisJLyogdW5kZXIgTk9NTVUgY29uZGl0aW9ucywgdGhlIGV4YWN0IGFkZHJlc3MgdG8gYmUgZGVzdHJveWVkIG11c3QgYmUKKwkgKiBnaXZlbiAqLworCXJldHZhbCA9IC1FSU5WQUw7CisJaWYgKHZtYS0+dm1fc3RhcnQgPT0gYWRkciAmJiB2bWEtPnZtX29wcyA9PSAmc2htX3ZtX29wcykgeworCQlkb19tdW5tYXAobW0sIHZtYS0+dm1fc3RhcnQsIHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydCk7CisJCXJldHZhbCA9IDA7CisJfQorCisjZW5kaWYKKwogCXVwX3dyaXRlKCZtbS0+bW1hcF9zZW0pOwogCXJldHVybiByZXR2YWw7CiB9CmRpZmYgLS1naXQgYS9rZXJuZWwvTWFrZWZpbGUgYi9rZXJuZWwvTWFrZWZpbGUKaW5kZXggZTFjNWJmMy4uMTcwYTkyMSAxMDA2NDQKLS0tIGEva2VybmVsL01ha2VmaWxlCisrKyBiL2tlcm5lbC9NYWtlZmlsZQpAQCAtOSw3ICs5LDggQEAKIAkgICAgcmN1cGRhdGUubyBleHRhYmxlLm8gcGFyYW1zLm8gcG9zaXgtdGltZXJzLm8gXAogCSAgICBrdGhyZWFkLm8gd2FpdC5vIGtmaWZvLm8gc3lzX25pLm8gcG9zaXgtY3B1LXRpbWVycy5vIG11dGV4Lm8gXAogCSAgICBocnRpbWVyLm8gcndzZW0ubyBuc3Byb3h5Lm8gc3JjdS5vIHNlbWFwaG9yZS5vIFwKLQkgICAgbm90aWZpZXIubyBrc3lzZnMubyBwbV9xb3NfcGFyYW1zLm8gc2NoZWRfY2xvY2subyBjcmVkLm8KKwkgICAgbm90aWZpZXIubyBrc3lzZnMubyBwbV9xb3NfcGFyYW1zLm8gc2NoZWRfY2xvY2subyBjcmVkLm8gXAorCSAgICBhc3luYy5vCiAKIGlmZGVmIENPTkZJR19GVU5DVElPTl9UUkFDRVIKICMgRG8gbm90IHRyYWNlIGRlYnVnIGZpbGVzIGFuZCBpbnRlcm5hbCBmdHJhY2UgZmlsZXMKQEAgLTQwLDYgKzQxLDkgQEAKIG9iai0kKENPTkZJR19SVF9NVVRFWF9URVNURVIpICs9IHJ0bXV0ZXgtdGVzdGVyLm8KIG9iai0kKENPTkZJR19HRU5FUklDX0lTQV9ETUEpICs9IGRtYS5vCiBvYmotJChDT05GSUdfVVNFX0dFTkVSSUNfU01QX0hFTFBFUlMpICs9IHNtcC5vCitpZm5lcSAoJChDT05GSUdfU01QKSx5KQorb2JqLXkgKz0gdXAubworZW5kaWYKIG9iai0kKENPTkZJR19TTVApICs9IHNwaW5sb2NrLm8KIG9iai0kKENPTkZJR19ERUJVR19TUElOTE9DSykgKz0gc3BpbmxvY2subwogb2JqLSQoQ09ORklHX1BST1ZFX0xPQ0tJTkcpICs9IHNwaW5sb2NrLm8KZGlmZiAtLWdpdCBhL2tlcm5lbC9hY2N0LmMgYi9rZXJuZWwvYWNjdC5jCmluZGV4IGQ1N2I3Y2IuLjdhZmEzMTUgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9hY2N0LmMKKysrIGIva2VybmVsL2FjY3QuYwpAQCAtMjc3LDcgKzI3Nyw3IEBACiAgKiBzaG91bGQgYmUgd3JpdHRlbi4gSWYgdGhlIGZpbGVuYW1lIGlzIE5VTEwsIGFjY291bnRpbmcgd2lsbCBiZQogICogc2h1dGRvd24uCiAgKi8KLWFzbWxpbmthZ2UgbG9uZyBzeXNfYWNjdChjb25zdCBjaGFyIF9fdXNlciAqbmFtZSkKK1NZU0NBTExfREVGSU5FMShhY2N0LCBjb25zdCBjaGFyIF9fdXNlciAqLCBuYW1lKQogewogCWludCBlcnJvcjsKIApkaWZmIC0tZ2l0IGEva2VybmVsL2FzeW5jLmMgYi9rZXJuZWwvYXN5bmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDhiMzJiCi0tLSAvZGV2L251bGwKKysrIGIva2VybmVsL2FzeW5jLmMKQEAgLTAsMCArMSwzNDYgQEAKKy8qCisgKiBhc3luYy5jOiBBc3luY2hyb25vdXMgZnVuY3Rpb24gY2FsbHMgZm9yIGJvb3QgcGVyZm9ybWFuY2UKKyAqCisgKiAoQykgQ29weXJpZ2h0IDIwMDkgSW50ZWwgQ29ycG9yYXRpb24KKyAqIEF1dGhvcjogQXJqYW4gdmFuIGRlIFZlbiA8YXJqYW5AbGludXguaW50ZWwuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgdmVyc2lvbiAyCisgKiBvZiB0aGUgTGljZW5zZS4KKyAqLworCisKKy8qCisKK0dvYWxzIGFuZCBUaGVvcnkgb2YgT3BlcmF0aW9uCisKK1RoZSBwcmltYXJ5IGdvYWwgb2YgdGhpcyBmZWF0dXJlIGlzIHRvIHJlZHVjZSB0aGUga2VybmVsIGJvb3QgdGltZSwKK2J5IGRvaW5nIHZhcmlvdXMgaW5kZXBlbmRlbnQgaGFyZHdhcmUgZGVsYXlzIGFuZCBkaXNjb3Zlcnkgb3BlcmF0aW9ucworZGVjb3VwbGVkIGFuZCBub3Qgc3RyaWN0bHkgc2VyaWFsaXplZC4KKworTW9yZSBzcGVjaWZpY2FsbHksIHRoZSBhc3luY2hyb25vdXMgZnVuY3Rpb24gY2FsbCBjb25jZXB0IGFsbG93cworY2VydGFpbiBvcGVyYXRpb25zIChwcmltYXJpbHkgZHVyaW5nIHN5c3RlbSBib290KSB0byBoYXBwZW4KK2FzeW5jaHJvbm91c2x5LCBvdXQgb2Ygb3JkZXIsIHdoaWxlIHRoZXNlIG9wZXJhdGlvbnMgc3RpbGwKK2hhdmUgdGhlaXIgZXh0ZXJuYWxseSB2aXNpYmxlIHBhcnRzIGhhcHBlbiBzZXF1ZW50aWFsbHkgYW5kIGluLW9yZGVyLgorKG5vdCB1bmxpa2UgaG93IG91dC1vZi1vcmRlciBDUFVzIHJldGlyZSB0aGVpciBpbnN0cnVjdGlvbnMgaW4gb3JkZXIpCisKK0tleSB0byB0aGUgYXN5bmNocm9ub3VzIGZ1bmN0aW9uIGNhbGwgaW1wbGVtZW50YXRpb24gaXMgdGhlIGNvbmNlcHQgb2YKK2EgInNlcXVlbmNlIGNvb2tpZSIgKHdoaWNoLCBhbHRob3VnaCBpdCBoYXMgYW4gYWJzdHJhY3RlZCB0eXBlLCBjYW4gYmUKK3Rob3VnaHQgb2YgYXMgYSBtb25vdG9uaWNhbGx5IGluY3JlbWVudGluZyBudW1iZXIpLgorCitUaGUgYXN5bmMgY29yZSB3aWxsIGFzc2lnbiBlYWNoIHNjaGVkdWxlZCBldmVudCBzdWNoIGEgc2VxdWVuY2UgY29va2llIGFuZAorcGFzcyB0aGlzIHRvIHRoZSBjYWxsZWQgZnVuY3Rpb25zLgorCitUaGUgYXN5bmNocm9ub3VzbHkgY2FsbGVkIGZ1bmN0aW9uIHNob3VsZCBiZWZvcmUgZG9pbmcgYSBnbG9iYWxseSB2aXNpYmxlCitvcGVyYXRpb24sIHN1Y2ggYXMgcmVnaXN0ZXJpbmcgZGV2aWNlIG51bWJlcnMsIGNhbGwgdGhlCithc3luY19zeW5jaHJvbml6ZV9jb29raWUoKSBmdW5jdGlvbiBhbmQgcGFzcyBpbiBpdHMgb3duIGNvb2tpZS4gVGhlCithc3luY19zeW5jaHJvbml6ZV9jb29raWUoKSBmdW5jdGlvbiB3aWxsIG1ha2Ugc3VyZSB0aGF0IGFsbCBhc3luY2hyb25vdXMKK29wZXJhdGlvbnMgdGhhdCB3ZXJlIHNjaGVkdWxlZCBwcmlvciB0byB0aGUgb3BlcmF0aW9uIGNvcnJlc3BvbmRpbmcgd2l0aCB0aGUKK2Nvb2tpZSBoYXZlIGNvbXBsZXRlZC4KKworU3Vic3lzdGVtL2RyaXZlciBpbml0aWFsaXphdGlvbiBjb2RlIHRoYXQgc2NoZWR1bGVkIGFzeW5jaHJvbm91cyBwcm9iZQorZnVuY3Rpb25zLCBidXQgd2hpY2ggc2hhcmVzIGdsb2JhbCByZXNvdXJjZXMgd2l0aCBvdGhlciBkcml2ZXJzL3N1YnN5c3RlbXMKK3RoYXQgZG8gbm90IHVzZSB0aGUgYXN5bmNocm9ub3VzIGNhbGwgZmVhdHVyZSwgbmVlZCB0byBkbyBhIGZ1bGwKK3N5bmNocm9uaXphdGlvbiB3aXRoIHRoZSBhc3luY19zeW5jaHJvbml6ZV9mdWxsKCkgZnVuY3Rpb24sIGJlZm9yZSByZXR1cm5pbmcKK2Zyb20gdGhlaXIgaW5pdCBmdW5jdGlvbi4gVGhpcyBpcyB0byBtYWludGFpbiBzdHJpY3Qgb3JkZXJpbmcgYmV0d2VlbiB0aGUKK2FzeW5jaHJvbm91cyBhbmQgc3luY2hyb25vdXMgcGFydHMgb2YgdGhlIGtlcm5lbC4KKworKi8KKworI2luY2x1ZGUgPGxpbnV4L2FzeW5jLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvd2FpdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KKyNpbmNsdWRlIDxhc20vYXRvbWljLmg+CisKK3N0YXRpYyBhc3luY19jb29raWVfdCBuZXh0X2Nvb2tpZSA9IDE7CisKKyNkZWZpbmUgTUFYX1RIUkVBRFMJMjU2CisjZGVmaW5lIE1BWF9XT1JLCTMyNzY4CisKK3N0YXRpYyBMSVNUX0hFQUQoYXN5bmNfcGVuZGluZyk7CitzdGF0aWMgTElTVF9IRUFEKGFzeW5jX3J1bm5pbmcpOworc3RhdGljIERFRklORV9TUElOTE9DSyhhc3luY19sb2NrKTsKKworc3RhdGljIGludCBhc3luY19lbmFibGVkID0gMDsKKworc3RydWN0IGFzeW5jX2VudHJ5IHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJYXN5bmNfY29va2llX3QgICBjb29raWU7CisJYXN5bmNfZnVuY19wdHIJICpmdW5jOworCXZvaWQgICAgICAgICAgICAgKmRhdGE7CisJc3RydWN0IGxpc3RfaGVhZCAqcnVubmluZzsKK307CisKK3N0YXRpYyBERUNMQVJFX1dBSVRfUVVFVUVfSEVBRChhc3luY19kb25lKTsKK3N0YXRpYyBERUNMQVJFX1dBSVRfUVVFVUVfSEVBRChhc3luY19uZXcpOworCitzdGF0aWMgYXRvbWljX3QgZW50cnlfY291bnQ7CitzdGF0aWMgYXRvbWljX3QgdGhyZWFkX2NvdW50OworCitleHRlcm4gaW50IGluaXRjYWxsX2RlYnVnOworCisKKy8qCisgKiBNVVNUIGJlIGNhbGxlZCB3aXRoIHRoZSBsb2NrIGhlbGQhCisgKi8KK3N0YXRpYyBhc3luY19jb29raWVfdCAgX19sb3dlc3RfaW5fcHJvZ3Jlc3Moc3RydWN0IGxpc3RfaGVhZCAqcnVubmluZykKK3sKKwlzdHJ1Y3QgYXN5bmNfZW50cnkgKmVudHJ5OworCWlmICghbGlzdF9lbXB0eShydW5uaW5nKSkgeworCQllbnRyeSA9IGxpc3RfZmlyc3RfZW50cnkocnVubmluZywKKwkJCXN0cnVjdCBhc3luY19lbnRyeSwgbGlzdCk7CisJCXJldHVybiBlbnRyeS0+Y29va2llOworCX0gZWxzZSBpZiAoIWxpc3RfZW1wdHkoJmFzeW5jX3BlbmRpbmcpKSB7CisJCWVudHJ5ID0gbGlzdF9maXJzdF9lbnRyeSgmYXN5bmNfcGVuZGluZywKKwkJCXN0cnVjdCBhc3luY19lbnRyeSwgbGlzdCk7CisJCXJldHVybiBlbnRyeS0+Y29va2llOworCX0gZWxzZSB7CisJCS8qIG5vdGhpbmcgaW4gcHJvZ3Jlc3MuLi4gbmV4dF9jb29raWUgaXMgImluZmluaXR5IiAqLworCQlyZXR1cm4gbmV4dF9jb29raWU7CisJfQorCit9CisKK3N0YXRpYyBhc3luY19jb29raWVfdCAgbG93ZXN0X2luX3Byb2dyZXNzKHN0cnVjdCBsaXN0X2hlYWQgKnJ1bm5pbmcpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlhc3luY19jb29raWVfdCByZXQ7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYXN5bmNfbG9jaywgZmxhZ3MpOworCXJldCA9IF9fbG93ZXN0X2luX3Byb2dyZXNzKHJ1bm5pbmcpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFzeW5jX2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gcmV0OworfQorLyoKKyAqIHBpY2sgdGhlIGZpcnN0IHBlbmRpbmcgZW50cnkgYW5kIHJ1biBpdAorICovCitzdGF0aWMgdm9pZCBydW5fb25lX2VudHJ5KHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgYXN5bmNfZW50cnkgKmVudHJ5OworCWt0aW1lX3QgY2FsbHRpbWUsIGRlbHRhLCByZXR0aW1lOworCisJLyogMSkgcGljayBvbmUgdGFzayBmcm9tIHRoZSBwZW5kaW5nIHF1ZXVlICovCisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYXN5bmNfbG9jaywgZmxhZ3MpOworCWlmIChsaXN0X2VtcHR5KCZhc3luY19wZW5kaW5nKSkKKwkJZ290byBvdXQ7CisJZW50cnkgPSBsaXN0X2ZpcnN0X2VudHJ5KCZhc3luY19wZW5kaW5nLCBzdHJ1Y3QgYXN5bmNfZW50cnksIGxpc3QpOworCisJLyogMikgbW92ZSBpdCB0byB0aGUgcnVubmluZyBxdWV1ZSAqLworCWxpc3RfZGVsKCZlbnRyeS0+bGlzdCk7CisJbGlzdF9hZGRfdGFpbCgmZW50cnktPmxpc3QsICZhc3luY19ydW5uaW5nKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhc3luY19sb2NrLCBmbGFncyk7CisKKwkvKiAzKSBydW4gaXQgKGFuZCBwcmludCBkdXJhdGlvbikqLworCWlmIChpbml0Y2FsbF9kZWJ1ZyAmJiBzeXN0ZW1fc3RhdGUgPT0gU1lTVEVNX0JPT1RJTkcpIHsKKwkJcHJpbnRrKCJjYWxsaW5nICAlbGxpXyVwRiBAICVpXG4iLCBlbnRyeS0+Y29va2llLCBlbnRyeS0+ZnVuYywgdGFza19waWRfbnIoY3VycmVudCkpOworCQljYWxsdGltZSA9IGt0aW1lX2dldCgpOworCX0KKwllbnRyeS0+ZnVuYyhlbnRyeS0+ZGF0YSwgZW50cnktPmNvb2tpZSk7CisJaWYgKGluaXRjYWxsX2RlYnVnICYmIHN5c3RlbV9zdGF0ZSA9PSBTWVNURU1fQk9PVElORykgeworCQlyZXR0aW1lID0ga3RpbWVfZ2V0KCk7CisJCWRlbHRhID0ga3RpbWVfc3ViKHJldHRpbWUsIGNhbGx0aW1lKTsKKwkJcHJpbnRrKCJpbml0Y2FsbCAlbGxpXyVwRiByZXR1cm5lZCAwIGFmdGVyICVsbGQgdXNlY3NcbiIsIGVudHJ5LT5jb29raWUsCisJCQllbnRyeS0+ZnVuYywga3RpbWVfdG9fbnMoZGVsdGEpID4+IDEwKTsKKwl9CisKKwkvKiA0KSByZW1vdmUgaXQgZnJvbSB0aGUgcnVubmluZyBxdWV1ZSAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZhc3luY19sb2NrLCBmbGFncyk7CisJbGlzdF9kZWwoJmVudHJ5LT5saXN0KTsKKworCS8qIDUpIGZyZWUgdGhlIGVudHJ5ICAqLworCWtmcmVlKGVudHJ5KTsKKwlhdG9taWNfZGVjKCZlbnRyeV9jb3VudCk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhc3luY19sb2NrLCBmbGFncyk7CisKKwkvKiA2KSB3YWtlIHVwIGFueSB3YWl0ZXJzLiAqLworCXdha2VfdXAoJmFzeW5jX2RvbmUpOworCXJldHVybjsKKworb3V0OgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFzeW5jX2xvY2ssIGZsYWdzKTsKK30KKworCitzdGF0aWMgYXN5bmNfY29va2llX3QgX19hc3luY19zY2hlZHVsZShhc3luY19mdW5jX3B0ciAqcHRyLCB2b2lkICpkYXRhLCBzdHJ1Y3QgbGlzdF9oZWFkICpydW5uaW5nKQoreworCXN0cnVjdCBhc3luY19lbnRyeSAqZW50cnk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlhc3luY19jb29raWVfdCBuZXdjb29raWU7CisJCisKKwkvKiBhbGxvdyBpcnEtb2ZmIGNhbGxlcnMgKi8KKwllbnRyeSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBhc3luY19lbnRyeSksIEdGUF9BVE9NSUMpOworCisJLyoKKwkgKiBJZiB3ZSdyZSBvdXQgb2YgbWVtb3J5IG9yIGlmIHRoZXJlJ3MgdG9vIG11Y2ggd29yaworCSAqIHBlbmRpbmcgYWxyZWFkeSwgd2UgZXhlY3V0ZSBzeW5jaHJvbm91c2x5LgorCSAqLworCWlmICghYXN5bmNfZW5hYmxlZCB8fCAhZW50cnkgfHwgYXRvbWljX3JlYWQoJmVudHJ5X2NvdW50KSA+IE1BWF9XT1JLKSB7CisJCWtmcmVlKGVudHJ5KTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmFzeW5jX2xvY2ssIGZsYWdzKTsKKwkJbmV3Y29va2llID0gbmV4dF9jb29raWUrKzsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXN5bmNfbG9jaywgZmxhZ3MpOworCisJCS8qIGxvdyBvbiBtZW1vcnkuLiBydW4gc3luY2hyb25vdXNseSAqLworCQlwdHIoZGF0YSwgbmV3Y29va2llKTsKKwkJcmV0dXJuIG5ld2Nvb2tpZTsKKwl9CisJZW50cnktPmZ1bmMgPSBwdHI7CisJZW50cnktPmRhdGEgPSBkYXRhOworCWVudHJ5LT5ydW5uaW5nID0gcnVubmluZzsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZhc3luY19sb2NrLCBmbGFncyk7CisJbmV3Y29va2llID0gZW50cnktPmNvb2tpZSA9IG5leHRfY29va2llKys7CisJbGlzdF9hZGRfdGFpbCgmZW50cnktPmxpc3QsICZhc3luY19wZW5kaW5nKTsKKwlhdG9taWNfaW5jKCZlbnRyeV9jb3VudCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXN5bmNfbG9jaywgZmxhZ3MpOworCXdha2VfdXAoJmFzeW5jX25ldyk7CisJcmV0dXJuIG5ld2Nvb2tpZTsKK30KKworYXN5bmNfY29va2llX3QgYXN5bmNfc2NoZWR1bGUoYXN5bmNfZnVuY19wdHIgKnB0ciwgdm9pZCAqZGF0YSkKK3sKKwlyZXR1cm4gX19hc3luY19zY2hlZHVsZShwdHIsIGRhdGEsICZhc3luY19wZW5kaW5nKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGFzeW5jX3NjaGVkdWxlKTsKKworYXN5bmNfY29va2llX3QgYXN5bmNfc2NoZWR1bGVfc3BlY2lhbChhc3luY19mdW5jX3B0ciAqcHRyLCB2b2lkICpkYXRhLCBzdHJ1Y3QgbGlzdF9oZWFkICpydW5uaW5nKQoreworCXJldHVybiBfX2FzeW5jX3NjaGVkdWxlKHB0ciwgZGF0YSwgcnVubmluZyk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChhc3luY19zY2hlZHVsZV9zcGVjaWFsKTsKKwordm9pZCBhc3luY19zeW5jaHJvbml6ZV9mdWxsKHZvaWQpCit7CisJZG8geworCQlhc3luY19zeW5jaHJvbml6ZV9jb29raWUobmV4dF9jb29raWUpOworCX0gd2hpbGUgKCFsaXN0X2VtcHR5KCZhc3luY19ydW5uaW5nKSB8fCAhbGlzdF9lbXB0eSgmYXN5bmNfcGVuZGluZykpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoYXN5bmNfc3luY2hyb25pemVfZnVsbCk7CisKK3ZvaWQgYXN5bmNfc3luY2hyb25pemVfZnVsbF9zcGVjaWFsKHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QpCit7CisJYXN5bmNfc3luY2hyb25pemVfY29va2llX3NwZWNpYWwobmV4dF9jb29raWUsIGxpc3QpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoYXN5bmNfc3luY2hyb25pemVfZnVsbF9zcGVjaWFsKTsKKwordm9pZCBhc3luY19zeW5jaHJvbml6ZV9jb29raWVfc3BlY2lhbChhc3luY19jb29raWVfdCBjb29raWUsIHN0cnVjdCBsaXN0X2hlYWQgKnJ1bm5pbmcpCit7CisJa3RpbWVfdCBzdGFydHRpbWUsIGRlbHRhLCBlbmR0aW1lOworCisJaWYgKGluaXRjYWxsX2RlYnVnICYmIHN5c3RlbV9zdGF0ZSA9PSBTWVNURU1fQk9PVElORykgeworCQlwcmludGsoImFzeW5jX3dhaXRpbmcgQCAlaVxuIiwgdGFza19waWRfbnIoY3VycmVudCkpOworCQlzdGFydHRpbWUgPSBrdGltZV9nZXQoKTsKKwl9CisKKwl3YWl0X2V2ZW50KGFzeW5jX2RvbmUsIGxvd2VzdF9pbl9wcm9ncmVzcyhydW5uaW5nKSA+PSBjb29raWUpOworCisJaWYgKGluaXRjYWxsX2RlYnVnICYmIHN5c3RlbV9zdGF0ZSA9PSBTWVNURU1fQk9PVElORykgeworCQllbmR0aW1lID0ga3RpbWVfZ2V0KCk7CisJCWRlbHRhID0ga3RpbWVfc3ViKGVuZHRpbWUsIHN0YXJ0dGltZSk7CisKKwkJcHJpbnRrKCJhc3luY19jb250aW51aW5nIEAgJWkgYWZ0ZXIgJWxsaSB1c2VjXG4iLAorCQkJdGFza19waWRfbnIoY3VycmVudCksIGt0aW1lX3RvX25zKGRlbHRhKSA+PiAxMCk7CisJfQorfQorRVhQT1JUX1NZTUJPTF9HUEwoYXN5bmNfc3luY2hyb25pemVfY29va2llX3NwZWNpYWwpOworCit2b2lkIGFzeW5jX3N5bmNocm9uaXplX2Nvb2tpZShhc3luY19jb29raWVfdCBjb29raWUpCit7CisJYXN5bmNfc3luY2hyb25pemVfY29va2llX3NwZWNpYWwoY29va2llLCAmYXN5bmNfcnVubmluZyk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChhc3luY19zeW5jaHJvbml6ZV9jb29raWUpOworCisKK3N0YXRpYyBpbnQgYXN5bmNfdGhyZWFkKHZvaWQgKnVudXNlZCkKK3sKKwlERUNMQVJFX1dBSVRRVUVVRSh3cSwgY3VycmVudCk7CisJYWRkX3dhaXRfcXVldWUoJmFzeW5jX25ldywgJndxKTsKKworCXdoaWxlICgha3RocmVhZF9zaG91bGRfc3RvcCgpKSB7CisJCWludCByZXQgPSBIWjsKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJLyoKKwkJICogY2hlY2sgdGhlIGxpc3QgaGVhZCB3aXRob3V0IGxvY2suLiBmYWxzZSBwb3NpdGl2ZXMKKwkJICogYXJlIGRlYWx0IHdpdGggaW5zaWRlIHJ1bl9vbmVfZW50cnkoKSB3aGlsZSBob2xkaW5nCisJCSAqIHRoZSBsb2NrLgorCQkgKi8KKwkJcm1iKCk7CisJCWlmICghbGlzdF9lbXB0eSgmYXN5bmNfcGVuZGluZykpCisJCQlydW5fb25lX2VudHJ5KCk7CisJCWVsc2UKKwkJCXJldCA9IHNjaGVkdWxlX3RpbWVvdXQoSFopOworCisJCWlmIChyZXQgPT0gMCkgeworCQkJLyoKKwkJCSAqIHdlIHRpbWVkIG91dCwgdGhpcyBtZWFucyB3ZSBhcyB0aHJlYWQgYXJlIHJlZHVuZGFudC4KKwkJCSAqIHdlIHNpZ24gb2ZmIGFuZCBkaWUsIGJ1dCB3ZSB0byBhdm9pZCBhbnkgcmFjZXMgdGhlcmUKKwkJCSAqIGlzIGEgbGFzdC1zdHJhdyBjaGVjayB0byBzZWUgaWYgd29yayBzbnVjayBpbi4KKwkJCSAqLworCQkJYXRvbWljX2RlYygmdGhyZWFkX2NvdW50KTsKKwkJCXdtYigpOyAvKiBtYW5hZ2VyIG11c3Qgc2VlIG91ciBkZXBhcnR1cmUgZmlyc3QgKi8KKwkJCWlmIChsaXN0X2VtcHR5KCZhc3luY19wZW5kaW5nKSkKKwkJCQlicmVhazsKKwkJCS8qCisJCQkgKiB3b29wcyB3b3JrIGNhbWUgaW4gYmV0d2VlbiB1cyB0aW1pbmcgb3V0IGFuZCB1cworCQkJICogc2lnbmluZyBvZmY7IHdlIG5lZWQgdG8gc3RheSBhbGl2ZSBhbmQga2VlcCB3b3JraW5nLgorCQkJICovCisJCQlhdG9taWNfaW5jKCZ0aHJlYWRfY291bnQpOworCQl9CisJfQorCXJlbW92ZV93YWl0X3F1ZXVlKCZhc3luY19uZXcsICZ3cSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhc3luY19tYW5hZ2VyX3RocmVhZCh2b2lkICp1bnVzZWQpCit7CisJREVDTEFSRV9XQUlUUVVFVUUod3EsIGN1cnJlbnQpOworCWFkZF93YWl0X3F1ZXVlKCZhc3luY19uZXcsICZ3cSk7CisKKwl3aGlsZSAoIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSkgeworCQlpbnQgdGMsIGVjOworCisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisKKwkJdGMgPSBhdG9taWNfcmVhZCgmdGhyZWFkX2NvdW50KTsKKwkJcm1iKCk7CisJCWVjID0gYXRvbWljX3JlYWQoJmVudHJ5X2NvdW50KTsKKworCQl3aGlsZSAodGMgPCBlYyAmJiB0YyA8IE1BWF9USFJFQURTKSB7CisJCQlrdGhyZWFkX3J1bihhc3luY190aHJlYWQsIE5VTEwsICJhc3luYy8laSIsIHRjKTsKKwkJCWF0b21pY19pbmMoJnRocmVhZF9jb3VudCk7CisJCQl0YysrOworCQl9CisKKwkJc2NoZWR1bGUoKTsKKwl9CisJcmVtb3ZlX3dhaXRfcXVldWUoJmFzeW5jX25ldywgJndxKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9faW5pdCBhc3luY19pbml0KHZvaWQpCit7CisJaWYgKGFzeW5jX2VuYWJsZWQpCisJCWt0aHJlYWRfcnVuKGFzeW5jX21hbmFnZXJfdGhyZWFkLCBOVUxMLCAiYXN5bmMvbWdyIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHNldHVwX2FzeW5jKGNoYXIgKnN0cikKK3sKKwlhc3luY19lbmFibGVkID0gMTsKKwlyZXR1cm4gMTsKK30KKworX19zZXR1cCgiZmFzdGJvb3QiLCBzZXR1cF9hc3luYyk7CisKKworY29yZV9pbml0Y2FsbChhc3luY19pbml0KTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9jYXBhYmlsaXR5LmMgYi9rZXJuZWwvY2FwYWJpbGl0eS5jCmluZGV4IDY4ODkyNmUuLjRlMTcwNDEgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9jYXBhYmlsaXR5LmMKKysrIGIva2VybmVsL2NhcGFiaWxpdHkuYwpAQCAtMTYxLDcgKzE2MSw3IEBACiAgKgogICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MgYW5kIDwgMCBvbiBlcnJvci4KICAqLwotYXNtbGlua2FnZSBsb25nIHN5c19jYXBnZXQoY2FwX3VzZXJfaGVhZGVyX3QgaGVhZGVyLCBjYXBfdXNlcl9kYXRhX3QgZGF0YXB0cikKK1NZU0NBTExfREVGSU5FMihjYXBnZXQsIGNhcF91c2VyX2hlYWRlcl90LCBoZWFkZXIsIGNhcF91c2VyX2RhdGFfdCwgZGF0YXB0cikKIHsKIAlpbnQgcmV0ID0gMDsKIAlwaWRfdCBwaWQ7CkBAIC0yMzUsNyArMjM1LDcgQEAKICAqCiAgKiBSZXR1cm5zIDAgb24gc3VjY2VzcyBhbmQgPCAwIG9uIGVycm9yLgogICovCi1hc21saW5rYWdlIGxvbmcgc3lzX2NhcHNldChjYXBfdXNlcl9oZWFkZXJfdCBoZWFkZXIsIGNvbnN0IGNhcF91c2VyX2RhdGFfdCBkYXRhKQorU1lTQ0FMTF9ERUZJTkUyKGNhcHNldCwgY2FwX3VzZXJfaGVhZGVyX3QsIGhlYWRlciwgY29uc3QgY2FwX3VzZXJfZGF0YV90LCBkYXRhKQogewogCXN0cnVjdCBfX3VzZXJfY2FwX2RhdGFfc3RydWN0IGtkYXRhW19LRVJORUxfQ0FQQUJJTElUWV9VMzJTXTsKIAl1bnNpZ25lZCBpLCB0b2NvcHk7CmRpZmYgLS1naXQgYS9rZXJuZWwvY2dyb3VwLmMgYi9rZXJuZWwvY2dyb3VwLmMKaW5kZXggZjIyMTQ0Ni4uYzI5ODMxMCAxMDA2NDQKLS0tIGEva2VybmVsL2Nncm91cC5jCisrKyBiL2tlcm5lbC9jZ3JvdXAuYwpAQCAtODQsNyArODQsNyBAQAogCS8qIFRyYWNrcyBob3cgbWFueSBjZ3JvdXBzIGFyZSBjdXJyZW50bHkgZGVmaW5lZCBpbiBoaWVyYXJjaHkuKi8KIAlpbnQgbnVtYmVyX29mX2Nncm91cHM7CiAKLQkvKiBBIGxpc3QgcnVubmluZyB0aHJvdWdoIHRoZSBtb3VudGVkIGhpZXJhcmNoaWVzICovCisJLyogQSBsaXN0IHJ1bm5pbmcgdGhyb3VnaCB0aGUgYWN0aXZlIGhpZXJhcmNoaWVzICovCiAJc3RydWN0IGxpc3RfaGVhZCByb290X2xpc3Q7CiAKIAkvKiBIaWVyYXJjaHktc3BlY2lmaWMgZmxhZ3MgKi8KQEAgLTE0OCw4ICsxNDgsOCBAQAogI2RlZmluZSBmb3JfZWFjaF9zdWJzeXMoX3Jvb3QsIF9zcykgXAogbGlzdF9mb3JfZWFjaF9lbnRyeShfc3MsICZfcm9vdC0+c3Vic3lzX2xpc3QsIHNpYmxpbmcpCiAKLS8qIGZvcl9lYWNoX3Jvb3QoKSBhbGxvd3MgeW91IHRvIGl0ZXJhdGUgYWNyb3NzIHRoZSBhY3RpdmUgaGllcmFyY2hpZXMgKi8KLSNkZWZpbmUgZm9yX2VhY2hfcm9vdChfcm9vdCkgXAorLyogZm9yX2VhY2hfYWN0aXZlX3Jvb3QoKSBhbGxvd3MgeW91IHRvIGl0ZXJhdGUgYWNyb3NzIHRoZSBhY3RpdmUgaGllcmFyY2hpZXMgKi8KKyNkZWZpbmUgZm9yX2VhY2hfYWN0aXZlX3Jvb3QoX3Jvb3QpIFwKIGxpc3RfZm9yX2VhY2hfZW50cnkoX3Jvb3QsICZyb290cywgcm9vdF9saXN0KQogCiAvKiB0aGUgbGlzdCBvZiBjZ3JvdXBzIGVsaWdpYmxlIGZvciBhdXRvbWF0aWMgcmVsZWFzZS4gUHJvdGVjdGVkIGJ5CkBAIC0yNzEsNyArMjcxLDcgQEAKIAogCXJjdV9yZWFkX2xvY2soKTsKIAlmb3IgKGkgPSAwOyBpIDwgQ0dST1VQX1NVQlNZU19DT1VOVDsgaSsrKSB7Ci0JCXN0cnVjdCBjZ3JvdXAgKmNncnAgPSBjZy0+c3Vic3lzW2ldLT5jZ3JvdXA7CisJCXN0cnVjdCBjZ3JvdXAgKmNncnAgPSByY3VfZGVyZWZlcmVuY2UoY2ctPnN1YnN5c1tpXS0+Y2dyb3VwKTsKIAkJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJmNncnAtPmNvdW50KSAmJgogCQkgICAgbm90aWZ5X29uX3JlbGVhc2UoY2dycCkpIHsKIAkJCWlmICh0YXNrZXhpdCkKQEAgLTM4NCw2ICszODQsMjUgQEAKIAlyZXR1cm4gMDsKIH0KIAorLyoqCisgKiBsaW5rX2Nzc19zZXQgLSBhIGhlbHBlciBmdW5jdGlvbiB0byBsaW5rIGEgY3NzX3NldCB0byBhIGNncm91cAorICogQHRtcF9jZ19saW5rczogY2dfY2dyb3VwX2xpbmsgb2JqZWN0cyBhbGxvY2F0ZWQgYnkgYWxsb2NhdGVfY2dfbGlua3MoKQorICogQGNnOiB0aGUgY3NzX3NldCB0byBiZSBsaW5rZWQKKyAqIEBjZ3JwOiB0aGUgZGVzdGluYXRpb24gY2dyb3VwCisgKi8KK3N0YXRpYyB2b2lkIGxpbmtfY3NzX3NldChzdHJ1Y3QgbGlzdF9oZWFkICp0bXBfY2dfbGlua3MsCisJCQkgc3RydWN0IGNzc19zZXQgKmNnLCBzdHJ1Y3QgY2dyb3VwICpjZ3JwKQoreworCXN0cnVjdCBjZ19jZ3JvdXBfbGluayAqbGluazsKKworCUJVR19PTihsaXN0X2VtcHR5KHRtcF9jZ19saW5rcykpOworCWxpbmsgPSBsaXN0X2ZpcnN0X2VudHJ5KHRtcF9jZ19saW5rcywgc3RydWN0IGNnX2Nncm91cF9saW5rLAorCQkJCWNncnBfbGlua19saXN0KTsKKwlsaW5rLT5jZyA9IGNnOworCWxpc3RfbW92ZSgmbGluay0+Y2dycF9saW5rX2xpc3QsICZjZ3JwLT5jc3Nfc2V0cyk7CisJbGlzdF9hZGQoJmxpbmstPmNnX2xpbmtfbGlzdCwgJmNnLT5jZ19saW5rcyk7Cit9CisKIC8qCiAgKiBmaW5kX2Nzc19zZXQoKSB0YWtlcyBhbiBleGlzdGluZyBjZ3JvdXAgZ3JvdXAgYW5kIGEKICAqIGNncm91cCBvYmplY3QsIGFuZCByZXR1cm5zIGEgY3NzX3NldCBvYmplY3QgdGhhdCdzCkBAIC0zOTksNyArNDE4LDYgQEAKIAlpbnQgaTsKIAogCXN0cnVjdCBsaXN0X2hlYWQgdG1wX2NnX2xpbmtzOwotCXN0cnVjdCBjZ19jZ3JvdXBfbGluayAqbGluazsKIAogCXN0cnVjdCBobGlzdF9oZWFkICpoaGVhZDsKIApAQCAtNDQ0LDI2ICs0NjIsMTEgQEAKIAkJICogb25seSBkbyBpdCBmb3IgdGhlIGZpcnN0IHN1YnN5c3RlbSBpbiBlYWNoCiAJCSAqIGhpZXJhcmNoeQogCQkgKi8KLQkJaWYgKHNzLT5yb290LT5zdWJzeXNfbGlzdC5uZXh0ID09ICZzcy0+c2libGluZykgewotCQkJQlVHX09OKGxpc3RfZW1wdHkoJnRtcF9jZ19saW5rcykpOwotCQkJbGluayA9IGxpc3RfZW50cnkodG1wX2NnX2xpbmtzLm5leHQsCi0JCQkJCSAgc3RydWN0IGNnX2Nncm91cF9saW5rLAotCQkJCQkgIGNncnBfbGlua19saXN0KTsKLQkJCWxpc3RfZGVsKCZsaW5rLT5jZ3JwX2xpbmtfbGlzdCk7Ci0JCQlsaXN0X2FkZCgmbGluay0+Y2dycF9saW5rX2xpc3QsICZjZ3JwLT5jc3Nfc2V0cyk7Ci0JCQlsaW5rLT5jZyA9IHJlczsKLQkJCWxpc3RfYWRkKCZsaW5rLT5jZ19saW5rX2xpc3QsICZyZXMtPmNnX2xpbmtzKTsKLQkJfQorCQlpZiAoc3MtPnJvb3QtPnN1YnN5c19saXN0Lm5leHQgPT0gJnNzLT5zaWJsaW5nKQorCQkJbGlua19jc3Nfc2V0KCZ0bXBfY2dfbGlua3MsIHJlcywgY2dycCk7CiAJfQotCWlmIChsaXN0X2VtcHR5KCZyb290bm9kZS5zdWJzeXNfbGlzdCkpIHsKLQkJbGluayA9IGxpc3RfZW50cnkodG1wX2NnX2xpbmtzLm5leHQsCi0JCQkJICBzdHJ1Y3QgY2dfY2dyb3VwX2xpbmssCi0JCQkJICBjZ3JwX2xpbmtfbGlzdCk7Ci0JCWxpc3RfZGVsKCZsaW5rLT5jZ3JwX2xpbmtfbGlzdCk7Ci0JCWxpc3RfYWRkKCZsaW5rLT5jZ3JwX2xpbmtfbGlzdCwgJmR1bW15dG9wLT5jc3Nfc2V0cyk7Ci0JCWxpbmstPmNnID0gcmVzOwotCQlsaXN0X2FkZCgmbGluay0+Y2dfbGlua19saXN0LCAmcmVzLT5jZ19saW5rcyk7Ci0JfQorCWlmIChsaXN0X2VtcHR5KCZyb290bm9kZS5zdWJzeXNfbGlzdCkpCisJCWxpbmtfY3NzX3NldCgmdG1wX2NnX2xpbmtzLCByZXMsIGR1bW15dG9wKTsKIAogCUJVR19PTighbGlzdF9lbXB0eSgmdG1wX2NnX2xpbmtzKSk7CiAKQEAgLTU4NiwxMSArNTg5LDE4IEBACiB7CiAJc3RydWN0IGNncm91cF9zdWJzeXMgKnNzOwogCWZvcl9lYWNoX3N1YnN5cyhjZ3JwLT5yb290LCBzcykKLQkJaWYgKHNzLT5wcmVfZGVzdHJveSAmJiBjZ3JwLT5zdWJzeXNbc3MtPnN1YnN5c19pZF0pCisJCWlmIChzcy0+cHJlX2Rlc3Ryb3kpCiAJCQlzcy0+cHJlX2Rlc3Ryb3koc3MsIGNncnApOwogCXJldHVybjsKIH0KIAorc3RhdGljIHZvaWQgZnJlZV9jZ3JvdXBfcmN1KHN0cnVjdCByY3VfaGVhZCAqb2JqKQoreworCXN0cnVjdCBjZ3JvdXAgKmNncnAgPSBjb250YWluZXJfb2Yob2JqLCBzdHJ1Y3QgY2dyb3VwLCByY3VfaGVhZCk7CisKKwlrZnJlZShjZ3JwKTsKK30KKwogc3RhdGljIHZvaWQgY2dyb3VwX2RpcHV0KHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGlub2RlICppbm9kZSkKIHsKIAkvKiBpcyBkZW50cnkgYSBkaXJlY3RvcnkgPyBpZiBzbywga2ZyZWUoKSBhc3NvY2lhdGVkIGNncm91cCAqLwpAQCAtNjEwLDE5ICs2MjAsMTkgQEAKIAkJLyoKIAkJICogUmVsZWFzZSB0aGUgc3Vic3lzdGVtIHN0YXRlIG9iamVjdHMuCiAJCSAqLwotCQlmb3JfZWFjaF9zdWJzeXMoY2dycC0+cm9vdCwgc3MpIHsKLQkJCWlmIChjZ3JwLT5zdWJzeXNbc3MtPnN1YnN5c19pZF0pCi0JCQkJc3MtPmRlc3Ryb3koc3MsIGNncnApOwotCQl9CisJCWZvcl9lYWNoX3N1YnN5cyhjZ3JwLT5yb290LCBzcykKKwkJCXNzLT5kZXN0cm95KHNzLCBjZ3JwKTsKIAogCQljZ3JwLT5yb290LT5udW1iZXJfb2ZfY2dyb3Vwcy0tOwogCQltdXRleF91bmxvY2soJmNncm91cF9tdXRleCk7CiAKLQkJLyogRHJvcCB0aGUgYWN0aXZlIHN1cGVyYmxvY2sgcmVmZXJlbmNlIHRoYXQgd2UgdG9vayB3aGVuIHdlCi0JCSAqIGNyZWF0ZWQgdGhlIGNncm91cCAqLworCQkvKgorCQkgKiBEcm9wIHRoZSBhY3RpdmUgc3VwZXJibG9jayByZWZlcmVuY2UgdGhhdCB3ZSB0b29rIHdoZW4gd2UKKwkJICogY3JlYXRlZCB0aGUgY2dyb3VwCisJCSAqLwogCQlkZWFjdGl2YXRlX3N1cGVyKGNncnAtPnJvb3QtPnNiKTsKIAotCQlrZnJlZShjZ3JwKTsKKwkJY2FsbF9yY3UoJmNncnAtPnJjdV9oZWFkLCBmcmVlX2Nncm91cF9yY3UpOwogCX0KIAlpcHV0KGlub2RlKTsKIH0KQEAgLTcxMiwyMyArNzIyLDI2IEBACiAJCQlCVUdfT04oY2dycC0+c3Vic3lzW2ldKTsKIAkJCUJVR19PTighZHVtbXl0b3AtPnN1YnN5c1tpXSk7CiAJCQlCVUdfT04oZHVtbXl0b3AtPnN1YnN5c1tpXS0+Y2dyb3VwICE9IGR1bW15dG9wKTsKKwkJCW11dGV4X2xvY2soJnNzLT5oaWVyYXJjaHlfbXV0ZXgpOwogCQkJY2dycC0+c3Vic3lzW2ldID0gZHVtbXl0b3AtPnN1YnN5c1tpXTsKIAkJCWNncnAtPnN1YnN5c1tpXS0+Y2dyb3VwID0gY2dycDsKLQkJCWxpc3RfYWRkKCZzcy0+c2libGluZywgJnJvb3QtPnN1YnN5c19saXN0KTsKLQkJCXJjdV9hc3NpZ25fcG9pbnRlcihzcy0+cm9vdCwgcm9vdCk7CisJCQlsaXN0X21vdmUoJnNzLT5zaWJsaW5nLCAmcm9vdC0+c3Vic3lzX2xpc3QpOworCQkJc3MtPnJvb3QgPSByb290OwogCQkJaWYgKHNzLT5iaW5kKQogCQkJCXNzLT5iaW5kKHNzLCBjZ3JwKTsKLQorCQkJbXV0ZXhfdW5sb2NrKCZzcy0+aGllcmFyY2h5X211dGV4KTsKIAkJfSBlbHNlIGlmIChiaXQgJiByZW1vdmVkX2JpdHMpIHsKIAkJCS8qIFdlJ3JlIHJlbW92aW5nIHRoaXMgc3Vic3lzdGVtICovCiAJCQlCVUdfT04oY2dycC0+c3Vic3lzW2ldICE9IGR1bW15dG9wLT5zdWJzeXNbaV0pOwogCQkJQlVHX09OKGNncnAtPnN1YnN5c1tpXS0+Y2dyb3VwICE9IGNncnApOworCQkJbXV0ZXhfbG9jaygmc3MtPmhpZXJhcmNoeV9tdXRleCk7CiAJCQlpZiAoc3MtPmJpbmQpCiAJCQkJc3MtPmJpbmQoc3MsIGR1bW15dG9wKTsKIAkJCWR1bW15dG9wLT5zdWJzeXNbaV0tPmNncm91cCA9IGR1bW15dG9wOwogCQkJY2dycC0+c3Vic3lzW2ldID0gTlVMTDsKLQkJCXJjdV9hc3NpZ25fcG9pbnRlcihzdWJzeXNbaV0tPnJvb3QsICZyb290bm9kZSk7Ci0JCQlsaXN0X2RlbCgmc3MtPnNpYmxpbmcpOworCQkJc3Vic3lzW2ldLT5yb290ID0gJnJvb3Rub2RlOworCQkJbGlzdF9tb3ZlKCZzcy0+c2libGluZywgJnJvb3Rub2RlLnN1YnN5c19saXN0KTsKKwkJCW11dGV4X3VubG9jaygmc3MtPmhpZXJhcmNoeV9tdXRleCk7CiAJCX0gZWxzZSBpZiAoYml0ICYgZmluYWxfYml0cykgewogCQkJLyogU3Vic3lzdGVtIHN0YXRlIHNob3VsZCBhbHJlYWR5IGV4aXN0ICovCiAJCQlCVUdfT04oIWNncnAtPnN1YnN5c1tpXSk7CkBAIC05OTAsNyArMTAwMyw3IEBACiAJCXJvb3QgPSBOVUxMOwogCX0gZWxzZSB7CiAJCS8qIE5ldyBzdXBlcmJsb2NrICovCi0JCXN0cnVjdCBjZ3JvdXAgKmNncnAgPSAmcm9vdC0+dG9wX2Nncm91cDsKKwkJc3RydWN0IGNncm91cCAqcm9vdF9jZ3JwID0gJnJvb3QtPnRvcF9jZ3JvdXA7CiAJCXN0cnVjdCBpbm9kZSAqaW5vZGU7CiAJCWludCBpOwogCkBAIC0xMDMxLDcgKzEwNDQsNyBAQAogCQlsaXN0X2FkZCgmcm9vdC0+cm9vdF9saXN0LCAmcm9vdHMpOwogCQlyb290X2NvdW50Kys7CiAKLQkJc2ItPnNfcm9vdC0+ZF9mc2RhdGEgPSAmcm9vdC0+dG9wX2Nncm91cDsKKwkJc2ItPnNfcm9vdC0+ZF9mc2RhdGEgPSByb290X2NncnA7CiAJCXJvb3QtPnRvcF9jZ3JvdXAuZGVudHJ5ID0gc2ItPnNfcm9vdDsKIAogCQkvKiBMaW5rIHRoZSB0b3AgY2dyb3VwIGluIHRoaXMgaGllcmFyY2h5IGludG8gYWxsCkBAIC0xMDQyLDI5ICsxMDU1LDE4IEBACiAJCQlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZTsKIAkJCXN0cnVjdCBjc3Nfc2V0ICpjZzsKIAotCQkJaGxpc3RfZm9yX2VhY2hfZW50cnkoY2csIG5vZGUsIGhoZWFkLCBobGlzdCkgewotCQkJCXN0cnVjdCBjZ19jZ3JvdXBfbGluayAqbGluazsKLQotCQkJCUJVR19PTihsaXN0X2VtcHR5KCZ0bXBfY2dfbGlua3MpKTsKLQkJCQlsaW5rID0gbGlzdF9lbnRyeSh0bXBfY2dfbGlua3MubmV4dCwKLQkJCQkJCSAgc3RydWN0IGNnX2Nncm91cF9saW5rLAotCQkJCQkJICBjZ3JwX2xpbmtfbGlzdCk7Ci0JCQkJbGlzdF9kZWwoJmxpbmstPmNncnBfbGlua19saXN0KTsKLQkJCQlsaW5rLT5jZyA9IGNnOwotCQkJCWxpc3RfYWRkKCZsaW5rLT5jZ3JwX2xpbmtfbGlzdCwKLQkJCQkJICZyb290LT50b3BfY2dyb3VwLmNzc19zZXRzKTsKLQkJCQlsaXN0X2FkZCgmbGluay0+Y2dfbGlua19saXN0LCAmY2ctPmNnX2xpbmtzKTsKLQkJCX0KKwkJCWhsaXN0X2Zvcl9lYWNoX2VudHJ5KGNnLCBub2RlLCBoaGVhZCwgaGxpc3QpCisJCQkJbGlua19jc3Nfc2V0KCZ0bXBfY2dfbGlua3MsIGNnLCByb290X2NncnApOwogCQl9CiAJCXdyaXRlX3VubG9jaygmY3NzX3NldF9sb2NrKTsKIAogCQlmcmVlX2NnX2xpbmtzKCZ0bXBfY2dfbGlua3MpOwogCi0JCUJVR19PTighbGlzdF9lbXB0eSgmY2dycC0+c2libGluZykpOwotCQlCVUdfT04oIWxpc3RfZW1wdHkoJmNncnAtPmNoaWxkcmVuKSk7CisJCUJVR19PTighbGlzdF9lbXB0eSgmcm9vdF9jZ3JwLT5zaWJsaW5nKSk7CisJCUJVR19PTighbGlzdF9lbXB0eSgmcm9vdF9jZ3JwLT5jaGlsZHJlbikpOwogCQlCVUdfT04ocm9vdC0+bnVtYmVyX29mX2Nncm91cHMgIT0gMSk7CiAKLQkJY2dyb3VwX3BvcHVsYXRlX2RpcihjZ3JwKTsKKwkJY2dyb3VwX3BvcHVsYXRlX2Rpcihyb290X2NncnApOwogCQltdXRleF91bmxvY2soJmlub2RlLT5pX211dGV4KTsKIAkJbXV0ZXhfdW5sb2NrKCZjZ3JvdXBfbXV0ZXgpOwogCX0KQEAgLTExMTMsMTAgKzExMTUsOSBAQAogCX0KIAl3cml0ZV91bmxvY2soJmNzc19zZXRfbG9jayk7CiAKLQlpZiAoIWxpc3RfZW1wdHkoJnJvb3QtPnJvb3RfbGlzdCkpIHsKLQkJbGlzdF9kZWwoJnJvb3QtPnJvb3RfbGlzdCk7Ci0JCXJvb3RfY291bnQtLTsKLQl9CisJbGlzdF9kZWwoJnJvb3QtPnJvb3RfbGlzdCk7CisJcm9vdF9jb3VudC0tOworCiAJbXV0ZXhfdW5sb2NrKCZjZ3JvdXBfbXV0ZXgpOwogCiAJa2ZyZWUocm9vdCk7CkBAIC0xMTQ1LDE0ICsxMTQ2LDE2IEBACiAgKiBAYnVmOiB0aGUgYnVmZmVyIHRvIHdyaXRlIHRoZSBwYXRoIGludG8KICAqIEBidWZsZW46IHRoZSBsZW5ndGggb2YgdGhlIGJ1ZmZlcgogICoKLSAqIENhbGxlZCB3aXRoIGNncm91cF9tdXRleCBoZWxkLiBXcml0ZXMgcGF0aCBvZiBjZ3JvdXAgaW50byBidWYuCi0gKiBSZXR1cm5zIDAgb24gc3VjY2VzcywgLWVycm5vIG9uIGVycm9yLgorICogQ2FsbGVkIHdpdGggY2dyb3VwX211dGV4IGhlbGQgb3IgZWxzZSB3aXRoIGFuIFJDVS1wcm90ZWN0ZWQgY2dyb3VwCisgKiByZWZlcmVuY2UuICBXcml0ZXMgcGF0aCBvZiBjZ3JvdXAgaW50byBidWYuICBSZXR1cm5zIDAgb24gc3VjY2VzcywKKyAqIC1lcnJubyBvbiBlcnJvci4KICAqLwogaW50IGNncm91cF9wYXRoKGNvbnN0IHN0cnVjdCBjZ3JvdXAgKmNncnAsIGNoYXIgKmJ1ZiwgaW50IGJ1ZmxlbikKIHsKIAljaGFyICpzdGFydDsKKwlzdHJ1Y3QgZGVudHJ5ICpkZW50cnkgPSByY3VfZGVyZWZlcmVuY2UoY2dycC0+ZGVudHJ5KTsKIAotCWlmIChjZ3JwID09IGR1bW15dG9wKSB7CisJaWYgKCFkZW50cnkgfHwgY2dycCA9PSBkdW1teXRvcCkgewogCQkvKgogCQkgKiBJbmFjdGl2ZSBzdWJzeXN0ZW1zIGhhdmUgbm8gZGVudHJ5IGZvciB0aGVpciByb290CiAJCSAqIGNncm91cApAQCAtMTE2NSwxMyArMTE2OCwxNCBAQAogCiAJKi0tc3RhcnQgPSAnXDAnOwogCWZvciAoOzspIHsKLQkJaW50IGxlbiA9IGNncnAtPmRlbnRyeS0+ZF9uYW1lLmxlbjsKKwkJaW50IGxlbiA9IGRlbnRyeS0+ZF9uYW1lLmxlbjsKIAkJaWYgKChzdGFydCAtPSBsZW4pIDwgYnVmKQogCQkJcmV0dXJuIC1FTkFNRVRPT0xPTkc7CiAJCW1lbWNweShzdGFydCwgY2dycC0+ZGVudHJ5LT5kX25hbWUubmFtZSwgbGVuKTsKIAkJY2dycCA9IGNncnAtPnBhcmVudDsKIAkJaWYgKCFjZ3JwKQogCQkJYnJlYWs7CisJCWRlbnRyeSA9IHJjdV9kZXJlZmVyZW5jZShjZ3JwLT5kZW50cnkpOwogCQlpZiAoIWNncnAtPnBhcmVudCkKIAkJCWNvbnRpbnVlOwogCQlpZiAoLS1zdGFydCA8IGJ1ZikKQEAgLTEyMTYsNyArMTIyMCw3IEBACiAJaW50IHJldHZhbCA9IDA7CiAJc3RydWN0IGNncm91cF9zdWJzeXMgKnNzOwogCXN0cnVjdCBjZ3JvdXAgKm9sZGNncnA7Ci0Jc3RydWN0IGNzc19zZXQgKmNnID0gdHNrLT5jZ3JvdXBzOworCXN0cnVjdCBjc3Nfc2V0ICpjZzsKIAlzdHJ1Y3QgY3NzX3NldCAqbmV3Y2c7CiAJc3RydWN0IGNncm91cGZzX3Jvb3QgKnJvb3QgPSBjZ3JwLT5yb290OwogCWludCBzdWJzeXNfaWQ7CkBAIC0xMjM2LDExICsxMjQwLDE2IEBACiAJCX0KIAl9CiAKKwl0YXNrX2xvY2sodHNrKTsKKwljZyA9IHRzay0+Y2dyb3VwczsKKwlnZXRfY3NzX3NldChjZyk7CisJdGFza191bmxvY2sodHNrKTsKIAkvKgogCSAqIExvY2F0ZSBvciBhbGxvY2F0ZSBhIG5ldyBjc3Nfc2V0IGZvciB0aGlzIHRhc2ssCiAJICogYmFzZWQgb24gaXRzIGZpbmFsIHNldCBvZiBjZ3JvdXBzCiAJICovCiAJbmV3Y2cgPSBmaW5kX2Nzc19zZXQoY2csIGNncnApOworCXB1dF9jc3Nfc2V0KGNnKTsKIAlpZiAoIW5ld2NnKQogCQlyZXR1cm4gLUVOT01FTTsKIApAQCAtMTQ0NSw3ICsxNDU0LDcgQEAKIAlzdHJ1Y3QgY2Z0eXBlICpjZnQgPSBfX2RfY2Z0KGZpbGUtPmZfZGVudHJ5KTsKIAlzdHJ1Y3QgY2dyb3VwICpjZ3JwID0gX19kX2NncnAoZmlsZS0+Zl9kZW50cnktPmRfcGFyZW50KTsKIAotCWlmICghY2Z0IHx8IGNncm91cF9pc19yZW1vdmVkKGNncnApKQorCWlmIChjZ3JvdXBfaXNfcmVtb3ZlZChjZ3JwKSkKIAkJcmV0dXJuIC1FTk9ERVY7CiAJaWYgKGNmdC0+d3JpdGUpCiAJCXJldHVybiBjZnQtPndyaXRlKGNncnAsIGNmdCwgZmlsZSwgYnVmLCBuYnl0ZXMsIHBwb3MpOwpAQCAtMTQ5MCw3ICsxNDk5LDcgQEAKIAlzdHJ1Y3QgY2Z0eXBlICpjZnQgPSBfX2RfY2Z0KGZpbGUtPmZfZGVudHJ5KTsKIAlzdHJ1Y3QgY2dyb3VwICpjZ3JwID0gX19kX2NncnAoZmlsZS0+Zl9kZW50cnktPmRfcGFyZW50KTsKIAotCWlmICghY2Z0IHx8IGNncm91cF9pc19yZW1vdmVkKGNncnApKQorCWlmIChjZ3JvdXBfaXNfcmVtb3ZlZChjZ3JwKSkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKIAlpZiAoY2Z0LT5yZWFkKQpAQCAtMTU1NCwxMCArMTU2Myw4IEBACiAJZXJyID0gZ2VuZXJpY19maWxlX29wZW4oaW5vZGUsIGZpbGUpOwogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7Ci0KIAljZnQgPSBfX2RfY2Z0KGZpbGUtPmZfZGVudHJ5KTsKLQlpZiAoIWNmdCkKLQkJcmV0dXJuIC1FTk9ERVY7CisKIAlpZiAoY2Z0LT5yZWFkX21hcCB8fCBjZnQtPnJlYWRfc2VxX3N0cmluZykgewogCQlzdHJ1Y3QgY2dyb3VwX3NlcWZpbGVfc3RhdGUgKnN0YXRlID0KIAkJCWt6YWxsb2Moc2l6ZW9mKCpzdGF0ZSksIEdGUF9VU0VSKTsKQEAgLTE2NzEsNyArMTY3OCw3IEBACiAJaWYgKCFlcnJvcikgewogCQlkZW50cnktPmRfZnNkYXRhID0gY2dycDsKIAkJaW5jX25saW5rKHBhcmVudC0+ZF9pbm9kZSk7Ci0JCWNncnAtPmRlbnRyeSA9IGRlbnRyeTsKKwkJcmN1X2Fzc2lnbl9wb2ludGVyKGNncnAtPmRlbnRyeSwgZGVudHJ5KTsKIAkJZGdldChkZW50cnkpOwogCX0KIAlkcHV0KGRlbnRyeSk7CkBAIC0xODEyLDYgKzE4MTksNyBAQAogewogCXN0cnVjdCB0YXNrX3N0cnVjdCAqcmVzOwogCXN0cnVjdCBsaXN0X2hlYWQgKmwgPSBpdC0+dGFzazsKKwlzdHJ1Y3QgY2dfY2dyb3VwX2xpbmsgKmxpbms7CiAKIAkvKiBJZiB0aGUgaXRlcmF0b3IgY2cgaXMgTlVMTCwgd2UgaGF2ZSBubyB0YXNrcyAqLwogCWlmICghaXQtPmNnX2xpbmspCkBAIC0xODE5LDcgKzE4MjcsOCBAQAogCXJlcyA9IGxpc3RfZW50cnkobCwgc3RydWN0IHRhc2tfc3RydWN0LCBjZ19saXN0KTsKIAkvKiBBZHZhbmNlIGl0ZXJhdG9yIHRvIGZpbmQgbmV4dCBlbnRyeSAqLwogCWwgPSBsLT5uZXh0OwotCWlmIChsID09ICZyZXMtPmNncm91cHMtPnRhc2tzKSB7CisJbGluayA9IGxpc3RfZW50cnkoaXQtPmNnX2xpbmssIHN0cnVjdCBjZ19jZ3JvdXBfbGluaywgY2dycF9saW5rX2xpc3QpOworCWlmIChsID09ICZsaW5rLT5jZy0+dGFza3MpIHsKIAkJLyogV2UgcmVhY2hlZCB0aGUgZW5kIG9mIHRoaXMgdGFzayBsaXN0IC0gbW92ZSBvbiB0bwogCQkgKiB0aGUgbmV4dCBjZ19jZ3JvdXBfbGluayAqLwogCQljZ3JvdXBfYWR2YW5jZV9pdGVyKGNncnAsIGl0KTsKQEAgLTIwMTMsMTQgKzIwMjIsMTYgQEAKICAqLwogc3RhdGljIGludCBwaWRfYXJyYXlfbG9hZChwaWRfdCAqcGlkYXJyYXksIGludCBucGlkcywgc3RydWN0IGNncm91cCAqY2dycCkKIHsKLQlpbnQgbiA9IDA7CisJaW50IG4gPSAwLCBwaWQ7CiAJc3RydWN0IGNncm91cF9pdGVyIGl0OwogCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrOwogCWNncm91cF9pdGVyX3N0YXJ0KGNncnAsICZpdCk7CiAJd2hpbGUgKCh0c2sgPSBjZ3JvdXBfaXRlcl9uZXh0KGNncnAsICZpdCkpKSB7CiAJCWlmICh1bmxpa2VseShuID09IG5waWRzKSkKIAkJCWJyZWFrOwotCQlwaWRhcnJheVtuKytdID0gdGFza19waWRfdm5yKHRzayk7CisJCXBpZCA9IHRhc2tfcGlkX3Zucih0c2spOworCQlpZiAocGlkID4gMCkKKwkJCXBpZGFycmF5W24rK10gPSBwaWQ7CiAJfQogCWNncm91cF9pdGVyX2VuZChjZ3JwLCAmaXQpOwogCXJldHVybiBuOwpAQCAtMjA1Miw3ICsyMDYzLDYgQEAKIAogCXJldCA9IDA7CiAJY2dycCA9IGRlbnRyeS0+ZF9mc2RhdGE7Ci0JcmN1X3JlYWRfbG9jaygpOwogCiAJY2dyb3VwX2l0ZXJfc3RhcnQoY2dycCwgJml0KTsKIAl3aGlsZSAoKHRzayA9IGNncm91cF9pdGVyX25leHQoY2dycCwgJml0KSkpIHsKQEAgLTIwNzcsNyArMjA4Nyw2IEBACiAJfQogCWNncm91cF9pdGVyX2VuZChjZ3JwLCAmaXQpOwogCi0JcmN1X3JlYWRfdW5sb2NrKCk7CiBlcnI6CiAJcmV0dXJuIHJldDsKIH0KQEAgLTIzMjQsNyArMjMzMyw3IEBACiAJCQkgICAgICAgc3RydWN0IGNncm91cCAqY2dycCkKIHsKIAljc3MtPmNncm91cCA9IGNncnA7Ci0JYXRvbWljX3NldCgmY3NzLT5yZWZjbnQsIDApOworCWF0b21pY19zZXQoJmNzcy0+cmVmY250LCAxKTsKIAljc3MtPmZsYWdzID0gMDsKIAlpZiAoY2dycCA9PSBkdW1teXRvcCkKIAkJc2V0X2JpdChDU1NfUk9PVCwgJmNzcy0+ZmxhZ3MpOwpAQCAtMjMzMiw2ICsyMzQxLDI5IEBACiAJY2dycC0+c3Vic3lzW3NzLT5zdWJzeXNfaWRdID0gY3NzOwogfQogCitzdGF0aWMgdm9pZCBjZ3JvdXBfbG9ja19oaWVyYXJjaHkoc3RydWN0IGNncm91cGZzX3Jvb3QgKnJvb3QpCit7CisJLyogV2UgbmVlZCB0byB0YWtlIGVhY2ggaGllcmFyY2h5X211dGV4IGluIGEgY29uc2lzdGVudCBvcmRlciAqLworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IENHUk9VUF9TVUJTWVNfQ09VTlQ7IGkrKykgeworCQlzdHJ1Y3QgY2dyb3VwX3N1YnN5cyAqc3MgPSBzdWJzeXNbaV07CisJCWlmIChzcy0+cm9vdCA9PSByb290KQorCQkJbXV0ZXhfbG9ja19uZXN0ZWQoJnNzLT5oaWVyYXJjaHlfbXV0ZXgsIGkpOworCX0KK30KKworc3RhdGljIHZvaWQgY2dyb3VwX3VubG9ja19oaWVyYXJjaHkoc3RydWN0IGNncm91cGZzX3Jvb3QgKnJvb3QpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQ0dST1VQX1NVQlNZU19DT1VOVDsgaSsrKSB7CisJCXN0cnVjdCBjZ3JvdXBfc3Vic3lzICpzcyA9IHN1YnN5c1tpXTsKKwkJaWYgKHNzLT5yb290ID09IHJvb3QpCisJCQltdXRleF91bmxvY2soJnNzLT5oaWVyYXJjaHlfbXV0ZXgpOworCX0KK30KKwogLyoKICAqIGNncm91cF9jcmVhdGUgLSBjcmVhdGUgYSBjZ3JvdXAKICAqIEBwYXJlbnQ6IGNncm91cCB0aGF0IHdpbGwgYmUgcGFyZW50IG9mIHRoZSBuZXcgY2dyb3VwCkBAIC0yMzgwLDcgKzI0MTIsOSBAQAogCQlpbml0X2Nncm91cF9jc3MoY3NzLCBzcywgY2dycCk7CiAJfQogCisJY2dyb3VwX2xvY2tfaGllcmFyY2h5KHJvb3QpOwogCWxpc3RfYWRkKCZjZ3JwLT5zaWJsaW5nLCAmY2dycC0+cGFyZW50LT5jaGlsZHJlbik7CisJY2dyb3VwX3VubG9ja19oaWVyYXJjaHkocm9vdCk7CiAJcm9vdC0+bnVtYmVyX29mX2Nncm91cHMrKzsKIAogCWVyciA9IGNncm91cF9jcmVhdGVfZGlyKGNncnAsIGRlbnRyeSwgbW9kZSk7CkBAIC0yNDMxLDcgKzI0NjUsNyBAQAogewogCS8qIENoZWNrIHRoZSByZWZlcmVuY2UgY291bnQgb24gZWFjaCBzdWJzeXN0ZW0uIFNpbmNlIHdlCiAJICogYWxyZWFkeSBlc3RhYmxpc2hlZCB0aGF0IHRoZXJlIGFyZSBubyB0YXNrcyBpbiB0aGUKLQkgKiBjZ3JvdXAsIGlmIHRoZSBjc3MgcmVmY291bnQgaXMgYWxzbyAwLCB0aGVuIHRoZXJlIHNob3VsZAorCSAqIGNncm91cCwgaWYgdGhlIGNzcyByZWZjb3VudCBpcyBhbHNvIDEsIHRoZW4gdGhlcmUgc2hvdWxkCiAJICogYmUgbm8gb3V0c3RhbmRpbmcgcmVmZXJlbmNlcywgc28gdGhlIHN1YnN5c3RlbSBpcyBzYWZlIHRvCiAJICogZGVzdHJveS4gV2Ugc2NhbiBhY3Jvc3MgYWxsIHN1YnN5c3RlbXMgcmF0aGVyIHRoYW4gdXNpbmcKIAkgKiB0aGUgcGVyLWhpZXJhcmNoeSBsaW5rZWQgbGlzdCBvZiBtb3VudGVkIHN1YnN5c3RlbXMgc2luY2UKQEAgLTI0NTIsMTkgKzI0ODYsNjcgQEAKIAkJICogbWF0dGVyLCBzaW5jZSBpdCBjYW4gb25seSBoYXBwZW4gaWYgdGhlIGNncm91cAogCQkgKiBoYXMgYmVlbiBkZWxldGVkIGFuZCBoZW5jZSBubyBsb25nZXIgbmVlZHMgdGhlCiAJCSAqIHJlbGVhc2UgYWdlbnQgdG8gYmUgY2FsbGVkIGFueXdheS4gKi8KLQkJaWYgKGNzcyAmJiBhdG9taWNfcmVhZCgmY3NzLT5yZWZjbnQpKQorCQlpZiAoY3NzICYmIChhdG9taWNfcmVhZCgmY3NzLT5yZWZjbnQpID4gMSkpCiAJCQlyZXR1cm4gMTsKIAl9CiAJcmV0dXJuIDA7CiB9CiAKKy8qCisgKiBBdG9taWNhbGx5IG1hcmsgYWxsIChvciBlbHNlIG5vbmUpIG9mIHRoZSBjZ3JvdXAncyBDU1Mgb2JqZWN0cyBhcworICogQ1NTX1JFTU9WRUQuIFJldHVybiB0cnVlIG9uIHN1Y2Nlc3MsIG9yIGZhbHNlIGlmIHRoZSBjZ3JvdXAgaGFzCisgKiBidXN5IHN1YnN5c3RlbXMuIENhbGwgd2l0aCBjZ3JvdXBfbXV0ZXggaGVsZAorICovCisKK3N0YXRpYyBpbnQgY2dyb3VwX2NsZWFyX2Nzc19yZWZzKHN0cnVjdCBjZ3JvdXAgKmNncnApCit7CisJc3RydWN0IGNncm91cF9zdWJzeXMgKnNzOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJYm9vbCBmYWlsZWQgPSBmYWxzZTsKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJZm9yX2VhY2hfc3Vic3lzKGNncnAtPnJvb3QsIHNzKSB7CisJCXN0cnVjdCBjZ3JvdXBfc3Vic3lzX3N0YXRlICpjc3MgPSBjZ3JwLT5zdWJzeXNbc3MtPnN1YnN5c19pZF07CisJCWludCByZWZjbnQ7CisJCWRvIHsKKwkJCS8qIFdlIGNhbiBvbmx5IHJlbW92ZSBhIENTUyB3aXRoIGEgcmVmY250PT0xICovCisJCQlyZWZjbnQgPSBhdG9taWNfcmVhZCgmY3NzLT5yZWZjbnQpOworCQkJaWYgKHJlZmNudCA+IDEpIHsKKwkJCQlmYWlsZWQgPSB0cnVlOworCQkJCWdvdG8gZG9uZTsKKwkJCX0KKwkJCUJVR19PTighcmVmY250KTsKKwkJCS8qCisJCQkgKiBEcm9wIHRoZSByZWZjbnQgdG8gMCB3aGlsZSB3ZSBjaGVjayBvdGhlcgorCQkJICogc3Vic3lzdGVtcy4gVGhpcyB3aWxsIGNhdXNlIGFueSByYWNpbmcKKwkJCSAqIGNzc190cnlnZXQoKSB0byBzcGluIHVudGlsIHdlIHNldCB0aGUKKwkJCSAqIENTU19SRU1PVkVEIGJpdHMgb3IgYWJvcnQKKwkJCSAqLworCQl9IHdoaWxlIChhdG9taWNfY21weGNoZygmY3NzLT5yZWZjbnQsIHJlZmNudCwgMCkgIT0gcmVmY250KTsKKwl9CisgZG9uZToKKwlmb3JfZWFjaF9zdWJzeXMoY2dycC0+cm9vdCwgc3MpIHsKKwkJc3RydWN0IGNncm91cF9zdWJzeXNfc3RhdGUgKmNzcyA9IGNncnAtPnN1YnN5c1tzcy0+c3Vic3lzX2lkXTsKKwkJaWYgKGZhaWxlZCkgeworCQkJLyoKKwkJCSAqIFJlc3RvcmUgb2xkIHJlZmNudCBpZiB3ZSBwcmV2aW91c2x5IG1hbmFnZWQKKwkJCSAqIHRvIGNsZWFyIGl0IGZyb20gMSB0byAwCisJCQkgKi8KKwkJCWlmICghYXRvbWljX3JlYWQoJmNzcy0+cmVmY250KSkKKwkJCQlhdG9taWNfc2V0KCZjc3MtPnJlZmNudCwgMSk7CisJCX0gZWxzZSB7CisJCQkvKiBDb21taXQgdGhlIGZhY3QgdGhhdCB0aGUgQ1NTIGlzIHJlbW92ZWQgKi8KKwkJCXNldF9iaXQoQ1NTX1JFTU9WRUQsICZjc3MtPmZsYWdzKTsKKwkJfQorCX0KKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJcmV0dXJuICFmYWlsZWQ7Cit9CisKIHN0YXRpYyBpbnQgY2dyb3VwX3JtZGlyKHN0cnVjdCBpbm9kZSAqdW51c2VkX2Rpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5KQogewogCXN0cnVjdCBjZ3JvdXAgKmNncnAgPSBkZW50cnktPmRfZnNkYXRhOwogCXN0cnVjdCBkZW50cnkgKmQ7CiAJc3RydWN0IGNncm91cCAqcGFyZW50OwotCXN0cnVjdCBzdXBlcl9ibG9jayAqc2I7Ci0Jc3RydWN0IGNncm91cGZzX3Jvb3QgKnJvb3Q7CiAKIAkvKiB0aGUgdmZzIGhvbGRzIGJvdGggaW5vZGUtPmlfbXV0ZXggYWxyZWFkeSAqLwogCkBAIC0yNDg3LDEyICsyNTY5LDEwIEBACiAKIAltdXRleF9sb2NrKCZjZ3JvdXBfbXV0ZXgpOwogCXBhcmVudCA9IGNncnAtPnBhcmVudDsKLQlyb290ID0gY2dycC0+cm9vdDsKLQlzYiA9IHJvb3QtPnNiOwogCiAJaWYgKGF0b21pY19yZWFkKCZjZ3JwLT5jb3VudCkKIAkgICAgfHwgIWxpc3RfZW1wdHkoJmNncnAtPmNoaWxkcmVuKQotCSAgICB8fCBjZ3JvdXBfaGFzX2Nzc19yZWZzKGNncnApKSB7CisJICAgIHx8ICFjZ3JvdXBfY2xlYXJfY3NzX3JlZnMoY2dycCkpIHsKIAkJbXV0ZXhfdW5sb2NrKCZjZ3JvdXBfbXV0ZXgpOwogCQlyZXR1cm4gLUVCVVNZOwogCX0KQEAgLTI1MDIsOCArMjU4MiwxMiBAQAogCWlmICghbGlzdF9lbXB0eSgmY2dycC0+cmVsZWFzZV9saXN0KSkKIAkJbGlzdF9kZWwoJmNncnAtPnJlbGVhc2VfbGlzdCk7CiAJc3Bpbl91bmxvY2soJnJlbGVhc2VfbGlzdF9sb2NrKTsKLQkvKiBkZWxldGUgbXkgc2libGluZyBmcm9tIHBhcmVudC0+Y2hpbGRyZW4gKi8KKworCWNncm91cF9sb2NrX2hpZXJhcmNoeShjZ3JwLT5yb290KTsKKwkvKiBkZWxldGUgdGhpcyBjZ3JvdXAgZnJvbSBwYXJlbnQtPmNoaWxkcmVuICovCiAJbGlzdF9kZWwoJmNncnAtPnNpYmxpbmcpOworCWNncm91cF91bmxvY2tfaGllcmFyY2h5KGNncnAtPnJvb3QpOworCiAJc3Bpbl9sb2NrKCZjZ3JwLT5kZW50cnktPmRfbG9jayk7CiAJZCA9IGRnZXQoY2dycC0+ZGVudHJ5KTsKIAlzcGluX3VubG9jaygmZC0+ZF9sb2NrKTsKQEAgLTI1MjUsNiArMjYwOSw3IEBACiAJcHJpbnRrKEtFUk5fSU5GTyAiSW5pdGlhbGl6aW5nIGNncm91cCBzdWJzeXMgJXNcbiIsIHNzLT5uYW1lKTsKIAogCS8qIENyZWF0ZSB0aGUgdG9wIGNncm91cCBzdGF0ZSBmb3IgdGhpcyBzdWJzeXN0ZW0gKi8KKwlsaXN0X2FkZCgmc3MtPnNpYmxpbmcsICZyb290bm9kZS5zdWJzeXNfbGlzdCk7CiAJc3MtPnJvb3QgPSAmcm9vdG5vZGU7CiAJY3NzID0gc3MtPmNyZWF0ZShzcywgZHVtbXl0b3ApOwogCS8qIFdlIGRvbid0IGhhbmRsZSBlYXJseSBmYWlsdXJlcyBncmFjZWZ1bGx5ICovCkBAIC0yNTQ0LDYgKzI2MjksNyBAQAogCSAqIG5lZWQgdG8gaW52b2tlIGZvcmsgY2FsbGJhY2tzIGhlcmUuICovCiAJQlVHX09OKCFsaXN0X2VtcHR5KCZpbml0X3Rhc2sudGFza3MpKTsKIAorCW11dGV4X2luaXQoJnNzLT5oaWVyYXJjaHlfbXV0ZXgpOwogCXNzLT5hY3RpdmUgPSAxOwogfQogCkBAIC0yNTYyLDcgKzI2NDgsNiBAQAogCUlOSVRfSExJU1RfTk9ERSgmaW5pdF9jc3Nfc2V0LmhsaXN0KTsKIAljc3Nfc2V0X2NvdW50ID0gMTsKIAlpbml0X2Nncm91cF9yb290KCZyb290bm9kZSk7Ci0JbGlzdF9hZGQoJnJvb3Rub2RlLnJvb3RfbGlzdCwgJnJvb3RzKTsKIAlyb290X2NvdW50ID0gMTsKIAlpbml0X3Rhc2suY2dyb3VwcyA9ICZpbml0X2Nzc19zZXQ7CiAKQEAgLTI2NjksMTUgKzI3NTQsMTIgQEAKIAogCW11dGV4X2xvY2soJmNncm91cF9tdXRleCk7CiAKLQlmb3JfZWFjaF9yb290KHJvb3QpIHsKKwlmb3JfZWFjaF9hY3RpdmVfcm9vdChyb290KSB7CiAJCXN0cnVjdCBjZ3JvdXBfc3Vic3lzICpzczsKIAkJc3RydWN0IGNncm91cCAqY2dycDsKIAkJaW50IHN1YnN5c19pZDsKIAkJaW50IGNvdW50ID0gMDsKIAotCQkvKiBTa2lwIHRoaXMgaGllcmFyY2h5IGlmIGl0IGhhcyBubyBhY3RpdmUgc3Vic3lzdGVtcyAqLwotCQlpZiAoIXJvb3QtPmFjdHVhbF9zdWJzeXNfYml0cykKLQkJCWNvbnRpbnVlOwogCQlzZXFfcHJpbnRmKG0sICIlbHU6Iiwgcm9vdC0+c3Vic3lzX2JpdHMpOwogCQlmb3JfZWFjaF9zdWJzeXMocm9vdCwgc3MpCiAJCQlzZXFfcHJpbnRmKG0sICIlcyVzIiwgY291bnQrKyA/ICIsIiA6ICIiLCBzcy0+bmFtZSk7CkBAIC0yODAwLDggKzI4ODIsMTAgQEAKIHsKIAlpZiAodXNlX3Rhc2tfY3NzX3NldF9saW5rcykgewogCQl3cml0ZV9sb2NrKCZjc3Nfc2V0X2xvY2spOworCQl0YXNrX2xvY2soY2hpbGQpOwogCQlpZiAobGlzdF9lbXB0eSgmY2hpbGQtPmNnX2xpc3QpKQogCQkJbGlzdF9hZGQoJmNoaWxkLT5jZ19saXN0LCAmY2hpbGQtPmNncm91cHMtPnRhc2tzKTsKKwkJdGFza191bmxvY2soY2hpbGQpOwogCQl3cml0ZV91bmxvY2soJmNzc19zZXRfbG9jayk7CiAJfQogfQpAQCAtMjkwNyw2ICsyOTkxLDcgQEAKIAkJbXV0ZXhfdW5sb2NrKCZjZ3JvdXBfbXV0ZXgpOwogCQlyZXR1cm4gMDsKIAl9CisJdGFza19sb2NrKHRzayk7CiAJY2cgPSB0c2stPmNncm91cHM7CiAJcGFyZW50ID0gdGFza19jZ3JvdXAodHNrLCBzdWJzeXMtPnN1YnN5c19pZCk7CiAKQEAgLTI5MTksNiArMzAwNCw3IEBACiAKIAkvKiBLZWVwIHRoZSBjZ3JvdXAgYWxpdmUgKi8KIAlnZXRfY3NzX3NldChjZyk7CisJdGFza191bmxvY2sodHNrKTsKIAltdXRleF91bmxvY2soJmNncm91cF9tdXRleCk7CiAKIAkvKiBOb3cgZG8gdGhlIFZGUyB3b3JrIHRvIGNyZWF0ZSBhIGNncm91cCAqLwpAQCAtMjkzNyw3ICszMDIzLDcgQEAKIAl9CiAKIAkvKiBDcmVhdGUgdGhlIGNncm91cCBkaXJlY3RvcnksIHdoaWNoIGFsc28gY3JlYXRlcyB0aGUgY2dyb3VwICovCi0JcmV0ID0gdmZzX21rZGlyKGlub2RlLCBkZW50cnksIFNfSUZESVIgfCAwNzU1KTsKKwlyZXQgPSB2ZnNfbWtkaXIoaW5vZGUsIGRlbnRyeSwgMDc1NSk7CiAJY2hpbGQgPSBfX2RfY2dycChkZW50cnkpOwogCWRwdXQoZGVudHJ5KTsKIAlpZiAocmV0KSB7CkBAIC0yOTQ3LDEzICszMDMzLDYgQEAKIAkJZ290byBvdXRfcmVsZWFzZTsKIAl9CiAKLQlpZiAoIWNoaWxkKSB7Ci0JCXByaW50ayhLRVJOX0lORk8KLQkJICAgICAgICJDb3VsZG4ndCBmaW5kIG5ldyBjZ3JvdXAgJXNcbiIsIG5vZGVuYW1lKTsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBvdXRfcmVsZWFzZTsKLQl9Ci0KIAkvKiBUaGUgY2dyb3VwIG5vdyBleGlzdHMuIFJldGFrZSBjZ3JvdXBfbXV0ZXggYW5kIGNoZWNrCiAJICogdGhhdCB3ZSdyZSBzdGlsbCBpbiB0aGUgc2FtZSBzdGF0ZSB0aGF0IHdlIHRob3VnaHQgd2UKIAkgKiB3ZXJlLiAqLwpAQCAtMzA0OSw3ICszMTI4LDggQEAKIHsKIAlzdHJ1Y3QgY2dyb3VwICpjZ3JwID0gY3NzLT5jZ3JvdXA7CiAJcmN1X3JlYWRfbG9jaygpOwotCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZjc3MtPnJlZmNudCkgJiYgbm90aWZ5X29uX3JlbGVhc2UoY2dycCkpIHsKKwlpZiAoKGF0b21pY19kZWNfcmV0dXJuKCZjc3MtPnJlZmNudCkgPT0gMSkgJiYKKwkgICAgbm90aWZ5X29uX3JlbGVhc2UoY2dycCkpIHsKIAkJc2V0X2JpdChDR1JQX1JFTEVBU0FCTEUsICZjZ3JwLT5mbGFncyk7CiAJCWNoZWNrX2Zvcl9yZWxlYXNlKGNncnApOwogCX0KZGlmZiAtLWdpdCBhL2tlcm5lbC9jcHUuYyBiL2tlcm5lbC9jcHUuYwppbmRleCAzMGU3NGRkLi43OWU0MGYwIDEwMDY0NAotLS0gYS9rZXJuZWwvY3B1LmMKKysrIGIva2VybmVsL2NwdS5jCkBAIC0zNzksOCArMzc5LDExIEBACiAKIGludCBkaXNhYmxlX25vbmJvb3RfY3B1cyh2b2lkKQogewotCWludCBjcHUsIGZpcnN0X2NwdSwgZXJyb3IgPSAwOworCWludCBjcHUsIGZpcnN0X2NwdSwgZXJyb3I7CiAKKwllcnJvciA9IHN0b3BfbWFjaGluZV9jcmVhdGUoKTsKKwlpZiAoZXJyb3IpCisJCXJldHVybiBlcnJvcjsKIAljcHVfbWFwc191cGRhdGVfYmVnaW4oKTsKIAlmaXJzdF9jcHUgPSBjcHVtYXNrX2ZpcnN0KGNwdV9vbmxpbmVfbWFzayk7CiAJLyogV2UgdGFrZSBkb3duIGFsbCBvZiB0aGUgbm9uLWJvb3QgQ1BVcyBpbiBvbmUgc2hvdCB0byBhdm9pZCByYWNlcwpAQCAtNDA5LDYgKzQxMiw3IEBACiAJCXByaW50ayhLRVJOX0VSUiAiTm9uLWJvb3QgQ1BVcyBhcmUgbm90IGRpc2FibGVkXG4iKTsKIAl9CiAJY3B1X21hcHNfdXBkYXRlX2RvbmUoKTsKKwlzdG9wX21hY2hpbmVfZGVzdHJveSgpOwogCXJldHVybiBlcnJvcjsKIH0KIApkaWZmIC0tZ2l0IGEva2VybmVsL2NwdXNldC5jIGIva2VybmVsL2NwdXNldC5jCmluZGV4IDM0NWFjZTUuLmE4NTY3ODggMTAwNjQ0Ci0tLSBhL2tlcm5lbC9jcHVzZXQuYworKysgYi9rZXJuZWwvY3B1c2V0LmMKQEAgLTg0LDcgKzg0LDcgQEAKIAlzdHJ1Y3QgY2dyb3VwX3N1YnN5c19zdGF0ZSBjc3M7CiAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwkJLyogInVuc2lnbmVkIGxvbmciIHNvIGJpdG9wcyB3b3JrICovCi0JY3B1bWFza190IGNwdXNfYWxsb3dlZDsJCS8qIENQVXMgYWxsb3dlZCB0byB0YXNrcyBpbiBjcHVzZXQgKi8KKwljcHVtYXNrX3Zhcl90IGNwdXNfYWxsb3dlZDsJLyogQ1BVcyBhbGxvd2VkIHRvIHRhc2tzIGluIGNwdXNldCAqLwogCW5vZGVtYXNrX3QgbWVtc19hbGxvd2VkOwkvKiBNZW1vcnkgTm9kZXMgYWxsb3dlZCB0byB0YXNrcyAqLwogCiAJc3RydWN0IGNwdXNldCAqcGFyZW50OwkJLyogbXkgcGFyZW50ICovCkBAIC0xOTUsOCArMTk1LDYgQEAKIAogc3RhdGljIHN0cnVjdCBjcHVzZXQgdG9wX2NwdXNldCA9IHsKIAkuZmxhZ3MgPSAoKDEgPDwgQ1NfQ1BVX0VYQ0xVU0lWRSkgfCAoMSA8PCBDU19NRU1fRVhDTFVTSVZFKSksCi0JLmNwdXNfYWxsb3dlZCA9IENQVV9NQVNLX0FMTCwKLQkubWVtc19hbGxvd2VkID0gTk9ERV9NQVNLX0FMTCwKIH07CiAKIC8qCkBAIC0yNzgsNyArMjc2LDcgQEAKIH07CiAKIC8qCi0gKiBSZXR1cm4gaW4gKnBtYXNrIHRoZSBwb3J0aW9uIG9mIGEgY3B1c2V0cydzIGNwdXNfYWxsb3dlZCB0aGF0CisgKiBSZXR1cm4gaW4gcG1hc2sgdGhlIHBvcnRpb24gb2YgYSBjcHVzZXRzJ3MgY3B1c19hbGxvd2VkIHRoYXQKICAqIGFyZSBvbmxpbmUuICBJZiBub25lIGFyZSBvbmxpbmUsIHdhbGsgdXAgdGhlIGNwdXNldCBoaWVyYXJjaHkKICAqIHVudGlsIHdlIGZpbmQgb25lIHRoYXQgZG9lcyBoYXZlIHNvbWUgb25saW5lIGNwdXMuICBJZiB3ZSBnZXQKICAqIGFsbCB0aGUgd2F5IHRvIHRoZSB0b3AgYW5kIHN0aWxsIGhhdmVuJ3QgZm91bmQgYW55IG9ubGluZSBjcHVzLApAQCAtMjkxLDE1ICsyODksMTYgQEAKICAqIENhbGwgd2l0aCBjYWxsYmFja19tdXRleCBoZWxkLgogICovCiAKLXN0YXRpYyB2b2lkIGd1YXJhbnRlZV9vbmxpbmVfY3B1cyhjb25zdCBzdHJ1Y3QgY3B1c2V0ICpjcywgY3B1bWFza190ICpwbWFzaykKK3N0YXRpYyB2b2lkIGd1YXJhbnRlZV9vbmxpbmVfY3B1cyhjb25zdCBzdHJ1Y3QgY3B1c2V0ICpjcywKKwkJCQkgIHN0cnVjdCBjcHVtYXNrICpwbWFzaykKIHsKLQl3aGlsZSAoY3MgJiYgIWNwdXNfaW50ZXJzZWN0cyhjcy0+Y3B1c19hbGxvd2VkLCBjcHVfb25saW5lX21hcCkpCisJd2hpbGUgKGNzICYmICFjcHVtYXNrX2ludGVyc2VjdHMoY3MtPmNwdXNfYWxsb3dlZCwgY3B1X29ubGluZV9tYXNrKSkKIAkJY3MgPSBjcy0+cGFyZW50OwogCWlmIChjcykKLQkJY3B1c19hbmQoKnBtYXNrLCBjcy0+Y3B1c19hbGxvd2VkLCBjcHVfb25saW5lX21hcCk7CisJCWNwdW1hc2tfYW5kKHBtYXNrLCBjcy0+Y3B1c19hbGxvd2VkLCBjcHVfb25saW5lX21hc2spOwogCWVsc2UKLQkJKnBtYXNrID0gY3B1X29ubGluZV9tYXA7Ci0JQlVHX09OKCFjcHVzX2ludGVyc2VjdHMoKnBtYXNrLCBjcHVfb25saW5lX21hcCkpOworCQljcHVtYXNrX2NvcHkocG1hc2ssIGNwdV9vbmxpbmVfbWFzayk7CisJQlVHX09OKCFjcHVtYXNrX2ludGVyc2VjdHMocG1hc2ssIGNwdV9vbmxpbmVfbWFzaykpOwogfQogCiAvKgpAQCAtMzc1LDE0ICszNzQsOSBAQAogCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrID0gY3VycmVudDsKIAlzdHJ1Y3QgY3B1c2V0ICpjczsKIAotCWlmICh0YXNrX2NzKHRzaykgPT0gJnRvcF9jcHVzZXQpIHsKLQkJLyogRG9uJ3QgbmVlZCByY3UgZm9yIHRvcF9jcHVzZXQuICBJdCdzIG5ldmVyIGZyZWVkLiAqLwotCQlteV9jcHVzZXRzX21lbV9nZW4gPSB0b3BfY3B1c2V0Lm1lbXNfZ2VuZXJhdGlvbjsKLQl9IGVsc2UgewotCQlyY3VfcmVhZF9sb2NrKCk7Ci0JCW15X2NwdXNldHNfbWVtX2dlbiA9IHRhc2tfY3ModHNrKS0+bWVtc19nZW5lcmF0aW9uOwotCQlyY3VfcmVhZF91bmxvY2soKTsKLQl9CisJcmN1X3JlYWRfbG9jaygpOworCW15X2NwdXNldHNfbWVtX2dlbiA9IHRhc2tfY3ModHNrKS0+bWVtc19nZW5lcmF0aW9uOworCXJjdV9yZWFkX3VubG9jaygpOwogCiAJaWYgKG15X2NwdXNldHNfbWVtX2dlbiAhPSB0c2stPmNwdXNldF9tZW1zX2dlbmVyYXRpb24pIHsKIAkJbXV0ZXhfbG9jaygmY2FsbGJhY2tfbXV0ZXgpOwpAQCAtNDE0LDEyICs0MDgsNDMgQEAKIAogc3RhdGljIGludCBpc19jcHVzZXRfc3Vic2V0KGNvbnN0IHN0cnVjdCBjcHVzZXQgKnAsIGNvbnN0IHN0cnVjdCBjcHVzZXQgKnEpCiB7Ci0JcmV0dXJuCWNwdXNfc3Vic2V0KHAtPmNwdXNfYWxsb3dlZCwgcS0+Y3B1c19hbGxvd2VkKSAmJgorCXJldHVybgljcHVtYXNrX3N1YnNldChwLT5jcHVzX2FsbG93ZWQsIHEtPmNwdXNfYWxsb3dlZCkgJiYKIAkJbm9kZXNfc3Vic2V0KHAtPm1lbXNfYWxsb3dlZCwgcS0+bWVtc19hbGxvd2VkKSAmJgogCQlpc19jcHVfZXhjbHVzaXZlKHApIDw9IGlzX2NwdV9leGNsdXNpdmUocSkgJiYKIAkJaXNfbWVtX2V4Y2x1c2l2ZShwKSA8PSBpc19tZW1fZXhjbHVzaXZlKHEpOwogfQogCisvKioKKyAqIGFsbG9jX3RyaWFsX2NwdXNldCAtIGFsbG9jYXRlIGEgdHJpYWwgY3B1c2V0CisgKiBAY3M6IHRoZSBjcHVzZXQgdGhhdCB0aGUgdHJpYWwgY3B1c2V0IGR1cGxpY2F0ZXMKKyAqLworc3RhdGljIHN0cnVjdCBjcHVzZXQgKmFsbG9jX3RyaWFsX2NwdXNldChjb25zdCBzdHJ1Y3QgY3B1c2V0ICpjcykKK3sKKwlzdHJ1Y3QgY3B1c2V0ICp0cmlhbDsKKworCXRyaWFsID0ga21lbWR1cChjcywgc2l6ZW9mKCpjcyksIEdGUF9LRVJORUwpOworCWlmICghdHJpYWwpCisJCXJldHVybiBOVUxMOworCisJaWYgKCFhbGxvY19jcHVtYXNrX3ZhcigmdHJpYWwtPmNwdXNfYWxsb3dlZCwgR0ZQX0tFUk5FTCkpIHsKKwkJa2ZyZWUodHJpYWwpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJY3B1bWFza19jb3B5KHRyaWFsLT5jcHVzX2FsbG93ZWQsIGNzLT5jcHVzX2FsbG93ZWQpOworCisJcmV0dXJuIHRyaWFsOworfQorCisvKioKKyAqIGZyZWVfdHJpYWxfY3B1c2V0IC0gZnJlZSB0aGUgdHJpYWwgY3B1c2V0CisgKiBAdHJpYWw6IHRoZSB0cmlhbCBjcHVzZXQgdG8gYmUgZnJlZWQKKyAqLworc3RhdGljIHZvaWQgZnJlZV90cmlhbF9jcHVzZXQoc3RydWN0IGNwdXNldCAqdHJpYWwpCit7CisJZnJlZV9jcHVtYXNrX3Zhcih0cmlhbC0+Y3B1c19hbGxvd2VkKTsKKwlrZnJlZSh0cmlhbCk7Cit9CisKIC8qCiAgKiB2YWxpZGF0ZV9jaGFuZ2UoKSAtIFVzZWQgdG8gdmFsaWRhdGUgdGhhdCBhbnkgcHJvcG9zZWQgY3B1c2V0IGNoYW5nZQogICoJCSAgICAgICBmb2xsb3dzIHRoZSBzdHJ1Y3R1cmFsIHJ1bGVzIGZvciBjcHVzZXRzLgpAQCAtNDY5LDcgKzQ5NCw3IEBACiAJCWMgPSBjZ3JvdXBfY3MoY29udCk7CiAJCWlmICgoaXNfY3B1X2V4Y2x1c2l2ZSh0cmlhbCkgfHwgaXNfY3B1X2V4Y2x1c2l2ZShjKSkgJiYKIAkJICAgIGMgIT0gY3VyICYmCi0JCSAgICBjcHVzX2ludGVyc2VjdHModHJpYWwtPmNwdXNfYWxsb3dlZCwgYy0+Y3B1c19hbGxvd2VkKSkKKwkJICAgIGNwdW1hc2tfaW50ZXJzZWN0cyh0cmlhbC0+Y3B1c19hbGxvd2VkLCBjLT5jcHVzX2FsbG93ZWQpKQogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCWlmICgoaXNfbWVtX2V4Y2x1c2l2ZSh0cmlhbCkgfHwgaXNfbWVtX2V4Y2x1c2l2ZShjKSkgJiYKIAkJICAgIGMgIT0gY3VyICYmCkBAIC00NzksNyArNTA0LDcgQEAKIAogCS8qIENwdXNldHMgd2l0aCB0YXNrcyBjYW4ndCBoYXZlIGVtcHR5IGNwdXNfYWxsb3dlZCBvciBtZW1zX2FsbG93ZWQgKi8KIAlpZiAoY2dyb3VwX3Rhc2tfY291bnQoY3VyLT5jc3MuY2dyb3VwKSkgewotCQlpZiAoY3B1c19lbXB0eSh0cmlhbC0+Y3B1c19hbGxvd2VkKSB8fAorCQlpZiAoY3B1bWFza19lbXB0eSh0cmlhbC0+Y3B1c19hbGxvd2VkKSB8fAogCQkgICAgbm9kZXNfZW1wdHkodHJpYWwtPm1lbXNfYWxsb3dlZCkpIHsKIAkJCXJldHVybiAtRU5PU1BDOwogCQl9CkBAIC00OTQsNyArNTE5LDcgQEAKICAqLwogc3RhdGljIGludCBjcHVzZXRzX292ZXJsYXAoc3RydWN0IGNwdXNldCAqYSwgc3RydWN0IGNwdXNldCAqYikKIHsKLQlyZXR1cm4gY3B1c19pbnRlcnNlY3RzKGEtPmNwdXNfYWxsb3dlZCwgYi0+Y3B1c19hbGxvd2VkKTsKKwlyZXR1cm4gY3B1bWFza19pbnRlcnNlY3RzKGEtPmNwdXNfYWxsb3dlZCwgYi0+Y3B1c19hbGxvd2VkKTsKIH0KIAogc3RhdGljIHZvaWQKQEAgLTUxOSw3ICs1NDQsNyBAQAogCQljcCA9IGxpc3RfZmlyc3RfZW50cnkoJnEsIHN0cnVjdCBjcHVzZXQsIHN0YWNrX2xpc3QpOwogCQlsaXN0X2RlbChxLm5leHQpOwogCi0JCWlmIChjcHVzX2VtcHR5KGNwLT5jcHVzX2FsbG93ZWQpKQorCQlpZiAoY3B1bWFza19lbXB0eShjcC0+Y3B1c19hbGxvd2VkKSkKIAkJCWNvbnRpbnVlOwogCiAJCWlmIChpc19zY2hlZF9sb2FkX2JhbGFuY2UoY3ApKQpAQCAtNTQzLDcgKzU2OCw3IEBACiAgKiBsb2FkIGJhbGFuY2luZyBkb21haW5zIChzY2hlZCBkb21haW5zKSBhcyBzcGVjaWZpZWQgYnkgdGhhdCBwYXJ0aWFsCiAgKiBwYXJ0aXRpb24uCiAgKgotICogU2VlICJXaGF0IGlzIHNjaGVkX2xvYWRfYmFsYW5jZSIgaW4gRG9jdW1lbnRhdGlvbi9jcHVzZXRzLnR4dAorICogU2VlICJXaGF0IGlzIHNjaGVkX2xvYWRfYmFsYW5jZSIgaW4gRG9jdW1lbnRhdGlvbi9jZ3JvdXBzL2NwdXNldHMudHh0CiAgKiBmb3IgYSBiYWNrZ3JvdW5kIGV4cGxhbmF0aW9uIG9mIHRoaXMuCiAgKgogICogRG9lcyBub3QgcmV0dXJuIGVycm9ycywgb24gdGhlIHRoZW9yeSB0aGF0IHRoZSBjYWxsZXJzIG9mIHRoaXMKQEAgLTU4Niw3ICs2MTEsOCBAQAogICoJZWxlbWVudCBvZiB0aGUgcGFydGl0aW9uIChvbmUgc2NoZWQgZG9tYWluKSB0byBiZSBwYXNzZWQgdG8KICAqCXBhcnRpdGlvbl9zY2hlZF9kb21haW5zKCkuCiAgKi8KLXN0YXRpYyBpbnQgZ2VuZXJhdGVfc2NoZWRfZG9tYWlucyhjcHVtYXNrX3QgKipkb21haW5zLAorLyogRklYTUU6IHNlZSB0aGUgRklYTUUgaW4gcGFydGl0aW9uX3NjaGVkX2RvbWFpbnMoKSAqLworc3RhdGljIGludCBnZW5lcmF0ZV9zY2hlZF9kb21haW5zKHN0cnVjdCBjcHVtYXNrICoqZG9tYWlucywKIAkJCXN0cnVjdCBzY2hlZF9kb21haW5fYXR0ciAqKmF0dHJpYnV0ZXMpCiB7CiAJTElTVF9IRUFEKHEpOwkJLyogcXVldWUgb2YgY3B1c2V0cyB0byBiZSBzY2FubmVkICovCkBAIC01OTQsMTAgKzYyMCwxMCBAQAogCXN0cnVjdCBjcHVzZXQgKipjc2E7CS8qIGFycmF5IG9mIGFsbCBjcHVzZXQgcHRycyAqLwogCWludCBjc247CQkvKiBob3cgbWFueSBjcHVzZXQgcHRycyBpbiBjc2Egc28gZmFyICovCiAJaW50IGksIGosIGs7CQkvKiBpbmRpY2VzIGZvciBwYXJ0aXRpb24gZmluZGluZyBsb29wcyAqLwotCWNwdW1hc2tfdCAqZG9tczsJLyogcmVzdWx0aW5nIHBhcnRpdGlvbjsgaS5lLiBzY2hlZCBkb21haW5zICovCisJc3RydWN0IGNwdW1hc2sgKmRvbXM7CS8qIHJlc3VsdGluZyBwYXJ0aXRpb247IGkuZS4gc2NoZWQgZG9tYWlucyAqLwogCXN0cnVjdCBzY2hlZF9kb21haW5fYXR0ciAqZGF0dHI7ICAvKiBhdHRyaWJ1dGVzIGZvciBjdXN0b20gZG9tYWlucyAqLwogCWludCBuZG9tcyA9IDA7CQkvKiBudW1iZXIgb2Ygc2NoZWQgZG9tYWlucyBpbiByZXN1bHQgKi8KLQlpbnQgbnNsb3Q7CQkvKiBuZXh0IGVtcHR5IGRvbXNbXSBjcHVtYXNrX3Qgc2xvdCAqLworCWludCBuc2xvdDsJCS8qIG5leHQgZW1wdHkgZG9tc1tdIHN0cnVjdCBjcHVtYXNrIHNsb3QgKi8KIAogCWRvbXMgPSBOVUxMOwogCWRhdHRyID0gTlVMTDsKQEAgLTYwNSw3ICs2MzEsNyBAQAogCiAJLyogU3BlY2lhbCBjYXNlIGZvciB0aGUgOTklIG9mIHN5c3RlbXMgd2l0aCBvbmUsIGZ1bGwsIHNjaGVkIGRvbWFpbiAqLwogCWlmIChpc19zY2hlZF9sb2FkX2JhbGFuY2UoJnRvcF9jcHVzZXQpKSB7Ci0JCWRvbXMgPSBrbWFsbG9jKHNpemVvZihjcHVtYXNrX3QpLCBHRlBfS0VSTkVMKTsKKwkJZG9tcyA9IGttYWxsb2MoY3B1bWFza19zaXplKCksIEdGUF9LRVJORUwpOwogCQlpZiAoIWRvbXMpCiAJCQlnb3RvIGRvbmU7CiAKQEAgLTYxNCw3ICs2NDAsNyBAQAogCQkJKmRhdHRyID0gU0RfQVRUUl9JTklUOwogCQkJdXBkYXRlX2RvbWFpbl9hdHRyX3RyZWUoZGF0dHIsICZ0b3BfY3B1c2V0KTsKIAkJfQotCQkqZG9tcyA9IHRvcF9jcHVzZXQuY3B1c19hbGxvd2VkOworCQljcHVtYXNrX2NvcHkoZG9tcywgdG9wX2NwdXNldC5jcHVzX2FsbG93ZWQpOwogCiAJCW5kb21zID0gMTsKIAkJZ290byBkb25lOwpAQCAtNjMzLDcgKzY1OSw3IEBACiAJCWNwID0gbGlzdF9maXJzdF9lbnRyeSgmcSwgc3RydWN0IGNwdXNldCwgc3RhY2tfbGlzdCk7CiAJCWxpc3RfZGVsKHEubmV4dCk7CiAKLQkJaWYgKGNwdXNfZW1wdHkoY3AtPmNwdXNfYWxsb3dlZCkpCisJCWlmIChjcHVtYXNrX2VtcHR5KGNwLT5jcHVzX2FsbG93ZWQpKQogCQkJY29udGludWU7CiAKIAkJLyoKQEAgLTY4NCw3ICs3MTAsNyBAQAogCSAqIE5vdyB3ZSBrbm93IGhvdyBtYW55IGRvbWFpbnMgdG8gY3JlYXRlLgogCSAqIENvbnZlcnQgPGNzbiwgY3NhPiB0byA8bmRvbXMsIGRvbXM+IGFuZCBwb3B1bGF0ZSBjcHUgbWFza3MuCiAJICovCi0JZG9tcyA9IGttYWxsb2MobmRvbXMgKiBzaXplb2YoY3B1bWFza190KSwgR0ZQX0tFUk5FTCk7CisJZG9tcyA9IGttYWxsb2MobmRvbXMgKiBjcHVtYXNrX3NpemUoKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFkb21zKQogCQlnb3RvIGRvbmU7CiAKQEAgLTY5Niw3ICs3MjIsNyBAQAogCiAJZm9yIChuc2xvdCA9IDAsIGkgPSAwOyBpIDwgY3NuOyBpKyspIHsKIAkJc3RydWN0IGNwdXNldCAqYSA9IGNzYVtpXTsKLQkJY3B1bWFza190ICpkcDsKKwkJc3RydWN0IGNwdW1hc2sgKmRwOwogCQlpbnQgYXBuID0gYS0+cG47CiAKIAkJaWYgKGFwbiA8IDApIHsKQEAgLTcxOSwxNCArNzQ1LDE0IEBACiAJCQljb250aW51ZTsKIAkJfQogCi0JCWNwdXNfY2xlYXIoKmRwKTsKKwkJY3B1bWFza19jbGVhcihkcCk7CiAJCWlmIChkYXR0cikKIAkJCSooZGF0dHIgKyBuc2xvdCkgPSBTRF9BVFRSX0lOSVQ7CiAJCWZvciAoaiA9IGk7IGogPCBjc247IGorKykgewogCQkJc3RydWN0IGNwdXNldCAqYiA9IGNzYVtqXTsKIAogCQkJaWYgKGFwbiA9PSBiLT5wbikgewotCQkJCWNwdXNfb3IoKmRwLCAqZHAsIGItPmNwdXNfYWxsb3dlZCk7CisJCQkJY3B1bWFza19vcihkcCwgZHAsIGItPmNwdXNfYWxsb3dlZCk7CiAJCQkJaWYgKGRhdHRyKQogCQkJCQl1cGRhdGVfZG9tYWluX2F0dHJfdHJlZShkYXR0ciArIG5zbG90LCBiKTsKIApAQCAtNzY2LDcgKzc5Miw3IEBACiBzdGF0aWMgdm9pZCBkb19yZWJ1aWxkX3NjaGVkX2RvbWFpbnMoc3RydWN0IHdvcmtfc3RydWN0ICp1bnVzZWQpCiB7CiAJc3RydWN0IHNjaGVkX2RvbWFpbl9hdHRyICphdHRyOwotCWNwdW1hc2tfdCAqZG9tczsKKwlzdHJ1Y3QgY3B1bWFzayAqZG9tczsKIAlpbnQgbmRvbXM7CiAKIAlnZXRfb25saW5lX2NwdXMoKTsKQEAgLTgzNSw3ICs4NjEsNyBAQAogc3RhdGljIGludCBjcHVzZXRfdGVzdF9jcHVtYXNrKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLAogCQkJICAgICAgIHN0cnVjdCBjZ3JvdXBfc2Nhbm5lciAqc2NhbikKIHsKLQlyZXR1cm4gIWNwdXNfZXF1YWwodHNrLT5jcHVzX2FsbG93ZWQsCisJcmV0dXJuICFjcHVtYXNrX2VxdWFsKCZ0c2stPmNwdXNfYWxsb3dlZCwKIAkJCShjZ3JvdXBfY3Moc2Nhbi0+Y2cpKS0+Y3B1c19hbGxvd2VkKTsKIH0KIApAQCAtODUzLDcgKzg3OSw3IEBACiBzdGF0aWMgdm9pZCBjcHVzZXRfY2hhbmdlX2NwdW1hc2soc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssCiAJCQkJICBzdHJ1Y3QgY2dyb3VwX3NjYW5uZXIgKnNjYW4pCiB7Ci0Jc2V0X2NwdXNfYWxsb3dlZF9wdHIodHNrLCAmKChjZ3JvdXBfY3Moc2Nhbi0+Y2cpKS0+Y3B1c19hbGxvd2VkKSk7CisJc2V0X2NwdXNfYWxsb3dlZF9wdHIodHNrLCAoKGNncm91cF9jcyhzY2FuLT5jZykpLT5jcHVzX2FsbG93ZWQpKTsKIH0KIAogLyoqCkBAIC04ODUsMTAgKzkxMSwxMCBAQAogICogQGNzOiB0aGUgY3B1c2V0IHRvIGNvbnNpZGVyCiAgKiBAYnVmOiBidWZmZXIgb2YgY3B1IG51bWJlcnMgd3JpdHRlbiB0byB0aGlzIGNwdXNldAogICovCi1zdGF0aWMgaW50IHVwZGF0ZV9jcHVtYXNrKHN0cnVjdCBjcHVzZXQgKmNzLCBjb25zdCBjaGFyICpidWYpCitzdGF0aWMgaW50IHVwZGF0ZV9jcHVtYXNrKHN0cnVjdCBjcHVzZXQgKmNzLCBzdHJ1Y3QgY3B1c2V0ICp0cmlhbGNzLAorCQkJICBjb25zdCBjaGFyICpidWYpCiB7CiAJc3RydWN0IHB0cl9oZWFwIGhlYXA7Ci0Jc3RydWN0IGNwdXNldCB0cmlhbGNzOwogCWludCByZXR2YWw7CiAJaW50IGlzX2xvYWRfYmFsYW5jZWQ7CiAKQEAgLTg5Niw4ICs5MjIsNiBAQAogCWlmIChjcyA9PSAmdG9wX2NwdXNldCkKIAkJcmV0dXJuIC1FQUNDRVM7CiAKLQl0cmlhbGNzID0gKmNzOwotCiAJLyoKIAkgKiBBbiBlbXB0eSBjcHVzX2FsbG93ZWQgaXMgb2sgb25seSBpZiB0aGUgY3B1c2V0IGhhcyBubyB0YXNrcy4KIAkgKiBTaW5jZSBjcHVsaXN0X3BhcnNlKCkgZmFpbHMgb24gYW4gZW1wdHkgbWFzaywgd2Ugc3BlY2lhbCBjYXNlCkBAIC05MDUsMzEgKzkyOSwzMSBAQAogCSAqIHdpdGggdGFza3MgaGF2ZSBjcHVzLgogCSAqLwogCWlmICghKmJ1ZikgewotCQljcHVzX2NsZWFyKHRyaWFsY3MuY3B1c19hbGxvd2VkKTsKKwkJY3B1bWFza19jbGVhcih0cmlhbGNzLT5jcHVzX2FsbG93ZWQpOwogCX0gZWxzZSB7Ci0JCXJldHZhbCA9IGNwdWxpc3RfcGFyc2UoYnVmLCAmdHJpYWxjcy5jcHVzX2FsbG93ZWQpOworCQlyZXR2YWwgPSBjcHVsaXN0X3BhcnNlKGJ1ZiwgdHJpYWxjcy0+Y3B1c19hbGxvd2VkKTsKIAkJaWYgKHJldHZhbCA8IDApCiAJCQlyZXR1cm4gcmV0dmFsOwogCi0JCWlmICghY3B1c19zdWJzZXQodHJpYWxjcy5jcHVzX2FsbG93ZWQsIGNwdV9vbmxpbmVfbWFwKSkKKwkJaWYgKCFjcHVtYXNrX3N1YnNldCh0cmlhbGNzLT5jcHVzX2FsbG93ZWQsIGNwdV9vbmxpbmVfbWFzaykpCiAJCQlyZXR1cm4gLUVJTlZBTDsKIAl9Ci0JcmV0dmFsID0gdmFsaWRhdGVfY2hhbmdlKGNzLCAmdHJpYWxjcyk7CisJcmV0dmFsID0gdmFsaWRhdGVfY2hhbmdlKGNzLCB0cmlhbGNzKTsKIAlpZiAocmV0dmFsIDwgMCkKIAkJcmV0dXJuIHJldHZhbDsKIAogCS8qIE5vdGhpbmcgdG8gZG8gaWYgdGhlIGNwdXMgZGlkbid0IGNoYW5nZSAqLwotCWlmIChjcHVzX2VxdWFsKGNzLT5jcHVzX2FsbG93ZWQsIHRyaWFsY3MuY3B1c19hbGxvd2VkKSkKKwlpZiAoY3B1bWFza19lcXVhbChjcy0+Y3B1c19hbGxvd2VkLCB0cmlhbGNzLT5jcHVzX2FsbG93ZWQpKQogCQlyZXR1cm4gMDsKIAogCXJldHZhbCA9IGhlYXBfaW5pdCgmaGVhcCwgUEFHRV9TSVpFLCBHRlBfS0VSTkVMLCBOVUxMKTsKIAlpZiAocmV0dmFsKQogCQlyZXR1cm4gcmV0dmFsOwogCi0JaXNfbG9hZF9iYWxhbmNlZCA9IGlzX3NjaGVkX2xvYWRfYmFsYW5jZSgmdHJpYWxjcyk7CisJaXNfbG9hZF9iYWxhbmNlZCA9IGlzX3NjaGVkX2xvYWRfYmFsYW5jZSh0cmlhbGNzKTsKIAogCW11dGV4X2xvY2soJmNhbGxiYWNrX211dGV4KTsKLQljcy0+Y3B1c19hbGxvd2VkID0gdHJpYWxjcy5jcHVzX2FsbG93ZWQ7CisJY3B1bWFza19jb3B5KGNzLT5jcHVzX2FsbG93ZWQsIHRyaWFsY3MtPmNwdXNfYWxsb3dlZCk7CiAJbXV0ZXhfdW5sb2NrKCZjYWxsYmFja19tdXRleCk7CiAKIAkvKgpAQCAtMTAxNyw3ICsxMDQxLDcgQEAKIAljcHVzZXRfYmVpbmdfcmVib3VuZCA9IGNzOwkJLyogY2F1c2VzIG1wb2xfZHVwKCkgcmViaW5kICovCiAKIAlmdWRnZSA9IDEwOwkJCQkvKiBzcGFyZSBtbWFycmF5W10gc2xvdHMgKi8KLQlmdWRnZSArPSBjcHVzX3dlaWdodChjcy0+Y3B1c19hbGxvd2VkKTsJLyogaW1hZ2luZSBvbmUgZm9yay1ib21iL2NwdSAqLworCWZ1ZGdlICs9IGNwdW1hc2tfd2VpZ2h0KGNzLT5jcHVzX2FsbG93ZWQpOy8qIGltYWdpbmUgMSBmb3JrLWJvbWIvY3B1ICovCiAJcmV0dmFsID0gLUVOT01FTTsKIAogCS8qCkBAIC0xMTA0LDkgKzExMjgsOSBAQAogICogbG9jayBlYWNoIHN1Y2ggdGFza3MgbW0tPm1tYXBfc2VtLCBzY2FuIGl0cyB2bWEncyBhbmQgcmViaW5kCiAgKiB0aGVpciBtZW1wb2xpY2llcyB0byB0aGUgY3B1c2V0cyBuZXcgbWVtc19hbGxvd2VkLgogICovCi1zdGF0aWMgaW50IHVwZGF0ZV9ub2RlbWFzayhzdHJ1Y3QgY3B1c2V0ICpjcywgY29uc3QgY2hhciAqYnVmKQorc3RhdGljIGludCB1cGRhdGVfbm9kZW1hc2soc3RydWN0IGNwdXNldCAqY3MsIHN0cnVjdCBjcHVzZXQgKnRyaWFsY3MsCisJCQkgICBjb25zdCBjaGFyICpidWYpCiB7Ci0Jc3RydWN0IGNwdXNldCB0cmlhbGNzOwogCW5vZGVtYXNrX3Qgb2xkbWVtOwogCWludCByZXR2YWw7CiAKQEAgLTExMTcsOCArMTE0MSw2IEBACiAJaWYgKGNzID09ICZ0b3BfY3B1c2V0KQogCQlyZXR1cm4gLUVBQ0NFUzsKIAotCXRyaWFsY3MgPSAqY3M7Ci0KIAkvKgogCSAqIEFuIGVtcHR5IG1lbXNfYWxsb3dlZCBpcyBvayBpZmYgdGhlcmUgYXJlIG5vIHRhc2tzIGluIHRoZSBjcHVzZXQuCiAJICogU2luY2Ugbm9kZWxpc3RfcGFyc2UoKSBmYWlscyBvbiBhbiBlbXB0eSBtYXNrLCB3ZSBzcGVjaWFsIGNhc2UKQEAgLTExMjYsMjcgKzExNDgsMjcgQEAKIAkgKiB3aXRoIHRhc2tzIGhhdmUgbWVtb3J5LgogCSAqLwogCWlmICghKmJ1ZikgewotCQlub2Rlc19jbGVhcih0cmlhbGNzLm1lbXNfYWxsb3dlZCk7CisJCW5vZGVzX2NsZWFyKHRyaWFsY3MtPm1lbXNfYWxsb3dlZCk7CiAJfSBlbHNlIHsKLQkJcmV0dmFsID0gbm9kZWxpc3RfcGFyc2UoYnVmLCB0cmlhbGNzLm1lbXNfYWxsb3dlZCk7CisJCXJldHZhbCA9IG5vZGVsaXN0X3BhcnNlKGJ1ZiwgdHJpYWxjcy0+bWVtc19hbGxvd2VkKTsKIAkJaWYgKHJldHZhbCA8IDApCiAJCQlnb3RvIGRvbmU7CiAKLQkJaWYgKCFub2Rlc19zdWJzZXQodHJpYWxjcy5tZW1zX2FsbG93ZWQsCisJCWlmICghbm9kZXNfc3Vic2V0KHRyaWFsY3MtPm1lbXNfYWxsb3dlZCwKIAkJCQlub2RlX3N0YXRlc1tOX0hJR0hfTUVNT1JZXSkpCiAJCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAJb2xkbWVtID0gY3MtPm1lbXNfYWxsb3dlZDsKLQlpZiAobm9kZXNfZXF1YWwob2xkbWVtLCB0cmlhbGNzLm1lbXNfYWxsb3dlZCkpIHsKKwlpZiAobm9kZXNfZXF1YWwob2xkbWVtLCB0cmlhbGNzLT5tZW1zX2FsbG93ZWQpKSB7CiAJCXJldHZhbCA9IDA7CQkvKiBUb28gZWFzeSAtIG5vdGhpbmcgdG8gZG8gKi8KIAkJZ290byBkb25lOwogCX0KLQlyZXR2YWwgPSB2YWxpZGF0ZV9jaGFuZ2UoY3MsICZ0cmlhbGNzKTsKKwlyZXR2YWwgPSB2YWxpZGF0ZV9jaGFuZ2UoY3MsIHRyaWFsY3MpOwogCWlmIChyZXR2YWwgPCAwKQogCQlnb3RvIGRvbmU7CiAKIAltdXRleF9sb2NrKCZjYWxsYmFja19tdXRleCk7Ci0JY3MtPm1lbXNfYWxsb3dlZCA9IHRyaWFsY3MubWVtc19hbGxvd2VkOworCWNzLT5tZW1zX2FsbG93ZWQgPSB0cmlhbGNzLT5tZW1zX2FsbG93ZWQ7CiAJY3MtPm1lbXNfZ2VuZXJhdGlvbiA9IGNwdXNldF9tZW1zX2dlbmVyYXRpb24rKzsKIAltdXRleF91bmxvY2soJmNhbGxiYWNrX211dGV4KTsKIApAQCAtMTE2Nyw3ICsxMTg5LDggQEAKIAogCWlmICh2YWwgIT0gY3MtPnJlbGF4X2RvbWFpbl9sZXZlbCkgewogCQljcy0+cmVsYXhfZG9tYWluX2xldmVsID0gdmFsOwotCQlpZiAoIWNwdXNfZW1wdHkoY3MtPmNwdXNfYWxsb3dlZCkgJiYgaXNfc2NoZWRfbG9hZF9iYWxhbmNlKGNzKSkKKwkJaWYgKCFjcHVtYXNrX2VtcHR5KGNzLT5jcHVzX2FsbG93ZWQpICYmCisJCSAgICBpc19zY2hlZF9sb2FkX2JhbGFuY2UoY3MpKQogCQkJYXN5bmNfcmVidWlsZF9zY2hlZF9kb21haW5zKCk7CiAJfQogCkBAIC0xMTg2LDMxICsxMjA5LDM2IEBACiBzdGF0aWMgaW50IHVwZGF0ZV9mbGFnKGNwdXNldF9mbGFnYml0c190IGJpdCwgc3RydWN0IGNwdXNldCAqY3MsCiAJCSAgICAgICBpbnQgdHVybmluZ19vbikKIHsKLQlzdHJ1Y3QgY3B1c2V0IHRyaWFsY3M7CisJc3RydWN0IGNwdXNldCAqdHJpYWxjczsKIAlpbnQgZXJyOwogCWludCBiYWxhbmNlX2ZsYWdfY2hhbmdlZDsKIAotCXRyaWFsY3MgPSAqY3M7Ci0JaWYgKHR1cm5pbmdfb24pCi0JCXNldF9iaXQoYml0LCAmdHJpYWxjcy5mbGFncyk7Ci0JZWxzZQotCQljbGVhcl9iaXQoYml0LCAmdHJpYWxjcy5mbGFncyk7CisJdHJpYWxjcyA9IGFsbG9jX3RyaWFsX2NwdXNldChjcyk7CisJaWYgKCF0cmlhbGNzKQorCQlyZXR1cm4gLUVOT01FTTsKIAotCWVyciA9IHZhbGlkYXRlX2NoYW5nZShjcywgJnRyaWFsY3MpOworCWlmICh0dXJuaW5nX29uKQorCQlzZXRfYml0KGJpdCwgJnRyaWFsY3MtPmZsYWdzKTsKKwllbHNlCisJCWNsZWFyX2JpdChiaXQsICZ0cmlhbGNzLT5mbGFncyk7CisKKwllcnIgPSB2YWxpZGF0ZV9jaGFuZ2UoY3MsIHRyaWFsY3MpOwogCWlmIChlcnIgPCAwKQotCQlyZXR1cm4gZXJyOworCQlnb3RvIG91dDsKIAogCWJhbGFuY2VfZmxhZ19jaGFuZ2VkID0gKGlzX3NjaGVkX2xvYWRfYmFsYW5jZShjcykgIT0KLQkJIAkJCWlzX3NjaGVkX2xvYWRfYmFsYW5jZSgmdHJpYWxjcykpOworCQkJCWlzX3NjaGVkX2xvYWRfYmFsYW5jZSh0cmlhbGNzKSk7CiAKIAltdXRleF9sb2NrKCZjYWxsYmFja19tdXRleCk7Ci0JY3MtPmZsYWdzID0gdHJpYWxjcy5mbGFnczsKKwljcy0+ZmxhZ3MgPSB0cmlhbGNzLT5mbGFnczsKIAltdXRleF91bmxvY2soJmNhbGxiYWNrX211dGV4KTsKIAotCWlmICghY3B1c19lbXB0eSh0cmlhbGNzLmNwdXNfYWxsb3dlZCkgJiYgYmFsYW5jZV9mbGFnX2NoYW5nZWQpCisJaWYgKCFjcHVtYXNrX2VtcHR5KHRyaWFsY3MtPmNwdXNfYWxsb3dlZCkgJiYgYmFsYW5jZV9mbGFnX2NoYW5nZWQpCiAJCWFzeW5jX3JlYnVpbGRfc2NoZWRfZG9tYWlucygpOwogCi0JcmV0dXJuIDA7CitvdXQ6CisJZnJlZV90cmlhbF9jcHVzZXQodHJpYWxjcyk7CisJcmV0dXJuIGVycjsKIH0KIAogLyoKQEAgLTEzMTEsNDIgKzEzMzksNDcgQEAKIAlyZXR1cm4gdmFsOwogfQogCisvKiBQcm90ZWN0ZWQgYnkgY2dyb3VwX2xvY2sgKi8KK3N0YXRpYyBjcHVtYXNrX3Zhcl90IGNwdXNfYXR0YWNoOworCiAvKiBDYWxsZWQgYnkgY2dyb3VwcyB0byBkZXRlcm1pbmUgaWYgYSBjcHVzZXQgaXMgdXNhYmxlOyBjZ3JvdXBfbXV0ZXggaGVsZCAqLwogc3RhdGljIGludCBjcHVzZXRfY2FuX2F0dGFjaChzdHJ1Y3QgY2dyb3VwX3N1YnN5cyAqc3MsCiAJCQkgICAgIHN0cnVjdCBjZ3JvdXAgKmNvbnQsIHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKQogewogCXN0cnVjdCBjcHVzZXQgKmNzID0gY2dyb3VwX2NzKGNvbnQpOworCWludCByZXQgPSAwOwogCi0JaWYgKGNwdXNfZW1wdHkoY3MtPmNwdXNfYWxsb3dlZCkgfHwgbm9kZXNfZW1wdHkoY3MtPm1lbXNfYWxsb3dlZCkpCisJaWYgKGNwdW1hc2tfZW1wdHkoY3MtPmNwdXNfYWxsb3dlZCkgfHwgbm9kZXNfZW1wdHkoY3MtPm1lbXNfYWxsb3dlZCkpCiAJCXJldHVybiAtRU5PU1BDOwotCWlmICh0c2stPmZsYWdzICYgUEZfVEhSRUFEX0JPVU5EKSB7Ci0JCWNwdW1hc2tfdCBtYXNrOwogCisJaWYgKHRzay0+ZmxhZ3MgJiBQRl9USFJFQURfQk9VTkQpIHsKIAkJbXV0ZXhfbG9jaygmY2FsbGJhY2tfbXV0ZXgpOwotCQltYXNrID0gY3MtPmNwdXNfYWxsb3dlZDsKKwkJaWYgKCFjcHVtYXNrX2VxdWFsKCZ0c2stPmNwdXNfYWxsb3dlZCwgY3MtPmNwdXNfYWxsb3dlZCkpCisJCQlyZXQgPSAtRUlOVkFMOwogCQltdXRleF91bmxvY2soJmNhbGxiYWNrX211dGV4KTsKLQkJaWYgKCFjcHVzX2VxdWFsKHRzay0+Y3B1c19hbGxvd2VkLCBtYXNrKSkKLQkJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCXJldHVybiBzZWN1cml0eV90YXNrX3NldHNjaGVkdWxlcih0c2ssIDAsIE5VTEwpOworCXJldHVybiByZXQgPCAwID8gcmV0IDogc2VjdXJpdHlfdGFza19zZXRzY2hlZHVsZXIodHNrLCAwLCBOVUxMKTsKIH0KIAogc3RhdGljIHZvaWQgY3B1c2V0X2F0dGFjaChzdHJ1Y3QgY2dyb3VwX3N1YnN5cyAqc3MsCiAJCQkgIHN0cnVjdCBjZ3JvdXAgKmNvbnQsIHN0cnVjdCBjZ3JvdXAgKm9sZGNvbnQsCiAJCQkgIHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKQogewotCWNwdW1hc2tfdCBjcHVzOwogCW5vZGVtYXNrX3QgZnJvbSwgdG87CiAJc3RydWN0IG1tX3N0cnVjdCAqbW07CiAJc3RydWN0IGNwdXNldCAqY3MgPSBjZ3JvdXBfY3MoY29udCk7CiAJc3RydWN0IGNwdXNldCAqb2xkY3MgPSBjZ3JvdXBfY3Mob2xkY29udCk7CiAJaW50IGVycjsKIAotCW11dGV4X2xvY2soJmNhbGxiYWNrX211dGV4KTsKLQlndWFyYW50ZWVfb25saW5lX2NwdXMoY3MsICZjcHVzKTsKLQllcnIgPSBzZXRfY3B1c19hbGxvd2VkX3B0cih0c2ssICZjcHVzKTsKLQltdXRleF91bmxvY2soJmNhbGxiYWNrX211dGV4KTsKKwlpZiAoY3MgPT0gJnRvcF9jcHVzZXQpIHsKKwkJY3B1bWFza19jb3B5KGNwdXNfYXR0YWNoLCBjcHVfcG9zc2libGVfbWFzayk7CisJfSBlbHNlIHsKKwkJbXV0ZXhfbG9jaygmY2FsbGJhY2tfbXV0ZXgpOworCQlndWFyYW50ZWVfb25saW5lX2NwdXMoY3MsIGNwdXNfYXR0YWNoKTsKKwkJbXV0ZXhfdW5sb2NrKCZjYWxsYmFja19tdXRleCk7CisJfQorCWVyciA9IHNldF9jcHVzX2FsbG93ZWRfcHRyKHRzaywgY3B1c19hdHRhY2gpOwogCWlmIChlcnIpCiAJCXJldHVybjsKIApAQCAtMTM1OSw3ICsxMzkyLDYgQEAKIAkJCWNwdXNldF9taWdyYXRlX21tKG1tLCAmZnJvbSwgJnRvKTsKIAkJbW1wdXQobW0pOwogCX0KLQogfQogCiAvKiBUaGUgdmFyaW91cyB0eXBlcyBvZiBmaWxlcyBhbmQgZGlyZWN0b3JpZXMgaW4gYSBjcHVzZXQgZmlsZSBzeXN0ZW0gKi8KQEAgLTE0NTQsMjEgKzE0ODYsMjkgQEAKIAkJCQljb25zdCBjaGFyICpidWYpCiB7CiAJaW50IHJldHZhbCA9IDA7CisJc3RydWN0IGNwdXNldCAqY3MgPSBjZ3JvdXBfY3MoY2dycCk7CisJc3RydWN0IGNwdXNldCAqdHJpYWxjczsKIAogCWlmICghY2dyb3VwX2xvY2tfbGl2ZV9ncm91cChjZ3JwKSkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKKwl0cmlhbGNzID0gYWxsb2NfdHJpYWxfY3B1c2V0KGNzKTsKKwlpZiAoIXRyaWFsY3MpCisJCXJldHVybiAtRU5PTUVNOworCiAJc3dpdGNoIChjZnQtPnByaXZhdGUpIHsKIAljYXNlIEZJTEVfQ1BVTElTVDoKLQkJcmV0dmFsID0gdXBkYXRlX2NwdW1hc2soY2dyb3VwX2NzKGNncnApLCBidWYpOworCQlyZXR2YWwgPSB1cGRhdGVfY3B1bWFzayhjcywgdHJpYWxjcywgYnVmKTsKIAkJYnJlYWs7CiAJY2FzZSBGSUxFX01FTUxJU1Q6Ci0JCXJldHZhbCA9IHVwZGF0ZV9ub2RlbWFzayhjZ3JvdXBfY3MoY2dycCksIGJ1Zik7CisJCXJldHZhbCA9IHVwZGF0ZV9ub2RlbWFzayhjcywgdHJpYWxjcywgYnVmKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcmV0dmFsID0gLUVJTlZBTDsKIAkJYnJlYWs7CiAJfQorCisJZnJlZV90cmlhbF9jcHVzZXQodHJpYWxjcyk7CiAJY2dyb3VwX3VubG9jaygpOwogCXJldHVybiByZXR2YWw7CiB9CkBAIC0xNDg3LDEzICsxNTI3LDEzIEBACiAKIHN0YXRpYyBpbnQgY3B1c2V0X3NwcmludGZfY3B1bGlzdChjaGFyICpwYWdlLCBzdHJ1Y3QgY3B1c2V0ICpjcykKIHsKLQljcHVtYXNrX3QgbWFzazsKKwlpbnQgcmV0OwogCiAJbXV0ZXhfbG9jaygmY2FsbGJhY2tfbXV0ZXgpOwotCW1hc2sgPSBjcy0+Y3B1c19hbGxvd2VkOworCXJldCA9IGNwdWxpc3Rfc2NucHJpbnRmKHBhZ2UsIFBBR0VfU0laRSwgY3MtPmNwdXNfYWxsb3dlZCk7CiAJbXV0ZXhfdW5sb2NrKCZjYWxsYmFja19tdXRleCk7CiAKLQlyZXR1cm4gY3B1bGlzdF9zY25wcmludGYocGFnZSwgUEFHRV9TSVpFLCAmbWFzayk7CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGludCBjcHVzZXRfc3ByaW50Zl9tZW1saXN0KGNoYXIgKnBhZ2UsIHN0cnVjdCBjcHVzZXQgKmNzKQpAQCAtMTcyOSw3ICsxNzY5LDcgQEAKIAlwYXJlbnRfY3MgPSBjZ3JvdXBfY3MocGFyZW50KTsKIAogCWNzLT5tZW1zX2FsbG93ZWQgPSBwYXJlbnRfY3MtPm1lbXNfYWxsb3dlZDsKLQljcy0+Y3B1c19hbGxvd2VkID0gcGFyZW50X2NzLT5jcHVzX2FsbG93ZWQ7CisJY3B1bWFza19jb3B5KGNzLT5jcHVzX2FsbG93ZWQsIHBhcmVudF9jcy0+Y3B1c19hbGxvd2VkKTsKIAlyZXR1cm47CiB9CiAKQEAgLTE3NTUsNiArMTc5NSwxMCBAQAogCWNzID0ga21hbGxvYyhzaXplb2YoKmNzKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFjcykKIAkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisJaWYgKCFhbGxvY19jcHVtYXNrX3ZhcigmY3MtPmNwdXNfYWxsb3dlZCwgR0ZQX0tFUk5FTCkpIHsKKwkJa2ZyZWUoY3MpOworCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwl9CiAKIAljcHVzZXRfdXBkYXRlX3Rhc2tfbWVtb3J5X3N0YXRlKCk7CiAJY3MtPmZsYWdzID0gMDsKQEAgLTE3NjMsNyArMTgwNyw3IEBACiAJaWYgKGlzX3NwcmVhZF9zbGFiKHBhcmVudCkpCiAJCXNldF9iaXQoQ1NfU1BSRUFEX1NMQUIsICZjcy0+ZmxhZ3MpOwogCXNldF9iaXQoQ1NfU0NIRURfTE9BRF9CQUxBTkNFLCAmY3MtPmZsYWdzKTsKLQljcHVzX2NsZWFyKGNzLT5jcHVzX2FsbG93ZWQpOworCWNwdW1hc2tfY2xlYXIoY3MtPmNwdXNfYWxsb3dlZCk7CiAJbm9kZXNfY2xlYXIoY3MtPm1lbXNfYWxsb3dlZCk7CiAJY3MtPm1lbXNfZ2VuZXJhdGlvbiA9IGNwdXNldF9tZW1zX2dlbmVyYXRpb24rKzsKIAlmbWV0ZXJfaW5pdCgmY3MtPmZtZXRlcik7CkBAIC0xNzkwLDYgKzE4MzQsNyBAQAogCQl1cGRhdGVfZmxhZyhDU19TQ0hFRF9MT0FEX0JBTEFOQ0UsIGNzLCAwKTsKIAogCW51bWJlcl9vZl9jcHVzZXRzLS07CisJZnJlZV9jcHVtYXNrX3Zhcihjcy0+Y3B1c19hbGxvd2VkKTsKIAlrZnJlZShjcyk7CiB9CiAKQEAgLTE4MTMsNiArMTg1OCw4IEBACiAKIGludCBfX2luaXQgY3B1c2V0X2luaXRfZWFybHkodm9pZCkKIHsKKwlhbGxvY19ib290bWVtX2NwdW1hc2tfdmFyKCZ0b3BfY3B1c2V0LmNwdXNfYWxsb3dlZCk7CisKIAl0b3BfY3B1c2V0Lm1lbXNfZ2VuZXJhdGlvbiA9IGNwdXNldF9tZW1zX2dlbmVyYXRpb24rKzsKIAlyZXR1cm4gMDsKIH0KQEAgLTE4MjgsNyArMTg3NSw3IEBACiB7CiAJaW50IGVyciA9IDA7CiAKLQljcHVzX3NldGFsbCh0b3BfY3B1c2V0LmNwdXNfYWxsb3dlZCk7CisJY3B1bWFza19zZXRhbGwodG9wX2NwdXNldC5jcHVzX2FsbG93ZWQpOwogCW5vZGVzX3NldGFsbCh0b3BfY3B1c2V0Lm1lbXNfYWxsb3dlZCk7CiAKIAlmbWV0ZXJfaW5pdCgmdG9wX2NwdXNldC5mbWV0ZXIpOwpAQCAtMTg0MCw2ICsxODg3LDkgQEAKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIAorCWlmICghYWxsb2NfY3B1bWFza192YXIoJmNwdXNfYXR0YWNoLCBHRlBfS0VSTkVMKSkKKwkJQlVHKCk7CisKIAludW1iZXJfb2ZfY3B1c2V0cyA9IDE7CiAJcmV0dXJuIDA7CiB9CkBAIC0xOTE0LDcgKzE5NjQsNyBAQAogCSAqIGhhcyBvbmxpbmUgY3B1cywgc28gY2FuJ3QgYmUgZW1wdHkpLgogCSAqLwogCXBhcmVudCA9IGNzLT5wYXJlbnQ7Ci0Jd2hpbGUgKGNwdXNfZW1wdHkocGFyZW50LT5jcHVzX2FsbG93ZWQpIHx8CisJd2hpbGUgKGNwdW1hc2tfZW1wdHkocGFyZW50LT5jcHVzX2FsbG93ZWQpIHx8CiAJCQlub2Rlc19lbXB0eShwYXJlbnQtPm1lbXNfYWxsb3dlZCkpCiAJCXBhcmVudCA9IHBhcmVudC0+cGFyZW50OwogCkBAIC0xOTU1LDcgKzIwMDUsNyBAQAogCQl9CiAKIAkJLyogQ29udGludWUgcGFzdCBjcHVzZXRzIHdpdGggYWxsIGNwdXMsIG1lbXMgb25saW5lICovCi0JCWlmIChjcHVzX3N1YnNldChjcC0+Y3B1c19hbGxvd2VkLCBjcHVfb25saW5lX21hcCkgJiYKKwkJaWYgKGNwdW1hc2tfc3Vic2V0KGNwLT5jcHVzX2FsbG93ZWQsIGNwdV9vbmxpbmVfbWFzaykgJiYKIAkJICAgIG5vZGVzX3N1YnNldChjcC0+bWVtc19hbGxvd2VkLCBub2RlX3N0YXRlc1tOX0hJR0hfTUVNT1JZXSkpCiAJCQljb250aW51ZTsKIApAQCAtMTk2MywxMyArMjAxMywxNCBAQAogCiAJCS8qIFJlbW92ZSBvZmZsaW5lIGNwdXMgYW5kIG1lbXMgZnJvbSB0aGlzIGNwdXNldC4gKi8KIAkJbXV0ZXhfbG9jaygmY2FsbGJhY2tfbXV0ZXgpOwotCQljcHVzX2FuZChjcC0+Y3B1c19hbGxvd2VkLCBjcC0+Y3B1c19hbGxvd2VkLCBjcHVfb25saW5lX21hcCk7CisJCWNwdW1hc2tfYW5kKGNwLT5jcHVzX2FsbG93ZWQsIGNwLT5jcHVzX2FsbG93ZWQsCisJCQkgICAgY3B1X29ubGluZV9tYXNrKTsKIAkJbm9kZXNfYW5kKGNwLT5tZW1zX2FsbG93ZWQsIGNwLT5tZW1zX2FsbG93ZWQsCiAJCQkJCQlub2RlX3N0YXRlc1tOX0hJR0hfTUVNT1JZXSk7CiAJCW11dGV4X3VubG9jaygmY2FsbGJhY2tfbXV0ZXgpOwogCiAJCS8qIE1vdmUgdGFza3MgZnJvbSB0aGUgZW1wdHkgY3B1c2V0IHRvIGEgcGFyZW50ICovCi0JCWlmIChjcHVzX2VtcHR5KGNwLT5jcHVzX2FsbG93ZWQpIHx8CisJCWlmIChjcHVtYXNrX2VtcHR5KGNwLT5jcHVzX2FsbG93ZWQpIHx8CiAJCSAgICAgbm9kZXNfZW1wdHkoY3AtPm1lbXNfYWxsb3dlZCkpCiAJCQlyZW1vdmVfdGFza3NfaW5fZW1wdHlfY3B1c2V0KGNwKTsKIAkJZWxzZSB7CkBAIC0xOTk1LDcgKzIwNDYsNyBAQAogCQkJCXVuc2lnbmVkIGxvbmcgcGhhc2UsIHZvaWQgKnVudXNlZF9jcHUpCiB7CiAJc3RydWN0IHNjaGVkX2RvbWFpbl9hdHRyICphdHRyOwotCWNwdW1hc2tfdCAqZG9tczsKKwlzdHJ1Y3QgY3B1bWFzayAqZG9tczsKIAlpbnQgbmRvbXM7CiAKIAlzd2l0Y2ggKHBoYXNlKSB7CkBAIC0yMDEwLDcgKzIwNjEsNyBAQAogCX0KIAogCWNncm91cF9sb2NrKCk7Ci0JdG9wX2NwdXNldC5jcHVzX2FsbG93ZWQgPSBjcHVfb25saW5lX21hcDsKKwljcHVtYXNrX2NvcHkodG9wX2NwdXNldC5jcHVzX2FsbG93ZWQsIGNwdV9vbmxpbmVfbWFzayk7CiAJc2Nhbl9mb3JfZW1wdHlfY3B1c2V0cygmdG9wX2NwdXNldCk7CiAJbmRvbXMgPSBnZW5lcmF0ZV9zY2hlZF9kb21haW5zKCZkb21zLCAmYXR0cik7CiAJY2dyb3VwX3VubG9jaygpOwpAQCAtMjA1NSw3ICsyMTA2LDcgQEAKIAogdm9pZCBfX2luaXQgY3B1c2V0X2luaXRfc21wKHZvaWQpCiB7Ci0JdG9wX2NwdXNldC5jcHVzX2FsbG93ZWQgPSBjcHVfb25saW5lX21hcDsKKwljcHVtYXNrX2NvcHkodG9wX2NwdXNldC5jcHVzX2FsbG93ZWQsIGNwdV9vbmxpbmVfbWFzayk7CiAJdG9wX2NwdXNldC5tZW1zX2FsbG93ZWQgPSBub2RlX3N0YXRlc1tOX0hJR0hfTUVNT1JZXTsKIAogCWhvdGNwdV9ub3RpZmllcihjcHVzZXRfdHJhY2tfb25saW5lX2NwdXMsIDApOwpAQCAtMjA2NSwxNSArMjExNiwxNSBAQAogLyoqCiAgKiBjcHVzZXRfY3B1c19hbGxvd2VkIC0gcmV0dXJuIGNwdXNfYWxsb3dlZCBtYXNrIGZyb20gYSB0YXNrcyBjcHVzZXQuCiAgKiBAdHNrOiBwb2ludGVyIHRvIHRhc2tfc3RydWN0IGZyb20gd2hpY2ggdG8gb2J0YWluIGNwdXNldC0+Y3B1c19hbGxvd2VkLgotICogQHBtYXNrOiBwb2ludGVyIHRvIGNwdW1hc2tfdCB2YXJpYWJsZSB0byByZWNlaXZlIGNwdXNfYWxsb3dlZCBzZXQuCisgKiBAcG1hc2s6IHBvaW50ZXIgdG8gc3RydWN0IGNwdW1hc2sgdmFyaWFibGUgdG8gcmVjZWl2ZSBjcHVzX2FsbG93ZWQgc2V0LgogICoKLSAqIERlc2NyaXB0aW9uOiBSZXR1cm5zIHRoZSBjcHVtYXNrX3QgY3B1c19hbGxvd2VkIG9mIHRoZSBjcHVzZXQKKyAqIERlc2NyaXB0aW9uOiBSZXR1cm5zIHRoZSBjcHVtYXNrX3Zhcl90IGNwdXNfYWxsb3dlZCBvZiB0aGUgY3B1c2V0CiAgKiBhdHRhY2hlZCB0byB0aGUgc3BlY2lmaWVkIEB0c2suICBHdWFyYW50ZWVkIHRvIHJldHVybiBzb21lIG5vbi1lbXB0eQogICogc3Vic2V0IG9mIGNwdV9vbmxpbmVfbWFwLCBldmVuIGlmIHRoaXMgbWVhbnMgZ29pbmcgb3V0c2lkZSB0aGUKICAqIHRhc2tzIGNwdXNldC4KICAqKi8KIAotdm9pZCBjcHVzZXRfY3B1c19hbGxvd2VkKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCBjcHVtYXNrX3QgKnBtYXNrKQordm9pZCBjcHVzZXRfY3B1c19hbGxvd2VkKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCBzdHJ1Y3QgY3B1bWFzayAqcG1hc2spCiB7CiAJbXV0ZXhfbG9jaygmY2FsbGJhY2tfbXV0ZXgpOwogCWNwdXNldF9jcHVzX2FsbG93ZWRfbG9ja2VkKHRzaywgcG1hc2spOwpAQCAtMjA4NCw3ICsyMTM1LDcgQEAKICAqIGNwdXNldF9jcHVzX2FsbG93ZWRfbG9ja2VkIC0gcmV0dXJuIGNwdXNfYWxsb3dlZCBtYXNrIGZyb20gYSB0YXNrcyBjcHVzZXQuCiAgKiBNdXN0IGJlIGNhbGxlZCB3aXRoIGNhbGxiYWNrX211dGV4IGhlbGQuCiAgKiovCi12b2lkIGNwdXNldF9jcHVzX2FsbG93ZWRfbG9ja2VkKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCBjcHVtYXNrX3QgKnBtYXNrKQordm9pZCBjcHVzZXRfY3B1c19hbGxvd2VkX2xvY2tlZChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgc3RydWN0IGNwdW1hc2sgKnBtYXNrKQogewogCXRhc2tfbG9jayh0c2spOwogCWd1YXJhbnRlZV9vbmxpbmVfY3B1cyh0YXNrX2NzKHRzayksIHBtYXNrKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9jcmVkLmMgYi9rZXJuZWwvY3JlZC5jCmluZGV4IGZmN2JjMDcuLjNhMDM5MTggMTAwNjQ0Ci0tLSBhL2tlcm5lbC9jcmVkLmMKKysrIGIva2VybmVsL2NyZWQuYwpAQCAtMzcyLDcgKzM3Miw4IEBACiAJICAgIG9sZC0+ZnN1aWQgIT0gbmV3LT5mc3VpZCB8fAogCSAgICBvbGQtPmZzZ2lkICE9IG5ldy0+ZnNnaWQgfHwKIAkgICAgIWNhcF9pc3N1YnNldChuZXctPmNhcF9wZXJtaXR0ZWQsIG9sZC0+Y2FwX3Blcm1pdHRlZCkpIHsKLQkJc2V0X2R1bXBhYmxlKHRhc2stPm1tLCBzdWlkX2R1bXBhYmxlKTsKKwkJaWYgKHRhc2stPm1tKQorCQkJc2V0X2R1bXBhYmxlKHRhc2stPm1tLCBzdWlkX2R1bXBhYmxlKTsKIAkJdGFzay0+cGRlYXRoX3NpZ25hbCA9IDA7CiAJCXNtcF93bWIoKTsKIAl9CkBAIC01MDYsNiArNTA3LDcgQEAKIAllbHNlCiAJCW9sZCA9IGdldF9jcmVkKCZpbml0X2NyZWQpOwogCisJKm5ldyA9ICpvbGQ7CiAJZ2V0X3VpZChuZXctPnVzZXIpOwogCWdldF9ncm91cF9pbmZvKG5ldy0+Z3JvdXBfaW5mbyk7CiAKQEAgLTUyOSw2ICs1MzEsNyBAQAogCiBlcnJvcjoKIAlwdXRfY3JlZChuZXcpOworCXB1dF9jcmVkKG9sZCk7CiAJcmV0dXJuIE5VTEw7CiB9CiBFWFBPUlRfU1lNQk9MKHByZXBhcmVfa2VybmVsX2NyZWQpOwpkaWZmIC0tZ2l0IGEva2VybmVsL2V4ZWNfZG9tYWluLmMgYi9rZXJuZWwvZXhlY19kb21haW4uYwppbmRleCAwNTExNzE2Li42NjdjODQxIDEwMDY0NAotLS0gYS9rZXJuZWwvZXhlY19kb21haW4uYworKysgYi9rZXJuZWwvZXhlY19kb21haW4uYwpAQCAtMjA5LDggKzIwOSw3IEBACiBtb2R1bGVfaW5pdChwcm9jX2V4ZWNkb21haW5zX2luaXQpOwogI2VuZGlmCiAKLWFzbWxpbmthZ2UgbG9uZwotc3lzX3BlcnNvbmFsaXR5KHVfbG9uZyBwZXJzb25hbGl0eSkKK1NZU0NBTExfREVGSU5FMShwZXJzb25hbGl0eSwgdV9sb25nLCBwZXJzb25hbGl0eSkKIHsKIAl1X2xvbmcgb2xkID0gY3VycmVudC0+cGVyc29uYWxpdHk7CiAKZGlmZiAtLWdpdCBhL2tlcm5lbC9leGl0LmMgYi9rZXJuZWwvZXhpdC5jCmluZGV4IGM3NzQwZmEuLmY4MGRlYzMgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9leGl0LmMKKysrIGIva2VybmVsL2V4aXQuYwpAQCAtMTE0MSw3ICsxMTQxLDcgQEAKIAogRVhQT1JUX1NZTUJPTChjb21wbGV0ZV9hbmRfZXhpdCk7CiAKLWFzbWxpbmthZ2UgbG9uZyBzeXNfZXhpdChpbnQgZXJyb3JfY29kZSkKK1NZU0NBTExfREVGSU5FMShleGl0LCBpbnQsIGVycm9yX2NvZGUpCiB7CiAJZG9fZXhpdCgoZXJyb3JfY29kZSYweGZmKTw8OCk7CiB9CkBAIC0xMTgyLDkgKzExODIsMTEgQEAKICAqIHdhaXQ0KCktaW5nIHByb2Nlc3Mgd2lsbCBnZXQgdGhlIGNvcnJlY3QgZXhpdCBjb2RlIC0gZXZlbiBpZiB0aGlzCiAgKiB0aHJlYWQgaXMgbm90IHRoZSB0aHJlYWQgZ3JvdXAgbGVhZGVyLgogICovCi1hc21saW5rYWdlIHZvaWQgc3lzX2V4aXRfZ3JvdXAoaW50IGVycm9yX2NvZGUpCitTWVNDQUxMX0RFRklORTEoZXhpdF9ncm91cCwgaW50LCBlcnJvcl9jb2RlKQogewogCWRvX2dyb3VwX2V4aXQoKGVycm9yX2NvZGUgJiAweGZmKSA8PCA4KTsKKwkvKiBOT1RSRUFDSEVEICovCisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgcGlkICp0YXNrX3BpZF90eXBlKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgZW51bSBwaWRfdHlwZSB0eXBlKQpAQCAtMTc1Miw5ICsxNzU0LDggQEAKIAlyZXR1cm4gcmV0dmFsOwogfQogCi1hc21saW5rYWdlIGxvbmcgc3lzX3dhaXRpZChpbnQgd2hpY2gsIHBpZF90IHVwaWQsCi0JCQkgICBzdHJ1Y3Qgc2lnaW5mbyBfX3VzZXIgKmluZm9wLCBpbnQgb3B0aW9ucywKLQkJCSAgIHN0cnVjdCBydXNhZ2UgX191c2VyICpydSkKK1NZU0NBTExfREVGSU5FNSh3YWl0aWQsIGludCwgd2hpY2gsIHBpZF90LCB1cGlkLCBzdHJ1Y3Qgc2lnaW5mbyBfX3VzZXIgKiwKKwkJaW5mb3AsIGludCwgb3B0aW9ucywgc3RydWN0IHJ1c2FnZSBfX3VzZXIgKiwgcnUpCiB7CiAJc3RydWN0IHBpZCAqcGlkID0gTlVMTDsKIAllbnVtIHBpZF90eXBlIHR5cGU7CkBAIC0xNzkzLDggKzE3OTQsOCBAQAogCXJldHVybiByZXQ7CiB9CiAKLWFzbWxpbmthZ2UgbG9uZyBzeXNfd2FpdDQocGlkX3QgdXBpZCwgaW50IF9fdXNlciAqc3RhdF9hZGRyLAotCQkJICBpbnQgb3B0aW9ucywgc3RydWN0IHJ1c2FnZSBfX3VzZXIgKnJ1KQorU1lTQ0FMTF9ERUZJTkU0KHdhaXQ0LCBwaWRfdCwgdXBpZCwgaW50IF9fdXNlciAqLCBzdGF0X2FkZHIsCisJCWludCwgb3B0aW9ucywgc3RydWN0IHJ1c2FnZSBfX3VzZXIgKiwgcnUpCiB7CiAJc3RydWN0IHBpZCAqcGlkID0gTlVMTDsKIAllbnVtIHBpZF90eXBlIHR5cGU7CkBAIC0xODMxLDcgKzE4MzIsNyBAQAogICogc3lzX3dhaXRwaWQoKSByZW1haW5zIGZvciBjb21wYXRpYmlsaXR5LiB3YWl0cGlkKCkgc2hvdWxkIGJlCiAgKiBpbXBsZW1lbnRlZCBieSBjYWxsaW5nIHN5c193YWl0NCgpIGZyb20gbGliYy5hLgogICovCi1hc21saW5rYWdlIGxvbmcgc3lzX3dhaXRwaWQocGlkX3QgcGlkLCBpbnQgX191c2VyICpzdGF0X2FkZHIsIGludCBvcHRpb25zKQorU1lTQ0FMTF9ERUZJTkUzKHdhaXRwaWQsIHBpZF90LCBwaWQsIGludCBfX3VzZXIgKiwgc3RhdF9hZGRyLCBpbnQsIG9wdGlvbnMpCiB7CiAJcmV0dXJuIHN5c193YWl0NChwaWQsIHN0YXRfYWRkciwgb3B0aW9ucywgTlVMTCk7CiB9CmRpZmYgLS1naXQgYS9rZXJuZWwvZm9yay5jIGIva2VybmVsL2ZvcmsuYwppbmRleCA3YjhmMmE3Li5iZjBjZWY4IDEwMDY0NAotLS0gYS9rZXJuZWwvZm9yay5jCisrKyBiL2tlcm5lbC9mb3JrLmMKQEAgLTkwMSw3ICs5MDEsNyBAQAogCWNsZWFyX2ZyZWV6ZV9mbGFnKHApOwogfQogCi1hc21saW5rYWdlIGxvbmcgc3lzX3NldF90aWRfYWRkcmVzcyhpbnQgX191c2VyICp0aWRwdHIpCitTWVNDQUxMX0RFRklORTEoc2V0X3RpZF9hZGRyZXNzLCBpbnQgX191c2VyICosIHRpZHB0cikKIHsKIAljdXJyZW50LT5jbGVhcl9jaGlsZF90aWQgPSB0aWRwdHI7CiAKQEAgLTExMjYsMTIgKzExMjYsMTIgQEAKIAogCWlmIChwaWQgIT0gJmluaXRfc3RydWN0X3BpZCkgewogCQlyZXR2YWwgPSAtRU5PTUVNOwotCQlwaWQgPSBhbGxvY19waWQodGFza19hY3RpdmVfcGlkX25zKHApKTsKKwkJcGlkID0gYWxsb2NfcGlkKHAtPm5zcHJveHktPnBpZF9ucyk7CiAJCWlmICghcGlkKQogCQkJZ290byBiYWRfZm9ya19jbGVhbnVwX2lvOwogCiAJCWlmIChjbG9uZV9mbGFncyAmIENMT05FX05FV1BJRCkgewotCQkJcmV0dmFsID0gcGlkX25zX3ByZXBhcmVfcHJvYyh0YXNrX2FjdGl2ZV9waWRfbnMocCkpOworCQkJcmV0dmFsID0gcGlkX25zX3ByZXBhcmVfcHJvYyhwLT5uc3Byb3h5LT5waWRfbnMpOwogCQkJaWYgKHJldHZhbCA8IDApCiAJCQkJZ290byBiYWRfZm9ya19mcmVlX3BpZDsKIAkJfQpAQCAtMTQ4MSwxMiArMTQ4MSwxMCBAQAogCWZzX2NhY2hlcCA9IGttZW1fY2FjaGVfY3JlYXRlKCJmc19jYWNoZSIsCiAJCQlzaXplb2Yoc3RydWN0IGZzX3N0cnVjdCksIDAsCiAJCQlTTEFCX0hXQ0FDSEVfQUxJR058U0xBQl9QQU5JQywgTlVMTCk7Ci0Jdm1fYXJlYV9jYWNoZXAgPSBrbWVtX2NhY2hlX2NyZWF0ZSgidm1fYXJlYV9zdHJ1Y3QiLAotCQkJc2l6ZW9mKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCksIDAsCi0JCQlTTEFCX1BBTklDLCBOVUxMKTsKIAltbV9jYWNoZXAgPSBrbWVtX2NhY2hlX2NyZWF0ZSgibW1fc3RydWN0IiwKIAkJCXNpemVvZihzdHJ1Y3QgbW1fc3RydWN0KSwgQVJDSF9NSU5fTU1TVFJVQ1RfQUxJR04sCiAJCQlTTEFCX0hXQ0FDSEVfQUxJR058U0xBQl9QQU5JQywgTlVMTCk7CisJbW1hcF9pbml0KCk7CiB9CiAKIC8qCkBAIC0xNjA1LDcgKzE2MDMsNyBAQAogICogY29uc3RydWN0ZWQuIEhlcmUgd2UgYXJlIG1vZGlmeWluZyB0aGUgY3VycmVudCwgYWN0aXZlLAogICogdGFza19zdHJ1Y3QuCiAgKi8KLWFzbWxpbmthZ2UgbG9uZyBzeXNfdW5zaGFyZSh1bnNpZ25lZCBsb25nIHVuc2hhcmVfZmxhZ3MpCitTWVNDQUxMX0RFRklORTEodW5zaGFyZSwgdW5zaWduZWQgbG9uZywgdW5zaGFyZV9mbGFncykKIHsKIAlpbnQgZXJyID0gMDsKIAlzdHJ1Y3QgZnNfc3RydWN0ICpmcywgKm5ld19mcyA9IE5VTEw7CmRpZmYgLS1naXQgYS9rZXJuZWwvZnV0ZXguYyBiL2tlcm5lbC9mdXRleC5jCmluZGV4IDAwMmFhMTguLmY4OWQzNzMgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9mdXRleC5jCisrKyBiL2tlcm5lbC9mdXRleC5jCkBAIC0xNzMzLDkgKzE3MzMsOCBAQAogICogQGhlYWQ6IHBvaW50ZXIgdG8gdGhlIGxpc3QtaGVhZAogICogQGxlbjogbGVuZ3RoIG9mIHRoZSBsaXN0LWhlYWQsIGFzIHVzZXJzcGFjZSBleHBlY3RzCiAgKi8KLWFzbWxpbmthZ2UgbG9uZwotc3lzX3NldF9yb2J1c3RfbGlzdChzdHJ1Y3Qgcm9idXN0X2xpc3RfaGVhZCBfX3VzZXIgKmhlYWQsCi0JCSAgICBzaXplX3QgbGVuKQorU1lTQ0FMTF9ERUZJTkUyKHNldF9yb2J1c3RfbGlzdCwgc3RydWN0IHJvYnVzdF9saXN0X2hlYWQgX191c2VyICosIGhlYWQsCisJCXNpemVfdCwgbGVuKQogewogCWlmICghZnV0ZXhfY21weGNoZ19lbmFibGVkKQogCQlyZXR1cm4gLUVOT1NZUzsKQEAgLTE3NTYsOSArMTc1NSw5IEBACiAgKiBAaGVhZF9wdHI6IHBvaW50ZXIgdG8gYSBsaXN0LWhlYWQgcG9pbnRlciwgdGhlIGtlcm5lbCBmaWxscyBpdCBpbgogICogQGxlbl9wdHI6IHBvaW50ZXIgdG8gYSBsZW5ndGggZmllbGQsIHRoZSBrZXJuZWwgZmlsbHMgaW4gdGhlIGhlYWRlciBzaXplCiAgKi8KLWFzbWxpbmthZ2UgbG9uZwotc3lzX2dldF9yb2J1c3RfbGlzdChpbnQgcGlkLCBzdHJ1Y3Qgcm9idXN0X2xpc3RfaGVhZCBfX3VzZXIgKiBfX3VzZXIgKmhlYWRfcHRyLAotCQkgICAgc2l6ZV90IF9fdXNlciAqbGVuX3B0cikKK1NZU0NBTExfREVGSU5FMyhnZXRfcm9idXN0X2xpc3QsIGludCwgcGlkLAorCQlzdHJ1Y3Qgcm9idXN0X2xpc3RfaGVhZCBfX3VzZXIgKiBfX3VzZXIgKiwgaGVhZF9wdHIsCisJCXNpemVfdCBfX3VzZXIgKiwgbGVuX3B0cikKIHsKIAlzdHJ1Y3Qgcm9idXN0X2xpc3RfaGVhZCBfX3VzZXIgKmhlYWQ7CiAJdW5zaWduZWQgbG9uZyByZXQ7CkBAIC0xOTc4LDkgKzE5NzcsOSBAQAogfQogCiAKLWFzbWxpbmthZ2UgbG9uZyBzeXNfZnV0ZXgodTMyIF9fdXNlciAqdWFkZHIsIGludCBvcCwgdTMyIHZhbCwKLQkJCSAgc3RydWN0IHRpbWVzcGVjIF9fdXNlciAqdXRpbWUsIHUzMiBfX3VzZXIgKnVhZGRyMiwKLQkJCSAgdTMyIHZhbDMpCitTWVNDQUxMX0RFRklORTYoZnV0ZXgsIHUzMiBfX3VzZXIgKiwgdWFkZHIsIGludCwgb3AsIHUzMiwgdmFsLAorCQlzdHJ1Y3QgdGltZXNwZWMgX191c2VyICosIHV0aW1lLCB1MzIgX191c2VyICosIHVhZGRyMiwKKwkJdTMyLCB2YWwzKQogewogCXN0cnVjdCB0aW1lc3BlYyB0czsKIAlrdGltZV90IHQsICp0cCA9IE5VTEw7CmRpZmYgLS1naXQgYS9rZXJuZWwvaHJ0aW1lci5jIGIva2VybmVsL2hydGltZXIuYwppbmRleCAxNDU1Yjc2Li4yZGMzMGM1IDEwMDY0NAotLS0gYS9rZXJuZWwvaHJ0aW1lci5jCisrKyBiL2tlcm5lbC9ocnRpbWVyLmMKQEAgLTE0NjcsOCArMTQ2Nyw4IEBACiAJcmV0dXJuIHJldDsKIH0KIAotYXNtbGlua2FnZSBsb25nCi1zeXNfbmFub3NsZWVwKHN0cnVjdCB0aW1lc3BlYyBfX3VzZXIgKnJxdHAsIHN0cnVjdCB0aW1lc3BlYyBfX3VzZXIgKnJtdHApCitTWVNDQUxMX0RFRklORTIobmFub3NsZWVwLCBzdHJ1Y3QgdGltZXNwZWMgX191c2VyICosIHJxdHAsCisJCXN0cnVjdCB0aW1lc3BlYyBfX3VzZXIgKiwgcm10cCkKIHsKIAlzdHJ1Y3QgdGltZXNwZWMgdHU7CiAKZGlmZiAtLWdpdCBhL2tlcm5lbC9pcnEvYXV0b3Byb2JlLmMgYi9rZXJuZWwvaXJxL2F1dG9wcm9iZS5jCmluZGV4IGNjMGY3MzIuLjFkZTk3MDAgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9pcnEvYXV0b3Byb2JlLmMKKysrIGIva2VybmVsL2lycS9hdXRvcHJvYmUuYwpAQCAtMTAsNiArMTAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvYXN5bmMuaD4KIAogI2luY2x1ZGUgImludGVybmFscy5oIgogCkBAIC0zNCw2ICszNSwxMCBAQAogCXVuc2lnbmVkIGludCBzdGF0dXM7CiAJaW50IGk7CiAKKwkvKgorCSAqIHF1aWVzY2UgdGhlIGtlcm5lbCwgb3IgYXQgbGVhc3QgdGhlIGFzeW5jaHJvbm91cyBwb3J0aW9uCisJICovCisJYXN5bmNfc3luY2hyb25pemVfZnVsbCgpOwogCW11dGV4X2xvY2soJnByb2JpbmdfYWN0aXZlKTsKIAkvKgogCSAqIHNvbWV0aGluZyBtYXkgaGF2ZSBnZW5lcmF0ZWQgYW4gaXJxIGxvbmcgYWdvIGFuZCB3ZSB3YW50IHRvCmRpZmYgLS1naXQgYS9rZXJuZWwvaXRpbWVyLmMgYi9rZXJuZWwvaXRpbWVyLmMKaW5kZXggZGI3YzM1OC4uNmE1ZmU5MyAxMDA2NDQKLS0tIGEva2VybmVsL2l0aW1lci5jCisrKyBiL2tlcm5lbC9pdGltZXIuYwpAQCAtMTAwLDcgKzEwMCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLWFzbWxpbmthZ2UgbG9uZyBzeXNfZ2V0aXRpbWVyKGludCB3aGljaCwgc3RydWN0IGl0aW1lcnZhbCBfX3VzZXIgKnZhbHVlKQorU1lTQ0FMTF9ERUZJTkUyKGdldGl0aW1lciwgaW50LCB3aGljaCwgc3RydWN0IGl0aW1lcnZhbCBfX3VzZXIgKiwgdmFsdWUpCiB7CiAJaW50IGVycm9yID0gLUVGQVVMVDsKIAlzdHJ1Y3QgaXRpbWVydmFsIGdldF9idWZmZXI7CkBAIC0yNjAsOSArMjYwLDggQEAKIAlyZXR1cm4gaXRfb2xkLml0X3ZhbHVlLnR2X3NlYzsKIH0KIAotYXNtbGlua2FnZSBsb25nIHN5c19zZXRpdGltZXIoaW50IHdoaWNoLAotCQkJICAgICAgc3RydWN0IGl0aW1lcnZhbCBfX3VzZXIgKnZhbHVlLAotCQkJICAgICAgc3RydWN0IGl0aW1lcnZhbCBfX3VzZXIgKm92YWx1ZSkKK1NZU0NBTExfREVGSU5FMyhzZXRpdGltZXIsIGludCwgd2hpY2gsIHN0cnVjdCBpdGltZXJ2YWwgX191c2VyICosIHZhbHVlLAorCQlzdHJ1Y3QgaXRpbWVydmFsIF9fdXNlciAqLCBvdmFsdWUpCiB7CiAJc3RydWN0IGl0aW1lcnZhbCBzZXRfYnVmZmVyLCBnZXRfYnVmZmVyOwogCWludCBlcnJvcjsKZGlmZiAtLWdpdCBhL2tlcm5lbC9rZXhlYy5jIGIva2VybmVsL2tleGVjLmMKaW5kZXggM2ZiODU1YS4uOGE2ZDdiMCAxMDA2NDQKLS0tIGEva2VybmVsL2tleGVjLmMKKysrIGIva2VybmVsL2tleGVjLmMKQEAgLTkzNCw5ICs5MzQsOCBAQAogCiBzdGF0aWMgREVGSU5FX01VVEVYKGtleGVjX211dGV4KTsKIAotYXNtbGlua2FnZSBsb25nIHN5c19rZXhlY19sb2FkKHVuc2lnbmVkIGxvbmcgZW50cnksIHVuc2lnbmVkIGxvbmcgbnJfc2VnbWVudHMsCi0JCQkJc3RydWN0IGtleGVjX3NlZ21lbnQgX191c2VyICpzZWdtZW50cywKLQkJCQl1bnNpZ25lZCBsb25nIGZsYWdzKQorU1lTQ0FMTF9ERUZJTkU0KGtleGVjX2xvYWQsIHVuc2lnbmVkIGxvbmcsIGVudHJ5LCB1bnNpZ25lZCBsb25nLCBucl9zZWdtZW50cywKKwkJc3RydWN0IGtleGVjX3NlZ21lbnQgX191c2VyICosIHNlZ21lbnRzLCB1bnNpZ25lZCBsb25nLCBmbGFncykKIHsKIAlzdHJ1Y3Qga2ltYWdlICoqZGVzdF9pbWFnZSwgKmltYWdlOwogCWludCByZXN1bHQ7CmRpZmYgLS1naXQgYS9rZXJuZWwva3Byb2Jlcy5jIGIva2VybmVsL2twcm9iZXMuYwppbmRleCAxYjljYmRjLi43YmE4Y2Q5IDEwMDY0NAotLS0gYS9rZXJuZWwva3Byb2Jlcy5jCisrKyBiL2tlcm5lbC9rcHJvYmVzLmMKQEAgLTEyMyw3ICsxMjMsNyBAQAogc3RhdGljIGludCBfX2twcm9iZXMgY2hlY2tfc2FmZXR5KHZvaWQpCiB7CiAJaW50IHJldCA9IDA7Ci0jaWYgZGVmaW5lZChDT05GSUdfUFJFRU1QVCkgJiYgZGVmaW5lZChDT05GSUdfUE0pCisjaWYgZGVmaW5lZChDT05GSUdfUFJFRU1QVCkgJiYgZGVmaW5lZChDT05GSUdfRlJFRVpFUikKIAlyZXQgPSBmcmVlemVfcHJvY2Vzc2VzKCk7CiAJaWYgKHJldCA9PSAwKSB7CiAJCXN0cnVjdCB0YXNrX3N0cnVjdCAqcCwgKnE7CmRpZmYgLS1naXQgYS9rZXJuZWwvbW9kdWxlLmMgYi9rZXJuZWwvbW9kdWxlLmMKaW5kZXggNDk2ZGNiNS4uZThiNTFkNCAxMDA2NDQKLS0tIGEva2VybmVsL21vZHVsZS5jCisrKyBiL2tlcm5lbC9tb2R1bGUuYwpAQCAtNTAsNiArNTAsNyBAQAogI2luY2x1ZGUgPGFzbS9zZWN0aW9ucy5oPgogI2luY2x1ZGUgPGxpbnV4L3RyYWNlcG9pbnQuaD4KICNpbmNsdWRlIDxsaW51eC9mdHJhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9hc3luYy5oPgogCiAjaWYgMAogI2RlZmluZSBERUJVR1AgcHJpbnRrCkBAIC03NDIsOCArNzQzLDggQEAKIAltdXRleF9sb2NrKCZtb2R1bGVfbXV0ZXgpOwogfQogCi1hc21saW5rYWdlIGxvbmcKLXN5c19kZWxldGVfbW9kdWxlKGNvbnN0IGNoYXIgX191c2VyICpuYW1lX3VzZXIsIHVuc2lnbmVkIGludCBmbGFncykKK1NZU0NBTExfREVGSU5FMihkZWxldGVfbW9kdWxlLCBjb25zdCBjaGFyIF9fdXNlciAqLCBuYW1lX3VzZXIsCisJCXVuc2lnbmVkIGludCwgZmxhZ3MpCiB7CiAJc3RydWN0IG1vZHVsZSAqbW9kOwogCWNoYXIgbmFtZVtNT0RVTEVfTkFNRV9MRU5dOwpAQCAtODE2LDYgKzgxNyw3IEBACiAJCW1vZC0+ZXhpdCgpOwogCWJsb2NraW5nX25vdGlmaWVyX2NhbGxfY2hhaW4oJm1vZHVsZV9ub3RpZnlfbGlzdCwKIAkJCQkgICAgIE1PRFVMRV9TVEFURV9HT0lORywgbW9kKTsKKwlhc3luY19zeW5jaHJvbml6ZV9mdWxsKCk7CiAJbXV0ZXhfbG9jaygmbW9kdWxlX211dGV4KTsKIAkvKiBTdG9yZSB0aGUgbmFtZSBvZiB0aGUgbGFzdCB1bmxvYWRlZCBtb2R1bGUgZm9yIGRpYWdub3N0aWMgcHVycG9zZXMgKi8KIAlzdHJsY3B5KGxhc3RfdW5sb2FkZWRfbW9kdWxlLCBtb2QtPm5hbWUsIHNpemVvZihsYXN0X3VubG9hZGVkX21vZHVsZSkpOwpAQCAtMjI5NCwxMCArMjI5Niw4IEBACiB9CiAKIC8qIFRoaXMgaXMgd2hlcmUgdGhlIHJlYWwgd29yayBoYXBwZW5zICovCi1hc21saW5rYWdlIGxvbmcKLXN5c19pbml0X21vZHVsZSh2b2lkIF9fdXNlciAqdW1vZCwKLQkJdW5zaWduZWQgbG9uZyBsZW4sCi0JCWNvbnN0IGNoYXIgX191c2VyICp1YXJncykKK1NZU0NBTExfREVGSU5FMyhpbml0X21vZHVsZSwgdm9pZCBfX3VzZXIgKiwgdW1vZCwKKwkJdW5zaWduZWQgbG9uZywgbGVuLCBjb25zdCBjaGFyIF9fdXNlciAqLCB1YXJncykKIHsKIAlzdHJ1Y3QgbW9kdWxlICptb2Q7CiAJaW50IHJldCA9IDA7CmRpZmYgLS1naXQgYS9rZXJuZWwvbnNfY2dyb3VwLmMgYi9rZXJuZWwvbnNfY2dyb3VwLmMKaW5kZXggNDNjMjExMS4uNzhiYzNmZCAxMDA2NDQKLS0tIGEva2VybmVsL25zX2Nncm91cC5jCisrKyBiL2tlcm5lbC9uc19jZ3JvdXAuYwpAQCAtMTMsNyArMTMsNiBAQAogCiBzdHJ1Y3QgbnNfY2dyb3VwIHsKIAlzdHJ1Y3QgY2dyb3VwX3N1YnN5c19zdGF0ZSBjc3M7Ci0Jc3BpbmxvY2tfdCBsb2NrOwogfTsKIAogc3RydWN0IGNncm91cF9zdWJzeXMgbnNfc3Vic3lzOwpAQCAtODQsNyArODMsNiBAQAogCW5zX2Nncm91cCA9IGt6YWxsb2Moc2l6ZW9mKCpuc19jZ3JvdXApLCBHRlBfS0VSTkVMKTsKIAlpZiAoIW5zX2Nncm91cCkKIAkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7Ci0Jc3Bpbl9sb2NrX2luaXQoJm5zX2Nncm91cC0+bG9jayk7CiAJcmV0dXJuICZuc19jZ3JvdXAtPmNzczsKIH0KIApkaWZmIC0tZ2l0IGEva2VybmVsL3BpZC5jIGIva2VybmVsL3BpZC5jCmluZGV4IDA2NGU3NmEuLjFiMzU4NmYgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9waWQuYworKysgYi9rZXJuZWwvcGlkLmMKQEAgLTQ3NCw4ICs0NzQsMTQgQEAKIH0KIEVYUE9SVF9TWU1CT0wodGFza19zZXNzaW9uX25yX25zKTsKIAorc3RydWN0IHBpZF9uYW1lc3BhY2UgKnRhc2tfYWN0aXZlX3BpZF9ucyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaykKK3sKKwlyZXR1cm4gbnNfb2ZfcGlkKHRhc2tfcGlkKHRzaykpOworfQorRVhQT1JUX1NZTUJPTF9HUEwodGFza19hY3RpdmVfcGlkX25zKTsKKwogLyoKLSAqIFVzZWQgYnkgcHJvYyB0byBmaW5kIHRoZSBmaXJzdCBwaWQgdGhhdCBpcyBncmVhdGVyIHRoZW4gb3IgZXF1YWwgdG8gbnIuCisgKiBVc2VkIGJ5IHByb2MgdG8gZmluZCB0aGUgZmlyc3QgcGlkIHRoYXQgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIG5yLgogICoKICAqIElmIHRoZXJlIGlzIGEgcGlkIGF0IG5yIHRoaXMgZnVuY3Rpb24gaXMgZXhhY3RseSB0aGUgc2FtZSBhcyBmaW5kX3BpZF9ucy4KICAqLwpkaWZmIC0tZ2l0IGEva2VybmVsL3Bvc2l4LXRpbWVycy5jIGIva2VybmVsL3Bvc2l4LXRpbWVycy5jCmluZGV4IDg4N2M2MzcuLjA1MmVjNGQgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9wb3NpeC10aW1lcnMuYworKysgYi9rZXJuZWwvcG9zaXgtdGltZXJzLmMKQEAgLTQ3NywxMCArNDc3LDkgQEAKIAogLyogQ3JlYXRlIGEgUE9TSVguMWIgaW50ZXJ2YWwgdGltZXIuICovCiAKLWFzbWxpbmthZ2UgbG9uZwotc3lzX3RpbWVyX2NyZWF0ZShjb25zdCBjbG9ja2lkX3Qgd2hpY2hfY2xvY2ssCi0JCSBzdHJ1Y3Qgc2lnZXZlbnQgX191c2VyICp0aW1lcl9ldmVudF9zcGVjLAotCQkgdGltZXJfdCBfX3VzZXIgKiBjcmVhdGVkX3RpbWVyX2lkKQorU1lTQ0FMTF9ERUZJTkUzKHRpbWVyX2NyZWF0ZSwgY29uc3QgY2xvY2tpZF90LCB3aGljaF9jbG9jaywKKwkJc3RydWN0IHNpZ2V2ZW50IF9fdXNlciAqLCB0aW1lcl9ldmVudF9zcGVjLAorCQl0aW1lcl90IF9fdXNlciAqLCBjcmVhdGVkX3RpbWVyX2lkKQogewogCXN0cnVjdCBrX2l0aW1lciAqbmV3X3RpbWVyOwogCWludCBlcnJvciwgbmV3X3RpbWVyX2lkOwpAQCAtNjYxLDggKzY2MCw4IEBACiB9CiAKIC8qIEdldCB0aGUgdGltZSByZW1haW5pbmcgb24gYSBQT1NJWC4xYiBpbnRlcnZhbCB0aW1lci4gKi8KLWFzbWxpbmthZ2UgbG9uZwotc3lzX3RpbWVyX2dldHRpbWUodGltZXJfdCB0aW1lcl9pZCwgc3RydWN0IGl0aW1lcnNwZWMgX191c2VyICpzZXR0aW5nKQorU1lTQ0FMTF9ERUZJTkUyKHRpbWVyX2dldHRpbWUsIHRpbWVyX3QsIHRpbWVyX2lkLAorCQlzdHJ1Y3QgaXRpbWVyc3BlYyBfX3VzZXIgKiwgc2V0dGluZykKIHsKIAlzdHJ1Y3Qga19pdGltZXIgKnRpbXI7CiAJc3RydWN0IGl0aW1lcnNwZWMgY3VyX3NldHRpbmc7CkBAIC02OTEsOCArNjkwLDcgQEAKICAqIHRoZSBjYWxsIGJhY2sgdG8gZG9fc2NoZWR1bGVfbmV4dF90aW1lcigpLiAgU28gYWxsIHdlIG5lZWQgdG8gZG8gaXMKICAqIHRvIHBpY2sgdXAgdGhlIGZyb3plbiBvdmVycnVuLgogICovCi1hc21saW5rYWdlIGxvbmcKLXN5c190aW1lcl9nZXRvdmVycnVuKHRpbWVyX3QgdGltZXJfaWQpCitTWVNDQUxMX0RFRklORTEodGltZXJfZ2V0b3ZlcnJ1biwgdGltZXJfdCwgdGltZXJfaWQpCiB7CiAJc3RydWN0IGtfaXRpbWVyICp0aW1yOwogCWludCBvdmVycnVuOwpAQCAtNzYwLDEwICs3NTgsOSBAQAogfQogCiAvKiBTZXQgYSBQT1NJWC4xYiBpbnRlcnZhbCB0aW1lciAqLwotYXNtbGlua2FnZSBsb25nCi1zeXNfdGltZXJfc2V0dGltZSh0aW1lcl90IHRpbWVyX2lkLCBpbnQgZmxhZ3MsCi0JCSAgY29uc3Qgc3RydWN0IGl0aW1lcnNwZWMgX191c2VyICpuZXdfc2V0dGluZywKLQkJICBzdHJ1Y3QgaXRpbWVyc3BlYyBfX3VzZXIgKm9sZF9zZXR0aW5nKQorU1lTQ0FMTF9ERUZJTkU0KHRpbWVyX3NldHRpbWUsIHRpbWVyX3QsIHRpbWVyX2lkLCBpbnQsIGZsYWdzLAorCQljb25zdCBzdHJ1Y3QgaXRpbWVyc3BlYyBfX3VzZXIgKiwgbmV3X3NldHRpbmcsCisJCXN0cnVjdCBpdGltZXJzcGVjIF9fdXNlciAqLCBvbGRfc2V0dGluZykKIHsKIAlzdHJ1Y3Qga19pdGltZXIgKnRpbXI7CiAJc3RydWN0IGl0aW1lcnNwZWMgbmV3X3NwZWMsIG9sZF9zcGVjOwpAQCAtODE2LDggKzgxMyw3IEBACiB9CiAKIC8qIERlbGV0ZSBhIFBPU0lYLjFiIGludGVydmFsIHRpbWVyLiAqLwotYXNtbGlua2FnZSBsb25nCi1zeXNfdGltZXJfZGVsZXRlKHRpbWVyX3QgdGltZXJfaWQpCitTWVNDQUxMX0RFRklORTEodGltZXJfZGVsZXRlLCB0aW1lcl90LCB0aW1lcl9pZCkKIHsKIAlzdHJ1Y3Qga19pdGltZXIgKnRpbWVyOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CkBAIC05MDMsOCArODk5LDggQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGRvX3Bvc2l4X2Nsb2NrX25vbmFub3NsZWVwKTsKIAotYXNtbGlua2FnZSBsb25nIHN5c19jbG9ja19zZXR0aW1lKGNvbnN0IGNsb2NraWRfdCB3aGljaF9jbG9jaywKLQkJCQkgIGNvbnN0IHN0cnVjdCB0aW1lc3BlYyBfX3VzZXIgKnRwKQorU1lTQ0FMTF9ERUZJTkUyKGNsb2NrX3NldHRpbWUsIGNvbnN0IGNsb2NraWRfdCwgd2hpY2hfY2xvY2ssCisJCWNvbnN0IHN0cnVjdCB0aW1lc3BlYyBfX3VzZXIgKiwgdHApCiB7CiAJc3RydWN0IHRpbWVzcGVjIG5ld190cDsKIApAQCAtOTE2LDggKzkxMiw4IEBACiAJcmV0dXJuIENMT0NLX0RJU1BBVENIKHdoaWNoX2Nsb2NrLCBjbG9ja19zZXQsICh3aGljaF9jbG9jaywgJm5ld190cCkpOwogfQogCi1hc21saW5rYWdlIGxvbmcKLXN5c19jbG9ja19nZXR0aW1lKGNvbnN0IGNsb2NraWRfdCB3aGljaF9jbG9jaywgc3RydWN0IHRpbWVzcGVjIF9fdXNlciAqdHApCitTWVNDQUxMX0RFRklORTIoY2xvY2tfZ2V0dGltZSwgY29uc3QgY2xvY2tpZF90LCB3aGljaF9jbG9jaywKKwkJc3RydWN0IHRpbWVzcGVjIF9fdXNlciAqLHRwKQogewogCXN0cnVjdCB0aW1lc3BlYyBrZXJuZWxfdHA7CiAJaW50IGVycm9yOwpAQCAtOTMzLDggKzkyOSw4IEBACiAKIH0KIAotYXNtbGlua2FnZSBsb25nCi1zeXNfY2xvY2tfZ2V0cmVzKGNvbnN0IGNsb2NraWRfdCB3aGljaF9jbG9jaywgc3RydWN0IHRpbWVzcGVjIF9fdXNlciAqdHApCitTWVNDQUxMX0RFRklORTIoY2xvY2tfZ2V0cmVzLCBjb25zdCBjbG9ja2lkX3QsIHdoaWNoX2Nsb2NrLAorCQlzdHJ1Y3QgdGltZXNwZWMgX191c2VyICosIHRwKQogewogCXN0cnVjdCB0aW1lc3BlYyBydG5fdHA7CiAJaW50IGVycm9yOwpAQCAtOTYzLDEwICs5NTksOSBAQAogCQkJCSB3aGljaF9jbG9jayk7CiB9CiAKLWFzbWxpbmthZ2UgbG9uZwotc3lzX2Nsb2NrX25hbm9zbGVlcChjb25zdCBjbG9ja2lkX3Qgd2hpY2hfY2xvY2ssIGludCBmbGFncywKLQkJICAgIGNvbnN0IHN0cnVjdCB0aW1lc3BlYyBfX3VzZXIgKnJxdHAsCi0JCSAgICBzdHJ1Y3QgdGltZXNwZWMgX191c2VyICpybXRwKQorU1lTQ0FMTF9ERUZJTkU0KGNsb2NrX25hbm9zbGVlcCwgY29uc3QgY2xvY2tpZF90LCB3aGljaF9jbG9jaywgaW50LCBmbGFncywKKwkJY29uc3Qgc3RydWN0IHRpbWVzcGVjIF9fdXNlciAqLCBycXRwLAorCQlzdHJ1Y3QgdGltZXNwZWMgX191c2VyICosIHJtdHApCiB7CiAJc3RydWN0IHRpbWVzcGVjIHQ7CiAKZGlmZiAtLWdpdCBhL2tlcm5lbC9wb3dlci9NYWtlZmlsZSBiL2tlcm5lbC9wb3dlci9NYWtlZmlsZQppbmRleCA1OTc4MjNiLi5kN2ExMDE2IDEwMDY0NAotLS0gYS9rZXJuZWwvcG93ZXIvTWFrZWZpbGUKKysrIGIva2VybmVsL3Bvd2VyL01ha2VmaWxlCkBAIC00LDcgKzQsOCBAQAogZW5kaWYKIAogb2JqLXkJCQkJOj0gbWFpbi5vCi1vYmotJChDT05GSUdfUE1fU0xFRVApCQkrPSBwcm9jZXNzLm8gY29uc29sZS5vCitvYmotJChDT05GSUdfUE1fU0xFRVApCQkrPSBjb25zb2xlLm8KK29iai0kKENPTkZJR19GUkVFWkVSKQkJKz0gcHJvY2Vzcy5vCiBvYmotJChDT05GSUdfSElCRVJOQVRJT04pCSs9IHN3c3VzcC5vIGRpc2subyBzbmFwc2hvdC5vIHN3YXAubyB1c2VyLm8KIAogb2JqLSQoQ09ORklHX01BR0lDX1NZU1JRKQkrPSBwb3dlcm9mZi5vCmRpZmYgLS1naXQgYS9rZXJuZWwvcG93ZXIvZGlzay5jIGIva2VybmVsL3Bvd2VyL2Rpc2suYwppbmRleCBmNzdkMzgxLi40NWU4NTQxIDEwMDY0NAotLS0gYS9rZXJuZWwvcG93ZXIvZGlzay5jCisrKyBiL2tlcm5lbC9wb3dlci9kaXNrLmMKQEAgLTI1OCwxMiArMjU4LDEyIEBACiB7CiAJaW50IGVycm9yOwogCi0JLyogRnJlZSBtZW1vcnkgYmVmb3JlIHNodXR0aW5nIGRvd24gZGV2aWNlcy4gKi8KLQllcnJvciA9IHN3c3VzcF9zaHJpbmtfbWVtb3J5KCk7CisJZXJyb3IgPSBwbGF0Zm9ybV9iZWdpbihwbGF0Zm9ybV9tb2RlKTsKIAlpZiAoZXJyb3IpCiAJCXJldHVybiBlcnJvcjsKIAotCWVycm9yID0gcGxhdGZvcm1fYmVnaW4ocGxhdGZvcm1fbW9kZSk7CisJLyogRnJlZSBtZW1vcnkgYmVmb3JlIHNodXR0aW5nIGRvd24gZGV2aWNlcy4gKi8KKwllcnJvciA9IHN3c3VzcF9zaHJpbmtfbWVtb3J5KCk7CiAJaWYgKGVycm9yKQogCQlnb3RvIENsb3NlOwogCmRpZmYgLS1naXQgYS9rZXJuZWwvcG93ZXIvc25hcHNob3QuYyBiL2tlcm5lbC9wb3dlci9zbmFwc2hvdC5jCmluZGV4IDVkMmFiODMuLmY1ZmMyZDcgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9wb3dlci9zbmFwc2hvdC5jCisrKyBiL2tlcm5lbC9wb3dlci9zbmFwc2hvdC5jCkBAIC0yNSw2ICsyNSw3IEBACiAjaW5jbHVkZSA8bGludXgvc3lzY2FsbHMuaD4KICNpbmNsdWRlIDxsaW51eC9jb25zb2xlLmg+CiAjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KIAogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL21tdV9jb250ZXh0Lmg+CkBAIC0xOTIsMTIgKzE5Myw2IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHZvaWQgY2hhaW5fZnJlZShzdHJ1Y3QgY2hhaW5fYWxsb2NhdG9yICpjYSwgaW50IGNsZWFyX3BhZ2Vfbm9zYXZlKQotewotCWZyZWVfbGlzdF9vZl9wYWdlcyhjYS0+Y2hhaW4sIGNsZWFyX3BhZ2Vfbm9zYXZlKTsKLQltZW1zZXQoY2EsIDAsIHNpemVvZihzdHJ1Y3QgY2hhaW5fYWxsb2NhdG9yKSk7Ci19Ci0KIC8qKgogICoJRGF0YSB0eXBlcyByZWxhdGVkIHRvIG1lbW9yeSBiaXRtYXBzLgogICoKQEAgLTIzMyw3ICsyMjgsNyBAQAogI2RlZmluZSBCTV9CSVRTX1BFUl9CTE9DSwkoUEFHRV9TSVpFIDw8IDMpCiAKIHN0cnVjdCBibV9ibG9jayB7Ci0Jc3RydWN0IGJtX2Jsb2NrICpuZXh0OwkJLyogbmV4dCBlbGVtZW50IG9mIHRoZSBsaXN0ICovCisJc3RydWN0IGxpc3RfaGVhZCBob29rOwkvKiBob29rIGludG8gYSBsaXN0IG9mIGJpdG1hcCBibG9ja3MgKi8KIAl1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbjsJLyogcGZuIHJlcHJlc2VudGVkIGJ5IHRoZSBmaXJzdCBiaXQgKi8KIAl1bnNpZ25lZCBsb25nIGVuZF9wZm47CS8qIHBmbiByZXByZXNlbnRlZCBieSB0aGUgbGFzdCBiaXQgcGx1cyAxICovCiAJdW5zaWduZWQgbG9uZyAqZGF0YTsJLyogYml0bWFwIHJlcHJlc2VudGluZyBwYWdlcyAqLwpAQCAtMjQ0LDI0ICsyMzksMTUgQEAKIAlyZXR1cm4gYmItPmVuZF9wZm4gLSBiYi0+c3RhcnRfcGZuOwogfQogCi1zdHJ1Y3Qgem9uZV9iaXRtYXAgewotCXN0cnVjdCB6b25lX2JpdG1hcCAqbmV4dDsJLyogbmV4dCBlbGVtZW50IG9mIHRoZSBsaXN0ICovCi0JdW5zaWduZWQgbG9uZyBzdGFydF9wZm47CS8qIG1pbmltYWwgcGZuIGluIHRoaXMgem9uZSAqLwotCXVuc2lnbmVkIGxvbmcgZW5kX3BmbjsJCS8qIG1heGltYWwgcGZuIGluIHRoaXMgem9uZSBwbHVzIDEgKi8KLQlzdHJ1Y3QgYm1fYmxvY2sgKmJtX2Jsb2NrczsJLyogbGlzdCBvZiBiaXRtYXAgYmxvY2tzICovCi0Jc3RydWN0IGJtX2Jsb2NrICpjdXJfYmxvY2s7CS8qIHJlY2VudGx5IHVzZWQgYml0bWFwIGJsb2NrICovCi19OwotCiAvKiBzdHJjdXQgYm1fcG9zaXRpb24gaXMgdXNlZCBmb3IgYnJvd3NpbmcgbWVtb3J5IGJpdG1hcHMgKi8KIAogc3RydWN0IGJtX3Bvc2l0aW9uIHsKLQlzdHJ1Y3Qgem9uZV9iaXRtYXAgKnpvbmVfYm07CiAJc3RydWN0IGJtX2Jsb2NrICpibG9jazsKIAlpbnQgYml0OwogfTsKIAogc3RydWN0IG1lbW9yeV9iaXRtYXAgewotCXN0cnVjdCB6b25lX2JpdG1hcCAqem9uZV9ibV9saXN0OwkvKiBsaXN0IG9mIHpvbmUgYml0bWFwcyAqLworCXN0cnVjdCBsaXN0X2hlYWQgYmxvY2tzOwkvKiBsaXN0IG9mIGJpdG1hcCBibG9ja3MgKi8KIAlzdHJ1Y3QgbGlua2VkX3BhZ2UgKnBfbGlzdDsJLyogbGlzdCBvZiBwYWdlcyB1c2VkIHRvIHN0b3JlIHpvbmUKIAkJCQkJICogYml0bWFwIG9iamVjdHMgYW5kIGJpdG1hcCBibG9jawogCQkJCQkgKiBvYmplY3RzCkBAIC0yNzMsMTEgKzI1OSw3IEBACiAKIHN0YXRpYyB2b2lkIG1lbW9yeV9ibV9wb3NpdGlvbl9yZXNldChzdHJ1Y3QgbWVtb3J5X2JpdG1hcCAqYm0pCiB7Ci0Jc3RydWN0IHpvbmVfYml0bWFwICp6b25lX2JtOwotCi0Jem9uZV9ibSA9IGJtLT56b25lX2JtX2xpc3Q7Ci0JYm0tPmN1ci56b25lX2JtID0gem9uZV9ibTsKLQlibS0+Y3VyLmJsb2NrID0gem9uZV9ibS0+Ym1fYmxvY2tzOworCWJtLT5jdXIuYmxvY2sgPSBsaXN0X2VudHJ5KGJtLT5ibG9ja3MubmV4dCwgc3RydWN0IGJtX2Jsb2NrLCBob29rKTsKIAlibS0+Y3VyLmJpdCA9IDA7CiB9CiAKQEAgLTI4NSwxNTEgKzI2NywxODQgQEAKIAogLyoqCiAgKgljcmVhdGVfYm1fYmxvY2tfbGlzdCAtIGNyZWF0ZSBhIGxpc3Qgb2YgYmxvY2sgYml0bWFwIG9iamVjdHMKKyAqCUBucl9ibG9ja3MgLSBudW1iZXIgb2YgYmxvY2tzIHRvIGFsbG9jYXRlCisgKglAbGlzdCAtIGxpc3QgdG8gcHV0IHRoZSBhbGxvY2F0ZWQgYmxvY2tzIGludG8KKyAqCUBjYSAtIGNoYWluIGFsbG9jYXRvciB0byBiZSB1c2VkIGZvciBhbGxvY2F0aW5nIG1lbW9yeQogICovCi0KLXN0YXRpYyBpbmxpbmUgc3RydWN0IGJtX2Jsb2NrICoKLWNyZWF0ZV9ibV9ibG9ja19saXN0KHVuc2lnbmVkIGludCBucl9ibG9ja3MsIHN0cnVjdCBjaGFpbl9hbGxvY2F0b3IgKmNhKQorc3RhdGljIGludCBjcmVhdGVfYm1fYmxvY2tfbGlzdCh1bnNpZ25lZCBsb25nIHBhZ2VzLAorCQkJCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsCisJCQkJc3RydWN0IGNoYWluX2FsbG9jYXRvciAqY2EpCiB7Ci0Jc3RydWN0IGJtX2Jsb2NrICpiYmxpc3QgPSBOVUxMOworCXVuc2lnbmVkIGludCBucl9ibG9ja3MgPSBESVZfUk9VTkRfVVAocGFnZXMsIEJNX0JJVFNfUEVSX0JMT0NLKTsKIAogCXdoaWxlIChucl9ibG9ja3MtLSA+IDApIHsKIAkJc3RydWN0IGJtX2Jsb2NrICpiYjsKIAogCQliYiA9IGNoYWluX2FsbG9jKGNhLCBzaXplb2Yoc3RydWN0IGJtX2Jsb2NrKSk7CiAJCWlmICghYmIpCi0JCQlyZXR1cm4gTlVMTDsKLQotCQliYi0+bmV4dCA9IGJibGlzdDsKLQkJYmJsaXN0ID0gYmI7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJbGlzdF9hZGQoJmJiLT5ob29rLCBsaXN0KTsKIAl9Ci0JcmV0dXJuIGJibGlzdDsKKworCXJldHVybiAwOworfQorCitzdHJ1Y3QgbWVtX2V4dGVudCB7CisJc3RydWN0IGxpc3RfaGVhZCBob29rOworCXVuc2lnbmVkIGxvbmcgc3RhcnQ7CisJdW5zaWduZWQgbG9uZyBlbmQ7Cit9OworCisvKioKKyAqCWZyZWVfbWVtX2V4dGVudHMgLSBmcmVlIGEgbGlzdCBvZiBtZW1vcnkgZXh0ZW50cworICoJQGxpc3QgLSBsaXN0IG9mIGV4dGVudHMgdG8gZW1wdHkKKyAqLworc3RhdGljIHZvaWQgZnJlZV9tZW1fZXh0ZW50cyhzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0KQoreworCXN0cnVjdCBtZW1fZXh0ZW50ICpleHQsICphdXg7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZXh0LCBhdXgsIGxpc3QsIGhvb2spIHsKKwkJbGlzdF9kZWwoJmV4dC0+aG9vayk7CisJCWtmcmVlKGV4dCk7CisJfQogfQogCiAvKioKLSAqCWNyZWF0ZV96b25lX2JtX2xpc3QgLSBjcmVhdGUgYSBsaXN0IG9mIHpvbmUgYml0bWFwIG9iamVjdHMKKyAqCWNyZWF0ZV9tZW1fZXh0ZW50cyAtIGNyZWF0ZSBhIGxpc3Qgb2YgbWVtb3J5IGV4dGVudHMgcmVwcmVzZW50aW5nCisgKgkgICAgICAgICAgICAgICAgICAgICBjb250aWd1b3VzIHJhbmdlcyBvZiBQRk5zCisgKglAbGlzdCAtIGxpc3QgdG8gcHV0IHRoZSBleHRlbnRzIGludG8KKyAqCUBnZnBfbWFzayAtIG1hc2sgdG8gdXNlIGZvciBtZW1vcnkgYWxsb2NhdGlvbnMKICAqLwotCi1zdGF0aWMgaW5saW5lIHN0cnVjdCB6b25lX2JpdG1hcCAqCi1jcmVhdGVfem9uZV9ibV9saXN0KHVuc2lnbmVkIGludCBucl96b25lcywgc3RydWN0IGNoYWluX2FsbG9jYXRvciAqY2EpCitzdGF0aWMgaW50IGNyZWF0ZV9tZW1fZXh0ZW50cyhzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LCBnZnBfdCBnZnBfbWFzaykKIHsKLQlzdHJ1Y3Qgem9uZV9iaXRtYXAgKnpibWxpc3QgPSBOVUxMOworCXN0cnVjdCB6b25lICp6b25lOwogCi0Jd2hpbGUgKG5yX3pvbmVzLS0gPiAwKSB7Ci0JCXN0cnVjdCB6b25lX2JpdG1hcCAqemJtOworCUlOSVRfTElTVF9IRUFEKGxpc3QpOwogCi0JCXpibSA9IGNoYWluX2FsbG9jKGNhLCBzaXplb2Yoc3RydWN0IHpvbmVfYml0bWFwKSk7Ci0JCWlmICghemJtKQotCQkJcmV0dXJuIE5VTEw7CisJZm9yX2VhY2hfem9uZSh6b25lKSB7CisJCXVuc2lnbmVkIGxvbmcgem9uZV9zdGFydCwgem9uZV9lbmQ7CisJCXN0cnVjdCBtZW1fZXh0ZW50ICpleHQsICpjdXIsICphdXg7CiAKLQkJemJtLT5uZXh0ID0gemJtbGlzdDsKLQkJemJtbGlzdCA9IHpibTsKKwkJaWYgKCFwb3B1bGF0ZWRfem9uZSh6b25lKSkKKwkJCWNvbnRpbnVlOworCisJCXpvbmVfc3RhcnQgPSB6b25lLT56b25lX3N0YXJ0X3BmbjsKKwkJem9uZV9lbmQgPSB6b25lLT56b25lX3N0YXJ0X3BmbiArIHpvbmUtPnNwYW5uZWRfcGFnZXM7CisKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShleHQsIGxpc3QsIGhvb2spCisJCQlpZiAoem9uZV9zdGFydCA8PSBleHQtPmVuZCkKKwkJCQlicmVhazsKKworCQlpZiAoJmV4dC0+aG9vayA9PSBsaXN0IHx8IHpvbmVfZW5kIDwgZXh0LT5zdGFydCkgeworCQkJLyogTmV3IGV4dGVudCBpcyBuZWNlc3NhcnkgKi8KKwkJCXN0cnVjdCBtZW1fZXh0ZW50ICpuZXdfZXh0OworCisJCQluZXdfZXh0ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG1lbV9leHRlbnQpLCBnZnBfbWFzayk7CisJCQlpZiAoIW5ld19leHQpIHsKKwkJCQlmcmVlX21lbV9leHRlbnRzKGxpc3QpOworCQkJCXJldHVybiAtRU5PTUVNOworCQkJfQorCQkJbmV3X2V4dC0+c3RhcnQgPSB6b25lX3N0YXJ0OworCQkJbmV3X2V4dC0+ZW5kID0gem9uZV9lbmQ7CisJCQlsaXN0X2FkZF90YWlsKCZuZXdfZXh0LT5ob29rLCAmZXh0LT5ob29rKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogTWVyZ2UgdGhpcyB6b25lJ3MgcmFuZ2Ugb2YgUEZOcyB3aXRoIHRoZSBleGlzdGluZyBvbmUgKi8KKwkJaWYgKHpvbmVfc3RhcnQgPCBleHQtPnN0YXJ0KQorCQkJZXh0LT5zdGFydCA9IHpvbmVfc3RhcnQ7CisJCWlmICh6b25lX2VuZCA+IGV4dC0+ZW5kKQorCQkJZXh0LT5lbmQgPSB6b25lX2VuZDsKKworCQkvKiBNb3JlIG1lcmdpbmcgbWF5IGJlIHBvc3NpYmxlICovCisJCWN1ciA9IGV4dDsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlX2NvbnRpbnVlKGN1ciwgYXV4LCBsaXN0LCBob29rKSB7CisJCQlpZiAoem9uZV9lbmQgPCBjdXItPnN0YXJ0KQorCQkJCWJyZWFrOworCQkJaWYgKHpvbmVfZW5kIDwgY3VyLT5lbmQpCisJCQkJZXh0LT5lbmQgPSBjdXItPmVuZDsKKwkJCWxpc3RfZGVsKCZjdXItPmhvb2spOworCQkJa2ZyZWUoY3VyKTsKKwkJfQogCX0KLQlyZXR1cm4gemJtbGlzdDsKKworCXJldHVybiAwOwogfQogCiAvKioKICAgKgltZW1vcnlfYm1fY3JlYXRlIC0gYWxsb2NhdGUgbWVtb3J5IGZvciBhIG1lbW9yeSBiaXRtYXAKICAgKi8KLQogc3RhdGljIGludAogbWVtb3J5X2JtX2NyZWF0ZShzdHJ1Y3QgbWVtb3J5X2JpdG1hcCAqYm0sIGdmcF90IGdmcF9tYXNrLCBpbnQgc2FmZV9uZWVkZWQpCiB7CiAJc3RydWN0IGNoYWluX2FsbG9jYXRvciBjYTsKLQlzdHJ1Y3Qgem9uZSAqem9uZTsKLQlzdHJ1Y3Qgem9uZV9iaXRtYXAgKnpvbmVfYm07Ci0Jc3RydWN0IGJtX2Jsb2NrICpiYjsKLQl1bnNpZ25lZCBpbnQgbnI7CisJc3RydWN0IGxpc3RfaGVhZCBtZW1fZXh0ZW50czsKKwlzdHJ1Y3QgbWVtX2V4dGVudCAqZXh0OworCWludCBlcnJvcjsKIAogCWNoYWluX2luaXQoJmNhLCBnZnBfbWFzaywgc2FmZV9uZWVkZWQpOworCUlOSVRfTElTVF9IRUFEKCZibS0+YmxvY2tzKTsKIAotCS8qIENvbXB1dGUgdGhlIG51bWJlciBvZiB6b25lcyAqLwotCW5yID0gMDsKLQlmb3JfZWFjaF96b25lKHpvbmUpCi0JCWlmIChwb3B1bGF0ZWRfem9uZSh6b25lKSkKLQkJCW5yKys7CisJZXJyb3IgPSBjcmVhdGVfbWVtX2V4dGVudHMoJm1lbV9leHRlbnRzLCBnZnBfbWFzayk7CisJaWYgKGVycm9yKQorCQlyZXR1cm4gZXJyb3I7CiAKLQkvKiBBbGxvY2F0ZSB0aGUgbGlzdCBvZiB6b25lcyBiaXRtYXAgb2JqZWN0cyAqLwotCXpvbmVfYm0gPSBjcmVhdGVfem9uZV9ibV9saXN0KG5yLCAmY2EpOwotCWJtLT56b25lX2JtX2xpc3QgPSB6b25lX2JtOwotCWlmICghem9uZV9ibSkgewotCQljaGFpbl9mcmVlKCZjYSwgUEdfVU5TQUZFX0NMRUFSKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQorCWxpc3RfZm9yX2VhY2hfZW50cnkoZXh0LCAmbWVtX2V4dGVudHMsIGhvb2spIHsKKwkJc3RydWN0IGJtX2Jsb2NrICpiYjsKKwkJdW5zaWduZWQgbG9uZyBwZm4gPSBleHQtPnN0YXJ0OworCQl1bnNpZ25lZCBsb25nIHBhZ2VzID0gZXh0LT5lbmQgLSBleHQtPnN0YXJ0OwogCi0JLyogSW5pdGlhbGl6ZSB0aGUgem9uZSBiaXRtYXAgb2JqZWN0cyAqLwotCWZvcl9lYWNoX3pvbmUoem9uZSkgewotCQl1bnNpZ25lZCBsb25nIHBmbjsKKwkJYmIgPSBsaXN0X2VudHJ5KGJtLT5ibG9ja3MucHJldiwgc3RydWN0IGJtX2Jsb2NrLCBob29rKTsKIAotCQlpZiAoIXBvcHVsYXRlZF96b25lKHpvbmUpKQotCQkJY29udGludWU7CisJCWVycm9yID0gY3JlYXRlX2JtX2Jsb2NrX2xpc3QocGFnZXMsIGJtLT5ibG9ja3MucHJldiwgJmNhKTsKKwkJaWYgKGVycm9yKQorCQkJZ290byBFcnJvcjsKIAotCQl6b25lX2JtLT5zdGFydF9wZm4gPSB6b25lLT56b25lX3N0YXJ0X3BmbjsKLQkJem9uZV9ibS0+ZW5kX3BmbiA9IHpvbmUtPnpvbmVfc3RhcnRfcGZuICsgem9uZS0+c3Bhbm5lZF9wYWdlczsKLQkJLyogQWxsb2NhdGUgdGhlIGxpc3Qgb2YgYml0bWFwIGJsb2NrIG9iamVjdHMgKi8KLQkJbnIgPSBESVZfUk9VTkRfVVAoem9uZS0+c3Bhbm5lZF9wYWdlcywgQk1fQklUU19QRVJfQkxPQ0spOwotCQliYiA9IGNyZWF0ZV9ibV9ibG9ja19saXN0KG5yLCAmY2EpOwotCQl6b25lX2JtLT5ibV9ibG9ja3MgPSBiYjsKLQkJem9uZV9ibS0+Y3VyX2Jsb2NrID0gYmI7Ci0JCWlmICghYmIpCi0JCQlnb3RvIEZyZWU7Ci0KLQkJbnIgPSB6b25lLT5zcGFubmVkX3BhZ2VzOwotCQlwZm4gPSB6b25lLT56b25lX3N0YXJ0X3BmbjsKLQkJLyogSW5pdGlhbGl6ZSB0aGUgYml0bWFwIGJsb2NrIG9iamVjdHMgKi8KLQkJd2hpbGUgKGJiKSB7Ci0JCQl1bnNpZ25lZCBsb25nICpwdHI7Ci0KLQkJCXB0ciA9IGdldF9pbWFnZV9wYWdlKGdmcF9tYXNrLCBzYWZlX25lZWRlZCk7Ci0JCQliYi0+ZGF0YSA9IHB0cjsKLQkJCWlmICghcHRyKQotCQkJCWdvdG8gRnJlZTsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeV9jb250aW51ZShiYiwgJmJtLT5ibG9ja3MsIGhvb2spIHsKKwkJCWJiLT5kYXRhID0gZ2V0X2ltYWdlX3BhZ2UoZ2ZwX21hc2ssIHNhZmVfbmVlZGVkKTsKKwkJCWlmICghYmItPmRhdGEpIHsKKwkJCQllcnJvciA9IC1FTk9NRU07CisJCQkJZ290byBFcnJvcjsKKwkJCX0KIAogCQkJYmItPnN0YXJ0X3BmbiA9IHBmbjsKLQkJCWlmIChuciA+PSBCTV9CSVRTX1BFUl9CTE9DSykgeworCQkJaWYgKHBhZ2VzID49IEJNX0JJVFNfUEVSX0JMT0NLKSB7CiAJCQkJcGZuICs9IEJNX0JJVFNfUEVSX0JMT0NLOwotCQkJCW5yIC09IEJNX0JJVFNfUEVSX0JMT0NLOworCQkJCXBhZ2VzIC09IEJNX0JJVFNfUEVSX0JMT0NLOwogCQkJfSBlbHNlIHsKIAkJCQkvKiBUaGlzIGlzIGV4ZWN1dGVkIG9ubHkgb25jZSBpbiB0aGUgbG9vcCAqLwotCQkJCXBmbiArPSBucjsKKwkJCQlwZm4gKz0gcGFnZXM7CiAJCQl9CiAJCQliYi0+ZW5kX3BmbiA9IHBmbjsKLQkJCWJiID0gYmItPm5leHQ7CiAJCX0KLQkJem9uZV9ibSA9IHpvbmVfYm0tPm5leHQ7CiAJfQorCiAJYm0tPnBfbGlzdCA9IGNhLmNoYWluOwogCW1lbW9yeV9ibV9wb3NpdGlvbl9yZXNldChibSk7Ci0JcmV0dXJuIDA7CisgRXhpdDoKKwlmcmVlX21lbV9leHRlbnRzKCZtZW1fZXh0ZW50cyk7CisJcmV0dXJuIGVycm9yOwogCi0gRnJlZToKKyBFcnJvcjoKIAlibS0+cF9saXN0ID0gY2EuY2hhaW47CiAJbWVtb3J5X2JtX2ZyZWUoYm0sIFBHX1VOU0FGRV9DTEVBUik7Ci0JcmV0dXJuIC1FTk9NRU07CisJZ290byBFeGl0OwogfQogCiAvKioKICAgKgltZW1vcnlfYm1fZnJlZSAtIGZyZWUgbWVtb3J5IG9jY3VwaWVkIGJ5IHRoZSBtZW1vcnkgYml0bWFwIEBibQogICAqLwotCiBzdGF0aWMgdm9pZCBtZW1vcnlfYm1fZnJlZShzdHJ1Y3QgbWVtb3J5X2JpdG1hcCAqYm0sIGludCBjbGVhcl9ub3NhdmVfZnJlZSkKIHsKLQlzdHJ1Y3Qgem9uZV9iaXRtYXAgKnpvbmVfYm07CisJc3RydWN0IGJtX2Jsb2NrICpiYjsKIAotCS8qIEZyZWUgdGhlIGxpc3Qgb2YgYml0IGJsb2NrcyBmb3IgZWFjaCB6b25lX2JpdG1hcCBvYmplY3QgKi8KLQl6b25lX2JtID0gYm0tPnpvbmVfYm1fbGlzdDsKLQl3aGlsZSAoem9uZV9ibSkgewotCQlzdHJ1Y3QgYm1fYmxvY2sgKmJiOworCWxpc3RfZm9yX2VhY2hfZW50cnkoYmIsICZibS0+YmxvY2tzLCBob29rKQorCQlpZiAoYmItPmRhdGEpCisJCQlmcmVlX2ltYWdlX3BhZ2UoYmItPmRhdGEsIGNsZWFyX25vc2F2ZV9mcmVlKTsKIAotCQliYiA9IHpvbmVfYm0tPmJtX2Jsb2NrczsKLQkJd2hpbGUgKGJiKSB7Ci0JCQlpZiAoYmItPmRhdGEpCi0JCQkJZnJlZV9pbWFnZV9wYWdlKGJiLT5kYXRhLCBjbGVhcl9ub3NhdmVfZnJlZSk7Ci0JCQliYiA9IGJiLT5uZXh0OwotCQl9Ci0JCXpvbmVfYm0gPSB6b25lX2JtLT5uZXh0OwotCX0KIAlmcmVlX2xpc3Rfb2ZfcGFnZXMoYm0tPnBfbGlzdCwgY2xlYXJfbm9zYXZlX2ZyZWUpOwotCWJtLT56b25lX2JtX2xpc3QgPSBOVUxMOworCisJSU5JVF9MSVNUX0hFQUQoJmJtLT5ibG9ja3MpOwogfQogCiAvKioKQEAgLTQzNywzOCArNDUyLDMzIEBACiAgKgl0byBnaXZlbiBwZm4uICBUaGUgY3VyX3pvbmVfYm0gbWVtYmVyIG9mIEBibSBhbmQgdGhlIGN1cl9ibG9jayBtZW1iZXIKICAqCW9mIEBibS0+Y3VyX3pvbmVfYm0gYXJlIHVwZGF0ZWQuCiAgKi8KLQogc3RhdGljIGludCBtZW1vcnlfYm1fZmluZF9iaXQoc3RydWN0IG1lbW9yeV9iaXRtYXAgKmJtLCB1bnNpZ25lZCBsb25nIHBmbiwKIAkJCQl2b2lkICoqYWRkciwgdW5zaWduZWQgaW50ICpiaXRfbnIpCiB7Ci0Jc3RydWN0IHpvbmVfYml0bWFwICp6b25lX2JtOwogCXN0cnVjdCBibV9ibG9jayAqYmI7CiAKLQkvKiBDaGVjayBpZiB0aGUgcGZuIGlzIGZyb20gdGhlIGN1cnJlbnQgem9uZSAqLwotCXpvbmVfYm0gPSBibS0+Y3VyLnpvbmVfYm07Ci0JaWYgKHBmbiA8IHpvbmVfYm0tPnN0YXJ0X3BmbiB8fCBwZm4gPj0gem9uZV9ibS0+ZW5kX3BmbikgewotCQl6b25lX2JtID0gYm0tPnpvbmVfYm1fbGlzdDsKLQkJLyogV2UgZG9uJ3QgYXNzdW1lIHRoYXQgdGhlIHpvbmVzIGFyZSBzb3J0ZWQgYnkgcGZucyAqLwotCQl3aGlsZSAocGZuIDwgem9uZV9ibS0+c3RhcnRfcGZuIHx8IHBmbiA+PSB6b25lX2JtLT5lbmRfcGZuKSB7Ci0JCQl6b25lX2JtID0gem9uZV9ibS0+bmV4dDsKLQotCQkJaWYgKCF6b25lX2JtKQotCQkJCXJldHVybiAtRUZBVUxUOwotCQl9Ci0JCWJtLT5jdXIuem9uZV9ibSA9IHpvbmVfYm07Ci0JfQotCS8qIENoZWNrIGlmIHRoZSBwZm4gY29ycmVzcG9uZHMgdG8gdGhlIGN1cnJlbnQgYml0bWFwIGJsb2NrICovCi0JYmIgPSB6b25lX2JtLT5jdXJfYmxvY2s7CisJLyoKKwkgKiBDaGVjayBpZiB0aGUgcGZuIGNvcnJlc3BvbmRzIHRvIHRoZSBjdXJyZW50IGJpdG1hcCBibG9jayBhbmQgZmluZAorCSAqIHRoZSBibG9jayB3aGVyZSBpdCBmaXRzIGlmIHRoaXMgaXMgbm90IHRoZSBjYXNlLgorCSAqLworCWJiID0gYm0tPmN1ci5ibG9jazsKIAlpZiAocGZuIDwgYmItPnN0YXJ0X3BmbikKLQkJYmIgPSB6b25lX2JtLT5ibV9ibG9ja3M7CisJCWxpc3RfZm9yX2VhY2hfZW50cnlfY29udGludWVfcmV2ZXJzZShiYiwgJmJtLT5ibG9ja3MsIGhvb2spCisJCQlpZiAocGZuID49IGJiLT5zdGFydF9wZm4pCisJCQkJYnJlYWs7CiAKLQl3aGlsZSAocGZuID49IGJiLT5lbmRfcGZuKSB7Ci0JCWJiID0gYmItPm5leHQ7CisJaWYgKHBmbiA+PSBiYi0+ZW5kX3BmbikKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeV9jb250aW51ZShiYiwgJmJtLT5ibG9ja3MsIGhvb2spCisJCQlpZiAocGZuID49IGJiLT5zdGFydF9wZm4gJiYgcGZuIDwgYmItPmVuZF9wZm4pCisJCQkJYnJlYWs7CiAKLQkJQlVHX09OKCFiYik7Ci0JfQotCXpvbmVfYm0tPmN1cl9ibG9jayA9IGJiOworCWlmICgmYmItPmhvb2sgPT0gJmJtLT5ibG9ja3MpCisJCXJldHVybiAtRUZBVUxUOworCisJLyogVGhlIGJsb2NrIGhhcyBiZWVuIGZvdW5kICovCisJYm0tPmN1ci5ibG9jayA9IGJiOwogCXBmbiAtPSBiYi0+c3RhcnRfcGZuOworCWJtLT5jdXIuYml0ID0gcGZuICsgMTsKIAkqYml0X25yID0gcGZuOwogCSphZGRyID0gYmItPmRhdGE7CiAJcmV0dXJuIDA7CkBAIC01MTksNiArNTI5LDE0IEBACiAJcmV0dXJuIHRlc3RfYml0KGJpdCwgYWRkcik7CiB9CiAKK3N0YXRpYyBib29sIG1lbW9yeV9ibV9wZm5fcHJlc2VudChzdHJ1Y3QgbWVtb3J5X2JpdG1hcCAqYm0sIHVuc2lnbmVkIGxvbmcgcGZuKQoreworCXZvaWQgKmFkZHI7CisJdW5zaWduZWQgaW50IGJpdDsKKworCXJldHVybiAhbWVtb3J5X2JtX2ZpbmRfYml0KGJtLCBwZm4sICZhZGRyLCAmYml0KTsKK30KKwogLyoqCiAgKgltZW1vcnlfYm1fbmV4dF9wZm4gLSBmaW5kIHRoZSBwZm4gdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgbmV4dCBzZXQgYml0CiAgKglpbiB0aGUgYml0bWFwIEBibS4gIElmIHRoZSBwZm4gY2Fubm90IGJlIGZvdW5kLCBCTV9FTkRfT0ZfTUFQIGlzCkBAIC01MzAsMjkgKzU0OCwyMSBAQAogCiBzdGF0aWMgdW5zaWduZWQgbG9uZyBtZW1vcnlfYm1fbmV4dF9wZm4oc3RydWN0IG1lbW9yeV9iaXRtYXAgKmJtKQogewotCXN0cnVjdCB6b25lX2JpdG1hcCAqem9uZV9ibTsKIAlzdHJ1Y3QgYm1fYmxvY2sgKmJiOwogCWludCBiaXQ7CiAKKwliYiA9IGJtLT5jdXIuYmxvY2s7CiAJZG8gewotCQliYiA9IGJtLT5jdXIuYmxvY2s7Ci0JCWRvIHsKLQkJCWJpdCA9IGJtLT5jdXIuYml0OwotCQkJYml0ID0gZmluZF9uZXh0X2JpdChiYi0+ZGF0YSwgYm1fYmxvY2tfYml0cyhiYiksIGJpdCk7Ci0JCQlpZiAoYml0IDwgYm1fYmxvY2tfYml0cyhiYikpCi0JCQkJZ290byBSZXR1cm5fcGZuOworCQliaXQgPSBibS0+Y3VyLmJpdDsKKwkJYml0ID0gZmluZF9uZXh0X2JpdChiYi0+ZGF0YSwgYm1fYmxvY2tfYml0cyhiYiksIGJpdCk7CisJCWlmIChiaXQgPCBibV9ibG9ja19iaXRzKGJiKSkKKwkJCWdvdG8gUmV0dXJuX3BmbjsKIAotCQkJYmIgPSBiYi0+bmV4dDsKLQkJCWJtLT5jdXIuYmxvY2sgPSBiYjsKLQkJCWJtLT5jdXIuYml0ID0gMDsKLQkJfSB3aGlsZSAoYmIpOwotCQl6b25lX2JtID0gYm0tPmN1ci56b25lX2JtLT5uZXh0OwotCQlpZiAoem9uZV9ibSkgewotCQkJYm0tPmN1ci56b25lX2JtID0gem9uZV9ibTsKLQkJCWJtLT5jdXIuYmxvY2sgPSB6b25lX2JtLT5ibV9ibG9ja3M7Ci0JCQlibS0+Y3VyLmJpdCA9IDA7Ci0JCX0KLQl9IHdoaWxlICh6b25lX2JtKTsKKwkJYmIgPSBsaXN0X2VudHJ5KGJiLT5ob29rLm5leHQsIHN0cnVjdCBibV9ibG9jaywgaG9vayk7CisJCWJtLT5jdXIuYmxvY2sgPSBiYjsKKwkJYm0tPmN1ci5iaXQgPSAwOworCX0gd2hpbGUgKCZiYi0+aG9vayAhPSAmYm0tPmJsb2Nrcyk7CisKIAltZW1vcnlfYm1fcG9zaXRpb25fcmVzZXQoYm0pOwogCXJldHVybiBCTV9FTkRfT0ZfTUFQOwogCkBAIC04MDgsOCArODE4LDcgQEAKICAqCVdlIHNob3VsZCBzYXZlIHRoZSBwYWdlIGlmIGl0IGlzbid0IE5vc2F2ZSBvciBOb3NhdmVGcmVlLCBvciBSZXNlcnZlZCwKICAqCWFuZCBpdCBpc24ndCBhIHBhcnQgb2YgYSBmcmVlIGNodW5rIG9mIHBhZ2VzLgogICovCi0KLXN0YXRpYyBzdHJ1Y3QgcGFnZSAqc2F2ZWFibGVfaGlnaG1lbV9wYWdlKHVuc2lnbmVkIGxvbmcgcGZuKQorc3RhdGljIHN0cnVjdCBwYWdlICpzYXZlYWJsZV9oaWdobWVtX3BhZ2Uoc3RydWN0IHpvbmUgKnpvbmUsIHVuc2lnbmVkIGxvbmcgcGZuKQogewogCXN0cnVjdCBwYWdlICpwYWdlOwogCkBAIC04MTcsNiArODI2LDggQEAKIAkJcmV0dXJuIE5VTEw7CiAKIAlwYWdlID0gcGZuX3RvX3BhZ2UocGZuKTsKKwlpZiAocGFnZV96b25lKHBhZ2UpICE9IHpvbmUpCisJCXJldHVybiBOVUxMOwogCiAJQlVHX09OKCFQYWdlSGlnaE1lbShwYWdlKSk7CiAKQEAgLTg0NiwxMyArODU3LDE2IEBACiAJCW1hcmtfZnJlZV9wYWdlcyh6b25lKTsKIAkJbWF4X3pvbmVfcGZuID0gem9uZS0+em9uZV9zdGFydF9wZm4gKyB6b25lLT5zcGFubmVkX3BhZ2VzOwogCQlmb3IgKHBmbiA9IHpvbmUtPnpvbmVfc3RhcnRfcGZuOyBwZm4gPCBtYXhfem9uZV9wZm47IHBmbisrKQotCQkJaWYgKHNhdmVhYmxlX2hpZ2htZW1fcGFnZShwZm4pKQorCQkJaWYgKHNhdmVhYmxlX2hpZ2htZW1fcGFnZSh6b25lLCBwZm4pKQogCQkJCW4rKzsKIAl9CiAJcmV0dXJuIG47CiB9CiAjZWxzZQotc3RhdGljIGlubGluZSB2b2lkICpzYXZlYWJsZV9oaWdobWVtX3BhZ2UodW5zaWduZWQgbG9uZyBwZm4pIHsgcmV0dXJuIE5VTEw7IH0KK3N0YXRpYyBpbmxpbmUgdm9pZCAqc2F2ZWFibGVfaGlnaG1lbV9wYWdlKHN0cnVjdCB6b25lICp6LCB1bnNpZ25lZCBsb25nIHApCit7CisJcmV0dXJuIE5VTEw7Cit9CiAjZW5kaWYgLyogQ09ORklHX0hJR0hNRU0gKi8KIAogLyoqCkBAIC04NjMsOCArODc3LDcgQEAKICAqCW9mIHBhZ2VzIHN0YXRpY2FsbHkgZGVmaW5lZCBhcyAndW5zYXZlYWJsZScsIGFuZCBpdCBpc24ndCBhIHBhcnQgb2YKICAqCWEgZnJlZSBjaHVuayBvZiBwYWdlcy4KICAqLwotCi1zdGF0aWMgc3RydWN0IHBhZ2UgKnNhdmVhYmxlX3BhZ2UodW5zaWduZWQgbG9uZyBwZm4pCitzdGF0aWMgc3RydWN0IHBhZ2UgKnNhdmVhYmxlX3BhZ2Uoc3RydWN0IHpvbmUgKnpvbmUsIHVuc2lnbmVkIGxvbmcgcGZuKQogewogCXN0cnVjdCBwYWdlICpwYWdlOwogCkBAIC04NzIsNiArODg1LDggQEAKIAkJcmV0dXJuIE5VTEw7CiAKIAlwYWdlID0gcGZuX3RvX3BhZ2UocGZuKTsKKwlpZiAocGFnZV96b25lKHBhZ2UpICE9IHpvbmUpCisJCXJldHVybiBOVUxMOwogCiAJQlVHX09OKFBhZ2VIaWdoTWVtKHBhZ2UpKTsKIApAQCAtOTAzLDcgKzkxOCw3IEBACiAJCW1hcmtfZnJlZV9wYWdlcyh6b25lKTsKIAkJbWF4X3pvbmVfcGZuID0gem9uZS0+em9uZV9zdGFydF9wZm4gKyB6b25lLT5zcGFubmVkX3BhZ2VzOwogCQlmb3IgKHBmbiA9IHpvbmUtPnpvbmVfc3RhcnRfcGZuOyBwZm4gPCBtYXhfem9uZV9wZm47IHBmbisrKQotCQkJaWYoc2F2ZWFibGVfcGFnZShwZm4pKQorCQkJaWYgKHNhdmVhYmxlX3BhZ2Uoem9uZSwgcGZuKSkKIAkJCQluKys7CiAJfQogCXJldHVybiBuOwpAQCAtOTQ0LDcgKzk1OSw3IEBACiBwYWdlX2lzX3NhdmVhYmxlKHN0cnVjdCB6b25lICp6b25lLCB1bnNpZ25lZCBsb25nIHBmbikKIHsKIAlyZXR1cm4gaXNfaGlnaG1lbSh6b25lKSA/Ci0JCQlzYXZlYWJsZV9oaWdobWVtX3BhZ2UocGZuKSA6IHNhdmVhYmxlX3BhZ2UocGZuKTsKKwkJc2F2ZWFibGVfaGlnaG1lbV9wYWdlKHpvbmUsIHBmbikgOiBzYXZlYWJsZV9wYWdlKHpvbmUsIHBmbik7CiB9CiAKIHN0YXRpYyB2b2lkIGNvcHlfZGF0YV9wYWdlKHVuc2lnbmVkIGxvbmcgZHN0X3BmbiwgdW5zaWduZWQgbG9uZyBzcmNfcGZuKQpAQCAtOTY2LDcgKzk4MSw3IEBACiAJCQkgKiBkYXRhIG1vZGlmaWVkIGJ5IGttYXBfYXRvbWljKCkKIAkJCSAqLwogCQkJc2FmZV9jb3B5X3BhZ2UoYnVmZmVyLCBzX3BhZ2UpOwotCQkJZHN0ID0ga21hcF9hdG9taWMocGZuX3RvX3BhZ2UoZHN0X3BmbiksIEtNX1VTRVIwKTsKKwkJCWRzdCA9IGttYXBfYXRvbWljKGRfcGFnZSwgS01fVVNFUjApOwogCQkJbWVtY3B5KGRzdCwgYnVmZmVyLCBQQUdFX1NJWkUpOwogCQkJa3VubWFwX2F0b21pYyhkc3QsIEtNX1VTRVIwKTsKIAkJfSBlbHNlIHsKQEAgLTk3NSw3ICs5OTAsNyBAQAogCX0KIH0KICNlbHNlCi0jZGVmaW5lIHBhZ2VfaXNfc2F2ZWFibGUoem9uZSwgcGZuKQlzYXZlYWJsZV9wYWdlKHBmbikKKyNkZWZpbmUgcGFnZV9pc19zYXZlYWJsZSh6b25lLCBwZm4pCXNhdmVhYmxlX3BhZ2Uoem9uZSwgcGZuKQogCiBzdGF0aWMgaW5saW5lIHZvaWQgY29weV9kYXRhX3BhZ2UodW5zaWduZWQgbG9uZyBkc3RfcGZuLCB1bnNpZ25lZCBsb25nIHNyY19wZm4pCiB7CkBAIC0xNDU5LDkgKzE0NzQsNyBAQAogICoJdW5wYWNrX29yaWdfcGZucyAtIGZvciBlYWNoIGVsZW1lbnQgb2YgQGJ1ZltdICgxIHBhZ2UgYXQgYSB0aW1lKSBzZXQKICAqCXRoZSBjb3JyZXNwb25kaW5nIGJpdCBpbiB0aGUgbWVtb3J5IGJpdG1hcCBAYm0KICAqLwotCi1zdGF0aWMgaW5saW5lIHZvaWQKLXVucGFja19vcmlnX3BmbnModW5zaWduZWQgbG9uZyAqYnVmLCBzdHJ1Y3QgbWVtb3J5X2JpdG1hcCAqYm0pCitzdGF0aWMgaW50IHVucGFja19vcmlnX3BmbnModW5zaWduZWQgbG9uZyAqYnVmLCBzdHJ1Y3QgbWVtb3J5X2JpdG1hcCAqYm0pCiB7CiAJaW50IGo7CiAKQEAgLTE0NjksOCArMTQ4MiwxMyBAQAogCQlpZiAodW5saWtlbHkoYnVmW2pdID09IEJNX0VORF9PRl9NQVApKQogCQkJYnJlYWs7CiAKLQkJbWVtb3J5X2JtX3NldF9iaXQoYm0sIGJ1ZltqXSk7CisJCWlmIChtZW1vcnlfYm1fcGZuX3ByZXNlbnQoYm0sIGJ1ZltqXSkpCisJCQltZW1vcnlfYm1fc2V0X2JpdChibSwgYnVmW2pdKTsKKwkJZWxzZQorCQkJcmV0dXJuIC1FRkFVTFQ7CiAJfQorCisJcmV0dXJuIDA7CiB9CiAKIC8qIExpc3Qgb2YgInNhZmUiIHBhZ2VzIHRoYXQgbWF5IGJlIHVzZWQgdG8gc3RvcmUgZGF0YSBsb2FkZWQgZnJvbSB0aGUgc3VzcGVuZApAQCAtMTYwOCw3ICsxNjI2LDcgQEAKIAlwYmUgPSBjaGFpbl9hbGxvYyhjYSwgc2l6ZW9mKHN0cnVjdCBoaWdobWVtX3BiZSkpOwogCWlmICghcGJlKSB7CiAJCXN3c3VzcF9mcmVlKCk7Ci0JCXJldHVybiBOVUxMOworCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKIAl9CiAJcGJlLT5vcmlnX3BhZ2UgPSBwYWdlOwogCWlmIChzYWZlX2hpZ2htZW1fcGFnZXMgPiAwKSB7CkBAIC0xNjc3LDcgKzE2OTUsNyBAQAogc3RhdGljIGlubGluZSB2b2lkICoKIGdldF9oaWdobWVtX3BhZ2VfYnVmZmVyKHN0cnVjdCBwYWdlICpwYWdlLCBzdHJ1Y3QgY2hhaW5fYWxsb2NhdG9yICpjYSkKIHsKLQlyZXR1cm4gTlVMTDsKKwlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIGNvcHlfbGFzdF9oaWdobWVtX3BhZ2Uodm9pZCkge30KQEAgLTE3ODgsOCArMTgwNiwxMyBAQAogc3RhdGljIHZvaWQgKmdldF9idWZmZXIoc3RydWN0IG1lbW9yeV9iaXRtYXAgKmJtLCBzdHJ1Y3QgY2hhaW5fYWxsb2NhdG9yICpjYSkKIHsKIAlzdHJ1Y3QgcGJlICpwYmU7Ci0Jc3RydWN0IHBhZ2UgKnBhZ2UgPSBwZm5fdG9fcGFnZShtZW1vcnlfYm1fbmV4dF9wZm4oYm0pKTsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwl1bnNpZ25lZCBsb25nIHBmbiA9IG1lbW9yeV9ibV9uZXh0X3BmbihibSk7CiAKKwlpZiAocGZuID09IEJNX0VORF9PRl9NQVApCisJCXJldHVybiBFUlJfUFRSKC1FRkFVTFQpOworCisJcGFnZSA9IHBmbl90b19wYWdlKHBmbik7CiAJaWYgKFBhZ2VIaWdoTWVtKHBhZ2UpKQogCQlyZXR1cm4gZ2V0X2hpZ2htZW1fcGFnZV9idWZmZXIocGFnZSwgY2EpOwogCkBAIC0xODA1LDcgKzE4MjgsNyBAQAogCXBiZSA9IGNoYWluX2FsbG9jKGNhLCBzaXplb2Yoc3RydWN0IHBiZSkpOwogCWlmICghcGJlKSB7CiAJCXN3c3VzcF9mcmVlKCk7Ci0JCXJldHVybiBOVUxMOworCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKIAl9CiAJcGJlLT5vcmlnX2FkZHJlc3MgPSBwYWdlX2FkZHJlc3MocGFnZSk7CiAJcGJlLT5hZGRyZXNzID0gc2FmZV9wYWdlc19saXN0OwpAQCAtMTg2OCw3ICsxODkxLDEwIEBACiAJCQkJcmV0dXJuIGVycm9yOwogCiAJCX0gZWxzZSBpZiAoaGFuZGxlLT5wcmV2IDw9IG5yX21ldGFfcGFnZXMpIHsKLQkJCXVucGFja19vcmlnX3BmbnMoYnVmZmVyLCAmY29weV9ibSk7CisJCQllcnJvciA9IHVucGFja19vcmlnX3BmbnMoYnVmZmVyLCAmY29weV9ibSk7CisJCQlpZiAoZXJyb3IpCisJCQkJcmV0dXJuIGVycm9yOworCiAJCQlpZiAoaGFuZGxlLT5wcmV2ID09IG5yX21ldGFfcGFnZXMpIHsKIAkJCQllcnJvciA9IHByZXBhcmVfaW1hZ2UoJm9yaWdfYm0sICZjb3B5X2JtKTsKIAkJCQlpZiAoZXJyb3IpCkBAIC0xODc5LDEyICsxOTA1LDE0IEBACiAJCQkJcmVzdG9yZV9wYmxpc3QgPSBOVUxMOwogCQkJCWhhbmRsZS0+YnVmZmVyID0gZ2V0X2J1ZmZlcigmb3JpZ19ibSwgJmNhKTsKIAkJCQloYW5kbGUtPnN5bmNfcmVhZCA9IDA7Ci0JCQkJaWYgKCFoYW5kbGUtPmJ1ZmZlcikKLQkJCQkJcmV0dXJuIC1FTk9NRU07CisJCQkJaWYgKElTX0VSUihoYW5kbGUtPmJ1ZmZlcikpCisJCQkJCXJldHVybiBQVFJfRVJSKGhhbmRsZS0+YnVmZmVyKTsKIAkJCX0KIAkJfSBlbHNlIHsKIAkJCWNvcHlfbGFzdF9oaWdobWVtX3BhZ2UoKTsKIAkJCWhhbmRsZS0+YnVmZmVyID0gZ2V0X2J1ZmZlcigmb3JpZ19ibSwgJmNhKTsKKwkJCWlmIChJU19FUlIoaGFuZGxlLT5idWZmZXIpKQorCQkJCXJldHVybiBQVFJfRVJSKGhhbmRsZS0+YnVmZmVyKTsKIAkJCWlmIChoYW5kbGUtPmJ1ZmZlciAhPSBidWZmZXIpCiAJCQkJaGFuZGxlLT5zeW5jX3JlYWQgPSAwOwogCQl9CmRpZmYgLS1naXQgYS9rZXJuZWwvcG93ZXIvc3dzdXNwLmMgYi9rZXJuZWwvcG93ZXIvc3dzdXNwLmMKaW5kZXggMDIzZmYyYS4uYTkyYzkxNCAxMDA2NDQKLS0tIGEva2VybmVsL3Bvd2VyL3N3c3VzcC5jCisrKyBiL2tlcm5lbC9wb3dlci9zd3N1c3AuYwpAQCAtMjYyLDMgKzI2MiwxMjUgQEAKIAogCXJldHVybiAwOwogfQorCisvKgorICogUGxhdGZvcm1zLCBsaWtlIEFDUEksIG1heSB3YW50IHVzIHRvIHNhdmUgc29tZSBtZW1vcnkgdXNlZCBieSB0aGVtIGR1cmluZworICogaGliZXJuYXRpb24gYW5kIHRvIHJlc3RvcmUgdGhlIGNvbnRlbnRzIG9mIHRoaXMgbWVtb3J5IGR1cmluZyB0aGUgc3Vic2VxdWVudAorICogcmVzdW1lLiAgVGhlIGNvZGUgYmVsb3cgaW1wbGVtZW50cyBhIG1lY2hhbmlzbSBhbGxvd2luZyB1cyB0byBkbyB0aGF0LgorICovCisKK3N0cnVjdCBudnNfcGFnZSB7CisJdW5zaWduZWQgbG9uZyBwaHlzX3N0YXJ0OworCXVuc2lnbmVkIGludCBzaXplOworCXZvaWQgKmthZGRyOworCXZvaWQgKmRhdGE7CisJc3RydWN0IGxpc3RfaGVhZCBub2RlOworfTsKKworc3RhdGljIExJU1RfSEVBRChudnNfbGlzdCk7CisKKy8qKgorICoJaGliZXJuYXRlX252c19yZWdpc3RlciAtIHJlZ2lzdGVyIHBsYXRmb3JtIE5WUyBtZW1vcnkgcmVnaW9uIHRvIHNhdmUKKyAqCUBzdGFydCAtIHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIHJlZ2lvbgorICoJQHNpemUgLSBzaXplIG9mIHRoZSByZWdpb24KKyAqCisgKglUaGUgTlZTIHJlZ2lvbiBuZWVkIG5vdCBiZSBwYWdlLWFsaWduZWQgKGJvdGggZW5kcykgYW5kIHdlIGFycmFuZ2UKKyAqCXRoaW5ncyBzbyB0aGF0IHRoZSBkYXRhIGZyb20gcGFnZS1hbGlnbmVkIGFkZHJlc3NlcyBpbiB0aGlzIHJlZ2lvbiB3aWxsCisgKgliZSBjb3BpZWQgaW50byBzZXBhcmF0ZSBSQU0gcGFnZXMuCisgKi8KK2ludCBoaWJlcm5hdGVfbnZzX3JlZ2lzdGVyKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKK3sKKwlzdHJ1Y3QgbnZzX3BhZ2UgKmVudHJ5LCAqbmV4dDsKKworCXdoaWxlIChzaXplID4gMCkgeworCQl1bnNpZ25lZCBpbnQgbnJfYnl0ZXM7CisKKwkJZW50cnkgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbnZzX3BhZ2UpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFlbnRyeSkKKwkJCWdvdG8gRXJyb3I7CisKKwkJbGlzdF9hZGRfdGFpbCgmZW50cnktPm5vZGUsICZudnNfbGlzdCk7CisJCWVudHJ5LT5waHlzX3N0YXJ0ID0gc3RhcnQ7CisJCW5yX2J5dGVzID0gUEFHRV9TSVpFIC0gKHN0YXJ0ICYgflBBR0VfTUFTSyk7CisJCWVudHJ5LT5zaXplID0gKHNpemUgPCBucl9ieXRlcykgPyBzaXplIDogbnJfYnl0ZXM7CisKKwkJc3RhcnQgKz0gZW50cnktPnNpemU7CisJCXNpemUgLT0gZW50cnktPnNpemU7CisJfQorCXJldHVybiAwOworCisgRXJyb3I6CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGVudHJ5LCBuZXh0LCAmbnZzX2xpc3QsIG5vZGUpIHsKKwkJbGlzdF9kZWwoJmVudHJ5LT5ub2RlKTsKKwkJa2ZyZWUoZW50cnkpOworCX0KKwlyZXR1cm4gLUVOT01FTTsKK30KKworLyoqCisgKgloaWJlcm5hdGVfbnZzX2ZyZWUgLSBmcmVlIGRhdGEgcGFnZXMgYWxsb2NhdGVkIGZvciBzYXZpbmcgTlZTIHJlZ2lvbnMKKyAqLwordm9pZCBoaWJlcm5hdGVfbnZzX2ZyZWUodm9pZCkKK3sKKwlzdHJ1Y3QgbnZzX3BhZ2UgKmVudHJ5OworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShlbnRyeSwgJm52c19saXN0LCBub2RlKQorCQlpZiAoZW50cnktPmRhdGEpIHsKKwkJCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZyllbnRyeS0+ZGF0YSk7CisJCQllbnRyeS0+ZGF0YSA9IE5VTEw7CisJCQlpZiAoZW50cnktPmthZGRyKSB7CisJCQkJaW91bm1hcChlbnRyeS0+a2FkZHIpOworCQkJCWVudHJ5LT5rYWRkciA9IE5VTEw7CisJCQl9CisJCX0KK30KKworLyoqCisgKgloaWJlcm5hdGVfbnZzX2FsbG9jIC0gYWxsb2NhdGUgbWVtb3J5IG5lY2Vzc2FyeSBmb3Igc2F2aW5nIE5WUyByZWdpb25zCisgKi8KK2ludCBoaWJlcm5hdGVfbnZzX2FsbG9jKHZvaWQpCit7CisJc3RydWN0IG52c19wYWdlICplbnRyeTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoZW50cnksICZudnNfbGlzdCwgbm9kZSkgeworCQllbnRyeS0+ZGF0YSA9ICh2b2lkICopX19nZXRfZnJlZV9wYWdlKEdGUF9LRVJORUwpOworCQlpZiAoIWVudHJ5LT5kYXRhKSB7CisJCQloaWJlcm5hdGVfbnZzX2ZyZWUoKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJfQorCXJldHVybiAwOworfQorCisvKioKKyAqCWhpYmVybmF0ZV9udnNfc2F2ZSAtIHNhdmUgTlZTIG1lbW9yeSByZWdpb25zCisgKi8KK3ZvaWQgaGliZXJuYXRlX252c19zYXZlKHZvaWQpCit7CisJc3RydWN0IG52c19wYWdlICplbnRyeTsKKworCXByaW50ayhLRVJOX0lORk8gIlBNOiBTYXZpbmcgcGxhdGZvcm0gTlZTIG1lbW9yeVxuIik7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGVudHJ5LCAmbnZzX2xpc3QsIG5vZGUpCisJCWlmIChlbnRyeS0+ZGF0YSkgeworCQkJZW50cnktPmthZGRyID0gaW9yZW1hcChlbnRyeS0+cGh5c19zdGFydCwgZW50cnktPnNpemUpOworCQkJbWVtY3B5KGVudHJ5LT5kYXRhLCBlbnRyeS0+a2FkZHIsIGVudHJ5LT5zaXplKTsKKwkJfQorfQorCisvKioKKyAqCWhpYmVybmF0ZV9udnNfcmVzdG9yZSAtIHJlc3RvcmUgTlZTIG1lbW9yeSByZWdpb25zCisgKgorICoJVGhpcyBmdW5jdGlvbiBpcyBnb2luZyB0byBiZSBjYWxsZWQgd2l0aCBpbnRlcnJ1cHRzIGRpc2FibGVkLCBzbyBpdAorICoJY2Fubm90IGlvdW5tYXAgdGhlIHZpcnR1YWwgYWRkcmVzc2VzIHVzZWQgdG8gYWNjZXNzIHRoZSBOVlMgcmVnaW9uLgorICovCit2b2lkIGhpYmVybmF0ZV9udnNfcmVzdG9yZSh2b2lkKQoreworCXN0cnVjdCBudnNfcGFnZSAqZW50cnk7CisKKwlwcmludGsoS0VSTl9JTkZPICJQTTogUmVzdG9yaW5nIHBsYXRmb3JtIE5WUyBtZW1vcnlcbiIpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShlbnRyeSwgJm52c19saXN0LCBub2RlKQorCQlpZiAoZW50cnktPmRhdGEpCisJCQltZW1jcHkoZW50cnktPmthZGRyLCBlbnRyeS0+ZGF0YSwgZW50cnktPnNpemUpOworfQpkaWZmIC0tZ2l0IGEva2VybmVsL3ByaW50ay5jIGIva2VybmVsL3ByaW50ay5jCmluZGV4IGU2NTFhYjAuLjY5MTg4ZjIgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9wcmludGsuYworKysgYi9rZXJuZWwvcHJpbnRrLmMKQEAgLTM4Miw3ICszODIsNyBAQAogCXJldHVybiBlcnJvcjsKIH0KIAotYXNtbGlua2FnZSBsb25nIHN5c19zeXNsb2coaW50IHR5cGUsIGNoYXIgX191c2VyICpidWYsIGludCBsZW4pCitTWVNDQUxMX0RFRklORTMoc3lzbG9nLCBpbnQsIHR5cGUsIGNoYXIgX191c2VyICosIGJ1ZiwgaW50LCBsZW4pCiB7CiAJcmV0dXJuIGRvX3N5c2xvZyh0eXBlLCBidWYsIGxlbik7CiB9CkBAIC02MTksNyArNjE5LDcgQEAKIHN0YXRpYyBjb25zdCBjaGFyIHJlY3Vyc2lvbl9idWdfbXNnIFtdID0KIAkJS0VSTl9DUklUICJCVUc6IHJlY2VudCBwcmludGsgcmVjdXJzaW9uIVxuIjsKIHN0YXRpYyBpbnQgcmVjdXJzaW9uX2J1ZzsKLQlzdGF0aWMgaW50IG5ld190ZXh0X2xpbmUgPSAxOworc3RhdGljIGludCBuZXdfdGV4dF9saW5lID0gMTsKIHN0YXRpYyBjaGFyIHByaW50a19idWZbMTAyNF07CiAKIGFzbWxpbmthZ2UgaW50IHZwcmludGsoY29uc3QgY2hhciAqZm10LCB2YV9saXN0IGFyZ3MpCkBAIC03NDIsMTEgKzc0Miw2IEBACiAKICNlbHNlCiAKLWFzbWxpbmthZ2UgbG9uZyBzeXNfc3lzbG9nKGludCB0eXBlLCBjaGFyIF9fdXNlciAqYnVmLCBpbnQgbGVuKQotewotCXJldHVybiAtRU5PU1lTOwotfQotCiBzdGF0aWMgdm9pZCBjYWxsX2NvbnNvbGVfZHJpdmVycyh1bnNpZ25lZCBzdGFydCwgdW5zaWduZWQgZW5kKQogewogfQpkaWZmIC0tZ2l0IGEva2VybmVsL3B0cmFjZS5jIGIva2VybmVsL3B0cmFjZS5jCmluZGV4IDI5ZGM3MDAuLmM5Y2Y0OGIgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9wdHJhY2UuYworKysgYi9rZXJuZWwvcHRyYWNlLmMKQEAgLTU3NCw3ICs1NzQsNyBAQAogI2RlZmluZSBhcmNoX3B0cmFjZV9hdHRhY2goY2hpbGQpCWRvIHsgfSB3aGlsZSAoMCkKICNlbmRpZgogCi1hc21saW5rYWdlIGxvbmcgc3lzX3B0cmFjZShsb25nIHJlcXVlc3QsIGxvbmcgcGlkLCBsb25nIGFkZHIsIGxvbmcgZGF0YSkKK1NZU0NBTExfREVGSU5FNChwdHJhY2UsIGxvbmcsIHJlcXVlc3QsIGxvbmcsIHBpZCwgbG9uZywgYWRkciwgbG9uZywgZGF0YSkKIHsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNoaWxkOwogCWxvbmcgcmV0OwpkaWZmIC0tZ2l0IGEva2VybmVsL3JjdXRvcnR1cmUuYyBiL2tlcm5lbC9yY3V0b3J0dXJlLmMKaW5kZXggMWNmZjI4ZC4uN2M0MTQyYSAxMDA2NDQKLS0tIGEva2VybmVsL3JjdXRvcnR1cmUuYworKysgYi9rZXJuZWwvcmN1dG9ydHVyZS5jCkBAIC0xMzYsMjkgKzEzNiw0NyBAQAogI2VuZGlmCiBpbnQgcmN1dG9ydHVyZV9ydW5uYWJsZSA9IFJDVVRPUlRVUkVfUlVOTkFCTEVfSU5JVDsKIAotI2RlZmluZSBGVUxMU1RPUF9TSFVURE9XTiAxCS8qIEJhaWwgZHVlIHRvIHN5c3RlbSBzaHV0ZG93bi9wYW5pYy4gKi8KLSNkZWZpbmUgRlVMTFNUT1BfQ0xFQU5VUCAgMgkvKiBPcmRlcmx5IHNodXRkb3duLiAqLwotc3RhdGljIGludCBmdWxsc3RvcDsJCS8qIHN0b3AgZ2VuZXJhdGluZyBjYWxsYmFja3MgYXQgdGVzdCBlbmQuICovCi1ERUZJTkVfTVVURVgoZnVsbHN0b3BfbXV0ZXgpOwkvKiBwcm90ZWN0IGZ1bGxzdG9wIHRyYW5zaXRpb25zIGFuZCAqLwotCQkJCS8qICBzcGF3bmluZyBvZiBrdGhyZWFkcy4gKi8KKy8qIE1lZGlhdGUgcm1tb2QgYW5kIHN5c3RlbSBzaHV0ZG93bi4gIENvbmN1cnJlbnQgcm1tb2QgJiBzaHV0ZG93biBpbGxlZ2FsISAqLworCisjZGVmaW5lIEZVTExTVE9QX0RPTlRTVE9QIDAJLyogTm9ybWFsIG9wZXJhdGlvbi4gKi8KKyNkZWZpbmUgRlVMTFNUT1BfU0hVVERPV04gMQkvKiBTeXN0ZW0gc2h1dGRvd24gd2l0aCByY3V0b3J0dXJlIHJ1bm5pbmcuICovCisjZGVmaW5lIEZVTExTVE9QX1JNTU9EICAgIDIJLyogTm9ybWFsIHJtbW9kIG9mIHJjdXRvcnR1cmUuICovCitzdGF0aWMgaW50IGZ1bGxzdG9wID0gRlVMTFNUT1BfUk1NT0Q7CitERUZJTkVfTVVURVgoZnVsbHN0b3BfbXV0ZXgpOwkvKiBQcm90ZWN0IGZ1bGxzdG9wIHRyYW5zaXRpb25zIGFuZCBzcGF3bmluZyAqLworCQkJCS8qICBvZiBrdGhyZWFkcy4gKi8KIAogLyoKLSAqIERldGVjdCBhbmQgcmVzcG9uZCB0byBhIHNpZ25hbC1iYXNlZCBzaHV0ZG93bi4KKyAqIERldGVjdCBhbmQgcmVzcG9uZCB0byBhIHN5c3RlbSBzaHV0ZG93bi4KICAqLwogc3RhdGljIGludAogcmN1dG9ydHVyZV9zaHV0ZG93bl9ub3RpZnkoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICp1bnVzZWQxLAogCQkJICAgdW5zaWduZWQgbG9uZyB1bnVzZWQyLCB2b2lkICp1bnVzZWQzKQogewotCWlmIChmdWxsc3RvcCkKLQkJcmV0dXJuIE5PVElGWV9ET05FOwogCW11dGV4X2xvY2soJmZ1bGxzdG9wX211dGV4KTsKLQlpZiAoIWZ1bGxzdG9wKQorCWlmIChmdWxsc3RvcCA9PSBGVUxMU1RPUF9ET05UU1RPUCkKIAkJZnVsbHN0b3AgPSBGVUxMU1RPUF9TSFVURE9XTjsKKwllbHNlCisJCXByaW50ayhLRVJOX1dBUk5JTkcgLyogYnV0IGdvaW5nIGRvd24gYW55d2F5LCBzby4uLiAqLworCQkgICAgICAgIkNvbmN1cnJlbnQgJ3JtbW9kIHJjdXRvcnR1cmUnIGFuZCBzaHV0ZG93biBpbGxlZ2FsIVxuIik7CiAJbXV0ZXhfdW5sb2NrKCZmdWxsc3RvcF9tdXRleCk7CiAJcmV0dXJuIE5PVElGWV9ET05FOwogfQogCiAvKgorICogQWJzb3JiIGt0aHJlYWRzIGludG8gYSBrZXJuZWwgZnVuY3Rpb24gdGhhdCB3b24ndCByZXR1cm4sIHNvIHRoYXQKKyAqIHRoZXkgd29uJ3QgZXZlciBhY2Nlc3MgbW9kdWxlIHRleHQgb3IgZGF0YSBhZ2Fpbi4KKyAqLworc3RhdGljIHZvaWQgcmN1dG9ydHVyZV9zaHV0ZG93bl9hYnNvcmIoY2hhciAqdGl0bGUpCit7CisJaWYgKEFDQ0VTU19PTkNFKGZ1bGxzdG9wKSA9PSBGVUxMU1RPUF9TSFVURE9XTikgeworCQlwcmludGsoS0VSTl9OT1RJQ0UKKwkJICAgICAgICJyY3V0b3J0dXJlIHRocmVhZCAlcyBwYXJraW5nIGR1ZSB0byBzeXN0ZW0gc2h1dGRvd25cbiIsCisJCSAgICAgICB0aXRsZSk7CisJCXNjaGVkdWxlX3RpbWVvdXRfdW5pbnRlcnJ1cHRpYmxlKE1BWF9TQ0hFRFVMRV9USU1FT1VUKTsKKwl9Cit9CisKKy8qCiAgKiBBbGxvY2F0ZSBhbiBlbGVtZW50IGZyb20gdGhlIHJjdV90b3J0dXJlcyBwb29sLgogICovCiBzdGF0aWMgc3RydWN0IHJjdV90b3J0dXJlICoKQEAgLTIxOSwxMyArMjM3LDE0IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1yY3Vfc3R1dHRlcl93YWl0KHZvaWQpCityY3Vfc3R1dHRlcl93YWl0KGNoYXIgKnRpdGxlKQogewotCXdoaWxlICgoc3R1dHRlcl9wYXVzZV90ZXN0IHx8ICFyY3V0b3J0dXJlX3J1bm5hYmxlKSAmJiAhZnVsbHN0b3ApIHsKKwl3aGlsZSAoc3R1dHRlcl9wYXVzZV90ZXN0IHx8ICFyY3V0b3J0dXJlX3J1bm5hYmxlKSB7CiAJCWlmIChyY3V0b3J0dXJlX3J1bm5hYmxlKQogCQkJc2NoZWR1bGVfdGltZW91dF9pbnRlcnJ1cHRpYmxlKDEpOwogCQllbHNlCiAJCQlzY2hlZHVsZV90aW1lb3V0X2ludGVycnVwdGlibGUocm91bmRfamlmZmllc19yZWxhdGl2ZShIWikpOworCQlyY3V0b3J0dXJlX3NodXRkb3duX2Fic29yYih0aXRsZSk7CiAJfQogfQogCkBAIC0yODcsNyArMzA2LDcgQEAKIAlpbnQgaTsKIAlzdHJ1Y3QgcmN1X3RvcnR1cmUgKnJwID0gY29udGFpbmVyX29mKHAsIHN0cnVjdCByY3VfdG9ydHVyZSwgcnRvcnRfcmN1KTsKIAotCWlmIChmdWxsc3RvcCkgeworCWlmIChmdWxsc3RvcCAhPSBGVUxMU1RPUF9ET05UU1RPUCkgewogCQkvKiBUZXN0IGlzIGVuZGluZywganVzdCBkcm9wIGNhbGxiYWNrcyBvbiB0aGUgZmxvb3IuICovCiAJCS8qIFRoZSBuZXh0IGluaXRpYWxpemF0aW9uIHdpbGwgcGljayB1cCB0aGUgcGllY2VzLiAqLwogCQlyZXR1cm47CkBAIC02MTksMTAgKzYzOCwxMSBAQAogCQl9CiAJCXJjdV90b3J0dXJlX2N1cnJlbnRfdmVyc2lvbisrOwogCQlvbGRiYXRjaCA9IGN1cl9vcHMtPmNvbXBsZXRlZCgpOwotCQlyY3Vfc3R1dHRlcl93YWl0KCk7Ci0JfSB3aGlsZSAoIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSAmJiAhZnVsbHN0b3ApOworCQlyY3Vfc3R1dHRlcl93YWl0KCJyY3VfdG9ydHVyZV93cml0ZXIiKTsKKwl9IHdoaWxlICgha3RocmVhZF9zaG91bGRfc3RvcCgpICYmIGZ1bGxzdG9wID09IEZVTExTVE9QX0RPTlRTVE9QKTsKIAlWRVJCT1NFX1BSSU5US19TVFJJTkcoInJjdV90b3J0dXJlX3dyaXRlciB0YXNrIHN0b3BwaW5nIik7Ci0Jd2hpbGUgKCFrdGhyZWFkX3Nob3VsZF9zdG9wKCkgJiYgZnVsbHN0b3AgIT0gRlVMTFNUT1BfU0hVVERPV04pCisJcmN1dG9ydHVyZV9zaHV0ZG93bl9hYnNvcmIoInJjdV90b3J0dXJlX3dyaXRlciIpOworCXdoaWxlICgha3RocmVhZF9zaG91bGRfc3RvcCgpKQogCQlzY2hlZHVsZV90aW1lb3V0X3VuaW50ZXJydXB0aWJsZSgxKTsKIAlyZXR1cm4gMDsKIH0KQEAgLTY0MywxMSArNjYzLDEyIEBACiAJCXNjaGVkdWxlX3RpbWVvdXRfdW5pbnRlcnJ1cHRpYmxlKDEgKyByY3VfcmFuZG9tKCZyYW5kKSUxMCk7CiAJCXVkZWxheShyY3VfcmFuZG9tKCZyYW5kKSAmIDB4M2ZmKTsKIAkJY3VyX29wcy0+c3luYygpOwotCQlyY3Vfc3R1dHRlcl93YWl0KCk7Ci0JfSB3aGlsZSAoIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSAmJiAhZnVsbHN0b3ApOworCQlyY3Vfc3R1dHRlcl93YWl0KCJyY3VfdG9ydHVyZV9mYWtld3JpdGVyIik7CisJfSB3aGlsZSAoIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSAmJiBmdWxsc3RvcCA9PSBGVUxMU1RPUF9ET05UU1RPUCk7CiAKIAlWRVJCT1NFX1BSSU5US19TVFJJTkcoInJjdV90b3J0dXJlX2Zha2V3cml0ZXIgdGFzayBzdG9wcGluZyIpOwotCXdoaWxlICgha3RocmVhZF9zaG91bGRfc3RvcCgpICYmIGZ1bGxzdG9wICE9IEZVTExTVE9QX1NIVVRET1dOKQorCXJjdXRvcnR1cmVfc2h1dGRvd25fYWJzb3JiKCJyY3VfdG9ydHVyZV9mYWtld3JpdGVyIik7CisJd2hpbGUgKCFrdGhyZWFkX3Nob3VsZF9zdG9wKCkpCiAJCXNjaGVkdWxlX3RpbWVvdXRfdW5pbnRlcnJ1cHRpYmxlKDEpOwogCXJldHVybiAwOwogfQpAQCAtNzUyLDEyICs3NzMsMTMgQEAKIAkJcHJlZW1wdF9lbmFibGUoKTsKIAkJY3VyX29wcy0+cmVhZHVubG9jayhpZHgpOwogCQlzY2hlZHVsZSgpOwotCQlyY3Vfc3R1dHRlcl93YWl0KCk7Ci0JfSB3aGlsZSAoIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSAmJiAhZnVsbHN0b3ApOworCQlyY3Vfc3R1dHRlcl93YWl0KCJyY3VfdG9ydHVyZV9yZWFkZXIiKTsKKwl9IHdoaWxlICgha3RocmVhZF9zaG91bGRfc3RvcCgpICYmIGZ1bGxzdG9wID09IEZVTExTVE9QX0RPTlRTVE9QKTsKIAlWRVJCT1NFX1BSSU5US19TVFJJTkcoInJjdV90b3J0dXJlX3JlYWRlciB0YXNrIHN0b3BwaW5nIik7CisJcmN1dG9ydHVyZV9zaHV0ZG93bl9hYnNvcmIoInJjdV90b3J0dXJlX3JlYWRlciIpOwogCWlmIChpcnFyZWFkZXIgJiYgY3VyX29wcy0+aXJxY2FwYWJsZSkKIAkJZGVsX3RpbWVyX3N5bmMoJnQpOwotCXdoaWxlICgha3RocmVhZF9zaG91bGRfc3RvcCgpICYmIGZ1bGxzdG9wICE9IEZVTExTVE9QX1NIVVRET1dOKQorCXdoaWxlICgha3RocmVhZF9zaG91bGRfc3RvcCgpKQogCQlzY2hlZHVsZV90aW1lb3V0X3VuaW50ZXJydXB0aWJsZSgxKTsKIAlyZXR1cm4gMDsKIH0KQEAgLTg1NCw3ICs4NzYsOCBAQAogCWRvIHsKIAkJc2NoZWR1bGVfdGltZW91dF9pbnRlcnJ1cHRpYmxlKHN0YXRfaW50ZXJ2YWwgKiBIWik7CiAJCXJjdV90b3J0dXJlX3N0YXRzX3ByaW50KCk7Ci0JfSB3aGlsZSAoIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSAmJiAhZnVsbHN0b3ApOworCQlyY3V0b3J0dXJlX3NodXRkb3duX2Fic29yYigicmN1X3RvcnR1cmVfc3RhdHMiKTsKKwl9IHdoaWxlICgha3RocmVhZF9zaG91bGRfc3RvcCgpKTsKIAlWRVJCT1NFX1BSSU5US19TVFJJTkcoInJjdV90b3J0dXJlX3N0YXRzIHRhc2sgc3RvcHBpbmciKTsKIAlyZXR1cm4gMDsKIH0KQEAgLTg2Niw1MiArODg5LDQ5IEBACiAgKi8KIHN0YXRpYyB2b2lkIHJjdV90b3J0dXJlX3NodWZmbGVfdGFza3Modm9pZCkKIHsKLQljcHVtYXNrX3Zhcl90IHRtcF9tYXNrOworCWNwdW1hc2tfdCB0bXBfbWFzazsKIAlpbnQgaTsKIAotCWlmICghYWxsb2NfY3B1bWFza192YXIoJnRtcF9tYXNrLCBHRlBfS0VSTkVMKSkKLQkJQlVHKCk7Ci0KLQljcHVtYXNrX3NldGFsbCh0bXBfbWFzayk7CisJY3B1c19zZXRhbGwodG1wX21hc2spOwogCWdldF9vbmxpbmVfY3B1cygpOwogCiAJLyogTm8gcG9pbnQgaW4gc2h1ZmZsaW5nIGlmIHRoZXJlIGlzIG9ubHkgb25lIG9ubGluZSBDUFUgKGV4OiBVUCkgKi8KLQlpZiAobnVtX29ubGluZV9jcHVzKCkgPT0gMSkKLQkJZ290byBvdXQ7CisJaWYgKG51bV9vbmxpbmVfY3B1cygpID09IDEpIHsKKwkJcHV0X29ubGluZV9jcHVzKCk7CisJCXJldHVybjsKKwl9CiAKIAlpZiAocmN1X2lkbGVfY3B1ICE9IC0xKQotCQljcHVtYXNrX2NsZWFyX2NwdShyY3VfaWRsZV9jcHUsIHRtcF9tYXNrKTsKKwkJY3B1X2NsZWFyKHJjdV9pZGxlX2NwdSwgdG1wX21hc2spOwogCi0Jc2V0X2NwdXNfYWxsb3dlZF9wdHIoY3VycmVudCwgdG1wX21hc2spOworCXNldF9jcHVzX2FsbG93ZWRfcHRyKGN1cnJlbnQsICZ0bXBfbWFzayk7CiAKIAlpZiAocmVhZGVyX3Rhc2tzKSB7CiAJCWZvciAoaSA9IDA7IGkgPCBucmVhbHJlYWRlcnM7IGkrKykKIAkJCWlmIChyZWFkZXJfdGFza3NbaV0pCiAJCQkJc2V0X2NwdXNfYWxsb3dlZF9wdHIocmVhZGVyX3Rhc2tzW2ldLAotCQkJCQkJICAgICB0bXBfbWFzayk7CisJCQkJCQkgICAgICZ0bXBfbWFzayk7CiAJfQogCiAJaWYgKGZha2V3cml0ZXJfdGFza3MpIHsKIAkJZm9yIChpID0gMDsgaSA8IG5mYWtld3JpdGVyczsgaSsrKQogCQkJaWYgKGZha2V3cml0ZXJfdGFza3NbaV0pCiAJCQkJc2V0X2NwdXNfYWxsb3dlZF9wdHIoZmFrZXdyaXRlcl90YXNrc1tpXSwKLQkJCQkJCSAgICAgdG1wX21hc2spOworCQkJCQkJICAgICAmdG1wX21hc2spOwogCX0KIAogCWlmICh3cml0ZXJfdGFzaykKLQkJc2V0X2NwdXNfYWxsb3dlZF9wdHIod3JpdGVyX3Rhc2ssIHRtcF9tYXNrKTsKKwkJc2V0X2NwdXNfYWxsb3dlZF9wdHIod3JpdGVyX3Rhc2ssICZ0bXBfbWFzayk7CiAKIAlpZiAoc3RhdHNfdGFzaykKLQkJc2V0X2NwdXNfYWxsb3dlZF9wdHIoc3RhdHNfdGFzaywgdG1wX21hc2spOworCQlzZXRfY3B1c19hbGxvd2VkX3B0cihzdGF0c190YXNrLCAmdG1wX21hc2spOwogCiAJaWYgKHJjdV9pZGxlX2NwdSA9PSAtMSkKIAkJcmN1X2lkbGVfY3B1ID0gbnVtX29ubGluZV9jcHVzKCkgLSAxOwogCWVsc2UKIAkJcmN1X2lkbGVfY3B1LS07CiAKLW91dDoKIAlwdXRfb25saW5lX2NwdXMoKTsKLQlmcmVlX2NwdW1hc2tfdmFyKHRtcF9tYXNrKTsKIH0KIAogLyogU2h1ZmZsZSB0YXNrcyBhY3Jvc3MgQ1BVcywgd2l0aCB0aGUgaW50ZW50IG9mIGFsbG93aW5nIGVhY2ggQ1BVIGluIHRoZQpAQCAtOTI1LDcgKzk0NSw4IEBACiAJZG8gewogCQlzY2hlZHVsZV90aW1lb3V0X2ludGVycnVwdGlibGUoc2h1ZmZsZV9pbnRlcnZhbCAqIEhaKTsKIAkJcmN1X3RvcnR1cmVfc2h1ZmZsZV90YXNrcygpOwotCX0gd2hpbGUgKCFrdGhyZWFkX3Nob3VsZF9zdG9wKCkgJiYgIWZ1bGxzdG9wKTsKKwkJcmN1dG9ydHVyZV9zaHV0ZG93bl9hYnNvcmIoInJjdV90b3J0dXJlX3NodWZmbGUiKTsKKwl9IHdoaWxlICgha3RocmVhZF9zaG91bGRfc3RvcCgpKTsKIAlWRVJCT1NFX1BSSU5US19TVFJJTkcoInJjdV90b3J0dXJlX3NodWZmbGUgdGFzayBzdG9wcGluZyIpOwogCXJldHVybiAwOwogfQpAQCAtOTQwLDEwICs5NjEsMTEgQEAKIAlkbyB7CiAJCXNjaGVkdWxlX3RpbWVvdXRfaW50ZXJydXB0aWJsZShzdHV0dGVyICogSFopOwogCQlzdHV0dGVyX3BhdXNlX3Rlc3QgPSAxOwotCQlpZiAoIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSAmJiAhZnVsbHN0b3ApCisJCWlmICgha3RocmVhZF9zaG91bGRfc3RvcCgpKQogCQkJc2NoZWR1bGVfdGltZW91dF9pbnRlcnJ1cHRpYmxlKHN0dXR0ZXIgKiBIWik7CiAJCXN0dXR0ZXJfcGF1c2VfdGVzdCA9IDA7Ci0JfSB3aGlsZSAoIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSAmJiAhZnVsbHN0b3ApOworCQlyY3V0b3J0dXJlX3NodXRkb3duX2Fic29yYigicmN1X3RvcnR1cmVfc3R1dHRlciIpOworCX0gd2hpbGUgKCFrdGhyZWFkX3Nob3VsZF9zdG9wKCkpOwogCVZFUkJPU0VfUFJJTlRLX1NUUklORygicmN1X3RvcnR1cmVfc3R1dHRlciB0YXNrIHN0b3BwaW5nIik7CiAJcmV0dXJuIDA7CiB9CkBAIC05NzAsMTUgKzk5MiwxNiBAQAogCWludCBpOwogCiAJbXV0ZXhfbG9jaygmZnVsbHN0b3BfbXV0ZXgpOwotCWlmICghZnVsbHN0b3ApIHsKLQkJLyogSWYgYmVpbmcgc2lnbmFsZWQsIGxldCBpdCBoYXBwZW4sIHRoZW4gZXhpdC4gKi8KKwlpZiAoZnVsbHN0b3AgPT0gRlVMTFNUT1BfU0hVVERPV04pIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAvKiBidXQgZ29pbmcgZG93biBhbnl3YXksIHNvLi4uICovCisJCSAgICAgICAiQ29uY3VycmVudCAncm1tb2QgcmN1dG9ydHVyZScgYW5kIHNodXRkb3duIGlsbGVnYWwhXG4iKTsKIAkJbXV0ZXhfdW5sb2NrKCZmdWxsc3RvcF9tdXRleCk7Ci0JCXNjaGVkdWxlX3RpbWVvdXRfaW50ZXJydXB0aWJsZSgxMCAqIEhaKTsKKwkJc2NoZWR1bGVfdGltZW91dF91bmludGVycnVwdGlibGUoMTApOwogCQlpZiAoY3VyX29wcy0+Y2JfYmFycmllciAhPSBOVUxMKQogCQkJY3VyX29wcy0+Y2JfYmFycmllcigpOwogCQlyZXR1cm47CiAJfQotCWZ1bGxzdG9wID0gRlVMTFNUT1BfQ0xFQU5VUDsKKwlmdWxsc3RvcCA9IEZVTExTVE9QX1JNTU9EOwogCW11dGV4X3VubG9jaygmZnVsbHN0b3BfbXV0ZXgpOwogCXVucmVnaXN0ZXJfcmVib290X25vdGlmaWVyKCZyY3V0b3J0dXJlX25iKTsKIAlpZiAoc3R1dHRlcl90YXNrKSB7CkBAIC0xMDc4LDcgKzExMDEsNyBAQAogCWVsc2UKIAkJbnJlYWxyZWFkZXJzID0gMiAqIG51bV9vbmxpbmVfY3B1cygpOwogCXJjdV90b3J0dXJlX3ByaW50X21vZHVsZV9wYXJtcygiU3RhcnQgb2YgdGVzdCIpOwotCWZ1bGxzdG9wID0gMDsKKwlmdWxsc3RvcCA9IEZVTExTVE9QX0RPTlRTVE9QOwogCiAJLyogU2V0IHVwIHRoZSBmcmVlbGlzdC4gKi8KIApkaWZmIC0tZ2l0IGEva2VybmVsL3Jlc19jb3VudGVyLmMgYi9rZXJuZWwvcmVzX2NvdW50ZXIuYwppbmRleCBmMjc1YzhlLi5iZjhlNzUzIDEwMDY0NAotLS0gYS9rZXJuZWwvcmVzX2NvdW50ZXIuYworKysgYi9rZXJuZWwvcmVzX2NvdW50ZXIuYwpAQCAtMTUsMTAgKzE1LDExIEBACiAjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAKLXZvaWQgcmVzX2NvdW50ZXJfaW5pdChzdHJ1Y3QgcmVzX2NvdW50ZXIgKmNvdW50ZXIpCit2b2lkIHJlc19jb3VudGVyX2luaXQoc3RydWN0IHJlc19jb3VudGVyICpjb3VudGVyLCBzdHJ1Y3QgcmVzX2NvdW50ZXIgKnBhcmVudCkKIHsKIAlzcGluX2xvY2tfaW5pdCgmY291bnRlci0+bG9jayk7CiAJY291bnRlci0+bGltaXQgPSAodW5zaWduZWQgbG9uZyBsb25nKUxMT05HX01BWDsKKwljb3VudGVyLT5wYXJlbnQgPSBwYXJlbnQ7CiB9CiAKIGludCByZXNfY291bnRlcl9jaGFyZ2VfbG9ja2VkKHN0cnVjdCByZXNfY291bnRlciAqY291bnRlciwgdW5zaWduZWQgbG9uZyB2YWwpCkBAIC0zNCwxNCArMzUsMzQgQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IHJlc19jb3VudGVyX2NoYXJnZShzdHJ1Y3QgcmVzX2NvdW50ZXIgKmNvdW50ZXIsIHVuc2lnbmVkIGxvbmcgdmFsKQoraW50IHJlc19jb3VudGVyX2NoYXJnZShzdHJ1Y3QgcmVzX2NvdW50ZXIgKmNvdW50ZXIsIHVuc2lnbmVkIGxvbmcgdmFsLAorCQkJc3RydWN0IHJlc19jb3VudGVyICoqbGltaXRfZmFpbF9hdCkKIHsKIAlpbnQgcmV0OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IHJlc19jb3VudGVyICpjLCAqdTsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZjb3VudGVyLT5sb2NrLCBmbGFncyk7Ci0JcmV0ID0gcmVzX2NvdW50ZXJfY2hhcmdlX2xvY2tlZChjb3VudGVyLCB2YWwpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNvdW50ZXItPmxvY2ssIGZsYWdzKTsKKwkqbGltaXRfZmFpbF9hdCA9IE5VTEw7CisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCWZvciAoYyA9IGNvdW50ZXI7IGMgIT0gTlVMTDsgYyA9IGMtPnBhcmVudCkgeworCQlzcGluX2xvY2soJmMtPmxvY2spOworCQlyZXQgPSByZXNfY291bnRlcl9jaGFyZ2VfbG9ja2VkKGMsIHZhbCk7CisJCXNwaW5fdW5sb2NrKCZjLT5sb2NrKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCSpsaW1pdF9mYWlsX2F0ID0gYzsKKwkJCWdvdG8gdW5kbzsKKwkJfQorCX0KKwlyZXQgPSAwOworCWdvdG8gZG9uZTsKK3VuZG86CisJZm9yICh1ID0gY291bnRlcjsgdSAhPSBjOyB1ID0gdS0+cGFyZW50KSB7CisJCXNwaW5fbG9jaygmdS0+bG9jayk7CisJCXJlc19jb3VudGVyX3VuY2hhcmdlX2xvY2tlZCh1LCB2YWwpOworCQlzcGluX3VubG9jaygmdS0+bG9jayk7CisJfQorZG9uZToKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtNTYsMTAgKzc3LDE1IEBACiB2b2lkIHJlc19jb3VudGVyX3VuY2hhcmdlKHN0cnVjdCByZXNfY291bnRlciAqY291bnRlciwgdW5zaWduZWQgbG9uZyB2YWwpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgcmVzX2NvdW50ZXIgKmM7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmY291bnRlci0+bG9jaywgZmxhZ3MpOwotCXJlc19jb3VudGVyX3VuY2hhcmdlX2xvY2tlZChjb3VudGVyLCB2YWwpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNvdW50ZXItPmxvY2ssIGZsYWdzKTsKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJZm9yIChjID0gY291bnRlcjsgYyAhPSBOVUxMOyBjID0gYy0+cGFyZW50KSB7CisJCXNwaW5fbG9jaygmYy0+bG9jayk7CisJCXJlc19jb3VudGVyX3VuY2hhcmdlX2xvY2tlZChjLCB2YWwpOworCQlzcGluX3VubG9jaygmYy0+bG9jayk7CisJfQorCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIH0KIAogCmRpZmYgLS1naXQgYS9rZXJuZWwvcmVzb3VyY2UuYyBiL2tlcm5lbC9yZXNvdXJjZS5jCmluZGV4IGU2MzMxMDYuLmZkNWQ3ZDUgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9yZXNvdXJjZS5jCisrKyBiL2tlcm5lbC9yZXNvdXJjZS5jCkBAIC02MjAsMTAgKzYyMCwxMSBAQAogICogQHN0YXJ0OiByZXNvdXJjZSBzdGFydCBhZGRyZXNzCiAgKiBAbjogcmVzb3VyY2UgcmVnaW9uIHNpemUKICAqIEBuYW1lOiByZXNlcnZpbmcgY2FsbGVyJ3MgSUQgc3RyaW5nCisgKiBAZmxhZ3M6IElPIHJlc291cmNlIGZsYWdzCiAgKi8KIHN0cnVjdCByZXNvdXJjZSAqIF9fcmVxdWVzdF9yZWdpb24oc3RydWN0IHJlc291cmNlICpwYXJlbnQsCiAJCQkJICAgcmVzb3VyY2Vfc2l6ZV90IHN0YXJ0LCByZXNvdXJjZV9zaXplX3QgbiwKLQkJCQkgICBjb25zdCBjaGFyICpuYW1lKQorCQkJCSAgIGNvbnN0IGNoYXIgKm5hbWUsIGludCBmbGFncykKIHsKIAlzdHJ1Y3QgcmVzb3VyY2UgKnJlcyA9IGt6YWxsb2Moc2l6ZW9mKCpyZXMpLCBHRlBfS0VSTkVMKTsKIApAQCAtNjM0LDYgKzYzNSw3IEBACiAJcmVzLT5zdGFydCA9IHN0YXJ0OwogCXJlcy0+ZW5kID0gc3RhcnQgKyBuIC0gMTsKIAlyZXMtPmZsYWdzID0gSU9SRVNPVVJDRV9CVVNZOworCXJlcy0+ZmxhZ3MgfD0gZmxhZ3M7CiAKIAl3cml0ZV9sb2NrKCZyZXNvdXJjZV9sb2NrKTsKIApAQCAtNjc5LDcgKzY4MSw3IEBACiB7CiAJc3RydWN0IHJlc291cmNlICogcmVzOwogCi0JcmVzID0gX19yZXF1ZXN0X3JlZ2lvbihwYXJlbnQsIHN0YXJ0LCBuLCAiY2hlY2stcmVnaW9uIik7CisJcmVzID0gX19yZXF1ZXN0X3JlZ2lvbihwYXJlbnQsIHN0YXJ0LCBuLCAiY2hlY2stcmVnaW9uIiwgMCk7CiAJaWYgKCFyZXMpCiAJCXJldHVybiAtRUJVU1k7CiAKQEAgLTc3Niw3ICs3NzgsNyBAQAogCWRyLT5zdGFydCA9IHN0YXJ0OwogCWRyLT5uID0gbjsKIAotCXJlcyA9IF9fcmVxdWVzdF9yZWdpb24ocGFyZW50LCBzdGFydCwgbiwgbmFtZSk7CisJcmVzID0gX19yZXF1ZXN0X3JlZ2lvbihwYXJlbnQsIHN0YXJ0LCBuLCBuYW1lLCAwKTsKIAlpZiAocmVzKQogCQlkZXZyZXNfYWRkKGRldiwgZHIpOwogCWVsc2UKQEAgLTg3NiwzICs4NzgsNTcgQEAKIAogCXJldHVybiBlcnI7CiB9CisKKyNpZmRlZiBDT05GSUdfU1RSSUNUX0RFVk1FTQorc3RhdGljIGludCBzdHJpY3RfaW9tZW1fY2hlY2tzID0gMTsKKyNlbHNlCitzdGF0aWMgaW50IHN0cmljdF9pb21lbV9jaGVja3M7CisjZW5kaWYKKworLyoKKyAqIGNoZWNrIGlmIGFuIGFkZHJlc3MgaXMgcmVzZXJ2ZWQgaW4gdGhlIGlvbWVtIHJlc291cmNlIHRyZWUKKyAqIHJldHVybnMgMSBpZiByZXNlcnZlZCwgMCBpZiBub3QgcmVzZXJ2ZWQuCisgKi8KK2ludCBpb21lbV9pc19leGNsdXNpdmUodTY0IGFkZHIpCit7CisJc3RydWN0IHJlc291cmNlICpwID0gJmlvbWVtX3Jlc291cmNlOworCWludCBlcnIgPSAwOworCWxvZmZfdCBsOworCWludCBzaXplID0gUEFHRV9TSVpFOworCisJaWYgKCFzdHJpY3RfaW9tZW1fY2hlY2tzKQorCQlyZXR1cm4gMDsKKworCWFkZHIgPSBhZGRyICYgUEFHRV9NQVNLOworCisJcmVhZF9sb2NrKCZyZXNvdXJjZV9sb2NrKTsKKwlmb3IgKHAgPSBwLT5jaGlsZDsgcCA7IHAgPSByX25leHQoTlVMTCwgcCwgJmwpKSB7CisJCS8qCisJCSAqIFdlIGNhbiBwcm9iYWJseSBza2lwIHRoZSByZXNvdXJjZXMgd2l0aG91dAorCQkgKiBJT1JFU09VUkNFX0lPIGF0dHJpYnV0ZT8KKwkJICovCisJCWlmIChwLT5zdGFydCA+PSBhZGRyICsgc2l6ZSkKKwkJCWJyZWFrOworCQlpZiAocC0+ZW5kIDwgYWRkcikKKwkJCWNvbnRpbnVlOworCQlpZiAocC0+ZmxhZ3MgJiBJT1JFU09VUkNFX0JVU1kgJiYKKwkJICAgICBwLT5mbGFncyAmIElPUkVTT1VSQ0VfRVhDTFVTSVZFKSB7CisJCQllcnIgPSAxOworCQkJYnJlYWs7CisJCX0KKwl9CisJcmVhZF91bmxvY2soJnJlc291cmNlX2xvY2spOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBfX2luaXQgc3RyaWN0X2lvbWVtKGNoYXIgKnN0cikKK3sKKwlpZiAoc3Ryc3RyKHN0ciwgInJlbGF4ZWQiKSkKKwkJc3RyaWN0X2lvbWVtX2NoZWNrcyA9IDA7CisJaWYgKHN0cnN0cihzdHIsICJzdHJpY3QiKSkKKwkJc3RyaWN0X2lvbWVtX2NoZWNrcyA9IDE7CisJcmV0dXJuIDE7Cit9CisKK19fc2V0dXAoImlvbWVtPSIsIHN0cmljdF9pb21lbSk7CmRpZmYgLS1naXQgYS9rZXJuZWwvc2NoZWQuYyBiL2tlcm5lbC9zY2hlZC5jCmluZGV4IDJlMzU0NWYuLjUyYmJmMWMgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9zY2hlZC5jCisrKyBiL2tlcm5lbC9zY2hlZC5jCkBAIC0xMjUsNiArMTI1LDkgQEAKIERFRklORV9UUkFDRShzY2hlZF9taWdyYXRlX3Rhc2spOwogCiAjaWZkZWYgQ09ORklHX1NNUAorCitzdGF0aWMgdm9pZCBkb3VibGVfcnFfbG9jayhzdHJ1Y3QgcnEgKnJxMSwgc3RydWN0IHJxICpycTIpOworCiAvKgogICogRGl2aWRlIGEgbG9hZCBieSBhIHNjaGVkIGdyb3VwIGNwdV9wb3dlciA6IChsb2FkIC8gc2ctPl9fY3B1X3Bvd2VyKQogICogU2luY2UgY3B1X3Bvd2VyIGlzIGEgJ2NvbnN0YW50Jywgd2UgY2FuIHVzZSBhIHJlY2lwcm9jYWwgZGl2aWRlLgpAQCAtMTMyMCw4ICsxMzIzLDggQEAKICAqIHNsaWNlIGV4cGlyeSBldGMuCiAgKi8KIAotI2RlZmluZSBXRUlHSFRfSURMRVBSSU8JCTIKLSNkZWZpbmUgV01VTFRfSURMRVBSSU8JCSgxIDw8IDMxKQorI2RlZmluZSBXRUlHSFRfSURMRVBSSU8gICAgICAgICAgICAgICAgMworI2RlZmluZSBXTVVMVF9JRExFUFJJTyAgICAgICAgIDE0MzE2NTU3NjUKIAogLyoKICAqIE5pY2UgbGV2ZWxzIGFyZSBtdWx0aXBsaWNhdGl2ZSwgd2l0aCBhIGdlbnRsZSAxMCUgY2hhbmdlIGZvciBldmVyeQpAQCAtMzcyOCw4ICszNzMxLDEzIEBACiAJCX0KIAogCQlkb3VibGVfdW5sb2NrX2JhbGFuY2UodGhpc19ycSwgYnVzaWVzdCk7CisJCS8qCisJCSAqIFNob3VsZCBub3QgY2FsbCB0dHd1IHdoaWxlIGhvbGRpbmcgYSBycS0+bG9jaworCQkgKi8KKwkJc3Bpbl91bmxvY2soJnRoaXNfcnEtPmxvY2spOwogCQlpZiAoYWN0aXZlX2JhbGFuY2UpCiAJCQl3YWtlX3VwX3Byb2Nlc3MoYnVzaWVzdC0+bWlncmF0aW9uX3RocmVhZCk7CisJCXNwaW5fbG9jaygmdGhpc19ycS0+bG9jayk7CiAKIAl9IGVsc2UKIAkJc2QtPm5yX2JhbGFuY2VfZmFpbGVkID0gMDsKQEAgLTQ0MzIsNyArNDQ0MCw3IEBACiAJLyoKIAkgKiBVbmRlcmZsb3c/CiAJICovCi0gICAgICAgaWYgKERFQlVHX0xPQ0tTX1dBUk5fT04odmFsID4gcHJlZW1wdF9jb3VudCgpIC0gKCEha2VybmVsX2xvY2tlZCgpKSkpCisJaWYgKERFQlVHX0xPQ0tTX1dBUk5fT04odmFsID4gcHJlZW1wdF9jb3VudCgpKSkKIAkJcmV0dXJuOwogCS8qCiAJICogSXMgdGhlIHNwaW5sb2NrIHBvcnRpb24gdW5kZXJmbG93aW5nPwpAQCAtNTExOCw3ICs1MTI2LDcgQEAKICAqIHN5c19zZXRwcmlvcml0eSBpcyBhIG1vcmUgZ2VuZXJpYywgYnV0IG11Y2ggc2xvd2VyIGZ1bmN0aW9uIHRoYXQKICAqIGRvZXMgc2ltaWxhciB0aGluZ3MuCiAgKi8KLWFzbWxpbmthZ2UgbG9uZyBzeXNfbmljZShpbnQgaW5jcmVtZW50KQorU1lTQ0FMTF9ERUZJTkUxKG5pY2UsIGludCwgaW5jcmVtZW50KQogewogCWxvbmcgbmljZSwgcmV0dmFsOwogCkBAIC01NDI1LDggKzU0MzMsOCBAQAogICogQHBvbGljeTogbmV3IHBvbGljeS4KICAqIEBwYXJhbTogc3RydWN0dXJlIGNvbnRhaW5pbmcgdGhlIG5ldyBSVCBwcmlvcml0eS4KICAqLwotYXNtbGlua2FnZSBsb25nCi1zeXNfc2NoZWRfc2V0c2NoZWR1bGVyKHBpZF90IHBpZCwgaW50IHBvbGljeSwgc3RydWN0IHNjaGVkX3BhcmFtIF9fdXNlciAqcGFyYW0pCitTWVNDQUxMX0RFRklORTMoc2NoZWRfc2V0c2NoZWR1bGVyLCBwaWRfdCwgcGlkLCBpbnQsIHBvbGljeSwKKwkJc3RydWN0IHNjaGVkX3BhcmFtIF9fdXNlciAqLCBwYXJhbSkKIHsKIAkvKiBuZWdhdGl2ZSB2YWx1ZXMgZm9yIHBvbGljeSBhcmUgbm90IHZhbGlkICovCiAJaWYgKHBvbGljeSA8IDApCkBAIC01NDQwLDcgKzU0NDgsNyBAQAogICogQHBpZDogdGhlIHBpZCBpbiBxdWVzdGlvbi4KICAqIEBwYXJhbTogc3RydWN0dXJlIGNvbnRhaW5pbmcgdGhlIG5ldyBSVCBwcmlvcml0eS4KICAqLwotYXNtbGlua2FnZSBsb25nIHN5c19zY2hlZF9zZXRwYXJhbShwaWRfdCBwaWQsIHN0cnVjdCBzY2hlZF9wYXJhbSBfX3VzZXIgKnBhcmFtKQorU1lTQ0FMTF9ERUZJTkUyKHNjaGVkX3NldHBhcmFtLCBwaWRfdCwgcGlkLCBzdHJ1Y3Qgc2NoZWRfcGFyYW0gX191c2VyICosIHBhcmFtKQogewogCXJldHVybiBkb19zY2hlZF9zZXRzY2hlZHVsZXIocGlkLCAtMSwgcGFyYW0pOwogfQpAQCAtNTQ0OSw3ICs1NDU3LDcgQEAKICAqIHN5c19zY2hlZF9nZXRzY2hlZHVsZXIgLSBnZXQgdGhlIHBvbGljeSAoc2NoZWR1bGluZyBjbGFzcykgb2YgYSB0aHJlYWQKICAqIEBwaWQ6IHRoZSBwaWQgaW4gcXVlc3Rpb24uCiAgKi8KLWFzbWxpbmthZ2UgbG9uZyBzeXNfc2NoZWRfZ2V0c2NoZWR1bGVyKHBpZF90IHBpZCkKK1NZU0NBTExfREVGSU5FMShzY2hlZF9nZXRzY2hlZHVsZXIsIHBpZF90LCBwaWQpCiB7CiAJc3RydWN0IHRhc2tfc3RydWN0ICpwOwogCWludCByZXR2YWw7CkBAIC01NDc0LDcgKzU0ODIsNyBAQAogICogQHBpZDogdGhlIHBpZCBpbiBxdWVzdGlvbi4KICAqIEBwYXJhbTogc3RydWN0dXJlIGNvbnRhaW5pbmcgdGhlIFJUIHByaW9yaXR5LgogICovCi1hc21saW5rYWdlIGxvbmcgc3lzX3NjaGVkX2dldHBhcmFtKHBpZF90IHBpZCwgc3RydWN0IHNjaGVkX3BhcmFtIF9fdXNlciAqcGFyYW0pCitTWVNDQUxMX0RFRklORTIoc2NoZWRfZ2V0cGFyYW0sIHBpZF90LCBwaWQsIHN0cnVjdCBzY2hlZF9wYXJhbSBfX3VzZXIgKiwgcGFyYW0pCiB7CiAJc3RydWN0IHNjaGVkX3BhcmFtIGxwOwogCXN0cnVjdCB0YXNrX3N0cnVjdCAqcDsKQEAgLTU1OTIsOCArNTYwMCw4IEBACiAgKiBAbGVuOiBsZW5ndGggaW4gYnl0ZXMgb2YgdGhlIGJpdG1hc2sgcG9pbnRlZCB0byBieSB1c2VyX21hc2tfcHRyCiAgKiBAdXNlcl9tYXNrX3B0cjogdXNlci1zcGFjZSBwb2ludGVyIHRvIHRoZSBuZXcgY3B1IG1hc2sKICAqLwotYXNtbGlua2FnZSBsb25nIHN5c19zY2hlZF9zZXRhZmZpbml0eShwaWRfdCBwaWQsIHVuc2lnbmVkIGludCBsZW4sCi0JCQkJICAgICAgdW5zaWduZWQgbG9uZyBfX3VzZXIgKnVzZXJfbWFza19wdHIpCitTWVNDQUxMX0RFRklORTMoc2NoZWRfc2V0YWZmaW5pdHksIHBpZF90LCBwaWQsIHVuc2lnbmVkIGludCwgbGVuLAorCQl1bnNpZ25lZCBsb25nIF9fdXNlciAqLCB1c2VyX21hc2tfcHRyKQogewogCWNwdW1hc2tfdmFyX3QgbmV3X21hc2s7CiAJaW50IHJldHZhbDsKQEAgLTU2NDAsOCArNTY0OCw4IEBACiAgKiBAbGVuOiBsZW5ndGggaW4gYnl0ZXMgb2YgdGhlIGJpdG1hc2sgcG9pbnRlZCB0byBieSB1c2VyX21hc2tfcHRyCiAgKiBAdXNlcl9tYXNrX3B0cjogdXNlci1zcGFjZSBwb2ludGVyIHRvIGhvbGQgdGhlIGN1cnJlbnQgY3B1IG1hc2sKICAqLwotYXNtbGlua2FnZSBsb25nIHN5c19zY2hlZF9nZXRhZmZpbml0eShwaWRfdCBwaWQsIHVuc2lnbmVkIGludCBsZW4sCi0JCQkJICAgICAgdW5zaWduZWQgbG9uZyBfX3VzZXIgKnVzZXJfbWFza19wdHIpCitTWVNDQUxMX0RFRklORTMoc2NoZWRfZ2V0YWZmaW5pdHksIHBpZF90LCBwaWQsIHVuc2lnbmVkIGludCwgbGVuLAorCQl1bnNpZ25lZCBsb25nIF9fdXNlciAqLCB1c2VyX21hc2tfcHRyKQogewogCWludCByZXQ7CiAJY3B1bWFza192YXJfdCBtYXNrOwpAQCAtNTY3MCw3ICs1Njc4LDcgQEAKICAqIFRoaXMgZnVuY3Rpb24geWllbGRzIHRoZSBjdXJyZW50IENQVSB0byBvdGhlciB0YXNrcy4gSWYgdGhlcmUgYXJlIG5vCiAgKiBvdGhlciB0aHJlYWRzIHJ1bm5pbmcgb24gdGhpcyBDUFUgdGhlbiB0aGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJuLgogICovCi1hc21saW5rYWdlIGxvbmcgc3lzX3NjaGVkX3lpZWxkKHZvaWQpCitTWVNDQUxMX0RFRklORTAoc2NoZWRfeWllbGQpCiB7CiAJc3RydWN0IHJxICpycSA9IHRoaXNfcnFfbG9jaygpOwogCkBAIC01ODExLDcgKzU4MTksNyBAQAogICogdGhpcyBzeXNjYWxsIHJldHVybnMgdGhlIG1heGltdW0gcnRfcHJpb3JpdHkgdGhhdCBjYW4gYmUgdXNlZAogICogYnkgYSBnaXZlbiBzY2hlZHVsaW5nIGNsYXNzLgogICovCi1hc21saW5rYWdlIGxvbmcgc3lzX3NjaGVkX2dldF9wcmlvcml0eV9tYXgoaW50IHBvbGljeSkKK1NZU0NBTExfREVGSU5FMShzY2hlZF9nZXRfcHJpb3JpdHlfbWF4LCBpbnQsIHBvbGljeSkKIHsKIAlpbnQgcmV0ID0gLUVJTlZBTDsKIApAQCAtNTgzNiw3ICs1ODQ0LDcgQEAKICAqIHRoaXMgc3lzY2FsbCByZXR1cm5zIHRoZSBtaW5pbXVtIHJ0X3ByaW9yaXR5IHRoYXQgY2FuIGJlIHVzZWQKICAqIGJ5IGEgZ2l2ZW4gc2NoZWR1bGluZyBjbGFzcy4KICAqLwotYXNtbGlua2FnZSBsb25nIHN5c19zY2hlZF9nZXRfcHJpb3JpdHlfbWluKGludCBwb2xpY3kpCitTWVNDQUxMX0RFRklORTEoc2NoZWRfZ2V0X3ByaW9yaXR5X21pbiwgaW50LCBwb2xpY3kpCiB7CiAJaW50IHJldCA9IC1FSU5WQUw7CiAKQEAgLTU4NjEsOCArNTg2OSw4IEBACiAgKiB0aGlzIHN5c2NhbGwgd3JpdGVzIHRoZSBkZWZhdWx0IHRpbWVzbGljZSB2YWx1ZSBvZiBhIGdpdmVuIHByb2Nlc3MKICAqIGludG8gdGhlIHVzZXItc3BhY2UgdGltZXNwZWMgYnVmZmVyLiBBIHZhbHVlIG9mICcwJyBtZWFucyBpbmZpbml0eS4KICAqLwotYXNtbGlua2FnZQotbG9uZyBzeXNfc2NoZWRfcnJfZ2V0X2ludGVydmFsKHBpZF90IHBpZCwgc3RydWN0IHRpbWVzcGVjIF9fdXNlciAqaW50ZXJ2YWwpCitTWVNDQUxMX0RFRklORTIoc2NoZWRfcnJfZ2V0X2ludGVydmFsLCBwaWRfdCwgcGlkLAorCQlzdHJ1Y3QgdGltZXNwZWMgX191c2VyICosIGludGVydmFsKQogewogCXN0cnVjdCB0YXNrX3N0cnVjdCAqcDsKIAl1bnNpZ25lZCBpbnQgdGltZV9zbGljZTsKQEAgLTcyNzcsMTAgKzcyODUsMTAgQEAKICAqIGdyb3Vwcywgc28gcm9sbCBvdXIgb3duLiBOb3cgZWFjaCBub2RlIGhhcyBpdHMgb3duIGxpc3Qgb2YgZ3JvdXBzIHdoaWNoCiAgKiBnZXRzIGR5bmFtaWNhbGx5IGFsbG9jYXRlZC4KICAqLwotc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCBzY2hlZF9kb21haW4sIG5vZGVfZG9tYWlucyk7CitzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IHN0YXRpY19zY2hlZF9kb21haW4sIG5vZGVfZG9tYWlucyk7CiBzdGF0aWMgc3RydWN0IHNjaGVkX2dyb3VwICoqKnNjaGVkX2dyb3VwX25vZGVzX2J5Y3B1OwogCi1zdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IHNjaGVkX2RvbWFpbiwgYWxsbm9kZXNfZG9tYWlucyk7CitzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IHN0YXRpY19zY2hlZF9kb21haW4sIGFsbG5vZGVzX2RvbWFpbnMpOwogc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCBzdGF0aWNfc2NoZWRfZ3JvdXAsIHNjaGVkX2dyb3VwX2FsbG5vZGVzKTsKIAogc3RhdGljIGludCBjcHVfdG9fYWxsbm9kZXNfZ3JvdXAoaW50IGNwdSwgY29uc3Qgc3RydWN0IGNwdW1hc2sgKmNwdV9tYXAsCkBAIC03NTU1LDcgKzc1NjMsNyBAQAogI2lmZGVmIENPTkZJR19OVU1BCiAJCWlmIChjcHVtYXNrX3dlaWdodChjcHVfbWFwKSA+CiAJCQkJU0RfTk9ERVNfUEVSX0RPTUFJTipjcHVtYXNrX3dlaWdodChub2RlbWFzaykpIHsKLQkJCXNkID0gJnBlcl9jcHUoYWxsbm9kZXNfZG9tYWlucywgaSk7CisJCQlzZCA9ICZwZXJfY3B1KGFsbG5vZGVzX2RvbWFpbnMsIGkpLnNkOwogCQkJU0RfSU5JVChzZCwgQUxMTk9ERVMpOwogCQkJc2V0X2RvbWFpbl9hdHRyaWJ1dGUoc2QsIGF0dHIpOwogCQkJY3B1bWFza19jb3B5KHNjaGVkX2RvbWFpbl9zcGFuKHNkKSwgY3B1X21hcCk7CkBAIC03NTY1LDcgKzc1NzMsNyBAQAogCQl9IGVsc2UKIAkJCXAgPSBOVUxMOwogCi0JCXNkID0gJnBlcl9jcHUobm9kZV9kb21haW5zLCBpKTsKKwkJc2QgPSAmcGVyX2NwdShub2RlX2RvbWFpbnMsIGkpLnNkOwogCQlTRF9JTklUKHNkLCBOT0RFKTsKIAkJc2V0X2RvbWFpbl9hdHRyaWJ1dGUoc2QsIGF0dHIpOwogCQlzY2hlZF9kb21haW5fbm9kZV9zcGFuKGNwdV90b19ub2RlKGkpLCBzY2hlZF9kb21haW5fc3BhbihzZCkpOwpAQCAtNzY4Myw3ICs3NjkxLDcgQEAKIAkJZm9yX2VhY2hfY3B1KGosIG5vZGVtYXNrKSB7CiAJCQlzdHJ1Y3Qgc2NoZWRfZG9tYWluICpzZDsKIAotCQkJc2QgPSAmcGVyX2NwdShub2RlX2RvbWFpbnMsIGopOworCQkJc2QgPSAmcGVyX2NwdShub2RlX2RvbWFpbnMsIGopLnNkOwogCQkJc2QtPmdyb3VwcyA9IHNnOwogCQl9CiAJCXNnLT5fX2NwdV9wb3dlciA9IDA7CkBAIC05MDQyLDYgKzkwNTAsMTMgQEAKIAkJcnVudGltZSA9IGQtPnJ0X3J1bnRpbWU7CiAJfQogCisjaWZkZWYgQ09ORklHX1VTRVJfU0NIRUQKKwlpZiAodGcgPT0gJnJvb3RfdGFza19ncm91cCkgeworCQlwZXJpb2QgPSBnbG9iYWxfcnRfcGVyaW9kKCk7CisJCXJ1bnRpbWUgPSBnbG9iYWxfcnRfcnVudGltZSgpOworCX0KKyNlbmRpZgorCiAJLyoKIAkgKiBDYW5ub3QgaGF2ZSBtb3JlIHJ1bnRpbWUgdGhhbiB0aGUgcGVyaW9kLgogCSAqLwpkaWZmIC0tZ2l0IGEva2VybmVsL3NjaGVkX2RlYnVnLmMgYi9rZXJuZWwvc2NoZWRfZGVidWcuYwppbmRleCA0MjkzY2ZhLi4xNmVlYmE0ZSAxMDA2NDQKLS0tIGEva2VybmVsL3NjaGVkX2RlYnVnLmMKKysrIGIva2VybmVsL3NjaGVkX2RlYnVnLmMKQEAgLTE0NSw2ICsxNDUsMTkgQEAKIAlyZWFkX3VubG9ja19pcnFyZXN0b3JlKCZ0YXNrbGlzdF9sb2NrLCBmbGFncyk7CiB9CiAKKyNpZiBkZWZpbmVkKENPTkZJR19DR1JPVVBfU0NIRUQpICYmIFwKKwkoZGVmaW5lZChDT05GSUdfRkFJUl9HUk9VUF9TQ0hFRCkgfHwgZGVmaW5lZChDT05GSUdfUlRfR1JPVVBfU0NIRUQpKQorc3RhdGljIHZvaWQgdGFza19ncm91cF9wYXRoKHN0cnVjdCB0YXNrX2dyb3VwICp0ZywgY2hhciAqYnVmLCBpbnQgYnVmbGVuKQoreworCS8qIG1heSBiZSBOVUxMIGlmIHRoZSB1bmRlcmx5aW5nIGNncm91cCBpc24ndCBmdWxseS1jcmVhdGVkIHlldCAqLworCWlmICghdGctPmNzcy5jZ3JvdXApIHsKKwkJYnVmWzBdID0gJ1wwJzsKKwkJcmV0dXJuOworCX0KKwljZ3JvdXBfcGF0aCh0Zy0+Y3NzLmNncm91cCwgYnVmLCBidWZsZW4pOworfQorI2VuZGlmCisKIHZvaWQgcHJpbnRfY2ZzX3JxKHN0cnVjdCBzZXFfZmlsZSAqbSwgaW50IGNwdSwgc3RydWN0IGNmc19ycSAqY2ZzX3JxKQogewogCXM2NCBNSU5fdnJ1bnRpbWUgPSAtMSwgbWluX3ZydW50aW1lLCBtYXhfdnJ1bnRpbWUgPSAtMSwKQEAgLTE1NCwxMCArMTY3LDEwIEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogI2lmIGRlZmluZWQoQ09ORklHX0NHUk9VUF9TQ0hFRCkgJiYgZGVmaW5lZChDT05GSUdfRkFJUl9HUk9VUF9TQ0hFRCkKLQljaGFyIHBhdGhbMTI4XSA9ICIiOworCWNoYXIgcGF0aFsxMjhdOwogCXN0cnVjdCB0YXNrX2dyb3VwICp0ZyA9IGNmc19ycS0+dGc7CiAKLQljZ3JvdXBfcGF0aCh0Zy0+Y3NzLmNncm91cCwgcGF0aCwgc2l6ZW9mKHBhdGgpKTsKKwl0YXNrX2dyb3VwX3BhdGgodGcsIHBhdGgsIHNpemVvZihwYXRoKSk7CiAKIAlTRVFfcHJpbnRmKG0sICJcbmNmc19ycVslZF06JXNcbiIsIGNwdSwgcGF0aCk7CiAjZWxpZiBkZWZpbmVkKENPTkZJR19VU0VSX1NDSEVEKSAmJiBkZWZpbmVkKENPTkZJR19GQUlSX0dST1VQX1NDSEVEKQpAQCAtMjA4LDEwICsyMjEsMTAgQEAKIHZvaWQgcHJpbnRfcnRfcnEoc3RydWN0IHNlcV9maWxlICptLCBpbnQgY3B1LCBzdHJ1Y3QgcnRfcnEgKnJ0X3JxKQogewogI2lmIGRlZmluZWQoQ09ORklHX0NHUk9VUF9TQ0hFRCkgJiYgZGVmaW5lZChDT05GSUdfUlRfR1JPVVBfU0NIRUQpCi0JY2hhciBwYXRoWzEyOF0gPSAiIjsKKwljaGFyIHBhdGhbMTI4XTsKIAlzdHJ1Y3QgdGFza19ncm91cCAqdGcgPSBydF9ycS0+dGc7CiAKLQljZ3JvdXBfcGF0aCh0Zy0+Y3NzLmNncm91cCwgcGF0aCwgc2l6ZW9mKHBhdGgpKTsKKwl0YXNrX2dyb3VwX3BhdGgodGcsIHBhdGgsIHNpemVvZihwYXRoKSk7CiAKIAlTRVFfcHJpbnRmKG0sICJcbnJ0X3JxWyVkXTolc1xuIiwgY3B1LCBwYXRoKTsKICNlbHNlCmRpZmYgLS1naXQgYS9rZXJuZWwvc2NoZWRfZmFpci5jIGIva2VybmVsL3NjaGVkX2ZhaXIuYwppbmRleCBlMGMwYjRiLi41Y2MxYzE2IDEwMDY0NAotLS0gYS9rZXJuZWwvc2NoZWRfZmFpci5jCisrKyBiL2tlcm5lbC9zY2hlZF9mYWlyLmMKQEAgLTI4Myw3ICsyODMsNyBAQAogCQkJCQkJICAgc3RydWN0IHNjaGVkX2VudGl0eSwKIAkJCQkJCSAgIHJ1bl9ub2RlKTsKIAotCQlpZiAodnJ1bnRpbWUgPT0gY2ZzX3JxLT5taW5fdnJ1bnRpbWUpCisJCWlmICghY2ZzX3JxLT5jdXJyKQogCQkJdnJ1bnRpbWUgPSBzZS0+dnJ1bnRpbWU7CiAJCWVsc2UKIAkJCXZydW50aW1lID0gbWluX3ZydW50aW1lKHZydW50aW1lLCBzZS0+dnJ1bnRpbWUpOwpAQCAtNDI5LDcgKzQyOSwxMCBAQAogCXU2NCBzbGljZSA9IF9fc2NoZWRfcGVyaW9kKGNmc19ycS0+bnJfcnVubmluZyArICFzZS0+b25fcnEpOwogCiAJZm9yX2VhY2hfc2NoZWRfZW50aXR5KHNlKSB7Ci0JCXN0cnVjdCBsb2FkX3dlaWdodCAqbG9hZCA9ICZjZnNfcnEtPmxvYWQ7CisJCXN0cnVjdCBsb2FkX3dlaWdodCAqbG9hZDsKKworCQljZnNfcnEgPSBjZnNfcnFfb2Yoc2UpOworCQlsb2FkID0gJmNmc19ycS0+bG9hZDsKIAogCQlpZiAodW5saWtlbHkoIXNlLT5vbl9ycSkpIHsKIAkJCXN0cnVjdCBsb2FkX3dlaWdodCBsdyA9IGNmc19ycS0+bG9hZDsKQEAgLTY3Nyw5ICs2ODAsMTMgQEAKIAkJCXVuc2lnbmVkIGxvbmcgdGhyZXNoID0gc3lzY3RsX3NjaGVkX2xhdGVuY3k7CiAKIAkJCS8qCi0JCQkgKiBjb252ZXJ0IHRoZSBzbGVlcGVyIHRocmVzaG9sZCBpbnRvIHZpcnR1YWwgdGltZQorCQkJICogQ29udmVydCB0aGUgc2xlZXBlciB0aHJlc2hvbGQgaW50byB2aXJ0dWFsIHRpbWUuCisJCQkgKiBTQ0hFRF9JRExFIGlzIGEgc3BlY2lhbCBzdWItY2xhc3MuICBXZSBjYXJlIGFib3V0CisJCQkgKiBmYWlybmVzcyBvbmx5IHJlbGF0aXZlIHRvIG90aGVyIFNDSEVEX0lETEUgdGFza3MsCisJCQkgKiBhbGwgb2Ygd2hpY2ggaGF2ZSB0aGUgc2FtZSB3ZWlnaHQuCiAJCQkgKi8KLQkJCWlmIChzY2hlZF9mZWF0KE5PUk1BTElaRURfU0xFRVBFUikpCisJCQlpZiAoc2NoZWRfZmVhdChOT1JNQUxJWkVEX1NMRUVQRVIpICYmCisJCQkJCXRhc2tfb2Yoc2UpLT5wb2xpY3kgIT0gU0NIRURfSURMRSkKIAkJCQl0aHJlc2ggPSBjYWxjX2RlbHRhX2ZhaXIodGhyZXNoLCBzZSk7CiAKIAkJCXZydW50aW1lIC09IHRocmVzaDsKQEAgLTEzNDAsMTQgKzEzNDcsMTggQEAKIAogc3RhdGljIHZvaWQgc2V0X2xhc3RfYnVkZHkoc3RydWN0IHNjaGVkX2VudGl0eSAqc2UpCiB7Ci0JZm9yX2VhY2hfc2NoZWRfZW50aXR5KHNlKQotCQljZnNfcnFfb2Yoc2UpLT5sYXN0ID0gc2U7CisJaWYgKGxpa2VseSh0YXNrX29mKHNlKS0+cG9saWN5ICE9IFNDSEVEX0lETEUpKSB7CisJCWZvcl9lYWNoX3NjaGVkX2VudGl0eShzZSkKKwkJCWNmc19ycV9vZihzZSktPmxhc3QgPSBzZTsKKwl9CiB9CiAKIHN0YXRpYyB2b2lkIHNldF9uZXh0X2J1ZGR5KHN0cnVjdCBzY2hlZF9lbnRpdHkgKnNlKQogewotCWZvcl9lYWNoX3NjaGVkX2VudGl0eShzZSkKLQkJY2ZzX3JxX29mKHNlKS0+bmV4dCA9IHNlOworCWlmIChsaWtlbHkodGFza19vZihzZSktPnBvbGljeSAhPSBTQ0hFRF9JRExFKSkgeworCQlmb3JfZWFjaF9zY2hlZF9lbnRpdHkoc2UpCisJCQljZnNfcnFfb2Yoc2UpLT5uZXh0ID0gc2U7CisJfQogfQogCiAvKgpAQCAtMTM5MywxMiArMTQwNCwxOCBAQAogCQlyZXR1cm47CiAKIAkvKgotCSAqIEJhdGNoIHRhc2tzIGRvIG5vdCBwcmVlbXB0ICh0aGVpciBwcmVlbXB0aW9uIGlzIGRyaXZlbiBieQorCSAqIEJhdGNoIGFuZCBpZGxlIHRhc2tzIGRvIG5vdCBwcmVlbXB0ICh0aGVpciBwcmVlbXB0aW9uIGlzIGRyaXZlbiBieQogCSAqIHRoZSB0aWNrKToKIAkgKi8KLQlpZiAodW5saWtlbHkocC0+cG9saWN5ID09IFNDSEVEX0JBVENIKSkKKwlpZiAodW5saWtlbHkocC0+cG9saWN5ICE9IFNDSEVEX05PUk1BTCkpCiAJCXJldHVybjsKIAorCS8qIElkbGUgdGFza3MgYXJlIGJ5IGRlZmluaXRpb24gcHJlZW1wdGVkIGJ5IGV2ZXJ5Ym9keS4gKi8KKwlpZiAodW5saWtlbHkoY3Vyci0+cG9saWN5ID09IFNDSEVEX0lETEUpKSB7CisJCXJlc2NoZWRfdGFzayhjdXJyKTsKKwkJcmV0dXJuOworCX0KKwogCWlmICghc2NoZWRfZmVhdChXQUtFVVBfUFJFRU1QVCkpCiAJCXJldHVybjsKIApAQCAtMTYxNyw4ICsxNjM0LDYgQEAKIAl9CiB9CiAKLSNkZWZpbmUgc3dhcChhLCBiKSBkbyB7IHR5cGVvZihhKSB0bXAgPSAoYSk7IChhKSA9IChiKTsgKGIpID0gdG1wOyB9IHdoaWxlICgwKQotCiAvKgogICogU2hhcmUgdGhlIGZhaXJuZXNzIHJ1bnRpbWUgYmV0d2VlbiBwYXJlbnQgYW5kIGNoaWxkLCB0aHVzIHRoZQogICogdG90YWwgYW1vdW50IG9mIHByZXNzdXJlIGZvciBDUFUgc3RheXMgZXF1YWwgLSBuZXcgdGFza3MKZGlmZiAtLWdpdCBhL2tlcm5lbC9zaWduYWwuYyBiL2tlcm5lbC9zaWduYWwuYwppbmRleCAzMTUyYWMzLi5lNzM3NTk3IDEwMDY0NAotLS0gYS9rZXJuZWwvc2lnbmFsLmMKKysrIGIva2VybmVsL3NpZ25hbC5jCkBAIC0xOTYxLDcgKzE5NjEsNyBAQAogICogU3lzdGVtIGNhbGwgZW50cnkgcG9pbnRzLgogICovCiAKLWFzbWxpbmthZ2UgbG9uZyBzeXNfcmVzdGFydF9zeXNjYWxsKHZvaWQpCitTWVNDQUxMX0RFRklORTAocmVzdGFydF9zeXNjYWxsKQogewogCXN0cnVjdCByZXN0YXJ0X2Jsb2NrICpyZXN0YXJ0ID0gJmN1cnJlbnRfdGhyZWFkX2luZm8oKS0+cmVzdGFydF9ibG9jazsKIAlyZXR1cm4gcmVzdGFydC0+Zm4ocmVzdGFydCk7CkBAIC0yMDE0LDggKzIwMTQsOCBAQAogCXJldHVybiBlcnJvcjsKIH0KIAotYXNtbGlua2FnZSBsb25nCi1zeXNfcnRfc2lncHJvY21hc2soaW50IGhvdywgc2lnc2V0X3QgX191c2VyICpzZXQsIHNpZ3NldF90IF9fdXNlciAqb3NldCwgc2l6ZV90IHNpZ3NldHNpemUpCitTWVNDQUxMX0RFRklORTQocnRfc2lncHJvY21hc2ssIGludCwgaG93LCBzaWdzZXRfdCBfX3VzZXIgKiwgc2V0LAorCQlzaWdzZXRfdCBfX3VzZXIgKiwgb3NldCwgc2l6ZV90LCBzaWdzZXRzaXplKQogewogCWludCBlcnJvciA9IC1FSU5WQUw7CiAJc2lnc2V0X3Qgb2xkX3NldCwgbmV3X3NldDsKQEAgLTIwNzQsOCArMjA3NCw3IEBACiAJcmV0dXJuIGVycm9yOwogfQkKIAotYXNtbGlua2FnZSBsb25nCi1zeXNfcnRfc2lncGVuZGluZyhzaWdzZXRfdCBfX3VzZXIgKnNldCwgc2l6ZV90IHNpZ3NldHNpemUpCitTWVNDQUxMX0RFRklORTIocnRfc2lncGVuZGluZywgc2lnc2V0X3QgX191c2VyICosIHNldCwgc2l6ZV90LCBzaWdzZXRzaXplKQogewogCXJldHVybiBkb19zaWdwZW5kaW5nKHNldCwgc2lnc2V0c2l6ZSk7CiB9CkBAIC0yMTQ2LDExICsyMTQ1LDkgQEAKIAogI2VuZGlmCiAKLWFzbWxpbmthZ2UgbG9uZwotc3lzX3J0X3NpZ3RpbWVkd2FpdChjb25zdCBzaWdzZXRfdCBfX3VzZXIgKnV0aGVzZSwKLQkJICAgIHNpZ2luZm9fdCBfX3VzZXIgKnVpbmZvLAotCQkgICAgY29uc3Qgc3RydWN0IHRpbWVzcGVjIF9fdXNlciAqdXRzLAotCQkgICAgc2l6ZV90IHNpZ3NldHNpemUpCitTWVNDQUxMX0RFRklORTQocnRfc2lndGltZWR3YWl0LCBjb25zdCBzaWdzZXRfdCBfX3VzZXIgKiwgdXRoZXNlLAorCQlzaWdpbmZvX3QgX191c2VyICosIHVpbmZvLCBjb25zdCBzdHJ1Y3QgdGltZXNwZWMgX191c2VyICosIHV0cywKKwkJc2l6ZV90LCBzaWdzZXRzaXplKQogewogCWludCByZXQsIHNpZzsKIAlzaWdzZXRfdCB0aGVzZTsKQEAgLTIyMjMsOCArMjIyMCw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotYXNtbGlua2FnZSBsb25nCi1zeXNfa2lsbChwaWRfdCBwaWQsIGludCBzaWcpCitTWVNDQUxMX0RFRklORTIoa2lsbCwgcGlkX3QsIHBpZCwgaW50LCBzaWcpCiB7CiAJc3RydWN0IHNpZ2luZm8gaW5mbzsKIApAQCAtMjI4Myw3ICsyMjc5LDcgQEAKICAqICBleGlzdHMgYnV0IGl0J3Mgbm90IGJlbG9uZ2luZyB0byB0aGUgdGFyZ2V0IHByb2Nlc3MgYW55bW9yZS4gVGhpcwogICogIG1ldGhvZCBzb2x2ZXMgdGhlIHByb2JsZW0gb2YgdGhyZWFkcyBleGl0aW5nIGFuZCBQSURzIGdldHRpbmcgcmV1c2VkLgogICovCi1hc21saW5rYWdlIGxvbmcgc3lzX3Rna2lsbChwaWRfdCB0Z2lkLCBwaWRfdCBwaWQsIGludCBzaWcpCitTWVNDQUxMX0RFRklORTModGdraWxsLCBwaWRfdCwgdGdpZCwgcGlkX3QsIHBpZCwgaW50LCBzaWcpCiB7CiAJLyogVGhpcyBpcyBvbmx5IHZhbGlkIGZvciBzaW5nbGUgdGFza3MgKi8KIAlpZiAocGlkIDw9IDAgfHwgdGdpZCA8PSAwKQpAQCAtMjI5NSw4ICsyMjkxLDcgQEAKIC8qCiAgKiAgU2VuZCBhIHNpZ25hbCB0byBvbmx5IG9uZSB0YXNrLCBldmVuIGlmIGl0J3MgYSBDTE9ORV9USFJFQUQgdGFzay4KICAqLwotYXNtbGlua2FnZSBsb25nCi1zeXNfdGtpbGwocGlkX3QgcGlkLCBpbnQgc2lnKQorU1lTQ0FMTF9ERUZJTkUyKHRraWxsLCBwaWRfdCwgcGlkLCBpbnQsIHNpZykKIHsKIAkvKiBUaGlzIGlzIG9ubHkgdmFsaWQgZm9yIHNpbmdsZSB0YXNrcyAqLwogCWlmIChwaWQgPD0gMCkKQEAgLTIzMDUsOCArMjMwMCw4IEBACiAJcmV0dXJuIGRvX3RraWxsKDAsIHBpZCwgc2lnKTsKIH0KIAotYXNtbGlua2FnZSBsb25nCi1zeXNfcnRfc2lncXVldWVpbmZvKHBpZF90IHBpZCwgaW50IHNpZywgc2lnaW5mb190IF9fdXNlciAqdWluZm8pCitTWVNDQUxMX0RFRklORTMocnRfc2lncXVldWVpbmZvLCBwaWRfdCwgcGlkLCBpbnQsIHNpZywKKwkJc2lnaW5mb190IF9fdXNlciAqLCB1aW5mbykKIHsKIAlzaWdpbmZvX3QgaW5mbzsKIApAQCAtMjQzNCw4ICsyNDI5LDcgQEAKIAogI2lmZGVmIF9fQVJDSF9XQU5UX1NZU19TSUdQRU5ESU5HCiAKLWFzbWxpbmthZ2UgbG9uZwotc3lzX3NpZ3BlbmRpbmcob2xkX3NpZ3NldF90IF9fdXNlciAqc2V0KQorU1lTQ0FMTF9ERUZJTkUxKHNpZ3BlbmRpbmcsIG9sZF9zaWdzZXRfdCBfX3VzZXIgKiwgc2V0KQogewogCXJldHVybiBkb19zaWdwZW5kaW5nKHNldCwgc2l6ZW9mKCpzZXQpKTsKIH0KQEAgLTI0NDYsOCArMjQ0MCw4IEBACiAvKiBTb21lIHBsYXRmb3JtcyBoYXZlIHRoZWlyIG93biB2ZXJzaW9uIHdpdGggc3BlY2lhbCBhcmd1bWVudHMgb3RoZXJzCiAgICBzdXBwb3J0IG9ubHkgc3lzX3J0X3NpZ3Byb2NtYXNrLiAgKi8KIAotYXNtbGlua2FnZSBsb25nCi1zeXNfc2lncHJvY21hc2soaW50IGhvdywgb2xkX3NpZ3NldF90IF9fdXNlciAqc2V0LCBvbGRfc2lnc2V0X3QgX191c2VyICpvc2V0KQorU1lTQ0FMTF9ERUZJTkUzKHNpZ3Byb2NtYXNrLCBpbnQsIGhvdywgb2xkX3NpZ3NldF90IF9fdXNlciAqLCBzZXQsCisJCW9sZF9zaWdzZXRfdCBfX3VzZXIgKiwgb3NldCkKIHsKIAlpbnQgZXJyb3I7CiAJb2xkX3NpZ3NldF90IG9sZF9zZXQsIG5ld19zZXQ7CkBAIC0yNDk3LDExICsyNDkxLDEwIEBACiAjZW5kaWYgLyogX19BUkNIX1dBTlRfU1lTX1NJR1BST0NNQVNLICovCiAKICNpZmRlZiBfX0FSQ0hfV0FOVF9TWVNfUlRfU0lHQUNUSU9OCi1hc21saW5rYWdlIGxvbmcKLXN5c19ydF9zaWdhY3Rpb24oaW50IHNpZywKLQkJIGNvbnN0IHN0cnVjdCBzaWdhY3Rpb24gX191c2VyICphY3QsCi0JCSBzdHJ1Y3Qgc2lnYWN0aW9uIF9fdXNlciAqb2FjdCwKLQkJIHNpemVfdCBzaWdzZXRzaXplKQorU1lTQ0FMTF9ERUZJTkU0KHJ0X3NpZ2FjdGlvbiwgaW50LCBzaWcsCisJCWNvbnN0IHN0cnVjdCBzaWdhY3Rpb24gX191c2VyICosIGFjdCwKKwkJc3RydWN0IHNpZ2FjdGlvbiBfX3VzZXIgKiwgb2FjdCwKKwkJc2l6ZV90LCBzaWdzZXRzaXplKQogewogCXN0cnVjdCBrX3NpZ2FjdGlvbiBuZXdfc2EsIG9sZF9zYTsKIAlpbnQgcmV0ID0gLUVJTlZBTDsKQEAgLTI1MzEsMTUgKzI1MjQsMTMgQEAKIC8qCiAgKiBGb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuICBGdW5jdGlvbmFsaXR5IHN1cGVyc2VkZWQgYnkgc2lncHJvY21hc2suCiAgKi8KLWFzbWxpbmthZ2UgbG9uZwotc3lzX3NnZXRtYXNrKHZvaWQpCitTWVNDQUxMX0RFRklORTAoc2dldG1hc2spCiB7CiAJLyogU01QIHNhZmUgKi8KIAlyZXR1cm4gY3VycmVudC0+YmxvY2tlZC5zaWdbMF07CiB9CiAKLWFzbWxpbmthZ2UgbG9uZwotc3lzX3NzZXRtYXNrKGludCBuZXdtYXNrKQorU1lTQ0FMTF9ERUZJTkUxKHNzZXRtYXNrLCBpbnQsIG5ld21hc2spCiB7CiAJaW50IG9sZDsKIApAQCAtMjU1OSw4ICsyNTUwLDcgQEAKIC8qCiAgKiBGb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuICBGdW5jdGlvbmFsaXR5IHN1cGVyc2VkZWQgYnkgc2lnYWN0aW9uLgogICovCi1hc21saW5rYWdlIHVuc2lnbmVkIGxvbmcKLXN5c19zaWduYWwoaW50IHNpZywgX19zaWdoYW5kbGVyX3QgaGFuZGxlcikKK1NZU0NBTExfREVGSU5FMihzaWduYWwsIGludCwgc2lnLCBfX3NpZ2hhbmRsZXJfdCwgaGFuZGxlcikKIHsKIAlzdHJ1Y3Qga19zaWdhY3Rpb24gbmV3X3NhLCBvbGRfc2E7CiAJaW50IHJldDsKQEAgLTI1NzcsOCArMjU2Nyw3IEBACiAKICNpZmRlZiBfX0FSQ0hfV0FOVF9TWVNfUEFVU0UKIAotYXNtbGlua2FnZSBsb25nCi1zeXNfcGF1c2Uodm9pZCkKK1NZU0NBTExfREVGSU5FMChwYXVzZSkKIHsKIAljdXJyZW50LT5zdGF0ZSA9IFRBU0tfSU5URVJSVVBUSUJMRTsKIAlzY2hlZHVsZSgpOwpAQCAtMjU4OCw3ICsyNTc3LDcgQEAKICNlbmRpZgogCiAjaWZkZWYgX19BUkNIX1dBTlRfU1lTX1JUX1NJR1NVU1BFTkQKLWFzbWxpbmthZ2UgbG9uZyBzeXNfcnRfc2lnc3VzcGVuZChzaWdzZXRfdCBfX3VzZXIgKnVuZXdzZXQsIHNpemVfdCBzaWdzZXRzaXplKQorU1lTQ0FMTF9ERUZJTkUyKHJ0X3NpZ3N1c3BlbmQsIHNpZ3NldF90IF9fdXNlciAqLCB1bmV3c2V0LCBzaXplX3QsIHNpZ3NldHNpemUpCiB7CiAJc2lnc2V0X3QgbmV3c2V0OwogCmRpZmYgLS1naXQgYS9rZXJuZWwvc3lzLmMgYi9rZXJuZWwvc3lzLmMKaW5kZXggNzYzYzNjMS4uZTdkYzBlMSAxMDA2NDQKLS0tIGEva2VybmVsL3N5cy5jCisrKyBiL2tlcm5lbC9zeXMuYwpAQCAtMTQzLDcgKzE0Myw3IEBACiAJcmV0dXJuIGVycm9yOwogfQogCi1hc21saW5rYWdlIGxvbmcgc3lzX3NldHByaW9yaXR5KGludCB3aGljaCwgaW50IHdobywgaW50IG5pY2V2YWwpCitTWVNDQUxMX0RFRklORTMoc2V0cHJpb3JpdHksIGludCwgd2hpY2gsIGludCwgd2hvLCBpbnQsIG5pY2V2YWwpCiB7CiAJc3RydWN0IHRhc2tfc3RydWN0ICpnLCAqcDsKIAlzdHJ1Y3QgdXNlcl9zdHJ1Y3QgKnVzZXI7CkBAIC0yMDgsNyArMjA4LDcgQEAKICAqIGhhcyBiZWVuIG9mZnNldCBieSAyMCAoaWUgaXQgcmV0dXJucyA0MC4uMSBpbnN0ZWFkIG9mIC0yMC4uMTkpCiAgKiB0byBzdGF5IGNvbXBhdGlibGUuCiAgKi8KLWFzbWxpbmthZ2UgbG9uZyBzeXNfZ2V0cHJpb3JpdHkoaW50IHdoaWNoLCBpbnQgd2hvKQorU1lTQ0FMTF9ERUZJTkUyKGdldHByaW9yaXR5LCBpbnQsIHdoaWNoLCBpbnQsIHdobykKIHsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKmcsICpwOwogCXN0cnVjdCB1c2VyX3N0cnVjdCAqdXNlcjsKQEAgLTM1NSw3ICszNTUsOCBAQAogICoKICAqIHJlYm9vdCBkb2Vzbid0IHN5bmM6IGRvIHRoYXQgeW91cnNlbGYgYmVmb3JlIGNhbGxpbmcgdGhpcy4KICAqLwotYXNtbGlua2FnZSBsb25nIHN5c19yZWJvb3QoaW50IG1hZ2ljMSwgaW50IG1hZ2ljMiwgdW5zaWduZWQgaW50IGNtZCwgdm9pZCBfX3VzZXIgKiBhcmcpCitTWVNDQUxMX0RFRklORTQocmVib290LCBpbnQsIG1hZ2ljMSwgaW50LCBtYWdpYzIsIHVuc2lnbmVkIGludCwgY21kLAorCQl2b2lkIF9fdXNlciAqLCBhcmcpCiB7CiAJY2hhciBidWZmZXJbMjU2XTsKIApAQCAtNDc4LDcgKzQ3OSw3IEBACiAgKiBTTVA6IFRoZXJlIGFyZSBub3QgcmFjZXMsIHRoZSBHSURzIGFyZSBjaGVja2VkIG9ubHkgYnkgZmlsZXN5c3RlbQogICogICAgICBvcGVyYXRpb25zIChhcyBmYXIgYXMgc2VtYW50aWMgcHJlc2VydmF0aW9uIGlzIGNvbmNlcm5lZCkuCiAgKi8KLWFzbWxpbmthZ2UgbG9uZyBzeXNfc2V0cmVnaWQoZ2lkX3QgcmdpZCwgZ2lkX3QgZWdpZCkKK1NZU0NBTExfREVGSU5FMihzZXRyZWdpZCwgZ2lkX3QsIHJnaWQsIGdpZF90LCBlZ2lkKQogewogCWNvbnN0IHN0cnVjdCBjcmVkICpvbGQ7CiAJc3RydWN0IGNyZWQgKm5ldzsKQEAgLTUyOSw3ICs1MzAsNyBAQAogICoKICAqIFNNUDogU2FtZSBpbXBsaWNpdCByYWNlcyBhcyBhYm92ZS4KICAqLwotYXNtbGlua2FnZSBsb25nIHN5c19zZXRnaWQoZ2lkX3QgZ2lkKQorU1lTQ0FMTF9ERUZJTkUxKHNldGdpZCwgZ2lkX3QsIGdpZCkKIHsKIAljb25zdCBzdHJ1Y3QgY3JlZCAqb2xkOwogCXN0cnVjdCBjcmVkICpuZXc7CkBAIC01OTcsNyArNTk4LDcgQEAKICAqIDEwMCUgY29tcGF0aWJsZSB3aXRoIEJTRC4gIEEgcHJvZ3JhbSB3aGljaCB1c2VzIGp1c3Qgc2V0dWlkKCkgd2lsbCBiZQogICogMTAwJSBjb21wYXRpYmxlIHdpdGggUE9TSVggd2l0aCBzYXZlZCBJRHMuIAogICovCi1hc21saW5rYWdlIGxvbmcgc3lzX3NldHJldWlkKHVpZF90IHJ1aWQsIHVpZF90IGV1aWQpCitTWVNDQUxMX0RFRklORTIoc2V0cmV1aWQsIHVpZF90LCBydWlkLCB1aWRfdCwgZXVpZCkKIHsKIAljb25zdCBzdHJ1Y3QgY3JlZCAqb2xkOwogCXN0cnVjdCBjcmVkICpuZXc7CkBAIC02NjEsNyArNjYyLDcgQEAKICAqIHdpbGwgYWxsb3cgYSByb290IHByb2dyYW0gdG8gdGVtcG9yYXJpbHkgZHJvcCBwcml2aWxlZ2VzIGFuZCBiZSBhYmxlIHRvCiAgKiByZWdhaW4gdGhlbSBieSBzd2FwcGluZyB0aGUgcmVhbCBhbmQgZWZmZWN0aXZlIHVpZC4gIAogICovCi1hc21saW5rYWdlIGxvbmcgc3lzX3NldHVpZCh1aWRfdCB1aWQpCitTWVNDQUxMX0RFRklORTEoc2V0dWlkLCB1aWRfdCwgdWlkKQogewogCWNvbnN0IHN0cnVjdCBjcmVkICpvbGQ7CiAJc3RydWN0IGNyZWQgKm5ldzsKQEAgLTcwNSw3ICs3MDYsNyBAQAogICogVGhpcyBmdW5jdGlvbiBpbXBsZW1lbnRzIGEgZ2VuZXJpYyBhYmlsaXR5IHRvIHVwZGF0ZSBydWlkLCBldWlkLAogICogYW5kIHN1aWQuICBUaGlzIGFsbG93cyB5b3UgdG8gaW1wbGVtZW50IHRoZSA0LjQgY29tcGF0aWJsZSBzZXRldWlkKCkuCiAgKi8KLWFzbWxpbmthZ2UgbG9uZyBzeXNfc2V0cmVzdWlkKHVpZF90IHJ1aWQsIHVpZF90IGV1aWQsIHVpZF90IHN1aWQpCitTWVNDQUxMX0RFRklORTMoc2V0cmVzdWlkLCB1aWRfdCwgcnVpZCwgdWlkX3QsIGV1aWQsIHVpZF90LCBzdWlkKQogewogCWNvbnN0IHN0cnVjdCBjcmVkICpvbGQ7CiAJc3RydWN0IGNyZWQgKm5ldzsKQEAgLTc1Niw3ICs3NTcsNyBAQAogCXJldHVybiByZXR2YWw7CiB9CiAKLWFzbWxpbmthZ2UgbG9uZyBzeXNfZ2V0cmVzdWlkKHVpZF90IF9fdXNlciAqcnVpZCwgdWlkX3QgX191c2VyICpldWlkLCB1aWRfdCBfX3VzZXIgKnN1aWQpCitTWVNDQUxMX0RFRklORTMoZ2V0cmVzdWlkLCB1aWRfdCBfX3VzZXIgKiwgcnVpZCwgdWlkX3QgX191c2VyICosIGV1aWQsIHVpZF90IF9fdXNlciAqLCBzdWlkKQogewogCWNvbnN0IHN0cnVjdCBjcmVkICpjcmVkID0gY3VycmVudF9jcmVkKCk7CiAJaW50IHJldHZhbDsKQEAgLTc3MSw3ICs3NzIsNyBAQAogLyoKICAqIFNhbWUgYXMgYWJvdmUsIGJ1dCBmb3IgcmdpZCwgZWdpZCwgc2dpZC4KICAqLwotYXNtbGlua2FnZSBsb25nIHN5c19zZXRyZXNnaWQoZ2lkX3QgcmdpZCwgZ2lkX3QgZWdpZCwgZ2lkX3Qgc2dpZCkKK1NZU0NBTExfREVGSU5FMyhzZXRyZXNnaWQsIGdpZF90LCByZ2lkLCBnaWRfdCwgZWdpZCwgZ2lkX3QsIHNnaWQpCiB7CiAJY29uc3Qgc3RydWN0IGNyZWQgKm9sZDsKIAlzdHJ1Y3QgY3JlZCAqbmV3OwpAQCAtODE0LDcgKzgxNSw3IEBACiAJcmV0dXJuIHJldHZhbDsKIH0KIAotYXNtbGlua2FnZSBsb25nIHN5c19nZXRyZXNnaWQoZ2lkX3QgX191c2VyICpyZ2lkLCBnaWRfdCBfX3VzZXIgKmVnaWQsIGdpZF90IF9fdXNlciAqc2dpZCkKK1NZU0NBTExfREVGSU5FMyhnZXRyZXNnaWQsIGdpZF90IF9fdXNlciAqLCByZ2lkLCBnaWRfdCBfX3VzZXIgKiwgZWdpZCwgZ2lkX3QgX191c2VyICosIHNnaWQpCiB7CiAJY29uc3Qgc3RydWN0IGNyZWQgKmNyZWQgPSBjdXJyZW50X2NyZWQoKTsKIAlpbnQgcmV0dmFsOwpAQCAtODMzLDcgKzgzNCw3IEBACiAgKiB3aGF0ZXZlciB1aWQgaXQgd2FudHMgdG8pLiBJdCBub3JtYWxseSBzaGFkb3dzICJldWlkIiwgZXhjZXB0IHdoZW4KICAqIGV4cGxpY2l0bHkgc2V0IGJ5IHNldGZzdWlkKCkgb3IgZm9yIGFjY2Vzcy4uCiAgKi8KLWFzbWxpbmthZ2UgbG9uZyBzeXNfc2V0ZnN1aWQodWlkX3QgdWlkKQorU1lTQ0FMTF9ERUZJTkUxKHNldGZzdWlkLCB1aWRfdCwgdWlkKQogewogCWNvbnN0IHN0cnVjdCBjcmVkICpvbGQ7CiAJc3RydWN0IGNyZWQgKm5ldzsKQEAgLTg3MCw3ICs4NzEsNyBAQAogLyoKICAqIFNhbW1hIHDDpSBzdmVuc2thLi4KICAqLwotYXNtbGlua2FnZSBsb25nIHN5c19zZXRmc2dpZChnaWRfdCBnaWQpCitTWVNDQUxMX0RFRklORTEoc2V0ZnNnaWQsIGdpZF90LCBnaWQpCiB7CiAJY29uc3Qgc3RydWN0IGNyZWQgKm9sZDsKIAlzdHJ1Y3QgY3JlZCAqbmV3OwpAQCAtOTE5LDcgKzkyMCw3IEBACiAJdG1zLT50bXNfY3N0aW1lID0gY3B1dGltZV90b19jbG9ja190KGNzdGltZSk7CiB9CiAKLWFzbWxpbmthZ2UgbG9uZyBzeXNfdGltZXMoc3RydWN0IHRtcyBfX3VzZXIgKiB0YnVmKQorU1lTQ0FMTF9ERUZJTkUxKHRpbWVzLCBzdHJ1Y3QgdG1zIF9fdXNlciAqLCB0YnVmKQogewogCWlmICh0YnVmKSB7CiAJCXN0cnVjdCB0bXMgdG1wOwpAQCAtOTQ0LDcgKzk0NSw3IEBACiAgKiBBdWNoLiBIYWQgdG8gYWRkIHRoZSAnZGlkX2V4ZWMnIGZsYWcgdG8gY29uZm9ybSBjb21wbGV0ZWx5IHRvIFBPU0lYLgogICogTEJUIDA0LjAzLjk0CiAgKi8KLWFzbWxpbmthZ2UgbG9uZyBzeXNfc2V0cGdpZChwaWRfdCBwaWQsIHBpZF90IHBnaWQpCitTWVNDQUxMX0RFRklORTIoc2V0cGdpZCwgcGlkX3QsIHBpZCwgcGlkX3QsIHBnaWQpCiB7CiAJc3RydWN0IHRhc2tfc3RydWN0ICpwOwogCXN0cnVjdCB0YXNrX3N0cnVjdCAqZ3JvdXBfbGVhZGVyID0gY3VycmVudC0+Z3JvdXBfbGVhZGVyOwpAQCAtMTAxNSw3ICsxMDE2LDcgQEAKIAlyZXR1cm4gZXJyOwogfQogCi1hc21saW5rYWdlIGxvbmcgc3lzX2dldHBnaWQocGlkX3QgcGlkKQorU1lTQ0FMTF9ERUZJTkUxKGdldHBnaWQsIHBpZF90LCBwaWQpCiB7CiAJc3RydWN0IHRhc2tfc3RydWN0ICpwOwogCXN0cnVjdCBwaWQgKmdycDsKQEAgLTEwNDUsMTQgKzEwNDYsMTQgQEAKIAogI2lmZGVmIF9fQVJDSF9XQU5UX1NZU19HRVRQR1JQCiAKLWFzbWxpbmthZ2UgbG9uZyBzeXNfZ2V0cGdycCh2b2lkKQorU1lTQ0FMTF9ERUZJTkUwKGdldHBncnApCiB7CiAJcmV0dXJuIHN5c19nZXRwZ2lkKDApOwogfQogCiAjZW5kaWYKIAotYXNtbGlua2FnZSBsb25nIHN5c19nZXRzaWQocGlkX3QgcGlkKQorU1lTQ0FMTF9ERUZJTkUxKGdldHNpZCwgcGlkX3QsIHBpZCkKIHsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnA7CiAJc3RydWN0IHBpZCAqc2lkOwpAQCAtMTA4MCw3ICsxMDgxLDcgQEAKIAlyZXR1cm4gcmV0dmFsOwogfQogCi1hc21saW5rYWdlIGxvbmcgc3lzX3NldHNpZCh2b2lkKQorU1lTQ0FMTF9ERUZJTkUwKHNldHNpZCkKIHsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKmdyb3VwX2xlYWRlciA9IGN1cnJlbnQtPmdyb3VwX2xlYWRlcjsKIAlzdHJ1Y3QgcGlkICpzaWQgPSB0YXNrX3BpZChncm91cF9sZWFkZXIpOwpAQCAtMTMxMSw3ICsxMzEyLDcgQEAKIAogRVhQT1JUX1NZTUJPTChzZXRfY3VycmVudF9ncm91cHMpOwogCi1hc21saW5rYWdlIGxvbmcgc3lzX2dldGdyb3VwcyhpbnQgZ2lkc2V0c2l6ZSwgZ2lkX3QgX191c2VyICpncm91cGxpc3QpCitTWVNDQUxMX0RFRklORTIoZ2V0Z3JvdXBzLCBpbnQsIGdpZHNldHNpemUsIGdpZF90IF9fdXNlciAqLCBncm91cGxpc3QpCiB7CiAJY29uc3Qgc3RydWN0IGNyZWQgKmNyZWQgPSBjdXJyZW50X2NyZWQoKTsKIAlpbnQgaTsKQEAgLTEzNDAsNyArMTM0MSw3IEBACiAgKgl3aXRob3V0IGFub3RoZXIgdGFzayBpbnRlcmZlcmluZy4KICAqLwogIAotYXNtbGlua2FnZSBsb25nIHN5c19zZXRncm91cHMoaW50IGdpZHNldHNpemUsIGdpZF90IF9fdXNlciAqZ3JvdXBsaXN0KQorU1lTQ0FMTF9ERUZJTkUyKHNldGdyb3VwcywgaW50LCBnaWRzZXRzaXplLCBnaWRfdCBfX3VzZXIgKiwgZ3JvdXBsaXN0KQogewogCXN0cnVjdCBncm91cF9pbmZvICpncm91cF9pbmZvOwogCWludCByZXR2YWw7CkBAIC0xMzk0LDcgKzEzOTUsNyBAQAogCiBERUNMQVJFX1JXU0VNKHV0c19zZW0pOwogCi1hc21saW5rYWdlIGxvbmcgc3lzX25ld3VuYW1lKHN0cnVjdCBuZXdfdXRzbmFtZSBfX3VzZXIgKiBuYW1lKQorU1lTQ0FMTF9ERUZJTkUxKG5ld3VuYW1lLCBzdHJ1Y3QgbmV3X3V0c25hbWUgX191c2VyICosIG5hbWUpCiB7CiAJaW50IGVycm5vID0gMDsKIApAQCAtMTQwNSw3ICsxNDA2LDcgQEAKIAlyZXR1cm4gZXJybm87CiB9CiAKLWFzbWxpbmthZ2UgbG9uZyBzeXNfc2V0aG9zdG5hbWUoY2hhciBfX3VzZXIgKm5hbWUsIGludCBsZW4pCitTWVNDQUxMX0RFRklORTIoc2V0aG9zdG5hbWUsIGNoYXIgX191c2VyICosIG5hbWUsIGludCwgbGVuKQogewogCWludCBlcnJubzsKIAljaGFyIHRtcFtfX05FV19VVFNfTEVOXTsKQEAgLTE0MjksNyArMTQzMCw3IEBACiAKICNpZmRlZiBfX0FSQ0hfV0FOVF9TWVNfR0VUSE9TVE5BTUUKIAotYXNtbGlua2FnZSBsb25nIHN5c19nZXRob3N0bmFtZShjaGFyIF9fdXNlciAqbmFtZSwgaW50IGxlbikKK1NZU0NBTExfREVGSU5FMihnZXRob3N0bmFtZSwgY2hhciBfX3VzZXIgKiwgbmFtZSwgaW50LCBsZW4pCiB7CiAJaW50IGksIGVycm5vOwogCXN0cnVjdCBuZXdfdXRzbmFtZSAqdTsKQEAgLTE0NTQsNyArMTQ1NSw3IEBACiAgKiBPbmx5IHNldGRvbWFpbm5hbWU7IGdldGRvbWFpbm5hbWUgY2FuIGJlIGltcGxlbWVudGVkIGJ5IGNhbGxpbmcKICAqIHVuYW1lKCkKICAqLwotYXNtbGlua2FnZSBsb25nIHN5c19zZXRkb21haW5uYW1lKGNoYXIgX191c2VyICpuYW1lLCBpbnQgbGVuKQorU1lTQ0FMTF9ERUZJTkUyKHNldGRvbWFpbm5hbWUsIGNoYXIgX191c2VyICosIG5hbWUsIGludCwgbGVuKQogewogCWludCBlcnJubzsKIAljaGFyIHRtcFtfX05FV19VVFNfTEVOXTsKQEAgLTE0NzcsNyArMTQ3OCw3IEBACiAJcmV0dXJuIGVycm5vOwogfQogCi1hc21saW5rYWdlIGxvbmcgc3lzX2dldHJsaW1pdCh1bnNpZ25lZCBpbnQgcmVzb3VyY2UsIHN0cnVjdCBybGltaXQgX191c2VyICpybGltKQorU1lTQ0FMTF9ERUZJTkUyKGdldHJsaW1pdCwgdW5zaWduZWQgaW50LCByZXNvdXJjZSwgc3RydWN0IHJsaW1pdCBfX3VzZXIgKiwgcmxpbSkKIHsKIAlpZiAocmVzb3VyY2UgPj0gUkxJTV9OTElNSVRTKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTE0OTYsNyArMTQ5Nyw4IEBACiAgKglCYWNrIGNvbXBhdGliaWxpdHkgZm9yIGdldHJsaW1pdC4gTmVlZGVkIGZvciBzb21lIGFwcHMuCiAgKi8KICAKLWFzbWxpbmthZ2UgbG9uZyBzeXNfb2xkX2dldHJsaW1pdCh1bnNpZ25lZCBpbnQgcmVzb3VyY2UsIHN0cnVjdCBybGltaXQgX191c2VyICpybGltKQorU1lTQ0FMTF9ERUZJTkUyKG9sZF9nZXRybGltaXQsIHVuc2lnbmVkIGludCwgcmVzb3VyY2UsCisJCXN0cnVjdCBybGltaXQgX191c2VyICosIHJsaW0pCiB7CiAJc3RydWN0IHJsaW1pdCB4OwogCWlmIChyZXNvdXJjZSA+PSBSTElNX05MSU1JVFMpCkBAIC0xNTE0LDcgKzE1MTYsNyBAQAogCiAjZW5kaWYKIAotYXNtbGlua2FnZSBsb25nIHN5c19zZXRybGltaXQodW5zaWduZWQgaW50IHJlc291cmNlLCBzdHJ1Y3QgcmxpbWl0IF9fdXNlciAqcmxpbSkKK1NZU0NBTExfREVGSU5FMihzZXRybGltaXQsIHVuc2lnbmVkIGludCwgcmVzb3VyY2UsIHN0cnVjdCBybGltaXQgX191c2VyICosIHJsaW0pCiB7CiAJc3RydWN0IHJsaW1pdCBuZXdfcmxpbSwgKm9sZF9ybGltOwogCWludCByZXR2YWw7CkBAIC0xNjg3LDcgKzE2ODksNyBAQAogCXJldHVybiBjb3B5X3RvX3VzZXIocnUsICZyLCBzaXplb2YocikpID8gLUVGQVVMVCA6IDA7CiB9CiAKLWFzbWxpbmthZ2UgbG9uZyBzeXNfZ2V0cnVzYWdlKGludCB3aG8sIHN0cnVjdCBydXNhZ2UgX191c2VyICpydSkKK1NZU0NBTExfREVGSU5FMihnZXRydXNhZ2UsIGludCwgd2hvLCBzdHJ1Y3QgcnVzYWdlIF9fdXNlciAqLCBydSkKIHsKIAlpZiAod2hvICE9IFJVU0FHRV9TRUxGICYmIHdobyAhPSBSVVNBR0VfQ0hJTERSRU4gJiYKIAkgICAgd2hvICE9IFJVU0FHRV9USFJFQUQpCkBAIC0xNjk1LDE0ICsxNjk3LDE0IEBACiAJcmV0dXJuIGdldHJ1c2FnZShjdXJyZW50LCB3aG8sIHJ1KTsKIH0KIAotYXNtbGlua2FnZSBsb25nIHN5c191bWFzayhpbnQgbWFzaykKK1NZU0NBTExfREVGSU5FMSh1bWFzaywgaW50LCBtYXNrKQogewogCW1hc2sgPSB4Y2hnKCZjdXJyZW50LT5mcy0+dW1hc2ssIG1hc2sgJiBTX0lSV1hVR08pOwogCXJldHVybiBtYXNrOwogfQogCi1hc21saW5rYWdlIGxvbmcgc3lzX3ByY3RsKGludCBvcHRpb24sIHVuc2lnbmVkIGxvbmcgYXJnMiwgdW5zaWduZWQgbG9uZyBhcmczLAotCQkJICB1bnNpZ25lZCBsb25nIGFyZzQsIHVuc2lnbmVkIGxvbmcgYXJnNSkKK1NZU0NBTExfREVGSU5FNShwcmN0bCwgaW50LCBvcHRpb24sIHVuc2lnbmVkIGxvbmcsIGFyZzIsIHVuc2lnbmVkIGxvbmcsIGFyZzMsCisJCXVuc2lnbmVkIGxvbmcsIGFyZzQsIHVuc2lnbmVkIGxvbmcsIGFyZzUpCiB7CiAJc3RydWN0IHRhc2tfc3RydWN0ICptZSA9IGN1cnJlbnQ7CiAJdW5zaWduZWQgY2hhciBjb21tW3NpemVvZihtZS0+Y29tbSldOwpAQCAtMTgxNSw4ICsxODE3LDggQEAKIAlyZXR1cm4gZXJyb3I7CiB9CiAKLWFzbWxpbmthZ2UgbG9uZyBzeXNfZ2V0Y3B1KHVuc2lnbmVkIF9fdXNlciAqY3B1cCwgdW5zaWduZWQgX191c2VyICpub2RlcCwKLQkJCSAgIHN0cnVjdCBnZXRjcHVfY2FjaGUgX191c2VyICp1bnVzZWQpCitTWVNDQUxMX0RFRklORTMoZ2V0Y3B1LCB1bnNpZ25lZCBfX3VzZXIgKiwgY3B1cCwgdW5zaWduZWQgX191c2VyICosIG5vZGVwLAorCQlzdHJ1Y3QgZ2V0Y3B1X2NhY2hlIF9fdXNlciAqLCB1bnVzZWQpCiB7CiAJaW50IGVyciA9IDA7CiAJaW50IGNwdSA9IHJhd19zbXBfcHJvY2Vzc29yX2lkKCk7CmRpZmYgLS1naXQgYS9rZXJuZWwvc3lzX25pLmMgYi9rZXJuZWwvc3lzX25pLmMKaW5kZXggZTE0YTIzMi4uMjdkYWQyOSAxMDA2NDQKLS0tIGEva2VybmVsL3N5c19uaS5jCisrKyBiL2tlcm5lbC9zeXNfbmkuYwpAQCAtMTMxLDYgKzEzMSw3IEBACiBjb25kX3N5c2NhbGwoc3lzX2lvX3N1Ym1pdCk7CiBjb25kX3N5c2NhbGwoc3lzX2lvX2NhbmNlbCk7CiBjb25kX3N5c2NhbGwoc3lzX2lvX2dldGV2ZW50cyk7Citjb25kX3N5c2NhbGwoc3lzX3N5c2xvZyk7CiAKIC8qIGFyY2gtc3BlY2lmaWMgd2VhayBzeXNjYWxsIGVudHJpZXMgKi8KIGNvbmRfc3lzY2FsbChzeXNfcGNpY29uZmlnX3JlYWQpOwpkaWZmIC0tZ2l0IGEva2VybmVsL3N5c2N0bC5jIGIva2VybmVsL3N5c2N0bC5jCmluZGV4IDkyZjZlNWIuLjM2OGQxNjMgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9zeXNjdGwuYworKysgYi9rZXJuZWwvc3lzY3RsLmMKQEAgLTgyLDYgKzgyLDkgQEAKIGV4dGVybiBpbnQgY29tcGF0X2xvZzsKIGV4dGVybiBpbnQgbGF0ZW5jeXRvcF9lbmFibGVkOwogZXh0ZXJuIGludCBzeXNjdGxfbnJfb3Blbl9taW4sIHN5c2N0bF9ucl9vcGVuX21heDsKKyNpZm5kZWYgQ09ORklHX01NVQorZXh0ZXJuIGludCBzeXNjdGxfbnJfdHJpbV9wYWdlczsKKyNlbmRpZgogI2lmZGVmIENPTkZJR19SQ1VfVE9SVFVSRV9URVNUCiBleHRlcm4gaW50IHJjdXRvcnR1cmVfcnVubmFibGU7CiAjZW5kaWYgLyogI2lmZGVmIENPTkZJR19SQ1VfVE9SVFVSRV9URVNUICovCkBAIC0xNDEsNiArMTQ0LDcgQEAKIAogI2lmZGVmIENPTkZJR19JQTY0CiBleHRlcm4gaW50IG5vX3VuYWxpZ25lZF93YXJuaW5nOworZXh0ZXJuIGludCB1bmFsaWduZWRfZHVtcF9zdGFjazsKICNlbmRpZgogCiAjaWZkZWYgQ09ORklHX1JUX01VVEVYRVMKQEAgLTc3OCw2ICs3ODIsMTQgQEAKIAkgCS5tb2RlCQk9IDA2NDQsCiAJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlYywKIAl9LAorCXsKKwkJLmN0bF9uYW1lCT0gQ1RMX1VOTlVNQkVSRUQsCisJCS5wcm9jbmFtZQk9ICJ1bmFsaWduZWQtZHVtcC1zdGFjayIsCisJCS5kYXRhCQk9ICZ1bmFsaWduZWRfZHVtcF9zdGFjaywKKwkJLm1heGxlbgkJPSBzaXplb2YgKGludCksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlYywKKwl9LAogI2VuZGlmCiAjaWZkZWYgQ09ORklHX0RFVEVDVF9TT0ZUTE9DS1VQCiAJewpAQCAtMTEwMiw2ICsxMTE0LDE3IEBACiAJCS5tb2RlCQk9IDA2NDQsCiAJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlYwogCX0sCisjZWxzZQorCXsKKwkJLmN0bF9uYW1lCT0gQ1RMX1VOTlVNQkVSRUQsCisJCS5wcm9jbmFtZQk9ICJucl90cmltX3BhZ2VzIiwKKwkJLmRhdGEJCT0gJnN5c2N0bF9ucl90cmltX3BhZ2VzLAorCQkubWF4bGVuCQk9IHNpemVvZihzeXNjdGxfbnJfdHJpbV9wYWdlcyksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlY19taW5tYXgsCisJCS5zdHJhdGVneQk9ICZzeXNjdGxfaW50dmVjLAorCQkuZXh0cmExCQk9ICZ6ZXJvLAorCX0sCiAjZW5kaWYKIAl7CiAJCS5jdGxfbmFtZQk9IFZNX0xBUFRPUF9NT0RFLApAQCAtMTY3NCw3ICsxNjk3LDcgQEAKIAlyZXR1cm4gZXJyb3I7CiB9CiAKLWFzbWxpbmthZ2UgbG9uZyBzeXNfc3lzY3RsKHN0cnVjdCBfX3N5c2N0bF9hcmdzIF9fdXNlciAqYXJncykKK1NZU0NBTExfREVGSU5FMShzeXNjdGwsIHN0cnVjdCBfX3N5c2N0bF9hcmdzIF9fdXNlciAqLCBhcmdzKQogewogCXN0cnVjdCBfX3N5c2N0bF9hcmdzIHRtcDsKIAlpbnQgZXJyb3I7CkBAIC0yOTc1LDcgKzI5OTgsNyBAQAogI2Vsc2UgLyogQ09ORklHX1NZU0NUTF9TWVNDQUxMICovCiAKIAotYXNtbGlua2FnZSBsb25nIHN5c19zeXNjdGwoc3RydWN0IF9fc3lzY3RsX2FyZ3MgX191c2VyICphcmdzKQorU1lTQ0FMTF9ERUZJTkUxKHN5c2N0bCwgc3RydWN0IF9fc3lzY3RsX2FyZ3MgX191c2VyICosIGFyZ3MpCiB7CiAJc3RydWN0IF9fc3lzY3RsX2FyZ3MgdG1wOwogCWludCBlcnJvcjsKZGlmZiAtLWdpdCBhL2tlcm5lbC90aW1lLmMgYi9rZXJuZWwvdGltZS5jCmluZGV4IDQ4ODZlM2MuLjI5NTExOTQgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90aW1lLmMKKysrIGIva2VybmVsL3RpbWUuYwpAQCAtNjAsNyArNjAsNyBAQAogICogd2h5IG5vdCBtb3ZlIGl0IGludG8gdGhlIGFwcHJvcHJpYXRlIGFyY2ggZGlyZWN0b3J5IChmb3IgdGhvc2UKICAqIGFyY2hpdGVjdHVyZXMgdGhhdCBuZWVkIGl0KS4KICAqLwotYXNtbGlua2FnZSBsb25nIHN5c190aW1lKHRpbWVfdCBfX3VzZXIgKiB0bG9jKQorU1lTQ0FMTF9ERUZJTkUxKHRpbWUsIHRpbWVfdCBfX3VzZXIgKiwgdGxvYykKIHsKIAl0aW1lX3QgaSA9IGdldF9zZWNvbmRzKCk7CiAKQEAgLTc5LDcgKzc5LDcgQEAKICAqIGFyY2hpdGVjdHVyZXMgdGhhdCBuZWVkIGl0KS4KICAqLwogCi1hc21saW5rYWdlIGxvbmcgc3lzX3N0aW1lKHRpbWVfdCBfX3VzZXIgKnRwdHIpCitTWVNDQUxMX0RFRklORTEoc3RpbWUsIHRpbWVfdCBfX3VzZXIgKiwgdHB0cikKIHsKIAlzdHJ1Y3QgdGltZXNwZWMgdHY7CiAJaW50IGVycjsKQEAgLTk5LDggKzk5LDggQEAKIAogI2VuZGlmIC8qIF9fQVJDSF9XQU5UX1NZU19USU1FICovCiAKLWFzbWxpbmthZ2UgbG9uZyBzeXNfZ2V0dGltZW9mZGF5KHN0cnVjdCB0aW1ldmFsIF9fdXNlciAqdHYsCi0JCQkJIHN0cnVjdCB0aW1lem9uZSBfX3VzZXIgKnR6KQorU1lTQ0FMTF9ERUZJTkUyKGdldHRpbWVvZmRheSwgc3RydWN0IHRpbWV2YWwgX191c2VyICosIHR2LAorCQlzdHJ1Y3QgdGltZXpvbmUgX191c2VyICosIHR6KQogewogCWlmIChsaWtlbHkodHYgIT0gTlVMTCkpIHsKIAkJc3RydWN0IHRpbWV2YWwga3R2OwpAQCAtMTg0LDggKzE4NCw4IEBACiAJcmV0dXJuIDA7CiB9CiAKLWFzbWxpbmthZ2UgbG9uZyBzeXNfc2V0dGltZW9mZGF5KHN0cnVjdCB0aW1ldmFsIF9fdXNlciAqdHYsCi0JCQkJc3RydWN0IHRpbWV6b25lIF9fdXNlciAqdHopCitTWVNDQUxMX0RFRklORTIoc2V0dGltZW9mZGF5LCBzdHJ1Y3QgdGltZXZhbCBfX3VzZXIgKiwgdHYsCisJCXN0cnVjdCB0aW1lem9uZSBfX3VzZXIgKiwgdHopCiB7CiAJc3RydWN0IHRpbWV2YWwgdXNlcl90djsKIAlzdHJ1Y3QgdGltZXNwZWMJbmV3X3RzOwpAQCAtMjA1LDcgKzIwNSw3IEBACiAJcmV0dXJuIGRvX3N5c19zZXR0aW1lb2ZkYXkodHYgPyAmbmV3X3RzIDogTlVMTCwgdHogPyAmbmV3X3R6IDogTlVMTCk7CiB9CiAKLWFzbWxpbmthZ2UgbG9uZyBzeXNfYWRqdGltZXgoc3RydWN0IHRpbWV4IF9fdXNlciAqdHhjX3ApCitTWVNDQUxMX0RFRklORTEoYWRqdGltZXgsIHN0cnVjdCB0aW1leCBfX3VzZXIgKiwgdHhjX3ApCiB7CiAJc3RydWN0IHRpbWV4IHR4YzsJCS8qIExvY2FsIGNvcHkgb2YgcGFyYW1ldGVyICovCiAJaW50IHJldDsKZGlmZiAtLWdpdCBhL2tlcm5lbC90aW1lL2ppZmZpZXMuYyBiL2tlcm5lbC90aW1lL2ppZmZpZXMuYwppbmRleCAxY2E5OTU1Li4wNmYxOTc1IDEwMDY0NAotLS0gYS9rZXJuZWwvdGltZS9qaWZmaWVzLmMKKysrIGIva2VybmVsL3RpbWUvamlmZmllcy5jCkBAIC00NSw3ICs0NSw3IEBACiAgKgogICogVGhlIHZhbHVlIDggaXMgc29tZXdoYXQgY2FyZWZ1bGx5IGNob3NlbiwgYXMgYW55dGhpbmcKICAqIGxhcmdlciBjYW4gcmVzdWx0IGluIG92ZXJmbG93cy4gTlNFQ19QRVJfSklGRlkgZ3Jvd3MgYXMKLSAqIEhaIHNocmlua3MsIHNvIHZhbHVlcyBncmVhdGVyIHRoZW4gOCBvdmVyZmxvdyAzMmJpdHMgd2hlbgorICogSFogc2hyaW5rcywgc28gdmFsdWVzIGdyZWF0ZXIgdGhhbiA4IG92ZXJmbG93IDMyYml0cyB3aGVuCiAgKiBIWj0xMDAuCiAgKi8KICNkZWZpbmUgSklGRklFU19TSElGVAk4CmRpZmYgLS1naXQgYS9rZXJuZWwvdGltZXIuYyBiL2tlcm5lbC90aW1lci5jCmluZGV4IGRlZTNmNjQuLjEzZGQ2NGYgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90aW1lci5jCisrKyBiL2tlcm5lbC90aW1lci5jCkBAIC0xMTI5LDcgKzExMjksNyBAQAogICogRm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5PyAgVGhpcyBjYW4gYmUgZG9uZSBpbiBsaWJjIHNvIEFscGhhCiAgKiBhbmQgYWxsIG5ld2VyIHBvcnRzIHNob3VsZG4ndCBuZWVkIGl0LgogICovCi1hc21saW5rYWdlIHVuc2lnbmVkIGxvbmcgc3lzX2FsYXJtKHVuc2lnbmVkIGludCBzZWNvbmRzKQorU1lTQ0FMTF9ERUZJTkUxKGFsYXJtLCB1bnNpZ25lZCBpbnQsIHNlY29uZHMpCiB7CiAJcmV0dXJuIGFsYXJtX3NldGl0aW1lcihzZWNvbmRzKTsKIH0KQEAgLTExNTIsNyArMTE1Miw3IEBACiAgKgogICogVGhpcyBpcyBTTVAgc2FmZSBhcyBjdXJyZW50LT50Z2lkIGRvZXMgbm90IGNoYW5nZS4KICAqLwotYXNtbGlua2FnZSBsb25nIHN5c19nZXRwaWQodm9pZCkKK1NZU0NBTExfREVGSU5FMChnZXRwaWQpCiB7CiAJcmV0dXJuIHRhc2tfdGdpZF92bnIoY3VycmVudCk7CiB9CkBAIC0xMTYzLDcgKzExNjMsNyBAQAogICogdmFsdWUgb2YgLT5yZWFsX3BhcmVudCB1bmRlciByY3VfcmVhZF9sb2NrKCksIHNlZQogICogcmVsZWFzZV90YXNrKCktPmNhbGxfcmN1KGRlbGF5ZWRfcHV0X3Rhc2tfc3RydWN0KS4KICAqLwotYXNtbGlua2FnZSBsb25nIHN5c19nZXRwcGlkKHZvaWQpCitTWVNDQUxMX0RFRklORTAoZ2V0cHBpZCkKIHsKIAlpbnQgcGlkOwogCkBAIC0xMTc0LDI1ICsxMTc0LDI1IEBACiAJcmV0dXJuIHBpZDsKIH0KIAotYXNtbGlua2FnZSBsb25nIHN5c19nZXR1aWQodm9pZCkKK1NZU0NBTExfREVGSU5FMChnZXR1aWQpCiB7CiAJLyogT25seSB3ZSBjaGFuZ2UgdGhpcyBzbyBTTVAgc2FmZSAqLwogCXJldHVybiBjdXJyZW50X3VpZCgpOwogfQogCi1hc21saW5rYWdlIGxvbmcgc3lzX2dldGV1aWQodm9pZCkKK1NZU0NBTExfREVGSU5FMChnZXRldWlkKQogewogCS8qIE9ubHkgd2UgY2hhbmdlIHRoaXMgc28gU01QIHNhZmUgKi8KIAlyZXR1cm4gY3VycmVudF9ldWlkKCk7CiB9CiAKLWFzbWxpbmthZ2UgbG9uZyBzeXNfZ2V0Z2lkKHZvaWQpCitTWVNDQUxMX0RFRklORTAoZ2V0Z2lkKQogewogCS8qIE9ubHkgd2UgY2hhbmdlIHRoaXMgc28gU01QIHNhZmUgKi8KIAlyZXR1cm4gY3VycmVudF9naWQoKTsKIH0KIAotYXNtbGlua2FnZSBsb25nIHN5c19nZXRlZ2lkKHZvaWQpCitTWVNDQUxMX0RFRklORTAoZ2V0ZWdpZCkKIHsKIAkvKiBPbmx5IHdlIGNoYW5nZSB0aGlzIHNvIFNNUCBzYWZlICovCiAJcmV0dXJuICBjdXJyZW50X2VnaWQoKTsKQEAgLTEzMDgsNyArMTMwOCw3IEBACiBFWFBPUlRfU1lNQk9MKHNjaGVkdWxlX3RpbWVvdXRfdW5pbnRlcnJ1cHRpYmxlKTsKIAogLyogVGhyZWFkIElEIC0gdGhlIGludGVybmFsIGtlcm5lbCAicGlkIiAqLwotYXNtbGlua2FnZSBsb25nIHN5c19nZXR0aWQodm9pZCkKK1NZU0NBTExfREVGSU5FMChnZXR0aWQpCiB7CiAJcmV0dXJuIHRhc2tfcGlkX3ZucihjdXJyZW50KTsKIH0KQEAgLTE0MDAsNyArMTQwMCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLWFzbWxpbmthZ2UgbG9uZyBzeXNfc3lzaW5mbyhzdHJ1Y3Qgc3lzaW5mbyBfX3VzZXIgKmluZm8pCitTWVNDQUxMX0RFRklORTEoc3lzaW5mbywgc3RydWN0IHN5c2luZm8gX191c2VyICosIGluZm8pCiB7CiAJc3RydWN0IHN5c2luZm8gdmFsOwogCmRpZmYgLS1naXQgYS9rZXJuZWwvdHJhY2UvcmluZ19idWZmZXIuYyBiL2tlcm5lbC90cmFjZS9yaW5nX2J1ZmZlci5jCmluZGV4IGE5ZDk3NjAuLjhiMGRhZjAgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90cmFjZS9yaW5nX2J1ZmZlci5jCisrKyBiL2tlcm5lbC90cmFjZS9yaW5nX2J1ZmZlci5jCkBAIC0xNjgsNyArMTY4LDEzIEBACiAgKi8KIHVuc2lnbmVkIHJpbmdfYnVmZmVyX2V2ZW50X2xlbmd0aChzdHJ1Y3QgcmluZ19idWZmZXJfZXZlbnQgKmV2ZW50KQogewotCXJldHVybiByYl9ldmVudF9sZW5ndGgoZXZlbnQpOworCXVuc2lnbmVkIGxlbmd0aCA9IHJiX2V2ZW50X2xlbmd0aChldmVudCk7CisJaWYgKGV2ZW50LT50eXBlICE9IFJJTkdCVUZfVFlQRV9EQVRBKQorCQlyZXR1cm4gbGVuZ3RoOworCWxlbmd0aCAtPSBSQl9FVk5UX0hEUl9TSVpFOworCWlmIChsZW5ndGggPiBSQl9NQVhfU01BTExfREFUQSArIHNpemVvZihldmVudC0+YXJyYXlbMF0pKQorICAgICAgICAgICAgICAgIGxlbmd0aCAtPSBzaXplb2YoZXZlbnQtPmFycmF5WzBdKTsKKwlyZXR1cm4gbGVuZ3RoOwogfQogRVhQT1JUX1NZTUJPTF9HUEwocmluZ19idWZmZXJfZXZlbnRfbGVuZ3RoKTsKIApkaWZmIC0tZ2l0IGEva2VybmVsL3VpZDE2LmMgYi9rZXJuZWwvdWlkMTYuYwppbmRleCAyNDYwYzMxLi4wMzE0NTAxIDEwMDY0NAotLS0gYS9rZXJuZWwvdWlkMTYuYworKysgYi9rZXJuZWwvdWlkMTYuYwpAQCAtMTcsNyArMTcsNyBAQAogCiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KIAotYXNtbGlua2FnZSBsb25nIHN5c19jaG93bjE2KGNvbnN0IGNoYXIgX191c2VyICogZmlsZW5hbWUsIG9sZF91aWRfdCB1c2VyLCBvbGRfZ2lkX3QgZ3JvdXApCitTWVNDQUxMX0RFRklORTMoY2hvd24xNiwgY29uc3QgY2hhciBfX3VzZXIgKiwgZmlsZW5hbWUsIG9sZF91aWRfdCwgdXNlciwgb2xkX2dpZF90LCBncm91cCkKIHsKIAlsb25nIHJldCA9IHN5c19jaG93bihmaWxlbmFtZSwgbG93MmhpZ2h1aWQodXNlciksIGxvdzJoaWdoZ2lkKGdyb3VwKSk7CiAJLyogYXZvaWQgUkVHUEFSTSBicmVha2FnZSBvbiB4ODY6ICovCkBAIC0yNSw3ICsyNSw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotYXNtbGlua2FnZSBsb25nIHN5c19sY2hvd24xNihjb25zdCBjaGFyIF9fdXNlciAqIGZpbGVuYW1lLCBvbGRfdWlkX3QgdXNlciwgb2xkX2dpZF90IGdyb3VwKQorU1lTQ0FMTF9ERUZJTkUzKGxjaG93bjE2LCBjb25zdCBjaGFyIF9fdXNlciAqLCBmaWxlbmFtZSwgb2xkX3VpZF90LCB1c2VyLCBvbGRfZ2lkX3QsIGdyb3VwKQogewogCWxvbmcgcmV0ID0gc3lzX2xjaG93bihmaWxlbmFtZSwgbG93MmhpZ2h1aWQodXNlciksIGxvdzJoaWdoZ2lkKGdyb3VwKSk7CiAJLyogYXZvaWQgUkVHUEFSTSBicmVha2FnZSBvbiB4ODY6ICovCkBAIC0zMyw3ICszMyw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotYXNtbGlua2FnZSBsb25nIHN5c19mY2hvd24xNih1bnNpZ25lZCBpbnQgZmQsIG9sZF91aWRfdCB1c2VyLCBvbGRfZ2lkX3QgZ3JvdXApCitTWVNDQUxMX0RFRklORTMoZmNob3duMTYsIHVuc2lnbmVkIGludCwgZmQsIG9sZF91aWRfdCwgdXNlciwgb2xkX2dpZF90LCBncm91cCkKIHsKIAlsb25nIHJldCA9IHN5c19mY2hvd24oZmQsIGxvdzJoaWdodWlkKHVzZXIpLCBsb3cyaGlnaGdpZChncm91cCkpOwogCS8qIGF2b2lkIFJFR1BBUk0gYnJlYWthZ2Ugb24geDg2OiAqLwpAQCAtNDEsNyArNDEsNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLWFzbWxpbmthZ2UgbG9uZyBzeXNfc2V0cmVnaWQxNihvbGRfZ2lkX3QgcmdpZCwgb2xkX2dpZF90IGVnaWQpCitTWVNDQUxMX0RFRklORTIoc2V0cmVnaWQxNiwgb2xkX2dpZF90LCByZ2lkLCBvbGRfZ2lkX3QsIGVnaWQpCiB7CiAJbG9uZyByZXQgPSBzeXNfc2V0cmVnaWQobG93MmhpZ2hnaWQocmdpZCksIGxvdzJoaWdoZ2lkKGVnaWQpKTsKIAkvKiBhdm9pZCBSRUdQQVJNIGJyZWFrYWdlIG9uIHg4NjogKi8KQEAgLTQ5LDcgKzQ5LDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1hc21saW5rYWdlIGxvbmcgc3lzX3NldGdpZDE2KG9sZF9naWRfdCBnaWQpCitTWVNDQUxMX0RFRklORTEoc2V0Z2lkMTYsIG9sZF9naWRfdCwgZ2lkKQogewogCWxvbmcgcmV0ID0gc3lzX3NldGdpZChsb3cyaGlnaGdpZChnaWQpKTsKIAkvKiBhdm9pZCBSRUdQQVJNIGJyZWFrYWdlIG9uIHg4NjogKi8KQEAgLTU3LDcgKzU3LDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1hc21saW5rYWdlIGxvbmcgc3lzX3NldHJldWlkMTYob2xkX3VpZF90IHJ1aWQsIG9sZF91aWRfdCBldWlkKQorU1lTQ0FMTF9ERUZJTkUyKHNldHJldWlkMTYsIG9sZF91aWRfdCwgcnVpZCwgb2xkX3VpZF90LCBldWlkKQogewogCWxvbmcgcmV0ID0gc3lzX3NldHJldWlkKGxvdzJoaWdodWlkKHJ1aWQpLCBsb3cyaGlnaHVpZChldWlkKSk7CiAJLyogYXZvaWQgUkVHUEFSTSBicmVha2FnZSBvbiB4ODY6ICovCkBAIC02NSw3ICs2NSw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotYXNtbGlua2FnZSBsb25nIHN5c19zZXR1aWQxNihvbGRfdWlkX3QgdWlkKQorU1lTQ0FMTF9ERUZJTkUxKHNldHVpZDE2LCBvbGRfdWlkX3QsIHVpZCkKIHsKIAlsb25nIHJldCA9IHN5c19zZXR1aWQobG93MmhpZ2h1aWQodWlkKSk7CiAJLyogYXZvaWQgUkVHUEFSTSBicmVha2FnZSBvbiB4ODY6ICovCkBAIC03Myw3ICs3Myw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotYXNtbGlua2FnZSBsb25nIHN5c19zZXRyZXN1aWQxNihvbGRfdWlkX3QgcnVpZCwgb2xkX3VpZF90IGV1aWQsIG9sZF91aWRfdCBzdWlkKQorU1lTQ0FMTF9ERUZJTkUzKHNldHJlc3VpZDE2LCBvbGRfdWlkX3QsIHJ1aWQsIG9sZF91aWRfdCwgZXVpZCwgb2xkX3VpZF90LCBzdWlkKQogewogCWxvbmcgcmV0ID0gc3lzX3NldHJlc3VpZChsb3cyaGlnaHVpZChydWlkKSwgbG93MmhpZ2h1aWQoZXVpZCksCiAJCQkJIGxvdzJoaWdodWlkKHN1aWQpKTsKQEAgLTgyLDcgKzgyLDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1hc21saW5rYWdlIGxvbmcgc3lzX2dldHJlc3VpZDE2KG9sZF91aWRfdCBfX3VzZXIgKnJ1aWQsIG9sZF91aWRfdCBfX3VzZXIgKmV1aWQsIG9sZF91aWRfdCBfX3VzZXIgKnN1aWQpCitTWVNDQUxMX0RFRklORTMoZ2V0cmVzdWlkMTYsIG9sZF91aWRfdCBfX3VzZXIgKiwgcnVpZCwgb2xkX3VpZF90IF9fdXNlciAqLCBldWlkLCBvbGRfdWlkX3QgX191c2VyICosIHN1aWQpCiB7CiAJY29uc3Qgc3RydWN0IGNyZWQgKmNyZWQgPSBjdXJyZW50X2NyZWQoKTsKIAlpbnQgcmV0dmFsOwpAQCAtOTQsNyArOTQsNyBAQAogCXJldHVybiByZXR2YWw7CiB9CiAKLWFzbWxpbmthZ2UgbG9uZyBzeXNfc2V0cmVzZ2lkMTYob2xkX2dpZF90IHJnaWQsIG9sZF9naWRfdCBlZ2lkLCBvbGRfZ2lkX3Qgc2dpZCkKK1NZU0NBTExfREVGSU5FMyhzZXRyZXNnaWQxNiwgb2xkX2dpZF90LCByZ2lkLCBvbGRfZ2lkX3QsIGVnaWQsIG9sZF9naWRfdCwgc2dpZCkKIHsKIAlsb25nIHJldCA9IHN5c19zZXRyZXNnaWQobG93MmhpZ2hnaWQocmdpZCksIGxvdzJoaWdoZ2lkKGVnaWQpLAogCQkJCSBsb3cyaGlnaGdpZChzZ2lkKSk7CkBAIC0xMDMsNyArMTAzLDggQEAKIAlyZXR1cm4gcmV0OwogfQogCi1hc21saW5rYWdlIGxvbmcgc3lzX2dldHJlc2dpZDE2KG9sZF9naWRfdCBfX3VzZXIgKnJnaWQsIG9sZF9naWRfdCBfX3VzZXIgKmVnaWQsIG9sZF9naWRfdCBfX3VzZXIgKnNnaWQpCisKK1NZU0NBTExfREVGSU5FMyhnZXRyZXNnaWQxNiwgb2xkX2dpZF90IF9fdXNlciAqLCByZ2lkLCBvbGRfZ2lkX3QgX191c2VyICosIGVnaWQsIG9sZF9naWRfdCBfX3VzZXIgKiwgc2dpZCkKIHsKIAljb25zdCBzdHJ1Y3QgY3JlZCAqY3JlZCA9IGN1cnJlbnRfY3JlZCgpOwogCWludCByZXR2YWw7CkBAIC0xMTUsNyArMTE2LDcgQEAKIAlyZXR1cm4gcmV0dmFsOwogfQogCi1hc21saW5rYWdlIGxvbmcgc3lzX3NldGZzdWlkMTYob2xkX3VpZF90IHVpZCkKK1NZU0NBTExfREVGSU5FMShzZXRmc3VpZDE2LCBvbGRfdWlkX3QsIHVpZCkKIHsKIAlsb25nIHJldCA9IHN5c19zZXRmc3VpZChsb3cyaGlnaHVpZCh1aWQpKTsKIAkvKiBhdm9pZCBSRUdQQVJNIGJyZWFrYWdlIG9uIHg4NjogKi8KQEAgLTEyMyw3ICsxMjQsNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLWFzbWxpbmthZ2UgbG9uZyBzeXNfc2V0ZnNnaWQxNihvbGRfZ2lkX3QgZ2lkKQorU1lTQ0FMTF9ERUZJTkUxKHNldGZzZ2lkMTYsIG9sZF9naWRfdCwgZ2lkKQogewogCWxvbmcgcmV0ID0gc3lzX3NldGZzZ2lkKGxvdzJoaWdoZ2lkKGdpZCkpOwogCS8qIGF2b2lkIFJFR1BBUk0gYnJlYWthZ2Ugb24geDg2OiAqLwpAQCAtMTYxLDcgKzE2Miw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLWFzbWxpbmthZ2UgbG9uZyBzeXNfZ2V0Z3JvdXBzMTYoaW50IGdpZHNldHNpemUsIG9sZF9naWRfdCBfX3VzZXIgKmdyb3VwbGlzdCkKK1NZU0NBTExfREVGSU5FMihnZXRncm91cHMxNiwgaW50LCBnaWRzZXRzaXplLCBvbGRfZ2lkX3QgX191c2VyICosIGdyb3VwbGlzdCkKIHsKIAljb25zdCBzdHJ1Y3QgY3JlZCAqY3JlZCA9IGN1cnJlbnRfY3JlZCgpOwogCWludCBpOwpAQCAtMTg0LDcgKzE4NSw3IEBACiAJcmV0dXJuIGk7CiB9CiAKLWFzbWxpbmthZ2UgbG9uZyBzeXNfc2V0Z3JvdXBzMTYoaW50IGdpZHNldHNpemUsIG9sZF9naWRfdCBfX3VzZXIgKmdyb3VwbGlzdCkKK1NZU0NBTExfREVGSU5FMihzZXRncm91cHMxNiwgaW50LCBnaWRzZXRzaXplLCBvbGRfZ2lkX3QgX191c2VyICosIGdyb3VwbGlzdCkKIHsKIAlzdHJ1Y3QgZ3JvdXBfaW5mbyAqZ3JvdXBfaW5mbzsKIAlpbnQgcmV0dmFsOwpAQCAtMjA5LDIyICsyMTAsMjIgQEAKIAlyZXR1cm4gcmV0dmFsOwogfQogCi1hc21saW5rYWdlIGxvbmcgc3lzX2dldHVpZDE2KHZvaWQpCitTWVNDQUxMX0RFRklORTAoZ2V0dWlkMTYpCiB7CiAJcmV0dXJuIGhpZ2gybG93dWlkKGN1cnJlbnRfdWlkKCkpOwogfQogCi1hc21saW5rYWdlIGxvbmcgc3lzX2dldGV1aWQxNih2b2lkKQorU1lTQ0FMTF9ERUZJTkUwKGdldGV1aWQxNikKIHsKIAlyZXR1cm4gaGlnaDJsb3d1aWQoY3VycmVudF9ldWlkKCkpOwogfQogCi1hc21saW5rYWdlIGxvbmcgc3lzX2dldGdpZDE2KHZvaWQpCitTWVNDQUxMX0RFRklORTAoZ2V0Z2lkMTYpCiB7CiAJcmV0dXJuIGhpZ2gybG93Z2lkKGN1cnJlbnRfZ2lkKCkpOwogfQogCi1hc21saW5rYWdlIGxvbmcgc3lzX2dldGVnaWQxNih2b2lkKQorU1lTQ0FMTF9ERUZJTkUwKGdldGVnaWQxNikKIHsKIAlyZXR1cm4gaGlnaDJsb3dnaWQoY3VycmVudF9lZ2lkKCkpOwogfQpkaWZmIC0tZ2l0IGEva2VybmVsL3VwLmMgYi9rZXJuZWwvdXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZmYyN2EyCi0tLSAvZGV2L251bGwKKysrIGIva2VybmVsL3VwLmMKQEAgLTAsMCArMSwyMSBAQAorLyoKKyAqIFVuaXByb2Nlc3Nvci1vbmx5IHN1cHBvcnQgZnVuY3Rpb25zLiAgVGhlIGNvdW50ZXJwYXJ0IHRvIGtlcm5lbC9zbXAuYworICovCisKKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXAuaD4KKworaW50IHNtcF9jYWxsX2Z1bmN0aW9uX3NpbmdsZShpbnQgY3B1LCB2b2lkICgqZnVuYykgKHZvaWQgKmluZm8pLCB2b2lkICppbmZvLAorCQkJCWludCB3YWl0KQoreworCVdBUk5fT04oY3B1ICE9IDApOworCisJbG9jYWxfaXJxX2Rpc2FibGUoKTsKKwkoZnVuYykoaW5mbyk7CisJbG9jYWxfaXJxX2VuYWJsZSgpOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKHNtcF9jYWxsX2Z1bmN0aW9uX3NpbmdsZSk7CmRpZmYgLS1naXQgYS9saWIvS2NvbmZpZy5kZWJ1ZyBiL2xpYi9LY29uZmlnLmRlYnVnCmluZGV4IDJlNzU0NzguLjRjOWFlNjAgMTAwNjQ0Ci0tLSBhL2xpYi9LY29uZmlnLmRlYnVnCisrKyBiL2xpYi9LY29uZmlnLmRlYnVnCkBAIC01MTIsNiArNTEyLDEzIEBACiAKIAkgIElmIHVuc3VyZSwgc2F5IE4uCiAKK2NvbmZpZyBERUJVR19OT01NVV9SRUdJT05TCisJYm9vbCAiRGVidWcgdGhlIGdsb2JhbCBhbm9uL3ByaXZhdGUgTk9NTVUgbWFwcGluZyByZWdpb24gdHJlZSIKKwlkZXBlbmRzIG9uIERFQlVHX0tFUk5FTCAmJiAhTU1VCisJaGVscAorCSAgVGhpcyBvcHRpb24gY2F1c2VzIHRoZSBnbG9iYWwgdHJlZSBvZiBhbm9ueW1vdXMgYW5kIHByaXZhdGUgbWFwcGluZworCSAgcmVnaW9ucyB0byBiZSByZWd1bGFybHkgY2hlY2tlZCBmb3IgaW52YWxpZCB0b3BvbG9neS4KKwogY29uZmlnIERFQlVHX1dSSVRFQ09VTlQKIAlib29sICJEZWJ1ZyBmaWxlc3lzdGVtIHdyaXRlcnMgY291bnQiCiAJZGVwZW5kcyBvbiBERUJVR19LRVJORUwKQEAgLTU2NiwxNCArNTczLDE0IEBACiBjb25maWcgRlJBTUVfUE9JTlRFUgogCWJvb2wgIkNvbXBpbGUgdGhlIGtlcm5lbCB3aXRoIGZyYW1lIHBvaW50ZXJzIgogCWRlcGVuZHMgb24gREVCVUdfS0VSTkVMICYmIFwKLQkJKFg4NiB8fCBDUklTIHx8IE02OEsgfHwgTTY4S05PTU1VIHx8IEZSViB8fCBVTUwgfHwgUzM5MCB8fCBcCi0JCSBBVlIzMiB8fCBTVVBFUkggfHwgQkxBQ0tGSU4gfHwgTU4xMDMwMCkKLQlkZWZhdWx0IHkgaWYgREVCVUdfSU5GTyAmJiBVTUwKKwkJKENSSVMgfHwgTTY4SyB8fCBNNjhLTk9NTVUgfHwgRlJWIHx8IFVNTCB8fCBTMzkwIHx8IFwKKwkJIEFWUjMyIHx8IFNVUEVSSCB8fCBCTEFDS0ZJTiB8fCBNTjEwMzAwKSB8fCBcCisJCUFSQ0hfV0FOVF9GUkFNRV9QT0lOVEVSUworCWRlZmF1bHQgeSBpZiAoREVCVUdfSU5GTyAmJiBVTUwpIHx8IEFSQ0hfV0FOVF9GUkFNRV9QT0lOVEVSUwogCWhlbHAKLQkgIElmIHlvdSBzYXkgWSBoZXJlIHRoZSByZXN1bHRpbmcga2VybmVsIGltYWdlIHdpbGwgYmUgc2xpZ2h0bHkgbGFyZ2VyCi0JICBhbmQgc2xvd2VyLCBidXQgaXQgbWlnaHQgZ2l2ZSB2ZXJ5IHVzZWZ1bCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gb24KLQkgIHNvbWUgYXJjaGl0ZWN0dXJlcyBvciBpZiB5b3UgdXNlIGV4dGVybmFsIGRlYnVnZ2Vycy4KLQkgIElmIHlvdSBkb24ndCBkZWJ1ZyB0aGUga2VybmVsLCB5b3UgY2FuIHNheSBOLgorCSAgSWYgeW91IHNheSBZIGhlcmUgdGhlIHJlc3VsdGluZyBrZXJuZWwgaW1hZ2Ugd2lsbCBiZSBzbGlnaHRseQorCSAgbGFyZ2VyIGFuZCBzbG93ZXIsIGJ1dCBpdCBnaXZlcyB2ZXJ5IHVzZWZ1bCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24KKwkgIGluIGNhc2Ugb2Yga2VybmVsIGJ1Z3MuIChwcmVjaXNlIG9vcHNlcy9zdGFja3RyYWNlcy93YXJuaW5ncykKIAogY29uZmlnIEJPT1RfUFJJTlRLX0RFTEFZCiAJYm9vbCAiRGVsYXkgZWFjaCBib290IHByaW50ayBtZXNzYWdlIGJ5IE4gbWlsbGlzZWNvbmRzIgpkaWZmIC0tZ2l0IGEvbGliL2lkci5jIGIvbGliL2lkci5jCmluZGV4IDFjNGY5MjguLmMxMWM1NzYgMTAwNjQ0Ci0tLSBhL2xpYi9pZHIuYworKysgYi9saWIvaWRyLmMKQEAgLTEyMSw3ICsxMjEsNyBAQAogewogCXdoaWxlIChpZHAtPmlkX2ZyZWVfY250IDwgSURSX0ZSRUVfTUFYKSB7CiAJCXN0cnVjdCBpZHJfbGF5ZXIgKm5ldzsKLQkJbmV3ID0ga21lbV9jYWNoZV9hbGxvYyhpZHJfbGF5ZXJfY2FjaGUsIGdmcF9tYXNrKTsKKwkJbmV3ID0ga21lbV9jYWNoZV96YWxsb2MoaWRyX2xheWVyX2NhY2hlLCBnZnBfbWFzayk7CiAJCWlmIChuZXcgPT0gTlVMTCkKIAkJCXJldHVybiAoMCk7CiAJCW1vdmVfdG9fZnJlZV9saXN0KGlkcCwgbmV3KTsKQEAgLTI5Miw3ICsyOTIsNyBAQAogICogYW5kIGdvIGJhY2sgdG8gdGhlIGlkcl9wcmVfZ2V0KCkgY2FsbC4gIElmIHRoZSBpZHIgaXMgZnVsbCwgaXQgd2lsbAogICogcmV0dXJuIC1FTk9TUEMuCiAgKgotICogQGlkIHJldHVybnMgYSB2YWx1ZSBpbiB0aGUgcmFuZ2UgMCAuLi4gMHg3ZmZmZmZmZgorICogQGlkIHJldHVybnMgYSB2YWx1ZSBpbiB0aGUgcmFuZ2UgQHN0YXJ0aW5nX2lkIC4uLiAweDdmZmZmZmZmCiAgKi8KIGludCBpZHJfZ2V0X25ld19hYm92ZShzdHJ1Y3QgaWRyICppZHAsIHZvaWQgKnB0ciwgaW50IHN0YXJ0aW5nX2lkLCBpbnQgKmlkKQogewpAQCAtNjIzLDE2ICs2MjMsMTAgQEAKIH0KIEVYUE9SVF9TWU1CT0woaWRyX3JlcGxhY2UpOwogCi1zdGF0aWMgdm9pZCBpZHJfY2FjaGVfY3Rvcih2b2lkICppZHJfbGF5ZXIpCi17Ci0JbWVtc2V0KGlkcl9sYXllciwgMCwgc2l6ZW9mKHN0cnVjdCBpZHJfbGF5ZXIpKTsKLX0KLQogdm9pZCBfX2luaXQgaWRyX2luaXRfY2FjaGUodm9pZCkKIHsKIAlpZHJfbGF5ZXJfY2FjaGUgPSBrbWVtX2NhY2hlX2NyZWF0ZSgiaWRyX2xheWVyX2NhY2hlIiwKLQkJCQlzaXplb2Yoc3RydWN0IGlkcl9sYXllciksIDAsIFNMQUJfUEFOSUMsCi0JCQkJaWRyX2NhY2hlX2N0b3IpOworCQkJCXNpemVvZihzdHJ1Y3QgaWRyX2xheWVyKSwgMCwgU0xBQl9QQU5JQywgTlVMTCk7CiB9CiAKIC8qKgpAQCAtNzIzLDcgKzcxNyw3IEBACiAgKiBhbmQgZ28gYmFjayB0byB0aGUgaWRhX3ByZV9nZXQoKSBjYWxsLiAgSWYgdGhlIGlkYSBpcyBmdWxsLCBpdCB3aWxsCiAgKiByZXR1cm4gLUVOT1NQQy4KICAqCi0gKiBAcF9pZCByZXR1cm5zIGEgdmFsdWUgaW4gdGhlIHJhbmdlIDAgLi4uIDB4N2ZmZmZmZmYuCisgKiBAcF9pZCByZXR1cm5zIGEgdmFsdWUgaW4gdGhlIHJhbmdlIEBzdGFydGluZ19pZCAuLi4gMHg3ZmZmZmZmZi4KICAqLwogaW50IGlkYV9nZXRfbmV3X2Fib3ZlKHN0cnVjdCBpZGEgKmlkYSwgaW50IHN0YXJ0aW5nX2lkLCBpbnQgKnBfaWQpCiB7CmRpZmYgLS1naXQgYS9saWIvcmFkaXgtdHJlZS5jIGIvbGliL3JhZGl4LXRyZWUuYwppbmRleCA4ZDNmYjBiLi40YmI0MmEwIDEwMDY0NAotLS0gYS9saWIvcmFkaXgtdHJlZS5jCisrKyBiL2xpYi9yYWRpeC10cmVlLmMKQEAgLTY0MCwxMyArNjQwLDE0IEBACiAgKgogICoJUmV0dXJuczogdGhlIGluZGV4IG9mIHRoZSBob2xlIGlmIGZvdW5kLCBvdGhlcndpc2UgcmV0dXJucyBhbiBpbmRleAogICoJb3V0c2lkZSBvZiB0aGUgc2V0IHNwZWNpZmllZCAoaW4gd2hpY2ggY2FzZSAncmV0dXJuIC0gaW5kZXggPj0gbWF4X3NjYW4nCi0gKgl3aWxsIGJlIHRydWUpLgorICoJd2lsbCBiZSB0cnVlKS4gSW4gcmFyZSBjYXNlcyBvZiBpbmRleCB3cmFwLWFyb3VuZCwgMCB3aWxsIGJlIHJldHVybmVkLgogICoKICAqCXJhZGl4X3RyZWVfbmV4dF9ob2xlIG1heSBiZSBjYWxsZWQgdW5kZXIgcmN1X3JlYWRfbG9jay4gSG93ZXZlciwgbGlrZQotICoJcmFkaXhfdHJlZV9nYW5nX2xvb2t1cCwgdGhpcyB3aWxsIG5vdCBhdG9taWNhbGx5IHNlYXJjaCBhIHNuYXBzaG90IG9mIHRoZQotICoJdHJlZSBhdCBhIHNpbmdsZSBwb2ludCBpbiB0aW1lLiBGb3IgZXhhbXBsZSwgaWYgYSBob2xlIGlzIGNyZWF0ZWQgYXQgaW5kZXgKLSAqCTUsIHRoZW4gc3Vic2VxdWVudGx5IGEgaG9sZSBpcyBjcmVhdGVkIGF0IGluZGV4IDEwLCByYWRpeF90cmVlX25leHRfaG9sZQotICoJY292ZXJpbmcgYm90aCBpbmRleGVzIG1heSByZXR1cm4gMTAgaWYgY2FsbGVkIHVuZGVyIHJjdV9yZWFkX2xvY2suCisgKglyYWRpeF90cmVlX2dhbmdfbG9va3VwLCB0aGlzIHdpbGwgbm90IGF0b21pY2FsbHkgc2VhcmNoIGEgc25hcHNob3Qgb2YKKyAqCXRoZSB0cmVlIGF0IGEgc2luZ2xlIHBvaW50IGluIHRpbWUuIEZvciBleGFtcGxlLCBpZiBhIGhvbGUgaXMgY3JlYXRlZAorICoJYXQgaW5kZXggNSwgdGhlbiBzdWJzZXF1ZW50bHkgYSBob2xlIGlzIGNyZWF0ZWQgYXQgaW5kZXggMTAsCisgKglyYWRpeF90cmVlX25leHRfaG9sZSBjb3ZlcmluZyBib3RoIGluZGV4ZXMgbWF5IHJldHVybiAxMCBpZiBjYWxsZWQKKyAqCXVuZGVyIHJjdV9yZWFkX2xvY2suCiAgKi8KIHVuc2lnbmVkIGxvbmcgcmFkaXhfdHJlZV9uZXh0X2hvbGUoc3RydWN0IHJhZGl4X3RyZWVfcm9vdCAqcm9vdCwKIAkJCQl1bnNpZ25lZCBsb25nIGluZGV4LCB1bnNpZ25lZCBsb25nIG1heF9zY2FuKQpkaWZmIC0tZ2l0IGEvbGliL3JidHJlZS5jIGIvbGliL3JidHJlZS5jCmluZGV4IDQ4NDk5YzIuLjk5NTZiOTk2IDEwMDY0NAotLS0gYS9saWIvcmJ0cmVlLmMKKysrIGIvbGliL3JidHJlZS5jCkBAIC0yOTIsNyArMjkyLDcgQEAKIC8qCiAgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGZpcnN0IG5vZGUgKGluIHNvcnQgb3JkZXIpIG9mIHRoZSB0cmVlLgogICovCi1zdHJ1Y3QgcmJfbm9kZSAqcmJfZmlyc3Qoc3RydWN0IHJiX3Jvb3QgKnJvb3QpCitzdHJ1Y3QgcmJfbm9kZSAqcmJfZmlyc3QoY29uc3Qgc3RydWN0IHJiX3Jvb3QgKnJvb3QpCiB7CiAJc3RydWN0IHJiX25vZGUJKm47CiAKQEAgLTMwNSw3ICszMDUsNyBAQAogfQogRVhQT1JUX1NZTUJPTChyYl9maXJzdCk7CiAKLXN0cnVjdCByYl9ub2RlICpyYl9sYXN0KHN0cnVjdCByYl9yb290ICpyb290KQorc3RydWN0IHJiX25vZGUgKnJiX2xhc3QoY29uc3Qgc3RydWN0IHJiX3Jvb3QgKnJvb3QpCiB7CiAJc3RydWN0IHJiX25vZGUJKm47CiAKQEAgLTMxOCw3ICszMTgsNyBAQAogfQogRVhQT1JUX1NZTUJPTChyYl9sYXN0KTsKIAotc3RydWN0IHJiX25vZGUgKnJiX25leHQoc3RydWN0IHJiX25vZGUgKm5vZGUpCitzdHJ1Y3QgcmJfbm9kZSAqcmJfbmV4dChjb25zdCBzdHJ1Y3QgcmJfbm9kZSAqbm9kZSkKIHsKIAlzdHJ1Y3QgcmJfbm9kZSAqcGFyZW50OwogCkBAIC0zMzEsNyArMzMxLDcgQEAKIAkJbm9kZSA9IG5vZGUtPnJiX3JpZ2h0OyAKIAkJd2hpbGUgKG5vZGUtPnJiX2xlZnQpCiAJCQlub2RlPW5vZGUtPnJiX2xlZnQ7Ci0JCXJldHVybiBub2RlOworCQlyZXR1cm4gKHN0cnVjdCByYl9ub2RlICopbm9kZTsKIAl9CiAKIAkvKiBObyByaWdodC1oYW5kIGNoaWxkcmVuLiAgRXZlcnl0aGluZyBkb3duIGFuZCBsZWZ0IGlzCkBAIC0zNDcsNyArMzQ3LDcgQEAKIH0KIEVYUE9SVF9TWU1CT0wocmJfbmV4dCk7CiAKLXN0cnVjdCByYl9ub2RlICpyYl9wcmV2KHN0cnVjdCByYl9ub2RlICpub2RlKQorc3RydWN0IHJiX25vZGUgKnJiX3ByZXYoY29uc3Qgc3RydWN0IHJiX25vZGUgKm5vZGUpCiB7CiAJc3RydWN0IHJiX25vZGUgKnBhcmVudDsKIApAQCAtMzYwLDcgKzM2MCw3IEBACiAJCW5vZGUgPSBub2RlLT5yYl9sZWZ0OyAKIAkJd2hpbGUgKG5vZGUtPnJiX3JpZ2h0KQogCQkJbm9kZT1ub2RlLT5yYl9yaWdodDsKLQkJcmV0dXJuIG5vZGU7CisJCXJldHVybiAoc3RydWN0IHJiX25vZGUgKilub2RlOwogCX0KIAogCS8qIE5vIGxlZnQtaGFuZCBjaGlsZHJlbi4gR28gdXAgdGlsbCB3ZSBmaW5kIGFuIGFuY2VzdG9yIHdoaWNoCmRpZmYgLS1naXQgYS9saWIvc29ydC5jIGIvbGliL3NvcnQuYwppbmRleCA2YWJiYWYzLi45MjZkMDA0IDEwMDY0NAotLS0gYS9saWIvc29ydC5jCisrKyBiL2xpYi9zb3J0LmMKQEAgLTMyLDExICszMiwxMSBAQAogICogQGJhc2U6IHBvaW50ZXIgdG8gZGF0YSB0byBzb3J0CiAgKiBAbnVtOiBudW1iZXIgb2YgZWxlbWVudHMKICAqIEBzaXplOiBzaXplIG9mIGVhY2ggZWxlbWVudAotICogQGNtcDogcG9pbnRlciB0byBjb21wYXJpc29uIGZ1bmN0aW9uCi0gKiBAc3dhcDogcG9pbnRlciB0byBzd2FwIGZ1bmN0aW9uIG9yIE5VTEwKKyAqIEBjbXBfZnVuYzogcG9pbnRlciB0byBjb21wYXJpc29uIGZ1bmN0aW9uCisgKiBAc3dhcF9mdW5jOiBwb2ludGVyIHRvIHN3YXAgZnVuY3Rpb24gb3IgTlVMTAogICoKICAqIFRoaXMgZnVuY3Rpb24gZG9lcyBhIGhlYXBzb3J0IG9uIHRoZSBnaXZlbiBhcnJheS4gWW91IG1heSBwcm92aWRlIGEKLSAqIHN3YXAgZnVuY3Rpb24gb3B0aW1pemVkIHRvIHlvdXIgZWxlbWVudCB0eXBlLgorICogc3dhcF9mdW5jIGZ1bmN0aW9uIG9wdGltaXplZCB0byB5b3VyIGVsZW1lbnQgdHlwZS4KICAqCiAgKiBTb3J0aW5nIHRpbWUgaXMgTyhuIGxvZyBuKSBib3RoIG9uIGF2ZXJhZ2UgYW5kIHdvcnN0LWNhc2UuIFdoaWxlCiAgKiBxc29ydCBpcyBhYm91dCAyMCUgZmFzdGVyIG9uIGF2ZXJhZ2UsIGl0IHN1ZmZlcnMgZnJvbSBleHBsb2l0YWJsZQpAQCAtNDUsMzcgKzQ1LDM5IEBACiAgKi8KIAogdm9pZCBzb3J0KHZvaWQgKmJhc2UsIHNpemVfdCBudW0sIHNpemVfdCBzaXplLAotCSAgaW50ICgqY21wKShjb25zdCB2b2lkICosIGNvbnN0IHZvaWQgKiksCi0JICB2b2lkICgqc3dhcCkodm9pZCAqLCB2b2lkICosIGludCBzaXplKSkKKwkgIGludCAoKmNtcF9mdW5jKShjb25zdCB2b2lkICosIGNvbnN0IHZvaWQgKiksCisJICB2b2lkICgqc3dhcF9mdW5jKSh2b2lkICosIHZvaWQgKiwgaW50IHNpemUpKQogewogCS8qIHByZS1zY2FsZSBjb3VudGVycyBmb3IgcGVyZm9ybWFuY2UgKi8KIAlpbnQgaSA9IChudW0vMiAtIDEpICogc2l6ZSwgbiA9IG51bSAqIHNpemUsIGMsIHI7CiAKLQlpZiAoIXN3YXApCi0JCXN3YXAgPSAoc2l6ZSA9PSA0ID8gdTMyX3N3YXAgOiBnZW5lcmljX3N3YXApOworCWlmICghc3dhcF9mdW5jKQorCQlzd2FwX2Z1bmMgPSAoc2l6ZSA9PSA0ID8gdTMyX3N3YXAgOiBnZW5lcmljX3N3YXApOwogCiAJLyogaGVhcGlmeSAqLwogCWZvciAoIDsgaSA+PSAwOyBpIC09IHNpemUpIHsKIAkJZm9yIChyID0gaTsgciAqIDIgKyBzaXplIDwgbjsgciAgPSBjKSB7CiAJCQljID0gciAqIDIgKyBzaXplOwotCQkJaWYgKGMgPCBuIC0gc2l6ZSAmJiBjbXAoYmFzZSArIGMsIGJhc2UgKyBjICsgc2l6ZSkgPCAwKQorCQkJaWYgKGMgPCBuIC0gc2l6ZSAmJgorCQkJCQljbXBfZnVuYyhiYXNlICsgYywgYmFzZSArIGMgKyBzaXplKSA8IDApCiAJCQkJYyArPSBzaXplOwotCQkJaWYgKGNtcChiYXNlICsgciwgYmFzZSArIGMpID49IDApCisJCQlpZiAoY21wX2Z1bmMoYmFzZSArIHIsIGJhc2UgKyBjKSA+PSAwKQogCQkJCWJyZWFrOwotCQkJc3dhcChiYXNlICsgciwgYmFzZSArIGMsIHNpemUpOworCQkJc3dhcF9mdW5jKGJhc2UgKyByLCBiYXNlICsgYywgc2l6ZSk7CiAJCX0KIAl9CiAKIAkvKiBzb3J0ICovCiAJZm9yIChpID0gbiAtIHNpemU7IGkgPiAwOyBpIC09IHNpemUpIHsKLQkJc3dhcChiYXNlLCBiYXNlICsgaSwgc2l6ZSk7CisJCXN3YXBfZnVuYyhiYXNlLCBiYXNlICsgaSwgc2l6ZSk7CiAJCWZvciAociA9IDA7IHIgKiAyICsgc2l6ZSA8IGk7IHIgPSBjKSB7CiAJCQljID0gciAqIDIgKyBzaXplOwotCQkJaWYgKGMgPCBpIC0gc2l6ZSAmJiBjbXAoYmFzZSArIGMsIGJhc2UgKyBjICsgc2l6ZSkgPCAwKQorCQkJaWYgKGMgPCBpIC0gc2l6ZSAmJgorCQkJCQljbXBfZnVuYyhiYXNlICsgYywgYmFzZSArIGMgKyBzaXplKSA8IDApCiAJCQkJYyArPSBzaXplOwotCQkJaWYgKGNtcChiYXNlICsgciwgYmFzZSArIGMpID49IDApCisJCQlpZiAoY21wX2Z1bmMoYmFzZSArIHIsIGJhc2UgKyBjKSA+PSAwKQogCQkJCWJyZWFrOwotCQkJc3dhcChiYXNlICsgciwgYmFzZSArIGMsIHNpemUpOworCQkJc3dhcF9mdW5jKGJhc2UgKyByLCBiYXNlICsgYywgc2l6ZSk7CiAJCX0KIAl9CiB9CmRpZmYgLS1naXQgYS9tbS9mYWR2aXNlLmMgYi9tbS9mYWR2aXNlLmMKaW5kZXggYTFkYTk2OS4uNTRhMGY4MCAxMDA2NDQKLS0tIGEvbW0vZmFkdmlzZS5jCisrKyBiL21tL2ZhZHZpc2UuYwpAQCAtMjQsNyArMjQsNyBAQAogICogUE9TSVhfRkFEVl9XSUxMTkVFRCBjb3VsZCBzZXQgUEdfUmVmZXJlbmNlZCwgYW5kIFBPU0lYX0ZBRFZfTk9SRVVTRSBjb3VsZAogICogZGVhY3RpdmF0ZSB0aGUgcGFnZXMgYW5kIGNsZWFyIFBHX1JlZmVyZW5jZWQuCiAgKi8KLWFzbWxpbmthZ2UgbG9uZyBzeXNfZmFkdmlzZTY0XzY0KGludCBmZCwgbG9mZl90IG9mZnNldCwgbG9mZl90IGxlbiwgaW50IGFkdmljZSkKK1NZU0NBTExfREVGSU5FKGZhZHZpc2U2NF82NCkoaW50IGZkLCBsb2ZmX3Qgb2Zmc2V0LCBsb2ZmX3QgbGVuLCBpbnQgYWR2aWNlKQogewogCXN0cnVjdCBmaWxlICpmaWxlID0gZmdldChmZCk7CiAJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmc7CkBAIC0xMjYsMTIgKzEyNiwyNiBAQAogCWZwdXQoZmlsZSk7CiAJcmV0dXJuIHJldDsKIH0KKyNpZmRlZiBDT05GSUdfSEFWRV9TWVNDQUxMX1dSQVBQRVJTCithc21saW5rYWdlIGxvbmcgU3lTX2ZhZHZpc2U2NF82NChsb25nIGZkLCBsb2ZmX3Qgb2Zmc2V0LCBsb2ZmX3QgbGVuLCBsb25nIGFkdmljZSkKK3sKKwlyZXR1cm4gU1lTQ19mYWR2aXNlNjRfNjQoKGludCkgZmQsIG9mZnNldCwgbGVuLCAoaW50KSBhZHZpY2UpOworfQorU1lTQ0FMTF9BTElBUyhzeXNfZmFkdmlzZTY0XzY0LCBTeVNfZmFkdmlzZTY0XzY0KTsKKyNlbmRpZgogCiAjaWZkZWYgX19BUkNIX1dBTlRfU1lTX0ZBRFZJU0U2NAogCi1hc21saW5rYWdlIGxvbmcgc3lzX2ZhZHZpc2U2NChpbnQgZmQsIGxvZmZfdCBvZmZzZXQsIHNpemVfdCBsZW4sIGludCBhZHZpY2UpCitTWVNDQUxMX0RFRklORShmYWR2aXNlNjQpKGludCBmZCwgbG9mZl90IG9mZnNldCwgc2l6ZV90IGxlbiwgaW50IGFkdmljZSkKIHsKIAlyZXR1cm4gc3lzX2ZhZHZpc2U2NF82NChmZCwgb2Zmc2V0LCBsZW4sIGFkdmljZSk7CiB9CisjaWZkZWYgQ09ORklHX0hBVkVfU1lTQ0FMTF9XUkFQUEVSUworYXNtbGlua2FnZSBsb25nIFN5U19mYWR2aXNlNjQobG9uZyBmZCwgbG9mZl90IG9mZnNldCwgbG9uZyBsZW4sIGxvbmcgYWR2aWNlKQoreworCXJldHVybiBTWVNDX2ZhZHZpc2U2NCgoaW50KSBmZCwgb2Zmc2V0LCAoc2l6ZV90KWxlbiwgKGludClhZHZpY2UpOworfQorU1lTQ0FMTF9BTElBUyhzeXNfZmFkdmlzZTY0LCBTeVNfZmFkdmlzZTY0KTsKKyNlbmRpZgogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL21tL2ZpbGVtYXAuYyBiL21tL2ZpbGVtYXAuYwppbmRleCAyZjU1YTFlLi4yM2FjZWZlIDEwMDY0NAotLS0gYS9tbS9maWxlbWFwLmMKKysrIGIvbW0vZmlsZW1hcC5jCkBAIC00NjAsNyArNDYwLDcgQEAKIAlWTV9CVUdfT04oIVBhZ2VMb2NrZWQocGFnZSkpOwogCiAJZXJyb3IgPSBtZW1fY2dyb3VwX2NhY2hlX2NoYXJnZShwYWdlLCBjdXJyZW50LT5tbSwKLQkJCQkJZ2ZwX21hc2sgJiB+X19HRlBfSElHSE1FTSk7CisJCQkJCWdmcF9tYXNrICYgR0ZQX1JFQ0xBSU1fTUFTSyk7CiAJaWYgKGVycm9yKQogCQlnb3RvIG91dDsKIApAQCAtMTM3NCw3ICsxMzc0LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotYXNtbGlua2FnZSBzc2l6ZV90IHN5c19yZWFkYWhlYWQoaW50IGZkLCBsb2ZmX3Qgb2Zmc2V0LCBzaXplX3QgY291bnQpCitTWVNDQUxMX0RFRklORShyZWFkYWhlYWQpKGludCBmZCwgbG9mZl90IG9mZnNldCwgc2l6ZV90IGNvdW50KQogewogCXNzaXplX3QgcmV0OwogCXN0cnVjdCBmaWxlICpmaWxlOwpAQCAtMTM5Myw2ICsxMzkzLDEzIEBACiAJfQogCXJldHVybiByZXQ7CiB9CisjaWZkZWYgQ09ORklHX0hBVkVfU1lTQ0FMTF9XUkFQUEVSUworYXNtbGlua2FnZSBsb25nIFN5U19yZWFkYWhlYWQobG9uZyBmZCwgbG9mZl90IG9mZnNldCwgbG9uZyBjb3VudCkKK3sKKwlyZXR1cm4gU1lTQ19yZWFkYWhlYWQoKGludCkgZmQsIG9mZnNldCwgKHNpemVfdCkgY291bnQpOworfQorU1lTQ0FMTF9BTElBUyhzeXNfcmVhZGFoZWFkLCBTeVNfcmVhZGFoZWFkKTsKKyNlbmRpZgogCiAjaWZkZWYgQ09ORklHX01NVQogLyoqCmRpZmYgLS1naXQgYS9tbS9mcmVtYXAuYyBiL21tL2ZyZW1hcC5jCmluZGV4IDYyZDViYmQuLjczNmJhN2YgMTAwNjQ0Ci0tLSBhL21tL2ZyZW1hcC5jCisrKyBiL21tL2ZyZW1hcC5jCkBAIC0xMjAsOCArMTIwLDggQEAKICAqIGFuZCB0aGUgdm1hJ3MgZGVmYXVsdCBwcm90ZWN0aW9uIGlzIHVzZWQuIEFyYml0cmFyeSBwcm90ZWN0aW9ucwogICogbWlnaHQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIGZ1dHVyZS4KICAqLwotYXNtbGlua2FnZSBsb25nIHN5c19yZW1hcF9maWxlX3BhZ2VzKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgc2l6ZSwKLQl1bnNpZ25lZCBsb25nIHByb3QsIHVuc2lnbmVkIGxvbmcgcGdvZmYsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCitTWVNDQUxMX0RFRklORTUocmVtYXBfZmlsZV9wYWdlcywgdW5zaWduZWQgbG9uZywgc3RhcnQsIHVuc2lnbmVkIGxvbmcsIHNpemUsCisJCXVuc2lnbmVkIGxvbmcsIHByb3QsIHVuc2lnbmVkIGxvbmcsIHBnb2ZmLCB1bnNpZ25lZCBsb25nLCBmbGFncykKIHsKIAlzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IGN1cnJlbnQtPm1tOwogCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nOwpkaWZmIC0tZ2l0IGEvbW0vbWFkdmlzZS5jIGIvbW0vbWFkdmlzZS5jCmluZGV4IGY5MzQ5YzEuLmI5Y2U1NzQgMTAwNjQ0Ci0tLSBhL21tL21hZHZpc2UuYworKysgYi9tbS9tYWR2aXNlLmMKQEAgLTI4MSw3ICsyODEsNyBAQAogICogIC1FQkFERiAgLSBtYXAgZXhpc3RzLCBidXQgYXJlYSBtYXBzIHNvbWV0aGluZyB0aGF0IGlzbid0IGEgZmlsZS4KICAqICAtRUFHQUlOIC0gYSBrZXJuZWwgcmVzb3VyY2Ugd2FzIHRlbXBvcmFyaWx5IHVuYXZhaWxhYmxlLgogICovCi1hc21saW5rYWdlIGxvbmcgc3lzX21hZHZpc2UodW5zaWduZWQgbG9uZyBzdGFydCwgc2l6ZV90IGxlbl9pbiwgaW50IGJlaGF2aW9yKQorU1lTQ0FMTF9ERUZJTkUzKG1hZHZpc2UsIHVuc2lnbmVkIGxvbmcsIHN0YXJ0LCBzaXplX3QsIGxlbl9pbiwgaW50LCBiZWhhdmlvcikKIHsKIAl1bnNpZ25lZCBsb25nIGVuZCwgdG1wOwogCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqIHZtYSwgKnByZXY7CmRpZmYgLS1naXQgYS9tbS9tZW1jb250cm9sLmMgYi9tbS9tZW1jb250cm9sLmMKaW5kZXggNTFlZTk2NS4uNGQwZWEzYyAxMDA2NDQKLS0tIGEvbW0vbWVtY29udHJvbC5jCisrKyBiL21tL21lbWNvbnRyb2wuYwpAQCAtMjEsMTEgKzIxLDEzIEBACiAjaW5jbHVkZSA8bGludXgvbWVtY29udHJvbC5oPgogI2luY2x1ZGUgPGxpbnV4L2Nncm91cC5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgogI2luY2x1ZGUgPGxpbnV4L3BhZ2UtZmxhZ3MuaD4KICNpbmNsdWRlIDxsaW51eC9iYWNraW5nLWRldi5oPgogI2luY2x1ZGUgPGxpbnV4L2JpdF9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L3JjdXBkYXRlLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvc3dhcC5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CkBAIC0zNCwxMiArMzYsMjMgQEAKICNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CiAjaW5jbHVkZSA8bGludXgvbW1faW5saW5lLmg+CiAjaW5jbHVkZSA8bGludXgvcGFnZV9jZ3JvdXAuaD4KKyNpbmNsdWRlICJpbnRlcm5hbC5oIgogCiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KIAogc3RydWN0IGNncm91cF9zdWJzeXMgbWVtX2Nncm91cF9zdWJzeXMgX19yZWFkX21vc3RseTsKICNkZWZpbmUgTUVNX0NHUk9VUF9SRUNMQUlNX1JFVFJJRVMJNQogCisjaWZkZWYgQ09ORklHX0NHUk9VUF9NRU1fUkVTX0NUTFJfU1dBUAorLyogVHVybmVkIG9uIG9ubHkgd2hlbiBtZW1vcnkgY2dyb3VwIGlzIGVuYWJsZWQgJiYgcmVhbGx5X2RvX3N3YXBfYWNjb3VudCA9IDAgKi8KK2ludCBkb19zd2FwX2FjY291bnQgX19yZWFkX21vc3RseTsKK3N0YXRpYyBpbnQgcmVhbGx5X2RvX3N3YXBfYWNjb3VudCBfX2luaXRkYXRhID0gMTsgLyogZm9yIHJlbWVtYmVyIGJvb3Qgb3B0aW9uKi8KKyNlbHNlCisjZGVmaW5lIGRvX3N3YXBfYWNjb3VudAkJKDApCisjZW5kaWYKKworc3RhdGljIERFRklORV9NVVRFWChtZW1jZ190YXNrbGlzdCk7CS8qIGNhbiBiZSBob2xkIHVuZGVyIGNncm91cF9tdXRleCAqLworCiAvKgogICogU3RhdGlzdGljcyBmb3IgbWVtb3J5IGNncm91cC4KICAqLwpAQCAtNjAsNyArNzMsNyBAQAogfSBfX19fY2FjaGVsaW5lX2FsaWduZWRfaW5fc21wOwogCiBzdHJ1Y3QgbWVtX2Nncm91cF9zdGF0IHsKLQlzdHJ1Y3QgbWVtX2Nncm91cF9zdGF0X2NwdSBjcHVzdGF0W05SX0NQVVNdOworCXN0cnVjdCBtZW1fY2dyb3VwX3N0YXRfY3B1IGNwdXN0YXRbMF07CiB9OwogCiAvKgpAQCAtODksOSArMTAyLDEwIEBACiAJLyoKIAkgKiBzcGluX2xvY2sgdG8gcHJvdGVjdCB0aGUgcGVyIGNncm91cCBMUlUKIAkgKi8KLQlzcGlubG9ja190CQlscnVfbG9jazsKIAlzdHJ1Y3QgbGlzdF9oZWFkCWxpc3RzW05SX0xSVV9MSVNUU107CiAJdW5zaWduZWQgbG9uZwkJY291bnRbTlJfTFJVX0xJU1RTXTsKKworCXN0cnVjdCB6b25lX3JlY2xhaW1fc3RhdCByZWNsYWltX3N0YXQ7CiB9OwogLyogTWFjcm8gZm9yIGFjY2Vzc2luZyBjb3VudGVyICovCiAjZGVmaW5lIE1FTV9DR1JPVVBfWlNUQVQobXosIGlkeCkJKChteiktPmNvdW50WyhpZHgpXSkKQEAgLTEyMiw0NCArMTM2LDczIEBACiAJICovCiAJc3RydWN0IHJlc19jb3VudGVyIHJlczsKIAkvKgorCSAqIHRoZSBjb3VudGVyIHRvIGFjY291bnQgZm9yIG1lbStzd2FwIHVzYWdlLgorCSAqLworCXN0cnVjdCByZXNfY291bnRlciBtZW1zdzsKKwkvKgogCSAqIFBlciBjZ3JvdXAgYWN0aXZlIGFuZCBpbmFjdGl2ZSBsaXN0LCBzaW1pbGFyIHRvIHRoZQogCSAqIHBlciB6b25lIExSVSBsaXN0cy4KIAkgKi8KIAlzdHJ1Y3QgbWVtX2Nncm91cF9scnVfaW5mbyBpbmZvOwogCi0JaW50CXByZXZfcHJpb3JpdHk7CS8qIGZvciByZWNvcmRpbmcgcmVjbGFpbSBwcmlvcml0eSAqLwogCS8qCi0JICogc3RhdGlzdGljcy4KKwkgIHByb3RlY3QgYWdhaW5zdCByZWNsYWltIHJlbGF0ZWQgbWVtYmVyLgorCSovCisJc3BpbmxvY2tfdCByZWNsYWltX3BhcmFtX2xvY2s7CisKKwlpbnQJcHJldl9wcmlvcml0eTsJLyogZm9yIHJlY29yZGluZyByZWNsYWltIHByaW9yaXR5ICovCisKKwkvKgorCSAqIFdoaWxlIHJlY2xhaW1pbmcgaW4gYSBoaWVhcmNoeSwgd2UgY2FjaGUgdGhlIGxhc3QgY2hpbGQgd2UKKwkgKiByZWNsYWltZWQgZnJvbS4gUHJvdGVjdGVkIGJ5IGhpZXJhcmNoeV9tdXRleAorCSAqLworCXN0cnVjdCBtZW1fY2dyb3VwICpsYXN0X3NjYW5uZWRfY2hpbGQ7CisJLyoKKwkgKiBTaG91bGQgdGhlIGFjY291bnRpbmcgYW5kIGNvbnRyb2wgYmUgaGllcmFyY2hpY2FsLCBwZXIgc3VidHJlZT8KKwkgKi8KKwlib29sIHVzZV9oaWVyYXJjaHk7CisJdW5zaWduZWQgbG9uZwlsYXN0X29vbV9qaWZmaWVzOworCWF0b21pY190CXJlZmNudDsKKworCXVuc2lnbmVkIGludAlzd2FwcGluZXNzOworCisJLyoKKwkgKiBzdGF0aXN0aWNzLiBUaGlzIG11c3QgYmUgcGxhY2VkIGF0IHRoZSBlbmQgb2YgbWVtY2cuCiAJICovCiAJc3RydWN0IG1lbV9jZ3JvdXBfc3RhdCBzdGF0OwogfTsKLXN0YXRpYyBzdHJ1Y3QgbWVtX2Nncm91cCBpbml0X21lbV9jZ3JvdXA7CiAKIGVudW0gY2hhcmdlX3R5cGUgewogCU1FTV9DR1JPVVBfQ0hBUkdFX1RZUEVfQ0FDSEUgPSAwLAogCU1FTV9DR1JPVVBfQ0hBUkdFX1RZUEVfTUFQUEVELAogCU1FTV9DR1JPVVBfQ0hBUkdFX1RZUEVfU0hNRU0sCS8qIHVzZWQgYnkgcGFnZSBtaWdyYXRpb24gb2Ygc2htZW0gKi8KIAlNRU1fQ0dST1VQX0NIQVJHRV9UWVBFX0ZPUkNFLAkvKiB1c2VkIGJ5IGZvcmNlX2VtcHR5ICovCisJTUVNX0NHUk9VUF9DSEFSR0VfVFlQRV9TV0FQT1VULAkvKiBmb3IgYWNjb3VudGluZyBzd2FwY2FjaGUgKi8KIAlOUl9DSEFSR0VfVFlQRSwKIH07CiAKIC8qIG9ubHkgZm9yIGhlcmUgKGZvciBlYXN5IHJlYWRpbmcuKSAqLwogI2RlZmluZSBQQ0dGX0NBQ0hFCSgxVUwgPDwgUENHX0NBQ0hFKQogI2RlZmluZSBQQ0dGX1VTRUQJKDFVTCA8PCBQQ0dfVVNFRCkKLSNkZWZpbmUgUENHRl9BQ1RJVkUJKDFVTCA8PCBQQ0dfQUNUSVZFKQogI2RlZmluZSBQQ0dGX0xPQ0sJKDFVTCA8PCBQQ0dfTE9DSykKLSNkZWZpbmUgUENHRl9GSUxFCSgxVUwgPDwgUENHX0ZJTEUpCiBzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZwogcGNnX2RlZmF1bHRfZmxhZ3NbTlJfQ0hBUkdFX1RZUEVdID0gewotCVBDR0ZfQ0FDSEUgfCBQQ0dGX0ZJTEUgfCBQQ0dGX1VTRUQgfCBQQ0dGX0xPQ0ssIC8qIEZpbGUgQ2FjaGUgKi8KLQlQQ0dGX0FDVElWRSB8IFBDR0ZfVVNFRCB8IFBDR0ZfTE9DSywgLyogQW5vbiAqLwotCVBDR0ZfQUNUSVZFIHwgUENHRl9DQUNIRSB8IFBDR0ZfVVNFRCB8IFBDR0ZfTE9DSywgLyogU2htZW0gKi8KKwlQQ0dGX0NBQ0hFIHwgUENHRl9VU0VEIHwgUENHRl9MT0NLLCAvKiBGaWxlIENhY2hlICovCisJUENHRl9VU0VEIHwgUENHRl9MT0NLLCAvKiBBbm9uICovCisJUENHRl9DQUNIRSB8IFBDR0ZfVVNFRCB8IFBDR0ZfTE9DSywgLyogU2htZW0gKi8KIAkwLCAvKiBGT1JDRSAqLwogfTsKIAotLyoKLSAqIEFsd2F5cyBtb2RpZmllZCB1bmRlciBscnUgbG9jay4gVGhlbiwgbm90IG5lY2Vzc2FyeSB0byBwcmVlbXB0X2Rpc2FibGUoKQotICovCisvKiBmb3IgZW5jb2RpbmcgY2Z0LT5wcml2YXRlIHZhbHVlIG9uIGZpbGUgKi8KKyNkZWZpbmUgX01FTQkJCSgwKQorI2RlZmluZSBfTUVNU1dBUAkJKDEpCisjZGVmaW5lIE1FTUZJTEVfUFJJVkFURSh4LCB2YWwpCSgoKHgpIDw8IDE2KSB8ICh2YWwpKQorI2RlZmluZSBNRU1GSUxFX1RZUEUodmFsKQkoKCh2YWwpID4+IDE2KSAmIDB4ZmZmZikKKyNkZWZpbmUgTUVNRklMRV9BVFRSKHZhbCkJKCh2YWwpICYgMHhmZmZmKQorCitzdGF0aWMgdm9pZCBtZW1fY2dyb3VwX2dldChzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtKTsKK3N0YXRpYyB2b2lkIG1lbV9jZ3JvdXBfcHV0KHN0cnVjdCBtZW1fY2dyb3VwICptZW0pOworCiBzdGF0aWMgdm9pZCBtZW1fY2dyb3VwX2NoYXJnZV9zdGF0aXN0aWNzKHN0cnVjdCBtZW1fY2dyb3VwICptZW0sCiAJCQkJCSBzdHJ1Y3QgcGFnZV9jZ3JvdXAgKnBjLAogCQkJCQkgYm9vbCBjaGFyZ2UpCkBAIC0xNjcsMTAgKzIxMCw5IEBACiAJaW50IHZhbCA9IChjaGFyZ2UpPyAxIDogLTE7CiAJc3RydWN0IG1lbV9jZ3JvdXBfc3RhdCAqc3RhdCA9ICZtZW0tPnN0YXQ7CiAJc3RydWN0IG1lbV9jZ3JvdXBfc3RhdF9jcHUgKmNwdXN0YXQ7CisJaW50IGNwdSA9IGdldF9jcHUoKTsKIAotCVZNX0JVR19PTighaXJxc19kaXNhYmxlZCgpKTsKLQotCWNwdXN0YXQgPSAmc3RhdC0+Y3B1c3RhdFtzbXBfcHJvY2Vzc29yX2lkKCldOworCWNwdXN0YXQgPSAmc3RhdC0+Y3B1c3RhdFtjcHVdOwogCWlmIChQYWdlQ2dyb3VwQ2FjaGUocGMpKQogCQlfX21lbV9jZ3JvdXBfc3RhdF9hZGRfc2FmZShjcHVzdGF0LCBNRU1fQ0dST1VQX1NUQVRfQ0FDSEUsIHZhbCk7CiAJZWxzZQpAQCAtMTgyLDYgKzIyNCw3IEBACiAJZWxzZQogCQlfX21lbV9jZ3JvdXBfc3RhdF9hZGRfc2FmZShjcHVzdGF0LAogCQkJCU1FTV9DR1JPVVBfU1RBVF9QR1BHT1VUX0NPVU5ULCAxKTsKKwlwdXRfY3B1KCk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgbWVtX2Nncm91cF9wZXJfem9uZSAqCkBAIC0xOTcsNiArMjQwLDkgQEAKIAlpbnQgbmlkID0gcGFnZV9jZ3JvdXBfbmlkKHBjKTsKIAlpbnQgemlkID0gcGFnZV9jZ3JvdXBfemlkKHBjKTsKIAorCWlmICghbWVtKQorCQlyZXR1cm4gTlVMTDsKKwogCXJldHVybiBtZW1fY2dyb3VwX3pvbmVpbmZvKG1lbSwgbmlkLCB6aWQpOwogfQogCkBAIC0yMzYsNzkgKzI4MiwxNjEgQEAKIAkJCQlzdHJ1Y3QgbWVtX2Nncm91cCwgY3NzKTsKIH0KIAotc3RhdGljIHZvaWQgX19tZW1fY2dyb3VwX3JlbW92ZV9saXN0KHN0cnVjdCBtZW1fY2dyb3VwX3Blcl96b25lICpteiwKLQkJCXN0cnVjdCBwYWdlX2Nncm91cCAqcGMpCitzdGF0aWMgc3RydWN0IG1lbV9jZ3JvdXAgKnRyeV9nZXRfbWVtX2Nncm91cF9mcm9tX21tKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKQogewotCWludCBscnUgPSBMUlVfQkFTRTsKKwlzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtID0gTlVMTDsKKwkvKgorCSAqIEJlY2F1c2Ugd2UgaGF2ZSBubyBsb2NrcywgbW0tPm93bmVyJ3MgbWF5IGJlIGJlaW5nIG1vdmVkIHRvIG90aGVyCisJICogY2dyb3VwLiBXZSB1c2UgY3NzX3RyeWdldCgpIGhlcmUgZXZlbiBpZiB0aGlzIGxvb2tzCisJICogcGVzc2ltaXN0aWMgKHJhdGhlciB0aGFuIGFkZGluZyBsb2NrcyBoZXJlKS4KKwkgKi8KKwlyY3VfcmVhZF9sb2NrKCk7CisJZG8geworCQltZW0gPSBtZW1fY2dyb3VwX2Zyb21fdGFzayhyY3VfZGVyZWZlcmVuY2UobW0tPm93bmVyKSk7CisJCWlmICh1bmxpa2VseSghbWVtKSkKKwkJCWJyZWFrOworCX0gd2hpbGUgKCFjc3NfdHJ5Z2V0KCZtZW0tPmNzcykpOworCXJjdV9yZWFkX3VubG9jaygpOworCXJldHVybiBtZW07Cit9CiAKLQlpZiAoUGFnZUNncm91cFVuZXZpY3RhYmxlKHBjKSkKLQkJbHJ1ID0gTFJVX1VORVZJQ1RBQkxFOwotCWVsc2UgewotCQlpZiAoUGFnZUNncm91cEFjdGl2ZShwYykpCi0JCQlscnUgKz0gTFJVX0FDVElWRTsKLQkJaWYgKFBhZ2VDZ3JvdXBGaWxlKHBjKSkKLQkJCWxydSArPSBMUlVfRklMRTsKLQl9CitzdGF0aWMgYm9vbCBtZW1fY2dyb3VwX2lzX29ic29sZXRlKHN0cnVjdCBtZW1fY2dyb3VwICptZW0pCit7CisJaWYgKCFtZW0pCisJCXJldHVybiB0cnVlOworCXJldHVybiBjc3NfaXNfcmVtb3ZlZCgmbWVtLT5jc3MpOworfQogCisvKgorICogRm9sbG93aW5nIExSVSBmdW5jdGlvbnMgYXJlIGFsbG93ZWQgdG8gYmUgdXNlZCB3aXRob3V0IFBDR19MT0NLLgorICogT3BlcmF0aW9ucyBhcmUgY2FsbGVkIGJ5IHJvdXRpbmUgb2YgZ2xvYmFsIExSVSBpbmRlcGVuZGVudGx5IGZyb20gbWVtY2cuCisgKiBXaGF0IHdlIGhhdmUgdG8gdGFrZSBjYXJlIG9mIGhlcmUgaXMgdmFsaWRuZXNzIG9mIHBjLT5tZW1fY2dyb3VwLgorICoKKyAqIENoYW5nZXMgdG8gcGMtPm1lbV9jZ3JvdXAgaGFwcGVucyB3aGVuCisgKiAxLiBjaGFyZ2UKKyAqIDIuIG1vdmluZyBhY2NvdW50CisgKiBJbiB0eXBpY2FsIGNhc2UsICJjaGFyZ2UiIGlzIGRvbmUgYmVmb3JlIGFkZC10by1scnUuIEV4Y2VwdGlvbiBpcyBTd2FwQ2FjaGUuCisgKiBJdCBpcyBhZGRlZCB0byBMUlUgYmVmb3JlIGNoYXJnZS4KKyAqIElmIFBDR19VU0VEIGJpdCBpcyBub3Qgc2V0LCBwYWdlX2Nncm91cCBpcyBub3QgYWRkZWQgdG8gdGhpcyBwcml2YXRlIExSVS4KKyAqIFdoZW4gbW92aW5nIGFjY291bnQsIHRoZSBwYWdlIGlzIG5vdCBvbiBMUlUuIEl0J3MgaXNvbGF0ZWQuCisgKi8KKwordm9pZCBtZW1fY2dyb3VwX2RlbF9scnVfbGlzdChzdHJ1Y3QgcGFnZSAqcGFnZSwgZW51bSBscnVfbGlzdCBscnUpCit7CisJc3RydWN0IHBhZ2VfY2dyb3VwICpwYzsKKwlzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtOworCXN0cnVjdCBtZW1fY2dyb3VwX3Blcl96b25lICptejsKKworCWlmIChtZW1fY2dyb3VwX2Rpc2FibGVkKCkpCisJCXJldHVybjsKKwlwYyA9IGxvb2t1cF9wYWdlX2Nncm91cChwYWdlKTsKKwkvKiBjYW4gaGFwcGVuIHdoaWxlIHdlIGhhbmRsZSBzd2FwY2FjaGUuICovCisJaWYgKGxpc3RfZW1wdHkoJnBjLT5scnUpIHx8ICFwYy0+bWVtX2Nncm91cCkKKwkJcmV0dXJuOworCS8qCisJICogV2UgZG9uJ3QgY2hlY2sgUENHX1VTRUQgYml0LiBJdCdzIGNsZWFyZWQgd2hlbiB0aGUgInBhZ2UiIGlzIGZpbmFsbHkKKwkgKiByZW1vdmVkIGZyb20gZ2xvYmFsIExSVS4KKwkgKi8KKwlteiA9IHBhZ2VfY2dyb3VwX3pvbmVpbmZvKHBjKTsKKwltZW0gPSBwYy0+bWVtX2Nncm91cDsKIAlNRU1fQ0dST1VQX1pTVEFUKG16LCBscnUpIC09IDE7Ci0KLQltZW1fY2dyb3VwX2NoYXJnZV9zdGF0aXN0aWNzKHBjLT5tZW1fY2dyb3VwLCBwYywgZmFsc2UpOwotCWxpc3RfZGVsKCZwYy0+bHJ1KTsKKwlsaXN0X2RlbF9pbml0KCZwYy0+bHJ1KTsKKwlyZXR1cm47CiB9CiAKLXN0YXRpYyB2b2lkIF9fbWVtX2Nncm91cF9hZGRfbGlzdChzdHJ1Y3QgbWVtX2Nncm91cF9wZXJfem9uZSAqbXosCi0JCQkJc3RydWN0IHBhZ2VfY2dyb3VwICpwYykKK3ZvaWQgbWVtX2Nncm91cF9kZWxfbHJ1KHN0cnVjdCBwYWdlICpwYWdlKQogewotCWludCBscnUgPSBMUlVfQkFTRTsKLQotCWlmIChQYWdlQ2dyb3VwVW5ldmljdGFibGUocGMpKQotCQlscnUgPSBMUlVfVU5FVklDVEFCTEU7Ci0JZWxzZSB7Ci0JCWlmIChQYWdlQ2dyb3VwQWN0aXZlKHBjKSkKLQkJCWxydSArPSBMUlVfQUNUSVZFOwotCQlpZiAoUGFnZUNncm91cEZpbGUocGMpKQotCQkJbHJ1ICs9IExSVV9GSUxFOwotCX0KLQotCU1FTV9DR1JPVVBfWlNUQVQobXosIGxydSkgKz0gMTsKLQlsaXN0X2FkZCgmcGMtPmxydSwgJm16LT5saXN0c1tscnVdKTsKLQotCW1lbV9jZ3JvdXBfY2hhcmdlX3N0YXRpc3RpY3MocGMtPm1lbV9jZ3JvdXAsIHBjLCB0cnVlKTsKKwltZW1fY2dyb3VwX2RlbF9scnVfbGlzdChwYWdlLCBwYWdlX2xydShwYWdlKSk7CiB9CiAKLXN0YXRpYyB2b2lkIF9fbWVtX2Nncm91cF9tb3ZlX2xpc3RzKHN0cnVjdCBwYWdlX2Nncm91cCAqcGMsIGVudW0gbHJ1X2xpc3QgbHJ1KQordm9pZCBtZW1fY2dyb3VwX3JvdGF0ZV9scnVfbGlzdChzdHJ1Y3QgcGFnZSAqcGFnZSwgZW51bSBscnVfbGlzdCBscnUpCiB7Ci0Jc3RydWN0IG1lbV9jZ3JvdXBfcGVyX3pvbmUgKm16ID0gcGFnZV9jZ3JvdXBfem9uZWluZm8ocGMpOwotCWludCBhY3RpdmUgICAgPSBQYWdlQ2dyb3VwQWN0aXZlKHBjKTsKLQlpbnQgZmlsZSAgICAgID0gUGFnZUNncm91cEZpbGUocGMpOwotCWludCB1bmV2aWN0YWJsZSA9IFBhZ2VDZ3JvdXBVbmV2aWN0YWJsZShwYyk7Ci0JZW51bSBscnVfbGlzdCBmcm9tID0gdW5ldmljdGFibGUgPyBMUlVfVU5FVklDVEFCTEUgOgotCQkJCShMUlVfRklMRSAqICEhZmlsZSArICEhYWN0aXZlKTsKKwlzdHJ1Y3QgbWVtX2Nncm91cF9wZXJfem9uZSAqbXo7CisJc3RydWN0IHBhZ2VfY2dyb3VwICpwYzsKIAotCWlmIChscnUgPT0gZnJvbSkKKwlpZiAobWVtX2Nncm91cF9kaXNhYmxlZCgpKQogCQlyZXR1cm47CiAKLQlNRU1fQ0dST1VQX1pTVEFUKG16LCBmcm9tKSAtPSAxOworCXBjID0gbG9va3VwX3BhZ2VfY2dyb3VwKHBhZ2UpOwogCS8qCi0JICogSG93ZXZlciB0aGlzIGlzIGRvbmUgdW5kZXIgbXotPmxydV9sb2NrLCBhbm90aGVyIGZsYWdzLCB3aGljaAotCSAqIGFyZSBub3QgcmVsYXRlZCB0byBMUlUsIHdpbGwgYmUgbW9kaWZpZWQgZnJvbSBvdXQtb2YtbG9jay4KLQkgKiBXZSBoYXZlIHRvIHVzZSBhdG9taWMgc2V0L2NsZWFyIGZsYWdzLgorCSAqIFVzZWQgYml0IGlzIHNldCB3aXRob3V0IGF0b21pYyBvcHMgYnV0IGFmdGVyIHNtcF93bWIoKS4KKwkgKiBGb3IgbWFraW5nIHBjLT5tZW1fY2dyb3VwIHZpc2libGUsIGluc2VydCBzbXBfcm1iKCkgaGVyZS4KIAkgKi8KLQlpZiAoaXNfdW5ldmljdGFibGVfbHJ1KGxydSkpIHsKLQkJQ2xlYXJQYWdlQ2dyb3VwQWN0aXZlKHBjKTsKLQkJU2V0UGFnZUNncm91cFVuZXZpY3RhYmxlKHBjKTsKLQl9IGVsc2UgewotCQlpZiAoaXNfYWN0aXZlX2xydShscnUpKQotCQkJU2V0UGFnZUNncm91cEFjdGl2ZShwYyk7Ci0JCWVsc2UKLQkJCUNsZWFyUGFnZUNncm91cEFjdGl2ZShwYyk7Ci0JCUNsZWFyUGFnZUNncm91cFVuZXZpY3RhYmxlKHBjKTsKLQl9Ci0KLQlNRU1fQ0dST1VQX1pTVEFUKG16LCBscnUpICs9IDE7CisJc21wX3JtYigpOworCS8qIHVudXNlZCBwYWdlIGlzIG5vdCByb3RhdGVkLiAqLworCWlmICghUGFnZUNncm91cFVzZWQocGMpKQorCQlyZXR1cm47CisJbXogPSBwYWdlX2Nncm91cF96b25laW5mbyhwYyk7CiAJbGlzdF9tb3ZlKCZwYy0+bHJ1LCAmbXotPmxpc3RzW2xydV0pOwogfQogCit2b2lkIG1lbV9jZ3JvdXBfYWRkX2xydV9saXN0KHN0cnVjdCBwYWdlICpwYWdlLCBlbnVtIGxydV9saXN0IGxydSkKK3sKKwlzdHJ1Y3QgcGFnZV9jZ3JvdXAgKnBjOworCXN0cnVjdCBtZW1fY2dyb3VwX3Blcl96b25lICptejsKKworCWlmIChtZW1fY2dyb3VwX2Rpc2FibGVkKCkpCisJCXJldHVybjsKKwlwYyA9IGxvb2t1cF9wYWdlX2Nncm91cChwYWdlKTsKKwkvKgorCSAqIFVzZWQgYml0IGlzIHNldCB3aXRob3V0IGF0b21pYyBvcHMgYnV0IGFmdGVyIHNtcF93bWIoKS4KKwkgKiBGb3IgbWFraW5nIHBjLT5tZW1fY2dyb3VwIHZpc2libGUsIGluc2VydCBzbXBfcm1iKCkgaGVyZS4KKwkgKi8KKwlzbXBfcm1iKCk7CisJaWYgKCFQYWdlQ2dyb3VwVXNlZChwYykpCisJCXJldHVybjsKKworCW16ID0gcGFnZV9jZ3JvdXBfem9uZWluZm8ocGMpOworCU1FTV9DR1JPVVBfWlNUQVQobXosIGxydSkgKz0gMTsKKwlsaXN0X2FkZCgmcGMtPmxydSwgJm16LT5saXN0c1tscnVdKTsKK30KKworLyoKKyAqIEF0IGhhbmRsaW5nIFN3YXBDYWNoZSwgcGMtPm1lbV9jZ3JvdXAgbWF5IGJlIGNoYW5nZWQgd2hpbGUgaXQncyBsaW5rZWQgdG8KKyAqIGxydSBiZWNhdXNlIHRoZSBwYWdlIG1heS5iZSByZXVzZWQgYWZ0ZXIgaXQncyBmdWxseSB1bmNoYXJnZWQgKGJlY2F1c2Ugb2YKKyAqIFN3YXBDYWNoZSBiZWhhdmlvcikuVG8gaGFuZGxlIHRoYXQsIHVubGluayBwYWdlX2Nncm91cCBmcm9tIExSVSB3aGVuIGNoYXJnZQorICogaXQgYWdhaW4uIFRoaXMgZnVuY3Rpb24gaXMgb25seSB1c2VkIHRvIGNoYXJnZSBTd2FwQ2FjaGUuIEl0J3MgZG9uZSB1bmRlcgorICogbG9ja19wYWdlIGFuZCBleHBlY3RlZCB0aGF0IHpvbmUtPmxydV9sb2NrIGlzIG5ldmVyIGhlbGQuCisgKi8KK3N0YXRpYyB2b2lkIG1lbV9jZ3JvdXBfbHJ1X2RlbF9iZWZvcmVfY29tbWl0X3N3YXBjYWNoZShzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCB6b25lICp6b25lID0gcGFnZV96b25lKHBhZ2UpOworCXN0cnVjdCBwYWdlX2Nncm91cCAqcGMgPSBsb29rdXBfcGFnZV9jZ3JvdXAocGFnZSk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmem9uZS0+bHJ1X2xvY2ssIGZsYWdzKTsKKwkvKgorCSAqIEZvcmdldCBvbGQgTFJVIHdoZW4gdGhpcyBwYWdlX2Nncm91cCBpcyAqbm90KiB1c2VkLiBUaGlzIFVzZWQgYml0CisJICogaXMgZ3VhcmRlZCBieSBsb2NrX3BhZ2UoKSBiZWNhdXNlIHRoZSBwYWdlIGlzIFN3YXBDYWNoZS4KKwkgKi8KKwlpZiAoIVBhZ2VDZ3JvdXBVc2VkKHBjKSkKKwkJbWVtX2Nncm91cF9kZWxfbHJ1X2xpc3QocGFnZSwgcGFnZV9scnUocGFnZSkpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnpvbmUtPmxydV9sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIG1lbV9jZ3JvdXBfbHJ1X2FkZF9hZnRlcl9jb21taXRfc3dhcGNhY2hlKHN0cnVjdCBwYWdlICpwYWdlKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IHpvbmUgKnpvbmUgPSBwYWdlX3pvbmUocGFnZSk7CisJc3RydWN0IHBhZ2VfY2dyb3VwICpwYyA9IGxvb2t1cF9wYWdlX2Nncm91cChwYWdlKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ6b25lLT5scnVfbG9jaywgZmxhZ3MpOworCS8qIGxpbmsgd2hlbiB0aGUgcGFnZSBpcyBsaW5rZWQgdG8gTFJVIGJ1dCBwYWdlX2Nncm91cCBpc24ndCAqLworCWlmIChQYWdlTFJVKHBhZ2UpICYmIGxpc3RfZW1wdHkoJnBjLT5scnUpKQorCQltZW1fY2dyb3VwX2FkZF9scnVfbGlzdChwYWdlLCBwYWdlX2xydShwYWdlKSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmem9uZS0+bHJ1X2xvY2ssIGZsYWdzKTsKK30KKworCit2b2lkIG1lbV9jZ3JvdXBfbW92ZV9saXN0cyhzdHJ1Y3QgcGFnZSAqcGFnZSwKKwkJCSAgIGVudW0gbHJ1X2xpc3QgZnJvbSwgZW51bSBscnVfbGlzdCB0bykKK3sKKwlpZiAobWVtX2Nncm91cF9kaXNhYmxlZCgpKQorCQlyZXR1cm47CisJbWVtX2Nncm91cF9kZWxfbHJ1X2xpc3QocGFnZSwgZnJvbSk7CisJbWVtX2Nncm91cF9hZGRfbHJ1X2xpc3QocGFnZSwgdG8pOworfQorCiBpbnQgdGFza19pbl9tZW1fY2dyb3VwKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgY29uc3Qgc3RydWN0IG1lbV9jZ3JvdXAgKm1lbSkKIHsKIAlpbnQgcmV0OwpAQCAtMzIwLDM3ICs0NDgsNiBAQAogfQogCiAvKgotICogVGhpcyByb3V0aW5lIGFzc3VtZXMgdGhhdCB0aGUgYXBwcm9wcmlhdGUgem9uZSdzIGxydSBsb2NrIGlzIGFscmVhZHkgaGVsZAotICovCi12b2lkIG1lbV9jZ3JvdXBfbW92ZV9saXN0cyhzdHJ1Y3QgcGFnZSAqcGFnZSwgZW51bSBscnVfbGlzdCBscnUpCi17Ci0Jc3RydWN0IHBhZ2VfY2dyb3VwICpwYzsKLQlzdHJ1Y3QgbWVtX2Nncm91cF9wZXJfem9uZSAqbXo7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWlmIChtZW1fY2dyb3VwX3N1YnN5cy5kaXNhYmxlZCkKLQkJcmV0dXJuOwotCi0JLyoKLQkgKiBXZSBjYW5ub3QgbG9ja19wYWdlX2Nncm91cCB3aGlsZSBob2xkaW5nIHpvbmUncyBscnVfbG9jaywKLQkgKiBiZWNhdXNlIG90aGVyIGhvbGRlcnMgb2YgbG9ja19wYWdlX2Nncm91cCBjYW4gYmUgaW50ZXJydXB0ZWQKLQkgKiB3aXRoIGFuIGF0dGVtcHQgdG8gcm90YXRlX3JlY2xhaW1hYmxlX3BhZ2UuICBCdXQgd2UgY2Fubm90Ci0JICogc2FmZWx5IGdldCB0byBwYWdlX2Nncm91cCB3aXRob3V0IGl0LCBzbyBqdXN0IHRyeV9sb2NrIGl0OgotCSAqIG1lbV9jZ3JvdXBfaXNvbGF0ZV9wYWdlcyBhbGxvd3MgZm9yIHBhZ2UgbGVmdCBvbiB3cm9uZyBsaXN0LgotCSAqLwotCXBjID0gbG9va3VwX3BhZ2VfY2dyb3VwKHBhZ2UpOwotCWlmICghdHJ5bG9ja19wYWdlX2Nncm91cChwYykpCi0JCXJldHVybjsKLQlpZiAocGMgJiYgUGFnZUNncm91cFVzZWQocGMpKSB7Ci0JCW16ID0gcGFnZV9jZ3JvdXBfem9uZWluZm8ocGMpOwotCQlzcGluX2xvY2tfaXJxc2F2ZSgmbXotPmxydV9sb2NrLCBmbGFncyk7Ci0JCV9fbWVtX2Nncm91cF9tb3ZlX2xpc3RzKHBjLCBscnUpOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtei0+bHJ1X2xvY2ssIGZsYWdzKTsKLQl9Ci0JdW5sb2NrX3BhZ2VfY2dyb3VwKHBjKTsKLX0KLQotLyoKICAqIENhbGN1bGF0ZSBtYXBwZWRfcmF0aW8gdW5kZXIgbWVtb3J5IGNvbnRyb2xsZXIuIFRoaXMgd2lsbCBiZSB1c2VkIGluCiAgKiB2bXNjYW4uYyBmb3IgZGV0ZXJlbWluaW5nIHdlIGhhdmUgdG8gcmVjbGFpbSBtYXBwZWQgcGFnZXMuCiAgKi8KQEAgLTM3MiwzOSArNDY5LDExNiBAQAogICovCiBpbnQgbWVtX2Nncm91cF9nZXRfcmVjbGFpbV9wcmlvcml0eShzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtKQogewotCXJldHVybiBtZW0tPnByZXZfcHJpb3JpdHk7CisJaW50IHByZXZfcHJpb3JpdHk7CisKKwlzcGluX2xvY2soJm1lbS0+cmVjbGFpbV9wYXJhbV9sb2NrKTsKKwlwcmV2X3ByaW9yaXR5ID0gbWVtLT5wcmV2X3ByaW9yaXR5OworCXNwaW5fdW5sb2NrKCZtZW0tPnJlY2xhaW1fcGFyYW1fbG9jayk7CisKKwlyZXR1cm4gcHJldl9wcmlvcml0eTsKIH0KIAogdm9pZCBtZW1fY2dyb3VwX25vdGVfcmVjbGFpbV9wcmlvcml0eShzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtLCBpbnQgcHJpb3JpdHkpCiB7CisJc3Bpbl9sb2NrKCZtZW0tPnJlY2xhaW1fcGFyYW1fbG9jayk7CiAJaWYgKHByaW9yaXR5IDwgbWVtLT5wcmV2X3ByaW9yaXR5KQogCQltZW0tPnByZXZfcHJpb3JpdHkgPSBwcmlvcml0eTsKKwlzcGluX3VubG9jaygmbWVtLT5yZWNsYWltX3BhcmFtX2xvY2spOwogfQogCiB2b2lkIG1lbV9jZ3JvdXBfcmVjb3JkX3JlY2xhaW1fcHJpb3JpdHkoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbSwgaW50IHByaW9yaXR5KQogeworCXNwaW5fbG9jaygmbWVtLT5yZWNsYWltX3BhcmFtX2xvY2spOwogCW1lbS0+cHJldl9wcmlvcml0eSA9IHByaW9yaXR5OworCXNwaW5fdW5sb2NrKCZtZW0tPnJlY2xhaW1fcGFyYW1fbG9jayk7CiB9CiAKLS8qCi0gKiBDYWxjdWxhdGUgIyBvZiBwYWdlcyB0byBiZSBzY2FubmVkIGluIHRoaXMgcHJpb3JpdHkvem9uZS4KLSAqIFNlZSBhbHNvIHZtc2Nhbi5jCi0gKgotICogcHJpb3JpdHkgc3RhcnRzIGZyb20gIkRFRl9QUklPUklUWSIgYW5kIGRlY3JlbWVudGVkIGluIGVhY2ggbG9vcC4KLSAqIChzZWUgaW5jbHVkZS9saW51eC9tbXpvbmUuaCkKLSAqLwotCi1sb25nIG1lbV9jZ3JvdXBfY2FsY19yZWNsYWltKHN0cnVjdCBtZW1fY2dyb3VwICptZW0sIHN0cnVjdCB6b25lICp6b25lLAotCQkJCQlpbnQgcHJpb3JpdHksIGVudW0gbHJ1X2xpc3QgbHJ1KQorc3RhdGljIGludCBjYWxjX2luYWN0aXZlX3JhdGlvKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywgdW5zaWduZWQgbG9uZyAqcHJlc2VudF9wYWdlcykKIHsKLQlsb25nIG5yX3BhZ2VzOworCXVuc2lnbmVkIGxvbmcgYWN0aXZlOworCXVuc2lnbmVkIGxvbmcgaW5hY3RpdmU7CisJdW5zaWduZWQgbG9uZyBnYjsKKwl1bnNpZ25lZCBsb25nIGluYWN0aXZlX3JhdGlvOworCisJaW5hY3RpdmUgPSBtZW1fY2dyb3VwX2dldF9hbGxfem9uZXN0YXQobWVtY2csIExSVV9JTkFDVElWRV9BTk9OKTsKKwlhY3RpdmUgPSBtZW1fY2dyb3VwX2dldF9hbGxfem9uZXN0YXQobWVtY2csIExSVV9BQ1RJVkVfQU5PTik7CisKKwlnYiA9IChpbmFjdGl2ZSArIGFjdGl2ZSkgPj4gKDMwIC0gUEFHRV9TSElGVCk7CisJaWYgKGdiKQorCQlpbmFjdGl2ZV9yYXRpbyA9IGludF9zcXJ0KDEwICogZ2IpOworCWVsc2UKKwkJaW5hY3RpdmVfcmF0aW8gPSAxOworCisJaWYgKHByZXNlbnRfcGFnZXMpIHsKKwkJcHJlc2VudF9wYWdlc1swXSA9IGluYWN0aXZlOworCQlwcmVzZW50X3BhZ2VzWzFdID0gYWN0aXZlOworCX0KKworCXJldHVybiBpbmFjdGl2ZV9yYXRpbzsKK30KKworaW50IG1lbV9jZ3JvdXBfaW5hY3RpdmVfYW5vbl9pc19sb3coc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnKQoreworCXVuc2lnbmVkIGxvbmcgYWN0aXZlOworCXVuc2lnbmVkIGxvbmcgaW5hY3RpdmU7CisJdW5zaWduZWQgbG9uZyBwcmVzZW50X3BhZ2VzWzJdOworCXVuc2lnbmVkIGxvbmcgaW5hY3RpdmVfcmF0aW87CisKKwlpbmFjdGl2ZV9yYXRpbyA9IGNhbGNfaW5hY3RpdmVfcmF0aW8obWVtY2csIHByZXNlbnRfcGFnZXMpOworCisJaW5hY3RpdmUgPSBwcmVzZW50X3BhZ2VzWzBdOworCWFjdGl2ZSA9IHByZXNlbnRfcGFnZXNbMV07CisKKwlpZiAoaW5hY3RpdmUgKiBpbmFjdGl2ZV9yYXRpbyA8IGFjdGl2ZSkKKwkJcmV0dXJuIDE7CisKKwlyZXR1cm4gMDsKK30KKwordW5zaWduZWQgbG9uZyBtZW1fY2dyb3VwX3pvbmVfbnJfcGFnZXMoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLAorCQkJCSAgICAgICBzdHJ1Y3Qgem9uZSAqem9uZSwKKwkJCQkgICAgICAgZW51bSBscnVfbGlzdCBscnUpCit7CiAJaW50IG5pZCA9IHpvbmUtPnpvbmVfcGdkYXQtPm5vZGVfaWQ7CiAJaW50IHppZCA9IHpvbmVfaWR4KHpvbmUpOwotCXN0cnVjdCBtZW1fY2dyb3VwX3Blcl96b25lICpteiA9IG1lbV9jZ3JvdXBfem9uZWluZm8obWVtLCBuaWQsIHppZCk7CisJc3RydWN0IG1lbV9jZ3JvdXBfcGVyX3pvbmUgKm16ID0gbWVtX2Nncm91cF96b25laW5mbyhtZW1jZywgbmlkLCB6aWQpOwogCi0JbnJfcGFnZXMgPSBNRU1fQ0dST1VQX1pTVEFUKG16LCBscnUpOworCXJldHVybiBNRU1fQ0dST1VQX1pTVEFUKG16LCBscnUpOworfQogCi0JcmV0dXJuIChucl9wYWdlcyA+PiBwcmlvcml0eSk7CitzdHJ1Y3Qgem9uZV9yZWNsYWltX3N0YXQgKm1lbV9jZ3JvdXBfZ2V0X3JlY2xhaW1fc3RhdChzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csCisJCQkJCQkgICAgICBzdHJ1Y3Qgem9uZSAqem9uZSkKK3sKKwlpbnQgbmlkID0gem9uZS0+em9uZV9wZ2RhdC0+bm9kZV9pZDsKKwlpbnQgemlkID0gem9uZV9pZHgoem9uZSk7CisJc3RydWN0IG1lbV9jZ3JvdXBfcGVyX3pvbmUgKm16ID0gbWVtX2Nncm91cF96b25laW5mbyhtZW1jZywgbmlkLCB6aWQpOworCisJcmV0dXJuICZtei0+cmVjbGFpbV9zdGF0OworfQorCitzdHJ1Y3Qgem9uZV9yZWNsYWltX3N0YXQgKgorbWVtX2Nncm91cF9nZXRfcmVjbGFpbV9zdGF0X2Zyb21fcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwlzdHJ1Y3QgcGFnZV9jZ3JvdXAgKnBjOworCXN0cnVjdCBtZW1fY2dyb3VwX3Blcl96b25lICptejsKKworCWlmIChtZW1fY2dyb3VwX2Rpc2FibGVkKCkpCisJCXJldHVybiBOVUxMOworCisJcGMgPSBsb29rdXBfcGFnZV9jZ3JvdXAocGFnZSk7CisJLyoKKwkgKiBVc2VkIGJpdCBpcyBzZXQgd2l0aG91dCBhdG9taWMgb3BzIGJ1dCBhZnRlciBzbXBfd21iKCkuCisJICogRm9yIG1ha2luZyBwYy0+bWVtX2Nncm91cCB2aXNpYmxlLCBpbnNlcnQgc21wX3JtYigpIGhlcmUuCisJICovCisJc21wX3JtYigpOworCWlmICghUGFnZUNncm91cFVzZWQocGMpKQorCQlyZXR1cm4gTlVMTDsKKworCW16ID0gcGFnZV9jZ3JvdXBfem9uZWluZm8ocGMpOworCWlmICghbXopCisJCXJldHVybiBOVUxMOworCisJcmV0dXJuICZtei0+cmVjbGFpbV9zdGF0OwogfQogCiB1bnNpZ25lZCBsb25nIG1lbV9jZ3JvdXBfaXNvbGF0ZV9wYWdlcyh1bnNpZ25lZCBsb25nIG5yX3RvX3NjYW4sCkBAIC00MjksNDQgKzYwMyw0NjkgQEAKIAlteiA9IG1lbV9jZ3JvdXBfem9uZWluZm8obWVtX2NvbnQsIG5pZCwgemlkKTsKIAlzcmMgPSAmbXotPmxpc3RzW2xydV07CiAKLQlzcGluX2xvY2soJm16LT5scnVfbG9jayk7CiAJc2NhbiA9IDA7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlX3JldmVyc2UocGMsIHRtcCwgc3JjLCBscnUpIHsKIAkJaWYgKHNjYW4gPj0gbnJfdG9fc2NhbikKIAkJCWJyZWFrOworCisJCXBhZ2UgPSBwYy0+cGFnZTsKIAkJaWYgKHVubGlrZWx5KCFQYWdlQ2dyb3VwVXNlZChwYykpKQogCQkJY29udGludWU7Ci0JCXBhZ2UgPSBwYy0+cGFnZTsKLQogCQlpZiAodW5saWtlbHkoIVBhZ2VMUlUocGFnZSkpKQogCQkJY29udGludWU7CiAKLQkJLyoKLQkJICogVE9ETzogcGxheSBiZXR0ZXIgd2l0aCBsdW1weSByZWNsYWltLCBncmFiYmluZyBhbnl0aGluZy4KLQkJICovCi0JCWlmIChQYWdlVW5ldmljdGFibGUocGFnZSkgfHwKLQkJICAgIChQYWdlQWN0aXZlKHBhZ2UpICYmICFhY3RpdmUpIHx8Ci0JCSAgICAoIVBhZ2VBY3RpdmUocGFnZSkgJiYgYWN0aXZlKSkgewotCQkJX19tZW1fY2dyb3VwX21vdmVfbGlzdHMocGMsIHBhZ2VfbHJ1KHBhZ2UpKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0KIAkJc2NhbisrOwotCQlsaXN0X21vdmUoJnBjLT5scnUsICZwY19saXN0KTsKLQogCQlpZiAoX19pc29sYXRlX2xydV9wYWdlKHBhZ2UsIG1vZGUsIGZpbGUpID09IDApIHsKIAkJCWxpc3RfbW92ZSgmcGFnZS0+bHJ1LCBkc3QpOwogCQkJbnJfdGFrZW4rKzsKIAkJfQogCX0KIAotCWxpc3Rfc3BsaWNlKCZwY19saXN0LCBzcmMpOwotCXNwaW5fdW5sb2NrKCZtei0+bHJ1X2xvY2spOwotCiAJKnNjYW5uZWQgPSBzY2FuOwogCXJldHVybiBucl90YWtlbjsKIH0KIAorI2RlZmluZSBtZW1fY2dyb3VwX2Zyb21fcmVzX2NvdW50ZXIoY291bnRlciwgbWVtYmVyKQlcCisJY29udGFpbmVyX29mKGNvdW50ZXIsIHN0cnVjdCBtZW1fY2dyb3VwLCBtZW1iZXIpCisKKy8qCisgKiBUaGlzIHJvdXRpbmUgZmluZHMgdGhlIERGUyB3YWxrIHN1Y2Nlc3Nvci4gVGhpcyByb3V0aW5lIHNob3VsZCBiZQorICogY2FsbGVkIHdpdGggaGllcmFyY2h5X211dGV4IGhlbGQKKyAqLworc3RhdGljIHN0cnVjdCBtZW1fY2dyb3VwICoKK19fbWVtX2Nncm91cF9nZXRfbmV4dF9ub2RlKHN0cnVjdCBtZW1fY2dyb3VwICpjdXJyLCBzdHJ1Y3QgbWVtX2Nncm91cCAqcm9vdF9tZW0pCit7CisJc3RydWN0IGNncm91cCAqY2dyb3VwLCAqY3Vycl9jZ3JvdXAsICpyb290X2Nncm91cDsKKworCWN1cnJfY2dyb3VwID0gY3Vyci0+Y3NzLmNncm91cDsKKwlyb290X2Nncm91cCA9IHJvb3RfbWVtLT5jc3MuY2dyb3VwOworCisJaWYgKCFsaXN0X2VtcHR5KCZjdXJyX2Nncm91cC0+Y2hpbGRyZW4pKSB7CisJCS8qCisJCSAqIFdhbGsgZG93biB0byBjaGlsZHJlbgorCQkgKi8KKwkJY2dyb3VwID0gbGlzdF9lbnRyeShjdXJyX2Nncm91cC0+Y2hpbGRyZW4ubmV4dCwKKwkJCQkJCXN0cnVjdCBjZ3JvdXAsIHNpYmxpbmcpOworCQljdXJyID0gbWVtX2Nncm91cF9mcm9tX2NvbnQoY2dyb3VwKTsKKwkJZ290byBkb25lOworCX0KKwordmlzaXRfcGFyZW50OgorCWlmIChjdXJyX2Nncm91cCA9PSByb290X2Nncm91cCkgeworCQkvKiBjYWxsZXIgaGFuZGxlcyBOVUxMIGNhc2UgKi8KKwkJY3VyciA9IE5VTEw7CisJCWdvdG8gZG9uZTsKKwl9CisKKwkvKgorCSAqIEdvdG8gbmV4dCBzaWJsaW5nCisJICovCisJaWYgKGN1cnJfY2dyb3VwLT5zaWJsaW5nLm5leHQgIT0gJmN1cnJfY2dyb3VwLT5wYXJlbnQtPmNoaWxkcmVuKSB7CisJCWNncm91cCA9IGxpc3RfZW50cnkoY3Vycl9jZ3JvdXAtPnNpYmxpbmcubmV4dCwgc3RydWN0IGNncm91cCwKKwkJCQkJCXNpYmxpbmcpOworCQljdXJyID0gbWVtX2Nncm91cF9mcm9tX2NvbnQoY2dyb3VwKTsKKwkJZ290byBkb25lOworCX0KKworCS8qCisJICogR28gdXAgdG8gbmV4dCBwYXJlbnQgYW5kIG5leHQgcGFyZW50J3Mgc2libGluZyBpZiBuZWVkIGJlCisJICovCisJY3Vycl9jZ3JvdXAgPSBjdXJyX2Nncm91cC0+cGFyZW50OworCWdvdG8gdmlzaXRfcGFyZW50OworCitkb25lOgorCXJldHVybiBjdXJyOworfQorCisvKgorICogVmlzaXQgdGhlIGZpcnN0IGNoaWxkIChuZWVkIG5vdCBiZSB0aGUgZmlyc3QgY2hpbGQgYXMgcGVyIHRoZSBvcmRlcmluZworICogb2YgdGhlIGNncm91cCBsaXN0LCBzaW5jZSB3ZSB0cmFjayBsYXN0X3NjYW5uZWRfY2hpbGQpIG9mIEBtZW0gYW5kIHVzZQorICogdGhhdCB0byByZWNsYWltIGZyZWUgcGFnZXMgZnJvbS4KKyAqLworc3RhdGljIHN0cnVjdCBtZW1fY2dyb3VwICoKK21lbV9jZ3JvdXBfZ2V0X25leHRfbm9kZShzdHJ1Y3QgbWVtX2Nncm91cCAqcm9vdF9tZW0pCit7CisJc3RydWN0IGNncm91cCAqY2dyb3VwOworCXN0cnVjdCBtZW1fY2dyb3VwICpvcmlnLCAqbmV4dDsKKwlib29sIG9ic29sZXRlOworCisJLyoKKwkgKiBTY2FuIGFsbCBjaGlsZHJlbiB1bmRlciB0aGUgbWVtX2Nncm91cCBtZW0KKwkgKi8KKwltdXRleF9sb2NrKCZtZW1fY2dyb3VwX3N1YnN5cy5oaWVyYXJjaHlfbXV0ZXgpOworCisJb3JpZyA9IHJvb3RfbWVtLT5sYXN0X3NjYW5uZWRfY2hpbGQ7CisJb2Jzb2xldGUgPSBtZW1fY2dyb3VwX2lzX29ic29sZXRlKG9yaWcpOworCisJaWYgKGxpc3RfZW1wdHkoJnJvb3RfbWVtLT5jc3MuY2dyb3VwLT5jaGlsZHJlbikpIHsKKwkJLyoKKwkJICogcm9vdF9tZW0gbWlnaHQgaGF2ZSBjaGlsZHJlbiBiZWZvcmUgYW5kIGxhc3Rfc2Nhbm5lZF9jaGlsZAorCQkgKiBtYXkgcG9pbnQgdG8gb25lIG9mIHRoZW0uIFdlIHB1dCBpdCBsYXRlci4KKwkJICovCisJCWlmIChvcmlnKQorCQkJVk1fQlVHX09OKCFvYnNvbGV0ZSk7CisJCW5leHQgPSBOVUxMOworCQlnb3RvIGRvbmU7CisJfQorCisJaWYgKCFvcmlnIHx8IG9ic29sZXRlKSB7CisJCWNncm91cCA9IGxpc3RfZmlyc3RfZW50cnkoJnJvb3RfbWVtLT5jc3MuY2dyb3VwLT5jaGlsZHJlbiwKKwkJCQlzdHJ1Y3QgY2dyb3VwLCBzaWJsaW5nKTsKKwkJbmV4dCA9IG1lbV9jZ3JvdXBfZnJvbV9jb250KGNncm91cCk7CisJfSBlbHNlCisJCW5leHQgPSBfX21lbV9jZ3JvdXBfZ2V0X25leHRfbm9kZShvcmlnLCByb290X21lbSk7CisKK2RvbmU6CisJaWYgKG5leHQpCisJCW1lbV9jZ3JvdXBfZ2V0KG5leHQpOworCXJvb3RfbWVtLT5sYXN0X3NjYW5uZWRfY2hpbGQgPSBuZXh0OworCWlmIChvcmlnKQorCQltZW1fY2dyb3VwX3B1dChvcmlnKTsKKwltdXRleF91bmxvY2soJm1lbV9jZ3JvdXBfc3Vic3lzLmhpZXJhcmNoeV9tdXRleCk7CisJcmV0dXJuIChuZXh0KSA/IG5leHQgOiByb290X21lbTsKK30KKworc3RhdGljIGJvb2wgbWVtX2Nncm91cF9jaGVja191bmRlcl9saW1pdChzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtKQoreworCWlmIChkb19zd2FwX2FjY291bnQpIHsKKwkJaWYgKHJlc19jb3VudGVyX2NoZWNrX3VuZGVyX2xpbWl0KCZtZW0tPnJlcykgJiYKKwkJCXJlc19jb3VudGVyX2NoZWNrX3VuZGVyX2xpbWl0KCZtZW0tPm1lbXN3KSkKKwkJCXJldHVybiB0cnVlOworCX0gZWxzZQorCQlpZiAocmVzX2NvdW50ZXJfY2hlY2tfdW5kZXJfbGltaXQoJm1lbS0+cmVzKSkKKwkJCXJldHVybiB0cnVlOworCXJldHVybiBmYWxzZTsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBnZXRfc3dhcHBpbmVzcyhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2cpCit7CisJc3RydWN0IGNncm91cCAqY2dycCA9IG1lbWNnLT5jc3MuY2dyb3VwOworCXVuc2lnbmVkIGludCBzd2FwcGluZXNzOworCisJLyogcm9vdCA/ICovCisJaWYgKGNncnAtPnBhcmVudCA9PSBOVUxMKQorCQlyZXR1cm4gdm1fc3dhcHBpbmVzczsKKworCXNwaW5fbG9jaygmbWVtY2ctPnJlY2xhaW1fcGFyYW1fbG9jayk7CisJc3dhcHBpbmVzcyA9IG1lbWNnLT5zd2FwcGluZXNzOworCXNwaW5fdW5sb2NrKCZtZW1jZy0+cmVjbGFpbV9wYXJhbV9sb2NrKTsKKworCXJldHVybiBzd2FwcGluZXNzOworfQorCisvKgorICogRGFuY2UgZG93biB0aGUgaGllcmFyY2h5IGlmIG5lZWRlZCB0byByZWNsYWltIG1lbW9yeS4gV2UgcmVtZW1iZXIgdGhlCisgKiBsYXN0IGNoaWxkIHdlIHJlY2xhaW1lZCBmcm9tLCBzbyB0aGF0IHdlIGRvbid0IGVuZCB1cCBwZW5hbGl6aW5nCisgKiBvbmUgY2hpbGQgZXh0ZW5zaXZlbHkgYmFzZWQgb24gaXRzIHBvc2l0aW9uIGluIHRoZSBjaGlsZHJlbiBsaXN0LgorICoKKyAqIHJvb3RfbWVtIGlzIHRoZSBvcmlnaW5hbCBhbmNlc3RvciB0aGF0IHdlJ3ZlIGJlZW4gcmVjbGFpbSBmcm9tLgorICovCitzdGF0aWMgaW50IG1lbV9jZ3JvdXBfaGllcmFyY2hpY2FsX3JlY2xhaW0oc3RydWN0IG1lbV9jZ3JvdXAgKnJvb3RfbWVtLAorCQkJCQkJZ2ZwX3QgZ2ZwX21hc2ssIGJvb2wgbm9zd2FwKQoreworCXN0cnVjdCBtZW1fY2dyb3VwICpuZXh0X21lbTsKKwlpbnQgcmV0ID0gMDsKKworCS8qCisJICogUmVjbGFpbSB1bmNvbmRpdGlvbmFsbHkgYW5kIGRvbid0IGNoZWNrIGZvciByZXR1cm4gdmFsdWUuCisJICogV2UgbmVlZCB0byByZWNsYWltIGluIHRoZSBjdXJyZW50IGdyb3VwIGFuZCBkb3duIHRoZSB0cmVlLgorCSAqIE9uZSBtaWdodCB0aGluayBhYm91dCBjaGVja2luZyBmb3IgY2hpbGRyZW4gYmVmb3JlIHJlY2xhaW1pbmcsCisJICogYnV0IHRoZXJlIG1pZ2h0IGJlIGxlZnQgb3ZlciBhY2NvdW50aW5nLCBldmVuIGFmdGVyIGNoaWxkcmVuCisJICogaGF2ZSBsZWZ0LgorCSAqLworCXJldCArPSB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKHJvb3RfbWVtLCBnZnBfbWFzaywgbm9zd2FwLAorCQkJCQkgICBnZXRfc3dhcHBpbmVzcyhyb290X21lbSkpOworCWlmIChtZW1fY2dyb3VwX2NoZWNrX3VuZGVyX2xpbWl0KHJvb3RfbWVtKSkKKwkJcmV0dXJuIDE7CS8qIGluZGljYXRlIHJlY2xhaW0gaGFzIHN1Y2NlZWRlZCAqLworCWlmICghcm9vdF9tZW0tPnVzZV9oaWVyYXJjaHkpCisJCXJldHVybiByZXQ7CisKKwluZXh0X21lbSA9IG1lbV9jZ3JvdXBfZ2V0X25leHRfbm9kZShyb290X21lbSk7CisKKwl3aGlsZSAobmV4dF9tZW0gIT0gcm9vdF9tZW0pIHsKKwkJaWYgKG1lbV9jZ3JvdXBfaXNfb2Jzb2xldGUobmV4dF9tZW0pKSB7CisJCQluZXh0X21lbSA9IG1lbV9jZ3JvdXBfZ2V0X25leHRfbm9kZShyb290X21lbSk7CisJCQljb250aW51ZTsKKwkJfQorCQlyZXQgKz0gdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcyhuZXh0X21lbSwgZ2ZwX21hc2ssIG5vc3dhcCwKKwkJCQkJCSAgIGdldF9zd2FwcGluZXNzKG5leHRfbWVtKSk7CisJCWlmIChtZW1fY2dyb3VwX2NoZWNrX3VuZGVyX2xpbWl0KHJvb3RfbWVtKSkKKwkJCXJldHVybiAxOwkvKiBpbmRpY2F0ZSByZWNsYWltIGhhcyBzdWNjZWVkZWQgKi8KKwkJbmV4dF9tZW0gPSBtZW1fY2dyb3VwX2dldF9uZXh0X25vZGUocm9vdF9tZW0pOworCX0KKwlyZXR1cm4gcmV0OworfQorCitib29sIG1lbV9jZ3JvdXBfb29tX2NhbGxlZChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spCit7CisJYm9vbCByZXQgPSBmYWxzZTsKKwlzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtOworCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tOworCisJcmN1X3JlYWRfbG9jaygpOworCW1tID0gdGFzay0+bW07CisJaWYgKCFtbSkKKwkJbW0gPSAmaW5pdF9tbTsKKwltZW0gPSBtZW1fY2dyb3VwX2Zyb21fdGFzayhyY3VfZGVyZWZlcmVuY2UobW0tPm93bmVyKSk7CisJaWYgKG1lbSAmJiB0aW1lX2JlZm9yZShqaWZmaWVzLCBtZW0tPmxhc3Rfb29tX2ppZmZpZXMgKyBIWi8xMCkpCisJCXJldCA9IHRydWU7CisJcmN1X3JlYWRfdW5sb2NrKCk7CisJcmV0dXJuIHJldDsKK30KKy8qCisgKiBVbmxpa2UgZXhwb3J0ZWQgaW50ZXJmYWNlLCAib29tIiBwYXJhbWV0ZXIgaXMgYWRkZWQuIGlmIG9vbT09dHJ1ZSwKKyAqIG9vbS1raWxsZXIgY2FuIGJlIGludm9rZWQuCisgKi8KK3N0YXRpYyBpbnQgX19tZW1fY2dyb3VwX3RyeV9jaGFyZ2Uoc3RydWN0IG1tX3N0cnVjdCAqbW0sCisJCQlnZnBfdCBnZnBfbWFzaywgc3RydWN0IG1lbV9jZ3JvdXAgKiptZW1jZywKKwkJCWJvb2wgb29tKQoreworCXN0cnVjdCBtZW1fY2dyb3VwICptZW0sICptZW1fb3Zlcl9saW1pdDsKKwlpbnQgbnJfcmV0cmllcyA9IE1FTV9DR1JPVVBfUkVDTEFJTV9SRVRSSUVTOworCXN0cnVjdCByZXNfY291bnRlciAqZmFpbF9yZXM7CisKKwlpZiAodW5saWtlbHkodGVzdF90aHJlYWRfZmxhZyhUSUZfTUVNRElFKSkpIHsKKwkJLyogRG9uJ3QgYWNjb3VudCB0aGlzISAqLworCQkqbWVtY2cgPSBOVUxMOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKgorCSAqIFdlIGFsd2F5cyBjaGFyZ2UgdGhlIGNncm91cCB0aGUgbW1fc3RydWN0IGJlbG9uZ3MgdG8uCisJICogVGhlIG1tX3N0cnVjdCdzIG1lbV9jZ3JvdXAgY2hhbmdlcyBvbiB0YXNrIG1pZ3JhdGlvbiBpZiB0aGUKKwkgKiB0aHJlYWQgZ3JvdXAgbGVhZGVyIG1pZ3JhdGVzLiBJdCdzIHBvc3NpYmxlIHRoYXQgbW0gaXMgbm90CisJICogc2V0LCBpZiBzbyBjaGFyZ2UgdGhlIGluaXRfbW0gKGhhcHBlbnMgZm9yIHBhZ2VjYWNoZSB1c2FnZSkuCisJICovCisJbWVtID0gKm1lbWNnOworCWlmIChsaWtlbHkoIW1lbSkpIHsKKwkJbWVtID0gdHJ5X2dldF9tZW1fY2dyb3VwX2Zyb21fbW0obW0pOworCQkqbWVtY2cgPSBtZW07CisJfSBlbHNlIHsKKwkJY3NzX2dldCgmbWVtLT5jc3MpOworCX0KKwlpZiAodW5saWtlbHkoIW1lbSkpCisJCXJldHVybiAwOworCisJVk1fQlVHX09OKG1lbV9jZ3JvdXBfaXNfb2Jzb2xldGUobWVtKSk7CisKKwl3aGlsZSAoMSkgeworCQlpbnQgcmV0OworCQlib29sIG5vc3dhcCA9IGZhbHNlOworCisJCXJldCA9IHJlc19jb3VudGVyX2NoYXJnZSgmbWVtLT5yZXMsIFBBR0VfU0laRSwgJmZhaWxfcmVzKTsKKwkJaWYgKGxpa2VseSghcmV0KSkgeworCQkJaWYgKCFkb19zd2FwX2FjY291bnQpCisJCQkJYnJlYWs7CisJCQlyZXQgPSByZXNfY291bnRlcl9jaGFyZ2UoJm1lbS0+bWVtc3csIFBBR0VfU0laRSwKKwkJCQkJCQkmZmFpbF9yZXMpOworCQkJaWYgKGxpa2VseSghcmV0KSkKKwkJCQlicmVhazsKKwkJCS8qIG1lbStzd2FwIGNvdW50ZXIgZmFpbHMgKi8KKwkJCXJlc19jb3VudGVyX3VuY2hhcmdlKCZtZW0tPnJlcywgUEFHRV9TSVpFKTsKKwkJCW5vc3dhcCA9IHRydWU7CisJCQltZW1fb3Zlcl9saW1pdCA9IG1lbV9jZ3JvdXBfZnJvbV9yZXNfY291bnRlcihmYWlsX3JlcywKKwkJCQkJCQkJCW1lbXN3KTsKKwkJfSBlbHNlCisJCQkvKiBtZW0gY291bnRlciBmYWlscyAqLworCQkJbWVtX292ZXJfbGltaXQgPSBtZW1fY2dyb3VwX2Zyb21fcmVzX2NvdW50ZXIoZmFpbF9yZXMsCisJCQkJCQkJCQlyZXMpOworCisJCWlmICghKGdmcF9tYXNrICYgX19HRlBfV0FJVCkpCisJCQlnb3RvIG5vbWVtOworCisJCXJldCA9IG1lbV9jZ3JvdXBfaGllcmFyY2hpY2FsX3JlY2xhaW0obWVtX292ZXJfbGltaXQsIGdmcF9tYXNrLAorCQkJCQkJCW5vc3dhcCk7CisJCWlmIChyZXQpCisJCQljb250aW51ZTsKKworCQkvKgorCQkgKiB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKCkgbWlnaHQgbm90IGdpdmUgdXMgYSBmdWxsCisJCSAqIHBpY3R1cmUgb2YgcmVjbGFpbS4gU29tZSBwYWdlcyBhcmUgcmVjbGFpbWVkIGFuZCBtaWdodCBiZQorCQkgKiBtb3ZlZCB0byBzd2FwIGNhY2hlIG9yIGp1c3QgdW5tYXBwZWQgZnJvbSB0aGUgY2dyb3VwLgorCQkgKiBDaGVjayB0aGUgbGltaXQgYWdhaW4gdG8gc2VlIGlmIHRoZSByZWNsYWltIHJlZHVjZWQgdGhlCisJCSAqIGN1cnJlbnQgdXNhZ2Ugb2YgdGhlIGNncm91cCBiZWZvcmUgZ2l2aW5nIHVwCisJCSAqCisJCSAqLworCQlpZiAobWVtX2Nncm91cF9jaGVja191bmRlcl9saW1pdChtZW1fb3Zlcl9saW1pdCkpCisJCQljb250aW51ZTsKKworCQlpZiAoIW5yX3JldHJpZXMtLSkgeworCQkJaWYgKG9vbSkgeworCQkJCW11dGV4X2xvY2soJm1lbWNnX3Rhc2tsaXN0KTsKKwkJCQltZW1fY2dyb3VwX291dF9vZl9tZW1vcnkobWVtX292ZXJfbGltaXQsIGdmcF9tYXNrKTsKKwkJCQltdXRleF91bmxvY2soJm1lbWNnX3Rhc2tsaXN0KTsKKwkJCQltZW1fb3Zlcl9saW1pdC0+bGFzdF9vb21famlmZmllcyA9IGppZmZpZXM7CisJCQl9CisJCQlnb3RvIG5vbWVtOworCQl9CisJfQorCXJldHVybiAwOworbm9tZW06CisJY3NzX3B1dCgmbWVtLT5jc3MpOworCXJldHVybiAtRU5PTUVNOworfQorCitzdGF0aWMgc3RydWN0IG1lbV9jZ3JvdXAgKnRyeV9nZXRfbWVtX2Nncm91cF9mcm9tX3N3YXBjYWNoZShzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwlzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtOworCXN3cF9lbnRyeV90IGVudDsKKworCWlmICghUGFnZVN3YXBDYWNoZShwYWdlKSkKKwkJcmV0dXJuIE5VTEw7CisKKwllbnQudmFsID0gcGFnZV9wcml2YXRlKHBhZ2UpOworCW1lbSA9IGxvb2t1cF9zd2FwX2Nncm91cChlbnQpOworCWlmICghbWVtKQorCQlyZXR1cm4gTlVMTDsKKwlpZiAoIWNzc190cnlnZXQoJm1lbS0+Y3NzKSkKKwkJcmV0dXJuIE5VTEw7CisJcmV0dXJuIG1lbTsKK30KKworLyoKKyAqIGNvbW1pdCBhIGNoYXJnZSBnb3QgYnkgX19tZW1fY2dyb3VwX3RyeV9jaGFyZ2UoKSBhbmQgbWFrZXMgcGFnZV9jZ3JvdXAgdG8gYmUKKyAqIFVTRUQgc3RhdGUuIElmIGFscmVhZHkgVVNFRCwgdW5jaGFyZ2UgYW5kIHJldHVybi4KKyAqLworCitzdGF0aWMgdm9pZCBfX21lbV9jZ3JvdXBfY29tbWl0X2NoYXJnZShzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtLAorCQkJCSAgICAgc3RydWN0IHBhZ2VfY2dyb3VwICpwYywKKwkJCQkgICAgIGVudW0gY2hhcmdlX3R5cGUgY3R5cGUpCit7CisJLyogdHJ5X2NoYXJnZSgpIGNhbiByZXR1cm4gTlVMTCB0byAqbWVtY2csIHRha2luZyBjYXJlIG9mIGl0LiAqLworCWlmICghbWVtKQorCQlyZXR1cm47CisKKwlsb2NrX3BhZ2VfY2dyb3VwKHBjKTsKKwlpZiAodW5saWtlbHkoUGFnZUNncm91cFVzZWQocGMpKSkgeworCQl1bmxvY2tfcGFnZV9jZ3JvdXAocGMpOworCQlyZXNfY291bnRlcl91bmNoYXJnZSgmbWVtLT5yZXMsIFBBR0VfU0laRSk7CisJCWlmIChkb19zd2FwX2FjY291bnQpCisJCQlyZXNfY291bnRlcl91bmNoYXJnZSgmbWVtLT5tZW1zdywgUEFHRV9TSVpFKTsKKwkJY3NzX3B1dCgmbWVtLT5jc3MpOworCQlyZXR1cm47CisJfQorCXBjLT5tZW1fY2dyb3VwID0gbWVtOworCXNtcF93bWIoKTsKKwlwYy0+ZmxhZ3MgPSBwY2dfZGVmYXVsdF9mbGFnc1tjdHlwZV07CisKKwltZW1fY2dyb3VwX2NoYXJnZV9zdGF0aXN0aWNzKG1lbSwgcGMsIHRydWUpOworCisJdW5sb2NrX3BhZ2VfY2dyb3VwKHBjKTsKK30KKworLyoqCisgKiBtZW1fY2dyb3VwX21vdmVfYWNjb3VudCAtIG1vdmUgYWNjb3VudCBvZiB0aGUgcGFnZQorICogQHBjOglwYWdlX2Nncm91cCBvZiB0aGUgcGFnZS4KKyAqIEBmcm9tOiBtZW1fY2dyb3VwIHdoaWNoIHRoZSBwYWdlIGlzIG1vdmVkIGZyb20uCisgKiBAdG86CW1lbV9jZ3JvdXAgd2hpY2ggdGhlIHBhZ2UgaXMgbW92ZWQgdG8uIEBmcm9tICE9IEB0by4KKyAqCisgKiBUaGUgY2FsbGVyIG11c3QgY29uZmlybSBmb2xsb3dpbmcuCisgKiAtIHBhZ2UgaXMgbm90IG9uIExSVSAoaXNvbGF0ZV9wYWdlKCkgaXMgdXNlZnVsLikKKyAqCisgKiByZXR1cm5zIDAgYXQgc3VjY2VzcywKKyAqIHJldHVybnMgLUVCVVNZIHdoZW4gbG9jayBpcyBidXN5IG9yICJwYyIgaXMgdW5zdGFibGUuCisgKgorICogVGhpcyBmdW5jdGlvbiBkb2VzICJ1bmNoYXJnZSIgZnJvbSBvbGQgY2dyb3VwIGJ1dCBkb2Vzbid0IGRvICJjaGFyZ2UiIHRvCisgKiBuZXcgY2dyb3VwLiBJdCBzaG91bGQgYmUgZG9uZSBieSBhIGNhbGxlci4KKyAqLworCitzdGF0aWMgaW50IG1lbV9jZ3JvdXBfbW92ZV9hY2NvdW50KHN0cnVjdCBwYWdlX2Nncm91cCAqcGMsCisJc3RydWN0IG1lbV9jZ3JvdXAgKmZyb20sIHN0cnVjdCBtZW1fY2dyb3VwICp0bykKK3sKKwlzdHJ1Y3QgbWVtX2Nncm91cF9wZXJfem9uZSAqZnJvbV9teiwgKnRvX216OworCWludCBuaWQsIHppZDsKKwlpbnQgcmV0ID0gLUVCVVNZOworCisJVk1fQlVHX09OKGZyb20gPT0gdG8pOworCVZNX0JVR19PTihQYWdlTFJVKHBjLT5wYWdlKSk7CisKKwluaWQgPSBwYWdlX2Nncm91cF9uaWQocGMpOworCXppZCA9IHBhZ2VfY2dyb3VwX3ppZChwYyk7CisJZnJvbV9teiA9ICBtZW1fY2dyb3VwX3pvbmVpbmZvKGZyb20sIG5pZCwgemlkKTsKKwl0b19teiA9ICBtZW1fY2dyb3VwX3pvbmVpbmZvKHRvLCBuaWQsIHppZCk7CisKKwlpZiAoIXRyeWxvY2tfcGFnZV9jZ3JvdXAocGMpKQorCQlyZXR1cm4gcmV0OworCisJaWYgKCFQYWdlQ2dyb3VwVXNlZChwYykpCisJCWdvdG8gb3V0OworCisJaWYgKHBjLT5tZW1fY2dyb3VwICE9IGZyb20pCisJCWdvdG8gb3V0OworCisJcmVzX2NvdW50ZXJfdW5jaGFyZ2UoJmZyb20tPnJlcywgUEFHRV9TSVpFKTsKKwltZW1fY2dyb3VwX2NoYXJnZV9zdGF0aXN0aWNzKGZyb20sIHBjLCBmYWxzZSk7CisJaWYgKGRvX3N3YXBfYWNjb3VudCkKKwkJcmVzX2NvdW50ZXJfdW5jaGFyZ2UoJmZyb20tPm1lbXN3LCBQQUdFX1NJWkUpOworCWNzc19wdXQoJmZyb20tPmNzcyk7CisKKwljc3NfZ2V0KCZ0by0+Y3NzKTsKKwlwYy0+bWVtX2Nncm91cCA9IHRvOworCW1lbV9jZ3JvdXBfY2hhcmdlX3N0YXRpc3RpY3ModG8sIHBjLCB0cnVlKTsKKwlyZXQgPSAwOworb3V0OgorCXVubG9ja19wYWdlX2Nncm91cChwYyk7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIG1vdmUgY2hhcmdlcyB0byBpdHMgcGFyZW50LgorICovCisKK3N0YXRpYyBpbnQgbWVtX2Nncm91cF9tb3ZlX3BhcmVudChzdHJ1Y3QgcGFnZV9jZ3JvdXAgKnBjLAorCQkJCSAgc3RydWN0IG1lbV9jZ3JvdXAgKmNoaWxkLAorCQkJCSAgZ2ZwX3QgZ2ZwX21hc2spCit7CisJc3RydWN0IHBhZ2UgKnBhZ2UgPSBwYy0+cGFnZTsKKwlzdHJ1Y3QgY2dyb3VwICpjZyA9IGNoaWxkLT5jc3MuY2dyb3VwOworCXN0cnVjdCBjZ3JvdXAgKnBjZyA9IGNnLT5wYXJlbnQ7CisJc3RydWN0IG1lbV9jZ3JvdXAgKnBhcmVudDsKKwlpbnQgcmV0OworCisJLyogSXMgUk9PVCA/ICovCisJaWYgKCFwY2cpCisJCXJldHVybiAtRUlOVkFMOworCisKKwlwYXJlbnQgPSBtZW1fY2dyb3VwX2Zyb21fY29udChwY2cpOworCisKKwlyZXQgPSBfX21lbV9jZ3JvdXBfdHJ5X2NoYXJnZShOVUxMLCBnZnBfbWFzaywgJnBhcmVudCwgZmFsc2UpOworCWlmIChyZXQgfHwgIXBhcmVudCkKKwkJcmV0dXJuIHJldDsKKworCWlmICghZ2V0X3BhZ2VfdW5sZXNzX3plcm8ocGFnZSkpIHsKKwkJcmV0ID0gLUVCVVNZOworCQlnb3RvIHVuY2hhcmdlOworCX0KKworCXJldCA9IGlzb2xhdGVfbHJ1X3BhZ2UocGFnZSk7CisKKwlpZiAocmV0KQorCQlnb3RvIGNhbmNlbDsKKworCXJldCA9IG1lbV9jZ3JvdXBfbW92ZV9hY2NvdW50KHBjLCBjaGlsZCwgcGFyZW50KTsKKworCXB1dGJhY2tfbHJ1X3BhZ2UocGFnZSk7CisJaWYgKCFyZXQpIHsKKwkJcHV0X3BhZ2UocGFnZSk7CisJCS8qIGRyb3AgZXh0cmEgcmVmY250IGJ5IHRyeV9jaGFyZ2UoKSAqLworCQljc3NfcHV0KCZwYXJlbnQtPmNzcyk7CisJCXJldHVybiAwOworCX0KKworY2FuY2VsOgorCXB1dF9wYWdlKHBhZ2UpOwordW5jaGFyZ2U6CisJLyogZHJvcCBleHRyYSByZWZjbnQgYnkgdHJ5X2NoYXJnZSgpICovCisJY3NzX3B1dCgmcGFyZW50LT5jc3MpOworCS8qIHVuY2hhcmdlIGlmIG1vdmUgZmFpbHMgKi8KKwlyZXNfY291bnRlcl91bmNoYXJnZSgmcGFyZW50LT5yZXMsIFBBR0VfU0laRSk7CisJaWYgKGRvX3N3YXBfYWNjb3VudCkKKwkJcmVzX2NvdW50ZXJfdW5jaGFyZ2UoJnBhcmVudC0+bWVtc3csIFBBR0VfU0laRSk7CisJcmV0dXJuIHJldDsKK30KKwogLyoKICAqIENoYXJnZSB0aGUgbWVtb3J5IGNvbnRyb2xsZXIgZm9yIHBhZ2UgdXNhZ2UuCiAgKiBSZXR1cm4KQEAgLTQ3OSw5NSArMTA3OCwyNyBAQAogewogCXN0cnVjdCBtZW1fY2dyb3VwICptZW07CiAJc3RydWN0IHBhZ2VfY2dyb3VwICpwYzsKLQl1bnNpZ25lZCBsb25nIG5yX3JldHJpZXMgPSBNRU1fQ0dST1VQX1JFQ0xBSU1fUkVUUklFUzsKLQlzdHJ1Y3QgbWVtX2Nncm91cF9wZXJfem9uZSAqbXo7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0OwogCiAJcGMgPSBsb29rdXBfcGFnZV9jZ3JvdXAocGFnZSk7CiAJLyogY2FuIGhhcHBlbiBhdCBib290ICovCiAJaWYgKHVubGlrZWx5KCFwYykpCiAJCXJldHVybiAwOwogCXByZWZldGNodyhwYyk7Ci0JLyoKLQkgKiBXZSBhbHdheXMgY2hhcmdlIHRoZSBjZ3JvdXAgdGhlIG1tX3N0cnVjdCBiZWxvbmdzIHRvLgotCSAqIFRoZSBtbV9zdHJ1Y3QncyBtZW1fY2dyb3VwIGNoYW5nZXMgb24gdGFzayBtaWdyYXRpb24gaWYgdGhlCi0JICogdGhyZWFkIGdyb3VwIGxlYWRlciBtaWdyYXRlcy4gSXQncyBwb3NzaWJsZSB0aGF0IG1tIGlzIG5vdAotCSAqIHNldCwgaWYgc28gY2hhcmdlIHRoZSBpbml0X21tIChoYXBwZW5zIGZvciBwYWdlY2FjaGUgdXNhZ2UpLgotCSAqLwogCi0JaWYgKGxpa2VseSghbWVtY2cpKSB7Ci0JCXJjdV9yZWFkX2xvY2soKTsKLQkJbWVtID0gbWVtX2Nncm91cF9mcm9tX3Rhc2socmN1X2RlcmVmZXJlbmNlKG1tLT5vd25lcikpOwotCQlpZiAodW5saWtlbHkoIW1lbSkpIHsKLQkJCXJjdV9yZWFkX3VubG9jaygpOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJLyoKLQkJICogRm9yIGV2ZXJ5IGNoYXJnZSBmcm9tIHRoZSBjZ3JvdXAsIGluY3JlbWVudCByZWZlcmVuY2UgY291bnQKLQkJICovCi0JCWNzc19nZXQoJm1lbS0+Y3NzKTsKLQkJcmN1X3JlYWRfdW5sb2NrKCk7Ci0JfSBlbHNlIHsKLQkJbWVtID0gbWVtY2c7Ci0JCWNzc19nZXQoJm1lbWNnLT5jc3MpOwotCX0KKwltZW0gPSBtZW1jZzsKKwlyZXQgPSBfX21lbV9jZ3JvdXBfdHJ5X2NoYXJnZShtbSwgZ2ZwX21hc2ssICZtZW0sIHRydWUpOworCWlmIChyZXQgfHwgIW1lbSkKKwkJcmV0dXJuIHJldDsKIAotCXdoaWxlICh1bmxpa2VseShyZXNfY291bnRlcl9jaGFyZ2UoJm1lbS0+cmVzLCBQQUdFX1NJWkUpKSkgewotCQlpZiAoIShnZnBfbWFzayAmIF9fR0ZQX1dBSVQpKQotCQkJZ290byBvdXQ7Ci0KLQkJaWYgKHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMobWVtLCBnZnBfbWFzaykpCi0JCQljb250aW51ZTsKLQotCQkvKgotCQkgKiB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKCkgbWlnaHQgbm90IGdpdmUgdXMgYSBmdWxsCi0JCSAqIHBpY3R1cmUgb2YgcmVjbGFpbS4gU29tZSBwYWdlcyBhcmUgcmVjbGFpbWVkIGFuZCBtaWdodCBiZQotCQkgKiBtb3ZlZCB0byBzd2FwIGNhY2hlIG9yIGp1c3QgdW5tYXBwZWQgZnJvbSB0aGUgY2dyb3VwLgotCQkgKiBDaGVjayB0aGUgbGltaXQgYWdhaW4gdG8gc2VlIGlmIHRoZSByZWNsYWltIHJlZHVjZWQgdGhlCi0JCSAqIGN1cnJlbnQgdXNhZ2Ugb2YgdGhlIGNncm91cCBiZWZvcmUgZ2l2aW5nIHVwCi0JCSAqLwotCQlpZiAocmVzX2NvdW50ZXJfY2hlY2tfdW5kZXJfbGltaXQoJm1lbS0+cmVzKSkKLQkJCWNvbnRpbnVlOwotCi0JCWlmICghbnJfcmV0cmllcy0tKSB7Ci0JCQltZW1fY2dyb3VwX291dF9vZl9tZW1vcnkobWVtLCBnZnBfbWFzayk7Ci0JCQlnb3RvIG91dDsKLQkJfQotCX0KLQotCi0JbG9ja19wYWdlX2Nncm91cChwYyk7Ci0JaWYgKHVubGlrZWx5KFBhZ2VDZ3JvdXBVc2VkKHBjKSkpIHsKLQkJdW5sb2NrX3BhZ2VfY2dyb3VwKHBjKTsKLQkJcmVzX2NvdW50ZXJfdW5jaGFyZ2UoJm1lbS0+cmVzLCBQQUdFX1NJWkUpOwotCQljc3NfcHV0KCZtZW0tPmNzcyk7Ci0KLQkJZ290byBkb25lOwotCX0KLQlwYy0+bWVtX2Nncm91cCA9IG1lbTsKLQkvKgotCSAqIElmIGEgcGFnZSBpcyBhY2NvdW50ZWQgYXMgYSBwYWdlIGNhY2hlLCBpbnNlcnQgdG8gaW5hY3RpdmUgbGlzdC4KLQkgKiBJZiBhbm9uLCBpbnNlcnQgdG8gYWN0aXZlIGxpc3QuCi0JICovCi0JcGMtPmZsYWdzID0gcGNnX2RlZmF1bHRfZmxhZ3NbY3R5cGVdOwotCi0JbXogPSBwYWdlX2Nncm91cF96b25laW5mbyhwYyk7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmbXotPmxydV9sb2NrLCBmbGFncyk7Ci0JX19tZW1fY2dyb3VwX2FkZF9saXN0KG16LCBwYyk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbXotPmxydV9sb2NrLCBmbGFncyk7Ci0JdW5sb2NrX3BhZ2VfY2dyb3VwKHBjKTsKLQotZG9uZToKKwlfX21lbV9jZ3JvdXBfY29tbWl0X2NoYXJnZShtZW0sIHBjLCBjdHlwZSk7CiAJcmV0dXJuIDA7Ci1vdXQ6Ci0JY3NzX3B1dCgmbWVtLT5jc3MpOwotCXJldHVybiAtRU5PTUVNOwogfQogCi1pbnQgbWVtX2Nncm91cF9jaGFyZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UsIHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBnZnBfdCBnZnBfbWFzaykKK2ludCBtZW1fY2dyb3VwX25ld3BhZ2VfY2hhcmdlKHN0cnVjdCBwYWdlICpwYWdlLAorCQkJICAgICAgc3RydWN0IG1tX3N0cnVjdCAqbW0sIGdmcF90IGdmcF9tYXNrKQogewotCWlmIChtZW1fY2dyb3VwX3N1YnN5cy5kaXNhYmxlZCkKKwlpZiAobWVtX2Nncm91cF9kaXNhYmxlZCgpKQogCQlyZXR1cm4gMDsKIAlpZiAoUGFnZUNvbXBvdW5kKHBhZ2UpKQogCQlyZXR1cm4gMDsKQEAgLTU4OSw3ICsxMTIwLDEwIEBACiBpbnQgbWVtX2Nncm91cF9jYWNoZV9jaGFyZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UsIHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLAogCQkJCWdmcF90IGdmcF9tYXNrKQogewotCWlmIChtZW1fY2dyb3VwX3N1YnN5cy5kaXNhYmxlZCkKKwlzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtID0gTlVMTDsKKwlpbnQgcmV0OworCisJaWYgKG1lbV9jZ3JvdXBfZGlzYWJsZWQoKSkKIAkJcmV0dXJuIDA7CiAJaWYgKFBhZ2VDb21wb3VuZChwYWdlKSkKIAkJcmV0dXJuIDA7CkBAIC02MDEsNiArMTEzNSw4IEBACiAJICogRm9yIEdGUF9OT1dBSVQgY2FzZSwgdGhlIHBhZ2UgbWF5IGJlIHByZS1jaGFyZ2VkIGJlZm9yZSBjYWxsaW5nCiAJICogYWRkX3RvX3BhZ2VfY2FjaGUoKS4gKFNlZSBzaG1lbS5jKSBjaGVjayBpdCBoZXJlIGFuZCBhdm9pZCB0byBjYWxsCiAJICogY2hhcmdlIHR3aWNlLiAoSXQgd29ya3MgYnV0IGhhcyB0byBwYXkgYSBiaXQgbGFyZ2VyIGNvc3QuKQorCSAqIEFuZCB3aGVuIHRoZSBwYWdlIGlzIFN3YXBDYWNoZSwgaXQgc2hvdWxkIHRha2Ugc3dhcCBpbmZvcm1hdGlvbgorCSAqIGludG8gYWNjb3VudC4gVGhpcyBpcyB1bmRlciBsb2NrX3BhZ2UoKSBub3cuCiAJICovCiAJaWYgKCEoZ2ZwX21hc2sgJiBfX0dGUF9XQUlUKSkgewogCQlzdHJ1Y3QgcGFnZV9jZ3JvdXAgKnBjOwpAQCAtNjE3LDU4ICsxMTUzLDE5OCBAQAogCQl1bmxvY2tfcGFnZV9jZ3JvdXAocGMpOwogCX0KIAotCWlmICh1bmxpa2VseSghbW0pKQorCWlmIChkb19zd2FwX2FjY291bnQgJiYgUGFnZVN3YXBDYWNoZShwYWdlKSkgeworCQltZW0gPSB0cnlfZ2V0X21lbV9jZ3JvdXBfZnJvbV9zd2FwY2FjaGUocGFnZSk7CisJCWlmIChtZW0pCisJCQltbSA9IE5VTEw7CisJCSAgZWxzZQorCQkJbWVtID0gTlVMTDsKKwkJLyogU3dhcENhY2hlIG1heSBiZSBzdGlsbCBsaW5rZWQgdG8gTFJVIG5vdy4gKi8KKwkJbWVtX2Nncm91cF9scnVfZGVsX2JlZm9yZV9jb21taXRfc3dhcGNhY2hlKHBhZ2UpOworCX0KKworCWlmICh1bmxpa2VseSghbW0gJiYgIW1lbSkpCiAJCW1tID0gJmluaXRfbW07CiAKIAlpZiAocGFnZV9pc19maWxlX2NhY2hlKHBhZ2UpKQogCQlyZXR1cm4gbWVtX2Nncm91cF9jaGFyZ2VfY29tbW9uKHBhZ2UsIG1tLCBnZnBfbWFzaywKIAkJCQlNRU1fQ0dST1VQX0NIQVJHRV9UWVBFX0NBQ0hFLCBOVUxMKTsKLQllbHNlCi0JCXJldHVybiBtZW1fY2dyb3VwX2NoYXJnZV9jb21tb24ocGFnZSwgbW0sIGdmcF9tYXNrLAotCQkJCU1FTV9DR1JPVVBfQ0hBUkdFX1RZUEVfU0hNRU0sIE5VTEwpOworCisJcmV0ID0gbWVtX2Nncm91cF9jaGFyZ2VfY29tbW9uKHBhZ2UsIG1tLCBnZnBfbWFzaywKKwkJCQlNRU1fQ0dST1VQX0NIQVJHRV9UWVBFX1NITUVNLCBtZW0pOworCWlmIChtZW0pCisJCWNzc19wdXQoJm1lbS0+Y3NzKTsKKwlpZiAoUGFnZVN3YXBDYWNoZShwYWdlKSkKKwkJbWVtX2Nncm91cF9scnVfYWRkX2FmdGVyX2NvbW1pdF9zd2FwY2FjaGUocGFnZSk7CisKKwlpZiAoZG9fc3dhcF9hY2NvdW50ICYmICFyZXQgJiYgUGFnZVN3YXBDYWNoZShwYWdlKSkgeworCQlzd3BfZW50cnlfdCBlbnQgPSB7LnZhbCA9IHBhZ2VfcHJpdmF0ZShwYWdlKX07CisJCS8qIGF2b2lkIGRvdWJsZSBjb3VudGluZyAqLworCQltZW0gPSBzd2FwX2Nncm91cF9yZWNvcmQoZW50LCBOVUxMKTsKKwkJaWYgKG1lbSkgeworCQkJcmVzX2NvdW50ZXJfdW5jaGFyZ2UoJm1lbS0+bWVtc3csIFBBR0VfU0laRSk7CisJCQltZW1fY2dyb3VwX3B1dChtZW0pOworCQl9CisJfQorCXJldHVybiByZXQ7CiB9CiAKIC8qCisgKiBXaGlsZSBzd2FwLWluLCB0cnlfY2hhcmdlIC0+IGNvbW1pdCBvciBjYW5jZWwsIHRoZSBwYWdlIGlzIGxvY2tlZC4KKyAqIEFuZCB3aGVuIHRyeV9jaGFyZ2UoKSBzdWNjZXNzZnVsbHkgcmV0dXJucywgb25lIHJlZmNudCB0byBtZW1jZyB3aXRob3V0CisgKiBzdHJ1Y3QgcGFnZV9jZ3JvdXAgaXMgYXF1aXJlZC4gVGhpcyByZWZjbnQgd2lsbCBiZSBjdW1zdW1lZCBieQorICogImNvbW1pdCgpIiBvciByZW1vdmVkIGJ5ICJjYW5jZWwoKSIKKyAqLworaW50IG1lbV9jZ3JvdXBfdHJ5X2NoYXJnZV9zd2FwaW4oc3RydWN0IG1tX3N0cnVjdCAqbW0sCisJCQkJIHN0cnVjdCBwYWdlICpwYWdlLAorCQkJCSBnZnBfdCBtYXNrLCBzdHJ1Y3QgbWVtX2Nncm91cCAqKnB0cikKK3sKKwlzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtOworCWludCByZXQ7CisKKwlpZiAobWVtX2Nncm91cF9kaXNhYmxlZCgpKQorCQlyZXR1cm4gMDsKKworCWlmICghZG9fc3dhcF9hY2NvdW50KQorCQlnb3RvIGNoYXJnZV9jdXJfbW07CisJLyoKKwkgKiBBIHJhY2luZyB0aHJlYWQncyBmYXVsdCwgb3Igc3dhcG9mZiwgbWF5IGhhdmUgYWxyZWFkeSB1cGRhdGVkCisJICogdGhlIHB0ZSwgYW5kIGV2ZW4gcmVtb3ZlZCBwYWdlIGZyb20gc3dhcCBjYWNoZTogcmV0dXJuIHN1Y2Nlc3MKKwkgKiB0byBnbyBvbiB0byBkb19zd2FwX3BhZ2UoKSdzIHB0ZV9zYW1lKCkgdGVzdCwgd2hpY2ggc2hvdWxkIGZhaWwuCisJICovCisJaWYgKCFQYWdlU3dhcENhY2hlKHBhZ2UpKQorCQlyZXR1cm4gMDsKKwltZW0gPSB0cnlfZ2V0X21lbV9jZ3JvdXBfZnJvbV9zd2FwY2FjaGUocGFnZSk7CisJaWYgKCFtZW0pCisJCWdvdG8gY2hhcmdlX2N1cl9tbTsKKwkqcHRyID0gbWVtOworCXJldCA9IF9fbWVtX2Nncm91cF90cnlfY2hhcmdlKE5VTEwsIG1hc2ssIHB0ciwgdHJ1ZSk7CisJLyogZHJvcCBleHRyYSByZWZjbnQgZnJvbSB0cnlnZXQgKi8KKwljc3NfcHV0KCZtZW0tPmNzcyk7CisJcmV0dXJuIHJldDsKK2NoYXJnZV9jdXJfbW06CisJaWYgKHVubGlrZWx5KCFtbSkpCisJCW1tID0gJmluaXRfbW07CisJcmV0dXJuIF9fbWVtX2Nncm91cF90cnlfY2hhcmdlKG1tLCBtYXNrLCBwdHIsIHRydWUpOworfQorCit2b2lkIG1lbV9jZ3JvdXBfY29tbWl0X2NoYXJnZV9zd2FwaW4oc3RydWN0IHBhZ2UgKnBhZ2UsIHN0cnVjdCBtZW1fY2dyb3VwICpwdHIpCit7CisJc3RydWN0IHBhZ2VfY2dyb3VwICpwYzsKKworCWlmIChtZW1fY2dyb3VwX2Rpc2FibGVkKCkpCisJCXJldHVybjsKKwlpZiAoIXB0cikKKwkJcmV0dXJuOworCXBjID0gbG9va3VwX3BhZ2VfY2dyb3VwKHBhZ2UpOworCW1lbV9jZ3JvdXBfbHJ1X2RlbF9iZWZvcmVfY29tbWl0X3N3YXBjYWNoZShwYWdlKTsKKwlfX21lbV9jZ3JvdXBfY29tbWl0X2NoYXJnZShwdHIsIHBjLCBNRU1fQ0dST1VQX0NIQVJHRV9UWVBFX01BUFBFRCk7CisJbWVtX2Nncm91cF9scnVfYWRkX2FmdGVyX2NvbW1pdF9zd2FwY2FjaGUocGFnZSk7CisJLyoKKwkgKiBOb3cgc3dhcCBpcyBvbi1tZW1vcnkuIFRoaXMgbWVhbnMgdGhpcyBwYWdlIG1heSBiZQorCSAqIGNvdW50ZWQgYm90aCBhcyBtZW0gYW5kIHN3YXAuLi4uZG91YmxlIGNvdW50LgorCSAqIEZpeCBpdCBieSB1bmNoYXJnaW5nIGZyb20gbWVtc3cuIEJhc2ljYWxseSwgdGhpcyBTd2FwQ2FjaGUgaXMgc3RhYmxlCisJICogdW5kZXIgbG9ja19wYWdlKCkuIEJ1dCBpbiBkb19zd2FwX3BhZ2UoKTo6bWVtb3J5LmMsIHJldXNlX3N3YXBfcGFnZSgpCisJICogbWF5IGNhbGwgZGVsZXRlX2Zyb21fc3dhcF9jYWNoZSgpIGJlZm9yZSByZWFjaCBoZXJlLgorCSAqLworCWlmIChkb19zd2FwX2FjY291bnQgJiYgUGFnZVN3YXBDYWNoZShwYWdlKSkgeworCQlzd3BfZW50cnlfdCBlbnQgPSB7LnZhbCA9IHBhZ2VfcHJpdmF0ZShwYWdlKX07CisJCXN0cnVjdCBtZW1fY2dyb3VwICptZW1jZzsKKwkJbWVtY2cgPSBzd2FwX2Nncm91cF9yZWNvcmQoZW50LCBOVUxMKTsKKwkJaWYgKG1lbWNnKSB7CisJCQlyZXNfY291bnRlcl91bmNoYXJnZSgmbWVtY2ctPm1lbXN3LCBQQUdFX1NJWkUpOworCQkJbWVtX2Nncm91cF9wdXQobWVtY2cpOworCQl9CisKKwl9CisJLyogYWRkIHRoaXMgcGFnZShwYWdlX2Nncm91cCkgdG8gdGhlIExSVSB3ZSB3YW50LiAqLworCit9CisKK3ZvaWQgbWVtX2Nncm91cF9jYW5jZWxfY2hhcmdlX3N3YXBpbihzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtKQoreworCWlmIChtZW1fY2dyb3VwX2Rpc2FibGVkKCkpCisJCXJldHVybjsKKwlpZiAoIW1lbSkKKwkJcmV0dXJuOworCXJlc19jb3VudGVyX3VuY2hhcmdlKCZtZW0tPnJlcywgUEFHRV9TSVpFKTsKKwlpZiAoZG9fc3dhcF9hY2NvdW50KQorCQlyZXNfY291bnRlcl91bmNoYXJnZSgmbWVtLT5tZW1zdywgUEFHRV9TSVpFKTsKKwljc3NfcHV0KCZtZW0tPmNzcyk7Cit9CisKKworLyoKICAqIHVuY2hhcmdlIGlmICFwYWdlX21hcHBlZChwYWdlKQogICovCi1zdGF0aWMgdm9pZAorc3RhdGljIHN0cnVjdCBtZW1fY2dyb3VwICoKIF9fbWVtX2Nncm91cF91bmNoYXJnZV9jb21tb24oc3RydWN0IHBhZ2UgKnBhZ2UsIGVudW0gY2hhcmdlX3R5cGUgY3R5cGUpCiB7CiAJc3RydWN0IHBhZ2VfY2dyb3VwICpwYzsKLQlzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtOworCXN0cnVjdCBtZW1fY2dyb3VwICptZW0gPSBOVUxMOwogCXN0cnVjdCBtZW1fY2dyb3VwX3Blcl96b25lICptejsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JaWYgKG1lbV9jZ3JvdXBfc3Vic3lzLmRpc2FibGVkKQotCQlyZXR1cm47CisJaWYgKG1lbV9jZ3JvdXBfZGlzYWJsZWQoKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAoUGFnZVN3YXBDYWNoZShwYWdlKSkKKwkJcmV0dXJuIE5VTEw7CiAKIAkvKgogCSAqIENoZWNrIGlmIG91ciBwYWdlX2Nncm91cCBpcyB2YWxpZAogCSAqLwogCXBjID0gbG9va3VwX3BhZ2VfY2dyb3VwKHBhZ2UpOwogCWlmICh1bmxpa2VseSghcGMgfHwgIVBhZ2VDZ3JvdXBVc2VkKHBjKSkpCi0JCXJldHVybjsKKwkJcmV0dXJuIE5VTEw7CiAKIAlsb2NrX3BhZ2VfY2dyb3VwKHBjKTsKLQlpZiAoKGN0eXBlID09IE1FTV9DR1JPVVBfQ0hBUkdFX1RZUEVfTUFQUEVEICYmIHBhZ2VfbWFwcGVkKHBhZ2UpKQotCSAgICAgfHwgIVBhZ2VDZ3JvdXBVc2VkKHBjKSkgewotCQkvKiBUaGlzIGhhcHBlbnMgYXQgcmFjZSBpbiB6YXBfcHRlX3JhbmdlKCkgYW5kIGRvX3N3YXBfcGFnZSgpKi8KLQkJdW5sb2NrX3BhZ2VfY2dyb3VwKHBjKTsKLQkJcmV0dXJuOwotCX0KLQlDbGVhclBhZ2VDZ3JvdXBVc2VkKHBjKTsKKwogCW1lbSA9IHBjLT5tZW1fY2dyb3VwOwogCi0JbXogPSBwYWdlX2Nncm91cF96b25laW5mbyhwYyk7Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJm16LT5scnVfbG9jaywgZmxhZ3MpOwotCV9fbWVtX2Nncm91cF9yZW1vdmVfbGlzdChteiwgcGMpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm16LT5scnVfbG9jaywgZmxhZ3MpOwotCXVubG9ja19wYWdlX2Nncm91cChwYyk7CisJaWYgKCFQYWdlQ2dyb3VwVXNlZChwYykpCisJCWdvdG8gdW5sb2NrX291dDsKKworCXN3aXRjaCAoY3R5cGUpIHsKKwljYXNlIE1FTV9DR1JPVVBfQ0hBUkdFX1RZUEVfTUFQUEVEOgorCQlpZiAocGFnZV9tYXBwZWQocGFnZSkpCisJCQlnb3RvIHVubG9ja19vdXQ7CisJCWJyZWFrOworCWNhc2UgTUVNX0NHUk9VUF9DSEFSR0VfVFlQRV9TV0FQT1VUOgorCQlpZiAoIVBhZ2VBbm9uKHBhZ2UpKSB7CS8qIFNoYXJlZCBtZW1vcnkgKi8KKwkJCWlmIChwYWdlLT5tYXBwaW5nICYmICFwYWdlX2lzX2ZpbGVfY2FjaGUocGFnZSkpCisJCQkJZ290byB1bmxvY2tfb3V0OworCQl9IGVsc2UgaWYgKHBhZ2VfbWFwcGVkKHBhZ2UpKSAvKiBBbm9uICovCisJCQkJZ290byB1bmxvY2tfb3V0OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CiAKIAlyZXNfY291bnRlcl91bmNoYXJnZSgmbWVtLT5yZXMsIFBBR0VfU0laRSk7Ci0JY3NzX3B1dCgmbWVtLT5jc3MpOworCWlmIChkb19zd2FwX2FjY291bnQgJiYgKGN0eXBlICE9IE1FTV9DR1JPVVBfQ0hBUkdFX1RZUEVfU1dBUE9VVCkpCisJCXJlc19jb3VudGVyX3VuY2hhcmdlKCZtZW0tPm1lbXN3LCBQQUdFX1NJWkUpOwogCi0JcmV0dXJuOworCW1lbV9jZ3JvdXBfY2hhcmdlX3N0YXRpc3RpY3MobWVtLCBwYywgZmFsc2UpOworCUNsZWFyUGFnZUNncm91cFVzZWQocGMpOworCS8qCisJICogcGMtPm1lbV9jZ3JvdXAgaXMgbm90IGNsZWFyZWQgaGVyZS4gSXQgd2lsbCBiZSBhY2Nlc3NlZCB3aGVuIGl0J3MKKwkgKiBmcmVlZCBmcm9tIExSVS4gVGhpcyBpcyBzYWZlIGJlY2F1c2UgdW5jaGFyZ2VkIHBhZ2UgaXMgZXhwZWN0ZWQgbm90CisJICogdG8gYmUgcmV1c2VkIChmcmVlZCBzb29uKS4gRXhjZXB0aW9uIGlzIFN3YXBDYWNoZSwgaXQncyBoYW5kbGVkIGJ5CisJICogc3BlY2lhbCBmdW5jdGlvbnMuCisJICovCisKKwlteiA9IHBhZ2VfY2dyb3VwX3pvbmVpbmZvKHBjKTsKKwl1bmxvY2tfcGFnZV9jZ3JvdXAocGMpOworCisJLyogYXQgc3dhcG91dCwgdGhpcyBtZW1jZyB3aWxsIGJlIGFjY2Vzc2VkIHRvIHJlY29yZCB0byBzd2FwICovCisJaWYgKGN0eXBlICE9IE1FTV9DR1JPVVBfQ0hBUkdFX1RZUEVfU1dBUE9VVCkKKwkJY3NzX3B1dCgmbWVtLT5jc3MpOworCisJcmV0dXJuIG1lbTsKKwordW5sb2NrX291dDoKKwl1bmxvY2tfcGFnZV9jZ3JvdXAocGMpOworCXJldHVybiBOVUxMOwogfQogCiB2b2lkIG1lbV9jZ3JvdXBfdW5jaGFyZ2VfcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSkKQEAgLTY4OSwxNiArMTM2NSw1NSBAQAogfQogCiAvKgotICogQmVmb3JlIHN0YXJ0aW5nIG1pZ3JhdGlvbiwgYWNjb3VudCBhZ2FpbnN0IG5ldyBwYWdlLgorICogY2FsbGVkIGZyb20gX19kZWxldGVfZnJvbV9zd2FwX2NhY2hlKCkgYW5kIGRyb3AgInBhZ2UiIGFjY291bnQuCisgKiBtZW1jZyBpbmZvcm1hdGlvbiBpcyByZWNvcmRlZCB0byBzd2FwX2Nncm91cCBvZiAiZW50IgogICovCi1pbnQgbWVtX2Nncm91cF9wcmVwYXJlX21pZ3JhdGlvbihzdHJ1Y3QgcGFnZSAqcGFnZSwgc3RydWN0IHBhZ2UgKm5ld3BhZ2UpCit2b2lkIG1lbV9jZ3JvdXBfdW5jaGFyZ2Vfc3dhcGNhY2hlKHN0cnVjdCBwYWdlICpwYWdlLCBzd3BfZW50cnlfdCBlbnQpCit7CisJc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnOworCisJbWVtY2cgPSBfX21lbV9jZ3JvdXBfdW5jaGFyZ2VfY29tbW9uKHBhZ2UsCisJCQkJCU1FTV9DR1JPVVBfQ0hBUkdFX1RZUEVfU1dBUE9VVCk7CisJLyogcmVjb3JkIG1lbWNnIGluZm9ybWF0aW9uICovCisJaWYgKGRvX3N3YXBfYWNjb3VudCAmJiBtZW1jZykgeworCQlzd2FwX2Nncm91cF9yZWNvcmQoZW50LCBtZW1jZyk7CisJCW1lbV9jZ3JvdXBfZ2V0KG1lbWNnKTsKKwl9CisJaWYgKG1lbWNnKQorCQljc3NfcHV0KCZtZW1jZy0+Y3NzKTsKK30KKworI2lmZGVmIENPTkZJR19DR1JPVVBfTUVNX1JFU19DVExSX1NXQVAKKy8qCisgKiBjYWxsZWQgZnJvbSBzd2FwX2VudHJ5X2ZyZWUoKS4gcmVtb3ZlIHJlY29yZCBpbiBzd2FwX2Nncm91cCBhbmQKKyAqIHVuY2hhcmdlICJtZW1zdyIgYWNjb3VudC4KKyAqLwordm9pZCBtZW1fY2dyb3VwX3VuY2hhcmdlX3N3YXAoc3dwX2VudHJ5X3QgZW50KQoreworCXN0cnVjdCBtZW1fY2dyb3VwICptZW1jZzsKKworCWlmICghZG9fc3dhcF9hY2NvdW50KQorCQlyZXR1cm47CisKKwltZW1jZyA9IHN3YXBfY2dyb3VwX3JlY29yZChlbnQsIE5VTEwpOworCWlmIChtZW1jZykgeworCQlyZXNfY291bnRlcl91bmNoYXJnZSgmbWVtY2ctPm1lbXN3LCBQQUdFX1NJWkUpOworCQltZW1fY2dyb3VwX3B1dChtZW1jZyk7CisJfQorfQorI2VuZGlmCisKKy8qCisgKiBCZWZvcmUgc3RhcnRpbmcgbWlncmF0aW9uLCBhY2NvdW50IFBBR0VfU0laRSB0byBtZW1fY2dyb3VwIHRoYXQgdGhlIG9sZAorICogcGFnZSBiZWxvbmdzIHRvLgorICovCitpbnQgbWVtX2Nncm91cF9wcmVwYXJlX21pZ3JhdGlvbihzdHJ1Y3QgcGFnZSAqcGFnZSwgc3RydWN0IG1lbV9jZ3JvdXAgKipwdHIpCiB7CiAJc3RydWN0IHBhZ2VfY2dyb3VwICpwYzsKIAlzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtID0gTlVMTDsKLQllbnVtIGNoYXJnZV90eXBlIGN0eXBlID0gTUVNX0NHUk9VUF9DSEFSR0VfVFlQRV9NQVBQRUQ7CiAJaW50IHJldCA9IDA7CiAKLQlpZiAobWVtX2Nncm91cF9zdWJzeXMuZGlzYWJsZWQpCisJaWYgKG1lbV9jZ3JvdXBfZGlzYWJsZWQoKSkKIAkJcmV0dXJuIDA7CiAKIAlwYyA9IGxvb2t1cF9wYWdlX2Nncm91cChwYWdlKTsKQEAgLTcwNiw0MSArMTQyMSw2NyBAQAogCWlmIChQYWdlQ2dyb3VwVXNlZChwYykpIHsKIAkJbWVtID0gcGMtPm1lbV9jZ3JvdXA7CiAJCWNzc19nZXQoJm1lbS0+Y3NzKTsKLQkJaWYgKFBhZ2VDZ3JvdXBDYWNoZShwYykpIHsKLQkJCWlmIChwYWdlX2lzX2ZpbGVfY2FjaGUocGFnZSkpCi0JCQkJY3R5cGUgPSBNRU1fQ0dST1VQX0NIQVJHRV9UWVBFX0NBQ0hFOwotCQkJZWxzZQotCQkJCWN0eXBlID0gTUVNX0NHUk9VUF9DSEFSR0VfVFlQRV9TSE1FTTsKLQkJfQogCX0KIAl1bmxvY2tfcGFnZV9jZ3JvdXAocGMpOworCiAJaWYgKG1lbSkgewotCQlyZXQgPSBtZW1fY2dyb3VwX2NoYXJnZV9jb21tb24obmV3cGFnZSwgTlVMTCwgR0ZQX0tFUk5FTCwKLQkJCWN0eXBlLCBtZW0pOworCQlyZXQgPSBfX21lbV9jZ3JvdXBfdHJ5X2NoYXJnZShOVUxMLCBHRlBfS0VSTkVMLCAmbWVtLCBmYWxzZSk7CiAJCWNzc19wdXQoJm1lbS0+Y3NzKTsKIAl9CisJKnB0ciA9IG1lbTsKIAlyZXR1cm4gcmV0OwogfQogCiAvKiByZW1vdmUgcmVkdW5kYW50IGNoYXJnZSBpZiBtaWdyYXRpb24gZmFpbGVkKi8KLXZvaWQgbWVtX2Nncm91cF9lbmRfbWlncmF0aW9uKHN0cnVjdCBwYWdlICpuZXdwYWdlKQordm9pZCBtZW1fY2dyb3VwX2VuZF9taWdyYXRpb24oc3RydWN0IG1lbV9jZ3JvdXAgKm1lbSwKKwkJc3RydWN0IHBhZ2UgKm9sZHBhZ2UsIHN0cnVjdCBwYWdlICpuZXdwYWdlKQogeworCXN0cnVjdCBwYWdlICp0YXJnZXQsICp1bnVzZWQ7CisJc3RydWN0IHBhZ2VfY2dyb3VwICpwYzsKKwllbnVtIGNoYXJnZV90eXBlIGN0eXBlOworCisJaWYgKCFtZW0pCisJCXJldHVybjsKKworCS8qIGF0IG1pZ3JhdGlvbiBzdWNjZXNzLCBvbGRwYWdlLT5tYXBwaW5nIGlzIE5VTEwuICovCisJaWYgKG9sZHBhZ2UtPm1hcHBpbmcpIHsKKwkJdGFyZ2V0ID0gb2xkcGFnZTsKKwkJdW51c2VkID0gTlVMTDsKKwl9IGVsc2UgeworCQl0YXJnZXQgPSBuZXdwYWdlOworCQl1bnVzZWQgPSBvbGRwYWdlOworCX0KKworCWlmIChQYWdlQW5vbih0YXJnZXQpKQorCQljdHlwZSA9IE1FTV9DR1JPVVBfQ0hBUkdFX1RZUEVfTUFQUEVEOworCWVsc2UgaWYgKHBhZ2VfaXNfZmlsZV9jYWNoZSh0YXJnZXQpKQorCQljdHlwZSA9IE1FTV9DR1JPVVBfQ0hBUkdFX1RZUEVfQ0FDSEU7CisJZWxzZQorCQljdHlwZSA9IE1FTV9DR1JPVVBfQ0hBUkdFX1RZUEVfU0hNRU07CisKKwkvKiB1bnVzZWQgcGFnZSBpcyBub3Qgb24gcmFkaXgtdHJlZSBub3cuICovCisJaWYgKHVudXNlZCkKKwkJX19tZW1fY2dyb3VwX3VuY2hhcmdlX2NvbW1vbih1bnVzZWQsIGN0eXBlKTsKKworCXBjID0gbG9va3VwX3BhZ2VfY2dyb3VwKHRhcmdldCk7CiAJLyoKLQkgKiBBdCBzdWNjZXNzLCBwYWdlLT5tYXBwaW5nIGlzIG5vdCBOVUxMLgotCSAqIHNwZWNpYWwgcm9sbGJhY2sgY2FyZSBpcyBuZWNlc3Nhcnkgd2hlbgotCSAqIDEuIGF0IG1pZ3JhdGlvbiBmYWlsdXJlLiAobmV3cGFnZS0+bWFwcGluZyBpcyBjbGVhcmVkIGluIHRoaXMgY2FzZSkKLQkgKiAyLiB0aGUgbmV3cGFnZSB3YXMgbW92ZWQgYnV0IG5vdCByZW1hcHBlZCBhZ2FpbiBiZWNhdXNlIHRoZSB0YXNrCi0JICogICAgZXhpdHMgYW5kIHRoZSBuZXdwYWdlIGlzIG9ic29sZXRlLiBJbiB0aGlzIGNhc2UsIHRoZSBuZXcgcGFnZQotCSAqICAgIG1heSBiZSBhIHN3YXBjYWNoZS4gU28sIHdlIGp1c3QgY2FsbCBtZW1fY2dyb3VwX3VuY2hhcmdlX3BhZ2UoKQotCSAqICAgIGFsd2F5cyBmb3IgYXZvaWRpbmcgbWVzcy4gVGhlICBwYWdlX2Nncm91cCB3aWxsIGJlIHJlbW92ZWQgaWYKLQkgKiAgICB1bm5lY2Vzc2FyeS4gRmlsZSBjYWNoZSBwYWdlcyBpcyBzdGlsbCBvbiByYWRpeC10cmVlLiBEb24ndAotCSAqICAgIGNhcmUgaXQuCisJICogX19tZW1fY2dyb3VwX2NvbW1pdF9jaGFyZ2UoKSBjaGVjayBQQ0dfVVNFRCBiaXQgb2YgcGFnZV9jZ3JvdXAuCisJICogU28sIGRvdWJsZS1jb3VudGluZyBpcyBlZmZlY3RpdmVseSBhdm9pZGVkLgogCSAqLwotCWlmICghbmV3cGFnZS0+bWFwcGluZykKLQkJX19tZW1fY2dyb3VwX3VuY2hhcmdlX2NvbW1vbihuZXdwYWdlLAotCQkJCU1FTV9DR1JPVVBfQ0hBUkdFX1RZUEVfRk9SQ0UpOwotCWVsc2UgaWYgKFBhZ2VBbm9uKG5ld3BhZ2UpKQotCQltZW1fY2dyb3VwX3VuY2hhcmdlX3BhZ2UobmV3cGFnZSk7CisJX19tZW1fY2dyb3VwX2NvbW1pdF9jaGFyZ2UobWVtLCBwYywgY3R5cGUpOworCisJLyoKKwkgKiBCb3RoIG9mIG9sZHBhZ2UgYW5kIG5ld3BhZ2UgYXJlIHN0aWxsIHVuZGVyIGxvY2tfcGFnZSgpLgorCSAqIFRoZW4sIHdlIGRvbid0IGhhdmUgdG8gY2FyZSBhYm91dCByYWNlIGluIHJhZGl4LXRyZWUuCisJICogQnV0IHdlIGhhdmUgdG8gYmUgY2FyZWZ1bCB0aGF0IHRoaXMgcGFnZSBpcyB1bm1hcHBlZCBvciBub3QuCisJICoKKwkgKiBUaGVyZSBpcyBhIGNhc2UgZm9yICFwYWdlX21hcHBlZCgpLiBBdCB0aGUgc3RhcnQgb2YKKwkgKiBtaWdyYXRpb24sIG9sZHBhZ2Ugd2FzIG1hcHBlZC4gQnV0IG5vdywgaXQncyB6YXBwZWQuCisJICogQnV0IHdlIGtub3cgKnRhcmdldCogcGFnZSBpcyBub3QgZnJlZWQvcmV1c2VkIHVuZGVyIHVzLgorCSAqIG1lbV9jZ3JvdXBfdW5jaGFyZ2VfcGFnZSgpIGRvZXMgYWxsIG5lY2Vzc2FyeSBjaGVja3MuCisJICovCisJaWYgKGN0eXBlID09IE1FTV9DR1JPVVBfQ0hBUkdFX1RZUEVfTUFQUEVEKQorCQltZW1fY2dyb3VwX3VuY2hhcmdlX3BhZ2UodGFyZ2V0KTsKIH0KIAogLyoKQEAgLTc0OCwyOSArMTQ4OSwyNiBAQAogICogVGhpcyBpcyB0eXBpY2FsbHkgdXNlZCBmb3IgcGFnZSByZWNsYWltaW5nIGZvciBzaG1lbSBmb3IgcmVkdWNpbmcgc2lkZQogICogZWZmZWN0IG9mIHBhZ2UgYWxsb2NhdGlvbiBmcm9tIHNobWVtLCB3aGljaCBpcyB1c2VkIGJ5IHNvbWUgbWVtX2Nncm91cC4KICAqLwotaW50IG1lbV9jZ3JvdXBfc2hyaW5rX3VzYWdlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBnZnBfdCBnZnBfbWFzaykKK2ludCBtZW1fY2dyb3VwX3Nocmlua191c2FnZShzdHJ1Y3QgcGFnZSAqcGFnZSwKKwkJCSAgICBzdHJ1Y3QgbW1fc3RydWN0ICptbSwKKwkJCSAgICBnZnBfdCBnZnBfbWFzaykKIHsKLQlzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtOworCXN0cnVjdCBtZW1fY2dyb3VwICptZW0gPSBOVUxMOwogCWludCBwcm9ncmVzcyA9IDA7CiAJaW50IHJldHJ5ID0gTUVNX0NHUk9VUF9SRUNMQUlNX1JFVFJJRVM7CiAKLQlpZiAobWVtX2Nncm91cF9zdWJzeXMuZGlzYWJsZWQpCisJaWYgKG1lbV9jZ3JvdXBfZGlzYWJsZWQoKSkKIAkJcmV0dXJuIDA7Ci0JaWYgKCFtbSkKKwlpZiAocGFnZSkKKwkJbWVtID0gdHJ5X2dldF9tZW1fY2dyb3VwX2Zyb21fc3dhcGNhY2hlKHBhZ2UpOworCWlmICghbWVtICYmIG1tKQorCQltZW0gPSB0cnlfZ2V0X21lbV9jZ3JvdXBfZnJvbV9tbShtbSk7CisJaWYgKHVubGlrZWx5KCFtZW0pKQogCQlyZXR1cm4gMDsKIAotCXJjdV9yZWFkX2xvY2soKTsKLQltZW0gPSBtZW1fY2dyb3VwX2Zyb21fdGFzayhyY3VfZGVyZWZlcmVuY2UobW0tPm93bmVyKSk7Ci0JaWYgKHVubGlrZWx5KCFtZW0pKSB7Ci0JCXJjdV9yZWFkX3VubG9jaygpOwotCQlyZXR1cm4gMDsKLQl9Ci0JY3NzX2dldCgmbWVtLT5jc3MpOwotCXJjdV9yZWFkX3VubG9jaygpOwotCiAJZG8gewotCQlwcm9ncmVzcyA9IHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMobWVtLCBnZnBfbWFzayk7Ci0JCXByb2dyZXNzICs9IHJlc19jb3VudGVyX2NoZWNrX3VuZGVyX2xpbWl0KCZtZW0tPnJlcyk7CisJCXByb2dyZXNzID0gbWVtX2Nncm91cF9oaWVyYXJjaGljYWxfcmVjbGFpbShtZW0sIGdmcF9tYXNrLCB0cnVlKTsKKwkJcHJvZ3Jlc3MgKz0gbWVtX2Nncm91cF9jaGVja191bmRlcl9saW1pdChtZW0pOwogCX0gd2hpbGUgKCFwcm9ncmVzcyAmJiAtLXJldHJ5KTsKIAogCWNzc19wdXQoJm1lbS0+Y3NzKTsKQEAgLTc3OSwxMTcgKzE1MTcsMjk1IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBERUZJTkVfTVVURVgoc2V0X2xpbWl0X211dGV4KTsKKwogc3RhdGljIGludCBtZW1fY2dyb3VwX3Jlc2l6ZV9saW1pdChzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csCi0JCQkJICAgdW5zaWduZWQgbG9uZyBsb25nIHZhbCkKKwkJCQl1bnNpZ25lZCBsb25nIGxvbmcgdmFsKQogewogCiAJaW50IHJldHJ5X2NvdW50ID0gTUVNX0NHUk9VUF9SRUNMQUlNX1JFVFJJRVM7CiAJaW50IHByb2dyZXNzOworCXU2NCBtZW1zd2xpbWl0OwogCWludCByZXQgPSAwOwogCi0Jd2hpbGUgKHJlc19jb3VudGVyX3NldF9saW1pdCgmbWVtY2ctPnJlcywgdmFsKSkgeworCXdoaWxlIChyZXRyeV9jb3VudCkgewogCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKIAkJCXJldCA9IC1FSU5UUjsKIAkJCWJyZWFrOwogCQl9Ci0JCWlmICghcmV0cnlfY291bnQpIHsKLQkJCXJldCA9IC1FQlVTWTsKKwkJLyoKKwkJICogUmF0aGVyIHRoYW4gaGlkZSBhbGwgaW4gc29tZSBmdW5jdGlvbiwgSSBkbyB0aGlzIGluCisJCSAqIG9wZW4gY29kZWQgbWFubmVyLiBZb3Ugc2VlIHdoYXQgdGhpcyByZWFsbHkgZG9lcy4KKwkJICogV2UgaGF2ZSB0byBndWFyYW50ZWUgbWVtLT5yZXMubGltaXQgPCBtZW0tPm1lbXN3LmxpbWl0LgorCQkgKi8KKwkJbXV0ZXhfbG9jaygmc2V0X2xpbWl0X211dGV4KTsKKwkJbWVtc3dsaW1pdCA9IHJlc19jb3VudGVyX3JlYWRfdTY0KCZtZW1jZy0+bWVtc3csIFJFU19MSU1JVCk7CisJCWlmIChtZW1zd2xpbWl0IDwgdmFsKSB7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJbXV0ZXhfdW5sb2NrKCZzZXRfbGltaXRfbXV0ZXgpOwogCQkJYnJlYWs7CiAJCX0KLQkJcHJvZ3Jlc3MgPSB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKG1lbWNnLCBHRlBfS0VSTkVMKTsKLQkJaWYgKCFwcm9ncmVzcykKKwkJcmV0ID0gcmVzX2NvdW50ZXJfc2V0X2xpbWl0KCZtZW1jZy0+cmVzLCB2YWwpOworCQltdXRleF91bmxvY2soJnNldF9saW1pdF9tdXRleCk7CisKKwkJaWYgKCFyZXQpCisJCQlicmVhazsKKworCQlwcm9ncmVzcyA9IG1lbV9jZ3JvdXBfaGllcmFyY2hpY2FsX3JlY2xhaW0obWVtY2csIEdGUF9LRVJORUwsCisJCQkJCQkJICAgZmFsc2UpOworICAJCWlmICghcHJvZ3Jlc3MpCQkJcmV0cnlfY291bnQtLTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitpbnQgbWVtX2Nncm91cF9yZXNpemVfbWVtc3dfbGltaXQoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLAorCQkJCXVuc2lnbmVkIGxvbmcgbG9uZyB2YWwpCit7CisJaW50IHJldHJ5X2NvdW50ID0gTUVNX0NHUk9VUF9SRUNMQUlNX1JFVFJJRVM7CisJdTY0IG1lbWxpbWl0LCBvbGR1c2FnZSwgY3VydXNhZ2U7CisJaW50IHJldDsKKworCWlmICghZG9fc3dhcF9hY2NvdW50KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXdoaWxlIChyZXRyeV9jb3VudCkgeworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCXJldCA9IC1FSU5UUjsKKwkJCWJyZWFrOworCQl9CisJCS8qCisJCSAqIFJhdGhlciB0aGFuIGhpZGUgYWxsIGluIHNvbWUgZnVuY3Rpb24sIEkgZG8gdGhpcyBpbgorCQkgKiBvcGVuIGNvZGVkIG1hbm5lci4gWW91IHNlZSB3aGF0IHRoaXMgcmVhbGx5IGRvZXMuCisJCSAqIFdlIGhhdmUgdG8gZ3VhcmFudGVlIG1lbS0+cmVzLmxpbWl0IDwgbWVtLT5tZW1zdy5saW1pdC4KKwkJICovCisJCW11dGV4X2xvY2soJnNldF9saW1pdF9tdXRleCk7CisJCW1lbWxpbWl0ID0gcmVzX2NvdW50ZXJfcmVhZF91NjQoJm1lbWNnLT5yZXMsIFJFU19MSU1JVCk7CisJCWlmIChtZW1saW1pdCA+IHZhbCkgeworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCW11dGV4X3VubG9jaygmc2V0X2xpbWl0X211dGV4KTsKKwkJCWJyZWFrOworCQl9CisJCXJldCA9IHJlc19jb3VudGVyX3NldF9saW1pdCgmbWVtY2ctPm1lbXN3LCB2YWwpOworCQltdXRleF91bmxvY2soJnNldF9saW1pdF9tdXRleCk7CisKKwkJaWYgKCFyZXQpCisJCQlicmVhazsKKworCQlvbGR1c2FnZSA9IHJlc19jb3VudGVyX3JlYWRfdTY0KCZtZW1jZy0+bWVtc3csIFJFU19VU0FHRSk7CisJCW1lbV9jZ3JvdXBfaGllcmFyY2hpY2FsX3JlY2xhaW0obWVtY2csIEdGUF9LRVJORUwsIHRydWUpOworCQljdXJ1c2FnZSA9IHJlc19jb3VudGVyX3JlYWRfdTY0KCZtZW1jZy0+bWVtc3csIFJFU19VU0FHRSk7CisJCWlmIChjdXJ1c2FnZSA+PSBvbGR1c2FnZSkKIAkJCXJldHJ5X2NvdW50LS07CiAJfQogCXJldHVybiByZXQ7CiB9CiAKLQogLyoKICAqIFRoaXMgcm91dGluZSB0cmF2ZXJzZSBwYWdlX2Nncm91cCBpbiBnaXZlbiBsaXN0IGFuZCBkcm9wIHRoZW0gYWxsLgogICogKkFuZCogdGhpcyByb3V0aW5lIGRvZXNuJ3QgcmVjbGFpbSBwYWdlIGl0c2VsZiwganVzdCByZW1vdmVzIHBhZ2VfY2dyb3VwLgogICovCi0jZGVmaW5lIEZPUkNFX1VOQ0hBUkdFX0JBVENICSgxMjgpCi1zdGF0aWMgdm9pZCBtZW1fY2dyb3VwX2ZvcmNlX2VtcHR5X2xpc3Qoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbSwKLQkJCSAgICBzdHJ1Y3QgbWVtX2Nncm91cF9wZXJfem9uZSAqbXosCi0JCQkgICAgZW51bSBscnVfbGlzdCBscnUpCitzdGF0aWMgaW50IG1lbV9jZ3JvdXBfZm9yY2VfZW1wdHlfbGlzdChzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtLAorCQkJCWludCBub2RlLCBpbnQgemlkLCBlbnVtIGxydV9saXN0IGxydSkKIHsKLQlzdHJ1Y3QgcGFnZV9jZ3JvdXAgKnBjOwotCXN0cnVjdCBwYWdlICpwYWdlOwotCWludCBjb3VudCA9IEZPUkNFX1VOQ0hBUkdFX0JBVENIOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IHpvbmUgKnpvbmU7CisJc3RydWN0IG1lbV9jZ3JvdXBfcGVyX3pvbmUgKm16OworCXN0cnVjdCBwYWdlX2Nncm91cCAqcGMsICpidXN5OworCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIGxvb3A7CiAJc3RydWN0IGxpc3RfaGVhZCAqbGlzdDsKKwlpbnQgcmV0ID0gMDsKIAorCXpvbmUgPSAmTk9ERV9EQVRBKG5vZGUpLT5ub2RlX3pvbmVzW3ppZF07CisJbXogPSBtZW1fY2dyb3VwX3pvbmVpbmZvKG1lbSwgbm9kZSwgemlkKTsKIAlsaXN0ID0gJm16LT5saXN0c1tscnVdOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJm16LT5scnVfbG9jaywgZmxhZ3MpOwotCXdoaWxlICghbGlzdF9lbXB0eShsaXN0KSkgewotCQlwYyA9IGxpc3RfZW50cnkobGlzdC0+cHJldiwgc3RydWN0IHBhZ2VfY2dyb3VwLCBscnUpOwotCQlwYWdlID0gcGMtPnBhZ2U7Ci0JCWlmICghUGFnZUNncm91cFVzZWQocGMpKQotCQkJYnJlYWs7Ci0JCWdldF9wYWdlKHBhZ2UpOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtei0+bHJ1X2xvY2ssIGZsYWdzKTsKLQkJLyoKLQkJICogQ2hlY2sgaWYgdGhpcyBwYWdlIGlzIG9uIExSVS4gIUxSVSBwYWdlIGNhbiBiZSBmb3VuZAotCQkgKiBpZiBpdCdzIHVuZGVyIHBhZ2UgbWlncmF0aW9uLgotCQkgKi8KLQkJaWYgKFBhZ2VMUlUocGFnZSkpIHsKLQkJCV9fbWVtX2Nncm91cF91bmNoYXJnZV9jb21tb24ocGFnZSwKLQkJCQkJTUVNX0NHUk9VUF9DSEFSR0VfVFlQRV9GT1JDRSk7Ci0JCQlwdXRfcGFnZShwYWdlKTsKLQkJCWlmICgtLWNvdW50IDw9IDApIHsKLQkJCQljb3VudCA9IEZPUkNFX1VOQ0hBUkdFX0JBVENIOwotCQkJCWNvbmRfcmVzY2hlZCgpOwotCQkJfQotCQl9IGVsc2UgewotCQkJc3Bpbl9sb2NrX2lycXNhdmUoJm16LT5scnVfbG9jaywgZmxhZ3MpOworCWxvb3AgPSBNRU1fQ0dST1VQX1pTVEFUKG16LCBscnUpOworCS8qIGdpdmUgc29tZSBtYXJnaW4gYWdhaW5zdCBFQlVTWSBldGMuLi4qLworCWxvb3AgKz0gMjU2OworCWJ1c3kgPSBOVUxMOworCXdoaWxlIChsb29wLS0pIHsKKwkJcmV0ID0gMDsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnpvbmUtPmxydV9sb2NrLCBmbGFncyk7CisJCWlmIChsaXN0X2VtcHR5KGxpc3QpKSB7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ6b25lLT5scnVfbG9jaywgZmxhZ3MpOwogCQkJYnJlYWs7CiAJCX0KLQkJc3Bpbl9sb2NrX2lycXNhdmUoJm16LT5scnVfbG9jaywgZmxhZ3MpOworCQlwYyA9IGxpc3RfZW50cnkobGlzdC0+cHJldiwgc3RydWN0IHBhZ2VfY2dyb3VwLCBscnUpOworCQlpZiAoYnVzeSA9PSBwYykgeworCQkJbGlzdF9tb3ZlKCZwYy0+bHJ1LCBsaXN0KTsKKwkJCWJ1c3kgPSAwOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmem9uZS0+bHJ1X2xvY2ssIGZsYWdzKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnpvbmUtPmxydV9sb2NrLCBmbGFncyk7CisKKwkJcmV0ID0gbWVtX2Nncm91cF9tb3ZlX3BhcmVudChwYywgbWVtLCBHRlBfS0VSTkVMKTsKKwkJaWYgKHJldCA9PSAtRU5PTUVNKQorCQkJYnJlYWs7CisKKwkJaWYgKHJldCA9PSAtRUJVU1kgfHwgcmV0ID09IC1FSU5WQUwpIHsKKwkJCS8qIGZvdW5kIGxvY2sgY29udGVudGlvbiBvciAicGMiIGlzIG9ic29sZXRlLiAqLworCQkJYnVzeSA9IHBjOworCQkJY29uZF9yZXNjaGVkKCk7CisJCX0gZWxzZQorCQkJYnVzeSA9IE5VTEw7CiAJfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm16LT5scnVfbG9jaywgZmxhZ3MpOworCisJaWYgKCFyZXQgJiYgIWxpc3RfZW1wdHkobGlzdCkpCisJCXJldHVybiAtRUJVU1k7CisJcmV0dXJuIHJldDsKIH0KIAogLyoKICAqIG1ha2UgbWVtX2Nncm91cCdzIGNoYXJnZSB0byBiZSAwIGlmIHRoZXJlIGlzIG5vIHRhc2suCiAgKiBUaGlzIGVuYWJsZXMgZGVsZXRpbmcgdGhpcyBtZW1fY2dyb3VwLgogICovCi1zdGF0aWMgaW50IG1lbV9jZ3JvdXBfZm9yY2VfZW1wdHkoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbSkKK3N0YXRpYyBpbnQgbWVtX2Nncm91cF9mb3JjZV9lbXB0eShzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtLCBib29sIGZyZWVfYWxsKQogewotCWludCByZXQgPSAtRUJVU1k7Ci0JaW50IG5vZGUsIHppZDsKKwlpbnQgcmV0OworCWludCBub2RlLCB6aWQsIHNocmluazsKKwlpbnQgbnJfcmV0cmllcyA9IE1FTV9DR1JPVVBfUkVDTEFJTV9SRVRSSUVTOworCXN0cnVjdCBjZ3JvdXAgKmNncnAgPSBtZW0tPmNzcy5jZ3JvdXA7CiAKIAljc3NfZ2V0KCZtZW0tPmNzcyk7Ci0JLyoKLQkgKiBwYWdlIHJlY2xhaW0gY29kZSAoa3N3YXBkIGV0Yy4uKSB3aWxsIG1vdmUgcGFnZXMgYmV0d2VlbgotCSAqIGFjdGl2ZV9saXN0IDwtPiBpbmFjdGl2ZV9saXN0IHdoaWxlIHdlIGRvbid0IHRha2UgYSBsb2NrLgotCSAqIFNvLCB3ZSBoYXZlIHRvIGRvIGxvb3AgaGVyZSB1bnRpbCBhbGwgbGlzdHMgYXJlIGVtcHR5LgotCSAqLworCisJc2hyaW5rID0gMDsKKwkvKiBzaG91bGQgZnJlZSBhbGwgPyAqLworCWlmIChmcmVlX2FsbCkKKwkJZ290byB0cnlfdG9fZnJlZTsKK21vdmVfYWNjb3VudDoKIAl3aGlsZSAobWVtLT5yZXMudXNhZ2UgPiAwKSB7Ci0JCWlmIChhdG9taWNfcmVhZCgmbWVtLT5jc3MuY2dyb3VwLT5jb3VudCkgPiAwKQorCQlyZXQgPSAtRUJVU1k7CisJCWlmIChjZ3JvdXBfdGFza19jb3VudChjZ3JwKSB8fCAhbGlzdF9lbXB0eSgmY2dycC0+Y2hpbGRyZW4pKQorCQkJZ290byBvdXQ7CisJCXJldCA9IC1FSU5UUjsKKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQogCQkJZ290byBvdXQ7CiAJCS8qIFRoaXMgaXMgZm9yIG1ha2luZyBhbGwgKnVzZWQqIHBhZ2VzIHRvIGJlIG9uIExSVS4gKi8KIAkJbHJ1X2FkZF9kcmFpbl9hbGwoKTsKLQkJZm9yX2VhY2hfbm9kZV9zdGF0ZShub2RlLCBOX1BPU1NJQkxFKQotCQkJZm9yICh6aWQgPSAwOyB6aWQgPCBNQVhfTlJfWk9ORVM7IHppZCsrKSB7Ci0JCQkJc3RydWN0IG1lbV9jZ3JvdXBfcGVyX3pvbmUgKm16OworCQlyZXQgPSAwOworCQlmb3JfZWFjaF9ub2RlX3N0YXRlKG5vZGUsIE5fUE9TU0lCTEUpIHsKKwkJCWZvciAoemlkID0gMDsgIXJldCAmJiB6aWQgPCBNQVhfTlJfWk9ORVM7IHppZCsrKSB7CiAJCQkJZW51bSBscnVfbGlzdCBsOwotCQkJCW16ID0gbWVtX2Nncm91cF96b25laW5mbyhtZW0sIG5vZGUsIHppZCk7Ci0JCQkJZm9yX2VhY2hfbHJ1KGwpCi0JCQkJCW1lbV9jZ3JvdXBfZm9yY2VfZW1wdHlfbGlzdChtZW0sIG16LCBsKTsKKwkJCQlmb3JfZWFjaF9scnUobCkgeworCQkJCQlyZXQgPSBtZW1fY2dyb3VwX2ZvcmNlX2VtcHR5X2xpc3QobWVtLAorCQkJCQkJCW5vZGUsIHppZCwgbCk7CisJCQkJCWlmIChyZXQpCisJCQkJCQlicmVhazsKKwkJCQl9CiAJCQl9CisJCQlpZiAocmV0KQorCQkJCWJyZWFrOworCQl9CisJCS8qIGl0IHNlZW1zIHBhcmVudCBjZ3JvdXAgZG9lc24ndCBoYXZlIGVub3VnaCBtZW0gKi8KKwkJaWYgKHJldCA9PSAtRU5PTUVNKQorCQkJZ290byB0cnlfdG9fZnJlZTsKIAkJY29uZF9yZXNjaGVkKCk7CiAJfQogCXJldCA9IDA7CiBvdXQ6CiAJY3NzX3B1dCgmbWVtLT5jc3MpOwogCXJldHVybiByZXQ7CisKK3RyeV90b19mcmVlOgorCS8qIHJldHVybnMgRUJVU1kgaWYgdGhlcmUgaXMgYSB0YXNrIG9yIGlmIHdlIGNvbWUgaGVyZSB0d2ljZS4gKi8KKwlpZiAoY2dyb3VwX3Rhc2tfY291bnQoY2dycCkgfHwgIWxpc3RfZW1wdHkoJmNncnAtPmNoaWxkcmVuKSB8fCBzaHJpbmspIHsKKwkJcmV0ID0gLUVCVVNZOworCQlnb3RvIG91dDsKKwl9CisJLyogd2UgY2FsbCB0cnktdG8tZnJlZSBwYWdlcyBmb3IgbWFrZSB0aGlzIGNncm91cCBlbXB0eSAqLworCWxydV9hZGRfZHJhaW5fYWxsKCk7CisJLyogdHJ5IHRvIGZyZWUgYWxsIHBhZ2VzIGluIHRoaXMgY2dyb3VwICovCisJc2hyaW5rID0gMTsKKwl3aGlsZSAobnJfcmV0cmllcyAmJiBtZW0tPnJlcy51c2FnZSA+IDApIHsKKwkJaW50IHByb2dyZXNzOworCisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJcmV0ID0gLUVJTlRSOworCQkJZ290byBvdXQ7CisJCX0KKwkJcHJvZ3Jlc3MgPSB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKG1lbSwgR0ZQX0tFUk5FTCwKKwkJCQkJCWZhbHNlLCBnZXRfc3dhcHBpbmVzcyhtZW0pKTsKKwkJaWYgKCFwcm9ncmVzcykgeworCQkJbnJfcmV0cmllcy0tOworCQkJLyogbWF5YmUgc29tZSB3cml0ZWJhY2sgaXMgbmVjZXNzYXJ5ICovCisJCQljb25nZXN0aW9uX3dhaXQoV1JJVEUsIEhaLzEwKTsKKwkJfQorCisJfQorCWxydV9hZGRfZHJhaW4oKTsKKwkvKiB0cnkgbW92ZV9hY2NvdW50Li4udGhlcmUgbWF5IGJlIHNvbWUgKmxvY2tlZCogcGFnZXMuICovCisJaWYgKG1lbS0+cmVzLnVzYWdlKQorCQlnb3RvIG1vdmVfYWNjb3VudDsKKwlyZXQgPSAwOworCWdvdG8gb3V0OworfQorCitpbnQgbWVtX2Nncm91cF9mb3JjZV9lbXB0eV93cml0ZShzdHJ1Y3QgY2dyb3VwICpjb250LCB1bnNpZ25lZCBpbnQgZXZlbnQpCit7CisJcmV0dXJuIG1lbV9jZ3JvdXBfZm9yY2VfZW1wdHkobWVtX2Nncm91cF9mcm9tX2NvbnQoY29udCksIHRydWUpOworfQorCisKK3N0YXRpYyB1NjQgbWVtX2Nncm91cF9oaWVyYXJjaHlfcmVhZChzdHJ1Y3QgY2dyb3VwICpjb250LCBzdHJ1Y3QgY2Z0eXBlICpjZnQpCit7CisJcmV0dXJuIG1lbV9jZ3JvdXBfZnJvbV9jb250KGNvbnQpLT51c2VfaGllcmFyY2h5OworfQorCitzdGF0aWMgaW50IG1lbV9jZ3JvdXBfaGllcmFyY2h5X3dyaXRlKHN0cnVjdCBjZ3JvdXAgKmNvbnQsIHN0cnVjdCBjZnR5cGUgKmNmdCwKKwkJCQkJdTY0IHZhbCkKK3sKKwlpbnQgcmV0dmFsID0gMDsKKwlzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtID0gbWVtX2Nncm91cF9mcm9tX2NvbnQoY29udCk7CisJc3RydWN0IGNncm91cCAqcGFyZW50ID0gY29udC0+cGFyZW50OworCXN0cnVjdCBtZW1fY2dyb3VwICpwYXJlbnRfbWVtID0gTlVMTDsKKworCWlmIChwYXJlbnQpCisJCXBhcmVudF9tZW0gPSBtZW1fY2dyb3VwX2Zyb21fY29udChwYXJlbnQpOworCisJY2dyb3VwX2xvY2soKTsKKwkvKgorCSAqIElmIHBhcmVudCdzIHVzZV9oaWVhcmNoeSBpcyBzZXQsIHdlIGNhbid0IG1ha2UgYW55IG1vZGlmaWNhdGlvbnMKKwkgKiBpbiB0aGUgY2hpbGQgc3VidHJlZXMuIElmIGl0IGlzIHVuc2V0LCB0aGVuIHRoZSBjaGFuZ2UgY2FuCisJICogb2NjdXIsIHByb3ZpZGVkIHRoZSBjdXJyZW50IGNncm91cCBoYXMgbm8gY2hpbGRyZW4uCisJICoKKwkgKiBGb3IgdGhlIHJvb3QgY2dyb3VwLCBwYXJlbnRfbWVtIGlzIE5VTEwsIHdlIGFsbG93IHZhbHVlIHRvIGJlCisJICogc2V0IGlmIHRoZXJlIGFyZSBubyBjaGlsZHJlbi4KKwkgKi8KKwlpZiAoKCFwYXJlbnRfbWVtIHx8ICFwYXJlbnRfbWVtLT51c2VfaGllcmFyY2h5KSAmJgorCQkJCSh2YWwgPT0gMSB8fCB2YWwgPT0gMCkpIHsKKwkJaWYgKGxpc3RfZW1wdHkoJmNvbnQtPmNoaWxkcmVuKSkKKwkJCW1lbS0+dXNlX2hpZXJhcmNoeSA9IHZhbDsKKwkJZWxzZQorCQkJcmV0dmFsID0gLUVCVVNZOworCX0gZWxzZQorCQlyZXR2YWwgPSAtRUlOVkFMOworCWNncm91cF91bmxvY2soKTsKKworCXJldHVybiByZXR2YWw7CiB9CiAKIHN0YXRpYyB1NjQgbWVtX2Nncm91cF9yZWFkKHN0cnVjdCBjZ3JvdXAgKmNvbnQsIHN0cnVjdCBjZnR5cGUgKmNmdCkKIHsKLQlyZXR1cm4gcmVzX2NvdW50ZXJfcmVhZF91NjQoJm1lbV9jZ3JvdXBfZnJvbV9jb250KGNvbnQpLT5yZXMsCi0JCQkJICAgIGNmdC0+cHJpdmF0ZSk7CisJc3RydWN0IG1lbV9jZ3JvdXAgKm1lbSA9IG1lbV9jZ3JvdXBfZnJvbV9jb250KGNvbnQpOworCXU2NCB2YWwgPSAwOworCWludCB0eXBlLCBuYW1lOworCisJdHlwZSA9IE1FTUZJTEVfVFlQRShjZnQtPnByaXZhdGUpOworCW5hbWUgPSBNRU1GSUxFX0FUVFIoY2Z0LT5wcml2YXRlKTsKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIF9NRU06CisJCXZhbCA9IHJlc19jb3VudGVyX3JlYWRfdTY0KCZtZW0tPnJlcywgbmFtZSk7CisJCWJyZWFrOworCWNhc2UgX01FTVNXQVA6CisJCWlmIChkb19zd2FwX2FjY291bnQpCisJCQl2YWwgPSByZXNfY291bnRlcl9yZWFkX3U2NCgmbWVtLT5tZW1zdywgbmFtZSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUJVRygpOworCQlicmVhazsKKwl9CisJcmV0dXJuIHZhbDsKIH0KIC8qCiAgKiBUaGUgdXNlciBvZiB0aGlzIGZ1bmN0aW9uIGlzLi4uCkBAIC04OTksMTUgKzE4MTUsMjIgQEAKIAkJCSAgICBjb25zdCBjaGFyICpidWZmZXIpCiB7CiAJc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnID0gbWVtX2Nncm91cF9mcm9tX2NvbnQoY29udCk7CisJaW50IHR5cGUsIG5hbWU7CiAJdW5zaWduZWQgbG9uZyBsb25nIHZhbDsKIAlpbnQgcmV0OwogCi0Jc3dpdGNoIChjZnQtPnByaXZhdGUpIHsKKwl0eXBlID0gTUVNRklMRV9UWVBFKGNmdC0+cHJpdmF0ZSk7CisJbmFtZSA9IE1FTUZJTEVfQVRUUihjZnQtPnByaXZhdGUpOworCXN3aXRjaCAobmFtZSkgewogCWNhc2UgUkVTX0xJTUlUOgogCQkvKiBUaGlzIGZ1bmN0aW9uIGRvZXMgYWxsIG5lY2Vzc2FyeSBwYXJzZS4uLnJldXNlIGl0ICovCiAJCXJldCA9IHJlc19jb3VudGVyX21lbXBhcnNlX3dyaXRlX3N0cmF0ZWd5KGJ1ZmZlciwgJnZhbCk7Ci0JCWlmICghcmV0KQorCQlpZiAocmV0KQorCQkJYnJlYWs7CisJCWlmICh0eXBlID09IF9NRU0pCiAJCQlyZXQgPSBtZW1fY2dyb3VwX3Jlc2l6ZV9saW1pdChtZW1jZywgdmFsKTsKKwkJZWxzZQorCQkJcmV0ID0gbWVtX2Nncm91cF9yZXNpemVfbWVtc3dfbGltaXQobWVtY2csIHZhbCk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXJldCA9IC1FSU5WQUw7IC8qIHNob3VsZCBiZSBCVUcoKSA/ICovCkBAIC05MTYsMjcgKzE4MzksNTkgQEAKIAlyZXR1cm4gcmV0OwogfQogCitzdGF0aWMgdm9pZCBtZW1jZ19nZXRfaGllcmFyY2hpY2FsX2xpbWl0KHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywKKwkJdW5zaWduZWQgbG9uZyBsb25nICptZW1fbGltaXQsIHVuc2lnbmVkIGxvbmcgbG9uZyAqbWVtc3dfbGltaXQpCit7CisJc3RydWN0IGNncm91cCAqY2dyb3VwOworCXVuc2lnbmVkIGxvbmcgbG9uZyBtaW5fbGltaXQsIG1pbl9tZW1zd19saW1pdCwgdG1wOworCisJbWluX2xpbWl0ID0gcmVzX2NvdW50ZXJfcmVhZF91NjQoJm1lbWNnLT5yZXMsIFJFU19MSU1JVCk7CisJbWluX21lbXN3X2xpbWl0ID0gcmVzX2NvdW50ZXJfcmVhZF91NjQoJm1lbWNnLT5tZW1zdywgUkVTX0xJTUlUKTsKKwljZ3JvdXAgPSBtZW1jZy0+Y3NzLmNncm91cDsKKwlpZiAoIW1lbWNnLT51c2VfaGllcmFyY2h5KQorCQlnb3RvIG91dDsKKworCXdoaWxlIChjZ3JvdXAtPnBhcmVudCkgeworCQljZ3JvdXAgPSBjZ3JvdXAtPnBhcmVudDsKKwkJbWVtY2cgPSBtZW1fY2dyb3VwX2Zyb21fY29udChjZ3JvdXApOworCQlpZiAoIW1lbWNnLT51c2VfaGllcmFyY2h5KQorCQkJYnJlYWs7CisJCXRtcCA9IHJlc19jb3VudGVyX3JlYWRfdTY0KCZtZW1jZy0+cmVzLCBSRVNfTElNSVQpOworCQltaW5fbGltaXQgPSBtaW4obWluX2xpbWl0LCB0bXApOworCQl0bXAgPSByZXNfY291bnRlcl9yZWFkX3U2NCgmbWVtY2ctPm1lbXN3LCBSRVNfTElNSVQpOworCQltaW5fbWVtc3dfbGltaXQgPSBtaW4obWluX21lbXN3X2xpbWl0LCB0bXApOworCX0KK291dDoKKwkqbWVtX2xpbWl0ID0gbWluX2xpbWl0OworCSptZW1zd19saW1pdCA9IG1pbl9tZW1zd19saW1pdDsKKwlyZXR1cm47Cit9CisKIHN0YXRpYyBpbnQgbWVtX2Nncm91cF9yZXNldChzdHJ1Y3QgY2dyb3VwICpjb250LCB1bnNpZ25lZCBpbnQgZXZlbnQpCiB7CiAJc3RydWN0IG1lbV9jZ3JvdXAgKm1lbTsKKwlpbnQgdHlwZSwgbmFtZTsKIAogCW1lbSA9IG1lbV9jZ3JvdXBfZnJvbV9jb250KGNvbnQpOwotCXN3aXRjaCAoZXZlbnQpIHsKKwl0eXBlID0gTUVNRklMRV9UWVBFKGV2ZW50KTsKKwluYW1lID0gTUVNRklMRV9BVFRSKGV2ZW50KTsKKwlzd2l0Y2ggKG5hbWUpIHsKIAljYXNlIFJFU19NQVhfVVNBR0U6Ci0JCXJlc19jb3VudGVyX3Jlc2V0X21heCgmbWVtLT5yZXMpOworCQlpZiAodHlwZSA9PSBfTUVNKQorCQkJcmVzX2NvdW50ZXJfcmVzZXRfbWF4KCZtZW0tPnJlcyk7CisJCWVsc2UKKwkJCXJlc19jb3VudGVyX3Jlc2V0X21heCgmbWVtLT5tZW1zdyk7CiAJCWJyZWFrOwogCWNhc2UgUkVTX0ZBSUxDTlQ6Ci0JCXJlc19jb3VudGVyX3Jlc2V0X2ZhaWxjbnQoJm1lbS0+cmVzKTsKKwkJaWYgKHR5cGUgPT0gX01FTSkKKwkJCXJlc19jb3VudGVyX3Jlc2V0X2ZhaWxjbnQoJm1lbS0+cmVzKTsKKwkJZWxzZQorCQkJcmVzX2NvdW50ZXJfcmVzZXRfZmFpbGNudCgmbWVtLT5tZW1zdyk7CiAJCWJyZWFrOwogCX0KIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBtZW1fZm9yY2VfZW1wdHlfd3JpdGUoc3RydWN0IGNncm91cCAqY29udCwgdW5zaWduZWQgaW50IGV2ZW50KQotewotCXJldHVybiBtZW1fY2dyb3VwX2ZvcmNlX2VtcHR5KG1lbV9jZ3JvdXBfZnJvbV9jb250KGNvbnQpKTsKLX0KLQogc3RhdGljIGNvbnN0IHN0cnVjdCBtZW1fY2dyb3VwX3N0YXRfZGVzYyB7CiAJY29uc3QgY2hhciAqbXNnOwogCXU2NCB1bml0OwpAQCAtOTg1LDQzICsxOTQwLDE3MSBAQAogCQljYi0+ZmlsbChjYiwgInVuZXZpY3RhYmxlIiwgdW5ldmljdGFibGUgKiBQQUdFX1NJWkUpOwogCiAJfQorCXsKKwkJdW5zaWduZWQgbG9uZyBsb25nIGxpbWl0LCBtZW1zd19saW1pdDsKKwkJbWVtY2dfZ2V0X2hpZXJhcmNoaWNhbF9saW1pdChtZW1fY29udCwgJmxpbWl0LCAmbWVtc3dfbGltaXQpOworCQljYi0+ZmlsbChjYiwgImhpZXJhcmNoaWNhbF9tZW1vcnlfbGltaXQiLCBsaW1pdCk7CisJCWlmIChkb19zd2FwX2FjY291bnQpCisJCQljYi0+ZmlsbChjYiwgImhpZXJhcmNoaWNhbF9tZW1zd19saW1pdCIsIG1lbXN3X2xpbWl0KTsKKwl9CisKKyNpZmRlZiBDT05GSUdfREVCVUdfVk0KKwljYi0+ZmlsbChjYiwgImluYWN0aXZlX3JhdGlvIiwgY2FsY19pbmFjdGl2ZV9yYXRpbyhtZW1fY29udCwgTlVMTCkpOworCisJeworCQlpbnQgbmlkLCB6aWQ7CisJCXN0cnVjdCBtZW1fY2dyb3VwX3Blcl96b25lICptejsKKwkJdW5zaWduZWQgbG9uZyByZWNlbnRfcm90YXRlZFsyXSA9IHswLCAwfTsKKwkJdW5zaWduZWQgbG9uZyByZWNlbnRfc2Nhbm5lZFsyXSA9IHswLCAwfTsKKworCQlmb3JfZWFjaF9vbmxpbmVfbm9kZShuaWQpCisJCQlmb3IgKHppZCA9IDA7IHppZCA8IE1BWF9OUl9aT05FUzsgemlkKyspIHsKKwkJCQlteiA9IG1lbV9jZ3JvdXBfem9uZWluZm8obWVtX2NvbnQsIG5pZCwgemlkKTsKKworCQkJCXJlY2VudF9yb3RhdGVkWzBdICs9CisJCQkJCW16LT5yZWNsYWltX3N0YXQucmVjZW50X3JvdGF0ZWRbMF07CisJCQkJcmVjZW50X3JvdGF0ZWRbMV0gKz0KKwkJCQkJbXotPnJlY2xhaW1fc3RhdC5yZWNlbnRfcm90YXRlZFsxXTsKKwkJCQlyZWNlbnRfc2Nhbm5lZFswXSArPQorCQkJCQltei0+cmVjbGFpbV9zdGF0LnJlY2VudF9zY2FubmVkWzBdOworCQkJCXJlY2VudF9zY2FubmVkWzFdICs9CisJCQkJCW16LT5yZWNsYWltX3N0YXQucmVjZW50X3NjYW5uZWRbMV07CisJCQl9CisJCWNiLT5maWxsKGNiLCAicmVjZW50X3JvdGF0ZWRfYW5vbiIsIHJlY2VudF9yb3RhdGVkWzBdKTsKKwkJY2ItPmZpbGwoY2IsICJyZWNlbnRfcm90YXRlZF9maWxlIiwgcmVjZW50X3JvdGF0ZWRbMV0pOworCQljYi0+ZmlsbChjYiwgInJlY2VudF9zY2FubmVkX2Fub24iLCByZWNlbnRfc2Nhbm5lZFswXSk7CisJCWNiLT5maWxsKGNiLCAicmVjZW50X3NjYW5uZWRfZmlsZSIsIHJlY2VudF9zY2FubmVkWzFdKTsKKwl9CisjZW5kaWYKKwogCXJldHVybiAwOwogfQogCitzdGF0aWMgdTY0IG1lbV9jZ3JvdXBfc3dhcHBpbmVzc19yZWFkKHN0cnVjdCBjZ3JvdXAgKmNncnAsIHN0cnVjdCBjZnR5cGUgKmNmdCkKK3sKKwlzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2cgPSBtZW1fY2dyb3VwX2Zyb21fY29udChjZ3JwKTsKKworCXJldHVybiBnZXRfc3dhcHBpbmVzcyhtZW1jZyk7Cit9CisKK3N0YXRpYyBpbnQgbWVtX2Nncm91cF9zd2FwcGluZXNzX3dyaXRlKHN0cnVjdCBjZ3JvdXAgKmNncnAsIHN0cnVjdCBjZnR5cGUgKmNmdCwKKwkJCQkgICAgICAgdTY0IHZhbCkKK3sKKwlzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2cgPSBtZW1fY2dyb3VwX2Zyb21fY29udChjZ3JwKTsKKwlzdHJ1Y3QgbWVtX2Nncm91cCAqcGFyZW50OworCisJaWYgKHZhbCA+IDEwMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoY2dycC0+cGFyZW50ID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCisJcGFyZW50ID0gbWVtX2Nncm91cF9mcm9tX2NvbnQoY2dycC0+cGFyZW50KTsKKworCWNncm91cF9sb2NrKCk7CisKKwkvKiBJZiB1bmRlciBoaWVyYXJjaHksIG9ubHkgZW1wdHktcm9vdCBjYW4gc2V0IHRoaXMgdmFsdWUgKi8KKwlpZiAoKHBhcmVudC0+dXNlX2hpZXJhcmNoeSkgfHwKKwkgICAgKG1lbWNnLT51c2VfaGllcmFyY2h5ICYmICFsaXN0X2VtcHR5KCZjZ3JwLT5jaGlsZHJlbikpKSB7CisJCWNncm91cF91bmxvY2soKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc3Bpbl9sb2NrKCZtZW1jZy0+cmVjbGFpbV9wYXJhbV9sb2NrKTsKKwltZW1jZy0+c3dhcHBpbmVzcyA9IHZhbDsKKwlzcGluX3VubG9jaygmbWVtY2ctPnJlY2xhaW1fcGFyYW1fbG9jayk7CisKKwljZ3JvdXBfdW5sb2NrKCk7CisKKwlyZXR1cm4gMDsKK30KKworCiBzdGF0aWMgc3RydWN0IGNmdHlwZSBtZW1fY2dyb3VwX2ZpbGVzW10gPSB7CiAJewogCQkubmFtZSA9ICJ1c2FnZV9pbl9ieXRlcyIsCi0JCS5wcml2YXRlID0gUkVTX1VTQUdFLAorCQkucHJpdmF0ZSA9IE1FTUZJTEVfUFJJVkFURShfTUVNLCBSRVNfVVNBR0UpLAogCQkucmVhZF91NjQgPSBtZW1fY2dyb3VwX3JlYWQsCiAJfSwKIAl7CiAJCS5uYW1lID0gIm1heF91c2FnZV9pbl9ieXRlcyIsCi0JCS5wcml2YXRlID0gUkVTX01BWF9VU0FHRSwKKwkJLnByaXZhdGUgPSBNRU1GSUxFX1BSSVZBVEUoX01FTSwgUkVTX01BWF9VU0FHRSksCiAJCS50cmlnZ2VyID0gbWVtX2Nncm91cF9yZXNldCwKIAkJLnJlYWRfdTY0ID0gbWVtX2Nncm91cF9yZWFkLAogCX0sCiAJewogCQkubmFtZSA9ICJsaW1pdF9pbl9ieXRlcyIsCi0JCS5wcml2YXRlID0gUkVTX0xJTUlULAorCQkucHJpdmF0ZSA9IE1FTUZJTEVfUFJJVkFURShfTUVNLCBSRVNfTElNSVQpLAogCQkud3JpdGVfc3RyaW5nID0gbWVtX2Nncm91cF93cml0ZSwKIAkJLnJlYWRfdTY0ID0gbWVtX2Nncm91cF9yZWFkLAogCX0sCiAJewogCQkubmFtZSA9ICJmYWlsY250IiwKLQkJLnByaXZhdGUgPSBSRVNfRkFJTENOVCwKKwkJLnByaXZhdGUgPSBNRU1GSUxFX1BSSVZBVEUoX01FTSwgUkVTX0ZBSUxDTlQpLAogCQkudHJpZ2dlciA9IG1lbV9jZ3JvdXBfcmVzZXQsCiAJCS5yZWFkX3U2NCA9IG1lbV9jZ3JvdXBfcmVhZCwKIAl9LAogCXsKLQkJLm5hbWUgPSAiZm9yY2VfZW1wdHkiLAotCQkudHJpZ2dlciA9IG1lbV9mb3JjZV9lbXB0eV93cml0ZSwKLQl9LAotCXsKIAkJLm5hbWUgPSAic3RhdCIsCiAJCS5yZWFkX21hcCA9IG1lbV9jb250cm9sX3N0YXRfc2hvdywKIAl9LAorCXsKKwkJLm5hbWUgPSAiZm9yY2VfZW1wdHkiLAorCQkudHJpZ2dlciA9IG1lbV9jZ3JvdXBfZm9yY2VfZW1wdHlfd3JpdGUsCisJfSwKKwl7CisJCS5uYW1lID0gInVzZV9oaWVyYXJjaHkiLAorCQkud3JpdGVfdTY0ID0gbWVtX2Nncm91cF9oaWVyYXJjaHlfd3JpdGUsCisJCS5yZWFkX3U2NCA9IG1lbV9jZ3JvdXBfaGllcmFyY2h5X3JlYWQsCisJfSwKKwl7CisJCS5uYW1lID0gInN3YXBwaW5lc3MiLAorCQkucmVhZF91NjQgPSBtZW1fY2dyb3VwX3N3YXBwaW5lc3NfcmVhZCwKKwkJLndyaXRlX3U2NCA9IG1lbV9jZ3JvdXBfc3dhcHBpbmVzc193cml0ZSwKKwl9LAogfTsKIAorI2lmZGVmIENPTkZJR19DR1JPVVBfTUVNX1JFU19DVExSX1NXQVAKK3N0YXRpYyBzdHJ1Y3QgY2Z0eXBlIG1lbXN3X2Nncm91cF9maWxlc1tdID0geworCXsKKwkJLm5hbWUgPSAibWVtc3cudXNhZ2VfaW5fYnl0ZXMiLAorCQkucHJpdmF0ZSA9IE1FTUZJTEVfUFJJVkFURShfTUVNU1dBUCwgUkVTX1VTQUdFKSwKKwkJLnJlYWRfdTY0ID0gbWVtX2Nncm91cF9yZWFkLAorCX0sCisJeworCQkubmFtZSA9ICJtZW1zdy5tYXhfdXNhZ2VfaW5fYnl0ZXMiLAorCQkucHJpdmF0ZSA9IE1FTUZJTEVfUFJJVkFURShfTUVNU1dBUCwgUkVTX01BWF9VU0FHRSksCisJCS50cmlnZ2VyID0gbWVtX2Nncm91cF9yZXNldCwKKwkJLnJlYWRfdTY0ID0gbWVtX2Nncm91cF9yZWFkLAorCX0sCisJeworCQkubmFtZSA9ICJtZW1zdy5saW1pdF9pbl9ieXRlcyIsCisJCS5wcml2YXRlID0gTUVNRklMRV9QUklWQVRFKF9NRU1TV0FQLCBSRVNfTElNSVQpLAorCQkud3JpdGVfc3RyaW5nID0gbWVtX2Nncm91cF93cml0ZSwKKwkJLnJlYWRfdTY0ID0gbWVtX2Nncm91cF9yZWFkLAorCX0sCisJeworCQkubmFtZSA9ICJtZW1zdy5mYWlsY250IiwKKwkJLnByaXZhdGUgPSBNRU1GSUxFX1BSSVZBVEUoX01FTVNXQVAsIFJFU19GQUlMQ05UKSwKKwkJLnRyaWdnZXIgPSBtZW1fY2dyb3VwX3Jlc2V0LAorCQkucmVhZF91NjQgPSBtZW1fY2dyb3VwX3JlYWQsCisJfSwKK307CisKK3N0YXRpYyBpbnQgcmVnaXN0ZXJfbWVtc3dfZmlsZXMoc3RydWN0IGNncm91cCAqY29udCwgc3RydWN0IGNncm91cF9zdWJzeXMgKnNzKQoreworCWlmICghZG9fc3dhcF9hY2NvdW50KQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gY2dyb3VwX2FkZF9maWxlcyhjb250LCBzcywgbWVtc3dfY2dyb3VwX2ZpbGVzLAorCQkJCUFSUkFZX1NJWkUobWVtc3dfY2dyb3VwX2ZpbGVzKSk7Cit9OworI2Vsc2UKK3N0YXRpYyBpbnQgcmVnaXN0ZXJfbWVtc3dfZmlsZXMoc3RydWN0IGNncm91cCAqY29udCwgc3RydWN0IGNncm91cF9zdWJzeXMgKnNzKQoreworCXJldHVybiAwOworfQorI2VuZGlmCisKIHN0YXRpYyBpbnQgYWxsb2NfbWVtX2Nncm91cF9wZXJfem9uZV9pbmZvKHN0cnVjdCBtZW1fY2dyb3VwICptZW0sIGludCBub2RlKQogewogCXN0cnVjdCBtZW1fY2dyb3VwX3Blcl9ub2RlICpwbjsKQEAgLTEwNDcsNyArMjEzMCw2IEBACiAKIAlmb3IgKHpvbmUgPSAwOyB6b25lIDwgTUFYX05SX1pPTkVTOyB6b25lKyspIHsKIAkJbXogPSAmcG4tPnpvbmVpbmZvW3pvbmVdOwotCQlzcGluX2xvY2tfaW5pdCgmbXotPmxydV9sb2NrKTsKIAkJZm9yX2VhY2hfbHJ1KGwpCiAJCQlJTklUX0xJU1RfSEVBRCgmbXotPmxpc3RzW2xdKTsKIAl9CkBAIC0xMDU5LDU1ICsyMTQxLDExMyBAQAogCWtmcmVlKG1lbS0+aW5mby5ub2RlaW5mb1tub2RlXSk7CiB9CiAKK3N0YXRpYyBpbnQgbWVtX2Nncm91cF9zaXplKHZvaWQpCit7CisJaW50IGNwdXN0YXRfc2l6ZSA9IG5yX2NwdV9pZHMgKiBzaXplb2Yoc3RydWN0IG1lbV9jZ3JvdXBfc3RhdF9jcHUpOworCXJldHVybiBzaXplb2Yoc3RydWN0IG1lbV9jZ3JvdXApICsgY3B1c3RhdF9zaXplOworfQorCiBzdGF0aWMgc3RydWN0IG1lbV9jZ3JvdXAgKm1lbV9jZ3JvdXBfYWxsb2Modm9pZCkKIHsKIAlzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtOworCWludCBzaXplID0gbWVtX2Nncm91cF9zaXplKCk7CiAKLQlpZiAoc2l6ZW9mKCptZW0pIDwgUEFHRV9TSVpFKQotCQltZW0gPSBrbWFsbG9jKHNpemVvZigqbWVtKSwgR0ZQX0tFUk5FTCk7CisJaWYgKHNpemUgPCBQQUdFX1NJWkUpCisJCW1lbSA9IGttYWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7CiAJZWxzZQotCQltZW0gPSB2bWFsbG9jKHNpemVvZigqbWVtKSk7CisJCW1lbSA9IHZtYWxsb2Moc2l6ZSk7CiAKIAlpZiAobWVtKQotCQltZW1zZXQobWVtLCAwLCBzaXplb2YoKm1lbSkpOworCQltZW1zZXQobWVtLCAwLCBzaXplKTsKIAlyZXR1cm4gbWVtOwogfQogCi1zdGF0aWMgdm9pZCBtZW1fY2dyb3VwX2ZyZWUoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbSkKKy8qCisgKiBBdCBkZXN0cm95aW5nIG1lbV9jZ3JvdXAsIHJlZmVyZW5jZXMgZnJvbSBzd2FwX2Nncm91cCBjYW4gcmVtYWluLgorICogKHNjYW5uaW5nIGFsbCBhdCBmb3JjZV9lbXB0eSBpcyB0b28gY29zdGx5Li4uKQorICoKKyAqIEluc3RlYWQgb2YgY2xlYXJpbmcgYWxsIHJlZmVyZW5jZXMgYXQgZm9yY2VfZW1wdHksIHdlIHJlbWVtYmVyCisgKiB0aGUgbnVtYmVyIG9mIHJlZmVyZW5jZSBmcm9tIHN3YXBfY2dyb3VwIGFuZCBmcmVlIG1lbV9jZ3JvdXAgd2hlbgorICogaXQgZ29lcyBkb3duIHRvIDAuCisgKgorICogUmVtb3ZhbCBvZiBjZ3JvdXAgaXRzZWxmIHN1Y2NlZWRzIHJlZ2FyZGxlc3Mgb2YgcmVmcyBmcm9tIHN3YXAuCisgKi8KKworc3RhdGljIHZvaWQgX19tZW1fY2dyb3VwX2ZyZWUoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbSkKIHsKLQlpZiAoc2l6ZW9mKCptZW0pIDwgUEFHRV9TSVpFKQorCWludCBub2RlOworCisJZm9yX2VhY2hfbm9kZV9zdGF0ZShub2RlLCBOX1BPU1NJQkxFKQorCQlmcmVlX21lbV9jZ3JvdXBfcGVyX3pvbmVfaW5mbyhtZW0sIG5vZGUpOworCisJaWYgKG1lbV9jZ3JvdXBfc2l6ZSgpIDwgUEFHRV9TSVpFKQogCQlrZnJlZShtZW0pOwogCWVsc2UKIAkJdmZyZWUobWVtKTsKIH0KIAorc3RhdGljIHZvaWQgbWVtX2Nncm91cF9nZXQoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbSkKK3sKKwlhdG9taWNfaW5jKCZtZW0tPnJlZmNudCk7Cit9CiAKLXN0YXRpYyBzdHJ1Y3QgY2dyb3VwX3N1YnN5c19zdGF0ZSAqCitzdGF0aWMgdm9pZCBtZW1fY2dyb3VwX3B1dChzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtKQoreworCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZtZW0tPnJlZmNudCkpCisJCV9fbWVtX2Nncm91cF9mcmVlKG1lbSk7Cit9CisKKworI2lmZGVmIENPTkZJR19DR1JPVVBfTUVNX1JFU19DVExSX1NXQVAKK3N0YXRpYyB2b2lkIF9faW5pdCBlbmFibGVfc3dhcF9jZ3JvdXAodm9pZCkKK3sKKwlpZiAoIW1lbV9jZ3JvdXBfZGlzYWJsZWQoKSAmJiByZWFsbHlfZG9fc3dhcF9hY2NvdW50KQorCQlkb19zd2FwX2FjY291bnQgPSAxOworfQorI2Vsc2UKK3N0YXRpYyB2b2lkIF9faW5pdCBlbmFibGVfc3dhcF9jZ3JvdXAodm9pZCkKK3sKK30KKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IGNncm91cF9zdWJzeXNfc3RhdGUgKiBfX3JlZgogbWVtX2Nncm91cF9jcmVhdGUoc3RydWN0IGNncm91cF9zdWJzeXMgKnNzLCBzdHJ1Y3QgY2dyb3VwICpjb250KQogewotCXN0cnVjdCBtZW1fY2dyb3VwICptZW07CisJc3RydWN0IG1lbV9jZ3JvdXAgKm1lbSwgKnBhcmVudDsKIAlpbnQgbm9kZTsKIAotCWlmICh1bmxpa2VseSgoY29udC0+cGFyZW50KSA9PSBOVUxMKSkgewotCQltZW0gPSAmaW5pdF9tZW1fY2dyb3VwOwotCX0gZWxzZSB7Ci0JCW1lbSA9IG1lbV9jZ3JvdXBfYWxsb2MoKTsKLQkJaWYgKCFtZW0pCi0JCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKLQl9Ci0KLQlyZXNfY291bnRlcl9pbml0KCZtZW0tPnJlcyk7CisJbWVtID0gbWVtX2Nncm91cF9hbGxvYygpOworCWlmICghbWVtKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKIAogCWZvcl9lYWNoX25vZGVfc3RhdGUobm9kZSwgTl9QT1NTSUJMRSkKIAkJaWYgKGFsbG9jX21lbV9jZ3JvdXBfcGVyX3pvbmVfaW5mbyhtZW0sIG5vZGUpKQogCQkJZ290byBmcmVlX291dDsKKwkvKiByb290ID8gKi8KKwlpZiAoY29udC0+cGFyZW50ID09IE5VTEwpIHsKKwkJZW5hYmxlX3N3YXBfY2dyb3VwKCk7CisJCXBhcmVudCA9IE5VTEw7CisJfSBlbHNlIHsKKwkJcGFyZW50ID0gbWVtX2Nncm91cF9mcm9tX2NvbnQoY29udC0+cGFyZW50KTsKKwkJbWVtLT51c2VfaGllcmFyY2h5ID0gcGFyZW50LT51c2VfaGllcmFyY2h5OworCX0KIAorCWlmIChwYXJlbnQgJiYgcGFyZW50LT51c2VfaGllcmFyY2h5KSB7CisJCXJlc19jb3VudGVyX2luaXQoJm1lbS0+cmVzLCAmcGFyZW50LT5yZXMpOworCQlyZXNfY291bnRlcl9pbml0KCZtZW0tPm1lbXN3LCAmcGFyZW50LT5tZW1zdyk7CisJfSBlbHNlIHsKKwkJcmVzX2NvdW50ZXJfaW5pdCgmbWVtLT5yZXMsIE5VTEwpOworCQlyZXNfY291bnRlcl9pbml0KCZtZW0tPm1lbXN3LCBOVUxMKTsKKwl9CisJbWVtLT5sYXN0X3NjYW5uZWRfY2hpbGQgPSBOVUxMOworCXNwaW5fbG9ja19pbml0KCZtZW0tPnJlY2xhaW1fcGFyYW1fbG9jayk7CisKKwlpZiAocGFyZW50KQorCQltZW0tPnN3YXBwaW5lc3MgPSBnZXRfc3dhcHBpbmVzcyhwYXJlbnQpOworCWF0b21pY19zZXQoJm1lbS0+cmVmY250LCAxKTsKIAlyZXR1cm4gJm1lbS0+Y3NzOwogZnJlZV9vdXQ6Ci0JZm9yX2VhY2hfbm9kZV9zdGF0ZShub2RlLCBOX1BPU1NJQkxFKQotCQlmcmVlX21lbV9jZ3JvdXBfcGVyX3pvbmVfaW5mbyhtZW0sIG5vZGUpOwotCWlmIChjb250LT5wYXJlbnQgIT0gTlVMTCkKLQkJbWVtX2Nncm91cF9mcmVlKG1lbSk7CisJX19tZW1fY2dyb3VwX2ZyZWUobWVtKTsKIAlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKIH0KIApAQCAtMTExNSwyNiArMjI1NSwzMyBAQAogCQkJCQlzdHJ1Y3QgY2dyb3VwICpjb250KQogewogCXN0cnVjdCBtZW1fY2dyb3VwICptZW0gPSBtZW1fY2dyb3VwX2Zyb21fY29udChjb250KTsKLQltZW1fY2dyb3VwX2ZvcmNlX2VtcHR5KG1lbSk7CisJbWVtX2Nncm91cF9mb3JjZV9lbXB0eShtZW0sIGZhbHNlKTsKIH0KIAogc3RhdGljIHZvaWQgbWVtX2Nncm91cF9kZXN0cm95KHN0cnVjdCBjZ3JvdXBfc3Vic3lzICpzcywKIAkJCQlzdHJ1Y3QgY2dyb3VwICpjb250KQogewotCWludCBub2RlOwogCXN0cnVjdCBtZW1fY2dyb3VwICptZW0gPSBtZW1fY2dyb3VwX2Zyb21fY29udChjb250KTsKKwlzdHJ1Y3QgbWVtX2Nncm91cCAqbGFzdF9zY2FubmVkX2NoaWxkID0gbWVtLT5sYXN0X3NjYW5uZWRfY2hpbGQ7CiAKLQlmb3JfZWFjaF9ub2RlX3N0YXRlKG5vZGUsIE5fUE9TU0lCTEUpCi0JCWZyZWVfbWVtX2Nncm91cF9wZXJfem9uZV9pbmZvKG1lbSwgbm9kZSk7Ci0KLQltZW1fY2dyb3VwX2ZyZWUobWVtX2Nncm91cF9mcm9tX2NvbnQoY29udCkpOworCWlmIChsYXN0X3NjYW5uZWRfY2hpbGQpIHsKKwkJVk1fQlVHX09OKCFtZW1fY2dyb3VwX2lzX29ic29sZXRlKGxhc3Rfc2Nhbm5lZF9jaGlsZCkpOworCQltZW1fY2dyb3VwX3B1dChsYXN0X3NjYW5uZWRfY2hpbGQpOworCX0KKwltZW1fY2dyb3VwX3B1dChtZW0pOwogfQogCiBzdGF0aWMgaW50IG1lbV9jZ3JvdXBfcG9wdWxhdGUoc3RydWN0IGNncm91cF9zdWJzeXMgKnNzLAogCQkJCXN0cnVjdCBjZ3JvdXAgKmNvbnQpCiB7Ci0JcmV0dXJuIGNncm91cF9hZGRfZmlsZXMoY29udCwgc3MsIG1lbV9jZ3JvdXBfZmlsZXMsCi0JCQkJCUFSUkFZX1NJWkUobWVtX2Nncm91cF9maWxlcykpOworCWludCByZXQ7CisKKwlyZXQgPSBjZ3JvdXBfYWRkX2ZpbGVzKGNvbnQsIHNzLCBtZW1fY2dyb3VwX2ZpbGVzLAorCQkJCUFSUkFZX1NJWkUobWVtX2Nncm91cF9maWxlcykpOworCisJaWYgKCFyZXQpCisJCXJldCA9IHJlZ2lzdGVyX21lbXN3X2ZpbGVzKGNvbnQsIHNzKTsKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgdm9pZCBtZW1fY2dyb3VwX21vdmVfdGFzayhzdHJ1Y3QgY2dyb3VwX3N1YnN5cyAqc3MsCkBAIC0xMTQyLDI1ICsyMjg5LDEyIEBACiAJCQkJc3RydWN0IGNncm91cCAqb2xkX2NvbnQsCiAJCQkJc3RydWN0IHRhc2tfc3RydWN0ICpwKQogewotCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tOwotCXN0cnVjdCBtZW1fY2dyb3VwICptZW0sICpvbGRfbWVtOwotCi0JbW0gPSBnZXRfdGFza19tbShwKTsKLQlpZiAobW0gPT0gTlVMTCkKLQkJcmV0dXJuOwotCi0JbWVtID0gbWVtX2Nncm91cF9mcm9tX2NvbnQoY29udCk7Ci0Jb2xkX21lbSA9IG1lbV9jZ3JvdXBfZnJvbV9jb250KG9sZF9jb250KTsKLQorCW11dGV4X2xvY2soJm1lbWNnX3Rhc2tsaXN0KTsKIAkvKgotCSAqIE9ubHkgdGhyZWFkIGdyb3VwIGxlYWRlcnMgYXJlIGFsbG93ZWQgdG8gbWlncmF0ZSwgdGhlIG1tX3N0cnVjdCBpcwotCSAqIGluIGVmZmVjdCBvd25lZCBieSB0aGUgbGVhZGVyCisJICogRklYTUU6IEl0J3MgYmV0dGVyIHRvIG1vdmUgY2hhcmdlcyBvZiB0aGlzIHByb2Nlc3MgZnJvbSBvbGQKKwkgKiBtZW1jZyB0byBuZXcgbWVtY2cuIEJ1dCBpdCdzIGp1c3Qgb24gVE9ETy1MaXN0IG5vdy4KIAkgKi8KLQlpZiAoIXRocmVhZF9ncm91cF9sZWFkZXIocCkpCi0JCWdvdG8gb3V0OwotCi1vdXQ6Ci0JbW1wdXQobW0pOworCW11dGV4X3VubG9jaygmbWVtY2dfdGFza2xpc3QpOwogfQogCiBzdHJ1Y3QgY2dyb3VwX3N1YnN5cyBtZW1fY2dyb3VwX3N1YnN5cyA9IHsKQEAgLTExNzMsMyArMjMwNywxMyBAQAogCS5hdHRhY2ggPSBtZW1fY2dyb3VwX21vdmVfdGFzaywKIAkuZWFybHlfaW5pdCA9IDAsCiB9OworCisjaWZkZWYgQ09ORklHX0NHUk9VUF9NRU1fUkVTX0NUTFJfU1dBUAorCitzdGF0aWMgaW50IF9faW5pdCBkaXNhYmxlX3N3YXBfYWNjb3VudChjaGFyICpzKQoreworCXJlYWxseV9kb19zd2FwX2FjY291bnQgPSAwOworCXJldHVybiAxOworfQorX19zZXR1cCgibm9zd2FwYWNjb3VudCIsIGRpc2FibGVfc3dhcF9hY2NvdW50KTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbW0vbWVtb3J5LmMgYi9tbS9tZW1vcnkuYwppbmRleCAzZjhmYTA2Li4yMmJmYTdhIDEwMDY0NAotLS0gYS9tbS9tZW1vcnkuYworKysgYi9tbS9tZW1vcnkuYwpAQCAtMTUxMSw2ICsxNTExLDcgQEAKIAkJCXVuc2lnbmVkIGxvbmcgcGZuKQogewogCWludCByZXQ7CisJcGdwcm90X3QgcGdwcm90ID0gdm1hLT52bV9wYWdlX3Byb3Q7CiAJLyoKIAkgKiBUZWNobmljYWxseSwgYXJjaGl0ZWN0dXJlcyB3aXRoIHB0ZV9zcGVjaWFsIGNhbiBhdm9pZCBhbGwgdGhlc2UKIAkgKiByZXN0cmljdGlvbnMgKHNhbWUgZm9yIHJlbWFwX3Bmbl9yYW5nZSkuICBIb3dldmVyIHdlIHdvdWxkIGxpa2UKQEAgLTE1MjUsMTAgKzE1MjYsMTAgQEAKIAogCWlmIChhZGRyIDwgdm1hLT52bV9zdGFydCB8fCBhZGRyID49IHZtYS0+dm1fZW5kKQogCQlyZXR1cm4gLUVGQVVMVDsKLQlpZiAodHJhY2tfcGZuX3ZtYV9uZXcodm1hLCB2bWEtPnZtX3BhZ2VfcHJvdCwgcGZuLCBQQUdFX1NJWkUpKQorCWlmICh0cmFja19wZm5fdm1hX25ldyh2bWEsICZwZ3Byb3QsIHBmbiwgUEFHRV9TSVpFKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlyZXQgPSBpbnNlcnRfcGZuKHZtYSwgYWRkciwgcGZuLCB2bWEtPnZtX3BhZ2VfcHJvdCk7CisJcmV0ID0gaW5zZXJ0X3Bmbih2bWEsIGFkZHIsIHBmbiwgcGdwcm90KTsKIAogCWlmIChyZXQpCiAJCXVudHJhY2tfcGZuX3ZtYSh2bWEsIHBmbiwgUEFHRV9TSVpFKTsKQEAgLTE2NzEsOSArMTY3MiwxNSBAQAogCiAJdm1hLT52bV9mbGFncyB8PSBWTV9JTyB8IFZNX1JFU0VSVkVEIHwgVk1fUEZOTUFQOwogCi0JZXJyID0gdHJhY2tfcGZuX3ZtYV9uZXcodm1hLCBwcm90LCBwZm4sIFBBR0VfQUxJR04oc2l6ZSkpOwotCWlmIChlcnIpCisJZXJyID0gdHJhY2tfcGZuX3ZtYV9uZXcodm1hLCAmcHJvdCwgcGZuLCBQQUdFX0FMSUdOKHNpemUpKTsKKwlpZiAoZXJyKSB7CisJCS8qCisJCSAqIFRvIGluZGljYXRlIHRoYXQgdHJhY2tfcGZuIHJlbGF0ZWQgY2xlYW51cCBpcyBub3QKKwkJICogbmVlZGVkIGZyb20gaGlnaGVyIGxldmVsIHJvdXRpbmUgY2FsbGluZyB1bm1hcF92bWFzCisJCSAqLworCQl2bWEtPnZtX2ZsYWdzICY9IH4oVk1fSU8gfCBWTV9SRVNFUlZFRCB8IFZNX1BGTk1BUCk7CiAJCXJldHVybiAtRUlOVkFMOworCX0KIAogCUJVR19PTihhZGRyID49IGVuZCk7CiAJcGZuIC09IGFkZHIgPj4gUEFHRV9TSElGVDsKQEAgLTIwMDAsNyArMjAwNyw3IEBACiAJY293X3VzZXJfcGFnZShuZXdfcGFnZSwgb2xkX3BhZ2UsIGFkZHJlc3MsIHZtYSk7CiAJX19TZXRQYWdlVXB0b2RhdGUobmV3X3BhZ2UpOwogCi0JaWYgKG1lbV9jZ3JvdXBfY2hhcmdlKG5ld19wYWdlLCBtbSwgR0ZQX0tFUk5FTCkpCisJaWYgKG1lbV9jZ3JvdXBfbmV3cGFnZV9jaGFyZ2UobmV3X3BhZ2UsIG1tLCBHRlBfS0VSTkVMKSkKIAkJZ290byBvb21fZnJlZV9uZXc7CiAKIAkvKgpAQCAtMjM5Miw2ICsyMzk5LDcgQEAKIAlzdHJ1Y3QgcGFnZSAqcGFnZTsKIAlzd3BfZW50cnlfdCBlbnRyeTsKIAlwdGVfdCBwdGU7CisJc3RydWN0IG1lbV9jZ3JvdXAgKnB0ciA9IE5VTEw7CiAJaW50IHJldCA9IDA7CiAKIAlpZiAoIXB0ZV91bm1hcF9zYW1lKG1tLCBwbWQsIHBhZ2VfdGFibGUsIG9yaWdfcHRlKSkKQEAgLTI0MzAsNyArMjQzOCw3IEBACiAJbG9ja19wYWdlKHBhZ2UpOwogCWRlbGF5YWNjdF9jbGVhcl9mbGFnKERFTEFZQUNDVF9QRl9TV0FQSU4pOwogCi0JaWYgKG1lbV9jZ3JvdXBfY2hhcmdlKHBhZ2UsIG1tLCBHRlBfS0VSTkVMKSkgeworCWlmIChtZW1fY2dyb3VwX3RyeV9jaGFyZ2Vfc3dhcGluKG1tLCBwYWdlLCBHRlBfS0VSTkVMLCAmcHRyKSkgewogCQlyZXQgPSBWTV9GQVVMVF9PT007CiAJCXVubG9ja19wYWdlKHBhZ2UpOwogCQlnb3RvIG91dDsKQEAgLTI0NDgsNyArMjQ1NiwxOSBAQAogCQlnb3RvIG91dF9ub21hcDsKIAl9CiAKLQkvKiBUaGUgcGFnZSBpc24ndCBwcmVzZW50IHlldCwgZ28gYWhlYWQgd2l0aCB0aGUgZmF1bHQuICovCisJLyoKKwkgKiBUaGUgcGFnZSBpc24ndCBwcmVzZW50IHlldCwgZ28gYWhlYWQgd2l0aCB0aGUgZmF1bHQuCisJICoKKwkgKiBCZSBjYXJlZnVsIGFib3V0IHRoZSBzZXF1ZW5jZSBvZiBvcGVyYXRpb25zIGhlcmUuCisJICogVG8gZ2V0IGl0cyBhY2NvdW50aW5nIHJpZ2h0LCByZXVzZV9zd2FwX3BhZ2UoKSBtdXN0IGJlIGNhbGxlZAorCSAqIHdoaWxlIHRoZSBwYWdlIGlzIGNvdW50ZWQgb24gc3dhcCBidXQgbm90IHlldCBpbiBtYXBjb3VudCBpLmUuCisJICogYmVmb3JlIHBhZ2VfYWRkX2Fub25fcm1hcCgpIGFuZCBzd2FwX2ZyZWUoKTsgdHJ5X3RvX2ZyZWVfc3dhcCgpCisJICogbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgdGhlIHN3YXBfZnJlZSgpLCBvciBpdCB3aWxsIG5ldmVyIHN1Y2NlZWQuCisJICogQmVjYXVzZSBkZWxldGVfZnJvbV9zd2FwX3BhZ2UoKSBtYXkgYmUgY2FsbGVkIGJ5IHJldXNlX3N3YXBfcGFnZSgpLAorCSAqIG1lbV9jZ3JvdXBfY29tbWl0X2NoYXJnZV9zd2FwaW4oKSBtYXkgbm90IGJlIGFibGUgdG8gZmluZCBzd3BfZW50cnkKKwkgKiBpbiBwYWdlLT5wcml2YXRlLiBJbiB0aGlzIGNhc2UsIGEgcmVjb3JkIGluIHN3YXBfY2dyb3VwICBpcyBzaWxlbnRseQorCSAqIGRpc2NhcmRlZCBhdCBzd2FwX2ZyZWUoKS4KKwkgKi8KIAogCWluY19tbV9jb3VudGVyKG1tLCBhbm9uX3Jzcyk7CiAJcHRlID0gbWtfcHRlKHBhZ2UsIHZtYS0+dm1fcGFnZV9wcm90KTsKQEAgLTI0NTYsMTAgKzI0NzYsMTEgQEAKIAkJcHRlID0gbWF5YmVfbWt3cml0ZShwdGVfbWtkaXJ0eShwdGUpLCB2bWEpOwogCQl3cml0ZV9hY2Nlc3MgPSAwOwogCX0KLQogCWZsdXNoX2ljYWNoZV9wYWdlKHZtYSwgcGFnZSk7CiAJc2V0X3B0ZV9hdChtbSwgYWRkcmVzcywgcGFnZV90YWJsZSwgcHRlKTsKIAlwYWdlX2FkZF9hbm9uX3JtYXAocGFnZSwgdm1hLCBhZGRyZXNzKTsKKwkvKiBJdCdzIGJldHRlciB0byBjYWxsIGNvbW1pdC1jaGFyZ2UgYWZ0ZXIgcm1hcCBpcyBlc3RhYmxpc2hlZCAqLworCW1lbV9jZ3JvdXBfY29tbWl0X2NoYXJnZV9zd2FwaW4ocGFnZSwgcHRyKTsKIAogCXN3YXBfZnJlZShlbnRyeSk7CiAJaWYgKHZtX3N3YXBfZnVsbCgpIHx8ICh2bWEtPnZtX2ZsYWdzICYgVk1fTE9DS0VEKSB8fCBQYWdlTWxvY2tlZChwYWdlKSkKQEAgLTI0ODAsNyArMjUwMSw3IEBACiBvdXQ6CiAJcmV0dXJuIHJldDsKIG91dF9ub21hcDoKLQltZW1fY2dyb3VwX3VuY2hhcmdlX3BhZ2UocGFnZSk7CisJbWVtX2Nncm91cF9jYW5jZWxfY2hhcmdlX3N3YXBpbihwdHIpOwogCXB0ZV91bm1hcF91bmxvY2socGFnZV90YWJsZSwgcHRsKTsKIAl1bmxvY2tfcGFnZShwYWdlKTsKIAlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CkBAIC0yNTEwLDcgKzI1MzEsNyBAQAogCQlnb3RvIG9vbTsKIAlfX1NldFBhZ2VVcHRvZGF0ZShwYWdlKTsKIAotCWlmIChtZW1fY2dyb3VwX2NoYXJnZShwYWdlLCBtbSwgR0ZQX0tFUk5FTCkpCisJaWYgKG1lbV9jZ3JvdXBfbmV3cGFnZV9jaGFyZ2UocGFnZSwgbW0sIEdGUF9LRVJORUwpKQogCQlnb3RvIG9vbV9mcmVlX3BhZ2U7CiAKIAllbnRyeSA9IG1rX3B0ZShwYWdlLCB2bWEtPnZtX3BhZ2VfcHJvdCk7CkBAIC0yNjAxLDcgKzI2MjIsNyBAQAogCQkJCXJldCA9IFZNX0ZBVUxUX09PTTsKIAkJCQlnb3RvIG91dDsKIAkJCX0KLQkJCWlmIChtZW1fY2dyb3VwX2NoYXJnZShwYWdlLCBtbSwgR0ZQX0tFUk5FTCkpIHsKKwkJCWlmIChtZW1fY2dyb3VwX25ld3BhZ2VfY2hhcmdlKHBhZ2UsIG1tLCBHRlBfS0VSTkVMKSkgewogCQkJCXJldCA9IFZNX0ZBVUxUX09PTTsKIAkJCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CiAJCQkJZ290byBvdXQ7CkBAIC0zMTUxLDYgKzMxNzIsMTUgQEAKICNpZmRlZiBDT05GSUdfUFJPVkVfTE9DS0lORwogdm9pZCBtaWdodF9mYXVsdCh2b2lkKQogeworCS8qCisJICogU29tZSBjb2RlIChuZnMvc3VucnBjKSB1c2VzIHNvY2tldCBvcHMgb24ga2VybmVsIG1lbW9yeSB3aGlsZQorCSAqIGhvbGRpbmcgdGhlIG1tYXBfc2VtLCB0aGlzIGlzIHNhZmUgYmVjYXVzZSBrZXJuZWwgbWVtb3J5IGRvZXNuJ3QKKwkgKiBnZXQgcGFnZWQgb3V0LCB0aGVyZWZvcmUgd2UnbGwgbmV2ZXIgYWN0dWFsbHkgZmF1bHQsIGFuZCB0aGUKKwkgKiBiZWxvdyBhbm5vdGF0aW9ucyB3aWxsIGdlbmVyYXRlIGZhbHNlIHBvc2l0aXZlcy4KKwkgKi8KKwlpZiAoc2VnbWVudF9lcShnZXRfZnMoKSwgS0VSTkVMX0RTKSkKKwkJcmV0dXJuOworCiAJbWlnaHRfc2xlZXAoKTsKIAkvKgogCSAqIGl0IHdvdWxkIGJlIG5pY2VyIG9ubHkgdG8gYW5ub3RhdGUgcGF0aHMgd2hpY2ggYXJlIG5vdCB1bmRlcgpkaWZmIC0tZ2l0IGEvbW0vbWVtcG9saWN5LmMgYi9tbS9tZW1wb2xpY3kuYwppbmRleCBlNDEyZmZhLi4zZWI0YTZmIDEwMDY0NAotLS0gYS9tbS9tZW1wb2xpY3kuYworKysgYi9tbS9tZW1wb2xpY3kuYwpAQCAtMTA2OCwxMCArMTA2OCw5IEBACiAJcmV0dXJuIGNvcHlfdG9fdXNlcihtYXNrLCBub2Rlc19hZGRyKCpub2RlcyksIGNvcHkpID8gLUVGQVVMVCA6IDA7CiB9CiAKLWFzbWxpbmthZ2UgbG9uZyBzeXNfbWJpbmQodW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBsZW4sCi0JCQl1bnNpZ25lZCBsb25nIG1vZGUsCi0JCQl1bnNpZ25lZCBsb25nIF9fdXNlciAqbm1hc2ssIHVuc2lnbmVkIGxvbmcgbWF4bm9kZSwKLQkJCXVuc2lnbmVkIGZsYWdzKQorU1lTQ0FMTF9ERUZJTkU2KG1iaW5kLCB1bnNpZ25lZCBsb25nLCBzdGFydCwgdW5zaWduZWQgbG9uZywgbGVuLAorCQl1bnNpZ25lZCBsb25nLCBtb2RlLCB1bnNpZ25lZCBsb25nIF9fdXNlciAqLCBubWFzaywKKwkJdW5zaWduZWQgbG9uZywgbWF4bm9kZSwgdW5zaWduZWQsIGZsYWdzKQogewogCW5vZGVtYXNrX3Qgbm9kZXM7CiAJaW50IGVycjsKQEAgLTEwOTEsOCArMTA5MCw4IEBACiB9CiAKIC8qIFNldCB0aGUgcHJvY2VzcyBtZW1vcnkgcG9saWN5ICovCi1hc21saW5rYWdlIGxvbmcgc3lzX3NldF9tZW1wb2xpY3koaW50IG1vZGUsIHVuc2lnbmVkIGxvbmcgX191c2VyICpubWFzaywKLQkJdW5zaWduZWQgbG9uZyBtYXhub2RlKQorU1lTQ0FMTF9ERUZJTkUzKHNldF9tZW1wb2xpY3ksIGludCwgbW9kZSwgdW5zaWduZWQgbG9uZyBfX3VzZXIgKiwgbm1hc2ssCisJCXVuc2lnbmVkIGxvbmcsIG1heG5vZGUpCiB7CiAJaW50IGVycjsKIAlub2RlbWFza190IG5vZGVzOwpAQCAtMTExMCw5ICsxMTA5LDkgQEAKIAlyZXR1cm4gZG9fc2V0X21lbXBvbGljeShtb2RlLCBmbGFncywgJm5vZGVzKTsKIH0KIAotYXNtbGlua2FnZSBsb25nIHN5c19taWdyYXRlX3BhZ2VzKHBpZF90IHBpZCwgdW5zaWduZWQgbG9uZyBtYXhub2RlLAotCQljb25zdCB1bnNpZ25lZCBsb25nIF9fdXNlciAqb2xkX25vZGVzLAotCQljb25zdCB1bnNpZ25lZCBsb25nIF9fdXNlciAqbmV3X25vZGVzKQorU1lTQ0FMTF9ERUZJTkU0KG1pZ3JhdGVfcGFnZXMsIHBpZF90LCBwaWQsIHVuc2lnbmVkIGxvbmcsIG1heG5vZGUsCisJCWNvbnN0IHVuc2lnbmVkIGxvbmcgX191c2VyICosIG9sZF9ub2RlcywKKwkJY29uc3QgdW5zaWduZWQgbG9uZyBfX3VzZXIgKiwgbmV3X25vZGVzKQogewogCWNvbnN0IHN0cnVjdCBjcmVkICpjcmVkID0gY3VycmVudF9jcmVkKCksICp0Y3JlZDsKIAlzdHJ1Y3QgbW1fc3RydWN0ICptbTsKQEAgLTExODUsMTAgKzExODQsOSBAQAogCiAKIC8qIFJldHJpZXZlIE5VTUEgcG9saWN5ICovCi1hc21saW5rYWdlIGxvbmcgc3lzX2dldF9tZW1wb2xpY3koaW50IF9fdXNlciAqcG9saWN5LAotCQkJCXVuc2lnbmVkIGxvbmcgX191c2VyICpubWFzaywKLQkJCQl1bnNpZ25lZCBsb25nIG1heG5vZGUsCi0JCQkJdW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGZsYWdzKQorU1lTQ0FMTF9ERUZJTkU1KGdldF9tZW1wb2xpY3ksIGludCBfX3VzZXIgKiwgcG9saWN5LAorCQl1bnNpZ25lZCBsb25nIF9fdXNlciAqLCBubWFzaywgdW5zaWduZWQgbG9uZywgbWF4bm9kZSwKKwkJdW5zaWduZWQgbG9uZywgYWRkciwgdW5zaWduZWQgbG9uZywgZmxhZ3MpCiB7CiAJaW50IGVycjsKIAlpbnQgdW5pbml0aWFsaXplZF92YXIocHZhbCk7CmRpZmYgLS1naXQgYS9tbS9taWdyYXRlLmMgYi9tbS9taWdyYXRlLmMKaW5kZXggNTUzNzM5OC4uMmJiNGUxZCAxMDA2NDQKLS0tIGEvbW0vbWlncmF0ZS5jCisrKyBiL21tL21pZ3JhdGUuYwpAQCAtMTIxLDIwICsxMjEsNiBAQAogCWlmICghaXNfbWlncmF0aW9uX2VudHJ5KGVudHJ5KSB8fCBtaWdyYXRpb25fZW50cnlfdG9fcGFnZShlbnRyeSkgIT0gb2xkKQogCQlnb3RvIG91dDsKIAotCS8qCi0JICogWWVzLCBpZ25vcmUgdGhlIHJldHVybiB2YWx1ZSBmcm9tIGEgR0ZQX0FUT01JQyBtZW1fY2dyb3VwX2NoYXJnZS4KLQkgKiBGYWlsdXJlIGlzIG5vdCBhbiBvcHRpb24gaGVyZTogd2UncmUgbm93IGV4cGVjdGVkIHRvIHJlbW92ZSBldmVyeQotCSAqIG1pZ3JhdGlvbiBwdGUsIGFuZCB3aWxsIGNhdXNlIGNyYXNoZXMgb3RoZXJ3aXNlLiAgTm9ybWFsbHkgdGhpcwotCSAqIGlzIG5vdCBhbiBpc3N1ZTogbWVtX2Nncm91cF9wcmVwYXJlX21pZ3JhdGlvbiBidW1wZWQgdXAgdGhlIG9sZAotCSAqIHBhZ2VfY2dyb3VwIGNvdW50IGZvciBzYWZldHksIHRoYXQncyBub3cgYXR0YWNoZWQgdG8gdGhlIG5ldyBwYWdlLAotCSAqIHNvIHRoaXMgY2hhcmdlIHNob3VsZCBqdXN0IGJlIGFub3RoZXIgaW5jcmVtZW50YXRpb24gb2YgdGhlIGNvdW50LAotCSAqIHRvIGtlZXAgaW4gYmFsYW5jZSB3aXRoIHJtYXAuYydzIG1lbV9jZ3JvdXBfdW5jaGFyZ2luZy4gIEJ1dCBpZgotCSAqIHRoZXJlJ3MgYmVlbiBhIGZvcmNlX2VtcHR5LCB0aG9zZSByZWZlcmVuY2UgY291bnRzIG1heSBubyBsb25nZXIKLQkgKiBiZSByZWxpYWJsZSwgYW5kIHRoaXMgY2hhcmdlIGNhbiBhY3R1YWxseSBmYWlsOiBvaCB3ZWxsLCB3ZSBkb24ndAotCSAqIG1ha2UgdGhlIHNpdHVhdGlvbiBhbnkgd29yc2UgYnkgcHJvY2VlZGluZyBhcyBpZiBpdCBoYWQgc3VjY2VlZGVkLgotCSAqLwotCW1lbV9jZ3JvdXBfY2hhcmdlKG5ldywgbW0sIEdGUF9BVE9NSUMpOwotCiAJZ2V0X3BhZ2UobmV3KTsKIAlwdGUgPSBwdGVfbWtvbGQobWtfcHRlKG5ldywgdm1hLT52bV9wYWdlX3Byb3QpKTsKIAlpZiAoaXNfd3JpdGVfbWlncmF0aW9uX2VudHJ5KGVudHJ5KSkKQEAgLTM3OCw5ICszNjQsNiBAQAogCWFub24gPSBQYWdlQW5vbihwYWdlKTsKIAlwYWdlLT5tYXBwaW5nID0gTlVMTDsKIAotCWlmICghYW5vbikgLyogVGhpcyBwYWdlIHdhcyByZW1vdmVkIGZyb20gcmFkaXgtdHJlZS4gKi8KLQkJbWVtX2Nncm91cF91bmNoYXJnZV9jYWNoZV9wYWdlKHBhZ2UpOwotCiAJLyoKIAkgKiBJZiBhbnkgd2FpdGVycyBoYXZlIGFjY3VtdWxhdGVkIG9uIHRoZSBuZXcgcGFnZSB0aGVuCiAJICogd2FrZSB0aGVtIHVwLgpAQCAtNjE0LDYgKzU5Nyw3IEBACiAJc3RydWN0IHBhZ2UgKm5ld3BhZ2UgPSBnZXRfbmV3X3BhZ2UocGFnZSwgcHJpdmF0ZSwgJnJlc3VsdCk7CiAJaW50IHJjdV9sb2NrZWQgPSAwOwogCWludCBjaGFyZ2UgPSAwOworCXN0cnVjdCBtZW1fY2dyb3VwICptZW07CiAKIAlpZiAoIW5ld3BhZ2UpCiAJCXJldHVybiAtRU5PTUVNOwpAQCAtNjIzLDI0ICs2MDcsMjYgQEAKIAkJZ290byBtb3ZlX25ld3BhZ2U7CiAJfQogCi0JY2hhcmdlID0gbWVtX2Nncm91cF9wcmVwYXJlX21pZ3JhdGlvbihwYWdlLCBuZXdwYWdlKTsKLQlpZiAoY2hhcmdlID09IC1FTk9NRU0pIHsKLQkJcmMgPSAtRU5PTUVNOwotCQlnb3RvIG1vdmVfbmV3cGFnZTsKLQl9CiAJLyogcHJlcGFyZSBjZ3JvdXAganVzdCByZXR1cm5zIDAgb3IgLUVOT01FTSAqLwotCUJVR19PTihjaGFyZ2UpOwotCiAJcmMgPSAtRUFHQUlOOworCiAJaWYgKCF0cnlsb2NrX3BhZ2UocGFnZSkpIHsKIAkJaWYgKCFmb3JjZSkKIAkJCWdvdG8gbW92ZV9uZXdwYWdlOwogCQlsb2NrX3BhZ2UocGFnZSk7CiAJfQogCisJLyogY2hhcmdlIGFnYWluc3QgbmV3IHBhZ2UgKi8KKwljaGFyZ2UgPSBtZW1fY2dyb3VwX3ByZXBhcmVfbWlncmF0aW9uKHBhZ2UsICZtZW0pOworCWlmIChjaGFyZ2UgPT0gLUVOT01FTSkgeworCQlyYyA9IC1FTk9NRU07CisJCWdvdG8gdW5sb2NrOworCX0KKwlCVUdfT04oY2hhcmdlKTsKKwogCWlmIChQYWdlV3JpdGViYWNrKHBhZ2UpKSB7CiAJCWlmICghZm9yY2UpCi0JCQlnb3RvIHVubG9jazsKKwkJCWdvdG8gdW5jaGFyZ2U7CiAJCXdhaXRfb25fcGFnZV93cml0ZWJhY2socGFnZSk7CiAJfQogCS8qCkBAIC02OTMsNyArNjc5LDkgQEAKIHJjdV91bmxvY2s6CiAJaWYgKHJjdV9sb2NrZWQpCiAJCXJjdV9yZWFkX3VubG9jaygpOwotCit1bmNoYXJnZToKKwlpZiAoIWNoYXJnZSkKKwkJbWVtX2Nncm91cF9lbmRfbWlncmF0aW9uKG1lbSwgcGFnZSwgbmV3cGFnZSk7CiB1bmxvY2s6CiAJdW5sb2NrX3BhZ2UocGFnZSk7CiAKQEAgLTcwOSw4ICs2OTcsNiBAQAogCX0KIAogbW92ZV9uZXdwYWdlOgotCWlmICghY2hhcmdlKQotCQltZW1fY2dyb3VwX2VuZF9taWdyYXRpb24obmV3cGFnZSk7CiAKIAkvKgogCSAqIE1vdmUgdGhlIG5ldyBwYWdlIHRvIHRoZSBMUlUuIElmIG1pZ3JhdGlvbiB3YXMgbm90IHN1Y2Nlc3NmdWwKQEAgLTEwNjksMTAgKzEwNTUsMTAgQEAKICAqIE1vdmUgYSBsaXN0IG9mIHBhZ2VzIGluIHRoZSBhZGRyZXNzIHNwYWNlIG9mIHRoZSBjdXJyZW50bHkgZXhlY3V0aW5nCiAgKiBwcm9jZXNzLgogICovCi1hc21saW5rYWdlIGxvbmcgc3lzX21vdmVfcGFnZXMocGlkX3QgcGlkLCB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzLAotCQkJY29uc3Qgdm9pZCBfX3VzZXIgKiBfX3VzZXIgKnBhZ2VzLAotCQkJY29uc3QgaW50IF9fdXNlciAqbm9kZXMsCi0JCQlpbnQgX191c2VyICpzdGF0dXMsIGludCBmbGFncykKK1NZU0NBTExfREVGSU5FNihtb3ZlX3BhZ2VzLCBwaWRfdCwgcGlkLCB1bnNpZ25lZCBsb25nLCBucl9wYWdlcywKKwkJY29uc3Qgdm9pZCBfX3VzZXIgKiBfX3VzZXIgKiwgcGFnZXMsCisJCWNvbnN0IGludCBfX3VzZXIgKiwgbm9kZXMsCisJCWludCBfX3VzZXIgKiwgc3RhdHVzLCBpbnQsIGZsYWdzKQogewogCWNvbnN0IHN0cnVjdCBjcmVkICpjcmVkID0gY3VycmVudF9jcmVkKCksICp0Y3JlZDsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2s7CmRpZmYgLS1naXQgYS9tbS9taW5jb3JlLmMgYi9tbS9taW5jb3JlLmMKaW5kZXggNTE3ODgwMC4uOGNiNTA4ZiAxMDA2NDQKLS0tIGEvbW0vbWluY29yZS5jCisrKyBiL21tL21pbmNvcmUuYwpAQCAtMTc3LDggKzE3Nyw4IEBACiAgKgkJbWFwcGVkCiAgKiAgLUVBR0FJTiAtIEEga2VybmVsIHJlc291cmNlIHdhcyB0ZW1wb3JhcmlseSB1bmF2YWlsYWJsZS4KICAqLwotYXNtbGlua2FnZSBsb25nIHN5c19taW5jb3JlKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHNpemVfdCBsZW4sCi0JdW5zaWduZWQgY2hhciBfX3VzZXIgKiB2ZWMpCitTWVNDQUxMX0RFRklORTMobWluY29yZSwgdW5zaWduZWQgbG9uZywgc3RhcnQsIHNpemVfdCwgbGVuLAorCQl1bnNpZ25lZCBjaGFyIF9fdXNlciAqLCB2ZWMpCiB7CiAJbG9uZyByZXR2YWw7CiAJdW5zaWduZWQgbG9uZyBwYWdlczsKZGlmZiAtLWdpdCBhL21tL21sb2NrLmMgYi9tbS9tbG9jay5jCmluZGV4IGUxMjUxNTYuLjI5MDRhMzQgMTAwNjQ0Ci0tLSBhL21tL21sb2NrLmMKKysrIGIvbW0vbWxvY2suYwpAQCAtNTMwLDcgKzUzMCw3IEBACiAJcmV0dXJuIGVycm9yOwogfQogCi1hc21saW5rYWdlIGxvbmcgc3lzX21sb2NrKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHNpemVfdCBsZW4pCitTWVNDQUxMX0RFRklORTIobWxvY2ssIHVuc2lnbmVkIGxvbmcsIHN0YXJ0LCBzaXplX3QsIGxlbikKIHsKIAl1bnNpZ25lZCBsb25nIGxvY2tlZDsKIAl1bnNpZ25lZCBsb25nIGxvY2tfbGltaXQ7CkBAIC01NTgsNyArNTU4LDcgQEAKIAlyZXR1cm4gZXJyb3I7CiB9CiAKLWFzbWxpbmthZ2UgbG9uZyBzeXNfbXVubG9jayh1bnNpZ25lZCBsb25nIHN0YXJ0LCBzaXplX3QgbGVuKQorU1lTQ0FMTF9ERUZJTkUyKG11bmxvY2ssIHVuc2lnbmVkIGxvbmcsIHN0YXJ0LCBzaXplX3QsIGxlbikKIHsKIAlpbnQgcmV0OwogCkBAIC01OTUsNyArNTk1LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotYXNtbGlua2FnZSBsb25nIHN5c19tbG9ja2FsbChpbnQgZmxhZ3MpCitTWVNDQUxMX0RFRklORTEobWxvY2thbGwsIGludCwgZmxhZ3MpCiB7CiAJdW5zaWduZWQgbG9uZyBsb2NrX2xpbWl0OwogCWludCByZXQgPSAtRUlOVkFMOwpAQCAtNjIzLDcgKzYyMyw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotYXNtbGlua2FnZSBsb25nIHN5c19tdW5sb2NrYWxsKHZvaWQpCitTWVNDQUxMX0RFRklORTAobXVubG9ja2FsbCkKIHsKIAlpbnQgcmV0OwogCmRpZmYgLS1naXQgYS9tbS9tbWFwLmMgYi9tbS9tbWFwLmMKaW5kZXggYTkxMGMwNDUuLjhkOTU5MDIgMTAwNjQ0Ci0tLSBhL21tL21tYXAuYworKysgYi9tbS9tbWFwLmMKQEAgLTI0NSw3ICsyNDUsNyBAQAogCXJldHVybiBuZXh0OwogfQogCi1hc21saW5rYWdlIHVuc2lnbmVkIGxvbmcgc3lzX2Jyayh1bnNpZ25lZCBsb25nIGJyaykKK1NZU0NBTExfREVGSU5FMShicmssIHVuc2lnbmVkIGxvbmcsIGJyaykKIHsKIAl1bnNpZ25lZCBsb25nIHJsaW0sIHJldHZhbDsKIAl1bnNpZ25lZCBsb25nIG5ld2Jyaywgb2xkYnJrOwpAQCAtMTk0OCw3ICsxOTQ4LDcgQEAKIAogRVhQT1JUX1NZTUJPTChkb19tdW5tYXApOwogCi1hc21saW5rYWdlIGxvbmcgc3lzX211bm1hcCh1bnNpZ25lZCBsb25nIGFkZHIsIHNpemVfdCBsZW4pCitTWVNDQUxMX0RFRklORTIobXVubWFwLCB1bnNpZ25lZCBsb25nLCBhZGRyLCBzaXplX3QsIGxlbikKIHsKIAlpbnQgcmV0OwogCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gY3VycmVudC0+bW07CkBAIC0yNDcyLDMgKzI0NzIsMTMgQEAKIAogCW11dGV4X3VubG9jaygmbW1fYWxsX2xvY2tzX211dGV4KTsKIH0KKworLyoKKyAqIGluaXRpYWxpc2UgdGhlIFZNQSBzbGFiCisgKi8KK3ZvaWQgX19pbml0IG1tYXBfaW5pdCh2b2lkKQoreworCXZtX2FyZWFfY2FjaGVwID0ga21lbV9jYWNoZV9jcmVhdGUoInZtX2FyZWFfc3RydWN0IiwKKwkJCXNpemVvZihzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QpLCAwLAorCQkJU0xBQl9QQU5JQywgTlVMTCk7Cit9CmRpZmYgLS1naXQgYS9tbS9tcHJvdGVjdC5jIGIvbW0vbXByb3RlY3QuYwppbmRleCBkMGY2ZTdjLi5hYmUyNjk0IDEwMDY0NAotLS0gYS9tbS9tcHJvdGVjdC5jCisrKyBiL21tL21wcm90ZWN0LmMKQEAgLTIxNyw4ICsyMTcsOCBAQAogCXJldHVybiBlcnJvcjsKIH0KIAotYXNtbGlua2FnZSBsb25nCi1zeXNfbXByb3RlY3QodW5zaWduZWQgbG9uZyBzdGFydCwgc2l6ZV90IGxlbiwgdW5zaWduZWQgbG9uZyBwcm90KQorU1lTQ0FMTF9ERUZJTkUzKG1wcm90ZWN0LCB1bnNpZ25lZCBsb25nLCBzdGFydCwgc2l6ZV90LCBsZW4sCisJCXVuc2lnbmVkIGxvbmcsIHByb3QpCiB7CiAJdW5zaWduZWQgbG9uZyB2bV9mbGFncywgbnN0YXJ0LCBlbmQsIHRtcCwgcmVxcHJvdDsKIAlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgKnByZXY7CmRpZmYgLS1naXQgYS9tbS9tcmVtYXAuYyBiL21tL21yZW1hcC5jCmluZGV4IDY0NmRlOTUuLmEzOWI3YjkgMTAwNjQ0Ci0tLSBhL21tL21yZW1hcC5jCisrKyBiL21tL21yZW1hcC5jCkBAIC00MjAsOSArNDIwLDkgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1hc21saW5rYWdlIHVuc2lnbmVkIGxvbmcgc3lzX21yZW1hcCh1bnNpZ25lZCBsb25nIGFkZHIsCi0JdW5zaWduZWQgbG9uZyBvbGRfbGVuLCB1bnNpZ25lZCBsb25nIG5ld19sZW4sCi0JdW5zaWduZWQgbG9uZyBmbGFncywgdW5zaWduZWQgbG9uZyBuZXdfYWRkcikKK1NZU0NBTExfREVGSU5FNShtcmVtYXAsIHVuc2lnbmVkIGxvbmcsIGFkZHIsIHVuc2lnbmVkIGxvbmcsIG9sZF9sZW4sCisJCXVuc2lnbmVkIGxvbmcsIG5ld19sZW4sIHVuc2lnbmVkIGxvbmcsIGZsYWdzLAorCQl1bnNpZ25lZCBsb25nLCBuZXdfYWRkcikKIHsKIAl1bnNpZ25lZCBsb25nIHJldDsKIApkaWZmIC0tZ2l0IGEvbW0vbXN5bmMuYyBiL21tL21zeW5jLmMKaW5kZXggMDdkYWUwOC4uNDA4MzIwOSAxMDA2NDQKLS0tIGEvbW0vbXN5bmMuYworKysgYi9tbS9tc3luYy5jCkBAIC0yOCw3ICsyOCw3IEBACiAgKiBTbyBieSBfbm90XyBzdGFydGluZyBJL08gaW4gTVNfQVNZTkMgd2UgcHJvdmlkZSBjb21wbGV0ZSBmbGV4aWJpbGl0eSB0bwogICogYXBwbGljYXRpb25zLgogICovCi1hc21saW5rYWdlIGxvbmcgc3lzX21zeW5jKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHNpemVfdCBsZW4sIGludCBmbGFncykKK1NZU0NBTExfREVGSU5FMyhtc3luYywgdW5zaWduZWQgbG9uZywgc3RhcnQsIHNpemVfdCwgbGVuLCBpbnQsIGZsYWdzKQogewogCXVuc2lnbmVkIGxvbmcgZW5kOwogCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gY3VycmVudC0+bW07CmRpZmYgLS1naXQgYS9tbS9ub21tdS5jIGIvbW0vbm9tbXUuYwppbmRleCAxYzI4ZWEzLi44Y2VlOGM4IDEwMDY0NAotLS0gYS9tbS9ub21tdS5jCisrKyBiL21tL25vbW11LmMKQEAgLTYsMTEgKzYsMTEgQEAKICAqCiAgKiAgU2VlIERvY3VtZW50YXRpb24vbm9tbXUtbW1hcC50eHQKICAqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA0LTIwMDUgRGF2aWQgSG93ZWxscyA8ZGhvd2VsbHNAcmVkaGF0LmNvbT4KKyAqICBDb3B5cmlnaHQgKGMpIDIwMDQtMjAwOCBEYXZpZCBIb3dlbGxzIDxkaG93ZWxsc0ByZWRoYXQuY29tPgogICogIENvcHlyaWdodCAoYykgMjAwMC0yMDAzIERhdmlkIE1jQ3VsbG91Z2ggPGRhdmlkbUBzbmFwZ2Vhci5jb20+CiAgKiAgQ29weXJpZ2h0IChjKSAyMDAwLTIwMDEgRCBKZWZmIERpb25uZSA8amVmZkB1Q2xpbnV4Lm9yZz4KICAqICBDb3B5cmlnaHQgKGMpIDIwMDIgICAgICBHcmVnIFVuZ2VyZXIgPGdlcmdAc25hcGdlYXIuY29tPgotICogIENvcHlyaWdodCAoYykgMjAwNyAgICAgIFBhdWwgTXVuZHQgPGxldGhhbEBsaW51eC1zaC5vcmc+CisgKiAgQ29weXJpZ2h0IChjKSAyMDA3LTIwMDggUGF1bCBNdW5kdCA8bGV0aGFsQGxpbnV4LXNoLm9yZz4KICAqLwogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CkBAIC0zMyw2ICszMywyOCBAQAogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL3RsYi5oPgogI2luY2x1ZGUgPGFzbS90bGJmbHVzaC5oPgorI2luY2x1ZGUgImludGVybmFsLmgiCisKK3N0YXRpYyBpbmxpbmUgX19hdHRyaWJ1dGVfXygoZm9ybWF0KHByaW50ZiwgMSwgMikpKQordm9pZCBub19wcmludGsoY29uc3QgY2hhciAqZm10LCAuLi4pCit7Cit9CisKKyNpZiAwCisjZGVmaW5lIGtlbnRlcihGTVQsIC4uLikgXAorCXByaW50ayhLRVJOX0RFQlVHICI9PT4gJXMoIkZNVCIpXG4iLCBfX2Z1bmNfXywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUga2xlYXZlKEZNVCwgLi4uKSBcCisJcHJpbnRrKEtFUk5fREVCVUcgIjw9PSAlcygpIkZNVCJcbiIsIF9fZnVuY19fLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBrZGVidWcoRk1ULCAuLi4pIFwKKwlwcmludGsoS0VSTl9ERUJVRyAieHh4IiBGTVQieXl5XG4iLCAjI19fVkFfQVJHU19fKQorI2Vsc2UKKyNkZWZpbmUga2VudGVyKEZNVCwgLi4uKSBcCisJbm9fcHJpbnRrKEtFUk5fREVCVUcgIj09PiAlcygiRk1UIilcbiIsIF9fZnVuY19fLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBrbGVhdmUoRk1ULCAuLi4pIFwKKwlub19wcmludGsoS0VSTl9ERUJVRyAiPD09ICVzKCkiRk1UIlxuIiwgX19mdW5jX18sICMjX19WQV9BUkdTX18pCisjZGVmaW5lIGtkZWJ1ZyhGTVQsIC4uLikgXAorCW5vX3ByaW50ayhLRVJOX0RFQlVHIEZNVCJcbiIsICMjX19WQV9BUkdTX18pCisjZW5kaWYKIAogI2luY2x1ZGUgImludGVybmFsLmgiCiAKQEAgLTQwLDE5ICs2MiwyMiBAQAogc3RydWN0IHBhZ2UgKm1lbV9tYXA7CiB1bnNpZ25lZCBsb25nIG1heF9tYXBucjsKIHVuc2lnbmVkIGxvbmcgbnVtX3BoeXNwYWdlczsKLXVuc2lnbmVkIGxvbmcgYXNrZWRhbGxvYywgcmVhbGFsbG9jOwogYXRvbWljX2xvbmdfdCB2bV9jb21taXR0ZWRfc3BhY2UgPSBBVE9NSUNfTE9OR19JTklUKDApOwogaW50IHN5c2N0bF9vdmVyY29tbWl0X21lbW9yeSA9IE9WRVJDT01NSVRfR1VFU1M7IC8qIGhldXJpc3RpYyBvdmVyY29tbWl0ICovCiBpbnQgc3lzY3RsX292ZXJjb21taXRfcmF0aW8gPSA1MDsgLyogZGVmYXVsdCBpcyA1MCUgKi8KIGludCBzeXNjdGxfbWF4X21hcF9jb3VudCA9IERFRkFVTFRfTUFYX01BUF9DT1VOVDsKK2ludCBzeXNjdGxfbnJfdHJpbV9wYWdlcyA9IDE7IC8qIHBhZ2UgdHJpbW1pbmcgYmVoYXZpb3VyICovCiBpbnQgaGVhcF9zdGFja19nYXAgPSAwOwogCithdG9taWNfdCBtbWFwX3BhZ2VzX2FsbG9jYXRlZDsKKwogRVhQT1JUX1NZTUJPTChtZW1fbWFwKTsKIEVYUE9SVF9TWU1CT0wobnVtX3BoeXNwYWdlcyk7CiAKLS8qIGxpc3Qgb2Ygc2hhcmVhYmxlIFZNQXMgKi8KLXN0cnVjdCByYl9yb290IG5vbW11X3ZtYV90cmVlID0gUkJfUk9PVDsKLURFQ0xBUkVfUldTRU0obm9tbXVfdm1hX3NlbSk7CisvKiBsaXN0IG9mIG1hcHBlZCwgcG90ZW50aWFsbHkgc2hhcmVhYmxlIHJlZ2lvbnMgKi8KK3N0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqdm1fcmVnaW9uX2phcjsKK3N0cnVjdCByYl9yb290IG5vbW11X3JlZ2lvbl90cmVlID0gUkJfUk9PVDsKK0RFQ0xBUkVfUldTRU0obm9tbXVfcmVnaW9uX3NlbSk7CiAKIHN0cnVjdCB2bV9vcGVyYXRpb25zX3N0cnVjdCBnZW5lcmljX2ZpbGVfdm1fb3BzID0gewogfTsKQEAgLTEyNCw2ICsxNDksMjAgQEAKIAkJcmV0dXJuIGtzaXplKG9ianApOwogCiAJLyoKKwkgKiBJZiBpdCdzIG5vdCBhIGNvbXBvdW5kIHBhZ2UsIHNlZSBpZiB3ZSBoYXZlIGEgbWF0Y2hpbmcgVk1BCisJICogcmVnaW9uLiBUaGlzIHRlc3QgaXMgaW50ZW50aW9uYWxseSBkb25lIGluIHJldmVyc2Ugb3JkZXIsCisJICogc28gaWYgdGhlcmUncyBubyBWTUEsIHdlIHN0aWxsIGZhbGwgdGhyb3VnaCBhbmQgaGFuZCBiYWNrCisJICogUEFHRV9TSVpFIGZvciAwLW9yZGVyIHBhZ2VzLgorCSAqLworCWlmICghUGFnZUNvbXBvdW5kKHBhZ2UpKSB7CisJCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hOworCisJCXZtYSA9IGZpbmRfdm1hKGN1cnJlbnQtPm1tLCAodW5zaWduZWQgbG9uZylvYmpwKTsKKwkJaWYgKHZtYSkKKwkJCXJldHVybiB2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQ7CisJfQorCisJLyoKIAkgKiBUaGUga3NpemUoKSBmdW5jdGlvbiBpcyBvbmx5IGd1YXJhbnRlZWQgdG8gd29yayBmb3IgcG9pbnRlcnMKIAkgKiByZXR1cm5lZCBieSBrbWFsbG9jKCkuIFNvIGhhbmRsZSBhcmJpdHJhcnkgcG9pbnRlcnMgaGVyZS4KIAkgKi8KQEAgLTM3Nyw3ICs0MTYsNyBAQAogICogIHRvIGEgcmVndWxhciBmaWxlLiAgaW4gdGhpcyBjYXNlLCB0aGUgdW5tYXBwaW5nIHdpbGwgbmVlZAogICogIHRvIGludm9rZSBmaWxlIHN5c3RlbSByb3V0aW5lcyB0aGF0IG5lZWQgdGhlIGdsb2JhbCBsb2NrLgogICovCi1hc21saW5rYWdlIHVuc2lnbmVkIGxvbmcgc3lzX2Jyayh1bnNpZ25lZCBsb25nIGJyaykKK1NZU0NBTExfREVGSU5FMShicmssIHVuc2lnbmVkIGxvbmcsIGJyaykKIHsKIAlzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IGN1cnJlbnQtPm1tOwogCkBAIC00MDEsMzkgKzQ0MCwyODEgQEAKIAlyZXR1cm4gbW0tPmJyayA9IGJyazsKIH0KIAotI2lmZGVmIERFQlVHCi1zdGF0aWMgdm9pZCBzaG93X3Byb2Nlc3NfYmxvY2tzKHZvaWQpCisvKgorICogaW5pdGlhbGlzZSB0aGUgVk1BIGFuZCByZWdpb24gcmVjb3JkIHNsYWJzCisgKi8KK3ZvaWQgX19pbml0IG1tYXBfaW5pdCh2b2lkKQogewotCXN0cnVjdCB2bV9saXN0X3N0cnVjdCAqdm1sOworCXZtX3JlZ2lvbl9qYXIgPSBrbWVtX2NhY2hlX2NyZWF0ZSgidm1fcmVnaW9uX2phciIsCisJCQkJCSAgc2l6ZW9mKHN0cnVjdCB2bV9yZWdpb24pLCAwLAorCQkJCQkgIFNMQUJfUEFOSUMsIE5VTEwpOworCXZtX2FyZWFfY2FjaGVwID0ga21lbV9jYWNoZV9jcmVhdGUoInZtX2FyZWFfc3RydWN0IiwKKwkJCQkJICAgc2l6ZW9mKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCksIDAsCisJCQkJCSAgIFNMQUJfUEFOSUMsIE5VTEwpOworfQogCi0JcHJpbnRrKCJQcm9jZXNzIGJsb2NrcyAlZDoiLCBjdXJyZW50LT5waWQpOworLyoKKyAqIHZhbGlkYXRlIHRoZSByZWdpb24gdHJlZQorICogLSB0aGUgY2FsbGVyIG11c3QgaG9sZCB0aGUgcmVnaW9uIGxvY2sKKyAqLworI2lmZGVmIENPTkZJR19ERUJVR19OT01NVV9SRUdJT05TCitzdGF0aWMgbm9pbmxpbmUgdm9pZCB2YWxpZGF0ZV9ub21tdV9yZWdpb25zKHZvaWQpCit7CisJc3RydWN0IHZtX3JlZ2lvbiAqcmVnaW9uLCAqbGFzdDsKKwlzdHJ1Y3QgcmJfbm9kZSAqcCwgKmxhc3RwOwogCi0JZm9yICh2bWwgPSAmY3VycmVudC0+bW0tPmNvbnRleHQudm1saXN0OyB2bWw7IHZtbCA9IHZtbC0+bmV4dCkgewotCQlwcmludGsoIiAlcDogJXAiLCB2bWwsIHZtbC0+dm1hKTsKLQkJaWYgKHZtbC0+dm1hKQotCQkJcHJpbnRrKCIgKCVkIEAlbHggIyVkKSIsCi0JCQkgICAgICAga29ianNpemUoKHZvaWQgKikgdm1sLT52bWEtPnZtX3N0YXJ0KSwKLQkJCSAgICAgICB2bWwtPnZtYS0+dm1fc3RhcnQsCi0JCQkgICAgICAgYXRvbWljX3JlYWQoJnZtbC0+dm1hLT52bV91c2FnZSkpOwotCQlwcmludGsodm1sLT5uZXh0ID8gIiAtPiIgOiAiLlxuIik7CisJbGFzdHAgPSByYl9maXJzdCgmbm9tbXVfcmVnaW9uX3RyZWUpOworCWlmICghbGFzdHApCisJCXJldHVybjsKKworCWxhc3QgPSByYl9lbnRyeShsYXN0cCwgc3RydWN0IHZtX3JlZ2lvbiwgdm1fcmIpOworCWlmICh1bmxpa2VseShsYXN0LT52bV9lbmQgPD0gbGFzdC0+dm1fc3RhcnQpKQorCQlCVUcoKTsKKwlpZiAodW5saWtlbHkobGFzdC0+dm1fdG9wIDwgbGFzdC0+dm1fZW5kKSkKKwkJQlVHKCk7CisKKwl3aGlsZSAoKHAgPSByYl9uZXh0KGxhc3RwKSkpIHsKKwkJcmVnaW9uID0gcmJfZW50cnkocCwgc3RydWN0IHZtX3JlZ2lvbiwgdm1fcmIpOworCQlsYXN0ID0gcmJfZW50cnkobGFzdHAsIHN0cnVjdCB2bV9yZWdpb24sIHZtX3JiKTsKKworCQlpZiAodW5saWtlbHkocmVnaW9uLT52bV9lbmQgPD0gcmVnaW9uLT52bV9zdGFydCkpCisJCQlCVUcoKTsKKwkJaWYgKHVubGlrZWx5KHJlZ2lvbi0+dm1fdG9wIDwgcmVnaW9uLT52bV9lbmQpKQorCQkJQlVHKCk7CisJCWlmICh1bmxpa2VseShyZWdpb24tPnZtX3N0YXJ0IDwgbGFzdC0+dm1fdG9wKSkKKwkJCUJVRygpOworCisJCWxhc3RwID0gcDsKIAl9CiB9Ci0jZW5kaWYgLyogREVCVUcgKi8KKyNlbHNlCisjZGVmaW5lIHZhbGlkYXRlX25vbW11X3JlZ2lvbnMoKSBkbyB7fSB3aGlsZSgwKQorI2VuZGlmCisKKy8qCisgKiBhZGQgYSByZWdpb24gaW50byB0aGUgZ2xvYmFsIHRyZWUKKyAqLworc3RhdGljIHZvaWQgYWRkX25vbW11X3JlZ2lvbihzdHJ1Y3Qgdm1fcmVnaW9uICpyZWdpb24pCit7CisJc3RydWN0IHZtX3JlZ2lvbiAqcHJlZ2lvbjsKKwlzdHJ1Y3QgcmJfbm9kZSAqKnAsICpwYXJlbnQ7CisKKwl2YWxpZGF0ZV9ub21tdV9yZWdpb25zKCk7CisKKwlCVUdfT04ocmVnaW9uLT52bV9zdGFydCAmIH5QQUdFX01BU0spOworCisJcGFyZW50ID0gTlVMTDsKKwlwID0gJm5vbW11X3JlZ2lvbl90cmVlLnJiX25vZGU7CisJd2hpbGUgKCpwKSB7CisJCXBhcmVudCA9ICpwOworCQlwcmVnaW9uID0gcmJfZW50cnkocGFyZW50LCBzdHJ1Y3Qgdm1fcmVnaW9uLCB2bV9yYik7CisJCWlmIChyZWdpb24tPnZtX3N0YXJ0IDwgcHJlZ2lvbi0+dm1fc3RhcnQpCisJCQlwID0gJigqcCktPnJiX2xlZnQ7CisJCWVsc2UgaWYgKHJlZ2lvbi0+dm1fc3RhcnQgPiBwcmVnaW9uLT52bV9zdGFydCkKKwkJCXAgPSAmKCpwKS0+cmJfcmlnaHQ7CisJCWVsc2UgaWYgKHByZWdpb24gPT0gcmVnaW9uKQorCQkJcmV0dXJuOworCQllbHNlCisJCQlCVUcoKTsKKwl9CisKKwlyYl9saW5rX25vZGUoJnJlZ2lvbi0+dm1fcmIsIHBhcmVudCwgcCk7CisJcmJfaW5zZXJ0X2NvbG9yKCZyZWdpb24tPnZtX3JiLCAmbm9tbXVfcmVnaW9uX3RyZWUpOworCisJdmFsaWRhdGVfbm9tbXVfcmVnaW9ucygpOworfQorCisvKgorICogZGVsZXRlIGEgcmVnaW9uIGZyb20gdGhlIGdsb2JhbCB0cmVlCisgKi8KK3N0YXRpYyB2b2lkIGRlbGV0ZV9ub21tdV9yZWdpb24oc3RydWN0IHZtX3JlZ2lvbiAqcmVnaW9uKQoreworCUJVR19PTighbm9tbXVfcmVnaW9uX3RyZWUucmJfbm9kZSk7CisKKwl2YWxpZGF0ZV9ub21tdV9yZWdpb25zKCk7CisJcmJfZXJhc2UoJnJlZ2lvbi0+dm1fcmIsICZub21tdV9yZWdpb25fdHJlZSk7CisJdmFsaWRhdGVfbm9tbXVfcmVnaW9ucygpOworfQorCisvKgorICogZnJlZSBhIGNvbnRpZ3VvdXMgc2VyaWVzIG9mIHBhZ2VzCisgKi8KK3N0YXRpYyB2b2lkIGZyZWVfcGFnZV9zZXJpZXModW5zaWduZWQgbG9uZyBmcm9tLCB1bnNpZ25lZCBsb25nIHRvKQoreworCWZvciAoOyBmcm9tIDwgdG87IGZyb20gKz0gUEFHRV9TSVpFKSB7CisJCXN0cnVjdCBwYWdlICpwYWdlID0gdmlydF90b19wYWdlKGZyb20pOworCisJCWtkZWJ1ZygiLSBmcmVlICVseCIsIGZyb20pOworCQlhdG9taWNfZGVjKCZtbWFwX3BhZ2VzX2FsbG9jYXRlZCk7CisJCWlmIChwYWdlX2NvdW50KHBhZ2UpICE9IDEpCisJCQlrZGVidWcoImZyZWUgcGFnZSAlcCBbJWRdIiwgcGFnZSwgcGFnZV9jb3VudChwYWdlKSk7CisJCXB1dF9wYWdlKHBhZ2UpOworCX0KK30KKworLyoKKyAqIHJlbGVhc2UgYSByZWZlcmVuY2UgdG8gYSByZWdpb24KKyAqIC0gdGhlIGNhbGxlciBtdXN0IGhvbGQgdGhlIHJlZ2lvbiBzZW1hcGhvcmUsIHdoaWNoIHRoaXMgcmVsZWFzZXMKKyAqIC0gdGhlIHJlZ2lvbiBtYXkgbm90IGhhdmUgYmVlbiBhZGRlZCB0byB0aGUgdHJlZSB5ZXQsIGluIHdoaWNoIGNhc2Ugdm1fdG9wCisgKiAgIHdpbGwgZXF1YWwgdm1fc3RhcnQKKyAqLworc3RhdGljIHZvaWQgX19wdXRfbm9tbXVfcmVnaW9uKHN0cnVjdCB2bV9yZWdpb24gKnJlZ2lvbikKKwlfX3JlbGVhc2VzKG5vbW11X3JlZ2lvbl9zZW0pCit7CisJa2VudGVyKCIlcHslZH0iLCByZWdpb24sIGF0b21pY19yZWFkKCZyZWdpb24tPnZtX3VzYWdlKSk7CisKKwlCVUdfT04oIW5vbW11X3JlZ2lvbl90cmVlLnJiX25vZGUpOworCisJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJnJlZ2lvbi0+dm1fdXNhZ2UpKSB7CisJCWlmIChyZWdpb24tPnZtX3RvcCA+IHJlZ2lvbi0+dm1fc3RhcnQpCisJCQlkZWxldGVfbm9tbXVfcmVnaW9uKHJlZ2lvbik7CisJCXVwX3dyaXRlKCZub21tdV9yZWdpb25fc2VtKTsKKworCQlpZiAocmVnaW9uLT52bV9maWxlKQorCQkJZnB1dChyZWdpb24tPnZtX2ZpbGUpOworCisJCS8qIElPIG1lbW9yeSBhbmQgbWVtb3J5IHNoYXJlZCBkaXJlY3RseSBvdXQgb2YgdGhlIHBhZ2VjYWNoZQorCQkgKiBmcm9tIHJhbWZzL3RtcGZzIG11c3RuJ3QgYmUgcmVsZWFzZWQgaGVyZSAqLworCQlpZiAocmVnaW9uLT52bV9mbGFncyAmIFZNX01BUFBFRF9DT1BZKSB7CisJCQlrZGVidWcoImZyZWUgc2VyaWVzIik7CisJCQlmcmVlX3BhZ2Vfc2VyaWVzKHJlZ2lvbi0+dm1fc3RhcnQsIHJlZ2lvbi0+dm1fdG9wKTsKKwkJfQorCQlrbWVtX2NhY2hlX2ZyZWUodm1fcmVnaW9uX2phciwgcmVnaW9uKTsKKwl9IGVsc2UgeworCQl1cF93cml0ZSgmbm9tbXVfcmVnaW9uX3NlbSk7CisJfQorfQorCisvKgorICogcmVsZWFzZSBhIHJlZmVyZW5jZSB0byBhIHJlZ2lvbgorICovCitzdGF0aWMgdm9pZCBwdXRfbm9tbXVfcmVnaW9uKHN0cnVjdCB2bV9yZWdpb24gKnJlZ2lvbikKK3sKKwlkb3duX3dyaXRlKCZub21tdV9yZWdpb25fc2VtKTsKKwlfX3B1dF9ub21tdV9yZWdpb24ocmVnaW9uKTsKK30KIAogLyoKICAqIGFkZCBhIFZNQSBpbnRvIGEgcHJvY2VzcydzIG1tX3N0cnVjdCBpbiB0aGUgYXBwcm9wcmlhdGUgcGxhY2UgaW4gdGhlIGxpc3QKKyAqIGFuZCB0cmVlIGFuZCBhZGQgdG8gdGhlIGFkZHJlc3Mgc3BhY2UncyBwYWdlIHRyZWUgYWxzbyBpZiBub3QgYW4gYW5vbnltb3VzCisgKiBwYWdlCiAgKiAtIHNob3VsZCBiZSBjYWxsZWQgd2l0aCBtbS0+bW1hcF9zZW0gaGVsZCB3cml0ZWxvY2tlZAogICovCi1zdGF0aWMgdm9pZCBhZGRfdm1hX3RvX21tKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBzdHJ1Y3Qgdm1fbGlzdF9zdHJ1Y3QgKnZtbCkKK3N0YXRpYyB2b2lkIGFkZF92bWFfdG9fbW0oc3RydWN0IG1tX3N0cnVjdCAqbW0sIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQogewotCXN0cnVjdCB2bV9saXN0X3N0cnVjdCAqKnBwdjsKKwlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnB2bWEsICoqcHA7CisJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmc7CisJc3RydWN0IHJiX25vZGUgKipwLCAqcGFyZW50OwogCi0JZm9yIChwcHYgPSAmY3VycmVudC0+bW0tPmNvbnRleHQudm1saXN0OyAqcHB2OyBwcHYgPSAmKCpwcHYpLT5uZXh0KQotCQlpZiAoKCpwcHYpLT52bWEtPnZtX3N0YXJ0ID4gdm1sLT52bWEtPnZtX3N0YXJ0KQorCWtlbnRlcigiLCVwIiwgdm1hKTsKKworCUJVR19PTighdm1hLT52bV9yZWdpb24pOworCisJbW0tPm1hcF9jb3VudCsrOworCXZtYS0+dm1fbW0gPSBtbTsKKworCS8qIGFkZCB0aGUgVk1BIHRvIHRoZSBtYXBwaW5nICovCisJaWYgKHZtYS0+dm1fZmlsZSkgeworCQltYXBwaW5nID0gdm1hLT52bV9maWxlLT5mX21hcHBpbmc7CisKKwkJZmx1c2hfZGNhY2hlX21tYXBfbG9jayhtYXBwaW5nKTsKKwkJdm1hX3ByaW9fdHJlZV9pbnNlcnQodm1hLCAmbWFwcGluZy0+aV9tbWFwKTsKKwkJZmx1c2hfZGNhY2hlX21tYXBfdW5sb2NrKG1hcHBpbmcpOworCX0KKworCS8qIGFkZCB0aGUgVk1BIHRvIHRoZSB0cmVlICovCisJcGFyZW50ID0gTlVMTDsKKwlwID0gJm1tLT5tbV9yYi5yYl9ub2RlOworCXdoaWxlICgqcCkgeworCQlwYXJlbnQgPSAqcDsKKwkJcHZtYSA9IHJiX2VudHJ5KHBhcmVudCwgc3RydWN0IHZtX2FyZWFfc3RydWN0LCB2bV9yYik7CisKKwkJLyogc29ydCBieTogc3RhcnQgYWRkciwgZW5kIGFkZHIsIFZNQSBzdHJ1Y3QgYWRkciBpbiB0aGF0IG9yZGVyCisJCSAqICh0aGUgbGF0dGVyIGlzIG5lY2Vzc2FyeSBhcyB3ZSBtYXkgZ2V0IGlkZW50aWNhbCBWTUFzKSAqLworCQlpZiAodm1hLT52bV9zdGFydCA8IHB2bWEtPnZtX3N0YXJ0KQorCQkJcCA9ICYoKnApLT5yYl9sZWZ0OworCQllbHNlIGlmICh2bWEtPnZtX3N0YXJ0ID4gcHZtYS0+dm1fc3RhcnQpCisJCQlwID0gJigqcCktPnJiX3JpZ2h0OworCQllbHNlIGlmICh2bWEtPnZtX2VuZCA8IHB2bWEtPnZtX2VuZCkKKwkJCXAgPSAmKCpwKS0+cmJfbGVmdDsKKwkJZWxzZSBpZiAodm1hLT52bV9lbmQgPiBwdm1hLT52bV9lbmQpCisJCQlwID0gJigqcCktPnJiX3JpZ2h0OworCQllbHNlIGlmICh2bWEgPCBwdm1hKQorCQkJcCA9ICYoKnApLT5yYl9sZWZ0OworCQllbHNlIGlmICh2bWEgPiBwdm1hKQorCQkJcCA9ICYoKnApLT5yYl9yaWdodDsKKwkJZWxzZQorCQkJQlVHKCk7CisJfQorCisJcmJfbGlua19ub2RlKCZ2bWEtPnZtX3JiLCBwYXJlbnQsIHApOworCXJiX2luc2VydF9jb2xvcigmdm1hLT52bV9yYiwgJm1tLT5tbV9yYik7CisKKwkvKiBhZGQgVk1BIHRvIHRoZSBWTUEgbGlzdCBhbHNvICovCisJZm9yIChwcCA9ICZtbS0+bW1hcDsgKHB2bWEgPSAqcHApOyBwcCA9ICYoKnBwKS0+dm1fbmV4dCkgeworCQlpZiAocHZtYS0+dm1fc3RhcnQgPiB2bWEtPnZtX3N0YXJ0KQogCQkJYnJlYWs7CisJCWlmIChwdm1hLT52bV9zdGFydCA8IHZtYS0+dm1fc3RhcnQpCisJCQljb250aW51ZTsKKwkJaWYgKHB2bWEtPnZtX2VuZCA8IHZtYS0+dm1fZW5kKQorCQkJYnJlYWs7CisJfQogCi0Jdm1sLT5uZXh0ID0gKnBwdjsKLQkqcHB2ID0gdm1sOworCXZtYS0+dm1fbmV4dCA9ICpwcDsKKwkqcHAgPSB2bWE7Cit9CisKKy8qCisgKiBkZWxldGUgYSBWTUEgZnJvbSBpdHMgb3duaW5nIG1tX3N0cnVjdCBhbmQgYWRkcmVzcyBzcGFjZQorICovCitzdGF0aWMgdm9pZCBkZWxldGVfdm1hX2Zyb21fbW0oc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCit7CisJc3RydWN0IHZtX2FyZWFfc3RydWN0ICoqcHA7CisJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmc7CisJc3RydWN0IG1tX3N0cnVjdCAqbW0gPSB2bWEtPnZtX21tOworCisJa2VudGVyKCIlcCIsIHZtYSk7CisKKwltbS0+bWFwX2NvdW50LS07CisJaWYgKG1tLT5tbWFwX2NhY2hlID09IHZtYSkKKwkJbW0tPm1tYXBfY2FjaGUgPSBOVUxMOworCisJLyogcmVtb3ZlIHRoZSBWTUEgZnJvbSB0aGUgbWFwcGluZyAqLworCWlmICh2bWEtPnZtX2ZpbGUpIHsKKwkJbWFwcGluZyA9IHZtYS0+dm1fZmlsZS0+Zl9tYXBwaW5nOworCisJCWZsdXNoX2RjYWNoZV9tbWFwX2xvY2sobWFwcGluZyk7CisJCXZtYV9wcmlvX3RyZWVfcmVtb3ZlKHZtYSwgJm1hcHBpbmctPmlfbW1hcCk7CisJCWZsdXNoX2RjYWNoZV9tbWFwX3VubG9jayhtYXBwaW5nKTsKKwl9CisKKwkvKiByZW1vdmUgZnJvbSB0aGUgTU0ncyB0cmVlIGFuZCBsaXN0ICovCisJcmJfZXJhc2UoJnZtYS0+dm1fcmIsICZtbS0+bW1fcmIpOworCWZvciAocHAgPSAmbW0tPm1tYXA7ICpwcDsgcHAgPSAmKCpwcCktPnZtX25leHQpIHsKKwkJaWYgKCpwcCA9PSB2bWEpIHsKKwkJCSpwcCA9IHZtYS0+dm1fbmV4dDsKKwkJCWJyZWFrOworCQl9CisJfQorCisJdm1hLT52bV9tbSA9IE5VTEw7Cit9CisKKy8qCisgKiBkZXN0cm95IGEgVk1BIHJlY29yZAorICovCitzdGF0aWMgdm9pZCBkZWxldGVfdm1hKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3sKKwlrZW50ZXIoIiVwIiwgdm1hKTsKKwlpZiAodm1hLT52bV9vcHMgJiYgdm1hLT52bV9vcHMtPmNsb3NlKQorCQl2bWEtPnZtX29wcy0+Y2xvc2Uodm1hKTsKKwlpZiAodm1hLT52bV9maWxlKSB7CisJCWZwdXQodm1hLT52bV9maWxlKTsKKwkJaWYgKHZtYS0+dm1fZmxhZ3MgJiBWTV9FWEVDVVRBQkxFKQorCQkJcmVtb3ZlZF9leGVfZmlsZV92bWEobW0pOworCX0KKwlwdXRfbm9tbXVfcmVnaW9uKHZtYS0+dm1fcmVnaW9uKTsKKwlrbWVtX2NhY2hlX2ZyZWUodm1fYXJlYV9jYWNoZXAsIHZtYSk7CiB9CiAKIC8qCkBAIC00NDIsMTkgKzcyMywyNiBAQAogICovCiBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKmZpbmRfdm1hKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHIpCiB7Ci0Jc3RydWN0IHZtX2xpc3Rfc3RydWN0ICpsb29wLCAqdm1sOworCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hOworCXN0cnVjdCByYl9ub2RlICpuID0gbW0tPm1tX3JiLnJiX25vZGU7CiAKLQkvKiBzZWFyY2ggdGhlIHZtX3N0YXJ0IG9yZGVyZWQgbGlzdCAqLwotCXZtbCA9IE5VTEw7Ci0JZm9yIChsb29wID0gbW0tPmNvbnRleHQudm1saXN0OyBsb29wOyBsb29wID0gbG9vcC0+bmV4dCkgewotCQlpZiAobG9vcC0+dm1hLT52bV9zdGFydCA+IGFkZHIpCi0JCQlicmVhazsKLQkJdm1sID0gbG9vcDsKKwkvKiBjaGVjayB0aGUgY2FjaGUgZmlyc3QgKi8KKwl2bWEgPSBtbS0+bW1hcF9jYWNoZTsKKwlpZiAodm1hICYmIHZtYS0+dm1fc3RhcnQgPD0gYWRkciAmJiB2bWEtPnZtX2VuZCA+IGFkZHIpCisJCXJldHVybiB2bWE7CisKKwkvKiB0cmF3bCB0aGUgdHJlZSAodGhlcmUgbWF5IGJlIG11bHRpcGxlIG1hcHBpbmdzIGluIHdoaWNoIGFkZHIKKwkgKiByZXNpZGVzKSAqLworCWZvciAobiA9IHJiX2ZpcnN0KCZtbS0+bW1fcmIpOyBuOyBuID0gcmJfbmV4dChuKSkgeworCQl2bWEgPSByYl9lbnRyeShuLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QsIHZtX3JiKTsKKwkJaWYgKHZtYS0+dm1fc3RhcnQgPiBhZGRyKQorCQkJcmV0dXJuIE5VTEw7CisJCWlmICh2bWEtPnZtX2VuZCA+IGFkZHIpIHsKKwkJCW1tLT5tbWFwX2NhY2hlID0gdm1hOworCQkJcmV0dXJuIHZtYTsKKwkJfQogCX0KIAotCWlmICh2bWwgJiYgdm1sLT52bWEtPnZtX2VuZCA+IGFkZHIpCi0JCXJldHVybiB2bWwtPnZtYTsKLQogCXJldHVybiBOVUxMOwogfQogRVhQT1JUX1NZTUJPTChmaW5kX3ZtYSk7CkBAIC00NjgsNiArNzU2LDEwIEBACiAJcmV0dXJuIGZpbmRfdm1hKG1tLCBhZGRyKTsKIH0KIAorLyoKKyAqIGV4cGFuZCBhIHN0YWNrIHRvIGEgZ2l2ZW4gYWRkcmVzcworICogLSBub3Qgc3VwcG9ydGVkIHVuZGVyIE5PTU1VIGNvbmRpdGlvbnMKKyAqLwogaW50IGV4cGFuZF9zdGFjayhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzKQogewogCXJldHVybiAtRU5PTUVNOwpAQCAtNDc3LDExNCArNzY5LDM3IEBACiAgKiBsb29rIHVwIHRoZSBmaXJzdCBWTUEgZXhhY3RseSB0aGF0IGV4YWN0bHkgbWF0Y2hlcyBhZGRyCiAgKiAtIHNob3VsZCBiZSBjYWxsZWQgd2l0aCBtbS0+bW1hcF9zZW0gYXQgbGVhc3QgaGVsZCByZWFkbG9ja2VkCiAgKi8KLXN0YXRpYyBpbmxpbmUgc3RydWN0IHZtX2FyZWFfc3RydWN0ICpmaW5kX3ZtYV9leGFjdChzdHJ1Y3QgbW1fc3RydWN0ICptbSwKLQkJCQkJCSAgICB1bnNpZ25lZCBsb25nIGFkZHIpCi17Ci0Jc3RydWN0IHZtX2xpc3Rfc3RydWN0ICp2bWw7Ci0KLQkvKiBzZWFyY2ggdGhlIHZtX3N0YXJ0IG9yZGVyZWQgbGlzdCAqLwotCWZvciAodm1sID0gbW0tPmNvbnRleHQudm1saXN0OyB2bWw7IHZtbCA9IHZtbC0+bmV4dCkgewotCQlpZiAodm1sLT52bWEtPnZtX3N0YXJ0ID09IGFkZHIpCi0JCQlyZXR1cm4gdm1sLT52bWE7Ci0JCWlmICh2bWwtPnZtYS0+dm1fc3RhcnQgPiBhZGRyKQotCQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIE5VTEw7Ci19Ci0KLS8qCi0gKiBmaW5kIGEgVk1BIGluIHRoZSBnbG9iYWwgdHJlZQotICovCi1zdGF0aWMgaW5saW5lIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqZmluZF9ub21tdV92bWEodW5zaWduZWQgbG9uZyBzdGFydCkKK3N0YXRpYyBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKmZpbmRfdm1hX2V4YWN0KHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLAorCQkJCQkgICAgIHVuc2lnbmVkIGxvbmcgYWRkciwKKwkJCQkJICAgICB1bnNpZ25lZCBsb25nIGxlbikKIHsKIAlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYTsKLQlzdHJ1Y3QgcmJfbm9kZSAqbiA9IG5vbW11X3ZtYV90cmVlLnJiX25vZGU7CisJc3RydWN0IHJiX25vZGUgKm4gPSBtbS0+bW1fcmIucmJfbm9kZTsKKwl1bnNpZ25lZCBsb25nIGVuZCA9IGFkZHIgKyBsZW47CiAKLQl3aGlsZSAobikgeworCS8qIGNoZWNrIHRoZSBjYWNoZSBmaXJzdCAqLworCXZtYSA9IG1tLT5tbWFwX2NhY2hlOworCWlmICh2bWEgJiYgdm1hLT52bV9zdGFydCA9PSBhZGRyICYmIHZtYS0+dm1fZW5kID09IGVuZCkKKwkJcmV0dXJuIHZtYTsKKworCS8qIHRyYXdsIHRoZSB0cmVlICh0aGVyZSBtYXkgYmUgbXVsdGlwbGUgbWFwcGluZ3MgaW4gd2hpY2ggYWRkcgorCSAqIHJlc2lkZXMpICovCisJZm9yIChuID0gcmJfZmlyc3QoJm1tLT5tbV9yYik7IG47IG4gPSByYl9uZXh0KG4pKSB7CiAJCXZtYSA9IHJiX2VudHJ5KG4sIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCwgdm1fcmIpOwotCi0JCWlmIChzdGFydCA8IHZtYS0+dm1fc3RhcnQpCi0JCQluID0gbi0+cmJfbGVmdDsKLQkJZWxzZSBpZiAoc3RhcnQgPiB2bWEtPnZtX3N0YXJ0KQotCQkJbiA9IG4tPnJiX3JpZ2h0OwotCQllbHNlCisJCWlmICh2bWEtPnZtX3N0YXJ0IDwgYWRkcikKKwkJCWNvbnRpbnVlOworCQlpZiAodm1hLT52bV9zdGFydCA+IGFkZHIpCisJCQlyZXR1cm4gTlVMTDsKKwkJaWYgKHZtYS0+dm1fZW5kID09IGVuZCkgeworCQkJbW0tPm1tYXBfY2FjaGUgPSB2bWE7CiAJCQlyZXR1cm4gdm1hOworCQl9CiAJfQogCiAJcmV0dXJuIE5VTEw7CiB9CiAKIC8qCi0gKiBhZGQgYSBWTUEgaW4gdGhlIGdsb2JhbCB0cmVlCi0gKi8KLXN0YXRpYyB2b2lkIGFkZF9ub21tdV92bWEoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCi17Ci0Jc3RydWN0IHZtX2FyZWFfc3RydWN0ICpwdm1hOwotCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nOwotCXN0cnVjdCByYl9ub2RlICoqcCA9ICZub21tdV92bWFfdHJlZS5yYl9ub2RlOwotCXN0cnVjdCByYl9ub2RlICpwYXJlbnQgPSBOVUxMOwotCi0JLyogYWRkIHRoZSBWTUEgdG8gdGhlIG1hcHBpbmcgKi8KLQlpZiAodm1hLT52bV9maWxlKSB7Ci0JCW1hcHBpbmcgPSB2bWEtPnZtX2ZpbGUtPmZfbWFwcGluZzsKLQotCQlmbHVzaF9kY2FjaGVfbW1hcF9sb2NrKG1hcHBpbmcpOwotCQl2bWFfcHJpb190cmVlX2luc2VydCh2bWEsICZtYXBwaW5nLT5pX21tYXApOwotCQlmbHVzaF9kY2FjaGVfbW1hcF91bmxvY2sobWFwcGluZyk7Ci0JfQotCi0JLyogYWRkIHRoZSBWTUEgdG8gdGhlIG1hc3RlciBsaXN0ICovCi0Jd2hpbGUgKCpwKSB7Ci0JCXBhcmVudCA9ICpwOwotCQlwdm1hID0gcmJfZW50cnkocGFyZW50LCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QsIHZtX3JiKTsKLQotCQlpZiAodm1hLT52bV9zdGFydCA8IHB2bWEtPnZtX3N0YXJ0KSB7Ci0JCQlwID0gJigqcCktPnJiX2xlZnQ7Ci0JCX0KLQkJZWxzZSBpZiAodm1hLT52bV9zdGFydCA+IHB2bWEtPnZtX3N0YXJ0KSB7Ci0JCQlwID0gJigqcCktPnJiX3JpZ2h0OwotCQl9Ci0JCWVsc2UgewotCQkJLyogbWFwcGluZ3MgYXJlIGF0IHRoZSBzYW1lIGFkZHJlc3MgLSB0aGlzIGNhbiBvbmx5Ci0JCQkgKiBoYXBwZW4gZm9yIHNoYXJlZC1tZW0gY2hhcmRldnMgYW5kIHNoYXJlZCBmaWxlCi0JCQkgKiBtYXBwaW5ncyBiYWNrZWQgYnkgcmFtZnMvdG1wZnMgKi8KLQkJCUJVR19PTighKHB2bWEtPnZtX2ZsYWdzICYgVk1fU0hBUkVEKSk7Ci0KLQkJCWlmICh2bWEgPCBwdm1hKQotCQkJCXAgPSAmKCpwKS0+cmJfbGVmdDsKLQkJCWVsc2UgaWYgKHZtYSA+IHB2bWEpCi0JCQkJcCA9ICYoKnApLT5yYl9yaWdodDsKLQkJCWVsc2UKLQkJCQlCVUcoKTsKLQkJfQotCX0KLQotCXJiX2xpbmtfbm9kZSgmdm1hLT52bV9yYiwgcGFyZW50LCBwKTsKLQlyYl9pbnNlcnRfY29sb3IoJnZtYS0+dm1fcmIsICZub21tdV92bWFfdHJlZSk7Ci19Ci0KLS8qCi0gKiBkZWxldGUgYSBWTUEgZnJvbSB0aGUgZ2xvYmFsIGxpc3QKLSAqLwotc3RhdGljIHZvaWQgZGVsZXRlX25vbW11X3ZtYShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKLXsKLQlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZzsKLQotCS8qIHJlbW92ZSB0aGUgVk1BIGZyb20gdGhlIG1hcHBpbmcgKi8KLQlpZiAodm1hLT52bV9maWxlKSB7Ci0JCW1hcHBpbmcgPSB2bWEtPnZtX2ZpbGUtPmZfbWFwcGluZzsKLQotCQlmbHVzaF9kY2FjaGVfbW1hcF9sb2NrKG1hcHBpbmcpOwotCQl2bWFfcHJpb190cmVlX3JlbW92ZSh2bWEsICZtYXBwaW5nLT5pX21tYXApOwotCQlmbHVzaF9kY2FjaGVfbW1hcF91bmxvY2sobWFwcGluZyk7Ci0JfQotCi0JLyogcmVtb3ZlIGZyb20gdGhlIG1hc3RlciBsaXN0ICovCi0JcmJfZXJhc2UoJnZtYS0+dm1fcmIsICZub21tdV92bWFfdHJlZSk7Ci19Ci0KLS8qCiAgKiBkZXRlcm1pbmUgd2hldGhlciBhIG1hcHBpbmcgc2hvdWxkIGJlIHBlcm1pdHRlZCBhbmQsIGlmIHNvLCB3aGF0IHNvcnQgb2YKICAqIG1hcHBpbmcgd2UncmUgY2FwYWJsZSBvZiBzdXBwb3J0aW5nCiAgKi8KQEAgLTU5Niw3ICs4MTEsNyBAQAogCQkJCSB1bnNpZ25lZCBsb25nIHBnb2ZmLAogCQkJCSB1bnNpZ25lZCBsb25nICpfY2FwYWJpbGl0aWVzKQogewotCXVuc2lnbmVkIGxvbmcgY2FwYWJpbGl0aWVzOworCXVuc2lnbmVkIGxvbmcgY2FwYWJpbGl0aWVzLCBybGVuOwogCXVuc2lnbmVkIGxvbmcgcmVxcHJvdCA9IHByb3Q7CiAJaW50IHJldDsKIApAQCAtNjE2LDEyICs4MzEsMTIgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAkvKiBDYXJlZnVsIGFib3V0IG92ZXJmbG93cy4uICovCi0JbGVuID0gUEFHRV9BTElHTihsZW4pOwotCWlmICghbGVuIHx8IGxlbiA+IFRBU0tfU0laRSkKKwlybGVuID0gUEFHRV9BTElHTihsZW4pOworCWlmICghcmxlbiB8fCBybGVuID4gVEFTS19TSVpFKQogCQlyZXR1cm4gLUVOT01FTTsKIAogCS8qIG9mZnNldCBvdmVyZmxvdz8gKi8KLQlpZiAoKHBnb2ZmICsgKGxlbiA+PiBQQUdFX1NISUZUKSkgPCBwZ29mZikKKwlpZiAoKHBnb2ZmICsgKHJsZW4gPj4gUEFHRV9TSElGVCkpIDwgcGdvZmYpCiAJCXJldHVybiAtRU9WRVJGTE9XOwogCiAJaWYgKGZpbGUpIHsKQEAgLTc5NSwxMyArMTAxMCwxOCBAQAogfQogCiAvKgotICogc2V0IHVwIGEgc2hhcmVkIG1hcHBpbmcgb24gYSBmaWxlCisgKiBzZXQgdXAgYSBzaGFyZWQgbWFwcGluZyBvbiBhIGZpbGUgKHRoZSBkcml2ZXIgb3IgZmlsZXN5c3RlbSBwcm92aWRlcyBhbmQKKyAqIHBpbnMgdGhlIHN0b3JhZ2UpCiAgKi8KLXN0YXRpYyBpbnQgZG9fbW1hcF9zaGFyZWRfZmlsZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBsZW4pCitzdGF0aWMgaW50IGRvX21tYXBfc2hhcmVkX2ZpbGUoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCiB7CiAJaW50IHJldDsKIAogCXJldCA9IHZtYS0+dm1fZmlsZS0+Zl9vcC0+bW1hcCh2bWEtPnZtX2ZpbGUsIHZtYSk7CisJaWYgKHJldCA9PSAwKSB7CisJCXZtYS0+dm1fcmVnaW9uLT52bV90b3AgPSB2bWEtPnZtX3JlZ2lvbi0+dm1fZW5kOworCQlyZXR1cm4gcmV0OworCX0KIAlpZiAocmV0ICE9IC1FTk9TWVMpCiAJCXJldHVybiByZXQ7CiAKQEAgLTgxNSwxMCArMTAzNSwxNCBAQAogLyoKICAqIHNldCB1cCBhIHByaXZhdGUgbWFwcGluZyBvciBhbiBhbm9ueW1vdXMgc2hhcmVkIG1hcHBpbmcKICAqLwotc3RhdGljIGludCBkb19tbWFwX3ByaXZhdGUoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgbGVuKQorc3RhdGljIGludCBkb19tbWFwX3ByaXZhdGUoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCisJCQkgICBzdHJ1Y3Qgdm1fcmVnaW9uICpyZWdpb24sCisJCQkgICB1bnNpZ25lZCBsb25nIGxlbikKIHsKKwlzdHJ1Y3QgcGFnZSAqcGFnZXM7CisJdW5zaWduZWQgbG9uZyB0b3RhbCwgcG9pbnQsIG4sIHJsZW47CiAJdm9pZCAqYmFzZTsKLQlpbnQgcmV0OworCWludCByZXQsIG9yZGVyOwogCiAJLyogaW52b2tlIHRoZSBmaWxlJ3MgbWFwcGluZyBmdW5jdGlvbiBzbyB0aGF0IGl0IGNhbiBrZWVwIHRyYWNrIG9mCiAJICogc2hhcmVkIG1hcHBpbmdzIG9uIGRldmljZXMgb3IgbWVtb3J5CkBAIC04MjYsMzQgKzEwNTAsNjMgQEAKIAkgKi8KIAlpZiAodm1hLT52bV9maWxlKSB7CiAJCXJldCA9IHZtYS0+dm1fZmlsZS0+Zl9vcC0+bW1hcCh2bWEtPnZtX2ZpbGUsIHZtYSk7Ci0JCWlmIChyZXQgIT0gLUVOT1NZUykgeworCQlpZiAocmV0ID09IDApIHsKIAkJCS8qIHNob3VsZG4ndCByZXR1cm4gc3VjY2VzcyBpZiB3ZSdyZSBub3Qgc2hhcmluZyAqLwotCQkJQlVHX09OKHJldCA9PSAwICYmICEodm1hLT52bV9mbGFncyAmIFZNX01BWVNIQVJFKSk7Ci0JCQlyZXR1cm4gcmV0OyAvKiBzdWNjZXNzIG9yIGEgcmVhbCBlcnJvciAqLworCQkJQlVHX09OKCEodm1hLT52bV9mbGFncyAmIFZNX01BWVNIQVJFKSk7CisJCQl2bWEtPnZtX3JlZ2lvbi0+dm1fdG9wID0gdm1hLT52bV9yZWdpb24tPnZtX2VuZDsKKwkJCXJldHVybiByZXQ7CiAJCX0KKwkJaWYgKHJldCAhPSAtRU5PU1lTKQorCQkJcmV0dXJuIHJldDsKIAogCQkvKiBnZXR0aW5nIGFuIEVOT1NZUyBlcnJvciBpbmRpY2F0ZXMgdGhhdCBkaXJlY3QgbW1hcCBpc24ndAogCQkgKiBwb3NzaWJsZSAoYXMgb3Bwb3NlZCB0byB0cmllZCBidXQgZmFpbGVkKSBzbyB3ZSdsbCB0cnkgdG8KIAkJICogbWFrZSBhIHByaXZhdGUgY29weSBvZiB0aGUgZGF0YSBhbmQgbWFwIHRoYXQgaW5zdGVhZCAqLwogCX0KIAorCXJsZW4gPSBQQUdFX0FMSUdOKGxlbik7CisKIAkvKiBhbGxvY2F0ZSBzb21lIG1lbW9yeSB0byBob2xkIHRoZSBtYXBwaW5nCiAJICogLSBub3RlIHRoYXQgdGhpcyBtYXkgbm90IHJldHVybiBhIHBhZ2UtYWxpZ25lZCBhZGRyZXNzIGlmIHRoZSBvYmplY3QKIAkgKiAgIHdlJ3JlIGFsbG9jYXRpbmcgaXMgc21hbGxlciB0aGFuIGEgcGFnZQogCSAqLwotCWJhc2UgPSBrbWFsbG9jKGxlbiwgR0ZQX0tFUk5FTHxfX0dGUF9DT01QKTsKLQlpZiAoIWJhc2UpCisJb3JkZXIgPSBnZXRfb3JkZXIocmxlbik7CisJa2RlYnVnKCJhbGxvYyBvcmRlciAlZCBmb3IgJWx4Iiwgb3JkZXIsIGxlbik7CisKKwlwYWdlcyA9IGFsbG9jX3BhZ2VzKEdGUF9LRVJORUwsIG9yZGVyKTsKKwlpZiAoIXBhZ2VzKQogCQlnb3RvIGVub21lbTsKIAotCXZtYS0+dm1fc3RhcnQgPSAodW5zaWduZWQgbG9uZykgYmFzZTsKLQl2bWEtPnZtX2VuZCA9IHZtYS0+dm1fc3RhcnQgKyBsZW47Ci0Jdm1hLT52bV9mbGFncyB8PSBWTV9NQVBQRURfQ09QWTsKKwl0b3RhbCA9IDEgPDwgb3JkZXI7CisJYXRvbWljX2FkZCh0b3RhbCwgJm1tYXBfcGFnZXNfYWxsb2NhdGVkKTsKIAotI2lmZGVmIFdBUk5fT05fU0xBQ0sKLQlpZiAobGVuICsgV0FSTl9PTl9TTEFDSyA8PSBrb2Jqc2l6ZShyZXN1bHQpKQotCQlwcmludGsoIkFsbG9jYXRpb24gb2YgJWx1IGJ5dGVzIGZyb20gcHJvY2VzcyAlZCBoYXMgJWx1IGJ5dGVzIG9mIHNsYWNrXG4iLAotCQkgICAgICAgbGVuLCBjdXJyZW50LT5waWQsIGtvYmpzaXplKHJlc3VsdCkgLSBsZW4pOwotI2VuZGlmCisJcG9pbnQgPSBybGVuID4+IFBBR0VfU0hJRlQ7CisKKwkvKiB3ZSBhbGxvY2F0ZWQgYSBwb3dlci1vZi0yIHNpemVkIHBhZ2Ugc2V0LCBzbyB3ZSBtYXkgd2FudCB0byB0cmltIG9mZgorCSAqIHRoZSBleGNlc3MgKi8KKwlpZiAoc3lzY3RsX25yX3RyaW1fcGFnZXMgJiYgdG90YWwgLSBwb2ludCA+PSBzeXNjdGxfbnJfdHJpbV9wYWdlcykgeworCQl3aGlsZSAodG90YWwgPiBwb2ludCkgeworCQkJb3JkZXIgPSBpbG9nMih0b3RhbCAtIHBvaW50KTsKKwkJCW4gPSAxIDw8IG9yZGVyOworCQkJa2RlYnVnKCJzaGF2ZSAlbHUvJWx1IEAlbHUiLCBuLCB0b3RhbCAtIHBvaW50LCB0b3RhbCk7CisJCQlhdG9taWNfc3ViKG4sICZtbWFwX3BhZ2VzX2FsbG9jYXRlZCk7CisJCQl0b3RhbCAtPSBuOworCQkJc2V0X3BhZ2VfcmVmY291bnRlZChwYWdlcyArIHRvdGFsKTsKKwkJCV9fZnJlZV9wYWdlcyhwYWdlcyArIHRvdGFsLCBvcmRlcik7CisJCX0KKwl9CisKKwlmb3IgKHBvaW50ID0gMTsgcG9pbnQgPCB0b3RhbDsgcG9pbnQrKykKKwkJc2V0X3BhZ2VfcmVmY291bnRlZCgmcGFnZXNbcG9pbnRdKTsKKworCWJhc2UgPSBwYWdlX2FkZHJlc3MocGFnZXMpOworCXJlZ2lvbi0+dm1fZmxhZ3MgPSB2bWEtPnZtX2ZsYWdzIHw9IFZNX01BUFBFRF9DT1BZOworCXJlZ2lvbi0+dm1fc3RhcnQgPSAodW5zaWduZWQgbG9uZykgYmFzZTsKKwlyZWdpb24tPnZtX2VuZCAgID0gcmVnaW9uLT52bV9zdGFydCArIHJsZW47CisJcmVnaW9uLT52bV90b3AgICA9IHJlZ2lvbi0+dm1fc3RhcnQgKyAodG90YWwgPDwgUEFHRV9TSElGVCk7CisKKwl2bWEtPnZtX3N0YXJ0ID0gcmVnaW9uLT52bV9zdGFydDsKKwl2bWEtPnZtX2VuZCAgID0gcmVnaW9uLT52bV9zdGFydCArIGxlbjsKIAogCWlmICh2bWEtPnZtX2ZpbGUpIHsKIAkJLyogcmVhZCB0aGUgY29udGVudHMgb2YgYSBmaWxlIGludG8gdGhlIGNvcHkgKi8KQEAgLTg2NSwyNiArMTExOCwyOCBAQAogCiAJCW9sZF9mcyA9IGdldF9mcygpOwogCQlzZXRfZnMoS0VSTkVMX0RTKTsKLQkJcmV0ID0gdm1hLT52bV9maWxlLT5mX29wLT5yZWFkKHZtYS0+dm1fZmlsZSwgYmFzZSwgbGVuLCAmZnBvcyk7CisJCXJldCA9IHZtYS0+dm1fZmlsZS0+Zl9vcC0+cmVhZCh2bWEtPnZtX2ZpbGUsIGJhc2UsIHJsZW4sICZmcG9zKTsKIAkJc2V0X2ZzKG9sZF9mcyk7CiAKIAkJaWYgKHJldCA8IDApCiAJCQlnb3RvIGVycm9yX2ZyZWU7CiAKIAkJLyogY2xlYXIgdGhlIGxhc3QgbGl0dGxlIGJpdCAqLwotCQlpZiAocmV0IDwgbGVuKQotCQkJbWVtc2V0KGJhc2UgKyByZXQsIDAsIGxlbiAtIHJldCk7CisJCWlmIChyZXQgPCBybGVuKQorCQkJbWVtc2V0KGJhc2UgKyByZXQsIDAsIHJsZW4gLSByZXQpOwogCiAJfSBlbHNlIHsKIAkJLyogaWYgaXQncyBhbiBhbm9ueW1vdXMgbWFwcGluZywgdGhlbiBqdXN0IGNsZWFyIGl0ICovCi0JCW1lbXNldChiYXNlLCAwLCBsZW4pOworCQltZW1zZXQoYmFzZSwgMCwgcmxlbik7CiAJfQogCiAJcmV0dXJuIDA7CiAKIGVycm9yX2ZyZWU6Ci0Ja2ZyZWUoYmFzZSk7Ci0Jdm1hLT52bV9zdGFydCA9IDA7CisJZnJlZV9wYWdlX3NlcmllcyhyZWdpb24tPnZtX3N0YXJ0LCByZWdpb24tPnZtX2VuZCk7CisJcmVnaW9uLT52bV9zdGFydCA9IHZtYS0+dm1fc3RhcnQgPSAwOworCXJlZ2lvbi0+dm1fZW5kICAgPSB2bWEtPnZtX2VuZCA9IDA7CisJcmVnaW9uLT52bV90b3AgICA9IDA7CiAJcmV0dXJuIHJldDsKIAogZW5vbWVtOgpAQCAtOTA0LDEzICsxMTU5LDE0IEBACiAJCQkgICAgdW5zaWduZWQgbG9uZyBmbGFncywKIAkJCSAgICB1bnNpZ25lZCBsb25nIHBnb2ZmKQogewotCXN0cnVjdCB2bV9saXN0X3N0cnVjdCAqdm1sID0gTlVMTDsKLQlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSA9IE5VTEw7CisJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWE7CisJc3RydWN0IHZtX3JlZ2lvbiAqcmVnaW9uOwogCXN0cnVjdCByYl9ub2RlICpyYjsKLQl1bnNpZ25lZCBsb25nIGNhcGFiaWxpdGllcywgdm1fZmxhZ3M7Ci0Jdm9pZCAqcmVzdWx0OworCXVuc2lnbmVkIGxvbmcgY2FwYWJpbGl0aWVzLCB2bV9mbGFncywgcmVzdWx0OwogCWludCByZXQ7CiAKKwlrZW50ZXIoIiwlbHgsJWx4LCVseCwlbHgsJWx4IiwgYWRkciwgbGVuLCBwcm90LCBmbGFncywgcGdvZmYpOworCiAJaWYgKCEoZmxhZ3MgJiBNQVBfRklYRUQpKQogCQlhZGRyID0gcm91bmRfaGludF90b19taW4oYWRkcik7CiAKQEAgLTkxOCw3MyArMTE3NCwxMjAgQEAKIAkgKiBtYXBwaW5nICovCiAJcmV0ID0gdmFsaWRhdGVfbW1hcF9yZXF1ZXN0KGZpbGUsIGFkZHIsIGxlbiwgcHJvdCwgZmxhZ3MsIHBnb2ZmLAogCQkJCSAgICAmY2FwYWJpbGl0aWVzKTsKLQlpZiAocmV0IDwgMCkKKwlpZiAocmV0IDwgMCkgeworCQlrbGVhdmUoIiA9ICVkIFt2YWxdIiwgcmV0KTsKIAkJcmV0dXJuIHJldDsKKwl9CiAKIAkvKiB3ZSd2ZSBkZXRlcm1pbmVkIHRoYXQgd2UgY2FuIG1ha2UgdGhlIG1hcHBpbmcsIG5vdyB0cmFuc2xhdGUgd2hhdCB3ZQogCSAqIG5vdyBrbm93IGludG8gVk1BIGZsYWdzICovCiAJdm1fZmxhZ3MgPSBkZXRlcm1pbmVfdm1fZmxhZ3MoZmlsZSwgcHJvdCwgZmxhZ3MsIGNhcGFiaWxpdGllcyk7CiAKLQkvKiB3ZSdyZSBnb2luZyB0byBuZWVkIHRvIHJlY29yZCB0aGUgbWFwcGluZyBpZiBpdCB3b3JrcyAqLwotCXZtbCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB2bV9saXN0X3N0cnVjdCksIEdGUF9LRVJORUwpOwotCWlmICghdm1sKQotCQlnb3RvIGVycm9yX2dldHRpbmdfdm1sOworCS8qIHdlJ3JlIGdvaW5nIHRvIG5lZWQgdG8gcmVjb3JkIHRoZSBtYXBwaW5nICovCisJcmVnaW9uID0ga21lbV9jYWNoZV96YWxsb2Modm1fcmVnaW9uX2phciwgR0ZQX0tFUk5FTCk7CisJaWYgKCFyZWdpb24pCisJCWdvdG8gZXJyb3JfZ2V0dGluZ19yZWdpb247CiAKLQlkb3duX3dyaXRlKCZub21tdV92bWFfc2VtKTsKKwl2bWEgPSBrbWVtX2NhY2hlX3phbGxvYyh2bV9hcmVhX2NhY2hlcCwgR0ZQX0tFUk5FTCk7CisJaWYgKCF2bWEpCisJCWdvdG8gZXJyb3JfZ2V0dGluZ192bWE7CiAKLQkvKiBpZiB3ZSB3YW50IHRvIHNoYXJlLCB3ZSBuZWVkIHRvIGNoZWNrIGZvciBWTUFzIGNyZWF0ZWQgYnkgb3RoZXIKKwlhdG9taWNfc2V0KCZyZWdpb24tPnZtX3VzYWdlLCAxKTsKKwlyZWdpb24tPnZtX2ZsYWdzID0gdm1fZmxhZ3M7CisJcmVnaW9uLT52bV9wZ29mZiA9IHBnb2ZmOworCisJSU5JVF9MSVNUX0hFQUQoJnZtYS0+YW5vbl92bWFfbm9kZSk7CisJdm1hLT52bV9mbGFncyA9IHZtX2ZsYWdzOworCXZtYS0+dm1fcGdvZmYgPSBwZ29mZjsKKworCWlmIChmaWxlKSB7CisJCXJlZ2lvbi0+dm1fZmlsZSA9IGZpbGU7CisJCWdldF9maWxlKGZpbGUpOworCQl2bWEtPnZtX2ZpbGUgPSBmaWxlOworCQlnZXRfZmlsZShmaWxlKTsKKwkJaWYgKHZtX2ZsYWdzICYgVk1fRVhFQ1VUQUJMRSkgeworCQkJYWRkZWRfZXhlX2ZpbGVfdm1hKGN1cnJlbnQtPm1tKTsKKwkJCXZtYS0+dm1fbW0gPSBjdXJyZW50LT5tbTsKKwkJfQorCX0KKworCWRvd25fd3JpdGUoJm5vbW11X3JlZ2lvbl9zZW0pOworCisJLyogaWYgd2Ugd2FudCB0byBzaGFyZSwgd2UgbmVlZCB0byBjaGVjayBmb3IgcmVnaW9ucyBjcmVhdGVkIGJ5IG90aGVyCiAJICogbW1hcCgpIGNhbGxzIHRoYXQgb3ZlcmxhcCB3aXRoIG91ciBwcm9wb3NlZCBtYXBwaW5nCi0JICogLSB3ZSBjYW4gb25seSBzaGFyZSB3aXRoIGFuIGV4YWN0IG1hdGNoIG9uIG1vc3QgcmVndWxhciBmaWxlcworCSAqIC0gd2UgY2FuIG9ubHkgc2hhcmUgd2l0aCBhIHN1cGVyc2V0IG1hdGNoIG9uIG1vc3QgcmVndWxhciBmaWxlcwogCSAqIC0gc2hhcmVkIG1hcHBpbmdzIG9uIGNoYXJhY3RlciBkZXZpY2VzIGFuZCBtZW1vcnkgYmFja2VkIGZpbGVzIGFyZQogCSAqICAgcGVybWl0dGVkIHRvIG92ZXJsYXAgaW5leGFjdGx5IGFzIGZhciBhcyB3ZSBhcmUgY29uY2VybmVkIGZvciBpbgogCSAqICAgdGhlc2UgY2FzZXMsIHNoYXJpbmcgaXMgaGFuZGxlZCBpbiB0aGUgZHJpdmVyIG9yIGZpbGVzeXN0ZW0gcmF0aGVyCiAJICogICB0aGFuIGhlcmUKIAkgKi8KIAlpZiAodm1fZmxhZ3MgJiBWTV9NQVlTSEFSRSkgewotCQl1bnNpZ25lZCBsb25nIHBnbGVuID0gKGxlbiArIFBBR0VfU0laRSAtIDEpID4+IFBBR0VfU0hJRlQ7Ci0JCXVuc2lnbmVkIGxvbmcgdm1wZ2xlbjsKKwkJc3RydWN0IHZtX3JlZ2lvbiAqcHJlZ2lvbjsKKwkJdW5zaWduZWQgbG9uZyBwZ2xlbiwgcnBnbGVuLCBwZ2VuZCwgcnBnZW5kLCBzdGFydDsKIAotCQkvKiBzdXBwcmVzcyBWTUEgc2hhcmluZyBmb3Igc2hhcmVkIHJlZ2lvbnMgKi8KLQkJaWYgKHZtX2ZsYWdzICYgVk1fU0hBUkVEICYmCi0JCSAgICBjYXBhYmlsaXRpZXMgJiBCRElfQ0FQX01BUF9ESVJFQ1QpCi0JCQlnb3RvIGRvbnRfc2hhcmVfVk1BczsKKwkJcGdsZW4gPSAobGVuICsgUEFHRV9TSVpFIC0gMSkgPj4gUEFHRV9TSElGVDsKKwkJcGdlbmQgPSBwZ29mZiArIHBnbGVuOwogCi0JCWZvciAocmIgPSByYl9maXJzdCgmbm9tbXVfdm1hX3RyZWUpOyByYjsgcmIgPSByYl9uZXh0KHJiKSkgewotCQkJdm1hID0gcmJfZW50cnkocmIsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCwgdm1fcmIpOworCQlmb3IgKHJiID0gcmJfZmlyc3QoJm5vbW11X3JlZ2lvbl90cmVlKTsgcmI7IHJiID0gcmJfbmV4dChyYikpIHsKKwkJCXByZWdpb24gPSByYl9lbnRyeShyYiwgc3RydWN0IHZtX3JlZ2lvbiwgdm1fcmIpOwogCi0JCQlpZiAoISh2bWEtPnZtX2ZsYWdzICYgVk1fTUFZU0hBUkUpKQorCQkJaWYgKCEocHJlZ2lvbi0+dm1fZmxhZ3MgJiBWTV9NQVlTSEFSRSkpCiAJCQkJY29udGludWU7CiAKIAkJCS8qIHNlYXJjaCBmb3Igb3ZlcmxhcHBpbmcgbWFwcGluZ3Mgb24gdGhlIHNhbWUgZmlsZSAqLwotCQkJaWYgKHZtYS0+dm1fZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZSAhPSBmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlKQorCQkJaWYgKHByZWdpb24tPnZtX2ZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUgIT0KKwkJCSAgICBmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlKQogCQkJCWNvbnRpbnVlOwogCi0JCQlpZiAodm1hLT52bV9wZ29mZiA+PSBwZ29mZiArIHBnbGVuKQorCQkJaWYgKHByZWdpb24tPnZtX3Bnb2ZmID49IHBnZW5kKQogCQkJCWNvbnRpbnVlOwogCi0JCQl2bXBnbGVuID0gdm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0ICsgUEFHRV9TSVpFIC0gMTsKLQkJCXZtcGdsZW4gPj49IFBBR0VfU0hJRlQ7Ci0JCQlpZiAocGdvZmYgPj0gdm1hLT52bV9wZ29mZiArIHZtcGdsZW4pCisJCQlycGdsZW4gPSBwcmVnaW9uLT52bV9lbmQgLSBwcmVnaW9uLT52bV9zdGFydDsKKwkJCXJwZ2xlbiA9IChycGdsZW4gKyBQQUdFX1NJWkUgLSAxKSA+PiBQQUdFX1NISUZUOworCQkJcnBnZW5kID0gcHJlZ2lvbi0+dm1fcGdvZmYgKyBycGdsZW47CisJCQlpZiAocGdvZmYgPj0gcnBnZW5kKQogCQkJCWNvbnRpbnVlOwogCi0JCQkvKiBoYW5kbGUgaW5leGFjdGx5IG92ZXJsYXBwaW5nIG1hdGNoZXMgYmV0d2VlbiBtYXBwaW5ncyAqLwotCQkJaWYgKHZtYS0+dm1fcGdvZmYgIT0gcGdvZmYgfHwgdm1wZ2xlbiAhPSBwZ2xlbikgeworCQkJLyogaGFuZGxlIGluZXhhY3RseSBvdmVybGFwcGluZyBtYXRjaGVzIGJldHdlZW4KKwkJCSAqIG1hcHBpbmdzICovCisJCQlpZiAoKHByZWdpb24tPnZtX3Bnb2ZmICE9IHBnb2ZmIHx8IHJwZ2xlbiAhPSBwZ2xlbikgJiYKKwkJCSAgICAhKHBnb2ZmID49IHByZWdpb24tPnZtX3Bnb2ZmICYmIHBnZW5kIDw9IHJwZ2VuZCkpIHsKKwkJCQkvKiBuZXcgbWFwcGluZyBpcyBub3QgYSBzdWJzZXQgb2YgdGhlIHJlZ2lvbiAqLwogCQkJCWlmICghKGNhcGFiaWxpdGllcyAmIEJESV9DQVBfTUFQX0RJUkVDVCkpCiAJCQkJCWdvdG8gc2hhcmluZ192aW9sYXRpb247CiAJCQkJY29udGludWU7CiAJCQl9CiAKLQkJCS8qIHdlJ3ZlIGZvdW5kIGEgVk1BIHdlIGNhbiBzaGFyZSAqLwotCQkJYXRvbWljX2luYygmdm1hLT52bV91c2FnZSk7CisJCQkvKiB3ZSd2ZSBmb3VuZCBhIHJlZ2lvbiB3ZSBjYW4gc2hhcmUgKi8KKwkJCWF0b21pY19pbmMoJnByZWdpb24tPnZtX3VzYWdlKTsKKwkJCXZtYS0+dm1fcmVnaW9uID0gcHJlZ2lvbjsKKwkJCXN0YXJ0ID0gcHJlZ2lvbi0+dm1fc3RhcnQ7CisJCQlzdGFydCArPSAocGdvZmYgLSBwcmVnaW9uLT52bV9wZ29mZikgPDwgUEFHRV9TSElGVDsKKwkJCXZtYS0+dm1fc3RhcnQgPSBzdGFydDsKKwkJCXZtYS0+dm1fZW5kID0gc3RhcnQgKyBsZW47CiAKLQkJCXZtbC0+dm1hID0gdm1hOwotCQkJcmVzdWx0ID0gKHZvaWQgKikgdm1hLT52bV9zdGFydDsKLQkJCWdvdG8gc2hhcmVkOworCQkJaWYgKHByZWdpb24tPnZtX2ZsYWdzICYgVk1fTUFQUEVEX0NPUFkpIHsKKwkJCQlrZGVidWcoInNoYXJlIGNvcHkiKTsKKwkJCQl2bWEtPnZtX2ZsYWdzIHw9IFZNX01BUFBFRF9DT1BZOworCQkJfSBlbHNlIHsKKwkJCQlrZGVidWcoInNoYXJlIG1tYXAiKTsKKwkJCQlyZXQgPSBkb19tbWFwX3NoYXJlZF9maWxlKHZtYSk7CisJCQkJaWYgKHJldCA8IDApIHsKKwkJCQkJdm1hLT52bV9yZWdpb24gPSBOVUxMOworCQkJCQl2bWEtPnZtX3N0YXJ0ID0gMDsKKwkJCQkJdm1hLT52bV9lbmQgPSAwOworCQkJCQlhdG9taWNfZGVjKCZwcmVnaW9uLT52bV91c2FnZSk7CisJCQkJCXByZWdpb24gPSBOVUxMOworCQkJCQlnb3RvIGVycm9yX2p1c3RfZnJlZTsKKwkJCQl9CisJCQl9CisJCQlmcHV0KHJlZ2lvbi0+dm1fZmlsZSk7CisJCQlrbWVtX2NhY2hlX2ZyZWUodm1fcmVnaW9uX2phciwgcmVnaW9uKTsKKwkJCXJlZ2lvbiA9IHByZWdpb247CisJCQlyZXN1bHQgPSBzdGFydDsKKwkJCWdvdG8gc2hhcmU7CiAJCX0KIAotCWRvbnRfc2hhcmVfVk1BczoKLQkJdm1hID0gTlVMTDsKLQogCQkvKiBvYnRhaW4gdGhlIGFkZHJlc3MgYXQgd2hpY2ggdG8gbWFrZSBhIHNoYXJlZCBtYXBwaW5nCiAJCSAqIC0gdGhpcyBpcyB0aGUgaG9vayBmb3IgcXVhc2ktbWVtb3J5IGNoYXJhY3RlciBkZXZpY2VzIHRvCiAJCSAqICAgdGVsbCB1cyB0aGUgbG9jYXRpb24gb2YgYSBzaGFyZWQgbWFwcGluZwpAQCAtOTk1LDExMyArMTI5OCw5MyBAQAogCQkJaWYgKElTX0VSUigodm9pZCAqKSBhZGRyKSkgewogCQkJCXJldCA9IGFkZHI7CiAJCQkJaWYgKHJldCAhPSAodW5zaWduZWQgbG9uZykgLUVOT1NZUykKLQkJCQkJZ290byBlcnJvcjsKKwkJCQkJZ290byBlcnJvcl9qdXN0X2ZyZWU7CiAKIAkJCQkvKiB0aGUgZHJpdmVyIHJlZnVzZWQgdG8gdGVsbCB1cyB3aGVyZSB0byBzaXRlCiAJCQkJICogdGhlIG1hcHBpbmcgc28gd2UnbGwgaGF2ZSB0byBhdHRlbXB0IHRvIGNvcHkKIAkJCQkgKiBpdCAqLwogCQkJCXJldCA9ICh1bnNpZ25lZCBsb25nKSAtRU5PREVWOwogCQkJCWlmICghKGNhcGFiaWxpdGllcyAmIEJESV9DQVBfTUFQX0NPUFkpKQotCQkJCQlnb3RvIGVycm9yOworCQkJCQlnb3RvIGVycm9yX2p1c3RfZnJlZTsKIAogCQkJCWNhcGFiaWxpdGllcyAmPSB+QkRJX0NBUF9NQVBfRElSRUNUOworCQkJfSBlbHNlIHsKKwkJCQl2bWEtPnZtX3N0YXJ0ID0gcmVnaW9uLT52bV9zdGFydCA9IGFkZHI7CisJCQkJdm1hLT52bV9lbmQgPSByZWdpb24tPnZtX2VuZCA9IGFkZHIgKyBsZW47CiAJCQl9CiAJCX0KIAl9CiAKLQkvKiB3ZSdyZSBnb2luZyB0byBuZWVkIGEgVk1BIHN0cnVjdCBhcyB3ZWxsICovCi0Jdm1hID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHZtX2FyZWFfc3RydWN0KSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCF2bWEpCi0JCWdvdG8gZXJyb3JfZ2V0dGluZ192bWE7Ci0KLQlJTklUX0xJU1RfSEVBRCgmdm1hLT5hbm9uX3ZtYV9ub2RlKTsKLQlhdG9taWNfc2V0KCZ2bWEtPnZtX3VzYWdlLCAxKTsKLQlpZiAoZmlsZSkgewotCQlnZXRfZmlsZShmaWxlKTsKLQkJaWYgKHZtX2ZsYWdzICYgVk1fRVhFQ1VUQUJMRSkgewotCQkJYWRkZWRfZXhlX2ZpbGVfdm1hKGN1cnJlbnQtPm1tKTsKLQkJCXZtYS0+dm1fbW0gPSBjdXJyZW50LT5tbTsKLQkJfQotCX0KLQl2bWEtPnZtX2ZpbGUJPSBmaWxlOwotCXZtYS0+dm1fZmxhZ3MJPSB2bV9mbGFnczsKLQl2bWEtPnZtX3N0YXJ0CT0gYWRkcjsKLQl2bWEtPnZtX2VuZAk9IGFkZHIgKyBsZW47Ci0Jdm1hLT52bV9wZ29mZgk9IHBnb2ZmOwotCi0Jdm1sLT52bWEgPSB2bWE7CisJdm1hLT52bV9yZWdpb24gPSByZWdpb247CiAKIAkvKiBzZXQgdXAgdGhlIG1hcHBpbmcgKi8KIAlpZiAoZmlsZSAmJiB2bWEtPnZtX2ZsYWdzICYgVk1fU0hBUkVEKQotCQlyZXQgPSBkb19tbWFwX3NoYXJlZF9maWxlKHZtYSwgbGVuKTsKKwkJcmV0ID0gZG9fbW1hcF9zaGFyZWRfZmlsZSh2bWEpOwogCWVsc2UKLQkJcmV0ID0gZG9fbW1hcF9wcml2YXRlKHZtYSwgbGVuKTsKKwkJcmV0ID0gZG9fbW1hcF9wcml2YXRlKHZtYSwgcmVnaW9uLCBsZW4pOwogCWlmIChyZXQgPCAwKQotCQlnb3RvIGVycm9yOworCQlnb3RvIGVycm9yX3B1dF9yZWdpb247CisKKwlhZGRfbm9tbXVfcmVnaW9uKHJlZ2lvbik7CiAKIAkvKiBva2F5Li4uIHdlIGhhdmUgYSBtYXBwaW5nOyBub3cgd2UgaGF2ZSB0byByZWdpc3RlciBpdCAqLwotCXJlc3VsdCA9ICh2b2lkICopIHZtYS0+dm1fc3RhcnQ7Ci0KLQlpZiAodm1hLT52bV9mbGFncyAmIFZNX01BUFBFRF9DT1BZKSB7Ci0JCXJlYWxhbGxvYyArPSBrb2Jqc2l6ZShyZXN1bHQpOwotCQlhc2tlZGFsbG9jICs9IGxlbjsKLQl9Ci0KLQlyZWFsYWxsb2MgKz0ga29ianNpemUodm1hKTsKLQlhc2tlZGFsbG9jICs9IHNpemVvZigqdm1hKTsKKwlyZXN1bHQgPSB2bWEtPnZtX3N0YXJ0OwogCiAJY3VycmVudC0+bW0tPnRvdGFsX3ZtICs9IGxlbiA+PiBQQUdFX1NISUZUOwogCi0JYWRkX25vbW11X3ZtYSh2bWEpOworc2hhcmU6CisJYWRkX3ZtYV90b19tbShjdXJyZW50LT5tbSwgdm1hKTsKIAotIHNoYXJlZDoKLQlyZWFsYWxsb2MgKz0ga29ianNpemUodm1sKTsKLQlhc2tlZGFsbG9jICs9IHNpemVvZigqdm1sKTsKLQotCWFkZF92bWFfdG9fbW0oY3VycmVudC0+bW0sIHZtbCk7Ci0KLQl1cF93cml0ZSgmbm9tbXVfdm1hX3NlbSk7CisJdXBfd3JpdGUoJm5vbW11X3JlZ2lvbl9zZW0pOwogCiAJaWYgKHByb3QgJiBQUk9UX0VYRUMpCi0JCWZsdXNoX2ljYWNoZV9yYW5nZSgodW5zaWduZWQgbG9uZykgcmVzdWx0LAotCQkJCSAgICh1bnNpZ25lZCBsb25nKSByZXN1bHQgKyBsZW4pOworCQlmbHVzaF9pY2FjaGVfcmFuZ2UocmVzdWx0LCByZXN1bHQgKyBsZW4pOwogCi0jaWZkZWYgREVCVUcKLQlwcmludGsoImRvX21tYXA6XG4iKTsKLQlzaG93X3Byb2Nlc3NfYmxvY2tzKCk7Ci0jZW5kaWYKKwlrbGVhdmUoIiA9ICVseCIsIHJlc3VsdCk7CisJcmV0dXJuIHJlc3VsdDsKIAotCXJldHVybiAodW5zaWduZWQgbG9uZykgcmVzdWx0OwotCi0gZXJyb3I6Ci0JdXBfd3JpdGUoJm5vbW11X3ZtYV9zZW0pOwotCWtmcmVlKHZtbCk7CitlcnJvcl9wdXRfcmVnaW9uOgorCV9fcHV0X25vbW11X3JlZ2lvbihyZWdpb24pOwogCWlmICh2bWEpIHsKIAkJaWYgKHZtYS0+dm1fZmlsZSkgewogCQkJZnB1dCh2bWEtPnZtX2ZpbGUpOwogCQkJaWYgKHZtYS0+dm1fZmxhZ3MgJiBWTV9FWEVDVVRBQkxFKQogCQkJCXJlbW92ZWRfZXhlX2ZpbGVfdm1hKHZtYS0+dm1fbW0pOwogCQl9Ci0JCWtmcmVlKHZtYSk7CisJCWttZW1fY2FjaGVfZnJlZSh2bV9hcmVhX2NhY2hlcCwgdm1hKTsKIAl9CisJa2xlYXZlKCIgPSAlZCBbcHJdIiwgcmV0KTsKIAlyZXR1cm4gcmV0OwogCi0gc2hhcmluZ192aW9sYXRpb246Ci0JdXBfd3JpdGUoJm5vbW11X3ZtYV9zZW0pOwotCXByaW50aygiQXR0ZW1wdCB0byBzaGFyZSBtaXNtYXRjaGVkIG1hcHBpbmdzXG4iKTsKLQlrZnJlZSh2bWwpOwotCXJldHVybiAtRUlOVkFMOworZXJyb3JfanVzdF9mcmVlOgorCXVwX3dyaXRlKCZub21tdV9yZWdpb25fc2VtKTsKK2Vycm9yOgorCWZwdXQocmVnaW9uLT52bV9maWxlKTsKKwlrbWVtX2NhY2hlX2ZyZWUodm1fcmVnaW9uX2phciwgcmVnaW9uKTsKKwlmcHV0KHZtYS0+dm1fZmlsZSk7CisJaWYgKHZtYS0+dm1fZmxhZ3MgJiBWTV9FWEVDVVRBQkxFKQorCQlyZW1vdmVkX2V4ZV9maWxlX3ZtYSh2bWEtPnZtX21tKTsKKwlrbWVtX2NhY2hlX2ZyZWUodm1fYXJlYV9jYWNoZXAsIHZtYSk7CisJa2xlYXZlKCIgPSAlZCIsIHJldCk7CisJcmV0dXJuIHJldDsKIAotIGVycm9yX2dldHRpbmdfdm1hOgotCXVwX3dyaXRlKCZub21tdV92bWFfc2VtKTsKLQlrZnJlZSh2bWwpOwotCXByaW50aygiQWxsb2NhdGlvbiBvZiB2bWEgZm9yICVsdSBieXRlIGFsbG9jYXRpb24gZnJvbSBwcm9jZXNzICVkIGZhaWxlZFxuIiwKK3NoYXJpbmdfdmlvbGF0aW9uOgorCXVwX3dyaXRlKCZub21tdV9yZWdpb25fc2VtKTsKKwlwcmludGsoS0VSTl9XQVJOSU5HICJBdHRlbXB0IHRvIHNoYXJlIG1pc21hdGNoZWQgbWFwcGluZ3NcbiIpOworCXJldCA9IC1FSU5WQUw7CisJZ290byBlcnJvcjsKKworZXJyb3JfZ2V0dGluZ192bWE6CisJa21lbV9jYWNoZV9mcmVlKHZtX3JlZ2lvbl9qYXIsIHJlZ2lvbik7CisJcHJpbnRrKEtFUk5fV0FSTklORyAiQWxsb2NhdGlvbiBvZiB2bWEgZm9yICVsdSBieXRlIGFsbG9jYXRpb24iCisJICAgICAgICIgZnJvbSBwcm9jZXNzICVkIGZhaWxlZFxuIiwKIAkgICAgICAgbGVuLCBjdXJyZW50LT5waWQpOwogCXNob3dfZnJlZV9hcmVhcygpOwogCXJldHVybiAtRU5PTUVNOwogCi0gZXJyb3JfZ2V0dGluZ192bWw6Ci0JcHJpbnRrKCJBbGxvY2F0aW9uIG9mIHZtbCBmb3IgJWx1IGJ5dGUgYWxsb2NhdGlvbiBmcm9tIHByb2Nlc3MgJWQgZmFpbGVkXG4iLAorZXJyb3JfZ2V0dGluZ19yZWdpb246CisJcHJpbnRrKEtFUk5fV0FSTklORyAiQWxsb2NhdGlvbiBvZiB2bSByZWdpb24gZm9yICVsdSBieXRlIGFsbG9jYXRpb24iCisJICAgICAgICIgZnJvbSBwcm9jZXNzICVkIGZhaWxlZFxuIiwKIAkgICAgICAgbGVuLCBjdXJyZW50LT5waWQpOwogCXNob3dfZnJlZV9hcmVhcygpOwogCXJldHVybiAtRU5PTUVNOwpAQCAtMTEwOSw5MCArMTM5MiwxODggQEAKIEVYUE9SVF9TWU1CT0woZG9fbW1hcF9wZ29mZik7CiAKIC8qCi0gKiBoYW5kbGUgbWFwcGluZyBkaXNwb3NhbCBmb3IgdUNsaW51eAorICogc3BsaXQgYSB2bWEgaW50byB0d28gcGllY2VzIGF0IGFkZHJlc3MgJ2FkZHInLCBhIG5ldyB2bWEgaXMgYWxsb2NhdGVkIGVpdGhlcgorICogZm9yIHRoZSBmaXJzdCBwYXJ0IG9yIHRoZSB0YWlsLgogICovCi1zdGF0aWMgdm9pZCBwdXRfdm1hKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK2ludCBzcGxpdF92bWEoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAorCSAgICAgIHVuc2lnbmVkIGxvbmcgYWRkciwgaW50IG5ld19iZWxvdykKIHsKLQlpZiAodm1hKSB7Ci0JCWRvd25fd3JpdGUoJm5vbW11X3ZtYV9zZW0pOworCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqbmV3OworCXN0cnVjdCB2bV9yZWdpb24gKnJlZ2lvbjsKKwl1bnNpZ25lZCBsb25nIG5wYWdlczsKIAotCQlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmdm1hLT52bV91c2FnZSkpIHsKLQkJCWRlbGV0ZV9ub21tdV92bWEodm1hKTsKKwlrZW50ZXIoIiIpOwogCi0JCQlpZiAodm1hLT52bV9vcHMgJiYgdm1hLT52bV9vcHMtPmNsb3NlKQotCQkJCXZtYS0+dm1fb3BzLT5jbG9zZSh2bWEpOworCS8qIHdlJ3JlIG9ubHkgcGVybWl0dGVkIHRvIHNwbGl0IGFub255bW91cyByZWdpb25zIHRoYXQgaGF2ZSBhIHNpbmdsZQorCSAqIG93bmVyICovCisJaWYgKHZtYS0+dm1fZmlsZSB8fAorCSAgICBhdG9taWNfcmVhZCgmdm1hLT52bV9yZWdpb24tPnZtX3VzYWdlKSAhPSAxKQorCQlyZXR1cm4gLUVOT01FTTsKIAotCQkJLyogSU8gbWVtb3J5IGFuZCBtZW1vcnkgc2hhcmVkIGRpcmVjdGx5IG91dCBvZiB0aGUgcGFnZWNhY2hlIGZyb20KLQkJCSAqIHJhbWZzL3RtcGZzIG11c3RuJ3QgYmUgcmVsZWFzZWQgaGVyZSAqLwotCQkJaWYgKHZtYS0+dm1fZmxhZ3MgJiBWTV9NQVBQRURfQ09QWSkgewotCQkJCXJlYWxhbGxvYyAtPSBrb2Jqc2l6ZSgodm9pZCAqKSB2bWEtPnZtX3N0YXJ0KTsKLQkJCQlhc2tlZGFsbG9jIC09IHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydDsKLQkJCQlrZnJlZSgodm9pZCAqKSB2bWEtPnZtX3N0YXJ0KTsKLQkJCX0KKwlpZiAobW0tPm1hcF9jb3VudCA+PSBzeXNjdGxfbWF4X21hcF9jb3VudCkKKwkJcmV0dXJuIC1FTk9NRU07CiAKLQkJCXJlYWxhbGxvYyAtPSBrb2Jqc2l6ZSh2bWEpOwotCQkJYXNrZWRhbGxvYyAtPSBzaXplb2YoKnZtYSk7CisJcmVnaW9uID0ga21lbV9jYWNoZV9hbGxvYyh2bV9yZWdpb25famFyLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXJlZ2lvbikKKwkJcmV0dXJuIC1FTk9NRU07CiAKLQkJCWlmICh2bWEtPnZtX2ZpbGUpIHsKLQkJCQlmcHV0KHZtYS0+dm1fZmlsZSk7Ci0JCQkJaWYgKHZtYS0+dm1fZmxhZ3MgJiBWTV9FWEVDVVRBQkxFKQotCQkJCQlyZW1vdmVkX2V4ZV9maWxlX3ZtYShtbSk7Ci0JCQl9Ci0JCQlrZnJlZSh2bWEpOwotCQl9Ci0KLQkJdXBfd3JpdGUoJm5vbW11X3ZtYV9zZW0pOworCW5ldyA9IGttZW1fY2FjaGVfYWxsb2Modm1fYXJlYV9jYWNoZXAsIEdGUF9LRVJORUwpOworCWlmICghbmV3KSB7CisJCWttZW1fY2FjaGVfZnJlZSh2bV9yZWdpb25famFyLCByZWdpb24pOworCQlyZXR1cm4gLUVOT01FTTsKIAl9CisKKwkvKiBtb3N0IGZpZWxkcyBhcmUgdGhlIHNhbWUsIGNvcHkgYWxsLCBhbmQgdGhlbiBmaXh1cCAqLworCSpuZXcgPSAqdm1hOworCSpyZWdpb24gPSAqdm1hLT52bV9yZWdpb247CisJbmV3LT52bV9yZWdpb24gPSByZWdpb247CisKKwlucGFnZXMgPSAoYWRkciAtIHZtYS0+dm1fc3RhcnQpID4+IFBBR0VfU0hJRlQ7CisKKwlpZiAobmV3X2JlbG93KSB7CisJCXJlZ2lvbi0+dm1fdG9wID0gcmVnaW9uLT52bV9lbmQgPSBuZXctPnZtX2VuZCA9IGFkZHI7CisJfSBlbHNlIHsKKwkJcmVnaW9uLT52bV9zdGFydCA9IG5ldy0+dm1fc3RhcnQgPSBhZGRyOworCQlyZWdpb24tPnZtX3Bnb2ZmID0gbmV3LT52bV9wZ29mZiArPSBucGFnZXM7CisJfQorCisJaWYgKG5ldy0+dm1fb3BzICYmIG5ldy0+dm1fb3BzLT5vcGVuKQorCQluZXctPnZtX29wcy0+b3BlbihuZXcpOworCisJZGVsZXRlX3ZtYV9mcm9tX21tKHZtYSk7CisJZG93bl93cml0ZSgmbm9tbXVfcmVnaW9uX3NlbSk7CisJZGVsZXRlX25vbW11X3JlZ2lvbih2bWEtPnZtX3JlZ2lvbik7CisJaWYgKG5ld19iZWxvdykgeworCQl2bWEtPnZtX3JlZ2lvbi0+dm1fc3RhcnQgPSB2bWEtPnZtX3N0YXJ0ID0gYWRkcjsKKwkJdm1hLT52bV9yZWdpb24tPnZtX3Bnb2ZmID0gdm1hLT52bV9wZ29mZiArPSBucGFnZXM7CisJfSBlbHNlIHsKKwkJdm1hLT52bV9yZWdpb24tPnZtX2VuZCA9IHZtYS0+dm1fZW5kID0gYWRkcjsKKwkJdm1hLT52bV9yZWdpb24tPnZtX3RvcCA9IGFkZHI7CisJfQorCWFkZF9ub21tdV9yZWdpb24odm1hLT52bV9yZWdpb24pOworCWFkZF9ub21tdV9yZWdpb24obmV3LT52bV9yZWdpb24pOworCXVwX3dyaXRlKCZub21tdV9yZWdpb25fc2VtKTsKKwlhZGRfdm1hX3RvX21tKG1tLCB2bWEpOworCWFkZF92bWFfdG9fbW0obW0sIG5ldyk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBzaHJpbmsgYSBWTUEgYnkgcmVtb3ZpbmcgdGhlIHNwZWNpZmllZCBjaHVuayBmcm9tIGVpdGhlciB0aGUgYmVnaW5uaW5nIG9yCisgKiB0aGUgZW5kCisgKi8KK3N0YXRpYyBpbnQgc2hyaW5rX3ZtYShzdHJ1Y3QgbW1fc3RydWN0ICptbSwKKwkJICAgICAgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCisJCSAgICAgIHVuc2lnbmVkIGxvbmcgZnJvbSwgdW5zaWduZWQgbG9uZyB0bykKK3sKKwlzdHJ1Y3Qgdm1fcmVnaW9uICpyZWdpb247CisKKwlrZW50ZXIoIiIpOworCisJLyogYWRqdXN0IHRoZSBWTUEncyBwb2ludGVycywgd2hpY2ggbWF5IHJlcG9zaXRpb24gaXQgaW4gdGhlIE1NJ3MgdHJlZQorCSAqIGFuZCBsaXN0ICovCisJZGVsZXRlX3ZtYV9mcm9tX21tKHZtYSk7CisJaWYgKGZyb20gPiB2bWEtPnZtX3N0YXJ0KQorCQl2bWEtPnZtX2VuZCA9IGZyb207CisJZWxzZQorCQl2bWEtPnZtX3N0YXJ0ID0gdG87CisJYWRkX3ZtYV90b19tbShtbSwgdm1hKTsKKworCS8qIGN1dCB0aGUgYmFja2luZyByZWdpb24gZG93biB0byBzaXplICovCisJcmVnaW9uID0gdm1hLT52bV9yZWdpb247CisJQlVHX09OKGF0b21pY19yZWFkKCZyZWdpb24tPnZtX3VzYWdlKSAhPSAxKTsKKworCWRvd25fd3JpdGUoJm5vbW11X3JlZ2lvbl9zZW0pOworCWRlbGV0ZV9ub21tdV9yZWdpb24ocmVnaW9uKTsKKwlpZiAoZnJvbSA+IHJlZ2lvbi0+dm1fc3RhcnQpIHsKKwkJdG8gPSByZWdpb24tPnZtX3RvcDsKKwkJcmVnaW9uLT52bV90b3AgPSByZWdpb24tPnZtX2VuZCA9IGZyb207CisJfSBlbHNlIHsKKwkJcmVnaW9uLT52bV9zdGFydCA9IHRvOworCX0KKwlhZGRfbm9tbXVfcmVnaW9uKHJlZ2lvbik7CisJdXBfd3JpdGUoJm5vbW11X3JlZ2lvbl9zZW0pOworCisJZnJlZV9wYWdlX3Nlcmllcyhmcm9tLCB0byk7CisJcmV0dXJuIDA7CiB9CiAKIC8qCiAgKiByZWxlYXNlIGEgbWFwcGluZwotICogLSB1bmRlciBOT01NVSBjb25kaXRpb25zIHRoZSBwYXJhbWV0ZXJzIG11c3QgbWF0Y2ggZXhhY3RseSB0byB0aGUgbWFwcGluZyB0bwotICogICBiZSByZW1vdmVkCisgKiAtIHVuZGVyIE5PTU1VIGNvbmRpdGlvbnMgdGhlIGNodW5rIHRvIGJlIHVubWFwcGVkIG11c3QgYmUgYmFja2VkIGJ5IGEgc2luZ2xlCisgKiAgIFZNQSwgdGhvdWdoIGl0IG5lZWQgbm90IGNvdmVyIHRoZSB3aG9sZSBWTUEKICAqLwotaW50IGRvX211bm1hcChzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyLCBzaXplX3QgbGVuKQoraW50IGRvX211bm1hcChzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBzdGFydCwgc2l6ZV90IGxlbikKIHsKLQlzdHJ1Y3Qgdm1fbGlzdF9zdHJ1Y3QgKnZtbCwgKipwYXJlbnQ7Ci0JdW5zaWduZWQgbG9uZyBlbmQgPSBhZGRyICsgbGVuOworCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hOworCXN0cnVjdCByYl9ub2RlICpyYjsKKwl1bnNpZ25lZCBsb25nIGVuZCA9IHN0YXJ0ICsgbGVuOworCWludCByZXQ7CiAKLSNpZmRlZiBERUJVRwotCXByaW50aygiZG9fbXVubWFwOlxuIik7Ci0jZW5kaWYKKwlrZW50ZXIoIiwlbHgsJXp4Iiwgc3RhcnQsIGxlbik7CiAKLQlmb3IgKHBhcmVudCA9ICZtbS0+Y29udGV4dC52bWxpc3Q7ICpwYXJlbnQ7IHBhcmVudCA9ICYoKnBhcmVudCktPm5leHQpIHsKLQkJaWYgKCgqcGFyZW50KS0+dm1hLT52bV9zdGFydCA+IGFkZHIpCi0JCQlicmVhazsKLQkJaWYgKCgqcGFyZW50KS0+dm1hLT52bV9zdGFydCA9PSBhZGRyICYmCi0JCSAgICAoKGxlbiA9PSAwKSB8fCAoKCpwYXJlbnQpLT52bWEtPnZtX2VuZCA9PSBlbmQpKSkKLQkJCWdvdG8gZm91bmQ7CisJaWYgKGxlbiA9PSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIGZpbmQgdGhlIGZpcnN0IHBvdGVudGlhbGx5IG92ZXJsYXBwaW5nIFZNQSAqLworCXZtYSA9IGZpbmRfdm1hKG1tLCBzdGFydCk7CisJaWYgKCF2bWEpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORworCQkgICAgICAgIm11bm1hcCBvZiBtZW1vcnkgbm90IG1tYXBwZWQgYnkgcHJvY2VzcyAlZCAoJXMpOiIKKwkJICAgICAgICIgMHglbHgtMHglbHhcbiIsCisJCSAgICAgICBjdXJyZW50LT5waWQsIGN1cnJlbnQtPmNvbW0sIHN0YXJ0LCBzdGFydCArIGxlbiAtIDEpOworCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlwcmludGsoIm11bm1hcCBvZiBub24tbW1hcGVkIG1lbW9yeSBieSBwcm9jZXNzICVkICglcyk6ICVwXG4iLAotCSAgICAgICBjdXJyZW50LT5waWQsIGN1cnJlbnQtPmNvbW0sICh2b2lkICopIGFkZHIpOwotCXJldHVybiAtRUlOVkFMOworCS8qIHdlJ3JlIGFsbG93ZWQgdG8gc3BsaXQgYW4gYW5vbnltb3VzIFZNQSBidXQgbm90IGEgZmlsZS1iYWNrZWQgb25lICovCisJaWYgKHZtYS0+dm1fZmlsZSkgeworCQlkbyB7CisJCQlpZiAoc3RhcnQgPiB2bWEtPnZtX3N0YXJ0KSB7CisJCQkJa2xlYXZlKCIgPSAtRUlOVkFMIFttaXNzXSIpOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCQkJaWYgKGVuZCA9PSB2bWEtPnZtX2VuZCkKKwkJCQlnb3RvIGVyYXNlX3dob2xlX3ZtYTsKKwkJCXJiID0gcmJfbmV4dCgmdm1hLT52bV9yYik7CisJCQl2bWEgPSByYl9lbnRyeShyYiwgc3RydWN0IHZtX2FyZWFfc3RydWN0LCB2bV9yYik7CisJCX0gd2hpbGUgKHJiKTsKKwkJa2xlYXZlKCIgPSAtRUlOVkFMIFtzcGxpdCBmaWxlXSIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9IGVsc2UgeworCQkvKiB0aGUgY2h1bmsgbXVzdCBiZSBhIHN1YnNldCBvZiB0aGUgVk1BIGZvdW5kICovCisJCWlmIChzdGFydCA9PSB2bWEtPnZtX3N0YXJ0ICYmIGVuZCA9PSB2bWEtPnZtX2VuZCkKKwkJCWdvdG8gZXJhc2Vfd2hvbGVfdm1hOworCQlpZiAoc3RhcnQgPCB2bWEtPnZtX3N0YXJ0IHx8IGVuZCA+IHZtYS0+dm1fZW5kKSB7CisJCQlrbGVhdmUoIiA9IC1FSU5WQUwgW3N1cGVyc2V0XSIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJaWYgKHN0YXJ0ICYgflBBR0VfTUFTSykgeworCQkJa2xlYXZlKCIgPSAtRUlOVkFMIFt1bmFsaWduZWQgc3RhcnRdIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlpZiAoZW5kICE9IHZtYS0+dm1fZW5kICYmIGVuZCAmIH5QQUdFX01BU0spIHsKKwkJCWtsZWF2ZSgiID0gLUVJTlZBTCBbdW5hbGlnbmVkIHNwbGl0XSIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJaWYgKHN0YXJ0ICE9IHZtYS0+dm1fc3RhcnQgJiYgZW5kICE9IHZtYS0+dm1fZW5kKSB7CisJCQlyZXQgPSBzcGxpdF92bWEobW0sIHZtYSwgc3RhcnQsIDEpOworCQkJaWYgKHJldCA8IDApIHsKKwkJCQlrbGVhdmUoIiA9ICVkIFtzcGxpdF0iLCByZXQpOworCQkJCXJldHVybiByZXQ7CisJCQl9CisJCX0KKwkJcmV0dXJuIHNocmlua192bWEobW0sIHZtYSwgc3RhcnQsIGVuZCk7CisJfQogCi0gZm91bmQ6Ci0Jdm1sID0gKnBhcmVudDsKLQotCXB1dF92bWEobW0sIHZtbC0+dm1hKTsKLQotCSpwYXJlbnQgPSB2bWwtPm5leHQ7Ci0JcmVhbGFsbG9jIC09IGtvYmpzaXplKHZtbCk7Ci0JYXNrZWRhbGxvYyAtPSBzaXplb2YoKnZtbCk7Ci0Ja2ZyZWUodm1sKTsKLQotCXVwZGF0ZV9oaXdhdGVyX3ZtKG1tKTsKLQltbS0+dG90YWxfdm0gLT0gbGVuID4+IFBBR0VfU0hJRlQ7Ci0KLSNpZmRlZiBERUJVRwotCXNob3dfcHJvY2Vzc19ibG9ja3MoKTsKLSNlbmRpZgotCitlcmFzZV93aG9sZV92bWE6CisJZGVsZXRlX3ZtYV9mcm9tX21tKHZtYSk7CisJZGVsZXRlX3ZtYShtbSwgdm1hKTsKKwlrbGVhdmUoIiA9IDAiKTsKIAlyZXR1cm4gMDsKIH0KIEVYUE9SVF9TWU1CT0woZG9fbXVubWFwKTsKIAotYXNtbGlua2FnZSBsb25nIHN5c19tdW5tYXAodW5zaWduZWQgbG9uZyBhZGRyLCBzaXplX3QgbGVuKQorU1lTQ0FMTF9ERUZJTkUyKG11bm1hcCwgdW5zaWduZWQgbG9uZywgYWRkciwgc2l6ZV90LCBsZW4pCiB7CiAJaW50IHJldDsKIAlzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IGN1cnJlbnQtPm1tOwpAQCAtMTIwNCwzMiArMTU4NSwyNiBAQAogfQogCiAvKgotICogUmVsZWFzZSBhbGwgbWFwcGluZ3MKKyAqIHJlbGVhc2UgYWxsIHRoZSBtYXBwaW5ncyBtYWRlIGluIGEgcHJvY2VzcydzIFZNIHNwYWNlCiAgKi8KLXZvaWQgZXhpdF9tbWFwKHN0cnVjdCBtbV9zdHJ1Y3QgKiBtbSkKK3ZvaWQgZXhpdF9tbWFwKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKQogewotCXN0cnVjdCB2bV9saXN0X3N0cnVjdCAqdG1wOworCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hOwogCi0JaWYgKG1tKSB7Ci0jaWZkZWYgREVCVUcKLQkJcHJpbnRrKCJFeGl0X21tYXA6XG4iKTsKLSNlbmRpZgorCWlmICghbW0pCisJCXJldHVybjsKIAotCQltbS0+dG90YWxfdm0gPSAwOworCWtlbnRlcigiIik7CiAKLQkJd2hpbGUgKCh0bXAgPSBtbS0+Y29udGV4dC52bWxpc3QpKSB7Ci0JCQltbS0+Y29udGV4dC52bWxpc3QgPSB0bXAtPm5leHQ7Ci0JCQlwdXRfdm1hKG1tLCB0bXAtPnZtYSk7CisJbW0tPnRvdGFsX3ZtID0gMDsKIAotCQkJcmVhbGFsbG9jIC09IGtvYmpzaXplKHRtcCk7Ci0JCQlhc2tlZGFsbG9jIC09IHNpemVvZigqdG1wKTsKLQkJCWtmcmVlKHRtcCk7Ci0JCX0KLQotI2lmZGVmIERFQlVHCi0JCXNob3dfcHJvY2Vzc19ibG9ja3MoKTsKLSNlbmRpZgorCXdoaWxlICgodm1hID0gbW0tPm1tYXApKSB7CisJCW1tLT5tbWFwID0gdm1hLT52bV9uZXh0OworCQlkZWxldGVfdm1hX2Zyb21fbW0odm1hKTsKKwkJZGVsZXRlX3ZtYShtbSwgdm1hKTsKIAl9CisKKwlrbGVhdmUoIiIpOwogfQogCiB1bnNpZ25lZCBsb25nIGRvX2Jyayh1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgbGVuKQpAQCAtMTI0Miw4ICsxNjE3LDggQEAKICAqIHRpbWUgKGNvbnRyb2xsZWQgYnkgdGhlIE1SRU1BUF9NQVlNT1ZFIGZsYWcgYW5kIGF2YWlsYWJsZSBWTSBzcGFjZSkKICAqCiAgKiB1bmRlciBOT01NVSBjb25kaXRpb25zLCB3ZSBvbmx5IHBlcm1pdCBjaGFuZ2luZyBhIG1hcHBpbmcncyBzaXplLCBhbmQgb25seQotICogYXMgbG9uZyBhcyBpdCBzdGF5cyB3aXRoaW4gdGhlIGhvbGUgYWxsb2NhdGVkIGJ5IHRoZSBrbWFsbG9jKCkgY2FsbCBpbgotICogZG9fbW1hcF9wZ29mZigpIGFuZCB0aGUgYmxvY2sgaXMgbm90IHNoYXJlYWJsZQorICogYXMgbG9uZyBhcyBpdCBzdGF5cyB3aXRoaW4gdGhlIHJlZ2lvbiBhbGxvY2F0ZWQgYnkgZG9fbW1hcF9wcml2YXRlKCkgYW5kIHRoZQorICogYmxvY2sgaXMgbm90IHNoYXJlYWJsZQogICoKICAqIE1SRU1BUF9GSVhFRCBpcyBub3Qgc3VwcG9ydGVkIHVuZGVyIE5PTU1VIGNvbmRpdGlvbnMKICAqLwpAQCAtMTI1NCwxMyArMTYyOSwxNiBAQAogCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hOwogCiAJLyogaW5zYW5pdHkgY2hlY2tzIGZpcnN0ICovCi0JaWYgKG5ld19sZW4gPT0gMCkKKwlpZiAob2xkX2xlbiA9PSAwIHx8IG5ld19sZW4gPT0gMCkKIAkJcmV0dXJuICh1bnNpZ25lZCBsb25nKSAtRUlOVkFMOwogCisJaWYgKGFkZHIgJiB+UEFHRV9NQVNLKQorCQlyZXR1cm4gLUVJTlZBTDsKKwogCWlmIChmbGFncyAmIE1SRU1BUF9GSVhFRCAmJiBuZXdfYWRkciAhPSBhZGRyKQogCQlyZXR1cm4gKHVuc2lnbmVkIGxvbmcpIC1FSU5WQUw7CiAKLQl2bWEgPSBmaW5kX3ZtYV9leGFjdChjdXJyZW50LT5tbSwgYWRkcik7CisJdm1hID0gZmluZF92bWFfZXhhY3QoY3VycmVudC0+bW0sIGFkZHIsIG9sZF9sZW4pOwogCWlmICghdm1hKQogCQlyZXR1cm4gKHVuc2lnbmVkIGxvbmcpIC1FSU5WQUw7CiAKQEAgLTEyNzAsMjIgKzE2NDgsMTggQEAKIAlpZiAodm1hLT52bV9mbGFncyAmIFZNX01BWVNIQVJFKQogCQlyZXR1cm4gKHVuc2lnbmVkIGxvbmcpIC1FUEVSTTsKIAotCWlmIChuZXdfbGVuID4ga29ianNpemUoKHZvaWQgKikgYWRkcikpCisJaWYgKG5ld19sZW4gPiB2bWEtPnZtX3JlZ2lvbi0+dm1fZW5kIC0gdm1hLT52bV9yZWdpb24tPnZtX3N0YXJ0KQogCQlyZXR1cm4gKHVuc2lnbmVkIGxvbmcpIC1FTk9NRU07CiAKIAkvKiBhbGwgY2hlY2tzIGNvbXBsZXRlIC0gZG8gaXQgKi8KIAl2bWEtPnZtX2VuZCA9IHZtYS0+dm1fc3RhcnQgKyBuZXdfbGVuOwotCi0JYXNrZWRhbGxvYyAtPSBvbGRfbGVuOwotCWFza2VkYWxsb2MgKz0gbmV3X2xlbjsKLQogCXJldHVybiB2bWEtPnZtX3N0YXJ0OwogfQogRVhQT1JUX1NZTUJPTChkb19tcmVtYXApOwogCi1hc21saW5rYWdlIHVuc2lnbmVkIGxvbmcgc3lzX21yZW1hcCh1bnNpZ25lZCBsb25nIGFkZHIsCi0JdW5zaWduZWQgbG9uZyBvbGRfbGVuLCB1bnNpZ25lZCBsb25nIG5ld19sZW4sCi0JdW5zaWduZWQgbG9uZyBmbGFncywgdW5zaWduZWQgbG9uZyBuZXdfYWRkcikKK1NZU0NBTExfREVGSU5FNShtcmVtYXAsIHVuc2lnbmVkIGxvbmcsIGFkZHIsIHVuc2lnbmVkIGxvbmcsIG9sZF9sZW4sCisJCXVuc2lnbmVkIGxvbmcsIG5ld19sZW4sIHVuc2lnbmVkIGxvbmcsIGZsYWdzLAorCQl1bnNpZ25lZCBsb25nLCBuZXdfYWRkcikKIHsKIAl1bnNpZ25lZCBsb25nIHJldDsKIApkaWZmIC0tZ2l0IGEvbW0vb29tX2tpbGwuYyBiL21tL29vbV9raWxsLmMKaW5kZXggNmI5ZTc1OC4uNDBiYTA1MCAxMDA2NDQKLS0tIGEvbW0vb29tX2tpbGwuYworKysgYi9tbS9vb21fa2lsbC5jCkBAIC00MjksNyArNDI5LDYgQEAKIAl1bnNpZ25lZCBsb25nIHBvaW50cyA9IDA7CiAJc3RydWN0IHRhc2tfc3RydWN0ICpwOwogCi0JY2dyb3VwX2xvY2soKTsKIAlyZWFkX2xvY2soJnRhc2tsaXN0X2xvY2spOwogcmV0cnk6CiAJcCA9IHNlbGVjdF9iYWRfcHJvY2VzcygmcG9pbnRzLCBtZW0pOwpAQCAtNDQ0LDcgKzQ0Myw2IEBACiAJCWdvdG8gcmV0cnk7CiBvdXQ6CiAJcmVhZF91bmxvY2soJnRhc2tsaXN0X2xvY2spOwotCWNncm91cF91bmxvY2soKTsKIH0KICNlbmRpZgogCkBAIC01NjAsNiArNTU4LDEzIEBACiAJCS8qIEdvdCBzb21lIG1lbW9yeSBiYWNrIGluIHRoZSBsYXN0IHNlY29uZC4gKi8KIAkJcmV0dXJuOwogCisJLyoKKwkgKiBJZiB0aGlzIGlzIGZyb20gbWVtY2csIG9vbS1raWxsZXIgaXMgYWxyZWFkeSBpbnZva2VkLgorCSAqIGFuZCBub3Qgd29ydGggdG8gZ28gc3lzdGVtLXdpZGUtb29tLgorCSAqLworCWlmIChtZW1fY2dyb3VwX29vbV9jYWxsZWQoY3VycmVudCkpCisJCWdvdG8gcmVzdF9hbmRfcmV0dXJuOworCiAJaWYgKHN5c2N0bF9wYW5pY19vbl9vb20pCiAJCXBhbmljKCJvdXQgb2YgbWVtb3J5IGZyb20gcGFnZSBmYXVsdC4gcGFuaWNfb25fb29tIGlzIHNlbGVjdGVkLlxuIik7CiAKQEAgLTU3MSw2ICs1NzYsNyBAQAogCSAqIEdpdmUgInAiIGEgZ29vZCBjaGFuY2Ugb2Yga2lsbGluZyBpdHNlbGYgYmVmb3JlIHdlCiAJICogcmV0cnkgdG8gYWxsb2NhdGUgbWVtb3J5LgogCSAqLworcmVzdF9hbmRfcmV0dXJuOgogCWlmICghdGVzdF90aHJlYWRfZmxhZyhUSUZfTUVNRElFKSkKIAkJc2NoZWR1bGVfdGltZW91dF91bmludGVycnVwdGlibGUoMSk7CiB9CmRpZmYgLS1naXQgYS9tbS9wYWdlX2FsbG9jLmMgYi9tbS9wYWdlX2FsbG9jLmMKaW5kZXggN2JmMjJlMC4uNTY3NWIzMCAxMDA2NDQKLS0tIGEvbW0vcGFnZV9hbGxvYy5jCisrKyBiL21tL3BhZ2VfYWxsb2MuYwpAQCAtMzUyMywxMCArMzUyMywxMCBAQAogCQkJSU5JVF9MSVNUX0hFQUQoJnpvbmUtPmxydVtsXS5saXN0KTsKIAkJCXpvbmUtPmxydVtsXS5ucl9zY2FuID0gMDsKIAkJfQotCQl6b25lLT5yZWNlbnRfcm90YXRlZFswXSA9IDA7Ci0JCXpvbmUtPnJlY2VudF9yb3RhdGVkWzFdID0gMDsKLQkJem9uZS0+cmVjZW50X3NjYW5uZWRbMF0gPSAwOwotCQl6b25lLT5yZWNlbnRfc2Nhbm5lZFsxXSA9IDA7CisJCXpvbmUtPnJlY2xhaW1fc3RhdC5yZWNlbnRfcm90YXRlZFswXSA9IDA7CisJCXpvbmUtPnJlY2xhaW1fc3RhdC5yZWNlbnRfcm90YXRlZFsxXSA9IDA7CisJCXpvbmUtPnJlY2xhaW1fc3RhdC5yZWNlbnRfc2Nhbm5lZFswXSA9IDA7CisJCXpvbmUtPnJlY2xhaW1fc3RhdC5yZWNlbnRfc2Nhbm5lZFsxXSA9IDA7CiAJCXphcF96b25lX3ZtX3N0YXRzKHpvbmUpOwogCQl6b25lLT5mbGFncyA9IDA7CiAJCWlmICghc2l6ZSkKZGlmZiAtLWdpdCBhL21tL3BhZ2VfY2dyb3VwLmMgYi9tbS9wYWdlX2Nncm91cC5jCmluZGV4IGQ2NTA3YTYuLjcwMDZhMTEgMTAwNjQ0Ci0tLSBhL21tL3BhZ2VfY2dyb3VwLmMKKysrIGIvbW0vcGFnZV9jZ3JvdXAuYwpAQCAtOCw2ICs4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tZW1vcnkuaD4KICNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CiAjaW5jbHVkZSA8bGludXgvY2dyb3VwLmg+CisjaW5jbHVkZSA8bGludXgvc3dhcG9wcy5oPgogCiBzdGF0aWMgdm9pZCBfX21lbWluaXQKIF9faW5pdF9wYWdlX2Nncm91cChzdHJ1Y3QgcGFnZV9jZ3JvdXAgKnBjLCB1bnNpZ25lZCBsb25nIHBmbikKQEAgLTE1LDYgKzE2LDcgQEAKIAlwYy0+ZmxhZ3MgPSAwOwogCXBjLT5tZW1fY2dyb3VwID0gTlVMTDsKIAlwYy0+cGFnZSA9IHBmbl90b19wYWdlKHBmbik7CisJSU5JVF9MSVNUX0hFQUQoJnBjLT5scnUpOwogfQogc3RhdGljIHVuc2lnbmVkIGxvbmcgdG90YWxfdXNhZ2U7CiAKQEAgLTcyLDcgKzc0LDcgQEAKIAogCWludCBuaWQsIGZhaWw7CiAKLQlpZiAobWVtX2Nncm91cF9zdWJzeXMuZGlzYWJsZWQpCisJaWYgKG1lbV9jZ3JvdXBfZGlzYWJsZWQoKSkKIAkJcmV0dXJuOwogCiAJZm9yX2VhY2hfb25saW5lX25vZGUobmlkKSAgewpAQCAtMTAzLDEzICsxMDUsMTEgQEAKIC8qIF9fYWxsb2NfYm9vdG1lbS4uLigpIGlzIHByb3RlY3RlZCBieSAhc2xhYl9hdmFpbGFibGUoKSAqLwogc3RhdGljIGludCBfX2luaXRfcmVmb2sgaW5pdF9zZWN0aW9uX3BhZ2VfY2dyb3VwKHVuc2lnbmVkIGxvbmcgcGZuKQogewotCXN0cnVjdCBtZW1fc2VjdGlvbiAqc2VjdGlvbjsKKwlzdHJ1Y3QgbWVtX3NlY3Rpb24gKnNlY3Rpb24gPSBfX3Bmbl90b19zZWN0aW9uKHBmbik7CiAJc3RydWN0IHBhZ2VfY2dyb3VwICpiYXNlLCAqcGM7CiAJdW5zaWduZWQgbG9uZyB0YWJsZV9zaXplOwogCWludCBuaWQsIGluZGV4OwogCi0Jc2VjdGlvbiA9IF9fcGZuX3RvX3NlY3Rpb24ocGZuKTsKLQogCWlmICghc2VjdGlvbi0+cGFnZV9jZ3JvdXApIHsKIAkJbmlkID0gcGFnZV90b19uaWQocGZuX3RvX3BhZ2UocGZuKSk7CiAJCXRhYmxlX3NpemUgPSBzaXplb2Yoc3RydWN0IHBhZ2VfY2dyb3VwKSAqIFBBR0VTX1BFUl9TRUNUSU9OOwpAQCAtMTQ1LDcgKzE0NSw2IEBACiAJCV9faW5pdF9wYWdlX2Nncm91cChwYywgcGZuICsgaW5kZXgpOwogCX0KIAotCXNlY3Rpb24gPSBfX3Bmbl90b19zZWN0aW9uKHBmbik7CiAJc2VjdGlvbi0+cGFnZV9jZ3JvdXAgPSBiYXNlIC0gcGZuOwogCXRvdGFsX3VzYWdlICs9IHRhYmxlX3NpemU7CiAJcmV0dXJuIDA7CkBAIC0yNDgsNyArMjQ3LDcgQEAKIAl1bnNpZ25lZCBsb25nIHBmbjsKIAlpbnQgZmFpbCA9IDA7CiAKLQlpZiAobWVtX2Nncm91cF9zdWJzeXMuZGlzYWJsZWQpCisJaWYgKG1lbV9jZ3JvdXBfZGlzYWJsZWQoKSkKIAkJcmV0dXJuOwogCiAJZm9yIChwZm4gPSAwOyAhZmFpbCAmJiBwZm4gPCBtYXhfcGZuOyBwZm4gKz0gUEFHRVNfUEVSX1NFQ1RJT04pIHsKQEAgLTI3MywzICsyNzIsMTk5IEBACiB9CiAKICNlbmRpZgorCisKKyNpZmRlZiBDT05GSUdfQ0dST1VQX01FTV9SRVNfQ1RMUl9TV0FQCisKK3N0YXRpYyBERUZJTkVfTVVURVgoc3dhcF9jZ3JvdXBfbXV0ZXgpOworc3RydWN0IHN3YXBfY2dyb3VwX2N0cmwgeworCXN0cnVjdCBwYWdlICoqbWFwOworCXVuc2lnbmVkIGxvbmcgbGVuZ3RoOworfTsKKworc3RydWN0IHN3YXBfY2dyb3VwX2N0cmwgc3dhcF9jZ3JvdXBfY3RybFtNQVhfU1dBUEZJTEVTXTsKKworLyoKKyAqIFRoaXMgOGJ5dGVzIHNlZW1zIGJpZy4ubWF5YmUgd2UgY2FuIHJlZHVjZSB0aGlzIHdoZW4gd2UgY2FuIHVzZSAiaWQiIGZvcgorICogY2dyb3VwIHJhdGhlciB0aGFuIHBvaW50ZXIuCisgKi8KK3N0cnVjdCBzd2FwX2Nncm91cCB7CisJc3RydWN0IG1lbV9jZ3JvdXAJKnZhbDsKK307CisjZGVmaW5lIFNDX1BFUl9QQUdFCShQQUdFX1NJWkUvc2l6ZW9mKHN0cnVjdCBzd2FwX2Nncm91cCkpCisjZGVmaW5lIFNDX1BPU19NQVNLCShTQ19QRVJfUEFHRSAtIDEpCisKKy8qCisgKiBTd2FwQ2dyb3VwIGltcGxlbWVudHMgImxvb2t1cCIgYW5kICJleGNoYW5nZSIgb3BlcmF0aW9ucy4KKyAqIEluIHR5cGljYWwgdXNhZ2UsIHRoaXMgc3dhcF9jZ3JvdXAgaXMgYWNjZXNzZWQgdmlhIG1lbWNnJ3MgY2hhcmdlL3VuY2hhcmdlCisgKiBhZ2FpbnN0IFN3YXBDYWNoZS4gQXQgc3dhcF9mcmVlKCksIHRoaXMgaXMgYWNjZXNzZWQgZGlyZWN0bHkgZnJvbSBzd2FwLgorICoKKyAqIFRoaXMgbWVhbnMsCisgKiAgLSB3ZSBoYXZlIG5vIHJhY2UgaW4gImV4Y2hhbmdlIiB3aGVuIHdlJ3JlIGFjY2Vzc2VkIHZpYSBTd2FwQ2FjaGUgYmVjYXVzZQorICogICAgU3dhcENhY2hlKGFuZCBpdHMgc3dwX2VudHJ5KSBpcyB1bmRlciBsb2NrLgorICogIC0gV2hlbiBjYWxsZWQgdmlhIHN3YXBfZnJlZSgpLCB0aGVyZSBpcyBubyB1c2VyIG9mIHRoaXMgZW50cnkgYW5kIG5vIHJhY2UuCisgKiBUaGVuLCB3ZSBkb24ndCBuZWVkIGxvY2sgYXJvdW5kICJleGNoYW5nZSIuCisgKgorICogVE9ETzogd2UgY2FuIHB1c2ggdGhlc2UgYnVmZmVycyBvdXQgdG8gSElHSE1FTS4KKyAqLworCisvKgorICogYWxsb2NhdGUgYnVmZmVyIGZvciBzd2FwX2Nncm91cC4KKyAqLworc3RhdGljIGludCBzd2FwX2Nncm91cF9wcmVwYXJlKGludCB0eXBlKQoreworCXN0cnVjdCBwYWdlICpwYWdlOworCXN0cnVjdCBzd2FwX2Nncm91cF9jdHJsICpjdHJsOworCXVuc2lnbmVkIGxvbmcgaWR4LCBtYXg7CisKKwlpZiAoIWRvX3N3YXBfYWNjb3VudCkKKwkJcmV0dXJuIDA7CisJY3RybCA9ICZzd2FwX2Nncm91cF9jdHJsW3R5cGVdOworCisJZm9yIChpZHggPSAwOyBpZHggPCBjdHJsLT5sZW5ndGg7IGlkeCsrKSB7CisJCXBhZ2UgPSBhbGxvY19wYWdlKEdGUF9LRVJORUwgfCBfX0dGUF9aRVJPKTsKKwkJaWYgKCFwYWdlKQorCQkJZ290byBub3RfZW5vdWdoX3BhZ2U7CisJCWN0cmwtPm1hcFtpZHhdID0gcGFnZTsKKwl9CisJcmV0dXJuIDA7Citub3RfZW5vdWdoX3BhZ2U6CisJbWF4ID0gaWR4OworCWZvciAoaWR4ID0gMDsgaWR4IDwgbWF4OyBpZHgrKykKKwkJX19mcmVlX3BhZ2UoY3RybC0+bWFwW2lkeF0pOworCisJcmV0dXJuIC1FTk9NRU07Cit9CisKKy8qKgorICogc3dhcF9jZ3JvdXBfcmVjb3JkIC0gcmVjb3JkIG1lbV9jZ3JvdXAgZm9yIHRoaXMgc3dwX2VudHJ5LgorICogQGVudDogc3dhcCBlbnRyeSB0byBiZSByZWNvcmRlZCBpbnRvCisgKiBAbWVtOiBtZW1fY2dyb3VwIHRvIGJlIHJlY29yZGVkCisgKgorICogUmV0dXJucyBvbGQgdmFsdWUgYXQgc3VjY2VzcywgTlVMTCBhdCBmYWlsdXJlLgorICogKE9mIGNvdXJzZSwgb2xkIHZhbHVlIGNhbiBiZSBOVUxMLikKKyAqLworc3RydWN0IG1lbV9jZ3JvdXAgKnN3YXBfY2dyb3VwX3JlY29yZChzd3BfZW50cnlfdCBlbnQsIHN0cnVjdCBtZW1fY2dyb3VwICptZW0pCit7CisJaW50IHR5cGUgPSBzd3BfdHlwZShlbnQpOworCXVuc2lnbmVkIGxvbmcgb2Zmc2V0ID0gc3dwX29mZnNldChlbnQpOworCXVuc2lnbmVkIGxvbmcgaWR4ID0gb2Zmc2V0IC8gU0NfUEVSX1BBR0U7CisJdW5zaWduZWQgbG9uZyBwb3MgPSBvZmZzZXQgJiBTQ19QT1NfTUFTSzsKKwlzdHJ1Y3Qgc3dhcF9jZ3JvdXBfY3RybCAqY3RybDsKKwlzdHJ1Y3QgcGFnZSAqbWFwcGFnZTsKKwlzdHJ1Y3Qgc3dhcF9jZ3JvdXAgKnNjOworCXN0cnVjdCBtZW1fY2dyb3VwICpvbGQ7CisKKwlpZiAoIWRvX3N3YXBfYWNjb3VudCkKKwkJcmV0dXJuIE5VTEw7CisKKwljdHJsID0gJnN3YXBfY2dyb3VwX2N0cmxbdHlwZV07CisKKwltYXBwYWdlID0gY3RybC0+bWFwW2lkeF07CisJc2MgPSBwYWdlX2FkZHJlc3MobWFwcGFnZSk7CisJc2MgKz0gcG9zOworCW9sZCA9IHNjLT52YWw7CisJc2MtPnZhbCA9IG1lbTsKKworCXJldHVybiBvbGQ7Cit9CisKKy8qKgorICogbG9va3VwX3N3YXBfY2dyb3VwIC0gbG9va3VwIG1lbV9jZ3JvdXAgdGllZCB0byBzd2FwIGVudHJ5CisgKiBAZW50OiBzd2FwIGVudHJ5IHRvIGJlIGxvb2tlZCB1cC4KKyAqCisgKiBSZXR1cm5zIHBvaW50ZXIgdG8gbWVtX2Nncm91cCBhdCBzdWNjZXNzLiBOVUxMIGF0IGZhaWx1cmUuCisgKi8KK3N0cnVjdCBtZW1fY2dyb3VwICpsb29rdXBfc3dhcF9jZ3JvdXAoc3dwX2VudHJ5X3QgZW50KQoreworCWludCB0eXBlID0gc3dwX3R5cGUoZW50KTsKKwl1bnNpZ25lZCBsb25nIG9mZnNldCA9IHN3cF9vZmZzZXQoZW50KTsKKwl1bnNpZ25lZCBsb25nIGlkeCA9IG9mZnNldCAvIFNDX1BFUl9QQUdFOworCXVuc2lnbmVkIGxvbmcgcG9zID0gb2Zmc2V0ICYgU0NfUE9TX01BU0s7CisJc3RydWN0IHN3YXBfY2dyb3VwX2N0cmwgKmN0cmw7CisJc3RydWN0IHBhZ2UgKm1hcHBhZ2U7CisJc3RydWN0IHN3YXBfY2dyb3VwICpzYzsKKwlzdHJ1Y3QgbWVtX2Nncm91cCAqcmV0OworCisJaWYgKCFkb19zd2FwX2FjY291bnQpCisJCXJldHVybiBOVUxMOworCisJY3RybCA9ICZzd2FwX2Nncm91cF9jdHJsW3R5cGVdOworCW1hcHBhZ2UgPSBjdHJsLT5tYXBbaWR4XTsKKwlzYyA9IHBhZ2VfYWRkcmVzcyhtYXBwYWdlKTsKKwlzYyArPSBwb3M7CisJcmV0ID0gc2MtPnZhbDsKKwlyZXR1cm4gcmV0OworfQorCitpbnQgc3dhcF9jZ3JvdXBfc3dhcG9uKGludCB0eXBlLCB1bnNpZ25lZCBsb25nIG1heF9wYWdlcykKK3sKKwl2b2lkICphcnJheTsKKwl1bnNpZ25lZCBsb25nIGFycmF5X3NpemU7CisJdW5zaWduZWQgbG9uZyBsZW5ndGg7CisJc3RydWN0IHN3YXBfY2dyb3VwX2N0cmwgKmN0cmw7CisKKwlpZiAoIWRvX3N3YXBfYWNjb3VudCkKKwkJcmV0dXJuIDA7CisKKwlsZW5ndGggPSAoKG1heF9wYWdlcy9TQ19QRVJfUEFHRSkgKyAxKTsKKwlhcnJheV9zaXplID0gbGVuZ3RoICogc2l6ZW9mKHZvaWQgKik7CisKKwlhcnJheSA9IHZtYWxsb2MoYXJyYXlfc2l6ZSk7CisJaWYgKCFhcnJheSkKKwkJZ290byBub21lbTsKKworCW1lbXNldChhcnJheSwgMCwgYXJyYXlfc2l6ZSk7CisJY3RybCA9ICZzd2FwX2Nncm91cF9jdHJsW3R5cGVdOworCW11dGV4X2xvY2soJnN3YXBfY2dyb3VwX211dGV4KTsKKwljdHJsLT5sZW5ndGggPSBsZW5ndGg7CisJY3RybC0+bWFwID0gYXJyYXk7CisJaWYgKHN3YXBfY2dyb3VwX3ByZXBhcmUodHlwZSkpIHsKKwkJLyogbWVtb3J5IHNob3J0YWdlICovCisJCWN0cmwtPm1hcCA9IE5VTEw7CisJCWN0cmwtPmxlbmd0aCA9IDA7CisJCXZmcmVlKGFycmF5KTsKKwkJbXV0ZXhfdW5sb2NrKCZzd2FwX2Nncm91cF9tdXRleCk7CisJCWdvdG8gbm9tZW07CisJfQorCW11dGV4X3VubG9jaygmc3dhcF9jZ3JvdXBfbXV0ZXgpOworCisJcHJpbnRrKEtFUk5fSU5GTworCQkic3dhcF9jZ3JvdXA6IHVzZXMgJWxkIGJ5dGVzIG9mIHZtYWxsb2MgZm9yIHBvaW50ZXIgYXJyYXkgc3BhY2UiCisJCSIgYW5kICVsZCBieXRlcyB0byBob2xkIG1lbV9jZ3JvdXAgcG9pbnRlcnMgb24gc3dhcFxuIiwKKwkJYXJyYXlfc2l6ZSwgbGVuZ3RoICogUEFHRV9TSVpFKTsKKwlwcmludGsoS0VSTl9JTkZPCisJInN3YXBfY2dyb3VwIGNhbiBiZSBkaXNhYmxlZCBieSBub3N3YXBhY2NvdW50IGJvb3Qgb3B0aW9uLlxuIik7CisKKwlyZXR1cm4gMDsKK25vbWVtOgorCXByaW50ayhLRVJOX0lORk8gImNvdWxkbid0IGFsbG9jYXRlIGVub3VnaCBtZW1vcnkgZm9yIHN3YXBfY2dyb3VwLlxuIik7CisJcHJpbnRrKEtFUk5fSU5GTworCQkic3dhcF9jZ3JvdXAgY2FuIGJlIGRpc2FibGVkIGJ5IG5vc3dhcGFjY291bnQgYm9vdCBvcHRpb25cbiIpOworCXJldHVybiAtRU5PTUVNOworfQorCit2b2lkIHN3YXBfY2dyb3VwX3N3YXBvZmYoaW50IHR5cGUpCit7CisJaW50IGk7CisJc3RydWN0IHN3YXBfY2dyb3VwX2N0cmwgKmN0cmw7CisKKwlpZiAoIWRvX3N3YXBfYWNjb3VudCkKKwkJcmV0dXJuOworCisJbXV0ZXhfbG9jaygmc3dhcF9jZ3JvdXBfbXV0ZXgpOworCWN0cmwgPSAmc3dhcF9jZ3JvdXBfY3RybFt0eXBlXTsKKwlpZiAoY3RybC0+bWFwKSB7CisJCWZvciAoaSA9IDA7IGkgPCBjdHJsLT5sZW5ndGg7IGkrKykgeworCQkJc3RydWN0IHBhZ2UgKnBhZ2UgPSBjdHJsLT5tYXBbaV07CisJCQlpZiAocGFnZSkKKwkJCQlfX2ZyZWVfcGFnZShwYWdlKTsKKwkJfQorCQl2ZnJlZShjdHJsLT5tYXApOworCQljdHJsLT5tYXAgPSBOVUxMOworCQljdHJsLT5sZW5ndGggPSAwOworCX0KKwltdXRleF91bmxvY2soJnN3YXBfY2dyb3VwX211dGV4KTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9tbS9zaG1lbS5jIGIvbW0vc2htZW0uYwppbmRleCA1OTQxZjk4Li41ZDBkZTk2IDEwMDY0NAotLS0gYS9tbS9zaG1lbS5jCisrKyBiL21tL3NobWVtLmMKQEAgLTkyOCw3ICs5MjgsMTEgQEAKIAllcnJvciA9IDE7CiAJaWYgKCFpbm9kZSkKIAkJZ290byBvdXQ7Ci0JLyogUHJlY2hhcmdlIHBhZ2UgdXNpbmcgR0ZQX0tFUk5FTCB3aGlsZSB3ZSBjYW4gd2FpdCAqLworCS8qCisJICogQ2hhcmdlIHBhZ2UgdXNpbmcgR0ZQX0tFUk5FTCB3aGlsZSB3ZSBjYW4gd2FpdC4KKwkgKiBDaGFyZ2VkIGJhY2sgdG8gdGhlIHVzZXIobm90IHRvIGNhbGxlcikgd2hlbiBzd2FwIGFjY291bnQgaXMgdXNlZC4KKwkgKiBhZGRfdG9fcGFnZV9jYWNoZSgpIHdpbGwgYmUgY2FsbGVkIHdpdGggR0ZQX05PV0FJVC4KKwkgKi8KIAllcnJvciA9IG1lbV9jZ3JvdXBfY2FjaGVfY2hhcmdlKHBhZ2UsIGN1cnJlbnQtPm1tLCBHRlBfS0VSTkVMKTsKIAlpZiAoZXJyb3IpCiAJCWdvdG8gb3V0OwpAQCAtMTMyMCwxNSArMTMyNCwxOSBAQAogCQl9IGVsc2UgewogCQkJc2htZW1fc3dwX3VubWFwKGVudHJ5KTsKIAkJCXNwaW5fdW5sb2NrKCZpbmZvLT5sb2NrKTsKLQkJCXVubG9ja19wYWdlKHN3YXBwYWdlKTsKLQkJCXBhZ2VfY2FjaGVfcmVsZWFzZShzd2FwcGFnZSk7CiAJCQlpZiAoZXJyb3IgPT0gLUVOT01FTSkgewogCQkJCS8qIGFsbG93IHJlY2xhaW0gZnJvbSB0aGlzIG1lbW9yeSBjZ3JvdXAgKi8KLQkJCQllcnJvciA9IG1lbV9jZ3JvdXBfc2hyaW5rX3VzYWdlKGN1cnJlbnQtPm1tLAorCQkJCWVycm9yID0gbWVtX2Nncm91cF9zaHJpbmtfdXNhZ2Uoc3dhcHBhZ2UsCisJCQkJCQkJCWN1cnJlbnQtPm1tLAogCQkJCQkJCQlnZnApOwotCQkJCWlmIChlcnJvcikKKwkJCQlpZiAoZXJyb3IpIHsKKwkJCQkJdW5sb2NrX3BhZ2Uoc3dhcHBhZ2UpOworCQkJCQlwYWdlX2NhY2hlX3JlbGVhc2Uoc3dhcHBhZ2UpOwogCQkJCQlnb3RvIGZhaWxlZDsKKwkJCQl9CiAJCQl9CisJCQl1bmxvY2tfcGFnZShzd2FwcGFnZSk7CisJCQlwYWdlX2NhY2hlX3JlbGVhc2Uoc3dhcHBhZ2UpOwogCQkJZ290byByZXBlYXQ7CiAJCX0KIAl9IGVsc2UgaWYgKHNncCA9PSBTR1BfUkVBRCAmJiAhZmlsZXBhZ2UpIHsKQEAgLTEzNzksNyArMTM4Nyw3IEBACiAKIAkJCS8qIFByZWNoYXJnZSBwYWdlIHdoaWxlIHdlIGNhbiB3YWl0LCBjb21wZW5zYXRlIGFmdGVyICovCiAJCQllcnJvciA9IG1lbV9jZ3JvdXBfY2FjaGVfY2hhcmdlKGZpbGVwYWdlLCBjdXJyZW50LT5tbSwKLQkJCQkJCQlnZnAgJiB+X19HRlBfSElHSE1FTSk7CisJCQkJCUdGUF9LRVJORUwpOwogCQkJaWYgKGVycm9yKSB7CiAJCQkJcGFnZV9jYWNoZV9yZWxlYXNlKGZpbGVwYWdlKTsKIAkJCQlzaG1lbV91bmFjY3RfYmxvY2tzKGluZm8tPmZsYWdzLCAxKTsKZGlmZiAtLWdpdCBhL21tL3NsdWIuYyBiL21tL3NsdWIuYwppbmRleCBmMGUyODkyLi42MzkyYWU1IDEwMDY0NAotLS0gYS9tbS9zbHViLmMKKysrIGIvbW0vc2x1Yi5jCkBAIC0yMjU0LDcgKzIyNTQsNyBAQAogCQkgKiBBZGQgc29tZSBlbXB0eSBwYWRkaW5nIHNvIHRoYXQgd2UgY2FuIGNhdGNoCiAJCSAqIG92ZXJ3cml0ZXMgZnJvbSBlYXJsaWVyIG9iamVjdHMgcmF0aGVyIHRoYW4gbGV0CiAJCSAqIHRyYWNraW5nIGluZm9ybWF0aW9uIG9yIHRoZSBmcmVlIHBvaW50ZXIgYmUKLQkJICogY29ycnVwdGVkIGlmIGFuIHVzZXIgd3JpdGVzIGJlZm9yZSB0aGUgc3RhcnQKKwkJICogY29ycnVwdGVkIGlmIGEgdXNlciB3cml0ZXMgYmVmb3JlIHRoZSBzdGFydAogCQkgKiBvZiB0aGUgb2JqZWN0LgogCQkgKi8KIAkJc2l6ZSArPSBzaXplb2Yodm9pZCAqKTsKZGlmZiAtLWdpdCBhL21tL3N3YXAuYyBiL21tL3N3YXAuYwppbmRleCBiYTJjMGU4Li44YWRiOWZlIDEwMDY0NAotLS0gYS9tbS9zd2FwLmMKKysrIGIvbW0vc3dhcC5jCkBAIC0xNTEsNiArMTUxLDI2IEBACiAJfQogfQogCitzdGF0aWMgdm9pZCB1cGRhdGVfcGFnZV9yZWNsYWltX3N0YXQoc3RydWN0IHpvbmUgKnpvbmUsIHN0cnVjdCBwYWdlICpwYWdlLAorCQkJCSAgICAgaW50IGZpbGUsIGludCByb3RhdGVkKQoreworCXN0cnVjdCB6b25lX3JlY2xhaW1fc3RhdCAqcmVjbGFpbV9zdGF0ID0gJnpvbmUtPnJlY2xhaW1fc3RhdDsKKwlzdHJ1Y3Qgem9uZV9yZWNsYWltX3N0YXQgKm1lbWNnX3JlY2xhaW1fc3RhdDsKKworCW1lbWNnX3JlY2xhaW1fc3RhdCA9IG1lbV9jZ3JvdXBfZ2V0X3JlY2xhaW1fc3RhdF9mcm9tX3BhZ2UocGFnZSk7CisKKwlyZWNsYWltX3N0YXQtPnJlY2VudF9zY2FubmVkW2ZpbGVdKys7CisJaWYgKHJvdGF0ZWQpCisJCXJlY2xhaW1fc3RhdC0+cmVjZW50X3JvdGF0ZWRbZmlsZV0rKzsKKworCWlmICghbWVtY2dfcmVjbGFpbV9zdGF0KQorCQlyZXR1cm47CisKKwltZW1jZ19yZWNsYWltX3N0YXQtPnJlY2VudF9zY2FubmVkW2ZpbGVdKys7CisJaWYgKHJvdGF0ZWQpCisJCW1lbWNnX3JlY2xhaW1fc3RhdC0+cmVjZW50X3JvdGF0ZWRbZmlsZV0rKzsKK30KKwogLyoKICAqIEZJWE1FOiBzcGVlZCB0aGlzIHVwPwogICovCkBAIC0xNjgsMTAgKzE4OCw4IEBACiAJCWxydSArPSBMUlVfQUNUSVZFOwogCQlhZGRfcGFnZV90b19scnVfbGlzdCh6b25lLCBwYWdlLCBscnUpOwogCQlfX2NvdW50X3ZtX2V2ZW50KFBHQUNUSVZBVEUpOwotCQltZW1fY2dyb3VwX21vdmVfbGlzdHMocGFnZSwgbHJ1KTsKIAotCQl6b25lLT5yZWNlbnRfcm90YXRlZFshIWZpbGVdKys7Ci0JCXpvbmUtPnJlY2VudF9zY2FubmVkWyEhZmlsZV0rKzsKKwkJdXBkYXRlX3BhZ2VfcmVjbGFpbV9zdGF0KHpvbmUsIHBhZ2UsICEhZmlsZSwgMSk7CiAJfQogCXNwaW5fdW5sb2NrX2lycSgmem9uZS0+bHJ1X2xvY2spOwogfQpAQCAtMzg2LDEyICs0MDQsMTQgQEAKIHsKIAlpbnQgaTsKIAlzdHJ1Y3Qgem9uZSAqem9uZSA9IE5VTEw7CisKIAlWTV9CVUdfT04oaXNfdW5ldmljdGFibGVfbHJ1KGxydSkpOwogCiAJZm9yIChpID0gMDsgaSA8IHBhZ2V2ZWNfY291bnQocHZlYyk7IGkrKykgewogCQlzdHJ1Y3QgcGFnZSAqcGFnZSA9IHB2ZWMtPnBhZ2VzW2ldOwogCQlzdHJ1Y3Qgem9uZSAqcGFnZXpvbmUgPSBwYWdlX3pvbmUocGFnZSk7CiAJCWludCBmaWxlOworCQlpbnQgYWN0aXZlOwogCiAJCWlmIChwYWdlem9uZSAhPSB6b25lKSB7CiAJCQlpZiAoem9uZSkKQEAgLTQwMywxMiArNDIzLDExIEBACiAJCVZNX0JVR19PTihQYWdlVW5ldmljdGFibGUocGFnZSkpOwogCQlWTV9CVUdfT04oUGFnZUxSVShwYWdlKSk7CiAJCVNldFBhZ2VMUlUocGFnZSk7CisJCWFjdGl2ZSA9IGlzX2FjdGl2ZV9scnUobHJ1KTsKIAkJZmlsZSA9IGlzX2ZpbGVfbHJ1KGxydSk7Ci0JCXpvbmUtPnJlY2VudF9zY2FubmVkW2ZpbGVdKys7Ci0JCWlmIChpc19hY3RpdmVfbHJ1KGxydSkpIHsKKwkJaWYgKGFjdGl2ZSkKIAkJCVNldFBhZ2VBY3RpdmUocGFnZSk7Ci0JCQl6b25lLT5yZWNlbnRfcm90YXRlZFtmaWxlXSsrOwotCQl9CisJCXVwZGF0ZV9wYWdlX3JlY2xhaW1fc3RhdCh6b25lLCBwYWdlLCBmaWxlLCBhY3RpdmUpOwogCQlhZGRfcGFnZV90b19scnVfbGlzdCh6b25lLCBwYWdlLCBscnUpOwogCX0KIAlpZiAoem9uZSkKZGlmZiAtLWdpdCBhL21tL3N3YXBfc3RhdGUuYyBiL21tL3N3YXBfc3RhdGUuYwppbmRleCA4MWM4MjVmLi4zZWNlYTk4IDEwMDY0NAotLS0gYS9tbS9zd2FwX3N0YXRlLmMKKysrIGIvbW0vc3dhcF9zdGF0ZS5jCkBAIC0xNyw2ICsxNyw3IEBACiAjaW5jbHVkZSA8bGludXgvYmFja2luZy1kZXYuaD4KICNpbmNsdWRlIDxsaW51eC9wYWdldmVjLmg+CiAjaW5jbHVkZSA8bGludXgvbWlncmF0ZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BhZ2VfY2dyb3VwLmg+CiAKICNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgogCkBAIC0xMDgsNiArMTA5LDggQEAKICAqLwogdm9pZCBfX2RlbGV0ZV9mcm9tX3N3YXBfY2FjaGUoc3RydWN0IHBhZ2UgKnBhZ2UpCiB7CisJc3dwX2VudHJ5X3QgZW50ID0gey52YWwgPSBwYWdlX3ByaXZhdGUocGFnZSl9OworCiAJVk1fQlVHX09OKCFQYWdlTG9ja2VkKHBhZ2UpKTsKIAlWTV9CVUdfT04oIVBhZ2VTd2FwQ2FjaGUocGFnZSkpOwogCVZNX0JVR19PTihQYWdlV3JpdGViYWNrKHBhZ2UpKTsKQEAgLTExOCw2ICsxMjEsNyBAQAogCXRvdGFsX3N3YXBjYWNoZV9wYWdlcy0tOwogCV9fZGVjX3pvbmVfcGFnZV9zdGF0ZShwYWdlLCBOUl9GSUxFX1BBR0VTKTsKIAlJTkNfQ0FDSEVfSU5GTyhkZWxfdG90YWwpOworCW1lbV9jZ3JvdXBfdW5jaGFyZ2Vfc3dhcGNhY2hlKHBhZ2UsIGVudCk7CiB9CiAKIC8qKgpkaWZmIC0tZ2l0IGEvbW0vc3dhcGZpbGUuYyBiL21tL3N3YXBmaWxlLmMKaW5kZXggZWVjNWNhNy4uZjQ4YjgzMSAxMDA2NDQKLS0tIGEvbW0vc3dhcGZpbGUuYworKysgYi9tbS9zd2FwZmlsZS5jCkBAIC0zMyw2ICszMyw3IEBACiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KICNpbmNsdWRlIDxhc20vdGxiZmx1c2guaD4KICNpbmNsdWRlIDxsaW51eC9zd2Fwb3BzLmg+CisjaW5jbHVkZSA8bGludXgvcGFnZV9jZ3JvdXAuaD4KIAogc3RhdGljIERFRklORV9TUElOTE9DSyhzd2FwX2xvY2spOwogc3RhdGljIHVuc2lnbmVkIGludCBucl9zd2FwZmlsZXM7CkBAIC00NzAsOCArNDcxLDkgQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAotc3RhdGljIGludCBzd2FwX2VudHJ5X2ZyZWUoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnAsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0KQorc3RhdGljIGludCBzd2FwX2VudHJ5X2ZyZWUoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnAsIHN3cF9lbnRyeV90IGVudCkKIHsKKwl1bnNpZ25lZCBsb25nIG9mZnNldCA9IHN3cF9vZmZzZXQoZW50KTsKIAlpbnQgY291bnQgPSBwLT5zd2FwX21hcFtvZmZzZXRdOwogCiAJaWYgKGNvdW50IDwgU1dBUF9NQVBfTUFYKSB7CkBAIC00ODYsNiArNDg4LDcgQEAKIAkJCQlzd2FwX2xpc3QubmV4dCA9IHAgLSBzd2FwX2luZm87CiAJCQlucl9zd2FwX3BhZ2VzKys7CiAJCQlwLT5pbnVzZV9wYWdlcy0tOworCQkJbWVtX2Nncm91cF91bmNoYXJnZV9zd2FwKGVudCk7CiAJCX0KIAl9CiAJcmV0dXJuIGNvdW50OwpAQCAtNTAxLDcgKzUwNCw3IEBACiAKIAlwID0gc3dhcF9pbmZvX2dldChlbnRyeSk7CiAJaWYgKHApIHsKLQkJc3dhcF9lbnRyeV9mcmVlKHAsIHN3cF9vZmZzZXQoZW50cnkpKTsKKwkJc3dhcF9lbnRyeV9mcmVlKHAsIGVudHJ5KTsKIAkJc3Bpbl91bmxvY2soJnN3YXBfbG9jayk7CiAJfQogfQpAQCAtNTgxLDcgKzU4NCw3IEBACiAKIAlwID0gc3dhcF9pbmZvX2dldChlbnRyeSk7CiAJaWYgKHApIHsKLQkJaWYgKHN3YXBfZW50cnlfZnJlZShwLCBzd3Bfb2Zmc2V0KGVudHJ5KSkgPT0gMSkgeworCQlpZiAoc3dhcF9lbnRyeV9mcmVlKHAsIGVudHJ5KSA9PSAxKSB7CiAJCQlwYWdlID0gZmluZF9nZXRfcGFnZSgmc3dhcHBlcl9zcGFjZSwgZW50cnkudmFsKTsKIAkJCWlmIChwYWdlICYmICF0cnlsb2NrX3BhZ2UocGFnZSkpIHsKIAkJCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CkBAIC02OTAsMTcgKzY5MywxOCBAQAogc3RhdGljIGludCB1bnVzZV9wdGUoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHBtZF90ICpwbWQsCiAJCXVuc2lnbmVkIGxvbmcgYWRkciwgc3dwX2VudHJ5X3QgZW50cnksIHN0cnVjdCBwYWdlICpwYWdlKQogeworCXN0cnVjdCBtZW1fY2dyb3VwICpwdHIgPSBOVUxMOwogCXNwaW5sb2NrX3QgKnB0bDsKIAlwdGVfdCAqcHRlOwogCWludCByZXQgPSAxOwogCi0JaWYgKG1lbV9jZ3JvdXBfY2hhcmdlKHBhZ2UsIHZtYS0+dm1fbW0sIEdGUF9LRVJORUwpKQorCWlmIChtZW1fY2dyb3VwX3RyeV9jaGFyZ2Vfc3dhcGluKHZtYS0+dm1fbW0sIHBhZ2UsIEdGUF9LRVJORUwsICZwdHIpKQogCQlyZXQgPSAtRU5PTUVNOwogCiAJcHRlID0gcHRlX29mZnNldF9tYXBfbG9jayh2bWEtPnZtX21tLCBwbWQsIGFkZHIsICZwdGwpOwogCWlmICh1bmxpa2VseSghcHRlX3NhbWUoKnB0ZSwgc3dwX2VudHJ5X3RvX3B0ZShlbnRyeSkpKSkgewogCQlpZiAocmV0ID4gMCkKLQkJCW1lbV9jZ3JvdXBfdW5jaGFyZ2VfcGFnZShwYWdlKTsKKwkJCW1lbV9jZ3JvdXBfY2FuY2VsX2NoYXJnZV9zd2FwaW4ocHRyKTsKIAkJcmV0ID0gMDsKIAkJZ290byBvdXQ7CiAJfQpAQCAtNzEwLDYgKzcxNCw3IEBACiAJc2V0X3B0ZV9hdCh2bWEtPnZtX21tLCBhZGRyLCBwdGUsCiAJCSAgIHB0ZV9ta29sZChta19wdGUocGFnZSwgdm1hLT52bV9wYWdlX3Byb3QpKSk7CiAJcGFnZV9hZGRfYW5vbl9ybWFwKHBhZ2UsIHZtYSwgYWRkcik7CisJbWVtX2Nncm91cF9jb21taXRfY2hhcmdlX3N3YXBpbihwYWdlLCBwdHIpOwogCXN3YXBfZnJlZShlbnRyeSk7CiAJLyoKIAkgKiBNb3ZlIHRoZSBwYWdlIHRvIHRoZSBhY3RpdmUgbGlzdCBzbyBpdCBpcyBub3QKQEAgLTEzNzIsNyArMTM3Nyw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotYXNtbGlua2FnZSBsb25nIHN5c19zd2Fwb2ZmKGNvbnN0IGNoYXIgX191c2VyICogc3BlY2lhbGZpbGUpCitTWVNDQUxMX0RFRklORTEoc3dhcG9mZiwgY29uc3QgY2hhciBfX3VzZXIgKiwgc3BlY2lhbGZpbGUpCiB7CiAJc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKiBwID0gTlVMTDsKIAl1bnNpZ25lZCBzaG9ydCAqc3dhcF9tYXA7CkBAIC0xNDkyLDYgKzE0OTcsOSBAQAogCXNwaW5fdW5sb2NrKCZzd2FwX2xvY2spOwogCW11dGV4X3VubG9jaygmc3dhcG9uX211dGV4KTsKIAl2ZnJlZShzd2FwX21hcCk7CisJLyogRGVzdHJveSBzd2FwIGFjY291bnQgaW5mb3JtYXRpbiAqLworCXN3YXBfY2dyb3VwX3N3YXBvZmYodHlwZSk7CisKIAlpbm9kZSA9IG1hcHBpbmctPmhvc3Q7CiAJaWYgKFNfSVNCTEsoaW5vZGUtPmlfbW9kZSkpIHsKIAkJc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiA9IElfQkRFVihpbm9kZSk7CkBAIC0xNjI1LDcgKzE2MzMsNyBAQAogICoKICAqIFRoZSBzd2Fwb24gc3lzdGVtIGNhbGwKICAqLwotYXNtbGlua2FnZSBsb25nIHN5c19zd2Fwb24oY29uc3QgY2hhciBfX3VzZXIgKiBzcGVjaWFsZmlsZSwgaW50IHN3YXBfZmxhZ3MpCitTWVNDQUxMX0RFRklORTIoc3dhcG9uLCBjb25zdCBjaGFyIF9fdXNlciAqLCBzcGVjaWFsZmlsZSwgaW50LCBzd2FwX2ZsYWdzKQogewogCXN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICogcDsKIAljaGFyICpuYW1lID0gTlVMTDsKQEAgLTE4MDksNiArMTgxNywxMSBAQAogCQl9CiAJCXN3YXBfbWFwW3BhZ2VfbnJdID0gU1dBUF9NQVBfQkFEOwogCX0KKworCWVycm9yID0gc3dhcF9jZ3JvdXBfc3dhcG9uKHR5cGUsIG1heHBhZ2VzKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gYmFkX3N3YXA7CisKIAlucl9nb29kX3BhZ2VzID0gc3dhcF9oZWFkZXItPmluZm8ubGFzdF9wYWdlIC0KIAkJCXN3YXBfaGVhZGVyLT5pbmZvLm5yX2JhZHBhZ2VzIC0KIAkJCTEgLyogaGVhZGVyIHBhZ2UgKi87CkBAIC0xODgwLDYgKzE4OTMsNyBAQAogCQliZF9yZWxlYXNlKGJkZXYpOwogCX0KIAlkZXN0cm95X3N3YXBfZXh0ZW50cyhwKTsKKwlzd2FwX2Nncm91cF9zd2Fwb2ZmKHR5cGUpOwogYmFkX3N3YXBfMjoKIAlzcGluX2xvY2soJnN3YXBfbG9jayk7CiAJcC0+c3dhcF9maWxlID0gTlVMTDsKZGlmZiAtLWdpdCBhL21tL3ZtYWxsb2MuYyBiL21tL3ZtYWxsb2MuYwppbmRleCBjNWRiOWE3Li43NWY0OWQzIDEwMDY0NAotLS0gYS9tbS92bWFsbG9jLmMKKysrIGIvbW0vdm1hbGxvYy5jCkBAIC0xNCw3ICsxNCw2IEBACiAjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgotI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CkBAIC0yNCw2ICsyMyw3IEBACiAjaW5jbHVkZSA8bGludXgvcmJ0cmVlLmg+CiAjaW5jbHVkZSA8bGludXgvcmFkaXgtdHJlZS5oPgogI2luY2x1ZGUgPGxpbnV4L3JjdXBkYXRlLmg+CisjaW5jbHVkZSA8bGludXgvYm9vdG1lbS5oPgogCiAjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CkBAIC00OTUsNyArNDk1LDcgQEAKIHN0YXRpYyB2b2lkIF9fcHVyZ2Vfdm1hcF9hcmVhX2xhenkodW5zaWduZWQgbG9uZyAqc3RhcnQsIHVuc2lnbmVkIGxvbmcgKmVuZCwKIAkJCQkJaW50IHN5bmMsIGludCBmb3JjZV9mbHVzaCkKIHsKLQlzdGF0aWMgREVGSU5FX01VVEVYKHB1cmdlX2xvY2spOworCXN0YXRpYyBERUZJTkVfU1BJTkxPQ0socHVyZ2VfbG9jayk7CiAJTElTVF9IRUFEKHZhbGlzdCk7CiAJc3RydWN0IHZtYXBfYXJlYSAqdmE7CiAJaW50IG5yID0gMDsKQEAgLTUwNiwxMCArNTA2LDEwIEBACiAJICogdGhlIGNhc2UgdGhhdCBpc24ndCBhY3R1YWxseSB1c2VkIGF0IHRoZSBtb21lbnQgYW55d2F5LgogCSAqLwogCWlmICghc3luYyAmJiAhZm9yY2VfZmx1c2gpIHsKLQkJaWYgKCFtdXRleF90cnlsb2NrKCZwdXJnZV9sb2NrKSkKKwkJaWYgKCFzcGluX3RyeWxvY2soJnB1cmdlX2xvY2spKQogCQkJcmV0dXJuOwogCX0gZWxzZQotCQltdXRleF9sb2NrKCZwdXJnZV9sb2NrKTsKKwkJc3Bpbl9sb2NrKCZwdXJnZV9sb2NrKTsKIAogCXJjdV9yZWFkX2xvY2soKTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdSh2YSwgJnZtYXBfYXJlYV9saXN0LCBsaXN0KSB7CkBAIC01NDEsNyArNTQxLDcgQEAKIAkJCV9fZnJlZV92bWFwX2FyZWEodmEpOwogCQlzcGluX3VubG9jaygmdm1hcF9hcmVhX2xvY2spOwogCX0KLQltdXRleF91bmxvY2soJnB1cmdlX2xvY2spOworCXNwaW5fdW5sb2NrKCZwdXJnZV9sb2NrKTsKIH0KIAogLyoKQEAgLTk4NCw2ICs5ODQsOCBAQAogCiB2b2lkIF9faW5pdCB2bWFsbG9jX2luaXQodm9pZCkKIHsKKwlzdHJ1Y3Qgdm1hcF9hcmVhICp2YTsKKwlzdHJ1Y3Qgdm1fc3RydWN0ICp0bXA7CiAJaW50IGk7CiAKIAlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoaSkgewpAQCAtOTk2LDYgKzk5OCwxNCBAQAogCQl2YnEtPm5yX2RpcnR5ID0gMDsKIAl9CiAKKwkvKiBJbXBvcnQgZXhpc3Rpbmcgdm1saXN0IGVudHJpZXMuICovCisJZm9yICh0bXAgPSB2bWxpc3Q7IHRtcDsgdG1wID0gdG1wLT5uZXh0KSB7CisJCXZhID0gYWxsb2NfYm9vdG1lbShzaXplb2Yoc3RydWN0IHZtYXBfYXJlYSkpOworCQl2YS0+ZmxhZ3MgPSB0bXAtPmZsYWdzIHwgVk1fVk1fQVJFQTsKKwkJdmEtPnZhX3N0YXJ0ID0gKHVuc2lnbmVkIGxvbmcpdG1wLT5hZGRyOworCQl2YS0+dmFfZW5kID0gdmEtPnZhX3N0YXJ0ICsgdG1wLT5zaXplOworCQlfX2luc2VydF92bWFwX2FyZWEodmEpOworCX0KIAl2bWFwX2luaXRpYWxpemVkID0gdHJ1ZTsKIH0KIApkaWZmIC0tZ2l0IGEvbW0vdm1zY2FuLmMgYi9tbS92bXNjYW4uYwppbmRleCBiMDdjNDhiLi45YTI3YzQ0IDEwMDY0NAotLS0gYS9tbS92bXNjYW4uYworKysgYi9tbS92bXNjYW4uYwpAQCAtMTI1LDExICsxMjUsMzAgQEAKIHN0YXRpYyBERUNMQVJFX1JXU0VNKHNocmlua2VyX3J3c2VtKTsKIAogI2lmZGVmIENPTkZJR19DR1JPVVBfTUVNX1JFU19DVExSCi0jZGVmaW5lIHNjYW5fZ2xvYmFsX2xydShzYykJKCEoc2MpLT5tZW1fY2dyb3VwKQorI2RlZmluZSBzY2FubmluZ19nbG9iYWxfbHJ1KHNjKQkoIShzYyktPm1lbV9jZ3JvdXApCiAjZWxzZQotI2RlZmluZSBzY2FuX2dsb2JhbF9scnUoc2MpCSgxKQorI2RlZmluZSBzY2FubmluZ19nbG9iYWxfbHJ1KHNjKQkoMSkKICNlbmRpZgogCitzdGF0aWMgc3RydWN0IHpvbmVfcmVjbGFpbV9zdGF0ICpnZXRfcmVjbGFpbV9zdGF0KHN0cnVjdCB6b25lICp6b25lLAorCQkJCQkJICBzdHJ1Y3Qgc2Nhbl9jb250cm9sICpzYykKK3sKKwlpZiAoIXNjYW5uaW5nX2dsb2JhbF9scnUoc2MpKQorCQlyZXR1cm4gbWVtX2Nncm91cF9nZXRfcmVjbGFpbV9zdGF0KHNjLT5tZW1fY2dyb3VwLCB6b25lKTsKKworCXJldHVybiAmem9uZS0+cmVjbGFpbV9zdGF0OworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyB6b25lX25yX3BhZ2VzKHN0cnVjdCB6b25lICp6b25lLCBzdHJ1Y3Qgc2Nhbl9jb250cm9sICpzYywKKwkJCQkgICBlbnVtIGxydV9saXN0IGxydSkKK3sKKwlpZiAoIXNjYW5uaW5nX2dsb2JhbF9scnUoc2MpKQorCQlyZXR1cm4gbWVtX2Nncm91cF96b25lX25yX3BhZ2VzKHNjLT5tZW1fY2dyb3VwLCB6b25lLCBscnUpOworCisJcmV0dXJuIHpvbmVfcGFnZV9zdGF0ZSh6b25lLCBOUl9MUlVfQkFTRSArIGxydSk7Cit9CisKKwogLyoKICAqIEFkZCBhIHNocmlua2VyIGNhbGxiYWNrIHRvIGJlIGNhbGxlZCBmcm9tIHRoZSB2bQogICovCkBAIC01MTIsNyArNTMxLDYgQEAKIAkJbHJ1ID0gTFJVX1VORVZJQ1RBQkxFOwogCQlhZGRfcGFnZV90b191bmV2aWN0YWJsZV9saXN0KHBhZ2UpOwogCX0KLQltZW1fY2dyb3VwX21vdmVfbGlzdHMocGFnZSwgbHJ1KTsKIAogCS8qCiAJICogcGFnZSdzIHN0YXR1cyBjYW4gY2hhbmdlIHdoaWxlIHdlIG1vdmUgaXQgYW1vbmcgbHJ1LiBJZiBhbiBldmljdGFibGUKQEAgLTU0Nyw3ICs1NjUsNiBAQAogCiAJbHJ1ID0gISFUZXN0Q2xlYXJQYWdlQWN0aXZlKHBhZ2UpICsgcGFnZV9pc19maWxlX2NhY2hlKHBhZ2UpOwogCWxydV9jYWNoZV9hZGRfbHJ1KHBhZ2UsIGxydSk7Ci0JbWVtX2Nncm91cF9tb3ZlX2xpc3RzKHBhZ2UsIGxydSk7CiAJcHV0X3BhZ2UocGFnZSk7CiB9CiAjZW5kaWYgLyogQ09ORklHX1VORVZJQ1RBQkxFX0xSVSAqLwpAQCAtODEzLDYgKzgzMCw3IEBACiAJCXJldHVybiByZXQ7CiAKIAlyZXQgPSAtRUJVU1k7CisKIAlpZiAobGlrZWx5KGdldF9wYWdlX3VubGVzc196ZXJvKHBhZ2UpKSkgewogCQkvKgogCQkgKiBCZSBjYXJlZnVsIG5vdCB0byBjbGVhciBQYWdlTFJVIHVudGlsIGFmdGVyIHdlJ3JlCkBAIC04MjEsNiArODM5LDcgQEAKIAkJICovCiAJCUNsZWFyUGFnZUxSVShwYWdlKTsKIAkJcmV0ID0gMDsKKwkJbWVtX2Nncm91cF9kZWxfbHJ1KHBhZ2UpOwogCX0KIAogCXJldHVybiByZXQ7CkBAIC0xMDI5LDYgKzEwNDgsNyBAQAogCXN0cnVjdCBwYWdldmVjIHB2ZWM7CiAJdW5zaWduZWQgbG9uZyBucl9zY2FubmVkID0gMDsKIAl1bnNpZ25lZCBsb25nIG5yX3JlY2xhaW1lZCA9IDA7CisJc3RydWN0IHpvbmVfcmVjbGFpbV9zdGF0ICpyZWNsYWltX3N0YXQgPSBnZXRfcmVjbGFpbV9zdGF0KHpvbmUsIHNjKTsKIAogCXBhZ2V2ZWNfaW5pdCgmcHZlYywgMSk7CiAKQEAgLTEwNzAsMTMgKzEwOTAsMTQgQEAKIAkJX19tb2Rfem9uZV9wYWdlX3N0YXRlKHpvbmUsIE5SX0lOQUNUSVZFX0FOT04sCiAJCQkJCQktY291bnRbTFJVX0lOQUNUSVZFX0FOT05dKTsKIAotCQlpZiAoc2Nhbl9nbG9iYWxfbHJ1KHNjKSkgeworCQlpZiAoc2Nhbm5pbmdfZ2xvYmFsX2xydShzYykpCiAJCQl6b25lLT5wYWdlc19zY2FubmVkICs9IG5yX3NjYW47Ci0JCQl6b25lLT5yZWNlbnRfc2Nhbm5lZFswXSArPSBjb3VudFtMUlVfSU5BQ1RJVkVfQU5PTl07Ci0JCQl6b25lLT5yZWNlbnRfc2Nhbm5lZFswXSArPSBjb3VudFtMUlVfQUNUSVZFX0FOT05dOwotCQkJem9uZS0+cmVjZW50X3NjYW5uZWRbMV0gKz0gY291bnRbTFJVX0lOQUNUSVZFX0ZJTEVdOwotCQkJem9uZS0+cmVjZW50X3NjYW5uZWRbMV0gKz0gY291bnRbTFJVX0FDVElWRV9GSUxFXTsKLQkJfQorCisJCXJlY2xhaW1fc3RhdC0+cmVjZW50X3NjYW5uZWRbMF0gKz0gY291bnRbTFJVX0lOQUNUSVZFX0FOT05dOworCQlyZWNsYWltX3N0YXQtPnJlY2VudF9zY2FubmVkWzBdICs9IGNvdW50W0xSVV9BQ1RJVkVfQU5PTl07CisJCXJlY2xhaW1fc3RhdC0+cmVjZW50X3NjYW5uZWRbMV0gKz0gY291bnRbTFJVX0lOQUNUSVZFX0ZJTEVdOworCQlyZWNsYWltX3N0YXQtPnJlY2VudF9zY2FubmVkWzFdICs9IGNvdW50W0xSVV9BQ1RJVkVfRklMRV07CisKIAkJc3Bpbl91bmxvY2tfaXJxKCZ6b25lLT5scnVfbG9jayk7CiAKIAkJbnJfc2Nhbm5lZCArPSBucl9zY2FuOwpAQCAtMTEwOCw3ICsxMTI5LDcgQEAKIAkJaWYgKGN1cnJlbnRfaXNfa3N3YXBkKCkpIHsKIAkJCV9fY291bnRfem9uZV92bV9ldmVudHMoUEdTQ0FOX0tTV0FQRCwgem9uZSwgbnJfc2Nhbik7CiAJCQlfX2NvdW50X3ZtX2V2ZW50cyhLU1dBUERfU1RFQUwsIG5yX2ZyZWVkKTsKLQkJfSBlbHNlIGlmIChzY2FuX2dsb2JhbF9scnUoc2MpKQorCQl9IGVsc2UgaWYgKHNjYW5uaW5nX2dsb2JhbF9scnUoc2MpKQogCQkJX19jb3VudF96b25lX3ZtX2V2ZW50cyhQR1NDQU5fRElSRUNULCB6b25lLCBucl9zY2FuKTsKIAogCQlfX2NvdW50X3pvbmVfdm1fZXZlbnRzKFBHU1RFQUwsIHpvbmUsIG5yX2ZyZWVkKTsKQEAgLTExMzQsMTAgKzExNTUsOSBAQAogCQkJU2V0UGFnZUxSVShwYWdlKTsKIAkJCWxydSA9IHBhZ2VfbHJ1KHBhZ2UpOwogCQkJYWRkX3BhZ2VfdG9fbHJ1X2xpc3Qoem9uZSwgcGFnZSwgbHJ1KTsKLQkJCW1lbV9jZ3JvdXBfbW92ZV9saXN0cyhwYWdlLCBscnUpOwotCQkJaWYgKFBhZ2VBY3RpdmUocGFnZSkgJiYgc2Nhbl9nbG9iYWxfbHJ1KHNjKSkgeworCQkJaWYgKFBhZ2VBY3RpdmUocGFnZSkpIHsKIAkJCQlpbnQgZmlsZSA9ICEhcGFnZV9pc19maWxlX2NhY2hlKHBhZ2UpOwotCQkJCXpvbmUtPnJlY2VudF9yb3RhdGVkW2ZpbGVdKys7CisJCQkJcmVjbGFpbV9zdGF0LT5yZWNlbnRfcm90YXRlZFtmaWxlXSsrOwogCQkJfQogCQkJaWYgKCFwYWdldmVjX2FkZCgmcHZlYywgcGFnZSkpIHsKIAkJCQlzcGluX3VubG9ja19pcnEoJnpvbmUtPmxydV9sb2NrKTsKQEAgLTExOTcsNiArMTIxNyw3IEBACiAJc3RydWN0IHBhZ2UgKnBhZ2U7CiAJc3RydWN0IHBhZ2V2ZWMgcHZlYzsKIAllbnVtIGxydV9saXN0IGxydTsKKwlzdHJ1Y3Qgem9uZV9yZWNsYWltX3N0YXQgKnJlY2xhaW1fc3RhdCA9IGdldF9yZWNsYWltX3N0YXQoem9uZSwgc2MpOwogCiAJbHJ1X2FkZF9kcmFpbigpOwogCXNwaW5fbG9ja19pcnEoJnpvbmUtPmxydV9sb2NrKTsKQEAgLTEyMDcsMTAgKzEyMjgsMTAgQEAKIAkgKiB6b25lLT5wYWdlc19zY2FubmVkIGlzIHVzZWQgZm9yIGRldGVjdCB6b25lJ3Mgb29tCiAJICogbWVtX2Nncm91cCByZW1lbWJlcnMgbnJfc2NhbiBieSBpdHNlbGYuCiAJICovCi0JaWYgKHNjYW5fZ2xvYmFsX2xydShzYykpIHsKKwlpZiAoc2Nhbm5pbmdfZ2xvYmFsX2xydShzYykpIHsKIAkJem9uZS0+cGFnZXNfc2Nhbm5lZCArPSBwZ3NjYW5uZWQ7Ci0JCXpvbmUtPnJlY2VudF9zY2FubmVkWyEhZmlsZV0gKz0gcGdtb3ZlZDsKIAl9CisJcmVjbGFpbV9zdGF0LT5yZWNlbnRfc2Nhbm5lZFshIWZpbGVdICs9IHBnbW92ZWQ7CiAKIAlpZiAoZmlsZSkKIAkJX19tb2Rfem9uZV9wYWdlX3N0YXRlKHpvbmUsIE5SX0FDVElWRV9GSUxFLCAtcGdtb3ZlZCk7CkBAIC0xMjUxLDggKzEyNzIsNyBAQAogCSAqIFRoaXMgaGVscHMgYmFsYW5jZSBzY2FuIHByZXNzdXJlIGJldHdlZW4gZmlsZSBhbmQgYW5vbnltb3VzCiAJICogcGFnZXMgaW4gZ2V0X3NjYW5fcmF0aW8uCiAJICovCi0JaWYgKHNjYW5fZ2xvYmFsX2xydShzYykpCi0JCXpvbmUtPnJlY2VudF9yb3RhdGVkWyEhZmlsZV0gKz0gcGdtb3ZlZDsKKwlyZWNsYWltX3N0YXQtPnJlY2VudF9yb3RhdGVkWyEhZmlsZV0gKz0gcGdtb3ZlZDsKIAogCXdoaWxlICghbGlzdF9lbXB0eSgmbF9pbmFjdGl2ZSkpIHsKIAkJcGFnZSA9IGxydV90b19wYWdlKCZsX2luYWN0aXZlKTsKQEAgLTEyNjMsNyArMTI4Myw3IEBACiAJCUNsZWFyUGFnZUFjdGl2ZShwYWdlKTsKIAogCQlsaXN0X21vdmUoJnBhZ2UtPmxydSwgJnpvbmUtPmxydVtscnVdLmxpc3QpOwotCQltZW1fY2dyb3VwX21vdmVfbGlzdHMocGFnZSwgbHJ1KTsKKwkJbWVtX2Nncm91cF9hZGRfbHJ1X2xpc3QocGFnZSwgbHJ1KTsKIAkJcGdtb3ZlZCsrOwogCQlpZiAoIXBhZ2V2ZWNfYWRkKCZwdmVjLCBwYWdlKSkgewogCQkJX19tb2Rfem9uZV9wYWdlX3N0YXRlKHpvbmUsIE5SX0xSVV9CQVNFICsgbHJ1LCBwZ21vdmVkKTsKQEAgLTEyOTIsNiArMTMxMiwzOCBAQAogCXBhZ2V2ZWNfcmVsZWFzZSgmcHZlYyk7CiB9CiAKK3N0YXRpYyBpbnQgaW5hY3RpdmVfYW5vbl9pc19sb3dfZ2xvYmFsKHN0cnVjdCB6b25lICp6b25lKQoreworCXVuc2lnbmVkIGxvbmcgYWN0aXZlLCBpbmFjdGl2ZTsKKworCWFjdGl2ZSA9IHpvbmVfcGFnZV9zdGF0ZSh6b25lLCBOUl9BQ1RJVkVfQU5PTik7CisJaW5hY3RpdmUgPSB6b25lX3BhZ2Vfc3RhdGUoem9uZSwgTlJfSU5BQ1RJVkVfQU5PTik7CisKKwlpZiAoaW5hY3RpdmUgKiB6b25lLT5pbmFjdGl2ZV9yYXRpbyA8IGFjdGl2ZSkKKwkJcmV0dXJuIDE7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBpbmFjdGl2ZV9hbm9uX2lzX2xvdyAtIGNoZWNrIGlmIGFub255bW91cyBwYWdlcyBuZWVkIHRvIGJlIGRlYWN0aXZhdGVkCisgKiBAem9uZTogem9uZSB0byBjaGVjaworICogQHNjOiAgIHNjYW4gY29udHJvbCBvZiB0aGlzIGNvbnRleHQKKyAqCisgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHpvbmUgZG9lcyBub3QgaGF2ZSBlbm91Z2ggaW5hY3RpdmUgYW5vbiBwYWdlcywKKyAqIG1lYW5pbmcgc29tZSBhY3RpdmUgYW5vbiBwYWdlcyBuZWVkIHRvIGJlIGRlYWN0aXZhdGVkLgorICovCitzdGF0aWMgaW50IGluYWN0aXZlX2Fub25faXNfbG93KHN0cnVjdCB6b25lICp6b25lLCBzdHJ1Y3Qgc2Nhbl9jb250cm9sICpzYykKK3sKKwlpbnQgbG93OworCisJaWYgKHNjYW5uaW5nX2dsb2JhbF9scnUoc2MpKQorCQlsb3cgPSBpbmFjdGl2ZV9hbm9uX2lzX2xvd19nbG9iYWwoem9uZSk7CisJZWxzZQorCQlsb3cgPSBtZW1fY2dyb3VwX2luYWN0aXZlX2Fub25faXNfbG93KHNjLT5tZW1fY2dyb3VwKTsKKwlyZXR1cm4gbG93OworfQorCiBzdGF0aWMgdW5zaWduZWQgbG9uZyBzaHJpbmtfbGlzdChlbnVtIGxydV9saXN0IGxydSwgdW5zaWduZWQgbG9uZyBucl90b19zY2FuLAogCXN0cnVjdCB6b25lICp6b25lLCBzdHJ1Y3Qgc2Nhbl9jb250cm9sICpzYywgaW50IHByaW9yaXR5KQogewpAQCAtMTMwMiw4ICsxMzU0LDcgQEAKIAkJcmV0dXJuIDA7CiAJfQogCi0JaWYgKGxydSA9PSBMUlVfQUNUSVZFX0FOT04gJiYKLQkgICAgKCFzY2FuX2dsb2JhbF9scnUoc2MpIHx8IGluYWN0aXZlX2Fub25faXNfbG93KHpvbmUpKSkgeworCWlmIChscnUgPT0gTFJVX0FDVElWRV9BTk9OICYmIGluYWN0aXZlX2Fub25faXNfbG93KHpvbmUsIHNjKSkgewogCQlzaHJpbmtfYWN0aXZlX2xpc3QobnJfdG9fc2Nhbiwgem9uZSwgc2MsIHByaW9yaXR5LCBmaWxlKTsKIAkJcmV0dXJuIDA7CiAJfQpAQCAtMTMyNSw2ICsxMzc2LDcgQEAKIAl1bnNpZ25lZCBsb25nIGFub24sIGZpbGUsIGZyZWU7CiAJdW5zaWduZWQgbG9uZyBhbm9uX3ByaW8sIGZpbGVfcHJpbzsKIAl1bnNpZ25lZCBsb25nIGFwLCBmcDsKKwlzdHJ1Y3Qgem9uZV9yZWNsYWltX3N0YXQgKnJlY2xhaW1fc3RhdCA9IGdldF9yZWNsYWltX3N0YXQoem9uZSwgc2MpOwogCiAJLyogSWYgd2UgaGF2ZSBubyBzd2FwIHNwYWNlLCBkbyBub3QgYm90aGVyIHNjYW5uaW5nIGFub24gcGFnZXMuICovCiAJaWYgKG5yX3N3YXBfcGFnZXMgPD0gMCkgewpAQCAtMTMzMywxNyArMTM4NSwyMCBAQAogCQlyZXR1cm47CiAJfQogCi0JYW5vbiAgPSB6b25lX3BhZ2Vfc3RhdGUoem9uZSwgTlJfQUNUSVZFX0FOT04pICsKLQkJem9uZV9wYWdlX3N0YXRlKHpvbmUsIE5SX0lOQUNUSVZFX0FOT04pOwotCWZpbGUgID0gem9uZV9wYWdlX3N0YXRlKHpvbmUsIE5SX0FDVElWRV9GSUxFKSArCi0JCXpvbmVfcGFnZV9zdGF0ZSh6b25lLCBOUl9JTkFDVElWRV9GSUxFKTsKLQlmcmVlICA9IHpvbmVfcGFnZV9zdGF0ZSh6b25lLCBOUl9GUkVFX1BBR0VTKTsKKwlhbm9uICA9IHpvbmVfbnJfcGFnZXMoem9uZSwgc2MsIExSVV9BQ1RJVkVfQU5PTikgKworCQl6b25lX25yX3BhZ2VzKHpvbmUsIHNjLCBMUlVfSU5BQ1RJVkVfQU5PTik7CisJZmlsZSAgPSB6b25lX25yX3BhZ2VzKHpvbmUsIHNjLCBMUlVfQUNUSVZFX0ZJTEUpICsKKwkJem9uZV9ucl9wYWdlcyh6b25lLCBzYywgTFJVX0lOQUNUSVZFX0ZJTEUpOwogCi0JLyogSWYgd2UgaGF2ZSB2ZXJ5IGZldyBwYWdlIGNhY2hlIHBhZ2VzLCBmb3JjZS1zY2FuIGFub24gcGFnZXMuICovCi0JaWYgKHVubGlrZWx5KGZpbGUgKyBmcmVlIDw9IHpvbmUtPnBhZ2VzX2hpZ2gpKSB7Ci0JCXBlcmNlbnRbMF0gPSAxMDA7Ci0JCXBlcmNlbnRbMV0gPSAwOwotCQlyZXR1cm47CisJaWYgKHNjYW5uaW5nX2dsb2JhbF9scnUoc2MpKSB7CisJCWZyZWUgID0gem9uZV9wYWdlX3N0YXRlKHpvbmUsIE5SX0ZSRUVfUEFHRVMpOworCQkvKiBJZiB3ZSBoYXZlIHZlcnkgZmV3IHBhZ2UgY2FjaGUgcGFnZXMsCisJCSAgIGZvcmNlLXNjYW4gYW5vbiBwYWdlcy4gKi8KKwkJaWYgKHVubGlrZWx5KGZpbGUgKyBmcmVlIDw9IHpvbmUtPnBhZ2VzX2hpZ2gpKSB7CisJCQlwZXJjZW50WzBdID0gMTAwOworCQkJcGVyY2VudFsxXSA9IDA7CisJCQlyZXR1cm47CisJCX0KIAl9CiAKIAkvKgpAQCAtMTM1NywxNyArMTQxMiwxNyBAQAogCSAqCiAJICogYW5vbiBpbiBbMF0sIGZpbGUgaW4gWzFdCiAJICovCi0JaWYgKHVubGlrZWx5KHpvbmUtPnJlY2VudF9zY2FubmVkWzBdID4gYW5vbiAvIDQpKSB7CisJaWYgKHVubGlrZWx5KHJlY2xhaW1fc3RhdC0+cmVjZW50X3NjYW5uZWRbMF0gPiBhbm9uIC8gNCkpIHsKIAkJc3Bpbl9sb2NrX2lycSgmem9uZS0+bHJ1X2xvY2spOwotCQl6b25lLT5yZWNlbnRfc2Nhbm5lZFswXSAvPSAyOwotCQl6b25lLT5yZWNlbnRfcm90YXRlZFswXSAvPSAyOworCQlyZWNsYWltX3N0YXQtPnJlY2VudF9zY2FubmVkWzBdIC89IDI7CisJCXJlY2xhaW1fc3RhdC0+cmVjZW50X3JvdGF0ZWRbMF0gLz0gMjsKIAkJc3Bpbl91bmxvY2tfaXJxKCZ6b25lLT5scnVfbG9jayk7CiAJfQogCi0JaWYgKHVubGlrZWx5KHpvbmUtPnJlY2VudF9zY2FubmVkWzFdID4gZmlsZSAvIDQpKSB7CisJaWYgKHVubGlrZWx5KHJlY2xhaW1fc3RhdC0+cmVjZW50X3NjYW5uZWRbMV0gPiBmaWxlIC8gNCkpIHsKIAkJc3Bpbl9sb2NrX2lycSgmem9uZS0+bHJ1X2xvY2spOwotCQl6b25lLT5yZWNlbnRfc2Nhbm5lZFsxXSAvPSAyOwotCQl6b25lLT5yZWNlbnRfcm90YXRlZFsxXSAvPSAyOworCQlyZWNsYWltX3N0YXQtPnJlY2VudF9zY2FubmVkWzFdIC89IDI7CisJCXJlY2xhaW1fc3RhdC0+cmVjZW50X3JvdGF0ZWRbMV0gLz0gMjsKIAkJc3Bpbl91bmxvY2tfaXJxKCZ6b25lLT5scnVfbG9jayk7CiAJfQogCkBAIC0xMzgzLDExICsxNDM4LDExIEBACiAJICogcHJvcG9ydGlvbmFsIHRvIHRoZSBmcmFjdGlvbiBvZiByZWNlbnRseSBzY2FubmVkIHBhZ2VzIG9uCiAJICogZWFjaCBsaXN0IHRoYXQgd2VyZSByZWNlbnRseSByZWZlcmVuY2VkIGFuZCBpbiBhY3RpdmUgdXNlLgogCSAqLwotCWFwID0gKGFub25fcHJpbyArIDEpICogKHpvbmUtPnJlY2VudF9zY2FubmVkWzBdICsgMSk7Ci0JYXAgLz0gem9uZS0+cmVjZW50X3JvdGF0ZWRbMF0gKyAxOworCWFwID0gKGFub25fcHJpbyArIDEpICogKHJlY2xhaW1fc3RhdC0+cmVjZW50X3NjYW5uZWRbMF0gKyAxKTsKKwlhcCAvPSByZWNsYWltX3N0YXQtPnJlY2VudF9yb3RhdGVkWzBdICsgMTsKIAotCWZwID0gKGZpbGVfcHJpbyArIDEpICogKHpvbmUtPnJlY2VudF9zY2FubmVkWzFdICsgMSk7Ci0JZnAgLz0gem9uZS0+cmVjZW50X3JvdGF0ZWRbMV0gKyAxOworCWZwID0gKGZpbGVfcHJpbyArIDEpICogKHJlY2xhaW1fc3RhdC0+cmVjZW50X3NjYW5uZWRbMV0gKyAxKTsKKwlmcCAvPSByZWNsYWltX3N0YXQtPnJlY2VudF9yb3RhdGVkWzFdICsgMTsKIAogCS8qIE5vcm1hbGl6ZSB0byBwZXJjZW50YWdlcyAqLwogCXBlcmNlbnRbMF0gPSAxMDAgKiBhcCAvIChhcCArIGZwICsgMSk7CkBAIC0xNDExLDMwICsxNDY2LDIzIEBACiAJZ2V0X3NjYW5fcmF0aW8oem9uZSwgc2MsIHBlcmNlbnQpOwogCiAJZm9yX2VhY2hfZXZpY3RhYmxlX2xydShsKSB7Ci0JCWlmIChzY2FuX2dsb2JhbF9scnUoc2MpKSB7Ci0JCQlpbnQgZmlsZSA9IGlzX2ZpbGVfbHJ1KGwpOwotCQkJaW50IHNjYW47CisJCWludCBmaWxlID0gaXNfZmlsZV9scnUobCk7CisJCWludCBzY2FuOwogCi0JCQlzY2FuID0gem9uZV9wYWdlX3N0YXRlKHpvbmUsIE5SX0xSVV9CQVNFICsgbCk7Ci0JCQlpZiAocHJpb3JpdHkpIHsKLQkJCQlzY2FuID4+PSBwcmlvcml0eTsKLQkJCQlzY2FuID0gKHNjYW4gKiBwZXJjZW50W2ZpbGVdKSAvIDEwMDsKLQkJCX0KKwkJc2NhbiA9IHpvbmVfcGFnZV9zdGF0ZSh6b25lLCBOUl9MUlVfQkFTRSArIGwpOworCQlpZiAocHJpb3JpdHkpIHsKKwkJCXNjYW4gPj49IHByaW9yaXR5OworCQkJc2NhbiA9IChzY2FuICogcGVyY2VudFtmaWxlXSkgLyAxMDA7CisJCX0KKwkJaWYgKHNjYW5uaW5nX2dsb2JhbF9scnUoc2MpKSB7CiAJCQl6b25lLT5scnVbbF0ubnJfc2NhbiArPSBzY2FuOwogCQkJbnJbbF0gPSB6b25lLT5scnVbbF0ubnJfc2NhbjsKIAkJCWlmIChucltsXSA+PSBzd2FwX2NsdXN0ZXJfbWF4KQogCQkJCXpvbmUtPmxydVtsXS5ucl9zY2FuID0gMDsKIAkJCWVsc2UKIAkJCQlucltsXSA9IDA7Ci0JCX0gZWxzZSB7Ci0JCQkvKgotCQkJICogVGhpcyByZWNsYWltIG9jY3VycyBub3QgYmVjYXVzZSB6b25lIG1lbW9yeSBzaG9ydGFnZQotCQkJICogYnV0IGJlY2F1c2UgbWVtb3J5IGNvbnRyb2xsZXIgaGl0cyBpdHMgbGltaXQuCi0JCQkgKiBEb24ndCBtb2RpZnkgem9uZSByZWNsYWltIHJlbGF0ZWQgZGF0YS4KLQkJCSAqLwotCQkJbnJbbF0gPSBtZW1fY2dyb3VwX2NhbGNfcmVjbGFpbShzYy0+bWVtX2Nncm91cCwgem9uZSwKLQkJCQkJCQkJcHJpb3JpdHksIGwpOwotCQl9CisJCX0gZWxzZQorCQkJbnJbbF0gPSBzY2FuOwogCX0KIAogCXdoaWxlIChucltMUlVfSU5BQ1RJVkVfQU5PTl0gfHwgbnJbTFJVX0FDVElWRV9GSUxFXSB8fApAQCAtMTQ2Nyw5ICsxNTE1LDcgQEAKIAkgKiBFdmVuIGlmIHdlIGRpZCBub3QgdHJ5IHRvIGV2aWN0IGFub24gcGFnZXMgYXQgYWxsLCB3ZSB3YW50IHRvCiAJICogcmViYWxhbmNlIHRoZSBhbm9uIGxydSBhY3RpdmUvaW5hY3RpdmUgcmF0aW8uCiAJICovCi0JaWYgKCFzY2FuX2dsb2JhbF9scnUoc2MpIHx8IGluYWN0aXZlX2Fub25faXNfbG93KHpvbmUpKQotCQlzaHJpbmtfYWN0aXZlX2xpc3QoU1dBUF9DTFVTVEVSX01BWCwgem9uZSwgc2MsIHByaW9yaXR5LCAwKTsKLQllbHNlIGlmICghc2Nhbl9nbG9iYWxfbHJ1KHNjKSkKKwlpZiAoaW5hY3RpdmVfYW5vbl9pc19sb3coem9uZSwgc2MpKQogCQlzaHJpbmtfYWN0aXZlX2xpc3QoU1dBUF9DTFVTVEVSX01BWCwgem9uZSwgc2MsIHByaW9yaXR5LCAwKTsKIAogCXRocm90dGxlX3ZtX3dyaXRlb3V0KHNjLT5nZnBfbWFzayk7CkBAIC0xNTA0LDcgKzE1NTAsNyBAQAogCQkgKiBUYWtlIGNhcmUgbWVtb3J5IGNvbnRyb2xsZXIgcmVjbGFpbWluZyBoYXMgc21hbGwgaW5mbHVlbmNlCiAJCSAqIHRvIGdsb2JhbCBMUlUuCiAJCSAqLwotCQlpZiAoc2Nhbl9nbG9iYWxfbHJ1KHNjKSkgeworCQlpZiAoc2Nhbm5pbmdfZ2xvYmFsX2xydShzYykpIHsKIAkJCWlmICghY3B1c2V0X3pvbmVfYWxsb3dlZF9oYXJkd2FsbCh6b25lLCBHRlBfS0VSTkVMKSkKIAkJCQljb250aW51ZTsKIAkJCW5vdGVfem9uZV9zY2FubmluZ19wcmlvcml0eSh6b25lLCBwcmlvcml0eSk7CkBAIC0xNTU3LDEyICsxNjAzLDEyIEBACiAKIAlkZWxheWFjY3RfZnJlZXBhZ2VzX3N0YXJ0KCk7CiAKLQlpZiAoc2Nhbl9nbG9iYWxfbHJ1KHNjKSkKKwlpZiAoc2Nhbm5pbmdfZ2xvYmFsX2xydShzYykpCiAJCWNvdW50X3ZtX2V2ZW50KEFMTE9DU1RBTEwpOwogCS8qCiAJICogbWVtX2Nncm91cCB3aWxsIG5vdCBkbyBzaHJpbmtfc2xhYi4KIAkgKi8KLQlpZiAoc2Nhbl9nbG9iYWxfbHJ1KHNjKSkgeworCWlmIChzY2FubmluZ19nbG9iYWxfbHJ1KHNjKSkgewogCQlmb3JfZWFjaF96b25lX3pvbmVsaXN0KHpvbmUsIHosIHpvbmVsaXN0LCBoaWdoX3pvbmVpZHgpIHsKIAogCQkJaWYgKCFjcHVzZXRfem9uZV9hbGxvd2VkX2hhcmR3YWxsKHpvbmUsIEdGUF9LRVJORUwpKQpAQCAtMTU4MSw3ICsxNjI3LDcgQEAKIAkJICogRG9uJ3Qgc2hyaW5rIHNsYWJzIHdoZW4gcmVjbGFpbWluZyBtZW1vcnkgZnJvbQogCQkgKiBvdmVyIGxpbWl0IGNncm91cHMKIAkJICovCi0JCWlmIChzY2FuX2dsb2JhbF9scnUoc2MpKSB7CisJCWlmIChzY2FubmluZ19nbG9iYWxfbHJ1KHNjKSkgewogCQkJc2hyaW5rX3NsYWIoc2MtPm5yX3NjYW5uZWQsIHNjLT5nZnBfbWFzaywgbHJ1X3BhZ2VzKTsKIAkJCWlmIChyZWNsYWltX3N0YXRlKSB7CiAJCQkJc2MtPm5yX3JlY2xhaW1lZCArPSByZWNsYWltX3N0YXRlLT5yZWNsYWltZWRfc2xhYjsKQEAgLTE2MTIsNyArMTY1OCw3IEBACiAJCQljb25nZXN0aW9uX3dhaXQoV1JJVEUsIEhaLzEwKTsKIAl9CiAJLyogdG9wIHByaW9yaXR5IHNocmlua196b25lcyBzdGlsbCBoYWQgbW9yZSB0byBkbz8gZG9uJ3QgT09NLCB0aGVuICovCi0JaWYgKCFzYy0+YWxsX3VucmVjbGFpbWFibGUgJiYgc2Nhbl9nbG9iYWxfbHJ1KHNjKSkKKwlpZiAoIXNjLT5hbGxfdW5yZWNsYWltYWJsZSAmJiBzY2FubmluZ19nbG9iYWxfbHJ1KHNjKSkKIAkJcmV0ID0gc2MtPm5yX3JlY2xhaW1lZDsKIG91dDoKIAkvKgpAQCAtMTYyNSw3ICsxNjcxLDcgQEAKIAlpZiAocHJpb3JpdHkgPCAwKQogCQlwcmlvcml0eSA9IDA7CiAKLQlpZiAoc2Nhbl9nbG9iYWxfbHJ1KHNjKSkgeworCWlmIChzY2FubmluZ19nbG9iYWxfbHJ1KHNjKSkgewogCQlmb3JfZWFjaF96b25lX3pvbmVsaXN0KHpvbmUsIHosIHpvbmVsaXN0LCBoaWdoX3pvbmVpZHgpIHsKIAogCQkJaWYgKCFjcHVzZXRfem9uZV9hbGxvd2VkX2hhcmR3YWxsKHpvbmUsIEdGUF9LRVJORUwpKQpAQCAtMTY2MSwxOSArMTcwNywyNCBAQAogI2lmZGVmIENPTkZJR19DR1JPVVBfTUVNX1JFU19DVExSCiAKIHVuc2lnbmVkIGxvbmcgdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcyhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtX2NvbnQsCi0JCQkJCQlnZnBfdCBnZnBfbWFzaykKKwkJCQkJICAgZ2ZwX3QgZ2ZwX21hc2ssCisJCQkJCSAgIGJvb2wgbm9zd2FwLAorCQkJCQkgICB1bnNpZ25lZCBpbnQgc3dhcHBpbmVzcykKIHsKIAlzdHJ1Y3Qgc2Nhbl9jb250cm9sIHNjID0gewogCQkubWF5X3dyaXRlcGFnZSA9ICFsYXB0b3BfbW9kZSwKIAkJLm1heV9zd2FwID0gMSwKIAkJLnN3YXBfY2x1c3Rlcl9tYXggPSBTV0FQX0NMVVNURVJfTUFYLAotCQkuc3dhcHBpbmVzcyA9IHZtX3N3YXBwaW5lc3MsCisJCS5zd2FwcGluZXNzID0gc3dhcHBpbmVzcywKIAkJLm9yZGVyID0gMCwKIAkJLm1lbV9jZ3JvdXAgPSBtZW1fY29udCwKIAkJLmlzb2xhdGVfcGFnZXMgPSBtZW1fY2dyb3VwX2lzb2xhdGVfcGFnZXMsCiAJfTsKIAlzdHJ1Y3Qgem9uZWxpc3QgKnpvbmVsaXN0OwogCisJaWYgKG5vc3dhcCkKKwkJc2MubWF5X3N3YXAgPSAwOworCiAJc2MuZ2ZwX21hc2sgPSAoZ2ZwX21hc2sgJiBHRlBfUkVDTEFJTV9NQVNLKSB8CiAJCQkoR0ZQX0hJR0hVU0VSX01PVkFCTEUgJiB+R0ZQX1JFQ0xBSU1fTUFTSyk7CiAJem9uZWxpc3QgPSBOT0RFX0RBVEEobnVtYV9ub2RlX2lkKCkpLT5ub2RlX3pvbmVsaXN0czsKQEAgLTE3NjEsNyArMTgxMiw3IEBACiAJCQkgKiBEbyBzb21lIGJhY2tncm91bmQgYWdpbmcgb2YgdGhlIGFub24gbGlzdCwgdG8gZ2l2ZQogCQkJICogcGFnZXMgYSBjaGFuY2UgdG8gYmUgcmVmZXJlbmNlZCBiZWZvcmUgcmVjbGFpbWluZy4KIAkJCSAqLwotCQkJaWYgKGluYWN0aXZlX2Fub25faXNfbG93KHpvbmUpKQorCQkJaWYgKGluYWN0aXZlX2Fub25faXNfbG93KHpvbmUsICZzYykpCiAJCQkJc2hyaW5rX2FjdGl2ZV9saXN0KFNXQVBfQ0xVU1RFUl9NQVgsIHpvbmUsCiAJCQkJCQkJJnNjLCBwcmlvcml0eSwgMCk7CiAKQEAgLTI0MDQsNiArMjQ1NSw3IEBACiAKIAkJX19kZWNfem9uZV9zdGF0ZSh6b25lLCBOUl9VTkVWSUNUQUJMRSk7CiAJCWxpc3RfbW92ZSgmcGFnZS0+bHJ1LCAmem9uZS0+bHJ1W2xdLmxpc3QpOworCQltZW1fY2dyb3VwX21vdmVfbGlzdHMocGFnZSwgTFJVX1VORVZJQ1RBQkxFLCBsKTsKIAkJX19pbmNfem9uZV9zdGF0ZSh6b25lLCBOUl9JTkFDVElWRV9BTk9OICsgbCk7CiAJCV9fY291bnRfdm1fZXZlbnQoVU5FVklDVEFCTEVfUEdSRVNDVUVEKTsKIAl9IGVsc2UgewpAQCAtMjQxMiw2ICsyNDY0LDcgQEAKIAkJICovCiAJCVNldFBhZ2VVbmV2aWN0YWJsZShwYWdlKTsKIAkJbGlzdF9tb3ZlKCZwYWdlLT5scnUsICZ6b25lLT5scnVbTFJVX1VORVZJQ1RBQkxFXS5saXN0KTsKKwkJbWVtX2Nncm91cF9yb3RhdGVfbHJ1X2xpc3QocGFnZSwgTFJVX1VORVZJQ1RBQkxFKTsKIAkJaWYgKHBhZ2VfZXZpY3RhYmxlKHBhZ2UsIE5VTEwpKQogCQkJZ290byByZXRyeTsKIAl9CmRpZmYgLS1naXQgYS9uZXQvODAyMXEvdmxhbl9jb3JlLmMgYi9uZXQvODAyMXEvdmxhbl9jb3JlLmMKaW5kZXggZGQ4NmExZC4uNmMxMzIzOSAxMDA2NDQKLS0tIGEvbmV0LzgwMjFxL3ZsYW5fY29yZS5jCisrKyBiL25ldC84MDIxcS92bGFuX2NvcmUuYwpAQCAtMyw0NiArMywzNSBAQAogI2luY2x1ZGUgPGxpbnV4L2lmX3ZsYW4uaD4KICNpbmNsdWRlICJ2bGFuLmgiCiAKLXN0cnVjdCB2bGFuX2h3YWNjZWxfY2IgewotCXN0cnVjdCBuZXRfZGV2aWNlCSpkZXY7Ci19OwotCi1zdGF0aWMgaW5saW5lIHN0cnVjdCB2bGFuX2h3YWNjZWxfY2IgKnZsYW5faHdhY2NlbF9jYihzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQotewotCXJldHVybiAoc3RydWN0IHZsYW5faHdhY2NlbF9jYiAqKXNrYi0+Y2I7Ci19Ci0KIC8qIFZMQU4gcnggaHcgYWNjZWxlcmF0aW9uIGhlbHBlci4gIFRoaXMgYWN0cyBsaWtlIG5ldGlmX3tyeCxyZWNlaXZlX3NrYn0oKS4gKi8KIGludCBfX3ZsYW5faHdhY2NlbF9yeChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3Qgdmxhbl9ncm91cCAqZ3JwLAogCQkgICAgICB1MTYgdmxhbl90Y2ksIGludCBwb2xsaW5nKQogewotCXN0cnVjdCB2bGFuX2h3YWNjZWxfY2IgKmNiID0gdmxhbl9od2FjY2VsX2NiKHNrYik7Ci0KLQlpZiAoc2tiX2JvbmRfc2hvdWxkX2Ryb3Aoc2tiKSkgewotCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOwotCQlyZXR1cm4gTkVUX1JYX0RST1A7Ci0JfQorCWlmIChza2JfYm9uZF9zaG91bGRfZHJvcChza2IpKQorCQlnb3RvIGRyb3A7CiAKIAlza2ItPnZsYW5fdGNpID0gdmxhbl90Y2k7Ci0JY2ItPmRldiA9IHZsYW5fZ3JvdXBfZ2V0X2RldmljZShncnAsIHZsYW5fdGNpICYgVkxBTl9WSURfTUFTSyk7CisJc2tiLT5kZXYgPSB2bGFuX2dyb3VwX2dldF9kZXZpY2UoZ3JwLCB2bGFuX3RjaSAmIFZMQU5fVklEX01BU0spOworCisJaWYgKCFza2ItPmRldikKKwkJZ290byBkcm9wOwogCiAJcmV0dXJuIChwb2xsaW5nID8gbmV0aWZfcmVjZWl2ZV9za2Ioc2tiKSA6IG5ldGlmX3J4KHNrYikpOworCitkcm9wOgorCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJcmV0dXJuIE5FVF9SWF9EUk9QOwogfQogRVhQT1JUX1NZTUJPTChfX3ZsYW5faHdhY2NlbF9yeCk7CiAKIGludCB2bGFuX2h3YWNjZWxfZG9fcmVjZWl2ZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewotCXN0cnVjdCB2bGFuX2h3YWNjZWxfY2IgKmNiID0gdmxhbl9od2FjY2VsX2NiKHNrYik7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGNiLT5kZXY7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHNrYi0+ZGV2OwogCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0czsKIAorCXNrYi0+ZGV2ID0gdmxhbl9kZXZfaW5mbyhkZXYpLT5yZWFsX2RldjsKIAluZXRpZl9uaXRfZGVsaXZlcihza2IpOwogCi0JaWYgKGRldiA9PSBOVUxMKSB7Ci0JCWtmcmVlX3NrYihza2IpOwotCQlyZXR1cm4gLTE7Ci0JfQotCiAJc2tiLT5kZXYgPSBkZXY7CiAJc2tiLT5wcmlvcml0eSA9IHZsYW5fZ2V0X2luZ3Jlc3NfcHJpb3JpdHkoZGV2LCBza2ItPnZsYW5fdGNpKTsKIAlza2ItPnZsYW5fdGNpID0gMDsKQEAgLTgwLDMgKzY5LDc5IEBACiAJcmV0dXJuIHZsYW5fZGV2X2luZm8oZGV2KS0+dmxhbl9pZDsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHZsYW5fZGV2X3ZsYW5faWQpOworCitzdGF0aWMgaW50IHZsYW5fZ3JvX2NvbW1vbihzdHJ1Y3QgbmFwaV9zdHJ1Y3QgKm5hcGksIHN0cnVjdCB2bGFuX2dyb3VwICpncnAsCisJCQkgICB1bnNpZ25lZCBpbnQgdmxhbl90Y2ksIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IHNrX2J1ZmYgKnA7CisKKwlpZiAoc2tiX2JvbmRfc2hvdWxkX2Ryb3Aoc2tiKSkKKwkJZ290byBkcm9wOworCisJc2tiLT52bGFuX3RjaSA9IHZsYW5fdGNpOworCXNrYi0+ZGV2ID0gdmxhbl9ncm91cF9nZXRfZGV2aWNlKGdycCwgdmxhbl90Y2kgJiBWTEFOX1ZJRF9NQVNLKTsKKworCWlmICghc2tiLT5kZXYpCisJCWdvdG8gZHJvcDsKKworCWZvciAocCA9IG5hcGktPmdyb19saXN0OyBwOyBwID0gcC0+bmV4dCkgeworCQlOQVBJX0dST19DQihwKS0+c2FtZV9mbG93ID0gcC0+ZGV2ID09IHNrYi0+ZGV2OworCQlOQVBJX0dST19DQihwKS0+Zmx1c2ggPSAwOworCX0KKworCXJldHVybiBkZXZfZ3JvX3JlY2VpdmUobmFwaSwgc2tiKTsKKworZHJvcDoKKwlyZXR1cm4gMjsKK30KKworaW50IHZsYW5fZ3JvX3JlY2VpdmUoc3RydWN0IG5hcGlfc3RydWN0ICpuYXBpLCBzdHJ1Y3Qgdmxhbl9ncm91cCAqZ3JwLAorCQkgICAgIHVuc2lnbmVkIGludCB2bGFuX3RjaSwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlpbnQgZXJyID0gTkVUX1JYX1NVQ0NFU1M7CisKKwlzd2l0Y2ggKHZsYW5fZ3JvX2NvbW1vbihuYXBpLCBncnAsIHZsYW5fdGNpLCBza2IpKSB7CisJY2FzZSAtMToKKwkJcmV0dXJuIG5ldGlmX3JlY2VpdmVfc2tiKHNrYik7CisKKwljYXNlIDI6CisJCWVyciA9IE5FVF9SWF9EUk9QOworCQkvKiBmYWxsIHRocm91Z2ggKi8KKworCWNhc2UgMToKKwkJa2ZyZWVfc2tiKHNrYik7CisJCWJyZWFrOworCX0KKworCXJldHVybiBlcnI7Cit9CitFWFBPUlRfU1lNQk9MKHZsYW5fZ3JvX3JlY2VpdmUpOworCitpbnQgdmxhbl9ncm9fZnJhZ3Moc3RydWN0IG5hcGlfc3RydWN0ICpuYXBpLCBzdHJ1Y3Qgdmxhbl9ncm91cCAqZ3JwLAorCQkgICB1bnNpZ25lZCBpbnQgdmxhbl90Y2ksIHN0cnVjdCBuYXBpX2dyb19mcmFnaW5mbyAqaW5mbykKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gbmFwaV9mcmFnaW5mb19za2IobmFwaSwgaW5mbyk7CisJaW50IGVyciA9IE5FVF9SWF9EUk9QOworCisJaWYgKCFza2IpCisJCWdvdG8gb3V0OworCisJZXJyID0gTkVUX1JYX1NVQ0NFU1M7CisKKwlzd2l0Y2ggKHZsYW5fZ3JvX2NvbW1vbihuYXBpLCBncnAsIHZsYW5fdGNpLCBza2IpKSB7CisJY2FzZSAtMToKKwkJcmV0dXJuIG5ldGlmX3JlY2VpdmVfc2tiKHNrYik7CisKKwljYXNlIDI6CisJCWVyciA9IE5FVF9SWF9EUk9QOworCQkvKiBmYWxsIHRocm91Z2ggKi8KKworCWNhc2UgMToKKwkJbmFwaV9yZXVzZV9za2IobmFwaSwgc2tiKTsKKwkJYnJlYWs7CisJfQorCitvdXQ6CisJcmV0dXJuIGVycjsKK30KK0VYUE9SVF9TWU1CT0wodmxhbl9ncm9fZnJhZ3MpOwpkaWZmIC0tZ2l0IGEvbmV0LzgwMjFxL3ZsYW5fZGV2LmMgYi9uZXQvODAyMXEvdmxhbl9kZXYuYwppbmRleCA4OWEzYmJkLi40YTE5YWNkIDEwMDY0NAotLS0gYS9uZXQvODAyMXEvdmxhbl9kZXYuYworKysgYi9uZXQvODAyMXEvdmxhbl9kZXYuYwpAQCAtNTQ2LDYgKzU0NiwxOCBAQAogCXJldHVybiBlcnI7CiB9CiAKK3N0YXRpYyBpbnQgdmxhbl9kZXZfbmVpZ2hfc2V0dXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IG5laWdoX3Bhcm1zICpwYSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqcmVhbF9kZXYgPSB2bGFuX2Rldl9pbmZvKGRldiktPnJlYWxfZGV2OworCWNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyAqb3BzID0gcmVhbF9kZXYtPm5ldGRldl9vcHM7CisJaW50IGVyciA9IDA7CisKKwlpZiAobmV0aWZfZGV2aWNlX3ByZXNlbnQocmVhbF9kZXYpICYmIG9wcy0+bmRvX25laWdoX3NldHVwKQorCQllcnIgPSBvcHMtPm5kb19uZWlnaF9zZXR1cChkZXYsIHBhKTsKKworCXJldHVybiBlcnI7Cit9CisKIHN0YXRpYyB2b2lkIHZsYW5fZGV2X2NoYW5nZV9yeF9mbGFncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgY2hhbmdlKQogewogCXN0cnVjdCBuZXRfZGV2aWNlICpyZWFsX2RldiA9IHZsYW5fZGV2X2luZm8oZGV2KS0+cmVhbF9kZXY7CkBAIC03MTMsNiArNzI1LDcgQEAKIAkubmRvX3NldF9tdWx0aWNhc3RfbGlzdAk9IHZsYW5fZGV2X3NldF9yeF9tb2RlLAogCS5uZG9fY2hhbmdlX3J4X2ZsYWdzCT0gdmxhbl9kZXZfY2hhbmdlX3J4X2ZsYWdzLAogCS5uZG9fZG9faW9jdGwJCT0gdmxhbl9kZXZfaW9jdGwsCisJLm5kb19uZWlnaF9zZXR1cAk9IHZsYW5fZGV2X25laWdoX3NldHVwLAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyB2bGFuX25ldGRldl9hY2NlbF9vcHMgPSB7CkBAIC03MjgsNiArNzQxLDcgQEAKIAkubmRvX3NldF9tdWx0aWNhc3RfbGlzdAk9IHZsYW5fZGV2X3NldF9yeF9tb2RlLAogCS5uZG9fY2hhbmdlX3J4X2ZsYWdzCT0gdmxhbl9kZXZfY2hhbmdlX3J4X2ZsYWdzLAogCS5uZG9fZG9faW9jdGwJCT0gdmxhbl9kZXZfaW9jdGwsCisJLm5kb19uZWlnaF9zZXR1cAk9IHZsYW5fZGV2X25laWdoX3NldHVwLAogfTsKIAogdm9pZCB2bGFuX3NldHVwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCmRpZmYgLS1naXQgYS9uZXQvOXAvS2NvbmZpZyBiL25ldC85cC9LY29uZmlnCmluZGV4IDA2NjNmOTkuLjdlZDc1YzcgMTAwNjQ0Ci0tLSBhL25ldC85cC9LY29uZmlnCisrKyBiL25ldC85cC9LY29uZmlnCkBAIC0yMyw3ICsyMyw3IEBACiAJICBndWVzdCBwYXJ0aXRpb25zIGFuZCBhIGhvc3QgcGFydGl0aW9uLgogCiBjb25maWcgTkVUXzlQX1JETUEKLQlkZXBlbmRzIG9uIElORVQgJiYgSU5GSU5JQkFORCAmJiBFWFBFUklNRU5UQUwKKwlkZXBlbmRzIG9uIElORVQgJiYgSU5GSU5JQkFORCAmJiBJTkZJTklCQU5EX0FERFJfVFJBTlMgJiYgRVhQRVJJTUVOVEFMCiAJdHJpc3RhdGUgIjlQIFJETUEgVHJhbnNwb3J0IChFeHBlcmltZW50YWwpIgogCWhlbHAKIAkgIFRoaXMgYnVpbGRzIHN1cHBvcnQgZm9yIGFuIFJETUEgdHJhbnNwb3J0LgpkaWZmIC0tZ2l0IGEvbmV0L0tjb25maWcgYi9uZXQvS2NvbmZpZwppbmRleCA2ZWMyY2NlLi5iZjI3NzYwIDEwMDY0NAotLS0gYS9uZXQvS2NvbmZpZworKysgYi9uZXQvS2NvbmZpZwpAQCAtMjU0LDYgKzI1NCw4IEBACiAKIGVuZGlmICMgV0lSRUxFU1MKIAorc291cmNlICJuZXQvd2ltYXgvS2NvbmZpZyIKKwogc291cmNlICJuZXQvcmZraWxsL0tjb25maWciCiBzb3VyY2UgIm5ldC85cC9LY29uZmlnIgogCmRpZmYgLS1naXQgYS9uZXQvTWFrZWZpbGUgYi9uZXQvTWFrZWZpbGUKaW5kZXggYmE0NDYwNC4uMGZjY2U4OSAxMDA2NDQKLS0tIGEvbmV0L01ha2VmaWxlCisrKyBiL25ldC9NYWtlZmlsZQpAQCAtNjMsMyArNjMsNCBAQAogaWZlcSAoJChDT05GSUdfTkVUKSx5KQogb2JqLSQoQ09ORklHX1NZU0NUTCkJCSs9IHN5c2N0bF9uZXQubwogZW5kaWYKK29iai0kKENPTkZJR19XSU1BWCkJCSs9IHdpbWF4LwpkaWZmIC0tZ2l0IGEvbmV0L2FwcGxldGFsay9hYXJwLmMgYi9uZXQvYXBwbGV0YWxrL2FhcnAuYwppbmRleCBiMDNmZjU4Li44OWY5OWQzIDEwMDY0NAotLS0gYS9uZXQvYXBwbGV0YWxrL2FhcnAuYworKysgYi9uZXQvYXBwbGV0YWxrL2FhcnAuYwpAQCAtNDQzLDEzICs0NDMsMTQgQEAKIHsKIAlzdHJ1Y3QgaWZyZXEgYXRyZXE7CiAJc3RydWN0IHNvY2thZGRyX2F0ICpzYSA9IChzdHJ1Y3Qgc29ja2FkZHJfYXQgKikmYXRyZXEuaWZyX2FkZHI7CisJY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzICpvcHMgPSBpZmFjZS0+ZGV2LT5uZXRkZXZfb3BzOwogCiAJc2EtPnNhdF9hZGRyLnNfbm9kZSA9IGlmYWNlLT5hZGRyZXNzLnNfbm9kZTsKIAlzYS0+c2F0X2FkZHIuc19uZXQgPSBudG9ocyhpZmFjZS0+YWRkcmVzcy5zX25ldCk7CiAKIAkvKiBXZSBwYXNzIHRoZSBOZXQ6Tm9kZSB0byB0aGUgZHJpdmVycy9jYXJkcyBieSBhIERldmljZSBpb2N0bC4gKi8KLQlpZiAoIShpZmFjZS0+ZGV2LT5kb19pb2N0bChpZmFjZS0+ZGV2LCAmYXRyZXEsIFNJT0NTSUZBRERSKSkpIHsKLQkJKHZvaWQpaWZhY2UtPmRldi0+ZG9faW9jdGwoaWZhY2UtPmRldiwgJmF0cmVxLCBTSU9DR0lGQUREUik7CisJaWYgKCEob3BzLT5uZG9fZG9faW9jdGwoaWZhY2UtPmRldiwgJmF0cmVxLCBTSU9DU0lGQUREUikpKSB7CisJCW9wcy0+bmRvX2RvX2lvY3RsKGlmYWNlLT5kZXYsICZhdHJlcSwgU0lPQ0dJRkFERFIpOwogCQlpZiAoaWZhY2UtPmFkZHJlc3Muc19uZXQgIT0gaHRvbnMoc2EtPnNhdF9hZGRyLnNfbmV0KSB8fAogCQkgICAgaWZhY2UtPmFkZHJlc3Muc19ub2RlICE9IHNhLT5zYXRfYWRkci5zX25vZGUpCiAJCQlpZmFjZS0+c3RhdHVzIHw9IEFUSUZfUFJPQkVfRkFJTDsKZGlmZiAtLWdpdCBhL25ldC9ibHVldG9vdGgvYm5lcC9ibmVwLmggYi9uZXQvYmx1ZXRvb3RoL2JuZXAvYm5lcC5oCmluZGV4IGQyMGY4YTQuLjBkOWU1MDYgMTAwNjQ0Ci0tLSBhL25ldC9ibHVldG9vdGgvYm5lcC9ibmVwLmgKKysrIGIvbmV0L2JsdWV0b290aC9ibmVwL2JuZXAuaApAQCAtMTY1LDcgKzE2NSw2IEBACiAKIAlzdHJ1Y3Qgc29ja2V0ICAgICpzb2NrOwogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7Ci0Jc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CiB9OwogCiB2b2lkIGJuZXBfbmV0X3NldHVwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwpkaWZmIC0tZ2l0IGEvbmV0L2JsdWV0b290aC9ibmVwL2NvcmUuYyBiL25ldC9ibHVldG9vdGgvYm5lcC9jb3JlLmMKaW5kZXggNzBmZWE4Yi4uNTJhNmNlMCAxMDA2NDQKLS0tIGEvbmV0L2JsdWV0b290aC9ibmVwL2NvcmUuYworKysgYi9uZXQvYmx1ZXRvb3RoL2JuZXAvY29yZS5jCkBAIC0zMDYsNyArMzA2LDcgQEAKIAlzdHJ1Y3Qgc2tfYnVmZiAqbnNrYjsKIAl1OCB0eXBlOwogCi0Jcy0+c3RhdHMucnhfYnl0ZXMgKz0gc2tiLT5sZW47CisJZGV2LT5zdGF0cy5yeF9ieXRlcyArPSBza2ItPmxlbjsKIAogCXR5cGUgPSAqKHU4ICopIHNrYi0+ZGF0YTsgc2tiX3B1bGwoc2tiLCAxKTsKIApAQCAtMzQzLDcgKzM0Myw3IEBACiAJICogbWF5IG5vdCBiZSBtb2RpZmllZCBhbmQgYmVjYXVzZSBvZiB0aGUgYWxpZ25tZW50IHJlcXVpcmVtZW50cy4gKi8KIAluc2tiID0gYWxsb2Nfc2tiKDIgKyBFVEhfSExFTiArIHNrYi0+bGVuLCBHRlBfS0VSTkVMKTsKIAlpZiAoIW5za2IpIHsKLQkJcy0+c3RhdHMucnhfZHJvcHBlZCsrOworCQlkZXYtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKIAkJa2ZyZWVfc2tiKHNrYik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KQEAgLTM3OCwxNCArMzc4LDE0IEBACiAJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YShza2IsIF9fc2tiX3B1dChuc2tiLCBza2ItPmxlbiksIHNrYi0+bGVuKTsKIAlrZnJlZV9za2Ioc2tiKTsKIAotCXMtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKwlkZXYtPnN0YXRzLnJ4X3BhY2tldHMrKzsKIAluc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9OT05FOwogCW5za2ItPnByb3RvY29sICA9IGV0aF90eXBlX3RyYW5zKG5za2IsIGRldik7CiAJbmV0aWZfcnhfbmkobnNrYik7CiAJcmV0dXJuIDA7CiAKIGJhZGZyYW1lOgotCXMtPnN0YXRzLnJ4X2Vycm9ycysrOworCWRldi0+c3RhdHMucnhfZXJyb3JzKys7CiAJa2ZyZWVfc2tiKHNrYik7CiAJcmV0dXJuIDA7CiB9CkBAIC00NDgsOCArNDQ4LDggQEAKIAlrZnJlZV9za2Ioc2tiKTsKIAogCWlmIChsZW4gPiAwKSB7Ci0JCXMtPnN0YXRzLnR4X2J5dGVzICs9IGxlbjsKLQkJcy0+c3RhdHMudHhfcGFja2V0cysrOworCQlzLT5kZXYtPnN0YXRzLnR4X2J5dGVzICs9IGxlbjsKKwkJcy0+ZGV2LT5zdGF0cy50eF9wYWNrZXRzKys7CiAJCXJldHVybiAwOwogCX0KIApkaWZmIC0tZ2l0IGEvbmV0L2JsdWV0b290aC9ibmVwL25ldGRldi5jIGIvbmV0L2JsdWV0b290aC9ibmVwL25ldGRldi5jCmluZGV4IGY4OTdkYTYuLmQ3YTBlOTcgMTAwNjQ0Ci0tLSBhL25ldC9ibHVldG9vdGgvYm5lcC9uZXRkZXYuYworKysgYi9uZXQvYmx1ZXRvb3RoL2JuZXAvbmV0ZGV2LmMKQEAgLTU1LDEyICs1NSw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqYm5lcF9uZXRfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IGJuZXBfc2Vzc2lvbiAqcyA9IG5ldGRldl9wcml2KGRldik7Ci0JcmV0dXJuICZzLT5zdGF0czsKLX0KLQogc3RhdGljIHZvaWQgYm5lcF9uZXRfc2V0X21jX2xpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKICNpZmRlZiBDT05GSUdfQlRfQk5FUF9NQ19GSUxURVIKQEAgLTEyOCwxMSArMTIyLDYgQEAKIAluZXRpZl93YWtlX3F1ZXVlKGRldik7CiB9CiAKLXN0YXRpYyBpbnQgYm5lcF9uZXRfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICppZnIsIGludCBjbWQpCi17Ci0JcmV0dXJuIC1FSU5WQUw7Ci19Ci0KICNpZmRlZiBDT05GSUdfQlRfQk5FUF9NQ19GSUxURVIKIHN0YXRpYyBpbmxpbmUgaW50IGJuZXBfbmV0X21jX2ZpbHRlcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgYm5lcF9zZXNzaW9uICpzKQogewpAQCAtMjE3LDYgKzIwNiwxOCBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzIGJuZXBfbmV0ZGV2X29wcyA9IHsKKwkubmRvX29wZW4gICAgICAgICAgICA9IGJuZXBfbmV0X29wZW4sCisJLm5kb19zdG9wICAgICAgICAgICAgPSBibmVwX25ldF9jbG9zZSwKKwkubmRvX3N0YXJ0X3htaXQJICAgICA9IGJuZXBfbmV0X3htaXQsCisJLm5kb192YWxpZGF0ZV9hZGRyICAgPSBldGhfdmFsaWRhdGVfYWRkciwKKwkubmRvX3NldF9tdWx0aWNhc3RfbGlzdCA9IGJuZXBfbmV0X3NldF9tY19saXN0LAorCS5uZG9fc2V0X21hY19hZGRyZXNzID0gYm5lcF9uZXRfc2V0X21hY19hZGRyLAorCS5uZG9fdHhfdGltZW91dCAgICAgID0gYm5lcF9uZXRfdGltZW91dCwKKwkubmRvX2NoYW5nZV9tdHUJICAgICA9IGV0aF9jaGFuZ2VfbXR1LAorCit9OworCiB2b2lkIGJuZXBfbmV0X3NldHVwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAKQEAgLTIyNCwxNSArMjI1LDcgQEAKIAlkZXYtPmFkZHJfbGVuID0gRVRIX0FMRU47CiAKIAlldGhlcl9zZXR1cChkZXYpOwotCi0JZGV2LT5vcGVuICAgICAgICAgICAgPSBibmVwX25ldF9vcGVuOwotCWRldi0+c3RvcCAgICAgICAgICAgID0gYm5lcF9uZXRfY2xvc2U7Ci0JZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSBibmVwX25ldF94bWl0OwotCWRldi0+Z2V0X3N0YXRzICAgICAgID0gYm5lcF9uZXRfZ2V0X3N0YXRzOwotCWRldi0+ZG9faW9jdGwgICAgICAgID0gYm5lcF9uZXRfaW9jdGw7Ci0JZGV2LT5zZXRfbWFjX2FkZHJlc3MgPSBibmVwX25ldF9zZXRfbWFjX2FkZHI7Ci0JZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSBibmVwX25ldF9zZXRfbWNfbGlzdDsKKwlkZXYtPm5ldGRldl9vcHMgPSAmYm5lcF9uZXRkZXZfb3BzOwogCiAJZGV2LT53YXRjaGRvZ190aW1lbyAgPSBIWiAqIDI7Ci0JZGV2LT50eF90aW1lb3V0ICAgICAgPSBibmVwX25ldF90aW1lb3V0OwogfQpkaWZmIC0tZ2l0IGEvbmV0L2JyaWRnZS9icl9uZXRmaWx0ZXIuYyBiL25ldC9icmlkZ2UvYnJfbmV0ZmlsdGVyLmMKaW5kZXggYTY1ZTQzYS4uY2Y3NTRhYyAxMDA2NDQKLS0tIGEvbmV0L2JyaWRnZS9icl9uZXRmaWx0ZXIuYworKysgYi9uZXQvYnJpZGdlL2JyX25ldGZpbHRlci5jCkBAIC01OCwxMSArNTgsMTEgQEAKIHN0YXRpYyBpbnQgYnJuZl9jYWxsX2lwdGFibGVzIF9fcmVhZF9tb3N0bHkgPSAxOwogc3RhdGljIGludCBicm5mX2NhbGxfaXA2dGFibGVzIF9fcmVhZF9tb3N0bHkgPSAxOwogc3RhdGljIGludCBicm5mX2NhbGxfYXJwdGFibGVzIF9fcmVhZF9tb3N0bHkgPSAxOwotc3RhdGljIGludCBicm5mX2ZpbHRlcl92bGFuX3RhZ2dlZCBfX3JlYWRfbW9zdGx5ID0gMTsKLXN0YXRpYyBpbnQgYnJuZl9maWx0ZXJfcHBwb2VfdGFnZ2VkIF9fcmVhZF9tb3N0bHkgPSAxOworc3RhdGljIGludCBicm5mX2ZpbHRlcl92bGFuX3RhZ2dlZCBfX3JlYWRfbW9zdGx5ID0gMDsKK3N0YXRpYyBpbnQgYnJuZl9maWx0ZXJfcHBwb2VfdGFnZ2VkIF9fcmVhZF9tb3N0bHkgPSAwOwogI2Vsc2UKLSNkZWZpbmUgYnJuZl9maWx0ZXJfdmxhbl90YWdnZWQgMQotI2RlZmluZSBicm5mX2ZpbHRlcl9wcHBvZV90YWdnZWQgMQorI2RlZmluZSBicm5mX2ZpbHRlcl92bGFuX3RhZ2dlZCAwCisjZGVmaW5lIGJybmZfZmlsdGVyX3BwcG9lX3RhZ2dlZCAwCiAjZW5kaWYKIAogc3RhdGljIGlubGluZSBfX2JlMTYgdmxhbl9wcm90byhjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQpAQCAtNjg2LDggKzY4NiwxMSBAQAogCWlmIChza2ItPnByb3RvY29sID09IGh0b25zKEVUSF9QX0lQKSB8fCBJU19WTEFOX0lQKHNrYikgfHwKIAkgICAgSVNfUFBQT0VfSVAoc2tiKSkKIAkJcGYgPSBQRl9JTkVUOwotCWVsc2UKKwllbHNlIGlmIChza2ItPnByb3RvY29sID09IGh0b25zKEVUSF9QX0lQVjYpIHx8IElTX1ZMQU5fSVBWNihza2IpIHx8CisJCSBJU19QUFBPRV9JUFY2KHNrYikpCiAJCXBmID0gUEZfSU5FVDY7CisJZWxzZQorCQlyZXR1cm4gTkZfQUNDRVBUOwogCiAJbmZfYnJpZGdlX3B1bGxfZW5jYXBfaGVhZGVyKHNrYik7CiAKQEAgLTgyOCw4ICs4MzEsMTEgQEAKIAlpZiAoc2tiLT5wcm90b2NvbCA9PSBodG9ucyhFVEhfUF9JUCkgfHwgSVNfVkxBTl9JUChza2IpIHx8CiAJICAgIElTX1BQUE9FX0lQKHNrYikpCiAJCXBmID0gUEZfSU5FVDsKLQllbHNlCisJZWxzZSBpZiAoc2tiLT5wcm90b2NvbCA9PSBodG9ucyhFVEhfUF9JUFY2KSB8fCBJU19WTEFOX0lQVjYoc2tiKSB8fAorCQkgSVNfUFBQT0VfSVBWNihza2IpKQogCQlwZiA9IFBGX0lORVQ2OworCWVsc2UKKwkJcmV0dXJuIE5GX0FDQ0VQVDsKIAogI2lmZGVmIENPTkZJR19ORVRGSUxURVJfREVCVUcKIAlpZiAoc2tiLT5kc3QgPT0gTlVMTCkgewpkaWZmIC0tZ2l0IGEvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvZWJ0YWJsZXMuYyBiL25ldC9icmlkZ2UvbmV0ZmlsdGVyL2VidGFibGVzLmMKaW5kZXggZmExMDhjNC4uODIwMjUyYSAxMDA2NDQKLS0tIGEvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvZWJ0YWJsZXMuYworKysgYi9uZXQvYnJpZGdlL25ldGZpbHRlci9lYnRhYmxlcy5jCkBAIC03OSwxOCArNzksMTkgQEAKIHsKIAlwYXItPm1hdGNoICAgICA9IG0tPnUubWF0Y2g7CiAJcGFyLT5tYXRjaGluZm8gPSBtLT5kYXRhOwotCXJldHVybiBtLT51Lm1hdGNoLT5tYXRjaChza2IsIHBhcik7CisJcmV0dXJuIG0tPnUubWF0Y2gtPm1hdGNoKHNrYiwgcGFyKSA/IEVCVF9NQVRDSCA6IEVCVF9OT01BVENIOwogfQogCiBzdGF0aWMgaW5saW5lIGludCBlYnRfZGV2X2NoZWNrKGNoYXIgKmVudHJ5LCBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2aWNlKQogewogCWludCBpID0gMDsKLQljb25zdCBjaGFyICpkZXZuYW1lID0gZGV2aWNlLT5uYW1lOworCWNvbnN0IGNoYXIgKmRldm5hbWU7CiAKIAlpZiAoKmVudHJ5ID09ICdcMCcpCiAJCXJldHVybiAwOwogCWlmICghZGV2aWNlKQogCQlyZXR1cm4gMTsKKwlkZXZuYW1lID0gZGV2aWNlLT5uYW1lOwogCS8qIDEgaXMgdGhlIHdpbGRjYXJkIHRva2VuICovCiAJd2hpbGUgKGVudHJ5W2ldICE9ICdcMCcgJiYgZW50cnlbaV0gIT0gMSAmJiBlbnRyeVtpXSA9PSBkZXZuYW1lW2ldKQogCQlpKys7CmRpZmYgLS1naXQgYS9uZXQvY2FuL2FmX2Nhbi5jIGIvbmV0L2Nhbi9hZl9jYW4uYwppbmRleCAzZGFkYjMzLi5mYTQxN2NhIDEwMDY0NAotLS0gYS9uZXQvY2FuL2FmX2Nhbi5jCisrKyBiL25ldC9jYW4vYWZfY2FuLmMKQEAgLTQxNCw2ICs0MTQsMTIgQEAKICAqICBUaGUgZmlsdGVyIGNhbiBiZSBpbnZlcnRlZCAoQ0FOX0lOVl9GSUxURVIgYml0IHNldCBpbiBjYW5faWQpIG9yIGl0IGNhbgogICogIGZpbHRlciBmb3IgZXJyb3IgZnJhbWVzIChDQU5fRVJSX0ZMQUcgYml0IHNldCBpbiBtYXNrKS4KICAqCisgKiAgVGhlIHByb3ZpZGVkIHBvaW50ZXIgdG8gdGhlIHNrX2J1ZmYgaXMgZ3VhcmFudGVlZCB0byBiZSB2YWxpZCBhcyBsb25nIGFzCisgKiAgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIGlzIHJ1bm5pbmcuIFRoZSBjYWxsYmFjayBmdW5jdGlvbiBtdXN0ICpub3QqIGZyZWUKKyAqICB0aGUgZ2l2ZW4gc2tfYnVmZiB3aGlsZSBwcm9jZXNzaW5nIGl0J3MgdGFzay4gV2hlbiB0aGUgZ2l2ZW4gc2tfYnVmZiBpcworICogIG5lZWRlZCBhZnRlciB0aGUgZW5kIG9mIHRoZSBjYWxsYmFjayBmdW5jdGlvbiBpdCBtdXN0IGJlIGNsb25lZCBpbnNpZGUKKyAqICB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gd2l0aCBza2JfY2xvbmUoKS4KKyAqCiAgKiBSZXR1cm46CiAgKiAgMCBvbiBzdWNjZXNzCiAgKiAgLUVOT01FTSBvbiBtaXNzaW5nIGNhY2hlIG1lbSB0byBjcmVhdGUgc3Vic2NyaXB0aW9uIGVudHJ5CkBAIC01NjksMTMgKzU3NSw4IEBACiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBkZWxpdmVyKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCByZWNlaXZlciAqcikKIHsKLQlzdHJ1Y3Qgc2tfYnVmZiAqY2xvbmUgPSBza2JfY2xvbmUoc2tiLCBHRlBfQVRPTUlDKTsKLQotCWlmIChjbG9uZSkgewotCQljbG9uZS0+c2sgPSBza2ItPnNrOwotCQlyLT5mdW5jKGNsb25lLCByLT5kYXRhKTsKLQkJci0+bWF0Y2hlcysrOwotCX0KKwlyLT5mdW5jKHNrYiwgci0+ZGF0YSk7CisJci0+bWF0Y2hlcysrOwogfQogCiBzdGF0aWMgaW50IGNhbl9yY3ZfZmlsdGVyKHN0cnVjdCBkZXZfcmN2X2xpc3RzICpkLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQpkaWZmIC0tZ2l0IGEvbmV0L2Nhbi9iY20uYyBiL25ldC9jYW4vYmNtLmMKaW5kZXggNjI0OGFlMi4uYjdjN2Q0NiAxMDA2NDQKLS0tIGEvbmV0L2Nhbi9iY20uYworKysgYi9uZXQvY2FuL2JjbS5jCkBAIC0zNDcsMTYgKzM0Nyw0MiBAQAogCXN0cnVjdCBiY21fb3AgKm9wID0gKHN0cnVjdCBiY21fb3AgKilkYXRhOwogCXN0cnVjdCBiY21fbXNnX2hlYWQgbXNnX2hlYWQ7CiAKLQkvKiBjcmVhdGUgbm90aWZpY2F0aW9uIHRvIHVzZXIgKi8KLQltc2dfaGVhZC5vcGNvZGUgID0gVFhfRVhQSVJFRDsKLQltc2dfaGVhZC5mbGFncyAgID0gb3AtPmZsYWdzOwotCW1zZ19oZWFkLmNvdW50ICAgPSBvcC0+Y291bnQ7Ci0JbXNnX2hlYWQuaXZhbDEgICA9IG9wLT5pdmFsMTsKLQltc2dfaGVhZC5pdmFsMiAgID0gb3AtPml2YWwyOwotCW1zZ19oZWFkLmNhbl9pZCAgPSBvcC0+Y2FuX2lkOwotCW1zZ19oZWFkLm5mcmFtZXMgPSAwOworCWlmIChvcC0+a3RfaXZhbDEudHY2NCAmJiAob3AtPmNvdW50ID4gMCkpIHsKIAotCWJjbV9zZW5kX3RvX3VzZXIob3AsICZtc2dfaGVhZCwgTlVMTCwgMCk7CisJCW9wLT5jb3VudC0tOworCQlpZiAoIW9wLT5jb3VudCAmJiAob3AtPmZsYWdzICYgVFhfQ09VTlRFVlQpKSB7CisKKwkJCS8qIGNyZWF0ZSBub3RpZmljYXRpb24gdG8gdXNlciAqLworCQkJbXNnX2hlYWQub3Bjb2RlICA9IFRYX0VYUElSRUQ7CisJCQltc2dfaGVhZC5mbGFncyAgID0gb3AtPmZsYWdzOworCQkJbXNnX2hlYWQuY291bnQgICA9IG9wLT5jb3VudDsKKwkJCW1zZ19oZWFkLml2YWwxICAgPSBvcC0+aXZhbDE7CisJCQltc2dfaGVhZC5pdmFsMiAgID0gb3AtPml2YWwyOworCQkJbXNnX2hlYWQuY2FuX2lkICA9IG9wLT5jYW5faWQ7CisJCQltc2dfaGVhZC5uZnJhbWVzID0gMDsKKworCQkJYmNtX3NlbmRfdG9fdXNlcihvcCwgJm1zZ19oZWFkLCBOVUxMLCAwKTsKKwkJfQorCX0KKworCWlmIChvcC0+a3RfaXZhbDEudHY2NCAmJiAob3AtPmNvdW50ID4gMCkpIHsKKworCQkvKiBzZW5kIChuZXh0KSBmcmFtZSAqLworCQliY21fY2FuX3R4KG9wKTsKKwkJaHJ0aW1lcl9zdGFydCgmb3AtPnRpbWVyLAorCQkJICAgICAga3RpbWVfYWRkKGt0aW1lX2dldCgpLCBvcC0+a3RfaXZhbDEpLAorCQkJICAgICAgSFJUSU1FUl9NT0RFX0FCUyk7CisKKwl9IGVsc2UgeworCQlpZiAob3AtPmt0X2l2YWwyLnR2NjQpIHsKKworCQkJLyogc2VuZCAobmV4dCkgZnJhbWUgKi8KKwkJCWJjbV9jYW5fdHgob3ApOworCQkJaHJ0aW1lcl9zdGFydCgmb3AtPnRpbWVyLAorCQkJCSAgICAgIGt0aW1lX2FkZChrdGltZV9nZXQoKSwgb3AtPmt0X2l2YWwyKSwKKwkJCQkgICAgICBIUlRJTUVSX01PREVfQUJTKTsKKwkJfQorCX0KIH0KIAogLyoKQEAgLTM2NSwzMyArMzkxLDEwIEBACiBzdGF0aWMgZW51bSBocnRpbWVyX3Jlc3RhcnQgYmNtX3R4X3RpbWVvdXRfaGFuZGxlcihzdHJ1Y3QgaHJ0aW1lciAqaHJ0aW1lcikKIHsKIAlzdHJ1Y3QgYmNtX29wICpvcCA9IGNvbnRhaW5lcl9vZihocnRpbWVyLCBzdHJ1Y3QgYmNtX29wLCB0aW1lcik7Ci0JZW51bSBocnRpbWVyX3Jlc3RhcnQgcmV0ID0gSFJUSU1FUl9OT1JFU1RBUlQ7CiAKLQlpZiAob3AtPmt0X2l2YWwxLnR2NjQgJiYgKG9wLT5jb3VudCA+IDApKSB7CisJdGFza2xldF9zY2hlZHVsZSgmb3AtPnRza2xldCk7CiAKLQkJb3AtPmNvdW50LS07Ci0JCWlmICghb3AtPmNvdW50ICYmIChvcC0+ZmxhZ3MgJiBUWF9DT1VOVEVWVCkpCi0JCQl0YXNrbGV0X3NjaGVkdWxlKCZvcC0+dHNrbGV0KTsKLQl9Ci0KLQlpZiAob3AtPmt0X2l2YWwxLnR2NjQgJiYgKG9wLT5jb3VudCA+IDApKSB7Ci0KLQkJLyogc2VuZCAobmV4dCkgZnJhbWUgKi8KLQkJYmNtX2Nhbl90eChvcCk7Ci0JCWhydGltZXJfZm9yd2FyZChocnRpbWVyLCBrdGltZV9nZXQoKSwgb3AtPmt0X2l2YWwxKTsKLQkJcmV0ID0gSFJUSU1FUl9SRVNUQVJUOwotCi0JfSBlbHNlIHsKLQkJaWYgKG9wLT5rdF9pdmFsMi50djY0KSB7Ci0KLQkJCS8qIHNlbmQgKG5leHQpIGZyYW1lICovCi0JCQliY21fY2FuX3R4KG9wKTsKLQkJCWhydGltZXJfZm9yd2FyZChocnRpbWVyLCBrdGltZV9nZXQoKSwgb3AtPmt0X2l2YWwyKTsKLQkJCXJldCA9IEhSVElNRVJfUkVTVEFSVDsKLQkJfQotCX0KLQotCXJldHVybiByZXQ7CisJcmV0dXJuIEhSVElNRVJfTk9SRVNUQVJUOwogfQogCiAvKgpAQCAtNjMzLDcgKzYzNiw3IEBACiAJaHJ0aW1lcl9jYW5jZWwoJm9wLT50aW1lcik7CiAKIAlpZiAob3AtPmNhbl9pZCAhPSByeGZyYW1lLT5jYW5faWQpCi0JCWdvdG8gcnhfZnJlZXNrYjsKKwkJcmV0dXJuOwogCiAJLyogc2F2ZSByeCB0aW1lc3RhbXAgKi8KIAlvcC0+cnhfc3RhbXAgPSBza2ItPnRzdGFtcDsKQEAgLTY0NSwxOSArNjQ4LDE5IEBACiAJaWYgKG9wLT5mbGFncyAmIFJYX1JUUl9GUkFNRSkgewogCQkvKiBzZW5kIHJlcGx5IGZvciBSVFItcmVxdWVzdCAocGxhY2VkIGluIG9wLT5mcmFtZXNbMF0pICovCiAJCWJjbV9jYW5fdHgob3ApOwotCQlnb3RvIHJ4X2ZyZWVza2I7CisJCXJldHVybjsKIAl9CiAKIAlpZiAob3AtPmZsYWdzICYgUlhfRklMVEVSX0lEKSB7CiAJCS8qIHRoZSBlYXNpZXN0IGNhc2UgKi8KIAkJYmNtX3J4X3VwZGF0ZV9hbmRfc2VuZChvcCwgJm9wLT5sYXN0X2ZyYW1lc1swXSwgcnhmcmFtZSk7Ci0JCWdvdG8gcnhfZnJlZXNrYl9zdGFydHRpbWVyOworCQlnb3RvIHJ4X3N0YXJ0dGltZXI7CiAJfQogCiAJaWYgKG9wLT5uZnJhbWVzID09IDEpIHsKIAkJLyogc2ltcGxlIGNvbXBhcmUgd2l0aCBpbmRleCAwICovCiAJCWJjbV9yeF9jbXBfdG9faW5kZXgob3AsIDAsIHJ4ZnJhbWUpOwotCQlnb3RvIHJ4X2ZyZWVza2Jfc3RhcnR0aW1lcjsKKwkJZ290byByeF9zdGFydHRpbWVyOwogCX0KIAogCWlmIChvcC0+bmZyYW1lcyA+IDEpIHsKQEAgLTY3OCwxMCArNjgxLDggQEAKIAkJfQogCX0KIAotcnhfZnJlZXNrYl9zdGFydHRpbWVyOgorcnhfc3RhcnR0aW1lcjoKIAliY21fcnhfc3RhcnR0aW1lcihvcCk7Ci1yeF9mcmVlc2tiOgotCWtmcmVlX3NrYihza2IpOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvbmV0L2Nhbi9yYXcuYyBiL25ldC9jYW4vcmF3LmMKaW5kZXggMjdhYWI2My4uMDcwM2NiYSAxMDA2NDQKLS0tIGEvbmV0L2Nhbi9yYXcuYworKysgYi9uZXQvY2FuL3Jhdy5jCkBAIC05OSwxMyArOTksMTQgQEAKIAlzdHJ1Y3QgcmF3X3NvY2sgKnJvID0gcmF3X3NrKHNrKTsKIAlzdHJ1Y3Qgc29ja2FkZHJfY2FuICphZGRyOwogCi0JaWYgKCFyby0+cmVjdl9vd25fbXNncykgewotCQkvKiBjaGVjayB0aGUgcmVjZWl2ZWQgdHggc29jayByZWZlcmVuY2UgKi8KLQkJaWYgKHNrYi0+c2sgPT0gc2spIHsKLQkJCWtmcmVlX3NrYihza2IpOwotCQkJcmV0dXJuOwotCQl9Ci0JfQorCS8qIGNoZWNrIHRoZSByZWNlaXZlZCB0eCBzb2NrIHJlZmVyZW5jZSAqLworCWlmICghcm8tPnJlY3Zfb3duX21zZ3MgJiYgc2tiLT5zayA9PSBzaykKKwkJcmV0dXJuOworCisJLyogY2xvbmUgdGhlIGdpdmVuIHNrYiB0byBiZSBhYmxlIHRvIGVucXVldWUgaXQgaW50byB0aGUgcmN2IHF1ZXVlICovCisJc2tiID0gc2tiX2Nsb25lKHNrYiwgR0ZQX0FUT01JQyk7CisJaWYgKCFza2IpCisJCXJldHVybjsKIAogCS8qCiAJICogIFB1dCB0aGUgZGF0YWdyYW0gdG8gdGhlIHF1ZXVlIHNvIHRoYXQgcmF3X3JlY3Ztc2coKSBjYW4KZGlmZiAtLWdpdCBhL25ldC9jb3JlL2Rldi5jIGIvbmV0L2NvcmUvZGV2LmMKaW5kZXggMzgyZGY2Yy4uOGQ2NzU5NyAxMDA2NDQKLS0tIGEvbmV0L2NvcmUvZGV2LmMKKysrIGIvbmV0L2NvcmUvZGV2LmMKQEAgLTE3MCwyNSArMTcwLDYgQEAKIHN0YXRpYyBzdHJ1Y3QgbGlzdF9oZWFkIHB0eXBlX2Jhc2VbUFRZUEVfSEFTSF9TSVpFXSBfX3JlYWRfbW9zdGx5Owogc3RhdGljIHN0cnVjdCBsaXN0X2hlYWQgcHR5cGVfYWxsIF9fcmVhZF9tb3N0bHk7CS8qIFRhcHMgKi8KIAotI2lmZGVmIENPTkZJR19ORVRfRE1BCi1zdHJ1Y3QgbmV0X2RtYSB7Ci0Jc3RydWN0IGRtYV9jbGllbnQgY2xpZW50OwotCXNwaW5sb2NrX3QgbG9jazsKLQljcHVtYXNrX3QgY2hhbm5lbF9tYXNrOwotCXN0cnVjdCBkbWFfY2hhbiAqKmNoYW5uZWxzOwotfTsKLQotc3RhdGljIGVudW0gZG1hX3N0YXRlX2NsaWVudAotbmV0ZGV2X2RtYV9ldmVudChzdHJ1Y3QgZG1hX2NsaWVudCAqY2xpZW50LCBzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4sCi0JZW51bSBkbWFfc3RhdGUgc3RhdGUpOwotCi1zdGF0aWMgc3RydWN0IG5ldF9kbWEgbmV0X2RtYSA9IHsKLQkuY2xpZW50ID0gewotCQkuZXZlbnRfY2FsbGJhY2sgPSBuZXRkZXZfZG1hX2V2ZW50LAotCX0sCi19OwotI2VuZGlmCi0KIC8qCiAgKiBUaGUgQGRldl9iYXNlX2hlYWQgbGlzdCBpcyBwcm90ZWN0ZWQgYnkgQGRldl9iYXNlX2xvY2sgYW5kIHRoZSBydG5sCiAgKiBzZW1hcGhvcmUuCkBAIC0xMTA3LDYgKzEwODgsMTEgQEAKIAkJZGV2LT5mbGFncyB8PSBJRkZfVVA7CiAKIAkJLyoKKwkJICoJRW5hYmxlIE5FVF9ETUEKKwkJICovCisJCWRtYWVuZ2luZV9nZXQoKTsKKworCQkvKgogCQkgKglJbml0aWFsaXplIG11bHRpY2FzdGluZyBzdGF0dXMKIAkJICovCiAJCWRldl9zZXRfcnhfbW9kZShkZXYpOwpAQCAtMTE4Myw2ICsxMTY5LDExIEBACiAJICovCiAJY2FsbF9uZXRkZXZpY2Vfbm90aWZpZXJzKE5FVERFVl9ET1dOLCBkZXYpOwogCisJLyoKKwkgKglTaHV0ZG93biBORVRfRE1BCisJICovCisJZG1hZW5naW5lX3B1dCgpOworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTIzODcsNyArMjM3OCw3IEBACiB9CiBFWFBPUlRfU1lNQk9MKG5hcGlfZ3JvX2ZsdXNoKTsKIAotc3RhdGljIGludCBfX25hcGlfZ3JvX3JlY2VpdmUoc3RydWN0IG5hcGlfc3RydWN0ICpuYXBpLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoraW50IGRldl9ncm9fcmVjZWl2ZShzdHJ1Y3QgbmFwaV9zdHJ1Y3QgKm5hcGksIHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJc3RydWN0IHNrX2J1ZmYgKipwcCA9IE5VTEw7CiAJc3RydWN0IHBhY2tldF90eXBlICpwdHlwZTsKQEAgLTI0MDEsNiArMjM5Miw5IEBACiAJaWYgKCEoc2tiLT5kZXYtPmZlYXR1cmVzICYgTkVUSUZfRl9HUk8pKQogCQlnb3RvIG5vcm1hbDsKIAorCWlmIChza2JfaXNfZ3NvKHNrYikgfHwgc2tiX3NoaW5mbyhza2IpLT5mcmFnX2xpc3QpCisJCWdvdG8gbm9ybWFsOworCiAJcmN1X3JlYWRfbG9jaygpOwogCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KHB0eXBlLCBoZWFkLCBsaXN0KSB7CiAJCXN0cnVjdCBza19idWZmICpwOwpAQCAtMjQxNywxMSArMjQxMSwxNCBAQAogCiAJCWZvciAocCA9IG5hcGktPmdyb19saXN0OyBwOyBwID0gcC0+bmV4dCkgewogCQkJY291bnQrKzsKLQkJCU5BUElfR1JPX0NCKHApLT5zYW1lX2Zsb3cgPQotCQkJCXAtPm1hY19sZW4gPT0gbWFjX2xlbiAmJgotCQkJCSFtZW1jbXAoc2tiX21hY19oZWFkZXIocCksIHNrYl9tYWNfaGVhZGVyKHNrYiksCi0JCQkJCW1hY19sZW4pOwotCQkJTkFQSV9HUk9fQ0IocCktPmZsdXNoID0gMDsKKworCQkJaWYgKCFOQVBJX0dST19DQihwKS0+c2FtZV9mbG93KQorCQkJCWNvbnRpbnVlOworCisJCQlpZiAocC0+bWFjX2xlbiAhPSBtYWNfbGVuIHx8CisJCQkgICAgbWVtY21wKHNrYl9tYWNfaGVhZGVyKHApLCBza2JfbWFjX2hlYWRlcihza2IpLAorCQkJCSAgIG1hY19sZW4pKQorCQkJCU5BUElfR1JPX0NCKHApLT5zYW1lX2Zsb3cgPSAwOwogCQl9CiAKIAkJcHAgPSBwdHlwZS0+Z3JvX3JlY2VpdmUoJm5hcGktPmdyb19saXN0LCBza2IpOwpAQCAtMjQ2Myw2ICsyNDYwLDE5IEBACiBub3JtYWw6CiAJcmV0dXJuIC0xOwogfQorRVhQT1JUX1NZTUJPTChkZXZfZ3JvX3JlY2VpdmUpOworCitzdGF0aWMgaW50IF9fbmFwaV9ncm9fcmVjZWl2ZShzdHJ1Y3QgbmFwaV9zdHJ1Y3QgKm5hcGksIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IHNrX2J1ZmYgKnA7CisKKwlmb3IgKHAgPSBuYXBpLT5ncm9fbGlzdDsgcDsgcCA9IHAtPm5leHQpIHsKKwkJTkFQSV9HUk9fQ0IocCktPnNhbWVfZmxvdyA9IDE7CisJCU5BUElfR1JPX0NCKHApLT5mbHVzaCA9IDA7CisJfQorCisJcmV0dXJuIGRldl9ncm9fcmVjZWl2ZShuYXBpLCBza2IpOworfQogCiBpbnQgbmFwaV9ncm9fcmVjZWl2ZShzdHJ1Y3QgbmFwaV9zdHJ1Y3QgKm5hcGksIHN0cnVjdCBza19idWZmICpza2IpCiB7CkBAIC0yNDc5LDExICsyNDg5LDIwIEBACiB9CiBFWFBPUlRfU1lNQk9MKG5hcGlfZ3JvX3JlY2VpdmUpOwogCi1pbnQgbmFwaV9ncm9fZnJhZ3Moc3RydWN0IG5hcGlfc3RydWN0ICpuYXBpLCBzdHJ1Y3QgbmFwaV9ncm9fZnJhZ2luZm8gKmluZm8pCit2b2lkIG5hcGlfcmV1c2Vfc2tiKHN0cnVjdCBuYXBpX3N0cnVjdCAqbmFwaSwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlfX3NrYl9wdWxsKHNrYiwgc2tiX2hlYWRsZW4oc2tiKSk7CisJc2tiX3Jlc2VydmUoc2tiLCBORVRfSVBfQUxJR04gLSBza2JfaGVhZHJvb20oc2tiKSk7CisKKwluYXBpLT5za2IgPSBza2I7Cit9CitFWFBPUlRfU1lNQk9MKG5hcGlfcmV1c2Vfc2tiKTsKKworc3RydWN0IHNrX2J1ZmYgKm5hcGlfZnJhZ2luZm9fc2tiKHN0cnVjdCBuYXBpX3N0cnVjdCAqbmFwaSwKKwkJCQkgIHN0cnVjdCBuYXBpX2dyb19mcmFnaW5mbyAqaW5mbykKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbmFwaS0+ZGV2OwogCXN0cnVjdCBza19idWZmICpza2IgPSBuYXBpLT5za2I7Ci0JaW50IGVyciA9IE5FVF9SWF9EUk9QOwogCiAJbmFwaS0+c2tiID0gTlVMTDsKIApAQCAtMjUwMywxNiArMjUyMiwzMSBAQAogCXNrYi0+bGVuICs9IGluZm8tPmxlbjsKIAlza2ItPnRydWVzaXplICs9IGluZm8tPmxlbjsKIAotCWlmICghcHNrYl9tYXlfcHVsbChza2IsIEVUSF9ITEVOKSkKLQkJZ290byByZXVzZTsKLQotCWVyciA9IE5FVF9SWF9TVUNDRVNTOworCWlmICghcHNrYl9tYXlfcHVsbChza2IsIEVUSF9ITEVOKSkgeworCQluYXBpX3JldXNlX3NrYihuYXBpLCBza2IpOworCQlnb3RvIG91dDsKKwl9CiAKIAlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBkZXYpOwogCiAJc2tiLT5pcF9zdW1tZWQgPSBpbmZvLT5pcF9zdW1tZWQ7CiAJc2tiLT5jc3VtID0gaW5mby0+Y3N1bTsKIAorb3V0OgorCXJldHVybiBza2I7Cit9CitFWFBPUlRfU1lNQk9MKG5hcGlfZnJhZ2luZm9fc2tiKTsKKworaW50IG5hcGlfZ3JvX2ZyYWdzKHN0cnVjdCBuYXBpX3N0cnVjdCAqbmFwaSwgc3RydWN0IG5hcGlfZ3JvX2ZyYWdpbmZvICppbmZvKQoreworCXN0cnVjdCBza19idWZmICpza2IgPSBuYXBpX2ZyYWdpbmZvX3NrYihuYXBpLCBpbmZvKTsKKwlpbnQgZXJyID0gTkVUX1JYX0RST1A7CisKKwlpZiAoIXNrYikKKwkJZ290byBvdXQ7CisKKwllcnIgPSBORVRfUlhfU1VDQ0VTUzsKKwogCXN3aXRjaCAoX19uYXBpX2dyb19yZWNlaXZlKG5hcGksIHNrYikpIHsKIAljYXNlIC0xOgogCQlyZXR1cm4gbmV0aWZfcmVjZWl2ZV9za2Ioc2tiKTsKQEAgLTI1MjEsMTcgKzI1NTUsNyBAQAogCQlnb3RvIG91dDsKIAl9CiAKLXJldXNlOgotCXNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3MgPSAwOwotCi0Jc2tiLT5sZW4gLT0gc2tiLT5kYXRhX2xlbjsKLQlza2ItPnRydWVzaXplIC09IHNrYi0+ZGF0YV9sZW47Ci0Jc2tiLT5kYXRhX2xlbiA9IDA7Ci0KLQlfX3NrYl9wdWxsKHNrYiwgc2tiX2hlYWRsZW4oc2tiKSk7Ci0Jc2tiX3Jlc2VydmUoc2tiLCBORVRfSVBfQUxJR04gLSBza2JfaGVhZHJvb20oc2tiKSk7Ci0KLQluYXBpLT5za2IgPSBza2I7CisJbmFwaV9yZXVzZV9za2IobmFwaSwgc2tiKTsKIAogb3V0OgogCXJldHVybiBlcnI7CkBAIC0yNzE4LDE0ICsyNzQyLDcgQEAKIAkgKiBUaGVyZSBtYXkgbm90IGJlIGFueSBtb3JlIHNrX2J1ZmZzIGNvbWluZyByaWdodCBub3csIHNvIHB1c2gKIAkgKiBhbnkgcGVuZGluZyBETUEgY29waWVzIHRvIGhhcmR3YXJlCiAJICovCi0JaWYgKCFjcHVzX2VtcHR5KG5ldF9kbWEuY2hhbm5lbF9tYXNrKSkgewotCQlpbnQgY2hhbl9pZHg7Ci0JCWZvcl9lYWNoX2NwdV9tYXNrX25yKGNoYW5faWR4LCBuZXRfZG1hLmNoYW5uZWxfbWFzaykgewotCQkJc3RydWN0IGRtYV9jaGFuICpjaGFuID0gbmV0X2RtYS5jaGFubmVsc1tjaGFuX2lkeF07Ci0JCQlpZiAoY2hhbikKLQkJCQlkbWFfYXN5bmNfbWVtY3B5X2lzc3VlX3BlbmRpbmcoY2hhbik7Ci0JCX0KLQl9CisJZG1hX2lzc3VlX3BlbmRpbmdfYWxsKCk7CiAjZW5kaWYKIAogCXJldHVybjsKQEAgLTQ0MTQsNiArNDQzMSw0NSBAQAogfQogCiAvKioKKyAqCWluaXRfZHVtbXlfbmV0ZGV2CS0gaW5pdCBhIGR1bW15IG5ldHdvcmsgZGV2aWNlIGZvciBOQVBJCisgKglAZGV2OiBkZXZpY2UgdG8gaW5pdAorICoKKyAqCVRoaXMgdGFrZXMgYSBuZXR3b3JrIGRldmljZSBzdHJ1Y3R1cmUgYW5kIGluaXRpYWxpemUgdGhlIG1pbmltdW0KKyAqCWFtb3VudCBvZiBmaWVsZHMgc28gaXQgY2FuIGJlIHVzZWQgdG8gc2NoZWR1bGUgTkFQSSBwb2xscyB3aXRob3V0CisgKglyZWdpc3RlcmluZyBhIGZ1bGwgYmxvd24gaW50ZXJmYWNlLiBUaGlzIGlzIHRvIGJlIHVzZWQgYnkgZHJpdmVycworICoJdGhhdCBuZWVkIHRvIHRpZSBzZXZlcmFsIGhhcmR3YXJlIGludGVyZmFjZXMgdG8gYSBzaW5nbGUgTkFQSQorICoJcG9sbCBzY2hlZHVsZXIgZHVlIHRvIEhXIGxpbWl0YXRpb25zLgorICovCitpbnQgaW5pdF9kdW1teV9uZXRkZXYoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwkvKiBDbGVhciBldmVyeXRoaW5nLiBOb3RlIHdlIGRvbid0IGluaXRpYWxpemUgc3BpbmxvY2tzCisJICogYXJlIHRoZXkgYXJlbid0IHN1cHBvc2VkIHRvIGJlIHRha2VuIGJ5IGFueSBvZiB0aGUKKwkgKiBOQVBJIGNvZGUgYW5kIHRoaXMgZHVtbXkgbmV0ZGV2IGlzIHN1cHBvc2VkIHRvIGJlCisJICogb25seSBldmVyIHVzZWQgZm9yIE5BUEkgcG9sbHMKKwkgKi8KKwltZW1zZXQoZGV2LCAwLCBzaXplb2Yoc3RydWN0IG5ldF9kZXZpY2UpKTsKKworCS8qIG1ha2Ugc3VyZSB3ZSBCVUcgaWYgdHJ5aW5nIHRvIGhpdCBzdGFuZGFyZAorCSAqIHJlZ2lzdGVyL3VucmVnaXN0ZXIgY29kZSBwYXRoCisJICovCisJZGV2LT5yZWdfc3RhdGUgPSBORVRSRUdfRFVNTVk7CisKKwkvKiBpbml0aWFsaXplIHRoZSByZWYgY291bnQgKi8KKwlhdG9taWNfc2V0KCZkZXYtPnJlZmNudCwgMSk7CisKKwkvKiBOQVBJIHdhbnRzIHRoaXMgKi8KKwlJTklUX0xJU1RfSEVBRCgmZGV2LT5uYXBpX2xpc3QpOworCisJLyogYSBkdW1teSBpbnRlcmZhY2UgaXMgc3RhcnRlZCBieSBkZWZhdWx0ICovCisJc2V0X2JpdChfX0xJTktfU1RBVEVfUFJFU0VOVCwgJmRldi0+c3RhdGUpOworCXNldF9iaXQoX19MSU5LX1NUQVRFX1NUQVJULCAmZGV2LT5zdGF0ZSk7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGluaXRfZHVtbXlfbmV0ZGV2KTsKKworCisvKioKICAqCXJlZ2lzdGVyX25ldGRldgktIHJlZ2lzdGVyIGEgbmV0d29yayBkZXZpY2UKICAqCUBkZXY6IGRldmljZSB0byByZWdpc3RlcgogICoKQEAgLTQ5MTYsMTIyICs0OTcyLDYgQEAKIAlyZXR1cm4gTk9USUZZX09LOwogfQogCi0jaWZkZWYgQ09ORklHX05FVF9ETUEKLS8qKgotICogbmV0X2RtYV9yZWJhbGFuY2UgLSB0cnkgdG8gbWFpbnRhaW4gb25lIERNQSBjaGFubmVsIHBlciBDUFUKLSAqIEBuZXRfZG1hOiBETUEgY2xpZW50IGFuZCBhc3NvY2lhdGVkIGRhdGEgKGxvY2ssIGNoYW5uZWxzLCBjaGFubmVsX21hc2spCi0gKgotICogVGhpcyBpcyBjYWxsZWQgd2hlbiB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzIGFsbG9jYXRlZCB0byB0aGUgbmV0X2RtYSBjbGllbnQKLSAqIGNoYW5nZXMuICBUaGUgbmV0X2RtYSBjbGllbnQgdHJpZXMgdG8gaGF2ZSBvbmUgRE1BIGNoYW5uZWwgcGVyIENQVS4KLSAqLwotCi1zdGF0aWMgdm9pZCBuZXRfZG1hX3JlYmFsYW5jZShzdHJ1Y3QgbmV0X2RtYSAqbmV0X2RtYSkKLXsKLQl1bnNpZ25lZCBpbnQgY3B1LCBpLCBuLCBjaGFuX2lkeDsKLQlzdHJ1Y3QgZG1hX2NoYW4gKmNoYW47Ci0KLQlpZiAoY3B1c19lbXB0eShuZXRfZG1hLT5jaGFubmVsX21hc2spKSB7Ci0JCWZvcl9lYWNoX29ubGluZV9jcHUoY3B1KQotCQkJcmN1X2Fzc2lnbl9wb2ludGVyKHBlcl9jcHUoc29mdG5ldF9kYXRhLCBjcHUpLm5ldF9kbWEsIE5VTEwpOwotCQlyZXR1cm47Ci0JfQotCi0JaSA9IDA7Ci0JY3B1ID0gZmlyc3RfY3B1KGNwdV9vbmxpbmVfbWFwKTsKLQotCWZvcl9lYWNoX2NwdV9tYXNrX25yKGNoYW5faWR4LCBuZXRfZG1hLT5jaGFubmVsX21hc2spIHsKLQkJY2hhbiA9IG5ldF9kbWEtPmNoYW5uZWxzW2NoYW5faWR4XTsKLQotCQluID0gKChudW1fb25saW5lX2NwdXMoKSAvIGNwdXNfd2VpZ2h0KG5ldF9kbWEtPmNoYW5uZWxfbWFzaykpCi0JCSAgICsgKGkgPCAobnVtX29ubGluZV9jcHVzKCkgJQotCQkJY3B1c193ZWlnaHQobmV0X2RtYS0+Y2hhbm5lbF9tYXNrKSkgPyAxIDogMCkpOwotCi0JCXdoaWxlKG4pIHsKLQkJCXBlcl9jcHUoc29mdG5ldF9kYXRhLCBjcHUpLm5ldF9kbWEgPSBjaGFuOwotCQkJY3B1ID0gbmV4dF9jcHUoY3B1LCBjcHVfb25saW5lX21hcCk7Ci0JCQluLS07Ci0JCX0KLQkJaSsrOwotCX0KLX0KLQotLyoqCi0gKiBuZXRkZXZfZG1hX2V2ZW50IC0gZXZlbnQgY2FsbGJhY2sgZm9yIHRoZSBuZXRfZG1hX2NsaWVudAotICogQGNsaWVudDogc2hvdWxkIGFsd2F5cyBiZSBuZXRfZG1hX2NsaWVudAotICogQGNoYW46IERNQSBjaGFubmVsIGZvciB0aGUgZXZlbnQKLSAqIEBzdGF0ZTogRE1BIHN0YXRlIHRvIGJlIGhhbmRsZWQKLSAqLwotc3RhdGljIGVudW0gZG1hX3N0YXRlX2NsaWVudAotbmV0ZGV2X2RtYV9ldmVudChzdHJ1Y3QgZG1hX2NsaWVudCAqY2xpZW50LCBzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4sCi0JZW51bSBkbWFfc3RhdGUgc3RhdGUpCi17Ci0JaW50IGksIGZvdW5kID0gMCwgcG9zID0gLTE7Ci0Jc3RydWN0IG5ldF9kbWEgKm5ldF9kbWEgPQotCQljb250YWluZXJfb2YoY2xpZW50LCBzdHJ1Y3QgbmV0X2RtYSwgY2xpZW50KTsKLQllbnVtIGRtYV9zdGF0ZV9jbGllbnQgYWNrID0gRE1BX0RVUDsgLyogZGVmYXVsdDogdGFrZSBubyBhY3Rpb24gKi8KLQotCXNwaW5fbG9jaygmbmV0X2RtYS0+bG9jayk7Ci0Jc3dpdGNoIChzdGF0ZSkgewotCWNhc2UgRE1BX1JFU09VUkNFX0FWQUlMQUJMRToKLQkJZm9yIChpID0gMDsgaSA8IG5yX2NwdV9pZHM7IGkrKykKLQkJCWlmIChuZXRfZG1hLT5jaGFubmVsc1tpXSA9PSBjaGFuKSB7Ci0JCQkJZm91bmQgPSAxOwotCQkJCWJyZWFrOwotCQkJfSBlbHNlIGlmIChuZXRfZG1hLT5jaGFubmVsc1tpXSA9PSBOVUxMICYmIHBvcyA8IDApCi0JCQkJcG9zID0gaTsKLQotCQlpZiAoIWZvdW5kICYmIHBvcyA+PSAwKSB7Ci0JCQlhY2sgPSBETUFfQUNLOwotCQkJbmV0X2RtYS0+Y2hhbm5lbHNbcG9zXSA9IGNoYW47Ci0JCQljcHVfc2V0KHBvcywgbmV0X2RtYS0+Y2hhbm5lbF9tYXNrKTsKLQkJCW5ldF9kbWFfcmViYWxhbmNlKG5ldF9kbWEpOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgRE1BX1JFU09VUkNFX1JFTU9WRUQ6Ci0JCWZvciAoaSA9IDA7IGkgPCBucl9jcHVfaWRzOyBpKyspCi0JCQlpZiAobmV0X2RtYS0+Y2hhbm5lbHNbaV0gPT0gY2hhbikgewotCQkJCWZvdW5kID0gMTsKLQkJCQlwb3MgPSBpOwotCQkJCWJyZWFrOwotCQkJfQotCi0JCWlmIChmb3VuZCkgewotCQkJYWNrID0gRE1BX0FDSzsKLQkJCWNwdV9jbGVhcihwb3MsIG5ldF9kbWEtPmNoYW5uZWxfbWFzayk7Ci0JCQluZXRfZG1hLT5jaGFubmVsc1tpXSA9IE5VTEw7Ci0JCQluZXRfZG1hX3JlYmFsYW5jZShuZXRfZG1hKTsKLQkJfQotCQlicmVhazsKLQlkZWZhdWx0OgotCQlicmVhazsKLQl9Ci0Jc3Bpbl91bmxvY2soJm5ldF9kbWEtPmxvY2spOwotCi0JcmV0dXJuIGFjazsKLX0KLQotLyoqCi0gKiBuZXRkZXZfZG1hX3JlZ2lzdGVyIC0gcmVnaXN0ZXIgdGhlIG5ldHdvcmtpbmcgc3Vic3lzdGVtIGFzIGEgRE1BIGNsaWVudAotICovCi1zdGF0aWMgaW50IF9faW5pdCBuZXRkZXZfZG1hX3JlZ2lzdGVyKHZvaWQpCi17Ci0JbmV0X2RtYS5jaGFubmVscyA9IGt6YWxsb2MobnJfY3B1X2lkcyAqIHNpemVvZihzdHJ1Y3QgbmV0X2RtYSksCi0JCQkJCQkJCUdGUF9LRVJORUwpOwotCWlmICh1bmxpa2VseSghbmV0X2RtYS5jaGFubmVscykpIHsKLQkJcHJpbnRrKEtFUk5fTk9USUNFCi0JCQkJIm5ldGRldl9kbWE6IG5vIG1lbW9yeSBmb3IgbmV0X2RtYS5jaGFubmVsc1xuIik7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQlzcGluX2xvY2tfaW5pdCgmbmV0X2RtYS5sb2NrKTsKLQlkbWFfY2FwX3NldChETUFfTUVNQ1BZLCBuZXRfZG1hLmNsaWVudC5jYXBfbWFzayk7Ci0JZG1hX2FzeW5jX2NsaWVudF9yZWdpc3RlcigmbmV0X2RtYS5jbGllbnQpOwotCWRtYV9hc3luY19jbGllbnRfY2hhbl9yZXF1ZXN0KCZuZXRfZG1hLmNsaWVudCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLSNlbHNlCi1zdGF0aWMgaW50IF9faW5pdCBuZXRkZXZfZG1hX3JlZ2lzdGVyKHZvaWQpIHsgcmV0dXJuIC1FTk9ERVY7IH0KLSNlbmRpZiAvKiBDT05GSUdfTkVUX0RNQSAqLwogCiAvKioKICAqCW5ldGRldl9pbmNyZW1lbnRfZmVhdHVyZXMgLSBpbmNyZW1lbnQgZmVhdHVyZSBzZXQgYnkgb25lCkBAIC01MjUxLDggKzUxOTEsNiBAQAogCWlmIChyZWdpc3Rlcl9wZXJuZXRfZGV2aWNlKCZkZWZhdWx0X2RldmljZV9vcHMpKQogCQlnb3RvIG91dDsKIAotCW5ldGRldl9kbWFfcmVnaXN0ZXIoKTsKLQogCW9wZW5fc29mdGlycShORVRfVFhfU09GVElSUSwgbmV0X3R4X2FjdGlvbik7CiAJb3Blbl9zb2Z0aXJxKE5FVF9SWF9TT0ZUSVJRLCBuZXRfcnhfYWN0aW9uKTsKIApkaWZmIC0tZ2l0IGEvbmV0L2NvcmUvc2tidWZmLmMgYi9uZXQvY29yZS9za2J1ZmYuYwppbmRleCA1MTEwYjM1Li42NWVhYzc3IDEwMDY0NAotLS0gYS9uZXQvY29yZS9za2J1ZmYuYworKysgYi9uZXQvY29yZS9za2J1ZmYuYwpAQCAtMjYwMiw2ICsyNjAyLDEyIEBACiAJCSAgICAgICBza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzICogc2l6ZW9mKHNrYl9mcmFnX3QpKTsKIAogCQlza2Jfc2hpbmZvKHApLT5ucl9mcmFncyArPSBza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzOworCQlza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzID0gMDsKKworCQlza2ItPnRydWVzaXplIC09IHNrYi0+ZGF0YV9sZW47CisJCXNrYi0+bGVuIC09IHNrYi0+ZGF0YV9sZW47CisJCXNrYi0+ZGF0YV9sZW4gPSAwOworCiAJCU5BUElfR1JPX0NCKHNrYiktPmZyZWUgPSAxOwogCQlnb3RvIGRvbmU7CiAJfQpkaWZmIC0tZ2l0IGEvbmV0L2RjY3AvY2NpZHMvS2NvbmZpZyBiL25ldC9kY2NwL2NjaWRzL0tjb25maWcKaW5kZXggYjI4YmY5Ni4uNGI1ZGI0NCAxMDA2NDQKLS0tIGEvbmV0L2RjY3AvY2NpZHMvS2NvbmZpZworKysgYi9uZXQvZGNjcC9jY2lkcy9LY29uZmlnCkBAIC0yOSw3ICsyOSw3IEBACiAJICBodHRwOi8vd3d3LmlldGYub3JnL3JmYy9yZmM0MzQyLnR4dAogCiAJICBUaGUgVEZSQyBjb25nZXN0aW9uIGNvbnRyb2wgYWxnb3JpdGhtcyB3ZXJlIGluaXRpYWxseSBkZXNjcmliZWQgaW4KLQkgIFJGQyA1NDQ4LgorCSAgUkZDIDUzNDguCiAKIAkgIFRoaXMgdGV4dCB3YXMgZXh0cmFjdGVkIGZyb20gUkZDIDQzNDAgKHNlYy4gMTAuMiksCiAJICBodHRwOi8vd3d3LmlldGYub3JnL3JmYy9yZmM0MzQwLnR4dApkaWZmIC0tZ2l0IGEvbmV0L2RjY3AvY2NpZHMvbGliL3RmcmMuYyBiL25ldC9kY2NwL2NjaWRzL2xpYi90ZnJjLmMKaW5kZXggNjBjNDEyYy4uNDkwMjAyOSAxMDA2NDQKLS0tIGEvbmV0L2RjY3AvY2NpZHMvbGliL3RmcmMuYworKysgYi9uZXQvZGNjcC9jY2lkcy9saWIvdGZyYy5jCkBAIC0zNiw3ICszNiw3IEBACiAJcmV0dXJuIHJjOwogfQogCi12b2lkIF9fZXhpdCB0ZnJjX2xpYl9leGl0KHZvaWQpCit2b2lkIHRmcmNfbGliX2V4aXQodm9pZCkKIHsKIAl0ZnJjX3J4X3BhY2tldF9oaXN0b3J5X2V4aXQoKTsKIAl0ZnJjX3R4X3BhY2tldF9oaXN0b3J5X2V4aXQoKTsKZGlmZiAtLWdpdCBhL25ldC9kc2Evc2xhdmUuYyBiL25ldC9kc2Evc2xhdmUuYwppbmRleCBhM2E0MTBkLi5hNjhmZDc5IDEwMDY0NAotLS0gYS9uZXQvZHNhL3NsYXZlLmMKKysrIGIvbmV0L2RzYS9zbGF2ZS5jCkBAIC0yODYsNiArMjg2LDQyIEBACiAJLmdldF9zc2V0X2NvdW50CQk9IGRzYV9zbGF2ZV9nZXRfc3NldF9jb3VudCwKIH07CiAKKyNpZmRlZiBDT05GSUdfTkVUX0RTQV9UQUdfRFNBCitzdGF0aWMgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzIGRzYV9uZXRkZXZfb3BzID0geworCS5uZG9fb3BlbgkgCT0gZHNhX3NsYXZlX29wZW4sCisJLm5kb19zdG9wCQk9IGRzYV9zbGF2ZV9jbG9zZSwKKwkubmRvX3N0YXJ0X3htaXQJCT0gZHNhX3htaXQsCisJLm5kb19jaGFuZ2VfcnhfZmxhZ3MJPSBkc2Ffc2xhdmVfY2hhbmdlX3J4X2ZsYWdzLAorCS5uZG9fc2V0X3J4X21vZGUJPSBkc2Ffc2xhdmVfc2V0X3J4X21vZGUsCisJLm5kb19zZXRfbXVsdGljYXN0X2xpc3QgPSBkc2Ffc2xhdmVfc2V0X3J4X21vZGUsCisJLm5kb19zZXRfbWFjX2FkZHJlc3MJPSBkc2Ffc2xhdmVfc2V0X21hY19hZGRyZXNzLAorCS5uZG9fZG9faW9jdGwJCT0gZHNhX3NsYXZlX2lvY3RsLAorfTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19ORVRfRFNBX1RBR19FRFNBCitzdGF0aWMgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzIGVkc2FfbmV0ZGV2X29wcyA9IHsKKwkubmRvX29wZW4JIAk9IGRzYV9zbGF2ZV9vcGVuLAorCS5uZG9fc3RvcAkJPSBkc2Ffc2xhdmVfY2xvc2UsCisJLm5kb19zdGFydF94bWl0CQk9IGVkc2FfeG1pdCwKKwkubmRvX2NoYW5nZV9yeF9mbGFncwk9IGRzYV9zbGF2ZV9jaGFuZ2VfcnhfZmxhZ3MsCisJLm5kb19zZXRfcnhfbW9kZQk9IGRzYV9zbGF2ZV9zZXRfcnhfbW9kZSwKKwkubmRvX3NldF9tdWx0aWNhc3RfbGlzdCA9IGRzYV9zbGF2ZV9zZXRfcnhfbW9kZSwKKwkubmRvX3NldF9tYWNfYWRkcmVzcwk9IGRzYV9zbGF2ZV9zZXRfbWFjX2FkZHJlc3MsCisJLm5kb19kb19pb2N0bAkJPSBkc2Ffc2xhdmVfaW9jdGwsCit9OworI2VuZGlmCisjaWZkZWYgQ09ORklHX05FVF9EU0FfVEFHX1RSQUlMRVIKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgdHJhaWxlcl9uZXRkZXZfb3BzID0geworCS5uZG9fb3BlbgkgCT0gZHNhX3NsYXZlX29wZW4sCisJLm5kb19zdG9wCQk9IGRzYV9zbGF2ZV9jbG9zZSwKKwkubmRvX3N0YXJ0X3htaXQJCT0gdHJhaWxlcl94bWl0LAorCS5uZG9fY2hhbmdlX3J4X2ZsYWdzCT0gZHNhX3NsYXZlX2NoYW5nZV9yeF9mbGFncywKKwkubmRvX3NldF9yeF9tb2RlCT0gZHNhX3NsYXZlX3NldF9yeF9tb2RlLAorCS5uZG9fc2V0X211bHRpY2FzdF9saXN0ID0gZHNhX3NsYXZlX3NldF9yeF9tb2RlLAorCS5uZG9fc2V0X21hY19hZGRyZXNzCT0gZHNhX3NsYXZlX3NldF9tYWNfYWRkcmVzcywKKwkubmRvX2RvX2lvY3RsCQk9IGRzYV9zbGF2ZV9pb2N0bCwKK307CisjZW5kaWYKIAogLyogc2xhdmUgZGV2aWNlIHNldHVwICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBzdHJ1Y3QgbmV0X2RldmljZSAqCkBAIC0zMDYsMzIgKzM0MiwyNyBAQAogCVNFVF9FVEhUT09MX09QUyhzbGF2ZV9kZXYsICZkc2Ffc2xhdmVfZXRodG9vbF9vcHMpOwogCW1lbWNweShzbGF2ZV9kZXYtPmRldl9hZGRyLCBtYXN0ZXItPmRldl9hZGRyLCBFVEhfQUxFTik7CiAJc2xhdmVfZGV2LT50eF9xdWV1ZV9sZW4gPSAwOworCiAJc3dpdGNoIChkcy0+dGFnX3Byb3RvY29sKSB7CiAjaWZkZWYgQ09ORklHX05FVF9EU0FfVEFHX0RTQQogCWNhc2UgaHRvbnMoRVRIX1BfRFNBKToKLQkJc2xhdmVfZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSBkc2FfeG1pdDsKKwkJc2xhdmVfZGV2LT5uZXRkZXZfb3BzID0gJmRzYV9uZXRkZXZfb3BzOwogCQlicmVhazsKICNlbmRpZgogI2lmZGVmIENPTkZJR19ORVRfRFNBX1RBR19FRFNBCiAJY2FzZSBodG9ucyhFVEhfUF9FRFNBKToKLQkJc2xhdmVfZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSBlZHNhX3htaXQ7CisJCXNsYXZlX2Rldi0+bmV0ZGV2X29wcyA9ICZlZHNhX25ldGRldl9vcHM7CiAJCWJyZWFrOwogI2VuZGlmCiAjaWZkZWYgQ09ORklHX05FVF9EU0FfVEFHX1RSQUlMRVIKIAljYXNlIGh0b25zKEVUSF9QX1RSQUlMRVIpOgotCQlzbGF2ZV9kZXYtPmhhcmRfc3RhcnRfeG1pdCA9IHRyYWlsZXJfeG1pdDsKKwkJc2xhdmVfZGV2LT5uZXRkZXZfb3BzID0gJnRyYWlsZXJfbmV0ZGV2X29wczsKIAkJYnJlYWs7CiAjZW5kaWYKIAlkZWZhdWx0OgogCQlCVUcoKTsKIAl9Ci0Jc2xhdmVfZGV2LT5vcGVuID0gZHNhX3NsYXZlX29wZW47Ci0Jc2xhdmVfZGV2LT5zdG9wID0gZHNhX3NsYXZlX2Nsb3NlOwotCXNsYXZlX2Rldi0+Y2hhbmdlX3J4X2ZsYWdzID0gZHNhX3NsYXZlX2NoYW5nZV9yeF9mbGFnczsKLQlzbGF2ZV9kZXYtPnNldF9yeF9tb2RlID0gZHNhX3NsYXZlX3NldF9yeF9tb2RlOwotCXNsYXZlX2Rldi0+c2V0X211bHRpY2FzdF9saXN0ID0gZHNhX3NsYXZlX3NldF9yeF9tb2RlOwotCXNsYXZlX2Rldi0+c2V0X21hY19hZGRyZXNzID0gZHNhX3NsYXZlX3NldF9tYWNfYWRkcmVzczsKLQlzbGF2ZV9kZXYtPmRvX2lvY3RsID0gZHNhX3NsYXZlX2lvY3RsOworCiAJU0VUX05FVERFVl9ERVYoc2xhdmVfZGV2LCBwYXJlbnQpOwogCXNsYXZlX2Rldi0+dmxhbl9mZWF0dXJlcyA9IG1hc3Rlci0+dmxhbl9mZWF0dXJlczsKIApkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdGFibGVfZmlsdGVyLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0YWJsZV9maWx0ZXIuYwppbmRleCBjOTIyNDMxLi41MmNiNjkzIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0YWJsZV9maWx0ZXIuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0YWJsZV9maWx0ZXIuYwpAQCAtOTMsMTMgKzkzLDggQEAKIHsKIAkvKiByb290IGlzIHBsYXlpbmcgd2l0aCByYXcgc29ja2V0cy4gKi8KIAlpZiAoc2tiLT5sZW4gPCBzaXplb2Yoc3RydWN0IGlwaGRyKSB8fAotCSAgICBpcF9oZHJsZW4oc2tiKSA8IHNpemVvZihzdHJ1Y3QgaXBoZHIpKSB7Ci0JCWlmIChuZXRfcmF0ZWxpbWl0KCkpCi0JCQlwcmludGsoImlwdGFibGVfZmlsdGVyOiBpZ25vcmluZyBzaG9ydCBTT0NLX1JBVyAiCi0JCQkgICAgICAgInBhY2tldC5cbiIpOworCSAgICBpcF9oZHJsZW4oc2tiKSA8IHNpemVvZihzdHJ1Y3QgaXBoZHIpKQogCQlyZXR1cm4gTkZfQUNDRVBUOwotCX0KLQogCXJldHVybiBpcHRfZG9fdGFibGUoc2tiLCBob29rLCBpbiwgb3V0LAogCQkJICAgIGRldl9uZXQob3V0KS0+aXB2NC5pcHRhYmxlX2ZpbHRlcik7CiB9CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0YWJsZV9tYW5nbGUuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRhYmxlX21hbmdsZS5jCmluZGV4IDY5ZjJjNDIuLjM5MjlkMjAgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRhYmxlX21hbmdsZS5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRhYmxlX21hbmdsZS5jCkBAIC0xMzIsMTIgKzEzMiw4IEBACiAKIAkvKiByb290IGlzIHBsYXlpbmcgd2l0aCByYXcgc29ja2V0cy4gKi8KIAlpZiAoc2tiLT5sZW4gPCBzaXplb2Yoc3RydWN0IGlwaGRyKQotCSAgICB8fCBpcF9oZHJsZW4oc2tiKSA8IHNpemVvZihzdHJ1Y3QgaXBoZHIpKSB7Ci0JCWlmIChuZXRfcmF0ZWxpbWl0KCkpCi0JCQlwcmludGsoImlwdGFibGVfbWFuZ2xlOiBpZ25vcmluZyBzaG9ydCBTT0NLX1JBVyAiCi0JCQkgICAgICAgInBhY2tldC5cbiIpOworCSAgICB8fCBpcF9oZHJsZW4oc2tiKSA8IHNpemVvZihzdHJ1Y3QgaXBoZHIpKQogCQlyZXR1cm4gTkZfQUNDRVBUOwotCX0KIAogCS8qIFNhdmUgdGhpbmdzIHdoaWNoIGNvdWxkIGFmZmVjdCByb3V0ZSAqLwogCW1hcmsgPSBza2ItPm1hcms7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0YWJsZV9yYXcuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRhYmxlX3Jhdy5jCmluZGV4IDhmYWViZmUuLjdmNjVkMTggMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRhYmxlX3Jhdy5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRhYmxlX3Jhdy5jCkBAIC02NSwxMiArNjUsOCBAQAogewogCS8qIHJvb3QgaXMgcGxheWluZyB3aXRoIHJhdyBzb2NrZXRzLiAqLwogCWlmIChza2ItPmxlbiA8IHNpemVvZihzdHJ1Y3QgaXBoZHIpIHx8Ci0JICAgIGlwX2hkcmxlbihza2IpIDwgc2l6ZW9mKHN0cnVjdCBpcGhkcikpIHsKLQkJaWYgKG5ldF9yYXRlbGltaXQoKSkKLQkJCXByaW50aygiaXB0YWJsZV9yYXc6IGlnbm9yaW5nIHNob3J0IFNPQ0tfUkFXICIKLQkJCSAgICAgICAicGFja2V0LlxuIik7CisJICAgIGlwX2hkcmxlbihza2IpIDwgc2l6ZW9mKHN0cnVjdCBpcGhkcikpCiAJCXJldHVybiBORl9BQ0NFUFQ7Ci0JfQogCXJldHVybiBpcHRfZG9fdGFibGUoc2tiLCBob29rLCBpbiwgb3V0LAogCQkJICAgIGRldl9uZXQob3V0KS0+aXB2NC5pcHRhYmxlX3Jhdyk7CiB9CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0YWJsZV9zZWN1cml0eS5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdGFibGVfc2VjdXJpdHkuYwppbmRleCAzNmYzYmUzLi5hNTJhMzVmIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0YWJsZV9zZWN1cml0eS5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRhYmxlX3NlY3VyaXR5LmMKQEAgLTk2LDEyICs5Niw4IEBACiB7CiAJLyogU29tZWJvZHkgaXMgcGxheWluZyB3aXRoIHJhdyBzb2NrZXRzLiAqLwogCWlmIChza2ItPmxlbiA8IHNpemVvZihzdHJ1Y3QgaXBoZHIpCi0JICAgIHx8IGlwX2hkcmxlbihza2IpIDwgc2l6ZW9mKHN0cnVjdCBpcGhkcikpIHsKLQkJaWYgKG5ldF9yYXRlbGltaXQoKSkKLQkJCXByaW50ayhLRVJOX0lORk8gImlwdGFibGVfc2VjdXJpdHk6IGlnbm9yaW5nIHNob3J0ICIKLQkJCSAgICAgICAiU09DS19SQVcgcGFja2V0LlxuIik7CisJICAgIHx8IGlwX2hkcmxlbihza2IpIDwgc2l6ZW9mKHN0cnVjdCBpcGhkcikpCiAJCXJldHVybiBORl9BQ0NFUFQ7Ci0JfQogCXJldHVybiBpcHRfZG9fdGFibGUoc2tiLCBob29rLCBpbiwgb3V0LAogCQkJICAgIGRldl9uZXQob3V0KS0+aXB2NC5pcHRhYmxlX3NlY3VyaXR5KTsKIH0KZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9uZl9jb25udHJhY2tfbDNwcm90b19pcHY0LmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2wzcHJvdG9faXB2NC5jCmluZGV4IGIyMTQxZTEuLjRiZWIwNGYgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9uZl9jb25udHJhY2tfbDNwcm90b19pcHY0LmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19sM3Byb3RvX2lwdjQuYwpAQCAtMTQ1LDExICsxNDUsOCBAQAogewogCS8qIHJvb3QgaXMgcGxheWluZyB3aXRoIHJhdyBzb2NrZXRzLiAqLwogCWlmIChza2ItPmxlbiA8IHNpemVvZihzdHJ1Y3QgaXBoZHIpIHx8Ci0JICAgIGlwX2hkcmxlbihza2IpIDwgc2l6ZW9mKHN0cnVjdCBpcGhkcikpIHsKLQkJaWYgKG5ldF9yYXRlbGltaXQoKSkKLQkJCXByaW50aygiaXB0X2hvb2s6IGhhcHB5IGNyYWNraW5nLlxuIik7CisJICAgIGlwX2hkcmxlbihza2IpIDwgc2l6ZW9mKHN0cnVjdCBpcGhkcikpCiAJCXJldHVybiBORl9BQ0NFUFQ7Ci0JfQogCXJldHVybiBuZl9jb25udHJhY2tfaW4oZGV2X25ldChvdXQpLCBQRl9JTkVULCBob29rbnVtLCBza2IpOwogfQogCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3Byb3RvX2ljbXAuYyBiL25ldC9pcHY0L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHJvdG9faWNtcC5jCmluZGV4IDFmZDNlZjcuLjJhOGJlZTIgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHJvdG9faWNtcC5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHJvdG9faWNtcC5jCkBAIC0yMCw3ICsyMCw3IEBACiAjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfY29yZS5oPgogI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfbG9nLmg+CiAKLXN0YXRpYyB1bnNpZ25lZCBsb25nIG5mX2N0X2ljbXBfdGltZW91dCBfX3JlYWRfbW9zdGx5ID0gMzAqSFo7CitzdGF0aWMgdW5zaWduZWQgaW50IG5mX2N0X2ljbXBfdGltZW91dCBfX3JlYWRfbW9zdGx5ID0gMzAqSFo7CiAKIHN0YXRpYyBib29sIGljbXBfcGt0X3RvX3R1cGxlKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIHVuc2lnbmVkIGludCBkYXRhb2ZmLAogCQkJICAgICAgc3RydWN0IG5mX2Nvbm50cmFja190dXBsZSAqdHVwbGUpCmRpZmYgLS1naXQgYS9uZXQvaXB2NC90Y3AuYyBiL25ldC9pcHY0L3RjcC5jCmluZGV4IDM1YmNkZGYuLjBjZDcxYjggMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L3RjcC5jCisrKyBiL25ldC9pcHY0L3RjcC5jCkBAIC01MjIsOCArNTIyLDEyIEBACiAJCQkJdW5zaWduZWQgaW50IG9mZnNldCwgc2l6ZV90IGxlbikKIHsKIAlzdHJ1Y3QgdGNwX3NwbGljZV9zdGF0ZSAqdHNzID0gcmRfZGVzYy0+YXJnLmRhdGE7CisJaW50IHJldDsKIAotCXJldHVybiBza2Jfc3BsaWNlX2JpdHMoc2tiLCBvZmZzZXQsIHRzcy0+cGlwZSwgdHNzLT5sZW4sIHRzcy0+ZmxhZ3MpOworCXJldCA9IHNrYl9zcGxpY2VfYml0cyhza2IsIG9mZnNldCwgdHNzLT5waXBlLCByZF9kZXNjLT5jb3VudCwgdHNzLT5mbGFncyk7CisJaWYgKHJldCA+IDApCisJCXJkX2Rlc2MtPmNvdW50IC09IHJldDsKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW50IF9fdGNwX3NwbGljZV9yZWFkKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHRjcF9zcGxpY2Vfc3RhdGUgKnRzcykKQEAgLTUzMSw2ICs1MzUsNyBAQAogCS8qIFN0b3JlIFRDUCBzcGxpY2UgY29udGV4dCBpbmZvcm1hdGlvbiBpbiByZWFkX2Rlc2NyaXB0b3JfdC4gKi8KIAlyZWFkX2Rlc2NyaXB0b3JfdCByZF9kZXNjID0gewogCQkuYXJnLmRhdGEgPSB0c3MsCisJCS5jb3VudAkgID0gdHNzLT5sZW4sCiAJfTsKIAogCXJldHVybiB0Y3BfcmVhZF9zb2NrKHNrLCAmcmRfZGVzYywgdGNwX3NwbGljZV9kYXRhX3JlY3YpOwpAQCAtNjExLDExICs2MTYsMTMgQEAKIAkJdHNzLmxlbiAtPSByZXQ7CiAJCXNwbGljZWQgKz0gcmV0OwogCisJCWlmICghdGltZW8pCisJCQlicmVhazsKIAkJcmVsZWFzZV9zb2NrKHNrKTsKIAkJbG9ja19zb2NrKHNrKTsKIAogCQlpZiAoc2stPnNrX2VyciB8fCBzay0+c2tfc3RhdGUgPT0gVENQX0NMT1NFIHx8Ci0JCSAgICAoc2stPnNrX3NodXRkb3duICYgUkNWX1NIVVRET1dOKSB8fCAhdGltZW8gfHwKKwkJICAgIChzay0+c2tfc2h1dGRvd24gJiBSQ1ZfU0hVVERPV04pIHx8CiAJCSAgICBzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKIAkJCWJyZWFrOwogCX0KQEAgLTEzMTMsNyArMTMyMCw3IEBACiAJCWlmICgoYXZhaWxhYmxlIDwgdGFyZ2V0KSAmJgogCQkgICAgKGxlbiA+IHN5c2N0bF90Y3BfZG1hX2NvcHlicmVhaykgJiYgIShmbGFncyAmIE1TR19QRUVLKSAmJgogCQkgICAgIXN5c2N0bF90Y3BfbG93X2xhdGVuY3kgJiYKLQkJICAgIF9fZ2V0X2NwdV92YXIoc29mdG5ldF9kYXRhKS5uZXRfZG1hKSB7CisJCSAgICBkbWFfZmluZF9jaGFubmVsKERNQV9NRU1DUFkpKSB7CiAJCQlwcmVlbXB0X2VuYWJsZV9ub19yZXNjaGVkKCk7CiAJCQl0cC0+dWNvcHkucGlubmVkX2xpc3QgPQogCQkJCQlkbWFfcGluX2lvdmVjX3BhZ2VzKG1zZy0+bXNnX2lvdiwgbGVuKTsKQEAgLTE1MjMsNyArMTUzMCw3IEBACiAJCWlmICghKGZsYWdzICYgTVNHX1RSVU5DKSkgewogI2lmZGVmIENPTkZJR19ORVRfRE1BCiAJCQlpZiAoIXRwLT51Y29weS5kbWFfY2hhbiAmJiB0cC0+dWNvcHkucGlubmVkX2xpc3QpCi0JCQkJdHAtPnVjb3B5LmRtYV9jaGFuID0gZ2V0X3NvZnRuZXRfZG1hKCk7CisJCQkJdHAtPnVjb3B5LmRtYV9jaGFuID0gZG1hX2ZpbmRfY2hhbm5lbChETUFfTUVNQ1BZKTsKIAogCQkJaWYgKHRwLT51Y29weS5kbWFfY2hhbikgewogCQkJCXRwLT51Y29weS5kbWFfY29va2llID0gZG1hX3NrYl9jb3B5X2RhdGFncmFtX2lvdmVjKApAQCAtMTYyOCw3ICsxNjM1LDYgQEAKIAogCQkvKiBTYWZlIHRvIGZyZWUgZWFybHktY29waWVkIHNrYnMgbm93ICovCiAJCV9fc2tiX3F1ZXVlX3B1cmdlKCZzay0+c2tfYXN5bmNfd2FpdF9xdWV1ZSk7Ci0JCWRtYV9jaGFuX3B1dCh0cC0+dWNvcHkuZG1hX2NoYW4pOwogCQl0cC0+dWNvcHkuZG1hX2NoYW4gPSBOVUxMOwogCX0KIAlpZiAodHAtPnVjb3B5LnBpbm5lZF9saXN0KSB7CkBAIC0yMzgzLDcgKzIzODksNyBAQAogCXVuc2lnbmVkIGludCBzZXE7CiAJX19iZTMyIGRlbHRhOwogCXVuc2lnbmVkIGludCBvbGRsZW47Ci0JdW5zaWduZWQgaW50IGxlbjsKKwl1bnNpZ25lZCBpbnQgbXNzOwogCiAJaWYgKCFwc2tiX21heV9wdWxsKHNrYiwgc2l6ZW9mKCp0aCkpKQogCQlnb3RvIG91dDsKQEAgLTIzOTksMTAgKzI0MDUsMTMgQEAKIAlvbGRsZW4gPSAodTE2KX5za2ItPmxlbjsKIAlfX3NrYl9wdWxsKHNrYiwgdGhsZW4pOwogCisJbXNzID0gc2tiX3NoaW5mbyhza2IpLT5nc29fc2l6ZTsKKwlpZiAodW5saWtlbHkoc2tiLT5sZW4gPD0gbXNzKSkKKwkJZ290byBvdXQ7CisKIAlpZiAoc2tiX2dzb19vayhza2IsIGZlYXR1cmVzIHwgTkVUSUZfRl9HU09fUk9CVVNUKSkgewogCQkvKiBQYWNrZXQgaXMgZnJvbSBhbiB1bnRydXN0ZWQgc291cmNlLCByZXNldCBnc29fc2Vncy4gKi8KIAkJaW50IHR5cGUgPSBza2Jfc2hpbmZvKHNrYiktPmdzb190eXBlOwotCQlpbnQgbXNzOwogCiAJCWlmICh1bmxpa2VseSh0eXBlICYKIAkJCSAgICAgfihTS0JfR1NPX1RDUFY0IHwKQEAgLTI0MTMsNyArMjQyMiw2IEBACiAJCQkgICAgICEodHlwZSAmIChTS0JfR1NPX1RDUFY0IHwgU0tCX0dTT19UQ1BWNikpKSkKIAkJCWdvdG8gb3V0OwogCi0JCW1zcyA9IHNrYl9zaGluZm8oc2tiKS0+Z3NvX3NpemU7CiAJCXNrYl9zaGluZm8oc2tiKS0+Z3NvX3NlZ3MgPSBESVZfUk9VTkRfVVAoc2tiLT5sZW4sIG1zcyk7CiAKIAkJc2VncyA9IE5VTEw7CkBAIC0yNDI0LDggKzI0MzIsNyBAQAogCWlmIChJU19FUlIoc2VncykpCiAJCWdvdG8gb3V0OwogCi0JbGVuID0gc2tiX3NoaW5mbyhza2IpLT5nc29fc2l6ZTsKLQlkZWx0YSA9IGh0b25sKG9sZGxlbiArICh0aGxlbiArIGxlbikpOworCWRlbHRhID0gaHRvbmwob2xkbGVuICsgKHRobGVuICsgbXNzKSk7CiAKIAlza2IgPSBzZWdzOwogCXRoID0gdGNwX2hkcihza2IpOwpAQCAtMjQ0MSw3ICsyNDQ4LDcgQEAKIAkJCSAgICAgY3N1bV9mb2xkKGNzdW1fcGFydGlhbChza2JfdHJhbnNwb3J0X2hlYWRlcihza2IpLAogCQkJCQkJICAgIHRobGVuLCBza2ItPmNzdW0pKTsKIAotCQlzZXEgKz0gbGVuOworCQlzZXEgKz0gbXNzOwogCQlza2IgPSBza2ItPm5leHQ7CiAJCXRoID0gdGNwX2hkcihza2IpOwogCkBAIC0yNTQyLDYgKzI1NDksNyBAQAogCiAJcmV0dXJuIHBwOwogfQorRVhQT1JUX1NZTUJPTCh0Y3BfZ3JvX3JlY2VpdmUpOwogCiBpbnQgdGNwX2dyb19jb21wbGV0ZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewpAQCAtMjU1OCw2ICsyNTY2LDcgQEAKIAogCXJldHVybiAwOwogfQorRVhQT1JUX1NZTUJPTCh0Y3BfZ3JvX2NvbXBsZXRlKTsKIAogI2lmZGVmIENPTkZJR19UQ1BfTUQ1U0lHCiBzdGF0aWMgdW5zaWduZWQgbG9uZyB0Y3BfbWQ1c2lnX3VzZXJzOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvdGNwX2lucHV0LmMgYi9uZXQvaXB2NC90Y3BfaW5wdXQuYwppbmRleCA5OWI3ZWNiLi5hNjk2MWQ3IDEwMDY0NAotLS0gYS9uZXQvaXB2NC90Y3BfaW5wdXQuYworKysgYi9uZXQvaXB2NC90Y3BfaW5wdXQuYwpAQCAtNTAwNSw3ICs1MDA1LDcgQEAKIAkJcmV0dXJuIDA7CiAKIAlpZiAoIXRwLT51Y29weS5kbWFfY2hhbiAmJiB0cC0+dWNvcHkucGlubmVkX2xpc3QpCi0JCXRwLT51Y29weS5kbWFfY2hhbiA9IGdldF9zb2Z0bmV0X2RtYSgpOworCQl0cC0+dWNvcHkuZG1hX2NoYW4gPSBkbWFfZmluZF9jaGFubmVsKERNQV9NRU1DUFkpOwogCiAJaWYgKHRwLT51Y29weS5kbWFfY2hhbiAmJiBza2JfY3N1bV91bm5lY2Vzc2FyeShza2IpKSB7CiAKZGlmZiAtLWdpdCBhL25ldC9pcHY0L3RjcF9pcHY0LmMgYi9uZXQvaXB2NC90Y3BfaXB2NC5jCmluZGV4IDlkODM5ZmEuLjE5ZDdiNDIgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L3RjcF9pcHY0LmMKKysrIGIvbmV0L2lwdjQvdGNwX2lwdjQuYwpAQCAtMTU5NCw3ICsxNTk0LDcgQEAKICNpZmRlZiBDT05GSUdfTkVUX0RNQQogCQlzdHJ1Y3QgdGNwX3NvY2sgKnRwID0gdGNwX3NrKHNrKTsKIAkJaWYgKCF0cC0+dWNvcHkuZG1hX2NoYW4gJiYgdHAtPnVjb3B5LnBpbm5lZF9saXN0KQotCQkJdHAtPnVjb3B5LmRtYV9jaGFuID0gZ2V0X3NvZnRuZXRfZG1hKCk7CisJCQl0cC0+dWNvcHkuZG1hX2NoYW4gPSBkbWFfZmluZF9jaGFubmVsKERNQV9NRU1DUFkpOwogCQlpZiAodHAtPnVjb3B5LmRtYV9jaGFuKQogCQkJcmV0ID0gdGNwX3Y0X2RvX3Jjdihzaywgc2tiKTsKIAkJZWxzZQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvYWZfaW5ldDYuYyBiL25ldC9pcHY2L2FmX2luZXQ2LmMKaW5kZXggNDM3Yjc1MC4uOTRmNzRmNSAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvYWZfaW5ldDYuYworKysgYi9uZXQvaXB2Ni9hZl9pbmV0Ni5jCkBAIC02NzIsOCArNjcyLDcgQEAKIAogRVhQT1JUX1NZTUJPTF9HUEwoaXB2Nl9vcHRfYWNjZXB0ZWQpOwogCi1zdGF0aWMgc3RydWN0IGluZXQ2X3Byb3RvY29sICppcHY2X2dzb19wdWxsX2V4dGhkcnMoc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCQkJCSAgICBpbnQgcHJvdG8pCitzdGF0aWMgaW50IGlwdjZfZ3NvX3B1bGxfZXh0aGRycyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgcHJvdG8pCiB7CiAJc3RydWN0IGluZXQ2X3Byb3RvY29sICpvcHMgPSBOVUxMOwogCkBAIC03MDQsNyArNzAzLDcgQEAKIAkJX19za2JfcHVsbChza2IsIGxlbik7CiAJfQogCi0JcmV0dXJuIG9wczsKKwlyZXR1cm4gcHJvdG87CiB9CiAKIHN0YXRpYyBpbnQgaXB2Nl9nc29fc2VuZF9jaGVjayhzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQpAQCAtNzIxLDcgKzcyMCw5IEBACiAJZXJyID0gLUVQUk9UT05PU1VQUE9SVDsKIAogCXJjdV9yZWFkX2xvY2soKTsKLQlvcHMgPSBpcHY2X2dzb19wdWxsX2V4dGhkcnMoc2tiLCBpcHY2aC0+bmV4dGhkcik7CisJb3BzID0gcmN1X2RlcmVmZXJlbmNlKGluZXQ2X3Byb3Rvc1sKKwkJaXB2Nl9nc29fcHVsbF9leHRoZHJzKHNrYiwgaXB2NmgtPm5leHRoZHIpXSk7CisKIAlpZiAobGlrZWx5KG9wcyAmJiBvcHMtPmdzb19zZW5kX2NoZWNrKSkgewogCQlza2JfcmVzZXRfdHJhbnNwb3J0X2hlYWRlcihza2IpOwogCQllcnIgPSBvcHMtPmdzb19zZW5kX2NoZWNrKHNrYik7CkBAIC03NTcsNyArNzU4LDkgQEAKIAlzZWdzID0gRVJSX1BUUigtRVBST1RPTk9TVVBQT1JUKTsKIAogCXJjdV9yZWFkX2xvY2soKTsKLQlvcHMgPSBpcHY2X2dzb19wdWxsX2V4dGhkcnMoc2tiLCBpcHY2aC0+bmV4dGhkcik7CisJb3BzID0gcmN1X2RlcmVmZXJlbmNlKGluZXQ2X3Byb3Rvc1sKKwkJaXB2Nl9nc29fcHVsbF9leHRoZHJzKHNrYiwgaXB2NmgtPm5leHRoZHIpXSk7CisKIAlpZiAobGlrZWx5KG9wcyAmJiBvcHMtPmdzb19zZWdtZW50KSkgewogCQlza2JfcmVzZXRfdHJhbnNwb3J0X2hlYWRlcihza2IpOwogCQlzZWdzID0gb3BzLT5nc29fc2VnbWVudChza2IsIGZlYXR1cmVzKTsKQEAgLTc3NywxMSArNzgwLDEwNSBAQAogCXJldHVybiBzZWdzOwogfQogCitzdHJ1Y3QgaXB2Nl9ncm9fY2IgeworCXN0cnVjdCBuYXBpX2dyb19jYiBuYXBpOworCWludCBwcm90bzsKK307CisKKyNkZWZpbmUgSVBWNl9HUk9fQ0Ioc2tiKSAoKHN0cnVjdCBpcHY2X2dyb19jYiAqKShza2IpLT5jYikKKworc3RhdGljIHN0cnVjdCBza19idWZmICoqaXB2Nl9ncm9fcmVjZWl2ZShzdHJ1Y3Qgc2tfYnVmZiAqKmhlYWQsCisJCQkJCSBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBpbmV0Nl9wcm90b2NvbCAqb3BzOworCXN0cnVjdCBza19idWZmICoqcHAgPSBOVUxMOworCXN0cnVjdCBza19idWZmICpwOworCXN0cnVjdCBpcHY2aGRyICppcGg7CisJdW5zaWduZWQgaW50IG5sZW47CisJaW50IGZsdXNoID0gMTsKKwlpbnQgcHJvdG87CisKKwlpZiAodW5saWtlbHkoIXBza2JfbWF5X3B1bGwoc2tiLCBzaXplb2YoKmlwaCkpKSkKKwkJZ290byBvdXQ7CisKKwlpcGggPSBpcHY2X2hkcihza2IpOworCV9fc2tiX3B1bGwoc2tiLCBzaXplb2YoKmlwaCkpOworCisJZmx1c2ggKz0gbnRvaHMoaXBoLT5wYXlsb2FkX2xlbikgIT0gc2tiLT5sZW47CisKKwlyY3VfcmVhZF9sb2NrKCk7CisJcHJvdG8gPSBpcHY2X2dzb19wdWxsX2V4dGhkcnMoc2tiLCBpcGgtPm5leHRoZHIpOworCUlQVjZfR1JPX0NCKHNrYiktPnByb3RvID0gcHJvdG87CisJb3BzID0gcmN1X2RlcmVmZXJlbmNlKGluZXQ2X3Byb3Rvc1twcm90b10pOworCWlmICghb3BzIHx8ICFvcHMtPmdyb19yZWNlaXZlKQorCQlnb3RvIG91dF91bmxvY2s7CisKKwlmbHVzaC0tOworCXNrYl9yZXNldF90cmFuc3BvcnRfaGVhZGVyKHNrYik7CisJbmxlbiA9IHNrYl9uZXR3b3JrX2hlYWRlcl9sZW4oc2tiKTsKKworCWZvciAocCA9ICpoZWFkOyBwOyBwID0gcC0+bmV4dCkgeworCQlzdHJ1Y3QgaXB2NmhkciAqaXBoMjsKKworCQlpZiAoIU5BUElfR1JPX0NCKHApLT5zYW1lX2Zsb3cpCisJCQljb250aW51ZTsKKworCQlpcGgyID0gaXB2Nl9oZHIocCk7CisKKwkJLyogQWxsIGZpZWxkcyBtdXN0IG1hdGNoIGV4Y2VwdCBsZW5ndGguICovCisJCWlmIChubGVuICE9IHNrYl9uZXR3b3JrX2hlYWRlcl9sZW4ocCkgfHwKKwkJICAgIG1lbWNtcChpcGgsIGlwaDIsIG9mZnNldG9mKHN0cnVjdCBpcHY2aGRyLCBwYXlsb2FkX2xlbikpIHx8CisJCSAgICBtZW1jbXAoJmlwaC0+bmV4dGhkciwgJmlwaDItPm5leHRoZHIsCisJCQkgICBubGVuIC0gb2Zmc2V0b2Yoc3RydWN0IGlwdjZoZHIsIG5leHRoZHIpKSkgeworCQkJTkFQSV9HUk9fQ0IocCktPnNhbWVfZmxvdyA9IDA7CisJCQljb250aW51ZTsKKwkJfQorCisJCU5BUElfR1JPX0NCKHApLT5mbHVzaCB8PSBmbHVzaDsKKwl9CisKKwlOQVBJX0dST19DQihza2IpLT5mbHVzaCB8PSBmbHVzaDsKKworCXBwID0gb3BzLT5ncm9fcmVjZWl2ZShoZWFkLCBza2IpOworCitvdXRfdW5sb2NrOgorCXJjdV9yZWFkX3VubG9jaygpOworCitvdXQ6CisJTkFQSV9HUk9fQ0Ioc2tiKS0+Zmx1c2ggfD0gZmx1c2g7CisKKwlyZXR1cm4gcHA7Cit9CisKK3N0YXRpYyBpbnQgaXB2Nl9ncm9fY29tcGxldGUoc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgaW5ldDZfcHJvdG9jb2wgKm9wczsKKwlzdHJ1Y3QgaXB2NmhkciAqaXBoID0gaXB2Nl9oZHIoc2tiKTsKKwlpbnQgZXJyID0gLUVOT1NZUzsKKworCWlwaC0+cGF5bG9hZF9sZW4gPSBodG9ucyhza2ItPmxlbiAtIHNrYl9uZXR3b3JrX29mZnNldChza2IpIC0KKwkJCQkgc2l6ZW9mKCppcGgpKTsKKworCXJjdV9yZWFkX2xvY2soKTsKKwlvcHMgPSByY3VfZGVyZWZlcmVuY2UoaW5ldDZfcHJvdG9zW0lQVjZfR1JPX0NCKHNrYiktPnByb3RvXSk7CisJaWYgKFdBUk5fT04oIW9wcyB8fCAhb3BzLT5ncm9fY29tcGxldGUpKQorCQlnb3RvIG91dF91bmxvY2s7CisKKwllcnIgPSBvcHMtPmdyb19jb21wbGV0ZShza2IpOworCitvdXRfdW5sb2NrOgorCXJjdV9yZWFkX3VubG9jaygpOworCisJcmV0dXJuIGVycjsKK30KKwogc3RhdGljIHN0cnVjdCBwYWNrZXRfdHlwZSBpcHY2X3BhY2tldF90eXBlID0gewogCS50eXBlID0gX19jb25zdGFudF9odG9ucyhFVEhfUF9JUFY2KSwKIAkuZnVuYyA9IGlwdjZfcmN2LAogCS5nc29fc2VuZF9jaGVjayA9IGlwdjZfZ3NvX3NlbmRfY2hlY2ssCiAJLmdzb19zZWdtZW50ID0gaXB2Nl9nc29fc2VnbWVudCwKKwkuZ3JvX3JlY2VpdmUgPSBpcHY2X2dyb19yZWNlaXZlLAorCS5ncm9fY29tcGxldGUgPSBpcHY2X2dyb19jb21wbGV0ZSwKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IGlwdjZfcGFja2V0X2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL25ldC9pcHY2L2lwNl9maWIuYyBiL25ldC9pcHY2L2lwNl9maWIuYwppbmRleCAyOWM3Yzk5Li41MmVlMWRjIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9pcDZfZmliLmMKKysrIGIvbmV0L2lwdjYvaXA2X2ZpYi5jCkBAIC0yOTgsNiArMjk4LDEwIEBACiAJc3RydWN0IGZpYjZfd2Fsa2VyX3QgKncgPSAodm9pZCopY2ItPmFyZ3NbMl07CiAKIAlpZiAodykgeworCQlpZiAoY2ItPmFyZ3NbNF0pIHsKKwkJCWNiLT5hcmdzWzRdID0gMDsKKwkJCWZpYjZfd2Fsa2VyX3VubGluayh3KTsKKwkJfQogCQljYi0+YXJnc1syXSA9IDA7CiAJCWtmcmVlKHcpOwogCX0KQEAgLTMzMCwxNSArMzM0LDEyIEBACiAJCXJlYWRfbG9ja19iaCgmdGFibGUtPnRiNl9sb2NrKTsKIAkJcmVzID0gZmliNl93YWxrX2NvbnRpbnVlKHcpOwogCQlyZWFkX3VubG9ja19iaCgmdGFibGUtPnRiNl9sb2NrKTsKLQkJaWYgKHJlcyAhPSAwKSB7Ci0JCQlpZiAocmVzIDwgMCkKLQkJCQlmaWI2X3dhbGtlcl91bmxpbmsodyk7Ci0JCQlnb3RvIGVuZDsKKwkJaWYgKHJlcyA8PSAwKSB7CisJCQlmaWI2X3dhbGtlcl91bmxpbmsodyk7CisJCQljYi0+YXJnc1s0XSA9IDA7CiAJCX0KLQkJZmliNl93YWxrZXJfdW5saW5rKHcpOwotCQljYi0+YXJnc1s0XSA9IDA7CiAJfQotZW5kOgorCiAJcmV0dXJuIHJlczsKIH0KIApkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19wcm90b19pY21wdjYuYyBiL25ldC9pcHY2L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHJvdG9faWNtcHY2LmMKaW5kZXggYmQ1MjE1MS4uYzQ1NWNmNCAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19wcm90b19pY21wdjYuYworKysgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3Byb3RvX2ljbXB2Ni5jCkBAIC0yNiw3ICsyNiw3IEBACiAjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9pcHY2L25mX2Nvbm50cmFja19pY21wdjYuaD4KICNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2xvZy5oPgogCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBuZl9jdF9pY21wdjZfdGltZW91dCBfX3JlYWRfbW9zdGx5ID0gMzAqSFo7CitzdGF0aWMgdW5zaWduZWQgaW50IG5mX2N0X2ljbXB2Nl90aW1lb3V0IF9fcmVhZF9tb3N0bHkgPSAzMCpIWjsKIAogc3RhdGljIGJvb2wgaWNtcHY2X3BrdF90b190dXBsZShjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkJCXVuc2lnbmVkIGludCBkYXRhb2ZmLApkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvcm91dGUuYyBiL25ldC9pcHY2L3JvdXRlLmMKaW5kZXggNzZmMDZiOS4uYzRhNTk4MiAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvcm91dGUuYworKysgYi9uZXQvaXB2Ni9yb3V0ZS5jCkBAIC0yNzUyLDcgKzI3NTIsNyBAQAogCQlrbWVtX2NhY2hlX2NyZWF0ZSgiaXA2X2RzdF9jYWNoZSIsIHNpemVvZihzdHJ1Y3QgcnQ2X2luZm8pLCAwLAogCQkJCSAgU0xBQl9IV0NBQ0hFX0FMSUdOLCBOVUxMKTsKIAlpZiAoIWlwNl9kc3Rfb3BzX3RlbXBsYXRlLmttZW1fY2FjaGVwKQotCQlnb3RvIG91dDs7CisJCWdvdG8gb3V0OwogCiAJcmV0ID0gcmVnaXN0ZXJfcGVybmV0X3N1YnN5cygmaXA2X3JvdXRlX25ldF9vcHMpOwogCWlmIChyZXQpCmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9zeXNjdGxfbmV0X2lwdjYuYyBiL25ldC9pcHY2L3N5c2N0bF9uZXRfaXB2Ni5jCmluZGV4IDkwNDhmZTcuLmEwMzEwMzQgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L3N5c2N0bF9uZXRfaXB2Ni5jCisrKyBiL25ldC9pcHY2L3N5c2N0bF9uZXRfaXB2Ni5jCkBAIC0xMjgsNyArMTI4LDcgQEAKIAogaW50IGlwdjZfc3lzY3RsX3JlZ2lzdGVyKHZvaWQpCiB7Ci0JaW50IGVyciA9IC1FTk9NRU07OworCWludCBlcnIgPSAtRU5PTUVNOwogCiAJaXA2X2hlYWRlciA9IHJlZ2lzdGVyX25ldF9zeXNjdGxfcm90YWJsZShuZXRfaXB2Nl9jdGxfcGF0aCwgaXB2Nl90YWJsZSk7CiAJaWYgKGlwNl9oZWFkZXIgPT0gTlVMTCkKZGlmZiAtLWdpdCBhL25ldC9pcHY2L3RjcF9pcHY2LmMgYi9uZXQvaXB2Ni90Y3BfaXB2Ni5jCmluZGV4IGU4YjgzMzcuLmU1Yjg1ZDQgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L3RjcF9pcHY2LmMKKysrIGIvbmV0L2lwdjYvdGNwX2lwdjYuYwpAQCAtMTAxLDcgKzEwMSw3IEBACiAJfQogfQogCi1zdGF0aWMgX19pbmxpbmVfXyBfX3N1bTE2IHRjcF92Nl9jaGVjayhzdHJ1Y3QgdGNwaGRyICp0aCwgaW50IGxlbiwKK3N0YXRpYyBfX2lubGluZV9fIF9fc3VtMTYgdGNwX3Y2X2NoZWNrKGludCBsZW4sCiAJCQkJICAgc3RydWN0IGluNl9hZGRyICpzYWRkciwKIAkJCQkgICBzdHJ1Y3QgaW42X2FkZHIgKmRhZGRyLAogCQkJCSAgIF9fd3N1bSBiYXNlKQpAQCAtNTAxLDcgKzUwMSw3IEBACiAJaWYgKHNrYikgewogCQlzdHJ1Y3QgdGNwaGRyICp0aCA9IHRjcF9oZHIoc2tiKTsKIAotCQl0aC0+Y2hlY2sgPSB0Y3BfdjZfY2hlY2sodGgsIHNrYi0+bGVuLAorCQl0aC0+Y2hlY2sgPSB0Y3BfdjZfY2hlY2soc2tiLT5sZW4sCiAJCQkJCSAmdHJlcS0+bG9jX2FkZHIsICZ0cmVxLT5ybXRfYWRkciwKIAkJCQkJIGNzdW1fcGFydGlhbCh0aCwgc2tiLT5sZW4sIHNrYi0+Y3N1bSkpOwogCkBAIC05NDIsNiArOTQyLDQxIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0cnVjdCBza19idWZmICoqdGNwNl9ncm9fcmVjZWl2ZShzdHJ1Y3Qgc2tfYnVmZiAqKmhlYWQsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGlwdjZoZHIgKmlwaCA9IGlwdjZfaGRyKHNrYik7CisKKwlzd2l0Y2ggKHNrYi0+aXBfc3VtbWVkKSB7CisJY2FzZSBDSEVDS1NVTV9DT01QTEVURToKKwkJaWYgKCF0Y3BfdjZfY2hlY2soc2tiLT5sZW4sICZpcGgtPnNhZGRyLCAmaXBoLT5kYWRkciwKKwkJCQkgIHNrYi0+Y3N1bSkpIHsKKwkJCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fVU5ORUNFU1NBUlk7CisJCQlicmVhazsKKwkJfQorCisJCS8qIGZhbGwgdGhyb3VnaCAqLworCWNhc2UgQ0hFQ0tTVU1fTk9ORToKKwkJTkFQSV9HUk9fQ0Ioc2tiKS0+Zmx1c2ggPSAxOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlyZXR1cm4gdGNwX2dyb19yZWNlaXZlKGhlYWQsIHNrYik7Cit9CitFWFBPUlRfU1lNQk9MKHRjcDZfZ3JvX3JlY2VpdmUpOworCitpbnQgdGNwNl9ncm9fY29tcGxldGUoc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgaXB2NmhkciAqaXBoID0gaXB2Nl9oZHIoc2tiKTsKKwlzdHJ1Y3QgdGNwaGRyICp0aCA9IHRjcF9oZHIoc2tiKTsKKworCXRoLT5jaGVjayA9IH50Y3BfdjZfY2hlY2soc2tiLT5sZW4gLSBza2JfdHJhbnNwb3J0X29mZnNldChza2IpLAorCQkJCSAgJmlwaC0+c2FkZHIsICZpcGgtPmRhZGRyLCAwKTsKKwlza2Jfc2hpbmZvKHNrYiktPmdzb190eXBlID0gU0tCX0dTT19UQ1BWNjsKKworCXJldHVybiB0Y3BfZ3JvX2NvbXBsZXRlKHNrYik7Cit9CitFWFBPUlRfU1lNQk9MKHRjcDZfZ3JvX2NvbXBsZXRlKTsKKwogc3RhdGljIHZvaWQgdGNwX3Y2X3NlbmRfcmVzcG9uc2Uoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTMyIHNlcSwgdTMyIGFjaywgdTMyIHdpbiwKIAkJCQkgdTMyIHRzLCBzdHJ1Y3QgdGNwX21kNXNpZ19rZXkgKmtleSwgaW50IHJzdCkKIHsKQEAgLTE0MjksMTQgKzE0NjQsMTQgQEAKIHN0YXRpYyBfX3N1bTE2IHRjcF92Nl9jaGVja3N1bV9pbml0KHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJaWYgKHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX0NPTVBMRVRFKSB7Ci0JCWlmICghdGNwX3Y2X2NoZWNrKHRjcF9oZHIoc2tiKSwgc2tiLT5sZW4sICZpcHY2X2hkcihza2IpLT5zYWRkciwKKwkJaWYgKCF0Y3BfdjZfY2hlY2soc2tiLT5sZW4sICZpcHY2X2hkcihza2IpLT5zYWRkciwKIAkJCQkgICZpcHY2X2hkcihza2IpLT5kYWRkciwgc2tiLT5jc3VtKSkgewogCQkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9VTk5FQ0VTU0FSWTsKIAkJCXJldHVybiAwOwogCQl9CiAJfQogCi0Jc2tiLT5jc3VtID0gfmNzdW1fdW5mb2xkKHRjcF92Nl9jaGVjayh0Y3BfaGRyKHNrYiksIHNrYi0+bGVuLAorCXNrYi0+Y3N1bSA9IH5jc3VtX3VuZm9sZCh0Y3BfdjZfY2hlY2soc2tiLT5sZW4sCiAJCQkJCSAgICAgICZpcHY2X2hkcihza2IpLT5zYWRkciwKIAkJCQkJICAgICAgJmlwdjZfaGRyKHNrYiktPmRhZGRyLCAwKSk7CiAKQEAgLTE2NDAsNyArMTY3NSw3IEBACiAjaWZkZWYgQ09ORklHX05FVF9ETUEKIAkJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7CiAJCWlmICghdHAtPnVjb3B5LmRtYV9jaGFuICYmIHRwLT51Y29weS5waW5uZWRfbGlzdCkKLQkJCXRwLT51Y29weS5kbWFfY2hhbiA9IGdldF9zb2Z0bmV0X2RtYSgpOworCQkJdHAtPnVjb3B5LmRtYV9jaGFuID0gZG1hX2ZpbmRfY2hhbm5lbChETUFfTUVNQ1BZKTsKIAkJaWYgKHRwLT51Y29weS5kbWFfY2hhbikKIAkJCXJldCA9IHRjcF92Nl9kb19yY3Yoc2ssIHNrYik7CiAJCWVsc2UKQEAgLTIwNjIsNiArMjA5Nyw4IEBACiAJLmVycl9oYW5kbGVyCT0JdGNwX3Y2X2VyciwKIAkuZ3NvX3NlbmRfY2hlY2sJPQl0Y3BfdjZfZ3NvX3NlbmRfY2hlY2ssCiAJLmdzb19zZWdtZW50CT0JdGNwX3Rzb19zZWdtZW50LAorCS5ncm9fcmVjZWl2ZQk9CXRjcDZfZ3JvX3JlY2VpdmUsCisJLmdyb19jb21wbGV0ZQk9CXRjcDZfZ3JvX2NvbXBsZXRlLAogCS5mbGFncwkJPQlJTkVUNl9QUk9UT19OT1BPTElDWXxJTkVUNl9QUk9UT19GSU5BTCwKIH07CiAKZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS9odC5jIGIvbmV0L21hYzgwMjExL2h0LmMKaW5kZXggNWY1MTBhMS4uYzVjMGM1MiAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL2h0LmMKKysrIGIvbmV0L21hYzgwMjExL2h0LmMKQEAgLTQ2OSw3ICs0NjksNyBAQAogCXN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhOwogCXUxNiBzdGFydF9zZXFfbnVtOwogCXU4ICpzdGF0ZTsKLQlpbnQgcmV0OworCWludCByZXQgPSAwOwogCiAJaWYgKCh0aWQgPj0gU1RBX1RJRF9OVU0pIHx8ICEoaHctPmZsYWdzICYgSUVFRTgwMjExX0hXX0FNUERVX0FHR1JFR0FUSU9OKSkKIAkJcmV0dXJuIC1FSU5WQUw7CmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvaWZhY2UuYyBiL25ldC9tYWM4MDIxMS9pZmFjZS5jCmluZGV4IDVhYmJjM2YuLmI5MDc0ODIgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS9pZmFjZS5jCisrKyBiL25ldC9tYWM4MDIxMS9pZmFjZS5jCkBAIC02OTksNyArNjk5LDggQEAKIAkJcmV0dXJuIDA7CiAKIAkvKiBTZXR0aW5nIGFkLWhvYyBtb2RlIG9uIG5vbi1JQlNTIGNoYW5uZWwgaXMgbm90IHN1cHBvcnRlZC4gKi8KLQlpZiAoc2RhdGEtPmxvY2FsLT5vcGVyX2NoYW5uZWwtPmZsYWdzICYgSUVFRTgwMjExX0NIQU5fTk9fSUJTUykKKwlpZiAoc2RhdGEtPmxvY2FsLT5vcGVyX2NoYW5uZWwtPmZsYWdzICYgSUVFRTgwMjExX0NIQU5fTk9fSUJTUyAmJgorCSAgICB0eXBlID09IE5MODAyMTFfSUZUWVBFX0FESE9DKQogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAKIAkvKgpkaWZmIC0tZ2l0IGEvbmV0L21hYzgwMjExL21lc2hfcGxpbmsuYyBiL25ldC9tYWM4MDIxMS9tZXNoX3BsaW5rLmMKaW5kZXggOTI5YmE1NC4uMTE1OWJkYiAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL21lc2hfcGxpbmsuYworKysgYi9uZXQvbWFjODAyMTEvbWVzaF9wbGluay5jCkBAIC0xMDcsNiArMTA3LDcgQEAKIAogCXN0YS0+ZmxhZ3MgPSBXTEFOX1NUQV9BVVRIT1JJWkVEOwogCXN0YS0+c3RhLnN1cHBfcmF0ZXNbbG9jYWwtPmh3LmNvbmYuY2hhbm5lbC0+YmFuZF0gPSByYXRlczsKKwlyYXRlX2NvbnRyb2xfcmF0ZV9pbml0KHN0YSk7CiAKIAlyZXR1cm4gc3RhOwogfQpkaWZmIC0tZ2l0IGEvbmV0L21hYzgwMjExL3JjODAyMTFfbWluc3RyZWwuYyBiL25ldC9tYWM4MDIxMS9yYzgwMjExX21pbnN0cmVsLmMKaW5kZXggMmIzYjQ5MC4uMzgyNDk5MCAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL3JjODAyMTFfbWluc3RyZWwuYworKysgYi9uZXQvbWFjODAyMTEvcmM4MDIxMV9taW5zdHJlbC5jCkBAIC0zOTUsMTMgKzM5NSwxNSBAQAogewogCXN0cnVjdCBtaW5zdHJlbF9zdGFfaW5mbyAqbWkgPSBwcml2X3N0YTsKIAlzdHJ1Y3QgbWluc3RyZWxfcHJpdiAqbXAgPSBwcml2OwotCXN0cnVjdCBtaW5zdHJlbF9yYXRlICptcl9jdGw7CisJc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwgPSBod190b19sb2NhbChtcC0+aHcpOworCXN0cnVjdCBpZWVlODAyMTFfcmF0ZSAqY3RsX3JhdGU7CiAJdW5zaWduZWQgaW50IGksIG4gPSAwOwogCXVuc2lnbmVkIGludCB0X3Nsb3QgPSA5OyAvKiBGSVhNRTogZ2V0IHJlYWwgc2xvdCB0aW1lICovCiAKIAltaS0+bG93ZXN0X3JpeCA9IHJhdGVfbG93ZXN0X2luZGV4KHNiYW5kLCBzdGEpOwotCW1yX2N0bCA9ICZtaS0+cltyaXhfdG9fbmR4KG1pLCBtaS0+bG93ZXN0X3JpeCldOwotCW1pLT5zcF9hY2tfZHVyID0gbXJfY3RsLT5hY2tfdGltZTsKKwljdGxfcmF0ZSA9ICZzYmFuZC0+Yml0cmF0ZXNbbWktPmxvd2VzdF9yaXhdOworCW1pLT5zcF9hY2tfZHVyID0gaWVlZTgwMjExX2ZyYW1lX2R1cmF0aW9uKGxvY2FsLCAxMCwgY3RsX3JhdGUtPmJpdHJhdGUsCisJCQkJISEoY3RsX3JhdGUtPmZsYWdzICYgSUVFRTgwMjExX1JBVEVfRVJQX0cpLCAxKTsKIAogCWZvciAoaSA9IDA7IGkgPCBzYmFuZC0+bl9iaXRyYXRlczsgaSsrKSB7CiAJCXN0cnVjdCBtaW5zdHJlbF9yYXRlICptciA9ICZtaS0+cltuXTsKQEAgLTQxNiw3ICs0MTgsNyBAQAogCiAJCW1yLT5yaXggPSBpOwogCQltci0+Yml0cmF0ZSA9IHNiYW5kLT5iaXRyYXRlc1tpXS5iaXRyYXRlIC8gNTsKLQkJY2FsY19yYXRlX2R1cmF0aW9ucyhtaSwgaHdfdG9fbG9jYWwobXAtPmh3KSwgbXIsCisJCWNhbGNfcmF0ZV9kdXJhdGlvbnMobWksIGxvY2FsLCBtciwKIAkJCQkmc2JhbmQtPmJpdHJhdGVzW2ldKTsKIAogCQkvKiBjYWxjdWxhdGUgbWF4aW11bSBudW1iZXIgb2YgcmV0cmFuc21pc3Npb25zIGJlZm9yZQpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfY29yZS5jIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfY29yZS5jCmluZGV4IDdlODNmNzQuLjkwY2U5ZGQgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2NvcmUuYworKysgYi9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19jb3JlLmMKQEAgLTQ2OSw3ICs0NjksNyBAQAogCQkJCSAgIGNvbnN0IHN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGUgKnJlcGwsCiAJCQkJICAgZ2ZwX3QgZ2ZwKQogewotCXN0cnVjdCBuZl9jb25uICpjdCA9IE5VTEw7CisJc3RydWN0IG5mX2Nvbm4gKmN0OwogCiAJaWYgKHVubGlrZWx5KCFuZl9jb25udHJhY2tfaGFzaF9ybmRfaW5pdHRlZCkpIHsKIAkJZ2V0X3JhbmRvbV9ieXRlcygmbmZfY29ubnRyYWNrX2hhc2hfcm5kLCA0KTsKQEAgLTU1MSw3ICs1NTEsNyBAQAogCX0KIAogCWN0ID0gbmZfY29ubnRyYWNrX2FsbG9jKG5ldCwgdHVwbGUsICZyZXBsX3R1cGxlLCBHRlBfQVRPTUlDKTsKLQlpZiAoY3QgPT0gTlVMTCB8fCBJU19FUlIoY3QpKSB7CisJaWYgKElTX0VSUihjdCkpIHsKIAkJcHJfZGVidWcoIkNhbid0IGFsbG9jYXRlIGNvbm50cmFjay5cbiIpOwogCQlyZXR1cm4gKHN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGVfaGFzaCAqKWN0OwogCX0KZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX25ldGxpbmsuYyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX25ldGxpbmsuYwppbmRleCAwMGU4YzI3Li4zZGRkZWM2IDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19uZXRsaW5rLmMKKysrIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfbmV0bGluay5jCkBAIC0xMTM0LDcgKzExMzQsNyBAQAogCXN0cnVjdCBuZl9jb25udHJhY2tfaGVscGVyICpoZWxwZXI7CiAKIAljdCA9IG5mX2Nvbm50cmFja19hbGxvYygmaW5pdF9uZXQsIG90dXBsZSwgcnR1cGxlLCBHRlBfQVRPTUlDKTsKLQlpZiAoY3QgPT0gTlVMTCB8fCBJU19FUlIoY3QpKQorCWlmIChJU19FUlIoY3QpKQogCQlyZXR1cm4gLUVOT01FTTsKIAogCWlmICghY2RhW0NUQV9USU1FT1VUXSkKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIveF90YWJsZXMuYyBiL25ldC9uZXRmaWx0ZXIveF90YWJsZXMuYwppbmRleCA4OTgzN2E0Li5iZmJmNTIxIDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL3hfdGFibGVzLmMKKysrIGIvbmV0L25ldGZpbHRlci94X3RhYmxlcy5jCkBAIC0yNzMsNiArMjczLDEwIEBACiAJCQkJaGF2ZV9yZXYgPSAxOwogCQl9CiAJfQorCisJaWYgKGFmICE9IE5GUFJPVE9fVU5TUEVDICYmICFoYXZlX3JldikKKwkJcmV0dXJuIG1hdGNoX3JldmZuKE5GUFJPVE9fVU5TUEVDLCBuYW1lLCByZXZpc2lvbiwgYmVzdHApOworCiAJcmV0dXJuIGhhdmVfcmV2OwogfQogCkBAIC0yODksNiArMjkzLDEwIEBACiAJCQkJaGF2ZV9yZXYgPSAxOwogCQl9CiAJfQorCisJaWYgKGFmICE9IE5GUFJPVE9fVU5TUEVDICYmICFoYXZlX3JldikKKwkJcmV0dXJuIHRhcmdldF9yZXZmbihORlBST1RPX1VOU1BFQywgbmFtZSwgcmV2aXNpb24sIGJlc3RwKTsKKwogCXJldHVybiBoYXZlX3JldjsKIH0KIApkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci94dF90aW1lLmMgYi9uZXQvbmV0ZmlsdGVyL3h0X3RpbWUuYwppbmRleCAyOTM3NWJhLi45M2FjYWE1IDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL3h0X3RpbWUuYworKysgYi9uZXQvbmV0ZmlsdGVyL3h0X3RpbWUuYwpAQCAtMjQzLDYgKzI0MywxNyBAQAogCiBzdGF0aWMgaW50IF9faW5pdCB0aW1lX210X2luaXQodm9pZCkKIHsKKwlpbnQgbWludXRlcyA9IHN5c190ei50el9taW51dGVzd2VzdDsKKworCWlmIChtaW51dGVzIDwgMCkgLyogZWFzdCBvZiBHcmVlbndpY2ggKi8KKwkJcHJpbnRrKEtFUk5fSU5GTyBLQlVJTERfTU9ETkFNRQorCQkgICAgICAgIjoga2VybmVsIHRpbWV6b25lIGlzICslMDJkJTAyZFxuIiwKKwkJICAgICAgIC1taW51dGVzIC8gNjAsIC1taW51dGVzICUgNjApOworCWVsc2UgLyogd2VzdCBvZiBHcmVlbndpY2ggKi8KKwkJcHJpbnRrKEtFUk5fSU5GTyBLQlVJTERfTU9ETkFNRQorCQkgICAgICAgIjoga2VybmVsIHRpbWV6b25lIGlzIC0lMDJkJTAyZFxuIiwKKwkJICAgICAgIG1pbnV0ZXMgLyA2MCwgbWludXRlcyAlIDYwKTsKKwogCXJldHVybiB4dF9yZWdpc3Rlcl9tYXRjaCgmeHRfdGltZV9tdF9yZWcpOwogfQogCmRpZmYgLS1naXQgYS9uZXQvbmV0bGluay9nZW5ldGxpbmsuYyBiL25ldC9uZXRsaW5rL2dlbmV0bGluay5jCmluZGV4IDNlMTE5MWMuLjFkM2RkMzAgMTAwNjQ0Ci0tLSBhL25ldC9uZXRsaW5rL2dlbmV0bGluay5jCisrKyBiL25ldC9uZXRsaW5rL2dlbmV0bGluay5jCkBAIC0yMjUsNiArMjI1LDcgQEAKIAlfX2dlbmxfdW5yZWdpc3Rlcl9tY19ncm91cChmYW1pbHksIGdycCk7CiAJZ2VubF91bmxvY2soKTsKIH0KK0VYUE9SVF9TWU1CT0woZ2VubF91bnJlZ2lzdGVyX21jX2dyb3VwKTsKIAogc3RhdGljIHZvaWQgZ2VubF91bnJlZ2lzdGVyX21jX2dyb3VwcyhzdHJ1Y3QgZ2VubF9mYW1pbHkgKmZhbWlseSkKIHsKZGlmZiAtLWdpdCBhL25ldC9waG9uZXQvcGVwLWdwcnMuYyBiL25ldC9waG9uZXQvcGVwLWdwcnMuYwppbmRleCBiMGNlYWMyLi42YTkxYTMyIDEwMDY0NAotLS0gYS9uZXQvcGhvbmV0L3BlcC1ncHJzLmMKKysrIGIvbmV0L3Bob25ldC9wZXAtZ3Bycy5jCkBAIC0yMjcsNiArMjI3LDEzIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgZ3Byc19uZXRkZXZfb3BzID0geworCS5uZG9fb3Blbgk9IGdwcnNfb3BlbiwKKwkubmRvX3N0b3AJPSBncHJzX2Nsb3NlLAorCS5uZG9fc3RhcnRfeG1pdAk9IGdwcnNfeG1pdCwKKwkubmRvX2NoYW5nZV9tdHUJPSBncHJzX3NldF9tdHUsCit9OworCiBzdGF0aWMgdm9pZCBncHJzX3NldHVwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJZGV2LT5mZWF0dXJlcwkJPSBORVRJRl9GX0ZSQUdMSVNUOwpAQCAtMjM3LDExICsyNDQsOCBAQAogCWRldi0+YWRkcl9sZW4JCT0gMDsKIAlkZXYtPnR4X3F1ZXVlX2xlbgk9IDEwOwogCisJZGV2LT5uZXRkZXZfb3BzCQk9ICZncHJzX25ldGRldl9vcHM7CiAJZGV2LT5kZXN0cnVjdG9yCQk9IGZyZWVfbmV0ZGV2OwotCWRldi0+b3BlbgkJPSBncHJzX29wZW47Ci0JZGV2LT5zdG9wCQk9IGdwcnNfY2xvc2U7Ci0JZGV2LT5oYXJkX3N0YXJ0X3htaXQJPSBncHJzX3htaXQ7IC8qIG1hbmRhdG9yeSAqLwotCWRldi0+Y2hhbmdlX210dQkJPSBncHJzX3NldF9tdHU7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvc2NoX2h0Yi5jIGIvbmV0L3NjaGVkL3NjaF9odGIuYwppbmRleCA1MDcwNjQzLi4yZjBmMGIwIDEwMDY0NAotLS0gYS9uZXQvc2NoZWQvc2NoX2h0Yi5jCisrKyBiL25ldC9zY2hlZC9zY2hfaHRiLmMKQEAgLTY2MSwxMiArNjYxLDEzIEBACiAgKiBuZXh0IHBlbmRpbmcgZXZlbnQgKDAgZm9yIG5vIGV2ZW50IGluIHBxKS4KICAqIE5vdGU6IEFwcGxpZWQgYXJlIGV2ZW50cyB3aG9zZSBoYXZlIGNsLT5wcV9rZXkgPD0gcS0+bm93LgogICovCi1zdGF0aWMgcHNjaGVkX3RpbWVfdCBodGJfZG9fZXZlbnRzKHN0cnVjdCBodGJfc2NoZWQgKnEsIGludCBsZXZlbCkKK3N0YXRpYyBwc2NoZWRfdGltZV90IGh0Yl9kb19ldmVudHMoc3RydWN0IGh0Yl9zY2hlZCAqcSwgaW50IGxldmVsLAorCQkJCSAgIHVuc2lnbmVkIGxvbmcgc3RhcnQpCiB7CiAJLyogZG9uJ3QgcnVuIGZvciBsb25nZXIgdGhhbiAyIGppZmZpZXM7IDIgaXMgdXNlZCBpbnN0ZWFkIG9mCiAJICAgMSB0byBzaW1wbGlmeSB0aGluZ3Mgd2hlbiBqaWZmeSBpcyBnb2luZyB0byBiZSBpbmNyZW1lbnRlZAogCSAgIHRvbyBzb29uICovCi0JdW5zaWduZWQgbG9uZyBzdG9wX2F0ID0gamlmZmllcyArIDI7CisJdW5zaWduZWQgbG9uZyBzdG9wX2F0ID0gc3RhcnQgKyAyOwogCXdoaWxlICh0aW1lX2JlZm9yZShqaWZmaWVzLCBzdG9wX2F0KSkgewogCQlzdHJ1Y3QgaHRiX2NsYXNzICpjbDsKIAkJbG9uZyBkaWZmOwpAQCAtNjg1LDggKzY4Niw4IEBACiAJCWlmIChjbC0+Y21vZGUgIT0gSFRCX0NBTl9TRU5EKQogCQkJaHRiX2FkZF90b193YWl0X3RyZWUocSwgY2wsIGRpZmYpOwogCX0KLQkvKiB0b28gbXVjaCBsb2FkIC0gbGV0J3MgY29udGludWUgb24gbmV4dCBqaWZmaWUgKi8KLQlyZXR1cm4gcS0+bm93ICsgUFNDSEVEX1RJQ0tTX1BFUl9TRUMgLyBIWjsKKwkvKiB0b28gbXVjaCBsb2FkIC0gbGV0J3MgY29udGludWUgb24gbmV4dCBqaWZmaWUgKGluY2x1ZGluZyBhYm92ZSkgKi8KKwlyZXR1cm4gcS0+bm93ICsgMiAqIFBTQ0hFRF9USUNLU19QRVJfU0VDIC8gSFo7CiB9CiAKIC8qIFJldHVybnMgY2xhc3MtPm5vZGUrcHJpbyBmcm9tIGlkLXRyZWUgd2hlcmUgY2xhc3NlJ3MgaWQgaXMgPj0gaWQuIE5VTEwKQEAgLTg0NSw2ICs4NDYsNyBAQAogCXN0cnVjdCBodGJfc2NoZWQgKnEgPSBxZGlzY19wcml2KHNjaCk7CiAJaW50IGxldmVsOwogCXBzY2hlZF90aW1lX3QgbmV4dF9ldmVudDsKKwl1bnNpZ25lZCBsb25nIHN0YXJ0X2F0OwogCiAJLyogdHJ5IHRvIGRlcXVldWUgZGlyZWN0IHBhY2tldHMgYXMgaGlnaCBwcmlvICghKSB0byBtaW5pbWl6ZSBjcHUgd29yayAqLwogCXNrYiA9IF9fc2tiX2RlcXVldWUoJnEtPmRpcmVjdF9xdWV1ZSk7CkBAIC04NTcsNiArODU5LDcgQEAKIAlpZiAoIXNjaC0+cS5xbGVuKQogCQlnb3RvIGZpbjsKIAlxLT5ub3cgPSBwc2NoZWRfZ2V0X3RpbWUoKTsKKwlzdGFydF9hdCA9IGppZmZpZXM7CiAKIAluZXh0X2V2ZW50ID0gcS0+bm93ICsgNSAqIFBTQ0hFRF9USUNLU19QRVJfU0VDOwogCkBAIC04NjYsMTQgKzg2OSwxNCBAQAogCQlwc2NoZWRfdGltZV90IGV2ZW50OwogCiAJCWlmIChxLT5ub3cgPj0gcS0+bmVhcl9ldl9jYWNoZVtsZXZlbF0pIHsKLQkJCWV2ZW50ID0gaHRiX2RvX2V2ZW50cyhxLCBsZXZlbCk7CisJCQlldmVudCA9IGh0Yl9kb19ldmVudHMocSwgbGV2ZWwsIHN0YXJ0X2F0KTsKIAkJCWlmICghZXZlbnQpCiAJCQkJZXZlbnQgPSBxLT5ub3cgKyBQU0NIRURfVElDS1NfUEVSX1NFQzsKIAkJCXEtPm5lYXJfZXZfY2FjaGVbbGV2ZWxdID0gZXZlbnQ7CiAJCX0gZWxzZQogCQkJZXZlbnQgPSBxLT5uZWFyX2V2X2NhY2hlW2xldmVsXTsKIAotCQlpZiAoZXZlbnQgJiYgbmV4dF9ldmVudCA+IGV2ZW50KQorCQlpZiAobmV4dF9ldmVudCA+IGV2ZW50KQogCQkJbmV4dF9ldmVudCA9IGV2ZW50OwogCiAJCW0gPSB+cS0+cm93X21hc2tbbGV2ZWxdOwpkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL3NjaF9zZnEuYyBiL25ldC9zY2hlZC9zY2hfc2ZxLmMKaW5kZXggZjM5NjVkZi4uMzMxMzNkMiAxMDA2NDQKLS0tIGEvbmV0L3NjaGVkL3NjaF9zZnEuYworKysgYi9uZXQvc2NoZWQvc2NoX3NmcS5jCkBAIC00MzUsNyArNDM1LDcgQEAKIAlpbnQgaTsKIAogCXEtPnBlcnR1cmJfdGltZXIuZnVuY3Rpb24gPSBzZnFfcGVydHVyYmF0aW9uOwotCXEtPnBlcnR1cmJfdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKXNjaDs7CisJcS0+cGVydHVyYl90aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpc2NoOwogCWluaXRfdGltZXJfZGVmZXJyYWJsZSgmcS0+cGVydHVyYl90aW1lcik7CiAKIAlmb3IgKGkgPSAwOyBpIDwgU0ZRX0hBU0hfRElWSVNPUjsgaSsrKQpkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL3NjaF90ZXFsLmMgYi9uZXQvc2NoZWQvc2NoX3RlcWwuYwppbmRleCBjZmM4ZTdjLi5lYzY5N2NlIDEwMDY0NAotLS0gYS9uZXQvc2NoZWQvc2NoX3RlcWwuYworKysgYi9uZXQvc2NoZWQvc2NoX3RlcWwuYwpAQCAtMjg5LDkgKzI4OSw5IEBACiAKIAlkbyB7CiAJCXN0cnVjdCBuZXRfZGV2aWNlICpzbGF2ZSA9IHFkaXNjX2RldihxKTsKLQkJc3RydWN0IG5ldGRldl9xdWV1ZSAqc2xhdmVfdHhxOworCQlzdHJ1Y3QgbmV0ZGV2X3F1ZXVlICpzbGF2ZV90eHEgPSBuZXRkZXZfZ2V0X3R4X3F1ZXVlKHNsYXZlLCAwKTsKKwkJY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzICpzbGF2ZV9vcHMgPSBzbGF2ZS0+bmV0ZGV2X29wczsKIAotCQlzbGF2ZV90eHEgPSBuZXRkZXZfZ2V0X3R4X3F1ZXVlKHNsYXZlLCAwKTsKIAkJaWYgKHNsYXZlX3R4cS0+cWRpc2Nfc2xlZXBpbmcgIT0gcSkKIAkJCWNvbnRpbnVlOwogCQlpZiAoX19uZXRpZl9zdWJxdWV1ZV9zdG9wcGVkKHNsYXZlLCBzdWJxKSB8fApAQCAtMzA1LDcgKzMwNSw3IEBACiAJCQlpZiAoX19uZXRpZl90eF90cnlsb2NrKHNsYXZlX3R4cSkpIHsKIAkJCQlpZiAoIW5ldGlmX3R4X3F1ZXVlX3N0b3BwZWQoc2xhdmVfdHhxKSAmJgogCQkJCSAgICAhbmV0aWZfdHhfcXVldWVfZnJvemVuKHNsYXZlX3R4cSkgJiYKLQkJCQkgICAgc2xhdmUtPmhhcmRfc3RhcnRfeG1pdChza2IsIHNsYXZlKSA9PSAwKSB7CisJCQkJICAgIHNsYXZlX29wcy0+bmRvX3N0YXJ0X3htaXQoc2tiLCBzbGF2ZSkgPT0gMCkgewogCQkJCQlfX25ldGlmX3R4X3VubG9jayhzbGF2ZV90eHEpOwogCQkJCQltYXN0ZXItPnNsYXZlcyA9IE5FWFRfU0xBVkUocSk7CiAJCQkJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKQEAgLTQyMCw2ICs0MjAsMTQgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyB0ZXFsX25ldGRldl9vcHMgPSB7CisJLm5kb19vcGVuCT0gdGVxbF9tYXN0ZXJfb3BlbiwKKwkubmRvX3N0b3AJPSB0ZXFsX21hc3Rlcl9jbG9zZSwKKwkubmRvX3N0YXJ0X3htaXQJPSB0ZXFsX21hc3Rlcl94bWl0LAorCS5uZG9fZ2V0X3N0YXRzCT0gdGVxbF9tYXN0ZXJfc3RhdHMsCisJLm5kb19jaGFuZ2VfbXR1CT0gdGVxbF9tYXN0ZXJfbXR1LAorfTsKKwogc3RhdGljIF9faW5pdCB2b2lkIHRlcWxfbWFzdGVyX3NldHVwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IHRlcWxfbWFzdGVyICptYXN0ZXIgPSBuZXRkZXZfcHJpdihkZXYpOwpAQCAtNDM2LDExICs0NDQsNyBAQAogCW9wcy0+ZGVzdHJveQk9CXRlcWxfZGVzdHJveTsKIAlvcHMtPm93bmVyCT0JVEhJU19NT0RVTEU7CiAKLQlkZXYtPm9wZW4JCT0gdGVxbF9tYXN0ZXJfb3BlbjsKLQlkZXYtPmhhcmRfc3RhcnRfeG1pdAk9IHRlcWxfbWFzdGVyX3htaXQ7Ci0JZGV2LT5zdG9wCQk9IHRlcWxfbWFzdGVyX2Nsb3NlOwotCWRldi0+Z2V0X3N0YXRzCQk9IHRlcWxfbWFzdGVyX3N0YXRzOwotCWRldi0+Y2hhbmdlX210dQkJPSB0ZXFsX21hc3Rlcl9tdHU7CisJZGV2LT5uZXRkZXZfb3BzID0gICAgICAgJnRlcWxfbmV0ZGV2X29wczsKIAlkZXYtPnR5cGUJCT0gQVJQSFJEX1ZPSUQ7CiAJZGV2LT5tdHUJCT0gMTUwMDsKIAlkZXYtPnR4X3F1ZXVlX2xlbgk9IDEwMDsKZGlmZiAtLWdpdCBhL25ldC9zY3RwL2F1dGguYyBiL25ldC9zY3RwL2F1dGguYwppbmRleCA1MmRiNWY2Li41NjkzNWJiIDEwMDY0NAotLS0gYS9uZXQvc2N0cC9hdXRoLmMKKysrIGIvbmV0L3NjdHAvYXV0aC5jCkBAIC0xNDEsOCArMTQxLDggQEAKIC8qIENvbXBhcmUgdHdvIGJ5dGUgdmVjdG9ycyBhcyBudW1iZXJzLiAgUmV0dXJuIHZhbHVlcwogICogYXJlOgogICogCSAgMCAtIHZlY3RvcnMgYXJlIGVxdWFsCi0gKiAJPCAwIC0gdmVjdG9yIDEgaXMgc21hbGxlciB0aGVuIHZlY3RvcjIKLSAqIAk+IDAgLSB2ZWN0b3IgMSBpcyBncmVhdGVyIHRoZW4gdmVjdG9yMgorICogCTwgMCAtIHZlY3RvciAxIGlzIHNtYWxsZXIgdGhhbiB2ZWN0b3IyCisgKiAJPiAwIC0gdmVjdG9yIDEgaXMgZ3JlYXRlciB0aGFuIHZlY3RvcjIKICAqCiAgKiBBbGdvcml0aG0gaXM6CiAgKiAJVGhpcyBpcyBwZXJmb3JtZWQgYnkgc2VsZWN0aW5nIHRoZSBudW1lcmljYWxseSBzbWFsbGVyIGtleSB2ZWN0b3IuLi4KQEAgLTQ4OSw3ICs0ODksNyBAQAogCXJldHVybiAwOwogCiBvdXRfZXJyOgotCS8qIENsZWFuIHVwIGFueSBzdWNjZXNzZnVsbCBhbGxvY2F0aW9ucyAqLworCS8qIENsZWFuIHVwIGFueSBzdWNjZXNzZnVsIGFsbG9jYXRpb25zICovCiAJc2N0cF9hdXRoX2Rlc3Ryb3lfaG1hY3MoZXAtPmF1dGhfaG1hY3MpOwogCXJldHVybiAtRU5PTUVNOwogfQpkaWZmIC0tZ2l0IGEvbmV0L3NjdHAvc21fc3RhdGVmdW5zLmMgYi9uZXQvc2N0cC9zbV9zdGF0ZWZ1bnMuYwppbmRleCAxYzRlNWQ2Li4zYTBjZDA3IDEwMDY0NAotLS0gYS9uZXQvc2N0cC9zbV9zdGF0ZWZ1bnMuYworKysgYi9uZXQvc2N0cC9zbV9zdGF0ZWZ1bnMuYwpAQCAtNDI2OCw5ICs0MjY4LDkgQEAKIAogLyoKICAqIEhhbmRsZSBhIHByb3RvY29sIHZpb2xhdGlvbiB3aGVuIHRoZSBjaHVuayBsZW5ndGggaXMgaW52YWxpZC4KLSAqICJJbnZhbGlkIiBsZW5ndGggaXMgaWRlbnRpZmllZCBhcyBzbWFsbGVyIHRoZW4gdGhlIG1pbmltYWwgbGVuZ3RoIGEKKyAqICJJbnZhbGlkIiBsZW5ndGggaXMgaWRlbnRpZmllZCBhcyBzbWFsbGVyIHRoYW4gdGhlIG1pbmltYWwgbGVuZ3RoIGEKICAqIGdpdmVuIGNodW5rIGNhbiBiZS4gIEZvciBleGFtcGxlLCBhIFNBQ0sgY2h1bmsgaGFzIGludmFsaWQgbGVuZ3RoCi0gKiBpZiBpdCdzIGxlbmd0aCBpcyBzZXQgdG8gYmUgc21hbGxlciB0aGVuIHRoZSBzaXplIG9mIHNjdHBfc2Fja19jaHVua190LgorICogaWYgaXRzIGxlbmd0aCBpcyBzZXQgdG8gYmUgc21hbGxlciB0aGFuIHRoZSBzaXplIG9mIHNjdHBfc2Fja19jaHVua190LgogICoKICAqIFdlIGluZm9ybSB0aGUgb3RoZXIgZW5kIGJ5IHNlbmRpbmcgYW4gQUJPUlQgd2l0aCBhIFByb3RvY29sIFZpb2xhdGlvbgogICogZXJyb3IgY29kZS4KQEAgLTQzMDAsNyArNDMwMCw3IEBACiAKIC8qCiAgKiBIYW5kbGUgYSBwcm90b2NvbCB2aW9sYXRpb24gd2hlbiB0aGUgcGFyYW1ldGVyIGxlbmd0aCBpcyBpbnZhbGlkLgotICogIkludmFsaWQiIGxlbmd0aCBpcyBpZGVudGlmaWVkIGFzIHNtYWxsZXIgdGhlbiB0aGUgbWluaW1hbCBsZW5ndGggYQorICogIkludmFsaWQiIGxlbmd0aCBpcyBpZGVudGlmaWVkIGFzIHNtYWxsZXIgdGhhbiB0aGUgbWluaW1hbCBsZW5ndGggYQogICogZ2l2ZW4gcGFyYW1ldGVyIGNhbiBiZS4KICAqLwogc3RhdGljIHNjdHBfZGlzcG9zaXRpb25fdCBzY3RwX3NmX3Zpb2xhdGlvbl9wYXJhbWxlbigKZGlmZiAtLWdpdCBhL25ldC9zY3RwL3NvY2tldC5jIGIvbmV0L3NjdHAvc29ja2V0LmMKaW5kZXggYjE0YThmMy4uZmYwYThmOCAxMDA2NDQKLS0tIGEvbmV0L3NjdHAvc29ja2V0LmMKKysrIGIvbmV0L3NjdHAvc29ja2V0LmMKQEAgLTI3MTcsNyArMjcxNyw3IEBACiAJCQkJcGF0aHMrKzsKIAkJCX0KIAotCQkJLyogT25seSB2YWxpZGF0ZSBhc29jbWF4cnh0IGlmIHdlIGhhdmUgbW9yZSB0aGVuCisJCQkvKiBPbmx5IHZhbGlkYXRlIGFzb2NtYXhyeHQgaWYgd2UgaGF2ZSBtb3JlIHRoYW4KIAkJCSAqIG9uZSBwYXRoL3RyYW5zcG9ydC4gIFdlIGRvIHRoaXMgYmVjYXVzZSBwYXRoCiAJCQkgKiByZXRyYW5zbWlzc2lvbnMgYXJlIG9ubHkgY291bnRlZCB3aGVuIHdlIGhhdmUgbW9yZQogCQkJICogdGhlbiBvbmUgcGF0aC4KZGlmZiAtLWdpdCBhL25ldC9zY3RwL3Rzbm1hcC5jIGIvbmV0L3NjdHAvdHNubWFwLmMKaW5kZXggMzVjNzNlOC4uOWJkNjQ1NiAxMDA2NDQKLS0tIGEvbmV0L3NjdHAvdHNubWFwLmMKKysrIGIvbmV0L3NjdHAvdHNubWFwLmMKQEAgLTIyNyw3ICsyMjcsNyBAQAogCQkgKi8KIAkJYml0bWFwX3plcm8obWFwLT50c25fbWFwLCBtYXAtPmxlbik7CiAJfSBlbHNlIHsKLQkJLyogSWYgdGhlIGdhcCBpcyBzbWFsbGVyIHRoZW4gdGhlIG1hcCBzaXplLAorCQkvKiBJZiB0aGUgZ2FwIGlzIHNtYWxsZXIgdGhhbiB0aGUgbWFwIHNpemUsCiAJCSAqIHNoaWZ0IHRoZSBtYXAgYnkgJ2dhcCcgYml0cyBhbmQgdXBkYXRlIGZ1cnRoZXIuCiAJCSAqLwogCQliaXRtYXBfc2hpZnRfcmlnaHQobWFwLT50c25fbWFwLCBtYXAtPnRzbl9tYXAsIGdhcCwgbWFwLT5sZW4pOwpkaWZmIC0tZ2l0IGEvbmV0L3NvY2tldC5jIGIvbmV0L3NvY2tldC5jCmluZGV4IDA2NjAzZDcuLjM1ZGQ3MzcgMTAwNjQ0Ci0tLSBhL25ldC9zb2NrZXQuYworKysgYi9uZXQvc29ja2V0LmMKQEAgLTEyMTQsNyArMTIxNCw3IEBACiAJcmV0dXJuIF9fc29ja19jcmVhdGUoJmluaXRfbmV0LCBmYW1pbHksIHR5cGUsIHByb3RvY29sLCByZXMsIDEpOwogfQogCi1hc21saW5rYWdlIGxvbmcgc3lzX3NvY2tldChpbnQgZmFtaWx5LCBpbnQgdHlwZSwgaW50IHByb3RvY29sKQorU1lTQ0FMTF9ERUZJTkUzKHNvY2tldCwgaW50LCBmYW1pbHksIGludCwgdHlwZSwgaW50LCBwcm90b2NvbCkKIHsKIAlpbnQgcmV0dmFsOwogCXN0cnVjdCBzb2NrZXQgKnNvY2s7CkBAIC0xMjU1LDggKzEyNTUsOCBAQAogICoJQ3JlYXRlIGEgcGFpciBvZiBjb25uZWN0ZWQgc29ja2V0cy4KICAqLwogCi1hc21saW5rYWdlIGxvbmcgc3lzX3NvY2tldHBhaXIoaW50IGZhbWlseSwgaW50IHR5cGUsIGludCBwcm90b2NvbCwKLQkJCSAgICAgICBpbnQgX191c2VyICp1c29ja3ZlYykKK1NZU0NBTExfREVGSU5FNChzb2NrZXRwYWlyLCBpbnQsIGZhbWlseSwgaW50LCB0eXBlLCBpbnQsIHByb3RvY29sLAorCQlpbnQgX191c2VyICosIHVzb2NrdmVjKQogewogCXN0cnVjdCBzb2NrZXQgKnNvY2sxLCAqc29jazI7CiAJaW50IGZkMSwgZmQyLCBlcnI7CkBAIC0xMzU2LDcgKzEzNTYsNyBAQAogICoJdGhlIHByb3RvY29sIGxheWVyIChoYXZpbmcgYWxzbyBjaGVja2VkIHRoZSBhZGRyZXNzIGlzIG9rKS4KICAqLwogCi1hc21saW5rYWdlIGxvbmcgc3lzX2JpbmQoaW50IGZkLCBzdHJ1Y3Qgc29ja2FkZHIgX191c2VyICp1bXlhZGRyLCBpbnQgYWRkcmxlbikKK1NZU0NBTExfREVGSU5FMyhiaW5kLCBpbnQsIGZkLCBzdHJ1Y3Qgc29ja2FkZHIgX191c2VyICosIHVteWFkZHIsIGludCwgYWRkcmxlbikKIHsKIAlzdHJ1Y3Qgc29ja2V0ICpzb2NrOwogCXN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIGFkZHJlc3M7CkBAIC0xMzg1LDcgKzEzODUsNyBAQAogICoJcmVhZHkgZm9yIGxpc3RlbmluZy4KICAqLwogCi1hc21saW5rYWdlIGxvbmcgc3lzX2xpc3RlbihpbnQgZmQsIGludCBiYWNrbG9nKQorU1lTQ0FMTF9ERUZJTkUyKGxpc3RlbiwgaW50LCBmZCwgaW50LCBiYWNrbG9nKQogewogCXN0cnVjdCBzb2NrZXQgKnNvY2s7CiAJaW50IGVyciwgZnB1dF9uZWVkZWQ7CkBAIC0xNDE4LDggKzE0MTgsOCBAQAogICoJY2xlYW4gd2hlbiB3ZSByZXN0dWN0dXJlIGFjY2VwdCBhbHNvLgogICovCiAKLWFzbWxpbmthZ2UgbG9uZyBzeXNfYWNjZXB0NChpbnQgZmQsIHN0cnVjdCBzb2NrYWRkciBfX3VzZXIgKnVwZWVyX3NvY2thZGRyLAotCQkJICAgIGludCBfX3VzZXIgKnVwZWVyX2FkZHJsZW4sIGludCBmbGFncykKK1NZU0NBTExfREVGSU5FNChhY2NlcHQ0LCBpbnQsIGZkLCBzdHJ1Y3Qgc29ja2FkZHIgX191c2VyICosIHVwZWVyX3NvY2thZGRyLAorCQlpbnQgX191c2VyICosIHVwZWVyX2FkZHJsZW4sIGludCwgZmxhZ3MpCiB7CiAJc3RydWN0IHNvY2tldCAqc29jaywgKm5ld3NvY2s7CiAJc3RydWN0IGZpbGUgKm5ld2ZpbGU7CkBAIC0xNTAyLDggKzE1MDIsOCBAQAogCWdvdG8gb3V0X3B1dDsKIH0KIAotYXNtbGlua2FnZSBsb25nIHN5c19hY2NlcHQoaW50IGZkLCBzdHJ1Y3Qgc29ja2FkZHIgX191c2VyICp1cGVlcl9zb2NrYWRkciwKLQkJCSAgIGludCBfX3VzZXIgKnVwZWVyX2FkZHJsZW4pCitTWVNDQUxMX0RFRklORTMoYWNjZXB0LCBpbnQsIGZkLCBzdHJ1Y3Qgc29ja2FkZHIgX191c2VyICosIHVwZWVyX3NvY2thZGRyLAorCQlpbnQgX191c2VyICosIHVwZWVyX2FkZHJsZW4pCiB7CiAJcmV0dXJuIHN5c19hY2NlcHQ0KGZkLCB1cGVlcl9zb2NrYWRkciwgdXBlZXJfYWRkcmxlbiwgMCk7CiB9CkBAIC0xNTIwLDggKzE1MjAsOCBAQAogICoJaW5jbHVkZSB0aGUgLUVJTlBST0dSRVNTIHN0YXR1cyBmb3Igc3VjaCBzb2NrZXRzLgogICovCiAKLWFzbWxpbmthZ2UgbG9uZyBzeXNfY29ubmVjdChpbnQgZmQsIHN0cnVjdCBzb2NrYWRkciBfX3VzZXIgKnVzZXJ2YWRkciwKLQkJCSAgICBpbnQgYWRkcmxlbikKK1NZU0NBTExfREVGSU5FMyhjb25uZWN0LCBpbnQsIGZkLCBzdHJ1Y3Qgc29ja2FkZHIgX191c2VyICosIHVzZXJ2YWRkciwKKwkJaW50LCBhZGRybGVuKQogewogCXN0cnVjdCBzb2NrZXQgKnNvY2s7CiAJc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgYWRkcmVzczsKQEAgLTE1NTIsOCArMTU1Miw4IEBACiAgKgluYW1lIHRvIHVzZXIgc3BhY2UuCiAgKi8KIAotYXNtbGlua2FnZSBsb25nIHN5c19nZXRzb2NrbmFtZShpbnQgZmQsIHN0cnVjdCBzb2NrYWRkciBfX3VzZXIgKnVzb2NrYWRkciwKLQkJCQlpbnQgX191c2VyICp1c29ja2FkZHJfbGVuKQorU1lTQ0FMTF9ERUZJTkUzKGdldHNvY2tuYW1lLCBpbnQsIGZkLCBzdHJ1Y3Qgc29ja2FkZHIgX191c2VyICosIHVzb2NrYWRkciwKKwkJaW50IF9fdXNlciAqLCB1c29ja2FkZHJfbGVuKQogewogCXN0cnVjdCBzb2NrZXQgKnNvY2s7CiAJc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgYWRkcmVzczsKQEAgLTE1ODMsOCArMTU4Myw4IEBACiAgKgluYW1lIHRvIHVzZXIgc3BhY2UuCiAgKi8KIAotYXNtbGlua2FnZSBsb25nIHN5c19nZXRwZWVybmFtZShpbnQgZmQsIHN0cnVjdCBzb2NrYWRkciBfX3VzZXIgKnVzb2NrYWRkciwKLQkJCQlpbnQgX191c2VyICp1c29ja2FkZHJfbGVuKQorU1lTQ0FMTF9ERUZJTkUzKGdldHBlZXJuYW1lLCBpbnQsIGZkLCBzdHJ1Y3Qgc29ja2FkZHIgX191c2VyICosIHVzb2NrYWRkciwKKwkJaW50IF9fdXNlciAqLCB1c29ja2FkZHJfbGVuKQogewogCXN0cnVjdCBzb2NrZXQgKnNvY2s7CiAJc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgYWRkcmVzczsKQEAgLTE2MTUsOSArMTYxNSw5IEBACiAgKgl0aGUgcHJvdG9jb2wuCiAgKi8KIAotYXNtbGlua2FnZSBsb25nIHN5c19zZW5kdG8oaW50IGZkLCB2b2lkIF9fdXNlciAqYnVmZiwgc2l6ZV90IGxlbiwKLQkJCSAgIHVuc2lnbmVkIGZsYWdzLCBzdHJ1Y3Qgc29ja2FkZHIgX191c2VyICphZGRyLAotCQkJICAgaW50IGFkZHJfbGVuKQorU1lTQ0FMTF9ERUZJTkU2KHNlbmR0bywgaW50LCBmZCwgdm9pZCBfX3VzZXIgKiwgYnVmZiwgc2l6ZV90LCBsZW4sCisJCXVuc2lnbmVkLCBmbGFncywgc3RydWN0IHNvY2thZGRyIF9fdXNlciAqLCBhZGRyLAorCQlpbnQsIGFkZHJfbGVuKQogewogCXN0cnVjdCBzb2NrZXQgKnNvY2s7CiAJc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgYWRkcmVzczsKQEAgLTE2NjAsNyArMTY2MCw4IEBACiAgKglTZW5kIGEgZGF0YWdyYW0gZG93biBhIHNvY2tldC4KICAqLwogCi1hc21saW5rYWdlIGxvbmcgc3lzX3NlbmQoaW50IGZkLCB2b2lkIF9fdXNlciAqYnVmZiwgc2l6ZV90IGxlbiwgdW5zaWduZWQgZmxhZ3MpCitTWVNDQUxMX0RFRklORTQoc2VuZCwgaW50LCBmZCwgdm9pZCBfX3VzZXIgKiwgYnVmZiwgc2l6ZV90LCBsZW4sCisJCXVuc2lnbmVkLCBmbGFncykKIHsKIAlyZXR1cm4gc3lzX3NlbmR0byhmZCwgYnVmZiwgbGVuLCBmbGFncywgTlVMTCwgMCk7CiB9CkBAIC0xNjcxLDkgKzE2NzIsOSBAQAogICoJc2VuZGVyIGFkZHJlc3MgZnJvbSBrZXJuZWwgdG8gdXNlciBzcGFjZS4KICAqLwogCi1hc21saW5rYWdlIGxvbmcgc3lzX3JlY3Zmcm9tKGludCBmZCwgdm9pZCBfX3VzZXIgKnVidWYsIHNpemVfdCBzaXplLAotCQkJICAgICB1bnNpZ25lZCBmbGFncywgc3RydWN0IHNvY2thZGRyIF9fdXNlciAqYWRkciwKLQkJCSAgICAgaW50IF9fdXNlciAqYWRkcl9sZW4pCitTWVNDQUxMX0RFRklORTYocmVjdmZyb20sIGludCwgZmQsIHZvaWQgX191c2VyICosIHVidWYsIHNpemVfdCwgc2l6ZSwKKwkJdW5zaWduZWQsIGZsYWdzLCBzdHJ1Y3Qgc29ja2FkZHIgX191c2VyICosIGFkZHIsCisJCWludCBfX3VzZXIgKiwgYWRkcl9sZW4pCiB7CiAJc3RydWN0IHNvY2tldCAqc29jazsKIAlzdHJ1Y3QgaW92ZWMgaW92OwpAQCAtMTcyNSw4ICsxNzI2LDggQEAKICAqCXRvIHBhc3MgdGhlIHVzZXIgbW9kZSBwYXJhbWV0ZXIgZm9yIHRoZSBwcm90b2NvbHMgdG8gc29ydCBvdXQuCiAgKi8KIAotYXNtbGlua2FnZSBsb25nIHN5c19zZXRzb2Nrb3B0KGludCBmZCwgaW50IGxldmVsLCBpbnQgb3B0bmFtZSwKLQkJCSAgICAgICBjaGFyIF9fdXNlciAqb3B0dmFsLCBpbnQgb3B0bGVuKQorU1lTQ0FMTF9ERUZJTkU1KHNldHNvY2tvcHQsIGludCwgZmQsIGludCwgbGV2ZWwsIGludCwgb3B0bmFtZSwKKwkJY2hhciBfX3VzZXIgKiwgb3B0dmFsLCBpbnQsIG9wdGxlbikKIHsKIAlpbnQgZXJyLCBmcHV0X25lZWRlZDsKIAlzdHJ1Y3Qgc29ja2V0ICpzb2NrOwpAQCAtMTc1OSw4ICsxNzYwLDggQEAKICAqCXRvIHBhc3MgYSB1c2VyIG1vZGUgcGFyYW1ldGVyIGZvciB0aGUgcHJvdG9jb2xzIHRvIHNvcnQgb3V0LgogICovCiAKLWFzbWxpbmthZ2UgbG9uZyBzeXNfZ2V0c29ja29wdChpbnQgZmQsIGludCBsZXZlbCwgaW50IG9wdG5hbWUsCi0JCQkgICAgICAgY2hhciBfX3VzZXIgKm9wdHZhbCwgaW50IF9fdXNlciAqb3B0bGVuKQorU1lTQ0FMTF9ERUZJTkU1KGdldHNvY2tvcHQsIGludCwgZmQsIGludCwgbGV2ZWwsIGludCwgb3B0bmFtZSwKKwkJY2hhciBfX3VzZXIgKiwgb3B0dmFsLCBpbnQgX191c2VyICosIG9wdGxlbikKIHsKIAlpbnQgZXJyLCBmcHV0X25lZWRlZDsKIAlzdHJ1Y3Qgc29ja2V0ICpzb2NrOwpAQCAtMTc4OSw3ICsxNzkwLDcgQEAKICAqCVNodXRkb3duIGEgc29ja2V0LgogICovCiAKLWFzbWxpbmthZ2UgbG9uZyBzeXNfc2h1dGRvd24oaW50IGZkLCBpbnQgaG93KQorU1lTQ0FMTF9ERUZJTkUyKHNodXRkb3duLCBpbnQsIGZkLCBpbnQsIGhvdykKIHsKIAlpbnQgZXJyLCBmcHV0X25lZWRlZDsKIAlzdHJ1Y3Qgc29ja2V0ICpzb2NrOwpAQCAtMTgxNSw3ICsxODE2LDcgQEAKICAqCUJTRCBzZW5kbXNnIGludGVyZmFjZQogICovCiAKLWFzbWxpbmthZ2UgbG9uZyBzeXNfc2VuZG1zZyhpbnQgZmQsIHN0cnVjdCBtc2doZHIgX191c2VyICptc2csIHVuc2lnbmVkIGZsYWdzKQorU1lTQ0FMTF9ERUZJTkUzKHNlbmRtc2csIGludCwgZmQsIHN0cnVjdCBtc2doZHIgX191c2VyICosIG1zZywgdW5zaWduZWQsIGZsYWdzKQogewogCXN0cnVjdCBjb21wYXRfbXNnaGRyIF9fdXNlciAqbXNnX2NvbXBhdCA9CiAJICAgIChzdHJ1Y3QgY29tcGF0X21zZ2hkciBfX3VzZXIgKiltc2c7CkBAIC0xOTIxLDggKzE5MjIsOCBAQAogICoJQlNEIHJlY3Ztc2cgaW50ZXJmYWNlCiAgKi8KIAotYXNtbGlua2FnZSBsb25nIHN5c19yZWN2bXNnKGludCBmZCwgc3RydWN0IG1zZ2hkciBfX3VzZXIgKm1zZywKLQkJCSAgICB1bnNpZ25lZCBpbnQgZmxhZ3MpCitTWVNDQUxMX0RFRklORTMocmVjdm1zZywgaW50LCBmZCwgc3RydWN0IG1zZ2hkciBfX3VzZXIgKiwgbXNnLAorCQl1bnNpZ25lZCBpbnQsIGZsYWdzKQogewogCXN0cnVjdCBjb21wYXRfbXNnaGRyIF9fdXNlciAqbXNnX2NvbXBhdCA9CiAJICAgIChzdHJ1Y3QgY29tcGF0X21zZ2hkciBfX3VzZXIgKiltc2c7CkBAIC0yMDQ1LDcgKzIwNDYsNyBAQAogICogIGl0IGlzIHNldCBieSB0aGUgY2FsbGVlcy4KICAqLwogCi1hc21saW5rYWdlIGxvbmcgc3lzX3NvY2tldGNhbGwoaW50IGNhbGwsIHVuc2lnbmVkIGxvbmcgX191c2VyICphcmdzKQorU1lTQ0FMTF9ERUZJTkUyKHNvY2tldGNhbGwsIGludCwgY2FsbCwgdW5zaWduZWQgbG9uZyBfX3VzZXIgKiwgYXJncykKIHsKIAl1bnNpZ25lZCBsb25nIGFbNl07CiAJdW5zaWduZWQgbG9uZyBhMCwgYTE7CmRpZmYgLS1naXQgYS9uZXQvc3VucnBjL2NhY2hlLmMgYi9uZXQvc3VucnBjL2NhY2hlLmMKaW5kZXggYzk5NjY3MS4uNDczNWNhYSAxMDA2NDQKLS0tIGEvbmV0L3N1bnJwYy9jYWNoZS5jCisrKyBiL25ldC9zdW5ycGMvY2FjaGUuYwpAQCAtOTgsNyArOTgsNyBAQAogCiAJcmV0dXJuIG5ldzsKIH0KLUVYUE9SVF9TWU1CT0woc3VucnBjX2NhY2hlX2xvb2t1cCk7CitFWFBPUlRfU1lNQk9MX0dQTChzdW5ycGNfY2FjaGVfbG9va3VwKTsKIAogCiBzdGF0aWMgdm9pZCBxdWV1ZV9sb29zZShzdHJ1Y3QgY2FjaGVfZGV0YWlsICpkZXRhaWwsIHN0cnVjdCBjYWNoZV9oZWFkICpjaCk7CkBAIC0xNzMsNyArMTczLDcgQEAKIAljYWNoZV9wdXQob2xkLCBkZXRhaWwpOwogCXJldHVybiB0bXA7CiB9Ci1FWFBPUlRfU1lNQk9MKHN1bnJwY19jYWNoZV91cGRhdGUpOworRVhQT1JUX1NZTUJPTF9HUEwoc3VucnBjX2NhY2hlX3VwZGF0ZSk7CiAKIHN0YXRpYyBpbnQgY2FjaGVfbWFrZV91cGNhbGwoc3RydWN0IGNhY2hlX2RldGFpbCAqZGV0YWlsLCBzdHJ1Y3QgY2FjaGVfaGVhZCAqaCk7CiAvKgpAQCAtMjQ1LDcgKzI0NSw3IEBACiAJCWNhY2hlX3B1dChoLCBkZXRhaWwpOwogCXJldHVybiBydjsKIH0KLUVYUE9SVF9TWU1CT0woY2FjaGVfY2hlY2spOworRVhQT1JUX1NZTUJPTF9HUEwoY2FjaGVfY2hlY2spOwogCiAvKgogICogY2FjaGVzIG5lZWQgdG8gYmUgcGVyaW9kaWNhbGx5IGNsZWFuZWQuCkBAIC0zNzMsNyArMzczLDcgQEAKIAlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmNhY2hlX2NsZWFuZXIsIDApOwogCXJldHVybiAwOwogfQotRVhQT1JUX1NZTUJPTChjYWNoZV9yZWdpc3Rlcik7CitFWFBPUlRfU1lNQk9MX0dQTChjYWNoZV9yZWdpc3Rlcik7CiAKIHZvaWQgY2FjaGVfdW5yZWdpc3RlcihzdHJ1Y3QgY2FjaGVfZGV0YWlsICpjZCkKIHsKQEAgLTM5OSw3ICszOTksNyBAQAogb3V0OgogCXByaW50ayhLRVJOX0VSUiAibmZzZDogZmFpbGVkIHRvIHVucmVnaXN0ZXIgJXMgY2FjaGVcbiIsIGNkLT5uYW1lKTsKIH0KLUVYUE9SVF9TWU1CT0woY2FjaGVfdW5yZWdpc3Rlcik7CitFWFBPUlRfU1lNQk9MX0dQTChjYWNoZV91bnJlZ2lzdGVyKTsKIAogLyogY2xlYW4gY2FjaGUgdHJpZXMgdG8gZmluZCBzb21ldGhpbmcgdG8gY2xlYW4KICAqIGFuZCBjbGVhbnMgaXQuCkBAIC01MTQsNyArNTE0LDcgQEAKIAl3aGlsZSAoY2FjaGVfY2xlYW4oKSAhPSAtMSkKIAkJY29uZF9yZXNjaGVkKCk7CiB9Ci1FWFBPUlRfU1lNQk9MKGNhY2hlX2ZsdXNoKTsKK0VYUE9SVF9TWU1CT0xfR1BMKGNhY2hlX2ZsdXNoKTsKIAogdm9pZCBjYWNoZV9wdXJnZShzdHJ1Y3QgY2FjaGVfZGV0YWlsICpkZXRhaWwpCiB7CkBAIC01MjMsNyArNTIzLDcgQEAKIAljYWNoZV9mbHVzaCgpOwogCWRldGFpbC0+Zmx1c2hfdGltZSA9IDE7CiB9Ci1FWFBPUlRfU1lNQk9MKGNhY2hlX3B1cmdlKTsKK0VYUE9SVF9TWU1CT0xfR1BMKGNhY2hlX3B1cmdlKTsKIAogCiAvKgpAQCAtOTg4LDcgKzk4OCw3IEBACiAJKmJwcCA9IGJwOwogCSpscCA9IGxlbjsKIH0KLUVYUE9SVF9TWU1CT0wocXdvcmRfYWRkKTsKK0VYUE9SVF9TWU1CT0xfR1BMKHF3b3JkX2FkZCk7CiAKIHZvaWQgcXdvcmRfYWRkaGV4KGNoYXIgKipicHAsIGludCAqbHAsIGNoYXIgKmJ1ZiwgaW50IGJsZW4pCiB7CkBAIC0xMDE3LDcgKzEwMTcsNyBAQAogCSpicHAgPSBicDsKIAkqbHAgPSBsZW47CiB9Ci1FWFBPUlRfU1lNQk9MKHF3b3JkX2FkZGhleCk7CitFWFBPUlRfU1lNQk9MX0dQTChxd29yZF9hZGRoZXgpOwogCiBzdGF0aWMgdm9pZCB3YXJuX25vX2xpc3RlbmVyKHN0cnVjdCBjYWNoZV9kZXRhaWwgKmRldGFpbCkKIHsKQEAgLTExNDAsNyArMTE0MCw3IEBACiAJKmRlc3QgPSAnXDAnOwogCXJldHVybiBsZW47CiB9Ci1FWFBPUlRfU1lNQk9MKHF3b3JkX2dldCk7CitFWFBPUlRfU1lNQk9MX0dQTChxd29yZF9nZXQpOwogCiAKIC8qCmRpZmYgLS1naXQgYS9uZXQvc3VucnBjL3N0YXRzLmMgYi9uZXQvc3VucnBjL3N0YXRzLmMKaW5kZXggNTBiMDQ5Yy4uMDg1MzcyZSAxMDA2NDQKLS0tIGEvbmV0L3N1bnJwYy9zdGF0cy5jCisrKyBiL25ldC9zdW5ycGMvc3RhdHMuYwpAQCAtMTA2LDcgKzEwNiw3IEBACiAJCXNlcV9wdXRjKHNlcSwgJ1xuJyk7CiAJfQogfQotRVhQT1JUX1NZTUJPTChzdmNfc2VxX3Nob3cpOworRVhQT1JUX1NZTUJPTF9HUEwoc3ZjX3NlcV9zaG93KTsKIAogLyoqCiAgKiBycGNfYWxsb2NfaW9zdGF0cyAtIGFsbG9jYXRlIGFuIHJwY19pb3N0YXRzIHN0cnVjdHVyZQpAQCAtMjQ5LDE0ICsyNDksMTQgQEAKIHsKIAlyZXR1cm4gZG9fcmVnaXN0ZXIoc3RhdHAtPnByb2dyYW0tPnBnX25hbWUsIHN0YXRwLCBmb3BzKTsKIH0KLUVYUE9SVF9TWU1CT0woc3ZjX3Byb2NfcmVnaXN0ZXIpOworRVhQT1JUX1NZTUJPTF9HUEwoc3ZjX3Byb2NfcmVnaXN0ZXIpOwogCiB2b2lkCiBzdmNfcHJvY191bnJlZ2lzdGVyKGNvbnN0IGNoYXIgKm5hbWUpCiB7CiAJcmVtb3ZlX3Byb2NfZW50cnkobmFtZSwgcHJvY19uZXRfcnBjKTsKIH0KLUVYUE9SVF9TWU1CT0woc3ZjX3Byb2NfdW5yZWdpc3Rlcik7CitFWFBPUlRfU1lNQk9MX0dQTChzdmNfcHJvY191bnJlZ2lzdGVyKTsKIAogdm9pZAogcnBjX3Byb2NfaW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvbmV0L3N1bnJwYy9zdmMuYyBiL25ldC9zdW5ycGMvc3ZjLmMKaW5kZXggNTRjOThkOC4uYzUxZmVkNCAxMDA2NDQKLS0tIGEvbmV0L3N1bnJwYy9zdmMuYworKysgYi9uZXQvc3VucnBjL3N2Yy5jCkBAIC00MzEsNyArNDMxLDcgQEAKIHsKIAlyZXR1cm4gX19zdmNfY3JlYXRlKHByb2csIGJ1ZnNpemUsIC8qbnBvb2xzKi8xLCBmYW1pbHksIHNodXRkb3duKTsKIH0KLUVYUE9SVF9TWU1CT0woc3ZjX2NyZWF0ZSk7CitFWFBPUlRfU1lNQk9MX0dQTChzdmNfY3JlYXRlKTsKIAogc3RydWN0IHN2Y19zZXJ2ICoKIHN2Y19jcmVhdGVfcG9vbGVkKHN0cnVjdCBzdmNfcHJvZ3JhbSAqcHJvZywgdW5zaWduZWQgaW50IGJ1ZnNpemUsCkBAIC00NTAsNyArNDUwLDcgQEAKIAogCXJldHVybiBzZXJ2OwogfQotRVhQT1JUX1NZTUJPTChzdmNfY3JlYXRlX3Bvb2xlZCk7CitFWFBPUlRfU1lNQk9MX0dQTChzdmNfY3JlYXRlX3Bvb2xlZCk7CiAKIC8qCiAgKiBEZXN0cm95IGFuIFJQQyBzZXJ2aWNlLiBTaG91bGQgYmUgY2FsbGVkIHdpdGggYXBwcm9wcmlhdGUgbG9ja2luZyB0bwpAQCAtNDkyLDcgKzQ5Miw3IEBACiAJa2ZyZWUoc2Vydi0+c3ZfcG9vbHMpOwogCWtmcmVlKHNlcnYpOwogfQotRVhQT1JUX1NZTUJPTChzdmNfZGVzdHJveSk7CitFWFBPUlRfU1lNQk9MX0dQTChzdmNfZGVzdHJveSk7CiAKIC8qCiAgKiBBbGxvY2F0ZSBhbiBSUEMgc2VydmVyJ3MgYnVmZmVyIHNwYWNlLgpAQCAtNTY3LDcgKzU2Nyw3IEBACiBvdXRfZW5vbWVtOgogCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwogfQotRVhQT1JUX1NZTUJPTChzdmNfcHJlcGFyZV90aHJlYWQpOworRVhQT1JUX1NZTUJPTF9HUEwoc3ZjX3ByZXBhcmVfdGhyZWFkKTsKIAogLyoKICAqIENob29zZSBhIHBvb2wgaW4gd2hpY2ggdG8gY3JlYXRlIGEgbmV3IHRocmVhZCwgZm9yIHN2Y19zZXRfbnVtX3RocmVhZHMKQEAgLTY4OSw3ICs2ODksNyBAQAogCiAJcmV0dXJuIGVycm9yOwogfQotRVhQT1JUX1NZTUJPTChzdmNfc2V0X251bV90aHJlYWRzKTsKK0VYUE9SVF9TWU1CT0xfR1BMKHN2Y19zZXRfbnVtX3RocmVhZHMpOwogCiAvKgogICogQ2FsbGVkIGZyb20gYSBzZXJ2ZXIgdGhyZWFkIGFzIGl0J3MgZXhpdGluZy4gQ2FsbGVyIG11c3QgaG9sZCB0aGUgQktMIG9yCkBAIC03MTcsNyArNzE3LDcgQEAKIAlpZiAoc2VydikKIAkJc3ZjX2Rlc3Ryb3koc2Vydik7CiB9Ci1FWFBPUlRfU1lNQk9MKHN2Y19leGl0X3RocmVhZCk7CitFWFBPUlRfU1lNQk9MX0dQTChzdmNfZXhpdF90aHJlYWQpOwogCiAjaWZkZWYgQ09ORklHX1NVTlJQQ19SRUdJU1RFUl9WNAogCkBAIC0xMjMxLDcgKzEyMzEsNyBAQAogCXN2Y19wdXRubChyZXN2LCBudG9obChycGNfc3RhdCkpOwogCWdvdG8gc2VuZGl0OwogfQotRVhQT1JUX1NZTUJPTChzdmNfcHJvY2Vzcyk7CitFWFBPUlRfU1lNQk9MX0dQTChzdmNfcHJvY2Vzcyk7CiAKIC8qCiAgKiBSZXR1cm4gKHRyYW5zcG9ydC1zcGVjaWZpYykgbGltaXQgb24gdGhlIHJwYyBwYXlsb2FkLgpkaWZmIC0tZ2l0IGEvbmV0L3N1bnJwYy9zdmNfeHBydC5jIGIvbmV0L3N1bnJwYy9zdmNfeHBydC5jCmluZGV4IGJmNWI1Y2QuLmU1ODhkZjUgMTAwNjQ0Ci0tLSBhL25ldC9zdW5ycGMvc3ZjX3hwcnQuYworKysgYi9uZXQvc3VucnBjL3N2Y194cHJ0LmMKQEAgLTQ0MCw3ICs0NDAsNyBAQAogCQlzdmNfeHBydF9lbnF1ZXVlKHhwcnQpOwogCX0KIH0KLUVYUE9SVF9TWU1CT0woc3ZjX3Jlc2VydmUpOworRVhQT1JUX1NZTUJPTF9HUEwoc3ZjX3Jlc2VydmUpOwogCiBzdGF0aWMgdm9pZCBzdmNfeHBydF9yZWxlYXNlKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHApCiB7CkBAIC00NDgsNiArNDQ4LDkgQEAKIAogCXJxc3RwLT5ycV94cHJ0LT54cHRfb3BzLT54cG9fcmVsZWFzZV9ycXN0KHJxc3RwKTsKIAorCWtmcmVlKHJxc3RwLT5ycV9kZWZlcnJlZCk7CisJcnFzdHAtPnJxX2RlZmVycmVkID0gTlVMTDsKKwogCXN2Y19mcmVlX3Jlc19wYWdlcyhycXN0cCk7CiAJcnFzdHAtPnJxX3Jlcy5wYWdlX2xlbiA9IDA7CiAJcnFzdHAtPnJxX3Jlcy5wYWdlX2Jhc2UgPSAwOwpAQCAtNDk4LDcgKzUwMSw3IEBACiAJCXNwaW5fdW5sb2NrX2JoKCZwb29sLT5zcF9sb2NrKTsKIAl9CiB9Ci1FWFBPUlRfU1lNQk9MKHN2Y193YWtlX3VwKTsKK0VYUE9SVF9TWU1CT0xfR1BMKHN2Y193YWtlX3VwKTsKIAogaW50IHN2Y19wb3J0X2lzX3ByaXZpbGVnZWQoc3RydWN0IHNvY2thZGRyICpzaW4pCiB7CkBAIC01MTUsOCArNTE4LDEwIEBACiB9CiAKIC8qCi0gKiBNYWtlIHN1cmUgdGhhdCB3ZSBkb24ndCBoYXZlIHRvbyBtYW55IGFjdGl2ZSBjb25uZWN0aW9ucy4gIElmIHdlCi0gKiBoYXZlLCBzb21ldGhpbmcgbXVzdCBiZSBkcm9wcGVkLgorICogTWFrZSBzdXJlIHRoYXQgd2UgZG9uJ3QgaGF2ZSB0b28gbWFueSBhY3RpdmUgY29ubmVjdGlvbnMuIElmIHdlIGhhdmUsCisgKiBzb21ldGhpbmcgbXVzdCBiZSBkcm9wcGVkLiBJdCdzIG5vdCBjbGVhciB3aGF0IHdpbGwgaGFwcGVuIGlmIHdlIGFsbG93CisgKiAidG9vIG1hbnkiIGNvbm5lY3Rpb25zLCBidXQgd2hlbiBkZWFsaW5nIHdpdGggbmV0d29yay1mYWNpbmcgc29mdHdhcmUsCisgKiB3ZSBoYXZlIHRvIGNvZGUgZGVmZW5zaXZlbHkuIEhlcmUgd2UgZG8gdGhhdCBieSBpbXBvc2luZyBoYXJkIGxpbWl0cy4KICAqCiAgKiBUaGVyZSdzIG5vIHBvaW50IGluIHRyeWluZyB0byBkbyByYW5kb20gZHJvcCBoZXJlIGZvciBEb1MKICAqIHByZXZlbnRpb24uIFRoZSBORlMgY2xpZW50cyBkb2VzIDEgcmVjb25uZWN0IGluIDE1IHNlY29uZHMuIEFuCkBAIC01MjUsMTkgKzUzMCwyNyBAQAogICogVGhlIG9ubHkgc29tZXdoYXQgZWZmaWNpZW50IG1lY2hhbmlzbSB3b3VsZCBiZSBpZiBkcm9wIG9sZAogICogY29ubmVjdGlvbnMgZnJvbSB0aGUgc2FtZSBJUCBmaXJzdC4gQnV0IHJpZ2h0IG5vdyB3ZSBkb24ndCBldmVuCiAgKiByZWNvcmQgdGhlIGNsaWVudCBJUCBpbiBzdmNfc29jay4KKyAqCisgKiBzaW5nbGUtdGhyZWFkZWQgc2VydmljZXMgdGhhdCBleHBlY3QgYSBsb3Qgb2YgY2xpZW50cyB3aWxsIHByb2JhYmx5CisgKiBuZWVkIHRvIHNldCBzdl9tYXhjb25uIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IHZhbHVlIHdoaWNoIGlzIGJhc2VkCisgKiBvbiB0aGUgbnVtYmVyIG9mIHRocmVhZHMKICAqLwogc3RhdGljIHZvaWQgc3ZjX2NoZWNrX2Nvbm5fbGltaXRzKHN0cnVjdCBzdmNfc2VydiAqc2VydikKIHsKLQlpZiAoc2Vydi0+c3ZfdG1wY250ID4gKHNlcnYtPnN2X25ydGhyZWFkcyszKSoyMCkgeworCXVuc2lnbmVkIGludCBsaW1pdCA9IHNlcnYtPnN2X21heGNvbm4gPyBzZXJ2LT5zdl9tYXhjb25uIDoKKwkJCQkoc2Vydi0+c3ZfbnJ0aHJlYWRzKzMpICogMjA7CisKKwlpZiAoc2Vydi0+c3ZfdG1wY250ID4gbGltaXQpIHsKIAkJc3RydWN0IHN2Y194cHJ0ICp4cHJ0ID0gTlVMTDsKIAkJc3Bpbl9sb2NrX2JoKCZzZXJ2LT5zdl9sb2NrKTsKIAkJaWYgKCFsaXN0X2VtcHR5KCZzZXJ2LT5zdl90ZW1wc29ja3MpKSB7CiAJCQlpZiAobmV0X3JhdGVsaW1pdCgpKSB7CiAJCQkJLyogVHJ5IHRvIGhlbHAgdGhlIGFkbWluICovCiAJCQkJcHJpbnRrKEtFUk5fTk9USUNFICIlczogdG9vIG1hbnkgb3BlbiAgIgotCQkJCSAgICAgICAiY29ubmVjdGlvbnMsIGNvbnNpZGVyIGluY3JlYXNpbmcgdGhlICIKLQkJCQkgICAgICAgIm51bWJlciBvZiBuZnNkIHRocmVhZHNcbiIsCi0JCQkJICAgICAgIHNlcnYtPnN2X25hbWUpOworCQkJCSAgICAgICAiY29ubmVjdGlvbnMsIGNvbnNpZGVyIGluY3JlYXNpbmcgJXNcbiIsCisJCQkJICAgICAgIHNlcnYtPnN2X25hbWUsIHNlcnYtPnN2X21heGNvbm4gPworCQkJCSAgICAgICAidGhlIG1heCBudW1iZXIgb2YgY29ubmVjdGlvbnMuIiA6CisJCQkJICAgICAgICJ0aGUgbnVtYmVyIG9mIHRocmVhZHMuIik7CiAJCQl9CiAJCQkvKgogCQkJICogQWx3YXlzIHNlbGVjdCB0aGUgb2xkZXN0IGNvbm5lY3Rpb24uIEl0J3Mgbm90IGZhaXIsCkBAIC03MzAsNyArNzQzLDcgQEAKIAkJc2Vydi0+c3Zfc3RhdHMtPm5ldGNudCsrOwogCXJldHVybiBsZW47CiB9Ci1FWFBPUlRfU1lNQk9MKHN2Y19yZWN2KTsKK0VYUE9SVF9TWU1CT0xfR1BMKHN2Y19yZWN2KTsKIAogLyoKICAqIERyb3AgcmVxdWVzdApAQCAtNzQwLDcgKzc1Myw3IEBACiAJZHByaW50aygic3ZjOiB4cHJ0ICVwIGRyb3BwZWQgcmVxdWVzdFxuIiwgcnFzdHAtPnJxX3hwcnQpOwogCXN2Y194cHJ0X3JlbGVhc2UocnFzdHApOwogfQotRVhQT1JUX1NZTUJPTChzdmNfZHJvcCk7CitFWFBPUlRfU1lNQk9MX0dQTChzdmNfZHJvcCk7CiAKIC8qCiAgKiBSZXR1cm4gcmVwbHkgdG8gY2xpZW50LgpAQCAtODM3LDYgKzg1MCwxMSBAQAogdm9pZCBzdmNfZGVsZXRlX3hwcnQoc3RydWN0IHN2Y194cHJ0ICp4cHJ0KQogewogCXN0cnVjdCBzdmNfc2Vydgkqc2VydiA9IHhwcnQtPnhwdF9zZXJ2ZXI7CisJc3RydWN0IHN2Y19kZWZlcnJlZF9yZXEgKmRyOworCisJLyogT25seSBkbyB0aGlzIG9uY2UgKi8KKwlpZiAodGVzdF9hbmRfc2V0X2JpdChYUFRfREVBRCwgJnhwcnQtPnhwdF9mbGFncykpCisJCXJldHVybjsKIAogCWRwcmludGsoInN2Yzogc3ZjX2RlbGV0ZV94cHJ0KCVwKVxuIiwgeHBydCk7CiAJeHBydC0+eHB0X29wcy0+eHBvX2RldGFjaCh4cHJ0KTsKQEAgLTg1MSwxMiArODY5LDE2IEBACiAJICogd2hpbGUgc3RpbGwgYXR0YWNoZWQgdG8gYSBxdWV1ZSwgdGhlIHF1ZXVlIGl0c2VsZgogCSAqIGlzIGFib3V0IHRvIGJlIGRlc3Ryb3llZCAoaW4gc3ZjX2Rlc3Ryb3kpLgogCSAqLwotCWlmICghdGVzdF9hbmRfc2V0X2JpdChYUFRfREVBRCwgJnhwcnQtPnhwdF9mbGFncykpIHsKLQkJQlVHX09OKGF0b21pY19yZWFkKCZ4cHJ0LT54cHRfcmVmLnJlZmNvdW50KSA8IDIpOwotCQlpZiAodGVzdF9iaXQoWFBUX1RFTVAsICZ4cHJ0LT54cHRfZmxhZ3MpKQotCQkJc2Vydi0+c3ZfdG1wY250LS07CisJaWYgKHRlc3RfYml0KFhQVF9URU1QLCAmeHBydC0+eHB0X2ZsYWdzKSkKKwkJc2Vydi0+c3ZfdG1wY250LS07CisKKwlmb3IgKGRyID0gc3ZjX2RlZmVycmVkX2RlcXVldWUoeHBydCk7IGRyOworCSAgICAgZHIgPSBzdmNfZGVmZXJyZWRfZGVxdWV1ZSh4cHJ0KSkgewogCQlzdmNfeHBydF9wdXQoeHBydCk7CisJCWtmcmVlKGRyKTsKIAl9CisKKwlzdmNfeHBydF9wdXQoeHBydCk7CiAJc3Bpbl91bmxvY2tfYmgoJnNlcnYtPnN2X2xvY2spOwogfQogCkBAIC05MDIsMTcgKzkyNCwxOSBAQAogCQljb250YWluZXJfb2YoZHJlcSwgc3RydWN0IHN2Y19kZWZlcnJlZF9yZXEsIGhhbmRsZSk7CiAJc3RydWN0IHN2Y194cHJ0ICp4cHJ0ID0gZHItPnhwcnQ7CiAKLQlpZiAodG9vX21hbnkpIHsKKwlzcGluX2xvY2soJnhwcnQtPnhwdF9sb2NrKTsKKwlzZXRfYml0KFhQVF9ERUZFUlJFRCwgJnhwcnQtPnhwdF9mbGFncyk7CisJaWYgKHRvb19tYW55IHx8IHRlc3RfYml0KFhQVF9ERUFELCAmeHBydC0+eHB0X2ZsYWdzKSkgeworCQlzcGluX3VubG9jaygmeHBydC0+eHB0X2xvY2spOworCQlkcHJpbnRrKCJyZXZpc2l0IGNhbmNlbGVkXG4iKTsKIAkJc3ZjX3hwcnRfcHV0KHhwcnQpOwogCQlrZnJlZShkcik7CiAJCXJldHVybjsKIAl9CiAJZHByaW50aygicmV2aXNpdCBxdWV1ZWRcbiIpOwogCWRyLT54cHJ0ID0gTlVMTDsKLQlzcGluX2xvY2soJnhwcnQtPnhwdF9sb2NrKTsKIAlsaXN0X2FkZCgmZHItPmhhbmRsZS5yZWNlbnQsICZ4cHJ0LT54cHRfZGVmZXJyZWQpOwogCXNwaW5fdW5sb2NrKCZ4cHJ0LT54cHRfbG9jayk7Ci0Jc2V0X2JpdChYUFRfREVGRVJSRUQsICZ4cHJ0LT54cHRfZmxhZ3MpOwogCXN2Y194cHJ0X2VucXVldWUoeHBydCk7CiAJc3ZjX3hwcnRfcHV0KHhwcnQpOwogfQpkaWZmIC0tZ2l0IGEvbmV0L3N1bnJwYy9zdmNhdXRoLmMgYi9uZXQvc3VucnBjL3N2Y2F1dGguYwppbmRleCA4YTczY2JiLi5lNjQxMDliIDEwMDY0NAotLS0gYS9uZXQvc3VucnBjL3N2Y2F1dGguYworKysgYi9uZXQvc3VucnBjL3N2Y2F1dGguYwpAQCAtNTcsMTMgKzU3LDEzIEBACiAJcnFzdHAtPnJxX2F1dGhvcCA9IGFvcHM7CiAJcmV0dXJuIGFvcHMtPmFjY2VwdChycXN0cCwgYXV0aHApOwogfQotRVhQT1JUX1NZTUJPTChzdmNfYXV0aGVudGljYXRlKTsKK0VYUE9SVF9TWU1CT0xfR1BMKHN2Y19hdXRoZW50aWNhdGUpOwogCiBpbnQgc3ZjX3NldF9jbGllbnQoc3RydWN0IHN2Y19ycXN0ICpycXN0cCkKIHsKIAlyZXR1cm4gcnFzdHAtPnJxX2F1dGhvcC0+c2V0X2NsaWVudChycXN0cCk7CiB9Ci1FWFBPUlRfU1lNQk9MKHN2Y19zZXRfY2xpZW50KTsKK0VYUE9SVF9TWU1CT0xfR1BMKHN2Y19zZXRfY2xpZW50KTsKIAogLyogQSByZXF1ZXN0LCB3aGljaCB3YXMgYXV0aGVudGljYXRlZCwgaGFzIG5vdyBleGVjdXRlZC4KICAqIFRpbWUgdG8gZmluYWxpc2UgdGhlIGNyZWRlbnRpYWxzIGFuZCB2ZXJpZmllcgpAQCAtOTUsNyArOTUsNyBAQAogCXNwaW5fdW5sb2NrKCZhdXRodGFiX2xvY2spOwogCXJldHVybiBydjsKIH0KLUVYUE9SVF9TWU1CT0woc3ZjX2F1dGhfcmVnaXN0ZXIpOworRVhQT1JUX1NZTUJPTF9HUEwoc3ZjX2F1dGhfcmVnaXN0ZXIpOwogCiB2b2lkCiBzdmNfYXV0aF91bnJlZ2lzdGVyKHJwY19hdXRoZmxhdm9yX3QgZmxhdm9yKQpAQCAtMTA1LDcgKzEwNSw3IEBACiAJCWF1dGh0YWJbZmxhdm9yXSA9IE5VTEw7CiAJc3Bpbl91bmxvY2soJmF1dGh0YWJfbG9jayk7CiB9Ci1FWFBPUlRfU1lNQk9MKHN2Y19hdXRoX3VucmVnaXN0ZXIpOworRVhQT1JUX1NZTUJPTF9HUEwoc3ZjX2F1dGhfdW5yZWdpc3Rlcik7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogJ2F1dGhfZG9tYWlucycgYXJlIHN0b3JlZCBpbiBhIGhhc2ggdGFibGUgaW5kZXhlZCBieSBuYW1lLgpAQCAtMTMyLDcgKzEzMiw3IEBACiAJCXNwaW5fdW5sb2NrKCZhdXRoX2RvbWFpbl9sb2NrKTsKIAl9CiB9Ci1FWFBPUlRfU1lNQk9MKGF1dGhfZG9tYWluX3B1dCk7CitFWFBPUlRfU1lNQk9MX0dQTChhdXRoX2RvbWFpbl9wdXQpOwogCiBzdHJ1Y3QgYXV0aF9kb21haW4gKgogYXV0aF9kb21haW5fbG9va3VwKGNoYXIgKm5hbWUsIHN0cnVjdCBhdXRoX2RvbWFpbiAqbmV3KQpAQCAtMTU3LDEwICsxNTcsMTAgQEAKIAlzcGluX3VubG9jaygmYXV0aF9kb21haW5fbG9jayk7CiAJcmV0dXJuIG5ldzsKIH0KLUVYUE9SVF9TWU1CT0woYXV0aF9kb21haW5fbG9va3VwKTsKK0VYUE9SVF9TWU1CT0xfR1BMKGF1dGhfZG9tYWluX2xvb2t1cCk7CiAKIHN0cnVjdCBhdXRoX2RvbWFpbiAqYXV0aF9kb21haW5fZmluZChjaGFyICpuYW1lKQogewogCXJldHVybiBhdXRoX2RvbWFpbl9sb29rdXAobmFtZSwgTlVMTCk7CiB9Ci1FWFBPUlRfU1lNQk9MKGF1dGhfZG9tYWluX2ZpbmQpOworRVhQT1JUX1NZTUJPTF9HUEwoYXV0aF9kb21haW5fZmluZCk7CmRpZmYgLS1naXQgYS9uZXQvc3VucnBjL3N2Y2F1dGhfdW5peC5jIGIvbmV0L3N1bnJwYy9zdmNhdXRoX3VuaXguYwppbmRleCA4MjI0MGU2Li41Yzg2NWUyIDEwMDY0NAotLS0gYS9uZXQvc3VucnBjL3N2Y2F1dGhfdW5peC5jCisrKyBiL25ldC9zdW5ycGMvc3ZjYXV0aF91bml4LmMKQEAgLTY0LDcgKzY0LDcgQEAKIAkJcnYgPSBhdXRoX2RvbWFpbl9sb29rdXAobmFtZSwgJm5ldy0+aCk7CiAJfQogfQotRVhQT1JUX1NZTUJPTCh1bml4X2RvbWFpbl9maW5kKTsKK0VYUE9SVF9TWU1CT0xfR1BMKHVuaXhfZG9tYWluX2ZpbmQpOwogCiBzdGF0aWMgdm9pZCBzdmNhdXRoX3VuaXhfZG9tYWluX3JlbGVhc2Uoc3RydWN0IGF1dGhfZG9tYWluICpkb20pCiB7CkBAIC0zNTgsNyArMzU4LDcgQEAKIAllbHNlCiAJCXJldHVybiAtRU5PTUVNOwogfQotRVhQT1JUX1NZTUJPTChhdXRoX3VuaXhfYWRkX2FkZHIpOworRVhQT1JUX1NZTUJPTF9HUEwoYXV0aF91bml4X2FkZF9hZGRyKTsKIAogaW50IGF1dGhfdW5peF9mb3JnZXRfb2xkKHN0cnVjdCBhdXRoX2RvbWFpbiAqZG9tKQogewpAQCAtMzcwLDcgKzM3MCw3IEBACiAJdWRvbS0+YWRkcl9jaGFuZ2VzKys7CiAJcmV0dXJuIDA7CiB9Ci1FWFBPUlRfU1lNQk9MKGF1dGhfdW5peF9mb3JnZXRfb2xkKTsKK0VYUE9SVF9TWU1CT0xfR1BMKGF1dGhfdW5peF9mb3JnZXRfb2xkKTsKIAogc3RydWN0IGF1dGhfZG9tYWluICphdXRoX3VuaXhfbG9va3VwKHN0cnVjdCBpbjZfYWRkciAqYWRkcikKIHsKQEAgLTM5NSwxMyArMzk1LDEzIEBACiAJY2FjaGVfcHV0KCZpcG0tPmgsICZpcF9tYXBfY2FjaGUpOwogCXJldHVybiBydjsKIH0KLUVYUE9SVF9TWU1CT0woYXV0aF91bml4X2xvb2t1cCk7CitFWFBPUlRfU1lNQk9MX0dQTChhdXRoX3VuaXhfbG9va3VwKTsKIAogdm9pZCBzdmNhdXRoX3VuaXhfcHVyZ2Uodm9pZCkKIHsKIAljYWNoZV9wdXJnZSgmaXBfbWFwX2NhY2hlKTsKIH0KLUVYUE9SVF9TWU1CT0woc3ZjYXV0aF91bml4X3B1cmdlKTsKK0VYUE9SVF9TWU1CT0xfR1BMKHN2Y2F1dGhfdW5peF9wdXJnZSk7CiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IGlwX21hcCAqCiBpcF9tYXBfY2FjaGVkX2dldChzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwKQpAQCAtNzE0LDcgKzcxNCw3IEBACiAJcmV0dXJuIFNWQ19PSzsKIH0KIAotRVhQT1JUX1NZTUJPTChzdmNhdXRoX3VuaXhfc2V0X2NsaWVudCk7CitFWFBPUlRfU1lNQk9MX0dQTChzdmNhdXRoX3VuaXhfc2V0X2NsaWVudCk7CiAKIHN0YXRpYyBpbnQKIHN2Y2F1dGhfbnVsbF9hY2NlcHQoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgX19iZTMyICphdXRocCkKZGlmZiAtLWdpdCBhL25ldC9zdW5ycGMvc3Zjc29jay5jIGIvbmV0L3N1bnJwYy9zdmNzb2NrLmMKaW5kZXggZWYzMjM4ZC4uNTc2M2U2NCAxMDA2NDQKLS0tIGEvbmV0L3N1bnJwYy9zdmNzb2NrLmMKKysrIGIvbmV0L3N1bnJwYy9zdmNzb2NrLmMKQEAgLTU5LDYgKzU5LDcgQEAKIHN0YXRpYyBpbnQJCXN2Y191ZHBfcmVjdmZyb20oc3RydWN0IHN2Y19ycXN0ICopOwogc3RhdGljIGludAkJc3ZjX3VkcF9zZW5kdG8oc3RydWN0IHN2Y19ycXN0ICopOwogc3RhdGljIHZvaWQJCXN2Y19zb2NrX2RldGFjaChzdHJ1Y3Qgc3ZjX3hwcnQgKik7CitzdGF0aWMgdm9pZAkJc3ZjX3RjcF9zb2NrX2RldGFjaChzdHJ1Y3Qgc3ZjX3hwcnQgKik7CiBzdGF0aWMgdm9pZAkJc3ZjX3NvY2tfZnJlZShzdHJ1Y3Qgc3ZjX3hwcnQgKik7CiAKIHN0YXRpYyBzdHJ1Y3Qgc3ZjX3hwcnQgKnN2Y19jcmVhdGVfc29ja2V0KHN0cnVjdCBzdmNfc2VydiAqLCBpbnQsCkBAIC0xMDIsNyArMTAzLDYgQEAKIHN0YXRpYyB2b2lkIHN2Y19yZWxlYXNlX3NrYihzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwKQogewogCXN0cnVjdCBza19idWZmICpza2IgPSBycXN0cC0+cnFfeHBydF9jdHh0OwotCXN0cnVjdCBzdmNfZGVmZXJyZWRfcmVxICpkciA9IHJxc3RwLT5ycV9kZWZlcnJlZDsKIAogCWlmIChza2IpIHsKIAkJc3RydWN0IHN2Y19zb2NrICpzdnNrID0KQEAgLTExMiwxMCArMTEyLDYgQEAKIAkJZHByaW50aygic3ZjOiBzZXJ2aWNlICVwLCByZWxlYXNpbmcgc2tiICVwXG4iLCBycXN0cCwgc2tiKTsKIAkJc2tiX2ZyZWVfZGF0YWdyYW0oc3Zzay0+c2tfc2ssIHNrYik7CiAJfQotCWlmIChkcikgewotCQlycXN0cC0+cnFfZGVmZXJyZWQgPSBOVUxMOwotCQlrZnJlZShkcik7Ci0JfQogfQogCiB1bmlvbiBzdmNfcGt0aW5mb191IHsKQEAgLTI4OSw3ICsyODUsNyBAQAogCQlyZXR1cm4gLUVOT0VOVDsKIAlyZXR1cm4gbGVuOwogfQotRVhQT1JUX1NZTUJPTChzdmNfc29ja19uYW1lcyk7CitFWFBPUlRfU1lNQk9MX0dQTChzdmNfc29ja19uYW1lcyk7CiAKIC8qCiAgKiBDaGVjayBpbnB1dCBxdWV1ZSBsZW5ndGgKQEAgLTEwMTcsNyArMTAxMyw3IEBACiAJLnhwb19yZWN2ZnJvbSA9IHN2Y190Y3BfcmVjdmZyb20sCiAJLnhwb19zZW5kdG8gPSBzdmNfdGNwX3NlbmR0bywKIAkueHBvX3JlbGVhc2VfcnFzdCA9IHN2Y19yZWxlYXNlX3NrYiwKLQkueHBvX2RldGFjaCA9IHN2Y19zb2NrX2RldGFjaCwKKwkueHBvX2RldGFjaCA9IHN2Y190Y3Bfc29ja19kZXRhY2gsCiAJLnhwb19mcmVlID0gc3ZjX3NvY2tfZnJlZSwKIAkueHBvX3ByZXBfcmVwbHlfaGRyID0gc3ZjX3RjcF9wcmVwX3JlcGx5X2hkciwKIAkueHBvX2hhc193c3BhY2UgPSBzdmNfdGNwX2hhc193c3BhY2UsCkBAIC0xMTAxLDcgKzEwOTcsNyBAQAogCX0KIAlzcGluX3VubG9ja19iaCgmc2Vydi0+c3ZfbG9jayk7CiB9Ci1FWFBPUlRfU1lNQk9MKHN2Y19zb2NrX3VwZGF0ZV9idWZzKTsKK0VYUE9SVF9TWU1CT0xfR1BMKHN2Y19zb2NrX3VwZGF0ZV9idWZzKTsKIAogLyoKICAqIEluaXRpYWxpemUgc29ja2V0IGZvciBSUEMgdXNlIGFuZCBjcmVhdGUgc3ZjX3NvY2sgc3RydWN0CkBAIC0xMjg3LDYgKzEyODMsMjQgQEAKIAlzay0+c2tfc3RhdGVfY2hhbmdlID0gc3Zzay0+c2tfb3N0YXRlOwogCXNrLT5za19kYXRhX3JlYWR5ID0gc3Zzay0+c2tfb2RhdGE7CiAJc2stPnNrX3dyaXRlX3NwYWNlID0gc3Zzay0+c2tfb3dzcGFjZTsKKworCWlmIChzay0+c2tfc2xlZXAgJiYgd2FpdHF1ZXVlX2FjdGl2ZShzay0+c2tfc2xlZXApKQorCQl3YWtlX3VwX2ludGVycnVwdGlibGUoc2stPnNrX3NsZWVwKTsKK30KKworLyoKKyAqIERpc2Nvbm5lY3QgdGhlIHNvY2tldCwgYW5kIHJlc2V0IHRoZSBjYWxsYmFja3MKKyAqLworc3RhdGljIHZvaWQgc3ZjX3RjcF9zb2NrX2RldGFjaChzdHJ1Y3Qgc3ZjX3hwcnQgKnhwcnQpCit7CisJc3RydWN0IHN2Y19zb2NrICpzdnNrID0gY29udGFpbmVyX29mKHhwcnQsIHN0cnVjdCBzdmNfc29jaywgc2tfeHBydCk7CisKKwlkcHJpbnRrKCJzdmM6IHN2Y190Y3Bfc29ja19kZXRhY2goJXApXG4iLCBzdnNrKTsKKworCXN2Y19zb2NrX2RldGFjaCh4cHJ0KTsKKworCWlmICghdGVzdF9iaXQoWFBUX0xJU1RFTkVSLCAmeHBydC0+eHB0X2ZsYWdzKSkKKwkJa2VybmVsX3NvY2tfc2h1dGRvd24oc3Zzay0+c2tfc29jaywgU0hVVF9SRFdSKTsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL25ldC90aXBjL2JjYXN0LmggYi9uZXQvdGlwYy9iY2FzdC5oCmluZGV4IDVhYTAyNGIuLjJmMmQ3MzEgMTAwNjQ0Ci0tLSBhL25ldC90aXBjL2JjYXN0LmgKKysrIGIvbmV0L3RpcGMvYmNhc3QuaApAQCAtMTI0LDcgKzEyNCw3IEBACiBzdGF0aWMgaW5saW5lIHZvaWQgdGlwY19ubWFwX2RpZmYoc3RydWN0IHRpcGNfbm9kZV9tYXAgKm5tX2EsIHN0cnVjdCB0aXBjX25vZGVfbWFwICpubV9iLAogCQkJCSAgc3RydWN0IHRpcGNfbm9kZV9tYXAgKm5tX2RpZmYpCiB7Ci0JaW50IHN0b3AgPSBzaXplb2Yobm1fYS0+bWFwKSAvIHNpemVvZih1MzIpOworCWludCBzdG9wID0gQVJSQVlfU0laRShubV9hLT5tYXApOwogCWludCB3OwogCWludCBiOwogCXUzMiBtYXA7CmRpZmYgLS1naXQgYS9uZXQvd2ltYXgvS2NvbmZpZyBiL25ldC93aW1heC9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4NDk1Y2QKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvd2ltYXgvS2NvbmZpZwpAQCAtMCwwICsxLDUyIEBACisjCisjIFdpTUFYIExBTiBkZXZpY2UgY29uZmlndXJhdGlvbgorIworIyBOb3RlIHRoZSB1Z2x5ICdkZXBlbmRzIG9uJyBvbiBXSU1BWDogdGhhdCBkaXNhbGxvd3MgUkZLSUxMIHRvIGJlIGEKKyMgbW9kdWxlIGlmIFdJTUFYIGlzIHRvIGJlIGxpbmtlZCBpbi4gVGhlIFdpTUFYIGNvZGUgaXMgZG9uZSBpbiBzdWNoIGEKKyMgd2F5IHRoYXQgaXQgZG9lc24ndCByZXF1aXJlIGFuZCBleHBsaWNpdCBkZXBlbmRlbmN5IG9uIFJGS0lMTCBpbgorIyBjYXNlIGFuIGVtYmVkZGVkIHN5c3RlbSB3YW50cyB0byByaXAgaXQgb3V0LgorIworIyBBcyB3ZWxsLCBlbmFibGVtZW50IG9mIHRoZSBSRktJTEwgY29kZSBtZWFucyB3ZSBuZWVkIHRoZSBJTlBVVCBsYXllcgorIyBzdXBwb3J0IHRvIGluamVjdCBldmVudHMgY29taW5nIGZyb20gaHcgcmZraWxsIHN3aXRjaGVzLiBUaGF0CisjIGRlcGVuZGVuY3kgY291bGQgYmUga2lsbGVkIGlmIGlucHV0LmggcHJvdmlkZWQgYXBwcm9waWF0ZSBtZWFucyB0bworIyB3b3JrIHdoZW4gaW5wdXQgaXMgZGlzYWJsZWQuCisKK2NvbW1lbnQgIldpTUFYIFdpcmVsZXNzIEJyb2FkYmFuZCBzdXBwb3J0IHJlcXVpcmVzIENPTkZJR19JTlBVVCBlbmFibGVkIgorCWRlcGVuZHMgb24gSU5QVVQgPSBuICYmIFJGS0lMTCAhPSBuCisKK21lbnVjb25maWcgV0lNQVgKKwl0cmlzdGF0ZSAiV2lNQVggV2lyZWxlc3MgQnJvYWRiYW5kIHN1cHBvcnQiCisJZGVwZW5kcyBvbiAoeSAmJiBSRktJTEwgIT0gbSkgfHwgbQorCWRlcGVuZHMgb24gKElOUFVUICYmIFJGS0lMTCAhPSBuKSB8fCBSRktJTEwgPSBuCisJaGVscAorCisJICBTZWxlY3QgdG8gY29uZmlndXJlIHN1cHBvcnQgZm9yIGRldmljZXMgdGhhdCBwcm92aWRlCisJICB3aXJlbGVzcyBicm9hZGJhbmQgY29ubmVjdGl2aXR5IHVzaW5nIHRoZSBXaU1BWCBwcm90b2NvbAorCSAgKElFRUUgODAyLjE2KS4KKworCSAgUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG9mIHRoZXNlIGRldmljZXMgcmVxdWlyZSBzaWduaW5nIHVwCisJICBmb3IgYSBzZXJ2aWNlIHBsYW4gd2l0aCBhIHByb3ZpZGVyLgorCisJICBUaGUgZGlmZmVyZW50IFdpTUFYIGRyaXZlcnMgY2FuIGJlIGVuYWJsZWQgaW4gdGhlIG1lbnUgZW50cnkKKworCSAgRGV2aWNlIERyaXZlcnMgPiBOZXR3b3JrIGRldmljZSBzdXBwb3J0ID4gV2lNQVggV2lyZWxlc3MKKwkgIEJyb2FkYmFuZCBkZXZpY2VzCisKKwkgIElmIHVuc3VyZSwgaXQgaXMgc2FmZSB0byBzZWxlY3QgTSAobW9kdWxlKS4KKworY29uZmlnIFdJTUFYX0RFQlVHX0xFVkVMCisJaW50ICJXaU1BWCBkZWJ1ZyBsZXZlbCIKKwlkZXBlbmRzIG9uIFdJTUFYCisJZGVmYXVsdCA4CisJaGVscAorCisJICBTZWxlY3QgdGhlIG1heGltdW0gZGVidWcgdmVyYm9zaXR5IGxldmVsIHRvIGJlIGNvbXBpbGVkIGludG8KKwkgIHRoZSBXaU1BWCBzdGFjayBjb2RlLgorCisJICBCeSBkZWZhdWx0LCBkZWJ1ZyBtZXNzYWdlcyBhcmUgZGlzYWJsZWQgYXQgcnVudGltZSBhbmQgY2FuCisJICBiZSBzZWxlY3RpdmVseSBlbmFibGVkIGZvciBkaWZmZXJlbnQgcGFydHMgb2YgdGhlIGNvZGUgdXNpbmcKKwkgIHRoZSBzeXNmcyBkZWJ1Zy1sZXZlbHMgZmlsZS4KKworCSAgSWYgc2V0IGF0IHplcm8sIHRoaXMgd2lsbCBjb21waWxlIG91dCBhbGwgdGhlIGRlYnVnIGNvZGUuCisKKwkgIEl0IGlzIHJlY29tbWVuZGVkIHRoYXQgaXQgaXMgbGVmdCBhdCA4LgpkaWZmIC0tZ2l0IGEvbmV0L3dpbWF4L01ha2VmaWxlIGIvbmV0L3dpbWF4L01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViODBiOTQKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvd2ltYXgvTWFrZWZpbGUKQEAgLTAsMCArMSwxMyBAQAorCitvYmotJChDT05GSUdfV0lNQVgpCQkrPSB3aW1heC5vCisKK3dpbWF4LXkgOj0JCVwKKwlpZC10YWJsZS5vCVwKKwlvcC1tc2cubwlcCisJb3AtcmVzZXQubwlcCisJb3AtcmZraWxsLm8JXAorCXN0YWNrLm8KKword2ltYXgtJChDT05GSUdfREVCVUdfRlMpICs9IGRlYnVnZnMubworCisKZGlmZiAtLWdpdCBhL25ldC93aW1heC9kZWJ1Zy1sZXZlbHMuaCBiL25ldC93aW1heC9kZWJ1Zy1sZXZlbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzI5MTIzCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L3dpbWF4L2RlYnVnLWxldmVscy5oCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgKiBMaW51eCBXaU1BWCBTdGFjaworICogRGVidWcgbGV2ZWxzIGNvbnRyb2wgZmlsZSBmb3IgdGhlIHdpbWF4IG1vZHVsZQorICoKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBJbnRlbCBDb3Jwb3JhdGlvbiA8bGludXgtd2ltYXhAaW50ZWwuY29tPgorICogSW5ha3kgUGVyZXotR29uemFsZXogPGluYWt5LnBlcmV6LWdvbnphbGV6QGludGVsLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxLCBVU0EuCisgKi8KKyNpZm5kZWYgX19kZWJ1Z19sZXZlbHNfX2hfXworI2RlZmluZSBfX2RlYnVnX2xldmVsc19faF9fCisKKy8qIE1heGltdW0gY29tcGlsZSBhbmQgcnVuIHRpbWUgZGVidWcgbGV2ZWwgZm9yIGFsbCBzdWJtb2R1bGVzICovCisjZGVmaW5lIERfTU9EVUxFTkFNRSB3aW1heAorI2RlZmluZSBEX01BU1RFUiBDT05GSUdfV0lNQVhfREVCVUdfTEVWRUwKKworI2luY2x1ZGUgPGxpbnV4L3dpbWF4L2RlYnVnLmg+CisKKy8qIExpc3Qgb2YgYWxsIHRoZSBlbmFibGVkIG1vZHVsZXMgKi8KK2VudW0gZF9tb2R1bGUgeworCURfU1VCTU9EVUxFX0RFQ0xBUkUoZGVidWdmcyksCisJRF9TVUJNT0RVTEVfREVDTEFSRShpZF90YWJsZSksCisJRF9TVUJNT0RVTEVfREVDTEFSRShvcF9tc2cpLAorCURfU1VCTU9EVUxFX0RFQ0xBUkUob3BfcmVzZXQpLAorCURfU1VCTU9EVUxFX0RFQ0xBUkUob3BfcmZraWxsKSwKKwlEX1NVQk1PRFVMRV9ERUNMQVJFKHN0YWNrKSwKK307CisKKyNlbmRpZiAvKiAjaWZuZGVmIF9fZGVidWdfbGV2ZWxzX19oX18gKi8KZGlmZiAtLWdpdCBhL25ldC93aW1heC9kZWJ1Z2ZzLmMgYi9uZXQvd2ltYXgvZGVidWdmcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3Y2Y0NDMKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvd2ltYXgvZGVidWdmcy5jCkBAIC0wLDAgKzEsOTAgQEAKKy8qCisgKiBMaW51eCBXaU1BWAorICogRGVidWdmcyBzdXBwb3J0CisgKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNS0yMDA2IEludGVsIENvcnBvcmF0aW9uIDxsaW51eC13aW1heEBpbnRlbC5jb20+CisgKiBJbmFreSBQZXJlei1Hb256YWxleiA8aW5ha3kucGVyZXotZ29uemFsZXpAaW50ZWwuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KKyNpbmNsdWRlIDxsaW51eC93aW1heC5oPgorI2luY2x1ZGUgIndpbWF4LWludGVybmFsLmgiCisKKyNkZWZpbmUgRF9TVUJNT0RVTEUgZGVidWdmcworI2luY2x1ZGUgImRlYnVnLWxldmVscy5oIgorCisKKy8qIERlYnVnIGZyYW1ld29yayBjb250cm9sIG9mIGRlYnVnIGxldmVscyAqLworc3RydWN0IGRfbGV2ZWwgRF9MRVZFTFtdID0geworCURfU1VCTU9EVUxFX0RFRklORShkZWJ1Z2ZzKSwKKwlEX1NVQk1PRFVMRV9ERUZJTkUoaWRfdGFibGUpLAorCURfU1VCTU9EVUxFX0RFRklORShvcF9tc2cpLAorCURfU1VCTU9EVUxFX0RFRklORShvcF9yZXNldCksCisJRF9TVUJNT0RVTEVfREVGSU5FKG9wX3Jma2lsbCksCisJRF9TVUJNT0RVTEVfREVGSU5FKHN0YWNrKSwKK307CitzaXplX3QgRF9MRVZFTF9TSVpFID0gQVJSQVlfU0laRShEX0xFVkVMKTsKKworI2RlZmluZSBfX2RlYnVnZnNfcmVnaXN0ZXIocHJlZml4LCBuYW1lLCBwYXJlbnQpCQkJXAorZG8gewkJCQkJCQkJCVwKKwlyZXN1bHQgPSBkX2xldmVsX3JlZ2lzdGVyX2RlYnVnZnMocHJlZml4LCBuYW1lLCBwYXJlbnQpOwlcCisJaWYgKHJlc3VsdCA8IDApCQkJCQkJCVwKKwkJZ290byBlcnJvcjsJCQkJCQlcCit9IHdoaWxlICgwKQorCisKK2ludCB3aW1heF9kZWJ1Z2ZzX2FkZChzdHJ1Y3Qgd2ltYXhfZGV2ICp3aW1heF9kZXYpCit7CisJaW50IHJlc3VsdDsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldiA9IHdpbWF4X2Rldi0+bmV0X2RldjsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBuZXRfZGV2LT5kZXYucGFyZW50OworCXN0cnVjdCBkZW50cnkgKmRlbnRyeTsKKwljaGFyIGJ1ZlsxMjhdOworCisJc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIndpbWF4OiVzIiwgbmV0X2Rldi0+bmFtZSk7CisJZGVudHJ5ID0gZGVidWdmc19jcmVhdGVfZGlyKGJ1ZiwgTlVMTCk7CisJcmVzdWx0ID0gUFRSX0VSUihkZW50cnkpOworCWlmIChJU19FUlIoZGVudHJ5KSkgeworCQlpZiAocmVzdWx0ID09IC1FTk9ERVYpCisJCQlyZXN1bHQgPSAwOwkvKiBObyBkZWJ1Z2ZzIHN1cHBvcnQgKi8KKwkJZWxzZQorCQkJZGV2X2VycihkZXYsICJDYW4ndCBjcmVhdGUgZGVidWdmcyBkZW50cnk6ICVkXG4iLAorCQkJCXJlc3VsdCk7CisJCWdvdG8gb3V0OworCX0KKwl3aW1heF9kZXYtPmRlYnVnZnNfZGVudHJ5ID0gZGVudHJ5OworCV9fZGVidWdmc19yZWdpc3Rlcigid2ltYXhfZGxfIiwgZGVidWdmcywgZGVudHJ5KTsKKwlfX2RlYnVnZnNfcmVnaXN0ZXIoIndpbWF4X2RsXyIsIGlkX3RhYmxlLCBkZW50cnkpOworCV9fZGVidWdmc19yZWdpc3Rlcigid2ltYXhfZGxfIiwgb3BfbXNnLCBkZW50cnkpOworCV9fZGVidWdmc19yZWdpc3Rlcigid2ltYXhfZGxfIiwgb3BfcmVzZXQsIGRlbnRyeSk7CisJX19kZWJ1Z2ZzX3JlZ2lzdGVyKCJ3aW1heF9kbF8iLCBvcF9yZmtpbGwsIGRlbnRyeSk7CisJX19kZWJ1Z2ZzX3JlZ2lzdGVyKCJ3aW1heF9kbF8iLCBzdGFjaywgZGVudHJ5KTsKKwlyZXN1bHQgPSAwOworb3V0OgorCXJldHVybiByZXN1bHQ7CisKK2Vycm9yOgorCWRlYnVnZnNfcmVtb3ZlX3JlY3Vyc2l2ZSh3aW1heF9kZXYtPmRlYnVnZnNfZGVudHJ5KTsKKwlyZXR1cm4gcmVzdWx0OworfQorCit2b2lkIHdpbWF4X2RlYnVnZnNfcm0oc3RydWN0IHdpbWF4X2RldiAqd2ltYXhfZGV2KQoreworCWRlYnVnZnNfcmVtb3ZlX3JlY3Vyc2l2ZSh3aW1heF9kZXYtPmRlYnVnZnNfZGVudHJ5KTsKK30KKworCmRpZmYgLS1naXQgYS9uZXQvd2ltYXgvaWQtdGFibGUuYyBiL25ldC93aW1heC9pZC10YWJsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlNjg1ZjcKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvd2ltYXgvaWQtdGFibGUuYwpAQCAtMCwwICsxLDE0NCBAQAorLyoKKyAqIExpbnV4IFdpTUFYCisgKiBNYXBwcGluZyBvZiBnZW5lcmljIG5ldGxpbmsgZmFtaWx5IElEcyB0byBuZXQgZGV2aWNlcworICoKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUtMjAwNiBJbnRlbCBDb3Jwb3JhdGlvbiA8bGludXgtd2ltYXhAaW50ZWwuY29tPgorICogSW5ha3kgUGVyZXotR29uemFsZXogPGluYWt5LnBlcmV6LWdvbnphbGV6QGludGVsLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxLCBVU0EuCisgKgorICoKKyAqIFdlIGFzc2lnbiBhIHNpbmdsZSBnZW5lcmljIG5ldGxpbmsgZmFtaWx5IElEIHRvIGVhY2ggZGV2aWNlICh0bworICogc2ltcGxpZnkgbG9va3VwKS4KKyAqCisgKiBXZSBuZWVkIGEgd2F5IHRvIG1hcCBmYW1pbHkgSUQgdG8gYSB3aW1heF9kZXYgcG9pbnRlci4KKyAqCisgKiBUaGUgaWRlYSBpcyB0byB1c2UgYSB2ZXJ5IHNpbXBsZSBsb29rdXAuIFVzaW5nIGEgbmV0bGluayBhdHRyaWJ1dGUKKyAqIHdpdGggKGZvciBleGFtcGxlKSB0aGUgaW50ZXJmYWNlIG5hbWUgaW1wbGllcyBhIGhlYXZpZXIgc2VhcmNoIG92ZXIKKyAqIGFsbCB0aGUgbmV0d29yayBkZXZpY2VzOyBzZWVtZWQga2luZCBvZiBhIHdhc3RlIGdpdmVuIHRoYXQgd2Uga25vdworICogd2UgYXJlIGxvb2tpbmcgZm9yIGEgV2lNQVggZGV2aWNlIGFuZCB0aGF0IG1vc3Qgc3lzdGVtcyB3aWxsIGhhdmUKKyAqIGp1c3QgYSBzaW5nbGUgV2lNQVggYWRhcHRlci4KKyAqCisgKiBXZSBwdXQgYWxsIHRoZSBXaU1BWCBkZXZpY2VzIGluIHRoZSBzeXN0ZW0gaW4gYSBsaW5rZWQgbGlzdCBhbmQKKyAqIG1hdGNoIHRoZSBnZW5lcmljIGxpbmsgZmFtaWx5IElEIGFnYWluc3QgdGhlIGxpc3QuCisgKgorICogQnkgdXNpbmcgYSBsaW5rZWQgbGlzdCwgdGhlIGNhc2Ugb2YgYSBzaW5nbGUgYWRhcHRlciBpbiB0aGUgc3lzdGVtCisgKiBiZWNvbWVzIChhbG1vc3QpIG5vIG92ZXJoZWFkLCB3aGlsZSBzdGlsbCB3b3JraW5nIGZvciBtYW55IG1vcmUuIElmCisgKiBpdCBldmVyIGdvZXMgYmV5b25kIHR3bywgSSdsbCBiZSBzdXJwcmlzZWQuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxuZXQvZ2VuZXRsaW5rLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L3dpbWF4Lmg+CisjaW5jbHVkZSAid2ltYXgtaW50ZXJuYWwuaCIKKworCisjZGVmaW5lIERfU1VCTU9EVUxFIGlkX3RhYmxlCisjaW5jbHVkZSAiZGVidWctbGV2ZWxzLmgiCisKKworc3RhdGljIERFRklORV9TUElOTE9DSyh3aW1heF9pZF90YWJsZV9sb2NrKTsKK3N0YXRpYyBzdHJ1Y3QgbGlzdF9oZWFkIHdpbWF4X2lkX3RhYmxlID0gTElTVF9IRUFEX0lOSVQod2ltYXhfaWRfdGFibGUpOworCisKKy8qCisgKiB3aW1heF9pZF90YWJsZV9hZGQgLSBhZGQgYSBnZW5uZXRsaW5rIGZhbWlsaXkgSUQgLyB3aW1heF9kZXYgbWFwcGluZworICoKKyAqIEB3aW1heF9kZXY6IFdpTUFYIGRldmljZSBkZXNjcmlwdG9yIHRvIGFzc29jaWF0ZSB0byB0aGUgR2VuZXJpYworICogICAgIE5ldGxpbmsgZmFtaWx5IElELgorICoKKyAqIExvb2sgZm9yIGFuIGVtcHR5IHNwb3QgaW4gdGhlIElEIHRhYmxlOyBpZiBub25lIGZvdW5kLCBkb3VibGUgdGhlCisgKiB0YWJsZSdzIHNpemUgYW5kIGdldCB0aGUgZmlyc3Qgc3BvdC4KKyAqLwordm9pZCB3aW1heF9pZF90YWJsZV9hZGQoc3RydWN0IHdpbWF4X2RldiAqd2ltYXhfZGV2KQoreworCWRfZm5zdGFydCgzLCBOVUxMLCAiKHdpbWF4X2RldiAlcClcbiIsIHdpbWF4X2Rldik7CisJc3Bpbl9sb2NrKCZ3aW1heF9pZF90YWJsZV9sb2NrKTsKKwlsaXN0X2FkZCgmd2ltYXhfZGV2LT5pZF90YWJsZV9ub2RlLCAmd2ltYXhfaWRfdGFibGUpOworCXNwaW5fdW5sb2NrKCZ3aW1heF9pZF90YWJsZV9sb2NrKTsKKwlkX2ZuZW5kKDMsIE5VTEwsICIod2ltYXhfZGV2ICVwKVxuIiwgd2ltYXhfZGV2KTsKK30KKworCisvKgorICogd2ltYXhfZ2V0X25ldGRldl9ieV9pbmZvIC0gbG9va3VwIGEgd2ltYXhfZGV2IGZyb20gdGhlIGdlbm5ldGxpbmsgaW5mbworICoKKyAqIFRoZSBnZW5lcmljIG5ldGxpbmsgZmFtaWx5IElEIGhhcyBiZWVuIGZpbGxlZCBvdXQgaW4gdGhlCisgKiBubG1zZ2hkci0+bmxtc2dfdHlwZSBmaWVsZCwgc28gd2UgcHVsbCBpdCBmcm9tIHRoZXJlLCBsb29rIGl0IHVwIGluCisgKiB0aGUgbWFwcGluZyB0YWJsZSBhbmQgcmVmZXJlbmNlIHRoZSB3aW1heF9kZXYuCisgKgorICogV2hlbiBkb25lLCB0aGUgcmVmZXJlbmNlIHNob3VsZCBiZSBkcm9wcGVkIHdpdGgKKyAqICdkZXZfcHV0KHdpbWF4X2Rldi0+bmV0X2RldiknLgorICovCitzdHJ1Y3Qgd2ltYXhfZGV2ICp3aW1heF9kZXZfZ2V0X2J5X2dlbmxfaW5mbygKKwlzdHJ1Y3QgZ2VubF9pbmZvICppbmZvLCBpbnQgaWZpbmRleCkKK3sKKwlzdHJ1Y3Qgd2ltYXhfZGV2ICp3aW1heF9kZXYgPSBOVUxMOworCisJZF9mbnN0YXJ0KDMsIE5VTEwsICIoaW5mbyAlcCBpZmluZGV4ICVkKVxuIiwgaW5mbywgaWZpbmRleCk7CisJc3Bpbl9sb2NrKCZ3aW1heF9pZF90YWJsZV9sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHdpbWF4X2RldiwgJndpbWF4X2lkX3RhYmxlLCBpZF90YWJsZV9ub2RlKSB7CisJCWlmICh3aW1heF9kZXYtPm5ldF9kZXYtPmlmaW5kZXggPT0gaWZpbmRleCkgeworCQkJZGV2X2hvbGQod2ltYXhfZGV2LT5uZXRfZGV2KTsKKwkJCWJyZWFrOworCQl9CisJfQorCWlmICh3aW1heF9kZXYgPT0gTlVMTCkKKwkJZF9wcmludGYoMSwgTlVMTCwgIndpbWF4OiBubyBkZXZpY2VzIGZvdW5kIHdpdGggaWZpbmRleCAlZFxuIiwKKwkJCSBpZmluZGV4KTsKKwlzcGluX3VubG9jaygmd2ltYXhfaWRfdGFibGVfbG9jayk7CisJZF9mbmVuZCgzLCBOVUxMLCAiKGluZm8gJXAgaWZpbmRleCAlZCkgPSAlcFxuIiwKKwkJaW5mbywgaWZpbmRleCwgd2ltYXhfZGV2KTsKKwlyZXR1cm4gd2ltYXhfZGV2OworfQorCisKKy8qCisgKiB3aW1heF9pZF90YWJsZV9ybSAtIFJlbW92ZSBhIGdlbm5ldGxpbmsgZmFtaWxpeSBJRCAvIHdpbWF4X2RldiBtYXBwaW5nCisgKgorICogQGlkOiBmYW1pbHkgSUQgdG8gcmVtb3ZlIGZyb20gdGhlIHRhYmxlCisgKi8KK3ZvaWQgd2ltYXhfaWRfdGFibGVfcm0oc3RydWN0IHdpbWF4X2RldiAqd2ltYXhfZGV2KQoreworCXNwaW5fbG9jaygmd2ltYXhfaWRfdGFibGVfbG9jayk7CisJbGlzdF9kZWxfaW5pdCgmd2ltYXhfZGV2LT5pZF90YWJsZV9ub2RlKTsKKwlzcGluX3VubG9jaygmd2ltYXhfaWRfdGFibGVfbG9jayk7Cit9CisKKworLyoKKyAqIFJlbGVhc2UgdGhlIGdlbm5ldGxpbmsgZmFtaWx5IGlkIC8gbWFwcGluZyB0YWJsZQorICoKKyAqIE9uIGRlYnVnLCB2ZXJpZnkgdGhhdCB0aGUgdGFibGUgaXMgZW1wdHkgdXBvbiByZW1vdmFsLiBXZSB3YW50IHRoZQorICogY29kZSBhbHdheXMgY29tcGlsZWQsIHRvIGVuc3VyZSBpdCBkb2Vzbid0IGJpdCByb3QuIEl0IHdpbGwgYmUKKyAqIGNvbXBpbGVkIG91dCBpZiBDT05GSUdfQlVHIGlzIGRpc2FibGVkLgorICovCit2b2lkIHdpbWF4X2lkX3RhYmxlX3JlbGVhc2Uodm9pZCkKK3sKKwlzdHJ1Y3Qgd2ltYXhfZGV2ICp3aW1heF9kZXY7CisKKyNpZm5kZWYgQ09ORklHX0JVRworCXJldHVybjsKKyNlbmRpZgorCXNwaW5fbG9jaygmd2ltYXhfaWRfdGFibGVfbG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeSh3aW1heF9kZXYsICZ3aW1heF9pZF90YWJsZSwgaWRfdGFibGVfbm9kZSkgeworCQlwcmludGsoS0VSTl9FUlIgIkJVRzogJXMgd2ltYXhfZGV2ICVwIGlmaW5kZXggJWQgbm90IGNsZWFyZWRcbiIsCisJCSAgICAgICBfX2Z1bmNfXywgd2ltYXhfZGV2LCB3aW1heF9kZXYtPm5ldF9kZXYtPmlmaW5kZXgpOworCQlXQVJOX09OKDEpOworCX0KKwlzcGluX3VubG9jaygmd2ltYXhfaWRfdGFibGVfbG9jayk7Cit9CmRpZmYgLS1naXQgYS9uZXQvd2ltYXgvb3AtbXNnLmMgYi9uZXQvd2ltYXgvb3AtbXNnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2IzYjRhZAotLS0gL2Rldi9udWxsCisrKyBiL25ldC93aW1heC9vcC1tc2cuYwpAQCAtMCwwICsxLDQyMSBAQAorLyoKKyAqIExpbnV4IFdpTUFYCisgKiBHZW5lcmljIG1lc3NhZ2luZyBpbnRlcmZhY2UgYmV0d2VlbiB1c2Vyc3BhY2UgYW5kIGRyaXZlci9kZXZpY2UKKyAqCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggSW50ZWwgQ29ycG9yYXRpb24gPGxpbnV4LXdpbWF4QGludGVsLmNvbT4KKyAqIEluYWt5IFBlcmV6LUdvbnphbGV6IDxpbmFreS5wZXJlei1nb256YWxlekBpbnRlbC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSwgVVNBLgorICoKKyAqCisgKiBUaGlzIGltcGxlbWVudHMgYSBkaXJlY3QgY29tbXVuaWNhdGlvbiBjaGFubmVsIGJldHdlZW4gdXNlciBzcGFjZSBhbmQKKyAqIHRoZSBkcml2ZXIvZGV2aWNlLCBieSB3aGljaCBmcmVlIGZvcm0gbWVzc2FnZXMgY2FuIGJlIHNlbnQgYmFjayBhbmQKKyAqIGZvcnRoLgorICoKKyAqIFRoaXMgaXMgaW50ZW5kZWQgZm9yIGRldmljZS1zcGVjaWZpYyBmZWF0dXJlcywgdmVuZG9yIHF1aXJrcywgZXRjLgorICoKKyAqIFNlZSBpbmNsdWRlL25ldC93aW1heC5oCisgKgorICogR0VORVJJQyBORVRMSU5LIEVOQ09ESU5HIEFORCBDQVBBQ0lUWQorICoKKyAqIEEgZGVzdGluYXRpb24gInBpcGUgbmFtZSIgaXMgYWRkZWQgdG8gZWFjaCBtZXNzYWdlOyBpdCBpcyB1cCB0byB0aGUKKyAqIGRyaXZlcnMgdG8gYXNzaWduIG9yIHVzZSB0aG9zZSBuYW1lcyAoaWYgdXNpbmcgdGhlbSBhdCBhbGwpLgorICoKKyAqIE1lc3NhZ2VzIGFyZSBlbmNvZGVkIGFzIGEgYmluYXJ5IG5ldGxpbmsgYXR0cmlidXRlIHVzaW5nIG5sYV9wdXQoKQorICogdXNpbmcgdHlwZSBOTEFfVU5TUEVDIChhcyBzb21lIHZlcnNpb25zIG9mIGxpYm5sIHN0aWxsIGluCisgKiBkZXBsb3ltZW50IGRvbid0IHlldCB1bmRlcnN0YW5kIE5MQV9CSU5BUlkpLgorICoKKyAqIFRoZSBtYXhpbXVtIGNhcGFjaXR5IG9mIHRoaXMgdHJhbnNwb3J0IGlzIFBBR0VTSVpFIHBlciBtZXNzYWdlIChzbworICogdGhlIGFjdHVhbCBwYXlsb2FkIHdpbGwgYmUgYml0IHNtYWxsZXIgZGVwZW5kaW5nIG9uIHRoZQorICogbmV0bGluay9nZW5lcmljIG5ldGxpbmsgYXR0cmlidXRlcyBhbmQgaGVhZGVycykuCisgKgorICogUkVDRVBUSU9OIE9GIE1FU1NBR0VTCisgKgorICogV2hlbiBhIG1lc3NhZ2UgaXMgcmVjZWl2ZWQgZnJvbSB1c2VyIHNwYWNlLCBpdCBpcyBwYXNzZWQgdmVyYmF0aW0KKyAqIHRvIHRoZSBkcml2ZXIgY2FsbGluZyB3aW1heF9kZXYtPm9wX21zZ19mcm9tX3VzZXIoKS4gVGhlIHJldHVybgorICogdmFsdWUgZnJvbSB0aGlzIGZ1bmN0aW9uIGlzIHBhc3NlZCBiYWNrIHRvIHVzZXIgc3BhY2UgYXMgYW4gYWNrCisgKiBvdmVyIHRoZSBnZW5lcmljIG5ldGxpbmsgcHJvdG9jb2wuCisgKgorICogVGhlIHN0YWNrIGRvZXNuJ3QgZG8gYW55IHByb2Nlc3Npbmcgb3IgaW50ZXJwcmV0YXRpb24gb2YgdGhlc2UKKyAqIG1lc3NhZ2VzLgorICoKKyAqIFNFTkRJTkcgTUVTU0FHRVMKKyAqCisgKiBNZXNzYWdlcyBjYW4gYmUgc2VudCB3aXRoIHdpbWF4X21zZygpLgorICoKKyAqIElmIHRoZSBtZXNzYWdlIGRlbGl2ZXJ5IG5lZWRzIHRvIGhhcHBlbiBvbiBhIGRpZmZlcmVudCBjb250ZXh0IHRvCisgKiB0aGF0IG9mIGl0cyBjcmVhdGlvbiwgd2ltYXhfbXNnX2FsbG9jKCkgY2FuIGJlIHVzZWQgdG8gZ2V0IGEKKyAqIHBvaW50ZXIgdG8gdGhlIG1lc3NhZ2UgdGhhdCBjYW4gYmUgZGVsaXZlcmVkIGxhdGVyIG9uIHdpdGgKKyAqIHdpbWF4X21zZ19zZW5kKCkuCisgKgorICogUk9BRE1BUAorICoKKyAqIHdpbWF4X2dubF9kb2l0X21zZ19mcm9tX3VzZXIoKSAgICBQcm9jZXNzIGEgbWVzc2FnZSBmcm9tIHVzZXIgc3BhY2UKKyAqICAgd2ltYXhfZGV2X2dldF9ieV9nZW5sX2luZm8oKQorICogICB3aW1heF9kZXYtPm9wX21zZ19mcm9tX3VzZXIoKSAgIERlbGl2ZXJ5IG9mIG1lc3NhZ2UgdG8gdGhlIGRyaXZlcgorICoKKyAqIHdpbWF4X21zZygpICAgICAgICAgICAgICAgICAgICAgICBTZW5kIGEgbWVzc2FnZSB0byB1c2VyIHNwYWNlCisgKiAgIHdpbWF4X21zZ19hbGxvYygpCisgKiAgIHdpbWF4X21zZ19zZW5kKCkKKyAqLworI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPG5ldC9nZW5ldGxpbmsuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC93aW1heC5oPgorI2luY2x1ZGUgPGxpbnV4L3NlY3VyaXR5Lmg+CisjaW5jbHVkZSAid2ltYXgtaW50ZXJuYWwuaCIKKworCisjZGVmaW5lIERfU1VCTU9EVUxFIG9wX21zZworI2luY2x1ZGUgImRlYnVnLWxldmVscy5oIgorCisKKy8qKgorICogd2ltYXhfbXNnX2FsbG9jIC0gQ3JlYXRlIGEgbmV3IHNrYiBmb3Igc2VuZGluZyBhIG1lc3NhZ2UgdG8gdXNlcnNwYWNlCisgKgorICogQHdpbWF4X2RldjogV2lNQVggZGV2aWNlIGRlc2NyaXB0b3IKKyAqIEBwaXBlX25hbWU6ICJuYW1lZCBwaXBlIiB0aGUgbWVzc2FnZSB3aWxsIGJlIHNlbnQgdG8KKyAqIEBtc2c6IHBvaW50ZXIgdG8gdGhlIG1lc3NhZ2UgZGF0YSB0byBzZW5kCisgKiBAc2l6ZTogc2l6ZSBvZiB0aGUgbWVzc2FnZSB0byBzZW5kIChpbiBieXRlcyksIGluY2x1ZGluZyB0aGUgaGVhZGVyLgorICogQGdmcF9mbGFnczogZmxhZ3MgZm9yIG1lbW9yeSBhbGxvY2F0aW9uLgorICoKKyAqIFJldHVybnM6ICUwIGlmIG9rLCBuZWdhdGl2ZSBlcnJubyBjb2RlIG9uIGVycm9yCisgKgorICogRGVzY3JpcHRpb246CisgKgorICogQWxsb2NhdGVzIGFuIHNrYiB0aGF0IHdpbGwgY29udGFpbiB0aGUgbWVzc2FnZSB0byBzZW5kIHRvIHVzZXIKKyAqIHNwYWNlIG92ZXIgdGhlIG1lc3NhZ2luZyBwaXBlIGFuZCBpbml0aWFsaXplcyBpdCwgY29weWluZyB0aGUKKyAqIHBheWxvYWQuCisgKgorICogT25jZSB0aGlzIGNhbGwgaXMgZG9uZSwgeW91IGNhbiBkZWxpdmVyIGl0IHdpdGgKKyAqIHdpbWF4X21zZ19zZW5kKCkuCisgKgorICogSU1QT1JUQU5UOgorICoKKyAqIERvbid0IHVzZSBza2JfcHVzaCgpL3NrYl9wdWxsKCkvc2tiX3Jlc2VydmUoKSBvbiB0aGUgc2tiLCBhcworICogd2ltYXhfbXNnX3NlbmQoKSBkZXBlbmRzIG9uIHNrYi0+ZGF0YSBiZWluZyBwbGFjZWQgYXQgdGhlCisgKiBiZWdpbm5pbmcgb2YgdGhlIHVzZXIgbWVzc2FnZS4KKyAqLworc3RydWN0IHNrX2J1ZmYgKndpbWF4X21zZ19hbGxvYyhzdHJ1Y3Qgd2ltYXhfZGV2ICp3aW1heF9kZXYsCisJCQkJY29uc3QgY2hhciAqcGlwZV9uYW1lLAorCQkJCWNvbnN0IHZvaWQgKm1zZywgc2l6ZV90IHNpemUsCisJCQkJZ2ZwX3QgZ2ZwX2ZsYWdzKQoreworCWludCByZXN1bHQ7CisJc3RydWN0IGRldmljZSAqZGV2ID0gd2ltYXhfZGV2LT5uZXRfZGV2LT5kZXYucGFyZW50OworCXNpemVfdCBtc2dfc2l6ZTsKKwl2b2lkICpnZW5sX21zZzsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJbXNnX3NpemUgPSBubGFfdG90YWxfc2l6ZShzaXplKQorCQkrIG5sYV90b3RhbF9zaXplKHNpemVvZih1MzIpKQorCQkrIChwaXBlX25hbWUgPyBubGFfdG90YWxfc2l6ZShzdHJsZW4ocGlwZV9uYW1lKSkgOiAwKTsKKwlyZXN1bHQgPSAtRU5PTUVNOworCXNrYiA9IGdlbmxtc2dfbmV3KG1zZ19zaXplLCBnZnBfZmxhZ3MpOworCWlmIChza2IgPT0gTlVMTCkKKwkJZ290byBlcnJvcl9uZXc7CisJZ2VubF9tc2cgPSBnZW5sbXNnX3B1dChza2IsIDAsIDAsICZ3aW1heF9nbmxfZmFtaWx5LAorCQkJICAgICAgIDAsIFdJTUFYX0dOTF9PUF9NU0dfVE9fVVNFUik7CisJaWYgKGdlbmxfbXNnID09IE5VTEwpIHsKKwkJZGV2X2VycihkZXYsICJubyBtZW1vcnkgdG8gY3JlYXRlIGdlbmVyaWMgbmV0bGluayBtZXNzYWdlXG4iKTsKKwkJZ290byBlcnJvcl9nZW5sbXNnX3B1dDsKKwl9CisJcmVzdWx0ID0gbmxhX3B1dF91MzIoc2tiLCBXSU1BWF9HTkxfTVNHX0lGSURYLAorCQkJICAgICB3aW1heF9kZXYtPm5ldF9kZXYtPmlmaW5kZXgpOworCWlmIChyZXN1bHQgPCAwKSB7CisJCWRldl9lcnIoZGV2LCAibm8gbWVtb3J5IHRvIGFkZCBpZmluZGV4IGF0dHJpYnV0ZVxuIik7CisJCWdvdG8gZXJyb3JfbmxhX3B1dDsKKwl9CisJaWYgKHBpcGVfbmFtZSkgeworCQlyZXN1bHQgPSBubGFfcHV0X3N0cmluZyhza2IsIFdJTUFYX0dOTF9NU0dfUElQRV9OQU1FLAorCQkJCQlwaXBlX25hbWUpOworCQlpZiAocmVzdWx0IDwgMCkgeworCQkJZGV2X2VycihkZXYsICJubyBtZW1vcnkgdG8gYWRkIHBpcGVfbmFtZSBhdHRyaWJ1dGVcbiIpOworCQkJZ290byBlcnJvcl9ubGFfcHV0OworCQl9CisJfQorCXJlc3VsdCA9IG5sYV9wdXQoc2tiLCBXSU1BWF9HTkxfTVNHX0RBVEEsIHNpemUsIG1zZyk7CisJaWYgKHJlc3VsdCA8IDApIHsKKwkJZGV2X2VycihkZXYsICJubyBtZW1vcnkgdG8gYWRkIHBheWxvYWQgaW4gYXR0cmlidXRlXG4iKTsKKwkJZ290byBlcnJvcl9ubGFfcHV0OworCX0KKwlnZW5sbXNnX2VuZChza2IsIGdlbmxfbXNnKTsKKwlyZXR1cm4gc2tiOworCitlcnJvcl9ubGFfcHV0OgorZXJyb3JfZ2VubG1zZ19wdXQ6CitlcnJvcl9uZXc6CisJbmxtc2dfZnJlZShza2IpOworCXJldHVybiBFUlJfUFRSKHJlc3VsdCk7CisKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHdpbWF4X21zZ19hbGxvYyk7CisKKworLyoqCisgKiB3aW1heF9tc2dfZGF0YV9sZW4gLSBSZXR1cm4gYSBwb2ludGVyIGFuZCBzaXplIG9mIGEgbWVzc2FnZSdzIHBheWxvYWQKKyAqCisgKiBAbXNnOiBQb2ludGVyIHRvIGEgbWVzc2FnZSBjcmVhdGVkIHdpdGggd2ltYXhfbXNnX2FsbG9jKCkKKyAqIEBzaXplOiBQb2ludGVyIHRvIHdoZXJlIHRvIHN0b3JlIHRoZSBtZXNzYWdlJ3Mgc2l6ZQorICoKKyAqIFJldHVybnMgdGhlIHBvaW50ZXIgdG8gdGhlIG1lc3NhZ2UgZGF0YS4KKyAqLworY29uc3Qgdm9pZCAqd2ltYXhfbXNnX2RhdGFfbGVuKHN0cnVjdCBza19idWZmICptc2csIHNpemVfdCAqc2l6ZSkKK3sKKwlzdHJ1Y3Qgbmxtc2doZHIgKm5saCA9ICh2b2lkICopIG1zZy0+aGVhZDsKKwlzdHJ1Y3QgbmxhdHRyICpubGE7CisKKwlubGEgPSBubG1zZ19maW5kX2F0dHIobmxoLCBzaXplb2Yoc3RydWN0IGdlbmxtc2doZHIpLAorCQkJICAgICAgV0lNQVhfR05MX01TR19EQVRBKTsKKwlpZiAobmxhID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJDYW5ub3QgZmluZCBhdHRyaWJ1dGUgV0lNQVhfR05MX01TR19EQVRBXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCSpzaXplID0gbmxhX2xlbihubGEpOworCXJldHVybiBubGFfZGF0YShubGEpOworfQorRVhQT1JUX1NZTUJPTF9HUEwod2ltYXhfbXNnX2RhdGFfbGVuKTsKKworCisvKioKKyAqIHdpbWF4X21zZ19kYXRhIC0gUmV0dXJuIGEgcG9pbnRlciB0byBhIG1lc3NhZ2UncyBwYXlsb2FkCisgKgorICogQG1zZzogUG9pbnRlciB0byBhIG1lc3NhZ2UgY3JlYXRlZCB3aXRoIHdpbWF4X21zZ19hbGxvYygpCisgKi8KK2NvbnN0IHZvaWQgKndpbWF4X21zZ19kYXRhKHN0cnVjdCBza19idWZmICptc2cpCit7CisJc3RydWN0IG5sbXNnaGRyICpubGggPSAodm9pZCAqKSBtc2ctPmhlYWQ7CisJc3RydWN0IG5sYXR0ciAqbmxhOworCisJbmxhID0gbmxtc2dfZmluZF9hdHRyKG5saCwgc2l6ZW9mKHN0cnVjdCBnZW5sbXNnaGRyKSwKKwkJCSAgICAgIFdJTUFYX0dOTF9NU0dfREFUQSk7CisJaWYgKG5sYSA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUiAiQ2Fubm90IGZpbmQgYXR0cmlidXRlIFdJTUFYX0dOTF9NU0dfREFUQVxuIik7CisJCXJldHVybiBOVUxMOworCX0KKwlyZXR1cm4gbmxhX2RhdGEobmxhKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHdpbWF4X21zZ19kYXRhKTsKKworCisvKioKKyAqIHdpbWF4X21zZ19sZW4gLSBSZXR1cm4gYSBtZXNzYWdlJ3MgcGF5bG9hZCBsZW5ndGgKKyAqCisgKiBAbXNnOiBQb2ludGVyIHRvIGEgbWVzc2FnZSBjcmVhdGVkIHdpdGggd2ltYXhfbXNnX2FsbG9jKCkKKyAqLworc3NpemVfdCB3aW1heF9tc2dfbGVuKHN0cnVjdCBza19idWZmICptc2cpCit7CisJc3RydWN0IG5sbXNnaGRyICpubGggPSAodm9pZCAqKSBtc2ctPmhlYWQ7CisJc3RydWN0IG5sYXR0ciAqbmxhOworCisJbmxhID0gbmxtc2dfZmluZF9hdHRyKG5saCwgc2l6ZW9mKHN0cnVjdCBnZW5sbXNnaGRyKSwKKwkJCSAgICAgIFdJTUFYX0dOTF9NU0dfREFUQSk7CisJaWYgKG5sYSA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUiAiQ2Fubm90IGZpbmQgYXR0cmlidXRlIFdJTUFYX0dOTF9NU0dfREFUQVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXR1cm4gbmxhX2xlbihubGEpOworfQorRVhQT1JUX1NZTUJPTF9HUEwod2ltYXhfbXNnX2xlbik7CisKKworLyoqCisgKiB3aW1heF9tc2dfc2VuZCAtIFNlbmQgYSBwcmUtYWxsb2NhdGVkIG1lc3NhZ2UgdG8gdXNlciBzcGFjZQorICoKKyAqIEB3aW1heF9kZXY6IFdpTUFYIGRldmljZSBkZXNjcmlwdG9yCisgKgorICogQHNrYjogJnN0cnVjdCBza19idWZmIHJldHVybmVkIGJ5IHdpbWF4X21zZ19hbGxvYygpLiBOb3RlIHRoZQorICogICAgIG93bmVyc2hpcCBvZiBAc2tiIGlzIHRyYW5zZmVycmVkIHRvIHRoaXMgZnVuY3Rpb24uCisgKgorICogUmV0dXJuczogMCBpZiBvaywgPCAwIGVycm5vIGNvZGUgb24gZXJyb3IKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCisgKiBTZW5kcyBhIGZyZWUtZm9ybSBtZXNzYWdlIHRoYXQgd2FzIHByZWFsbG9jYXRlZCB3aXRoCisgKiB3aW1heF9tc2dfYWxsb2MoKSBhbmQgZmlsbGVkIHVwLgorICoKKyAqIEFzc3VtZXMgdGhhdCBvbmNlIHlvdSBwYXNzIGFuIHNrYiB0byB0aGlzIGZ1bmN0aW9uIGZvciBzZW5kaW5nLCBpdAorICogb3ducyBpdCBhbmQgd2lsbCByZWxlYXNlIGl0IHdoZW4gZG9uZSAob24gc3VjY2VzcykuCisgKgorICogSU1QT1JUQU5UOgorICoKKyAqIERvbid0IHVzZSBza2JfcHVzaCgpL3NrYl9wdWxsKCkvc2tiX3Jlc2VydmUoKSBvbiB0aGUgc2tiLCBhcworICogd2ltYXhfbXNnX3NlbmQoKSBkZXBlbmRzIG9uIHNrYi0+ZGF0YSBiZWluZyBwbGFjZWQgYXQgdGhlCisgKiBiZWdpbm5pbmcgb2YgdGhlIHVzZXIgbWVzc2FnZS4KKyAqLworaW50IHdpbWF4X21zZ19zZW5kKHN0cnVjdCB3aW1heF9kZXYgKndpbWF4X2Rldiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlpbnQgcmVzdWx0OworCXN0cnVjdCBkZXZpY2UgKmRldiA9IHdpbWF4X2Rldi0+bmV0X2Rldi0+ZGV2LnBhcmVudDsKKwl2b2lkICptc2cgPSBza2ItPmRhdGE7CisJc2l6ZV90IHNpemUgPSBza2ItPmxlbjsKKwltaWdodF9zbGVlcCgpOworCisJZF9wcmludGYoMSwgZGV2LCAiQ1RYOiB3aW1heCBtc2csICV6dSBieXRlc1xuIiwgc2l6ZSk7CisJZF9kdW1wKDIsIGRldiwgbXNnLCBzaXplKTsKKwlyZXN1bHQgPSBnZW5sbXNnX211bHRpY2FzdChza2IsIDAsIHdpbWF4X2dubF9tY2cuaWQsIEdGUF9LRVJORUwpOworCWRfcHJpbnRmKDEsIGRldiwgIkNUWDogZ2VubCBtdWx0aWNhc3QgcmVzdWx0ICVkXG4iLCByZXN1bHQpOworCWlmIChyZXN1bHQgPT0gLUVTUkNIKQkvKiBOb2JvZHkgY29ubmVjdGVkLCBpZ25vcmUgaXQgKi8KKwkJcmVzdWx0ID0gMDsJLyogYnR3LCB0aGUgc2tiIGlzIGZyZWVkIGFscmVhZHkgKi8KKwlyZXR1cm4gcmVzdWx0OworfQorRVhQT1JUX1NZTUJPTF9HUEwod2ltYXhfbXNnX3NlbmQpOworCisKKy8qKgorICogd2ltYXhfbXNnIC0gU2VuZCBhIG1lc3NhZ2UgdG8gdXNlciBzcGFjZQorICoKKyAqIEB3aW1heF9kZXY6IFdpTUFYIGRldmljZSBkZXNjcmlwdG9yIChwcm9wZXJseSByZWZlcmVuY2VkKQorICogQHBpcGVfbmFtZTogIm5hbWVkIHBpcGUiIHRoZSBtZXNzYWdlIHdpbGwgYmUgc2VudCB0bworICogQGJ1ZjogcG9pbnRlciB0byB0aGUgbWVzc2FnZSB0byBzZW5kLgorICogQHNpemU6IHNpemUgb2YgdGhlIGJ1ZmZlciBwb2ludGVkIHRvIGJ5IEBidWYgKGluIGJ5dGVzKS4KKyAqIEBnZnBfZmxhZ3M6IGZsYWdzIGZvciBtZW1vcnkgYWxsb2NhdGlvbi4KKyAqCisgKiBSZXR1cm5zOiAlMCBpZiBvaywgbmVnYXRpdmUgZXJybm8gY29kZSBvbiBlcnJvci4KKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCisgKiBTZW5kcyBhIGZyZWUtZm9ybSBtZXNzYWdlIHRvIHVzZXIgc3BhY2Ugb24gdGhlIGRldmljZSBAd2ltYXhfZGV2LgorICoKKyAqIE5PVEVTOgorICoKKyAqIE9uY2UgdGhlIEBza2IgaXMgZ2l2ZW4gdG8gdGhpcyBmdW5jdGlvbiwgd2hvIHdpbGwgb3duIGl0IGFuZCB3aWxsCisgKiByZWxlYXNlIGl0IHdoZW4gZG9uZSAodW5sZXNzIGl0IHJldHVybnMgZXJyb3IpLgorICovCitpbnQgd2ltYXhfbXNnKHN0cnVjdCB3aW1heF9kZXYgKndpbWF4X2RldiwgY29uc3QgY2hhciAqcGlwZV9uYW1lLAorCSAgICAgIGNvbnN0IHZvaWQgKmJ1Ziwgc2l6ZV90IHNpemUsIGdmcF90IGdmcF9mbGFncykKK3sKKwlpbnQgcmVzdWx0ID0gLUVOT01FTTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJc2tiID0gd2ltYXhfbXNnX2FsbG9jKHdpbWF4X2RldiwgcGlwZV9uYW1lLCBidWYsIHNpemUsIGdmcF9mbGFncyk7CisJaWYgKHNrYiA9PSBOVUxMKQorCQlnb3RvIGVycm9yX21zZ19uZXc7CisJcmVzdWx0ID0gd2ltYXhfbXNnX3NlbmQod2ltYXhfZGV2LCBza2IpOworZXJyb3JfbXNnX25ldzoKKwlyZXR1cm4gcmVzdWx0OworfQorRVhQT1JUX1NZTUJPTF9HUEwod2ltYXhfbXNnKTsKKworCitzdGF0aWMgY29uc3QKK3N0cnVjdCBubGFfcG9saWN5IHdpbWF4X2dubF9tc2dfcG9saWN5W1dJTUFYX0dOTF9BVFRSX01BWCArIDFdID0geworCVtXSU1BWF9HTkxfTVNHX0lGSURYXSA9IHsKKwkJLnR5cGUgPSBOTEFfVTMyLAorCX0sCisJW1dJTUFYX0dOTF9NU0dfREFUQV0gPSB7CisJCS50eXBlID0gTkxBX1VOU1BFQywJLyogbGlibmwgZG9lc24ndCBncm9rIEJJTkFSWSB5ZXQgKi8KKwl9LAorfTsKKworCisvKgorICogUmVsYXlzIGEgbWVzc2FnZSBmcm9tIHVzZXIgc3BhY2UgdG8gdGhlIGRyaXZlcgorICoKKyAqIFRoZSBza2IgaXMgcGFzc2VkIHRvIHRoZSBkcml2ZXItc3BlY2lmaWMgZnVuY3Rpb24gd2l0aCB0aGUgbmV0bGluaworICogYW5kIGdlbmVyaWMgbmV0bGluayBoZWFkZXJzIGFscmVhZHkgc3RyaXBwZWQuCisgKgorICogVGhpcyBjYWxsIHdpbGwgYmxvY2sgd2hpbGUgaGFuZGxpbmcvcmVsYXlpbmcgdGhlIG1lc3NhZ2UuCisgKi8KK3N0YXRpYworaW50IHdpbWF4X2dubF9kb2l0X21zZ19mcm9tX3VzZXIoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGdlbmxfaW5mbyAqaW5mbykKK3sKKwlpbnQgcmVzdWx0LCBpZmluZGV4OworCXN0cnVjdCB3aW1heF9kZXYgKndpbWF4X2RldjsKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisJc3RydWN0IG5sbXNnaGRyICpubGggPSBpbmZvLT5ubGhkcjsKKwljaGFyICpwaXBlX25hbWU7CisJdm9pZCAqbXNnX2J1ZjsKKwlzaXplX3QgbXNnX2xlbjsKKworCW1pZ2h0X3NsZWVwKCk7CisJZF9mbnN0YXJ0KDMsIE5VTEwsICIoc2tiICVwIGluZm8gJXApXG4iLCBza2IsIGluZm8pOworCXJlc3VsdCA9IC1FTk9ERVY7CisJaWYgKGluZm8tPmF0dHJzW1dJTUFYX0dOTF9NU0dfSUZJRFhdID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJXSU1BWF9HTkxfTVNHX0ZST01fVVNFUjogY2FuJ3QgZmluZCBJRklEWCAiCisJCSAgICAgICAiYXR0cmlidXRlXG4iKTsKKwkJZ290byBlcnJvcl9ub193aW1heF9kZXY7CisJfQorCWlmaW5kZXggPSBubGFfZ2V0X3UzMihpbmZvLT5hdHRyc1tXSU1BWF9HTkxfTVNHX0lGSURYXSk7CisJd2ltYXhfZGV2ID0gd2ltYXhfZGV2X2dldF9ieV9nZW5sX2luZm8oaW5mbywgaWZpbmRleCk7CisJaWYgKHdpbWF4X2RldiA9PSBOVUxMKQorCQlnb3RvIGVycm9yX25vX3dpbWF4X2RldjsKKwlkZXYgPSB3aW1heF9kZXZfdG9fZGV2KHdpbWF4X2Rldik7CisKKwkvKiBVbnBhY2sgYXJndW1lbnRzICovCisJcmVzdWx0ID0gLUVJTlZBTDsKKwlpZiAoaW5mby0+YXR0cnNbV0lNQVhfR05MX01TR19EQVRBXSA9PSBOVUxMKSB7CisJCWRldl9lcnIoZGV2LCAiV0lNQVhfR05MX01TR19GUk9NX1VTRVI6IGNhbid0IGZpbmQgTVNHX0RBVEEgIgorCQkJImF0dHJpYnV0ZVxuIik7CisJCWdvdG8gZXJyb3Jfbm9fZGF0YTsKKwl9CisJbXNnX2J1ZiA9IG5sYV9kYXRhKGluZm8tPmF0dHJzW1dJTUFYX0dOTF9NU0dfREFUQV0pOworCW1zZ19sZW4gPSBubGFfbGVuKGluZm8tPmF0dHJzW1dJTUFYX0dOTF9NU0dfREFUQV0pOworCisJaWYgKGluZm8tPmF0dHJzW1dJTUFYX0dOTF9NU0dfUElQRV9OQU1FXSA9PSBOVUxMKQorCQlwaXBlX25hbWUgPSBOVUxMOworCWVsc2UgeworCQlzdHJ1Y3QgbmxhdHRyICphdHRyID0gaW5mby0+YXR0cnNbV0lNQVhfR05MX01TR19QSVBFX05BTUVdOworCQlzaXplX3QgYXR0cl9sZW4gPSBubGFfbGVuKGF0dHIpOworCQkvKiBsaWJubC0xLjEgZG9lcyBub3QgeWV0IHN1cHBvcnQgTkxBX05VTF9TVFJJTkcgKi8KKwkJcmVzdWx0ID0gLUVOT01FTTsKKwkJcGlwZV9uYW1lID0ga3N0cm5kdXAobmxhX2RhdGEoYXR0ciksIGF0dHJfbGVuICsgMSwgR0ZQX0tFUk5FTCk7CisJCWlmIChwaXBlX25hbWUgPT0gTlVMTCkKKwkJCWdvdG8gZXJyb3JfYWxsb2M7CisJCXBpcGVfbmFtZVthdHRyX2xlbl0gPSAwOworCX0KKwltdXRleF9sb2NrKCZ3aW1heF9kZXYtPm11dGV4KTsKKwlyZXN1bHQgPSB3aW1heF9kZXZfaXNfcmVhZHkod2ltYXhfZGV2KTsKKwlpZiAocmVzdWx0IDwgMCkKKwkJZ290byBlcnJvcl9ub3RfcmVhZHk7CisJcmVzdWx0ID0gLUVOT1NZUzsKKwlpZiAod2ltYXhfZGV2LT5vcF9tc2dfZnJvbV91c2VyID09IE5VTEwpCisJCWdvdG8gZXJyb3Jfbm9vcDsKKworCWRfcHJpbnRmKDEsIGRldiwKKwkJICJDUlg6IG5sbXNnaGRyIGxlbiAldSB0eXBlICV1IGZsYWdzIDB4JTA0eCBzZXEgMHgleCBwaWQgJXVcbiIsCisJCSBubGgtPm5sbXNnX2xlbiwgbmxoLT5ubG1zZ190eXBlLCBubGgtPm5sbXNnX2ZsYWdzLAorCQkgbmxoLT5ubG1zZ19zZXEsIG5saC0+bmxtc2dfcGlkKTsKKwlkX3ByaW50ZigxLCBkZXYsICJDUlg6IHdpbWF4IG1lc3NhZ2UgJXp1IGJ5dGVzXG4iLCBtc2dfbGVuKTsKKwlkX2R1bXAoMiwgZGV2LCBtc2dfYnVmLCBtc2dfbGVuKTsKKworCXJlc3VsdCA9IHdpbWF4X2Rldi0+b3BfbXNnX2Zyb21fdXNlcih3aW1heF9kZXYsIHBpcGVfbmFtZSwKKwkJCQkJICAgICBtc2dfYnVmLCBtc2dfbGVuLCBpbmZvKTsKK2Vycm9yX25vb3A6CitlcnJvcl9ub3RfcmVhZHk6CisJbXV0ZXhfdW5sb2NrKCZ3aW1heF9kZXYtPm11dGV4KTsKK2Vycm9yX2FsbG9jOgorCWtmcmVlKHBpcGVfbmFtZSk7CitlcnJvcl9ub19kYXRhOgorCWRldl9wdXQod2ltYXhfZGV2LT5uZXRfZGV2KTsKK2Vycm9yX25vX3dpbWF4X2RldjoKKwlkX2ZuZW5kKDMsIE5VTEwsICIoc2tiICVwIGluZm8gJXApID0gJWRcbiIsIHNrYiwgaW5mbywgcmVzdWx0KTsKKwlyZXR1cm4gcmVzdWx0OworfQorCisKKy8qCisgKiBHZW5lcmljIE5ldGxpbmsgZ2x1ZQorICovCisKK3N0cnVjdCBnZW5sX29wcyB3aW1heF9nbmxfbXNnX2Zyb21fdXNlciA9IHsKKwkuY21kID0gV0lNQVhfR05MX09QX01TR19GUk9NX1VTRVIsCisJLmZsYWdzID0gR0VOTF9BRE1JTl9QRVJNLAorCS5wb2xpY3kgPSB3aW1heF9nbmxfbXNnX3BvbGljeSwKKwkuZG9pdCA9IHdpbWF4X2dubF9kb2l0X21zZ19mcm9tX3VzZXIsCisJLmR1bXBpdCA9IE5VTEwsCit9OworCmRpZmYgLS1naXQgYS9uZXQvd2ltYXgvb3AtcmVzZXQuYyBiL25ldC93aW1heC9vcC1yZXNldC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhMjY5MTcKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvd2ltYXgvb3AtcmVzZXQuYwpAQCAtMCwwICsxLDE0MyBAQAorLyoKKyAqIExpbnV4IFdpTUFYCisgKiBJbXBsZW1lbnQgYW5kIGV4cG9ydCBhIG1ldGhvZCBmb3IgcmVzZXR0aW5nIGEgV2lNQVggZGV2aWNlCisgKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBJbnRlbCBDb3Jwb3JhdGlvbiA8bGludXgtd2ltYXhAaW50ZWwuY29tPgorICogSW5ha3kgUGVyZXotR29uemFsZXogPGluYWt5LnBlcmV6LWdvbnphbGV6QGludGVsLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxLCBVU0EuCisgKgorICoKKyAqIFRoaXMgaW1wbGVtZW50cyBhIHNpbXBsZSBzeW5jaHJvbm91cyBjYWxsIHRvIHJlc2V0IGEgV2lNQVggZGV2aWNlLgorICoKKyAqIFJlc2V0cyBhaW0gYXQgYmVpbmcgd2FybSwga2VlcGluZyB0aGUgZGV2aWNlIGhhbmRsZXMgYWN0aXZlOworICogaG93ZXZlciwgd2hlbiB0aGF0IGZhaWxzLCBpdCBmYWxscyBiYWNrIHRvIGEgY29sZCByZXNldCAodGhhdCB3aWxsCisgKiBkaXNjb25uZWN0IGFuZCByZWNvbm5lY3QgdGhlIGRldmljZSkuCisgKi8KKworI2luY2x1ZGUgPG5ldC93aW1heC5oPgorI2luY2x1ZGUgPG5ldC9nZW5ldGxpbmsuaD4KKyNpbmNsdWRlIDxsaW51eC93aW1heC5oPgorI2luY2x1ZGUgPGxpbnV4L3NlY3VyaXR5Lmg+CisjaW5jbHVkZSAid2ltYXgtaW50ZXJuYWwuaCIKKworI2RlZmluZSBEX1NVQk1PRFVMRSBvcF9yZXNldAorI2luY2x1ZGUgImRlYnVnLWxldmVscy5oIgorCisKKy8qKgorICogd2ltYXhfcmVzZXQgLSBSZXNldCBhIFdpTUFYIGRldmljZQorICoKKyAqIEB3aW1heF9kZXY6IFdpTUFYIGRldmljZSBkZXNjcmlwdG9yCisgKgorICogUmV0dXJuczoKKyAqCisgKiAlMCBpZiBvayBhbmQgYSB3YXJtIHJlc2V0IHdhcyBkb25lICh0aGUgZGV2aWNlIHN0aWxsIGV4aXN0cyBpbgorICogdGhlIHN5c3RlbSkuCisgKgorICogLSVFTk9ERVYgaWYgYSBjb2xkL2J1cyByZXNldCBoYWQgdG8gYmUgZG9uZSAoZGV2aWNlIGhhcworICogZGlzY29ubmVjdGVkIGFuZCByZWNvbm5lY3RlZCwgc28gY3VycmVudCBoYW5kbGUgaXMgbm90IHZhbGlkCisgKiBhbnkgbW9yZSkuCisgKgorICogLSVFSU5WQUwgaWYgdGhlIGRldmljZSBpcyBub3QgZXZlbiByZWdpc3RlcmVkLgorICoKKyAqIEFueSBvdGhlciBuZWdhdGl2ZSBlcnJvciBjb2RlIHNoYWxsIGJlIGNvbnNpZGVyZWQgYXMKKyAqIG5vbi1yZWNvdmVyYWJsZS4KKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCisgKiBDYWxsZWQgd2hlbiB3YW50aW5nIHRvIHJlc2V0IHRoZSBkZXZpY2UgZm9yIGFueSByZWFzb24uIERldmljZSBpcworICogdGFrZW4gYmFjayB0byBwb3dlciBvbiBzdGF0dXMuCisgKgorICogVGhpcyBjYWxsIGJsb2Nrczsgb24gc3VjY2VzZnVsIHJldHVybiwgdGhlIGRldmljZSBoYXMgY29tcGxldGVkIHRoZQorICogcmVzZXQgcHJvY2VzcyBhbmQgaXMgcmVhZHkgdG8gb3BlcmF0ZS4KKyAqLworaW50IHdpbWF4X3Jlc2V0KHN0cnVjdCB3aW1heF9kZXYgKndpbWF4X2RldikKK3sKKwlpbnQgcmVzdWx0ID0gLUVJTlZBTDsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSB3aW1heF9kZXZfdG9fZGV2KHdpbWF4X2Rldik7CisJZW51bSB3aW1heF9zdCBzdGF0ZTsKKworCW1pZ2h0X3NsZWVwKCk7CisJZF9mbnN0YXJ0KDMsIGRldiwgIih3aW1heF9kZXYgJXApXG4iLCB3aW1heF9kZXYpOworCW11dGV4X2xvY2soJndpbWF4X2Rldi0+bXV0ZXgpOworCWRldl9ob2xkKHdpbWF4X2Rldi0+bmV0X2Rldik7CisJc3RhdGUgPSB3aW1heF9kZXYtPnN0YXRlOworCW11dGV4X3VubG9jaygmd2ltYXhfZGV2LT5tdXRleCk7CisKKwlpZiAoc3RhdGUgPj0gV0lNQVhfU1RfRE9XTikgeworCQltdXRleF9sb2NrKCZ3aW1heF9kZXYtPm11dGV4X3Jlc2V0KTsKKwkJcmVzdWx0ID0gd2ltYXhfZGV2LT5vcF9yZXNldCh3aW1heF9kZXYpOworCQltdXRleF91bmxvY2soJndpbWF4X2Rldi0+bXV0ZXhfcmVzZXQpOworCX0KKwlkZXZfcHV0KHdpbWF4X2Rldi0+bmV0X2Rldik7CisKKwlkX2ZuZW5kKDMsIGRldiwgIih3aW1heF9kZXYgJXApID0gJWRcbiIsIHdpbWF4X2RldiwgcmVzdWx0KTsKKwlyZXR1cm4gcmVzdWx0OworfQorRVhQT1JUX1NZTUJPTCh3aW1heF9yZXNldCk7CisKKworc3RhdGljIGNvbnN0CitzdHJ1Y3QgbmxhX3BvbGljeSB3aW1heF9nbmxfcmVzZXRfcG9saWN5W1dJTUFYX0dOTF9BVFRSX01BWCArIDFdID0geworCVtXSU1BWF9HTkxfUkVTRVRfSUZJRFhdID0geworCQkudHlwZSA9IE5MQV9VMzIsCisJfSwKK307CisKKworLyoKKyAqIEV4cG9ydGluZyB0byB1c2VyIHNwYWNlIG92ZXIgZ2VuZXJpYyBuZXRsaW5rCisgKgorICogUGFyc2UgdGhlIHJlc2V0IGNvbW1hbmQgZnJvbSB1c2VyIHNwYWNlLCByZXR1cm4gZXJyb3IgY29kZS4KKyAqCisgKiBObyBhdHRyaWJ1dGVzLgorICovCitzdGF0aWMKK2ludCB3aW1heF9nbmxfZG9pdF9yZXNldChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKQoreworCWludCByZXN1bHQsIGlmaW5kZXg7CisJc3RydWN0IHdpbWF4X2RldiAqd2ltYXhfZGV2OworCXN0cnVjdCBkZXZpY2UgKmRldjsKKworCWRfZm5zdGFydCgzLCBOVUxMLCAiKHNrYiAlcCBpbmZvICVwKVxuIiwgc2tiLCBpbmZvKTsKKwlyZXN1bHQgPSAtRU5PREVWOworCWlmIChpbmZvLT5hdHRyc1tXSU1BWF9HTkxfUkVTRVRfSUZJRFhdID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJXSU1BWF9HTkxfT1BfUkZLSUxMOiBjYW4ndCBmaW5kIElGSURYICIKKwkJCSJhdHRyaWJ1dGVcbiIpOworCQlnb3RvIGVycm9yX25vX3dpbWF4X2RldjsKKwl9CisJaWZpbmRleCA9IG5sYV9nZXRfdTMyKGluZm8tPmF0dHJzW1dJTUFYX0dOTF9SRVNFVF9JRklEWF0pOworCXdpbWF4X2RldiA9IHdpbWF4X2Rldl9nZXRfYnlfZ2VubF9pbmZvKGluZm8sIGlmaW5kZXgpOworCWlmICh3aW1heF9kZXYgPT0gTlVMTCkKKwkJZ290byBlcnJvcl9ub193aW1heF9kZXY7CisJZGV2ID0gd2ltYXhfZGV2X3RvX2Rldih3aW1heF9kZXYpOworCS8qIEV4ZWN1dGUgdGhlIG9wZXJhdGlvbiBhbmQgc2VuZCB0aGUgcmVzdWx0IGJhY2sgdG8gdXNlciBzcGFjZSAqLworCXJlc3VsdCA9IHdpbWF4X3Jlc2V0KHdpbWF4X2Rldik7CisJZGV2X3B1dCh3aW1heF9kZXYtPm5ldF9kZXYpOworZXJyb3Jfbm9fd2ltYXhfZGV2OgorCWRfZm5lbmQoMywgTlVMTCwgIihza2IgJXAgaW5mbyAlcCkgPSAlZFxuIiwgc2tiLCBpbmZvLCByZXN1bHQpOworCXJldHVybiByZXN1bHQ7Cit9CisKKworc3RydWN0IGdlbmxfb3BzIHdpbWF4X2dubF9yZXNldCA9IHsKKwkuY21kID0gV0lNQVhfR05MX09QX1JFU0VULAorCS5mbGFncyA9IEdFTkxfQURNSU5fUEVSTSwKKwkucG9saWN5ID0gd2ltYXhfZ25sX3Jlc2V0X3BvbGljeSwKKwkuZG9pdCA9IHdpbWF4X2dubF9kb2l0X3Jlc2V0LAorCS5kdW1waXQgPSBOVUxMLAorfTsKZGlmZiAtLWdpdCBhL25ldC93aW1heC9vcC1yZmtpbGwuYyBiL25ldC93aW1heC9vcC1yZmtpbGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjc1YWVlCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L3dpbWF4L29wLXJma2lsbC5jCkBAIC0wLDAgKzEsNTMyIEBACisvKgorICogTGludXggV2lNQVgKKyAqIFJGLWtpbGwgZnJhbWV3b3JrIGludGVncmF0aW9uCisgKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBJbnRlbCBDb3Jwb3JhdGlvbiA8bGludXgtd2ltYXhAaW50ZWwuY29tPgorICogSW5ha3kgUGVyZXotR29uemFsZXogPGluYWt5LnBlcmV6LWdvbnphbGV6QGludGVsLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxLCBVU0EuCisgKgorICoKKyAqIFRoaXMgaW50ZWdyYXRlcyBpbnRvIHRoZSBMaW51eCBLZXJuZWwgcmZraWxsIHN1c2J5c3RlbSBzbyB0aGF0IHRoZQorICogZHJpdmVycyBqdXN0IGhhdmUgdG8gZG8gdGhlIGJhcmUgbWluaW1hbCB3b3JrLCB3aGljaCBpcyBwcm92aWRpbmcgYQorICogbWV0aG9kIHRvIHNldCB0aGUgc29mdHdhcmUgUkYtS2lsbCBzd2l0Y2ggYW5kIHRvIHJlcG9ydCBjaGFuZ2VzIGluCisgKiB0aGUgc29mdHdhcmUgYW5kIGhhcmR3YXJlIHN3aXRjaCBzdGF0dXMuCisgKgorICogQSBub24tcG9sbGVkIGdlbmVyaWMgcmZraWxsIGRldmljZSBpcyBlbWJlZGRlZCBpbnRvIHRoZSBXaU1BWAorICogc3Vic3lzdGVtJ3MgcmVwcmVzZW50YXRpb24gb2YgYSBkZXZpY2UuCisgKgorICogRklYTUU6IE5lZWQgcG9sbGVkIHN1cHBvcnQ/IHVzZSBhIHRpbWVyIG9yIGFkZCB0aGUgaW1wbGVtZW50YXRpb24KKyAqICAgICB0byB0aGUgc3RhY2suCisgKgorICogQWxsIGRldmljZSBkcml2ZXJzIGhhdmUgdG8gZG8gaXMgYWZ0ZXIgd2ltYXhfZGV2X2luaXQoKSwgY2FsbAorICogd2ltYXhfcmVwb3J0X3Jma2lsbF9odygpIGFuZCB3aW1heF9yZXBvcnRfcmZraWxsX3N3KCkgdG8gdXBkYXRlCisgKiBpbml0aWFsIHN0YXRlIGFuZCB0aGVuIGV2ZXJ5IHRpbWUgaXQgY2hhbmdlcy4gU2VlIHdpbWF4Lmg6c3RydWN0CisgKiB3aW1heF9kZXYgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisgKgorICogUk9BRE1BUAorICoKKyAqIHdpbWF4X2dubF9kb2l0X3Jma2lsbCgpICAgICAgVXNlciBzcGFjZSBjYWxsaW5nIHdpbWF4X3Jma2lsbCgpCisgKiAgIHdpbWF4X3Jma2lsbCgpICAgICAgICAgICAgIEtlcm5lbCBjYWxsaW5nIHdpbWF4X3Jma2lsbCgpCisgKiAgICAgX193aW1heF9yZl90b2dnbGVfcmFkaW8oKQorICoKKyAqIHdpbWF4X3Jma2lsbF90b2dnbGVfcmFkaW8oKSAgUkYtS2lsbCBzdWJzeXRlbSBjYWxsaW5nCisgKiAgIF9fd2ltYXhfcmZfdG9nZ2xlX3JhZGlvKCkKKyAqCisgKiBfX3dpbWF4X3JmX3RvZ2dsZV9yYWRpbygpCisgKiAgIHdpbWF4X2Rldi0+b3BfcmZraWxsX3N3X3RvZ2dsZSgpIERyaXZlciBiYWNrZW5kCisgKiAgIF9fd2ltYXhfc3RhdGVfY2hhbmdlKCkKKyAqCisgKiB3aW1heF9yZXBvcnRfcmZraWxsX3N3KCkgICAgIERyaXZlciByZXBvcnRzIHN0YXRlIGNoYW5nZQorICogICBfX3dpbWF4X3N0YXRlX2NoYW5nZSgpCisgKgorICogd2ltYXhfcmVwb3J0X3Jma2lsbF9odygpICAgICBEcml2ZXIgcmVwb3J0cyBzdGF0ZSBjaGFuZ2UKKyAqICAgX193aW1heF9zdGF0ZV9jaGFuZ2UoKQorICoKKyAqIHdpbWF4X3Jma2lsbF9hZGQoKSAgICAgICAgICAgSW5pdGlhbGl6ZS9zaHV0ZG93biByZmtpbGwgc3VwcG9ydAorICogd2ltYXhfcmZraWxsX3JtKCkgICAgICAgICAgICBbY2FsbGVkIGJ5IHdpbWF4X2Rldl9hZGQvcm0oKV0KKyAqLworCisjaW5jbHVkZSA8bmV0L3dpbWF4Lmg+CisjaW5jbHVkZSA8bmV0L2dlbmV0bGluay5oPgorI2luY2x1ZGUgPGxpbnV4L3dpbWF4Lmg+CisjaW5jbHVkZSA8bGludXgvc2VjdXJpdHkuaD4KKyNpbmNsdWRlIDxsaW51eC9yZmtpbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgorI2luY2x1ZGUgIndpbWF4LWludGVybmFsLmgiCisKKyNkZWZpbmUgRF9TVUJNT0RVTEUgb3BfcmZraWxsCisjaW5jbHVkZSAiZGVidWctbGV2ZWxzLmgiCisKKyNpZiBkZWZpbmVkKENPTkZJR19SRktJTEwpIHx8IGRlZmluZWQoQ09ORklHX1JGS0lMTF9NT0RVTEUpCisKKworLyoqCisgKiB3aW1heF9yZXBvcnRfcmZraWxsX2h3IC0gUmVwb3J0cyBjaGFuZ2VzIGluIHRoZSBoYXJkd2FyZSBSRiBzd2l0Y2gKKyAqCisgKiBAd2ltYXhfZGV2OiBXaU1BWCBkZXZpY2UgZGVzY3JpcHRvcgorICoKKyAqIEBzdGF0ZTogTmV3IHN0YXRlIG9mIHRoZSBSRiBLaWxsIHN3aXRjaC4gJVdJTUFYX1JGX09OIHJhZGlvIG9uLAorICogICAgICVXSU1BWF9SRl9PRkYgcmFkaW8gb2ZmLgorICoKKyAqIFdoZW4gdGhlIGRldmljZSBkZXRlY3RzIGEgY2hhbmdlIGluIHRoZSBzdGF0ZSBvZiB0aGVoYXJkd2FyZSBSRgorICogc3dpdGNoLCBpdCBtdXN0IGNhbGwgdGhpcyBmdW5jdGlvbiB0byBsZXQgdGhlIFdpTUFYIGtlcm5lbCBzdGFjaworICoga25vdyB0aGF0IHRoZSBzdGF0ZSBoYXMgY2hhbmdlZCBzbyBpdCBjYW4gYmUgcHJvcGVybHkgcHJvcGFnYXRlZC4KKyAqCisgKiBUaGUgV2lNQVggc3RhY2sgY2FjaGVzIHRoZSBzdGF0ZSAodGhlIGRyaXZlciBkb2Vzbid0IG5lZWQgdG8pLiBBcworICogd2VsbCwgYXMgdGhlIGNoYW5nZSBpcyBwcm9wYWdhdGVkIGl0IHdpbGwgY29tZSBiYWNrIGFzIGEgcmVxdWVzdCB0bworICogY2hhbmdlIHRoZSBzb2Z0d2FyZSBzdGF0ZSB0byBtaXJyb3IgdGhlIGhhcmR3YXJlIHN0YXRlLgorICoKKyAqIElmIHRoZSBkZXZpY2UgZG9lc24ndCBoYXZlIGEgaGFyZHdhcmUga2lsbCBzd2l0Y2gsIGp1c3QgcmVwb3J0CisgKiBpdCBvbiBpbml0aWFsaXphdGlvbiBhcyBhbHdheXMgb24gKCVXSU1BWF9SRl9PTiwgcmFkaW8gb24pLgorICovCit2b2lkIHdpbWF4X3JlcG9ydF9yZmtpbGxfaHcoc3RydWN0IHdpbWF4X2RldiAqd2ltYXhfZGV2LAorCQkJICAgIGVudW0gd2ltYXhfcmZfc3RhdGUgc3RhdGUpCit7CisJaW50IHJlc3VsdDsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSB3aW1heF9kZXZfdG9fZGV2KHdpbWF4X2Rldik7CisJZW51bSB3aW1heF9zdCB3aW1heF9zdGF0ZTsKKwllbnVtIHJma2lsbF9zdGF0ZSByZmtpbGxfc3RhdGU7CisKKwlkX2Zuc3RhcnQoMywgZGV2LCAiKHdpbWF4X2RldiAlcCBzdGF0ZSAldSlcbiIsIHdpbWF4X2Rldiwgc3RhdGUpOworCUJVR19PTihzdGF0ZSA9PSBXSU1BWF9SRl9RVUVSWSk7CisJQlVHX09OKHN0YXRlICE9IFdJTUFYX1JGX09OICYmIHN0YXRlICE9IFdJTUFYX1JGX09GRik7CisKKwltdXRleF9sb2NrKCZ3aW1heF9kZXYtPm11dGV4KTsKKwlyZXN1bHQgPSB3aW1heF9kZXZfaXNfcmVhZHkod2ltYXhfZGV2KTsKKwlpZiAocmVzdWx0IDwgMCkKKwkJZ290byBlcnJvcl9ub3RfcmVhZHk7CisKKwlpZiAoc3RhdGUgIT0gd2ltYXhfZGV2LT5yZl9odykgeworCQl3aW1heF9kZXYtPnJmX2h3ID0gc3RhdGU7CisJCXJma2lsbF9zdGF0ZSA9IHN0YXRlID09IFdJTUFYX1JGX09OID8KKwkJCVJGS0lMTF9TVEFURV9PRkYgOiBSRktJTExfU1RBVEVfT047CisJCWlmICh3aW1heF9kZXYtPnJmX2h3ID09IFdJTUFYX1JGX09OCisJCSAgICAmJiB3aW1heF9kZXYtPnJmX3N3ID09IFdJTUFYX1JGX09OKQorCQkJd2ltYXhfc3RhdGUgPSBXSU1BWF9TVF9SRUFEWTsKKwkJZWxzZQorCQkJd2ltYXhfc3RhdGUgPSBXSU1BWF9TVF9SQURJT19PRkY7CisJCV9fd2ltYXhfc3RhdGVfY2hhbmdlKHdpbWF4X2Rldiwgd2ltYXhfc3RhdGUpOworCQlpbnB1dF9yZXBvcnRfa2V5KHdpbWF4X2Rldi0+cmZraWxsX2lucHV0LCBLRVlfV0lNQVgsCisJCQkJIHJma2lsbF9zdGF0ZSk7CisJfQorZXJyb3Jfbm90X3JlYWR5OgorCW11dGV4X3VubG9jaygmd2ltYXhfZGV2LT5tdXRleCk7CisJZF9mbmVuZCgzLCBkZXYsICIod2ltYXhfZGV2ICVwIHN0YXRlICV1KSA9IHZvaWQgWyVkXVxuIiwKKwkJd2ltYXhfZGV2LCBzdGF0ZSwgcmVzdWx0KTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHdpbWF4X3JlcG9ydF9yZmtpbGxfaHcpOworCisKKy8qKgorICogd2ltYXhfcmVwb3J0X3Jma2lsbF9zdyAtIFJlcG9ydHMgY2hhbmdlcyBpbiB0aGUgc29mdHdhcmUgUkYgc3dpdGNoCisgKgorICogQHdpbWF4X2RldjogV2lNQVggZGV2aWNlIGRlc2NyaXB0b3IKKyAqCisgKiBAc3RhdGU6IE5ldyBzdGF0ZSBvZiB0aGUgUkYga2lsbCBzd2l0Y2guICVXSU1BWF9SRl9PTiByYWRpbyBvbiwKKyAqICAgICAlV0lNQVhfUkZfT0ZGIHJhZGlvIG9mZi4KKyAqCisgKiBSZXBvcnRzIGNoYW5nZXMgaW4gdGhlIHNvZnR3YXJlIFJGIHN3aXRjaCBzdGF0ZSB0byB0aGUgdGhlIFdpTUFYCisgKiBzdGFjay4KKyAqCisgKiBUaGUgbWFpbiB1c2UgaXMgZHVyaW5nIGluaXRpYWxpemF0aW9uLCBzbyB0aGUgZHJpdmVyIGNhbiBxdWVyeSB0aGUKKyAqIGRldmljZSBmb3IgaXRzIGN1cnJlbnQgc29mdHdhcmUgcmFkaW8ga2lsbCBzd2l0Y2ggc3RhdGUgYW5kIGZlZWQgaXQKKyAqIHRvIHRoZSBzeXN0ZW0uCisgKgorICogT24gdGhlIHNpZGUsIHRoZSBkZXZpY2UgZG9lcyBub3QgY2hhbmdlIHRoZSBzb2Z0d2FyZSBzdGF0ZSBieQorICogaXRzZWxmLiBJbiBwcmFjdGljZSwgdGhpcyBjYW4gaGFwcGVuLCBhcyB0aGUgZGV2aWNlIG1pZ2h0IGRlY2lkZSB0bworICogc3dpdGNoIChpbiBzb2Z0d2FyZSkgdGhlIHJhZGlvIG9mZiBmb3IgZGlmZmVyZW50IHJlYXNvbnMuCisgKi8KK3ZvaWQgd2ltYXhfcmVwb3J0X3Jma2lsbF9zdyhzdHJ1Y3Qgd2ltYXhfZGV2ICp3aW1heF9kZXYsCisJCQkgICAgZW51bSB3aW1heF9yZl9zdGF0ZSBzdGF0ZSkKK3sKKwlpbnQgcmVzdWx0OworCXN0cnVjdCBkZXZpY2UgKmRldiA9IHdpbWF4X2Rldl90b19kZXYod2ltYXhfZGV2KTsKKwllbnVtIHdpbWF4X3N0IHdpbWF4X3N0YXRlOworCisJZF9mbnN0YXJ0KDMsIGRldiwgIih3aW1heF9kZXYgJXAgc3RhdGUgJXUpXG4iLCB3aW1heF9kZXYsIHN0YXRlKTsKKwlCVUdfT04oc3RhdGUgPT0gV0lNQVhfUkZfUVVFUlkpOworCUJVR19PTihzdGF0ZSAhPSBXSU1BWF9SRl9PTiAmJiBzdGF0ZSAhPSBXSU1BWF9SRl9PRkYpOworCisJbXV0ZXhfbG9jaygmd2ltYXhfZGV2LT5tdXRleCk7CisJcmVzdWx0ID0gd2ltYXhfZGV2X2lzX3JlYWR5KHdpbWF4X2Rldik7CisJaWYgKHJlc3VsdCA8IDApCisJCWdvdG8gZXJyb3Jfbm90X3JlYWR5OworCisJaWYgKHN0YXRlICE9IHdpbWF4X2Rldi0+cmZfc3cpIHsKKwkJd2ltYXhfZGV2LT5yZl9zdyA9IHN0YXRlOworCQlpZiAod2ltYXhfZGV2LT5yZl9odyA9PSBXSU1BWF9SRl9PTgorCQkgICAgJiYgd2ltYXhfZGV2LT5yZl9zdyA9PSBXSU1BWF9SRl9PTikKKwkJCXdpbWF4X3N0YXRlID0gV0lNQVhfU1RfUkVBRFk7CisJCWVsc2UKKwkJCXdpbWF4X3N0YXRlID0gV0lNQVhfU1RfUkFESU9fT0ZGOworCQlfX3dpbWF4X3N0YXRlX2NoYW5nZSh3aW1heF9kZXYsIHdpbWF4X3N0YXRlKTsKKwl9CitlcnJvcl9ub3RfcmVhZHk6CisJbXV0ZXhfdW5sb2NrKCZ3aW1heF9kZXYtPm11dGV4KTsKKwlkX2ZuZW5kKDMsIGRldiwgIih3aW1heF9kZXYgJXAgc3RhdGUgJXUpID0gdm9pZCBbJWRdXG4iLAorCQl3aW1heF9kZXYsIHN0YXRlLCByZXN1bHQpOworfQorRVhQT1JUX1NZTUJPTF9HUEwod2ltYXhfcmVwb3J0X3Jma2lsbF9zdyk7CisKKworLyoKKyAqIENhbGxiYWNrIGZvciB0aGUgUkYgS2lsbCB0b2dnbGUgb3BlcmF0aW9uCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnk6CisgKgorICogLSBUaGUgcmZraWxsIHN1YnN5c3RlbSB3aGVuIHRoZSBSRi1LaWxsIGtleSBpcyBwcmVzc2VkIGluIHRoZQorICogICBoYXJkd2FyZSBhbmQgdGhlIGRyaXZlciBub3RpZmllcyB0aHJvdWdoCisgKiAgIHdpbWF4X3JlcG9ydF9yZmtpbGxfaHcoKS4gVGhlIHJma2lsbCBzdWJzeXN0ZW0gZW5kcyB1cCBjYWxsaW5nIGJhY2sKKyAqICAgaGVyZSBzbyB0aGUgc29mdHdhcmUgUkYgS2lsbCBzd2l0Y2ggc3RhdGUgaXMgY2hhbmdlZCB0byByZWZsZWN0CisgKiAgIHRoZSBoYXJkd2FyZSBzd2l0Y2ggc3RhdGUuCisgKgorICogLSBXaGVuIHRoZSB1c2VyIHNldHMgdGhlIHN0YXRlIHRocm91Z2ggc3lzZnMnIHJma2lsbC9zdGF0ZSBmaWxlCisgKgorICogLSBXaGVuIHRoZSB1c2VyIGNhbGxzIHdpbWF4X3Jma2lsbCgpLgorICoKKyAqIFRoaXMgY2FsbCBibG9ja3MhCisgKgorICogV0FSTklORyEgV2hlbiB3ZSBjYWxsIHJma2lsbF91bnJlZ2lzdGVyKCksIHRoaXMgd2lsbCBiZSBjYWxsZWQgd2l0aAorICogc3RhdGUgMCEKKyAqCisgKiBXQVJOSU5HOiB3aW1heF9kZXYgbXVzdCBiZSBsb2NrZWQKKyAqLworc3RhdGljCitpbnQgX193aW1heF9yZl90b2dnbGVfcmFkaW8oc3RydWN0IHdpbWF4X2RldiAqd2ltYXhfZGV2LAorCQkJICAgIGVudW0gd2ltYXhfcmZfc3RhdGUgc3RhdGUpCit7CisJaW50IHJlc3VsdCA9IDA7CisJc3RydWN0IGRldmljZSAqZGV2ID0gd2ltYXhfZGV2X3RvX2Rldih3aW1heF9kZXYpOworCWVudW0gd2ltYXhfc3Qgd2ltYXhfc3RhdGU7CisKKwltaWdodF9zbGVlcCgpOworCWRfZm5zdGFydCgzLCBkZXYsICIod2ltYXhfZGV2ICVwIHN0YXRlICV1KVxuIiwgd2ltYXhfZGV2LCBzdGF0ZSk7CisJaWYgKHdpbWF4X2Rldi0+cmZfc3cgPT0gc3RhdGUpCisJCWdvdG8gb3V0X25vX2NoYW5nZTsKKwlpZiAod2ltYXhfZGV2LT5vcF9yZmtpbGxfc3dfdG9nZ2xlICE9IE5VTEwpCisJCXJlc3VsdCA9IHdpbWF4X2Rldi0+b3BfcmZraWxsX3N3X3RvZ2dsZSh3aW1heF9kZXYsIHN0YXRlKTsKKwllbHNlIGlmIChzdGF0ZSA9PSBXSU1BWF9SRl9PRkYpCS8qIE5vIG9wPyBjYW4ndCB0dXJuIG9mZiAqLworCQlyZXN1bHQgPSAtRU5YSU87CisJZWxzZQkJCQkvKiBObyBvcD8gY2FuIHR1cm4gb24gKi8KKwkJcmVzdWx0ID0gMDsJCS8qIHNob3VsZCBuZXZlciBoYXBwZW4gdGhvICovCisJaWYgKHJlc3VsdCA+PSAwKSB7CisJCXJlc3VsdCA9IDA7CisJCXdpbWF4X2Rldi0+cmZfc3cgPSBzdGF0ZTsKKwkJd2ltYXhfc3RhdGUgPSBzdGF0ZSA9PSBXSU1BWF9SRl9PTiA/CisJCQlXSU1BWF9TVF9SRUFEWSA6IFdJTUFYX1NUX1JBRElPX09GRjsKKwkJX193aW1heF9zdGF0ZV9jaGFuZ2Uod2ltYXhfZGV2LCB3aW1heF9zdGF0ZSk7CisJfQorb3V0X25vX2NoYW5nZToKKwlkX2ZuZW5kKDMsIGRldiwgIih3aW1heF9kZXYgJXAgc3RhdGUgJXUpID0gJWRcbiIsCisJCXdpbWF4X2Rldiwgc3RhdGUsIHJlc3VsdCk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworCisvKgorICogVHJhbnNsYXRlIGZyb20gcmZraWxsIHN0YXRlIHRvIHdpbWF4IHN0YXRlCisgKgorICogTk9URTogU3BlY2lhbCBzdGF0ZSBoYW5kbGluZyBydWxlcyBoZXJlCisgKgorICogICAgIEp1c3QgcHJldGVuZCB0aGUgY2FsbCBkaWRuJ3QgaGFwcGVuIGlmIHdlIGFyZSBpbiBhIHN0YXRlIHdoZXJlCisgKiAgICAgd2Uga25vdyBmb3Igc3VyZSBpdCBjYW5ub3QgYmUgaGFuZGxlZCAoV0lNQVhfU1RfRE9XTiBvcgorICogICAgIF9fV0lNQVhfU1RfUVVJRVNDSU5HKS4gcmZraWxsKCkgbmVlZHMgaXQgdG8gcmVnaXN0ZXIgYW5kCisgKiAgICAgdW5yZWdpc3RlciwgYXMgaXQgd2lsbCBydW4gdGhpcyBwYXRoLgorICoKKyAqIE5PVEU6IFRoaXMgY2FsbCB3aWxsIGJsb2NrIHVudGlsIHRoZSBvcGVyYXRpb24gaXMgY29tcGxldGVkLgorICovCitzdGF0aWMKK2ludCB3aW1heF9yZmtpbGxfdG9nZ2xlX3JhZGlvKHZvaWQgKmRhdGEsIGVudW0gcmZraWxsX3N0YXRlIHN0YXRlKQoreworCWludCByZXN1bHQ7CisJc3RydWN0IHdpbWF4X2RldiAqd2ltYXhfZGV2ID0gZGF0YTsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSB3aW1heF9kZXZfdG9fZGV2KHdpbWF4X2Rldik7CisJZW51bSB3aW1heF9yZl9zdGF0ZSByZl9zdGF0ZTsKKworCWRfZm5zdGFydCgzLCBkZXYsICIod2ltYXhfZGV2ICVwIHN0YXRlICV1KVxuIiwgd2ltYXhfZGV2LCBzdGF0ZSk7CisJc3dpdGNoIChzdGF0ZSkgeworCWNhc2UgUkZLSUxMX1NUQVRFX09OOgorCQlyZl9zdGF0ZSA9IFdJTUFYX1JGX09GRjsKKwkJYnJlYWs7CisJY2FzZSBSRktJTExfU1RBVEVfT0ZGOgorCQlyZl9zdGF0ZSA9IFdJTUFYX1JGX09OOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlCVUcoKTsKKwl9CisJbXV0ZXhfbG9jaygmd2ltYXhfZGV2LT5tdXRleCk7CisJaWYgKHdpbWF4X2Rldi0+c3RhdGUgPD0gX19XSU1BWF9TVF9RVUlFU0NJTkcpCisJCXJlc3VsdCA9IDA7CS8qIGp1c3QgcHJldGVuZCBpdCBkaWRuJ3QgaGFwcGVuICovCisJZWxzZQorCQlyZXN1bHQgPSBfX3dpbWF4X3JmX3RvZ2dsZV9yYWRpbyh3aW1heF9kZXYsIHJmX3N0YXRlKTsKKwltdXRleF91bmxvY2soJndpbWF4X2Rldi0+bXV0ZXgpOworCWRfZm5lbmQoMywgZGV2LCAiKHdpbWF4X2RldiAlcCBzdGF0ZSAldSkgPSAlZFxuIiwKKwkJd2ltYXhfZGV2LCBzdGF0ZSwgcmVzdWx0KTsKKwlyZXR1cm4gcmVzdWx0OworfQorCisKKy8qKgorICogd2ltYXhfcmZraWxsIC0gU2V0IHRoZSBzb2Z0d2FyZSBSRiBzd2l0Y2ggc3RhdGUgZm9yIGEgV2lNQVggZGV2aWNlCisgKgorICogQHdpbWF4X2RldjogV2lNQVggZGV2aWNlIGRlc2NyaXB0b3IKKyAqCisgKiBAc3RhdGU6IE5ldyBSRiBzdGF0ZS4KKyAqCisgKiBSZXR1cm5zOgorICoKKyAqID49IDAgdG9nZ2xlIHN0YXRlIGlmIG9rLCA8IDAgZXJybm8gY29kZSBvbiBlcnJvci4gVGhlIHRvZ2dsZSBzdGF0ZQorICogaXMgcmV0dXJuZWQgYXMgYSBiaXRtYXAsIGJpdCAwIGJlaW5nIHRoZSBoYXJkd2FyZSBSRiBzdGF0ZSwgYml0IDEKKyAqIHRoZSBzb2Z0d2FyZSBSRiBzdGF0ZS4KKyAqCisgKiAwIG1lYW5zIGRpc2FibGVkICglV0lNQVhfUkZfT04sIHJhZGlvIG9uKSwgMSBtZWFucyBlbmFibGVkIHJhZGlvCisgKiBvZmYgKCVXSU1BWF9SRl9PRkYpLgorICoKKyAqIERlc2NyaXB0aW9uOgorICoKKyAqIENhbGxlZCBieSB0aGUgdXNlciB3aGVuIGhlIHdhbnRzIHRvIHJlcXVlc3QgdGhlIFdpTUFYIHJhZGlvIHRvIGJlCisgKiBzd2l0Y2hlZCBvbiAoJVdJTUFYX1JGX09OKSBvciBvZmYgKCVXSU1BWF9SRl9PRkYpLiBXaXRoCisgKiAlV0lNQVhfUkZfUVVFUlksIGp1c3QgdGhlIGN1cnJlbnQgc3RhdGUgaXMgcmV0dXJuZWQuCisgKgorICogTk9URToKKyAqCisgKiBUaGlzIGNhbGwgd2lsbCBibG9jayB1bnRpbCB0aGUgb3BlcmF0aW9uIGlzIGNvbXBsZXRlLgorICovCitpbnQgd2ltYXhfcmZraWxsKHN0cnVjdCB3aW1heF9kZXYgKndpbWF4X2RldiwgZW51bSB3aW1heF9yZl9zdGF0ZSBzdGF0ZSkKK3sKKwlpbnQgcmVzdWx0OworCXN0cnVjdCBkZXZpY2UgKmRldiA9IHdpbWF4X2Rldl90b19kZXYod2ltYXhfZGV2KTsKKworCWRfZm5zdGFydCgzLCBkZXYsICIod2ltYXhfZGV2ICVwIHN0YXRlICV1KVxuIiwgd2ltYXhfZGV2LCBzdGF0ZSk7CisJbXV0ZXhfbG9jaygmd2ltYXhfZGV2LT5tdXRleCk7CisJcmVzdWx0ID0gd2ltYXhfZGV2X2lzX3JlYWR5KHdpbWF4X2Rldik7CisJaWYgKHJlc3VsdCA8IDApCisJCWdvdG8gZXJyb3Jfbm90X3JlYWR5OworCXN3aXRjaCAoc3RhdGUpIHsKKwljYXNlIFdJTUFYX1JGX09OOgorCWNhc2UgV0lNQVhfUkZfT0ZGOgorCQlyZXN1bHQgPSBfX3dpbWF4X3JmX3RvZ2dsZV9yYWRpbyh3aW1heF9kZXYsIHN0YXRlKTsKKwkJaWYgKHJlc3VsdCA8IDApCisJCQlnb3RvIGVycm9yOworCQlicmVhazsKKwljYXNlIFdJTUFYX1JGX1FVRVJZOgorCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXN1bHQgPSAtRUlOVkFMOworCQlnb3RvIGVycm9yOworCX0KKwlyZXN1bHQgPSB3aW1heF9kZXYtPnJmX3N3IDw8IDEgfCB3aW1heF9kZXYtPnJmX2h3OworZXJyb3I6CitlcnJvcl9ub3RfcmVhZHk6CisJbXV0ZXhfdW5sb2NrKCZ3aW1heF9kZXYtPm11dGV4KTsKKwlkX2ZuZW5kKDMsIGRldiwgIih3aW1heF9kZXYgJXAgc3RhdGUgJXUpID0gJWRcbiIsCisJCXdpbWF4X2Rldiwgc3RhdGUsIHJlc3VsdCk7CisJcmV0dXJuIHJlc3VsdDsKK30KK0VYUE9SVF9TWU1CT0wod2ltYXhfcmZraWxsKTsKKworCisvKgorICogUmVnaXN0ZXIgYSBuZXcgV2lNQVggZGV2aWNlJ3MgUkYgS2lsbCBzdXBwb3J0CisgKgorICogV0FSTklORzogd2ltYXhfZGV2LT5tdXRleCBtdXN0IGJlIHVubG9ja2VkCisgKi8KK2ludCB3aW1heF9yZmtpbGxfYWRkKHN0cnVjdCB3aW1heF9kZXYgKndpbWF4X2RldikKK3sKKwlpbnQgcmVzdWx0OworCXN0cnVjdCByZmtpbGwgKnJma2lsbDsKKwlzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dF9kZXY7CisJc3RydWN0IGRldmljZSAqZGV2ID0gd2ltYXhfZGV2X3RvX2Rldih3aW1heF9kZXYpOworCisJZF9mbnN0YXJ0KDMsIGRldiwgIih3aW1heF9kZXYgJXApXG4iLCB3aW1heF9kZXYpOworCS8qIEluaXRpYWxpemUgUkYgS2lsbCAqLworCXJlc3VsdCA9IC1FTk9NRU07CisJcmZraWxsID0gcmZraWxsX2FsbG9jYXRlKGRldiwgUkZLSUxMX1RZUEVfV0lNQVgpOworCWlmIChyZmtpbGwgPT0gTlVMTCkKKwkJZ290byBlcnJvcl9yZmtpbGxfYWxsb2NhdGU7CisJd2ltYXhfZGV2LT5yZmtpbGwgPSByZmtpbGw7CisKKwlyZmtpbGwtPm5hbWUgPSB3aW1heF9kZXYtPm5hbWU7CisJcmZraWxsLT5zdGF0ZSA9IFJGS0lMTF9TVEFURV9PRkY7CisJcmZraWxsLT5kYXRhID0gd2ltYXhfZGV2OworCXJma2lsbC0+dG9nZ2xlX3JhZGlvID0gd2ltYXhfcmZraWxsX3RvZ2dsZV9yYWRpbzsKKwlyZmtpbGwtPnVzZXJfY2xhaW1fdW5zdXBwb3J0ZWQgPSAxOworCisJLyogSW5pdGlhbGl6ZSB0aGUgaW5wdXQgZGV2aWNlIGZvciB0aGUgaHcga2V5ICovCisJaW5wdXRfZGV2ID0gaW5wdXRfYWxsb2NhdGVfZGV2aWNlKCk7CisJaWYgKGlucHV0X2RldiA9PSBOVUxMKQorCQlnb3RvIGVycm9yX2lucHV0X2FsbG9jYXRlOworCXdpbWF4X2Rldi0+cmZraWxsX2lucHV0ID0gaW5wdXRfZGV2OworCWRfcHJpbnRmKDEsIGRldiwgInJma2lsbCAlcCBpbnB1dCAlcFxuIiwgcmZraWxsLCBpbnB1dF9kZXYpOworCisJaW5wdXRfZGV2LT5uYW1lID0gd2ltYXhfZGV2LT5uYW1lOworCS8qIEZJWE1FOiBnZXQgYSByZWFsIGRldmljZSBidXMgSUQgYW5kIHN0dWZmPyBkbyB3ZSBjYXJlPyAqLworCWlucHV0X2Rldi0+aWQuYnVzdHlwZSA9IEJVU19IT1NUOworCWlucHV0X2Rldi0+aWQudmVuZG9yID0gMHhmZmZmOworCWlucHV0X2Rldi0+ZXZiaXRbMF0gPSBCSVQoRVZfS0VZKTsKKwlzZXRfYml0KEtFWV9XSU1BWCwgaW5wdXRfZGV2LT5rZXliaXQpOworCisJLyogUmVnaXN0ZXIgYm90aCAqLworCXJlc3VsdCA9IGlucHV0X3JlZ2lzdGVyX2RldmljZSh3aW1heF9kZXYtPnJma2lsbF9pbnB1dCk7CisJaWYgKHJlc3VsdCA8IDApCisJCWdvdG8gZXJyb3JfaW5wdXRfcmVnaXN0ZXI7CisJcmVzdWx0ID0gcmZraWxsX3JlZ2lzdGVyKHdpbWF4X2Rldi0+cmZraWxsKTsKKwlpZiAocmVzdWx0IDwgMCkKKwkJZ290byBlcnJvcl9yZmtpbGxfcmVnaXN0ZXI7CisKKwkvKiBJZiB0aGVyZSBpcyBubyBTVyB0b2dnbGUgb3AsIFNXIFJGS2lsbCBpcyBhbHdheXMgb24gKi8KKwlpZiAod2ltYXhfZGV2LT5vcF9yZmtpbGxfc3dfdG9nZ2xlID09IE5VTEwpCisJCXdpbWF4X2Rldi0+cmZfc3cgPSBXSU1BWF9SRl9PTjsKKworCWRfZm5lbmQoMywgZGV2LCAiKHdpbWF4X2RldiAlcCkgPSAwXG4iLCB3aW1heF9kZXYpOworCXJldHVybiAwOworCisJLyogaWYgcmZraWxsX3JlZ2lzdGVyKCkgc3VjZWVkcywgY2FuJ3QgdXNlIHJma2lsbF9mcmVlKCkgYW55CisJICogbW9yZSwgb25seSByZmtpbGxfdW5yZWdpc3RlcigpIFtpdCBvd25zIHRoZSByZWZjb3VudF07IHdpdGgKKwkgKiB0aGUgaW5wdXQgZGV2aWNlIHdlIGhhdmUgdGhlIHNhbWUgaXNzdWUtLWhlbmNlIHRoZSBpZi4gKi8KK2Vycm9yX3Jma2lsbF9yZWdpc3RlcjoKKwlpbnB1dF91bnJlZ2lzdGVyX2RldmljZSh3aW1heF9kZXYtPnJma2lsbF9pbnB1dCk7CisJd2ltYXhfZGV2LT5yZmtpbGxfaW5wdXQgPSBOVUxMOworZXJyb3JfaW5wdXRfcmVnaXN0ZXI6CisJaWYgKHdpbWF4X2Rldi0+cmZraWxsX2lucHV0KQorCQlpbnB1dF9mcmVlX2RldmljZSh3aW1heF9kZXYtPnJma2lsbF9pbnB1dCk7CitlcnJvcl9pbnB1dF9hbGxvY2F0ZToKKwlyZmtpbGxfZnJlZSh3aW1heF9kZXYtPnJma2lsbCk7CitlcnJvcl9yZmtpbGxfYWxsb2NhdGU6CisJZF9mbmVuZCgzLCBkZXYsICIod2ltYXhfZGV2ICVwKSA9ICVkXG4iLCB3aW1heF9kZXYsIHJlc3VsdCk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworCisvKgorICogRGVyZWdpc3RlciBhIFdpTUFYIGRldmljZSdzIFJGIEtpbGwgc3VwcG9ydAorICoKKyAqIEljaywgd2UgY2FuJ3QgY2FsbCByZmtpbGxfZnJlZSgpIGFmdGVyIHJma2lsbF91bnJlZ2lzdGVyKCkuLi5vaAorICogd2VsbC4KKyAqCisgKiBXQVJOSU5HOiB3aW1heF9kZXYtPm11dGV4IG11c3QgYmUgdW5sb2NrZWQKKyAqLwordm9pZCB3aW1heF9yZmtpbGxfcm0oc3RydWN0IHdpbWF4X2RldiAqd2ltYXhfZGV2KQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9IHdpbWF4X2Rldl90b19kZXYod2ltYXhfZGV2KTsKKwlkX2Zuc3RhcnQoMywgZGV2LCAiKHdpbWF4X2RldiAlcClcbiIsIHdpbWF4X2Rldik7CisJcmZraWxsX3VucmVnaXN0ZXIod2ltYXhfZGV2LT5yZmtpbGwpOwkvKiBmcmVlcyAqLworCWlucHV0X3VucmVnaXN0ZXJfZGV2aWNlKHdpbWF4X2Rldi0+cmZraWxsX2lucHV0KTsKKwlkX2ZuZW5kKDMsIGRldiwgIih3aW1heF9kZXYgJXApXG4iLCB3aW1heF9kZXYpOworfQorCisKKyNlbHNlIC8qICNpZmRlZiBDT05GSUdfUkZLSUxMICovCisKK3ZvaWQgd2ltYXhfcmVwb3J0X3Jma2lsbF9odyhzdHJ1Y3Qgd2ltYXhfZGV2ICp3aW1heF9kZXYsCisJCQkgICAgZW51bSB3aW1heF9yZl9zdGF0ZSBzdGF0ZSkKK3sKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHdpbWF4X3JlcG9ydF9yZmtpbGxfaHcpOworCit2b2lkIHdpbWF4X3JlcG9ydF9yZmtpbGxfc3coc3RydWN0IHdpbWF4X2RldiAqd2ltYXhfZGV2LAorCQkJICAgIGVudW0gd2ltYXhfcmZfc3RhdGUgc3RhdGUpCit7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh3aW1heF9yZXBvcnRfcmZraWxsX3N3KTsKKworaW50IHdpbWF4X3Jma2lsbChzdHJ1Y3Qgd2ltYXhfZGV2ICp3aW1heF9kZXYsCisJCSBlbnVtIHdpbWF4X3JmX3N0YXRlIHN0YXRlKQoreworCXJldHVybiBXSU1BWF9SRl9PTiA8PCAxIHwgV0lNQVhfUkZfT047Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh3aW1heF9yZmtpbGwpOworCitpbnQgd2ltYXhfcmZraWxsX2FkZChzdHJ1Y3Qgd2ltYXhfZGV2ICp3aW1heF9kZXYpCit7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgd2ltYXhfcmZraWxsX3JtKHN0cnVjdCB3aW1heF9kZXYgKndpbWF4X2RldikKK3sKK30KKworI2VuZGlmIC8qICNpZmRlZiBDT05GSUdfUkZLSUxMICovCisKKworLyoKKyAqIEV4cG9ydGluZyB0byB1c2VyIHNwYWNlIG92ZXIgZ2VuZXJpYyBuZXRsaW5rCisgKgorICogUGFyc2UgdGhlIHJma2lsbCBjb21tYW5kIGZyb20gdXNlciBzcGFjZSwgcmV0dXJuIGEgY29tYmluYXRpb24KKyAqIHZhbHVlIHRoYXQgZGVzY3JpYmUgdGhlIHN0YXRlcyBvZiB0aGUgZGlmZmVyZW50IHRvZ2dsZXMuCisgKgorICogT25seSBvbmUgYXR0cmlidXRlOiB0aGUgbmV3IHN0YXRlIHJlcXVlc3RlZCAob24sIG9mZiBvciBubyBjaGFuZ2UsCisgKiBqdXN0IHF1ZXJ5KS4KKyAqLworCitzdGF0aWMgY29uc3QKK3N0cnVjdCBubGFfcG9saWN5IHdpbWF4X2dubF9yZmtpbGxfcG9saWN5W1dJTUFYX0dOTF9BVFRSX01BWCArIDFdID0geworCVtXSU1BWF9HTkxfUkZLSUxMX0lGSURYXSA9IHsKKwkJLnR5cGUgPSBOTEFfVTMyLAorCX0sCisJW1dJTUFYX0dOTF9SRktJTExfU1RBVEVdID0geworCQkudHlwZSA9IE5MQV9VMzIJCS8qIGVudW0gd2ltYXhfcmZfc3RhdGUgKi8KKwl9LAorfTsKKworCitzdGF0aWMKK2ludCB3aW1heF9nbmxfZG9pdF9yZmtpbGwoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGdlbmxfaW5mbyAqaW5mbykKK3sKKwlpbnQgcmVzdWx0LCBpZmluZGV4OworCXN0cnVjdCB3aW1heF9kZXYgKndpbWF4X2RldjsKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisJZW51bSB3aW1heF9yZl9zdGF0ZSBuZXdfc3RhdGU7CisKKwlkX2Zuc3RhcnQoMywgTlVMTCwgIihza2IgJXAgaW5mbyAlcClcbiIsIHNrYiwgaW5mbyk7CisJcmVzdWx0ID0gLUVOT0RFVjsKKwlpZiAoaW5mby0+YXR0cnNbV0lNQVhfR05MX1JGS0lMTF9JRklEWF0gPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgIldJTUFYX0dOTF9PUF9SRktJTEw6IGNhbid0IGZpbmQgSUZJRFggIgorCQkJImF0dHJpYnV0ZVxuIik7CisJCWdvdG8gZXJyb3Jfbm9fd2ltYXhfZGV2OworCX0KKwlpZmluZGV4ID0gbmxhX2dldF91MzIoaW5mby0+YXR0cnNbV0lNQVhfR05MX1JGS0lMTF9JRklEWF0pOworCXdpbWF4X2RldiA9IHdpbWF4X2Rldl9nZXRfYnlfZ2VubF9pbmZvKGluZm8sIGlmaW5kZXgpOworCWlmICh3aW1heF9kZXYgPT0gTlVMTCkKKwkJZ290byBlcnJvcl9ub193aW1heF9kZXY7CisJZGV2ID0gd2ltYXhfZGV2X3RvX2Rldih3aW1heF9kZXYpOworCXJlc3VsdCA9IC1FSU5WQUw7CisJaWYgKGluZm8tPmF0dHJzW1dJTUFYX0dOTF9SRktJTExfU1RBVEVdID09IE5VTEwpIHsKKwkJZGV2X2VycihkZXYsICJXSU1BWF9HTkxfUkZLSUxMOiBjYW4ndCBmaW5kIFJGS0lMTF9TVEFURSAiCisJCQkiYXR0cmlidXRlXG4iKTsKKwkJZ290byBlcnJvcl9ub19waWQ7CisJfQorCW5ld19zdGF0ZSA9IG5sYV9nZXRfdTMyKGluZm8tPmF0dHJzW1dJTUFYX0dOTF9SRktJTExfU1RBVEVdKTsKKworCS8qIEV4ZWN1dGUgdGhlIG9wZXJhdGlvbiBhbmQgc2VuZCB0aGUgcmVzdWx0IGJhY2sgdG8gdXNlciBzcGFjZSAqLworCXJlc3VsdCA9IHdpbWF4X3Jma2lsbCh3aW1heF9kZXYsIG5ld19zdGF0ZSk7CitlcnJvcl9ub19waWQ6CisJZGV2X3B1dCh3aW1heF9kZXYtPm5ldF9kZXYpOworZXJyb3Jfbm9fd2ltYXhfZGV2OgorCWRfZm5lbmQoMywgTlVMTCwgIihza2IgJXAgaW5mbyAlcCkgPSAlZFxuIiwgc2tiLCBpbmZvLCByZXN1bHQpOworCXJldHVybiByZXN1bHQ7Cit9CisKKworc3RydWN0IGdlbmxfb3BzIHdpbWF4X2dubF9yZmtpbGwgPSB7CisJLmNtZCA9IFdJTUFYX0dOTF9PUF9SRktJTEwsCisJLmZsYWdzID0gR0VOTF9BRE1JTl9QRVJNLAorCS5wb2xpY3kgPSB3aW1heF9nbmxfcmZraWxsX3BvbGljeSwKKwkuZG9pdCA9IHdpbWF4X2dubF9kb2l0X3Jma2lsbCwKKwkuZHVtcGl0ID0gTlVMTCwKK307CisKZGlmZiAtLWdpdCBhL25ldC93aW1heC9zdGFjay5jIGIvbmV0L3dpbWF4L3N0YWNrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDRkYTkyZgotLS0gL2Rldi9udWxsCisrKyBiL25ldC93aW1heC9zdGFjay5jCkBAIC0wLDAgKzEsNTk5IEBACisvKgorICogTGludXggV2lNQVgKKyAqIEluaXRpYWxpemF0aW9uLCBhZGRpdGlvbiBhbmQgcmVtb3ZhbCBvZiB3aW1heCBkZXZpY2VzCisgKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNS0yMDA2IEludGVsIENvcnBvcmF0aW9uIDxsaW51eC13aW1heEBpbnRlbC5jb20+CisgKiBJbmFreSBQZXJlei1Hb256YWxleiA8aW5ha3kucGVyZXotZ29uemFsZXpAaW50ZWwuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEsIFVTQS4KKyAqCisgKgorICogVGhpcyBpbXBsZW1lbnRzOgorICoKKyAqICAgLSBiYXNpYyBsaWZlIGN5Y2xlIG9mICdzdHJ1Y3Qgd2ltYXhfZGV2JyBbd2ltYXhfZGV2XyooKV07IG9uCisgKiAgICAgYWRkaXRpb24vcmVnaXN0cmF0aW9uIGluaXRpYWxpemUgYWxsIHN1YmZpZWxkcyBhbmQgYWxsb2NhdGUKKyAqICAgICBnZW5lcmljIG5ldGxpbmsgcmVzb3VyY2VzIGZvciB1c2VyIHNwYWNlIGNvbW11bmljYXRpb24uIE9uCisgKiAgICAgcmVtb3ZhbC91bnJlZ2lzdHJhdGlvbiwgdW5kbyBhbGwgdGhhdC4KKyAqCisgKiAgIC0gZGV2aWNlIHN0YXRlIG1hY2hpbmUgW3dpbWF4X3N0YXRlX2NoYW5nZSgpXSBhbmQgc3VwcG9ydCB0byBzZW5kCisgKiAgICAgcmVwb3J0cyB0byB1c2VyIHNwYWNlIHdoZW4gdGhlIHN0YXRlIGNoYW5nZXMKKyAqICAgICBbd2ltYXhfZ25sX3JlX3N0YXRlX2NoYW5nZSooKV0uCisgKgorICogU2VlIGluY2x1ZGUvbmV0L3dpbWF4LmggZm9yIHJhdGlvbmFsZXMgYW5kIGRlc2lnbi4KKyAqCisgKiBST0FETUFQCisgKgorICogW19fXXdpbWF4X3N0YXRlX2NoYW5nZSgpICAgICBDYWxsZWQgYnkgZHJpdmVycyB0byB1cGRhdGUgZGV2aWNlJ3Mgc3RhdGUKKyAqICAgd2ltYXhfZ25sX3JlX3N0YXRlX2NoYW5nZV9hbGxvYygpCisgKiAgIHdpbWF4X2dubF9yZV9zdGF0ZV9jaGFuZ2Vfc2VuZCgpCisgKgorICogd2ltYXhfZGV2X2luaXQoKQkgICAgICAgIEluaXQgYSBkZXZpY2UKKyAqIHdpbWF4X2Rldl9hZGQoKSAgICAgICAgICAgICAgUmVnaXN0ZXIKKyAqICAgd2ltYXhfcmZraWxsX2FkZCgpCisgKiAgIHdpbWF4X2dubF9hZGQoKSAgICAgICAgICAgIFJlZ2lzdGVyIGFsbCB0aGUgZ2VuZXJpYyBuZXRsaW5rIHJlc291cmNlcy4KKyAqICAgd2ltYXhfaWRfdGFibGVfYWRkKCkKKyAqIHdpbWF4X2Rldl9ybSgpICAgICAgICAgICAgICAgVW5yZWdpc3RlcgorICogICB3aW1heF9pZF90YWJsZV9ybSgpCisgKiAgIHdpbWF4X2dubF9ybSgpCisgKiAgIHdpbWF4X3Jma2lsbF9ybSgpCisgKi8KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxuZXQvZ2VuZXRsaW5rLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvd2ltYXguaD4KKyNpbmNsdWRlICJ3aW1heC1pbnRlcm5hbC5oIgorCisKKyNkZWZpbmUgRF9TVUJNT0RVTEUgc3RhY2sKKyNpbmNsdWRlICJkZWJ1Zy1sZXZlbHMuaCIKKworLyoKKyAqIEF1dGhvcml0YXRpdmUgc291cmNlIGZvciB0aGUgUkVfU1RBVEVfQ0hBTkdFIGF0dHJpYnV0ZSBwb2xpY3kKKyAqCisgKiBXZSBkb24ndCByZWFsbHkgdXNlIGl0IGhlcmUsIGJ1dCAvbWUgbGlrZXMgdG8ga2VlcCB0aGUgZGVmaW5pdGlvbgorICogY2xvc2UgdG8gd2hlcmUgdGhlIGRhdGEgaXMgZ2VuZXJhdGVkLgorICovCisvKgorc3RhdGljIGNvbnN0CitzdHJ1Y3QgbmxhX3BvbGljeSB3aW1heF9nbmxfcmVfc3RhdHVzX2NoYW5nZVtXSU1BWF9HTkxfQVRUUl9NQVggKyAxXSA9IHsKKwlbV0lNQVhfR05MX1NUQ0hfU1RBVEVfT0xEXSA9IHsgLnR5cGUgPSBOTEFfVTggfSwKKwlbV0lNQVhfR05MX1NUQ0hfU1RBVEVfTkVXXSA9IHsgLnR5cGUgPSBOTEFfVTggfSwKK307CisqLworCisKKy8qCisgKiBBbGxvY2F0ZSBhIFJlcG9ydCBTdGF0ZSBDaGFuZ2UgbWVzc2FnZQorICoKKyAqIEBoZWFkZXI6IHNhdmUgaXQsIHlvdSBuZWVkIGl0IGZvciBfc2VuZCgpCisgKgorICogQ3JlYXRlcyBhbmQgZmlsbHMgYSBiYXNpYyBzdGF0ZSBjaGFuZ2UgbWVzc2FnZTsgZGlmZmVyZW50IGNvZGUKKyAqIHBhdGhzIGNhbiB0aGVuIGFkZCBtb3JlIGF0dHJpYnV0ZXMgdG8gdGhlIG1lc3NhZ2UgYXMgbmVlZGVkLgorICoKKyAqIFVzZSB3aW1heF9nbmxfcmVfc3RhdGVfY2hhbmdlX3NlbmQoKSB0byBzZW5kIHRoZSByZXR1cm5lZCBza2IuCisgKgorICogUmV0dXJuczogc2tiIHdpdGggdGhlIGdlbmwgbWVzc2FnZSBpZiBvaywgSVNfRVJSKCkgcHRyIG9uIGVycm9yCisgKiAgICAgd2l0aCBhbiBlcnJubyBjb2RlLgorICovCitzdGF0aWMKK3N0cnVjdCBza19idWZmICp3aW1heF9nbmxfcmVfc3RhdGVfY2hhbmdlX2FsbG9jKAorCXN0cnVjdCB3aW1heF9kZXYgKndpbWF4X2RldiwKKwllbnVtIHdpbWF4X3N0IG5ld19zdGF0ZSwgZW51bSB3aW1heF9zdCBvbGRfc3RhdGUsCisJdm9pZCAqKmhlYWRlcikKK3sKKwlpbnQgcmVzdWx0OworCXN0cnVjdCBkZXZpY2UgKmRldiA9IHdpbWF4X2Rldl90b19kZXYod2ltYXhfZGV2KTsKKwl2b2lkICpkYXRhOworCXN0cnVjdCBza19idWZmICpyZXBvcnRfc2tiOworCisJZF9mbnN0YXJ0KDMsIGRldiwgIih3aW1heF9kZXYgJXAgbmV3X3N0YXRlICV1IG9sZF9zdGF0ZSAldSlcbiIsCisJCSAgd2ltYXhfZGV2LCBuZXdfc3RhdGUsIG9sZF9zdGF0ZSk7CisJcmVzdWx0ID0gLUVOT01FTTsKKwlyZXBvcnRfc2tiID0gbmxtc2dfbmV3KE5MTVNHX0RFRkFVTFRfU0laRSwgR0ZQX0tFUk5FTCk7CisJaWYgKHJlcG9ydF9za2IgPT0gTlVMTCkgeworCQlkZXZfZXJyKGRldiwgIlJFX1NUQ0g6IGNhbid0IGNyZWF0ZSBtZXNzYWdlXG4iKTsKKwkJZ290byBlcnJvcl9uZXc7CisJfQorCWRhdGEgPSBnZW5sbXNnX3B1dChyZXBvcnRfc2tiLCAwLCB3aW1heF9nbmxfbWNnLmlkLCAmd2ltYXhfZ25sX2ZhbWlseSwKKwkJCSAgIDAsIFdJTUFYX0dOTF9SRV9TVEFURV9DSEFOR0UpOworCWlmIChkYXRhID09IE5VTEwpIHsKKwkJZGV2X2VycihkZXYsICJSRV9TVENIOiBjYW4ndCBwdXQgZGF0YSBpbnRvIG1lc3NhZ2VcbiIpOworCQlnb3RvIGVycm9yX3B1dDsKKwl9CisJKmhlYWRlciA9IGRhdGE7CisKKwlyZXN1bHQgPSBubGFfcHV0X3U4KHJlcG9ydF9za2IsIFdJTUFYX0dOTF9TVENIX1NUQVRFX09MRCwgb2xkX3N0YXRlKTsKKwlpZiAocmVzdWx0IDwgMCkgeworCQlkZXZfZXJyKGRldiwgIlJFX1NUQ0g6IEVycm9yIGFkZGluZyBPTEQgYXR0cjogJWRcbiIsIHJlc3VsdCk7CisJCWdvdG8gZXJyb3JfcHV0OworCX0KKwlyZXN1bHQgPSBubGFfcHV0X3U4KHJlcG9ydF9za2IsIFdJTUFYX0dOTF9TVENIX1NUQVRFX05FVywgbmV3X3N0YXRlKTsKKwlpZiAocmVzdWx0IDwgMCkgeworCQlkZXZfZXJyKGRldiwgIlJFX1NUQ0g6IEVycm9yIGFkZGluZyBORVcgYXR0cjogJWRcbiIsIHJlc3VsdCk7CisJCWdvdG8gZXJyb3JfcHV0OworCX0KKwlyZXN1bHQgPSBubGFfcHV0X3UzMihyZXBvcnRfc2tiLCBXSU1BWF9HTkxfU1RDSF9JRklEWCwKKwkJCSAgICAgd2ltYXhfZGV2LT5uZXRfZGV2LT5pZmluZGV4KTsKKwlpZiAocmVzdWx0IDwgMCkgeworCQlkZXZfZXJyKGRldiwgIlJFX1NUQ0g6IEVycm9yIGFkZGluZyBJRklOREVYIGF0dHJpYnV0ZVxuIik7CisJCWdvdG8gZXJyb3JfcHV0OworCX0KKwlkX2ZuZW5kKDMsIGRldiwgIih3aW1heF9kZXYgJXAgbmV3X3N0YXRlICV1IG9sZF9zdGF0ZSAldSkgPSAlcFxuIiwKKwkJd2ltYXhfZGV2LCBuZXdfc3RhdGUsIG9sZF9zdGF0ZSwgcmVwb3J0X3NrYik7CisJcmV0dXJuIHJlcG9ydF9za2I7CisKK2Vycm9yX3B1dDoKKwlubG1zZ19mcmVlKHJlcG9ydF9za2IpOworZXJyb3JfbmV3OgorCWRfZm5lbmQoMywgZGV2LCAiKHdpbWF4X2RldiAlcCBuZXdfc3RhdGUgJXUgb2xkX3N0YXRlICV1KSA9ICVkXG4iLAorCQl3aW1heF9kZXYsIG5ld19zdGF0ZSwgb2xkX3N0YXRlLCByZXN1bHQpOworCXJldHVybiBFUlJfUFRSKHJlc3VsdCk7Cit9CisKKworLyoKKyAqIFNlbmQgYSBSZXBvcnQgU3RhdGUgQ2hhbmdlIG1lc3NhZ2UgKGFzIGNyZWF0ZWQgd2l0aCBfYWxsb2MpLgorICoKKyAqIEByZXBvcnRfc2tiOiBhcyByZXR1cm5lZCBieSB3aW1heF9nbmxfcmVfc3RhdGVfY2hhbmdlX2FsbG9jKCkKKyAqIEBoZWFkZXI6IGFzIHJldHVybmVkIGJ5IHdpbWF4X2dubF9yZV9zdGF0ZV9jaGFuZ2VfYWxsb2MoKQorICoKKyAqIFJldHVybnM6IDAgaWYgb2ssIDwgMCBlcnJubyBjb2RlIG9uIGVycm9yLgorICoKKyAqIElmIHRoZSBtZXNzYWdlIGlzICBOVUxMLCBwcmV0ZW5kIGl0IGRpZG4ndCBoYXBwZW4uCisgKi8KK3N0YXRpYworaW50IHdpbWF4X2dubF9yZV9zdGF0ZV9jaGFuZ2Vfc2VuZCgKKwlzdHJ1Y3Qgd2ltYXhfZGV2ICp3aW1heF9kZXYsIHN0cnVjdCBza19idWZmICpyZXBvcnRfc2tiLAorCXZvaWQgKmhlYWRlcikKK3sKKwlpbnQgcmVzdWx0ID0gMDsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSB3aW1heF9kZXZfdG9fZGV2KHdpbWF4X2Rldik7CisJZF9mbnN0YXJ0KDMsIGRldiwgIih3aW1heF9kZXYgJXAgcmVwb3J0X3NrYiAlcClcbiIsCisJCSAgd2ltYXhfZGV2LCByZXBvcnRfc2tiKTsKKwlpZiAocmVwb3J0X3NrYiA9PSBOVUxMKQorCQlnb3RvIG91dDsKKwlnZW5sbXNnX2VuZChyZXBvcnRfc2tiLCBoZWFkZXIpOworCXJlc3VsdCA9IGdlbmxtc2dfbXVsdGljYXN0KHJlcG9ydF9za2IsIDAsIHdpbWF4X2dubF9tY2cuaWQsIEdGUF9LRVJORUwpOworCWlmIChyZXN1bHQgPT0gLUVTUkNIKQkvKiBOb2JvZHkgY29ubmVjdGVkLCBpZ25vcmUgaXQgKi8KKwkJcmVzdWx0ID0gMDsJLyogYnR3LCB0aGUgc2tiIGlzIGZyZWVkIGFscmVhZHkgKi8KKwlpZiAocmVzdWx0IDwgMCkgeworCQlkZXZfZXJyKGRldiwgIlJFX1NUQ0g6IEVycm9yIHNlbmRpbmc6ICVkXG4iLCByZXN1bHQpOworCQlubG1zZ19mcmVlKHJlcG9ydF9za2IpOworCX0KK291dDoKKwlkX2ZuZW5kKDMsIGRldiwgIih3aW1heF9kZXYgJXAgcmVwb3J0X3NrYiAlcCkgPSAlZFxuIiwKKwkJd2ltYXhfZGV2LCByZXBvcnRfc2tiLCByZXN1bHQpOworCXJldHVybiByZXN1bHQ7Cit9CisKKworc3RhdGljCit2b2lkIF9fY2hlY2tfbmV3X3N0YXRlKGVudW0gd2ltYXhfc3Qgb2xkX3N0YXRlLCBlbnVtIHdpbWF4X3N0IG5ld19zdGF0ZSwKKwkJICAgICAgIHVuc2lnbmVkIGFsbG93ZWRfc3RhdGVzX2JtKQoreworCWlmIChXQVJOX09OKCgoMSA8PCBuZXdfc3RhdGUpICYgYWxsb3dlZF9zdGF0ZXNfYm0pID09IDApKSB7CisJCXByaW50ayhLRVJOX0VSUiAiU1cgQlVHISBGb3JiaWRkZW4gc3RhdGUgY2hhbmdlICV1IC0+ICV1XG4iLAorCQkJb2xkX3N0YXRlLCBuZXdfc3RhdGUpOworCX0KK30KKworCisvKgorICogU2V0IHRoZSBjdXJyZW50IHN0YXRlIG9mIGEgV2lNQVggZGV2aWNlIFt1bmxvY2tpbmcgdmVyc2lvbiBvZgorICogd2ltYXhfc3RhdGVfY2hhbmdlKCkuCisgKi8KK3ZvaWQgX193aW1heF9zdGF0ZV9jaGFuZ2Uoc3RydWN0IHdpbWF4X2RldiAqd2ltYXhfZGV2LCBlbnVtIHdpbWF4X3N0IG5ld19zdGF0ZSkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSB3aW1heF9kZXZfdG9fZGV2KHdpbWF4X2Rldik7CisJZW51bSB3aW1heF9zdCBvbGRfc3RhdGUgPSB3aW1heF9kZXYtPnN0YXRlOworCXN0cnVjdCBza19idWZmICpzdGNoX3NrYjsKKwl2b2lkICpoZWFkZXI7CisKKwlkX2Zuc3RhcnQoMywgZGV2LCAiKHdpbWF4X2RldiAlcCBuZXdfc3RhdGUgJXUgW29sZCAldV0pXG4iLAorCQkgIHdpbWF4X2RldiwgbmV3X3N0YXRlLCBvbGRfc3RhdGUpOworCisJaWYgKFdBUk5fT04obmV3X3N0YXRlID49IF9fV0lNQVhfU1RfSU5WQUxJRCkpIHsKKwkJZGV2X2VycihkZXYsICJTVyBCVUc6IHJlcXVlc3RpbmcgaW52YWxpZCBzdGF0ZSAldVxuIiwKKwkJCW5ld19zdGF0ZSk7CisJCWdvdG8gb3V0OworCX0KKwlpZiAob2xkX3N0YXRlID09IG5ld19zdGF0ZSkKKwkJZ290byBvdXQ7CisJaGVhZGVyID0gTlVMTDsJLyogZ2NjIGNvbXBsYWlucz8gY2FuJ3QgZ3JvayB3aHkgKi8KKwlzdGNoX3NrYiA9IHdpbWF4X2dubF9yZV9zdGF0ZV9jaGFuZ2VfYWxsb2MoCisJCXdpbWF4X2RldiwgbmV3X3N0YXRlLCBvbGRfc3RhdGUsICZoZWFkZXIpOworCisJLyogVmVyaWZ5IHRoZSBzdGF0ZSB0cmFuc2l0aW9uIGFuZCBkbyBleGl0LWZyb20tc3RhdGUgYWN0aW9ucyAqLworCXN3aXRjaCAob2xkX3N0YXRlKSB7CisJY2FzZSBfX1dJTUFYX1NUX05VTEw6CisJCV9fY2hlY2tfbmV3X3N0YXRlKG9sZF9zdGF0ZSwgbmV3X3N0YXRlLAorCQkJCSAgMSA8PCBXSU1BWF9TVF9ET1dOKTsKKwkJYnJlYWs7CisJY2FzZSBXSU1BWF9TVF9ET1dOOgorCQlfX2NoZWNrX25ld19zdGF0ZShvbGRfc3RhdGUsIG5ld19zdGF0ZSwKKwkJCQkgIDEgPDwgX19XSU1BWF9TVF9RVUlFU0NJTkcKKwkJCQkgIHwgMSA8PCBXSU1BWF9TVF9VTklOSVRJQUxJWkVECisJCQkJICB8IDEgPDwgV0lNQVhfU1RfUkFESU9fT0ZGKTsKKwkJYnJlYWs7CisJY2FzZSBfX1dJTUFYX1NUX1FVSUVTQ0lORzoKKwkJX19jaGVja19uZXdfc3RhdGUob2xkX3N0YXRlLCBuZXdfc3RhdGUsIDEgPDwgV0lNQVhfU1RfRE9XTik7CisJCWJyZWFrOworCWNhc2UgV0lNQVhfU1RfVU5JTklUSUFMSVpFRDoKKwkJX19jaGVja19uZXdfc3RhdGUob2xkX3N0YXRlLCBuZXdfc3RhdGUsCisJCQkJICAxIDw8IF9fV0lNQVhfU1RfUVVJRVNDSU5HCisJCQkJICB8IDEgPDwgV0lNQVhfU1RfUkFESU9fT0ZGKTsKKwkJYnJlYWs7CisJY2FzZSBXSU1BWF9TVF9SQURJT19PRkY6CisJCV9fY2hlY2tfbmV3X3N0YXRlKG9sZF9zdGF0ZSwgbmV3X3N0YXRlLAorCQkJCSAgMSA8PCBfX1dJTUFYX1NUX1FVSUVTQ0lORworCQkJCSAgfCAxIDw8IFdJTUFYX1NUX1JFQURZKTsKKwkJYnJlYWs7CisJY2FzZSBXSU1BWF9TVF9SRUFEWToKKwkJX19jaGVja19uZXdfc3RhdGUob2xkX3N0YXRlLCBuZXdfc3RhdGUsCisJCQkJICAxIDw8IF9fV0lNQVhfU1RfUVVJRVNDSU5HCisJCQkJICB8IDEgPDwgV0lNQVhfU1RfUkFESU9fT0ZGCisJCQkJICB8IDEgPDwgV0lNQVhfU1RfU0NBTk5JTkcKKwkJCQkgIHwgMSA8PCBXSU1BWF9TVF9DT05ORUNUSU5HCisJCQkJICB8IDEgPDwgV0lNQVhfU1RfQ09OTkVDVEVEKTsKKwkJYnJlYWs7CisJY2FzZSBXSU1BWF9TVF9TQ0FOTklORzoKKwkJX19jaGVja19uZXdfc3RhdGUob2xkX3N0YXRlLCBuZXdfc3RhdGUsCisJCQkJICAxIDw8IF9fV0lNQVhfU1RfUVVJRVNDSU5HCisJCQkJICB8IDEgPDwgV0lNQVhfU1RfUkFESU9fT0ZGCisJCQkJICB8IDEgPDwgV0lNQVhfU1RfUkVBRFkKKwkJCQkgIHwgMSA8PCBXSU1BWF9TVF9DT05ORUNUSU5HCisJCQkJICB8IDEgPDwgV0lNQVhfU1RfQ09OTkVDVEVEKTsKKwkJYnJlYWs7CisJY2FzZSBXSU1BWF9TVF9DT05ORUNUSU5HOgorCQlfX2NoZWNrX25ld19zdGF0ZShvbGRfc3RhdGUsIG5ld19zdGF0ZSwKKwkJCQkgIDEgPDwgX19XSU1BWF9TVF9RVUlFU0NJTkcKKwkJCQkgIHwgMSA8PCBXSU1BWF9TVF9SQURJT19PRkYKKwkJCQkgIHwgMSA8PCBXSU1BWF9TVF9SRUFEWQorCQkJCSAgfCAxIDw8IFdJTUFYX1NUX1NDQU5OSU5HCisJCQkJICB8IDEgPDwgV0lNQVhfU1RfQ09OTkVDVEVEKTsKKwkJYnJlYWs7CisJY2FzZSBXSU1BWF9TVF9DT05ORUNURUQ6CisJCV9fY2hlY2tfbmV3X3N0YXRlKG9sZF9zdGF0ZSwgbmV3X3N0YXRlLAorCQkJCSAgMSA8PCBfX1dJTUFYX1NUX1FVSUVTQ0lORworCQkJCSAgfCAxIDw8IFdJTUFYX1NUX1JBRElPX09GRgorCQkJCSAgfCAxIDw8IFdJTUFYX1NUX1JFQURZKTsKKwkJbmV0aWZfdHhfZGlzYWJsZSh3aW1heF9kZXYtPm5ldF9kZXYpOworCQluZXRpZl9jYXJyaWVyX29mZih3aW1heF9kZXYtPm5ldF9kZXYpOworCQlicmVhazsKKwljYXNlIF9fV0lNQVhfU1RfSU5WQUxJRDoKKwlkZWZhdWx0OgorCQlkZXZfZXJyKGRldiwgIlNXIEJVRzogd2ltYXhfZGV2ICVwIGlzIGluIHVua25vd24gc3RhdGUgJXVcbiIsCisJCQl3aW1heF9kZXYsIHdpbWF4X2Rldi0+c3RhdGUpOworCQlXQVJOX09OKDEpOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBFeGVjdXRlIHRoZSBhY3Rpb25zIG9mIGVudHJ5IHRvIHRoZSBuZXcgc3RhdGUgKi8KKwlzd2l0Y2ggKG5ld19zdGF0ZSkgeworCWNhc2UgX19XSU1BWF9TVF9OVUxMOgorCQlkZXZfZXJyKGRldiwgIlNXIEJVRzogd2ltYXhfZGV2ICVwIGVudGVyaW5nIE5VTEwgc3RhdGUgIgorCQkJImZyb20gJXVcbiIsIHdpbWF4X2Rldiwgd2ltYXhfZGV2LT5zdGF0ZSk7CisJCVdBUk5fT04oMSk7CQkvKiBOb2JvZHkgY2FuIGVudGVyIHRoaXMgc3RhdGUgKi8KKwkJYnJlYWs7CisJY2FzZSBXSU1BWF9TVF9ET1dOOgorCQlicmVhazsKKwljYXNlIF9fV0lNQVhfU1RfUVVJRVNDSU5HOgorCQlicmVhazsKKwljYXNlIFdJTUFYX1NUX1VOSU5JVElBTElaRUQ6CisJCWJyZWFrOworCWNhc2UgV0lNQVhfU1RfUkFESU9fT0ZGOgorCQlicmVhazsKKwljYXNlIFdJTUFYX1NUX1JFQURZOgorCQlicmVhazsKKwljYXNlIFdJTUFYX1NUX1NDQU5OSU5HOgorCQlicmVhazsKKwljYXNlIFdJTUFYX1NUX0NPTk5FQ1RJTkc6CisJCWJyZWFrOworCWNhc2UgV0lNQVhfU1RfQ09OTkVDVEVEOgorCQluZXRpZl9jYXJyaWVyX29uKHdpbWF4X2Rldi0+bmV0X2Rldik7CisJCW5ldGlmX3dha2VfcXVldWUod2ltYXhfZGV2LT5uZXRfZGV2KTsKKwkJYnJlYWs7CisJY2FzZSBfX1dJTUFYX1NUX0lOVkFMSUQ6CisJZGVmYXVsdDoKKwkJQlVHKCk7CisJfQorCV9fd2ltYXhfc3RhdGVfc2V0KHdpbWF4X2RldiwgbmV3X3N0YXRlKTsKKwlpZiAoc3RjaF9za2IpCisJCXdpbWF4X2dubF9yZV9zdGF0ZV9jaGFuZ2Vfc2VuZCh3aW1heF9kZXYsIHN0Y2hfc2tiLCBoZWFkZXIpOworb3V0OgorCWRfZm5lbmQoMywgZGV2LCAiKHdpbWF4X2RldiAlcCBuZXdfc3RhdGUgJXUgW29sZCAldV0pID0gdm9pZFxuIiwKKwkJd2ltYXhfZGV2LCBuZXdfc3RhdGUsIG9sZF9zdGF0ZSk7CisJcmV0dXJuOworfQorCisKKy8qKgorICogd2ltYXhfc3RhdGVfY2hhbmdlIC0gU2V0IHRoZSBjdXJyZW50IHN0YXRlIG9mIGEgV2lNQVggZGV2aWNlCisgKgorICogQHdpbWF4X2RldjogV2lNQVggZGV2aWNlIGRlc2NyaXB0b3IgKHByb3Blcmx5IHJlZmVyZW5jZWQpCisgKiBAbmV3X3N0YXRlOiBOZXcgc3RhdGUgdG8gc3dpdGNoIHRvCisgKgorICogVGhpcyBpbXBsZW1lbnRzIHRoZSBzdGF0ZSBjaGFuZ2VzIGZvciB0aGUgd2ltYXggZGV2aWNlcy4gSXQgd2lsbAorICoKKyAqIC0gdmVyaWZ5IHRoYXQgdGhlIHN0YXRlIHRyYW5zaXRpb24gaXMgbGVnYWwgKGZvciBub3cgaXQnbGwganVzdAorICogICBwcmludCBhIHdhcm5pbmcgaWYgbm90KSBhY2NvcmRpbmcgdG8gdGhlIHRhYmxlIGluCisgKiAgIGxpbnV4L3dpbWF4LmgncyBkb2N1bWVudGF0aW9uIGZvciAnZW51bSB3aW1heF9zdCcuCisgKgorICogLSBwZXJmb3JtIHRoZSBhY3Rpb25zIG5lZWRlZCBmb3IgbGVhdmluZyB0aGUgY3VycmVudCBzdGF0ZSBhbmQKKyAqICAgd2hpY2hldmVyIGFyZSBuZWVkZWQgZm9yIGVudGVyaW5nIHRoZSBuZXcgc3RhdGUuCisgKgorICogLSBpc3N1ZSBhIHJlcG9ydCB0byB1c2VyIHNwYWNlIGluZGljYXRpbmcgdGhlIG5ldyBzdGF0ZSAoYW5kIGFuCisgKiAgIG9wdGlvbmFsIHBheWxvYWQgd2l0aCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgbmV3IHN0YXRlKS4KKyAqCisgKiBOT1RFOiBAd2ltYXhfZGV2IG11c3QgYmUgbG9ja2VkCisgKi8KK3ZvaWQgd2ltYXhfc3RhdGVfY2hhbmdlKHN0cnVjdCB3aW1heF9kZXYgKndpbWF4X2RldiwgZW51bSB3aW1heF9zdCBuZXdfc3RhdGUpCit7CisJbXV0ZXhfbG9jaygmd2ltYXhfZGV2LT5tdXRleCk7CisJX193aW1heF9zdGF0ZV9jaGFuZ2Uod2ltYXhfZGV2LCBuZXdfc3RhdGUpOworCW11dGV4X3VubG9jaygmd2ltYXhfZGV2LT5tdXRleCk7CisJcmV0dXJuOworfQorRVhQT1JUX1NZTUJPTF9HUEwod2ltYXhfc3RhdGVfY2hhbmdlKTsKKworCisvKioKKyAqIHdpbWF4X3N0YXRlX2dldCgpIC0gUmV0dXJuIHRoZSBjdXJyZW50IHN0YXRlIG9mIGEgV2lNQVggZGV2aWNlCisgKgorICogQHdpbWF4X2RldjogV2lNQVggZGV2aWNlIGRlc2NyaXB0b3IKKyAqCisgKiBSZXR1cm5zOiBDdXJyZW50IHN0YXRlIG9mIHRoZSBkZXZpY2UgYWNjb3JkaW5nIHRvIGl0cyBkcml2ZXIuCisgKi8KK2VudW0gd2ltYXhfc3Qgd2ltYXhfc3RhdGVfZ2V0KHN0cnVjdCB3aW1heF9kZXYgKndpbWF4X2RldikKK3sKKwllbnVtIHdpbWF4X3N0IHN0YXRlOworCW11dGV4X2xvY2soJndpbWF4X2Rldi0+bXV0ZXgpOworCXN0YXRlID0gd2ltYXhfZGV2LT5zdGF0ZTsKKwltdXRleF91bmxvY2soJndpbWF4X2Rldi0+bXV0ZXgpOworCXJldHVybiBzdGF0ZTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHdpbWF4X3N0YXRlX2dldCk7CisKKworLyoqCisgKiB3aW1heF9kZXZfaW5pdCAtIGluaXRpYWxpemUgYSBuZXdseSBhbGxvY2F0ZWQgaW5zdGFuY2UKKyAqCisgKiBAd2ltYXhfZGV2OiBXaU1BWCBkZXZpY2UgZGVzY3JpcHRvciB0byBpbml0aWFsaXplLgorICoKKyAqIEluaXRpYWxpemVzIGZpZWxkcyBvZiBhIGZyZXNobHkgYWxsb2NhdGVkIEB3aW1heF9kZXYgaW5zdGFuY2UuIFRoaXMKKyAqIGZ1bmN0aW9uIGFzc3VtZXMgdGhhdCBhZnRlciBhbGxvY2F0aW9uLCB0aGUgbWVtb3J5IG9jY3VwaWVkIGJ5CisgKiBAd2ltYXhfZGV2IHdhcyB6ZXJvZWQuCisgKi8KK3ZvaWQgd2ltYXhfZGV2X2luaXQoc3RydWN0IHdpbWF4X2RldiAqd2ltYXhfZGV2KQoreworCUlOSVRfTElTVF9IRUFEKCZ3aW1heF9kZXYtPmlkX3RhYmxlX25vZGUpOworCV9fd2ltYXhfc3RhdGVfc2V0KHdpbWF4X2RldiwgV0lNQVhfU1RfVU5JTklUSUFMSVpFRCk7CisJbXV0ZXhfaW5pdCgmd2ltYXhfZGV2LT5tdXRleCk7CisJbXV0ZXhfaW5pdCgmd2ltYXhfZGV2LT5tdXRleF9yZXNldCk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh3aW1heF9kZXZfaW5pdCk7CisKKy8qCisgKiBUaGlzIGV4dGVybiBpcyBkZWNsYXJlZCBoZXJlIGJlY2F1c2UgaXQncyBlYXNpZXIgdG8ga2VlcCB0cmFjayAtLQorICogYm90aCBkZWNsYXJhdGlvbnMgYXJlIGEgbGlzdCBvZiB0aGUgc2FtZQorICovCitleHRlcm4gc3RydWN0IGdlbmxfb3BzCisJd2ltYXhfZ25sX21zZ19mcm9tX3VzZXIsCisJd2ltYXhfZ25sX3Jlc2V0LAorCXdpbWF4X2dubF9yZmtpbGw7CisKK3N0YXRpYworc3RydWN0IGdlbmxfb3BzICp3aW1heF9nbmxfb3BzW10gPSB7CisJJndpbWF4X2dubF9tc2dfZnJvbV91c2VyLAorCSZ3aW1heF9nbmxfcmVzZXQsCisJJndpbWF4X2dubF9yZmtpbGwsCit9OworCisKK3N0YXRpYworc2l6ZV90IHdpbWF4X2FkZHJfc2NucHJpbnQoY2hhciAqYWRkcl9zdHIsIHNpemVfdCBhZGRyX3N0cl9zaXplLAorCQkJICAgdW5zaWduZWQgY2hhciAqYWRkciwgc2l6ZV90IGFkZHJfbGVuKQoreworCXVuc2lnbmVkIGNudCwgdG90YWw7CisJZm9yICh0b3RhbCA9IGNudCA9IDA7IGNudCA8IGFkZHJfbGVuOyBjbnQrKykKKwkJdG90YWwgKz0gc2NucHJpbnRmKGFkZHJfc3RyICsgdG90YWwsIGFkZHJfc3RyX3NpemUgLSB0b3RhbCwKKwkJCQkgICAiJTAyeCVjIiwgYWRkcltjbnRdLAorCQkJCSAgIGNudCA9PSBhZGRyX2xlbiAtIDEgPyAnXDAnIDogJzonKTsKKwlyZXR1cm4gdG90YWw7Cit9CisKKworLyoqCisgKiB3aW1heF9kZXZfYWRkIC0gUmVnaXN0ZXIgYSBuZXcgV2lNQVggZGV2aWNlCisgKgorICogQHdpbWF4X2RldjogV2lNQVggZGV2aWNlIGRlc2NyaXB0b3IgKGFzIGVtYmVkZGVkIGluIHlvdXIgQG5ldF9kZXYncworICogICAgIHByaXYgZGF0YSkuIFlvdSBtdXN0IGhhdmUgY2FsbGVkIHdpbWF4X2Rldl9pbml0KCkgb24gaXQgYmVmb3JlLgorICoKKyAqIEBuZXRfZGV2OiBuZXQgZGV2aWNlIHRoZSBAd2ltYXhfZGV2IGlzIGFzc29jaWF0ZWQgd2l0aC4gVGhlCisgKiAgICAgZnVuY3Rpb24gZXhwZWN0cyBTRVRfTkVUREVWX0RFVigpIGFuZCByZWdpc3Rlcl9uZXRkZXYoKSB3ZXJlCisgKiAgICAgYWxyZWFkeSBjYWxsZWQgb24gaXQuCisgKgorICogUmVnaXN0ZXJzIHRoZSBuZXcgV2lNQVggZGV2aWNlLCBzZXRzIHVwIHRoZSB1c2VyLWtlcm5lbCBjb250cm9sCisgKiBpbnRlcmZhY2UgKGdlbmVyaWMgbmV0bGluaykgYW5kIGNvbW1vbiBXaU1BWCBpbmZyYXN0cnVjdHVyZS4KKyAqCisgKiBOb3RlIHRoYXQgdGhlIHBhcnRzIHRoYXQgd2lsbCBhbGxvdyBpbnRlcmFjdGlvbiB3aXRoIHVzZXIgc3BhY2UgYXJlCisgKiBzZXR1cCBhdCB0aGUgdmVyeSBlbmQsIHdoZW4gdGhlIHJlc3QgaXMgaW4gcGxhY2UsIGFzIG9uY2UgdGhhdAorICogaGFwcGVucywgdGhlIGRyaXZlciBtaWdodCBnZXQgdXNlciBzcGFjZSBjb250cm9sIHJlcXVlc3RzIHZpYQorICogbmV0bGluayBvciBmcm9tIGRlYnVnZnMgdGhhdCBtaWdodCB0cmFuc2xhdGUgaW50byBjYWxscyBpbnRvCisgKiB3aW1heF9kZXYtPm9wXyooKS4KKyAqLworaW50IHdpbWF4X2Rldl9hZGQoc3RydWN0IHdpbWF4X2RldiAqd2ltYXhfZGV2LCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldikKK3sKKwlpbnQgcmVzdWx0OworCXN0cnVjdCBkZXZpY2UgKmRldiA9IG5ldF9kZXYtPmRldi5wYXJlbnQ7CisJY2hhciBhZGRyX3N0clszMl07CisKKwlkX2Zuc3RhcnQoMywgZGV2LCAiKHdpbWF4X2RldiAlcCBuZXRfZGV2ICVwKVxuIiwgd2ltYXhfZGV2LCBuZXRfZGV2KTsKKworCS8qIERvIHRoZSBSRktJTEwgc2V0dXAgYmVmb3JlIGxvY2tpbmcsIGFzIFJGS0lMTCB3aWxsIGNhbGwKKwkgKiBpbnRvIG91ciBmdW5jdGlvbnMuICovCisJd2ltYXhfZGV2LT5uZXRfZGV2ID0gbmV0X2RldjsKKwlyZXN1bHQgPSB3aW1heF9yZmtpbGxfYWRkKHdpbWF4X2Rldik7CisJaWYgKHJlc3VsdCA8IDApCisJCWdvdG8gZXJyb3JfcmZraWxsX2FkZDsKKworCS8qIFNldCB1cCB1c2VyLXNwYWNlIGludGVyYWN0aW9uICovCisJbXV0ZXhfbG9jaygmd2ltYXhfZGV2LT5tdXRleCk7CisJd2ltYXhfaWRfdGFibGVfYWRkKHdpbWF4X2Rldik7CisJcmVzdWx0ID0gd2ltYXhfZGVidWdmc19hZGQod2ltYXhfZGV2KTsKKwlpZiAocmVzdWx0IDwgMCkgeworCQlkZXZfZXJyKGRldiwgImNhbm5vdCBpbml0aWFsaXplIGRlYnVnZnM6ICVkXG4iLAorCQkJcmVzdWx0KTsKKwkJZ290byBlcnJvcl9kZWJ1Z2ZzX2FkZDsKKwl9CisKKwlfX3dpbWF4X3N0YXRlX3NldCh3aW1heF9kZXYsIFdJTUFYX1NUX0RPV04pOworCW11dGV4X3VubG9jaygmd2ltYXhfZGV2LT5tdXRleCk7CisKKwl3aW1heF9hZGRyX3NjbnByaW50KGFkZHJfc3RyLCBzaXplb2YoYWRkcl9zdHIpLAorCQkJICAgIG5ldF9kZXYtPmRldl9hZGRyLCBuZXRfZGV2LT5hZGRyX2xlbik7CisJZGV2X2VycihkZXYsICJXaU1BWCBpbnRlcmZhY2UgJXMgKCVzKSByZWFkeVxuIiwKKwkJbmV0X2Rldi0+bmFtZSwgYWRkcl9zdHIpOworCWRfZm5lbmQoMywgZGV2LCAiKHdpbWF4X2RldiAlcCBuZXRfZGV2ICVwKSA9IDBcbiIsIHdpbWF4X2RldiwgbmV0X2Rldik7CisJcmV0dXJuIDA7CisKK2Vycm9yX2RlYnVnZnNfYWRkOgorCXdpbWF4X2lkX3RhYmxlX3JtKHdpbWF4X2Rldik7CisJbXV0ZXhfdW5sb2NrKCZ3aW1heF9kZXYtPm11dGV4KTsKKwl3aW1heF9yZmtpbGxfcm0od2ltYXhfZGV2KTsKK2Vycm9yX3Jma2lsbF9hZGQ6CisJZF9mbmVuZCgzLCBkZXYsICIod2ltYXhfZGV2ICVwIG5ldF9kZXYgJXApID0gJWRcbiIsCisJCXdpbWF4X2RldiwgbmV0X2RldiwgcmVzdWx0KTsKKwlyZXR1cm4gcmVzdWx0OworfQorRVhQT1JUX1NZTUJPTF9HUEwod2ltYXhfZGV2X2FkZCk7CisKKworLyoqCisgKiB3aW1heF9kZXZfcm0gLSBVbnJlZ2lzdGVyIGFuIGV4aXN0aW5nIFdpTUFYIGRldmljZQorICoKKyAqIEB3aW1heF9kZXY6IFdpTUFYIGRldmljZSBkZXNjcmlwdG9yCisgKgorICogVW5yZWdpc3RlcnMgYSBXaU1BWCBkZXZpY2UgcHJldmlvdXNseSByZWdpc3RlcmVkIGZvciB1c2Ugd2l0aAorICogd2ltYXhfYWRkX3JtKCkuCisgKgorICogSU1QT1JUQU5UISBNdXN0IGNhbGwgYmVmb3JlIGNhbGxpbmcgdW5yZWdpc3Rlcl9uZXRkZXYoKS4KKyAqCisgKiBBZnRlciB0aGlzIGZ1bmN0aW9uIHJldHVybnMsIHlvdSB3aWxsIG5vdCBnZXQgYW55IG1vcmUgdXNlciBzcGFjZQorICogY29udHJvbCByZXF1ZXN0cyAodmlhIG5ldGxpbmsgb3IgZGVidWdmcykgYW5kIHRodXMgdG8gd2ltYXhfZGV2LT5vcHMuCisgKgorICogUmVlbnRyYW5jeSBjb250cm9sIGlzIGVuc3VyZWQgYnkgc2V0dGluZyB0aGUgc3RhdGUgdG8KKyAqICVfX1dJTUFYX1NUX1FVSUVTQ0lORy4gcmZraWxsIG9wZXJhdGlvbnMgY29taW5nIHRocm91Z2gKKyAqIHdpbWF4XypyZmtpbGwqKCkgd2lsbCBiZSBzdG9wcGVkIGJ5IHRoZSBxdWllc2Npbmcgc3RhdGU7IG9wcyBjb21pbmcKKyAqIGZyb20gdGhlIHJma2lsbCBzdWJzeXN0ZW0gd2lsbCBiZSBzdG9wcGVkIGJ5IHRoZSBzdXBwb3J0IGJlaW5nCisgKiByZW1vdmVkIGJ5IHdpbWF4X3Jma2lsbF9ybSgpLgorICovCit2b2lkIHdpbWF4X2Rldl9ybShzdHJ1Y3Qgd2ltYXhfZGV2ICp3aW1heF9kZXYpCit7CisJZF9mbnN0YXJ0KDMsIE5VTEwsICIod2ltYXhfZGV2ICVwKVxuIiwgd2ltYXhfZGV2KTsKKworCW11dGV4X2xvY2soJndpbWF4X2Rldi0+bXV0ZXgpOworCV9fd2ltYXhfc3RhdGVfY2hhbmdlKHdpbWF4X2RldiwgX19XSU1BWF9TVF9RVUlFU0NJTkcpOworCXdpbWF4X2RlYnVnZnNfcm0od2ltYXhfZGV2KTsKKwl3aW1heF9pZF90YWJsZV9ybSh3aW1heF9kZXYpOworCV9fd2ltYXhfc3RhdGVfY2hhbmdlKHdpbWF4X2RldiwgV0lNQVhfU1RfRE9XTik7CisJbXV0ZXhfdW5sb2NrKCZ3aW1heF9kZXYtPm11dGV4KTsKKwl3aW1heF9yZmtpbGxfcm0od2ltYXhfZGV2KTsKKwlkX2ZuZW5kKDMsIE5VTEwsICIod2ltYXhfZGV2ICVwKSA9IHZvaWRcbiIsIHdpbWF4X2Rldik7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh3aW1heF9kZXZfcm0pOworCitzdHJ1Y3QgZ2VubF9mYW1pbHkgd2ltYXhfZ25sX2ZhbWlseSA9IHsKKwkuaWQgPSBHRU5MX0lEX0dFTkVSQVRFLAorCS5uYW1lID0gIldpTUFYIiwKKwkudmVyc2lvbiA9IFdJTUFYX0dOTF9WRVJTSU9OLAorCS5oZHJzaXplID0gMCwKKwkubWF4YXR0ciA9IFdJTUFYX0dOTF9BVFRSX01BWCwKK307CisKK3N0cnVjdCBnZW5sX211bHRpY2FzdF9ncm91cCB3aW1heF9nbmxfbWNnID0geworCS5uYW1lID0gIm1zZyIsCit9OworCisKKworLyogU2h1dGRvd24gdGhlIHdpbWF4IHN0YWNrICovCitzdGF0aWMKK2ludCBfX2luaXQgd2ltYXhfc3Vic3lzX2luaXQodm9pZCkKK3sKKwlpbnQgcmVzdWx0LCBjbnQ7CisKKwlkX2Zuc3RhcnQoNCwgTlVMTCwgIigpXG4iKTsKKwlzbnByaW50Zih3aW1heF9nbmxfZmFtaWx5Lm5hbWUsIHNpemVvZih3aW1heF9nbmxfZmFtaWx5Lm5hbWUpLAorCQkgIldpTUFYIik7CisJcmVzdWx0ID0gZ2VubF9yZWdpc3Rlcl9mYW1pbHkoJndpbWF4X2dubF9mYW1pbHkpOworCWlmICh1bmxpa2VseShyZXN1bHQgPCAwKSkgeworCQlwcmludGsoS0VSTl9FUlIgImNhbm5vdCByZWdpc3RlciBnZW5lcmljIG5ldGxpbmsgZmFtaWx5OiAlZFxuIiwKKwkJICAgICAgIHJlc3VsdCk7CisJCWdvdG8gZXJyb3JfcmVnaXN0ZXJfZmFtaWx5OworCX0KKworCWZvciAoY250ID0gMDsgY250IDwgQVJSQVlfU0laRSh3aW1heF9nbmxfb3BzKTsgY250KyspIHsKKwkJcmVzdWx0ID0gZ2VubF9yZWdpc3Rlcl9vcHMoJndpbWF4X2dubF9mYW1pbHksCisJCQkJCSAgIHdpbWF4X2dubF9vcHNbY250XSk7CisJCWRfcHJpbnRmKDQsIE5VTEwsICJyZWdpc3RlcmluZyBnZW5lcmljIG5ldGxpbmsgb3AgY29kZSAiCisJCQkgIiV1OiAlZFxuIiwgd2ltYXhfZ25sX29wc1tjbnRdLT5jbWQsIHJlc3VsdCk7CisJCWlmICh1bmxpa2VseShyZXN1bHQgPCAwKSkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJjYW5ub3QgcmVnaXN0ZXIgZ2VuZXJpYyBuZXRsaW5rIG9wICIKKwkJCSAgICAgICAiY29kZSAldTogJWRcbiIsCisJCQkgICAgICAgd2ltYXhfZ25sX29wc1tjbnRdLT5jbWQsIHJlc3VsdCk7CisJCQlnb3RvIGVycm9yX3JlZ2lzdGVyX29wczsKKwkJfQorCX0KKworCXJlc3VsdCA9IGdlbmxfcmVnaXN0ZXJfbWNfZ3JvdXAoJndpbWF4X2dubF9mYW1pbHksICZ3aW1heF9nbmxfbWNnKTsKKwlpZiAocmVzdWx0IDwgMCkKKwkJZ290byBlcnJvcl9tY19ncm91cDsKKwlkX2ZuZW5kKDQsIE5VTEwsICIoKSA9IDBcbiIpOworCXJldHVybiAwOworCitlcnJvcl9tY19ncm91cDoKK2Vycm9yX3JlZ2lzdGVyX29wczoKKwlmb3IgKGNudC0tOyBjbnQgPj0gMDsgY250LS0pCisJCWdlbmxfdW5yZWdpc3Rlcl9vcHMoJndpbWF4X2dubF9mYW1pbHksCisJCQkJICAgIHdpbWF4X2dubF9vcHNbY250XSk7CisJZ2VubF91bnJlZ2lzdGVyX2ZhbWlseSgmd2ltYXhfZ25sX2ZhbWlseSk7CitlcnJvcl9yZWdpc3Rlcl9mYW1pbHk6CisJZF9mbmVuZCg0LCBOVUxMLCAiKCkgPSAlZFxuIiwgcmVzdWx0KTsKKwlyZXR1cm4gcmVzdWx0OworCit9Cittb2R1bGVfaW5pdCh3aW1heF9zdWJzeXNfaW5pdCk7CisKKworLyogU2h1dGRvd24gdGhlIHdpbWF4IHN0YWNrICovCitzdGF0aWMKK3ZvaWQgX19leGl0IHdpbWF4X3N1YnN5c19leGl0KHZvaWQpCit7CisJaW50IGNudDsKKwl3aW1heF9pZF90YWJsZV9yZWxlYXNlKCk7CisJZ2VubF91bnJlZ2lzdGVyX21jX2dyb3VwKCZ3aW1heF9nbmxfZmFtaWx5LCAmd2ltYXhfZ25sX21jZyk7CisJZm9yIChjbnQgPSBBUlJBWV9TSVpFKHdpbWF4X2dubF9vcHMpIC0gMTsgY250ID49IDA7IGNudC0tKQorCQlnZW5sX3VucmVnaXN0ZXJfb3BzKCZ3aW1heF9nbmxfZmFtaWx5LAorCQkJCSAgICB3aW1heF9nbmxfb3BzW2NudF0pOworCWdlbmxfdW5yZWdpc3Rlcl9mYW1pbHkoJndpbWF4X2dubF9mYW1pbHkpOworfQorbW9kdWxlX2V4aXQod2ltYXhfc3Vic3lzX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJJbnRlbCBDb3Jwb3JhdGlvbiA8bGludXgtd2ltYXhAaW50ZWwuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJMaW51eCBXaU1BWCBzdGFjayIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCmRpZmYgLS1naXQgYS9uZXQvd2ltYXgvd2ltYXgtaW50ZXJuYWwuaCBiL25ldC93aW1heC93aW1heC1pbnRlcm5hbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlNzQzZDIKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvd2ltYXgvd2ltYXgtaW50ZXJuYWwuaApAQCAtMCwwICsxLDkxIEBACisvKgorICogTGludXggV2lNQVgKKyAqIEludGVybmFsIEFQSSBmb3Iga2VybmVsIHNwYWNlIFdpTUFYIHN0YWNrCisgKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBJbnRlbCBDb3Jwb3JhdGlvbiA8bGludXgtd2ltYXhAaW50ZWwuY29tPgorICogSW5ha3kgUGVyZXotR29uemFsZXogPGluYWt5LnBlcmV6LWdvbnphbGV6QGludGVsLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxLCBVU0EuCisgKgorICoKKyAqIFRoaXMgaGVhZGVyIGZpbGUgaXMgZm9yIGRlY2xhcmF0aW9ucyBhbmQgZGVmaW5pdGlvbnMgaW50ZXJuYWwgdG8KKyAqIHRoZSBXaU1BWCBzdGFjay4gRm9yIHB1YmxpYyBBUElzIGFuZCBkb2N1bWVudGF0aW9uLCBzZWUKKyAqIGluY2x1ZGUvbmV0L3dpbWF4LmggYW5kIGluY2x1ZGUvbGludXgvd2ltYXguaC4KKyAqLworCisjaWZuZGVmIF9fV0lNQVhfSU5URVJOQUxfSF9fCisjZGVmaW5lIF9fV0lNQVhfSU5URVJOQUxfSF9fCisjaWZkZWYgX19LRVJORUxfXworCisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bmV0L3dpbWF4Lmg+CisKKworLyoKKyAqIERlY2lkZSBpZiBhIChsb2NrZWQpIGRldmljZSBpcyByZWFkeSBmb3IgdXNlCisgKgorICogQmVmb3JlIHVzaW5nIHRoZSBkZXZpY2Ugc3RydWN0dXJlLCBpdCBtdXN0IGJlIGxvY2tlZAorICogKHdpbWF4X2Rldi0+bXV0ZXgpLiBBcyB3ZWxsLCBtb3N0IG9wZXJhdGlvbnMgbmVlZCB0byBjYWxsIHRoaXMKKyAqIGZ1bmN0aW9uIHRvIGNoZWNrIGlmIHRoZSBzdGF0ZSBpcyB0aGUgcmlnaHQgb25lLgorICoKKyAqIEFuIGVycm9yIHZhbHVlIHdpbGwgYmUgcmV0dXJuZWQgaWYgdGhlIHN0YXRlIGlzIG5vdCB0aGUgcmlnaHQKKyAqIG9uZS4gSW4gdGhhdCBjYXNlLCB0aGUgY2FsbGVyIHNob3VsZCBub3QgYXR0ZW1wdCB0byB1c2UgdGhlIGRldmljZQorICogYW5kIGp1c3QgdW5sb2NrIGl0LgorICovCitzdGF0aWMgaW5saW5lIF9fbXVzdF9jaGVjaworaW50IHdpbWF4X2Rldl9pc19yZWFkeShzdHJ1Y3Qgd2ltYXhfZGV2ICp3aW1heF9kZXYpCit7CisJaWYgKHdpbWF4X2Rldi0+c3RhdGUgPT0gX19XSU1BWF9TVF9OVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsJLyogRGV2aWNlIGlzIG5vdCBldmVuIHJlZ2lzdGVyZWQhICovCisJaWYgKHdpbWF4X2Rldi0+c3RhdGUgPT0gV0lNQVhfU1RfRE9XTikKKwkJcmV0dXJuIC1FTk9NRURJVU07CisJaWYgKHdpbWF4X2Rldi0+c3RhdGUgPT0gX19XSU1BWF9TVF9RVUlFU0NJTkcpCisJCXJldHVybiAtRVNIVVRET1dOOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbmxpbmUKK3ZvaWQgX193aW1heF9zdGF0ZV9zZXQoc3RydWN0IHdpbWF4X2RldiAqd2ltYXhfZGV2LCBlbnVtIHdpbWF4X3N0IHN0YXRlKQoreworCXdpbWF4X2Rldi0+c3RhdGUgPSBzdGF0ZTsKK30KK2V4dGVybiB2b2lkIF9fd2ltYXhfc3RhdGVfY2hhbmdlKHN0cnVjdCB3aW1heF9kZXYgKiwgZW51bSB3aW1heF9zdCk7CisKKyNpZmRlZiBDT05GSUdfREVCVUdfRlMKK2V4dGVybiBpbnQgd2ltYXhfZGVidWdmc19hZGQoc3RydWN0IHdpbWF4X2RldiAqKTsKK2V4dGVybiB2b2lkIHdpbWF4X2RlYnVnZnNfcm0oc3RydWN0IHdpbWF4X2RldiAqKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIGludCB3aW1heF9kZWJ1Z2ZzX2FkZChzdHJ1Y3Qgd2ltYXhfZGV2ICp3aW1heF9kZXYpCit7CisJcmV0dXJuIDA7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgd2ltYXhfZGVidWdmc19ybShzdHJ1Y3Qgd2ltYXhfZGV2ICp3aW1heF9kZXYpIHt9CisjZW5kaWYKKworZXh0ZXJuIHZvaWQgd2ltYXhfaWRfdGFibGVfYWRkKHN0cnVjdCB3aW1heF9kZXYgKik7CitleHRlcm4gc3RydWN0IHdpbWF4X2RldiAqd2ltYXhfZGV2X2dldF9ieV9nZW5sX2luZm8oc3RydWN0IGdlbmxfaW5mbyAqLCBpbnQpOworZXh0ZXJuIHZvaWQgd2ltYXhfaWRfdGFibGVfcm0oc3RydWN0IHdpbWF4X2RldiAqKTsKK2V4dGVybiB2b2lkIHdpbWF4X2lkX3RhYmxlX3JlbGVhc2Uodm9pZCk7CisKK2V4dGVybiBpbnQgd2ltYXhfcmZraWxsX2FkZChzdHJ1Y3Qgd2ltYXhfZGV2ICopOworZXh0ZXJuIHZvaWQgd2ltYXhfcmZraWxsX3JtKHN0cnVjdCB3aW1heF9kZXYgKik7CisKK2V4dGVybiBzdHJ1Y3QgZ2VubF9mYW1pbHkgd2ltYXhfZ25sX2ZhbWlseTsKK2V4dGVybiBzdHJ1Y3QgZ2VubF9tdWx0aWNhc3RfZ3JvdXAgd2ltYXhfZ25sX21jZzsKKworI2VuZGlmIC8qICNpZmRlZiBfX0tFUk5FTF9fICovCisjZW5kaWYgLyogI2lmbmRlZiBfX1dJTUFYX0lOVEVSTkFMX0hfXyAqLwpkaWZmIC0tZ2l0IGEvbmV0L3dpcmVsZXNzL3dleHQuYyBiL25ldC93aXJlbGVzcy93ZXh0LmMKaW5kZXggZTQ5YTJkMS4uY2I2YTViYiAxMDA2NDQKLS0tIGEvbmV0L3dpcmVsZXNzL3dleHQuYworKysgYi9uZXQvd2lyZWxlc3Mvd2V4dC5jCkBAIC0xMDU1LDggKzEwNTUsOCBAQAogCQkJcmV0dXJuIHByaXZhdGUoZGV2LCBpd3IsIGNtZCwgaW5mbywgaGFuZGxlcik7CiAJfQogCS8qIE9sZCBkcml2ZXIgQVBJIDogY2FsbCBkcml2ZXIgaW9jdGwgaGFuZGxlciAqLwotCWlmIChkZXYtPmRvX2lvY3RsKQotCQlyZXR1cm4gZGV2LT5kb19pb2N0bChkZXYsIGlmciwgY21kKTsKKwlpZiAoZGV2LT5uZXRkZXZfb3BzLT5uZG9fZG9faW9jdGwpCisJCXJldHVybiBkZXYtPm5ldGRldl9vcHMtPm5kb19kb19pb2N0bChkZXYsIGlmciwgY21kKTsKIAlyZXR1cm4gLUVPUE5PVFNVUFA7CiB9CiAKZGlmZiAtLWdpdCBhL25ldC94ZnJtL3hmcm1faXBjb21wLmMgYi9uZXQveGZybS94ZnJtX2lwY29tcC5jCmluZGV4IGM2MDlhNGIuLjQyY2QxODMgMTAwNjQ0Ci0tLSBhL25ldC94ZnJtL3hmcm1faXBjb21wLmMKKysrIGIvbmV0L3hmcm0veGZybV9pcGNvbXAuYwpAQCAtNjMsNyArNjMsNiBAQAogCWlmIChsZW4gPiBza2JfdGFpbHJvb20oc2tiKSkKIAkJbGVuID0gc2tiX3RhaWxyb29tKHNrYik7CiAKLQlza2ItPnRydWVzaXplICs9IGxlbjsKIAlfX3NrYl9wdXQoc2tiLCBsZW4pOwogCiAJbGVuICs9IHBsZW47CmRpZmYgLS1naXQgYS9uZXQveGZybS94ZnJtX3VzZXIuYyBiL25ldC94ZnJtL3hmcm1fdXNlci5jCmluZGV4IGI5NWEyZDYuLjc4NzdlNzkgMTAwNjQ0Ci0tLSBhL25ldC94ZnJtL3hmcm1fdXNlci5jCisrKyBiL25ldC94ZnJtL3hmcm1fdXNlci5jCkBAIC0xOTE0LDEwICsxOTE0LDE3IEBACiB9CiAjZW5kaWYKIAorLyogRm9yIHRoZSB4ZnJtX3VzZXJzYV9pbmZvIGNhc2VzIHdlIGhhdmUgdG8gd29yayBhcm91bmQgc29tZSAzMi1iaXQgdnMuCisgKiA2NC1iaXQgY29tcGF0YWJpbGl0eSBpc3N1ZXMuICBPbiAzMi1iaXQgdGhlIHN0cnVjdHVyZSBpcyAyMjAgYnl0ZXMsIGJ1dAorICogZm9yIDY0LWJpdCBpdCBnZXRzIHBhZGRlZCBvdXQgdG8gMjI0IGJ5dGVzLiAgVGhvc2UgYnl0ZXMgYXJlIGp1c3QKKyAqIHBhZGRpbmcgYW5kIGRvbid0IGhhdmUgYW55IGNvbnRlbnQgd2UgY2FyZSBhYm91dC4gIFRoZXJlZm9yZSBhcyBsb25nCisgKiBhcyB3ZSBoYXZlIGVub3VnaCBieXRlcyBmb3IgdGhlIGNvbnRlbnQgd2UgY2FuIG1ha2UgYm90aCBjYXNlcyB3b3JrLgorICovCisKICNkZWZpbmUgWE1TR1NJWkUodHlwZSkgc2l6ZW9mKHN0cnVjdCB0eXBlKQogCiBzdGF0aWMgY29uc3QgaW50IHhmcm1fbXNnX21pbltYRlJNX05SX01TR1RZUEVTXSA9IHsKLQlbWEZSTV9NU0dfTkVXU0EgICAgICAgLSBYRlJNX01TR19CQVNFXSA9IFhNU0dTSVpFKHhmcm1fdXNlcnNhX2luZm8pLAorCVtYRlJNX01TR19ORVdTQSAgICAgICAtIFhGUk1fTVNHX0JBU0VdID0gMjIwLCAvKiBzZWUgYWJvdmUgKi8KIAlbWEZSTV9NU0dfREVMU0EgICAgICAgLSBYRlJNX01TR19CQVNFXSA9IFhNU0dTSVpFKHhmcm1fdXNlcnNhX2lkKSwKIAlbWEZSTV9NU0dfR0VUU0EgICAgICAgLSBYRlJNX01TR19CQVNFXSA9IFhNU0dTSVpFKHhmcm1fdXNlcnNhX2lkKSwKIAlbWEZSTV9NU0dfTkVXUE9MSUNZICAgLSBYRlJNX01TR19CQVNFXSA9IFhNU0dTSVpFKHhmcm1fdXNlcnBvbGljeV9pbmZvKSwKQEAgLTE5MjcsNyArMTkzNCw3IEBACiAJW1hGUk1fTVNHX0FDUVVJUkUgICAgIC0gWEZSTV9NU0dfQkFTRV0gPSBYTVNHU0laRSh4ZnJtX3VzZXJfYWNxdWlyZSksCiAJW1hGUk1fTVNHX0VYUElSRSAgICAgIC0gWEZSTV9NU0dfQkFTRV0gPSBYTVNHU0laRSh4ZnJtX3VzZXJfZXhwaXJlKSwKIAlbWEZSTV9NU0dfVVBEUE9MSUNZICAgLSBYRlJNX01TR19CQVNFXSA9IFhNU0dTSVpFKHhmcm1fdXNlcnBvbGljeV9pbmZvKSwKLQlbWEZSTV9NU0dfVVBEU0EgICAgICAgLSBYRlJNX01TR19CQVNFXSA9IFhNU0dTSVpFKHhmcm1fdXNlcnNhX2luZm8pLAorCVtYRlJNX01TR19VUERTQSAgICAgICAtIFhGUk1fTVNHX0JBU0VdID0gMjIwLCAvKiBzZWUgYWJvdmUgKi8KIAlbWEZSTV9NU0dfUE9MRVhQSVJFICAgLSBYRlJNX01TR19CQVNFXSA9IFhNU0dTSVpFKHhmcm1fdXNlcl9wb2xleHBpcmUpLAogCVtYRlJNX01TR19GTFVTSFNBICAgICAtIFhGUk1fTVNHX0JBU0VdID0gWE1TR1NJWkUoeGZybV91c2Vyc2FfZmx1c2gpLAogCVtYRlJNX01TR19GTFVTSFBPTElDWSAtIFhGUk1fTVNHX0JBU0VdID0gMCwKZGlmZiAtLWdpdCBhL3NjcmlwdHMvLmdpdGlnbm9yZSBiL3NjcmlwdHMvLmdpdGlnbm9yZQppbmRleCBiOTM5ZmJkLi4wOWUyNDA2IDEwMDY0NAotLS0gYS9zY3JpcHRzLy5naXRpZ25vcmUKKysrIGIvc2NyaXB0cy8uZ2l0aWdub3JlCkBAIC0xLDYgKzEsNyBAQAogIwogIyBHZW5lcmF0ZWQgZmlsZXMKICMKK2loZXgyZncKIGNvbm1ha2VoYXNoCiBrYWxsc3ltcwogcG5tdG9sb2dvCmRpZmYgLS1naXQgYS9zY3JpcHRzL01ha2VmaWxlIGIvc2NyaXB0cy9NYWtlZmlsZQppbmRleCBhYWZkZjA2Li4wMzUxODJlIDEwMDY0NAotLS0gYS9zY3JpcHRzL01ha2VmaWxlCisrKyBiL3NjcmlwdHMvTWFrZWZpbGUKQEAgLTIsMTEgKzIsMTIgQEAKICMgc2NyaXB0cyBjb250YWlucyBzb3VyY2VzIGZvciB2YXJpb3VzIGhlbHBlciBwcm9ncmFtcyB1c2VkIHRocm91Z2hvdXQKICMgdGhlIGtlcm5lbCBmb3IgdGhlIGJ1aWxkIHByb2Nlc3MuCiAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBpaGV4MmZ3OiAgICAgICBQYXJzZXIvbG9hZGVyIGZvciBJSEVYIGZvcm1hdHRlZCBkYXRhCiAjIGthbGxzeW1zOiAgICAgIEZpbmQgYWxsIHN5bWJvbHMgaW4gdm1saW51eAogIyBwbm10dG9sb2dvOiAgICBDb252ZXJ0IHBubSBmaWxlcyB0byBsb2dvIGZpbGVzCi0jIGNvbm1ha2VoYXNoOiAgIENyZWF0ZSBjaGFydGFibGUKICMgY29ubWFrZWhhc2g6CSBDcmVhdGUgYXJyYXlzIGZvciBpbml0aWFsaXppbmcgdGhlIGtlcm5lbCBjb25zb2xlIHRhYmxlcwogCitob3N0cHJvZ3MteSAgICAgICAgICAgICAgICAgICAgICA6PSBpaGV4MmZ3CiBob3N0cHJvZ3MtJChDT05GSUdfS0FMTFNZTVMpICAgICArPSBrYWxsc3ltcwogaG9zdHByb2dzLSQoQ09ORklHX0xPR08pICAgICAgICAgKz0gcG5tdG9sb2dvCiBob3N0cHJvZ3MtJChDT05GSUdfVlQpICAgICAgICAgICArPSBjb25tYWtlaGFzaApkaWZmIC0tZ2l0IGEvc2NyaXB0cy9ib290Z3JhcGgucGwgYi9zY3JpcHRzL2Jvb3RncmFwaC5wbAppbmRleCBmMGFmOWFhLi5iMDI0NjMwIDEwMDY0NAotLS0gYS9zY3JpcHRzL2Jvb3RncmFwaC5wbAorKysgYi9zY3JpcHRzL2Jvb3RncmFwaC5wbApAQCAtNDEsMTEgKzQxLDEzIEBACiAKIG15ICVzdGFydDsKIG15ICVlbmQ7CitteSAldHlwZTsKIG15ICRkb25lID0gMDsKIG15ICRtYXh0aW1lID0gMDsKIG15ICRmaXJzdHRpbWUgPSAxMDA7CiBteSAkY291bnQgPSAwOwogbXkgJXBpZHM7CitteSAlcGlkY3RyOwogCiB3aGlsZSAoPD4pIHsKIAlteSAkbGluZSA9ICRfOwpAQCAtNTMsNiArNTUsNyBAQAogCQlteSAkZnVuYyA9ICQyOwogCQlpZiAoJGRvbmUgPT0gMCkgewogCQkJJHN0YXJ0eyRmdW5jfSA9ICQxOworCQkJJHR5cGV7JGZ1bmN9ID0gMDsKIAkJCWlmICgkMSA8ICRmaXJzdHRpbWUpIHsKIAkJCQkkZmlyc3R0aW1lID0gJDE7CiAJCQl9CkBAIC02MywxMiArNjYsNDAgQEAKIAkJJGNvdW50ID0gJGNvdW50ICsgMTsKIAl9CiAKKwlpZiAoJGxpbmUgPX4gLyhbMC05XC5dKylcXSBhc3luY193YWl0aW5nIEAgKFswLTldKykvKSB7CisJCW15ICRwaWQgPSAkMjsKKwkJbXkgJGZ1bmM7CisJCWlmICghZGVmaW5lZCgkcGlkY3RyeyRwaWR9KSkgeworCQkJJGZ1bmMgPSAid2FpdF8iIC4gJHBpZCAuICJfMSI7CisJCQkkcGlkY3RyeyRwaWR9ID0gMTsKKwkJfSBlbHNlIHsKKwkJCSRwaWRjdHJ7JHBpZH0gPSAkcGlkY3RyeyRwaWR9ICsgMTsKKwkJCSRmdW5jID0gIndhaXRfIiAuICRwaWQgLiAiXyIgLiAkcGlkY3RyeyRwaWR9OworCQl9CisJCWlmICgkZG9uZSA9PSAwKSB7CisJCQkkc3RhcnR7JGZ1bmN9ID0gJDE7CisJCQkkdHlwZXskZnVuY30gPSAxOworCQkJaWYgKCQxIDwgJGZpcnN0dGltZSkgeworCQkJCSRmaXJzdHRpbWUgPSAkMTsKKwkJCX0KKwkJfQorCQkkcGlkc3skZnVuY30gPSAkcGlkOworCQkkY291bnQgPSAkY291bnQgKyAxOworCX0KKwogCWlmICgkbGluZSA9fiAvKFswLTlcLl0rKVxdIGluaXRjYWxsIChbYS16QS1aMC05XF9dKylcKy4qcmV0dXJuZWQvKSB7CiAJCWlmICgkZG9uZSA9PSAwKSB7CiAJCQkkZW5keyQyfSA9ICQxOwogCQkJJG1heHRpbWUgPSAkMTsKIAkJfQogCX0KKworCWlmICgkbGluZSA9fiAvKFswLTlcLl0rKVxdIGFzeW5jX2NvbnRpbnVpbmcgQCAoWzAtOV0rKS8pIHsKKwkJbXkgJHBpZCA9ICQyOworCQlteSAkZnVuYyA9ICAid2FpdF8iIC4gJHBpZCAuICJfIiAuICRwaWRjdHJ7JHBpZH07CisJCSRlbmR7JGZ1bmN9ID0gJDE7CisJCSRtYXh0aW1lID0gJDE7CisJfQogCWlmICgkbGluZSA9fiAvV3JpdGUgcHJvdGVjdGluZyB0aGUvKSB7CiAJCSRkb25lID0gMTsKIAl9CkBAIC04OCw3ICsxMTksNyBAQAogfQogCiBwcmludCAiPD94bWwgdmVyc2lvbj1cIjEuMFwiIHN0YW5kYWxvbmU9XCJub1wiPz4gXG4iOwotcHJpbnQgIjxzdmcgd2lkdGg9XCIxMDAwXCIgaGVpZ2h0PVwiMTAwJVwiIHZlcnNpb249XCIxLjFcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4iOworcHJpbnQgIjxzdmcgd2lkdGg9XCIyMDAwXCIgaGVpZ2h0PVwiMTAwJVwiIHZlcnNpb249XCIxLjFcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4iOwogCiBteSBAc3R5bGVzOwogCkBAIC0xMDUsOCArMTM2LDExIEBACiAkc3R5bGVzWzEwXSA9ICJmaWxsOnJnYigyNTUsMTI4LDI1NSk7ZmlsbC1vcGFjaXR5OjAuNTtzdHJva2Utd2lkdGg6MTtzdHJva2U6cmdiKDAsMCwwKSI7CiAkc3R5bGVzWzExXSA9ICJmaWxsOnJnYigxMjgsMjU1LDI1NSk7ZmlsbC1vcGFjaXR5OjAuNTtzdHJva2Utd2lkdGg6MTtzdHJva2U6cmdiKDAsMCwwKSI7CiAKLW15ICRtdWx0ID0gOTUwLjAgLyAoJG1heHRpbWUgLSAkZmlyc3R0aW1lKTsKLW15ICR0aHJlc2hvbGQgPSAoJG1heHRpbWUgLSAkZmlyc3R0aW1lKSAvIDYwLjA7CitteSAkc3R5bGVfd2FpdCA9ICJmaWxsOnJnYigxMjgsMTI4LDEyOCk7ZmlsbC1vcGFjaXR5OjAuNTtzdHJva2Utd2lkdGg6MDtzdHJva2U6cmdiKDAsMCwwKSI7CisKK215ICRtdWx0ID0gMTk1MC4wIC8gKCRtYXh0aW1lIC0gJGZpcnN0dGltZSk7CitteSAkdGhyZXNob2xkMiA9ICgkbWF4dGltZSAtICRmaXJzdHRpbWUpIC8gMTIwLjA7CitteSAkdGhyZXNob2xkID0gJHRocmVzaG9sZDIvMTA7CiBteSAkc3R5bGVjb3VudGVyID0gMDsKIG15ICVyb3dzOwogbXkgJHJvd3Njb3VudCA9IDE7CkBAIC0xMTYsNyArMTUwLDcgQEAKIAlteSAkZHVyYXRpb24gPSAkZW5keyRrZXl9IC0gJHN0YXJ0eyRrZXl9OwogCiAJaWYgKCRkdXJhdGlvbiA+PSAkdGhyZXNob2xkKSB7Ci0JCW15ICgkcywgJHMyLCAkZSwgJHcsICR5LCAkeTIsICRzdHlsZSk7CisJCW15ICgkcywgJHMyLCAkczMsICRlLCAkdywgJHksICR5MiwgJHN0eWxlKTsKIAkJbXkgJHBpZCA9ICRwaWRzeyRrZXl9OwogCiAJCWlmICghZGVmaW5lZCgkcm93c3skcGlkfSkpIHsKQEAgLTEyNSw2ICsxNTksNyBAQAogCQl9CiAJCSRzID0gKCRzdGFydHska2V5fSAtICRmaXJzdHRpbWUpICogJG11bHQ7CiAJCSRzMiA9ICRzICsgNjsKKwkJJHMzID0gJHMgKyAxOwogCQkkZSA9ICgkZW5keyRrZXl9IC0gJGZpcnN0dGltZSkgKiAkbXVsdDsKIAkJJHcgPSAkZSAtICRzOwogCkBAIC0xMzcsOCArMTcyLDE3IEBACiAJCQkkc3R5bGVjb3VudGVyID0gMDsKIAkJfTsKIAotCQlwcmludCAiPHJlY3QgeD1cIiRzXCIgd2lkdGg9XCIkd1wiIHk9XCIkeVwiIGhlaWdodD1cIjE0NVwiIHN0eWxlPVwiJHN0eWxlXCIvPlxuIjsKLQkJcHJpbnQgIjx0ZXh0IHRyYW5zZm9ybT1cInRyYW5zbGF0ZSgkczIsJHkyKSByb3RhdGUoOTApXCI+JGtleTwvdGV4dD5cbiI7CisJCWlmICgkdHlwZXska2V5fSA9PSAxKSB7CisJCQkkeSA9ICR5ICsgMTU7CisJCQlwcmludCAiPHJlY3QgeD1cIiRzXCIgd2lkdGg9XCIkd1wiIHk9XCIkeVwiIGhlaWdodD1cIjExNVwiIHN0eWxlPVwiJHN0eWxlX3dhaXRcIi8+XG4iOworCQl9IGVsc2UgeworCQkJcHJpbnQgIjxyZWN0IHg9XCIkc1wiIHdpZHRoPVwiJHdcIiB5PVwiJHlcIiBoZWlnaHQ9XCIxNDVcIiBzdHlsZT1cIiRzdHlsZVwiLz5cbiI7CisJCQlpZiAoJGR1cmF0aW9uID49ICR0aHJlc2hvbGQyKSB7CisJCQkJcHJpbnQgIjx0ZXh0IHRyYW5zZm9ybT1cInRyYW5zbGF0ZSgkczIsJHkyKSByb3RhdGUoOTApXCI+JGtleTwvdGV4dD5cbiI7CisJCQl9IGVsc2UgeworCQkJCXByaW50ICI8dGV4dCB0cmFuc2Zvcm09XCJ0cmFuc2xhdGUoJHMzLCR5Mikgcm90YXRlKDkwKVwiIGZvbnQtc2l6ZT1cIjNwdFwiPiRrZXk8L3RleHQ+XG4iOworCQkJfQorCQl9CiAJfQogfQogCmRpZmYgLS1naXQgYS9zY3JpcHRzL2NoZWNrcGF0Y2gucGwgYi9zY3JpcHRzL2NoZWNrcGF0Y2gucGwKaW5kZXggN2JlZDRlZC4uNDVlYjBhZSAxMDA3NTUKLS0tIGEvc2NyaXB0cy9jaGVja3BhdGNoLnBsCisrKyBiL3NjcmlwdHMvY2hlY2twYXRjaC5wbApAQCAtMTAsNyArMTAsNyBAQAogbXkgJFAgPSAkMDsKICRQID1+IHNALiovQEBnOwogCi1teSAkViA9ICcwLjI2JzsKK215ICRWID0gJzAuMjcnOwogCiB1c2UgR2V0b3B0OjpMb25nIHF3KDpjb25maWcgbm9fYXV0b19hYmJyZXYpOwogCkBAIC00MTEsMTMgKzQxMSwxNSBAQAogCiAJbXkgJHR5cGUgPSAnJzsKIAlteSAkbGV2ZWwgPSAwOwotCW15IEBzdGFjayA9IChbJHR5cGUsICRsZXZlbF0pOworCW15IEBzdGFjayA9ICgpOwogCW15ICRwOwogCW15ICRjOwogCW15ICRsZW4gPSAwOwogCiAJbXkgJHJlbWFpbmRlcjsKIAl3aGlsZSAoMSkgeworCQlAc3RhY2sgPSAoWycnLCAwXSkgaWYgKCQjc3RhY2sgPT0gLTEpOworCiAJCSN3YXJuICJDU0I6IGJsazwkYmxrPiByZW1haW48JHJlbWFpbj5cbiI7CiAJCSMgSWYgd2UgYXJlIGFib3V0IHRvIGRyb3Agb2ZmIHRoZSBlbmQsIHB1bGwgaW4gbW9yZQogCQkjIGNvbnRleHQuCkBAIC0xNjYzLDcgKzE2NjUsNyBAQAogCQkJIyBTaG91bGQgbm90IGVuZCB3aXRoIGEgc3BhY2UuCiAJCQkkdG8gPX4gcy9ccyskLy87CiAJCQkjICcqJ3Mgc2hvdWxkIG5vdCBoYXZlIHNwYWNlcyBiZXR3ZWVuLgotCQkJd2hpbGUgKCR0byA9fiBzLyguKVxzXCovJDFcKi8pIHsKKwkJCXdoaWxlICgkdG8gPX4gcy9cKlxzK1wqL1wqXCovKSB7CiAJCQl9CiAKIAkJCSNwcmludCAiZnJvbTwkZnJvbT4gdG88JHRvPlxuIjsKQEAgLTE2NzgsNyArMTY4MCw3IEBACiAJCQkjIFNob3VsZCBub3QgZW5kIHdpdGggYSBzcGFjZS4KIAkJCSR0byA9fiBzL1xzKyQvLzsKIAkJCSMgJyoncyBzaG91bGQgbm90IGhhdmUgc3BhY2VzIGJldHdlZW4uCi0JCQl3aGlsZSAoJHRvID1+IHMvKC4pXHNcKi8kMVwqLykgeworCQkJd2hpbGUgKCR0byA9fiBzL1wqXHMrXCovXCpcKi8pIHsKIAkJCX0KIAkJCSMgTW9kaWZpZXJzIHNob3VsZCBoYXZlIHNwYWNlcy4KIAkJCSR0byA9fiBzLyhcYiRNb2RpZmllciQpLyQxIC87CkBAIC0yMDE0LDcgKzIwMTYsMTEgQEAKIAogCQkJIyBGbGF0dGVuIGFueSBwYXJlbnRoZXNlcwogCQkJJHZhbHVlID1+IHMvXClcKC9cKSBcKC9nOwotCQkJd2hpbGUgKCR2YWx1ZSAhfiAvKD86JElkZW50fC0/JENvbnN0YW50KVxzKiRDb21wYXJlXHMqKD86JElkZW50fC0/JENvbnN0YW50KS8gJiYgJHZhbHVlID1+IHMvXChbXlwoXCldKlwpLzEvKSB7CisJCQl3aGlsZSAoJHZhbHVlID1+IHMvXFtbXlx7XH1dKlxdLzEvIHx8CisJCQkgICAgICAgJHZhbHVlICF+IC8oPzokSWRlbnR8LT8kQ29uc3RhbnQpXHMqCisJCQkJCSAgICAgJENvbXBhcmVccyoKKwkJCQkJICAgICAoPzokSWRlbnR8LT8kQ29uc3RhbnQpL3ggJiYKKwkJCSAgICAgICAkdmFsdWUgPX4gcy9cKFteXChcKV0qXCkvMS8pIHsKIAkJCX0KIAogCQkJaWYgKCR2YWx1ZSA9fiAvXig/OiRJZGVudHwtPyRDb25zdGFudCkkLykgewpAQCAtMjEwMiw2ICsyMTA4LDExIEBACiAJCQkJRVJST1IoInRyYWlsaW5nIHN0YXRlbWVudHMgc2hvdWxkIGJlIG9uIG5leHQgbGluZVxuIiAuICRoZXJlY3Vycik7CiAJCQl9CiAJCX0KKyMgaWYgc2hvdWxkIG5vdCBjb250aW51ZSBhIGJyYWNlCisJCWlmICgkbGluZSA9fiAvfVxzKmlmXGIvKSB7CisJCQlFUlJPUigidHJhaWxpbmcgc3RhdGVtZW50cyBzaG91bGQgYmUgb24gbmV4dCBsaW5lXG4iIC4KKwkJCQkkaGVyZWN1cnIpOworCQl9CiAjIGNhc2UgYW5kIGRlZmF1bHQgc2hvdWxkIG5vdCBoYXZlIGdlbmVyYWwgc3RhdGVtZW50cyBhZnRlciB0aGVtCiAJCWlmICgkbGluZSA9fiAvXi5ccyooPzpjYXNlXHMqLip8ZGVmYXVsdFxzKik6L2cgJiYKIAkJICAgICRsaW5lICF+IC9cRyg/OgpAQCAtMjUxNiw5ICsyNTI3LDEwIEBACiAJCQlXQVJOKCJwbGVhc2UgdXNlIGRldmljZV9pbml0Y2FsbCgpIGluc3RlYWQgb2YgX19pbml0Y2FsbCgpXG4iIC4gJGhlcmVjdXJyKTsKIAkJfQogIyBjaGVjayBmb3Igc3RydWN0IGZpbGVfb3BlcmF0aW9ucywgZW5zdXJlIHRoZXkgYXJlIGNvbnN0LgotCQlpZiAoJGxpbmUgPX4gL1xic3RydWN0XHMrZmlsZV9vcGVyYXRpb25zXGIvICYmCi0JCSAgICAkbGluZSAhfiAvXGJjb25zdFxiLykgewotCQkJV0FSTigic3RydWN0IGZpbGVfb3BlcmF0aW9ucyBzaG91bGQgbm9ybWFsbHkgYmUgY29uc3RcbiIgLiAkaGVyZWN1cnIpOworCQlpZiAoJGxpbmUgIX4gL1xiY29uc3RcYi8gJiYKKwkJICAgICRsaW5lID1+IC9cYnN0cnVjdFxzKyhmaWxlX29wZXJhdGlvbnN8c2VxX29wZXJhdGlvbnMpXGIvKSB7CisJCQlXQVJOKCJzdHJ1Y3QgJDEgc2hvdWxkIG5vcm1hbGx5IGJlIGNvbnN0XG4iIC4KKwkJCQkkaGVyZWN1cnIpOwogCQl9CiAKICMgdXNlIG9mIE5SX0NQVVMgaXMgdXN1YWxseSB3cm9uZwpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9jb25maWcgYi9zY3JpcHRzL2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42OGI5NzYxCi0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9jb25maWcKQEAgLTAsMCArMSwxNTAgQEAKKyMhL2Jpbi9iYXNoCisjIE1hbmlwdWxhdGUgb3B0aW9ucyBpbiBhIC5jb25maWcgZmlsZSBmcm9tIHRoZSBjb21tYW5kIGxpbmUKKwordXNhZ2UoKSB7CisJY2F0ID4mMiA8PEVPTAorTWFuaXB1bGF0ZSBvcHRpb25zIGluIGEgLmNvbmZpZyBmaWxlIGZyb20gdGhlIGNvbW1hbmQgbGluZS4KK1VzYWdlOgorY29uZmlnIG9wdGlvbnMgY29tbWFuZCAuLi4KK2NvbW1hbmRzOgorCS0tZW5hYmxlfC1lIG9wdGlvbiAgIEVuYWJsZSBvcHRpb24KKwktLWRpc2FibGV8LWQgb3B0aW9uICBEaXNhYmxlIG9wdGlvbgorCS0tbW9kdWxlfC1tIG9wdGlvbiAgICAgIFR1cm4gb3B0aW9uIGludG8gYSBtb2R1bGUKKwktLXN0YXRlfC1zIG9wdGlvbiAgICAgICBQcmludCBzdGF0ZSBvZiBvcHRpb24gKG4seSxtLHVuZGVmKQorCisJLS1lbmFibGUtYWZ0ZXJ8LUUgYmVmb3Jlb3B0IG9wdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbmFibGUgb3B0aW9uIGRpcmVjdGx5IGFmdGVyIG90aGVyIG9wdGlvbgorCS0tZGlzYWJsZS1hZnRlcnwtRCBiZWZvcmVvcHQgb3B0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpc2FibGUgb3B0aW9uIGRpcmVjdGx5IGFmdGVyIG90aGVyIG9wdGlvbgorCS0tbW9kdWxlLWFmdGVyfC1NIGJlZm9yZW9wdCBvcHRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHVybiBvcHRpb24gaW50byBtb2R1bGUgZGlyZWN0bHkgYWZ0ZXIgb3RoZXIgb3B0aW9uCisKKwljb21tYW5kcyBjYW4gYmUgcmVwZWF0ZWQgbXVsdGlwbGUgdGltZXMKKworb3B0aW9uczoKKwktLWZpbGUgLmNvbmZpZyBmaWxlIHRvIGNoYW5nZSAoZGVmYXVsdCAuY29uZmlnKQorCitjb25maWcgZG9lc24ndCBjaGVjayB0aGUgdmFsaWRpdHkgb2YgdGhlIC5jb25maWcgZmlsZS4gVGhpcyBpcyBkb25lIGF0IG5leHQKKyBtYWtlIHRpbWUuCitUaGUgb3B0aW9ucyBuZWVkIHRvIGJlIGFscmVhZHkgaW4gdGhlIGZpbGUgYmVmb3JlIHRoZXkgY2FuIGJlIGNoYW5nZWQsCitidXQgc29tZXRpbWVzIHlvdSBjYW4gY2hlYXQgd2l0aCB0aGUgLS0qLWFmdGVyIG9wdGlvbnMuCitFT0wKKwlleGl0IDEKK30KKworY2hlY2thcmcoKSB7CisJQVJHPSIkMSIKKwlpZiBbICIkQVJHIiA9ICIiIF0gOyB0aGVuCisJCXVzYWdlCisJZmkKKwljYXNlICIkQVJHIiBpbgorCUNPTkZJR18qKQorCQlBUkc9IiR7QVJHL0NPTkZJR18vfSIKKwkJOzsKKwllc2FjCisJQVJHPSJgZWNobyAkQVJHIHwgdHIgYS16IEEtWmAiCit9CisKK3JlcGxhY2UoKSB7CisJc2VkIC1pIC1lICIkQCIgJEZOCit9CisKK2lmIFsgIiQxIiA9ICItLWZpbGUiIF07IHRoZW4KKwlGTj0iJDIiCisJaWYgWyAiJEZOIiA9ICIiIF0gOyB0aGVuCisJCXVzYWdlCisJZmkKKwlzaGlmdAorCXNoaWZ0CitlbHNlCisJRk49LmNvbmZpZworZmkKKword2hpbGUgWyAiJDEiICE9ICIiIF0gOyBkbworCUNNRD0iJDEiCisJc2hpZnQKKwljYXNlICIkQ01EIiBpbgorCS0tZW5hYmxlfC1lKQorCQljaGVja2FyZyAiJDEiCisJCXJlcGxhY2UgInMvIyBDT05GSUdfJEFSRyBpcyBub3Qgc2V0L0NPTkZJR18kQVJHPXkvIgorCQlzaGlmdAorCQk7OworCisJLS1kaXNhYmxlfC1kKQorCQljaGVja2FyZyAiJDEiCisJCXJlcGxhY2UgInMvQ09ORklHXyRBUkc9W215XS8jIENPTkZJR18kQVJHIGlzIG5vdCBzZXQvIgorCQlzaGlmdAorCQk7OworCisJLS1tb2R1bGV8LW0pCisJCWNoZWNrYXJnICIkMSIKKwkJcmVwbGFjZSAicy9DT05GSUdfJEFSRz15L0NPTkZJR18kQVJHPW0vIiBcCisJCQktZSAicy8jIENPTkZJR18kQVJHIGlzIG5vdCBzZXQvQ09ORklHXyRBUkc9bS8iCisJCXNoaWZ0CisJCTs7CisKKwktLXN0YXRlfC1zKQorCQljaGVja2FyZyAiJDEiCisJCWlmIGdyZXAgLXEgIiMgQ09ORklHXyRBUkcgaXMgbm90IHNldCIgJEZOIDsgdGhlbgorCQkJZWNobyBuCisJCWVsc2UKKwkJCVY9IiQoZ3JlcCAiXkNPTkZJR18kQVJHPSIgJEZOKSIKKwkJCWlmIFsgJD8gIT0gMCBdIDsgdGhlbgorCQkJCWVjaG8gdW5kZWYKKwkJCWVsc2UKKwkJCQlWPSIke1YvQ09ORklHXyRBUkc9L30iCisJCQkJVj0iJHtWL1wiL30iCisJCQkJZWNobyAiJFYiCisJCQlmaQorCQlmaQorCQlzaGlmdAorCQk7OworCisJLS1lbmFibGUtYWZ0ZXJ8LUUpCisJCWNoZWNrYXJnICIkMSIKKwkJQT0kQVJHCisJCWNoZWNrYXJnICIkMiIKKwkJQj0kQVJHCisJCXJlcGxhY2UgIi9DT05GSUdfJEE9W215XS9hQ09ORklHXyRCPXkiIFwKKwkJCS1lICIvIyBDT05GSUdfJEFSRyBpcyBub3Qgc2V0L2EvQ09ORklHXyRBUkc9eSIgXAorCQkJLWUgInMvIyBDT05GSUdfJEFSRyBpcyBub3Qgc2V0L0NPTkZJR18kQVJHPXkvIgorCQlzaGlmdAorCQlzaGlmdAorCQk7OworCisJLS1kaXNhYmxlLWFmdGVyfC1EKQorCQljaGVja2FyZyAiJDEiCisJCUE9JEFSRworCQljaGVja2FyZyAiJDIiCisJCUI9JEFSRworCQlyZXBsYWNlICIvQ09ORklHXyRBPVtteV0vYSMgQ09ORklHXyRCIGlzIG5vdCBzZXQiIFwKKwkJLWUgIi8jIENPTkZJR18kQVJHIGlzIG5vdCBzZXQvYS8jIENPTkZJR18kQVJHIGlzIG5vdCBzZXQiIFwKKwkJLWUgInMvQ09ORklHXyRBUkc9W215XS8jIENPTkZJR18kQVJHIGlzIG5vdCBzZXQvIgorCQlzaGlmdAorCQlzaGlmdAorCQk7OworCisJLS1tb2R1bGUtYWZ0ZXJ8LU0pCisJCWNoZWNrYXJnICIkMSIKKwkJQT0kQVJHCisJCWNoZWNrYXJnICIkMiIKKwkJQj0kQVJHCisJCXJlcGxhY2UgIi9DT05GSUdfJEE9W215XS9hQ09ORklHXyRCPW0iIFwKKwkJCS1lICIvIyBDT05GSUdfJEFSRyBpcyBub3Qgc2V0L2EvQ09ORklHXyRBUkc9bSIgXAorCQkJLWUgInMvQ09ORklHXyRBUkc9eS9DT05GSUdfJEFSRz1tLyIgXAorCQkJLWUgInMvIyBDT05GSUdfJEFSRyBpcyBub3Qgc2V0L0NPTkZJR18kQVJHPW0vIgorCQlzaGlmdAorCQlzaGlmdAorCQk7OworCisJIyB1bmRvY3VtZW50ZWQgYmVjYXVzZSBpdCBpZ25vcmVzIC0tZmlsZSAoZml4bWUpCisJLS1yZWZyZXNoKQorCQl5ZXMgIiIgfCBtYWtlIG9sZGNvbmZpZworCQk7OworCisJKikKKwkJdXNhZ2UKKwkJOzsKKwllc2FjCitkb25lCisKZGlmZiAtLWdpdCBhL2Zpcm13YXJlL2loZXgyZncuYyBiL3NjcmlwdHMvaWhleDJmdy5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBmaXJtd2FyZS9paGV4MmZ3LmMKcmVuYW1lIHRvIHNjcmlwdHMvaWhleDJmdy5jCmRpZmYgLS1naXQgYS9zY3JpcHRzL21hcmt1cF9vb3BzLnBsIGIvc2NyaXB0cy9tYXJrdXBfb29wcy5wbAppbmRleCA3MDBhN2E2Li5kNDA0NDljIDEwMDY0NAotLS0gYS9zY3JpcHRzL21hcmt1cF9vb3BzLnBsCisrKyBiL3NjcmlwdHMvbWFya3VwX29vcHMucGwKQEAgLTEsNSArMSw3IEBACiAjIS91c3IvYmluL3BlcmwgLXcKIAordXNlIEZpbGU6OkJhc2VuYW1lOworCiAjIENvcHlyaWdodCAyMDA4LCBJbnRlbCBDb3Jwb3JhdGlvbgogIwogIyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgTGludXgga2VybmVsCkBAIC0xMywyMyArMTUsNDEgQEAKIAogCiBteSAkdm1saW51eF9uYW1lID0gJEFSR1ZbMF07Ci0KK2lmICghZGVmaW5lZCgkdm1saW51eF9uYW1lKSkgeworCW15ICRrZXJ2ZXIgPSBgdW5hbWUgLXJgOworCWNob21wKCRrZXJ2ZXIpOworCSR2bWxpbnV4X25hbWUgPSAiL2xpYi9tb2R1bGVzLyRrZXJ2ZXIvYnVpbGQvdm1saW51eCI7CisJcHJpbnQgIk5vIHZtbGludXggc3BlY2lmaWVkLCBhc3N1bWluZyAkdm1saW51eF9uYW1lXG4iOworfQorbXkgJGZpbGVuYW1lID0gJHZtbGludXhfbmFtZTsKICMKICMgU3RlcCAxOiBQYXJzZSB0aGUgb29wcyB0byBmaW5kIHRoZSBFSVAgdmFsdWUKICMKIAogbXkgJHRhcmdldCA9ICIwIjsKK215ICRmdW5jdGlvbjsKK215ICRtb2R1bGUgPSAiIjsKK215ICRmdW5jX29mZnNldDsKK215ICR2bWFvZmZzZXQgPSAwOworCiB3aGlsZSAoPFNURElOPikgewotCWlmICgkXyA9fiAvRUlQOiAwMDYwOlxbXDwoW2EtejAtOV0rKVw+XF0vKSB7CisJbXkgJGxpbmUgPSAkXzsKKwlpZiAoJGxpbmUgPX4gL0VJUDogMDA2MDpcW1w8KFthLXowLTldKylcPlxdLykgewogCQkkdGFyZ2V0ID0gJDE7CiAJfQorCWlmICgkbGluZSA9fiAvRUlQIGlzIGF0IChbYS16QS1aMC05XF9dKylcKygweFswLTlhLWZdKylcLzB4W2EtZjAtOV0vKSB7CisJCSRmdW5jdGlvbiA9ICQxOworCQkkZnVuY19vZmZzZXQgPSAkMjsKKwl9CisKKwkjIGNoZWNrIGlmIGl0J3MgYSBtb2R1bGUKKwlpZiAoJGxpbmUgPX4gL0VJUCBpcyBhdCAoW2EtekEtWjAtOVxfXSspXCsoMHhbMC05YS1mXSspXC8weFthLWYwLTldK1xXXFsoW2EtekEtWjAtOVxfXC1dKylcXS8pIHsKKwkJJG1vZHVsZSA9ICQzOworCX0KIH0KIAotaWYgKCR0YXJnZXQgPX4gL15mOC8pIHsKLQlwcmludCAiVGhpcyBzY3JpcHQgZG9lcyBub3Qgd29yayBvbiBtb2R1bGVzIC4uLiBcbiI7Ci0JZXhpdDsKLX0KLQorbXkgJGRlY29kZXN0YXJ0ID0gaGV4KCR0YXJnZXQpIC0gaGV4KCRmdW5jX29mZnNldCk7CitteSAkZGVjb2Rlc3RvcCA9ICRkZWNvZGVzdGFydCArIDgxOTI7CiBpZiAoJHRhcmdldCBlcSAiMCIpIHsKIAlwcmludCAiTm8gb29wcyBmb3VuZCFcbiI7CiAJcHJpbnQgIlVzYWdlOiBcbiI7CkBAIC0zNyw2ICs1NywyOSBAQAogCWV4aXQ7CiB9CiAKKyMgaWYgaXQncyBhIG1vZHVsZSwgd2UgbmVlZCB0byBmaW5kIHRoZSAua28gZmlsZSBhbmQgY2FsY3VsYXRlIGEgbG9hZCBvZmZzZXQKK2lmICgkbW9kdWxlIG5lICIiKSB7CisJbXkgJGRpciA9IGRpcm5hbWUoJGZpbGVuYW1lKTsKKwkkZGlyID0gJGRpciAuICIvIjsKKwlteSAkbW9kID0gJG1vZHVsZSAuICIua28iOworCW15ICRtb2R1bGVmaWxlID0gYGZpbmQgJGRpciAtbmFtZSAkbW9kIHwgaGVhZCAtMWA7CisJY2hvbXAoJG1vZHVsZWZpbGUpOworCSRmaWxlbmFtZSA9ICRtb2R1bGVmaWxlOworCWlmICgkZmlsZW5hbWUgZXEgIiIpIHsKKwkJcHJpbnQgIk1vZHVsZSAua28gZmlsZSBmb3IgJG1vZHVsZSBub3QgZm91bmQuIEFib3J0aW5nXG4iOworCQlleGl0OworCX0KKwkjIG9rIHNvIHdlIGZvdW5kIHRoZSBtb2R1bGUsIG5vdyB3ZSBuZWVkIHRvIGNhbGN1bGF0ZSB0aGUgdm1hIG9mZnNldAorCW9wZW4oRklMRSwgIm9iamR1bXAgLWRTICRmaWxlbmFtZSB8IikgfHwgZGllICJDYW5ub3Qgc3RhcnQgb2JqZHVtcCI7CisJd2hpbGUgKDxGSUxFPikgeworCQlpZiAoJF8gPX4gL14oWzAtOWEtZl0rKSBcPCRmdW5jdGlvblw+XDovKSB7CisJCQlteSAkZnUgPSAkMTsKKwkJCSR2bWFvZmZzZXQgPSBoZXgoJHRhcmdldCkgLSBoZXgoJGZ1KSAtIGhleCgkZnVuY19vZmZzZXQpOworCQl9CisJfQorCWNsb3NlKEZJTEUpOworfQorCiBteSAkY291bnRlciA9IDA7CiBteSAkc3RhdGUgICA9IDA7CiBteSAkY2VudGVyICA9IDA7CkBAIC01OSw5ICsxMDIsNyBAQAogIyBmaXJzdCwgcGFyc2UgdGhlIGlucHV0IGludG8gdGhlIGxpbmVzIGFycmF5LCBidXQgdG8ga2VlcCBzaXplIGRvd24sCiAjIHdlIG9ubHkgZG8gdGhpcyBmb3IgNEtiIGFyb3VuZCB0aGUgc3dlZXQgc3BvdAogCi1teSAkZmlsZW5hbWU7Ci0KLW9wZW4oRklMRSwgIm9iamR1bXAgLWRTICR2bWxpbnV4X25hbWUgfCIpIHx8IGRpZSAiQ2Fubm90IHN0YXJ0IG9iamR1bXAiOworb3BlbihGSUxFLCAib2JqZHVtcCAtZFMgLS1hZGp1c3Qtdm1hPSR2bWFvZmZzZXQgLS1zdGFydC1hZGRyZXNzPSRkZWNvZGVzdGFydCAtLXN0b3AtYWRkcmVzcz0kZGVjb2Rlc3RvcCAkZmlsZW5hbWUgfCIpIHx8IGRpZSAiQ2Fubm90IHN0YXJ0IG9iamR1bXAiOwogCiB3aGlsZSAoPEZJTEU+KSB7CiAJbXkgJGxpbmUgPSAkXzsKZGlmZiAtLWdpdCBhL3NjcmlwdHMvdGFncy5zaCBiL3NjcmlwdHMvdGFncy5zaAppbmRleCA5ZTM0NTFkLi5mZGJlNzhiIDEwMDc1NQotLS0gYS9zY3JpcHRzL3RhZ3Muc2gKKysrIGIvc2NyaXB0cy90YWdzLnNoCkBAIC0yNCw2ICsyNCwxMSBAQAogCXRyZWU9JHtzcmN0cmVlfS8KIGZpCiAKKyMgRGV0ZWN0IGlmIEFMTFNPVVJDRV9BUkNIUyBpcyBzZXQuIElmIG5vdCwgd2UgYXNzdW1lIFNSQ0FSQ0gKK2lmIFsgIiR7QUxMU09VUkNFX0FSQ0hTfSIgPSAiIiBdOyB0aGVuCisJQUxMU09VUkNFX0FSQ0hTPSR7U1JDQVJDSH0KK2ZpCisKICMgZmluZCBzb3VyY2VzIGluIGFyY2gvJEFSQ0gKIGZpbmRfYXJjaF9zb3VyY2VzKCkKIHsKQEAgLTU0LDI2ICs1OSwyOSBAQAogZmluZF9zb3VyY2VzKCkKIHsKIAlmaW5kX2FyY2hfc291cmNlcyAkMSAiJDIiCi0JZmluZF9pbmNsdWRlX3NvdXJjZXMgIiQyIgotCWZpbmRfb3RoZXJfc291cmNlcyAiJDIiCiB9CiAKIGFsbF9zb3VyY2VzKCkKIHsKLQlmaW5kX3NvdXJjZXMgJFNSQ0FSQ0ggJyouW2NoU10nCisJZm9yIGFyY2ggaW4gJEFMTFNPVVJDRV9BUkNIUworCWRvCisJCWZpbmRfc291cmNlcyAkYXJjaCAnKi5bY2hTXScKKwlkb25lCiAJaWYgWyAhIC16ICIkYXJjaGluY2x1ZGUiIF07IHRoZW4KIAkJZmluZF9hcmNoX2luY2x1ZGVfc291cmNlcyAkYXJjaGluY2x1ZGUgJyouW2NoU10nCiAJZmkKKwlmaW5kX2luY2x1ZGVfc291cmNlcyAnKi5bY2hTXScKKwlmaW5kX290aGVyX3NvdXJjZXMgJyouW2NoU10nCiB9CiAKIGFsbF9rY29uZmlncygpCiB7Ci0JZmluZF9zb3VyY2VzICRTUkNBUkNIICdLY29uZmlnKicKKwlmaW5kX3NvdXJjZXMgJEFMTFNPVVJDRV9BUkNIUyAnS2NvbmZpZyonCiB9CiAKIGFsbF9kZWZjb25maWdzKCkKIHsKLQlmaW5kX3NvdXJjZXMgJFNSQ0FSQ0ggImRlZmNvbmZpZyIKKwlmaW5kX3NvdXJjZXMgJEFMTFNPVVJDRV9BUkNIUyAiZGVmY29uZmlnIgogfQogCiBkb2NzY29wZSgpCmRpZmYgLS1naXQgYS9zZWN1cml0eS9kZXZpY2VfY2dyb3VwLmMgYi9zZWN1cml0eS9kZXZpY2VfY2dyb3VwLmMKaW5kZXggNWJhNzg3MC4uM2FhY2QwZiAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvZGV2aWNlX2Nncm91cC5jCisrKyBiL3NlY3VyaXR5L2RldmljZV9jZ3JvdXAuYwpAQCAtNTEzLDExICs1MTMsMTQgQEAKIAlzdHJ1Y3QgZGV2X2Nncm91cCAqZGV2X2Nncm91cDsKIAlzdHJ1Y3QgZGV2X3doaXRlbGlzdF9pdGVtICp3aDsKIAorCWlmICghU19JU0JMSyhtb2RlKSAmJiAhU19JU0NIUihtb2RlKSkKKwkJcmV0dXJuIDA7CisKIAlyY3VfcmVhZF9sb2NrKCk7CiAKIAlkZXZfY2dyb3VwID0gdGFza19kZXZjZ3JvdXAoY3VycmVudCk7CiAKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHdoLCAmZGV2X2Nncm91cC0+d2hpdGVsaXN0LCBsaXN0KSB7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3Uod2gsICZkZXZfY2dyb3VwLT53aGl0ZWxpc3QsIGxpc3QpIHsKIAkJaWYgKHdoLT50eXBlICYgREVWX0FMTCkKIAkJCWdvdG8gYWNjX2NoZWNrOwogCQlpZiAoKHdoLT50eXBlICYgREVWX0JMT0NLKSAmJiAhU19JU0JMSyhtb2RlKSkKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L2tleXMva2V5Y3RsLmMgYi9zZWN1cml0eS9rZXlzL2tleWN0bC5jCmluZGV4IDA5Nzk2NzkuLmIxZWMzYjQgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L2tleXMva2V5Y3RsLmMKKysrIGIvc2VjdXJpdHkva2V5cy9rZXljdGwuYwpAQCAtNTQsMTEgKzU0LDExIEBACiAgKiAtIHJldHVybnMgdGhlIG5ldyBrZXkncyBzZXJpYWwgbnVtYmVyCiAgKiAtIGltcGxlbWVudHMgYWRkX2tleSgpCiAgKi8KLWFzbWxpbmthZ2UgbG9uZyBzeXNfYWRkX2tleShjb25zdCBjaGFyIF9fdXNlciAqX3R5cGUsCi0JCQkgICAgY29uc3QgY2hhciBfX3VzZXIgKl9kZXNjcmlwdGlvbiwKLQkJCSAgICBjb25zdCB2b2lkIF9fdXNlciAqX3BheWxvYWQsCi0JCQkgICAgc2l6ZV90IHBsZW4sCi0JCQkgICAga2V5X3NlcmlhbF90IHJpbmdpZCkKK1NZU0NBTExfREVGSU5FNShhZGRfa2V5LCBjb25zdCBjaGFyIF9fdXNlciAqLCBfdHlwZSwKKwkJY29uc3QgY2hhciBfX3VzZXIgKiwgX2Rlc2NyaXB0aW9uLAorCQljb25zdCB2b2lkIF9fdXNlciAqLCBfcGF5bG9hZCwKKwkJc2l6ZV90LCBwbGVuLAorCQlrZXlfc2VyaWFsX3QsIHJpbmdpZCkKIHsKIAlrZXlfcmVmX3Qga2V5cmluZ19yZWYsIGtleV9yZWY7CiAJY2hhciB0eXBlWzMyXSwgKmRlc2NyaXB0aW9uOwpAQCAtMTQ2LDEwICsxNDYsMTAgQEAKICAqICAgLSBpZiB0aGUgX2NhbGxvdXRfaW5mbyBzdHJpbmcgaXMgZW1wdHksIGl0IHdpbGwgYmUgcmVuZGVyZWQgYXMgIi0iCiAgKiAtIGltcGxlbWVudHMgcmVxdWVzdF9rZXkoKQogICovCi1hc21saW5rYWdlIGxvbmcgc3lzX3JlcXVlc3Rfa2V5KGNvbnN0IGNoYXIgX191c2VyICpfdHlwZSwKLQkJCQljb25zdCBjaGFyIF9fdXNlciAqX2Rlc2NyaXB0aW9uLAotCQkJCWNvbnN0IGNoYXIgX191c2VyICpfY2FsbG91dF9pbmZvLAotCQkJCWtleV9zZXJpYWxfdCBkZXN0cmluZ2lkKQorU1lTQ0FMTF9ERUZJTkU0KHJlcXVlc3Rfa2V5LCBjb25zdCBjaGFyIF9fdXNlciAqLCBfdHlwZSwKKwkJY29uc3QgY2hhciBfX3VzZXIgKiwgX2Rlc2NyaXB0aW9uLAorCQljb25zdCBjaGFyIF9fdXNlciAqLCBfY2FsbG91dF9pbmZvLAorCQlrZXlfc2VyaWFsX3QsIGRlc3RyaW5naWQpCiB7CiAJc3RydWN0IGtleV90eXBlICprdHlwZTsKIAlzdHJ1Y3Qga2V5ICprZXk7CkBAIC0yNzAsNiArMjcwLDcgQEAKIAogCS8qIGpvaW4gdGhlIHNlc3Npb24gKi8KIAlyZXQgPSBqb2luX3Nlc3Npb25fa2V5cmluZyhuYW1lKTsKKwlrZnJlZShuYW1lKTsKIAogIGVycm9yOgogCXJldHVybiByZXQ7CkBAIC0xMjE2LDggKzEyMTcsOCBAQAogLyoKICAqIHRoZSBrZXkgY29udHJvbCBzeXN0ZW0gY2FsbAogICovCi1hc21saW5rYWdlIGxvbmcgc3lzX2tleWN0bChpbnQgb3B0aW9uLCB1bnNpZ25lZCBsb25nIGFyZzIsIHVuc2lnbmVkIGxvbmcgYXJnMywKLQkJCSAgIHVuc2lnbmVkIGxvbmcgYXJnNCwgdW5zaWduZWQgbG9uZyBhcmc1KQorU1lTQ0FMTF9ERUZJTkU1KGtleWN0bCwgaW50LCBvcHRpb24sIHVuc2lnbmVkIGxvbmcsIGFyZzIsIHVuc2lnbmVkIGxvbmcsIGFyZzMsCisJCXVuc2lnbmVkIGxvbmcsIGFyZzQsIHVuc2lnbmVkIGxvbmcsIGFyZzUpCiB7CiAJc3dpdGNoIChvcHRpb24pIHsKIAljYXNlIEtFWUNUTF9HRVRfS0VZUklOR19JRDoKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NtYWNrL3NtYWNrZnMuYyBiL3NlY3VyaXR5L3NtYWNrL3NtYWNrZnMuYwppbmRleCBiZjEwN2EzLi43MWUyYjkxIDEwMDY0NAotLS0gYS9zZWN1cml0eS9zbWFjay9zbWFja2ZzLmMKKysrIGIvc2VjdXJpdHkvc21hY2svc21hY2tmcy5jCkBAIC01NjksNyArNTY5LDcgQEAKIAlpZiAoc2twID09IE5VTEwpCiAJCWdvdG8gb3V0OwogCi0JcnVsZSArPSBTTUtfTEFCRUxMRU47OworCXJ1bGUgKz0gU01LX0xBQkVMTEVOOwogCXJldCA9IHNzY2FuZihydWxlLCAiJWQiLCAmbWFwbGV2ZWwpOwogCWlmIChyZXQgIT0gMSB8fCBtYXBsZXZlbCA+IFNNQUNLX0NJUFNPX01BWExFVkVMKQogCQlnb3RvIG91dDsKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9hZWRzcDE2LmMgYi9zb3VuZC9vc3MvYWVkc3AxNi5jCmluZGV4IGEwMjc0ZjMuLjNlZTk5MDAgMTAwNjQ0Ci0tLSBhL3NvdW5kL29zcy9hZWRzcDE2LmMKKysrIGIvc291bmQvb3NzL2FlZHNwMTYuYwpAQCAtMTU3LDcgKzE1Nyw3IEBACiAKICAgIFN0YXJ0ZWQgRnJpIE1hciAxNyAxNjoxMzoxOCBNRVQgMTk5NQogCi0gICB2MC4xIChBTFBIQSwgd2FzIGFuIHVzZXItbGV2ZWwgcHJvZ3JhbSBjYWxsZWQgQXVkaW9FeGNlbERTUDE2LmMpCisgICB2MC4xIChBTFBIQSwgd2FzIGEgdXNlci1sZXZlbCBwcm9ncmFtIGNhbGxlZCBBdWRpb0V4Y2VsRFNQMTYuYykKICAgIC0gSW5pdGlhbCBjb2RlLgogICAgdjAuMiAoQUxQSEEpCiAgICAtIENsZWFudXBzLgpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2RtYXNvdW5kL2RtYXNvdW5kX2F0YXJpLmMgYi9zb3VuZC9vc3MvZG1hc291bmQvZG1hc291bmRfYXRhcmkuYwppbmRleCA0ZDQ1YmQ2Li41N2Q5ZjE1IDEwMDY0NAotLS0gYS9zb3VuZC9vc3MvZG1hc291bmQvZG1hc291bmRfYXRhcmkuYworKysgYi9zb3VuZC9vc3MvZG1hc291bmQvZG1hc291bmRfYXRhcmkuYwpAQCAtODUxLDggKzg1MSw5IEBACiAJbWZwLnRpbV9kdF9hID0gMTsJLyogQ2F1c2UgaW50ZXJydXB0IGFmdGVyIGZpcnN0IGV2ZW50LiAqLwogCW1mcC50aW1fY3RfYSA9IDg7CS8qIFR1cm4gb24gZXZlbnQgY291bnRpbmcuICovCiAJLyogUmVnaXN0ZXIgaW50ZXJydXB0IGhhbmRsZXIuICovCi0JcmVxdWVzdF9pcnEoSVJRX01GUF9USU1BLCBBdGFJbnRlcnJ1cHQsIElSUV9UWVBFX1NMT1csICJETUEgc291bmQiLAotCQkgICAgQXRhSW50ZXJydXB0KTsKKwlpZiAocmVxdWVzdF9pcnEoSVJRX01GUF9USU1BLCBBdGFJbnRlcnJ1cHQsIElSUV9UWVBFX1NMT1csICJETUEgc291bmQiLAorCQkJQXRhSW50ZXJydXB0KSkKKwkJcmV0dXJuIDA7CiAJbWZwLmludF9lbl9hIHw9IDB4MjA7CS8qIFR1cm4gaW50ZXJydXB0IG9uLiAqLwogCW1mcC5pbnRfbWtfYSB8PSAweDIwOwogCXJldHVybiAxOwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2RtYXNvdW5kL2RtYXNvdW5kX3E0MC5jIGIvc291bmQvb3NzL2RtYXNvdW5kL2RtYXNvdW5kX3E0MC5jCmluZGV4IDE4NTViMTQuLjk5YmNiMjEgMTAwNjQ0Ci0tLSBhL3NvdW5kL29zcy9kbWFzb3VuZC9kbWFzb3VuZF9xNDAuYworKysgYi9zb3VuZC9vc3MvZG1hc291bmQvZG1hc291bmRfcTQwLmMKQEAgLTM3MSw4ICszNzEsOSBAQAogc3RhdGljIGludCBfX2luaXQgUTQwSXJxSW5pdCh2b2lkKQogewogCS8qIFJlZ2lzdGVyIGludGVycnVwdCBoYW5kbGVyLiAqLwotCXJlcXVlc3RfaXJxKFE0MF9JUlFfU0FNUExFLCBRNDBTdGVyZW9JbnRlcnJ1cHQsIDAsCi0JCSAgICAiRE1BIHNvdW5kIiwgUTQwSW50ZXJydXB0KTsKKwlpZiAocmVxdWVzdF9pcnEoUTQwX0lSUV9TQU1QTEUsIFE0MFN0ZXJlb0ludGVycnVwdCwgMCwKKwkJICAgICJETUEgc291bmQiLCBRNDBJbnRlcnJ1cHQpKQorCQlyZXR1cm4gMDsKIAogCXJldHVybigxKTsKIH0KQEAgLTQwMSw2ICs0MDIsNyBAQAogCXVfY2hhciAqc3RhcnQ7CiAJdV9sb25nIHNpemU7CiAJdV9jaGFyIHNwZWVkOworCWludCBlcnJvcjsKIAogCS8qIHVzZWQgYnkgUTQwUGxheSgpIGlmIGFsbCBkb3VidHMgd2hldGhlciB0aGVyZSByZWFsbHkgaXMgc29tZXRoaW5nCiAJICogdG8gYmUgcGxheWVkIGFyZSBhbHJlYWR5IHdpcGVkIG91dC4KQEAgLTQxOSwxMSArNDIxLDEzIEBACiAJbWFzdGVyX291dGIoIDAsU0FNUExFX0VOQUJMRV9SRUcpOwogCWZyZWVfaXJxKFE0MF9JUlFfU0FNUExFLCBRNDBJbnRlcnJ1cHQpOwogCWlmIChkbWFzb3VuZC5zb2Z0LnN0ZXJlbykKLQkgIAlyZXF1ZXN0X2lycShRNDBfSVJRX1NBTVBMRSwgUTQwU3RlcmVvSW50ZXJydXB0LCAwLAotCQkgICAgIlE0MCBzb3VuZCIsIFE0MEludGVycnVwdCk7CisJCWVycm9yID0gcmVxdWVzdF9pcnEoUTQwX0lSUV9TQU1QTEUsIFE0MFN0ZXJlb0ludGVycnVwdCwgMCwKKwkJCQkgICAgIlE0MCBzb3VuZCIsIFE0MEludGVycnVwdCk7CiAJICBlbHNlCi0JICAgICAgICByZXF1ZXN0X2lycShRNDBfSVJRX1NBTVBMRSwgUTQwTW9ub0ludGVycnVwdCwgMCwKLQkJICAgICJRNDAgc291bmQiLCBRNDBJbnRlcnJ1cHQpOworCQllcnJvciA9IHJlcXVlc3RfaXJxKFE0MF9JUlFfU0FNUExFLCBRNDBNb25vSW50ZXJydXB0LCAwLAorCQkJCSAgICAiUTQwIHNvdW5kIiwgUTQwSW50ZXJydXB0KTsKKwlpZiAoZXJyb3IgJiYgcHJpbnRrX3JhdGVsaW1pdCgpKQorCQlwcl9lcnIoIkNvdWxkbid0IHJlZ2lzdGVyIHNvdW5kIGludGVycnVwdFxuIik7CiAKIAltYXN0ZXJfb3V0Yiggc3BlZWQsIFNBTVBMRV9SQVRFX1JFRyk7CiAJbWFzdGVyX291dGIoIDEsU0FNUExFX0NMRUFSX1JFRyk7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaGRhL2hkYV9iZWVwLmMgYi9zb3VuZC9wY2kvaGRhL2hkYV9iZWVwLmMKaW5kZXggZTAwNDIxYy4uOTYwZmQ3OSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2hkYS9oZGFfYmVlcC5jCisrKyBiL3NvdW5kL3BjaS9oZGEvaGRhX2JlZXAuYwpAQCAtMTM1LDcgKzEzNSw2IEBACiAJc3RydWN0IGhkYV9iZWVwICpiZWVwID0gY29kZWMtPmJlZXA7CiAJaWYgKGJlZXApIHsKIAkJY2FuY2VsX3dvcmtfc3luYygmYmVlcC0+YmVlcF93b3JrKTsKLQkJZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsKIAogCQlpbnB1dF91bnJlZ2lzdGVyX2RldmljZShiZWVwLT5kZXYpOwogCQlrZnJlZShiZWVwKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9oZGEvaGRhX2NvZGVjLmMgYi9zb3VuZC9wY2kvaGRhL2hkYV9jb2RlYy5jCmluZGV4IGUxNmNmNjMuLmI3YmJhN2QgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9oZGEvaGRhX2NvZGVjLmMKKysrIGIvc291bmQvcGNpL2hkYS9oZGFfY29kZWMuYwpAQCAtMzczLDcgKzM3Myw3IEBACiAJdW5zb2wtPnF1ZXVlW3dwXSA9IHJlczsKIAl1bnNvbC0+cXVldWVbd3AgKyAxXSA9IHJlc19leDsKIAotCXNjaGVkdWxlX3dvcmsoJnVuc29sLT53b3JrKTsKKwlxdWV1ZV93b3JrKGJ1cy0+d29ya3EsICZ1bnNvbC0+d29yayk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTQzNywxNSArNDM3LDE3IEBACiAKIAlpZiAoIWJ1cykKIAkJcmV0dXJuIDA7Ci0JaWYgKGJ1cy0+dW5zb2wpIHsKLQkJZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsKKwlpZiAoYnVzLT53b3JrcSkKKwkJZmx1c2hfd29ya3F1ZXVlKGJ1cy0+d29ya3EpOworCWlmIChidXMtPnVuc29sKQogCQlrZnJlZShidXMtPnVuc29sKTsKLQl9CiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGNvZGVjLCBuLCAmYnVzLT5jb2RlY19saXN0LCBsaXN0KSB7CiAJCXNuZF9oZGFfY29kZWNfZnJlZShjb2RlYyk7CiAJfQogCWlmIChidXMtPm9wcy5wcml2YXRlX2ZyZWUpCiAJCWJ1cy0+b3BzLnByaXZhdGVfZnJlZShidXMpOworCWlmIChidXMtPndvcmtxKQorCQlkZXN0cm95X3dvcmtxdWV1ZShidXMtPndvcmtxKTsKIAlrZnJlZShidXMpOwogCXJldHVybiAwOwogfQpAQCAtNDg1LDYgKzQ4Nyw3IEBACiB7CiAJc3RydWN0IGhkYV9idXMgKmJ1czsKIAlpbnQgZXJyOworCWNoYXIgcW5hbWVbOF07CiAJc3RhdGljIHN0cnVjdCBzbmRfZGV2aWNlX29wcyBkZXZfb3BzID0gewogCQkuZGV2X3JlZ2lzdGVyID0gc25kX2hkYV9idXNfZGV2X3JlZ2lzdGVyLAogCQkuZGV2X2ZyZWUgPSBzbmRfaGRhX2J1c19kZXZfZnJlZSwKQEAgLTUxNCw2ICs1MTcsMTQgQEAKIAltdXRleF9pbml0KCZidXMtPmNtZF9tdXRleCk7CiAJSU5JVF9MSVNUX0hFQUQoJmJ1cy0+Y29kZWNfbGlzdCk7CiAKKwlzbnByaW50ZihxbmFtZSwgc2l6ZW9mKHFuYW1lKSwgImhkYSVkIiwgY2FyZC0+bnVtYmVyKTsKKwlidXMtPndvcmtxID0gY3JlYXRlX3dvcmtxdWV1ZShxbmFtZSk7CisJaWYgKCFidXMtPndvcmtxKSB7CisJCXNuZF9wcmludGsoS0VSTl9FUlIgImNhbm5vdCBjcmVhdGUgd29ya3F1ZXVlICVzXG4iLCBxbmFtZSk7CisJCWtmcmVlKGJ1cyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwogCWVyciA9IHNuZF9kZXZpY2VfbmV3KGNhcmQsIFNORFJWX0RFVl9CVVMsIGJ1cywgJmRldl9vcHMpOwogCWlmIChlcnIgPCAwKSB7CiAJCXNuZF9oZGFfYnVzX2ZyZWUoYnVzKTsKQEAgLTY4NCw3ICs2OTUsNyBAQAogCQlyZXR1cm47CiAjaWZkZWYgQ09ORklHX1NORF9IREFfUE9XRVJfU0FWRQogCWNhbmNlbF9kZWxheWVkX3dvcmsoJmNvZGVjLT5wb3dlcl93b3JrKTsKLQlmbHVzaF9zY2hlZHVsZWRfd29yaygpOworCWZsdXNoX3dvcmtxdWV1ZShjb2RlYy0+YnVzLT53b3JrcSk7CiAjZW5kaWYKIAlsaXN0X2RlbCgmY29kZWMtPmxpc3QpOwogCXNuZF9hcnJheV9mcmVlKCZjb2RlYy0+bWl4ZXJzKTsKQEAgLTczNSw2ICs3NDYsNyBAQAogCWNvZGVjLT5idXMgPSBidXM7CiAJY29kZWMtPmFkZHIgPSBjb2RlY19hZGRyOwogCW11dGV4X2luaXQoJmNvZGVjLT5zcGRpZl9tdXRleCk7CisJbXV0ZXhfaW5pdCgmY29kZWMtPmNvbnRyb2xfbXV0ZXgpOwogCWluaXRfaGRhX2NhY2hlKCZjb2RlYy0+YW1wX2NhY2hlLCBzaXplb2Yoc3RydWN0IGhkYV9hbXBfaW5mbykpOwogCWluaXRfaGRhX2NhY2hlKCZjb2RlYy0+Y21kX2NhY2hlLCBzaXplb2Yoc3RydWN0IGhkYV9jYWNoZV9oZWFkKSk7CiAJc25kX2FycmF5X2luaXQoJmNvZGVjLT5taXhlcnMsIHNpemVvZihzdHJ1Y3Qgc25kX2tjb250cm9sICopLCAzMik7CkBAIC0xMjcyLDcgKzEyODQsNyBAQAogCiAjaWZkZWYgQ09ORklHX1NORF9IREFfUE9XRVJfU0FWRQogCWNhbmNlbF9kZWxheWVkX3dvcmsoJmNvZGVjLT5wb3dlcl93b3JrKTsKLQlmbHVzaF9zY2hlZHVsZWRfd29yaygpOworCWZsdXNoX3dvcmtxdWV1ZShjb2RlYy0+YnVzLT53b3JrcSk7CiAjZW5kaWYKIAlzbmRfaGRhX2N0bHNfY2xlYXIoY29kZWMpOwogCS8qIHJlbGFzZSBQQ01zICovCkBAIC0xNDE4LDEyICsxNDMwLDEyIEBACiAJdW5zaWduZWQgbG9uZyBwdmFsOwogCWludCBlcnI7CiAKLQltdXRleF9sb2NrKCZjb2RlYy0+c3BkaWZfbXV0ZXgpOyAvKiByZXVzZSBzcGRpZl9tdXRleCAqLworCW11dGV4X2xvY2soJmNvZGVjLT5jb250cm9sX211dGV4KTsKIAlwdmFsID0ga2NvbnRyb2wtPnByaXZhdGVfdmFsdWU7CiAJa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgPSBwdmFsICYgfkFNUF9WQUxfSURYX01BU0s7IC8qIGluZGV4IDAgKi8KIAllcnIgPSBzbmRfaGRhX21peGVyX2FtcF9zd2l0Y2hfZ2V0KGtjb250cm9sLCB1Y29udHJvbCk7CiAJa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgPSBwdmFsOwotCW11dGV4X3VubG9jaygmY29kZWMtPnNwZGlmX211dGV4KTsKKwltdXRleF91bmxvY2soJmNvZGVjLT5jb250cm9sX211dGV4KTsKIAlyZXR1cm4gZXJyOwogfQogRVhQT1JUX1NZTUJPTF9IREEoc25kX2hkYV9taXhlcl9iaW5kX3N3aXRjaF9nZXQpOwpAQCAtMTQzNSw3ICsxNDQ3LDcgQEAKIAl1bnNpZ25lZCBsb25nIHB2YWw7CiAJaW50IGksIGluZGljZXMsIGVyciA9IDAsIGNoYW5nZSA9IDA7CiAKLQltdXRleF9sb2NrKCZjb2RlYy0+c3BkaWZfbXV0ZXgpOyAvKiByZXVzZSBzcGRpZl9tdXRleCAqLworCW11dGV4X2xvY2soJmNvZGVjLT5jb250cm9sX211dGV4KTsKIAlwdmFsID0ga2NvbnRyb2wtPnByaXZhdGVfdmFsdWU7CiAJaW5kaWNlcyA9IChwdmFsICYgQU1QX1ZBTF9JRFhfTUFTSykgPj4gQU1QX1ZBTF9JRFhfU0hJRlQ7CiAJZm9yIChpID0gMDsgaSA8IGluZGljZXM7IGkrKykgewpAQCAtMTQ0Nyw3ICsxNDU5LDcgQEAKIAkJY2hhbmdlIHw9IGVycjsKIAl9CiAJa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgPSBwdmFsOwotCW11dGV4X3VubG9jaygmY29kZWMtPnNwZGlmX211dGV4KTsKKwltdXRleF91bmxvY2soJmNvZGVjLT5jb250cm9sX211dGV4KTsKIAlyZXR1cm4gZXJyIDwgMCA/IGVyciA6IGNoYW5nZTsKIH0KIEVYUE9SVF9TWU1CT0xfSERBKHNuZF9oZGFfbWl4ZXJfYmluZF9zd2l0Y2hfcHV0KTsKQEAgLTE0NjIsMTIgKzE0NzQsMTIgQEAKIAlzdHJ1Y3QgaGRhX2JpbmRfY3RscyAqYzsKIAlpbnQgZXJyOwogCi0JbXV0ZXhfbG9jaygmY29kZWMtPnNwZGlmX211dGV4KTsgLyogcmV1c2Ugc3BkaWZfbXV0ZXggKi8KKwltdXRleF9sb2NrKCZjb2RlYy0+Y29udHJvbF9tdXRleCk7CiAJYyA9IChzdHJ1Y3QgaGRhX2JpbmRfY3RscyAqKWtjb250cm9sLT5wcml2YXRlX3ZhbHVlOwogCWtjb250cm9sLT5wcml2YXRlX3ZhbHVlID0gKmMtPnZhbHVlczsKIAllcnIgPSBjLT5vcHMtPmluZm8oa2NvbnRyb2wsIHVpbmZvKTsKIAlrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSA9IChsb25nKWM7Ci0JbXV0ZXhfdW5sb2NrKCZjb2RlYy0+c3BkaWZfbXV0ZXgpOworCW11dGV4X3VubG9jaygmY29kZWMtPmNvbnRyb2xfbXV0ZXgpOwogCXJldHVybiBlcnI7CiB9CiBFWFBPUlRfU1lNQk9MX0hEQShzbmRfaGRhX21peGVyX2JpbmRfY3Rsc19pbmZvKTsKQEAgLTE0NzksMTIgKzE0OTEsMTIgQEAKIAlzdHJ1Y3QgaGRhX2JpbmRfY3RscyAqYzsKIAlpbnQgZXJyOwogCi0JbXV0ZXhfbG9jaygmY29kZWMtPnNwZGlmX211dGV4KTsgLyogcmV1c2Ugc3BkaWZfbXV0ZXggKi8KKwltdXRleF9sb2NrKCZjb2RlYy0+Y29udHJvbF9tdXRleCk7CiAJYyA9IChzdHJ1Y3QgaGRhX2JpbmRfY3RscyAqKWtjb250cm9sLT5wcml2YXRlX3ZhbHVlOwogCWtjb250cm9sLT5wcml2YXRlX3ZhbHVlID0gKmMtPnZhbHVlczsKIAllcnIgPSBjLT5vcHMtPmdldChrY29udHJvbCwgdWNvbnRyb2wpOwogCWtjb250cm9sLT5wcml2YXRlX3ZhbHVlID0gKGxvbmcpYzsKLQltdXRleF91bmxvY2soJmNvZGVjLT5zcGRpZl9tdXRleCk7CisJbXV0ZXhfdW5sb2NrKCZjb2RlYy0+Y29udHJvbF9tdXRleCk7CiAJcmV0dXJuIGVycjsKIH0KIEVYUE9SVF9TWU1CT0xfSERBKHNuZF9oZGFfbWl4ZXJfYmluZF9jdGxzX2dldCk7CkBAIC0xNDk3LDcgKzE1MDksNyBAQAogCXVuc2lnbmVkIGxvbmcgKnZhbHM7CiAJaW50IGVyciA9IDAsIGNoYW5nZSA9IDA7CiAKLQltdXRleF9sb2NrKCZjb2RlYy0+c3BkaWZfbXV0ZXgpOyAvKiByZXVzZSBzcGRpZl9tdXRleCAqLworCW11dGV4X2xvY2soJmNvZGVjLT5jb250cm9sX211dGV4KTsKIAljID0gKHN0cnVjdCBoZGFfYmluZF9jdGxzICopa2NvbnRyb2wtPnByaXZhdGVfdmFsdWU7CiAJZm9yICh2YWxzID0gYy0+dmFsdWVzOyAqdmFsczsgdmFscysrKSB7CiAJCWtjb250cm9sLT5wcml2YXRlX3ZhbHVlID0gKnZhbHM7CkBAIC0xNTA3LDcgKzE1MTksNyBAQAogCQljaGFuZ2UgfD0gZXJyOwogCX0KIAlrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSA9IChsb25nKWM7Ci0JbXV0ZXhfdW5sb2NrKCZjb2RlYy0+c3BkaWZfbXV0ZXgpOworCW11dGV4X3VubG9jaygmY29kZWMtPmNvbnRyb2xfbXV0ZXgpOwogCXJldHVybiBlcnIgPCAwID8gZXJyIDogY2hhbmdlOwogfQogRVhQT1JUX1NZTUJPTF9IREEoc25kX2hkYV9taXhlcl9iaW5kX2N0bHNfcHV0KTsKQEAgLTE1MTksMTIgKzE1MzEsMTIgQEAKIAlzdHJ1Y3QgaGRhX2JpbmRfY3RscyAqYzsKIAlpbnQgZXJyOwogCi0JbXV0ZXhfbG9jaygmY29kZWMtPnNwZGlmX211dGV4KTsgLyogcmV1c2Ugc3BkaWZfbXV0ZXggKi8KKwltdXRleF9sb2NrKCZjb2RlYy0+Y29udHJvbF9tdXRleCk7CiAJYyA9IChzdHJ1Y3QgaGRhX2JpbmRfY3RscyAqKWtjb250cm9sLT5wcml2YXRlX3ZhbHVlOwogCWtjb250cm9sLT5wcml2YXRlX3ZhbHVlID0gKmMtPnZhbHVlczsKIAllcnIgPSBjLT5vcHMtPnRsdihrY29udHJvbCwgb3BfZmxhZywgc2l6ZSwgdGx2KTsKIAlrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSA9IChsb25nKWM7Ci0JbXV0ZXhfdW5sb2NrKCZjb2RlYy0+c3BkaWZfbXV0ZXgpOworCW11dGV4X3VubG9jaygmY29kZWMtPmNvbnRyb2xfbXV0ZXgpOwogCXJldHVybiBlcnI7CiB9CiBFWFBPUlRfU1lNQk9MX0hEQShzbmRfaGRhX21peGVyX2JpbmRfdGx2KTsKQEAgLTI3MTIsNiArMjcyNCw2NyBAQAogRVhQT1JUX1NZTUJPTF9IREEoc25kX2hkYV9jaGVja19ib2FyZF9jb25maWcpOwogCiAvKioKKyAqIHNuZF9oZGFfY2hlY2tfYm9hcmRfY29kZWNfc2lkX2NvbmZpZyAtIGNvbXBhcmUgdGhlIGN1cnJlbnQgY29kZWMKKwkJCQkgICAgICAgICAgc3Vic3lzdGVtIElEIHdpdGggdGhlCisJCQkJCSAgY29uZmlnIHRhYmxlCisKKwkgICBUaGlzIGlzIGltcG9ydGFudCBmb3IgR2F0ZXdheSBub3RlYm9va3Mgd2l0aCBTQjQ1MCBIREEgQXVkaW8KKwkgICB3aGVyZSB0aGUgdmVuZG9yIElEIG9mIHRoZSBQQ0kgZGV2aWNlIGlzOgorCQlBVEkgVGVjaG5vbG9naWVzIEluYyBTQjQ1MCBIREEgQXVkaW8gWzEwMDI6NDM3Yl0KKwkgICBhbmQgdGhlIHZlbmRvci9zdWJ2ZW5kb3IgYXJlIGZvdW5kIG9ubHkgYXQgdGhlIGNvZGVjLgorCisgKiBAY29kZWM6IHRoZSBIREEgY29kZWMKKyAqIEBudW1fY29uZmlnczogbnVtYmVyIG9mIGNvbmZpZyBlbnVtcworICogQG1vZGVsczogYXJyYXkgb2YgbW9kZWwgbmFtZSBzdHJpbmdzCisgKiBAdGJsOiBjb25maWd1cmF0aW9uIHRhYmxlLCB0ZXJtaW5hdGVkIGJ5IG51bGwgZW50cmllcworICoKKyAqIENvbXBhcmVzIHRoZSBtb2RlbG5hbWUgb3IgUENJIHN1YnN5c3RlbSBpZCBvZiB0aGUgY3VycmVudCBjb2RlYyB3aXRoIHRoZQorICogZ2l2ZW4gY29uZmlndXJhdGlvbiB0YWJsZS4gIElmIGEgbWF0Y2hpbmcgZW50cnkgaXMgZm91bmQsIHJldHVybnMgaXRzCisgKiBjb25maWcgdmFsdWUgKHN1cHBvc2VkIHRvIGJlIDAgb3IgcG9zaXRpdmUpLgorICoKKyAqIElmIG5vIGVudHJpZXMgYXJlIG1hdGNoaW5nLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBhIG5lZ2F0aXZlIHZhbHVlLgorICovCitpbnQgc25kX2hkYV9jaGVja19ib2FyZF9jb2RlY19zaWRfY29uZmlnKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLAorCQkJICAgICAgIGludCBudW1fY29uZmlncywgY29uc3QgY2hhciAqKm1vZGVscywKKwkJCSAgICAgICBjb25zdCBzdHJ1Y3Qgc25kX3BjaV9xdWlyayAqdGJsKQoreworCWNvbnN0IHN0cnVjdCBzbmRfcGNpX3F1aXJrICpxOworCisJLyogU2VhcmNoIGZvciBjb2RlYyBJRCAqLworCWZvciAocSA9IHRibDsgcS0+c3VidmVuZG9yOyBxKyspIHsKKwkJdW5zaWduZWQgbG9uZyB2ZW5kb3JpZCA9IChxLT5zdWJkZXZpY2UpIHwgKHEtPnN1YnZlbmRvciA8PCAxNik7CisKKwkJaWYgKHZlbmRvcmlkID09IGNvZGVjLT5zdWJzeXN0ZW1faWQpCisJCQlicmVhazsKKwl9CisKKwlpZiAoIXEtPnN1YnZlbmRvcikKKwkJcmV0dXJuIC0xOworCisJdGJsID0gcTsKKworCWlmICh0YmwtPnZhbHVlID49IDAgJiYgdGJsLT52YWx1ZSA8IG51bV9jb25maWdzKSB7CisjaWZkZWYgQ09ORklHX1NORF9ERUJVR19ERVRFQ1QKKwkJY2hhciB0bXBbMTBdOworCQljb25zdCBjaGFyICptb2RlbCA9IE5VTEw7CisJCWlmIChtb2RlbHMpCisJCQltb2RlbCA9IG1vZGVsc1t0YmwtPnZhbHVlXTsKKwkJaWYgKCFtb2RlbCkgeworCQkJc3ByaW50Zih0bXAsICIjJWQiLCB0YmwtPnZhbHVlKTsKKwkJCW1vZGVsID0gdG1wOworCQl9CisJCXNuZF9wcmludGRkKEtFUk5fSU5GTyAiaGRhX2NvZGVjOiBtb2RlbCAnJXMnIGlzIHNlbGVjdGVkICIKKwkJCSAgICAiZm9yIGNvbmZpZyAleDoleCAoJXMpXG4iLAorCQkJICAgIG1vZGVsLCB0YmwtPnN1YnZlbmRvciwgdGJsLT5zdWJkZXZpY2UsCisJCQkgICAgKHRibC0+bmFtZSA/IHRibC0+bmFtZSA6ICJVbmtub3duIGRldmljZSIpKTsKKyNlbmRpZgorCQlyZXR1cm4gdGJsLT52YWx1ZTsKKwl9CisJcmV0dXJuIC0xOworfQorRVhQT1JUX1NZTUJPTF9IREEoc25kX2hkYV9jaGVja19ib2FyZF9jb2RlY19zaWRfY29uZmlnKTsKKworLyoqCiAgKiBzbmRfaGRhX2FkZF9uZXdfY3RscyAtIGNyZWF0ZSBjb250cm9scyBmcm9tIHRoZSBhcnJheQogICogQGNvZGVjOiB0aGUgSERBIGNvZGVjCiAgKiBAa25ldzogdGhlIGFycmF5IG9mIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3CkBAIC0yODAzLDcgKzI4NzYsNyBAQAogCQlyZXR1cm47CiAJaWYgKHBvd2VyX3NhdmUoY29kZWMpKSB7CiAJCWNvZGVjLT5wb3dlcl90cmFuc2l0aW9uID0gMTsgLyogYXZvaWQgcmVlbnRyYW5jZSAqLwotCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmNvZGVjLT5wb3dlcl93b3JrLAorCQlxdWV1ZV9kZWxheWVkX3dvcmsoY29kZWMtPmJ1cy0+d29ya3EsICZjb2RlYy0+cG93ZXJfd29yaywKIAkJCQltc2Vjc190b19qaWZmaWVzKHBvd2VyX3NhdmUoY29kZWMpICogMTAwMCkpOwogCX0KIH0KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9oZGEvaGRhX2NvZGVjLmggYi9zb3VuZC9wY2kvaGRhL2hkYV9jb2RlYy5oCmluZGV4IDcyOWZjNzY0Li41ODEwZWY1IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaGRhL2hkYV9jb2RlYy5oCisrKyBiL3NvdW5kL3BjaS9oZGEvaGRhX2NvZGVjLmgKQEAgLTYxNCw2ICs2MTQsNyBAQAogCiAJLyogdW5zb2xpY2l0ZWQgZXZlbnQgcXVldWUgKi8KIAlzdHJ1Y3QgaGRhX2J1c191bnNvbGljaXRlZCAqdW5zb2w7CisJc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKndvcmtxOwkvKiBjb21tb24gd29ya3F1ZXVlIGZvciBjb2RlY3MgKi8KIAogCS8qIGFzc2lnbmVkIFBDTXMgKi8KIAlERUNMQVJFX0JJVE1BUChwY21fZGV2X2JpdHMsIFNORFJWX1BDTV9ERVZJQ0VTKTsKQEAgLTc3MSw2ICs3NzIsNyBAQAogCXN0cnVjdCBoZGFfY2FjaGVfcmVjIGNtZF9jYWNoZTsJLyogY2FjaGUgZm9yIG90aGVyIGNvbW1hbmRzICovCiAKIAlzdHJ1Y3QgbXV0ZXggc3BkaWZfbXV0ZXg7CisJc3RydWN0IG11dGV4IGNvbnRyb2xfbXV0ZXg7CiAJdW5zaWduZWQgaW50IHNwZGlmX3N0YXR1czsJLyogSUVDOTU4IHN0YXR1cyBiaXRzICovCiAJdW5zaWduZWQgc2hvcnQgc3BkaWZfY3RsczsJLyogU1BESUYgY29udHJvbCBiaXRzICovCiAJdW5zaWduZWQgaW50IHNwZGlmX2luX2VuYWJsZTsJLyogU1BESUYgaW5wdXQgZW5hYmxlPyAqLwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2hkYS9oZGFfaW50ZWwuYyBiL3NvdW5kL3BjaS9oZGEvaGRhX2ludGVsLmMKaW5kZXggZjA0ZGUxMS4uMTFlNzkxYiAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2hkYS9oZGFfaW50ZWwuYworKysgYi9zb3VuZC9wY2kvaGRhL2hkYV9pbnRlbC5jCkBAIC05OTYsMTAgKzk5NiwxMSBAQAogCQkJCXNwaW5fdW5sb2NrKCZjaGlwLT5yZWdfbG9jayk7CiAJCQkJc25kX3BjbV9wZXJpb2RfZWxhcHNlZChhenhfZGV2LT5zdWJzdHJlYW0pOwogCQkJCXNwaW5fbG9jaygmY2hpcC0+cmVnX2xvY2spOwotCQkJfSBlbHNlIHsKKwkJCX0gZWxzZSBpZiAoY2hpcC0+YnVzICYmIGNoaXAtPmJ1cy0+d29ya3EpIHsKIAkJCQkvKiBib2d1cyBJUlEsIHByb2Nlc3MgaXQgbGF0ZXIgKi8KIAkJCQlhenhfZGV2LT5pcnFfcGVuZGluZyA9IDE7Ci0JCQkJc2NoZWR1bGVfd29yaygmY2hpcC0+aXJxX3BlbmRpbmdfd29yayk7CisJCQkJcXVldWVfd29yayhjaGlwLT5idXMtPndvcmtxLAorCQkJCQkgICAmY2hpcC0+aXJxX3BlbmRpbmdfd29yayk7CiAJCQl9CiAJCX0KIAl9CkBAIC0xNzQxLDcgKzE3NDIsNiBAQAogCWZvciAoaSA9IDA7IGkgPCBjaGlwLT5udW1fc3RyZWFtczsgaSsrKQogCQljaGlwLT5henhfZGV2W2ldLmlycV9wZW5kaW5nID0gMDsKIAlzcGluX3VubG9ja19pcnEoJmNoaXAtPnJlZ19sb2NrKTsKLQlmbHVzaF9zY2hlZHVsZWRfd29yaygpOwogfQogCiBzdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIGF6eF9wY21fb3BzID0gewpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2hkYS9oZGFfbG9jYWwuaCBiL3NvdW5kL3BjaS9oZGEvaGRhX2xvY2FsLmgKaW5kZXggNmYyZmUwZi4uMWRkODcxNiAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2hkYS9oZGFfbG9jYWwuaAorKysgYi9zb3VuZC9wY2kvaGRhL2hkYV9sb2NhbC5oCkBAIC0yOTYsNiArMjk2LDkgQEAKIGludCBzbmRfaGRhX2NoZWNrX2JvYXJkX2NvbmZpZyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgaW50IG51bV9jb25maWdzLAogCQkJICAgICAgIGNvbnN0IGNoYXIgKiptb2RlbG5hbWVzLAogCQkJICAgICAgIGNvbnN0IHN0cnVjdCBzbmRfcGNpX3F1aXJrICpwY2lfbGlzdCk7CitpbnQgc25kX2hkYV9jaGVja19ib2FyZF9jb2RlY19zaWRfY29uZmlnKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1fY29uZmlncywgY29uc3QgY2hhciAqKm1vZGVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3Qgc25kX3BjaV9xdWlyayAqdGJsKTsKIGludCBzbmRfaGRhX2FkZF9uZXdfY3RscyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywKIAkJCSBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyAqa25ldyk7CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9oZGEvcGF0Y2hfYW5hbG9nLmMgYi9zb3VuZC9wY2kvaGRhL3BhdGNoX2FuYWxvZy5jCmluZGV4IDI2MjQ3Y2YuLjJlNzM3MWUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9oZGEvcGF0Y2hfYW5hbG9nLmMKKysrIGIvc291bmQvcGNpL2hkYS9wYXRjaF9hbmFsb2cuYwpAQCAtMzkwMCw2ICszOTAwLDcgQEAKIAogc3RhdGljIHN0cnVjdCBzbmRfcGNpX3F1aXJrIGFkMTg4NGFfY2ZnX3RibFtdID0gewogCVNORF9QQ0lfUVVJUksoMHgxMDNjLCAweDMwMzAsICJIUCIsIEFEMTg4NEFfTU9CSUxFKSwKKwlTTkRfUENJX1FVSVJLKDB4MTAzYywgMHgzMDM3LCAiSFAgMjIzMHMiLCBBRDE4ODRBX0xBUFRPUCksCiAJU05EX1BDSV9RVUlSSygweDEwM2MsIDB4MzA1NiwgIkhQIiwgQUQxODg0QV9NT0JJTEUpLAogCVNORF9QQ0lfUVVJUksoMHgxMDNjLCAweDMwZTYsICJIUCA2NzMwYiIsIEFEMTg4NEFfTEFQVE9QKSwKIAlTTkRfUENJX1FVSVJLKDB4MTAzYywgMHgzMGU3LCAiSFAgRWxpdGVCb29rIDg1MzBwIiwgQUQxODg0QV9MQVBUT1ApLApAQCAtNDI2MiwxMyArNDI2MywxMyBAQAogCXNwZWMtPm51bV9hZGNfbmlkcyA9IEFSUkFZX1NJWkUoYWQxODgyX2FkY19uaWRzKTsKIAlzcGVjLT5hZGNfbmlkcyA9IGFkMTg4Ml9hZGNfbmlkczsKIAlzcGVjLT5jYXBzcmNfbmlkcyA9IGFkMTg4Ml9jYXBzcmNfbmlkczsKLQlpZiAoY29kZWMtPnZlbmRvcl9pZCA9PSAweDExZDE4ODIpCisJaWYgKGNvZGVjLT52ZW5kb3JfaWQgPT0gMHgxMWQ0MTg4MikKIAkJc3BlYy0+aW5wdXRfbXV4ID0gJmFkMTg4Ml9jYXB0dXJlX3NvdXJjZTsKIAllbHNlCiAJCXNwZWMtPmlucHV0X211eCA9ICZhZDE4ODJhX2NhcHR1cmVfc291cmNlOwogCXNwZWMtPm51bV9taXhlcnMgPSAyOwogCXNwZWMtPm1peGVyc1swXSA9IGFkMTg4Ml9iYXNlX21peGVyczsKLQlpZiAoY29kZWMtPnZlbmRvcl9pZCA9PSAweDExZDE4ODIpCisJaWYgKGNvZGVjLT52ZW5kb3JfaWQgPT0gMHgxMWQ0MTg4MikKIAkJc3BlYy0+bWl4ZXJzWzFdID0gYWQxODgyX2xvb3BiYWNrX21peGVyczsKIAllbHNlCiAJCXNwZWMtPm1peGVyc1sxXSA9IGFkMTg4MmFfbG9vcGJhY2tfbWl4ZXJzOwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2hkYS9wYXRjaF9udmhkbWkuYyBiL3NvdW5kL3BjaS9oZGEvcGF0Y2hfbnZoZG1pLmMKaW5kZXggMDI3MGZkYS4uZDU3ZDgxMyAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2hkYS9wYXRjaF9udmhkbWkuYworKysgYi9zb3VuZC9wY2kvaGRhL3BhdGNoX252aGRtaS5jCkBAIC0xNjAsMTQgKzE2MCwxOCBAQAogICovCiBzdGF0aWMgc3RydWN0IGhkYV9jb2RlY19wcmVzZXQgc25kX2hkYV9wcmVzZXRfbnZoZG1pW10gPSB7CiAJeyAuaWQgPSAweDEwZGUwMDAyLCAubmFtZSA9ICJNQ1A3OCBIRE1JIiwgLnBhdGNoID0gcGF0Y2hfbnZoZG1pIH0sCisJeyAuaWQgPSAweDEwZGUwMDA2LCAubmFtZSA9ICJNQ1A3OCBIRE1JIiwgLnBhdGNoID0gcGF0Y2hfbnZoZG1pIH0sCiAJeyAuaWQgPSAweDEwZGUwMDA3LCAubmFtZSA9ICJNQ1A3QSBIRE1JIiwgLnBhdGNoID0gcGF0Y2hfbnZoZG1pIH0sCiAJeyAuaWQgPSAweDEwZGUwMDY3LCAubmFtZSA9ICJNQ1A2NyBIRE1JIiwgLnBhdGNoID0gcGF0Y2hfbnZoZG1pIH0sCisJeyAuaWQgPSAweDEwZGU4MDAxLCAubmFtZSA9ICJNQ1A3MyBIRE1JIiwgLnBhdGNoID0gcGF0Y2hfbnZoZG1pIH0sCiAJe30gLyogdGVybWluYXRvciAqLwogfTsKIAogTU9EVUxFX0FMSUFTKCJzbmQtaGRhLWNvZGVjLWlkOjEwZGUwMDAyIik7CitNT0RVTEVfQUxJQVMoInNuZC1oZGEtY29kZWMtaWQ6MTBkZTAwMDYiKTsKIE1PRFVMRV9BTElBUygic25kLWhkYS1jb2RlYy1pZDoxMGRlMDAwNyIpOwogTU9EVUxFX0FMSUFTKCJzbmQtaGRhLWNvZGVjLWlkOjEwZGUwMDY3Iik7CitNT0RVTEVfQUxJQVMoInNuZC1oZGEtY29kZWMtaWQ6MTBkZTgwMDEiKTsKIAogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJOdmlkaWEgSERNSSBIRC1hdWRpbyBjb2RlYyIpOwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2hkYS9wYXRjaF9yZWFsdGVrLmMgYi9zb3VuZC9wY2kvaGRhL3BhdGNoX3JlYWx0ZWsuYwppbmRleCA5MDY1ZWJmLi44MmRkMDg0IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaGRhL3BhdGNoX3JlYWx0ZWsuYworKysgYi9zb3VuZC9wY2kvaGRhL3BhdGNoX3JlYWx0ZWsuYwpAQCAtMTUwMiwxMSArMTUwMiwxMSBAQAogCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwogCWludCBlcnI7CiAKLQltdXRleF9sb2NrKCZjb2RlYy0+c3BkaWZfbXV0ZXgpOyAvKiByZXVzZSBzcGRpZl9tdXRleCAqLworCW11dGV4X2xvY2soJmNvZGVjLT5jb250cm9sX211dGV4KTsKIAlrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSA9IEhEQV9DT01QT1NFX0FNUF9WQUwoc3BlYy0+YWRjX25pZHNbMF0sIDMsIDAsCiAJCQkJCQkgICAgICBIREFfSU5QVVQpOwogCWVyciA9IHNuZF9oZGFfbWl4ZXJfYW1wX3ZvbHVtZV9pbmZvKGtjb250cm9sLCB1aW5mbyk7Ci0JbXV0ZXhfdW5sb2NrKCZjb2RlYy0+c3BkaWZfbXV0ZXgpOyAvKiByZXVzZSBzcGRpZl9tdXRleCAqLworCW11dGV4X3VubG9jaygmY29kZWMtPmNvbnRyb2xfbXV0ZXgpOwogCXJldHVybiBlcnI7CiB9CiAKQEAgLTE1MTcsMTEgKzE1MTcsMTEgQEAKIAlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKIAlpbnQgZXJyOwogCi0JbXV0ZXhfbG9jaygmY29kZWMtPnNwZGlmX211dGV4KTsgLyogcmV1c2Ugc3BkaWZfbXV0ZXggKi8KKwltdXRleF9sb2NrKCZjb2RlYy0+Y29udHJvbF9tdXRleCk7CiAJa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgPSBIREFfQ09NUE9TRV9BTVBfVkFMKHNwZWMtPmFkY19uaWRzWzBdLCAzLCAwLAogCQkJCQkJICAgICAgSERBX0lOUFVUKTsKIAllcnIgPSBzbmRfaGRhX21peGVyX2FtcF90bHYoa2NvbnRyb2wsIG9wX2ZsYWcsIHNpemUsIHRsdik7Ci0JbXV0ZXhfdW5sb2NrKCZjb2RlYy0+c3BkaWZfbXV0ZXgpOyAvKiByZXVzZSBzcGRpZl9tdXRleCAqLworCW11dGV4X3VubG9jaygmY29kZWMtPmNvbnRyb2xfbXV0ZXgpOwogCXJldHVybiBlcnI7CiB9CiAKQEAgLTE1MzcsMTEgKzE1MzcsMTEgQEAKIAl1bnNpZ25lZCBpbnQgYWRjX2lkeCA9IHNuZF9jdGxfZ2V0X2lvZmZpZHgoa2NvbnRyb2wsICZ1Y29udHJvbC0+aWQpOwogCWludCBlcnI7CiAKLQltdXRleF9sb2NrKCZjb2RlYy0+c3BkaWZfbXV0ZXgpOyAvKiByZXVzZSBzcGRpZl9tdXRleCAqLworCW11dGV4X2xvY2soJmNvZGVjLT5jb250cm9sX211dGV4KTsKIAlrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSA9IEhEQV9DT01QT1NFX0FNUF9WQUwoc3BlYy0+YWRjX25pZHNbYWRjX2lkeF0sCiAJCQkJCQkgICAgICAzLCAwLCBIREFfSU5QVVQpOwogCWVyciA9IGZ1bmMoa2NvbnRyb2wsIHVjb250cm9sKTsKLQltdXRleF91bmxvY2soJmNvZGVjLT5zcGRpZl9tdXRleCk7IC8qIHJldXNlIHNwZGlmX211dGV4ICovCisJbXV0ZXhfdW5sb2NrKCZjb2RlYy0+Y29udHJvbF9tdXRleCk7CiAJcmV0dXJuIGVycjsKIH0KIApAQCAtODQ2MSw2ICs4NDYxLDEwIEBACiAJU05EX1BDSV9RVUlSSygweDEwMjUsIDB4MDEyMSwgIkFjZXIgQXNwaXJlIDU5MjBHIiwgQUxDODgzX0FDRVJfQVNQSVJFKSwKIAlTTkRfUENJX1FVSVJLKDB4MTAyNSwgMHgwMTNlLCAiQWNlciBBc3BpcmUgNDkzMEciLAogCQlBTEM4ODhfQUNFUl9BU1BJUkVfNDkzMEcpLAorCVNORF9QQ0lfUVVJUksoMHgxMDI1LCAweDAxM2YsICJBY2VyIEFzcGlyZSA1OTMwRyIsCisJCUFMQzg4OF9BQ0VSX0FTUElSRV80OTMwRyksCisJU05EX1BDSV9RVUlSSygweDEwMjUsIDB4MDE1ZSwgIkFjZXIgQXNwaXJlIDY5MzBHIiwKKwkJQUxDODg4X0FDRVJfQVNQSVJFXzQ5MzBHKSwKIAlTTkRfUENJX1FVSVJLKDB4MTAyNSwgMCwgIkFjZXIgbGFwdG9wIiwgQUxDODgzX0FDRVIpLCAvKiBkZWZhdWx0IEFjZXIgKi8KIAlTTkRfUENJX1FVSVJLKDB4MTAyOCwgMHgwMjBkLCAiRGVsbCBJbnNwaXJvbiA1MzAiLCBBTEM4ODhfNlNUX0RFTEwpLAogCVNORF9QQ0lfUVVJUksoMHgxMDNjLCAweDJhM2QsICJIUCBQYXZpbGxpb24iLCBBTEM4ODNfNlNUX0RJRyksCkBAIC04NTIyLDYgKzg1MjYsNyBAQAogCVNORF9QQ0lfUVVJUksoMHgxOTkxLCAweDU2MjUsICJIYWllciBXNjYiLCBBTEM4ODNfSEFJRVJfVzY2KSwKIAlTTkRfUENJX1FVSVJLKDB4ODA4NiwgMHgwMDAxLCAiREczM0JVQyIsIEFMQzg4M18zU1RfNmNoX0lOVEVMKSwKIAlTTkRfUENJX1FVSVJLKDB4ODA4NiwgMHgwMDAyLCAiREczM0ZCQyIsIEFMQzg4M18zU1RfNmNoX0lOVEVMKSwKKwlTTkRfUENJX1FVSVJLKDB4ODA4NiwgMHgwMDIyLCAiRFg1OFNPIiwgQUxDODgzXzNTVF82Y2hfSU5URUwpLAogCVNORF9QQ0lfUVVJUksoMHg4MDg2LCAweGQ2MDEsICJEMTAyR0dDIiwgQUxDODgzXzNTVF82Y2gpLAogCXt9CiB9OwpAQCAtMTA1NjgsNiArMTA1NzMsNyBAQAogCVNORF9QQ0lfUVVJUksoMHgxMGNmLCAweDE0MmQsICJGdWppdHN1IExpZmVib29rIEU4NDEwIiwgQUxDMjYyX0ZVSklUU1UpLAogCVNORF9QQ0lfUVVJUksoMHgxNDRkLCAweGMwMzIsICJTYW1zdW5nIFExIFVsdHJhIiwgQUxDMjYyX1VMVFJBKSwKIAlTTkRfUENJX1FVSVJLKDB4MTQ0ZCwgMHhjMDM5LCAiU2Ftc3VuZyBRMVUgRUwiLCBBTEMyNjJfVUxUUkEpLAorCVNORF9QQ0lfUVVJUksoMHgxNDRkLCAweGM1MTAsICJTYW1zdW5nIFE0NSIsIEFMQzI2Ml9ISVBQTyksCiAJU05EX1BDSV9RVUlSSygweDE3YWEsIDB4Mzg0ZSwgIkxlbm92byAzMDAwIHk0MTAiLCBBTEMyNjJfTEVOT1ZPXzMwMDApLAogCVNORF9QQ0lfUVVJUksoMHgxN2ZmLCAweDA1NjAsICJCZW5xIEVEOCIsIEFMQzI2Ml9CRU5RX0VEOCksCiAJU05EX1BDSV9RVUlSSygweDE3ZmYsIDB4MDU4ZCwgIkJlbnEgVDMxLTE2IiwgQUxDMjYyX0JFTlFfVDMxKSwKQEAgLTExNjg5LDYgKzExNjk1LDcgQEAKIAlTTkRfUENJX1FVSVJLKDB4MTAyNSwgMHgwMTViLCAiQWNlciBBc3BpcmUgT25lIiwKIAkJCQkJCUFMQzI2OF9BQ0VSX0FTUElSRV9PTkUpLAogCVNORF9QQ0lfUVVJUksoMHgxMDI4LCAweDAyNTMsICJEZWxsIE9FTSIsIEFMQzI2OF9ERUxMKSwKKwlTTkRfUENJX1FVSVJLKDB4MTAyOCwgMHgwMmIwLCAiRGVsbCBJbnNwaXJvbiBNaW5pOSIsIEFMQzI2OF9ERUxMKSwKIAlTTkRfUENJX1FVSVJLKDB4MTAzYywgMHgzMGNjLCAiVE9TSElCQSIsIEFMQzI2OF9UT1NISUJBKSwKIAlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxMjA1LCAiQVNVUyBXN0oiLCBBTEMyNjhfM1NUKSwKIAlTTkRfUENJX1FVSVJLKDB4MTE3OSwgMHhmZjEwLCAiVE9TSElCQSBBMjA1IiwgQUxDMjY4X1RPU0hJQkEpLApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2hkYS9wYXRjaF9zaWdtYXRlbC5jIGIvc291bmQvcGNpL2hkYS9wYXRjaF9zaWdtYXRlbC5jCmluZGV4IDM1YjgzZGMuLmMzOWRlZWIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9oZGEvcGF0Y2hfc2lnbWF0ZWwuYworKysgYi9zb3VuZC9wY2kvaGRhL3BhdGNoX3NpZ21hdGVsLmMKQEAgLTU1LDcgKzU1LDggQEAKIAlTVEFDXzkyMDBfREVMTF9NMjUsCiAJU1RBQ185MjAwX0RFTExfTTI2LAogCVNUQUNfOTIwMF9ERUxMX00yNywKLQlTVEFDXzkyMDBfR0FURVdBWSwKKwlTVEFDXzkyMDBfTTQsCisJU1RBQ185MjAwX000XzIsCiAJU1RBQ185MjAwX1BBTkFTT05JQywKIAlTVEFDXzkyMDBfTU9ERUxTCiB9OwpAQCAtODksMTQgKzkwLDE5IEBACiAJU1RBQ19ERUxMX000XzIsCiAJU1RBQ19ERUxMX000XzMsCiAJU1RBQ19IUF9NNCwKKwlTVEFDX0hQX0RWNSwKIAlTVEFDXzkySEQ3MUJYWF9NT0RFTFMKIH07CiAKIGVudW0gewogCVNUQUNfOTI1eF9SRUYsCisJU1RBQ19NMSwKKwlTVEFDX00xXzIsCisJU1RBQ19NMiwKIAlTVEFDX00yXzIsCi0JU1RBQ19NQTYsCi0JU1RBQ19QQTYsCisJU1RBQ19NMywKKwlTVEFDX001LAorCVNUQUNfTTYsCiAJU1RBQ185MjV4X01PREVMUwogfTsKIApAQCAtMzMxLDYgKzMzNywxMCBAQAogCTB4MDMsIDB4MGMsIDB4MTAsIDB4NDAsCiB9OwogCitzdGF0aWMgaGRhX25pZF90IHN0YWM5MmhkODN4eHhfYW1wX25pZHNbMV0gPSB7CisJMHhjLAorfTsKKwogc3RhdGljIGhkYV9uaWRfdCBzdGFjOTJoZDcxYnh4X3B3cl9uaWRzWzNdID0gewogCTB4MGEsIDB4MGQsIDB4MGYKIH07CkBAIC04NzUsNiArODg1LDggQEAKIHN0YXRpYyBzdHJ1Y3QgaGRhX3ZlcmIgc3RhYzkyNXhfY29yZV9pbml0W10gPSB7CiAJLyogc2V0IGRhYzBtdXggZm9yIGRhYyBjb252ZXJ0ZXIgKi8KIAl7IDB4MDYsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwKKwkvKiB1bm11dGUgYW5kIHNldCBtYXggdGhlIHNlbGVjdG9yICovCisJeyAweDBlLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAweGIwMWYgfSwKIAl7fQogfTsKIApAQCAtMTMzNCw3ICsxMzQ2LDE2IEBACiAJMHgwMmExOTAyMCwgMHgwMWExOTAyMSwgMHg5MDEwMDE0MCwgMHgwMTgxMzEyMiwKIH07CiAKLS8qIAorc3RhdGljIHVuc2lnbmVkIGludCBnYXRld2F5OTIwMF9tNF9waW5fY29uZmlnc1s4XSA9IHsKKwkweDQwMDAwMGZlLCAweDQwNDUwMGY0LCAweDQwMDEwMGYwLCAweDkwMTEwMDEwLAorCTB4NDAwMTAwZjEsIDB4MDJhMTkwMmUsIDB4NTAwMDAwZjIsIDB4NTAwMDAwZjMsCit9Oworc3RhdGljIHVuc2lnbmVkIGludCBnYXRld2F5OTIwMF9tNF8yX3Bpbl9jb25maWdzWzhdID0geworCTB4NDAwMDAwZmUsIDB4NDA0NTAwZjQsIDB4NDAwMTAwZjAsIDB4OTAxMTAwMTAsCisJMHg0MDAxMDBmMSwgMHgwMmExOTAyZSwgMHg1MDAwMDBmMiwgMHg1MDAwMDBmMywKK307CisKKy8qCiAgICAgU1RBQyA5MjAwIHBpbiBjb25maWdzIGZvcgogICAgIDEwMjgwMUE4CiAgICAgMTAyODAxREUKQEAgLTE0NjQsNiArMTQ4NSw4IEBACiAJW1NUQUNfOTIwMF9ERUxMX00yNV0gPSBkZWxsOTIwMF9tMjVfcGluX2NvbmZpZ3MsCiAJW1NUQUNfOTIwMF9ERUxMX00yNl0gPSBkZWxsOTIwMF9tMjZfcGluX2NvbmZpZ3MsCiAJW1NUQUNfOTIwMF9ERUxMX00yN10gPSBkZWxsOTIwMF9tMjdfcGluX2NvbmZpZ3MsCisJW1NUQUNfOTIwMF9NNF0gPSBnYXRld2F5OTIwMF9tNF9waW5fY29uZmlncywKKwlbU1RBQ185MjAwX000XzJdID0gZ2F0ZXdheTkyMDBfbTRfMl9waW5fY29uZmlncywKIAlbU1RBQ185MjAwX1BBTkFTT05JQ10gPSByZWY5MjAwX3Bpbl9jb25maWdzLAogfTsKIApAQCAtMTQ4MCw3ICsxNTAzLDggQEAKIAlbU1RBQ185MjAwX0RFTExfTTI1XSA9ICJkZWxsLW0yNSIsCiAJW1NUQUNfOTIwMF9ERUxMX00yNl0gPSAiZGVsbC1tMjYiLAogCVtTVEFDXzkyMDBfREVMTF9NMjddID0gImRlbGwtbTI3IiwKLQlbU1RBQ185MjAwX0dBVEVXQVldID0gImdhdGV3YXkiLAorCVtTVEFDXzkyMDBfTTRdID0gImdhdGV3YXktbTQiLAorCVtTVEFDXzkyMDBfTTRfMl0gPSAiZ2F0ZXdheS1tNC0yIiwKIAlbU1RBQ185MjAwX1BBTkFTT05JQ10gPSAicGFuYXNvbmljIiwKIH07CiAKQEAgLTE1NTAsMTEgKzE1NzQsOSBAQAogCS8qIFBhbmFzb25pYyAqLwogCVNORF9QQ0lfUVVJUksoMHgxMGY3LCAweDgzMzgsICJQYW5hc29uaWMgQ0YtNzQiLCBTVEFDXzkyMDBfUEFOQVNPTklDKSwKIAkvKiBHYXRld2F5IG1hY2hpbmVzIG5lZWRzIEVBUEQgdG8gYmUgc2V0IG9uIHJlc3VtZSAqLwotCVNORF9QQ0lfUVVJUksoMHgxMDdiLCAweDAyMDUsICJHYXRld2F5IFMtNzExME0iLCBTVEFDXzkyMDBfR0FURVdBWSksCi0JU05EX1BDSV9RVUlSSygweDEwN2IsIDB4MDMxNywgIkdhdGV3YXkgTVQzNDIzLCBNWDM0MSoiLAotCQkgICAgICBTVEFDXzkyMDBfR0FURVdBWSksCi0JU05EX1BDSV9RVUlSSygweDEwN2IsIDB4MDMxOCwgIkdhdGV3YXkgTUwzMDE5LCBNVDM3MDciLAotCQkgICAgICBTVEFDXzkyMDBfR0FURVdBWSksCisJU05EX1BDSV9RVUlSSygweDEwN2IsIDB4MDIwNSwgIkdhdGV3YXkgUy03MTEwTSIsIFNUQUNfOTIwMF9NNCksCisJU05EX1BDSV9RVUlSSygweDEwN2IsIDB4MDMxNywgIkdhdGV3YXkgTVQzNDIzLCBNWDM0MSoiLCBTVEFDXzkyMDBfTTRfMiksCisJU05EX1BDSV9RVUlSSygweDEwN2IsIDB4MDMxOCwgIkdhdGV3YXkgTUwzMDE5LCBNVDM3MDciLCBTVEFDXzkyMDBfTTRfMiksCiAJLyogT1FPIE1vYmlsZSAqLwogCVNORF9QQ0lfUVVJUksoMHgxMTA2LCAweDMyODgsICJPUU8gTW9kZWwgMiIsIFNUQUNfOTIwMF9PUU8pLAogCXt9IC8qIHRlcm1pbmF0b3IgKi8KQEAgLTE1NjUsNDQgKzE1ODcsODUgQEAKIAkweDkwYTcwMzIwLCAweDAyMjE0MjEwLCAweDAxMDE5MDIwLCAweDkwMzMwMzJlLAogfTsKIAotc3RhdGljIHVuc2lnbmVkIGludCBzdGFjOTI1eF9NQTZfcGluX2NvbmZpZ3NbOF0gPSB7Ci0JMHg0MGMwMDNmMCwgMHg0MjQ1MDNmMiwgMHgwMTgxMzAyMiwgMHgwMmExOTAyMSwKLQkweDkwYTcwMzIwLCAweDkwMTAwMjExLCAweDQwMDAwM2YxLCAweDkwMzMwMzJlLAorc3RhdGljIHVuc2lnbmVkIGludCBzdGFjOTI1eE0xX3Bpbl9jb25maWdzWzhdID0geworCTB4NDBjMDAzZjQsIDB4NDI0NTAzZjIsIDB4NDAwMDAwZjMsIDB4MDJhMTkwMjAsCisJMHg0MGEwMDBmMCwgMHg5MDEwMDIxMCwgMHg0MDAwMDNmMSwgMHg5MDMzMDMyZSwKIH07CiAKLXN0YXRpYyB1bnNpZ25lZCBpbnQgc3RhYzkyNXhfUEE2X3Bpbl9jb25maWdzWzhdID0gewotCTB4NDBjMDAzZjAsIDB4NDI0NTAzZjIsIDB4MDE4MTMwMjIsIDB4MDJhMTkwMjEsCi0JMHg1MGExMDNmMCwgMHg5MDEwMDIxMSwgMHg0MDAwMDNmMSwgMHg5MDMzMDMyZSwKK3N0YXRpYyB1bnNpZ25lZCBpbnQgc3RhYzkyNXhNMV8yX3Bpbl9jb25maWdzWzhdID0geworCTB4NDBjMDAzZjQsIDB4NDI0NTAzZjIsIDB4NDAwMDAwZjMsIDB4MDJhMTkwMjAsCisJMHg0MGEwMDBmMCwgMHg5MDEwMDIxMCwgMHg0MDAwMDNmMSwgMHg5MDMzMDMyZSwKK307CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgc3RhYzkyNXhNMl9waW5fY29uZmlnc1s4XSA9IHsKKwkweDQwYzAwM2Y0LCAweDQyNDUwM2YyLCAweDQwMDAwMGYzLCAweDAyYTE5MDIwLAorCTB4NDBhMDAwZjAsIDB4OTAxMDAyMTAsIDB4NDAwMDAzZjEsIDB4OTAzMzAzMmUsCiB9OwogCiBzdGF0aWMgdW5zaWduZWQgaW50IHN0YWM5MjV4TTJfMl9waW5fY29uZmlnc1s4XSA9IHsKLQkweDQwYzAwM2YzLCAweDQyNDUwM2YyLCAweDA0MTgwMDExLCAweDAyYTE5MDIwLAotCTB4NTBhMTAzZjAsIDB4OTAxMDAyMTIsIDB4NDAwMDAzZjEsIDB4OTAzMzAzMmUsCisJMHg0MGMwMDNmNCwgMHg0MjQ1MDNmMiwgMHg0MDAwMDBmMywgMHgwMmExOTAyMCwKKwkweDQwYTAwMGYwLCAweDkwMTAwMjEwLCAweDQwMDAwM2YxLCAweDkwMzMwMzJlLAorfTsKKworc3RhdGljIHVuc2lnbmVkIGludCBzdGFjOTI1eE0zX3Bpbl9jb25maWdzWzhdID0geworCTB4NDBjMDAzZjQsIDB4NDI0NTAzZjIsIDB4NDAwMDAwZjMsIDB4MDJhMTkwMjAsCisJMHg0MGEwMDBmMCwgMHg5MDEwMDIxMCwgMHg0MDAwMDNmMSwgMHg1MDMzMDNmMywKK307CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgc3RhYzkyNXhNNV9waW5fY29uZmlnc1s4XSA9IHsKKwkweDQwYzAwM2Y0LCAweDQyNDUwM2YyLCAweDQwMDAwMGYzLCAweDAyYTE5MDIwLAorCTB4NDBhMDAwZjAsIDB4OTAxMDAyMTAsIDB4NDAwMDAzZjEsIDB4OTAzMzAzMmUsCit9OworCitzdGF0aWMgdW5zaWduZWQgaW50IHN0YWM5MjV4TTZfcGluX2NvbmZpZ3NbOF0gPSB7CisJMHg0MGMwMDNmNCwgMHg0MjQ1MDNmMiwgMHg0MDAwMDBmMywgMHgwMmExOTAyMCwKKwkweDQwYTAwMGYwLCAweDkwMTAwMjEwLCAweDQwMDAwM2YxLCAweDkwMzMwMzIwLAogfTsKIAogc3RhdGljIHVuc2lnbmVkIGludCAqc3RhYzkyNXhfYnJkX3RibFtTVEFDXzkyNXhfTU9ERUxTXSA9IHsKIAlbU1RBQ19SRUZdID0gcmVmOTI1eF9waW5fY29uZmlncywKKwlbU1RBQ19NMV0gPSBzdGFjOTI1eE0xX3Bpbl9jb25maWdzLAorCVtTVEFDX00xXzJdID0gc3RhYzkyNXhNMV8yX3Bpbl9jb25maWdzLAorCVtTVEFDX00yXSA9IHN0YWM5MjV4TTJfcGluX2NvbmZpZ3MsCiAJW1NUQUNfTTJfMl0gPSBzdGFjOTI1eE0yXzJfcGluX2NvbmZpZ3MsCi0JW1NUQUNfTUE2XSA9IHN0YWM5MjV4X01BNl9waW5fY29uZmlncywKLQlbU1RBQ19QQTZdID0gc3RhYzkyNXhfUEE2X3Bpbl9jb25maWdzLAorCVtTVEFDX00zXSA9IHN0YWM5MjV4TTNfcGluX2NvbmZpZ3MsCisJW1NUQUNfTTVdID0gc3RhYzkyNXhNNV9waW5fY29uZmlncywKKwlbU1RBQ19NNl0gPSBzdGFjOTI1eE02X3Bpbl9jb25maWdzLAogfTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKnN0YWM5MjV4X21vZGVsc1tTVEFDXzkyNXhfTU9ERUxTXSA9IHsKIAlbU1RBQ19SRUZdID0gInJlZiIsCisJW1NUQUNfTTFdID0gIm0xIiwKKwlbU1RBQ19NMV8yXSA9ICJtMS0yIiwKKwlbU1RBQ19NMl0gPSAibTIiLAogCVtTVEFDX00yXzJdID0gIm0yLTIiLAotCVtTVEFDX01BNl0gPSAibTYiLAotCVtTVEFDX1BBNl0gPSAicGE2IiwKKwlbU1RBQ19NM10gPSAibTMiLAorCVtTVEFDX001XSA9ICJtNSIsCisJW1NUQUNfTTZdID0gIm02IiwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3BjaV9xdWlyayBzdGFjOTI1eF9jb2RlY19pZF9jZmdfdGJsW10gPSB7CisJU05EX1BDSV9RVUlSSygweDEwN2IsIDB4MDMxNiwgIkdhdGV3YXkgTTI1NSIsIFNUQUNfTTIpLAorCVNORF9QQ0lfUVVJUksoMHgxMDdiLCAweDAzNjYsICJHYXRld2F5IE1QNjk1NCIsIFNUQUNfTTUpLAorCVNORF9QQ0lfUVVJUksoMHgxMDdiLCAweDA0NjEsICJHYXRld2F5IE5YNTYwWEwiLCBTVEFDX00xKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA3YiwgMHgwNjgxLCAiR2F0ZXdheSBOWDg2MCIsIFNUQUNfTTIpLAorCVNORF9QQ0lfUVVJUksoMHgxMDdiLCAweDAzNjcsICJHYXRld2F5IE1YNjQ1MyIsIFNUQUNfTTFfMiksCisJLyogTm90IHN1cmUgYWJvdXQgdGhlIGJyYW5kIG5hbWUgZm9yIHRob3NlICovCisJU05EX1BDSV9RVUlSSygweDEwN2IsIDB4MDI4MSwgIkdhdGV3YXkgbW9iaWxlIiwgU1RBQ19NMSksCisJU05EX1BDSV9RVUlSSygweDEwN2IsIDB4MDUwNywgIkdhdGV3YXkgbW9iaWxlIiwgU1RBQ19NMyksCisJU05EX1BDSV9RVUlSSygweDEwN2IsIDB4MDI4MSwgIkdhdGV3YXkgbW9iaWxlIiwgU1RBQ19NNiksCisJU05EX1BDSV9RVUlSSygweDEwN2IsIDB4MDY4NSwgIkdhdGV3YXkgbW9iaWxlIiwgU1RBQ19NMl8yKSwKKwl7fSAvKiB0ZXJtaW5hdG9yICovCiB9OwogCiBzdGF0aWMgc3RydWN0IHNuZF9wY2lfcXVpcmsgc3RhYzkyNXhfY2ZnX3RibFtdID0gewogCS8qIFNpZ21hVGVsIHJlZmVyZW5jZSBib2FyZCAqLwogCVNORF9QQ0lfUVVJUksoUENJX1ZFTkRPUl9JRF9JTlRFTCwgMHgyNjY4LCAiREZJIExhblBhcnR5IiwgU1RBQ19SRUYpLAogCVNORF9QQ0lfUVVJUksoMHg4Mzg0LCAweDc2MzIsICJTdGFjOTIwMiBSZWZlcmVuY2UgQm9hcmQiLCBTVEFDX1JFRiksCi0JU05EX1BDSV9RVUlSSygweDEwN2IsIDB4MDMxNiwgIkdhdGV3YXkgTTI1NSIsIFNUQUNfUkVGKSwKLQlTTkRfUENJX1FVSVJLKDB4MTA3YiwgMHgwMzY2LCAiR2F0ZXdheSBNUDY5NTQiLCBTVEFDX1JFRiksCi0JU05EX1BDSV9RVUlSSygweDEwN2IsIDB4MDQ2MSwgIkdhdGV3YXkgTlg1NjBYTCIsIFNUQUNfTUE2KSwKLQlTTkRfUENJX1FVSVJLKDB4MTA3YiwgMHgwNjgxLCAiR2F0ZXdheSBOWDg2MCIsIFNUQUNfUEE2KSwKLQlTTkRfUENJX1FVSVJLKDB4MTAwMiwgMHg0MzdiLCAiR2F0ZXdheSBNWDY0NTMiLCBTVEFDX00yXzIpLAorCisJLyogRGVmYXVsdCB0YWJsZSBmb3IgdW5rbm93biBJRCAqLworCVNORF9QQ0lfUVVJUksoMHgxMDAyLCAweDQzN2IsICJHYXRld2F5IG1vYmlsZSIsIFNUQUNfTTJfMiksCisKIAl7fSAvKiB0ZXJtaW5hdG9yICovCiB9OwogCkBAIC0xNjgyLDcgKzE3NDUsNyBAQAogc3RhdGljIHN0cnVjdCBzbmRfcGNpX3F1aXJrIHN0YWM5MmhkODN4eHhfY2ZnX3RibFtdID0gewogCS8qIFNpZ21hVGVsIHJlZmVyZW5jZSBib2FyZCAqLwogCVNORF9QQ0lfUVVJUksoUENJX1ZFTkRPUl9JRF9JTlRFTCwgMHgyNjY4LAotCQkgICAgICAiREZJIExhblBhcnR5IiwgU1RBQ185MkhENzFCWFhfUkVGKSwKKwkJICAgICAgIkRGSSBMYW5QYXJ0eSIsIFNUQUNfOTJIRDgzWFhYX1JFRiksCiAJe30gLyogdGVybWluYXRvciAqLwogfTsKIApAQCAtMTcxNiw2ICsxNzc5LDcgQEAKIAlbU1RBQ19ERUxMX000XzJdCT0gZGVsbF9tNF8yX3Bpbl9jb25maWdzLAogCVtTVEFDX0RFTExfTTRfM10JPSBkZWxsX200XzNfcGluX2NvbmZpZ3MsCiAJW1NUQUNfSFBfTTRdCQk9IE5VTEwsCisJW1NUQUNfSFBfRFY1XQkJPSBOVUxMLAogfTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKnN0YWM5MmhkNzFieHhfbW9kZWxzW1NUQUNfOTJIRDcxQlhYX01PREVMU10gPSB7CkBAIC0xNzI0LDYgKzE3ODgsNyBAQAogCVtTVEFDX0RFTExfTTRfMl0gPSAiZGVsbC1tNC0yIiwKIAlbU1RBQ19ERUxMX000XzNdID0gImRlbGwtbTQtMyIsCiAJW1NUQUNfSFBfTTRdID0gImhwLW00IiwKKwlbU1RBQ19IUF9EVjVdID0gImhwLWR2NSIsCiB9OwogCiBzdGF0aWMgc3RydWN0IHNuZF9wY2lfcXVpcmsgc3RhYzkyaGQ3MWJ4eF9jZmdfdGJsW10gPSB7CkBAIC0xNzM2LDYgKzE4MDEsOCBAQAogCQkgICAgICAiSFAgZHY3IiwgU1RBQ19IUF9NNCksCiAJU05EX1BDSV9RVUlSSyhQQ0lfVkVORE9SX0lEX0hQLCAweDMwZmMsCiAJCSAgICAgICJIUCBkdjciLCBTVEFDX0hQX000KSwKKwlTTkRfUENJX1FVSVJLKFBDSV9WRU5ET1JfSURfSFAsIDB4MzYwMywKKwkJICAgICAgIkhQIGR2NSIsIFNUQUNfSFBfRFY1KSwKIAlTTkRfUENJX1FVSVJLKFBDSV9WRU5ET1JfSURfSFAsIDB4MzYxYSwKIAkJCQkidW5rbm93biBIUCIsIFNUQUNfSFBfTTQpLAogCVNORF9QQ0lfUVVJUksoUENJX1ZFTkRPUl9JRF9ERUxMLCAweDAyMzMsCkBAIC00MTYzLDggKzQyMzAsMTkgQEAKIAkJCWNvbnRpbnVlOwogCQlpZiAocHJlc2VuY2UpCiAJCQlzdGFjOTJ4eF9zZXRfcGluY3RsKGNvZGVjLCBjZmctPmhwX3BpbnNbaV0sIHZhbCk7CisjaWYgMCAvKiBGSVhNRSAqLworLyogUmVzZXR0aW5nIHRoZSBwaW5jdGwgbGlrZSBiZWxvdyBtYXkgbGVhZCB0byAoYSBzb3J0IG9mKSByZWdyZXNzaW9ucworICogb24gc29tZSBkZXZpY2VzIHNpbmNlIHRoZXkgdXNlIHRoZSBIUCBwaW4gYWN0dWFsbHkgZm9yIGxpbmUvc3BlYWtlcgorICogb3V0cyBhbHRob3VnaCB0aGUgZGVmYXVsdCBwaW4gY29uZmlnIHNob3dzIGEgZGlmZmVyZW50IHBpbiAodGhhdCBpcworICogd3JvbmcgYW5kIHVzZWxlc3MpLgorICoKKyAqIFNvLCBpdCdzIGJhc2ljYWxseSBhIHByb2JsZW0gb2YgZGVmYXVsdCBwaW4gY29uZmlncywgbGlrZWx5IGEgQklPUyBpc3N1ZS4KKyAqIEJ1dCwgZGlzYWJsaW5nIHRoZSBjb2RlIGJlbG93IGp1c3Qgd29ya3MgYXJvdW5kIGl0LCBhbmQgSSdtIHRvbyB0aXJlZCBvZgorICogYnVnIHJlcG9ydHMgd2l0aCBzdWNoIGRldmljZXMuLi4gCisgKi8KIAkJZWxzZQogCQkJc3RhYzkyeHhfcmVzZXRfcGluY3RsKGNvZGVjLCBjZmctPmhwX3BpbnNbaV0sIHZhbCk7CisjZW5kaWYgLyogRklYTUUgKi8KIAl9CiB9IAogCkBAIC00MzkwLDcgKzQ0NjgsOCBAQAogCXNwZWMtPm51bV9hZGNzID0gMTsKIAlzcGVjLT5udW1fcHdycyA9IDA7CiAKLQlpZiAoc3BlYy0+Ym9hcmRfY29uZmlnID09IFNUQUNfOTIwMF9HQVRFV0FZIHx8CisJaWYgKHNwZWMtPmJvYXJkX2NvbmZpZyA9PSBTVEFDXzkyMDBfTTQgfHwKKwkgICAgc3BlYy0+Ym9hcmRfY29uZmlnID09IFNUQUNfOTIwMF9NNF8yIHx8CiAJICAgIHNwZWMtPmJvYXJkX2NvbmZpZyA9PSBTVEFDXzkyMDBfT1FPKQogCQlzcGVjLT5pbml0ID0gc3RhYzkyMDBfZWFwZF9pbml0OwogCWVsc2UKQEAgLTQ0MDgsNiArNDQ4NywxMiBAQAogCQlyZXR1cm4gZXJyOwogCX0KIAorCS8qIENGLTc0IGhhcyBubyBoZWFkcGhvbmUgZGV0ZWN0aW9uLCBhbmQgdGhlIGRyaXZlciBzaG91bGQgKk5PVCoKKwkgKiBkbyBkZXRlY3Rpb24gYW5kIEhQL3NwZWFrZXIgdG9nZ2xlIGJlY2F1c2UgdGhlIGhhcmR3YXJlIGRvZXMgaXQuCisJICovCisJaWYgKHNwZWMtPmJvYXJkX2NvbmZpZyA9PSBTVEFDXzkyMDBfUEFOQVNPTklDKQorCQlzcGVjLT5ocF9kZXRlY3QgPSAwOworCiAJY29kZWMtPnBhdGNoX29wcyA9IHN0YWM5Mnh4X3BhdGNoX29wczsKIAogCXJldHVybiAwOwpAQCAtNDQyNSwxMiArNDUxMCwyMiBAQAogCWNvZGVjLT5zcGVjID0gc3BlYzsKIAlzcGVjLT5udW1fcGlucyA9IEFSUkFZX1NJWkUoc3RhYzkyNXhfcGluX25pZHMpOwogCXNwZWMtPnBpbl9uaWRzID0gc3RhYzkyNXhfcGluX25pZHM7Ci0Jc3BlYy0+Ym9hcmRfY29uZmlnID0gc25kX2hkYV9jaGVja19ib2FyZF9jb25maWcoY29kZWMsIFNUQUNfOTI1eF9NT0RFTFMsCisKKwkvKiBDaGVjayBmaXJzdCBmb3IgY29kZWMgSUQgKi8KKwlzcGVjLT5ib2FyZF9jb25maWcgPSBzbmRfaGRhX2NoZWNrX2JvYXJkX2NvZGVjX3NpZF9jb25maWcoY29kZWMsCisJCQkJCQkJU1RBQ185MjV4X01PREVMUywKKwkJCQkJCQlzdGFjOTI1eF9tb2RlbHMsCisJCQkJCQkJc3RhYzkyNXhfY29kZWNfaWRfY2ZnX3RibCk7CisKKwkvKiBOb3cgY2hlY2tzIGZvciBQQ0kgSUQsIGlmIGNvZGVjIElEIGlzIG5vdCBmb3VuZCAqLworCWlmIChzcGVjLT5ib2FyZF9jb25maWcgPCAwKQorCQlzcGVjLT5ib2FyZF9jb25maWcgPSBzbmRfaGRhX2NoZWNrX2JvYXJkX2NvbmZpZyhjb2RlYywKKwkJCQkJCQlTVEFDXzkyNXhfTU9ERUxTLAogCQkJCQkJCXN0YWM5MjV4X21vZGVscywKIAkJCQkJCQlzdGFjOTI1eF9jZmdfdGJsKTsKICBhZ2FpbjoKIAlpZiAoc3BlYy0+Ym9hcmRfY29uZmlnIDwgMCkgewotCQlzbmRfcHJpbnRkZChLRVJOX0lORk8gImhkYV9jb2RlYzogVW5rbm93biBtb2RlbCBmb3IgU1RBQzkyNXgsIiAKKwkJc25kX3ByaW50ZGQoS0VSTl9JTkZPICJoZGFfY29kZWM6IFVua25vd24gbW9kZWwgZm9yIFNUQUM5MjV4LCIKIAkJCQkgICAgICAidXNpbmcgQklPUyBkZWZhdWx0c1xuIik7CiAJCWVyciA9IHN0YWM5Mnh4X3NhdmVfYmlvc19jb25maWdfcmVncyhjb2RlYyk7CiAJfSBlbHNlCkBAIC00NjcyLDYgKzQ3NjcsNyBAQAogCXNwZWMtPmRtdXhfbmlkcyA9IHN0YWM5MmhkODN4eHhfZG11eF9uaWRzOwogCXNwZWMtPmFkY19uaWRzID0gc3RhYzkyaGQ4M3h4eF9hZGNfbmlkczsKIAlzcGVjLT5wd3JfbmlkcyA9IHN0YWM5MmhkODN4eHhfcHdyX25pZHM7CisJc3BlYy0+YW1wX25pZHMgPSBzdGFjOTJoZDgzeHh4X2FtcF9uaWRzOwogCXNwZWMtPnB3cl9tYXBwaW5nID0gc3RhYzkyaGQ4M3h4eF9wd3JfbWFwcGluZzsKIAlzcGVjLT5udW1fcHdycyA9IEFSUkFZX1NJWkUoc3RhYzkyaGQ4M3h4eF9wd3Jfbmlkcyk7CiAJc3BlYy0+bXVsdGlvdXQuZGFjX25pZHMgPSBzcGVjLT5kYWNfbmlkczsKQEAgLTQ2ODksNiArNDc4NSw3IEBACiAJc3BlYy0+bnVtX3BpbnMgPSBBUlJBWV9TSVpFKHN0YWM5MmhkODN4eHhfcGluX25pZHMpOwogCXNwZWMtPm51bV9kbXV4ZXMgPSBBUlJBWV9TSVpFKHN0YWM5MmhkODN4eHhfZG11eF9uaWRzKTsKIAlzcGVjLT5udW1fYWRjcyA9IEFSUkFZX1NJWkUoc3RhYzkyaGQ4M3h4eF9hZGNfbmlkcyk7CisJc3BlYy0+bnVtX2FtcHMgPSBBUlJBWV9TSVpFKHN0YWM5MmhkODN4eHhfYW1wX25pZHMpOwogCXNwZWMtPm51bV9kbWljcyA9IFNUQUM5MkhEODNYWFhfTlVNX0RNSUNTOwogCXNwZWMtPmRpbnB1dF9tdXggPSAmc3RhYzkyaGQ4M3h4eF9kbXV4OwogCXNwZWMtPnBpbl9uaWRzID0gc3RhYzkyaGQ4M3h4eF9waW5fbmlkczsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9veHlnZW4vdmlydHVvc28uYyBiL3NvdW5kL3BjaS9veHlnZW4vdmlydHVvc28uYwppbmRleCA5OGM2YThjLi5lOWU4MjllIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvb3h5Z2VuL3ZpcnR1b3NvLmMKKysrIGIvc291bmQvcGNpL294eWdlbi92aXJ0dW9zby5jCkBAIC0yNiw3ICsyNiw3IEBACiAgKiBTUEkgMCAtPiAxc3QgUENNMTc5NiAoZnJvbnQpCiAgKiBTUEkgMSAtPiAybmQgUENNMTc5NiAoc3Vycm91bmQpCiAgKiBTUEkgMiAtPiAzcmQgUENNMTc5NiAoY2VudGVyL0xGRSkKLSAqIFNQSSA0IC0+IDR0aCBQQ00xNzk2IChiYWNrKQorICogU1BJIDQgLT4gNHRoIFBDTTE3OTYgKGJhY2spIGFuZCBFRVBST00gc2VsZi1kZXN0cnVjdCAoZG8gbm90IHVzZSEpCiAgKgogICogR1BJTyAyIC0+IE0wIG9mIENTNTM4MQogICogR1BJTyAzIC0+IE0xIG9mIENTNTM4MQpAQCAtMjA3LDYgKzIwNywxMiBAQAogc3RhdGljIGlubGluZSB2b2lkIHBjbTE3OTZfd3JpdGVfc3BpKHN0cnVjdCBveHlnZW4gKmNoaXAsIHVuc2lnbmVkIGludCBjb2RlYywKIAkJCQkgICAgIHU4IHJlZywgdTggdmFsdWUpCiB7CisJLyoKKwkgKiBXZSBkb24ndCB3YW50IHRvIGRvIHdyaXRlcyBvbiBTUEkgNCBiZWNhdXNlIHRoZSBFRVBST00sIHdoaWNoIHNoYXJlcworCSAqIHRoZSBzYW1lIHBpbiwgbWlnaHQgZ2V0IGNvbmZ1c2VkIGFuZCBicm9rZW4uICBXZSdkIGJldHRlciB0YWtlIGNhcmUKKwkgKiB0aGF0IHRoZSBkcml2ZXIgd29ya3Mgd2l0aCB0aGUgZGVmYXVsdCByZWdpc3RlciB2YWx1ZXMgLi4uCisJICovCisjaWYgMAogCS8qIG1hcHMgQUxTQSBjaGFubmVsIHBhaXIgbnVtYmVyIHRvIFNQSSBvdXRwdXQgKi8KIAlzdGF0aWMgY29uc3QgdTggY29kZWNfbWFwWzRdID0gewogCQkwLCAxLCAyLCA0CkBAIC0yMTcsNiArMjIzLDcgQEAKIAkJCSAoY29kZWNfbWFwW2NvZGVjXSA8PCBPWFlHRU5fU1BJX0NPREVDX1NISUZUKSB8CiAJCQkgT1hZR0VOX1NQSV9DRU5fTEFUQ0hfQ0xPQ0tfSEksCiAJCQkgKHJlZyA8PCA4KSB8IHZhbHVlKTsKKyNlbmRpZgogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgcGNtMTc5Nl93cml0ZV9pMmMoc3RydWN0IG94eWdlbiAqY2hpcCwgdW5zaWduZWQgaW50IGNvZGVjLApAQCAtNzUwLDYgKzc1Nyw5IEBACiAKIHN0YXRpYyBpbnQgeG9uYXJfZDJfY29udHJvbF9maWx0ZXIoc3RydWN0IHNuZF9rY29udHJvbF9uZXcgKnRlbXBsYXRlKQogeworCWlmICghc3RybmNtcCh0ZW1wbGF0ZS0+bmFtZSwgIk1hc3RlciBQbGF5YmFjayAiLCAxNikpCisJCS8qIGRpc2FibGUgdm9sdW1lL211dGUgYmVjYXVzZSB0aGV5IHdvdWxkIHJlcXVpcmUgU1BJIHdyaXRlcyAqLworCQlyZXR1cm4gMTsKIAlpZiAoIXN0cm5jbXAodGVtcGxhdGUtPm5hbWUsICJDRCBDYXB0dXJlICIsIDExKSkKIAkJLyogQ0QgaW4gaXMgYWN0dWFsbHkgY29ubmVjdGVkIHRvIHRoZSB2aWRlbyBpbiBwaW4gKi8KIAkJdGVtcGxhdGUtPnByaXZhdGVfdmFsdWUgXj0gQUM5N19DRCBeIEFDOTdfVklERU87CkBAIC04NDAsOSArODUwLDggQEAKIAkuZGFjX3ZvbHVtZV9taW4gPSAweDBmLAogCS5kYWNfdm9sdW1lX21heCA9IDB4ZmYsCiAJLm1pc2NfZmxhZ3MgPSBPWFlHRU5fTUlTQ19NSURJLAotCS5mdW5jdGlvbl9mbGFncyA9IE9YWUdFTl9GVU5DVElPTl9TUEkgfAotCQkJICBPWFlHRU5fRlVOQ1RJT05fRU5BQkxFX1NQSV80XzUsCi0JLmRhY19pMnNfZm9ybWF0ID0gT1hZR0VOX0kyU19GT1JNQVRfTEpVU1QsCisJLmZ1bmN0aW9uX2ZsYWdzID0gT1hZR0VOX0ZVTkNUSU9OX1NQSSwKKwkuZGFjX2kyc19mb3JtYXQgPSBPWFlHRU5fSTJTX0ZPUk1BVF9JMlMsCiAJLmFkY19pMnNfZm9ybWF0ID0gT1hZR0VOX0kyU19GT1JNQVRfTEpVU1QsCiB9OwogCmRpZmYgLS1naXQgYS9zb3VuZC9wcGMvc25kX3BzMy5jIGIvc291bmQvcHBjL3NuZF9wczMuYwppbmRleCA4ZjllMzg1Li5mZjMyMTExIDEwMDY0NAotLS0gYS9zb3VuZC9wcGMvc25kX3BzMy5jCisrKyBiL3NvdW5kL3BwYy9zbmRfcHMzLmMKQEAgLTQ3Nyw3ICs0NzcsNyBAQAogCQljYXJkLT5kbWFfc3RhcnRfYnVzX2FkZHJbU05EX1BTM19DSF9SXSA9CiAJCQlydW50aW1lLT5kbWFfYWRkciArIChydW50aW1lLT5kbWFfYnl0ZXMgLyAyKTsKIAotCQlwcl9kZWJ1ZygiJXM6IHZhZGRyPSVwIGJ1cz0lI2x4XG4iLCBfX2Z1bmNfXywKKwkJcHJfZGVidWcoIiVzOiB2YWRkcj0lcCBidXM9JSNsbHhcbiIsIF9fZnVuY19fLAogCQkJIGNhcmQtPmRtYV9zdGFydF92YWRkcltTTkRfUFMzX0NIX0xdLAogCQkJIGNhcmQtPmRtYV9zdGFydF9idXNfYWRkcltTTkRfUFMzX0NIX0xdKTsKIApAQCAtMTAzMCw3ICsxMDMwLDcgQEAKIAkJcHJfaW5mbygiJXM6IG51bGxidWZmZXIgYWxsb2MgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7CiAJCWdvdG8gY2xlYW5fcHJlYWxsb2NhdGU7CiAJfQotCXByX2RlYnVnKCIlczogbnVsbCB2YWRkcj0lcCBkbWE9JSNseFxuIiwgX19mdW5jX18sCisJcHJfZGVidWcoIiVzOiBudWxsIHZhZGRyPSVwIGRtYT0lI2xseFxuIiwgX19mdW5jX18sCiAJCSB0aGVfY2FyZC5udWxsX2J1ZmZlcl9zdGFydF92YWRkciwKIAkJIHRoZV9jYXJkLm51bGxfYnVmZmVyX3N0YXJ0X2RtYV9hZGRyKTsKIAkvKiBzZXQgZGVmYXVsdCBzYW1wbGUgcmF0ZS93b3JkIHdpZHRoICovCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvYXUxeC9kYmRtYTIuYyBiL3NvdW5kL3NvYy9hdTF4L2RiZG1hMi5jCmluZGV4IDc0YzgyM2QuLmJjOGQ2NTQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9hdTF4L2RiZG1hMi5jCisrKyBiL3NvdW5kL3NvYy9hdTF4L2RiZG1hMi5jCkBAIC0xODcsNyArMTg3LDcgQEAKIAkJCQkJYXUxeF9wY21fZG1hdHhfY2IsICh2b2lkICopcGNkKTsKIAogCWlmICghcGNkLT5kZG1hX2NoYW4pCi0JCXJldHVybiAtRU5PTUVNOzsKKwkJcmV0dXJuIC1FTk9NRU07CiAKIAlhdTF4eHhfZGJkbWFfc2V0X2RldndpZHRoKHBjZC0+ZGRtYV9jaGFuLCBtc2JpdHMpOwogCWF1MXh4eF9kYmRtYV9yaW5nX2FsbG9jKHBjZC0+ZGRtYV9jaGFuLCAyKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvdHdsNDAzMC5jIGIvc291bmQvc29jL2NvZGVjcy90d2w0MDMwLmMKaW5kZXggZmQwZjMzOC4uZWEzNzBhNCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy90d2w0MDMwLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy90d2w0MDMwLmMKQEAgLTE5Nyw3ICsxOTcsNyBAQAogc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCB0d2w0MDMwX2VhcnBpZWNlX3ZhbHVlc1tdID0KIAkJezB4MCwgMHgxLCAweDIsIDB4NH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX3ZhbHVlX2VudW0gdHdsNDAzMF9lYXJwaWVjZV9lbnVtID0KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gdHdsNDAzMF9lYXJwaWVjZV9lbnVtID0KIAlTT0NfVkFMVUVfRU5VTV9TSU5HTEUoVFdMNDAzMF9SRUdfRUFSX0NUTCwgMSwgMHg3LAogCQkJQVJSQVlfU0laRSh0d2w0MDMwX2VhcnBpZWNlX3RleHRzKSwKIAkJCXR3bDQwMzBfZWFycGllY2VfdGV4dHMsCkBAIC0yMTMsNyArMjEzLDcgQEAKIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgdHdsNDAzMF9wcmVkcml2ZWxfdmFsdWVzW10gPQogCQl7MHgwLCAweDEsIDB4MiwgMHg0fTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfdmFsdWVfZW51bSB0d2w0MDMwX3ByZWRyaXZlbF9lbnVtID0KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gdHdsNDAzMF9wcmVkcml2ZWxfZW51bSA9CiAJU09DX1ZBTFVFX0VOVU1fU0lOR0xFKFRXTDQwMzBfUkVHX1BSRURMX0NUTCwgMSwgMHg3LAogCQkJQVJSQVlfU0laRSh0d2w0MDMwX3ByZWRyaXZlbF90ZXh0cyksCiAJCQl0d2w0MDMwX3ByZWRyaXZlbF90ZXh0cywKQEAgLTIyOSw3ICsyMjksNyBAQAogc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCB0d2w0MDMwX3ByZWRyaXZlcl92YWx1ZXNbXSA9CiAJCXsweDAsIDB4MSwgMHgyLCAweDR9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY192YWx1ZV9lbnVtIHR3bDQwMzBfcHJlZHJpdmVyX2VudW0gPQorc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSB0d2w0MDMwX3ByZWRyaXZlcl9lbnVtID0KIAlTT0NfVkFMVUVfRU5VTV9TSU5HTEUoVFdMNDAzMF9SRUdfUFJFRFJfQ1RMLCAxLCAweDcsCiAJCQlBUlJBWV9TSVpFKHR3bDQwMzBfcHJlZHJpdmVyX3RleHRzKSwKIAkJCXR3bDQwMzBfcHJlZHJpdmVyX3RleHRzLApAQCAtMzE3LDcgKzMxNyw3IEBACiBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHR3bDQwMzBfYW5hbG9nbG1pY192YWx1ZXNbXSA9CiAJCXsweDAsIDB4MSwgMHgyLCAweDQsIDB4OH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX3ZhbHVlX2VudW0gdHdsNDAzMF9hbmFsb2dsbWljX2VudW0gPQorc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSB0d2w0MDMwX2FuYWxvZ2xtaWNfZW51bSA9CiAJU09DX1ZBTFVFX0VOVU1fU0lOR0xFKFRXTDQwMzBfUkVHX0FOQU1JQ0wsIDAsIDB4ZiwKIAkJCUFSUkFZX1NJWkUodHdsNDAzMF9hbmFsb2dsbWljX3RleHRzKSwKIAkJCXR3bDQwMzBfYW5hbG9nbG1pY190ZXh0cywKQEAgLTMzMyw3ICszMzMsNyBAQAogc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCB0d2w0MDMwX2FuYWxvZ3JtaWNfdmFsdWVzW10gPQogCQl7MHgwLCAweDEsIDB4NH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX3ZhbHVlX2VudW0gdHdsNDAzMF9hbmFsb2dybWljX2VudW0gPQorc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSB0d2w0MDMwX2FuYWxvZ3JtaWNfZW51bSA9CiAJU09DX1ZBTFVFX0VOVU1fU0lOR0xFKFRXTDQwMzBfUkVHX0FOQU1JQ1IsIDAsIDB4NSwKIAkJCUFSUkFZX1NJWkUodHdsNDAzMF9hbmFsb2dybWljX3RleHRzKSwKIAkJCXR3bDQwMzBfYW5hbG9ncm1pY190ZXh0cywKQEAgLTEyODAsNiArMTI4MCw4IEBACiAJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc29jZGV2LT5jb2RlYzsKIAogCXByaW50ayhLRVJOX0lORk8gIlRXTDQwMzAgQXVkaW8gQ29kZWMgcmVtb3ZlXG4iKTsKKwlzbmRfc29jX2ZyZWVfcGNtcyhzb2NkZXYpOworCXNuZF9zb2NfZGFwbV9mcmVlKHNvY2Rldik7CiAJa2ZyZWUoY29kZWMpOwogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvZGF2aW5jaS9kYXZpbmNpLXBjbS5jIGIvc291bmQvc29jL2RhdmluY2kvZGF2aW5jaS1wY20uYwppbmRleCA3NGFiYzliNC4uMzY2MDQ5ZCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2RhdmluY2kvZGF2aW5jaS1wY20uYworKysgYi9zb3VuZC9zb2MvZGF2aW5jaS9kYXZpbmNpLXBjbS5jCkBAIC0yMTIsNyArMjEyLDcgQEAKIAlpZiAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSykKIAkJY291bnQgPSBzcmMgLSBydW50aW1lLT5kbWFfYWRkcjsKIAllbHNlCi0JCWNvdW50ID0gZHN0IC0gcnVudGltZS0+ZG1hX2FkZHI7OworCQljb3VudCA9IGRzdCAtIHJ1bnRpbWUtPmRtYV9hZGRyOwogCiAJc3Bpbl91bmxvY2soJnBydGQtPmxvY2spOwogCmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvc29jLWNvcmUuYyBiL3NvdW5kL3NvYy9zb2MtY29yZS5jCmluZGV4IDZjYmU3ZTguLjU1ZmRiNGEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9zb2MtY29yZS5jCisrKyBiL3NvdW5kL3NvYy9zb2MtY29yZS5jCkBAIC0xNTg1LDM3ICsxNTg1LDYgQEAKIEVYUE9SVF9TWU1CT0xfR1BMKHNuZF9zb2NfcHV0X2VudW1fZG91YmxlKTsKIAogLyoqCi0gKiBzbmRfc29jX2luZm9fdmFsdWVfZW51bV9kb3VibGUgLSBzZW1pIGVudW1lcmF0ZWQgZG91YmxlIG1peGVyIGluZm8gY2FsbGJhY2sKLSAqIEBrY29udHJvbDogbWl4ZXIgY29udHJvbAotICogQHVpbmZvOiBjb250cm9sIGVsZW1lbnQgaW5mb3JtYXRpb24KLSAqCi0gKiBDYWxsYmFjayB0byBwcm92aWRlIGluZm9ybWF0aW9uIGFib3V0IGEgZG91YmxlIHNlbWkgZW51bWVyYXRlZAotICogbWl4ZXIgY29udHJvbC4KLSAqCi0gKiBTZW1pIGVudW1lcmF0ZWQgbWl4ZXI6IHRoZSBlbnVtZXJhdGVkIGl0ZW1zIGFyZSByZWZlcnJlZCBhcyB2YWx1ZXMuIENhbiBiZQotICogdXNlZCBmb3IgaGFuZGxpbmcgYml0ZmllbGQgY29kZWQgZW51bWVyYXRpb24gZm9yIGV4YW1wbGUuCi0gKgotICogUmV0dXJucyAwIGZvciBzdWNjZXNzLgotICovCi1pbnQgc25kX3NvY19pbmZvX3ZhbHVlX2VudW1fZG91YmxlKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCXN0cnVjdCBzbmRfY3RsX2VsZW1faW5mbyAqdWluZm8pCi17Ci0Jc3RydWN0IHNvY192YWx1ZV9lbnVtICplID0gKHN0cnVjdCBzb2NfdmFsdWVfZW51bSAqKQotCQkJa2NvbnRyb2wtPnByaXZhdGVfdmFsdWU7Ci0KLQl1aW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfRU5VTUVSQVRFRDsKLQl1aW5mby0+Y291bnQgPSBlLT5zaGlmdF9sID09IGUtPnNoaWZ0X3IgPyAxIDogMjsKLQl1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtcyA9IGUtPm1heDsKLQotCWlmICh1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtID4gZS0+bWF4IC0gMSkKLQkJdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbSA9IGUtPm1heCAtIDE7Ci0Jc3RyY3B5KHVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLm5hbWUsCi0JCWUtPnRleHRzW3VpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1dKTsKLQlyZXR1cm4gMDsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKHNuZF9zb2NfaW5mb192YWx1ZV9lbnVtX2RvdWJsZSk7Ci0KLS8qKgogICogc25kX3NvY19nZXRfdmFsdWVfZW51bV9kb3VibGUgLSBzZW1pIGVudW1lcmF0ZWQgZG91YmxlIG1peGVyIGdldCBjYWxsYmFjawogICogQGtjb250cm9sOiBtaXhlciBjb250cm9sCiAgKiBAdWNvbnRyb2w6IGNvbnRyb2wgZWxlbWVudCBpbmZvcm1hdGlvbgpAQCAtMTYzMSw4ICsxNjAwLDcgQEAKIAlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKIHsKIAlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7Ci0Jc3RydWN0IHNvY192YWx1ZV9lbnVtICplID0gKHN0cnVjdCBzb2NfdmFsdWVfZW51bSAqKQotCQkJa2NvbnRyb2wtPnByaXZhdGVfdmFsdWU7CisJc3RydWN0IHNvY19lbnVtICplID0gKHN0cnVjdCBzb2NfZW51bSAqKWtjb250cm9sLT5wcml2YXRlX3ZhbHVlOwogCXVuc2lnbmVkIHNob3J0IHJlZ192YWwsIHZhbCwgbXV4OwogCiAJcmVnX3ZhbCA9IHNuZF9zb2NfcmVhZChjb2RlYywgZS0+cmVnKTsKQEAgLTE2NzEsOCArMTYzOSw3IEBACiAJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCiB7CiAJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOwotCXN0cnVjdCBzb2NfdmFsdWVfZW51bSAqZSA9IChzdHJ1Y3Qgc29jX3ZhbHVlX2VudW0gKikKLQkJCWtjb250cm9sLT5wcml2YXRlX3ZhbHVlOworCXN0cnVjdCBzb2NfZW51bSAqZSA9IChzdHJ1Y3Qgc29jX2VudW0gKilrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKIAl1bnNpZ25lZCBzaG9ydCB2YWw7CiAJdW5zaWduZWQgc2hvcnQgbWFzazsKIApkaWZmIC0tZ2l0IGEvc291bmQvc29jL3NvYy1kYXBtLmMgYi9zb3VuZC9zb2Mvc29jLWRhcG0uYwppbmRleCBhZDBkODAxLi5hMmYxZGE4IDEwMDY0NAotLS0gYS9zb3VuZC9zb2Mvc29jLWRhcG0uYworKysgYi9zb3VuZC9zb2Mvc29jLWRhcG0uYwpAQCAtMTM3LDcgKzEzNyw3IEBACiAJfQogCWJyZWFrOwogCWNhc2Ugc25kX3NvY19kYXBtX3ZhbHVlX211eDogewotCQlzdHJ1Y3Qgc29jX3ZhbHVlX2VudW0gKmUgPSAoc3RydWN0IHNvY192YWx1ZV9lbnVtICopCisJCXN0cnVjdCBzb2NfZW51bSAqZSA9IChzdHJ1Y3Qgc29jX2VudW0gKikKIAkJCXctPmtjb250cm9sc1tpXS5wcml2YXRlX3ZhbHVlOwogCQlpbnQgdmFsLCBpdGVtOwogCkBAIC0yMDAsMzAgKzIwMCw2IEBACiAJcmV0dXJuIC1FTk9ERVY7CiB9CiAKLS8qIGNvbm5lY3QgdmFsdWVfbXV4IHdpZGdldCB0byBpdCdzIGludGVyY29ubmVjdGluZyBhdWRpbyBwYXRocyAqLwotc3RhdGljIGludCBkYXBtX2Nvbm5lY3RfdmFsdWVfbXV4KHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKLQlzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqc3JjLCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqZGVzdCwKLQlzdHJ1Y3Qgc25kX3NvY19kYXBtX3BhdGggKnBhdGgsIGNvbnN0IGNoYXIgKmNvbnRyb2xfbmFtZSwKLQljb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyAqa2NvbnRyb2wpCi17Ci0Jc3RydWN0IHNvY192YWx1ZV9lbnVtICplID0gKHN0cnVjdCBzb2NfdmFsdWVfZW51bSAqKQotCQkJa2NvbnRyb2wtPnByaXZhdGVfdmFsdWU7Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgZS0+bWF4OyBpKyspIHsKLQkJaWYgKCEoc3RyY21wKGNvbnRyb2xfbmFtZSwgZS0+dGV4dHNbaV0pKSkgewotCQkJbGlzdF9hZGQoJnBhdGgtPmxpc3QsICZjb2RlYy0+ZGFwbV9wYXRocyk7Ci0JCQlsaXN0X2FkZCgmcGF0aC0+bGlzdF9zaW5rLCAmZGVzdC0+c291cmNlcyk7Ci0JCQlsaXN0X2FkZCgmcGF0aC0+bGlzdF9zb3VyY2UsICZzcmMtPnNpbmtzKTsKLQkJCXBhdGgtPm5hbWUgPSAoY2hhciAqKWUtPnRleHRzW2ldOwotCQkJZGFwbV9zZXRfcGF0aF9zdGF0dXMoZGVzdCwgcGF0aCwgMCk7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCX0KLQotCXJldHVybiAtRU5PREVWOwotfQotCiAvKiBjb25uZWN0IG1peGVyIHdpZGdldCB0byBpdCdzIGludGVyY29ubmVjdGluZyBhdWRpbyBwYXRocyAqLwogc3RhdGljIGludCBkYXBtX2Nvbm5lY3RfbWl4ZXIoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAogCXN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICpzcmMsIHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICpkZXN0LApAQCAtNzQ0LDcgKzcyMCw4IEBACiAJc3RydWN0IHNuZF9zb2NfZGFwbV9wYXRoICpwYXRoOwogCWludCBmb3VuZCA9IDA7CiAKLQlpZiAod2lkZ2V0LT5pZCAhPSBzbmRfc29jX2RhcG1fbXV4KQorCWlmICh3aWRnZXQtPmlkICE9IHNuZF9zb2NfZGFwbV9tdXggJiYKKwkgICAgd2lkZ2V0LT5pZCAhPSBzbmRfc29jX2RhcG1fdmFsdWVfbXV4KQogCQlyZXR1cm4gLUVOT0RFVjsKIAogCWlmICghc25kX3NvY190ZXN0X2JpdHMod2lkZ2V0LT5jb2RlYywgZS0+cmVnLCBtYXNrLCB2YWwpKQpAQCAtNzc0LDQ1ICs3NTEsNiBAQAogCXJldHVybiAwOwogfQogCi0vKiB0ZXN0IGFuZCB1cGRhdGUgdGhlIHBvd2VyIHN0YXR1cyBvZiBhIHZhbHVlX211eCB3aWRnZXQgKi8KLXN0YXRpYyBpbnQgZGFwbV92YWx1ZV9tdXhfdXBkYXRlX3Bvd2VyKHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3aWRnZXQsCi0JCQkJIHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLCBpbnQgbWFzaywKLQkJCQkgaW50IG11eCwgaW50IHZhbCwgc3RydWN0IHNvY192YWx1ZV9lbnVtICplKQotewotCXN0cnVjdCBzbmRfc29jX2RhcG1fcGF0aCAqcGF0aDsKLQlpbnQgZm91bmQgPSAwOwotCi0JaWYgKHdpZGdldC0+aWQgIT0gc25kX3NvY19kYXBtX3ZhbHVlX211eCkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQlpZiAoIXNuZF9zb2NfdGVzdF9iaXRzKHdpZGdldC0+Y29kZWMsIGUtPnJlZywgbWFzaywgdmFsKSkKLQkJcmV0dXJuIDA7Ci0KLQkvKiBmaW5kIGRhcG0gd2lkZ2V0IHBhdGggYXNzb2Mgd2l0aCBrY29udHJvbCAqLwotCWxpc3RfZm9yX2VhY2hfZW50cnkocGF0aCwgJndpZGdldC0+Y29kZWMtPmRhcG1fcGF0aHMsIGxpc3QpIHsKLQkJaWYgKHBhdGgtPmtjb250cm9sICE9IGtjb250cm9sKQotCQkJY29udGludWU7Ci0KLQkJaWYgKCFwYXRoLT5uYW1lIHx8ICFlLT50ZXh0c1ttdXhdKQotCQkJY29udGludWU7Ci0KLQkJZm91bmQgPSAxOwotCQkvKiB3ZSBub3cgbmVlZCB0byBtYXRjaCB0aGUgc3RyaW5nIGluIHRoZSBlbnVtIHRvIHRoZSBwYXRoICovCi0JCWlmICghKHN0cmNtcChwYXRoLT5uYW1lLCBlLT50ZXh0c1ttdXhdKSkpCi0JCQlwYXRoLT5jb25uZWN0ID0gMTsgLyogbmV3IGNvbm5lY3Rpb24gKi8KLQkJZWxzZQotCQkJcGF0aC0+Y29ubmVjdCA9IDA7IC8qIG9sZCBjb25uZWN0aW9uIG11c3QgYmUKLQkJCQkJICAgICAgcG93ZXJlZCBkb3duICovCi0JfQotCi0JaWYgKGZvdW5kKSB7Ci0JCWRhcG1fcG93ZXJfd2lkZ2V0cyh3aWRnZXQtPmNvZGVjLCBTTkRfU09DX0RBUE1fU1RSRUFNX05PUCk7Ci0JCWR1bXBfZGFwbSh3aWRnZXQtPmNvZGVjLCAibXV4IHBvd2VyIHVwZGF0ZSIpOwotCX0KLQotCXJldHVybiAwOwotfQotCiAvKiB0ZXN0IGFuZCB1cGRhdGUgdGhlIHBvd2VyIHN0YXR1cyBvZiBhIG1peGVyIG9yIHN3aXRjaCB3aWRnZXQgKi8KIHN0YXRpYyBpbnQgZGFwbV9taXhlcl91cGRhdGVfcG93ZXIoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKndpZGdldCwKIAkJCQkgICBzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwgaW50IHJlZywKQEAgLTEwNDUsMTcgKzk4MywxMiBAQAogCQlwYXRoLT5jb25uZWN0ID0gMTsKIAkJcmV0dXJuIDA7CiAJY2FzZSBzbmRfc29jX2RhcG1fbXV4OgorCWNhc2Ugc25kX3NvY19kYXBtX3ZhbHVlX211eDoKIAkJcmV0ID0gZGFwbV9jb25uZWN0X211eChjb2RlYywgd3NvdXJjZSwgd3NpbmssIHBhdGgsIGNvbnRyb2wsCiAJCQkmd3NpbmstPmtjb250cm9sc1swXSk7CiAJCWlmIChyZXQgIT0gMCkKIAkJCWdvdG8gZXJyOwogCQlicmVhazsKLQljYXNlIHNuZF9zb2NfZGFwbV92YWx1ZV9tdXg6Ci0JCXJldCA9IGRhcG1fY29ubmVjdF92YWx1ZV9tdXgoY29kZWMsIHdzb3VyY2UsIHdzaW5rLCBwYXRoLAotCQkJY29udHJvbCwgJndzaW5rLT5rY29udHJvbHNbMF0pOwotCQlpZiAocmV0ICE9IDApCi0JCQlnb3RvIGVycjsKLQkJYnJlYWs7CiAJY2FzZSBzbmRfc29jX2RhcG1fc3dpdGNoOgogCWNhc2Ugc25kX3NvY19kYXBtX21peGVyOgogCQlyZXQgPSBkYXBtX2Nvbm5lY3RfbWl4ZXIoY29kZWMsIHdzb3VyY2UsIHdzaW5rLCBwYXRoLCBjb250cm9sKTsKQEAgLTEzODIsOCArMTMxNSw3IEBACiAJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCiB7CiAJc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKndpZGdldCA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKLQlzdHJ1Y3Qgc29jX3ZhbHVlX2VudW0gKmUgPSAoc3RydWN0IHNvY192YWx1ZV9lbnVtICopCi0JCQlrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKKwlzdHJ1Y3Qgc29jX2VudW0gKmUgPSAoc3RydWN0IHNvY19lbnVtICopa2NvbnRyb2wtPnByaXZhdGVfdmFsdWU7CiAJdW5zaWduZWQgc2hvcnQgcmVnX3ZhbCwgdmFsLCBtdXg7CiAKIAlyZWdfdmFsID0gc25kX3NvY19yZWFkKHdpZGdldC0+Y29kZWMsIGUtPnJlZyk7CkBAIC0xNDIzLDggKzEzNTUsNyBAQAogCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQogewogCXN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3aWRnZXQgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7Ci0Jc3RydWN0IHNvY192YWx1ZV9lbnVtICplID0gKHN0cnVjdCBzb2NfdmFsdWVfZW51bSAqKQotCQkJa2NvbnRyb2wtPnByaXZhdGVfdmFsdWU7CisJc3RydWN0IHNvY19lbnVtICplID0gKHN0cnVjdCBzb2NfZW51bSAqKWtjb250cm9sLT5wcml2YXRlX3ZhbHVlOwogCXVuc2lnbmVkIHNob3J0IHZhbCwgbXV4OwogCXVuc2lnbmVkIHNob3J0IG1hc2s7CiAJaW50IHJldCA9IDA7CkBAIC0xNDQzLDcgKzEzNzQsNyBAQAogCiAJbXV0ZXhfbG9jaygmd2lkZ2V0LT5jb2RlYy0+bXV0ZXgpOwogCXdpZGdldC0+dmFsdWUgPSB2YWw7Ci0JZGFwbV92YWx1ZV9tdXhfdXBkYXRlX3Bvd2VyKHdpZGdldCwga2NvbnRyb2wsIG1hc2ssIG11eCwgdmFsLCBlKTsKKwlkYXBtX211eF91cGRhdGVfcG93ZXIod2lkZ2V0LCBrY29udHJvbCwgbWFzaywgbXV4LCB2YWwsIGUpOwogCWlmICh3aWRnZXQtPmV2ZW50KSB7CiAJCWlmICh3aWRnZXQtPmV2ZW50X2ZsYWdzICYgU05EX1NPQ19EQVBNX1BSRV9SRUcpIHsKIAkJCXJldCA9IHdpZGdldC0+ZXZlbnQod2lkZ2V0LApkaWZmIC0tZ2l0IGEvc291bmQvc3BhcmMvY3M0MjMxLmMgYi9zb3VuZC9zcGFyYy9jczQyMzEuYwppbmRleCBkNDRiZjk4Li40MWMzODc1IDEwMDY0NAotLS0gYS9zb3VuZC9zcGFyYy9jczQyMzEuYworKysgYi9zb3VuZC9zcGFyYy9jczQyMzEuYwpAQCAtMjA1Nyw3ICsyMDU3LDcgQEAKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwogCi0Jc3ByaW50ZihjYXJkLT5sb25nbmFtZSwgIiVzIGF0IDB4JWx4LCBpcnEgJWQiLAorCXNwcmludGYoY2FyZC0+bG9uZ25hbWUsICIlcyBhdCAweCVsbHgsIGlycSAlZCIsCiAJCWNhcmQtPnNob3J0bmFtZSwKIAkJb3AtPnJlc291cmNlWzBdLnN0YXJ0LAogCQlvcC0+aXJxc1swXSk7CmRpZmYgLS1naXQgYS9zb3VuZC91c2IvY2FpYXEvY2FpYXEtZGV2aWNlLmMgYi9zb3VuZC91c2IvY2FpYXEvY2FpYXEtZGV2aWNlLmMKaW5kZXggYTYyNTAwZS4uNDFjMzZiMCAxMDA2NDQKLS0tIGEvc291bmQvdXNiL2NhaWFxL2NhaWFxLWRldmljZS5jCisrKyBiL3NvdW5kL3VzYi9jYWlhcS9jYWlhcS1kZXZpY2UuYwpAQCAtNDIsNyArNDIsNyBAQAogI2VuZGlmCiAKIE1PRFVMRV9BVVRIT1IoIkRhbmllbCBNYWNrIDxkYW5pZWxAY2FpYXEuZGU+Iik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oImNhaWFxIFVTQiBhdWRpbywgdmVyc2lvbiAxLjMuOSIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJjYWlhcSBVU0IgYXVkaW8sIHZlcnNpb24gMS4zLjEwIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiBNT0RVTEVfU1VQUE9SVEVEX0RFVklDRSgie3tOYXRpdmUgSW5zdHJ1bWVudHMsIFJpZ0tvbnRyb2wyfSwiCiAJCQkgIntOYXRpdmUgSW5zdHJ1bWVudHMsIFJpZ0tvbnRyb2wzfSwiCmRpZmYgLS1naXQgYS9zb3VuZC91c2IvY2FpYXEvY2FpYXEtZGV2aWNlLmggYi9zb3VuZC91c2IvY2FpYXEvY2FpYXEtZGV2aWNlLmgKaW5kZXggZjlmYmRiYWUuLmFiNTZlNzMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3VzYi9jYWlhcS9jYWlhcS1kZXZpY2UuaAorKysgYi9zb3VuZC91c2IvY2FpYXEvY2FpYXEtZGV2aWNlLmgKQEAgLTc1LDYgKzc1LDcgQEAKIAl3YWl0X3F1ZXVlX2hlYWRfdCBlcDFfd2FpdF9xdWV1ZTsKIAl3YWl0X3F1ZXVlX2hlYWRfdCBwcmVwYXJlX3dhaXRfcXVldWU7CiAJaW50IHNwZWNfcmVjZWl2ZWQsIGF1ZGlvX3Bhcm1fYW5zd2VyOworCWludCBtaWRpX291dF9hY3RpdmU7CiAKIAljaGFyIHZlbmRvcl9uYW1lW0NBSUFRX1VTQl9TVFJfTEVOXTsKIAljaGFyIHByb2R1Y3RfbmFtZVtDQUlBUV9VU0JfU1RSX0xFTl07CmRpZmYgLS1naXQgYS9zb3VuZC91c2IvY2FpYXEvY2FpYXEtbWlkaS5jIGIvc291bmQvdXNiL2NhaWFxL2NhaWFxLW1pZGkuYwppbmRleCAzMGI1N2Y5Li5mMTlmZDM2IDEwMDY0NAotLS0gYS9zb3VuZC91c2IvY2FpYXEvY2FpYXEtbWlkaS5jCisrKyBiL3NvdW5kL3VzYi9jYWlhcS9jYWlhcS1taWRpLmMKQEAgLTU5LDYgKzU5LDExIEBACiAKIHN0YXRpYyBpbnQgc25kX3VzYl9jYWlhcV9taWRpX291dHB1dF9jbG9zZShzdHJ1Y3Qgc25kX3Jhd21pZGlfc3Vic3RyZWFtICpzdWJzdHJlYW0pCiB7CisJc3RydWN0IHNuZF91c2JfY2FpYXFkZXYgKmRldiA9IHN1YnN0cmVhbS0+cm1pZGktPnByaXZhdGVfZGF0YTsKKwlpZiAoZGV2LT5taWRpX291dF9hY3RpdmUpIHsKKwkJdXNiX2tpbGxfdXJiKCZkZXYtPm1pZGlfb3V0X3VyYik7CisJCWRldi0+bWlkaV9vdXRfYWN0aXZlID0gMDsKKwl9CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTY5LDcgKzc0LDggQEAKIAkKIAlkZXYtPm1pZGlfb3V0X2J1ZlswXSA9IEVQMV9DTURfTUlESV9XUklURTsKIAlkZXYtPm1pZGlfb3V0X2J1ZlsxXSA9IDA7IC8qIHBvcnQgKi8KLQlsZW4gPSBzbmRfcmF3bWlkaV90cmFuc21pdF9wZWVrKHN1YnN0cmVhbSwgZGV2LT5taWRpX291dF9idWYrMywgRVAxX0JVRlNJWkUtMyk7CisJbGVuID0gc25kX3Jhd21pZGlfdHJhbnNtaXQoc3Vic3RyZWFtLCBkZXYtPm1pZGlfb3V0X2J1ZiArIDMsCisJCQkJICAgRVAxX0JVRlNJWkUgLSAzKTsKIAkKIAlpZiAobGVuIDw9IDApCiAJCXJldHVybjsKQEAgLTc5LDI0ICs4NSwyNCBAQAogCQogCXJldCA9IHVzYl9zdWJtaXRfdXJiKCZkZXYtPm1pZGlfb3V0X3VyYiwgR0ZQX0FUT01JQyk7CiAJaWYgKHJldCA8IDApCi0JCWxvZygic25kX3VzYl9jYWlhcV9taWRpX3NlbmQoJXApOiB1c2Jfc3VibWl0X3VyYigpIGZhaWxlZCwgJWRcbiIsCi0JCQkJc3Vic3RyZWFtLCByZXQpOworCQlsb2coInNuZF91c2JfY2FpYXFfbWlkaV9zZW5kKCVwKTogdXNiX3N1Ym1pdF91cmIoKSBmYWlsZWQsIgorCQkgICAgInJldD0lZCwgbGVuPSVkXG4iLAorCQkgICAgc3Vic3RyZWFtLCByZXQsIGxlbik7CisJZWxzZQorCQlkZXYtPm1pZGlfb3V0X2FjdGl2ZSA9IDE7CiB9CiAKIHN0YXRpYyB2b2lkIHNuZF91c2JfY2FpYXFfbWlkaV9vdXRwdXRfdHJpZ2dlcihzdHJ1Y3Qgc25kX3Jhd21pZGlfc3Vic3RyZWFtICpzdWJzdHJlYW0sIGludCB1cCkKIHsKIAlzdHJ1Y3Qgc25kX3VzYl9jYWlhcWRldiAqZGV2ID0gc3Vic3RyZWFtLT5ybWlkaS0+cHJpdmF0ZV9kYXRhOwogCQotCWlmIChkZXYtPm1pZGlfb3V0X3N1YnN0cmVhbSAhPSBOVUxMKQotCQlyZXR1cm47Ci0JCi0JaWYgKCF1cCkgeworCWlmICh1cCkgeworCQlkZXYtPm1pZGlfb3V0X3N1YnN0cmVhbSA9IHN1YnN0cmVhbTsKKwkJaWYgKCFkZXYtPm1pZGlfb3V0X2FjdGl2ZSkKKwkJCXNuZF91c2JfY2FpYXFfbWlkaV9zZW5kKGRldiwgc3Vic3RyZWFtKTsKKwl9IGVsc2UgewogCQlkZXYtPm1pZGlfb3V0X3N1YnN0cmVhbSA9IE5VTEw7Ci0JCXJldHVybjsKIAl9Ci0JCi0JZGV2LT5taWRpX291dF9zdWJzdHJlYW0gPSBzdWJzdHJlYW07Ci0Jc25kX3VzYl9jYWlhcV9taWRpX3NlbmQoZGV2LCBzdWJzdHJlYW0pOwogfQogCiAKQEAgLTE2MSwxNiArMTY3LDE0IEBACiB2b2lkIHNuZF91c2JfY2FpYXFfbWlkaV9vdXRwdXRfZG9uZShzdHJ1Y3QgdXJiKiB1cmIpCiB7CiAJc3RydWN0IHNuZF91c2JfY2FpYXFkZXYgKmRldiA9IHVyYi0+Y29udGV4dDsKLSAgICAgIAljaGFyICpidWYgPSB1cmItPnRyYW5zZmVyX2J1ZmZlcjsKIAkKKwlkZXYtPm1pZGlfb3V0X2FjdGl2ZSA9IDA7CiAJaWYgKHVyYi0+c3RhdHVzICE9IDApCiAJCXJldHVybjsKIAogCWlmICghZGV2LT5taWRpX291dF9zdWJzdHJlYW0pCiAJCXJldHVybjsKIAotCXNuZF9yYXdtaWRpX3RyYW5zbWl0X2FjayhkZXYtPm1pZGlfb3V0X3N1YnN0cmVhbSwgYnVmWzJdKTsKLQlkZXYtPm1pZGlfb3V0X3N1YnN0cmVhbSA9IE5VTEw7CiAJc25kX3VzYl9jYWlhcV9taWRpX3NlbmQoZGV2LCBkZXYtPm1pZGlfb3V0X3N1YnN0cmVhbSk7CiB9CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3VzYi91c2JxdWlya3MuaCBiL3NvdW5kL3VzYi91c2JxdWlya3MuaAppbmRleCA5MjExNTc1Li41ZDhlZjA5IDEwMDY0NAotLS0gYS9zb3VuZC91c2IvdXNicXVpcmtzLmgKKysrIGIvc291bmQvdXNiL3VzYnF1aXJrcy5oCkBAIC0xMjgsNiArMTI4LDE0IEBACiAJLmJJbnRlcmZhY2VDbGFzcyA9IFVTQl9DTEFTU19BVURJTywKIAkuYkludGVyZmFjZVN1YkNsYXNzID0gVVNCX1NVQkNMQVNTX0FVRElPX0NPTlRST0wKIH0sCit7CisJVVNCX0RFVklDRSgweDA0NmQsIDB4MDk5MCksCisJLmRyaXZlcl9pbmZvID0gKHVuc2lnbmVkIGxvbmcpICYgKGNvbnN0IHN0cnVjdCBzbmRfdXNiX2F1ZGlvX3F1aXJrKSB7CisJCS52ZW5kb3JfbmFtZSA9ICJMb2dpdGVjaCwgSW5jLiIsCisJCS5wcm9kdWN0X25hbWUgPSAiUXVpY2tDYW0gUHJvIDkwMDAiLAorCQkuaWZudW0gPSBRVUlSS19OT19JTlRFUkZBQ0UKKwl9Cit9LAogCiAvKgogICogWWFtYWhhIGRldmljZXMKZGlmZiAtLWdpdCBhL3NvdW5kL3VzYi91c3gyeS91c2J1c3gyeS5jIGIvc291bmQvdXNiL3VzeDJ5L3VzYnVzeDJ5LmMKaW5kZXggY2EyNmM1My4uMTE2MzliZCAxMDA2NDQKLS0tIGEvc291bmQvdXNiL3VzeDJ5L3VzYnVzeDJ5LmMKKysrIGIvc291bmQvdXNiL3VzeDJ5L3VzYnVzeDJ5LmMKQEAgLTIzOCw3ICsyMzgsNyBAQAogCQkJCQlzZW5kID0gMDsKIAkJCQlmb3IgKGogPSAwOyBqIDwgVVJCU19Bc3luY1NlcSAgJiYgICFlcnI7ICsraikKIAkJCQkJaWYgKDAgPT0gdXNYMlktPkFTMDQudXJiW2pdLT5zdGF0dXMpIHsKLQkJCQkJCXN0cnVjdCB1czQyOF9wNG91dCAqcDRvdXQgPSB1czQyOGN0bHMtPnA0b3V0ICsgc2VuZDsJLy8gRklYTUUgaWYgbW9yZSB0aGVuIDEgcDRvdXQgaXMgbmV3LCAxIGdldHMgbG9zdC4KKwkJCQkJCXN0cnVjdCB1czQyOF9wNG91dCAqcDRvdXQgPSB1czQyOGN0bHMtPnA0b3V0ICsgc2VuZDsJLy8gRklYTUUgaWYgbW9yZSB0aGFuIDEgcDRvdXQgaXMgbmV3LCAxIGdldHMgbG9zdC4KIAkJCQkJCXVzYl9maWxsX2J1bGtfdXJiKHVzWDJZLT5BUzA0LnVyYltqXSwgdXNYMlktPmNoaXAuZGV2LAogCQkJCQkJCQkgIHVzYl9zbmRidWxrcGlwZSh1c1gyWS0+Y2hpcC5kZXYsIDB4MDQpLCAmcDRvdXQtPnZhbC52b2wsIAogCQkJCQkJCQkgIHA0b3V0LT50eXBlID09IGVMVF9MaWdodCA/IHNpemVvZihzdHJ1Y3QgdXM0MjhfbGlnaHRzKSA6IDUsCg==